ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTgyYzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ij4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmMzBlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotanNwbW9kZWwuamFyCi1kZXYucHJvcGVydGllcwotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlXzYuMC4wLmphcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmVfNi4wLjAuemlwCi1qc3Btb2RlbHNyYy56aXAKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTJjOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RyYWNlZmlsdGVyPQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGluZGV4bWFuYWdlcj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb25zdG9kaXNrPWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwc2VhcmNoPWZhbHNlCi0KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvcmVzb2x2ZT1mYWxzZQotCi0KLSMgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXIuX2RlYnVnCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9tYW5hZ2VyPWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9jYWNoZT1mYWxzZQotCi0jIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRGYWN0b3J5VExELl9kZWJ1Zwotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvZmFjdG9yeT1mYWxzZQotCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9qZWN0RGVzY3JpcHRpb24uX2RlYnVnSW5kZXhDcmVhdGlvbgotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleGNyZWF0aW9uPWZhbHNlCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9qZWN0RGVzY3JpcHRpb24uX2RlYnVnSW5kZXhUaW1lCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4dGltZT1mYWxzZQotCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJJbmRleC5fZGVidWdFdmVudHMKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvZXZlbnRzPWZhbHNlCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJJbmRleC5fZGVidWdJbmRleENyZWF0aW9uCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4Y3JlYXRpb249ZmFsc2UKLSNvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkluZGV4Ll9kZWJ1Z1Jlc29sdXRpb24KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvcmVzb2x2ZT1mYWxzZQotCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwamF2YW1hcHBpbmc9ZmFsc2UKLQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHZhbGlkYXRvcj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYnZhcnM9ZmFsc2UKLQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYmNsYXNzbG9hZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxMGI3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkZGM2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jV2VkIE1hciAyOCAwMjo1NjoxMiBFRFQgMjAwNw0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9DU1NKU1BQYXJzZXIvSG93VG9HZW4uaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9Ib3dUb0dlbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQzOWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9Ib3dUb0dlbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotPHA+Ci1KU1BlZENTU1Rva2VuaXplciBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40LjEgCi1mcm9tIHRoZSBKU1BlZENTU1Rva2VuaXplci5mbGV4IGdyYW1tZXIgZmlsZS4KLUFmdGVyIGdlbmVyYXRpbmcgdGhlIHNjYW5uZXIsIEkgcmVtb3ZlZCB1bnVzZWQgcHJpdmF0ZSBmaWVsZCBlcnJvcnMuCi08L3A+Ci08L2JvZHk+Ci08aHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9KU1BlZENTU1Rva2VuaXplci5mbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvQ1NTSlNQUGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYWY3NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvQ1NTSlNQUGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7DQotDQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkpTUGVkQ1NTUmVnaW9uQ29udGV4dHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5JQ1NTVG9rZW5pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuQ1NTVGV4dFJlZ2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotDQotJSUNCi0NCi0lcHVibGljDQotJWNsYXNzIEpTUGVkQ1NTVG9rZW5pemVyDQotJWltcGxlbWVudHMgSlNQZWRDU1NSZWdpb25Db250ZXh0cywgSUNTU1Rva2VuaXplcg0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0lbGluZQ0KLSV1bmljb2RlDQotJWNhc2VsZXNzDQotJXBhY2sNCi0NCi0lew0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7DQotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydDsNCi0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7DQotLy8JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkJ1ZmZlcmVkVGV4dCA9IG51bGw7DQotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOw0KLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9OT1JNQUwgPSAxNjM4NDsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7DQotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsNCi0NCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgew0KLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgew0KLQkJZkluaXRpYWxCdWZmZXJTaXplID0gc2l6ZTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQ7DQotCQlTdHJpbmcgbmV4dFRva2VuVHlwZTsNCi0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOw0KLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsNCi0JCWludCBzdGFydDsNCi0JCWludCB0ZXh0TGVuZ3RoOw0KLQkJaW50IGxlbmd0aDsNCi0JCWlmIChmQnVmZmVyZWRDb250ZXh0ICE9IG51bGwpIHsNCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0Ow0KLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsNCi0NCi0JCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0vLwkJCXRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQlzdGFydCA9IHl5Y2hhcjsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCX0NCi0NCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsNCi0JCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX1NDUklQVExFVCB8fCBjb250ZXh0ID09IENTU19KU1BfRUwpew0KLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0VORCAmJiBuZXh0VG9rZW5UeXBlICE9IENTU19FTF9FTkQgJiYgbmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0NPTU1FTlQpIHsNCi0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJCWlmIChjb250ZXh0LmVxdWFscyhDU1NfSlNQX1NDUklQVExFVCkgJiYgKHl5c3RhdGUoKSA9PSBTVF9KU1BfRElSRUNUSVZFIHx8IHl5c3RhdGUoKSA9PSBTVF9KU1BfRVhQIHx8IHl5c3RhdGUoKSA9PSBTVF9KU1BfREVDTEFSQVRJT04pKXsNCi0JCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0JCQkJCX0NCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQkvLyBbMjM2MDA4XSAtIFNob3VsZCBub3QgdHJ5IGFuZCBjb25zaWRlciB0aGUgdG9rZW4gYQ0KLQkJCQkvLyBjb21tZW50IHVubGVzcyAgYSBjb21tZW50IHdhcyBzdGFydGVkDQotCQkJCWlmIChjb250ZXh0ID09IENTU19KU1BfU0NSSVBUTEVUICYmIG5leHRUb2tlblR5cGUgPT0gQ1NTX0pTUF9DT01NRU5UKXsNCi0JCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlICE9IENTU19KU1BfQ09NTUVOVF9FTkQpIHsNCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsNCi0JCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJCQlpZiAoY29udGV4dC5lcXVhbHMoQ1NTX0pTUF9TQ1JJUFRMRVQpICYmIHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCl7DQotCQkJCQkJCWNvbnRleHQgPSBuZXh0VG9rZW5UeXBlOw0KLQkJCQkJCX0NCi0NCi0JCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJCWlmIChuZXh0VG9rZW5UeXBlID09IG51bGwpew0KLQkJCQkJCQlicmVhazsNCi0JCQkJCQl9DQotCQkJCQl9CQkJCQ0KLQkJCQkJaWYgKGNvbnRleHQgPT0gQ1NTX0pTUF9DT01NRU5UKXsNCi0JCQkJCQljb250ZXh0ID0gQ1NTX0NPTU1FTlQ7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOw0KLQkJCQkNCi0JCQl9DQotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7DQotCQkJCS8vIHVuZGVmIC0+IGNvbmNhdGVuYXRlIHVuZGVmJ3MNCi0JCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgPT0gVU5ERUZJTkVEKSB7DQotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsNCi0JCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsNCi0JCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7DQotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQl9DQotCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOw0KLS8vCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7DQotCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJfSBlbHNlIHsNCi0JCQkJbmV4dFRva2VuVHlwZSA9IG51bGw7DQotCQkJCXNwYWNlRm9sbG93cyA9IGZhbHNlOw0KLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVmFsdWVUeXBlKGNvbnRleHQpKSB7IC8vIGRlY2xhcmF0aW9uIHZhbHVlIGNhbiBjb250YWluIFZBTFVFX1MNCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfREVDTEFSQVRJT05fVkFMVUVfUyk7DQotCQkJCX0gZWxzZSBpZiAoY2FuQ29udGFpblNwYWNlKGNvbnRleHQpKSB7DQotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX1MpOw0KLQkJCQl9DQotCQkJCWlmIChuZXh0VG9rZW5UeXBlICE9IG51bGwpIHsgLy8gbmV4dFRva2VuIGlzIHJldHJpZXZlZA0KLQkJCQkJaWYgKHNwYWNlRm9sbG93cykgew0KLQkJCQkJCS8vIG5leHQgaXMgc3BhY2UgLT4gYXBwZW5kDQotLy8JCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQkJbGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCS8vIG5leHQgaXMgTk9UIHNwYWNlIC0+IHB1c2ggdGhpcyBmb3IgbmV4dCB0aW1lLCByZXR1cm4gaXRzZWxmDQotCQkJCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7DQotLy8JCQkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7DQotCQkJCQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7DQotCQkJCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsNCi0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsNCi0JCQkJY29udGV4dCA9IENTU19VTktOT1dOOw0KLQkJCX0NCi0JCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOw0KLQkJfSBlbHNlIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0gIAl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCS8qIGZvciBzdGFuZGFsb25lIHVzZSAqLw0KLSAgCXB1YmxpYyBmaW5hbCBMaXN0IHBhcnNlVGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAJCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLSAgCQlDU1NUZXh0VG9rZW4gdG9rZW47DQotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsNCi0JCQl0b2tlbiA9IG5ldyBDU1NUZXh0VG9rZW4oKTsNCi0JCQl0b2tlbi5raW5kID0ga2luZDsgIAkJCQkNCi0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsNCi0JCQl0b2tlbi5sZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCXRva2VuLmltYWdlID0geXl0ZXh0KCk7DQotCQkJdG9rZW5zLmFkZCh0b2tlbik7DQotCQl9DQotDQotICAJCXJldHVybiB0b2tlbnM7DQotICAJfQ0KLSAgCQ0KLSAgCS8qIHVzZXIgbWV0aG9kICovDQotICAJcHJpdmF0ZSBib29sZWFuIGNhbkNvbnRhaW5TcGFjZShTdHJpbmcgdHlwZSkgew0KLSAgCQlpZiAodHlwZSA9PSBDU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsNCi0gIAkJCXJldHVybiBmYWxzZTsNCi0gIAkJfSBlbHNlIHsNCi0gIAkJCXJldHVybiB0cnVlOw0KLSAgCQl9DQotICAJfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsNCi0JCXJldHVybiB5eWNoYXI7DQotCX0NCi0JDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgew0KLQkJcmV0dXJuIHp6QXRFT0Y7DQotCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgew0KLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0JCXp6UmVhZGVyID0gaW47DQotDQotCQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLQkJenpTdGF0ZSA9IDA7DQotDQotCQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLQkJenpMZXhpY2FsU3RhdGUgPSBmSW5pdGlhbFN0YXRlOyAvL1lZSU5JVElBTDsNCi0NCi0JCS8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotCQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotCQlpZiAoenpCdWZmZXIubGVuZ3RoICE9IGZJbml0aWFsQnVmZmVyU2l6ZSkgew0KLQkJCXp6QnVmZmVyID0gbmV3IGNoYXJbZkluaXRpYWxCdWZmZXJTaXplXTsNCi0JCX0NCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7DQotDQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0JCXp6TWFya2VkUG9zID0gMDsNCi0NCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLQkJenpQdXNoYmFja1BvcyA9IDA7DQotDQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotCQl6ekN1cnJlbnRQb3MgPSAwOw0KLQ0KLQkJLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLQkJenpTdGFydFJlYWQgPSAwOw0KLQ0KLQkJLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZA0KLQkJCWZyb20gaW5wdXQgKi8NCi0JCXp6RW5kUmVhZCA9IDA7DQotDQotCQkvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCQl5eWxpbmUgPSAwOw0KLQ0KLQkJLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQkJeXljaGFyID0gMDsNCi0NCi0JCS8qKg0KLQkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIA0KLQkJICogbWF0Y2hlZCB0ZXh0DQotCQkgKi8NCi0JCXl5Y29sdW1uID0gMDsgDQotDQotCQkvKiogDQotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUNCi0JCSAqLw0KLQkJenpBdEJPTCA9IGZhbHNlOw0KLQkJDQotCQkvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLQkJenpBdEVPRiA9IGZhbHNlOw0KLQ0KLQkJLyogdXNlciB2YXJpYWJsZXMgKi8NCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgSlNQZWRDU1NUb2tlbml6ZXIoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotCQ0KLQlwcml2YXRlIGludCBmSlNQUHJldmlvdXNTdGF0ZSA9IGZJbml0aWFsU3RhdGU7DQotCXByaXZhdGUgdm9pZCB5eUpzcEJlZ2luKGludCBuZXdzdGF0ZSl7DQotCQlmSlNQUHJldmlvdXNTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCXl5YmVnaW4obmV3c3RhdGUpOw0KLQl9DQotCXByaXZhdGUgdm9pZCB5eUpzcEVuZCgpew0KLQkJeXliZWdpbihmSlNQUHJldmlvdXNTdGF0ZSk7DQotCX0NCi0lfQ0KLQ0KLSVzdGF0ZSBTVF9DSEFSU0VUX05BTUUNCi0lc3RhdGUgU1RfQ0hBUlNFVF9ERUxJTUlURVINCi0lc3RhdGUgU1RfSU1QT1JUX1VSSQ0KLSVzdGF0ZSBTVF9JTVBPUlRfTUVESVVNDQotJXN0YXRlIFNUX0lNUE9SVF9ERUxJTUlURVINCi0lc3RhdGUgU1RfTUVESUFfTUVESVVNDQotJXN0YXRlIFNUX01FRElBX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9QQUdFX1BTRVVET19QQUdFDQotJXN0YXRlIFNUX1BBR0VfREVMSU1JVEVSDQotJXN0YXRlIFNUX0ZPTlRfRkFDRV9ERUxJTUlURVINCi0lc3RhdGUgU1RfU0VMRUNUT1INCi0lc3RhdGUgU1RfU0VMRUNUT1JfTU9ESUZJRVINCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUg0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUNCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fVkFMVUUNCi0lc3RhdGUgU1RfSlNQX1NDUklQVExFVA0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFDQotJXN0YXRlIFNUX0pTUF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9KU1BfRVhQDQotJXN0YXRlIFNUX0pTUF9FTA0KLSVzdGF0ZSBTVF9KU1BfQ09NTUVOVA0KLQ0KLQ0KLWggPSBbMC05YS1mXQ0KLW5vbmFzY2lpID0gW1x1MDA4MC1cdWZmZmZdDQotdW5pY29kZSA9IFxce2h9ezEsNn1bIFx0XHJcblxmXT8NCi1lc2NhcGUgPSB7dW5pY29kZX18XFxbIC1+XHUwMDgwLVx1ZmZmZl0NCi1ubXN0YXJ0ID0gW19hLXpBLVotXXx7bm9uYXNjaWl9fHtlc2NhcGV9DQotbm1jaGFyID0gW19hLXpBLVowLTktXXx7bm9uYXNjaWl9fHtlc2NhcGV9DQotc3RyaW5nMSA9IFwiKFtcdCAhIyQlJigtfl18XFx7bmx9fFwnfHtub25hc2NpaX18e2VzY2FwZX0pKlwiDQotc3RyaW5nMiA9IFwnKFtcdCAhIyQlJigtfl18XFx7bmx9fFwifHtub25hc2NpaX18e2VzY2FwZX0pKlwnDQotDQotaWRlbnQgPSB7bm1zdGFydH17bm1jaGFyfSoNCi1uYW1lID0ge25tY2hhcn0rDQotbnVtID0gWystXT8oWzAtOV0rfFswLTldKiIuIlswLTldKykNCi1zdHJpbmcgPSB7c3RyaW5nMX18e3N0cmluZzJ9DQotdXJsID0gKFsgISMkJSYqLX5dfHtub25hc2NpaX18e2VzY2FwZX0pKg0KLXMgPSBbIFx0XHJcblxmXQ0KLXcgPSB7c30qDQotbmwgPSBcbnxcclxufFxyfFxmDQotcmFuZ2UgPSBcP3sxLDZ9fHtofShcP3swLDV9fHtofShcP3swLDR9fHtofShcP3swLDN9fHtofShcP3swLDJ9fHtofShcPz98e2h9KSkpKSkNCi0NCi1oYXNoID0gIiMie25hbWV9DQotdXJpID0gKCJ1cmwoInt3fXtzdHJpbmd9e3d9IikifCJ1cmwoInt3fXt1cmx9e3d9IikiKQ0KLWZ1bmN0aW9uID0ge2lkZW50fSIoIg0KLXVuaWNvZGVfcmFuZ2UgPSAiVSJcK1swLTlhLWZBLUY/XXsxLDZ9KCItIlswLTlhLWZBLUY/XXsxLDZ9KT8NCi0NCi1TUyA9IFtceDIwXHgwOVx4MERceDBBXQ0KLWpzcHN0YXJ0ID0gIjwie1NTfSoiJSJ7U1N9Kg0KLWpzcGVuZCA9ICIlIntTU30qIj4iDQotZWxzdGFydCA9ICIkIntTU30qInsiDQotZWxlbmQgPSAifSINCi0NCi0lJQ0KLQ0KLQ0KLQ0KLTxZWUlOSVRJQUw+IHsNCi0ge2pzcHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDt9DQotIHtlbHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7fQ0KLX0NCi0NCi08U1RfSlNQX1NDUklQVExFVD4gew0KLSAiQCIJe3l5YmVnaW4oU1RfSlNQX0RJUkVDVElWRSk7IHJldHVybiBDU1NfSlNQX0RJUkVDVElWRTt9DQotICI9Igl7eXliZWdpbihTVF9KU1BfRVhQKTsgcmV0dXJuIENTU19KU1BfRVhQO30NCi0gIiEiCXt5eWJlZ2luKFNUX0pTUF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfSlNQX0RFQ0w7fQ0KLSB7anNwZW5kfSB7eXlKc3BFbmQoKTsgIHJldHVybiBDU1NfSlNQX0VORDt9DQotICItLSIgeyB5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsgcmV0dXJuIENTU19KU1BfQ09NTUVOVDt9DQotfQ0KLQ0KLS8qIG92ZXJyaWRlIGdsb2JhbCAifSIgKi8NCi08U1RfSlNQX0VMPiB7DQotIHtlbGVuZH0ge3l5SnNwRW5kKCk7IHJldHVybiBDU1NfRUxfRU5EOyB9DQotfQ0KLQ0KLTxTVF9KU1BfRElSRUNUSVZFLCBTVF9KU1BfRVhQLCBTVF9KU1BfREVDTEFSQVRJT04+IHsNCi0ge2pzcGVuZH0ge3l5SnNwRW5kKCk7ICByZXR1cm4gQ1NTX0pTUF9FTkQ7fQ0KLX0NCi0NCi08U1RfSlNQX0NPTU1FTlQ+IHsNCi0gLSste2pzcGVuZH0geyB5eUpzcEVuZCgpOyByZXR1cm4gQ1NTX0pTUF9DT01NRU5UX0VORDsgfQ0KLSAifSIgICAgICAgICB7IHJldHVybiBVTkRFRklORUQ7IH0NCi19DQotDQotDQotLyoNCi0gKiAqKiogZ2xvYmFsICoqKg0KLSAqLw0KLQ0KLXtzfSsgeyByZXR1cm4gQ1NTX1M7IH0NCi0iPCEtLSIgeyByZXR1cm4gQ1NTX0NETzsgfQ0KLSItLT4iIHsgcmV0dXJuIENTU19DREM7IH0NCi0ifSIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOyB9DQotXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvIHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotLy9cPFwlLS1bXi19XSpbfV0qW159XSotKy1cJVw+IHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotDQotDQotLy88WVlJTklUSUFMPiB7DQotLy8JIkBpbXBvcnQiIHsJeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7IH0NCi0vL30NCi0NCi0vKg0KLSAqICoqKiBjaGFyc2V0IHJ1bGUgKioqDQotICogQ0hBUlNFVF9TWU0gUyogU1RSSU5HIFMqICc7Jw0KLSAqLw0KLQ0KLSJAY2hhcnNldCIgeyB5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7IHJldHVybiBDU1NfQ0hBUlNFVDsgfQ0KLQ0KLTxTVF9DSEFSU0VUX05BTUU+IHsNCi0Je3N0cmluZ30geyB5eWJlZ2luKFNUX0NIQVJTRVRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19TVFJJTkc7IH0NCi19DQotDQotPFNUX0NIQVJTRVRfREVMSU1JVEVSPiB7DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotLyoNCi0gKiAqKiogaW1wb3J0IHJ1bGUgKioqDQotICogSU1QT1JUX1NZTSBTKiBbU1RSSU5HfFVSSV0gUyogWyBtZWRpdW0gWyBDT01NQSBTKiBtZWRpdW1dKiBdPyAnOycgUyoNCi0gKi8NCi0NCi0iQGltcG9ydCIgeyB5eWJlZ2luKFNUX0lNUE9SVF9VUkkpOyByZXR1cm4gQ1NTX0lNUE9SVDsgfQ0KLQ0KLTxTVF9JTVBPUlRfVVJJPiB7DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19TVFJJTkc7IH0NCi0JLy8JInVybCgie3d9e3N0cmluZ317d30iKSIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQkvLwkidXJsKCJ7d317dXJsfXt3fSIpIiB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCXt1cml9IHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLX0NCi0NCi08U1RfSU1QT1JUX01FRElVTT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9JTVBPUlRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07IH0NCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLX0NCi0NCi08U1RfSU1QT1JUX0RFTElNSVRFUj4gew0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotCSIsIiB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIG1lZGlhIHJ1bGUgKioqDQotICogTUVESUFfU1lNIFMqIG1lZGl1bSBbIENPTU1BIFMqIG1lZGl1bSBdKiBMQlJBQ0UgUyogcnVsZXNldCogJ30nIFMqDQotICovDQotDQotIkBtZWRpYSIgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUE7IH0NCi0NCi0vKiANCi0gKiBtZWRpdW0NCi0gKiBJREVOVCBTKg0KLSAqLw0KLTxTVF9NRURJQV9NRURJVU0+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07IH0NCi19DQotDQotPFNUX01FRElBX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotCSIsIiB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7IH0NCi19DQotDQotLyoNCi0gKiAqKiogcGFnZSBydWxlICoqDQotICogUEFHRV9TWU0gUyogcHNldWRvX3BhZ2U/IFMqIExCUkFDRSBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiBdKiAnfScgUyoNCi0gKi8NCi0NCi0iQHBhZ2UiIHsgeXliZWdpbihTVF9QQUdFX1BTRVVET19QQUdFKTsgcmV0dXJuIENTU19QQUdFOyB9DQotIA0KLS8qDQotICogcHNldWRvX3BhZ2UNCi0gKiAnOicgSURFTlQNCi0gKi8NCi0NCi08U1RfUEFHRV9QU0VVRE9fUEFHRT4gew0KLQkiOiI/e2lkZW50fSB7IHl5YmVnaW4oU1RfUEFHRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1BBR0VfU0VMRUNUT1I7IH0NCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLTxTVF9QQUdFX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBmb250LWZhY2UNCi0gKiBGT05UX0ZBQ0VfU1lNIFMqICd7JyBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiAnKiAnfScgUyoNCi0gKi8NCi0NCi0iQGZvbnQtZmFjZSIgeyB5eWJlZ2luKFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX0ZPTlRfRkFDRTsgfQ0KLQ0KLTxTVF9GT05UX0ZBQ0VfREVMSU1JVEVSPiB7DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi0vKg0KLSAqIHNlbGVjdG9yDQotICogc2ltcGxlX3NlbGVjdG9yIFsgY29tYmluYXRvciBzaW1wbGVfc2VsZWN0b3IgXSoNCi0gKi8NCi0NCi0vKg0KLSAqIHNpbXBsZV9zZWxlY3Rvcg0KLSAqIGVsZW1lbnRfbmFtZSBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyBdKiB8IFsgSEFTSCB8IGNsYXNzIHwgYXR0cmliIHwgcHNldWRvIF0rDQotICovDQotDQotPFlZSU5JVElBTCwgU1RfU0VMRUNUT1JfTU9ESUZJRVIsIFNUX1NFTEVDVE9SPiB7DQotCSIqIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTDsgfQ0KLQl7aGFzaH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9JRDsgfQ0KLS8vCSI6IntpZGVudH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87IH0NCi0JIjoie2lkZW50fSgiKCJ7c30qe2lkZW50fXtzfSoiKSIpPyB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsgfQ0KLQkiLiJ7bmFtZX0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DTEFTUzsgfQ0KLQkiWyIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQ7IH0NCi19DQotDQotPFlZSU5JVElBTCwgU1RfU0VMRUNUT1I+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfTU9ESUZJRVI+IHsNCi0JIiwiIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SOyB9DQotCS8vIHVzaW5nIExPT0tBSEVBRA0KLQl7c30rL1teKz5ce10geyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SOyB9DQotCSIrInwiPiIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SOyB9DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi0vKg0KLSAqIGF0dHJpYg0KLSAqICdbJyBTKiBJREVOVCBTKiBbIFsgJz0nIHwgSU5DTFVERVMgfCBEQVNITUFUQ0ggXSBTKiBbIElERU5UIHwgU1RSSU5HIF0gUyogXT8gJ10nDQotICovDQotDQotPFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUU7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUj4gew0KLQkiPSJ8In49InwifD0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUjsgfQ0KLQkiXSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU+IHsNCi0Je2lkZW50fXx7c3RyaW5nfSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EPiB7DQotCSJdIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ7IH0NCi19DQotDQotLyoNCi0gKiBkZWNsYXJhdGlvbg0KLSAqIHByb3BlcnR5ICc6JyBTKiBleHByIHByaW8/IHwgLy8gZW1wdHkgLy8NCi0gKi8NCi0NCi08U1RfREVDTEFSQVRJT04+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsgfQ0KLSAgICB7anNwc3RhcnR9ICAgICAgICAgIHt5eUpzcEJlZ2luKFNUX0pTUF9TQ1JJUFRMRVQpOyAgcmV0dXJuIENTU19KU1BfU0NSSVBUTEVUO30NCi0gICAge2Vsc3RhcnR9ICAgICAgICAgIHt5eUpzcEJlZ2luKFNUX0pTUF9FTCk7ICByZXR1cm4gQ1NTX0pTUF9FTDt9DQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1I+IHsNCi0JIjoiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUjsgfQ0KLSAgICB7anNwc3RhcnR9ICAgICAgICAgIHt5eUpzcEJlZ2luKFNUX0pTUF9TQ1JJUFRMRVQpOyAgcmV0dXJuIENTU19KU1BfU0NSSVBUTEVUO30NCi0gICAge2Vsc3RhcnR9ICAgICAgICAgIHt5eUpzcEJlZ2luKFNUX0pTUF9FTCk7ICByZXR1cm4gQ1NTX0pTUF9FTDt9ICAgIA0KLX0NCi0NCi08U1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFLCBTVF9ERUNMQVJBVElPTl9WQUxVRT4gew0KLQkiISJ7c30qImltcG9ydGFudCIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQ7IH0NCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UOyB9DQotCSIpIiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFOyB9DQotCXtudW19e2lkZW50fSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTjsgfQ0KLQl7bnVtfSIlIiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0U7IH0NCi0Je251bX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVI7IH0NCi0Je2Z1bmN0aW9ufSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OOyB9DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HOyB9DQotCXt1cml9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJOyB9DQotCSIjIntuYW1lfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7IH0NCi0Je3VuaWNvZGVfcmFuZ2V9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRTsgfQ0KLQlbLC9dIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1I7IH0NCi0gICAge2pzcHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDt9DQotICAgIHtlbHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7fSAgICANCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCXtzfSsvW147fV0geyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7IH0NCi0gICAge2pzcHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDt9DQotICAgIHtlbHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7fQ0KLX0NCi0NCi08U1RfREVDTEFSQVRJT04sIFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiwgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFLCBTVF9ERUNMQVJBVElPTl9WQUxVRT4gew0KLQkiOyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7IH0NCi0JLy8JIn0iIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsgfQ0KLX0NCi0NCi0NCi0vLzxZWUlOSVRJQUwsIFNUX0lNUE9SVF9VUkksIFNUX0lNUE9SVF9NRURJVU0sIFNUX0lNUE9SVF9ERUxJTUlURVI+IHsNCi0vLwlcL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8geyByZXR1cm4gQ1NTX0NPTU1FTlQ7IH0NCi0vLwl7c30rIHsgcmV0dXJuIENTU19TOyB9DQotLy8JLiB7IHJldHVybiBVTkRFRklORUQ7IH0NCi0vL30NCi0NCi0vLzxZWUlOSVRJQUwsIFNUX0lNUE9SVF9VUkksIFNUX0lNUE9SVF9NRURJVU0sIFNUX0lNUE9SVF9ERUxJTUlURVI+IHsNCi0vLwlbXiBcdFxyXG5cZl0rIHsgcmV0dXJuIENTU19VTktOT1dOOyB9DQotLy99DQotDQotDQotDQotDQotDQotLiB7DQotCXJldHVybiBVTkRFRklORUQ7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2ZjZTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIuakZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLypubHNYWFgqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsNCi0NCi0lJQ0KLQ0KLSV7DQotDQotDQotDQotDQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7DQotICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOw0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0gICAgICAgIC8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcNCi0gICAgICAgIHByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7DQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNYSFRNTDsNCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1dNTDsNCi0NCi0NCi0gICAgICAgIHB1YmxpYyBKU1BIZWFkVG9rZW5pemVyKCkgew0KLSAgICAgICAgICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7DQotICAgICAgICAgICAgICAgIC8qIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0gICAgICAgICAgICAgICAgenpSZWFkZXIgPSBpbjsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLSAgICAgICAgICAgICAgICB6elN0YXRlID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLSAgICAgICAgICAgICAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLSAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotICAgICAgICAgICAgICAgIEFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLSAgICAgICAgICAgICAgICAvL3p6UHVzaGJhY2tQb3MgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0gICAgICAgICAgICAgICAgenpDdXJyZW50UG9zID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICAgICAgICAgICAgICAgIHp6U3RhcnRSZWFkID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyoqDQotICAgICAgICAgICAgICAgICAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZA0KLSAgICAgICAgICAgICAgICAgKiBmcm9tIGlucHV0DQotICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgICB6ekVuZFJlYWQgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gICAgICAgICAgICAgICAgLy95eWxpbmUgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gICAgICAgICAgICAgICAgeXljaGFyID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyoqDQotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0DQotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBtYXRjaGVkIHRleHQNCi0gICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgIC8veXljb2x1bW4gPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcNCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lDQotICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7DQotDQotICAgICAgICAgICAgICAgIC8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLw0KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsNCi0NCi0NCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsNCi0NCi0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IHRydWU7DQotICAgICAgICAgICAgICAgIGlzWEhUTUw9ZmFsc2U7DQotICAgICAgICAgICAgICAgIGlzV01MPWZhbHNlOw0KLQ0KLQ0KLSAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0ID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0gICAgICAgICAgICAgICAgSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7DQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZVRleHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVRleHQgPSBudWxsOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsNCi0gICAgICAgIH0NCi0gICAgICAgIHByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgew0KLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotDQotICAgICAgICB9DQotIA0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgew0KLSAgICAgICAgICAgICAgICB5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNYSFRNTCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gaXNYSFRNTDsNCi0gICAgICAgIH0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzV01MKCkgew0KLSAgICAgICAgICAgIHJldHVybiBpc1dNTDsNCi0gICAgICAgIH0gICAgICAgIA0KLQ0KLSV9DQotDQotJWVvZnsNCi0gICAgICAgIGhhc01vcmU9ZmFsc2U7DQotJWVvZn0NCi0NCi0lcHVibGljDQotJWNsYXNzIEpTUEhlYWRUb2tlbml6ZXINCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbg0KLSV0eXBlIFN0cmluZw0KLSVjaGFyDQotJXVuaWNvZGUNCi0laWdub3JlY2FzZQ0KLS8vJWRlYnVnDQotJXN3aXRjaA0KLSVidWZmZXIgODE5Mg0KLSVzY2FuZXJyb3IgamF2YS5sYW5nLkV4Y2VwdGlvbg0KLQ0KLQ0KLVVURjE2QkUgPSBceEZFXHhGRg0KLVVURjE2TEUgPSBceEZGXHhGRQ0KLVVURjgzQnl0ZUJPTSA9IFx4RUZceEJCXHhCRg0KLQ0KLS8vIFNwYWNlQ2hhciA9IFtceDIwXHgwOV0NCi0NCi0NCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKw0KLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0NCi0NCi0vL0JlZ2luQXR0cmlidXRlZVZhbHVlID0ge1N9KiBcPSB7U30qDQotDQotTGluZVRlcm1pbmF0b3IgPSBccnxcbg0KLQ0KLQ0KLVogPSAoXHgwMCk/DQotU19VVEYgPSB7Wn17U317Wn0NCi1CZWdpbkF0dHJpYnV0ZVZhbHVlVVRGID0ge1NfVVRGfSogXD0ge1NfVVRGfSoNCi0NCi0lc3RhdGUgU1RfWE1MRGVjbA0KLSVzdGF0ZSBTVF9QQUdFX0RJUkVDVElWRQ0KLSVzdGF0ZSBRdW90ZWRBdHRyaWJ1dGVWYWx1ZQ0KLSVzdGF0ZSBEUV9TVFJJTkcNCi0lc3RhdGUgU1FfU1RSSU5HDQotJXN0YXRlIFVuRGVsaW1pdGVkU3RyaW5nDQotDQotJSUNCi0NCi0NCi08WVlJTklUSUFMPg0KLXsNCi0gICAgICAgICAvLyBmb3JjZSB0byBzdGFydCBhdCBiZWdpbm5pbmcgb2YgbGluZSAoXikgYW5kIGF0IGJlZ2lubmluZyBvZiBmaWxlICh5eWNoYXIgPT0gMCkNCi0gICAgICAgIF4ge1VURjE2QkV9ICAgICAgICAgICB7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fX0NCi0gICAgICAgIF4ge1VURjE2TEV9ICAgICAgICAgICB7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fX0NCi0gICAgICAgIF4ge1VURjgzQnl0ZUJPTX0gICAgICAge2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fX0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gZm9yY2UgdG8gYmUgc3RhcnRlZCBvbiBmaXJzdCBsaW5lLCBidXQgd2UgZG8gYWxsb3cgcHJlY2VlZGluZyBzcGFjZXMNCi0JCV4ge1NfVVRGfSogKHtafTx7Wn1cP3tafXh7Wn1te1p9bHtafSl7U19VVEZ9KyB7aWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9fQ0KLQ0KLQ0KLSAgICAgICAgLy8gZm9sbG93aW5nIGFyZSBzb21lIHNpbXBseSBydWxlcyB0byBpZGVudGlmeSBKU1AgY29udGVudCBhcyAiWEhUTUwiDQotICAgICAgICAvLyBzZWUgaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzIzNi50eHQNCi0JCXtafTx7Wn1cIXtafUR7Wn1Pe1p9Q3tafVR7Wn1Ze1p9UHtafUV7Wn0ge1NfVVRGfSoge1p9aHtafXR7Wn1te1p9bHtafSB7U19VVEZ9KiB7Wn1Qe1p9VXtafUJ7Wn1Me1p9SXtafUN7Wn0gLioge1p9XC97Wn1cL3tafUR7Wn1Ue1p9RHtafXtTX1VURn17Wn1Ye1p9SHtafVR7Wn1Ne1p9THtafSAgICAgICAgICAgICAgICB7aXNYSFRNTCA9IHRydWU7fQ0KLQkJe1p9PHtafWh7Wn10e1p9bXtafWx7Wn0ge1NfVVRGfSoge1p9eHtafW17Wn1se1p9bntafXN7Wn0ge1NfVVRGfSoge1p9XD17Wn0ge1NfVVRGfSogKCh7Wn1cIntafSkgfCAoe1p9XCd7Wn0pKSB7Wn1oe1p9dHtafXR7Wn1we1p9OntafVwve1p9XC97Wn13e1p9d3tafXd7Wn1cLntafXd7Wn0ze1p9XC57Wn1ve1p9cntafWd7Wn1cL3tafTF7Wn05e1p9OXtafTl7Wn1cL3tafXh7Wn1oe1p9dHtafW17Wn1se1p9ICAgICB7aXNYSFRNTCA9IHRydWU7fQ0KLSAgICAgICAgIC8vIGFub3RoZXIgY2FzZSB0aGF0J3MgcGFydCBvZiB0aGUgIkhUTUwgZmFtaWx5IiBpcyBXTUwgMS4wIChXTUwgMi4wIGlzIHBhcnQgb2YgWEhUTUwpDQotCQl7Wn08e1p9XCF7Wn1Ee1p9T3tafUN7Wn1Ue1p9WXtafVB7Wn1Fe1p9IHtTX1VURn0qIHtafXd7Wn1te1p9bHtafSB7U19VVEZ9KiB7Wn1Qe1p9VXtafUJ7Wn1Me1p9SXtafUN7Wn0gLioge1p9XC97Wn1cL3tafUR7Wn1Ue1p9RCB7U317Wn1Xe1p9TXtafUx7Wn0gICAgICAgICAgICAgICAgICAge2lzV01MID0gdHJ1ZTt9DQotDQotCQl7Wn08e1p9JXtafSB7U19VVEZ9KiB7Wn1Ae1p9IHtTX1VURn0qICgoe1p9cHtafWF7Wn1ne1p9ZXtafSl8KHtafXR7Wn1he1p9Z3tafSkpIHtTX1VURn0rICAge3l5YmVnaW4oU1RfUEFHRV9ESVJFQ1RJVkUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlU3RhcnQ7fQ0KLQkJKCh7Wn08e1p9antafXN7Wn1we1p9OntafWR7Wn1pe1p9cntafWV7Wn1je1p9dHtafWl7Wn12e1p9ZXtafVwue1p9cHtafWF7Wn1ne1p9ZXtafSl8KHtafTx7Wn1qe1p9c3tafXB7Wn06e1p9ZHtafWl7Wn1ye1p9ZXtafWN7Wn10e1p9aXtafXZ7Wn1le1p9XC57Wn10e1p9YXtafWd7Wn0pKSB7U19VVEZ9KyAgICAgICAgICAge3l5YmVnaW4oU1RfUEFHRV9ESVJFQ1RJVkUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlU3RhcnQ7fQ0KLQ0KLX0NCi0NCi08U1RfWE1MRGVjbD4NCi17DQotICAgICAgICAoe1p9dntafWV7Wn1ye1p9c3tafWl7Wn1ve1p9bntafSkge0JlZ2luQXR0cmlidXRlVmFsdWVVVEZ9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9DQotICAgICAgICAoe1p9ZXtafW57Wn1je1p9b3tafWR7Wn1pe1p9bntafWd7Wn0pIHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQ0KLSAgICAgICAgLy8gbm90ZSB0aGUgImZvcmNlZCBlbmQiICh2aWEgJ2hhc01vcmU9ZmFsc2UnKSBvbmNlIHRoZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kDQotICAgICAgICAvLyBUaGlzIGlzIHNpbmNlIG5vbi1hc2NpaSBjaGFycyBtYXkgZm9sbG93IGFuZCBtYXkgY2F1c2UgSU9FeGNlcHRpb25zIHdoaWNoIHdvdWxkIG5vdCBvY2N1ciBvbmNlIHN0cmVhbSBpcw0KLSAgICAgICAgLy8gcmVhZCB3aXRoIGluY29ycmVjdCBlbmNvZGluZyAoc3VjaCBhcyBpZiBwbGF0Zm9ybSBlbmNvZGluZyBpcyBpbiBlZmZlY3QgdW50aWwgdHJ1ZSBlbmNvZGluZyBkZXRlY3RlZCkuDQotICAgICAgICAvLyBCVVQsIHRoZSBoYXNNb3JlPWZhbHNlIHdhcyByZW1vdmVkIGZvciB0aGlzIEpTUCBjYXNlIChwcm9iYWJseSBzdGlsbCBvayBmb3IgcHVyZSBYTUwpIGJlY2F1c2UNCi0gICAgICAgIC8vIGluIGEgSlNQLCB3ZSBtdXN0IHBhcnNlIHBhc3QgeG1sRGVjbCB0byBnZXQgYXQgSlNQIHBhZ2UgZGlyZWN0aXZlLg0KLSAgICAgICAgLy8gV2UnbGwgYXNzdW1lIGFsbCBjaGFycyBpbiB0aGlzIGFyZWEgYXJlICJyZWFkYWJsZSIgYXMgaXMuDQotCQl7U19VVEZ9KiB7Wn1cP3tafT57Wn0gICAge3l5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDt9DQotfQ0KLQ0KLTxTVF9QQUdFX0RJUkVDVElWRT4NCi17DQotLy8gIHJlbW92ZWQgJ2xhbmd1YWdlJyBzaW5jZSBpdCByZWFsbHkgY2FuIGJlIGhhbmRsZWQgc2VwZXJhdGVseSBmcm9tIGVuY29kaW5nLCBidXQgbWF5IGFkZCBpdCBiYWNrIGxhdGVyIGZvciBzaW1wbGUgcmUtdXNlLg0KLQkJe1p9bHtafWF7Wn1ue1p9Z3tafXV7Wn1he1p9Z3tafWV7Wn0gICAgIHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUxhbmd1YWdlO30NCi0gICAgICAgIHtafWN7Wn1ve1p9bntafXR7Wn1le1p9bntafXR7Wn1Ue1p9eXtafXB7Wn1le1p9IHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSAge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VDb250ZW50VHlwZTt9DQotICAgICAgICB7Wn1we1p9YXtafWd7Wn1le1p9RXtafW57Wn1je1p9b3tafWR7Wn1pe1p9bntafWd7Wn0ge0JlZ2luQXR0cmlidXRlVmFsdWVVVEZ9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRW5jb2Rpbmc7fQ0KLSAgICAgICAgLy8gbm90ZSB0aGUgImZvcmNlZCBlbmQiICh2aWEgJ2hhc01vcmU9ZmFsc2UnKSBvbmNlIHRoZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kDQotICAgICAgICAvLyBUaGlzIGlzIHNpbmNlIG5vbi1hc2NpaSBjaGFycyBtYXkgZm9sbG93IGFuZCBtYXkgY2F1c2UgSU9FeGNlcHRpb25zIHdoaWNoIHdvdWxkIG5vdCBvY2N1ciBvbmNlIHN0cmVhbSBpcw0KLSAgICAgICAgLy8gcmVhZCBpbiBjb3JyZWN0IGVuY29kaW5nLg0KLQ0KLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQyMDUgZGVtb25zdHJhdGVzIGhvdyB3ZSBuZWVkIHRvIGtlZXAgcGFyc2luZywNCi0gICAgICAgIC8vIGV2ZW4gaWYgY29tZSB0byBlbmQgb2Ygb25lIHBhZ2UgZGlyZWN0aXZlLCBzbyBoYXNNb3JlPWZhbHNlIHdhcyByZW1vdmVkIGZyb20gdGhlc2UgcnVsZXMuDQotCQl7Wn0le1p9PntafSAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVFbmQ7fQ0KLSAgICAgICAge1p9XC97Wn0+e1p9ICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlRW5kO30NCi19DQotDQotDQotPFF1b3RlZEF0dHJpYnV0ZVZhbHVlPg0KLXsNCi0gICAgICAgIHtafVwie1p9ICAgICAgICAgICAgICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9DQotICAgICAgICB7Wn1cJ3tafSAgICAgICAgICAgICAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQ0KLSAgICAgICAgLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nDQotCQl7U19VVEZ9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQ0KLX0NCi0NCi0NCi08RFFfU1RSSU5HPg0KLXsNCi0NCi0gICAgICAgIHtafVwie1p9CQkJeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyB9DQotICAgICAgICB7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0gICAgICAgIHtafVw/e1p9PntafQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotICAgICAgICB7Wn08e1p9CQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQkJW15ceDAwXQkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLSAgICAgICAge1p9JXtafT57Wn0JCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQ0KLQ0KLX0NCi0NCi08U1FfU1RSSU5HPg0KLXsNCi0NCi0gICAgICAgIHtafVwne1p9ICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTt9DQotCQl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0gICAgICAgIHtafSV7Wn0+e1p9ICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotICAgICAgICB7Wn08e1p9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCQkvLyBTa2lwIG92ZXIgdGhlIHNpbmdsZS1ieXRlIDBzDQotCQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotICAgICAgICB7Wn0le1p9PntafSAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotDQotDQotfQ0KLQ0KLTxVbkRlbGltaXRlZFN0cmluZz4NCi17DQotDQotDQotICAgICAgICB7U19VVEZ9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQ0KLSAgICAgICAge1p9e0xpbmVUZXJtaW5hdG9yfXtafSAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotICAgICAgICB7Wn1cP3tafT57Wn0gICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotICAgICAgICB7Wn08e1p9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotICAgICAgICAvLyB0aGVzZSBhcmUgYSBiaXQgc3BlY2lhbCwgc2luY2Ugd2Ugc3RhcnRlZCBhbiB1bmRlbGltaXQgc3RyaW5nLCBidXQgZm91bmQgYSBxdW90ZSAuLi4gcHJvYmFibHkgaW5kaWNhdGVzIGEgbWlzc2luZyBiZWdpbm5pbmcgcXVvdGUNCi0gICAgICAgIHtafVwne1p9ICAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQ0KLSAgICAgICAge1p9XCJ7Wn0gICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9ICAgICAgICANCi0NCi0JCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0gICAgICAgIHtafSV7Wn0+e1p9ICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0NCi19DQotDQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZw0KLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpDQotLnxcbgl7aWYoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fX0NCi0NCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdA0KLTw8RU9GPj4gICAgICAgICB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GO30NCi0NCi0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZFBhcnNlci54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZFBhcnNlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYmUxODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9InRva2VuaXplciIgZGVmYXVsdD0iSGVhZFRva2VuaXplciI+Ci0JCi0JPCEtLSBOb3RlOiBmb3IgRWNsaXBzZSBlbnYuLCB0aGUgSkZsZXggMS40IGphciBzaG91bGQgYmUgYWRkZWQgCi0JdG8gdGhlIGFudCBnbG9iYWwgZW50cmllcyAgLS0+Ci0JPHRhc2tkZWYgY2xhc3NuYW1lPSJKRmxleC5hbnR0YXNrLkpGbGV4VGFzayIgbmFtZT0iamZsZXgiIC8+Ci0JCQotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZmlsZSIgdmFsdWU9IkpTUEhlYWRUb2tlbml6ZXIuakZsZXgiLz4JCQkKLQkJPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJIZWFkUGFyc2VycyIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSIuLi9zcmMiLz4KLQkJPCEtLSB0b3VjaCBjYXVzZXMgdG8gYWx3YXlzIGJ1aWxkLCByZW1vdmUgZm9yIHJlYWwgJ21ha2UnIGJlaGF2aW9yIC0tPgotCQk8dG91Y2ggZmlsZT0iJHtzcmMuZGlyfS8ke3NyYy5maWxlfSIvPgotCQkJCQkKLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iSGVhZFRva2VuaXplciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0icnVuLWpmbGV4Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJ1bi1qZmxleCIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxqZmxleAotCSAgICAJZmlsZT0iJHtzcmMuZGlyfS8ke3NyYy5maWxlfSIKLQkgICAgCWRlc3RkaXI9IiR7ZGVzdC5kaXJ9IgotCQkJdmVyYm9zZT0idHJ1ZSIKLQkJCW5vYmFrPSJ0cnVlIgotCQkJdGltZT0ib24iCi0JICAgIC8+Ci0JPC90YXJnZXQ+Ci0JCi0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmVkODE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjIwMi5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWwsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dCwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6O3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCwzLjYuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gamF2YXguc2VydmxldC5qc3A7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5OyBleGNsdWRlOj0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlZjQ0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIERldlRpbWVTdXBwb3J0LyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjg4ZmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuanNwIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJJSmFyUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJJVGFnRGlyUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJJVGFnbGliSW5kZXhEZWx0YSIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVRhZ2xpYkluZGV4TGlzdGVuZXIiIGltcGxlbWVudD0idHJ1ZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVRhZ2xpYkRlc2NyaXB0b3IiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTx0eXBlIG5hbWU9IklUYWdsaWJSZWNvcmQiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTwhLS0gPHR5cGUgbmFtZT0iSVRhZ2xpYlJlY29yZEV2ZW50IiBpbXBsZW1lbnQ9ImZhbHNlIiAvPiAtLT4KLQkJPHR5cGUgbmFtZT0iSVRMRFJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVVSTFJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iVGFnbGliSW5kZXgiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJUYWdsaWJJbmRleERlbHRhIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkpTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvanN0L2NvbXBvbmVudHMvanNwL292ZXJ2aWV3Lmh0bWwiIC8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmZkZjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIEpTUCBNb2RlbAotU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIEpTUCBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotSlNQX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUAotSlNQX1RhZ19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgVGFnIERlZmluaXRpb24KLUpTUF9UYWdYX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBUYWcgRGVmaW5pdGlvbiAoWE1MKQotSlNQX1RMRF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1UYWcgTGlicmFyeSBEZXNjcmlwdG9yCi1KU1BfRnJhZ21lbnRfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIEZyYWdtZW50Ci1KU1BfU3ludGF4X1ZhbGlkYXRvci5uYW1lPUpTUCBTeW50YXggVmFsaWRhdG9yCi1KU1BfRGlyZWN0aXZlX1ZhbGlkYXRvci5uYW1lPUpTUCBEaXJlY3RpdmUgVmFsaWRhdG9yCi1FTF9TeW50YXhfVmFsaWRhdG9yLm5hbWU9RUwgU3ludGF4IFZhbGlkYXRvcgotSlNQX0NvbnRlbnRfVmFsaWRhdG9yLm5hbWU9SlNQIENvbnRlbnQgVmFsaWRhdG9yCi1TdHJ1Y3R1cmVkX0pTUF9Eb2N1bWVudF9TZXR1cF9wYXJ0aWNpcGFudC5uYW1lPVN0cnVjdHVyZWQgSlNQIERvY3VtZW50IFNldHVwIFBhcnRpY2lwYW50Ci1fdmFsaWRhdGlvbk1hcmtlci5uYW1lPUpTUCBQcm9ibGVtCi1fdGFza01hcmtlci5uYW1lPUpTUCBUYXNrCi0KLWV4dGVuc2lvbi1wb2ludC5uYW1lLjAgPSBKU1AgRUwgVHJhbnNsYXRvcgotCi1jb250ZW50VHlwZUNTU0pTUE5hbWU9Q1NTIEpTUAotY29udGVudFR5cGVDU1NKU1BGTmFtZT1DU1MgSlNQIEZyYWdtZW50Ci0KLWNvbnRlbnRUeXBlQ1NTRG9jdW1lbnRGYWN0b3J5TmFtZT1Db250ZW50IFR5cGUgQ1NTIEpTUCBkb2N1bWVudCBmYWN0b3J5IGV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjE1M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVsVHJhbnNsYXRvciIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5uYW1lLjAiIHNjaGVtYT0ic2NoZW1hL2VsdHJhbnNsYXRvci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1AiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yVGFnIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci50YWciPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJ0bGQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuQ01Eb2N1bWVudEZhY3RvcnlUTEQiPgotCQk8L2ZhY3Rvcnk+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YXNrcy5KU1BGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhc2tzLkpTUEZpbGVUYXNrU2Nhbm5lcjpvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFza01hcmtlciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2tNYXJrZXIiCi0JCW5hbWU9IiVfdGFza01hcmtlci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGFza21hcmtlciIvPgotCQk8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotCTwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ2YWxpZGF0aW9uTWFya2VyIgotICAgICAgICAgbmFtZT0iJV92YWxpZGF0aW9uTWFya2VyLm5hbWUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciIvPgotICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLSA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfSlNQX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRTZXR1cCIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5kb2N1bWVudHNldHVwIgotCQluYW1lPSIlU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfU2V0dXBfcGFydGljaXBhbnQubmFtZSI+Ci0JCTxwYXJ0aWNpcGFudAotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImpzcCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc3BmIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc3B4IiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc2YiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ianN2Ij4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Imp0cGwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0idGxkIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ0YWciIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InRhZ3giIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InRhZ2YiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGwiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPCEtLSBjcmVhdGUgY29udGVudCB0eXBlIGZvciBKU1AgZmlsZXMgLS0+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ianNwLGpzdixqdHBsLGpzcHgiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVKU1BfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ianNwc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iSVNPLTg4NTktMSI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQkJPCEtLSBjcmVhdGUgY29udGVudCB0eXBlIGZvciBKU1AgZnJhZ21lbnQgZmlsZXMgLS0+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ianNwZixqc2YiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVKU1BfRnJhZ21lbnRfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ianNwZnJhZ21lbnRzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IklTTy04ODU5LTEiPgotCQkJPGRlc2NyaWJlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvckpTUCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JCTwhLS0gY3JlYXRlIGNvbnRlbnQgdHlwZSBmb3IgSlNQIDIuMCBUYWcgZmlsZSB0eXBlcyAtLT4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ0YWcsdGFneCx0YWdmIgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlSlNQX1RhZ19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJ0YWdzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IklTTy04ODU5LTEiLz4KLQkJPCEtLSBjcmVhdGUgY29udGVudCB0eXBlIGZvciAudGxkIGZpbGVzIC0tPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9InRsZCIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUpTUF9UTERfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0idGxkc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCIvPgotCi0gIAk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIG1pbmltYWwgY29udGVudC10eXBlIGNzcyBqc3Agc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICAgICAgPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJqc3AiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVjb250ZW50VHlwZUNTU0pTUE5hbWUiCi0JCQlpZD0iY3NzanNwc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MiIC8+Ci0JCTwvY29udGVudC10eXBlPgotICAgICAgICA8Y29udGVudC10eXBlCi0JICAgICAgICBmaWxlLWV4dGVuc2lvbnM9ImpzcGYiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVjb250ZW50VHlwZUNTU0pTUEZOYW1lIgotCQkJaWQ9ImNzc2pzcGZyYWdtZW50c291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIGpzcCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBKU1AgYmF0Y2ggdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJKU1BCYXRjaFZhbGlkYXRvciIgbmFtZT0iJUpTUF9TeW50YXhfVmFsaWRhdG9yLm5hbWUiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BCYXRjaFZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0idHJ1ZSIKLSAgICAgICAgICAgIHZlcnNpb249IjEiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0JICAgICAgICAgICA8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIvPgotCQkJCTwhLS0gbmVlZGVkIHVudGlsIGJ1ZyAxODE0NDMgaXMgaW1wbGVtZW50ZWQgLS0+Ci0JCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiLz4KLQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9ImpzZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZyI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZ2YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqc3YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqdHBsIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8Z3JvdXAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkTW9kZWxHcm91cCIvPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQkKLSAgIDxleHRlbnNpb24gaWQ9IkpTUENvbnRlbnRWYWxpZGF0b3IiIG5hbWU9IiVKU1BfQ29udGVudF9WYWxpZGF0b3IubmFtZSIgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUENvbnRlbnRWYWxpZGF0b3IiCi0gICAgICAgICAgICBtYW51YWw9InRydWUiCi0gICAgICAgICAgICB2ZXJzaW9uPSIxIgotICAgICAgICAgICAgbWFya2VySWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS52YWxpZGF0aW9uTWFya2VyIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIvPgotCQkJCTwhLS0gbmVlZGVkIHVudGlsIGJ1ZyAxODE0NDMgaXMgaW1wbGVtZW50ZWQgLS0+Ci0JCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9ImpzZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZyI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZ2YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqc3YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqdHBsIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8Z3JvdXAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkTW9kZWxHcm91cCIvPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQkJCi0gICAgPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZWxUcmFuc2xhdG9yIj4KLSAgICAgICA8ZWxUcmFuc2xhdG9yCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkpTUEVMVHJhbnNsYXRvciIKLSAgICAgICAgICBuYW1lPSJEZWZhdWx0IEpTUCAyLjAgRUwgVHJhbnNsYXRvciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5kZWZhdWx0SlNQMjAiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUGVkQ1NTIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUGVkQ1NTIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3BmcmFnbWVudHNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnRmYWN0b3JpZXMiCi0JCW5hbWU9IiVjb250ZW50VHlwZUNTU0RvY3VtZW50RmFjdG9yeU5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRTZXR1cCIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuZG9jdW1lbnRzZXR1cCIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfSlNQX0RvY3VtZW50X1NldHVwX3BhcnRpY2lwYW50Lm5hbWUiPgotCQk8cGFydGljaXBhbnQKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQZWRDU1NUYWdsaWJDb250cm9sbGVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50ZmFjdG9yaWVzLmZyYWdtZW50IgotCQluYW1lPSIlY29udGVudFR5cGVDU1NEb2N1bWVudEZhY3RvcnlOYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3BmcmFnbWVudHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgkKLQktLT4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc2NoZW1hL2VsdHJhbnNsYXRvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc2NoZW1hL2VsdHJhbnNsYXRvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGU0MTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NjaGVtYS9lbHRyYW5zbGF0b3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSIgaWQ9ImVsVHJhbnNsYXRvciIgbmFtZT0iSlNQIEVMIFRyYW5zbGF0b3IiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IHRvIGN1c3RvbWVyIEpTUCBFeHByZXNzaW9uIExhbmd1YWdlIEdlbmVyYXRpb24KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWxUcmFuc2xhdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlbFRyYW5zbGF0b3IiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBFTCBUcmFuc2xhdG9yLiAgTXVzdCBiZSBhbiBpbXBsZW1lbnRvciBvZiBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWwuSUpTUEVMVHJhbnNsYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBFTCB0cmFuc2xhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIHN0cmluZyBpZGVudGlmaWVyIGZvciBhbiBFTCBUcmFuc2xhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Bc3NlcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZDhlMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsOwotCi0KLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MgaW4KLSAqIGNvZGUuIFRoZSBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZSB0eXBlIG9mCi0gKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlIHRocm93biB3aGVuCi0gKiBzb21ldGhpbmcgaXMgbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseSB1bnNwZWNpZmllZAotICogYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbiB0aGVzZSBiZWluZyB0aHJvd24KLSAqIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbSBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQotCS8qKgotCSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLQkgKiBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluIDxjb2RlPkFzc2VydDwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcwotCSAqIHRoYXQgY2F0Y2ggb3Igb3RoZXJ3aXNlIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvCi0JICogdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogPC9wPgotCSAqLwotCWNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsKLQkJCXN1cGVyKGRldGFpbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdAotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzCi0JICogdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkCi0JICogZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzCi0JICogbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbgotCSAqIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdAotCSAqIHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlCi0JICogaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pIHsKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KLQlwcml2YXRlIEFzc2VydCgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhOTVlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IEpTUCBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQQWN0aW9uVmFsaWRhdG9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQSW5kZXhNYW5hZ2VyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQSW5kZXhNYW5hZ2VyXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQX1NlYXJjaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BFTF9TeW50YXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRUxfVG9rZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRG9jdW1lbnRMb2FkZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQQmF0Y2hWYWxpZGF0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdsaWJIZWxwZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdsaWJIZWxwZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdsaWJIZWxwZXJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdsaWJIZWxwZXJfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BUcmFuc2xhdG9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVHJhbnNsYXRvcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFRyYW5zbGF0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BUcmFuc2xhdG9yXzM7Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0pTUF9WQUxJREFUSU5HX01FU1NBR0VfVUlfOwotCQotCXByaXZhdGUgSlNQQ29yZU1lc3NhZ2VzKCkgewotCX0KLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpTUENvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhMjlkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQSW5kZXhNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWIuVGFnbGliSGVscGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLlRhZ2xpYkluZGV4OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBKU1BDb3JlUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSlNQQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSB3aWxsIGJlIHJlbW92ZWQuIEN1cnJlbnRseSB1c2VkIHRvIGdldCAibW9kZWwKLQkgKiAgICAgICAgICAgICBwcmVmZXJlbmNlcyIsIGJ1dCB0aGVyZSBhcmUgb3RoZXIsIGJldHRlciB3YXlzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSlNQQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQkvKgotCQkgKiBKU1BJbmRleE1hbmFnZXIgZGVwZW5kcyBvbiBUYWdsaWJDb250cm9sbGVyLCBzbyBUYWdsaWJDb250cm9sbGVyCi0JCSAqIHNob3VsZCBiZSBzdGFydGVkIGZpcnN0Ci0JCSAqLwotCQlUYWdsaWJJbmRleC5zdGFydHVwKCk7Ci0JCVRhZ2xpYkNvbnRyb2xsZXIuc3RhcnR1cCgpOwotCi0JCS8vIGxpc3RlbiBmb3IgY2xhc3NwYXRoIGNoYW5nZXMKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihUYWdsaWJIZWxwZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkpOwotCi0KLQkJSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuaW5pdGlhbGl6ZSgpOwotCi0JCS8vIGxpc3RlbiBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzIGtleXMKLQkJSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zdGFydHVwKCk7Ci0KLQkJRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLnN0YXJ0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuc3RvcCgpOwotCi0JCS8qCi0JCSAqIHN0b3AgbGlzdGVuaW5nIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMKLQkJICoga2V5cwotCQkgKi8KLQkJSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zaHV0ZG93bigpOwotCi0JCS8vIHN0b3AgYW55IGluZGV4aW5nCi0JCUpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNodXRkb3duKCk7Ci0KLQkJLy8gc3RvcCBsaXN0ZW5pbmcgZm9yIGNsYXNzcGF0aCBjaGFuZ2VzCi0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoVGFnbGliSGVscGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpKTsKLQotCQkvLyBzdG9wIHRhZ2xpYiBjb250cm9sbGVyCi0JCVRhZ2xpYkNvbnRyb2xsZXIuc2h1dGRvd24oKTsKLQkJVGFnbGliSW5kZXguc2h1dGRvd24oKTsKLQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOTkyYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1KU1BJbmRleE1hbmFnZXJfMD1VcGRhdGluZyBKU1AgSW5kZXgKLUpTUEluZGV4TWFuYWdlcl8yPUpTUCBJbmRleGVyIGluZGV4aW5nIHswfSBmaWxlcwotSlNQX1NlYXJjaD1KU1AgU2VhcmNoIC0gCi1KU1BEb2N1bWVudExvYWRlcl8xPVByb2dyYW0gRXJyb3I6IHN0cnVjdHVyZWQgbW9kZWwgaGFkIG5vIHN0cnVjdHVyZWREb2N1bWVudAotSlNQRUxfU3ludGF4PUVMIFN5bnRheCBFcnJvciAKLUpTUEVMX1Rva2VuPVVuYWJsZSB0byBhbmFseXplIEVMIGV4cHJlc3Npb24gZHVlIHRvIGxleGljYWwgYW5hbHlzaXMgZXJyb3IKLU1FU1NBR0VfSlNQX1ZBTElEQVRJTkdfTUVTU0FHRV9VSV89SlNQIFZhbGlkYXRvciB2YWxpZGF0aW5nIHswfQotSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZz1VcGRhdGluZyBKU1AgRnJhZ21lbnQgQ29udGVudCBTZXR0aW5ncwotSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZz1Qcm9ibGVtIHNhdmluZyBKU1AgRnJhZ21lbnQgQ29udGVudCBTZXR0aW5ncyBmb3IgezB9Ci1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMD17MH0gaXMgYSByZXNlcnZlZCBwcmVmaXguICBUcnkgYW5vdGhlcgotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzE9Q2Fubm90IGZpbmQgdGhlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZm9yICJ7MH0iCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMj1UaGUgcHJlZml4ICJ7MH0gImlzIHVzZWQgbW9yZSB0aGFuIG9uY2UKLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zPUEgezB9IHZhbHVlIGlzIHJlcXVpcmVkIGluIHRoaXMgZGlyZWN0aXZlCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfND1GcmFnbWVudCAiezB9IiB3YXMgbm90IGJlIGZvdW5kIGF0IGV4cGVjdGVkIHBhdGggezF9Ci1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfNT1NaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZSAiezB9IgotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzY9VW5kZWZpbmVkIGF0dHJpYnV0ZSBuYW1lICJ7MH0iCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfNz1BIHswfSBvciB7MX0gdmFsdWUgaXMgcmVxdWlyZWQgaW4gdGhpcyBkaXJlY3RpdmUKLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl84PVRoZSBzdXBlcmNsYXNzICJ7MH0iIHdhcyBub3QgZm91bmQgb24gdGhlIGJ1aWxkIHBhdGgKLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl85PUNhbm5vdCBmaW5kIHRoZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZvciAiezB9Ii4gIFRyeSBpbmNyZWFzaW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBEeW5hbWljIFdlYiBNb2R1bGUgcHJvamVjdCBmYWNldC4KLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8xMD1DYW5ub3QgZmluZCB0aGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmb3IgInswfSIuICBUcnkgdXNpbmcgYSBuZXdlciBncmFtbWFyIG9yIGRlY2xhcmVkIHZlcnNpb24gaW4gdGhlIFdlYiBEZXBsb3ltZW50IERlc2NyaXB0b3IuCi1KU1BBY3Rpb25WYWxpZGF0b3JfMD1UYWcgKHswfSkgbXVzdCBiZSBlbXB0eQotSlNQQmF0Y2hWYWxpZGF0b3JfMD1HYXRoZXJpbmcgZmlsZXMgaW4gezB9Ci1UYWdsaWJIZWxwZXJfMD1UaGUgVGFnRXh0cmFJbmZvIGNsYXNzIGZvciB7MH0gKHsxfSkgd2FzIG5vdCBmb3VuZCBvbiB0aGUgYnVpbGQgcGF0aAotVGFnbGliSGVscGVyXzE9VGhlIFRhZ0V4dHJhSW5mbyBjbGFzcyBmb3IgezB9ICh7MX0pIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQKLVRhZ2xpYkhlbHBlcl8yPUEgcHJvYmxlbSB3YXMgZW5jb3VudGVyZWQgdXNpbmcgVGFnRXh0cmFJbmZvIGNsYXNzIHsxfSBmb3IgezB9IAotVGFnbGliSGVscGVyXzM9VGhlIHRhZyBoYW5kbGVyIGNsYXNzIGZvciB7MH0gKHsxfSkgd2FzIG5vdCBmb3VuZCBvbiB0aGUgYnVpbGQgcGF0aAotSlNQVHJhbnNsYXRvcl8wPUludmFsaWQgaWRlbnRpZmllcjogInswfSIKLUpTUFRyYW5zbGF0b3JfMT1VbmRlZmluZWQgdHlwZTogezB9Ci1KU1BUcmFuc2xhdG9yXzI9Q2Fubm90IGRlY2xhcmUgYm90aCAiY2xhc3MiIGFuZCAiYmVhbk5hbWUiIGF0dHJpYnV0ZXMKLUpTUFRyYW5zbGF0b3JfMz1Vbmtub3duIHR5cGUgZm9yIGlkZW50aWZpZXIgInswfSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQwMmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmIGRlc2lyZWQsCi0gKiB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcyBwbHVnaW4uIE90aGVyCi0gKiBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogQHBhcmFtIGxldmVsIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbiBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aCAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudFdyYXBwZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTcwN2I3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudFdyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNQ29udGVudFdyYXBwZXJJbXBsIGV4dGVuZHMgQ01Ob2RlV3JhcHBlckltcGwgaW1wbGVtZW50cyBDTUNvbnRlbnQgewotCi0JcHJpdmF0ZSBDTUNvbnRlbnQgZkNNQ29udGVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUNvbnRlbnRXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHByZWZpeCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50V3JhcHBlckltcGwoU3RyaW5nIHByZWZpeCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQgbm9kZSkgewotCQlzdXBlcihwcmVmaXgsIG5vZGUpOwotCQlmQ01Db250ZW50ID0gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBmQ01Db250ZW50LmdldE1heE9jY3VyKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0JICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gZkNNQ29udGVudC5nZXRNaW5PY2N1cigpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZDTUNvbnRlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFdyYXBwZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50V3JhcHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzMGY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50V3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50V3JhcHBlckltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50LCBDTU5vZGVXcmFwcGVyIHsKLQotCWNsYXNzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCQlwcm90ZWN0ZWQgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJSGFzaHRhYmxlIGdldEhhc2h0YWJsZSgpIHsKLQkJCXJldHVybiB0YWJsZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIHRhYmxlLnNpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gKENNTm9kZSkgdGFibGUuZ2V0KG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCQlpbnQgc2l6ZSA9IHRhYmxlLnNpemUoKTsKLQkJCWlmIChpbmRleCA8IHNpemUpIHsKLQkJCQlJdGVyYXRvciB2YWx1ZXMgPSBpdGVyYXRvcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGluZGV4OyBpKyspIHsKLQkJCQkJcmVzdWx0ID0gdmFsdWVzLm5leHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKENNTm9kZSkgcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUsIENNTm9kZSBhTm9kZSkgewotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBhTm9kZSAhPSBudWxsKQotCQkJCXRhYmxlLnB1dChuYW1lLCBhTm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ01OYW1lc3BhY2VJbXBsIGltcGxlbWVudHMgQ01OYW1lc3BhY2UgewotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIENNRG9jdW1lbnRXcmFwcGVySW1wbC50aGlzLmdldFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuTkFNRV9TUEFDRTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQkJcmV0dXJuIENNRG9jdW1lbnRXcmFwcGVySW1wbC50aGlzLmdldFByZWZpeCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlyZXR1cm4gQ01Eb2N1bWVudFdyYXBwZXJJbXBsLnRoaXMuZ2V0VVJJKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgZmVhdHVyZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENNTmFtZWROb2RlTWFwIGZFbGVtZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcCBmRW50aXRpZXMgPSBudWxsOwotCXByaXZhdGUgQ01OYW1lc3BhY2UgZk5hbWVzcGFjZSA9IG5ldyBDTU5hbWVzcGFjZUltcGwoKTsKLQlwcml2YXRlIFN0cmluZyBmUHJlZml4OwotCXByaXZhdGUgU3RyaW5nIGZVUkk7Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudFdyYXBwZXJJbXBsKFN0cmluZyBuZXdVUkksIFN0cmluZyBuZXdQcmVmaXgsIENNRG9jdW1lbnQgdGxkKSB7Ci0JCWZVUkkgPSBuZXdVUkk7Ci0JCWZQcmVmaXggPSBuZXdQcmVmaXg7Ci0JCWZEb2N1bWVudCA9IHRsZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnRzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlpZiAoZkVsZW1lbnRzID09IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCk7Ci0JCQlDTU5hbWVkTm9kZU1hcEltcGwgZWxlbWVudHMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbChmUHJlZml4LCAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGdldERvY3VtZW50KCkuZ2V0RWxlbWVudHMoKS5pdGVtKGkpKTsKLQkJCQllbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJfQotCQkJZkVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIGZFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbnRpdGllcyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEVudGl0eURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlpZiAoZkVudGl0aWVzID09IG51bGwpIHsKLQkJCWZFbnRpdGllcyA9IGdldERvY3VtZW50KCkuZ2V0RW50aXRpZXMoKTsKLQkJfQotCQlyZXR1cm4gZkVudGl0aWVzOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVzcGFjZSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZXNwYWNlCi0JICovCi0JcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGZOYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50KCkuZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBmUHJlZml4OwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQlyZXR1cm4gZlVSSTsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudCgpLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWVlY2EzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwgZXh0ZW5kcyBDTU5vZGVXcmFwcGVySW1wbCBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uIHsKLQlwcml2YXRlIENNQ29udGVudCBmQ01Db250ZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBmRWxlbWVudERlY2wgPSBudWxsOwotCi0JLyoqCi0JICogQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHByZWZpeCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbChTdHJpbmcgcHJlZml4LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXN1cGVyKHByZWZpeCwgbm9kZSk7Ci0JCWZFbGVtZW50RGVjbCA9IG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEF0dHJpYnV0ZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCX0KLQotCS8qKgotCSAqIGdldENNQ29udGVudCBtZXRob2QKLQkgKiBAcmV0dXJuIENNQ29udGVudAotCSAqCi0JICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuCi0JICogVGhpcyBjYW4gYmUgYW4gQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlpZiAoZkNNQ29udGVudCA9PSBudWxsKSB7Ci0JCQlDTUNvbnRlbnQgY29udGVudCA9IGZFbGVtZW50RGVjbC5nZXRDb250ZW50KCk7Ci0JCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDTUdyb3VwKQotCQkJCWZDTUNvbnRlbnQgPSBuZXcgQ01Hcm91cFdyYXBwZXJJbXBsKGZQcmVmaXgsIChDTUdyb3VwKSBjb250ZW50KTsKLQkJCWVsc2UKLQkJCQlmQ01Db250ZW50ID0gbmV3IENNQ29udGVudFdyYXBwZXJJbXBsKGZQcmVmaXgsIGNvbnRlbnQpOwotCQl9Ci0JCXJldHVybiBmQ01Db250ZW50OwotCX0KLQotCS8qKgotCSAqIGdldENvbnRlbnRUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIGdldERhdGFUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldERhdGFUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudE5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TG9jYWxFbGVtZW50cyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGx5IGRlZmluZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0TG9jYWxFbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIGdldE1heE9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXRNYXhPY2N1cigpOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotCSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXRNaW5PY2N1cigpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwV3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg2MTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBXcmFwcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNR3JvdXBXcmFwcGVySW1wbCBleHRlbmRzIENNQ29udGVudFdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Hcm91cCB7Ci0JY2xhc3MgQ01Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBDTU5vZGVMaXN0IHsKLQkJcHJpdmF0ZSBMaXN0IG5vZGVzID0gbnVsbDsKLQotCQkvKioKLQkJICogQ01Ob2RlTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkJICovCi0JCXB1YmxpYyBDTU5vZGVMaXN0SW1wbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCQlub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhcHBlbmRJdGVtKENNTm9kZSBub2RlKSB7Ci0JCQlub2Rlcy5hZGQobm9kZSk7Ci0JCX0KLQotCQkvKioKLQkJICogZ2V0TGVuZ3RoIG1ldGhvZAotCQkgKiBAcmV0dXJuIGludAotCQkgKi8KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGl0ZW0gbWV0aG9kCi0JCSAqIEByZXR1cm4gQ01Ob2RlCi0JCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkJICovCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbm9kZXMuc2l6ZSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTU5vZGUpIG5vZGVzLmdldChpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENNTm9kZUxpc3QgZkNoaWxkTm9kZXMgPSBudWxsOwotCXByaXZhdGUgQ01Hcm91cCBmR3JvdXAgPSBudWxsOwotCi0JLyoqCi0JICogQ01Hcm91cFdyYXBwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gcHJlZml4IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbm9kZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUdyb3VwV3JhcHBlckltcGwoU3RyaW5nIHByZWZpeCwgQ01Hcm91cCBub2RlKSB7Ci0JCXN1cGVyKHByZWZpeCwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2hpbGROb2RlcyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZUxpc3QKLQkgKgotCSAqIFJldHVybnMgY2hpbGQgQ01Ob2RlTGlzdCwgd2hpY2ggaW5jbHVkZXMgRWxlbWVudERlZmluaXRpb24gb3IgQ01FbGVtZW50LgotCSAqLwotCXB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCWlmIChmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlDTU5vZGVMaXN0SW1wbCBjaGlsZE5vZGVzID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCQlDTU5vZGVMaXN0IGNoaWxkcmVuID0gZkdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUNNTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ01Hcm91cCkKLQkJCQkJY2hpbGROb2Rlcy5hcHBlbmRJdGVtKG5ldyBDTUdyb3VwV3JhcHBlckltcGwoZlByZWZpeCwgKENNR3JvdXApIGNoaWxkKSk7Ci0JCQkJZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikKLQkJCQkJY2hpbGROb2Rlcy5hcHBlbmRJdGVtKG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsKGZQcmVmaXgsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQpKTsKLQkJCQllbHNlCi0JCQkJCS8vIGVycm9yPwotCQkJCQljaGlsZE5vZGVzLmFwcGVuZEl0ZW0obmV3IENNTm9kZVdyYXBwZXJJbXBsKGZQcmVmaXgsIGNoaWxkKSk7Ci0JCQl9Ci0JCQlmQ2hpbGROb2RlcyA9IGNoaWxkTm9kZXM7Ci0JCX0KLQkJcmV0dXJuIGZDaGlsZE5vZGVzOwotCX0KLQotCS8qKgotCSAqIGdldE9wZXJhdGlvbiBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEFMT05FIChhKSwgU0VRVUVOQ0UgKGEsYiksIENIT0lDRSAoYXxiKSwgQUxMIChhJmIpLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBmR3JvdXAuZ2V0T3BlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmR3JvdXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZVdyYXBwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YjdkMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Ob2RlV3JhcHBlcjsKLQotcHVibGljIGNsYXNzIENNTm9kZVdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Ob2RlLCBDTU5vZGVXcmFwcGVyIHsKLQlwcml2YXRlIENNTm9kZSBmTm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5vZGVOYW1lID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZlByZWZpeCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZVdyYXBwZXJJbXBsKFN0cmluZyBwcmVmaXgsIENNTm9kZSBub2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcmVmaXggPSBwcmVmaXg7Ci0JCWZOb2RlID0gbm9kZTsKLQotCQlmTm9kZU5hbWUgPSBmUHJlZml4ICsgIjoiICsgZk5vZGUuZ2V0Tm9kZU5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBmTm9kZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBmTm9kZS5nZXROb2RlVHlwZSgpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZk5vZGUuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmTm9kZS5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWIyYjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBmYWN0b3J5IGZvciBKU1AgZG9jdW1lbnRzICh3aGljaCBmb3Igbm93IGxpdmUgaW4gdGhlIEhUTUwgQ29yZQotICogcGx1Z2luKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpTUENNRG9jdW1lbnRGYWN0b3J5IHsKLQotCXByaXZhdGUgSlNQQ01Eb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBnZXRDTURvY3VtZW50KENNRG9jVHlwZS5KU1AyMF9ET0NfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKiBAcGFyYW0gY210eXBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIGNtdHlwZSkgewotCQlpZiAoY210eXBlID09IG51bGwpCi0JCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudCgpOwotCQlyZXR1cm4gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoY210eXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChmbG9hdCBqc3BWZXJzaW9uKSB7Ci0JCWlmIChqc3BWZXJzaW9uID49IDIpCi0JCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSlNQMjBfRE9DX1RZUEUpOwotCQlpZiAoanNwVmVyc2lvbiA+PSAxLjIpCi0JCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSlNQMTJfRE9DX1RZUEUpOwotCQlpZiAoanNwVmVyc2lvbiA+PSAxKQotCQkJcmV0dXJuIGdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkpTUDExX0RPQ19UWVBFKTsKLQkJcmV0dXJuIGdldENNRG9jdW1lbnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdsaWJDb250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdsaWJDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDU0Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnbGliQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJJbmRleERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYkluZGV4TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5UYWdsaWJJbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBQcm92aWRlcyBhIGRpcmVjdCBtYXBwaW5nIGZyb20gSVN0cnVjdHVyZWREb2N1bWVudCB0byBzdXBwb3J0aW5nCi0gKiBUTERDTURvY3VtZW50TWFuYWdlci4KLSAqIAotICogTGlzdGVucyB0byB0aGUgY3JlYXRpb24gb2YgSlNQIHR5cGUgVGV4dEZpbGVCdWZmZXJzIGFuZCBmb3JjZXMgYSB0ZXh0LWxlc3MKLSAqIHJlcGFyc2UgYWZ0ZXIgY29ubmVjdGluZyB0YWdsaWItc3VwcG9ydGluZyBsaXN0ZW5lcnMuIENvbm5lY3RpbmcgdGhlCi0gKiBsaXN0ZW5lcnMgYmVmb3JlIHRoZSB0ZXh0IGlzIHNldCB3b3VsZCBiZSBpZGVhbCwgYnV0IHRoZXJlIGlzIG5vIHdheSB0bwotICogbG9vayB1cCB0YWdsaWIgcmVmZXJlbmNlcyBzaW5jZSB0aGUgbG9jYXRpb24gaXMgbm90IHlldCBrbm93YWJsZS4gU2luY2UKLSAqIHRhZ2xpYnMgY2FuIGFmZmVjdCB0aGUgcGFyc2luZyBvZiB0aGUgZG9jdW1lbnQsIGEgcmVwYXJzZSBpcyBjdXJyZW50bHkKLSAqIHJlcXVpcmVkIHRvIHJlYWN0IHRvIGN1c3RvbSB0YWdzIHdpdGggdGFnZGVwZW5kZW50IGNvbnRlbnQuCi0gKiAKLSAqIFRPRE86IFJlbW92ZSB0aGUgcmVwYXJzZSBwZW5hbHR5LgotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliQ29udHJvbGxlciBpbXBsZW1lbnRzIElEb2N1bWVudFNldHVwUGFydGljaXBhbnQsIElEb2N1bWVudFNldHVwUGFydGljaXBhbnRFeHRlbnNpb24gewotCi0JY2xhc3MgRG9jdW1lbnRJbmZvIGltcGxlbWVudHMgSVRhZ2xpYkluZGV4TGlzdGVuZXIgewotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50OwotCQlJVGV4dEZpbGVCdWZmZXIgdGV4dEZpbGVCdWZmZXI7Ci0JCUlQYXRoIGxvY2F0aW9uOwotCQlMb2NhdGlvbktpbmQgbG9jYXRpb25LaW5kOwotCQlUTERDTURvY3VtZW50TWFuYWdlciB0bGREb2N1bWVudE1hbmFnZXI7Ci0KLQkJcHVibGljIHZvaWQgaW5kZXhDaGFuZ2VkKElUYWdsaWJJbmRleERlbHRhIGRlbHRhKSB7Ci0JCQlpbnQgdHlwZSA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCWlmICh0eXBlID09IElUYWdsaWJJbmRleERlbHRhLkNIQU5HRUQgfHwgdHlwZSA9PSBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJSVRhZ2xpYkluZGV4RGVsdGFbXSBkZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJYm9vbGVhbiBhZmZlY3RlZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBrZXkgPSBUTERDTURvY3VtZW50TWFuYWdlci5nZXRVbmlxdWVJZGVudGlmaWVyKGRlbHRhc1tpXS5nZXRUYWdsaWJSZWNvcmQoKSk7Ci0JCQkJCWlmICh0bGREb2N1bWVudE1hbmFnZXIuZ2V0RG9jdW1lbnRzKCkuY29udGFpbnNLZXkoa2V5KSkgewotCQkJCQkJYWZmZWN0ZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChhZmZlY3RlZCkgewotCQkJCQlpZiAoX2RlYnVnQ2FjaGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgY2xlYXJlZCBpdHMgcHJpdmF0ZSBDTURvY3VtZW50IGNhY2hlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl0bGREb2N1bWVudE1hbmFnZXIuZ2V0RG9jdW1lbnRzKCkuY2xlYXIoKTsKLQkJCQkJdGxkRG9jdW1lbnRNYW5hZ2VyLmdldFNvdXJjZVBhcnNlcigpLnJlc2V0SGFuZGxlcnMoKTsKLQotCQkJCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnJlcGFyc2UodGhpcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0bGREb2N1bWVudE1hbmFnZXIuaW5kZXhDaGFuZ2VkKGRlbHRhKTsKLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z0NhY2hlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90bGRjbWRvY3VtZW50L2NhY2hlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCWNsYXNzIEZpbGVCdWZmZXJMaXN0ZW5lciBpbXBsZW1lbnRzIElGaWxlQnVmZmVyTGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI2J1ZmZlckNvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYnVmZmVyQ29udGVudEFib3V0VG9CZVJlcGxhY2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjYnVmZmVyQ29udGVudFJlcGxhY2VkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWZmZXJDb250ZW50UmVwbGFjZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNidWZmZXJDcmVhdGVkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWZmZXJDcmVhdGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9ICgoSVRleHRGaWxlQnVmZmVyKSBidWZmZXIpLmdldERvY3VtZW50KCk7Ci0JCQkJLy8gaWdub3JlIG5vbi1KU1AgZG9jdW1lbnRzCi0JCQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkpTUGRvY3VtZW50cykgewotCQkJCQlpZiAoIV9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzLmNvbnRhaW5zKGRvY3VtZW50KSkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJQXNzZXJ0LmlzVHJ1ZShkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQsIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBTZXR1cFBhcnRpY2lwYW50IHdhcyBjYWxsZWQgZm9yIG5vbi1JU3RydWN0dXJlZERvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gbnVsbDsKLQkJCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mRG9jdW1lbnRNYXApIHsKLQkJCQkJaW5mbyA9IChEb2N1bWVudEluZm8pIF9pbnN0YW5jZS5mRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJCQl9Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkvLyByZW1lbWJlciB0aGUgYnVmZmVyIG5vdwotCQkJCQlpbmZvLnRleHRGaWxlQnVmZmVyID0gKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW5mbyA9IG5ldyBEb2N1bWVudEluZm8oKTsKLQkJCQkJaW5mby5kb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudDsKLQkJCQkJaW5mby50ZXh0RmlsZUJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQkJaW5mby5sb2NhdGlvbiA9IGJ1ZmZlci5nZXRMb2NhdGlvbigpOwotCQkJCQlpbmZvLmxvY2F0aW9uS2luZCA9IExvY2F0aW9uS2luZC5OT1JNQUxJWkU7Ci0JCQkJCWluZm8udGxkRG9jdW1lbnRNYW5hZ2VyID0gbmV3IFRMRENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJCWluZm8udGxkRG9jdW1lbnRNYW5hZ2VyLnNldFNvdXJjZVBhcnNlcigoSlNQU291cmNlUGFyc2VyKSBpbmZvLmRvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJCQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkRvY3VtZW50TWFwKSB7Ci0JCQkJCQlfaW5zdGFuY2UuZkRvY3VtZW50TWFwLnB1dChkb2N1bWVudCwgaW5mbyk7Ci0JCQkJCX0KLQkJCQkJVGFnbGliSW5kZXguYWRkVGFnbGliSW5kZXhMaXN0ZW5lcihpbmZvKTsKLQkJCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkucmVwYXJzZSh0aGlzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI2J1ZmZlckRpc3Bvc2VkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWZmZXJEaXNwb3NlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpOwotCQkJCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMpIHsKLQkJCQkJaWYgKCFfaW5zdGFuY2UuZkpTUGRvY3VtZW50cy5yZW1vdmUoZG9jdW1lbnQpKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCURvY3VtZW50SW5mbyBpbmZvID0gbnVsbDsKLQkJCXN5bmNocm9uaXplZCAoZkRvY3VtZW50TWFwKSB7Ci0JCQkJTWFwLkVudHJ5W10gZW50cmllcyA9IChNYXAuRW50cnlbXSkgZkRvY3VtZW50TWFwLmVudHJ5U2V0KCkudG9BcnJheShuZXcgTWFwLkVudHJ5W2ZEb2N1bWVudE1hcC5zaXplKCldKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW5mbyA9IChEb2N1bWVudEluZm8pIGVudHJpZXNbaV0uZ2V0VmFsdWUoKTsKLQkJCQkJLyoqCi0JCQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjIxMzcKLQkJCQkJICogCi0JCQkJCSAqIE1pZ2h0IGJlIG51bGwgaWYgc2V0dXAoKSBoYXMgYmVlbiBjYWxsZWQgYnV0Ci0JCQkJCSAqIGJ1ZmZlckNyZWF0ZWQoKSBoYXMgbm90LCB5ZXQuCi0JCQkJCSAqLwotCQkJCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8udGV4dEZpbGVCdWZmZXIgIT0gbnVsbCAmJiBpbmZvLnRleHRGaWxlQnVmZmVyLmVxdWFscyhidWZmZXIpKSB7Ci0JCQkJCQlmRG9jdW1lbnRNYXAucmVtb3ZlKGVudHJpZXNbaV0uZ2V0S2V5KCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJaW5mby50bGREb2N1bWVudE1hbmFnZXIuY2xlYXJDYWNoZSgpOwotCQkJCVRhZ2xpYkluZGV4LnJlbW92ZVRhZ2xpYkluZGV4TGlzdGVuZXIoaW5mbyk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNkaXJ0eVN0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXJ0eVN0YXRlQ2hhbmdlZChJRmlsZUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjc3RhdGVDaGFuZ2VGYWlsZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlRmFpbGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjc3RhdGVDaGFuZ2luZyhvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2luZyhJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI3N0YXRlVmFsaWRhdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlciwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhdGVWYWxpZGF0aW9uQ2hhbmdlZChJRmlsZUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gaXNTdGF0ZVZhbGlkYXRlZCkgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjdW5kZXJseWluZ0ZpbGVEZWxldGVkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bmRlcmx5aW5nRmlsZURlbGV0ZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciN1bmRlcmx5aW5nRmlsZU1vdmVkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIsCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdW5kZXJseWluZ0ZpbGVNb3ZlZChJRmlsZUJ1ZmZlciBidWZmZXIsIElQYXRoIHBhdGgpIHsKLQkJfQotCi0KLQl9Ci0KLQlzdGF0aWMgVGFnbGliQ29udHJvbGxlciBfaW5zdGFuY2UgPSBudWxsOwotCXN0YXRpYyBwcml2YXRlIGJvb2xlYW4gZklzU2h1dGRvd24gPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0TG9jYXRpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZEb2N1bWVudE1hcCkgewotCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBfaW5zdGFuY2UuZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKQotCQkJCXJldHVybiBpbmZvLmxvY2F0aW9uOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldExvY2F0aW9uKFRMRENNRG9jdW1lbnRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJLy8gaWYgX2luc3RhbmNlIGlzIG51bGwsIHdlIGFyZSBhbHJlYWR5IHNodXR0aW5nIGRvbncKLQkJaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVBhdGggbG9jYXRpb24gPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mRG9jdW1lbnRNYXApIHsKLQkJCUl0ZXJhdG9yIGRvY0luZm9zID0gX2luc3RhbmNlLmZEb2N1bWVudE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGRvY0luZm9zLmhhc05leHQoKSAmJiBsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBkb2NJbmZvcy5uZXh0KCk7Ci0JCQkJaWYgKGluZm8udGxkRG9jdW1lbnRNYW5hZ2VyLmVxdWFscyhtYW5hZ2VyKSkKLQkJCQkJbG9jYXRpb24gPSBpbmZvLmxvY2F0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRMRENNRG9jdW1lbnRNYW5hZ2VyIGdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBpZiBfaW5zdGFuY2UgaXMgbnVsbCwgd2UgYXJlIGFscmVhZHkgc2h1dHRpbmcgZG93bgotCQlpZiAoX2luc3RhbmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkRvY3VtZW50TWFwKSB7Ci0JCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIF9pbnN0YW5jZS5mRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJCWlmIChpbmZvICE9IG51bGwpCi0JCQkJcmV0dXJuIGluZm8udGxkRG9jdW1lbnRNYW5hZ2VyOwotCQkJcmV0dXJuIG51bGw7Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2h1dGRvd24oKSB7Ci0JCXJldHVybiBmSXNTaHV0ZG93bjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTaHV0ZG93bihib29sZWFuIGlzU2h1dGRvd24pIHsKLQkJZklzU2h1dGRvd24gPSBpc1NodXRkb3duOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXNldFNodXRkb3duKHRydWUpOwotCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5yZW1vdmVGaWxlQnVmZmVyTGlzdGVuZXIoX2luc3RhbmNlLmZCdWZmZXJMaXN0ZW5lcik7Ci0JCV9pbnN0YW5jZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBUYWdsaWJDb250cm9sbGVyKCk7Ci0JCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5hZGRGaWxlQnVmZmVyTGlzdGVuZXIoX2luc3RhbmNlLmZCdWZmZXJMaXN0ZW5lcik7Ci0JCX0KLQkJc2V0U2h1dGRvd24oZmFsc2UpOwotCX0KLQotCUlGaWxlQnVmZmVyTGlzdGVuZXIgZkJ1ZmZlckxpc3RlbmVyOwotCi0JTWFwIGZEb2N1bWVudE1hcDsKLQotCUxpc3QgZkpTUGRvY3VtZW50czsKLQotCS8qCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyBvbmx5IHRvIGJlIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBGaWxlQnVmZmVyCi0JICogZnJhbWV3b3JrCi0JICovCi0JcHVibGljIFRhZ2xpYkNvbnRyb2xsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZCdWZmZXJMaXN0ZW5lciA9IG5ldyBGaWxlQnVmZmVyTGlzdGVuZXIoKTsKLQkJZkpTUGRvY3VtZW50cyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZEb2N1bWVudE1hcCA9IG5ldyBIYXNoTWFwKDEpOwotCX0KLQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHRvIGJlIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBGaWxlQnVmZmVyIGZyYW1ld29yawotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudCNzZXR1cChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gaWYgd2UndmUgYWxyZWFkeSBzaHV0ZG93biwganVzdCBpZ25vcmUKLQkJaWYgKGlzU2h1dGRvd24oKSkKLQkJCXJldHVybjsKLQkJLy8gcmVmZXJlbmNlIHRoZSBzaGFyZWQgaW5zdGFuY2UncyBkb2N1bWVudHMgZGlyZWN0bHkKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkpTUGRvY3VtZW50cykgewotCQkJX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMuYWRkKGRvY3VtZW50KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50RXh0ZW5zaW9uI3NldHVwKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXAoSURvY3VtZW50IGRvY3VtZW50LCBJUGF0aCBsb2NhdGlvbiwgTG9jYXRpb25LaW5kIGxvY2F0aW9uS2luZCkgewotCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IHNodXRkb3duLCBqdXN0IGlnbm9yZQotCQlpZiAoaXNTaHV0ZG93bigpKQotCQkJcmV0dXJuOwotCQkvLyByZWZlcmVuY2UgdGhlIHNoYXJlZCBpbnN0YW5jZSdzIGRvY3VtZW50cyBkaXJlY3RseQotCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzKSB7Ci0JCQlfaW5zdGFuY2UuZkpTUGRvY3VtZW50cy5hZGQoZG9jdW1lbnQpOwotCQl9Ci0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSBuZXcgRG9jdW1lbnRJbmZvKCk7Ci0JCWluZm8uZG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCWluZm8udGV4dEZpbGVCdWZmZXIgPSBudWxsOyAvLyB3aWxsIGJlIHN1cHBsaWVkIGxhdGVyCi0JCWluZm8ubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJaW5mby5sb2NhdGlvbktpbmQgPSBsb2NhdGlvbktpbmQ7Ci0JCWluZm8udGxkRG9jdW1lbnRNYW5hZ2VyID0gbmV3IFRMRENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZEb2N1bWVudE1hcCkgewotCQkJX2luc3RhbmNlLmZEb2N1bWVudE1hcC5wdXQoZG9jdW1lbnQsIGluZm8pOwotCQl9Ci0JCWluZm8udGxkRG9jdW1lbnRNYW5hZ2VyLnNldFNvdXJjZVBhcnNlcigoSlNQU291cmNlUGFyc2VyKSBpbmZvLmRvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkucmVwYXJzZSh0aGlzKTsKLQkJfQotCQlUYWdsaWJJbmRleC5hZGRUYWdsaWJJbmRleExpc3RlbmVyKGluZm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZWE1ODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBpbXBsZW1lbnRzIFRMREF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzA1NTYKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDTURhdGFUeXBlIGF0dHJUeXBlID0gbmV3IENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbjsKLQotCS8vCi0JcHJpdmF0ZSBib29sZWFuIGZJc0ZyYWdtZW50ID0gZmFsc2U7Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgZk93bmVyRG9jdW1lbnQ7Ci0JLy8gb3B0aW9uYWwgaWQKLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0KLQkvLyByZXF1aXJlZCBuYW1lCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JLy8gb3B0aW9uYWwgInJlcXVpcmVkIiBlbGVtZW50IHByZXNlbnQsIGRlZmF1bHRzIHRvIG5vdCBwcmVzZW50Ci0JcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVkID0gZmFsc2U7Ci0KLQkvLyBvcHRpb25hbCBydW4tdGltZSAoc2NyaXBsZXQgZGVyaXZlZCkgdmFsdWUgb2YgYXR0cmlidXRlcywgZGVmYXVsdHMgdG8KLQkvLyBub25lL2ZhbHNlCi0JcHJpdmF0ZSBTdHJpbmcgcnRleHBydmFsdWUgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbChDTURvY3VtZW50IG93bmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZPd25lckRvY3VtZW50ID0gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0ck5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0clR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTURhdGFUeXBlCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCXJldHVybiBhdHRyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT047Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRPd25lckRvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gZk93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICogCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZSAhPSBudWxsICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikpIHsKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOyAvLyByZXR1cm4gYXR0cmlidXRlIGRlc2NyaXB0aW9uCi0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhUTEREb2N1bWVudC5DTV9LSU5EKSkgewotCQkJcmV0dXJuIFRMRERvY3VtZW50LkpTUF9UTEQ7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSkgewotCQkJcmV0dXJuIGdldE93bmVyRG9jdW1lbnQoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJ0ZXhwcnZhbHVlKCkgewotCQlyZXR1cm4gcnRleHBydmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRVc2FnZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBPUFRJT05BTHxSRVFVSVJFRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiByZXF1aXJlZCA/IFJFUVVJUkVEIDogT1BUSU9OQUw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0ZyYWdtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKSB7Ci0JCXJldHVybiBmSXNGcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gcmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlmRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNGcmFnbWVudAotCSAqICAgICAgICAgICAgVGhlIGlzRnJhZ21lbnQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyYWdtZW50KGJvb2xlYW4gaXNGcmFnbWVudCkgewotCQlmSXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCWlkID0gbmV3SWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZU5hbWUoU3RyaW5nIHN0cmluZykgewotCQluYW1lID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSZXF1aXJlZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gbmV3UmVxdWlyZWQpIHsKLQkJcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UmVxdWlyZWQKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZFN0cmluZyhTdHJpbmcgbmV3UmVxdWlyZWQpIHsKLQkJaWYgKG5ld1JlcXVpcmVkICE9IG51bGwpIHsKLQkJCWlmIChuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKEpTUDEyVExETmFtZXMuVFJVRSkgfHwgbmV3UmVxdWlyZWQuZXF1YWxzSWdub3JlQ2FzZShKU1AxMlRMRE5hbWVzLllFUykpCi0JCQkJc2V0UmVxdWlyZWQodHJ1ZSk7Ci0JCQllbHNlIGlmIChuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKEpTUDEyVExETmFtZXMuRkFMU0UpIHx8IG5ld1JlcXVpcmVkLmVxdWFsc0lnbm9yZUNhc2UoSlNQMTJUTEROYW1lcy5OTykpCi0JCQkJc2V0UmVxdWlyZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1J0ZXhwcnZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnRleHBydmFsdWUoU3RyaW5nIG5ld1J0ZXhwcnZhbHVlKSB7Ci0JCXJ0ZXhwcnZhbHVlID0gbmV3UnRleHBydmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIAotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gcHJvcGVydHlOYW1lID09IG51bGwgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFRMRERvY3VtZW50LkNNX0tJTkQpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCAiICsgc3VwZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Tm9kZU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCS8vIEJvb2xlYW4udG9TdHJpbmcoYm9vbGVhbikgaXMgaW50cm9kdWNlZCBpbiAxLjQKLQkJLy8gYnVmZmVyLmFwcGVuZCgiXG5cdCByZXF1aXJlZDoiICsKLQkJLy8gU3RyaW5nVXRpbHMuZXNjYXBlKEJvb2xlYW4udG9TdHJpbmcoaXNSZXF1aXJlZCgpKSkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IHJlcXVpcmVkOiIgKyBTdHJpbmdVdGlscy50b1N0cmluZyhpc1JlcXVpcmVkKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHJ0ZXhwcjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFJ0ZXhwcnZhbHVlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZ2V0SWQoKSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBpZDoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldElkKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRGF0YVR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzMjVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01EYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ01EYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGF0YVR5cGVOYW1lOwotCi0JcHVibGljIENNRGF0YVR5cGVJbXBsKFN0cmluZyBkYXRhVHlwZU5hbWUpIHsKLQkJdGhpcy5kYXRhVHlwZU5hbWUgPSBkYXRhVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICoKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGRhdGEgdHlwZSBpcyBjcmVhdGVkLgotCSAqIFRoaXMgcmV0dXJucyBudWxsIG9mIGEgc3VpdGFibGUgZGVmYXVsdCBpcyBub3QgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGRhdGFUeXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyAgCi0JICoKLQkgKiBSZXR1cm5zIHRoZSBpbXBsaWVkIHZhbHVlIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEltcGxpZWRWYWx1ZUtpbmQgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBJTVBMSUVEX1ZBTFVFX05PTkUsIElNUExJRURfVkFMVUVfRklYRUQsIElNUExJRURfVkFMVUVfREVGQVVMVC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKSB7Ci0JCXJldHVybiBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGRhdGFUeXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjcmliZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50RmFjdG9yeVRMRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRGYWN0b3J5VExELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzUxYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRGYWN0b3J5VExELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMjBUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExESW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDIwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkRvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklKYXJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVExEUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ0RpclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVVJMUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3RvcnkuQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogQ01Eb2N1bWVudEJ1aWxkZXIgZm9yIFRhZ2xpYiBEZXNjcmlwdG9ycwotICogCi0gKiBSZXR1cm5zIG5hbWVzcGFjZS1sZXNzIENNRG9jdW1lbnRzIGZvciBhIHRhZ2xpYiBkZXNjcmlwdG9yLCBsb2FkaW5nIGl0Ci0gKiBkaXJlY3RseSBmcm9tIGEgZmlsZSBvciBleHRyYWN0ZWQgZnJvbSBhIEpBUiBhcmNoaXZlLiBDb250ZW50IE1vZGVsIG9iamVjdHMKLSAqIHdpbGwgaW1wbGVtZW50IHRoZSBUTERDTURvY3VtZW50LCBUTERFbGVtZW50RGVjbGFyYXRpb24sIGFuZAotICogVExEQXR0cmlidXRlRGVjbGFyYXRpb24gaW50ZXJmYWNlcyBmb3IgZXh0ZW5kZWQgcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRGYWN0b3J5VExEIGltcGxlbWVudHMgQ01Eb2N1bWVudEZhY3RvcnkgewotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90bGRjbWRvY3VtZW50L2ZhY3RvcnkiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQ01Eb2N1bWVudEZhY3RvcnlUTEQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlUTEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTk9UIEFQSQotCSAqIAotCSAqIEBwYXJhbSBiYXNlbG9jYXRpb24KLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KFN0cmluZyBiYXNlbG9jYXRpb24sIElucHV0U3RyZWFtIGlucHV0KSB7Ci0JCURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRG9jdW1lbnRQcm92aWRlcigpOwotCQlwcm92aWRlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJcHJvdmlkZXIuc2V0Um9vdEVsZW1lbnROYW1lKEpTUDExVExETmFtZXMuVEFHTElCKTsKLQkJcHJvdmlkZXIuc2V0SW5wdXRTdHJlYW0oaW5wdXQpOwotCQlpZiAoYmFzZWxvY2F0aW9uICE9IG51bGwpCi0JCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKGJhc2Vsb2NhdGlvbik7Ci0JCXJldHVybiBsb2FkRG9jdW1lbnQoYmFzZWxvY2F0aW9uLCBwcm92aWRlci5nZXRSb290RWxlbWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDTURvY3VtZW50SW1wbCBidWlsZENNRG9jdW1lbnRGcm9tRm9sZGVyKElQYXRoIHBhdGgpIHsKLQkJaWYgKF9kZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0YWdkaXIgbG9hZGluZyBmb3IgIiArIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gRUJORiBpcyBsaXN0ZWQgYXQgMS4zLjEwCi0JCUNNRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbmV3IENNRG9jdW1lbnRJbXBsKCk7Ci0JCWRvY3VtZW50LnNldEJhc2VMb2NhdGlvbihwYXRoLnRvU3RyaW5nKCkpOwotCQlkb2N1bWVudC5zZXRUbGlidmVyc2lvbigiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkJSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihwYXRoKTsKLQkJSVJlc291cmNlW10gdGFnZmlsZXM7Ci0JCXRyeSB7Ci0JCQl0YWdmaWxlcyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ2ZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHRhZ2ZpbGVzW2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQlpZiAodGFnZmlsZXNbaV0uZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJCQkJY29udGludWU7Ci0JCQkJCVN0cmluZyBleHRlbnNpb24gPSB0YWdmaWxlc1tpXS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAoZXh0ZW5zaW9uLmVxdWFscygidGFnIikgfHwgZXh0ZW5zaW9uLmVxdWFscygidGFneCIpKSkgewotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oZG9jdW1lbnQsIChJRmlsZSkgdGFnZmlsZXNbaV0pOwotCQkJCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQkJCQlkb2N1bWVudC5mRWxlbWVudHMuc2V0TmFtZWRJdGVtKGVkLmdldE5vZGVOYW1lKCksIGVkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgQVBJCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudEZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQkvLyBsb2FkIHRoZSB0YWdsaWIgZGVzY3JpcHRvciBmaWxlCi0JCURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRG9jdW1lbnRQcm92aWRlcigpOwotCQlwcm92aWRlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJcHJvdmlkZXIuc2V0QmFzZVJlZmVyZW5jZShmaWxlTmFtZSk7Ci0JCXByb3ZpZGVyLnNldFJvb3RFbGVtZW50TmFtZShKU1AxMVRMRE5hbWVzLlRBR0xJQik7Ci0JCXByb3ZpZGVyLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJTm9kZSByb290RWxlbWVudCA9IHByb3ZpZGVyLmdldFJvb3RFbGVtZW50KCk7Ci0JCXJldHVybiBsb2FkRG9jdW1lbnQoZmlsZU5hbWUsIHJvb3RFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgYSBDTURvY3VtZW50IGFzc3VtaW5nIHRoZSBKU1AgdjEuMSBkZWZhdWx0IHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gamFyRmlsZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5pbmcgSkFSIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnRGcm9tSmFyKFN0cmluZyBqYXJGaWxlTmFtZSkgewotCQkvLyBsb2FkIHRoZSB0YWdsaWIgZGVzY3JpcHRvciBmaWxlCi0JCXJldHVybiBidWlsZENNRG9jdW1lbnRGcm9tSmFyKGphckZpbGVOYW1lLCBKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgYSBDTURvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGphckZpbGVOYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb250YWluaW5nIEpBUiBmaWxlCi0JICogQHBhcmFtIGNvbnRlbnRGaWxlTmFtZSAtCi0JICogICAgICAgICAgICB0aGUgcGF0aCB3aXRoaW4gdGhlIEpBUiBmb3IgYSB2YWxpZCB0YWdsaWIgZGVzY3JpcHRvcgotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudEZyb21KYXIoU3RyaW5nIGphckZpbGVOYW1lLCBTdHJpbmcgY29udGVudEZpbGVOYW1lKSB7Ci0JCS8vIGxvYWQgdGhlIHRhZ2xpYiBkZXNjcmlwdG9yIGZpbGUKLQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKGphckZpbGVOYW1lKTsKLQkJcHJvdmlkZXIuc2V0Um9vdEVsZW1lbnROYW1lKEpTUDExVExETmFtZXMuVEFHTElCKTsKLQkJcHJvdmlkZXIuc2V0SmFyRmlsZU5hbWUoamFyRmlsZU5hbWUpOwotCQlwcm92aWRlci5zZXRGaWxlTmFtZShjb250ZW50RmlsZU5hbWUpOwotCQlDTURvY3VtZW50IGRvY3VtZW50ID0gbG9hZERvY3VtZW50KCJqYXI6ZmlsZTovLyIgKyBqYXJGaWxlTmFtZSArICIhIiArIGNvbnRlbnRGaWxlTmFtZSwgcHJvdmlkZXIuZ2V0Um9vdEVsZW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkvLyBUT0RPOiBBZGQgdGhlIHRhZ3MgZGVjbGFyZWQgaW4gTUVUQS1JTkYvdGFncywgc2VlIEpTUCAyLjAgc2VjdGlvbgotCQkvLyA4LjQuMQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIENNQXR0cmlidXRlRGVjbGFyYXRpb24gY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb24oQ01Eb2N1bWVudCBkb2N1bWVudCwgTm9kZSBhdHRyTm9kZSkgewotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBhdHRyID0gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKGRvY3VtZW50KTsKLQotCQlOb2RlIGNoaWxkID0gYXR0ck5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXROb2RlTmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5JRCkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0SWQoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLlJFUVVJUkVEKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXRSZXF1aXJlZFN0cmluZyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuUlRFWFBSVkFMVUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldFJ0ZXhwcnZhbHVlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GUkFHTUVOVCkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0RnJhZ21lbnQoQm9vbGVhbi52YWx1ZU9mKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogQnVpbGRzIGEgQ01Eb2N1bWVudCBmcm9tIGEgdGFnbGliIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdXJpIC0KLQkgKiAgICAgICAgICAgIHRoZSBsb2NhdGlvbiBvZiBhIHZhbGlkIHRhZ2xpYiBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCUNNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVDTURvY3VtZW50RnJvbUZpbGUodXJpKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwgJiYgdXJsICE9IG51bGwpIHsKLQkJCWlmICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gY3JlYXRlQ01Eb2N1bWVudEZyb21GaWxlKHVybC5nZXRGaWxlKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyoqCi0JCQkJICogU2tpcCBhbnl0aGluZyBlbHNlIHNpbmNlIHRyeWluZyB0byBsb2FkIGEgVExEIGZyb20gYSByZW1vdGUKLQkJCQkgKiBsb2NhdGlvbiBoYXMgdW5wcmVkaWN0YWJsZSBwZXJmb3JtYW5jZSBpbXBhY3QuCi0JCQkJICovCi0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gbmV3IENNRG9jdW1lbnRJbXBsKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50RnJvbUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUNNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gYnVpbGRDTURvY3VtZW50RnJvbUphcihmaWxlTmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCQl0cnkgewotCQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcmVzdWx0ID0gYnVpbGRDTURvY3VtZW50RnJvbURpcmVjdG9yeShmaWxlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IGJ1aWxkQ01Eb2N1bWVudEZyb21GaWxlKGZpbGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50RnJvbURpcmVjdG9yeShGaWxlIGZpbGUpIHsKLQkJSUZpbGVbXSBmb3VuZEZpbGVzRm9yTG9jYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGUuZ2V0UGF0aCgpKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZm91bmRGaWxlc0ZvckxvY2F0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZm91bmRGaWxlc0ZvckxvY2F0aW9uW2ldLmlzQWNjZXNzaWJsZSgpICYmIGZvdW5kRmlsZXNGb3JMb2NhdGlvbltpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCXJldHVybiBidWlsZENNRG9jdW1lbnRGcm9tRm9sZGVyKGZvdW5kRmlsZXNGb3JMb2NhdGlvbltpXS5nZXRGdWxsUGF0aCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlRWxlbWVudERlY2xhcmF0aW9uKENNRG9jdW1lbnRJbXBsIGRvY3VtZW50LCBFbGVtZW50IHRhZ0ZpbGVOb2RlLCBTdHJpbmcgcGF0aCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKGRvY3VtZW50KTsKLQkJLyoKLQkJICogUHJlbG9hZCB3aXRoIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhZyBmaWxlLS1pdCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkJICogYnkgdGhlIHZhbHVlcyBmcm9tIHRoZSBUTEQKLQkJICovCi0JCUlQYXRoIHRhZ1BhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUobmV3IFBhdGgoZG9jdW1lbnQuZ2V0QmFzZUxvY2F0aW9uKCkpLCBwYXRoKTsKLQkJaWYgKHRhZ1BhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlJRmlsZSB0YWdGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHRhZ1BhdGgpOwotCQkJaWYgKHRhZ0ZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQllZC5zZXRQYXRoKHRhZ0ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQlpZiAodGFnUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJ0YWciKSkgewotCQkJCQlsb2FkVGFnRmlsZShlZCwgdGFnRmlsZSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhZ1BhdGguZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygidGFneCIpKSB7Ci0JCQkJCWxvYWRUYWdYRmlsZShlZCwgdGFnRmlsZSwgdHJ1ZSk7Ci0JCQkJfQotCi0JCQkJaWYgKHRhZ0ZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsICYmIGVkLmdldFNtYWxsSWNvbigpICE9IG51bGwpIHsKLQkJCQkJZWQuc2V0U21hbGxJY29uVVJMKFVSSUhlbHBlci5ub3JtYWxpemUoZWQuZ2V0U21hbGxJY29uKCksICJmaWxlOiIgKyB0YWdGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgdGFnRmlsZS5nZXRMb2NhdGlvbigpLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbG9hZCBpbmZvcm1hdGlvbiBkZWNsYXJlZCB3aXRoaW4gdGhlIC50bGQKLQkJTm9kZSBjaGlsZCA9IHRhZ0ZpbGVOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXREZXNjcmlwdGlvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRJU1BMQVlfTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldERpc3BsYXlOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRVhBTVBMRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldEV4YW1wbGUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0U21hbGxJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldE5vZGVOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuUEFUSCkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldFBhdGgoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5UQUdfRVhURU5TSU9OKSkgewotCQkJCQllZC5nZXRFeHRlbnNpb25zKCkuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlRWxlbWVudERlY2xhcmF0aW9uKENNRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgdGFnTm9kZSkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKGRvY3VtZW50KTsKLQotCQlOb2RlIGNoaWxkID0gdGFnTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIHRhZyBpbmZvcm1hdGlvbgotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLk5BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXROb2RlTmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5UQUdDTEFTUykgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVEFHX0NMQVNTKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldFRhZ2NsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRFSUNMQVNTKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5URUlfQ0xBU1MpKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0VGVpY2xhc3MoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuQk9EWUNPTlRFTlQpIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkJPRFlfQ09OVEVOVCkpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlTdHJpbmcgYm9keWNvbnRlbnQgPSBnZXRDb250YWluZWRUZXh0KGNoaWxkKTsKLQkJCQkJLy8gQXBwYXJlbnRseSwgQXBhY2hlIFRvbWNhdCBpcyBub3QgY2FzZSBzZW5zaXRpdmUgYWJvdXQKLQkJCQkJLy8gdGhlc2UgdmFsdWVzCi0JCQkJCWlmIChib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKEpTUDExVExETmFtZXMuQ09OVEVOVF9KU1ApKQotCQkJCQkJZWQuc2V0Qm9keWNvbnRlbnQoSlNQMTFUTEROYW1lcy5DT05URU5UX0pTUCk7Ci0JCQkJCWVsc2UgaWYgKGJvZHljb250ZW50LmVxdWFsc0lnbm9yZUNhc2UoSlNQMTFUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCkpCi0JCQkJCQllZC5zZXRCb2R5Y29udGVudChKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKTsKLQkJCQkJZWxzZSBpZiAoYm9keWNvbnRlbnQuZXF1YWxzSWdub3JlQ2FzZShKU1AxMVRMRE5hbWVzLkNPTlRFTlRfRU1QVFkpKQotCQkJCQkJZWQuc2V0Qm9keWNvbnRlbnQoSlNQMTFUTEROYW1lcy5DT05URU5UX0VNUFRZKTsKLQkJCQkJZWxzZSBpZiAoYm9keWNvbnRlbnQuZXF1YWxzSWdub3JlQ2FzZShKU1AyMFRMRE5hbWVzLkNPTlRFTlRfU0NSSVBUTEVTUykpCi0JCQkJCQllZC5zZXRCb2R5Y29udGVudChKU1AyMFRMRE5hbWVzLkNPTlRFTlRfU0NSSVBUTEVTUyk7Ci0JCQkJfQotCQkJCS8vIGluZm8gKDEuMSBvbmx5KSBvciBkZXNjcmlwdGlvbiAoMS4yIG9ubHkpCi0JCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLklORk8pIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJLy8gYXR0cmlidXRlcwotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLkFUVFJJQlVURSkpIHsKLQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb24oZG9jdW1lbnQsIGNoaWxkKTsKLQkJCQkJZWQuZkF0dHJpYnV0ZXMuc2V0TmFtZWRJdGVtKGF0dHIuZ2V0QXR0ck5hbWUoKSwgYXR0cik7Ci0JCQkJfQotCQkJCS8vIHZhcmlhYmxlcwotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBUklBQkxFKSkgewotCQkJCQllZC5nZXRWYXJpYWJsZXMoKS5hZGQoY3JlYXRlVmFyaWFibGUoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldExhcmdlSWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRTbWFsbEljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5UQUdfRVhURU5TSU9OKSAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCWVkLmdldEV4dGVuc2lvbnMoKS5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gZWQ7Ci0JfQotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oQ01Eb2N1bWVudCBkb2N1bWVudCwgSUZpbGUgdGFnRmlsZSkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKGRvY3VtZW50KTsKLQkJLy8gaW4gdGFnIGZpbGVzLCB0aGUgZGVmYXVsdCBib2R5IGNvbnRlbnQgaXMgc2NyaXB0bGVzcyBpbnN0ZWFkIG9mIEpTUAotCQllZC5zZXRCb2R5Y29udGVudChKU1AyMFRMRE5hbWVzLkNPTlRFTlRfU0NSSVBUTEVTUyk7Ci0JCVN0cmluZyBzaG9ydEZpbGVuYW1lID0gdGFnRmlsZS5nZXROYW1lKCk7Ci0JCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gdGFnRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWlmIChmaWxlRXh0ZW5zaW9uICE9IG51bGwgJiYgZmlsZUV4dGVuc2lvbi5sZW5ndGgoKSA+IDApIHsKLQkJCXNob3J0RmlsZW5hbWUgPSBzaG9ydEZpbGVuYW1lLnN1YnN0cmluZygwLCBzaG9ydEZpbGVuYW1lLmxlbmd0aCgpIC0gZmlsZUV4dGVuc2lvbi5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCWVkLnNldE5vZGVOYW1lKHNob3J0RmlsZW5hbWUpOwotCQllZC5zZXRQYXRoKHRhZ0ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJaWYgKGZpbGVFeHRlbnNpb24uZXF1YWxzKCJ0YWciKSkgewotCQkJbG9hZFRhZ0ZpbGUoZWQsIHRhZ0ZpbGUsIHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKGZpbGVFeHRlbnNpb24uZXF1YWxzKCJ0YWd4IikpIHsKLQkJCWxvYWRUYWdYRmlsZShlZCwgdGFnRmlsZSwgdHJ1ZSk7Ci0JCX0KLQotCQlpZiAodGFnRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwgJiYgZWQuZ2V0U21hbGxJY29uKCkgIT0gbnVsbCkgewotCQkJZWQuc2V0U21hbGxJY29uVVJMKFVSSUhlbHBlci5ub3JtYWxpemUoZWQuZ2V0U21hbGxJY29uKCksICJmaWxlOiIgKyB0YWdGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgdGFnRmlsZS5nZXRMb2NhdGlvbigpLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpKSk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCXByb3RlY3RlZCBUTERGdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihDTURvY3VtZW50IGRvY3VtZW50LCBOb2RlIGZ1bmN0aW9uTm9kZSkgewotCQlUTERGdW5jdGlvbkltcGwgZnVuY3Rpb24gPSBuZXcgVExERnVuY3Rpb25JbXBsKGRvY3VtZW50KTsKLQkJYm9vbGVhbiBoYXNOYW1lID0gZmFsc2U7Ci0KLQkJTm9kZSBjaGlsZCA9IGZ1bmN0aW9uTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIHRhZyBpbmZvcm1hdGlvbgotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXROYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRVhBTVBMRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldEV4YW1wbGUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GVU5DVElPTl9DTEFTUykgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldENsYXNzTmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkZVTkNUSU9OX0VYVEVOU0lPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLmdldEV4dGVuc2lvbnMoKS5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GVU5DVElPTl9TSUdOQVRVUkUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXRTaWduYXR1cmUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0SWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLk5BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXROYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQkJaGFzTmFtZSA9IGZ1bmN0aW9uLmdldE5hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlpZiAoaGFzTmFtZSkgewotCQkJcmV0dXJuIGZ1bmN0aW9uOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBUTERJbml0UGFyYW0gY3JlYXRlSW5pdFBhcmFtKE5vZGUgaW5pdFBhcmFtTm9kZSkgewotCQlUTERJbml0UGFyYW1JbXBsIGluaXRQYXJhbSA9IG5ldyBUTERJbml0UGFyYW1JbXBsKCk7Ci0JCU5vZGUgY2hpbGQgPSBpbml0UGFyYW1Ob2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SX1BBUkFNX05BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlpbml0UGFyYW0uc2V0TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9QQVJBTV9WQUxVRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWluaXRQYXJhbS5zZXRWYWx1ZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJaW5pdFBhcmFtLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGluaXRQYXJhbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExETGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoTm9kZSBsaXN0ZW5lck5vZGUpIHsKLQkJVExETGlzdGVuZXJJbXBsIGxpc3RlbmVyID0gbmV3IFRMRExpc3RlbmVySW1wbCgpOwotCQlOb2RlIGNoaWxkID0gbGlzdGVuZXJOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTElTVEVORVJfQ0xBU1MpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlsaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCBUTERWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKE5vZGUgdmFsaWRhdG9yTm9kZSkgewotCQlUTERWYWxpZGF0b3JJbXBsIHZhbGlkYXRvciA9IG5ldyBUTERWYWxpZGF0b3JJbXBsKCk7Ci0JCU5vZGUgY2hpbGQgPSB2YWxpZGF0b3JOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SX0NMQVNTKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFsaWRhdG9yLnNldFZhbGlkYXRvckNsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SX0lOSVRfUEFSQU0pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YWxpZGF0b3IuZ2V0SW5pdFBhcmFtcygpLmFkZChjcmVhdGVJbml0UGFyYW0oY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExEVmFyaWFibGUgY3JlYXRlVmFyaWFibGUoTm9kZSB2YXJpYWJsZU5vZGUpIHsKLQkJVExEVmFyaWFibGVJbXBsIHZhcmlhYmxlID0gbmV3IFRMRFZhcmlhYmxlSW1wbCgpOwotCQlOb2RlIGNoaWxkID0gdmFyaWFibGVOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfQ0xBU1MpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXRWYXJpYWJsZUNsYXNzKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfREVDTEFSRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldERlY2xhcmVTdHJpbmcoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0ZST01fQVRUUklCVVRFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0TmFtZUZyb21BdHRyaWJ1dGUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0dJVkVOKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0TmFtZUdpdmVuKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfU0NPUEUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXRTY29wZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gdmFyaWFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250YWluZWRUZXh0KE5vZGUgcGFyZW50KSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuLmdldExlbmd0aCgpID09IDEpIHsKLQkJCXJldHVybiBnZXRWYWx1ZShjaGlsZHJlbi5pdGVtKDApKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCVN0cmluZyByZWZlcmVuY2UgPSAoKEVudGl0eVJlZmVyZW5jZSkgY2hpbGQpLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmVmZXJlbmNlID0gIiYiICsgY2hpbGQuZ2V0Tm9kZU5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQlzLmFwcGVuZChyZWZlcmVuY2UudHJpbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzLmFwcGVuZChnZXRWYWx1ZShjaGlsZCkpOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBzLnRvU3RyaW5nKCkudHJpbSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlKE5vZGUgbikgewotCQlpZiAobiA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB2YWx1ZSA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB2YWx1ZS50cmltKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCdWlsZGVyRm9yR3JhbW1hcihTdHJpbmcgZ3JhbW1hckZpbGVOYW1lKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdyYW1tYXJGaWxlTmFtZS50b0xvd2VyQ2FzZSgpOwotCQlyZXR1cm4gZmlsZU5hbWUuZW5kc1dpdGgoIi50bGQiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudCBsb2FkRG9jdW1lbnQoU3RyaW5nIGJhc2VMb2NhdGlvbiwgTm9kZSB0YWdsaWIpIHsKLQkJTm9kZSByb290ID0gdGFnbGliOwotCi0JCS8vIGNyZWF0ZSB0aGUgQ01Eb2N1bWVudAotCQlDTURvY3VtZW50SW1wbCBkb2N1bWVudCA9IG5ldyBDTURvY3VtZW50SW1wbCgpOwotCQlkb2N1bWVudC5zZXRCYXNlTG9jYXRpb24oYmFzZUxvY2F0aW9uKTsKLQotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlpZiAoX2RlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJudWxsIFwidGFnbGliXCIgZWxlbWVudCBmb3IgVExEICIgKyBiYXNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JCX0KLQotCQkvLyBwb3B1bGF0ZSB0aGUgQ01Eb2N1bWVudAotCQlOb2RlIGNoaWxkID0gcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQlpZihub2RlTmFtZS5pbmRleE9mKCc6JykgPiAwKSB7Ci0JCQkJbm9kZU5hbWUgPSBub2RlTmFtZS5zdWJzdHJpbmcobm9kZU5hbWUuaW5kZXhPZignOicpKTsKLQkJCX0KLQkJCS8vIHRhZwotCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRBRykpIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihkb2N1bWVudCwgY2hpbGQpOwotCQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50LmZFbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHRhZy1maWxlCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5UQUdfRklMRSkgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlFbGVtZW50IHRhZ0ZpbGVFbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkOwotCQkJCU5vZGUgcGF0aCA9IHRhZ0ZpbGVFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQl3aGlsZSAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCWlmIChwYXRoLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKEpTUDIwVExETmFtZXMuUEFUSC5lcXVhbHMocGF0aC5nZXROb2RlTmFtZSgpKSB8fCBKU1AyMFRMRE5hbWVzLlBBVEguZXF1YWxzKHBhdGguZ2V0TG9jYWxOYW1lKCkpKSkgewotCQkJCQkJU3RyaW5nIHBhdGhWYWx1ZSA9IGdldENvbnRhaW5lZFRleHQocGF0aCk7Ci0JCQkJCQlpZiAocGF0aFZhbHVlICE9IG51bGwgJiYgcGF0aFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwpIGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihkb2N1bWVudCwgdGFnRmlsZUVsZW1lbnQsIHBhdGhWYWx1ZSk7Ci0JCQkJCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQkJCQkJZG9jdW1lbnQuZkVsZW1lbnRzLnNldE5hbWVkSXRlbShlZC5nZXROb2RlTmFtZSgpLCBlZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXBhdGggPSBwYXRoLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gb3RoZXIgb25lLW9mLWEta2luZCBjaGlsZHJlbgotCQkJLy8gSlNQIHZlcnNpb24KLQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5KU1BWRVJTSU9OKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5KU1BfVkVSU0lPTikpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldEpzcHZlcnNpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gdGFnIGxpYnJhcnkgdmVyc2lvbgotCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRMSUJWRVJTSU9OKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UTElCX1ZFUlNJT04pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRUbGlidmVyc2lvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBzaG9ydCBuYW1lCi0JCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuU0hPUlROQU1FKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TSE9SVF9OQU1FKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0U2hvcnRuYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIFVSSS9VUk4KLQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5VUkkpIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlVSTikpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZG9jdW1lbnQuc2V0VXJpKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIGluZm8KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLklORk8pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldEluZm8oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gTmV3IEpTUCAxLjIKLQkJCS8vIGRlc2NyaXB0aW9uCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikpIHsKLQkJCQlkb2N1bWVudC5zZXREZXNjcmlwdGlvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBkaXNwbGF5IG5hbWUKLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRJU1BMQVlfTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0RGlzcGxheU5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gbGFyZ2UgaWNvbgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0TGFyZ2VJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIHNtYWxsIGljb24KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldFNtYWxsSWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyB2YWxpZGF0b3IKLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUikpIHsKLQkJCQlkb2N1bWVudC5zZXRWYWxpZGF0b3IoY3JlYXRlVmFsaWRhdG9yKGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBsaXN0ZW5lcgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTElTVEVORVIpKSB7Ci0JCQkJZG9jdW1lbnQuZ2V0TGlzdGVuZXJzKCkuYWRkKGNyZWF0ZUxpc3RlbmVyKGNoaWxkKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GVU5DVElPTikpIHsKLQkJCQlUTERGdW5jdGlvbiBmdW5jdGlvbiA9IGNyZWF0ZUZ1bmN0aW9uKGRvY3VtZW50LCBjaGlsZCk7Ci0JCQkJaWYgKGZ1bmN0aW9uICE9IG51bGwpIHsKLQkJCQkJZG9jdW1lbnQuZ2V0RnVuY3Rpb25zKCkuYWRkKGZ1bmN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5UQUdMSUJfRVhURU5TSU9OKSkgewotCQkJCWRvY3VtZW50LmdldEV4dGVuc2lvbnMoKS5hZGQoY2hpbGQpOwotCQkJfQotCi0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkVGFnWEZpbGUoZmluYWwgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkLCBJRmlsZSB0YWd4RmlsZSwgYm9vbGVhbiBhbGxvd0luY2x1ZGVzKSB7Ci0JCWVkLnNldFBhdGgodGFneEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJZWQuc2V0VGFnU291cmNlKFRMREVsZW1lbnREZWNsYXJhdGlvbi5TT1VSQ0VfVEFHX0ZJTEUpOwotCQl0cnkgewotCQkJU0FYUGFyc2VyIHBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKLQkJCUlucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHRhZ3hGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dCA9IHRhZ3hGaWxlLmdldENvbnRlbnRzKGZhbHNlKTsKLQkJCWlucHV0U291cmNlLnNldEJ5dGVTdHJlYW0oaW5wdXQpOwotCQkJcGFyc2VyLnBhcnNlKGlucHV0U291cmNlLCBuZXcgRGVmYXVsdEhhbmRsZXIoKSB7Ci0JCQkJcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZTIgPSBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSWQpOwotCQkJCQlpbnB1dFNvdXJjZTIuc2V0Qnl0ZVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLQkJCQkJcmV0dXJuIGlucHV0U291cmNlMjsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQkJaWYgKHFOYW1lLmVxdWFscyhKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHKSkgewotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpID49IDApCi0JCQkJCQkJZWQuc2V0RGlzcGxheU5hbWUoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLkRJU1BMQVlfTkFNRSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5CT0RZX0NPTlRFTlQpID49IDApCi0JCQkJCQkJZWQuc2V0Qm9keWNvbnRlbnQoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLkJPRFlfQ09OVEVOVCkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMjBUTEROYW1lcy5EWU5BTUlDX0FUVFJJQlVURVMpID49IDApCi0JCQkJCQkJZWQuc2V0RHluYW1pY0F0dHJpYnV0ZXMoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AyMFRMRE5hbWVzLkRZTkFNSUNfQVRUUklCVVRFUykpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSA+PSAwKQotCQkJCQkJCWVkLnNldFNtYWxsSWNvbihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSA+PSAwKQotCQkJCQkJCWVkLnNldExhcmdlSWNvbihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgPj0gMCkKLQkJCQkJCQllZC5zZXREZXNjcmlwdGlvbihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDIwVExETmFtZXMuRVhBTVBMRSkgPj0gMCkKLQkJCQkJCQllZC5zZXRFeGFtcGxlKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMjBUTEROYW1lcy5FWEFNUExFKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AyMFRMRE5hbWVzLlNDUklQVElOR19MQU5HVUFHRSkgPj0gMCkKLQkJCQkJCQllZC5zZXRTY3JpcHRpbmdMYW5ndWFnZShhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuU0NSSVBUSU5HX0xBTkdVQUdFKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AyMFRMRE5hbWVzLklNUE9SVCkgPj0gMCkKLQkJCQkJCQllZC5zZXRJbXBvcnQoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AyMFRMRE5hbWVzLklNUE9SVCkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMjBUTEROYW1lcy5QQUdFX0VOQ09ESU5HKSA+PSAwKQotCQkJCQkJCWVkLnNldFBhZ2VFbmNvZGluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuUEFHRV9FTkNPRElORykpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMjBUTEROYW1lcy5JU19FTF9JR05PUkVEKSA+PSAwKQotCQkJCQkJCWVkLnNldElzRUxJZ25vcmVkKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMjBUTEROYW1lcy5JU19FTF9JR05PUkVEKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocU5hbWUuZXF1YWxzKEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9BVFRSSUJVVEUpKSB7Ci0JCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBhdHRyaWJ1dGUgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoZWQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQkJCVN0cmluZyBuYW1lVmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuTkFNRSk7Ci0JCQkJCQlhdHRyaWJ1dGUuc2V0Tm9kZU5hbWUobmFtZVZhbHVlKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDIwVExETmFtZXMuRlJBR01FTlQpID49IDApCi0JCQkJCQkJYXR0cmlidXRlLnNldEZyYWdtZW50KEJvb2xlYW4udmFsdWVPZihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuRlJBR01FTlQpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AxMlRMRE5hbWVzLlJURVhQUlZBTFVFKSA+PSAwKQotCQkJCQkJCWF0dHJpYnV0ZS5zZXRSdGV4cHJ2YWx1ZShhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuUlRFWFBSVkFMVUUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDIwVExETmFtZXMuVFlQRSkgPj0gMCkKLQkJCQkJCQlhdHRyaWJ1dGUuc2V0VHlwZShhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuVFlQRSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgPj0gMCkKLQkJCQkJCQlhdHRyaWJ1dGUuc2V0RGVzY3JpcHRpb24oYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AxMlRMRE5hbWVzLlJFUVVJUkVEKSA+PSAwKQotCQkJCQkJCWF0dHJpYnV0ZS5zZXRSZXF1aXJlZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuUkVRVUlSRUQpKTsKLQkJCQkJCWlmIChuYW1lVmFsdWUgIT0gbnVsbCAmJiBuYW1lVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJZWQuZkF0dHJpYnV0ZXMuc2V0TmFtZWRJdGVtKG5hbWVWYWx1ZSwgYXR0cmlidXRlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChxTmFtZS5lcXVhbHMoSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1ZBUklBQkxFKSkgewotCQkJCQkJVExEVmFyaWFibGVJbXBsIHZhcmlhYmxlID0gbmV3IFRMRFZhcmlhYmxlSW1wbCgpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0dJVkVOKSA+PSAwKQotCQkJCQkJCXZhcmlhYmxlLnNldE5hbWVHaXZlbihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9HSVZFTikpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0ZST01fQVRUUklCVVRFKSA+PSAwKQotCQkJCQkJCXZhcmlhYmxlLnNldE5hbWVGcm9tQXR0cmlidXRlKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0ZST01fQVRUUklCVVRFKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AyMFRMRE5hbWVzLlZBUklBQkxFX0FMSUFTKSA+PSAwKQotCQkJCQkJCXZhcmlhYmxlLnNldEFsaWFzKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMjBUTEROYW1lcy5WQVJJQUJMRV9BTElBUykpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9DTEFTUykgPj0gMCkKLQkJCQkJCQl2YXJpYWJsZS5zZXRWYXJpYWJsZUNsYXNzKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9DTEFTUykpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9ERUNMQVJFKSA+PSAwKQotCQkJCQkJCXZhcmlhYmxlLnNldERlY2xhcmVTdHJpbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLlZBUklBQkxFX0RFQ0xBUkUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSkgPj0gMCkKLQkJCQkJCQl2YXJpYWJsZS5zZXRTY29wZShhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgPj0gMCkKLQkJCQkJCQl2YXJpYWJsZS5zZXREZXNjcmlwdGlvbihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pKTsKLQkJCQkJCWlmICh2YXJpYWJsZS5nZXRBbGlhcygpICE9IG51bGwgfHwgdmFyaWFibGUuZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSAhPSBudWxsIHx8IHZhcmlhYmxlLmdldE5hbWVHaXZlbigpICE9IG51bGwpIHsKLQkJCQkJCQllZC5nZXRWYXJpYWJsZXMoKS5hZGQodmFyaWFibGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHFOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSkpIHsKLQkJCQkJCUlQYXRoIGZpbGVQYXRoID0gbnVsbDsKLQkJCQkJCVN0cmluZyB0ZXh0ID0gYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSk7Ci0JCQkJCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJCQkJZmlsZVBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUobmV3IFBhdGgoKChDTURvY3VtZW50SW1wbCkgZWQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRCYXNlTG9jYXRpb24oKSksIHRleHQpOwotCQkJCQkJCUlGaWxlIGluY2x1ZGVkRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQkJCQkJaWYgKGluY2x1ZGVkRmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQlsb2FkVGFnWEZpbGUoZWQsIGluY2x1ZGVkRmlsZSwgZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJaW5wdXQuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWVkLnNldExvY2F0aW9uU3RyaW5nKHRhZ3hGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRUYWdGaWxlKENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCwgSUZpbGUgdGFnRmlsZSwgYm9vbGVhbiBhbGxvd0luY2x1ZGVzKSB7Ci0JCXRyeSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIG5ldyBNb2RlbEhhbmRsZXJGb3JKU1AoKS5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCh0YWdGaWxlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJZWQuc2V0UGF0aCh0YWdGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQllZC5zZXRUYWdTb3VyY2UoVExERWxlbWVudERlY2xhcmF0aW9uLlNPVVJDRV9UQUdfRklMRSk7Ci0JCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChkb2N1bWVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkpIHsKLQkJCQkJaWYgKGRvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gMikgewotCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9ucy5nZXQoMSkpOwotCQkJCQkJaWYgKEpTUDEyVExETmFtZXMuVEFHLmVxdWFscyhkaXJlY3RpdmVOYW1lKSkgewotCQkJCQkJCS8vIDguNS4xCi0JCQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gbnVsbDsKLQkJCQkJCQlmb3IgKGludCBpID0gMjsgaSA8IGRvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpOyBpKyspIHsKLQkJCQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQkJCVN0cmluZyB0ZXh0ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCQkJCWF0dHJOYW1lID0gdGV4dDsKLQkJCQkJCQkJfQotCQkJCQkJCQkvLyBwcm9jZXNzIHZhbHVlCi0JCQkJCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJCQkJdGV4dCA9IFN0cmluZ1V0aWxzLnN0cmlwKHRleHQpOwotCQkJCQkJCQkJaWYgKEpTUDEyVExETmFtZXMuRElTUExBWV9OQU1FLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXREaXNwbGF5TmFtZSh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuQk9EWV9DT05URU5ULmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXRCb2R5Y29udGVudCh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuRFlOQU1JQ19BVFRSSUJVVEVTLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXREeW5hbWljQXR0cmlidXRlcyh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuU01BTExfSUNPTi5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0U21hbGxJY29uKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXRMYXJnZUljb24odGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXREZXNjcmlwdGlvbih0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuRVhBTVBMRS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0RXhhbXBsZSh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuU0NSSVBUSU5HX0xBTkdVQUdFLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXRTY3JpcHRpbmdMYW5ndWFnZSh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuSU1QT1JULmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXRJbXBvcnQodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLlBBR0VfRU5DT0RJTkcuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWVkLnNldFBhZ2VFbmNvZGluZyh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuSVNfRUxfSUdOT1JFRC5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0SXNFTElnbm9yZWQodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLkFUVFJJQlVURS5lcXVhbHMoZGlyZWN0aXZlTmFtZSkpIHsKLQkJCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBhdHRyaWJ1dGUgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoZWQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQkJCQkvLyA4LjUuMgotCQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IG51bGw7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDI7IGkgPCBkb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKTsgaSsrKSB7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJCQlTdHJpbmcgdGV4dCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQkJCQlhdHRyTmFtZSA9IHRleHQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gcHJvY2VzcyB2YWx1ZQotCQkJCQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJCQkJCQkJdGV4dCA9IFN0cmluZ1V0aWxzLnN0cmlwKHRleHQpOwotCQkJCQkJCQkJaWYgKEpTUDEyVExETmFtZXMuTkFNRS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJYXR0cmlidXRlLnNldE5vZGVOYW1lKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMjBUTEROYW1lcy5GUkFHTUVOVC5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJYXR0cmlidXRlLnNldEZyYWdtZW50KEJvb2xlYW4udmFsdWVPZih0ZXh0KS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLlJURVhQUlZBTFVFLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQlhdHRyaWJ1dGUuc2V0UnRleHBydmFsdWUodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLlRZUEUuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWF0dHJpYnV0ZS5zZXRUeXBlKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTi5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJYXR0cmlidXRlLnNldERlc2NyaXB0aW9uKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5SRVFVSVJFRC5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJYXR0cmlidXRlLnNldFJlcXVpcmVkU3RyaW5nKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWVkLmZBdHRyaWJ1dGVzLnNldE5hbWVkSXRlbShhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKSwgYXR0cmlidXRlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLlZBUklBQkxFLmVxdWFscyhkaXJlY3RpdmVOYW1lKSkgewotCQkJCQkJCVRMRFZhcmlhYmxlSW1wbCB2YXJpYWJsZSA9IG5ldyBUTERWYXJpYWJsZUltcGwoKTsKLQkJCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBudWxsOwotCQkJCQkJCWZvciAoaW50IGkgPSAyOyBpIDwgZG9jdW1lbnRSZWdpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCk7IGkrKykgewotCQkJCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJCQkJU3RyaW5nIHRleHQgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJCQkJYXR0ck5hbWUgPSB0ZXh0OwotCQkJCQkJCQl9Ci0JCQkJCQkJCS8vIHByb2Nlc3MgdmFsdWUKLQkJCQkJCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFICYmIGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJCXRleHQgPSBTdHJpbmdVdGlscy5zdHJpcCh0ZXh0KTsKLQkJCQkJCQkJCWlmIChKU1AxMlRMRE5hbWVzLlZBUklBQkxFX05BTUVfR0lWRU4uZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCXZhcmlhYmxlLnNldE5hbWVHaXZlbih0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9GUk9NX0FUVFJJQlVURS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJdmFyaWFibGUuc2V0TmFtZUZyb21BdHRyaWJ1dGUodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLlZBUklBQkxFX0FMSUFTLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQl2YXJpYWJsZS5zZXRBbGlhcyh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfQ0xBU1MuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCXZhcmlhYmxlLnNldFZhcmlhYmxlQ2xhc3ModGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLlZBUklBQkxFX0RFQ0xBUkUuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCXZhcmlhYmxlLnNldERlY2xhcmVTdHJpbmcodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCXZhcmlhYmxlLnNldFNjb3BlKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTi5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJdmFyaWFibGUuc2V0RGVzY3JpcHRpb24odGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHZhcmlhYmxlLmdldEFsaWFzKCkgIT0gbnVsbCB8fCB2YXJpYWJsZS5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpICE9IG51bGwgfHwgdmFyaWFibGUuZ2V0TmFtZUdpdmVuKCkgIT0gbnVsbCkgewotCQkJCQkJCQllZC5nZXRWYXJpYWJsZXMoKS5hZGQodmFyaWFibGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKCJpbmNsdWRlIi5lcXVhbHMoZGlyZWN0aXZlTmFtZSkgJiYgYWxsb3dJbmNsdWRlcykgewotCQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IG51bGw7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDI7IGkgPCBkb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKTsgaSsrKSB7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJCQlTdHJpbmcgdGV4dCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQkJCQlhdHRyTmFtZSA9IHRleHQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gcHJvY2VzcyB2YWx1ZQotCQkJCQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJCQkJCQkJdGV4dCA9IFN0cmluZ1V0aWxzLnN0cmlwKHRleHQpOwotCQkJCQkJCQkJaWYgKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQlJUGF0aCBmaWxlUGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShuZXcgUGF0aCgoKENNRG9jdW1lbnRJbXBsKSBlZC5nZXRPd25lckRvY3VtZW50KCkpLmdldEJhc2VMb2NhdGlvbigpKSwgdGV4dCk7Ci0KLQkJCQkJCQkJCQlJRmlsZSBpbmNsdWRlZEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQkJCQkJCQkJCWlmIChpbmNsdWRlZEZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJCQkJbG9hZFRhZ0ZpbGUoZWQsIGluY2x1ZGVkRmlsZSwgZmFsc2UpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gcGFyc2luZyAiICsgdGFnRmlsZSwgZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvYmxlbSBwYXJzaW5nICIgKyB0YWdGaWxlLCBlKTsKLQkJfQotCQllZC5zZXRMb2NhdGlvblN0cmluZyh0YWdGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KElUYWdsaWJSZWNvcmQgcmVmZXJlbmNlKSB7Ci0JCUNNRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbnVsbDsKLQkJc3dpdGNoIChyZWZlcmVuY2UuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJSVRMRFJlY29yZCByZWNvcmQgPSAoSVRMRFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCUlSZXNvdXJjZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlY29yZC5nZXRQYXRoKCkpOwotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlkb2N1bWVudCA9IChDTURvY3VtZW50SW1wbCkgYnVpbGRDTURvY3VtZW50RnJvbUZpbGUoZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJCQlkb2N1bWVudC5zZXRMb2NhdGlvblN0cmluZyhyZWNvcmQuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoX2RlYnVnICYmIGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZhaWx1cmUgcGFyc2luZyAiICsgcmVjb3JkLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCWlmIChkb2N1bWVudC5nZXRTbWFsbEljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRTbWFsbEljb24oKSwgZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuU01BTExfSUNPTiwgImZpbGU6IiArIGljb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChkb2N1bWVudC5nZXRMYXJnZUljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRMYXJnZUljb24oKSwgZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTiwgImZpbGU6IiArIGljb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCUlKYXJSZWNvcmQgcmVjb3JkID0gKElKYXJSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlkb2N1bWVudCA9IChDTURvY3VtZW50SW1wbCkgYnVpbGRDTURvY3VtZW50RnJvbUphcihyZWNvcmQuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQlkb2N1bWVudC5zZXRMb2NhdGlvblN0cmluZygiamFyOmZpbGU6IiArIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiIS9NRVRBLUlORi90YWdsaWIudGxkIik7Ci0JCQkJaWYgKGRvY3VtZW50LmdldFNtYWxsSWNvbigpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0U21hbGxJY29uKCksIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiIS9NRVRBLUlORi8iLCAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OLCAiamFyOmZpbGU6IiArIGljb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoZG9jdW1lbnQuZ2V0TGFyZ2VJY29uKCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRMYXJnZUljb24oKSwgcmVjb3JkLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIhL01FVEEtSU5GLyIsICIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlkb2N1bWVudC5zZXRQcm9wZXJ0eShKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04sICJqYXI6ZmlsZToiICsgaWNvblBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZhaWx1cmUgcGFyc2luZyAiICsgcmVjb3JkLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UQUdESVIpIDogewotCQkJCUlUYWdEaXJSZWNvcmQgcmVjb3JkID0gKElUYWdEaXJSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlkb2N1bWVudCA9IGJ1aWxkQ01Eb2N1bWVudEZyb21Gb2xkZXIocmVjb3JkLmdldFBhdGgoKSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCUlucHV0U3RyZWFtIHVybENvbnRlbnRzID0gbnVsbDsKLQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbm5lY3Rpb24gPSByZWNvcmQuZ2V0VVJMKCkub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJCQkJY29ubmVjdGlvbi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQkJCQkJdXJsQ29udGVudHMgPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCQlkb2N1bWVudCA9IChDTURvY3VtZW50SW1wbCkgYnVpbGRDTURvY3VtZW50KHJlY29yZC5nZXRCYXNlTG9jYXRpb24oKSwgdXJsQ29udGVudHMpOwotCQkJCQkJZG9jdW1lbnQuc2V0TG9jYXRpb25TdHJpbmcocmVjb3JkLmdldFVSTCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJaWYgKGRvY3VtZW50LmdldFNtYWxsSWNvbigpICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRTbWFsbEljb24oKSwgcmVjb3JkLmdldFVSTCgpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlkb2N1bWVudC5zZXRQcm9wZXJ0eShKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04sIGljb25QYXRoKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChkb2N1bWVudC5nZXRMYXJnZUljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0TGFyZ2VJY29uKCksIHJlY29yZC5nZXRVUkwoKS50b1N0cmluZygpLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OLCBpY29uUGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90IHVuY29tbW9uIGdpdmVuIGludmFsaWQgVVJMcwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKHVybENvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdXJsQ29udGVudHMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNjY4NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb24uQW5ub3RhdGlvbkZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZVBhcnNlcjsKLQotcHVibGljIGNsYXNzIENNRG9jdW1lbnRJbXBsIGltcGxlbWVudHMgVExERG9jdW1lbnQgewotCQotCS8qKiBDb250YWlucyB0YWdpbmZvIGFuZC9vciBhbnkgb3RoZXIgbWlzYyBwcm9wZXJ0aWVzKi8KLQlwcml2YXRlIEFubm90YXRpb25NYXAgZkFubm90YXRpb25NYXAgPSBudWxsOwotCQotCXByaXZhdGUgTWFwIGZQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoMCk7Ci0KLQkvKioKLQkgKiBSZWNvcmRzIGZyb20gd2hlcmUgdGhpcyBkb2N1bWVudCB3YXMgY3JlYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZCYXNlTG9jYXRpb247Ci0JLyoqIAotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb247Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlOYW1lOwotCi0JLyoqCi0JICogTk9UIHB1YmxpYyBBUEkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGZFbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCXByaXZhdGUgTGlzdCBmRnVuY3Rpb25zID0gbmV3IEFycmF5TGlzdCgwKTsKLQkKLQkvLyBpZCBvZiB0aGUgdGFnbGliCi0JcHJpdmF0ZSBTdHJpbmcgZklkID0gbnVsbDsKLQkvKioKLQkgKiBDaGlsZHJlbiBvZiAidGFnbGliIiB3aXRoaW4gYSAudGxkIGZpbGUgZWFjaCBhbGxvdwotCSAqIG9uZSBUZXh0IG5vZGUgKCNQQ0RBVEEpIGJlbmVhdGggdGhlbS4gIFN0b3JlIHRoZSB2YWx1ZXMKLQkgKiBoZXJlIGZvciBzaW1wbGljaXR5LgotCSAqLwotCS8vIFRoZSBKU1Agc3BlY2lmaWNhdGlvbiByZXF1aXJlZCBmb3IgdGhpcyB0YWdsaWIgdG8gZnVuY3Rpb24KLQlwcml2YXRlIFN0cmluZyBmSlNQVmVyc2lvbiA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZkxhcmdlSWNvbjsKLQotCXByaXZhdGUgTGlzdCBmTGlzdGVuZXJzOwotCQotCXByaXZhdGUgU3RyaW5nIGZQYXJlbnRVUkkgPSBudWxsOwotCS8vIEEgc2hvcnQgbmFtZSBzdWdnZXN0ZWQgYXMgdGhlIGRlZmF1bHQgcHJlZml4IGZvciB0YWdzIHdpdGhpbiB0aGUgbGliCi0JcHJpdmF0ZSBTdHJpbmcgZlNob3J0TmFtZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZlNtYWxsSWNvbjsKLQkKLQkvKioKLQkgKiBzaW5jZSBKU1AgMi4wCi0JICogCi0JICogVGhlIGVudGlyZSBlbGVtZW50IGlzIHN0b3JlZCBoZXJlIHNpbmNlIGl0cyBsYXlvdXQgaXMgdW5kZWZpbmVkIAotCSAqLwotCXByaXZhdGUgTGlzdCBmVGFnbGliRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCi0JLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhZ2xpYiBpdHNlbGYKLQlwcml2YXRlIFN0cmluZyBmVExpYlZlcnNpb24gPSBudWxsOwotCQotCS8vIEEgdW5pcXVlIHB1YmxpYyBVUkkgZGVzY3JpYmluZyB0aGlzIHRhZ2xpYi4gIFJlY29tbWVuZGVkIHRvIGJlIHRoZSBVUkwKLQkvLyB0byB0aGUgZGVzY3JpcHRvcgotCXByaXZhdGUgU3RyaW5nIGZVUkkgPSBudWxsOwotCQotCXByaXZhdGUgU3RyaW5nIGZMb2NhdGlvblN0cmluZzsKLQotCXByb3RlY3RlZCBUTERWYWxpZGF0b3IgdmFsaWRhdG9yOwotCQotCS8qKgotCSAqIENNRG9jdW1lbnRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYW5ub3RhdGlvbiBtYXAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuICBMYXppbHkgY3JlYXRlcwotCSAqIGFuZCBsb2FkcyBhbm5vdGF0aW9uIG1hcC4KLQkgKiBAcmV0dXJuIEFubm90YXRpb25NYXAKLQkgKi8KLQlwcml2YXRlIEFubm90YXRpb25NYXAgZ2V0QW5ub3RhdGlvbk1hcCgpIHsKLQkJLy8gY3JlYXRlIGEgbmV3IGFubm90YXRpb24gbWFwIGFuZCBsb2FkIGl0IHVwCi0JCWlmIChmQW5ub3RhdGlvbk1hcCA9PSBudWxsKSB7Ci0JCQlmQW5ub3RhdGlvbk1hcCA9IG5ldyBBbm5vdGF0aW9uTWFwKCk7Ci0JCQkKLQkJCUxpc3QgYW5ub3RhdGlvbkZpbGVzID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEFubm90YXRpb25GaWxlc0luZm9zKGdldFVyaSgpKTsKLQkJICAgIGZvciAoSXRlcmF0b3IgaSA9IGFubm90YXRpb25GaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJICAgIAl0cnkgewotCQkgICAgCQlBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8gPSAoQW5ub3RhdGlvbkZpbGVJbmZvKSBpLm5leHQoKTsKLQkJICAgIAkJQW5ub3RhdGlvbkZpbGVQYXJzZXIgcGFyc2VyID0gbmV3IEFubm90YXRpb25GaWxlUGFyc2VyKCk7Ci0JCSAgICAJCXBhcnNlci5wYXJzZShmQW5ub3RhdGlvbk1hcCwgZmlsZUluZm8pOwotCQkgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCSAgICAgICAgCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJFeGNlcHRpb24gdGhyb3duIGluIENNRG9jdW1lbnRJbXBsI2dldEFubm90YXRpb25NYXAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gZkFubm90YXRpb25NYXA7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFzZUxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gZkJhc2VMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXlOYW1lLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBmRGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudHMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBmRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW50aXRpZXMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBFbnRpdHlEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldEV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBmVGFnbGliRXh0ZW5zaW9uczsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmdW5jdGlvbnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RnVuY3Rpb25zKCkgewotCQlyZXR1cm4gZkZ1bmN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpZC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZklkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc3B2ZXJzaW9uKCkgewotCQlyZXR1cm4gZkpTUFZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKCkgewotCQlyZXR1cm4gZkxhcmdlSWNvbjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChmTGlzdGVuZXJzID09IG51bGwpCi0JCQlmTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gZkxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lc3BhY2UgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NtZG9jdW1lbnQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyZW50VVJJLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50VVJJKCkgewotCQlyZXR1cm4gZlBhcmVudFVSSTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVExERG9jdW1lbnQuQ01fS0lORCkpIHsKLQkJCXJldHVybiBUTEREb2N1bWVudC5KU1BfVExEOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImFubm90YXRpb25NYXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbk1hcCgpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0bmFtZSgpIHsKLQkJcmV0dXJuIGZTaG9ydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc21hbGxJY29uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgewotCQlyZXR1cm4gZlNtYWxsSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRsaWJ2ZXJzaW9uKCkgewotCQlyZXR1cm4gZlRMaWJWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotCQlyZXR1cm4gZlVSSTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgVExERG9jdW1lbnQjZ2V0VmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgVExEVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbiBUaGUgYmFzZUxvY2F0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlTG9jYXRpb24oU3RyaW5nIGJhc2VMb2NhdGlvbikgewotCQlmQmFzZUxvY2F0aW9uID0gYmFzZUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogQHBhcmFtIGRpc3BsYXlOYW1lIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLQkJdGhpcy5mRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpZC4KLQkgKiBAcGFyYW0gaWQgVGhlIGlkIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmZJZCA9IGlkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdJbmZvIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmZvKFN0cmluZyBuZXdJbmZvKSB7Ci0JCXNldERlc2NyaXB0aW9uKG5ld0luZm8pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdKc3B2ZXJzaW9uIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKc3B2ZXJzaW9uKFN0cmluZyBuZXdKc3B2ZXJzaW9uKSB7Ci0JCWZKU1BWZXJzaW9uID0gbmV3SnNwdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXJnZUljb24uCi0JICogQHBhcmFtIGxhcmdlSWNvbiBUaGUgbGFyZ2VJY29uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgbGFyZ2VJY29uKSB7Ci0JCXRoaXMuZkxhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcnMoTGlzdCBsaXN0ZW5lcnMpIHsKLQkJdGhpcy5mTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50VVJJIFRoZSBwYXJlbnRVUkkgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudFVSSShTdHJpbmcgcGFyZW50VVJJKSB7Ci0JCWZQYXJlbnRVUkkgPSBwYXJlbnRVUkk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWZQcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdTaG9ydG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3J0bmFtZShTdHJpbmcgbmV3U2hvcnRuYW1lKSB7Ci0JCWZTaG9ydE5hbWUgPSBuZXdTaG9ydG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc21hbGxJY29uLgotCSAqIEBwYXJhbSBzbWFsbEljb24gVGhlIHNtYWxsSWNvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHNtYWxsSWNvbikgewotCQl0aGlzLmZTbWFsbEljb24gPSBzbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1RsaWJ2ZXJzaW9uIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUbGlidmVyc2lvbihTdHJpbmcgbmV3VGxpYnZlcnNpb24pIHsKLQkJZlRMaWJWZXJzaW9uID0gbmV3VGxpYnZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1VyaSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJZlVSSSA9IG5ld1VyaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVExEVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChUTEREb2N1bWVudC5DTV9LSU5ELmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8ICJhbm5vdGF0aW9uTWFwIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmUHJvcGVydGllcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgc2hvcnQgbmFtZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFNob3J0bmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkaXNwbGF5IG5hbWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXREaXNwbGF5TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkZXNjcmlwdGlvbiAoaW5mbyk6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXREZXNjcmlwdGlvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBVUkk6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRVcmkoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQganNwIHZlcnNpb246IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRKc3B2ZXJzaW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHRhZ2xpYiB2ZXJzaW9uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGxpYnZlcnNpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgc21hbGwgaWNvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFNtYWxsSWNvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBsYXJnZSBpY29uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TGFyZ2VJY29uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZ2V0VmFsaWRhdG9yKCkgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdmFsaWRhdG9yOiIgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGdldFZhbGlkYXRvcigpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbGlzdGVuZXJzOiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TGlzdGVuZXJzKCkuc2l6ZSgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuIiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0TGlzdGVuZXJzKCkuZ2V0KGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBlbGVtZW50czoiKTsgLy8kTk9OLU5MUy0xJAotCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IGdldEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChTdHJpbmdVdGlscy5yZXBsYWNlKGVsZW1lbnRzLml0ZW0oaSkudG9TdHJpbmcoKSwgIlxuIiwgIlxuXHRcdCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBmTG9jYXRpb25TdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25TdHJpbmcoU3RyaW5nIHVybCkgewotCQlmTG9jYXRpb25TdHJpbmcgPSB1cmw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQwMTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLQotcHVibGljIGNsYXNzIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBpbXBsZW1lbnRzIFRMREVsZW1lbnREZWNsYXJhdGlvbiB7Ci0KLQkvLyBvcHRpb25hbCBhdHRyaWJ1dGVzCi0JQ01OYW1lZE5vZGVNYXBJbXBsIGZBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCS8vIChlbXB0eXxKU1B8dGFnZGVwZW5kYW50fHNjcmlwdGxlc3MpIC0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIEpTUAotCXByaXZhdGUgU3RyaW5nIGJvZHljb250ZW50ID0gSlNQMTFUTEROYW1lcy5DT05URU5UX0pTUDsKLQotCS8qKgotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKiAKLQkgKiBVc2FnZSBpbmZvcm1hdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lOwotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZPd25lckRvY3VtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlBhdGggPSBudWxsOwotCi0JcHJpdmF0ZSBMaXN0IGZUYWdFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgwKTsKLQkvKioKLQkgKiBzaW5jZSBKU1AgMS4yCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbGFyZ2VJY29uOwotCi0KLQlwcml2YXRlIGludCBtYXhPY2N1ciA9IC0xOwotCXByaXZhdGUgaW50IG1pbk9jY3VyID0gMDsKLQotCS8vIHJlcXVpcmVkIHRhZyBuYW1lCi0JcHJpdmF0ZSBTdHJpbmcgbm9kZU5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHNtYWxsSWNvbjsKLQotCS8vIHRhZyBoYW5kbGVyIGNsYXNzIC0gcmVxdWlyZWQKLQlwcml2YXRlIFN0cmluZyB0YWdjbGFzcyA9IG51bGw7Ci0KLQkvLyB0YWcgZXh0cmEgaW5mbyBjbGFzcyAoc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AuVGFnRXh0cmFJbmZvKSAtCi0JLy8gb3B0aW9uYWwKLQlwcml2YXRlIFN0cmluZyB0ZWljbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBzaW5jZSBKU1AgMS4yCi0JICovCi0JcHJpdmF0ZSBMaXN0IHZhcmlhYmxlczsKLQotCS8qKgotCSAqIHNpbmNlIEpTUCAyLjAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmRXhhbXBsZTsKLQlwcml2YXRlIFN0cmluZyBmSW1wb3J0OwotCXByaXZhdGUgU3RyaW5nIGZTY3JpcHRpbmdMYW5ndWFnZTsKLQlwcml2YXRlIFN0cmluZyBmRHluYW1pY0F0dHJpYnV0ZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZklzRUxJZ25vcmVkOwotCXByaXZhdGUgU3RyaW5nIGZQYWdlRW5jb2Rpbmc7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRhZ1NvdXJjZTsKLQotCXByaXZhdGUgU3RyaW5nIGZMb2NhdGlvblN0cmluZzsKLQlwcml2YXRlIFN0cmluZyBzbWFsbEljb25VUkw7Ci0KLQkvKioKLQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKENNRG9jdW1lbnQgb3duZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyRG9jdW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKiAKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEF0dHJpYnV0ZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmQXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvZHljb250ZW50KCkgewotCQlyZXR1cm4gYm9keWNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q01Db250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Db250ZW50Ci0JICogCi0JICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuIFRoaXMgY2FuIGJlIGFuCi0JICogQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb250ZW50VHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIAotCSAqIFJldHVybnMgb25lIG9mIDogQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGdldEJvZHljb250ZW50KCkuZXF1YWxzKEpTUDExVExETmFtZXMuQ09OVEVOVF9FTVBUWSkpCi0JCQlyZXR1cm4gRU1QVFk7Ci0JCWlmIChnZXRCb2R5Y29udGVudCgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKSkKLQkJCXJldHVybiBQQ0RBVEE7Ci0JCWVsc2UKLQkJCS8vIEpTUAotCQkJcmV0dXJuIEFOWTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIG5ldyBDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXhhbXBsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBmRXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVuc2lvbnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGZUYWdFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKCkgewotCQlyZXR1cm4gbGFyZ2VJY29uOwotCX0KLQotCS8qKgotCSAqIGdldExvY2FsRWxlbWVudHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqIAotCSAqIFJldHVybnMgYSBsaXN0IG9mIGxvY2FsbHkgZGVmaW5lZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIG1heE9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogSWYgMCwgaXQncyBPUFRJT05BTC4gSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gbWluT2NjdXI7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG5vZGVOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZPd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBmUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKiAKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY3JpYmVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKCJ0YWdJbmZvIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0VGFnSW5mbygpOyAvLyByZXR1cm4gdGFnIGluZm8KLQkJCS8vIGJ1Zzg4MzM2IG5vIG5lZWQgdG8gcmVzdG9yZSBtYXJrZXJzCi0JCQkvLyByZXR1cm4gU3RyaW5nVXRpbHMucmVzdG9yZU1hcmtlcnMoZ2V0VGFnSW5mbygpKTsgLy8gcmV0dXJuIHRhZwotCQkJLy8gZGVzY3JpcHRpb24KLQkJfQotCQkvLyBCdWcgMTU1ODAwCi0JCWVsc2UgaWYgKCJuYW1lIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCQllbHNlIGlmICgiZGVzY3JpcHRpb24iLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJLy8gYnVnODgzMzYgbm8gbmVlZCB0byByZXN0b3JlIG1hcmtlcnMKLQkJCS8vIHJldHVybiBTdHJpbmdVdGlscy5yZXN0b3JlTWFya2VycyhnZXREZXNjcmlwdGlvbigpKTsgLy8gcmV0dXJuCi0JCQkvLyB0YWcgZGVzY3JpcHRpb24KLQkJfQotCQllbHNlIGlmIChUTEREb2N1bWVudC5DTV9LSU5ELmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gVExERG9jdW1lbnQuSlNQX1RMRDsKLQkJfQotCQllbHNlIGlmIChUTERFbGVtZW50RGVjbGFyYXRpb24uVEFHX1NPVVJDRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIChmVGFnU291cmNlICE9IG51bGwgPyBmVGFnU291cmNlIDpUTERFbGVtZW50RGVjbGFyYXRpb24uU09VUkNFX0pTUF9UTEQpOwotCQl9Ci0JCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuU01BTExfSUNPTi5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCWlmIChzbWFsbEljb25VUkwgIT0gbnVsbCkgewotCQkJCXJldHVybiBzbWFsbEljb25VUkw7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0T3duZXJEb2N1bWVudCgpLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc21hbGxJY29uLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgewotCQlyZXR1cm4gc21hbGxJY29uOwotCX0KLQotCVN0cmluZyBnZXRTbWFsbEljb25VUkwoKSB7Ci0JCXJldHVybiBzbWFsbEljb25VUkw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgWFBhdGggb2YgdGhpcyBlbGVtZW50IChjdXJyZW50bHkganVzdCByZXR1cm5zIHRoZSBub2RlCi0JICogbmFtZSkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3BlYygpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdjbGFzcygpIHsKLQkJcmV0dXJuIHRhZ2NsYXNzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGFnaW5mbyBmb3IgdGhpcyBjdXJyZW50IGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0YWdpbmZvIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRUYWdJbmZvKCkgewotCQlpZiAoZ2V0T3duZXJEb2N1bWVudCgpLnN1cHBvcnRzKCJhbm5vdGF0aW9uTWFwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJQW5ub3RhdGlvbk1hcCBtYXAgPSAoQW5ub3RhdGlvbk1hcCkgZ2V0T3duZXJEb2N1bWVudCgpLmdldFByb3BlcnR5KCJhbm5vdGF0aW9uTWFwIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBzcGVjID0gZ2V0U3BlYygpOwotCQkJU3RyaW5nIHJlc3VsdCA9IG1hcC5nZXRQcm9wZXJ0eShzcGVjLCAidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVzdWx0OwotCQkJLy8gYnVnODgzMzYgbm8gbmVlZCB0byByZXN0b3JlIG1hcmtlcnMKLQkJCS8vIHJldHVybiBTdHJpbmdVdGlscy5yZXN0b3JlTWFya2VycyhyZXN1bHQpOyAvLyByZXR1cm4gdGFnIGluZm8KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRlaWNsYXNzKCkgewotCQlyZXR1cm4gdGVpY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFyaWFibGVzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRWYXJpYWJsZXMoKSB7Ci0JCWlmICh2YXJpYWJsZXMgPT0gbnVsbCkgewotCQkJdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB2YXJpYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0JvZHljb250ZW50Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9keWNvbnRlbnQoU3RyaW5nIG5ld0JvZHljb250ZW50KSB7Ci0JCWJvZHljb250ZW50ID0gbmV3Qm9keWNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNwbGF5TmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLQkJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBleGFtcGxlCi0JICogICAgICAgICAgICBUaGUgZXhhbXBsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhhbXBsZShTdHJpbmcgZXhhbXBsZSkgewotCQlmRXhhbXBsZSA9IGV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIAotCSAqIEBwYXJhbSBsYXJnZUljb24KLQkgKiAgICAgICAgICAgIFRoZSBsYXJnZUljb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBsYXJnZUljb24pIHsKLQkJdGhpcy5sYXJnZUljb24gPSBsYXJnZUljb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZU5hbWUoU3RyaW5nIHN0cmluZykgewotCQlub2RlTmFtZSA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGggdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJZlBhdGggPSBwYXRoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNtYWxsSWNvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc21hbGxJY29uCi0JICogICAgICAgICAgICBUaGUgc21hbGxJY29uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgc21hbGxJY29uKSB7Ci0JCXRoaXMuc21hbGxJY29uID0gc21hbGxJY29uOwotCX0KLQotCXZvaWQgc2V0U21hbGxJY29uVVJMKFN0cmluZyB1cmwpIHsKLQkJc21hbGxJY29uVVJMID0gdXJsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYWdjbGFzcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ2NsYXNzKFN0cmluZyBuZXdUYWdjbGFzcykgewotCQl0YWdjbGFzcyA9IG5ld1RhZ2NsYXNzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYWdjbGFzcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ1NvdXJjZShTdHJpbmcgc291cmNlS2luZCkgewotCQlmVGFnU291cmNlID0gc291cmNlS2luZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGVpY2xhc3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZWljbGFzcyhTdHJpbmcgbmV3VGVpY2xhc3MpIHsKLQkJdGVpY2xhc3MgPSBuZXdUZWljbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YXJpYWJsZXMuCi0JICogCi0JICogQHBhcmFtIHZhcmlhYmxlcwotCSAqICAgICAgICAgICAgVGhlIHZhcmlhYmxlcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZXMoTGlzdCB2YXJpYWJsZXMpIHsKLQkJdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUgPT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJ0YWdJbmZvIikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFRMRERvY3VtZW50LkNNX0tJTkQpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhUTERFbGVtZW50RGVjbGFyYXRpb24uVEFHX1NPVVJDRSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCAiICsgc3VwZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Tm9kZU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdGFnIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGFnY2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdGVpIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGVpY2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgYm9keSBjb250ZW50OiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Qm9keWNvbnRlbnQoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGVzY3JpcHRpb24gKGluZm8pOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RGVzY3JpcHRpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgYXR0cmlidXRlczoiKTsgLy8kTk9OLU5MUy0xJAotCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdFx0IiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoYXR0cmlidXRlcy5pdGVtKGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB2YXJpYWJsZXM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRWYXJpYWJsZXMoKS5zaXplKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdFx0IiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0VmFyaWFibGVzKCkuZ2V0KGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0KCkgewotCQlyZXR1cm4gZkltcG9ydDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjcmlwdGluZ0xhbmd1YWdlKCkgewotCQlyZXR1cm4gZlNjcmlwdGluZ0xhbmd1YWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHluYW1pY0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmRHluYW1pY0F0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wb3J0KFN0cmluZyBpbXBvcnQxKSB7Ci0JCWZJbXBvcnQgPSBpbXBvcnQxOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjcmlwdGluZ0xhbmd1YWdlKFN0cmluZyBzY3JpcHRpbmdMYW5ndWFnZSkgewotCQlmU2NyaXB0aW5nTGFuZ3VhZ2UgPSBzY3JpcHRpbmdMYW5ndWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREeW5hbWljQXR0cmlidXRlcyhTdHJpbmcgZHluYW1pY0F0dHJpYnV0ZXMpIHsKLQkJZkR5bmFtaWNBdHRyaWJ1dGVzID0gZHluYW1pY0F0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJc0VMSWdub3JlZCgpIHsKLQkJcmV0dXJuIGZJc0VMSWdub3JlZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VFbmNvZGluZygpIHsKLQkJcmV0dXJuIGZQYWdlRW5jb2Rpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNFTElnbm9yZWQoU3RyaW5nIGlzRUxJZ25vcmVkKSB7Ci0JCWZJc0VMSWdub3JlZCA9IGlzRUxJZ25vcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhZ2VFbmNvZGluZyhTdHJpbmcgcGFnZUVuY29kaW5nKSB7Ci0JCWZQYWdlRW5jb2RpbmcgPSBwYWdlRW5jb2Rpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblN0cmluZygpIHsKLQkJaWYgKGZMb2NhdGlvblN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuICgoQ01Eb2N1bWVudEltcGwpIGZPd25lckRvY3VtZW50KS5nZXRMb2NhdGlvblN0cmluZygpOwotCQlyZXR1cm4gZkxvY2F0aW9uU3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uU3RyaW5nKFN0cmluZyB1cmwpIHsKLQkJZkxvY2F0aW9uU3RyaW5nID0gdXJsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmMzc4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ01OYW1lZE5vZGVNYXBJbXBsIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0JcHVibGljIHN0YXRpYyBDTU5hbWVkTm9kZU1hcEltcGwgRU1QVFlfTkFNRURfTk9ERV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCS8qKgotCSAqIENNTmFtZWROb2RlTWFwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JSGFzaHRhYmxlIGdldEhhc2h0YWJsZSgpIHsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGFibGUuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKENNTm9kZSkgdGFibGUuZ2V0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaW50IHNpemUgPSB0YWJsZS5zaXplKCk7Ci0JCWlmIChpbmRleCA8IHNpemUpIHsKLQkJCUl0ZXJhdG9yIHZhbHVlcyA9IGl0ZXJhdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8PSBpbmRleDsgaSsrKSB7Ci0JCQkJcmVzdWx0ID0gdmFsdWVzLm5leHQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKENNTm9kZSkgcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIEByZXR1cm4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGFOb2RlIENNTm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVkSXRlbShTdHJpbmcgbmFtZSwgQ01Ob2RlIGFOb2RlKSB7Ci0JCWlmIChuYW1lICE9IG51bGwgJiYgYU5vZGUgIT0gbnVsbCkKLQkJCXRhYmxlLnB1dChuYW1lLCBhTm9kZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Ob2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4YzYxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDTU5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIENNTm9kZUxpc3QgewotCXN0YXRpYyBDTU5vZGVMaXN0SW1wbCBFTVBUWV9OT0RFX0xJU1QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotCXB1YmxpYyBDTU5vZGVMaXN0SW1wbCgpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0KCkpOwotCX0KLQotCXB1YmxpYyBDTU5vZGVMaXN0SW1wbChMaXN0IGxpc3QpIHsKLQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmRJdGVtKENNTm9kZSBub2RlKSB7Ci0JCWxpc3QuYWRkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TGlzdCgpIHsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ01Ob2RlKSBsaXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERDTURvY3VtZW50TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRENNRG9jdW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTJhNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRENNRG9jdW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMjBUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLlByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZhY2V0TW9kdWxlQ29yZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmlsZUNvbnRlbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5aZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSUphclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUTERSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnRGlyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYkluZGV4RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliSW5kZXhMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVVJMUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFRMRENNRG9jdW1lbnRNYW5hZ2VyIGltcGxlbWVudHMgSVRhZ2xpYkluZGV4TGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIGNsYXNzIERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uIHsKLQkJLyoqCi0JCSAqIEFkZHMgYSBibG9jayB0YWduYW1lIChmdWxseSBuYW1lc3BhY2UgcXVhbGlmaWVkKSBpbnRvIHRoZSBsaXN0IG9mCi0JCSAqIGJsb2NrIHRhZyBuYW1lcyBmb3IgdGhlIHBhcnNlci4gVGhlIG1hcmtlcgotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFsb25nIHdpdGggcG9zaXRpb24gY3VlcyBkdXJpbmcgcmVwYXJzZXMKLQkJICogYWxsb3cgdGhlIEpTUFNvdXJjZVBhcnNlciB0byBlbmFibGUvaWdub3JlIHRoZSB0YWdzIGFzIGJsb2Nrcy4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGFkZEJsb2NrVGFnKFN0cmluZyB0YWduYW1lTlMsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBtYXJrZXIpIHsKLQkJCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmIChnZXRQYXJzZXIoKS5nZXRCbG9ja01hcmtlcih0YWduYW1lTlMpID09IG51bGwpIHsKLQkJCQlnZXRQYXJzZXIoKS5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIodGFnbmFtZU5TLCBtYXJrZXIsIERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgYWRkZWQgYmxvY2sgbWFya2VyOiAiICsgdGFnbmFtZU5TICsgIkAiICsgbWFya2VyLmdldFN0YXJ0T2Zmc2V0KCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYlRyYWNrZXIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIENNRG9jdW1lbnQgdGxkQ01Eb2N1bWVudCkgewotCQkJZ2V0VGFnbGliVHJhY2tlcnMoKS5hZGQobmV3IFRhZ2xpYlRyYWNrZXIodXJpLCBwcmVmaXgsIHRsZENNRG9jdW1lbnQsIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuYWJsZXMgYSBUTEQgb3duaW5nIHRoZSBnaXZlbiBwcmVmaXggbG9hZGVkIGZyb20gdGhlIGdpdmVuIFVSSSBhdAotCQkgKiB0aGUgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLiBUaGUgbGlzdCBvZgotCQkgKiBhZGRpdGlvbmFsQ01Eb2N1bWVudHMgd2lsbCBjbGFpbSB0byBub3Qga25vdyBhbnkgb2YgaXRzIHRhZ3MgYXQKLQkJICogcG9zaXRpb25zIGVhcmxpZXIgdGhhbiB0aGF0IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ncyBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEZvciB0YWdsaWIgZGlyZWN0aXZlcywgdGhlIHRhZ2xpYiBpcyB0aGUgYW5jaG9yIHdoaWxlIHRhZ2xpYnMKLQkJICogcmVnaXN0ZXJlZCB0aHJvdWdoIGluY2x1ZGUgZGlyZWN0aXZlcyB1c2UgdGhlIHBhcmVudCBkb2N1bWVudCdzCi0JCSAqIGluY2x1ZGUgZGlyZWN0aXZlIGFzIHRoZWlyIGFuY2hvci4KLQkJICogCi0JCSAqIEBwYXJhbSBwcmVmaXgKLQkJICogQHBhcmFtIHVyaQotCQkgKiBAcGFyYW0gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVUYWdsaWJGcm9tVVJJKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQllbmFibGVUYWdzKHByZWZpeCwgdXJpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJaWYgKF9kZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgcmVnaXN0ZXJlZCBhIHRyYWNrZXIgZm9yICIgKyB1cmkgKyAiIHdpdGggcHJlZml4ICIgKyBwcmVmaXgpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGVuYWJsZVRhZ3MoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCWlmIChwcmVmaXggPT0gbnVsbCB8fCB1cmkgPT0gbnVsbCB8fCBiYW5uZWRQcmVmaXhlcy5jb250YWlucyhwcmVmaXgpKQotCQkJCXJldHVybjsKLQkJCS8vIFRyeSB0byBsb2FkIHRoZSBDTURvY3VtZW50IGZvciB0aGlzIFVSSQotCQkJQ01Eb2N1bWVudCB0bGQgPSBnZXRDTURvY3VtZW50KHVyaSk7Ci0JCQlpZiAodGxkID09IG51bGwgfHwgISh0bGQgaW5zdGFuY2VvZiBUTEREb2N1bWVudCkpIHsKLQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgZmFpbGVkIHRvIGNyZWF0ZSBhIENNRG9jdW1lbnQgZm9yICIgKyB1cmkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXJlZ2lzdGVyVGFnbGliKHByZWZpeCwgdXJpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRsZCk7Ci0JCX0KLQotCQkvKioKLQkJICogRW5hYmxlcyBhIFRMRCBvd25pbmcgdGhlIGdpdmVuIHByZWZpeCBsb2FkZWQgZnJvbSB0aGUgZ2l2ZW4gVVJJIGF0Ci0JCSAqIHRoZSBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uIFRoZSBsaXN0IG9mCi0JCSAqIGFkZGl0aW9uYWxDTURvY3VtZW50cyB3aWxsIGNsYWltIHRvIG5vdCBrbm93IGFueSBvZiBpdHMgdGFncyBhdAotCQkgKiBwb3NpdGlvbnMgZWFybGllciB0aGFuIHRoYXQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbidzIHBvc2l0aW9uLgotCQkgKiAKLQkJICogRm9yIHRhZ2xpYiBkaXJlY3RpdmVzLCB0aGUgdGFnbGliIGlzIHRoZSBhbmNob3Igd2hpbGUgdGFnbGlicwotCQkgKiByZWdpc3RlcmVkIHRocm91Z2ggaW5jbHVkZSBkaXJlY3RpdmVzIHVzZSB0aGUgcGFyZW50IGRvY3VtZW50J3MKLQkJICogaW5jbHVkZSBkaXJlY3RpdmUgYXMgdGhlaXIgYW5jaG9yLgotCQkgKiAKLQkJICogQHBhcmFtIHByZWZpeAotCQkgKiBAcGFyYW0gdXJpCi0JCSAqIEBwYXJhbSB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGVuYWJsZVRhZ3NJbkRpcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgdGFnZGlyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJZW5hYmxlVGFncyhwcmVmaXgsIHRhZ2RpciwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCWlmIChfZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIHJlZ2lzdGVyZWQgYSB0cmFja2VyIGZvciBkaXJlY3RvcnkiICsgdGFnZGlyICsgIiB3aXRoIHByZWZpeCAiICsgcHJlZml4KTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JlZ2lvbkNvbGxlY3Rpb24oSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbkNvbGxlY3Rpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBKU1BTb3VyY2VQYXJzZXIgdGV4dFNvdXJjZSkgewotCQkJLyoKLQkJCSAqIFdvdWxkIHRlc3QgPiAxLCBidXQgc2luY2Ugd2Ugb25seSBjYXJlIGlmIHRoZXJlIGFyZSA4ICg8JUAsCi0JCQkgKiB0YWdsaWIsIHVyaSwgPSwgd2hlcmUsIHByZWZpeCwgPSwgd2hhdCkgW29yIDQgZm9yIGluY2x1ZGUKLQkJCSAqIGRpcmVjdGl2ZXNdCi0JCQkgKi8KLQkJCWlmIChyZWdpb25Db2xsZWN0aW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gNCAmJiByZWdpb25Db2xsZWN0aW9uLmdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCUlUZXh0UmVnaW9uIG5hbWUgPSByZWdpb25Db2xsZWN0aW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJYm9vbGVhbiB0YWdsaWJEZXRlY3RlZCA9IGZhbHNlOwotCQkJCWJvb2xlYW4gdGFnbGliRGlyZWN0aXZlRGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQlib29sZWFuIGluY2x1ZGVEZXRlY3RlZCA9IGZhbHNlOwotCQkJCWJvb2xlYW4gaW5jbHVkZURpcmVjdGl2ZURldGVjdGVkID0gZmFsc2U7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gcmVnaW9uQ29sbGVjdGlvbi5nZXRTdGFydE9mZnNldChuYW1lKTsKLQkJCQlpbnQgdGV4dExlbmd0aCA9IG5hbWUuZ2V0VGV4dExlbmd0aCgpOwotCi0JCQkJdGFnbGliRGV0ZWN0ZWQgPSB0ZXh0U291cmNlLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJCQlpZiAoIXRhZ2xpYkRldGVjdGVkKQotCQkJCQl0YWdsaWJEaXJlY3RpdmVEZXRlY3RlZCA9IHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQkJaWYgKCF0YWdsaWJEaXJlY3RpdmVEZXRlY3RlZCkKLQkJCQkJaW5jbHVkZURldGVjdGVkID0gdGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMlRMRE5hbWVzLklOQ0xVREUpOwotCQkJCWlmICghaW5jbHVkZURldGVjdGVkKQotCQkJCQlpbmNsdWRlRGlyZWN0aXZlRGV0ZWN0ZWQgPSB0ZXh0U291cmNlLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCQlpZiAodGFnbGliRGV0ZWN0ZWQgfHwgdGFnbGliRGlyZWN0aXZlRGV0ZWN0ZWQpIHsKLQkJCQkJcHJvY2Vzc1RhZ2xpYihyZWdpb25Db2xsZWN0aW9uLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRleHRTb3VyY2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChpbmNsdWRlRGV0ZWN0ZWQgfHwgaW5jbHVkZURpcmVjdGl2ZURldGVjdGVkKSB7Ci0JCQkJCXByb2Nlc3NJbmNsdWRlKHJlZ2lvbkNvbGxlY3Rpb24sIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgdGV4dFNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uQ29sbGVjdGlvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4uZXF1YWxzKHJlZ2lvbkNvbGxlY3Rpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkpKSB7Ci0JCQkJcHJvY2Vzc1hNTFN0YXJ0VGFnKHJlZ2lvbkNvbGxlY3Rpb24sIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgdGV4dFNvdXJjZSk7Ci0JCQl9CQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlpZiAoIXByZWx1ZGVzSGFuZGxlZCkgewotCQkJCWhhbmRsZVByZWx1ZGVzKCk7Ci0JCQkJcHJlbHVkZXNIYW5kbGVkID0gdHJ1ZTsKLQkJCX0KLQkJCXByb2Nlc3NSZWdpb25Db2xsZWN0aW9uKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBnZXRQYXJzZXIoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUHJvY2VzcyBhbiBpbmNsdWRlIGRpcmVjdGl2ZSBmb3VuZCBieSB0aGUgdGV4dFNvdXJjZSBwYXJzZXIgYW5kCi0JCSAqIGFuY2hvciBhbnkgdGFnbGlicyBmb3VuZCB3aXRoaW4gYXQgdGhlCi0JCSAqIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4gSW5jbHVkZXMgdXNlIHRoZSBpbmNsdWRpbmcgZmlsZSBhcwotCQkgKiB0aGUgcG9pbnQgb2YgcmVmZXJlbmNlLCBub3QgbmVjZXNzYXJpbHkgdGhlICJ0b3AiIGZpbGUuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5jbHVkZShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gaW5jbHVkZURpcmVjdGl2ZUNvbGxlY3Rpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBKU1BTb3VyY2VQYXJzZXIgdGV4dFNvdXJjZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBpbmNsdWRlRGlyZWN0aXZlQ29sbGVjdGlvbi5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgaW5jbHVkZWRGaWxlID0gbnVsbDsKLQkJCWJvb2xlYW4gaXNGaWxlbmFtZSA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMjsgaW5jbHVkZWRGaWxlID09IG51bGwgJiYgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhpbmNsdWRlRGlyZWN0aXZlQ29sbGVjdGlvbi5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBKU1AxMlRMRE5hbWVzLkZJTEUpKSB7Ci0JCQkJCQkJaXNGaWxlbmFtZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpc0ZpbGVuYW1lID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNGaWxlbmFtZSAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCWluY2x1ZGVkRmlsZSA9IHRleHRTb3VyY2UuZ2V0VGV4dChpbmNsdWRlRGlyZWN0aXZlQ29sbGVjdGlvbi5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCWlzRmlsZW5hbWUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJaW5jbHVkZWRGaWxlID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKGZQcm9jZXNzSW5jbHVkZXMgJiYgaW5jbHVkZWRGaWxlICE9IG51bGwpIHsKLQkJCQkvLyBzdHJpcCBhbnkgZXh0cmFuZW91cyBxdW90ZXMgYW5kIHdoaXRlIHNwYWNlCi0JCQkJaW5jbHVkZWRGaWxlID0gU3RyaW5nVXRpbHMuc3RyaXAoaW5jbHVkZWRGaWxlKS50cmltKCk7Ci0JCQkJSVBhdGggZmlsZVBhdGggPSBudWxsOwotCQkJCS8qCi0JCQkJICogVGhlIHJlc29sdXRpb24gb2YgdGhlIGluY2x1ZGVkIGZyYWdtZW50IHNob3VsZCB1c2UgdGhlIGZpbGUKLQkJCQkgKiBjb250YWluaW5nIHRoZSBkaXJlY3RpdmUgYXMgdGhlIGJhc2UgcmVmZXJlbmNlLCBub3QgYWx3YXlzCi0JCQkJICogdGhlIG1haW4gSlNQIGJlaW5nIGludm9rZWQuIFZlcmlmaWVkIGJlaGF2aW9yIHdpdGggQXBhY2hlCi0JCQkJICogVG9tY2F0IDUuNS4yMC4KLQkJCQkgKi8KLQkJCQlJUGF0aCBtb2RlbEJhc2VMb2NhdGlvbiA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0TG9jYXRpb24oVExEQ01Eb2N1bWVudE1hbmFnZXIudGhpcyk7Ci0JCQkJaWYobW9kZWxCYXNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoZ2V0SW5jbHVkZXMoKS5pc0VtcHR5KCkpCi0JCQkJCQlmaWxlUGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShtb2RlbEJhc2VMb2NhdGlvbiwgaW5jbHVkZWRGaWxlKTsKLQkJCQkJZWxzZQotCQkJCQkJZmlsZVBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUoKElQYXRoKSBnZXRJbmNsdWRlcygpLnBlZWsoKSwgaW5jbHVkZWRGaWxlKTsKLQkJCQl9Ci0KLQkJCQkvLyBjaGVjayBmb3IgImxvb3BzIgotCQkJCWlmIChmaWxlUGF0aCAhPSBudWxsICYmICFnZXRJbmNsdWRlcygpLmNvbnRhaW5zKGZpbGVQYXRoKSAmJiAhZmlsZVBhdGguZXF1YWxzKG1vZGVsQmFzZUxvY2F0aW9uKSkgewotCQkJCQkvKgotCQkJCQkgKiBQcmV2ZW50IHNsb3cgcGVyZm9ybWFuY2Ugd2hlbiBlZGl0aW5nIHNjcmlwdGxldCBwYXJ0IG9mCi0JCQkJCSAqIHRoZSBKU1AgYnkgb25seSBwcm9jZXNzaW5nIGluY2x1ZGVzIGlmIHRoZXkndmUgYmVlbgotCQkJCQkgKiBtb2RpZmllZC4gVGhlIEluY2x1ZGVIZWxwZXIgcmVtZW1iZXJzIGFueSBDTURvY3VtZW50cwotCQkJCQkgKiBjcmVhdGVkIGZyb20gdGhlIGZpbGVzIGl0IHBhcnNlcy4gQ2FjaGluZyB0aGUgVVJJIGFuZAotCQkJCQkgKiBwcmVmaXgvdGFnZGlyIGFsbG93cyB1cyB0byBqdXN0IGVuYWJsZSB0aGUgQ01Eb2N1bWVudAotCQkJCQkgKiB3aGVuIHRoZSBwcmV2aW91c2x5IHBhcnNlZCBmaWxlcy4KLQkJCQkJICogCi0JCQkJCSAqIFJFTUFJTklORyBQUk9CTEVNOiBmVExEQ01SZWZlcmVuY2VzTWFwIGRvZXMgbm90IG1hcAotCQkJCQkgKiBmcm9tIGEgZnJhZ21lbnQncyBwYXRoIGFuZCBhbHNvIGluY2x1ZGUgYWxsIG9mIHRoZSBDTQotCQkJCQkgKiByZWZlcmVuY2VzIGluIGZyYWdtZW50cyB0aGF0ICppdCogaW5jbHVkZXMuIFRoZQotCQkJCQkgKiBmcmFnbWVudHMgdGhhdCBpdCBpbmNsdWRlcyB3b24ndCBoYXZlIGl0cyBDTSByZWZlcmVuY2VzCi0JCQkJCSAqIGxvYWRlZCwgYnV0IHRoZW4gd2UnZCBuZWVkIHRvIHJlY29yZCB0aGUgVVJJIGFuZAotCQkJCQkgKiBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZWQgZnJhZ21lbnQgdG8gcmVzb2x2ZSB0aGVtCi0JCQkJCSAqIGNvcnJlY3RseSwgbW9kaWZ5aW5nIGVuYWJsZVRhZ2xpYigpIHRvIGFsc28gdGFrZSBhIGJhc2UKLQkJCQkJICogcGF0aCBhbmQgcmVzb2x2ZSB0aGUgVVJJIGFwcHJvcHJpYXRlbHkuCi0JCQkJCSAqLwotCQkJCQlpZiAoaGFzQW55SW5jbHVkZUJlZW5Nb2RpZmllZChmaWxlUGF0aCkpIHsKLQkJCQkJCWdldEluY2x1ZGVzKCkucHVzaChmaWxlUGF0aCk7Ci0KLQkJCQkJCUluY2x1ZGVIZWxwZXIgaW5jbHVkZUhlbHBlciA9IG5ldyBJbmNsdWRlSGVscGVyKGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0UGFyc2VyKCkpOwotCQkJCQkJaW5jbHVkZUhlbHBlci5wYXJzZShmaWxlUGF0aCk7Ci0JCQkJCQlMaXN0IHJlZmVyZW5jZXMgPSBpbmNsdWRlSGVscGVyLnRhZ2xpYlJlZmVyZW5jZXM7Ci0JCQkJCQlmVExEQ01SZWZlcmVuY2VzTWFwLnB1dChmaWxlUGF0aCwgcmVmZXJlbmNlcyk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgcmVmZXJlbmNlcyAhPSBudWxsICYmIGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJVExEQ01Eb2N1bWVudFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoVExEQ01Eb2N1bWVudFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQkJCQkJZ2V0UGFyc2VyKCkuYWRkTmVzdGFibGVQcmVmaXgobmV3IFRhZ01hcmtlcihyZWZlcmVuY2UucHJlZml4ICsgIjoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCS8qCi0JCQkJCQkgKiBUT0RPOiB3YWxrIHVwIHRoZSBpbmNsdWRlIGhpZXJhcmNoeSBhbmQgYWRkCi0JCQkJCQkgKiB0aGVzZSByZWZlcmVuY2VzIHRvIGVhY2ggb2YgdGhlIHBhcmVudHM/Ci0JCQkJCQkgKi8KLQotCQkJCQkJZ2V0SW5jbHVkZXMoKS5wb3AoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIEFkZCBmcm9tIHRoYXQgc2F2ZWQgbGlzdCBvZiB1cmlzL3ByZWZpeGVzL2RvY3VtZW50cwotCQkJCQkJTGlzdCByZWZlcmVuY2VzID0gKExpc3QpIGZUTERDTVJlZmVyZW5jZXNNYXAuZ2V0KGZpbGVQYXRoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyByZWZlcmVuY2VzICE9IG51bGwgJiYgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlUTERDTURvY3VtZW50UmVmZXJlbmNlIHJlZmVyZW5jZSA9IChUTERDTURvY3VtZW50UmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIFRoZSB1cmkgbWlnaHQgbm90IGJlIHJlc29sdmVkIHByb3Blcmx5IGlmCi0JCQkJCQkJICogcmVsYXRpdmUgdG8gdGhlIEpTUCBmcmFnbWVudC4KLQkJCQkJCQkgKi8KLQkJCQkJCQllbmFibGVUYWdsaWJGcm9tVVJJKHJlZmVyZW5jZS5wcmVmaXgsIHJlZmVyZW5jZS51cmksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJZ2V0UGFyc2VyKCkuYWRkTmVzdGFibGVQcmVmaXgobmV3IFRhZ01hcmtlcihyZWZlcmVuY2UucHJlZml4ICsgIjoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChnZXRJbmNsdWRlcygpLmNvbnRhaW5zKGZpbGVQYXRoKSkgewotCQkJCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxPT1AgSU4gQElOQ0xVREVTIEZPVU5EOiAiICsgZmlsZVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1hNTFN0YXJ0VGFnKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBzdGFydFRhZ1JlZ2lvbkNvbGxlY3Rpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBKU1BTb3VyY2VQYXJzZXIgdGV4dFNvdXJjZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFRhZ1JlZ2lvbkNvbGxlY3Rpb24uZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCWJvb2xlYW4gaXNUYWdsaWJWYWx1ZSA9IGZhbHNlOwotCQkJLy8gc2tpcCB0aGUgZmlyc3QgdHdvLCB0aGV5J3JlIHRoZSBvcGVuIGJyYWNrZXQgYW5kIG5hbWUKLQkJCWZvciAoaW50IGkgPSAyOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQkJLy8gSGFuZGxlIG5lc3RlZCBkaXJlY3RpdmVzCi0JCQkJCXByb2Nlc3NSZWdpb25Db2xsZWN0aW9uKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbiwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCB0ZXh0U291cmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIEhhbmRsZSB4bWxuczp4eHg9eXl5Ci0JCQkJCWludCByZWdpb25TdGFydE9mZnNldCA9IHN0YXJ0VGFnUmVnaW9uQ29sbGVjdGlvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQlpbnQgcmVnaW9uVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJaWYgKHJlZ2lvblRleHRMZW5ndGggPiBYTUxOU19MRU5HVEggJiYgdGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHJlZ2lvblN0YXJ0T2Zmc2V0LCBYTUxOU19MRU5HVEgsIFhNTE5TKSkgewotCQkJCQkJCXByZWZpeCA9IHRleHRTb3VyY2UuZ2V0VGV4dChyZWdpb25TdGFydE9mZnNldCArIFhNTE5TX0xFTkdUSCwgcmVnaW9uVGV4dExlbmd0aCAtIFhNTE5TX0xFTkdUSCk7Ci0JCQkJCQkJaWYgKCFiYW5uZWRQcmVmaXhlcy5jb250YWlucyhwcmVmaXgpKQotCQkJCQkJCQlpc1RhZ2xpYlZhbHVlID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByZWZpeCA9IG51bGw7Ci0JCQkJCQkJaXNUYWdsaWJWYWx1ZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzVGFnbGliVmFsdWUgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJCXVyaSA9IHRleHRTb3VyY2UuZ2V0VGV4dChyZWdpb25TdGFydE9mZnNldCwgcmVnaW9uVGV4dExlbmd0aCk7Ci0JCQkJCQkJdXJpID0gU3RyaW5nVXRpbHMuc3RyaXAodXJpKTsKLQkJCQkJCQlpbnQgdXJpTGVuZ3RoID0gdXJpLmxlbmd0aCgpOwotCQkJCQkJCWlmICh1cmkgIT0gbnVsbCAmJiB1cmlMZW5ndGggPiAwKSB7Ci0JCQkJCQkJCWlmICh1cmlMZW5ndGggPiBVUk5fVExEX0xFTkdUSCAmJiB1cmkuc3RhcnRzV2l0aChVUk5fVExEKSkgewotCQkJCQkJCQkJdXJpID0gdXJpLnN1YnN0cmluZyhVUk5fVExEX0xFTkdUSCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAodXJpTGVuZ3RoID4gVVJOX1RBR0RJUl9MRU5HVEggJiYgdXJpLnN0YXJ0c1dpdGgoVVJOX1RBR0RJUikpIHsKLQkJCQkJCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoVVJOX1RBR0RJUl9MRU5HVEgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVuYWJsZVRhZ3MocHJlZml4LCB1cmksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJCXVyaSA9IG51bGw7Ci0JCQkJCQkJCXByZWZpeCA9IG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFB1bGxzIHRoZSBVUkkgYW5kIHByZWZpeCBmcm9tIHRoZSBnaXZlbiB0YWdsaWIgZGlyZWN0aXZlCi0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kIG1ha2VzIHN1cmUgdGhlIHRhZ3MgYXJlIGtub3duLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RhZ2xpYihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gdGFnbGliRGlyZWN0aXZlQ29sbGVjdGlvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIEpTUFNvdXJjZVBhcnNlciB0ZXh0U291cmNlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZ2xpYkRpcmVjdGl2ZUNvbGxlY3Rpb24uZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCVN0cmluZyB0YWdkaXIgPSBudWxsOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDI7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkvLyByZW1lbWJlciBhdHRyaWJ1dGUgbmFtZQotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSB0YWdsaWJEaXJlY3RpdmVDb2xsZWN0aW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWludCB0ZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQkvLyBTdHJpbmcgbmFtZSA9IHRleHRTb3VyY2UuZ2V0VGV4dChzdGFydE9mZnNldCwKLQkJCQkJCS8vIHRleHRMZW5ndGgpOwotCQkJCQkJaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTFUTEROYW1lcy5QUkVGSVgpKSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBKU1AxMVRMRE5hbWVzLlBSRUZJWDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTJUTEROYW1lcy5VUkkpKSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBKU1AxMVRMRE5hbWVzLlVSSTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMjBUTEROYW1lcy5UQUdESVIpKSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBKU1AyMFRMRE5hbWVzLlRBR0RJUjsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWF0dHJOYW1lID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBwcm9jZXNzIHZhbHVlCi0JCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJaWYgKEpTUDExVExETmFtZXMuUFJFRklYLmVxdWFscyhhdHRyTmFtZSkpCi0JCQkJCQkJcHJlZml4ID0gU3RyaW5nVXRpbHMuc3RyaXAodGV4dFNvdXJjZS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoKSk7Ci0JCQkJCQllbHNlIGlmIChKU1AxMVRMRE5hbWVzLlVSSS5lcXVhbHMoYXR0ck5hbWUpKQotCQkJCQkJCXVyaSA9IFN0cmluZ1V0aWxzLnN0cmlwKHRleHRTb3VyY2UuZ2V0VGV4dChzdGFydE9mZnNldCwgdGV4dExlbmd0aCkpOwotCQkJCQkJZWxzZSBpZiAoSlNQMjBUTEROYW1lcy5UQUdESVIuZXF1YWxzKGF0dHJOYW1lKSkKLQkJCQkJCQl0YWdkaXIgPSBTdHJpbmdVdGlscy5zdHJpcCh0ZXh0U291cmNlLmdldFRleHQoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJdXJpID0gbnVsbDsKLQkJCQlwcmVmaXggPSBudWxsOwotCQkJfQotCQkJaWYgKHVyaSAhPSBudWxsICYmIHByZWZpeCAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDAgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCWVuYWJsZVRhZ2xpYkZyb21VUkkocHJlZml4LCBTdHJpbmdVdGlscy5zdHJpcCh1cmkpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAodGFnZGlyICE9IG51bGwgJiYgcHJlZml4ICE9IG51bGwgJiYgdGFnZGlyLmxlbmd0aCgpID4gMCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZW5hYmxlVGFnc0luRGlyKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCksIFN0cmluZ1V0aWxzLnN0cmlwKHRhZ2RpciksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJUYWdsaWIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIENNRG9jdW1lbnQgdGxkKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IHRsZC5nZXRFbGVtZW50cygpOwotCQkJLyoKLQkJCSAqIEdvIHRocm91Z2ggdGhlIENNRG9jdW1lbnQgZm9yIGFueSB0YWdzIHRoYXQgbXVzdCBiZSBtYXJrZWQgYXMKLQkJCSAqIGJsb2NrIHRhZ3Mgc3RhcnRpbmcgYXQgdGhlIGFuY2hvcmluZyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLgotCQkJICogQXMgdGhlIGRvY3VtZW50IGlzIGVkaXRlZCBhbmQgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCSAqIG1vdmVkIGFyb3VuZCwgdGhlIGJsb2NrIHRhZyBlbmFibGVtZW50IHdpbGwgYXV0b21hdGljYWxseQotCQkJICogZm9sbG93IGl0LgotCQkJICovCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlUTERFbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoVExERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5pdGVtKGkpOwotCQkJCWlmIChlZC5nZXRCb2R5Y29udGVudCgpID09IEpTUDEyVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQpCi0JCQkJCWFkZEJsb2NrVGFnKHByZWZpeCArICI6IiArIGVkLmdldE5vZGVOYW1lKCksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8qCi0JCQkgKiBTaW5jZSBtb2RpZmljYXRpb25zIHRvIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgYWRqYWNlbnQgdG8gYQotCQkJICogdGFnbGliIGRpcmVjdGl2ZSBjYW4gY2F1c2UgdGhhdCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRvIGJlCi0JCQkgKiByZXBvcnRlZCwgZmlsdGVyIG91dCBhbnkgZHVwbGljYXRlZCBVUklzLiBXaGVuIHRoZSB0YWdsaWIgaXMKLQkJCSAqIGFjdHVhbGx5IG1vZGlmaWVkLCBhIGZ1bGwgcmVidWlsZCB3aWxsIG9jY3VyIGFuZCBubyBkdXBsaWNhdGVzCi0JCQkgKiB3aWxsL3Nob3VsZCBiZSBmb3VuZC4KLQkJCSAqLwotCQkJYm9vbGVhbiBkb1RyYWNrID0gdHJ1ZTsKLQkJCUxpc3QgdHJhY2tlcnMgPSBnZXRUYWdsaWJUcmFja2VycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFja2Vycy5zaXplKCk7IGkrKykgewotCQkJCVRhZ2xpYlRyYWNrZXIgdHJhY2tlciA9IChUYWdsaWJUcmFja2VyKSB0cmFja2Vycy5nZXQoaSk7Ci0JCQkJaWYgKHRyYWNrZXIuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkgJiYgdHJhY2tlci5nZXRVUkkoKS5lcXVhbHModXJpKSkgewotCQkJCQlkb1RyYWNrID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRvVHJhY2spIHsKLQkJCQlhZGRUYWdsaWJUcmFja2VyKHByZWZpeCwgdXJpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRsZCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVzZXRCbG9ja1RhZ3MoKSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJdGVyYXRvciBuYW1lcyA9IGdldFBhcnNlcigpLmdldEJsb2NrTWFya2VycygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKSBuYW1lcy5uZXh0KCk7Ci0JCQkJaWYgKCFtYXJrZXIuaXNHbG9iYWwoKSAmJiBtYXJrZXIuZ2V0Q29udGV4dCgpID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIHJlbW92aW5nIGJsb2NrIHRhZyBuYW1lZDogIiArIG1hcmtlci5nZXRUYWdOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJbmFtZXMucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXROb2RlcygpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1RhZ2xpYnMpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogcmVzZXR0aW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdldEluY2x1ZGVzKCkuY2xlYXIoKTsKLQkJCXJlc2V0QmxvY2tUYWdzKCk7Ci0JCQlyZXNldFRhZ2xpYlRyYWNrZXJzKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdEb2N1bWVudCkgewotCQkJQXNzZXJ0LmlzVHJ1ZShuZXdEb2N1bWVudCAhPSBudWxsLCAibnVsbCBkb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQlBc3NlcnQuaXNUcnVlKG5ld0RvY3VtZW50LmdldFBhcnNlcigpICE9IG51bGwsICJudWxsIGRvY3VtZW50IHBhcnNlciIpOyAvLyROT04tTkxTLTEkCi0JCQlBc3NlcnQuaXNUcnVlKG5ld0RvY3VtZW50LmdldFBhcnNlcigpIGluc3RhbmNlb2YgSlNQU291cmNlUGFyc2VyLCAiY2FuIG9ubHkgbGlzdGVuIHRvIGRvY3VtZW50IHdpdGggYSBKU1BTb3VyY2VQYXJzZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2V0U291cmNlUGFyc2VyKCkucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcih0aGlzKTsKLQkJCXNldFNvdXJjZVBhcnNlcigoSlNQU291cmNlUGFyc2VyKSBuZXdEb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCQlnZXRTb3VyY2VQYXJzZXIoKS5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEluY2x1ZGVIZWxwZXIgZXh0ZW5kcyBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIHsKLQkJcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkFuY2hvciA9IG51bGw7Ci0JCXByb3RlY3RlZCBKU1BTb3VyY2VQYXJzZXIgZkxvY2FsUGFyc2VyID0gbnVsbDsKLQkJcHJvdGVjdGVkIEpTUFNvdXJjZVBhcnNlciBmUGFyZW50UGFyc2VyID0gbnVsbDsKLQkJTGlzdCB0YWdsaWJSZWZlcmVuY2VzID0gbnVsbDsKLQotCQlwdWJsaWMgSW5jbHVkZUhlbHBlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvciwgSlNQU291cmNlUGFyc2VyIHJvb3RQYXJzZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmQW5jaG9yID0gYW5jaG9yOwotCQkJZlBhcmVudFBhcnNlciA9IHJvb3RQYXJzZXI7Ci0JCQl0YWdsaWJSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYlRyYWNrZXIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIENNRG9jdW1lbnQgdGxkQ01Eb2N1bWVudCkgewotCQkJc3VwZXIuYWRkVGFnbGliVHJhY2tlcihwcmVmaXgsIHVyaSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCB0bGRDTURvY3VtZW50KTsKLQkJCVRMRENNRG9jdW1lbnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFRMRENNRG9jdW1lbnRSZWZlcmVuY2UoKTsKLQkJCXJlZmVyZW5jZS5wcmVmaXggPSBwcmVmaXg7Ci0JCQlyZWZlcmVuY2UudXJpID0gdXJpOwotCQkJdGFnbGliUmVmZXJlbmNlcy5hZGQocmVmZXJlbmNlKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudHMoSVBhdGggZmlsZVBhdGgpIHsKLQkJCXJldHVybiBGaWxlQ29udGVudENhY2hlLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudHMoZmlsZVBhdGgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJcHJvY2Vzc1JlZ2lvbkNvbGxlY3Rpb24oc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBmQW5jaG9yLCBmTG9jYWxQYXJzZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwYXRoIC0KLQkJICogICAgICAgICAgICB0aGUgZnVsbHBhdGggZm9yIHRoZSByZXNvdXJjZSB0byBiZSBwYXJzZWQKLQkJICovCi0JCXZvaWQgcGFyc2UoSVBhdGggcGF0aCkgewotCQkJSlNQU291cmNlUGFyc2VyIHAgPSBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JCQlmTG9jYWxQYXJzZXIgPSBwOwotCQkJU3RyaW5nIHMgPSBnZXRDb250ZW50cyhwYXRoKTsKLQkJCS8vIFNob3VsZCB3ZSBjb25zaWRlciBwcmVsdWRlcyBvbiB0aGlzIHNlZ21lbnQ/Ci0JCQlmTG9jYWxQYXJzZXIuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihJbmNsdWRlSGVscGVyLnRoaXMpOwotCQkJZkxvY2FsUGFyc2VyLnJlc2V0KHMpOwotCQkJTGlzdCBibG9ja1RhZ3MgPSBmUGFyZW50UGFyc2VyLmdldEJsb2NrTWFya2VycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja1RhZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGJsb2NrVGFncy5nZXQoaSk7Ci0JCQkJZkxvY2FsUGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcihtYXJrZXIuZ2V0VGFnTmFtZSgpLCBudWxsLCBtYXJrZXIuZ2V0Q29udGV4dCgpLCBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpKTsKLQkJCX0KLQkJCVRhZ01hcmtlcltdIGtub3duUHJlZml4ZXMgPSAoVGFnTWFya2VyW10pIGZQYXJlbnRQYXJzZXIuZ2V0TmVzdGFibGVQcmVmaXhlcygpLnRvQXJyYXkobmV3IFRhZ01hcmtlclswXSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duUHJlZml4ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmTG9jYWxQYXJzZXIuYWRkTmVzdGFibGVQcmVmaXgobmV3IFRhZ01hcmtlcihrbm93blByZWZpeGVzW2ldLmdldFRhZ05hbWUoKSwgbnVsbCkpOwotCQkJfQotCQkJLy8gZm9yY2UgcGFyc2UKLQkJCWZMb2NhbFBhcnNlci5nZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJCWZMb2NhbFBhcnNlciA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gZW50cnkgaW4gdGhlIHNoYXJlZCBjYWNoZSBtYXAKLQkgKi8KLQlzdGF0aWMgY2xhc3MgVExEQ2FjaGVFbnRyeSB7Ci0JCUNNRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCWludCByZWZlcmVuY2VDb3VudDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUTERDTURvY3VtZW50RGVzY3JpcHRvciB7Ci0JCU9iamVjdCBjYWNoZUtleTsKLQkJQ01Eb2N1bWVudCBkb2N1bWVudDsKLQotCQlUTERDTURvY3VtZW50RGVzY3JpcHRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRMRENNRG9jdW1lbnRSZWZlcmVuY2UgewotCQlTdHJpbmcgcHJlZml4OwotCQlTdHJpbmcgdXJpOwotCX0KLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1ZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9tYW5hZ2VyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdDYWNoZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9jYWNoZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8gd2lsbCBob2xkIHRoZSBwcmVmaXhlcyBiYW5uZWQgYnkgdGhlIHNwZWNpZmljYXRpb247IHRhZ2xpYnMgbWF5IG5vdCB1c2UKLQkvLyB0aGVtCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGJhbm5lZFByZWZpeGVzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBmQ2FjaGUgPSBudWxsOwotCWZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkIAotCWZpbmFsIFN0cmluZyBVUk5fVEFHRElSID0gInVybjpqc3B0YWdkaXI6IjsKLQlmaW5hbCBTdHJpbmcgVVJOX1RMRCA9ICJ1cm46anNwdGxkOiI7Ci0KLQlmaW5hbCBpbnQgWE1MTlNfTEVOR1RIID0gWE1MTlMubGVuZ3RoKCk7Ci0JZmluYWwgaW50IFVSTl9UQUdESVJfTEVOR1RIID0gVVJOX1RBR0RJUi5sZW5ndGgoKTsKLQlmaW5hbCBpbnQgVVJOX1RMRF9MRU5HVEggPSBVUk5fVExELmxlbmd0aCgpOwotCi0Jc3RhdGljIHsKLQkJYmFubmVkUHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KDcpOwotCQliYW5uZWRQcmVmaXhlcy5hZGQoImpzcCIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgianNweCIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgiamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgiamF2YXgiKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoInNlcnZsZXQiKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoInN1biIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgic3VudyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgb2YgdGhlIGtub3duIGRvY3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBIYXNodGFibGUgb2YgZWl0aGVyIFRMRENhY2hlRW50cnlzIG9yIFdlYWtSZWZlcmVuY2VzCi0JICogICAgICAgICB0byBUTEQgQ01Eb2N1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2h0YWJsZSBnZXRTaGFyZWREb2N1bWVudENhY2hlKCkgewotCQlpZiAoZkNhY2hlID09IG51bGwpIHsKLQkJCWZDYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJfQotCQlyZXR1cm4gZkNhY2hlOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VW5pcXVlSWRlbnRpZmllcihJVGFnbGliUmVjb3JkIHJlZmVyZW5jZSkgewotCQlpZiAocmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IGlkZW50aWZpZXIgPSBudWxsOwotCQlzd2l0Y2ggKHJlZmVyZW5jZS5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQlJVExEUmVjb3JkIHJlY29yZCA9IChJVExEUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJaWRlbnRpZmllciA9IHJlY29yZC5nZXRQYXRoKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOiB7Ci0JCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCWlkZW50aWZpZXIgPSByZWNvcmQuZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCQlJVGFnRGlyUmVjb3JkIHJlY29yZCA9IChJVGFnRGlyUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJaWRlbnRpZmllciA9IHJlY29yZC5nZXRQYXRoKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCWlkZW50aWZpZXIgPSByZWNvcmQuZ2V0VVJMKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlpZGVudGlmaWVyID0gcmVmZXJlbmNlOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBpZGVudGlmaWVyOwotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnlUTEQgZkNNRG9jdW1lbnRCdWlsZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBmRGlyZWN0aXZlSGFuZGxlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgbG9jYWxseS1rbm93IGxpc3Qgb2YgQ01Eb2N1bWVudHMKLQkgKi8KLQlwcml2YXRlIEhhc2h0YWJsZSBmRG9jdW1lbnRzID0gbnVsbDsKLQotCS8vIHRpbWVzdGFtcCBjYWNoZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSByZXBhcnNpbmcKLQkvLyBvZiBpbmNsdWRlZCBmaWxlcwotCS8vIElQYXRoIChmaWxlcGF0aCkgPiBMb25nIChtb2RpZmljYXRpb24gc3RhbXApCi0JSGFzaE1hcCBmSW5jbHVkZTJUaW1lc3RhbXBNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBTdGFjayBmSW5jbHVkZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBKU1BTb3VyY2VQYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0KLQlwcml2YXRlIExpc3QgZlRhZ2xpYlRyYWNrZXJzID0gbnVsbDsKLQotCU1hcCBmVExEQ01SZWZlcmVuY2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlib29sZWFuIGZQcm9jZXNzSW5jbHVkZXMgPSB0cnVlOwotCWJvb2xlYW4gcHJlbHVkZXNIYW5kbGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgVExEQ01Eb2N1bWVudE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJaWYgKF9kZWJ1Z0NhY2hlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGNsZWFyZWQgaXRzIHByaXZhdGUgQ01Eb2N1bWVudCBjYWNoZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RG9jdW1lbnRzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldFNoYXJlZERvY3VtZW50Q2FjaGUoKSkgewotCQkJCU9iamVjdCBvID0gZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLmdldChrZXkpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgVExEQ2FjaGVFbnRyeSkgewotCQkJCQlUTERDYWNoZUVudHJ5IGVudHJ5ID0gKFRMRENhY2hlRW50cnkpIG87Ci0JCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50LS07Ci0JCQkJCWlmIChlbnRyeS5yZWZlcmVuY2VDb3VudCA8PSAwKSB7Ci0JCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucHV0KGtleSwgbmV3IFNvZnRSZWZlcmVuY2UoZW50cnkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERlcml2ZXMgYW4gdW5pcXVlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmUgVVJJLiBUaGUgVVJJIGlzICJyZXNvbHZlZCIgYW5kCi0JICogYSB1bmlxdWUgdmFsdWUgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdC4gVGhpcyBlbnN1cmVzIHRoYXQgdHdvCi0JICogZGlmZmVyZW50IHJlbGF0aXZlIHJlZmVyZW5jZXMgZnJvbSBkaWZmZXJlbnQgZmlsZXMgZG8gbm90IGhhdmUKLQkgKiBvdmVybGFwcGluZyBUTEQgcmVjb3JkcyBpbiB0aGUgc2hhcmVkIGNhY2hlIGlmIHRoZXkgZG9uJ3QgcmVzb2x2ZSB0bwotCSAqIHRoZSBzYW1lIFRMRC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q2FjaGVLZXkoU3RyaW5nIHVyaSkgewotCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IFRhZ2xpYkluZGV4LnJlc29sdmUoZ2V0Q3VycmVudFBhcnNlclBhdGgoKS50b1N0cmluZygpLCB1cmksIGZhbHNlKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VW5pcXVlSWRlbnRpZmllcihyZWNvcmQpOwotCQl9Ci0JCVN0cmluZyBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShnZXRDdXJyZW50QmFzZUxvY2F0aW9uKCkudG9TdHJpbmcoKSwgbnVsbCwgdXJpKTsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQ01Eb2N1bWVudCBhdCB0aGUgdXJpIChjYWNoZWQpCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVmZXJlbmNlID0gdXJpOwotCQlPYmplY3QgY2FjaGVLZXkgPSBnZXRDYWNoZUtleShyZWZlcmVuY2UpOwotCQlsb25nIGxhc3RNb2RpZmllZCA9IGdldE1vZGlmaWNhdGlvblN0YW1wKHJlZmVyZW5jZSk7Ci0JCUNNRG9jdW1lbnQgZG9jID0gKENNRG9jdW1lbnQpIGdldERvY3VtZW50cygpLmdldChjYWNoZUtleSk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIElmIGhhc24ndCBiZWVuIG1vdmVkIGludG8gdGhlIGxvY2FsIHRhYmxlLCBkbyBzbyBhbmQgaW5jcmVtZW50Ci0JCQkgKiB0aGUgY291bnQuIEEgbG9jYWwgVVJJIHJlZmVyZW5jZSBjYW4gYmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbgotCQkJICogdGhlIGZpbGUgZnJvbSB3aGljaCBpdCB3YXMgcmVmZXJlbmNlZC4gVXNlIGEgY29tcHV0ZWQga2V5IHRvCi0JCQkgKiBrZWVwIHRoZW0gc3RyYWlnaHQuCi0JCQkgKi8KLQkJCU9iamVjdCBvID0gZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLmdldChjYWNoZUtleSk7Ci0JCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBUTERDYWNoZUVudHJ5KSB7Ci0JCQkJCVRMRENhY2hlRW50cnkgZW50cnkgPSAoVExEQ2FjaGVFbnRyeSkgbzsKLQkJCQkJaWYgKF9kZWJ1Z0NhY2hlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnQgY2FjaGUgaGl0IG9uICIgKyBjYWNoZUtleSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGVudHJ5ICE9IG51bGwgJiYgZW50cnkubW9kaWZpY2F0aW9uU3RhbXAgIT0gSVJlc291cmNlLk5VTExfU1RBTVAgJiYgZW50cnkubW9kaWZpY2F0aW9uU3RhbXAgPj0gbGFzdE1vZGlmaWVkKSB7Ci0JCQkJCQlkb2MgPSBlbnRyeS5kb2N1bWVudDsKLQkJCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50Kys7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucmVtb3ZlKGNhY2hlS2V5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7Ci0JCQkJCVRMRENhY2hlRW50cnkgZW50cnkgPSAoVExEQ2FjaGVFbnRyeSkgKChSZWZlcmVuY2UpIG8pLmdldCgpOwotCQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQkJaWYgKGVudHJ5Lm1vZGlmaWNhdGlvblN0YW1wICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QICYmIGVudHJ5Lm1vZGlmaWNhdGlvblN0YW1wID49IGxhc3RNb2RpZmllZCkgewotCQkJCQkJCWRvYyA9IGVudHJ5LmRvY3VtZW50OwotCQkJCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50ID0gMTsKLQkJCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucHV0KGNhY2hlS2V5LCBlbnRyeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucmVtb3ZlKGNhY2hlS2V5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8qIE5vIGRvY3VtZW50IHdhcyBmb3VuZCBjYWNoZWQsIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHNoYXJlIGl0ICovCi0JCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCQlpZiAoX2RlYnVnQ2FjaGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50IGNhY2hlIG1pc3Mgb24gIiArIGNhY2hlS2V5KTsKLQkJCQl9Ci0JCQkJVExEQ01Eb2N1bWVudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGxvYWRUYWdsaWIocmVmZXJlbmNlKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCVRMRENhY2hlRW50cnkgZW50cnkgPSBuZXcgVExEQ2FjaGVFbnRyeSgpOwotCQkJCQlkb2MgPSBlbnRyeS5kb2N1bWVudCA9IGRlc2NyaXB0b3IuZG9jdW1lbnQ7Ci0JCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50ID0gMTsKLQkJCQkJZW50cnkubW9kaWZpY2F0aW9uU3RhbXAgPSBnZXRNb2RpZmljYXRpb25TdGFtcChyZWZlcmVuY2UpOwotCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucHV0KGNhY2hlS2V5LCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJZ2V0RG9jdW1lbnRzKCkucHV0KGNhY2hlS2V5LCBkb2MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKFN0cmluZyByZWZlcmVuY2UpIHsKLQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBUYWdsaWJJbmRleC5yZXNvbHZlKGdldEN1cnJlbnRQYXJzZXJQYXRoKCkudG9TdHJpbmcoKSwgcmVmZXJlbmNlLCBmYWxzZSk7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKHJlY29yZC5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJCUlGaWxlIHRsZGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoKChJVExEUmVjb3JkKSByZWNvcmQpLmdldFBhdGgoKSk7Ci0JCQkJCWlmICh0bGRmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQltb2RpZmljYXRpb25TdGFtcCA9IHRsZGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCQlGaWxlIGphcmZpbGUgPSBuZXcgRmlsZSgoKElKYXJSZWNvcmQpIHJlY29yZCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJCQlpZiAoamFyZmlsZS5leGlzdHMoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQltb2RpZmljYXRpb25TdGFtcCA9IGphcmZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCQkJCW1vZGlmaWNhdGlvblN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCQkJSUZvbGRlciB0YWdGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcigoKElUYWdEaXJSZWNvcmQpIHJlY29yZCkuZ2V0UGF0aCgpKTsKLQkJCQkJaWYgKHRhZ0ZvbGRlci5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJSVJlc291cmNlW10gbWVtYmVyczsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWVtYmVycyA9IHRhZ0ZvbGRlci5tZW1iZXJzKCk7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCW1vZGlmaWNhdGlvblN0YW1wID0gTWF0aC5tYXgobW9kaWZpY2F0aW9uU3RhbXAsIG1lbWJlcnNbaV0uZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCW1vZGlmaWNhdGlvblN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBjTURvY3VtZW50QnVpbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBDTURvY3VtZW50RmFjdG9yeVRMRCwgc2luY2UgaXQgaGFzIG1vcmUgYnVpbGRlcgotCSAqICAgICAgICAgbWV0aG9kcwotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50RmFjdG9yeVRMRCBnZXRDTURvY3VtZW50QnVpbGRlcigpIHsKLQkJaWYgKGZDTURvY3VtZW50QnVpbGRlciA9PSBudWxsKQotCQkJZkNNRG9jdW1lbnRCdWlsZGVyID0gbmV3IENNRG9jdW1lbnRGYWN0b3J5VExEKCk7Ci0JCXJldHVybiBmQ01Eb2N1bWVudEJ1aWxkZXI7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGludCBvZmZzZXQpIHsKLQkJTGlzdCB2YWxpZERvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGFsbGRvY3MgPSBnZXRUYWdsaWJUcmFja2VycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhbGxkb2NzLmhhc05leHQoKSkgewotCQkJVGFnbGliVHJhY2tlciBhVHJhY2tlciA9IChUYWdsaWJUcmFja2VyKSBhbGxkb2NzLm5leHQoKTsKLQkJCWlmIChhVHJhY2tlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCB8fCBvZmZzZXQgPCAwKSB7Ci0JCQkJdmFsaWREb2NzLmFkZChhVHJhY2tlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkRG9jczsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50VHJhY2tlcnMoU3RyaW5nIHByZWZpeCwgaW50IG9mZnNldCkgewotCQlMaXN0IHZhbGlkRG9jcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgYWxsZG9jcyA9IGdldFRhZ2xpYlRyYWNrZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFsbGRvY3MuaGFzTmV4dCgpKSB7Ci0JCQlUYWdsaWJUcmFja2VyIGFUcmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGFsbGRvY3MubmV4dCgpOwotCQkJLyoqCi0JCQkgKiAnPCcgaXMgdXNlZCB0byBzdXBwb3J0IHRoZSBpbW1lZGlhdGUgdXNlIG9mIGEgY3VzdG9tIHRhZyBpbiBqc3B4IGZpbGVzCi0JCQkgKi8KLQkJCWlmICgoYVRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSA8PSBvZmZzZXQgfHwgb2Zmc2V0IDwgMCkgJiYgYVRyYWNrZXIuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQl2YWxpZERvY3MuYWRkKGFUcmFja2VyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsaWREb2NzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlsZXN5c3RlbSBsb2NhdGlvbiBpbiB0aGUgY3VycmVudCBwYXJzZXIuIFRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkIHdoaWxlIHJlY3Vyc2luZyB0aHJvdWdoIGluY2x1ZGVkIGZyYWdtZW50cywgc28gaXQgbXVjaCBjaGVjayB0aGUKLQkgKiBpbmNsdWRlIHN0YWNrLiBUaGUgZmlsZXN5c3RlbSBsb2NhdGlvbiBpcyBuZWVkZWQgZm9yIGNvbW1vbiBVUkkKLQkgKiByZXNvbHV0aW9uIGluIGNhc2UgdGhlIFRhZ2xpYiBJbmRleCBkb2Vzbid0IGtub3cgdGhlIFVSSSBiZWluZyBsb2FkZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlQYXRoIGdldEN1cnJlbnRCYXNlTG9jYXRpb24oKSB7Ci0JCUlQYXRoIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCUlQYXRoIHBhdGggPSBnZXRDdXJyZW50UGFyc2VyUGF0aCgpOwotCQliYXNlTG9jYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQliYXNlTG9jYXRpb24gPSBwYXRoOwotCQl9Ci0JCXJldHVybiBiYXNlTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIHVzZWQgaW4gdGhlIGN1cnJlbnQgcGFyc2VyLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUKLQkgKiByZWN1cnNpbmcgdGhyb3VnaCBpbmNsdWRlZCBmcmFnbWVudHMsIHNvIGl0IG11Y2ggY2hlY2sgdGhlIGluY2x1ZGUKLQkgKiBzdGFjay4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVBhdGggZ2V0Q3VycmVudFBhcnNlclBhdGgoKSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlpZiAoIWdldEluY2x1ZGVzKCkuaXNFbXB0eSgpKSB7Ci0JCQlwYXRoID0gKElQYXRoKSBnZXRJbmNsdWRlcygpLnBlZWsoKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhdGggPSBUYWdsaWJDb250cm9sbGVyLmdldExvY2F0aW9uKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgZ2V0RGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpIHsKLQkJaWYgKGZEaXJlY3RpdmVIYW5kbGVyID09IG51bGwpCi0JCQlmRGlyZWN0aXZlSGFuZGxlciA9IG5ldyBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCk7Ci0JCXJldHVybiBmRGlyZWN0aXZlSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkb2N1bWVudHMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgamF2YS51dGlsLkhhc2h0YWJsZQotCSAqLwotCXB1YmxpYyBIYXNodGFibGUgZ2V0RG9jdW1lbnRzKCkgewotCQlpZiAoZkRvY3VtZW50cyA9PSBudWxsKQotCQkJZkRvY3VtZW50cyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcmV0dXJuIGZEb2N1bWVudHM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZXMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RhY2sKLQkgKi8KLQlwcm90ZWN0ZWQgU3RhY2sgZ2V0SW5jbHVkZXMoKSB7Ci0JCWlmIChmSW5jbHVkZXMgPT0gbnVsbCkKLQkJCWZJbmNsdWRlcyA9IG5ldyBTdGFjaygpOwotCQlyZXR1cm4gZkluY2x1ZGVzOwotCX0KLQotCUpTUFNvdXJjZVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBmUGFyc2VyOwotCX0KLQotCXB1YmxpYyBKU1BTb3VyY2VQYXJzZXIgZ2V0U291cmNlUGFyc2VyKCkgewotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCkgewotCQlyZXR1cm4gZ2V0RGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUYWdsaWJUcmFja2VycygpIHsKLQkJaWYgKGZUYWdsaWJUcmFja2VycyA9PSBudWxsKQotCQkJZlRhZ2xpYlRyYWNrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gZlRhZ2xpYlRyYWNrZXJzOwotCX0KLQotCXZvaWQgaGFuZGxlUHJlbHVkZXMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yID0gbmV3IFplcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgLTEpOwotCQlmUHJvY2Vzc0luY2x1ZGVzID0gZmFsc2U7Ci0KLQkJSVBhdGggY3VycmVudFBhdGggPSBnZXRDdXJyZW50UGFyc2VyUGF0aCgpOwotCQlpZiAoY3VycmVudFBhdGggIT0gbnVsbCkgewotCQkJUHJvcGVydHlHcm91cFtdIHByb3BlcnR5R3JvdXBzID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0UHJvcGVydHlHcm91cHMoY3VycmVudFBhdGgpOwotCQkJZm9yKGludCBrID0gMDsgayA8IHByb3BlcnR5R3JvdXBzLmxlbmd0aDsgaysrKSB7Ci0JCQkJSVBhdGhbXSBwcmVsdWRlcyA9IHByb3BlcnR5R3JvdXBzW2tdLmdldEluY2x1ZGVQcmVsdWRlKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVsdWRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWdldEluY2x1ZGVzKCkuY29udGFpbnMocHJlbHVkZXNbaV0pICYmICFwcmVsdWRlc1tpXS5lcXVhbHMoY3VycmVudFBhdGgpKSB7Ci0JCQkJCQlnZXRJbmNsdWRlcygpLnB1c2gocHJlbHVkZXNbaV0pOwotCQkJCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCQkJCQlJbmNsdWRlSGVscGVyIGluY2x1ZGVIZWxwZXIgPSBuZXcgSW5jbHVkZUhlbHBlcihhbmNob3IsIGdldFBhcnNlcigpKTsKLQkJCQkJCQlpbmNsdWRlSGVscGVyLnBhcnNlKHByZWx1ZGVzW2ldKTsKLQkJCQkJCQlMaXN0IHJlZmVyZW5jZXMgPSBpbmNsdWRlSGVscGVyLnRhZ2xpYlJlZmVyZW5jZXM7Ci0JCQkJCQkJZlRMRENNUmVmZXJlbmNlc01hcC5wdXQocHJlbHVkZXNbaV0sIHJlZmVyZW5jZXMpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmZXJlbmNlcy5zaXplKCk7IGorKykgewotCQkJCQkJCQlUTERDTURvY3VtZW50UmVmZXJlbmNlIHJlZmVyZW5jZSA9IChUTERDTURvY3VtZW50UmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChqKTsKLQkJCQkJCQkJZ2V0UGFyc2VyKCkuYWRkTmVzdGFibGVQcmVmaXgobmV3IFRhZ01hcmtlcihyZWZlcmVuY2UucHJlZml4ICsgIjoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIldhcm5pbmc6IHBhcnNlciB0ZXh0IHdhcyByZXF1ZXN0ZWQgYnkgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBidXQgbm9uZSB3YXMgYXZhaWxhYmxlOyB0YWdsaWIgc3VwcG9ydCBkaXNhYmxlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWdldEluY2x1ZGVzKCkucG9wKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlmUHJvY2Vzc0luY2x1ZGVzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIGNoZWNrIGZvciBtb2RpZmljYXRpb24KLQkgKi8KLQlib29sZWFuIGhhc0FueUluY2x1ZGVCZWVuTW9kaWZpZWQoSVBhdGggZmlsZVBhdGgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gY2hlY2sgdGhlIHRvcCBsZXZlbAotCQlpZiAoaGFzQmVlbk1vZGlmaWVkKGZpbGVQYXRoKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGNoZWNrIGFsbCBpbmNsdWRlZXMKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBmSW5jbHVkZTJUaW1lc3RhbXBNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCWlmIChoYXNCZWVuTW9kaWZpZWQoKElQYXRoKSBpdGVyLm5leHQoKSkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaGFzQmVlbk1vZGlmaWVkKElQYXRoIGZpbGVQYXRoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIHF1aWNrIGZpbGVuYW1lL3RpbWVzdGFtcCBjYWNoZSBjaGVjayBoZXJlLi4uCi0JCUlGaWxlIGYgPSBudWxsOwotCQlpZiAoZiA9PSBudWxsICYmIGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCX0KLQkJaWYgKGYgIT0gbnVsbCAmJiBmLmV4aXN0cygpKSB7Ci0JCQlMb25nIGN1cnJlbnRTdGFtcCA9IG5ldyBMb25nKGYuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSk7Ci0JCQlPYmplY3QgbyA9IGZJbmNsdWRlMlRpbWVzdGFtcE1hcC5nZXQoZmlsZVBhdGgpOwotCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCUxvbmcgcHJldmlvdXNTdGFtcCA9IChMb25nKSBvOwotCQkJCS8vIHN0YW1wcyBkb24ndCBtYXRjaCwgZmlsZSBjaGFuZ2VkCi0JCQkJaWYgKGN1cnJlbnRTdGFtcC5sb25nVmFsdWUoKSAhPSBwcmV2aW91c1N0YW1wLmxvbmdWYWx1ZSgpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCS8vIHN0b3JlIGZvciBuZXh0IHRpbWUKLQkJCQkJZkluY2x1ZGUyVGltZXN0YW1wTWFwLnB1dChmaWxlUGF0aCwgY3VycmVudFN0YW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyByZXR1cm4gdHJ1ZSwgc2luY2Ugd2UndmUgbm90IGVuY291bnRlcmVkIHRoaXMgZmlsZSB5ZXQuCi0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkvLyBzdG9yZSBmb3IgbmV4dCB0aW1lCi0JCQkJZkluY2x1ZGUyVGltZXN0YW1wTWFwLnB1dChmaWxlUGF0aCwgY3VycmVudFN0YW1wKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluZGV4Q2hhbmdlZChJVGFnbGliSW5kZXhEZWx0YSBldmVudCkgewotCQlzeW5jaHJvbml6ZWQgKGdldFNoYXJlZERvY3VtZW50Q2FjaGUoKSkgewotCQkJSXRlcmF0b3IgdmFsdWVzID0gZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAodmFsdWVzLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvID0gdmFsdWVzLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkgewotCQkJCQl2YWx1ZXMucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHRhZ2xpYiBmcm9tIHRoZSBzcGVjaWZpZWQgVVJJLiBJdCBtdXN0IHBvaW50IHRvIGEgdmFsaWQKLQkgKiB0YWdsaWIgZGVzY3JpcHRvciB0byB3b3JrLgotCSAqLwotCXByb3RlY3RlZCBUTERDTURvY3VtZW50RGVzY3JpcHRvciBsb2FkVGFnbGliKFN0cmluZyB1cmkpIHsKLQkJVExEQ01Eb2N1bWVudERlc2NyaXB0b3IgZW50cnkgPSBudWxsOwotCQlJUGF0aCBjdXJyZW50UGF0aCA9IGdldEN1cnJlbnRQYXJzZXJQYXRoKCk7Ci0JCWlmIChjdXJyZW50UGF0aCAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gVGFnbGliSW5kZXgucmVzb2x2ZShjdXJyZW50UGF0aC50b1N0cmluZygpLCB1cmksIGZhbHNlKTsKLQkJCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJCWRvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudEJ1aWxkZXIoKS5jcmVhdGVDTURvY3VtZW50KHJlY29yZCk7Ci0JCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJZW50cnkgPSBuZXcgVExEQ01Eb2N1bWVudERlc2NyaXB0b3IoKTsKLQkJCQkJZW50cnkuZG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJCQkJZW50cnkuY2FjaGVLZXkgPSBnZXRVbmlxdWVJZGVudGlmaWVyKHJlY29yZCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogTm90IGEgdmVyeS1vZnRlbiB1c2VkIGNvZGUgcGF0aCAod2UgaG9wZSkgKi8KLQkJCQlJUGF0aCBjdXJyZW50QmFzZUxvY2F0aW9uID0gZ2V0Q3VycmVudEJhc2VMb2NhdGlvbigpOwotCQkJCWlmIChjdXJyZW50QmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGN1cnJlbnRCYXNlTG9jYXRpb24udG9TdHJpbmcoKSwgbnVsbCwgdXJpKTsKLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRpbmcgdGFncyBmcm9tICIgKyB1cmkgKyAiIGF0ICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlkb2N1bWVudCA9IGdldENNRG9jdW1lbnRCdWlsZGVyKCkuY3JlYXRlQ01Eb2N1bWVudChsb2NhdGlvbik7Ci0JCQkJCQllbnRyeSA9IG5ldyBUTERDTURvY3VtZW50RGVzY3JpcHRvcigpOwotCQkJCQkJZW50cnkuZG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJCQkJCWVudHJ5LmNhY2hlS2V5ID0gbG9jYXRpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0VGFnbGliVHJhY2tlcnMoKSB7Ci0JCWlmIChfZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgY2xlYXJlZCBpdHMgdGFnbGliIHRyYWNrZXJzXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByZWx1ZGVzSGFuZGxlZCA9IGZhbHNlOwotCQlnZXRUYWdsaWJUcmFja2VycygpLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlUGFyc2VyKEpTUFNvdXJjZVBhcnNlciBwYXJzZXIpIHsKLQkJaWYgKGZQYXJzZXIgIT0gbnVsbCkKLQkJCWZQYXJzZXIucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCkpOwotCQlmUGFyc2VyID0gcGFyc2VyOwotCQlpZiAoZlBhcnNlciAhPSBudWxsKQotCQkJZlBhcnNlci5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERGdW5jdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERGdW5jdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0NzExYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExERnVuY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFRMREZ1bmN0aW9uSW1wbCBpbXBsZW1lbnRzIFRMREZ1bmN0aW9uIHsKLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZEaXNwbGF5TmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkV4YW1wbGUgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkljb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZOYW1lID0gbnVsbDsKLQotCXByaXZhdGUgQ01Eb2N1bWVudCBmT3duZXJEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlNpZ25hdHVyZSA9IG51bGw7Ci0KLQlwdWJsaWMgVExERnVuY3Rpb25JbXBsKENNRG9jdW1lbnQgb3duZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyRG9jdW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsYXNzTmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGZDbGFzc05hbWU7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRpc3BsYXlOYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBmRGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleGFtcGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGZFeGFtcGxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXh0ZW5zaW9ucy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gZkV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpY29uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWNvbigpIHsKLQkJcmV0dXJuIGZJY29uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG93bmVyRG9jdW1lbnQuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZPd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2lnbmF0dXJlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQlyZXR1cm4gZlNpZ25hdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogICAgICAgICAgICBUaGUgY2xhc3NOYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlmQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpc3BsYXlOYW1lCi0JICogICAgICAgICAgICBUaGUgZGlzcGxheU5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSkgewotCQlmRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhhbXBsZQotCSAqICAgICAgICAgICAgVGhlIGV4YW1wbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4YW1wbGUoU3RyaW5nIGV4YW1wbGUpIHsKLQkJZkV4YW1wbGUgPSBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpY29uCi0JICogICAgICAgICAgICBUaGUgaWNvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvbihTdHJpbmcgaWNvbikgewotCQlmSWNvbiA9IGljb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZOYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2lnbmF0dXJlCi0JICogICAgICAgICAgICBUaGUgc2lnbmF0dXJlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaWduYXR1cmUoU3RyaW5nIHNpZ25hdHVyZSkgewotCQlmU2lnbmF0dXJlID0gc2lnbmF0dXJlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW1JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExESW5pdFBhcmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNkZmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERJbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERJbml0UGFyYW1JbXBsIGltcGxlbWVudHMgVExESW5pdFBhcmFtIHsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JcHVibGljIFRMREluaXRQYXJhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkZXNjcmlwdGlvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldERlc2NyaXB0aW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhbHVlOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VmFsdWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExETGlzdGVuZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExETGlzdGVuZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZWY5OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRExpc3RlbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExETGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBUTERMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBsaXN0ZW5lckNsYXNzOwotCi0JcHVibGljIFN0cmluZyBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJbGlzdGVuZXJDbGFzcyA9IGNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IGxpc3RlbmVyIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TGlzdGVuZXJDbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERWYWxpZGF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFsaWRhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDZmNzQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgVExEVmFsaWRhdG9ySW1wbCBpbXBsZW1lbnRzIFRMRFZhbGlkYXRvciB7Ci0JcHJvdGVjdGVkIExpc3QgaW5pdFBhcmFtczsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRvckNsYXNzOwotCi0JcHVibGljIExpc3QgZ2V0SW5pdFBhcmFtcygpIHsKLQkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkKLQkJCWluaXRQYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBpbml0UGFyYW1zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3JDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbml0UGFyYW1zKExpc3QgaW5pdFBhcmFtcykgewotCQl0aGlzLmluaXRQYXJhbXMgPSBpbml0UGFyYW1zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvckNsYXNzKFN0cmluZyB2YWxpZGF0b3JDbGFzcykgewotCQl0aGlzLnZhbGlkYXRvckNsYXNzID0gdmFsaWRhdG9yQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB2YWxpZGF0b3IgY2xhc3M6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRWYWxpZGF0b3JDbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBpbml0LXBhcm1zOiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0SW5pdFBhcmFtcygpLnNpemUoKTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGdldEluaXRQYXJhbXMoKS5nZXQoaSkudG9TdHJpbmcoKSwgIlxuIiwgIlxuXHRcdCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhcmlhYmxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhcmlhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdiNzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERWYXJpYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgVExEVmFyaWFibGVJbXBsIGltcGxlbWVudHMgVExEVmFyaWFibGUgewotCS8vIG9wdGlvbmFsIC0gZGVmYXVsdHMgdG8gdHJ1ZQotCXByaXZhdGUgYm9vbGVhbiBkZWNsYXJlID0gdHJ1ZTsKLQotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbjsKLQkvLyByZXF1aXJlZAotCXByaXZhdGUgU3RyaW5nIG5hbWVGcm9tQXR0cmlidXRlOwotCS8vIHJlcXVpcmVkCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZUdpdmVuOwotCS8vIG9wdGlvbmFsIC0gZGVmYXVsdHMgdG8gTkVTVEVECi0JcHJpdmF0ZSBTdHJpbmcgc2NvcGUgPSBKU1AxMlRMRE5hbWVzLlZBUklBQkxFX1NDT1BFX05FU1RFRDsKLQkvLyByZXF1aXJlZCAtIGRlZmF1bHRzIHRvIGEgU3RyaW5nCi0JcHJpdmF0ZSBTdHJpbmcgdmFyaWFibGVDbGFzcyA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZkFsaWFzOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVjbGFyZSgpIHsKLQkJcmV0dXJuIGRlY2xhcmU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBuYW1lRnJvbUF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVHaXZlbigpIHsKLQkJcmV0dXJuIG5hbWVHaXZlbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZUNsYXNzKCkgewotCQlyZXR1cm4gdmFyaWFibGVDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJlKGJvb2xlYW4gZGVjbGFyZSkgewotCQl0aGlzLmRlY2xhcmUgPSBkZWNsYXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY2xhcmVTdHJpbmcoU3RyaW5nIGRlY2wpIHsKLQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJc2V0RGVjbGFyZShkZWNsLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRSVUUpIHx8IGRlY2wuZXF1YWxzKEpTUDEyVExETmFtZXMuWUVTKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVGcm9tQXR0cmlidXRlKFN0cmluZyBuYW1lRnJvbUF0dHJpYnV0ZSkgewotCQl0aGlzLm5hbWVGcm9tQXR0cmlidXRlID0gbmFtZUZyb21BdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZUdpdmVuKFN0cmluZyBuYW1lR2l2ZW4pIHsKLQkJdGhpcy5uYW1lR2l2ZW4gPSBuYW1lR2l2ZW47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCXRoaXMuc2NvcGUgPSBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZUNsYXNzKFN0cmluZyB2YXJpYWJsZUNsYXNzKSB7Ci0JCXRoaXMudmFyaWFibGVDbGFzcyA9IHZhcmlhYmxlQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lIGdpdmVuOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TmFtZUdpdmVuKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IG5hbWUgZnJvbSBhdHRyaWJ1dGU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXROYW1lRnJvbUF0dHJpYnV0ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQm9vbGVhbi50b1N0cmluZyhib29sZWFuKSBpcyBpbnRyb2R1Y2VkIGluIEpESyAxLjQKLQkJLy8gYnVmZmVyLmFwcGVuZCgiXG5cdCBkZWNsYXJlOiIgKwotCQkvLyBTdHJpbmdVdGlscy5lc2NhcGUoQm9vbGVhbi50b1N0cmluZyhnZXREZWNsYXJlKCkpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGVjbGFyZToiICsgU3RyaW5nVXRpbHMudG9TdHJpbmcoZ2V0RGVjbGFyZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBzY29wZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFNjb3BlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhcmlhYmxlIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VmFyaWFibGVDbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7Ci0JCXJldHVybiBmQWxpYXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpYXMoU3RyaW5nIGFsaWFzKSB7Ci0JCWZBbGlhcyA9IGFsaWFzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UYWdsaWJUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVGFnbGliVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODM1MWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UYWdsaWJUcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50V3JhcHBlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50VHJhY2tlcjsKLQotLyoqCi0gKiBUYWdsaWJUcmFja2VyIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJUcmFja2VyIGV4dGVuZHMgQ01Eb2N1bWVudFdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudFRyYWNrZXIgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQlwdWJsaWMgVGFnbGliVHJhY2tlcihTdHJpbmcgbmV3VVJJLCBTdHJpbmcgbmV3UHJlZml4LCBDTURvY3VtZW50IHRsZCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCXN1cGVyKG5ld1VSSSwgbmV3UHJlZml4LCB0bGQpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gYVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFByZWZpeCgpICsgIkAiICsgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTFUTEROYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDExVExETmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0OTU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTFUTEROYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDExVExETmFtZXMgewotCi0JU3RyaW5nIFRBR0xJQiA9ICJ0YWdsaWIiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQ09OVEVOVF9KU1AgPSAiSlNQIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05URU5UX0VNUFRZID0gImVtcHR5IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05URU5UX1RBR0RFUEVOREVOVCA9ICJ0YWdkZXBlbmRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHID0gInRhZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQVkVSU0lPTiA9ICJqc3B2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUTElCVkVSU0lPTiA9ICJ0bGlidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0hPUlROQU1FID0gInNob3J0bmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVJOID0gInVybiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5GTyA9ICJpbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEVJQ0xBU1MgPSAidGVpY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBR0NMQVNTID0gInRhZ2NsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBCT0RZQ09OVEVOVCA9ICJib2R5Y29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUklCVVRFID0gImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJURVhQUlZBTFVFID0gInJ0ZXhwcnZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFBSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgSU5DTFVERSA9ICJpbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWUVTID0gInllcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTk8gPSAibm8iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTJUTEROYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDEyVExETmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiMzEyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTJUTEROYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDEyVExETmFtZXMgewotCi0JU3RyaW5nIFRBR0xJQiA9IEpTUDExVExETmFtZXMuVEFHTElCOwotCi0JU3RyaW5nIENPTlRFTlRfSlNQID0gSlNQMTFUTEROYW1lcy5DT05URU5UX0pTUDsKLQlTdHJpbmcgQ09OVEVOVF9FTVBUWSA9IEpTUDExVExETmFtZXMuQ09OVEVOVF9FTVBUWTsKLQlTdHJpbmcgQ09OVEVOVF9UQUdERVBFTkRFTlQgPSBKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UOwotCi0JU3RyaW5nIFRBRyA9IEpTUDExVExETmFtZXMuVEFHOwotCVN0cmluZyBKU1BfVkVSU0lPTiA9ICJqc3AtdmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVExJQl9WRVJTSU9OID0gInRsaWItdmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0hPUlRfTkFNRSA9ICJzaG9ydC1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUkkgPSBKU1AxMVRMRE5hbWVzLlVSSTsKLQlTdHJpbmcgVVJOID0gSlNQMTFUTEROYW1lcy5VUk47Ci0KLQlTdHJpbmcgTkFNRSA9IEpTUDExVExETmFtZXMuTkFNRTsKLQlTdHJpbmcgVEVJX0NMQVNTID0gInRlaS1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHX0NMQVNTID0gInRhZy1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQk9EWV9DT05URU5UID0gImJvZHktY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUklCVVRFID0gSlNQMTFUTEROYW1lcy5BVFRSSUJVVEU7Ci0KLQlTdHJpbmcgSUQgPSBKU1AxMVRMRE5hbWVzLklEOwotCVN0cmluZyBSRVFVSVJFRCA9IEpTUDExVExETmFtZXMuUkVRVUlSRUQ7Ci0JU3RyaW5nIFJURVhQUlZBTFVFID0gSlNQMTFUTEROYW1lcy5SVEVYUFJWQUxVRTsKLQotCVN0cmluZyBQUkVGSVggPSBKU1AxMVRMRE5hbWVzLlBSRUZJWDsKLQotCVN0cmluZyBJTkNMVURFID0gSlNQMTFUTEROYW1lcy5JTkNMVURFOwotCVN0cmluZyBGSUxFID0gSlNQMTFUTEROYW1lcy5GSUxFOwotCi0JU3RyaW5nIFRSVUUgPSBKU1AxMVRMRE5hbWVzLlRSVUU7Ci0JU3RyaW5nIEZBTFNFID0gSlNQMTFUTEROYW1lcy5GQUxTRTsKLQlTdHJpbmcgWUVTID0gSlNQMTFUTEROYW1lcy5ZRVM7Ci0JU3RyaW5nIE5PID0gSlNQMTFUTEROYW1lcy5OTzsKLQotCS8qCi0JICogQHNlZSBFY2xpcHNlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERJU1BMQVlfTkFNRSA9ICJkaXNwbGF5LW5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNNQUxMX0lDT04gPSAic21hbGwtaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTEFSR0VfSUNPTiA9ICJsYXJnZS1pY29uIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlTdHJpbmcgVkFMSURBVE9SID0gInZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMSURBVE9SX0NMQVNTID0gInZhbGlkYXRvci1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMSURBVE9SX0lOSVRfUEFSQU0gPSAiaW5pdC1wYXJhbSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMSURBVE9SX1BBUkFNX05BTUUgPSAicGFyYW0tbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMSURBVE9SX1BBUkFNX1ZBTFVFID0gInBhcmFtLXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlTdHJpbmcgTElTVEVORVIgPSAibGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIExJU1RFTkVSX0NMQVNTID0gImxpc3RlbmVyLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFZBUklBQkxFID0gInZhcmlhYmxlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9OQU1FX0dJVkVOID0gIm5hbWUtZ2l2ZW4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX05BTUVfRlJPTV9BVFRSSUJVVEUgPSAibmFtZS1mcm9tLWF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfQ0xBU1MgPSAidmFyaWFibGUtY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX0RFQ0xBUkUgPSAiZGVjbGFyZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfU0NPUEUgPSAic2NvcGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX1NDT1BFX05FU1RFRCA9ICJORVNURUQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX1NDT1BFX0FUX0JFR0lOID0gIkFUX0JFR0lOIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9TQ09QRV9BVF9FTkQgPSAiQVRfRU5EIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDIwVExETmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AyMFRMRE5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MmFlNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDIwVExETmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotLyogbmxzWFhYICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDIwVExETmFtZXMgZXh0ZW5kcyBKU1AxMlRMRE5hbWVzIHsKLQlTdHJpbmcgQ09OVEVOVF9TQ1JJUFRMRVNTID0gInNjcmlwdGxlc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYQU1QTEUgPSAiZXhhbXBsZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlJBR01FTlQgPSAiZnJhZ21lbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZVTkNUSU9OID0gImZ1bmN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGVU5DVElPTl9DTEFTUyA9ICJmdW5jdGlvbi1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlVOQ1RJT05fRVhURU5TSU9OID0gImZ1bmN0aW9uLWV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlVOQ1RJT05fU0lHTkFUVVJFID0gImZ1bmN0aW9uLXNpZ25hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSUNPTiA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQQVRIID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBR19FWFRFTlNJT04gPSAidGFnLWV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHX0ZJTEUgPSAidGFnLWZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHRElSID0gInRhZ2RpciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQUdMSUJfRVhURU5TSU9OID0gInRhZ2xpYi1leHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgRFlOQU1JQ19BVFRSSUJVVEVTID0gImR5bmFtaWMtYXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0NSSVBUSU5HX0xBTkdVQUdFID0gImxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJU19FTF9JR05PUkVEID0gImlzRUxJZ25vcmVkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQQUdFX0VOQ09ESU5HID0gInBhZ2VFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9BTElBUyA9ICJhbGlhcyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERBdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTdlZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZyb20gYSBUTEQKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiBleHRlbmRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JLyoqCi0JICogYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAc2VlICBKU1AgMi4wCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JCi0JLyoqCi0JICogdGhlIGF0dHJpYnV0ZSdzIG5hbWUKLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQlDTURvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUgYnkgYW4gZXhwcmVzc2lvbgotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0UnRleHBydmFsdWUoKTsKLQotCS8qKgotCSAqIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZyYWdtZW50Ci0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0ZyYWdtZW50KCk7Ci0JCi0JLyoqCi0JICogaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbAotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTEREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMzUxZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVExERG9jdW1lbnQgZXh0ZW5kcyBDTURvY3VtZW50IHsKLQotCVN0cmluZyBDTV9LSU5EID0gIkNvbnRlbnQgTW9kZWwgS2luZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX1RMRCA9ICJKU1AgVGFnIExpYnJhcnkgRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBzZWUgIEpTUCAyLjAKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpOwotCQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAiZGVzY3JpcHRpb24iIGVsZW1lbnQgb2YgYSBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwgc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUuCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgY29udGVudHMgb2YgdGhlICJkaXNwbGF5LW5hbWUiIGVsZW1lbnQgb2YgYSBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGl0IGlzIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scwotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gTGlzdCAtIEEgbGlzdCBvZiBleHRlbnNpb24gZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgdGFnIGxpYnJhcnkKLQkgKiBAc2VlICBKU1AgMi4wCi0JICovCi0JTGlzdCBnZXRFeHRlbnNpb25zKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBMaXN0IC0gQSBsaXN0IG9mIFRMREZ1bmN0aW9ucyBkZXNjcmliaW5nIHRoZSBkZWNsYXJlZCBmdW5jdGlvbnMKLQkgKiBAc2VlICBKU1AgMi4wCi0JICovCi0JTGlzdCBnZXRGdW5jdGlvbnMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSBjb250ZW50cyBvZiB0aGUgImluZm8iIGVsZW1lbnQgb2YgYSBKU1AgMS4xIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwgc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUuCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRJbmZvKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSB2ZXJzaW9uIG9mIEpTUCB0aGUgdGFnIGxpYnJhcnkgZGVwZW5kcyB1cG9uCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRKc3B2ZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSBjb250ZW50cyBvZiB0aGUgImxhcmdlLWljb24iIGVsZW1lbnQgb2YgYSBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IG9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0TGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBAc2VlICBKU1AgMS4yCi0JICogQHJldHVybiBMaXN0IC0gYSBMaXN0IG9mIFRMRExpc3RlbmVycwotCSAqLwotCUxpc3QgZ2V0TGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIEEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJyZWQgcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRTaG9ydG5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAic21hbGwtaWNvbiIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgb3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXRTbWFsbEljb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IChpdCdzIGltcGxlbWVudGF0aW9uKQotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0VGxpYnZlcnNpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIFVSSSBkZWNsYXJlZCB3aXRoaW4gdGhlIGRlc2NyaXB0b3IKLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFVyaSgpOwotCi0JLyoqCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVRMRFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERFbGVtZW50RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERFbGVtZW50RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1NzE2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERWxlbWVudERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBUTERFbGVtZW50RGVjbGFyYXRpb24gZXh0ZW5kcyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0JU3RyaW5nIFRBR19TT1VSQ0UgPSAiVGFnIERlZmluaXRpb24gU291cmNlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTT1VSQ0VfSlNQX1RMRCA9ICJKU1AgVGFnIExpYnJhcnkgRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU09VUkNFX1RBR19GSUxFID0gIkpTUCBUYWcgMi4wIEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgYm9keSBjb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0Qm9keWNvbnRlbnQoKTsKLQotCS8qKgotCSAqIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCSAqIAotCSAqIEBzZWUgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCi0JICogCi0JICogQHNlZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgdGFnCi0JICogCi0JICogQHNlZSBKU1AgMi4wCi0JICovCi0JU3RyaW5nIGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywKLQkgKiBmb3IgdG9vbCBjb25zdW1wdGlvbgotCSAqIAotCSAqIEBzZWUgSlNQIDIuMAotCSAqLwotCUxpc3QgZ2V0RXh0ZW5zaW9ucygpOwotCi0JLyoqCi0JICogT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0JICogCi0JICogQHNlZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldEluZm8oKTsKLQotCS8qKgotCSAqIE5hbWUgb2YgYW4gb3B0aW9uYWwgbGFyZ2UgaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0JICogCi0JICogQHNlZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldExhcmdlSWNvbigpOwotCi0JQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUKLQkgKiByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gb3IgdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhIHRhZwotCSAqIGxpYnJhcnkgcGFja2FnZWQgaW4gYSBKQVIuIFRoaXMgbXVzdCBiZWdpbiB3aXRoIC9XRUItSU5GL3RhZ3MgaWYgdGhlCi0JICogLnRhZyBmaWxlIHJlc2lkZXMgaW4gdGhlIFdBUiwgb3IgL01FVEEtSU5GL3RhZ3MgaWYgdGhlIC50YWcgZmlsZQotCSAqIHJlc2lkZXMgaW4gYSBKQVIuCi0JICogCi0JICogCi0JICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgLnRhZyh4KSBmaWxlIGFzIGRlZmluZWQgaW4gdGhlIC50bGQgZmlsZSwgbnVsbAotCSAqICAgICAgICAgaWYgaW50ZXJuYWwgdG8gdGhlIC50bGQKLQkgKiBAc2VlIEpTUCAyLjAKLQkgKi8KLQlTdHJpbmcgZ2V0UGF0aCgpOwotCi0JLyoqCi0JICogTmFtZSBvZiBhbiBvcHRpb25hbCBzbWFsbCBpY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0U21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCi0JICogamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZwotCSAqIAotCSAqIEBzZWUgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRUYWdjbGFzcygpOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgYW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YKLQkgKiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0JICogCi0JICogQHNlZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFRlaWNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAc2VlIEpTUCAxLjIKLQkgKiBAcmV0dXJuIExpc3Qgb2YgVExEVmFyaWFibGVzCi0JICovCi0JTGlzdCBnZXRWYXJpYWJsZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERGdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0M2U5NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBUTERGdW5jdGlvbiB7Ci0KLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0JCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCVN0cmluZyBnZXRFeGFtcGxlKCk7Ci0KLQlMaXN0IGdldEV4dGVuc2lvbnMoKTsKLQotCVN0cmluZyBnZXRJY29uKCk7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExESW5pdFBhcmFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExESW5pdFBhcmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZDA5YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREluaXRQYXJhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogQSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gYWxvbmcgd2l0aCBhIGRlc2NyaXB0aW9uCi0gKiBAc2VlIEpTUCAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERJbml0UGFyYW0gewotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExETGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDZmMGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogRGVmaW5lcyBhbiBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBvYmplY3QgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkKLSAqIEBzZWUgSlNQIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRMRExpc3RlbmVyIHsKLQlTdHJpbmcgZ2V0TGlzdGVuZXJDbGFzcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVlNzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogRGVmaW5lcyBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5Ci0gKiBAc2VlIEpTUCAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERWYWxpZGF0b3IgewotCS8qKgotCSAqIEByZXR1cm4gTGlzdCAtIGEgTGlzdCBvZiBUTERJbml0UGFyYW1zCi0JICovCi0JTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLQlTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERWYXJpYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTM4MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhcmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogSW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgZGVmaW5lZCBieSB0aGlzIHRhZy4KLSAqIAotICogQHNlZSBKU1AgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVExEVmFyaWFibGUgewotCi0JLyoqCi0JICogV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LCB0cnVlIGlzIHRoZSBkZWZhdWx0LgotCSAqLwotCWJvb2xlYW4gZ2V0RGVjbGFyZSgpOwotCi0JLyoqCi0JICogQHJldHVybnRoZSB0aGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgdmFyaWFibGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZQotCSAqIG5hbWUgb2YgdGhlIHZhcmlhYmxlLCBvciBudWxsIG9mIHRoZSBuYW1lIGlzIG5vdCB0byBiZSBvYnRhaW5lZCB0aGlzCi0JICogd2F5LgotCSAqLwotCVN0cmluZyBnZXROYW1lRnJvbUF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogVGhlIHZhcmlhYmxlIG5hbWUgZ2l2ZW4gYXMgYSBjb25zdGFudCwgb3IgbnVsbCBvZiB0aGUgbmFtZSBpcyBub3QKLQkgKiBzcGVjaWZpZWQuCi0JICovCi0JU3RyaW5nIGdldE5hbWVHaXZlbigpOwotCi0JLyoqCi0JICogVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgZGVmaW5lZC4KLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZSwgamF2YS5sYW5nLlN0cmluZyBpZiBudWxsCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmxlQ2xhc3MoKTsKLQotCS8qKgotCSAqIEEgbG9jYWxseSBzY29wZWQgYXR0cmlidXRlIHRvIGhvbGQgdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0pTUEZDb250ZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWNlOTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJvcGVydGllcyBjb25zdGFudHMgdXNlZCBieSBKU1AgRnJhZ21lbnRzLiBDbGllbnRzIHNob3VsZCBvbmx5IHJlYWQgYW5kCi0gKiBtb2RpZnkgdGhlIEpTUCBGcmFnbWVudCBwcm9wZXJ0aWVzIHByb2dyYW1tYXRpY2FsbHkgdXNpbmcgdGhpcyBjbGFzcy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUENPUkVfSUQgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9LRVkgPSAiPHByb2plY3Q+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBuYW1lZCBrZXkgdGhhdCBjb250cm9scyB0aGUgZGVmYXVsdCBsYW5ndWFnZSBmb3IgSlNQIEZyYWdtZW50cwotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUExBTkdVQUdFID0gImpzcC1sYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBIG5hbWVkIGtleSB0aGF0IGNvbnRyb2xzIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZSBmb3IgSlNQIEZyYWdtZW50cwotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUENPTlRFTlRUWVBFID0gImpzcC1jb250ZW50LXR5cGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIEpTUCBmcmFnbWVudHMgc2hvdWxkIGJlIGNvbXBpbGVkL3ZhbGlkYXRlZC4gSlNQIGZyYWdtZW50cwotCSAqIHdpbGwgYmUgdmFsaWRhdGVkIHdoZW4gdHJ1ZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9GUkFHTUVOVFMgPSAidmFsaWRhdGVGcmFnbWVudHMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aAotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRoZSBrZXkgd2lsbCBiZSBiYXNlZCBvZmYgb2YKLQkgKiBAcmV0dXJuIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aCAoYmFzaWNhbGx5IHRoZQotCSAqICAgICAgICAgcmVzb3VyY2VQYXRoIHdpdGhvdXQgdGhlIGZpbGVuYW1lKTsgUFJPSkVDVF9LRVkgaWYgcmVzb3VyY2VQYXRoCi0JICogICAgICAgICBpcyBudWxsCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRLZXlGb3IoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCVN0cmluZyBrZXkgPSBQUk9KRUNUX0tFWTsKLQkJaWYgKHJlc291cmNlUGF0aCAhPSBudWxsICYmIHJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWtleSA9IHJlc291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByZWZlcmVuY2VzIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqIHByZWZlcmVuY2Uga2V5IChzdWJOb2RlKSBJZiBjcmVhdGUgaXMgdHJ1ZSwgdGhlIHByZWZlcmVuY2Ugbm9kZSB3aWxsIGJlCi0JICogY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGUgcHJlZmVyZW5jZSBub2RlIGlzIHVuZGVyCi0JICogQHBhcmFtIHByZWZlcmVuY2VLZXkKLQkgKiAgICAgICAgICAgIHRoZSBzdWJub2RlL2NhdGVnb3J5IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgbG9jYXRlZCBpbgotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGEgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QKLQkgKiAgICAgICAgICAgIGFscmVhZHkgZXhpc3QKLQkgKiBAcmV0dXJuIFByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdCBzY29wZSBhbmQKLQkgKiAgICAgICAgIHByZWZlcmVuY2Uga2V5LiBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgZm91bmQgYW5kIGNyZWF0ZSBpcwotCSAqICAgICAgICAgZmFsc2UKLQkgKi8KLQlzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZlcmVuY2VLZXksIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmIChjcmVhdGUpCi0JCQkvLyBjcmVhdGUgYWxsIG5vZGVzIGRvd24gdG8gdGhlIG9uZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotCQkJcmV0dXJuIG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCkuZ2V0Tm9kZShKU1BDT1JFX0lEKS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQkvLyBiZSBjYXJlZnVsIGxvb2tpbmcgdXAgZm9yIG91ciBub2RlIHNvIG5vdCB0byBjcmVhdGUgYW55IG5vZGVzIGFzCi0JCS8vIHNpZGUgZWZmZWN0Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpLm5vZGUoUHJvamVjdFNjb3BlLlNDT1BFKTsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gb25jZSBidWcgOTA1MDAgaXMgZml4ZWQsIHNob3VsZCBiZSBhcyBzaW1wbGUgYXMgdGhpczoKLQkJCS8vIFN0cmluZyBwYXRoID0gcHJvamVjdC5nZXROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUyArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBFTkNPRElOR19QUkVGX05PREU7Ci0JCQkvLyByZXR1cm4gbm9kZS5ub2RlRXhpc3RzKHBhdGgpID8gbm9kZS5ub2RlKHBhdGgpIDogbnVsbDsKLQkJCS8vIGZvciBub3csIHRha2UgdGhlIGxvbmcgd2F5Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhwcm9qZWN0LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKEpTUENPUkVfSUQpKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUubm9kZShKU1BDT1JFX0lEKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByZWZlcmVuY2VLZXkpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5vZGUubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vZGVFeGlzdHMgZmFpbGVkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IHJldHJpZXZlIHByZWZlcmVuY2Ugbm9kZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb250ZXh0IGlzCi0JICogICAgICAgICAgICBhdmFpbGFibGUgYW5kIHRoZSB3b3Jrc3BhY2Ugc2V0dGluZyBzaG91bGQgYmUgdGFrZW4uIE5vdGUKLQkgKiAgICAgICAgICAgIHRoYXQgcGFzc2luZyA8Y29kZT5udWxsPC9jb2RlPiBzaG91bGQgYmUgYXZvaWRlZC4KLQkgKiBAcGFyYW0gcmVjdXJzZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgcGFyZW50IHNob3VsZCBiZSBxdWVyaWVkIHRpbGwgcHJvcGVydHkgaXMgZm91bmQKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBrZXkuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlKSB7Ci0JCVN0cmluZyB2YWwgPSBudWxsOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJCXZhbCA9IGludGVybmFsR2V0UHJvcGVydHkocmVzb3VyY2UsIHJlY3Vyc2UsIHByZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gcHJlZmVyZW5jZXMgZm91bmQgLSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKLQkJLy8gc2hvcnQtY2lyY3VpdAotCQkvLyBsb29rdXAgYnkgZmFsbGluZyBiYWNrIHRvIHdvcmtzcGFjZSdzIGRlZmF1bHQKLQkJLy8gc2V0dGluZwotCQlpZiAodmFsID09IG51bGwgJiYgcmVjdXJzZSkKLQkJCXZhbCA9IGdldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoSlNQQ09SRV9JRCwga2V5LCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxHZXRQcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVjdXJzZSwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgbnVsbCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsICYmIHJlc291cmNlICE9IHJlc291cmNlLmdldFByb2plY3QoKSAmJiByZWN1cnNlKSB7Ci0JCQl2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IobnVsbCksIG51bGwpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRleHQuIE5vdGUgY29udGV4dCBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGtleS4gSWYgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRoZSBrZXkgaXMgcmVtb3ZlZCBmcm9tIHByb3BlcnRpZXMuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCXByZWZlcmVuY2VzLnJlbW92ZShnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCWVsc2UKLQkJCQkJcHJlZmVyZW5jZXMucHV0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgdmFsdWUpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIHNhdmUgY2hhbmdlcwotCQkJCQlwcmVmZXJlbmNlcy5mbHVzaCgpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BDT1JFX0lELCBJU3RhdHVzLkVSUk9SLCAiVW5hYmxlIHRvIHNldCBwcm9wZXJ0eSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyBqdXN0IHNldCBhIHByZWZlcmVuY2UgaW4gdGhlIGluc3RhbmNlIHNjb3BlCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKSB7Ci0JCS8vIHNldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJLy8gfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2Q0Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXIgewotCXB1YmxpYyBKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWZKb2IgPSBuZXcgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciBfaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGZKb2I7Ci0KLQkvKioKLQkgKiBUaGlzIGpvYiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiB0byBzY2hlZHVsZSBvcGVyYXRpb25zIHRoYXQgbmVlZCB0byBtb2RpZnkgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX1VQREFURV9ERUxBWSA9IDUwMDsKLQkJcHJpdmF0ZSBMaXN0IGFzeW5jQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCkgewotCQkJc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoYW5nZXMoU2V0IG5ld0NoYW5nZXMpIHsKLQkJCWlmIChuZXdDaGFuZ2VzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCWFzeW5jQ2hhbmdlcy5hZGRBbGwobmV3Q2hhbmdlcyk7Ci0JCQkJYXN5bmNDaGFuZ2VzLm5vdGlmeSgpOwotCQkJfQotCQkJc2NoZWR1bGUoUFJPUEVSVElFU19VUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldE5leHRDaGFuZ2UoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiBhc3luY0NoYW5nZXMuaXNFbXB0eSgpID8gbnVsbCA6IChJUHJvamVjdCkgYXN5bmNDaGFuZ2VzLnJlbW92ZShhc3luY0NoYW5nZXMuc2l6ZSgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPUkVfSUQsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBKU1BDb3JlTWVzc2FnZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgbnVsbCk7Ci0JCQltb25pdG9yID0gbW9uaXRvciA9PSBudWxsID8gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSA6IG1vbml0b3I7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKEpTUENvcmVNZXNzYWdlcy5KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBhc3luY0NoYW5nZXMuc2l6ZSgpKTsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdCBuZXh0OwotCQkJCQl3aGlsZSAoKG5leHQgPSBnZXROZXh0Q2hhbmdlKCkpICE9IG51bGwpIHsKLQkJCQkJCS8vIGp1c3QgZXhpdCBpZiB0aGUgc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gb3IgaGFzCi0JCQkJCQkvLyBiZWVuIHNodXQgZG93bgotCQkJCQkJLy8gaXQgaXMgdG9vIGxhdGUgdG8gY2hhbmdlIHRoZSB3b3Jrc3BhY2UgYXQgdGhpcwotCQkJCQkJLy8gcG9pbnQgYW55d2F5Ci0JCQkJCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5vc2dpIikuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHNhdmUgdGhlIHByZWZlcmVuY2VzIG5vZGVzCi0JCQkJCQkJaWYgKG5leHQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJLy8gc2F2ZSBjb250ZW50IHR5cGUgcHJlZmVyZW5jZXMKLQkJCQkJCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKG5leHQsIEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BDT05URU5UVFlQRSwgZmFsc2UpOwotCQkJCQkJCQlpZiAocHJvamVjdFByZWZzICE9IG51bGwpCi0JCQkJCQkJCQlwcm9qZWN0UHJlZnMuZmx1c2goKTsKLQkJCQkJCQkJLy8gc2F2ZSBsYW5ndWFnZSBwcmVmZXJlbmNlcwotCQkJCQkJCQlwcm9qZWN0UHJlZnMgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMobmV4dCwgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBmYWxzZSk7Ci0JCQkJCQkJCWlmIChwcm9qZWN0UHJlZnMgIT0gbnVsbCkKLQkJCQkJCQkJCXByb2plY3RQcmVmcy5mbHVzaCgpOwotCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gd2UgZ290IGFuIGVycm9yIHNhdmluZwotCQkJCQkJCVN0cmluZyBkZXRhaWxNZXNzYWdlID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmcsIG5leHQuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKDEgPDwgKElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VUICUgMTAwIC8gMzMpLCBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTLCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgZGV0YWlsTWVzc2FnZSwgZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiAhYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgdm9pZCBwcm9jZXNzRW50cnlDaGFuZ2VzKElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQkvLyBjaGVjayBlYWNoIHJlc291cmNlIHdpdGgganNwIGZyYWdtZW50IHNldHRpbmcgdG8gc2VlIGlmIGl0IGhhcwotCQkJLy8gYmVlbiBtb3ZlZC9kZWxldGVkCi0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMyID0gZmFsc2U7Ci0KLQkJCS8vIHByb2plY3QgYWZmZWN0ZWQKLQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gKElQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJcmVzb3VyY2VDaGFuZ2VzID0gcHJvY2Vzc1ByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIHByb2plY3REZWx0YSwgcHJvamVjdHNUb1NhdmUpOwotCQkJcmVzb3VyY2VDaGFuZ2VzMiA9IHByb2Nlc3NQcmVmZXJlbmNlcyhjdXJyZW50UHJvamVjdCwgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBwcm9qZWN0RGVsdGEsIHByb2plY3RzVG9TYXZlKTsKLQotCQkJLy8gaWYgdGhlcmUgd2FzIGEgcHJlZmVyZW5jZSBrZXkgY2hhbmdlLCBuZWVkIHRvIHNhdmUgcHJlZmVyZW5jZXMKLQkJCWlmIChyZXNvdXJjZUNoYW5nZXMgfHwgcmVzb3VyY2VDaGFuZ2VzMikKLQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQoY3VycmVudFByb2plY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdvZXMgdGhyb3VnaCBhbGwgdGhlIHJlc291cmNlLWRlcGVuZGVudCBwcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGgKLQkJICogY3VycmVudFByb2plY3QgJiBrZXkgYW5kIHVwZGF0ZXMgdGhlIHByZWZlcmVuY2Uga2V5cyBpZiBuZWVkZWQKLQkJICogYmFzZWQgb24gcHJvamVjdERlbHRhCi0JCSAqIAotCQkgKiBAcGFyYW0gY3VycmVudFByb2plY3QKLQkJICogICAgICAgICAgICBjdXJyZW50IHByb2plY3Qgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZCBhdAotCQkgKiBAcGFyYW0ga2V5Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBrZXkvc3ViY2F0ZWdvcnkgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZAotCQkgKiAgICAgICAgICAgIGF0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0RGVsdGEKLQkJICogICAgICAgICAgICB0aGUgY2hhbmdlcyB0byBwcm9jZXNzIHRoZSBwcmVmZXJlbmNlIGtleXMgYWdhaW5zdAotCQkgKiBAcGFyYW0gcHJvamVjdHNUb1NhdmUKLQkJICogICAgICAgICAgICB0aGUgcHJvamVjdHMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQvc2F2ZWQKLQkJICogQHJldHVybiB0cnVlIGlmIGN1cnJlbnRQcm9qZWN0J3MgcHJlZmVyZW5jZXMgd2VyZSBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQcmVmZXJlbmNlcyhJUHJvamVjdCBjdXJyZW50UHJvamVjdCwgU3RyaW5nIGtleSwgSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIGdldCB0aGUgcHJvamVjdC1rZXkgcHJlZmVyZW5jZSBub2RlCi0JCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJaWYgKHByb2plY3RQcmVmcyA9PSBudWxsKQotCQkJCS8vIG5vIHByZWZlcmVuY2VzIGZvciB0aGlzIHByb2plY3Qta2V5LCBqdXN0IGJhaWwKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdbXSBhZmZlY3RlZFJlc291cmNlczsKLQkJCXRyeSB7Ci0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBwcm9qZWN0UHJlZnMua2V5cygpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbXMgd2l0aCB0aGUgcHJvamVjdCBzY29wZS4uLiB3ZSBnb25uYSBtaXNzIHRoZQotCQkJCS8vIGNoYW5nZXMgKGJ1dCB3aWxsIGxvZykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiUHJvYmxlbSByZXRyZWl2aW5nIEpTUCBGcmFnbWVudCBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBnbyB0aHJvdWdoIGVhY2ggcHJlZmVyZW5jZSBrZXkgKHdoaWNoIGlzIHJlYWxseSBhIGZpbGUgbmFtZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBzZWUgaWYgcHJlZmVyZW5jZSBrZXkvZmlsZSBuYW1lIHdhcyBmaWxlIHRoYXQgd2FzIGNoYW5nZWQKLQkJCQlJUmVzb3VyY2VEZWx0YSBtZW1iZXJEZWx0YSA9IHByb2plY3REZWx0YS5maW5kTWVtYmVyKG5ldyBQYXRoKGFmZmVjdGVkUmVzb3VyY2VzW2ldKSk7Ci0JCQkJLy8gbm8gY2hhbmdlcyBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JCQkJaWYgKG1lbWJlckRlbHRhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtZW1iZXJEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQlyZXNvdXJjZUNoYW5nZXMgPSB0cnVlOwotCQkJCQkvLyByZW1vdmUgdGhlIHNldHRpbmcgZm9yIHRoZSBvcmlnaW5hbCBsb2NhdGlvbgotCQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJvamVjdFByZWZzLmdldChhZmZlY3RlZFJlc291cmNlc1tpXSwgbnVsbCk7Ci0JCQkJCXByb2plY3RQcmVmcy5yZW1vdmUoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pOwotCQkJCQlpZiAoKG1lbWJlckRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCQkJCQkJLy8gaWYgbW92aW5nLCBjb3B5IHRoZSBzZXR0aW5nIGZvciB0aGUgbmV3IGxvY2F0aW9uCi0JCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkuc2VnbWVudCgwKSk7Ci0JCQkJCQlQcmVmZXJlbmNlcyB0YXJnZXRQcmVmcyA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyh0YXJnZXRQcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCQkJdGFyZ2V0UHJlZnMucHV0KEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRLZXlGb3IobWVtYmVyRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKSksIGN1cnJlbnRWYWx1ZSk7Ci0JCQkJCQlpZiAodGFyZ2V0UHJvamVjdCAhPSBjdXJyZW50UHJvamVjdCkKLQkJCQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2VDaGFuZ2VzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZvciBhbnkgY2hhbmdlIHRvIHRoZSBlbmNvZGluZyBmaWxlIG9yIGFueSByZXNvdXJjZSB3aXRoIGVuY29kaW5nCi0JCSAqIHNldCwganVzdCBkaXNjYXJkIHRoZSBjYWNoZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVJlc291cmNlRGVsdGFbXSBwcm9qZWN0RGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJLy8gcHJvY2VzcyBlYWNoIHByb2plY3QgaW4gdGhlIGRlbHRhCi0JCQlTZXQgcHJvamVjdHNUb1NhdmUgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0RGVsdGFzLmxlbmd0aDsgaSsrKQotCQkJCS8vIG5vdGhpbmcgdG8gZG8gaWYgYSBwcm9qZWN0IGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQvbW92ZWQKLQkJCQlpZiAocHJvamVjdERlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAocHJvamVjdERlbHRhc1tpXS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgPT0gMCkKLQkJCQkJcHJvY2Vzc0VudHJ5Q2hhbmdlcyhwcm9qZWN0RGVsdGFzW2ldLCBwcm9qZWN0c1RvU2F2ZSk7Ci0JCQlmSm9iLmFkZENoYW5nZXMocHJvamVjdHNUb1NhdmUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlfaW5zdGFuY2UgPSBuZXcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTExOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBub3QgbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlYzdiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLklDb250ZW50RGVzY3JpcHRpb25Gb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUZhbWlseUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9ySlNQIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFLCBJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSwgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX0ZBTUlMWV9BVFRSSUJVVEV9OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5WQUxJRDsKLQotCQkvLyBpZiBkaXNjcmlwdGlvbiBpcyBudWxsLCB3ZSBhcmUganVzdCBiZWluZyBhc2tlZCB0bwotCQkvLyBhc3Nlc3MgY29udGVudHMgdmFsaWRpdHkKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoSW5wdXRTdHJlYW0gY29udGVudHMpIHsKLQkJLy8gVGhlcmUncyBsaXR0bGUgdG8gcHJvdmUsIHZpYSBjb250ZW50cywgdGhhdAotCQkvLyBhIGZpbGUgaXMgSlNQLCBzbyBhbHdheXMgcmV0dXJuIGludGVybWluYW50LCBhbmQKLQkJLy8gbGV0IGZpbGV0eXBlcyBkZWNpZGUuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJLy8gaWYgZGlzY3JpcHRpb24gaXMgbnVsbCwgd2UgYXJlIGp1c3QgYmVpbmcgYXNrZWQgdG8KLQkJLy8gYXNzZXNzIGNvbnRlbnRzIHZhbGlkaXR5Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KFJlYWRlciBjb250ZW50cykgewotCQkvLyBUaGVyZSdzIGxpdHRsZSB0byBwcm92ZSwgdmlhIGNvbnRlbnRzLCB0aGF0Ci0JCS8vIGEgZmlsZSBpcyBKU1AsIHNvIGFsd2F5cyByZXR1cm4gaW50ZXJtaW5hbnQsIGFuZAotCQkvLyBsZXQgZmlsZXR5cGVzIGRlY2lkZS4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJCXJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQkJcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gaGFuZGxlIHN0YW5kYXJkIG9uZXMgZmlyc3QsIHRvIGJlIHN1cmUgZGV0ZWN0b3IgcHJvY2Vzc2VzCi0JCWhhbmRsZVN0YW5kYXJkQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCS8vIG5vdyBkbyB0aG9zZSBzcGVjaWZpYyBmb3IgSlNQcwotCQkvLyBub3RlOiBkZXRlY3RvciBzaG91bGQgYWx3YXlzIGJlIG9mIGNvcnJlY3QgaW5zdGFuY2UsIGJ1dCB3ZSdsbAotCQkvLyBjaGVjaywgZm9yIG5vdy4KLQkJaWYgKGRldGVjdG9yIGluc3RhbmNlb2YgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSB7Ci0JCQlKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IganNwRGV0ZWN0b3IgPSAoSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcjsKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGpzcERldGVjdG9yLmdldExhbmd1YWdlKCk7Ci0JCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSwgbGFuZ3VhZ2UpOwotCQkJfQotCQkJLyoKLQkJCSAqIGNvbnRlbnQgdHlwZSBpcyBsaXRlcmFsbHkgdGhlIGNvbnRlbnQgdHlwZSB0aGF0J3MgaW4gdGhlIHBhZ2UKLQkJCSAqIGRpcmVjdGl2ZQotCQkJICovCi0JCQlTdHJpbmcgY29udGVudFR5cGVBdHRyaWJ1dGUgPSBqc3BEZXRlY3Rvci5nZXRDb250ZW50VHlwZSgpOwotCQkJaWYgKGNvbnRlbnRUeXBlQXR0cmlidXRlICE9IG51bGwgJiYgY29udGVudFR5cGVBdHRyaWJ1dGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFLCBjb250ZW50VHlwZUF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQkvKgotCQkJICogY29udGVudCBmYW1pbHkgaXMgdGhlIGdlbmVyYWwgY2xhc3Mgb2YgY29udGVudCwgd2hlbiBpdHMKLQkJCSAqIGRpZmZlcmVudCBmcm9tIHdoYXQncyBkZWZpbmVkIGJ5IGNvbnRlbnQgdHlwZQotCQkJICovCi0JCQlpZiAoanNwRGV0ZWN0b3IuaXNYSFRNTCgpIHx8IGpzcERldGVjdG9yLmlzV01MKCkpIHsKLQkJCQkvLyBJU1NVRTogbG9uZyB0ZXJtIHRoaXMgbG9naWMgYW5kIHZhbHVlIHNob3VsZCBiZSBjb250cmlidXRlZCBieSBleHRlbnNpb24gcG9pbnQKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfRkFNSUxZX0FUVFJJQlVURSwgQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLkhUTUxfRkFNSUxZKTsKLQkJCX0KLQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRldGVjdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTdGFuZGFyZENhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGU6IGlmIHdlJ3JlIGFza2VkIGZvciBvbmUsIHdlIHNldCB0aGVtIGFsbC4gSSBuZWVkIHRvIGJlIHN1cmUgaWYKLQkJLy8gY2FsbGVkCi0JCS8vIG11bGl0aXBsZSB0aW1lcyAob25lIGZvciBlYWNoLCBzYXkpIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQotCQkvLyBwcm9jZXNzaW5nIHNhbWUKLQkJLy8gY29udGVudCBhZ2Fpbi4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZgotCQkJLy8gaW52YWxpZAotCQkJLy8gaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkvLyAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQuCi0JCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZGV0ZWN0b3IuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuTEFOR1VBR0VfQVRUUklCVVRFKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0RlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzE4ZWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5Db21tb25YTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GaWxlQ29udGVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgY2FjaGUgZm8gcHJvcGVydHkgZ3JvdXAgaW5mb3JtYXRpb24gc3RvcmVkIGluIHdlYi54bWwgZmlsZXMuIEluZm9ybWF0aW9uCi0gKiBpcyBub3QgcGVyc2lzdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eUdyb3VwW10gTk9fUFJPUEVSVFlfR1JPVVBTID0gbmV3IFByb3BlcnR5R3JvdXBbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXBsb3ltZW50RGVzY3JpcHRvciB7Ci0JCVByb3BlcnR5R3JvdXBbXSBncm91cHM7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCUZsb2F0IHZlcnNpb24gPSBuZXcgRmxvYXQoZGVmYXVsdFdlYkFwcFZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIFJlcHJlc2VudGF0aW9uIG9mIHRoZSBKU1AgMi4wIHByb3BlcnR5LWdyb3VwIGRlZmluaXRpb25zIGZyb20gYSBzZXJ2bGV0Ci0JICogZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcGVydHlHcm91cCB7Ci0JCXN0YXRpYyBQcm9wZXJ0eUdyb3VwIGNyZWF0ZUZyb20oSVBhdGggcGF0aCwgTm9kZSBwcm9wZXJ0eUdyb3VwTm9kZSwgaW50IGdyb3VwTnVtYmVyKSB7Ci0JCQlQcm9wZXJ0eUdyb3VwIGdyb3VwID0gbmV3IFByb3BlcnR5R3JvdXAocGF0aCwgZ3JvdXBOdW1iZXIpOwotCQkJTm9kZSBwcm9wZXJ0eUdyb3VwSUQgPSBwcm9wZXJ0eUdyb3VwTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElEKTsKLQkJCWlmIChwcm9wZXJ0eUdyb3VwSUQgIT0gbnVsbCkgewotCQkJCWdyb3VwLnNldElkKHByb3BlcnR5R3JvdXBJRC5nZXROb2RlVmFsdWUoKSk7Ci0JCQl9Ci0JCQlOb2RlIG5vZGUgPSBwcm9wZXJ0eUdyb3VwTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJCW5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKElTX1hNTC5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCWdyb3VwLnNldElzWE1MKGdldENvbnRhaW5lZFRleHQobm9kZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKEVMX0lHTk9SRUQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlncm91cC5zZXRFbGlnbm9yZWQoZ2V0Q29udGFpbmVkVGV4dChub2RlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoSU5DTFVERV9DT0RBLmVxdWFscyhuYW1lKSkgewotCQkJCQkJZ3JvdXAuYWRkQ29kYShnZXRDb250YWluZWRUZXh0KG5vZGUpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChJTkNMVURFX1BSRUxVREUuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlncm91cC5hZGRQcmVsdWRlKGdldENvbnRhaW5lZFRleHQobm9kZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKFNDUklQVElOR19JTlZBTElELmVxdWFscyhuYW1lKSkgewotCQkJCQkJZ3JvdXAuc2V0U2NyaXB0aW5nSW52YWxpZChnZXRDb250YWluZWRUZXh0KG5vZGUpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChQQUdFX0VOQ09ESU5HLmVxdWFscyhuYW1lKSkgewotCQkJCQkJZ3JvdXAuc2V0UGFnZUVuY29kaW5nKGdldENvbnRhaW5lZFRleHQobm9kZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKFVSTF9QQVRURVJOLmVxdWFscyhuYW1lKSkgewotCQkJCQkJZ3JvdXAuc2V0VXJsUGF0dGVybihnZXRDb250YWluZWRUZXh0KG5vZGUpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBncm91cDsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBlbF9pZ25vcmVkOwotCi0JCXByaXZhdGUgU3RyaW5nIGlkOwotCi0JCXByaXZhdGUgSVBhdGhbXSBpbmNsdWRlX2NvZGEgPSBuZXcgSVBhdGhbMF07Ci0KLQkJcHJpdmF0ZSBJUGF0aFtdIGluY2x1ZGVfcHJlbHVkZSA9IG5ldyBJUGF0aFswXTsKLQkJcHJpdmF0ZSBib29sZWFuIGlzX3htbDsKLQkJcHJpdmF0ZSBTdHJpbmdNYXRjaGVyIG1hdGNoZXI7Ci0JCXByaXZhdGUgU3RyaW5nIHBhZ2VfZW5jb2Rpbmc7Ci0JCXByaXZhdGUgYm9vbGVhbiBzY3JpcHRpbmdfaW52YWxpZDsKLQkJU3RyaW5nIHVybF9wYXR0ZXJuOwotCQlwcml2YXRlIElQYXRoIHdlYnhtbFBhdGg7Ci0KLQkJaW50IG51bWJlcjsKLQotCQlwcml2YXRlIFByb3BlcnR5R3JvdXAoSVBhdGggcGF0aCwgaW50IG51bWJlcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMud2VieG1sUGF0aCA9IHBhdGg7Ci0JCQl0aGlzLm51bWJlciA9IG51bWJlcjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDb2RhKFN0cmluZyBjb250YWluZWRUZXh0KSB7Ci0JCQlpZiAoY29udGFpbmVkVGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQlJUGF0aFtdIGNvZGFzID0gbmV3IElQYXRoW2luY2x1ZGVfY29kYS5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGluY2x1ZGVfY29kYSwgMCwgY29kYXMsIDAsIGluY2x1ZGVfY29kYS5sZW5ndGgpOwotCQkJCWNvZGFzW2luY2x1ZGVfY29kYS5sZW5ndGhdID0gd2VieG1sUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMikuYXBwZW5kKGNvbnRhaW5lZFRleHQpOwotCQkJCWluY2x1ZGVfY29kYSA9IGNvZGFzOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZFByZWx1ZGUoU3RyaW5nIGNvbnRhaW5lZFRleHQpIHsKLQkJCWlmIChjb250YWluZWRUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCUlQYXRoW10gcHJlbHVkZXMgPSBuZXcgSVBhdGhbaW5jbHVkZV9wcmVsdWRlLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoaW5jbHVkZV9wcmVsdWRlLCAwLCBwcmVsdWRlcywgMCwgaW5jbHVkZV9wcmVsdWRlLmxlbmd0aCk7Ci0JCQkJcHJlbHVkZXNbaW5jbHVkZV9wcmVsdWRlLmxlbmd0aF0gPSB3ZWJ4bWxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygyKS5hcHBlbmQoY29udGFpbmVkVGV4dCk7Ci0JCQkJaW5jbHVkZV9wcmVsdWRlID0gcHJlbHVkZXM7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJcmV0dXJuIGlkOwotCQl9Ci0KLQkJcHVibGljIElQYXRoW10gZ2V0SW5jbHVkZUNvZGEoKSB7Ci0JCQlyZXR1cm4gaW5jbHVkZV9jb2RhOwotCQl9Ci0KLQkJcHVibGljIElQYXRoW10gZ2V0SW5jbHVkZVByZWx1ZGUoKSB7Ci0JCQlyZXR1cm4gaW5jbHVkZV9wcmVsdWRlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQYWdlRW5jb2RpbmcoKSB7Ci0JCQlyZXR1cm4gcGFnZV9lbmNvZGluZzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VXJsUGF0dGVybigpIHsKLQkJCXJldHVybiB1cmxfcGF0dGVybjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRUxpZ25vcmVkKCkgewotCQkJcmV0dXJuIGVsX2lnbm9yZWQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0lzWE1MKCkgewotCQkJcmV0dXJuIGlzX3htbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzU2NyaXB0aW5nSW52YWxpZCgpIHsKLQkJCXJldHVybiBzY3JpcHRpbmdfaW52YWxpZDsKLQkJfQotCi0JCWJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgcGF0dGVybiwgYm9vbGVhbiBvcHRpbWlzdGljKSB7Ci0JCQlpZiAobWF0Y2hlciA9PSBudWxsKQotCQkJCXJldHVybiBvcHRpbWlzdGljOwotCQkJcmV0dXJuIG1hdGNoZXIubWF0Y2gocGF0dGVybik7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0RWxpZ25vcmVkKFN0cmluZyBlbF9pZ25vcmVkKSB7Ci0JCQl0aGlzLmVsX2lnbm9yZWQgPSBCb29sZWFuLnZhbHVlT2YoZWxfaWdub3JlZCkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0SXNYTUwoU3RyaW5nIGlzX3htbCkgewotCQkJdGhpcy5pc194bWwgPSBCb29sZWFuLnZhbHVlT2YoaXNfeG1sKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXRQYWdlRW5jb2RpbmcoU3RyaW5nIHBhZ2VfZW5jb2RpbmcpIHsKLQkJCXRoaXMucGFnZV9lbmNvZGluZyA9IHBhZ2VfZW5jb2Rpbmc7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0U2NyaXB0aW5nSW52YWxpZChTdHJpbmcgc2NyaXB0aW5nX2ludmFsaWQpIHsKLQkJCXRoaXMuc2NyaXB0aW5nX2ludmFsaWQgPSBCb29sZWFuLnZhbHVlT2Yoc2NyaXB0aW5nX2ludmFsaWQpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldFVybFBhdHRlcm4oU3RyaW5nIHVybF9wYXR0ZXJuKSB7Ci0JCQl0aGlzLnVybF9wYXR0ZXJuID0gdXJsX3BhdHRlcm47Ci0JCQlpZiAodXJsX3BhdHRlcm4gIT0gbnVsbCAmJiB1cmxfcGF0dGVybi5sZW5ndGgoKSA+IDApIHsKLQkJCQl0aGlzLm1hdGNoZXIgPSBuZXcgU3RyaW5nTWF0Y2hlcih1cmxfcGF0dGVybik7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIG51bWJlciArICI6IiArIHVybF9wYXR0ZXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZXZlbnQuZ2V0VHlwZSgpICE9IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKQotCQkJCXJldHVybjsKLQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAoZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5FTkNPRElORyB8fCBkZWx0YS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLk1BUktFUlMpKQotCQkJCXJldHVybjsKLQotCQkJSVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAoZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5FTkNPRElORyB8fCBkZWx0YS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLk1BUktFUlMpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQlpbnQgc2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJCWlmIChzZWdtZW50Q291bnQgPiAxICYmIHBhdGgubGFzdFNlZ21lbnQoKS5lcXVhbHMoV0VCX1hNTCkgJiYgcGF0aC5zZWdtZW50KHNlZ21lbnRDb3VudCAtIDIpLmVxdWFscyhXRUJfSU5GKSkgewotCQkJCQkJCWdldEluc3RhbmNlKCkuZGVwbG95bWVudERlc2NyaXB0b3JDaGFuZ2VkKHBhdGgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQkJCQlpZiAoX2RlYnVnUmVzb2x1dGlvbkNhY2hlKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZW1vdmluZyBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUgcmVzb2x1dGlvbiBjYWNoZSBmb3IgcHJvamVjdCAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQl9Ci0JCQkJCQlnZXRJbnN0YW5jZSgpLnJlc29sdmVkTWFwLnJlbW92ZShuYW1lKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9OwotCQkJdHJ5IHsKLQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlc291cmNlRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZEb0xvZ0V4Y2VwdGlvbnMgPSBmYWxzZTsKLQkJcHJpdmF0ZSBJUGF0aCBmUGF0aDsKLQotCQlSZXNvdXJjZUVycm9ySGFuZGxlcihib29sZWFuIGxvZ0V4Y2VwdGlvbnMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmRG9Mb2dFeGNlcHRpb25zID0gbG9nRXhjZXB0aW9uczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlpZiAoZkRvTG9nRXhjZXB0aW9ucykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiU0FYUGFyc2VFeGNlcHRpb24gd2l0aCAiICsgZlBhdGggKyAiIChlcnJvcikgd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlpZiAoZkRvTG9nRXhjZXB0aW9ucykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiU0FYUGFyc2VFeGNlcHRpb24gd2l0aCAiICsgZlBhdGggKyAiIChmYXRhbEVycm9yKSB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBhdGgoSVBhdGggcGF0aCkgewotCQkJZlBhdGggPSBwYXRoOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaWYgKGZEb0xvZ0V4Y2VwdGlvbnMpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWFBhcnNlRXhjZXB0aW9uIHdpdGggIiArIGZQYXRoICsgIiAod2FybmluZykgd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnByb3BlcnR5dGVzdGVyLlN0cmluZ01hdGNoZXIsIGJ1dAotCSAqIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgbW9yZSBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcnVsZXMgaW4KLQkgKiBTZXJ2bGV0IHNwZWMgU1JWLjExLjIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdNYXRjaGVyIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTSU5HTEVfV0lMRF9DQVJEID0gJ1x1MDAwMCc7Ci0KLQkJLyoqCi0JCSAqIEJvdW5kYXJ5IHZhbHVlIGJleW9uZCB3aGljaCB3ZSBkb24ndCBuZWVkIHRvIHNlYXJjaCBpbiB0aGUgdGV4dAotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgYm91bmQgPSAwOwotCi0JCXByaXZhdGUgYm9vbGVhbiBoYXNMZWFkaW5nU3RhcjsKLQotCQlwcml2YXRlIGJvb2xlYW4gaGFzVHJhaWxpbmdTdGFyOwotCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhdHRlcm47Ci0KLQkJcHJpdmF0ZSBmaW5hbCBpbnQgcGF0dGVybkxlbmd0aDsKLQotCQkvKioKLQkJICogVGhlIHBhdHRlcm4gc3BsaXQgaW50byBzZWdtZW50cyBzZXBhcmF0ZWQgYnkgKgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgc2VnbWVudHNbXTsKLQotCQkvKioKLQkJICogU3RyaW5nTWF0Y2hlciBjb25zdHJ1Y3RvciB0YWtlcyBpbiBhIFN0cmluZyBvYmplY3QgdGhhdCBpcyBhIHNpbXBsZQotCQkgKiBwYXR0ZXJuIHdoaWNoIG1heSBjb250YWluICcqJyBmb3IgMCBhbmQgbWFueSBjaGFyYWN0ZXJzIGFuZCAnPycgZm9yCi0JCSAqIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KLQkJICogCi0JCSAqIExpdGVyYWwgJyonIGFuZCAnPycgY2hhcmFjdGVycyBtdXN0IGJlIGVzY2FwZWQgaW4gdGhlIHBhdHRlcm4gZS5nLiwKLQkJICogIlwqIiBtZWFucyBsaXRlcmFsICIqIiwgZXRjLgotCQkgKiAKLQkJICogRXNjYXBpbmcgYW55IG90aGVyIGNoYXJhY3RlciAoaW5jbHVkaW5nIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0JCSAqIGl0c2VsZiksIGp1c3QgcmVzdWx0cyBpbiB0aGF0IGNoYXJhY3RlciBpbiB0aGUgcGF0dGVybi4gZS5nLiwgIlxhIgotCQkgKiBtZWFucyAiYSIgYW5kICJcXCIgbWVhbnMgIlwiCi0JCSAqIAotCQkgKiBJZiBpbnZva2luZyB0aGUgU3RyaW5nTWF0Y2hlciB3aXRoIHN0cmluZyBsaXRlcmFscyBpbiBKYXZhLCBkb24ndAotCQkgKiBmb3JnZXQgZXNjYXBlIGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5ICJcXCIuCi0JCSAqIAotCQkgKiBAcGFyYW0gcGF0dGVybgotCQkgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuIHRvIG1hdGNoIHRleHQgYWdhaW5zdAotCQkgKi8KLQkJU3RyaW5nTWF0Y2hlcihTdHJpbmcgcGF0dGVybikgewotCQkJaWYgKHBhdHRlcm4gPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCQkJcGF0dGVybkxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCQlwYXJzZVdpbGRDYXJkcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSB0ZXh0Ci0JCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IG9ubHkgY29udGFpbiAnPycocykKLQkJICogQHBhcmFtIHN0YXJ0Ci0JCSAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotCQkgKiBAcGFyYW0gZW5kCi0JCSAqICAgICAgICAgICAgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JCSAqIEBwYXJhbSBwCi0JCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW4gJz8nCi0JCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYKLQkJICogICAgICAgICBub3QgZm91bmQKLQkJICovCi0JCXByaXZhdGUgaW50IGZpbmRQb3NpdGlvbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcCkgewotCQkJYm9vbGVhbiBoYXNXaWxkQ2FyZCA9IHAuaW5kZXhPZihTSU5HTEVfV0lMRF9DQVJEKSA+PSAwOwotCQkJaW50IHBsZW4gPSBwLmxlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IHN0YXJ0LCBtYXggPSBlbmQgLSBwbGVuOyBpIDw9IG1heDsgKytpKSB7Ci0JCQkJaWYgKGhhc1dpbGRDYXJkKSB7Ci0JCQkJCWlmIChyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGksIHAsIDAsIHBsZW4pKQotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAodGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIGksIHAsIDAsIHBsZW4pKQotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdpdmVuIHRoZSBzdGFydGluZyAoaW5jbHVzaXZlKSBhbmQgdGhlIGVuZGluZyAoZXhjbHVzaXZlKSBwb3NpdGlvbnMKLQkJICogaW4gdGhlIDxjb2RlPnRleHQ8L2NvZGU+LCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHN1YnN0cmluZyBtYXRjaGVzCi0JCSAqIHdpdGggYVBhdHRlcm4KLQkJICogCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhlIHRleHQgbWF0Y2hlcyB0aGUKLQkJICogICAgICAgICBwYXR0ZXJuCi0JCSAqIEBwYXJhbSB0ZXh0Ci0JCSAqICAgICAgICAgICAgYSBTdHJpbmcgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHN1YnN0cmluZyB0byBtYXRjaAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQpIHsKLQkJCWlmICh0ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZmluYWwgaW50IGVuZCA9IHRleHQubGVuZ3RoKCk7Ci0JCQlmaW5hbCBpbnQgc2VnbWVudENvdW50ID0gc2VnbWVudHMubGVuZ3RoOwotCQkJaWYgKHNlZ21lbnRDb3VudCA9PSAwICYmIChoYXNMZWFkaW5nU3RhciB8fCBoYXNUcmFpbGluZ1N0YXIpKSAvLyBwYXR0ZXJuCi0JCQkJLy8gY29udGFpbnMKLQkJCQkvLyBvbmx5Ci0JCQkJLy8gJyonKHMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoZW5kID09IDApCi0JCQkJcmV0dXJuIHBhdHRlcm5MZW5ndGggPT0gMDsKLQkJCWlmIChwYXR0ZXJuTGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaW50IGN1cnJlbnRUZXh0UG9zaXRpb24gPSAwOwotCQkJaWYgKChlbmQgLSBib3VuZCkgPCAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWludCBzZWdtZW50SW5kZXggPSAwOwotCQkJU3RyaW5nIGN1cnJlbnQgPSBzZWdtZW50c1tzZWdtZW50SW5kZXhdOwotCi0JCQkvKiBwcm9jZXNzIGZpcnN0IHNlZ21lbnQgKi8KLQkJCWlmICghaGFzTGVhZGluZ1N0YXIpIHsKLQkJCQlpbnQgY3VycmVudExlbmd0aCA9IGN1cnJlbnQubGVuZ3RoKCk7Ci0JCQkJaWYgKCFyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIDAsIGN1cnJlbnQsIDAsIGN1cnJlbnRMZW5ndGgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJc2VnbWVudEluZGV4Kys7Ci0JCQkJY3VycmVudFRleHRQb3NpdGlvbiA9IGN1cnJlbnRUZXh0UG9zaXRpb24gKyBjdXJyZW50TGVuZ3RoOwotCQkJfQotCQkJaWYgKChzZWdtZW50Q291bnQgPT0gMSkgJiYgKCFoYXNMZWFkaW5nU3RhcikgJiYgKCFoYXNUcmFpbGluZ1N0YXIpKSB7Ci0JCQkJLy8gb25seSBvbmUgc2VnbWVudCB0byBtYXRjaCwgbm8gd2lsZCBjYXJkcyBzcGVjaWZpZWQKLQkJCQlyZXR1cm4gY3VycmVudFRleHRQb3NpdGlvbiA9PSBlbmQ7Ci0JCQl9Ci0JCQkvKiBwcm9jZXNzIG1pZGRsZSBzZWdtZW50cyAqLwotCQkJd2hpbGUgKHNlZ21lbnRJbmRleCA8IHNlZ21lbnRDb3VudCkgewotCQkJCWN1cnJlbnQgPSBzZWdtZW50c1tzZWdtZW50SW5kZXhdOwotCQkJCWludCBjdXJyZW50TWF0Y2ggPSBmaW5kUG9zaXRpb24odGV4dCwgY3VycmVudFRleHRQb3NpdGlvbiwgZW5kLCBjdXJyZW50KTsKLQkJCQlpZiAoY3VycmVudE1hdGNoIDwgMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWN1cnJlbnRUZXh0UG9zaXRpb24gPSBjdXJyZW50TWF0Y2ggKyBjdXJyZW50Lmxlbmd0aCgpOwotCQkJCXNlZ21lbnRJbmRleCsrOwotCQkJfQotCi0JCQkvKiBwcm9jZXNzIGZpbmFsIHNlZ21lbnQgKi8KLQkJCWlmICghaGFzVHJhaWxpbmdTdGFyICYmIGN1cnJlbnRUZXh0UG9zaXRpb24gIT0gZW5kKSB7Ci0JCQkJaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50Lmxlbmd0aCgpOwotCQkJCXJldHVybiByZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGVuZCAtIGN1cnJlbnRMZW5ndGgsIGN1cnJlbnQsIDAsIGN1cnJlbnRMZW5ndGgpOwotCQkJfQotCQkJcmV0dXJuIHNlZ21lbnRJbmRleCA9PSBzZWdtZW50Q291bnQ7Ci0JCX0KLQotCQkvKioKLQkJICogUGFyc2VzIHRoZSBwYXR0ZXJuIGludG8gc2VnbWVudHMgc2VwYXJhdGVkIGJ5IHdpbGRjYXJkICcqJwotCQkgKiBjaGFyYWN0ZXJzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHBhcnNlV2lsZENhcmRzKCkgewotCQkJaWYgKHBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKS8vJE5PTi1OTFMtMSQKLQkJCQloYXNMZWFkaW5nU3RhciA9IHRydWU7Ci0JCQlpZiAocGF0dGVybi5lbmRzV2l0aCgiKiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCS8qIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlc2NhcGVkIHdpbGRjYXJkICovCi0JCQkJaWYgKHBhdHRlcm5MZW5ndGggPiAxICYmIHBhdHRlcm4uY2hhckF0KHBhdHRlcm5MZW5ndGggLSAyKSAhPSAnXFwnKSB7Ci0JCQkJCWhhc1RyYWlsaW5nU3RhciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlBcnJheUxpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJaW50IHBvcyA9IDA7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJd2hpbGUgKHBvcyA8IHBhdHRlcm5MZW5ndGgpIHsKLQkJCQljaGFyIGMgPSBwYXR0ZXJuLmNoYXJBdChwb3MrKyk7Ci0JCQkJc3dpdGNoIChjKSB7Ci0JCQkJCWNhc2UgJ1xcJyA6Ci0JCQkJCQlpZiAocG9zID49IHBhdHRlcm5MZW5ndGgpIHsKLQkJCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJY2hhciBuZXh0ID0gcGF0dGVybi5jaGFyQXQocG9zKyspOwotCQkJCQkJCS8qIGlmIGl0J3MgYW4gZXNjYXBlIHNlcXVlbmNlICovCi0JCQkJCQkJaWYgKG5leHQgPT0gJyonIHx8IG5leHQgPT0gJz8nIHx8IG5leHQgPT0gJ1xcJykgewotCQkJCQkJCQlidWYuYXBwZW5kKG5leHQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLyoKLQkJCQkJCQkJICogbm90IGFuIGVzY2FwZSBzZXF1ZW5jZSwganVzdCBpbnNlcnQKLQkJCQkJCQkJICogbGl0ZXJhbGx5Ci0JCQkJCQkJCSAqLwotCQkJCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQkJCQlidWYuYXBwZW5kKG5leHQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICcqJyA6Ci0JCQkJCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCS8qIG5ldyBzZWdtZW50ICovCi0JCQkJCQkJdGVtcC5hZGQoYnVmLnRvU3RyaW5nKCkpOwotCQkJCQkJCWJvdW5kICs9IGJ1Zi5sZW5ndGgoKTsKLQkJCQkJCQlidWYuc2V0TGVuZ3RoKDApOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJz8nIDoKLQkJCQkJCS8qCi0JCQkJCQkgKiBhcHBlbmQgc3BlY2lhbCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHNpbmdsZSBtYXRjaAotCQkJCQkJICogd2lsZGNhcmQKLQkJCQkJCSAqLwotCQkJCQkJYnVmLmFwcGVuZChTSU5HTEVfV0lMRF9DQVJEKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBhZGQgbGFzdCBidWZmZXIgdG8gc2VnbWVudCBsaXN0ICovCi0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCXRlbXAuYWRkKGJ1Zi50b1N0cmluZygpKTsKLQkJCQlib3VuZCArPSBidWYubGVuZ3RoKCk7Ci0JCQl9Ci0JCQlzZWdtZW50cyA9IChTdHJpbmdbXSkgdGVtcC50b0FycmF5KG5ldyBTdHJpbmdbdGVtcC5zaXplKCldKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHJldHVybiBib29sZWFuCi0JCSAqIEBwYXJhbSB0ZXh0Ci0JCSAqICAgICAgICAgICAgYSBTdHJpbmcgdG8gbWF0Y2gKLQkJICogQHBhcmFtIHRTdGFydAotCQkgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCBvZiBtYXRjaCwgaW5jbHVzaXZlCi0JCSAqIEBwYXJhbSBwCi0JCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW4gJz8nCi0JCSAqIEBwYXJhbSBwU3RhcnQKLQkJICogICAgICAgICAgICBUaGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIHBhdHRlcm4KLQkJICogQHBhcmFtIHBsZW4KLQkJICogICAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gcmVnRXhwUmVnaW9uTWF0Y2hlcyhTdHJpbmcgdGV4dCwgaW50IHRTdGFydCwgU3RyaW5nIHAsIGludCBwU3RhcnQsIGludCBwbGVuKSB7Ci0JCQl3aGlsZSAocGxlbi0tID4gMCkgewotCQkJCWNoYXIgdGNoYXIgPSB0ZXh0LmNoYXJBdCh0U3RhcnQrKyk7Ci0JCQkJY2hhciBwY2hhciA9IHAuY2hhckF0KHBTdGFydCsrKTsKLQotCQkJCS8vIHByb2Nlc3Mgd2lsZCBjYXJkcywgc2tpcHBpbmcgc2luZ2xlIHdpbGQgY2FyZHMKLQkJCQlpZiAocGNoYXIgPT0gU0lOR0xFX1dJTERfQ0FSRCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHBjaGFyID09IHRjaGFyKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UocGNoYXIpKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBjb21wYXJpbmcgYWZ0ZXIgY29udmVydGluZyB0byB1cHBlciBjYXNlIGRvZXNuJ3QgaGFuZGxlIGFsbAotCQkJCS8vIGNhc2VzOwotCQkJCS8vIGFsc28gY29tcGFyZSBhZnRlciBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2UKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UocGNoYXIpKQotCQkJCQljb250aW51ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZSBfaW5zdGFuY2UgPSBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdSZXNvbHV0aW9uQ2FjaGUgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IGRlZmF1bHRXZWJBcHBWZXJzaW9uID0gMi40ZjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRUxfSUdOT1JFRCA9ICJlbC1pZ25vcmVkIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUQgPSAiaWQiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJTkNMVURFX0NPREEgPSAiaW5jbHVkZS1jb2RhIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSU5DTFVERV9QUkVMVURFID0gImluY2x1ZGUtcHJlbHVkZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSVNfWE1MID0gImlzLXhtbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpTUF9QUk9QRVJUWV9HUk9VUCA9ICJqc3AtcHJvcGVydHktZ3JvdXAiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQUdFX0VOQ09ESU5HID0gInBhZ2UtZW5jb2RpbmciOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNDUklQVElOR19JTlZBTElEID0gInNjcmlwdGluZy1pbnZhbGlkIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVVJMX1BBVFRFUk4gPSAidXJsLXBhdHRlcm4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQVBQX0VMRU1FTlRfTE9DQUxfTkFNRSA9ICI6d2ViLWFwcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9BUFBfRUxFTUVOVF9OQU1FID0gIndlYi1hcHAiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9BUFBfVkVSU0lPTl9OQU1FID0gInZlcnNpb24iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfWE1MID0gIndlYi54bWwiOwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GX1dFQl9YTUwgPSBXRUJfSU5GICsgSVBhdGguU0VQQVJBVE9SCi0JLy8gKyBXRUJfWE1MOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFTSF9XRUJfSU5GX1dFQl9YTUwgPSBQYXRoLlJPT1QudG9TdHJpbmcoKSArIFdFQl9JTkYgKyBJUGF0aC5TRVBBUkFUT1IgKyBXRUJfWE1MOwotCi0Jc3RhdGljIFN0cmluZyBnZXRDb250YWluZWRUZXh0KE5vZGUgcGFyZW50KSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuLmdldExlbmd0aCgpID09IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlbi5pdGVtKDApLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCVN0cmluZyByZWZlcmVuY2UgPSAoKEVudGl0eVJlZmVyZW5jZSkgY2hpbGQpLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmVmZXJlbmNlID0gIiYiICsgY2hpbGQuZ2V0Tm9kZU5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQlzLmFwcGVuZChyZWZlcmVuY2UudHJpbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzLmFwcGVuZChjaGlsZC5nZXROb2RlVmFsdWUoKS50cmltKCkpOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBzLnRvU3RyaW5nKCkudHJpbSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnQoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGdldEluc3RhbmNlKCkuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0b3AoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGdldEluc3RhbmNlKCkuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyOwotCi0JcHJpdmF0ZSBNYXAgZkRlcGxveW1lbnREZXNjcmlwdG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCi0JLy8gZm9yIHVzZSB3aGVuIHJlYWRpbmcgVExEcwotCXByaXZhdGUgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXI7Ci0KLQlNYXAgcmVzb2x2ZWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9wYXJzZURvY3VtZW50KElQYXRoIHBhdGgsIEZsb2F0W10gdmVyc2lvbiwgTGlzdCBncm91cExpc3QsIFN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yLCBEb2N1bWVudCBkb2N1bWVudCkgewotCQlFbGVtZW50IHdlYmFwcCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAod2ViYXBwICE9IG51bGwpIHsKLQkJCWlmICh3ZWJhcHAuZ2V0VGFnTmFtZSgpLmVxdWFscyhXRUJfQVBQX0VMRU1FTlRfTkFNRSkgfHwgd2ViYXBwLmdldE5vZGVOYW1lKCkuZW5kc1dpdGgoV0VCX0FQUF9FTEVNRU5UX0xPQ0FMX05BTUUpKSB7Ci0JCQkJLy8gdGhpcyBjb252ZW50aW9uIG9ubHkgc3RhcnRlZCB3aXRoIDIuND8KLQkJCQlTdHJpbmcgdmVyc2lvblZhbHVlID0gd2ViYXBwLmdldEF0dHJpYnV0ZShXRUJfQVBQX1ZFUlNJT05fTkFNRSk7Ci0JCQkJaWYgKHZlcnNpb25WYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXZlcnNpb25WYWx1ZSA9IHZlcnNpb25WYWx1ZS50cmltKCk7Ci0JCQkJCWlmICh2ZXJzaW9uVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZlcnNpb25bMF0gPSBGbG9hdC52YWx1ZU9mKHZlcnNpb25WYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBkb2Vzbid0IG1hdHRlcgotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh2ZXJzaW9uWzBdID09IG51bGwpIHsKLQkJCQkJLy8gdHJ5IGRldGVybWluaW5nIHRoZSB2ZXJzaW9uIGZyb20gdGhlIGRvY3R5cGUgcmVmZXJlbmNlCi0JCQkJCURvY3VtZW50VHlwZSBkb2N0eXBlID0gZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCQkJCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBkb2N0eXBlLmdldFN5c3RlbUlkKCk7Ci0JCQkJCQlTdHJpbmcgcHVibGljSWQgPSBkb2N0eXBlLmdldFB1YmxpY0lkKCk7Ci0JCQkJCQlpZiAoKHN5c3RlbUlkICE9IG51bGwgJiYgc3lzdGVtSWQuZW5kc1dpdGgoIndlYi1hcHBfMl8zLmR0ZCIpKSB8fCAocHVibGljSWQgIT0gbnVsbCAmJiBwdWJsaWNJZC5pbmRleE9mKCJXZWIgQXBwbGljYXRpb24gMi4zIikgPiAwKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl2ZXJzaW9uWzBdID0gbmV3IEZsb2F0KDIuMyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICgoc3lzdGVtSWQgIT0gbnVsbCAmJiBzeXN0ZW1JZC5lbmRzV2l0aCgid2ViLWFwcF8yXzIuZHRkIikpIHx8IChwdWJsaWNJZCAhPSBudWxsICYmIHB1YmxpY0lkLmluZGV4T2YoIldlYiBBcHBsaWNhdGlvbiAyLjIiKSA+IDApKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCXZlcnNpb25bMF0gPSBuZXcgRmxvYXQoMi4yKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKChzeXN0ZW1JZCAhPSBudWxsICYmIHN5c3RlbUlkLmVuZHNXaXRoKCJ3ZWItYXBwXzJfMS5kdGQiKSkgfHwgKHB1YmxpY0lkICE9IG51bGwgJiYgcHVibGljSWQuaW5kZXhPZigiV2ViIEFwcGxpY2F0aW9uIDIuMSIpID4gMCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJdmVyc2lvblswXSA9IG5ldyBGbG9hdCgyLjEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU5vZGVMaXN0IHByb3BlcnR5R3JvdXBFbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUF9QUk9QRVJUWV9HUk9VUCk7Ci0JCWludCBsZW5ndGggPSBwcm9wZXJ0eUdyb3VwRWxlbWVudHMuZ2V0TGVuZ3RoKCk7Ci0JCXN1Yk1vbml0b3IuYmVnaW5UYXNrKCJSZWFkaW5nIFByb3BlcnR5IEdyb3VwcyIsIGxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJUHJvcGVydHlHcm91cCBncm91cCA9IFByb3BlcnR5R3JvdXAuY3JlYXRlRnJvbShwYXRoLCBwcm9wZXJ0eUdyb3VwRWxlbWVudHMuaXRlbShpKSwgaSk7Ci0JCQlzdWJNb25pdG9yLndvcmtlZCgxKTsKLQkJCWlmIChncm91cCAhPSBudWxsKSB7Ci0JCQkJZ3JvdXBMaXN0LmFkZChncm91cCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBTUlYgc3BlYyB2ZXJzaW9uIHRvIHRoZSBKU1Agc3BlYyB2ZXJzaW9uCi0JICovCi0JcHJpdmF0ZSBmbG9hdCBjb252ZXJ0U3BlY1ZlcnNpb25zKGZsb2F0IHZlcnNpb24pIHsKLQkJaWYgKHZlcnNpb24gPiAwKSB7Ci0JCQlpZiAodmVyc2lvbiA9PSAyLjVmKQotCQkJCXJldHVybiAyLjFmOwotCQkJZWxzZSBpZiAodmVyc2lvbiA9PSAyLjRmKQotCQkJCXJldHVybiAyLjBmOwotCQkJZWxzZSBpZiAodmVyc2lvbiA9PSAyLjNmKQotCQkJCXJldHVybiAxLjJmOwotCQkJZWxzZSBpZiAodmVyc2lvbiA9PSAyLjJmKQotCQkJCXJldHVybiAxLjFmOwotCQkJZWxzZSBpZiAodmVyc2lvbiA9PSAyLjFmKQotCQkJCXJldHVybiAxLjBmOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0U3BlY1ZlcnNpb25zKGRlZmF1bHRXZWJBcHBWZXJzaW9uKTsKLQl9Ci0KLQl2b2lkIGRlcGxveW1lbnREZXNjcmlwdG9yQ2hhbmdlZChmaW5hbCBJUGF0aCBmdWxsUGF0aCkgewotCQlpZiAoZkRlcGxveW1lbnREZXNjcmlwdG9ycy5jb250YWluc0tleShmdWxsUGF0aC5tYWtlQWJzb2x1dGUoKSkpIHsKLQkJCXVwZGF0ZUNhY2hlRW50cnkoZnVsbFBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcGFyc2UgdGhlIHNwZWNpZmllZCByZXNvdXJjZSB1c2luZyBYZXJjZXMsIGFuZCBpZiB0aGF0IGZhaWxzLCB1c2UgdGhlCi0JICogU1NFIFhNTCBwYXJzZXIgdG8gZmluZCB0aGUgcHJvcGVydHkgZ3JvdXBzLgotCSAqLwotCXByaXZhdGUgRGVwbG95bWVudERlc2NyaXB0b3IgZmV0Y2hEZXNjcmlwdG9yKElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQltb25pdG9yLmJlZ2luVGFzaygiUmVhZGluZyBEZXBsb3ltZW50IERlc2NyaXB0b3IiLCAzKTsKLQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQotCQlQcm9wZXJ0eUdyb3VwIGdyb3Vwc1tdID0gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJTGlzdCBncm91cExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUZsb2F0W10gdmVyc2lvbiA9IG5ldyBGbG9hdFsxXTsKLQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDIpOwotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IENvbW1vblhNTC5nZXREb2N1bWVudEJ1aWxkZXIoZmFsc2UpOwotCQlidWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGdldEVudGl0eVJlc29sdmVyKCkpOwotCQlidWlsZGVyLnNldEVycm9ySGFuZGxlcihnZXRFcnJvckhhbmRsZXIocGF0aCkpOwotCQl0cnkgewotCQkJSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoKTsKLQkJCVN0cmluZyBzID0gRmlsZUNvbnRlbnRDYWNoZS5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRzKHBhdGgpOwotCQkJaW5wdXRTb3VyY2Uuc2V0Q2hhcmFjdGVyU3RyZWFtKG5ldyBTdHJpbmdSZWFkZXIocykpOwotCQkJaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQocGF0aC50b1N0cmluZygpKTsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0JCQlfcGFyc2VEb2N1bWVudChwYXRoLCB2ZXJzaW9uLCBncm91cExpc3QsIHN1Yk1vbml0b3IsIGRvY3VtZW50KTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUxKSB7Ci0JCQkvKiBlbmNvdW50ZXJlZCBhIGZhdGFsIHBhcnNpbmcgZXJyb3IsIHRyeSBvdXIgb3duIHBhcnNlciAqLwotCQkJdHJ5IHsKLQkJCQkvKioKLQkJCQkgKiBDaGllZmx5IGJlY2F1c2UgdGhlIHdlYi54bWwgZmlsZSBpdHNlbGYgaXMgZWRpdGFibGUsIHVzZQotCQkJCSAqIFNTRSB0byBnZXQgdGhlIERPTSBEb2N1bWVudCBiZWNhdXNlIGl0IGlzIG1vcmUgZmF1bHQKLQkJCQkgKiB0b2xlcmFudC4KLQkJCQkgKi8KLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCV9wYXJzZURvY3VtZW50KHBhdGgsIHZlcnNpb24sIGdyb3VwTGlzdCwgc3ViTW9uaXRvciwgZG9jdW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkvKiBmaWxlIGlzIHVucmVhZGFibGUsIGNyZWF0ZSBubyBwcm9wZXJ0eSBncm91cHMgKi8KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWdyb3VwcyA9IChQcm9wZXJ0eUdyb3VwW10pIGdyb3VwTGlzdC50b0FycmF5KG5ldyBQcm9wZXJ0eUdyb3VwW2dyb3VwTGlzdC5zaXplKCldKTsKLQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQl9Ci0KLQkJaWYgKGdyb3VwcyA9PSBudWxsKSB7Ci0JCQlncm91cHMgPSBOT19QUk9QRVJUWV9HUk9VUFM7Ci0JCX0KLQotCQlEZXBsb3ltZW50RGVzY3JpcHRvciBkZXBsb3ltZW50RGVzY3JpcHRvciA9IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlkZXBsb3ltZW50RGVzY3JpcHRvci5tb2RpZmljYXRpb25TdGFtcCA9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJZGVwbG95bWVudERlc2NyaXB0b3IuZ3JvdXBzID0gZ3JvdXBzOwotCQlkZXBsb3ltZW50RGVzY3JpcHRvci52ZXJzaW9uID0gdmVyc2lvblswXTsKLQkJbW9uaXRvci5kb25lKCk7Ci0JCWZEZXBsb3ltZW50RGVzY3JpcHRvcnMucHV0KHBhdGgsIG5ldyBTb2Z0UmVmZXJlbmNlKGRlcGxveW1lbnREZXNjcmlwdG9yKSk7Ci0JCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvcjsKLQl9Ci0KLQlwcml2YXRlIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgewotCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJcmVzb2x2ZXIgPSBuZXcgRW50aXR5UmVzb2x2ZXIoKSB7Ci0JCQkJcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJCQkJSW5wdXRTb3VyY2UgcmVzdWx0ID0gbmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwotCQkJCQlyZXN1bHQuc2V0UHVibGljSWQocHVibGljSUQpOwotCQkJCQlyZXN1bHQuc2V0U3lzdGVtSWQoc3lzdGVtSUQgIT0gbnVsbCA/IHN5c3RlbUlEIDogIi9fIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gRXJyb3JIYW5kbGVyIHRoYXQgd2lsbCBub3Qgc3RvcCB0aGUgcGFyc2VyIG9uIHJlcG9ydGVkCi0JICogZXJyb3JzCi0JICovCi0JcHJpdmF0ZSBFcnJvckhhbmRsZXIgZ2V0RXJyb3JIYW5kbGVyKElQYXRoIHBhdGgpIHsKLQkJaWYgKGVycm9ySGFuZGxlciA9PSBudWxsKSB7Ci0JCQllcnJvckhhbmRsZXIgPSBuZXcgUmVzb3VyY2VFcnJvckhhbmRsZXIoZmFsc2UpOwotCQl9Ci0JCWVycm9ySGFuZGxlci5zZXRQYXRoKHBhdGgpOwotCQlyZXR1cm4gZXJyb3JIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmdWxsUGF0aAotCSAqIEByZXR1cm4gdGhlIEpTUCB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvbnRhaW5pbmcgdGhlCi0JICogICAgICAgICBwYXRoLiBBIHZhbHVlIHN0YXRlZCB3aXRoaW4gYSB3ZWIueG1sIGZpbGUgdGFrZXMgcHJpb3JpdHkuCi0JICovCi0JcHVibGljIGZsb2F0IGdldEpTUFZlcnNpb24oSVBhdGggZnVsbFBhdGgpIHsKLQkJZmxvYXQgdmVyc2lvbiA9IGRlZmF1bHRXZWJBcHBWZXJzaW9uOwotCQkvKiB0cnkgYXBwbGljYWJsZSB3ZWIueG1sIGZpbGUgZmlyc3QgKi8KLQkJSVBhdGggd2VieG1sUGF0aCA9IGdldFdlYlhNTFBhdGgoZnVsbFBhdGgpOwotCQlpZiAod2VieG1sUGF0aCAhPSBudWxsKSB7Ci0JCQlJRmlsZSB3ZWJ4bWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHdlYnhtbFBhdGgpOwotCQkJaWYgKHdlYnhtbEZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlSZWZlcmVuY2UgZGVzY3JpcHRvckhvbGRlciA9IChSZWZlcmVuY2UpIGZEZXBsb3ltZW50RGVzY3JpcHRvcnMuZ2V0KHdlYnhtbFBhdGgpOwotCQkJCURlcGxveW1lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCi0JCQkJaWYgKGRlc2NyaXB0b3JIb2xkZXIgPT0gbnVsbCB8fCAoKGRlc2NyaXB0b3IgPSAoRGVwbG95bWVudERlc2NyaXB0b3IpIGRlc2NyaXB0b3JIb2xkZXIuZ2V0KCkpID09IG51bGwpIHx8IChkZXNjcmlwdG9yLm1vZGlmaWNhdGlvblN0YW1wID09IElSZXNvdXJjZS5OVUxMX1NUQU1QKSB8fCAoZGVzY3JpcHRvci5tb2RpZmljYXRpb25TdGFtcCAhPSB3ZWJ4bWxGaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpKSB7Ci0JCQkJCWRlc2NyaXB0b3IgPSBmZXRjaERlc2NyaXB0b3Iod2VieG1sUGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCi0JCQkJaWYgKGRlc2NyaXB0b3IudmVyc2lvbiAhPSBudWxsKSB7Ci0JCQkJCXZlcnNpb24gPSBkZXNjcmlwdG9yLnZlcnNpb24uZmxvYXRWYWx1ZSgpOwotCQkJCQlyZXR1cm4gY29udmVydFNwZWNWZXJzaW9ucyh2ZXJzaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKiBjaGVjayBmYWNldCBzZXR0aW5ncyAqLwotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGZ1bGxQYXRoLnNlZ21lbnQoMCkpOwotCQl2ZXJzaW9uID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXREeW5hbWljV2ViUHJvamVjdFZlcnNpb24ocHJvamVjdCk7Ci0KLQkJcmV0dXJuIGNvbnZlcnRTcGVjVmVyc2lvbnModmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGpzcEZpbGVQYXRoCi0JICogQHJldHVybiBQcm9wZXJ0eUdyb3VwcyBtYXRjaGluZyB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcGF0aCBvciBhbiBlbXB0eQotCSAqICAgICAgICAgYXJyYXkgaWYgbm8gd2ViLnhtbCBmaWxlIGV4aXN0cyBvciBubyBtYXRjaGluZyBwcm9wZXJ0eSBncm91cAotCSAqICAgICAgICAgd2FzIGRlZmluZWQuIEEgcmV0dXJuZWQgUHJvcGVydHlHcm91cCBvYmplY3Qgc2hvdWxkIGJlCi0JICogICAgICAgICBjb25zaWRlcmVkIHNob3J0LWxpdmVkIGFuZCBub3Qgc2F2ZWQgZm9yIGxhdGVyIHVzZS4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlHcm91cFtdIGdldFByb3BlcnR5R3JvdXBzKElQYXRoIGpzcEZpbGVQYXRoKSB7Ci0JCUxpc3QgbWF0Y2hpbmdHcm91cHMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlJUGF0aCB3ZWJ4bWxQYXRoID0gZ2V0V2ViWE1MUGF0aChqc3BGaWxlUGF0aCk7Ci0JCWlmICh3ZWJ4bWxQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gTk9fUFJPUEVSVFlfR1JPVVBTOwotCi0JCUlGaWxlIHdlYnhtbEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUod2VieG1sUGF0aCk7Ci0JCWlmICghd2VieG1sRmlsZS5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBOT19QUk9QRVJUWV9HUk9VUFM7Ci0KLQkJUmVmZXJlbmNlIGRlc2NyaXB0b3JIb2xkZXIgPSAoUmVmZXJlbmNlKSBmRGVwbG95bWVudERlc2NyaXB0b3JzLmdldCh3ZWJ4bWxQYXRoKTsKLQkJRGVwbG95bWVudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0KLQkJaWYgKGRlc2NyaXB0b3JIb2xkZXIgPT0gbnVsbCB8fCAoKGRlc2NyaXB0b3IgPSAoRGVwbG95bWVudERlc2NyaXB0b3IpIGRlc2NyaXB0b3JIb2xkZXIuZ2V0KCkpID09IG51bGwpIHx8IChkZXNjcmlwdG9yLm1vZGlmaWNhdGlvblN0YW1wID09IElSZXNvdXJjZS5OVUxMX1NUQU1QKSB8fCAoZGVzY3JpcHRvci5tb2RpZmljYXRpb25TdGFtcCAhPSB3ZWJ4bWxGaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpKSB7Ci0JCQlkZXNjcmlwdG9yID0gZmV0Y2hEZXNjcmlwdG9yKHdlYnhtbFBhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmdyb3Vwcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRlc2NyaXB0b3IuZ3JvdXBzW2ldLm1hdGNoZXMoRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXRSdW50aW1lUGF0aChqc3BGaWxlUGF0aCkudG9TdHJpbmcoKSwgZmFsc2UpKSB7Ci0JCQkJbWF0Y2hpbmdHcm91cHMuYWRkKGRlc2NyaXB0b3IuZ3JvdXBzW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAobWF0Y2hpbmdHcm91cHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZ3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGRlc2NyaXB0b3IuZ3JvdXBzW2ldLm1hdGNoZXMoRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXRSdW50aW1lUGF0aChqc3BGaWxlUGF0aCkudG9TdHJpbmcoKSwgdHJ1ZSkpIHsKLQkJCQkJbWF0Y2hpbmdHcm91cHMuYWRkKGRlc2NyaXB0b3IuZ3JvdXBzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChQcm9wZXJ0eUdyb3VwW10pIG1hdGNoaW5nR3JvdXBzLnRvQXJyYXkobmV3IFByb3BlcnR5R3JvdXBbbWF0Y2hpbmdHcm91cHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRXZWJYTUxQYXRoKElQYXRoIGZ1bGxQYXRoKSB7Ci0JCS8qCi0JCSAqIEl0IGNhbiB0YWtlIHRoZSBiZXR0ZXIgcGFydCBvZiBhIGZ1bGwgc2Vjb25kIHRvIGRvIHRoaXMsIHNvIGNhY2hlCi0JCSAqIHRoZSByZXN1bHQuCi0JCSAqLwotCQlJUGF0aCByZXNvbHZlZCA9IG51bGw7Ci0JCU1hcCBtYXBGb3JQcm9qZWN0ID0gbnVsbDsKLQkJbWFwRm9yUHJvamVjdCA9IChNYXApIHJlc29sdmVkTWFwLmdldChmdWxsUGF0aC5zZWdtZW50KDApKTsKLQkJaWYgKG1hcEZvclByb2plY3QgIT0gbnVsbCkgewotCQkJcmVzb2x2ZWQgPSAoSVBhdGgpIG1hcEZvclByb2plY3QuZ2V0KGZ1bGxQYXRoKTsKLQkJfQotCQllbHNlIHsKLQkJCW1hcEZvclByb2plY3QgPSBuZXcgSGFzaE1hcCgpOwotCQkJcmVzb2x2ZWRNYXAucHV0KGZ1bGxQYXRoLnNlZ21lbnQoMCksIG1hcEZvclByb2plY3QpOwotCQl9Ci0KLQkJaWYgKHJlc29sdmVkICE9IG51bGwpIHsKLQkJCWlmIChfZGVidWdSZXNvbHV0aW9uQ2FjaGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZSByZXNvbHV0aW9uIGNhY2hlIGhpdCBmb3IgIiArIGZ1bGxQYXRoKTsgLy8kTk9OLU5MUy0xJCAKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChfZGVidWdSZXNvbHV0aW9uQ2FjaGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZSByZXNvbHV0aW9uIGNhY2hlIG1pc3MgZm9yICIgKyBmdWxsUGF0aCk7IC8vJE5PTi1OTFMtMSQgCi0JCQl9Ci0JCQlyZXNvbHZlZCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShmdWxsUGF0aCwgU0xBU0hfV0VCX0lORl9XRUJfWE1MKTsKLQkJCW1hcEZvclByb2plY3QucHV0KGZ1bGxQYXRoLCByZXNvbHZlZCk7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRXZWJYTUwoSVBhdGgganNwRmlsZVBhdGgpIHsKLQkJSVBhdGggd2VieG1sUGF0aCA9IGdldFdlYlhNTFBhdGgoanNwRmlsZVBhdGgpOwotCQlpZiAod2VieG1sUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSh3ZWJ4bWxQYXRoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FjaGVFbnRyeShJUGF0aCBmdWxsUGF0aCkgewotCQkvKiBkb24ndCB1cGRhdGUgcmlnaHQgbm93OyByZW1vdmUgYW5kIHdhaXQgZm9yIGFub3RoZXIgcXVlcnkgdG8gdXBkYXRlICovCi0JCWZEZXBsb3ltZW50RGVzY3JpcHRvcnMucmVtb3ZlKGZ1bGxQYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1OGFkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotcHVibGljIGNsYXNzIEhlYWRQYXJzZXJUb2tlbiB7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgSGVhZFBhcnNlclRva2VuKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBIZWFkUGFyc2VyVG9rZW4oU3RyaW5nIHR5cGUsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IHR5cGU7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dCA9IHRleHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gKCJ0ZXh0OiAiICsgZlRleHQgKyAiIG9mZnNldDogIiArIGZTdGFydCArICIgdHlwZTogIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Yzc0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBsaXN0Lmxlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzZjNTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyNCArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQuMiBvbiA3LzI4LzA4IDk6MjkgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNC4yCi0gKiBvbiA3LzI4LzA4IDk6MjkgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+RDovd29ya3NwYWNlcy93dHAzMDEvd29ya3NwYWNlL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEpTUEhlYWRUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSA4MTkyOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUV9TVFJJTkcgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUV9TVFJJTkcgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1BBR0VfRElSRUNUSVZFID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotCi0gIC8qKgotICAgKiBaWl9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBaWl9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgNwotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDFcMTFcMTBcMFwxXDZcMVwxMFwyXDBcMVw3XDIyXDBcMVw2XDFcMjBcMVwzNyIrCi0gICAgIlwyXDBcMVw1MVwxXDBcMVw0MFw2XDBcMVw0M1wxXDM0XDFcMFwxXDQ3XDFcMCIrCi0gICAgIlwxXDQ0XDVcMFwxXDUwXDFcNDFcMVwwXDFcMTNcMVwxMlwxXDU2XDFcMTRcMVw1MiIrCi0gICAgIlwxXDUzXDFcMzJcMVwyM1wxXDIxXDFcMjdcMVwwXDFcNDZcMVwzMFwxXDMzXDFcNTQiKwotICAgICJcMVwwXDFcMTdcMVwxNlwxXDM1XDFcMjJcMVwyNlwxXDBcMVw0NVwxXDM2XDFcMjQiKwotICAgICJcMVwzMVwxXDU1XDFcNDJcMVwxNVwxXDI1XDdcMFwxXDUzXDFcMzJcMVwyM1wxXDIxIisKLSAgICAiXDFcMjdcMVwwXDFcNDZcMVwzMFwxXDMzXDFcNTRcMVwwXDFcMTdcMVwxNlwxXDM1IisKLSAgICAiXDFcMjJcMVwyNlwxXDBcMVw0NVwxXDM2XDFcMjRcMVwzMVwxXDU1XDFcNDJcMVwxNSIrCi0gICAgIlwxXDI1XDEwMVwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzXDE2XDBcMVwxXDIwXDAiKwotICAgICJcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQUNUSU9OX1BBQ0tFRF8wID0KLSAgICAiXDEwXDBcMjRcMVwyXDJcMVwxXDFcMlwxXDNcMVw0XDFcNSIrCi0gICAgIlwxXDZcMVwxXDFcNVwxXDdcMVw1XDFcMVwxXDEwXDFcMSIrCi0gICAgIlwxXDExXDZcMFwxXDEyXDFcMTNcMTVcMFwxXDE0XDIwXDBcMVwxNSIrCi0gICAgIlwxXDBcMVwxNlwxXDBcMVwyXDFcM1wxXDRcMVw2XDNcMCIrCi0gICAgIlwxXDE3XDFcN1wxXDBcMVwxMFwxXDExXDEwXDBcMVwyMFw1XDAiKwotICAgICJcMVwxNFwxMlwwXDFcMTVcMVwxNlwxXDJcMVwxN1w2N1wwXDFcMjEiKwotICAgICJcMjBcMFwxXDIyXDRcMFwxXDIxXDE3XDBcMVwyMlw2XDBcMVwyMyIrCi0gICAgIlwxNVwwXDFcMjRcMVwwXDFcMjNcMlwwXDFcMjVcMTRcMFwxXDI0IisKLSAgICAiXDJcMFwxXDI1XDM0XDBcMVwyNlwxNFwwXDFcMjZcMlwwXDFcMjciKwotICAgICJcMTNcMFwxXDI3XDEzMlwwXDFcMzBcMVwwXDFcMzBcNlwwXDJcMzAiKwotICAgICJcMTFcMFwxXDMxXDFcMFwxXDMxXDJcMFwyXDMxXDExXDAiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0NDZdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqIAotICAgKiB6ekF0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4genpFT0ZEb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIC8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLSAgICAgICAgcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNYSFRNTDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzV01MOwotCi0KLSAgICAgICAgcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgICAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotICAgICAgICAgICAgICAgIC8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgICAgICAgICAgICAgICB6elJlYWRlciA9IGluOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAgICAgICAgICAgICAgIHp6U3RhdGUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gICAgICAgICAgICAgICAgLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgICBBcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gICAgICAgICAgICAgICAgLy96elB1c2hiYWNrUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgICAgICAgICAgICAgKiBmcm9tIGlucHV0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpFbmRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIC8veXlsaW5lID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIHl5Y2hhciA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAvL3l5Y29sdW1uID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpBdEJPTCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gICAgICAgICAgICAgICAgenpBdEVPRiA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gICAgICAgICAgICAgICAgenpFT0ZEb25lID0gZmFsc2U7Ci0KLQotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpc1hIVE1MPWZhbHNlOwotICAgICAgICAgICAgICAgIGlzV01MPWZhbHNlOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIGNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVRleHQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0gICAgICAgIH0KLSAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotICAgICAgICAgICAgICAgIHl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1hIVE1MKCkgewotICAgICAgICAgICAgcmV0dXJuIGlzWEhUTUw7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXTUwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNXTUw7Ci0gICAgICAgIH0gICAgICAgIAotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTk0KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpSZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh6elN0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIHp6U3RhcnRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpFbmRSZWFkLXp6U3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHp6RW5kUmVhZC09IHp6U3RhcnRSZWFkOwotICAgICAgenpDdXJyZW50UG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ek1hcmtlZFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotICAgICAgenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLmxlbmd0aC16ekVuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPiAwKSB7Ci0gICAgICB6ekVuZFJlYWQrPSBudW1SZWFkOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyB1bmxpa2VseSBidXQgbm90IGltcG9zc2libGU6IHJlYWQgMCBjaGFyYWN0ZXJzLCBidXQgbm90IGF0IGVuZCBvZiBzdHJlYW0gICAgCi0gICAgaWYgKG51bVJlYWQgPT0gMCkgewotICAgICAgaW50IGMgPSB6elJlYWRlci5yZWFkKCk7Ci0gICAgICBpZiAoYyA9PSAtMSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHp6QnVmZmVyW3p6RW5kUmVhZCsrXSA9IChjaGFyKSBjOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9ICAgICAKLSAgICB9Ci0KLQkvLyBudW1SZWFkIDwgMAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB6ekF0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh6elJlYWRlciAhPSBudWxsKQotICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0gMDsKLSAgICB5eWNoYXIgPSAwOwotICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBwdWJsaWMgZmluYWwgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1taWl9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwdWJsaWMgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6ekRvRU9GKCkgewotICAgIGlmICghenpFT0ZEb25lKSB7Ci0gICAgICB6ekVPRkRvbmUgPSB0cnVlOwotICAgICAgICAgICAgaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0genpNYXJrZWRQb3NMLXp6U3RhcnRSZWFkOwotCi0gICAgICBpZiAoenpNYXJrZWRQb3NMID4genpTdGFydFJlYWQpIHsKLSAgICAgICAgc3dpdGNoICh6ekJ1ZmZlckxbenpNYXJrZWRQb3NMLTFdKSB7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgY2FzZSAnXHUwMDBCJzoKLSAgICAgICAgY2FzZSAnXHUwMDBDJzoKLSAgICAgICAgY2FzZSAnXHUwMDg1JzoKLSAgICAgICAgY2FzZSAnXHUyMDI4JzoKLSAgICAgICAgY2FzZSAnXHUyMDI5JzoKLSAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiAKLSAgICAgICAgICBpZiAoenpNYXJrZWRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6QXRCT0wgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSAhPSAnXG4nOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpCi0gICAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChlb2YpIAotICAgICAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICB6ekF0Qk9MID0genpCdWZmZXJMW3p6TWFya2VkUG9zTF0gIT0gJ1xuJzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgenpBdEJPTCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB6ekFjdGlvbiA9IC0xOwotCi0gICAgICB6ekN1cnJlbnRQb3NMID0genpDdXJyZW50UG9zID0genpTdGFydFJlYWQgPSB6ek1hcmtlZFBvc0w7Ci0gIAotICAgICAgaWYgKHp6QXRCT0wpCi0gICAgICAgIHp6U3RhdGUgPSBaWl9MRVhTVEFURVt6ekxleGljYWxTdGF0ZSsxXTsKLSAgICAgIGVsc2UKLSAgICAgICAgenpTdGF0ZSA9IFpaX0xFWFNUQVRFW3p6TGV4aWNhbFN0YXRlXTsKLQotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgenpJbnB1dCA9IHp6Q01hcExbenpJbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHp6SXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4genpOb0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgenpGb3JOZXh0OiB7IHN3aXRjaCAoenpTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ1OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDQ0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ0OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHp6U3RhdGUgPSA1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA1MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDU2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDogenpTdGF0ZSA9IDQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA2MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA1OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA2MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDU6IHp6U3RhdGUgPSA2MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDY0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDY1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gNjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA2ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSA3MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA3MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA3MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6U3RhdGUgPSA3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDc1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MzogenpTdGF0ZSA9IDc2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA3OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSA4MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDgxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDgyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gODM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDg1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDg1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDg1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA5MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6U3RhdGUgPSA5MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDkyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDk0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpTdGF0ZSA9IDkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDk2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpTdGF0ZSA9IDkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ0OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ0OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEwMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MjogenpTdGF0ZSA9IDEwMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEwNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHp6U3RhdGUgPSAxMDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTA2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDU4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDogenpTdGF0ZSA9IDQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ0OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMTEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTExOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA2NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSA2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDY4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDY1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDExMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSA2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDExMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAxMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OiB6elN0YXRlID0gMTE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gNzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA3NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSA3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDc5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MzogenpTdGF0ZSA9IDgwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gODE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA4MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA4NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSA3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDExNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSAxMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMTIwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MzogenpTdGF0ZSA9IDgwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDEyMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA4MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAxMjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDg2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA4NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA5MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA5MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDk1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDEyNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEyNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSAxMjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDEwMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gMTMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDI6IHp6U3RhdGUgPSAxMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMTM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHp6U3RhdGUgPSAxMDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDEzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gNTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDU4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAxMTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDEzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDExNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gMTQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHp6U3RhdGUgPSAxMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogenpTdGF0ZSA9IDE0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMTE4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE0MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDEyMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxMjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDE0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gODU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpTdGF0ZSA9IDEyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMTUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSAxMzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDE1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTMxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQyOiB6elN0YXRlID0gMTAzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAxMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDEzNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE1MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gMTU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSAxNTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDEzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB6elN0YXRlID0gMTU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSAxMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDE2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gMTQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE2MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAxNjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogenpTdGF0ZSA9IDE0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTY1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTY2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpTdGF0ZSA9IDE2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE2ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAxNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDE0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMTcxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAxNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDE3MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMTUyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMTc1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAxMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDEzNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gMTU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxNzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MzogenpTdGF0ZSA9IDE1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gMTc5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHp6U3RhdGUgPSAxNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTgwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDE4MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMTYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxODM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDE2MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTYzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTg1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTg2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpTdGF0ZSA9IDE4NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gMTY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE4ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSAxODk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxOTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMTkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAxNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTkyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDE5MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTczOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDE5NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSAxOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDE1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAxNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxOTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDE5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gMTc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxOTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDE3OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMTc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjAxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAxODE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDIwMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjA0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE4NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMjA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSAxODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDIwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gMTg5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDIxMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAyMTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDE5MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMjEzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSAxOTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjE0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDIxNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gMTk1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDIxNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAyMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDE1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAxNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDE5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMjE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDIyMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMTc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAyMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogenpTdGF0ZSA9IDIyMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTgyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjA1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDIwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gMjI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSAyMDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDIyNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDIxMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMjI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAyMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDIzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMjE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDIzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSAyMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDIxNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMjM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSAyMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjM2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDIzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTk5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxOTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogenpTdGF0ZSA9IDIyMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMjM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAyMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDIwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI0MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI0NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjI4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMjI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAyMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDI0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gMjMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI0OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAyNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDIzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDI1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAyNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDIzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjM3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB6elN0YXRlID0gMjU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAyMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjU2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDI1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyMDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjQzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDI0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMjY1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAyNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjY2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDI2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDI1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAyNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDI3MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gMjcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHp6U3RhdGUgPSAyNTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI3MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSAyNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDI1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMjc2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjYzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjYyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAyNjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDI3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMjY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI3OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSAyODA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDIzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSAyNTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMjUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAyNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjgxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDI4MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjcxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gMjcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI4MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSAyODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDI1NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSAyNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyODU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI4NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHp6U3RhdGUgPSAyODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDI3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyODg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMjg5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAyNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI5MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyOTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDI4MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyOTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gMjkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSAyODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI4MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjk0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDI5NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMjg0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAyOTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMjk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyNTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gMjc0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6elN0YXRlID0gMjg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMjk4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDI5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSAzMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDI4OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjg5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ1OiB6elN0YXRlID0gMzAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzAzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDI5MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjkzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzA2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMjk1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMzA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMjk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMxMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHp6U3RhdGUgPSAzMTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDI3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHp6U3RhdGUgPSAyODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDMwMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMxMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMzE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDU6IHp6U3RhdGUgPSAzMDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMwMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDMxNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjc4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI5MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMwNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMxODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzIwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAyOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMzA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMyMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHp6U3RhdGUgPSAzMjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDI4NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAyOTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpTdGF0ZSA9IDMxMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6elN0YXRlID0gMzI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSAzMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDMxNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMzI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAzMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogenpTdGF0ZSA9IDMyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMxOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMjk1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDMwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gMzIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6U3RhdGUgPSAzMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpTdGF0ZSA9IDMyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzMzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMzMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAzMjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDMzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB6elN0YXRlID0gMzI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMTM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzM2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6U3RhdGUgPSAzMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDMzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMzMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDMzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAzNDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDMzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB6elN0YXRlID0gMzQyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMTM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSAzMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzQzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDM0NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMzQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogenpTdGF0ZSA9IDM0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAzNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzU3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAzNjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMzY0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM2NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAzNjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAzNjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAzNjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM2NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzY0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMzcwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gMzY2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMzcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMzY4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gMzc0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAzNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzc1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogenpTdGF0ZSA9IDM3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzcxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDM3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDM3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzczOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDM3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6U3RhdGUgPSAzNzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAzODA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHp6U3RhdGUgPSAzNzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzgxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM4MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDM3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6U3RhdGUgPSAzODM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAzODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzODU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzODY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMzg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM4ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAzODk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM4MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzOTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB6elN0YXRlID0gMzkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzOTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMzkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM5NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAzOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB6elN0YXRlID0gMzgzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMzg0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzk2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDM4NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDM5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMzg5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSA0MDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNjogenpTdGF0ZSA9IDM5MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB6elN0YXRlID0gNDAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMzkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDAzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDA1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAzOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDQwODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6U3RhdGUgPSAzODM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAzODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gMzk4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNDEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSA0MDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDExOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQxMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB6elN0YXRlID0gNDAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQxMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSA0MTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAzOTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSA0MDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQxNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA0MTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDM5NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNDA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQxNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA0MTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0MTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQxOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNDEyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA0MjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpTdGF0ZSA9IDQxNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OiB6elN0YXRlID0gNDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gNDE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gNDI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA0MTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDQyNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHp6U3RhdGUgPSA0MjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDQyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDQyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDM1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gNDI2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0MzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDQyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gNDM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0Mjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNDMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAzNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0MzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAzNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDM2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA0MzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOTogenpTdGF0ZSA9IDQzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMzUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0Mzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzk6IHp6U3RhdGUgPSA0Mzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MDogenpTdGF0ZSA9IDQ0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQwOiB6elN0YXRlID0gNDQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQ0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDA6IHp6U3RhdGUgPSA0NDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MDogenpTdGF0ZSA9IDQ0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0NDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQwOiB6elN0YXRlID0gNDQ0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDA6IHp6U3RhdGUgPSA0NDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDM5NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQ0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMzk0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBldmVyIHJlYWNoZWQsIHRoZXJlIGlzIGEgc2VyaW91cyBidWcgaW4gSkZsZXgKLSAgICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB6eklzRmluYWwgKSB7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCB6ek5vTG9va0FoZWFkICkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotCi0gICAgICBzd2l0Y2ggKHp6QWN0aW9uIDwgMCA/IHp6QWN0aW9uIDogWlpfQUNUSU9OW3p6QWN0aW9uXSkgewotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjY6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogCi0gICAgICAgICAgeyBpZih5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI4OiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDg6IAotICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMwOiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgICB7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMxOiBicmVhazsKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUxhbmd1YWdlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgaXNYSFRNTCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRW5jb2Rpbmc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM3OiBicmVhazsKLSAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUNvbnRlbnRUeXBlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQxOiBicmVhazsKLSAgICAgICAgY2FzZSAyOiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICAgIHsgaXNXTUwgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9QQUdFX0RJUkVDVElWRSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVTdGFydDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDY6IGJyZWFrOwotICAgICAgICBjYXNlIDY6IAotICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQ3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDg6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDUwOiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHp6SW5wdXQgPT0gWVlFT0YgJiYgenpTdGFydFJlYWQgPT0genpDdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB6ekF0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHp6RG9FT0YoKTsKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB6elNjYW5FcnJvcihaWl9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzE2NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQSGVhZFRva2VuaXplckNvbnN0YW50cyBleHRlbmRzIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMgewotCVN0cmluZyBQYWdlRGlyZWN0aXZlU3RhcnQgPSAiUGFnZURpcmVjdGl2ZVN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQYWdlRGlyZWN0aXZlRW5kID0gIlBhZ2VEaXJlY3RpdmVFbmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VMYW5ndWFnZSA9ICJQYWdlTGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VFbmNvZGluZyA9ICJQYWdlRW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VDb250ZW50VHlwZSA9ICJQYWdlQ29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmM2U5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJpdmF0ZSBTdHJpbmcgZkNoYXJzZXQ7Ci0KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVWYWx1ZTsKLQotCXByaXZhdGUgU3RyaW5nIGZMYW5ndWFnZTsKLQotCXByaXZhdGUgU3RyaW5nIGZQYWdlRW5jb2RpbmdWYWx1ZTsKLQotCXByaXZhdGUgSlNQSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgZlhNTERlY0VuY29kaW5nTmFtZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1bmljb2RlQ2FzZTsKLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQotCXByaXZhdGUgUmVhZGVyIGZSZWFkZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlhIVE1MOwotCi0JcHJpdmF0ZSBib29sZWFuIGZXTUw7Ci0KLQotCS8qKgotCSAqIE5vIEFyZyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCWNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIE51bGxNZW1lbnRvKCkgewotCQkJc3VwZXIoKTsKLQkJCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb250ZW50VHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbiBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcgcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZSB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzIG5vdCBwcmVzZW50LgotCQl9Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JLy8gdG8gZW5zdXJlIGNvbnNpc3Qgb3ZlcmFsbCBydWxlcyB1c2VkLCB3ZSdsbCBtYXJrIGFzCi0JLy8gZmluYWwsCi0JLy8gYW5kIHJlcXVpcmUgc3ViY2xhc3NlcyB0byBwcm92aWRlIGNlcnRhaW4gcGllY2VzIG9mCi0JLy8gdGhlCi0JLy8gaW1wbGVtZW50YXRpb24KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZQotCQkJLy8gdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcwotCQkJLy8gbm90IHByZXNlbnQuCi0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJaGFuZGxlU3BlY0RlZmF1bHQoKTsKLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkvLyBzYWZ0eSBuZXQKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgTnVsbE1lbWVudG8oKTsKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZkxhbmd1YWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gYnkgSlNQIFNwZWMKLQkJZmluYWwgU3RyaW5nIGVuYyA9ICJJU08tODg1OS0xIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0oU3RyaW5nIHRva2VuVHlwZSkgewotCQlib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZSA9IGZhbHNlOwotCQlpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUgfHwgdG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCWJ5dGVbXSBib20gPSAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUpID8gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzE2QkUgOiBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZMRTsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VW5pY29kZUJPTShib20pOwotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGU7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVyZSBjYW4gc29tZXRpbWVzIGJlIG11bGl0cGxlICdlbmNvZGluZ3MnIHNwZWNpZmllZCBpbiBhIGZpbGUuIFRoaXMKLQkgKiBpcyBhbiBhdHRlbXB0IHRvIGNlbnRyYWxpemUgdGhlIHJ1bGVzIGZvciBkZWNpZGluZyBiZXR3ZWVuIHRoZW0uCi0JICogUmV0dXJucyBlbmNvZGluZyBhY2NvcmRpbmcgdG8gcHJpb3JpdHk6IDEuIFhNTCBEZWNsYXJhdGlvbiAyLiBwYWdlCi0JICogZGlyZWN0aXZlIHBhZ2VFbmNvZGluZyBuYW1lIDMuIHBhZ2UgZGlyZWN0aXZlIGNvbnRlbnRUeXBlIGNoYXJzZXQgbmFtZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlRW5jb2RpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoZlhNTERlY0VuY29kaW5nTmFtZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gZlhNTERlY0VuY29kaW5nTmFtZTsKLQkJZWxzZSBpZiAoZlBhZ2VFbmNvZGluZ1ZhbHVlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBmUGFnZUVuY29kaW5nVmFsdWU7Ci0JCWVsc2UgaWYgKGZDaGFyc2V0ICE9IG51bGwpCi0JCQlyZXN1bHQgPSBmQ2hhcnNldDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZSAtLSBpdHMgaGVyZSB3ZSBwaWNrIHVwICJydWxlcyIgZm9yIGNhc2VzCi0JCS8vIHRoYXQgYXJlIG5vdCBldmVuIGluIEphdmEKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2l2ZSBwcmlvcml0eSB0byBqYXZhIGNvbm9uaWNhbCBuYW1lLCBpZiBwcmVzZW50Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCQkvLyBidXQgc3RpbGwgYWxsb3cgb3ZlcnJpZGVzCi0JCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBKU1BIZWFkVG9rZW5pemVyIGdldFRva2luaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBKU1BIZWFkVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTmFtZSwKLQkJCS8vIEVuY29kaW5nTWVtZW50by5VU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jb2RpbmdOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlZ2FsU3RyaW5nKFN0cmluZyB2YWx1ZVRva2VuVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAodmFsdWVUb2tlblR5cGUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgd2hhdCBpcyBpbiAKLQkgKiBKU1BIZWFkVG9rZW5pemVyVGVzdGVyCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlQ29udGVudFR5cGVWYWx1ZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCI7XFxzKmNoYXJzZXRcXHMqPVxccyoiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBwYXJ0cyA9IHBhdHRlcm4uc3BsaXQoY29udGVudFR5cGUpOwotCQlpZiAocGFydHMubGVuZ3RoID4gMCkgewotCQkJLy8gaWYgb25seSBvbmUgaXRlbSwgaXQgY2FuIHN0aWxsIGJlIGNoYXJzZXQgaW5zdGVhZCBvZgotCQkJLy8gY29udGVudFR5cGUKLQkJCWlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewotCQkJCWlmIChwYXJ0c1swXS5sZW5ndGgoKSA+IDYpIHsKLQkJCQkJU3RyaW5nIGNoZWNrRm9yQ2hhcnNldCA9IHBhcnRzWzBdLnN1YnN0cmluZygwLCA3KTsKLQkJCQkJaWYgKGNoZWNrRm9yQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJjaGFyc2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaW50IGVxcG9zID0gcGFydHNbMF0uaW5kZXhPZignPScpOwotCQkJCQkJZXFwb3MgPSBlcXBvcyArIDE7Ci0JCQkJCQlpZiAoZXFwb3MgPCBwYXJ0c1swXS5sZW5ndGgoKSkgewotCQkJCQkJCWZDaGFyc2V0ID0gcGFydHNbMF0uc3Vic3RyaW5nKGVxcG9zKTsKLQkJCQkJCQlmQ2hhcnNldCA9IGZDaGFyc2V0LnRyaW0oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZDb250ZW50VHlwZSA9IHBhcnRzWzBdOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkNvbnRlbnRUeXBlID0gcGFydHNbMF07Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKLQkJCWZDaGFyc2V0ID0gcGFydHNbMV07Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIExvb2tzIGZvciB3aGF0IGV2ZXIgZW5jb2RpbmcgcHJvcGVydGllcyB0aGUgdG9rZW5pemVyIHJldHVybnMuIEl0cyB0aGUKLQkgKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgdG9rZW5pemVyIHRvIHN0b3Agd2hlbiBhcHByb3ByaWF0ZSBhbmQgbm90IGdvIHRvbwotCSAqIGZhci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VIZWFkZXIoSlNQSGVhZFRva2VuaXplciB0b2tlbml6ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlmUGFnZUVuY29kaW5nVmFsdWUgPSBudWxsOwotCQlmQ2hhcnNldCA9IG51bGw7Ci0KLQkJSGVhZFBhcnNlclRva2VuIHRva2VuID0gbnVsbDsKLQkJZG8gewotCQkJLy8gZG9uJ3QgdXNlICdnZXQnIGhlcmUgKGF0IGxlYXN0IHVudGlsIHJlc2V0IGlzc3VlIGZpeGVkKQotCQkJdG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQlTdHJpbmcgdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKQotCQkJCXVuaWNvZGVDYXNlID0gdHJ1ZTsKLQkJCWVsc2UgewotCQkJCWlmICh0b2tlblR5cGUgPT0gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZykgewotCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJSGVhZFBhcnNlclRva2VuIHZhbHVlVG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWVUb2tlblR5cGUgPSB2YWx1ZVRva2VuLmdldFR5cGUoKTsKLQkJCQkJCWlmIChpc0xlZ2FsU3RyaW5nKHZhbHVlVG9rZW5UeXBlKSkgewotCQkJCQkJCWZYTUxEZWNFbmNvZGluZ05hbWUgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh0b2tlblR5cGUgPT0gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmUGFnZUVuY29kaW5nVmFsdWUgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh0b2tlblR5cGUgPT0gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlQ29udGVudFR5cGUpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmQ29udGVudFR5cGVWYWx1ZSA9IHZhbHVlVG9rZW4uZ2V0VGV4dCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VMYW5ndWFnZSkgewotCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJSGVhZFBhcnNlclRva2VuIHZhbHVlVG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWVUb2tlblR5cGUgPSB2YWx1ZVRva2VuLmdldFR5cGUoKTsKLQkJCQkJCWlmIChpc0xlZ2FsU3RyaW5nKHZhbHVlVG9rZW5UeXBlKSkgewotCQkJCQkJCWZMYW5ndWFnZSA9IHZhbHVlVG9rZW4uZ2V0VGV4dCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKTsKLQkJaWYgKGZDb250ZW50VHlwZVZhbHVlICE9IG51bGwpIHsKLQkJCXBhcnNlQ29udGVudFR5cGVWYWx1ZShmQ29udGVudFR5cGVWYWx1ZSk7Ci0JCX0KLQkJaWYgKHRva2VuaXplci5pc1hIVE1MKCkpIHsKLQkJCWZYSFRNTCA9IHRydWU7Ci0JCX0KLQkJaWYgKHRva2VuaXplci5pc1dNTCgpICkgewotCQkJZldNTCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUpTUEhlYWRUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9raW5pemVyKCk7Ci0JCWZSZWFkZXIucmVzZXQoKTsKLQkJdG9rZW5pemVyLnJlc2V0KGZSZWFkZXIpOwotCQl0cnkgewotCQkJcGFyc2VIZWFkZXIodG9rZW5pemVyKTsKLQkJCS8vIHVuaWNvZGUgc3RyZWFtIGNhc2VzIGFyZSBjcmVhdGVkIGRpcmVjdGx5IGluIHBhcnNlSGVhZGVyCi0JCQlpZiAoIXVuaWNvZGVDYXNlKSB7Ci0JCQkJU3RyaW5nIGVuYyA9IGdldEFwcHJvcHJpYXRlRW5jb2RpbmcoKTsKLQkJCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLmxlbmd0aCgpID4gMCkgewotCQkJCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uRk9VTkRfRU5DT0RJTkdfSU5fQ09OVEVOVCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZIZWFkZXJQYXJzZWQgPSBmYWxzZTsKLQkJZkVuY29kaW5nTWVtZW50byA9IG51bGw7Ci0JCWZDaGFyc2V0ID0gbnVsbDsKLQkJZkNvbnRlbnRUeXBlVmFsdWUgPSBudWxsOwotCQlmUGFnZUVuY29kaW5nVmFsdWUgPSBudWxsOwotCQlmWE1MRGVjRW5jb2RpbmdOYW1lID0gbnVsbDsKLQkJdW5pY29kZUNhc2UgPSBmYWxzZTsKLQkJZlhIVE1MPWZhbHNlOwotCQlmV01MPWZhbHNlOwotCX0KLQotCi0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcGFyYW0gcmVhc29uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCXByaXZhdGUgdm9pZCBlbnN1cmVJbnB1dFNldCgpIHsKLQkJaWYgKGZSZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dNTCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUgdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcyBub3QgcHJlc2VudC4KLQkJfQotCQlyZXR1cm4gZldNTDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1hIVE1MKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbiBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcgcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZSB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzIG5vdCBwcmVzZW50LgotCQl9Ci0JCXJldHVybiBmWEhUTUw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnlGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGYWN0b3J5Rm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjlhNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnlGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRGYWN0b3J5Rm9ySlNQIGltcGxlbWVudHMgSURvY3VtZW50RmFjdG9yeSB7Ci0KLQlwdWJsaWMgRG9jdW1lbnRGYWN0b3J5Rm9ySlNQKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRGYWN0b3J5I2NyZWF0ZURvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UobmV3IEpTUFNvdXJjZVBhcnNlcigpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJLy8gcmVtZW1iZXIsIHRoZSBMb2FkZXIKLQkJLy8gd2lsbCBuZWVkIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiBwYXJzZXIKLQkJLy8gYmFzZWQgb24gImVtYmVkZGVkIGNvbnRlbnQiCi0JCUpTUFNvdXJjZVBhcnNlciBwYXJzZXIgPSBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JCS8vIGFkZCBkZWZhdWx0IG5lc3RhYmxlIHRhZyBsaXN0Ci0JCWFkZE5lc3RhYmxlUHJlZml4KHBhcnNlciwgSlNQMTFOYW1lc3BhY2UuSlNQX1RBR19QUkVGSVgpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROZXN0YWJsZVByZWZpeChKU1BTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnTmFtZSkgewotCQlUYWdNYXJrZXIgYm0gPSBuZXcgVGFnTWFya2VyKHRhZ05hbWUpOwotCQlwYXJzZXIuYWRkTmVzdGFibGVQcmVmaXgoYm0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmIzMjFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLS8qKgotICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaGF2ZSB0d28gcmVzcG9uc2liaWxpdGllcy4gCi0gKiBPbmUgaXMgdG8gcHJvdmlkZQotICogYW5kIGVtYmVkZGVkIGZhY3RvcnkgcmVnaXN0cnkgZm9yIEpTUCBBd2FyZSBJTm9kZUFkYXB0ZXIgRmFjdG9yaWVzCi0gKiB0byB1c2UuIFRoZSBvdGhlciBpcyB0byBtb25pdG9yIHBhZ2UgZGlyZWN0aXZlcyBhbmQgaWYgCi0gKiBhIGNoYW5nZSBpbiBlbWJlZGRlZCB0eXBlIGlzIGlzIG1hZGUsIGl0IHdpbGwgc2lnbmFsIAotICogdGhlIHN0cnVjdHVyZWRNb2RlbCB0aGF0IGl0IG5lZWRzIHRvIHJlaW5pdGlhbGl6ZSBpdHNlbGYuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpOwotCi0JLyoqCi0JICogVGhpcyBzZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25jZSwgc2hvcnRseSBhZnRlcgotCSAqIGluaXRpYWxpemF0aW9uLgotCSAqLwotCXZvaWQgc2V0RW1iZWRkZWRUeXBlKEVtYmVkZGVkVHlwZUhhbmRsZXIgaGFuZGxlcik7Ci0KLQlFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkVHlwZSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdG8gZ2l2ZSB0aGlzIGFkYXB0ZXIgYSBjaGFuY2UgdG8gdXNlCi0JICogdGhlIEFkYXB0ZXJGYWN0b3JpZXMgZnJvbSB0aGUgRW1iZWRkZWRUeXBlSGFuZGxlcgotCSAqIHRvIGFkYXB0IHRoZSBub2RlLiBJdHMgdG8gYmUgdXNlZCBieSBKU1BBd2FyZUFkYXB0ZXJGYWN0b3JpZXMKLQkgKiB0byAocG90ZW50aWFsbHkpIGFkYXB0IG5vZGVzIGZyb20gdGhlIGVtYmVkZGVkIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpOwotCi0Jdm9pZCBhZGRFbWJlZGRlZEZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KTsKLQotCS8qKgotCSAqIE1ldGhvZCBzZXRMYW5ndWFnZS4KLQkgKiBAcGFyYW0gbGFuZ3VhZ2UKLQkgKi8KLQl2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSk7Ci0KLQlJTm9kZU5vdGlmaWVyIGdldFRhcmdldCgpOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTg2ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhZGFwdHMgZG9jdW1lbnQgCi0gKiB3aXRoIHRoZSBhbiBpbnN0YW5jZSBvZiBQYWdlRGlyZWN0aXZlQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0KLQlwcml2YXRlIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeS4KLQkgKiBOb3RlOiBpdHMgaW1wb3J0YW50IG5vdCB0byBiZSBhIHNpbmdsZXRvbiwgc2luY2UKLQkgKiB0aGlzIGZhY3RvcnkgbmVlZHMgdG8gdHJhY2sgaXRzIGFkYXB0ZXIocykgYW5kIHJlbGVhc2UKLQkgKiB0aGVtIHdoZW4gdGhleSBhcmUgcmVsZWFzZWQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqLwotCXByb3RlY3RlZCBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbm8gYXJndW1lbnQgY29uc3RydWN0b3IgYXNzdW1lcyBpdHMgYSAKLQkgKiBGYWN0b3J5IGZvciBQYWdlRGlyZWN0aXZlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXRoaXMoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIHRhcmdldDsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0QWRhcHRlckluc3RhbmNlKHRhcmdldCk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlICE9IG51bGwpIHsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV2UgYXNzdW1lIHRoaXMgaXMgb25seSBjYWxsZWQgZm9yICdkb2N1bWVudCcgdGFyZ2V0Ci0JICovCi0JcHJvdGVjdGVkIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIGdldEFkYXB0ZXJJbnN0YW5jZShJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQkvLyBpZiBvdXIgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMgd2l0aCBhIGRpZmZlcmVudAotCQkvLyB0YXJnZXQsIHRoZW4sIHNvbWVob3csIHRoZSBkb2N1bWVudCBub2RlIG11c3QgCi0JCS8vIGhhdmUgY2hhbmdlZCBmb3IgYSBtb2RlbCwgc28gd2Ugc2hvdWxkIHJlbGVhc2UgCi0JCS8vIG9sZCBhZGFwdGVyIGFuZCBjcmVhdGUgbmV3IG9uZSBmb3IgbmV3IGRvY3VtZW50IAotCQkvLyBub2RlLiBUaGlzIGlzIHByb2JhYmx5IGEgcHJvZ3JhbW1pbmcgZXJyb3IuCi0JCWlmIChwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlICE9IG51bGwpIHsKLQkJCWlmICh0YXJnZXQgIT0gcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZS5nZXRUYXJnZXQoKSkgewotCQkJCXJlbGVhc2UoKTsKLQkJCQlwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlID0gbmV3IFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCh0YXJnZXQpOwotCQkJfQotCQkJLy8gZWxzZSByZXR1cm4gdGhlIG9uZSB3ZSBoYXZlCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpZiBpcyBlcXVhbCB0byBudWxsLCBjcmVhdGUgYSBuZXcgb25lCi0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlID0gbmV3IFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCh0YXJnZXQpOwotCQl9Ci0JCUFzc2VydC5pc05vdE51bGwocGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSwgInBhZ2VEaXBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2Ugd2FzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCi0JCXJldHVybiBuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5KGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNmMzYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVTdGF0ZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLklDb250ZW50RGVzY3JpcHRpb25Gb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFzIHRoZSByZXNwb25zaWJpbGl0eSB0byBwcm92aWRlIGFuIGVtYmVkZGVkIGZhY3RvcnkgcmVnaXN0cnkKLSAqIGZvciBKU1AgQXdhcmUgSU5vZGVBZGFwdGVyIEZhY3RvcmllcyB0byB1c2UuCi0gKiAKLSAqIFR5cGljYWxseSwgdGhlIGVtYmVkZGVkIHR5cGUgaXMgdG8gYmUgY29uc2lkZXJlZCBhIGZlYXR1cmUgb2YgdGhlIGRvY3VtZW50LAotICogc28gSlNQIEF3YXJlIEFkcGF0ZXJGYWN0b3JpZXMgc2hvdWxkIGNhbGwKLSAqIGdldEFkYXB0ZXIoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpIGRpcmVjdG95IG9uIHRoZSBkb2N1bWVudCAob3Igb3duaW5nCi0gKiBkb2N1bWVudCkgbm9kZS4KLSAqLwotcHVibGljIGNsYXNzIFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUl9DSEFSU0VUID0gImNoYXJzZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IGFkYXB0ZXJUeXBlID0gUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3M7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIG1vZGVsOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBKQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW117ImphdmFzY3JpcHQiLCAiamF2YXNjcmlwdDEuMCIsICJqYXZhc2NyaXB0MS4xXzMiLCAiamF2YXNjcmlwdDEuMiIsICJqYXZhc2NyaXB0MS4zIiwgImphdmFzY3JpcHQxLjQiLCAiamF2YXNjcmlwdDEuNSIsICJqYXZhc2NyaXB0MS42IiwgImpzY3JpcHQiLCAic2FzaHNjcmlwdCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBKQVZBX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW117ImphdmEifTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbC4KLQkgKi8KLQlwdWJsaWMgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXN1cGVyKCk7Ci0JCW5vdGlmaWVyQXRDcmVhdGlvbiA9IHRhcmdldDsKLQkJLy8gd2UgbmVlZCB0byByZW1lbWJlciBvdXIgaW5zdGFuY2Ugb2YgbW9kZWwsCi0JCS8vIGluIGNhc2Ugd2UgbmVlZCB0byAic2lnbmFsIiBhIHJlLWluaXQgbmVlZGVkLgotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIHRhcmdldDsKLQkJCW1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBwYXJzZXMgdGhlIGZ1bGwgY29udGVudFR5cGUgdmFsdWUgaW50byBpdHMgdHdvIHBhcnRzIHRoZSBjb250ZW50VHlwZSwKLQkgKiBhbmQgdGhlIGNoYXJzZXQsIGlmIHByZXNlbnQuIE5vdGU6IHRoaXMgbWV0aG9kIGlzIGEgbGlnaHRseSBtb2RpZmllZAotCSAqIHZlcnNpb24gb2YgYSBtZXRob2QgaW4gQWJzdHJhY3RIZWFkUGFyc2VyLiBUaGVyZSwgd2UncmUgbW9zdGx5Ci0JICogaW50ZXJlc3RlZCBpbiB0aGUgY2hhcnNldCBwYXJ0IG9mIGNvbnRlbnRUeXBlVmFsdWUuIEhlcmUsIHdlJ3JlIG1vc3RseQotCSAqIGludGVyZXN0ZWQgaW4gdGhlIG1pbWVUeXBlIHBhcnQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWltZVR5cGVGcm9tQ29udGVudFR5cGVWYWx1ZShTdHJpbmcgY29udGVudFR5cGVWYWx1ZSkgewotCQlpZiAoY29udGVudFR5cGVWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBjbGVhbkNvbnRlbnRUeXBlVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcE5vbkxldHRlckRpZ2l0cyhjb250ZW50VHlwZVZhbHVlKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xlYW5Db250ZW50VHlwZVZhbHVlLCAiOz0gXHRcblxyXGYiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgdExlbiA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQkvLyBpZiBjb250YWlucyBlbmNvZGluZyBzaG91bGQgaGF2ZSB0aHJlZSB0b2tlbnMsIHRoZSBtaW1ldHlwZSwgdGhlCi0JCS8vIHdvcmQgJ2NoYXJzZXQnLCBhbmQgdGhlIGVuY29kaW5nIHZhbHVlCi0JCVN0cmluZ1tdIHRva2VucyA9IG5ldyBTdHJpbmdbdExlbl07Ci0JCWludCBqID0gMDsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXRva2Vuc1tqXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWorKzsKLQkJfQotCQkvLyAKLQkJLy8gRm9sbG93aW5nIGlzIHRoZSBjb21tb24gZm9ybSBmb3IgdGFyZ2V0IGV4cHJlc3Npb24KLQkJLy8gPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotCQkvLyBCdXQgYXBwYXJyZW50bHkgaXMgYWxzbyB2YWxpZCB3aXRob3V0IHRoZSBjb250ZW50IHR5cGUgdGhlcmUsCi0JCS8vIGp1c3QgdGhlIGNoYXJzZXQsIGFzIGZvbGxvd3M6Ci0JCS8vIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0iY2hhcnNldD1VVEYtOCI+Ci0JCS8vIFNvIHdlJ2xsIGxvb3AgdGhyb3VnaCB0b2tlbnMgYW5kIGtleSBvZmYgb2YgJ2NoYXJzZXQnCi0KLQkJaW50IGNoYXJzZXRQb3MgPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0uZXF1YWxzSWdub3JlQ2FzZShTVFJfQ0hBUlNFVCkpIHsKLQkJCQljaGFyc2V0UG9zID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvLyBTdHJpbmcgY2hhcnNldCA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0JCWlmIChjaGFyc2V0UG9zID4gLTEpIHsKLQkJCS8vIGNhc2Ugd2hlcmUgY2hhcnNldCB3YXMgcHJlc2VudAotCQkJLy8gaW50IGNoYXJzZXRWYWx1ZVBvcyA9IGNoYXJzZXRQb3MgKyAxOwotCQkJLy8gaWYgKGNoYXJzZXRWYWx1ZVBvcyA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCS8vIGNoYXJzZXQgPSB0b2tlbnNbY2hhcnNldFZhbHVlUG9zXTsKLQkJCS8vIH0KLQkJCWludCBjb250ZW50VHlwZVZhbHVlUG9zID0gY2hhcnNldFBvcyAtIDE7Ci0JCQlpZiAoY29udGVudFR5cGVWYWx1ZVBvcyA+IC0xKSB7Ci0JCQkJY29udGVudFR5cGUgPSB0b2tlbnNbY29udGVudFR5cGVWYWx1ZVBvc107Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBjaGFyc2V0IHdhcyBub3QgcHJlc2VudCwgc28gaWYgdGhlcmUncwotCQkJLy8gYSB2YWx1ZSwgd2UgYXNzdW1lIGl0cyB0aGUgY29udGVudFR5cGUgdmFsdWUKLQkJCWlmICh0b2tlbnMubGVuZ3RoID4gMCkgewotCQkJCWNvbnRlbnRUeXBlID0gdG9rZW5zWzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50VHlwZTsKLQl9Ci0KLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRUeXBlSGFuZGxlcjsKLQlwcml2YXRlIExpc3QgZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBTdHJpbmcgY2FjaGVkTGFuZ3VhZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgY2FjaGVkQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyQXRDcmVhdGlvbjsKLQotCXByaXZhdGUgaW50IGZpcnN0TGFuZ3VhZ2VQb3NpdGlvbiA9IC0xOwotCXByaXZhdGUgaW50IGZpcnN0Q29udGVudFR5cGVQb3NpdGlvbiA9IC0xOwotCi0JLyoKLQkgKiBAc2VlIElOb2RlQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBhZGFwdGVyVHlwZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElOb2RlQWRhcHRlciNub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIsIGludCwgT2JqZWN0LCBPYmplY3QsCi0JICogICAgICBPYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbWJlZGRlZFR5cGUoRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyKSB7Ci0JCS8vIGlmIHJlYWxseSB0aGUgc2FtZSBoYW5kbGVyLCBubyBuZWVkIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcKLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgPT0gaGFuZGxlcikgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIHRoZW4gb25lIGV4aXN0cywgYW5kIHRoZSBuZXcgb25lIGlzIHRydWVseSBkaWZmZXJlbnQsIHNvIHdlIG5lZWQgdG8KLQkJLy8gcmVsZWFzZSBhbmQgcmVtb3ZlIGN1cnJlbnQgZmFjdG9yaWVzCi0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGxpc3QgPSBlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGxpc3QuaGFzTmV4dCgpKSB7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGxpc3QubmV4dCgpOwotCQkJCWZhY3RvcnkucmVsZWFzZSgpOwotCQkJfQotCi0JCQllbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5jbGVhcigpOwotCQl9Ci0KLQkJZW1iZWRkZWRUeXBlSGFuZGxlciA9IGhhbmRsZXI7Ci0JCS8vIHdoZW4gdGhlIGhhbmRsZXIgaXMgc2V0LCAidHJhbnNmZXIiIGl0cyBmYWN0b3JpZXMgdG8gb3VyIG93biBsaXN0LgotCQkvLyBub3RlOiBvdXIgb3duIGxpc3QgbWF5IGFsc28gYmUgYWRkZWQgdG8gZWxzZSB3aGVyZSwgc3VjaCBhcyBvbgotCQkvLyAiZWRpdG9yIHNpZGUiLgotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGVtYmVkZGVkVHlwZUhhbmRsZXIuZ2V0QWRhcHRlckZhY3RvcmllcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQllbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5hZGQoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFBhZ2VEaXJlY3RpdmVBZGFwdGVyI2FkYXB0KElOb2RlTm90aWZpZXIsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCUlOb2RlQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQkvLyBpZiBlbWJlZGRlZENvbnRlbnRUeXBlIGhhc24ndCBiZWVuIHNldCwKLQkJLy8gdGhlbiB3ZSBjYW4gbm90IGFkYXB0IGl0LgotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlpZiAoZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuaXRlcmF0b3IoKTsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChmYWN0b3J5LmlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCQkJCXJlc3VsdCA9IGZhY3RvcnkuYWRhcHQobm90aWZpZXIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgUGFnZURpcmVjdGl2ZUFkYXB0ZXIjZ2V0RW1iZWRkZWRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZFR5cGUoKSB7Ci0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyID09IG51bGwpIHsKLQkJCWVtYmVkZGVkVHlwZUhhbmRsZXIgPSBnZXREZWZhdWx0RW1iZWRkZWRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVtYmVkZGVkVHlwZUhhbmRsZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRW1iZWRkZWRGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQkvLyBzaG91bGQgd2UgY2hlY2sgaWYgYWxyZWFkeSBleGlzdHMgaW4gbGlzdD8KLQkJZW1iZWRkZWRGYWN0b3J5UmVnaXN0cnkuYWRkKGZhY3RvcnkpOwotCX0KLQotCS8vIC8qKgotCS8vICogVXNlZCBieSBQYWdlRGlyZWN0aXZlV2F0Y2hlcnMgdG8gc2lnbmFsIHRoYXQgc29tZSBpbXBvcnRhbnQgYXR0cmlidXRlCi0JLy8gaGFzIGNoYW5nZWQsIGFuZAotCS8vICogYW55IGNhY2hlZCB2YWx1ZXMgc2hvdWxkIGJlIHJlLWNhbGN1YXRlZAotCS8vICovCi0JLy8gdm9pZCBjaGFuZ2VkKCkgewotCS8vIC8vIHdlIHdvbid0IGFjdHVhbGx5IGNoZWNrIGlmIGNoYW5nZSBpcyBuZWVkZWQsIGlmIHRoZSBtb2RlbCBzdGF0ZSBpcwotCS8vIGFscmVhZHkgY2hhbmdpbmcuCi0JLy8gaWYgKCFtb2RlbC5pc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSkgewotCS8vIC8vIGdvIHRocm91Z2ggb3VyIGxpc3Qgb2YgcGFnZSB3YXRjaGVyIGFkYXB0ZXJzLCBhbmQgdXBkYXRlcyB0aGUKLQkvLyBhdHRyaWJ1dGVzCi0JLy8gLy8gd2UncmUgaW50ZXJlc3RlZCBpbiwgaWYgYW5kIG9ubHkgaWYgdGhleSBhcmUgdGhlIGVhcmxpZXN0IG9jY3VyYW5jZQotCS8vIGluIHRoZSByZXNvdXJjZQotCS8vIFN0cmluZyBwb3RlbnRpYWxDb250ZW50VHlwZSA9IG51bGw7Ci0JLy8gU3RyaW5nIHBvdGVudGlhbExhbmd1YWdlID0gbnVsbDsKLQkvLyBpbnQgY29udGVudFR5cGVQb3NpdGlvbiA9IC0xOwotCS8vIGludCBsYW5ndWFnZVBvc2l0aW9uID0gLTE7Ci0JLy8gSXRlcmF0b3IgaXRlcmF0b3IgPSBwYWdlRGlyZWN0aXZlV2F0Y2hlcnMuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JLy8gUGFnZURpcmVjdGl2ZVdhdGNoZXIgcGRXYXRjaGVyID0gKFBhZ2VEaXJlY3RpdmVXYXRjaGVyKQotCS8vIGl0ZXJhdG9yLm5leHQoKTsKLQkvLyBTdHJpbmcgY29udGVudFR5cGUgPSBwZFdhdGNoZXIuZ2V0Q29udGVudFR5cGUoKTsKLQkvLyBTdHJpbmcgbGFuZ3VhZ2UgPSBwZFdhdGNoZXIuZ2V0TGFuZ3VhZ2UoKTsKLQkvLyBpbnQgb2Zmc2V0ID0gcGRXYXRjaGVyLmdldE9mZnNldCgpOwotCS8vIGlmIChwb3RlbnRpYWxDb250ZW50VHlwZSA9PSBudWxsIHx8IChoYXNWYWx1ZShjb250ZW50VHlwZSkgJiYgKG9mZnNldCA8Ci0JLy8gY29udGVudFR5cGVQb3NpdGlvbikpKSB7Ci0JLy8gcG90ZW50aWFsQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKLQkvLyBjb250ZW50VHlwZVBvc2l0aW9uID0gb2Zmc2V0OwotCS8vIH0KLQkvLyB9Ci0JLy8gLy8gbm93IHdlIGhhdmUgdGhlIGJlc3QgY2FuZGlhdGVzIGZvciBjYWNoZWQgdmFsdWVzLCBsZXQncyBzZWUgaWYKLQkvLyB0aGV5J3ZlIHJlYWxseSBjaGFuZ2VkIGZyb20KLQkvLyAvLyB3aGF0IHdlIGhhZC4gSWYgc28sIG5vdGUgd2UgZ28gdGhyb3VnaCB0aGUgc2V0dGVycyBzbyBzaWRlIGVmZmVjdHMKLQkvLyBjYW4gdGFrZSBwbGFjZSB0aGVyZS4KLQkvLyBwb3RlbnRpYWxDb250ZW50VHlwZSA9Ci0JLy8gZ2V0TWltZVR5cGVGcm9tQ29udGVudFR5cGVWYWx1ZShwb3RlbnRpYWxDb250ZW50VHlwZSk7Ci0JLy8gaWYgKHBvdGVudGlhbENvbnRlbnRUeXBlID09IG51bGwgfHwgcG90ZW50aWFsQ29udGVudFR5cGUubGVuZ3RoKCkgPT0gMCkKLQkvLyB7Ci0JLy8gLy9wb3RlbnRpYWxDb250ZW50VHlwZSA9IGdldERlZmF1bHRDb250ZW50VHlwZSgpOwotCS8vIH0gZWxzZSB7Ci0JLy8gc2V0Q2FjaGVkQ29udGVudFR5cGUocG90ZW50aWFsQ29udGVudFR5cGUpOwotCS8vIH0KLQkvLwotCS8vIGlmIChwb3RlbnRpYWxMYW5ndWFnZSAhPSBudWxsICYmIGhhc1ZhbHVlKHBvdGVudGlhbExhbmd1YWdlKSkgewotCS8vIHNldENhY2hlZExhbmd1YWdlKHBvdGVudGlhbExhbmd1YWdlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQl2b2lkIGNoYW5nZWRDb250ZW50VHlwZShpbnQgZWxlbWVudE9mZnNldCwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCS8vIG9ubHkgbmVlZCB0byBwcm9jZXNzIGlmIHRoaXMgbmV3IHZhbHVlIGlzCi0JCS8vIGVhcmxpZXIgaW4gdGhlIGZpbGUgdGhhbiBvdXIgY3VycmVudCB2YWx1ZQotCQlpZiAoZmlyc3RDb250ZW50VHlwZVBvc2l0aW9uID09IC0xIHx8IGVsZW1lbnRPZmZzZXQgPD0gZmlyc3RDb250ZW50VHlwZVBvc2l0aW9uKSB7Ci0JCQkvLyBkd19UT0RPOiB1cGRhdGUgZW1iZWRkZWQgcGFydGl0aW9uZXIgaW4gSlNQIGRvY3VtZW50Ci0JCQkvLyBwYXJ0aXRpb25lcgotCQkJLy8gbnNkX1RPRE86IHVwZGF0ZSBlbWJlZGRlZCBwYXJ0aXRpb25lciBpbiBKU1AgZG9jdW1lbnQKLQkJCS8vIHBhcnRpdGlvbmVyCi0KLQkJCS8vIG5vIG5lZWQgdG8gY2hhbmdlIGN1cnJlbnQgdmFsdWUsIGlmIHdlJ3JlIHRvbGQgc29tZQotCQkJLy8gZWFybGllciB2YWx1ZSBpcyBudWxsIG9yIGJsYW5rIChzb3VuZHMgbGlrZSBhbiBlcnJvciwgYW55d2F5KQotCQkJaWYgKGhhc1ZhbHVlKG5ld1ZhbHVlKSkgewotCQkJCWZpcnN0Q29udGVudFR5cGVQb3NpdGlvbiA9IGVsZW1lbnRPZmZzZXQ7Ci0JCQkJU3RyaW5nIHBvdGVudGlhbENvbnRlbnRUeXBlID0gZ2V0TWltZVR5cGVGcm9tQ29udGVudFR5cGVWYWx1ZShuZXdWYWx1ZSk7Ci0JCQkJLy8gb25seSBkbyB0aGUgc2V0IHByb2Nlc3NpbmcgaWYgZGlmZmVyZW50Ci0JCQkJLy8gZnJvbSB3aGF0IGl0IGFscmVhZHkgaXMKLQkJCQkvLyBpZiAoIXBvdGVudGlhbENvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoY2FjaGVkTGFuZ3VhZ2UpKQotCQkJCS8vIHsKLQkJCQlzZXRDYWNoZWRDb250ZW50VHlwZShwb3RlbnRpYWxDb250ZW50VHlwZSk7Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlZCBieSBQYWdlRGlyZWN0aXZlV2F0Y2hlcnMgdG8gc2lnbmFsIHRoYXQgc29tZSBpbXBvcnRhbnQgYXR0cmlidXRlCi0JICogaGFzIGNoYW5nZWQsIGFuZCBhbnkgY2FjaGVkIHZhbHVlcyBzaG91bGQgYmUgcmUtY2FsY3VhdGVkCi0JICovCi0Jdm9pZCBjaGFuZ2VkTGFuZ3VhZ2UoaW50IGVsZW1lbnRPZmZzZXQsIFN0cmluZyBuZXdWYWx1ZSkgewotCQkvLyBvbmx5IG5lZWQgdG8gcHJvY2VzcyBpZiB0aGlzIG5ldyB2YWx1ZSBpcwotCQkvLyBlYXJsaWVyIGluIHRoZSBmaWxlIHRoYW4gb3VyIGN1cnJlbnQgdmFsdWUKLQkJLy8gaGFzIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0bywgaW4gY2FzZSBvdXIgcHJldmlvdXMgZWFybGllc3Qgb25lLAotCQkvLyBpcyBpdHNlbGYgY2hhbmdpbmchCi0JCWlmIChmaXJzdExhbmd1YWdlUG9zaXRpb24gPT0gLTEgfHwgZWxlbWVudE9mZnNldCA8PSBmaXJzdExhbmd1YWdlUG9zaXRpb24pIHsKLQotCQkJLy8gbm8gbmVlZCB0byBjaGFuZ2UgY3VycmVudCB2YWx1ZSwgaWYgd2UncmUgdG9sZCBzb21lCi0JCQkvLyBlYXJsaWVyIHZhbHVlIGlzIG51bGwgb3IgYmxhbmsgKHNvdW5kcyBsaWtlIGFuIGVycm9yLCBhbnl3YXkpCi0JCQlpZiAoaGFzVmFsdWUobmV3VmFsdWUpKSB7Ci0JCQkJZmlyc3RMYW5ndWFnZVBvc2l0aW9uID0gZWxlbWVudE9mZnNldDsKLQkJCQkvLyBvbmx5IGRvIHRoZSBzZXQgcHJvY2Vzc2luZyBpZiBkaWZmZXJlbnQKLQkJCQkvLyBmcm9tIHdoYXQgaXQgYWxyZWFkeSBpcwotCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzSWdub3JlQ2FzZShjYWNoZWRMYW5ndWFnZSkpIHsKLQkJCQkJc2V0Q2FjaGVkTGFuZ3VhZ2UobmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZHdfVE9ETzogc2V0IGxhbmd1YWdlIGluIGRvY3VtZW50IHBhcnRpdGlvbmVyCi0JCQkvLyBuc2RfVE9ETzogc2V0IGxhbmd1YWdlIGluIGRvY3VtZW50IHBhcnRpdGlvbmVyCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IFBhZ2VEaXJlY3RpdmVXYXRjaGVycyB0byBzaWduYWwgdGhhdCBzb21lIGltcG9ydGFudCBhdHRyaWJ1dGUKLQkgKiBoYXMgY2hhbmdlZCwgYW5kIGFueSBjYWNoZWQgdmFsdWVzIHNob3VsZCBiZSByZS1jYWxjdWF0ZWQKLQkgKi8KLQl2b2lkIGNoYW5nZWRQYWdlRW5jb2RpbmcoaW50IGVsZW1lbnRPZmZzZXQsIFN0cmluZyBuZXdWYWx1ZSkgewotCi0JCS8vIHdlIGRvbid0IGN1cnJlbnRseSB0cmFjayBhY3RpdmUgdmFsdWUsIHNpbmNlCi0JCS8vIGp1c3QgbmVlZCBkdXJpbmcgcmVhZCBhbmQgd3JpdGUgKHdoZXJlIGl0cwotCQkvLyBjYWxjdWxhdGVkLiBXZSB3aWxsIG5lZWQgaW4gZnV0dXJlLCB0bwotCQkvLyBhY3VyYXRlbHkgY2xvbmUgYSBtb2RlbCBhbmQgdG8gZGlzcGxheQotCQkvLyAiY3VycmVudCBlbmNvZGluZyIgdG8gdXNlciBpbiBzdGF0dXMgYmFyLgotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBoYXNWYWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2FjaGVkQ29udGVudFR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoY2FjaGVkQ29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJY2FjaGVkQ29udGVudFR5cGUgPSBnZXREZWZhdWx0Q29udGVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldERlZmF1bHRDb250ZW50VHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRDb250ZW50VHlwZSgpIHsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShtb2RlbCk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCXR5cGUgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPTlRFTlRUWVBFLCBmaWxlLCB0cnVlKTsKLQkJfQotCQkvLyBCVUcxMzY0NjgKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXR5cGUgPSAidGV4dC9odG1sIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYWNoZWRMYW5ndWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCWlmIChjYWNoZWRMYW5ndWFnZSA9PSBudWxsKQotCQkJY2FjaGVkTGFuZ3VhZ2UgPSBnZXREZWZhdWx0TGFuZ3VhZ2UoKTsKLQkJcmV0dXJuIGNhY2hlZExhbmd1YWdlOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0TGFuZ3VhZ2UuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TGFuZ3VhZ2UoKSB7Ci0JCVN0cmluZyBsYW5ndWFnZSA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKG1vZGVsKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJbGFuZ3VhZ2UgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBmaWxlLCB0cnVlKTsKLQkJfQotCQkvLyBCVUcxMzY0NjgKLQkJaWYgKGxhbmd1YWdlID09IG51bGwpCi0JCQlsYW5ndWFnZSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2FjaGVkQ29udGVudFR5cGUuCi0JICogCi0JICogQHBhcmFtIGNhY2hlZENvbnRlbnRUeXBlCi0JICogICAgICAgICAgICBUaGUgY2FjaGVkQ29udGVudFR5cGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVkQ29udGVudFR5cGUoU3RyaW5nIG5ld0NvbnRlbnRUeXBlKSB7Ci0JCS8qCi0JCSAqIGlmIHRoZSBwYXNzZWQgaW4gdmFsdWUgaXMgdGhlIHNhbWUgYXMgZXhpc3RpbmcsIHRoZXJlJ3Mgbm90aGluZyB0bwotCQkgKiBkby4gaWYgaXRzIGRpZmZlcmVudCwgdGhlbiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgY29udGVudEhhbmRsZXIgYXMKLQkJICogd2VsbCBhbmQsIG1vcmUgdG8gdGhlIHBvaW50LCBzaWduYWwgYSByZS1pbml0aWFsaXp0YXRpb24gaXMgbmVlZGVkLgotCQkgKiAKLQkJICogTm90ZTogaWYgdGhlIHZhbHVlIHdlJ3JlIGdldHRpbmcgc2V0IHRvIGRvZXMgbm90IGhhdmUgYSBoYW5kbGVyIGluCi0JCSAqIHRoZSByZWdpc3RyeSwgd2UnbGwgYWN0dWFsbHkgbm90IHNldCBpdCB0byBudWxsIG9yIGFueXRoaW5nLCB3ZSdsbAotCQkgKiBqdXN0IGNvbnRpbnVlIG9uIHdpdGggdGhlIG9uZSB3ZSBoYXZlLiBUaGlzIGlzIHByZXR0eSBpbXBvcnRhbnQgdG8KLQkJICogYXZvaWQgcmUtaW5pdGlhbGl6aW5nIG9uIGV2ZXJ5IGtleSBzdHJva2UgaWYgc29tZW9uZSBpcyB0eXBpbmcgaW4gYQotCQkgKiBuZXcgY29udGVudCB0eXBlLCBidXQgaGF2ZW4ndCB5ZXQgZmluaXNoZWQgdGhlIHdob2xlICJ3b3JkIi4KLQkJICogSG93ZXZlciwgaWYgYW4gY29udGVudFR5cGUgaXMgbm90IHJlY29nbml6ZWQsIHRoZSByZWdpc3RyeSByZXR1cm5zCi0JCSAqIHRoZSBvbmUgZm9yIFhNTC4KLQkJICovCi0JCQotCQkvKiBzZXQgdGhlIGFjdHVhbCB2YWx1ZSBmaXJzdCwgdGhlIHJlc3QgaXMgInNpZGUgZWZmZWN0IiAqLwotCQl0aGlzLmNhY2hlZENvbnRlbnRUeXBlID0gbmV3Q29udGVudFR5cGU7Ci0KLQkJLyogc2VlIGlmIHdlIG5lZWQgdG8gdXBkYXRlIGVtYmVkZGVkIGhhbmRsZXIgKi8KLQotCQkvKgotCQkgKiBJZiB0aGUgZG9jdW1lbnQgaXMgYSB0eXBlIG9mIFhIVE1MLCB3ZSBkbyBub3QgdXNlIHRoZSBwYWdlCi0JCSAqIGRpcmVjdGl2ZSdzIGNvbnRlbnRUeXBlIHRvIGRldGVybWluZSB0aGUgZW1iZWRkZWQgdHlwZSAuLi4gaXRzCi0JCSAqIFhIVE1MISAuLi4gYW5kLCBldmVudHVhbGx5LCB0aGUgRE9DVFlQRSBhZGFwdGVyIHNob3VsZCBkZXRlcm1pbmUKLQkJICogaWYvd2hlbiBpdCBuZWVkcyB0byBjaGFuZ2UuCi0JCSAqLwotCi0JCS8qIGp1c3Qgc2FmZXR5IGNoZWNrLCBjYW4gYmUgcmVtb3ZlZCBsYXRlciwgZWFybHkgaW4gcmVsZWFzZSBjeWNsZSAqLwotCQlpZiAobW9kZWwgPT0gbnVsbCkgewotCQkJLy8gdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtb2RlbCBzaG91bGQgbmV2ZXIgYmUgbnVsbCBpbgotCQkJLy8gUGFnZURpcmVjdGl2ZSBBZGFwdGVyIik7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIm1vZGVsIHNob3VsZCBuZXZlciBiZSBudWxsIGluIFBhZ2VEaXJlY3RpdmUgQWRhcHRlciIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBwb3RlbnRpYWxOZXdhbmRsZXIgPSBudWxsOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGdldENvbnRlbnREZXNjcmlwdGlvbihtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCU9iamVjdCBwcm9wID0gY29udGVudERlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9GQU1JTFlfQVRUUklCVVRFKTsKLQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJaWYgKENvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTC5IVE1MX0ZBTUlMWS5lcXVhbHMocHJvcCkpIHsKLQkJCQlwb3RlbnRpYWxOZXdhbmRsZXIgPSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRm9yKCJ0ZXh0L2h0bWwiKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwb3RlbnRpYWxOZXdhbmRsZXIgPT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIGdldEhhbmRsZXIgc2hvdWxkIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nIChuZXZlciBudWxsKSwgYmFzZWQKLQkJCSAqIG9uIHRoZSBydWxlcyBpbiB0aGUgZmFjdG9yeS4KLQkJCSAqLwotCQkJcG90ZW50aWFsTmV3YW5kbGVyID0gZ2V0SGFuZGxlckZvcih0aGlzLmNhY2hlZENvbnRlbnRUeXBlKTsKLQkJfQotCQkvKgotCQkgKiB3ZSBkbyB0aGlzIGNoZWNrIGZvciByZS1pbml0IGhlcmUsIGluc3RlYWQgb2YgaW4gc2V0RW1iZWRkZWRUeXBlLAotCQkgKiBzaW5jZSBzZXRFbWJlZGRlZFR5cGUgaXMgY2FsbGVkIGR1cmluZyB0aGUgbm9ybWFsIGluaXRpYWxpenRpb24KLQkJICogcHJvY2Vzcywgd2hlbiByZS1pbml0IGlzIG5vdCBuZWVkZWQgKHNpbmNlIHRoZXJlIGlzIG5vIGNvbnRlbnQpCi0JCSAqLwotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciA9PSBudWxsKSB7Ci0JCQlzZXRFbWJlZGRlZFR5cGUocG90ZW50aWFsTmV3YW5kbGVyKTsKLQkJfQotCQllbHNlIGlmIChwb3RlbnRpYWxOZXdhbmRsZXIgIT0gbnVsbCAmJiBlbWJlZGRlZFR5cGVIYW5kbGVyICE9IHBvdGVudGlhbE5ld2FuZGxlcikgewotCQkJLyoKLQkJCSAqIGNoYW5naW5nIHRoaXMgZW1iZWRkZWQgaGFuZGxlciBoZXJlIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIGEKLQkJCSAqIG5vdGlmeSBsb29wLiBUaGF0J3Mgd2h5IHdlIHNldCB0aGF0ICJpdCdzIG5lZWRlZCIuIFRoZW4gdGhlCi0JCQkgKiBtb2RlbCBkZWNpZGVzIHdoZW4gaXRzICJzYWZlIiB0byBhY3R1YWxseSBkbyB0aGUgcmUtaW5pdC4KLQkJCSAqIAotCQkJICogYmUgc3VyZSB0byBob2xkIG9sZEhhbmRsZXIgaW4gdGVtcCB2YXIgb3IgZWxzZSBzZXRFbWJlZGRlZFR5cGUKLQkJCSAqIHdpbGwgInJlc2V0IiBpdCBiZWZvcmUgbW9kZWxSZWluaXROZWVkZWQob2xkSGFuZGxlciwgaGFuZGxlcikKLQkJCSAqIGlzIGNhbGxlZAotCQkJICogCi0JCQkgKi8KLQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkSGFuZGxlciA9IGVtYmVkZGVkVHlwZUhhbmRsZXI7Ci0JCQlzZXRFbWJlZGRlZFR5cGUocG90ZW50aWFsTmV3YW5kbGVyKTsKLQkJCW1vZGVsUmVpbml0TmVlZGVkKG9sZEhhbmRsZXIsIHBvdGVudGlhbE5ld2FuZGxlcik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmUtaW5pdCBiYXNlZCBvbiBlbWJlZGRlZFR5cGVIYW5kbGVyIGNoYW5naW5nLgotCSAqIEl0IGlzIGdpdmVuIHByaW9yaXR5IG92ZXIgdGhlIGxhbmd1YWdlIGNoYW5nZSwgc2luY2UgdGhlcmUgaXRzIG1vcmUKLQkgKiBpbXBvcnRhbnQgdG8gaGF2ZSBvbGQgYW5kIG5ldyBoYW5kbGVycydzIGluIHRoZSBzdGF0ZURhdGEgZmllbGQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vZGVsUmVpbml0TmVlZGVkKEVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkSGFuZGxlciwgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdIYW5kbGVyKSB7Ci0JCWlmIChtb2RlbC5pc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJhbHJlYWR5IGJlaW5nIGluaXRpYWxpemVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCW1vZGVsLnNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShuZXcgRW1iZWRkZWRUeXBlU3RhdGVEYXRhKG9sZEhhbmRsZXIsIG5ld0hhbmRsZXIpKTsKLQkJCW1vZGVsLnNldFJlaW5pdGlhbGl6ZU5lZWRlZCh0cnVlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIG1vZGVsUmVpbml0TmVlZGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBtb2RlbFJlaW5pdE5lZWRlZChTdHJpbmcgb2xkbGFuZ3VhZ2UsIFN0cmluZyBuZXdMYW5ndWFnZSkgewotCQkvLyBiaXQgb2YgYSBzaG9ydCBjdXQgZm9yIG5vdyAuLi4uIHdlIGRvbnQnIG5lZWQgbGFuZ3VhZ2UgYXQgdGhlCi0JCS8vIG1vbWVudCwKLQkJLy8gYnV0IHNob3VsZCBzZXQgdGhlIHN0YXRlIGRhdGEKLQkJaWYgKG1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJhbHJlYWR5IGJlaW5nIGluaXRpYWxpemVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJLy8gaWYgYWxyZWFkeSBiZWluZyByZS1pbml0aWFsaXplZCwgd2UgZG9uJ3Qgd2FudCB0bwotCQkJCS8vIHJlc2V0IHRoZSBkYXRhIGluIHRoZSBzdGF0ZURhdGEgZmllbGQuCi0JCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJbW9kZWwuc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKG5ld0xhbmd1YWdlKTsKLQkJCQltb2RlbC5zZXRSZWluaXRpYWxpemVOZWVkZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlZExhbmd1YWdlKFN0cmluZyBuZXdMYW5ndWFnZSkgewotCQlpZiAoY2FjaGVkTGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZVN0YXRlQ2hhbmdlZChjYWNoZWRMYW5ndWFnZSwgbmV3TGFuZ3VhZ2UpKSB7Ci0JCQkvKgotCQkJICogYSBjb21wbGV0ZSByZS1pbml0IG92ZXJraWxsIGluIGN1cnJlbnQgc3lzdGVtLCBzaW5jZSByZWFsbHkKLQkJCSAqIGp1c3QgbmVlZCBmb3IgdGhlIGxpbmUgc3R5bGUgcHJvdmlkZXJzLCBCVVQsIGEgY2hhbmdlIGluCi0JCQkgKiBsYW5ndWFnZSBjb3VsZCBlZmZlY3Qgb3RoZXIgdGhpbmdzLCBhbmQgd2UgZG9uJ3QgZXhwZWN0IHRvCi0JCQkgKiBoYXBwZW4gb2Z0ZW4gc28gYSBsaXR0bGUgb3ZlcmtpbGwgaXNuJ3QgdG9vIGJhZC4gVGhlIGRlZXAKLQkJCSAqIHByb2JsZW0gaXMgdGhhdCB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IGF0IHRoZSAiZWRpdCBzaWRlIgotCQkJICogYWRwYXB0ZXJzIHNwZWNpZmljYWxseSBoZXJlIGluIG1vZGVsIGNsYXNzLiB3ZSBoYXZlIHRvIGRvIHRoZQotCQkJICogbW9kZWwgY2hhbmdlZCBzZXF1ZW5jZSB0byBnZXQgdGhlIHNjcmVlbiB0byB1cGRhdGUuIGRvIG5vdAotCQkJICogc2lnbmFsIGFnYWluLCBpZiBzaWduYWxlZCBvbmNlICh0aGUgcmVpbml0IHN0YXRlIGRhdGEgd2lsbCBiZQotCQkJICogd3JvbmcuICh0aGlzIG5lZWRzIHRvIGJlIGltcHJvdmVkIGluIGZ1dHVyZSkKLQkJCSAqLwotCQkJaWYgKCFtb2RlbC5pc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSkgewotCQkJCW1vZGVsUmVpbml0TmVlZGVkKGNhY2hlZExhbmd1YWdlLCBuZXdMYW5ndWFnZSk7Ci0JCQl9Ci0JCX0KLQkJc2V0TGFuZ3VhZ2UobmV3TGFuZ3VhZ2UpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgcHVibGljIGFjY2VzcyBtZXRob2QsIHVzZWQgZXNwZWNpYWxseSBmcm9tIGxvYWRlciwgZm9yIEpTUAotCSAqIEZyYWdtZW50IHN1cHBvcnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCXRoaXMuY2FjaGVkTGFuZ3VhZ2UgPSBuZXdMYW5ndWFnZTsKLQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSAoKElEb2N1bWVudEV4dGVuc2lvbjMpIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcpOwotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQKSB7Ci0JCQkoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIHBhcnRpdGlvbmVyKS5zZXRMYW5ndWFnZShuZXdMYW5ndWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgbGFuZ3VhZ2VTdGF0ZUNoYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2FjaGVkTGFuZ3VhZ2UKLQkgKiBAcGFyYW0gbmV3TGFuZ3VhZ2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbGFuZ3VhZ2VTdGF0ZUNoYW5nZWQoU3RyaW5nIGNhY2hlZExhbmd1YWdlLCBTdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgLy8gbGFuZ3VhZ2VzIGFyZSBlcXVhbCwgdGhlbiBubyBjaGFuZ2UgaW4KLQkJLy8gc3RhdGUKLQkJaWYgKCFjYWNoZWRMYW5ndWFnZS5lcXVhbHNJZ25vcmVDYXNlKG5ld0xhbmd1YWdlKSkgewotCQkJYm9vbGVhbiBvbGRMYW5ndWFnZUtub3duID0gbGFuZ3VhZ2VLbm93bihjYWNoZWRMYW5ndWFnZSk7Ci0JCQlib29sZWFuIG5ld0xhbmd1YWdlS25vd24gPSBsYW5ndWFnZUtub3duKG5ld0xhbmd1YWdlKTsKLQkJCXJlc3VsdCA9IG5ld0xhbmd1YWdlS25vd24gfHwgKCFuZXdMYW5ndWFnZUtub3duICYmIG9sZExhbmd1YWdlS25vd24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGxhbmd1YWdlS25vd24uCi0JICogCi0JICogQHBhcmFtIGNhY2hlZExhbmd1YWdlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxhbmd1YWdlS25vd24oU3RyaW5nIGxhbmd1YWdlKSB7Ci0JCXJldHVybiAoU3RyaW5nVXRpbHMuY29udGFpbnMoSkFWQV9MQU5HVUFHRV9LRVlTLCBsYW5ndWFnZSwgZmFsc2UpIHx8IFN0cmluZ1V0aWxzLmNvbnRhaW5zKEpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUywgbGFuZ3VhZ2UsIGZhbHNlKSk7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0SGFuZGxlckZvcihTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJRW1iZWRkZWRUeXBlUmVnaXN0cnkgcmVnID0gZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCk7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCWlmIChyZWcgIT0gbnVsbCkKLQkJCWhhbmRsZXIgPSByZWcuZ2V0VHlwZUZvcihjb250ZW50VHlwZSk7Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkKLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEZvciBKU1AgZmlsZXMsIHRleHQvaHRtbCBpcyB0aGUgZGVmYXVsdCBjb250ZW50IHR5cGUuIFRoaXMgbWF5IHdhbnQKLQkgKiB0aGlzIGRpZmZlcmVudCBmb3IgdHlwZXMgbGlrZSBqc3YgKGpzcCBmb3Igdm9pY2UgeG1sKSBGb3Igbm93LCBoYXJkCi0JICogY29kZSB0byBuZXcgaW5zdGFuY2UuIEluIGZ1dHVyZSwgc2hvdWxkIGdldCBpbnN0YW5jZSBmcm9tIHJlZ2lzdHJ5LgotCSAqIAotCSAqIFNwZWNpZmljYXRpb24gY2l0ZXMgSFRNTCBhcyB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXREZWZhdWx0RW1iZWRkZWRUeXBlKCkgewotCQlyZXR1cm4gZ2V0SGFuZGxlckZvcihnZXREZWZhdWx0Q29udGVudFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIElOb2RlTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gbm90aWZpZXJBdENyZWF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyICE9IG51bGwpIHsKLQkJCWlmIChlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5pdGVyYXRvcigpOwotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gcGFfVE9ETzogcG9zc2libHkgbmVlZCB0byByZWxlYXNlIGhlcmUuLi4KLQkJCS8vIG9yICJ1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkiCi0JCQkvLyBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5IHdhcyBjYWxsZWQgZnJvbSBKU1BNb2RlbExvYWRlcgotCQkJZW1iZWRkZWRUeXBlSGFuZGxlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50UmVhZGVyIGluID0gbmV3IERvY3VtZW50UmVhZGVyKGRvYyk7Ci0JCXJldHVybiBnZXRDb250ZW50RGVzY3JpcHRpb24oaW4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29udGVudCBkZXNjcmlwdGlvbiBmb3IgYW4gaW5wdXQgc3RyZWFtIEFzc3VtZXMgaXQncyBKU1AKLQkgKiBjb250ZW50LiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbSB3aGVuIGZpbmlzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqIEByZXR1cm4gdGhlIElDb250ZW50RGVzY3JpcHRpb24gZm9yIGluLCBvciBudWxsIGlmIGluIGlzIG51bGwKLQkgKi8KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKFJlYWRlciBpbikgewotCi0JCWlmIChpbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjID0gbnVsbDsKLQkJdHJ5IHsKLQotCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCQlkZXNjID0gY29udGVudFR5cGVKU1AuZ2V0RGVzY3JpcHRpb25Gb3IoaW4sIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVzYzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDQzYThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotCi1pbnRlcmZhY2UgUGFnZURpcmVjdGl2ZVdhdGNoZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7Ci0KLQlTdHJpbmcgZ2V0TGFuZ3VhZ2UoKTsKLQotCWludCBnZXRPZmZzZXQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYmIwN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkgZXh0ZW5kcyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5KCkgewotCQl0aGlzKFBhZ2VEaXJlY3RpdmVXYXRjaGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyS2V5Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKi8KLQlwdWJsaWMgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5KE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCVBhZ2VEaXJlY3RpdmVXYXRjaGVyIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgewotCQkJSURPTUVsZW1lbnQgeG1sRWxlbWVudCA9IChJRE9NRWxlbWVudCkgdGFyZ2V0OwotCQkJaWYgKHhtbEVsZW1lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IHhtbEVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKCJqc3A6ZGlyZWN0aXZlLnBhZ2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJlc3VsdCA9IG5ldyBQYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwoeG1sRWxlbWVudCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9fQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTg3ODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkF0dHJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi0KLS8qKiAKLSAqIFRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGlzIGNsYXNzIGlzIHRvIG1vbml0b3IgcGFnZSBkaXJlY3RpdmVzIGFuZCBpZiAKLSAqIGEgY2hhbmdlIGluIGVtYmVkZGVkIHR5cGUgaXMgaXMgbWFkZSwgaXQgd2lsbCBzaWduYWwgCi0gKiB0aGUgc3RydWN0dXJlZE1vZGVsIHRoYXQgaXQgbmVlZHMgdG8gcmVpbml0aWFsaXplIGl0c2VsZi4KLSAqLwotY2xhc3MgUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsIGltcGxlbWVudHMgUGFnZURpcmVjdGl2ZVdhdGNoZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGFkYXB0ZXJUeXBlID0gUGFnZURpcmVjdGl2ZVdhdGNoZXIuY2xhc3M7Ci0JSURPTUVsZW1lbnQgdGFyZ2V0RWxlbWVudDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwuCi0JICovCi0JcHVibGljIFBhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbChJRE9NRWxlbWVudCB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGFyZ2V0RWxlbWVudCA9IHRhcmdldDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlVmFsdWUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCJjb250ZW50VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50VHlwZVZhbHVlICE9IG51bGwpIHsKLQkJCS8vIHVzaW5nIGNvbmNyZXRlIGNsYXNzIGJlbG93LCBzaW5jZSAiY2hhbmdlZCIgaXMgc29tZXRoaW5nIG9mIGFuIGludGVybmFsIG1ldGhvZAotCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCkgKChJRE9NRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNoYW5nZWRDb250ZW50VHlwZSgoKEluZGV4ZWRSZWdpb24pIHRhcmdldEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksIGNvbnRlbnRUeXBlVmFsdWUpOwotCQl9Ci0JCVN0cmluZyBsYW5ndWFnZVZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgibGFuZ3VhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobGFuZ3VhZ2VWYWx1ZSAhPSBudWxsKSB7Ci0JCQkvLyB1c2luZyBjb25jcmV0ZSBjbGFzcyBiZWxvdywgc2luY2UgImNoYW5nZWQiIGlzIHNvbWV0aGluZyBvZiBhbiBpbnRlcm5hbCBtZXRob2QKLQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwpICgoSURPTURvY3VtZW50KSB0YXJnZXRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5jaGFuZ2VkTGFuZ3VhZ2UoKChJbmRleGVkUmVnaW9uKSB0YXJnZXRFbGVtZW50KS5nZXRTdGFydE9mZnNldCgpLCBsYW5ndWFnZVZhbHVlKTsKLQkJfQotCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBhZGFwdGVyVHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIHdlIHNob3VsZCBvbmx5IGJlIGFkZGVkIHRvIHBhZ2UgZGlyZWN0aXZlcywgc28gaWYgd2Ugc2VlIGEgcGFnZSBkaXJlY3RpdmUKLQkJLy8gY2hhbmdlLCB3ZSBuZWVkIHRvIGNoZWNrIGl0cyBhdHRyaWJ1dGVzLCBhbmQgbm90aWZ5IHRoZSBQYWdlRGlyZWN0aXZlQWRhcHRlciB3aGVuIAotCQkvLyBjZXJ0YWluIG9uZXMgY2hhbmUsIHNvIGl0IGNhbiBtYWtlIGl0cyAiY2VudHJhbGl6ZWQiIGRlY2lzaW9ucy4KLQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQotCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQkJaWYgKGNoYW5nZWRGZWF0dXJlIGluc3RhbmNlb2YgQXR0ckltcGwpIHsKLQkJCQkJCUF0dHJJbXBsIGF0dHJpYnV0ZSA9IChBdHRySW1wbCkgY2hhbmdlZEZlYXR1cmU7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMoImNvbnRlbnRUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIHVzaW5nIGNvbmNyZXRlIGNsYXNzIGJlbG93LCBzaW5jZSAiY2hhbmdlZCIgaXMgc29tZXRoaW5nIG9mIGFuIGludGVybmFsIG1ldGhvZAotCQkJCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwpICgoSURPTURvY3VtZW50KSB0YXJnZXRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2hhbmdlZENvbnRlbnRUeXBlKCgoSW5kZXhlZFJlZ2lvbikgdGFyZ2V0RWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSwgKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCQkJfQotCQkJCQkJaWYgKG5hbWUuZXF1YWxzKCJsYW5ndWFnZSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCS8vIHVzaW5nIGNvbmNyZXRlIGNsYXNzIGJlbG93LCBzaW5jZSAiY2hhbmdlZCIgaXMgc29tZXRoaW5nIG9mIGFuIGludGVybmFsIG1ldGhvZAotCQkJCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwpICgoSURPTURvY3VtZW50KSB0YXJnZXRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2hhbmdlZExhbmd1YWdlKCgoSW5kZXhlZFJlZ2lvbikgdGFyZ2V0RWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSwgKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLlJFTU9WRSA6Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJyZW1vdmVkIituZXcgRGF0ZSgpLnRvU3RyaW5nKCkpOwotCQkJCQlicmVhazsKLQotCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlTdHJpbmcgY29udGVudFR5cGVWYWx1ZSA9IHRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjb250ZW50VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb250ZW50VHlwZVZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCVN0cmluZyBsYW5ndWFnZVZhbHVlID0gdGFyZ2V0RWxlbWVudC5nZXRBdHRyaWJ1dGUoImxhbmd1YWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGxhbmd1YWdlVmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0YXJnZXRFbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0F0dHJJbXBsRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0F0dHJJbXBsRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzBjNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9BdHRySW1wbEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkF0dHJJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgQXR0ckltcGxGb3JKU1AgZXh0ZW5kcyBBdHRySW1wbCB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZExhbmd1YWdlT3BlbmluZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzdXBlci5zZXROYW1lKG5hbWUpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlzdXBlci5zZXROYW1lc3BhY2VVUkkobmFtZXNwYWNlVVJJKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQ29tbWVudEltcGxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQ29tbWVudEltcGxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljY2M1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0NvbW1lbnRJbXBsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ29tbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb21tZW50SW1wbEZvckpTUAotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEltcGxGb3JKU1AgZXh0ZW5kcyBDb21tZW50SW1wbCB7Ci0JcHJvdGVjdGVkIENvbW1lbnRJbXBsRm9ySlNQKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDb21tZW50SW1wbEZvckpTUChDb21tZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudENsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRPcGVuQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0JCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDb21tZW50SW1wbCBjbG9uZWQgPSBuZXcgQ29tbWVudEltcGxGb3JKU1AodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9ET01Eb2N1bWVudEZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9ET01Eb2N1bWVudEZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2E4YmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NRG9jdW1lbnRGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50U3R5bGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgRE9NRG9jdW1lbnRGb3JKU1AgZXh0ZW5kcyBEb2N1bWVudFN0eWxlSW1wbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRE9NRG9jdW1lbnRGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRoYXQKLQkgKi8KLQlwcm90ZWN0ZWQgRE9NRG9jdW1lbnRGb3JKU1AoRG9jdW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcCBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlET01Eb2N1bWVudEZvckpTUCBjbG9uZWQgPSBuZXcgRE9NRG9jdW1lbnRGb3JKU1AodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVkLmltcG9ydENoaWxkTm9kZXModGhpcywgdHJ1ZSk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUVsZW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hlY2tUYWdOYW1lVmFsaWRpdHkodGFnTmFtZSk7Ci0KLQkJRWxlbWVudEltcGxGb3JKU1AgZWxlbWVudCA9IG5ldyBFbGVtZW50SW1wbEZvckpTUCgpOwotCQllbGVtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWVsZW1lbnQuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUNvbW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Db21tZW50Ci0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ29tbWVudCBjcmVhdGVDb21tZW50KFN0cmluZyBkYXRhKSB7Ci0JCUNvbW1lbnRJbXBsRm9ySlNQIGNvbW1lbnQgPSBuZXcgQ29tbWVudEltcGxGb3JKU1AoKTsKLQkJY29tbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJY29tbWVudC5zZXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBdHRyaWJ1dGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlBdHRySW1wbEZvckpTUCBhdHRyID0gbmV3IEF0dHJJbXBsRm9ySlNQKCk7Ci0JCWF0dHIuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJYXR0ci5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUF0dHJJbXBsRm9ySlNQIGF0dHIgPSBuZXcgQXR0ckltcGxGb3JKU1AoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCWF0dHIuc2V0TmFtZXNwYWNlVVJJKHVyaSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQkvKioKLQkgKiBjcmVhdGVUZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0JCVRleHRJbXBsRm9ySlNQIHRleHQgPSBuZXcgVGV4dEltcGxGb3JKU1AoKTsKLQkJdGV4dC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQl0ZXh0LnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJRE9NTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NTW9kZWxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NTW9kZWxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjOGNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0RPTU1vZGVsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTVN0eWxlTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxVcGRhdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgRE9NTW9kZWxGb3JKU1AgZXh0ZW5kcyBET01TdHlsZU1vZGVsSW1wbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRE9NTW9kZWxGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIHJlbWVtYmVyLCB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBzdXBlciBjb25zdHJ1Y3RvciwgCi0JCS8vIHZpYSBpbnRlcm5hbENyZWF0ZURvY3VtZW50Ci0JfQotCS8qKgotCSAqIGNyZWF0ZURvY3VtZW50IG1ldGhvZAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgaW50ZXJuYWxDcmVhdGVEb2N1bWVudCgpIHsKLQkJRE9NRG9jdW1lbnRGb3JKU1AgZG9jdW1lbnQgPSBuZXcgRE9NRG9jdW1lbnRGb3JKU1AoKTsKLQkJZG9jdW1lbnQuc2V0TW9kZWwodGhpcyk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0JcHJvdGVjdGVkIFhNTE1vZGVsUGFyc2VyIGNyZWF0ZU1vZGVsUGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZERPTU1vZGVsUGFyc2VyKHRoaXMpOwotCX0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxVcGRhdGVyIGNyZWF0ZU1vZGVsVXBkYXRlcigpIHsKLQkJcmV0dXJuIG5ldyBOZXN0RE9NTW9kZWxVcGRhdGVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRWxlbWVudEltcGxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRWxlbWVudEltcGxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2OTEyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0VsZW1lbnRJbXBsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRTdHlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW1wbEZvckpTUCBleHRlbmRzIEVsZW1lbnRTdHlsZUltcGwgewotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBFbGVtZW50SW1wbEZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhhdAotCSAqLwotCXB1YmxpYyBFbGVtZW50SW1wbEZvckpTUChFbGVtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkRW5kVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENsb3NlZChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ2xvc2VkQ29tbWVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZWROZXN0ZWREaXJlY3RpdmUoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXN1cGVyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlzdXBlci5zZXRUYWdOYW1lKHRhZ05hbWUpOwotCX0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVsZW1lbnRJbXBsIGNsb25lZCA9IG5ldyBFbGVtZW50SW1wbEZvckpTUCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L05lc3RET01Nb2RlbFVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdERPTU1vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdkNzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdERPTU1vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxVcGRhdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBOZXN0RE9NTW9kZWxVcGRhdGVyIGV4dGVuZHMgWE1MTW9kZWxVcGRhdGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXB1YmxpYyBOZXN0RE9NTW9kZWxVcGRhdGVyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdGVkRE9NTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdGVkRE9NTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhYTcxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L05lc3RlZERPTU1vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01Nb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkpTUFRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBOZXN0ZWRET01Nb2RlbFBhcnNlciBleHRlbmRzIFhNTE1vZGVsUGFyc2VyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXB1YmxpYyBOZXN0ZWRET01Nb2RlbFBhcnNlcihET01Nb2RlbEltcGwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudE9wZW4oU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU47Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50VGV4dChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbnRlbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdOYW1lKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdPcGVuKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU47Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZU5lc3RlZFRhZyhTdHJpbmcgcmVnaW9uVHlwZSwgU3RyaW5nIHRhZ05hbWUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHJlc3VsdFRhZ05hbWUgPSB0YWdOYW1lOwotCQlpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCXJlc3VsdFRhZ05hbWUgPSBKU1BUYWcuSlNQX1NDUklQVExFVDsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHsKLQkJCXJlc3VsdFRhZ05hbWUgPSBKU1BUYWcuSlNQX0VYUFJFU1NJT047Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgewotCQkJcmVzdWx0VGFnTmFtZSA9IEpTUFRhZy5KU1BfREVDTEFSQVRJT047Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pIHsKLQkJCXJlc3VsdFRhZ05hbWUgPSBKU1BUYWcuSlNQX0RJUkVDVElWRTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJcmVzdWx0VGFnTmFtZSArPSAnLic7Ci0JCQlyZXN1bHRUYWdOYW1lICs9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFRhZ05hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvVGV4dEltcGxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvVGV4dEltcGxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2N2Y1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L1RleHRJbXBsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuVGV4dEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBUZXh0SW1wbEZvckpTUCBleHRlbmRzIFRleHRJbXBsIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdE5lc3RlZENvbnRlbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxYzU0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lKU1BIZWFkQ29udGVudERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IgZXh0ZW5kcyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgewotCVN0cmluZyBnZXRDb250ZW50VHlwZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCVN0cmluZyBnZXRMYW5ndWFnZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzVlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBhcnNlcyBiZWdpbm5pbmcgcG9ydGlvbiBvZiBKU1AgZmlsZSB0byBnZXQgYXR0cmlidXRlcyBpbiBwYWdlCi0gKiBkaXJlY3RpaXZlCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IgZXh0ZW5kcyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJSlNQSGVhZENvbnRlbnREZXRlY3RvciB7Ci0KLQlwdWJsaWMgSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMWQzY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRSZWFkZXJDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQnVmZmVyZWRMaW1pdGVkUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuSlNQQ2FwYWJsZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgSlNQRG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9NSU1FX1RZUEUgPSAidGV4dC9odG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTUEVDX0RFRkFVTFRfRU5DT0RJTkcgPSAiSVNPLTg4NTktMSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgSUZpbGUgZ2V0RmlsZUZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBwYXRoID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlPYmplY3QgaWQgPSBtb2RlbC5nZXRJZCgpOwotCQkJaWYgKGlkID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlwYXRoID0gaWQudG9TdHJpbmcoKTsKLQkJfQotCQkvLyBUT0RPIG5lZWRzIHJld29yayBmb3IgbGlua2VkIHJlc291cmNlcwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZmlsZSA9IHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKHBhdGgpKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSBmRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5OwotCi0JcHVibGljIEpTUERvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KEpTUFNvdXJjZVBhcnNlciBwYXJzZXIsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCVRhZ01hcmtlciBibSA9IG5ldyBUYWdNYXJrZXIodGFnTmFtZSk7Ci0JCXBhcnNlci5hZGROZXN0YWJsZVByZWZpeChibSk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJc3RydWN0dXJlZERvY3VtZW50ID0gY3JlYXRlQ29kZWREb2N1bWVudChpRmlsZSk7Ci0KLQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRUeXBlID0gZ2V0RW1iZWRkZWRUeXBlKGlGaWxlKTsKLQkJCWlmIChlbWJlZGRlZFR5cGUgIT0gbnVsbCkKLQkJCQllbWJlZGRlZFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5yZXNldCgpOwotCQkJc2V0RG9jdW1lbnRDb250ZW50c0Zyb21SZWFkZXIoc3RydWN0dXJlZERvY3VtZW50LCBmRnVsbFByZXBhcmVkUmVhZGVyKTsKLQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgIT0gbnVsbCkgewotCQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVDb2RlZERvY3VtZW50KElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5zZXQoaUZpbGUpOwotCi0JCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRDb2RlZFJlYWRlcigpOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQkJc3RydWN0dXJlZERvY3VtZW50LnNldEVuY29kaW5nTWVtZW50byhnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGVuYW1lID09IG51bGwgJiYgaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBoYXZlIGJvdGggbnVsbCBmaWxlbmFtZSBhbmQgaW5wdXRzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvZGVkUmVhZGVyQ3JlYXRvciBjb2RlZFJlYWRlckNyZWF0b3IgPSBuZXcgQ29kZWRSZWFkZXJDcmVhdG9yKCk7Ci0JCXRyeSB7Ci0JCQljb2RlZFJlYWRlckNyZWF0b3Iuc2V0KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCQlmRnVsbFByZXBhcmVkUmVhZGVyID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldENvZGVkUmVhZGVyKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldEVuY29kaW5nTWVtZW50byhmRW5jb2RpbmdNZW1lbnRvKTsKLQkJCS8vIHRoZSBmYWN0IHRoYXQgZmlsZSBpcyBudWxsIG1lYW5zIHRoaXMgbWV0aG9kL2NvZGUgcGF0aCBpcyBubwotCQkJLy8gZ29vZCBmb3IgSlNQIGZyYWdtZW50cwotCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUoKElGaWxlKSBudWxsKTsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIucmVzZXQoKTsKLQkJCWlmIChlbWJlZGRlZFR5cGUgIT0gbnVsbCkKLQkJCQllbWJlZGRlZFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgKChJU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLmdldFBhcnNlcigpKTsKLQkJCXNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCwgZkZ1bGxQcmVwYXJlZFJlYWRlcik7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChmRnVsbFByZXBhcmVkUmVhZGVyICE9IG51bGwpIHsKLQkJCQlmRnVsbFByZXBhcmVkUmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAcmV0dXJuIElEb2N1bWVudFBhcnRpdGlvbmVyCi0JICovCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0RGVmYXVsdE1pbWVUeXBlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdE1pbWVUeXBlKCkgewotCQlyZXR1cm4gREVGQVVMVF9NSU1FX1RZUEU7Ci0JfQotCi0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5Ci0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKSB7Ci0JCWlmIChmRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWZFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkgPSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgdGhlIE1JTUUgY29udGVudCB0eXBlIHNwZWNpZmllZCBpbiBhIHBhZ2UgZGlyZWN0aXZlLiBUaGlzCi0JICogc2hvdWxkIGFwcGVhciAiYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIEpTUCBwYWdlIiBhY2NvcmRpbmcgdG8gdGhlCi0JICogSlNQIHYxLjIgc3BlY2lmaWNhdGlvbi4KLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RW1iZWRkZWRUeXBlKElGaWxlIGZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCWlmIChmRnVsbFByZXBhcmVkUmVhZGVyID09IG51bGwpIHsKLQkJCWhhbmRsZXIgPSBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgbWltZVR5cGUgPSBudWxsOwotCi0JCQlJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IganNwUHJvdmlkZXIgPSBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKTsKLQkJCVJlYWRlciBmdWxsUHJlcGFyZWRSZWFkZXIgPSBnZXRGdWxsUHJlcGFyZWRSZWFkZXIoKTsKLQkJCUJ1ZmZlcmVkTGltaXRlZFJlYWRlciBsaW1pdGVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkTGltaXRlZFJlYWRlcihmdWxsUHJlcGFyZWRSZWFkZXIsIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJCWpzcFByb3ZpZGVyLnNldChsaW1pdGVkUmVhZGVyKTsKLQkJCWlmIChqc3BQcm92aWRlciBpbnN0YW5jZW9mIElKU1BIZWFkQ29udGVudERldGVjdG9yKSB7Ci0JCQkJbWltZVR5cGUgPSAoKElKU1BIZWFkQ29udGVudERldGVjdG9yKSBqc3BQcm92aWRlcikuZ2V0Q29udGVudFR5cGUoKTsKLQkJCQlmdWxsUHJlcGFyZWRSZWFkZXIucmVzZXQoKTsKLQkJCX0KLQotCQkJRW1iZWRkZWRUeXBlUmVnaXN0cnkgcmVnID0gZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlpZiAobWltZVR5cGUgPT0gbnVsbCB8fCBtaW1lVHlwZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJaGFuZGxlciA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWhhbmRsZXIgPSByZWcuZ2V0VHlwZUZvcihtaW1lVHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRm9yIEpTUCBmaWxlcywgdGV4dC9odG1sIGlzIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZS4gVGhpcyBtYXkgd2FudAotCSAqIHRoaXMgZGlmZmVyZW50IGZvciB0eXBlcyBsaWtlIGpzdiAoanNwIGZvciB2b2ljZSB4bWwpIEZvciBub3csIGhhcmQKLQkgKiBjb2RlIHRvIG5ldyBpbnN0YW5jZS4gSW4gZnV0dXJlLCBzaG91bGQgZ2V0IGluc3RhbmNlIGZyb20gcmVnaXN0cnkuCi0JICogU3BlY2lmaWNhdGlvbiBjaXRlcyBIVE1MIGFzIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKCkgewotCQlFbWJlZGRlZFR5cGVSZWdpc3RyeSByZWcgPSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKTsKLQkJcmV0dXJuIHJlZy5nZXRUeXBlRm9yKGdldERlZmF1bHRNaW1lVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJLy8gcmVtZW1iZXIsIHRoZSBMb2FkZXIKLQkJLy8gd2lsbCBuZWVkIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiBwYXJzZXIKLQkJLy8gYmFzZWQgb24gImVtYmVkZGVkIGNvbnRlbnQiCi0JCUpTUFNvdXJjZVBhcnNlciBwYXJzZXIgPSBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JCS8vIGFkZCBkZWZhdWx0IG5lc3RhYmxlIHRhZyBsaXN0Ci0JCWFkZE5lc3RhYmxlUHJlZml4KHBhcnNlciwgSlNQMTFOYW1lc3BhY2UuSlNQX1RBR19QUkVGSVgpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBkZWxpbWl0ZXIgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJaWYgKGRlbGltaXRlciA9PSBudWxsKQotCQkJZGVsaW1pdGVyID0gc3VwZXIuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihmaWxlKTsKLQkJcmV0dXJuIGRlbGltaXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWZpY2F0aW9uIGNpdGVzIElTTy04ODU5LTEvTGF0aW4tMSBhcyB0aGUgZGVmYXVsdCBjaGFyc2V0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJcmV0dXJuIFNQRUNfREVGQVVMVF9FTkNPRElORzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBJU3RydWN0dXJlZERvY3VtZW50LCB0aGF0IGhhcwotCSAqIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhcHByb3ByaWF0ZSBwYXJzZXIuIEZvciBtYW55IGxvYWRlcnMsIHRoZQotCSAqIChkZWZhdWx0KSBwYXJzZXIgdXNlZCBpcyBrbm93biBmb3IgYW55IGlucHV0LiBGb3Igb3RoZXJzLCB0aGUgY29ycmVjdAotCSAqIHBhcnNlciAoYW5kIGl0cyBpbml0aWFsaXphdGlvbikgaXMgbm9ybWFsbCBkZXBlbmRlbnQgb24gdGhlIGNvbnRlbnQgb2YKLQkgKiB0aGUgZmlsZS4gVGhpcyBuby1hcmd1bWVudCBtZXRob2Qgc2hvdWxkIGFzc3VtZSAiZW1wdHkgaW5wdXQiIGFuZCB3b3VsZAotCSAqIHRoZXJlZm9yZSByZXR1cm4gdGhlIGRlZmF1bHQgcGFyc2VyIGZvciB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4gSWYgdGhlCi0JICogcGFyc2VyIGlzIHRvIGhhbmRsZSB0YWcgbGlicmFyaWVzLCBpdCBtdXN0IGhhdmUgYSBUYWdsaWJTdXBwb3J0IG9iamVjdAotCSAqIHdpdGggYSB2YWxpZCBVUklSZXNvbHZlciBhbmQgdGhpcyBJU3RydWN0dXJlZERvY3VtZW50IGF0dGFjaGVkIHRvIGl0Ci0JICogYmVmb3JlIHRoZSBjb250ZW50cyBhcmUgc2V0IG9uIHRoZSBJU3RydWN0dXJlZERvY3VtZW50LgotCSAqLwotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihuZXcgSlNQUmVQYXJzZXIoKSk7Ci0JCS8vIHN0cnVjdHVyZWREb2N1bWVudC5zZXREb2N1bWVudFBhcnRpdGlvbmVyKG5ldwotCQkvLyBKU1BKYXZhRG9jdW1lbnRQYXJ0aW9uZXIoKSk7Ci0JCS8vIGV2ZW4gdGhvdWdoIHRoaXMgaXMgYW4gImVtcHR5IG1vZGVsIiAuLi4gd2Ugd2FudCBpdCB0byBoYXZlIGF0Ci0JCS8vIGxlYXN0Ci0JCS8vIHRoZQotCQkvLyBkZWZhdWx0IGVtYmVkZGVkZWQgY29udGVudCB0eXBlIGhhbmRsZXIKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGUgPSBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKCk7Ci0JCWVtYmVkZGVkVHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSlNQRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsOwotCQkvLwotCQkvLyBkb2N1bWVudCBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHNldCBmb3IgdGhpcyB0bwotCQkvLyB3b3JrLgotCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZG9jdW1lbnQsIEpTUENvcmVNZXNzYWdlcy5KU1BEb2N1bWVudExvYWRlcl8xKTsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCS8vIFRoaXMgJ2dldCcgY2F1c2VzIGZpcnN0IHRvIGJlIGJlIGF0dGFjaGVkLgotCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkvLyBtYXkgbWFrZSB0aGlzIGVhc2llciB0byB1c2UgaW4gZnV0dWUKLQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ldyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkoKSk7Ci0JCS8vIEZvciBKU1BzLCB0aGUgTW9kZWxRdWVyeUFkYXB0ZXIgbXVzdCBiZSAiYXR0YWNoZWQiIHRvIHRoZSBkb2N1bWVudAotCQkvLyBiZWZvcmUgY29udGVudCBpcyBzZXQgaW4gdGhlIG1vZGVsLCBzbyB0YWdsaWIgaW5pdGl6YXRpb24gY2FuCi0JCS8vIHRha2UgcGxhY2UuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvQXJyYXlNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9BcnJheU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdlYzc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9BcnJheU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBhIGhhc2h0YWJsZSBtYXBzIGtleXMgdG8gYXJyYXlzCi0gKiB0byBzdXBwb3J0IG11bHRpcGxlIHZhbHVlcyBiZWluZyBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUKLSAqIGtleS4gVG8gcmVtb3ZlIGEgc3BlY2lmaWMgZW50cnksIGEga2V5IGFuZCBpbnNlcnRlZCB2YWx1ZSBtdXN0Ci0gKiBiZSBwcm92aWRlZC4gUmVtb3ZpbmcganVzdCBiYXNlZCBvbiB0aGUga2V5IG5hbWUgd2lsbCByZW1vdmUgYWxsCi0gKiB2YWx1ZXMgc3RvcmVkIHVuZGVyIHRoYXQga2V5Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFycmF5TWFwIGV4dGVuZHMgSGFzaHRhYmxlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQotCXB1YmxpYyBBcnJheU1hcChpbnQgc2l6ZSkgewotCQlzdXBlcihzaXplKTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlPYmplY3RbXSB2YWx1ZXMgPSAoT2JqZWN0W10pIHN1cGVyLmdldChrZXkpOwotCQlPYmplY3RbXSBuZXdWYWx1ZXMgPSBudWxsOwotCQkKLQkJaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5sZW5ndGggPT0gMCkKLQkJCW5ld1ZhbHVlcyA9IG5ldyBPYmplY3RbMV07Ci0JCWVsc2UgewotCQkJbmV3VmFsdWVzID0gbmV3IE9iamVjdFt2YWx1ZXMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHZhbHVlcywgMCwgbmV3VmFsdWVzLCAwLCB2YWx1ZXMubGVuZ3RoKTsKLQkJfQotCi0JCW5ld1ZhbHVlc1tuZXdWYWx1ZXMubGVuZ3RoIC0gMV0gPSB2YWx1ZTsKLQkJcmV0dXJuIHN1cGVyLnB1dChrZXksIG5ld1ZhbHVlcyk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgPGNvZGU+dmFsdWU8L2NvZGU+IGZyb20gdGhlIGxpc3QgCi0JICogb2YgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5rZXk8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGtleSB0aGUga2V5IHRoYXQgaGFzIDxjb2RlPnZhbHVlPC9jb2RlPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgc3BlY2lmaWMgdmFsdWUgdG8gcmVtb3ZlIGZyb20gdGhlIGtleQotCSAqIEByZXR1cm4gVGhlIGl0ZW0gcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHZhbHVlcwotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKSBzdXBlci5nZXQoa2V5KTsKLQkJT2JqZWN0IHJlbW92ZWQgPSBudWxsOwotCQlPYmplY3RbXSByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVzICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKHZhbHVlc1tpXSkpIHsKLQkJCQkJcmVtb3ZlZCA9IHZhbHVlc1tpXTsKLQkJCQkJcmVzdWx0ID0gbmV3IE9iamVjdFt2YWx1ZXMubGVuZ3RoIC0gMV07Ci0JCQkJCQotCQkJCQlpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHsKLQkJCQkJCS8vIENvcHkgbGVmdCBvZiB2YWx1ZQotCQkJCQkJU3lzdGVtLmFycmF5Y29weSh2YWx1ZXMsIDAsIHJlc3VsdCwgMCwgaSk7Ci0JCQkJCQkvLyBDb3B5IHJpZ2h0IG9mIHZhbHVlCi0JCQkJCQlpZiAoaSA8ICh2YWx1ZXMubGVuZ3RoIC0gMSkpCi0JCQkJCQkJU3lzdGVtLmFycmF5Y29weSh2YWx1ZXMsIGkrMSwgcmVzdWx0LCBpLCByZXN1bHQubGVuZ3RoIC0gaSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJc3VwZXIucmVtb3ZlKGtleSk7Ci0JCQkJCQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPiAwKQotCQkJc3VwZXIucHV0KGtleSwgcmVzdWx0KTsKLQkJCi0JCXJldHVybiByZW1vdmVkOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0JCUNvbGxlY3Rpb24gdmFsdWVtYXBzID0gc3VwZXIudmFsdWVzKCk7Ci0JCUNvbGxlY3Rpb24gdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJZm9yKEl0ZXJhdG9yIGkgPSB2YWx1ZW1hcHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJdmFsdWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KChPYmplY3RbXSkgaS5uZXh0KCkpKTsKLQkJCi0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvQ29tcGlsYXRpb25Vbml0SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvQ29tcGlsYXRpb25Vbml0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZjU1MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci0KLS8qKgotICogVG8gZW5zdXJlIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlIG9mIFByb2JsZW1SZXF1ZXN0b3IgYW5kIFdvcmtpbmdDb3B5T3duZXIKLSAqIGZvciBKU1AgcGx1Z2lucy4gIFRoZXNlIHdlcmUgcmVtb3ZlZCBmcm9tIEpTUFRyYW5zbGF0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZQotICogSlNQVHJhbnNsYXRpb24gd2FzIG5vdCBoZWxkIGluIG1lbW9yeSBieSBhbnkgdHlwZSBvZiBKRFQgbGlzdHMgKGNhY2hpbmcKLSAqIHNlYXJjaCByZXN1bHRzLCBldGMuLi4pCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRIZWxwZXIgewotCi0gICAgcHJpdmF0ZSBKU1BQcm9ibGVtUmVxdWVzdG9yIGZQcm9ibGVtUmVxdWVzdG9yID0gbnVsbDsKLSAgICBwcml2YXRlIFdvcmtpbmdDb3B5T3duZXIgZldvcmtpbmdDb3B5T3duZXIgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIENvbXBpbGF0aW9uVW5pdEhlbHBlciBpbnN0YW5jZTsKLQotICAgIHByaXZhdGUgQ29tcGlsYXRpb25Vbml0SGVscGVyKCkgewotICAgICAgICAvLyBmb3JjZSB1c2Ugb2YgaW5zdGFuY2UKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBmaW5hbCBDb21waWxhdGlvblVuaXRIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLSAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBDb21waWxhdGlvblVuaXRIZWxwZXIoKTsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBKU1BQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoKSB7Ci0KLSAgICAgICAgaWYgKGZQcm9ibGVtUmVxdWVzdG9yID09IG51bGwpCi0gICAgICAgICAgICBmUHJvYmxlbVJlcXVlc3RvciA9IG5ldyBKU1BQcm9ibGVtUmVxdWVzdG9yKCk7Ci0gICAgICAgIHJldHVybiBmUHJvYmxlbVJlcXVlc3RvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV29ya2luZ0NvcHlPd25lciBnZXRXb3JraW5nQ29weU93bmVyKCkgewotCi0gICAgICAgIGlmIChmV29ya2luZ0NvcHlPd25lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmV29ya2luZ0NvcHlPd25lciA9IG5ldyBXb3JraW5nQ29weU93bmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiSlNQIFdvcmtpbmcgY29weSBvd25lciI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmV29ya2luZ0NvcHlPd25lcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvRXNjYXBlZFRleHRVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvRXNjYXBlZFRleHRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNjUzNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0VzY2FwZWRUZXh0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiBjbGFzcyB0byBoYW5kbGUgY2h1bmtzIG9mIHRleHQvcmVnaW9ucwotICogd2l0aCBlc2NhcGVkIGNoYXJhY3RlciBkYXRhCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgRXNjYXBlZFRleHRVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBmWE1MdG9KYXZhTG9va3VwID0gbnVsbDsKLQotCS8qKgotCSAqIEByZXR1cm4gdW5lc2NhcGVkIGZ1bGwgdGV4dCBvZiB0aGF0IHJlZ2lvbiwgIiIgaWYgdGhlcmUgaXMgbm8gdGV4dAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuZXNjYXBlZFRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIElUZXh0UmVnaW9uIHIpIHsKLQkJU3RyaW5nIHRlc3QgPSAocGFyZW50ICE9IHIpID8gcGFyZW50LmdldEZ1bGxUZXh0KHIpIDogcGFyZW50LmdldEZ1bGxUZXh0KCk7Ci0JCXJldHVybiBnZXRVbmVzY2FwZWRUZXh0KHRlc3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuZXNjYXBlZFRleHQoU3RyaW5nIHRlc3QpIHsKLQkJaW5pdExvb2t1cCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAodGVzdCAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRlc3QsICImOyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdG9rMSwgdG9rMiwgdG9rMywgdHJhbnNTdHJpbmc7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJdG9rMSA9IHRvazIgPSB0b2szID0gdHJhbnNTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRvazEgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAodG9rMS5lcXVhbHMoIiYiKSAmJiBzdC5oYXNNb3JlVG9rZW5zKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCXRvazIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJdG9rMyA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghKHRyYW5zU3RyaW5nID0gZlhNTHRvSmF2YUxvb2t1cC5nZXRQcm9wZXJ0eSh0b2sxICsgdG9rMiArIHRvazMsICIiKSkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlidWZmZXIuYXBwZW5kKHRyYW5zU3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodG9rMSArIHRvazIgKyB0b2szKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaW5pdGlhbGl6ZSBsb29rdXAgdGFibGVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0TG9va3VwKCkgewotCQlmWE1MdG9KYXZhTG9va3VwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJmFwb3M7IiwgIiciKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZYTUx0b0phdmFMb29rdXAuc2V0UHJvcGVydHkoIiZxdW90OyIsICJcIiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJmFtcDsiLCAiJiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJmx0OyIsICI8Iik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImZ3Q7IiwgIj4iKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZYTUx0b0phdmFMb29rdXAuc2V0UHJvcGVydHkoIiZuYnNwOyIsICIgIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGVudGl0eSByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJhbnNsYXRlRW50aXR5UmVmZXJlbmNlKFN0cmluZyBlbnRpdHkpIHsKLQkJcmV0dXJuIGZYTUx0b0phdmFMb29rdXAuZ2V0UHJvcGVydHkoZW50aXR5LCBlbnRpdHkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0lKU1BQcm9ibGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSUpTUFByb2JsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwMWVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSUpTUFByb2JsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLQotcHVibGljIGludGVyZmFjZSBJSlNQUHJvYmxlbSBleHRlbmRzIElQcm9ibGVtIHsKLQotCWludCBGX1BST0JMRU1fSURfTElURVJBTCA9IDB4QTAwMDAwMDA7Ci0JCi0JaW50IFRFSUNsYXNzTm90Rm91bmQgPSBGX1BST0JMRU1fSURfTElURVJBTCArIDE7Ci0JaW50IFRFSVZhbGlkYXRpb25NZXNzYWdlID0gRl9QUk9CTEVNX0lEX0xJVEVSQUwgKyAyOwotCWludCBURUlDbGFzc05vdEluc3RhbnRpYXRlZCA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgMzsKLQlpbnQgVEVJQ2xhc3NNaXNjID0gRl9QUk9CTEVNX0lEX0xJVEVSQUwgKyA0OwkKLQlpbnQgVGFnQ2xhc3NOb3RGb3VuZCA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgNTsKLQlpbnQgVXNlQmVhbkludmFsaWRJRCA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgNjsKLQlpbnQgVXNlQmVhbk1pc3NpbmdUeXBlSW5mbyA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgNzsKLQlpbnQgVXNlQmVhbkFtYmlndW91c1R5cGUgID0gRl9QUk9CTEVNX0lEX0xJVEVSQUwgKyA4OwotCWludCBTdGFydEN1c3RvbVRhZ01pc3NpbmcgID0gRl9QUk9CTEVNX0lEX0xJVEVSQUwgKyA5OwotCWludCBFbmRDdXN0b21UYWdNaXNzaW5nICA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgMTA7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgSUQgb2YgdGhpcyBKU1AgcHJvYmxlbQotCSAqLwotCWludCBnZXRFSUQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0lKU1BUcmFuc2xhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0lKU1BUcmFuc2xhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Y2NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9JSlNQVHJhbnNsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotCi0vKioKLSAqIEFuIG9iamVjdCB0aGF0IGhvbGRzIGEgdHJhbnNsYXRlZCBKU1AgU3RyaW5nIGFsb25nIHdpdGgKLSAqIHBvc2l0aW9uIG1hcHBpbmcgZnJvbSBKYXZhIHRvIEpTUCwgYW5kIEpTUCB0byBKYXZhLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUFRyYW5zbGF0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBzdHJpbmcgY29udGVudHMgb2YgdGhlIHRyYW5zbGF0ZWQgZG9jdW1lbnQuCi0JICogQHJldHVybiAgdGhlIHN0cmluZyBjb250ZW50cyBvZiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCk7Ci0KLQkvKioKLQkgKiBUaGUgY29ycmVzcG9uZGluZyBqYXZhIG9mZnNldCBpbiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudCBmb3IgYSBnaXZlbiBqc3Agb2Zmc2V0LgotCSAqIEBwYXJhbSBqc3BQb3NpdGlvbgotCSAqIEByZXR1cm4gdGhlIGphdmEgb2Zmc2V0IHRoYXQgbWFwcyB0byBqc3BPZmZzZXQsIC0xIGlmIHRoZSBwb3NpdGlvbiBoYXMgbm8gbWFwcGluZy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEphdmFPZmZzZXQoaW50IGpzcE9mZnNldCk7Ci0KLQkvKioKLQkgKiBUaGUgY29ycmVzcG9uZGluZyBqc3Agb2Zmc2V0IGluIHRoZSBzb3VyY2UgZG9jdW1lbnQgZm9yIGEgZ2l2ZW4ganNwIG9mZnNldCBpbiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudC4KLQkgKiBAcGFyYW0gamF2YVBvc2l0aW9uCi0JICogQHJldHVybiB0aGUganNwIG9mZnNldCB0aGF0IG1hcHMgdG8gamF2YU9mZnNldCwgLTEgaWYgdGhlIHBvc2l0aW9uIGhhcyBubyBtYXBwaW5nLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KTsKLQotCS8qKgotCSAqIFRoZSBjb3JyZXNwb25kaW5nIENvbXBpbGF0aW9uVW5pdCBmb3IgdGhlIHRyYW5zbGF0ZWQgSlNQIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBJQ29tcGlsYXRpb25Vbml0IG9mIHRoZSB0cmFuc2xhdGlvbgotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUphdmFFbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBKU1AgcmFuZ2UgaW4gdGhlIEpTUCBTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0ganNwU3RhcnQgc3RhcmluZyBvZmZzZXQgaW4gdGhlIEpTUCBkb2N1bWVudAotCSAqIEBwYXJhbSBqc3BFbmQgZW5kaW5nIG9mZnNldCBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICogQHJldHVybiBJSmF2YUVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpTUCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHNGcm9tSnNwUmFuZ2UoaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kKTsKLQotCS8qKgotCSAqIEBwYXJhbSBqYXZhT2Zmc2V0Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvZmZzZXQgd2l0aGluIHRoZSB0cmFuc2xhdGVkIEphdmEgc291cmNlIG1hcHMKLQkgKiAgICAgICAgIGRpcmVjdGx5IHRvIGEgc2NyaXB0aW5nIHJlZ2lvbiBpbiB0aGUgb3JpZ2luYWwgSlNQCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmRpcmVjdChpbnQgamF2YU9mZnNldCk7Ci0JCi0JLyoqCi0JICogTXVzdCBiZSBzZXQgdHJ1ZSBpbiBvcmRlciBmb3IgcHJvYmxlbXMgdG8gYmUgY29sbGVjdGVkIGR1cmluZyByZWNvbmNpbGUuCi0JICogSWYgc2V0IGZhbHNlLCBwcm9ibGVtcyB3aWxsIGJlIGlnbm9yZWQgZHVyaW5nIHJlY29uY2lsZS4KLQkgKiBAcGFyYW0gY29sbGVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKGJvb2xlYW4gY29sbGVjdCk7Ci0KLQkvKioKLQkgKiBSZWNvbmNpbGVzIHRoZSBjb21waWxhdGlvbiB1bml0IGZvciB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBMaXN0IG9mIHByb2JsZW1zIGNvbGxlY3RlZCBkdXJpbmcgcmVjb25jaWxlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvYmxlbXMoKTsKLQkKLQkvLyBhZGQgdGhlc2UgQVBJIG9uY2UgZmluYWxpemVkCi0JLy8gZ2V0SnNwRWRpdHMoVGV4dEVkaXQgamF2YUVkaXQpCi0JLy8gZ2V0SmF2YVJhbmdlcygpCi0gICAgLy8gZ2V0SmF2YURvY3VtZW50KCkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQMlNlcnZsZXROYW1lVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUDJTZXJ2bGV0TmFtZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2ZTk0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQMlNlcnZsZXROYW1lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQMlNlcnZsZXROYW1lVXRpbCB7Ci0JCi0JLyoqCi0JICogV0FTIG1hbmdsZXMgVG9tJkplcnJ5IGFzOiBfVG9tXzI2X0plcnJ5OyB0aGlzIHRha2VzIGluIHRoZSBtYW5nbGVkIG5hbWUKLQkgKiBhbmQgcmV0dXJucyB0aGUgb3JpZ2luYWwgbmFtZS4KLQkgKiAKLQkgKiBVbm1hbmdsZXMgdGhlIHF1YWxpZmllZCB0eXBlIG5hbWUuICBJZiBhbiB1bmRlcnNjb3JlIGlzIGZvdW5kCi0JICogaXQgaXMgYXNzdW1lZCB0byBiZSBhIG1hbmdsZWQgcmVwcmVzZW50YXRpb24gb2YgYSBub24tYWxwaGEsIAotCSAqIG5vbi1kaWdpdCBjaGFyYWN0ZXIgb2YgdGhlIGZvcm0gX05OXywgd2hlcmUgTk4gYXJlIGhleCBkaWdpdHMKLQkgKiByZXByZXNlbnRpbmcgdGhlIGVuY29kZWQgY2hhcmFjdGVyLiAgVGhpcyByb3V0aW5lIGNvbnZlcnRzIGl0Ci0JICogYmFjayB0byB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIHVubWFuZ2xlKFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSkgewotCQlpZihxdWFsaWZpZWRUeXBlTmFtZS5jaGFyQXQoMCkgIT0gJ18nKQotCQkJcmV0dXJuIHF1YWxpZmllZFR5cGVOYW1lOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHBvc3NpYmxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJLy8gcmVtb3ZlIHRoZSAuamF2YSBleHRlbnNpb24gaWYgdGhlcmUgaXMgb25lCi0JCWlmKHF1YWxpZmllZFR5cGVOYW1lLmVuZHNXaXRoKCIuamF2YSIpKS8vJE5PTi1OTFMtMSQKLQkJCXF1YWxpZmllZFR5cGVOYW1lID0gcXVhbGlmaWVkVHlwZU5hbWUuc3Vic3RyaW5nKDAsIHF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQotCQlmb3IoaW50IGkgPSAxOyBpIDwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCk7IGkrKykgeyAgLy8gc3RhcnQgYXQgaW5kZXggMSBiL2MgMXN0IGNoYXIgaXMgYWx3YXlzICdfJwotCQkJY2hhciBjID0gcXVhbGlmaWVkVHlwZU5hbWUuY2hhckF0KGkpOwotCQkJaWYoYyA9PSAnXycpIHsKLQkJCQlpbnQgZW5kSW5kZXggPSBxdWFsaWZpZWRUeXBlTmFtZS5pbmRleE9mKCdfJywgaSsxKTsKLQkJCQlpZihlbmRJbmRleCA9PSAtMSkKLQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCQllbHNlIHsKLQkJCQkJY2hhciB1bm1hbmdsZWQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwb3NzaWJsZSA9IHF1YWxpZmllZFR5cGVOYW1lLnN1YnN0cmluZyhpKzEsIGVuZEluZGV4KTsgCi0JCQkJCSAgICBpZihpc1ZhbGlkKHBvc3NpYmxlKSkgewotCQkJCQkJCXVubWFuZ2xlZCA9IChjaGFyKUludGVnZXIuZGVjb2RlKCIweCIgKyBwb3NzaWJsZSkuaW50VmFsdWUoKTsvLyROT04tTkxTLTEkCi0JCQkJCQkJaSA9IGVuZEluZGV4OwotCQkJCQkgICAgfQotCQkJCQkgICAgZWxzZSB7IAotCQkJCQkgICAgICAgIHVubWFuZ2xlZCA9IGM7Ci0JCQkJCSAgICB9Ci0JCQkJCQkKLQkJCQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJdW5tYW5nbGVkID0gYzsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHVubWFuZ2xlZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlidWYuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgSGV4IHJlcHJlc2VudGF0aW9uIG9mIGFuIEFTQ0lJIGNoYXJhY3RlciAoZWcuIDJGIC0+IC8pCi0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgcG9zc2libGUpIHsKLQkgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkgICAgaWYocG9zc2libGUubGVuZ3RoKCkgPT0gMil7CSAgICAKLQkgICAgICAgIGNoYXIgYzEgPSBwb3NzaWJsZS5jaGFyQXQoMCk7Ci0JICAgICAgICBjaGFyIGMyID0gcG9zc2libGUuY2hhckF0KDEpOwotCSAgICAgICAgLy8gMXN0IGNoYXJhY3RlciBtdXN0IGJlIGEgZGlnaXQKLQkgICAgICAgIGlmKENoYXJhY3Rlci5pc0RpZ2l0KGMxKSkgewotCSAgICAgICAgICAgIC8vIDJuZCBjaGFyYWN0ZXIgbXVzdCBiZSBkaWdpdCBvciB1cHBlciBjYXNlIGxldHRlciBBLUYKLQkgICAgICAgICAgICBpZihDaGFyYWN0ZXIuaXNEaWdpdChjMikpIHsKLQkgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgZWxzZSBpZihDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYzIpICYmIChjMiA9PSAnQScgfHwgYzIgPT0gJ0InIHx8IGMyID09ICAnQyd8fCBjMiA9PSAgJ0QnfHwgYzIgPT0gICdFJ3x8IGMyID09ICdGJykpIHsKLQkgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogTWFuZ2xlIHN0cmluZyB0byBXQVMtbGlrZSBzcGVjaWZpY2F0aW9ucwotCSAqCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgbWFuZ2xlKFN0cmluZyBuYW1lKSB7CSAgCi0JICBTdHJpbmdCdWZmZXIgbW9kaWZpZWROYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCSAgCi0JICAvLyBleHRlbnNpb24gKC5qc3AsIC5qc3BmLCAuanNweCwgZXRjLi4uKSBzaG91bGQgYWxyZWFkeSBiZSBlbmNvZGVkIGluIG5hbWUKLQkgIAotCSAgaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0JICAvLyBpbiBjYXNlIG5hbWUgaXMgZm9yYmlkZGVuIChhIG51bWJlciwgY2xhc3MsIGZvciwgZXRjLi4uKQotCSAgbW9kaWZpZWROYW1lLmFwcGVuZCgnXycpOwotCQotCSAgLy8gZW5zdXJlIHJlc3Qgb2YgY2hhcmFjdGVycyBhcmUgdmFsaWQJCi0JICBmb3IgKGludCBpPTA7IGk8IGxlbmd0aDsgaSsrKSB7Ci0JCSAgY2hhciBjdXJyZW50Q2hhciA9IG5hbWUuY2hhckF0KGkpOwotCQkgIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3VycmVudENoYXIpID09IHRydWUgICkgeyAKLQkJCSAgbW9kaWZpZWROYW1lLmFwcGVuZChjdXJyZW50Q2hhcik7Ci0JCSAgfSBlbHNlIHsKLQkJCSAgbW9kaWZpZWROYW1lLmFwcGVuZChtYW5nbGVDaGFyKGN1cnJlbnRDaGFyKSk7Ci0JCSAgfQotCSAgfQotCSAgcmV0dXJuIG1vZGlmaWVkTmFtZS50b1N0cmluZygpOwotCSAgCi0JfQotCi0JLyoqCi0JICogdGFrZSBhIGNoYXJhY3RlciBhbmQgcmV0dXJuIGl0cyBoZXggZXF1aXZhbGVudAotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBtYW5nbGVDaGFyKGNoYXIgY2gpIHsKLQkgIGlmICggY2ggPT0gRmlsZS5zZXBhcmF0b3JDaGFyICkgewotCQkgIGNoID0gJy8nOwotCSAgfQotCQotCSAgaWYgKCBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoKSA9PSB0cnVlICkgewotCQkgIHJldHVybiAiIiArIGNoOyAvLyROT04tTkxTLTEkCi0JICB9Ci0JICByZXR1cm4gIl8iICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkudG9VcHBlckNhc2UoKSArICJfIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUEluY2x1ZGVSZWdpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BJbmNsdWRlUmVnaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMTE1YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUEluY2x1ZGVSZWdpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIEV4dGVuc2lvbiBvZiBYTUxKU1BSZWdpb25IZWxwZXIgaW50ZWRlZCB0byBwYXJzZSBlbnRpcmUgaW5jbHVkZWQgSlNQIGZpbGVzLgotICogQmFzaWNhbGx5IGl0IGV4cGFuZHMgdGhlIHJ1bGVzIGZvciB3aGF0IHRhZ3MgYXJlIHBhcnNlZCBhcyBKU1AuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLWNsYXNzIEpTUEluY2x1ZGVSZWdpb25IZWxwZXIgZXh0ZW5kcyBYTUxKU1BSZWdpb25IZWxwZXIgewotCS8qKgotCSAqIEBwYXJhbSBKU1BUcmFuc2xhdG9yCi0JICovCi0JcHVibGljIEpTUEluY2x1ZGVSZWdpb25IZWxwZXIoSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBib29sZWFuIGFwcGVuZEFzSW5kaXJlY3RTb3VyY2UpIHsKLQkJc3VwZXIodHJhbnNsYXRvciwgYXBwZW5kQXNJbmRpcmVjdFNvdXJjZSk7Ci0JfQotCi0JLy8gdGhlc2UgbWV0aG9kcyBkZXRlcm1pbmUgd2hhdCBjb250ZW50IGdldHMgYWRkZWQgdG8gdGhlIGxvY2FsIHNjcmlwbGV0LCBleHByZXNzaW9uLCBkZWNsYXJhdGlvbiBidWZmZXJzCi0JLyoKLQkgKiByZXR1cm4gdHJ1ZSBmb3IgZWxlbWVudHMgd2hvc2UgY29udGVudHMgd2UgbWlnaHQgd2FudCB0byBhZGQgdG8gdGhlIGphdmEgZmlsZSB3ZSBhcmUgYnVpbGRpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0pTUFN0YXJ0UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSBzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKTsKLQkJcmV0dXJuIHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWNsYXJhdGlvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGVjbGFyYXRpb24iKSAvLyROT04tTkxTLTEkCQkKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI8JSEiKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHByZXNzaW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpleHByZXNzaW9uIikgLy8kTk9OLU5MUy0xJAkJCi0JCQkJCXx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgiPCU9Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NjcmlwdGxldChTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6c2NyaXB0bGV0IikgLy8kTk9OLU5MUy0xJAkJCi0JCQkJCXx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgiPCUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZURpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJCXRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWdsaWJEaXJlY3RpdmUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRpcmVjdGl2ZS50YWdsaWIiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgidGFnbGliIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhZ2VEaXJlY3RpdmUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRpcmVjdGl2ZS5wYWdlIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoInBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIGRpZmZlcmVudCBidHduIFhNTC1KU1AgYW5kIEpTUCB0YWdzCQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZ2lvbk5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIG5hbWVTdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgc2l6ZSA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWlmIChzaXplID4gMSkgewotCQkJLy8gcHJlc3VtYWJseSBYTUwtSlNQIDxqc3A6c2NyaXB0bGV0PiB8IDxqc3A6ZXhwcmVzc2lvbj4gfCA8anNwOmRlY2xhcmF0aW9uPgotCQkJbmFtZVJlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCX0KLQkJZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0JCQkvLyBwcmVzdW1hYmx5IEpTUCBvcGVuIDwlIHwgPCU9IHwgPCUhCi0JCQluYW1lUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgwKTsKLQkJfQotCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKQotCQkJbmFtZVN0ciA9IGZUZXh0VG9QYXJzZS5zdWJzdHJpbmcoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbiksIHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQobmFtZVJlZ2lvbikpOwotCQlyZXR1cm4gbmFtZVN0ci50cmltKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc090aGVyUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCXByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKHNkUmVnaW9uKTsKLQkJcHJvY2Vzc1BhZ2VEaXJlY3RpdmUoc2RSZWdpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BQcm9ibGVtUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQUHJvYmxlbVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ3NjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BQcm9ibGVtUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUHJvYmxlbVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLQotY2xhc3MgSlNQUHJvYmxlbVJlcXVlc3RvciBpbXBsZW1lbnRzIElQcm9ibGVtUmVxdWVzdG9yIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNBY3RpdmUgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNSdW5uaW5nID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIExpc3QgZkNvbGxlY3RlZFByb2JsZW1zOwotCi0gICAgcHVibGljIHZvaWQgYmVnaW5SZXBvcnRpbmcoKSB7Ci0KLSAgICAgICAgZklzUnVubmluZyA9IHRydWU7Ci0gICAgICAgIGZDb2xsZWN0ZWRQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsKLQotICAgICAgICBpZiAoaXNBY3RpdmUoKSkKLSAgICAgICAgICAgIGZDb2xsZWN0ZWRQcm9ibGVtcy5hZGQocHJvYmxlbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgewotCi0gICAgICAgIGZJc1J1bm5pbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQotICAgICAgICByZXR1cm4gZklzQWN0aXZlICYmIGZDb2xsZWN0ZWRQcm9ibGVtcyAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGlzIHByb2JsZW0gcmVxdWVzdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpc0FjdGl2ZQotICAgICAqICAgICAgICAgICAgdGhlIHN0YXRlIG9mIHRoaXMgcHJvYmxlbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0FjdGl2ZShib29sZWFuIGlzQWN0aXZlKSB7Ci0KLSAgICAgICAgaWYgKGZJc0FjdGl2ZSAhPSBpc0FjdGl2ZSkgewotICAgICAgICAgICAgZklzQWN0aXZlID0gaXNBY3RpdmU7Ci0gICAgICAgICAgICBpZiAoZklzQWN0aXZlKQotICAgICAgICAgICAgICAgIHN0YXJ0Q29sbGVjdGluZ1Byb2JsZW1zKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3RvcENvbGxlY3RpbmdQcm9ibGVtcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgdGhpcyBhbm5vdGF0aW9uIG1vZGVsIHRvIGNvbGxlY3QgdGVtcG9yYXJ5IHByb2JsZW1zIGZyb20gbm93IG9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydENvbGxlY3RpbmdQcm9ibGVtcygpIHsKLQotICAgICAgICBmQ29sbGVjdGVkUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgdGhpcyBhbm5vdGF0aW9uIG1vZGVsIHRvIG5vIGxvbmdlciBjb2xsZWN0IHRlbXBvcmFyeSBwcm9ibGVtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RvcENvbGxlY3RpbmdQcm9ibGVtcygpIHsKLQotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjb2xsZWN0ZWQgcHJvYmxlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDb2xsZWN0ZWRQcm9ibGVtcygpIHsKLQotICAgICAgICByZXR1cm4gZkNvbGxlY3RlZFByb2JsZW1zOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLQotICAgICAgICByZXR1cm4gZklzUnVubmluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWUyNGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIDxwPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgSUpTUFRyYW5zbGF0aW9uLiAgCi0gKiA8YnI+Ci0gKiBUaGlzIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBqYXZhIHRyYW5zbGF0aW9uIG9mIAotICogYSBKU1AgZmlsZSBhcyB3ZWxsIGFzIGEgbWFwcGluZyBvZiByYW5nZXMgZnJvbSB0aGUgdHJhbnNsYXRlZCBKYXZhIHRvIHRoZSBKU1Agc291cmNlLCAKLSAqIGFuZCBtYXBwaW5nIGZyb20gSlNQIHNvdXJjZSBiYWNrIHRvIHRoZSB0cmFuc2xhdGVkIEphdmEuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogWW91IG1heSBhbHNvIHVzZSBKU1BUcmFuc2xhdGlvbiB0byBkbyBDb21waWxhdGlvblVuaXQtZXNxdWUgdGhpbmdzIHN1Y2ggYXM6Ci0gKiA8dWw+Ci0gKiAJPGxpPmNvZGUgc2VsZWN0IChnZXQgamF2YSBlbGVtZW50cyBmb3IganNwIHNlbGVjdGlvbik8L2xpPgotICogIDxsaT5yZWNvbmNpbGU8L2xpPgotICogIDxsaT5nZXQgamF2YSByZWdpb25zIGZvciBqc3Agc2VsZWN0aW9uPC9saT4KLSAqICA8bGk+Z2V0IGEgSlNQIHRleHQgZWRpdCBiYXNlZCBvbiBhIEphdmEgdGV4dCBlZGl0PC9saT4KLSAqICA8bGk+ZGV0ZXJtaW5lIGlmIGEgamF2YSBvZmZzZXQgZmFsbHMgd2l0aGluIGEganNwOnVzZUJlYW4gcmFuZ2U8L2xpPgotICogIDxsaT5kZXRlcm1pbmUgaWYgYSBqYXZhIG9mZnNldCBmYWxscyB3aXRoaW4gYSBqc3AgaW1wb3J0IHN0YXRtZW50PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdGlvbiBpbXBsZW1lbnRzIElKU1BUcmFuc2xhdGlvbiB7Ci0JCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyAody9vdXQgZXh0ZW5zaW9uKSAqKi8KLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElKYXZhUHJvamVjdCBmSmF2YVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSnNwMkphdmFNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BJbXBvcnRzTWFwID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZkphdmEySnNwVXNlQmVhbk1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZKYXZhMkpzcEluZGlyZWN0TWFwID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkVMUHJvYmxlbXMgPSBudWxsOwotCQotCS8vIGRvbid0IHdhbnQgdG8gaG9sZCBvbnRvIG1vZGVsICh2aWEgdHJhbnNsYXRvcikKLQkvLyBhbGwgcmVsZXZhbnQgaW5mbyBpcyBleHRyYWN0ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgotCS8vcHJpdmF0ZSBKU1BUcmFuc2xhdG9yIGZUcmFuc2xhdG9yID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmSmF2YVRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZKc3BUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgZkNvbXBpbGF0aW9uVW5pdCA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCS8qKiBsb2NrIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgY29tcGlsYXRpb24gdW5pdCAqKi8KLQlwcml2YXRlIGJ5dGVbXSBmTG9jayA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZk1hbmdsZWROYW1lOwotCXByaXZhdGUgU3RyaW5nIGZKc3BOYW1lOwotCXByaXZhdGUgTGlzdCBmVHJhbnNsYXRpb25Qcm9ibGVtczsKLQlwcml2YXRlIENvbGxlY3Rpb24gZkluY2x1ZGVkUGF0aHM7Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRpb24oSUphdmFQcm9qZWN0IGphdmFQcm9qLCBKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQotCQlmTG9jayA9IG5ldyBieXRlWzBdOwotCQlmSmF2YVByb2plY3QgPSBqYXZhUHJvajsKLQkJLy9mVHJhbnNsYXRvciA9IHRyYW5zbGF0b3I7Ci0JCQotCQkvLyBjYW4gYmUgbnVsbCBpZiBpdCdzIGFuIGVtcHR5IGRvY3VtZW50ICh3LyBOdWxsSlNQVHJhbnNsYXRpb24pCi0JCWlmKHRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkgICAgZkphdmFUZXh0ID0gdHJhbnNsYXRvci5nZXRUcmFuc2xhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCSAgICBmSnNwVGV4dCA9IHRyYW5zbGF0b3IuZ2V0SnNwVGV4dCgpOwotCQkJZkNsYXNzbmFtZSA9IHRyYW5zbGF0b3IuZ2V0Q2xhc3NuYW1lKCk7Ci0JCQlmSmF2YTJKc3BNYXAgPSB0cmFuc2xhdG9yLmdldEphdmEySnNwUmFuZ2VzKCk7Ci0JCQlmSnNwMkphdmFNYXAgPSB0cmFuc2xhdG9yLmdldEpzcDJKYXZhUmFuZ2VzKCk7Ci0JCQlmSmF2YTJKc3BJbXBvcnRzTWFwID0gdHJhbnNsYXRvci5nZXRKYXZhMkpzcEltcG9ydFJhbmdlcygpOwotCQkJZkphdmEySnNwVXNlQmVhbk1hcCA9IHRyYW5zbGF0b3IuZ2V0SmF2YTJKc3BVc2VCZWFuUmFuZ2VzKCk7Ci0JCQlmSmF2YTJKc3BJbmRpcmVjdE1hcCA9IHRyYW5zbGF0b3IuZ2V0SmF2YTJKc3BJbmRpcmVjdFJhbmdlcygpOwotCQkJZkVMUHJvYmxlbXMgPSB0cmFuc2xhdG9yLmdldEVMUHJvYmxlbXMoKTsKLQkJCWZUcmFuc2xhdGlvblByb2JsZW1zID0gdHJhbnNsYXRvci5nZXRUcmFuc2xhdGlvblByb2JsZW1zKCk7Ci0JCQlmSW5jbHVkZWRQYXRocyA9IHRyYW5zbGF0b3IuZ2V0SW5jbHVkZWRQYXRocygpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBmSmF2YVByb2plY3Q7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uI2dldEphdmFUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCkgewotCQkvL3JldHVybiAoZlRyYW5zbGF0b3IgIT0gbnVsbCkgPyBmVHJhbnNsYXRvci5nZXRUcmFuc2xhdGlvbigpLnRvU3RyaW5nKCkgOiAiIjsgIC8vJE5PTi1OTFMtMSQgCi0JCXJldHVybiBmSmF2YVRleHQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SnNwVGV4dCgpIHsKLQkJLy9yZXR1cm4gKGZUcmFuc2xhdG9yICE9IG51bGwpID8gZlRyYW5zbGF0b3IuZ2V0SnNwVGV4dCgpIDogIiI7ICAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmSnNwVGV4dDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKYXZhUGF0aCgpIHsKLQkJLy8gY3JlYXRlIGlmIG5lY2Vzc2FyeQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCXJldHVybiAoY3UgIT0gbnVsbCkgPyBjdS5nZXRQYXRoKCkudG9TdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSBvZmZzZXQgZm9yIGEgZ2l2ZSBKU1Agb2Zmc2V0Ci0JICovCi0JcHVibGljIGludCBnZXRKYXZhT2Zmc2V0KGludCBqc3BPZmZzZXQpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgb2Zmc2V0SW5SYW5nZSA9IDA7Ci0JCVBvc2l0aW9uIGpzcFBvcywgamF2YVBvcyA9IG51bGw7Ci0KLQkJLy8gaXRlcmF0ZSBhbGwgbWFwcGVkIGpzcCByYW5nZXMKLQkJSXRlcmF0b3IgaXQgPSBmSnNwMkphdmFNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJanNwUG9zID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkvLyBuZWVkIHRvIGNvdW50IHRoZSBsYXN0IHBvc2l0aW9uIGFzIGluY2x1ZGVkCi0JCQlpZiAoIWpzcFBvcy5pbmNsdWRlcyhqc3BPZmZzZXQpICYmICEoanNwUG9zLm9mZnNldCtqc3BQb3MubGVuZ3RoID09IGpzcE9mZnNldCkpCi0JCQkJY29udGludWU7Ci0KLQkJCW9mZnNldEluUmFuZ2UgPSBqc3BPZmZzZXQgLSBqc3BQb3Mub2Zmc2V0OwotCQkJamF2YVBvcyA9IChQb3NpdGlvbikgZkpzcDJKYXZhTWFwLmdldChqc3BQb3MpOwotCQkJaWYoamF2YVBvcyAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGphdmFQb3Mub2Zmc2V0ICsgb2Zmc2V0SW5SYW5nZTsKLQkJCWVsc2UgIHsKLQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSmF2YVBvc2l0aW9uIHdhcyBudWxsISIgKyBqc3BPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSlNQIG9mZnNldCBmb3IgYSBnaXZlIEphdmEgb2Zmc2V0Ci0JICovCi0JcHVibGljIGludCBnZXRKc3BPZmZzZXQoaW50IGphdmFPZmZzZXQpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgb2Zmc2V0SW5SYW5nZSA9IDA7Ci0JCVBvc2l0aW9uIGpzcFBvcywgamF2YVBvcyA9IG51bGw7Ci0KLQkJLy8gaXRlcmF0ZSBhbGwgbWFwcGVkIGphdmEgcmFuZ2VzCi0JCUl0ZXJhdG9yIGl0ID0gZkphdmEySnNwTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWphdmFQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCS8vIG5lZWQgdG8gY291bnQgdGhlIGxhc3QgcG9zaXRpb24gYXMgaW5jbHVkZWQKLQkJCWlmICghamF2YVBvcy5pbmNsdWRlcyhqYXZhT2Zmc2V0KSAmJiAhKGphdmFQb3Mub2Zmc2V0K2phdmFQb3MubGVuZ3RoID09IGphdmFPZmZzZXQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlvZmZzZXRJblJhbmdlID0gamF2YU9mZnNldCAtIGphdmFQb3Mub2Zmc2V0OwotCQkJanNwUG9zID0gKFBvc2l0aW9uKSBmSmF2YTJKc3BNYXAuZ2V0KGphdmFQb3MpOwotCQkJCi0JCQlpZihqc3BQb3MgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBqc3BQb3Mub2Zmc2V0ICsgb2Zmc2V0SW5SYW5nZTsKLQkJCWVsc2UgIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgImpzcFBvc2l0aW9uIHdhcyBudWxsISIgKyBqYXZhT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkJCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0SW5jbHVkZWRQYXRocygpIHsKLQkJcmV0dXJuIGZJbmNsdWRlZFBhdGhzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgUG9zaXRpb25zIGluIHRoZSBKYXZhIGRvY3VtZW50IHRvIGNvcnJlc3BvbmRpbmcgUG9zaXRpb25zIGluIHRoZSBKU1AgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSGFzaE1hcCBnZXRKYXZhMkpzcE1hcCgpIHsKLQkJcmV0dXJuIGZKYXZhMkpzcE1hcDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIFBvc2l0aW9ucyBpbiB0aGUgSlNQIGRvY3VtZW50IHRvIGNvcnJlc3BvbmRpbmcgUG9zaXRpb25zIGluIHRoZSBKYXZhIGRvY3VtZW50Ci0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SnNwMkphdmFNYXAoKSB7Ci0JCXJldHVybiBmSnNwMkphdmFNYXA7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgamF2YSByYW5nZSBjb3ZlcnMgbW9yZSB0aGFuIG9uZSBwYXJ0aXRpb24gaW4gdGhlIEpTUCBmaWxlLgotCSAqIAotCSAqIDxwPgotCSAqIGV4LgotCSAqIDxjb2RlPgotCSAqIDwlCi0JICogCWlmKHN1Ym1pdCkKLQkgKiAgewotCSAqICU+Ci0JICogICAgPHA+IHByaW50IHRoaXMuLi48L3A+Ci0JICogCi0JICogPCUKLQkgKiAgfQotCSAqICBlbHNlCi0JICogIHsKLQkgKiAlPgotCSAqIAkgICA8cD4gcHJpbnQgdGhhdC4uLjwvcD4KLQkgKiA8JQotCSAqICB9Ci0JICogJT4KLQkgKiA8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIHRoZSBpZiBlbHNlIHN0YXRlbWVudCBhYm92ZSBzcGFucyAzIEpTUCBwYXJ0aXRpb25zLCBzbyBpdCB3b3VsZCByZXR1cm4gdHJ1ZS4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGphdmEgY29kZSBzcGFucyBtdWx0aXBsZSBKU1AgcGFydGl0aW9ucywgb3RoZXJ3aXNlIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGphdmFTcGFuc011bHRpcGxlSnNwUGFydGl0aW9ucyhpbnQgamF2YU9mZnNldCwgaW50IGphdmFMZW5ndGgpIHsKLQkJSGFzaE1hcCBqYXZhMmpzcCA9IGdldEphdmEySnNwTWFwKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ID0gamF2YTJqc3Aua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJUG9zaXRpb24gamF2YVJhbmdlID0gbnVsbDsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlqYXZhUmFuZ2UgPSAoUG9zaXRpb24paXQubmV4dCgpOwotCQkJaWYoamF2YVJhbmdlLm92ZXJsYXBzV2l0aChqYXZhT2Zmc2V0LCBqYXZhTGVuZ3RoKSkKLQkJCQljb3VudCsrOwotCQkJaWYoY291bnQgPiAxKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBwb3NpdGlvbnMgZm9yIHRoZSBnaXZlbiByYW5nZSBpbiB0aGUgSmF2YSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRKYXZhUmFuZ2VzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0SmF2YTJKc3BNYXAoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlQb3NpdGlvbiBwID0gbnVsbDsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlwID0gKFBvc2l0aW9uKWl0Lm5leHQoKTsKLQkJCWlmKHAub3ZlcmxhcHNXaXRoKG9mZnNldCwgbGVuZ3RoKSkKLQkJCQlyZXN1bHRzLmFkZChwKTsKLQkJfQotCQlyZXR1cm4gKFBvc2l0aW9uW10pcmVzdWx0cy50b0FycmF5KG5ldyBQb3NpdGlvbltyZXN1bHRzLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGhlIGphdmEgT2Zmc2V0IGZhbGxzIHdpdGhpbiB0aGUgdXNlciBpbXBvcnQgcmFuZ2VzCi0JICogQHBhcmFtIGphdmFPZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGphdmEgT2Zmc2V0IGZhbGxzIHdpdGhpbiB0aGUgdXNlciBpbXBvcnQgcmFuZ2VzLCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcG9ydChpbnQgamF2YU9mZnNldCkgewotCQlyZXR1cm4gaXNJblJhbmdlcyhqYXZhT2Zmc2V0LCBmSmF2YTJKc3BJbXBvcnRzTWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGhlIGphdmEgb2Zmc2V0IGZhbGxzIHdpdGhpbiB0aGUgdXNlIGJlYW4gcmFuZ2VzCi0JICogQHBhcmFtIGphdmFPZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGphdmEgb2Zmc2V0IGZhbGxzIHdpdGhpbiB0aGUgdXNlciBpbXBvcnQgcmFuZ2VzLCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZUJlYW4oaW50IGphdmFPZmZzZXQpIHsKLQkJcmV0dXJuIGlzSW5SYW5nZXMoamF2YU9mZnNldCwgZkphdmEySnNwVXNlQmVhbk1hcCk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBqYXZhUG9zCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5kaXJlY3QoaW50IGphdmFPZmZzZXQpIHsKLQkJcmV0dXJuIGlzSW5SYW5nZXMoamF2YU9mZnNldCwgZkphdmEySnNwSW5kaXJlY3RNYXAsIGZhbHNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5SYW5nZXMoaW50IGphdmFPZmZzZXQsIEhhc2hNYXAgcmFuZ2VzKSB7Ci0JCXJldHVybiBpc0luUmFuZ2VzKGphdmFPZmZzZXQsIHJhbmdlcywgdHJ1ZSk7Ci0JfQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGluY2x1ZGVkIGluIGFueSBvZiB0aGUgcmFuZ2VzIChQb3NpdGlvbnMpIHBhc3NlZCBpbi4KLQkgKiBpbmNsdWRlRW5kT2Zmc2V0IHRlbGxzIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIGVuZCBvZmZzZXQgb2YgZWFjaCByYW5nZSBpbiB0aGUgdGVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YU9mZnNldAotCSAqIEBwYXJhbSByYW5nZXMKLQkgKiBAcGFyYW0gaW5jbHVkZUVuZE9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJblJhbmdlcyhpbnQgamF2YU9mZnNldCwgSGFzaE1hcCByYW5nZXMsIGJvb2xlYW4gaW5jbHVkZUVuZE9mZnNldCkgewotCQkKLQkJSXRlcmF0b3IgaXQgPSByYW5nZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlQb3NpdGlvbiBqYXZhUG9zID0gKFBvc2l0aW9uKWl0Lm5leHQoKTsKLQkJCS8vIGFsc28gaW5jbHVkZSB0aGUgc3RhcnQgYW5kIGVuZCBvZmZzZXQgKG9ubHkgaWYgcmVxdWVzdGVkKQotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgxNjg3Ci0JCQlpZihqYXZhUG9zLmluY2x1ZGVzKGphdmFPZmZzZXQpIHx8IChpbmNsdWRlRW5kT2Zmc2V0ICYmIGphdmFQb3Mub2Zmc2V0K2phdmFQb3MubGVuZ3RoID09IGphdmFPZmZzZXQpKSAKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIENvbXBpbGF0aW9uVW5pdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBKU1BUcmFuc2xhdGlvbiAodGhpcyBwYXJ0aWN1bGFyIG1vZGVsKQotCSAqIFdoZW4gdXNpbmcgbWV0aG9kcyBvbiB0aGUgQ1UsIGl0J3MgcmVjY29tZW5kZWQgdG8gc3luY2hyb25pemUgb24gdGhlIENVIGZvciByZWxpYWJsZQotCSAqIHJlc3VsdHMuCi0JICogCi0JICogVGhlIG1ldGhvZCBpcyBzeW5jaHJvbml6ZWQgdG8gZW5zdXJlIHRoYXQgPGNvZGU+Y3JlYXRlQ29tcGxpbGF0aW9uVW5pdDwvY29kZT4gZG9lc24ndAotCSAqIGdldCBlbnRlcmVkIDIgb3IgbW9yZSB0aW1lcyBzaW11bHRhbmVvdXNseS4gIEEgc2lkZSBlZmZlY3Qgb2YgdGhhdCBpcyAyIGNvbXBpbGF0aW9uIHVuaXRzCi0JICogY2FuIGJlIGNyZWF0ZWQgaW4gdGhlIEphdmFNb2RlbE1hbmFnZXIsIGJ1dCB3ZSBvbmx5IGhvbGQgb25lIHJlZmVyZW5jZSB0byBpdCBpbiAKLQkgKiBmQ29tcGlsYXRpb25Vbml0LiAgVGhpcyB3b3VsZCBsZWFkIHRvIGEgbGVhayBzaW5jZSBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgQ1UgaXMKLQkgKiBkaXNjYXJkZWQgaW4gdGhlIDxjb2RlPnJlbGVhc2UoKTwvY29kZT4gbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gYSBDb21waWxhdGlvblVuaXQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJc3luY2hyb25pemVkKGZMb2NrKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmQ29tcGlsYXRpb25Vbml0ID09IG51bGwpIHsKLQkJCQkJZkNvbXBpbGF0aW9uVW5pdCA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJaWYoREVCVUcpCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImVycm9yIGNyZWF0aW5nIEpTUCB3b3JraW5nIGNvcHkuLi4gIiwgam1lKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBmQ29tcGlsYXRpb25Vbml0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1hbmdsZWROYW1lKCkgewotCQlyZXR1cm4gZk1hbmdsZWROYW1lOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0TWFuZ2xlZE5hbWUoU3RyaW5nIG1hbmdsZWROYW1lKSB7Ci0JCWZNYW5nbGVkTmFtZSA9IG1hbmdsZWROYW1lOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRKc3BOYW1lKCkgewotCQlyZXR1cm4gZkpzcE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEpzcE5hbWUoU3RyaW5nIGpzcE5hbWUpIHsKLQkJZkpzcE5hbWUgPSBqc3BOYW1lOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIG1hbmdsZWQgKHNlcnZsZXQpIG5hbWUgd2l0aCBqc3AgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5U3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZml4dXBNYW5nbGVkTmFtZShTdHJpbmcgZGlzcGxheVN0cmluZykgewotCQkKLQkJaWYoZGlzcGxheVN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZihnZXRKc3BOYW1lKCkgPT0gbnVsbCB8fCBnZXRNYW5nbGVkTmFtZSgpID09IG51bGwpIHsKLQkJCS8vIG5hbWVzIG5vdCBzZXQgeWV0Ci0JCQlpbml0SnNwQW5kU2VydmxldE5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlTdHJpbmcucmVwbGFjZUFsbChnZXRNYW5nbGVkTmFtZSgpLCBnZXRKc3BOYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0SnNwQW5kU2VydmxldE5hbWVzKCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWlmKGN1ICE9IG51bGwpIHsKLQkJCVN0cmluZyBjdU5hbWUgPSBudWxsOwotCQkJc3luY2hyb25pemVkKGN1KSB7Ci0JCQkJLy8gc2V0IHNvbWUgbmFtZXMgZm9yIGZpeGluZyB1cCBtYW5nbGVkIG5hbWUgaW4gcHJvcG9zYWxzCi0JCQkJLy8gc2V0IG1hbmdsZWQgKHNlcnZsZXQpIG5hbWUKLQkJCQkgY3VOYW1lID0gY3UuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCk7Ci0JCQl9Ci0JCQlpZihjdU5hbWUgIT0gbnVsbCkgewotCQkJCXNldE1hbmdsZWROYW1lKGN1TmFtZS5zdWJzdHJpbmcoMCwgY3VOYW1lLmxhc3RJbmRleE9mKCcuJykpKTsKLQkJCQkvLyBzZXQgbmFtZSBvZiBqc3AgZmlsZQotCQkJCVN0cmluZyB1bm1hbmdsZWQgPSBKU1AyU2VydmxldE5hbWVVdGlsLnVubWFuZ2xlKGN1TmFtZSk7Ci0JCQkJc2V0SnNwTmFtZSh1bm1hbmdsZWQuc3Vic3RyaW5nKHVubWFuZ2xlZC5sYXN0SW5kZXhPZignLycpICsgMSwgdW5tYW5nbGVkLmxhc3RJbmRleE9mKCcuJykpKTsKLQkJCX0KLQkJfQotCX0KLQotCQotCS8qKgotCSAqIE9yaWdpbmFsbHkgZnJvbSBSZWNvbmNpbGVTdGVwRm9ySmF2YS4gIENyZWF0ZXMgYW4gSUNvbXBpbGF0aW9uVW5pdCBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgSlNQIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gYW4gSUNvbXBpbGF0aW9uVW5pdCBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgSlNQIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBudWxsOwotCQlJSmF2YUVsZW1lbnQgamUgPSBnZXRKYXZhUHJvamVjdCgpOwotCi0JCWlmIChqZSA9PSBudWxsIHx8ICFqZS5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXN3aXRjaCAoamUuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6Ci0JCQkJamUgPSBqZS5nZXRQYXJlbnQoKTsKLQkJCS8vIGZhbGwgdGhyb3VnaAotCi0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGplOwotCQkJCXBhY2thZ2VGcmFnbWVudCA9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnRSb290LkRFRkFVTFRfUEFDS0FHRVJPT1RfUEFUSCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6Ci0JCQkJSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgamU7Ci0KLQkJCQlpZiAoIWpQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqIEFib3J0IGNyZWF0ZSB3b3JraW5nIGNvcHk6IGNhbm5vdCBjcmVhdGUgd29ya2luZyBjb3B5OiBKU1AgaXMgbm90IGluIGEgSmF2YSBwcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290ID0gbnVsbDsKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0galByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJd2hpbGUgKGkgPCBwYWNrYWdlRnJhZ21lbnRSb290cy5sZW5ndGgpIHsKLQkJCQkJaWYgKCFwYWNrYWdlRnJhZ21lbnRSb290c1tpXS5pc0FyY2hpdmUoKSAmJiAhcGFja2FnZUZyYWdtZW50Um9vdHNbaV0uaXNFeHRlcm5hbCgpKSB7Ci0JCQkJCQlwYWNrYWdlRnJhZ21lbnRSb290ID0gcGFja2FnZUZyYWdtZW50Um9vdHNbaV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpKys7Ci0JCQkJfQotCQkJCWlmIChwYWNrYWdlRnJhZ21lbnRSb290ID09IG51bGwpIHsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKiogQWJvcnQgY3JlYXRlIHdvcmtpbmcgY29weTogY2Fubm90IGNyZWF0ZSB3b3JraW5nIGNvcHk6IEpTUCBpcyBub3QgaW4gYSBKYXZhIHByb2plY3Qgd2l0aCBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudFJvb3QuREVGQVVMVF9QQUNLQUdFUk9PVF9QQVRIKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0KGdldENsYXNzbmFtZSgpICsgIi5qYXZhIikuZ2V0V29ya2luZ0NvcHkoZ2V0V29ya2luZ0NvcHlPd25lcigpLCBnZXRQcm9ibGVtUmVxdWVzdG9yKCksIGdldFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRDb250ZW50cyhjdSk7Ci0KLQkJaWYoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBKU1BUcmFuc2xhdGlvbiBbIisgdGhpcyArICJdIGZpbmlzaGVkIGNyZWF0aW5nIENvbXBpbGF0aW9uVW5pdDogIiArIGN1KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlyZXR1cm4gY3U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvYmxlbSByZXF1ZXN0b3IgZm9yIHRoZSBDb21waWxhdGlvblVuaXQgaW4gdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgSlNQUHJvYmxlbVJlcXVlc3RvciBnZXRQcm9ibGVtUmVxdWVzdG9yKCkgewotCSAgICByZXR1cm4gQ29tcGlsYXRpb25Vbml0SGVscGVyLmdldEluc3RhbmNlKCkuZ2V0UHJvYmxlbVJlcXVlc3RvcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIElXb3JraW5nQ29weU93bmVyIGZvciB0aGlzIENvbXBpbGF0aW9uVW5pdCBpbiB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIFdvcmtpbmdDb3B5T3duZXIgZ2V0V29ya2luZ0NvcHlPd25lcigpIHsKLQkgICAgcmV0dXJuIENvbXBpbGF0aW9uVW5pdEhlbHBlci5nZXRJbnN0YW5jZSgpLmdldFdvcmtpbmdDb3B5T3duZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgaW4gbG9uZyBvcGVyYXRpb25zIChyZWNvbmNpbGUsIGNyZWF0aW5nIHRoZSBDb21waWxhdGlvblVuaXQuLi4pIGluIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsKQotCQkJZlByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXJldHVybiBmUHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIExpc3Qgb2YgcHJvYmxlbXMgY29sbGVjdGVkIGR1cmluZyByZWNvbmNpbGUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9ibGVtcygpIHsKLQkJTGlzdCBwcm9ibGVtcyA9IGdldFByb2JsZW1SZXF1ZXN0b3IoKS5nZXRDb2xsZWN0ZWRQcm9ibGVtcygpOwotCQlpZiAocHJvYmxlbXMgIT0gbnVsbCkgewotCQkJaWYgKGZUcmFuc2xhdGlvblByb2JsZW1zLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBwcm9ibGVtczsKLQkJCX0KLQkJCUxpc3QgY29tYmluZWRQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QocHJvYmxlbXMpOwotCQkJY29tYmluZWRQcm9ibGVtcy5hZGRBbGwoZlRyYW5zbGF0aW9uUHJvYmxlbXMpOwotCQkJcmV0dXJuIGNvbWJpbmVkUHJvYmxlbXM7Ci0JCX0KLQkJcmV0dXJuIGZUcmFuc2xhdGlvblByb2JsZW1zOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBMaXN0IG9mIHByb2JsZW1zIGNvbGxlY3RlZCBkdXJpbmcgcmVjb25jaWxlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RUxQcm9ibGVtcygpIHsKLQkJcmV0dXJuIGZFTFByb2JsZW1zICE9IG51bGwgPyBmRUxQcm9ibGVtcyA6IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQotCS8qKgotCSAqIE11c3QgYmUgc2V0IHRydWUgaW4gb3JkZXIgZm9yIHByb2JsZW1zIHRvIGJlIGNvbGxlY3RlZCBkdXJpbmcgcmVjb25jaWxlLgotCSAqIElmIHNldCBmYWxzZSwgcHJvYmxlbXMgd2lsbCBiZSBpZ25vcmVkIGR1cmluZyByZWNvbmNpbGUuCi0JICogQHBhcmFtIGNvbGxlY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtQ29sbGVjdGluZ0FjdGl2ZShib29sZWFuIGNvbGxlY3QpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZihjdSAhPSBudWxsKSB7CQotCQkJZ2V0UHJvYmxlbVJlcXVlc3RvcigpLnNldElzQWN0aXZlKGNvbGxlY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVjb25jaWxlcyB0aGUgY29tcGlsYXRpb24gdW5pdCBmb3IgdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZiAoY3UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlzeW5jaHJvbml6ZWQoY3UpIHsKLQkJCQkJY3UubWFrZUNvbnNpc3RlbnQoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQljdS5yZWNvbmNpbGUoSUNvbXBpbGF0aW9uVW5pdC5OT19BU1QsIHRydWUsIGdldFdvcmtpbmdDb3B5T3duZXIoKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgY29udGVudHMgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdG8gdGhlIHRyYW5zbGF0ZWQganNwIHRleHQuCi0JICogQHBhcmFtIHRoZSBJQ29tcGlsYXRpb25Vbml0IG9uIHdoaWNoIHRvIHNldCB0aGUgYnVmZmVyIGNvbnRlbnRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRlbnRzKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKGN1ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlzeW5jaHJvbml6ZWQgKGN1KSB7Ci0JCQlJQnVmZmVyIGJ1ZmZlcjsKLQkJCXRyeSB7Ci0JCQkJCi0JCQkJYnVmZmVyID0gY3UuZ2V0QnVmZmVyKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCWJ1ZmZlciA9IG51bGw7Ci0JCQl9Ci0JCi0JCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQkJYnVmZmVyLnNldENvbnRlbnRzKGdldEphdmFUZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUphdmFFbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBKU1AgcmFuZ2UgaW4gdGhlIEpTUCBTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0ganNwU3RhcnQgc3RhcmluZyBvZmZzZXQgaW4gdGhlIEpTUCBkb2N1bWVudAotCSAqIEBwYXJhbSBqc3BFbmQgZW5kaW5nIG9mZnNldCBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICogQHJldHVybiBJSmF2YUVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpTUCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHNGcm9tSnNwUmFuZ2UoaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kKSB7Ci0KLQkJaW50IGphdmFQb3NpdGlvblN0YXJ0ID0gZ2V0SmF2YU9mZnNldChqc3BTdGFydCk7Ci0JCWludCBqYXZhUG9zaXRpb25FbmQgPSBnZXRKYXZhT2Zmc2V0KGpzcEVuZCk7Ci0KLQkJSUphdmFFbGVtZW50W10gRU1UUFlfUkVTVUxUX1NFVCA9IG5ldyBJSmF2YUVsZW1lbnRbMF07Ci0JCUlKYXZhRWxlbWVudFtdIHJlc3VsdCA9IEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCXRyeSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQlpZiAoY3UgIT0gbnVsbCkgewotCQkJCXN5bmNocm9uaXplZCAoY3UpIHsKLQkJCQkJaW50IGN1RG9jTGVuZ3RoID0gY3UuZ2V0QnVmZmVyKCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWludCBqYXZhTGVuZ3RoID0gamF2YVBvc2l0aW9uRW5kIC0gamF2YVBvc2l0aW9uU3RhcnQ7Ci0JCQkJCWlmIChjdURvY0xlbmd0aCA+IDAgJiYgamF2YVBvc2l0aW9uU3RhcnQgPj0gMCAmJiBqYXZhTGVuZ3RoID49IDAgJiYgamF2YVBvc2l0aW9uRW5kIDwgY3VEb2NMZW5ndGgpIHsKLQkJCQkJCXJlc3VsdCA9IGN1LmNvZGVTZWxlY3QoamF2YVBvc2l0aW9uU3RhcnQsIGphdmFMZW5ndGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKQotCQkJCXJldHVybiBFTVRQWV9SRVNVTFRfU0VUOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24geCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbih4KTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NuYW1lOwotCX0KLQotCS8qKgotCSAqIE11c3QgZGlzY2FyZCBjb21waWxhdGlvbiB1bml0LCBvciBlbHNlIHRoZXkgY2FuIGxlYWsgaW4gdGhlIEphdmFNb2RlbE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkKLQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJaWYgKGZDb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotCQkJCUpvYiBkaXNjYXJkZXIgPSBuZXcgV29ya3NwYWNlSm9iKGZDbGFzc25hbWUpIHsKLQkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKC0pIEpTUFRyYW5zbGF0aW9uIFsiICsgdGhpcyArICJdIGRpc2NhcmRpbmcgQ29tcGlsYXRpb25Vbml0OiAiICsgZkNvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWZDb21waWxhdGlvblVuaXQuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyB3ZSdyZSBkb25lIHcvIGl0IGFueXdheQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWRpc2NhcmRlci5zY2hlZHVsZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGI2Yzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogQW4gYWRhcHRlciBmb3IgZ2V0dGluZyBhIEpTUFRyYW5zbGF0aW9uIG9mIHRoZSBkb2N1bWVudC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciwgSURvY3VtZW50TGlzdGVuZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIElEb2N1bWVudCBmSnNwRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSURvY3VtZW50IGZKYXZhRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZkpTUFRyYW5zbGF0aW9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkRvY3VtZW50SXNEaXJ0eSA9IHRydWU7Ci0JcHJpdmF0ZSBJRE9NTW9kZWwgZlhNTE1vZGVsOwotCXByaXZhdGUgSlNQVHJhbnNsYXRvciBmVHJhbnNsYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBOdWxsUHJvZ3Jlc3NNb25pdG9yIGZUcmFuc2xhdGlvbk1vbml0b3IgPSBudWxsOwotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uQWRhcHRlcihJRE9NTW9kZWwgeG1sTW9kZWwpIHsKLQkJc2V0WE1MTW9kZWwoeG1sTW9kZWwpOwotCQlpbml0aWFsaXplSmF2YVBsdWdpbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSByZXF1aXJlZCBKYXZhIFBsdWdpbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSmF2YVBsdWdpbnMoKSB7Ci0JCUphdmFDb3JlLmdldFBsdWdpbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKioKLQkgKiBBdXRvbWF0aWNhbGx5IHNldCB0aHJvdWdoIHRoZSBzZXRYTUxNb2RlbChYTUxNb2RlbCkKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGZKc3BEb2N1bWVudCAhPSBudWxsKQotCQkJZkpzcERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJZG9jLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCQlmSnNwRG9jdW1lbnQgPSBkb2M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJLy8gbWFyayB0cmFuc2xhdGlvbiBmb3IgcmVidWlsZGluZwotCQlmRG9jdW1lbnRJc0RpcnR5ID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCi0JCWlmIChmSnNwRG9jdW1lbnQgIT0gbnVsbCkKLQkJCWZKc3BEb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCi0JCWlmIChmVHJhbnNsYXRpb25Nb25pdG9yICE9IG51bGwpCi0JCQlmVHJhbnNsYXRpb25Nb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCi0JCWlmIChmSlNQVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCi0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgcmVsZWFzaW5nOiIgKyBmSlNQVHJhbnNsYXRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJCWZKU1BUcmFuc2xhdGlvbi5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKU1BUcmFuc2xhdGlvbiBmb3IgdGhpcyBhZGFwdGVyLgotCSAqIAotCSAqIEByZXR1cm4gYSBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZ2V0SlNQVHJhbnNsYXRpb24oKSB7Ci0KLQkJaWYgKGZKU1BUcmFuc2xhdGlvbiA9PSBudWxsIHx8IGZEb2N1bWVudElzRGlydHkpIHsKLQkJCUpTUFRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG51bGw7Ci0JCQlpZiAoZ2V0WE1MTW9kZWwoKSAhPSBudWxsICYmIGdldFhNTE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbigwKSAhPSBudWxsKSB7Ci0JCQkJdHJhbnNsYXRvciA9IGdldFRyYW5zbGF0b3IoKElET01Ob2RlKSBnZXRYTUxNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oMCkpOwotCQkJCXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGphdmFDb250ZW50cyA9IHRyYW5zbGF0b3IuZ2V0VHJhbnNsYXRpb24oKTsKLQkJCQlmSmF2YURvY3VtZW50ID0gbmV3IERvY3VtZW50KGphdmFDb250ZW50cy50b1N0cmluZygpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVtcHR5IGRvY3VtZW50IGNhc2UKLQkJCQl0cmFuc2xhdG9yID0gY3JlYXRlVHJhbnNsYXRvcigpOwotCQkJCVN0cmluZ0J1ZmZlciBlbXB0eUNvbnRlbnRzID0gdHJhbnNsYXRvci5nZXRFbXB0eVRyYW5zbGF0aW9uKCk7Ci0JCQkJZkphdmFEb2N1bWVudCA9IG5ldyBEb2N1bWVudChlbXB0eUNvbnRlbnRzLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJLy8gaXQncyBnb2luZyB0byBiZSByZWJ1aWx0LCBzbyB3ZSByZWxlYXNlIGl0IGhlcmUKLQkJCWlmIChmSlNQVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJCWlmIChERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgcmVsZWFzaW5nOiIgKyBmSlNQVHJhbnNsYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJZkpTUFRyYW5zbGF0aW9uLnJlbGVhc2UoKTsKLQkJCX0KLQkJCWZKU1BUcmFuc2xhdGlvbiA9IG5ldyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbihnZXRYTUxNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBmSmF2YURvY3VtZW50LCBnZXRKYXZhUHJvamVjdCgpLCB0cmFuc2xhdG9yKTsKLQkJCWZEb2N1bWVudElzRGlydHkgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZkpTUFRyYW5zbGF0aW9uOwotCX0KLQotCUpTUFRyYW5zbGF0b3IgY3JlYXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BUcmFuc2xhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSlNQVHJhbnNsYXRvciBmb3IgdGhpcyBhZGFwdGVyLiBJZiBpdCdzIG51bGwsIGEgbmV3Ci0JICogdHJhbnNsYXRvciBpcyBjcmVhdGVkIHdpdGggdGhlIHhtbE5vZGUuIE90aGVyd2lzZSB0aGUKLQkgKiB0cmFuc2xhdG9yLnJlc2V0KHhtbE5vZGUpIGlzIGNhbGxlZCB0byByZXNldCB0aGUgY3VycmVudCBsb2NhbAotCSAqIHRyYW5zbGF0b3IuCi0JICogCi0JICogQHBhcmFtIHhtbE5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub2RlIG9mIHRoZSBKU1AgZG9jdW1lbnQgdG8gYmUgdHJhbnNsYXRlZAotCSAqIEByZXR1cm4gdGhlIEpTUFRyYW5zbGF0b3IgZm9yIHRoaXMgYWRhcHRlciAoY3JlYXRlcyBpZiBudWxsKQotCSAqLwotCXByaXZhdGUgSlNQVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKElET01Ob2RlIHhtbE5vZGUpIHsKLQkJaWYgKGZUcmFuc2xhdG9yID09IG51bGwpIHsKLQkJCWZUcmFuc2xhdGlvbk1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJZlRyYW5zbGF0b3IgPSBjcmVhdGVUcmFuc2xhdG9yKCk7Ci0JCQlmVHJhbnNsYXRvci5yZXNldCh4bWxOb2RlLCBmVHJhbnNsYXRpb25Nb25pdG9yKTsKLQkJfQotCQllbHNlCi0JCQlmVHJhbnNsYXRvci5yZXNldCh4bWxOb2RlLCBmVHJhbnNsYXRpb25Nb25pdG9yKTsKLQkJcmV0dXJuIGZUcmFuc2xhdG9yOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgWE1MTW9kZWwgZm9yIHRoaXMgYWRhcHRlci4gTXVzdCBiZSBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIHhtbE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0WE1MTW9kZWwoSURPTU1vZGVsIHhtbE1vZGVsKSB7Ci0JCWZYTUxNb2RlbCA9IHhtbE1vZGVsOwotCQlzZXREb2N1bWVudChmWE1MTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIFhNTE1vZGVsIGZvciB0aGlzIGFkYXB0ZXIuCi0JICovCi0JcHJpdmF0ZSBJRE9NTW9kZWwgZ2V0WE1MTW9kZWwoKSB7Ci0JCXJldHVybiBmWE1MTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyAob3IgY3JlYXRlcyB2aWEgSmF2YUNvcmUpIGEgSmF2YVByb2plY3QgYmFzZWQgb24gdGhlIGxvY2F0aW9uIG9mCi0JICogdGhpcyBhZGFwdGVyJ3MgWE1MTW9kZWwuIFJldHVybnMgbnVsbCBmb3Igbm9uIElGaWxlIGJhc2VkIG1vZGVscy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBqYXZhIHByb2plY3Qgd2hlcmUKLQkgKi8KLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gZ2V0WE1MTW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCS8vIDIwMDQxMTI5IChwYSkgdGhlIGJhc2UgbG9jYXRpb24gY2hhbmdlZCBmb3IgWE1MIG1vZGVsCi0JCQkvLyBiZWNhdXNlIG9mIEZpbGVCdWZmZXJzLCBzbyB0aGlzIGNvZGUgaGFkIHRvIGJlIHVwZGF0ZWQKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTY4NgotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCQlwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGZpbGVQYXRoLnNlZ21lbnQoMCkpOwotCQkJfQotLy8JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChiYXNlTG9jYXRpb24pKTsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IHByb2plY3QgPT0gbnVsbCAmJiBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCWlmIChmaWxlc1tpXS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLS8vCQkJCQlwcm9qZWN0ID0gZmlsZXNbaV0uZ2V0UHJvamVjdCgpOwotLy8JCQkJCWJyZWFrOwotLy8JCQkJfQotLy8JCQl9Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGdldFhNTE1vZGVsKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCIoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSBwcm9ibGVtIGdldHRpbmcgamF2YSBwcm9qZWN0IGZyb20gdGhlIFhNTE1vZGVsJ3MgYmFzZUxvY2F0aW9uID4gIiArIGdldFhNTE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIihKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHByb2JsZW0gZ2V0dGluZyBqYXZhIHByb2plY3QiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTBiNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICogIAotICovCi1wdWJsaWMgY2xhc3MgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgZkFkYXB0ZXIgPSBudWxsOwotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb24iKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQ7Ci0JCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKElKU1BUcmFuc2xhdGlvbi5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSAmJiBmQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlmQWRhcHRlciA9IG5ldyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIoKChJRE9NTm9kZSkgdGFyZ2V0KS5nZXRNb2RlbCgpKTsKLQkJCWlmKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBbIiArIHRoaXMgKyAiXSBjcmVhdGVkIGFkYXB0ZXI6ICIgKyBmQWRhcHRlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCXJldHVybiBmQWRhcHRlcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZihERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKC0pIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgWyIgKyB0aGlzICsgIl0gcmVsZWFzaW5nIGFkYXB0ZXI6ICIgKyBmQWRhcHRlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZkFkYXB0ZXIucmVsZWFzZSgpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25FeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmVkNDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlVuZG9FZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBBZGRzIHRoZSBub3Rpb24gb2YgSURvY3VtZW50cyAoanNwIERvY3VtZW50IGFuZCBqYXZhIERvY3VtZW50KSBVc2VkIGZvcgotICogVGV4dEVkaXQgdHJhbnNsYXRpb24KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGV4dGVuZHMgSlNQVHJhbnNsYXRpb24gewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBqdXN0IGEgY29udmVuaWVuY2UgZGF0YSBzdHJ1Y3R1cmUKLQkvLyB0byBrZWVwIHRyYWNrIG9mIGphdmEgcG9zaXRpb24gZGVsdGFzCi0JcHJpdmF0ZSBjbGFzcyBQb3NpdGlvbkRlbHRhIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQgPSBmYWxzZTsKLQkJcHVibGljIGludCBwcmVPZmZzZXQgPSAwOwotCQlwdWJsaWMgaW50IHByZUxlbmd0aCA9IDA7Ci0JCXB1YmxpYyBpbnQgcG9zdE9mZnNldCA9IDA7Ci0JCXB1YmxpYyBpbnQgcG9zdExlbmd0aCA9IDA7Ci0KLQkJcHVibGljIFBvc2l0aW9uRGVsdGEoaW50IHByZU9mZnNldCwgaW50IHByZUxlbmd0aCkgewotCQkJdGhpcy5wcmVPZmZzZXQgPSBwcmVPZmZzZXQ7Ci0JCQl0aGlzLnByZUxlbmd0aCA9IHByZUxlbmd0aDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBvc3RFZGl0RGF0YShpbnQgcG9zdE9mZnNldCwgaW50IHBvc3RMZW5ndGgsIGJvb2xlYW4gaXNEZWxldGVkKSB7Ci0JCQl0aGlzLnBvc3RPZmZzZXQgPSBwb3N0T2Zmc2V0OwotCQkJdGhpcy5wb3N0TGVuZ3RoID0gcG9zdExlbmd0aDsKLQkJCXRoaXMuaXNEZWxldGVkID0gaXNEZWxldGVkOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkpzcERvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmSmF2YURvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIENvZGVGb3JtYXR0ZXIgZkNvZGVGb3JtYXR0ZXIgPSBudWxsOwotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSURvY3VtZW50IGphdmFEb2N1bWVudCwgSUphdmFQcm9qZWN0IGphdmFQcm9qLCBKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJc3VwZXIoamF2YVByb2osIHRyYW5zbGF0b3IpOwotCQlmSnNwRG9jdW1lbnQgPSBqc3BEb2N1bWVudDsKLQkJZkphdmFEb2N1bWVudCA9IGphdmFEb2N1bWVudDsKLQotCQkvLyBtYWtlIHN1cmUgcG9zaXRpb25zIGFyZSBhZGRlZCB0byBKYXZhIGFuZCBKU1AgZG9jdW1lbnRzCi0JCS8vIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0ZXh0IGVkaXRzCi0JCWFkZFBvc2l0aW9uc1RvRG9jdW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudCBnZXRKc3BEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZKc3BEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50IGdldEphdmFEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZKYXZhRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVGV4dCgpIHsKLQkJcmV0dXJuIGdldEphdmFEb2N1bWVudCgpICE9IG51bGwgPyBnZXRKYXZhRG9jdW1lbnQoKS5nZXQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvcnJlc3BvbmRpbmcgVGV4dEVkaXQgZm9yIHRoZSBKU1AgZmlsZSBnaXZlbiBhIFRleHRFZGl0IGZvcgotCSAqIGEgSmF2YSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhRWRpdAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSlNQIGVkaXRzIChub3QgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgeWV0KQotCSAqLwotCXB1YmxpYyBUZXh0RWRpdCBnZXRKc3BFZGl0KFRleHRFZGl0IGphdmFFZGl0KSB7Ci0KLQkJaWYgKGphdmFFZGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlMaXN0IGpzcEVkaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWludCBvZmZzZXQgPSBqYXZhRWRpdC5nZXRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IGphdmFFZGl0LmdldExlbmd0aCgpOwotCi0JCWlmIChqYXZhRWRpdCBpbnN0YW5jZW9mIE11bHRpVGV4dEVkaXQgJiYgamF2YUVkaXQuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0KLQkJCUlSZWdpb24gciA9IFRleHRFZGl0LmdldENvdmVyYWdlKGdldEFsbEVkaXRzKGphdmFFZGl0KSk7Ci0JCQlvZmZzZXQgPSByLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gci5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCS8vIGdldCBqYXZhIHJhbmdlcyB0aGF0IHdpbGwgYmUgYWZmZWN0ZWQgYnkgdGhlIGVkaXQKLQkJUG9zaXRpb25bXSBqYXZhUG9zaXRpb25zID0gZ2V0SmF2YVJhbmdlcyhvZmZzZXQsIGxlbmd0aCk7Ci0KLQkJLy8gcmVjb3JkIHBvc2l0aW9uIGRhdGEgYmVmb3JlIHRoZSBjaGFuZ2UKLQkJUG9zaXRpb25bXSBqc3BQb3NpdGlvbnMgPSBuZXcgUG9zaXRpb25bamF2YVBvc2l0aW9ucy5sZW5ndGhdOwotCQlQb3NpdGlvbkRlbHRhW10gZGVsdGFzID0gbmV3IFBvc2l0aW9uRGVsdGFbamF2YVBvc2l0aW9ucy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFQb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWRlbHRhc1tpXSA9IG5ldyBQb3NpdGlvbkRlbHRhKGphdmFQb3NpdGlvbnNbaV0ub2Zmc2V0LCBqYXZhUG9zaXRpb25zW2ldLmxlbmd0aCk7Ci0JCQkvLyBpc0luZGlyZWN0IG1lYW5zIHRoZSBwb3NpdGlvbiBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0IGFzIGV4YWN0Ci0JCQkvLyB0ZXh0Ci0JCQkvLyBtYXBwaW5nIGZyb20gamF2YSA8LT4ganNwIChlZy4gYW4gaW1wb3J0IHN0YXRlbWVudCkKLQkJCWlmICghaXNJbmRpcmVjdChqYXZhUG9zaXRpb25zW2ldLm9mZnNldCkpCi0JCQkJanNwUG9zaXRpb25zW2ldID0gKFBvc2l0aW9uKSBnZXRKYXZhMkpzcE1hcCgpLmdldChqYXZhUG9zaXRpb25zW2ldKTsKLQkJfQotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWx0YXM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBqYXZhVGV4dCA9IGdldEphdmFUZXh0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInBvc1siICsgZGVsdGFzW2ldLnByZU9mZnNldCArICI6IiArIGRlbHRhc1tpXS5wcmVMZW5ndGggKyAiXSIgKyBqYXZhVGV4dC5zdWJzdHJpbmcoZGVsdGFzW2ldLnByZU9mZnNldCwgZGVsdGFzW2ldLnByZU9mZnNldCArIGRlbHRhc1tpXS5wcmVMZW5ndGgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVVuZG9FZGl0IHVuZG8gPSBudWxsOwotCQkvLyBhcHBseSB0aGUgZWRpdCB0byB0aGUgamF2YSBkb2N1bWVudAotCQl0cnkgewotCQkJdW5kbyA9IGphdmFFZGl0LmFwcGx5KGdldEphdmFEb2N1bWVudCgpKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCS8vIG5vdyBhdCB0aGlzIHBvaW50IEphdmEgcG9zaXRpb25zIGFyZSB1bnJlbGlhYmxlIHNpbmNlIHRoZXkgd2VyZQotCQkvLyB1cGRhdGVkIGFmdGVyIGFwcGx5aW5nIGphdmEgZWRpdC4KLQotCQlTdHJpbmcgbmV3SmF2YVRleHQgPSBnZXRKYXZhRG9jdW1lbnQoKS5nZXQoKTsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJqYXZhIHBvc3QgZm9ybWF0IHRleHQ6XG4iICsgbmV3SmF2YVRleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gcmVjb3JkIHBvc3QgZWRpdCBkYXRhCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVBvc2l0aW9ucy5sZW5ndGg7IGkrKykKLQkJCWRlbHRhc1tpXS5zZXRQb3N0RWRpdERhdGEoamF2YVBvc2l0aW9uc1tpXS5vZmZzZXQsIGphdmFQb3NpdGlvbnNbaV0ubGVuZ3RoLCBqYXZhUG9zaXRpb25zW2ldLmlzRGVsZXRlZCk7Ci0KLQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIHRleHQgZWRpdHMgZm9yIGRlbHRhcwotCQlQb3NpdGlvbiBqc3BQb3MgPSBudWxsOwotCQlTdHJpbmcgcmVwbGFjZVRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJanNwUG9zID0ganNwUG9zaXRpb25zW2ldOwotCQkJLy8gY2FuIGJlIG51bGwgaWYgaXQncyBhbiBpbmRpcmVjdCBtYXBwaW5nIHBvc2l0aW9uCi0JCQkvLyBvciBpZiBzb21ldGhpbmcgd2FzIGFkZGVkIGludG8gamF2YSB0aGF0IHdhcyBub3Qgb3JpZ2luYWxseSBpbgotCQkJLy8gSlNQIChsaWtlIGEgbmV3IGltcG9ydC4uLikKLQotCQkJaWYgKGpzcFBvcyAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlbHRhc1tpXS5pc0RlbGV0ZWQpIHsKLQkJCQkJanNwRWRpdHMuYWRkKG5ldyBEZWxldGVFZGl0KGpzcFBvcy5vZmZzZXQsIGpzcFBvcy5sZW5ndGgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlcGxhY2VUZXh0ID0gbmV3SmF2YVRleHQuc3Vic3RyaW5nKGRlbHRhc1tpXS5wb3N0T2Zmc2V0LCBkZWx0YXNbaV0ucG9zdE9mZnNldCArIGRlbHRhc1tpXS5wb3N0TGVuZ3RoKTsKLQotCQkJCQkvLyBnZXQgcmlkIG9mIHByZSBhbmQgcG9zdCB3aGl0ZSBzcGFjZSBvciBmaW5lIHR1bmVkCi0JCQkJCS8vIGFkanVzdG1lbnQgbGF0ZXIuCi0JCQkJCS8vIGZpeCB0ZXh0IGhlcmUuLi4KLQkJCQkJcmVwbGFjZVRleHQgPSBmaXhKc3BSZXBsYWNlVGV4dChyZXBsYWNlVGV4dCwganNwUG9zLm9mZnNldCk7Ci0KLQkJCQkJanNwRWRpdHMuYWRkKG5ldyBSZXBsYWNlRWRpdChqc3BQb3Mub2Zmc2V0LCBqc3BQb3MubGVuZ3RoLCByZXBsYWNlVGV4dCkpOwotCQkJCX0KLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnUmVwbGFjZShkZWx0YXMsIGpzcFBvcywgcmVwbGFjZVRleHQsIGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhlIG5ldyBKYXZhIHRleHQgaGFzIG5vIGNvcnJlc3BvbmRpbmcgSlNQIHBvc2l0aW9uCi0JCQkJLy8gcG9zc2libGUgbmV3IGltcG9ydD8KLQkJCQlpZiAoaXNJbXBvcnQoamF2YVBvc2l0aW9uc1tpXS5nZXRPZmZzZXQoKSkgJiYgcmVwbGFjZVRleHQubGFzdEluZGV4T2YoImltcG9ydCAiKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJlcGxhY2VUZXh0ID0gbmV3SmF2YVRleHQuc3Vic3RyaW5nKGRlbHRhc1tpXS5wb3N0T2Zmc2V0LCBkZWx0YXNbaV0ucG9zdE9mZnNldCArIGRlbHRhc1tpXS5wb3N0TGVuZ3RoKTsKLQkJCQkJU3RyaW5nIGltcG9ydFRleHQgPSByZXBsYWNlVGV4dC5zdWJzdHJpbmcocmVwbGFjZVRleHQubGFzdEluZGV4T2YoImltcG9ydCAiKSwgcmVwbGFjZVRleHQuaW5kZXhPZigiOyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS8vIGV2ZW51dGFsbHkgbmVlZCB0byBjaGVjayBpZiBpdCdzIFhNTC1KU1AKLQkJCQkJaW1wb3J0VGV4dCA9ICI8JUBwYWdlIGltcG9ydD1cIiIgKyBpbXBvcnRUZXh0ICsgIlwiICU+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJanNwRWRpdHMuYWRkKG5ldyBJbnNlcnRFZGl0KDAsIGltcG9ydFRleHQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJVGV4dEVkaXQgYWxsSnNwRWRpdHMgPSBjcmVhdGVNdWx0aVRleHRFZGl0KChUZXh0RWRpdFtdKSBqc3BFZGl0cy50b0FycmF5KG5ldyBUZXh0RWRpdFtqc3BFZGl0cy5zaXplKCldKSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTYzMgotCQkvLyB1bmRvIHRoZSBqYXZhIGVkaXQKLQkJLy8gKHNvIHRoZSB1bmRlcmx5aW5nIEphdmEgZG9jdW1lbnQgc3RpbGwgcmVwcmVzZW50cyB3aGF0J3MgaW4gdGhlCi0JCS8vIGVkaXRvcikKLQkJaWYgKHVuZG8gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl1bmRvLmFwcGx5KGdldEphdmFEb2N1bWVudCgpKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFsbEpzcEVkaXRzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZpeEpzcFJlcGxhY2VUZXh0KFN0cmluZyByZXBsYWNlVGV4dCwgaW50IGpzcE9mZnNldCkgewotCi0JCS8vIHJlc3VsdCBpcyB0aGUgdGV4dCBpbmJldHdlZW4gdGhlIGRlbGltaXRlcnMKLQkJLy8gZWcuCi0JCS8vIAotCQkvLyA8JSByZXN1bHQKLQkJLy8gJT4KLQkJU3RyaW5nIHJlc3VsdCA9IHJlcGxhY2VUZXh0LnRyaW0oKTsKLQkJU3RyaW5nIHByZURlbGltaXRlcldoaXRlc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCUlEb2N1bWVudCBqc3BEb2MgPSBnZXRKc3BEb2N1bWVudCgpOwotCQlpZiAoanNwRG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGpzcERvYzsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gc0RvYy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKDAsIGpzcE9mZnNldCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV07Ci0KLQkJCS8vIG9ubHkgc3BlY2lmaWNhbGx5IG1vZGlmeSBzY3JpcHRsZXRzCi0JCQlpZiAobGFzdFJlZ2lvbiAhPSBudWxsICYmIGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgewotCQkJCWZvciAoaW50IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gcmVnaW9uc1tpXTsKLQotCQkJCQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gY2hlY2sgd2hpdGVzcGFjZT8KLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCAmJiByZWdpb24uZ2V0RnVsbFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCXByZURlbGltaXRlcldoaXRlc3BhY2UgPSByZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJCQkJCXByZURlbGltaXRlcldoaXRlc3BhY2UgPSBwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlLnJlcGxhY2VBbGwoIlxyIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCXByZURlbGltaXRlcldoaXRlc3BhY2UgPSBwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlLnJlcGxhY2VBbGwoIlxuIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJLy8gbmVlZCB0byBkZXRlcm1pbmUgaW5kZW50IGZvciB0aGF0IGZpcnN0IGxpbmUuLi4KLQkJCQkJCVN0cmluZyBpbml0aWFsSW5kZW50ID0gZ2V0SW5pdGlhbEluZGVudChyZXN1bHQpOwotCi0JCQkJCQkvLyBmaXggdGhlIGZpcnN0IGxpbmUgb2YgamF2YSBjb2RlCi0JCQkJCQlyZXN1bHQgPSBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKHNEb2MpICsgaW5pdGlhbEluZGVudCArIHJlc3VsdDsKLQotCQkJCQkJcmVzdWx0ID0gYWRqdXN0SW5kZW50KHJlc3VsdCwgcHJlRGVsaW1pdGVyV2hpdGVzcGFjZSwgVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihzRG9jKSk7Ci0KLQkJCQkJCS8vIGFkZCB3aGl0ZXNwYWNlIGJlZm9yZSBsYXN0IGRlbGltaXRlciB0byBtYXRjaAotCQkJCQkJLy8gaXQgdy8gdGhlIG9wZW5pbmcgZGVsaW1pdGVyCi0JCQkJCQlyZXN1bHQgPSByZXN1bHQgKyBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKHNEb2MpICsgcHJlRGVsaW1pdGVyV2hpdGVzcGFjZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYWRqdXN0SW5kZW50KFN0cmluZyB0ZXh0QmVmb3JlLCBTdHJpbmcgaW5kZW50LCBTdHJpbmcgZGVsaW0pIHsKLQotCQkvLyBmaXJzdCByZXBsYWNlIG11bHRpcGxlIGluZGVudCB3aXRoIHNpbmdsZSBpbmRlbnQKLQkJLy8gdGhlIHRyaXBsZSBpbmRlbnQgb2NjdXJzIGJlY2F1c2UgdGhlIHNjcmlwdGxldCBjb2RlCi0JCS8vIGFjdHVhbGx5IG9jY3VycyB1bmRlcjoKLQkJLy8gCi0JCS8vIGNsYXNzCi0JCS8vIG1ldGhvZAotCQkvLyBjb2RlCi0JCS8vIAotCQkvLyBpbiB0aGUgdHJhbnNsYXRlZCBqYXZhIGRvY3VtZW50Ci0JCS8vIEJVRzE4ODYzNiAtIGp1c3QgZ2V0IGluZGVudCBpbmZvIGZyb20gY29kZSBmb3JtYXR0ZXIKLQkJU3RyaW5nIGxldmVsMSA9IGdldENvZGVGb3JtYXR0ZXIoKS5jcmVhdGVJbmRlbnRhdGlvblN0cmluZygxKTsKLQkJU3RyaW5nIGxldmVsMyA9IGdldENvZGVGb3JtYXR0ZXIoKS5jcmVhdGVJbmRlbnRhdGlvblN0cmluZygzKTsKLQkJU3RyaW5nIHRoZU9sZCA9ICJcbiIgKyBsZXZlbDM7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRoZU5ldyA9ICJcbiIgKyBsZXZlbDE7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dEJlZm9yZSA9IHRleHRCZWZvcmUucmVwbGFjZUFsbCh0aGVPbGQsIHRoZU5ldyk7Ci0KLQkJLy8gZ2V0IGluZGVudCBhZnRlciAybmQgbGluZSBicmVhawotCQlTdHJpbmdCdWZmZXIgdGV4dEFmdGVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyB3aWxsIHRoaXMgd29yayBvbiBtYWM/Ci0JCXRleHRCZWZvcmUgPSB0ZXh0QmVmb3JlLnJlcGxhY2VBbGwoIlxyIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0QmVmb3JlLCAiXG4iLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rID0gc3QubmV4dFRva2VuKCk7Ci0JCQlpZiAodG9rLmVxdWFscygiXG4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdGV4dEFmdGVyLmFwcGVuZChkZWxpbSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBwcmVwZW5kIGVhY2ggbGluZSB3LyBzcGVjaWZpZWQgaW5kZW50Ci0JCQkJdGV4dEFmdGVyLmFwcGVuZChpbmRlbnQpOwotCQkJCXRleHRBZnRlci5hcHBlbmQodG9rKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dEFmdGVyLnRvU3RyaW5nKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRJbml0aWFsSW5kZW50KFN0cmluZyByZXN1bHQpIHsKLQkJLy8gQlVHMTg4NjM2IC0ganVzdCBnZXQgaW5pdGlhbCBpbmRlbnQgZnJvbSBjb2RlIGZvcm1hdHRlcgotCQlTdHJpbmcgaW5kZW50ID0gZ2V0Q29kZUZvcm1hdHRlcigpLmNyZWF0ZUluZGVudGF0aW9uU3RyaW5nKDEpOwotCQkvLyAvLyBnZXQgaW5kZW50IGFmdGVyIDJuZCBsaW5lIGJyZWFrCi0JCS8vIFN0cmluZyBpbmRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc3VsdCwgIlxyXG4iLCBmYWxzZSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gaWYgKHN0LmNvdW50VG9rZW5zKCkgPiAxKSB7Ci0JCS8vIFN0cmluZyB0b2sgPSBzdC5uZXh0VG9rZW4oKTsKLQkJLy8gdG9rID0gc3QubmV4dFRva2VuKCk7Ci0JCS8vIGludCBpbmRleCA9IDA7Ci0JCS8vIGlmICh0b2sgIT0gbnVsbCkgewotCQkvLyB3aGlsZSAodG9rLmNoYXJBdChpbmRleCkgPT0gJyAnIHx8IHRvay5jaGFyQXQoaW5kZXgpID09ICdcdCcpIHsKLQkJLy8gaW5kZW50ICs9IHRvay5jaGFyQXQoaW5kZXgpOwotCQkvLyBpbmRleCsrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQlyZXR1cm4gaW5kZW50OwotCX0KLQotCXByaXZhdGUgQ29kZUZvcm1hdHRlciBnZXRDb2RlRm9ybWF0dGVyKCkgewotCQlpZiAoZkNvZGVGb3JtYXR0ZXIgPT0gbnVsbCkKLQkJCWZDb2RlRm9ybWF0dGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlQ29kZUZvcm1hdHRlcihudWxsKTsKLQkJcmV0dXJuIGZDb2RlRm9ybWF0dGVyOwotCX0KLQotCi0JLyoqCi0JICogQ29tYmluZXMgYW4gYXJyYXkgb2YgZWRpdHMgaW50byBvbmUgTXVsdGlUZXh0RWRpdCAod2l0aCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBjb3ZlcmFnZSByZWdpb24pCi0JICogCi0JICogQHBhcmFtIGVkaXRzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGV4dEVkaXQgY3JlYXRlTXVsdGlUZXh0RWRpdChUZXh0RWRpdFtdIGVkaXRzKSB7Ci0KLQkJaWYgKGVkaXRzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0KLQkJSVJlZ2lvbiByZWdpb24gPSBUZXh0RWRpdC5nZXRDb3ZlcmFnZShlZGl0cyk7Ci0JCU11bHRpVGV4dEVkaXQgbXVsdGlFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhZGRUb011bHRpRWRpdChlZGl0c1tpXSwgbXVsdGlFZGl0KTsKLQkJfQotCQlyZXR1cm4gbXVsdGlFZGl0OwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvTXVsdGlFZGl0KFRleHRFZGl0IGVkaXQsIE11bHRpVGV4dEVkaXQgbXVsdGlFZGl0KSB7Ci0KLQkJLy8gY2hlY2sgZm9yIG92ZXJsYXAgaGVyZQotCQkvLyBkaXNjYXJkIG92ZXJsYXBwaW5nIGVkaXRzLi4KLQkJLy8gcG9zc2libGUgZXhwb25lbnRpYWwgcGVyZm9ybWFuY2UgaGl0Li4uIG5lZWQgYSBiZXR0ZXIgd2F5Li4uCi0JCVRleHRFZGl0W10gY2hpbGRyZW4gPSBtdWx0aUVkaXQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuW2ldLmNvdmVycyhlZGl0KSkKLQkJCQkvLyBkb24ndCBhZGQKLQkJCQlyZXR1cm47Ci0JCX0KLQkJbXVsdGlFZGl0LmFkZENoaWxkKGVkaXQpOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFBvc2l0aW9uc1RvRG9jdW1lbnRzKCkgewotCi0JCS8vIGNhbiBiZSBudWxsIGlmIGl0J3MgYSBOdWxsSlNQVHJhbnNsYXRpb24KLQkJaWYgKGdldEphdmFEb2N1bWVudCgpICE9IG51bGwgJiYgZ2V0SnNwRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0KLQkJCUhhc2hNYXAgamF2YTJqc3AgPSBnZXRKYXZhMkpzcE1hcCgpOwotCQkJSXRlcmF0b3IgaXQgPSBqYXZhMmpzcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJUG9zaXRpb24gamF2YVBvcyA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJamF2YVBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotCQkJCXRyeSB7Ci0KLQkJCQkJZkphdmFEb2N1bWVudC5hZGRQb3NpdGlvbihqYXZhUG9zKTsKLQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHlyaW5nIHRvIGFkZCBKYXZhIFBvc2l0aW9uOlsiICsgamF2YVBvcy5vZmZzZXQgKyAiOiIgKyBqYXZhUG9zLmxlbmd0aCArICJdIHRvICIgKyBnZXRKYXZhUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQJCQkJCQotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzdWJzdHJpbmcgOlsiICsKLQkJCQkJCS8vIGZKYXZhRG9jdW1lbnQuZ2V0KCkuc3Vic3RyaW5nKGphdmFQb3Mub2Zmc2V0KSArCi0JCQkJCQkvLyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl0cnkgewotCi0JCQkJCWZKc3BEb2N1bWVudC5hZGRQb3NpdGlvbigoUG9zaXRpb24pIGphdmEyanNwLmdldChqYXZhUG9zKSk7Ci0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInR5cmluZyB0byBhZGQgSlNQIFBvc2l0aW9uOlsiICsgKChQb3NpdGlvbikgamF2YTJqc3AuZ2V0KGphdmFQb3MpKS5vZmZzZXQgKyAiOiIgKyAoKFBvc2l0aW9uKSBqYXZhMmpzcC5nZXQoamF2YVBvcykpLmxlbmd0aCArICJdIHRvICIgKyBnZXRKYXZhUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWN1cnNpdmVseSBnZXRzIGFsbCBjaGlsZCBlZGl0cwotCSAqIAotCSAqIEBwYXJhbSBqYXZhRWRpdAotCSAqIEByZXR1cm4gYWxsIGNoaWxkIGVkaXRzCi0JICovCi0JcHJpdmF0ZSBUZXh0RWRpdFtdIGdldEFsbEVkaXRzKFRleHRFZGl0IGphdmFFZGl0KSB7Ci0KLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChqYXZhRWRpdCBpbnN0YW5jZW9mIE11bHRpVGV4dEVkaXQpIHsKLQkJCVRleHRFZGl0W10gY2hpbGRyZW4gPSBqYXZhRWRpdC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0QWxsRWRpdHMoY2hpbGRyZW5baV0pKSk7Ci0JCX0KLQkJZWxzZQotCQkJcmVzdWx0LmFkZChqYXZhRWRpdCk7Ci0JCXJldHVybiAoVGV4dEVkaXRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFRleHRFZGl0W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVsdGFzCi0JICogQHBhcmFtIGpzcFBvcwotCSAqIEBwYXJhbSByZXBsYWNlVGV4dAotCSAqIEBwYXJhbSBqc3BUZXh0Ci0JICogQHBhcmFtIGkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVidWdSZXBsYWNlKFBvc2l0aW9uRGVsdGFbXSBkZWx0YXMsIFBvc2l0aW9uIGpzcFBvcywgU3RyaW5nIHJlcGxhY2VUZXh0LCBpbnQgaSkgewotCQlTdHJpbmcganNwQ2h1bms7Ci0JCWpzcENodW5rID0gZ2V0SnNwRG9jdW1lbnQoKS5nZXQoKS5zdWJzdHJpbmcoanNwUG9zLm9mZnNldCwganNwUG9zLm9mZnNldCArIGpzcFBvcy5sZW5ndGgpOwotCQlpZiAoIWRlbHRhc1tpXS5pc0RlbGV0ZWQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVwbGFjaW5nOiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImpzcDpbIiArIGpzcENodW5rICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIncvIDpbIiArIHJlcGxhY2VUZXh0ICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvblV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3MmMzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkNvcHlTb3VyY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuQ29weVRhcmdldEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1vdmVTb3VyY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTW92ZVRhcmdldEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdGlvblV0aWwgewotCXByb3RlY3RlZCBJRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZlRyYW5zbGF0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvblV0aWwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCB0cmFuc2xhdGVUZXh0RWRpdChUZXh0RWRpdCB0ZXh0RWRpdCkgewotCQlUZXh0RWRpdCB0cmFuc2xhdGVkVGV4dEVkaXQgPSBudWxsOwotCi0JCWludCBqYXZhT2Zmc2V0ID0gdGV4dEVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCWludCBqc3BPZmZzZXQgPSBnZXRUcmFuc2xhdGlvbigpLmdldEpzcE9mZnNldCh0ZXh0RWRpdC5nZXRPZmZzZXQoKSk7Ci0JCWludCBsZW5ndGggPSB0ZXh0RWRpdC5nZXRMZW5ndGgoKTsKLQotCQlpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBNdWx0aVRleHRFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJVGV4dEVkaXRbXSBjaGlsZHJlbiA9ICgoTXVsdGlUZXh0RWRpdCkgdGV4dEVkaXQpLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGV4dEVkaXQgdHJhbnNsYXRlZENoaWxkVGV4dEVkaXQgPSB0cmFuc2xhdGVUZXh0RWRpdChjaGlsZHJlbltpXSk7Ci0JCQkJaWYgKHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0ICE9IG51bGwpCi0JCQkJCSgoTXVsdGlUZXh0RWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5hZGRDaGlsZCh0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBSZXBsYWNlRWRpdCkgewotCQkJaWYgKGpzcE9mZnNldCA9PSAtMSkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJaWYgKCFnZXRUcmFuc2xhdGlvbigpLmphdmFTcGFuc011bHRpcGxlSnNwUGFydGl0aW9ucyhqYXZhT2Zmc2V0LCBsZW5ndGgpKQotCQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBSZXBsYWNlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCwgKChSZXBsYWNlRWRpdCkgdGV4dEVkaXQpLmdldFRleHQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBJbnNlcnRFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgSW5zZXJ0RWRpdChqc3BPZmZzZXQsICgoSW5zZXJ0RWRpdCkgdGV4dEVkaXQpLmdldFRleHQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBEZWxldGVFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgRGVsZXRlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCk7Ci0JCQlUZXh0RWRpdFtdIGNoaWxkcmVuID0gKChEZWxldGVFZGl0KSB0ZXh0RWRpdCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlUZXh0RWRpdCB0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCA9IHRyYW5zbGF0ZVRleHRFZGl0KGNoaWxkcmVuW2ldKTsKLQkJCQlpZiAodHJhbnNsYXRlZENoaWxkVGV4dEVkaXQgIT0gbnVsbCkKLQkJCQkJKChEZWxldGVFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLmFkZENoaWxkKHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIENvcHlTb3VyY2VFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgQ29weVNvdXJjZUVkaXQoanNwT2Zmc2V0LCBsZW5ndGgpOwotCQkJKChDb3B5U291cmNlRWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5zZXRUYXJnZXRFZGl0KCgoQ29weVNvdXJjZUVkaXQpIHRleHRFZGl0KS5nZXRUYXJnZXRFZGl0KCkpOwotCQkJKChDb3B5U291cmNlRWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5zZXRTb3VyY2VNb2RpZmllcigoKENvcHlTb3VyY2VFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlTW9kaWZpZXIoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBDb3B5VGFyZ2V0RWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IENvcHlUYXJnZXRFZGl0KGpzcE9mZnNldCk7Ci0JCQkoKENvcHlUYXJnZXRFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlRWRpdCgpLnNldFRhcmdldEVkaXQoKENvcHlUYXJnZXRFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpOwotCQl9Ci0JCWVsc2UgaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgTW92ZVNvdXJjZUVkaXQpIHsKLQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBNb3ZlU291cmNlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCk7Ci0JCQkoKE1vdmVTb3VyY2VFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLnNldFRhcmdldEVkaXQoKChNb3ZlU291cmNlRWRpdCkgdGV4dEVkaXQpLmdldFRhcmdldEVkaXQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBNb3ZlVGFyZ2V0RWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IE1vdmVUYXJnZXRFZGl0KGpzcE9mZnNldCk7Ci0JCQkoKE1vdmVUYXJnZXRFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlRWRpdCgpLnNldFRhcmdldEVkaXQoKE1vdmVUYXJnZXRFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpOwotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOZWVkIHRvIHRyYW5zbGF0ZSAiICsgdGV4dEVkaXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gdHJhbnNsYXRlZFRleHRFZGl0OwotCX0KLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBnZXRUcmFuc2xhdGlvbigpIHsKLQkJaWYgKGZUcmFuc2xhdGlvbiA9PSBudWxsKSB7Ci0JCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJTW9kZWxIYW5kbGVyRm9ySlNQLmVuc3VyZVRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoeG1sTW9kZWwpOwotCQkJdHJ5IHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCWlmICh0cmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJZlRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIGdldFRyYW5zbGF0aW9uKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyMDUzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVmFyaWFibGVJbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5EZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5Qcm9wZXJ0eUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYi5UYWdsaWJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYi5UYWdsaWJIZWxwZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWIuVGFnbGliVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5aZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbC5JSlNQRUxUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQMjBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50VHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFRyYW5zbGF0ZXMgYSBKU1AgZG9jdW1lbnQgaW50byBhIEh0dHBTZXJ2bGV0IHN1YmNsYXNzLiBLZWVwcyB0d28gd2F5IG1hcHBpbmcgZnJvbQotICogSmF2YSB0cmFuc2xhdGlvbiB0byB0aGUgb3JpZ2luYWwgSlNQIHNvdXJjZSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIHRocm91Z2gKLSAqIGdldEphdmEySnNwUmFuZ2VzKCkgYW5kIGdldEpzcDJKYXZhUmFuZ2VzKCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdG9yIHsKLQkvLyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1RSQU5TTEFUT1JfRVhURU5TSU9OX05BTUUgPSAiZWxUcmFuc2xhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTFRSQU5TTEFUT1JfUFJPUF9OQU1FID0gIkVMVHJhbnNsYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERlZmF1bHQgRUwgVHJhbnNsYXRvciBleHRlbnNpb24gSUQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KU1BfRUxfVFJBTlNMQVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmRlZmF1bHRKU1AyMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGhhbmR5IHBsdWdpbiBJRCBjb25zdGFudAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09SRV9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGphdmFtYXBwaW5nIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIElKU1BFTFRyYW5zbGF0b3IgZkVMVHJhbnNsYXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRMID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIGZDbGFzc0hlYWRlciA9IG51bGw7Ci0JU3RyaW5nIGZDbGFzc25hbWUgPSBudWxsOwotCi0JU3RyaW5nIGZJbXBsaWNpdEltcG9ydHMgPSBudWxsOwotCi0JU3RyaW5nIGZTZXJ2aWNlSGVhZGVyID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGZTZXNzaW9uVmFyaWFibGVEZWNsYXJhdGlvbiA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBmRm9vdGVyID0gIn19IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZFeGNlcHRpb24gPSAiVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IG51bGw7IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fUFJFRklYID0gIm91dC5wcmludChcIlwiKyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1NVRkZJWCA9ICIpOyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgZlN1cGVyY2xhc3MgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgZlRyeUNhdGNoU3RhcnQgPSBFTkRMICsgInRyeSB7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9QUkVGSVggPSAianNwOiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIExpc3QgZlRyYW5zbGF0aW9uUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRyeUNhdGNoRW5kID0gIiB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHt9ICIgKyBFTkRMOyAvLyROT04tTkxTLTEkCi0KLQkvKiogZlNvdXJjZVBvc2l0aW9uID0gcG9zaXRpb24gaW4gSlNQIHNvdXJjZSAqLwotCXByaXZhdGUgaW50IGZTb3VyY2VQb3NpdGlvbiA9IC0xOwotCS8qKiBmUmVsYXRpdmVPZmZlc3QgPSBvZmZzZXQgaW4gdGhlIGJ1ZmZlciB0aGVyZSB0aGUgY3Vyc29yIGlzICovCi0JcHJpdmF0ZSBpbnQgZlJlbGF0aXZlT2Zmc2V0ID0gLTE7Ci0JLyoqIGZDdXJzb3JQb3NpdGlvbiA9IG9mZnNldCBpbiB0aGUgdHJhbnNsYXRlZCBqYXZhIGRvY3VtZW50ICovCi0JcHJpdmF0ZSBpbnQgZkN1cnNvclBvc2l0aW9uID0gLTE7Ci0KLQkvKiogc29tZSBwYWdlIGRpcmVjdGl2ZSBhdHRyaWJ1dGVzICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Vycm9yUGFnZSwgZkN1cnNvckluRXhwcmVzc2lvbiA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNJbkFTZXNzaW9uID0gdHJ1ZTsKLQotCS8qKiB1c2VyIGphdmEgY29kZSBpbiBib2R5IG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZVc2VyQ29kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvKiogdXNlciBFTCBFeHByZXNzaW9uICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlVzZXJFTEV4cHJlc3Npb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8qKiB1c2VyIGRlZmluZWQgdmFycyBkZWNsYXJlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGFzcyAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZVc2VyRGVjbGFyYXRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JLyoqIHVzZXIgZGVmaW5lZCBpbXBvcnRzICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlVzZXJJbXBvcnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JLyoqCi0JICogQSBtYXAgb2YgdGFnIG5hbWVzIHRvIHRhZyBsaWJyYXJ5IHZhcmlhYmxlIGluZm9ybWF0aW9uOyB1c2VkIHRvIHN0b3JlCi0JICogdGhlIG9uZXMgbmVlZGVkIGZvciBBVF9FTkQgdmFyaWFibGUgc3VwcG9ydC4KLQkgKi8KLQlwcml2YXRlIFN0YWNrTWFwIGZUYWdUb1ZhcmlhYmxlTWFwID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZSZXN1bHQ7IC8vIHRoZSBmaW5hbCB0cmFzbGF0ZWQgamF2YSBkb2N1bWVudAotCS8vIHN0cmluZyBidWZmZXIKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQ3Vyc29yT3duZXIgPSBudWxsOyAvLyB0aGUgYnVmZmVyIHdoZXJlIHRoZSBjdXJzb3IKLQkvLyBpcwotCi0JcHJpdmF0ZSBJRE9NTW9kZWwgZlN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGU7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbkNvZGVSZWdpb24gPSBmYWxzZTsgLy8gZmxhZyBmb3IgaWYgY3Vyc29yIGlzIGluIHRoZQotCS8vIGN1cnJlbnQgcmVnaW9uIGJlaW5nIHRyYW5zbGF0ZWQKLQotCS8qKgotCSAqIHRoZXNlIGNvbnN0YW50cyBhcmUgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZSBjb2RlIGluIHF1ZXN0aW9uIGlzCi0JICogZW1iZWRkZWQgKEpTUCBhcyBhbiBhdHRyaWJ1dGUgb3Igd2l0aGluIGNvbW1lbnQgdGFncykgb3IgaXMganVzdAotCSAqIHN0YW5kYXJkIEpTUCBjb2RlLCBvciBpZGVudGlmaWVzIGlmIGl0J3MgYW4gZXhwcmVzc2lvbgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFNUQU5EQVJEX0pTUCA9IDA7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgRU1CRURERURfSlNQID0gMTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBERUNMQVJBVElPTiA9IDI7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgRVhQUkVTU0lPTiA9IDQ7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU0NSSVBUTEVUID0gODsKLQotCS8qKiB1c2VkIHRvIGF2b2lkIGluZmluaXRlIGxvb3BpbmcgaW5jbHVkZSBmaWxlcyAqLwotCXByaXZhdGUgU3RhY2sgZkluY2x1ZGVzID0gbnVsbDsKLQlwcml2YXRlIFNldCBmSW5jbHVkZWRQYXRocyA9IG5ldyBIYXNoU2V0KDIpOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvY2Vzc0luY2x1ZGVzID0gdHJ1ZTsKLQkvKiogbW9zdGx5IGZvciBoZWxwZXIgY2xhc3Nlcywgc28gdGhleSBwYXJzZSBjb3JyZWN0bHkgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBmQmxvY2tNYXJrZXJzID0gbnVsbDsKLQkvKioKLQkgKiBmb3Iga2VlcGluZyB0cmFjayBvZiBvZmZzZXQgaW4gdXNlciBidWZmZXJzIHdoaWxlIGRvY3VtZW50IGlzIGJlaW5nCi0JICogYnVpbHQKLQkgKi8KLQlwcml2YXRlIGludCBmT2Zmc2V0SW5Vc2VySW1wb3J0cyA9IDA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucyA9IDA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckNvZGUgPSAwOwotCi0JLyoqIGNvcnJlbGF0ZXMgcmFuZ2VzIChwb3NpdGlvbnMpIGluIGphdmEgdG8gcmFuZ2VzIGluIGpzcCAqLwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBmVXNlckltcG9ydHMgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyKSB0bwotCSAqIHJhbmdlcyBpbiBzb3VyY2UgSlNQIGJ1ZmZlci4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkltcG9ydFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBmVXNlckNvZGUgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyKSB0bwotCSAqIHJhbmdlcyBpbiBzb3VyY2UgSlNQIGJ1ZmZlci4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkNvZGVSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCS8qKgotCSAqIG1hcCBvZiByYW5nZXMgaW4gZlVzZXJEZWNsYXJhdGlvbnMgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLQkgKiBidWZmZXIpIHRvIHJhbmdlcyBpbiBzb3VyY2UgSlNQIGJ1ZmZlci4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkRlY2xhcmF0aW9uUmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBmVXNlQmVhblJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgZlVzZXJFTFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiByYW5nZXMgdGhhdCBkb24ndCBkaXJlY3RseSBtYXAgZnJvbSBqYXZhIGNvZGUgdG8gSlNQIGNvZGUgKGVnLgotCSAqIDwlQGluY2x1ZGUgZmlsZT0iaW5jbHVkZWQuanNwIiU+Ci0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbmRpcmVjdFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBzYXZlIEpTUCBkb2N1bWVudCB0ZXh0IGZvciBsYXRlciB1c2UgbWF5IGp1c3Qgd2FudCB0byByZWFkIHRoaXMgZnJvbQotCSAqIHRoZSBmaWxlIG9yIHN0cnVjZHR1cmVkIGRvY3VtZW50IGRlcGVuZGluZyB3aGF0IGlzIGF2YWlsYWJsZQotCSAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZKc3BUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0KLQkvKioKLQkgKiBMaXN0IG9mIEVMIHByb2JsZW1zIHRvIGJlIHRyYW5zbGF0ZWQKLQkgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBmRUxQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIEVMIFRyYW5zbGF0b3IgSUQgKHBsdWdnYWJsZSkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmRUxUcmFuc2xhdG9ySUQ7Ci0JCi0JLyoqCi0JICogQSBzdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgYSByZWdpb24gY29sbGVjdGlvbiBtYXJrZXIgYW5kIGxpc3Qgb2YgdmFyaWFibGUKLQkgKiBpbmZvcm1hdGlvbi4gVGhlIHJlZ2lvbiBjYW4gYmUgdXNlZCBsYXRlciBmb3IgcG9zaXRpb25pbmcgdmFsaWRhdGlvbgotCSAqIG1lc3NhZ2VzLgotCSAqLwotCXN0YXRpYyBjbGFzcyBSZWdpb25UYWdsaWJWYXJpYWJsZXMgewotCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uOwotCQlUYWdsaWJWYXJpYWJsZVtdIHZhcmlhYmxlczsKLQotCQlSZWdpb25UYWdsaWJWYXJpYWJsZXMoSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbiwgVGFnbGliVmFyaWFibGVbXSB2YXJpYWJsZXMpIHsKLQkJCXRoaXMucmVnaW9uID0gcmVnaW9uOwotCQkJdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIGNvbmZpZ3VyZSB1c2luZyBhbiBYTUxOb2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmUoSURPTU5vZGUgbm9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JCWZTdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBmU3RydWN0dXJlZE1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCi0JCWZFTFRyYW5zbGF0b3JJRCA9IGdldEVMVHJhbnNsYXRvclByb3BlcnR5KGJhc2VMb2NhdGlvbik7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNyZWF0ZUNsYXNzbmFtZShub2RlKTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXNldENsYXNzbmFtZShjbGFzc05hbWUpOwotCQkJZkNsYXNzSGVhZGVyID0gInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBtZW1vcnkgc2F2aW5nIGNvbmZpZ3VyZSAobm8gU3RydWN0dXJlZERvY3VtZW50IGluIG1lbW9yeSkgY3VycmVudGx5Ci0JICogZG9lc24ndCBoYW5kbGUgaW5jbHVkZWQgZmlsZXMKLQkgKiAKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShJRmlsZSBqc3BGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gd2hlbiBjb25maWd1cmVkIG9uIGEgZmlsZQotCQkvLyBmU3RydWN0dXJlZE1vZGVsLCBmUG9zaXRpb25Ob2RlLCBmTW9kZWxRdWVyeSwgZlN0cnVjdHVyZWREb2N1bWVudAotCQkvLyBhcmUgYWxsIG51bGwKLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0KLQkJZkVMVHJhbnNsYXRvcklEID0gZ2V0RUxUcmFuc2xhdG9yUHJvcGVydHkoanNwRmlsZSk7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNyZWF0ZUNsYXNzbmFtZShqc3BGaWxlKTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXNldENsYXNzbmFtZShjbGFzc05hbWUpOwotCQkJZkNsYXNzSGVhZGVyID0gInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBqc3AgdGV4dCBmcm9tIGFuIElGaWxlCi0JICogCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SnNwVGV4dChJRmlsZSBqc3BGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oanNwRmlsZS5nZXRDb250ZW50cygpKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQkJCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJZkpzcFRleHRCdWZmZXIuYXBwZW5kKGxpbmUpOwotCQkJCWZKc3BUZXh0QnVmZmVyLmFwcGVuZChFTkRMKTsKLQkJCX0KLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBFTFRyYW5zbGF0b3IgcHJvcGVydHkgZnJvbSBhIHdvcmtzcGFjZSByZWxhdGl2ZQotCSAqIHBhdGggc3RyaW5nCi0JICogCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbgotCSAqICAgICAgICAgICAgV29ya3NwYWNlLXJlbGF0aXZlIHN0cmluZyBwYXRoCi0JICogQHJldHVybiBWYWx1ZSBvZiB0aGUgRUxUcmFuc2xhdG9yIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFTFRyYW5zbGF0b3JQcm9wZXJ0eShTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlTdHJpbmcgZWxUcmFuc2xhdG9yVmFsdWUgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKG5ldyBQYXRoKGJhc2VMb2NhdGlvbikpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQllbFRyYW5zbGF0b3JWYWx1ZSA9IGdldEVMVHJhbnNsYXRvclByb3BlcnR5KGZpbGUpOwotCQl9Ci0JCXJldHVybiBlbFRyYW5zbGF0b3JWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBFTFRyYW5zbGF0b3IgcHJvcGVydHkgZnJvbSBhbiBJRmlsZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBJRmlsZQotCSAqIEByZXR1cm4gVmFsdWUgb2YgdGhlIEVMVHJhbnNsYXRvciBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RUxUcmFuc2xhdG9yUHJvcGVydHkoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZWxUcmFuc2xhdG9yVmFsdWUgPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWVsVHJhbnNsYXRvclZhbHVlID0gZmlsZS5nZXRQZXJzaXN0ZW50UHJvcGVydHkobmV3IFF1YWxpZmllZE5hbWUoSlNQX0NPUkVfUExVR0lOX0lELCBFTFRSQU5TTEFUT1JfUFJPUF9OQU1FKSk7Ci0JCQkJCWlmIChudWxsID09IGVsVHJhbnNsYXRvclZhbHVlKSB7Ci0KLQkJCQkJCWVsVHJhbnNsYXRvclZhbHVlID0gZmlsZS5nZXRQcm9qZWN0KCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KG5ldyBRdWFsaWZpZWROYW1lKEpTUF9DT1JFX1BMVUdJTl9JRCwgRUxUUkFOU0xBVE9SX1BST1BfTkFNRSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSVNTVUU6IHdoeSBkbyB3ZSBsb2cgdGhpcyBoZXJlPyBJbnN0ZWFkIG9mIGFsbG93aW5nIHRvCi0JCQkJCS8vIHRocm93dXA/Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsVHJhbnNsYXRvclZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiB0aGUgc2ltcGxlIGNsYXNzIG5hbWUsIG5vdCBmdWxseSBxdWFsaWZpZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVDbGFzc25hbWUoSURPTU5vZGUgbm9kZSkgewotCQlTdHJpbmcgY2xhc3NuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGJhc2UgPSBub2RlLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQljbGFzc25hbWUgPSBKU1AyU2VydmxldE5hbWVVdGlsLm1hbmdsZShiYXNlKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NuYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqc3BGaWxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUNsYXNzbmFtZShJRmlsZSBqc3BGaWxlKSB7Ci0KLQkJU3RyaW5nIGNsYXNzbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChqc3BGaWxlICE9IG51bGwpIHsKLQkJCWNsYXNzbmFtZSA9IEpTUDJTZXJ2bGV0TmFtZVV0aWwubWFuZ2xlKGpzcEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NuYW1lOwotCX0KLQotCXByaXZhdGUgSUpTUFByb2JsZW0gY3JlYXRlSlNQUHJvYmxlbShmaW5hbCBpbnQgcHJvYmxlbUVJRCwgZmluYWwgaW50IHByb2JsZW1JRCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGVuZCkgewotCQlmaW5hbCBpbnQgbGluZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJZmluYWwgY2hhcltdIGNsYXNzbmFtZSA9IGZDbGFzc25hbWUudG9DaGFyQXJyYXkoKTsKLQotCQkvKgotCQkgKiBOb3RlOiB0aGVzZSBwcm9ibGVtcyB3b3VsZCByZXN1bHQgaW4gdHJhbnNsYXRpb24gZXJyb3JzIG9uIHRoZQotCQkgKiBzZXJ2ZXIsIHNvIHRoZSBzZXZlcml0eSBpcyBub3QgbWVhbnQgdG8gYmUgY29udHJvbGxhYmxlCi0JCSAqLwotCQlyZXR1cm4gbmV3IElKU1BQcm9ibGVtKCkgewotCQkJcHVibGljIHZvaWQgc2V0U291cmNlU3RhcnQoaW50IHNvdXJjZVN0YXJ0KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFNvdXJjZUxpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0U291cmNlRW5kKGludCBzb3VyY2VFbmQpIHsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTb3VyY2VTdGFydCgpIHsKLQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U291cmNlTGluZU51bWJlcigpIHsKLQkJCQlyZXR1cm4gbGluZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTb3VyY2VFbmQoKSB7Ci0JCQkJcmV0dXJuIGVuZDsKLQkJCX0KLQotCQkJcHVibGljIGNoYXJbXSBnZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkgewotCQkJCXJldHVybiBjbGFzc25hbWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJCQlyZXR1cm4gbWVzc2FnZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRJRCgpIHsKLQkJCQlyZXR1cm4gcHJvYmxlbUlEOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0QXJndW1lbnRzKCkgewotCQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldEVJRCgpIHsKLQkJCQlyZXR1cm4gcHJvYmxlbUVJRDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoU3RyaW5nIGNsYXNzbmFtZSkgewotCQl0aGlzLmZDbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZDbGFzc25hbWUgIT0gbnVsbCA/IHRoaXMuZkNsYXNzbmFtZSA6ICJHZW5lcmljSnNwU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTbyB0aGF0IHRoZSBKU1BUcmFuc2xhdG9yIGNhbiBiZSByZXVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoSURPTU5vZGUgbm9kZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgewotCi0JCS8vIGluaXRpYWxpemUgc29tZSB0aGluZ3Mgb24gbm9kZQotCQljb25maWd1cmUobm9kZSwgcHJvZ3Jlc3MpOwotCQlyZXNldCgpOwotCQkvLyBzZXQgdGhlIGpzcCB0ZXh0IGJ1ZmZlcgotCQlmSnNwVGV4dEJ1ZmZlci5hcHBlbmQoZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogY29uc2VydmF0aXZlIHZlcnNpb24gKG5vIFN0cnVjdHVyZWREb2N1bWVudC9Nb2RlbCkKLQkgKiAKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBwcm9ncmVzcwotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KElGaWxlIGpzcEZpbGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKLQotCQkvLyBpbml0aWFsaXplIHNvbWUgdGhpbmdzIG9uIG5vZGUKLQkJY29uZmlndXJlKGpzcEZpbGUsIHByb2dyZXNzKTsKLQkJcmVzZXQoKTsKLQkJLy8gc2V0IHRoZSBqc3AgdGV4dCBidWZmZXIKLQkJc2V0SnNwVGV4dChqc3BGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWluaXRpYWxpemUgc29tZSBmaWVsZHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0KLQkJLy8gcmVzZXQgcHJvZ3Jlc3MgbW9uaXRvcgotCQlpZiAoZlByb2dyZXNzTW9uaXRvciAhPSBudWxsKQotCQkJZlByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZChmYWxzZSk7Ci0KLQkJLy8gcmVpbml0IGZpZWxkcwotCQlmU291cmNlUG9zaXRpb24gPSAtMTsKLQkJZlJlbGF0aXZlT2Zmc2V0ID0gLTE7Ci0JCWZDdXJzb3JQb3NpdGlvbiA9IC0xOwotCi0JCWZJc0Vycm9yUGFnZSA9IGZDdXJzb3JJbkV4cHJlc3Npb24gPSBmYWxzZTsKLQotCQlmVXNlckNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZVc2VyRGVjbGFyYXRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmVXNlckltcG9ydHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZVc2VyRUxFeHByZXNzaW9ucyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmUmVzdWx0ID0gbnVsbDsKLQkJZkN1cnNvck93bmVyID0gbnVsbDsgLy8gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgY3Vyc29yIGlzCi0KLQkJZkN1cnJlbnROb2RlID0gbnVsbDsKLQkJZkluQ29kZVJlZ2lvbiA9IGZhbHNlOyAvLyBmbGFnIGZvciBpZiBjdXJzb3IgaXMgaW4gdGhlIGN1cnJlbnQgcmVnaW9uCi0JCS8vIGJlaW5nIHRyYW5zbGF0ZWQKLQotCQlpZiAoZkluY2x1ZGVzICE9IG51bGwpCi0JCQlmSW5jbHVkZXMuY2xlYXIoKTsKLQotCQlmQmxvY2tNYXJrZXJzID0gbnVsbDsKLQotCQlmT2Zmc2V0SW5Vc2VySW1wb3J0cyA9IDA7Ci0JCWZPZmZzZXRJblVzZXJEZWNsYXJhdGlvbnMgPSAwOwotCQlmT2Zmc2V0SW5Vc2VyQ29kZSA9IDA7Ci0KLQkJZkphdmEySnNwUmFuZ2VzLmNsZWFyKCk7Ci0JCWZJbXBvcnRSYW5nZXMuY2xlYXIoKTsKLQkJZkNvZGVSYW5nZXMuY2xlYXIoKTsKLQkJZlVzZUJlYW5SYW5nZXMuY2xlYXIoKTsKLQkJZkRlY2xhcmF0aW9uUmFuZ2VzLmNsZWFyKCk7Ci0JCWZVc2VyRUxSYW5nZXMuY2xlYXIoKTsKLQkJZkluZGlyZWN0UmFuZ2VzLmNsZWFyKCk7Ci0JCWZJbmNsdWRlZFBhdGhzLmNsZWFyKCk7Ci0KLQkJZkpzcFRleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZkVMUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGp1c3QgdGhlICJzaGVsbCIgb2YgYSBzZXJ2bGV0LCBub3RoaW5nIGNvbnRyaWJ1dGVkIGZyb20gdGhlIEpTUAotCSAqICAgICAgICAgZG9jCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBnZXRFbXB0eVRyYW5zbGF0aW9uKCkgewotCQlyZXNldCgpOwotCQlidWlsZFJlc3VsdCgpOwotCQlyZXR1cm4gZ2V0VHJhbnNsYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBwdXQgdGhlIGZpbmFsIGphdmEgZG9jdW1lbnQgdG9nZXRoZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYnVpbGRSZXN1bHQoKSB7Ci0JCS8vIHRvIGJ1aWxkIHRoZSBqYXZhIGRvY3VtZW50IHRoaXMgaXMgdGhlIG9yZGVyOgotCQkvLyAKLQkJLy8gKyBkZWZhdWx0IGltcG9ydHMKLQkJLy8gKyB1c2VyIGltcG9ydHMKLQkJLy8gKyBjbGFzcyBoZWFkZXIKLQkJLy8gWysgZXJyb3IgcGFnZV0KLQkJLy8gKyB1c2VyIGRlY2xhcmF0aW9ucwotCQkvLyArIHNlcnZpY2UgbWV0aG9kIGhlYWRlcgotCQkvLyArIHRyeS9jYXRjaCBzdGFydAotCQkvLyArIHVzZXIgY29kZQotCQkvLyArIHRyeS9jYXRjaCBlbmQKLQkJLy8gKyBzZXJ2aWNlIG1ldGhvZCBmb290ZXIKLQkJZlJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoZkltcGxpY2l0SW1wb3J0cy5sZW5ndGgoKSArIGZVc2VySW1wb3J0cy5sZW5ndGgoKSArIGZDbGFzc0hlYWRlci5sZW5ndGgoKSArIGZVc2VyRGVjbGFyYXRpb25zLmxlbmd0aCgpICsgZlNlcnZpY2VIZWFkZXIubGVuZ3RoKCkgKyBmVHJ5Q2F0Y2hTdGFydC5sZW5ndGgoKSAvLyB0cnkvY2F0Y2gKLQkJCQkJLy8gc3RhcnQKLQkJCQkJKyBmVXNlckNvZGUubGVuZ3RoKCkgKyBmVHJ5Q2F0Y2hFbmQubGVuZ3RoKCkgLy8gdHJ5L2NhdGNoCi0JCQkJCS8vIGVuZAotCQkJCQkrIGZGb290ZXIubGVuZ3RoKCkpOwotCi0JCWludCBqYXZhT2Zmc2V0ID0gMDsKLQotCQlmUmVzdWx0LmFwcGVuZChmSW1wbGljaXRJbXBvcnRzKTsKLQkJamF2YU9mZnNldCArPSBmSW1wbGljaXRJbXBvcnRzLmxlbmd0aCgpOwotCi0JCS8vIHVwZGF0ZVJhbmdlcyhmSW5kaXJlY3RJbXBvcnRzLCBqYXZhT2Zmc2V0KTsKLQkJdXBkYXRlUmFuZ2VzKGZJbXBvcnRSYW5nZXMsIGphdmFPZmZzZXQpOwotCQkvLyB1c2VyIGltcG9ydHMKLQkJYXBwZW5kKGZVc2VySW1wb3J0cyk7Ci0JCWphdmFPZmZzZXQgKz0gZlVzZXJJbXBvcnRzLmxlbmd0aCgpOwotCi0JCS8vIGNsYXNzIGhlYWRlcgotCQlmUmVzdWx0LmFwcGVuZChmQ2xhc3NIZWFkZXIpOyAvLyROT04tTkxTLTEkCi0JCWphdmFPZmZzZXQgKz0gZkNsYXNzSGVhZGVyLmxlbmd0aCgpOwotCQlmUmVzdWx0LmFwcGVuZChmU3VwZXJjbGFzcyArICJ7IiArIEVOREwpOyAvLyROT04tTkxTLTEkCi0JCWphdmFPZmZzZXQgKz0gZlN1cGVyY2xhc3MubGVuZ3RoKCkgKyAyOwotCi0JCXVwZGF0ZVJhbmdlcyhmRGVjbGFyYXRpb25SYW5nZXMsIGphdmFPZmZzZXQpOwotCQkvLyB1c2VyIGRlY2xhcmF0aW9ucwotCQlhcHBlbmQoZlVzZXJEZWNsYXJhdGlvbnMpOwotCQlqYXZhT2Zmc2V0ICs9IGZVc2VyRGVjbGFyYXRpb25zLmxlbmd0aCgpOwotCi0JCXVwZGF0ZVJhbmdlcyhmVXNlckVMUmFuZ2VzLCBqYXZhT2Zmc2V0KTsKLQkJYXBwZW5kKGZVc2VyRUxFeHByZXNzaW9ucyk7Ci0JCWphdmFPZmZzZXQgKz0gZlVzZXJFTEV4cHJlc3Npb25zLmxlbmd0aCgpOwotCi0JCWZSZXN1bHQuYXBwZW5kKGZTZXJ2aWNlSGVhZGVyKTsKLQkJamF2YU9mZnNldCArPSBmU2VydmljZUhlYWRlci5sZW5ndGgoKTsKLQkJLy8gc2Vzc2lvbiBwYXJ0aWNpcGFudAotCQlpZiAoZklzSW5BU2Vzc2lvbikgewotCQkJZlJlc3VsdC5hcHBlbmQoZlNlc3Npb25WYXJpYWJsZURlY2xhcmF0aW9uKTsKLQkJCWphdmFPZmZzZXQgKz0gZlNlc3Npb25WYXJpYWJsZURlY2xhcmF0aW9uLmxlbmd0aCgpOwotCQl9Ci0JCS8vIGVycm9yIHBhZ2UKLQkJaWYgKGZJc0Vycm9yUGFnZSkgewotCQkJZlJlc3VsdC5hcHBlbmQoZkV4Y2VwdGlvbik7Ci0JCQlqYXZhT2Zmc2V0ICs9IGZFeGNlcHRpb24ubGVuZ3RoKCk7Ci0JCX0KLQotCi0JCWZSZXN1bHQuYXBwZW5kKGZUcnlDYXRjaFN0YXJ0KTsKLQkJamF2YU9mZnNldCArPSBmVHJ5Q2F0Y2hTdGFydC5sZW5ndGgoKTsKLQotCQl1cGRhdGVSYW5nZXMoZkNvZGVSYW5nZXMsIGphdmFPZmZzZXQpOwotCi0JCS8vIHVzZXIgY29kZQotCQlhcHBlbmQoZlVzZXJDb2RlKTsKLQkJamF2YU9mZnNldCArPSBmVXNlckNvZGUubGVuZ3RoKCk7Ci0KLQotCQlmUmVzdWx0LmFwcGVuZChmVHJ5Q2F0Y2hFbmQpOwotCQlqYXZhT2Zmc2V0ICs9IGZUcnlDYXRjaEVuZC5sZW5ndGgoKTsKLQotCQkvLyBmb290ZXIKLQkJZlJlc3VsdC5hcHBlbmQoZkZvb3Rlcik7Ci0JCWphdmFPZmZzZXQgKz0gZkZvb3Rlci5sZW5ndGgoKTsKLQotCQlmSmF2YTJKc3BSYW5nZXMucHV0QWxsKGZJbXBvcnRSYW5nZXMpOwotCQlmSmF2YTJKc3BSYW5nZXMucHV0QWxsKGZEZWNsYXJhdGlvblJhbmdlcyk7Ci0JCWZKYXZhMkpzcFJhbmdlcy5wdXRBbGwoZkNvZGVSYW5nZXMpOwotCQlmSmF2YTJKc3BSYW5nZXMucHV0QWxsKGZVc2VyRUxSYW5nZXMpOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGphdmFSYW5nZXMKLQkgKiBAcGFyYW0gb2Zmc2V0SW5KYXZhCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJhbmdlcyhIYXNoTWFwIHJhbmdlTWFwLCBpbnQgb2Zmc2V0SW5KYXZhKSB7Ci0JCS8vIGp1c3QgbmVlZCB0byB1cGRhdGUgamF2YSByYW5nZXMgdy8gdGhlIG9mZnNldCB3ZSBub3cga25vdwotCQlJdGVyYXRvciBpdCA9IHJhbmdlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpCi0JCQkoKFBvc2l0aW9uKSBpdC5uZXh0KCkpLm9mZnNldCArPSBvZmZzZXRJbkphdmE7Ci0JfQotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyAocG9zaXRpb25zKSBpbiBqYXZhIGRvY3VtZW50IHRvIHJhbmdlcyBpbiBqc3AgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIGphdmEgcG9zaXRpb25zIHRvIGpzcCBwb3NpdGlvbnMuCi0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SmF2YTJKc3BSYW5nZXMoKSB7Ci0JCXJldHVybiBmSmF2YTJKc3BSYW5nZXM7Ci0JfQotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBqc3AgZG9jdW1lbnQgdG8gcmFuZ2VzIGluIGphdmEgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBqc3AgcG9zaXRpb25zIHRvIGphdmEgcG9zaXRpb25zLCBvciBudWxsIGlmIG5vCi0JICogICAgICAgICB0cmFuc2xhdGlvbiBoYXMgb2NjdXJlZCB5ZXQgKHRoZSBtYXAgaGFzbid0IGJlZW4gYnVpbHQpLgotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldEpzcDJKYXZhUmFuZ2VzKCkgewotCQlpZiAoZkphdmEySnNwUmFuZ2VzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSGFzaE1hcCBmbGlwRmxvcHBlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUl0ZXJhdG9yIGtleXMgPSBmSmF2YTJKc3BSYW5nZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0IHJhbmdlID0gbnVsbDsKLQkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0JCQlyYW5nZSA9IGtleXMubmV4dCgpOwotCQkJZmxpcEZsb3BwZWQucHV0KGZKYXZhMkpzcFJhbmdlcy5nZXQocmFuZ2UpLCByYW5nZSk7Ci0JCX0KLQkJcmV0dXJuIGZsaXBGbG9wcGVkOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwSW1wb3J0UmFuZ2VzKCkgewotCQlyZXR1cm4gZkltcG9ydFJhbmdlczsKLQl9Ci0KLQlwdWJsaWMgSGFzaE1hcCBnZXRKYXZhMkpzcFVzZUJlYW5SYW5nZXMoKSB7Ci0JCXJldHVybiBmVXNlQmVhblJhbmdlczsKLQl9Ci0KLQlwdWJsaWMgSGFzaE1hcCBnZXRKYXZhMkpzcEluZGlyZWN0UmFuZ2VzKCkgewotCQlyZXR1cm4gZkluZGlyZWN0UmFuZ2VzOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdG8gdGhlIGpzcDwtPmphdmEgbWFwIGJ5IGRlZmF1bHQKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGEgY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgaW1wb3J0cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEltcG9ydHMoU3RyaW5nIHZhbHVlKSB7Ci0JCWFkZEltcG9ydHModmFsdWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFBhc3MgaW4gYSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBpbXBvcnQgdmFsdWVzLCBhcHBlbmRzIGVhY2ggdG8gdGhlCi0JICogZmluYWwgcmVzdWx0IGJ1ZmZlcgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBpbXBvcnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wb3J0cyhTdHJpbmcgdmFsdWUsIGJvb2xlYW4gYWRkVG9NYXApIHsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgxNjg3Ci0JCS8vIGFkZGVkIHRoZSAiYWRkVG9NYXAiIHBhcmFtZXRlciB0byBleGNsdWRlIGltcG9ydHMgb3JpZ2luYXRpbmcKLQkJLy8gZnJvbSBpbmNsdWRlZCBKU1AgZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGpzcDwtPmphdmEgbWFwcGluZwotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdG9rID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gU3RyaW5nIGFwcGVuZGFnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXRvayA9IHN0Lm5leHRUb2tlbigpOwotCQkJYXBwZW5kSW1wb3J0VG9CdWZmZXIodG9rLCBmQ3VycmVudE5vZGUsIGFkZFRvTWFwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIC8qIGtlZXAgdHJhY2sgb2YgY3Vyc29yIHBvc2l0aW9uIGluc2lkZSB0aGUgYnVmZmVyIC8qIGFwcGVuZHMgYnVmZmVyIHRvCi0JICogdGhlIGZpbmFsIHJlc3VsdCBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmQoU3RyaW5nQnVmZmVyIGJ1ZikgewotCQlpZiAoZ2V0Q3Vyc29yT3duZXIoKSA9PSBidWYpIHsKLQkJCWZDdXJzb3JQb3NpdGlvbiA9IGZSZXN1bHQubGVuZ3RoKCkgKyBnZXRSZWxhdGl2ZU9mZnNldCgpOwotCQl9Ci0JCWZSZXN1bHQuYXBwZW5kKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHZhbGlkIGFmdGVyIGEgY29uZmlndXJlKC4uLiksIHRyYW5zbGF0ZSguLi4pIG9yCi0JICogdHJhbnNsYXRlRnJvbUZpbGUoLi4uKSBjYWxsCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCByZXN1bHQgKGphdmEgdHJhbnNsYXRpb24pIGJ1ZmZlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZ2V0VHJhbnNsYXRpb24oKSB7Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTdHJpbmdCdWZmZXIgZGVidWdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl0cnkgewotCQkJCUl0ZXJhdG9yIGl0ID0gZkphdmEySnNwUmFuZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlQb3NpdGlvbiBqYXZhID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiSmF2YSByYW5nZTpbIiArIGphdmEub2Zmc2V0ICsgIjoiICsgamF2YS5sZW5ndGggKyAiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiWyIgKyBmUmVzdWx0LnRvU3RyaW5nKCkuc3Vic3RyaW5nKGphdmEub2Zmc2V0LCBqYXZhLm9mZnNldCArIGphdmEubGVuZ3RoKSArICJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgifG1hcHMgdG8uLi58XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlQb3NpdGlvbiBqc3AgPSAoUG9zaXRpb24pIGZKYXZhMkpzcFJhbmdlcy5nZXQoamF2YSk7Ci0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiSlNQIHJhbmdlOlsiICsganNwLm9mZnNldCArICI6IiArIGpzcC5sZW5ndGggKyAiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiWyIgKyBmSnNwVGV4dEJ1ZmZlci50b1N0cmluZygpLnN1YnN0cmluZyhqc3Aub2Zmc2V0LCBqc3Aub2Zmc2V0ICsganNwLmxlbmd0aCkgKyAiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSlNQVHJhbnNsYXRpb24gZXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgZGVidWdTdHJpbmcudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZlJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRUcmFuc2xhdGlvblByb2JsZW1zKCkgewotCQlyZXR1cm4gZlRyYW5zbGF0aW9uUHJvYmxlbXM7Ci0JfQotCi0JLyoqCi0JICogT25seSB2YWxpZCBhZnRlciBhIGNvbmZpZ3VyZSguLi4pLCB0cmFuc2xhdGUoLi4uKSBvcgotCSAqIHRyYW5zbGF0ZUZyb21GaWxlKC4uLikgY2FsbAotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgaW4gdGhlIEpTUCBmaWxlCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRKc3BUZXh0KCkgewotCQlyZXR1cm4gZkpzcFRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNlcnZlci1zaWRlIHNjcmlwdGluZyB2YXJpYWJsZXMgdXNlZCBieSB0aGlzIHRhZywgYWxvbmcgd2l0aAotCSAqIGFueSBzY29waW5nLgotCSAqIAotCSAqIEBwYXJhbSB0YWdUb0FkZAotCSAqIEBwYXJhbSBjdXN0b21UYWcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdsaWJWYXJpYWJsZXMoU3RyaW5nIHRhZ1RvQWRkLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY3VzdG9tVGFnKSB7Ci0JCUlGaWxlIGYgPSBnZXRGaWxlKCk7Ci0KLQkJaWYgKGYgPT0gbnVsbCB8fCAhZi5leGlzdHMoKSkKLQkJCXJldHVybjsKLQotCQlUYWdsaWJIZWxwZXIgaGVscGVyID0gVGFnbGliSGVscGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFRhZ2xpYkhlbHBlcihmKTsKLQkJU3RyaW5nIGRlY2wgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY3VzdG9tVGFnLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikpIHsKLQkJCS8qCi0JCQkgKiBTdGFydCB0YWcKLQkJCSAqLwotCQkJVGFnbGliVmFyaWFibGVbXSB0YWdsaWJWYXJzID0gaGVscGVyLmdldFRhZ2xpYlZhcmlhYmxlcyh0YWdUb0FkZCwgZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIGN1c3RvbVRhZyk7Ci0JCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5hZGRBbGwoaGVscGVyLmdldFByb2JsZW1zKGYuZ2V0RnVsbFBhdGgoKSkpOwotCQkJLyoKLQkJCSAqIEFkZCBBVF9CRUdJTiB2YXJpYWJsZXMKLQkJCSAqLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdsaWJWYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHRhZ2xpYlZhcnNbaV0uZ2V0U2NvcGUoKSA9PSBWYXJpYWJsZUluZm8uQVRfQkVHSU4pIHsKLQkJCQkJZGVjbCA9IHRhZ2xpYlZhcnNbaV0uZ2V0RGVjbGFyYXRpb25TdHJpbmcoKTsKLQkJCQkJYXBwZW5kVG9CdWZmZXIoZGVjbCwgZlVzZXJDb2RlLCBmYWxzZSwgY3VzdG9tVGFnKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKgotCQkJICogQWRkIGEgc2luZ2xlICB7IHRvIGxpbWl0IHRoZSBzY29wZSBvZiBORVNURUQgdmFyaWFibGVzCi0JCQkgKi8KLQkJCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJdGV4dC5hcHBlbmQoInsgLy8gPCIpOyAvLyROT04tTkxTLTEkCi0JCQl0ZXh0LmFwcGVuZCh0YWdUb0FkZCk7Ci0JCQlpZiAoY3VzdG9tVGFnLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkpIHsKLQkJCQl0ZXh0LmFwcGVuZCgiLz5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0ZXh0LmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWFwcGVuZFRvQnVmZmVyKHRleHQudG9TdHJpbmcoKSwgZlVzZXJDb2RlLCBmYWxzZSwgY3VzdG9tVGFnKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ2xpYlZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodGFnbGliVmFyc1tpXS5nZXRTY29wZSgpID09IFZhcmlhYmxlSW5mby5ORVNURUQpIHsKLQkJCQkJZGVjbCA9IHRhZ2xpYlZhcnNbaV0uZ2V0RGVjbGFyYXRpb25TdHJpbmcoKTsKLQkJCQkJYXBwZW5kVG9CdWZmZXIoZGVjbCwgZlVzZXJDb2RlLCBmYWxzZSwgY3VzdG9tVGFnKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKgotCQkJICogRm9yIGVtcHR5IHRhZ3MsIGFkZCB0aGUgY29ycmVzcG9uZGluZyB9IGFuZCBBVF9FTkQgdmFyaWFibGVzIGltbWVkaWF0ZWx5LiAgCi0JCQkgKi8KLQkJCWlmIChjdXN0b21UYWcuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJCXRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJdGV4dC5hcHBlbmQoIn0gLy8gPCIpOyAvLyROT04tTkxTLTEkCi0JCQkJdGV4dC5hcHBlbmQodGFnVG9BZGQpOwotCQkJCWlmIChjdXN0b21UYWcuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJCQl0ZXh0LmFwcGVuZCgiLz5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0ZXh0LmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYXBwZW5kVG9CdWZmZXIodGV4dC50b1N0cmluZygpLCBmVXNlckNvZGUsIGZhbHNlLCBjdXN0b21UYWcpOyAvLyROT04tTkxTLTEkCi0JCQkJLyogVHJlYXQgdGhpcyBhcyB0aGUgZW5kIGZvciBlbXB0eSB0YWdzICovCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdsaWJWYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLkFUX0VORCkgewotCQkJCQkJZGVjbCA9IHRhZ2xpYlZhcnNbaV0uZ2V0RGVjbGFyYXRpb25TdHJpbmcoKTsKLQkJCQkJCWFwcGVuZFRvQnVmZmVyKGRlY2wsIGZVc2VyQ29kZSwgZmFsc2UsIGN1c3RvbVRhZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKgotCQkJCSAqIEZvciBub24tZW1wdHkgdGFncywgcmVtZW1iZXIgdGhlIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0JCQkJICovCi0JCQkJZlRhZ1RvVmFyaWFibGVNYXAucHVzaCh0YWdUb0FkZCwgbmV3IFJlZ2lvblRhZ2xpYlZhcmlhYmxlcyhjdXN0b21UYWcsIHRhZ2xpYlZhcnMpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjdXN0b21UYWcuZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikpIHsKLQkJCS8qCi0JCQkgKiBFbmQgdGFnCi0JCQkgKi8KLQkJCVJlZ2lvblRhZ2xpYlZhcmlhYmxlcyByZWdpb25BbmRUYWdsaWJWYXJzID0gKFJlZ2lvblRhZ2xpYlZhcmlhYmxlcykgZlRhZ1RvVmFyaWFibGVNYXAucG9wKHRhZ1RvQWRkKTsKLQkJCWlmIChyZWdpb25BbmRUYWdsaWJWYXJzICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIEV2ZW4gYW4gZW1wdHkgYXJyYXkgb2YgdmFyaWFibGVzIHdpbGwgaW5kaWNhdGUgYSBuZWVkIGZvciBhCi0JCQkJICogY2xvc2luZyBicmFjZSwgc28gYWRkIG9uZS4gSWYgInJlZ2lvbkFuZFRhZ2xpYlZhcnMiIGlzCi0JCQkJICogbnVsbCwgdGhhdCBtZWFucyB0aGVyZSB3YXMgbm8gc3RhcnQgdGFnIGZvciB1c2Ugd2l0aCB0aGlzCi0JCQkJICogZW5kIHRhZy4gQWRkaW5nIGEgJ30nIGV2ZW4gdGhlbiB3b3VsZCBjYXVzZSBhIEphdmEKLQkJCQkgKiB0cmFuc2xhdGlvbiBmYXVsdCwgYnV0IHRoYXQncyBub3QgcGFydGljdWxhcmx5IGhlbHBmdWwgdG8gYQotCQkJCSAqIHVzZXIgd2hvIG1heSBvbmx5IGtub3cgaG93IHRvIHVzZSBjdXN0b20gdGFncy4gVWx0aW1hdGVseQotCQkJCSAqIHVuYmFsYW5jZWQgY3VzdG9tIHRhZ3Mgc2hvdWxkIGp1c3QgYmUgcmVwb3J0ZWQgYXMKLQkJCQkgKiB1bmJhbGFuY2VkIHRhZ3MuCi0JCQkJICovCi0JCQkJVGFnbGliVmFyaWFibGVbXSB0YWdsaWJWYXJzID0gcmVnaW9uQW5kVGFnbGliVmFycy52YXJpYWJsZXM7Ci0JCQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJdGV4dC5hcHBlbmQoIn0gLy8gPC8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRleHQuYXBwZW5kKHRhZ1RvQWRkKTsKLQkJCQlpZiAoY3VzdG9tVGFnLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkpIHsKLQkJCQkJdGV4dC5hcHBlbmQoIi8+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGV4dC5hcHBlbmQoIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWFwcGVuZFRvQnVmZmVyKHRleHQudG9TdHJpbmcoKSwgZlVzZXJDb2RlLCBmYWxzZSwgY3VzdG9tVGFnKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnbGliVmFycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAodGFnbGliVmFyc1tpXS5nZXRTY29wZSgpID09IFZhcmlhYmxlSW5mby5BVF9FTkQpIHsKLQkJCQkJCWRlY2wgPSB0YWdsaWJWYXJzW2ldLmdldERlY2xhcmF0aW9uU3RyaW5nKCk7Ci0JCQkJCQlhcHBlbmRUb0J1ZmZlcihkZWNsLCBmVXNlckNvZGUsIGZhbHNlLCBjdXN0b21UYWcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBTaW5jZSBzb21ldGhpbmcgc2hvdWxkIGhhdmUgYmVlbiBpbiB0aGUgbWFwIGJlY2F1c2Ugb2YgYQotCQkJCSAqIHN0YXJ0IHRhZywgaXRzIGFic2VuY2Ugbm93IG1lYW5zIGFuIHVuYmFsYW5jZWQgZW5kIHRhZy4KLQkJCQkgKiBFeHRyYXMgd2lsbCBiZSBjaGVja2VkIGxhdGVyIHRvIGZsYWcgdW5iYWxhbmNlZCBzdGFydCB0YWdzLgotCQkJCSAqLwotCQkJCUlKU1BQcm9ibGVtIG1pc3NpbmdTdGFydFRhZyA9IGNyZWF0ZUpTUFByb2JsZW0oSUpTUFByb2JsZW0uU3RhcnRDdXN0b21UYWdNaXNzaW5nLCBJSlNQUHJvYmxlbS5GX1BST0JMRU1fSURfTElURVJBTCwgIiIsIGN1c3RvbVRhZy5nZXRTdGFydE9mZnNldCgpLCBjdXN0b21UYWcuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCWZUcmFuc2xhdGlvblByb2JsZW1zLmFkZChtaXNzaW5nU3RhcnRUYWcpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKCkgewotCQlJRmlsZSBmID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJdHJ5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKHNNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCWYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQkJfQotCQkJCWlmIChmICE9IG51bGwgJiYgZi5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlyZXR1cm4gZjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHVzZWQgYnkgaW5uZXIgaGVscGVyIGNsYXNzIChYTUxKU1BSZWdpb25IZWxwZXIsIEpTUEluY2x1ZGVSZWdpb25IZWxwZXIpCi0JICovCi0JcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCQlpZiAoZkJsb2NrTWFya2VycyA9PSBudWxsKQotCQkJZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci0JfQotCi0JLyoqCi0JICogLyogdGhlIG1haW4gY29udHJvbCBsb29wIGZvciB0cmFuc2xhdGluZyB0aGUgZG9jdW1lbnQsIGRyaXZlbiBieSB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgbm9kZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGUoKSB7Ci0JCWlmIChmVGFnVG9WYXJpYWJsZU1hcCA9PSBudWxsKSB7Ci0JCQlmVGFnVG9WYXJpYWJsZU1hcCA9IG5ldyBTdGFja01hcCgpOwotCQl9Ci0JCWZUcmFuc2xhdGlvblByb2JsZW1zLmNsZWFyKCk7Ci0KLQkJc2V0Q3VycmVudE5vZGUobmV3IFplcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZlN0cnVjdHVyZWREb2N1bWVudCwgMCkpOwotCQl0cmFuc2xhdGVQcmVsdWRlcygpOwotCi0JCXNldEN1cnJlbnROb2RlKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0KLQkJd2hpbGUgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCAmJiAhaXNDYW5jZWxlZCgpKSB7Ci0KLQkJCS8vIGludGVyY2VwdCBIVE1MIGNvbW1lbnQgZmxhdCBub2RlCi0JCQkvLyBhbHNvIGhhbmRsZXMgVU5ERUZJTkVEICh3aGljaCBpcyB3aGF0IENEQVRBIGNvbWVzIGluIGFzKQotCQkJLy8gYmFzaWNhbGx5IHRoaXMgcGFydCB3aWxsIGhhbmRsZSBhbnkgImVtYmVkZGVkIiBKU1AgY29udGFpbmVycwotCQkJaWYgKGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCBnZXRDdXJyZW50Tm9kZSgpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJdHJhbnNsYXRlWE1MQ29tbWVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCByZWdpb24gaW4gdGhlIGZsYXQgbm9kZQotCQkJCXRyYW5zbGF0ZVJlZ2lvbkNvbnRhaW5lcihnZXRDdXJyZW50Tm9kZSgpLCBTVEFOREFSRF9KU1ApOwotCQkJfQotCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkKLQkJCQlhZHZhbmNlTmV4dE5vZGUoKTsKLQkJfQotCi0JCXNldEN1cnJlbnROb2RlKG5ldyBaZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpKTsKLQkJdHJhbnNsYXRlQ29kYXMoKTsKLQotCQkvKgotCQkgKiBBbnkgY29udGVudHMgbGVmdCBpbiB0aGUgbWFwIGluZGljYXRlIHN0YXJ0IHRhZ3MgdGhhdCBuZXZlciBoYWQgZW5kCi0JCSAqIHRhZ3MuIFdoaWxlIHRoZSAneycgdGhhdCBpcyBwcmVzZW50IHdpdGhvdXQgdGhlIG1hdGNoaW5nICd9JyBzaG91bGQKLQkJICogY2F1c2UgYSBKYXZhIHRyYW5zbGF0aW9uIGZhdWx0LCB0aGF0J3Mgbm90IHBhcnRpY3VsYXJseSBoZWxwZnVsIHRvCi0JCSAqIGEgdXNlciB3aG8gbWF5IG9ubHkga25vdyBob3cgdG8gdXNlIGN1c3RvbSB0YWdzIGFzIHRhZ3MuIFVsdGltYXRlbHkKLQkJICogdW5iYWxhbmNlZCBjdXN0b20gdGFncyBzaG91bGQganVzdCBiZSByZXBvcnRlZCBhcyB1bmJhbGFuY2VkIHRhZ3MsCi0JCSAqIGFuZCB1bmJhbGFuY2VkICd7Jy8nfScgb25seSByZXBvcnRlZCB3aGVuIHRoZSB1c2VyIGFjdHVhbGx5Ci0JCSAqIHVuYmFsYW5jZWQgdGhlbSB3aXRoIHNjcmlwdGxldHMuCi0JCSAqLwotCQlJdGVyYXRvciByZWdpb25BbmRUYWdsaWJWYXJpYWJsZXMgPSBmVGFnVG9WYXJpYWJsZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9uQW5kVGFnbGliVmFyaWFibGVzLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIGV4dHJhU3RhcnRSZWdpb24gPSAoKFJlZ2lvblRhZ2xpYlZhcmlhYmxlcykgcmVnaW9uQW5kVGFnbGliVmFyaWFibGVzLm5leHQoKSkucmVnaW9uOwotCQkJSUpTUFByb2JsZW0gbWlzc2luZ0VuZFRhZyA9IGNyZWF0ZUpTUFByb2JsZW0oSUpTUFByb2JsZW0uRW5kQ3VzdG9tVGFnTWlzc2luZywgSUpTUFByb2JsZW0uRl9QUk9CTEVNX0lEX0xJVEVSQUwsICIiLCBleHRyYVN0YXJ0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGV4dHJhU3RhcnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpOwotCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkKG1pc3NpbmdFbmRUYWcpOwotCi0JCQlhcHBlbmRUb0J1ZmZlcigifSIsIGZVc2VyQ29kZSwgZmFsc2UsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJfQotCQlmVGFnVG9WYXJpYWJsZU1hcC5jbGVhcigpOwotCi0JCWJ1aWxkUmVzdWx0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwgSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGNoYXJzZXQpIHsKLQkJUmVhZGVyIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb250ZW50U3RyZWFtLCBjaGFyc2V0KSwgMjA0OCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMDQ4KTsKLQkJCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbMjA0OF07Ci0JCQlpbnQgbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCW4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQkJZG9jdW1lbnQuc2V0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWZDbGFzc0hlYWRlciA9ICJwdWJsaWMgY2xhc3MgX0pTUFNlcnZsZXQgZXh0ZW5kcyAiOyAvLyROT04tTkxTLTEkCi0JCWZDbGFzc25hbWUgPSAiX0pTUFNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0KLQkJZkltcGxpY2l0SW1wb3J0cyA9ICJpbXBvcnQgamF2YXguc2VydmxldC4qOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLio7IiArIEVOREwgKyBFTkRMOyAvLyROT04tTkxTLTEkCi0KLQkJZlNlcnZpY2VIZWFkZXIgPSAicHVibGljIHZvaWQgX2pzcFNlcnZpY2UoamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCIgKyAvLyROT04tTkxTLTEkCi0JCQkJCSIgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJcdFx0dGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbiB7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dCBwYWdlQ29udGV4dCA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZyBjb25maWcgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJImphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlciBvdXQgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiT2JqZWN0IHBhZ2UgPSBudWxsOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkCi0JCWZTdXBlcmNsYXNzID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zbGF0b3IncyBwcm9ncnNzIG1vbml0b3IsIGZhbHNlIGlmIHRoZQotCSAqICAgICAgICAgbW9uaXRvciBpcyBudWxsCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCXJldHVybiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsKSA/IGZhbHNlIDogZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkdmFuY2VOZXh0Tm9kZSgpIHsKLQkJc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpOwotCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKQotCQkJc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKSB7Ci0JCWlmIChpc0pTUChnZXRDdXJyZW50Tm9kZSgpLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpKSkgewotCQkJSXRlcmF0b3IgaXQgPSBnZXRDdXJyZW50Tm9kZSgpLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJciA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKQotCQkJCQlicmVhazsKLQkJCQllbHNlIGlmIChyLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpCi0JCQkJCWJyZWFrOwotCQkJCWVsc2UgaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dChyKS50cmltKCkuZXF1YWxzKCJpbXBvcnQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgYSByZWdpb24gY29udGFpbmVyIChhbmQgWE1MIEpTUCBjb250YWluZXIsIG9yIDwlIEpTUAotCSAqIGNvbnRhaW5lcikKLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhpcyBjbGFzcyBhbmQgZm9yIGNvbnRhaW5lcnMgaW4KLQkgKiB0aGUgcHJpbWFyeSBzdHJ1Y3R1cmVkIGRvY3VtZW50IGFzIGFsbCBidWZmZXIgYXBwZW5kcyB3aWxsIGJlIGRpcmVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVJlZ2lvbkNvbnRhaW5lcihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyLCBpbnQgSlNQVHlwZSkgewotCi0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24gPSBjb250YWluZXI7Ci0KLQkJSXRlcmF0b3IgcmVnaW9ucyA9IGNvbnRhaW5lclJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0KLQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0KLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQotCQkJLy8gY29udGVudCBhc3Npc3Qgd2FzIG5vdCBzaG93aW5nIHVwIGluIEpTUCBpbnNpZGUgYSBqYXZhc2NyaXB0Ci0JCQkvLyByZWdpb24KLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCS8vIGNoZWNrIGlmIGl0J3MgbmVzdGVkIGpzcCBpbiBhIHNjcmlwdCB0YWcuLi4KLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJLy8gcGFzcyBpbiBibG9jayB0ZXh0J3MgY29udGFpbmVyICYgaXRlcmF0b3IKLQkJCQkJSXRlcmF0b3IgcmVnaW9uSXRlcmF0b3IgPSAoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uKS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQkJdHJhbnNsYXRlSlNQTm9kZShyZWdpb24sIHJlZ2lvbkl0ZXJhdG9yLCB0eXBlLCBFTUJFRERFRF9KU1ApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLyoqCi0JCQkJCSAqIExJTUlUQVRJT04gLSBOb3JtYWxseSB0aGUgc2NyaXB0IGNvbnRlbnQgd2l0aGluIGEKLQkJCQkJICogc2NyaXB0IHRhZyBpcyBhIHNpbmdsZSBkb2N1bWVudCByZWdpb24gd2l0aCBhIHNpbmdsZQotCQkJCQkgKiBCTE9DS19URVhUIHRleHQgcmVnaW9uIHdpdGhpbiBpdC4gQW55IEpTUCBzY3JpcHRpbmcKLQkJCQkJICogd2lsbCBiZSB3aXRoaW4gaXRzIG93biByZWdpb24gY29udGFpbmVyIChmb3IgdGhlIHNha2UKLQkJCQkJICogb2Yga2VlcGluZyB0aGUgc2NyaXB0aW5nIG9wZW4vY29udGVudC9lbmQgYXMgYSBncm91cCkKLQkJCQkJICogYWxzbyBvZiBCTE9DS19URVhULiBUaGF0IGlnbm9yZXMgY3VzdG9tIHRhZ3MgdGhhdCBtaWdodAotCQkJCQkgKiBiZSBpbiB0aGVyZSwgdGhvdWdoLCBhcyB0aGV5IHJlcXVpcmUgcHJvcGVyIHNjb3BpbmcgYW5kCi0JCQkJCSAqIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHRvIGJlIHBlcmZvcm1lZCBldmVuIHRob3VnaAotCQkJCQkgKiB0aGV5J3JlIG5vdCBwcm9wZXIgbm9kZXMgaW4gdGhlIERPTS4gVGhlIG9ubHkgd2F5IHRvCi0JCQkJCSAqIHJlYWxseSBkbyB0aGlzIGlzIHRvIHRyZWF0IHRoZSBlbnRpcmUgc2NyaXB0IGNvbnRlbnQgYXMKLQkJCQkJICogSlNQIGNvbnRlbnQgb24gaXRzIG93biwgYWtpbiB0byBhbiBpbmNsdWRlZCBzZWdtZW50LgotCQkJCQkgKiBGdXJ0aGVyIGNvbXBsaWNhdGluZyB0aGlzIHNvbHV0aW9uIGlzIHRoYXQgdGFnZGVwZW5kZW50Ci0JCQkJCSAqIGN1c3RvbSB0YWdzIGhhdmUgdGhlaXIgY29tbWVudCBtYXJrZWQgYXMgQkxPQ0tfVEVYVCBhcwotCQkJCQkgKiB3ZWxsLCBzbyB0aGVyZSdzIG5vIGNsZWFyIHdheSB0byB0ZWxsIHRoZSB0d28gY2FzZXMKLQkJCQkJICogYXBhcnQuCi0JCQkJCSAqLwotCi0JCQkJCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCQkJCS8vIFRISVMgRU1CRURERUQgSlNQIFRFWFQgV0lMTCBDT01FIE9VVCBMQVRFUiBXSEVOCi0JCQkJCS8vIFBBUlRJVElPTklORyBIQVMKLQkJCQkJLy8gU1VQUE9SVCBGT1IgTkVTVEVEIFhNTC1KU1AKLQkJCQkJLy8gQ01WQyAyNDE4ODIKLQkJCQkJZGVjb2RlU2NyaXB0QmxvY2soY29udGFpbmVyUmVnaW9uLmdldEZ1bGxUZXh0KHJlZ2lvbiksIGNvbnRhaW5lclJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uICYmCi0JCQkvLyAoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uKS5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDApIHsKLQkJCS8vIHRyYW5zbGF0ZVJlZ2lvbkNvbnRhaW5lcigoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24sCi0JCQkvLyBFTUJFRERFRF9KU1ApOwotCQkJLy8gfQotCQkJaWYgKHR5cGUgIT0gbnVsbCAmJiBpc0pTUCh0eXBlKSkgLy8gPCUsIDwlPSwgPCUhLCA8JUAKLQkJCXsKLQkJCQkvLyB0cmFuc2xhdGVKU1BOb2RlKHJlZ2lvbiwgcmVnaW9ucywgdHlwZSwgSlNQVHlwZSk7Ci0JCQkJdHJhbnNsYXRlSlNQTm9kZShjb250YWluZXJSZWdpb24sIHJlZ2lvbnMsIHR5cGUsIEpTUFR5cGUpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSAhPSBudWxsICYmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSkgewotCQkJCXRyYW5zbGF0ZVhNTE5vZGUoY29udGFpbmVyUmVnaW9uLCByZWdpb25zKTsKLQkJCX0KLQkJfQotCQkvLyB9Ci0JfQotCi0JLyoKLQkgKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICoqCi0JICogVEVNUCBXT1JLQVJPVU5EIEZPUiBDTVZDIDI0MTg4MiBUYWtlcyBhIFN0cmluZyBhbmQgYmxvY2tzIG91dAotCSAqIGpzcDpzY3JpcHRsZXQsIGpzcDpleHByZXNzaW9uLCBhbmQganNwOmRlY2xhcmF0aW9uIEBwYXJhbSBibG9ja1RleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVNjcmlwdEJsb2NrKFN0cmluZyBibG9ja1RleHQsIGludCBzdGFydE9mQmxvY2spIHsKLQkJWE1MSlNQUmVnaW9uSGVscGVyIGhlbHBlciA9IG5ldyBYTUxKU1BSZWdpb25IZWxwZXIodGhpcywgZmFsc2UpOwotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6c2NyaXB0bGV0IiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmV4cHJlc3Npb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGVjbGFyYXRpb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCWhlbHBlci5yZXNldChibG9ja1RleHQsIHN0YXJ0T2ZCbG9jayk7Ci0JCS8vIGZvcmNlIHBhcnNlCi0JCWhlbHBlci5mb3JjZVBhcnNlKCk7Ci0JfQotCi0JLyoKLQkgKiByZXR1cm5zIHN0cmluZyBtaW51cyBDREFUQSBvcGVuIGFuZCBjbG9zZSB0ZXh0Ci0JICovCi0JZmluYWwgcHVibGljIFN0cmluZyBzdHJpcENEQVRBKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyByZXN1bHRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENEQVRBX09QRU4gPSAiPCFbQ0RBVEFbIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQ0RBVEFfQ0xPU0UgPSAiXV0+IjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgZW5kID0gdGV4dC5sZW5ndGgoKTsKLQkJd2hpbGUgKHN0YXJ0IDwgdGV4dC5sZW5ndGgoKSkgewotCQkJaWYgKHRleHQuaW5kZXhPZihDREFUQV9PUEVOLCBzdGFydCkgPiAtMSkgewotCQkJCWVuZCA9IHRleHQuaW5kZXhPZihDREFUQV9PUEVOLCBzdGFydCk7Ci0JCQkJcmVzdWx0VGV4dCArPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCQlzdGFydCA9IGVuZCArIENEQVRBX09QRU4ubGVuZ3RoKCk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmluZGV4T2YoQ0RBVEFfQ0xPU0UsIHN0YXJ0KSA+IC0xKSB7Ci0JCQkJZW5kID0gdGV4dC5pbmRleE9mKENEQVRBX0NMT1NFLCBzdGFydCk7Ci0JCQkJcmVzdWx0VGV4dCArPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCQlzdGFydCA9IGVuZCArIENEQVRBX0NMT1NFLmxlbmd0aCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZW5kID0gdGV4dC5sZW5ndGgoKTsKLQkJCQlyZXN1bHRUZXh0ICs9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRUZXh0OwotCX0KLQotCS8vIEVORCBPRiBXT1JLQVJPVU5EIENPREUuLi4KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLyoqCi0JICogZGV0ZXJtaW5lcyBpZiB0aGUgdHlwZSBpcyBhIHB1cmUgSlNQIHR5cGUgKG5vdCBYTUwpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1AoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9PUEVOKSAmJiB0eXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKTsKLQkJLy8gY2hlY2tpbmcgWE1MX1RBR19PUEVOIHNvIDxqc3A6ZGlyZWN0aXZlLnh4eC8+IGdldHMgdHJlYXRlZCBsaWtlCi0JCS8vIG90aGVyIFhNTCBqc3AgdGFncwotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgdGhlIHZhcmlvdXMgWE1MSlNQIHR5cGUgbm9kZXMKLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9ucwotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbnMgb2YgdGhlIFhNTE5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVYTUxOb2RlKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXIsIEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJLy8gY29udGVudHMgbXVzdCBiZSB2YWxpZCBYSFRNTCwgdHJhbnNsYXRlIGVzY2FwZWQgQ0RBVEEgaW50byB3aGF0IGl0Ci0JCS8vIHJlYWxseSBpcy4uLgotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCS8vIDxqc3A6ZGlyZWN0aXZlLnh4eCA+IGNvbWVzIGluIGFzIHRoaXMKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCByLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpCi0KLQkJCXsKLQkJCQlTdHJpbmcgZnVsbFRhZ05hbWUgPSBjb250YWluZXIuZ2V0VGV4dChyKTsKLQkJCQlpZiAoZnVsbFRhZ05hbWUuaW5kZXhPZignOicpID4gLTEgJiYgIWZ1bGxUYWdOYW1lLnN0YXJ0c1dpdGgoSlNQX1BSRUZJWCkpIHsKLQkJCQkJYWRkVGFnbGliVmFyaWFibGVzKGZ1bGxUYWdOYW1lLCBjb250YWluZXIpOyAvLyBpdAotCQkJCQkvLyBtYXkKLQkJCQkJLy8gYmUgYQotCQkJCQkvLyBjdXN0b20KLQkJCQkJLy8gdGFnCi0JCQkJfQotCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZnVsbFRhZ05hbWUsICI6LiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkgJiYgc3QubmV4dFRva2VuKCkuZXF1YWxzKCJqc3AiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJU3RyaW5nIGpzcFRhZ05hbWUgPSBzdC5uZXh0VG9rZW4oKTsKLQotCQkJCQkJaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJzY3JpcHRsZXQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCXRyYW5zbGF0ZVhNTEpTUENvbnRlbnQoU0NSSVBUTEVUKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJleHByZXNzaW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQl0cmFuc2xhdGVYTUxKU1BDb250ZW50KEVYUFJFU1NJT04pOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoanNwVGFnTmFtZS5lcXVhbHMoImRlY2xhcmF0aW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQl0cmFuc2xhdGVYTUxKU1BDb250ZW50KERFQ0xBUkFUSU9OKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJkaXJlY3RpdmUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQkJU3RyaW5nIGRpcmVjdGl2ZU5hbWUgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJ0YWdsaWIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl3aGlsZSAociAhPSBudWxsICYmIHJlZ2lvbnMuaGFzTmV4dCgpICYmICFyLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJCQkJCQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCQkJCQkJCWlmIChjb250YWluZXIuZ2V0VGV4dChyKS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BSRUZJWCkpIHsKLQkJCQkJCQkJCQkJU3RyaW5nIHByZWZpeCA9IGdldEF0dHJpYnV0ZVZhbHVlKHIsIHJlZ2lvbnMpOwotCQkJCQkJCQkJCQlpZiAocHJlZml4ICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCWhhbmRsZVRhZ2xpYihwcmVmaXgpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQkJCQlTdHJpbmcgZmlsZUxvY2F0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCQkJLy8gc2tpcCB0byByZXF1aXJlZCAiZmlsZSIgYXR0cmlidXRlLAotCQkJCQkJCQkJLy8gc2hvdWxkIGJlIHNhZmUgYmVjYXVzZQotCQkJCQkJCQkJLy8gImZpbGUiIGlzIHRoZSBvbmx5IGF0dHJpYnV0ZSBmb3IgdGhlCi0JCQkJCQkJCQkvLyBpbmNsdWRlIGRpcmVjdGl2ZQotCQkJCQkJCQkJd2hpbGUgKHIgIT0gbnVsbCAmJiByZWdpb25zLmhhc05leHQoKSAmJiAhci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQkJCQkJCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWZpbGVMb2NhdGlvbiA9IGdldEF0dHJpYnV0ZVZhbHVlKHIsIHJlZ2lvbnMpOwotCQkJCQkJCQkJaWYgKGZpbGVMb2NhdGlvbiAhPSBudWxsKQotCQkJCQkJCQkJCWhhbmRsZUluY2x1ZGVGaWxlKGZpbGVMb2NhdGlvbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoInBhZ2UiKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCQkJCS8vIGJhZCBpZiBjdXJyZW50Tm9kZSBpcyByZWZlcmVuY2VkIGFmdGVyCi0JCQkJCQkJCQkvLyBoZXJlIHcvIHRoZSBjdXJyZW50IGxpc3QKLQkJCQkJCQkJCS8vIHNlZToKLQkJCQkJCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM1Ci0JCQkJCQkJCQkvLyBzZXRDdXJyZW50Tm9kZShnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKSk7Ci0JCQkJCQkJCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJLy8gJ3JlZ2lvbnMnIGNvbnRhaW4gdGhlIGF0dHJzCi0JCQkJCQkJCQkJdHJhbnNsYXRlUGFnZURpcmVjdGl2ZUF0dHJpYnV0ZXMocmVnaW9ucywgZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoInRhZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXRyYW5zbGF0ZVBhZ2VEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMsIGdldEN1cnJlbnROb2RlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJ2YXJpYWJsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXRyYW5zbGF0ZVZhcmlhYmxlRGlyZWN0aXZlQXR0cmlidXRlcyhyZWdpb25zKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIDxqc3A6aW5jbHVkZSBwYWdlPSJmaWxlbmFtZSIpIC8+Ci0JCQkJCQkJY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihyZWdpb25zLCAicGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZm9yd2FyZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljaGVja0F0dHJpYnV0ZVZhbHVlQ29udGFpbmVyKHJlZ2lvbnMsICJwYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJwYXJhbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljaGVja0F0dHJpYnV0ZVZhbHVlQ29udGFpbmVyKHJlZ2lvbnMsICJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygic2V0UHJvcGVydHkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihyZWdpb25zLCAidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoanNwVGFnTmFtZS5lcXVhbHMoInVzZUJlYW4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCWNoZWNrQXR0cmlidXRlVmFsdWVDb250YWluZXIocmVnaW9ucywgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMwMDQKLQkJCQkJCQkvLyBhZHZhbmNlTmV4dE5vZGUoKTsgLy8gZ2V0IHRoZSBjb250ZW50Ci0JCQkJCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCQkJCQl0cmFuc2xhdGVVc2VCZWFuKGNvbnRhaW5lcik7IC8vICdyZWdpb25zJwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGVja0FsbEF0dHJpYnV0ZVZhbHVlQ29udGFpbmVycyhyZWdpb25zKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0cmFuc2xhdGVzIGVtYmVkZGVkIGNvbnRhaW5lcnMgZm9yIEFMTCBhdHRyaWJ1dGUgdmFsdWVzCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tBbGxBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcnMoSXRlcmF0b3IgcmVnaW9ucykgewotCQkvLyB0YWcgbmFtZSBpcyBub3QganNwCi0JCS8vIGhhbmRsZSBlbWJlZGRlZCBqc3AgYXR0cmlidXRlcy4uLgotCQlJVGV4dFJlZ2lvbiBlbWJlZGRlZCA9IG51bGw7Ci0JCS8vIEl0ZXJhdG9yIGF0dHJSZWdpb25zID0gbnVsbDsKLQkJLy8gSVRleHRSZWdpb24gYXR0ckNodW5rID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQllbWJlZGRlZCA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoZW1iZWRkZWQgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCS8vIHBhcnNlIG91dCBjb250YWluZXIKLQotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzA2MDYKLQkJCQkvLyBmaXggZXhwb25lbnRpYWwgaXRlcmF0aW9uIHByb2JsZW0gdy8gZW1iZWRkZWQgZXhwcmVzc2lvbnMKLQkJCQl0cmFuc2xhdGVFbWJlZGRlZEpTUEluQXR0cmlidXRlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgZW1iZWRkZWQpOwotCQkJCS8vIGF0dHJSZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikKLQkJCQkvLyBlbWJlZGRlZCkuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJLy8gd2hpbGUgKGF0dHJSZWdpb25zLmhhc05leHQoKSkgewotCQkJCS8vIGF0dHJDaHVuayA9IChJVGV4dFJlZ2lvbikgYXR0clJlZ2lvbnMubmV4dCgpOwotCQkJCS8vIFN0cmluZyB0eXBlID0gYXR0ckNodW5rLmdldFR5cGUoKTsKLQkJCQkvLyAvLyBlbWJlZGRlZCBKU1AgaW4gYXR0cmlidXRlIHN1cHBvcnQgb25seSB3YW50IHRvCi0JCQkJLy8gLy8gdHJhbnNsYXRlIG9uZSB0aW1lIHBlcgotCQkJCS8vIC8vIGVtYmVkZGVkIHJlZ2lvbiBzbyB3ZSBvbmx5IHRyYW5zbGF0ZSBvbiB0aGUgSlNQIG9wZW4KLQkJCQkvLyAvLyB0YWdzIChub3QgY29udGVudCkKLQkJCQkvLyBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8Ci0JCQkJLy8gdHlwZSA9PQotCQkJCS8vIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCB0eXBlID09Ci0JCQkJLy8gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgdHlwZSA9PQotCQkJCS8vIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCB0eXBlID09Ci0JCQkJLy8gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4pIHsKLQkJCQkvLyAvLyBub3cgY2FsbCBqc3B0cmFuc2xhdGUKLQkJCQkvLyB0cmFuc2xhdGVFbWJlZGRlZEpTUEluQXR0cmlidXRlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikKLQkJCQkvLyBlbWJlZGRlZCk7Ci0JCQkJLy8gYnJlYWs7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgZW1iZWRkZWQgY29udGFpbmVyIGZvciBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihJdGVyYXRvciByZWdpb25zLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FICYmIGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKS5lcXVhbHMoYXR0ck5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBza2lwIHRvIGF0dHJpYnV0ZSB2YWx1ZQotCQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwpIHsKLQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gZm9yY2VzIGVtYmVkZGVkIHJlZ2lvbiB0byBiZSB0cmFuc2xhdGVkCi0JCQkJaWYgKHIgaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoKENvbnRleHRSZWdpb25Db250YWluZXIpIHIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogZXhhbXBsZToKLQkgKiAKLQkgKiA8anNwOnNjcmlwdGxldD5zY3JpcHRsZXQganNwLWphdmEgY29udGVudCA8IVtDREFUQVsgbW9yZSBqc3AgamF2YSBdXT4KLQkgKiBqc3AtamF2YSBjb250ZW50Li4uIDwhW0NEQVRBWyBtb3JlIGpzcCBqYXZhIF1dPiA8L2pzcDpzY3JpcHRsZXQ+Ci0JICogCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzMzY2Ci0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NTkwIHRyYW5zbGF0ZQotCSAqIGV2ZXJ5dGhpbmcgaW5iZXR3ZWVuIDxzY3JpcHRsZXQ+IHRhZ3MsIHdoaWNoIG1heSBiZSBtb3JlIHRoYW4gb25lCi0JICogcmVnaW9uIChlc3AuIENEQVRBKQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2xhdGVYTUxKU1BDb250ZW50KGludCB0eXBlKSB7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIgPSBnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKTsKLQkJaW50IHN0YXJ0ID0gc2RyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCVN0cmluZyBzZHJUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyByZWFkIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucyB1bnRpbAotCQkvLyA8L2pzcDpzY3JpcHRsZXQ+IG9yIEVPRgotCQl3aGlsZSAoc2RyICE9IG51bGwgJiYgc2RyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCi0JCQkvLyBzZXR1cCBmb3IgbmV4dCByZWdpb24KLQkJCXN0YXJ0ID0gc2RyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlzZHJUZXh0ID0gc2RyLmdldFRleHQoKTsKLQotCQkJaWYgKHNkci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCi0JCQkJLy8ganVzdCB0byBiZSBzYWZlLCBtYWtlIHN1cmUgQ0RBVEEgc3RhcnQgJiBlbmQgYXJlIHRoZXJlCi0JCQkJaWYgKHNkclRleHQuc3RhcnRzV2l0aCgiPCFbQ0RBVEFbIikgJiYgc2RyVGV4dC5lbmRzV2l0aCgiXV0+IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJc3RhcnQgPSBzZHIuZ2V0U3RhcnRPZmZzZXQoKSArIDk7IC8vIDwhW0NEQVRBWwotCQkJCQllbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCkgLSAzOyAvLyBdXT4KLQkJCQkJc2RyVGV4dCA9IHNkclRleHQuc3Vic3RyaW5nKDksIHNkclRleHQubGVuZ3RoKCkgLSAzKTsKLQkJCQkJd3JpdGVUb0J1ZmZlcih0eXBlLCBzZHJUZXh0LCBzdGFydCwgZW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQotCQkJCS8vIGhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlcwotCQkJCXNkclRleHQgPSBFc2NhcGVkVGV4dFV0aWwuZ2V0VW5lc2NhcGVkVGV4dChzZHJUZXh0KTsKLQkJCQllbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJd3JpdGVUb0J1ZmZlcih0eXBlLCBzZHJUZXh0LCBzdGFydCwgZW5kKTsKLQkJCX0KLQkJCXNkciA9IHNkci5nZXROZXh0KCk7Ci0JCX0KLQkJc2V0Q3VycmVudE5vZGUoc2RyKTsKLQkJc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVUb0J1ZmZlcihpbnQgdHlwZSwgU3RyaW5nIGNvbnRlbnQsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgU0NSSVBUTEVUIDoKLQkJCQl0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoY29udGVudCwgZ2V0Q3VycmVudE5vZGUoKSwganNwU3RhcnQsIGpzcEVuZCAtIGpzcFN0YXJ0LCBmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVYUFJFU1NJT04gOgotCQkJCXRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoY29udGVudCwgZ2V0Q3VycmVudE5vZGUoKSwganNwU3RhcnQsIGpzcEVuZCAtIGpzcFN0YXJ0LCBmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERFQ0xBUkFUSU9OIDoKLQkJCQl0cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhjb250ZW50LCBnZXRDdXJyZW50Tm9kZSgpLCBqc3BTdGFydCwganNwRW5kIC0ganNwU3RhcnQsIGZhbHNlKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdvZXMgdGhyb3VnaCBjb21tZW50IHJlZ2lvbnMsIGNoZWNrcyBpZiBhbnkgYXJlIGFuIGVtYmVkZGVkIEpTUAotCSAqIGNvbnRhaW5lciBpZiBpdCBmaW5kcyBvbmUsIGl0J3Mgc2VuZHMgdGhlIGNvbnRhaW5lciBpbnRvIHRoZQotCSAqIHRyYW5zbGF0aW9uIHJvdXRpbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVYTUxDb21tZW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSXRlcmF0b3IgaXQgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50UmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0ICE9IG51bGwgJiYgaXQuaGFzTmV4dCgpKSB7Ci0JCQljb21tZW50UmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQlpZiAoY29tbWVudFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJdHJhbnNsYXRlUmVnaW9uQ29udGFpbmVyKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY29tbWVudFJlZ2lvbiwgRU1CRURERURfSlNQKTsgLy8gaXQncwotCQkJCS8vIGVtYmVkZGVkCi0JCQkJLy8ganNwLi4uaXRlcmF0ZQotCQkJCS8vIHJlZ2lvbnMuLi4KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGRldGVybWluZXMgd2hpY2ggdHlwZSBvZiBKU1Agbm9kZSB0byB0cmFuc2xhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVKU1BOb2RlKElUZXh0UmVnaW9uIHJlZ2lvbiwgSXRlcmF0b3IgcmVnaW9ucywgU3RyaW5nIHR5cGUsIGludCBKU1BUeXBlKSB7Ci0JCWlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiAmJiByZWdpb25zICE9IG51bGwpIHsKLQkJCXRyYW5zbGF0ZURpcmVjdGl2ZShyZWdpb25zKTsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250ZW50UmVnaW9uID0gbnVsbDsKLQkJCWlmIChKU1BUeXBlID09IFNUQU5EQVJEX0pTUCAmJiAoc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpKSAhPSBudWxsKSB7Ci0JCQkJY29udGVudFJlZ2lvbiA9IGdldEN1cnJlbnROb2RlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChKU1BUeXBlID09IEVNQkVEREVEX0pTUCAmJiByZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQl0cmFuc2xhdGVFbWJlZGRlZEpTUEluQmxvY2soKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uLCByZWdpb25zKTsKLQkJCQkvLyBlbnN1cmUgdGhlIHJlc3Qgb2YgdGhpcyBtZXRob2Qgd29uJ3QgYmUgY2FsbGVkCi0JCQl9Ci0JCQlpZiAoY29udGVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgewotCQkJCQl0cmFuc2xhdGVFeHByZXNzaW9uKGNvbnRlbnRSZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQkJCXRyYW5zbGF0ZURlY2xhcmF0aW9uKGNvbnRlbnRSZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB7Ci0JCQkJCXRyYW5zbGF0ZVNjcmlwdGxldChjb250ZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIG9mIGFuIGF0dHJpYnV0ZSB3LyBubyByZWdpb24gPHAKLQkJCQkvLyBhbGlnbj0iPCUlPiI+Ci0JCQkJc2V0Q3Vyc29yT3duZXIoZ2V0SlNQVHlwZUZvclJlZ2lvbihyZWdpb24pKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZUVMKFN0cmluZyBlbFRleHQsIFN0cmluZyBkZWxpbSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSwgaW50IGNvbnRlbnRTdGFydCwgaW50IGNvbnRlbnRMZW5ndGgpIHsKLQkJSUpTUEVMVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gZ2V0RUxUcmFuc2xhdG9yKCk7Ci0JCWlmIChudWxsICE9IHRyYW5zbGF0b3IpIHsKLQkJCXRyYW5zbGF0b3IudHJhbnNsYXRlRUwoZWxUZXh0LCBkZWxpbSwgY3VycmVudE5vZGUsIGNvbnRlbnRTdGFydCwgY29udGVudExlbmd0aCwgZlVzZXJFTEV4cHJlc3Npb25zLCBmVXNlckVMUmFuZ2VzLCBmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc2NvdmVyIGFuZCBpbnN0YW50aWF0ZSBhbiBFTCB0cmFuc2xhdG9yLgotCSAqLwotCXB1YmxpYyBJSlNQRUxUcmFuc2xhdG9yIGdldEVMVHJhbnNsYXRvcigpIHsKLQkJaWYgKGZFTFRyYW5zbGF0b3IgPT0gbnVsbCkgewotCi0JCQkvKgotCQkJICogbmFtZSBvZiBwbHVnaW4gdGhhdCBleHBvc2VzIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0JCQkgKi8KLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSlNQX0NPUkVfUExVR0lOX0lELCBFTF9UUkFOU0xBVE9SX0VYVEVOU0lPTl9OQU1FKTsgLy8gLQotCQkJLy8gZXh0ZW5zaW9uCi0JCQkvLyBpZAotCi0JCQkvLyBJdGVyYXRlIG92ZXIgYWxsIGRlY2xhcmVkIGV4dGVuc2lvbnMgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuCi0JCQkvLyBBIHNpbmdsZSBwbHVnaW4gbWF5IGV4dGVuZCB0aGUgZXh0ZW5zaW9uIHBvaW50IG1vcmUgdGhhbiBvbmNlLAotCQkJLy8gYWx0aG91Z2ggaXQncyBub3QgcmVjb21tZW5kZWQuCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgYmVzdFRyYW5zbGF0b3IgPSBudWxsOwotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBjdXJFeHRlbnNpb24gPSAwOyBjdXJFeHRlbnNpb24gPCBleHRlbnNpb25zLmxlbmd0aDsgY3VyRXh0ZW5zaW9uKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbY3VyRXh0ZW5zaW9uXTsKLQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHRyYW5zbGF0b3JzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGN1clRyYW5zbGF0b3IgPSAwOyBjdXJUcmFuc2xhdG9yIDwgdHJhbnNsYXRvcnMubGVuZ3RoOyBjdXJUcmFuc2xhdG9yKyspIHsKLQotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxUcmFuc2xhdG9yID0gdHJhbnNsYXRvcnNbY3VyVHJhbnNsYXRvcl07Ci0KLQkJCQkJaWYgKCFFTF9UUkFOU0xBVE9SX0VYVEVOU0lPTl9OQU1FLmVxdWFscyhlbFRyYW5zbGF0b3IuZ2V0TmFtZSgpKSkgeyAvLyAtCi0JCQkJCQkvLyBuYW1lCi0JCQkJCQkvLyBvZgotCQkJCQkJLy8gY29uZmlnRWxlbWVudAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgaWRTdHJpbmcgPSBlbFRyYW5zbGF0b3IuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChudWxsICE9IGlkU3RyaW5nICYmIGlkU3RyaW5nLmVxdWFscyhmRUxUcmFuc2xhdG9ySUQpIHx8IChudWxsID09IGJlc3RUcmFuc2xhdG9yICYmIERFRkFVTFRfSlNQX0VMX1RSQU5TTEFUT1JfSUQuZXF1YWxzKGlkU3RyaW5nKSkpIHsKLQkJCQkJCWJlc3RUcmFuc2xhdG9yID0gZWxUcmFuc2xhdG9yOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobnVsbCAhPSBiZXN0VHJhbnNsYXRvcikgewotCQkJCXRyeSB7Ci0JCQkJCU9iamVjdCBleGVjRXh0ID0gYmVzdFRyYW5zbGF0b3IuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZXhlY0V4dCBpbnN0YW5jZW9mIElKU1BFTFRyYW5zbGF0b3IpIHsKLQkJCQkJCXJldHVybiBmRUxUcmFuc2xhdG9yID0gKElKU1BFTFRyYW5zbGF0b3IpIGV4ZWNFeHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZkVMVHJhbnNsYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBQYXNzIHRoZSBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gd2hpY2ggaXMgdGhlIGVtYmVkZGVkIHJlZ2lvbgotCSAqIAotCSAqIEBwYXJhbSByZWdpb25zCi0JICogICAgICAgICAgICBpdGVyYXRvciBmb3IgY29sbGVjdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2xhdGVFbWJlZGRlZEpTUEluQmxvY2soSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbGxlY3Rpb24sIEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJaWYgKGlzSlNQKHJlZ2lvbi5nZXRUeXBlKCkpKQotCQkJCWJyZWFrOwotCQkJcmVnaW9uID0gbnVsbDsKLQkJfQotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoY29sbGVjdGlvbik7Ci0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI2Mzc3Ci0JCQkvLyBhbGwgb2YgY29sbGVjdGlvbiB3YXMgdHJhbnNsYXRlZCBzbyBqdXN0IGZpbmlzaCBvZmYgaXRlcmF0b3IKLQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkKLQkJCQlyZWdpb25zLm5leHQoKTsKLQkJfQotCX0KLQotCS8qCi0JICogVHJhbnNsYXRlcyBhbGwgZW1iZWRkZWQganNwIHJlZ2lvbnMgaW4gZW1iZWRkZWRDb250YWluZXIgZm9yIGV4YW1wbGU6Ci0JICogPGEgaHJlZj0iaW5kZXguanNwP3A9PCU9YWJjJT5iPTwlPXh5eiU+Ij5hYmM8L2E+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoSVRleHRSZWdpb25Db2xsZWN0aW9uIGVtYmVkZGVkQ29udGFpbmVyKSB7Ci0JCS8vIFRISVMgTUVUSE9EIElTIEEgRklYIEZPUgotCQkvLyBqc3AgZW1iZWRkZWQgaW4gYXR0cmlidXRlIHJlZ2lvbnMKLQkJLy8gbG9vcCBhbGwgcmVnaW9ucwotCQlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zID0gZW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiBkZWxpbSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGNvbnRlbnQgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW1iZWRkZWRSZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0KLQkJCS8vIHBvc3NpYmxlIGRlbGltaXRlciwgY2hlY2sgbGF0ZXIKLQkJCWRlbGltID0gZW1iZWRkZWRSZWdpb25zLmdldChpKTsKLQkJCXR5cGUgPSBkZWxpbS5nZXRUeXBlKCk7Ci0KLQkJCS8vIGNoZWNrIG5leHQgcmVnaW9uIHRvIHNlZSBpZiBpdCdzIGNvbnRlbnQKLQkJCWlmIChpICsgMSA8IGVtYmVkZGVkUmVnaW9ucy5zaXplKCkpIHsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGVtYmVkZGVkUmVnaW9ucy5nZXQoaSArIDEpLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UKQotCQkJCQljb250ZW50ID0gZW1iZWRkZWRSZWdpb25zLmdldChpICsgMSk7Ci0KLQkJCX0KLQotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCWludCBjb250ZW50U3RhcnQgPSBlbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydE9mZnNldChjb250ZW50KTsKLQkJCQlpbnQgclN0YXJ0ID0gZkN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyBjb250ZW50U3RhcnQ7Ci0JCQkJaW50IHJFbmQgPSBmQ3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIGVtYmVkZGVkQ29udGFpbmVyLmdldEVuZE9mZnNldChjb250ZW50KTsKLQotCQkJCWJvb2xlYW4gaW5UaGlzUmVnaW9uID0gclN0YXJ0IDw9IGZTb3VyY2VQb3NpdGlvbiAmJiByRW5kID49IGZTb3VyY2VQb3NpdGlvbjsKLQkJCQkvLyBpbnQganNwUG9zaXRpb25TdGFydCA9IGZDdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpICsKLQkJCQkvLyBjb250ZW50U3RhcnQ7Ci0KLQkJCQlpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB7Ci0JCQkJCWZMYXN0SlNQVHlwZSA9IEVYUFJFU1NJT047Ci0JCQkJCS8vIHRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwKLQkJCQkJLy8gZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCQl0cmFuc2xhdGVFeHByZXNzaW9uU3RyaW5nKGVtYmVkZGVkQ29udGFpbmVyLmdldFRleHQoY29udGVudCksIGVtYmVkZGVkQ29udGFpbmVyLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCksIGZhbHNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQkJZkxhc3RKU1BUeXBlID0gU0NSSVBUTEVUOwotCQkJCQkvLyB0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwKLQkJCQkJLy8gZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCQl0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZW1iZWRkZWRDb250YWluZXIsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQkJCWZMYXN0SlNQVHlwZSA9IERFQ0xBUkFUSU9OOwotCQkJCQkvLyB0cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGNvbnRlbnQpLAotCQkJCQkvLyBmQ3VycmVudE5vZGUsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCXRyYW5zbGF0ZURlY2xhcmF0aW9uU3RyaW5nKGVtYmVkZGVkQ29udGFpbmVyLmdldFRleHQoY29udGVudCksIGVtYmVkZGVkQ29udGFpbmVyLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCksIGZhbHNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfT1BFTikgewotCQkJCQlmTGFzdEpTUFR5cGUgPSBFWFBSRVNTSU9OOwotCQkJCQl0cmFuc2xhdGVFTChlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGNvbnRlbnQpLCBlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGRlbGltKSwgZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQotCQkJCS8vIGNhbGN1bGF0ZSByZWxhdGl2ZSBvZmZzZXQgaW4gYnVmZmVyCi0JCQkJaWYgKGluVGhpc1JlZ2lvbikgewotCQkJCQlzZXRDdXJzb3JPd25lcihmTGFzdEpTUFR5cGUpOwotCQkJCQlpbnQgY3VycmVudEJ1ZmZlckxlbmd0aCA9IGdldEN1cnNvck93bmVyKCkubGVuZ3RoKCk7Ci0JCQkJCXNldFJlbGF0aXZlT2Zmc2V0KChmU291cmNlUG9zaXRpb24gLSBjb250ZW50U3RhcnQpICsgY3VycmVudEJ1ZmZlckxlbmd0aCk7Ci0JCQkJCWlmIChmTGFzdEpTUFR5cGUgPT0gRVhQUkVTU0lPTikgewotCQkJCQkJLy8gaWYgYW4gZXhwcmVzc2lvbiwgYWRkIHRoZW4gbGVuZ3RoIG9mIHRoZSBlbmNsb3NpbmcKLQkJCQkJCS8vIHBhcmVuLi4KLQkJCQkJCXNldEN1cnNvckluRXhwcmVzc2lvbih0cnVlKTsKLQkJCQkJCXNldFJlbGF0aXZlT2Zmc2V0KGdldFJlbGF0aXZlT2Zmc2V0KCkgKyBFWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0eXBlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGZMYXN0SlNQVHlwZSA9IFNDUklQVExFVDsKLQotCS8qKgotCSAqIEpTUFR5cGUgaXMgb25seSB1c2VkIGludGVybmFsbHkgaW4gdGhpcyBjbGFzcyB0byBkZXNjcmliZSB0eWUgdHlwZSBvZgotCSAqIHJlZ2lvbiB0byBiZSB0cmFuc2xhdGVkCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SlNQVHlwZUZvclJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpbnQgdHlwZSA9IFNDUklQVExFVDsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKQotCQkJdHlwZSA9IFNDUklQVExFVDsKLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKQotCQkJdHlwZSA9IEVYUFJFU1NJT047Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pCi0JCQl0eXBlID0gREVDTEFSQVRJT047Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpCi0JCQl0eXBlID0gZkxhc3RKU1BUeXBlOwotCQkvLyByZW1lbWJlciB0aGUgbGFzdCB0eXBlLCBpbiBjYXNlIHRoZSBuZXh0IHR5cGUgdGhhdCBjb21lcyBpbiBpcwotCQkvLyBKU1BfQ09OVEVOVAotCQlmTGFzdEpTUFR5cGUgPSB0eXBlOwotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAvKiA8JUAgJT4gLyogbmVlZCB0byBwYXNzIGluIHRoZSBkaXJlY3RpdmUgdGFnIHJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZURpcmVjdGl2ZShJdGVyYXRvciByZWdpb25zKSB7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgcmVnaW9uVGV4dCwgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsgLy8gY291bGQKLQkJCS8vIGJlCi0JCQkvLyBYTUxfQ09OVEVOVAotCQkJLy8gPQotCQkJLy8gIiIsCi0JCQkvLyBza2lwcwotCQkJLy8gYXR0cnM/Ci0JCQlyZWdpb25UZXh0ID0gZ2V0Q3VycmVudE5vZGUoKS5nZXRUZXh0KHIpOwotCQkJaWYgKHJlZ2lvblRleHQuZXF1YWxzKCJ0YWdsaWIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gYWRkIGN1c3RvbSB0YWcgYmxvY2sgbWFya2VycyBoZXJlCi0JCQkJaGFuZGxlVGFnbGliKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVGV4dC5lcXVhbHMoImluY2x1ZGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gQ01WQyAyNTgzMTEKLQkJCQkvLyBQTVIgMTgzNjgsIEI2NjMKLQkJCQkvLyBza2lwIHRvIHJlcXVpcmVkICJmaWxlIiBhdHRyaWJ1dGUsIHNob3VsZCBiZSBzYWZlIGJlY2F1c2UKLQkJCQkvLyAiZmlsZSIgaXMgdGhlIG9ubHkgYXR0cmlidXRlIGZvciB0aGUgaW5jbHVkZSBkaXJlY3RpdmUKLQkJCQl3aGlsZSAociAhPSBudWxsICYmIHJlZ2lvbnMuaGFzTmV4dCgpICYmICFyLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQl9Ci0JCQkJZmlsZUxvY2F0aW9uID0gZ2V0QXR0cmlidXRlVmFsdWUociwgcmVnaW9ucyk7Ci0JCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKQotCQkJCQloYW5kbGVJbmNsdWRlRmlsZShmaWxlTG9jYXRpb24pOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVGV4dC5lcXVhbHMoInBhZ2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNsYXRlUGFnZURpcmVjdGl2ZUF0dHJpYnV0ZXMocmVnaW9ucywgZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UZXh0LmVxdWFscygidGFnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHNvbWUgYXR0cmlidXRlcyBvdmVybGFwLCBzbyBib3RoIGFyZSBoYW5kbGVkIGluIHRoaXMgbWV0aG9kCi0JCQkJdHJhbnNsYXRlUGFnZURpcmVjdGl2ZUF0dHJpYnV0ZXMocmVnaW9ucywgZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UZXh0LmVxdWFscygidmFyaWFibGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNsYXRlVmFyaWFibGVEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVGV4dC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cmFuc2xhdGVBdHRyaWJ1dGVEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZUF0dHJpYnV0ZURpcmVjdGl2ZUF0dHJpYnV0ZXMoSXRlcmF0b3IgcmVnaW9ucykgewotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lLCBhdHRyVmFsdWU7Ci0KLQkJU3RyaW5nIHZhclR5cGUgPSAiamF2YS5sYW5nLlN0cmluZyI7IC8vJE5PTi1OTFMtMSQgLy8gdGhlIGRlZmF1bHQgY2xhc3MuLi4KLQkJU3RyaW5nIHZhck5hbWUgPSBudWxsOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiIjsvLyROT04tTkxTLTEkIAotCQlib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQotCQkvLyBpdGVyYXRlIGFsbCBhdHRyaWJ1dGVzCi0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB7Ci0JCQlhdHRyTmFtZSA9IGF0dHJWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlhdHRyTmFtZSA9IGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKS50cmltKCk7Ci0JCQkJaWYgKGF0dHJOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChnZXRDdXJyZW50Tm9kZSgpLmdldFRleHQocikpOwotCQkJCQkJfQotCQkJCQkJLy8gaGFzIGVxdWFscywgYnV0IG5vIHZhbHVlPwotCQkJCQl9Ci0JCQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpKSB7Ci0JCQkJCQl2YXJUeXBlID0gYXR0clZhbHVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscyhKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBR01FTlQpKSB7Ci0JCQkJCQlpc0ZyYWdtZW50ID0gQm9vbGVhbi52YWx1ZU9mKGF0dHJWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKSkgewotCQkJCQkJdmFyTmFtZSA9IGF0dHJWYWx1ZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFU0NSSVBUSU9OKSkgewotCQkJCQkJZGVzY3JpcHRpb24gPSBhdHRyVmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHZhck5hbWUgIT0gbnVsbCkgewotCQkJaWYgKGlzRnJhZ21lbnQpIHsKLQkJCQkvLyAyLjA6SlNQLjguNS4yCi0JCQkJdmFyVHlwZSA9ICJqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwRnJhZ21lbnQiOwotCQkJfQotCQkJU3RyaW5nIGRlY2xhcmF0aW9uID0gbmV3IFRhZ2xpYlZhcmlhYmxlKHZhclR5cGUsIHZhck5hbWUsICIiLCBkZXNjcmlwdGlvbikuZ2V0RGVjbGFyYXRpb25TdHJpbmcodHJ1ZSwgVGFnbGliVmFyaWFibGUuTV9QUklWQVRFKTsKLQkJCWFwcGVuZFRvQnVmZmVyKGRlY2xhcmF0aW9uLCBmVXNlckRlY2xhcmF0aW9ucywgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlVmFyaWFibGVEaXJlY3RpdmVBdHRyaWJ1dGVzKEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJLyoKLQkJICogU2hvdWxkbid0IGNyZWF0ZSBhIHNjcmlwdGluZyB2YXJpYWJsZSBpbiAqdGhpcyogdGFnIGZpbGUncwotCQkgKiB0cmFuc2xhdGlvbiwgb25seSBpbiBKU1AgZmlsZXMgdGhhdCB1c2UgaXQgLQotCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4NzgwCi0JCSAqLwotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGlkZWFsbHkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgcnVuIHRocm91Z2gKLQkgKiBKU1BUcmFuc2xhdG9yIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBpbm5lciBoZWxwZXIgY2xhc3NlcyB0aGF0Ci0JICogbmVlZCB0byBhZGQgYmxvY2sgbWFya2VycyB0byB0aGVpciBvd24gcGFyc2Vycy4gVGhpcyBtZXRob2Qgb25seSBhZGRzCi0JICogbWFya2VycyB0aGF0IGNhbWUgZnJvbSA8QHRhZ2xpYj4gZGlyZWN0aXZlcywgKG5vdCA8QGluY2x1ZGU+KSwgc2luY2UKLQkgKiBpbmNsdWRlIGZpbGUgdGFnbGlicyBhcmUgaGFuZGxlZCBvbiB0aGUgZmx5IHdoZW4gdGhleSBhcmUgZW5jb3VudGVyZWQuICoKLQkgKiBAcGFyYW0gcmVnaW9ucwotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIHByZWZpeGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVGFnbGliKCkgewotCQkvLyBnZXQvY3JlYXRlIFRMRENNRG9jdW1lbnQKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQlMaXN0IHRyYWNrZXJzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2VycyhnZXRDdXJyZW50Tm9kZSgpLmdldEVuZCgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhY2tlcnMuaXRlcmF0b3IoKTsKLQkJCUNNRG9jdW1lbnRUcmFja2VyIHRyYWNrZXIgPSBudWxsOwotCQkJSXRlcmF0b3IgdGFnbGliUmVnaW9ucyA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXRyYWNrZXIgPSAoQ01Eb2N1bWVudFRyYWNrZXIpIGl0Lm5leHQoKTsKLQkJCQlzZFJlZ2lvbiA9IHRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJLy8gc2luY2UgbWF5IGJlIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZCAobGlrZSBhIGJhY2tncm91bmQKLQkJCQkvLyBqb2IpCi0JCQkJLy8gdGhpcyBjaGVjayBpcyB0byBiZSBzYWZlcgotCQkJCWlmIChzZFJlZ2lvbiAhPSBudWxsICYmICFzZFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJCQl0YWdsaWJSZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlICghc2RSZWdpb24uaXNEZWxldGVkKCkgJiYgdGFnbGliUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCXIgPSAoSVRleHRSZWdpb24pIHRhZ2xpYlJlZ2lvbnMubmV4dCgpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpKSB7Ci0JCQkJCQkJU3RyaW5nIHRleHQgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkJCWlmIChKU1AxMlRMRE5hbWVzLlRBR0xJQi5lcXVhbHModGV4dCkgfHwgSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQi5lcXVhbHModGV4dCkpIHsKLQkJCQkJCQkJYWRkQmxvY2tNYXJrZXJzKHRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgaWRlYWxseSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBydW4gdGhyb3VnaAotCSAqIEpTUFRyYW5zbGF0b3IgVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGlubmVyIGhlbHBlciBjbGFzc2VzIHRoYXQKLQkgKiBuZWVkIHRvIGFkZCBibG9jayBtYXJrZXJzIHRvIHRoZWlyIG93biBwYXJzZXJzLiBUaGlzIG1ldGhvZCBvbmx5IGFkZHMKLQkgKiBtYXJrZXJzIHRoYXQgY2FtZSBmcm9tIDxAdGFnbGliPiBkaXJlY3RpdmVzLCAobm90IDxAaW5jbHVkZT4pLCBzaW5jZQotCSAqIGluY2x1ZGUgZmlsZSB0YWdsaWJzIGFyZSBoYW5kbGVkIG9uIHRoZSBmbHkgd2hlbiB0aGV5IGFyZSBlbmNvdW50ZXJlZC4gKgotCSAqIEBwYXJhbSByZWdpb25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVRhZ2xpYihTdHJpbmcgcHJlZml4KSB7Ci0JCS8vIGdldC9jcmVhdGUgVExEQ01Eb2N1bWVudAotCQlUTERDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCS8vIGdldCB0cmFja2VycyBmb3IgdGhlIENNRG9jdW1lbnRzIGVuYWJsZWQgYXQgdGhpcyBvZmZzZXQKLQkJCUxpc3QgdHJhY2tlcnMgPSBtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGdldEN1cnJlbnROb2RlKCkuZ2V0RW5kKCkpOwotCQkJSXRlcmF0b3IgaXQgPSB0cmFja2Vycy5pdGVyYXRvcigpOwotCQkJQ01Eb2N1bWVudFRyYWNrZXIgdHJhY2tlciA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJdHJhY2tlciA9IChDTURvY3VtZW50VHJhY2tlcikgaXQubmV4dCgpOwotCQkJCWFkZEJsb2NrTWFya2VycyhwcmVmaXggKyAiOiIsIHRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIGFkZHMgYmxvY2sgbWFya2VycyB0byBKU1BUcmFuc2xhdG9yJ3MgYmxvY2sgbWFya2VyIGxpc3QgZm9yIGFsbAotCSAqIGVsZW1lbnRzIGluIGRvYyBAcGFyYW0gZG9jCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmxvY2tNYXJrZXJzKENNRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gZG9jLmdldEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCUNNTm9kZSBub2RlID0gbnVsbDsKLQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlub2RlID0gKENNTm9kZSkgZWxlbWVudHMubmV4dCgpOwotCQkJCWdldEJsb2NrTWFya2VycygpLmFkZChuZXcgQmxvY2tNYXJrZXIobm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBhZGRzIGJsb2NrIG1hcmtlcnMgdG8gSlNQVHJhbnNsYXRvcidzIGJsb2NrIG1hcmtlciBsaXN0IGZvciBhbGwKLQkgKiBlbGVtZW50cyBpbiBkb2MgQHBhcmFtIGRvYwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJsb2NrTWFya2VycyhTdHJpbmcgcHJlZml4LCBDTURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jLmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlJdGVyYXRvciBlbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQlDTU5vZGUgbm9kZSA9IG51bGw7Ci0JCQl3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJbm9kZSA9IChDTU5vZGUpIGVsZW1lbnRzLm5leHQoKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRMREVsZW1lbnREZWNsYXJhdGlvbiAmJiAoKFRMREVsZW1lbnREZWNsYXJhdGlvbikgbm9kZSkuZ2V0Qm9keWNvbnRlbnQoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCkpCi0JCQkJCWdldEJsb2NrTWFya2VycygpLmFkZChuZXcgQmxvY2tNYXJrZXIocHJlZml4ICsgbm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIHRydWUpKTsKLQkJCQllbHNlCi0JCQkJCWdldEJsb2NrTWFya2VycygpLmFkZChuZXcgQmxvY2tNYXJrZXIocHJlZml4ICsgbm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgciBpcyBhbiBhdHRyaWJ1dGUgbmFtZSByZWdpb24sIHRoaXMgbWV0aG9kIHdpbGwgc2FmZWx5IHJldHVybiB0aGUKLQkgKiB2YWx1ZSBmb3IgdGhhdCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIHIKLQkgKiBAcGFyYW0gcmVtYWluaW5nUmVnaW9ucwotCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIG5hbWUgKHIpLCBvciBudWxsIGlmIGlzbid0IG9uZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoSVRleHRSZWdpb24gciwgSXRlcmF0b3IgcmVtYWluaW5nUmVnaW9ucykgewotCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCWlmIChyZW1haW5pbmdSZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVtYWluaW5nUmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAocmVtYWluaW5nUmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlbWFpbmluZ1JlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHRha2VzIGFuIGl0ZXJhdG9yIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIGEgcGFnZSBkaXJlY3RpdmUgYW5kIHRoZQotCSAqIGRpcmVjdGl2ZSBpdHNlbGYuIFRoZSBpdGVyYXRvciBpcyB1c2VkIGluIGNhc2UgaXQgY2FuIGJlIG9wdGltaXplZCwgYnV0Ci0JICogdGhlIGRvY3VtZW50UmVnaW9uIGlzIHN0aWxsIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZXMgYXJlCi0JICogZXh0cmFjdGVkIGZyb20gdGhlIGNvcnJlY3QgdGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVQYWdlRGlyZWN0aXZlQXR0cmlidXRlcyhJdGVyYXRvciByZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUsIGF0dHJWYWx1ZTsKLQkJLy8gaXRlcmF0ZSBhbGwgYXR0cmlidXRlcwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJYXR0ck5hbWUgPSBhdHRyVmFsdWUgPSBudWxsOwotCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSB7Ci0KLQkJCQlhdHRyTmFtZSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocikudHJpbSgpOwotCQkJCWlmIChhdHRyTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0KLQkJCQkJCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHIpKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGhhcyBlcXVhbHMsIGJ1dCBubyB2YWx1ZT8KLQkJCQkJfQotCQkJCQlzZXREaXJlY3RpdmVBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0cyB0aGUgYXBwcm9wcmlhdGUgcGFnZS90YWcgZGlyZWN0aXZlIGF0dHJpYnV0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERpcmVjdGl2ZUF0dHJpYnV0ZShTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVmFsdWUpIHsKLQkJaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyB1c2VzIGRlZmF1bHQgKGlmIHRoZXJlIHdhcyBvbmUpCi0JCWlmIChhdHRyTmFtZS5lcXVhbHMoImV4dGVuZHMiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlmU3VwZXJjbGFzcyA9IGF0dHJWYWx1ZTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImltcG9ydCIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWFkZEltcG9ydHMoYXR0clZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoInNlc3Npb24iKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlmSXNJbkFTZXNzaW9uID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoYXR0clZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImJ1ZmZlciIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCS8vIGlnbm9yZSBmb3Igbm93Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJhdXRvRmx1c2giKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQkvLyBpZ25vcmUgZm9yIG5vdwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiaXNUaHJlYWRTYWZlIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJLy8gZlRocmVhZFNhZmUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShhdHRyVmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJpc0Vycm9yUGFnZSIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWZJc0Vycm9yUGFnZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVJbmNsdWRlRmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJaWYgKGZpbGVuYW1lICE9IG51bGwgJiYgZlByb2Nlc3NJbmNsdWRlcykgewotCQkJSVBhdGggbW9kZWxQYXRoID0gZ2V0TW9kZWxQYXRoKCk7Ci0JCQlJUGF0aCBiYXNlUGF0aCA9IG1vZGVsUGF0aDsKLQkJCWlmIChiYXNlUGF0aCAhPSBudWxsKSB7Ci0JCQkJLyoKLQkJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3NTc2Ci0JCQkJICogCi0JCQkJICogVGhlIHJlc29sdXRpb24gb2YgdGhlIGluY2x1ZGVkIGZyYWdtZW50IHNob3VsZCB1c2UgdGhlIGZpbGUKLQkJCQkgKiBjb250YWluaW5nIHRoZSBkaXJlY3RpdmUgYXMgdGhlIGJhc2UgcmVmZXJlbmNlLCBub3QgYWx3YXlzCi0JCQkJICogdGhlIG1haW4gSlNQIGJlaW5nIGludm9rZWQuIFZlcmlmaWVkIGJlaGF2aW9yIHdpdGggQXBhY2hlCi0JCQkJICogVG9tY2F0IDUuNS4yMC4KLQkJCQkgKi8KLQkJCQlpZiAoIWdldEluY2x1ZGVzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCWJhc2VQYXRoID0gbmV3IFBhdGgoKFN0cmluZykgZ2V0SW5jbHVkZXMoKS5wZWVrKCkpOwotCQkJCX0KLQkJCQlTdHJpbmcgZmlsZVBhdGhTdHJpbmcgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUoYmFzZVBhdGgsIGZpbGVuYW1lKS50b1N0cmluZygpOwotCQkJCWZJbmNsdWRlZFBhdGhzLmFkZChmaWxlUGF0aFN0cmluZyk7Ci0KLQkJCQlpZiAoIWdldEluY2x1ZGVzKCkuY29udGFpbnMoZmlsZVBhdGhTdHJpbmcpICYmICFmaWxlUGF0aFN0cmluZy5lcXVhbHMobW9kZWxQYXRoLnRvU3RyaW5nKCkpKSB7Ci0JCQkJCWdldEluY2x1ZGVzKCkucHVzaChmaWxlUGF0aFN0cmluZyk7Ci0JCQkJCUpTUEluY2x1ZGVSZWdpb25IZWxwZXIgaGVscGVyID0gbmV3IEpTUEluY2x1ZGVSZWdpb25IZWxwZXIodGhpcywgdHJ1ZSk7Ci0JCQkJCS8vIFNob3VsZCB3ZSBjb25zaWRlciBwcmVsdWRlcyBvbiB0aGlzIHNlZ21lbnQ/Ci0JCQkJCWhlbHBlci5wYXJzZShmaWxlUGF0aFN0cmluZyk7Ci0JCQkJCWdldEluY2x1ZGVzKCkucG9wKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdGFjayBnZXRJbmNsdWRlcygpIHsKLQkJaWYgKGZJbmNsdWRlcyA9PSBudWxsKQotCQkJZkluY2x1ZGVzID0gbmV3IFN0YWNrKCk7Ci0JCXJldHVybiBmSW5jbHVkZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0SW5jbHVkZWRQYXRocygpIHsKLQkJcmV0dXJuIGZJbmNsdWRlZFBhdGhzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoU3RyaW5nIG5ld1RleHQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBlbWJlZGRlZENvbnRhaW5lciwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkxlbmd0aCwgYm9vbGVhbiBpc0luZGlyZWN0KSB7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fUFJFRklYLCBmVXNlckNvZGUsIGZhbHNlLCBlbWJlZGRlZENvbnRhaW5lcik7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyQ29kZSwgdHJ1ZSwgZW1iZWRkZWRDb250YWluZXIsIGpzcFBvc2l0aW9uU3RhcnQsIGpzcFBvc2l0aW9uTGVuZ3RoLCBpc0luZGlyZWN0KTsKLQkJYXBwZW5kVG9CdWZmZXIoRVhQUkVTU0lPTl9TVUZGSVgsIGZVc2VyQ29kZSwgZmFsc2UsIGVtYmVkZGVkQ29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhTdHJpbmcgbmV3VGV4dCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGVtYmVkZGVkQ29udGFpbmVyLCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uTGVuZ3RoLCBib29sZWFuIGlzSW5kaXJlY3QpIHsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJEZWNsYXJhdGlvbnMsIHRydWUsIGVtYmVkZGVkQ29udGFpbmVyLCBqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCwgaXNJbmRpcmVjdCk7Ci0JCWFwcGVuZFRvQnVmZmVyKEVOREwsIGZVc2VyRGVjbGFyYXRpb25zLCBmYWxzZSwgZW1iZWRkZWRDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIHVzZWQgYnkgWE1MSlNQUmVnaW9uSGVscGVyIGZvciBpbmNsdWRlZCBKU1AgZmlsZXMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBlbWJlZGRlZENvbnRhaW5lcgotCSAqIEBwYXJhbSBqc3BQb3NpdGlvblN0YXJ0Ci0JICogQHBhcmFtIGpzcFBvc2l0aW9uTGVuZ3RoCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlU2NyaXB0bGV0U3RyaW5nKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZW1iZWRkZWRDb250YWluZXIsIGludCBqc3BQb3NpdGlvblN0YXJ0LCBpbnQganNwUG9zaXRpb25MZW5ndGgsIGJvb2xlYW4gaXNJbmRpcmVjdCkgewotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckNvZGUsIHRydWUsIGVtYmVkZGVkQ29udGFpbmVyLCBqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCwgaXNJbmRpcmVjdCk7Ci0JfQotCi0JLy8gdGhlIGZvbGxvd2luZyAzIG1ldGhvZHMgZGV0ZXJtaW5lIHRoZSBjdXJzb3IgcG9zaXRpb24KLQkvLyA8JT0gJT4KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVFeHByZXNzaW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24pIHsKLQkJU3RyaW5nIG5ld1RleHQgPSBnZXRVbmVzY2FwZWRSZWdpb25UZXh0KHJlZ2lvbiwgRVhQUkVTU0lPTik7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fUFJFRklYLCBmVXNlckNvZGUsIGZhbHNlLCByZWdpb24pOwotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckNvZGUsIHRydWUsIGZDdXJyZW50Tm9kZSk7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fU1VGRklYLCBmVXNlckNvZGUsIGZhbHNlLCByZWdpb24pOwotCX0KLQotCS8vCi0JLy8gPCUhICU+Ci0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlRGVjbGFyYXRpb24oSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbikgewotCQlTdHJpbmcgbmV3VGV4dCA9IGdldFVuZXNjYXBlZFJlZ2lvblRleHQocmVnaW9uLCBERUNMQVJBVElPTik7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyRGVjbGFyYXRpb25zLCB0cnVlLCByZWdpb24pOwotCQlhcHBlbmRUb0J1ZmZlcihFTkRMLCBmVXNlckRlY2xhcmF0aW9ucywgZmFsc2UsIHJlZ2lvbik7Ci0JfQotCi0JLy8KLQkvLyA8JSAlPgotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVNjcmlwdGxldChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyBuZXdUZXh0ID0gZ2V0VW5lc2NhcGVkUmVnaW9uVGV4dChyZWdpb24sIFNDUklQVExFVCk7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyQ29kZSwgdHJ1ZSwgcmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdXNpbmcgYSByZWdpb24sIHByb2JhYmx5IGluZGlyZWN0IG1hcHBpbmcgKGVnLiA8JUBwYWdlCi0JICogaW5jbHVkZT0iIiU+KQotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogQHBhcmFtIGJ1ZmZlcgotCSAqIEBwYXJhbSBhZGRUb01hcAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVG9CdWZmZXIoU3RyaW5nIG5ld1RleHQsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGJvb2xlYW4gYWRkVG9NYXAsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24pIHsKLQkJaW50IHN0YXJ0ID0gMCwgbGVuZ3RoID0gMDsKLQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydCA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJbGVuZ3RoID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldExlbmd0aCgpOwotCQl9Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGJ1ZmZlciwgYWRkVG9NYXAsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgc3RhcnQsIGxlbmd0aCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgbmV3VGV4dCB0byB0aGUgYnVmZmVyIHBhc3NlZCBpbiwgYW5kIGFkZHMgdG8gdHJhbnNsYXRpb24gbWFwcGluZwotCSAqIGFzIHNwZWNpZmllZCBieSB0aGUgYWRkVG9NYXAgZmxhZy4gc29tZSBzcGVjaWFsIGNhc2VzIHRvIGNvbnNpZGVyICh0aGF0Ci0JICogbWF5IGJlIGFmZmVjdGVkIGJ5IGNoYW5nZXMgdG8gdGhpcyBtZXRob2QpOiBpbmNsdWRlZCBmaWxlcyBzY3JpcGxldHMgaW4KLQkgKiBhbiBhdHRyaWJ1dGUgdmFsdWUgcmVmYWN0b3JpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVG9CdWZmZXIoU3RyaW5nIG5ld1RleHQsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGJvb2xlYW4gYWRkVG9NYXAsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGludCBqc3BQb3NpdGlvblN0YXJ0LCBpbnQganNwUG9zaXRpb25MZW5ndGgsIGJvb2xlYW4gaXNJbmRpcmVjdCkgewotCi0JCWludCBvcmlnTmV3VGV4dExlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0KLQkJLy8gbm90aGluZyB0byBhcHBlbmQKLQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGFkZCBhIG5ld2xpbmUgc28gdHJhbnNsYXRpb24gbG9va3MgY2xlYW5lcgotCQlpZiAoIW5ld1RleHQuZW5kc1dpdGgoRU5ETCkpCi0JCQluZXdUZXh0ICs9IEVOREw7Ci0KLQkJaWYgKGJ1ZmZlciA9PSBmVXNlckNvZGUpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV3VGV4dCk7Ci0JCQlpZiAoYWRkVG9NYXApIHsKLQkJCQlpZiAoaXNVc2ViZWFuVGFnKGpzcFJlZmVyZW5jZVJlZ2lvbikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIHJlcXVpcmVzIHNwZWNpYWwgbWFwcGluZwotCQkJCQkJYXBwZW5kVXNlQmVhblRvQnVmZmVyKG5ld1RleHQsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgaXNJbmRpcmVjdCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBzdGlsbCB3b3JraW5nIG91dCBraW5rcwotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYWxsIG90aGVyIGNhc2VzCi0JCQkJCVBvc2l0aW9uIGphdmFSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgb3JpZ05ld1RleHRMZW5ndGgpOwotCQkJCQlQb3NpdGlvbiBqc3BSYW5nZSA9IG5ldyBQb3NpdGlvbihqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCk7Ci0KLQkJCQkJZkNvZGVSYW5nZXMucHV0KGphdmFSYW5nZSwganNwUmFuZ2UpOwotCQkJCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQkJCWZJbmRpcmVjdFJhbmdlcy5wdXQoamF2YVJhbmdlLCBqc3BSYW5nZSk7Ci0JCQkJfQotCQkJfQotCQkJZk9mZnNldEluVXNlckNvZGUgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJfQotCQllbHNlIGlmIChidWZmZXIgPT0gZlVzZXJEZWNsYXJhdGlvbnMpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV3VGV4dCk7Ci0JCQlpZiAoYWRkVG9NYXApIHsKLQkJCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucywgbmV3VGV4dC5sZW5ndGgoKSk7Ci0JCQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgpOwotCi0JCQkJZkRlY2xhcmF0aW9uUmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCX0KLQkJCWZPZmZzZXRJblVzZXJEZWNsYXJhdGlvbnMgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVXNlYmVhblRhZyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNVc2VCZWFuID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyODQ5MAotCQkJLy8gbGVuZ3RoIG9mIDExIGlzIHRoZSBsZW5ndGggb2YganNwOnVzZUJlYW4KLQkJCS8vIGFuZCBzYXZlcyB0aGUgZXhwZW5zaXZlIGdldFRleHQuZXF1YWxzIGNhbGwKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCWlmIChyLmdldFRleHRMZW5ndGgoKSA9PSAxMSAmJiBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0VGV4dChyKS5lcXVhbHMoImpzcDp1c2VCZWFuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc1VzZUJlYW4gPSB0cnVlOwotCQkJCX0KLQkJCQkvLyBicmVhayBubyBtYXR0ZXIgd2hhdCBpZiB5b3UgaGl0IHRhZ25hbWUKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNVc2VCZWFuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbXBvcnROYW1lCi0JICogICAgICAgICAgICBzaG91bGQgYmUganVzdCB0aGUgcGFja2FnZSBwbHVzIHRoZSB0eXBlIGVnLiBqYXZhLnV0aWwuTGlzdAotCSAqICAgICAgICAgICAgb3IgamF2YS51dGlsLioKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICogICAgICAgICAgICBzaG91bGQgYmUgdGhlIDwlQCBwYWdlIGltcG9ydCA9ICJqYXZhLnV0aWwuTGlzdCIlPiByZWdpb24KLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kSW1wb3J0VG9CdWZmZXIoU3RyaW5nIGltcG9ydE5hbWUsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGJvb2xlYW4gYWRkVG9NYXApIHsKLQkJU3RyaW5nIGphdmFJbXBvcnRTdHJpbmcgPSAiaW1wb3J0ICIgKyBpbXBvcnROYW1lICsgIjsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZVc2VySW1wb3J0cy5hcHBlbmQoamF2YUltcG9ydFN0cmluZyk7Ci0JCWlmIChhZGRUb01hcCkgewotCQkJYWRkSW1wb3J0VG9NYXAoaW1wb3J0TmFtZSwganNwUmVmZXJlbmNlUmVnaW9uKTsKLQkJfQotCQlmT2Zmc2V0SW5Vc2VySW1wb3J0cyArPSBqYXZhSW1wb3J0U3RyaW5nLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIG5ldyB0ZXh0IGNhbiBiZSBzb21ldGhpbmcgbGlrZTogImltcG9ydCBqYXZhLmxhbmcuT2JqZWN0O1xuIgotCSAqIAotCSAqIGJ1dCB0aGUgcmVmZXJlbmNlIHJlZ2lvbiBjb3VsZCBoYXZlIGJlZW4gc29tZXRoaW5nIGxpa2U6IDwlQHBhZ2UKLQkgKiBpbXBvcnQ9ImphdmEubGFuZy5PYmplY3QsIGphdmEuaW8uKiwgamF2YS51dGlsLkxpc3QiJT4KLQkgKiAKLQkgKiBzbyB0aGUgZXhhY3QgbWFwcGluZyBoYXMgdG8gYmUgY2FsY3VsYXRlZCBjYXJlZnVsbHkuCi0JICogCi0JICogaXNJbmRpcmVjdCBtZWFucyB0aGF0IHRoZSBpbXBvcnQgY2FtZSBmcm9tIGFuIGluY2x1ZGVkIGZpbGUgKGlmIHRydWUpCi0JICogCi0JICogQHBhcmFtIGltcG9ydE5hbWUKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEltcG9ydFRvTWFwKFN0cmluZyBpbXBvcnROYW1lLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0KLQkJLy8gbWFzc2FnZSB0ZXh0Ci0JCS8vIFN0cmluZyBqc3BUZXh0ID0gaW1wb3J0TmFtZS5zdWJzdHJpbmcoaW1wb3J0TmFtZS5pbmRleE9mKCJpbXBvcnQgIikKLQkJLy8gKyA3LCBpbXBvcnROYW1lLmluZGV4T2YoJzsnKSk7Ci0JCS8vIFN0cmluZyBqc3BUZXh0ID0gaW1wb3J0TmFtZS50cmltKCk7Ci0KLQkJLy8gdGhlc2UgcG9zaXRpb25zIHdpbGwgYmUgdXBkYXRlZCBiZWxvdwotCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckltcG9ydHMgKyA3LCAxKTsKLQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0KCksIGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJLy8gY2FsY3VsYXRlIEpTUCByYW5nZSBieSBmaW5kaW5nICJpbXBvcnQiIGF0dHJpYnV0ZQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBzaXplID0gcmVnaW9ucy5zaXplKCk7Ci0KLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWludCBsZW5ndGggPSAtMTsKLQotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpLnRyaW0oKS5lcXVhbHMoImltcG9ydCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gZ2V0IHRoZSBhdHRyIHZhbHVlIHJlZ2lvbgotCQkJCQlpZiAoc2l6ZSA+IGkgKyAyKSB7Ci0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSArIDIpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQotCQkJCQkJCVN0cmluZyBqc3BJbXBvcnRUZXh0ID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFRleHQocik7Ci0KLQkJCQkJCQkvLyB0aGUgcG9zaXRpb24gaW4gcXVlc3Rpb24gKGluIHRoZSBKU1ApIGlzIHdoYXQKLQkJCQkJCQkvLyBpcyBicmFja2V0ZWQgYmVsb3cKLQkJCQkJCQkvLyBpbmNsdWRlcyB3aGl0ZXNwYWNlCi0JCQkJCQkJLy8gPCVAcGFnZSBpbXBvcnQ9ImphdmEubGFuZy5PYmplY3QsWyBqYXZhLmlvLiogXSwKLQkJCQkJCQkvLyBqYXZhLnV0aWwuTGlzdCIlPgotCi0JCQkJCQkJLy8gaW4gdGhlIGphdmEgZmlsZQotCQkJCQkJCS8vIGltcG9ydCBbIGphdmEuaW8uKiBdOwotCi0JCQkJCQkJc3RhcnQgPSBqc3BJbXBvcnRUZXh0LmluZGV4T2YoaW1wb3J0TmFtZSk7Ci0JCQkJCQkJbGVuZ3RoID0gaW1wb3J0TmFtZS5sZW5ndGgoKTsKLQotCQkJCQkJCS8vIHNhZmV0eSwgZG9uJ3QgYWRkIHRvIG1hcCBpZiBiYWQgcG9zaXRpb25pbmcKLQkJCQkJCQlpZiAoc3RhcnQgPT0gLTEgfHwgbGVuZ3RoIDwgMSkKLQkJCQkJCQkJYnJlYWs7Ci0KLQkJCQkJCQkvLyB1cGRhdGUganNwIHJhbmdlCi0JCQkJCQkJanNwUmFuZ2Uuc2V0T2Zmc2V0KGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHN0YXJ0KTsKLQkJCQkJCQlqc3BSYW5nZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJCS8vIHVwZGF0ZSBqYXZhIHJhbmdlCi0JCQkJCQkJamF2YVJhbmdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQotCQkvLyBzYWZldHkgZm9yIGJhZCByYW5nZXMKLQkJaWYgKHN0YXJ0ICE9IC0xICYmIGxlbmd0aCA+IDEpIHsKLQkJCS8vIHB1dCByYW5nZXMgaW4gamF2YSAtPiBqc3AgcmFuZ2UgbWFwCi0JCQlmSW1wb3J0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHRlbXAgZml4IGZvciAyODIyOTUgdW50aWwgYmV0dGVyIG1hcHBpbmcgaXMgaW4gcGxhY2UKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVXNlQmVhblRvQnVmZmVyKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBib29sZWFuIGlzSW5kaXJlY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBqYXZhIHN0cmluZyBsb29rcyBsaWtlIHRoaXMgKHRva2VuaXplZCkKLQkJLy8gVHlwZSBpZCA9IG5ldyBDbGFzc25hbWUoKTtcbgotCQkvLyAwIDEgMiAzIDQKLQkJLy8gb3IKLQkJLy8gVHlwZSBpZCA9IG51bGw7XG4gLy8gaWYgdGhlcmUgaXMgbm8gY2xhc3NuYW1lCi0JCS8vIDAgMSAyIDMKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIGNhbGN1bGF0ZSBqYXZhIHJhbmdlcwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmV3VGV4dCwgIiAiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGkgPSAwOwotCQlTdHJpbmdbXSBwYXJzZWRKYXZhID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCXBhcnNlZEphdmFbaSsrXSA9IHN0Lm5leHRUb2tlbigpOwotCi0JCVN0cmluZyB0eXBlID0gcGFyc2VkSmF2YVswXSAhPSBudWxsID8gcGFyc2VkSmF2YVswXSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpZCA9IHBhcnNlZEphdmFbMV0gIT0gbnVsbCA/IHBhcnNlZEphdmFbMV0gOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2xhc3NOYW1lID0gcGFyc2VkSmF2YS5sZW5ndGggPiA0ID8gcGFyc2VkSmF2YVs0XSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJUG9zaXRpb24gamF2YVR5cGVSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgdHlwZS5sZW5ndGgoKSk7Ci0JCVBvc2l0aW9uIGphdmFJZFJhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlICsgdHlwZS5sZW5ndGgoKSArIDEsIGlkLmxlbmd0aCgpKTsKLQkJUG9zaXRpb24gamF2YUNsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUgKyB0eXBlLmxlbmd0aCgpICsgMSArIGlkLmxlbmd0aCgpICsgNywgMCk7Ci0JCS8qCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTIyNDIgLSBDaGVjayBmb3IKLQkJICogdGhlIGV4aXN0ZW5jZSBvZiAnKCcgZmlyc3QuCi0JCSAqLwotCQlpbnQgcGFyZW5Qb3MgPSAtMTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+PSA0ICYmIChwYXJlblBvcyA9IGNsYXNzTmFtZS5pbmRleE9mKCcoJykpID49IDApIHsKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjEzMgotCQkJaW50IGNsYXNzTmFtZUxlbmd0aCA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgcGFyZW5Qb3MpLmxlbmd0aCgpOwotCQkJamF2YUNsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUgKyB0eXBlLmxlbmd0aCgpICsgMSArIGlkLmxlbmd0aCgpICsgNywgY2xhc3NOYW1lTGVuZ3RoKTsKLQkJfQotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBjYWxjdWxhdGUganNwIHJhbmdlcwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gIiIsIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IHF1b3RlT2Zmc2V0ID0gMDsKLQkJUG9zaXRpb24ganNwVHlwZVJhbmdlID0gbnVsbDsKLQkJUG9zaXRpb24ganNwSWRSYW5nZSA9IG51bGw7Ci0JCVBvc2l0aW9uIGpzcENsYXNzUmFuZ2UgPSBudWxsOwotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgcmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGopOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWF0dHJOYW1lID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFRleHQocik7Ci0JCQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID4gaiArIDIgJiYgcmVnaW9ucy5nZXQoaiArIDIpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCS8vIGdldCBhdHRyIHZhbHVlCi0JCQkJCXIgPSByZWdpb25zLmdldChqICsgMik7Ci0JCQkJCWF0dHJWYWx1ZSA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpOwotCi0JCQkJCS8vIG1heSBoYXZlIHF1b3RlcwotCQkJCQlxdW90ZU9mZnNldCA9IChhdHRyVmFsdWUuc3RhcnRzV2l0aCgiXCIiKSB8fCBhdHRyVmFsdWUuc3RhcnRzV2l0aCgiJyIpKSA/IDEgOiAwOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzKCJ0eXBlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWpzcFR5cGVSYW5nZSA9IG5ldyBQb3NpdGlvbihqc3BSZWZlcmVuY2VSZWdpb24uZ2V0U3RhcnRPZmZzZXQocikgKyBxdW90ZU9mZnNldCwgU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXNMZWF2ZUluc2lkZVNwYWNlKGF0dHJWYWx1ZSkubGVuZ3RoKCkpOwotCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImlkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWpzcElkUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpICsgcXVvdGVPZmZzZXQsIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShhdHRyVmFsdWUpLmxlbmd0aCgpKTsKLQkJCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJjbGFzcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQlqc3BDbGFzc1JhbmdlID0gbmV3IFBvc2l0aW9uKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHF1b3RlT2Zmc2V0LCBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlc0xlYXZlSW5zaWRlU3BhY2UoYXR0clZhbHVlKS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcHV0IHJhbmdlcyBpbiBqYXZhIC0+IGpzcCByYW5nZSBtYXAKLQkJaWYgKCF0eXBlLmVxdWFscygiIikgJiYganNwVHlwZVJhbmdlICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJZkNvZGVSYW5nZXMucHV0KGphdmFUeXBlUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCQkvLyBub3RlOiBkb24ndCB1cGRhdGUgb2Zmc2V0cyBmb3IgdGhpcyBtYXAgd2hlbiByZXN1bHQgaXMgYnVpbHQKLQkJCS8vIHRoZXknbGwgYmUgdXBkYXRlZCB3aGVuIGNvZGUgcmFuZ2VzIG9mZnNldHMgYXJlIHVwZGF0ZWQKLQkJCWZVc2VCZWFuUmFuZ2VzLnB1dChqYXZhVHlwZVJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQkJaWYgKGlzSW5kaXJlY3QpCi0JCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhVHlwZVJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQl9Ci0JCWlmICghaWQuZXF1YWxzKCIiKSAmJiBqc3BJZFJhbmdlICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJZkNvZGVSYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BJZFJhbmdlKTsKLQkJCS8vIG5vdGU6IGRvbid0IHVwZGF0ZSBvZmZzZXRzIGZvciB0aGlzIG1hcCB3aGVuIHJlc3VsdCBpcyBidWlsdAotCQkJLy8gdGhleSdsbCBiZSB1cGRhdGVkIHdoZW4gY29kZSByYW5nZXMgb2Zmc2V0cyBhcmUgdXBkYXRlZAotCQkJZlVzZUJlYW5SYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQkJaWYgKGlzSW5kaXJlY3QpCi0JCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhSWRSYW5nZSwganNwVHlwZVJhbmdlKTsKLQkJfQotCQlpZiAoIWNsYXNzTmFtZS5lcXVhbHMoIiIpICYmIGpzcENsYXNzUmFuZ2UgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlmQ29kZVJhbmdlcy5wdXQoamF2YUNsYXNzUmFuZ2UsIGpzcENsYXNzUmFuZ2UpOwotCQkJLy8gbm90ZTogZG9uJ3QgdXBkYXRlIG9mZnNldHMgZm9yIHRoaXMgbWFwIHdoZW4gcmVzdWx0IGlzIGJ1aWx0Ci0JCQkvLyB0aGV5J2xsIGJlIHVwZGF0ZWQgd2hlbiBjb2RlIHJhbmdlcyBvZmZzZXRzIGFyZSB1cGRhdGVkCi0JCQlmVXNlQmVhblJhbmdlcy5wdXQoamF2YUNsYXNzUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQlmSW5kaXJlY3RSYW5nZXMucHV0KGphdmFDbGFzc1JhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBidWZmZXIgdG8gdGhlIGN1cnJlbnQgSlNQVHlwZTogU1RBTkRBUkRfSlNQLCBFTUJFRERFRF9KU1AsCi0JICogREVDTEFSQVRJT04sIEVYUFJFU1NJT04sIFNDUklQVExFVCAoZm9yIGtlZXB0aW5nIHRyYWNrIG9mIGN1cnNvcgotCSAqIHBvc2l0aW9uIHdoZW4gdGhlIGZpbmFsIGRvY3VtZW50IGlzIGJ1aWx0KQotCSAqIAotCSAqIEBwYXJhbSBKU1BUeXBlCi0JICogICAgICAgICAgICB0aGUgSlNQIHR5cGUgdGhhdCB0aGUgY3Vyc29yIGlzIGluCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3Vyc29yT3duZXIoaW50IEpTUFR5cGUpIHsKLQkJc3dpdGNoIChKU1BUeXBlKSB7Ci0JCQljYXNlIERFQ0xBUkFUSU9OIDoKLQkJCQlzZXRDdXJzb3JPd25lcihmVXNlckRlY2xhcmF0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVYUFJFU1NJT04gOgotCQkJY2FzZSBTQ1JJUFRMRVQgOgotCQkJCXNldEN1cnNvck93bmVyKGZVc2VyQ29kZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzZXRDdXJzb3JPd25lcihmVXNlckNvZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhpcyBwaWVjZSBvZiBjb2RlIGl0ZXJhdGVzIHRocm91Z2ggZkN1cnJlbnROb2RlcyBhbmQgY2x1bXBzIHRoZW0KLQkgKiB0b2dldGhlciBpbiBhIGJpZyB0ZXh0IHN0cmluZyAtIHVuZXNjYXBpbmcgY2hhcmFjdGVycyBpZiB0aGV5IGFyZSBub3QKLQkgKiBDREFUQSAtIHNpbXBseSBhcHBlbmRpbmcgaWYgdGhleSBhcmUgQ0RBVEEgaXQgc3RvcHMgaXRlcmF0aW9uIHdoZW4gaXQKLQkgKiBoaXRzIGEgbm9kZSB0aGF0IGlzIGFuIFhNTF9UQUdfTkFNRSAod2hpY2ggc2hvdWxkIGJlIHRoZSByZWdpb24gY2xvc2luZwotCSAqIHRhZykKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuZXNjYXBlZFJlZ2lvblRleHQoSVRleHRSZWdpb25Db2xsZWN0aW9uIHN0UmVnaW9uLCBpbnQgSlNQVHlwZSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgc3RhcnQgPSBzdFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gc3RSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCS8vIGFkanVzdG1lbnQgbmVjZXNzYXJ5IGZvciBlbWJlZGRlZCByZWdpb24gY29udGFpbmVycwotCQlpZiAoc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lciAmJiBzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQlpZiAoc3RSZWdpb24uZ2V0UmVnaW9ucygpICE9IG51bGwgJiYgc3RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiBqc3BDb250ZW50ID0gc3RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsgLy8gc2hvdWxkCi0JCQkJLy8gYmUKLQkJCQkvLyBqc3BDb250ZW50Ci0JCQkJLy8gcmVnaW9uCi0JCQkJc3RhcnQgPSBzdFJlZ2lvbi5nZXRTdGFydE9mZnNldChqc3BDb250ZW50KTsKLQkJCQllbmQgPSBzdFJlZ2lvbi5nZXRFbmRPZmZzZXQoanNwQ29udGVudCk7Ci0JCQl9Ci0JCX0KLQkJaW50IENEQVRBT2Zmc2V0ID0gMDsgLy8gbnVtYmVyIG9mIGNoYXJhY3RlcnMgbG9zdCBpbiBjb252ZXJzaW9uCi0JCWludCBidWZmZXJTaXplID0gMDsKLQkJaWYgKHN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCBzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUIC8vIG5lZWQKLQkJCQkJLy8gdGhpcwotCQkJCQkvLyBmb3IKLQkJCQkJLy8gZW1iZWRkZWQKLQkJCQkJLy8gSlNQCi0JCQkJCS8vIHJlZ2lvbnMKLQkJCQkJfHwgc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSAvLyBuZWVkCi0JCS8vIHRoaXMKLQkJLy8gaW4KLQkJLy8gY2FzZQotCQkvLyB0aGVyZSdzCi0JCS8vIG5vCi0JCS8vIHJlZ2lvbi4uLgotCQl7Ci0JCQlmSW5Db2RlUmVnaW9uID0gKHN0YXJ0IDw9IGZTb3VyY2VQb3NpdGlvbiAmJiBmU291cmNlUG9zaXRpb24gPD0gZW5kKTsKLQkJCWlmIChmSW5Db2RlUmVnaW9uKSB7Ci0JCQkJc2V0Q3Vyc29yT3duZXIoSlNQVHlwZSk7Ci0JCQkJc2V0UmVsYXRpdmVPZmZzZXQoKGZTb3VyY2VQb3NpdGlvbiAtIHN0YXJ0KSArIGdldEN1cnNvck93bmVyKCkubGVuZ3RoKCkpOwotCQkJCWlmIChKU1BUeXBlID09IEVYUFJFU1NJT04pIHsKLQkJCQkJLy8gaWYgYW4gZXhwcmVzc2lvbiwgYWRkIHRoZW4gbGVuZ3RoIG9mIHRoZSBlbmNsb3NpbmcKLQkJCQkJLy8gcGFyZW4uLgotCQkJCQlzZXRDdXJzb3JJbkV4cHJlc3Npb24odHJ1ZSk7Ci0JCQkJCXNldFJlbGF0aXZlT2Zmc2V0KGdldFJlbGF0aXZlT2Zmc2V0KCkgKyBFWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJSVRleHRSZWdpb24ganNwQ29udGVudCA9IG51bGw7Ci0JCQlpZiAoc3RSZWdpb24uZ2V0UmVnaW9ucygpICE9IG51bGwgJiYgc3RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpCi0JCQkJanNwQ29udGVudCA9IHN0UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlyZXR1cm4gKGpzcENvbnRlbnQgIT0gbnVsbCkgPyBzdFJlZ2lvbi5nZXRGdWxsVGV4dChqc3BDb250ZW50KSA6IHN0UmVnaW9uLmdldEZ1bGxUZXh0KCk7IC8vIGRvbid0Ci0JCQkvLyB1bmVzY2FwZQotCQkJLy8gaWYKLQkJCS8vIGl0J3MKLQkJCS8vIG5vdAotCQkJLy8gYW4KLQkJCS8vIFhNTEpTUAotCQkJLy8gdGFnCi0JCX0KLQkJZWxzZSBpZiAoc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJLy8gbmVlZCB0byBkZXRlcm1pbmUgY3Vyc29yIG93bmVyIHNvIHRoYXQgdGhlIGZDdXJvc29yUG9zaXRpb24KLQkJCS8vIHdpbGwgYmUKLQkJCS8vIGNvcnJlY3QgZXZlbiBpZiB0aGVyZSBpcyBubyByZWdpb24gYWZ0ZXIgdGhlIGN1cnNvciBpbiB0aGUgSlNQCi0JCQkvLyBmaWxlCi0JCQlzZXRDdXJzb3JPd25lcihKU1BUeXBlKTsKLQkJfQotCQkvLyBpdGVyYXRlIFhNTENPTlRFTlQgYW5kIENEQVRBIHJlZ2lvbnMKLQkJLy8gbG9vcCBmQ3VycmVudE5vZGUgdW50aWwgeW91IGhpdCA8L2pzcDpzY3JpcHRsZXQ+IChvciBvdGhlciBjbG9zaW5nCi0JCS8vIHRhZyBuYW1lKQotCQl3aGlsZSAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsICYmIGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSAvLyBuZWVkCi0JCS8vIHRvCi0JCS8vIHN0b3AKLQkJLy8gb24KLQkJLy8gdGhlCi0JCS8vIGVuZGluZwotCQkvLyB0YWcKLQkJLy8gbmFtZS4uLgotCQl7Ci0JCQlzdGFydCA9IGdldEN1cnJlbnROb2RlKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWVuZCA9IGdldEN1cnJlbnROb2RlKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlidWZmZXJTaXplID0gYnVmZmVyLmxlbmd0aCgpOwotCQkJQ0RBVEFPZmZzZXQgPSB1bmVzY2FwZVJlZ2lvbihnZXRDdXJyZW50Tm9kZSgpLCBidWZmZXIpOwotCQkJZkluQ29kZVJlZ2lvbiA9IChzdGFydCA8PSBmU291cmNlUG9zaXRpb24gJiYgZlNvdXJjZVBvc2l0aW9uIDw9IGVuZCk7Ci0JCQlpZiAoZkluQ29kZVJlZ2lvbikgewotCQkJCXNldEN1cnNvck93bmVyKEpTUFR5cGUpOwotCQkJCS8vIHRoaXMgb2Zmc2V0IGlzIHNvcnQgb2YgY29tcGxpY2F0ZWQuLi4KLQkJCQkvLyBpdCdzIGNvbXBvc2VkIG9mOgotCQkJCS8vIDEuIHRoZSBsZW5ndGggb2YgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHJlZ2lvbiB1cCB0aWxsCi0JCQkJLy8gd2hlcmUgdGhlIGN1cnNvciBpcwotCQkJCS8vIDIuIG1pbnVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBsb3N0IGluIENEQVRBIHRyYW5zbGF0aW9uCi0JCQkJLy8gMy4gcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBlc2NhcGVkIGJ1ZmZlciBiZWZvcmUgdGhlIGN1cnJlbnQKLQkJCQkvLyByZWdpb24sIGJ1dAotCQkJCS8vIGlzIHN0aWxsIHdpdGhpbiB0aGUganNwIHRhZwotCQkJCXNldFJlbGF0aXZlT2Zmc2V0KChmU291cmNlUG9zaXRpb24gLSBnZXRDdXJyZW50Tm9kZSgpLmdldFN0YXJ0T2Zmc2V0KCkpICsgZ2V0Q3Vyc29yT3duZXIoKS5sZW5ndGgoKSAtIENEQVRBT2Zmc2V0ICsgYnVmZmVyU2l6ZSk7Ci0JCQkJaWYgKEpTUFR5cGUgPT0gRVhQUkVTU0lPTikgewotCQkJCQlzZXRDdXJzb3JJbkV4cHJlc3Npb24odHJ1ZSk7Ci0JCQkJCS8vIGlmIGFuIGV4cHJlc3Npb24sIGFkZCB0aGVuIGxlbmd0aCBvZiB0aGUgZW5jbG9zaW5nCi0JCQkJCS8vIHBhcmVuLi4KLQkJCQkJc2V0UmVsYXRpdmVPZmZzZXQoZ2V0UmVsYXRpdmVPZmZzZXQoKSArIEVYUFJFU1NJT05fUFJFRklYLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKQotCQkJCWFkdmFuY2VOZXh0Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcgotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiB0byBiZSB1bmVzY2FwZWQgKFhNTENvbnRlbnQsIFhNTCBFTlRJVFkKLQkgKiAgICAgICAgICAgIFJFRkVSRU5DRSwgb3IgQ0RBVEEpCi0JICogQHBhcmFtIHNiCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nYnVmZmVyIHRvIGFwcGVuZCB0aGUgdGV4dCB0bwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgaW4gdW5lc2NhcGluZyB0aGlzIHRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHVuZXNjYXBlUmVnaW9uKElUZXh0UmVnaW9uIHIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGhCZWZvcmUgPSAwLCBsZW5ndGhBZnRlciA9IDAsIGNkYXRhX3RhZ3NfbGVuZ3RoID0gMDsKLQkJaWYgKHIgIT0gbnVsbCAmJiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCB8fCByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSkgewotCQkJbGVuZ3RoQmVmb3JlID0gKGdldEN1cnJlbnROb2RlKCkgIT0gcikgPyBnZXRDdXJyZW50Tm9kZSgpLmdldEZ1bGxUZXh0KHIpLmxlbmd0aCgpIDogZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dCgpLmxlbmd0aCgpOwotCQkJcyA9IEVzY2FwZWRUZXh0VXRpbC5nZXRVbmVzY2FwZWRUZXh0KGdldEN1cnJlbnROb2RlKCksIHIpOwotCQkJbGVuZ3RoQWZ0ZXIgPSBzLmxlbmd0aCgpOwotCQkJc2IuYXBwZW5kKHMpOwotCQl9Ci0JCWVsc2UgaWYgKHIgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQlpZiAociBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSAvLyBvbmx5IGludGVyZXN0ZWQgaW4KLQkJCS8vIGNvbnRlbnRzCi0JCQl7Ci0JCQkJLy8gbmF2aWdhdGUgdG8gbmV4dCByZWdpb24gY29udGFpbmVyICh3aGljaCBzaG91bGQgYmUgYSBKU1AKLQkJCQkvLyByZWdpb24pCi0JCQkJSXRlcmF0b3IgaXQgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByKS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQlJVGV4dFJlZ2lvbiB0ZW1wID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCXRlbXAgPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lciB8fCB0ZW1wLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQkJCQlzYi5hcHBlbmQoZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dCh0ZW1wKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodGVtcC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTiB8fCB0ZW1wLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkgewotCQkJCQkJY2RhdGFfdGFnc19sZW5ndGggKz0gdGVtcC5nZXRMZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKGxlbmd0aEJlZm9yZSAtIGxlbmd0aEFmdGVyICsgY2RhdGFfdGFnc19sZW5ndGgpOwotCX0KLQotCS8vCi0JLy8gPGpzcDp1c2VCZWFuPgotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVVzZUJlYW4oSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lcikgewotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyBpZCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGlkUmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiB0eXBlUmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGNsYXNzbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZyBiZWFuTmFtZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGJlYW5OYW1lUmVnaW9uID0gbnVsbDsKLQotCQlJdGVyYXRvciByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIChyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgci5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJYXR0ck5hbWUgPSBhdHRyVmFsdWUgPSBudWxsOwotCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSB7Ci0JCQkJYXR0ck5hbWUgPSBjb250YWluZXIuZ2V0VGV4dChyKS50cmltKCk7Ci0JCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCWF0dHJWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGNvbnRhaW5lci5nZXRUZXh0KHIpKTsKLQkJCQkJfQotCQkJCQkvLyBoYXMgZXF1YWxzLCBidXQgbm8gdmFsdWU/Ci0JCQkJfQotCQkJCS8vIGFuIGF0dHJpYnV0ZSB3aXRoIG5vIGVxdWFscz8KLQkJCX0KLQkJCS8vIChwYSkgbWlnaHQgbmVlZCBkaWZmZXJlbnQgbG9naWMgaGVyZSBpZiB3ZSB3YW5uYSBzdXBwb3J0IG1vcmUKLQkJCWlmIChhdHRyTmFtZSAhPSBudWxsICYmIGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGF0dHJOYW1lLmVxdWFscygiaWQiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQkJaWQgPSBhdHRyVmFsdWU7Ci0JCQkJCWlkUmVnaW9uID0gcjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJjbGFzcyIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQljbGFzc05hbWUgPSBhdHRyVmFsdWU7Ci0JCQkJCWNsYXNzbmFtZVJlZ2lvbiA9IHI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygidHlwZSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQl0eXBlID0gYXR0clZhbHVlOwotCQkJCQl0eXBlUmVnaW9uID0gcjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJiZWFuTmFtZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYmVhbk5hbWUgPSBhdHRyVmFsdWU7Ci0JCQkJCWJlYW5OYW1lUmVnaW9uID0gcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJLy8gVGhlIGlkIGlzIG5vdCBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCQkJaWYgKCFpc1ZhbGlkSmF2YUlkZW50aWZpZXIoaWQpICYmIGlkUmVnaW9uICE9IG51bGwpIHsKLQkJCQlPYmplY3QgcHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oSUpTUFByb2JsZW0uVXNlQmVhbkludmFsaWRJRCwgSVByb2JsZW0uUGFyc2luZ0Vycm9ySW52YWxpZFRva2VuLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BDb3JlTWVzc2FnZXMuSlNQVHJhbnNsYXRvcl8wLCBuZXcgU3RyaW5nW117aWR9KSwgY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KGlkUmVnaW9uKSwgY29udGFpbmVyLmdldFRleHRFbmRPZmZzZXQoaWRSZWdpb24pIC0gMSk7Ci0JCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkKHByb2JsZW0pOwotCQkJfQotCQkJLy8gTm8gVHlwZSBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZAotCQkJaWYgKCgodHlwZSA9PSBudWxsICYmIGNsYXNzTmFtZSA9PSBudWxsKSB8fCAodHlwZSA9PSBudWxsICYmIGJlYW5OYW1lICE9IG51bGwpKSAmJiBpZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IHByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKElKU1BQcm9ibGVtLlVzZUJlYW5NaXNzaW5nVHlwZUluZm8sIElQcm9ibGVtLlVuZGVmaW5lZFR5cGUsIE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BUcmFuc2xhdG9yXzMsIG5ldyBTdHJpbmdbXXtpZH0pLCBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoaWRSZWdpb24pLCBjb250YWluZXIuZ2V0VGV4dEVuZE9mZnNldChpZFJlZ2lvbikgLSAxKTsKLQkJCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5hZGQocHJvYmxlbSk7Ci0JCQl9Ci0JCQkvLyBDYW5ub3Qgc3BlY2lmeSBib3RoIGEgY2xhc3MgYW5kIGEgYmVhbk5hbWUKLQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBiZWFuTmFtZSAhPSBudWxsICYmIGJlYW5OYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJT2JqZWN0IHByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKElKU1BQcm9ibGVtLlVzZUJlYW5BbWJpZ3VvdXNUeXBlLCBJUHJvYmxlbS5BbWJpZ3VvdXNUeXBlLCBKU1BDb3JlTWVzc2FnZXMuSlNQVHJhbnNsYXRvcl8yLCBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbiksIGNvbnRhaW5lci5nZXRUZXh0RW5kT2Zmc2V0KG5hbWVSZWdpb24pIC0gMSk7Ci0JCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkKHByb2JsZW0pOwotCQkJfQotCQkJLyoKLQkJCSAqIE9ubHkgaGF2ZSBhIGNsYXNzIG9yIGEgYmVhbk5hbWUgYXQgdGhpcyBwb2ludCwgYW5kIHBvdGVudGlhbGx5Ci0JCQkgKiBhIHR5cGUgaGFzIGlkIHcvIHR5cGUgYW5kL29yIGNsYXNzbmFtZS9iZWFuTmFtZQotCQkJICovCi0JCQkvLyBUeXBlIGlkID0gbmV3IENsYXNzbmFtZS9CZWFubmFtZSgpOwotCQkJLy8gb3IKLQkJCS8vIFR5cGUgaWQgPSBudWxsOyAvLyBpZiB0aGVyZSBpcyBubyBjbGFzc25hbWUgb3IgYmVhbm5hbWUKLQkJCWlmICgodHlwZSAhPSBudWxsIHx8IGNsYXNzTmFtZSAhPSBudWxsKSkgewotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJdHlwZSA9IGNsYXNzTmFtZTsKLQkJCQkJdHlwZVJlZ2lvbiA9IGNsYXNzbmFtZVJlZ2lvbjsKLQkJCQl9Ci0KLQkJCQkvKiBOb3cgY2hlY2sgdGhlIHR5cGVzIChtdWx0aXBsZSBvZiBnZW5lcmljcyBtYXkgYmUgaW52b2x2ZWQpICovCi0JCQkJTGlzdCBlcnJvclR5cGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCQkJaWYgKCFpc1R5cGVGb3VuZCh0eXBlLCBlcnJvclR5cGVOYW1lcykpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvclR5cGVOYW1lcy5zaXplKCk7IGkrKykgewotCQkJCQkJT2JqZWN0IHByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKElKU1BQcm9ibGVtLkZfUFJPQkxFTV9JRF9MSVRFUkFMLCBJUHJvYmxlbS5VbmRlZmluZWRUeXBlLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BDb3JlTWVzc2FnZXMuSlNQVHJhbnNsYXRvcl8xLCBuZXcgU3RyaW5nW117ZXJyb3JUeXBlTmFtZXMuZ2V0KGkpLnRvU3RyaW5nKCl9KSwgY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KHR5cGVSZWdpb24pLCBjb250YWluZXIuZ2V0VGV4dEVuZE9mZnNldCh0eXBlUmVnaW9uKSAtIDEpOwotCQkJCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkKHByb2JsZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgcHJlZml4ID0gdHlwZSArICIgIiArIGlkICsgIiA9ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlTdHJpbmcgc3VmZml4ID0gIm51bGw7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotCQkJCQkJc3VmZml4ID0gIm5ldyAiICsgY2xhc3NOYW1lICsgIigpOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZWxzZSBpZiAoYmVhbk5hbWUgIT0gbnVsbCkKLQkJCQkJCXN1ZmZpeCA9ICIoIiArIHR5cGUgKyAiKSBqYXZhLmJlYW5zLkJlYW5zLmluc3RhbnRpYXRlKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgXCIiICsgYmVhbk5hbWUgKyAiXCIpOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlhcHBlbmRUb0J1ZmZlcihwcmVmaXggKyBzdWZmaXgsIGZVc2VyQ29kZSwgdHJ1ZSwgZkN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUeXBlRm91bmQoU3RyaW5nIHJhd1R5cGVWYWx1ZSwgTGlzdCBlcnJvclR5cGVOYW1lcykgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0RmlsZSgpLmdldFByb2plY3QoKTsKLQkJSUphdmFQcm9qZWN0IHAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWlmIChwLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgdHlwZXNbXSA9IG5ldyBTdHJpbmdbM107Ci0JCQlpZiAocmF3VHlwZVZhbHVlLmluZGV4T2YoJzwnKSA+IDApIHsKLQkJCQkvLyBKU1IgMTQgOiBHZW5lcmljcyBhcmUgYmVpbmcgdXNlZCwgcGFyc2UgdGhlbSBvdXQKLQkJCQl0cnkgewotCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJhd1R5cGVWYWx1ZSk7Ci0JCQkJCS8vIGdlbmVyaWMKLQkJCQkJdHlwZXNbMF0gPSB0b2tlci5uZXh0VG9rZW4oIjwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyB0eXBlIDEgb3Iga2V5Ci0JCQkJCXR5cGVzWzFdID0gdG9rZXIubmV4dFRva2VuKCIsPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHR5cGUgMiBvciB2YWx1ZQotCQkJCQl0eXBlc1syXSA9IHRva2VyLm5leHRUb2tlbigiLD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQljYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFN0cmluZ1Rva2VuaXplciBmYWlsdXJlIHdpdGggdW5zdXBwb3J0ZWQgc3ludGF4Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdHlwZXNbMF0gPSByYXdUeXBlVmFsdWU7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodHlwZXNbaV0gIT0gbnVsbCkgewotCQkJCQkvLyByZW1vdmUgYW55IGFycmF5IHN1ZmZpeGVzIAotCQkJCQlpZiAodHlwZXNbaV0uaW5kZXhPZignWycpID4gMCkgewotCQkJCQkJdHlwZXNbaV0gPSB0eXBlc1tpXS5zdWJzdHJpbmcoMCwgdHlwZXNbaV0uaW5kZXhPZignWycpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCS8vIHJlbW92ZSBhbnkgImV4dGVuZHMiIHByZWZpeGVzIChKU1IgMTQpCi0JCQkJCWlmICh0eXBlc1tpXS5pbmRleE9mKCJleHRlbmRzIikgPiAwKSB7Ci0JCQkJCQl0eXBlc1tpXSA9IFN0cmluZ1V0aWxzLnN0cmlwKHR5cGVzW2ldLnN1YnN0cmluZyh0eXBlc1tpXS5pbmRleE9mKCJleHRlbmRzIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJYWRkTmFtZVRvTGlzdElmVHlwZU5vdEZvdW5kKHAsIHR5cGVzW2ldLCBlcnJvclR5cGVOYW1lcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlcnJvclR5cGVOYW1lcy5pc0VtcHR5KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGROYW1lVG9MaXN0SWZUeXBlTm90Rm91bmQoSUphdmFQcm9qZWN0IHAsIFN0cmluZyB0eXBlTmFtZSwgTGlzdCBjb2xsZWN0ZWROYW1lc05vdEZvdW5kKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCQkJCUlUeXBlIHR5cGUgPSBwLmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJCQlpZiAodHlwZSA9PSBudWxsIHx8ICF0eXBlLmV4aXN0cygpKSB7Ci0JCQkJCWNvbGxlY3RlZE5hbWVzTm90Rm91bmQuYWRkKHR5cGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBOb3QgYSBKYXZhIFByb2plY3QKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSmF2YUlkZW50aWZpZXIoU3RyaW5nIGlkKSB7Ci0JCWNoYXJbXSBpZENoYXJzID0gaWQudG9DaGFyQXJyYXkoKTsKLQkJaWYgKGlkQ2hhcnMubGVuZ3RoIDwgMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChpZENoYXJzWzBdKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBpZENoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpc1ZhbGlkID0gaXNWYWxpZCAmJiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoaWRDaGFyc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCi0JZmluYWwgcHVibGljIGludCBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckluRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JJbkV4cHJlc3Npb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3Vyc29ySW5FeHByZXNzaW9uKGJvb2xlYW4gaW4pIHsKLQkJZkN1cnNvckluRXhwcmVzc2lvbiA9IGluOwotCX0KLQotCWZpbmFsIHB1YmxpYyB2b2lkIHNldFNvdXJjZUN1cnNvcihpbnQgaSkgewotCQlmU291cmNlUG9zaXRpb24gPSBpOwotCX0KLQotCWZpbmFsIHB1YmxpYyBpbnQgZ2V0U291cmNlUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmU291cmNlUG9zaXRpb247Ci0JfQotCi0JZmluYWwgcHVibGljIFRMRENNRG9jdW1lbnRNYW5hZ2VyIGdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKCkgewotCQlyZXR1cm4gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZU9mZnNldChpbnQgcmVsYXRpdmVPZmZzZXQpIHsKLQkJdGhpcy5mUmVsYXRpdmVPZmZzZXQgPSByZWxhdGl2ZU9mZnNldDsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgaW50IGdldFJlbGF0aXZlT2Zmc2V0KCkgewotCQlyZXR1cm4gZlJlbGF0aXZlT2Zmc2V0OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDdXJzb3JPd25lcihTdHJpbmdCdWZmZXIgY3Vyc29yT3duZXIpIHsKLQkJdGhpcy5mQ3Vyc29yT3duZXIgPSBjdXJzb3JPd25lcjsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEN1cnNvck93bmVyKCkgewotCQlyZXR1cm4gZkN1cnNvck93bmVyOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZXRDdXJyZW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlKSB7Ci0JCXJldHVybiB0aGlzLmZDdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlOwotCX0KLQotCWZpbmFsIHB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEN1cnJlbnROb2RlKCkgewotCQlyZXR1cm4gZkN1cnJlbnROb2RlOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0RUxQcm9ibGVtcygpIHsKLQkJcmV0dXJuIGZFTFByb2JsZW1zOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRNb2RlbFBhdGgoKSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXBhdGggPSBuZXcgUGF0aChzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlQ29kYXMoKSB7Ci0JCWZQcm9jZXNzSW5jbHVkZXMgPSBmYWxzZTsKLQkJSVBhdGggbW9kZWxwYXRoID0gZ2V0TW9kZWxQYXRoKCk7Ci0JCWlmIChtb2RlbHBhdGggIT0gbnVsbCkgewotCQkJUHJvcGVydHlHcm91cFtdIHByb3BlcnR5R3JvdXBzID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0UHJvcGVydHlHcm91cHMobW9kZWxwYXRoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcGVydHlHcm91cHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJUGF0aFtdIGNvZGFzID0gcHJvcGVydHlHcm91cHNbal0uZ2V0SW5jbHVkZUNvZGEoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvZGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghZ2V0SW5jbHVkZXMoKS5jb250YWlucyhjb2Rhc1tpXS50b1N0cmluZygpKSAmJiAhY29kYXNbaV0uZXF1YWxzKG1vZGVscGF0aCkpIHsKLQkJCQkJCWdldEluY2x1ZGVzKCkucHVzaChjb2Rhc1tpXSk7Ci0JCQkJCQlKU1BJbmNsdWRlUmVnaW9uSGVscGVyIGhlbHBlciA9IG5ldyBKU1BJbmNsdWRlUmVnaW9uSGVscGVyKHRoaXMsIHRydWUpOwotCQkJCQkJaGVscGVyLnBhcnNlKGNvZGFzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkJZ2V0SW5jbHVkZXMoKS5wb3AoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmUHJvY2Vzc0luY2x1ZGVzID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlUHJlbHVkZXMoKSB7Ci0JCWZQcm9jZXNzSW5jbHVkZXMgPSBmYWxzZTsKLQkJSVBhdGggbW9kZWxwYXRoID0gZ2V0TW9kZWxQYXRoKCk7Ci0JCWlmIChtb2RlbHBhdGggIT0gbnVsbCkgewotCQkJUHJvcGVydHlHcm91cFtdIHByb3BlcnR5R3JvdXBzID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0UHJvcGVydHlHcm91cHMobW9kZWxwYXRoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcGVydHlHcm91cHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJUGF0aFtdIHByZWx1ZGVzID0gcHJvcGVydHlHcm91cHNbal0uZ2V0SW5jbHVkZVByZWx1ZGUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWx1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghZ2V0SW5jbHVkZXMoKS5jb250YWlucyhwcmVsdWRlc1tpXS50b1N0cmluZygpKSAmJiAhcHJlbHVkZXNbaV0uZXF1YWxzKG1vZGVscGF0aCkpIHsKLQkJCQkJCWdldEluY2x1ZGVzKCkucHVzaChwcmVsdWRlc1tpXSk7Ci0JCQkJCQlKU1BJbmNsdWRlUmVnaW9uSGVscGVyIGhlbHBlciA9IG5ldyBKU1BJbmNsdWRlUmVnaW9uSGVscGVyKHRoaXMsIHRydWUpOwotCQkJCQkJaGVscGVyLnBhcnNlKHByZWx1ZGVzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkJZ2V0SW5jbHVkZXMoKS5wb3AoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmUHJvY2Vzc0luY2x1ZGVzID0gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvU3RhY2tNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9TdGFja01hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDEyNjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9TdGFja01hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogQGF1dGhvciBuaXRpbgotICogCi0gKi8KLWNsYXNzIFN0YWNrTWFwIHsKLQotCXByaXZhdGUgTWFwIGZJbnRlcm5hbE1hcCA9IG51bGw7Ci0KLQlwdWJsaWMgU3RhY2tNYXAoKSB7Ci0JCWZJbnRlcm5hbE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgbWFwcGluZ3MgZnJvbSB0aGlzIFN0YWNrTWFwCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWZJbnRlcm5hbE1hcC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vc3QgcmVjZW50bHkgcHVzaGVkIHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlCi0JICogc3BlY2lmaWVkIGtleS4gUmV0dXJucyA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBtYXAgY29udGFpbnMgbm8gbWFwcGluZwotCSAqIGZvciB0aGlzIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBrZXkgd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZC4KLQkgKiBAcmV0dXJuIHRoZSBtb3N0IHJlY2VudGx5IHB1dCB2YWx1ZSB0byB3aGljaCB0aGlzIG1hcCBtYXBzIHRoZQotCSAqICAgICAgICAgc3BlY2lmaWVkIGtleSwgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vCi0JICogICAgICAgICBtYXBwaW5nIGZvciB0aGlzIGtleS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHBlZWsoT2JqZWN0IGtleSkgewotCQlTdGFjayBzdGFjayA9IChTdGFjaykgZkludGVybmFsTWFwLmdldChrZXkpOwotCQlpZiAoc3RhY2sgIT0gbnVsbCkgewotCQkJT2JqZWN0IG8gPSBzdGFjay5wZWVrKCk7Ci0JCQlpZiAoc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJZkludGVybmFsTWFwLnJlbW92ZShrZXkpOwotCQkJfQotCQkJcmV0dXJuIG87Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhpcyBtYXAuIElmCi0JICogdGhlIG1hcCBwcmV2aW91c2x5IGNvbnRhaW5lZCBhIG1hcHBpbmcgZm9yIHRoaXMga2V5LCB0aGUgb2xkIHZhbHVlIGlzCi0JICogcHVzaGVkIG9udG8gdGhlIHRvcCBvZiB0aGlzIGtleSdzIHByaXZhdGUgc3RhY2suCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAga2V5IHdpdGggd2hpY2ggdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyB0byBiZSBhc3NvY2lhdGVkLgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgotCSAqIEByZXR1cm4gbmV3ZXN0IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQga2V5Ci0JICogCi0JICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSA8dHQ+cHV0PC90dD4gb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcwotCSAqICAgICAgICAgICAgIFN0YWNrTWFwLgotCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQga2V5IG9yIHZhbHVlIHByZXZlbnRzIGl0IGZyb20KLQkgKiAgICAgICAgICAgICBiZWluZyBzdG9yZWQgaW4gdGhpcyBTdGFja01hcC4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHNvbWUgYXNwZWN0IG9mIHRoaXMga2V5IG9yIHZhbHVlIHByZXZlbnRzIGl0IGZyb20gYmVpbmcKLQkgKiAgICAgICAgICAgICBzdG9yZWQgaW4gdGhpcyBTdGFja01hcC4KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uLAotCSAqICAgICAgICAgICAgIGFzIHRoaXMgbWFwIGRvZXMgbm90IHBlcm1pdCA8dHQ+bnVsbDwvdHQ+IGtleXMgb3IgdmFsdWVzCi0JICovCi0JcHVibGljIE9iamVjdCBwdXNoKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlTdGFjayBzdGFjayA9IChTdGFjaykgZkludGVybmFsTWFwLmdldChrZXkpOwotCQlpZiAoc3RhY2sgPT0gbnVsbCkgewotCQkJc3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJCWZJbnRlcm5hbE1hcC5wdXQoa2V5LCBzdGFjayk7Ci0JCX0KLQkJT2JqZWN0IG8gPSBzdGFjay5wdXNoKHZhbHVlKTsKLQkJcmV0dXJuIG87Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbW9zdC1yZWNlbnQgbWFwcGluZyBmb3IgdGhpcyBrZXkgZnJvbSB0aGlzIFN0YWNrTWFwIGlmIGl0Ci0JICogaXMgcHJlc2VudC4KLQkgKiAKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgbWFwIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB0aGUga2V5LCBvcgotCSAqIDx0dD5udWxsPC90dD4gaWYgdGhlIG1hcCBjb250YWluZWQgbm8gbWFwcGluZyBmb3IgdGhpcyBrZXkuIFRoZSBtYXAKLQkgKiB3aWxsIG5vdCBjb250YWluIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBrZXkgb25jZSB0aGUgY2FsbCByZXR1cm5zLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIGtleSB3aG9zZSBzdGFjayBpcyB0byBiZSBwb3BwZWQKLQkgKiBAcmV0dXJuIG1vc3QtcmVjZW50bHkgcHVzaGVkIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQga2V5LCBvcgotCSAqICAgICAgICAgPHR0Pm51bGw8L3R0PiBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5LgotCSAqIAotCSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIGtleSBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUgZm9yIHRoaXMgbWFwLgotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUga2V5IGlzIDx0dD5udWxsPC90dD4gYXMgdGhpcyBjbGFzcyBkb2VzIG5vdCBwZXJtaXQKLQkgKiAgICAgICAgICAgICA8dHQ+bnVsbDwvdHQ+IGtleXMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHBvcChPYmplY3Qga2V5KSB7Ci0JCVN0YWNrIHN0YWNrID0gKFN0YWNrKSBmSW50ZXJuYWxNYXAuZ2V0KGtleSk7Ci0JCWlmIChzdGFjayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgbyA9IHN0YWNrLnBvcCgpOwotCQkJaWYgKHN0YWNrLmlzRW1wdHkoKSkgewotCQkJCWZJbnRlcm5hbE1hcC5yZW1vdmUoa2V5KTsKLQkJCX0KLQkJCXJldHVybiBvOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotICAgIC8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgU3RhY2tNYXAsIHRoZSBzdW0gb2YgdGhlIHNpemVzIG9mCi0JICogZXZlcnkgcmVtZW1iZXJlZCBzdGFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIG1hcC4KLQkgKi8KLQlpbnQgc2l6ZSgpIHsKLQkJaW50IHNpemUgPSAwOwotCQlJdGVyYXRvciBpID0gZkludGVybmFsTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ29sbGVjdGlvbiBjID0gKENvbGxlY3Rpb24pIGkubmV4dCgpOwotCQkJc2l6ZSArPSBjLnNpemUoKTsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBvZiB0aGUgdmFsdWVzIG9mIHRoaXMgU3RhY2tNYXAuCi0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWVzIG9mIGV2ZXJ5IFN0YWNrIHdpdGhpbiB0aGlzIFN0YWNrTWFwLgotCSAqLwotCUNvbGxlY3Rpb24gdmFsdWVzKCkgewotCQlDb2xsZWN0aW9uIHZhbHVlcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUl0ZXJhdG9yIGkgPSBmSW50ZXJuYWxNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDb2xsZWN0aW9uIGMgPSAoQ29sbGVjdGlvbikgaS5uZXh0KCk7Ci0JCQl2YWx1ZXMuYWRkQWxsKGMpOwotCQl9Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTI1ZmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9UYWdUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi1jbGFzcyBUYWdUcmFuc2xhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgewotCVRhZ1RyYW5zbGF0aW9uQWRhcHRlcihJRE9NTW9kZWwgeG1sTW9kZWwpIHsKLQkJc3VwZXIoeG1sTW9kZWwpOwotCX0KLQotCUpTUFRyYW5zbGF0b3IgY3JlYXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWdUcmFuc2xhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9UYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0M2U5MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotcHVibGljIGNsYXNzIFRhZ1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgVGFnVHJhbnNsYXRpb25BZGFwdGVyIGZBZGFwdGVyID0gbnVsbDsKLQotCXB1YmxpYyBUYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgVGFnVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUgJiYgZkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZkFkYXB0ZXIgPSBuZXcgVGFnVHJhbnNsYXRpb25BZGFwdGVyKCgoSURPTU5vZGUpIHRhcmdldCkuZ2V0TW9kZWwoKSk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBUYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIGNyZWF0ZWQgYWRhcHRlcjogIiArIGZBZGFwdGVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZBZGFwdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBUYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIHJlbGVhc2luZyBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWZBZGFwdGVyLnJlbGVhc2UoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9UYWdUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkN2MxN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWNsYXNzIFRhZ1RyYW5zbGF0b3IgZXh0ZW5kcyBKU1BUcmFuc2xhdG9yIHsKLQotCXB1YmxpYyBUYWdUcmFuc2xhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlmQ2xhc3NIZWFkZXIgPSAicHVibGljIGNsYXNzIF9UYWdIYW5kbGVyIGV4dGVuZHMgIjsgLy8kTk9OLU5MUy0xJAotCQlmQ2xhc3NuYW1lID0gIl9UYWdIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZJbXBsaWNpdEltcG9ydHMgPSAiaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOyIgKyBFTkRMICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCi0JCWZTZXJ2aWNlSGVhZGVyID0gInB1YmxpYyB2b2lkIGRvVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBTa2lwUGFnZUV4Y2VwdGlvbiB7IiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJKc3BDb250ZXh0IGpzcENvbnRleHQgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbiA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXIgb3V0ID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZyBjb25maWcgPSBudWxsOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIAotCi0JCWZTdXBlcmNsYXNzID0gImphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWdTdXBwb3J0IjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2ZTQxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvWE1MSlNQUmVnaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZpbGVDb250ZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBQYXJzZXIvaGVscGVyIGNsYXNzIGZvciBKU1BUcmFuc2xhdG9yLiBVc2VkIGZvciBwYXJzaW5nIFhNTC1KU1AgcmVnaW9ucyAoaW4KLSAqIGEgc2NyaXB0IGJsb2NrKSBBIGxvdCBvZiBsb2dpYyBib3Jyb3dlZCBmcm9tIFRMRENNRG9jdW1lbnRNYW5hZ2VyLiBUaGVyZQotICogc2hvdWxkIGJlIG9ubHkgb25lIFhNTEpTUFJlZ2lvbkhlbHBlciBwZXIgdGV4dCBmaWxlCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLWNsYXNzIFhNTEpTUFJlZ2lvbkhlbHBlciBpbXBsZW1lbnRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCXByaXZhdGUgZmluYWwgSlNQVHJhbnNsYXRvciBmVHJhbnNsYXRvcjsKLQlwcm90ZWN0ZWQgSlNQU291cmNlUGFyc2VyIGZMb2NhbFBhcnNlciA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBmVGV4dFRvUGFyc2UgPSBudWxsOwotCS8vIG5lZWQgdGhpcyBpZiBub3QgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCAoZWcuIHBhcnNpbmcganVzdCBhCi0JLy8gc2NyaXB0IGJsb2NrKQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0T2ZUZXh0VG9QYXJzZSA9IDA7Ci0JLy8gbmFtZSBvZiB0aGUgb3BlbiB0YWcgdGhhdCB3YXMgbGFzdCBoYW5kbGVkIChpZiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBpdCkKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUYWduYW1lID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUZXh0QmVmb3JlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZVbmVzY2FwZWRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdHJpcHBlZFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCS8vIGZvciByZWNvbmNpbGluZyBjdXJzb3IgcG9zaXRpb24gbGF0ZXIKLQlpbnQgZlBvc3NpYmxlT3duZXIgPSBKU1BUcmFuc2xhdG9yLlNDUklQVExFVDsKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHJhbnNsYXRlZCBzb3VyY2UgYXBwZW5kcyBhcmUgaW5kaWNhdGVkIGFzCi0JICogImluZGlyZWN0IiwgYWZmZWN0aW5nIGhvdyBvZmZzZXRzIGFyZSBtYXBwZWQuCi0JICovCi0JYm9vbGVhbiBmQXBwZW5kQXNJbmRpcmVjdFNvdXJjZTsKLQotCXB1YmxpYyBYTUxKU1BSZWdpb25IZWxwZXIoSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBib29sZWFuIGFwcGVuZEFzSW5kaXJlY3RTb3VyY2UpIHsKLQkJZ2V0TG9jYWxQYXJzZXIoKS5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQl0aGlzLmZUcmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKLQkJZkFwcGVuZEFzSW5kaXJlY3RTb3VyY2UgPSBhcHBlbmRBc0luZGlyZWN0U291cmNlOwotCX0KLQotCXByb3RlY3RlZCBKU1BTb3VyY2VQYXJzZXIgZ2V0TG9jYWxQYXJzZXIoKSB7Ci0JCWlmIChmTG9jYWxQYXJzZXIgPT0gbnVsbCkKLQkJCWZMb2NhbFBhcnNlciA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJcmV0dXJuIGZMb2NhbFBhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZkxvY2FsUGFyc2VyLmFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHRleHRUb1BhcnNlKSB7Ci0JCXJlc2V0KHRleHRUb1BhcnNlLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgdGV4dFRvUGFyc2UsIGludCBzdGFydCkgewotCQlmU3RhcnRPZlRleHRUb1BhcnNlID0gc3RhcnQ7Ci0JCWdldExvY2FsUGFyc2VyKCkucmVzZXQodGV4dFRvUGFyc2UpOwotCQlmVGV4dFRvUGFyc2UgPSB0ZXh0VG9QYXJzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JjZVBhcnNlKCkgewotCQlnZXRMb2NhbFBhcnNlcigpLmdldERvY3VtZW50UmVnaW9ucygpOwotCQlmTG9jYWxQYXJzZXIgPSBudWxsOwotCX0KLQotCS8qCi0JICogcGFyc2UgYW4gZW50aXJlIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIHBhcnNlKFN0cmluZyBmaWxlUGF0aCkgewotCQlnZXRMb2NhbFBhcnNlcigpLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCS8vIGZyb20gb3V0ZXIgY2xhc3MKLQkJTGlzdCBibG9ja01hcmtlcnMgPSB0aGlzLmZUcmFuc2xhdG9yLmdldEJsb2NrTWFya2VycygpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRMb2NhbFBhcnNlcigpKTsKLQkJU3RyaW5nIGNvbnRlbnRzID0gZ2V0Q29udGVudHMoZmlsZVBhdGgpOwotCQlpZiAoY29udGVudHMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gdGhpcyBhZGRzIHRoZSBjdXJyZW50IG1hcmtlcnMgZnJvbSB0aGUgb3V0ZXIgY2xhc3MgbGlzdAotCQkvLyB0byB0aGlzIHBhcnNlciBzbyBwYXJzaW5nIHdvcmtzIGNvcnJlY3RseQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJYWRkQmxvY2tNYXJrZXIoKEJsb2NrTWFya2VyKSBibG9ja01hcmtlcnMuZ2V0KGkpKTsKLQkJfQotCQkvLyBSQVRMQzAxMTM5NzcwCi0vLwkJZ2V0TG9jYWxQYXJzZXIoKS5nZXROZXN0YWJsZVByZWZpeGVzKCkuYWRkQWxsKCgoSlNQU291cmNlUGFyc2VyKWZUcmFuc2xhdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFBhcnNlcigpKS5nZXROZXN0YWJsZVByZWZpeGVzKCkpOwotCQlUTERDTURvY3VtZW50TWFuYWdlciBkb2N1bWVudE1hbmFnZXIgPSB0aGlzLmZUcmFuc2xhdG9yLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCWlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotCQkJTGlzdCB0cmFja2VycyA9IGRvY3VtZW50TWFuYWdlci5nZXRUYWdsaWJUcmFja2VycygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHRyYWNrZXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYWdsaWJUcmFja2VyIHRyYWNrZXIgPSAoVGFnbGliVHJhY2tlcikgaXQubmV4dCgpOwotCQkJCVN0cmluZyBwcmVmaXggPSB0cmFja2VyLmdldFByZWZpeCgpOwotCQkJCWdldExvY2FsUGFyc2VyKCkuZ2V0TmVzdGFibGVQcmVmaXhlcygpLmFkZChuZXcgVGFnTWFya2VyKHByZWZpeCkpOwotCQkJfQotCQl9Ci0KLQkJcmVzZXQoY29udGVudHMpOwotCQkvLyBmb3JjZVBhcnNlKCk7Ci0JCWRvY3VtZW50LnNldChjb250ZW50cyk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3Vyc29yID0gZG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKGN1cnNvciAhPSBudWxsKSB7Ci0JCQlub2RlUGFyc2VkKGN1cnNvcik7Ci0JCQljdXJzb3IgPSBjdXJzb3IuZ2V0TmV4dCgpOwotCQl9Ci0JCWdldExvY2FsUGFyc2VyKCkuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcih0aGlzKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvKgotCSAqIGxpc3RlbnMgdG8gcGFyc2VyIG5vZGUgcGFyc2VkIGV2ZW50cyBhZGRzIHRvIGxvY2FsIHNjcmlwbGV0LAotCSAqIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uIGJ1ZmZlcnMgZGV0ZXJtaW5lcyB3aGljaCB0eXBlIG9mIHJlZ2lvbiB0aGUKLQkgKiBjdXJzb3IgaXMgaW4sIGFuZCBhZGp1c3RzIGN1cnNvciBvZmZzZXQgYWNjb3JkaW5nbHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQotCQl0cnkgewotCQkJaWYgKGlzSlNQRW5kUmVnaW9uKHNkUmVnaW9uKSkgewotCQkJCVN0cmluZyBuYW1lU3RyID0gZ2V0UmVnaW9uTmFtZShzZFJlZ2lvbik7Ci0JCQkJaWYgKGlzUG9zc2libGVDdXN0b21UYWcobmFtZVN0cikpIHsKLQkJCQkJLy8gdGhpcyBjdXN0b20gdGFnIG1heSBkZWZpbmUgdmFyaWFibGVzCi0JCQkJCXRoaXMuZlRyYW5zbGF0b3IuYWRkVGFnbGliVmFyaWFibGVzKG5hbWVTdHIsIHNkUmVnaW9uKTsKLQkJCQl9Ci0JCQkJZlRhZ25hbWUgPSBudWxsOwotCQkJfQotCQkJZWxzZSBpZiAoaXNKU1BTdGFydFJlZ2lvbihzZFJlZ2lvbikpIHsKLQkJCQlTdHJpbmcgbmFtZVN0ciA9IGdldFJlZ2lvbk5hbWUoc2RSZWdpb24pOwotCQkJCWlmIChzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCQlpZiAoaXNQb3NzaWJsZUN1c3RvbVRhZyhuYW1lU3RyKSkgewotCQkJCQkJLy8gdGhpcyBjdXN0b20gdGFnIG1heSBkZWZpbmUgdmFyaWFibGVzCi0JCQkJCQl0aGlzLmZUcmFuc2xhdG9yLmFkZFRhZ2xpYlZhcmlhYmxlcyhuYW1lU3RyLCBzZFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGlzSlNQUmVnaW9uKG5hbWVTdHIpKQotCQkJCQlmVGFnbmFtZSA9IG5hbWVTdHI7Ci0JCQkJZWxzZQotCQkJCQlmVGFnbmFtZSA9IG51bGw7Ci0KLQotCQkJCS8vIHRoaXMgc2VjdGlvbiBhc3N1bWVzIGltcG9ydGFudCBjb250ZW50ICh0byB0cmFuc2xhdGUpCi0JCQkJLy8gSVMgdGhlIG9wZW5pbmcgdGFnCi0KLQkJCQkvLyBoYW5kbGUgaW5jbHVkZSBhbmQgZGlyZWN0aXZlCi0JCQkJaWYgKGZUYWduYW1lICE9IG51bGwgJiYgc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKSB7Ci0JCQkJCXByb2Nlc3NPdGhlclJlZ2lvbnMoc2RSZWdpb24pOwotCQkJCX0KLQotCi0JCQkJLy8gaGFuZGxlIGpzcDp1c2VCZWFuCi0JCQkJaWYgKGZUYWduYW1lICE9IG51bGwgJiYgZlRhZ25hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pKSB7Ci0JCQkJCXByb2Nlc3NVc2VCZWFuKHNkUmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCBzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQkJLy8gdGhpcyBzZWN0aW9uIGFzc3VtZXMgaW1wb3J0YW50IGNvbnRlbnQgKHRvIHRyYW5zbGF0ZSkKLQkJCQkvLyBpcyBBRlRFUiB0aGUgb3BlbmluZyB0YWcKLQkJCQlpZiAoZlRhZ25hbWUgIT0gbnVsbCkgewotCQkJCQkvLyBhc3NpZ24gY29udGVudHMgdG8gb25lIG9mIHRoZSB0YWJsZXMKLQkJCQkJaWYgKGlzU2NyaXB0bGV0KGZUYWduYW1lKSkgewotCQkJCQkJcHJvY2Vzc1NjcmlwdGxldChzZFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNFeHByZXNzaW9uKGZUYWduYW1lKSkgewotCQkJCQkJcHJvY2Vzc0V4cHJlc3Npb24oc2RSZWdpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzRGVjbGFyYXRpb24oZlRhZ25hbWUpKSB7Ci0JCQkJCQlwcm9jZXNzRGVjbGFyYXRpb24oc2RSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlRhZ25hbWUgPSBudWxsOwotCQkJfQotCQkJLy8gdGhpcyB1cGRhdGVzIGN1cnNvciBwb3NpdGlvbgotCQkJY2hlY2tDdXJzb3JJblJlZ2lvbihzZFJlZ2lvbik7Ci0JCX0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZ2dpbmcgdGhpcyBleGNlcHRpb24gdGhhdCBJJ3ZlIHNlZW4gYSBjb3VwbGUgb2YgdGltZXMuLi4KLQkJCS8vIHNlZW1zIHRvIGhhcHBlbiBkdXJpbmcgc2h1dGRvd24gb2YgdW5pdCB0ZXN0cywgYXQgd2hpY2gKLQkJCS8vIHBvaW50IExvZ2dlciBoYXMgYWxyZWFkeSBiZWVuIHVubG9hZGVkCi0JCQl0cnkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlhNTEpTUFJlZ2lvbkhlbHBlcjogZXhjZXB0aW9uIGluIG5vZGUgcGFyc2luZyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZXgpIHsKLQkJCQkvLyBkbyBub3RoaW5nLCBzaW5jZSB3ZSdyZSBqdXN0IGVuZGluZwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ3Vyc29ySW5SZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQkvLyBpZiBjdXJzb3IgaXMgaW4gdGhpcyByZWdpb24uLi4KLQkJaWYgKHRoaXMuZlRyYW5zbGF0b3IuZ2V0U291cmNlUG9zaXRpb24oKSA+PSBmU3RhcnRPZlRleHRUb1BhcnNlICsgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSAmJiB0aGlzLmZUcmFuc2xhdG9yLmdldFNvdXJjZVBvc2l0aW9uKCkgPD0gZlN0YXJ0T2ZUZXh0VG9QYXJzZSArIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKSB7Ci0JCQlpbnQgZW5kT2ZOYW1lVGFnID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBvZmZzZXQgPSBmVGV4dEJlZm9yZS5sZW5ndGgoKSAtIGZTdHJpcHBlZFRleHQubGVuZ3RoKCk7Ci0JCQkvLyBvZmZzZXQgaW4gYWRkdGlvbiB0byB3aGF0J3MgYWxyZWFkeSBpbiB0aGUgYnVmZmVyCi0JCQl0aGlzLmZUcmFuc2xhdG9yLnNldFJlbGF0aXZlT2Zmc2V0KHRoaXMuZlRyYW5zbGF0b3IuZ2V0U291cmNlUG9zaXRpb24oKSAtIChmU3RhcnRPZlRleHRUb1BhcnNlICsgZW5kT2ZOYW1lVGFnKSAtIG9mZnNldCk7Ci0JCQkvLyBvdXRlciBjbGFzcyBtZXRob2QKLQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0Q3Vyc29yT3duZXIoZlBvc3NpYmxlT3duZXIpOwotCQkJLy8gYWRkIGxlbmd0aCBvZiB3aGF0J3MgYWxyZWFkeSBpbiB0aGUgYnVmZmVyCi0JCQl0aGlzLmZUcmFuc2xhdG9yLnNldFJlbGF0aXZlT2Zmc2V0KHRoaXMuZlRyYW5zbGF0b3IuZ2V0UmVsYXRpdmVPZmZzZXQoKSArIHRoaXMuZlRyYW5zbGF0b3IuZ2V0Q3Vyc29yT3duZXIoKS5sZW5ndGgoKSk7Ci0JCQlpZiAoZlBvc3NpYmxlT3duZXIgPT0gSlNQVHJhbnNsYXRvci5FWFBSRVNTSU9OKSB7Ci0JCQkJLy8gYWRkIGxlbmd0aCBvZiBleHByZXNzaW9uIHByZWZpeCBpZiBuZWNlc3NhcnkuLi4KLQkJCQl0aGlzLmZUcmFuc2xhdG9yLnNldFJlbGF0aXZlT2Zmc2V0KHRoaXMuZlRyYW5zbGF0b3IuZ2V0UmVsYXRpdmVPZmZzZXQoKSArIEpTUFRyYW5zbGF0b3IuRVhQUkVTU0lPTl9QUkVGSVgubGVuZ3RoKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlY2xhcmF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJlcGFyZVRleHQoc2RSZWdpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhmU3RyaXBwZWRUZXh0LCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCksIGZBcHBlbmRBc0luZGlyZWN0U291cmNlKTsKLQkJZlBvc3NpYmxlT3duZXIgPSBKU1BUcmFuc2xhdG9yLkRFQ0xBUkFUSU9OOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFeHByZXNzaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJlcGFyZVRleHQoc2RSZWdpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVFeHByZXNzaW9uU3RyaW5nKGZTdHJpcHBlZFRleHQsIGN1cnJlbnROb2RlLCBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKSwgZkFwcGVuZEFzSW5kaXJlY3RTb3VyY2UpOwotCQlmUG9zc2libGVPd25lciA9IEpTUFRyYW5zbGF0b3IuRVhQUkVTU0lPTjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzU2NyaXB0bGV0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJlcGFyZVRleHQoc2RSZWdpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZlN0cmlwcGVkVGV4dCwgY3VycmVudE5vZGUsIGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnROb2RlLmdldExlbmd0aCgpLCBmQXBwZW5kQXNJbmRpcmVjdFNvdXJjZSk7Ci0JCWZQb3NzaWJsZU93bmVyID0gSlNQVHJhbnNsYXRvci5TQ1JJUFRMRVQ7Ci0JfQotCi0JLyoKLQkgKiBTdWJzdGl0dXRlcyB2YWx1ZXMgZm9yIGVudGl0eSByZWZlcmVuY2VzLCBzdHJpcHMgQ0RBVEEgdGFncywgYW5kIGtlZXBzCi0JICogdHJhY2sgb2Ygc3RyaW5nIGxlbmd0aChzKSBmb3IgY3Vyc29yIHBvc2l0aW9uIGNhbGN1bGF0aW9uIGxhdGVyLiBAcGFyYW0KLQkgKiBzZFJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJZlRleHRCZWZvcmUgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQkJZlVuZXNjYXBlZFRleHQgPSBFc2NhcGVkVGV4dFV0aWwuZ2V0VW5lc2NhcGVkVGV4dChmVGV4dEJlZm9yZSk7Ci0JCWZTdHJpcHBlZFRleHQgPSB0aGlzLmZUcmFuc2xhdG9yLnN0cmlwQ0RBVEEoZlVuZXNjYXBlZFRleHQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NVc2VCZWFuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJaWYgKGZUYWduYW1lICE9IG51bGwgJiYgaXNVc2VCZWFuKGZUYWduYW1lKSkgewotCi0JCQlTdHJpbmcgYmVhbkNsYXNzLCBiZWFuVHlwZSwgYmVhbklkLCBiZWFuRGVjbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQliZWFuQ2xhc3MgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3MiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCWJlYW5UeXBlID0gZ2V0QXR0cmlidXRlVmFsdWUoInR5cGUiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCWJlYW5JZCA9IGdldEF0dHJpYnV0ZVZhbHVlKCJpZCIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoYmVhbklkICE9IG51bGwgJiYgKGJlYW5UeXBlICE9IG51bGwgfHwgYmVhbkNsYXNzICE9IG51bGwpKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCQkJaWYgKGJlYW5UeXBlLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJLyogYSB0eXBlIHdhcyBzcGVjaWZpZWQgKi8KLQkJCQkJcHJlZml4ID0gYmVhblR5cGUgKyAiICIgKyBiZWFuSWQgKyAiID0gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKiBubyB0eXBlIHdhcyBzcGVjaWZpZWQsIHVzZSB0aGUgY29uY3JldGUgY2xhc3MgdmFsdWUgKi8KLQkJCQkJcHJlZml4ID0gYmVhbkNsYXNzICsgIiAiICsgYmVhbklkICsgIiA9ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQkvKgotCQkJCSAqIERlZmluZSBhcyBudWxsIGJ5IGRlZmF1bHQuIElmIGEgY29uY3JldGUgY2xhc3Mgd2FzCi0JCQkJICogc3BlY2lmaWVkLCBzdXBwbHkgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIGludm9jYXRpb24gaW5zdGVhZC4KLQkJCQkgKi8KLQkJCQlTdHJpbmcgc3VmZml4ID0gIm51bGw7XG4iOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gMTg2NzcxIC0gSlNQIFZhbGlkYXRvciBwcm9ibGVtIHdpdGggaW5jbHVkZWQgdXNlQmVhbgotCQkJCWlmIChiZWFuQ2xhc3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXN1ZmZpeCA9ICJuZXcgIiArIGJlYW5DbGFzcyArICIoKTtcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQliZWFuRGVjbCA9IHByZWZpeCArIHN1ZmZpeDsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGZUcmFuc2xhdG9yLmdldEN1cnJlbnROb2RlKCk7Ci0JCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZVNjcmlwdGxldFN0cmluZyhiZWFuRGVjbCwgY3VycmVudE5vZGUsIGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnROb2RlLmdldExlbmd0aCgpLCBmQXBwZW5kQXNJbmRpcmVjdFNvdXJjZSk7Ci0JCQlmUG9zc2libGVPd25lciA9IEpTUFRyYW5zbGF0b3IuU0NSSVBUTEVUOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc090aGVyUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCXByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKHNkUmVnaW9uKTsKLQkJcHJvY2Vzc1BhZ2VEaXJlY3RpdmUoc2RSZWdpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJaWYgKGlzSW5jbHVkZURpcmVjdGl2ZShmVGFnbmFtZSkpIHsKLQkJCS8vIHRoZSBkaXJlY3RpdmUgbmFtZSByZWdpb24gaXRzZWxmIGNvbnRhaW5zIHRoZSBhdHRycy4uLgotCQkJaWYgKHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpCi0JCQkJc2RSZWdpb24gPSBzZFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9IGdldEF0dHJpYnV0ZVZhbHVlKCJmaWxlIiwgc2RSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmZUcmFuc2xhdG9yLmhhbmRsZUluY2x1ZGVGaWxlKGZpbGVMb2NhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoaXNQb3NzaWJsZUN1c3RvbVRhZyhmVGFnbmFtZSkpIHsKLQkJCS8vIHRoaXMgY3VzdG9tIHRhZyBtYXkgZGVmaW5lIHZhcmlhYmxlcwotCQkJdGhpcy5mVHJhbnNsYXRvci5hZGRUYWdsaWJWYXJpYWJsZXMoZlRhZ25hbWUsIHNkUmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChpc1RhZ2xpYkRpcmVjdGl2ZShmVGFnbmFtZSkpIHsKLQkJCS8vIGFsc28gYWRkIHRoZSBvbmVzIGNyZWF0ZWQgaGVyZSB0byB0aGUgcGFyZW50IGRvY3VtZW50Ci0JCQlTdHJpbmcgcHJlZml4ID0gZ2V0QXR0cmlidXRlVmFsdWUoInByZWZpeCIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gdGhpcy5mVHJhbnNsYXRvci5nZXRUTERDTURvY3VtZW50TWFuYWdlcigpOwotCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJTGlzdCBkb2NzID0gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnRUcmFja2VycyhwcmVmaXgsIHRoaXMuZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJdGVyYXRvciBpdCA9IGRvY3MuaXRlcmF0b3IoKTsKLQkJCQlJdGVyYXRvciBlbGVtZW50cyA9IG51bGw7Ci0JCQkJQ01Ob2RlIG5vZGUgPSBudWxsOwotCQkJCUNNRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCQlCbG9ja01hcmtlciBtYXJrZXIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJZG9jID0gKENNRG9jdW1lbnQpIGl0Lm5leHQoKTsKLQkJCQkJZWxlbWVudHMgPSBkb2MuZ2V0RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJCQlub2RlID0gKENNTm9kZSkgZWxlbWVudHMubmV4dCgpOwotCQkJCQkJbWFya2VyID0gbmV3IEJsb2NrTWFya2VyKG5vZGUuZ2V0Tm9kZU5hbWUoKSwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIHRydWUpOwotCQkJCQkJLy8gZ2xvYmFsIHNjb3BlIGlzIE9LIGJlY2F1c2Ugd2UgaGF2ZSBlbmNvdW50ZXJlZCB0aGlzCi0JCQkJCQkvLyA8QHRhZ2xpYj4gZGlyZWN0aXZlCi0JCQkJCQkvLyBzbyBpdCBhbGwgbWFya2VycyBmcm9tIGl0IHNob3VsZCB3aWxsIGJlIGluIHNjb3BlCi0JCQkJCQkvLyBhZGQgdG8gdGhpcyBsb2NhbCBwYXJzZXIKLQkJCQkJCWFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JCQkJCQkvLyBhZGQgdG8gb3V0ZXIgY2xhc3MgbWFya2VyIGxpc3QsIGZvcgotCQkJCQkJdGhpcy5mVHJhbnNsYXRvci5nZXRCbG9ja01hcmtlcnMoKS5hZGQobWFya2VyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NQYWdlRGlyZWN0aXZlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJaWYgKGlzUGFnZURpcmVjdGl2ZShmVGFnbmFtZSkpIHsKLQkJCXRoaXMuZlRyYW5zbGF0b3IudHJhbnNsYXRlUGFnZURpcmVjdGl2ZUF0dHJpYnV0ZXMoc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCksIHNkUmVnaW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogY29udmVuaWVuY2UgbWV0aG9kIHRvIGdldCBhbiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhdHRyaWJ1dGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIGF0dHJOYW1lLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCVN0cmluZyBzZFJlZ2lvblRleHQgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQkJU3RyaW5nIHRleHRSZWdpb25UZXh0LCBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdCA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uLCB2YWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW5hbWVSZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQl0ZXh0UmVnaW9uVGV4dCA9IHNkUmVnaW9uVGV4dC5zdWJzdHJpbmcobmFtZVJlZ2lvbi5nZXRTdGFydCgpLCBuYW1lUmVnaW9uLmdldFRleHRFbmQoKSk7Ci0JCQkJaWYgKHRleHRSZWdpb25UZXh0LmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJCXZhbHVlUmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAodmFsdWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQlhdHRyVmFsdWUgPSBzZFJlZ2lvblRleHQuc3Vic3RyaW5nKHZhbHVlUmVnaW9uLmdldFN0YXJ0KCksIHZhbHVlUmVnaW9uLmdldEVuZCgpKTsKLQkJCQkJCQlicmVhazsgLy8gaW5uZXIKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsgLy8gb3V0ZXIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGF0dHJWYWx1ZSk7Ci0JfQotCi0JLy8gdGhlc2UgbWV0aG9kcyBkZXRlcm1pbmUgd2hhdCBjb250ZW50IGdldHMgYWRkZWQgdG8gdGhlIGxvY2FsIHNjcmlwbGV0LAotCS8vIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uIGJ1ZmZlcnMKLQkvKgotCSAqIHJldHVybiB0cnVlIGZvciBlbGVtZW50cyB3aG9zZSBjb250ZW50cyB3ZSBtaWdodCB3YW50IHRvIGFkZCB0byB0aGUKLQkgKiBqYXZhIGZpbGUgd2UgYXJlIGJ1aWxkaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1BTdGFydFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCXJldHVybiAoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BFbmRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlyZXR1cm4gKHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1BSZWdpb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIGlzRGVjbGFyYXRpb24odGFnTmFtZSkgfHwgaXNFeHByZXNzaW9uKHRhZ05hbWUpIHx8IGlzU2NyaXB0bGV0KHRhZ05hbWUpIHx8IGlzVXNlQmVhbih0YWdOYW1lKSB8fCBpc0luY2x1ZGVEaXJlY3RpdmUodGFnTmFtZSkgfHwgaXNQb3NzaWJsZUN1c3RvbVRhZyh0YWdOYW1lKSB8fCBpc1RhZ2xpYkRpcmVjdGl2ZSh0YWdOYW1lKSB8fCBpc1BhZ2VEaXJlY3RpdmUodGFnTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWNsYXJhdGlvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGVjbGFyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHByZXNzaW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpleHByZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2NyaXB0bGV0KFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpzY3JpcHRsZXQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXNlQmVhbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6dXNlQmVhbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUuaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQb3NzaWJsZUN1c3RvbVRhZyhTdHJpbmcgdGFnTmFtZSkgewotLy8JCWludCBjb2xvbkluZGV4ID0gdGFnTmFtZS5pbmRleE9mKCI6Iik7Ci0vLwkJaWYgKGNvbG9uSW5kZXggPiAwKSB7Ci0vLwkJCVN0cmluZyBwcmVmaXggPSB0YWdOYW1lLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KTsKLS8vCQkJaWYgKHByZWZpeC5lcXVhbHMoImpzcCIpKSB7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCQlpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkgewotLy8JCQkJVGFnTWFya2VyW10gcHJlZml4ZXMgPSAoVGFnTWFya2VyW10pIGZMb2NhbFBhcnNlci5nZXROZXN0YWJsZVByZWZpeGVzKCkudG9BcnJheShuZXcgVGFnTWFya2VyWzBdKTsKLS8vCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCQlpZiAocHJlZml4LmVxdWFscyhwcmVmaXhlc1tpXS5nZXRUYWdOYW1lKCkpKSB7Ci0vLwkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0YWdOYW1lLmluZGV4T2YoJzonKSA+IC0xICYmICF0YWdOYW1lLnN0YXJ0c1dpdGgoSlNQVHJhbnNsYXRvci5KU1BfUFJFRklYKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhZ2xpYkRpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYWdlRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWdpb25OYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQotCQlTdHJpbmcgbmFtZVN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCW5hbWVTdHIgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpLCBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZVN0ci50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYXMgYSBTdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVBhdGggLSB0aGUgcGF0aCB0byB0aGUgZmlsZQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnRzLCBudWxsIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudHMoU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlUGF0aCk7Ci0JCXJldHVybiBGaWxlQ29udGVudENhY2hlLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudHMocGF0aC5tYWtlQWJzb2x1dGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RBZGRFeHByZXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2M2YTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RBZGRFeHByZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQWRkRXhwcmVzcy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBZGRFeHByZXNzIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RBZGRFeHByZXNzKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBZGRFeHByZXNzKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFkZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiNmVhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFkZEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQWRkRXhwcmVzc2lvbiBleHRlbmRzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiB7Ci0gIHB1YmxpYyBBU1RBZGRFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBZGRFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQW5kRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFuZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmZTQwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQW5kRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFuZEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQW5kRXhwcmVzc2lvbiBleHRlbmRzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiB7Ci0gIHB1YmxpYyBBU1RBbmRFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBbmRFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQ2hvaWNlRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVENob2ljZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MDc5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQ2hvaWNlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENob2ljZUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQ2hvaWNlRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUQ2hvaWNlRXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ2hvaWNlRXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTA2MTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURXF1YWxpdHlFeHByZXNzaW9uIGV4dGVuZHMgQVNUT3BlcmF0b3JFeHByZXNzaW9uIHsKLSAgcHVibGljIEFTVEVxdWFsaXR5RXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXF1YWxpdHlFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNURXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5M2YzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNURXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNURXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEZ1bmN0aW9uSW52b2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEZ1bmN0aW9uSW52b2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGNhZDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RGdW5jdGlvbkludm9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdW5jdGlvbkludm9jYXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURnVuY3Rpb25JbnZvY2F0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIFN0cmluZyBmdWxsRnVuY3Rpb25OYW1lOyAKLSAgCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkludm9jYXRpb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bmN0aW9uSW52b2NhdGlvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotCi1wdWJsaWMgU3RyaW5nIGdldEZ1bGxGdW5jdGlvbk5hbWUoKSB7Ci0JcmV0dXJuIGZ1bGxGdW5jdGlvbk5hbWU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEZ1bGxGdW5jdGlvbk5hbWUoU3RyaW5nIGZ1bGxGdW5jdGlvbk5hbWUpIHsKLQl0aGlzLmZ1bGxGdW5jdGlvbk5hbWUgPSBmdWxsRnVuY3Rpb25OYW1lOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEdUTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEdUTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDAwMDViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RHVE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RHVE5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUR1ROb2RlIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RHVE5vZGUoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEdUTm9kZShKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEltcGxpY2l0T2JqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUSW1wbGljaXRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0OWFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUSW1wbGljaXRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RJbXBsaWNpdE9iamVjdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJbXBsaWNpdE9iamVjdCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUSW1wbGljaXRPYmplY3QoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEltcGxpY2l0T2JqZWN0KEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUTGl0ZXJhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVExpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzMzRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVExpdGVyYWwuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUTGl0ZXJhbCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUTGl0ZXJhbChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTGl0ZXJhbChKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE11bHRpcGx5RXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE11bHRpcGx5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhmNjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RNdWx0aXBseUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RNdWx0aXBseUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUTXVsdGlwbHlFeHByZXNzaW9uIGV4dGVuZHMgQVNUT3BlcmF0b3JFeHByZXNzaW9uIHsKLSAgcHVibGljIEFTVE11bHRpcGx5RXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTXVsdGlwbHlFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3BlcmF0b3JFeHByZXNzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3BlcmF0b3JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTZiNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotCXByb3RlY3RlZCBBcnJheUxpc3Qgb3BlcmF0b3JUb2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQVNUT3BlcmF0b3JFeHByZXNzaW9uKGludCBpKSB7Ci0JCXN1cGVyKGkpOwotCX0KLQkKLQlwdWJsaWMgQVNUT3BlcmF0b3JFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpKSB7Ci0JCXRoaXMoaSk7Ci0JCXBhcnNlciA9IHA7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkT3BlcmF0b3JUb2tlbihUb2tlbiBvcFRva2VuKSB7Ci0JCW9wZXJhdG9yVG9rZW5zLmFkZChvcFRva2VuKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0T3BlcmF0b3JUb2tlbnMoKSB7Ci0JCXJldHVybiBvcGVyYXRvclRva2VuczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3JFeHByZXNzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmI3NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9yRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVE9yRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RPckV4cHJlc3Npb24gZXh0ZW5kcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gewotICBwdWJsaWMgQVNUT3JFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RPckV4cHJlc3Npb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RSZWxhdGlvbmFsRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjM4NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gZXh0ZW5kcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gewotICBwdWJsaWMgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUU3RhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RTdGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmUxZTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RTdGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFN0YXJ0IGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RTdGFydChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUU3RhcnQoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RVbmFyeUV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RVbmFyeUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4NzBhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVW5hcnlFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVW5hcnlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFVuYXJ5RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUVW5hcnlFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RVbmFyeUV4cHJlc3Npb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmEzNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFsdWUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFsdWUgZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLSAgcHVibGljIEFTVFZhbHVlKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYWx1ZShKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlUHJlZml4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVQcmVmaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyYmYwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVQcmVmaXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYWx1ZVByZWZpeC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYWx1ZVByZWZpeCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUVmFsdWVQcmVmaXgoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhbHVlUHJlZml4KEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVTdWZmaXguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZVN1ZmZpeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE3MjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZVN1ZmZpeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhbHVlU3VmZml4LmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFZhbHVlU3VmZml4IGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0JCi0gIHByb3RlY3RlZCBUb2tlbiBwcm9wZXJ0eU5hbWVUb2tlbjsKLSAgCi0gIHB1YmxpYyBBU1RWYWx1ZVN1ZmZpeChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFsdWVTdWZmaXgoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLQotcHVibGljIFRva2VuIGdldFByb3BlcnR5TmFtZVRva2VuKCkgewotCXJldHVybiBwcm9wZXJ0eU5hbWVUb2tlbjsKLX0KLQotcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lVG9rZW4oVG9rZW4gcHJvcGVydHlOYW1lVG9rZW4pIHsKLQl0aGlzLnByb3BlcnR5TmFtZVRva2VuID0gcHJvcGVydHlOYW1lVG9rZW47Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRUxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQwYTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBUaGUgY29kZSBjaGVja2VyIGZvciB0aGUganNmL2pzcCBFTC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVMR2VuZXJhdG9yIHsKLQkvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdG9yIEEgdmFsaWQgRUxMb2NhdG9yIGluc3RhbmNlLCBtYXkgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIEVMR2VuZXJhdG9yKCkgewotICAgIH0gLy8gY29uc3RydWN0b3IKLQkKLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBuZXR1aWVsIEFTVCBhbmQgc2V0IGRpYWdub3N0aWNzIGFzIG5lY2Vzc2FyeS4KLSAgICAgKiBAcGFyYW0gdHJhbnNsYXRvciBUT0RPCi0gICAgICogQHBhcmFtIGpzcFJlZmVyZW5jZVJlZ2lvbiBUT0RPCi0gICAgICogQHBhcmFtIGNvbnRlbnRTdGFydCAKLSAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZShBU1RFeHByZXNzaW9uIHJvb3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUsIFN0cmluZ0J1ZmZlciByZXN1bHQsIE1hcCBjb2RlTWFwLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBpbnQgY29udGVudFN0YXJ0LCBpbnQgY29udGVudExlbmd0aCkgewotCQlFTEdlbmVyYXRvclZpc2l0b3IgdmlzaXRvciA9IG5ldyBFTEdlbmVyYXRvclZpc2l0b3IocmVzdWx0LCBjdXJyZW50Tm9kZSwgY29kZU1hcCwgZG9jdW1lbnQsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgY29udGVudFN0YXJ0KTsKLQkJcm9vdC5qanRBY2NlcHQodmlzaXRvciwgbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0VMR2VuZXJhdG9yVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0VMR2VuZXJhdG9yVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I5NjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvclZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgQnVnIDE1NDQ3NCBFTDogJ2FuZCcsICdvcicsIC4uLiBvcGVyYXRvcgotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ0NzQKLSAqICAgICBCZXJuaGFyZCBIdWVtZXIgPGJlcm5oYXJkLmh1ZW1lckBnbWFpbC5jb20+Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIEVMR2VuZXJhdG9yVmlzaXRvciBpbXBsZW1lbnRzIEpTUEVMUGFyc2VyVmlzaXRvciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOREwgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZFeHByZXNzaW9uSGVhZGVyMSA9ICJwdWJsaWMgU3RyaW5nIF9lbEV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZFeHByZXNzaW9uSGVhZGVyMiA9ICIoKSIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJcdFx0dGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbiB7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0ID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBwYXJhbSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgcGFyYW1WYWx1ZXMgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIGhlYWRlciA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkIAotCSJqYXZhLnV0aWwuTWFwIGhlYWRlclZhbHVlcyA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgY29va2llID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQgCi0JImphdmEudXRpbC5NYXAgaW5pdFBhcmFtID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBwYWdlU2NvcGUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIHJlcXVlc3RTY29wZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgc2Vzc2lvblNjb3BlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBhcHBsaWNhdGlvblNjb3BlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkicmV0dXJuIFwiXCIrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZFeHByZXNzaW9uSGVhZGVyMl9wYXJhbSA9ICIoKSIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJcdFx0dGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbiB7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0ID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nPiBwYXJhbSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdPiBwYXJhbVZhbHVlcyA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZz4gaGVhZGVyID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQgCi0JImphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdPiBoZWFkZXJWYWx1ZXMgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU+IGNvb2tpZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkIAotCSJqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmc+IGluaXRQYXJhbSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdD4gcGFnZVNjb3BlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0PiByZXF1ZXN0U2NvcGUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3Q+IHNlc3Npb25TY29wZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdD4gYXBwbGljYXRpb25TY29wZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JInJldHVybiBcIlwiKyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZkpzcEltcGxpY2l0T2JqZWN0c1tdID0geyAicGFnZUNvbnRleHQiIH07IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZkpzcEltcGxpY2l0TWFwc1tdID0geyAJInBhcmFtIiwgInBhcmFtVmFsdWVzIiwgImhlYWRlciIsICJoZWFkZXJWYWx1ZXMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJCQkJCQkJCQkJCSJjb29raWUiLCAiaW5pdFBhcmFtIiwgInBhZ2VTY29wZSIsICJyZXF1ZXN0U2NvcGUiLCAic2Vzc2lvblNjb3BlIiwgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJCQkJCQkJCQkiYXBwbGljYXRpb25TY29wZSIgfTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXAgZkpTUEltcGxpY2l0T2JqZWN0TWFwID0gbmV3IEhhc2hNYXAoZkpzcEltcGxpY2l0T2JqZWN0cy5sZW5ndGgpOwotCXN0YXRpYyB7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBmSnNwSW1wbGljaXRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmSlNQSW1wbGljaXRPYmplY3RNYXAucHV0KGZKc3BJbXBsaWNpdE9iamVjdHNbaV0sIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJfQotCQkKLQkJZm9yKGludCBpID0gMDsgaSA8IGZKc3BJbXBsaWNpdE1hcHMubGVuZ3RoOyBpKyspIHsKLQkJCWZKU1BJbXBsaWNpdE9iamVjdE1hcC5wdXQoZkpzcEltcGxpY2l0TWFwc1tpXSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZkZvb3RlciA9ICIgOyIgKyBFTkRMICsgIn0iICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmUmVzdWx0OwotCXByaXZhdGUgTWFwIGZDb2RlTWFwOwotCXByaXZhdGUgaW50IGZPZmZzZXRJblVzZXJDb2RlOwotCXByaXZhdGUgc3RhdGljIGludCBtZXRob2RDb3VudGVyID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQ29udGVudFN0YXJ0OwotCXByaXZhdGUgc3RhdGljIE1hcCBmT3BlcmF0b3JNYXA7Ci0JCi0JLy8gdGhpcyBmbGFnIGxldHMgdXMga25vdyBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBnZW5lcmF0ZSBmb3Igc29tZSByZWFzb24uICBPbmUgcG9zc2libGUgcmVhc29uIGlzIHRoYXQgdGhlIGV4cHJlc3Npb24gCi0JLy8gY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSB2YXJpYWJsZSBmb3Igd2hpY2ggaW5mb3JtYXRpb24gaXMgb25seSBhdmFpbGFibGUgYXQgcnVudGltZS4KLQlwcml2YXRlIGJvb2xlYW4gZkNhbkdlbmVyYXRlID0gdHJ1ZTsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlVzZVBhcmFtZXRlcml6ZWRUeXBlczsKLQotCS8qKgotCSAqIFRyYW5sc2F0aW9uIG9mIFhNTC1zdHlsZSBvcGVyYXRvcnMgdG8gamF2YQotCSAqLwotCXN0YXRpYyB7Ci0JCWZPcGVyYXRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZPcGVyYXRvck1hcC5wdXQoImd0IiwgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImx0IiwgIjwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImdlIiwgIj49Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJsZSIsICI8PSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZk9wZXJhdG9yTWFwLnB1dCgibW9kIiwgIiUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImVxIiwgIj09Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJhbmQiLCAiJiYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoIm9yIiwgInx8Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJub3QiLCAiISIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yIHNxdWlycmVscyBhd2F5IGEgZmV3IHRoaW5ncyB3ZSdsbCBuZWVkIGxhdGVyCi0JICogCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEBwYXJhbSBjb2RlTWFwCi0JICogQHBhcmFtIHRyYW5zbGF0b3IKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICogQHBhcmFtIGNvbnRlbnRTdGFydAotCSAqLwotCXB1YmxpYyBFTEdlbmVyYXRvclZpc2l0b3IoU3RyaW5nQnVmZmVyIHJlc3VsdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSwgTWFwIGNvZGVNYXAsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGludCBjb250ZW50U3RhcnQpCi0JewotCQlmUmVzdWx0ID0gcmVzdWx0OwotCQlmQ29kZU1hcCA9IGNvZGVNYXA7Ci0JCWZPZmZzZXRJblVzZXJDb2RlID0gcmVzdWx0Lmxlbmd0aCgpOwotCQlmQ29udGVudFN0YXJ0ID0gY29udGVudFN0YXJ0OwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZkN1cnJlbnROb2RlID0gY3VycmVudE5vZGU7Ci0JCQotCQlmVXNlUGFyYW1ldGVyaXplZFR5cGVzID0gY29tcGlsZXJTdXBwb3J0c1BhcmFtZXRlcml6ZWRUeXBlcygpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBhIHRva2VuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAgQXV0b21hdGljYWxseSBjYWxjdWxhdGluZyBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmQoVG9rZW4gdG9rZW4pCi0JewotCQlhcHBlbmQodG9rZW4uaW1hZ2UsIHRva2VuLmJlZ2luQ29sdW1uIC0gMSwgdG9rZW4uZW5kQ29sdW1uKTsKLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIGEgdHJhbnNsYXRpb24gZm9yIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHRva2VuLgotCSAqIAotCSAqIEBwYXJhbSB0cmFuc2xhdGVkCi0JICogQHBhcmFtIHRva2VuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgdHJhbnNsYXRlZCwgVG9rZW4gdG9rZW4pCi0JewotCQlhcHBlbmQodHJhbnNsYXRlZCwgdG9rZW4uYmVnaW5Db2x1bW4gLSAxLCB0b2tlbi5lbmRDb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBhIHN0cmluZyBleHBsaWNpdGx5IGdpdmluZyB0aGUgaW5wdXQgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBqc3BQb3NpdGlvblN0YXJ0Ci0JICogQHBhcmFtIGpzcFBvc2l0aW9uRW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgbmV3VGV4dCwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkVuZCkKLQl7Ci0JCWZSZXN1bHQuYXBwZW5kKG5ld1RleHQpOwotCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUsIG5ld1RleHQubGVuZ3RoKCkpOwotCQlQb3NpdGlvbiBqc3BSYW5nZSA9IG5ldyBQb3NpdGlvbihmQ29udGVudFN0YXJ0ICsganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25FbmQgLSBqc3BQb3NpdGlvblN0YXJ0KTsKLQotCQlmQ29kZU1hcC5wdXQoamF2YVJhbmdlLCBqc3BSYW5nZSk7Ci0JCWZPZmZzZXRJblVzZXJDb2RlICs9IG5ld1RleHQubGVuZ3RoKCk7Ci0JfQotCQotCS8qKgotCSAqIEFwcGVuZCB0ZXh0IHRoYXQgd2lsbCBiZSB1bm1hcHBlZCBhbmQgdGhlcmVmb3JlIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBmb3IgY29tcGxldGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmQoU3RyaW5nIG5ld1RleHQpCi0JewotCQlmUmVzdWx0LmFwcGVuZChuZXdUZXh0KTsKLQkJZk9mZnNldEluVXNlckNvZGUgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2VuZXJhdGUgYSBmdW5jdGlvbiBpbnZvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmdWxsRnVuY3Rpb25OYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2VuRnVuY3Rpb24oU3RyaW5nIGZ1bGxGdW5jdGlvbk5hbWUpIHsKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgZG9jTWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmRG9jdW1lbnQpOwotCQlpbnQgY29sb25JbmRleCA9IGZ1bGxGdW5jdGlvbk5hbWUuaW5kZXhPZignOicpOwotCQlTdHJpbmcgcHJlZml4ID0gZnVsbEZ1bmN0aW9uTmFtZS5zdWJzdHJpbmcoMCwgY29sb25JbmRleCk7Ci0JCVN0cmluZyBmdW5jdGlvbk5hbWUgPSBmdWxsRnVuY3Rpb25OYW1lLnN1YnN0cmluZyhjb2xvbkluZGV4ICsgMSk7Ci0JCWlmIChkb2NNZ3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSXRlcmF0b3IgdGFnbGlicyA9IGRvY01nci5nZXRDTURvY3VtZW50VHJhY2tlcnMoZkN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlICh0YWdsaWJzLmhhc05leHQoKSkgewotCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpdGFnbGlicy5uZXh0KCk7Ci0JCQlpZih0cmFja2VyLmdldFByZWZpeCgpLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQkJQ01Eb2N1bWVudEltcGwgZG9jID0gKENNRG9jdW1lbnRJbXBsKXRyYWNrZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkKLQkJCQlMaXN0IGZ1bmN0aW9ucyA9IGRvYy5nZXRGdW5jdGlvbnMoKTsKLQkJCQlmb3IoSXRlcmF0b3IgaXQgPSBmdW5jdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJVExERnVuY3Rpb24gZnVuY3Rpb24gPSAoVExERnVuY3Rpb24paXQubmV4dCgpOwotCQkJCQlpZihmdW5jdGlvbi5nZXROYW1lKCkuZXF1YWxzKGZ1bmN0aW9uTmFtZSkpIHsKLQkJCQkJCXJldHVybiBmdW5jdGlvbi5nZXRDbGFzc05hbWUoKSArICIuIiArIGZ1bmN0aW9uLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIHNpbXBsZSBub2RlIC0tIGZhbGxiYWNrCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybihub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpKTsKLQl9Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIGludCBnZXRNZXRob2RDb3VudGVyKCkgewotCQlyZXR1cm4gbWV0aG9kQ291bnRlcisrOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdG9wLWxldmVsIGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJaW50IHN0YXJ0ID0gbm9kZS5nZXRGaXJzdFRva2VuKCkuYmVnaW5Db2x1bW4gLSAxOwotCQlpbnQgZW5kID0gbm9kZS5sYXN0VG9rZW4uZW5kQ29sdW1uIC0gMTsKLQkJYXBwZW5kKGZFeHByZXNzaW9uSGVhZGVyMSwgc3RhcnQsIHN0YXJ0KTsKLQkJYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZ2V0TWV0aG9kQ291bnRlcigpKSwgc3RhcnQsIHN0YXJ0KTsKLQkJaWYgKGZVc2VQYXJhbWV0ZXJpemVkVHlwZXMpCi0JCQlhcHBlbmQoZkV4cHJlc3Npb25IZWFkZXIyX3BhcmFtLCBzdGFydCwgc3RhcnQpOwotCQllbHNlCi0JCQlhcHBlbmQoZkV4cHJlc3Npb25IZWFkZXIyLCBzdGFydCwgc3RhcnQpOwotCQkKLQkJT2JqZWN0IHJldHZhbCA9IG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0KLQkJYXBwZW5kKGZGb290ZXIsIGVuZCwgZW5kKTsKLQkJCi0JCS8vIHNvbWV0aGluZyBpcyBwcmV2ZW50aW5nIGdvb2QgY29kZSBnZW5lcmF0aW9uIHNvIGVtcHR5IG91dCB0aGUgcmVzdWx0IGFuZCB0aGUgbWFwLgotCQlpZighZkNhbkdlbmVyYXRlKSB7Ci0JCQlmUmVzdWx0LmRlbGV0ZSgwLCBmUmVzdWx0Lmxlbmd0aCgpKTsKLQkJCWZDb2RlTWFwLmNsZWFyKCk7CQkJCi0JCX0KLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29tcGlsZXJTdXBwb3J0c1BhcmFtZXRlcml6ZWRUeXBlcygpIHsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQYXRoIGxvY2F0aW9uID0gVGFnbGliQ29udHJvbGxlci5nZXRMb2NhdGlvbihmRG9jdW1lbnQpOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgbG9jYXRpb24uc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocm9vdC5nZXRQcm9qZWN0KGxvY2F0aW9uLnNlZ21lbnQoMCkpKTsKLQkJCQlTdHJpbmcgY29tcGxpYW5jZSA9IHByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgdHJ1ZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIEZsb2F0LnBhcnNlRmxvYXQoY29tcGxpYW5jZSkgPj0gMS41OwotCQkJCX0KLQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEdlbmVyaWNhbGx5IGdlbmVyYXRlIGFuIG9wZXJhdG9yIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGF0YQotCSAqLwotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZU9wZXJhdG9yTm9kZShBU1RPcGVyYXRvckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZm9yKGludCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCW5vZGUuY2hpbGRyZW5baV0uamp0QWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJaWYoIG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gaSA+IDEpIHsKLQkJCQlhcHBlbmRPcGVyYXRvcigoVG9rZW4pbm9kZS5nZXRPcGVyYXRvclRva2VucygpLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIGFuIG9wZXJhdG9yIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIHRyYW5zbGF0aW9uIChpZiBhbnkpCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGFwcGVuZE9wZXJhdG9yKFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0b2tlbkltYWdlID0gdG9rZW4uaW1hZ2UudHJpbSgpOwotCQlTdHJpbmcgdHJhbnNsYXRlZCA9IChTdHJpbmcpZk9wZXJhdG9yTWFwLmdldCh0b2tlbkltYWdlKTsKLQkJaWYobnVsbCAhPSB0cmFuc2xhdGVkKSB7Ci0JCQlhcHBlbmQodHJhbnNsYXRlZCwgdG9rZW4pOwotCQl9IGVsc2UgewotCQkJYXBwZW5kKHRva2VuKTsKLQkJfQotCQlyZXR1cm4odHJhbnNsYXRlZCk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIG9yIEV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE9yRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIGFuZCBleHByZXNzaW9uIAotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQW5kRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIGVxdWFsaXR5Ci0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RFcXVhbGl0eUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSBSZWxhdGlvbmFsCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIGFkZGl0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RBZGRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWdlbmVyYXRlT3BlcmF0b3JOb2RlKG5vZGUsIGRhdGEpOwotCQlyZXR1cm4obnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBIYW5kbGUgbXVsdGlwbHkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bHRpcGx5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqIAotCSAqIENob2ljZSBFeHByZXNzaW9uICh0ZXJuYXJ5IG9wZXJhdG9yKQotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2hvaWNlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlub2RlLmNoaWxkcmVuWzBdLmpqdEFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJYXBwZW5kKCI/Iik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5jaGlsZHJlblsxXS5qanRBY2NlcHQodGhpcywgZGF0YSk7Ci0JCWFwcGVuZCgiOiIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUuY2hpbGRyZW5bMl0uamp0QWNjZXB0KHRoaXMsZGF0YSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIHVuYXJ5Ci0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RVbmFyeUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYoSlNQRUxQYXJzZXJDb25zdGFudHMuRU1QVFkgPT0gbm9kZS5maXJzdFRva2VuLmtpbmQpIHsKLQkJCWFwcGVuZCgiKChudWxsID09ICIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJYXBwZW5kKCIpIHx8ICgiKTsgLy8kTk9OLU5MUy0xJAotCQkJbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJCWFwcGVuZCgiKS5pc0VtcHR5KCkpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmKEpTUEVMUGFyc2VyQ29uc3RhbnRzLk5PVDEgPT0gbm9kZS5maXJzdFRva2VuLmtpbmQgfHwgSlNQRUxQYXJzZXJDb25zdGFudHMuTk9UMiA9PSBub2RlLmZpcnN0VG9rZW4ua2luZCkgewotCQkJYXBwZW5kKCIoISIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmKEpTUEVMUGFyc2VyQ29uc3RhbnRzLk1JTlVTID09IG5vZGUuZmlyc3RUb2tlbi5raW5kKSB7Ci0JCQlhcHBlbmQoIigtIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0JCQlhcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIFZhbHVlIG5vZGUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWlmKG5vZGUuamp0R2V0TnVtQ2hpbGRyZW4oKSA+PSAyKSB7Ci0JCQlpZihub2RlLmpqdEdldENoaWxkKDApIGluc3RhbmNlb2YgQVNUVmFsdWVQcmVmaXggJiYgbm9kZS5qanRHZXRDaGlsZCgxKSBpbnN0YW5jZW9mIEFTVFZhbHVlU3VmZml4KSB7Ci0JCQkJQVNUVmFsdWVQcmVmaXggcHJlZml4ID0gKEFTVFZhbHVlUHJlZml4KSBub2RlLmpqdEdldENoaWxkKDApOwotCQkJCUFTVFZhbHVlU3VmZml4IHN1ZmZpeCA9IChBU1RWYWx1ZVN1ZmZpeCkgbm9kZS5qanRHZXRDaGlsZCgxKTsKLQkJCQlpZihwcmVmaXguZmlyc3RUb2tlbi5pbWFnZS5lcXVhbHMoInBhZ2VDb250ZXh0IikgJiYgc3VmZml4LmdldFByb3BlcnR5TmFtZVRva2VuKCkuaW1hZ2UuZXF1YWxzKCJyZXF1ZXN0IikpIHsKLQkJCQkJYXBwZW5kKCIoKEhUVFBTZXJ2bGV0UmVxdWVzdCkiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7CQotCX0KLQotCi0JLyoqCi0JICogVmFsdWUgUHJlZml4Ci0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZVByZWZpeCBub2RlLCBPYmplY3QgZGF0YSkgewotCQkvLyB0aGlzIGlzIGEgcmF3IGlkZW50aWZpZXIuICBNYXkgc3VyZSBpdCdzIGFuIGltcGxpY2l0IG9iamVjdC4KLQkJLy8gVGhpcyBpcyB0aGUgcHJpbWFyeSBwbGFlIHdoZXJlIG1vZGlmaWNhdGlvbiBpcyBuZWVkZWQgdG8gCi0JCS8vIHN1cHBvcnQgSlNGIGJhY2tpbmcgYmVhbnMuCi0JCWlmKG51bGwgPT0gbm9kZS5jaGlsZHJlbikgewotCQkJaWYoaXNDb21wbGV0aW5nT2JqZWN0KG5vZGUuZmlyc3RUb2tlbi5pbWFnZSkpIHsKLQkJCQlhcHBlbmQobm9kZS5maXJzdFRva2VuKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZkNhbkdlbmVyYXRlID0gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4obnVsbCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0JfQotCi0KLQkvKioKLQkgKiBGdW5jdGlvbiBmb3IgdGVzdGluZyBpbXBsaWNpdCBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21wbGV0aW5nT2JqZWN0KFN0cmluZyBpbWFnZSkgewotCQlCb29sZWFuIHZhbHVlID0gKEJvb2xlYW4pZkpTUEltcGxpY2l0T2JqZWN0TWFwLmdldChpbWFnZSk7Ci0JCXJldHVybiBudWxsID09IHZhbHVlID8gZmFsc2UgOiB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWx1ZSBzdWZmaXgKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlU3VmZml4IG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWlmKEpTUEVMUGFyc2VyQ29uc3RhbnRzLkxCUkFDS0VUID09IG5vZGUuZmlyc3RUb2tlbi5raW5kKSB7Ci0JCQlmQ2FuR2VuZXJhdGUgPSBmYWxzZTsKLQkJfSBlbHNlIGlmKG51bGwgIT0gbm9kZS5nZXRQcm9wZXJ0eU5hbWVUb2tlbigpKSB7Ci0JCQlUb2tlbiBzdWZmaXggPSBub2RlLmdldFByb3BlcnR5TmFtZVRva2VuKCk7Ci0JCQlTdHJpbmcgdWNhc2VOYW1lID0gc3VmZml4LmltYWdlLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgc3VmZml4LmltYWdlLnN1YnN0cmluZygxLCBzdWZmaXguaW1hZ2UubGVuZ3RoKCkpOyAKLQotCQkJLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gIE5vdGUgdGhhdCB0aGUgdHlwZSBzeXN0ZW0sIG5vIG1hdHRlciBob3cgbXVjaCB0eXBlIGluZm9ybWF0aW9uCi0JCQkvLyB3ZSB3b3VsZCBoYXZlIHdvdWxkbid0IGdpdmUgdXMgdGhlIGNvcnJlY3QgcmVzdWx0LiAgV2UncmUgbG9va2luZyBmb3IgInBhZ2VDb250ZXh0LnJlcXVlc3QiIAotCQkJLy8gaGVyZSBhbmQgd2lsbCBhZGQgYSBkb3duY2FzdCB0byAoSFRUUFNlcnZsZXRSZXF1ZXN0KQotCQkJCi0JCQlhcHBlbmQobm9kZS5maXJzdFRva2VuKTsKLQkJCWFwcGVuZCgiZ2V0IiArIHVjYXNlTmFtZSArICIoKSIsIHN1ZmZpeCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlTaW1wbGVOb2RlIHBhcmVudCA9IChTaW1wbGVOb2RlKSBub2RlLmpqdEdldFBhcmVudCgpOwotCQkJaWYoc3VmZml4LmltYWdlLmVxdWFscygicmVxdWVzdCIpICYmIHBhcmVudCBpbnN0YW5jZW9mIEFTVFZhbHVlICYmIC8vJE5PTi1OTFMtMSQKLQkJCQkJcGFyZW50LmpqdEdldFBhcmVudCgpIGluc3RhbmNlb2YgQVNUVW5hcnlFeHByZXNzaW9uICYmIHBhcmVudC5maXJzdFRva2VuLmltYWdlLmVxdWFscygicGFnZUNvbnRleHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJYXBwZW5kKCIpIik7Ci0JCQl9IAotCi0KLQkJfSBlbHNlIHsKLQkJCWFwcGVuZChub2RlLmZpcnN0VG9rZW4pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogRnVuY3Rpb24gaW52b2NhdGlvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25JbnZvY2F0aW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCVN0cmluZyBmdW5jdGlvblRyYW5zbGF0aW9uID0gZ2VuRnVuY3Rpb24obm9kZS5nZXRGdWxsRnVuY3Rpb25OYW1lKCkpOwotCQlpZihudWxsICE9IGZ1bmN0aW9uVHJhbnNsYXRpb24pCi0JCXsKLQkJCWFwcGVuZChmdW5jdGlvblRyYW5zbGF0aW9uICsgIigiLCBub2RlLmdldEZpcnN0VG9rZW4oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbm9kZS5jaGlsZHJlbltpXS5qanRBY2NlcHQodGhpcywgZGF0YSk7Ci0JCQkJaWYoIG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gaSA+IDEpewotCQkJCQlhcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTGl0ZXJhbAotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGl0ZXJhbCBub2RlLCBPYmplY3QgZGF0YSkgewotCQkvLyBUT0RPIGFueSBmdXJ0aGVyIHRyYW5zbGF0aW9uIG5lZWRlZD8KLQkJYXBwZW5kKG5vZGUuZmlyc3RUb2tlbik7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9GaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0ZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNWM1NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0ZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IgaW1wbGVtZW50cyBKU1BFTFBhcnNlclZpc2l0b3IgewotCXByb3RlY3RlZCBpbnQgZkN1cnNvclBvc2l0aW9uOwotCQotCXB1YmxpYyBGaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvcihpbnQgY3Vyc29yUG9zaXRpb24pCi0JewotCQlmQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmNsb3NpbmcoU2ltcGxlTm9kZSBub2RlKSB7Ci0JCXJldHVybihub2RlLmZpcnN0VG9rZW4uYmVnaW5Db2x1bW4gPCBmQ3Vyc29yUG9zaXRpb24gJiYgbm9kZS5sYXN0VG9rZW4uZW5kQ29sdW1uID49IGZDdXJzb3JQb3NpdGlvbik7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIE9iamVjdCB2aXNpdEVuY2xvc2luZ0NoaWxkKFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpCXsKLQkJaWYobnVsbCA9PSBub2RlLmNoaWxkcmVuKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYoaXNFbmNsb3Npbmcobm9kZSkpIAotCQkJCXJldHVybiBub2RlLmNoaWxkcmVuW2ldLmpqdEFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUT3JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQW5kRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQWRkRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bHRpcGx5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENob2ljZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RVbmFyeUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZSBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlUHJlZml4IG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWVTdWZmaXggbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkludm9jYXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJT2JqZWN0IG5lc3RlZEludm9jYXRpb24gPSB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCQlpZihudWxsICE9IG5lc3RlZEludm9jYXRpb24pCi0JCQlyZXR1cm4gbmVzdGVkSW52b2NhdGlvbjsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXRlcmFsIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KSlRKU1BFTFBhcnNlclN0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSkpUSlNQRUxQYXJzZXJTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTc0MzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KSlRKU1BFTFBhcnNlclN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpKVEpTUEVMUGFyc2VyU3RhdGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1jbGFzcyBKSlRKU1BFTFBhcnNlclN0YXRlIHsKLSAgcHJpdmF0ZSBqYXZhLnV0aWwuU3RhY2sgbm9kZXM7Ci0gIHByaXZhdGUgamF2YS51dGlsLlN0YWNrIG1hcmtzOwotCi0gIHByaXZhdGUgaW50IHNwOwkJLy8gbnVtYmVyIG9mIG5vZGVzIG9uIHN0YWNrCi0gIHByaXZhdGUgaW50IG1rOwkJLy8gY3VycmVudCBtYXJrCi0gIHByaXZhdGUgYm9vbGVhbiBub2RlX2NyZWF0ZWQ7Ci0KLSAgSkpUSlNQRUxQYXJzZXJTdGF0ZSgpIHsKLSAgICBub2RlcyA9IG5ldyBqYXZhLnV0aWwuU3RhY2soKTsKLSAgICBtYXJrcyA9IG5ldyBqYXZhLnV0aWwuU3RhY2soKTsKLSAgICBzcCA9IDA7Ci0gICAgbWsgPSAwOwotICB9Ci0KLSAgLyogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IG5vZGUgd2FzIGFjdHVhbGx5IGNsb3NlZCBhbmQKLSAgICAgcHVzaGVkLiAgVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhlIGZpbmFsIHVzZXIgYWN0aW9uIG9mIGEKLSAgICAgbm9kZSBzY29wZS4gICovCi0gIGJvb2xlYW4gbm9kZUNyZWF0ZWQoKSB7Ci0gICAgcmV0dXJuIG5vZGVfY3JlYXRlZDsKLSAgfQotCi0gIC8qIENhbGwgdGhpcyB0byByZWluaXRpYWxpemUgdGhlIG5vZGUgc3RhY2suICBJdCBpcyBjYWxsZWQKLSAgICAgYXV0b21hdGljYWxseSBieSB0aGUgcGFyc2VyJ3MgUmVJbml0KCkgbWV0aG9kLiAqLwotICB2b2lkIHJlc2V0KCkgewotICAgIG5vZGVzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgbWFya3MucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICBzcCA9IDA7Ci0gICAgbWsgPSAwOwotICB9Ci0KLSAgLyogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSBBU1QuICBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGNhbGwKLSAgICAgdGhpcyBhZnRlciBhIHN1Y2Nlc3NmdWwgcGFyc2UuICovCi0gIE5vZGUgcm9vdE5vZGUoKSB7Ci0gICAgcmV0dXJuIChOb2RlKW5vZGVzLmVsZW1lbnRBdCgwKTsKLSAgfQotCi0gIC8qIFB1c2hlcyBhIG5vZGUgb24gdG8gdGhlIHN0YWNrLiAqLwotICB2b2lkIHB1c2hOb2RlKE5vZGUgbikgewotICAgIG5vZGVzLnB1c2gobik7Ci0gICAgKytzcDsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIG5vZGUgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUKLSAgICAgc3RhY2suICAqLwotICBOb2RlIHBvcE5vZGUoKSB7Ci0gICAgaWYgKC0tc3AgPCBtaykgewotICAgICAgbWsgPSAoKEludGVnZXIpbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0gICAgfQotICAgIHJldHVybiAoTm9kZSlub2Rlcy5wb3AoKTsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIG5vZGUgY3VycmVudGx5IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAqLwotICBOb2RlIHBlZWtOb2RlKCkgewotICAgIHJldHVybiAoTm9kZSlub2Rlcy5wZWVrKCk7Ci0gIH0KLQotICAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gb24gdGhlIHN0YWNrIGluIHRoZSBjdXJyZW50IG5vZGUKLSAgICAgc2NvcGUuICovCi0gIGludCBub2RlQXJpdHkoKSB7Ci0gICAgcmV0dXJuIHNwIC0gbWs7Ci0gIH0KLQotCi0gIHZvaWQgY2xlYXJOb2RlU2NvcGUoTm9kZSBuKSB7Ci0gICAgd2hpbGUgKHNwID4gbWspIHsKLSAgICAgIHBvcE5vZGUoKTsKLSAgICB9Ci0gICAgbWsgPSAoKEludGVnZXIpbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0gIH0KLQotCi0gIHZvaWQgb3Blbk5vZGVTY29wZShOb2RlIG4pIHsKLSAgICBtYXJrcy5wdXNoKG5ldyBJbnRlZ2VyKG1rKSk7Ci0gICAgbWsgPSBzcDsKLSAgICBuLmpqdE9wZW4oKTsKLSAgfQotCi0KLSAgLyogQSBkZWZpbml0ZSBub2RlIGlzIGNvbnN0cnVjdGVkIGZyb20gYSBzcGVjaWZpZWQgbnVtYmVyIG9mCi0gICAgIGNoaWxkcmVuLiAgVGhhdCBudW1iZXIgb2Ygbm9kZXMgYXJlIHBvcHBlZCBmcm9tIHRoZSBzdGFjayBhbmQKLSAgICAgbWFkZSB0aGUgY2hpbGRyZW4gb2YgdGhlIGRlZmluaXRlIG5vZGUuICBUaGVuIHRoZSBkZWZpbml0ZSBub2RlCi0gICAgIGlzIHB1c2hlZCBvbiB0byB0aGUgc3RhY2suICovCi0gIHZvaWQgY2xvc2VOb2RlU2NvcGUoTm9kZSBuLCBpbnQgbnVtKSB7Ci0gICAgbWsgPSAoKEludGVnZXIpbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0gICAgd2hpbGUgKG51bS0tID4gMCkgewotICAgICAgTm9kZSBjID0gcG9wTm9kZSgpOwotICAgICAgYy5qanRTZXRQYXJlbnQobik7Ci0gICAgICBuLmpqdEFkZENoaWxkKGMsIG51bSk7Ci0gICAgfQotICAgIG4uamp0Q2xvc2UoKTsKLSAgICBwdXNoTm9kZShuKTsKLSAgICBub2RlX2NyZWF0ZWQgPSB0cnVlOwotICB9Ci0KLQotICAvKiBBIGNvbmRpdGlvbmFsIG5vZGUgaXMgY29uc3RydWN0ZWQgaWYgaXRzIGNvbmRpdGlvbiBpcyB0cnVlLiAgQWxsCi0gICAgIHRoZSBub2RlcyB0aGF0IGhhdmUgYmVlbiBwdXNoZWQgc2luY2UgdGhlIG5vZGUgd2FzIG9wZW5lZCBhcmUKLSAgICAgbWFkZSBjaGlsZHJlbiBvZiB0aGUgdGhlIGNvbmRpdGlvbmFsIG5vZGUsIHdoaWNoIGlzIHRoZW4gcHVzaGVkCi0gICAgIG9uIHRvIHRoZSBzdGFjay4gIElmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UgdGhlIG5vZGUgaXMgbm90Ci0gICAgIGNvbnN0cnVjdGVkIGFuZCB0aGV5IGFyZSBsZWZ0IG9uIHRoZSBzdGFjay4gKi8KLSAgdm9pZCBjbG9zZU5vZGVTY29wZShOb2RlIG4sIGJvb2xlYW4gY29uZGl0aW9uKSB7Ci0gICAgaWYgKGNvbmRpdGlvbikgewotICAgICAgaW50IGEgPSBub2RlQXJpdHkoKTsKLSAgICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgICAgd2hpbGUgKGEtLSA+IDApIHsKLQlOb2RlIGMgPSBwb3BOb2RlKCk7Ci0JYy5qanRTZXRQYXJlbnQobik7Ci0Jbi5qanRBZGRDaGlsZChjLCBhKTsKLSAgICAgIH0KLSAgICAgIG4uamp0Q2xvc2UoKTsKLSAgICAgIHB1c2hOb2RlKG4pOwotICAgICAgbm9kZV9jcmVhdGVkID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgbWsgPSAoKEludGVnZXIpbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0gICAgICBub2RlX2NyZWF0ZWQgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTC5qaiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTC5qagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzODNiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamoKKysrIC9kZXYvbnVsbApAQCAtMSw2NzUgKzAsMCBAQAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0gKiAgICAgDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLypAYmdlbihqanRyZWUpIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQRUwuamogKi8NCi0vKkBlZ2VuKi8vKiBJIGtub3cgdGhhdCBoYWluZyBzb21lIG9mIHRoZXNlIG9wdGlvbnMgb24gb25lIGxpbmUgaXMgcnVkZSBidXQgDQotICogaWYgd2UgZG9uJ3QgZG8gdGhhdCB0aGUgbGluZSBudW1iZXIgcmVwb3J0ZWQgZnJvbSBqYXZhY2MgYXJlIG9mZg0KLSAqIHdoaWNoLCB0cnVzdCBtZSwgaXMgZmFyIG1vcmUgYW5ub3lpbmcuICAtLXRjYXJyb2xsQGJlYS5jb20NCi0gKi8NCi1vcHRpb25zIHsNCi0gIEpBVkFfVU5JQ09ERV9FU0NBUEUgPSBmYWxzZTsNCi0gIFVOSUNPREVfSU5QVVQgPSB0cnVlOw0KLSAgU1RBVElDID0gZmFsc2U7DQotICBPUFRJTUlaRV9UT0tFTl9NQU5BR0VSID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi19DQotDQotUEFSU0VSX0JFR0lOKEpTUEVMUGFyc2VyKQ0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7DQotDQotcHVibGljIGNsYXNzIEpTUEVMUGFyc2VyLypAYmdlbihqanRyZWUpKi9pbXBsZW1lbnRzIEpTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy8qQGVnZW4qLyB7LypAYmdlbihqanRyZWUpKi8NCi0gIHByb3RlY3RlZCBKSlRKU1BFTFBhcnNlclN0YXRlIGpqdHJlZSA9IG5ldyBKSlRKU1BFTFBhcnNlclN0YXRlKCk7DQotDQotLypAZWdlbiovDQotICANCi0gIHZvaWQgamp0cmVlT3Blbk5vZGVTY29wZShOb2RlIG4pDQotICB7DQotICAgICAgICAgICgoU2ltcGxlTm9kZSluKS5zZXRGaXJzdFRva2VuKGdldFRva2VuKDEpKTsNCi0gIH0NCi0NCi0gIHZvaWQgamp0cmVlQ2xvc2VOb2RlU2NvcGUoTm9kZSBuKQ0KLSAgew0KLSAgICAoKFNpbXBsZU5vZGUpbikuc2V0TGFzdFRva2VuKGdldFRva2VuKDApKTsNCi0gIH0NCi0gIA0KLSAgcHVibGljIHN0YXRpYyBKU1BFTFBhcnNlciBjcmVhdGVQYXJzZXIoamF2YS5sYW5nLlN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoaW5wdXQpOw0KLSAgICAgICAgICByZXR1cm4gbmV3IEpTUEVMUGFyc2VyKHJlYWRlcik7DQotICB9DQotICANCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB7DQotICAgICAgICAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoaW5wdXQpOw0KLSAgICAgICAgICAgUmVJbml0KHJlYWRlcik7DQotICB9DQotICANCi19DQotDQotUEFSU0VSX0VORChKU1BFTFBhcnNlcikNCi0NCi1TS0lQIDoNCi17DQotICAiICINCi18ICJcdCINCi18ICJcbiINCi18ICJcciINCi19DQotDQotVE9LRU4gOg0KLXsNCi0vKiBMaXRlcmFscyAqLw0KLSAgPCBJTlRFR0VSX0xJVEVSQUw6IFsiMCItIjkiXSAoWyIwIi0iOSJdKSogPg0KLXwNCi0gIDwgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoNCi0gICAgICAgIChbIjAiLSI5Il0pKyAiLiIgKFsiMCItIjkiXSkqICg8RVhQT05FTlQ+KT8NCi0gICAgICB8ICIuIiAoWyIwIi0iOSJdKSsgKDxFWFBPTkVOVD4pPw0KLSAgICAgIHwgKFsiMCItIjkiXSkrIDxFWFBPTkVOVD4NCi0gID4NCi18DQotICA8ICNFWFBPTkVOVDogWyJlIiwiRSJdIChbIisiLCItIl0pPyAoWyIwIi0iOSJdKSsgPg0KLXwNCi0gIDwgU1RSSU5HX0xJVEVSQUw6DQotICAgICAgKCJcIiIgKCh+WyJcIiIsIlxcIl0pIHwgKCJcXCIgKCBbIlxcIiwiXCIiXSApKSkqICJcIiIpIHwNCi0gICAgICAoIlwnIiAoKH5bIlwnIiwiXFwiXSkgfCAoIlxcIiAoIFsiXFwiLCJcJyJdICkpKSogIlwnIikNCi0gID4NCi18DQotICA8IEJBRExZX0VTQ0FQRURfU1RSSU5HX0xJVEVSQUw6DQotICAgICAgKCJcIiIgKH5bIlwiIiwiXFwiXSkqICgiXFwiICggflsiXFwiLCJcIiJdICkpKSB8DQotICAgICAgKCJcJyIgKH5bIlwnIiwiXFwiXSkqICgiXFwiICggflsiXFwiLCJcJyJdICkpKQ0KLSAgPg0KLQ0KLS8qIFJlc2VydmVkIFdvcmRzIGFuZCBTeW1ib2xzICovDQotfCA8IFRSVUU6ICJ0cnVlIiA+DQotfCA8IEZBTFNFOiAiZmFsc2UiID4NCi18IDwgTlVMTDogIm51bGwiID4NCi18IDwgRE9UOiAiLiIgPg0KLXwgPCBHVDE6ICI+IiA+DQotfCA8IEdUMjogImd0IiA+DQotfCA8IExUMTogIjwiID4NCi18IDwgTFQyOiAibHQiID4NCi18IDwgRVExOiAiPT0iID4NCi18IDwgRVEyOiAiZXEiID4NCi18IDwgTEUxOiAiPD0iID4NCi18IDwgTEUyOiAibGUiID4NCi18IDwgR0UxOiAiPj0iID4NCi18IDwgR0UyOiAiZ2UiID4NCi18IDwgTkVRMTogIiE9IiA+DQotfCA8IE5FUTI6ICJuZSIgPg0KLXwgPCBMUEFSRU46ICIoIiA+DQotfCA8IFJQQVJFTjogIikiID4NCi18IDwgQ09NTUE6ICIsIiA+DQotfCA8IENPTE9OOiAiOiIgPg0KLXwgPCBMQlJBQ0tFVDogIlsiID4NCi18IDwgUkJSQUNLRVQ6ICJdIiA+DQotfCA8IFBMVVM6ICIrIiA+DQotfCA8IE1JTlVTOiAiLSIgPg0KLXwgPCBNVUxUSVBMWTogIioiID4NCi18IDwgRElWSURFMTogIi8iID4NCi18IDwgRElWSURFMjogImRpdiIgPg0KLXwgPCBNT0RVTFVTMTogIiUiID4NCi18IDwgTU9EVUxVUzI6ICJtb2QiID4NCi18IDwgTk9UMTogIm5vdCIgPg0KLXwgPCBOT1QyOiAiISIgPg0KLXwgPCBBTkQxOiAiYW5kIiA+DQotfCA8IEFORDI6ICImJiIgPg0KLXwgPCBPUjE6ICJvciIgPg0KLXwgPCBPUjI6ICJ8fCIgPg0KLXwgPCBFTVBUWTogImVtcHR5IiA+DQotfCA8IENPTkQ6ICI/IiA+DQotDQotLyogSWRlbnRpZmllcnMgKi8NCi0NCi18IDwgSURFTlRJRklFUjogKDxMRVRURVI+fDxJTVBMX09CSl9TVEFSVD4pICg8TEVUVEVSPnw8RElHSVQ+KSogPg0KLXwgPCAjSU1QTF9PQkpfU1RBUlQ6ICIjIiA+DQotfA0KLSAgPCAjTEVUVEVSOg0KLSAgICAgIFsNCi0gICAgICAgIiQiLA0KLSAgICAgICAiQSItIloiLA0KLSAgICAgICAiXyIsDQotICAgICAgICJhIi0ieiIsDQotICAgICAgICJcdTAwYzAiLSJcdTAwZDYiLA0KLSAgICAgICAiXHUwMGQ4Ii0iXHUwMGY2IiwNCi0gICAgICAgIlx1MDBmOCItIlx1MDBmZiIsDQotICAgICAgICJcdTAxMDAiLSJcdTFmZmYiLA0KLSAgICAgICAiXHUzMDQwIi0iXHUzMThmIiwNCi0gICAgICAgIlx1MzMwMCItIlx1MzM3ZiIsDQotICAgICAgICJcdTM0MDAiLSJcdTNkMmQiLA0KLSAgICAgICAiXHU0ZTAwIi0iXHU5ZmZmIiwNCi0gICAgICAgIlx1ZjkwMCItIlx1ZmFmZiINCi0gICAgICBdDQotICA+DQotfA0KLSAgPCAjRElHSVQ6DQotICAgICAgWw0KLSAgICAgICAiMCItIjkiLA0KLSAgICAgICAiXHUwNjYwIi0iXHUwNjY5IiwNCi0gICAgICAgIlx1MDZmMCItIlx1MDZmOSIsDQotICAgICAgICJcdTA5NjYiLSJcdTA5NmYiLA0KLSAgICAgICAiXHUwOWU2Ii0iXHUwOWVmIiwNCi0gICAgICAgIlx1MGE2NiItIlx1MGE2ZiIsDQotICAgICAgICJcdTBhZTYiLSJcdTBhZWYiLA0KLSAgICAgICAiXHUwYjY2Ii0iXHUwYjZmIiwNCi0gICAgICAgIlx1MGJlNyItIlx1MGJlZiIsDQotICAgICAgICJcdTBjNjYiLSJcdTBjNmYiLA0KLSAgICAgICAiXHUwY2U2Ii0iXHUwY2VmIiwNCi0gICAgICAgIlx1MGQ2NiItIlx1MGQ2ZiIsDQotICAgICAgICJcdTBlNTAiLSJcdTBlNTkiLA0KLSAgICAgICAiXHUwZWQwIi0iXHUwZWQ5IiwNCi0gICAgICAgIlx1MTA0MCItIlx1MTA0OSINCi0gICAgICBdDQotICA+DQotfQ0KLQ0KLUFTVEV4cHJlc3Npb24gRXhwcmVzc2lvbigpIDogey8qQGJnZW4oamp0cmVlKSBFeHByZXNzaW9uICovDQotICBBU1RFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXhwcmVzc2lvbihKSlRFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIChMT09LQUhFQUQoIj8iKSBDaG9pY2VFeHByZXNzaW9uKCkgfCBPckV4cHJlc3Npb24oKSkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLS8qQGVnZW4qLyB7IHJldHVybiBqanRuMDAwOyB9LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBPckV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgI09yRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RPckV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RPckV4cHJlc3Npb24oSkpUT1JFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNPckV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFuZEV4cHJlc3Npb24oKSAoKHQgPSA8T1IxPiB8IHQgPSA8T1IyPikgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIEFuZEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBBbmRFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgIDogDQotey8qQGJnZW4oamp0cmVlKSAjQW5kRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RBbmRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQW5kRXhwcmVzc2lvbihKSlRBTkRFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNBbmRFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKSAoKHQgPSA8QU5EMT4gfCB0ID0gPEFORDI+KSB7IGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovICAgICAgICANCi19DQotDQotdm9pZCBFcXVhbGl0eUV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICAgICAgICA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgI0VxdWFsaXR5RXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RFcXVhbGl0eUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RFcXVhbGl0eUV4cHJlc3Npb24oSkpURVFVQUxJVFlFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNFcXVhbGl0eUV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgDQotICAgICAgICAoKHQgPSA8RVExPiB8IHQgPSA8RVEyPiB8IHQgPSA8TkVRMT4gfCB0ID0gPE5FUTI+KSB7IGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgOg0KLXsvKkBiZ2VuKGpqdHJlZSkgI1JlbGF0aW9uYWxFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24oSkpUUkVMQVRJT05BTEVYUFJFU1NJT04pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgI1JlbGF0aW9uYWxFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBBZGRFeHByZXNzaW9uKCkgDQotICAgICAgICAoDQotICAgICAgICAgICAgICAgICh0ID0gPExUMT4gfCB0ID0gPExUMj4gfCB0ID0gPEdUMT4gfCB0ID0gPEdUMj4gfCB0ID0gPEdFMT4gfCB0ID0gPEdFMj4gfCB0ID0gPExFMT4gfCB0ID0gPExFMj4pICB7IGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgICAgICAgICBBZGRFeHByZXNzaW9uKCkNCi0gICAgICAgICkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBBZGRFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgIDogDQotey8qQGJnZW4oamp0cmVlKSAjQWRkRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RBZGRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQWRkRXhwcmVzc2lvbihKSlRBRERFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNBZGRFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBNdWx0aXBseUV4cHJlc3Npb24oKSAoKHQgPSA8UExVUz4gfCB0ID0gPE1JTlVTPikgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIE11bHRpcGx5RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIE11bHRpcGx5RXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgICAgICAgIDogDQotey8qQGJnZW4oamp0cmVlKSAjTXVsdGlwbHlFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIEFTVE11bHRpcGx5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE11bHRpcGx5RXhwcmVzc2lvbihKSlRNVUxUSVBMWUVYUFJFU1NJT04pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgI011bHRpcGx5RXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCkgKA0KLSAgICAgICAgICAgICAgICAoIHQgPSA8TVVMVElQTFk+IHwgdCA9IDxESVZJREUxPiB8IHQgPSA8RElWSURFMj4gfCB0ID0gPE1PRFVMVVMxPiB8IHQgPSA8TU9EVUxVUzI+KSB7IGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAgICAgICAgDQotICAgICAgICApKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQ2hvaWNlRXhwcmVzc2lvbigpIDogey8qQGJnZW4oamp0cmVlKSBDaG9pY2VFeHByZXNzaW9uICovDQotICBBU1RDaG9pY2VFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQ2hvaWNlRXhwcmVzc2lvbihKSlRDSE9JQ0VFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQ2hvaWNlRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIE9yRXhwcmVzc2lvbigpIDxDT05EPiBPckV4cHJlc3Npb24oKSA8Q09MT04+IE9yRXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBVbmFyeUV4cHJlc3Npb24oKSA6IHsvKkBiZ2VuKGpqdHJlZSkgVW5hcnlFeHByZXNzaW9uICovDQotICBBU1RVbmFyeUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RVbmFyeUV4cHJlc3Npb24oSkpUVU5BUllFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVW5hcnlFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgKCg8Tk9UMT4gfCA8Tk9UMj4gfCA8TUlOVVM+IHwgPEVNUFRZPikgVW5hcnlFeHByZXNzaW9uKCkpDQotICAgICAgICB8IFZhbHVlKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLSAgICAgICAgDQotfQ0KLQ0KLXZvaWQgVmFsdWUoKSA6IHsvKkBiZ2VuKGpqdHJlZSkgVmFsdWUgKi8NCi0gIEFTVFZhbHVlIGpqdG4wMDAgPSBuZXcgQVNUVmFsdWUoSkpUVkFMVUUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYWx1ZSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFZhbHVlUHJlZml4KCkgKFZhbHVlU3VmZml4KCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVmFsdWVQcmVmaXgoKSA6IHsvKkBiZ2VuKGpqdHJlZSkgVmFsdWVQcmVmaXggKi8NCi0gIEFTVFZhbHVlUHJlZml4IGpqdG4wMDAgPSBuZXcgQVNUVmFsdWVQcmVmaXgoSkpUVkFMVUVQUkVGSVgpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYWx1ZVByZWZpeCAqLw0KLSAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICBMaXRlcmFsKCkgfCAoPExQQVJFTj4gRXhwcmVzc2lvbigpIDxSUEFSRU4+KSB8IExPT0tBSEVBRCgzKSBGdW5jdGlvbkludm9jYXRpb24oKSB8IDxJREVOVElGSUVSPi8qQGJnZW4oamp0cmVlKSovDQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICB9DQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgIH0NCi0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICB9DQotICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgIH0gZmluYWxseSB7DQotICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgIH0NCi0gICAgfQ0KLS8qQGVnZW4qLyANCi19DQotDQotdm9pZCBWYWx1ZVN1ZmZpeCgpIDogDQotey8qQGJnZW4oamp0cmVlKSBWYWx1ZVN1ZmZpeCAqLw0KLSAgICAgICAgQVNUVmFsdWVTdWZmaXggamp0bjAwMCA9IG5ldyBBU1RWYWx1ZVN1ZmZpeChKSlRWQUxVRVNVRkZJWCk7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdCA9IG51bGw7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFsdWVTdWZmaXggKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAoPERPVD4gKHQgPSA8SURFTlRJRklFUj4pPykvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0vKkBlZ2VuKi8geyBqanRuMDAwLnNldFByb3BlcnR5TmFtZVRva2VuKHQpOyB9DQotICAgICAgICB8ICg8TEJSQUNLRVQ+IEV4cHJlc3Npb24oKSA8UkJSQUNLRVQ+KS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVuY3Rpb25JbnZvY2F0aW9uKCkgOiANCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uSW52b2NhdGlvbiAqLw0KLSAgICAgICAgQVNURnVuY3Rpb25JbnZvY2F0aW9uIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25JbnZvY2F0aW9uKEpKVEZVTkNUSU9OSU5WT0NBVElPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gcHJlZml4ID0gbnVsbCwgbmFtZSA9IG51bGw7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25JbnZvY2F0aW9uICovDQotICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgIChwcmVmaXggPSA8SURFTlRJRklFUj4gPENPTE9OPikgeyBqanRuMDAwLnNldEZ1bGxGdW5jdGlvbk5hbWUocHJlZml4LmltYWdlICsgIjoiKTsgfQ0KLSAgICAgICAgKG5hbWUgPSA8SURFTlRJRklFUj4pPyB7DQotICAgICAgICAgICAgaWYobnVsbCAhPSBwcmVmaXggJiYgbnVsbCAhPSBuYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6IiArIChudWxsID09IG5hbWUgPyAiIiA6IG5hbWUuaW1hZ2UpKTsNCi0gICAgICAgICAgICBlbHNlIGlmKG51bGwgIT0gbmFtZSkNCi0gICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShuYW1lLmltYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgICg8TFBBUkVOPiBFeHByZXNzaW9uKCkgKDxDT01NQT4gRXhwcmVzc2lvbigpKSogdHJ5ICB7ICg8UlBBUkVOPikgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9ICk/LypAYmdlbihqanRyZWUpKi8NCi0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgIH0NCi0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgfQ0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgIH0NCi0gICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgfSBmaW5hbGx5IHsNCi0gICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgfQ0KLSAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgTGl0ZXJhbCgpIDogey8qQGJnZW4oamp0cmVlKSBMaXRlcmFsICovDQotICBBU1RMaXRlcmFsIGpqdG4wMDAgPSBuZXcgQVNUTGl0ZXJhbChKSlRMSVRFUkFMKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxUUlVFPiB8IDxGQUxTRT4gfCA8SU5URUdFUl9MSVRFUkFMPiB8IDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiB8IDxTVFJJTkdfTElURVJBTD4gfCA8TlVMTD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMLmpqdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTC5qanQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZDQwZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMLmpqdAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSAqICAgICANCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBJIGtub3cgdGhhdCBoYXZpbmcgc29tZSBvZiB0aGVzZSBvcHRpb25zIG9uIG9uZSBsaW5lIGlzIHJ1ZGUgYnV0IA0KLSAqIGlmIHdlIGRvbid0IGRvIHRoYXQgdGhlIGxpbmUgbnVtYmVyIHJlcG9ydGVkIGZyb20gamF2YWNjIGFyZSBvZmYNCi0gKiB3aGljaCwgdHJ1c3QgbWUsIGlzIGZhciBtb3JlIGFubm95aW5nLiAgLS10Y2Fycm9sbEBiZWEuY29tDQotICovDQotb3B0aW9ucyB7DQotICBKQVZBX1VOSUNPREVfRVNDQVBFID0gZmFsc2U7DQotICBVTklDT0RFX0lOUFVUID0gdHJ1ZTsNCi0gIFNUQVRJQyA9IGZhbHNlOw0KLSAgT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiA9IHRydWU7IE1VTFRJID0gdHJ1ZTsgVklTSVRPUiA9IHRydWU7IE5PREVfUEFDS0FHRSA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbCI7IE5PREVfU0NPUEVfSE9PSyA9IHRydWU7DQotfQ0KLQ0KLVBBUlNFUl9CRUdJTihKU1BFTFBhcnNlcikNCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOw0KLQ0KLXB1YmxpYyBjbGFzcyBKU1BFTFBhcnNlciB7DQotICANCi0gIHZvaWQgamp0cmVlT3Blbk5vZGVTY29wZShOb2RlIG4pDQotICB7DQotICAgICAgICAgICgoU2ltcGxlTm9kZSluKS5zZXRGaXJzdFRva2VuKGdldFRva2VuKDEpKTsNCi0gIH0NCi0NCi0gIHZvaWQgamp0cmVlQ2xvc2VOb2RlU2NvcGUoTm9kZSBuKQ0KLSAgew0KLSAgICAoKFNpbXBsZU5vZGUpbikuc2V0TGFzdFRva2VuKGdldFRva2VuKDApKTsNCi0gIH0NCi0gIA0KLSAgcHVibGljIHN0YXRpYyBKU1BFTFBhcnNlciBjcmVhdGVQYXJzZXIoamF2YS5sYW5nLlN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoaW5wdXQpOw0KLSAgICAgICAgICByZXR1cm4gbmV3IEpTUEVMUGFyc2VyKHJlYWRlcik7DQotICB9DQotICANCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB7DQotICAgICAgICAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoaW5wdXQpOw0KLSAgICAgICAgICAgUmVJbml0KHJlYWRlcik7DQotICB9DQotICANCi19DQotDQotUEFSU0VSX0VORChKU1BFTFBhcnNlcikNCi0NCi1TS0lQIDoNCi17DQotICAiICINCi18ICJcdCINCi18ICJcbiINCi18ICJcciINCi19DQotDQotVE9LRU4gOg0KLXsNCi0vKiBMaXRlcmFscyAqLw0KLSAgPCBJTlRFR0VSX0xJVEVSQUw6IFsiMCItIjkiXSAoWyIwIi0iOSJdKSogPg0KLXwNCi0gIDwgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoNCi0gICAgICAgIChbIjAiLSI5Il0pKyAiLiIgKFsiMCItIjkiXSkqICg8RVhQT05FTlQ+KT8NCi0gICAgICB8ICIuIiAoWyIwIi0iOSJdKSsgKDxFWFBPTkVOVD4pPw0KLSAgICAgIHwgKFsiMCItIjkiXSkrIDxFWFBPTkVOVD4NCi0gID4NCi18DQotICA8ICNFWFBPTkVOVDogWyJlIiwiRSJdIChbIisiLCItIl0pPyAoWyIwIi0iOSJdKSsgPg0KLXwNCi0gIDwgU1RSSU5HX0xJVEVSQUw6DQotICAgICAgKCJcIiIgKCh+WyJcIiIsIlxcIl0pIHwgKCJcXCIgKCBbIlxcIiwiXCIiXSApKSkqICJcIiIpIHwNCi0gICAgICAoIlwnIiAoKH5bIlwnIiwiXFwiXSkgfCAoIlxcIiAoIFsiXFwiLCJcJyJdICkpKSogIlwnIikNCi0gID4NCi18DQotICA8IEJBRExZX0VTQ0FQRURfU1RSSU5HX0xJVEVSQUw6DQotICAgICAgKCJcIiIgKH5bIlwiIiwiXFwiXSkqICgiXFwiICggflsiXFwiLCJcIiJdICkpKSB8DQotICAgICAgKCJcJyIgKH5bIlwnIiwiXFwiXSkqICgiXFwiICggflsiXFwiLCJcJyJdICkpKQ0KLSAgPg0KLQ0KLS8qIFJlc2VydmVkIFdvcmRzIGFuZCBTeW1ib2xzICovDQotfCA8IFRSVUU6ICJ0cnVlIiA+DQotfCA8IEZBTFNFOiAiZmFsc2UiID4NCi18IDwgTlVMTDogIm51bGwiID4NCi18IDwgRE9UOiAiLiIgPg0KLXwgPCBHVDE6ICI+IiA+DQotfCA8IEdUMjogImd0IiA+DQotfCA8IExUMTogIjwiID4NCi18IDwgTFQyOiAibHQiID4NCi18IDwgRVExOiAiPT0iID4NCi18IDwgRVEyOiAiZXEiID4NCi18IDwgTEUxOiAiPD0iID4NCi18IDwgTEUyOiAibGUiID4NCi18IDwgR0UxOiAiPj0iID4NCi18IDwgR0UyOiAiZ2UiID4NCi18IDwgTkVRMTogIiE9IiA+DQotfCA8IE5FUTI6ICJuZSIgPg0KLXwgPCBMUEFSRU46ICIoIiA+DQotfCA8IFJQQVJFTjogIikiID4NCi18IDwgQ09NTUE6ICIsIiA+DQotfCA8IENPTE9OOiAiOiIgPg0KLXwgPCBMQlJBQ0tFVDogIlsiID4NCi18IDwgUkJSQUNLRVQ6ICJdIiA+DQotfCA8IFBMVVM6ICIrIiA+DQotfCA8IE1JTlVTOiAiLSIgPg0KLXwgPCBNVUxUSVBMWTogIioiID4NCi18IDwgRElWSURFMTogIi8iID4NCi18IDwgRElWSURFMjogImRpdiIgPg0KLXwgPCBNT0RVTFVTMTogIiUiID4NCi18IDwgTU9EVUxVUzI6ICJtb2QiID4NCi18IDwgTk9UMTogIm5vdCIgPg0KLXwgPCBOT1QyOiAiISIgPg0KLXwgPCBBTkQxOiAiYW5kIiA+DQotfCA8IEFORDI6ICImJiIgPg0KLXwgPCBPUjE6ICJvciIgPg0KLXwgPCBPUjI6ICJ8fCIgPg0KLXwgPCBFTVBUWTogImVtcHR5IiA+DQotfCA8IENPTkQ6ICI/IiA+DQotDQotLyogSWRlbnRpZmllcnMgKi8NCi0NCi18IDwgSURFTlRJRklFUjogKDxMRVRURVI+fDxJTVBMX09CSl9TVEFSVD4pICg8TEVUVEVSPnw8RElHSVQ+KSogPg0KLXwgPCAjSU1QTF9PQkpfU1RBUlQ6ICIjIiA+DQotfA0KLSAgPCAjTEVUVEVSOg0KLSAgICAgIFsNCi0gICAgICAgIlx1MDAyNCIsDQotICAgICAgICJcdTAwNDEiLSJcdTAwNWEiLA0KLSAgICAgICAiXHUwMDVmIiwNCi0gICAgICAgIlx1MDA2MSItIlx1MDA3YSIsDQotICAgICAgICJcdTAwYzAiLSJcdTAwZDYiLA0KLSAgICAgICAiXHUwMGQ4Ii0iXHUwMGY2IiwNCi0gICAgICAgIlx1MDBmOCItIlx1MDBmZiIsDQotICAgICAgICJcdTAxMDAiLSJcdTFmZmYiLA0KLSAgICAgICAiXHUzMDQwIi0iXHUzMThmIiwNCi0gICAgICAgIlx1MzMwMCItIlx1MzM3ZiIsDQotICAgICAgICJcdTM0MDAiLSJcdTNkMmQiLA0KLSAgICAgICAiXHU0ZTAwIi0iXHU5ZmZmIiwNCi0gICAgICAgIlx1ZjkwMCItIlx1ZmFmZiINCi0gICAgICBdDQotICA+DQotfA0KLSAgPCAjRElHSVQ6DQotICAgICAgWw0KLSAgICAgICAiXHUwMDMwIi0iXHUwMDM5IiwNCi0gICAgICAgIlx1MDY2MCItIlx1MDY2OSIsDQotICAgICAgICJcdTA2ZjAiLSJcdTA2ZjkiLA0KLSAgICAgICAiXHUwOTY2Ii0iXHUwOTZmIiwNCi0gICAgICAgIlx1MDllNiItIlx1MDllZiIsDQotICAgICAgICJcdTBhNjYiLSJcdTBhNmYiLA0KLSAgICAgICAiXHUwYWU2Ii0iXHUwYWVmIiwNCi0gICAgICAgIlx1MGI2NiItIlx1MGI2ZiIsDQotICAgICAgICJcdTBiZTciLSJcdTBiZWYiLA0KLSAgICAgICAiXHUwYzY2Ii0iXHUwYzZmIiwNCi0gICAgICAgIlx1MGNlNiItIlx1MGNlZiIsDQotICAgICAgICJcdTBkNjYiLSJcdTBkNmYiLA0KLSAgICAgICAiXHUwZTUwIi0iXHUwZTU5IiwNCi0gICAgICAgIlx1MGVkMCItIlx1MGVkOSIsDQotICAgICAgICJcdTEwNDAiLSJcdTEwNDkiDQotICAgICAgXQ0KLSAgPg0KLX0NCi0NCi1BU1RFeHByZXNzaW9uIEV4cHJlc3Npb24oKSA6IHt9DQotew0KLSAgICAgICAgKExPT0tBSEVBRCgiPyIpIENob2ljZUV4cHJlc3Npb24oKSB8IE9yRXhwcmVzc2lvbigpKSB7IHJldHVybiBqanRUaGlzOyB9DQotfQ0KLQ0KLXZvaWQgT3JFeHByZXNzaW9uKCkgI09yRXhwcmVzc2lvbig+MSkgOiANCi17DQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17DQotICAgICAgICBBbmRFeHByZXNzaW9uKCkgKCh0ID0gPE9SMT4gfCB0ID0gPE9SMj4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBBbmRFeHByZXNzaW9uKCkpKg0KLX0NCi0NCi12b2lkIEFuZEV4cHJlc3Npb24oKSAjQW5kRXhwcmVzc2lvbig+MSkgOiANCi17DQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17DQotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKSAoKHQgPSA8QU5EMT4gfCB0ID0gPEFORDI+KSB7IGpqdFRoaXMuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkpKiAgICAgICAgDQotfQ0KLQ0KLXZvaWQgRXF1YWxpdHlFeHByZXNzaW9uKCkgI0VxdWFsaXR5RXhwcmVzc2lvbig+MSkgOiANCi17DQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17DQotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpIA0KLSAgICAgICAgKCh0ID0gPEVRMT4gfCB0ID0gPEVRMj4gfCB0ID0gPE5FUTE+IHwgdCA9IDxORVEyPikgeyBqanRUaGlzLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkpKg0KLX0NCi0NCi12b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgI1JlbGF0aW9uYWxFeHByZXNzaW9uKD4xKSA6DQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgQWRkRXhwcmVzc2lvbigpIA0KLSAgICAgICAgKA0KLSAgICAgICAgICAgICAgICAodCA9IDxMVDE+IHwgdCA9IDxMVDI+IHwgdCA9IDxHVDE+IHwgdCA9IDxHVDI+IHwgdCA9IDxHRTE+IHwgdCA9IDxHRTI+IHwgdCA9IDxMRTE+IHwgdCA9IDxMRTI+KSAgeyBqanRUaGlzLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgICAgICAgICAgQWRkRXhwcmVzc2lvbigpDQotICAgICAgICApKg0KLX0NCi0NCi12b2lkIEFkZEV4cHJlc3Npb24oKSAjQWRkRXhwcmVzc2lvbig+MSkgOiANCi17DQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17DQotICAgICAgICBNdWx0aXBseUV4cHJlc3Npb24oKSAoKHQgPSA8UExVUz4gfCB0ID0gPE1JTlVTPikgeyBqanRUaGlzLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIE11bHRpcGx5RXhwcmVzc2lvbigpKSoNCi19DQotDQotdm9pZCBNdWx0aXBseUV4cHJlc3Npb24oKSAjTXVsdGlwbHlFeHByZXNzaW9uKD4xKSA6IA0KLXsNCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsNCi0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpICgNCi0gICAgICAgICAgICAgICAgKCB0ID0gPE1VTFRJUExZPiB8IHQgPSA8RElWSURFMT4gfCB0ID0gPERJVklERTI+IHwgdCA9IDxNT0RVTFVTMT4gfCB0ID0gPE1PRFVMVVMyPikgeyBqanRUaGlzLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgICAgICAgICAgVW5hcnlFeHByZXNzaW9uKCkgICAgICAgIA0KLSAgICAgICAgKSoNCi19DQotDQotdm9pZCBDaG9pY2VFeHByZXNzaW9uKCkgOiB7fQ0KLXsNCi0gICAgICAgIE9yRXhwcmVzc2lvbigpIDxDT05EPiBPckV4cHJlc3Npb24oKSA8Q09MT04+IE9yRXhwcmVzc2lvbigpDQotfQ0KLQ0KLXZvaWQgVW5hcnlFeHByZXNzaW9uKCkgOiB7fQ0KLXsNCi0gICAgICAgICgoPE5PVDE+IHwgPE5PVDI+IHwgPE1JTlVTPiB8IDxFTVBUWT4pIFVuYXJ5RXhwcmVzc2lvbigpKQ0KLSAgICAgICAgfCBWYWx1ZSgpDQotICAgICAgICANCi19DQotDQotdm9pZCBWYWx1ZSgpIDoge30NCi17DQotICAgICAgICBWYWx1ZVByZWZpeCgpIChWYWx1ZVN1ZmZpeCgpKSoNCi19DQotDQotdm9pZCBWYWx1ZVByZWZpeCgpIDoge30NCi17DQotICAgIExpdGVyYWwoKSB8ICg8TFBBUkVOPiBFeHByZXNzaW9uKCkgPFJQQVJFTj4pIHwgTE9PS0FIRUFEKDMpIEZ1bmN0aW9uSW52b2NhdGlvbigpIHwgPElERU5USUZJRVI+IA0KLX0NCi0NCi12b2lkIFZhbHVlU3VmZml4KCkgOiANCi17DQotICAgICAgICBUb2tlbiB0ID0gbnVsbDsNCi19DQotew0KLSAgICAgICAgKDxET1Q+ICh0ID0gPElERU5USUZJRVI+KT8pIHsgamp0VGhpcy5zZXRQcm9wZXJ0eU5hbWVUb2tlbih0KTsgfQ0KLSAgICAgICAgfCAoPExCUkFDS0VUPiBFeHByZXNzaW9uKCkgPFJCUkFDS0VUPikNCi19DQotDQotdm9pZCBGdW5jdGlvbkludm9jYXRpb24oKSA6IA0KLXsNCi0gICAgICAgIFRva2VuIHByZWZpeCA9IG51bGwsIG5hbWUgPSBudWxsOw0KLX0NCi17DQotICAgIChwcmVmaXggPSA8SURFTlRJRklFUj4gPENPTE9OPikgeyBqanRUaGlzLnNldEZ1bGxGdW5jdGlvbk5hbWUocHJlZml4LmltYWdlICsgIjoiKTsgfQ0KLSAgICAgICAgKG5hbWUgPSA8SURFTlRJRklFUj4pPyB7DQotICAgICAgICAgICAgaWYobnVsbCAhPSBwcmVmaXggJiYgbnVsbCAhPSBuYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgamp0VGhpcy5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6IiArIChudWxsID09IG5hbWUgPyAiIiA6IG5hbWUuaW1hZ2UpKTsNCi0gICAgICAgICAgICBlbHNlIGlmKG51bGwgIT0gbmFtZSkNCi0gICAgICAgICAgICAgICAgICAgIGpqdFRoaXMuc2V0RnVsbEZ1bmN0aW9uTmFtZShuYW1lLmltYWdlKTsNCi0gICAgICAgIH0NCi0gICAgICAgICg8TFBBUkVOPiBFeHByZXNzaW9uKCkgKDxDT01NQT4gRXhwcmVzc2lvbigpKSogdHJ5ICB7ICg8UlBBUkVOPikgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9ICk/DQotfQ0KLQ0KLXZvaWQgTGl0ZXJhbCgpIDoge30NCi17DQotICAgICAgICA8VFJVRT4gfCA8RkFMU0U+IHwgPElOVEVHRVJfTElURVJBTD4gfCA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gfCA8U1RSSU5HX0xJVEVSQUw+IHwgPE5VTEw+DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDFiYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZSZKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQRUxQYXJzZXIuamF2YSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEpTUEVMUGFyc2VyLypAYmdlbihqanRyZWUpKi9pbXBsZW1lbnRzIEpTUEVMUGFyc2VyVHJlZUNvbnN0YW50cywgSlNQRUxQYXJzZXJDb25zdGFudHMgey8qQGJnZW4oamp0cmVlKSovCi0gIHByb3RlY3RlZCBKSlRKU1BFTFBhcnNlclN0YXRlIGpqdHJlZSA9IG5ldyBKSlRKU1BFTFBhcnNlclN0YXRlKCk7Ci0gIHZvaWQgamp0cmVlT3Blbk5vZGVTY29wZShOb2RlIG4pCi0gIHsKLSAgICAgICAgICAoKFNpbXBsZU5vZGUpbikuc2V0Rmlyc3RUb2tlbihnZXRUb2tlbigxKSk7Ci0gIH0KLQotICB2b2lkIGpqdHJlZUNsb3NlTm9kZVNjb3BlKE5vZGUgbikKLSAgewotICAgICgoU2ltcGxlTm9kZSluKS5zZXRMYXN0VG9rZW4oZ2V0VG9rZW4oMCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBKU1BFTFBhcnNlciBjcmVhdGVQYXJzZXIoamF2YS5sYW5nLlN0cmluZyBpbnB1dCkgewotICAgICAgICAgIGphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihpbnB1dCk7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBKU1BFTFBhcnNlcihyZWFkZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHsKLSAgICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsKLSAgICAgICAgICAgUmVJbml0KHJlYWRlcik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgQVNURXhwcmVzc2lvbiBFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBFeHByZXNzaW9uICovCi0gIEFTVEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RFeHByZXNzaW9uKEpKVEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgaWYgKGpqXzJfMSgyMTQ3NDgzNjQ3KSkgewotICAgICAgICBDaG9pY2VFeHByZXNzaW9uKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIE5VTEw6Ci0gICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICBjYXNlIE5PVDE6Ci0gICAgICAgIGNhc2UgTk9UMjoKLSAgICAgICAgY2FzZSBFTVBUWToKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIE9yRXhwcmVzc2lvbigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVswXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiBqanRuMDAwO30KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE9yRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpICNPckV4cHJlc3Npb24oPiAxKSAqLwotICAgICAgICBBU1RPckV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RPckV4cHJlc3Npb24oSkpUT1JFWFBSRVNTSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gdDsKLSAgICB0cnkgewotICAgICAgQW5kRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIE9SMToKLSAgICAgICAgY2FzZSBPUjI6Ci0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzFdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzE7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgT1IxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE9SMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT1IyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE9SMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzJdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7Ci0gICAgICAgIEFuZEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBBbmRFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgI0FuZEV4cHJlc3Npb24oPiAxKSAqLwotICAgICAgICBBU1RBbmRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQW5kRXhwcmVzc2lvbihKSlRBTkRFWFBSRVNTSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gdDsKLSAgICB0cnkgewotICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8yOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQU5EMToKLSAgICAgICAgY2FzZSBBTkQyOgotICAgICAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVszXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEFORDE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oQU5EMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQU5EMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihBTkQyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7Ci0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEVxdWFsaXR5RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpICNFcXVhbGl0eUV4cHJlc3Npb24oPiAxKSAqLwotICAgICAgICBBU1RFcXVhbGl0eUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RFcXVhbGl0eUV4cHJlc3Npb24oSkpURVFVQUxJVFlFWFBSRVNTSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gdDsKLSAgICB0cnkgewotICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzM6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBFUTE6Ci0gICAgICAgIGNhc2UgRVEyOgotICAgICAgICBjYXNlIE5FUTE6Ci0gICAgICAgIGNhc2UgTkVRMjoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMzsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBFUTE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oRVExKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFUTI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oRVEyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBORVExOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE5FUTEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5FUTI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTkVRMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzZdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOwotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgI1JlbGF0aW9uYWxFeHByZXNzaW9uKD4gMSkgKi8KLSAgICAgICAgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbihKSlRSRUxBVElPTkFMRVhQUkVTU0lPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQ7Ci0gICAgdHJ5IHsKLSAgICAgIEFkZEV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzQ6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBHVDE6Ci0gICAgICAgIGNhc2UgR1QyOgotICAgICAgICBjYXNlIExUMToKLSAgICAgICAgY2FzZSBMVDI6Ci0gICAgICAgIGNhc2UgTEUxOgotICAgICAgICBjYXNlIExFMjoKLSAgICAgICAgY2FzZSBHRTE6Ci0gICAgICAgIGNhc2UgR0UyOgotICAgICAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs3XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF80OwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIExUMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihMVDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExUMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihMVDIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdUMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihHVDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdUMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihHVDIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdFMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihHRTEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdFMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihHRTIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExFMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihMRTEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExFMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihMRTIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs4XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsKLSAgICAgICAgQWRkRXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEFkZEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSAjQWRkRXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVEFkZEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBZGRFeHByZXNzaW9uKEpKVEFEREVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBNdWx0aXBseUV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzU6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBQTFVTOgotICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs5XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF81OwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oUExVUyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTUlOVVMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOwotICAgICAgICBNdWx0aXBseUV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBNdWx0aXBseUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSAjTXVsdGlwbHlFeHByZXNzaW9uKD4gMSkgKi8KLSAgICAgICAgQVNUTXVsdGlwbHlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTXVsdGlwbHlFeHByZXNzaW9uKEpKVE1VTFRJUExZRVhQUkVTU0lPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQ7Ci0gICAgdHJ5IHsKLSAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfNjoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIE1VTFRJUExZOgotICAgICAgICBjYXNlIERJVklERTE6Ci0gICAgICAgIGNhc2UgRElWSURFMjoKLSAgICAgICAgY2FzZSBNT0RVTFVTMToKLSAgICAgICAgY2FzZSBNT0RVTFVTMjoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTFdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzY7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgTVVMVElQTFk6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTVVMVElQTFkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERJVklERTE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oRElWSURFMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRElWSURFMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihESVZJREUyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNT0RVTFVTMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihNT0RVTFVTMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTU9EVUxVUzI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTU9EVUxVUzIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMl0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQ2hvaWNlRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgQ2hvaWNlRXhwcmVzc2lvbiAqLwotICBBU1RDaG9pY2VFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQ2hvaWNlRXhwcmVzc2lvbihKSlRDSE9JQ0VFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIE9yRXhwcmVzc2lvbigpOwotICAgICAgampfY29uc3VtZV90b2tlbihDT05EKTsKLSAgICAgIE9yRXhwcmVzc2lvbigpOwotICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICBPckV4cHJlc3Npb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBVbmFyeUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgVW5hcnlFeHByZXNzaW9uICovCi0gIEFTVFVuYXJ5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFVuYXJ5RXhwcmVzc2lvbihKSlRVTkFSWUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgY2FzZSBOT1QxOgotICAgICAgY2FzZSBOT1QyOgotICAgICAgY2FzZSBFTVBUWToKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgTk9UMToKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5PVDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5PVDI6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihOT1QyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE1JTlVTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFTVBUWToKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEVNUFRZKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTNdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgVmFsdWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTRdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFsdWUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBWYWx1ZSAqLwotICBBU1RWYWx1ZSBqanRuMDAwID0gbmV3IEFTVFZhbHVlKEpKVFZBTFVFKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFZhbHVlUHJlZml4KCk7Ci0gICAgICBsYWJlbF83OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRE9UOgotICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxNV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfNzsKLSAgICAgICAgfQotICAgICAgICBWYWx1ZVN1ZmZpeCgpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhbHVlUHJlZml4KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgVmFsdWVQcmVmaXggKi8KLSAgQVNUVmFsdWVQcmVmaXggamp0bjAwMCA9IG5ldyBBU1RWYWx1ZVByZWZpeChKSlRWQUxVRVBSRUZJWCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICAgIExpdGVyYWwoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBFeHByZXNzaW9uKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTZdID0gampfZ2VuOwotICAgICAgICBpZiAoampfMl8yKDMpKSB7Ci0gICAgICAgICAgRnVuY3Rpb25JbnZvY2F0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbMTddID0gampfZ2VuOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgfQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICB9Ci0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgfQotICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFsdWVTdWZmaXgoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBWYWx1ZVN1ZmZpeCAqLwotICAgICAgICBBU1RWYWx1ZVN1ZmZpeCBqanRuMDAwID0gbmV3IEFTVFZhbHVlU3VmZml4KEpKVFZBTFVFU1VGRklYKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gdCA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBET1Q6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRE9UKTsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMThdID0gampfZ2VuOwotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5zZXRQcm9wZXJ0eU5hbWVUb2tlbih0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDS0VUKTsKLSAgICAgICAgRXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDS0VUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTldID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRnVuY3Rpb25JbnZvY2F0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25JbnZvY2F0aW9uICovCi0gICAgICAgIEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uSW52b2NhdGlvbihKSlRGVU5DVElPTklOVk9DQVRJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiBwcmVmaXggPSBudWxsLCBuYW1lID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgcHJlZml4ID0gampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLnNldEZ1bGxGdW5jdGlvbk5hbWUocHJlZml4LmltYWdlICsgIjoiKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBuYW1lID0gampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMjBdID0gampfZ2VuOwotICAgICAgICAKLSAgICAgIH0KLSAgICAgICAgICAgIGlmKG51bGwgIT0gcHJlZml4ICYmIG51bGwgIT0gbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6IiArIChudWxsID09IG5hbWUgPyAiIiA6IG5hbWUuaW1hZ2UpKTsKLSAgICAgICAgICAgIGVsc2UgaWYobnVsbCAhPSBuYW1lKQotICAgICAgICAgICAgICAgICAgICBqanRuMDAwLnNldEZ1bGxGdW5jdGlvbk5hbWUobmFtZS5pbWFnZSk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICAgIEV4cHJlc3Npb24oKTsKLSAgICAgICAgbGFiZWxfODoKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIENPTU1BOgotICAgICAgICAgICAgCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgampfbGExWzIxXSA9IGpqX2dlbjsKLSAgICAgICAgICAgIGJyZWFrIGxhYmVsXzg7Ci0gICAgICAgICAgfQotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOwotICAgICAgICAgIEV4cHJlc3Npb24oKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzIyXSA9IGpqX2dlbjsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgfQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExpdGVyYWwoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIExpdGVyYWwgKi8KLSAgQVNUTGl0ZXJhbCBqanRuMDAwID0gbmV3IEFTVExpdGVyYWwoSkpUTElURVJBTCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihUUlVFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZBTFNFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJTlRFR0VSX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGTE9BVElOR19QT0lOVF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNUUklOR19MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTlVMTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzIzXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDAsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl85KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElERU5USUZJRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQ3KSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xMCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIoKSB7Ci0gICAgaWYgKGpqXzNSXzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT05EKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyIHRva2VuX3NvdXJjZTsKLSAgU2ltcGxlQ2hhclN0cmVhbSBqal9pbnB1dF9zdHJlYW07Ci0gIHB1YmxpYyBUb2tlbiB0b2tlbiwgampfbnQ7Ci0gIHByaXZhdGUgaW50IGpqX250azsKLSAgcHJpdmF0ZSBUb2tlbiBqal9zY2FucG9zLCBqal9sYXN0cG9zOwotICBwcml2YXRlIGludCBqal9sYTsKLSAgcHVibGljIGJvb2xlYW4gbG9va2luZ0FoZWFkID0gZmFsc2U7Ci0vLyAgcHJpdmF0ZSBib29sZWFuIGpqX3NlbUxBOwotICBwcml2YXRlIGludCBqal9nZW47Ci0gIGZpbmFsIHByaXZhdGUgaW50W10gampfbGExID0gbmV3IGludFsyNF07Ci0gIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8wOwotICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMTsKLSAgc3RhdGljIHsKLSAgICAgIGpqX2xhMV8wKCk7Ci0gICAgICBqal9sYTFfMSgpOwotICAgfQotICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfMCgpIHsKLSAgICAgIGpqX2xhMV8wID0gbmV3IGludFtdIHsweDQwMDFkNjAsMHgwLDB4MCwweDAsMHgwLDB4MzBjMDAwMCwweDMwYzAwMDAsMHhmM2MwMDAsMHhmM2MwMDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDQwMDFkNjAsMHg0MDAwMjAwMCwweDQwMDFkNjAsMHgwLDB4MCwweDQwMDAyMDAwLDB4MCwweDEwMDAwMDAwLDB4NDAwMDAwMCwweDFkNjAsfTsKLSAgIH0KLSAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExXzEoKSB7Ci0gICAgICBqal9sYTFfMSA9IG5ldyBpbnRbXSB7MHhhMTgyLDB4MTgwMCwweDE4MDAsMHg2MDAsMHg2MDAsMHgwLDB4MCwweDAsMHgwLDB4MywweDMsMHg3YywweDdjLDB4MjE4MiwweGExODIsMHgwLDB4MCwweDgwMDAsMHg4MDAwLDB4MCwweDgwMDAsMHgwLDB4MCwweDAsfTsKLSAgIH0KLSAgZmluYWwgcHJpdmF0ZSBKSkNhbGxzW10gampfMl9ydG5zID0gbmV3IEpKQ2FsbHNbMl07Ci0gIHByaXZhdGUgYm9vbGVhbiBqal9yZXNjYW4gPSBmYWxzZTsKLSAgcHJpdmF0ZSBpbnQgampfZ2MgPSAwOwotCi0gIHB1YmxpYyBKU1BFTFBhcnNlcihqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbSA9IG5ldyBTaW1wbGVDaGFyU3RyZWFtKHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlID0gbmV3IEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgamp0cmVlLnJlc2V0KCk7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIEpTUEVMUGFyc2VyKGphdmEuaW8uUmVhZGVyIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbSA9IG5ldyBTaW1wbGVDaGFyU3RyZWFtKHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlID0gbmV3IEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtLlJlSW5pdChzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZS5SZUluaXQoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqdHJlZS5yZXNldCgpOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyBKU1BFTFBhcnNlcihKU1BFTFBhcnNlclRva2VuTWFuYWdlciB0bSkgewotICAgIHRva2VuX3NvdXJjZSA9IHRtOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyIHRtKSB7Ci0gICAgdG9rZW5fc291cmNlID0gdG07Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqanRyZWUucmVzZXQoKTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIFRva2VuIGpqX2NvbnN1bWVfdG9rZW4oaW50IGtpbmQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgVG9rZW4gb2xkVG9rZW47Ci0gICAgaWYgKChvbGRUb2tlbiA9IHRva2VuKS5uZXh0ICE9IG51bGwpIHRva2VuID0gdG9rZW4ubmV4dDsKLSAgICBlbHNlIHRva2VuID0gdG9rZW4ubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBpZiAodG9rZW4ua2luZCA9PSBraW5kKSB7Ci0gICAgICBqal9nZW4rKzsKLSAgICAgIGlmICgrK2pqX2djID4gMTAwKSB7Ci0gICAgICAgIGpqX2djID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBKSkNhbGxzIGMgPSBqal8yX3J0bnNbaV07Ci0gICAgICAgICAgd2hpbGUgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGMuZ2VuIDwgampfZ2VuKSBjLmZpcnN0ID0gbnVsbDsKLSAgICAgICAgICAgIGMgPSBjLm5leHQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdG9rZW47Ci0gICAgfQotICAgIHRva2VuID0gb2xkVG9rZW47Ci0gICAgampfa2luZCA9IGtpbmQ7Ci0gICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOwotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgY2xhc3MgTG9va2FoZWFkU3VjY2VzcyBleHRlbmRzIGphdmEubGFuZy5FcnJvciB7IAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyAKLSAgfQotICBmaW5hbCBwcml2YXRlIExvb2thaGVhZFN1Y2Nlc3MgampfbHMgPSBuZXcgTG9va2FoZWFkU3VjY2VzcygpOwotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfc2Nhbl90b2tlbihpbnQga2luZCkgewotICAgIGlmIChqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHsKLSAgICAgIGpqX2xhLS07Ci0gICAgICBpZiAoampfc2NhbnBvcy5uZXh0ID09IG51bGwpIHsKLSAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dDsKLSAgICB9Ci0gICAgaWYgKGpqX3Jlc2NhbikgewotICAgICAgaW50IGkgPSAwOyBUb2tlbiB0b2sgPSB0b2tlbjsKLSAgICAgIHdoaWxlICh0b2sgIT0gbnVsbCAmJiB0b2sgIT0gampfc2NhbnBvcykgeyBpKys7IHRvayA9IHRvay5uZXh0OyB9Ci0gICAgICBpZiAodG9rICE9IG51bGwpIGpqX2FkZF9lcnJvcl90b2tlbihraW5kLCBpKTsKLSAgICB9Ci0gICAgaWYgKGpqX3NjYW5wb3Mua2luZCAhPSBraW5kKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfbGEgPT0gMCAmJiBqal9zY2FucG9zID09IGpqX2xhc3Rwb3MpIHRocm93IGpqX2xzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSB7Ci0gICAgaWYgKHRva2VuLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OwotICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqX2dlbisrOwotICAgIHJldHVybiB0b2tlbjsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBUb2tlbiBnZXRUb2tlbihpbnQgaW5kZXgpIHsKLSAgICBUb2tlbiB0ID0gbG9va2luZ0FoZWFkID8gampfc2NhbnBvcyA6IHRva2VuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgewotICAgICAgaWYgKHQubmV4dCAhPSBudWxsKSB0ID0gdC5uZXh0OwotICAgICAgZWxzZSB0ID0gdC5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIH0KLSAgICByZXR1cm4gdDsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgaW50IGpqX250aygpIHsKLSAgICBpZiAoKGpqX250PXRva2VuLm5leHQpID09IG51bGwpCi0gICAgICByZXR1cm4gKGpqX250ayA9ICh0b2tlbi5uZXh0PXRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKSkua2luZCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIChqal9udGsgPSBqal9udC5raW5kKTsKLSAgfQotCi0gIHByaXZhdGUgamF2YS51dGlsLlZlY3RvciBqal9leHBlbnRyaWVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgcHJpdmF0ZSBpbnRbXSBqal9leHBlbnRyeTsKLSAgcHJpdmF0ZSBpbnQgampfa2luZCA9IC0xOwotICBwcml2YXRlIGludFtdIGpqX2xhc3R0b2tlbnMgPSBuZXcgaW50WzEwMF07Ci0gIHByaXZhdGUgaW50IGpqX2VuZHBvczsKLQotICBwcml2YXRlIHZvaWQgampfYWRkX2Vycm9yX3Rva2VuKGludCBraW5kLCBpbnQgcG9zKSB7Ci0gICAgaWYgKHBvcyA+PSAxMDApIHJldHVybjsKLSAgICBpZiAocG9zID09IGpqX2VuZHBvcyArIDEpIHsKLSAgICAgIGpqX2xhc3R0b2tlbnNbampfZW5kcG9zKytdID0ga2luZDsKLSAgICB9IGVsc2UgaWYgKGpqX2VuZHBvcyAhPSAwKSB7Ci0gICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbampfZW5kcG9zXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZW5kcG9zOyBpKyspIHsKLSAgICAgICAgampfZXhwZW50cnlbaV0gPSBqal9sYXN0dG9rZW5zW2ldOwotICAgICAgfQotICAgICAgYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLSAgICAgIGZvciAoamF2YS51dGlsLkVudW1lcmF0aW9uIGUgPSBqal9leHBlbnRyaWVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgIGludFtdIG9sZGVudHJ5ID0gKGludFtdKShlLm5leHRFbGVtZW50KCkpOwotICAgICAgICBpZiAob2xkZW50cnkubGVuZ3RoID09IGpqX2V4cGVudHJ5Lmxlbmd0aCkgewotICAgICAgICAgIGV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9leHBlbnRyeS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG9sZGVudHJ5W2ldICE9IGpqX2V4cGVudHJ5W2ldKSB7Ci0gICAgICAgICAgICAgIGV4aXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGV4aXN0cykgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghZXhpc3RzKSBqal9leHBlbnRyaWVzLmFkZEVsZW1lbnQoampfZXhwZW50cnkpOwotICAgICAgaWYgKHBvcyAhPSAwKSBqal9sYXN0dG9rZW5zWyhqal9lbmRwb3MgPSBwb3MpIC0gMV0gPSBraW5kOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbiBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCkgewotICAgIGpqX2V4cGVudHJpZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICBib29sZWFuW10gbGExdG9rZW5zID0gbmV3IGJvb2xlYW5bNTFdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTE7IGkrKykgewotICAgICAgbGExdG9rZW5zW2ldID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChqal9raW5kID49IDApIHsKLSAgICAgIGxhMXRva2Vuc1tqal9raW5kXSA9IHRydWU7Ci0gICAgICBqal9raW5kID0gLTE7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykgewotICAgICAgaWYgKGpqX2xhMVtpXSA9PSBqal9nZW4pIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzMjsgaisrKSB7Ci0gICAgICAgICAgaWYgKChqal9sYTFfMFtpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zW2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChqal9sYTFfMVtpXSAmICgxPDxqKSkgIT0gMCkgewotICAgICAgICAgICAgbGExdG9rZW5zWzMyK2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MTsgaSsrKSB7Ci0gICAgICBpZiAobGExdG9rZW5zW2ldKSB7Ci0gICAgICAgIGpqX2V4cGVudHJ5ID0gbmV3IGludFsxXTsKLSAgICAgICAgampfZXhwZW50cnlbMF0gPSBpOwotICAgICAgICBqal9leHBlbnRyaWVzLmFkZEVsZW1lbnQoampfZXhwZW50cnkpOwotICAgICAgfQotICAgIH0KLSAgICBqal9lbmRwb3MgPSAwOwotICAgIGpqX3Jlc2Nhbl90b2tlbigpOwotICAgIGpqX2FkZF9lcnJvcl90b2tlbigwLCAwKTsKLSAgICBpbnRbXVtdIGV4cHRva3NlcSA9IG5ldyBpbnRbampfZXhwZW50cmllcy5zaXplKCldW107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9leHBlbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBleHB0b2tzZXFbaV0gPSAoaW50W10pampfZXhwZW50cmllcy5lbGVtZW50QXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgUGFyc2VFeGNlcHRpb24odG9rZW4sIGV4cHRva3NlcSwgdG9rZW5JbWFnZSk7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBlbmFibGVfdHJhY2luZygpIHsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIGRpc2FibGVfdHJhY2luZygpIHsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgdm9pZCBqal9yZXNjYW5fdG9rZW4oKSB7Ci0gICAgampfcmVzY2FuID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgSkpDYWxscyBwID0gampfMl9ydG5zW2ldOwotICAgICAgZG8gewotICAgICAgICBpZiAocC5nZW4gPiBqal9nZW4pIHsKLSAgICAgICAgICBqal9sYSA9IHAuYXJnOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHAuZmlyc3Q7Ci0gICAgICAgICAgc3dpdGNoIChpKSB7Ci0gICAgICAgICAgICBjYXNlIDA6IGpqXzNfMSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTogampfM18yKCk7IGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwID0gcC5uZXh0OwotICAgICAgfSB3aGlsZSAocCAhPSBudWxsKTsKLSAgICB9Ci0gICAgampfcmVzY2FuID0gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIHZvaWQgampfc2F2ZShpbnQgaW5kZXgsIGludCB4bGEpIHsKLSAgICBKSkNhbGxzIHAgPSBqal8yX3J0bnNbaW5kZXhdOwotICAgIHdoaWxlIChwLmdlbiA+IGpqX2dlbikgewotICAgICAgaWYgKHAubmV4dCA9PSBudWxsKSB7IHAgPSBwLm5leHQgPSBuZXcgSkpDYWxscygpOyBicmVhazsgfQotICAgICAgcCA9IHAubmV4dDsKLSAgICB9Ci0gICAgcC5nZW4gPSBqal9nZW4gKyB4bGEgLSBqal9sYTsgcC5maXJzdCA9IHRva2VuOyBwLmFyZyA9IHhsYTsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBjbGFzcyBKSkNhbGxzIHsKLSAgICBpbnQgZ2VuOwotICAgIFRva2VuIGZpcnN0OwotICAgIGludCBhcmc7Ci0gICAgSkpDYWxscyBuZXh0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGUzYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlJkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BFTFBhcnNlckNvbnN0YW50cy5qYXZhICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUEVMUGFyc2VyQ29uc3RhbnRzIHsKLQotICBpbnQgRU9GID0gMDsKLSAgaW50IElOVEVHRVJfTElURVJBTCA9IDU7Ci0gIGludCBGTE9BVElOR19QT0lOVF9MSVRFUkFMID0gNjsKLSAgaW50IEVYUE9ORU5UID0gNzsKLSAgaW50IFNUUklOR19MSVRFUkFMID0gODsKLSAgaW50IEJBRExZX0VTQ0FQRURfU1RSSU5HX0xJVEVSQUwgPSA5OwotICBpbnQgVFJVRSA9IDEwOwotICBpbnQgRkFMU0UgPSAxMTsKLSAgaW50IE5VTEwgPSAxMjsKLSAgaW50IERPVCA9IDEzOwotICBpbnQgR1QxID0gMTQ7Ci0gIGludCBHVDIgPSAxNTsKLSAgaW50IExUMSA9IDE2OwotICBpbnQgTFQyID0gMTc7Ci0gIGludCBFUTEgPSAxODsKLSAgaW50IEVRMiA9IDE5OwotICBpbnQgTEUxID0gMjA7Ci0gIGludCBMRTIgPSAyMTsKLSAgaW50IEdFMSA9IDIyOwotICBpbnQgR0UyID0gMjM7Ci0gIGludCBORVExID0gMjQ7Ci0gIGludCBORVEyID0gMjU7Ci0gIGludCBMUEFSRU4gPSAyNjsKLSAgaW50IFJQQVJFTiA9IDI3OwotICBpbnQgQ09NTUEgPSAyODsKLSAgaW50IENPTE9OID0gMjk7Ci0gIGludCBMQlJBQ0tFVCA9IDMwOwotICBpbnQgUkJSQUNLRVQgPSAzMTsKLSAgaW50IFBMVVMgPSAzMjsKLSAgaW50IE1JTlVTID0gMzM7Ci0gIGludCBNVUxUSVBMWSA9IDM0OwotICBpbnQgRElWSURFMSA9IDM1OwotICBpbnQgRElWSURFMiA9IDM2OwotICBpbnQgTU9EVUxVUzEgPSAzNzsKLSAgaW50IE1PRFVMVVMyID0gMzg7Ci0gIGludCBOT1QxID0gMzk7Ci0gIGludCBOT1QyID0gNDA7Ci0gIGludCBBTkQxID0gNDE7Ci0gIGludCBBTkQyID0gNDI7Ci0gIGludCBPUjEgPSA0MzsKLSAgaW50IE9SMiA9IDQ0OwotICBpbnQgRU1QVFkgPSA0NTsKLSAgaW50IENPTkQgPSA0NjsKLSAgaW50IElERU5USUZJRVIgPSA0NzsKLSAgaW50IElNUExfT0JKX1NUQVJUID0gNDg7Ci0gIGludCBMRVRURVIgPSA0OTsKLSAgaW50IERJR0lUID0gNTA7Ci0KLSAgaW50IERFRkFVTFQgPSAwOwotCi0gIFN0cmluZ1tdIHRva2VuSW1hZ2UgPSB7Ci0gICAgIjxFT0Y+IiwKLSAgICAiXCIgXCIiLAotICAgICJcIlxcdFwiIiwKLSAgICAiXCJcXG5cIiIsCi0gICAgIlwiXFxyXCIiLAotICAgICI8SU5URUdFUl9MSVRFUkFMPiIsCi0gICAgIjxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiIsCi0gICAgIjxFWFBPTkVOVD4iLAotICAgICI8U1RSSU5HX0xJVEVSQUw+IiwKLSAgICAiPEJBRExZX0VTQ0FQRURfU1RSSU5HX0xJVEVSQUw+IiwKLSAgICAiXCJ0cnVlXCIiLAotICAgICJcImZhbHNlXCIiLAotICAgICJcIm51bGxcIiIsCi0gICAgIlwiLlwiIiwKLSAgICAiXCI+XCIiLAotICAgICJcImd0XCIiLAotICAgICJcIjxcIiIsCi0gICAgIlwibHRcIiIsCi0gICAgIlwiPT1cIiIsCi0gICAgIlwiZXFcIiIsCi0gICAgIlwiPD1cIiIsCi0gICAgIlwibGVcIiIsCi0gICAgIlwiPj1cIiIsCi0gICAgIlwiZ2VcIiIsCi0gICAgIlwiIT1cIiIsCi0gICAgIlwibmVcIiIsCi0gICAgIlwiKFwiIiwKLSAgICAiXCIpXCIiLAotICAgICJcIixcIiIsCi0gICAgIlwiOlwiIiwKLSAgICAiXCJbXCIiLAotICAgICJcIl1cIiIsCi0gICAgIlwiK1wiIiwKLSAgICAiXCItXCIiLAotICAgICJcIipcIiIsCi0gICAgIlwiL1wiIiwKLSAgICAiXCJkaXZcIiIsCi0gICAgIlwiJVwiIiwKLSAgICAiXCJtb2RcIiIsCi0gICAgIlwibm90XCIiLAotICAgICJcIiFcIiIsCi0gICAgIlwiYW5kXCIiLAotICAgICJcIiYmXCIiLAotICAgICJcIm9yXCIiLAotICAgICJcInx8XCIiLAotICAgICJcImVtcHR5XCIiLAotICAgICJcIj9cIiIsCi0gICAgIjxJREVOVElGSUVSPiIsCi0gICAgIlwiI1wiIiwKLSAgICAiPExFVFRFUj4iLAotICAgICI8RElHSVQ+IiwKLSAgfTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiMDRkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWUmSmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BFTFBhcnNlclRva2VuTWFuYWdlciBpbXBsZW1lbnRzIEpTUEVMUGFyc2VyQ29uc3RhbnRzCi17Ci0gIHB1YmxpYyAgamF2YS5pby5QcmludFN0cmVhbSBkZWJ1Z1N0cmVhbSA9IFN5c3RlbS5vdXQ7Ci0gIHB1YmxpYyAgdm9pZCBzZXREZWJ1Z1N0cmVhbShqYXZhLmlvLlByaW50U3RyZWFtIGRzKSB7IGRlYnVnU3RyZWFtID0gZHM7IH0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTApCi17Ci0gICBzd2l0Y2ggKHBvcykKLSAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MmFkMDAyYWE5YzAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDc7Ci0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIyZDAwMDAwMWMwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDQ3OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMmFhODAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMWMwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDQ3OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMjsKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyZDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDgwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDQ3OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxNDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgcmV0dXJuIC0xOwotICAgfQotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdGFydE5mYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIHJldHVybiBqak1vdmVOZmFfMChqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAocG9zLCBhY3RpdmUwKSwgcG9zICsgMSk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqalN0b3BBdFBvcyhpbnQgcG9zLCBpbnQga2luZCkKLXsKLSAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgamptYXRjaGVkUG9zID0gcG9zOwotICAgcmV0dXJuIHBvcyArIDE7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKGludCBwb3MsIGludCBraW5kLCBpbnQgc3RhdGUpCi17Ci0gICBqam1hdGNoZWRLaW5kID0ga2luZDsKLSAgIGpqbWF0Y2hlZFBvcyA9IHBvczsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBwb3MgKyAxOyB9Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoc3RhdGUsIHBvcyArIDEpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpCi17Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMzM6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gNDA7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDBMKTsKLSAgICAgIGNhc2UgMzc6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzcpOwotICAgICAgY2FzZSAzODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgNDA6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjYpOwotICAgICAgY2FzZSA0MToKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAyNyk7Ci0gICAgICBjYXNlIDQyOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDM0KTsKLSAgICAgIGNhc2UgNDM6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzIpOwotICAgICAgY2FzZSA0NDoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAyOCk7Ci0gICAgICBjYXNlIDQ1OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDMzKTsKLSAgICAgIGNhc2UgNDY6Ci0gICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgwLCAxMywgMSk7Ci0gICAgICBjYXNlIDQ3OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDM1KTsKLSAgICAgIGNhc2UgNTg6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjkpOwotICAgICAgY2FzZSA2MDoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNjsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDAwTCk7Ci0gICAgICBjYXNlIDYxOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDAwMEwpOwotICAgICAgY2FzZSA2MjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNDsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDAwTCk7Ci0gICAgICBjYXNlIDYzOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDQ2KTsKLSAgICAgIGNhc2UgOTE6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzApOwotICAgICAgY2FzZSA5MzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzMSk7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDAwMDAwODAwMDBMKTsKLSAgICAgIGNhc2UgMTAyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDBMKTsKLSAgICAgIGNhc2UgMTAzOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDgwMDBMKTsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMjAwMDBMKTsKLSAgICAgIGNhc2UgMTA5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExMDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwMjAwMTAwMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwTCk7Ci0gICAgICBjYXNlIDEyNDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDAwMDAwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCgwLCAwKTsKLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAobG9uZyBhY3RpdmUwKQotewotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgwLCBhY3RpdmUwKTsKLSAgICAgIHJldHVybiAxOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDM4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDQyKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxOCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMjApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDIyKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMjQpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDIxLCA2KTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDIzLCA2KTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAyNSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTA1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDEwOToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExMDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHhjMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExMzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDE5LCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCA0MywgNik7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDE1LCA2KTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgyMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMTcsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMEwpOwotICAgICAgY2FzZSAxMjQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDQ0KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMCwgYWN0aXZlMCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDAsIG9sZDApOyAKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMSwgYWN0aXZlMCk7Ci0gICAgICByZXR1cm4gMjsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDM4LCA2KTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgNDEsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTgwMEwpOwotICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDM5LCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQwMEwpOwotICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDM2LCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMSwgYWN0aXZlMCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDEsIG9sZDApOyAKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMiwgYWN0aXZlMCk7Ci0gICAgICByZXR1cm4gMzsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMTAsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMywgMTIsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MjAwMDAwMDAwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCgyLCBhY3RpdmUwKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMiwgb2xkMCk7IAotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgzLCBhY3RpdmUwKTsKLSAgICAgIHJldHVybiA0OwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCAxMSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTIxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDQ1LCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMywgYWN0aXZlMCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGQoaW50IHN0YXRlKQotewotICAgaWYgKGpqcm91bmRzW3N0YXRlXSAhPSBqanJvdW5kKQotICAgewotICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gc3RhdGU7Ci0gICAgICBqanJvdW5kc1tzdGF0ZV0gPSBqanJvdW5kOwotICAgfQotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQWRkU3RhdGVzKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgIGRvIHsKLSAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IGpqbmV4dFN0YXRlc1tzdGFydF07Ci0gICB9IHdoaWxlIChzdGFydCsrICE9IGVuZCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRUd29TdGF0ZXMoaW50IHN0YXRlMSwgaW50IHN0YXRlMikKLXsKLSAgIGpqQ2hlY2tOQWRkKHN0YXRlMSk7Ci0gICBqakNoZWNrTkFkZChzdGF0ZTIpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCwgaW50IGVuZCkKLXsKLSAgIGRvIHsKLSAgICAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydF0pOwotICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOwotfQotLy9wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0KQotLy97Ci0vLyAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydF0pOwotLy8gICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnQgKyAxXSk7Ci0vL30KLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMwID0gewotICAgMHgxZmYwMDAwMGZmZmZmZmZlTCwgMHhmZmZmZmZmZmZmZmZjMDAwTCwgMHhmZmZmZmZmZkwsIDB4NjAwMDAwMDAwMDAwMDAwTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMyID0gewotICAgMHgwTCwgMHgwTCwgMHgwTCwgMHhmZjdmZmZmZmZmN2ZmZmZmTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWMzID0gewotICAgMHgwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM0ID0gewotICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmTCwgMHgwTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM1ID0gewotICAgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHgwTCwgMHgwTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM2ID0gewotICAgMHgzZmZmZmZmZmZmZmZMLCAweDBMLCAweDBMLCAweDBMCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzcgPSB7Ci0gICAweGZmZmZmZmZmZmZmZmZmZmVMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzggPSB7Ci0gICAweDBMLCAweDBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCi19OwotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlTmZhXzAoaW50IHN0YXJ0U3RhdGUsIGludCBjdXJQb3MpCi17Ci0gICBpbnQgc3RhcnRzQXQgPSAwOwotICAgampuZXdTdGF0ZUNudCA9IDM1OwotICAgaW50IGkgPSAxOwotICAgampzdGF0ZVNldFswXSA9IHN0YXJ0U3RhdGU7Ci0gICBpbnQga2luZCA9IDB4N2ZmZmZmZmY7Ci0gICBmb3IgKDs7KQotICAgewotICAgICAgaWYgKCsrampyb3VuZCA9PSAweDdmZmZmZmZmKQotICAgICAgICAgUmVJbml0Um91bmRzKCk7Ci0gICAgICBpZiAoY3VyQ2hhciA8IDY0KQotICAgICAgewotICAgICAgICAgbG9uZyBsID0gMUwgPDwgY3VyQ2hhcjsKLSAgICAgICAgLy8gTWF0Y2hMb29wOiAKLSAgICAgICAgCSBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDAsIDQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKDB4MTgwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNDcpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNDc7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg2KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzkpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1LCA5KTsKLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzQpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMCwgMTQpOwotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0NikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEsIDIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgxODAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDQ3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDQ3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDEwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNDcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNDc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA1KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDU7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygwLCA0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA1KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDU7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDksIDEwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyICE9IDQ2KQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDExLCAxMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDExLCAxMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTUsIDE2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM0KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTAsIDE0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmYmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTUsIDE3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM0KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTUsIDE3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM0ICYmIGtpbmQgPiA4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDg7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmJmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDI0LCAyNSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmJmZmZmZmZmZkwgJiBsKSAhPSAwTCAmJiBraW5kID4gOSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1LCA5KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmY3ZmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTgsIDIwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM5KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTgsIDIwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM5ICYmIGtpbmQgPiA4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDg7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmN2ZmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDMyLCAzMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmN2ZmZmZmZmZmZkwgJiBsKSAhPSAwTCAmJiBraW5kID4gOSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY3VyQ2hhciA8IDEyOCkKLSAgICAgIHsKLSAgICAgICAgIGxvbmcgbCA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKLSAgICAgICAgIC8vTWF0Y2hMb29wOiAKLSAgICAgICAgCSBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZmZmZmZlODdmZmZmZmVMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNDcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNDc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyMSwgMjIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyMywgMjQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyNSwgMjYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZWZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxNSwgMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyMjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTUsIDE3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjcsIDI4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZWZmZmZmZmZMICYgbCkgIT0gMEwgJiYga2luZCA+IDkpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gOTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTgsIDIwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzA7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE4LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDI5LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDM0OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaW50IGhpQnl0ZSA9IGN1ckNoYXIgPj4gODsKLSAgICAgICAgIGludCBpMSA9IGhpQnl0ZSA+PiA2OwotICAgICAgICAgbG9uZyBsMSA9IDFMIDw8IChoaUJ5dGUgJiAwNzcpOwotICAgICAgICAgaW50IGkyID0gKGN1ckNoYXIgJiAweGZmKSA+PiA2OwotICAgICAgICAgbG9uZyBsMiA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKLSAgICAgICAgIC8vTWF0Y2hMb29wOiAKLSAgICAgICAgCSBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgIGlmICghampDYW5Nb3ZlXzAoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNDcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNDc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE1LCAxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyNywgMjgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSAmJiBraW5kID4gOSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8xKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTgsIDIwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDI5LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7Ci0gICAgICB9Ci0gICAgICBpZiAoa2luZCAhPSAweDdmZmZmZmZmKQotICAgICAgewotICAgICAgICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICAgICAgICBqam1hdGNoZWRQb3MgPSBjdXJQb3M7Ci0gICAgICAgICBraW5kID0gMHg3ZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgICsrY3VyUG9zOwotICAgICAgaWYgKChpID0gampuZXdTdGF0ZUNudCkgPT0gKHN0YXJ0c0F0ID0gMzUgLSAoampuZXdTdGF0ZUNudCA9IHN0YXJ0c0F0KSkpCi0gICAgICAgICByZXR1cm4gY3VyUG9zOwotICAgICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsgcmV0dXJuIGN1clBvczsgfQotICAgfQotfQotc3RhdGljIGZpbmFsIGludFtdIGpqbmV4dFN0YXRlcyA9IHsKLSAgIDgsIDksIDEwLCAxNSwgMTYsIDI4LCAyOSwgMzEsIDMyLCAzMywgMjAsIDIxLCAyMywgMjQsIDI1LCAyMCwgCi0gICAyMSwgMjMsIDI4LCAyOSwgMzEsIDMsIDQsIDEzLCAxNCwgMTcsIDE4LCAyNCwgMjUsIDMyLCAzMywgCi19OwotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBqakNhbk1vdmVfMChpbnQgaGlCeXRlLCBpbnQgaTEsIGludCBpMiwgbG9uZyBsMSwgbG9uZyBsMikKLXsKLSAgIHN3aXRjaChoaUJ5dGUpCi0gICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzJbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGNhc2UgNDg6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzNbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGNhc2UgNDk6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzRbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGNhc2UgNTE6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzVbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGNhc2UgNjE6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzZbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGRlZmF1bHQgOiAKLSAgICAgICAgIGlmICgoampiaXRWZWMwW2kxXSAmIGwxKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgfQotfQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBqakNhbk1vdmVfMShpbnQgaGlCeXRlLCBpbnQgaTEsIGludCBpMiwgbG9uZyBsMSwgbG9uZyBsMikKLXsKLSAgIHN3aXRjaChoaUJ5dGUpCi0gICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgICByZXR1cm4gKChqamJpdFZlYzhbaTJdICYgbDIpICE9IDBMKTsKLSAgICAgIGRlZmF1bHQgOiAKLSAgICAgICAgIGlmICgoampiaXRWZWM3W2kxXSAmIGwxKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgfQotfQotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBqanN0ckxpdGVyYWxJbWFnZXMgPSB7Ci0iIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlwxNjRcMTYyXDE2NVwxNDUiLCAKLSJcMTQ2XDE0MVwxNTRcMTYzXDE0NSIsICJcMTU2XDE2NVwxNTRcMTU0IiwgIlw1NiIsICJcNzYiLCAiXDE0N1wxNjQiLCAiXDc0IiwgIlwxNTRcMTY0IiwgIlw3NVw3NSIsIAotIlwxNDVcMTYxIiwgIlw3NFw3NSIsICJcMTU0XDE0NSIsICJcNzZcNzUiLCAiXDE0N1wxNDUiLCAiXDQxXDc1IiwgIlwxNTZcMTQ1IiwgIlw1MCIsIAotIlw1MSIsICJcNTQiLCAiXDcyIiwgIlwxMzMiLCAiXDEzNSIsICJcNTMiLCAiXDU1IiwgIlw1MiIsICJcNTciLCAiXDE0NFwxNTFcMTY2IiwgCi0iXDQ1IiwgIlwxNTVcMTU3XDE0NCIsICJcMTU2XDE1N1wxNjQiLCAiXDQxIiwgIlwxNDFcMTU2XDE0NCIsICJcNDZcNDYiLCAiXDE1N1wxNjIiLCAKLSJcMTc0XDE3NCIsICJcMTQ1XDE1NVwxNjBcMTY0XDE3MSIsICJcNzciLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB9OwotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZXhTdGF0ZU5hbWVzID0gewotICAgIkRFRkFVTFQiLCAKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9Ub2tlbiA9IHsKLSAgIDB4ZmZmZmZmZmZmZjYxTCwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvU2tpcCA9IHsKLSAgIDB4MWVMLCAKLX07Ci1wcm90ZWN0ZWQgU2ltcGxlQ2hhclN0cmVhbSBpbnB1dF9zdHJlYW07Ci1wcml2YXRlIGZpbmFsIGludFtdIGpqcm91bmRzID0gbmV3IGludFszNV07Ci1wcml2YXRlIGZpbmFsIGludFtdIGpqc3RhdGVTZXQgPSBuZXcgaW50WzcwXTsKLXByb3RlY3RlZCBjaGFyIGN1ckNoYXI7Ci1wdWJsaWMgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0pCi17Ci0gICBpZiAoU2ltcGxlQ2hhclN0cmVhbS5zdGF0aWNGbGFnKQotICAgICAgdGhyb3cgbmV3IEVycm9yKCJFUlJPUjogQ2Fubm90IHVzZSBhIHN0YXRpYyBDaGFyU3RyZWFtIGNsYXNzIHdpdGggYSBub24tc3RhdGljIGxleGljYWwgYW5hbHl6ZXIuIik7Ci0gICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07Ci19Ci1wdWJsaWMgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSkKLXsKLSAgIHRoaXMoc3RyZWFtKTsKLSAgIFN3aXRjaFRvKGxleFN0YXRlKTsKLX0KLXB1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSkKLXsKLSAgIGpqbWF0Y2hlZFBvcyA9IGpqbmV3U3RhdGVDbnQgPSAwOwotICAgY3VyTGV4U3RhdGUgPSBkZWZhdWx0TGV4U3RhdGU7Ci0gICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07Ci0gICBSZUluaXRSb3VuZHMoKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBSZUluaXRSb3VuZHMoKQotewotICAgaW50IGk7Ci0gICBqanJvdW5kID0gMHg4MDAwMDAwMTsKLSAgIGZvciAoaSA9IDM1OyBpLS0gPiAwOykKLSAgICAgIGpqcm91bmRzW2ldID0gMHg4MDAwMDAwMDsKLX0KLXB1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKQotewotICAgUmVJbml0KHN0cmVhbSk7Ci0gICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Ci19Ci1wdWJsaWMgdm9pZCBTd2l0Y2hUbyhpbnQgbGV4U3RhdGUpCi17Ci0gICBpZiAobGV4U3RhdGUgPj0gMSB8fCBsZXhTdGF0ZSA8IDApCi0gICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcigiRXJyb3I6IElnbm9yaW5nIGludmFsaWQgbGV4aWNhbCBzdGF0ZSA6ICIgKyBsZXhTdGF0ZSArICIuIFN0YXRlIHVuY2hhbmdlZC4iLCBUb2tlbk1nckVycm9yLklOVkFMSURfTEVYSUNBTF9TVEFURSk7Ci0gICBlbHNlCi0gICAgICBjdXJMZXhTdGF0ZSA9IGxleFN0YXRlOwotfQotCi1wcm90ZWN0ZWQgVG9rZW4gampGaWxsVG9rZW4oKQotewotICAgVG9rZW4gdCA9IFRva2VuLm5ld1Rva2VuKGpqbWF0Y2hlZEtpbmQpOwotICAgdC5raW5kID0gamptYXRjaGVkS2luZDsKLSAgIFN0cmluZyBpbSA9IGpqc3RyTGl0ZXJhbEltYWdlc1tqam1hdGNoZWRLaW5kXTsKLSAgIHQuaW1hZ2UgPSAoaW0gPT0gbnVsbCkgPyBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKSA6IGltOwotICAgdC5iZWdpbkxpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5MaW5lKCk7Ci0gICB0LmJlZ2luQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luQ29sdW1uKCk7Ci0gICB0LmVuZExpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOwotICAgdC5lbmRDb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7Ci0gICByZXR1cm4gdDsKLX0KLQotaW50IGN1ckxleFN0YXRlID0gMDsKLWludCBkZWZhdWx0TGV4U3RhdGUgPSAwOwotaW50IGpqbmV3U3RhdGVDbnQ7Ci1pbnQgampyb3VuZDsKLWludCBqam1hdGNoZWRQb3M7Ci1pbnQgamptYXRjaGVkS2luZDsKLQotcHVibGljIFRva2VuIGdldE5leHRUb2tlbigpIAotewotICBUb2tlbiBtYXRjaGVkVG9rZW47Ci0gIGludCBjdXJQb3MgPSAwOwotCi0gIEVPRkxvb3AgOgotICBmb3IgKDs7KQotICB7ICAgCi0gICB0cnkgICAKLSAgIHsgICAgIAotICAgICAgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5CZWdpblRva2VuKCk7Ci0gICB9ICAgICAKLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKLSAgIHsgICAgICAgIAotICAgICAgamptYXRjaGVkS2luZCA9IDA7Ci0gICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOwotICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKLSAgIH0KLQotICAgdHJ5IHsgaW5wdXRfc3RyZWFtLmJhY2t1cCgwKTsKLSAgICAgIHdoaWxlIChjdXJDaGFyIDw9IDMyICYmICgweDEwMDAwMjYwMEwgJiAoMUwgPDwgY3VyQ2hhcikpICE9IDBMKQotICAgICAgICAgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5CZWdpblRva2VuKCk7Ci0gICB9Ci0gICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlMSkgeyBjb250aW51ZSBFT0ZMb29wOyB9Ci0gICBqam1hdGNoZWRLaW5kID0gMHg3ZmZmZmZmZjsKLSAgIGpqbWF0Y2hlZFBvcyA9IDA7Ci0gICBjdXJQb3MgPSBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8wKCk7Ci0gICBpZiAoamptYXRjaGVkS2luZCAhPSAweDdmZmZmZmZmKQotICAgewotICAgICAgaWYgKGpqbWF0Y2hlZFBvcyArIDEgPCBjdXJQb3MpCi0gICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKGN1clBvcyAtIGpqbWF0Y2hlZFBvcyAtIDEpOwotICAgICAgaWYgKChqanRvVG9rZW5bamptYXRjaGVkS2luZCA+PiA2XSAmICgxTCA8PCAoamptYXRjaGVkS2luZCAmIDA3NykpKSAhPSAwTCkKLSAgICAgIHsKLSAgICAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7Ci0gICAgICAgICByZXR1cm4gbWF0Y2hlZFRva2VuOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgY29udGludWUgRU9GTG9vcDsKLSAgICAgIH0KLSAgIH0KLSAgIGludCBlcnJvcl9saW5lID0gaW5wdXRfc3RyZWFtLmdldEVuZExpbmUoKTsKLSAgIGludCBlcnJvcl9jb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7Ci0gICBTdHJpbmcgZXJyb3JfYWZ0ZXIgPSBudWxsOwotICAgYm9vbGVhbiBFT0ZTZWVuID0gZmFsc2U7Ci0gICB0cnkgeyBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsgfQotICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgIEVPRlNlZW4gPSB0cnVlOwotICAgICAgZXJyb3JfYWZ0ZXIgPSBjdXJQb3MgPD0gMSA/ICIiIDogaW5wdXRfc3RyZWFtLkdldEltYWdlKCk7Ci0gICAgICBpZiAoY3VyQ2hhciA9PSAnXG4nIHx8IGN1ckNoYXIgPT0gJ1xyJykgewotICAgICAgICAgZXJyb3JfbGluZSsrOwotICAgICAgICAgZXJyb3JfY29sdW1uID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgIGVycm9yX2NvbHVtbisrOwotICAgfQotICAgaWYgKCFFT0ZTZWVuKSB7Ci0gICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOwotICAgICAgZXJyb3JfYWZ0ZXIgPSBjdXJQb3MgPD0gMSA/ICIiIDogaW5wdXRfc3RyZWFtLkdldEltYWdlKCk7Ci0gICB9Ci0gICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcihFT0ZTZWVuLCBjdXJMZXhTdGF0ZSwgZXJyb3JfbGluZSwgZXJyb3JfY29sdW1uLCBlcnJvcl9hZnRlciwgY3VyQ2hhciwgVG9rZW5NZ3JFcnJvci5MRVhJQ0FMX0VSUk9SKTsKLSAgfQotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJUcmVlQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJUcmVlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YTZlNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQRUxQYXJzZXJUcmVlQ29uc3RhbnRzCi17Ci0gIHB1YmxpYyBpbnQgSkpURVhQUkVTU0lPTiA9IDA7Ci0gIHB1YmxpYyBpbnQgSkpUT1JFWFBSRVNTSU9OID0gMTsKLSAgcHVibGljIGludCBKSlRBTkRFWFBSRVNTSU9OID0gMjsKLSAgcHVibGljIGludCBKSlRFUVVBTElUWUVYUFJFU1NJT04gPSAzOwotICBwdWJsaWMgaW50IEpKVFJFTEFUSU9OQUxFWFBSRVNTSU9OID0gNDsKLSAgcHVibGljIGludCBKSlRBRERFWFBSRVNTSU9OID0gNTsKLSAgcHVibGljIGludCBKSlRNVUxUSVBMWUVYUFJFU1NJT04gPSA2OwotICBwdWJsaWMgaW50IEpKVENIT0lDRUVYUFJFU1NJT04gPSA3OwotICBwdWJsaWMgaW50IEpKVFVOQVJZRVhQUkVTU0lPTiA9IDg7Ci0gIHB1YmxpYyBpbnQgSkpUVkFMVUUgPSA5OwotICBwdWJsaWMgaW50IEpKVFZBTFVFUFJFRklYID0gMTA7Ci0gIHB1YmxpYyBpbnQgSkpUVkFMVUVTVUZGSVggPSAxMTsKLSAgcHVibGljIGludCBKSlRGVU5DVElPTklOVk9DQVRJT04gPSAxMjsKLSAgcHVibGljIGludCBKSlRMSVRFUkFMID0gMTM7Ci0KLQotICBwdWJsaWMgU3RyaW5nW10gamp0Tm9kZU5hbWUgPSB7Ci0gICAgIkV4cHJlc3Npb24iLAotICAgICJPckV4cHJlc3Npb24iLAotICAgICJBbmRFeHByZXNzaW9uIiwKLSAgICAiRXF1YWxpdHlFeHByZXNzaW9uIiwKLSAgICAiUmVsYXRpb25hbEV4cHJlc3Npb24iLAotICAgICJBZGRFeHByZXNzaW9uIiwKLSAgICAiTXVsdGlwbHlFeHByZXNzaW9uIiwKLSAgICAiQ2hvaWNlRXhwcmVzc2lvbiIsCi0gICAgIlVuYXJ5RXhwcmVzc2lvbiIsCi0gICAgIlZhbHVlIiwKLSAgICAiVmFsdWVQcmVmaXgiLAotICAgICJWYWx1ZVN1ZmZpeCIsCi0gICAgIkZ1bmN0aW9uSW52b2NhdGlvbiIsCi0gICAgIkxpdGVyYWwiLAotICB9OwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmNmNDk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BFTFBhcnNlclZpc2l0b3IuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUEVMUGFyc2VyVmlzaXRvcgotewotICBwdWJsaWMgT2JqZWN0IHZpc2l0KFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE9yRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQW5kRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxpdHlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQWRkRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTXVsdGlwbHlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDaG9pY2VFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RVbmFyeUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZVByZWZpeCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWVTdWZmaXggbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGl0ZXJhbCBub2RlLCBPYmplY3QgZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxUcmFuc2xhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWY5ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbC5FTFByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGVsLklKU1BFTFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0JCi1wdWJsaWMgY2xhc3MgSlNQRUxUcmFuc2xhdG9yIGltcGxlbWVudHMgSUpTUEVMVHJhbnNsYXRvciB7Ci0JLyoqCi0JICogSlNQIEV4cHJlc3Npb24gTGFuZ3VhZ2UgUGFyc2VyLgotCSAqLwotCXByaXZhdGUgSlNQRUxQYXJzZXIgZWxQYXJzZXIgPSBudWxsOwotCQotCXB1YmxpYyBMaXN0IHRyYW5zbGF0ZUVMKFN0cmluZyBlbFRleHQsIFN0cmluZyBkZWxpbSwKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUsIGludCBjb250ZW50U3RhcnQsCi0JCQlpbnQgY29udGVudExlbmd0aCwgU3RyaW5nQnVmZmVyIGZVc2VyRUxFeHByZXNzaW9ucywKLQkJCUhhc2hNYXAgZlVzZXJFTFJhbmdlcywgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQkKLQkJQXJyYXlMaXN0IGVsUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQl0cnkgewotCQkJc3luY2hyb25pemVkKHRoaXMpIHsKLQkJCQlpZihudWxsID09IGVsUGFyc2VyKSB7Ci0JCQkJCWVsUGFyc2VyID0gSlNQRUxQYXJzZXIuY3JlYXRlUGFyc2VyKGVsVGV4dCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWxQYXJzZXIuUmVJbml0KGVsVGV4dCk7Ci0JCQkJfQotCQkJCi0JCQkJQVNURXhwcmVzc2lvbiBleHByZXNzaW9uID0gZWxQYXJzZXIuRXhwcmVzc2lvbigpOwotCQkJCUVMR2VuZXJhdG9yIGdlbiA9IG5ldyBFTEdlbmVyYXRvcigpOwotCQkJCWdlbi5nZW5lcmF0ZShleHByZXNzaW9uLCBjdXJyZW50Tm9kZSwgZlVzZXJFTEV4cHJlc3Npb25zLCBmVXNlckVMUmFuZ2VzLCBkb2N1bWVudCwgY3VycmVudE5vZGUsIGNvbnRlbnRTdGFydCwgY29udGVudExlbmd0aCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJCVRva2VuIGN1clRvayA9IGUuY3VycmVudFRva2VuOwotCQkJaW50IHByb2JsZW1TdGFydE9mZnNldDsKLQkJCWludCBwcm9ibGVtRW5kT2Zmc2V0OwotCQkJUG9zaXRpb24gcG9zID0gbnVsbDsKLQkJCXByb2JsZW1TdGFydE9mZnNldCA9ICBjb250ZW50U3RhcnQgKyBjdXJUb2suYmVnaW5Db2x1bW47Ci0JCQlwcm9ibGVtRW5kT2Zmc2V0ID0gY29udGVudFN0YXJ0ICsgY3VyVG9rLmVuZENvbHVtbjsKLQkJCQotCQkJcG9zID0gbmV3IFBvc2l0aW9uKHByb2JsZW1TdGFydE9mZnNldCwgcHJvYmxlbUVuZE9mZnNldCAtIHByb2JsZW1TdGFydE9mZnNldCArIDEpOwotCQkJZWxQcm9ibGVtcy5hZGQobmV3IEVMUHJvYmxlbShwb3MsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSk7Ci0JCX0gY2F0Y2ggKFRva2VuTWdyRXJyb3IgdGUpIHsKLQkJCVBvc2l0aW9uIHBvcyA9IG5ldyBQb3NpdGlvbihjb250ZW50U3RhcnQsIGNvbnRlbnRMZW5ndGgpOwotCQkJZWxQcm9ibGVtcy5hZGQobmV3IEVMUHJvYmxlbShwb3MsIEpTUENvcmVNZXNzYWdlcy5KU1BFTF9Ub2tlbikpOwotCQl9Ci0JCXJldHVybiBlbFByb2JsZW1zOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGExODZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gTm9kZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLS8qIEFsbCBBU1Qgbm9kZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuICBJdCBwcm92aWRlcyBiYXNpYwotICAgbWFjaGluZXJ5IGZvciBjb25zdHJ1Y3RpbmcgdGhlIHBhcmVudCBhbmQgY2hpbGQgcmVsYXRpb25zaGlwcwotICAgYmV0d2VlbiBub2Rlcy4gKi8KLQotcHVibGljIGludGVyZmFjZSBOb2RlIHsKLQotICAvKiogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBub2RlIGhhcyBiZWVuIG1hZGUgdGhlIGN1cnJlbnQKLSAgICBub2RlLiAgSXQgaW5kaWNhdGVzIHRoYXQgY2hpbGQgbm9kZXMgY2FuIG5vdyBiZSBhZGRlZCB0byBpdC4gKi8KLSAgcHVibGljIHZvaWQgamp0T3BlbigpOwotCi0gIC8qKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBjaGlsZCBub2RlcyBoYXZlIGJlZW4KLSAgICBhZGRlZC4gKi8KLSAgcHVibGljIHZvaWQgamp0Q2xvc2UoKTsKLQotICAvKiogVGhpcyBwYWlyIG9mIG1ldGhvZHMgYXJlIHVzZWQgdG8gaW5mb3JtIHRoZSBub2RlIG9mIGl0cwotICAgIHBhcmVudC4gKi8KLSAgcHVibGljIHZvaWQgamp0U2V0UGFyZW50KE5vZGUgbik7Ci0gIHB1YmxpYyBOb2RlIGpqdEdldFBhcmVudCgpOwotCi0gIC8qKiBUaGlzIG1ldGhvZCB0ZWxscyB0aGUgbm9kZSB0byBhZGQgaXRzIGFyZ3VtZW50IHRvIHRoZSBub2RlJ3MKLSAgICBsaXN0IG9mIGNoaWxkcmVuLiAgKi8KLSAgcHVibGljIHZvaWQgamp0QWRkQ2hpbGQoTm9kZSBuLCBpbnQgaSk7Ci0KLSAgLyoqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBjaGlsZCBub2RlLiAgVGhlIGNoaWxkcmVuIGFyZSBudW1iZXJlZAotICAgICBmcm9tIHplcm8sIGxlZnQgdG8gcmlnaHQuICovCi0gIHB1YmxpYyBOb2RlIGpqdEdldENoaWxkKGludCBpKTsKLQotICAvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhlIG5vZGUgaGFzLiAqLwotICBwdWJsaWMgaW50IGpqdEdldE51bUNoaWxkcmVuKCk7Ci0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvUGFyc2VFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9QYXJzZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Q1MDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9QYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBQYXJzZUV4Y2VwdGlvbi5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHBhcnNlIGVycm9ycyBhcmUgZW5jb3VudGVyZWQuCi0gKiBZb3UgY2FuIGV4cGxpY2l0bHkgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyBleGNlcHRpb24gdHlwZSBieQotICogY2FsbGluZyB0aGUgbWV0aG9kIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24gaW4gdGhlIGdlbmVyYXRlZAotICogcGFyc2VyLgotICoKLSAqIFlvdSBjYW4gbW9kaWZ5IHRoaXMgY2xhc3MgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgcmVwb3J0aW5nCi0gKiBtZWNoYW5pc21zIHNvIGxvbmcgYXMgeW91IHJldGFpbiB0aGUgcHVibGljIGZpZWxkcy4KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLS8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIG1ldGhvZCAiZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiIKLSAgICogaW4gdGhlIGdlbmVyYXRlZCBwYXJzZXIuICBDYWxsaW5nIHRoaXMgY29uc3RydWN0b3IgZ2VuZXJhdGVzCi0gICAqIGEgbmV3IG9iamVjdCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgZmllbGRzICJjdXJyZW50VG9rZW4iLAotICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgc2V0LiAgVGhlIGJvb2xlYW4KLSAgICogZmxhZyAic3BlY2lhbENvbnN0cnVjdG9yIiBpcyBhbHNvIHNldCB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQKLSAgICogdGhpcyBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QuCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgaXRzIHN1cGVyIGNsYXNzIHdpdGggdGhlIGVtcHR5IHN0cmluZwotICAgKiB0byBmb3JjZSB0aGUgInRvU3RyaW5nIiBtZXRob2Qgb2YgcGFyZW50IGNsYXNzICJUaHJvd2FibGUiIHRvCi0gICAqIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIGluIHRoZSBmb3JtOgotICAgKiAgICAgUGFyc2VFeGNlcHRpb246IDxyZXN1bHQgb2YgZ2V0TWVzc2FnZT4KLSAgICovCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiBjdXJyZW50VG9rZW5WYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbkltYWdlVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICkKLSAgewotICAgIHN1cGVyKCIiKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSB0cnVlOwotICAgIGN1cnJlbnRUb2tlbiA9IGN1cnJlbnRUb2tlblZhbDsKLSAgICBleHBlY3RlZFRva2VuU2VxdWVuY2VzID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbDsKLSAgICB0b2tlbkltYWdlID0gdG9rZW5JbWFnZVZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgZm9sbG93aW5nIGNvbnN0cnVjdG9ycyBhcmUgZm9yIHVzZSBieSB5b3UgZm9yIHdoYXRldmVyCi0gICAqIHB1cnBvc2UgeW91IGNhbiB0aGluayBvZi4gIENvbnN0cnVjdGluZyB0aGUgZXhjZXB0aW9uIGluIHRoaXMKLSAgICogbWFubmVyIG1ha2VzIHRoZSBleGNlcHRpb24gYmVoYXZlIGluIHRoZSBub3JtYWwgd2F5IC0gaS5lLiwgYXMKLSAgICogZG9jdW1lbnRlZCBpbiB0aGUgY2xhc3MgIlRocm93YWJsZSIuICBUaGUgZmllbGRzICJlcnJvclRva2VuIiwKLSAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIGRvIG5vdCBjb250YWluCi0gICAqIHJlbGV2YW50IGluZm9ybWF0aW9uLiAgVGhlIEphdmFDQyBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCB1c2UKLSAgICogdGhlc2UgY29uc3RydWN0b3JzLgotICAgKi8KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oKSB7Ci0gICAgc3VwZXIoKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGljaCBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUKLSAgICogdGhpcyBvYmplY3QgYW5kIHRoZXJlYnkgYWZmZWN0cyB0aGUgc2VtYW50aWNzIG9mIHRoZQotICAgKiAiZ2V0TWVzc2FnZSIgbWV0aG9kIChzZWUgYmVsb3cpLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lhbENvbnN0cnVjdG9yOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBsYXN0IHRva2VuIHRoYXQgaGFzIGJlZW4gY29uc3VtZWQgc3VjY2Vzc2Z1bGx5LiAgSWYKLSAgICogdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCBkdWUgdG8gYSBwYXJzZSBlcnJvciwgdGhlIHRva2VuCi0gICAqIGZvbGxvd25nIHRoaXMgdG9rZW4gd2lsbCAodGhlcmVmb3JlKSBiZSB0aGUgZmlyc3QgZXJyb3IgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgVG9rZW4gY3VycmVudFRva2VuOwotCi0gIC8qKgotICAgKiBFYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBFYWNoIGFycmF5Ci0gICAqIG9mIGludGVnZXJzIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgKGJ5IHRoZWlyIG9yZGluYWwKLSAgICogdmFsdWVzKSB0aGF0IGlzIGV4cGVjdGVkIGF0IHRoaXMgcG9pbnQgb2YgdGhlIHBhcnNlLgotICAgKi8KLSAgcHVibGljIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlczsKLQotICAvKioKLSAgICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgInRva2VuSW1hZ2UiIGFycmF5IG9mIHRoZSBnZW5lcmF0ZWQKLSAgICogcGFyc2VyIHdpdGhpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQuICBUaGlzIGFycmF5IGlzCi0gICAqIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCAuLi5Db25zdGFudHMgaW50ZXJmYWNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIHRva2VuSW1hZ2U7Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGhhcyB0aGUgc3RhbmRhcmQgYmVoYXZpb3Igd2hlbiB0aGlzIG9iamVjdCBoYXMgYmVlbgotICAgKiBjcmVhdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBjb25zdHJ1Y3RvcnMuICBPdGhlcndpc2UsIGl0IHVzZXMKLSAgICogImN1cnJlbnRUb2tlbiIgYW5kICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiB0byBnZW5lcmF0ZSBhIHBhcnNlCi0gICAqIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuICBJZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkCi0gICAqIGR1ZSB0byBhIHBhcnNlIGVycm9yLCBhbmQgeW91IGRvIG5vdCBjYXRjaCBpdCAoaXQgZ2V0cyB0aHJvd24KLSAgICogZnJvbSB0aGUgcGFyc2VyKSwgdGhlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBwcmludGluZwotICAgKiBvZiB0aGUgZmluYWwgc3RhY2sgdHJhY2UsIGFuZCBoZW5jZSB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlCi0gICAqIGdldHMgZGlzcGxheWVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgIGlmICghc3BlY2lhbENvbnN0cnVjdG9yKSB7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiIjsKLSAgICBpbnQgbWF4U2l6ZSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAobWF4U2l6ZSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoKSB7Ci0gICAgICAgIG1heFNpemUgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7IGorKykgewotICAgICAgICBleHBlY3RlZCArPSB0b2tlbkltYWdlW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bal1dICsgIiAiOwotICAgICAgfQotICAgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGggLSAxXSAhPSAwKSB7Ci0gICAgICAgIGV4cGVjdGVkICs9ICIuLi4iOwotICAgICAgfQotICAgICAgZXhwZWN0ZWQgKz0gZW9sICsgIiAgICAiOwotICAgIH0KLSAgICBTdHJpbmcgcmV0dmFsID0gIkVuY291bnRlcmVkIFwiIjsKLSAgICBUb2tlbiB0b2sgPSBjdXJyZW50VG9rZW4ubmV4dDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFNpemU7IGkrKykgewotICAgICAgaWYgKGkgIT0gMCkgcmV0dmFsICs9ICIgIjsKLSAgICAgIGlmICh0b2sua2luZCA9PSAwKSB7Ci0gICAgICAgIHJldHZhbCArPSB0b2tlbkltYWdlWzBdOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHJldHZhbCArPSBhZGRfZXNjYXBlcyh0b2suaW1hZ2UpOwotICAgICAgdG9rID0gdG9rLm5leHQ7IAotICAgIH0KLSAgICByZXR2YWwgKz0gIlwiIGF0IGxpbmUgIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luTGluZSArICIsIGNvbHVtbiAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5Db2x1bW47Ci0gICAgcmV0dmFsICs9ICIuIiArIGVvbDsKLSAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGggPT0gMSkgewotICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nOiIgKyBlb2wgKyAiICAgICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZyBvbmUgb2Y6IiArIGVvbCArICIgICAgIjsKLSAgICB9Ci0gICAgcmV0dmFsICs9IGV4cGVjdGVkOwotICAgIHJldHVybiByZXR2YWw7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGVuZCBvZiBsaW5lIHN0cmluZyBmb3IgdGhpcyBtYWNoaW5lLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7Ci0gCi0gIC8qKgotICAgKiBVc2VkIHRvIGNvbnZlcnQgcmF3IGNoYXJhY3RlcnMgdG8gdGhlaXIgZXNjYXBlZCB2ZXJzaW9uCi0gICAqIHdoZW4gdGhlc2UgcmF3IHZlcnNpb24gY2Fubm90IGJlIHVzZWQgYXMgcGFydCBvZiBhbiBBU0NJSQotICAgKiBzdHJpbmcgbGl0ZXJhbC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgYWRkX2VzY2FwZXMoU3RyaW5nIHN0cikgewotICAgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGNoYXIgY2g7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKLSAgICAgICAgewotICAgICAgICAgICBjYXNlIDAgOgotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGYnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgewotICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7Ci0gICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVDaGFyU3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvU2ltcGxlQ2hhclN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDIxYjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVDaGFyU3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNpbXBsZUNoYXJTdHJlYW0uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgQ2hhclN0cmVhbSwgd2hlcmUgdGhlIHN0cmVhbSBpcyBhc3N1bWVkIHRvCi0gKiBjb250YWluIG9ubHkgQVNDSUkgY2hhcmFjdGVycyAod2l0aG91dCB1bmljb2RlIHByb2Nlc3NpbmcpLgotICovCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDaGFyU3RyZWFtCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBzdGF0aWNGbGFnID0gZmFsc2U7Ci0gIGludCBidWZzaXplOwotICBpbnQgYXZhaWxhYmxlOwotICBpbnQgdG9rZW5CZWdpbjsKLSAgcHVibGljIGludCBidWZwb3MgPSAtMTsKLSAgcHJvdGVjdGVkIGludCBidWZsaW5lW107Ci0gIHByb3RlY3RlZCBpbnQgYnVmY29sdW1uW107Ci0KLSAgcHJvdGVjdGVkIGludCBjb2x1bW4gPSAwOwotICBwcm90ZWN0ZWQgaW50IGxpbmUgPSAxOwotCi0gIHByb3RlY3RlZCBib29sZWFuIHByZXZDaGFySXNDUiA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzTEYgPSBmYWxzZTsKLQotICBwcm90ZWN0ZWQgamF2YS5pby5SZWFkZXIgaW5wdXRTdHJlYW07Ci0KLSAgcHJvdGVjdGVkIGNoYXJbXSBidWZmZXI7Ci0gIHByb3RlY3RlZCBpbnQgbWF4TmV4dENoYXJJbmQgPSAwOwotICBwcm90ZWN0ZWQgaW50IGluQnVmID0gMDsKLQotICBwcm90ZWN0ZWQgdm9pZCBFeHBhbmRCdWZmKGJvb2xlYW4gd3JhcEFyb3VuZCkKLSAgewotICAgICBjaGFyW10gbmV3YnVmZmVyID0gbmV3IGNoYXJbYnVmc2l6ZSArIDIwNDhdOwotICAgICBpbnQgbmV3YnVmbGluZVtdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07Ci0gICAgIGludCBuZXdidWZjb2x1bW5bXSA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOwotCi0gICAgIHRyeQotICAgICB7Ci0gICAgICAgIGlmICh3cmFwQXJvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIG5ld2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7Ci0KLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgMCwgbmV3YnVmbGluZSwgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7Ci0gICAgICAgICAgIGJ1ZmxpbmUgPSBuZXdidWZsaW5lOwotCi0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCB0b2tlbkJlZ2luLCBuZXdidWZjb2x1bW4sIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIDAsIG5ld2J1ZmNvbHVtbiwgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7Ci0gICAgICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKLQotICAgICAgICAgICBtYXhOZXh0Q2hhckluZCA9IChidWZwb3MgKz0gKGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCB0b2tlbkJlZ2luLCBuZXdidWZmZXIsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgYnVmZmVyID0gbmV3YnVmZmVyOwotCi0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgdG9rZW5CZWdpbiwgbmV3YnVmbGluZSwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKLQotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIGJ1ZmNvbHVtbiA9IG5ld2J1ZmNvbHVtbjsKLQotICAgICAgICAgICBtYXhOZXh0Q2hhckluZCA9IChidWZwb3MgLT0gdG9rZW5CZWdpbik7Ci0gICAgICAgIH0KLSAgICAgfQotICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgfQotCi0KLSAgICAgYnVmc2l6ZSArPSAyMDQ4OwotICAgICBhdmFpbGFibGUgPSBidWZzaXplOwotICAgICB0b2tlbkJlZ2luID0gMDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIEZpbGxCdWZmKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgICBpZiAobWF4TmV4dENoYXJJbmQgPT0gYXZhaWxhYmxlKQotICAgICB7Ci0gICAgICAgIGlmIChhdmFpbGFibGUgPT0gYnVmc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICBpZiAodG9rZW5CZWdpbiA+IDIwNDgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnVmcG9zID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgICAgICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYgKHRva2VuQmVnaW4gPCAwKQotICAgICAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgRXhwYW5kQnVmZihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXZhaWxhYmxlID4gdG9rZW5CZWdpbikKLSAgICAgICAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZTsKLSAgICAgICAgZWxzZSBpZiAoKHRva2VuQmVnaW4gLSBhdmFpbGFibGUpIDwgMjA0OCkKLSAgICAgICAgICAgRXhwYW5kQnVmZih0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOwotICAgICB9Ci0KLSAgICAgaW50IGk7Ci0gICAgIHRyeSB7Ci0gICAgICAgIGlmICgoaSA9IGlucHV0U3RyZWFtLnJlYWQoYnVmZmVyLCBtYXhOZXh0Q2hhckluZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSAtIG1heE5leHRDaGFySW5kKSkgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIG1heE5leHRDaGFySW5kICs9IGk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgfQotICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLS1idWZwb3M7Ci0gICAgICAgIGJhY2t1cCgwKTsKLSAgICAgICAgaWYgKHRva2VuQmVnaW4gPT0gLTEpCi0gICAgICAgICAgIHRva2VuQmVnaW4gPSBidWZwb3M7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgIH0KLSAgfQotCi0gIHB1YmxpYyBjaGFyIEJlZ2luVG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICB7Ci0gICAgIHRva2VuQmVnaW4gPSAtMTsKLSAgICAgY2hhciBjID0gcmVhZENoYXIoKTsKLSAgICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKLQotICAgICByZXR1cm4gYzsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIFVwZGF0ZUxpbmVDb2x1bW4oY2hhciBjKQotICB7Ci0gICAgIGNvbHVtbisrOwotCi0gICAgIGlmIChwcmV2Q2hhcklzTEYpCi0gICAgIHsKLSAgICAgICAgcHJldkNoYXJJc0xGID0gZmFsc2U7Ci0gICAgICAgIGxpbmUgKz0gKGNvbHVtbiA9IDEpOwotICAgICB9Ci0gICAgIGVsc2UgaWYgKHByZXZDaGFySXNDUikKLSAgICAgewotICAgICAgICBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLSAgICAgICAgaWYgKGMgPT0gJ1xuJykKLSAgICAgICAgewotICAgICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7Ci0gICAgIH0KLQotICAgICBzd2l0Y2ggKGMpCi0gICAgIHsKLSAgICAgICAgY2FzZSAnXHInIDoKLSAgICAgICAgICAgcHJldkNoYXJJc0NSID0gdHJ1ZTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJyA6Ci0gICAgICAgICAgIHByZXZDaGFySXNMRiA9IHRydWU7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcdCcgOgotICAgICAgICAgICBjb2x1bW4tLTsKLSAgICAgICAgICAgY29sdW1uICs9ICg4IC0gKGNvbHVtbiAmIDA3KSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgIH0KLQotICAgICBidWZsaW5lW2J1ZnBvc10gPSBsaW5lOwotICAgICBidWZjb2x1bW5bYnVmcG9zXSA9IGNvbHVtbjsKLSAgfQotCi0gIHB1YmxpYyBjaGFyIHJlYWRDaGFyKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgICBpZiAoaW5CdWYgPiAwKQotICAgICB7Ci0gICAgICAgIC0taW5CdWY7Ci0KLSAgICAgICAgaWYgKCsrYnVmcG9zID09IGJ1ZnNpemUpCi0gICAgICAgICAgIGJ1ZnBvcyA9IDA7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlcltidWZwb3NdOwotICAgICB9Ci0KLSAgICAgaWYgKCsrYnVmcG9zID49IG1heE5leHRDaGFySW5kKQotICAgICAgICBGaWxsQnVmZigpOwotCi0gICAgIGNoYXIgYyA9IGJ1ZmZlcltidWZwb3NdOwotCi0gICAgIFVwZGF0ZUxpbmVDb2x1bW4oYyk7Ci0gICAgIHJldHVybiAoYyk7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqIEBzZWUgI2dldEVuZENvbHVtbgotICAgKi8KLQotICBwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLSAgICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIAotICAgKiBAc2VlICNnZXRFbmRMaW5lCi0gICAqLwotCi0gIHB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKLSAgICAgcmV0dXJuIGJ1ZmxpbmVbYnVmcG9zXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0RW5kQ29sdW1uKCkgewotICAgICByZXR1cm4gYnVmY29sdW1uW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEVuZExpbmUoKSB7Ci0gICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEJlZ2luQ29sdW1uKCkgewotICAgICByZXR1cm4gYnVmY29sdW1uW3Rva2VuQmVnaW5dOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRCZWdpbkxpbmUoKSB7Ci0gICAgIHJldHVybiBidWZsaW5lW3Rva2VuQmVnaW5dOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYmFja3VwKGludCBhbW91bnQpIHsKLQotICAgIGluQnVmICs9IGFtb3VudDsKLSAgICBpZiAoKGJ1ZnBvcyAtPSBhbW91bnQpIDwgMCkKLSAgICAgICBidWZwb3MgKz0gYnVmc2l6ZTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICBpbnB1dFN0cmVhbSA9IGRzdHJlYW07Ci0gICAgbGluZSA9IHN0YXJ0bGluZTsKLSAgICBjb2x1bW4gPSBzdGFydGNvbHVtbiAtIDE7Ci0KLSAgICBhdmFpbGFibGUgPSBidWZzaXplID0gYnVmZmVyc2l6ZTsKLSAgICBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJzaXplXTsKLSAgICBidWZsaW5lID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgICBidWZjb2x1bW4gPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgIHRoaXMoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtKQotICB7Ci0gICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICBpbnB1dFN0cmVhbSA9IGRzdHJlYW07Ci0gICAgbGluZSA9IHN0YXJ0bGluZTsKLSAgICBjb2x1bW4gPSBzdGFydGNvbHVtbiAtIDE7Ci0KLSAgICBpZiAoYnVmZmVyID09IG51bGwgfHwgYnVmZmVyc2l6ZSAhPSBidWZmZXIubGVuZ3RoKQotICAgIHsKLSAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOwotICAgICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07Ci0gICAgICBidWZsaW5lID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgfQotICAgIHByZXZDaGFySXNMRiA9IHByZXZDaGFySXNDUiA9IGZhbHNlOwotICAgIHRva2VuQmVnaW4gPSBpbkJ1ZiA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICBidWZwb3MgPSAtMTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0pCi0gIHsKLSAgICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0pLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgIHRoaXMoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0pCi0gIHsKLSAgICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICAgUmVJbml0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0pLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0pCi0gIHsKLSAgICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLSAgcHVibGljIFN0cmluZyBHZXRJbWFnZSgpCi0gIHsKLSAgICAgaWYgKGJ1ZnBvcyA+PSB0b2tlbkJlZ2luKQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyAxKTsKLSAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgYnVmcG9zICsgMSk7Ci0gIH0KLQotICBwdWJsaWMgY2hhcltdIEdldFN1ZmZpeChpbnQgbGVuKQotICB7Ci0gICAgIGNoYXJbXSByZXQgPSBuZXcgY2hhcltsZW5dOwotCi0gICAgIGlmICgoYnVmcG9zICsgMSkgPj0gbGVuKQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmcG9zIC0gbGVuICsgMSwgcmV0LCAwLCBsZW4pOwotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZnNpemUgLSAobGVuIC0gYnVmcG9zIC0gMSksIHJldCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBidWZwb3MgLSAxKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIHJldCwgbGVuIC0gYnVmcG9zIC0gMSwgYnVmcG9zICsgMSk7Ci0gICAgIH0KLQotICAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgRG9uZSgpCi0gIHsKLSAgICAgYnVmZmVyID0gbnVsbDsKLSAgICAgYnVmbGluZSA9IG51bGw7Ci0gICAgIGJ1ZmNvbHVtbiA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHRvIGFkanVzdCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBmb3IgdGhlIHN0YXJ0IG9mIGEgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGp1c3RCZWdpbkxpbmVDb2x1bW4oaW50IG5ld0xpbmUsIGludCBuZXdDb2wpCi0gIHsKLSAgICAgaW50IHN0YXJ0ID0gdG9rZW5CZWdpbjsKLSAgICAgaW50IGxlbjsKLQotICAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCi0gICAgIHsKLSAgICAgICAgbGVuID0gYnVmcG9zIC0gdG9rZW5CZWdpbiArIGluQnVmICsgMTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgbGVuID0gYnVmc2l6ZSAtIHRva2VuQmVnaW4gKyBidWZwb3MgKyAxICsgaW5CdWY7Ci0gICAgIH0KLQotICAgICBpbnQgaSA9IDAsIGogPSAwLCBrID0gMDsKLSAgICAgaW50IG5leHRDb2xEaWZmID0gMCwgY29sdW1uRGlmZiA9IDA7Ci0KLSAgICAgd2hpbGUgKGkgPCBsZW4gJiYKLSAgICAgICAgICAgIGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gPT0gYnVmbGluZVtrID0gKytzdGFydCAlIGJ1ZnNpemVdKQotICAgICB7Ci0gICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOwotICAgICAgICBuZXh0Q29sRGlmZiA9IGNvbHVtbkRpZmYgKyBidWZjb2x1bW5ba10gLSBidWZjb2x1bW5bal07Ci0gICAgICAgIGJ1ZmNvbHVtbltqXSA9IG5ld0NvbCArIGNvbHVtbkRpZmY7Ci0gICAgICAgIGNvbHVtbkRpZmYgPSBuZXh0Q29sRGlmZjsKLSAgICAgICAgaSsrOwotICAgICB9IAotCi0gICAgIGlmIChpIDwgbGVuKQotICAgICB7Ci0gICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7Ci0gICAgICAgIGJ1ZmNvbHVtbltqXSA9IG5ld0NvbCArIGNvbHVtbkRpZmY7Ci0KLSAgICAgICAgd2hpbGUgKGkrKyA8IGxlbikKLSAgICAgICAgewotICAgICAgICAgICBpZiAoYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSAhPSBidWZsaW5lWysrc3RhcnQgJSBidWZzaXplXSkKLSAgICAgICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmUrKzsKLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZTsKLSAgICAgICAgfQotICAgICB9Ci0KLSAgICAgbGluZSA9IGJ1ZmxpbmVbal07Ci0gICAgIGNvbHVtbiA9IGJ1ZmNvbHVtbltqXTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvU2ltcGxlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1NpbXBsZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjNDczZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvU2ltcGxlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTaW1wbGVOb2RlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZU5vZGUgaW1wbGVtZW50cyBOb2RlIHsKLSAgcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotICBwcm90ZWN0ZWQgTm9kZVtdIGNoaWxkcmVuOwotICBwcm90ZWN0ZWQgaW50IGlkOwotICBwcm90ZWN0ZWQgSlNQRUxQYXJzZXIgcGFyc2VyOwotICBwcm90ZWN0ZWQgVG9rZW4gZmlyc3RUb2tlbjsKLSAgcHJvdGVjdGVkIFRva2VuIGxhc3RUb2tlbjsKLQotICBwdWJsaWMgU2ltcGxlTm9kZShpbnQgaSkgewotICAgIGlkID0gaTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVOb2RlKEpTUEVMUGFyc2VyIHAsIGludCBpKSB7Ci0gICAgdGhpcyhpKTsKLSAgICBwYXJzZXIgPSBwOwotICB9Ci0KLSAgcHVibGljIHZvaWQgamp0T3BlbigpIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGpqdENsb3NlKCkgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBqanRTZXRQYXJlbnQoTm9kZSBuKSB7IHBhcmVudCA9IG47IH0KLSAgcHVibGljIE5vZGUgamp0R2V0UGFyZW50KCkgeyByZXR1cm4gcGFyZW50OyB9Ci0KLSAgcHVibGljIHZvaWQgamp0QWRkQ2hpbGQoTm9kZSBuLCBpbnQgaSkgewotICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0gICAgICBjaGlsZHJlbiA9IG5ldyBOb2RlW2kgKyAxXTsKLSAgICB9IGVsc2UgaWYgKGkgPj0gY2hpbGRyZW4ubGVuZ3RoKSB7Ci0gICAgICBOb2RlIGNbXSA9IG5ldyBOb2RlW2kgKyAxXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2hpbGRyZW4sIDAsIGMsIDAsIGNoaWxkcmVuLmxlbmd0aCk7Ci0gICAgICBjaGlsZHJlbiA9IGM7Ci0gICAgfQotICAgIGNoaWxkcmVuW2ldID0gbjsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGpqdEdldENoaWxkKGludCBpKSB7Ci0gICAgcmV0dXJuIGNoaWxkcmVuW2ldOwotICB9Ci0KLSAgcHVibGljIGludCBqanRHZXROdW1DaGlsZHJlbigpIHsKLSAgICByZXR1cm4gKGNoaWxkcmVuID09IG51bGwpID8gMCA6IGNoaWxkcmVuLmxlbmd0aDsKLSAgfQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGNoaWxkcmVuQWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgIGNoaWxkcmVuW2ldLmpqdEFjY2VwdCh2aXNpdG9yLCBkYXRhKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICAvKiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIHR3byBtZXRob2RzIGluIHN1YmNsYXNzZXMgb2YgU2ltcGxlTm9kZSB0bwotICAgICBjdXN0b21pemUgdGhlIHdheSB0aGUgbm9kZSBhcHBlYXJzIHdoZW4gdGhlIHRyZWUgaXMgZHVtcGVkLiAgSWYKLSAgICAgeW91ciBvdXRwdXQgdXNlcyBtb3JlIHRoYW4gb25lIGxpbmUgeW91IHNob3VsZCBvdmVycmlkZQotICAgICB0b1N0cmluZyhTdHJpbmcpLCBvdGhlcndpc2Ugb3ZlcnJpZGluZyB0b1N0cmluZygpIGlzIHByb2JhYmx5IGFsbAotICAgICB5b3UgbmVlZCB0byBkby4gKi8KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gSlNQRUxQYXJzZXJUcmVlQ29uc3RhbnRzLmpqdE5vZGVOYW1lW2lkXTsgfQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFN0cmluZyBwcmVmaXgpIHsgcmV0dXJuIHByZWZpeCArIHRvU3RyaW5nKCk7IH0KLQotICAvKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB5b3Ugd2FudCB0byBjdXN0b21pemUgaG93IHRoZSBub2RlIGR1bXBzCi0gICAgIG91dCBpdHMgY2hpbGRyZW4uICovCi0KLSAgcHVibGljIHZvaWQgZHVtcChTdHJpbmcgcHJlZml4KSB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHRvU3RyaW5nKHByZWZpeCkpOwotICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JU2ltcGxlTm9kZSBuID0gKFNpbXBsZU5vZGUpY2hpbGRyZW5baV07Ci0JaWYgKG4gIT0gbnVsbCkgewotCSAgbi5kdW1wKHByZWZpeCArICIgIik7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBUb2tlbiBnZXRGaXJzdFRva2VuKCkgewotICAgIHJldHVybiBmaXJzdFRva2VuOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Rmlyc3RUb2tlbihUb2tlbiBmaXJzdFRva2VuKSB7Ci0gICAgdGhpcy5maXJzdFRva2VuID0gZmlyc3RUb2tlbjsKLSAgfQotCi0gIHB1YmxpYyBUb2tlbiBnZXRMYXN0VG9rZW4oKSB7Ci0gICAgcmV0dXJuIGxhc3RUb2tlbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldExhc3RUb2tlbihUb2tlbiBsYXN0VG9rZW4pIHsKLSAgICB0aGlzLmxhc3RUb2tlbiA9IGxhc3RUb2tlbjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvVG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTU5ODIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0uCi0gKi8KLQotcHVibGljIGNsYXNzIFRva2VuIHsKLQotICAvKioKLSAgICogQW4gaW50ZWdlciB0aGF0IGRlc2NyaWJlcyB0aGUga2luZCBvZiB0aGlzIHRva2VuLiAgVGhpcyBudW1iZXJpbmcKLSAgICogc3lzdGVtIGlzIGRldGVybWluZWQgYnkgSmF2YUNDUGFyc2VyLCBhbmQgYSB0YWJsZSBvZiB0aGVzZSBudW1iZXJzIGlzCi0gICAqIHN0b3JlZCBpbiB0aGUgZmlsZSAuLi5Db25zdGFudHMuamF2YS4KLSAgICovCi0gIHB1YmxpYyBpbnQga2luZDsKLQotICAvKioKLSAgICogYmVnaW5MaW5lIGFuZCBiZWdpbkNvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgKiBvZiB0aGlzIHRva2VuOyBlbmRMaW5lIGFuZCBlbmRDb2x1bW4gZGVzY3JpYmUgdGhlIHBvc2l0aW9uIG9mIHRoZQotICAgKiBsYXN0IGNoYXJhY3RlciBvZiB0aGlzIHRva2VuLgotICAgKi8KLSAgcHVibGljIGludCBiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW47Ci0KLSAgLyoqCi0gICAqIFRoZSBzdHJpbmcgaW1hZ2Ugb2YgdGhlIHRva2VuLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBpbWFnZTsKLQotICAvKioKLSAgICogQSByZWZlcmVuY2UgdG8gdGhlIG5leHQgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuIGZyb20gdGhlIGlucHV0Ci0gICAqIHN0cmVhbS4gIElmIHRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBvciBpZiB0aGUKLSAgICogdG9rZW4gbWFuYWdlciBoYXMgbm90IHJlYWQgdG9rZW5zIGJleW9uZCB0aGlzIG9uZSwgdGhpcyBmaWVsZCBpcwotICAgKiBzZXQgdG8gbnVsbC4gIFRoaXMgaXMgdHJ1ZSBvbmx5IGlmIHRoaXMgdG9rZW4gaXMgYWxzbyBhIHJlZ3VsYXIKLSAgICogdG9rZW4uICBPdGhlcndpc2UsIHNlZSBiZWxvdyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGVudHMgb2YKLSAgICogdGhpcyBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiBuZXh0OwotCi0gIC8qKgotICAgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gYWNjZXNzIHNwZWNpYWwgdG9rZW5zIHRoYXQgb2NjdXIgcHJpb3IgdG8gdGhpcwotICAgKiB0b2tlbiwgYnV0IGFmdGVyIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuLgotICAgKiBJZiB0aGVyZSBhcmUgbm8gc3VjaCBzcGVjaWFsIHRva2VucywgdGhpcyBmaWVsZCBpcyBzZXQgdG8gbnVsbC4KLSAgICogV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzdWNoIHNwZWNpYWwgdG9rZW4sIHRoaXMgZmllbGQgcmVmZXJzCi0gICAqIHRvIHRoZSBsYXN0IG9mIHRoZXNlIHNwZWNpYWwgdG9rZW5zLCB3aGljaCBpbiB0dXJuIHJlZmVycyB0byB0aGUgbmV4dAotICAgKiBwcmV2aW91cyBzcGVjaWFsIHRva2VuIHRocm91Z2ggaXRzIHNwZWNpYWxUb2tlbiBmaWVsZCwgYW5kIHNvIG9uCi0gICAqIHVudGlsIHRoZSBmaXJzdCBzcGVjaWFsIHRva2VuICh3aG9zZSBzcGVjaWFsVG9rZW4gZmllbGQgaXMgbnVsbCkuCi0gICAqIFRoZSBuZXh0IGZpZWxkcyBvZiBzcGVjaWFsIHRva2VucyByZWZlciB0byBvdGhlciBzcGVjaWFsIHRva2VucyB0aGF0Ci0gICAqIGltbWVkaWF0ZWx5IGZvbGxvdyBpdCAod2l0aG91dCBhbiBpbnRlcnZlbmluZyByZWd1bGFyIHRva2VuKS4gIElmIHRoZXJlCi0gICAqIGlzIG5vIHN1Y2ggdG9rZW4sIHRoaXMgZmllbGQgaXMgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiBzcGVjaWFsVG9rZW47Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGltYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICAgcmV0dXJuIGltYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgVG9rZW4gb2JqZWN0LCBieSBkZWZhdWx0LiBIb3dldmVyLCBpZiB5b3Ugd2FudCwgeW91Ci0gICAqIGNhbiBjcmVhdGUgYW5kIHJldHVybiBzdWJjbGFzcyBvYmplY3RzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBvZktpbmQuCi0gICAqIFNpbXBseSBhZGQgdGhlIGNhc2VzIHRvIHRoZSBzd2l0Y2ggZm9yIGFsbCB0aG9zZSBzcGVjaWFsIGNhc2VzLgotICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzdWJjbGFzcyBvZiBUb2tlbiBjYWxsZWQgSURUb2tlbiB0aGF0Ci0gICAqIHlvdSB3YW50IHRvIGNyZWF0ZSBpZiBvZktpbmQgaXMgSUQsIHNpbWxweSBhZGQgc29tZXRoaW5nIGxpa2UgOgotICAgKgotICAgKiAgICBjYXNlIE15UGFyc2VyQ29uc3RhbnRzLklEIDogcmV0dXJuIG5ldyBJRFRva2VuKCk7Ci0gICAqCi0gICAqIHRvIHRoZSBmb2xsb3dpbmcgc3dpdGNoIHN0YXRlbWVudC4gVGhlbiB5b3UgY2FuIGNhc3QgbWF0Y2hlZFRva2VuCi0gICAqIHZhcmlhYmxlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGFuZCB1c2UgaXQgaW4geW91ciBsZXhpY2FsIGFjdGlvbnMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuIG5ld1Rva2VuKGludCBvZktpbmQpCi0gIHsKLSAgICAgc3dpdGNoKG9mS2luZCkKLSAgICAgewotICAgICAgIGRlZmF1bHQgOiByZXR1cm4gbmV3IFRva2VuKCk7Ci0gICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvVG9rZW5NZ3JFcnJvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuTWdyRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1M2RjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvVG9rZW5NZ3JFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbk1nckVycm9yLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBUb2tlbk1nckVycm9yIGV4dGVuZHMgRXJyb3IKLXsKLSAgIC8qCi0gICAgKiBPcmRpbmFscyBmb3IgdmFyaW91cyByZWFzb25zIHdoeSBhbiBFcnJvciBvZiB0aGlzIHR5cGUgY2FuIGJlIHRocm93bi4KLSAgICAqLwotCi0gICAvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLS8qKgotICAgICogTGV4aWNhbCBlcnJvciBvY2N1cmVkLgotICAgICovCi0gICBzdGF0aWMgZmluYWwgaW50IExFWElDQUxfRVJST1IgPSAwOwotCi0gICAvKioKLSAgICAqIEFuIGF0dGVtcHQgd2FzcyBtYWRlIHRvIGNyZWF0ZSBhIHNlY29uZCBpbnN0YW5jZSBvZiBhIHN0YXRpYyB0b2tlbiBtYW5hZ2VyLgotICAgICovCi0gICBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ19MRVhFUl9FUlJPUiA9IDE7Ci0KLSAgIC8qKgotICAgICogVHJpZWQgdG8gY2hhbmdlIHRvIGFuIGludmFsaWQgbGV4aWNhbCBzdGF0ZS4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0xFWElDQUxfU1RBVEUgPSAyOwotCi0gICAvKioKLSAgICAqIERldGVjdGVkIChhbmQgYmFpbGVkIG91dCBvZikgYW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgdG9rZW4gbWFuYWdlci4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBMT09QX0RFVEVDVEVEID0gMzsKLQotICAgLyoqCi0gICAgKiBJbmRpY2F0ZXMgdGhlIHJlYXNvbiB3aHkgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEl0IHdpbGwgaGF2ZQotICAgICogb25lIG9mIHRoZSBhYm92ZSA0IHZhbHVlcy4KLSAgICAqLwotICAgaW50IGVycm9yQ29kZTsKLQotICAgLyoqCi0gICAgKiBSZXBsYWNlcyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIGVzcGFjZWQgKG9yIHVuaWNvZGUgZXNjYXBlZCkKLSAgICAqIGVxdWl2YWxlbnRzIGluIHRoZSBnaXZlbiBzdHJpbmcKLSAgICAqLwotICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWRkRXNjYXBlcyhTdHJpbmcgc3RyKSB7Ci0gICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgY2hhciBjaDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQotICAgICAgICB7Ci0gICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcYic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcZic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7Ci0gICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOwotICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBSZXR1cm5zIGEgZGV0YWlsZWQgbWVzc2FnZSBmb3IgdGhlIEVycm9yIHdoZW4gaXQgaXMgdGhyb3duIGJ5IHRoZQotICAgICogdG9rZW4gbWFuYWdlciB0byBpbmRpY2F0ZSBhIGxleGljYWwgZXJyb3IuCi0gICAgKiBQYXJhbWV0ZXJzIDogCi0gICAgKiAgICBFT0ZTZWVuICAgICA6IGluZGljYXRlcyBpZiBFT0YgY2F1c2VkIHRoZSBsZXhpY2wgZXJyb3IKLSAgICAqICAgIGN1ckxleFN0YXRlIDogbGV4aWNhbCBzdGF0ZSBpbiB3aGljaCB0aGlzIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGVycm9yTGluZSAgIDogbGluZSBudW1iZXIgd2hlbiB0aGUgZXJyb3Igb2NjdXJlZAotICAgICogICAgZXJyb3JDb2x1bW4gOiBjb2x1bW4gbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGVycm9yQWZ0ZXIgIDogcHJlZml4IHRoYXQgd2FzIHNlZW4gYmVmb3JlIHRoaXMgZXJyb3Igb2NjdXJlZAotICAgICogICAgY3VyY2hhciAgICAgOiB0aGUgb2ZmZW5kaW5nIGNoYXJhY3RlcgotICAgICogTm90ZTogWW91IGNhbiBjdXN0b21pemUgdGhlIGxleGljYWwgZXJyb3IgbWVzc2FnZSBieSBtb2RpZnlpbmcgdGhpcyBtZXRob2QuCi0gICAgKi8KLSAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIExleGljYWxFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyKSB7Ci0gICAgICByZXR1cm4oIkxleGljYWwgZXJyb3IgYXQgbGluZSAiICsKLSAgICAgICAgICAgZXJyb3JMaW5lICsgIiwgY29sdW1uICIgKwotICAgICAgICAgICBlcnJvckNvbHVtbiArICIuICBFbmNvdW50ZXJlZDogIiArCi0gICAgICAgICAgIChFT0ZTZWVuID8gIjxFT0Y+ICIgOiAoIlwiIiArIGFkZEVzY2FwZXMoU3RyaW5nLnZhbHVlT2YoY3VyQ2hhcikpICsgIlwiIikgKyAiICgiICsgKGludCljdXJDaGFyICsgIiksICIpICsKLSAgICAgICAgICAgImFmdGVyIDogXCIiICsgYWRkRXNjYXBlcyhlcnJvckFmdGVyKSArICJcIiIpOwotICAgfQotCi0gICAvKioKLSAgICAqIFlvdSBjYW4gYWxzbyBtb2RpZnkgdGhlIGJvZHkgb2YgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgbWVzc2FnZXMuCi0gICAgKiBGb3IgZXhhbXBsZSwgY2FzZXMgbGlrZSBMT09QX0RFVEVDVEVEIGFuZCBJTlZBTElEX0xFWElDQUxfU1RBVEUgYXJlIG5vdAotICAgICogb2YgZW5kLXVzZXJzIGNvbmNlcm4sIHNvIHlvdSBjYW4gcmV0dXJuIHNvbWV0aGluZyBsaWtlIDogCi0gICAgKgotICAgICogICAgICJJbnRlcm5hbCBFcnJvciA6IFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCAuLi4uICIKLSAgICAqCi0gICAgKiBmcm9tIHRoaXMgbWV0aG9kIGZvciBzdWNoIGNhc2VzIGluIHRoZSByZWxlYXNlIHZlcnNpb24gb2YgeW91ciBwYXJzZXIuCi0gICAgKi8KLSAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7Ci0gICB9Ci0KLSAgIC8qCi0gICAgKiBDb25zdHJ1Y3RvcnMgb2YgdmFyaW91cyBmbGF2b3JzIGZvbGxvdy4KLSAgICAqLwotCi0gICBwdWJsaWMgVG9rZW5NZ3JFcnJvcigpIHsKLSAgIH0KLQotICAgcHVibGljIFRva2VuTWdyRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCByZWFzb24pIHsKLSAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgICAgZXJyb3JDb2RlID0gcmVhc29uOwotICAgfQotCi0gICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyLCBpbnQgcmVhc29uKSB7Ci0gICAgICB0aGlzKExleGljYWxFcnJvcihFT0ZTZWVuLCBsZXhTdGF0ZSwgZXJyb3JMaW5lLCBlcnJvckNvbHVtbiwgZXJyb3JBZnRlciwgY3VyQ2hhciksIHJlYXNvbik7Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4cGFyc2VyLnNlZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9maXhwYXJzZXIuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWE1ZTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9maXhwYXJzZXIuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyEvdXNyL2Jpbi9zZWQNCi0NCi0jDQotIyBUaGUgU1NFIGdlbmVyYWxseSB1c2VzIGNvbXBpbGVyIHNldHRpbmcgdG8gdHVybiAgbW9zdCB3YXJuaW5ncyBpbnRvIGVycm9ycy4gIA0KLSMgVGhpcyBpcyBhIGxpdHRsZSBwcm9ibGVtYXRpYyBmb3IgSmF2YUNDIGdlbmVyYXRlZCBmaWxlcy4gIFdlIGRvbid0IHdhbnQgDQotIyB0byBkaXN0cmlidXRlIGEgY3VzdG9taXplZCB2ZXJzaW9uIG9mIEphdmFDQyBub3IgaXMgdGhlcmUgYW55ICJ0ZW1wbGF0ZSIgDQotIyBtZWNoYW5pc20uICBTbywgdGhpcyBzaW1wbGUgc2VkIHNjcmlwdCBnb2VzIHRocm91Z2ggdGhlIGdlbmVyYXRlZCB0b2tlbg0KLSMgbWFuYWdlciBhbmQgZml4ZXMgYSBmZXcgdGhpbmdzLiAgSWYgSmF2YUNDIGNoYW5nZXMgdGhlIGdlbmVyYXRlZCBjb2RlLCANCi0jIGl0J3MgbGlrZWx5IHRoYXQgdGhpcyBzY3JpcHQgd2lsbCBubyBsb25nZXIgZG8gdGhlIHJpZ2h0IHRoaW5nLiAgRGl0dG8gd2l0aA0KLSMgYW55IHZlcnNpb24gb2YgSmF2YUNDIGJlc2lkZXMgMy4yLiBBbHNvLCB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgDQotIyBzY3JpcHQgd2lsbCBldmVuIHdvcmsgd2l0aCBhbiBhcmJpdHJhcnkgSmF2YUNDIGdyYW1tYXIuICBJdCdzIG9ubHkgYmVlbiB0ZXN0ZWQNCi0jIHdpdGggdGhlIGN1cnJlbnQgSlNQIEVMIGdyYW1tYXIuDQotIw0KLSMgQXV0aG9yOiBUZWQgQS4gQ2Fycm9sbCAodGNhcnJvbGxAYmVhLmNvbSkNCi0jDQotDQotcy9zdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgfS9zdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7IFxuICB9L2cNCi0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4dG0uc2VkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2ZpeHRtLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxZGVhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4dG0uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyEvdXNyL2Jpbi9zZWQNCi0NCi0jDQotIyBUaGUgU1NFIGdlbmVyYWxseSB1c2VzIGNvbXBpbGVyIHNldHRpbmcgdG8gdHVybiAgbW9zdCB3YXJuaW5ncyBpbnRvIGVycm9ycy4gIA0KLSMgVGhpcyBpcyBhIGxpdHRsZSBwcm9ibGVtYXRpYyBmb3IgSmF2YUNDIGdlbmVyYXRlZCBmaWxlcy4gIFdlIGRvbid0IHdhbnQgDQotIyB0byBkaXN0cmlidXRlIGEgY3VzdG9taXplZCB2ZXJzaW9uIG9mIEphdmFDQyBub3IgaXMgdGhlcmUgYW55ICJ0ZW1wbGF0ZSIgDQotIyBtZWNoYW5pc20uICBTbywgdGhpcyBzaW1wbGUgc2VkIHNjcmlwdCBnb2VzIHRocm91Z2ggdGhlIGdlbmVyYXRlZCB0b2tlbg0KLSMgbWFuYWdlciBhbmQgZml4ZXMgYSBmZXcgdGhpbmdzLiAgSWYgSmF2YUNDIGNoYW5nZXMgdGhlIGdlbmVyYXRlZCBjb2RlLCANCi0jIGl0J3MgbGlrZWx5IHRoYXQgdGhpcyBzY3JpcHQgd2lsbCBubyBsb25nZXIgZG8gdGhlIHJpZ2h0IHRoaW5nLiAgRGl0dG8gd2l0aA0KLSMgYW55IHZlcnNpb24gb2YgSmF2YUNDIGJlc2lkZXMgMy4yLiBBbHNvLCB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgDQotIyBzY3JpcHQgd2lsbCBldmVuIHdvcmsgd2l0aCBhbiBhcmJpdHJhcnkgSmF2YUNDIGdyYW1tYXIuICBJdCdzIG9ubHkgYmVlbiB0ZXN0ZWQNCi0jIHdpdGggdGhlIGN1cnJlbnQgSlNQIEVMIGdyYW1tYXIuDQotIw0KLSMgQXV0aG9yOiBUZWQgQS4gQ2Fycm9sbCAodGNhcnJvbGxAYmVhLmNvbSkNCi0jDQotDQotcy8oaW50KShjdXJDaGFyID4+IDgpL2N1ckNoYXIgPj4gOC9nDQotDQotL15wdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkvLCAvRU9GTG9vcC97DQotCS9pbnQga2luZDsvIHtkfQ0KLQkvVG9rZW4gc3BlY2lhbFRva2VuID0gbnVsbDsve2R9DQotfQ0KLQ0KLS9ecHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlTmZhXzAoaW50IHN0YXJ0U3RhdGUsIGludCBjdXJQb3MpLywgL2Zvcig7Oykvew0KLQlzL2ludCBqLCBraW5kID0gMHg3ZmZmZmZmZjsvaW50IGtpbmQgPSAweDdmZmZmZmZmOy9nDQotCS9pbnRcW1xdIG5leHRTdGF0ZXM7L3tkfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZ28uc2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZ28uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDVhYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2dvLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIS91c3IvYmluL3NoDQotDQotIyBTZXQgSkFWQUNDX0hPTUUgdG8gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgamF2YWNjIDMuMg0KLSRKQVZBQ0NfSE9NRS9iaW4vamp0cmVlLmJhdCBKU1BFTC5qanQNCi0kSkFWQUNDX0hPTUUvYmluL2phdmFjYy5iYXQgSlNQRUwuamoNCi1zZWQgLWYgZml4dG0uc2VkIC1pLmJhayBKU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhDQotZGlmZiAtdyBKU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEuYmFrDQotc2VkIC1mIGZpeHBhcnNlci5zZWQgLWkuYmFrIEpTUEVMUGFyc2VyLmphdmENCi1kaWZmIC13IEpTUEVMUGFyc2VyLmphdmEgSlNQRUxQYXJzZXIuamF2YS5iYWsNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0luZGV4V29ya3NwYWNlSm9iLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0luZGV4V29ya3NwYWNlSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZDNmZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotCi0vKioKLSAqIFJlLWluZGV4ZXMgdGhlIGVudGlyZSB3b3Jrc3BhY2UuCi0gKiBFbnN1cmVzIHRoZSBKU1AgSW5kZXggaXMgaW4gYSBzdGFibGUgc3RhdGUgYmVmb3JlIHBlcmZvcm1pbmcgYSBzZWFyY2guCi0gKiAobGlrZSBhZnRlciBhIGNyYXNoIG9yIGlmIHByZXZpb3VzIGluZGV4aW5nIHdhcyBjYW5jZWxlZCkKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEluZGV4V29ya3NwYWNlSm9iIGV4dGVuZHMgSm9iIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWU9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwaW5kZXhtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFZpc2l0b3IgdGhhdCByZXRyaWV2ZXMganNwIHByb2plY3QgcGF0aHMgZm9yIGFsbCBqc3AgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSwKLQkgKiBhbmQgYWRkcyB0aGUgZmlsZXMgdG8gYmUgaW5kZXhlZCBhcyB0aGV5IGFyZSBlbmNvdW50ZXJlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCSAgICBwcml2YXRlIExpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQkKLQkJLy8gbW9uaXRvciBmcm9tIHRoZSBKb2IKLQkJSVByb2dyZXNzTW9uaXRvciBmSW5uZXJNb25pdG9yID0gbnVsbDsKLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdGhpcy5mSW5uZXJNb25pdG9yID0gbW9uaXRvcjsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQkJLy8gY2hlY2sgam9iIGNhbmNlbGVkCi0JCQlpZiAodGhpcy5mSW5uZXJNb25pdG9yICE9IG51bGwgJiYgdGhpcy5mSW5uZXJNb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNoZWNrIHNlYXJjaCBzdXBwb3J0IGNhbmNlbGVkCi0JCQlpZihKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQotCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNTUzCi0JCQkJLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24KLQkJCQkvLyBjaGVjayBuYW1lIGJlZm9yZSBhY3R1YWxseSBnZXR0aW5nIHRoZSBmaWxlIChsZXNzIHdvcmspCi0JCQkJaWYoZ2V0SnNwQ29udGVudFR5cGUoKS5pc0Fzc29jaWF0ZWRXaXRoKHByb3h5LmdldE5hbWUoKSkpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCWlmKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQotCQkJCQkJaWYoREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSW5kZXhXb3Jrc3BhY2VKb2IgYWRkaW5nIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIHRoaXMgY2FsbCB3aWxsIGNoZWNrIHRoZSBDb250ZW50VHlwZURlc2NyaXB0aW9uLCBzbyBkb24ndCBuZWVkIHRvIGRvIGl0IGhlcmUuCi0JCQkJCQkvL0pTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5hZGRKc3BGaWxlKGZpbGUpOwotCQkJCQkJdGhpcy5maWxlcy5hZGQoZmlsZSk7Ci0JCQkJCQl0aGlzLmZJbm5lck1vbml0b3Iuc3ViVGFzayhwcm94eS5nZXROYW1lKCkpOwotCQkJCQkJCi0JCQkJCQkvLyBkb24ndCBzZWFyY2ggZGVlcGVyIGZvciBmaWxlcwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBmaW5hbCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkgICAgcmV0dXJuIChJRmlsZVtdKXRoaXMuZmlsZXMudG9BcnJheShuZXcgSUZpbGVbdGhpcy5maWxlcy5zaXplKCldKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGVKU1AgPSBudWxsOwotCQotCXB1YmxpYyBJbmRleFdvcmtzcGFjZUpvYigpIHsKLQkJLy8gcGFfVE9ETyBtYXkgd2FudCB0byBzYXkgc29tZXRoaW5nIGxpa2UgIlJlYnVpbGRpbmcgSlNQIEluZGV4IiB0byBiZSBtb3JlCi0JCS8vIGRlc2NyaXB0aXZlIGluc3RlYWQgb2YgIlVwZGF0aW5nIEpTUCBJbmRleCIgc2luY2UgdGhleSBhcmUgMiBkaWZmZXJlbnQgdGhpbmdzCi0JCXN1cGVyKEpTUENvcmVNZXNzYWdlcy5KU1BJbmRleE1hbmFnZXJfMCk7Ci0JCXNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJc2V0U3lzdGVtKHRydWUpOwotCX0KLQotCUlDb250ZW50VHlwZSBnZXRKc3BDb250ZW50VHlwZSgpIHsKLQkJaWYodGhpcy5mQ29udGVudFR5cGVKU1AgPT0gbnVsbCkKLQkJCXRoaXMuZkNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCXJldHVybiB0aGlzLmZDb250ZW50VHlwZUpTUDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcgZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnMuSW50ZXJuYWxKb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKSAKLQkgKiBmb3Igc2ltaWxhciBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQotCQlpZihtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9Ci0JCQotCQlpZihERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIF4gSW5kZXhXb3Jrc3BhY2VKb2Igc3RhcnRlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCi0JCXRyeSB7Ci0JCSAgICBKU1BGaWxlVmlzaXRvciB2aXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKG1vbml0b3IpOwotCQkgICAgLy8gY29sbGVjdCBhbGwganNwIGZpbGVzCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJLy8gcmVxdWVzdCBpbmRleGluZwotCQkJLy8gdGhpcyBpcyBwcmV0dHkgbXVjaCBsaWtlIGZha2luZyBhbiBlbnRpcmUgd29ya3NwYWNlIHJlc291cmNlIGRlbHRhCi0JCQlKU1BJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbmRleEZpbGVzKHZpc2l0b3IuZ2V0RmlsZXMoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYoREVCVUcpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCWxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWlmKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXiBJbmRleFdvcmtzcGFjZUpvYiBmaW5pc2hlZFxuICAgdG90YWwgdGltZSBydW5uaW5nOiAiICsgKGZpbmlzaCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXZvaWQgc2V0Q2FuY2VsZWRTdGF0ZSgpIHsKLQkJSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0SW5kZXhTdGF0ZShKU1BJbmRleE1hbmFnZXIuU19DQU5DRUxFRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BJbmRleE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQSW5kZXhNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTc2ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BJbmRleE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0aGUgSlNQIGluZGV4IHVwIHRvIGRhdGUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BJbmRleE1hbmFnZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCS8vIFRPRE8gbW92ZSB0aGlzIHRvIExvZ2dlciwgYXMgd2UgaGF2ZSBpbiBTU0UKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGluZGV4bWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtFWV9JTkRFWF9TVEFURSA9ICJqc3BJbmRleFN0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbmRleFdvcmtzcGFjZUpvYiBpbmRleGluZ0pvYiA9IG5ldyBJbmRleFdvcmtzcGFjZUpvYigpOwotCi0KLQotCS8vIFRPRE86IGNvbnNpZGVyIGVudW1lcmF0aW9uIGZvciB0aGVzZSBpbnQgY29uc3RhbnRzCi0JLy8gc2V0IHRvIFNfVVBEQVRJTkcgb25jZSBhIHJlc291cmNlIGNoYW5nZSBjb21lcyBpbgotCS8vIHNldCB0byBTX1NUQUJMRSBpZjoKLQkvLyAtIHdlIGtub3cgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhlIHJlc291cmNlIGNoYW5nZQotCS8vIC0gb3IgdGhlIFByb2Nlc3NGaWxlc0pvYiBjb21wbGV0ZXMKLQkvLyBzZXQgdG8gU19DQU5DRUxFRCBpZiBhbiBpbmRleGluZyBqb2IgaXMgY2FuY2VsZWQKLQkvLyBzZXQgdG8gU19SRUJVSUxESU5HIGlmIHJlLWluZGV4aW5nIHRoZSBlbnRpcmUgd29ya3NwYWNlCi0KLQkvLyB0aGUgaW50ICcwJyBpcyByZXNlcnZlZCBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgYSBwcmVmZXJlbmNlIGlzIG5vdAotCS8vIHRoZXJlCi0JLyoqIGluZGV4IGlzIHJlbGlhYmxlIHRvIHVzZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfU1RBQkxFID0gMTsKLQkvKiogaW5kZXggaXMgYmVpbmcgdXBkYXRlZCAoZnJvbSBhIHJlc291cmNlIGRlbHRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfVVBEQVRJTkcgPSAyOwotCS8qKiBlbnRpcmUgaW5kZXggaXMgYmVpbmcgcmVidWlsdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfUkVCVUlMRElORyA9IDM7Ci0JLyoqCi0JICogaW5kZXhpbmcgam9iIHdhcyBjYW5jZWxlZCBpbiB0aGUgbWlkZGxlIG9mIGl0LCBpbmRleCBuZWVkcyB0byBiZQotCSAqIHJlYnVpbHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0NBTkNFTEVEID0gNDsKLQotCS8qKiBzeW1ib2xpYyBuYW1lIGZvciBPU0dJIGZyYW1ld29yayAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb2xsZWN0cyBKU1AgZmlsZXMgZnJvbSBhIHJlc291cmNlIGRlbHRhLgotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy8gdXNpbmcgaGFzaCBtYXAgZW5zdXJlcyBvbmx5IG9uZSBvZiBlYWNoIGZpbGUKLQkJLy8gbXVzdCBiZSByZXNldCBiZWZvcmUgZXZlcnkgdXNlCi0JCXByaXZhdGUgSGFzaE1hcCBqc3BGaWxlcyA9IG51bGw7Ci0KLQkJcHVibGljIEpTUFJlc291cmNlVmlzaXRvcigpIHsKLQkJCXRoaXMuanNwRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJLy8gaW4gY2FzZSBKU1Agc2VhcmNoIHdhcyBjYW5jZWxlZCAoZWcuIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yKQotCQkJaWYgKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkgfHwgZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKCFpc0hpZGRlblJlc291cmNlKGRlbHRhLmdldEZ1bGxQYXRoKCkpKSB7Ci0KLQkJCQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCQkJYm9vbGVhbiBpc0ludGVyZXN0aW5nQ2hhbmdlID0gZmFsc2U7Ci0JCQkJCWlmICgoa2luZCAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQkJCQkvLyBpZ25vcmUgdGhpbmdzIGxpa2UgbWFya2VyIGNoYW5nZXMKLQkJCQkJCWlzSW50ZXJlc3RpbmdDaGFuZ2UgPSAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSBJUmVzb3VyY2VEZWx0YS5DT05URU5UIHx8IChmbGFncyAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRDsKLQkJCQkJfQotCQkJCQlib29sZWFuIHJlbW92ZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci0JCQkJCWlmIChhZGRlZCB8fCBpc0ludGVyZXN0aW5nQ2hhbmdlKSB7Ci0KLQkJCQkJCXZpc2l0QWRkZWQoZGVsdGEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlbW92ZWQpIHsKLQkJCQkJCXZpc2l0UmVtb3ZlZChkZWx0YSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCWlmIChERUJVRykKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRGVsdGEgYW5hbHlzaXMgbWF5IG5vdCBiZSBjb21wbGV0ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBpZiB0aGUgZGVsdGEgaGFzIGNoaWxkcmVuLCBjb250aW51ZSB0byBhZGQvcmVtb3ZlIGZpbGVzCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdFJlbW92ZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCS8vIGhhbmRsZSBjbGVhbnVwCi0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICYmIHIuZXhpc3RzKCkpIHsKLQkJCQkJZGVsZXRlSW5kZXgoKElGaWxlKSByKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdmlzaXRBZGRlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCS8vIHF1aWNrIGNoZWNrIGlmIGl0J3MgZXZlbiBKU1AgcmVsYXRlZCB0byBpbXByb3ZlCi0JCQkvLyBwZXJmb3JtYW5jZQotCQkJLy8gY2hlY2tpbmcgbmFtZSBmcm9tIHRoZSBkZWx0YSBiZWZvcmUgZ2V0dGluZwotCQkJLy8gcmVzb3VyY2UgYmVjYXVzZSBpdCdzIGxpZ2h0ZXIKLQkJCVN0cmluZyBmaWxlbmFtZSA9IGRlbHRhLmdldEZ1bGxQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCWlmIChmaWxlbmFtZSAhPSBudWxsICYmIGdldEpzcENvbnRlbnRUeXBlKCkuaXNBc3NvY2lhdGVkV2l0aChmaWxlbmFtZSkpIHsKLQkJCQlJUmVzb3VyY2UgciA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKHIgIT0gbnVsbCAmJiByLmV4aXN0cygpICYmIHIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCXRoaXMuanNwRmlsZXMucHV0KHIuZ2V0RnVsbFBhdGgoKSwgcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzNDYzCi0JCXByaXZhdGUgYm9vbGVhbiBpc0hpZGRlblJlc291cmNlKElQYXRoIHApIHsKLQkJCVN0cmluZ1tdIHNlZ21lbnRzID0gcC5zZWdtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWdtZW50c1tpXS5zdGFydHNXaXRoKCIuIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZGVsZXRlSW5kZXgoSUZpbGUgZm9sZGVyKSB7Ci0JCQkvLyBjbGVhbnVwIGluZGV4Ci0JCQlJbmRleE1hbmFnZXIgaW0gPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEluZGV4TWFuYWdlcigpOwotCQkJSVBhdGggZm9sZGVyUGF0aCA9IGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCQkJSVBhdGggaW5kZXhMb2NhdGlvbiA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5jb21wdXRlSW5kZXhMb2NhdGlvbihmb2xkZXJQYXRoKTsKLQkJCWltLnJlbW92ZUluZGV4KGluZGV4TG9jYXRpb24pOwotCQkJLy8gaW0uaW5kZXhMb2NhdGlvbnMucmVtb3ZlS2V5KGZvbGRlclBhdGgpOwotCQkJLy8gaW0uaW5kZXhMb2NhdGlvbnMucmVtb3ZlVmFsdWUoaW5kZXhMb2NhdGlvbik7Ci0JCQlGaWxlIGYgPSBpbmRleExvY2F0aW9uLnRvRmlsZSgpOwotCQkJZi5kZWxldGUoKTsKLQkJfQotCi0JCXB1YmxpYyBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSB0aGlzLmpzcEZpbGVzLnZhbHVlcygpLnRvQXJyYXkobmV3IElGaWxlW3RoaXMuanNwRmlsZXMuc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJCXRoaXMuanNwRmlsZXMuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8vIGVuZCBjbGFzcyBKU1BSZXNvdXJjZVZpc2l0b3IKLQotCS8qKgotCSAqIHNjaGVkdWxlcyBKU1AgZmlsZXMgZm9yIGluZGV4aW5nIGJ5IEphdmEgY29yZQotCSAqLwotCXByaXZhdGUgY2xhc3MgUHJvY2Vzc0ZpbGVzSm9iIGV4dGVuZHMgSm9iIHsKLQkJTGlzdCBmaWxlTGlzdCA9IG51bGw7Ci0JCS8vIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgZmlsZXMgd2UndmUgaW5kZXhlZAotCQlpbnQgbGFzdEZpbGVDdXJzb3IgPSAwOwotCi0JCVByb2Nlc3NGaWxlc0pvYihTdHJpbmcgdGFza05hbWUpIHsKLQkJCXN1cGVyKHRhc2tOYW1lKTsKLQkJCWZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIHZvaWQgcHJvY2VzcyhJRmlsZVtdIGZpbGVzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmlsZUxpc3QuYWRkKGZpbGVzW2ldKTsKLQkJCX0KLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyIHF1ZXVpbmcgIiArIGZpbGVzLmxlbmd0aCArICIgZmlsZXMiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSkgZmlsZUxpc3QudG9BcnJheShuZXcgSUZpbGVbZmlsZUxpc3Quc2l6ZSgpXSk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckZpbGVzKCkgewotCQkJZmlsZUxpc3QuY2xlYXIoKTsKLQkJCWxhc3RGaWxlQ3Vyc29yID0gMDsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjbGVhcmVkIGZpbGVzIik7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImluZGV4ZXIgbW9uaXRvciIgKyBtb25pdG9yKTsKLQkJCWlmIChpc0NhbmNlbGVkKG1vbml0b3IpIHx8IGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCi0JCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJCXRyeSB7Ci0JCQkJSUZpbGVbXSBmaWxlc1RvQmVQcm9jZXNzZWQgPSBnZXRGaWxlcygpOwotCi0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyIGluZGV4aW5nICIgKyBmaWxlc1RvQmVQcm9jZXNzZWQubGVuZ3RoICsgIiBmaWxlcyIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8gQVBJIGluZGljYXRlcyB0aGF0IG1vbml0b3IgaXMgbmV2ZXIgbnVsbAotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBmaWxlc1RvQmVQcm9jZXNzZWQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJCUpTUFNlYXJjaFN1cHBvcnQgc3MgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQkJU3RyaW5nIHByb2Nlc3NpbmdORmlsZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkJCQlmb3IgKDtsYXN0RmlsZUN1cnNvciA8IGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGg7IGxhc3RGaWxlQ3Vyc29yKyspIHsKLQotCQkJCQlpZiAoaXNDYW5jZWxlZChtb25pdG9yKSB8fCBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCX0KLQkJCQkJSUZpbGUgZmlsZSA9IGZpbGVzVG9CZVByb2Nlc3NlZFtsYXN0RmlsZUN1cnNvcl07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShmaWxlLmdldFByb2plY3QoKSk7Ci0JCQkJCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkJCXNzLmFkZEpzcEZpbGUoZmlsZSk7Ci0JCQkJCQkJLy8gSlNQIEluZGV4ZXIgcHJvY2Vzc2luZyBuIGZpbGVzCi0JCQkJCQkJcHJvY2Vzc2luZ05GaWxlcyA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BJbmRleE1hbmFnZXJfMiwgbmV3IFN0cmluZ1tde0ludGVnZXIudG9TdHJpbmcoKGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGggLSBsYXN0RmlsZUN1cnNvcikpfSk7Ci0JCQkJCQkJbW9uaXRvci5zdWJUYXNrKHByb2Nlc3NpbmdORmlsZXMgKyAiIC0gIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyIEpvYiBhZGRlZCBmaWxlOiAiICsgZmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gUkFUTEMwMDI4NDc3NgotCQkJCQkJLy8gSVNTVUU6IHdlIHByb2JhYmx5IHNob3VsZG4ndCBiZSBjYXRjaGluZyBFVkVSWQotCQkJCQkJLy8gZXhjZXB0aW9uLCBidXQKLQkJCQkJCS8vIHRoZSBmcmFtZXdvcmsgb25seSBhbGxvd3MgdG8gcmV0dXJuIElTdGF0dXMgaW4KLQkJCQkJCS8vIG9yZGVyIHRvIGNvbW11bmljYXRlCi0JCQkJCQkvLyB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nLCB3aGljaCBtZWFucyB0aGUgbG9vcAotCQkJCQkJLy8gd29uJ3QgY29tcGxldGUsIGFuZCB3ZSB3b3VsZCBoaXQgdGhlIHNhbWUgcHJvYmxlbQotCQkJCQkJLy8gdGhlIG5leHQgdGltZS4KLQkJCQkJCS8vIAotCQkJCQkJLy8gYSBwb3NzaWJsZSBzb2x1dGlvbiBpcyB0byBrZWVwIHRyYWNrIG9mIHRoZQotCQkJCQkJLy8gZXhjZXB0aW9ucyBsb2dnZWQKLQkJCQkJCS8vIGFuZCBvbmx5IGxvZyBhIGNlcnRhaW4gYW10IG9mIHRoZSBzYW1lIG9uZSwKLQkJCQkJCS8vIG90aGVyd2lzZSBza2lwIGl0LgotCQkJCQkJaWYgKCFmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZSAhPSBudWxsID8gZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkpTUEluZGV4ZXIgcHJvYmxlbSBpbmRleGluZzoiICsgZmlsZW5hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IC8vIGVuZCBmb3IKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIGp1c3QgaW4gY2FzZSBzb21ldGhpbmcgZGlkbid0IGZvbGxvdyBBUEkgKG1vbml0b3IgaXMgbnVsbCkKLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQotCQkJLy8gc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkLCBjbGVhciBmaWxlcyBsaXN0Ci0JCQljbGVhckZpbGVzKCk7Ci0JCQkKLQkJCWxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlsb25nIGRpZmYgPSBmaW5pc2ggLSBzdGFydDsKLQkJCWlmIChERUJVRykgewotCQkJCWZUb3RhbFRpbWUgKz0gZGlmZjsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidGhpcyB0aW1lOiAiICsgZGlmZiArICIgY3VtdWxhdGl2ZSB0aW1lIGZvciByZXNvdXJjZSBjaGFuZ2VkOiAiICsgZlRvdGFsVGltZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc0NhbmNlbGVkKElQcm9ncmVzc01vbml0b3IgcnVuTW9uaXRvcikgewotCi0JCQlib29sZWFuIGNhbmNlbGVkID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBzcGVjaWZpYyBtb25pdG9yIHBhc3NlZCBpbnRvIHJ1biBtZXRob2QgKHRoZSBwcm9ncmVzcwotCQkJLy8gZ3JvdXAgaW4gdGhpcyBjYXNlKQotCQkJLy8gY2hlY2sgbWFpbiBzZWFyY2ggc3VwcG9ydCBjYW5jZWxlZAotCQkJaWYgKHJ1bk1vbml0b3IgIT0gbnVsbCAmJiBydW5Nb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQljYW5jZWxlZCA9IHRydWU7Ci0JCQllbHNlIGlmIChKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJY2FuY2VsZWQgPSB0cnVlOwotCQkJCWlmIChydW5Nb25pdG9yICE9IG51bGwpIHsKLQkJCQkJcnVuTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2FuY2VsZWQ7Ci0JCX0KLQkJCi0JfQotCi0JLy8gZW5kIGNsYXNzIFByb2Nlc3NGaWxlc0pvYgotCi0JcHJpdmF0ZSBzdGF0aWMgSlNQSW5kZXhNYW5hZ2VyIGZTaW5nbGV0b24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6aW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgSW5kZXhKb2JDb29yZGluYXRvciBpbmRleEpvYkNvb3JkaW5hdG9yOwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIganNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQotCXByaXZhdGUgSlNQUmVzb3VyY2VWaXNpdG9yIGZWaXNpdG9yID0gbnVsbDsKLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGVKU1AgPSBudWxsOwotCi0Jc3RhdGljIGxvbmcgZlRvdGFsVGltZSA9IDA7Ci0KLQkvLyBKb2IgZm9yIHByb2Nlc3NpbmcgcmVzb3VyY2UgZGVsdGEKLQlwcml2YXRlIFByb2Nlc3NGaWxlc0pvYiBwcm9jZXNzRmlsZXNKb2IgPSBudWxsOwotCi0JcHJpdmF0ZSBKU1BJbmRleE1hbmFnZXIoKSB7Ci0JCXByb2Nlc3NGaWxlc0pvYiA9IG5ldyBQcm9jZXNzRmlsZXNKb2IoSlNQQ29yZU1lc3NhZ2VzLkpTUEluZGV4TWFuYWdlcl8wKTsKLQkJLy8gb25seSBzaG93IGluIHZlcmJvc2UgbW9kZQotCQlwcm9jZXNzRmlsZXNKb2Iuc2V0U3lzdGVtKHRydWUpOwotCQlwcm9jZXNzRmlsZXNKb2Iuc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotCQlwcm9jZXNzRmlsZXNKb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmRvbmUoZXZlbnQpOwotCQkJCXNldFN0YWJsZVN0YXRlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpTUEluZGV4TWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQotCQlpZiAoZlNpbmdsZXRvbiA9PSBudWxsKQotCQkJZlNpbmdsZXRvbiA9IG5ldyBKU1BJbmRleE1hbmFnZXIoKTsKLQkJcmV0dXJuIGZTaW5nbGV0b247Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQotCQlKU1BJbmRleE1hbmFnZXIgc2luZ2xlSW5zdGFuY2UgPSBnZXRJbnN0YW5jZSgpOwotCi0KLQkJaWYgKCFzaW5nbGVJbnN0YW5jZS5pbml0aWFsaXplZCkgewotCQkJc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCQlzaW5nbGVJbnN0YW5jZS5pbmRleEpvYkNvb3JkaW5hdG9yID0gbmV3IEluZGV4Sm9iQ29vcmRpbmF0b3IoKTsKLQkJCXNpbmdsZUluc3RhbmNlLmpzcFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSlNQUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCQkvLyBhZGRlZCBhcyBKb2JDaGFuZ2UgbGlzdGVuZXIgc28gSlNQSW5kZXhNYW5hZ2VyIGNhbiBiZSBzbWFydGVyCi0JCQkvLyBhYm91dCB3aGVuIGl0IHJ1bnMKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihzaW5nbGVJbnN0YW5jZS5pbmRleEpvYkNvb3JkaW5hdG9yKTsKLQotCQkJLy8gYWRkIEpTUEluZGV4TWFuYWdlciB0byBrZWVwIEpTUCBJbmRleCB1cCB0byBkYXRlCi0JCQkvLyBsaXN0ZW5pbmcgZm9yIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgYW5kCi0JCQkvLyBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRQotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoanNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTA5MQotCQkJLy8gbWFrZXMgc3VyZSBJbmRleE1hbmFnZXIgaXMgYXdhcmUgb2Ygb3VyIGluZGV4ZXMKLQkJCXNhdmVJbmRleGVzKCk7Ci0JCQlzaW5nbGVJbnN0YW5jZS5pbml0aWFsaXppbmcgPSBmYWxzZTsKLQotCQl9Ci0KLQl9Ci0JCi0Jc3luY2hyb25pemVkIHZvaWQgc2V0SW5kZXhTdGF0ZShpbnQgc3RhdGUpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBzZXR0aW5nIGluZGV4IHN0YXRlIHRvOiAiICsgc3RhdGUyU3RyaW5nKHN0YXRlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlQbHVnaW4ganNwTW9kZWxQbHVnaW4gPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJanNwTW9kZWxQbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShQS0VZX0lOREVYX1NUQVRFLCBzdGF0ZSk7Ci0JCWpzcE1vZGVsUGx1Z2luLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgc3RhdGUyU3RyaW5nKGludCBzdGF0ZSkgewotCQlTdHJpbmcgcyA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQljYXNlIChTX1NUQUJMRSkgOgotCQkJCXMgPSAiU19TVEFCTEUiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIChTX1VQREFUSU5HKSA6Ci0JCQkJcyA9ICJTX1VQREFUSU5HIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAoU19DQU5DRUxFRCkgOgotCQkJCXMgPSAiU19DQU5DRUxFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgKFNfUkVCVUlMRElORykgOgotCQkJCXMgPSAiU19SRUJVSUxESU5HIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCWludCBnZXRJbmRleFN0YXRlKCkgewotCQlyZXR1cm4gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoUEtFWV9JTkRFWF9TVEFURSk7Ci0JfQotCi0Jdm9pZCBzZXRVcGRhdGluZ1N0YXRlKCkgewotCQkvL2lmIChnZXRJbmRleFN0YXRlKCkgIT0gU19DQU5DRUxFRCkKLQkJc2V0SW5kZXhTdGF0ZShTX1VQREFUSU5HKTsKLQl9Ci0KLQl2b2lkIHNldENhbmNlbGVkU3RhdGUoKSB7Ci0JCXNldEluZGV4U3RhdGUoSlNQSW5kZXhNYW5hZ2VyLlNfQ0FOQ0VMRUQpOwotCX0KLQotCXZvaWQgc2V0U3RhYmxlU3RhdGUoKSB7Ci0JCS8vaWYgKGdldEluZGV4U3RhdGUoKSAhPSBTX0NBTkNFTEVEKQotCQlzZXRJbmRleFN0YXRlKFNfU1RBQkxFKTsKLQl9Ci0KLQl2b2lkIHNldFJlYnVpbGRpbmdTdGF0ZSgpIHsKLQkJc2V0SW5kZXhTdGF0ZShTX1JFQlVJTERJTkcpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRJbmRleElmTmVlZGVkKCkgewotCQlpZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfU1RBQkxFKSB7Ci0JCQlyZWJ1aWxkSW5kZXgoKTsKLQkJfQotCX0KLQotCXZvaWQgcmVidWlsZEluZGV4KCkgewotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIEpTUCBJbmRleCB1bnN0YWJsZSwgcmVxdWVzdGluZyByZS1pbmRleGluZyIpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0SW5kZXhpbmdKb2IoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9SdW4oSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIuYWJvdXRUb1J1bihldmVudCk7Ci0JCQkJc2V0UmVidWlsZGluZ1N0YXRlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIuZG9uZShldmVudCk7Ci0JCQkJc2V0U3RhYmxlU3RhdGUoKTsKLQkJCQlnZXRJbmRleGluZ0pvYigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQl9KTsKLQkJLy8gd2UncmUgYWJvdXQgdG8gcmVpbmRleCBldmVyeXRoaW5nIGFueXdheQotCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5jbGVhckZpbGVzKCk7Ci0JCWdldEluZGV4aW5nSm9iKCkuc2NoZWR1bGUoKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHNjaGVkdWxlcyBhIEpvYiB0byBwcm9jZXNzIGNvbGxlY3RlZCBmaWxlcy4gQWxsIEpTUAotCSAqIGluZGV4aW5nIHNob3VsZCBiZSBkb25lIHRocm91Z2ggdGhpcyBtZXRob2Qgb3IgcHJvY2Vzc0ZpbGVzKElGaWxlIGZpbGUpCi0JICogCi0JICogQHBhcmFtIGZpbGVzCi0JICovCi0JZmluYWwgdm9pZCBpbmRleEZpbGVzKElGaWxlW10gZmlsZXMpIHsKLQkJLy8gZG9uJ3QgdXNlIHRoaXMgcnVsZQotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkzMQotCQkvLyBwcm9jZXNzRmlsZXMuc2V0UnVsZShuZXcgSW5kZXhGaWxlUnVsZSgpKTsKLQkJcHJvY2Vzc0ZpbGVzSm9iLnByb2Nlc3MoZmlsZXMpOwotCX0KLQotCi0JLyoqCi0JICogUGFja2FnZSBwcm90ZWN0ZWQgZm9yIGFjY2VzcyBieSBpbm5lciBKb2IgY2xhc3MgaW4gcmVzb3VyY2VDaGFuZ2VkKC4uLikKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSlNQUmVzb3VyY2VWaXNpdG9yIGdldFZpc2l0b3IoKSB7Ci0KLQkJaWYgKHRoaXMuZlZpc2l0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5mVmlzaXRvciA9IG5ldyBKU1BSZXNvdXJjZVZpc2l0b3IoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5mVmlzaXRvcjsKLQl9Ci0KLQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTA5MQotCS8vIG1ha2VzIHN1cmUgSW5kZXhNYW5hZ2VyIGlzIGF3YXJlIG9mIG91ciBpbmRleGVzCi0Jdm9pZCBzYXZlSW5kZXhlcygpIHsKLQkJSW5kZXhNYW5hZ2VyIGluZGV4TWFuYWdlciA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCUlQYXRoIGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldE1vZGVsSnNwUGx1Z2luV29ya2luZ0xvY2F0aW9uKCk7Ci0KLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShqc3BNb2RlbFdvcmtpbmdMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQlTdHJpbmdbXSBmaWxlcyA9IGZvbGRlci5saXN0KCk7Ci0JCVN0cmluZyBsb2NheSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUluZGV4IGluZGV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmluZGV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2NheSA9IGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBmaWxlc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyByZXVzZSBpbmRleCBmaWxlCi0JCQkJCWluZGV4ID0gbmV3IEluZGV4KGxvY2F5LCAiSW5kZXggZm9yICIgKyBsb2NheSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5kZXhNYW5hZ2VyLnNhdmVJbmRleChpbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gd2Ugc2hvdWxkIGJlIHNodXR0aW5nIGRvd24sIHdhbnQgdG8gc2h1dCBkb3duIHF1aWV0bHkKLQkJCWlmIChERUJVRykKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JSUNvbnRlbnRUeXBlIGdldEpzcENvbnRlbnRUeXBlKCkgewotCQlpZiAodGhpcy5mQ29udGVudFR5cGVKU1AgPT0gbnVsbCkKLQkJCXRoaXMuZkNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCXJldHVybiB0aGlzLmZDb250ZW50VHlwZUpTUDsKLQl9Ci0KLQkvKioKLQkgKiBBIGNoZWNrIHRvIHNlZSBpZiB0aGUgT1NHSSBmcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFN5c3RlbSBCdW5kbGUgaXMgc3RvcHBlZCAoaWUuIHRoZSBmcmFtZXdvcmsgaXMKLQkgKiAgICAgICAgIHNodXR0aW5nIGRvd24pCi0JICovCi0JYm9vbGVhbiBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpIHsKLQkJLy8gaW4gdGhlIEZyYW1ld29yayBjbGFzcyB0aGVyZSdzIGEgbm90ZToKLQkJLy8gc2V0IHRoZSBzdGF0ZSBvZiB0aGUgU3lzdGVtIEJ1bmRsZSB0byBTVE9QUElORy4KLQkJLy8gdGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QgYWNjb3JkaW5nIHRvIHNlY3Rpb24gNC4xOS4yIGZyb20gdGhlIE9TR2kKLQkJLy8gUjMgc3BlYy4KLQkJYm9vbGVhbiBzaHV0dGluZ0Rvd24gPSBQbGF0Zm9ybS5nZXRCdW5kbGUoT1NHSV9GUkFNRVdPUktfSUQpLmdldFN0YXRlKCkgPT0gQnVuZGxlLlNUT1BQSU5HOwotCQlpZiAoREVCVUcgJiYgc2h1dHRpbmdEb3duKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlcjogc3lzdGVtIGlzIHNodXR0aW5nIGRvd24hIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc2h1dHRpbmdEb3duOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0KLQkJLy8gc3RvcCBsaXN0ZW5pbmcKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoanNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0KLQotCQkvLyBzdG9wIGFueSBzZWFyY2hpbmcKLQkJSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNldENhbmNlbGVkKHRydWUpOwotCi0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIGpvYnMKLQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGluZGV4Sm9iQ29vcmRpbmF0b3IpOwotCi0KLQkJaW50IG1heHdhaXQgPSA1MDAwOwotCQlpZiAocHJvY2Vzc0ZpbGVzSm9iICE9IG51bGwpIHsKLQkJCXByb2Nlc3NGaWxlc0pvYi5jYW5jZWwoKTsKLQkJfQotCQkvLyBhdHRlbXB0IHRvIG1ha2Ugc3VyZSB0aGlzIGluZGV4aW5nIGpvYiBpcyBsaXR0ZXJhbGx5Ci0JCS8vIGRvbmUgYmVmb3JlIGNvbnRpbnVpbmcsIHNpbmNlIHdlIGFyZSBzaHV0dGluZyBkb3duCi0JCXdhaXRUaWxsTm90UnVubmluZyhtYXh3YWl0LCBwcm9jZXNzRmlsZXNKb2IpOwotCi0JCWlmIChpbmRleGluZ0pvYiAhPSBudWxsKSB7Ci0JCQlpbmRleGluZ0pvYi5jYW5jZWwoKTsKLQkJfQotCQl3YWl0VGlsbE5vdFJ1bm5pbmcobWF4d2FpdCwgcHJvY2Vzc0ZpbGVzSm9iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2FpdFRpbGxOb3RSdW5uaW5nKGludCBtYXhTZWNvbmRzLCBKb2Igam9iKSB7Ci0JCWludCBwYXVzZVRpbWUgPSAxMDsKLQkJaW50IG1heHRyaWVzID0gbWF4U2Vjb25kcyAvIHBhdXNlVGltZTsKLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUgKGNvdW50KysgPCBtYXh0cmllcyAmJiBqb2IuZ2V0U3RhdGUoKSA9PSBKb2IuUlVOTklORykgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAocGF1c2VUaW1lKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvdW50OiAiICsgY291bnQgKyAiIG1heDogIiArCi0JCQkJLy8gbWF4dHJpZXMpOwotCQkJfQotCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBJbmRleEpvYkNvb3JkaW5hdG9yIGV4dGVuZHMgSm9iQ2hhbmdlQWRhcHRlciB7Ci0JCQotCQlwdWJsaWMgdm9pZCBhYm91dFRvUnVuKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSm9iIGpvYlRvQ29vcmRpbmF0ZSA9IGV2ZW50LmdldEpvYigpOwotCQkJaWYgKGlzSm9iVG9Bdm9pZChqb2JUb0Nvb3JkaW5hdGUpKSB7Ci0JCQkJLy8gam9iIHdpbGwgYmUgcmVzY2hlZHVsZWQgd2hlbiB0aGUgam9iIHdlCi0JCQkJLy8gYXJlIGF2b2lkaW5nIChlZy4gYnVpbGQpIGlzIGRvbmUKLQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5jYW5jZWwoKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY2FuY2VsOiIgKyBqb2JUb0Nvb3JkaW5hdGUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJCUpvYiBqb2JUb0Nvb3JkaW5hdGUgPSBldmVudC5nZXRKb2IoKTsKLQkJCWlmIChpc0pvYlRvQXZvaWQoam9iVG9Db29yZGluYXRlKSkgewotCQkJCWlmIChnZXRQcm9jZXNzRmlsZXNKb2IoKS5nZXRGaWxlcygpLmxlbmd0aCA+IDApIHsKLQkJCQkJZ2V0UHJvY2Vzc0ZpbGVzSm9iKCkuc2NoZWR1bGUoNTAwKTsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNjaGVkdWxlOiIgKyBqb2JUb0Nvb3JkaW5hdGUuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJCQotCi0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNKb2JUb0F2b2lkKEpvYiBqb2JUb0Nvb3JkaW5hdGUpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQpIHx8IGpvYlRvQ29vcmRpbmF0ZS5iZWxvbmdzVG8oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpIHx8IGpvYlRvQ29vcmRpbmF0ZS5iZWxvbmdzVG8oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX1JFRlJFU0gpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKU1BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJCWlmIChpc0luaXRpYWxpemluZygpKQotCQkJCXJldHVybjsKLQotCQkJLy8gaWdub3JlIHJlc291cmNlIGNoYW5nZXMgaWYgYWxyZWFkeSByZWJ1aWxkaW5nCi0JCQlpZiAoZ2V0SW5kZXhTdGF0ZSgpID09IFNfUkVCVUlMRElORykKLQkJCQlyZXR1cm47Ci0JCQkvLyBwcmV2aW91c2x5IGNhbmNlbGVkLCBuZWVkcyBlbnRpcmUgaW5kZXggcmVidWlsZAotCQkJaWYgKGdldEluZGV4U3RhdGUoKSA9PSBTX0NBTkNFTEVEKSB7Ci0JCQkJLy8gcmVidWlsZEluZGV4KCk7Ci0JCQkJLy8ganVzdCByZXN1bWUgaW5kZXhpbmcKLQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzY2hlZHVsZTogcmVzb3VyY2UgY2hhbmdlZCwgcHJldmlvdXNseSBjYW5jZWxlZCIpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCQkvLyBvbmx5IGNhcmUgYWJvdXQgYWRkcyBvciBjaGFuZ2VzIHJpZ2h0IG5vdy4uLgotCQkJCWludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotCQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCQlib29sZWFuIGNoYW5nZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0JCQkJaWYgKGFkZGVkIHx8IGNoYW5nZWQpIHsKLQotCQkJCQkvLyBvbmx5IGFuYWx5emUgdGhlIGZ1bGwgKHN0YXJ0aW5nIGF0IHJvb3QpIGRlbHRhCi0JCQkJCS8vIGhpZXJhcmNoeQotCQkJCQlpZiAoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSlNQUmVzb3VyY2VWaXNpdG9yIHYgPSBnZXRWaXNpdG9yKCk7Ci0JCQkJCQkJLy8gY2xlYXIgZnJvbSBsYXN0IHJ1bgotCQkJCQkJCXYucmVzZXQoKTsKLQkJCQkJCQkvLyBjb3VudCBmaWxlcywgcG9zc2libHkgZG8gdGhpcyBpbiBhIGpvYiB0b28uLi4KLQkJCQkJCQkvLyBkb24ndCBpbmNsdWRlIFBIQU5UT00gcmVzb3VyY2VzCi0JCQkJCQkJZGVsdGEuYWNjZXB0KHYsIGZhbHNlKTsKLQotCQkJCQkJCS8vIHByb2Nlc3MgZmlsZXMgZnJvbSB0aGlzIGRlbHRhCi0JCQkJCQkJSUZpbGVbXSBmaWxlcyA9IHYuZ2V0RmlsZXMoKTsKLQkJCQkJCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCQkvKgotCQkJCQkJCQkgKiBKb2IgY2hhbmdlIGxpc3RlbmVyIHNob3VsZCBzZXQgYmFjayB0bwotCQkJCQkJCQkgKiBzdGFibGUgd2hlbiBmaW5pc2hlZAotCQkJCQkJCQkgKi8KLQkJCQkJCQkJc2V0VXBkYXRpbmdTdGF0ZSgpOwotCQkJCQkJCQkvLyBwcm9jZXNzRmlsZXMoZmlsZXMpOwotCQkJCQkJCQlpbmRleEZpbGVzKGZpbGVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gbmVlZCB0byBzZXQgc3RhdGUgaGVyZSBzb21laG93LCBhbmQgcmVpbmRleAotCQkJCQkJCS8vIG90aGVyd2lzZSBpbmRleCB3aWxsIGJlIHVucmVsaWFibGUKLQkJCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlJbmRleFdvcmtzcGFjZUpvYiBnZXRJbmRleGluZ0pvYigpIHsKLQkJcmV0dXJuIGluZGV4aW5nSm9iOwotCX0KLQotCVByb2Nlc3NGaWxlc0pvYiBnZXRQcm9jZXNzRmlsZXNKb2IoKSB7Ci0JCXJldHVybiBwcm9jZXNzRmlsZXNKb2I7Ci0JfQotCi0JYm9vbGVhbiBpc0luaXRpYWxpemluZygpIHsKLQkJcmV0dXJuIGluaXRpYWxpemluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmZGRhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFBhdGhJbmRleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLQotLyoqCi0gKiBwYV9UT0RPIFN0aWxsIG5lZWQgdG8gdGFrZSBpbnRvIGNvbnNpZGVyYXRpb246Ci0gKiAJLSBmb2N1cyBpbiB3b3Jrc3BhY2UKLSAqICAtIHNlYXJjaCBwYXR0ZXJuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYXRoSW5kZXhlciB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvLyB2aXNpdG9yIHRoYXQgcmV0cmlldmVzIGpzcCBwcm9qZWN0IHBhdGhzIGZvciBhbGwganNwIGZpbGVzIGluIHRoZSB3b3Jrc3BhY2UKLQljbGFzcyBKU1BGaWxlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JCS8vIGhhc2ggbWFwIGZvcmNlcyBvbmx5IG9uZSBvZiBlYWNoIGZpbGUKLQkJcHJpdmF0ZSBIYXNoTWFwIGZQYXRocyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUlKYXZhU2VhcmNoU2NvcGUgZlNjb3BlID0gbnVsbDsKLQkJU2VhcmNoUGF0dGVybiBmUGF0dGVybiA9IG51bGw7Ci0KLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewotCQkJdGhpcy5mUGF0dGVybiA9IHBhdHRlcm47Ci0JCQl0aGlzLmZTY29wZSA9IHNjb3BlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQkJaWYoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNTUzCi0JCQkJLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24KLQkJCQkvLyBjaGVjayBuYW1lIGJlZm9yZSBhY3R1YWxseSBnZXR0aW5nIHRoZSBmaWxlIChsZXNzIHdvcmspCi0JCQkJaWYoY29udGVudFR5cGVKU1AuaXNBc3NvY2lhdGVkV2l0aChwcm94eS5nZXROYW1lKCkpKSB7Ci0JCQkJCQotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKXByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCVN0cmluZyBjdElkID0gbnVsbDsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQljdElkID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZ2V0SWQoKTsKLQkJCQkJfQotCQkJCQlpZiAoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUC5lcXVhbHMoY3RJZCkpIHsKLQkJCQkJCWlmICh0aGlzLmZTY29wZS5lbmNsb3Nlcyhwcm94eS5yZXF1ZXN0RnVsbFBhdGgoKS50b1N0cmluZygpKSkgewotCQotCQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgc2VsZWN0ZWQgaW5kZXggcGF0aDoiICsgZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQkJZlBhdGhzLnB1dChmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCksIEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5jb21wdXRlSW5kZXhMb2NhdGlvbihmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBkb24ndCBzZWFyY2ggZGVlcGVyIGZvciBmaWxlcwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIElQYXRoW10gZ2V0UGF0aHMoKSB7Ci0JCQlyZXR1cm4gKElQYXRoW10pIGZQYXRocy52YWx1ZXMoKS50b0FycmF5KG5ldyBJUGF0aFtmUGF0aHMuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBnZXRWaXNpYmxlSnNwUGF0aHMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB7Ci0KLQkJSlNQRmlsZVZpc2l0b3IganNwRmlsZVZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IocGF0dGVybiwgc2NvcGUpOwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5hY2NlcHQoanNwRmlsZVZpc2l0b3IsIDApOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGpzcEZpbGVWaXNpdG9yLmdldFBhdGhzKCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MzMyZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotCi0vKioKLSAqIENyZWF0ZWQgd2l0aCBhIC5qc3AgZmlsZSwgYnV0IHNob3VsZCBhcHBlYXIgdG8gYmUgYSAuamF2YSBmaWxlIGZvciBpbmRleGluZwotICogYW5kIHNlYXJjaGluZyBwdXJwb3Nlcy4gVGhlcmUgYXJlIHB1cnBvc2VseSBmZXcgZmllbGRzIGluIHRoaXMgY2xhc3MsIGFuZAotICogdGhvc2UgZmllbGRzIGFyZSBsaWdodHdlaWdodCBzaW5jZSBpdCdzIHBvc3NpYmxlIGZvciBtYW55IEpTUCBzZWFyY2gKLSAqIGRvY3VtZW50cyB0byBleGlzdCBpbiBtZW1vcnkgYXQgb25lIHRpbWUgKGVnLiBhZnRlciBpbXBvcnRpbmcgYSBwcm9qZWN0Ci0gKiB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIEpTUCBmaWxlcykKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaERvY3VtZW50IHsKLQotCXByaXZhdGUgU3RyaW5nIFVOS05PV05fUEFUSCA9ICIqKnBhdGggdW5rbm93bioqIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZKU1BQYXRoU3RyaW5nID0gVU5LTk9XTl9QQVRIOwotCXByaXZhdGUgU3RyaW5nIGZDVVBhdGggPSBVTktOT1dOX1BBVEg7Ci0JcHJpdmF0ZSBTZWFyY2hQYXJ0aWNpcGFudCBmUGFydGljaXBhbnQgPSBudWxsOwotCXByaXZhdGUgbG9uZyBmTGFzdE1vZGlmaWVkU3RhbXA7Ci0JcHJpdmF0ZSBjaGFyW10gZkNhY2hlZENoYXJDb250ZW50czsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBwYXJ0aWNpcGFudAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBKU1BTZWFyY2hEb2N1bWVudChTdHJpbmcgZmlsZVBhdGgsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0KLQkJdGhpcy5mSlNQUGF0aFN0cmluZyA9IGZpbGVQYXRoOwotCQl0aGlzLmZQYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50OwotCX0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudCBnZXRQYXJ0aWNpcGFudCgpIHsKLQkJcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldENoYXJDb250ZW50cygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCQotCQlpZihmQ2FjaGVkQ2hhckNvbnRlbnRzID09IG51bGwgfHwgaXNEaXJ0eSgpKSB7Ci0JCSAgICBKU1BUcmFuc2xhdGlvbiB0cmFucyA9IGdldEpTUFRyYW5zbGF0aW9uKCk7ICAgIAotCQkgICAgZkNhY2hlZENoYXJDb250ZW50cyA9IHRyYW5zICE9IG51bGwgPyB0cmFucy5nZXRKYXZhVGV4dCgpLnRvQ2hhckFycmF5KCkgOiBuZXcgY2hhclswXTsKLQkJICAgIGZDVVBhdGggPSB0cmFucy5nZXRKYXZhUGF0aCgpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGVkQ2hhckNvbnRlbnRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGdldENoYXJDb250ZW50cygpKTsKLQl9Ci0KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdCdzIG5vdCByZWNvbW1lbmRlZCBmb3IgY2xpZW50cyB0byBob2xkIG9uIHRvIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKiBzaW5jZSBpdCdzIGtpbmQgb2YgbGFyZ2UuIElmIHBvc3NpYmxlLCBob2xkIG9uIHRvIHRoZQotCSAqIEpTUFNlYXJjaERvY3VtZW50LCB3aGljaCBpcyBtb3JlIG9mIGEgbGlnaHR3ZWlnaHQgcHJveHkuCi0JICogCi0JICogQHJldHVybiB0aGUgSlNQVHJhbnNsYXRpb24gZm9yIHRoZSBqc3AgZmlsZSwgb3IgbnVsbCBpZiBpdCdzIGFuCi0JICogICAgICAgICB1bnN1cHBvcnRlZCBmaWxlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBnZXRKU1BUcmFuc2xhdGlvbigpIHsKLQkJSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCQlJRmlsZSBqc3BGaWxlID0gZ2V0RmlsZSgpOwotCQlpZiAoIUpTUFNlYXJjaFN1cHBvcnQuaXNKc3AoanNwRmlsZSkpCi0JCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgZXhpc3RpbmcgbW9kZWwgZm9yIHJlYWQsIHRoZW4gZ2V0IGRvY3VtZW50IGZyb20gaXQKLQkJCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlqc3BGaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGpzcEZpbGUpOwotCQkJfQotCQkJLy8gaGFuZGxlIHVuc3VwcG9ydGVkCi0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKW1vZGVsOwotCQkJCXNldHVwQWRhcHRlckZhY3RvcnkoeG1sTW9kZWwpOwotCQkJCUlET01Eb2N1bWVudCBkb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgZG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQl0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsIGUpIHsKLQkJCS8vIG5vIG5lZWQgdG8gbG9nIHRoaXMuIEp1c3QgY29uc2lkZXIgaXQgYW4gaW52YWxpZCBmaWxlIGZvciBvdXIKLQkJCS8vIHB1cnBvc2VzLgotCQkJLy8gTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiB0cmFuc2xhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgdGhlIGZhY3RvcnkgZm9yIEpTUFRyYW5zbGF0aW9uQWRhcHRlciBoZXJlCi0JICogCi0JICogQHBhcmFtIHNtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwQWRhcHRlckZhY3RvcnkoSVN0cnVjdHVyZWRNb2RlbCBzbSkgewotCQlNb2RlbEhhbmRsZXJGb3JKU1AuZW5zdXJlVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeShzbSk7Ci0JfQotCi0JLyoqCi0JICogdGhlIHBhdGggdG8gdGhlIEphdmEgY29tcGlsYXRpb24gdW5pdAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldFBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkgICAgLy8gY2FjaGluZyB0aGUgcGF0aCBzaW5jZSBpdCdzIGV4cGVuc2l2ZSB0byBnZXQgdHJhbnNsYXRpb24KLQkJLy8gaW1wb3J0YW50IHRoYXQgaXNEaXJ0eSgpIGNoZWNrIGlzIHNlY29uZCB0byBjYWNoZSBtb2RpZmljYXRpb24gc3RhbXAKLQkgICAgaWYodGhpcy5mQ1VQYXRoID09IG51bGwgfHwgaXNEaXJ0eSgpIHx8IHRoaXMuZkNVUGF0aCA9PSBVTktOT1dOX1BBVEgpIHsKLQkgICAgICAgIEpTUFRyYW5zbGF0aW9uIHRyYW5zID0gZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkgICAgICAgIGlmKHRyYW5zICE9IG51bGwpIHsKLQkgICAgICAgICAgICB0aGlzLmZDVVBhdGggPSB0cmFucy5nZXRKYXZhUGF0aCgpOwotCSAgICAgICAgICAgIC8vIHNhdmUgc2luY2UgaXQncyBleHBlbnNpdmUgdG8gY2FsY3VsYXRlIGFnYWluIGxhdGVyCi0JICAgICAgICAgICAgZkNhY2hlZENoYXJDb250ZW50cyA9IHRyYW5zLmdldEphdmFUZXh0KCkudG9DaGFyQXJyYXkoKTsKLQkgICAgICAgIH0KLQkgICAgfQotCQlyZXR1cm4gZkNVUGF0aCAhPSBudWxsID8gZkNVUGF0aCA6IFVOS05PV05fUEFUSDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpzcE9mZnNldChpbnQgamF2YU9mZnNldCkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BUcmFuc2xhdGlvbgotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBvZmZzZXRJblJhbmdlID0gMDsKLQkJUG9zaXRpb24ganNwUG9zLCBqYXZhUG9zID0gbnVsbDsKLQkJSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotCQlpZiAodHJhbnMgIT0gbnVsbCkgewotCQkJSGFzaE1hcCBqYXZhMmpzcE1hcCA9IHRyYW5zLmdldEphdmEySnNwTWFwKCk7Ci0KLQkJCS8vIGl0ZXJhdGUgYWxsIG1hcHBlZCBqYXZhIHJhbmdlcwotCQkJSXRlcmF0b3IgaXQgPSBqYXZhMmpzcE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWphdmFQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCQkvLyBuZWVkIHRvIGNvdW50IHRoZSBsYXN0IHBvc2l0aW9uIGFzIGluY2x1ZGVkCi0JCQkJaWYgKCFqYXZhUG9zLmluY2x1ZGVzKGphdmFPZmZzZXQpICYmICEoamF2YVBvcy5vZmZzZXQgKyBqYXZhUG9zLmxlbmd0aCA9PSBqYXZhT2Zmc2V0KSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlvZmZzZXRJblJhbmdlID0gamF2YU9mZnNldCAtIGphdmFQb3Mub2Zmc2V0OwotCQkJCWpzcFBvcyA9IChQb3NpdGlvbikgamF2YTJqc3BNYXAuZ2V0KGphdmFQb3MpOwotCi0JCQkJaWYgKGpzcFBvcyAhPSBudWxsKQotCQkJCQlyZXN1bHQgPSBqc3BQb3Mub2Zmc2V0ICsgb2Zmc2V0SW5SYW5nZTsKLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJqc3BQb3NpdGlvbiB3YXMgbnVsbCEiICsgamF2YU9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIGpzcFBhdGggPSBuZXcgUGF0aCh0aGlzLmZKU1BQYXRoU3RyaW5nKTsKLQkJSUZpbGUganNwRmlsZSA9IHJvb3QuZ2V0RmlsZShqc3BQYXRoKTsKLQkJaWYgKCFqc3BGaWxlLmV4aXN0cygpKSB7Ci0JCQkvLyBwb3NzaWJseSBvdXRzaWRlIHdvcmtzcGFjZQotCQkJanNwRmlsZSA9IHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKGpzcFBhdGgpOwotCQl9Ci0JCXJldHVybiBqc3BGaWxlOwotCX0KLQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCUlGaWxlIGYgPSBnZXRGaWxlKCk7Ci0JCWlmKGYgIT0gbnVsbCkgewotCQkJbG9uZyBjdXJyZW50U3RhbXAgPSBmLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQlpZihjdXJyZW50U3RhbXAgIT0gZkxhc3RNb2RpZmllZFN0YW1wKQotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCWZMYXN0TW9kaWZpZWRTdGFtcCA9IGN1cnJlbnRTdGFtcDsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gbm93IHNpbmNlIEpTUFRyYW5zbGF0aW9uIGlzIGNyZWF0ZWQgb24gdGhlIGZseQotCX0KLQotCS8qKgotCSAqIGZvciBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIltKU1BTZWFyY2hEb2N1bWVudDoiICsgdGhpcy5mSlNQUGF0aFN0cmluZyArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRFbmNvZGluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRCeXRlQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4NGIyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotCi0vKioKLSAqIEludGVncmF0aW9uIG9mIEpTUCB3LyBqYXZhIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaFBhcnRpY2lwYW50IGV4dGVuZHMgU2VhcmNoUGFydGljaXBhbnQgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBjYWxjdWxhdGVWYWx1ZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYWxjdWxhdGVWYWx1ZSgpIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIGRlYnVnID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlYnVnOwotCX0KLQotCS8qKgotCSAqIEltcG9ydGFudCB0byBuZXZlciByZXR1cm4gbnVsbCBoZXJlIG9yIGVsc2UgSmF2YSBzZWFyY2ggcGFydGljaXBhdGlvbgotCSAqIHdpbGwgYnJlYWsuCi0JICovCi0JcHVibGljIFNlYXJjaERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgpIHsKLQkJU2VhcmNoRG9jdW1lbnQgc0RvYyA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRTZWFyY2hEb2N1bWVudChkb2N1bWVudFBhdGgpOwotCi0JCWlmIChzRG9jID09IG51bGwpIHsKLQkJCS8vIHJldHVybiBhIGR1bW15IGRvYyBoZXJlIHNvIHNlYXJjaCBwYXJ0aWNpcGF0aW9uIGRvZXNuJ3QgYnJlYWsKLQkJCXJldHVybiBuZXcgTnVsbFNlYXJjaERvY3VtZW50KGRvY3VtZW50UGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHNEb2M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJKU1AiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElQYXRoW10gc2VsZWN0SW5kZXhlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJSlNQUGF0aEluZGV4ZXIgaW5kZXhlciA9IG5ldyBKU1BQYXRoSW5kZXhlcigpOwotCQlyZXR1cm4gaW5kZXhlci5nZXRWaXNpYmxlSnNwUGF0aHMocGF0dGVybiwgc2NvcGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluZGV4RG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsIElQYXRoIGluZGV4UGF0aCkgewotCQlpZiAoIShkb2N1bWVudCBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSkKLQkJCXJldHVybjsKLQotCQkvLyB1c2UgSmF2YSBzZWFyY2ggaW5kZXhpbmcKLQkJU2VhcmNoRW5naW5lLmdldERlZmF1bHRTZWFyY2hQYXJ0aWNpcGFudCgpLmluZGV4RG9jdW1lbnQoZG9jdW1lbnQsIGluZGV4UGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFtdIGluZGV4TWF0Y2hlcywgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCi0JCS8vIGZpbHRlciBvdXQgbnVsbCBtYXRjaGVzCi0JCUxpc3QgZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVNlYXJjaERvY3VtZW50IG1hdGNoID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleE1hdGNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBvc3NpYmxlIG1hdGNoaW5nIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlOiAiICsgaW5kZXhNYXRjaGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJbWF0Y2ggPSBpbmRleE1hdGNoZXNbaV07Ci0JCQlpZiAobWF0Y2ggIT0gbnVsbCkgewotCQkJCS8vIHNvbWUgbWF0Y2hlcyBtYXkgYmUgbnVsbCwgb3IgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBkYXRlLAotCQkJCS8vIHRoZSBmaWxlIG1heSBub3QgZXZlbiBleGlzdAotCQkJCWlmIChtYXRjaCBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlICYmICgoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUpIG1hdGNoKS5nZXRGaWxlKCkuZXhpc3RzKCkpCi0JCQkJCWZpbHRlcmVkLmFkZChtYXRjaCk7Ci0JCQl9Ci0JCX0KLQotCQlpbmRleE1hdGNoZXMgPSAoU2VhcmNoRG9jdW1lbnRbXSkgZmlsdGVyZWQudG9BcnJheShuZXcgU2VhcmNoRG9jdW1lbnRbZmlsdGVyZWQuc2l6ZSgpXSk7Ci0JCVNlYXJjaEVuZ2luZS5nZXREZWZhdWx0U2VhcmNoUGFydGljaXBhbnQoKS5sb2NhdGVNYXRjaGVzKGluZGV4TWF0Y2hlcywgcGF0dGVybiwgc2NvcGUsIHJlcXVlc3RvciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQjZ2V0RG9jdW1lbnQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIFNlYXJjaERvY3VtZW50IGdldERvY3VtZW50KElGaWxlIGZpbGUpIHsKLQkJLy8gbmV2ZXIgZ2V0cyBjYWxsZWQ/Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU2NvcGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1Y2Q0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci0KLS8qKgotICogVXNlZCB0byBjb25zdHJhaW4gSlNQL2phdmEgc2VhcmNoIHRvIGNlcnRhaW4gcGF0aHMgYW5kIGVsZW1lbnRzLgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaFNjb3BlIGltcGxlbWVudHMgSUphdmFTZWFyY2hTY29wZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkVuY2xvc2VzQWxsID0gZmFsc2U7Ci0JcHJpdmF0ZSBMaXN0IGZSZXNvdXJjZVBhdGhzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkphdmFFbGVtZW50cyA9IG51bGw7Ci0KLQlwdWJsaWMgSlNQU2VhcmNoU2NvcGUoKSB7Ci0JCS8vIGVtcHR5IGNvbnN0cnVjdG9yIGp1c3QgcmV0dXJucyB0cnVlIGZvciBldmVyeXRoaW5nCi0JCS8vIGV2ZXJ5dGhpbmcgaXMgaW4gc2NvcGUKLQkJdGhpcy5mRW5jbG9zZXNBbGwgPSB0cnVlOwotCQlpbml0KCk7Ci0JfQotCi0JcHVibGljIEpTUFNlYXJjaFNjb3BlKFN0cmluZ1tdIHJlc291cmNlU3RyaW5nUGF0aCkgewotCQlpbml0KCk7Ci0JCWZSZXNvdXJjZVBhdGhzLmFkZEFsbChBcnJheXMuYXNMaXN0KHJlc291cmNlU3RyaW5nUGF0aCkpOwotCX0KLQotCXB1YmxpYyBKU1BTZWFyY2hTY29wZShJSmF2YUVsZW1lbnRbXSBqYXZhRWxlbWVudCkgewotCQlpbml0KCk7Ci0JCWZKYXZhRWxlbWVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoamF2YUVsZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJdGhpcy5mUmVzb3VyY2VQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGhpcy5mSmF2YUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKFN0cmluZyByZXNvdXJjZVBhdGhTdHJpbmcpIHsKLQotCQlpZiAodGhpcy5mRW5jbG9zZXNBbGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoZW5jbG9zZXNQYXRoKHJlc291cmNlUGF0aFN0cmluZykpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQotCQkvLyBwYV9UT0QgaW1wbGVtZW50Ci0JCWlmICh0aGlzLmZFbmNsb3Nlc0FsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKElSZXNvdXJjZVByb3h5IGVsZW1lbnQpIHsKLQotCQlpZiAodGhpcy5mRW5jbG9zZXNBbGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoZW5jbG9zZXNQYXRoKGVsZW1lbnQucmVxdWVzdEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJdGhpcy5mUmVzb3VyY2VQYXRocy5hZGQocGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudChJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmZKYXZhRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBlbmNsb3Nlc1BhdGgoU3RyaW5nIHBvc3NpYmxlKSB7Ci0KLQkJU3RyaW5nW10gcGF0aHMgPSAoU3RyaW5nW10pIGZSZXNvdXJjZVBhdGhzLnRvQXJyYXkobmV3IFN0cmluZ1tmUmVzb3VyY2VQYXRocy5zaXplKCldKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBvc3NpYmxlLmVxdWFscyhwYXRoc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLQkJcmV0dXJuICJKU1BTZWFyY2hTY29wZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBlbmNsb3NpbmdQcm9qZWN0c0FuZEphcnMoKSB7Ci0JCXJldHVybiAoSVBhdGhbXSkgZlJlc291cmNlUGF0aHMudG9BcnJheShuZXcgSVBhdGhbZlJlc291cmNlUGF0aHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXNCaW5hcmllcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzQ2xhc3NwYXRocygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVzQmluYXJpZXMoYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc0NsYXNzcGF0aHMoYm9vbGVhbiBpbmNsdWRlc0NsYXNzcGF0aHMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU3VwcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ODk4MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQMlNlcnZsZXROYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLQotLyoqCi0gKiBDZW50cmFsIGFjY2VzcyB0byBqYXZhIGluZGV4aW5nIGFuZCBzZWFyY2guIEFsbCBjb250YWN0IGJldHdlZW4gSkRUIGluZGV4aW5nCi0gKiBhbmQgU2VhcmNoaW5nIHNob3VsZCBiZSBkb25lIHRocm91Z2ggaGVyZS4KLSAqIAotICogQ2xpZW50cyBzaG91bGQgYWNjZXNzIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgdmlhIHRoZSBzaW5nbGUgaW5zdGFuY2UgdmlhCi0gKiA8Y29kZT5nZXRJbnN0YW5jZSgpPC9jb2RlPi4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaFN1cHBvcnQgewotCi0gICAgLy8gZm9yIGRlYnVnZ2luZwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEpTUFNlYXJjaFN1cHBvcnQgc2luZ2xldG9uID0gbnVsbDsKLQotICAgIHByaXZhdGUgSlNQU2VhcmNoUGFydGljaXBhbnQgZlBhcnRpY2lwYW50ID0gbnVsbDsKLQotICAgIHByaXZhdGUgSVBhdGggZkpzcFBsdWdpbkxvY2F0aW9uID0gbnVsbDsKLQotICAgIC8vIHBhX1RPRE8gbWF5IGJlIHNsb3cgKGVzcCBmb3IgaW5kZXhpbmcgZW50aXJlIHdvcmtzcGFjZSkKLSAgICBwcml2YXRlIGZpbmFsIENSQzMyIGZDaGVja3N1bUNhbGN1bGF0b3IgPSBuZXcgQ1JDMzIoKTsKLQotICAgIC8qKiBtYWluIGNhbmNlbCBtb250aW9yIGZvciBhbGwgc2VhcmNoIHN1cHBvcnQgKi8KLSAgICBwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgZk1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgcHJpdmF0ZSBKU1BTZWFyY2hTdXBwb3J0KCkgewotICAgICAgICAvLyBmb3JjZSB1c2Ugb2Ygc2luZ2xlIGluc3RhbmNlCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBvcGVyYXRpb24gZW5zdXJlcyB0aGF0IHRoZSBsaXZlIHJlc291cmNlJ3Mgc2VhcmNoIG1hcmtlcnMgc2hvdyB1cCBpbgotICAgICAqIHRoZSBvcGVuIGVkaXRvci4gSXQgYWxzbyBhbGxvd3MgdGhlIGFiaWxpdHkgdG8gcGFzcyBpbiBhIFByb2dyZXNzTW9uaXRvcgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU2VhcmNoSm9iIGV4dGVuZHMgSm9iIGltcGxlbWVudHMgSUphdmFTZWFyY2hDb25zdGFudHMgewotCi0gICAgICAgIFN0cmluZyBmU2VhcmNoVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSUphdmFTZWFyY2hTY29wZSBmU2NvcGUgPSBudWxsOwotCi0gICAgICAgIGludCBmU2VhcmNoRm9yID0gRklFTEQ7Ci0KLSAgICAgICAgaW50IGZMaW1pdFRvID0gQUxMX09DQ1VSUkVOQ0VTOwotCi0gICAgICAgIGludCBmTWF0Y2hNb2RlID0gU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0g7Ci0KLSAgICAgICAgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlID0gZmFsc2U7Ci0KLSAgICAgICAgU2VhcmNoUmVxdWVzdG9yIGZSZXF1ZXN0b3IgPSBudWxsOwotCi0gICAgICAgIElKYXZhRWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3Igdy8gamF2YSBlbGVtZW50Ci0gICAgICAgIHB1YmxpYyBTZWFyY2hKb2IoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUF9TZWFyY2ggKyBlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3Igdy8gc2VhcmNoIHRleHQKLSAgICAgICAgcHVibGljIFNlYXJjaEpvYihTdHJpbmcgc2VhcmNoVGV4dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgaW50IHNlYXJjaEZvciwgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgICAgIHN1cGVyKEpTUENvcmVNZXNzYWdlcy5KU1BfU2VhcmNoICsgc2VhcmNoVGV4dCk7Ci0gICAgICAgICAgICB0aGlzLmZTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDsKLSAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0gICAgICAgICAgICB0aGlzLmZTZWFyY2hGb3IgPSBzZWFyY2hGb3I7Ci0gICAgICAgICAgICB0aGlzLmZMaW1pdFRvID0gbGltaXRUbzsKLSAgICAgICAgICAgIHRoaXMuZk1hdGNoTW9kZSA9IG1hdGNoTW9kZTsKLSAgICAgICAgICAgIHRoaXMuZklzQ2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTsKLSAgICAgICAgICAgIHRoaXMuZlJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGpvYk1vbml0b3IpIHsKLQotICAgICAgICAgICAgaWYgKGpvYk1vbml0b3IgIT0gbnVsbCAmJiBqb2JNb25pdG9yLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgICAgICAgICBpZiAoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0KLSAgICAgICAgICAgIFNlYXJjaFBhdHRlcm4gamF2YVNlYXJjaFBhdHRlcm4gPSBudWxsOwotICAgICAgICAgICAgLy8gaWYgYW4gZWxlbWVudCBpcyBhdmFpbGFibGUsIHVzZSB0aGF0IHRvIGNyZWF0ZSBzZWFyY2ggcGF0dGVybgotICAgICAgICAgICAgLy8gKGVnLiBMb2NhbFZhcmlhYmxlKQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgdGV4dCBhbmQgb3RoZXIgcGFyYW10ZXJzCi0gICAgICAgICAgICBpZiAodGhpcy5mRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGphdmFTZWFyY2hQYXR0ZXJuID0gU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKHRoaXMuZkVsZW1lbnQsIHRoaXMuZkxpbWl0VG8pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGphdmFTZWFyY2hQYXR0ZXJuID0gU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKHRoaXMuZlNlYXJjaFRleHQsIHRoaXMuZlNlYXJjaEZvciwgdGhpcy5mTGltaXRUbywgdGhpcy5mTWF0Y2hNb2RlKTsKLQotICAgICAgICAgICAgaWYgKGphdmFTZWFyY2hQYXR0ZXJuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKU1BTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IHsgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSB9OwotICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZSBlbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGpvYk1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvYk1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGVuZ2luZS5zZWFyY2goamF2YVNlYXJjaFBhdHRlcm4sIHBhcnRpY2lwYW50cywgdGhpcy5mU2NvcGUsIHRoaXMuZlJlcXVlc3Rvciwgam9iTW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG5vbi1Db3JlRXhjZXB0aW9ucyB3aWxsIHBlcm1hbmVudGx5IHN0YWxsIHRoZSBXb3JrZXIgdGhyZWFkCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGpvYk1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvYk1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZW5kIFNlYXJjaEpvYgotICAgIC8qKgotICAgICAqIFJ1bm5hYmxlIGZvcmNlcyBjYWxsZXIgdG8gd2FpdCB1bnRpbCBmaW5pc2hlZCAoYXMgb3Bwb3NlZCB0byB1c2luZyBhIEpvYikKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFNlYXJjaFJ1bm5hYmxlIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlLCBJSmF2YVNlYXJjaENvbnN0YW50cyB7Ci0KLSAgICAgICAgU3RyaW5nIGZTZWFyY2hUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJSmF2YVNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGZTZWFyY2hGb3IgPSBGSUVMRDsKLQotICAgICAgICBpbnQgZkxpbWl0VG8gPSBBTExfT0NDVVJSRU5DRVM7Ci0KLSAgICAgICAgaW50IGZNYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDsKLQotICAgICAgICBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotICAgICAgICBTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvciA9IG51bGw7Ci0KLSAgICAgICAgSUphdmFFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBqYXZhIGVsZW1lbnQKLSAgICAgICAgcHVibGljIFNlYXJjaFJ1bm5hYmxlKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgICAgIHRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIHNlYXJjaCB0ZXh0Ci0gICAgICAgIHB1YmxpYyBTZWFyY2hSdW5uYWJsZShTdHJpbmcgc2VhcmNoVGV4dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgaW50IHNlYXJjaEZvciwgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaFRleHQgPSBzZWFyY2hUZXh0OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaEZvciA9IHNlYXJjaEZvcjsKLSAgICAgICAgICAgIHRoaXMuZkxpbWl0VG8gPSBsaW1pdFRvOwotICAgICAgICAgICAgdGhpcy5mTWF0Y2hNb2RlID0gbWF0Y2hNb2RlOwotICAgICAgICAgICAgdGhpcy5mSXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmIChKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgU2VhcmNoUGF0dGVybiBqYXZhU2VhcmNoUGF0dGVybiA9IG51bGw7Ci0gICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgICAgICAvLyAoZWcuIExvY2FsVmFyaWFibGUpCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSB0ZXh0IGFuZCBvdGhlciBwYXJhbXRlcnMKLSAgICAgICAgICAgIGlmICh0aGlzLmZFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgZkxpbWl0VG8pOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGphdmFTZWFyY2hQYXR0ZXJuID0gU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKGZTZWFyY2hUZXh0LCBmU2VhcmNoRm9yLCBmTGltaXRUbywgZk1hdGNoTW9kZSk7Ci0KLSAgICAgICAgICAgIGlmIChqYXZhU2VhcmNoUGF0dGVybiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSlNQU2VhcmNoUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSB7IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgfTsKLSAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUgZW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzaygiIiwgMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlYXJjaChqYXZhU2VhcmNoUGF0dGVybiwgcGFydGljaXBhbnRzLCBmU2NvcGUsIGZSZXF1ZXN0b3IsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICAvL3Rocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG5vbi1Db3JlRXhjZXB0aW9ucyB3aWxsIHBlcm1hbmVudGx5IHN0YWxsIHRoZSBXb3JrZXIgdGhyZWFkCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGVuZCBTZWFyY2hSdW5uYWJsZQotCi0gICAgLyoqCi0gICAgICogQ2xpZW50cyBzaG91bGQgYWNjZXNzIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgdmlhIHRoZSBzaW5nbGUgaW5zdGFuY2UKLSAgICAgKiB2aWEgZ2V0SW5zdGFuY2UoKQotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKU1BTZWFyY2hTdXBwb3J0IGdldEluc3RhbmNlKCkgewotCi0gICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCkKLSAgICAgICAgICAgIHNpbmdsZXRvbiA9IG5ldyBKU1BTZWFyY2hTdXBwb3J0KCk7Ci0gICAgICAgIHJldHVybiBzaW5nbGV0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gY2hlY2sgaWYgYSBmaWxlIGlzIGEganNwIGZpbGUgKHNpbmNlIHRoaXMgaXMgZG9uZQotICAgICAqIGZyZXF1ZW50bHkpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSnNwKElGaWxlIGZpbGUpIHsKLSAgICAJLy8gKHBhKSAyMDA1MTAyNSByZW1vdmluZyBkZWVwIGNvbnRlbnQgdHlwZSBjaGVjawotICAgIAkvLyBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcmVxdWVudGx5Ci0gICAgCS8vIGFuZCBJTyBpcyBleHBlbnNpdmUKLSAgICAgICAgYm9vbGVhbiBpc0pzcCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotICAgICAgICAJCi0gICAgICAgICAgICBJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLSAgICAgICAgICAgIC8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uLCBpdCdzIGxlc3MgZXhwZW5zaXZlCi0gICAgICAgICAgICBpZiAoY29udGVudFR5cGVKU1AuaXNBc3NvY2lhdGVkV2l0aChmaWxlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIAlpc0pzcCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXNKc3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2NoZWR1bGVzIGEgc2VhcmNoIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGlzIEpTUCBmaWxlIGZvciBpbmRleGluZyAoYnkKLSAgICAgKiB0aGUgamF2YSBpbmRleGVyKQotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgSlNQIGZpbGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW5kZXhpbmcgd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTZWFyY2hEb2N1bWVudCBhZGRKc3BGaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkgfHwgIWZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgSlNQIGZpbGU6IiArIGZpbGUuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAvLyBjcmVhdGUKLSAgICAgICAgU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChmaWxlKTsKLSAgICAgICAgLy8gbnVsbCBpZiBub3QgYSBqc3AgZmlsZQotICAgICAgICBpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpLnNjaGVkdWxlRG9jdW1lbnRJbmRleGluZyhkZWxlZ2F0ZSwgY29tcHV0ZUluZGV4TG9jYXRpb24oZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGZhaWx1cmUgaGVyZSBkb2Vzbid0IGtlZXAgb3RoZXIgZG9jdW1lbnRzIGZyb20KLSAgICAgICAgICAgICAgICAvLyBiZWluZyBpbmRleGVkCi0gICAgICAgICAgICAgICAgLy8gaWYgcGVmb3JtZWQgaW4gYSBiYXRjaCBjYWxsIChsaWtlIEpTUEluZGV4TWFuYWdlcikKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNjaGVkdWxlZCIgKyBkZWxlZ2F0ZSArICJmb3IgaW5kZXhpbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGEgamF2YSBzZWFyY2ggdy8gdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFJ1bnMgaW4gYSBiYWNrZ3JvdW5kIEpvYgotICAgICAqIChyZXN1bHRzIG1heSBzdGlsbCBjb21lIGluIGFmdGVyIHRoaXMgbWV0aG9kIGNhbGwpCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlYXJjaFRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgb2YgdGV4dCB0byBzZWFyY2ggb24KLSAgICAgKiBAcGFyYW0gc2VhcmNoRm9yCi0gICAgICogICAgICAgICAgICBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCBNRVRIT0QsIEZJRUxELCBQQUNLQUdFLCBldGMuLi4KLSAgICAgKiBAcGFyYW0gbGltaXRUbwotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuREVDTEFSQVRJT05TLAotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuUkVGRVJFTkNFUywKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2VhcmNoQ29uc3RhbnRzLklNUExFTUVOVE9SUywgb3IKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2VhcmNoQ29uc3RhbnRzLkFMTF9PQ0NVUlJFTkNFUwotICAgICAqIEBwYXJhbSBtYXRjaE1vZGUKLSAgICAgKiAgICAgICAgICAgIGFsbG93ICogd2lsZGNhcmRzIG9yIG5vdAotICAgICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdG9yCi0gICAgICogICAgICAgICAgICBwYXNzZWQgaW4gdG8gYWNjZXB0IHNlYXJjaCBtYXRjaGVzIChhbmQgZG8gInNvbWV0aGluZyIgd2l0aAotICAgICAqICAgICAgICAgICAgdGhlbSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWFyY2goU3RyaW5nIHNlYXJjaFRleHQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIGludCBzZWFyY2hGb3IsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoSm9iIGpvYiA9IG5ldyBTZWFyY2hKb2Ioc2VhcmNoVGV4dCwgc2NvcGUsIHNlYXJjaEZvciwgbGltaXRUbywgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgam9iLnNldFVzZXIodHJ1ZSk7Ci0gICAgICAgIC8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDMyCi0gICAgICAgIC8vIHBvcHMgdXAgdXNlciBvcGVyYXRpb24gYmxvY2tlZCBkaWFsb2cgaWYgeW91IHBlcmZvcm0gYSBsb25nIHNlYXJjaCwKLSAgICAgICAgLy8gdGhlbiBvcGVuIGEgZmlsZSBiZWNhdXNlIGl0IGxvY2tzIHRoZSB3b3Jrc3BhY2UKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YUVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYSBiYWNrZ3JvdW5kIEpvYiAocmVzdWx0cyBtYXkgc3RpbGwgY29tZSBpbiBhZnRlciB0aGlzIG1ldGhvZCBjYWxsKQotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHNjb3BlCi0gICAgICogQHBhcmFtIHJlcXVlc3RvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoSm9iIGpvYiA9IG5ldyBTZWFyY2hKb2IoZWxlbWVudCwgc2NvcGUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgam9iLnNldFVzZXIodHJ1ZSk7Ci0gICAgICAgIC8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDMyCi0gICAgICAgIC8vam9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0gICAgICAgIGpvYi5zY2hlZHVsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaCBmb3IgYW4gSUphdmFFbGVtZW50LCBjb25zdHJhaW5lZCBieSB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gUnVucyBpbgotICAgICAqIGFuIElXb3Jrc3BhY2UgcnVubmFibGUgKHJlc3VsdHMgd2lsbCBiZSByZXBvcnRlZCBieSB0aGUgZW5kIG9mIHRoaXMKLSAgICAgKiBtZXRob2QpCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc2NvcGUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VhcmNoUnVubmFibGUoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICBKU1BJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWJ1aWxkSW5kZXhJZk5lZWRlZCgpOwotCi0gICAgICAgIFNlYXJjaFJ1bm5hYmxlIHNlYXJjaFJ1bm5hYmxlID0gbmV3IFNlYXJjaFJ1bm5hYmxlKGVsZW1lbnQsIHNjb3BlLCByZXF1ZXN0b3IpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihzZWFyY2hSdW5uYWJsZSwgSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGpzcEZpbGUKLSAgICAgKiBAcmV0dXJuIFNlYXJjaERvY3VtZW50IGlmIHRoZSBmaWxlIGlzIG5vdCBudWxsLCBleGlzdHMsIGFuZCBpcyBhIEpTUAotICAgICAqICAgICAgICAgZmlsZSwgb3RoZXJ3aXNlIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChJRmlsZSBqc3BGaWxlKSB7Ci0KLSAgICAgICAgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgZGVsZWdhdGUgPSBudWxsOwotICAgICAgICBpZiAoanNwRmlsZSAhPSBudWxsICYmIGpzcEZpbGUuZXhpc3RzKCkgJiYgaXNKc3AoanNwRmlsZSkpIHsKLQotICAgICAgICAgICAgZGVsZWdhdGUgPSBuZXcgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUobmV3IEpTUFNlYXJjaERvY3VtZW50KGpzcEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2VudHJhbGl6ZWQgcGxhY2UgdG8gYWNjZXNzIEpTUFNlYXJjaERvY3VtZW50cyAodXNlZCBieQotICAgICAqIEpTUFNlYXJjaFBhcnRpY2lwYW50IGFuZCBKU1BTZWFyY2hSZXF1ZXN0b3IpCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlYXJjaERvY1BhdGgKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHJldHVybiB0aGUgSlNQU2VhcmNoRG9jdW1lbnQgb3IgbnVsbCBpZiBvbmUgaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGdldFNlYXJjaERvY3VtZW50KFN0cmluZyBzZWFyY2hEb2NQYXRoKSB7Ci0gICAgICAgICAKLSAgICAgICAgU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBudWxsOwotICAgICAgICBJRmlsZSBmID0gZmlsZUZvckNVUGF0aChzZWFyY2hEb2NQYXRoKTsKLSAgICAgICAgaWYgKGYgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVsZWdhdGUgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGhhbmRsZSBmYWlsdXJlIGNhc2UuLi4gKGZpbGUgZGVsZXRlZCBtYXliZT8pCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVubWFuZ2xlcyB0aGUgc2VhcmNoRG9jUGF0aCBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBKU1AgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoRG9jUGF0aAotICAgICAqLwotICAgIHByaXZhdGUgSUZpbGUgZmlsZUZvckNVUGF0aChTdHJpbmcgc2VhcmNoRG9jUGF0aCkgewotICAgIAotICAgICAgICBTdHJpbmdbXSBzcGxpdCA9IHNlYXJjaERvY1BhdGguc3BsaXQoIi8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gc3BsaXRbc3BsaXQubGVuZ3RoIC0gMV07Ci0KLSAgICAgICAgLy8gaWdub3JlIGFueXRoaW5nIGJ1dCAuamF2YSBtYXRjaGVzIChsaWtlIC5jbGFzcyBiaW5hcnkgbWF0Y2hlcykKLSAgICAgICAgaWYoIXNlYXJjaERvY1BhdGguZW5kc1dpdGgoIi5qYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBKU1AyU2VydmxldE5hbWVVdGlsLnVubWFuZ2xlKGNsYXNzbmFtZSk7Ci0gICAgICAgCi0gICAgICAgIC8vIHRyeSBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIElGaWxlIGYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlUGF0aCkpOwotICAgICAgICAvLyB3b3Jrc3BhY2UgcmVsYXRpdmUgdGhlbgotICAgICAgICBpZihmID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjAwOQotICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgcHJvamVjdCBuYW1lIGFzIHdlbGwKLSAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIG1lYW4gPj0gMiBwYXRoIHNlZ21lbnRzCi0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgpOwotICAgICAgICAgICAgaWYocGF0aC5zZWdtZW50Q291bnQoKSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICBKU1BTZWFyY2hQYXJ0aWNpcGFudCBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpIHsKLQotICAgICAgICBpZiAodGhpcy5mUGFydGljaXBhbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRoaXMuZlBhcnRpY2lwYW50ID0gbmV3IEpTUFNlYXJjaFBhcnRpY2lwYW50KCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmZQYXJ0aWNpcGFudDsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIGNhbGxlZCBmcm9tIEpTUFBhdGhJbmRleGVyCi0gICAgLy8gcGFfVE9ETwotICAgIC8vaG93IGNhbiB3ZSBtYWtlIHN1cmUgcGFydGljaXBhbnQgaW5kZXhMb2NhdGlvbnMgYXJlIHVwZGF0ZWQgYXQgc3RhcnR1cD8KLSAgICBwdWJsaWMgZmluYWwgSVBhdGggY29tcHV0ZUluZGV4TG9jYXRpb24oSVBhdGggY29udGFpbmVyUGF0aCkgewotCi0gICAgICAgIElQYXRoIGluZGV4TG9jYXRpb24gPSBudWxsOwotICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGluYWR2ZXJ0ZW50bHkgdXNlIGEgSkRUIEluZGV4Ci0gICAgICAgIC8vIHdlIHdhbnQgdG8gYmUgc3VyZSB0byB1c2UgdGhlIEluZGV4IGZyb20gdGhlIEpTUCBsb2NhdGlvbgotICAgICAgICAvL09iamVjdCBvYmogPSBpbmRleExvY2F0aW9ucy5nZXQoY29udGFpbmVyUGF0aCk7Ci0gICAgICAgIC8vaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgIC8vICAgIGluZGV4TG9jYXRpb24gPSAoU3RyaW5nKSBvYmo7Ci0gICAgICAgIC8vfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBpbmRleCBlbnRyeQotICAgICAgICAgICAgU3RyaW5nIHBhdGhTdHJpbmcgPSBjb250YWluZXJQYXRoLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgIHRoaXMuZkNoZWNrc3VtQ2FsY3VsYXRvci5yZXNldCgpOwotICAgICAgICAgICAgdGhpcy5mQ2hlY2tzdW1DYWxjdWxhdG9yLnVwZGF0ZShwYXRoU3RyaW5nLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gTG9uZy50b1N0cmluZyh0aGlzLmZDaGVja3N1bUNhbGN1bGF0b3IuZ2V0VmFsdWUoKSkgKyAiLmluZGV4IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgb25seSBkaWZmZXJlbmNlIGZyb20KLSAgICAgICAgICAgIC8vIEluZGV4TWFuYWdlciNjb21wdXRlSW5kZXhMb2NhdGlvbiguLi4pCi0gICAgICAgICAgICBpbmRleExvY2F0aW9uID0gZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKS5hcHBlbmQoZmlsZU5hbWUpOwotCi0gICAgICAgICAgICAvLyBwYV9UT0RPIG5lZWQgdG8gYWRkIHRvIGphdmEgcGF0aCB0b28sIHNvIEpEVCBzZWFyY2ggc3VwcG9ydCBrbm93cwotICAgICAgICAgICAgLy8gdGhlcmUgc2hvdWxkIGJlIGEgbm9uIGludGVybmFsIHdheSB0byBkbyB0aGlzLgotICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTc3NTY0Ci0gICAgICAgICAgICBKYXZhTW9kZWxNYW5hZ2VyLmdldEluZGV4TWFuYWdlcigpLmluZGV4TG9jYXRpb25zLnB1dChjb250YWluZXJQYXRoLCBpbmRleExvY2F0aW9uKTsKLSAgICAgICAgLy99Ci0gICAgICAgIHJldHVybiBpbmRleExvY2F0aW9uOwotICAgIH0KLQotICAgIC8vIGNvcGllZCBmcm9tIEpEVCBJbmRleE1hbmFnZXIKLSAgICBwdWJsaWMgSVBhdGggZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMuZkpzcFBsdWdpbkxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5mSnNwUGx1Z2luTG9jYXRpb247Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBmb2xkZXIgbmFtZSAianNwc2VhcmNoIiB0byBrZWVwIHRoZSBzdGF0ZSBsb2NhdGlvbiBhcmVhIGNsZWFuZXIKLSAgICAgICAgSVBhdGggc3RhdGVMb2NhdGlvbiA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoImpzcHNlYXJjaCIpOwotCi0gICAgICAgIC8vIHBhX1RPRE8gd29ya2Fyb3VuZCBmb3IKLSAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyMjY3Ci0gICAgICAgIC8vIGNvcGllZCBmcm9tIEluZGV4TWFuYWdlcgotICAgICAgICBTdHJpbmcgZGV2aWNlID0gc3RhdGVMb2NhdGlvbi5nZXREZXZpY2UoKTsKLSAgICAgICAgaWYgKGRldmljZSAhPSBudWxsICYmIGRldmljZS5jaGFyQXQoMCkgPT0gJy8nKQotICAgICAgICAgICAgc3RhdGVMb2NhdGlvbiA9IHN0YXRlTG9jYXRpb24uc2V0RGV2aWNlKGRldmljZS5zdWJzdHJpbmcoMSkpOwotCi0gICAgICAgIC8vIGVuc3VyZSB0aGF0IGl0IGV4aXN0cyBvbiBkaXNrCi0gICAgICAgIEZpbGUgZm9sZGVyID0gbmV3IEZpbGUoc3RhdGVMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQlpZiAoIWZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5ta2RpcigpOwotCQkJfQotCQkJY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0gICAgICAgIHJldHVybiB0aGlzLmZKc3BQbHVnaW5Mb2NhdGlvbiA9IHN0YXRlTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIGNhbmNlbCkgewotICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigic2VhcmNoIHN1cHBvcnQgbW9uaXRvciIgKyBmTW9uaXRvcik7Ci0gICAgICAgIGZNb25pdG9yLnNldENhbmNlbGVkKGNhbmNlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCi0gICAgICAgIHJldHVybiBmTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQotICAgICAgICByZXR1cm4gdGhpcy5mTW9uaXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0phdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0phdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMDcxNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbjsKLQotCi0vKioKLSAqIFdyYXBwZXIgbWV0aG9kIHRvIHNldCBnZXRQYXRoKCkgcGF0aCB0byBiZSB0aGUgcGF0aCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCAKLSAqIGZvciB0aGUganNwIGZpbGUuIChzaW5jZSBpdCdzIGEgZmluYWwgbWV0aG9kLCBpdCBuZWVkcyB0byBiZSBzZXQgdmlhIGNvbnN0cnVjdG9yKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgZXh0ZW5kcyBTZWFyY2hEb2N1bWVudCB7Ci0JCi0JcHJpdmF0ZSBKU1BTZWFyY2hEb2N1bWVudCBmSlNQU2VhcmNoRG9jID0gbnVsbDsKLQkKLQlwdWJsaWMgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUoSlNQU2VhcmNoRG9jdW1lbnQganNwU2VhcmNoRG9jKSB7Ci0JCQotCQlzdXBlcihqc3BTZWFyY2hEb2MuZ2V0UGF0aCgpLCBqc3BTZWFyY2hEb2MuZ2V0UGFydGljaXBhbnQoKSk7Ci0JCXRoaXMuZkpTUFNlYXJjaERvYyA9IGpzcFNlYXJjaERvYzsKLQl9Ci0KLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50cygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0Qnl0ZUNvbnRlbnRzKCk7Ci0JfQotCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldENoYXJDb250ZW50cygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCkgewotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEphdmFUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0RW5jb2RpbmcoKTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEZpbGUoKTsKLQl9Ci0JCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGdldEpzcFRyYW5zbGF0aW9uKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRKU1BUcmFuc2xhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEpzcE9mZnNldChpbnQgamF2YU9mZnNldCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRKc3BPZmZzZXQoamF2YU9mZnNldCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXRoaXMuZkpTUFNlYXJjaERvYy5yZWxlYXNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvTnVsbFNlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTlhMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0b3I7Ci0KLQotCi0vKioKLSAqIEFuIGVtcHR5IHNlcnZsZXQsIHNhZmUgZm9yIEphdmEgc2VhcmNoIHBhcnRpY2lwYXRpb24KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE51bGxTZWFyY2hEb2N1bWVudCBleHRlbmRzIFNlYXJjaERvY3VtZW50IHsKLQkKLQlTdHJpbmdCdWZmZXIgZkVtcHR5U2VydmxldEJ1ZmZlciA9IG51bGw7Ci0JCi0JcHVibGljIE51bGxTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKSB7Ci0JCXN1cGVyKGRvY3VtZW50UGF0aCwgbmV3IEpTUFNlYXJjaFBhcnRpY2lwYW50KCkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZkVtcHR5U2VydmxldEJ1ZmZlciA9IG5ldyBKU1BUcmFuc2xhdG9yKCkuZ2V0RW1wdHlUcmFuc2xhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZkVtcHR5U2VydmxldEJ1ZmZlci50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0JfQotCQotCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnRzKCkgewotCQlyZXR1cm4gdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVTdGF0ZURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVN0YXRlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU4YTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVN0YXRlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHJlbWVtYmVyaW5nIG9sZCBhbmQgbmV3IGVtYmVkZGVkIGhhbmRsZXJzLCAKLSAqIGluIHRoZSBldmVudCBhIHJlLWluaXQgaXMgbmVlZGVkLgotICovCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRUeXBlU3RhdGVEYXRhIHsKLQotCi0JRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyOwotCUVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SGFuZGxlcjsKLQotCXB1YmxpYyBFbWJlZGRlZFR5cGVTdGF0ZURhdGEoRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0hhbmRsZXIpIHsKLQkJdGhpcy5vbGRIYW5kbGVyID0gb2xkSGFuZGxlcjsKLQkJdGhpcy5uZXdIYW5kbGVyID0gbmV3SGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXROZXdIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3SGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRPbGRIYW5kbGVyKCkgewotCQlyZXR1cm4gb2xkSGFuZGxlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0pTUE1vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjQ2OTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0pTUE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudC5ET01Nb2RlbEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUpTUEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUZhbWlseUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuRGVidWdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCXByb3RlY3RlZCBmaW5hbCBpbnQgTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUksgPSAyMDAwMDA7Ci0KLQkvKioKLQkgKiBETVcgLSBOb3RlOiBJIHRoaW5rIHRoZSBlbWJlZGRlZFR5cGVSZWdpc3RyeSBpbiBJTW9kZWxNYW5hZ2VyIGNhbiBiZQotCSAqIHJlbW92ZWQKLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9NSU1FX1RZUEUgPSAidGV4dC9odG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0xBTkdVQUdFID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSlNQTW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeQotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCkgewotCQlpZiAoZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBlbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCURPTU1vZGVsRm9ySlNQIG1vZGVsID0gbmV3IERPTU1vZGVsRm9ySlNQKCk7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgSlNQIGZpbGVzLCB0ZXh0L2h0bWwgaXMgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlLiBUaGlzIG1heSB3YW50Ci0JICogdGhpcyBkaWZmZXJlbnQgZm9yIHR5cGVzIGxpa2UganN2IChqc3AgZm9yIHZvaWNlIHhtbCkgRm9yIG5vdywgaGFyZAotCSAqIGNvZGUgdG8gbmV3IGluc3RhbmNlLiBJbiBmdXR1cmUsIHNob3VsZCBnZXQgaW5zdGFuY2UgZnJvbSByZWdpc3RyeS4KLQkgKiAKLQkgKiBTcGVjaWZpY2F0aW9uIGNpdGVzIEhUTUwgYXMgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlFbWJlZGRlZFR5cGVSZWdpc3RyeSByZWcgPSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKTsKLQotCQlTdHJpbmcgbWltZVR5cGUgPSBudWxsOwotCQkvLyBkZWZhdWx0IGVtYmVkZGVkIHR5cGUgZm9yIGZyYWdtZW50cwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUobW9kZWwpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCW1pbWVUeXBlID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BDT05URU5UVFlQRSwgZmlsZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJbWltZVR5cGUgPSBtaW1lVHlwZSA9PSBudWxsID8gZ2V0RGVmYXVsdE1pbWVUeXBlKCkgOiBtaW1lVHlwZTsKLQkJcmV0dXJuIHJlZy5nZXRUeXBlRm9yKG1pbWVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0RGVmYXVsdE1pbWVUeXBlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdE1pbWVUeXBlKCkgewotCQlyZXR1cm4gREVGQVVMVF9NSU1FX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgSVN0cnVjdHVyZWREb2N1bWVudCwgdGhhdCBoYXMKLQkgKiBiZWVuIGluaXRpYWxpemVkIHdpdGggYXBwcm9wcmlhdGUgcGFyc2VyLiBGb3IgbWFueSBsb2FkZXJzLCB0aGUKLQkgKiAoZGVmYXVsdCkgcGFyc2VyIHVzZWQgaXMga25vd24gZm9yIGFueSBpbnB1dC4gRm9yIG90aGVycywgdGhlIGNvcnJlY3QKLQkgKiBwYXJzZXIgKGFuZCBpdHMgaW5pdGlhbGl6YXRpb24pIGlzIG5vcm1hbGwgZGVwZW5kZW50IG9uIHRoZSBjb250ZW50IG9mCi0JICogdGhlIGZpbGUuIFRoaXMgbm8tYXJndW1lbnQgbWV0aG9kIHNob3VsZCBhc3N1bWUgImVtcHR5IGlucHV0IiBhbmQgd291bGQKLQkgKiB0aGVyZWZvcmUgcmV0dXJuIHRoZSBkZWZhdWx0IHBhcnNlciBmb3IgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICogCi0JICogSWYgdGhlIHBhcnNlciBpcyB0byBoYW5kbGUgdGFnIGxpYnJhcmllcywgaXQgbXVzdCBoYXZlIGEgVGFnbGliU3VwcG9ydAotCSAqIG9iamVjdCB3aXRoIGEgdmFsaWQgVVJJUmVzb2x2ZXIgYW5kIHRoaXMgSVN0cnVjdHVyZWREb2N1bWVudCBhdHRhY2hlZAotCSAqIHRvIGl0IGJlZm9yZSB0aGUgY29udGVudHMgYXJlIHNldCBvbiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuc2V0UmVQYXJzZXIobmV3IEpTUFJlUGFyc2VyKCkpOwotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihuZXcKLQkJLy8gSlNQSmF2YURvY3VtZW50UGFydGlvbmVyKCkpOwotCQkvLyBldmVuIHRob3VnaCB0aGlzIGlzIGFuICJlbXB0eSBtb2RlbCIgLi4uIHdlIHdhbnQgaXQgdG8gaGF2ZSBhdAotCQkvLyBsZWFzdCB0aGUKLQkJLy8gZGVmYXVsdCBlbWJlZGRlZGVkIGNvbnRlbnQgdHlwZSBoYW5kbGVyCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRUeXBlID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZShudWxsKTsKLQkJZW1iZWRkZWRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCS8vIHJlbWVtYmVyLCB0aGUgTG9hZGVyCi0JCS8vIHdpbGwgbmVlZCB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgcGFyc2VyCi0JCS8vIGJhc2VkIG9uICJlbWJlZGRlZCBjb250ZW50IgotCQlyZXR1cm4gbmV3IEpTUFNvdXJjZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlzdXBlci5wcmVMb2FkQWRhcHQoc3RydWN0dXJlZE1vZGVsKTsKLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsOwotCQkvLwotCQkvLyBkb2N1bWVudCBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIHNldCBmb3IgdGhpcyB0bwotCQkvLyB3b3JrLgotCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZG9jdW1lbnQpOwotCQkvLyBpZiB0aGVyZSBpcyBhIG1vZGVsIGluIHRoZSBhZGFwdGVyLCB0aGlzIHdpbGwgYWRhcHQgaXQgdG8KLQkJLy8gZmlyc3Qgbm9kZS4gQWZ0ZXIgdGhhdCB0aGUgUHJvcGFnYXRpbmdBZGF0ZXIgc3ByZWFkcyBvdmVyIHRoZQotCQkvLyBjaGlsZHJlbiBiZWluZwotCQkvLyBjcmVhdGVkLiBFYWNoIHRpbWUgdGhhdCBoYXBwZW5kcywgYSBzaWRlIGVmZmVjdCBpcyB0bwotCQkvLyBhbHNvICJzcHJlYWQiIHNwcmVjaWZpYyByZWdpc3RlcmVkIGFkYXB0ZXJzLAotCQkvLyB0aGV5IHR3byBjYW4gcHJvcGlnYXRlIGlzIG5lZWRlZC4KLQkJLy8gVGhpcyAnZ2V0JyBjYXVzZXMgZmlyc3QgdG8gYmUgYmUgYXR0YWNoZWQuCi0JCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCS8vIG1heSBtYWtlIHRoaXMgZWFzaWVyIHRvIHVzZSBpbiBmdXR1ZQotCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeSgpKTsKLQkJaWYgKERlYnVnLmRlYnVnTm90aWZpY2F0aW9uQW5kRXZlbnRzKSB7Ci0JCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IERlYnVnQWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQkJLy8gRm9yIEpTUHMsIHRoZSBNb2RlbFF1ZXJ5QWRhcHRlciBtdXN0IGJlICJhdHRhY2hlZCIgdG8gdGhlIGRvY3VtZW50Ci0JCS8vIGJlZm9yZSBjb250ZW50IGlzIHNldCBpbiB0aGUgbW9kZWwsIHNvIHRhZ2xpYiBpbml0aXphdGlvbiBjYW4KLQkJLy8gdGFrZSBwbGFjZS4KLQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCS8vCi0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aG9zZSBmYWN0b3JpZXMgd2hpY2ggbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUKLQkgKiBzdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJLy8KLQkJZmFjdG9yeSA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gbmV3IFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IgZ2V0SGVhZFBhcnNlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50UmVhZGVyIHJlYWRlciA9IG5ldyBEb2N1bWVudFJlYWRlcihkb2MpOwotCQlyZXR1cm4gZ2V0Q29udGVudERlc2NyaXB0aW9uKHJlYWRlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb250ZW50IGRlc2NyaXB0aW9uIGZvciBhbiBpbnB1dCBzdHJlYW0gQXNzdW1lcyBpdCdzIEpTUAotCSAqIGNvbnRlbnQuIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtIHdoZW4gZmluaXNoZWQuCi0JICogCi0JICogQHBhcmFtIHJlYWRlcgotCSAqIEByZXR1cm4gdGhlIElDb250ZW50RGVzY3JpcHRpb24gZm9yIGluLCBvciBudWxsIGlmIGluIGlzIG51bGwKLQkgKi8KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKFJlYWRlciByZWFkZXIpIHsKLQotCQlpZiAocmVhZGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBudWxsOwotCQl0cnkgewotCi0JCQlJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCWRlc2MgPSBjb250ZW50VHlwZUpTUC5nZXREZXNjcmlwdGlvbkZvcihyZWFkZXIsIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVzYzsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRMYW5ndWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExhbmd1YWdlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGZpcnN0IGNoZWNrIHRoZSBtb2RlbCAoZG9jdW1lbnQgaXRzZWxmKSB0byBzZWUgaWYgY29udGFpbnMKLQkJcmVzdWx0ID0gZ2V0TGFuZ3VhZ2VGcm9tU3RydWN0dXJlZERvY3VtZW50KG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJLy8gTm90ZTogaWYgbW9kZWwgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQKLQkJLy8gbGFuZ3VhZ2UsIHdlJ2xsIGV2ZW4gcmV0dXJuIGl0LAotCQkvLyBzaW5jZSB3aG8ga25vd3Mgd2hhdCBmdXR1cmUgaG9sZHMuCi0KLQkJLy8gZ2V0IGRlZmF1bHQgbGFuZ3VhZ2Ugc3BlY2lmaWVkIGluIHByb3BlcnRpZXMgcGFnZQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShtb2RlbCk7Ci0JCXJlc3VsdCA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQTEFOR1VBR0UsIGZpbGUsIHRydWUpOwotCi0JCS8vIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gREVGQVVMVF9MQU5HVUFHRTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRMYW5ndWFnZUZyb21TdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGFuZ3VhZ2VGcm9tU3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gYmFzY2lhbGx5IHNhbWUgYWxnb3JpdGhtIGFzIGdldCBlbmNvZGluZyBvcgotCQkvLyBnZXQgY29udGVudCB0eXBlIGZyb20gc3RydWN0dXJlZERvY3VtZW50LgotCQlJSlNQSGVhZENvbnRlbnREZXRlY3RvciBsb2NhbEhlYWRQYXJzZXIgPSBnZXRIZWFkUGFyc2VyKCk7Ci0JCS8vIHdlIGNhbiBiZSBhc3N1cmVkIHRoYXQgaXRzIGFscmVhZHkgYmVlbgotCQkvLyBwYXJzZWQuIElmIG5vdCBjYWxsIHBhcnNlSGVhZGVyRm9yUGFnZURpcmVjdGl2ZSgpCi0JCS8vIGJlZm9yZSBjYWxsaW5nIGdldExhbmd1YWdlOwotCQlsb2NhbEhlYWRQYXJzZXIuc2V0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBsb2NhbEhlYWRQYXJzZXIuZ2V0TGFuZ3VhZ2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZQotCQkJLy8gVE9ETyBuZWVkIHRvIHJlY29uc2lkZXIgZGVzaWduIHRvIGF2b2lkCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzICJyZWluaXRpYWxpemUiIHNpbmNlIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgdGhlCi0JICogZGVmYXVsdCBvbmUgYXNzaWduZWQsIGJlZm9yZSB3ZSBzdGFydCBjaGVja2luZyB0aGUgc3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlSW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEVtYmVkZGVkQ29udGVudFR5cGUsIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3RW1iZWRkZWRDb250ZW50VHlwZSkgewotCQkvLyBjaGVjayBwcm9ncmFtIGxvZ2ljCi0JCUFzc2VydC5pc05vdE51bGwob2xkRW1iZWRkZWRDb250ZW50VHlwZSwgIlByb2dyYW0gZXJyb3I6IGludmFsaWQgY2FsbCBkdXJpbmcgbW9kZWwgaW5pdGlhbGl6YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBvbmNlIHdlIGtub3cgdGhlIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSwgd2UgbmVlZCB0byBzZXQgaXQgaW4gdGhlCi0JCS8vIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIC4uLiB0aGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMKLQkJLy8gY3JpdGljYWwgaGVyZSwgdGhlIGRvYyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBidXQgaXRzIGNvbnRlbnRzIG5vdAotCQkvLyBzZXQgeWV0LAotCQkvLyBhbmQgYWxsIGZhY3RvcmllcyBtdXN0IGhhdmUgYmVlbiBzZXQgdXAgYWxzby4KLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSBkb2N1bWVudC5nZXRFeGlzdGluZ0FkYXB0ZXIoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikKLQkJLy8gZG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikKLQkJLy8gZG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCS8vIHNpbmNlICdkb2N1bWVudCcgaXMgbm90IHJlY3JlYXRlZCBpbiB0aGlzCi0JCS8vIHJlaW5pdCBwYXRoLCB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgYWRhcHRlcnMsCi0JCS8vIGV4Y2VwdCBmb3IgdGhlIHByb3BhZ2F0ZWQgYWRhcHRlcnMgKGluY2x1ZGluZyBwYWdlCi0JCS8vIGRpcmVjdGl2ZSBhZGFwdGVyLCBhbmQgbW9kZWwgcXVlcnkgYWRhcHRlcikuCi0JCS8vIHRvIGFjY29tcGxpc2ggdGhpcywgd2UnbGwganVzdCByZW1vdmUgYWxsLCB0aGVuCi0JCS8vIGFkZCBiYWNrIHdpdGggYSBjYWxsIHRvIHByZS1sb2FkIGFkYXB0LgotCQkvLyBsZXQgY2xpZW50cyBkZWNpZGUgdG8gdW5sb2FkIGFkYXB0ZXJzIGZyb20gZG9jdW1lbnQKLQkJLy8gQ29sbGVjdGlvbiBvbGRBZGFwdGVycyA9IGRvY3VtZW50LmdldEFkYXB0ZXJzKCk7Ci0JCS8vIEl0ZXJhdG9yIG9sZEFkYXB0ZXJzSXRlcmF0b3IgPSBvbGRBZGFwdGVycy5pdGVyYXRvcigpOwotCQkvLyB3aGlsZSAob2xkQWRhcHRlcnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJLy8gSU5vZGVBZGFwdGVyIG9sZEFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKQotCQkvLyBvbGRBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKTsKLQkJLy8gaWYgKG9sZEFkYXB0ZXIgIT0gcGFnZURpcmVjdGl2ZUFkYXB0ZXIgJiYgb2xkQWRhcHRlciAhPQotCQkvLyBwcm9wYWdhdGluZ0FkYXB0ZXIgJiYgb2xkQWRhcHRlciAhPSBtb2RlbFF1ZXJ5QWRhcHRlcikgewotCQkvLyAvLyBETyBOT1QgcmVtb3ZlIGRpcmVjdGx5IQotCQkvLyAvLyBjYW4gY2hhbmdlIGNvbnRlbnRzIHdoaWxlIGluIG5vdGlmaXR5IGxvb3AhCi0JCS8vIC8vb2xkQWRhcHRlcnNJdGVyYXRvci5yZW1vdmUoKTsKLQkJLy8gZG9jdW1lbnQucmVtb3ZlQWRhcHRlcihvbGRBZGFwdGVyKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIERNVzogSSBiZWxpZXZlIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgaXMgbmVlZGVkLAotCQkvLyBzaW5jZSByZWxlYXNlcyBjYWNoZWQgYWRhcHRlcnMKLQkJLy8gaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgRG9jdW1lbnRJbXBsKSB7Ci0JCS8vICgoRG9jdW1lbnRJbXBsKSBkb2N1bWVudCkucmVsZWFzZURvY3VtZW50VHlwZSgpOwotCQkvLyAoKERvY3VtZW50SW1wbCkgZG9jdW1lbnQpLnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQkvLyB9Ci0JCS8vIHJlbWVtYmVyLCBlbWJlZGRlZCB0eXBlIGZhY3RvcmllcyBhcmUgYXV0b21hdGljYWxseSBjbGVhcmVkIHdoZW4KLQkJLy8gZW1iZWRlZFR5cGUgY2hhbmdlZAotCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUobmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCS8vIC8vIGJ1dCBzdGlsbCBuZWVkIHRvIGNsZWFyIHRoZSBwYWdlIGRpcmVjdGl2ZSB3YXRjaGVycywgYW5kIGxldAotCQkvLyB0aGVtIGJlIHJlZGlzY292ZXJlZCAod2l0aCBuZXcsIGFjY3VyYXRlIG5vZGUgYXMgdGFyZ2V0KQotCQkvLyBwYWdlRGlyZWN0aXZlQWRhcHRlci5jbGVhclBhZ2VXYXRjaGVycygpOwotCQlpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0KLQkJCS8vIG5lZWQgdG8gbnVsbCBvdXQgb3IgZWxzZSBNb2RlbFBhcnNlckFkYXB0ZXIKLQkJCS8vIHdvbid0IGdldCByZWluaXRpYWxpemVkCi0JCQkoKERPTU1vZGVsSW1wbCkgbW9kZWwpLnNldE1vZGVsUGFyc2VyKG51bGwpOwotCi0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCi0JCQkvLyBwYXJ0aXRpb25lciBzZXR1cCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhpcyBsb2FkZXIKLQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyIGRvY3VtZW50UGFydGl0aW9uZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCQkJLy8gSVNTVUU6IHRoaXMgbG9naWMgaXMgZmxhd2VkLCBub3Qgc3VyZSBvZiBvcmlnaW5hbCBpbnRlbnQsIGJ1dAotCQkJLy8gYWRkZWQgbnVsbC90eXBlIGNoZWNrcyBmb3Igc2FmZXR5LgotCQkJaWYgKGRvY3VtZW50UGFydGl0aW9uZXIgIT0gbnVsbCAmJiBkb2N1bWVudFBhcnRpdGlvbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgewotCQkJCWlmIChuZXdFbWJlZGRlZENvbnRlbnRUeXBlLmdldEZhbWlseUlkKCkuZXF1YWxzKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpKSB7Ci0JCQkJCSgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgZG9jdW1lbnRQYXJ0aXRpb25lcikuc2V0RW1iZWRkZWRQYXJ0aXRpb25lcihuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZS5nZXRGYW1pbHlJZCgpLmVxdWFscyhDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpKSB7Ci0JCQkJCSgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgZG9jdW1lbnRQYXJ0aXRpb25lcikuc2V0RW1iZWRkZWRQYXJ0aXRpb25lcihuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGFkZGluZyBsYW5ndWFnZSBoZXJlLCBpbiB0aGlzIGNvbnZpZW5lbnQgY2VudHJhbAotCQkvLyBsb2NhdGlvbiwgYnV0IHNvbWUgb2J2aW91cyByZW5hbWluZyBvciByZWZhY3RvcmluZwotCQkvLyB3b3VsZG4ndCBodXJ0LCBpbiBmdXR1cmUuCi0JCS8vIEkgbmVlZGVkIHRvIGFkZCB0aGlzIGxhbmd1YWdlIHNldHRpbmcgZm9yIEpTUCBGcmFnbWVudCBzdXBwb3J0Ci0JCS8vIE5vdGU6IHRoaXMgaXMgdGhlIG9uZSB0aGF0IGNvdW50cywgc2luY2UgYXQgdGhpcyBwb2ludCwKLQkJLy8gdGhlIG1vZGVsIGhhcyBhbiBJRCwgc28gd2UgY2FuIGxvb2sgdXAgSUZpbGUsIGV0Yy4KLQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobW9kZWwpOwotCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgInJlaW5pdGlhbGl6ZSIgc2luY2UgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhdCBsZWFzdCB0aGUKLQkgKiBkZWZhdWx0IG9uZSBhc3NpZ25lZCwgYmVmb3JlIHdlIHN0YXJ0IGNoZWNraW5nIHRoZSBzdHJlYW0KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdENsb25lT2ZFbWJlZGRlZFR5cGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRFbWJlZGRlZENvbnRlbnRUeXBlLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0VtYmVkZGVkQ29udGVudFR5cGUpIHsKLQkJLy8gY2hlY2sgcHJvZ3JhbSBsb2dpYwotCQlBc3NlcnQuaXNOb3ROdWxsKG9sZEVtYmVkZGVkQ29udGVudFR5cGUsICJQcm9ncmFtIGVycm9yOiBpbnZhbGlkIGNhbGwgZHVyaW5nIG1vZGVsIGluaXRpYWxpemF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gb25jZSB3ZSBrbm93IHRoZSBlbWJlZGRlZCBjb250ZW50IHR5cGUsIHdlIG5lZWQgdG8gc2V0IGl0IGluIHRoZQotCQkvLyBQYWdlRGlyZWN0aXZlQWRhcHRlciAuLi4gdGhlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uIGlzCi0JCS8vIGNyaXRpY2FsIGhlcmUsIHRoZSBkb2MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYnV0IGl0cyBjb250ZW50cyBub3QKLQkJLy8gc2V0IHlldCwKLQkJLy8gYW5kIGFsbCBmYWN0b3JpZXMgbXVzdCBoYXZlIGJlZW4gc2V0IHVwIGFsc28uCi0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCS8vID09PiAvLyBQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikKLQkJLy8gKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkvLyBiZWNhdXNlLCBldmVuIGluIHRoZSBjbG9uZSBjYXNlLCB0aGUgbW9kZWwgaGFzIGJlZW4gcGFyaXRhbGx5Ci0JCS8vIGludGlhbGl6ZWQgd2l0aAotCQkvLyB0aGUgb2xkIGVtYmVkZGVkIHR5cGUgKGR1cmluZyBjcmVhdGVNb2RlbCksIHdlIG5lZWQgdG8gdW5pdGlhbGl6ZQotCQkvLyBwYXJ0cyBvZiBpdCwgYmFzZWQgb24gdGhlIG9sZCAob3IgZGVmYXVsdCkgb25lcwotCQlvbGRFbWJlZGRlZENvbnRlbnRUeXBlLnVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkvLyByZW1lbWJlciwgZW1iZWRkZWQgdHlwZSBmYWN0b3JpZXMgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCB3aGVuCi0JCS8vIGVtYmVkZWRUeXBlIGNoYW5nZWQKLQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKG5ld0VtYmVkZGVkQ29udGVudFR5cGUpOwotCQlpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQl9Ci0JCS8vIGFkZGluZyBsYW5ndWFnZSBoZXJlLCBpbiB0aGlzIGNvbnZpZW5lbnQgY2VudHJhbAotCQkvLyBsb2NhdGlvbiwgYnV0IHNvbWUgb2J2aW91cyByZW5hbWluZyBvciByZWZhY3RvcmluZwotCQkvLyB3b3VsZG4ndCBodXJ0LCBpbiBmdXR1cmUuCi0JCS8vIEkgbmVlZGVkIHRvIGFkZCB0aGlzIGxhbmd1YWdlIHNldHRpbmcgZm9yIEpTUCBGcmFnbWVudCBzdXBwb3J0Ci0JCS8vIE5vdGU6IHRoaXMgaXMgdGhlIG9uZSB0aGF0IGNvdW50cywgc2luY2UgYXQgdGhpcyBwb2ludCwKLQkJLy8gdGhlIG1vZGVsIGhhcyBhbiBJRCwgc28gd2UgY2FuIGxvb2sgdXAgSUZpbGUsIGV0Yy4KLQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobW9kZWwpOwotCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZFR5cGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlEb2N1bWVudCBkb2MgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvYykuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRIYW5kbGVyID0gcGFnZURpcmVjdGl2ZUFkYXB0ZXIuZ2V0RW1iZWRkZWRUeXBlKCk7Ci0JCXJldHVybiBlbWJlZGRlZEhhbmRsZXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyI2luaXRFbWJlZGRlZFR5cGVQcmUob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZVByZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUpTUE1vZGVsTG9hZGVyLnRoaXMuaW5pdEVtYmVkZGVkVHlwZVByZShtb2RlbCwgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRFbWJlZGRlZFR5cGVQcmUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQotCQkvLyBub3RlOiB0aGlzIHdpbGwgY3VycmVudGx5IG9ubHkgd29yayBmb3IgbW9kZWxzIGJhY2tlZCBieSBmaWxlcwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkQ29udGVudFR5cGUgPSBudWxsOwotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQotCQlpZiAoZW1iZWRkZWRDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBnZXRDb250ZW50RGVzY3JpcHRpb24oc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlPYmplY3QgcHJvcCA9IG51bGw7Ci0KLQkJCQlwcm9wID0gZGVzYy5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfRkFNSUxZX0FUVFJJQlVURSk7Ci0JCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCQlpZiAoQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLkhUTUxfRkFNSUxZLmVxdWFscyhwcm9wKSkgewotCQkJCQkJZW1iZWRkZWRDb250ZW50VHlwZSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVGb3IoInRleHQvaHRtbCIpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGVtYmVkZGVkQ29udGVudFR5cGUgPT0gbnVsbCkgewotCi0JCQkJCXByb3AgPSBkZXNjLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSk7Ci0JCQkJCWlmIChwcm9wICE9IG51bGwpIHsKLQkJCQkJCWVtYmVkZGVkQ29udGVudFR5cGUgPSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRm9yKChTdHJpbmcpIHByb3ApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCi0JCWlmIChlbWJlZGRlZENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldEVtYmVkZGVkVHlwZShlbWJlZGRlZENvbnRlbnRUeXBlKTsKLQkJCWVtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB1c2UgZGVmYXVsdCBlbWJlZGRlZFR5cGUgaWYgaXQgY291bGRuJ3QgZGV0ZXJtaW5lIG9uZQotCQkJZW1iZWRkZWRDb250ZW50VHlwZSA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUobW9kZWwpOwotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKGVtYmVkZGVkQ29udGVudFR5cGUpOwotCQkJZW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRFbWJlZGRlZFR5cGVQb3N0KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJLy8gc2hvdWxkIGFscmVhZHkgYmUgaW5pdGlhbGl6ZWQgKGZyb20gaW5pdEVtYmVkZGVkVHlwZVByZSkKLQkJLy8gdmlhIElDb250ZW50RGVzY3JpcHRpb24KLQkJc2V0TGFuZ3VhZ2VJblBhZ2VEaXJlY3RpdmUobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEFzIHBhcnQgb2YgdGhlIG1vZGVsIGNsb25pbmcgcHJvY2VzcywgZW5zdXJlIHRoYXQgdGhlIG5ldyBtb2RlbCBoYXMgdGhlCi0JICogc2FtZSBlbWJlZGRlZCBjb250ZW50IHR5cGUgaGFuZGxlciBhcyB0aGUgb2xkIG1vZGVsLCBhbmQgdGhhdCBpdCBpcwotCSAqIHByb3Blcmx5IGluaXRpYWxpemVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZXhpc3RpbmdFbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUob2xkTW9kZWwpOwotCQlpZiAoZXhpc3RpbmdFbWJlZGRlZFR5cGUgPT0gbnVsbCkgewotCQkJaW5pdEVtYmVkZGVkVHlwZVByZShuZXdNb2RlbCwgbmV3TW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJaW5pdEVtYmVkZGVkVHlwZVBvc3QobmV3TW9kZWwpOwotCQl9Ci0JCWVsc2UgewotCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdFbWJlZGRlZENvbnRlbnRUeXBlID0gZXhpc3RpbmdFbWJlZGRlZFR5cGUubmV3SW5zdGFuY2UoKTsKLQkJCS8vIGluaXRFbWJlZGRlZFR5cGUobmV3TW9kZWwpOwotCQkJaW5pdENsb25lT2ZFbWJlZGRlZFR5cGUobmV3TW9kZWwsIGV4aXN0aW5nRW1iZWRkZWRUeXBlLCBuZXdFbWJlZGRlZENvbnRlbnRUeXBlKTsKLQkJCXNldExhbmd1YWdlSW5QYWdlRGlyZWN0aXZlKG5ld01vZGVsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldExhbmd1YWdlSW5QYWdlRGlyZWN0aXZlKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJaWYgKG5ld01vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbmV3TW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQlTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShuZXdNb2RlbCk7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEhhbmRsZXIgPSBudWxsOwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0hhbmRsZXIgPSBudWxsOwotCQlPYmplY3QgcmVpbml0U3RhdGVEYXRhID0gbW9kZWwuZ2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKCk7Ci0JCWlmIChyZWluaXRTdGF0ZURhdGEgaW5zdGFuY2VvZiBFbWJlZGRlZFR5cGVTdGF0ZURhdGEpIHsKLQkJCUVtYmVkZGVkVHlwZVN0YXRlRGF0YSBvbGRTdGF0ZURhdGEgPSAoRW1iZWRkZWRUeXBlU3RhdGVEYXRhKSByZWluaXRTdGF0ZURhdGE7Ci0JCQlvbGRIYW5kbGVyID0gb2xkU3RhdGVEYXRhLmdldE9sZEhhbmRsZXIoKTsKLQkJCW5ld0hhbmRsZXIgPSBvbGRTdGF0ZURhdGEuZ2V0TmV3SGFuZGxlcigpOwotCQkJLy8gbm90ZS4gV2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSB0aGUgbmV3IGhhbmRsZXIgaW4gdGhlIG1vZGVsJ3MKLQkJCS8vIChkb2N1bWVudHMpIGFkYXB0ZXJzLAotCQkJLy8gc28gbmVlZCBuZWVkIHRvIHVzZSB0aGUgb2xkIG9uZSB0byB1bmRvIHRoZSBvbGQgc3RhdGUgZGF0YQotCQkJcmVJbml0aWFsaXplRW1iZWRkZWRUeXBlKG1vZGVsLCBvbGRIYW5kbGVyLCBuZXdIYW5kbGVyKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGZvciBsYW5ndWFnZSAuLi4gd2Ugc29tZWRheSBNSUdIVCBoYXZlIHRvIGRvIHNvbWV0aGluZwotCQkJLy8gaGVyZSwgYnV0IGZvciBub3csIHdlIGRvbid0IGhhdmUgYW55IG1vZGVsLXNpZGUgbGFuZ3VhZ2UKLQkJCS8vIHNlbnNpdGl2ZSBhZGFwdGVycy4KLQkJfQotCQlyZXR1cm4gc3VwZXIucmVpbml0aWFsaXplKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEpTUE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBKU1BEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCBhbiBJbnB1dFN0cmVhbSBoYXMgbWFyay9yZXNldCBzdXBwb3J0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShJbnB1dFN0cmVhbSBvcmlnaW5hbCkgewotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob3JpZ2luYWwubWFya1N1cHBvcnRlZCgpKQotCQkJcmV0dXJuIG9yaWdpbmFsOwotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0ob3JpZ2luYWwpOwotCX0KLQotCXByb3RlY3RlZCBieXRlW10gZ2V0Qnl0ZXMoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBtYXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBzbWFsbEJ1ZmZlciA9IG5ldyBieXRlW21heF07Ci0JCWJ5dGVbXSByZXR1cm5CdWZmZXIgPSBudWxsOwotCQlpbnQgblJlYWQgPSBpbnB1dFN0cmVhbS5yZWFkKHNtYWxsQnVmZmVyLCAwLCBtYXgpOwotCQlpZiAoblJlYWQgPCBtYXgpIHsKLQkJCS8vIGVtcHR5IGZpbGUgd2lsbCByZXR1cm4gLTE7Ci0JCQlpZiAoblJlYWQgPCAwKQotCQkJCW5SZWFkID0gMDsKLQkJCWJ5dGVbXSBzbWFsbGVyQnVmZmVyID0gbmV3IGJ5dGVbblJlYWRdOwotCQkJU3lzdGVtLmFycmF5Y29weShzbWFsbEJ1ZmZlciwgMCwgc21hbGxlckJ1ZmZlciwgMCwgblJlYWQpOwotCQkJcmV0dXJuQnVmZmVyID0gc21hbGxlckJ1ZmZlcjsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybkJ1ZmZlciA9IHNtYWxsQnVmZmVyOwotCQl9Ci0JCXJldHVybiByZXR1cm5CdWZmZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gc3VwZXIuY3JlYXRlTW9kZWwob2xkTW9kZWwpOwotCQkvLyBGb3IgSlNQcywgdGhlIE1vZGVsUXVlcnlBZGFwdGVyIG11c3QgYmUgImF0dGFjaGVkIiB0byB0aGUgZG9jdW1lbnQKLQkJLy8gYmVmb3JlIGNvbnRlbnQgaXMgc2V0IGluIHRoZSBtb2RlbCwgc28gdGFnbGliIGluaXRpYWxpemF0aW9uIGNhbgotCQkvLyB0YWtlIHBsYWNlLgotCQkvLyBJbiB0aGlzICJjbG9uZSBtb2RlbCIgY2FzZSwgd2UgY3JlYXRlIGEgTW9kZWxRdWVyeSBhZGFwdGVyCi0JCS8vIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIHRoZSBvbGQgZGF0YS4gTm90ZTogSSB0aGluayB0aGlzCi0JCS8vICJmb3JjZWQgZml0IiBvbmx5IHdvcmtzIGhlcmUgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIG9mCi0JCS8vIE1vZGVsUXVlcnlBZGFwdGVyIGRvZXMgbm90Ci0JCS8vIGhhdmUgdG8gYmUgcmVsZWFzZWQuCi0KLQkJTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihtb2RlbCk7Ci0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlciA9PSBudWxsKSB7Ci0JCQltb2RlbFF1ZXJ5QWRhcHRlciA9IGdldE1vZGVsUXVlcnlBZGFwdGVyKG9sZE1vZGVsKTsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCWRvY3VtZW50LmFkZEFkYXB0ZXIobmV3IEpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbChtb2RlbFF1ZXJ5QWRhcHRlci5nZXRDTURvY3VtZW50Q2FjaGUoKSwgbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpLCBtb2RlbFF1ZXJ5QWRhcHRlci5nZXRJZFJlc29sdmVyKCkpKTsKLQotCQl9Ci0KLQotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIE1vZGVsUXVlcnlBZGFwdGVyIGdldE1vZGVsUXVlcnlBZGFwdGVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCi0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzOWYyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLlRhZ1RyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkFic3RyYWN0TW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JKU1AgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyRm9ySlNQKCkgewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKU1BUYWdOYW1lKEpTUFNvdXJjZVBhcnNlciBwYXJzZXIsIFN0cmluZyB0YWduYW1lKSB7Ci0JCUJsb2NrTWFya2VyIGJtID0gbmV3IEJsb2NrTWFya2VyKHRhZ25hbWUsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCB0cnVlKTsKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKGJtKTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IEpTUE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BEb2N1bWVudExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KElTdHJ1Y3R1cmVkTW9kZWwgc20pIHsKLQkJaWYgKHNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKSA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogQ2hlY2sgZm9yIHRhZy90YWd4IGZpbGVzLCBvdGhlcndpc2UgYWRkIHRoZSBKU1AgdHJhbnNsYXRpb24KLQkJCSAqIGZhY3RvcnkgZm9yIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgcG9zc2libGUgc3VidHlwZXMKLQkJCSAqIG9mIEpTUC4KLQkJCSAqLwotCQkJSUNvbnRlbnRUeXBlIHRoaXNDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKHNtLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJCUlDb250ZW50VHlwZSB0YWdDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BUQUcpOwotCQkJaWYgKHRoaXNDb250ZW50VHlwZS5pc0tpbmRPZih0YWdDb250ZW50VHlwZSkpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgVGFnVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCQkJCXNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotLy8JCQkJaWYgKGZhbHNlKSB7Ci0vLwkJCQkJSUNvbnRlbnRUeXBlIHRleHRDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKElDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVCk7Ci0vLwkJCQkJSUNvbnRlbnRUeXBlIGpzcENvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0vLwkJCQkJLyoKLS8vCQkJCQkgKiBUaGlzIElBZGFwdGVyTWFuYWdlciBjYWxsIGlzIHRlbXBvcmFyeSBwbGFjZWhvbGRlciBjb2RlCi0vLwkJCQkJICogdGhhdCBzaG91bGQgbm90IGJlIHJlbGllZCB1cG9uIGluIGFueSB3YXkhCi0vLwkJCQkJICovCi0vLwkJCQkJaWYgKHRoaXNDb250ZW50VHlwZS5pc0tpbmRPZihqc3BDb250ZW50VHlwZSkpIHsKLS8vCQkJCQkJSUNvbnRlbnRUeXBlIHRlc3RDb250ZW50VHlwZSA9IHRoaXNDb250ZW50VHlwZTsKLS8vCQkJCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBob2xkRmFjdG9yeSA9IG51bGw7Ci0vLwkJCQkJCXdoaWxlICghdGVzdENvbnRlbnRUeXBlLmVxdWFscyh0ZXh0Q29udGVudFR5cGUpICYmIGhvbGRGYWN0b3J5ID09IG51bGwpIHsKLS8vCQkJCQkJCWhvbGRGYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0ZXN0Q29udGVudFR5cGUuZ2V0SWQoKSwgSUpTUFRyYW5zbGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0vLwkJCQkJCQl0ZXN0Q29udGVudFR5cGUgPSB0ZXN0Q29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCWZhY3RvcnkgPSBuZXcgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCQkJCX0KLQotCQkJCXNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JUYWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2I1ZjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyRm9yVGFnIGV4dGVuZHMgTW9kZWxIYW5kbGVyRm9ySlNQIHsKLQotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0Jc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5tb2RlbGhhbmRsZXIudGFnIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyRm9yVGFnKCkgewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IFRhZ01vZGVsTG9hZGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvVGFnTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1RhZ01vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxM2RhNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvVGFnTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLQotcHVibGljIGNsYXNzIFRhZ01vZGVsTG9hZGVyIGV4dGVuZHMgSlNQTW9kZWxMb2FkZXIgewotCi0JcHVibGljIFRhZ01vZGVsTG9hZGVyKCkgewotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gc3VwZXIuZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCQkvKgotCQkgKiBSZXBsYWNlIHRoZSBkZWZhdWx0IEpTUCBtb2RlbCBxdWVyeSBieSB1c2luZyBvdXIgb3duIGZhY3RvcnkKLQkJICovCi0KLQkJSXRlcmF0b3IgaSA9IGZhY3Rvcmllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWlmICgoKElOb2RlQWRhcHRlckZhY3RvcnkpIGkubmV4dCgpKS5pc0ZhY3RvcnlGb3JUeXBlKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKSkgewotCQkJCWkucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JUYWcoKSk7Ci0JCXJldHVybiBmYWN0b3JpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzUwZTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwgZXh0ZW5kcyBNb2RlbFF1ZXJ5QWRhcHRlckltcGwgewotCXB1YmxpYyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5LCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKGNtRG9jdW1lbnRDYWNoZSwgbW9kZWxRdWVyeSwgaWRSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4OWY1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSlNQTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbFF1ZXJ5Q01Qcm92aWRlcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyCi0JICovCi0JcHVibGljIEpTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKCkgewotCQlzdXBlcihuZXcgSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3N2E1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1BDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUNNUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IHByb3ZpZGVyIGZvciBIVE1MIGFuZCBKU1AgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Q01Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ01Eb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBET00gTm9kZS4gb3IgbnVsbCBpZiBubwotCSAqIENNRG9jdW1lbnQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpIHsKLQkJQ01Eb2N1bWVudCBqY21kb2MgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpOwotCQkJU3RyaW5nIG1vZGVsUGF0aCA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJaWYgKG1vZGVsUGF0aCAhPSBudWxsICYmICFJTW9kZWxNYW5hZ2VyLlVOTUFOQUdFRF9NT0RFTC5lcXVhbHMobW9kZWxQYXRoKSkgewotCQkJCWZsb2F0IHZlcnNpb24gPSBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRKU1BWZXJzaW9uKG5ldyBQYXRoKG1vZGVsUGF0aCkpOwotCQkJCWpjbWRvYyA9IEpTUENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQodmVyc2lvbik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGpjbWRvYyA9PSBudWxsKSB7Ci0JCQlqY21kb2MgPSBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0JCX0KLQkJCi0JCUNNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0KLQkJCQkvLyB0ZXN0IHRvIHNlZSBpZiB0aGlzIG5vZGUgYmVsb25ncyB0byBKU1AncyBDTURvY3VtZW50IChjYXNlCi0JCQkJLy8gc2Vuc2l0aXZlKQotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlYyA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgamNtZG9jLmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQkJCQlpZiAoZGVjICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gamNtZG9jOwotCQkJCX0KLQkJCX0KLQotCQkJU3RyaW5nIHByZWZpeCA9IG5vZGUuZ2V0UHJlZml4KCk7Ci0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCAmJiBwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwICYmIG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCS8vIGNoZWNrIHBvc2l0aW9uIGRlcGVuZGVudAotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgdGxkbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcih4bWxOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQlpZiAodGxkbWdyICE9IG51bGwpIHsKLQkJCQkJTGlzdCBkb2N1bWVudHMgPSB0bGRtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKG5vZGUuZ2V0UHJlZml4KCksIHhtbE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCS8vIHRoZXJlIHNob3VsZG4ndCBiZSBtb3JlIHRoYW4gb25lIGNtZG9jdW1lbnQgcmV0dXJuZWQKLQkJCQkJaWYgKGRvY3VtZW50cyAhPSBudWxsICYmIGRvY3VtZW50cy5zaXplKCkgPiAwKQotCQkJCQkJcmVzdWx0ID0gKENNRG9jdW1lbnQpIGRvY3VtZW50cy5nZXQoMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWU1NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLk1vZGVsUXVlcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgewotCi0JLy8gSVNTVUU6IGpzcE1vZGVsIGRvZXNuJ3Qgc2VlbSB1c2VkPwotCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIGpzcE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZW1iZWRkZWRNb2RlbFF1ZXJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIEpTUE1vZGVsUXVlcnlJbXBsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyKG5ldyBKU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlcigpKSk7Ci0JCWpzcE1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsUXVlcnkjZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IHN1cGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkoZWxlbWVudCk7Ci0JCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsUXVlcnkjZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSkKLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpIHsKLQkJQ01Eb2N1bWVudCBkb2MgPSBzdXBlci5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlKTsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KG5vZGUpOwotCQkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlkb2MgPSBxdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZG9jOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2RlbFF1ZXJ5I2dldENNTm9kZShOb2RlKQotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0Q01Ob2RlKE5vZGUgbm9kZSkgewotCQlDTU5vZGUgcmVzdWx0ID0gc3VwZXIuZ2V0Q01Ob2RlKG5vZGUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkobm9kZSk7Ci0JCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHF1ZXJ5LmdldENNTm9kZShub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKSB7Ci0JCU1vZGVsUXVlcnkgZW1xID0gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KGVsZW1lbnQpOwotCQlpZiAoZW1xICE9IG51bGwpCi0JCQlyZXR1cm4gZW1xLmdldEF2YWlsYWJsZUNvbnRlbnQoZWxlbWVudCwgZWQsIGluY2x1ZGVPcHRpb25zKTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldEF2YWlsYWJsZUNvbnRlbnQoZWxlbWVudCwgZWQsIGluY2x1ZGVPcHRpb25zKTsKLQl9Ci0KLQkvLyBJU1NVRTogc2hvdWxkbid0IHRoaXMgYmUgcHJpdmF0ZT8KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCU1vZGVsUXVlcnkgZW1iZWRkZWRNb2RlbFF1ZXJ5ID0gbnVsbDsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsgCi0JCQlOb2RlIG93bmVyTm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKSB7Ci0JCQkJLy8gdGhlbiBtdXN0IGJlIHRoZSBkb2N1bWVudCBpdHNlbGYKLQkJCQlvd25lck5vZGUgPSBub2RlOyAKLQkJCX0KLQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIG93bmVyTm9kZSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAocGFnZURpcmVjdGl2ZUFkYXB0ZXIgIT0gbnVsbCkgewotCi0JCQkJU3RyaW5nIGVmZmVjdGl2ZUNvbnRlbnRUeXBlID0gbnVsbDsKLQkJCQlNb2RlbFF1ZXJ5IHBvdGVudGlhbE1vZGVsUXVlcnlPYmplY3QgPSBudWxsOwotCi0JCQkJU3RyaW5nIGZhbWlseUlkID0gcGFnZURpcmVjdGl2ZUFkYXB0ZXIuZ2V0RW1iZWRkZWRUeXBlKCkuZ2V0RmFtaWx5SWQoKTsKLQkJCQlpZiAoQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLkhUTUxfRkFNSUxZLmVxdWFscyhmYW1pbHlJZCkpIHsKLQkJCQkJZWZmZWN0aXZlQ29udGVudFR5cGUgPSAidGV4dC9odG1sIjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVmZmVjdGl2ZUNvbnRlbnRUeXBlID0gcGFnZURpcmVjdGl2ZUFkYXB0ZXIuZ2V0Q29udGVudFR5cGUoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcG90ZW50aWFsTW9kZWxRdWVyeU9iamVjdCA9IChNb2RlbFF1ZXJ5KSBlbWJlZGRlZE1vZGVsUXVlcmllcy5nZXQoZWZmZWN0aXZlQ29udGVudFR5cGUpOwotCQkJCQotCQkJCWlmIChwb3RlbnRpYWxNb2RlbFF1ZXJ5T2JqZWN0ID09IG51bGwpIHsKLQkJCQkJTW9kZWxRdWVyeUFkYXB0ZXIgZW1iZWRkZWRBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSBwYWdlRGlyZWN0aXZlQWRhcHRlci5hZGFwdCgoSU5vZGVOb3RpZmllcikgbm9kZSwgTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJCQlpZiAoZW1iZWRkZWRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCS8vIHdlIHdpbGwgY2FjaGUgb25lIG1vZGVsIHF1ZXJ5IHBlciBjb250ZW50IHR5cGUKLQkJCQkJCWVtYmVkZGVkTW9kZWxRdWVyeSA9IGVtYmVkZGVkQWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCk7Ci0JCQkJCQllbWJlZGRlZE1vZGVsUXVlcmllcy5wdXQoZWZmZWN0aXZlQ29udGVudFR5cGUsIGVtYmVkZGVkTW9kZWxRdWVyeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVtYmVkZGVkTW9kZWxRdWVyeSA9IHBvdGVudGlhbE1vZGVsUXVlcnlPYmplY3Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbWJlZGRlZE1vZGVsUXVlcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeSNnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKG9yZy53M2MuZG9tLkF0dHIpCi0JICovCi0JcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpIHsKLQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiByZXN1bHQgPSBzdXBlci5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkoYXR0cik7Ci0JCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHF1ZXJ5LmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogTk9UIEFQSSAtLSB0aGlzIGlzIHByb3ZpZGVkLCBhbmQgaXMgcHVibGljLCBvbmx5IHRvIG1ha2Ugc29tZSBKVW5pdCB0ZXN0aW5nIAotCSAqIG1vcmUgc3RyYWlnaHRmb3J3YXJkLiBJdCB3aWxsIGJlIGNoYW5nZWQgaW4gZnV0dXJlLCBhbmQgZnJvbSByZWxlYXNlIHRvIHJlbGVhc2UuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnkgaW50ZXJuYWxUZXN0T25seV9nZXRFbWJlZGRlZE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZE1vZGVsUXVlcnkobm9kZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTQ5Nzc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuWE1MQ2F0YWxvZ0lkUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbCBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBzdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AoKSB7Ci0JCXRoaXMoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyS2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQKE9iamVjdCBrZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihrZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5jcmVhdGVBZGFwdGVyIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVySW1wbCA9PSBudWxsKSB7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSB0YXJnZXQ7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHN0YXRlTm90aWZpZXIgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCi0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQLi4uIGJhc2VMb2NhdGlvbiA6ICIgKyByZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvKioKLQkJCQkgKiBYTUxDYXRhbG9nSWRSZXNvbHZlciBjdXJyZW50bHkgcmVxdWlyZXMgYSBmaWxlc3lzdGVtCi0JCQkJICogbG9jYXRpb24gc3RyaW5nLiBDdXN0b21hcmlseSB0aGlzIHdpbGwgYmUgd2hhdCBpcyBpbiB0aGUKLQkJCQkgKiBkZXByZWNhdGVkIFNTRSBVUklSZXNvbHZlciBhbmQgcmVxdWlyZWQgYnkgdGhlIENvbW1vbiBVUkkKLQkJCQkgKiBSZXNvbHZlci4KLQkJCQkgKi8KLQkJCQlVUklSZXNvbHZlciBpZFJlc29sdmVyID0gbnVsbDsKLQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogMjAzNjQ5IC0gdGhpcyBibG9jayBtYXkgYmUgbmVjZXNzYXJ5IGR1ZSB0byBvcmRlcmluZyBvZgotCQkJCQkgKiBzZXR0aW5nIHRoZSByZXNvbHZlciBpbnRvIHRoZSBtb2RlbAotCQkJCQkgKi8KLQkJCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJCVN0cmluZyBtb2RlbHNCYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkJaWYgKG1vZGVsc0Jhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlGaWxlIGZpbGUgPSBuZXcgUGF0aChtb2RlbHNCYXNlTG9jYXRpb24pLnRvRmlsZSgpOwotCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJCQkJSVJlc291cmNlIGRlcml2ZWRSZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQkJCQkJZGVyaXZlZFJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWRlcml2ZWRSZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsKLQkJCQkJCQlJUGF0aCBkZXJpdmVkUGF0aCA9IGRlcml2ZWRSZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCWlmIChkZXJpdmVkUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGRlcml2ZWRQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlVUkkgdXJpID0gZGVyaXZlZFJlc291cmNlLmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQkJCQkJYmFzZUxvY2F0aW9uID0gdXJpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZihiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsc0Jhc2VMb2NhdGlvbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbnVsbCk7Ci0JCQkJfQotCi0JCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gY3JlYXRlTW9kZWxRdWVyeShtb2RlbCwgaWRSZXNvbHZlcik7Ci0JCQkJbW9kZWxRdWVyeS5zZXRFZGl0TW9kZShNb2RlbFF1ZXJ5LkVESVRfTU9ERV9VTkNPTlNUUkFJTkVEKTsKLQkJCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwgPSBuZXcgSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKG5ldyBDTURvY3VtZW50Q2FjaGUoKSwgbW9kZWxRdWVyeSwgaWRSZXNvbHZlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQl9Ci0KLQlNb2RlbFF1ZXJ5IGNyZWF0ZU1vZGVsUXVlcnkoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBKU1BNb2RlbFF1ZXJ5SW1wbChtb2RlbCwgcmVzb2x2ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJLy8gaWYgb2xkTW9kZWwgIT0gbmV3TW9kZWwsIGJhZCB0aGluZ3MgbWlnaHQgaGFwcGVuIHdpdGggdGhlIGFkYXB0ZXIKLQkJc3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCXN0YXRlTm90aWZpZXIgPSBuZXdNb2RlbDsKLQkJdXBkYXRlUmVzb2x2ZXIoc3RhdGVOb3RpZmllcik7Ci0JCXN0YXRlTm90aWZpZXIuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAoc3RhdGVOb3RpZmllciAhPSBudWxsKSB7Ci0JCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlzdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVySW1wbCAhPSBudWxsKSB7Ci0JCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb2x2ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCUlGaWxlIGJhc2VGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKSk7Ci0JCWlmIChiYXNlRmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoYmFzZUZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsICYmIGJhc2VGaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCW1vZGVsUXVlcnlBZGFwdGVySW1wbC5zZXRJZFJlc29sdmVyKG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihiYXNlTG9jYXRpb24sIG1vZGVsLmdldFJlc29sdmVyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXVwZGF0ZVJlc29sdmVyKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JUYWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzYzhlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLk1vZGVsUXVlcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcjsKLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclRhZyBleHRlbmRzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCB7Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnKCkgewotCX0KLQotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JUYWcoT2JqZWN0IGtleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGtleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JUYWcoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQlNb2RlbFF1ZXJ5IGNyZWF0ZU1vZGVsUXVlcnkoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5SW1wbChuZXcgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcihuZXcgVGFnTW9kZWxRdWVyeUNNUHJvdmlkZXIoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9UYWdNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1RhZ01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTE0NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1RhZ01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IHByb3ZpZGVyIGZvciBIVE1MIGFuZCBKU1AgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgVGFnTW9kZWxRdWVyeUNNUHJvdmlkZXIgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Q01Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgVGFnTW9kZWxRdWVyeUNNUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ01Eb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBET00gTm9kZS4gb3IgbnVsbCBpZiBubwotCSAqIENNRG9jdW1lbnQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpIHsKLQkJQ01Eb2N1bWVudCB0YWdkb2MgPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuVEFHMjBfRE9DX1RZUEUpOwotCi0JCUNNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0KLQkJCQkvLyB0ZXN0IHRvIHNlZSBpZiB0aGlzIG5vZGUgYmVsb25ncyB0byBKU1AncyBDTURvY3VtZW50IChjYXNlCi0JCQkJLy8gc2Vuc2l0aXZlKQotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlYyA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgdGFnZG9jLmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQkJCQlpZiAoZGVjICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gdGFnZG9jOwotCQkJCX0KLQkJCX0KLQotCQkJU3RyaW5nIHByZWZpeCA9IG5vZGUuZ2V0UHJlZml4KCk7Ci0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCAmJiBwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwICYmIG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCS8vIGNoZWNrIHBvc2l0aW9uIGRlcGVuZGVudAotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgdGxkbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcih4bWxOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQlpZiAodGxkbWdyICE9IG51bGwpIHsKLQkJCQkJTGlzdCBkb2N1bWVudHMgPSB0bGRtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKG5vZGUuZ2V0UHJlZml4KCksIHhtbE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCS8vIHRoZXJlIHNob3VsZG4ndCBiZSBtb3JlIHRoYW4gb25lIGNtZG9jdW1lbnQgcmV0dXJuZWQKLQkJCQkJaWYgKGRvY3VtZW50cyAhPSBudWxsICYmIGRvY3VtZW50cy5zaXplKCkgPiAwKQotCQkJCQkJcmVzdWx0ID0gKENNRG9jdW1lbnQpIGRvY3VtZW50cy5nZXQoMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRhZ2RvYzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2M2E3MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCS8qKgotCSAqIEpTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gVGhpcyBpcyBhIGxhbmd1YWdlIHNwZWNpZmljIG1ldGhvZCAoZS5nLiBIVE1MLCBKYXZhLCBQcm9sb2csIGV0Yy4pIHNvCi0JLy8gY291bGQvc2hvdWxkIGJlIG1hZGUgY29uZmlndXJhYmxlLgotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQUmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiMDY0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ29yZU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpTUFJlUGFyc2VyIGV4dGVuZHMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JLyoqCi0JICogQWxsb3cgYSByZXBhcnNlciB0byBjaGVjayBmb3IgZXh0cmEgc3ludGFjdGljIGNhc2VzIHRoYXQgcmVxdWlyZQotCSAqIHBhcnNpbmcgYmV5b25kIHRoZSBmbGF0Tm9kZSBib3VuZGFyeS4KLQkgKiAKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFkZHMgSlNQIGxhbmd1YWdlIG1hcmtlcnMgKGNvbW1lbnRzIGFyZSBoYW5kbGVkCi0JICogZWxzZXdoZXJlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3VwZXIuY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpOwotCQkvLyBOb25lIG9mIHRoZSBzdXBlcmNsYXNzJyBjYXNlcyB3ZXJlIHZhbGlkLCBzbyBjaGVjayBmb3IgSlNQIGNhc2VzCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JKU1AoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEEgY2hhbmdlIHRvIGEgSlNQIHRhZyBjYW4gcmVzdWx0IGluIGFsbCBiZWluZyByZXBhcnNlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9ySlNQKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlPSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlISIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIiU+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIGEgY29tbWVudCBzdGFydCBvciBlbmQgdGFnIGlzIGJlaW5nIGFkZGVkIG9yIGRlbGV0ZWQsIHdlJ2xsIHJlc2NhbgotCSAqIHRoZSB3aG9sZSBkb2N1bWVudC4gVGhlIHJlYXNvbiBpcyB0aGF0IGNvbnRlbnQgdGhhdCBpcyByZXZlYWxlZCBvcgotCSAqIGNvbW1lbnRlZCBvdXQgY2FuIGVmZmVjdCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHJlc3Qgb2YgdGhlCi0JICogZG9jdW1lbnQuIE5vdGU6IGZvciBub3cgdGhpcyBpcyB2ZXJ5IFhNTC9KU1Agc3BlY2lmaWMsIGNhbgotCSAqIHJlZmFjdG9yL2ltcHJvdmUgbGF0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ29tbWVudHMoKSB7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3VwZXIuY2hlY2tGb3JDb21tZW50cygpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCItLSU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gd2UnbGwgYWxzbyBjaGVjayBmb3IgdGhlc2UgZGVnZW5lcmF0ZSBjYXNlcwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JS0tLSU+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBjb3JlIHJlcGFyc2luZyBtZXRob2QgLi4uIGFmdGVyIHRoZSBkaXJ0eSBzdGFydCBhbmQgZGlydHkgZW5kIGhhdmUKLQkgKiBiZWVuIGNhbGN1bGF0ZWQgZWxzZXdoZXJlLiAtIHRoaXMgbWV0aG9kIG92ZXJyaWRlcywgZG9lcyBub3QgZXh0ZW5kCi0JICogc3VwZXIncyBtZXRob2QuIGNoYW5nZXMvZml4ZXMgdG8gc3VwZXIgbWF5IGhhdmUgdG8gYmUgbWFkZSBoZXJlIGFzCi0JICogd2VsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IHJlc2NhblN0YXJ0ID0gLTE7Ci0JCWludCByZXNjYW5FbmQgPSAtMTsKLQkJYm9vbGVhbiBmaXJzdFRpbWUgPSBmYWxzZTsKLQkJYm9vbGVhbiBkZXRlY3RlZEJyZWFraW5nQ2hhbmdlID0gZmFsc2U7Ci0KLQkJLy8KLQkJLy8gInNhdmUiIHRoZSBvbGROb2RlcyAodGhhdCBtYXkgYmUgcmVwbGFjZWQpIGluIGEgbGlzdAotCQlDb3JlTm9kZUxpc3Qgb2xkTm9kZXMgPSBmb3JtT2xkTm9kZXMoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCi0JCWlmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG9sZE5vZGVzKSB8fCBpc0JyZWFraW5nV2l0aE5lc3RlZFRhZyhkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCkpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1RhZ2xpYnMpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXBhcnNlOiBpcyB0YWdsaWIgb3IgaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JCQlkZXRlY3RlZEJyZWFraW5nQ2hhbmdlID0gdHJ1ZTsKLQkJCXJlc2NhblN0YXJ0ID0gMDsKLQkJCXJlc2NhbkVuZCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCW9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJY2xlYXJUYWdsaWJJbmZvKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZGlydHlTdGFydCA9PSBudWxsIHx8IGRpcnR5RW5kID09IG51bGwpIHsKLQkJCS8vIGRpcnR5U3RhcnQgb3IgZGlydHkgZW5kIGFyZSBudWxsLCB0aGVuIHRoYXQgbWVhbnMgd2UgZGlkbid0Ci0JCQkvLyBoYXZlIGEKLQkJCS8vIGNhY2hlZCBub2RlLCB3aGljaCBtZWFucyB3ZSBoYXZlIGFuIGVtcHR5IGRvY3VtZW50LCBzbyB3ZQotCQkJLy8ganVzdCBuZWVkIHRvIHJlc2NhbiB0aGUgY2hhbmdlcwotCQkJcmVzY2FuU3RhcnQgPSAwOwotCQkJcmVzY2FuRW5kID0gZkNoYW5nZXMubGVuZ3RoKCk7Ci0JCQlmaXJzdFRpbWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2V0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZXNjYW4KLQkJCXJlc2NhblN0YXJ0ID0gZGlydHlTdGFydC5nZXRTdGFydCgpOwotCQkJLy8KLQkJCS8vIHNldCB0aGUgZW5kIG9mIHRoZSB0ZXh0IHRvIHJlc2NhbgotCQkJLy8gbm90aWNlIHdlIHVzZSB0aGUgc2FtZSByYXRpb25hbGUgYXMgZm9yIHRoZSByZXNjYW5TdGFydCwKLQkJCS8vIHdpdGggdGhlIGFkZGVkIGNhdmVhdCB0aGF0IGxlbmd0aCBoYXMgdG8gYmUgYWRkZWQgdG8gaXQsCi0JCQkvLyB0byBjb21wZW5zYXRlIGZvciB0aGUgbmV3IHRleHQgd2hpY2ggaGFzIGJlZW4gYWRkZWQgb3IgZGVsZXRlZC4KLQkJCS8vIElmIGNoYW5nZXMgaGFzIHplcm8gbGVuZ3RoLCB0aGVuICJsZW5ndGgiIHdpbGwgYmUgbmVnYXRpdmUsCi0JCQkvLyBzaW5jZQotCQkJLy8gd2UgYXJlIGRlbGV0aW5nIHRleHQuIE90aGVyd2lzZSwgdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJCS8vIHdoYXQncyBzZWxlY3RlZCB0byBiZSByZXBsYWNlZCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IHRleHQuCi0JCQlyZXNjYW5FbmQgPSBkaXJ0eUVuZC5nZXRFbmQoKSArIGZMZW5ndGhEaWZmZXJlbmNlOwotCQl9Ci0KLQkJLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgb2xkIHN0dWZmICJzYXZlZCIgYXdheSwgdXBkYXRlIHRoZSBkb2N1bWVudAotCQkvLyB3aXRoIHRoZSBjaGFuZ2VzLgotCQlmU3RydWN0dXJlZERvY3VtZW50LnVwZGF0ZURvY3VtZW50RGF0YShmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZDaGFuZ2VzKTsKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tIG5vdyB0aGUgcmVhbCB3b3JrCi0JCXJlc3VsdCA9IGNvcmVfcmVwYXJzZShyZXNjYW5TdGFydCwgcmVzY2FuRW5kLCBvbGROb2RlcywgZmlyc3RUaW1lKTsKLQkJLy8KLQotCQkvLyBpZiB3ZSBkaWQgbm90IGRldGVjdCBhIGJyZWFraW5nIHR5cGUgb2YgY2hhbmdlIGF0IHRoZSBiZWdpbm5pbmcsCi0JCS8vIGJ1dAotCQkvLyBkbyBub3csIHRoZW4gcmVwYXJzZSBhbGwhIElmIHdlIGRpZCBkZXRlY3QgdGhlbSwgdGhlbiB3ZSBtYXkgb3IgbWF5Ci0JCS8vIG5vdCBkZXRlY3QgYWdhaW4sIGJ1dCBwcmVzdW1hYmx5IHdlJ3ZlIGFscmVhZHkgc2V0IHVwIHRvIHJlLXBhcnNlZAotCQkvLyBldmVydGhpbmcsIHNvIG5vIG5lZWQgdG8gZG8gYWdhaW4uCi0JCWlmICgoIWRldGVjdGVkQnJlYWtpbmdDaGFuZ2UpICYmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG9sZE5vZGVzKSkpIHsKLQkJCWNsZWFyVGFnbGliSW5mbygpOwotCQkJLy8gcmVwYXJzZSBhbGwKLQkJCW9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJcmVzdWx0ID0gY29yZV9yZXBhcnNlKDAsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCksIG9sZE5vZGVzLCBmaXJzdFRpbWUpOwotCQl9Ci0KLQkJLy8gZXZlbnQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgaW5jYXNlIHRoZXJlIGlzCi0JCS8vIHNvbWUgb3B0aW1pemF0aW9uIHRoZXkgY2FuIGRvCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcmVnaW9ucyBnaXZlbiwgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiBhCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgY29udGFpbiByZWdpb25zIHRoYXQgY291bGQgYWx0ZXIgdGhlCi0JICogYmVoYXZpb3Igb2YgdGhlIHBhcnNlciBvciB0aGUgcGFyc2luZyBvZiBhcmVhcyBvdXRzaWRlIG9mIHRoZSByZWdpb25zCi0JICogZ2l2ZW4uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtpbmdDaGFuZ2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlyZXR1cm4gaXNUYWdsaWJPckluY2x1ZGUobm9kZSwgcmVnaW9ucykgfHwgaXNKc3BSb290KHJlZ2lvbnMpOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZ2lvbnMgZ2l2ZW4sIHJlcHJlc2VudGluZyB0aGUgcmVnaW9ucyB0b3VjaGVkIGJ5IGEKLQkgKiB0ZXh0IGNoYW5nZSBoYXZlOiAxKSAuLi5hbiBpbnNlcnRpb24gYXQgdGhlIHRleHRFbmRPZmZzZXQgb2YgYW4KLQkgKiBYTUxfVEFHX09QRU4gdGhhdCdzIGluIGl0J3Mgb3duIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kIHByZWNlZGVkCi0JICogYnkgYW4gdW5lbmRlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIDIpIC4uLmEgZGVsZXRpb24gaGFwcGVuaW5nIGluCi0JICogYW4gWE1MX0VNUFRZX1RBR19DTE9TRSB0aGF0IGVuZHMgYSBJVGV4dFJlZ2lvbkNvbnRhaW5lciAzKSAuLi5hbgotCSAqIGluc2VydGlvbiBoYXBwZW5pbmcgd2l0aCBhICcgPCcgY2hhcmFjdGVyIHNvbWV3aGVyZSBpbiBhbiBYTUwgYXR0cmlidXRlCi0JICogbmFtZSBvciB2YWx1ZSA0KSAuLi5hIGRlbGV0aW9uIG9mIGEgbm9ybWFsIFhNTF9UQUdfQ0xPU0Ugc2luY2UKLQkgKiBzdWJzZXF1ZW50IHRhZ3MgYmVjb21lIGF0dHJpYnV0ZSB2YWx1ZXMKLQkgKi8KLQotCXByaXZhdGUgYm9vbGVhbiBpc0JyZWFraW5nV2l0aE5lc3RlZFRhZyhib29sZWFuIGNoYW5nZXNJbmNsdWRlQV9sdCwgYm9vbGVhbiBkZWxzSW5jbHVkZUFfZ3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gcGFyZW50LmdldFByZXZpb3VzKCk7Ci0JCS8vIGNhc2UgMSB0ZXN0Ci0JCWlmIChwYXJlbnQuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgKHByZXZpb3VzID09IG51bGwgfHwgKCFwcmV2aW91cy5pc0VuZGVkKCkgfHwgcHJldmlvdXMuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQkvLyBjYXNlIDIgdGVzdAotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uOwotCQkJSVRleHRSZWdpb24gaW50ZXJuYWwgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpLmdldChjb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCQkJaWYgKGludGVybmFsLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFICYmIGNvbnRhaW5lci5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDIpCi0JCQkJaW50ZXJuYWwgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpLmdldChjb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKSAtIDIpOwotCQkJaWYgKGludGVybmFsLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGNhc2UgMyB0ZXN0Ci0JCWlmIChjaGFuZ2VzSW5jbHVkZUFfbHQgJiYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJLy8gY2FzZSA0IHRlc3QKLQkJaWYgKGRlbHNJbmNsdWRlQV9ndCAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZ2lvbnMgZ2l2ZW4sIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgYQotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGluY2x1ZGVzIGEganNwOnJvb3QgdGFnCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSnNwUm9vdChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlyZXR1cm4gcmVnaW9ucy5zaXplKCkgPiAxICYmIHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiAmJiByZWdpb25zLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUU7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcmVnaW9ucyBnaXZlbiwgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiBhCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaW5jbHVkZXMgYSB2YWxpZCB0YWdsaWIgZGlyZWN0aXZlIG9yIGluY2x1ZGUKLQkgKiBkaXJlY3RpdmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUYWdsaWJPckluY2x1ZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlib29sZWFuIHNpemVBbmRUeXBlc01hdGNoID0gKHJlZ2lvbnMuc2l6ZSgpID4gMSkgJiYgKHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpICYmIChyZWdpb25zLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOIHx8IHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTik7Ci0JCWlmICghc2l6ZUFuZFR5cGVzTWF0Y2gpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IG5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlyZXR1cm4gc2l6ZUFuZFR5cGVzTWF0Y2ggJiYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVEFHTElCKSB8fCBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLklOQ0xVREUpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyVGFnbGliSW5mbygpIHsKLQkJaWYgKERlYnVnLmRlYnVnVGFnbGlicykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2xlYXJpbmcgdGFnbGliIGluZm8iKTsgLy8kTk9OLU5MUy0xJAotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikKLQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBwYXJzZXIpLnJlc2V0SGFuZGxlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNCcmVha2luZ0NoYW5nZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBsaXN0KSB7Ci0JCWJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCWlmIChpc0JyZWFraW5nQ2hhbmdlKG5vZGUsIG5vZGUuZ2V0UmVnaW9ucygpKSkgewotCQkJCWNvbnRhaW5zID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbnM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZERpcnR5RW5kKGludCBlbmQpIHsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IHN1cGVyLmZpbmREaXJ0eUVuZChlbmQpOwotCi0JCS8vIGlmIG5vdCB3ZWxsIGZvcm1lZCwgZ2V0IG9uZSBwYXN0LCBpZiBpdHMgbm90IG51bGwKLQotCQkvLyBub3csIGlmIGFueSBvZiB0by1iZS1zY2FubmVkIGZsYXRub2RlcyBhcmUgdGhlIHN0YXJ0IG9mIGEganNwCi0JCS8vIHJlZ2lvbiwgd2UnbGwKLQkJLy8gcmVwYXJzZSBhbGwgdGhlIHdheSB0byB0aGUgZW5kLCB0byBiZSBzdXJlIHdlIGRldGVjdCBlbWJlZGRlZAotCQkvLyByZWdpb25zIChvciBub3QtZW1iZWRkZWQgcmVnaW9ucykgY29ycmVjdGx5LgotCQkvLyBub3RpY2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBpZiB3ZSdyZSBvbmx5IHByb2Nlc3Npbmcgb25lIG5vZGUuCi0JCS8vIG5vdGljZSB0b28gd2UgaGF2ZSBhIHN0cm9uZyBhc3N1bXB0aW9uIGhlcmUgdGhhdCBkaXJ0eVN0YXJ0IGhhcwotCQkvLyBhbHJlYWR5IGJlZW4gZm91bmQhCi0JCS8vCi0JCS8vIG5vdGUgdGhhdCBkaXJ0eUVuZCBpcyBub3QgY2hlY2tlZCBpbiB0aGUgZG8tYmxvY2sgYmVsb3csIHNvIHdlJ2xsCi0JCS8vIGNoZWNrIGl0IGZpcnN0LgotCQlpZiAoaXNKU1BFbWJlZGRlZFN0YXJ0T3JFbmQocmVzdWx0KSkgewotCQkJcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3aGVuIGVuZCBub2RlIGFuZCBzdGFydCBub2RlIGFyZSB0aGUgc2FtZSwgd2Ugb25seSBuZWVkIHRoZQotCQkJLy8gYWJvdmUKLQkJCS8vIGNoZWNrLCBvdGhlcndpc2UsIHRoZXJlJ3MgYSBmZXcgY2FzZXMgdGhhdCB3ZSdsbCBzZWFyY2ggdGhlCi0JCQkvLyByZXN0IG9mIHRoZQotCQkJLy8gZmxhdG5vZGVzIG5lZWRsZXNzbHkuCi0JCQlpZiAocmVzdWx0ICE9IGRpcnR5U3RhcnQpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNlYXJjaE5vZGUgPSBkaXJ0eVN0YXJ0OwotCQkJCWRvIHsKLQkJCQkJaWYgKGlzSlNQRW1iZWRkZWRTdGFydE9yRW5kKHNlYXJjaE5vZGUpKSB7Ci0JCQkJCQlyZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2VhcmNoTm9kZSA9IHNlYXJjaE5vZGUuZ2V0TmV4dCgpOwotCQkJCQl9Ci0JCQkJCS8vIGlmIHdlIGdldCB0byB0aGUgY3VycmVudCBkaXJ0eSBlbmQsIG9yIGVuZCBvZgotCQkJCQkvLyBmbGF0bm9kZXMsIHdpdGhvdXQgZmluZGluZyBKU1AgcmVnaW9uIHRoZW4gd2UKLQkJCQkJLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBmdXJ0aGVyCi0JCQkJfQotCQkJCXdoaWxlICgoc2VhcmNoTm9kZSAhPSByZXN1bHQpICYmIChzZWFyY2hOb2RlICE9IG51bGwpKTsKLQkJCX0KLQkJfQotCQkvLyByZXN1bHQgc2hvdWxkIG5ldmVyIGJlIG51bGwsIGJ1dCBjYWNoZWROb2RlIG5lZWRzIHRvIGJlIHByb3RlY3RlZAotCQkvLyBmcm9tIGJlaW5nIGNoYW5nZWQgdG8gbnVsbAotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWRpcnR5RW5kID0gcmVzdWx0OwotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtpbmdXaXRoTmVzdGVkVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWJvb2xlYW4gY2hhbmdlc0luY2x1ZGVBX2x0ID0gZkNoYW5nZXMgIT0gbnVsbCAmJiBmQ2hhbmdlcy5pbmRleE9mKCc8JykgPj0gMDsKLQkJYm9vbGVhbiBkZWxzSW5jbHVkZUFfZ3QgPSBmRGVsZXRlZFRleHQgIT0gbnVsbCAmJiBmRGVsZXRlZFRleHQuaW5kZXhPZignPicpID49IDA7Ci0KLQkJLy8gTGlzdCByZWdpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBzdGFydDsKLQkJaW50IGVuZFJlcGxhY2UgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlOwotCQl3aGlsZSAoZW5kICE9IG51bGwgJiYgbm9kZSAhPSBlbmQuZ2V0TmV4dCgpKSB7Ci0JCQlJdGVyYXRvciBpID0gbm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGludGVyc2VjdHMobm9kZSwgcmVnaW9uLCBmU3RhcnQsIGVuZFJlcGxhY2UpKSB7Ci0KLQkJCQkJcmVzdWx0ID0gaXNCcmVha2luZ1dpdGhOZXN0ZWRUYWcoY2hhbmdlc0luY2x1ZGVBX2x0LCBkZWxzSW5jbHVkZUFfZ3QsIG5vZGUsIHJlZ2lvbik7Ci0KLQkJCQkJaWYgKHJlc3VsdCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJCWlmIChyZXN1bHQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW50ZXJzZWN0cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IGxvdywgaW50IGhpZ2gpIHsKLQkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQlpbnQgZW5kID0gbm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJcmV0dXJuIChlbmQgPj0gbG93ICYmIHN0YXJ0IDw9IGhpZ2gpIHx8IChzdGFydCA8PSBsb3cgJiYgZW5kID49IGxvdykgfHwgKHN0YXJ0IDw9IGhpZ2ggJiYgZW5kID49IGhpZ2gpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBwb3RlbnRpYWxseSBjb3VsZCBiZSBhIGpzcCBlbWJlZGRlZCByZWdpb24uIFRoaW5ncyBsaWtlCi0JICogSlNQIERlY2xhcmF0aW9uIGNhbid0IGJlIGVtYmVkZGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUEVtYmVkZGVkU3RhcnRPckVuZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQlyZXN1bHQgPSAoKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGV4dGVuZHMgc3VwZXIgY2xhc3MgYmVoYXZpb3IKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnRPZkJsb2NrUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCXJlc3VsdCA9ICgodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB8fCBzdXBlci5pc1BhcnRPZkJsb2NrUmVnaW9uKGZsYXROb2RlKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEpTUFJlUGFyc2VyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHF1aWNrQ2hlY2soKSB7Ci0JCWlmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG5ldyBDb3JlTm9kZUxpc3QoZGlydHlTdGFydCwgZGlydHlFbmQpKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gc3VwZXIucXVpY2tDaGVjaygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQU291cmNlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BTb3VyY2VQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwZTNmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BTb3VyY2VQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbC5KU1BUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSVJlZ2lvbkNvbXBhcmlibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogVGFrZXMgaW5wdXQgZnJvbSB0aGUgSlNQVG9rZW5pemVyIGFuZCBjcmVhdGVzIGEgdGFnIGxpc3QKLSAqLwotCi1wdWJsaWMgY2xhc3MgSlNQU291cmNlUGFyc2VyIGV4dGVuZHMgWE1MU291cmNlUGFyc2VyIGltcGxlbWVudHMgSlNQQ2FwYWJsZVBhcnNlciB7Ci0JcHJvdGVjdGVkIGNsYXNzIE5lc3RhYmxlUHJlZml4SGFuZGxlciBpbXBsZW1lbnRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24gewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkCi0KLQkJLyoqCi0JCSAqIEVuYWJsZXMgYSBUTEQgb3duaW5nIHRoZSBnaXZlbiBwcmVmaXggbG9hZGVkIGZyb20gdGhlIGdpdmVuIFVSSSBhdAotCQkgKiB0aGUgYW5jaG9yRmxhdE5vZGUuIFRoZSBsaXN0IG9mIGFkZGl0aW9uYWxDTURvY3VtZW50cyB3aWxsIGNsYWltIHRvCi0JCSAqIG5vdCBrbm93IGFueSBvZiBpdHMgdGFncyBhdCBwb3NpdGlvbnMgZWFybGllciB0aGFuIHRoYXQKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbidzIHBvc2l0aW9uLgotCQkgKiAKLQkJICogRm9yIHRhZ2xpYiBkaXJlY3RpdmVzLCB0aGUgdGFnbGliIGlzIHRoZSBhbmNob3Igd2hpbGUgdGFnbGlicwotCQkgKiByZWdpc3RlcmVkIHRocm91Z2ggaW5jbHVkZSBkaXJlY3RpdmVzIHVzZSB0aGUgcHJpbWFyeSBpbmNsdWRlCi0JCSAqIGRpcmVjdGl2ZSBhcyB0aGVpciBhbmNob3IuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVGb3JUYWdsaWIoU3RyaW5nIHByZWZpeCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JGbGF0Tm9kZSkgewotCQkJaWYgKHByZWZpeCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUxpc3QgdGFnbWFya2VycyA9ICgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkuZ2V0TmVzdGFibGVQcmVmaXhlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdtYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKCgoVGFnTWFya2VyKSB0YWdtYXJrZXJzLmdldChpKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyhwcmVmaXgpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmdldE5lc3RhYmxlUHJlZml4ZXMoKS5hZGQobmV3IFRhZ01hcmtlcihwcmVmaXgsIGFuY2hvckZsYXROb2RlKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYUNvcmVGbGF0Tm9kZSkgewotCQkJLy8gY291bGQgdGVzdCA+IDEsIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgaWYgdGhlcmUgYXJlIDggKDwlQCwKLQkJCS8vIHRhZ2xpYiwgdXJpLCA9LCB3aGVyZSwgcHJlZml4LCA9LCB3aGF0KSBbb3IgNCBmb3IgaW5jbHVkZXNdCi0JCQlpZiAoYUNvcmVGbGF0Tm9kZS5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDQgJiYgYUNvcmVGbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lID0gYUNvcmVGbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCXRyeSB7Ci0JCQkJCWludCBvZmZzZXQgPSBhQ29yZUZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KG5hbWUpOwotCQkJCQlpbnQgbGVuZ3RoID0gbmFtZS5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWJvb2xlYW4gdGFnbGliZGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiB0YWdsaWJkaXJlY3RpdmVkZXRlY3RlZCA9IGZhbHNlOwotCQkJCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQkJCQl0YWdsaWJkZXRlY3RlZCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJCQkJCXRhZ2xpYmRpcmVjdGl2ZWRldGVjdGVkID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZkNoYXJTZXF1ZW5jZVNvdXJjZSkucmVnaW9uTWF0Y2hlcyhvZmZzZXQsIGxlbmd0aCwgSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBvbGQgZmFzaGlvbmVkIHdheQotCQkJCQkJU3RyaW5nIGRpcmVjdGl2ZU5hbWUgPSBnZXRUZXh0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCXRhZ2xpYmRldGVjdGVkID0gZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQkJCQkJdGFnbGliZGlyZWN0aXZlZGV0ZWN0ZWQgPSBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCQkJfQotCQkJCQlib29sZWFuIHByb2Nlc3NEaXJlY3RpdmVOYW1lID0gdGFnbGliZGV0ZWN0ZWQgfHwgdGFnbGliZGlyZWN0aXZlZGV0ZWN0ZWQ7Ci0JCQkJCWlmIChwcm9jZXNzRGlyZWN0aXZlTmFtZSkgewotCQkJCQkJcHJvY2Vzc1RhZ2xpYihhQ29yZUZsYXROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaW9vYkV4YykgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQkJLy8gY291bGQgdGVzdCA+IDEsIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgaWYgdGhlcmUgYXJlIDUgKDwsCi0JCQkvLyBqc3A6cm9vdCwgeG1sbnM6cHJlZml4LCA9LCB3aGVyZSkKLQkJCWVsc2UgaWYgKGFDb3JlRmxhdE5vZGUuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiA0ICYmIChhQ29yZUZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSkpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkgewotCQkJCXByb2Nlc3NKU1BSb290KGFDb3JlRmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0pTUFJvb3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YWdsaWJGbGF0Tm9kZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSB0YWdsaWJGbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCWJvb2xlYW4gdGFnbGliID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gdGFnbGliRmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCWludCBsZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCi0JCQkJCQlTdHJpbmcgbmFtZSA9IGdldFRleHQob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChYTUxOUykgJiYgbmFtZS5sZW5ndGgoKSA+IFhNTE5TLmxlbmd0aCgpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlwcmVmaXggPSBuYW1lLnN1YnN0cmluZyg2KTsKLQkJCQkJCQl0YWdsaWIgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJlZml4ID0gbnVsbDsKLQkJCQkJCQl0YWdsaWIgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmICh0YWdsaWIgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlwcmVmaXggPSBTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpOwotCQkJCQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQllbmFibGVGb3JUYWdsaWIocHJlZml4LCB0YWdsaWJGbGF0Tm9kZSk7Ci0JCQkJCQkJcHJlZml4ID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJcHJlZml4ID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBQdWxscyB0aGUgcHJlZml4IGZyb20gdGhlIGdpdmVuIHRhZ2xpYiBkaXJlY3RpdmUKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmQgbWFrZXMgc3VyZSB0aGUgcHJlZml4IGlzIG5lc3RhYmxlLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RhZ2xpYihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZ2xpYkZsYXROb2RlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZ2xpYkZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQkJYm9vbGVhbiBwcmVmaXhuYW1lID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsICYmIGZDaGFyU2VxdWVuY2VTb3VyY2UgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJCQkJCWludCBvZmZzZXQgPSB0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkJCWludCBsZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJCXByZWZpeG5hbWUgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlBSRUZJWCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvbGQgZmFzaGlvbmVkIHdheQotCQkJCQkJCXByZWZpeG5hbWUgPSAoZ2V0VGV4dCh0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5QUkVGSVgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcmVmaXhuYW1lICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJcHJlZml4ID0gZ2V0VGV4dCh0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJcHJlZml4ID0gbnVsbDsKLQkJCX0KLQkJCXByZWZpeCA9IFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCk7Ci0JCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCWVuYWJsZUZvclRhZ2xpYihwcmVmaXgsIHRhZ2xpYkZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKSB7Ci0JCQlJdGVyYXRvciB0YWdtYXJrZXJzID0gKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5nZXROZXN0YWJsZVByZWZpeGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlICh0YWdtYXJrZXJzLmhhc05leHQoKSkgewotCQkJCWlmICghKChUYWdNYXJrZXIpIHRhZ21hcmtlcnMubmV4dCgpKS5pc0dsb2JhbCgpKQotCQkJCQl0YWdtYXJrZXJzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQkJCXJlc2V0Tm9kZXMoKTsKLQkJCWdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJaWYgKG5ld0RvY3VtZW50ICE9IG51bGwgJiYgbmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIHsKLQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgbmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkpLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBKU1BTb3VyY2VQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSlNQU291cmNlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KFRhZ01hcmtlciBtYXJrZXIpIHsKLQkJKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5hZGROZXN0YWJsZVByZWZpeChtYXJrZXIpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5lc3RhYmxlUHJlZml4ZXMoKSB7Ci0JCXJldHVybiAoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmdldE5lc3RhYmxlUHJlZml4ZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQmxvY2tUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IEpTUFRva2VuaXplcigpOwotCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKS5hZGQobmV3IE5lc3RhYmxlUHJlZml4SGFuZGxlcigpKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCUpTUFNvdXJjZVBhcnNlciBuZXdJbnN0YW5jZSA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJbmV3SW5zdGFuY2Uuc2V0VG9rZW5pemVyKGdldFRva2VuaXplcigpLm5ld0luc3RhbmNlKCkpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCS8vIERNVzogMi8xMi8wMy4gTWFkZSBjdXJyZW50IG5vZGUgbG9jYWwgdmFyaWFibGUsIHNpbmNlCi0JCS8vIHdlIGNoYW5nZWQgY2xhc3MgdG8gbm90IHJlcXVpcmUgc3RhdGUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQotCQl3aGlsZSAoKHJlZ2lvbiA9IGdldE5leHRSZWdpb24oKSkgIT0gbnVsbCkgewotCQkJdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyB0aGVzZSB0eXBlcyAobWlnaHQpIGRlbWFuZCBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm9yIGVhY2gKLQkJCS8vIG9mIHRoZW0KLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJCS8vIG11bHRpcGxlIGJsb2NrIHRleHRzIGluZGljYXRlZCBlbWJlZGRlZCBjb250YWluZXJzOyBubwotCQkJCQkvLyBuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IGNvbnRpbnVpbmcgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdAotCQkJCQkJLy8gdGVybWluYXRlZAotCQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJfQotCQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBPUEVOIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQllbHNlIGlmICgoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9PUEVOKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZW5zdXJlIHRoYXQgYW55IGV4aXN0aW5nIG5vZGUgaXMgYXQgbGVhc3QgdGVybWluYXRlZAotCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCX0KLQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQl9Ci0JCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBORUlUSEVSIG9wZW4gbm9yIGNsb3NlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOyBqdXN0IGFkZCB0byB0aGVtCi0JCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVCkgewotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgY2xvc2Ugb2ZmIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCS8vIGNsZWFubHkKLQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DTE9TRSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHRoaXMgaXMgZXh0cmVtZWx5IHJhcmUsIGJ1dCB2YWxpZAotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSB7Ci0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKTsKLQkJCQkvLyBwYWNrIHRoZSBlbWJlZGRlZCBjb250YWluZXIgd2l0aCB0aGlzIHJlZ2lvbgotCQkJCWlmIChsYXN0UmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJSVRleHRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKElUZXh0UmVnaW9uQ29udGFpbmVyKSBsYXN0UmVnaW9uOwotCQkJCQljb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChyZWdpb24pOwotCQkJCQkvLyBEVywgNC8xNi8yMDAzIGNvbnRhaW5lciByZWdpb25zIGhhdmUgcGFyZW50LiBQcm9iYWJseSBhCi0JCQkJCS8vIGJldHRlciBwbGFjZSB0byBzZXQsCi0JCQkJCS8vIGJ1dCBmb3Igbm93LCB3aWxsIChyZSlzZXQgZWFjaCB0aW1lIHRocm91Z2gKLQkJCQkJY29udGFpbmVyLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY29udGFpbmVyKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KGNvbnRhaW5lci5nZXRMZW5ndGgoKSAtIHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWN1cnJlbnROb2RlLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gc2tpcCBvbiBhIHZlcnktZmlyc3QgcmVnaW9uIHNpdHVhdGlvbiBhcyB0aGUgZGVmYXVsdAotCQkJCS8vIGJlaGF2aW9yIGlzIGdvb2QgZW5vdWdoCi0JCQkJLy8gY29tYmluZSB3aXRoIHByZXZpb3VzIGlmIGFsc28gdW5kZWZpbmVkCi0JCQkJaWYgKGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCQkJY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQljdXJyZW50Tm9kZS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJLy8gcHJldmlvdXMgd2Fzbid0IHVuZGVmaW5lZAotCQkJCWVsc2UgewotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaWYgYW4gdW5rbm93biB0eXBlIGlzIHRoZSBmaXJzdCByZWdpb24gaW4gdGhlIGRvY3VtZW50LAotCQkJCS8vIGVuc3VyZSB0aGF0IGEgbm9kZSBleGlzdHMKLQkJCQlpZiAoY3VycmVudE5vZGUgPT0gbnVsbCkgewotCQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0KLQkJCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQgcmVnaW9uIG9mIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlZCB0eXBlICIgKyByZWdpb24uZ2V0VHlwZSgpICsgIiBAICIgKyByZWdpb24uZ2V0U3RhcnQoKSArICJbIiArIHJlZ2lvbi5nZXRMZW5ndGgoKSArICJdIik7Ly8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCQl9Ci0KLQkJCS8vIHRoZXNlIHJlZ2lvbnMgYWxzbyBnZXQgdGhlaXIgb3duIG5vZGUsIHNvIGNsb3NlIHRoZW0gY2xlYW5seQotCQkJLy8gTk9URTogdGhlc2UgcmVnaW9ucyBoYXZlIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGNyZWF0ZWQKLQkJCS8vIGZvciB0aGVtIGFib3ZlOyBpdCBtYXkKLQkJCS8vIGJlIG1vcmUgcmVhZGFibGUgaWYgdGhhdCBpcyBoYW5kbGVkIGhlcmUgYXMgd2VsbCwgYnV0IHRoZQotCQkJLy8gY3VycmVudCBsYXlvdXQKLQkJCS8vIGVuc3VyZXMgdGhhdCB0aGV5IG9wZW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyB0aGUgc2FtZSB3YXkKLQkJCWlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQkJCWlmIChoZWFkTm9kZSA9PSBudWxsICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQloZWFkTm9kZSA9IGN1cnJlbnROb2RlOwotCQkJfQotCQl9Ci0JCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCX0KLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVOZXN0YWJsZVByZWZpeChTdHJpbmcgdGFnTmFtZSkgewotCQkoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLnJlbW92ZU5lc3RhYmxlUHJlZml4KHRhZ05hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDM2ZGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YTUxQYXJzZXJSZWdpb25GYWN0b3J5OwotCi0vKioKLSAqIAotICogVGhpcyByZWdpb24gZmFjdG9yeSBpcyB2ZXJ5IHNwZWNpZmljIHRvIHRoZSBwYXJzZXIgb3V0cHV0LCBhbmQgdGhlIHNwZWNpZmljCi0gKiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGZvciB2YXJpb3VzIHJlZ2lvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5IGV4dGVuZHMgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbGFuZywgU3RyaW5nIHN1cnJvdW5kaW5nVGFnKSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChjb250ZXh0ID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgRm9yZWlnblJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlCi0JCQluZXdSZWdpb24gPSBzdXBlci5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBsYW5nLCBzdXJyb3VuZGluZ1RhZyk7Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OGVkOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5OwotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZiBTdHJ1Y3R1cmVkUmVnaW9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeSBleHRlbmRzIFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVSZWdpb24oaW50IHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBKU1BfRElSRUNUSVZFIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWluc3RhbmNlID0gWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKHR5cGUpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjQ0NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODM4ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEwLzI0LzA3IDU6MTYgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5JbnRTdGFjazsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiAxMC8yNC8wNyA1OjE2IEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L2VjbGlwc2Uud3RwL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgSlNQVG9rZW5pemVyIGltcGxlbWVudHMgQmxvY2tUb2tlbml6ZXIsIERPTUpTUFJlZ2lvbkNvbnRleHRzIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9EUVVPVEVTID0gNTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfU1FVT1RFUyA9IDUwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX1NRVU9URVNfRU5EID0gNTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UX0VORCA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFID0gMjE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9TUVVPVEVTX0VORCA9IDQ1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfRFFVT1RFUyA9IDQ0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUwgPSA0MjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQkxPQ0tfVEFHX1NDQU4gPSAzNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX1NRVU9URVMgPSA0MzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFID0gMTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX1RBR19DTE9TRSA9IDE1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQgPSA0MTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfRVFVQUxTID0gMTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDI1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMID0gNDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9TUVVPVEVEX1ZCTCA9IDU1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQgPSA0MDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9OQU1FID0gMjM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FUVVBTFMgPSAyNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSA9IDE5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09OVEVOVCA9IDE2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0gPSAzMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04gPSAzMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFID0gMjc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTID0gMjA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfRFFVT1RFU19FTkQgPSA1MzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RRVU9URURfRUwgPSA0NzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gPSAyODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfRU5EID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfV1MgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9URVhUID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UgPSAxODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCA9IDMzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9IDM0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfRFFVT1RFU19FTkQgPSA0NjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1NRVU9URURfRUwgPSA0ODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0NPTU1FTlRfRU5EID0gMzk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9FUVVBTFMgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UID0gMzU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyA9IDMwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRFFVT1RFRF9WQkwgPSA1NDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfQVRUUklCVVRFX05BTUUgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQUJPUlRfRU1CRURERUQgPSAzNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQgPSAyOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0NPTU1FTlQgPSAzODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOID0gMzc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OID0gMjY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSA9IDE3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfVEFHX05BTUUgPSAyMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX1RBR19DTE9TRSA9IDExOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVCA9IDM7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcNVwxXDI2XDJcMFwxXDE3XDIyXDBcMVwxN1wxXDI1XDFcMTJcMVw2NSIrCi0gICAgIlwxXDE1XDFcMjJcMVwxM1wxXDE0XDFcMjRcMVwyNFwxXDI0XDFcMjRcMVwyNFwxXDciKwotICAgICJcMVw2XDFcM1wxMlwyMFwxXDExXDFcNzJcMVwxXDFcNTFcMVwyXDFcNFwxXDIxIisKLSAgICAiXDFcNDBcMVw3M1wxXDM2XDFcMzdcMVw1NVwxXDcwXDFcNjJcMVw2MlwxXDYzXDFcNjIiKwotICAgICJcMVw2MlwxXDMzXDFcMzFcMVw2NFwxXDUyXDFcNTRcMVw2MlwxXDY3XDFcNjZcMVw0MSIrCi0gICAgIlwxXDcxXDJcNjJcMVwyN1wxXDUzXDFcNjJcMVwzNVwxXDEwNFwxXDIzXDFcMFwxXDEwIisKLSAgICAiXDFcMFwxXDU3XDFcMTAzXDFcNzRcMVw2MFwxXDQzXDFcNzBcMVw3NVwxXDEwNlwxXDQ2IisKLSAgICAiXDFcMTAwXDFcNjJcMVwzNFwxXDMyXDFcNTBcMVw0N1wxXDEwMVwxXDYyXDFcNDRcMVw0NSIrCi0gICAgIlwxXDU2XDFcMTAyXDFcNDJcMVw2MlwxXDMwXDFcNjFcMVw2MlwxXDE2XDFcMFwxXDEwNSIrCi0gICAgIlw3MVwwXDFcNzdcMTBcMFwyN1w3NlwxXDBcMzdcNzZcMVwwXDcyXDc2XDJcMFwxM1w3NiIrCi0gICAgIlwyXDBcMTBcNzZcMVwwXDY1XDc2XDFcMFwxMDRcNzZcMTFcMFw0NFw3NlwzXDBcMlw3NiIrCi0gICAgIlw0XDBcMzZcNzZcNzBcMFwxMzFcNzZcMjJcMFw3XDc2XDE2XDBcMlw3N1w1NlwwXDEwNlw3NyIrCi0gICAgIlwzMlwwXDJcNzdcNDRcMFwxXDc2XDFcNzdcM1w3NlwxXDBcMVw3NlwxXDBcMjRcNzYiKwotICAgICJcMVwwXDU0XDc2XDFcMFw3XDc2XDNcMFwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2IisKLSAgICAiXDFcMFwxXDc2XDFcMFwyMlw3NlwxNVwwXDE0XDc2XDFcMFwxMDJcNzZcMVwwXDE0XDc2IisKLSAgICAiXDFcMFw0NFw3NlwxXDBcNFw3N1wxMVwwXDY1XDc2XDJcMFwyXDc2XDJcMFwyXDc2IisKLSAgICAiXDNcMFwzNFw3NlwyXDBcMTBcNzZcMlwwXDJcNzZcNjdcMFw0Nlw3NlwyXDBcMVw3NiIrCi0gICAgIlw3XDBcNDZcNzZcMTJcMFwyMVw3N1wxXDBcMjdcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDJcNzdcMVwwXDFcNzdcMTNcMFwzM1w3Nlw1XDBcM1w3Nlw1NlwwXDMyXDc2IisKLSAgICAiXDVcMFwxXDc3XDEyXDc2XDEwXDc3XDE1XDBcMTJcNzdcNlwwXDFcNzdcMTA3XDc2XDJcMCIrCi0gICAgIlw1XDc2XDFcMFwxN1w3NlwxXDBcNFw3NlwxXDBcMVw3NlwxN1w3N1wyXDc2XDJcNzciKwotICAgICJcMVwwXDRcNzdcMlwwXDEyXDc3XHUwMjA3XDBcM1w3N1wxXDBcNjVcNzZcMlwwXDFcNzciKwotICAgICJcMVw3NlwyMFw3N1wzXDBcNFw3N1wzXDBcMTJcNzZcMlw3N1wyXDBcMTJcNzdcMjFcMCIrCi0gICAgIlwzXDc3XDFcMFwxMFw3NlwyXDBcMlw3NlwyXDBcMjZcNzZcMVwwXDdcNzZcMVwwIisKLSAgICAiXDFcNzZcM1wwXDRcNzZcMlwwXDFcNzdcMVwwXDdcNzdcMlwwXDJcNzdcMlwwIisKLSAgICAiXDNcNzdcMTFcMFwxXDc3XDRcMFwyXDc2XDFcMFwzXDc2XDJcNzdcMlwwXDEyXDc3IisKLSAgICAiXDJcNzZcMjBcMFwxXDc3XDJcMFw2XDc2XDRcMFwyXDc2XDJcMFwyNlw3NlwxXDAiKwotICAgICJcN1w3NlwxXDBcMlw3NlwxXDBcMlw3NlwxXDBcMlw3NlwyXDBcMVw3N1wxXDAiKwotICAgICJcNVw3N1w0XDBcMlw3N1wyXDBcM1w3N1wxM1wwXDRcNzZcMVwwXDFcNzZcN1wwIisKLSAgICAiXDEyXDc3XDJcNzdcM1w3NlwxNFwwXDNcNzdcMVwwXDdcNzZcMVwwXDFcNzZcMVwwIisKLSAgICAiXDNcNzZcMVwwXDI2XDc2XDFcMFw3XDc2XDFcMFwyXDc2XDFcMFw1XDc2XDJcMCIrCi0gICAgIlwxXDc3XDFcNzZcMTBcNzdcMVwwXDNcNzdcMVwwXDNcNzdcMjJcMFwxXDc2XDVcMCIrCi0gICAgIlwxMlw3N1wyMVwwXDNcNzdcMVwwXDEwXDc2XDJcMFwyXDc2XDJcMFwyNlw3NlwxXDAiKwotICAgICJcN1w3NlwxXDBcMlw3NlwyXDBcNFw3NlwyXDBcMVw3N1wxXDc2XDZcNzdcM1wwIisKLSAgICAiXDJcNzdcMlwwXDNcNzdcMTBcMFwyXDc3XDRcMFwyXDc2XDFcMFwzXDc2XDRcMCIrCi0gICAgIlwxMlw3N1wyMlwwXDJcNzdcMVwwXDZcNzZcM1wwXDNcNzZcMVwwXDRcNzZcM1wwIisKLSAgICAiXDJcNzZcMVwwXDFcNzZcMVwwXDJcNzZcM1wwXDJcNzZcM1wwXDNcNzZcM1wwIisKLSAgICAiXDEwXDc2XDFcMFwzXDc2XDRcMFw1XDc3XDNcMFwzXDc3XDFcMFw0XDc3XDExXDAiKwotICAgICJcMVw3N1wxN1wwXDExXDc3XDIxXDBcM1w3N1wxXDBcMTBcNzZcMVwwXDNcNzZcMVwwIisKLSAgICAiXDI3XDc2XDFcMFwxMlw3NlwxXDBcNVw3Nlw0XDBcN1w3N1wxXDBcM1w3N1wxXDAiKwotICAgICJcNFw3N1w3XDBcMlw3N1wxMVwwXDJcNzZcNFwwXDEyXDc3XDIyXDBcMlw3N1wxXDAiKwotICAgICJcMTBcNzZcMVwwXDNcNzZcMVwwXDI3XDc2XDFcMFwxMlw3NlwxXDBcNVw3Nlw0XDAiKwotICAgICJcN1w3N1wxXDBcM1w3N1wxXDBcNFw3N1w3XDBcMlw3N1w3XDBcMVw3NlwxXDAiKwotICAgICJcMlw3Nlw0XDBcMTJcNzdcMjJcMFwyXDc3XDFcMFwxMFw3NlwxXDBcM1w3NlwxXDAiKwotICAgICJcMjdcNzZcMVwwXDIwXDc2XDRcMFw2XDc3XDJcMFwzXDc3XDFcMFw0XDc3XDExXDAiKwotICAgICJcMVw3N1wxMFwwXDJcNzZcNFwwXDEyXDc3XDIyMVwwXDU2XDc2XDFcMFwxXDc2XDFcNzciKwotICAgICJcMlw3Nlw3XDc3XDVcMFw2XDc2XDFcNzdcMTBcNzdcMVwwXDEyXDc3XDQ3XDBcMlw3NiIrCi0gICAgIlwxXDBcMVw3NlwyXDBcMlw3NlwxXDBcMVw3NlwyXDBcMVw3Nlw2XDBcNFw3NiIrCi0gICAgIlwxXDBcN1w3NlwxXDBcM1w3NlwxXDBcMVw3NlwxXDBcMVw3NlwyXDBcMlw3NiIrCi0gICAgIlwxXDBcMlw3NlwxXDBcMVw3NlwxXDc3XDJcNzZcNlw3N1wxXDBcMlw3N1wxXDc2IisKLSAgICAiXDJcMFw1XDc2XDFcMFwxXDc3XDFcMFw2XDc3XDJcMFwxMlw3N1w3NlwwXDJcNzciKwotICAgICJcNlwwXDEyXDc3XDEzXDBcMVw3N1wxXDBcMVw3N1wxXDBcMVw3N1w0XDBcMlw3NyIrCi0gICAgIlwxMFw3NlwxXDBcNDFcNzZcN1wwXDI0XDc3XDFcMFw2XDc3XDRcMFw2XDc3XDFcMCIrCi0gICAgIlwxXDc3XDFcMFwyNVw3N1wzXDBcN1w3N1wxXDBcMVw3N1wzNDZcMFw0Nlw3NlwxMlwwIisKLSAgICAiXDQ3XDc2XDExXDBcMVw3NlwxXDBcMlw3NlwxXDBcM1w3NlwxXDBcMVw3NlwxXDAiKwotICAgICJcMlw3NlwxXDBcNVw3Nlw1MVwwXDFcNzZcMVwwXDFcNzZcMVwwXDFcNzZcMTNcMCIrCi0gICAgIlwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDNcMFwyXDc2XDNcMFwxXDc2XDVcMCIrCi0gICAgIlwzXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDNcMCIrCi0gICAgIlwyXDc2XDNcMFwyXDc2XDFcMFwxXDc2XDUwXDBcMVw3NlwxMVwwXDFcNzZcMlwwIisKLSAgICAiXDFcNzZcMlwwXDJcNzZcN1wwXDJcNzZcMVwwXDFcNzZcMVwwXDdcNzZcNTBcMCIrCi0gICAgIlwxXDc2XDRcMFwxXDc2XDEwXDBcMVw3Nlx1MGMwNlwwXDIzNFw3Nlw0XDBcMTMyXDc2XDZcMCIrCi0gICAgIlwyNlw3NlwyXDBcNlw3NlwyXDBcNDZcNzZcMlwwXDZcNzZcMlwwXDEwXDc2XDFcMCIrCi0gICAgIlwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDFcMFwzN1w3NlwyXDBcNjVcNzZcMVwwIisKLSAgICAiXDdcNzZcMVwwXDFcNzZcM1wwXDNcNzZcMVwwXDdcNzZcM1wwXDRcNzZcMlwwIisKLSAgICAiXDZcNzZcNFwwXDE1XDc2XDVcMFwzXDc2XDFcMFw3XDc2XDMyM1wwXDE1XDc3XDRcMCIrCi0gICAgIlwxXDc3XDEwNFwwXDFcNzZcM1wwXDJcNzZcMlwwXDFcNzZcMTIxXDBcM1w3Nlx1MGU4MlwwIisKLSAgICAiXDFcNzdcMVwwXDFcNzZcMzFcMFwxMVw3Nlw2XDc3XDFcMFw1XDc3XDEzXDBcMTI0XDc2IisKLSAgICAiXDRcMFwyXDc3XDJcMFwyXDc3XDJcMFwxMzJcNzZcMVwwXDNcNzdcNlwwXDUwXDc2IisKLSAgICAiXHUxY2QzXDBcdTUxYTZcNzZcdTBjNWFcMFx1MmJhNFw3NlwxMzRcMFx1MDgwMFwwXHUxZmZlXDBcMlwwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3Jvd01hcCBbXSA9IHsgCi0gICAgICAgIDAsICAgIDcxLCAgIDE0MiwgICAyMTMsICAgMjg0LCAgIDM1NSwgICA0MjYsICAgNDk3LCAgIDU2OCwgICA2MzksIAotICAgICAgNzEwLCAgIDc4MSwgICA4NTIsICAgOTIzLCAgIDk5NCwgIDEwNjUsICAxMTM2LCAgMTIwNywgIDEyNzgsICAxMzQ5LCAKLSAgICAgMTQyMCwgIDE0OTEsICAxNTYyLCAgMTYzMywgIDE3MDQsICAxNzc1LCAgMTg0NiwgIDE5MTcsICAxOTg4LCAgMjA1OSwgCi0gICAgIDIxMzAsICAyMjAxLCAgMjI3MiwgIDIzNDMsICAyNDE0LCAgMjQ4NSwgIDI1NTYsICAyNjI3LCAgMjY5OCwgIDI3NjksIAotICAgICAyODQwLCAgMjkxMSwgIDI5ODIsICAzMDUzLCAgMzEyNCwgIDMxOTUsICAzMjY2LCAgMzMzNywgIDM0MDgsICAzNDc5LCAKLSAgICAgMzU1MCwgIDM2MjEsICAzNjkyLCAgMzc2MywgIDM4MzQsICAzOTA1LCAgMzk3NiwgIDQwNDcsICA0MTE4LCAgNDE4OSwgCi0gICAgIDQyNjAsICA0MzMxLCAgNDQwMiwgIDQ0NzMsICA0NDAyLCAgNDQ3MywgIDQ1NDQsICA0NDAyLCAgNDQwMiwgIDQ0NzMsIAotICAgICA0NjE1LCAgNDY4NiwgIDQ3NTcsICA0ODI4LCAgNDg5OSwgIDQ5NzAsICA1MDQxLCAgNTExMiwgIDQ0MDIsICA0NDczLCAKLSAgICAgNTE4MywgIDUyNTQsICA1MzI1LCAgNDQwMiwgIDUzOTYsICA1Mzk2LCAgNTQ2NywgIDU1MzgsICA1NjA5LCAgNTE4MywgCi0gICAgIDQ0MDIsICA1NjgwLCAgNTc1MSwgIDQ0MDIsICA1ODIyLCAgNTg5MywgIDU5NjQsICA2MDM1LCAgNDQwMiwgIDQ0NzMsIAotICAgICA2MTA2LCAgNjE3NywgIDYyNDgsICA2MzE5LCAgNjM5MCwgIDY0NjEsICA0NDAyLCAgNjUzMiwgIDY1MzIsICA2NjAzLCAKLSAgICAgNjY3NCwgIDY3NDUsICA2ODE2LCAgNjg4NywgIDQ0MDIsICA2OTU4LCAgNzAyOSwgIDcxMDAsICA3MTcxLCAgNzI0MiwgCi0gICAgIDczMTMsICA0NDAyLCAgNzM4NCwgIDc0NTUsICA3NTI2LCAgNzU5NywgIDc2NjgsICA3NzM5LCAgNzgxMCwgIDc4ODEsIAotICAgICA0NDAyLCAgNzk1MiwgIDgwMjMsICA4MDk0LCAgODE2NSwgIDgyMzYsICA4MzA3LCAgODM3OCwgIDg0NDksICA4NDQ5LCAKLSAgICAgODUyMCwgIDg1OTEsICA4NjYyLCAgODczMywgIDg3MzMsICA4ODA0LCAgODg3NSwgIDg5NDYsICA5MDE3LCAgOTAxNywgCi0gICAgIDkwODgsICA5MTU5LCAgOTIzMCwgIDkzMDEsICA0NDAyLCAgOTM3MiwgIDkzNzIsICA5NDQzLCAgOTUxNCwgIDk1ODUsIAotICAgICA5NjU2LCAgNDQwMiwgIDQ0MDIsICA0NDczLCAgNDQwMiwgIDQ0NzMsICA5NzI3LCAgOTc5OCwgIDk4NjksICA5OTQwLCAKLSAgICAgNDQwMiwgMTAwMTEsIDEwMDgyLCAxMDE1MywgMTAyMjQsICA0NDAyLCAxMDI5NSwgMTAzNjYsIDEwNDM3LCAxMDUwOCwgCi0gICAgIDQ0MDIsICA0NDAyLCAxMDU3OSwgIDQ0MDIsIDEwNjUwLCAxMDcyMSwgMTA2NTAsIDEwNzkyLCAxMDg2MywgMTA3OTIsIAotICAgICA0NDAyLCAgNDQwMiwgMTA5MzQsIDExMDA1LCAxMTA3NiwgIDQ0MDIsIDExMTQ3LCAxMTIxOCwgMTEyODksIDExMzYwLCAKLSAgICAxMTQzMSwgIDQ0MDIsICA0NDAyLCAxMTUwMiwgIDQ0MDIsIDExNTczLCAxMTY0NCwgMTE1NzMsIDExNzE1LCAxMTc4NiwgCi0gICAgMTE3MTUsICA0NDAyLCAgNDQwMiwgMTE4NTcsIDExOTI4LCAxMTk5OSwgIDQ0MDIsIDEyMDcwLCAxMjE0MSwgMTIyMTIsIAotICAgICA0NDAyLCAgNDQwMiwgMTIyODMsIDEyMzU0LCAxMjQyNSwgMTI0OTYsIDEyNTY3LCAgNDQwMiwgMTI2MzgsIDEyNzA5LCAKLSAgICAxMjc4MCwgMTI4NTEsIDEyOTIyLCAxMjk5MywgMTMwNjQsIDEzMTM1LCAgNDQwMiwgMTMyMDYsIDEzMjc3LCAxMzM0OCwgCi0gICAgIDQ0MDIsICA0NDAyLCAgNTM5NiwgIDU1MzgsICA0NDAyLCAxMzQxOSwgIDU2MDksIDEzNDkwLCAgNTY4MCwgIDU4MjIsIAotICAgICA1ODkzLCAxMzU2MSwgIDU5NjQsICA0NDAyLCAxMzYzMiwgMTM3MDMsICA2MDM1LCAxMzc3NCwgIDQ0MDIsIDEyMzU0LCAKLSAgICAgNDQwMiwgIDY1MzIsICA2NjAzLCAgNDQwMiwgMTM4NDUsICA2Njc0LCAxMzkxNiwgIDQ0MDIsIDEzOTg3LCAxNDA1OCwgCi0gICAgIDczODQsIDE0MTI5LCAgNzU5NywgIDQ0MDIsIDE0MjAwLCAgNzY2OCwgMTQyNzEsIDE0MzQyLCAxNDQxMywgMTQ0ODQsIAotICAgIDE0NTU1LCAxNDYyNiwgIDgxNjUsICA0NDAyLCAxNDY5NywgMTQ3NjgsICA4NDQ5LCAgODUyMCwgIDQ0MDIsIDE0ODM5LCAKLSAgICAxNDkxMCwgMTQ5ODEsIDE1MDUyLCAxNTEyMywgIDg2NjIsICA4NDQ5LCAgODczMywgIDg4MDQsICA0NDAyLCAgODg3NSwgCi0gICAgIDg5NDYsICA4NzMzLCAgOTAxNywgIDkwODgsICA0NDAyLCAxNTE5NCwgMTUyNjUsIDE1MzM2LCAxNTQwNywgMTU0NzgsIAotICAgIDE1NTQ5LCAxNTYyMCwgIDkzNzIsICA5NDQzLCAgNDQwMiwgMTU2OTEsIDE1NzYyLCAxNTgzMywgMTU5MDQsIDE1OTc1LCAKLSAgICAxNjA0NiwgMTYxMTcsIDE2MTg4LCAxNjI1OSwgIDQ0MDIsICA0NDAyLCAgNDQwMiwgMTYzMzAsICA0NDAyLCAgNDQwMiwgCi0gICAgMTY0MDEsIDE2NDcyLCAxNjU0MywgMTY2MTQsIDEwNjUwLCAgNDQwMiwgMTY2ODUsIDE2NzU2LCAxMDc5MiwgIDQ0MDIsIAotICAgIDE2ODI3LCAxNjg5OCwgMTY5NjksIDE3MDQwLCAxNzExMSwgMTcxODIsIDE3MjUzLCAxNzMyNCwgMTczOTUsIDExMzYwLCAKLSAgICAxMTU3MywgIDQ0MDIsIDE3NDY2LCAxNzUzNywgMTE3MTUsICA0NDAyLCAxNzYwOCwgMTc2NzksIDE3NzUwLCAxNzgyMSwgCi0gICAgMTc4OTIsIDE3OTYzLCAxODAzNCwgMTgxMDUsIDE4MTc2LCAgNDQwMiwgIDQ0MDIsICA0NDAyLCAxODI0NywgMTgzMTgsIAotICAgIDE4Mzg5LCAxODQ2MCwgMTg1MzEsICA0NDAyLCAxODYwMiwgMTg2NzMsICA0NDAyLCAgNDQwMiwgIDQ0MDIsICA0NDAyLCAKLSAgICAgNDQwMiwgIDQ4MjgsIDE4NzQ0LCAxODgxNSwgMTg4ODYsIDE4OTU3LCAxOTAyOCwgMTkwOTksIDE5MTcwLCAxOTA5OSwgCi0gICAgMTkyNDEsIDE5MzEyLCAxOTI0MSwgMTkzODMsIDE5NDU0LCAxOTUyNSwgMTk1OTYsIDE5NjY3LCAxOTczOCwgMTk4MDksIAotICAgIDE5ODA5LCAxOTg4MCwgMTk5NTEsIDE5OTUxLCAyMDAyMiwgIDkyMzAsICA5MjMwLCAgOTIzMCwgMjAwOTMsIDIwMTY0LCAKLSAgICAyMDIzNSwgMjAyMzUsIDIwMzA2LCAgOTU4NSwgIDk1ODUsICA5NTg1LCAyMDM3NywgMjA0NDgsIDE2NTQzLCAyMDUxOSwgCi0gICAgMTA0MzcsIDEwNDM3LCAxMDQzNywgMjA1OTAsIDIwNjYxLCAxMDY1MCwgMTA2NTAsIDEwNjUwLCAyMDczMiwgMjA4MDMsIAotICAgIDEwNzkyLCAxMDc5MiwgMTA3OTIsIDIwODc0LCAyMDk0NSwgMTA5MzQsIDEwOTM0LCAxMDkzNCwgMTcxMTEsIDIxMDE2LCAKLSAgICAyMTA4NywgMTExNDcsIDExMTQ3LCAxMTE0NywgMTczMjQsIDIxMTU4LCAyMTIyOSwgMTEzNjAsIDExMzYwLCAxMTM2MCwgCi0gICAgMjEzMDAsIDExNTczLCAxMTU3MywgMTE1NzMsIDIxMzcxLCAyMTQ0MiwgMTE3MTUsIDExNzE1LCAxMTcxNSwgMjE1MTMsIAotICAgIDIxNTg0LCAxMTg1NywgMTE4NTcsIDExODU3LCAxNzg5MiwgMjE2NTUsIDIxNzI2LCAxMjA3MCwgMTIwNzAsIDEyMDcwLCAKLSAgICAxODEwNSwgMjE3OTcsICA0NDAyLCAgNDQwMiwgMjE4NjgsIDIxOTM5LCAgNDQwMiwgMjIwMTAsIDIyMDgxLCAyMjE1MiwgCi0gICAgMjIyMjMsICA3Mzg0LCAgNDQwMiwgIDQ0MDIsIDIyMjk0LCAyMjM2NSwgMjI0MzYsIDIyNTA3LCAyMjU3OCwgMTUwNTIsIAotICAgIDE1NDA3LCAgOTIzMCwgMjI2NDksIDE1OTA0LCAgOTU4NSwgMjI3MjAsICA0NDAyLCAxMDQzNywgMTA2NTAsIDIyNzkxLCAKLSAgICAxMDc5MiwgMjI4NjIsIDEwOTM0LCAyMjkzMywgIDQ0MDIsIDExMTQ3LCAyMzAwNCwgMTEzNjAsIDExNTczLCAyMzA3NSwgCi0gICAgMTE3MTUsIDIzMTQ2LCAxMTg1NywgMjMyMTcsICA0NDAyLCAxMjA3MCwgMjMyODgsIDIzMzU5LCAyMzQzMCwgMjM1MDEsIAotICAgIDIzNTcyLCAyMzY0MywgMjM3MTQsIDIzNzg1LCAyMzg1NiwgMjM5MjcsIDIzOTk4LCAyNDA2OSwgMjQxNDAsIDI0MjExLCAKLSAgICAyNDI4MiwgMjQzNTMsIDI0NDI0LCAyNDQ5NSwgMjQ1NjYsIDI0NjM3LCAyNDcwOCwgMjQ3NzksIDI0ODUwLCAgNDgyOCwgCi0gICAgMjQ5MjEsIDI0OTkyLCAyNTA2MywgMjUxMzQsIDI1MjA1LCAgNDQwMiwgIDQ0MDIsIDI1Mjc2LCAyNTM0NywgMjU0MTgsIAotICAgIDI1NDg5LCAxNzExMSwgMTczMjQsIDI1NTYwLCAyNTYzMSwgMTc4OTIsIDE4MTA1LCAyNTcwMiwgMjU3NzMsIDI1ODQ0LCAKLSAgICAyNTkxNSwgIDQ0MDIsICA0NDAyLCAgNDQwMiwgMjU5ODYsIDI2MDU3LCAyNjEyOCwgMjYxOTksIDI2MjcwLCAyNjM0MSwgCi0gICAgMjY0MTIsIDI2NDgzLCAgNzEwMCwgMjY1NTQsIDI2NjI1LCAyNjY5NiwgMjY3NjcsIDI2ODM4LCAyNjkwOSwgMjY5ODAsIAotICAgICA0NDAyLCAyNzA1MSwgMjcxMjIsICA5MjMwLCAgOTU4NSwgMTA2NTAsIDEwNzkyLCAxMTU3MywgMTE3MTUsIDI3MTkzLCAKLSAgICAyNzI2NCwgMjczMzUsIDI3NDA2LCAyNzQ3NywgMjc1NDgsIDI3NjE5LCAyNzY5MCwgIDQ4MjgsIDI3NzYxLCAyNzgzMiwgCi0gICAgMjc5MDMsIDI3OTc0LCAyODA0NSwgMjgxMTYsIDI4MTg3LCAyODI1OCwgMjgzMjksIDI4NDAwLCAyODQ3MSwgMjg1NDIsIAotICAgIDI4NjEzLCAyODY4NCwgMjg3NTUsIDI4ODI2LCAyODg5NywgMjg5NjgsIDI5MDM5LCAyOTExMCwgMjkxODEsIDI5MjUyLCAKLSAgICAyOTMyMywgMjkzOTQsIDI5NDY1LCAyOTUzNiwgMjk2MDcsIDI5Njc4LCAyOTc0OSwgMjk4MjAsIDI5ODkxLCAyOTk2MiwgCi0gICAgMzAwMzMsIDMwMTA0LCAzMDE3NSwgMzAyNDYsICA0NDAyLCAzMDMxNywgMzAzODgsIDMwNDU5LCAzMDUzMCwgIDcxMDAsIAotICAgIDMwNjAxLCAzMDY3MiwgMzA3NDMsIDMwODE0LCAzMDg4NSwgMzA5NTYsIDMxMDI3LCAzMTA5OCwgMzExNjksIDMxMjQwLCAKLSAgICAzMTMxMSwgMzEzODIsIDMxNDUzLCAzMTUyNAotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNzFcMVw3MlwxMVw3MVwxXDczXDFcNzFcMVw3NFw0XDcxXDFcNzUiKwotICAgICJcNDJcNzFcMVw3NlwyMVw3MVwxXDc3XDFcMTAwXDEwNVw3N1wxXDEwMVwxXDEwMiIrCi0gICAgIlwyMVwxMDFcMVwxMDNcMlwxMDFcMVwxMDRcNjBcMTAxXDFcMTA1XDFcMTA2XDEwNVwxMDUiKwotICAgICJcMVwxMDFcMVwxMDJcNVwxMDFcMVwxMDdcMTZcMTAxXDFcMTA0XDYxXDEwMVwxXDEwMiIrCi0gICAgIlwyXDEwMVwxXDExMFwxXDExMVwyXDEwMVwyXDExMlw1XDEwMVwxXDExMVw2XDEwMSIrCi0gICAgIlwxXDExMVwxXDExM1wxXDExNFw0XDExMlwxXDEwMVwxMFwxMTJcMVwxMTVcMlwxMTIiKwotICAgICJcMVwxMDFcMTFcMTEyXDFcMTE1XDFcMTEyXDFcMTAxXDRcMTEyXDFcMTAxXDRcMTEyIisKLSAgICAiXDFcMTAxXDRcMTEyXDJcMTAxXDFcMTEyXDFcMTAxXDFcMTAyXDJcMTAxXDFcMTEwIisKLSAgICAiXDFcMTE2XDExXDEwMVwxXDExNlw2XDEwMVwxXDExNlw2MFwxMDFcMVwxMTdcMVwxMjAiKwotICAgICJcMlwxMTdcMVwxMjFcMjFcMTE3XDFcMTA0XDYwXDExN1wxXDEwMVwxXDEwMlwyXDEwMSIrCi0gICAgIlwxXDEyMlwxXDExMVwyXDEwMVwyXDEyM1w1XDEwMVwxXDExMVw2XDEwMVwxXDExMSIrCi0gICAgIlw2XDEyM1wxXDEwMVwxM1wxMjNcMVwxMDFcMTNcMTIzXDFcMTAxXDRcMTIzXDFcMTAxIisKLSAgICAiXDRcMTIzXDFcMTAxXDRcMTIzXDJcMTAxXDFcMTIzXDFcMTAxXDFcMTAyXDJcMTAxIisKLSAgICAiXDFcMTIyXDFcMTExXDJcMTAxXDJcMTIzXDVcMTAxXDFcMTExXDZcMTAxXDFcMTExIisKLSAgICAiXDZcMTIzXDFcMTAxXDEzXDEyM1wxXDEyNFwxM1wxMjNcMVwxMDFcNFwxMjNcMVwxMDEiKwotICAgICJcNFwxMjNcMVwxMDFcNFwxMjNcMlwxMDFcMVwxMjNcMVwxMjVcMVwxMDJcMVwxMDEiKwotICAgICJcMVwxMjZcMVwxMjdcMVwxMTFcNFwxMjVcMVwxMzBcMVwxMjVcMVwxMzFcMlwxMjUiKwotICAgICJcMVwxMTFcNlwxMjVcMVwxMTFcNjBcMTI1XDFcMTAxXDFcMTAyXDJcMTAxXDFcMTMyIisKLSAgICAiXDIxXDEwMVwxXDEwNFw2MVwxMDFcMVwxMDJcMVwxMzNcMVwxMzRcMVwxMDFcMVwxMTEiKwotICAgICJcMlwxMDFcMlwxMzVcNVwxMDFcMVwxMTFcNlwxMDFcMVwxMTFcNlwxMzVcMVwxMDEiKwotICAgICJcMTNcMTM1XDFcMTAxXDEzXDEzNVwxXDEwMVw0XDEzNVwxXDEwMVw0XDEzNVwxXDEwMSIrCi0gICAgIlw0XDEzNVwyXDEwMVwxXDEzNVwxXDEwMVwxXDEwMlwxXDEzM1wxXDEzNFwxXDEwMSIrCi0gICAgIlwxXDExMVwyXDEwMVwyXDEzNVw1XDEwMVwxXDExMVw2XDEwMVwxXDExMVw2XDEzNSIrCi0gICAgIlwxXDEwMVwxM1wxMzVcMVwxMzZcMTNcMTM1XDFcMTAxXDRcMTM1XDFcMTAxXDRcMTM1IisKLSAgICAiXDFcMTAxXDRcMTM1XDJcMTAxXDFcMTM1XDFcMTM3XDFcMTAyXDFcMTMzXDFcMTQwIisKLSAgICAiXDFcMTM3XDFcMTExXDRcMTM3XDFcMTQxXDFcMTM3XDFcMTQyXDJcMTM3XDFcMTExIisKLSAgICAiXDZcMTM3XDFcMTExXDYwXDEzN1wxXDEwMVwxXDEwMlwzXDEwMVwxXDExMVwxMVwxMDEiKwotICAgICJcMVwxMTFcNlwxMDFcMVwxMTFcNjBcMTAxXDFcMTQzXDFcMTQ0XDIwXDE0M1wxXDE0NSIrCi0gICAgIlw2NFwxNDNcMVwxMDFcMVwxNDZcM1wxMDFcMVwxMTFcMlwxMDFcMlwxNDdcNVwxMDEiKwotICAgICJcMVwxMTFcMlwxMDFcMVwxNTBcM1wxMDFcMVwxMTFcNlwxNDdcMVwxMDFcMTNcMTQ3IisKLSAgICAiXDFcMTAxXDEzXDE0N1wxXDEwMVw0XDE0N1wxXDEwMVw0XDE0N1wxXDEwMVw0XDE0NyIrCi0gICAgIlwyXDEwMVwxXDE0N1wxXDEwMVwxXDE0NlwzXDEwMVwxXDE1MVwxMVwxMDFcMVwxNTEiKwotICAgICJcMlwxMDFcMVwxNTBcM1wxMDFcMVwxNTFcNjFcMTAxXDFcMTQ2XDNcMTAxXDFcMTExIisKLSAgICAiXDJcMTAxXDJcMTUyXDVcMTAxXDFcMTExXDJcMTAxXDFcMTUwXDNcMTAxXDFcMTExIisKLSAgICAiXDZcMTUyXDFcMTAxXDEzXDE1MlwxXDEwMVwxM1wxNTJcMVwxMDFcNFwxNTJcMVwxMDEiKwotICAgICJcNFwxNTJcMVwxMDFcNFwxNTJcMlwxMDFcMVwxNTJcMVwxMDFcMVwxNDZcM1wxMDEiKwotICAgICJcMVwxMTFcMlwxMDFcMlwxNTJcNVwxMDFcMVwxMTFcMlwxMDFcMVwxNTBcM1wxMDEiKwotICAgICJcMVwxMTFcNlwxNTJcMVwxMDFcMTNcMTUyXDFcMTUzXDEzXDE1MlwxXDEwMVw0XDE1MiIrCi0gICAgIlwxXDEwMVw0XDE1MlwxXDEwMVw0XDE1MlwyXDEwMVwxXDE1MlwxXDE1NFwxXDE0NiIrCi0gICAgIlwxXDEwMVwxXDE1NVwxXDE1NFwxXDExMVw0XDE1NFwxXDE1NlwxXDE1NFwxXDE1NyIrCi0gICAgIlwyXDE1NFwxXDExMVwyXDE1NFwxXDE2MFwzXDE1NFwxXDExMVw2MFwxNTRcMVwxNjEiKwotICAgICJcMVwxNjJcMVwxNjNcMVwxNjRcNFwxNjFcMlwxNjVcMTVcMTYxXDZcMTY2XDFcMTYxIisKLSAgICAiXDEzXDE2NlwxXDE2MVwxM1wxNjZcMVwxNjFcNFwxNjZcMVwxNjFcNFwxNjZcMVwxNjEiKwotICAgICJcMVwxNjdcM1wxNjZcMlwxNjFcMVwxNjZcMVwxMDFcMVwxNzBcMVwxNjNcMVwxNjQiKwotICAgICJcMVwxMDFcMVwxMTFcMlwxMDFcMlwxNzFcNVwxMDFcMVwxMTFcNlwxMDFcMVwxMTEiKwotICAgICJcNlwxNzFcMVwxMDFcMTNcMTcxXDFcMTAxXDEzXDE3MVwxXDEwMVw0XDE3MVwxXDEwMSIrCi0gICAgIlw0XDE3MVwxXDEwMVw0XDE3MVwyXDEwMVwxXDE3MVwxXDEwMVwxXDE3MFwxXDE2MyIrCi0gICAgIlwxXDE2NFwxXDEwMVwxXDExMVwyXDEwMVwyXDE3MVw1XDEwMVwxXDExMVw2XDEwMSIrCi0gICAgIlwxXDExMVw2XDE3MVwxXDEwMVwxM1wxNzFcMVwxNzJcMTNcMTcxXDFcMTAxXDRcMTcxIisKLSAgICAiXDFcMTAxXDRcMTcxXDFcMTAxXDRcMTcxXDJcMTAxXDFcMTcxXDFcMTczXDFcMTc0IisKLSAgICAiXDFcMTYzXDFcMTc1XDFcMTczXDFcMTExXDRcMTczXDFcMTc2XDFcMTczXDFcMTc3IisKLSAgICAiXDFcMjAwXDFcMTczXDFcMTExXDZcMTczXDFcMTExXDM2XDE3M1wxXDIwMVwyMVwxNzMiKwotICAgICJcMVwxMDFcMVwyMDJcMVwyMDNcMlwxMDFcMVwxMTFcMTFcMTAxXDFcMTExXDZcMTAxIisKLSAgICAiXDFcMTExXDEwXDEwMVwxXDIwNFwxXDIwNVwyXDEwMVwxXDIwNlwxMVwxMDFcMVwyMDYiKwotICAgICJcMVwxMDFcMVwyMDVcMVwyMDRcMjdcMTAxXDFcMTAyXDFcMjAzXDJcMTAxXDFcMTExIisKLSAgICAiXDExXDEwMVwxXDExMVw2XDEwMVwxXDExMVw2XDEwMVwxXDIwN1w1MlwxMDFcMVwxMDIiKwotICAgICJcMVwyMDNcMlwxMDFcMVwxMTFcMlwxMDFcMlwyMTBcNVwxMDFcMVwxMTFcNlwxMDEiKwotICAgICJcMVwxMTFcNlwyMTBcMVwyMDdcMTNcMjEwXDFcMTAxXDEzXDIxMFwxXDEwMVw0XDIxMCIrCi0gICAgIlwxXDEwMVw0XDIxMFwxXDEwMVw0XDIxMFwyXDEwMVwxXDIxMFwxXDEwMVwxXDEwMiIrCi0gICAgIlwxXDIwM1wyXDEwMVwxXDExMVwxMVwxMDFcMVwxMTFcNlwxMDFcMVwxMTFcNlwxMDEiKwotICAgICJcMVwyMDdcN1wxMDFcMVwyMTFcNlwxMDFcMVwyMTJcMTFcMTAxXDFcMjExXDEyXDEwMSIrCi0gICAgIlwxXDIxMlw1XDEwMVwxXDIxM1wxXDEwMlwxXDIwM1wxXDIxNFwxXDIxM1wxXDExMSIrCi0gICAgIlw0XDIxM1wxXDIxNVwxXDIxM1wxXDIxNlwyXDIxM1wxXDExMVw2XDIxM1wxXDExMSIrCi0gICAgIlw2XDIxM1wxXDIxN1w1MVwyMTNcMVwyMjBcMVwxMDJcMVwyMDNcMVwyMjFcMVwyMjAiKwotICAgICJcMVwxMTFcNFwyMjBcMVwyMjJcMVwyMjBcMVwyMjNcMlwyMjBcMVwxMTFcNlwyMjAiKwotICAgICJcMVwxMTFcNlwyMjBcMVwyMjRcNTFcMjIwXDFcMjI1XDFcMTAyXDFcMjAzXDFcMjI2IisKLSAgICAiXDFcMjI1XDFcMTExXDRcMjI1XDFcMjI3XDFcMjI1XDFcMjMwXDJcMjI1XDFcMTExIisKLSAgICAiXDZcMjI1XDFcMTExXDYwXDIyNVwxXDIzMVwxXDIzMlwxXDIzM1wxMDRcMjMxXDFcMjM0IisKLSAgICAiXDFcMTAyXDFcMjAzXDFcMjM1XDFcMjM0XDFcMTExXDRcMjM0XDFcMjM2XDFcMjM0IisKLSAgICAiXDFcMjM3XDJcMjM0XDFcMTExXDZcMjM0XDFcMTExXDYwXDIzNFwxXDI0MFwxXDI0MSIrCi0gICAgIlwxXDI0MlwxMDRcMjQwXDFcMjQzXDFcMjQ0XDEwNVwyNDNcMVwxMDFcMVwxMDJcMjRcMTAxIisKLSAgICAiXDFcMTA0XDYwXDEwMVwxXDI0NVwxXDI0NlwxMDVcMjQ1XDFcMTAxXDFcMTAyXDVcMTAxIisKLSAgICAiXDFcMjQ3XDE2XDEwMVwxXDEwNFw2MFwxMDFcMVwyNTBcMVwyNTFcM1wyNTBcMVwyNTIiKwotICAgICJcNlwyNTBcMVwyNTNcMVwyNTRcMVwyNTBcMVwyNTJcNlwyNTBcMVwyNTJcMzZcMjUwIisKLSAgICAiXDFcMjU1XDIxXDI1MFwxXDI1NlwxXDI1MVwzXDI1NlwxXDI1N1w0XDI1NlwxXDI2MCIrCi0gICAgIlwyXDI1NlwxXDI2MVwxXDI1NlwxXDI1N1w2XDI1NlwxXDI1N1wzNlwyNTZcMVwyNjIiKwotICAgICJcMjFcMjU2XDFcMjYzXDFcMjY0XDEwXDI2M1wxXDI2NVwxXDI2M1wxXDI2NlwxXDI2NyIrCi0gICAgIlw2N1wyNjNcMVwyNzBcMVwyNjNcMVwyNzFcMVwyNzJcMTJcMjcxXDFcMTAxXDExXDI3MSIrCi0gICAgIlwxXDI3M1w2MFwyNzFcMVwyNzRcMVwyNzVcMTBcMjc0XDFcMTAxXDEzXDI3NFwxXDI3NiIrCi0gICAgIlw2MFwyNzRcMVwxMDFcMVwxMDJcMTJcMTAxXDFcMjc3XDExXDEwMVwxXDEwNFw2MVwxMDEiKwotICAgICJcMVwxMDJcMTBcMTAxXDFcMzAwXDEzXDEwMVwxXDEwNFw2MFwxMDFcMVwzMDFcMVwzMDIiKwotICAgICJcMTBcMzAxXDFcMjYwXDcxXDMwMVwxXDMwM1wxXDMwNFwxXDMwMVwxXDMwNVwxXDMwNiIrCi0gICAgIlwxMlwzMDVcMVwyNTNcNjdcMzA1XDFcMzA3XDFcMzA0XDFcMzA1XDFcMzEwXDFcMzExIisKLSAgICAiXDEwXDMxMFwxXDMxMlwxXDMxMFwxXDMxM1w1MFwzMTBcMVwzMTRcMTdcMzEwXDFcMzE1IisKLSAgICAiXDFcMzEwXDFcMzE2XDFcMzE3XDEyXDMxNlwxXDEwMVwxMVwzMTZcMVwzMjBcNjBcMzE2IisKLSAgICAiXDFcMzIxXDFcMzIyXDEwXDMyMVwxXDEwMVwxM1wzMjFcMVwzMjNcNjBcMzIxXDFcMTAxIisKLSAgICAiXDFcMTAyXDEyXDEwMVwxXDMyNFwxMVwxMDFcMVwxMDRcNjFcMTAxXDFcMTAyXDEwXDEwMSIrCi0gICAgIlwxXDMyNVwxM1wxMDFcMVwxMDRcNjBcMTAxXDFcMzI2XDFcMzI3XDEwXDMyNlwxXDI2MCIrCi0gICAgIlw3MVwzMjZcMVwzMzBcMVwzMzFcMVwzMjZcMVwzMzJcMVwzMzNcMTJcMzMyXDFcMjUzIisKLSAgICAiXDY3XDMzMlwxXDMzNFwxXDMzMVwxXDMzMlwxXDcxXDFcMFwxMVw3MVwxXDAiKwotICAgICJcMVw3MVwxXDBcNFw3MVwxXDBcNDJcNzFcMVwwXDIxXDcxXDNcMCIrCi0gICAgIlwxXDMzNVwxXDMzNlwxNVwwXDFcMzM3XDJcMFwxXDM0MFw2NlwwXDFcMzQxIisKLSAgICAiXDJcMFwyXDM0Mlw1XDBcMVwzNDFcNlwwXDFcMzQxXDZcMzQyXDFcMCIrCi0gICAgIlwxM1wzNDJcMVwwXDEzXDM0MlwxXDM0M1w0XDM0MlwxXDBcNFwzNDJcMVwwIisKLSAgICAiXDRcMzQyXDJcMFwxXDM0MlwxXDM0NFwxXDBcMTFcMzQ0XDFcMFwxXDM0NCIrCi0gICAgIlwxXDM0NVwxXDM0NlwzXDM0NFwxXDBcNjRcMzQ0XDVcMFwxXDM0MVwyXDAiKwotICAgICJcMlwzNDdcNVwwXDFcMzQxXDZcMFwxXDM0MVw2XDM0N1wxXDBcMTNcMzQ3IisKLSAgICAiXDFcMFwxM1wzNDdcMVwwXDRcMzQ3XDFcMFw0XDM0N1wxXDBcNFwzNDciKwotICAgICJcMlwwXDFcMzQ3XDFcMzQ0XDFcMFwxMVwzNDRcMVwwXDJcMzQ0XDFcMzUwIisKLSAgICAiXDNcMzQ0XDFcMFw0MlwzNDRcMVwzNTFcMjFcMzQ0XDEzMVwwXDFcMzM3XDJcMCIrCi0gICAgIlwxXDM1MlwxMDRcMFwxXDM1M1w3MlwwXDFcMzU0XDEwMVwwXDFcMzU1XDExMVwwIisKLSAgICAiXDFcMTExXDExXDBcMVwxMTFcNlwwXDFcMTExXDY2XDBcNFwxMTJcNlwwIisKLSAgICAiXDFcMTEyXDZcMFw2XDExMlwxXDBcMTNcMTEyXDFcMFwxM1wxMTJcMVwwIisKLSAgICAiXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDExMlw2XDAiKwotICAgICJcMVwxMTJcNlwwXDJcMTEyXDJcMzU2XDJcMTEyXDFcMFwxM1wxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwIisKLSAgICAiXDRcMTEyXDZcMFwxXDExMlw2XDBcMlwxMTJcMVwzNTZcMVwzNTdcMlwxMTIiKwotICAgICJcMVwwXDEzXDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyIisKLSAgICAiXDJcMFwxXDExMlw2XDBcNFwxMTJcNlwwXDFcMTEyXDZcMFwyXDExMiIrCi0gICAgIlwyXDM2MFwyXDExMlwxXDBcMTNcMTEyXDFcMFwxM1wxMTJcMVwwXDRcMTEyIisKLSAgICAiXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDVcMFwxXDExNlwxMVwwXDFcMTE2IisKLSAgICAiXDZcMFwxXDExNlw2MlwwXDFcMzYxXDEwNlwwXDFcMzYyXDExMlwwXDRcMTIzIisKLSAgICAiXDZcMFwxXDEyM1w2XDBcNlwxMjNcMVwwXDEzXDEyM1wxXDBcMTNcMTIzIisKLSAgICAiXDFcMFw0XDEyM1wxXDBcMTFcMTIzXDJcMFwxXDEyM1wxXDEyNVwyXDAiKwotICAgICJcMVwzNjNcMVwxMjVcMVwwXDRcMTI1XDFcMFwxXDEyNVwxXDBcMlwxMjUiKwotICAgICJcMVwwXDZcMTI1XDFcMFw2MVwxMjVcMVwwXDFcMzYyXDFcMzYzXDFcMTI1IisKLSAgICAiXDFcMFw0XDEyNVwxXDBcMVwxMjVcMVwwXDJcMTI1XDFcMFw2XDEyNSIrCi0gICAgIlwxXDBcNjBcMTI1XDFcMzY0XDFcMFwxMFwzNjRcMVwzNjVcMlwzNjRcMVwzNjYiKwotICAgICJcNDdcMzY0XDFcMzY2XDIxXDM2NFwxXDM2N1wxXDBcMTJcMzY3XDFcMzY1XDFcMzcwIisKLSAgICAiXDQ3XDM2N1wxXDM3MFwyMVwzNjdcMlwwXDFcMTMzXDFcMzcxXDExMVwwXDRcMTM1IisKLSAgICAiXDZcMFwxXDEzNVw2XDBcNlwxMzVcMVwwXDEzXDEzNVwxXDBcMTNcMTM1IisKLSAgICAiXDFcMFw0XDEzNVwxXDBcMTFcMTM1XDJcMFwxXDEzNVwxXDEzN1wyXDAiKwotICAgICJcMVwzNzJcMVwxMzdcMVwwXDRcMTM3XDFcMFwxXDEzN1wxXDBcMlwxMzciKwotICAgICJcMVwwXDZcMTM3XDFcMFw2MVwxMzdcMVwwXDFcMTMzXDFcMzczXDFcMTM3IisKLSAgICAiXDFcMFw0XDEzN1wxXDBcMVwxMzdcMVwwXDJcMTM3XDFcMFw2XDEzNyIrCi0gICAgIlwxXDBcNjBcMTM3XDFcMTQxXDFcMFwxXDM3NFwxXDM3NVwxXDE0MVwxXDM3NCIrCi0gICAgIlw0XDE0MVwxXDM3NlwxXDE0MVwxXDM3NFwxXDM3N1wxXDE0MVwxXDM3NFw2XDE0MSIrCi0gICAgIlwxXDM3NFwzNlwxNDFcMVwzNzdcMjFcMTQxXDFcMTQyXDFcMFwxXHUwMTAwXDFcdTAxMDEiKwotICAgICJcMVwxNDJcMVx1MDEwMFw0XDE0MlwxXHUwMTAwXDFcMTQyXDFcMzc2XDFcdTAxMDJcMVwxNDIiKwotICAgICJcMVx1MDEwMFw2XDE0MlwxXHUwMTAwXDM2XDE0MlwxXHUwMTAyXDIxXDE0MlwyXDBcMVx1MDEwMyIrCi0gICAgIlwxMjZcMFwxXDMzN1wyXDBcMVx1MDEwNFw2N1wwXDRcMTQ3XDZcMFwxXDE0NyIrCi0gICAgIlw2XDBcNlwxNDdcMVwwXDEzXDE0N1wxXDBcMTNcMTQ3XDFcMFw0XDE0NyIrCi0gICAgIlwxXDBcMTFcMTQ3XDJcMFwxXDE0N1wyXDBcMVx1MDEwNVwxMTFcMFwxXDE1MSIrCi0gICAgIlwxMVwwXDFcMTUxXDZcMFwxXDE1MVw2NlwwXDRcMTUyXDZcMFwxXDE1MiIrCi0gICAgIlw2XDBcNlwxNTJcMVwwXDEzXDE1MlwxXDBcMTNcMTUyXDFcMFw0XDE1MiIrCi0gICAgIlwxXDBcMTFcMTUyXDJcMFwxXDE1MlwxXDE1NFwyXDBcMVx1MDEwNlwxXDE1NCIrCi0gICAgIlwxXDBcNFwxNTRcMVwwXDFcMTU0XDFcMFwyXDE1NFwxXDBcNlwxNTQiKwotICAgICJcMVwwXDYwXDE1NFwxXHUwMTA3XDFcMFwxMFx1MDEwN1wxXHUwMTA4XDJcdTAxMDdcMVx1MDEwOSIrCi0gICAgIlw0N1x1MDEwN1wxXHUwMTA5XDIxXHUwMTA3XDFcdTAxMGFcMVwwXDEyXHUwMTBhXDFcdTAxMDhcMVx1MDEwYiIrCi0gICAgIlw0N1x1MDEwYVwxXHUwMTBiXDIxXHUwMTBhXDFcMTU0XDFcMFwxXHUwMTA1XDFcdTAxMDZcMVwxNTQiKwotICAgICJcMVwwXDRcMTU0XDFcMFwxXDE1NFwxXDBcMlwxNTRcMVwwXDZcMTU0IisKLSAgICAiXDFcMFw2MFwxNTRcMVwxNjFcM1wwXDIzXDE2MVw2XDBcMVwxNjFcMTNcMCIrCi0gICAgIlwxXDE2MVwxM1wwXDFcMTYxXDRcMFwxXDE2MVw0XDBcMVwxNjFcNFwwIisKLSAgICAiXDJcMTYxXDRcMFwxXDMzNVwxNlwwXDFcMzM3XDJcMFwxXDM0MFw2M1wwIisKLSAgICAiXDFcdTAxMGNcMTA0XDBcMVwxNjFcM1wwXDJcMTYxXDRcMTY1XDZcMTYxXDFcMTY1IisKLSAgICAiXDZcMTYxXDZcMTY2XDFcMTYxXDEzXDE2NlwxXDE2MVwxM1wxNjZcMVwxNjFcNFwxNjYiKwotICAgICJcMVwxNjFcNFwxNjZcMVwxNjVcNFwxNjZcMlwxNjFcMVwxNjZcNlwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcN1wxNjZcMVx1MDEwZFwzXDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2NiIrCi0gICAgIlwzXDBcMVwzMzVcNFwwXDJcdTAxMGVcMTBcMFwxXDMzN1wyXDBcMVwzNDAiKwotICAgICJcMVwwXDZcdTAxMGVcMVwwXDEzXHUwMTBlXDFcMFwxM1x1MDEwZVwxXDBcNFx1MDEwZSIrCi0gICAgIlwxXDBcNFx1MDEwZVwxXDBcNFx1MDEwZVwyXDBcMVx1MDEwZVw2XDBcNFwxNzEiKwotICAgICJcNlwwXDFcMTcxXDZcMFw2XDE3MVwxXDBcMTNcMTcxXDFcMFwxM1wxNzEiKwotICAgICJcMVwwXDRcMTcxXDFcMFwxMVwxNzFcMlwwXDFcMTcxXDFcMTczXDJcMCIrCi0gICAgIlwxXHUwMTBmXDFcMTczXDFcMFw0XDE3M1wxXDBcMVwxNzNcMVwwXDJcMTczIisKLSAgICAiXDFcMFw2XDE3M1wxXDBcNjBcMTczXDNcMFwxXDMzNVw0XDBcMlx1MDExMCIrCi0gICAgIlwxMFwwXDFcMzM3XDJcMFwxXDM0MFwxXDBcNlx1MDExMFwxXDBcMTNcdTAxMTAiKwotICAgICJcMVwwXDEzXHUwMTEwXDFcMFw0XHUwMTEwXDFcMFw0XHUwMTEwXDFcMFw0XHUwMTEwIisKLSAgICAiXDJcMFwxXHUwMTEwXDFcMTczXDFcMFwxXHUwMTBjXDFcdTAxMGZcMVwxNzNcMVwwIisKLSAgICAiXDRcMTczXDFcMFwxXDE3M1wxXDBcMlwxNzNcMVwwXDZcMTczXDFcMCIrCi0gICAgIlw2MFwxNzNcMVx1MDExMVwxXDBcMTBcdTAxMTFcMVx1MDExMlwyXHUwMTExXDFcdTAxMTNcNDdcdTAxMTEiKwotICAgICJcMVx1MDExM1wyMVx1MDExMVwxXHUwMTE0XDFcMFwxMlx1MDExNFwxXHUwMTEyXDFcdTAxMTVcNDdcdTAxMTQiKwotICAgICJcMVx1MDExNVwyMVx1MDExNFwxXDE3M1wyXDBcMVx1MDEwZlwxXDE3M1wxXDBcNFwxNzMiKwotICAgICJcMVwwXDFcMTczXDFcMFwxXDE3M1wxXHUwMTE2XDFcMFw2XDE3M1wxXDAiKwotICAgICJcNjFcMTczXDJcMFwxXHUwMTBmXDFcMTczXDFcMFw0XDE3M1wxXDBcMVwxNzMiKwotICAgICJcMVwwXDFcMTczXDFcdTAxMTdcMVwwXDZcMTczXDFcMFw2MFwxNzNcM1wwIisKLSAgICAiXDFcMzM1XDE2XDBcMVwzMzdcMlwwXDFcdTAxMDRcMTMwXDBcMVx1MDExOFwyXDAiKwotICAgICJcMVx1MDExOFw3NVwwXDFcdTAxMTlcMTRcMFwxXHUwMTE5XDYzXDBcMlx1MDExYVw1MlwwIisKLSAgICAiXDIzXHUwMTFiXDFcdTAxMWNcNjNcdTAxMWJcNlwwXDRcMjEwXDZcMFwxXDIxMFw2XDAiKwotICAgICJcNlwyMTBcMVwwXDEzXDIxMFwxXDBcMTNcMjEwXDFcMFw0XDIxMFwxXDAiKwotICAgICJcMTFcMjEwXDJcMFwxXDIxMFw1M1wwXDFcdTAxMWRcNVwwXDFcdTAxMWRcMTE2XDAiKwotICAgICJcMVx1MDExZVwxMFwwXDFcdTAxMWVcNFwwXDFcMjEzXDJcMFwxXHUwMTFmXDFcMjEzIisKLSAgICAiXDFcMFw0XDIxM1wxXDBcMVwyMTNcMVwwXDJcMjEzXDFcMFw2XDIxMyIrCi0gICAgIlwxXDBcNjBcMjEzXDFcdTAxMjBcMVwwXDEwXHUwMTIwXDFcdTAxMjFcMlx1MDEyMFwxXHUwMTIyIisKLSAgICAiXDQ3XHUwMTIwXDFcdTAxMjJcMjFcdTAxMjBcMVx1MDEyM1wxXDBcMVx1MDEyM1wyXHUwMTI0XDFcdTAxMjMiKwotICAgICJcNFx1MDEyNFwyXHUwMTIzXDFcdTAxMjVcMVx1MDEyNlwxXHUwMTIzXDRcdTAxMjRcMVx1MDEyM1wxMVx1MDEyNCIrCi0gICAgIlwxXHUwMTIzXDI3XHUwMTI0XDFcdTAxMjZcMTBcdTAxMjRcMlx1MDEyM1w0XHUwMTI0XDJcdTAxMjNcMVx1MDEyNCIrCi0gICAgIlwxXDIxN1wyXHUwMTFiXDFcdTAxMjdcMVwyMTdcMVx1MDExYlw0XDIxN1wxXHUwMTFiXDFcMjE3IisKLSAgICAiXDFcdTAxMWJcMlwyMTdcMVx1MDExYlwzXDIxN1wxXHUwMTI4XDJcMjE3XDFcdTAxMWJcNjBcMjE3IisKLSAgICAiXDFcMjIwXDJcMFwxXHUwMTI5XDFcMjIwXDFcMFw0XDIyMFwxXDBcMVwyMjAiKwotICAgICJcMVwwXDJcMjIwXDFcMFw2XDIyMFwxXDBcNjBcMjIwXDEyXHUwMTJhXDFcdTAxMmIiKwotICAgICJcNzRcdTAxMmFcMTRcdTAxMmNcMVx1MDEyYlw3Mlx1MDEyY1wxXDIyNFwyXHUwMTFiXDFcdTAxMmRcMVwyMjQiKwotICAgICJcMVx1MDExYlw0XDIyNFwxXHUwMTFiXDFcMjI0XDFcdTAxMWJcMlwyMjRcMVx1MDExYlwzXDIyNCIrCi0gICAgIlwxXHUwMTJlXDJcMjI0XDFcdTAxMWJcNjBcMjI0XDFcMjI1XDJcMFwxXHUwMTJmXDFcMjI1IisKLSAgICAiXDFcMFw0XDIyNVwxXDBcMVwyMjVcMVwwXDJcMjI1XDFcMFw2XDIyNSIrCi0gICAgIlwxXDBcNjBcMjI1XDFcdTAxMzBcMVwwXDEwXHUwMTMwXDFcdTAxMzFcMlx1MDEzMFwxXHUwMTMyIisKLSAgICAiXDQ3XHUwMTMwXDFcdTAxMzJcMjFcdTAxMzBcMVx1MDEzM1wxXDBcMVx1MDEzM1wyXHUwMTM0XDFcdTAxMzMiKwotICAgICJcNFx1MDEzNFwyXHUwMTMzXDFcdTAxMzVcMVx1MDEzNlwxXHUwMTMzXDRcdTAxMzRcMVx1MDEzM1wxMVx1MDEzNCIrCi0gICAgIlwxXHUwMTMzXDI3XHUwMTM0XDFcdTAxMzZcMTBcdTAxMzRcMlx1MDEzM1w0XHUwMTM0XDJcdTAxMzNcMVx1MDEzNCIrCi0gICAgIlwyXDIzMVwxXDBcMTA2XDIzMVwxXDBcMTdcMjMxXDFcdTAxMzdcMlwyMzFcMVx1MDEzOCIrCi0gICAgIlw2MVwyMzFcMVwyMzRcMlwwXDFcdTAxMzlcMVwyMzRcMVwwXDRcMjM0XDFcMCIrCi0gICAgIlwxXDIzNFwxXDBcMlwyMzRcMVwwXDZcMjM0XDFcMFw2MFwyMzRcMVx1MDEzYSIrCi0gICAgIlwxXDBcMTBcdTAxM2FcMVx1MDEzYlwyXHUwMTNhXDFcdTAxM2NcNDdcdTAxM2FcMVx1MDEzY1wyMVx1MDEzYSIrCi0gICAgIlwxXHUwMTNkXDFcMFwxXHUwMTNkXDJcdTAxM2VcMVx1MDEzZFw0XHUwMTNlXDJcdTAxM2RcMVx1MDEzZiIrCi0gICAgIlwxXHUwMTQwXDFcdTAxM2RcNFx1MDEzZVwxXHUwMTNkXDExXHUwMTNlXDFcdTAxM2RcMjdcdTAxM2VcMVx1MDE0MCIrCi0gICAgIlwxMFx1MDEzZVwyXHUwMTNkXDRcdTAxM2VcMlx1MDEzZFwxXHUwMTNlXDJcMjQwXDFcMFwxMDZcMjQwIisKLSAgICAiXDFcMFwxN1wyNDBcMVx1MDE0MVwyXDI0MFwxXHUwMTQyXDYxXDI0MFw3XDBcMVx1MDE0MyIrCi0gICAgIlw3N1wwXDFcMjUwXDFcMFwxMlwyNTBcMVwwXDFcdTAxNDRcNDdcMjUwXDFcdTAxNDQiKwotICAgICJcMjFcMjUwXDNcMFwxXHUwMTQ1XDE2XDBcMVwzMzdcMlwwXDFcMzUyXDYxXDAiKwotICAgICJcMVwyNTBcMVwwXDNcMjUwXDFcMjUyXDZcMjUwXDFcMFwxXHUwMTQ0XDFcMjUwIisKLSAgICAiXDFcMjUyXDZcMjUwXDFcMjUyXDM2XDI1MFwxXHUwMTQ0XDM3XDI1MFwxXHUwMTQ2XDEwNlwyNTAiKwotICAgICJcMVx1MDE0N1w3MFwyNTBcMVwyNTZcMVwwXDEwXDI1NlwxXDBcMlwyNTZcMVx1MDE0OCIrCi0gICAgIlw0N1wyNTZcMVx1MDE0OFwyMlwyNTZcMVwwXDNcMjU2XDFcMjU3XDRcMjU2XDFcMCIrCi0gICAgIlwyXDI1NlwxXHUwMTQ4XDFcMjU2XDFcMjU3XDZcMjU2XDFcMjU3XDM2XDI1NlwxXHUwMTQ4IisKLSAgICAiXDM3XDI1NlwxXHUwMTQ5XDEwNlwyNTZcMVx1MDE0YVw3MFwyNTZcMTJcMjYzXDFcMFwxXDI2MyIrCi0gICAgIlwxXDBcMVx1MDE0Ylw2N1wyNjNcMVwwXDEzXDI2M1wxXDBcMVwyNjNcMVwwIisKLSAgICAiXDFcdTAxNGJcNFwyNjNcMVx1MDE0Y1w2MlwyNjNcMVwwXDEzXDI2M1wxXDBcMVwyNjMiKwotICAgICJcMVwwXDFcMjYzXDFcdTAxNGRcNjZcMjYzXDFcdTAxNGVcMVwyNjNcMTRcdTAxNGZcMVx1MDE1MCIrCi0gICAgIlwxMDZcdTAxNGZcMVx1MDE1MFw1XHUwMTRmXDFcdTAxNTFcMlx1MDE0ZlwxXHUwMTUyXDYxXHUwMTRmXDEyXHUwMTUzIisKLSAgICAiXDFcdTAxNTRcMTA2XHUwMTUzXDFcdTAxNTRcN1x1MDE1M1wxXHUwMTU1XDJcdTAxNTNcMVx1MDE1Nlw2MVx1MDE1MyIrCi0gICAgIlwxMlwzMDFcMVwwXDcxXDMwMVwxXHUwMTU3XDFcMFwxM1wzMDFcMVwwXDdcMzAxIisKLSAgICAiXDFcdTAxNThcNjFcMzAxXDFcdTAxNTdcMVwwXDEzXDMwMVwxXHUwMTU5XDc0XDMwMVwxNFwzMDUiKwotICAgICJcMVwwXDY3XDMwNVwxXHUwMTVhXDFcMFwxNVwzMDVcMVwwXDVcMzA1XDFcdTAxNWIiKwotICAgICJcNjFcMzA1XDFcdTAxNWFcMVwwXDE1XDMwNVwxXHUwMTVjXDcyXDMwNVwxMlwzMTBcMVwwIisKLSAgICAiXDFcMzEwXDFcMFw3MFwzMTBcMVwwXDEzXDMxMFwxXDBcMVwzMTBcMVwwIisKLSAgICAiXDVcMzEwXDFcdTAxNWRcNjJcMzEwXDFcMFwxM1wzMTBcMVwwXDFcMzEwXDFcMCIrCi0gICAgIlwxXDMxMFwxXHUwMTVlXDY2XDMxMFwxXDBcMVwzMTBcMTRcdTAxNWZcMVx1MDE2MFwxMDZcdTAxNWYiKwotICAgICJcMVx1MDE2MFw1XHUwMTVmXDFcdTAxNjFcMlx1MDE1ZlwxXHUwMTYyXDYxXHUwMTVmXDEyXHUwMTYzXDFcdTAxNjQiKwotICAgICJcMTA2XHUwMTYzXDFcdTAxNjRcN1x1MDE2M1wxXHUwMTY1XDJcdTAxNjNcMVx1MDE2Nlw2MVx1MDE2M1wxMlwzMjYiKwotICAgICJcMVwwXDcxXDMyNlwxXHUwMTY3XDFcMFwxM1wzMjZcMVwwXDdcMzI2XDFcdTAxNjgiKwotICAgICJcNjFcMzI2XDFcdTAxNjdcMVwwXDEzXDMyNlwxXHUwMTY5XDc0XDMyNlwxNFwzMzJcMVwwIisKLSAgICAiXDY3XDMzMlwxXHUwMTZhXDFcMFwxNVwzMzJcMVwwXDVcMzMyXDFcdTAxNmJcNjFcMzMyIisKLSAgICAiXDFcdTAxNmFcMVwwXDE1XDMzMlwxXHUwMTZjXDcyXDMzMlw3XDBcMVx1MDE2ZFwxMVwwIisKLSAgICAiXDFcdTAxNmVcM1wwXDFcdTAxNmZcMjNcMFwxXHUwMTcwXDQ0XDBcMVx1MDE3MVwyNVwwIisKLSAgICAiXDFcdTAxNzJcNTZcMFwxXDM0MVwyXDBcMlx1MDE3M1w1XDBcMVwzNDFcNlwwIisKLSAgICAiXDFcMzQxXDZcdTAxNzNcMVwwXDEzXHUwMTczXDFcMFwxM1x1MDE3M1wxXDBcNFx1MDE3MyIrCi0gICAgIlwxXDBcNFx1MDE3M1wxXDBcNFx1MDE3M1wyXDBcMVx1MDE3M1wxXHUwMTc0XDFcMCIrCi0gICAgIlwzXHUwMTc0XDFcdTAxNzVcNFwzNDJcMVx1MDE3NFwxXDBcM1x1MDE3NFwxXHUwMTc1XDFcMzQyIisKLSAgICAiXDFcdTAxNzRcMVwwXDNcdTAxNzRcMVx1MDE3NVw2XDM0MlwxXHUwMTc0XDEzXDM0MlwxXHUwMTc0IisKLSAgICAiXDEzXDM0MlwxXHUwMTc0XDRcMzQyXDFcdTAxNzZcMTFcMzQyXDJcdTAxNzRcMVwzNDJcMjBcMCIrCi0gICAgIlwxXHUwMTc3XDdcMFwxXHUwMTc4XDczXDBcMVwzNDVcNzFcMFwxMDVcMzQ2XDFcdTAxNzkiKwotICAgICJcMVwzNDZcMVx1MDE3NFwxXDBcM1x1MDE3NFwxXHUwMTc1XDRcMzQ3XDFcdTAxNzRcMVwwIisKLSAgICAiXDNcdTAxNzRcMVx1MDE3NVwxXDM0N1wxXHUwMTc0XDFcMFwzXHUwMTc0XDFcdTAxNzVcNlwzNDciKwotICAgICJcMVx1MDE3NFwxM1wzNDdcMVx1MDE3NFwxM1wzNDdcMVx1MDE3NFw0XDM0N1wxXHUwMTdhXDExXDM0NyIrCi0gICAgIlwyXHUwMTc0XDFcMzQ3XDEwNVwzNTBcMVx1MDE3YlwxXDM1MFw2NVwwXDFcMzUxXDU2XDAiKwotICAgICJcMVx1MDE3Mlw1M1wwXDFcdTAxN2NcMTA2XDBcMVx1MDE3ZFwxMTJcMFw0XDExMlw2XDAiKwotICAgICJcMVwxMTJcNlwwXDRcMTEyXDJcdTAxN2VcMVwwXDEzXDExMlwxXDBcMTNcMTEyIisKLSAgICAiXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxMTIiKwotICAgICJcNlwwXDFcMTEyXDZcMFw0XDExMlwxXHUwMTdlXDFcdTAxN2ZcMVwwXDEzXDExMiIrCi0gICAgIlwxXDBcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMiIrCi0gICAgIlw2XDBcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDBcMTNcMTEyIisKLSAgICAiXDFcMFwyXDExMlwxXHUwMTgwXDEwXDExMlwxXDBcNFwxMTJcMVwwXDZcMTEyIisKLSAgICAiXDFcdTAxODBcMlwxMTJcMlwwXDFcMTEyXDEyXDM2NFwxXDM2NVwzXDM2NFwxXDAiKwotICAgICJcNzBcMzY0XDE0XDM2N1wxXDM2NVwxXDM2N1wxXDBcNzBcMzY3XDFcMzc0XDFcMCIrCi0gICAgIlwxMFwzNzRcMVwzNzZcMlwzNzRcMVx1MDE4MVw0N1wzNzRcMVx1MDE4MVwyMVwzNzRcMVwxNDEiKwotICAgICJcMlwzNzRcMVwzNzVcMVwxNDFcMVwzNzRcNFwxNDFcMVwzNzZcMVwxNDFcMVwzNzQiKwotICAgICJcMVwxNDFcMVwxMzdcMVwzNzRcNlwxNDFcMVwzNzRcNjBcMTQxXDFcdTAxMDBcMVwwIisKLSAgICAiXDEyXHUwMTAwXDFcMzc2XDFcdTAxODJcNDdcdTAxMDBcMVx1MDE4MlwyMVx1MDEwMFwxXDE0MlwyXHUwMTAwIisKLSAgICAiXDFcdTAxMDFcMVwxNDJcMVx1MDEwMFw0XDE0MlwxXHUwMTAwXDFcMTQyXDFcMzc2XDFcMTQyIisKLSAgICAiXDFcMTM3XDFcdTAxMDBcNlwxNDJcMVx1MDEwMFw2MFwxNDJcMTJcdTAxMDdcMVx1MDEwOFwzXHUwMTA3IisKLSAgICAiXDFcMFw3MFx1MDEwN1wxNFx1MDEwYVwxXHUwMTA4XDFcdTAxMGFcMVwwXDcwXHUwMTBhXDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDZcMTY2XDFcdTAxODNcMlwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XHUwMTBlXDZcMFwxXHUwMTBlXDZcMFw2XHUwMTBlXDFcMCIrCi0gICAgIlwxM1x1MDEwZVwxXDBcMTNcdTAxMGVcMVwwXDRcdTAxMGVcMVwwXDExXHUwMTBlXDJcMCIrCi0gICAgIlwxXHUwMTBlXDZcMFw0XHUwMTEwXDZcMFwxXHUwMTEwXDZcMFw2XHUwMTEwXDFcMCIrCi0gICAgIlwxM1x1MDExMFwxXDBcMTNcdTAxMTBcMVwwXDRcdTAxMTBcMVwwXDExXHUwMTEwXDJcMCIrCi0gICAgIlwxXHUwMTEwXDEyXHUwMTExXDFcdTAxMTJcM1x1MDExMVwxXDBcNzBcdTAxMTFcMTRcdTAxMTRcMVx1MDExMiIrCi0gICAgIlwxXHUwMTE0XDFcMFw3MFx1MDExNFwxXHUwMTg0XDJcdTAxODVcMVx1MDE4NlwxXHUwMTg0XDFcdTAxODUiKwotICAgICJcNFx1MDE4NFwxXHUwMTg1XDFcdTAxODRcMVx1MDE4NVwyXHUwMTg0XDFcdTAxODVcNlx1MDE4NFwxXHUwMTg1IisKLSAgICAiXDU2XHUwMTg0XDFcMTczXDFcdTAxODRcMVx1MDE4N1wyXHUwMTg4XDFcdTAxODlcMVx1MDE4N1wxXHUwMTg4IisKLSAgICAiXDRcdTAxODdcMVx1MDE4OFwxXHUwMTg3XDFcdTAxODhcMlx1MDE4N1wxXHUwMTg4XDZcdTAxODdcMVx1MDE4OCIrCi0gICAgIlw1Nlx1MDE4N1wxXDE3M1wxXHUwMTg3XDM2XDBcMVx1MDE4YVwzNVwwXDFcdTAxOGFcNTNcMCIrCi0gICAgIlwxXHUwMThiXDE0XDBcMVx1MDE4Ylw3M1wwXDFcdTAxOGNcMTFcMFwxXHUwMThjXDc2XDAiKwotICAgICJcMVx1MDE4ZFwyMFwwXDFcdTAxOGRcMTEzXDBcMVx1MDE4ZVw3XDBcMVx1MDE4ZVwzXDAiKwotICAgICJcMTJcdTAxMjBcMVx1MDEyMVwzXHUwMTIwXDFcMFw3MFx1MDEyMFwxXHUwMTIzXDFcMFwxMlx1MDEyMyIrCi0gICAgIlwxXHUwMTIxXDFcdTAxOGZcNDdcdTAxMjNcMVx1MDE4ZlwyMlx1MDEyM1wxXDBcMTJcdTAxMjNcMVx1MDE5MCIrCi0gICAgIlwxXHUwMThmXDQ3XHUwMTIzXDFcdTAxOGZcMjFcdTAxMjNcMTRcMFwxXHUwMTkxXDcyXDBcMTRcdTAxMjMiKwotICAgICJcMVx1MDE5MFwxXHUwMTIzXDFcMFw3MFx1MDEyM1wxMlx1MDEzMFwxXHUwMTMxXDNcdTAxMzBcMVwwIisKLSAgICAiXDcwXHUwMTMwXDFcdTAxMzNcMVwwXDEyXHUwMTMzXDFcdTAxMzFcMVx1MDE5Mlw0N1x1MDEzM1wxXHUwMTkyIisKLSAgICAiXDIyXHUwMTMzXDFcMFwxMlx1MDEzM1wxXHUwMTkzXDFcdTAxOTJcNDdcdTAxMzNcMVx1MDE5MlwyMVx1MDEzMyIrCi0gICAgIlwxNFwwXDFcdTAxOTRcNzJcMFwxNFx1MDEzM1wxXHUwMTkzXDFcdTAxMzNcMVwwXDcwXHUwMTMzIisKLSAgICAiXDJcMjMxXDFcMFw0XDIzMVwxXHUwMTk1XDExXDIzMVwxXHUwMTk2XDNcMjMxXDFcdTAxOTciKwotICAgICJcMjNcMjMxXDFcdTAxOThcMzdcMjMxXDFcMFwzMlwyMzFcMVx1MDE5OVw1MVwyMzFcMTJcdTAxM2EiKwotICAgICJcMVx1MDEzYlwzXHUwMTNhXDFcMFw3MFx1MDEzYVwxXHUwMTNkXDFcMFwxMlx1MDEzZFwxXHUwMTNiIisKLSAgICAiXDFcdTAxOWFcNDdcdTAxM2RcMVx1MDE5YVwyMlx1MDEzZFwxXDBcMTJcdTAxM2RcMVx1MDE5YlwxXHUwMTlhIisKLSAgICAiXDQ3XHUwMTNkXDFcdTAxOWFcMjFcdTAxM2RcMTRcMFwxXHUwMTljXDcyXDBcMTRcdTAxM2RcMVx1MDE5YiIrCi0gICAgIlwxXHUwMTNkXDFcMFw3MFx1MDEzZFwyXDI0MFwxXDBcNFwyNDBcMVx1MDE5ZFwxMVwyNDAiKwotICAgICJcMVx1MDE5ZVwzXDI0MFwxXHUwMTlmXDIzXDI0MFwxXHUwMWEwXDM3XDI0MFwxXDBcMzJcMjQwIisKLSAgICAiXDFcdTAxYTFcNTFcMjQwXDIyXDBcMVx1MDFhMlw2NFwwXDE2XDI1MFwxXDBcNzBcMjUwIisKLSAgICAiXDE2XDI1NlwxXDBcNzBcMjU2XDEyXDI2M1wxXDBcMVwyNjNcMVwwXDFcMjYzIisKLSAgICAiXDFcdTAxYTNcNjZcMjYzXDFcdTAxNGVcMTBcMjYzXDFcdTAxYTRcMlwyNjNcMVwwXDFcMjYzIisKLSAgICAiXDFcMFwxXHUwMTRiXDNcMjYzXDFcdTAxYTVcM1wyNjNcMVx1MDFhNlwyM1wyNjNcMVx1MDFhNyIrCi0gICAgIlwzM1wyNjNcMVwwXDFcMjYzXDEyXHUwMWEzXDFcMFwxXHUwMWEzXDFcMFw3MFx1MDFhMyIrCi0gICAgIlwxXDBcMVx1MDFhM1wxMlx1MDE0ZVwxXDBcMVx1MDE0ZVwxXDBcMVx1MDFhOFw2N1x1MDE0ZSIrCi0gICAgIlwxXDBcMVx1MDE0ZVw3XHUwMTRmXDFcdTAxYTlcNFx1MDE0ZlwxXHUwMTUwXDRcdTAxNGZcMVx1MDFhYSIrCi0gICAgIlwzXHUwMTRmXDFcdTAxYWJcMjNcdTAxNGZcMVx1MDFhY1w1MVx1MDE0ZlwxXHUwMTUwXDIwXHUwMTRmXDFcdTAxYWQiKwotICAgICJcNTFcdTAxNGZcN1x1MDE1M1wxXHUwMWFlXDJcdTAxNTNcMVx1MDE1NFw2XHUwMTUzXDFcdTAxYWZcM1x1MDE1MyIrCi0gICAgIlwxXHUwMWIwXDIzXHUwMTUzXDFcdTAxYjFcNDdcdTAxNTNcMVx1MDE1NFwyMlx1MDE1M1wxXHUwMWIyXDUxXHUwMTUzIisKLSAgICAiXDEyXDMwMVwxXDBcMTAzXDMwMVwxXHUwMWIzXDJcMzAxXDFcMFw2XDMwMVwxXHUwMWI0IisKLSAgICAiXDNcMzAxXDFcdTAxYjVcMjNcMzAxXDFcdTAxYjZcMzJcMzAxXDFcdTAxNTdcMVwwXDFcMzAxIisKLSAgICAiXDEwNFx1MDFiN1wxXHUwMWI4XDJcdTAxYjdcMTRcMzA1XDFcMFwxMDFcMzA1XDFcdTAxYjlcNFwzMDUiKwotICAgICJcMVwwXDRcMzA1XDFcdTAxYmFcM1wzMDVcMVx1MDFiYlwyM1wzMDVcMVx1MDFiY1wzMlwzMDUiKwotICAgICJcMVx1MDE1YVwxXDBcMVwzMDVcMTA0XHUwMWJkXDFcdTAxYmVcMlx1MDFiZFw3XDMxMFwxXHUwMWJmIisKLSAgICAiXDJcMzEwXDFcMFwxXDMxMFwxXDBcNFwzMTBcMVx1MDFjMFwzXDMxMFwxXHUwMWMxIisKLSAgICAiXDIzXDMxMFwxXHUwMWMyXDMzXDMxMFwxXDBcMVwzMTBcN1x1MDE1ZlwxXHUwMWMzXDRcdTAxNWYiKwotICAgICJcMVx1MDE2MFw0XHUwMTVmXDFcdTAxYzRcM1x1MDE1ZlwxXHUwMWM1XDIzXHUwMTVmXDFcdTAxYzZcNTFcdTAxNWYiKwotICAgICJcMVx1MDE2MFwyMFx1MDE1ZlwxXHUwMWM3XDUxXHUwMTVmXDdcdTAxNjNcMVx1MDFjOFwyXHUwMTYzXDFcdTAxNjQiKwotICAgICJcNlx1MDE2M1wxXHUwMWM5XDNcdTAxNjNcMVx1MDFjYVwyM1x1MDE2M1wxXHUwMWNiXDQ3XHUwMTYzXDFcdTAxNjQiKwotICAgICJcMjJcdTAxNjNcMVx1MDFjY1w1MVx1MDE2M1wxMlwzMjZcMVwwXDEwM1wzMjZcMVx1MDFjZFwyXDMyNiIrCi0gICAgIlwxXDBcNlwzMjZcMVx1MDFjZVwzXDMyNlwxXHUwMWNmXDIzXDMyNlwxXHUwMWQwXDMyXDMyNiIrCi0gICAgIlwxXHUwMTY3XDFcMFwxXDMyNlwxMDRcdTAxZDFcMVx1MDFkMlwyXHUwMWQxXDE0XDMzMlwxXDAiKwotICAgICJcMTAxXDMzMlwxXHUwMWQzXDRcMzMyXDFcMFw0XDMzMlwxXHUwMWQ0XDNcMzMyXDFcdTAxZDUiKwotICAgICJcMjNcMzMyXDFcdTAxZDZcMzJcMzMyXDFcdTAxNmFcMVwwXDFcMzMyXDEwNFx1MDFkN1wxXHUwMWQ4IisKLSAgICAiXDJcdTAxZDdcN1wwXDFcdTAxZDlcMTA2XDBcMVx1MDFkYVwxMzVcMFwxXHUwMWRiXDUwXDAiKwotICAgICJcMVx1MDE3M1wxXDBcMTFcdTAxNzNcMVwwXDZcdTAxNzNcMVwwXDY0XHUwMTczXDFcdTAxNzQiKwotICAgICJcMVwwXDExXHUwMTc0XDFcMFw2XHUwMTc0XDFcMFw0N1x1MDE3NFwxXDBcMTVcdTAxNzQiKwotICAgICJcMVwwXDNcdTAxNzRcMVx1MDE3NVw1XHUwMTc0XDFcMFwzXHUwMTc0XDFcdTAxNzVcMlx1MDE3NCIrCi0gICAgIlwxXDBcM1x1MDE3NFwxXHUwMTc1XDQzXHUwMTc0XDFcdTAxZGNcMTRcdTAxNzRcMjBcMFwxXHUwMTc3IisKLSAgICAiXDUxXDBcMVx1MDFkZFwzNFwwXDFcdTAxZGVcMTVcMFwzXHUwMWRlXDJcMFwxXHUwMWRlIisKLSAgICAiXDExXDBcMVx1MDFkZVwxXDBcMlx1MDFkZVw3XDBcMVx1MDFkZVwyXDBcMlx1MDFkZSIrCi0gICAgIlw2XDBcMVx1MDFkZVwxMVwwXDFcMTEyXDFcdTAxZGZcMlwxMTJcNlwwXDFcMTEyIisKLSAgICAiXDZcMFw2XDExMlwxXDBcMTNcMTEyXDFcMFwxM1wxMTJcMVwwXDRcMTEyIisKLSAgICAiXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDExMlw2XDBcMVwxMTIiKwotICAgICJcNlwwXDZcMTEyXDFcMFwxMVwxMTJcMVx1MDFlMFwxXDExMlwxXDBcMVx1MDFlMCIrCi0gICAgIlwxMlwxMTJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDEyXDM3NCIrCi0gICAgIlwxXDM3NlwzXDM3NFwxXDBcNzBcMzc0XDE0XHUwMTAwXDFcMzc2XDFcdTAxMDBcMVwwIisKLSAgICAiXDcwXHUwMTAwXDZcMFwzXDE2NlwxXHUwMWUxXDZcMFwxXDE2Nlw2XDBcNlwxNjYiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2IisKLSAgICAiXDJcMFwxXDE2NlwxXHUwMTg0XDJcdTAxODVcMVx1MDE4NlwxXHUwMTg0XDFcdTAxODVcNFx1MDE4NCIrCi0gICAgIlwxXHUwMTg1XDFcdTAxODRcMVx1MDE4NVwyXHUwMTg0XDFcdTAxODVcNlx1MDE4NFwxXHUwMTg1XDU2XHUwMTg0IisKLSAgICAiXDFcdTAxZTJcMVx1MDE4NFwxMDVcdTAxODVcMVx1MDFlM1wxXHUwMTg1XDFcdTAxODdcMlx1MDE4OFwxXHUwMTg5IisKLSAgICAiXDFcdTAxODdcMVx1MDE4OFw0XHUwMTg3XDFcdTAxODhcMVx1MDE4N1wxXHUwMTg4XDJcdTAxODdcMVx1MDE4OCIrCi0gICAgIlw2XHUwMTg3XDFcdTAxODhcNTZcdTAxODdcMVx1MDFlMlwxXHUwMTg3XDEwNVx1MDE4OFwxXHUwMWU0XDFcdTAxODgiKwotICAgICJcNDFcMFwxXHUwMWU1XDE0XDBcMVx1MDFlNVw2M1wwXDJcdTAxZTZcMTAzXDBcMlx1MDFlNyIrCi0gICAgIlwxMTVcMFwxXHUwMWU4XDE0XDBcMVx1MDFlOFw2M1wwXDJcdTAxZTlcNTJcMFwxNFx1MDEyMyIrCi0gICAgIlwxXHUwMTIxXDFcdTAxMjNcMVwwXDcwXHUwMTIzXDNcMFwyXHUwMWVhXDFcMFw0XHUwMWVhIisKLSAgICAiXDJcMFwxXHUwMTI1XDFcdTAxZWFcMVwwXDRcdTAxZWFcMVwwXDExXHUwMWVhXDFcMCIrCi0gICAgIlw0MFx1MDFlYVwyXDBcNFx1MDFlYVwyXDBcMVx1MDFlYVwxNFx1MDEzM1wxXHUwMTMxXDFcdTAxMzMiKwotICAgICJcMVwwXDcwXHUwMTMzXDNcMFwyXHUwMWViXDFcMFw0XHUwMWViXDJcMFwxXHUwMTM1IisKLSAgICAiXDFcdTAxZWJcMVwwXDRcdTAxZWJcMVwwXDExXHUwMWViXDFcMFw0MFx1MDFlYlwyXDAiKwotICAgICJcNFx1MDFlYlwyXDBcMVx1MDFlYlwyXDIzMVwxXDBcNFwyMzFcMVx1MDFlY1wxMDFcMjMxIisKLSAgICAiXDFcMFwzM1wyMzFcMVx1MDFlZFw1MFwyMzFcMTRcdTAxM2RcMVx1MDEzYlwxXHUwMTNkXDFcMCIrCi0gICAgIlw3MFx1MDEzZFwzXDBcMlx1MDFlZVwxXDBcNFx1MDFlZVwyXDBcMVx1MDEzZlwxXHUwMWVlIisKLSAgICAiXDFcMFw0XHUwMWVlXDFcMFwxMVx1MDFlZVwxXDBcNDBcdTAxZWVcMlwwXDRcdTAxZWUiKwotICAgICJcMlwwXDFcdTAxZWVcMlwyNDBcMVwwXDRcMjQwXDFcdTAxZWZcMTAxXDI0MFwxXDAiKwotICAgICJcMzNcMjQwXDFcdTAxZjBcNTBcMjQwXDJcMFwxXHUwMWYxXDEwNFwwXDdcMjYzXDFcdTAxZjIiKwotICAgICJcMlwyNjNcMVwwXDFcMjYzXDFcMFwxXHUwMTRiXDY3XDI2M1wxXDBcMVwyNjMiKwotICAgICJcMTJcdTAxNGVcMVwwXDFcdTAxNGVcMVwwXDFcdTAxNGVcMVwwXDcwXHUwMTRlXDdcdTAxNGYiKwotICAgICJcMVx1MDFmM1w0XHUwMTRmXDFcdTAxNTBcMTA2XHUwMTRmXDFcdTAxNTBcMjFcdTAxNGZcMVx1MDFmNFw1MFx1MDE0ZiIrCi0gICAgIlw3XHUwMTUzXDFcdTAxZjVcMlx1MDE1M1wxXHUwMTU0XDEwNlx1MDE1M1wxXHUwMTU0XDIzXHUwMTUzXDFcdTAxZjYiKwotICAgICJcNTBcdTAxNTNcN1wzMDFcMVx1MDFmN1wyXDMwMVwxXDBcNzFcMzAxXDFcdTAxNTdcMVwwIisKLSAgICAiXDFcMzAxXDEyXHUwMWY4XDFcdTAxZjlcNzJcdTAxZjhcMVwwXDFcdTAxZjhcN1wzMDVcMVx1MDFmYSIrCi0gICAgIlw0XDMwNVwxXDBcNjdcMzA1XDFcdTAxNWFcMVwwXDFcMzA1XDE0XHUwMWZiXDFcdTAxZjkiKwotICAgICJcNzBcdTAxZmJcMVwwXDFcdTAxZmJcN1wzMTBcMVx1MDFmY1wyXDMxMFwxXDBcMVwzMTAiKwotICAgICJcMVwwXDcwXDMxMFwxXDBcMVwzMTBcN1x1MDE1ZlwxXHUwMWZkXDRcdTAxNWZcMVx1MDE2MCIrCi0gICAgIlwxMDZcdTAxNWZcMVx1MDE2MFwyMVx1MDE1ZlwxXHUwMWZlXDUwXHUwMTVmXDdcdTAxNjNcMVx1MDFmZlwyXHUwMTYzIisKLSAgICAiXDFcdTAxNjRcMTA2XHUwMTYzXDFcdTAxNjRcMjNcdTAxNjNcMVx1MDIwMFw1MFx1MDE2M1w3XDMyNlwxXHUwMjAxIisKLSAgICAiXDJcMzI2XDFcMFw3MVwzMjZcMVx1MDE2N1wxXDBcMVwzMjZcMTJcdTAyMDJcMVx1MDIwMyIrCi0gICAgIlw3Mlx1MDIwMlwxXDBcMVx1MDIwMlw3XDMzMlwxXHUwMjA0XDRcMzMyXDFcMFw2N1wzMzIiKwotICAgICJcMVx1MDE2YVwxXDBcMVwzMzJcMTRcdTAyMDVcMVx1MDIwM1w3MFx1MDIwNVwxXDBcMVx1MDIwNSIrCi0gICAgIlwzN1wwXDFcdTAyMDZcMTQxXDBcMVx1MDFkY1wzNFwwXDFcdTAxZGVcMTVcMFwzXHUwMWRlIisKLSAgICAiXDJcMFwxXHUwMWRlXDExXDBcMVx1MDFkZVwxXDBcMlx1MDFkZVw3XDBcMVx1MDFkZSIrCi0gICAgIlwxXDBcMVx1MDFkZFwyXHUwMWRlXDZcMFwxXHUwMWRlXDExXDBcNFwxMTJcNlwwIisKLSAgICAiXDFcMTEyXDZcMFw2XDExMlwxXDBcN1wxMTJcMVx1MDIwN1wzXDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDAiKwotICAgICJcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDBcNlwxMTJcMVx1MDIwOCIrCi0gICAgIlw0XDExMlwxXDBcMTNcMTEyXDFcMFwxXDExMlwxXHUwMjA4XDJcMTEyXDFcMCIrCi0gICAgIlwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFw2XDE2NlwxXHUwMjA5XDRcMTY2XDFcMFw2XDE2NlwxXHUwMjBhIisKLSAgICAiXDRcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw1M1wwIisKLSAgICAiXDFcdTAyMGJcNVwwXDFcdTAyMGJcNzNcMFwxXHUwMjBjXDE0XDBcMVx1MDIwY1w2NlwwIisKLSAgICAiXDFcdTAyMGRcMTFcMFwxXHUwMjBkXDc0XDBcMVx1MDIwZVwxMVwwXDFcdTAyMGVcNzdcMCIrCi0gICAgIlwxXHUwMjBmXDE0XDBcMVx1MDIwZlwyM1wwXDJcMjMxXDFcMFwzNFwyMzFcMVx1MDIxMCIrCi0gICAgIlw0N1wyMzFcMlwyNDBcMVwwXDM0XDI0MFwxXHUwMjExXDQ3XDI0MFwxNFx1MDE0ZlwxXHUwMTUwIisKLSAgICAiXDIyXHUwMTRmXDFcdTAyMTJcNDdcdTAxNGZcMTJcdTAxNTNcMVx1MDE1NFwyNFx1MDE1M1wxXHUwMjEzXDQ3XHUwMTUzIisKLSAgICAiXDEyXHUwMWY4XDFcdTAxYjdcNzFcdTAxZjhcMVx1MDIxNFwxXHUwMWI3XDFcdTAxZjhcMTRcdTAxZmJcMVx1MDFiZCIrCi0gICAgIlw2N1x1MDFmYlwxXHUwMjE1XDFcdTAxYmRcMVx1MDFmYlwxNFx1MDE1ZlwxXHUwMTYwXDIyXHUwMTVmXDFcdTAyMTYiKwotICAgICJcNDdcdTAxNWZcMTJcdTAxNjNcMVx1MDE2NFwyNFx1MDE2M1wxXHUwMjE3XDQ3XHUwMTYzXDEyXHUwMjAyXDFcdTAxZDEiKwotICAgICJcNzFcdTAyMDJcMVx1MDIxOFwxXHUwMWQxXDFcdTAyMDJcMTRcdTAyMDVcMVx1MDFkN1w2N1x1MDIwNVwxXHUwMjE5IisKLSAgICAiXDFcdTAxZDdcMVx1MDIwNVw0MFwwXDFcdTAyMWFcNTRcMFw0XDExMlw2XDBcMVwxMTIiKwotICAgICJcNlwwXDZcMTEyXDFcMFwxM1wxMTJcMVwwXDRcMTEyXDFcdTAyMWJcNlwxMTIiKwotICAgICJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDExMiIrCi0gICAgIlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMFwzXDExMlwxXHUwMjFjXDdcMTEyIisKLSAgICAiXDFcMFw0XDExMlwxXHUwMjFjXDZcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyIisKLSAgICAiXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDFcdTAyMWRcMVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNlwxNjZcMVwwXDEwXDE2NlwxXHUwMjFlXDJcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDU0XDBcMVx1MDIxZiIrCi0gICAgIlwyNFwwXDFcdTAyMWZcNTJcMFwxXHUwMjIwXDIwXDBcMVx1MDIyMFw3MFwwXDFcdTAyMjEiKwotICAgICJcMTNcMFwxXHUwMjIxXDUzXDBcMlx1MDIyMlwxMTJcMFwxXHUwMjIzXDM1XDBcMVx1MDIyMyIrCi0gICAgIlwxMlwwXDJcMjMxXDFcMFwzNVwyMzFcMVx1MDIyNFw0NlwyMzFcMlwyNDBcMVwwIisKLSAgICAiXDM1XDI0MFwxXHUwMjI1XDQ2XDI0MFwxNFx1MDE0ZlwxXHUwMTUwXDIzXHUwMTRmXDFcdTAyMjZcNDZcdTAxNGYiKwotICAgICJcMTJcdTAxNTNcMVx1MDE1NFwyNVx1MDE1M1wxXHUwMjI3XDQ2XHUwMTUzXDEyXHUwMWY4XDFcdTAyMjhcNzFcdTAxZjgiKwotICAgICJcMVx1MDIxNFwxXHUwMWI3XDFcdTAxZjhcMTRcdTAxZmJcMVx1MDIyOVw2N1x1MDFmYlwxXHUwMjE1XDFcdTAxYmQiKwotICAgICJcMVx1MDFmYlwxNFx1MDE1ZlwxXHUwMTYwXDIzXHUwMTVmXDFcdTAyMmFcNDZcdTAxNWZcMTJcdTAxNjNcMVx1MDE2NCIrCi0gICAgIlwyNVx1MDE2M1wxXHUwMjJiXDQ2XHUwMTYzXDEyXHUwMjAyXDFcdTAyMmNcNzFcdTAyMDJcMVx1MDIxOFwxXHUwMWQxIisKLSAgICAiXDFcdTAyMDJcMTRcdTAyMDVcMVx1MDIyZFw2N1x1MDIwNVwxXHUwMjE5XDFcdTAxZDdcMVx1MDIwNVw0MVwwIisKLSAgICAiXDFcdTAyMmVcNTNcMFw0XDExMlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMCIrCi0gICAgIlwxM1wxMTJcMVwwXDdcMTEyXDFcdTAyMmZcM1wxMTJcMVwwXDRcMTEyXDFcMCIrCi0gICAgIlwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFwxMVwxNjZcMVx1MDIzMFwxXDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcNlwxNjZcMVx1MDIzMVw0XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw0M1wwIisKLSAgICAiXDFcdTAyMzJcMTFcMFwxXHUwMjMyXDcyXDBcMVx1MDIzM1wxNFwwXDFcdTAyMzNcNzFcMCIrCi0gICAgIlwxXHUwMjM0XDE0XDBcMVx1MDIzNFwzMFwwXDJcMjMxXDFcMFwzNlwyMzFcMVx1MDIzNSIrCi0gICAgIlw0NVwyMzFcMlwyNDBcMVwwXDM2XDI0MFwxXHUwMjM2XDQ1XDI0MFwxNFx1MDE0ZlwxXHUwMTUwIisKLSAgICAiXDI0XHUwMTRmXDFcdTAyMzdcNDVcdTAxNGZcMTJcdTAxNTNcMVx1MDE1NFwyNlx1MDE1M1wxXHUwMjM4XDQ1XHUwMTUzIisKLSAgICAiXDE0XHUwMTVmXDFcdTAxNjBcMjRcdTAxNWZcMVx1MDIzOVw0NVx1MDE1ZlwxMlx1MDE2M1wxXHUwMTY0XDI2XHUwMTYzIisKLSAgICAiXDFcdTAyM2FcNDVcdTAxNjNcNDBcMFwxXHUwMjNiXDU0XDBcNFwxMTJcNlwwXDFcMTEyIisKLSAgICAiXDZcMFw1XDExMlwxXHUwMjNjXDFcMFwxM1wxMTJcMVwwXDEzXDExMlwxXDAiKwotICAgICJcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDIzZCIrCi0gICAgIlw2XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDVcMTY2XDFcdTAyM2UiKwotICAgICJcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcMlwyMzFcMVwwXDM1XDIzMVwxXHUwMjNmXDQ2XDIzMVwyXDI0MFwxXDAiKwotICAgICJcMzVcMjQwXDFcdTAyNDBcNDZcMjQwXDE0XHUwMTRmXDFcdTAxNTBcMjNcdTAxNGZcMVx1MDI0MVw0Nlx1MDE0ZiIrCi0gICAgIlwxMlx1MDE1M1wxXHUwMTU0XDI1XHUwMTUzXDFcdTAyNDJcNDZcdTAxNTNcMTRcdTAxNWZcMVx1MDE2MFwyM1x1MDE1ZiIrCi0gICAgIlwxXHUwMjQzXDQ2XHUwMTVmXDEyXHUwMTYzXDFcdTAxNjRcMjVcdTAxNjNcMVx1MDI0NFw0Nlx1MDE2M1wzNVwwIisKLSAgICAiXDFcdTAyNDVcNTdcMFw0XDExMlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMCIrCi0gICAgIlw1XDExMlwxXHUwMjQ2XDVcMTEyXDFcMFwxM1wxMTJcMVwwXDRcMTEyXDFcMCIrCi0gICAgIlwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDFcMTY2XDFcdTAyNDdcN1wxNjZcMlwwXDFcMTY2XDJcMjMxXDFcMFwzMlwyMzEiKwotICAgICJcMVx1MDI0OFw1MVwyMzFcMlwyNDBcMVwwXDMyXDI0MFwxXHUwMjQ5XDUxXDI0MFwxNFx1MDE0ZiIrCi0gICAgIlwxXHUwMTUwXDIwXHUwMTRmXDFcdTAyNGFcNTFcdTAxNGZcMTJcdTAxNTNcMVx1MDE1NFwyMlx1MDE1M1wxXHUwMjRiIisKLSAgICAiXDUxXHUwMTUzXDE0XHUwMTVmXDFcdTAxNjBcMjBcdTAxNWZcMVx1MDI0Y1w1MVx1MDE1ZlwxMlx1MDE2M1wxXHUwMTY0IisKLSAgICAiXDIyXHUwMTYzXDFcdTAyNGRcNTFcdTAxNjNcNlwwXDRcMTEyXDZcMFwxXDExMlw2XDAiKwotICAgICJcNlwxMTJcMVwwXDdcMTEyXDFcdTAyNGVcM1wxMTJcMVwwXDEzXDExMlwxXDAiKwotICAgICJcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI0ZiIrCi0gICAgIlw2XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwIisKLSAgICAiXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwXDEzXDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXHUwMjUwXDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxMFwxNjZcMVx1MDI1MSIrCi0gICAgIlwyXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDAiKwotICAgICJcNVwxMTJcMVx1MDI1Mlw1XDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMlwxXDAiKwotICAgICJcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcNFwxNjZcMVx1MDI1M1w2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxMTJcNlwwIisKLSAgICAiXDFcMTEyXDZcMFw2XDExMlwxXDBcNVwxMTJcMVx1MDI1NFw1XDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcNVwxNjZcMVx1MDI1NSIrCi0gICAgIlw1XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw0XDExMlwxXHUwMjU2XDZcMTEyXDFcMFw0XDExMlwxXDAiKwotICAgICJcMTFcMTEyXDJcMFwxXDExMlw2XHUwMjU3XDRcdTAyNThcNlx1MDI1N1wxXHUwMjU4XDVcdTAyNTciKwotICAgICJcMVwwXDZcdTAyNThcMVx1MDI1N1wxM1x1MDI1OFwxXHUwMjU3XDEzXHUwMjU4XDFcdTAyNTdcNFx1MDI1OCIrCi0gICAgIlwxXHUwMjU3XDExXHUwMjU4XDJcdTAyNTdcMVx1MDI1OFw0MlwwXDFcdTAyNTlcM1wwXDFcdTAyNWEiKwotICAgICJcN1wwXDFcdTAyNWJcMVx1MDI1Y1wyMVwwXDFcdTAyNWRcMTNcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFw0XDE2NlwxXHUwMjVlXDNcMTY2XDFcdTAyNWYiKwotICAgICJcMlwxNjZcMVwwXDRcMTY2XDFcdTAyNjBcMVx1MDI2MVw1XDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDZcMTY2XDFcdTAyNjJcMlwxNjZcMlwwXDFcMTY2XDU3XDBcMVx1MDI2MyIrCi0gICAgIlw3N1wwXDFcdTAyNjRcMTE1XDBcMVx1MDI2NVwxMDVcMFwxXHUwMjY2XDEwN1wwXDFcdTAyNjciKwotICAgICJcMzVcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDVcMTY2XDFcdTAyNjhcNVwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjYiKwotICAgICJcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVx1MDI2OVwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcMTNcMTY2XDFcMFw1XDE2NlwxXHUwMjZhXDVcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjZiIisKLSAgICAiXDZcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw1XDE2NlwxXHUwMjZjXDVcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw0NFwwXDFcdTAyNmRcMTM2XDBcMVx1MDI2ZVwxMDdcMFwxXHUwMjZmXDY3XDAiKwotICAgICJcMVx1MDI3MFwxMjVcMFwxXHUwMjcxXDE3XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcNlwxNjZcMVx1MDI3Mlw0XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxXDE2NlwxXHUwMjczXDdcMTY2XDJcMFwxXDE2Nlw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDRcMTY2XDFcMFwyXDE2NlwxXHUwMjc0XDZcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjc1XDZcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwyXDE2NlwxXHUwMjc2XDZcMTY2XDJcMFwxXDE2Nlw0NlwwXDFcdTAyNzdcNzRcMCIrCi0gICAgIlwxXHUwMjc4XDEwNlwwXDFcdTAyNzlcMTE2XDBcMVx1MDI3YVwxMDVcMFwxXHUwMjdiXDUxXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTBcMTY2XDFcdTAyN2MiKwotICAgICJcMlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVx1MDI3ZCIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjYiKwotICAgICJcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcdTAyN2VcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcNlwxNjZcMVx1MDI3Zlw0XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcNVwxNjZcMVx1MDI4MFw1XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw1N1wwIisKLSAgICAiXDFcdTAyODFcMTMxXDBcMVx1MDI4Mlw1MlwwXDFcdTAyODNcMTA2XDBcMVx1MDI4NFw0NlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNVwxNjZcMVx1MDI4NVw1XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcN1wxNjZcMVx1MDI4NiIrCi0gICAgIlwxXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDEwXDE2NlwxXHUwMjg3XDJcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFwxMFwxNjZcMVx1MDI4OFwyXDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2NlwxMDNcMCIrCi0gICAgIlwxXHUwMjg5XDYzXDBcMVx1MDI3MVwxMzFcMFwxXHUwMjdiXDEwNlwwXDFcdTAyOGFcMTFcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDEwXDE2NlwxXHUwMjhiXDJcMFwxXDE2NiIrCi0gICAgIlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFw2XDE2NlwxXHUwMjc2XDRcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2IisKLSAgICAiXDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMFwxNjYiKwotICAgICJcMVx1MDI4MFwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMTBcMTY2XDFcdTAyOGNcMlwwXDFcMTY2XDM0XDBcMVx1MDI3MVwxNTRcMFwxXHUwMjhkIisKLSAgICAiXDEyXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXHUwMjc2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcN1wxNjZcMVx1MDI4ZSIrCi0gICAgIlwxXDE2NlwyXDBcMVwxNjZcNTZcMFwxXHUwMjcxXDM2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjc2IisKLSAgICAiXDZcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2NiI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjayh5eV9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICAvLyBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAkJLy8kTk9OLU5MUy0xJAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIJLy8kTk9OLU5MUy0xJAotICB9OwotCi0gIC8qKgotICAgKiBZWV9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFlZX0FUVFJJQlVURVtdID0gewotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgOSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICA5LCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDksICA5LCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICA5LCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgOSwgIDksIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICA5LCAgMywgIDMsICAzLCAKLSAgICAgMywgIDMsICAzLCAgOSwgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMCwgIDksICAxLCAgMiwgIDEsICAyLCAgMSwgIDAsICAwLCAgMCwgIDksICAxLCAgMSwgIDEsIAotICAgICA5LCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAKLSAgICAgMCwgIDEsICA5LCAgMCwgIDksICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMSwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgCi0gICAgIDEsICAxLCAgMCwgIDAsICA5LCAgOSwgIDksICAwLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMiwgMTMsIAotICAgICAzLCAgMiwgIDIsIDEzLCAgMywgIDIsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDIsIDEzLCAKLSAgICAgMywgIDIsICAyLCAxMywgIDMsICAyLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDksICA5LCAgOSwgCi0gICAgIDAsICAwLCAgMSwgIDEsICAxLCAgOSwgIDAsICAwLCAxMywgIDksIDEzLCAgOSwgIDksICAxLCAgMSwgIDEsIAotICAgICAwLCAgMCwgIDEsICAzLCAgMiwgIDIsICAzLCAgMiwgIDIsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMiwgIDMsICAzLCAgMywgIDIsICAyLCAgMywgIDMsIAotICAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAyLCAgMywgIDMsICAzLCAgMiwgIDIsICAzLCAgMywgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgOSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgIDEsIAotICAgICAxLCAgNSwgMTMsIDEzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAKLSAgICAgOSwgIDEsICAzLCAgMiwgIDMsICAyLCAgMSwgIDAsICA5LCAgMSwgIDAsICAxLCAgMywgIDIsICAzLCAgMiwgCi0gICAgIDEsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsIAotICAgICAxLCAgMiwgIDIsICAwLCAgMCwgIDIsICAyLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAKLSAgICAgMCwgIDksICA5LCAgMSwgIDEsICAyLCAgMiwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDAsICAxLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDksICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAyLCAgMiwgIDIsICAyLCAgOSwgIDEsICAxLCAgMSwgIDEsICAzLCAgMywgIDMsICAzLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsIAotICAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvLyBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIC8vIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsKLSAKLQkvLyByZXF1aXJlZCBob2xkZXJzIGZvciB3aGl0ZS1zcGFjZSBjb21wYWN0aW5nCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlwcml2YXRlIENvbnRleHRSZWdpb25Db250YWluZXIgZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZfY29udGV4dCA9IG51bGw7Ci0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IGFuIGVtYmVkZGVkIHJlZ2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkCi0JcHJpdmF0ZSBTdHJpbmcgZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IHN0YXRlIHRvIGVudGVyIG9uY2UgYW4gZW1iZWRkZWQgcmVnaW9uIGhhcwotCS8vICAgYmVlbiBjb21wbGV0ZWQKLQlwcml2YXRlIGludCBmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JLy8gdGhlIGNvbnRhaW5lciB1c2VkIHRvIGNyZWF0ZSBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NPTlRFWFQgPSAiUFJPWFlfQ09OVEVYVCI7Ci0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBzdGFydCA9IDA7Ci0JcHJpdmF0ZSBpbnQgdGV4dExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCS8vIG9mZnNldCBmb3IgdHJhY2tpbmcgcG9zaXRpb24gc3BlY2lmaWMgYmxvY2sgdGFncwotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOwotCQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBiZWluZyBvcGVuZWQKLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGluc2lkZSBvZiBhbiBlbWJlZGRlZCByZWdpb24KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGludGVybmFsQ29udGV4dCA9IG51bGw7Ci0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMKLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JcHJpdmF0ZSBMaXN0IGZOZXN0YWJsZVByZWZpeGVzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkKLQkvLyB3aGVyZSB0aGUgbGFzdCBpbnRlcm5hbCBjb250YWluZXIgYmxvY2sgd2FzIGZvdW5kCi0JcHJpdmF0ZSBpbnQgZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSAtMTsKLQotCS8vIHJlcXVpcmVkIHRvIG5vdCBzZWVrIHRleHQgYmxvY2tzIG9uIGFuIGVuZCB0YWcKLQlwcml2YXRlIGJvb2xlYW4gZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGZGb3JiaWRKU1AgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGludCBmRUxsZXZlbCA9IDA7Ci0KLQlwcml2YXRlIEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSgpOwotCi0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkKLQkJCXJldHVybjsKLQkJZkJsb2NrTWFya2Vycy5hZGQobWFya2VyKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKSB7Ci0JCWZOZXN0YWJsZVByZWZpeGVzLmFkZChtYXJrZXIpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldE5lc3RhYmxlUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBmTmVzdGFibGVQcmVmaXhlczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0YWJsZShTdHJpbmcgdGFnTmFtZSkgewotCQkvL0l0ZXJhdG9yIGJsb2NrcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCS8vd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQkvLwlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcilibG9ja3MubmV4dCgpOwotCQkvLwlTdHJpbmcgbWFya2VyTmFtZSA9IG1hcmtlci5nZXRUYWdOYW1lKCk7Ci0JCS8vCWlmKHRhZ05hbWUubGVuZ3RoKCkgPiBtYXJrZXJOYW1lLmxlbmd0aCgpICsgMSAmJiB0YWdOYW1lLnN0YXJ0c1dpdGgobWFya2VyTmFtZSkgJiYgdGFnTmFtZS5jaGFyQXQobWFya2VyTmFtZS5sZW5ndGgoKSkgPT0gJzonKSB7Ci0JCS8vCQlyZXR1cm4gbWFya2VyLmlzR2xvYmFsKCkgfHwgZ2V0T2Zmc2V0KCkgPj0gbWFya2VyLmdldE1hcmtlcigpLmdldFN0YXJ0KCk7Ci0JCS8vCX0KLQkJLy99Ci0JCS8vcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlTmVzdGFibGVQcmVmaXgoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGZOZXN0YWJsZVByZWZpeGVzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIG5lc3RhYmxlcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobmVzdGFibGVzLmhhc05leHQoKSkgewotCQkJCWlmICgoKFRhZ01hcmtlcikgbmVzdGFibGVzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJCW5lc3RhYmxlcy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQkJaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQkJYmxvY2tzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbnVsbCwgZW5kVGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIGVuZFR5cGVzLCBudWxsKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVHlwZSkgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbmV3IFN0cmluZ1tde2VuZFR5cGV9LCBudWxsKTsKLQl9Ci0JLyoqCi0JICogIHVzZXIgbWV0aG9kIAotCSAqIAotCSAqIEFzc2VtYmxlcyBhbiBlbWJlZGRlZCBjb250YWluZXIgYmVnaW5uaW5nIHdpdGggdGhlIGdpdmVuIHN0YXJ0VHlwZSBhcwotCSAqIHRoZSBmaXJzdCBDb250ZXh0UmVnaW9uIHdpdGhpbiBpdCBhbmQgb2YgdGhlIHR5cGUgZkVtYmVkZGVkSGludC4gIFRoZQotCSAqIGVuZFR5cGVzW10gYXJyYXkgY29udGFpbnMgdGhlIGNvbnRleHQgdHlwZXMgdGhhdCB3aWxsIGNhdXNlIGEgc3VjY2Vzc2Z1bAotCSAqIGV4aXQuICBVc2Ugb2YgdGhlIGVuZFRhZ05hbWUgcGFyYW1ldGVyIGFsdGVycyB0aGlzIGJlaGF2aW9yIHRvIGZvcmNlIGFuCi0JICogZXhpdCBvbiBhbiBYTUxfVEFHX0NMT1NFIGFmdGVyIHNlZWluZyBhbiBYTUxfVEFHX05BTUUgd2hvc2Ugc2lnbmlmaWNhbnQKLQkgKiB0ZXh0IG1hdGNoZXMgdGhlIGVuZFRhZ05hbWUgU3RyaW5nLiAgQWxsIGNvbnRlbnRzIGluIGJldHdlZW4gYXJlCi0JICogaW5zaWduaWZpY2FudCwgYW5kIHllcywgdGhpcyBtZWFucyBjb21tZW50cyBhcmUgYWxsb3dlZCBpbnNpZGUuCi0JICoqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzLCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQkvLyB0aGUgY29udGV4dCBvZiB0aGUgcmVnaW9uIGJlaW5nIGFkZGVkIHRvIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJaW50ZXJuYWxDb250ZXh0ID0gc3RhcnRUeXBlOwotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHRoaXMgY29udGFpbmVyIGJlZ2FuOyB0byBwcm92aWRlIHJlbGF0aXZlIGluZGVjZXMgZm9yIHRoZSByZWdpb25zCi0JCWludCBjb250YWluZXJTdGFydCA9IHl5Y2hhcjsKLQkJYm9vbGVhbiBub3RGaW5pc2hlZCA9IHRydWU7Ci0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgd2Ugc2VlbSB0byBiZSBzbyB0aGF0IHRoZSBlbmRUYWdOYW1lIGNhbiBiZSBjaGVja2VkCi0JCWJvb2xlYW4gaXNJbkVuZFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGlzSW5GaXJzdFRhZyA9IHRydWU7Ci0JCS8vIGNyZWF0ZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyIGFuZCBzZXR1cCBpdHMgInR5cGUiCi0JCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKGZFbWJlZGRlZEhpbnQpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KGNvbnRhaW5lclN0YXJ0KTsKLQkJCS8vIFRPRE86IHBhcmVudCByZWdpb24gbmVlZHMgdG8gYmUgc2V0IC4uLi4gYnV0IG5vdCBzdXJlIHdoZXJlIHRvIGdldCBpdCBmcm9tIAotCQkJLy8JCWZFbWJlZGRlZENvbnRhaW5lci5zZXRQYXJlbnQocGFyZW50UmVnaW9uKTsKLQkJfQotCQljb250YWluZXJTdGFydCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpOwotCQl3aGlsZSAobm90RmluaXNoZWQpIHsKLQkJCS8vIGFkZCB0aGUgcmVnaW9uIHRvIHRoZSBjb250YWluZXIKLQkJCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgewotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJLy8gbG9uZ3NjYW4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGF0dGVtcHQgYSBibG9ja1RhZ1NjYW4gd2l0aGluIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJCQlib29sZWFuIGxvbmdzY2FuID0gZmFsc2U7Ci0JCQkJLy8gc2F2ZSB0aGUgdG9rZW5pemVyIHN0YXRlIGluIGNhc2Ugb2YgYSBibG9jayB0YWcgc2NhbgotCQkJCWludCBwcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOwotCQkJCVN0cmluZyBwcmV2aW91c0N1cnJlbnRUYWdOYW1lID0gZkN1cnJlbnRUYWdOYW1lOwotCQkJCWludCBwcmV2aW91c1Bvc3RTdGF0ZSA9IGZFbWJlZGRlZFBvc3RTdGF0ZTsKLQkJCQlTdHJpbmcgcHJldmlvdXNFbWJlZGRlZEhpbnQgPSBmRW1iZWRkZWRIaW50OwotCQkJCS8vIGRldGVybWluZSBpZiBhIGJsb2NrIHRhZyBzY2FuIGlzIG5lY2Vzc2FyeQotCQkJCWlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCQkJCWludGVybmFsVGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJCQlpZighaXNOZXN0YWJsZShpbnRlcm5hbFRhZ05hbWUpKSB7Ci0JCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCQkJCQkJLy8gc25hZ2dlZCBhIHRhZyBuYW1lIHdlIHNob3VsZG4ndCBoYXZlCi0JCQkJCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9BQk9SVF9FTUJFRERFRDsKLQkJCQkJCW5vdEZpbmlzaGVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfT1BFTiB8fCBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCQkJCX0KLQkJCQkvLyBkbyB1cGtlZXAgZm9yIGVuZFRhZ05hbWUgdXNhZ2U7IG11c3QgYmUgaGVyZSBzaW5jZSB0aGUgbmV4dCB0b2tlbiBjb3VsZCBiZSB0aGUgY2xvc2UKLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaXNJbkVuZFRhZyA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgewotCQkJCQlpc0luRmlyc3RUYWcgPSBpc0luRW5kVGFnID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkgCUlUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZFJlZ2lvbnMgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQkJCQlpZiAoZW1iZWRkZWRSZWdpb25zLnNpemUoKSA+IDIgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfQ0xPU0UgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKSAtIDMpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19PUEVOICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY29udGFpbnNUYWdOYW1lKGludGVybmFsVGFnTmFtZSkpIHsKLQkJCQkJCQlsb25nc2NhbiA9IHRydWU7Ci0JCQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxvbmdzY2FuKQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBpbnRlcm5hbFRhZ05hbWU7Ci0JCQkJLy8gcmVhZCB0aGUgbmV4dCByZWdpb24gYW5kIGNvbnRleHQKLQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJaWYgKGxvbmdzY2FuKSB7Ci0JCQkJCS8vIFJldHVybmluZyBmcm9tIGEgYmxvY2sgdGFnIHNjYW4gcmVxdWlyZXMgcmVzdG9yaW5nIHNvbWUgc3RhdGUgdmFyaWFibGVzCi0JCQkJCS8vIGFzIHdlbGwgYXMgaGFuZGxpbmcgdGhlIGJsb2NrIHJlZ2lvbiBhbmQgc2V0dGluZyB1cCBmb3Igbm9ybWFsIHNjYW5uaW5nCi0JCQkJCS8vIGluc2lkZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyBuZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCQkJbG9uZ3NjYW4gPSBmYWxzZTsKLQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gcHJldmlvdXNQb3N0U3RhdGU7Ci0JCQkJCWZFbWJlZGRlZEhpbnQgPSBwcmV2aW91c0VtYmVkZGVkSGludDsKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gcHJldmlvdXNDdXJyZW50VGFnTmFtZTsKLQkJCQkJeXliZWdpbihwcmV2aW91c1N0YXRlKTsKLQkJCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwcmltR2V0TmV4dFRva2VuKCkgY2FsbHMgbWF5IHRocm93IGFuIElPRXhjZXB0aW9uCi0JCQkJLy8gY2F0Y2ggYW5kIGRvIG5vdGhpbmcgc2luY2UgdGhlIGlzRU9GIGNoZWNrIGJlbG93Ci0JCQkJLy8gd2lsbCBwcm9wZXJseSBleGl0IGlmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZikgewotCQkJCS8vIHNvbWUgb3RoZXIgZXhjZXB0aW9uIGhhcHBlbmVkOyBuZXZlciBzaG91bGQKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGYpOwotCQkJfQotCQkJYm9vbGVhbiBpc0VuZGluZ1R5cGUgPSB5eXN0YXRlKCkgPT0gU1RfQUJPUlRfRU1CRURERUQ7Ci0JCQlpZighaXNFbmRpbmdUeXBlKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGVuZGluZyBjb250ZXh0Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpc0VuZGluZ1R5cGUgPSBpc0VuZGluZ1R5cGUgfHwgKGludGVybmFsQ29udGV4dCA9PSBlbmRUeXBlc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlzRW5kaW5nVHlwZSA9ICgoaXNJbkVuZFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgfHwgKGlzSW5GaXJzdFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VNUFRZX1RBR19DTE9TRSkpICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsICYmIGludGVybmFsVGFnTmFtZS5lcXVhbHMoZW5kVGFnTmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkTGlzdCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCQlub3RGaW5pc2hlZCA9IG5vdEZpbmlzaGVkICYmICgoIWlzRW5kaW5nVHlwZSkgJiYgIWlzRU9GKCkgJiYgKGVuZFRhZ05hbWUgIT0gbnVsbCB8fCBpbnRlcm5hbENvbnRleHQgIT0gVU5ERUZJTkVEKSAmJiAhKGludGVybmFsQ29udGV4dCA9PSBQUk9YWV9DT05URVhUICYmIChlbWJlZGRlZExpc3QuZ2V0KGVtYmVkZGVkTGlzdC5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBVTkRFRklORUQpKTsKLQkJfQotCQkvLyBmaW5pc2ggYWRkaW5nIHRoZSBsYXN0IGNvbnRleHQKLQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCS8vbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOwotCQl9Ci0JCXl5YmVnaW4oZkVtYmVkZGVkUG9zdFN0YXRlKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsKLQkJcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuYWxsb3dzSlNQKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuZ2V0Q29udGV4dCgpOwotCQl9Ci0JCXJldHVybiBCTE9DS19URVhUOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOwotCX0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcigpIHsKLQkJcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjb250YWluc1RhZ05hbWUodGFnTmFtZSk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJYmVnaW5CbG9ja01hcmtlclNjYW4obmV3VGFnTmFtZSwgQkxPQ0tfVEVYVCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotCSAqIHN0YXJ0IG9mIGEgdGV4dCBibG9jayB3aXRoaW4gYSAibmV3VGFnTmFtZSIgdGFnLgotCSAqCi0JICogRXhhbXBsZTogCi0JICoJVG9rZW5pemVyIHRva2VyID0gbmV3IFRva2VuaXplcigpOwotCSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7Ci0JICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotCSAqCXRva2VyLmJlZ2luQmxvY2tNYXJrZXJTY2FuKCJzY3JpcHQiLCBCTE9DS19URVhUKTsKLQkgKgl0b2tlci5nZXRSZWdpb25zKCk7IAotCSAqCi0JICogUmV0dXJuczoKLQkgKglCTE9DS19URVhUOiAwLTQwCi0JICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLQkgKglYTUxfVEFHX05BTUU6IDQzLTQ4Ci0JICoJWE1MX1RBR19DTE9TRTogNDktNDkKLQkgKglYTUxfQ09OVEVOVDogNTAtNTcKLQkgKgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOwotCX0KLQotLyoqCi0gKiBNZXRob2QgZG9TY2FuLgotICogCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcgotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcKLSAqIAotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIgotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicKLSAqIEBwYXJhbSBhbGxvd0pTUCAtIGNoZWNrIGZvciBhbmQgYWxsb3cgZm9yIEpTUCBtYXJrdXAgPCUlPgotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkKLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MKLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCS8vIENoZWNrIGZvciBKU1Agc3RhcnRzICgiPCUiKSBpZiB0aGUgdGFnIGlzIGdsb2JhbCBsaWtlIFNDUklQVCBvciBTVFlMRQotCWJvb2xlYW4gY2hlY2tKU1BzID0gYWxsb3dKU1AgJiYgIWZGb3JiaWRKU1A7Ci0JYm9vbGVhbiBjaGVja2VkRm9ySlNQc09uY2UgPSAhY2hlY2tKU1BzOwotCWJvb2xlYW4gY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IGZhbHNlOwotCQotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLS8vCQljID0gKGNoYXIpIG47Ci0JCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuCi0JCWlmIChuID09IFlZRU9GICYmIGNoZWNrZWRGb3JKU1BzT25jZSkgewotCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCS8qKgotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgSlNQcyAiPCUiCi0JCQkgKi8KLQkJCWNoZWNrZWRGb3JKU1BzT25jZSA9IHRydWU7Ci0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoIDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgSlNQcwotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLgotCQkJaWYoY2hlY2tKU1BzICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiAKLQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICsgMV0gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGpzcHN0YXJ0ZXIubGVuZ3RoIDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgSlNQIDIgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0Ci0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4KLQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9jdXJyZW50UG9zID4gMCAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYKLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAzKSB5eV9jdXJyZW50UG9zLi4oeXlfY3VycmVudFBvcytqc3BTdGFydGxlbmd0aC0xKSA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiAhY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJgotCQkJCQl5eV9zdGFydFJlYWQgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCArIDFdID09ICclJykgewotCQkJCWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSB0cnVlOwotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCi0KLQkJCS8qKgotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgQ0RBVEEgIjwhW0NEQVRBWyIKLQkJCSAqLwotCQkJLy8gMSkgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgQ0RBVEEKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBDREFUQSBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPFshQ0RBVEFbXV0+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0vKgkJCWlmKGNoZWNrQ0RBVEEgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zICsgc2VhcmNoU3RyaW5nTGVuZ3RoIDwgeXlfYnVmZmVyLmxlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIAotCQkJCWNoYXJzTWF0Y2goY2RhdGFTdGFydGVyLCB5eV9idWZmZXIsIDAsIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGgpKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQkvLyBnbyB0byBhIHN0YXRlIHdoZXJlIENEQVRBIGNhbiBiZSBmb3VuZAotCQkJCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShzZWFyY2hDb250ZXh0KTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KHl5Y2hhcik7Ci0JCQkJfQotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oc2VhcmNoQ29udGV4dCwgeXljaGFyLCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCVN0cmluZyBjb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCWlmKGNvbnRleHQuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOKSkgewotCQkJCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOLCBYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfQ0xPU0UpOwotCQkJCX0KLQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLSovLyoKLQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBjZGF0YVN0YXJ0ZXIubGVuZ3RoOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBDREFUQSByaWdodCBoZXJlIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndAotCQkJLy8gc3BpbGwgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2hpbGUgY2hlY2tpbmcuCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJgotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLgotCQkJZWxzZSBpZihjaGVja0NEQVRBICYmICFjaGVja2VkRm9yQ0RBVEFPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7Ci0JCQkJY2hlY2tlZEZvckNEQVRBT25jZSA9IHRydWU7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0qLwotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXIKLQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcwotCQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2FtZSA9IHRydWU7Ci0JCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3NlcwotCQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsKLQkJCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdwotCQkJCWVsc2UgewotCQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNhbWUgJiYgcmVxdWlyZVRhaWxTZXBhcmF0b3IgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gKLQkJCQkvLyAiPC9zY3JpcHRTIgotCQkJCWxhc3RDaGVja0NoYXIgPSB5eV9idWZmZXJbeXlfY3VycmVudFBvc107Ci0JCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICIKLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQotCQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSAhc2FtZSB8fCAoeXlfY3VycmVudFBvcyA8IHl5X3N0YXJ0UmVhZCArIHNlYXJjaFN0cmluZ0xlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgewotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0Ci0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7Ci0JCXl5X2N1cnJlbnRQb3MrKzsKLQl9Ci0JeXliZWdpbihleGl0U3RhdGUpOwotCS8vIElmIHRoZSBlbmRpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpCi0JCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUKLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCk7Ci0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOwotfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkKLQkgKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotCSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4KLQkgKgotCSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLQkgKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLgotCSAqCi0JICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLQkgKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJLy8gbG9hZCB0aGUgc3RhcnRpbmcgbm9uLXdoaXRlc3BhY2UgdG9rZW4gKGFzc3VtZSB0aGF0IGl0IGlzIHNvKQotCQlpZiAoZlNob3VsZExvYWRCdWZmZXJlZCkgewotCQkJaWYgKGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBjb250YWluZXIgPSBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lcjsKLQkJCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQl9Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCWlmIChjb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsKLQkJCQlyZXR1cm4gZkVtYmVkZGVkQ29udGFpbmVyOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX1JPT1RfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJCWVsc2UKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJCX0KLQkJCXN0YXJ0ID0geXljaGFyOwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQlpZiAoeXlfYXRFT0YpIHsKLQkJCQlmVG9rZW5Db3VudCsrOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuCi0JCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJaWYgKGZfY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7Ci0JCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IGZFbWJlZGRlZENvbnRhaW5lcjsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQllbHNlCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlmQnVmZmVyZWRDb250ZXh0ID0gZl9jb250ZXh0OwotCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7Ci0JCWlmIChmQnVmZmVyZWRDb250ZXh0ID09IFdISVRFX1NQQUNFKSB7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCQlsZW5ndGggKz0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQl9Ci0JCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJCS8vIEVPRgotCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZlRva2VuQ291bnQrKzsKLQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIEpTUFRva2VuaXplcigpewotCQlzdXBlcigpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCQl0aGlzKG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgewotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXksIGludCBuZXdPZmZzZXQpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCAwKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgbmV3T2Zmc2V0KTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbikgewotCQlyZXNldChpbiwgMCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kICoKLQkgKgotCSAqIFJlc2V0IGludGVybmFsIGNvdW50ZXJzIGFuZCB2YXJzIHRvICJuZXdseSBjcmVhdGVkIiB2YWx1ZXMsIGluIHRoZSBob3BlcwotCSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBjb250YWlucyBjb2RlIGJsb2NrcyB0aGF0IHdlcmUgZXNzZW50aWFsbHkgZHVwbGljYXRlZCBmcm9tIHRoZQotCSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLQkgKiBhZGRlZC4gIFRob3NlIGNvZGUgYmxvY2tzIHdlcmUgdW5kZXIgdGhlIGFib3ZlIGNvcHlyaWdodC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzZXR0aW5nIHRva2VuaXplciIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlmT2Zmc2V0ID0gbmV3T2Zmc2V0OwotCQotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXl5X3JlYWRlciA9IGluOwotCQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXl5X3N0YXRlID0gMDsKLQkKLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCQotCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQkKLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJeXlfbWFya2VkUG9zID0gMDsKLQkKLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCQotCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfY3VycmVudFBvcyA9IDA7Ci0JCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9zdGFydFJlYWQgPSAwOwotCQotCQkvKiogCi0JCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkgKiBmcm9tIGlucHV0IAotCQkgKi8KLQkJeXlfZW5kUmVhZCA9IDA7Ci0JCi0JCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWxpbmUgPSAwOwotCQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXljaGFyID0gMDsKLQkKLQkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCQl5eV9hdEVPRiA9IGZhbHNlOwotCQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQkKLQkKLQkJLyogdXNlciB2YXJzOiAqLwotCQlmVG9rZW5Db3VudCA9IDA7Ci0JIAotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQlmQnVmZmVyZWRTdGFydCA9IDE7Ci0JCWZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JCi0JCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7Ci0JCi0JCWNvbnRleHQgPSBudWxsOwotCQlzdGFydCA9IDA7Ci0JCXRleHRMZW5ndGggPSAwOwotCQlsZW5ndGggPSAwOwotCQotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkKLQkJZkVMbGV2ZWwgPSAwOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICovCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgewotCQlKU1BUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgSlNQVG9rZW5pemVyKCk7Ci0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOwotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCX0KLQkJZm9yKGludCBpID0gMDsgaSA8IGZOZXN0YWJsZVByZWZpeGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcikgZk5lc3RhYmxlUHJlZml4ZXMuZ2V0KGkpOwotCQkJaWYobWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkTmVzdGFibGVQcmVmaXgobWFya2VyKTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhblhNTENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfWE1MX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkJLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhbkpTUENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU2NhbiBmb3IgJy0tJT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCQkvLyAgIEpTUF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX0pTUF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCQlyZXR1cm4gZG9TY2FuKCItLSU+IiwgZmFsc2UsIGZhbHNlLCB0cnVlLCBKU1BfQ09NTUVOVF9URVhULCBTVF9KU1BfQ09NTUVOVF9FTkQsIFNUX0pTUF9DT01NRU5UX0VORCk7Ci0JfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB5eV91bnBhY2soU3RyaW5nIHBhY2tlZCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbMzE1OTVdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDgyMDYpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzc2KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcgotICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKGNoYXJbXSBtYXJrZXJUYWdOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgdGFnbmFtZUxlbmd0aCkgewotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWZCbG9ja01hcmtlcnMuZ2V0KGopOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5sZW5ndGgoKSA9PSB0YWduYW1lTGVuZ3RoKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0YWduYW1lTGVuZ3RoICYmIG1hdGNoZXNTb0ZhcjsgaSsrKSB7Ci0JCQkJCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXNTb0ZhcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICoKLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0Ci0JICogTm90ZTogZm9yIHZlcmlmaWNhdGlvbiB1c2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgewotCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJd2hpbGUocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdG9rZW5zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogaW5wdXQgY291bGQgbm90IGJlIHRva2VuaXplZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldE9mZnNldCgpLCBlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU2luY2UgdGhpcyBpcyBjb252ZW5pZW5jZSBtZXRob2QgYW5kIE5PVCB0aGUgcmVjb21tZW5kZWQgCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbm90IGhhbmRsZWQgcmV0cmlldmluZyByZWdpb25zOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wKFN0cmluZyBzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHMgKyAiICgiICsgeXljaGFyICsgIi0iICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkoeXlsZW5ndGgoKSArIHl5Y2hhcikgKyAiKTpcJyIgKy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHl5X2F0RU9GOwotCX0KLS8qIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkICovCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoU3RyaW5nIG1hcmtlclRhZ05hbWUpIHsKLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAvLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYgotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0gICAgeXlfcHVzaGJhY2tQb3MgPSAtMTsKLSAgICBib29sZWFuIHl5X3dhc19wdXNoYmFjazsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIGJvb2xlYW4geXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgZm9yICh5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zIDwgeXlfbWFya2VkUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfY3VycmVudFBvcysrKSB7Ci0gICAgICAgIHN3aXRjaCAoeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdKSB7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB5eV9jb3VudGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgIGlmICh5eV9jb3VudGVkKQotICAgICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfY291bnRlZCkgewotICAgICAgICBpZiAoIHl5X2FkdmFuY2UoKSA9PSAnXG4nICkgeXlsaW5lLS07Ci0gICAgICAgIGlmICggIXl5X2F0RU9GICkgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0gICAgICB5eV93YXNfcHVzaGJhY2sgPSBmYWxzZTsKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAyKSA+IDAgKQotICAgICAgICAgICAgeXlfcHVzaGJhY2tQb3MgPSB5eV9jdXJyZW50UG9zOwotCi0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X3dhc19wdXNoYmFjayA9ICh5eV9hdHRyaWJ1dGVzICYgNCkgPiAwOwotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV93YXNfcHVzaGJhY2spCi0gICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zOwotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDYyMjogCi0gICAgICAgIGNhc2UgNjI3OiAKLSAgICAgICAgY2FzZSA2MzQ6IAotICAgICAgICBjYXNlIDYzOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgianNwIGRpcmVjdGl2ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBKU1BfRElSRUNUSVZFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTk3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYU0wgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NTY6IGJyZWFrOwotICAgICAgICBjYXNlIDU4MDogCi0gICAgICAgIGNhc2UgNTgzOiAKLSAgICAgICAgY2FzZSA1ODQ6IAotICAgICAgICBjYXNlIDU4NTogCi0gICAgICAgIGNhc2UgNTg2OiAKLSAgICAgICAgY2FzZSA1ODc6IAotICAgICAgICBjYXNlIDU4ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JeXliZWdpbihTVF9DREFUQV9URVhUKTsKLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47Ci0gfQotICAgICAgICBjYXNlIDY1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTcyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJqc3A6cm9vdCB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBKU1BfUk9PVF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjU4OiBicmVhazsKLSAgICAgICAgY2FzZSA1NjM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2NTk6IGJyZWFrOwotICAgICAgICBjYXNlIDU2MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDY2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTYxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjYxOiBicmVhazsKLSAgICAgICAgY2FzZSA1NDY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQzsKLSB9Ci0gICAgICAgIGNhc2UgNjYyOiBicmVhazsKLSAgICAgICAgY2FzZSA1NDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTTsKLSB9Ci0gICAgICAgIGNhc2UgNjYzOiBicmVhazsKLSAgICAgICAgY2FzZSA1Mzk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDUxNDogCi0gICAgICAgIGNhc2UgNTU1OiAKLSAgICAgICAgY2FzZSA1NTY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA0OiAKLSAgICAgICAgY2FzZSA1NTE6IAotICAgICAgICBjYXNlIDU1MjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NjY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5KU1AgY29tbWVudCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIEpTUF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2Njc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ4MzogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJWQkwgaW4gYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCWZFTGxldmVsKys7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDgyOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkVMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCWZFTGxldmVsKys7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2Njk6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDY3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT01NRU5UX1RFWFQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0NPTU1FTlQ7Ci0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47Ci0gfQotICAgICAgICBjYXNlIDY3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDcyOiAKLSAgICAgICAgY2FzZSA0OTE6IAotICAgICAgICBjYXNlIDQ5NDogCi0gICAgICAgIGNhc2UgNDk3OiAKLSAgICAgICAgY2FzZSA0OTg6IAotICAgICAgICBjYXNlIDUwMDogCi0gICAgICAgIGNhc2UgNTAyOiAKLSAgICAgICAgY2FzZSA1MDU6IAotICAgICAgICBjYXNlIDUwNzogCi0gICAgICAgIGNhc2UgNTA4OiAKLSAgICAgICAgY2FzZSA1MTA6IAotICAgICAgICBjYXNlIDUxMjogCi0gICAgICAgIGNhc2UgNTE1OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBjb21tZW50IGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soNCk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soNCk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pICB7Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLQkvLyBmaW5pc2hlZCBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQkJcmV0dXJuIEpTUF9DT01NRU5UX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQkJLy8gdGhlIGNvbW1lbnQgY29udGFpbmVyIGl0c2VsZiB3aWxsIGFjdCBhcyBjb21tZW50IHRleHQKLQkJZkVtYmVkZGVkSGludCA9IEpTUF9DT01NRU5UX1RFWFQ7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0NPTU1FTlRfT1BFTiwgSlNQX0NPTU1FTlRfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLyoKLQkJICogcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zOyBtYXJrIHRoaXMgb25lIGFzIGEKLQkJICogY29tbWVudCBzbyBpdCB3aWxsIGJlIG90aGVyd2lzZSBpZ25vcmVkIGJ1dCBwcmVzZXJ2ZWQgKHdoaWNoIGlzIHdoeQotCQkgKiB3ZSBjYW4ndCB1c2Ugd2hpdGUtc3BhY2UpCi0JCSAqLwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjcyOiBicmVhazsKLSAgICAgICAgY2FzZSAzODE6IAotICAgICAgICBjYXNlIDM4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjczOiBicmVhazsKLSAgICAgICAgY2FzZSAzODA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjc0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NzU6IGJyZWFrOwotICAgICAgICBjYXNlIDM3ODogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAyKTsKLQlmRUxsZXZlbCsrOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIEpTUF9WQkxfQ0xPU0UpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2Nzc6IGJyZWFrOwotICAgICAgICBjYXNlIDM3NjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOwotCWZFTGxldmVsKys7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBKU1BfRUxfQ0xPU0UpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDY3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY3OiAKLSAgICAgICAgY2FzZSA0MDc6IAotICAgICAgICBjYXNlIDQxNTogCi0gICAgICAgIGNhc2UgNDIyOiAKLSAgICAgICAgY2FzZSA0Mjc6IAotICAgICAgICBjYXNlIDQzMjogCi0gICAgICAgIGNhc2UgNDM3OiAKLSAgICAgICAgY2FzZSA0NDM6IAotICAgICAgICBjYXNlIDQ0OTogCi0gICAgICAgIGNhc2UgNDUzOiAKLSAgICAgICAgY2FzZSA0NTg6IAotICAgICAgICBjYXNlIDQ2MzogCi0gICAgICAgIGNhc2UgNDY5OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBleHByZXNzaW9uIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGFuIGV4cHJlc3Npb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9FWFBSRVNTSU9OX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRVhQUkVTU0lPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2ODA6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NjogCi0gICAgICAgIGNhc2UgNDA2OiAKLSAgICAgICAgY2FzZSA0MTQ6IAotICAgICAgICBjYXNlIDQyMTogCi0gICAgICAgIGNhc2UgNDI2OiAKLSAgICAgICAgY2FzZSA0MzE6IAotICAgICAgICBjYXNlIDQzNjogCi0gICAgICAgIGNhc2UgNDQyOiAKLSAgICAgICAgY2FzZSA0NDg6IAotICAgICAgICBjYXNlIDQ1MjogCi0gICAgICAgIGNhc2UgNDU3OiAKLSAgICAgICAgY2FzZSA0NjI6IAotICAgICAgICBjYXNlIDQ2ODogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZGVjbGFyYXRpb24gYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSBkZWNsYXJhdGlvbiBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9ERUNMQVJBVElPTl9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ERUNMQVJBVElPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2ODE6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NTogCi0gICAgICAgIGNhc2UgNDA1OiAKLSAgICAgICAgY2FzZSA0MTM6IAotICAgICAgICBjYXNlIDQyMDogCi0gICAgICAgIGNhc2UgNDI1OiAKLSAgICAgICAgY2FzZSA0MzA6IAotICAgICAgICBjYXNlIDQzNTogCi0gICAgICAgIGNhc2UgNDQxOiAKLSAgICAgICAgY2FzZSA0NDc6IAotICAgICAgICBjYXNlIDQ1MTogCi0gICAgICAgIGNhc2UgNDU2OiAKLSAgICAgICAgY2FzZSA0NjE6IAotICAgICAgICBjYXNlIDQ2NzogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZGlyZWN0aXZlIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJcmV0dXJuIEpTUF9ESVJFQ1RJVkVfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RJUkVDVElWRV9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0RJUkVDVElWRV9DTE9TRSwgSlNQX0NMT1NFfSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY4MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU1OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY4MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzUxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQ5OiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsKys7Ci0JaWYoZkVMbGV2ZWwgPT0gMSkgewotCQlyZXR1cm4gSlNQX1ZCTF9PUEVOOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjg1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzk6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFU19FTkQpOwotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY4NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM1OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODc6IGJyZWFrOwotICAgICAgICBjYXNlIDMzMzogCi0gICAgICAgICAgeyAKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihKU1BfRUxfQ09OVEVOVCsgIjpbIiArIHl5dGV4dCgpICsgIl0iKTsKLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY4ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzMyOiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsKys7Ci0JaWYoZkVMbGV2ZWwgPT0gMSkgewotCQlyZXR1cm4gSlNQX0VMX09QRU47Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2ODk6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOTogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9EUVVPVEVEX1ZCTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjkwOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjg6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBFTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjkxOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjY6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9WQkwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI1OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfRUwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI0OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGVuZCB0YWciKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX0VORF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkKLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk0OiBicmVhazsKLSAgICAgICAgY2FzZSAyODM6IAotICAgICAgICBjYXNlIDI5NTogCi0gICAgICAgIGNhc2UgMzAxOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ7Ci0gfQotICAgICAgICBjYXNlIDY5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcxOiAKLSAgICAgICAgICB7IAotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOwotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldAotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOwotCS8qCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSkpIHsKLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCQlyZXR1cm4gWE1MX1RBR19PUEVOOwotCX0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFhNTF9UQUdfT1BFTiwgdGFnTmFtZSk7IC8vID8KLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY5OiAKLSAgICAgICAgICB7IAotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOwotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldAotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOwotCS8qCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSkpIHsKLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCQlyZXR1cm4gWE1MX1RBR19PUEVOOwotCX0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0Ci0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk3OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjc6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2OTg6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggZG91YmxlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIHRhZyBlbWJlZGRlZCBuYW1lIHN0YXJ0IC0gc3RhcnQgdGFnIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzAwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICBjYXNlIDEyNzogCi0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgY2FzZSAyNzM6IAotICAgICAgICBjYXNlIDI3NzogCi0gICAgICAgIGNhc2UgMjc4OiAKLSAgICAgICAgY2FzZSAzODc6IAotICAgICAgICBjYXNlIDM5MDogCi0gICAgICAgIGNhc2UgNDgxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3MDE6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDcwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzAzOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICBjYXNlIDM4NjogCi0gICAgICAgIGNhc2UgNDgwOiAKLSAgICAgICAgY2FzZSA1MjA6IAotICAgICAgICBjYXNlIDUyMTogCi0gICAgICAgIGNhc2UgNTQwOiAKLSAgICAgICAgY2FzZSA1NDE6IAotICAgICAgICBjYXNlIDU1OTogCi0gICAgICAgIGNhc2UgNTYwOiAKLSAgICAgICAgY2FzZSA1NzM6IAotICAgICAgICBjYXNlIDU4MjogCi0gICAgICAgIGNhc2UgNTkwOiAKLSAgICAgICAgY2FzZSA1OTI6IAotICAgICAgICBjYXNlIDU5NDogCi0gICAgICAgIGNhc2UgNTk2OiAKLSAgICAgICAgY2FzZSA1OTk6IAotICAgICAgICBjYXNlIDYwNTogCi0gICAgICAgIGNhc2UgNjA2OiAKLSAgICAgICAgY2FzZSA2MDc6IAotICAgICAgICBjYXNlIDYwODogCi0gICAgICAgIGNhc2UgNjA5OiAKLSAgICAgICAgY2FzZSA2MTU6IAotICAgICAgICBjYXNlIDYxNjogCi0gICAgICAgIGNhc2UgNjE3OiAKLSAgICAgICAgY2FzZSA2MTg6IAotICAgICAgICBjYXNlIDYxOTogCi0gICAgICAgIGNhc2UgNjI1OiAKLSAgICAgICAgY2FzZSA2MjY6IAotICAgICAgICBjYXNlIDYyODogCi0gICAgICAgIGNhc2UgNjI5OiAKLSAgICAgICAgY2FzZSA2MzU6IAotICAgICAgICBjYXNlIDYzNjogCi0gICAgICAgIGNhc2UgNjM3OiAKLSAgICAgICAgY2FzZSA2Mzg6IAotICAgICAgICBjYXNlIDY0NDogCi0gICAgICAgIGNhc2UgNjQ1OiAKLSAgICAgICAgY2FzZSA2NDY6IAotICAgICAgICBjYXNlIDY0NzogCi0gICAgICAgIGNhc2UgNjUwOiAKLSAgICAgICAgY2FzZSA2NTE6IAotICAgICAgICBjYXNlIDY1MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0JCWZFbWJlZGRlZEhpbnQgPSBnZXRCbG9ja01hcmtlckNvbnRleHQoKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQkxPQ0tfVEFHX1NDQU47Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzA1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgIGNhc2UgMjYzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA3MDc6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcwODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZGlyZWN0aXZlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSk7Ci0JcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzA5OiBicmVhazsKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgOTk6IAotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGNvZGUgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZG9TY2FuKCIlPiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIEpTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQpOwotIH0KLSAgICAgICAgY2FzZSA3MTA6IGJyZWFrOwotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDI1MzogCi0gICAgICAgIGNhc2UgMjU0OiAKLSAgICAgICAgY2FzZSAyNTc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcxMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNzEyOiBicmVhazsKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzEzOiBicmVhazsKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgMjQ0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcxNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA3MTY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICBjYXNlIDIwMDogCi0gICAgICAgIGNhc2UgMjAzOiAKLSAgICAgICAgY2FzZSAyMTM6IAotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgIGNhc2UgMjE3OiAKLSAgICAgICAgY2FzZSAyMTg6IAotICAgICAgICBjYXNlIDM2MDogCi0gICAgICAgIGNhc2UgMzYzOiAKLSAgICAgICAgY2FzZSA0NDY6IAotICAgICAgICBjYXNlIDQ2MDogCi0gICAgICAgIGNhc2UgNDY2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICBjYXNlIDE3ODogCi0gICAgICAgIGNhc2UgMTc5OiAKLSAgICAgICAgY2FzZSAxODI6IAotICAgICAgICBjYXNlIDE5MjogCi0gICAgICAgIGNhc2UgMTkzOiAKLSAgICAgICAgY2FzZSAxOTY6IAotICAgICAgICBjYXNlIDE5NzogCi0gICAgICAgIGNhc2UgMzMwOiAKLSAgICAgICAgY2FzZSAzNDQ6IAotICAgICAgICBjYXNlIDM0NzogCi0gICAgICAgIGNhc2UgNDE4OiAKLSAgICAgICAgY2FzZSA0MTk6IAotICAgICAgICBjYXNlIDQzNDogCi0gICAgICAgIGNhc2UgNDQwOiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzE4OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDMyMTogCi0gICAgICAgIGNhc2UgNDEyOiAKLSAgICAgICAgY2FzZSA0MTY6IAotICAgICAgICBjYXNlIDQ5NTogCi0gICAgICAgIGNhc2UgNTI4OiAKLSAgICAgICAgY2FzZSA1NDg6IAotICAgICAgICBjYXNlIDU2NTogCi0gICAgICAgIGNhc2UgNTc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDE1MjogCi0gICAgICAgIGNhc2UgMTUzOiAKLSAgICAgICAgY2FzZSAzMTE6IAotICAgICAgICBjYXNlIDQwNDogCi0gICAgICAgIGNhc2UgNDA4OiAKLSAgICAgICAgY2FzZSA0OTI6IAotICAgICAgICBjYXNlIDUyNzogCi0gICAgICAgIGNhc2UgNTQ3OiAKLSAgICAgICAgY2FzZSA1NjQ6IAotICAgICAgICBjYXNlIDU3NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzIwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJpbmFwcHJvcHJpYXRlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWlmKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRHx8ZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCktMSk7Ci0JCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQl9Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDcyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgY2FzZSAxNjk6IAotICAgICAgICBjYXNlIDE3NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNzIzOiBicmVhazsKLSAgICAgICAgY2FzZSAwOiAKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSAyMjU6IAotICAgICAgICBjYXNlIDIyNzogCi0gICAgICAgIGNhc2UgMjI4OiAKLSAgICAgICAgY2FzZSAyMzA6IAotICAgICAgICBjYXNlIDIzMjogCi0gICAgICAgIGNhc2UgMzcwOiAKLSAgICAgICAgY2FzZSAzNzE6IAotICAgICAgICBjYXNlIDM3MjogCi0gICAgICAgIGNhc2UgNDc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzI0OiBicmVhazsKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgMTAxOiAKLSAgICAgICAgY2FzZSAxMTM6IAotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDcyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgY2FzZSA3MDogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDg4OiAKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDEwODogCi0gICAgICAgIGNhc2UgMTA5OiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgIGNhc2UgMTI0OiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDEzMjogCi0gICAgICAgIGNhc2UgMTMzOiAKLSAgICAgICAgY2FzZSAxMzQ6IAotICAgICAgICBjYXNlIDEzNjogCi0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgY2FzZSAxMzk6IAotICAgICAgICBjYXNlIDE0MDogCi0gICAgICAgIGNhc2UgMTQxOiAKLSAgICAgICAgY2FzZSAxNDQ6IAotICAgICAgICBjYXNlIDE0NTogCi0gICAgICAgIGNhc2UgMTQ2OiAKLSAgICAgICAgY2FzZSAxNDk6IAotICAgICAgICBjYXNlIDE1MDogCi0gICAgICAgIGNhc2UgMTUxOiAKLSAgICAgICAgY2FzZSAxNTY6IAotICAgICAgICBjYXNlIDE1NzogCi0gICAgICAgIGNhc2UgMTU4OiAKLSAgICAgICAgY2FzZSAxNjY6IAotICAgICAgICBjYXNlIDE3MTogCi0gICAgICAgIGNhc2UgMTcyOiAKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICBjYXNlIDE3NzogCi0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgY2FzZSAxODU6IAotICAgICAgICBjYXNlIDE4NzogCi0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgY2FzZSAxOTQ6IAotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgIGNhc2UgMjA1OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICBjYXNlIDIwODogCi0gICAgICAgIGNhc2UgMjA5OiAKLSAgICAgICAgY2FzZSAyMTU6IAotICAgICAgICBjYXNlIDIxOTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiISEhdW5leHBlY3RlZCEhITogXCIiICsgeXl0ZXh0KCkgKyAiXCI6IiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl5eWNoYXIgKyAiLSIgKyAoeXljaGFyICsgeXlsZW5ndGgoKSkpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gVU5ERUZJTkVEOwotIH0KLSAgICAgICAgY2FzZSA3MjY6IGJyZWFrOwotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgdGV4dCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQlTdHJpbmcgcmV0dXJuZWRDb250ZXh0ID0gZG9TY2FuKCJdXT4iLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgWE1MX0NEQVRBX1RFWFQsIFNUX0NEQVRBX0VORCwgIFNUX0NEQVRBX0VORCk7Ly8kTk9OLU5MUy0xJAotCWlmKHJldHVybmVkQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkKLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOwotCXJldHVybiByZXR1cm5lZENvbnRleHQ7Ci0gfQotICAgICAgICBjYXNlIDcyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICBjYXNlIDE4NjogCi0gICAgICAgIGNhc2UgMTg5OiAKLSAgICAgICAgY2FzZSAyMDc6IAotICAgICAgICBjYXNlIDIxMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNzI4OiBicmVhazsKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0gfQotICAgICAgICBjYXNlIDcyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICBjYXNlIDIzNzogCi0gICAgICAgIGNhc2UgMjM4OiAKLSAgICAgICAgY2FzZSAyMzk6IAotICAgICAgICBjYXNlIDM4MzogCi0gICAgICAgIGNhc2UgNDc4OiAKLSAgICAgICAgY2FzZSA0Nzk6IAotICAgICAgICBjYXNlIDUxODogCi0gICAgICAgIGNhc2UgNTE5OiAKLSAgICAgICAgY2FzZSA1Mzg6IAotICAgICAgICBjYXNlIDU1ODogCi0gICAgICAgIGNhc2UgNTcxOiAKLSAgICAgICAgY2FzZSA1ODE6IAotICAgICAgICBjYXNlIDU4OTogCi0gICAgICAgIGNhc2UgNTkxOiAKLSAgICAgICAgY2FzZSA1OTM6IAotICAgICAgICBjYXNlIDU5NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzMwOiBicmVhazsKLSAgICAgICAgY2FzZSA3NzogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA3MzE6IGJyZWFrOwotICAgICAgICBjYXNlIDc4OiAKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICAgIHsgCi0JCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQKLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsKLSB9Ci0gICAgICAgIGNhc2UgNzMyOiBicmVhazsKLSAgICAgICAgY2FzZSA4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MzM6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNjogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggc2luZ2xlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDczNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MzU6IGJyZWFrOwotICAgICAgICBjYXNlIDEzNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQpOwotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MzY6IGJyZWFrOwotICAgICAgICBjYXNlIDEzODogCi0gICAgICAgIGNhc2UgMTQyOiAKLSAgICAgICAgY2FzZSAyODg6IAotICAgICAgICBjYXNlIDI5MjogCi0gICAgICAgIGNhc2UgMzk5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0gfQotICAgICAgICBjYXNlIDczNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQzOiAKLSAgICAgICAgY2FzZSAxNDc6IAotICAgICAgICBjYXNlIDI5ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotIH0KLSAgICAgICAgY2FzZSA3Mzg6IGJyZWFrOwotICAgICAgICBjYXNlIDE0ODogCi0gICAgICAgIGNhc2UgMzA0OiAKLSAgICAgICAgY2FzZSAzMDg6IAotICAgICAgICBjYXNlIDQwMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDczOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU1OiAKLSAgICAgICAgY2FzZSAzMTQ6IAotICAgICAgICBjYXNlIDMxODogCi0gICAgICAgIGNhc2UgNDEwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3NDE6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY0OiAKLSAgICAgICAgY2FzZSAxNjU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgdGV4dCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0gfQotICAgICAgICBjYXNlIDc0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgY2FzZSAxNzM6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3NDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE2ODogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWludCBpbmNvbWluZ1N0YXRlID0geXlzdGF0ZSgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbnNpZGUgb2YgSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDc0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTcwOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc0NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc1OiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgwOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX0RRVU9URVMpOwotCXJldHVybiBKU1BfRUxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NDg6IGJyZWFrOwotICAgICAgICBjYXNlIDE4MTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTKTsKLQlyZXR1cm4gSlNQX0VMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzQ5OiBicmVhazsKLSAgICAgICAgY2FzZSAxODM6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwtLTsKLQlpZihmRUxsZXZlbCA9PSAwKSB7Ci0JCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJcmV0dXJuIEpTUF9FTF9DTE9TRTsKLQl9Ci0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3NTA6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JcmV0dXJuIEpTUF9FTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlyZXR1cm4gSlNQX0VMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzUyOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTU6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzUzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVMpOwotCXJldHVybiBKU1BfVkJMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzU0OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVMpOwotCXJldHVybiBKU1BfVkJMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzU1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDQ6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwtLTsKLQlpZihmRUxsZXZlbCA9PSAwKSB7Ci0JCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJcmV0dXJuIEpTUF9WQkxfQ0xPU0U7Ci0JfQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDc1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCXJldHVybiBKU1BfVkJMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzU4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzYwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1BJKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3NjE6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMjogCi0gICAgICAgIGNhc2UgMzEwOiAKLSAgICAgICAgY2FzZSAzMjA6IAotICAgICAgICBjYXNlIDMzMTogCi0gICAgICAgIGNhc2UgMzM2OiAKLSAgICAgICAgY2FzZSAzNDA6IAotICAgICAgICBjYXNlIDM0MzogCi0gICAgICAgIGNhc2UgMzQ2OiAKLSAgICAgICAgY2FzZSAzNDg6IAotICAgICAgICBjYXNlIDM1MjogCi0gICAgICAgIGNhc2UgMzU2OiAKLSAgICAgICAgY2FzZSAzNTk6IAotICAgICAgICBjYXNlIDM2MjogCi0gICAgICAgICAgeyAKLQkvKiBKU1Agc2NyaXB0bGV0IGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDEpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSByZWd1bGFyIHNjcmlwdGxldCBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiBKU1BfU0NSSVBUTEVUX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9TQ1JJUFRMRVRfT1BFTiwgSlNQX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNzYyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjM6IAotICAgICAgICAgIHsgCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3NjM6IGJyZWFrOwotICAgICAgICBjYXNlIDIzNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgICAgeyAKLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQotCQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NjY6IGJyZWFrOwotICAgICAgICBjYXNlIDI1ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBKU1BfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjYwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIEpTUF9ESVJFQ1RJVkVfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYyOiAKLSAgICAgICAgY2FzZSAxNjM6IAotICAgICAgICAgIHsgCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCSB9Ci0gICAgICAgIGNhc2UgNzY5OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVkZDQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgSlNQIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIEpTUENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gY29tcGlsZXIvdmFsaWRhdGlvbiBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFURV9GUkFHTUVOVFMsIHRydWUpOwotCi0JCS8vIGNvZGUgZ2VuZXJhdGlvbiBwcmVmZXJlbmNlcwotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VULCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlZmF1bHRFbmMgPSAiSVNPLTg4NTktMSI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3lzdGVtRW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN5c3RlbUVuYyAhPSBudWxsKSB7Ci0JCQlkZWZhdWx0RW5jID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldFByZWZlcnJlZERlZmF1bHRJYW5hTmFtZShzeXN0ZW1FbmMsICJJU08tODg1OS0xIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCBkZWZhdWx0RW5jKTsKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdGhpcyBjb3VsZCBiZSBtYWRlIHNtYXJ0ZXIgYnkgYWN0dWFsbHkgbG9va2luZyB1cCB0aGUgY29udGVudAotCQkvLyB0eXBlJ3MgdmFsaWQgZXh0ZW5zaW9ucwotCQlub2RlLnB1dChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAianNwIik7IC8vJE5PTi1OTFMtMSQKLQotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfRElGRkVSRU5UX1VSSVMsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX1NBTUVfVVJJUywgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19QUkVGSVgsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19VUklfT1JfVEFHRElSLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfUEFHRV9TVVBFUkNMQVNTX05PVF9GT1VORCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfTk9fRklMRV9TUEVDSUZJRUQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX0ZJTEVfTk9UX0ZPVU5ELCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0KLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRSwgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfVU5VU0VEX0lNUE9SVCwgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRUxfU1lOVEFYLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9FTF9MRVhFUiwgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKTsKLQotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9NSVNTSU5HX1JFUVVJUkVEX0FUVFJJQlVURSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9VTktOT1dOX0FUVFJJQlVURSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX05PTl9FTVBUWV9JTkxJTkVfVEFHLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX1ZBTElEQVRJT05fTUVTU0FHRSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9GT1VORCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0lOU1RBTlRJQVRFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfUlVOVElNRV9FWENFUFRJT04sIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEFHX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5ELCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fSU5WQUxJRF9JRCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNCRUFOX01JU1NJTkdfVFlQRV9JTkZPLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0FNQklHVU9VU19UWVBFX0lORk8sIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MWRiZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSBKU1AgY29yZQotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IEpTUCBGaWxlCi0JICogV2l6YXJkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiZGVmYXVsdEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBKU1AgZnJhZ21lbnRzIHNob3VsZCBiZSBjb21waWxlZC92YWxpZGF0ZWQuIEpTUCBmcmFnbWVudHMKLQkgKiB3aWxsIGJlIHZhbGlkYXRlZCB3aGVuIHRydWUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfRlJBR01FTlRTID0gInZhbGlkYXRlRnJhZ21lbnRzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCBKU1AgdmFsaWRhdGlvbiB3aWxsIHVzZSBwZXItcHJvamVjdCBwcmVmZXJlbmNlcwotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fVVNFX1BST0pFQ1RfU0VUVElOR1MgPSAidmFsaWRhdGlvbi51c2UtcHJvamVjdC1zZXR0aW5ncyI7Ci0KLQkvKioKLQkgKiBWYWxpZGF0aW9uIHByZWZlcmVuY2Uga2V5cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfRElGRkVSRU5UX1VSSVM9InZhbGlkYXRpb24uZGlyZWN0aXZlLXRhZ2xpYi1kdXBsaWNhdGUtcHJlZml4ZXMtZGlmZmVyZW50LXVyaXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX1NBTUVfVVJJUz0idmFsaWRhdGlvbi5kaXJlY3RpdmUtdGFnbGliLWR1cGxpY2F0ZS1wcmVmaXhlcy1zYW1lLXVyaXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19QUkVGSVg9InZhbGlkYXRpb24uZGlyZWN0aXZlLXRhZ2xpYi1taXNzaW5nLXByZWZpeCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1VSSV9PUl9UQUdESVI9InZhbGlkYXRpb24uZGlyZWN0aXZlLXRhZ2xpYi1taXNzaW5nLXVyaS1vci10YWdkaXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfVU5SRVNPTFZBQkxFX1VSSV9PUl9UQUdESVI9InZhbGlkYXRpb24uZGlyZWN0aXZlLXRhZ2xpYi11bnJlc29sdmFibGUtdXJpLW9yLXRhZ2RpciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1BBR0VfU1VQRVJDTEFTU19OT1RfRk9VTkQ9InZhbGlkYXRpb24uZGlyZWN0aXZlLXBhZ2Utc3VwZXJjbGFzcy1ub3QtZm91bmQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX05PX0ZJTEVfU1BFQ0lGSUVEPSJ2YWxpZGF0aW9uLmRpcmVjdGl2ZS1pbmNsdWRlLWZyYWdtZW50LWZpbGUtbm90LXNwZWNpZmllZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfRklMRV9OT1RfRk9VTkQ9InZhbGlkYXRpb24uZGlyZWN0aXZlLWluY2x1ZGUtZnJhZ21lbnQtZmlsZS1ub3QtZm91bmQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRCA9InZhbGlkYXRpb24uamF2YS1sb2NhbC12YXJpYWJsZS1pcy1uZXZlci11c2VkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRCAgPSJ2YWxpZGF0aW9uLmphdmEtIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UgID0idmFsaWRhdGlvbi5qYXZhLW51bGwtbG9jYWwtdmFyaWFibGUtcmVmZXJlbmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfUE9URU5USUFMX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFICA9InZhbGlkYXRpb24uamF2YS1wb3RlbnRpYWwtbnVsbC1sb2NhbC12YXJpYWJsZS1yZWZlcmVuY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fSkFWQV9VTlVTRURfSU1QT1JUICA9InZhbGlkYXRpb24uamF2YS11bnVzZWQtaW1wb3J0IjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0VMX1NZTlRBWCAgPSJ2YWxpZGF0aW9uLmVsLWdlbmVyYWwtc3ludGF4IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0VMX0xFWEVSICA9InZhbGlkYXRpb24uZWwtbGV4aWNhbC1mYWlsdXJlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9NSVNTSU5HX1JFUVVJUkVEX0FUVFJJQlVURSA9ICJ2YWxpZGF0aW9uLmFjdGlvbnMtbWlzc2luZy1yZXF1aXJlZC1hdHRyaWJ1dGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9VTktOT1dOX0FUVFJJQlVURSA9ICJ2YWxpZGF0aW9uLmFjdGlvbnMtdW5rbm93bi1hdHRyaWJ1dGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9OT05fRU1QVFlfSU5MSU5FX1RBRyA9ICJ2YWxpZGF0aW9uLmFjdGlvbnMtbm9uLWVtcHR5LWlubGluZS10YWciOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX1ZBTElEQVRJT05fTUVTU0FHRSA9ICJ2YWxpZGF0aW9uLnRyYW5zbGF0aW9uLXRlaS1tZXNzYWdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfRk9VTkQgPSAidmFsaWRhdGlvbi50cmFuc2xhdGlvbi10ZWktY2xhc3Mtbm90LWZvdW5kIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfSU5TVEFOVElBVEVEID0gInZhbGlkYXRpb24udHJhbnNsYXRpb24tdGVpLWNsYXNzLW5vdC1pbnN0YW50aWF0ZWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX1JVTlRJTUVfRVhDRVBUSU9OID0gInZhbGlkYXRpb24udHJhbnNsYXRpb24tdGVpLWNsYXNzLXJ1bnRpbWUtZXhjZXB0aW9uIjsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9UQUdfSEFORExFUl9DTEFTU19OT1RfRk9VTkQgPSAidmFsaWRhdGlvbi50cmFuc2xhdGlvbi10YWctY2xhc3Mtbm90LWZvdW5kIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fSU5WQUxJRF9JRD0gInZhbGlkYXRpb24udHJhbnNsYXRpb24tdXNlYmVhbi1pbnZhbGlkLWlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTQkVBTl9NSVNTSU5HX1RZUEVfSU5GTz0gInZhbGlkYXRpb24udHJhbnNsYXRpb24tdXNlYmVhbi1taXNzaW5nLXR5cGUtaW5mbyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0FNQklHVU9VU19UWVBFX0lORk8gPSAidmFsaWRhdGlvbi50cmFuc2xhdGlvbi11c2ViZWFuLWFtYmlndW91cy10eXBlLWluZm8iOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AxMU5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AxMU5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2QwZjc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMTFOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogSlNQIDEuMSBOYW1lc3BhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBKU1AxMU5hbWVzcGFjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbGVtZW50TmFtZSB7Ci0JCS8vIEVsZW1lbnQgbmFtZXMKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUTEVUID0gImpzcDpzY3JpcHRsZXQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT04gPSAianNwOmV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xBUkFUSU9OID0gImpzcDpkZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1BBR0UgPSAianNwOmRpcmVjdGl2ZS5wYWdlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfSU5DTFVERSA9ICJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9UQUdMSUIgPSAianNwOmRpcmVjdGl2ZS50YWdsaWIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRUJFQU4gPSAianNwOnVzZUJlYW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFBST1BFUlRZID0gImpzcDpzZXRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUUFJPUEVSVFkgPSAianNwOmdldFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFID0gImpzcDppbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEID0gImpzcDpmb3J3YXJkIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU4gPSAianNwOnBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1TID0gImpzcDpwYXJhbXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTExCQUNLID0gImpzcDpmYWxsYmFjayI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU0gPSAianNwOnBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gImpzcDpyb290IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gImpzcDp0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUDExX1VSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1RBR19QUkVGSVggPSAianNwIjsgLy8kTk9OLU5MUy0xJAotCS8vIGF0dHJpYnV0ZSBuYW1lcwotCS8vICAgZGlyZWN0aXZlLnBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VYVEVORFMgPSAiZXh0ZW5kcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRVNTSU9OID0gInNlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JVRkZFUiA9ICJidWZmZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FVVE9GTFVTSCA9ICJhdXRvRmx1c2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lTX1RIUkVBRF9TQUZFID0gImlzVGhyZWFkU2FmZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSU5GTyA9ICJpbmZvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FUlJPUl9QQUdFID0gImVycm9yUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNfRVJST1JfUEFHRSA9ICJpc0Vycm9yUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFHRV9FTkNPRElORyA9ICJwYWdlRW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JLy8gICBkaXJlY3RpdmUuaW5jbHVkZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JLy8gICBkaXJlY3RpdmUudGFnbGliCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JLy8gICB1c2VCZWFuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TQ09QRSA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JFQU5fTkFNRSA9ICJiZWFuTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgc2V0UHJvcGVydHkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBUkFNID0gInBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgaW5jbHVkZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQUdFID0gInBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZMVVNIID0gImZsdXNoIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgcGx1Z2luCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREUgPSAiY29kZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERUJBU0UgPSAiY29kZWJhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gImFsaWduIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BUkNISVZFID0gImFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hTUEFDRSA9ICJoc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0pSRVZFUlNJT04gPSAianJldmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVlNQQUNFID0gInZzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05TUExVR0lOVVJMID0gIm5zcGx1Z2ludXJsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JRVBMVUdJTlVSTCA9ICJpZXBsdWdpbnVybCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHJvb3QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfWE1MTlNfSlNQID0gInhtbG5zOmpzcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCS8vIGF0dHJpYnV0ZSB2YWx1ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSkFWQSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ1RfREVGQVVMVCA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI7Ly9EMTk1MzY2IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JVRlNJWl9ERUZBVUxUID0gIjhrYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NFU1NJT04gPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFUVVFU1QgPSAicmVxdWVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQkVBTiA9ICJiZWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQVBQTEVUID0gImFwcGxldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9NSURETEUgPSAibWlkZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xFRlQgPSAibGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gInJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSlZFUjExID0gIjEuMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1hNTE5TX0pTUCA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AxMk5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AxMk5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWY3NmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMTJOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogTmFtZXMgZm9yIEpTUCAxLjIgc3BlYy4KLSAqIEN1cnJlbnRseSwgaXQgaXMganVzdCB0aGUgc2FtZSBhcyBKU1AxMU5hbWVzcGFjZSBpbiBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMTJOYW1lc3BhY2UgZXh0ZW5kcyBKU1AxMU5hbWVzcGFjZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMjBOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMjBOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxZmRlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDIwTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIE5ldyBuYW1lcyBmb3IgSlNQIDIuMCBzcGVjLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMjBOYW1lc3BhY2UgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1AyME5hbWVzcGFjZSB7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI0NmJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MsIHdpdGggaXRzIG9uZSBmaWVsZCwgaXMgYSBjb252aWVuY2UgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUKLSAqIHNhZmV0eSB3aGVuIHJlZmVyaW5nIHRvIGEgY29udGVudFR5cGUgSUQuIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQKLSAqIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbCBmaWxlLgotICovCi0KLXB1YmxpYyBjbGFzcyBDb250ZW50VHlwZUlkRm9ySlNQIHsKLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgc2V0IHdpdGggZGVmYXVsdAotCSAqIHByb3RlY3RlZCBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0pTUCA9IGdldENvbnN0YW50U3RyaW5nKCk7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQKLQkgKiBwcm90ZWN0ZWQgbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCA9IGdldEZyYWdtZW50Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfSlNQVEFHID0gZ2V0VGFnQ29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUlkRm9ySlNQKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyBnZXRGcmFnbWVudENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BmcmFnbWVudHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyBnZXRUYWdDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0lDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzZGQxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0lDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvZGVkUmVzb3VyY2VQbHVnaW47Ci0KLQotcHVibGljIGludGVyZmFjZSBJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQIHsKLQkvKioKLQkgKiBFeHRyYSBwcm9wZXJ0aWVzIGFzIHBhcnQgb2YgQ29udGVudERlc2NyaXB0aW9uLCBpZiB0aGUgY29udGVudCBpcyBKU1AuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIENPTlRFTlRfVFlQRV9BVFRSSUJVVEUgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgImNvbnRlbnRUeXBlQXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgTEFOR1VBR0VfQVRUUklCVVRFID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJsYW5ndWFnZUF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIENPTlRFTlRfRkFNSUxZX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiY29udGVudEZhbWlseUF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUpTUFBhcnRpdGlvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUpTUFBhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Y2MzMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lKU1BQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBKU1AuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSUpTUFBhcnRpdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJSlNQUGFydGl0aW9uVHlwZXMgewotCi0JU3RyaW5nIEpTUF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEpTUF9TQ1JJUFRfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfREVMSU1JVEVSID0gSlNQX1NDUklQVF9QUkVGSVggKyAiREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09OVEVOVF9KQVZBID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSkFWQSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfSkFWQVNDUklQVCA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpBVkFTQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9ERUZBVUxUX0VMID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSlNQX0VMIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfREVGQVVMVF9FTDIgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKU1BfRUwyIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBKU1BfRElSRUNUSVZFID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01KU1BSZWdpb25Db250ZXh0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9yZWdpb25zL0RPTUpTUFJlZ2lvbkNvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlM2M1ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9yZWdpb25zL0RPTUpTUFJlZ2lvbkNvbnRleHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICoKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIERPTUpTUFJlZ2lvbkNvbnRleHRzIGV4dGVuZHMgRE9NUmVnaW9uQ29udGV4dCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NMT1NFID0gIkpTUF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX09QRU4gPSAiSlNQX0NPTU1FTlRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9URVhUID0gIkpTUF9DT01NRU5UX1RFWFQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJKU1BfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfREVDTEFSQVRJT05fT1BFTiA9ICJKU1BfREVDTEFSQVRJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX0NMT1NFID0gIkpTUF9ESVJFQ1RJVkVfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfT1BFTiA9ICJKU1BfRElSRUNUSVZFX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX0NMT1NFID0gIkpTUF9FTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfQ09OVEVOVCA9ICJKU1BfRUxfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfRFFVT1RFID0gIkpTUF9FTF9EUVVPVEUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfT1BFTiA9ICJKU1BfRUxfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfUVVPVEVEX0NPTlRFTlQgPSAiSlNQX0VMX1FVT1RFRF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FTF9TUVVPVEUgPSAiSlNQX0VMX1NRVU9URSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRVhQUkVTU0lPTl9PUEVOID0gIkpTUF9FWFBSRVNTSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVRfT1BFTiA9ICJKU1BfU0NSSVBUTEVUX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9DTE9TRSA9ICJKU1BfVkJMX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfQ09OVEVOVCA9ICJKU1BfVkJMX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9EUVVPVEUgPSAiSlNQX1ZCTF9EUVVPVEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9PUEVOID0gIkpTUF9WQkxfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkJMX1FVT1RFRF9DT05URU5UID0gIkpTUF9WQkxfUVVPVEVEX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9TUVVPVEUgPSAiSlNQX1ZCTF9TUVVPVEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFID0gIlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSA9ICJYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJDbGFzc0xvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliQ2xhc3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlNjdjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWI7Ci0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQ3VzdG9tIGNsYXNzbG9hZGVyIHdoaWNoIGFsbG93cyB5b3UgdG8gYWRkIHNvdXJjZSBkaXJlY3RvcmllcyAoZm9sZGVycwotICogY29udGFpbmluZyAuY2xhc3MgZmlsZXMpIGFuZCBqYXJzIHRvIHRoZSBjbGFzc3BhdGguCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJDbGFzc0xvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyIHsKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYmNsYXNzbG9hZGVyIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRSA9ICJmaWxlOi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvIjsKLQotCXB1YmxpYyBUYWdsaWJDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRMb2FkZXIpIHsKLQkJc3VwZXIobmV3IFVSTFswXSwgcGFyZW50TG9hZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoU3RyaW5nIGRpclBhdGgpIHsKLQkJYWRkRmlsZShkaXJQYXRoICsgIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoRklMRSArIGZpbGVuYW1lKTsKLQkJCXN1cGVyLmFkZFVSTCh1cmwpOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkZWQ6IFsiICsgdXJsICsgIl0gdG8gY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmaWxlbmFtZSwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRKYXIoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCWFkZEZpbGUoZmlsZW5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhdGgoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChSRVNPVVJDRSArIHJlc291cmNlUGF0aC50b1N0cmluZygpICsgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIuYWRkVVJMKHVybCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRlZDogWyIgKyB1cmwgKyAiXSB0byBjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKHJlc291cmNlUGF0aC50b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIjZmluZENsYXNzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmluZGluZzogWyIgKyBjbGFzc05hbWUgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIHN1cGVyLmZpbmRDbGFzcyhjbGFzc05hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZiMDk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0F0dHJpYnV0ZUluZm87Ci1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0RhdGE7Ci1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnSW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnTGlicmFyeUluZm87Ci1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5WYXJpYWJsZUluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVGFnbGliVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhlbHBzIGZpbmQgVGFnbGliVmFyaWFibGVzIGluIGEgSlNQIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJIZWxwZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90YWdsaWJ2YXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgSVByb2plY3QgZlByb2plY3QgPSBudWxsOwotCXByaXZhdGUgVGFnbGliQ2xhc3NMb2FkZXIgZkxvYWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIFNldCBmUHJvamVjdEVudHJpZXMgPSBudWxsOwotCXByaXZhdGUgTWFwIGZUcmFuc2xhdGlvblByb2JsZW1zID0gbnVsbDsKLQlwcml2YXRlIFNldCBmQ29udGFpbmVyRW50cmllcyA9IG51bGw7Ci0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZkphdmFQcm9qZWN0OwotCi0JcHVibGljIFRhZ2xpYkhlbHBlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXNldFByb2plY3QocHJvamVjdCk7Ci0JCWZQcm9qZWN0RW50cmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZDb250YWluZXJFbnRyaWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YWdUb0FkZAotCSAqICAgICAgICAgICAgaXMgdGhlIG5hbWUgb2YgdGhlIHRhZyB3aG9zZSB2YXJpYWJsZXMgd2Ugd2FudAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jCi0JICogICAgICAgICAgICBpcyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCB3aGVyZSB0aGUgdGFnIGlzIGZvdW5kCi0JICogQHBhcmFtIGN1c3RvbVRhZwotCSAqICAgICAgICAgICAgaXMgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb3BlbmluZyB0YWcgZm9yIHRoZSBjdXN0b20KLQkgKiAgICAgICAgICAgIHRhZwotCSAqLwotCXB1YmxpYyBUYWdsaWJWYXJpYWJsZVtdIGdldFRhZ2xpYlZhcmlhYmxlcyhTdHJpbmcgdGFnVG9BZGQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvYywgSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZykgewotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTW9kZWxRdWVyeSBtcSA9IGdldE1vZGVsUXVlcnkoc3RydWN0dXJlZERvYyk7Ci0JCWlmIChtcSAhPSBudWxsKSB7Ci0JCQlUTERDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHN0cnVjdHVyZWREb2MpOwotCi0JCQkvLyBUYWdsaWJTdXBwb3J0IHN1cHBvcnQgPSAoKFRhZ2xpYk1vZGVsUXVlcnkpCi0JCQkvLyBtcSkuZ2V0VGFnbGliU3VwcG9ydCgpOwotCQkJaWYgKG1nciA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgVGFnbGliVmFyaWFibGVbMF07Ci0KLQkJCUxpc3QgdHJhY2tlcnMgPSBtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKC0xKTsKLQkJCUl0ZXJhdG9yIHRhZ2xpYnMgPSB0cmFja2Vycy5pdGVyYXRvcigpOwotCi0JCQkvLyBUYWdsaWJTdXBwb3J0IHN1cHBvcnQgPSAoKFRhZ2xpYk1vZGVsUXVlcnkpCi0JCQkvLyBtcSkuZ2V0VGFnbGliU3VwcG9ydCgpOwotCQkJLy8gaWYgKHN1cHBvcnQgPT0gbnVsbCkKLQkJCS8vIHJldHVybiBuZXcgVGFnbGliVmFyaWFibGVbMF07Ci0JCQkvLwotCQkJLy8gSXRlcmF0b3IgdGFnbGlicyA9Ci0JCQkvLyBzdXBwb3J0LmdldENNRG9jdW1lbnRzKGN1c3RvbVRhZy5nZXRTdGFydE9mZnNldCgpKS5pdGVyYXRvcigpOwotCQkJQ01Eb2N1bWVudCBkb2MgPSBudWxsOwotCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBudWxsOwotCQkJd2hpbGUgKHRhZ2xpYnMuaGFzTmV4dCgpKSB7Ci0JCQkJZG9jID0gKENNRG9jdW1lbnQpIHRhZ2xpYnMubmV4dCgpOwotCQkJCUNNTm9kZSBub2RlID0gbnVsbDsKLQkJCQlpZiAoKGVsZW1lbnRzID0gZG9jLmdldEVsZW1lbnRzKCkpICE9IG51bGwgJiYgKG5vZGUgPSBlbGVtZW50cy5nZXROYW1lZEl0ZW0odGFnVG9BZGQpKSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikgewotCi0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ01Ob2RlV3JhcHBlcikgewotCQkJCQkJbm9kZSA9ICgoQ01Ob2RlV3JhcHBlcikgbm9kZSkuZ2V0T3JpZ2luTm9kZSgpOwotCQkJCQl9Ci0JCQkJCVRMREVsZW1lbnREZWNsYXJhdGlvbiB0bGRFbGVtZW50RGVjbCA9IChUTERFbGVtZW50RGVjbGFyYXRpb24pIG5vZGU7Ci0KLQkJCQkJLyoKLQkJCQkJICogQWx0aG91Z2ggY2xlYXJseSBub3QgdGhlIHJpZ2h0IHBsYWNlIHRvIGFkZCB2YWxpZGF0aW9uCi0JCQkJCSAqIGRlc2lnbi13aXNlLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgdGhlCi0JCQkJCSAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byB2YWxpZGF0ZSB0aGUgdGFnIGNsYXNzLgotCQkJCQkgKi8KLQkJCQkJdmFsaWRhdGVUYWdDbGFzcyhzdHJ1Y3R1cmVkRG9jLCBjdXN0b21UYWcsIHRsZEVsZW1lbnREZWNsLCBwcm9ibGVtcyk7Ci0KLQkJCQkJLy8gMS4yKyB0YWdsaWIgc3R5bGUKLQkJCQkJYWRkVmFyaWFibGVzKHJlc3VsdHMsIG5vZGUsIGN1c3RvbVRhZyk7Ci0KLQkJCQkJLy8gZm9yIDEuMSBuZWVkIG1vcmUgaW5mbyBmcm9tIHRhZ2xpYiB0cmFja2VyCi0JCQkJCWlmIChkb2MgaW5zdGFuY2VvZiBUYWdsaWJUcmFja2VyKSB7Ci0JCQkJCQlTdHJpbmcgdXJpID0gKChUYWdsaWJUcmFja2VyKSBkb2MpLmdldFVSSSgpOwotCQkJCQkJU3RyaW5nIHByZWZpeCA9ICgoVGFnbGliVHJhY2tlcikgZG9jKS5nZXRQcmVmaXgoKTsKLQkJCQkJCS8vIG9ubHkgZm9yIDEuMSB0YWdsaWJzCi0JCQkJCQlhZGRURUlWYXJpYWJsZXMoc3RydWN0dXJlZERvYywgY3VzdG9tVGFnLCByZXN1bHRzLCB0bGRFbGVtZW50RGVjbCwgcHJlZml4LCB1cmksIHByb2JsZW1zKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlQYXRoIGxvY2F0aW9uID0gVGFnbGliQ29udHJvbGxlci5nZXRMb2NhdGlvbihzdHJ1Y3R1cmVkRG9jKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCWZUcmFuc2xhdGlvblByb2JsZW1zLnB1dChsb2NhdGlvbiwgcHJvYmxlbXMpOwotCQl9Ci0KLQkJcmV0dXJuIChUYWdsaWJWYXJpYWJsZVtdKSByZXN1bHRzLnRvQXJyYXkobmV3IFRhZ2xpYlZhcmlhYmxlW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyAxLjIgc3R5bGUgVGFnbGliVmFyaWFibGVzIHRvIHRoZSByZXN1bHRzIGxpc3QuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdHMKLQkgKiAgICAgICAgICAgIGxpc3Qgd2hlcmUgdGhlIDxjb2RlPlRhZ2xpYlZhcmlhYmxlPC9jb2RlPiBzIGFyZSBhZGRlZAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFZhcmlhYmxlcyhMaXN0IHJlc3VsdHMsIENNTm9kZSBub2RlLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY3VzdG9tVGFnKSB7Ci0KLQkJTGlzdCBsaXN0ID0gKChUTERFbGVtZW50RGVjbGFyYXRpb24pIG5vZGUpLmdldFZhcmlhYmxlcygpOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJVExEVmFyaWFibGUgdmFyID0gKFRMRFZhcmlhYmxlKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXZhci5nZXREZWNsYXJlKCkpCi0JCQkJY29udGludWU7Ci0KLQkJCVN0cmluZyB2YXJOYW1lID0gdmFyLmdldE5hbWVHaXZlbigpOwotCQkJaWYgKHZhck5hbWUgPT0gbnVsbCkgewotCQkJCS8vIDIuMAotCQkJCXZhck5hbWUgPSB2YXIuZ2V0QWxpYXMoKTsKLQkJCX0KLQkJCWlmICh2YXJOYW1lID09IG51bGwpIHsKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSB2YXIuZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKTsKLQkJCQkvKgotCQkJCSAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZG9jdW1lbnQgcmVnaW9uIHRvIGZpbmQgdGhlCi0JCQkJICogY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgbmFtZSwgYW5kIHRoZW4gdXNlIGl0cyB2YWx1ZQotCQkJCSAqLwotCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY3VzdG9tVGFnLmdldFJlZ2lvbnMoKTsKLQkJCQlib29sZWFuIGF0dHJOYW1lRm91bmQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMjsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCQlhdHRyTmFtZUZvdW5kID0gYXR0ck5hbWUuZXF1YWxzKGN1c3RvbVRhZy5nZXRUZXh0KHJlZ2lvbikpOwotCQkJCQl9Ci0JCQkJCWlmIChhdHRyTmFtZUZvdW5kICYmIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCQl2YXJOYW1lID0gU3RyaW5nVXRpbHMuc3RyaXAoY3VzdG9tVGFnLmdldFRleHQocmVnaW9uKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodmFyTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHZhckNsYXNzID0gImphdmEubGFuZy5TdHJpbmciOyAvLyB0aGUgZGVmYXVsdAotCQkJCS8vIGNsYXNzLi4uLy8kTk9OLU5MUy0xJAotCQkJCWlmICh2YXIuZ2V0VmFyaWFibGVDbGFzcygpICE9IG51bGwpIHsKLQkJCQkJdmFyQ2xhc3MgPSB2YXIuZ2V0VmFyaWFibGVDbGFzcygpOwotCQkJCX0KLQkJCQlyZXN1bHRzLmFkZChuZXcgVGFnbGliVmFyaWFibGUodmFyQ2xhc3MsIHZhck5hbWUsIHZhci5nZXRTY29wZSgpLCB2YXIuZ2V0RGVzY3JpcHRpb24oKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyAxLjEgc3R5bGUgVGFnbGliVmFyaWFibGVzIChkZWZpbmVkIGluIGEgVGFnRXh0cmFJbmZvIGNsYXNzKSB0byB0aGUKLQkgKiByZXN1bHRzIGxpc3QuIEFsc28gcmVwb3J0cyBwcm9ibGVtcyB3aXRoIHRoZSB0YWcgYW5kIHRlaSBjbGFzc2VzIGluCi0JICogZlRyYW5zbGF0b3JQcm9ibGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gY3VzdG9tVGFnCi0JICogQHBhcmFtIHJlc3VsdHMKLQkgKiAgICAgICAgICAgIGxpc3Qgd2hlcmUgdGhlIDxjb2RlPlRhZ2xpYlZhcmlhYmxlPC9jb2RlPiBzIGFyZSBhZGRlZAotCSAqIEBwYXJhbSBkZWNsCi0JICogICAgICAgICAgICBUTERFbGVtZW50RGVjbGFyYXRpb24gZm9yIHRoZSBjdXN0b20gdGFnCi0JICogQHBhcmFtIHByZWZpeAotCSAqICAgICAgICAgICAgY3VzdG9tIHRhZyBwcmVmaXgKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBVUkkgd2hlcmUgdGhlIHRsZCBjYW4gYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVEVJVmFyaWFibGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcsIExpc3QgcmVzdWx0cywgVExERWxlbWVudERlY2xhcmF0aW9uIGRlY2wsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIExpc3QgcHJvYmxlbXMpIHsKLQkJU3RyaW5nIHRlaUNsYXNzbmFtZSA9IGRlY2wuZ2V0VGVpY2xhc3MoKTsKLQkJaWYgKHRlaUNsYXNzbmFtZSA9PSBudWxsIHx8IHRlaUNsYXNzbmFtZS5sZW5ndGgoKSA9PSAwIHx8IGZKYXZhUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzbG9hZGVyKCk7Ci0KLQkJQ2xhc3MgdGVpQ2xhc3MgPSBudWxsOwotCQl0cnkgewotCQkJLyoKLQkJCSAqIEpEVCBjb3VsZCB0ZWxsIHVzIGFib3V0IGl0LCBidXQgbG9hZGluZyBhbmQgY2FsbGluZyBpdCB3b3VsZAotCQkJICogc3RpbGwgdGFrZSB0aW1lCi0JCQkgKi8KLQkJCXRlaUNsYXNzID0gQ2xhc3MuZm9yTmFtZSh0ZWlDbGFzc25hbWUsIHRydWUsIGxvYWRlcik7Ci0JCQlpZiAodGVpQ2xhc3MgIT0gbnVsbCkgewotCQkJCU9iamVjdCB0ZWlPYmplY3QgPSB0ZWlDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJCWlmIChUYWdFeHRyYUluZm8uY2xhc3MuaXNJbnN0YW5jZSh0ZWlPYmplY3QpKSB7Ci0JCQkJCVRhZ0V4dHJhSW5mbyB0ZWkgPSAoVGFnRXh0cmFJbmZvKSB0ZWlPYmplY3Q7Ci0JCQkJCUhhc2h0YWJsZSB0YWdEYXRhVGFibGUgPSBleHRyYWN0VGFnRGF0YShjdXN0b21UYWcpOwotCQkJCQlUYWdJbmZvIGluZm8gPSBnZXRUYWdJbmZvKGRlY2wsIHRlaSwgcHJlZml4LCB1cmkpOwotCQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCQl0ZWkuc2V0VGFnSW5mbyhpbmZvKTsKLQotCQkJCQkJLy8gYWRkIHRvIHJlc3VsdHMKLQkJCQkJCVRhZ0RhdGEgdGQgPSBuZXcgVGFnRGF0YSh0YWdEYXRhVGFibGUpOwotCi0JCQkJCQlWYXJpYWJsZUluZm9bXSB2SW5mb3MgPSB0ZWkuZ2V0VmFyaWFibGVJbmZvKHRkKTsKLQkJCQkJCWlmICh2SW5mb3MgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdkluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXJlc3VsdHMuYWRkKG5ldyBUYWdsaWJWYXJpYWJsZSh2SW5mb3NbaV0uZ2V0Q2xhc3NOYW1lKCksIHZJbmZvc1tpXS5nZXRWYXJOYW1lKCksIHZJbmZvc1tpXS5nZXRTY29wZSgpLCBkZWNsLmdldERlc2NyaXB0aW9uKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCVZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMgPSB0ZWkudmFsaWRhdGUodGQpOwotCQkJCQkJaWYgKG1lc3NhZ2VzICE9IG51bGwgJiYgbWVzc2FnZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJT2JqZWN0IGNyZWF0ZWRQcm9ibGVtID0gY3JlYXRlVmFsaWRhdGlvbk1lc3NhZ2VQcm9ibGVtKGRvY3VtZW50LCBjdXN0b21UYWcsIG1lc3NhZ2VzW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCWlmIChjcmVhdGVkUHJvYmxlbSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlwcm9ibGVtcy5hZGQoY3JlYXRlZFByb2JsZW0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlPYmplY3QgY3JlYXRlZFByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKGRvY3VtZW50LCBjdXN0b21UYWcsIElKU1BQcm9ibGVtLlRFSUNsYXNzTWlzYywgSlNQQ29yZU1lc3NhZ2VzLlRhZ2xpYkhlbHBlcl8yLCB0ZWlDbGFzc25hbWUsIHRydWUpOwotCQkJCQlpZiAoY3JlYXRlZFByb2JsZW0gIT0gbnVsbCkgewotCQkJCQkJcHJvYmxlbXMuYWRkKGNyZWF0ZWRQcm9ibGVtKTsKLQkJCQkJfQotCQkJCQkvLyB0aGlzIGlzIDNyZCBwYXJ0eSBjb2RlLCBuZWVkIHRvIGNhdGNoIGFsbCBleGNlcHRpb25zCi0JCQkJCWlmIChERUJVRykgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgdGVpQ2xhc3NuYW1lICsgIiBpcyBub3QgYSBzdWJjbGFzcyBvZiBUYXhFeHRyYUluZm8iKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlPYmplY3QgY3JlYXRlZFByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKGRvY3VtZW50LCBjdXN0b21UYWcsIElKU1BQcm9ibGVtLlRFSUNsYXNzTm90Rm91bmQsIEpTUENvcmVNZXNzYWdlcy5UYWdsaWJIZWxwZXJfMCwgdGVpQ2xhc3NuYW1lLCB0cnVlKTsKLQkJCWlmIChjcmVhdGVkUHJvYmxlbSAhPSBudWxsKSB7Ci0JCQkJcHJvYmxlbXMuYWRkKGNyZWF0ZWRQcm9ibGVtKTsKLQkJCX0KLQkJCS8vIFRFSSBjbGFzcyB3YXNuJ3Qgb24gYnVpbGQgcGF0aAotCQkJaWYgKERFQlVHKQotCQkJCWxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQl9Ci0JCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCU9iamVjdCBjcmVhdGVkUHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oZG9jdW1lbnQsIGN1c3RvbVRhZywgSUpTUFByb2JsZW0uVEVJQ2xhc3NOb3RJbnN0YW50aWF0ZWQsIEpTUENvcmVNZXNzYWdlcy5UYWdsaWJIZWxwZXJfMSwgdGVpQ2xhc3NuYW1lLCB0cnVlKTsKLQkJCWlmIChjcmVhdGVkUHJvYmxlbSAhPSBudWxsKSB7Ci0JCQkJcHJvYmxlbXMuYWRkKGNyZWF0ZWRQcm9ibGVtKTsKLQkJCX0KLQkJCS8vIFRFSSBjbGFzcyBjb3VsZG4ndCBiZSBpbnN0YW50aWF0ZWQKLQkJCWlmIChERUJVRykKLQkJCQlsb2dFeGNlcHRpb24odGVpQ2xhc3NuYW1lLCBlKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJbG9nRXhjZXB0aW9uKHRlaUNsYXNzbmFtZSwgZSk7Ci0JCX0KLQkJLy8gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCS8vIC8vIFRFSSBjbGFzcyB3YXNuJ3QgcmVhbGx5IGEgc3ViY2xhc3Mgb2YgVGFnRXh0cmFJbmZvCi0JCS8vIGlmIChERUJVRykKLQkJLy8gbG9nRXhjZXB0aW9uKHRlaUNsYXNzbmFtZSwgZSk7Ci0JCS8vIH0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlPYmplY3QgY3JlYXRlZFByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKGRvY3VtZW50LCBjdXN0b21UYWcsIElKU1BQcm9ibGVtLlRFSUNsYXNzTWlzYywgSlNQQ29yZU1lc3NhZ2VzLlRhZ2xpYkhlbHBlcl8yLCB0ZWlDbGFzc25hbWUsIHRydWUpOwotCQkJaWYgKGNyZWF0ZWRQcm9ibGVtICE9IG51bGwpIHsKLQkJCQlwcm9ibGVtcy5hZGQoY3JlYXRlZFByb2JsZW0pOwotCQkJfQotCQkJLy8gdGhpcyBpcyAzcmQgcGFydHkgY29kZSwgbmVlZCB0byBjYXRjaCBhbGwgZXhjZXB0aW9ucwotCQkJaWYgKERFQlVHKQotCQkJCWxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQl9Ci0JCWNhdGNoIChFcnJvciBlKSB7Ci0JCQkvLyB0aGlzIGlzIDNyZCBwYXJ0eSBjb2RlLCBuZWVkIHRvIGNhdGNoIGFsbCBlcnJvcnMKLQkJCU9iamVjdCBjcmVhdGVkUHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oZG9jdW1lbnQsIGN1c3RvbVRhZywgSUpTUFByb2JsZW0uVEVJQ2xhc3NOb3RJbnN0YW50aWF0ZWQsIEpTUENvcmVNZXNzYWdlcy5UYWdsaWJIZWxwZXJfMSwgdGVpQ2xhc3NuYW1lLCB0cnVlKTsKLQkJCWlmIChjcmVhdGVkUHJvYmxlbSAhPSBudWxsKSB7Ci0JCQkJcHJvYmxlbXMuYWRkKGNyZWF0ZWRQcm9ibGVtKTsKLQkJCX0KLQkJCWlmIChERUJVRykKLQkJCQlsb2dFeGNlcHRpb24odGVpQ2xhc3NuYW1lLCBlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG9sZExvYWRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3VzdG9tVGFnCi0JICogQHBhcmFtIHRlaUNsYXNzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGNyZWF0ZUpTUFByb2JsZW0oZmluYWwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgZmluYWwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZywgZmluYWwgaW50IHByb2JsZW1JRCwgZmluYWwgU3RyaW5nIG1lc3NhZ2VLZXksIGZpbmFsIFN0cmluZyBhcmd1bWVudCwgYm9vbGVhbiBwcmVmZXJWYXJzKSB7Ci0JCWZpbmFsIFN0cmluZyB0YWduYW1lID0gY3VzdG9tVGFnLmdldFRleHQoY3VzdG9tVGFnLmdldFJlZ2lvbnMoKS5nZXQoMSkpOwotCi0JCWZpbmFsIGludCBzdGFydDsKLQkJaWYgKGN1c3RvbVRhZy5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpIHsKLQkJCXN0YXJ0ID0gY3VzdG9tVGFnLmdldFN0YXJ0T2Zmc2V0KGN1c3RvbVRhZy5nZXRSZWdpb25zKCkuZ2V0KDEpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0YXJ0ID0gY3VzdG9tVGFnLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQotCQlmaW5hbCBpbnQgZW5kOwotCQlpZiAoY3VzdG9tVGFnLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgewotCQkJZW5kID0gY3VzdG9tVGFnLmdldFRleHRFbmRPZmZzZXQoY3VzdG9tVGFnLmdldFJlZ2lvbnMoKS5nZXQoMSkpIC0gMTsKLQkJfQotCQllbHNlIHsKLQkJCWVuZCA9IGN1c3RvbVRhZy5nZXRUZXh0RW5kT2Zmc2V0KCkgLSAxOwotCQl9Ci0KLQkJZmluYWwgaW50IGxpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCi0JCWZpbmFsIGNoYXJbXSBuYW1lOwotCQlJUGF0aCBsb2NhdGlvbiA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0TG9jYXRpb24oZG9jdW1lbnQpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJbmFtZSA9IG5ldyBjaGFyWzBdOwotCQl9Ci0JCWVsc2UgewotCQkJbmFtZSA9IGxvY2F0aW9uLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKLQkJfQotCi0JCS8qCi0JCSAqIE5vdGU6IHRoZXNlIHByb2JsZW1zIHdvdWxkIHJlc3VsdCBpbiB0cmFuc2xhdGlvbiBlcnJvcnMgb24gdGhlCi0JCSAqIHNlcnZlciwgc28gdGhlIHNldmVyaXR5IGlzIG5vdCBtZWFudCB0byBiZSBjb250cm9sbGFibGUKLQkJICovCi0JCXJldHVybiBuZXcgSUpTUFByb2JsZW0oKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VTdGFydChpbnQgc291cmNlU3RhcnQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0U291cmNlTGluZU51bWJlcihpbnQgbGluZU51bWJlcikgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VFbmQoaW50IHNvdXJjZUVuZCkgewotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNvdXJjZVN0YXJ0KCkgewotCQkJCXJldHVybiBzdGFydDsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTb3VyY2VMaW5lTnVtYmVyKCkgewotCQkJCXJldHVybiBsaW5lOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNvdXJjZUVuZCgpIHsKLQkJCQlyZXR1cm4gZW5kOwotCQkJfQotCi0JCQlwdWJsaWMgY2hhcltdIGdldE9yaWdpbmF0aW5nRmlsZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZUtleSwgbmV3IFN0cmluZ1tde3RhZ25hbWUsIGFyZ3VtZW50fSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0SUQoKSB7Ci0JCQkJcmV0dXJuIHByb2JsZW1JRDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZ1tdIGdldEFyZ3VtZW50cygpIHsKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRFSUQoKSB7Ci0JCQkJcmV0dXJuIHByb2JsZW1JRDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3VzdG9tVGFnCi0JICogQHBhcmFtIHZhbGlkYXRpb25NZXNzYWdlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGNyZWF0ZVZhbGlkYXRpb25NZXNzYWdlUHJvYmxlbShmaW5hbCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBmaW5hbCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY3VzdG9tVGFnLCBmaW5hbCBTdHJpbmcgdmFsaWRhdGlvbk1lc3NhZ2UpIHsKLQkJZmluYWwgaW50IHN0YXJ0OwotCQlpZiAoY3VzdG9tVGFnLmdldE51bWJlck9mUmVnaW9ucygpID4gMykgewotCQkJc3RhcnQgPSBjdXN0b21UYWcuZ2V0U3RhcnRPZmZzZXQoY3VzdG9tVGFnLmdldFJlZ2lvbnMoKS5nZXQoMikpOwotCQl9Ci0JCWVsc2UgaWYgKGN1c3RvbVRhZy5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpIHsKLQkJCXN0YXJ0ID0gY3VzdG9tVGFnLmdldFN0YXJ0T2Zmc2V0KGN1c3RvbVRhZy5nZXRSZWdpb25zKCkuZ2V0KDEpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0YXJ0ID0gY3VzdG9tVGFnLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQotCQlmaW5hbCBpbnQgZW5kOwotCQlpZiAoY3VzdG9tVGFnLmdldE51bWJlck9mUmVnaW9ucygpID4gMykgewotCQkJZW5kID0gY3VzdG9tVGFnLmdldFRleHRFbmRPZmZzZXQoY3VzdG9tVGFnLmdldFJlZ2lvbnMoKS5nZXQoY3VzdG9tVGFnLmdldE51bWJlck9mUmVnaW9ucygpIC0gMikpIC0gMTsKLQkJfQotCQllbHNlIGlmIChjdXN0b21UYWcuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAxKSB7Ci0JCQllbmQgPSBjdXN0b21UYWcuZ2V0VGV4dEVuZE9mZnNldChjdXN0b21UYWcuZ2V0UmVnaW9ucygpLmdldCgxKSkgLSAxOwotCQl9Ci0JCWVsc2UgewotCQkJZW5kID0gY3VzdG9tVGFnLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJfQotCi0JCWZpbmFsIGludCBsaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQotCQlmaW5hbCBjaGFyW10gbmFtZTsKLQkJSVBhdGggbG9jYXRpb24gPSBUYWdsaWJDb250cm9sbGVyLmdldExvY2F0aW9uKGRvY3VtZW50KTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCW5hbWUgPSBuZXcgY2hhclswXTsKLQkJfQotCQllbHNlIHsKLQkJCW5hbWUgPSBsb2NhdGlvbi50b1N0cmluZygpLnRvQ2hhckFycmF5KCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IElKU1BQcm9ibGVtKCkgewotCQkJcHVibGljIHZvaWQgc2V0U291cmNlU3RhcnQoaW50IHNvdXJjZVN0YXJ0KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFNvdXJjZUxpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0U291cmNlRW5kKGludCBzb3VyY2VFbmQpIHsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTb3VyY2VTdGFydCgpIHsKLQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U291cmNlTGluZU51bWJlcigpIHsKLQkJCQlyZXR1cm4gbGluZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTb3VyY2VFbmQoKSB7Ci0JCQkJcmV0dXJuIGVuZDsKLQkJCX0KLQotCQkJcHVibGljIGNoYXJbXSBnZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkgewotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCQkJcmV0dXJuIHZhbGlkYXRpb25NZXNzYWdlOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldElEKCkgewotCQkJCXJldHVybiBnZXRFSUQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZ1tdIGdldEFyZ3VtZW50cygpIHsKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRFSUQoKSB7Ci0JCQkJcmV0dXJuIElKU1BQcm9ibGVtLlRFSVZhbGlkYXRpb25NZXNzYWdlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWNsCi0JICogQHJldHVybiB0aGUgVGFnSW5mbyBmb3IgdGhlIFRMREVMZW1lbnREZWNsYXJhdGlvbiBpZiB0aGUgZGVjbGFyYXRpb24gaXMKLQkgKiAgICAgICAgIHZhbGlkLCBvdGhlcndpc2UgbnVsbAotCSAqLwotCXByaXZhdGUgVGFnSW5mbyBnZXRUYWdJbmZvKFRMREVsZW1lbnREZWNsYXJhdGlvbiBkZWNsLCBUYWdFeHRyYUluZm8gdGVpLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0KLQkJVGFnTGlicmFyeUluZm8gbGliSW5mbyA9IG5ldyBUYWdMaWJyYXJ5SW5mbyhwcmVmaXgsIHVyaSkgeyAvKgotCQkJCQkJCQkJCQkJCQkJCQkgKiBkdW1teQotCQkJCQkJCQkJCQkJCQkJCQkgKiBpbXBsCi0JCQkJCQkJCQkJCQkJCQkJCSAqLwotCQl9OwotCi0JCUNNTmFtZWROb2RlTWFwIGF0dHJzID0gZGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCVRhZ0F0dHJpYnV0ZUluZm9bXSBhdHRySW5mb3MgPSBuZXcgVGFnQXR0cmlidXRlSW5mb1thdHRycy5nZXRMZW5ndGgoKV07Ci0JCVRMREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9ICIiOyAvLyROT04tTkxTLTEkIAotCi0JCS8vIGdldCB0YWcgYXR0cmlidXRlIGluZm9zCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJYXR0ciA9IChUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cnMuaXRlbShpKTsKLQkJCXR5cGUgPSBhdHRyLmdldFR5cGUoKTsKLQkJCS8vIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgaXMgU3RyaW5nCi0JCQlpZiAoYXR0ci5nZXRUeXBlKCkgPT0gbnVsbCB8fCBhdHRyLmdldFR5cGUoKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkIAotCQkJCXR5cGUgPSAiamF2YS5sYW5nLlN0cmluZyI7IC8vJE5PTi1OTFMtMSQgCi0JCQlhdHRySW5mb3NbaV0gPSBuZXcgVGFnQXR0cmlidXRlSW5mbyhhdHRyLmdldEF0dHJOYW1lKCksIGF0dHIuaXNSZXF1aXJlZCgpLCB0eXBlLCBmYWxzZSk7Ci0JCX0KLQotCQlTdHJpbmcgdGFnTmFtZSA9IGRlY2wuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIHRhZ0NsYXNzID0gZGVjbC5nZXRUYWdjbGFzcygpOwotCQlTdHJpbmcgYm9keUNvbnRlbnQgPSBkZWNsLmdldEJvZHljb250ZW50KCk7Ci0JCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnQ2xhc3MgIT0gbnVsbCAmJiBib2R5Q29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBUYWdJbmZvKHRhZ05hbWUsIHRhZ0NsYXNzLCBib2R5Q29udGVudCwgZGVjbC5nZXRJbmZvKCksIGxpYkluZm8sIHRlaSwgYXR0ckluZm9zKTsKLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXByaXZhdGUgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIHRlaUNsYXNzbmFtZSwgVGhyb3dhYmxlIGUpIHsKLQotCQlTdHJpbmcgbWVzc2FnZSA9ICJ0ZWlDbGFzc25hbWU6IFsiOyAvLyROT04tTkxTLTEkIAotCQlpZiAodGVpQ2xhc3NuYW1lICE9IG51bGwpCi0JCQltZXNzYWdlICs9IHRlaUNsYXNzbmFtZTsKLQkJbWVzc2FnZSArPSAiXSI7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihtZXNzYWdlLCBlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBhdHRyaWJ1dGUgLT4gdmFsdWUgcGFpcnMgZm9yIHRoZSB0YWcgaW4gYSBIYXNodGFibGUuCi0JICogCi0JICogQHBhcmFtIGN1c3RvbVRhZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEhhc2h0YWJsZSBleHRyYWN0VGFnRGF0YShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY3VzdG9tVGFnKSB7Ci0JCUhhc2h0YWJsZSB0YWdEYXRhVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY3VzdG9tVGFnLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMjsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCS8vIGNoZWNrIGlmIGF0dHIgbmFtZQotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWF0dHJOYW1lID0gY3VzdG9tVGFnLmdldFRleHQocik7Ci0JCQkJLy8gY2hlY2sgZXF1YWxzIGlzIG5leHQgcmVnaW9uCi0JCQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID4gKytpKSB7Ci0JCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTICYmIHJlZ2lvbnMuc2l6ZSgpID4gKytpKSB7Ci0JCQkJCQkvLyBnZXQgYXR0ciB2YWx1ZQotCQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQkvLyBhdHRyaWJ1dGVzIGluIG91ciBkb2N1bWVudCBoYXZlIHF1b3Rlcywgc28gd2UKLQkJCQkJCQkvLyBuZWVkIHRvIHN0cmlwIHRoZW0KLQkJCQkJCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcFF1b3RlcyhjdXN0b21UYWcuZ2V0VGV4dChyKSk7Ci0JCQkJCQkJdGFnRGF0YVRhYmxlLnB1dChhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRhZ0RhdGFUYWJsZS5wdXQoImpzcDppZCIsIGN1c3RvbVRhZy5nZXRUZXh0KHJlZ2lvbnMuZ2V0KDEpKSArICJfIiArIGN1c3RvbVRhZy5nZXRTdGFydE9mZnNldCgpKTsgLy8kTk9OLU5MUy0xJCAKLQotCQlyZXR1cm4gdGFnRGF0YVRhYmxlOwotCX0KLQotCXByaXZhdGUgVGFnbGliQ2xhc3NMb2FkZXIgZ2V0Q2xhc3Nsb2FkZXIoKSB7Ci0JCWlmIChmTG9hZGVyID09IG51bGwpIHsKLQkJCWZMb2FkZXIgPSBuZXcgVGFnbGliQ2xhc3NMb2FkZXIodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCQkJZlByb2plY3RFbnRyaWVzLmNsZWFyKCk7Ci0JCQlmQ29udGFpbmVyRW50cmllcy5jbGVhcigpOwotCQkJYWRkQ2xhc3NwYXRoRW50cmllc0ZvclByb2plY3QoZ2V0UHJvamVjdCgpLCBmTG9hZGVyKTsKLQkJfQotCQlyZXR1cm4gZkxvYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzcGF0aEVudHJpZXNGb3JQcm9qZWN0KElQcm9qZWN0IHAsIFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlcikgewotCi0JCS8vIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBhbmQgY2xvc2VkIHByb2plY3QKLQkJaWYgKCFwLmlzQWNjZXNzaWJsZSgpIHx8IGZQcm9qZWN0RW50cmllcy5jb250YWlucyhwLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpCi0JCQlyZXR1cm47Ci0JCWZQcm9qZWN0RW50cmllcy5hZGQocC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCi0JCS8vIGFkZCB0aGluZ3Mgb24gY2xhc3NwYXRoIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4KLQkJdHJ5IHsKLQkJCWlmIChwLmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0KLQkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwKTsKLQotCQkJCXRyeSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQlhZGREZWZhdWx0RGlyRW50cnkobG9hZGVyLCBwcm9qZWN0KTsKLQkJCQkJYWRkQ2xhc3NwYXRoRW50cmllcyhsb2FkZXIsIHByb2plY3QsIGVudHJpZXMpOwotCQkJCX0KLQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhFbnRyaWVzKFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciwgSUphdmFQcm9qZWN0IHByb2plY3QsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCi0JCQllbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50IGVudHJ5IGlzOiAiICsgZW50cnkpOyAvLyROT04tTkxTLTEkCi0KLQkJCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQkJYWRkU291cmNlRW50cnkobG9hZGVyLCBlbnRyeSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCQkJYWRkTGlicmFyeUVudHJ5KGxvYWRlciwgZW50cnkuZ2V0UGF0aCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJCQlhZGRQcm9qZWN0RW50cnkobG9hZGVyLCBlbnRyeSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSA6Ci0JCQkJCWFkZFZhcmlhYmxlRW50cnkobG9hZGVyLCBlbnRyeSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOgotCQkJCQlhZGRDb250YWluZXJFbnRyeShsb2FkZXIsIHByb2plY3QsIGVudHJ5KTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFZhcmlhYmxlRW50cnkoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLT4gYWRkaW5nIHZhcmlhYmxlIGVudHJ5OiBbIiArIGVudHJ5ICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJLy8gdmFyaWFibGUgc2hvdWxkIGVpdGhlciBiZSBhIHByb2plY3Qgb3IgYSBsaWJyYXJ5IGVudHJ5Ci0KLQkJLy8gQlVHIDE2OTQzMQotCQlTdHJpbmcgdmFyaWFibGVOYW1lID0gZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCUlQYXRoIHZhcmlhYmxlUGF0aCA9IEphdmFDb3JlLmdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFBhdGgoKSk7Ci0JCXZhcmlhYmxlUGF0aCA9IEphdmFDb3JlLmdldENsYXNzcGF0aFZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7Ci0KLQkJLy8gUkFUTEMwMTA3Njg1NAotCQkvLyB2YXJpYWJsZSBwYXRocyBtYXkgbm90IGV4aXN0Ci0JCS8vIGluIHRoYXQgY2FzZSBudWxsIHdpbGwgYmUgcmV0dXJuZWQKLQkJaWYgKHZhcmlhYmxlUGF0aCAhPSBudWxsKSB7Ci0JCQlpZiAodmFyaWFibGVQYXRoLnNlZ21lbnRzKCkubGVuZ3RoID09IDEpIHsKLQkJCQlJUHJvamVjdCB2YXJQcm9qID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHZhcmlhYmxlUGF0aC50b1N0cmluZygpKTsKLQkJCQlpZiAodmFyUHJvaiAhPSBudWxsICYmIHZhclByb2ouZXhpc3RzKCkpIHsKLQkJCQkJYWRkQ2xhc3NwYXRoRW50cmllc0ZvclByb2plY3QodmFyUHJvaiwgbG9hZGVyKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWFkZExpYnJhcnlFbnRyeShsb2FkZXIsIHZhcmlhYmxlUGF0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gZW50cnkKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDb250YWluZXJFbnRyeShUYWdsaWJDbGFzc0xvYWRlciBsb2FkZXIsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKGVudHJ5LmdldFBhdGgoKSwgcHJvamVjdCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHVuaXF1ZVByb2plY3RBbmRDb250YWluZXJQYXRoID0gcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoY29udGFpbmVyLmdldFBhdGgoKSkudG9TdHJpbmcoKTsKLQkJCS8qCi0JCQkgKiBBdm9pZCBpbmZpbml0ZSByZWN1cnNpb24sIGJ1dCB0cmFjayBjb250YWluZXJzIGZvciBlYWNoIHByb2plY3QKLQkJCSAqIHNlcGFyYXRlbHkgYXMgdGhleSBtYXkgcmV0dXJuIGRpZmZlcmVudCB2YWx1ZXMuIFRoaXMgbWF5IG1lYW4KLQkJCSAqIGluZGV4aW5nIEpSRXMgbXVsdGlwbGUgdGltZXMsIGhvd2V2ZXIuCi0JCQkgKi8KLQkJCWlmICghZkNvbnRhaW5lckVudHJpZXMuY29udGFpbnModW5pcXVlUHJvamVjdEFuZENvbnRhaW5lclBhdGgpKSB7Ci0JCQkJZkNvbnRhaW5lckVudHJpZXMuYWRkKHVuaXF1ZVByb2plY3RBbmRDb250YWluZXJQYXRoKTsKLQotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNwZXMgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkJCS8vIHJlY3Vyc2l2ZSBjYWxsIGhlcmUKLQkJCQlhZGRDbGFzc3BhdGhFbnRyaWVzKGxvYWRlciwgcHJvamVjdCwgY3Blcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFByb2plY3RFbnRyeShUYWdsaWJDbGFzc0xvYWRlciBsb2FkZXIsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtPiBwcm9qZWN0IGVudHJ5OiBbIiArIGVudHJ5ICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJSVByb2plY3QgcmVmZXJlbmNlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCQlpZiAocmVmZXJlbmNlUHJvamVjdCAhPSBudWxsICYmIHJlZmVyZW5jZVByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCWFkZENsYXNzcGF0aEVudHJpZXNGb3JQcm9qZWN0KHJlZmVyZW5jZVByb2plY3QsIGxvYWRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gcHJvamVjdExvY2F0aW9uCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRGVmYXVsdERpckVudHJ5KFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkvLyBhZGQgZGVmYXVsdCBiaW4gZGlyZWN0b3J5IGZvciB0aGUgcHJvamVjdAotCQlJUGF0aCBvdXRwdXRQYXRoID0gcHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlsb2FkZXIuYWRkUGF0aChvdXRwdXRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpYnJhcnlFbnRyeShUYWdsaWJDbGFzc0xvYWRlciBsb2FkZXIsIElQYXRoIGxpYlBhdGgpIHsKLQkJU3RyaW5nIGphclBhdGhTdHJpbmcgPSBsaWJQYXRoLnRvU3RyaW5nKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxpYlBhdGgudG9PU1N0cmluZygpKTsKLQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCWxvYWRlci5hZGRQYXRoKGxpYlBhdGgpOwotCQl9Ci0JCWVsc2UgewotCQkJbG9hZGVyLmFkZERpcmVjdG9yeShqYXJQYXRoU3RyaW5nKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb2FkZXIKLQkgKiBAcGFyYW0gZW50cnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU291cmNlRW50cnkoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJLy8gYWRkIGJpbiBkaXJlY3RvcnkgZm9yIHNwZWNpZmljIGVudHJ5IGlmIGl0IGhhcwotCQkvLyBvbmUKLQkJSVBhdGggb3V0cHV0TG9jYXRpb24gPSBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlpZiAob3V0cHV0TG9jYXRpb24gIT0gbnVsbCkgewotCQkJbG9hZGVyLmFkZFBhdGgob3V0cHV0TG9jYXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmTW9kZWxRdWVyeS4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KElEb2N1bWVudCBkb2MpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCU1vZGVsUXVlcnkgbXEgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQltcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobW9kZWwpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIG1xOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmRmlsZS4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBmRmlsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCWZQcm9qZWN0ID0gcDsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHApOwotCQlpZiAoamF2YVByb2plY3QuZXhpc3RzKCkpIHsKLQkJCWZKYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UHJvYmxlbXMoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gKENvbGxlY3Rpb24pIGZUcmFuc2xhdGlvblByb2JsZW1zLnJlbW92ZShwYXRoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVUYWdDbGFzcyhJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY3VzdG9tVGFnLCBUTERFbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgTGlzdCBwcm9ibGVtcykgewotCQkvLyBza2lwIGlmIGZyb20gYSB0YWcgZmlsZQotCQlpZiAoVExERWxlbWVudERlY2xhcmF0aW9uLlNPVVJDRV9UQUdfRklMRS5lcXVhbHMoZGVjbC5nZXRQcm9wZXJ0eShUTERFbGVtZW50RGVjbGFyYXRpb24uVEFHX1NPVVJDRSkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgdGFnQ2xhc3NuYW1lID0gZGVjbC5nZXRUYWdjbGFzcygpOwotCQlPYmplY3QgdGFnQ2xhc3MgPSBudWxsOwotCQlpZiAodGFnQ2xhc3NuYW1lICE9IG51bGwgJiYgdGFnQ2xhc3NuYW1lLmxlbmd0aCgpID4gMCAmJiBmSmF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0YWdDbGFzcyA9IGZKYXZhUHJvamVjdC5maW5kVHlwZSh0YWdDbGFzc25hbWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlpZiAodGFnQ2xhc3MgPT0gbnVsbCkgewotCQkJT2JqZWN0IGNyZWF0ZWRQcm9ibGVtID0gY3JlYXRlSlNQUHJvYmxlbShkb2N1bWVudCwgY3VzdG9tVGFnLCBJSlNQUHJvYmxlbS5UYWdDbGFzc05vdEZvdW5kLCBKU1BDb3JlTWVzc2FnZXMuVGFnbGliSGVscGVyXzMsIHRhZ0NsYXNzbmFtZSwgZmFsc2UpOwotCQkJaWYgKGNyZWF0ZWRQcm9ibGVtICE9IG51bGwpIHsKLQkJCQlwcm9ibGVtcy5hZGQoY3JlYXRlZFByb2JsZW0pOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyQ2FjaGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlckNhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjFlMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQSBzaW1wbGUgY2FjaGUgZm9yIFRhZ2xpYkhlbHBlcnMgdG8gYXZvaWQgZXhjZXNzaXZlIGNyZWF0aW9uIG9mIFRhZ2xpYkNsYXNzTG9hZGVycwotICogQGF1dGhvciBwYXZlcnkKLSAqLwotY2xhc3MgVGFnbGliSGVscGVyQ2FjaGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLSAgICBzdGF0aWMgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYnZhcnMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gZW50cnkgZm9yIHRoZSBjYWNoZSAocHJvamVjdFBhdGggc3RyaW5nICYgVGFnbGliSGVscGVyKQotICAgICAqLwotICAgIGNsYXNzIEVudHJ5IHsKLSAgICAgICAgcHJpdmF0ZSBUYWdsaWJIZWxwZXIgZkhlbHBlcjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZlByb2plY3ROYW1lOwotICAgICAgICAKLSAgICAgICAgcHVibGljIEVudHJ5KFN0cmluZyBwcm9qZWN0TmFtZSwgVGFnbGliSGVscGVyIGhlbHBlcikgewotICAgICAgICAgICAgc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgc2V0SGVscGVyKGhlbHBlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFRhZ2xpYkhlbHBlciBnZXRIZWxwZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZkhlbHBlcjsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRIZWxwZXIoVGFnbGliSGVscGVyIGhlbHBlcikgewotICAgICAgICAgICAgZkhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGZQcm9qZWN0TmFtZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgICAgIGZQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlRhZ2xpYiBIZWxwZXIgRW50cnkgWyIgKyBnZXRQcm9qZWN0TmFtZSgpICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3QgZkhlbHBlcnM7Ci0gICAgLy8gbWF4IHNpemUgZm9yIHRoZSBjYWNoZQotICAgIHByaXZhdGUgaW50IE1BWF9TSVpFOwotCi0gICAgLyoqCi0gICAgICogTm90IGludGVuZGVkIHRvIGJlIGxhcmdlIHNpbmNlIHVuZGVybHlpbmcgaW1wbG1lbWVudGF0aW9uIHVzZXMKLSAgICAgKiBhIExpc3QuCi0gICAgICovCi0gICAgcHVibGljIFRhZ2xpYkhlbHBlckNhY2hlKGludCBzaXplKSB7Ci0gICAgICAgIE1BWF9TSVpFID0gc2l6ZTsKLSAgICAgICAgZkhlbHBlcnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3QoTUFYX1NJWkUpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3RQYXRoCi0gICAgICogQHBhcmFtIGYKLSAgICAgKiBAcGFyYW0gbXEKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBUYWdsaWJIZWxwZXIgZ2V0SGVscGVyKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgVGFnbGliSGVscGVyIGhlbHBlciA9IG51bGw7Ci0gICAgICAgIEVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gcHJvamVjdC5nZXROYW1lKCk7Ci0gICAgICAgIGludCBzaXplID0gZkhlbHBlcnMuc2l6ZSgpOwotICAgICAgICAvLyBmaXN0IGNoZWNrIGZvciBleGlzdGluZwotICAgICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBlbnRyeSA9IChFbnRyeSlmSGVscGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZihlbnRyeS5nZXRQcm9qZWN0TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBleGlzdHMKLSAgICAgICAgICAgICAgICBoZWxwZXIgPSBlbnRyeS5nZXRIZWxwZXIoKTsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IG1vdmUgdG8gZnJvbnQgaWYgaXQncyBub3QgdGhlIGZpcnN0IGVudHJ5Ci0gICAgICAgICAgICAgICAgaWYoaT4wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZIZWxwZXJzLnJlbW92ZShlbnRyeSk7Ci0JICAgICAgICAgICAgICAgIGZIZWxwZXJzLmFkZCgxLCBlbnRyeSk7Ci0JICAgICAgICAgICAgICAgIGlmKERFQlVHKSB7Ci0JICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiKC0+KSBUYWdsaWJIZWxwZXJDYWNoZSBtb3ZlZDogIiArIGVudHJ5ICsgIiB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JICAgICAgICAgICAgICAgICAgICBwcmludENhY2hlQ29udGVudHMoKTsKLQkgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBkaWRuJ3QgZXhpc3QKLSAgICAgICAgaWYoaGVscGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGhlbHBlciA9IGNyZWF0ZU5ld0hlbHBlcihwcm9qZWN0TmFtZSwgcHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlbHBlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lCi0gICAgICogQHBhcmFtIGYKLSAgICAgKiBAcGFyYW0gbXEKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYWdsaWJIZWxwZXIgY3JlYXRlTmV3SGVscGVyKFN0cmluZyBwcm9qZWN0TmFtZSwgSVByb2plY3QgcHJvamVjdCkgewotCi0gICAgICAgIFRhZ2xpYkhlbHBlciBoZWxwZXI7Ci0gICAgICAgIC8vIGNyZWF0ZQotICAgICAgICBoZWxwZXIgPSBuZXcgVGFnbGliSGVscGVyKHByb2plY3QpOwotICAgICAgICBFbnRyeSBuZXdFbnRyeSA9IG5ldyBFbnRyeShwcm9qZWN0TmFtZSwgaGVscGVyKTsKLSAgICAgICAgZkhlbHBlcnMuYWRkKDAsIG5ld0VudHJ5KTsKLSAgICAgICAgaWYoREVCVUcpIHsKLSAgICAgICAgCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICIoKykgVGFnbGliSGVscGVyQ2FjaGUgYWRkZWQ6ICIgKyBuZXdFbnRyeSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHByaW50Q2FjaGVDb250ZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGZIZWxwZXJzLnNpemUoKSA+IE1BWF9TSVpFKSB7Ci0gICAgICAgICAgICAvLyBvbmUgdG9vIG1hbnksIHJlbW92ZSBsYXN0Ci0gICAgICAgICAgICBPYmplY3QgcmVtb3ZlZCA9IGZIZWxwZXJzLnJlbW92ZShmSGVscGVycy5zaXplKCktMSk7Ci0gICAgICAgICAgICBpZihERUJVRykgewotICAgICAgICAgICAgCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICIoLSkgVGFnbGliSGVscGVyQ2FjaGUgcmVtb3ZlZDogIiArIHJlbW92ZWQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcHJpbnRDYWNoZUNvbnRlbnRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlbHBlcjsKLSAgICB9Ci0gCi0gICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUhlbHBlcihTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgRW50cnkgZW50cnkgPSBudWxsOwotICAgICAgICBJdGVyYXRvciBpdCA9IGZIZWxwZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgZW50cnkgPSAoRW50cnkpaXQubmV4dCgpOwotICAgICAgICAgICAgaWYoZW50cnkuZ2V0UHJvamVjdE5hbWUoKS5lcXVhbHMocHJvamVjdE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZkhlbHBlcnMucmVtb3ZlKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBpZihERUJVRykgeyAKLSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIigtKSBUYWdsaWJIZWxwZXJDYWNoZSByZW1vdmVkOiAiICsgZW50cnkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHByaW50Q2FjaGVDb250ZW50cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcHJpbnRDYWNoZUNvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgZGVidWdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGRlYnVnU3RyaW5nLmFwcGVuZCgiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlYnVnU3RyaW5nLmFwcGVuZCgiXG5jYWNoZSBjb250ZW50czoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZkhlbHBlcnMuc2l6ZSgpOyBpKyspCQotICAgICAgICAJZGVidWdTdHJpbmcuYXBwZW5kKCJcbiAtIiArIGkgKyAiLSAiICsgZkhlbHBlcnMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGRlYnVnU3RyaW5nLmFwcGVuZCgiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLklORk8sIGRlYnVnU3RyaW5nLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlck1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1ZGQyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotCi0vKioKLSAqIE1hbmFnZXMgY3JlYXRpb24gYW5kIGNhY2hpbmcgKG9yZGVyZWQgTVJVKSBvZiBUYWdsaWJIZWxwZXJzLgotICogUmVtb3ZlcyBoZWxwZXJzIHdoZW4gdGhlaXIgY2xhc3NwYXRoIGNoYW5nZXMgKHNvIHRoZXkgYXJlIHJlYnVpbHQpLgotICogVGhlcmUgaXMgb25lIGhlbHBlciBwZXIgcHJvamVjdCAod2l0aCBhIHNwZWNpZmljIGNsYXNzcGF0aCBlbnRyeSkuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJIZWxwZXJNYW5hZ2VyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotICAgCi0KLSAgICBwcml2YXRlIHN0YXRpYyBUYWdsaWJIZWxwZXJNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLSAgICAvLyB1c2luZyBhIGNhY2hlIG9mIGp1c3QgMyBsb2FkZXJzCi0gICAgcHJpdmF0ZSBUYWdsaWJIZWxwZXJDYWNoZSBmQ2FjaGUgPSBuZXcgVGFnbGliSGVscGVyQ2FjaGUoMyk7Ci0KLSAgICBwcml2YXRlIFRhZ2xpYkhlbHBlck1hbmFnZXIoKSB7Ci0gICAgICAgIC8vIHVzZSBpbnN0YW5jZQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBUYWdsaWJIZWxwZXJNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotICAgICAgICBpZihpbnN0YW5jZSA9PSBudWxsKQotICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgVGFnbGliSGVscGVyTWFuYWdlcigpOwotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUYWdsaWJIZWxwZXIgZ2V0VGFnbGliSGVscGVyKElGaWxlIGYpIHsKLSAgICAgICAgSVByb2plY3QgcCA9IGYuZ2V0UHJvamVjdCgpOwotICAgICAgICByZXR1cm4gZ2V0SGVscGVyRnJvbUNhY2hlKHApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvamVjdFBhdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIFRhZ2xpYkhlbHBlciBnZXRIZWxwZXJGcm9tQ2FjaGUoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICByZXR1cm4gZkNhY2hlLmdldEhlbHBlcihwcm9qZWN0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXBkYXRlIGNsYXNzcGF0aCBmb3IgYXBwcm9wcmlhdGUgbG9hZGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIjZWxlbWVudENoYW5nZWQob3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudCkKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGhhbmRsZSBjbGFzc3BhdGggY2hhbmdlcwotCQlJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCWlmIChkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCkgewotCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGFuZ2VkID0gZGVsdGEuZ2V0Q2hhbmdlZENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoKGNoYW5nZWRbaV0uZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xBU1NQQVRIX0NIQU5HRUQpICE9IDAgfHwgKGNoYW5nZWRbaV0uZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVPUkRFUikgIT0gMCB8fCAoY2hhbmdlZFtpXS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCB8fCAoY2hhbmdlZFtpXS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1JFU09VUkNFKSAhPSAwKSB7Ci0JCQkJCUlKYXZhRWxlbWVudCBwcm9qID0gY2hhbmdlZFtpXS5nZXRFbGVtZW50KCk7Ci0JCQkJCWhhbmRsZUNsYXNzcGF0aENoYW5nZShjaGFuZ2VkLCBpLCBwcm9qKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNoYW5nZWQKLSAgICAgKiBAcGFyYW0gaQotICAgICAqIEBwYXJhbSBwcm9qCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNsYXNzcGF0aENoYW5nZShJSmF2YUVsZW1lbnREZWx0YVtdIGNoYW5nZWQsIGludCBpLCBJSmF2YUVsZW1lbnQgcHJvaikgewotICAgICAgICBpZiAocHJvai5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9ICgoSUphdmFQcm9qZWN0KSBwcm9qKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkJZkNhY2hlLnJlbW92ZUhlbHBlcihwcm9qZWN0TmFtZSk7Ci0JCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJWYXJpYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczYmJiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhcmlhYmxlSW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiBDb250YWlucyBpbmZvIGFib3V0IGEgVGFnbGliVmFyaWFibGU6IGNsYXNzbmFtZSwgdmFyaWFibGVuYW1lLgotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliVmFyaWFibGUgewotCi0JcHJpdmF0ZSBTdHJpbmcgZlZhckNsYXNzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmVmFyTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlNjb3BlOwotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbjsKLQotCS8qKiBmaXhlZCBlbmQtb2YtbGluZSB2YWx1ZSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVOREwgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRfRU5EID0gIkFUX0VORCI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUX0JFR0lOID0gIkFUX0JFR0lOIjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVTVEVEID0gIk5FU1RFRCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNX1BSSVZBVEUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1fTk9ORSA9IDA7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVGFnbGliVmFyaWFibGUoU3RyaW5nIHZhckNsYXNzLCBTdHJpbmcgdmFyTmFtZSwgaW50IHNjb3BlKSB7Ci0JCXNldFZhckNsYXNzKHZhckNsYXNzKTsKLQkJc2V0VmFyTmFtZSh2YXJOYW1lKTsKLQkJc2V0U2NvcGUoc2NvcGUpOwotCX0KLQotCXB1YmxpYyBUYWdsaWJWYXJpYWJsZShTdHJpbmcgdmFyQ2xhc3MsIFN0cmluZyB2YXJOYW1lLCBTdHJpbmcgc2NvcGUpIHsKLQkJc2V0VmFyQ2xhc3ModmFyQ2xhc3MpOwotCQlzZXRWYXJOYW1lKHZhck5hbWUpOwotCQlzZXRTY29wZShzY29wZSk7Ci0JfQotCi0JcHVibGljIFRhZ2xpYlZhcmlhYmxlKFN0cmluZyB2YXJDbGFzcywgU3RyaW5nIHZhck5hbWUsIFN0cmluZyBzY29wZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXNldFZhckNsYXNzKHZhckNsYXNzKTsKLQkJc2V0VmFyTmFtZSh2YXJOYW1lKTsKLQkJc2V0U2NvcGUoc2NvcGUpOwotCQlzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JfQotCi0JVGFnbGliVmFyaWFibGUoU3RyaW5nIHZhckNsYXNzLCBTdHJpbmcgdmFyTmFtZSwgaW50IHNjb3BlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc2V0VmFyQ2xhc3ModmFyQ2xhc3MpOwotCQlzZXRWYXJOYW1lKHZhck5hbWUpOwotCQlzZXRTY29wZShzY29wZSk7Ci0JCXNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZWYXJDbGFzcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhckNsYXNzKCkgewotCQlyZXR1cm4gZlZhckNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YXJDbGFzcwotCSAqICAgICAgICAgICAgVGhlIGZWYXJDbGFzcyB0byBzZXQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0VmFyQ2xhc3MoU3RyaW5nIHZhckNsYXNzKSB7Ci0JCWZWYXJDbGFzcyA9IHZhckNsYXNzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZlZhck5hbWUuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYXJOYW1lKCkgewotCQlyZXR1cm4gZlZhck5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhck5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBmVmFyTmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0VmFyTmFtZShTdHJpbmcgdmFyTmFtZSkgewotCQlmVmFyTmFtZSA9IHZhck5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldERlY2xhcmF0aW9uU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0RGVjbGFyYXRpb25TdHJpbmcoZmFsc2UsIE1fTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldERlY2xhcmF0aW9uU3RyaW5nKGJvb2xlYW4gaW5jbHVkZURvYywgaW50IHN0eWxlKSB7Ci0JCVN0cmluZyBkZWNsYXJhdGlvbiA9IG51bGw7Ci0JCS8qCi0JCSAqIG5vIGRlc2NyaXB0aW9uIGZvciBub3cgLS1KRFQgd291bGQgbmVlZCB0byBzaG93IGl0IGZvciBsb2NhbAotCQkgKiB2YXJpYWJsZXMgYW5kIElMb2NhbFZhcmlhYmxlIGhhcyBubyAiZG9jIHJhbmdlIgotCQkgKi8KLQkJaWYgKGluY2x1ZGVEb2MgJiYgZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKSB7Ci0JCQlpZiAoc3R5bGUgPT0gTV9QUklWQVRFKSB7Ci0JCQkJZGVjbGFyYXRpb24gPSAiLyoqICIgKyBFTkRMICsgU3RyaW5nVXRpbHMucmVwbGFjZShnZXREZXNjcmlwdGlvbigpLCAiKi8iLCAiKlxcLyIpICsgRU5ETCArICIgKi8gIiArIEVOREwgKyAicHJpdmF0ZSAiICsgZ2V0VmFyQ2xhc3MoKSArICIgIiArIGdldFZhck5hbWUoKSArICIgPSBudWxsOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAvLyROT04tTkxTLTUkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkZWNsYXJhdGlvbiA9ICIvKiogIiArIEVOREwgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGdldERlc2NyaXB0aW9uKCksICIqLyIsICIqXFwvIikgKyBFTkRMICsgIiAqLyAiICsgRU5ETCArIGdldFZhckNsYXNzKCkgKyAiICIgKyBnZXRWYXJOYW1lKCkgKyAiID0gbnVsbDsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgLy8kTk9OLU5MUy01JAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHN0eWxlID09IE1fUFJJVkFURSkgewotCQkJCWRlY2xhcmF0aW9uID0gInByaXZhdGUgIiArIGdldFZhckNsYXNzKCkgKyAiICIgKyBnZXRWYXJOYW1lKCkgKyAiID0gbnVsbDsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRlY2xhcmF0aW9uID0gZ2V0VmFyQ2xhc3MoKSArICIgIiArIGdldFZhck5hbWUoKSArICIgPSBudWxsOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVjbGFyYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNjb3BlKCkgewotCQlyZXR1cm4gZlNjb3BlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjb3BlKGludCBzY29wZSkgewotCQlmU2NvcGUgPSBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGVTdHJpbmcpIHsKLQkJaW50IHNjb3BlID0gVmFyaWFibGVJbmZvLkFUX0JFR0lOOwotCi0JCVN0cmluZyB0cmltbWVkU2NvcGUgPSBzY29wZVN0cmluZy50cmltKCk7Ci0JCWlmIChORVNURUQuZXF1YWxzKHRyaW1tZWRTY29wZSkpIHsKLQkJCXNjb3BlID0gVmFyaWFibGVJbmZvLk5FU1RFRDsKLQkJfQotCQllbHNlIGlmIChBVF9CRUdJTi5lcXVhbHModHJpbW1lZFNjb3BlKSkgewotCQkJc2NvcGUgPSBWYXJpYWJsZUluZm8uQVRfQkVHSU47Ci0JCX0KLQkJZWxzZSBpZiAoQVRfRU5ELmVxdWFscyh0cmltbWVkU2NvcGUpKSB7Ci0JCQlzY29wZSA9IFZhcmlhYmxlSW5mby5BVF9FTkQ7Ci0JCX0KLQotCQlmU2NvcGUgPSBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YXNrcy9KU1BGaWxlVGFza1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFza3MvSlNQRmlsZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjVmYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YXNrcy9KU1BGaWxlVGFza1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrcy5YTUxGaWxlVGFza1NjYW5uZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BGaWxlVGFza1NjYW5uZXIgZXh0ZW5kcyBYTUxGaWxlVGFza1NjYW5uZXIgewotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlyZXR1cm4gc3VwZXIuaXNDb21tZW50UmVnaW9uKHJlZ2lvbiwgdGV4dFJlZ2lvbikgfHwgdGV4dFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTc0MzIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQkvLyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHY1LjEuMCwgd2UnbGwgcmV1c2UgU1RfSlNQX0RJUkVDVElWRSBmb3IgYWN0aW9uCi0JLy8gdGFncwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZkVuYWJsZUpTUEFjdGlvblBhcnRpdGlvbnMgPSB0cnVlOwotCS8vIGxpc3Qgb2YgdmFsaWQgSlNQIDEuMiB0YWcgYW5kIGFjdGlvbiBuYW1lcwotCXByaXZhdGUgc3RhdGljIExpc3QgZkpTUEFjdGlvblRhZ05hbWVzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9NSU1FX1RZUEUgPSAidGV4dC9odG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSFRNTF9NSU1FX1RZUEUgPSAidGV4dC94aHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX01JTUVfVFlQRSA9ICJ0ZXh0L3htbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk5EX1dBUF9XTUwgPSAidGV4dC92bmQud2FwLndtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxULCBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTCwgSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwyLCBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFLCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVIsIElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEsIElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQsIElKU1BQYXJ0aXRpb25zLkpTUF9DT01NRU5UfTsKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGZFbWJlZGRlZFBhcnRpdGlvbmVyID0gbnVsbDsKLQkvKgotCSAqIFNhdmUgbGFzdCB0YWdsaWIgcHJlZml4IHRoYXQgd2FzIGNoZWNrZWQgKHNlZSBpc0FjdGlvbigpKSBmb3IgYmV0dGVyCi0JICogcGVyZm9ybWFuY2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdENoZWNrZWRQcmVmaXggPSBudWxsOwotCi0JLyoqCi0JICogQXNzdW1lIGxhbmd1YWdlPWphdmEgYnkgZGVmYXVsdCAuLi4gY2xpZW50LCBzdWNoIGFzCi0JICogUGFnZURpcmVjdGl2ZUFkYXB0ZXIsIG11c3Qgc2V0IGxhbmd1YWdlIG9mIGRvY3VtZW50IHBhcnRpdGlvbmVyLAotCSAqIGlmL3doZW4gaXQgY2hhbmdlcy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFuZ3VhZ2UgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKU1BEb2N1bWVudFBhcnRpb25lci4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGZKU1BBY3Rpb25UYWdOYW1lcyA9PSBudWxsKSB7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIHVzZXMgLmVxdWFscygpIGZvcgotCQkJLy8gY29udGFpbnMoKQotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUNMQVJBVElPTik7Ci0JCQkvLyBmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCS8vIGZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1BBR0UpOwotCQkJLy8gZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTik7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9SV0FSRCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkdFVFBST1BFUlRZKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5DTFVERSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUExVR0lOKTsKLQkJCS8vIGZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZKTsKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVCk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2Nvbm5lY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIuY29ubmVjdChkb2N1bWVudCk7Ci0JCWZTdXBwb3J0ZWRUeXBlcyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBjcmVhdGVTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHJlc3VsdCA9IG51bGw7Ci0JCS8vIHRoaXMgc2FtZSBkZXRlY3RvciBzaG91bGQgdW5kZXJseSBjb250ZW50IGRlc2NyaWJlciwgdG8gaGF2ZSBjb25zaXN0ZW50IHJlc3VsdHMKLQkJSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yIGpzcEhlYWRDb250ZW50RGV0ZWN0b3IgPSBuZXcgSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yKCk7Ci0JCWpzcEhlYWRDb250ZW50RGV0ZWN0b3Iuc2V0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCVN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50VHlwZSA9IGpzcEhlYWRDb250ZW50RGV0ZWN0b3IuZ2V0Q29udGVudFR5cGUoKTsKLQkJCS8vIGlmIFhIVE1MIG9yIFdNTCwgdGhhdCB0cnVtcHMgd2hhdCBpcyBpbiB0aGUgcGFnZSBkaXJlY3RpdmUKLQkJCWlmIChqc3BIZWFkQ29udGVudERldGVjdG9yLmlzWEhUTUwoKSB8fCBqc3BIZWFkQ29udGVudERldGVjdG9yLmlzV01MKCkpIHsKLQkJCQljb250ZW50VHlwZSA9ICJ0ZXh0L2h0bWwiOwotCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0LCBzaW5jZSB3b3JraW5nIHdpdGggZG9jdW1lbnQgc3RyZWFtCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJLy8gbnVsbCBvciBlbXB0eSwgdHJlYXQgYXMgImRlZmF1bHQiCi0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8IGNvbnRlbnRUeXBlLmxlbmd0aCgpID09IDApIHsKLQkJCWNvbnRlbnRUeXBlID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyB3ZSBjdXJyZW50bHkgb25seSBoYXZlIHR3byAuLi4gZXZlbnR1YWxseSBzaG91bGQKLQkJLy8gbWFrZSBvciB0aWUtaW4gdG8gZXhpc3RpbmcgcmVnaXN0cnkuCi0JCWlmIChjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUxfTUlNRV9UWVBFKSB8fCBjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFZORF9XQVBfV01MKSkgewotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCk7Ci0JCQlyZXN1bHQuY29ubmVjdChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoWEhUTUxfTUlNRV9UWVBFKSkgewotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCk7Ci0JCQlyZXN1bHQuY29ubmVjdChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoWE1MX01JTUVfVFlQRSkgfHwgY29udGVudFR5cGUuZW5kc1dpdGgoIit4bWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKCk7Ci0JCQlyZXN1bHQuY29ubmVjdChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZGlzY29ubmVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJaWYgKGZFbWJlZGRlZFBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmRpc2Nvbm5lY3QoKTsKLQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTA5Ci0JCQkvKioKLQkJCSAqIGZvcmNlIHJlY3JlYXRpb24gd2hlbiByZWNvbm5lY3RlZAotCQkJICovCi0JCQlmRW1iZWRkZWRQYXJ0aXRpb25lciA9IG51bGw7Ci0JCX0KLQkJLy8gc3VwZXIuZGlzY29ubmVjdCBzaG91bGQgY29tZSBhdCBlbmQsIHNpbmNlIGl0IChtYXkpIHNldAotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQgdG8gbnVsbAotCQlzdXBlci5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKS5nZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVtYmVkZGVkUGFydGl0aW9uZXIuCi0JICogCi0JICogQHJldHVybiBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkgewotCQlpZiAoZkVtYmVkZGVkUGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIgPSBjcmVhdGVTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIuY29ubmVjdChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCi0JCXJldHVybiBmRW1iZWRkZWRQYXJ0aXRpb25lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBmTGFuZ3VhZ2U7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldExvY2FsTGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIGNvbmZpZ3VyZWRUeXBlcyA9IGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmVkVHlwZXMubGVuZ3RoOyBpKyspCi0JCQl0eXBlcy5hZGQoY29uZmlndXJlZFR5cGVzW2ldKTsKLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhcmVudE5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzZFJlZ2lvbiAhPSBudWxsICYmIGlzVmFsaWRKc3BBY3Rpb25SZWdpb25UeXBlKHNkUmVnaW9uLmdldFR5cGUoKSkpCi0JCQlzZFJlZ2lvbiA9IHNkUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0KLQkJaWYgKHNkUmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJLy8gb25seSBmaW5kIHBhcmVudCBuYW1lcyBmcm9tIGEgc3RhcnQgdGFnCi0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCWlmIChyZWdpb25zLmdldCgwKS5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSAmJiByLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpKSB7Ci0JCQkJCXJlc3VsdCA9IHNkUmVnaW9uLmdldFRleHQocik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlmaW5hbCBTdHJpbmcgcmVnaW9uX3R5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGVGb3JEb2N1bWVudExhbmd1YWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFKQotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTU1FTlQ7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSkKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkU7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0RFTElNSVRFUjsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVDsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NPTlRFTlQgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NMT1NFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9EUVVPVEUgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX1NRVU9URSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfUVVPVEVEX0NPTlRFTlQpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTDsKLQkJZWxzZSBpZiAocmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1ZCTF9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfQ09OVEVOVCB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX0NMT1NFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfRFFVT1RFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfU1FVT1RFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfUVVPVEVEX0NPTlRFTlQpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTDI7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCS8vIEJVRzEzMTQ2MzogcG9zc2libHkgYmV0d2VlbiA8anNwOnNjcmlwdGxldD4sIDxqc3A6ZXhwcmVzc2lvbj4sCi0JCQkvLyA8anNwOmRlY2xhcmF0aW9uPgotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IHRoaXMuZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGlzSnNwSmF2YUFjdGlvbk5hbWUoZ2V0UGFyZW50TmFtZShzZFJlZ2lvbikpKQotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGVGb3JEb2N1bWVudExhbmd1YWdlKCk7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCS8vIHBvc3NpYmx5IGJldHdlZW4gPGpzcDpzY3JpcHRsZXQ+LCA8anNwOmV4cHJlc3Npb24+LAotCQkJLy8gPGpzcDpkZWNsYXJhdGlvbj4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSB0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpc0pzcEphdmFBY3Rpb25OYW1lKGdldFBhcmVudE5hbWUoc2RSZWdpb24pKSkKLQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlRm9yRG9jdW1lbnRMYW5ndWFnZSgpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4ocHJldmlvdXNOb2RlLCBuZXh0Tm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUZvckRvY3VtZW50TGFuZ3VhZ2UoKSB7Ci0JCVN0cmluZyByZXN1bHQ7Ci0JCWlmIChmTGFuZ3VhZ2UgPT0gbnVsbCB8fCBmTGFuZ3VhZ2UuZXF1YWxzSWdub3JlQ2FzZSgiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkE7Ci0JCX0KLQkJZWxzZSBpZiAoZkxhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UoImphdmFzY3JpcHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX1NDUklQVF9QUkVGSVggKyBnZXRMYW5ndWFnZSgpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJTGlzdCBjb21iaW5lZFR5cGVzID0gZ2V0TG9jYWxMZWdhbENvbnRlbnRUeXBlcygpOwotCQlpZiAoZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIG1vcmVUeXBlcyA9IGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKS5nZXRMZWdhbENvbnRlbnRUeXBlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb3JlVHlwZXMubGVuZ3RoOyBpKyspCi0JCQkJY29tYmluZWRUeXBlcy5hZGQobW9yZVR5cGVzW2ldKTsKLQkJfQotCQlmU3VwcG9ydGVkVHlwZXMgPSBuZXcgU3RyaW5nWzBdOwotCQljb21iaW5lZFR5cGVzLnRvQXJyYXkoZlN1cHBvcnRlZFR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2RSZWdpb24KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0FjdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICghc2RSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8qCi0JCSAqIHNob3VsZG4ndCBnZXQgYSB0YWcgbmFtZSByZWdpb24gdHlwZSB1bmxlc3MgYSB0YWcgbmFtZSByZWdpb24KLQkJICogZXhpc3RzIGF0IFsxXQotCQkgKi8KLQkJSVRleHRSZWdpb24gdGFnTmFtZVJlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCVN0cmluZyB0YWdOYW1lID0gc2RSZWdpb24uZ2V0VGV4dCh0YWdOYW1lUmVnaW9uKTsKLQotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIEpTUFNvdXJjZVBhcnNlcikgewotCQkJaWYgKHRhZ05hbWUuZXF1YWxzKGZMYXN0Q2hlY2tlZFByZWZpeCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlMaXN0IGZDdXN0b21BY3Rpb25QcmVmaXhlcyA9ICgoSlNQU291cmNlUGFyc2VyKSBwYXJzZXIpLmdldE5lc3RhYmxlUHJlZml4ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkN1c3RvbUFjdGlvblByZWZpeGVzLnNpemUoKTsgaSsrKQotCQkJCWlmICh0YWdOYW1lLnN0YXJ0c1dpdGgoKChUYWdNYXJrZXIpIGZDdXN0b21BY3Rpb25QcmVmaXhlcy5nZXQoaSkpLmdldFRhZ05hbWUoKSkpIHsKLQkJCQkJZkxhc3RDaGVja2VkUHJlZml4ID0gKChUYWdNYXJrZXIpIGZDdXN0b21BY3Rpb25QcmVmaXhlcy5nZXQoaSkpLmdldFRhZ05hbWUoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RvY3VtZW50UmVnaW9uQmFzZWRQYXJ0aXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVRleHRSZWdpb24gY29udGFpbmVkQ2hpbGRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIGRvY3VtZW50UmVnaW9uQ29udGV4dCA9IHNkUmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKGNvbnRhaW5lZENoaWxkUmVnaW9uICE9IG51bGwpIHsKLQkJCWlmIChkb2N1bWVudFJlZ2lvbkNvbnRleHQuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgfHwgZG9jdW1lbnRSZWdpb25Db250ZXh0LmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkpIHsKLQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGNvbnRhaW5lZENoaWxkUmVnaW9uLmdldExlbmd0aCgpLCBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTMzNDYKLQkJCWlmIChmRW5hYmxlSlNQQWN0aW9uUGFydGl0aW9ucyAmJiBpc0FjdGlvbihzZFJlZ2lvbiwgb2Zmc2V0KSAmJiAhKGNvbnRhaW5lZENoaWxkUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJLy8gaWYgKGZFbmFibGVKU1BBY3Rpb25QYXJ0aXRpb25zICYmIGlzQWN0aW9uKHNkUmVnaW9uLAotCQkJCS8vIG9mZnNldCkpIHsKLQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGNvbnRhaW5lZENoaWxkUmVnaW9uLmdldExlbmd0aCgpLCBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEb2N1bWVudFJlZ2lvbkJhc2VkUGFydGl0aW9uKHNkUmVnaW9uLCBjb250YWluZWRDaGlsZFJlZ2lvbiwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcG9zc2libGVKc3BKYXZhQWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pzcEphdmFBY3Rpb25OYW1lKFN0cmluZyBwb3NzaWJsZUpzcEphdmFBY3Rpb24pIHsKLQkJcmV0dXJuIHBvc3NpYmxlSnNwSmF2YUFjdGlvbi5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVUKSB8fCBwb3NzaWJsZUpzcEphdmFBY3Rpb24uZXF1YWxzKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pIHx8IHBvc3NpYmxlSnNwSmF2YUFjdGlvbi5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSnNwQWN0aW9uUmVnaW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQkvLyB0cnVlIGZvciBhbnl0aGluZyB0aGF0IGNhbiBiZSB3aXRoaW4gPGpzcDpzY3JpcHRsZXQ+LAotCQkvLyA8anNwOmV4cHJlc3Npb24+LCA8anNwOmRlY2xhcmF0aW9uPgotCQlyZXR1cm4gdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTiB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQgfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AgaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCgpOwotCQlpbnN0YW5jZS5zZXRFbWJlZGRlZFBhcnRpdGlvbmVyKGNyZWF0ZVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoZlN0cnVjdHVyZWREb2N1bWVudCkpOwotCQlpbnN0YW5jZS5zZXRMYW5ndWFnZShmTGFuZ3VhZ2UpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW1iZWRkZWRQYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAcGFyYW0gZW1iZWRkZWRQYXJ0aXRpb25lcgotCSAqICAgICAgICAgICAgVGhlIGVtYmVkZGVkUGFydGl0aW9uZXIgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW1iZWRkZWRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBlbWJlZGRlZFBhcnRpdGlvbmVyKSB7Ci0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTA5Ci0JCS8qKgotCQkgKiBtYW5hZ2UgY29ubmVjdGVkIHN0YXRlIG9mIGVtYmVkZGVkIHBhcnRpdGlvbmVyCi0JCSAqLwotCQlpZiAoZkVtYmVkZGVkUGFydGl0aW9uZXIgIT0gbnVsbCAmJiBmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmRpc2Nvbm5lY3QoKTsKLQkJfQotCi0JCXRoaXMuZkVtYmVkZGVkUGFydGl0aW9uZXIgPSBlbWJlZGRlZFBhcnRpdGlvbmVyOwotCi0JCWlmIChmRW1iZWRkZWRQYXJ0aXRpb25lciAhPSBudWxsICYmIGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIuY29ubmVjdChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUGFydGl0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gY2FycnkgdGhpcyBzaW5nbGUgaW5zdGFuY2UgaWRlYSBmdXJ0aGVyIHRvIGJlCi0JCS8vIGNvbXBsZXRlLAotCQkvLyBidXQgaG9wZWZ1bGx5IHRoaXMgd2lsbCBiZSBsZXNzIGdhcmJhZ2UgdGhhbiBiZWZvcmUgKGVzcGVjaWFsbHkgZm9yCi0JCS8vIEhUTUwsIFhNTCwKLQkJLy8gbmF0dXJhbGx5ISkKLQkJaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2UgPSBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuY3JlYXRlUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCB0eXBlKTsKLQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhbmd1YWdlLgotCSAqIAotCSAqIEBwYXJhbSBsYW5ndWFnZQotCSAqICAgICAgICAgICAgVGhlIGxhbmd1YWdlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotCQl0aGlzLmZMYW5ndWFnZSA9IGxhbmd1YWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vblhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vblhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGIzMzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25YTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25YTUwgewotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcigpIHsKLQkJRG9jdW1lbnRCdWlsZGVyIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoYm9vbGVhbiB2YWxpZGF0aW5nKSB7Ci0JCURvY3VtZW50QnVpbGRlciByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBpbnN0YW5jZSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCWluc3RhbmNlLnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7Ci0JCQlpbnN0YW5jZS5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGZhbHNlKTsKLQkJCWluc3RhbmNlLnNldENvYWxlc2NpbmcodHJ1ZSk7Ci0JCQlyZXN1bHQgPSBpbnN0YW5jZS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShEb2N1bWVudCBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIG9zdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvY3VtZW50KTsKLQkJdHJ5IHsKLQkJCVRyYW5zZm9ybWVyIHNlcmlhbGl6ZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJ5IHsKLQkJCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi0xNiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB1bnN1cHBvcnRlZCBwcm9wZXJ0aWVzCi0JCQl9Ci0JCQlzZXJpYWxpemVyLnRyYW5zZm9ybShkb21Tb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3N0cmVhbSkpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5YzI4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuSmFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEFuIFhNTCBDcmVhdG9yL1JlYWRlci9Xcml0ZXIgdGhhdCAxKSBJZ25vcmVzIGFueSBEb2N1bWVudFR5cGUgTm9kZXMgZm91bmQKLSAqIHdpdGhpbiB0aGUgZG9jdW1lbnQgKGFzIHdlbGwgYXMgYW55IGVudGl0aWVzKSAyKSBJZ25vcmVzIGFueQotICogZXJyb3JzL2V4Y2VwdGlvbnMgZnJvbSBYZXJjZXMgd2hlbiBsb2FkaW5nIGEgZG9jdW1lbnQgMykgQ2FuIGxvYWQgRG9jdW1lbnRzCi0gKiBmcm9tIHdpdGhpbiBhIC5KQVIgZmlsZSAoKioqcmVhZC1vbmx5KioqKQotICovCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFByb3ZpZGVyIHsKLQlwcml2YXRlIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZCYXNlUmVmZXJlbmNlOwotCXByaXZhdGUgU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlZhbGlkYXRpbmcgPSBmYWxzZTsKLQlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBqYXJGaWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciByZXNvbHZlciA9IG51bGw7Ci0KLQlwcml2YXRlIE5vZGUgcm9vdEVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHJvb3RFbGVtZW50TmFtZSA9IG51bGw7Ci0KLQlwdWJsaWMgRG9jdW1lbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBfZ2V0RmlsZU5hbWUoKSB7Ci0JCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGlzSkFSKCkpIHsKLQkJCXJldHVybiBnZXRKYXJGaWxlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBnZXRGaWxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgX2dldFBhcnNlZERvY3VtZW50RE9NMigpIHsKLQkJRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGdldERvY3VtZW50QnVpbGRlcigpOwotCQkJLy8gRE9NUGFyc2VyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKLQkJCS8vIHBhcnNlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLAotCQkJLy8gZmFsc2UpOy8vJE5PTi1OTFMtMSQKLQkJCS8vIHBhcnNlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvbm9udmFsaWRhdGluZy9sb2FkLWR0ZC1ncmFtbWFyIiwKLQkJCS8vIGZhbHNlKTsvLyROT04tTkxTLTEkCi0JCQkvLyBwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKGdldE51bGxFcnJvckhhbmRsZXIoKSk7Ci0JCQkvLyBwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoZ2V0TnVsbEVudGl0eVJlc29sdmVyKCkpOwotCQkJLy8gaXMgPSBnZXRJbnB1dFN0cmVhbSgpOwotCQkJYnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihnZXRFbnRpdHlSZXNvbHZlcigpKTsKLQkJCWJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKGdldE51bGxFcnJvckhhbmRsZXIoKSk7Ci0JCQlpcyA9IGdldElucHV0U3RyZWFtKCk7Ci0JCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBidWlsZGVyLnBhcnNlKGlzLCBnZXRCYXNlUmVmZXJlbmNlKCkpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJLy8gcGFyc2luZyBleGNlcHRpb24sIG5vdGlmeSB0aGUgdXNlcj8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJTQVhFeGNlcHRpb24gd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yICIgKyBfZ2V0RmlsZU5hbWUoKSArICIgIiArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIE5PVCBhbiAiZXhjZXB0aW9uYWwgY2FzZSI7IGRvIG5vdCBMb2cKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIklPRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvciAiICsgX2dldEZpbGVOYW1lKCkgKyAiICIgKyBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyB3aGF0IGNhbiBiZSBkb25lPwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBmQmFzZVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIERvY3VtZW50Ci0JICovCi0JcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KGJvb2xlYW4gY3JlYXRlRW1wdHlPbkZhaWx1cmUpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlsb2FkKGNyZWF0ZUVtcHR5T25GYWlsdXJlKTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCURvY3VtZW50QnVpbGRlciBmRG9jdW1lbnRCdWlsZGVyID0gbnVsbDsKLQkKLQlwcml2YXRlIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB7Ci0JCWlmIChmRG9jdW1lbnRCdWlsZGVyID09IG51bGwpIHsKLQkJCWZEb2N1bWVudEJ1aWxkZXIgPSBDb21tb25YTUwuZ2V0RG9jdW1lbnRCdWlsZGVyKGlzVmFsaWRhdGluZygpKTsKLQkJfQotCQlyZXR1cm4gZkRvY3VtZW50QnVpbGRlcjsKLQl9Ci0KLQlwcml2YXRlIERPTUltcGxlbWVudGF0aW9uIGdldERvbUltcGxlbWVudGF0aW9uKCkgewotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJfQotCQljYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlMSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCX0KLQkJRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9IGJ1aWxkZXIuZ2V0RE9NSW1wbGVtZW50YXRpb24oKTsKLQkJcmV0dXJuIGltcGw7Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBUYWtlcyBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm0gImEvYi9jIiBhbmQgZW5zdXJlcyB0aGF0IHRoYXQKLQkgKiBzdHJ1Y3R1cmUgZXhpc3RzIGJlbG93IHRoZSBoZWFkIGVsZW1lbnQsIGRvd24gdGhyb3VnaCAnYycsIGFuZCByZXR1cm5zCi0JICogYSA8ZW0+c2luZ2xlPC9lbT4gZWxlbWVudCAnYycuIEZvciBtdWx0aXBsZSBlbGVtZW50cyAoc3VjaCBhcwotCSAqIG11bHRpcGxlICZsdDttYWNybyZndDsgZWxlbWVudHMgY29udGFpbmVkIHdpdGhpbiBhIHNpbmdsZQotCSAqICZsdDttYWNyb3MmZ3Q7IGVsZW1lbnQsIGZ1bGwgRE9NIGFjY2VzcyBpcyByZXF1aXJlZCBmb3Igc2VhcmNoaW5nIGFuZAotCSAqIGNoaWxkIGVsZW1lbnQgbWFuaXB1bGF0aW9uLgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudChTdHJpbmcgbmFtZSkgewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJbG9hZChmYWxzZSk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAoRWxlbWVudCkgZ2V0Tm9kZShnZXRSb290RWxlbWVudCgpLCBuYW1lKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gRW50aXR5UmVzb2x2ZXIgdGhhdCB3b24ndCB0cnkgdG8gbG9hZCBhbmQgcmVzb2x2ZSBBTlkKLQkgKiBlbnRpdGllcwotCSAqLwotCXByaXZhdGUgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQlyZXNvbHZlciA9IG5ldyBFbnRpdHlSZXNvbHZlcigpIHsKLQkJCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJCQlJbnB1dFNvdXJjZSByZXN1bHQgPSBudWxsOwotCQkJCQlpZiAoaXNWYWxpZGF0aW5nKCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJVVJMIHNwZWMgPSBuZXcgVVJMKCJmaWxlOi8vIiArIGdldEJhc2VSZWZlcmVuY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlVUkwgdXJsID0gbmV3IFVSTChzcGVjLCBzeXN0ZW1JRCk7Ci0JCQkJCQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkJCQkJcmVzdWx0ID0gbmV3IElucHV0U291cmNlKHN5c3RlbUlEICE9IG51bGwgPyBzeXN0ZW1JRCA6ICIvXyIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlyZXN1bHQuc2V0UHVibGljSWQocHVibGljSUQpOwotCQkJCQkJCQlyZXN1bHQuc2V0Qnl0ZVN0cmVhbShjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLQkJCQkJCXJlc3VsdC5zZXRQdWJsaWNJZChwdWJsaWNJRCk7Ci0JCQkJCQlyZXN1bHQuc2V0U3lzdGVtSWQoc3lzdGVtSUQgIT0gbnVsbCA/IHN5c3RlbUlEIDogIi9fIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW5kIGlucHV0IHN0cmVhbSB0byB1c2UgYXMgdGhlIHNvdXJjZSBvZiB0aGUgRG9jdW1lbnQgMSkgZnJvbQotCSAqIGFuIElucHV0U3RyZWFtIHNldCBvbiB0aGlzIGluc3RhbmNlIDIpIGZyb20gYSBKQVIgZmlsZSB3aXRoIHRoZSBnaXZlbgotCSAqIGVudHJ5IG5hbWUgMykgZnJvbSBhIG5vcm1hbCBmaWxlCi0JICogCi0JICogQHJldHVybiBJbnB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXJldHVybiBpbnB1dFN0cmVhbTsKLQkJZWxzZSBpZiAoaXNKQVIoKSkgewotCQkJcmV0dXJuIEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShnZXRKYXJGaWxlTmFtZSgpLCBnZXRGaWxlTmFtZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGdldEZpbGVOYW1lKCkpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmFyRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBqYXJGaWxlTmFtZTsKLQl9Ci0KLQlwcml2YXRlIE5vZGUgZ2V0TmFtZWRDaGlsZChOb2RlIHBhcmVudCwgU3RyaW5nIGNoaWxkTmFtZSkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU5vZGVMaXN0IGNoaWxkTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChjaGlsZExpc3QuaXRlbShpKS5nZXROb2RlTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKQotCQkJCXJldHVybiBjaGlsZExpc3QuaXRlbShpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGdldE5ld0RvY3VtZW50KCkgewotCQlEb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZ2V0RG9tSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudCgiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgZ2V0Um9vdEVsZW1lbnROYW1lKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHJlc3VsdC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlyZXN1bHQucmVtb3ZlQ2hpbGQoY2hpbGRyZW4uaXRlbShpKSk7Ci0JCQl9Ci0JCQkvLyB3ZSdyZSBnb2luZyB0aHJvdWdoIHRoaXMgZWZmb3J0IHRvIGF2b2lkIGEgTlMgZWxlbWVudAotCQkJRWxlbWVudCBzZXR0aW5ncyA9IHJlc3VsdC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsIGdldFJvb3RFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0LmFwcGVuZENoaWxkKHNldHRpbmdzKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogVGFrZXMgYSBzaW5nbGUgc3RyaW5nIG9mIHRoZSBmb3JtICJhL2IvYyIgYW5kIGVuc3VyZXMgdGhhdCB0aGF0Ci0JICogc3RydWN0dXJlIGV4aXN0cyBiZWxvdyB0aGUgaGVhZCBlbGVtZW50LCBkb3duIHRocm91Z2ggJ2MnLCBhbmQgcmV0dXJucwotCSAqIHRoZSBlbGVtZW50ICdjJy4KLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXByaXZhdGUgTm9kZSBnZXROb2RlKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmFtZSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdG9rZW4gPSBudWxsOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAoZ2V0TmFtZWRDaGlsZChub2RlLCB0b2tlbikgPT0gbnVsbCkKLQkJCQlub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodG9rZW4pKTsKLQkJCW5vZGUgPSBnZXROYW1lZENoaWxkKG5vZGUsIHRva2VuKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIEVycm9ySGFuZGxlciB0aGF0IHdpbGwgbm90IHN0b3AgdGhlIHBhcnNlciBvbiByZXBvcnRlZAotCSAqIGVycm9ycwotCSAqLwotCXByaXZhdGUgRXJyb3JIYW5kbGVyIGdldE51bGxFcnJvckhhbmRsZXIoKSB7Ci0JCWlmIChlcnJvckhhbmRsZXIgPT0gbnVsbCkgewotCQkJZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiU0FYUGFyc2VFeGNlcHRpb24gd2l0aCAiICsgZkJhc2VSZWZlcmVuY2UgKyAiLyIgKyBnZXRKYXJGaWxlTmFtZSgpICsgIi8iICsgZ2V0RmlsZU5hbWUoKSArICIgKGVycm9yKSB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWFBhcnNlRXhjZXB0aW9uIHdpdGggIiArIGZCYXNlUmVmZXJlbmNlICsgIi8iICsgZ2V0SmFyRmlsZU5hbWUoKSArICIvIiArIGdldEZpbGVOYW1lKCkgKyAiIChmYXRhbEVycm9yKSB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJTQVhQYXJzZUV4Y2VwdGlvbiB3aXRoICIgKyBmQmFzZVJlZmVyZW5jZSArICIvIiArIGdldEphckZpbGVOYW1lKCkgKyAiLyIgKyBnZXRGaWxlTmFtZSgpICsgIiAod2FybmluZykgd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZXJyb3JIYW5kbGVyOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgZ2V0UGFyc2VkRG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQlGaWxlIGV4aXN0ZW5jZVRlc3RlciA9IG51bGw7Ci0JCQlpZiAoaXNKQVIoKSkKLQkJCQlleGlzdGVuY2VUZXN0ZXIgPSBuZXcgRmlsZShnZXRKYXJGaWxlTmFtZSgpKTsKLQkJCWVsc2UKLQkJCQlleGlzdGVuY2VUZXN0ZXIgPSBuZXcgRmlsZShnZXRGaWxlTmFtZSgpKTsKLQkJCWlmICghZXhpc3RlbmNlVGVzdGVyLmV4aXN0cygpKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmVzdWx0ID0gX2dldFBhcnNlZERvY3VtZW50RE9NMigpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IEVsZW1lbnQgb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRSb290RWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldFJvb3RFbGVtZW50KGdldERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlL2Egcm9vdCBFbGVtZW50IGZvciB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByaXZhdGUgTm9kZSBnZXRSb290RWxlbWVudChEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCXRyeSB7Ci0JCQlFbGVtZW50IG5ld1Jvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoZ2V0Um9vdEVsZW1lbnROYW1lKCkpOwotCQkJZG9jLmFwcGVuZENoaWxkKG5ld1Jvb3RFbGVtZW50KTsKLQkJCXJldHVybiBuZXdSb290RWxlbWVudDsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Um9vdEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gcm9vdEVsZW1lbnROYW1lOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0pBUigpIHsKLQkJcmV0dXJuIGdldEphckZpbGVOYW1lKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW5nKCkgewotCQlyZXR1cm4gZlZhbGlkYXRpbmc7Ci0JfQotCi0Jdm9pZCBsb2FkKGJvb2xlYW4gY3JlYXRlRW1wdHlPbkZhaWx1cmUpIHsKLQkJLy8gcm9vdEVsZW1lbnROYW1lIGFuZCBmaWxlTmFtZSBhcmUgZXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCBhdCB0aGlzCi0JCS8vIHBvaW50Ci0JCWRvY3VtZW50ID0gZ2V0UGFyc2VkRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmIChyb290RWxlbWVudE5hbWUgIT0gbnVsbCkKLQkJCQlyb290RWxlbWVudCA9IGdldFJvb3RFbGVtZW50KGRvY3VtZW50KTsKLQkJCWVsc2UKLQkJCQlyb290RWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQl9Ci0KLQkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgcm9vdEVsZW1lbnQgPT0gbnVsbCkgewotCQkJaWYgKGNyZWF0ZUVtcHR5T25GYWlsdXJlKSB7Ci0JCQkJZG9jdW1lbnQgPSBnZXROZXdEb2N1bWVudCgpOwotCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlTmFtZSgpLmVxdWFscyhnZXRSb290RWxlbWVudE5hbWUoKSkpCi0JCQkJCQkJcm9vdEVsZW1lbnQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCQl9Ci0JCQkJCWlmIChyb290RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkJCXJvb3RFbGVtZW50ID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhc2VSZWZlcmVuY2UoU3RyaW5nIHN0cmluZykgewotCQlmQmFzZVJlZmVyZW5jZSA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3RmlsZU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld0ZpbGVOYW1lKSB7Ci0JCWZpbGVOYW1lID0gbmV3RmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5wdXRTdHJlYW0gZm9yIHdoaWNoIHRvIHByb3ZpZGUgYSBEb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXRTdHJlYW0KLQkgKiAgICAgICAgICAgIFRoZSBpbnB1dFN0cmVhbSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpU3RyZWFtKSB7Ci0JCXRoaXMuaW5wdXRTdHJlYW0gPSBpU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdKYXJGaWxlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphckZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3SmFyRmlsZU5hbWUpIHsKLQkJamFyRmlsZU5hbWUgPSBuZXdKYXJGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Um9vdEVsZW1lbnROYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9vdEVsZW1lbnROYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3Um9vdEVsZW1lbnROYW1lKSB7Ci0JCXJvb3RFbGVtZW50TmFtZSA9IG5ld1Jvb3RFbGVtZW50TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpbmcoYm9vbGVhbiBiKSB7Ci0JCWZWYWxpZGF0aW5nID0gYjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmZWE5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbnkgdXNlZCBNb2R1bGUgQ29yZSBhbmQgRmFjZXRzIEFQSXMgYWxvbmcgd2l0aAotICogZmFsbGJhY2tzIGZvciB1c2Ugb24gbm9uLWNvbXBsaWFudCBwcm9qZWN0cyBhbmQgd2hlbiB0aG9zZSBzZXJ2aWNlcyBhcmUgbm90Ci0gKiBhdmFpbGFibGUgYXQgcnVudGltZS4KLSAqIAotICogQmVjYXVzZSBNb2R1bGVDb3JlIEFQSSBjYWxscyBjYW4gcmVzdWx0IGluIGxvY2tzIG5lZWRpbmcgdG8gYmUgYWNxdWlyZWQsCi0gKiBub25lIG9mIHRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCB3aGlsZSBvdGhlciB0aHJlYWQgbG9ja3MgaGF2ZQotICogYWxyZWFkeSBiZWVuIGFjcXVpcmVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjZXRNb2R1bGVDb3JlU3VwcG9ydCB7Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2R1bXBfTkNERkUgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFdFQl9JTkZfUEFUSCA9IG5ldyBQYXRoKFdFQl9JTkYpOwotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBjb21wdXRlZCBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMsIGVpdGhlciBmcm9tIGZhY2V0IGtub3dsZWRnZSBvciBodWVyaXN0aWNzLCBvciBudWxsIGlmIG9uZSBjYW4gbm90IGJlIGRldGVybWluZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGNvbXB1dGVXZWJDb250ZW50Um9vdFBhdGgoSVBhdGggcGF0aCkgewotCQlJUGF0aCByb290ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJvb3QgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0V2ViQ29udGVudFJvb3RQYXRoKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpKTsKLQkJfQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotCQkJaWYgKF9kdW1wX05DREZFKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJaWYocm9vdCA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMzI0NQotCQkJICogCi0JCQkgKiBOUEUgaW4gSlNQVGFnbGliRGlyZWN0aXZlQ29udGVudEFzc2lzdFByb2Nlc3NvciB3aXRoCi0JCQkgKiBub24tZmFjZXRlZCBwcm9qZWN0Ci0JCQkgKi8KLQkJCXJvb3QgPSBnZXRMb2NhbFJvb3QocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIC0xIGlmIHRoZSBwcm9qZWN0IGRvZXMgbm90IGhhdmUgdGhlIEpTVCBXZWIgZmFjZXQsIHRoZSB2ZXJzaW9uCi0JICogICAgICAgICBudW1iZXIgb2YgaXQgb3RoZXJ3aXNlCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmxvYXQgZ2V0RHluYW1pY1dlYlByb2plY3RWZXJzaW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy8gSW4gdGhlIGFic2VuY2Ugb2YgYW55IGZhY2V0IGluZm9ybWF0aW9uLCBhc3N1bWUgdGhlIGhpZ2hlc3QgbGV2ZWwKLQkJZmxvYXQgdmVyc2lvbiA9IDIuNWY7Ci0JCXRyeSB7Ci0JCQl2ZXJzaW9uID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmdldER5bmFtaWNXZWJQcm9qZWN0VmVyc2lvbihwcm9qZWN0KTsKLQkJfQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotCQkJaWYgKF9kdW1wX05DREZFKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aCAtCi0JICogICAgICAgICAgICB0aGUgZnVsbCBwYXRoIHRvIGEgcmVzb3VyY2Ugd2l0aGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIC0gdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgaWYgb25lIGV4aXN0cywgbnVsbAotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSdW50aW1lUGF0aChJUGF0aCBwYXRoKSB7Ci0JCUlQYXRoIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0UnVudGltZVBhdGgocGF0aCk7Ci0JCX0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCWlmIChfZHVtcF9OQ0RGRSkKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJSVBhdGggcm9vdCA9IGdldExvY2FsUm9vdChwYXRoKTsKLQkJCXJlc3VsdCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290LnNlZ21lbnRDb3VudCgpKS5tYWtlQWJzb2x1dGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0R5bmFtaWNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXRyeSB7Ci0JCQlyZXR1cm4gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCk7Ci0JCX0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCWlmIChfZHVtcF9OQ0RGRSkKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aCAtCi0JICogICAgICAgICAgICB0aGUgZnVsbCBwYXRoIHRvIGEgcmVzb3VyY2Ugd2l0aGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gcmVmZXJlbmNlIC0KLQkgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2Ugc3RyaW5nIHRvIHJlc29sdmUKLQkgKiBAcmV0dXJuIC0gdGhlIGZ1bGwgcGF0aCB3aXRoaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gcmVmZXJlbmNlIGFjY29yZGluZyB0byB0aGUgdmlydHVhbCBwYXRoaW5nIHN1cHBvcnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIHJlc29sdmUoSVBhdGggYmFzZVBhdGgsIFN0cmluZyByZWZlcmVuY2UpIHsKLQkJSVBhdGggcmVzb2x2ZWRQYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc29sdmVkUGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5yZXNvbHZlKGJhc2VQYXRoLCByZWZlcmVuY2UpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCWlmIChyZXNvbHZlZFBhdGggPT0gbnVsbCkgewotCQkJSVBhdGggcm9vdFBhdGggPSBnZXRMb2NhbFJvb3QoYmFzZVBhdGgpOwotCQkJaWYgKHJlZmVyZW5jZS5zdGFydHNXaXRoKFBhdGguUk9PVC50b1N0cmluZygpKSkgewotCQkJCXJlc29sdmVkUGF0aCA9IHJvb3RQYXRoLmFwcGVuZChyZWZlcmVuY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzb2x2ZWRQYXRoID0gYmFzZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChyZWZlcmVuY2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc29sdmVkUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiBAcmV0dXJuIHRoZSBhcHBsaWNhYmxlIFdlYiBjb250ZXh0IHJvb3QgcGF0aCwgaWYgb25lIGV4aXN0cwotCSAqLwotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldExvY2FsUm9vdChJUGF0aCBiYXNlUGF0aCkgewotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQotCQkvLyBleGlzdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2VzIC0gdGhpcyBpcyB0aGUgOTMlIGNhc2UKLQkJSVJlc291cmNlIGZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihiYXNlUGF0aCk7Ci0KLQkJLy8gVHJ5IHRoZSBiYXNlIHBhdGggYXMgYSBmb2xkZXIgZmlyc3QKLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihiYXNlUGF0aCk7Ci0JCX0KLQkJLy8gSWYgbm90IGEgZm9sZGVyLCB0aGVuIHRyeSBiYXNlIHBhdGggYXMgYSBmaWxlCi0JCWlmIChmaWxlICE9IG51bGwgJiYgIWZpbGUuZXhpc3RzKCkgJiYgYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJfQotCi0JCWlmIChmaWxlID09IG51bGwgJiYgYmFzZVBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsKLQkJfQotCi0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTI5Ci0JCQkgKiAKLQkJCSAqIFRoaXMgbWV0aG9kIHByb2R1Y2VzIGEgbGVzcyBhY2N1cmF0ZSByZXN1bHQsIGJ1dCBkb2Vzbid0Ci0JCQkgKiByZXF1aXJlIHRoYXQgdGhlIGZpbGUgZXhpc3QgeWV0LgotCQkJICovCi0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihiYXNlUGF0aCk7Ci0JCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkKLQkJCQlmaWxlID0gZmlsZXNbMF07Ci0JCX0KLQotCQl3aGlsZSAoZmlsZSAhPSBudWxsKSB7Ci0JCQkvKioKLQkJCSAqIFRyZWF0IGFueSBwYXJlbnQgZm9sZGVyIHdpdGggYSBXRUItSU5GIHN1YmZvbGRlciBhcyBhIHdlYi1hcHAKLQkJCSAqIHJvb3QKLQkJCSAqLwotCQkJSUNvbnRhaW5lciBmb2xkZXIgPSBudWxsOwotCQkJaWYgKChmaWxlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApIHsKLQkJCQlmb2xkZXIgPSAoSUNvbnRhaW5lcikgZmlsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvbGRlciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQkvLyBnZXRGb2xkZXIgb24gYSB3b3Jrc3BhY2Ugcm9vdCBtdXN0IHVzZSBhIGZ1bGwgcGF0aCwgc2tpcAotCQkJaWYgKGZvbGRlciAhPSBudWxsICYmIChmb2xkZXIuZ2V0VHlwZSgpICYgSVJlc291cmNlLlJPT1QpID09IDApIHsKLQkJCQlJRm9sZGVyIHdlYmluZiA9IGZvbGRlci5nZXRGb2xkZXIoV0VCX0lORl9QQVRIKTsKLQkJCQlpZiAod2ViaW5mICE9IG51bGwgJiYgd2ViaW5mLmV4aXN0cygpKSB7Ci0JCQkJCXJldHVybiBmb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaWxlID0gZmlsZS5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCXJldHVybiBiYXNlUGF0aC51cHRvU2VnbWVudCgxKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjdlMjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogV3JhcHBlciBjbGFzcyBmb3IgYWxsIEZhY2V0LXJlbGF0ZWQgY2FsbHMuIElmIHRoZSBGYWNldCBvciBNb2R1bGVDb3JlCi0gKiBidW5kbGVzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGlzIGNsYXNzIHdpbGwgbm90IGxvYWQsIG9yIGlmIGl0IGRvZXMsIGl0cwotICogbWV0aG9kcyB3aWxsIGNhdXNlIE5vQ2xhc3NEZWZGb3VuZEVycm9ycy4gVGhpcyBhbGxvd3MgdXMgdG8KLSAqIGNvbXBhcnRtZW50YWxpemUgdGhlIGRlcGVuZGVuY2llcy4KLSAqIAotICovCi1maW5hbCBjbGFzcyBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFTSCA9ICIvIjsKLQotCS8qKgotCSAqIENvcGllZCB0byBhdm9pZCB1bm5lZWRlZCBleHRyYSBkZXBlbmRlbmN5IChwbHVzIGl0J3MgdW5jbGVhciB3aHkgdGhlCi0JICogdmFsdWUgaXMgaW4gdGhhdCBwbHVnLWluKS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNUX1dFQl9NT0RVTEUgPSAianN0LndlYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiAtMSBpZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBoYXZlIHRoZSBKU1QgV2ViIGZhY2V0LCB0aGUgdmVyc2lvbgotCSAqICAgICAgICAgbnVtYmVyIG9mIGl0IG90aGVyd2lzZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXN0YXRpYyBmbG9hdCBnZXREeW5hbWljV2ViUHJvamVjdFZlcnNpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIDIuNWY7Ci0KLQkJLy8gSW4gdGhlIGFic2VuY2Ugb2YgYW55IGZhY2V0IGluZm9ybWF0aW9uLCBhc3N1bWUgdGhlIGhpZ2hlc3QgbGV2ZWwKLQkJZmxvYXQgdmVyc2lvbiA9IDIuNWY7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChmYWNldGVkICE9IG51bGwgJiYgUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKEpTVF9XRUJfTU9EVUxFKSkgewotCQkJCUlQcm9qZWN0RmFjZXQgd2ViTW9kdWxlRmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSlNUX1dFQl9NT0RVTEUpOwotCQkJCWlmIChmYWNldGVkLmhhc1Byb2plY3RGYWNldCh3ZWJNb2R1bGVGYWNldCkpIHsKLQkJCQkJdmVyc2lvbiA9IEZsb2F0LnBhcnNlRmxvYXQoZmFjZXRlZC5nZXRJbnN0YWxsZWRWZXJzaW9uKHdlYk1vZHVsZUZhY2V0KS5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aCAtCi0JICogICAgICAgICAgICB0aGUgZnVsbCBwYXRoIHRvIGEgcmVzb3VyY2Ugd2l0aGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIC0gdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgaWYgb25lIGV4aXN0cywgbnVsbAotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0Jc3RhdGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKElQYXRoIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC5zZWdtZW50KDApKTsKLQotCQlpZiAoIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKSk7Ci0JCWlmICh2aXJ0dWFsUmVzb3VyY2VzICE9IG51bGwgJiYgdmlydHVhbFJlc291cmNlcy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gdmlydHVhbFJlc291cmNlc1swXS5nZXRSdW50aW1lUGF0aCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgSVBhdGggdG8gdGhlICJyb290IiBvZiB0aGUgd2ViIGNvbnRlbnRzCi0JICovCi0Jc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCAmJiBjb21wb25lbnQuZXhpc3RzKCkpIHsKLQkJCXBhdGggPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzRHluYW1pY1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJdHJ5IHsKLQkJCWlmIChQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoSlNUX1dFQl9NT0RVTEUpKSB7Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQkJSVByb2plY3RGYWNldCB3ZWJNb2R1bGVGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChKU1RfV0VCX01PRFVMRSk7Ci0JCQkJaWYgKGZhY2V0ZWQgIT0gbnVsbCAmJiBmYWNldGVkLmhhc1Byb2plY3RGYWNldCh3ZWJNb2R1bGVGYWNldCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aCAtCi0JICogICAgICAgICAgICB0aGUgZnVsbCBwYXRoIHRvIGEgcmVzb3VyY2Ugd2l0aGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gcmVmZXJlbmNlIC0KLQkgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2Ugc3RyaW5nIHRvIHJlc29sdmUKLQkgKiBAcmV0dXJuIC0gdGhlIGZ1bGwgcGF0aCB3aXRoaW4gdGhlIHdvcmtzcGFjZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQotCSAqICAgICAgICAgZ2l2ZW4gcmVmZXJlbmNlIGFjY29yZGluZyB0byB0aGUgdmlydHVhbCBwYXRoaW5nIHN1cHBvcnQKLQkgKi8KLQlzdGF0aWMgSVBhdGggcmVzb2x2ZShJUGF0aCBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSkgewotCQlpZiAocmVmZXJlbmNlID09IG51bGwgfHwgYmFzZVBhdGggPT0gbnVsbCB8fCBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsKLQotCQlpZiAoIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlJRmlsZSBiYXNlRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGJhc2VGaWxlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlydHVhbFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCUlQYXRoIGJhc2VSdW50aW1lUGF0aCA9IHZpcnR1YWxSZXNvdXJjZXNbaV0uZ2V0UnVudGltZVBhdGgoKTsKLQkJCQlJUGF0aCByZWZlcmVuY2VSdW50aW1lUGF0aCA9IG51bGw7Ci0JCQkJaWYgKHJlZmVyZW5jZS5zdGFydHNXaXRoKFNMQVNIKSkgewotCQkJCQlyZWZlcmVuY2VSdW50aW1lUGF0aCA9IG5ldyBQYXRoKHJlZmVyZW5jZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZWZlcmVuY2VSdW50aW1lUGF0aCA9IGJhc2VSdW50aW1lUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKHJlZmVyZW5jZSk7Ci0JCQkJfQotCQkJCUlWaXJ0dWFsRmlsZSB2aXJ0dWFsRmlsZSA9IENvbXBvbmVudENvcmUuY3JlYXRlRmlsZShwcm9qZWN0LCByZWZlcmVuY2VSdW50aW1lUGF0aCk7Ci0JCQkJaWYgKHZpcnR1YWxGaWxlICE9IG51bGwgJiYgdmlydHVhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJSUZpbGVbXSB1bmRlcmx5aW5nRmlsZXMgPSB2aXJ0dWFsRmlsZS5nZXRVbmRlcmx5aW5nRmlsZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB1bmRlcmx5aW5nRmlsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmICh1bmRlcmx5aW5nRmlsZXNbal0uZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSAmJiB1bmRlcmx5aW5nRmlsZXNbal0uZXhpc3RzKCkpIHsKLQkJCQkJCQlyZXR1cm4gdW5kZXJseWluZ0ZpbGVzW2pdLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUlWaXJ0dWFsRmlsZSB2aXJ0dWFsRmlsZSA9IENvbXBvbmVudENvcmUuY3JlYXRlRmlsZShwcm9qZWN0LCBuZXcgUGF0aChyZWZlcmVuY2UpKTsKLQkJCWlmICh2aXJ0dWFsRmlsZSAhPSBudWxsICYmIHZpcnR1YWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHZpcnR1YWxGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRmlsZUNvbnRlbnRDYWNoZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0ZpbGVDb250ZW50Q2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyNDNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRmlsZUNvbnRlbnRDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkxvY2F0aW9uS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotCi1wdWJsaWMgY2xhc3MgRmlsZUNvbnRlbnRDYWNoZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FjaGVFbnRyeSB7Ci0JCVN0cmluZyBjb250ZW50czsKLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQlJUGF0aCBwYXRoOwotCi0JCUNhY2hlRW50cnkoSVBhdGggcGF0aCkgewotCQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJCW1vZGlmaWNhdGlvblN0YW1wID0gZ2V0TW9kaWZpY2F0aW9uU3RhbXAocGF0aCk7Ci0JCQljb250ZW50cyA9IHJlYWRDb250ZW50cyhwYXRoKTsKLQkJfQotCi0JCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShJUGF0aCBwYXRoKSB7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlib29sZWFuIGlzU3RhbGUoKSB7Ci0JCQlpZiAobW9kaWZpY2F0aW9uU3RhbXAgPT0gSVJlc291cmNlLk5VTExfU1RBTVApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWxvbmcgbmV3U3RhbXAgPSBnZXRNb2RpZmljYXRpb25TdGFtcChwYXRoKTsKLQkJCXJldHVybiBuZXdTdGFtcCA+IG1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZGV0ZWN0Q2hhcnNldChJRmlsZSBmaWxlKSB7Ci0JCQlpZiAoZmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gb3B0aW1pemVkIGRlc2NyaXB0aW9uIGxvb2t1cCwgbWlnaHQgbm90IHN1Y2NlZWQKLQkJCQkJZCA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZC5nZXRDaGFyc2V0KCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBnaXZlbiB0aGUgYWNjZXNzaWJsZSBhbmQgZmlsZQotCQkJCQkvLyB0eXBlCi0JCQkJCS8vIGNoZWNrIGFib3ZlCi0JCQkJfQotCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQljb250ZW50cyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKGNvbnRlbnRzLCBmaWxlLmdldE5hbWUoKSwgbmV3IFF1YWxpZmllZE5hbWVbXXtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVR9KTsKLQkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBkZXNjcmlwdGlvbi5nZXRDaGFyc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gd2lsbCB0cnkgdG8gY2xlYW51cCBpbiBmaW5hbGx5Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBub3Qgc3VyZSBob3cgdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JCX0KLQotCQlwcml2YXRlIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoSVBhdGggZmlsZVBhdGgpIHsKLQkJCUlGaWxlIGYgPSBnZXRGaWxlKGZpbGVQYXRoKTsKLQkJCWlmIChmICE9IG51bGwgJiYgZi5pc0FjY2Vzc2libGUoKSkgewotCQkJCXJldHVybiBmLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQl9Ci0JCQlGaWxlIGZpbGUgPSBmaWxlUGF0aC50b0ZpbGUoKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCXJldHVybiBmaWxlLmxhc3RNb2RpZmllZCgpOwotCQkJcmV0dXJuIElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgcmVhZENvbnRlbnRzKElQYXRoIGZpbGVQYXRoKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWFkQ29udGVudHM6IiArIGZpbGVQYXRoKTsKLQkJCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlJRmlsZSBmID0gZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQkJaWYgKGYgIT0gbnVsbCAmJiBmLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCVN0cmluZyBjaGFyc2V0ID0gZGV0ZWN0Q2hhcnNldChmKTsKLQkJCQkJaXMgPSBmLmdldENvbnRlbnRzKCk7Ci0JCQkJCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIGNoYXJzZXQpOwotCQkJCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyWzIwNDhdOwotCQkJCQlpbnQgbiA9IHJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCQl3aGlsZSAobiA+IDApIHsKLQkJCQkJCXMuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCQkJbiA9IHJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXMgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmNvbm5lY3QoZmlsZVBhdGgsIExvY2F0aW9uS2luZC5MT0NBVElPTiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5nZXRUZXh0RmlsZUJ1ZmZlcihmaWxlUGF0aCwgTG9jYXRpb25LaW5kLkxPQ0FUSU9OKTsKLQkJCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQkJCQlzLmFwcGVuZChidWZmZXIuZ2V0RG9jdW1lbnQoKS5nZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkuZGlzY29ubmVjdChmaWxlUGF0aCwgTG9jYXRpb25LaW5kLkxPQ0FUSU9OLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQkJfQotCi0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCXN0YXRpYyBGaWxlQ29udGVudENhY2hlIGluc3RhbmNlID0gbmV3IEZpbGVDb250ZW50Q2FjaGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgRmlsZUNvbnRlbnRDYWNoZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaE1hcCBmQ29udGVudE1hcDsKLQotCXByaXZhdGUgRmlsZUNvbnRlbnRDYWNoZSgpIHsKLQkJc3VwZXIoKTsKLQkJZkNvbnRlbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbnVwKCkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZDb250ZW50TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbCAmJiAoKFJlZmVyZW5jZSkgZW50cnkuZ2V0VmFsdWUoKSkuZ2V0KCkgPT0gbnVsbCkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50cyhJUGF0aCBmaWxlUGF0aCkgewotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImdldENvbnRlbnRzOiIgKyBmaWxlUGF0aCk7Ci0JCUNhY2hlRW50cnkgZW50cnkgPSBudWxsOwotCQlPYmplY3QgbyA9IGZDb250ZW50TWFwLmdldChmaWxlUGF0aCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7Ci0JCQllbnRyeSA9IChDYWNoZUVudHJ5KSAoKFJlZmVyZW5jZSkgbykuZ2V0KCk7Ci0JCX0KLQkJaWYgKGVudHJ5ID09IG51bGwgfHwgZW50cnkuaXNTdGFsZSgpKSB7Ci0JCQlpZiAoREVCVUcgJiYgZW50cnkgIT0gbnVsbCAmJiBlbnRyeS5pc1N0YWxlKCkpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdGFsZSBjb250ZW50czoiICsgZmlsZVBhdGgpOwotCQkJZW50cnkgPSBuZXcgQ2FjaGVFbnRyeShmaWxlUGF0aCk7Ci0JCQlmQ29udGVudE1hcC5wdXQoZmlsZVBhdGgsIG5ldyBTb2Z0UmVmZXJlbmNlKGVudHJ5KSk7Ci0JCX0KLQkJY2xlYW51cCgpOwotCQlyZXR1cm4gZW50cnkuY29udGVudHM7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9aZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvWmVyb1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzcyNDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9aZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci0KLQotcHVibGljIGNsYXNzIFplcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZlBhcmVudERvY3VtZW50OwotCi0JLyoqCi0JICovCi0JcHVibGljIFplcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZQYXJlbnREb2N1bWVudCA9IGRvY3VtZW50OwotCQlvZmZzZXQgPSBzdGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IGkpIHsKLQkJcmV0dXJuIG9mZnNldCA8PSBpICYmIGkgPCBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChJVGV4dFJlZ2lvbiByZWdpb24sIGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldERlZXBlc3RSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBvZmZzZXQgKyBsZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCXJldHVybiBnZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXJldHVybiBnZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChTdHJpbmcgY29udGV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHQoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmUGFyZW50RG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UHJldmlvdXMoKSB7Ci0JCXJldHVybiBudWxsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIG51bGw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChTdHJpbmcgY29udGV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFRleHRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIHRleHQgbGVuZ3RoIGlzIGVxdWFsIHRvIGxlbmd0aCBpZiB0aGVyZSBpcyBubyB3aGl0ZSBzcGFjZSBhdCB0aGUKLQkgKiBlbmQgb2YgYSByZWdpb24uIE90aGVyd2lzZSBpdCBpcyBzbWFsbGVyIHRoYW4gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldExlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICJaZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlbGV0ZWQoYm9vbGVhbiBkZWxldGVkKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5kZWQoYm9vbGVhbiBoYXNFbmQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBoYWQgdG8gbWFrZSBwdWJsaWMsIGR1ZSB0byBBUEkgdHJhbnNpdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkgewotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXZpb3VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3UHJldmlvdXMpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWdpb25zKElUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZFJlZ2lvbnMpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgbmV3U3RhcnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUsIFN0cmluZyBjaGFuZ2VzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRnJhZ21lbnRWYWxpZGF0aW9uVG9vbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9GcmFnbWVudFZhbGlkYXRpb25Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E5NWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9GcmFnbWVudFZhbGlkYXRpb25Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7DQotDQotDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyBmb3IgcmVhZGluZyBmcmFnbWVudCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzL3Byb3BlcnRpZXMuDQotICogSlNQRkNvbnRlbnRQcm9wZXJ0aWVzIGRvZXMgbm90IHJlc3BlY3QgdGhlIHByb2plY3Qgb3ZlcnJpZGUgcHJlZmVyZW5jZS4NCi0gKiANCi0gKi8NCi1jbGFzcyBGcmFnbWVudFZhbGlkYXRpb25Ub29scyB7DQotCS8qKg0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICogQHJldHVybiB3aGV0aGVyIHRvIHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBhIGZyYWdtZW50LCByZXR1cm5pbmcgdGhlDQotCSAqICAgICAgICAgcHJvamVjdC1zcGVjaWZpYyBwcmVmZXJlbmNlIG9ubHkgb2YgcHJvamVjdC1zcGVjaWZpYyB2YWx1ZXMgYXJlDQotCSAqICAgICAgICAgZW5hYmxlZA0KLQkgKi8NCi0Jc3RhdGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVGcmFnbWVudChJUmVzb3VyY2UgcmVzb3VyY2UpIHsNCi0JCVN0cmluZyBxdWFsaWZpZXIgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsNCi0NCi0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOw0KLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgew0KLQkJCXByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsNCi0JCX0NCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsNCi0JCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLmdldE5vZGUocXVhbGlmaWVyKTsNCi0JCQkvLyBmaXJzdCwgY2hlY2sgd2hldGhlciBwcm9qZWN0IHNwZWNpZmljIHNldHRpbmdzIGFyZSB0byBiZSB1c2VkDQotCQkJYm9vbGVhbiB1c2VQcm9qZWN0U2V0dGluZ3MgPSBub2RlLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1VTRV9QUk9KRUNUX1NFVFRJTkdTLCBmYWxzZSk7DQotCQkJaWYgKHVzZVByb2plY3RTZXR0aW5ncykgew0KLQkJCQkvLyBvbmx5IGlmIHNvLCByZXR1cm4gdGhhdCB2YWx1ZQ0KLQkJCQlyZXR1cm4gbm9kZS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTLCB0cnVlKTsNCi0JCQl9DQotCQkJLy8gaWYgbm90LCByZXR1cm4gdGhlIHdvcmtzcGFjZSB2YWx1ZQ0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBJbnN0YW5jZVNjb3BlKCkuZ2V0Tm9kZShxdWFsaWZpZXIpLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFURV9GUkFHTUVOVFMsIHRydWUpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzc3YzExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuRXJyb3JJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKgotICogQ29waWVkIGZyb20gaHRtbC51aSdzIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgd2l0aCBzb21lIG1pbm9yIGNsZWFudXAKLSAqIG1vZGlmaWNhdGlvbnMKLSAqLwotY2xhc3MgSFRNTFZhbGlkYXRpb25SZXBvcnRlciBpbXBsZW1lbnRzIFZhbGlkYXRpb25SZXBvcnRlciB7Ci0KLQlwcml2YXRlIElWYWxpZGF0b3Igb3duZXIgPSBudWxsOwotCXByaXZhdGUgSVJlcG9ydGVyIHJlcG9ydGVyID0gbnVsbDsKLQlwcml2YXRlIElGaWxlIGZpbGUgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBNZXNzYWdlRmFjdG9yeSBmRmFjdG9yeSA9IG51bGw7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIoSVZhbGlkYXRvciBvd25lciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCWZGYWN0b3J5ID0gbmV3IE1lc3NhZ2VGYWN0b3J5KGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLmZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCi0JCWlmICh0aGlzLnJlcG9ydGVyICE9IG51bGwpIHsKLQkJCXRoaXMucmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcy5vd25lciwgdGhpcy5maWxlKTsKLQkJfQotCX0KLQotCi0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsIHx8IHRoaXMuZmlsZSA9PSBudWxsIHx8IG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpCi0JCQlyZXR1cm47Ci0JCUlNZXNzYWdlIG1lcyA9IHRyYW5zbGF0ZU1lc3NhZ2UobWVzc2FnZSk7Ci0KLQkJaWYgKHRoaXMucmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMub3duZXIsIG1lcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGUgVmFsaWRhdGlvbk1lc3NhZ2UgdG8gSU1lc3NhZ2UgYW5kIGdlbmVyYXRlIHJlc3VsdCBsb2cKLQkgKi8KLQlwcml2YXRlIElNZXNzYWdlIHRyYW5zbGF0ZU1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSkgewotCQlpbnQgc2V2ZXJpdHkgPSBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0JCXN3aXRjaCAobWVzc2FnZS5nZXRTZXZlcml0eSgpKSB7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JTkZPUk1BVElPTiA6Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCUlNZXNzYWdlIG1lcyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlLmdldE1lc3NhZ2UoKSwgdGhpcy5maWxlKTsKLQkJbWVzLnNldE9mZnNldChtZXNzYWdlLmdldE9mZnNldCgpKTsKLQkJbWVzLnNldExlbmd0aChtZXNzYWdlLmdldExlbmd0aCgpKTsKLQkJaWYgKHRoaXMubW9kZWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBmbGF0TW9kZWwgPSB0aGlzLm1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGZsYXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaW50IGxpbmUgPSBmbGF0TW9kZWwuZ2V0TGluZU9mT2Zmc2V0KG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQkJCW1lcy5zZXRMaW5lTm8obGluZSArIDEpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBvcnQoRXJyb3JJbmZvIGluZm8pIHsKLQkJcmVwb3J0KGZGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoaW5mbykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BBY3Rpb25WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BBY3Rpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3NjU3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQWN0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UYWdsaWJUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQ2hlY2tzIGZvcjogbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzICYgdW5kZWZpbmVkIGF0dHJpYnV0ZXMgaW4ganNwCi0gKiBhY3Rpb24gdGFncyBzdWNoIGFzIGpzcCBkaXJlY3RpdmVzIGFuZCBqc3AgY3VzdG9tIHRhZ3MgYXMgd2VsbCBhcyBub24tZW1wdHkKLSAqIGlubGluZSBqc3AgYWN0aW9uIHRhZ3MKLSAqLwotcHVibGljIGNsYXNzIEpTUEFjdGlvblZhbGlkYXRvciBleHRlbmRzIEpTUFZhbGlkYXRvciB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQlwcml2YXRlIElWYWxpZGF0b3IgZk1lc3NhZ2VPcmlnaW5hdG9yOwotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQlwcml2YXRlIElTY29wZUNvbnRleHRbXSBmU2NvcGVzID0gbnVsbDsKLQlwcml2YXRlIGludCBmU2V2ZXJpdHlNaXNzaW5nUmVxdWlyZWRBdHRyaWJ1dGUgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IGZTZXZlcml0eU5vbkVtcHR5SW5saW5lVGFnID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IGZTZXZlcml0eVVua25vd25BdHRyaWJ1dGUgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0KLQlwcml2YXRlIEhhc2hTZXQgZlRhZ2xpYlByZWZpeGVzID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBKU1BBY3Rpb25WYWxpZGF0b3IoKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgSlNQQWN0aW9uVmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja05vbkVtcHR5SW5saW5lVGFnKElET01FbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudERlY2wsIElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoY21FbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZICYmIGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQQWN0aW9uVmFsaWRhdG9yXzAsIGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlOb25FbXB0eUlubGluZVRhZywgbXNnVGV4dCwgZmlsZSk7Ci0JCQlpbnQgc3RhcnQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gZWxlbWVudC5nZXRTdGFydEVuZE9mZnNldCgpIC0gc3RhcnQ7Ci0JCQlpbnQgbGluZU5vID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZEF0dHJpYnV0ZXMoSURPTUVsZW1lbnQgZWxlbWVudCwgQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gYXR0ck1hcC5pdGVyYXRvcigpOwotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhdHRyID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCUF0dHIgYSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyLmdldEF0dHJOYW1lKCkpOwotCQkJCWlmIChhID09IG51bGwpIHsKLQkJCQkJLy8gQXR0cmlidXRlIG1heSBiZSBkZWZpbmVkIHVzaW5nIGEganNwOmF0dHJpYnV0ZSBhY3Rpb24KLQkJCQkJaWYgKCFjaGVja0pTUEF0dHJpYnV0ZUFjdGlvbihlbGVtZW50LCBhdHRyKSkgewotCQkJCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzUsIGF0dHIuZ2V0QXR0ck5hbWUoKSk7Ci0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlNaXNzaW5nUmVxdWlyZWRBdHRyaWJ1dGUsIG1zZ1RleHQsIGZpbGUpOwotCQkJCQkJaW50IHN0YXJ0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJaW50IGxlbmd0aCA9IGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKSAtIHN0YXJ0OwotCQkJCQkJaW50IGxpbmVObyA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkKLQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgZm9yIGpzcDphdHRyaWJ1dGUgYWN0aW9ucyBvZiA8Y29kZT5lbGVtZW50PC9jb2RlPiB0byBzZWUgaWYgdGhleQotCSAqIHNhdGlzZnkgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSA8Y29kZT5hdHRyPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHdpdGggYSByZXF1aXJlZCBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gYXR0ciBUaGUgcmVxdWlyZWQgYXR0cmlidXRlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGpzcDphdHRyaWJ1dGUgYWN0aW9uIGhhcyB0aGUgbmFtZSBvZgotCSAqIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUgPGNvZGU+YXR0cjwvY29kZT47IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrSlNQQXR0cmlidXRlQWN0aW9uKElET01FbGVtZW50IGVsZW1lbnQsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikgewotCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGF0dHIgIT0gbnVsbCkgewotCQkJTm9kZUxpc3QgZWxlbWVudHMgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJqc3A6YXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuZWVkZWRBdHRyTmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gKEVsZW1lbnQpIGVsZW1lbnRzLml0ZW0oaSk7Ci0JCQkJLyoKLQkJCQkgKiBHZXQgdGhlIG5hbWUgYXR0cmlidXRlIG9mIGpzcDphdHRyaWJ1dGUgYW5kIGNvbXBhcmUgaXRzCi0JCQkJICogdmFsdWUgdG8gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBuYW1lCi0JCQkJICovCi0JCQkJaWYgKG5lZWRlZEF0dHJOYW1lLmVxdWFscyhjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja1Vua25vd25BdHRyaWJ1dGVzKElET01FbGVtZW50IGVsZW1lbnQsIENNTmFtZWROb2RlTWFwIGNtQXR0cnMsIElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbikgewotCQlib29sZWFuIGZvdW5kanNwYXR0cmlidXRlID0gZmFsc2U7Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJQXR0ciBhID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkZWMgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21BdHRycy5nZXROYW1lZEl0ZW0oYS5nZXROYW1lKCkpOwotCQkJaWYgKGFkZWMgPT0gbnVsbCkgewotCQkJCS8vIE5vIGF0dHIgZGVjbGFyYXRpb24gd2FzIGZvdW5kLiBUaGF0IGlzLCB0aGUgYXR0ciBuYW1lIGlzCi0JCQkJLy8gdW5kZWZpbmVkLgotCQkJCS8vIGJ1dCBub3QgcmVnYXJkIGl0IGFzIHVuZGVmaW5lZCBuYW1lIGlmIGl0IGluY2x1ZGVzIEpTUAotCQkJCWlmICghaGFzSlNQUmVnaW9uKCgoSURPTU5vZGUpIGEpLmdldE5hbWVSZWdpb24oKSkgJiYgZlNldmVyaXR5VW5rbm93bkF0dHJpYnV0ZSAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzYsIGEuZ2V0TmFtZSgpKTsKLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5VW5rbm93bkF0dHJpYnV0ZSwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJCWludCBzdGFydCA9ICgoSURPTUF0dHIpIGEpLmdldE5hbWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gKChJRE9NQXR0cikgYSkuZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpIC0gc3RhcnQ7Ci0JCQkJCWludCBsaW5lTm8gPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZm91bmRqc3BhdHRyaWJ1dGUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmRqc3BhdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7Ci0JCWZUYWdsaWJQcmVmaXhlcy5jbGVhcigpOwotCX0KLQotCWludCBnZXRNZXNzYWdlU2V2ZXJpdHkoU3RyaW5nIGtleSkgewotCQlpbnQgc2V2ID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRJbnQoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUiwga2V5LCBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIGZTY29wZXMpOwotCQlzd2l0Y2ggKHNldikgewotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUiA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgOgotCQkJCXJldHVybiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklORk9STUFUSU9OIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUgOgotCQkJCXJldHVybiBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkU7Ci0JCX0KLQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdGFydFRhZ05hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIpIHsKLQkJU3RyaW5nIG5hbWUgPSBuZXcgU3RyaW5nKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBzdWJSZWdpb25zID0gc2RyLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHN1YlJlZ2lvbnMuc2l6ZSgpID4gMikgewotCQkJSVRleHRSZWdpb24gc3ViUmVnaW9uID0gc3ViUmVnaW9ucy5nZXQoMCk7Ci0JCQlpZiAoc3ViUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCXN1YlJlZ2lvbiA9IHN1YlJlZ2lvbnMuZ2V0KDEpOwotCQkJCWlmIChzdWJSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCW5hbWUgPSBzZHIuZ2V0VGV4dChzdWJSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hTZXQgZ2V0VGFnbGliUHJlZml4ZXMoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZlRhZ2xpYlByZWZpeGVzLmlzRW1wdHkoKSkgewotCQkJLy8gYWRkIGFsbCByZXNlcnZlZCBwcmVmaXhlcwotCQkJZlRhZ2xpYlByZWZpeGVzLmFkZCgianNwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZUYWdsaWJQcmVmaXhlcy5hZGQoImpzcHgiKTsgLy8kTk9OLU5MUy0xJAotCQkJZlRhZ2xpYlByZWZpeGVzLmFkZCgiamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCQlmVGFnbGliUHJlZml4ZXMuYWRkKCJqYXZheCIpOyAvLyROT04tTkxTLTEkIAotCQkJZlRhZ2xpYlByZWZpeGVzLmFkZCgic2VydmxldCIpOyAvLyROT04tTkxTLTEkIAotCQkJZlRhZ2xpYlByZWZpeGVzLmFkZCgic3VuIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlmVGFnbGliUHJlZml4ZXMuYWRkKCJzdW53Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gYWRkIGFsbCB0YWdsaWIgcHJlZml4ZXMKLQkJCVRMRENNRG9jdW1lbnRNYW5hZ2VyIG1hbmFnZXIgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKGRvY3VtZW50KTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlMaXN0IHRyYWNrZXJzID0gbWFuYWdlci5nZXRUYWdsaWJUcmFja2VycygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSB0cmFja2Vycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhZ2xpYlRyYWNrZXIgdHJhY2tlciA9IChUYWdsaWJUcmFja2VyKSBpdC5uZXh0KCk7Ci0JCQkJCVN0cmluZyBwcmVmaXggPSB0cmFja2VyLmdldFByZWZpeCgpOwotCQkJCQlmVGFnbGliUHJlZml4ZXMuYWRkKHByZWZpeCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmVGFnbGliUHJlZml4ZXM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0pTUFJlZ2lvbihJVGV4dFJlZ2lvbiBjb250YWluZXIpIHsKLQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGNvbnRhaW5lcikuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCAoaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkVGFnTmFtZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlcyhJRmlsZSBmaWxlKSB7Ci0JCWZTY29wZXMgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0KLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCVByb2plY3RTY29wZSBwcm9qZWN0U2NvcGUgPSBuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChwcm9qZWN0U2NvcGUuZ2V0Tm9kZShQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSKS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9VU0VfUFJPSkVDVF9TRVRUSU5HUywgZmFsc2UpKSB7Ci0JCQkJZlNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117cHJvamVjdFNjb3BlLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQkJfQotCQl9Ci0KLQkJZlNldmVyaXR5TWlzc2luZ1JlcXVpcmVkQXR0cmlidXRlID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX01JU1NJTkdfUkVRVUlSRURfQVRUUklCVVRFKTsKLQkJZlNldmVyaXR5Tm9uRW1wdHlJbmxpbmVUYWcgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTk9OX0VNUFRZX0lOTElORV9UQUcpOwotCQlmU2V2ZXJpdHlVbmtub3duQXR0cmlidXRlID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX1VOS05PV05fQVRUUklCVVRFKTsKLQl9Ci0KLQl2b2lkIHBlcmZvcm1WYWxpZGF0aW9uKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlciwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlmVGFnbGliUHJlZml4ZXMuY2xlYXIoKTsKLQkJaW50IGxlbmd0aCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQlwZXJmb3JtVmFsaWRhdGlvbihmLCByZXBvcnRlciwgbW9kZWwsIG5ldyBSZWdpb24oMCwgbGVuZ3RoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVZhbGlkYXRpb24oSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBJUmVnaW9uIHZhbGlkYXRlUmVnaW9uKSB7Ci0JCWxvYWRQcmVmZXJlbmNlcyhmKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJLy8gaXRlcmF0ZSBhbGwgZG9jdW1lbnQgcmVnaW9ucwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHNEb2MuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQodmFsaWRhdGVSZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQl3aGlsZSAocmVnaW9uICE9IG51bGwgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgJiYgKHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpIDw9ICh2YWxpZGF0ZVJlZ2lvbi5nZXRPZmZzZXQoKSArIHZhbGlkYXRlUmVnaW9uLmdldExlbmd0aCgpKSkpIHsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCS8vIG9ubHkgY2hlY2tpbmcgZGlyZWN0aXZlcwotCQkJCXByb2Nlc3NEaXJlY3RpdmUocmVwb3J0ZXIsIGYsIG1vZGVsLCByZWdpb24pOwotCQkJCWZUYWdsaWJQcmVmaXhlcy5jbGVhcigpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCS8vIGFuZCBqc3AgdGFncwotCQkJCVN0cmluZyB0YWdOYW1lID0gZ2V0U3RhcnRUYWdOYW1lKHJlZ2lvbik7Ci0JCQkJaW50IGNvbG9uUG9zaXRpb24gPSB0YWdOYW1lLmluZGV4T2YoJzonKTsKLQkJCQlpZiAoY29sb25Qb3NpdGlvbiA+IC0xKSB7Ci0JCQkJCS8vIGdldCB0YWcncyBwcmVmaXggYW5kIGNoZWNrIGlmIGl0J3MgcmVhbGx5IGEganNwIGFjdGlvbgotCQkJCQkvLyB0YWcKLQkJCQkJU3RyaW5nIHByZWZpeCA9IHRhZ05hbWUuc3Vic3RyaW5nKDAsIGNvbG9uUG9zaXRpb24pOwotCQkJCQlpZiAoZ2V0VGFnbGliUHJlZml4ZXMoc0RvYykuY29udGFpbnMocHJlZml4KSkKLQkJCQkJCXByb2Nlc3NEaXJlY3RpdmUocmVwb3J0ZXIsIGYsIG1vZGVsLCByZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJdW5sb2FkUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0RpcmVjdGl2ZShJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpciA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCWlmIChpciBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBpcjsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gY21FbGVtZW50ID0gcXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQkJaWYgKGNtRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCUNNTmFtZWROb2RlTWFwIGNtQXR0cmlidXRlcyA9IG51bGw7Ci0KLQkJCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQkJCUxpc3Qgbm9kZXMgPSBxdWVyeS5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGNtRWxlbWVudCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNtQXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCQkJYm9vbGVhbiBmb3VuZGpzcGF0dHJpYnV0ZSA9IGNoZWNrVW5rbm93bkF0dHJpYnV0ZXMoZWxlbWVudCwgY21BdHRyaWJ1dGVzLCByZXBvcnRlciwgZmlsZSwgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIGRvY3VtZW50UmVnaW9uKTsKLQkJCQkJLy8gcmVxdWlyZWQgYXR0cmlidXRlcyBjb3VsZCBiZSBoaWRkZW4gaW4ganNwIHJlZ2lvbnMgaW4KLQkJCQkJLy8gdGFncywgc28gaWYganNwIHJlZ2lvbnMgd2VyZSBkZXRlY3RlZCwgZG8gbm90IGNoZWNrIGZvcgotCQkJCQkvLyBtaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMKLQkJCQkJaWYgKCFmb3VuZGpzcGF0dHJpYnV0ZSAmJiBmU2V2ZXJpdHlNaXNzaW5nUmVxdWlyZWRBdHRyaWJ1dGUgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKQotCQkJCQkJY2hlY2tSZXF1aXJlZEF0dHJpYnV0ZXMoZWxlbWVudCwgY21BdHRyaWJ1dGVzLCByZXBvcnRlciwgZmlsZSwgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIGRvY3VtZW50UmVnaW9uKTsKLQotCQkJCQlpZiAoZlNldmVyaXR5Tm9uRW1wdHlJbmxpbmVUYWcgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKQotCQkJCQkJY2hlY2tOb25FbXB0eUlubGluZVRhZyhlbGVtZW50LCBjbUVsZW1lbnQsIHJlcG9ydGVyLCBmaWxlLCBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVubG9hZFByZWZlcmVuY2VzKCkgewotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQkJZlNjb3BlcyA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoREVCVUcpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2YWxpZGF0aW5nOiAiICsgZik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGYpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJcGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIHNNb2RlbCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BCYXRjaFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEJhdGNoVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMDU3ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEJhdGNoVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLlByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBQZXJmb3JtcyBKU1AgdmFsaWRhdGlvbiB0YXNrcyBmb3IgYmF0Y2ggdmFsaWRhdGlvbi4gVGhlIGluZGl2aWR1YWwKLSAqIHZhbGlkYXRvciBjbGFzc2VzIHdpbGwgc3RpbGwgYmUgdXNlZCBmb3Igc291cmNlIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKU1BCYXRjaFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYiwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCWNsYXNzIEpTUEZpbGVWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQotCQlwcml2YXRlIExpc3QgZkZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcml2YXRlIElSZXBvcnRlciBmUmVwb3J0ZXIgPSBudWxsOwotCi0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJCWZSZXBvcnRlciA9IHJlcG9ydGVyOwotCQl9Ci0KLQkJZmluYWwgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSkgZkZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZGaWxlcy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCS8vIGNoZWNrIHZhbGlkYXRpb24KLQkJCWlmIChmUmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQotCQkJCWlmIChpc0pTUFR5cGUocHJveHkuZ2V0TmFtZSgpKSAmJiBwcm94eS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSlNQVmFsaWRhdG9yIGFkZGluZyBmaWxlOiAiICsgZmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZGaWxlcy5hZGQoZmlsZSk7Ci0KLQkJCQkJLy8gZG9uJ3Qgc2VhcmNoIGRlZXBlciBmb3IgZmlsZXMKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdmFsaWRhdG9yIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEX0pTUF9DT1JFID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExpc3Qgb2YgSVJlc291cmNlcyB0aGF0IHRoZSBjdXJyZW50bHkgdmFsaWRhdGluZyBmaWxlIGRlcGVuZHMgdXBvbgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBmRGVwZW5kc09uOwotCi0JLyoqCi0JICogR2V0cyBjdXJyZW50IHZhbGlkYXRpb24gcHJvamVjdCBjb25maWd1cmF0aW9uIGJhc2VkIG9uIGN1cnJlbnQgcHJvamVjdAotCSAqICh3aGljaCBpcyBiYXNlZCBvbiBjdXJyZW50IGRvY3VtZW50KQotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdENvbmZpZ3VyYXRpb24KLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBQcm9qZWN0Q29uZmlndXJhdGlvbiBnZXRQcm9qZWN0Q29uZmlndXJhdGlvbihJRmlsZSBmaWxlKSB7Ci0JCVByb2plY3RDb25maWd1cmF0aW9uIHByb2plY3RDb25maWd1cmF0aW9uID0gbnVsbDsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXByb2plY3RDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCX0KLQkJCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvamVjdENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHZhbGlkYXRvciBpcyBlbmFibGVkIGFjY29yZGluZyBpbiBWYWxpZGF0aW9uIHByZWZlcmVuY2VzCi0JICogCi0JICogQHBhcmFtIHZtZAotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc0JhdGNoVmFsaWRhdG9yUHJlZmVyZW5jZUVuYWJsZWQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCVByb2plY3RDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRQcm9qZWN0Q29uZmlndXJhdGlvbihmaWxlKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGEgbWV0YWRhdGEgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoSlNQQmF0Y2hWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwgJiYgbWV0YWRhdGEgIT0gbnVsbCkgewotCQkJCWlmICghY29uZmlndXJhdGlvbi5pc0J1aWxkRW5hYmxlZChtZXRhZGF0YSkgJiYgIWNvbmZpZ3VyYXRpb24uaXNNYW51YWxFbmFibGVkKG1ldGFkYXRhKSkKLQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCVN0cmluZyBmQWRkaXRpb25hbENvbnRlbnRUeXBlc0lEc1tdID0gbnVsbDsKLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZkNvbnRlbnRUeXBlcyA9IG51bGw7Ci0KLQlwcml2YXRlIEpTUERpcmVjdGl2ZVZhbGlkYXRvciBmSlNQRGlyZWN0aXZlVmFsaWRhdG9yID0gbmV3IEpTUERpcmVjdGl2ZVZhbGlkYXRvcih0aGlzKTsKLQotCXByaXZhdGUgSlNQRUxWYWxpZGF0b3IgZkpTUEVMVmFsaWRhdG9yID0gbmV3IEpTUEVMVmFsaWRhdG9yKHRoaXMpOwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkpTUEZDb250ZW50VHlwZSA9IG51bGw7Ci0KLQlwcml2YXRlIEpTUEphdmFWYWxpZGF0b3IgZkpTUEphdmFWYWxpZGF0b3IgPSBuZXcgSlNQSmF2YVZhbGlkYXRvcih0aGlzKTsKLQotCXByaXZhdGUgSlNQQWN0aW9uVmFsaWRhdG9yIGZKU1BBY3Rpb25WYWxpZGF0b3IgPSBuZXcgSlNQQWN0aW9uVmFsaWRhdG9yKHRoaXMpOwotCi0Jdm9pZCBhZGREZXBlbmRzT24oSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCWZEZXBlbmRzT24uYWRkKHJlc291cmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWZKU1BEaXJlY3RpdmVWYWxpZGF0b3IuY2xlYW51cChyZXBvcnRlcik7Ci0JCWZKU1BFTFZhbGlkYXRvci5jbGVhbnVwKHJlcG9ydGVyKTsKLQkJZkpTUEphdmFWYWxpZGF0b3IuY2xlYW51cChyZXBvcnRlcik7Ci0JCWZKU1BBY3Rpb25WYWxpZGF0b3IuY2xlYW51cChyZXBvcnRlcik7Ci0JfQotCi0KLQl2b2lkIGRvVmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIHVyaXMgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlpZiAodXJpcy5sZW5ndGggPiAwKSB7Ci0JCQlJV29ya3NwYWNlUm9vdCB3c1Jvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJY3VycmVudEZpbGUgPSB3c1Jvb3QuZ2V0RmlsZShuZXcgUGF0aCh1cmlzW2ldKSk7Ci0JCQkJaWYgKGN1cnJlbnRGaWxlICE9IG51bGwgJiYgY3VycmVudEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJaWYgKHNob3VsZFZhbGlkYXRlKGN1cnJlbnRGaWxlKSAmJiBmcmFnbWVudENoZWNrKGN1cnJlbnRGaWxlKSkgewotCQkJCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBjdXJyZW50RmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsKLQkJCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkJdmFsaWRhdGVGaWxlKGN1cnJlbnRGaWxlLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIHVyaXNbaV0gKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpZiB1cmlzW10gbGVuZ3RoIDAgLT4gdmFsaWRhdGUoKSBnZXRzIGNhbGxlZCBmb3IgZWFjaCBwcm9qZWN0Ci0JCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgSVdvcmtiZW5jaENvbnRleHQpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKChJV29ya2JlbmNoQ29udGV4dCkgaGVscGVyKS5nZXRQcm9qZWN0KCk7Ci0KLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BCYXRjaFZhbGlkYXRvcl8wLCBwcm9qZWN0LmdldEZ1bGxQYXRoKCkpKTsKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQotCQkJCUpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IocmVwb3J0ZXIpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIGNvbGxlY3QgYWxsIGpzcCBmaWxlcyBmb3IgdGhlIHByb2plY3QKLQkJCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlJRmlsZVtdIGZpbGVzID0gdmlzaXRvci5nZXRGaWxlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkJaWYgKHNob3VsZFZhbGlkYXRlKGZpbGVzW2ldKSAmJiBmcmFnbWVudENoZWNrKGZpbGVzW2ldKSkgewotCi0JCQkJCQltZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBmaWxlc1tpXS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsKLQkJCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCi0JCQkJCQl2YWxpZGF0ZUZpbGUoZmlsZXNbaV0sIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInZhbGlkYXRpbmc6IFsiICsgZmlsZXNbaV0gKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgZmlsZSBpcyBhIGpzcCBmcmFnbWVudCBvciBub3QuIElmIHNvLCBjaGVjayBpZiB0aGUgZnJhZ21lbnQKLQkgKiBzaG91bGQgYmUgdmFsaWRhdGVkIG9yIG5vdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgQXNzdW1lcyBzaG91bGRWYWxpZGF0ZSB3YXMgYWxyZWFkeSBjYWxsZWQgb24gZmlsZSBzbyBpdAotCSAqICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBudWxsIGFuZCBkb2VzIGV4aXN0Ci0JICogQHJldHVybiBmYWxzZSBpZiBmaWxlIGlzIGEgZnJhZ21lbnQgYW5kIGl0IHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLAotCSAqICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZnJhZ21lbnRDaGVjayhJRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGUgPSB0cnVlOwotCQkvLyBxdWljayBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBwb3NzaWJseSBhIGpzcCBmcmFnbWVudAotCQlpZiAoZ2V0SlNQRkNvbnRlbnRUeXBlKCkuaXNBc3NvY2lhdGVkV2l0aChmaWxlLmdldE5hbWUoKSkpIHsKLQkJCS8vIGdldCBwcmVmZXJlbmNlIGZvciB2YWxpZGF0ZSBqc3AgZnJhZ21lbnRzCi0JCQlib29sZWFuIHNob3VsZFZhbGlkYXRlRnJhZ21lbnRzID0gRnJhZ21lbnRWYWxpZGF0aW9uVG9vbHMuc2hvdWxkVmFsaWRhdGVGcmFnbWVudChmaWxlKTsKLQkJCS8qCi0JCQkgKiBpZiBqc3AgZnJhZ21lbnRzIHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLCBjaGVjayBpZiBmaWxlIGlzCi0JCQkgKiByZWFsbHkganNwIGZyYWdtZW50Ci0JCQkgKi8KLQkJCWlmICghc2hvdWxkVmFsaWRhdGVGcmFnbWVudHMpIHsKLQkJCQlib29sZWFuIGlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50KGZpbGUpOwotCQkJCXNob3VsZFZhbGlkYXRlID0gIWlzRnJhZ21lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFZhbGlkYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgSlNQIGZyYWdtZW50IGNvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4ganNwZiBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRKU1BGQ29udGVudFR5cGUoKSB7Ci0JCWlmIChmSlNQRkNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZKU1BGQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQpOwotCQl9Ci0JCXJldHVybiBmSlNQRkNvbnRlbnRUeXBlOwotCX0KLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgSVdvcmtiZW5jaENvbnRleHQpIHsKLQkJCS8qCi0JCQkgKiBVc2UgYSBzaW5nbGUgYnVpbGQgcnVsZSB3aGVuIHJ1bm5pbmcgYmF0Y2ggdmFsaWRhdGlvbi4KLQkJCSAqLwotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmJ1aWxkUnVsZSgpOwotCQl9Ci0JCS8qCi0JCSAqIEZvciBvdGhlciBraW5kcyBvZiB2YWxpZGF0aW9uLCB1c2Ugbm8gc3BlY2lmaWMgcnVsZQotCQkgKi8KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBsaXN0IG9mIGNvbnRlbnQgdHlwZXMgdGhpcyB2aXNpdG9yIGlzIGludGVyZXN0ZWQgaW4KLQkgKiAKLQkgKiBAcmV0dXJuIEFsbCBKU1AtcmVsYXRlZCBjb250ZW50IHR5cGVzCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBnZXRWYWxpZENvbnRlbnRUeXBlcygpIHsKLQkJaWYgKGZDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJLy8gY3VycmVudGx5ICJoYXJkLWNvZGVkIiB0byBiZSBqc3AgJiBqc3BmCi0JCQlmQ29udGVudFR5cGVzID0gbmV3IElDb250ZW50VHlwZVtde1BsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApLCBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQpfTsKLQkJCWlmIChmQWRkaXRpb25hbENvbnRlbnRUeXBlc0lEcyAhPSBudWxsKSB7Ci0JCQkJTGlzdCBhbGxUeXBlcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmQ29udGVudFR5cGVzKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQWRkaXRpb25hbENvbnRlbnRUeXBlc0lEcy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ29udGVudFR5cGUgdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzW2ldKTsKLQkJCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQkJYWxsVHlwZXMuYWRkKHR5cGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZDb250ZW50VHlwZXMgPSAoSUNvbnRlbnRUeXBlW10pIGFsbFR5cGVzLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVthbGxUeXBlcy5zaXplKCldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNvbnRlbnRUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGZpbGUgaXMganNwIGZyYWdtZW50IG9yIG5vdCAoZG9lcyBhIGRlZXAsIGluZGVwdGggY2hlY2ssCi0JICogbG9va2luZyBpbnRvIGNvbnRlbnRzIG9mIGZpbGUpCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZmlsZSBpcyBub3QgbnVsbCBhbmQgZXhpc3RzCi0JICogQHJldHVybiB0cnVlIGlmIGZpbGUgaXMganNwIGZyYWdtZW50LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNGcmFnbWVudChJRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gaXNGcmFnbWVudCA9IGZhbHNlOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkvLyBpdCBjYW4gYmUgbnVsbAotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJaXMgPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJY29udGVudERlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoaXMsIGZpbGUuZ2V0TmFtZSgpLCBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVH0pOwotCQkJfQotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZpbGVDdElkID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZ2V0SWQoKTsKLQkJCQlpc0ZyYWdtZW50ID0gKGZpbGVDdElkICE9IG51bGwgJiYgQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUEZSQUdNRU5ULmVxdWFscyhmaWxlQ3RJZCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBhc3N1bWUgaXQncyBpbnZhbGlkIEpTUAotCQl9Ci0JCWZpbmFsbHkgewotCQkJLyoKLQkJCSAqIG11c3QgY2xvc2UgaW5wdXQgc3RyZWFtIGluIGNhc2Ugb3RoZXJzIG5lZWQgaXQKLQkJCSAqIChJRmlsZS5nZXRDb250ZW50cygpIHJlcXVpcmVtZW50IGFzIHdlbGwpCi0JCQkgKi8KLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3Qgc3VyZSBob3cgdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBpc0ZyYWdtZW50OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBmaWxlTmFtZSBpcyBzb21lIHR5cGUgb2YgSlNQIChpbmNsdWRpbmcgSlNQIGZyYWdtZW50cykKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmlsZW5hbWUgaW5kaWNhdGVzIHNvbWUgdHlwZSBvZiBKU1AsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IGdldFZhbGlkQ29udGVudFR5cGVzKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKSB7Ci0JCQl2YWxpZCA9IHR5cGVzW2ldLmlzQXNzb2NpYXRlZFdpdGgoZmlsZU5hbWUpOwotCQkJKytpOwotCQl9Ci0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybVZhbGlkYXRpb24oSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkKLQkJCWZKU1BKYXZhVmFsaWRhdG9yLnBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBtb2RlbCk7Ci0JCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkKLQkJCWZKU1BEaXJlY3RpdmVWYWxpZGF0b3IucGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJZkpTUEVMVmFsaWRhdG9yLnBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkKLQkJCWZKU1BBY3Rpb25WYWxpZGF0b3IucGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzID0gbmV3IFN0cmluZ1swXTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZGF0YS50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCWZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzID0gU3RyaW5nVXRpbHMudW5wYWNrKGRhdGEudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCQlkbyB7Ci0JCQlpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJd2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlkb1ZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIG9uZSBmaWxlLiBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZmlsZSBoYXMgSlNQIGNvbnRlbnQgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqLwotCXZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQl0cnkgewotCQkJZi5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgSlNQIG1vZGVsIG9uIGJlaGFsZiBvZiBhbGwgSlNQIHZhbGlkYXRvcnMKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZik7Ci0JCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgJiYgbW9kZWwgIT0gbnVsbCkgewotCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsIGYpOwotCQkJCXBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBtb2RlbCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJSm9iIGN1cnJlbnRKb2IgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLmN1cnJlbnRKb2IoKTsKLQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBudWxsOwotCQlpZiAoY3VycmVudEpvYiAhPSBudWxsKSB7Ci0JCQlydWxlID0gY3VycmVudEpvYi5nZXRSdWxlKCk7Ci0JCX0KLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHZhbGlkYXRpb25SdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJZG9WYWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRF9KU1BfQ09SRSwgMCwgUExVR0lOX0lEX0pTUF9DT1JFLCBlKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJSmF2YUNvcmUucnVuKHZhbGlkYXRpb25SdW5uYWJsZSwgcnVsZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoVmFsaWRhdGlvbkV4Y2VwdGlvbikgZS5nZXRDYXVzZSgpOwotCQkJfQotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24obmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuRVJST1JfQU5EX1dBUk5JTkcsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybiBudWxsOwotCQlmaW5hbCBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCWZpbmFsIElSZXBvcnRlciByZXBvcnRlciA9IHJlc3VsdC5nZXRSZXBvcnRlcihtb25pdG9yKTsKLQkJZkRlcGVuZHNPbiA9IG5ldyBIYXNoU2V0KCk7Ci0JCQotCQkvLyBhZGQgd2ViLnhtbCBhcyBhIGRlcGVuZGVuY3kKLQkJYWRkRGVwZW5kc09uKERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldFdlYlhNTChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSk7Ci0KLQkJLy8gTGlzdCByZWxldmFudCBKU1AgMi4wIHByZWx1ZGVzL2NvZGFzIGFzIGRlcGVuZGVuY2llcwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJUHJvcGVydHlHcm91cFtdIHByb3BlcnR5R3JvdXBzID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0UHJvcGVydHlHcm91cHMocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcGVydHlHcm91cHMubGVuZ3RoOyBqKyspIHsKLQkJCUlQYXRoW10gcHJlbHVkZXMgPSBwcm9wZXJ0eUdyb3Vwc1tqXS5nZXRJbmNsdWRlUHJlbHVkZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVsdWRlcy5sZW5ndGg7IGkrKykgewotCQkJCWFkZERlcGVuZHNPbih3b3Jrc3BhY2VSb290LmdldEZpbGUocHJlbHVkZXNbaV0pKTsKLQkJCX0KLQkJCUlQYXRoW10gY29kYXMgPSBwcm9wZXJ0eUdyb3Vwc1tqXS5nZXRJbmNsdWRlQ29kYSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2Rhcy5sZW5ndGg7IGkrKykgewotCQkJCWFkZERlcGVuZHNPbih3b3Jrc3BhY2VSb290LmdldEZpbGUoY29kYXNbaV0pKTsKLQkJCX0KLQkJfQotCQkKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHZhbGlkYXRpb25SdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJaWYgKGZyYWdtZW50Q2hlY2soKElGaWxlKSByZXNvdXJjZSkpIHsKLQkJCQkJdmFsaWRhdGVGaWxlKChJRmlsZSkgcmVzb3VyY2UsIHJlcG9ydGVyKTsKLQkJCQl9Ci0JCQkJcmVzdWx0LnNldERlcGVuZHNPbigoSVJlc291cmNlW10pIGZEZXBlbmRzT24udG9BcnJheShuZXcgSVJlc291cmNlW2ZEZXBlbmRzT24uc2l6ZSgpXSkpOwotCQkJCWZEZXBlbmRzT24uY2xlYXIoKTsKLQkJCX0KLQkJfTsKLQkJSm9iIGN1cnJlbnRKb2IgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLmN1cnJlbnRKb2IoKTsKLQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBudWxsOwotCQlpZiAoY3VycmVudEpvYiAhPSBudWxsKSB7Ci0JCQlydWxlID0gY3VycmVudEpvYi5nZXRSdWxlKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUphdmFDb3JlLnJ1bih2YWxpZGF0aW9uUnVubmFibGUsIHJ1bGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQ29udGVudFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUENvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxM2QxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQ29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyB2YWxpZGF0b3IgdmFsaWRhdGVzIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBKU1AsIGxpa2UKLSAqIHRoZSBIVE1MIHJlZ2lvbnMgaW4gYSBKU1Agd2l0aCBjb250ZW50IHR5cGU9InRleHQvaHRtbCIKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbnRlbnRWYWxpZGF0b3IgZXh0ZW5kcyBKU1BWYWxpZGF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0pBVkFfU1VOX0NPTV9KU1BfUEFHRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfSlNQID0gInhtbG5zOmpzcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElDb250ZW50VHlwZSBmSlNQRkNvbnRlbnRUeXBlID0gbnVsbDsKLQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGZpbGUgaXMgYSBqc3AgZnJhZ21lbnQgb3Igbm90LiBJZiBzbywgY2hlY2sgaWYgdGhlIGZyYWdtZW50Ci0JICogc2hvdWxkIGJlIHZhbGlkYXRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIEFzc3VtZXMgc2hvdWxkVmFsaWRhdGUgd2FzIGFscmVhZHkgY2FsbGVkIG9uIGZpbGUgc28gaXQKLQkgKiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbnVsbCBhbmQgZG9lcyBleGlzdAotCSAqIEByZXR1cm4gZmFsc2UgaWYgZmlsZSBpcyBhIGZyYWdtZW50IGFuZCBpdCBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwKLQkgKiAgICAgICAgIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZyYWdtZW50Q2hlY2soSUZpbGUgZmlsZSkgewotCQlib29sZWFuIHNob3VsZFZhbGlkYXRlID0gdHJ1ZTsKLQkJLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgcG9zc2libHkgYSBqc3AgZnJhZ21lbnQKLQkJaWYgKGdldEpTUEZDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkvLyBnZXQgcHJlZmVyZW5jZSBmb3IgdmFsaWRhdGUganNwIGZyYWdtZW50cwotCQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUZyYWdtZW50cyA9IEZyYWdtZW50VmFsaWRhdGlvblRvb2xzLnNob3VsZFZhbGlkYXRlRnJhZ21lbnQoZmlsZSk7Ci0JCQkvKgotCQkJICogaWYganNwIGZyYWdtZW50cyBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwgY2hlY2sgaWYgZmlsZSBpcwotCQkJICogcmVhbGx5IGpzcCBmcmFnbWVudAotCQkJICovCi0JCQlpZiAoIXNob3VsZFZhbGlkYXRlRnJhZ21lbnRzKSB7Ci0JCQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gaXNGcmFnbWVudChmaWxlKTsKLQkJCQlzaG91bGRWYWxpZGF0ZSA9ICFpc0ZyYWdtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBzaG91bGRWYWxpZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIEpTUCBmcmFnbWVudCBjb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIGpzcGYgY29udGVudCB0eXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0SlNQRkNvbnRlbnRUeXBlKCkgewotCQlpZiAoZkpTUEZDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlmSlNQRkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUEZSQUdNRU5UKTsKLQkJfQotCQlyZXR1cm4gZkpTUEZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKgotCSAqIENvcGllZCBmcm9tIEhUTUxWYWxpZGF0b3IKLQkgKi8KLQlwcml2YXRlIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJRE9NTW9kZWwgbW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyKHRoaXMsIHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JfQotCi0JLyoKLQkgKiBDb3BpZWQgZnJvbSBIVE1MVmFsaWRhdG9yCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc0hUTUxGZWF0dXJlKElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFkYXB0ZXIuaGFzRmVhdHVyZShIVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLkhUTUwpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQgb3Igbm90IChkb2VzIGEgZGVlcCwgaW5kZXB0aCBjaGVjaywKLQkgKiBsb29raW5nIGludG8gY29udGVudHMgb2YgZmlsZSkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYXNzdW1lcyBmaWxlIGlzIG5vdCBudWxsIGFuZCBleGlzdHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50KElGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gZmFsc2U7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCS8vIGl0IGNhbiBiZSBudWxsCi0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQlpcyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihpcywgZmlsZS5nZXROYW1lKCksIG5ldyBRdWFsaWZpZWROYW1lW117SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUfSk7Ci0JCQl9Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZUN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotCQkJCWlzRnJhZ21lbnQgPSAoZmlsZUN0SWQgIT0gbnVsbCAmJiBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQuZXF1YWxzKGZpbGVDdElkKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJZmluYWxseSB7Ci0JCQkvKgotCQkJICogbXVzdCBjbG9zZSBpbnB1dCBzdHJlYW0gaW4gY2FzZSBvdGhlcnMgbmVlZCBpdAotCQkJICogKElGaWxlLmdldENvbnRlbnRzKCkgcmVxdWlyZW1lbnQgYXMgd2VsbCkKLQkJCSAqLwotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MSlNQKElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJcmV0dXJuIHJvb3QgIT0gbnVsbCAmJiAocm9vdC5oYXNBdHRyaWJ1dGUoWE1MTlNfSlNQKSB8fCBIVFRQX0pBVkFfU1VOX0NPTV9KU1BfUEFHRS5lcXVhbHMocm9vdC5nZXRBdHRyaWJ1dGUoWE1MTlMpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSURPTU1vZGVsIG1vZGVsLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJYm9vbGVhbiBpc1hNTEpTUCA9IGlzWE1MSlNQKGRvY3VtZW50KTsKLQkJYm9vbGVhbiBoYXNIVE1MRmVhdHVyZSA9IGhhc0hUTUxGZWF0dXJlKGRvY3VtZW50KTsKLQotCQlpZiAoaGFzSFRNTEZlYXR1cmUgJiYgIWlzWE1MSlNQKSB7Ci0JCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQlWYWxpZGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFZhbGlkYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KGRvY3VtZW50KTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlIVE1MVmFsaWRhdGlvblJlcG9ydGVyIHJlcCA9IGdldFJlcG9ydGVyKHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JCQkJcmVwLmNsZWFyKCk7Ci0JCQkJYWRhcHRlci5zZXRSZXBvcnRlcihyZXApOwotCQkJCWFkYXB0ZXIudmFsaWRhdGUoZG9jdW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmICghaGFzSFRNTEZlYXR1cmUgJiYgaXNYTUxKU1ApIHsKLQkJCVZhbGlkYXRvciB4bWxWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKCk7Ci0JCQl4bWxWYWxpZGF0b3IudmFsaWRhdGUoZmlsZSwga2luZCwgc3RhdGUsIG1vbml0b3IpOwotCQl9Ci0JfQotCi0KLQkvKgotCSAqIE1vc3RseSBjb3BpZWQgZnJvbSBIVE1MVmFsaWRhdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSURPTU1vZGVsIG1vZGVsKSB7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgbW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJLy8gVGhpcyB2YWxpZGF0b3IgY3VycmVudGx5IG9ubHkgaGFuZGxlcyB2YWxpZGF0aW5nIEhUTUwgY29udGVudCBpbgotCQkvLyBKU1AKLQkJYm9vbGVhbiBoYXNYTUxGZWF0dXJlID0gaXNYTUxKU1AoZG9jdW1lbnQpOwotCQlib29sZWFuIGhhc0hUTUxGZWF0dXJlID0gaGFzSFRNTEZlYXR1cmUoZG9jdW1lbnQpOwotCQlpZiAoaGFzSFRNTEZlYXR1cmUgJiYgIWhhc1hNTEZlYXR1cmUpIHsKLQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCVZhbGlkYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoVmFsaWRhdGlvbkFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQoZG9jdW1lbnQpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJCUhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwID0gZ2V0UmVwb3J0ZXIocmVwb3J0ZXIsIGZpbGUsIG1vZGVsKTsKLQkJCXJlcC5jbGVhcigpOwotCQkJYWRhcHRlci5zZXRSZXBvcnRlcihyZXApOwotCQkJYWRhcHRlci52YWxpZGF0ZShkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSByZXN1bHQuZ2V0UmVwb3J0ZXIobW9uaXRvcik7Ci0KLQkJaWYgKGZyYWdtZW50Q2hlY2soKElGaWxlKSByZXNvdXJjZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSAmJiBtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCByZXNvdXJjZSk7Ci0JCQkJCXZhbGlkYXRlKChJRmlsZSkgcmVzb3VyY2UsIGtpbmQsIHN0YXRlLCBtb25pdG9yLCAoSURPTU1vZGVsKSBtb2RlbCwgcmVwb3J0ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZpbGUoSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGZyYWdtZW50Q2hlY2soZikpIHsKLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGYpOwotCQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSAmJiBtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCBmKTsKLQkJCQkJdmFsaWRhdGUocmVwb3J0ZXIsIGYsIChJRE9NTW9kZWwpIG1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQRGlyZWN0aXZlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQRGlyZWN0aXZlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MmMwNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUERpcmVjdGl2ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GYWNldE1vZHVsZUNvcmVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSUphclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUTERSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnRGlyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYlJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLlRhZ2xpYkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQMjBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogQ2hlY2tzIGZvcjogLSBkdXBsaWNhdGUgdGFnbGliIHByZWZpeCB2YWx1ZXMgYW5kIHJlc2VydmVkIHRhZ2xpYiBwcmVmaXgKLSAqIHZhbHVlcyBpbiB0aGUgc2FtZSBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BEaXJlY3RpdmVWYWxpZGF0b3IgZXh0ZW5kcyBKU1BWYWxpZGF0b3IgewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5VUyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdmFsaWRhdG9yIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElWYWxpZGF0b3IgZk1lc3NhZ2VPcmlnaW5hdG9yOwotCXByaXZhdGUgSUVjbGlwc2VQcmVmZXJlbmNlcyBmUHJlZmVyZW5jZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZXNTZXJ2aWNlIGZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmUHJlZml4VmFsdWVSZWdpb25Ub0RvY3VtZW50UmVnaW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIElKYXZhUHJvamVjdCBmUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZSZXNlcnZlZFByZWZpeGVzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIElTY29wZUNvbnRleHRbXSBmU2NvcGVzID0gbnVsbDsKLQlwcml2YXRlIGludCBmU2V2ZXJpdHlJbmNsdWRlRmlsZU1pc3NpbmcgPSAtMTsKLQlwcml2YXRlIGludCBmU2V2ZXJpdHlJbmNsdWRlRmlsZU5vdFNwZWNpZmllZCA9IC0xOwotCXByaXZhdGUgaW50IGZTZXZlcml0eVN1cGVyQ2xhc3NOb3RGb3VuZCA9IC0xOwotCXByaXZhdGUgaW50IGZTZXZlcml0eVRhZ2RpclVucmVzb2x2YWJsZVVSSSA9IC0xOwotCXByaXZhdGUgaW50IGZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhEaWZmZXJlbnRVUklzID0gLTE7Ci0KLQlwcml2YXRlIGludCBmU2V2ZXJpdHlUYWdsaWJEdXBsaWNhdGVQcmVmaXhXaXRoU2FtZVVSSXMgPSAtMTsKLQlwcml2YXRlIGludCBmU2V2ZXJpdHlUYWdsaWJNaXNzaW5nUHJlZml4ID0gLTE7Ci0KLQlwcml2YXRlIGludCBmU2V2ZXJpdHlUYWdsaWJNaXNzaW5nVVJJID0gLTE7Ci0KLQotCXByaXZhdGUgaW50IGZTZXZlcml0eVRhZ2xpYlVucmVzb2x2YWJsZVVSSSA9IC0xOwotCi0JcHJpdmF0ZSBIYXNoTWFwIGZUYWdsaWJQcmVmaXhlc0luVXNlID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBKU1BEaXJlY3RpdmVWYWxpZGF0b3IoKSB7Ci0JCWluaXRSZXNlcnZlZFByZWZpeGVzKCk7Ci0JCWZNZXNzYWdlT3JpZ2luYXRvciA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEpTUERpcmVjdGl2ZVZhbGlkYXRvcihJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpbml0UmVzZXJ2ZWRQcmVmaXhlcygpOwotCQl0aGlzLmZNZXNzYWdlT3JpZ2luYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZWNvcmQgdGhhdCB0aGUgY3VycmVudGx5IHZhbGlkYXRpbmcgcmVzb3VyY2UgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4KLQkgKiBmaWxlLiBPbmx5IHBvc3NpYmxlIGR1cmluZyBiYXRjaCAobm90IHNvdXJjZSkgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGREZXBlbmRzT24oSVJlc291cmNlIGZpbGUpIHsKLQkJaWYgKGZNZXNzYWdlT3JpZ2luYXRvciBpbnN0YW5jZW9mIEpTUEJhdGNoVmFsaWRhdG9yKSB7Ci0JCQkoKEpTUEJhdGNoVmFsaWRhdG9yKSBmTWVzc2FnZU9yaWdpbmF0b3IpLmFkZERlcGVuZHNPbihmaWxlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLmNsZWFudXAocmVwb3J0ZXIpOwotCQlmVGFnbGliUHJlZml4ZXNJblVzZS5jbGVhcigpOwotCQlmUHJlZml4VmFsdWVSZWdpb25Ub0RvY3VtZW50UmVnaW9uTWFwLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RUYWdsaWJQcmVmaXgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gdmFsdWVSZWdpb24sIFN0cmluZyB0YWdsaWJQcmVmaXgpIHsKLQkJZlByZWZpeFZhbHVlUmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcC5wdXQodmFsdWVSZWdpb24sIGRvY3VtZW50UmVnaW9uKTsKLQotCQlPYmplY3QgbyA9IGZUYWdsaWJQcmVmaXhlc0luVXNlLmdldCh0YWdsaWJQcmVmaXgpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvLyBwcmVmaXggZG9lc24ndCBleGlzdCwgcmVtZW1iZXIgaXQKLQkJCWZUYWdsaWJQcmVmaXhlc0luVXNlLnB1dCh0YWdsaWJQcmVmaXgsIHZhbHVlUmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgcmVnaW9uTGlzdCA9IG51bGw7Ci0JCQkvLyBhbHJlYWR5IGEgTGlzdAotCQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJcmVnaW9uTGlzdCA9IChMaXN0KSBvOwotCQkJfQotCQkJLyoKLQkJCSAqIGEgc2luZ2xlIHZhbHVlIHJlZ2lvbiwgY3JlYXRlIGEgbmV3IExpc3QgYW5kIGFkZCBwcmV2aW91cwotCQkJICogdmFsdWVSZWdpb24KLQkJCSAqLwotCQkJZWxzZSB7Ci0JCQkJcmVnaW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZWdpb25MaXN0LmFkZChvKTsKLQkJCQlmVGFnbGliUHJlZml4ZXNJblVzZS5wdXQodGFnbGliUHJlZml4LCByZWdpb25MaXN0KTsKLQkJCX0KLQkJCXJlZ2lvbkxpc3QuYWRkKHZhbHVlUmVnaW9uKTsKLQkJfQotCX0KLQotCWludCBnZXRNZXNzYWdlU2V2ZXJpdHkoU3RyaW5nIGtleSkgewotCQlpbnQgc2V2ID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRJbnQoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUiwga2V5LCBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIGZTY29wZXMpOwotCQlzd2l0Y2ggKHNldikgewotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUiA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgOgotCQkJCXJldHVybiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklORk9STUFUSU9OIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUgOgotCQkJCXJldHVybiBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkU7Ci0JCX0KLQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGluaXRSZXNlcnZlZFByZWZpeGVzKCkgewotCQlmUmVzZXJ2ZWRQcmVmaXhlcy5wdXQoImpzcCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgianNweCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgiamF2YSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgiamF2YXgiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJZlJlc2VydmVkUHJlZml4ZXMucHV0KCJzZXJ2bGV0IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgic3VuIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgic3VudyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Jlc2VydmVkVGFnbGliUHJlZml4KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmUmVzZXJ2ZWRQcmVmaXhlcy5nZXQobmFtZSkgIT0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlcyhJRmlsZSBmaWxlKSB7Ci0JCWZTY29wZXMgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0KLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCVByb2plY3RTY29wZSBwcm9qZWN0U2NvcGUgPSBuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChwcm9qZWN0U2NvcGUuZ2V0Tm9kZShQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSKS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9VU0VfUFJPSkVDVF9TRVRUSU5HUywgZmFsc2UpKSB7Ci0JCQkJZlNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117cHJvamVjdFNjb3BlLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQkJfQotCQl9Ci0KLQkJZlNldmVyaXR5SW5jbHVkZUZpbGVNaXNzaW5nID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9GSUxFX05PVF9GT1VORCk7Ci0JCWZTZXZlcml0eUluY2x1ZGVGaWxlTm90U3BlY2lmaWVkID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9OT19GSUxFX1NQRUNJRklFRCk7Ci0JCWZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhEaWZmZXJlbnRVUklzID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19ESUZGRVJFTlRfVVJJUyk7Ci0JCWZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhTYW1lVVJJcyA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfU0FNRV9VUklTKTsKLQkJZlNldmVyaXR5VGFnbGliTWlzc2luZ1ByZWZpeCA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1BSRUZJWCk7Ci0JCWZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkkgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19VUklfT1JfVEFHRElSKTsKLQkJZlNldmVyaXR5VGFnbGliVW5yZXNvbHZhYmxlVVJJID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSKTsKLQkJZlNldmVyaXR5VGFnZGlyVW5yZXNvbHZhYmxlVVJJID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSKTsKLQkJZlNldmVyaXR5U3VwZXJDbGFzc05vdEZvdW5kID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfUEFHRV9TVVBFUkNMQVNTX05PVF9GT1VORCk7Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVZhbGlkYXRpb24oSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJU3RydWN0dXJlZERvY3VtZW50IHNEb2MpIHsKLQkJbG9hZFByZWZlcmVuY2VzKGYpOwotCQkKLQkJCi0JCXNldFByb2plY3QoZi5nZXRQcm9qZWN0KCkpOwotCQkvKgotCQkgKiB3aGVuIHZhbGlkYXRpbmcgYW4gZW50aXJlIGZpbGUgbmVlZCB0byBjbGVhciBkdXBlcyBvciBlbHNlIHlvdSdyZQotCQkgKiBjb21wYXJpbmcgYmV0d2VlbiBmaWxlcwotCQkgKi8KLQkJZlByZWZpeFZhbHVlUmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcC5jbGVhcigpOwotCQlmVGFnbGliUHJlZml4ZXNJblVzZS5jbGVhcigpOwotCi0JCS8vIGl0ZXJhdGUgYWxsIGRvY3VtZW50IHJlZ2lvbnMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBzRG9jLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXdoaWxlIChyZWdpb24gIT0gbnVsbCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJLy8gb25seSBjaGVja2luZyBkaXJlY3RpdmVzCi0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlwcm9jZXNzRGlyZWN0aXZlKHJlcG9ydGVyLCBmLCBzRG9jLCByZWdpb24pOwotCQkJfQotCQkJcmVnaW9uID0gcmVnaW9uLmdldE5leHQoKTsKLQkJfQotCi0JCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJcmVwb3J0VGFnbGliRHVwbGljYXRlUHJlZml4ZXMoZiwgcmVwb3J0ZXIsIHNEb2MpOwotCQl9Ci0KLQkJZlByZWZpeFZhbHVlUmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcC5jbGVhcigpOwotCQlmVGFnbGliUHJlZml4ZXNJblVzZS5jbGVhcigpOwotCQlzZXRQcm9qZWN0KG51bGwpOwotCQl1bmxvYWRQcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGlyZWN0aXZlKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gZ2V0RGlyZWN0aXZlTmFtZShkb2N1bWVudFJlZ2lvbik7Ci0JCS8vIHdlIG9ubHkgY2FyZSBhYm91dCB0YWdsaWIgZGlyZWN0aXZlCi0JCWlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygidGFnbGliIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc1RhZ2xpYkRpcmVjdGl2ZShyZXBvcnRlciwgZmlsZSwgc0RvYywgZG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUocmVwb3J0ZXIsIGZpbGUsIHNEb2MsIGRvY3VtZW50UmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygicGFnZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NQYWdlRGlyZWN0aXZlKHJlcG9ydGVyLCBmaWxlLCBzRG9jLCBkb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IHNEb2MsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24pIHsKLQkJSVRleHRSZWdpb24gZmlsZVZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oZG9jdW1lbnRSZWdpb24sIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFKTsKLQkJaWYgKGZpbGVWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmaWxlIHNwZWNpZmllZAotCQkJU3RyaW5nIGZpbGVWYWx1ZSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQoZmlsZVZhbHVlUmVnaW9uKTsKLQkJCWZpbGVWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGZpbGVWYWx1ZSk7Ci0KLQkJCWlmIChmaWxlVmFsdWUubGVuZ3RoKCkgPT0gMCAmJiBmU2V2ZXJpdHlJbmNsdWRlRmlsZU5vdFNwZWNpZmllZCAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkvLyBmaWxlIHZhbHVlIGlzIHNwZWNpZmllZCBidXQgZW1wdHkKLQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMywgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUpOwotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eUluY2x1ZGVGaWxlTm90U3BlY2lmaWVkLCBtc2dUZXh0LCBmaWxlKTsKLQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmaWxlVmFsdWVSZWdpb24pOwotCQkJCWludCBsZW5ndGggPSBmaWxlVmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vICsgMSk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJUGF0aCB0ZXN0UGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShmaWxlLmdldEZ1bGxQYXRoKCksIGZpbGVWYWx1ZSk7Ci0JCQkJaWYgKHRlc3RQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlJRmlsZSB0ZXN0RmlsZSA9IGZpbGUuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUodGVzdFBhdGgpOwotCQkJCQlhZGREZXBlbmRzT24odGVzdEZpbGUpOwotCQkJCQlpZiAoIXRlc3RGaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQlpZiAoZlNldmVyaXR5SW5jbHVkZUZpbGVNaXNzaW5nICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCQkJCS8vIEZpbGUgbm90IGZvdW5kCi0JCQkJCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzQsIG5ldyBTdHJpbmdbXXtmaWxlVmFsdWUsIHRlc3RQYXRoLnRvU3RyaW5nKCl9KTsKLQkJCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlJbmNsdWRlRmlsZU1pc3NpbmcsIG1zZ1RleHQsIGZpbGUpOwotCQkJCQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZpbGVWYWx1ZVJlZ2lvbik7Ci0JCQkJCQkJaW50IGxlbmd0aCA9IGZpbGVWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8gKyAxKTsKLQkJCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChmU2V2ZXJpdHlJbmNsdWRlRmlsZU5vdFNwZWNpZmllZCAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCS8vIGZpbGUgaXMgbm90IHNwZWNpZmllZCBhdCBhbGwKLQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlJbmNsdWRlRmlsZU5vdFNwZWNpZmllZCwgbXNnVGV4dCwgZmlsZSk7Ci0JCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8gKyAxKTsKLQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIGRvYwotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzUGFnZURpcmVjdGl2ZShJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIHN1cGVyY2xhc3NWYWx1ZVJlZ2lvbiA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKGRvY3VtZW50UmVnaW9uLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfRVhURU5EUyk7Ci0JCWlmIChzdXBlcmNsYXNzVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gZmlsZSBzcGVjaWZpZWQKLQkJCVN0cmluZyBzdXBlcmNsYXNzTmFtZSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQoc3VwZXJjbGFzc1ZhbHVlUmVnaW9uKTsKLQkJCXN1cGVyY2xhc3NOYW1lID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoc3VwZXJjbGFzc05hbWUpOwotCi0JCQlJVHlwZSBzdXBlckNsYXNzID0gbnVsbDsKLQkJCWlmIChzdXBlcmNsYXNzTmFtZSAhPSBudWxsICYmIHN1cGVyY2xhc3NOYW1lLmxlbmd0aCgpID4gMCAmJiBmUHJvamVjdCAhPSBudWxsICYmIGZQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3VwZXJDbGFzcyA9IGZQcm9qZWN0LmZpbmRUeXBlKHN1cGVyY2xhc3NOYW1lLnRyaW0oKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHN1cGVyQ2xhc3MgPT0gbnVsbCAmJiBmU2V2ZXJpdHlTdXBlckNsYXNzTm90Rm91bmQgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJLy8gc3VwZXJjbGFzcyBub3QgZm91bmQKLQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfOCwgc3VwZXJjbGFzc05hbWUpOwotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVN1cGVyQ2xhc3NOb3RGb3VuZCwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoc3VwZXJjbGFzc1ZhbHVlUmVnaW9uKTsKLQkJCQlpbnQgbGVuZ3RoID0gc3VwZXJjbGFzc1ZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZU5vID0gZG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vICsgMSk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1RhZ2xpYkRpcmVjdGl2ZShJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbiBwcmVmaXhWYWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHVyaVZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oZG9jdW1lbnRSZWdpb24sIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9VUkkpOwotCQlJVGV4dFJlZ2lvbiB0YWdkaXJWYWx1ZVJlZ2lvbiA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKGRvY3VtZW50UmVnaW9uLCBKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSKTsKLQkJaWYgKHVyaVZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIFVSSSBpcyBzcGVjaWZpZWQKLQkJCVN0cmluZyB1cmkgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHVyaVZhbHVlUmVnaW9uKTsKLQotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXVyaSA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKHVyaSk7Ci0JCQkJaWYgKHVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJSVRhZ2xpYlJlY29yZCByZWZlcmVuY2UgPSBUYWdsaWJJbmRleC5yZXNvbHZlKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB1cmksIGZhbHNlKTsKLQkJCQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCQlzd2l0Y2ggKHJlZmVyZW5jZS5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJCQkJCUlUTERSZWNvcmQgcmVjb3JkID0gKElUTERSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQkJCQkJSVJlc291cmNlIHRsZGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocmVjb3JkLmdldFBhdGgoKSk7Ci0JCQkJCQkJCWFkZERlcGVuZHNPbih0bGRmaWxlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQkJCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCQkJCQlJRmlsZVtdIGZvdW5kRmlsZXNGb3JMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24ocmVjb3JkLmdldExvY2F0aW9uKCkpOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvdW5kRmlsZXNGb3JMb2NhdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJYWRkRGVwZW5kc09uKGZvdW5kRmlsZXNGb3JMb2NhdGlvbltpXSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCQkJCQkJSVRhZ0RpclJlY29yZCByZWNvcmQgPSAoSVRhZ0RpclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCQkJCQlJUGF0aCBwYXRoID0gcmVjb3JkLmdldFBhdGgoKTsKLQkJCQkJCQkJSVJlc291cmNlIGZvdW5kID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgsIGZhbHNlKTsKLQotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJZm91bmQuYWNjZXB0KG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJCQkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCQkJCQkJCQlhZGREZXBlbmRzT24ocmVzb3VyY2UpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCAmJiBmU2V2ZXJpdHlUYWdsaWJVbnJlc29sdmFibGVVUkkgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJCQkvLyBVUkkgc3BlY2lmaWVkIGJ1dCBkb2VzIG5vdCByZXNvbHZlCi0JCQkJCQlTdHJpbmcgbXNnVGV4dCA9IG51bGw7Ci0JCQkJCQkvLyBwcm92aWRlIGJldHRlciBtZXNzYWdlcyBmb3IgdHlwaWNhbCAiaHR0cDoqIiBVUklzCi0JCQkJCQlpZiAodXJpLnN0YXJ0c1dpdGgoImh0dHA6IikgJiYgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0SlNQVmVyc2lvbihmaWxlLmdldEZ1bGxQYXRoKCkpIDwgMS4yKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5pc0R5bmFtaWNXZWJQcm9qZWN0KGZpbGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQltc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl85LCB1cmkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMTAsIHVyaSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMSwgdXJpKTsKLQkJCQkJCX0KLQkJCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVRhZ2xpYlVucmVzb2x2YWJsZVVSSSwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh1cmlWYWx1ZVJlZ2lvbik7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gdXJpVmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyArIDEpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoIlBST0JMRU1fSUQiLCBuZXcgSW50ZWdlcig2MTEpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZlNldmVyaXR5VGFnbGliTWlzc2luZ1VSSSAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkJLy8gVVJJIHNwZWNpZmllZCBidXQgZW1wdHkgc3RyaW5nCi0JCQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVVJJKTsKLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5VGFnbGliTWlzc2luZ1VSSSwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHVyaVZhbHVlUmVnaW9uKTsKLQkJCQkJaW50IGxlbmd0aCA9IHVyaVZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vICsgMSk7Ci0JCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRhZ2RpclZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIFVSSSBpcyBzcGVjaWZpZWQKLQkJCVN0cmluZyB0YWdkaXIgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHRhZ2RpclZhbHVlUmVnaW9uKTsKLQotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXRhZ2RpciA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKHRhZ2Rpcik7Ci0JCQkJaWYgKHRhZ2Rpci5sZW5ndGgoKSA8PSAwICYmIGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkkgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJCS8vIHRhZ2RpciBzcGVjaWZpZWQgYnV0IGVtcHR5IHN0cmluZwotCQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMywgSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUik7Ci0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkksIG1zZ1RleHQsIGZpbGUpOwotCQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0YWdkaXJWYWx1ZVJlZ2lvbik7Ci0JCQkJCWludCBsZW5ndGggPSB0YWdkaXJWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyArIDEpOwotCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChUYWdsaWJJbmRleC5yZXNvbHZlKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0YWdkaXIsIGZhbHNlKSA9PSBudWxsICYmIGZTZXZlcml0eVRhZ2RpclVucmVzb2x2YWJsZVVSSSAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkJLy8gVVJJIHNwZWNpZmllZCBidXQgZG9lcyBub3QgcmVzb2x2ZQotCQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMSwgdGFnZGlyKTsKLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5VGFnbGliVW5yZXNvbHZhYmxlVVJJLCBtc2dUZXh0LCBmaWxlKTsKLQkJCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGFnZGlyVmFsdWVSZWdpb24pOwotCQkJCQlpbnQgbGVuZ3RoID0gdGFnZGlyVmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlpbnQgbGluZU5vID0gc0RvYy5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8gKyAxKTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZlNldmVyaXR5VGFnbGliTWlzc2luZ1VSSSAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCS8vIFVSSSBub3Qgc3BlY2lmaWVkIG9yIGVtcHR5IHN0cmluZwotCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzcsIG5ldyBTdHJpbmdbXXtKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVVJJfSk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlUYWdsaWJNaXNzaW5nVVJJLCBtc2dUZXh0LCBmaWxlKTsKLQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyArIDEpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHJlZml4VmFsdWVSZWdpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BSRUZJWCk7Ci0JCWlmIChwcmVmaXhWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBwcmVmaXggc3BlY2lmaWVkCi0JCQlTdHJpbmcgdGFnbGliUHJlZml4ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmVmaXhWYWx1ZVJlZ2lvbik7Ci0JCQl0YWdsaWJQcmVmaXggPSBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlcyh0YWdsaWJQcmVmaXgpOwotCi0JCQljb2xsZWN0VGFnbGliUHJlZml4KGRvY3VtZW50UmVnaW9uLCBwcmVmaXhWYWx1ZVJlZ2lvbiwgdGFnbGliUHJlZml4KTsKLQotCQkJaWYgKGlzUmVzZXJ2ZWRUYWdsaWJQcmVmaXgodGFnbGliUHJlZml4KSkgewotCQkJCS8vIHByZWZpeCBpcyBhIHJlc2VydmVkIHByZWZpeAotCQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8wLCB0YWdsaWJQcmVmaXgpOwotCQkJCWludCBzZXYgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IChmaWxlID09IG51bGwgPyBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIG1zZ1RleHQpIDogbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBtc2dUZXh0LCBmaWxlKSk7Ci0JCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJlZml4VmFsdWVSZWdpb24pOwotCQkJCWludCBsZW5ndGggPSBwcmVmaXhWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8gKyAxKTsKLQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCX0KLQkJCWlmICh0YWdsaWJQcmVmaXgubGVuZ3RoKCkgPT0gMCAmJiBmU2V2ZXJpdHlUYWdsaWJNaXNzaW5nUHJlZml4ICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCS8vIHByZWZpeCBpcyBzcGVjaWZpZWQgYnV0IGVtcHR5Ci0JCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzMsIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9QUkVGSVgpOwotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdQcmVmaXgsIG1zZ1RleHQsIGZpbGUpOwotCQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHByZWZpeFZhbHVlUmVnaW9uKTsKLQkJCQlpbnQgbGVuZ3RoID0gcHJlZml4VmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vICsgMSk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZlNldmVyaXR5VGFnbGliTWlzc2luZ1ByZWZpeCAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCS8vIHByZWZpeCBpcyBub3Qgc3BlY2lmaWVkCi0JCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMywgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BSRUZJWCk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlUYWdsaWJNaXNzaW5nUHJlZml4LCBtc2dUZXh0LCBmaWxlKTsKLQkJCWludCBzdGFydCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyArIDEpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydFRhZ2xpYkR1cGxpY2F0ZVByZWZpeGVzKElGaWxlIGZpbGUsIElSZXBvcnRlciByZXBvcnRlciwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZlNldmVyaXR5VGFnbGliRHVwbGljYXRlUHJlZml4V2l0aERpZmZlcmVudFVSSXMgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFICYmIGZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhTYW1lVVJJcyA9PSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nW10gcHJlZml4ZXMgPSAoU3RyaW5nW10pIGZUYWdsaWJQcmVmaXhlc0luVXNlLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCWZvciAoaW50IHByZWZpeE51bWJlciA9IDA7IHByZWZpeE51bWJlciA8IHByZWZpeGVzLmxlbmd0aDsgcHJlZml4TnVtYmVyKyspIHsKLQkJCWludCBzZXZlcml0eSA9IGZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhTYW1lVVJJczsKLQotCQkJT2JqZWN0IG8gPSBmVGFnbGliUHJlZml4ZXNJblVzZS5nZXQocHJlZml4ZXNbcHJlZml4TnVtYmVyXSk7Ci0JCQkvKgotCQkJICogT25seSBjYXJlIGlmIGl0J3MgYSBMaXN0IChiZWNhdXNlIHRoZXJlIHdhcyBtb3JlIHRoYW4gb25lCi0JCQkgKiBkaXJlY3RpdmUgd2l0aCB0aGF0IHByZWZpeCkgYW5kIGlmIHdlJ3JlIHN1cHBvc2VkIHRvIHJlcG9ydAotCQkJICogZHVwbGljYXRlcwotCQkJICovCi0JCQlpZiAobyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlMaXN0IHZhbHVlUmVnaW9ucyA9IChMaXN0KSBvOwotCQkJCVN0cmluZyB1cmkgPSBudWxsOwotCQkJCWZvciAoaW50IHJlZ2lvbk51bWJlciA9IDA7IHJlZ2lvbk51bWJlciA8IHZhbHVlUmVnaW9ucy5zaXplKCk7IHJlZ2lvbk51bWJlcisrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZlByZWZpeFZhbHVlUmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcC5nZXQodmFsdWVSZWdpb25zLmdldChyZWdpb25OdW1iZXIpKTsKLQkJCQkJSVRleHRSZWdpb24gdXJpVmFsdWVSZWdpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1VSSSk7Ci0JCQkJCWlmICh1cmlWYWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQl1cmlWYWx1ZVJlZ2lvbiA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKGRvY3VtZW50UmVnaW9uLCBKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSKTsKLQkJCQkJfQotCQkJCQlpZiAodXJpVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHVyaTIgPSBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlcyhkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHVyaVZhbHVlUmVnaW9uKSk7Ci0JCQkJCQlpZiAodXJpID09IG51bGwpIHsKLQkJCQkJCQl1cmkgPSB1cmkyOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaWYgKGNvbGxhdG9yLmNvbXBhcmUodXJpLCB1cmkyKSAhPSAwKSB7Ci0JCQkJCQkJCXNldmVyaXR5ID0gZlNldmVyaXR5VGFnbGliRHVwbGljYXRlUHJlZml4V2l0aERpZmZlcmVudFVSSXM7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHNldmVyaXR5ICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMiwgcHJlZml4ZXNbcHJlZml4TnVtYmVyXSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCi0JCQkJCS8vIFJlcG9ydCBhbiBlcnJvciBpbiBhbGwgZGlyZWN0aXZlcyB1c2luZyB0aGlzIHByZWZpeAotCQkJCQlmb3IgKGludCByZWdpb25OdW1iZXIgPSAwOyByZWdpb25OdW1iZXIgPCB2YWx1ZVJlZ2lvbnMuc2l6ZSgpOyByZWdpb25OdW1iZXIrKykgewotCi0JCQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgdmFsdWVSZWdpb25zLmdldChyZWdpb25OdW1iZXIpOwotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBmUHJlZml4VmFsdWVSZWdpb25Ub0RvY3VtZW50UmVnaW9uTWFwLmdldCh2YWx1ZVJlZ2lvbik7Ci0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSAoZmlsZSA9PSBudWxsID8gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2ZXJpdHksIG1zZ1RleHQpIDogbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2ZXJpdHksIG1zZ1RleHQsIGZpbGUpKTsKLQotCQkJCQkJLy8gaWYgdGhlcmUncyBhIG1lc3NhZ2UsIHRoZXJlIHdhcyBhbiBlcnJvciBmb3VuZAotCQkJCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pOwotCQkJCQkJaW50IGxlbmd0aCA9IHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCWludCBsaW5lTm8gPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vICsgMSk7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiB1c2VQcm9qZWN0ID0gZmFsc2U7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWZQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJZlByZWZlcmVuY2VzID0gbmV3IFByb2plY3RTY29wZShmUHJvamVjdC5nZXRQcm9qZWN0KCkpLmdldE5vZGUoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUik7Ci0JCQl1c2VQcm9qZWN0ID0gZlByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVNFX1BST0pFQ1RfU0VUVElOR1MsIGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZQcm9qZWN0ID0gbnVsbDsKLQkJfQotCi0JCWlmICghdXNlUHJvamVjdCkgewotCQkJZlByZWZlcmVuY2VzID0gbmV3IEluc3RhbmNlU2NvcGUoKS5nZXROb2RlKFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVubG9hZFByZWZlcmVuY2VzKCkgewotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQkJZlNjb3BlcyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogYmF0Y2ggdmFsaWRhdGlvbiBjYWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoREVCVUcpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2YWxpZGF0aW5nOiAiICsgZik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGYpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJcGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIHNNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BFTFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEVMVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODQ1MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEVMVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuVG9rZW5NZ3JFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgSlNQRUxWYWxpZGF0b3IgZXh0ZW5kcyBKU1BWYWxpZGF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B2YWxpZGF0b3IiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQJCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SRUdJT05TID0gMTAwMDsKLQkKLQlwcml2YXRlIElWYWxpZGF0b3IgZk1lc3NhZ2VPcmlnaW5hdG9yOwotCi0JcHVibGljIEpTUEVMVmFsaWRhdG9yKCkgewotCQl0aGlzLmZNZXNzYWdlT3JpZ2luYXRvciA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEpTUEVMVmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmlsZShJRmlsZSBmaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmFsaWRhdGluZzogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgJiYgbW9kZWwgIT0gbnVsbCkgewotCQkJCXBlcmZvcm1WYWxpZGF0aW9uKGZpbGUsIHJlcG9ydGVyLCBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG51bGwgIT0gbW9kZWwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0JcHJpdmF0ZSBJU2NvcGVDb250ZXh0W10gZlNjb3BlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFByZWZlcmVuY2VzKElGaWxlIGZpbGUpIHsKLQkJZlNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJUHJvamVjdFNjb3BlIHByb2plY3RTY29wZSA9IG5ldyBQcm9qZWN0U2NvcGUoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkJaWYgKHByb2plY3RTY29wZS5nZXROb2RlKFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIpLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1VTRV9QUk9KRUNUX1NFVFRJTkdTLCBmYWxzZSkpIHsKLQkJCQlmU2NvcGVzID0gbmV3IElTY29wZUNvbnRleHRbXXtwcm9qZWN0U2NvcGUsIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JaW50IGdldE1lc3NhZ2VTZXZlcml0eShTdHJpbmcga2V5KSB7Ci0JCWludCBzZXYgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldEludChQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSLCBrZXksIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgZlNjb3Blcyk7Ci0JCXN3aXRjaCAoc2V2KSB7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSU5GT1JNQVRJT04gOgotCQkJCXJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSA6Ci0JCQkJcmV0dXJuIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRTsKLQkJfQotCQlyZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdW5sb2FkUHJlZmVyZW5jZXMoKSB7Ci0JCWZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCQlmU2NvcGVzID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihJRmlsZSBmaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvYykgewotCQlsb2FkUHJlZmVyZW5jZXMoZmlsZSk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VyTm9kZSA9IHN0cnVjdHVyZWREb2MuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKG51bGwgIT0gY3VyTm9kZSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJaWYgKGN1ck5vZGUuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCAmJiBjdXJOb2RlLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUICYmIGN1ck5vZGUuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJdmFsaWRhdGVSZWdpb25Db250YWluZXIoY3VyTm9kZSwgcmVwb3J0ZXIsIGZpbGUpOwotCQkJfQotCQkJY3VyTm9kZSA9IGN1ck5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXVubG9hZFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWdpb25Db250YWluZXIoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlKSB7Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24gPSBjb250YWluZXI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlICE9IG51bGwgJiYgcmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudFJlZ2lvbiA9ICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24pOwotCQkJCUl0ZXJhdG9yIGNoaWxkUmVnaW9ucyA9IHBhcmVudFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoY2hpbGRSZWdpb25zLmhhc05leHQoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBjaGlsZFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgY2hpbGRSZWdpb25zLm5leHQoKTsKLQkJCQkJLyogWzEzNjc5NV0gVmFsaWRhdGUgZXZlcnl0aGluZyBpbiB0aGUgRUwgY29udGFpbmVyLCBub3QganVzdCBKU1BfRUxfQ09OVEVOVCAqLwotCQkJCQlpZiAoY2hpbGRSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9PUEVOKQotCQkJCQkJdmFsaWRhdGVFTENvbnRlbnQocGFyZW50UmVnaW9uLCBjaGlsZFJlZ2lvbiwgY2hpbGRSZWdpb25zLCByZXBvcnRlciwgZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRUxDb250ZW50KElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXIsIElUZXh0UmVnaW9uIGVsT3BlblJlZ2lvbiwgSXRlcmF0b3IgZWxSZWdpb25zLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUpIHsKLQkJaW50IGNvbnRlbnRTdGFydCA9IGVsT3BlblJlZ2lvbi5nZXRFbmQoKTsKLQkJaW50IGNvbnRlbnREb2NTdGFydCA9IGNvbnRhaW5lci5nZXRFbmRPZmZzZXQoZWxPcGVuUmVnaW9uKTsKLQkJaW50IGNvbnRlbnRMZW5ndGggPSBjb250YWluZXIuZ2V0TGVuZ3RoKCk7Ci0JCWludCByZWdpb25Db3VudCA9IDA7Ci0JCUlUZXh0UmVnaW9uIGVsUmVnaW9uID0gbnVsbDsKLQkJLyogRmluZCB0aGUgRUwgY2xvc2luZyByZWdpb24sIG90aGVyd2lzZSB0aGUgbGFzdCByZWdpb24gd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgRUwgY29udGVudCB0ZXh0ICovCi0JCXdoaWxlIChlbFJlZ2lvbnMgIT0gbnVsbCAmJiBlbFJlZ2lvbnMuaGFzTmV4dCgpICYmIChyZWdpb25Db3VudCsrIDwgTUFYX1JFR0lPTlMpKSB7Ci0JCQllbFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZWxSZWdpb25zLm5leHQoKTsKLQkJCWlmIChlbFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NMT1NFKQotCQkJCWJyZWFrOwotCQl9Ci0JCQotCQlTdHJpbmcgZWxUZXh0ID0gY29udGFpbmVyLmdldEZ1bGxUZXh0KCkuc3Vic3RyaW5nKGNvbnRlbnRTdGFydCwgKGVsUmVnaW9uICE9IG51bGwpID8gZWxSZWdpb24uZ2V0U3RhcnQoKSA6IChjb250ZW50TGVuZ3RoIC0gMSkpOwotCQlKU1BFTFBhcnNlciBlbFBhcnNlciA9IEpTUEVMUGFyc2VyLmNyZWF0ZVBhcnNlcihlbFRleHQpOwotCQl0cnkgewotCQkJZWxQYXJzZXIuRXhwcmVzc2lvbigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpbnQgc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9FTF9TWU5UQVgpOwotCQkJaWYgKHNldiAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQlUb2tlbiBjdXJUb2sgPSBlLmN1cnJlbnRUb2tlbjsKLQkJCQlpbnQgcHJvYmxlbVN0YXJ0T2Zmc2V0ID0gY29udGVudERvY1N0YXJ0ICsgY3VyVG9rLmJlZ2luQ29sdW1uOwotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgSlNQQ29yZU1lc3NhZ2VzLkpTUEVMX1N5bnRheCk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQocHJvYmxlbVN0YXJ0T2Zmc2V0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChjdXJUb2suZW5kQ29sdW1uIC0gY3VyVG9rLmJlZ2luQ29sdW1uICsgMSk7Ci0JCQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QoZmlsZSk7Ci0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChUb2tlbk1nckVycm9yIHRlKSB7Ci0JCQlpbnQgc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9FTF9MRVhFUik7Ci0JCQlpZiAoc2V2ICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgSlNQQ29yZU1lc3NhZ2VzLkpTUEVMX1Rva2VuKTsKLQkJCQltZXNzYWdlLnNldE9mZnNldChjb250ZW50RG9jU3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGNvbnRlbnRMZW5ndGgpOwotCQkJCW1lc3NhZ2Uuc2V0VGFyZ2V0T2JqZWN0KGZpbGUpOwotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWE1MTm9kZShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyLCBJVGV4dFJlZ2lvbiByZWdpb24sIElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZWxUZXh0ID0gY29udGFpbmVyLmdldFRleHQocmVnaW9uKTsKLQkJSlNQRUxQYXJzZXIgZWxQYXJzZXIgPSBKU1BFTFBhcnNlci5jcmVhdGVQYXJzZXIoZWxUZXh0KTsKLQkJaW50IGNvbnRlbnRTdGFydCA9IGNvbnRhaW5lci5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQlpbnQgY29udGVudExlbmd0aCA9IGNvbnRhaW5lci5nZXRMZW5ndGgoKTsKLQkJdHJ5IHsKLQkJCWVsUGFyc2VyLkV4cHJlc3Npb24oKTsKLQkJfQotCQljYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotCQkJaW50IHNldiA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRUxfU1lOVEFYKTsKLQkJCWlmIChzZXYgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJVG9rZW4gY3VyVG9rID0gZS5jdXJyZW50VG9rZW47Ci0JCQkJaW50IHByb2JsZW1TdGFydE9mZnNldCA9IGNvbnRlbnRTdGFydCArIGN1clRvay5iZWdpbkNvbHVtbjsKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIEpTUENvcmVNZXNzYWdlcy5KU1BFTF9TeW50YXgpOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHByb2JsZW1TdGFydE9mZnNldCk7Ci0JCQkJbWVzc2FnZS5zZXRMZW5ndGgoY3VyVG9rLmVuZENvbHVtbiAtIGN1clRvay5iZWdpbkNvbHVtbiArIDEpOwotCQkJCW1lc3NhZ2Uuc2V0VGFyZ2V0T2JqZWN0KGZpbGUpOwotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoVG9rZW5NZ3JFcnJvciB0ZSkgewotCQkJaW50IHNldiA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRUxfTEVYRVIpOwotCQkJaWYgKHNldiAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIEpTUENvcmVNZXNzYWdlcy5KU1BFTF9Ub2tlbik7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoY29udGVudFN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChjb250ZW50TGVuZ3RoKTsKLQkJCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChmaWxlKTsKLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQSmF2YVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEphdmFWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3ZjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQSmF2YVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25FeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BKYXZhVmFsaWRhdG9yIGV4dGVuZHMgSlNQVmFsaWRhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdmFsaWRhdG9yIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIGZNZXNzYWdlT3JpZ2luYXRvcjsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUiA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCXByaXZhdGUgSVNjb3BlQ29udGV4dFtdIGZTY29wZXMgPSBudWxsOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVBEQVRFX0pBVkFfVEFTS1MgPSB0cnVlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1RBU0tfTUFSS0VSX1RZUEUgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUudGFzayI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERVBFTkRfT05zID0gbmV3IFN0cmluZ1tdeyIuY2xhc3NwYXRoIiwgIi5wcm9qZWN0IiwgIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyIsICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnByZWZzIiwgIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwiLCAiLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50In07Ci0KLQlwdWJsaWMgSlNQSmF2YVZhbGlkYXRvcigpIHsKLQkJdGhpcy5mTWVzc2FnZU9yaWdpbmF0b3IgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBKU1BKYXZhVmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEFzc3VtZWQgdGhlIG1lc3NhZ2Ugb2Zmc2V0IGlzIGFuIGluZGlyZWN0IHBvc2l0aW9uLiBJbiBvdGhlciB3b3JkcywgYW4KLQkgKiBlcnJvciBmcm9tIGFuIGluY2x1ZGVkIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG0KLQkgKiBAcGFyYW0gdHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0SW5kaXJlY3RQb3NpdGlvbihJTWVzc2FnZSBtLCBJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQotCQlpZiAoISh0cmFuc2xhdGlvbiBpbnN0YW5jZW9mIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uKSkKLQkJCXJldHVybjsKLQotCQlJRG9jdW1lbnQganNwRG9jID0gKChKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbikgdHJhbnNsYXRpb24pLmdldEpzcERvY3VtZW50KCk7Ci0JCWlmICghKGpzcERvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYyA9IChJU3RydWN0dXJlZERvY3VtZW50KSBqc3BEb2M7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gc0RvYy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKDAsIG0uZ2V0T2Zmc2V0KCkgKyBtLmdldExlbmd0aCgpKTsKLQkJLy8gaXRlcmF0ZSBiYWNrd2FyZHMgdW50aWwgeW91IGhpdCB0aGUgaW5jbHVkZSBkaXJlY3RpdmUKLQkJZm9yIChpbnQgaSA9IHJlZ2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gcmVnaW9uc1tpXTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCWlmIChnZXREaXJlY3RpdmVOYW1lKHJlZ2lvbikuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlJVGV4dFJlZ2lvbiBmaWxlVmFsdWVSZWdpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihyZWdpb24sICJmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGZpbGVWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQltLnNldE9mZnNldChyZWdpb24uZ2V0U3RhcnRPZmZzZXQoZmlsZVZhbHVlUmVnaW9uKSk7Ci0JCQkJCQltLnNldExlbmd0aChmaWxlVmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW0uc2V0T2Zmc2V0KHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJCW0uc2V0TGVuZ3RoKHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJCS8qKgotCQkJCQkgKiBCdWcgMjE5NzYxIC0gU3ludGF4IGVycm9yIHJlcG9ydGVkIGF0IHdyb25nIGxvY2F0aW9uCi0JCQkJCSAqIChkb24ndCBmb3JnZXQgdG8gYWRqdXN0IHRoZSBsaW5lIG51bWJlciwgdG9vKQotCQkJCQkgKi8KLQkJCQkJbS5zZXRMaW5lTm8oc0RvYy5nZXRMaW5lT2ZPZmZzZXQobS5nZXRPZmZzZXQoKSkgKyAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJTWVzc2FnZSBmcm9tIGFzbiBJUHJvYmxlbQotCSAqIAotCSAqIEBwYXJhbSBwcm9ibGVtCi0JICogQHBhcmFtIGYKLQkgKiBAcGFyYW0gdHJhbnNsYXRpb24KLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvYwotCSAqIEByZXR1cm4gbWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvYmxlbSwgb3IgbnVsbCBpZiBpdCBjb3VsZCBub3QKLQkgKiAgICAgICAgIGNyZWF0ZSBvbmUKLQkgKi8KLQlwcml2YXRlIElNZXNzYWdlIGNyZWF0ZU1lc3NhZ2VGcm9tUHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtLCBJRmlsZSBmLCBJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvYykgewotCQlpbnQgc2V2ID0gLTE7Ci0JCWludCBzb3VyY2VTdGFydCA9IC0xOwotCQlpbnQgc291cmNlRW5kID0gLTE7Ci0KLQkJaWYgKHByb2JsZW0gaW5zdGFuY2VvZiBJSlNQUHJvYmxlbSkgewotCQkJc291cmNlU3RhcnQgPSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCk7Ci0JCQlzb3VyY2VFbmQgPSBwcm9ibGVtLmdldFNvdXJjZUVuZCgpOwotCQkJc3dpdGNoICgoKElKU1BQcm9ibGVtKSBwcm9ibGVtKS5nZXRFSUQoKSkgewotCQkJCWNhc2UgSUpTUFByb2JsZW0uVEVJQ2xhc3NOb3RGb3VuZCA6Ci0JCQkJCXNldiA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9GT1VORCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUpTUFByb2JsZW0uVEVJVmFsaWRhdGlvbk1lc3NhZ2UgOgotCQkJCQlzZXYgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9WQUxJREFUSU9OX01FU1NBR0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKU1BQcm9ibGVtLlRFSUNsYXNzTm90SW5zdGFudGlhdGVkIDoKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0lOU1RBTlRJQVRFRCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUpTUFByb2JsZW0uVEVJQ2xhc3NNaXNjIDoKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfUlVOVElNRV9FWENFUFRJT04pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKU1BQcm9ibGVtLlRhZ0NsYXNzTm90Rm91bmQgOgotCQkJCQlzZXYgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RBR19IQU5ETEVSX0NMQVNTX05PVF9GT1VORCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUpTUFByb2JsZW0uVXNlQmVhbkludmFsaWRJRCA6Ci0JCQkJCXNldiA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9JTlZBTElEX0lEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJSlNQUHJvYmxlbS5Vc2VCZWFuTWlzc2luZ1R5cGVJbmZvIDoKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0JFQU5fTUlTU0lOR19UWVBFX0lORk8pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKU1BQcm9ibGVtLlVzZUJlYW5BbWJpZ3VvdXNUeXBlIDoKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0FNQklHVU9VU19UWVBFX0lORk8pOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJc2V2ID0gcHJvYmxlbS5pc0Vycm9yKCkgPyBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZIDogKHByb2JsZW0uaXNXYXJuaW5nKCkgPyBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkgOiBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpOwotCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzb3VyY2VTdGFydCA9IHRyYW5zbGF0aW9uLmdldEpzcE9mZnNldChwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkpOwotCQkJc291cmNlRW5kID0gdHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KHByb2JsZW0uZ2V0U291cmNlRW5kKCkpOwotCQkJc3dpdGNoIChwcm9ibGVtLmdldElEKCkpIHsKLQkJCQljYXNlIElQcm9ibGVtLkxvY2FsVmFyaWFibGVJc05ldmVyVXNlZCA6IHsKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX0xPQ0FMX1ZBUklBQkxFX05FVkVSX1VTRUQpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUHJvYmxlbS5OdWxsTG9jYWxWYXJpYWJsZVJlZmVyZW5jZSA6IHsKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFKTsKLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVByb2JsZW0uQXJndW1lbnRJc05ldmVyVXNlZCA6IHsKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX0FSR1VNRU5UX0lTX05FVkVSX1VTRUQpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUHJvYmxlbS5Qb3RlbnRpYWxOdWxsTG9jYWxWYXJpYWJsZVJlZmVyZW5jZSA6IHsKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRSk7Ci0JCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElQcm9ibGVtLlVudXNlZEltcG9ydCA6IHsKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX1VOVVNFRF9JTVBPUlQpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUHJvYmxlbS5NaXNzaW5nU2VyaWFsVmVyc2lvbiA6IHsKLQkJCQkJLy8gSlNQIGZpbGVzIGRvbid0IGdldCBzZXJpYWxpemVkLi4ucmlnaHQ/Ci0JCQkJCXNldiA9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0IDogewotCQkJCQlpZiAocHJvYmxlbS5pc0Vycm9yKCkpIHsKLQkJCQkJCXNldiA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocHJvYmxlbS5pc1dhcm5pbmcoKSkgewotCQkJCQkJc2V2ID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2V2ID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQkJCQl9Ci0JCQkJfQotCQkJCQlpZiAoc2V2ID09IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQkvKiBwcm9ibGVtcyB3aXRob3V0IEpTUCBwb3NpdGlvbnMgYXJlIGluIGdlbmVyYXRlZCBjb2RlICovCi0JCQkJCWlmIChzb3VyY2VTdGFydCA9PSAtMSkgewotCQkJCQkJaW50IHByb2JsZW1JRCA9IHByb2JsZW0uZ2V0SUQoKTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBRdW90aW5nIElQcm9ibGVtIGRvYzogIldoZW4gYSBwcm9ibGVtIGlzIHRhZ2dlZCBhcwotCQkJCQkJICogSW50ZXJuYWwsIGl0IG1lYW5zIHRoYXQgbm8gY2hhbmdlIG90aGVyIHRoYW4gYQotCQkJCQkJICogbG9jYWwgc291cmNlIGNvZGUgY2hhbmdlIGNhbiBmaXggdGhlIGNvcnJlc3BvbmRpbmcKLQkJCQkJCSAqIHByb2JsZW0uIiBBc3N1bWluZyB0aGF0IG91ciBnZW5lcmF0ZWQgY29kZSBpcwotCQkJCQkJICogY29ycmVjdCwgdGhhdCBzaG91bGQgcmVkdWNlIHRoZSByZXBvcnRlZCBwcm9ibGVtcwotCQkJCQkJICogdG8gdGhvc2UgdGhlIHVzZXIgY2FuIGNvcnJlY3QuCi0JCQkJCQkgKi8KLQkJCQkJCWlmICgoKHByb2JsZW1JRCAmIElQcm9ibGVtLkludGVybmFsKSAhPSAwKSAmJiAoKHByb2JsZW1JRCAmIElQcm9ibGVtLlN5bnRheCkgIT0gMCkgJiYgdHJhbnNsYXRpb24gaW5zdGFuY2VvZiBKU1BUcmFuc2xhdGlvbikgewotCQkJCQkJCS8vIEF0dGFjaCB0byB0aGUgbGFzdCBjb2RlIHNjcmlwdGluZyBzZWN0aW9uCi0JCQkJCQkJSlNQVHJhbnNsYXRpb24ganNwVHJhbnNsYXRpb24gPSAoKEpTUFRyYW5zbGF0aW9uKSB0cmFuc2xhdGlvbik7Ci0JCQkJCQkJUG9zaXRpb25bXSBqc3BQb3NpdGlvbnMgPSAoUG9zaXRpb25bXSkganNwVHJhbnNsYXRpb24uZ2V0SnNwMkphdmFNYXAoKS5rZXlTZXQoKS50b0FycmF5KG5ldyBQb3NpdGlvbltqc3BUcmFuc2xhdGlvbi5nZXRKc3AySmF2YU1hcCgpLnNpemUoKV0pOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwganNwUG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXNvdXJjZVN0YXJ0ID0gTWF0aC5tYXgoc291cmNlU3RhcnQsIGpzcFBvc2l0aW9uc1tpXS5nZXRPZmZzZXQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCUlNZXNzYWdlIG0gPSBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIHByb2JsZW0uZ2V0TWVzc2FnZSgpLCBmKTsKLQkJCQkJCQltLnNldE9mZnNldChzb3VyY2VTdGFydCk7Ci0JCQkJCQkJbS5zZXRMZW5ndGgoMSk7Ci0JCQkJCQkJcmV0dXJuIG07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzZXYgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGxpbmUgbnVtYmVyIGZvciBtYXJrZXIgc3RhcnRzIEAgMQotCQkvLyBsaW5lIG51bWJlciBmcm9tIGRvY3VtZW50IHN0YXJ0cyBAIDAKLQkJaW50IGxpbmVObyA9IHN0cnVjdHVyZWREb2MuZ2V0TGluZU9mT2Zmc2V0KHNvdXJjZVN0YXJ0KSArIDE7Ci0KLQkJSU1lc3NhZ2UgbSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgcHJvYmxlbS5nZXRNZXNzYWdlKCksIGYpOwotCi0JCW0uc2V0TGluZU5vKGxpbmVObyk7Ci0JCW0uc2V0T2Zmc2V0KHNvdXJjZVN0YXJ0KTsKLQkJbS5zZXRMZW5ndGgoc291cmNlRW5kIC0gc291cmNlU3RhcnQgKyAxKTsKLQotCQkvLyBuZWVkIGFkZGl0aW9uYWwgYWRqdXN0bWVudCBmb3IgcHJvYmxlbXMgZnJvbQotCQkvLyBpbmRpcmVjdCAoaW5jbHVkZWQpIGZpbGVzCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTk2MzMKLQkJaWYgKHRyYW5zbGF0aW9uLmlzSW5kaXJlY3QocHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpKSkgewotCQkJYWRqdXN0SW5kaXJlY3RQb3NpdGlvbihtLCB0cmFuc2xhdGlvbik7Ci0JCX0KLQotCQlyZXR1cm4gbTsKLQl9Ci0KLQlpbnQgZ2V0TWVzc2FnZVNldmVyaXR5KFN0cmluZyBrZXkpIHsKLQkJaW50IHNldiA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0SW50KFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIsIGtleSwgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBmU2NvcGVzKTsKLQkJc3dpdGNoIChzZXYpIHsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgOgotCQkJCXJldHVybiBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JTkZPUk1BVElPTiA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLkxPV19TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFIDoKLQkJCQlyZXR1cm4gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFOwotCQl9Ci0JCXJldHVybiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlcyhJRmlsZSBmaWxlKSB7Ci0JCWZTY29wZXMgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0KLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCVByb2plY3RTY29wZSBwcm9qZWN0U2NvcGUgPSBuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChwcm9qZWN0U2NvcGUuZ2V0Tm9kZShQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSKS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9VU0VfUFJPSkVDVF9TRVRUSU5HUywgZmFsc2UpKSB7Ci0JCQkJZlNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117cHJvamVjdFNjb3BlLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBERVBFTkRfT05zLmxlbmd0aDsgaSsrKSB7Ci0JCQlhZGREZXBlbmRzT24oZi5nZXRQcm9qZWN0KCkuZ2V0RmlsZShERVBFTkRfT05zW2ldKSk7CQotCQl9Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCQlNb2RlbEhhbmRsZXJGb3JKU1AuZW5zdXJlVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeShkb21Nb2RlbCk7Ci0KLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyIHRyYW5zbGF0aW9uQWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQlJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQotCQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJbG9hZFByZWZlcmVuY2VzKGYpOwotCi0JCQkJLy8gb25seSB1cGRhdGUgdGFzayBtYXJrZXJzIGlmIHRoZSBtb2RlbCBpcyB0aGUgc2FtZSBhcyB3aGF0J3Mgb24gZGlzawotCQkJCWJvb2xlYW4gdXBkYXRlSmF2YVRhc2tzID0gVVBEQVRFX0pBVkFfVEFTS1MgJiYgIWRvbU1vZGVsLmlzRGlydHkoKSAmJiBmICE9IG51bGwgJiYgZi5pc0FjY2Vzc2libGUoKTsKLQkJCQlpZiAodXBkYXRlSmF2YVRhc2tzKSB7Ci0JCQkJCS8vIHJlbW92ZSBvbGQgSmF2YSB0YXNrIG1hcmtlcnMKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNYXJrZXJbXSBmb3VuZE1hcmtlcnMgPSBmLmZpbmRNYXJrZXJzKEpBVkFfVEFTS19NQVJLRVJfVFlQRSwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX09ORSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvdW5kTWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWZvdW5kTWFya2Vyc1tpXS5kZWxldGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJdHJhbnNsYXRpb24uc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUodHJ1ZSk7Ci0JCQkJdHJhbnNsYXRpb24ucmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJTGlzdCBwcm9ibGVtcyA9IHRyYW5zbGF0aW9uLmdldFByb2JsZW1zKCk7Ci0JCQkJLy8gYWRkIG5ldyBtZXNzYWdlcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbXMuc2l6ZSgpICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkJSVByb2JsZW0gcHJvYmxlbSA9IChJUHJvYmxlbSkgcHJvYmxlbXMuZ2V0KGkpOwotCQkJCQlJTWVzc2FnZSBtID0gY3JlYXRlTWVzc2FnZUZyb21Qcm9ibGVtKHByb2JsZW0sIGYsIHRyYW5zbGF0aW9uLCBkb21Nb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJCWlmIChtICE9IG51bGwpIHsKLQkJCQkJCWlmIChwcm9ibGVtLmdldElEKCkgPT0gSVByb2JsZW0uVGFzaykgewotCQkJCQkJCWlmICh1cGRhdGVKYXZhVGFza3MpIHsKLQkJCQkJCQkJLy8gYWRkIG5ldyBKYXZhIHRhc2sgbWFya2VyCi0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlJTWFya2VyIHRhc2sgPSBmLmNyZWF0ZU1hcmtlcihKQVZBX1RBU0tfTUFSS0VSX1RZUEUpOwotCQkJCQkJCQkJdGFzay5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgbmV3IEludGVnZXIobS5nZXRMaW5lTnVtYmVyKCkpKTsKLQkJCQkJCQkJCXRhc2suc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgbmV3IEludGVnZXIobS5nZXRPZmZzZXQoKSkpOwotCQkJCQkJCQkJdGFzay5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIobS5nZXRPZmZzZXQoKSArIG0uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCQkJCXRhc2suc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgbS5nZXRUZXh0KCkpOwotCQkJCQkJCQkJdGFzay5zZXRBdHRyaWJ1dGUoSU1hcmtlci5VU0VSX0VESVRBQkxFLCBCb29sZWFuLkZBTFNFKTsKLQotCQkJCQkJCQkJc3dpdGNoIChtLmdldFNldmVyaXR5KCkpIHsKLQkJCQkJCQkJCQljYXNlIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk6IHsKLQkJCQkJCQkJCQkJdGFzay5zZXRBdHRyaWJ1dGUoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9ISUdIKSk7Ci0JCQkJCQkJCQkJCXRhc2suc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfRVJST1IpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWNhc2UgSU1lc3NhZ2UuTE9XX1NFVkVSSVRZIDogewotCQkJCQkJCQkJCQl0YXNrLnNldEF0dHJpYnV0ZShJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX0xPVykpOwotCQkJCQkJCQkJCQl0YXNrLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX0lORk8pKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCWRlZmF1bHQgOiB7Ci0JCQkJCQkJCQkJCXRhc2suc2V0QXR0cmlidXRlKElNYXJrZXIuUFJJT1JJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuUFJJT1JJVFlfTk9STUFMKSk7Ci0JCQkJCQkJCQkJCXRhc2suc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfV0FSTklORykpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXVubG9hZFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVubG9hZFByZWZlcmVuY2VzKCkgewotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQkJZlNjb3BlcyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoREVCVUcpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2YWxpZGF0aW5nOiAiICsgZik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZ2V0IGpzcCBtb2RlbCwgZ2V0IHRyYW5sc2F0aW9uCi0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGYpOwotCQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpICYmIG1vZGVsICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IERFUEVORF9PTnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYWRkRGVwZW5kc09uKGYuZ2V0UHJvamVjdCgpLmdldEZpbGUoREVQRU5EX09Oc1tpXSkpOwkKLQkJCQl9Ci0JCQkJLy8gZ2V0IGpzcCBtb2RlbCwgZ2V0IHRyYW5zbGF0aW9uCi0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGZNZXNzYWdlT3JpZ2luYXRvciwgZik7Ci0JCQkJCXBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBtb2RlbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY29yZCB0aGF0IHRoZSBjdXJyZW50bHkgdmFsaWRhdGluZyByZXNvdXJjZSBkZXBlbmRzIG9uIHRoZSBnaXZlbgotCSAqIGZpbGUuIE9ubHkgcG9zc2libGUgZHVyaW5nIGJhdGNoIChub3Qgc291cmNlKSB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZERlcGVuZHNPbihJRmlsZSBmaWxlKSB7Ci0JCWlmIChmTWVzc2FnZU9yaWdpbmF0b3IgaW5zdGFuY2VvZiBKU1BCYXRjaFZhbGlkYXRvcikgewotCQkJKChKU1BCYXRjaFZhbGlkYXRvcikgZk1lc3NhZ2VPcmlnaW5hdG9yKS5hZGREZXBlbmRzT24oZmlsZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiMjBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBQZXJmb3JtcyBzb21lIGNvbW1vbiBKU1AgdmFsaWRhdGlvbiB0YXNrcwotICovCi1wdWJsaWMgY2xhc3MgSlNQVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfSlNQX0NPUkUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZKU1BGQ29udGVudFR5cGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQotCQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7Ci0KLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQkJfQotCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCQlzdXBlcihudWxsLCBzZXZlcml0eSwgbnVsbCk7Ci0JCQlzZXRMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKLQkJCXNldFRhcmdldE9iamVjdCh0YXJnZXRPYmplY3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQkJX21lc3NhZ2UgPSBtZXNzYWdlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIF9tZXNzYWdlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCi0JCXByaXZhdGUgTGlzdCBmRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZkNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JCXByaXZhdGUgSVJlcG9ydGVyIGZSZXBvcnRlciA9IG51bGw7Ci0KLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKElSZXBvcnRlciByZXBvcnRlcikgewotCQkJZlJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQkvLyBjaGVjayB2YWxpZGF0aW9uCi0JCQlpZiAoZlJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0KLQkJCQlpZiAoaXNKU1BUeXBlKHByb3h5LmdldE5hbWUoKSkpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0KLQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBKU1BWYWxpZGF0b3IgYWRkaW5nIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZGaWxlcy5hZGQoZmlsZSk7Ci0KLQkJCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBmaW5hbCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSBmRmlsZXMudG9BcnJheShuZXcgSUZpbGVbZkZpbGVzLnNpemUoKV0pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgbGlzdCBvZiBjb250ZW50IHR5cGVzIHRoaXMgdmlzaXRvciBpcyBpbnRlcmVzdGVkIGluCi0JCSAqIAotCQkgKiBAcmV0dXJuIEFsbCBKU1AtcmVsYXRlZCBjb250ZW50IHR5cGVzCi0JCSAqLwotCQlwcml2YXRlIElDb250ZW50VHlwZVtdIGdldFZhbGlkQ29udGVudFR5cGVzKCkgewotCQkJaWYgKGZDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnRseSAiaGFyZC1jb2RlZCIgdG8gYmUganNwICYganNwZgotCQkJCWZDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW117UGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCksIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCl9OwotCQkJfQotCQkJcmV0dXJuIGZDb250ZW50VHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hlY2tzIGlmIGZpbGVOYW1lIGlzIHNvbWUgdHlwZSBvZiBKU1AgKGluY2x1ZGluZyBKU1AgZnJhZ21lbnRzKQotCQkgKiAKLQkJICogQHBhcmFtIGZpbGVOYW1lCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlbmFtZSBpbmRpY2F0ZXMgc29tZSB0eXBlIG9mIEpTUCwgZmFsc2UKLQkJICogICAgICAgICBvdGhlcndpc2UKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBpc0pTUFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZ2V0VmFsaWRDb250ZW50VHlwZXMoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNBc3NvY2lhdGVkV2l0aChmaWxlTmFtZSk7Ci0JCQkJKytpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJaWYgKHVyaXMubGVuZ3RoID4gMCkgewotCQkJSUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkvLyBtaWdodCBiZSBjYWxsZWQgd2l0aCBqdXN0IHByb2plY3QgcGF0aD8KLQkJCQljdXJyZW50RmlsZSA9IHdzUm9vdC5nZXRGaWxlKG5ldyBQYXRoKHVyaXNbaV0pKTsKLQkJCQlpZiAoY3VycmVudEZpbGUgIT0gbnVsbCAmJiBjdXJyZW50RmlsZS5leGlzdHMoKSkgewotCQkJCQlpZiAoc2hvdWxkVmFsaWRhdGUoY3VycmVudEZpbGUpICYmIGZyYWdtZW50Q2hlY2soY3VycmVudEZpbGUpKSB7Ci0KLQkJCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgdXJpc1tpXSk7Ci0JCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQotCQkJCQkJdmFsaWRhdGVGaWxlKGN1cnJlbnRGaWxlLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIHVyaXNbaV0gKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCS8vIGlmIHVyaXNbXSBsZW5ndGggMCAtPiB2YWxpZGF0ZSgpIGdldHMgY2FsbGVkIGZvciBlYWNoIHByb2plY3QKLQkJCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCi0JCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQkJCUpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IocmVwb3J0ZXIpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIGNvbGxlY3QgYWxsIGpzcCBmaWxlcyBmb3IgdGhlIHByb2plY3QKLQkJCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlJRmlsZVtdIGZpbGVzID0gdmlzaXRvci5nZXRGaWxlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkJaWYgKHNob3VsZFZhbGlkYXRlKGZpbGVzW2ldKSAmJiBmcmFnbWVudENoZWNrKGZpbGVzW2ldKSkgewotCQkJCQkJaW50IHBlcmNlbnQgPSAoaSAqIDEwMCkgLyBmaWxlcy5sZW5ndGggKyAxOwotCQkJCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBwZXJjZW50ICsgIiUgIiArIGZpbGVzW2ldLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQotCQkJCQkJdmFsaWRhdGVGaWxlKGZpbGVzW2ldLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIGZpbGVzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgKGZvciBiYXRjaCB2YWxpZGF0aW9uKQotCX0KLQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSByZXN1bHQuZ2V0UmVwb3J0ZXIobW9uaXRvcik7Ci0JCXZhbGlkYXRlRmlsZSgoSUZpbGUpIHJlc291cmNlLCByZXBvcnRlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIHRoZSBqc3AgZGlyZWN0aXZlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpcmVjdGl2ZU5hbWUoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJVGV4dFJlZ2lvbkxpc3Qgc3ViUmVnaW9ucyA9IGNvbGxlY3Rpb24uZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHN1YlJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCUlUZXh0UmVnaW9uIHN1YlJlZ2lvbiA9IHN1YlJlZ2lvbnMuZ2V0KGopOwotCQkJaWYgKHN1YlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJbmFtZSA9IGNvbGxlY3Rpb24uZ2V0VGV4dChzdWJSZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZHIKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiBAcmV0dXJuIHRoZSBJVGV4dFJlZ2lvbiBmb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlCi0JICogICAgICAgICBuYW1lLCBjYXNlIHNlbnNpdGl2ZSwgbnVsbCBpZiBubyBtYXRjaGluZyBhdHRyaWJ1dGUgaXMgZm91bmQKLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oSVRleHRSZWdpb25Db2xsZWN0aW9uIHNkciwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHN1YlJlZ2lvbnMgPSBzZHIuZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YlJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHN1YlJlZ2lvbiA9IHN1YlJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHN1YlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FICYmIHNkci5nZXRUZXh0KHN1YlJlZ2lvbikuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCWZvciAoaW50IGogPSBpOyBqIDwgc3ViUmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJCQlzdWJSZWdpb24gPSBzdWJSZWdpb25zLmdldChqKTsKLQkJCQkJaWYgKHN1YlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJdmFsdWVSZWdpb24gPSBzdWJSZWdpb247Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWVSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gc2RyLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSVRleHRSZWdpb24gciA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKHNkciwgYXR0ck5hbWUpOwotCQlpZiAociAhPSBudWxsKQotCQkJcmV0dXJuIHNkci5nZXRUZXh0KHIpLnRyaW0oKTsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBmaWxlIGlzIGpzcCBmcmFnbWVudCBvciBub3QgKGRvZXMgYSBkZWVwLCBpbmRlcHRoIGNoZWNrLAotCSAqIGxvb2tpbmcgaW50byBjb250ZW50cyBvZiBmaWxlKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhc3N1bWVzIGZpbGUgaXMgbm90IG51bGwgYW5kIGV4aXN0cwotCSAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlIGlzIGpzcCBmcmFnbWVudCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQoSUZpbGUgZmlsZSkgewotCQlib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJLy8gaXQgY2FuIGJlIG51bGwKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJCWlzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKGlzLCBmaWxlLmdldE5hbWUoKSwgbmV3IFF1YWxpZmllZE5hbWVbXXtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVR9KTsKLQkJCX0KLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlQ3RJZCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0JCQkJaXNGcmFnbWVudCA9IChmaWxlQ3RJZCAhPSBudWxsICYmIENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVC5lcXVhbHMoZmlsZUN0SWQpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBhc3N1bWUgaXQncyBpbnZhbGlkIEpTUAotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIG11c3QgY2xvc2UgaW5wdXQgc3RyZWFtIGluIGNhc2Ugb3RoZXJzIG5lZWQgaXQKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3Qgc3VyZSBob3cgdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBpc0ZyYWdtZW50OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJRmlsZSBmaWxlKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGU7Ci0JCWRvIHsKLQkJCWlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQl3aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBmaWxlIGlzIGEganNwIGZyYWdtZW50IG9yIG5vdC4gSWYgc28sIGNoZWNrIGlmIHRoZSBmcmFnbWVudAotCSAqIHNob3VsZCBiZSB2YWxpZGF0ZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBBc3N1bWVzIHNob3VsZFZhbGlkYXRlIHdhcyBhbHJlYWR5IGNhbGxlZCBvbiBmaWxlIHNvIGl0Ci0JICogICAgICAgICAgICBzaG91bGQgbm90IGJlIG51bGwgYW5kIGRvZXMgZXhpc3QKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGZpbGUgaXMgYSBmcmFnbWVudCBhbmQgaXQgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsCi0JICogICAgICAgICB0cnVlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmcmFnbWVudENoZWNrKElGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZSA9IHRydWU7Ci0JCS8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHBvc3NpYmx5IGEganNwIGZyYWdtZW50Ci0JCWlmIChnZXRKU1BGQ29udGVudFR5cGUoKS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotCQkJLy8gZ2V0IHByZWZlcmVuY2UgZm9yIHZhbGlkYXRlIGpzcCBmcmFnbWVudHMKLQkJCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGVGcmFnbWVudHMgPSBCb29sZWFuLnZhbHVlT2YoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5WQUxJREFURV9GUkFHTUVOVFMsIGZpbGUsIHRydWUpKS5ib29sZWFuVmFsdWUoKTsKLQkJCS8qCi0JCQkgKiBpZiBqc3AgZnJhZ21lbnRzIHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLCBjaGVjayBpZiBmaWxlIGlzCi0JCQkgKiByZWFsbHkganNwIGZyYWdtZW50Ci0JCQkgKi8KLQkJCWlmICghc2hvdWxkVmFsaWRhdGVGcmFnbWVudHMpIHsKLQkJCQlib29sZWFuIGlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50KGZpbGUpOwotCQkJCXNob3VsZFZhbGlkYXRlID0gIWlzRnJhZ21lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFZhbGlkYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgSlNQIGZyYWdtZW50IGNvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4ganNwZiBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRKU1BGQ29udGVudFR5cGUoKSB7Ci0JCWlmIChmSlNQRkNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZKU1BGQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQpOwotCQl9Ci0JCXJldHVybiBmSlNQRkNvbnRlbnRUeXBlOwotCX0KLQotCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeSB7Ci0JCQl2YWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQkJfQotCQljYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSURfSlNQX0NPUkUsIElTdGF0dXMuRVJST1IsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkMmYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotCi0vKioKLSAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBNZXNzYWdlIGFsbCB2YWxpZGF0b3JzIGluIHBhY2thZ2UgY2FuIHVzZS4KLSAqLwotY2xhc3MgTG9jYWxpemVkTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgewotCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlID0gbnVsbDsKLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0KSB7Ci0JCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgewotCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlzdXBlcihudWxsLCBzZXZlcml0eSwgbnVsbCk7Ci0JCXNldExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVRleHQpOwotCQlzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsLCBDbGFzc0xvYWRlciBjbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvRUxQcm9ibGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2pzcGVsL0VMUHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU0OGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvRUxQcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotCi1wdWJsaWMgY2xhc3MgRUxQcm9ibGVtIHsKLQlwcml2YXRlIFBvc2l0aW9uIGZQb3M7Ci0JcHJpdmF0ZSBTdHJpbmcgZk1lc3NhZ2U7Ci0JCi0JcHVibGljIEVMUHJvYmxlbShQb3NpdGlvbiBwb3MsIFN0cmluZyBtZXNzYWdlKQl7Ci0JCWZQb3MgPSBwb3M7Ci0JCWZNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gZk1lc3NhZ2U7Ci0JfQotCQotCi0JcHVibGljIFBvc2l0aW9uIGdldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZlBvczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2pzcGVsL0lKU1BFTFRyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvSUpTUEVMVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWU4NDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvSUpTUEVMVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUEVMVHJhbnNsYXRvciB7Ci0KLQkvKioKLQkgKiBUbyBvdmVycmlkZSB0aGUgRUwgdHJhbnNsYXRpb24sIHBsZWFzZSBzZWUgdGhlIGV4dGVuc2lvbiBwb2ludCAKLQkgKiBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZWx0cmFuc2xhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBlbFRleHQgIFRoZSB0ZXh0IHRvIGJlIHRyYW5zbGF0ZWQuCi0JICogQHBhcmFtIGRlbGltCVRoZSBzdGFydGluZyBkZWxpbWl0ZXIKLQkgKiBAcGFyYW0gY3VycmVudE5vZGUgVGhlIGN1cnJlbnQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb250ZW50U3RhcnQgVGhlIHN0YXJ0aW5nIG9mZnNldCBvZiB0aGUgRUwgdG8gYmUgdHJhbnNsYXRlZAotCSAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIEVMIGNvbnRlbnQgdG8gYmUgdHJhbnNsYXRlZAotCSAqIEBwYXJhbSBmVXNlckVMRXhwcmVzc2lvbnMgQSBzdHJpbmcgYnVmZmVyIHRvIHdoaWNoIGdlbmVyYXRlZCBjb2RlIGNhbiBiZSBhcHBlbmRlZC4KLQkgKgkJVGhlIHRleHQgYXBwZW5kZWQgaGVyZSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGdlbmVyYXRlZCBjbGFzcyBhdCB0aGUgdG9wIGxldmVsIAotCSAqCQlub3QgYXQgdGhlIHBvaW50IGluIHRoZSBKU1AgdHJhbnNsYXRpb24gd2hlcmUgdGhlIEVMIHdhcyBmb3VuZC4gCi0JICogCi0JICogQHBhcmFtIGZVc2VyRUxSYW5nZXMgIE1hcCBvZiBsb2NhdGlvbiByYW5nZXMgZnJvbSBKU1AgRUwgb2Zmc2V0cyB0byBnZW5lcmF0ZWQgSmF2YSBjb2RlLgotCSAqIEBwYXJhbSBkb2N1bWVudCBUaGUgc3RydWN0dXJlZCBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBFTFByb2JsZW1zIHRoYXQgZGVzY3JpYmVzIGFueSBzeW50YWN0aWMgaXNzdWVzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBMaXN0IHRyYW5zbGF0ZUVMKFN0cmluZyBlbFRleHQsCi0JCQlTdHJpbmcgZGVsaW0sCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlLCAKLQkJCWludCBjb250ZW50U3RhcnQsCi0JCQlpbnQgY29udGVudExlbmd0aCwKLQkJCVN0cmluZ0J1ZmZlciB1c2VyRUxFeHByZXNzaW9ucywKLQkJCUhhc2hNYXAgdXNlckVMUmFuZ2VzLAotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JSmFyUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JSmFyUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MTY0NzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSUphclJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogQSByZWNvcmQgdG8gYSAuamFyIGZpbGUgZGlyZWN0bHkgcmVmZXJlbmNhYmxlIGFzIGEgdGFnIGxpYnJhcnkuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElKYXJSZWNvcmQgZXh0ZW5kcyBJVGFnbGliUmVjb3JkIHsKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSAuamFyIGluIHRoZSBmaWxlLXN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVjb21tZW5kZWQvZGVmYXVsdCBwcmVmaXggaWYgb25lIHdhcyBnaXZlbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgdGhlIGRlc2NyaXB0b3IncyBVUkkgdmFsdWUKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVExEUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVExEUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWQzYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRMRFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgc3RhbmRhbG9uZSAudGxkIGZpbGUuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRMRFJlY29yZCBleHRlbmRzIElUYWdsaWJSZWNvcmQgewotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlLgotCSAqLwotCUlQYXRoIGdldFBhdGgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVjb21tZW5kZWQvZGVmYXVsdCBwcmVmaXggaWYgb25lIHdhcyBnaXZlbi4KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgZGVzY3JpcHRvcidzIFVSSSB2YWx1ZQotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXJpLgotCSAqLwotCVN0cmluZyBnZXRVUkkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ0RpclJlY29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ0RpclJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjIwODYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdEaXJSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIEEgcmVjb3JkIHJlcHJlc2VudGluZyBhIGZvbGRlciBvZiAudGFnLy50YWd4IGZpbGVzCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ0RpclJlY29yZCBleHRlbmRzIElUYWdsaWJSZWNvcmQgewotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0aCB3aXRoaW4gdGhlIHdvcmtzcGFjZSB0byB0aGlzIGRpcmVjdG9yeS4KLQkgKi8KLQlJUGF0aCBnZXRQYXRoKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiYTQ3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgaW5mb3JtYXRpb24gd2l0aGluIGEgdGFnIGxpYnJhcnkgZGVzY3JpcHRvci4gUHJvdmlkZXMKLSAqIG11Y2ggb2YgdGhlIGhpZ2gtbGV2ZWwgaW5mb3JtYXRpb24gZXhwcmVzc2VkIGJ5IHRoZSBkZXNjcmlwdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWdsaWJEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdGlvbiB2YWx1ZSBvZiB0aGlzIHRhZyBsaWJyYXJ5Ci0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JLyoqCi0JICogQHJldHVybiB0aGUgZGlzcGxheSBuYW1lIHZhbHVlIG9mIHRoaXMgdGFnIGxpYnJhcnkKLQkgKi8KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzdGF0ZWQgcmVxdWlyZWQgSlNQIHZlcnNpb24gb2YgdGhpcyB0YWcgbGlicmFyeQotCSAqLwotCVN0cmluZyBnZXRKU1BWZXJzaW9uKCk7Ci0JLyoqCi0JICogQHJldHVybiBhIFVSTCBzdHJpbmcgdG8gdGhlIGxhcmdlIGljb24gZm9yIHRoaXMgdGFnIGxpYnJhcnkKLQkgKi8KLQlTdHJpbmcgZ2V0TGFyZ2VJY29uKCk7Ci0JLyoqCi0JICogQHJldHVybiB0aGUgc3RhdGVkIHNob3J0IG5hbWUgZm9yIHRoaXMgdGFnIGxpYnJhcnkKLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0JLyoqCi0JICogQHJldHVybiBhIFVSTCBzdHJpbmcgdG8gdGhlIHNtYWxsIGljb24gZm9yIHRoaXMgdGFnIGxpYnJhcnkKLQkgKi8KLQlTdHJpbmcgZ2V0U21hbGxJY29uKCk7Ci0JLyoqCi0JICogQHJldHVybiB0aGUgc3RhdGVkIHZlcnNpb24gb2YgdGhpcyB0YWcgbGlicmFyeSBpZiBzcGVjaWZpZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGxpYlZlcnNpb24oKTsKLQkvKioKLQkgKiBAcmV0dXJuIGEgVVJJIHBvaW50aW5nIHRvIHRoaXMgdGFnIGxpYnJhcnkncyBkZXNjcmlwdG9yLCBvciBudWxsCi0JICovCi0JU3RyaW5nIGdldFVSSSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkluZGV4RGVsdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJJbmRleERlbHRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjNiYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkluZGV4RGVsdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0vKioKLSAqIERlc2NyaWJlcyBjaGFuZ2VzIHRvIHRoZSBrbm93biByZWNvcmRzIHdpdGhpbiB0aGUgVGFnbGliSW5kZXguCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2xpYkluZGV4RGVsdGEgewotCi0JLyoqCi0JICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgcmVjb3JkIGhhcyBiZWVuIGFkZGVkLiBOb3RlIHRoYXQgYW4KLQkgKiBhZGRlZCB0YWdsaWIgcmVjb3JkIGRlbHRhIGhhcyBubyBjaGlsZHJlbiwgYXMgdGhleSBhcmUgYWxsIGltcGxpY2l0ZWx5Ci0JICogYWRkZWQuCi0JICovCi0JcHVibGljIGludCBBRERFRCA9IDE7Ci0JLyoqCi0JICogU3RhdHVzIGNvbnN0YW50IGluZGljYXRpbmcgdGhhdCB0aGUgcmVjb3JkIGhhcyBiZWVuIGNoYW5nZWQsIGFzCi0JICogZGVzY3JpYmVkIGJ5IHRoZSBjaGFuZ2UgZmxhZ3MuCi0JICovCi0JcHVibGljIGludCBDSEFOR0VEID0gNDsKLQkvKioKLQkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNvcmQgaGFzIGJlZW4gcmVtb3ZlZC4gTm90ZSB0aGF0Ci0JICogYSByZW1vdmVkIHRhZ2xpYiBlbGVtZW50IGRlbHRhIGhhcyBubyBjaGlsZHJlbiwgYXMgdGhleSBhcmUgYWxsCi0JICogaW1wbGljaXRlbHkgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgaW50IFJFTU9WRUQgPSAyOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIGRlbHRhcyBmb3IgdGhlIGFmZmVjdGVkIChhZGRlZCwgcmVtb3ZlZCwgb3IgY2hhbmdlZCkgcmVjb3Jkcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVRhZ2xpYkluZGV4RGVsdGFbXSBnZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIGNoYW5nZSwgb25lIG9mIEFEREVELCBDSEFOR0VELCBvciBSRU1PVkVECi0JICovCi0JaW50IGdldEtpbmQoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBJUHJvamVjdCBpbiB3aGljaCB0aGlzIGRlbHRhIG9yaWdpbmF0ZWQKLQkgKi8KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJlY29yZCB0aGF0IHdhcyBjaGFuZ2VkCi0JICovCi0JSVRhZ2xpYlJlY29yZCBnZXRUYWdsaWJSZWNvcmQoKTsKLQotCS8qKgotCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3IuIFRoZSBvbmx5IGtpbmRzIG9mIGluZGV4IGRlbHRhcyB2aXNpdGVkIGFyZQotCSAqIDxjb2RlPkFEREVEPC9jb2RlPiwgPGNvZGU+UkVNT1ZFRDwvY29kZT4sIGFuZAotCSAqIDxjb2RlPkNIQU5HRUQ8L2NvZGU+LiBUaGUgdmlzaXRvcidzIDxjb2RlPnZpc2l0PC9jb2RlPiBtZXRob2QgaXMKLQkgKiBjYWxsZWQgd2l0aCB0aGlzIGluZGV4IGRlbHRhIGlmIGFwcGxpY2FibGUuIElmIHRoZSB2aXNpdG9yIHJldHVybnMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHJlc291cmNlIGRlbHRhJ3MgY2hpbGRyZW4gYXJlIGFsc28gdmlzaXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlzaXRvcgotCSAqICAgICAgICAgICAgdGhlIHZpc2l0b3IKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgdmlzaXRvciBmYWlsZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbi4KLQkgKiBAc2VlIElSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChJVGFnbGliSW5kZXhEZWx0YVZpc2l0b3IpCi0JICovCi0JLy8gcHVibGljIHZvaWQgYWNjZXB0KElUYWdsaWJJbmRleERlbHRhVmlzaXRvciB2aXNpdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJJbmRleExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliSW5kZXhMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODEwMjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJJbmRleExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLS8qKgotICogQSBsaXN0ZW5lciBmb3IgY2hhbmdlcyBpbiB0aGUgaW5kZXgncyByZWNvcmRzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWdsaWJJbmRleExpc3RlbmVyIHsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIGNoYW5nZSBpbiB0aGUgVGFnbGliSW5kZXgsIGRlc2NyaWJlZCBieQotCSAqIGFuIElUYWdsaWJJbmRleERlbHRhLCBoYXMgb2NjdXJyZWQKLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAgICAgICAgICAgIHRoZSBkZWx0YSBvZiBjaGFuZ2VzCi0JICovCi0Jdm9pZCBpbmRleENoYW5nZWQoSVRhZ2xpYkluZGV4RGVsdGEgZGVsdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2I2NDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvci4gVGhpcwotICogaW50ZXJmYWNlIGlzIGNvbW1vbiB0byBhbGwgcmVjb3JkIHR5cGVzLgotICogCi0gKiAKLSAqIEBzZWUgSUphclJlY29yZAotICogQHNlZSBJVGFnRGlyUmVjb3JkCi0gKiBAc2VlIElUTERSZWNvcmQKLSAqIEBzZWUgSVVSTFJlY29yZAotICogICAgICA8cD4KLSAqICAgICAgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAgICAgIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWdsaWJSZWNvcmQgewotCS8qKgotCSAqIEEgcmVjb3JkIHRvIGEgLmphciBmaWxlIHJlZmVycmFibGUgZGlyZWN0bHksIDEuMSBzdHlsZSwgb3IgbWVudGlvbmVkIGluCi0JICogYSB3ZWIueG1sIGZpbGUuCi0JICovCi0JaW50IEpBUiA9IDEgPDwgMTsKLQotCS8qKgotCSAqIEEgcmVjb3JkIHJlcHJlc2VudGluZyBhIGZvbGRlciBvZiAudGFnLy50YWd4IGZpbGVzCi0JICovCi0JaW50IFRBR0RJUiA9IDEgPDwgMzsKLQotCS8qKgotCSAqIEEgcmVjb3JkIHJlcHJlc2VudGluZyBhIHN0YW5kYWxvbmUgLnRsZCBmaWxlCi0JICovCi0JaW50IFRMRCA9IDE7Ci0KLQkvKioKLQkgKiBBIHJlY29yZCByZXByZXNlbnRpbmcgYSAudGxkIHRoYXQgaXMgbm90IGEgc3RhbmRhbG9uZSBmaWxlCi0JICovCi0JaW50IFVSTCA9IDEgPDwgMjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyByZWNvcmQuIFRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIG9uZSBvZgotCSAqIDxjb2RlPlVSTDwvY29kZT4sIDxjb2RlPlRBR0RJUjwvY29kZT4sIDxjb2RlPlRMRDwvY29kZT4sIG9yCi0JICogPGNvZGU+SkFSPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiA8dWw+Ci0JICogPGxpPiBBbGwgcmVjb3JkcyBvZiB0eXBlIDxjb2RlPkpBUjwvY29kZT4gaW1wbGVtZW50Ci0JICogPGNvZGU+SUphclJlY29yZDwvY29kZT4uPC9saT4KLQkgKiA8bGk+IEFsbCByZWNvcmRzIG9mIHR5cGUgPGNvZGU+VEFHRElSPC9jb2RlPiBpbXBsZW1lbnQKLQkgKiA8Y29kZT5JVGFnRGlyUmVjb3JkPC9jb2RlPi48L2xpPgotCSAqIDxsaT4gQWxsIHJlY29yZHMgb2YgdHlwZSA8Y29kZT5UTEQ8L2NvZGU+IGltcGxlbWVudAotCSAqIDxjb2RlPklUTERSZWNvcmQ8L2NvZGU+LjwvbGk+Ci0JICogPGxpPiBBbGwgcmVjb3JkcyBvZiB0eXBlIDxjb2RlPlVSTDwvY29kZT4gaW1wbGVtZW50Ci0JICogPGNvZGU+SVVSTFJlY29yZDwvY29kZT4uPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgcmVzb3VyY2UKLQkgKiBAc2VlICNKQVIKLQkgKiBAc2VlICNUQUdESVIKLQkgKiBAc2VlICNUTEQKLQkgKiBAc2VlICNVUkwKLQkgKi8KLQlpbnQgZ2V0UmVjb3JkVHlwZSgpOwotCQotCUlUYWdsaWJEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJSZWNvcmRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZDE3Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0gKiBEZXNjcmliZXMgY2hhbmdlcyB0byB0aGUga25vd24gcmVjb3JkcyB3aXRoaW4gdGhlIFRhZ2xpYkluZGV4LgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWdsaWJSZWNvcmRFdmVudCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSByZWNvcmQgdGhhdCB3YXMgY2hhbmdlZAotCSAqLwotCUlUYWdsaWJSZWNvcmQgZ2V0VGFnbGliUmVjb3JkKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIGNoYW5nZSwgb25lIG9mIEFEREVELCBDSEFOR0VELCBvciBSRU1PVkVECi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCWludCBBRERFRCA9IElSZXNvdXJjZURlbHRhLkFEREVEOwotCWludCBDSEFOR0VEID0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRDsKLQlpbnQgUkVNT1ZFRCA9IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVVJMUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVVJMUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NzRkMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVVSTFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgLnRsZCB0aGF0IGlzIG5vdCBhIHN0YW5kYWxvbmUgZmlsZQotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUkxSZWNvcmQgZXh0ZW5kcyBJVGFnbGliUmVjb3JkIHsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGJhc2UgbG9jYXRpb24gdG8gdXNlIGZvciBmdXJ0aGVyIHJlc29sdXRpb24gb2YgcmVzb3VyY2VzCi0JICogICAgICAgICBmcm9tIHRoZSBUTEQKLQkgKi8KLQlTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNob3J0LW5hbWUgKG5vcm1hbGx5IHRyZWF0ZWQgYXMgdGhlCi0JICogICAgICAgICByZWNvbW1lbmRlZC9kZWZhdWx0IHByZWZpeCksIGlmIG9uZSB3YXMgc3BlY2lmaWVkIHdpdGhpbiB0aGlzCi0JICogICAgICAgICBUTEQncyBjb250ZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgZGVzY3JpcHRvcidzIFVSSSB2YWx1ZQotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXJpIHNwZWNpZmllZCB3aXRoaW4gdGhpcyBUTEQncyBjb250ZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIFVSTCB0byB0aGlzIFRMRCdzIGNvbnRlbnRzLgotCSAqLwotCVVSTCBnZXRVUkwoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1Byb2plY3REZXNjcmlwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvUHJvamVjdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOWVkMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvUHJvamVjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkFycmF5TWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkRvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkphclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Tb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgdGFnIGxpYnJhcnkgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIHByb2plY3QuCi0gKiAKLSAqICAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBuZWl0aGVyIGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBub3IgYWNjZXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqCi0gKi8KLWNsYXNzIFByb2plY3REZXNjcmlwdGlvbiB7Ci0KLQljbGFzcyBEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuRU5DT0RJTkcgfHwgZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKHJlc291cmNlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnRsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCQlyZW1vdmVUTEQocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdXBkYXRlVExEKHJlc291cmNlLCBkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlc291cmNlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCQlyZW1vdmVKQVIocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdXBkYXRlSkFSKHJlc291cmNlLCBkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCJ0YWciLmVxdWFsc0lnbm9yZUNhc2UocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpKSB8fCAidGFneCIuZXF1YWxzSWdub3JlQ2FzZShyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCXJlbW92ZVRhZyhyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl1cGRhdGVUYWcocmVzb3VyY2UsIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhXRUJfWE1MKSAmJiByZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXROYW1lKCkuZXF1YWxzKFdFQl9JTkYpKSB7Ci0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJcmVtb3ZlV2ViWE1MKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZVdlYlhNTChyZXNvdXJjZSwgZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvdXJjZS5nZXROYW1lKCkubGVuZ3RoKCkgIT0gMCAmJiByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApICE9ICcuJzsKLQkJfQotCX0KLQotCWNsYXNzIEluZGV4ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJYm9vbGVhbiB2aXNpdE1lbWJlcnMgPSB0cnVlOwotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCWlmIChwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXVwZGF0ZVRMRChwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKSwgSVRhZ2xpYkluZGV4RGVsdGEuQURERUQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXVwZGF0ZUpBUihwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKSwgSVRhZ2xpYkluZGV4RGVsdGEuQURERUQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoIi50YWciKSB8fCBwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoIi50YWd4IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXVwZGF0ZVRhZ0Rpcihwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5nZXRQYXJlbnQoKSwgSVRhZ2xpYkluZGV4RGVsdGEuQURERUQpOwotCQkJCQkvLyBhbnkgZm9sZGVyIHdpdGggdGhlc2UgZmlsZXMgd2lsbCBjcmVhdGUgYSByZWNvcmQgZm9yCi0JCQkJCS8vIHRoYXQgZm9sZGVyIGluIG9uZSBwYXNzCi0JCQkJCXZpc2l0TWVtYmVycyA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIGlmIChwcm94eS5nZXROYW1lKCkuZXF1YWxzKFdFQl9YTUwpICYmIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLmdldFBhcmVudCgpLmdldE5hbWUoKS5lcXVhbHMoV0VCX0lORikpIHsKLQkJCQkJdXBkYXRlV2ViWE1MKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLCBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIG5hbWUgPSBwcm94eS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gbmFtZS5sZW5ndGgoKSAhPSAwICYmIG5hbWUuY2hhckF0KDApICE9ICcuJyAmJiB2aXNpdE1lbWJlcnM7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgSmFyUmVjb3JkIGltcGxlbWVudHMgSUphclJlY29yZCB7Ci0JCWJvb2xlYW4gaGFzMTFUTEQ7Ci0JCVRhZ2xpYkluZm8gaW5mbzsKLQotCQlib29sZWFuIGlzRXhwb3J0ZWQgPSB0cnVlOwotCQlib29sZWFuIGlzTWFwcGVkSW5XZWJYTUw7Ci0JCUlQYXRoIGxvY2F0aW9uOwotCQlMaXN0IHVybFJlY29yZHM7Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIEphclJlY29yZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoSmFyUmVjb3JkKSBvYmopLmxvY2F0aW9uLmVxdWFscyhsb2NhdGlvbikgJiYgKChKYXJSZWNvcmQpIG9iaikuaGFzMTFUTEQgPT0gaGFzMTFUTEQgJiYgKChKYXJSZWNvcmQpIG9iaikuaW5mby5lcXVhbHMoaW5mbyk7Ci0JCX0KLQotCQlwdWJsaWMgSVRhZ2xpYkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBpbmZvICE9IG51bGwgPyBpbmZvIDogbmV3IFRhZ2xpYkluZm8oKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2F0aW9uLgotCQkgKi8KLQkJcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgewotCQkJcmV0dXJuIGxvY2F0aW9uOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRSZWNvcmRUeXBlKCkgewotCQkJcmV0dXJuIElUYWdsaWJSZWNvcmQuSkFSOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVjb21tZW5kZWQvZGVmYXVsdCBwcmVmaXggaWYgb25lIHdhcyBnaXZlbi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnNob3J0TmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnVyaTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldFVSTFJlY29yZHMoKSB7Ci0JCQlyZXR1cm4gdXJsUmVjb3JkczsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoIkphclJlY29yZDogIik7Ly8kTk9OLU5MUy0xJCAKLQkJCXMuYXBwZW5kKGxvY2F0aW9uKTsKLQkJCWlmICh1cmxSZWNvcmRzLnNpemUoKSA+IDApIHsKLQkJCQlzLmFwcGVuZCgnXG4nKTsvLyROT04tTkxTLTEkIAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsUmVjb3Jkcy5zaXplKCk7IGkrKykgewotCQkJCQlzLmFwcGVuZCh1cmxSZWNvcmRzLmdldChpKSk7Ci0JCQkJCXMuYXBwZW5kKCdcbicpOy8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUYWdEaXJSZWNvcmQgaW1wbGVtZW50cyBJVGFnRGlyUmVjb3JkIHsKLQkJVGFnbGliSW5mbyBpbmZvOwotCQlJUGF0aCBwYXRoOwotCQkvLyBhIExpc3QgaG9sZGluZyBTdHJpbmdzIG9mIC50YWcgYW5kIC50YWd4IGZpbGVuYW1lcyByZWxhdGl2ZSB0byB0aGUKLQkJLy8gdGFnZGlyJ3MgbG9jYXRpb24KLQkJTGlzdCB0YWdzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVGFnRGlyUmVjb3JkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChUYWdEaXJSZWNvcmQpIG9iaikucGF0aC5lcXVhbHMocGF0aCkgJiYgKChUYWdEaXJSZWNvcmQpIG9iaikuaW5mby5lcXVhbHMoaW5mbyk7Ci0JCX0KLQotCQlwdWJsaWMgSVRhZ2xpYkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBpbmZvICE9IG51bGwgPyBpbmZvIDogKGluZm8gPSBuZXcgVGFnbGliSW5mbygpKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnRGlyUmVjb3JkI2dldFBhdGgoKQotCQkgKi8KLQkJcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLlRBR0RJUjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhZ3MuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VGFnRmlsZW5hbWVzKCkgewotCQkJcmV0dXJuIChTdHJpbmdbXSkgdGFncy50b0FycmF5KG5ldyBTdHJpbmdbdGFncy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRhZ2RpclJlY29yZDogIiArIHBhdGggKyAiIDwtPiAiICsgaW5mby5zaG9ydE5hbWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBicmllZiByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gaW4gYSBUTEQuCi0JICovCi0Jc3RhdGljIGNsYXNzIFRhZ2xpYkluZm8gaW1wbGVtZW50cyBJVGFnbGliRGVzY3JpcHRvciB7Ci0JCS8vIGV4dHJhY3Qgb25seSB3aGVuIGFza2VkPwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiIjsKLQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gIiI7Ci0JCVN0cmluZyBqc3BWZXJzaW9uID0gIiI7Ci0JCVN0cmluZyBsYXJnZUljb24gPSAiIjsKLQkJU3RyaW5nIHNob3J0TmFtZSA9ICIiOwotCQlTdHJpbmcgc21hbGxJY29uID0gIiI7Ci0JCVN0cmluZyB0bGliVmVyc2lvbiA9ICIiOwotCQlTdHJpbmcgdXJpID0gIiI7Ci0KLQkJcHVibGljIFRhZ2xpYkluZm8oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRhZ2xpYkluZm8pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiAoKFRhZ2xpYkluZm8pIG9iaikuanNwVmVyc2lvbiA9PSBqc3BWZXJzaW9uICYmICgoVGFnbGliSW5mbykgb2JqKS5kZXNjcmlwdGlvbi5lcXVhbHMoZGVzY3JpcHRpb24pICYmICgoVGFnbGliSW5mbykgb2JqKS5sYXJnZUljb24uZXF1YWxzKGxhcmdlSWNvbikgJiYgKChUYWdsaWJJbmZvKSBvYmopLnNob3J0TmFtZS5lcXVhbHMoc2hvcnROYW1lKSAmJiAoKFRhZ2xpYkluZm8pIG9iaikuc21hbGxJY29uLmVxdWFscyhzbWFsbEljb24pICYmICgoVGFnbGliSW5mbykgb2JqKS50bGliVmVyc2lvbi5lcXVhbHModGxpYlZlcnNpb24pICYmICgoVGFnbGliSW5mbykgb2JqKS51cmkuZXF1YWxzKHVyaSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJCXJldHVybiBkaXNwbGF5TmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SlNQVmVyc2lvbigpIHsKLQkJCXJldHVybiBqc3BWZXJzaW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0JCQlyZXR1cm4gbGFyZ2VJY29uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0JCQlyZXR1cm4gc2hvcnROYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTbWFsbEljb24oKSB7Ci0JCQlyZXR1cm4gc21hbGxJY29uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUbGliVmVyc2lvbigpIHsKLQkJCXJldHVybiB0bGliVmVyc2lvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQkJcmV0dXJuIHVyaTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRhZ2xpYkluZm98IiArIHNob3J0TmFtZSArICJ8IiArIHRsaWJWZXJzaW9uICsgInwiICsgc21hbGxJY29uICsgInwiICsgbGFyZ2VJY29uICsgInwiICsganNwVmVyc2lvbiArICJ8IiArIHVyaSArICJ8IiArIGRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckCi0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVExEUmVjb3JkIGltcGxlbWVudHMgSVRMRFJlY29yZCB7Ci0JCVRhZ2xpYkluZm8gaW5mbzsKLQkJSVBhdGggcGF0aDsKLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVExEUmVjb3JkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChUTERSZWNvcmQpIG9iaikucGF0aC5lcXVhbHMocGF0aCkgJiYgKChUTERSZWNvcmQpIG9iaikuZ2V0VVJJKCkuZXF1YWxzKGdldFVSSSgpKSAmJiAoKFRMRFJlY29yZCkgb2JqKS5pbmZvLmVxdWFscyhpbmZvKTsKLQkJfQotCi0JCXB1YmxpYyBJVGFnbGliRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIGluZm8gIT0gbnVsbCA/IGluZm8gOiBuZXcgVGFnbGliSW5mbygpOwotCQl9Ci0KLQkJcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLlRMRDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnNob3J0TmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnVyaTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRMRFJlY29yZDogIiArIGdldFVSSSgpICsgIiA8LT4gIiArIHBhdGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFVSTFJlY29yZCBpbXBsZW1lbnRzIElVUkxSZWNvcmQgewotCQlTdHJpbmcgYmFzZUxvY2F0aW9uOwotCQlUYWdsaWJJbmZvIGluZm87Ci0JCWJvb2xlYW4gaXNFeHBvcnRlZCA9IHRydWU7Ci0JCVVSTCB1cmw7Ci0KLQkJcHVibGljIFVSTFJlY29yZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVVJMUmVjb3JkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChVUkxSZWNvcmQpIG9iaikuYmFzZUxvY2F0aW9uLmVxdWFscyhiYXNlTG9jYXRpb24pICYmICgoVVJMUmVjb3JkKSBvYmopLnVybC5lcXVhbHModXJsKSAmJiAoKFVSTFJlY29yZCkgb2JqKS5pbmZvLmVxdWFscyhpbmZvKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCkgewotCQkJcmV0dXJuIGJhc2VMb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBJVGFnbGliRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIGluZm8gIT0gbnVsbCA/IGluZm8gOiBuZXcgVGFnbGliSW5mbygpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRSZWNvcmRUeXBlKCkgewotCQkJcmV0dXJuIElUYWdsaWJSZWNvcmQuVVJMOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVjb21tZW5kZWQvZGVmYXVsdCBwcmVmaXggaWYgb25lIHdhcyBnaXZlbi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnNob3J0TmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpbmZvLnVyaTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIFVSTC4KLQkJICovCi0JCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlVSTFJlY29yZDogKGV4cG9ydGVkPSIgKyBpc0V4cG9ydGVkICsgIikgIiArIGJhc2VMb2NhdGlvbiArICIgPC0+ICIgKyBnZXRVUkkoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgV2ViWE1MUmVjb3JkIHsKLQkJVGFnbGliSW5mbyBpbmZvOwotCQlJUGF0aCBwYXRoOwotCQlMaXN0IHRsZFJlY29yZHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBXZWJYTUxSZWNvcmQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiAoKFdlYlhNTFJlY29yZCkgb2JqKS5wYXRoLmVxdWFscyhwYXRoKSAmJiAoKFdlYlhNTFJlY29yZCkgb2JqKS5pbmZvLmVxdWFscyhpbmZvKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4IGlmIG9uZSB3YXMgZ2l2ZW4uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby5zaG9ydE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgTGlzdCBnZXRUTERSZWNvcmRzKCkgewotCQkJcmV0dXJuIHRsZFJlY29yZHM7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJ4bWwuCi0JCSAqLwotCQlwdWJsaWMgSVBhdGggZ2V0V2ViWE1MKCkgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCJXZWJYTUxSZWNvcmQ6ICIpOy8vJE5PTi1OTFMtMSQgCi0JCQlzLmFwcGVuZChwYXRoKTsKLQkJCWlmICh0bGRSZWNvcmRzLnNpemUoKSA+IDApIHsKLQkJCQlzLmFwcGVuZCgnXG4nKTsvLyROT04tTkxTLTEkIAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGxkUmVjb3Jkcy5zaXplKCk7IGkrKykgewotCQkJCQlzLmFwcGVuZCh0bGRSZWNvcmRzLmdldChpKSk7Ci0JCQkJCXMuYXBwZW5kKCdcbicpOy8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRhZ2xpYlNvcnRlciBleHRlbmRzIFNvcnRlciB7Ci0JCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3bykgewotCQkJLyoqCi0JCQkgKiBSZXR1cm5zIHRydWUgaWYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lIFRoaXMgaXMKLQkJCSAqIHRoZSAnb3JkZXJpbmcnIG1ldGhvZCBvZiB0aGUgc29ydCBvcGVyYXRpb24uIEVhY2ggc3ViY2xhc3MKLQkJCSAqIG92ZXJpZGVzIHRoaXMgbWV0aG9kIHdpdGggdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JCQkgKiAnZ3JlYXRlciB0aGFuJyBjb25jZXB0IGZvciB0aGUgb2JqZWN0cyBiZWluZyBzb3J0ZWQuCi0JCQkgKi8KLQkJCQotCQkJcmV0dXJuIChjb2xsYXRvci5jb21wYXJlKGdldFRhZ2xpYlBhdGgoKElUYWdsaWJSZWNvcmQpIGVsZW1lbnRPbmUpLCBnZXRUYWdsaWJQYXRoKChJVGFnbGliUmVjb3JkKSBlbGVtZW50VHdvKSkpIDwgMDsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0VGFnbGliUGF0aChJVGFnbGliUmVjb3JkIHJlY29yZCkgewotCQkJc3dpdGNoKHJlY29yZC5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQljYXNlIElUYWdsaWJSZWNvcmQuSkFSOgotCQkJCQlyZXR1cm4gKChKYXJSZWNvcmQpIHJlY29yZCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCWNhc2UgSVRhZ2xpYlJlY29yZC5UQUdESVI6Ci0JCQkJCXJldHVybiAoKFRhZ0RpclJlY29yZCkgcmVjb3JkKS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQljYXNlIElUYWdsaWJSZWNvcmQuVExEOgotCQkJCQlyZXR1cm4gKChUTERSZWNvcmQpIHJlY29yZCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJY2FzZSBJVGFnbGliUmVjb3JkLlVSTDoKLQkJCQkJcmV0dXJuICgoVVJMUmVjb3JkKSByZWNvcmQpLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gX2RlYnVnSW5kZXhDcmVhdGlvbiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4Y3JlYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXN0YXRpYyBib29sZWFuIF9kZWJ1Z0luZGV4VGltZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4dGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERQQVRIX0RJUlRZID0gIkJVSUxEUEFUSF9ESVJUWSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERQQVRIX0VOVFJJRVMgPSAiQlVJTERQQVRIX0VOVFJJRVMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEUEFUSF9QUk9KRUNUID0gIkJVSUxEUEFUSF9QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0ZPUk1BVF9WRVJTSU9OID0gIlRhZyBMaWJyYXJ5IEluZGV4IDEuMC4zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggV0VCX0lORl9QQVRIID0gbmV3IFBhdGgoV0VCX0lORik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9YTUwgPSAid2ViLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5vdGVzIHRoYXQgdGhlIGJ1aWxkIHBhdGggaW5mb3JtYXRpb24gaXMgc3RhbGUuIFNvbWUgb3BlcmF0aW9ucyBjYW4gbm93Ci0JICogYmUgc2tpcHBlZCB1bnRpbCBhIHJlc29sdmUvZ2V0QXZhaWxhYmxlIGNhbGwgaXMgbWFkZS4KLQkgKi8KLQlib29sZWFuIGZCdWlsZFBhdGhJc0RpcnR5ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb3VudCBvZiBlbnRyaWVzIG9uIHRoZSBidWlsZCBwYXRoLiBQcmltYXJ5IHVzZSBjYXNlIGlzIGZvciBjbGFzc3BhdGgKLQkgKiBjb250YWluZXJzIHRoYXQgYWRkIGFuIGVudHJ5LiBXaXRob3V0IG5vdGlmaWNhdGlvbiAoMy4zKSwgd2UgY2FuIG9ubHkKLQkgKiBjaGVjayBhZnRlci10aGUtZmFjdC4KLQkgKi8KLQlpbnQgZkJ1aWxkUGF0aEVudHJ5Q291bnQgPSAwOwotCi0JLyoqCi0JICogQSBjYWNoZWQgY29weSBvZiBhbGwgb2YgdGhlIHJlY29yZHMgY3JlYXRlYWJsZSBmcm9tIHRoZSBYTUxDYXRhbG9nLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBmQ2F0YWxvZ1JlY29yZHM7Ci0KLQkvKgotCSAqIFJlY29yZHMgYWN0aXZlIEpBUnMgb24gdGhlIGNsYXNzcGF0aC4gVGFnbGliIGRlc2NyaXB0b3JzIHNob3VsZCBiZQotCSAqIHVzYWJsZSwgYnV0IHRoZSBqYXJzIGJ5IHRoZW1zZWx2ZXMgYXJlIG5vdC4KLQkgKi8KLQlIYXNodGFibGUgZkNsYXNzcGF0aEphcnM7Ci0KLQkvKioKLQkgKiBBIHNldCBvZiB0aGUgcHJvamVjdHMgdGhhdCBhcmUgaW4gdGhpcyBwcm9qZWN0J3MgYnVpbGQgcGF0aC4KLQkgKiBMb29rdXBzL2VudW1lcmF0aW9ucyB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBQcm9qZWN0RGVzY3JpcHRpb24gaW5zdGFuY2VzCi0JICovCi0JU2V0IGZDbGFzc3BhdGhQcm9qZWN0cyA9IG51bGw7Ci0KLQkvLyBob2xkcyByZWZlcmVuY2VzIGJ5IFVSSSB0byBKQVJzCi0JSGFzaHRhYmxlIGZDbGFzc3BhdGhSZWZlcmVuY2VzOwotCi0JLyoKLQkgKiB0aGlzIHRhYmxlIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBob2xkcyB0YWJsZXMgb2YgcmVmZXJlbmNlcyBhY2NvcmRpbmcKLQkgKiB0byBsb2NhbCByb290cwotCSAqLwotCUhhc2h0YWJsZSBmSW1wbGljaXRSZWZlcmVuY2VzOwotCi0JSGFzaHRhYmxlIGZKQVJSZWZlcmVuY2VzOwotCi0JSVByb2plY3QgZlByb2plY3Q7Ci0KLQlwcml2YXRlIFN0cmluZyBmU2F2ZVN0YXRlRmlsZW5hbWU7Ci0KLQlIYXNodGFibGUgZlRhZ0RpclJlZmVyZW5jZXM7Ci0KLQlIYXNodGFibGUgZlRMRFJlZmVyZW5jZXM7Ci0KLQlJUmVzb3VyY2VEZWx0YVZpc2l0b3IgZlZpc2l0b3I7Ci0JSGFzaHRhYmxlIGZXZWJYTUxSZWZlcmVuY2VzOwotCi0JSUxvY2sgTE9DSyA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCi0JcHJpdmF0ZSBsb25nIHRpbWUwOwotCQotCXByaXZhdGUgVGFnbGliU29ydGVyIGZUYWdsaWJTb3J0ZXIgPSBuZXcgVGFnbGliU29ydGVyKCk7Ci0KLQlQcm9qZWN0RGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHNhdmVTdGF0ZUZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJZlByb2plY3QgPSBwcm9qZWN0OwotCQlmU2F2ZVN0YXRlRmlsZW5hbWUgPSBzYXZlU3RhdGVGaWxlOwotCi0JCWZDbGFzc3BhdGhKYXJzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkpBUlJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmVGFnRGlyUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZUTERSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZldlYlhNTFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmSW1wbGljaXRSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmQ2xhc3NwYXRoUHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCi0JCXJlc3RvcmVSZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIF9nZXRKU1AxMUFuZFdlYlhNTEphclJlZmVyZW5jZXMoQ29sbGVjdGlvbiBhbGxKQVJzKSB7Ci0JCUxpc3QgY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoYWxsSkFScy5zaXplKCkpOwotCQlJdGVyYXRvciBpID0gYWxsSkFScy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUphclJlY29yZCByZWNvcmQgPSAoSmFyUmVjb3JkKSBpLm5leHQoKTsKLQkJCWlmIChyZWNvcmQuaGFzMTFUTEQgfHwgcmVjb3JkLmlzTWFwcGVkSW5XZWJYTUwpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChyZWNvcmQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3Qgb2Yga25vd24gcmVmZXJlbmNlcyBmcm9tIHRoaXMgcHJvamVjdCdzIGJ1aWxkIHBhdGggdG8gdGhlCi0JICogbWFwLCBhcHBlbmRpbmcgYW55IHByb2Nlc3NlZCBwcm9qZWN0cyBpbnRvIHRoZSBsaXN0IHRvIGF2b2lkCi0JICogYnVpbGQtcGF0aC1jeWNsZXMuCi0JICogCi0JICogQHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNDA4Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZXMgLQotCSAqICAgICAgICAgICAgdGhlIG1hcCBvZiByZWZlcmVuY2VzIHRvIElUYWdsaWJSZWNvcmRzCi0JICogQHBhcmFtIHByb2plY3RzUHJvY2Vzc2VkIC0KLQkgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIHByb2plY3RzIGFscmVhZHkgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBleHBvcnRlZE9ubHkgLQotCSAqICAgICAgICAgICAgV2hldGhlciB0byBvbmx5IGFkZCByZWZlcmVuY2VzIGRlcml2ZWQgZnJvbSBleHBvcnRlZCBidWlsZAotCSAqICAgICAgICAgICAgcGF0aCBjb250YWluZXJzLiBUaGlzIG1ldGhvZCBjYWxscyBpdHNlbGYgcmVjdXJzaXZlbHkgd2l0aAotCSAqICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgYXMgZmFsc2UuCi0JICovCi0Jdm9pZCBhZGRCdWlsZFBhdGhSZWZlcmVuY2VzKE1hcCByZWZlcmVuY2VzLCBMaXN0IHByb2plY3RzUHJvY2Vzc2VkLCBib29sZWFuIGV4cG9ydGVkT25seSkgewotCQllbnN1cmVVcFRvZGF0ZSgpOwotCi0JCS8vIEFkZCB0aGUgYnVpbGQgcGF0aCByZWZlcmVuY2VzIHRoYXQgYXJlIGV4cG9ydGVkIGZyb20gdGhpcyBwcm9qZWN0Ci0JCUVudW1lcmF0aW9uIGtleXMgPSBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5rZXlzKCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJVVJMUmVjb3JkIHVybFJlY29yZCA9IChVUkxSZWNvcmQpIGZDbGFzc3BhdGhSZWZlcmVuY2VzLmdldChrZXkpOwotCQkJaWYgKGV4cG9ydGVkT25seSkgewotCQkJCWlmICh1cmxSZWNvcmQuaXNFeHBvcnRlZCkgewotCQkJCQlyZWZlcmVuY2VzLnB1dChrZXksIHVybFJlY29yZCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVmZXJlbmNlcy5wdXQoa2V5LCB1cmxSZWNvcmQpOwotCQkJfQotCQl9Ci0JCUlQcm9qZWN0W10gYnVpbGRwYXRoUHJvamVjdHMgPSAoSVByb2plY3RbXSkgZkNsYXNzcGF0aFByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0W2ZDbGFzc3BhdGhQcm9qZWN0cy5zaXplKCldKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidWlsZHBhdGhQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFwcm9qZWN0c1Byb2Nlc3NlZC5jb250YWlucyhidWlsZHBhdGhQcm9qZWN0c1tpXSkgJiYgYnVpbGRwYXRoUHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlwcm9qZWN0c1Byb2Nlc3NlZC5hZGQoYnVpbGRwYXRoUHJvamVjdHNbaV0pOwotCQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuY3JlYXRlRGVzY3JpcHRpb24oYnVpbGRwYXRoUHJvamVjdHNbaV0pOwotCQkJCWRlc2NyaXB0aW9uLmFkZEJ1aWxkUGF0aFJlZmVyZW5jZXMocmVmZXJlbmNlcywgcHJvamVjdHNQcm9jZXNzZWQsIHRydWUpOwotCi0JCQkJLyoKLQkJCQkgKiAxOTk4NDMgKDE4Mzc1NikgLSBKU1AgVmFsaWRhdGlvbiBDYW5ub3QgRmluZCBUYWcgTGlicmFyeQotCQkJCSAqIERlc2NyaXB0b3IgaW4gUmVmZXJlbmNlZCBQcm9qZWN0cwotCQkJCSAqIAotCQkJCSAqIEFkZCBhbnkgVExEIHJlY29yZHMgaGF2aW5nIFVSSSB2YWx1ZXMgZnJvbSBwcm9qZWN0cyBvbiB0aGUKLQkJCQkgKiBidWlsZCBwYXRoCi0JCQkJICovCi0JCQkJTWFwW10gcm9vdFJlZmVyZW5jZXMgPSAoTWFwW10pIGRlc2NyaXB0aW9uLmZJbXBsaWNpdFJlZmVyZW5jZXMudmFsdWVzKCkudG9BcnJheShuZXcgTWFwW2Rlc2NyaXB0aW9uLmZJbXBsaWNpdFJlZmVyZW5jZXMuc2l6ZSgpXSk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByb290UmVmZXJlbmNlcy5sZW5ndGg7IGorKykgewotCQkJCQlJdGVyYXRvciBpbXBsaWNpdFJlY29yZHMgPSByb290UmVmZXJlbmNlc1tqXS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaW1wbGljaXRSZWNvcmRzLmhhc05leHQoKSkgewotCQkJCQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgaW1wbGljaXRSZWNvcmRzLm5leHQoKTsKLQkJCQkJCWlmIChyZWNvcmQuZ2V0UmVjb3JkVHlwZSgpID09IElUYWdsaWJSZWNvcmQuVExEICYmICgoSVRMRFJlY29yZCkgcmVjb3JkKS5nZXRVUkkoKSAhPSBudWxsICYmICgoSVRMRFJlY29yZCkgcmVjb3JkKS5nZXRVUkkoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlyZWZlcmVuY2VzLnB1dCgoKElUTERSZWNvcmQpIHJlY29yZCkuZ2V0VVJJKCksIHJlY29yZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFcmFzZXMgYWxsIGtub3duIHRhYmxlcwotCSAqLwotCXZvaWQgY2xlYXIoKSB7Ci0JCWZDbGFzc3BhdGhKYXJzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkpBUlJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmVGFnRGlyUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZUTERSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZldlYlhNTFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmSW1wbGljaXRSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbG9zZUphckZpbGUoWmlwRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlmaWxlLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiVGFnbGliSW5kZXg6IENvdWxkIG5vdCBjbG9zZSB6aXAgZmlsZSAiICsgZmlsZS5nZXROYW1lKCksIGlvZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjYXRhbG9nRW50cnkKLQkgKiAgICAgICAgICAgIGEgWE1MIGNhdGFsb2cgZW50cnkgcG9pbnRpbmcgdG8gYSAuamFyIG9yIC50bGQgZmlsZQotCSAqIEByZXR1cm4gYSBJVGFnbGliUmVjb3JkIGRlc2NyaWJpbmcgYSBUTEQgY29udHJpYnV0ZWQgdG8gdGhlIFhNTENhdGFsb2cKLQkgKiAgICAgICAgIGlmIG9uZSB3YXMgZm91bmQgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgSVRhZ2xpYlJlY29yZCBjcmVhdGVDYXRhbG9nUmVjb3JkKElDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5KSB7Ci0JCXJldHVybiBjcmVhdGVDYXRhbG9nUmVjb3JkKGNhdGFsb2dFbnRyeS5nZXRLZXkoKSwgY2F0YWxvZ0VudHJ5LmdldFVSSSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpIC0KLQkgKiAgICAgICAgICAgIHRoZSBrZXkgdmFsdWUgdGhhdCB3aWxsIGJlY29tZSB0aGUgcmV0dXJuZWQgcmVjb3JkJ3MgIlVSSSIKLQkgKiBAcGFyYW0gdXJsU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgaW5kaWNhdGluZyB3aGVyZSB0aGUgVExEIHJlYWxseSBpcwotCSAqIEByZXR1cm4gYSBJVGFnbGliUmVjb3JkIGRlc2NyaWJpbmcgYSBUTEQgY29udHJpYnV0ZWQgdG8gdGhlIFhNTENhdGFsb2cKLQkgKiAgICAgICAgIGlmIG9uZSB3YXMgZm91bmQgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgSVRhZ2xpYlJlY29yZCBjcmVhdGVDYXRhbG9nUmVjb3JkKFN0cmluZyB1cmksIFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBudWxsOwotCQkvLyBoYW5kbGUgImZpbGU6IiBVUkxzIHRoYXQgcG9pbnQgdG8gYSAuamFyIGZpbGUgb24gZGlzayAoMS4xIG1vZGUpCi0JCWlmICh1cmxTdHJpbmcudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lbmRzV2l0aCgoIi5qYXIiKSkgJiYgdXJsU3RyaW5nLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgZmlsZUxvY2F0aW9uID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJVVJMIHVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKLQkJCQlmaWxlTG9jYXRpb24gPSB1cmwuZ2V0RmlsZSgpOwotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90IHdvcnRoIHJlcG9ydGluZwotCQkJfQotCQkJaWYgKGZpbGVMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSmFyUmVjb3JkIGphclJlY29yZCA9IGNyZWF0ZUpBUlJlY29yZChmaWxlTG9jYXRpb24pOwotCQkJCVN0cmluZ1tdIGVudHJpZXMgPSBKYXJVdGlsaXRpZXMuZ2V0RW50cnlOYW1lcyhmaWxlTG9jYXRpb24pOwotCQkJCWZvciAoaW50IGpFbnRyeSA9IDA7IGpFbnRyeSA8IGVudHJpZXMubGVuZ3RoOyBqRW50cnkrKykgewotCQkJCQlpZiAoZW50cmllc1tqRW50cnldLmVuZHNXaXRoKCIudGxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGVudHJpZXNbakVudHJ5XS5lcXVhbHMoSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQikpIHsKLQkJCQkJCQlqYXJSZWNvcmQuaGFzMTFUTEQgPSB0cnVlOwotCQkJCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKGZpbGVMb2NhdGlvbiwgZW50cmllc1tqRW50cnldKTsKLQkJCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhmaWxlTG9jYXRpb24sIGNvbnRlbnRzKTsKLQkJCQkJCQkJLyoKLQkJCQkJCQkJICogdGhlIHJlY29yZCdzIHJlcG9ydGVkIFVSSSBzaG91bGQgbWF0Y2ggdGhlCi0JCQkJCQkJCSAqIGNhdGFsb2cgZW50cnkncyAia2V5IiBzbyByZXBsYWNlIHRoZQotCQkJCQkJCQkgKiBkZXRlY3RlZCB2YWx1ZQotCQkJCQkJCQkgKi8KLQkJCQkJCQkJaW5mby51cmkgPSB1cmk7Ci0JCQkJCQkJCWphclJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQkJCQl9Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGphclJlY29yZC5oYXMxMVRMRCkgewotCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIGNhdGFsb2cgcmVjb3JkIGZvciAiICsgdXJsU3RyaW5nICsgIkAiICsgamFyUmVjb3JkLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJcmVjb3JkID0gamFyUmVjb3JkOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCS8vIFRoZSByZXN0IGFyZSBVUkxzIGludG8gYSBwbHVnLWluLi4uc29tZXdoZXJlCi0JCWVsc2UgewotCQkJVVJMIHVybCA9IG51bGw7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBjYWNoZWRDb250ZW50cyA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSB0bGRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7Ci0JCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJY29ubmVjdGlvbi5zZXREZWZhdWx0VXNlQ2FjaGVzKGZhbHNlKTsKLQkJCQl0bGRTdHJlYW0gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHJlYWRpbmcgVExEIGNvbnRyaWJ1dGVkIHRvIHRoZSBYTUwgQ2F0YWxvZyIsIGUxKTsKLQkJCX0KLQotCQkJaWYgKHRsZFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaW50IGM7Ci0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkvLyBhcnJheSBkaW0gcmVzdHJpY3Rpb24/Ci0JCQkJYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJdHJ5IHsKLQkJCQkJd2hpbGUgKChjID0gdGxkU3RyZWFtLnJlYWQoYnl0ZXMpKSA+PSAwKSB7Ci0JCQkJCQlidWZmZXIud3JpdGUoYnl0ZXMsIDAsIGMpOwotCQkJCQl9Ci0JCQkJCWNhY2hlZENvbnRlbnRzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlci50b0J5dGVBcnJheSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkvLyBubyBjbGVhbnVwIGNhbiBiZSBkb25lCi0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJdGxkU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVVSTFJlY29yZCB1cmxSZWNvcmQgPSBudWxsOwotCQkJCVRhZ2xpYkluZm8gaW5mbyA9IGV4dHJhY3RJbmZvKHVybFN0cmluZywgY2FjaGVkQ29udGVudHMpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJLyoKLQkJCQkJICogdGhlIHJlY29yZCdzIHJlcG9ydGVkIFVSSSBzaG91bGQgbWF0Y2ggdGhlIGNhdGFsb2cKLQkJCQkJICogZW50cnkncyAia2V5IiBzbyByZXBsYWNlIHRoZSBkZXRlY3RlZCB2YWx1ZQotCQkJCQkgKi8KLQkJCQkJaW5mby51cmkgPSB1cmk7Ci0JCQkJCXVybFJlY29yZCA9IG5ldyBVUkxSZWNvcmQoKTsKLQkJCQkJdXJsUmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCQl1cmxSZWNvcmQuYmFzZUxvY2F0aW9uID0gdXJsU3RyaW5nOwotCQkJCQl1cmxSZWNvcmQudXJsID0gdXJsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJY2FjaGVkQ29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJcmVjb3JkID0gdXJsUmVjb3JkOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWNvcmQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSmFyUmVjb3JkIGNyZWF0ZUpBUlJlY29yZChJUmVzb3VyY2UgamFyKSB7Ci0JCUlQYXRoIGxvY2F0aW9uID0gamFyLmdldExvY2F0aW9uKCk7Ci0JCUphclJlY29yZCBqYXJSZWNvcmQgPSBudWxsOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJamFyUmVjb3JkID0gY3JlYXRlSkFSUmVjb3JkKGxvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGphci5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwpIHsKLQkJCWphclJlY29yZCA9IGNyZWF0ZUpBUlJlY29yZChqYXIuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gamFyUmVjb3JkOwotCX0KLQotCXByaXZhdGUgSmFyUmVjb3JkIGNyZWF0ZUpBUlJlY29yZChTdHJpbmcgZmlsZUxvY2F0aW9uKSB7Ci0JCUphclJlY29yZCByZWNvcmQgPSBuZXcgSmFyUmVjb3JkKCk7Ci0JCXJlY29yZC5pbmZvID0gbmV3IFRhZ2xpYkluZm8oKTsKLQkJcmVjb3JkLmxvY2F0aW9uID0gbmV3IFBhdGgoZmlsZUxvY2F0aW9uKTsKLQkJcmVjb3JkLnVybFJlY29yZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiByZWNvcmQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGFnRGlyUmVjb3JkIGNyZWF0ZVRhZ2RpclJlY29yZChJRm9sZGVyIHRhZ2RpcikgewotCQlJUGF0aCB0YWdkaXJQYXRoID0gdGFnZGlyLmdldEZ1bGxQYXRoKCk7Ci0JCVRhZ0RpclJlY29yZCByZWNvcmQgPSBuZXcgVGFnRGlyUmVjb3JkKCk7Ci0JCXJlY29yZC5wYXRoID0gdGFnZGlyLmdldEZ1bGxQYXRoKCk7Ci0JCXJlY29yZC5pbmZvID0gbmV3IFRhZ2xpYkluZm8oKTsKLQkJLy8gOC40LjMKLQkJaWYgKHRhZ2Rpci5nZXROYW1lKCkuZXF1YWxzKCJ0YWdzIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJlY29yZC5pbmZvLnNob3J0TmFtZSA9ICJ0YWdzIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCWJvb2xlYW4gZGV0ZXJtaW5lZCA9IGZhbHNlOwotCQkJSVBhdGggcGF0aCA9IHRhZ2RpclBhdGg7Ci0JCQlTdHJpbmdbXSBzZWdtZW50cyA9IHBhdGguc2VnbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2VnbWVudHNbaSAtIDFdLmVxdWFscygiV0VCLUlORiIpICYmIHNlZ21lbnRzW2ldLmVxdWFscygidGFncyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlJUGF0aCB0YWdkaXJMb2NhbFBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoaSArIDEpOwotCQkJCQlyZWNvcmQuaW5mby5zaG9ydE5hbWUgPSBTdHJpbmdVdGlscy5yZXBsYWNlKHRhZ2RpckxvY2FsUGF0aC50b1N0cmluZygpLCAiLyIsICItIik7Ci0JCQkJCWRldGVybWluZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZGV0ZXJtaW5lZCkgewotCQkJCXJlY29yZC5pbmZvLnNob3J0TmFtZSA9IFN0cmluZ1V0aWxzLnJlcGxhY2UodGFnZGlyUGF0aC50b1N0cmluZygpLCAiLyIsICItIik7Ci0JCQl9Ci0JCX0KLQkJLy8gOC40LjMKLQkJcmVjb3JkLmluZm8udGxpYlZlcnNpb24gPSAiMS4wIjsKLQkJcmVjb3JkLmluZm8uZGVzY3JpcHRpb24gPSAiIjsKLQkJcmVjb3JkLmluZm8uZGlzcGxheU5hbWUgPSAiIjsKLQkJcmVjb3JkLmluZm8uc21hbGxJY29uID0gIiI7Ci0JCXJlY29yZC5pbmZvLmxhcmdlSWNvbiA9ICIiOwotCi0JCXRyeSB7Ci0JCQlJUmVzb3VyY2VbXSB0YWdmaWxlcyA9IHRhZ2Rpci5tZW1iZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ2ZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHRhZ2ZpbGVzW2ldLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJY29udGludWU7Ci0JCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHRhZ2ZpbGVzW2ldLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgKGV4dGVuc2lvbi5lcXVhbHMoInRhZyIpIHx8IGV4dGVuc2lvbi5lcXVhbHMoInRhZ3giKSkpIHsKLQkJCQkJcmVjb3JkLnRhZ3MuYWRkKHRhZ2ZpbGVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVjb3JkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRMRFJlY29yZCBjcmVhdGVUTERSZWNvcmQoSVJlc291cmNlIHRsZCkgewotCQlUTERSZWNvcmQgcmVjb3JkID0gbmV3IFRMRFJlY29yZCgpOwotCQlyZWNvcmQucGF0aCA9IHRsZC5nZXRGdWxsUGF0aCgpOwotCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAodGxkLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJY29udGVudHMgPSAoKElGaWxlKSB0bGQpLmdldENvbnRlbnRzKHRydWUpOwotCQkJCVN0cmluZyBiYXNlUGF0aCA9IHRsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8oYmFzZVBhdGgsIGNvbnRlbnRzKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCXJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiByZWNvcmQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZVVwVG9kYXRlKCkgewotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLyoKLQkJCQkgKiBJZiB0aGUgSmF2YSBuYXR1cmUgaXNuJ3QgcHJlc2VudCAob3Igc29tZXRoaW5nIGVsc2UgaXMKLQkJCQkgKiB3cm9uZyksIGRvbid0IGNoZWNrIHRoZSBidWlsZCBwYXRoLgotCQkJCSAqLwotCQkJCUlKYXZhUHJvamVjdCBqcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShmUHJvamVjdCk7Ci0JCQkJaWYgKGpwcm9qZWN0ICE9IG51bGwgJiYganByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJZW50cmllcyA9IGpwcm9qZWN0LmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCWlmIChlbnRyaWVzICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQkJLyoKLQkJCQkgKiBEb3VibGUtY2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIGJ1aWxkIHBhdGggZW50cmllcyBoYXMgbm90Ci0JCQkJICogY2hhbmdlZC4gVGhpcyBzaG91bGQgY292ZXIgbW9zdCBjYXNlcyBzdWNoIGFzIHdoZW4gYQotCQkJCSAqIGxpYnJhcnkgaXMgYWRkZWQgaW50byBvciByZW1vdmVkIGZyb20gYSBjb250YWluZXIuCi0JCQkJICovCi0JCQkJZkJ1aWxkUGF0aElzRGlydHkgPSBmQnVpbGRQYXRoSXNEaXJ0eSB8fCAoZkJ1aWxkUGF0aEVudHJ5Q291bnQgIT0gZW50cmllcy5sZW5ndGgpOwotCi0JCQkJaWYgKGZCdWlsZFBhdGhJc0RpcnR5KSB7Ci0JCQkJCWluZGV4Q2xhc3NwYXRoKGVudHJpZXMpOwotCQkJCQlmQnVpbGRQYXRoSXNEaXJ0eSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCUxPQ0sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBUYWdsaWJJbmZvIGV4dHJhY3RJbmZvKFN0cmluZyBiYXNlUGF0aCwgSW5wdXRTdHJlYW0gdGxkQ29udGVudHMpIHsKLQkJVGFnbGliSW5mbyBpbmZvID0gbmV3IFRhZ2xpYkluZm8oKTsKLQkJaWYgKHRsZENvbnRlbnRzICE9IG51bGwpIHsKLQkJCURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRG9jdW1lbnRQcm92aWRlcigpOwotCQkJcHJvdmlkZXIuc2V0SW5wdXRTdHJlYW0odGxkQ29udGVudHMpOwotCQkJcHJvdmlkZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQkJcHJvdmlkZXIuc2V0QmFzZVJlZmVyZW5jZShiYXNlUGF0aCk7Ci0JCQlOb2RlIGNoaWxkID0gcHJvdmlkZXIuZ2V0Um9vdEVsZW1lbnQoKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUgfHwgIWNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuVEFHTElCKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCWlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLlVSSSkpIHsKLQkJCQkJCWluZm8udXJpID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNIT1JUX05BTUUpIHx8IGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuU0hPUlROQU1FKSkgewotCQkJCQkJaW5mby5zaG9ydE5hbWUgPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pIHx8IGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuSU5GTykpIHsKLQkJCQkJCWluZm8uZGVzY3JpcHRpb24gPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuRElTUExBWV9OQU1FKSkgewotCQkJCQkJaW5mby5kaXNwbGF5TmFtZSA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5KU1BfVkVSU0lPTikgfHwgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5KU1BWRVJTSU9OKSkgewotCQkJCQkJaW5mby5qc3BWZXJzaW9uID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRMSUJfVkVSU0lPTikgfHwgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5UTElCVkVSU0lPTikpIHsKLQkJCQkJCWluZm8udGxpYlZlcnNpb24gPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikpIHsKLQkJCQkJCWluZm8uc21hbGxJY29uID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04pKSB7Ci0JCQkJCQlpbmZvLmxhcmdlSWNvbiA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCUxpc3QgZ2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhJUGF0aCBwYXRoKSB7Ci0JCWVuc3VyZVVwVG9kYXRlKCk7Ci0JCUNvbGxlY3Rpb24gcmVjb3JkcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmbG9hdCBqc3BWZXJzaW9uID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0SlNQVmVyc2lvbihwYXRoKTsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCi0JCQlDb2xsZWN0aW9uIGltcGxpY2l0UmVmZXJlbmNlcyA9IG5ldyBIYXNoU2V0KGdldEltcGxpY2l0UmVmZXJlbmNlcyhwYXRoLnRvU3RyaW5nKCkpLnZhbHVlcygpKTsKLQkJCXJlY29yZHMgPSBuZXcgQXJyYXlMaXN0KGZUTERSZWZlcmVuY2VzLnNpemUoKSArIGZUYWdEaXJSZWZlcmVuY2VzLnNpemUoKSArIGZKQVJSZWZlcmVuY2VzLnNpemUoKSArIGZXZWJYTUxSZWZlcmVuY2VzLnNpemUoKSk7Ci0JCQlyZWNvcmRzLmFkZEFsbChmVExEUmVmZXJlbmNlcy52YWx1ZXMoKSk7Ci0JCQlpZiAoanNwVmVyc2lvbiA+PSAxLjEpIHsKLQkJCQlyZWNvcmRzLmFkZEFsbChfZ2V0SlNQMTFBbmRXZWJYTUxKYXJSZWZlcmVuY2VzKGZKQVJSZWZlcmVuY2VzLnZhbHVlcygpKSk7Ci0JCQl9Ci0KLQkJCWlmIChqc3BWZXJzaW9uID49IDEuMikgewotCQkJCXJlY29yZHMuYWRkQWxsKGltcGxpY2l0UmVmZXJlbmNlcyk7Ci0KLQkJCQlNYXAgYnVpbGRQYXRoUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJTGlzdCBwcm9qZWN0c1Byb2Nlc3NlZCA9IG5ldyBBcnJheUxpc3QoZkNsYXNzcGF0aFByb2plY3RzLnNpemUoKSArIDEpOwotCQkJCXByb2plY3RzUHJvY2Vzc2VkLmFkZChmUHJvamVjdCk7Ci0JCQkJYWRkQnVpbGRQYXRoUmVmZXJlbmNlcyhidWlsZFBhdGhSZWZlcmVuY2VzLCBwcm9qZWN0c1Byb2Nlc3NlZCwgZmFsc2UpOwotCQkJCXJlY29yZHMuYWRkQWxsKGJ1aWxkUGF0aFJlZmVyZW5jZXMudmFsdWVzKCkpOwotCQkJfQotCQkJaWYgKGpzcFZlcnNpb24gPj0gMi4wKSB7Ci0JCQkJcmVjb3Jkcy5hZGRBbGwoZlRhZ0RpclJlZmVyZW5jZXMudmFsdWVzKCkpOwotCQkJfQotCi0JCQlyZWNvcmRzLmFkZEFsbChnZXRDYXRhbG9nUmVjb3JkcygpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KHJlY29yZHMpOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgc3RyZWFtIHRvIGEgbG9jYWwgY29weSBvZiB0aGUgaW5wdXQgb3IgbnVsbCBpZiBub3QgcG9zc2libGUKLQkgKi8KLQlwcml2YXRlIElucHV0U3RyZWFtIGdldENhY2hlZElucHV0U3RyZWFtKFppcEZpbGUgemlwRmlsZSwgWmlwRW50cnkgemlwRW50cnkpIHsKLQkJSW5wdXRTdHJlYW0gY2FjaGUgPSBudWxsOwotCQlpZiAoemlwRmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoemlwRW50cnkgIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGVudHJ5SW5wdXRTdHJlYW0gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWVudHJ5SW5wdXRTdHJlYW0gPSB6aXBGaWxlLmdldElucHV0U3RyZWFtKHppcEVudHJ5KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlRhZ2xpYiBJbmRleDogIiArIHppcEZpbGUuZ2V0TmFtZSgpLCBpb0V4Yyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQlpZiAoZW50cnlJbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCWludCBjOwotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbnVsbDsKLQkJCQkJaWYgKHppcEVudHJ5LmdldFNpemUoKSA+IDApIHsKLQkJCQkJCWJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKGludCkgemlwRW50cnkuZ2V0U2l6ZSgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkJfQotCQkJCQkvLyBhcnJheSBkaW0gcmVzdHJpY3Rpb24/Ci0JCQkJCWJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlWzIwNDhdOwotCQkJCQl0cnkgewotCQkJCQkJd2hpbGUgKChjID0gZW50cnlJbnB1dFN0cmVhbS5yZWFkKGJ5dGVzKSkgPj0gMCkgewotCQkJCQkJCWJ1ZmZlci53cml0ZShieXRlcywgMCwgYyk7Ci0JCQkJCQl9Ci0JCQkJCQljYWNoZSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZQotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQllbnRyeUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNhY2hlOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRDYXRhbG9nUmVjb3JkcygpIHsKLQkJaWYgKGZDYXRhbG9nUmVjb3JkcyA9PSBudWxsKSB7Ci0JCQlMaXN0IHJlY29yZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCQlpZiAoZGVmYXVsdENhdGFsb2cgIT0gbnVsbCkgewotCQkJCS8vIFByb2Nlc3MgZGVmYXVsdCBjYXRhbG9nCi0JCQkJSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMgPSBkZWZhdWx0Q2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotCQkJCWZvciAoaW50IGVudHJ5ID0gMDsgZW50cnkgPCBlbnRyaWVzLmxlbmd0aDsgZW50cnkrKykgewotCQkJCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IGNyZWF0ZUNhdGFsb2dSZWNvcmQoZW50cmllc1tlbnRyeV0pOwotCQkJCQlyZWNvcmRzLmFkZChyZWNvcmQpOwotCQkJCX0KLQotCQkJCS8vIFByb2Nlc3MgZGVjbGFyZWQgT0FTSVMgbmV4dENhdGFsb2dzIGNhdGFsb2cKLQkJCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJCQlmb3IgKGludCBuZXh0Q2F0YWxvZyA9IDA7IG5leHRDYXRhbG9nIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgbmV4dENhdGFsb2crKykgewotCQkJCQlJQ2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW25leHRDYXRhbG9nXS5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJCQlJQ2F0YWxvZ0VudHJ5W10gZW50cmllczIgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQkJCWZvciAoaW50IGVudHJ5ID0gMDsgZW50cnkgPCBlbnRyaWVzMi5sZW5ndGg7IGVudHJ5KyspIHsKLQkJCQkJCVN0cmluZyB1cmkgPSBlbnRyaWVzMltlbnRyeV0uZ2V0VVJJKCk7Ci0JCQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJCQl1cmkgPSB1cmkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKLQkJCQkJCQlpZiAodXJpLmVuZHNXaXRoKCgiLmphciIpKSB8fCB1cmkuZW5kc1dpdGgoKCIudGxkIikpKSB7Ci0JCQkJCQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gY3JlYXRlQ2F0YWxvZ1JlY29yZChlbnRyaWVzMltlbnRyeV0pOwotCQkJCQkJCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCQkJCQkJCXJlY29yZHMuYWRkKHJlY29yZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmQ2F0YWxvZ1JlY29yZHMgPSByZWNvcmRzOwotCQl9Ci0JCXJldHVybiBmQ2F0YWxvZ1JlY29yZHM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpbXBsaWNpdFJlZmVyZW5jZXMgZm9yIHRoZSBnaXZlbiBwYXRoCi0JICovCi0JSGFzaHRhYmxlIGdldEltcGxpY2l0UmVmZXJlbmNlcyhTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgbG9jYWxSb290ID0gZ2V0TG9jYWxSb290KHBhdGgpOwotCQlIYXNodGFibGUgaW1wbGljaXRSZWZlcmVuY2VzID0gKEhhc2h0YWJsZSkgZkltcGxpY2l0UmVmZXJlbmNlcy5nZXQobG9jYWxSb290KTsKLQkJaWYgKGltcGxpY2l0UmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlpbXBsaWNpdFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlNYXAoMSk7Ci0JCQlmSW1wbGljaXRSZWZlcmVuY2VzLnB1dChsb2NhbFJvb3QsIGltcGxpY2l0UmVmZXJlbmNlcyk7Ci0JCX0KLQkJcmV0dXJuIGltcGxpY2l0UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiBAcmV0dXJuIHRoZSBhcHBsaWNhYmxlIFdlYiBjb250ZXh0IHJvb3QgcGF0aCwgaWYgb25lIGV4aXN0cwotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JSVBhdGggZ2V0TG9jYWxSb290KElQYXRoIGJhc2VQYXRoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0JCS8vIGV4aXN0aW5nIHdvcmtzcGFjZSByZXNvdXJjZXMgLSB0aGlzIGlzIHRoZSA5MyUgY2FzZQotCQlJUmVzb3VyY2UgZmlsZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGJhc2VQYXRoKTsKLQotCQkvLyBUcnkgdGhlIGJhc2UgcGF0aCBhcyBhIGZvbGRlciBmaXJzdAotCQlpZiAoZmlsZSA9PSBudWxsICYmIGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKGJhc2VQYXRoKTsKLQkJfQotCQkvLyBJZiBub3QgYSBmb2xkZXIsIHRoZW4gdHJ5IGJhc2UgcGF0aCBhcyBhIGZpbGUKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5leGlzdHMoKSAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoYmFzZVBhdGgpOwotCQl9Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7Ci0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCQl9Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1MjkKLQkJCSAqIAotCQkJICogVGhpcyBtZXRob2QgcHJvZHVjZXMgYSBsZXNzIGFjY3VyYXRlIHJlc3VsdCwgYnV0IGRvZXNuJ3QKLQkJCSAqIHJlcXVpcmUgdGhhdCB0aGUgZmlsZSBleGlzdCB5ZXQuCi0JCQkgKi8KLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKGJhc2VQYXRoKTsKLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKQotCQkJCWZpbGUgPSBmaWxlc1swXTsKLQkJfQotCi0JCXdoaWxlIChmaWxlICE9IG51bGwpIHsKLQkJCS8qKgotCQkJICogVHJlYXQgYW55IHBhcmVudCBmb2xkZXIgd2l0aCBhIFdFQi1JTkYgc3ViZm9sZGVyIGFzIGEgd2ViLWFwcAotCQkJICogcm9vdAotCQkJICovCi0JCQlJQ29udGFpbmVyIGZvbGRlciA9IG51bGw7Ci0JCQlpZiAoKGZpbGUuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZPTERFUikgIT0gMCkgewotCQkJCWZvbGRlciA9IChJQ29udGFpbmVyKSBmaWxlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9sZGVyID0gZmlsZS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCS8vIGdldEZvbGRlciBvbiBhIHdvcmtzcGFjZSByb290IG11c3QgdXNlIGEgZnVsbCBwYXRoLCBza2lwCi0JCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgKGZvbGRlci5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUk9PVCkgPT0gMCkgewotCQkJCUlGb2xkZXIgd2ViaW5mID0gZm9sZGVyLmdldEZvbGRlcihXRUJfSU5GX1BBVEgpOwotCQkJCWlmICh3ZWJpbmYgIT0gbnVsbCAmJiB3ZWJpbmYuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJCWZpbGUgPSBmaWxlLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJcmV0dXJuIGZQcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2FsUm9vdChTdHJpbmcgYmFzZVBhdGgpIHsKLQkJcmV0dXJuIGdldExvY2FsUm9vdChuZXcgUGF0aChiYXNlUGF0aCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dENvbnRlbnRzKE5vZGUgcGFyZW50KSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuLmdldExlbmd0aCgpID09IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlbi5pdGVtKDApLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCVN0cmluZyByZWZlcmVuY2UgPSAoKEVudGl0eVJlZmVyZW5jZSkgY2hpbGQpLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmVmZXJlbmNlID0gIiYiICsgY2hpbGQuZ2V0Tm9kZU5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQlzLmFwcGVuZChyZWZlcmVuY2UudHJpbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzLmFwcGVuZChjaGlsZC5nZXROb2RlVmFsdWUoKS50cmltKCkpOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBzLnRvU3RyaW5nKCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmlzaXRvci4KLQkgKi8KLQlJUmVzb3VyY2VEZWx0YVZpc2l0b3IgZ2V0VmlzaXRvcigpIHsKLQkJaWYgKGZWaXNpdG9yID09IG51bGwpIHsKLQkJCWZWaXNpdG9yID0gbmV3IERlbHRhVmlzaXRvcigpOwotCQl9Ci0JCXJldHVybiBmVmlzaXRvcjsKLQl9Ci0KLQl2b2lkIGhhbmRsZUVsZW1lbnRDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChmQnVpbGRQYXRoSXNEaXJ0eSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIklKYXZhRWxlbWVudERlbHRhOiAiICsgZGVsdGEpOwotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UICYmICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQpLmlzQXJjaGl2ZSgpKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UICYmICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQpLmlzRXh0ZXJuYWwoKSkgewotCQkJfQotCQkJU3RyaW5nIGxpYkxvY2F0aW9uID0gbnVsbDsKLQkJCWludCB0YWdsaWJSZWNvcmRFdmVudEtpbmQgPSAtMTsKLQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSA+IDAgfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FSQ0hJVkVfQ09OVEVOVF9DSEFOR0VEKSA+IDAgfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpID4gMCkgewotCQkJCXRhZ2xpYlJlY29yZEV2ZW50S2luZCA9IElUYWdsaWJJbmRleERlbHRhLkFEREVEOwotCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZWxlbWVudC5nZXRQYXRoKCkpOwotCQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpICYmIGZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKQotCQkJCQlsaWJMb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCWVsc2UKLQkJCQkJbGliTG9jYXRpb24gPSBlbGVtZW50LmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGxpYkxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGZyYWdtZW50aXNFeHBvcnRlZCA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IHJhd0NsYXNzcGF0aEVudHJ5ID0gKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCkuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTsKLQkJCQkJLyoKLQkJCQkJICogbnVsbCBtYXkgYWxzbyBiZSByZXR1cm5lZCBmb3IgZGVsZXRpb25zIGRlcGVuZGluZyBvbgotCQkJCQkgKiByZXNvdXJjZS9idWlsZCBwYXRoIG5vdGlmaWNhdGlvbiBvcmRlci4gSWYgaXQncyBudWxsLAotCQkJCQkgKiBpdCdzIGJlZW4gZGVsZXRlZCBhbmQgd2hldGhlciBpdCdzIGV4cG9ydGVkIHdvbid0Ci0JCQkJCSAqIHJlYWxseSBtYXR0ZXIKLQkJCQkJICovCi0JCQkJCWlmIChyYXdDbGFzc3BhdGhFbnRyeSAhPSBudWxsKSB7Ci0JCQkJCQlmcmFnbWVudGlzRXhwb3J0ZWQgPSByYXdDbGFzc3BhdGhFbnRyeS5pc0V4cG9ydGVkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlByb2JsZW0gaGFuZGxpbmcgYnVpbGQgcGF0aCBlbnRyeSBmb3IgIiArIGVsZW1lbnQuZ2V0UGF0aCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSCkgPiAwKSB7Ci0JCQkJCWZCdWlsZFBhdGhFbnRyeUNvdW50Kys7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSA+IDApIHsKLQkJCQkJZkJ1aWxkUGF0aEVudHJ5Q291bnQtLTsKLQkJCQl9Ci0JCQkJdXBkYXRlQ2xhc3NwYXRoTGlicmFyeShsaWJMb2NhdGlvbiwgdGFnbGliUmVjb3JkRXZlbnRLaW5kLCBmcmFnbWVudGlzRXhwb3J0ZWQpOwotCQkJfQotCQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicHJvY2Vzc2VkIGJ1aWxkIHBhdGggZGVsdGEgZm9yICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiKCIgKyBlbGVtZW50LmdldFBhdGgoKSArICIpIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLQotCXZvaWQgaW5kZXgoKSB7Ci0JCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJZlRMRFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJZkpBUlJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJZlRhZ0RpclJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJZldlYlhNTFJlZmVyZW5jZXMuY2xlYXIoKTsKLQotCQl0cnkgewotCQkJZlByb2plY3QuYWNjZXB0KG5ldyBJbmRleGVyKCksIDApOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQotCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImluZGV4ZWQgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgY29udGVudHMgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0Jdm9pZCBpbmRleENsYXNzcGF0aCgpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWZDbGFzc3BhdGhQcm9qZWN0cy5jbGVhcigpOwotCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcy5jbGVhcigpOwotCQlmQ2xhc3NwYXRoSmFycy5jbGVhcigpOwotCQlmQnVpbGRQYXRoRW50cnlDb3VudCA9IDA7Ci0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGZQcm9qZWN0KTsKLQkJLyoKLQkJICogSWYgdGhlIEphdmEgbmF0dXJlIGlzbid0IHByZXNlbnQgKG9yIHNvbWV0aGluZyBlbHNlIGlzIHdyb25nKSwKLQkJICogZG9uJ3QgY2hlY2sgdGhlIGJ1aWxkIHBhdGguCi0JCSAqLwotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCAmJiBqYXZhUHJvamVjdC5leGlzdHMoKSkgewotCQkJaW5kZXhDbGFzc3BhdGgoamF2YVByb2plY3QpOwotCQl9Ci0JCS8vIGVsc2UgewotCQkvLyBMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGFnbGliSW5kZXggd2FzIGFza2VkIHRvIGluZGV4IG5vbi1KYXZhCi0JCS8vIFByb2plY3QgIiArIGZQcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gfQotCi0JCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiaW5kZXhlZCAiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIiBjbGFzc3BhdGggaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXZvaWQgaW5kZXhDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJZkNsYXNzcGF0aFByb2plY3RzLmNsZWFyKCk7Ci0JCWZDbGFzc3BhdGhSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCWZDbGFzc3BhdGhKYXJzLmNsZWFyKCk7Ci0KLQkJZkJ1aWxkUGF0aEVudHJ5Q291bnQgPSBlbnRyaWVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbmRleENsYXNzcGF0aChlbnRyaWVzW2ldKTsKLQkJfQotCi0JCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiaW5kZXhlZCAiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIiBjbGFzc3BhdGggaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbnRyeQotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzcGF0aChJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiA6IHsKLQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ2xhc3NwYXRoQ29udGFpbmVyKSBlbnRyeTsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjb250YWluZWRFbnRyaWVzID0gY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5lZEVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW5kZXhDbGFzc3BhdGgoY29udGFpbmVkRW50cmllc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOiB7Ci0JCQkJLyoKLQkJCQkgKiBJZ25vcmUgbGlicyBpbiByZXF1aXJlZCBwcm9qZWN0cyB0aGF0IGFyZSBub3QgZXhwb3J0ZWQKLQkJCQkgKi8KLQkJCQlJUGF0aCBsaWJQYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCWlmICghZkNsYXNzcGF0aEphcnMuY29udGFpbnNLZXkobGliUGF0aC50b1N0cmluZygpKSkgewotCQkJCQlpZiAobGliUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCQkJdXBkYXRlQ2xhc3NwYXRoTGlicmFyeShsaWJQYXRoLnRvU3RyaW5nKCksIElUYWdsaWJJbmRleERlbHRhLkFEREVELCBlbnRyeS5pc0V4cG9ydGVkKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLyoKLQkJCQkJCSAqIE5vdGU6IC5qYXJzIG9uIHRoZSBjbGFzc3BhdGggaW5zaWRlIG9mIHRoZSBwcm9qZWN0Ci0JCQkJCQkgKiB3aWxsIGhhdmUgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIEpBUiByZWZlcmVuY2VzCi0JCQkJCQkgKiB0YWJsZSB0aGF0IHdpbGwgZSByZXR1cm5lZCB0bwotCQkJCQkJICogZ2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcygpLgotCQkJCQkJICovCi0JCQkJCQlJRmlsZSBsaWJGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGxpYlBhdGgpOwotCQkJCQkJaWYgKGxpYkZpbGUgIT0gbnVsbCAmJiBsaWJGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJdXBkYXRlQ2xhc3NwYXRoTGlicmFyeShsaWJGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgSVRhZ2xpYkluZGV4RGVsdGEuQURERUQsIGVudHJ5LmlzRXhwb3J0ZWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6IHsKLQkJCQkvKgotCQkJCSAqIFdlJ3JlIGN1cnJlbnRseSBpZ25vcmluZyB3aGV0aGVyIHRoZSBwcm9qZWN0IGV4cG9ydHMgYWxsIG9mCi0JCQkJICogaXRzIGJ1aWxkIHBhdGgKLQkJCQkgKi8KLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKTsKLQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCWZDbGFzc3BhdGhQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOiB7Ci0JCQkJSVBhdGggbGliUGF0aCA9IEphdmFDb3JlLmdldFJlc29sdmVkVmFyaWFibGVQYXRoKGVudHJ5LmdldFBhdGgoKSk7Ci0JCQkJaWYgKGxpYlBhdGggIT0gbnVsbCkgewotCQkJCQlGaWxlIGZpbGUgPSBsaWJQYXRoLnRvRmlsZSgpOwotCi0JCQkJCS8vIGZpbGUgaW4gZmlsZXN5c3RlbQotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQl1cGRhdGVDbGFzc3BhdGhMaWJyYXJ5KGxpYlBhdGgudG9TdHJpbmcoKSwgSVRhZ2xpYlJlY29yZEV2ZW50LkFEREVELCBlbnRyeS5pc0V4cG9ydGVkKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gd29ya3NwYWNlIGZpbGUKLQkJCQkJCUlGaWxlIGphckZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobGliUGF0aCk7Ci0JCQkJCQlpZiAoamFyRmlsZS5pc0FjY2Vzc2libGUoKSAmJiBqYXJGaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBqYXJGaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBqYXJQYXRoU3RyaW5nID0gamFyRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJdXBkYXRlQ2xhc3NwYXRoTGlicmFyeShqYXJQYXRoU3RyaW5nLCBJVGFnbGliUmVjb3JkRXZlbnQuQURERUQsIGVudHJ5LmlzRXhwb3J0ZWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHByaXZhdGUgdm9pZCByZW1vdmVDbGFzc3BhdGhMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TG9jYXRpb24pIHsgSmFyUmVjb3JkCi0JICogcmVjb3JkID0gKEphclJlY29yZCkgZkNsYXNzcGF0aEphcnMucmVtb3ZlKGxpYnJhcnlMb2NhdGlvbik7IGlmIChyZWNvcmQgIT0KLQkgKiBudWxsKSB7IFVSTFJlY29yZFtdIHJlY29yZHMgPSAoVVJMUmVjb3JkW10pCi0JICogcmVjb3JkLmdldFVSTFJlY29yZHMoKS50b0FycmF5KG5ldyBVUkxSZWNvcmRbMF0pOyBmb3IgKGludCBpID0gMDsgaSA8Ci0JICogcmVjb3Jkcy5sZW5ndGg7IGkrKykgewotCSAqIGZDbGFzc3BhdGhSZWZlcmVuY2VzLnJlbW92ZShyZWNvcmRzW2ldLmdldFVSSSgpKTsgfQotCSAqIFRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQocmVjb3JkLAotCSAqIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsgfSB9Ci0JICovCi0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QuZXF1YWxzKGZQcm9qZWN0KSkgewotCQkJdHJ5IHsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCQkJZkJ1aWxkUGF0aEVudHJ5Q291bnQgPSBlbnRyaWVzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW5kZXhDbGFzc3BhdGgoZW50cmllc1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3Igc2VhcmNoaW5nIEphdmEgQnVpbGQgUGF0aCArICgiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIikgZm9yIHRhZyBsaWJyYXJpZXMiLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZWFkVGV4dG9mQ2hpbGQoTm9kZSBub2RlLCBTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKSB7Ci0JCQkJcmV0dXJuIGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jdm9pZCByZW1vdmVKQVIoSVJlc291cmNlIGphcikgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJyZW1vdmluZyByZWNvcmRzIGZvciBKQVIgIiArIGphci5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlKYXJSZWNvcmQgcmVjb3JkID0gKEphclJlY29yZCkgZkpBUlJlZmVyZW5jZXMucmVtb3ZlKGphci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCVVSTFJlY29yZFtdIHJlY29yZHMgPSAoVVJMUmVjb3JkW10pIHJlY29yZC5nZXRVUkxSZWNvcmRzKCkudG9BcnJheShuZXcgVVJMUmVjb3JkWzBdKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZHNbaV0sIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsKLQkJCQkoKEFycmF5TWFwKSBnZXRJbXBsaWNpdFJlZmVyZW5jZXMoamFyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpLnJlbW92ZShyZWNvcmRzW2ldLmdldFVSSSgpLCByZWNvcmRzW2ldKTsKLQkJCX0KLQkJCWlmIChyZWNvcmQuaGFzMTFUTEQpIHsKLQkJCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFnKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlUYWdEaXJSZWNvcmQgcmVjb3JkID0gKFRhZ0RpclJlY29yZCkgZlRhZ0RpclJlZmVyZW5jZXMuZ2V0KHJlc291cmNlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJcmVjb3JkLnRhZ3MucmVtb3ZlKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLkNIQU5HRUQpKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFnRGlyKElSZXNvdXJjZSB0YWdkaXIpIHsKLQkJSVBhdGggdGFnZGlyUGF0aCA9IHRhZ2Rpci5nZXRGdWxsUGF0aCgpOwotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJyZW1vdmluZyByZWNvcmQgZm9yICIgKyB0YWdkaXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmVGFnRGlyUmVmZXJlbmNlcy5yZW1vdmUodGFnZGlyUGF0aC50b1N0cmluZygpKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVExEKElSZXNvdXJjZSB0bGQpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZpbmcgcmVjb3JkIGZvciAiICsgdGxkLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCVRMRFJlY29yZCByZWNvcmQgPSAoVExEUmVjb3JkKSBmVExEUmVmZXJlbmNlcy5yZW1vdmUodGxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJaWYgKHJlY29yZC5nZXRVUkkoKSAhPSBudWxsKSB7Ci0JCQkJKChBcnJheU1hcCkgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHRsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKS5yZW1vdmUocmVjb3JkLmdldFVSSSgpLCByZWNvcmQpOwotCQkJfQotCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVdlYlhNTChJUmVzb3VyY2Ugd2VieG1sKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIHJlY29yZHMgZm9yICIgKyB3ZWJ4bWwuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJV2ViWE1MUmVjb3JkIHJlY29yZCA9IChXZWJYTUxSZWNvcmQpIGZXZWJYTUxSZWZlcmVuY2VzLnJlbW92ZSh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlUTERSZWNvcmRbXSByZWNvcmRzID0gKFRMRFJlY29yZFtdKSByZWNvcmQuZ2V0VExEUmVjb3JkcygpLnRvQXJyYXkobmV3IFRMRFJlY29yZFswXSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92ZWQgcmVjb3JkIGZvciAiICsgcmVjb3Jkc1tpXS5nZXRVUkkoKSArICJAIiArIHJlY29yZHNbaV0ucGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSgoQXJyYXlNYXApIGdldEltcGxpY2l0UmVmZXJlbmNlcyh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkucmVtb3ZlKHJlY29yZHNbaV0uZ2V0VVJJKCksIHJlY29yZHNbaV0pOwotCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZHNbaV0sIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JSVRhZ2xpYlJlY29yZCByZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSkgewotCQllbnN1cmVVcFRvZGF0ZSgpOwotCi0JCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gbnVsbDsKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQl0cnkgewotCQkJZmxvYXQganNwVmVyc2lvbiA9IERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldEpTUFZlcnNpb24obmV3IFBhdGgoYmFzZVBhdGgpKTsKLQotCQkJLyoqCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk2MTc3IFN1cHBvcnQKLQkJCSAqIHJlc29sdXRpb24gaW4gZmxleGlibGUgcHJvamVjdHMKLQkJCSAqLwotCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5yZXNvbHZlKG5ldyBQYXRoKGJhc2VQYXRoKSwgcmVmZXJlbmNlKTsKLQkJCWlmIChyZXNvdXJjZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJaWYgKHJlc291cmNlUGF0aC50b1N0cmluZygpLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCk7Ci0JCQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQlwYXRoID0gcmVzb3VyY2VQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKTsKLQkJCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCXBhdGggPSByZXNvdXJjZVBhdGgudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJTE9DSy5hY3F1aXJlKCk7Ci0KLQkJCS8qKgotCQkJICogV29ya2Fyb3VuZCBmb3IgcHJvYmxlbSBpbiBVUklIZWxwZXI7IHVyaXMgc3RhcnRpbmcgd2l0aCAnLycgYXJlCi0JCQkgKiByZXR1cm5lZCBhcy1pcy4KLQkJCSAqLwotCQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJCWlmIChyZWZlcmVuY2Uuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcGF0aCA9IGdldExvY2FsUm9vdChiYXNlUGF0aCkgKyByZWZlcmVuY2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZShyZWZlcmVuY2UsIGJhc2VQYXRoLCBnZXRMb2NhbFJvb3QoYmFzZVBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9yZGVyIGRpY3RhdGVkIGJ5IEpTUCBzcGVjIDIuMCBzZWN0aW9uIDcuMi4zCi0JCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZkpBUlJlZmVyZW5jZXMuZ2V0KHBhdGgpOwotCi0JCQkvLyBvbmx5IGlmIDEuMSBUTEQgd2FzIGZvdW5kCi0JCQlpZiAoanNwVmVyc2lvbiA8IDEuMSB8fCAocmVjb3JkIGluc3RhbmNlb2YgSmFyUmVjb3JkICYmICEoKEphclJlY29yZCkgcmVjb3JkKS5oYXMxMVRMRCkpIHsKLQkJCQlyZWNvcmQgPSBudWxsOwotCQkJfQotCQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGZUTERSZWZlcmVuY2VzLmdldChwYXRoKTsKLQkJCX0KLQkJCWlmIChyZWNvcmQgPT0gbnVsbCAmJiBqc3BWZXJzaW9uID49IDEuMikgewotCQkJCU9iamVjdFtdIHJlY29yZHMgPSAoT2JqZWN0W10pIGdldEltcGxpY2l0UmVmZXJlbmNlcyhiYXNlUGF0aCkuZ2V0KHJlZmVyZW5jZSk7Ci0JCQkJaWYgKHJlY29yZHMgIT0gbnVsbCAmJiByZWNvcmRzLmxlbmd0aCA+IDApIHsKLQkJCQkJaWYgKHJlY29yZHMubGVuZ3RoID4gMSkKLQkJCQkJCXJlY29yZHMgPSBmVGFnbGliU29ydGVyLnNvcnQocmVjb3Jkcyk7Ci0JCQkJCXJlY29yZCA9ICAoSVRhZ2xpYlJlY29yZCkgcmVjb3Jkc1tyZWNvcmRzLmxlbmd0aCAtIDFdOwotCQkJCX0KLQkJCX0KLQotCi0JCQlpZiAocmVjb3JkID09IG51bGwgJiYganNwVmVyc2lvbiA+PSAyLjApIHsKLQkJCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZlRhZ0RpclJlZmVyZW5jZXMuZ2V0KHBhdGgpOwotCQkJfQotCi0JCQlpZiAocmVjb3JkID09IG51bGwgJiYganNwVmVyc2lvbiA+PSAxLjIpIHsKLQkJCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZkNsYXNzcGF0aFJlZmVyZW5jZXMuZ2V0KHJlZmVyZW5jZSk7Ci0JCQl9Ci0JCQlpZiAocmVjb3JkID09IG51bGwgJiYganNwVmVyc2lvbiA+PSAxLjIpIHsKLQkJCQlNYXAgYnVpbGRQYXRoUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJTGlzdCBwcm9qZWN0c1Byb2Nlc3NlZCA9IG5ldyBBcnJheUxpc3QoZkNsYXNzcGF0aFByb2plY3RzLnNpemUoKSArIDEpOwotCQkJCXByb2plY3RzUHJvY2Vzc2VkLmFkZChmUHJvamVjdCk7Ci0JCQkJYWRkQnVpbGRQYXRoUmVmZXJlbmNlcyhidWlsZFBhdGhSZWZlcmVuY2VzLCBwcm9qZWN0c1Byb2Nlc3NlZCwgZmFsc2UpOwotCQkJCXJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBidWlsZFBhdGhSZWZlcmVuY2VzLmdldChyZWZlcmVuY2UpOwotCQkJfQotCi0JCQkvLyBDaGVjayB0aGUgWE1MIENhdGFsb2cKLQkJCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJCUlDYXRhbG9nIGNhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQkJCWlmIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHJlc29sdmVkU3RyaW5nID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIENoZWNrIGFzIHN5c3RlbSByZWZlcmVuY2UgZmlyc3QKLQkJCQkJCXJlc29sdmVkU3RyaW5nID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKHJlZmVyZW5jZSk7Ci0JCQkJCQkvLyBDaGVjayBhcyBVUkkKLQkJCQkJCWlmIChyZXNvbHZlZFN0cmluZyA9PSBudWxsIHx8IHJlc29sdmVkU3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJcmVzb2x2ZWRTdHJpbmcgPSBjYXRhbG9nLnJlc29sdmVVUkkocmVmZXJlbmNlKTsKLQkJCQkJCX0KLQkJCQkJCS8vIENoZWNrIGFzIHB1YmxpYyBJRAotCQkJCQkJaWYgKHJlc29sdmVkU3RyaW5nID09IG51bGwgfHwgcmVzb2x2ZWRTdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlyZXNvbHZlZFN0cmluZyA9IGNhdGFsb2cucmVzb2x2ZVB1YmxpYyhyZWZlcmVuY2UsIGJhc2VQYXRoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJlc29sdmVkU3RyaW5nICE9IG51bGwgJiYgcmVzb2x2ZWRTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJcmVjb3JkID0gY3JlYXRlQ2F0YWxvZ1JlY29yZChyZWZlcmVuY2UsIHJlc29sdmVkU3RyaW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIElmIG5vIHJlY29yZHMgd2VyZSBmb3VuZCBhbmQgbm8gbG9jYWwtcm9vdCBhcHBsaWVzLCBjaGVjayBBTEwKLQkJCSAqIG9mIHRoZSB3ZWIueG1sIGZpbGVzIGFzIGEgZmFsbGJhY2sKLQkJCSAqLwotCQkJaWYgKHJlY29yZCA9PSBudWxsICYmIGZQcm9qZWN0LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoZ2V0TG9jYWxSb290KGJhc2VQYXRoKSkpIHsKLQkJCQlXZWJYTUxSZWNvcmRbXSB3ZWJ4bWxzID0gKFdlYlhNTFJlY29yZFtdKSBmV2ViWE1MUmVmZXJlbmNlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBXZWJYTUxSZWNvcmRbMF0pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2VieG1scy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocmVjb3JkICE9IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJT2JqZWN0W10gcmVjb3JkcyA9IChPYmplY3RbXSkgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHdlYnhtbHNbaV0ucGF0aC50b1N0cmluZygpKS5nZXQocmVmZXJlbmNlKTsKLQkJCQkJaWYgKHJlY29yZHMgIT0gbnVsbCAmJiByZWNvcmRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCWlmIChyZWNvcmRzLmxlbmd0aCA+IDEpCi0JCQkJCQkJcmVjb3JkcyA9IGZUYWdsaWJTb3J0ZXIuc29ydChyZWNvcmRzKTsKLQkJCQkJCXJlY29yZCA9ICAoSVRhZ2xpYlJlY29yZCkgcmVjb3Jkc1tyZWNvcmRzLmxlbmd0aCAtIDFdOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVjb3JkOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIGFueSBzYXZlZCByZWZlcmVuY2UgdGFibGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVSZWZlcmVuY2VzKCkgewotCQlmaW5hbCBib29sZWFuIG5vdGlmeU9uUmVzdG9yYXRpb24gPSB0cnVlOwotCQlpZiAoVGFnbGliSW5kZXguRU5BQkxFRCkgewotCQkJLy8gcmVzb3VyY2VzIGZpcnN0Ci0JCQlpbmRleCgpOwotCQkJLy8gbm93IGJ1aWxkIHBhdGgKLQotCQkJLy8gPT09PT09PT09PT09PT09PSB0ZXN0IHJlbG9hZCB0aW1lID09PT09PT09PT09PT09PT09PT09PT09PQotCQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOwotCQkJRmlsZSBzYXZlZFN0YXRlID0gbmV3IEZpbGUoZlNhdmVTdGF0ZUZpbGVuYW1lKTsKLQkJCWlmIChzYXZlZFN0YXRlLmV4aXN0cygpKSB7Ci0JCQkJUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oc2F2ZWRTdGF0ZSkpLCAiVVRGLTE2Iik7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCS8vIHVzZSBhIHN0cmluZyBidWZmZXIgdGVtcG9yYXJpbHkgdG8gcmVkdWNlIHN0cmluZwotCQkJCQkvLyBjcmVhdGlvbgotCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQljaGFyIGFycmF5W10gPSBuZXcgY2hhclsyMDQ4XTsKLQkJCQkJaW50IGNoYXJzUmVhZCA9IDA7Ci0JCQkJCXdoaWxlICgoY2hhcnNSZWFkID0gcmVhZGVyLnJlYWQoYXJyYXkpKSAhPSAtMSkgewotCQkJCQkJaWYgKGNoYXJzUmVhZCA+IDApIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKGFycmF5LCAwLCBjaGFyc1JlYWQpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJSURvY3VtZW50IGRvYyA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50KCk7Ci0JCQkJCWRvYy5zZXQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQlpbnQgbGluZXMgPSBkb2MuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQkJCQlpZiAobGluZXMgPiAwKSB7Ci0JCQkJCQlJUmVnaW9uIGxpbmUgPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uKDApOwotCQkJCQkJU3RyaW5nIGxpbmVUZXh0ID0gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJCQkJCUphclJlY29yZCBsaWJyYXJ5UmVjb3JkID0gbnVsbDsKLQkJCQkJCWlmIChTQVZFX0ZPUk1BVF9WRVJTSU9OLmVxdWFscyhsaW5lVGV4dC50cmltKCkpKSB7Ci0JCQkJCQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLQkJCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IGxpbmVzICYmICFmQnVpbGRQYXRoSXNEaXJ0eTsgaSsrKSB7Ci0JCQkJCQkJCWxpbmUgPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCQkJCQlsaW5lVGV4dCA9IGRvYy5nZXQobGluZS5nZXRPZmZzZXQoKSwgbGluZS5nZXRMZW5ndGgoKSk7Ci0JCQkJCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZVRleHQsICJ8Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaWYgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQkJU3RyaW5nIHRva2VuVHlwZSA9IHRva2VyLm5leHRUb2tlbigpOwotCQkJCQkJCQkJaWYgKCJKQVIiLmVxdWFsc0lnbm9yZUNhc2UodG9rZW5UeXBlKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQlib29sZWFuIGhhczExVExEID0gQm9vbGVhbi52YWx1ZU9mKHRva2VyLm5leHRUb2tlbigpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJCQkJCQlib29sZWFuIGV4cG9ydGVkID0gQm9vbGVhbi52YWx1ZU9mKHRva2VyLm5leHRUb2tlbigpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJCQkJCQkvLyBtYWtlIHRoZSByZXN0IHRoZSBsaWJyYXJ5TG9jYXRpb24KLQkJCQkJCQkJCQlTdHJpbmcgbGlicmFyeUxvY2F0aW9uID0gdG9rZXIubmV4dFRva2VuKCk7Ci0JCQkJCQkJCQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQkJCQlsaWJyYXJ5TG9jYXRpb24gPSBsaWJyYXJ5TG9jYXRpb24gKyAifCIgKyB0b2tlci5uZXh0VG9rZW4oKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWxpYnJhcnlMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbi50cmltKCk7Ci0JCQkJCQkJCQkJaWYgKGxpYnJhcnlSZWNvcmQgIT0gbnVsbCAmJiBub3RpZnlPblJlc3RvcmF0aW9uKSB7Ci0JCQkJCQkJCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIGxpYnJhcnlSZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLkFEREVEKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCS8vIENyZWF0ZSBhIG5ldyBKYXJSZWNvcmQKLQkJCQkJCQkJCQlsaWJyYXJ5UmVjb3JkID0gY3JlYXRlSkFSUmVjb3JkKGxpYnJhcnlMb2NhdGlvbik7Ci0JCQkJCQkJCQkJbGlicmFyeVJlY29yZC5oYXMxMVRMRCA9IGhhczExVExEOwotCQkJCQkJCQkJCWxpYnJhcnlSZWNvcmQuaXNFeHBvcnRlZCA9IGV4cG9ydGVkOwotCi0JCQkJCQkJCQkJLy8gQWRkIGEgVVJMUmVjb3JkIGZvciB0aGUgMS4xIFRMRAotCQkJCQkJCQkJCWlmIChoYXMxMVRMRCkgewotCQkJCQkJCQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShsaWJyYXJ5TG9jYXRpb24sIEphclV0aWxpdGllcy5KU1AxMV9UQUdMSUIpOwotCQkJCQkJCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8obGlicmFyeUxvY2F0aW9uLCBjb250ZW50cyk7Ci0KLQkJCQkJCQkJCQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby51cmkgIT0gbnVsbCAmJiBpbmZvLnVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCQkJCQlVUkxSZWNvcmQgdXJsUmVjb3JkID0gbmV3IFVSTFJlY29yZCgpOwotCQkJCQkJCQkJCQkJCXVybFJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQkJCQkJCQkJCQl1cmxSZWNvcmQuaXNFeHBvcnRlZCA9IGV4cG9ydGVkOwotCQkJCQkJCQkJCQkJCXVybFJlY29yZC5iYXNlTG9jYXRpb24gPSBsaWJyYXJ5TG9jYXRpb247Ci0JCQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCQkJdXJsUmVjb3JkLnVybCA9IG5ldyBVUkwoImphcjpmaWxlOiIgKyBsaWJyYXJ5TG9jYXRpb24gKyAiIS8iICsgSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLnVybFJlY29yZHMuYWRkKHVybFJlY29yZCk7Ci0JCQkJCQkJCQkJCQkJCWZDbGFzc3BhdGhSZWZlcmVuY2VzLnB1dCh1cmxSZWNvcmQuZ2V0VVJJKCksIHVybFJlY29yZCk7Ci0JCQkJCQkJCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0ZWQgcmVjb3JkIGZvciAiICsgdXJsUmVjb3JkLmdldFVSSSgpICsgIkAiICsgdXJsUmVjb3JkLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQkJCQkvKgotCQkJCQkJCQkJCQkJCQkgKiBkb24ndCByZWNvcmQgdGhpcwotCQkJCQkJCQkJCQkJCQkgKiBVUkkKLQkJCQkJCQkJCQkJCQkJICovCi0JCQkJCQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJCWZDbGFzc3BhdGhKYXJzLnB1dChsaWJyYXJ5TG9jYXRpb24sIGxpYnJhcnlSZWNvcmQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoIlVSTCIuZXF1YWxzSWdub3JlQ2FzZSh0b2tlblR5cGUpICYmIGxpYnJhcnlSZWNvcmQgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJLy8gcmVsaWVzIG9uIGEgcHJldmlvdXNseSBkZWNsYXJlZCBKQVIKLQkJCQkJCQkJCQkvLyByZWNvcmQKLQkJCQkJCQkJCQlib29sZWFuIGV4cG9ydGVkID0gQm9vbGVhbi52YWx1ZU9mKHRva2VyLm5leHRUb2tlbigpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJCQkJCQkvLyBtYWtlIHRoZSByZXN0IHRoZSBVUkwKLQkJCQkJCQkJCQlTdHJpbmcgdXJsU3RyaW5nID0gdG9rZXIubmV4dFRva2VuKCk7Ci0JCQkJCQkJCQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQkJCQl1cmxTdHJpbmcgPSB1cmxTdHJpbmcgKyAifCIgKyB0b2tlci5uZXh0VG9rZW4oKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCXVybFN0cmluZyA9IHVybFN0cmluZy50cmltKCk7Ci0JCQkJCQkJCQkJLy8gQXBwZW5kIGEgVVJMcmVjb3JkCi0JCQkJCQkJCQkJVVJMUmVjb3JkIHVybFJlY29yZCA9IG5ldyBVUkxSZWNvcmQoKTsKLQkJCQkJCQkJCQl1cmxSZWNvcmQudXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQl1cmxSZWNvcmQuaXNFeHBvcnRlZCA9IGV4cG9ydGVkOwotCQkJCQkJCQkJCXVybFJlY29yZC5iYXNlTG9jYXRpb24gPSBsaWJyYXJ5UmVjb3JkLmxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQkJbGlicmFyeVJlY29yZC51cmxSZWNvcmRzLmFkZCh1cmxSZWNvcmQpOwotCi0JCQkJCQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gY2FjaGVkQ29udGVudHMgPSBudWxsOwotCQkJCQkJCQkJCUlucHV0U3RyZWFtIHRsZFN0cmVhbSA9IG51bGw7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gdXJsUmVjb3JkLnVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCQkJCQkJCQljb25uZWN0aW9uLnNldERlZmF1bHRVc2VDYWNoZXMoZmFsc2UpOwotCQkJCQkJCQkJCQl0bGRTdHJlYW0gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCQlpbnQgYzsKLQkJCQkJCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQkJCQkJCS8vIGFycmF5IGRpbSByZXN0cmljdGlvbj8KLQkJCQkJCQkJCQlieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQl3aGlsZSAoKGMgPSB0bGRTdHJlYW0ucmVhZChieXRlcykpID49IDApIHsKLQkJCQkJCQkJCQkJCWJ5dGVBcnJheU91dHB1dC53cml0ZShieXRlcywgMCwgYyk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJY2FjaGVkQ29udGVudHMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZUFycmF5T3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCQl0bGRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8odXJsUmVjb3JkLnVybC50b1N0cmluZygpLCBjYWNoZWRDb250ZW50cyk7Ci0JCQkJCQkJCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkJCQkJCQl1cmxSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCWNhY2hlZENvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWlmICh1cmxSZWNvcmQuZ2V0VVJJKCkgIT0gbnVsbCAmJiB1cmxSZWNvcmQuZ2V0VVJJKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCQkJCWZDbGFzc3BhdGhSZWZlcmVuY2VzLnB1dCh1cmxSZWNvcmQuZ2V0VVJJKCksIHVybFJlY29yZCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoQlVJTERQQVRIX1BST0pFQ1QuZXF1YWxzSWdub3JlQ2FzZSh0b2tlblR5cGUpKSB7Ci0JCQkJCQkJCQkJU3RyaW5nIHByb2plY3ROYW1lID0gdG9rZXIubmV4dFRva2VuKCk7Ci0JCQkJCQkJCQkJaWYgKFBhdGguUk9PVC5pc1ZhbGlkU2VnbWVudChwcm9qZWN0TmFtZSkpIHsKLQkJCQkJCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQkJCQkJCQkJCS8qIGRvIG5vdCBjaGVjayBpZiAib3BlbiIgaGVyZSAqLwotCQkJCQkJCQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlmQ2xhc3NwYXRoUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJLy8gbGFzdCBzaW5jZSB0aGV5IG9jY3VyIG9uY2UKLQkJCQkJCQkJCWVsc2UgaWYgKEJVSUxEUEFUSF9ESVJUWS5lcXVhbHNJZ25vcmVDYXNlKHRva2VuVHlwZSkpIHsKLQkJCQkJCQkJCQlmQnVpbGRQYXRoSXNEaXJ0eSA9IEJvb2xlYW4udmFsdWVPZih0b2tlci5uZXh0VG9rZW4oKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChCVUlMRFBBVEhfRU5UUklFUy5lcXVhbHNJZ25vcmVDYXNlKHRva2VuVHlwZSkpIHsKLQkJCQkJCQkJCQlmQnVpbGRQYXRoRW50cnlDb3VudCA9IEludGVnZXIudmFsdWVPZih0b2tlci5uZXh0VG9rZW4oKSkuaW50VmFsdWUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAobGlicmFyeVJlY29yZCAhPSBudWxsICYmIG5vdGlmeU9uUmVzdG9yYXRpb24pIHsKLQkJCQkJCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIGxpYnJhcnlSZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLkFEREVEKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJcmVzdG9yZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZyBMaWJyYXJ5IEluZGV4OiBkaWZmZXJlbnQgY2FjaGUgZm9ybWF0IGZvdW5kLCB3YXMgXCIiICsgbGluZVRleHQgKyAiXCIsIHN1cHBvcnRzIFwiIiArIFNBVkVfRk9STUFUX1ZFUlNJT04gKyAiXCIsIHJlaW5kZXhpbmcgYnVpbGQgcGF0aCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAidGltZSBzcGVudCByZWxvYWRpbmcgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgYnVpbGQgcGF0aDogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmVzdG9yZWQgPSBmYWxzZTsKLQkJCQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJmYWlsdXJlIHJlbG9hZGluZyAiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIiBidWlsZCBwYXRoIGluZGV4IiwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gPT09PT09PT09PT09PT09PSB0ZXN0IHJlbG9hZCB0aW1lIChlbmQpID09PT09PT09PT09PT09PT09PQotCi0KLQkJCWlmICghcmVzdG9yZWQpIHsKLQkJCQlzZXRCdWlsZFBhdGhJc0RpcnR5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhbnkgc3RvcmFibGUgcmVmZXJlbmNlcyB0byBkaXNrLiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlCi0JICogZGVzY3JpcHRpb24gaXMgYmVpbmcgY2xlYXJlZCBhbmQgbm90IGFmdGVyIGV2ZXJ5IHVwZGF0ZS4KLQkgKi8KLQl2b2lkIHNhdmVSZWZlcmVuY2VzKCkgewotCQkvLyB0aGUgYnVpbGQgcGF0aCBpbmZvcm1hdGlvbiBpcyBvdXQgb2YgZGF0ZSwgcmVtZW1iZXIgdGhhdAotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQotCQkvKioKLQkJICogPHByZT4KLQkJICogICAgICAgICAgICAgICAgICAgICAJCSAxLjAuMQotCQkgKiAgICAgICAgICAgICAgICAgICAgIAkJIFNhdmUgY2xhc3NwYXRoIGluZm9ybWF0aW9uICh8IGlzIGZpZWxkIGRlbGltaXRlcikKLQkJICogICAgICAgICAgICAgICAgICAgICAJCSBKYXJzIGFyZSBzYXZlZCBhcyAmcXVvdDtKQVI6JnF1b3Q7KyBoYXMxMVRMRCArIGphciBwYXRoIAotCQkgKiAgICAgICAgICAgICAgICAgICAgIAkJIFVSTFJlY29yZHMgYXMgJnF1b3Q7VVJMOiZxdW90OytVUkwKLQkJICogPC9wcmU+Ci0JCSAqLwotCQl0cnkgewotCQkJd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmU2F2ZVN0YXRlRmlsZW5hbWUpLCAiVVRGLTE2Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZShTQVZFX0ZPUk1BVF9WRVJTSU9OKTsKLQkJCXdyaXRlci53cml0ZSgnXG4nKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLndyaXRlKEJVSUxEUEFUSF9ESVJUWSArICJ8IiArIGZCdWlsZFBhdGhJc0RpcnR5KTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLndyaXRlKCdcbicpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUoQlVJTERQQVRIX0VOVFJJRVMgKyAifCIgKyBmQnVpbGRQYXRoRW50cnlDb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZSgnXG4nKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlJUHJvamVjdFtdIHByb2plY3RzID0gKElQcm9qZWN0W10pIGZDbGFzc3BhdGhQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd3JpdGVyLndyaXRlKEJVSUxEUEFUSF9QUk9KRUNUKTsKLQkJCQl3cml0ZXIud3JpdGUoInwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXdyaXRlci53cml0ZShwcm9qZWN0c1tpXS5nZXROYW1lKCkpOwotCQkJCXdyaXRlci53cml0ZSgnXG4nKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlFbnVtZXJhdGlvbiBqYXJzID0gZkNsYXNzcGF0aEphcnMua2V5cygpOwotCQkJd2hpbGUgKGphcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgamFyUGF0aCA9IGphcnMubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCUphclJlY29yZCBqYXJSZWNvcmQgPSAoSmFyUmVjb3JkKSBmQ2xhc3NwYXRoSmFycy5nZXQoamFyUGF0aCk7Ci0JCQkJd3JpdGVyLndyaXRlKCJKQVJ8Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZXIud3JpdGUoQm9vbGVhbi50b1N0cmluZyhqYXJSZWNvcmQuaGFzMTFUTEQpKTsKLQkJCQl3cml0ZXIud3JpdGUoJ3wnKTsgLy8kTk9OLU5MUy0xJAotCQkJCXdyaXRlci53cml0ZShCb29sZWFuLnRvU3RyaW5nKGphclJlY29yZC5pc0V4cG9ydGVkKSk7Ci0JCQkJd3JpdGVyLndyaXRlKCd8Jyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZXIud3JpdGUoamFyUGF0aCk7Ci0JCQkJd3JpdGVyLndyaXRlKCdcbicpOyAvLyROT04tTkxTLTEkCi0JCQkJSXRlcmF0b3IgaSA9IGphclJlY29yZC51cmxSZWNvcmRzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJCVVSTFJlY29yZCB1cmxSZWNvcmQgPSAoVVJMUmVjb3JkKSBpLm5leHQoKTsKLQkJCQkJd3JpdGVyLndyaXRlKCJVUkx8Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJd3JpdGVyLndyaXRlKFN0cmluZy52YWx1ZU9mKHVybFJlY29yZC5pc0V4cG9ydGVkKSk7Ci0JCQkJCXdyaXRlci53cml0ZSgifCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXdyaXRlci53cml0ZSh1cmxSZWNvcmQuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQkJCXdyaXRlci53cml0ZSgnXG4nKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAod3JpdGVyICE9IG51bGwpIHsKLQkJCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInRpbWUgc3BlbnQgc2F2aW5nIGluZGV4IGZvciAiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIjogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQl2b2lkIHNldEJ1aWxkUGF0aElzRGlydHkoKSB7Ci0JCWZCdWlsZFBhdGhJc0RpcnR5ID0gdHJ1ZTsKLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJtYXJraW5nIGJ1aWxkIHBhdGggaW5mb3JtYXRpb24gZm9yICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiIGFzIGRpcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQl2b2lkIHVwZGF0ZUNsYXNzcGF0aExpYnJhcnkoU3RyaW5nIGxpYnJhcnlMb2NhdGlvbiwgaW50IGRlbHRhS2luZCwgYm9vbGVhbiBpc0V4cG9ydGVkKSB7Ci0JCUphclJlY29yZCBsaWJyYXJ5UmVjb3JkID0gbnVsbDsKLQkJaWYgKGRlbHRhS2luZCA9PSBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEIHx8IGRlbHRhS2luZCA9PSBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEKSB7Ci0JCQlsaWJyYXJ5UmVjb3JkID0gKEphclJlY29yZCkgZkNsYXNzcGF0aEphcnMucmVtb3ZlKGxpYnJhcnlMb2NhdGlvbik7Ci0JCQlpZiAobGlicmFyeVJlY29yZCAhPSBudWxsKSB7Ci0JCQkJSVVSTFJlY29yZFtdIHVybFJlY29yZHMgPSAoSVVSTFJlY29yZFtdKSBsaWJyYXJ5UmVjb3JkLnVybFJlY29yZHMudG9BcnJheShuZXcgSVVSTFJlY29yZFswXSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxSZWNvcmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGZDbGFzc3BhdGhSZWZlcmVuY2VzLnJlbW92ZSh1cmxSZWNvcmRzW2ldLmdldFVSSSgpKTsKLQkJCQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQkJCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVsdGFLaW5kID09IElUYWdsaWJJbmRleERlbHRhLkFEREVEIHx8IGRlbHRhS2luZCA9PSBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEKSB7Ci0JCQlsaWJyYXJ5UmVjb3JkID0gY3JlYXRlSkFSUmVjb3JkKGxpYnJhcnlMb2NhdGlvbik7Ci0JCQlsaWJyYXJ5UmVjb3JkLmlzRXhwb3J0ZWQgPSBpc0V4cG9ydGVkOwotCQkJZkNsYXNzcGF0aEphcnMucHV0KGxpYnJhcnlMb2NhdGlvbiwgbGlicmFyeVJlY29yZCk7Ci0KLQkJCVppcEZpbGUgamFyZmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWphcmZpbGUgPSBuZXcgWmlwRmlsZShsaWJyYXJ5TG9jYXRpb24pOwotCQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJmaWxlLmVudHJpZXMoKTsKLQkJCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlaaXBFbnRyeSB6ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJCWlmICghei5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQlpZiAoei5nZXROYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lbmRzV2l0aCgiLnRsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoei5nZXROYW1lKCkuZXF1YWxzKEphclV0aWxpdGllcy5KU1AxMV9UQUdMSUIpKSB7Ci0JCQkJCQkJCWxpYnJhcnlSZWNvcmQuaGFzMTFUTEQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IGdldENhY2hlZElucHV0U3RyZWFtKGphcmZpbGUsIHopOwotCQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCVRhZ2xpYkluZm8gaW5mbyA9IGV4dHJhY3RJbmZvKGxpYnJhcnlMb2NhdGlvbiwgY29udGVudHMpOwotCi0JCQkJCQkJCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby51cmkgIT0gbnVsbCAmJiBpbmZvLnVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCVVSTFJlY29yZCB1cmxSZWNvcmQgPSBuZXcgVVJMUmVjb3JkKCk7Ci0JCQkJCQkJCQl1cmxSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJCQl1cmxSZWNvcmQuYmFzZUxvY2F0aW9uID0gbGlicmFyeUxvY2F0aW9uOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQl1cmxSZWNvcmQuaXNFeHBvcnRlZCA9IGlzRXhwb3J0ZWQ7Ci0JCQkJCQkJCQkJdXJsUmVjb3JkLnVybCA9IG5ldyBVUkwoImphcjpmaWxlOiIgKyBsaWJyYXJ5TG9jYXRpb24gKyAiIS8iICsgei5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLnVybFJlY29yZHMuYWRkKHVybFJlY29yZCk7Ci0JCQkJCQkJCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgdXJsUmVjb3JkLCBkZWx0YUtpbmQpKTsKLQkJCQkJCQkJCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcy5wdXQoaW5mby51cmksIHVybFJlY29yZCk7Ci0JCQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIHJlY29yZCBmb3IgIiArIHVybFJlY29yZC5nZXRVUkkoKSArICJAIiArIHVybFJlY29yZC5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gZG9uJ3QgcmVjb3JkIHRoaXMgVVJJCi0JCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFppcEV4Y2VwdGlvbiB6RXhjKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlRhZ2xpYiBJbmRleCBaaXBFeGNlcHRpb246ICIgKyBsaWJyYXJ5TG9jYXRpb24gKyAiICIgKyB6RXhjLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlRhZ2xpYiBJbmRleCBJT0V4Y2VwdGlvbjogIiArIGxpYnJhcnlMb2NhdGlvbiArICIgIiArIGlvRXhjLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJY2xvc2VKYXJGaWxlKGphcmZpbGUpOwotCQkJfQotCQl9Ci0JCWlmIChsaWJyYXJ5UmVjb3JkICE9IG51bGwpIHsKLQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIGxpYnJhcnlSZWNvcmQsIGRlbHRhS2luZCkpOwotCQl9Ci0JfQotCi0Jdm9pZCB1cGRhdGVKQVIoSVJlc291cmNlIGphciwgaW50IGRlbHRhS2luZCkgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGluZyByZWNvcmRzIGZvciBKQVIgIiArIGphci5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBqYXJMb2NhdGlvblN0cmluZyA9IG51bGw7Ci0JCWlmIChqYXIuZ2V0TG9jYXRpb24oKSAhPSBudWxsKQotCQkJamFyTG9jYXRpb25TdHJpbmcgPSBqYXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQllbHNlCi0JCQlqYXJMb2NhdGlvblN0cmluZyA9IGphci5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCVN0cmluZ1tdIGVudHJpZXMgPSBKYXJVdGlsaXRpZXMuZ2V0RW50cnlOYW1lcyhqYXIpOwotCQlKYXJSZWNvcmQgamFyUmVjb3JkID0gY3JlYXRlSkFSUmVjb3JkKGphcik7Ci0JCWZKQVJSZWZlcmVuY2VzLnB1dChqYXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBqYXJSZWNvcmQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbnRyaWVzW2ldLmVuZHNXaXRoKCIudGxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChlbnRyaWVzW2ldLmVxdWFscyhKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKSkgewotCQkJCQlqYXJSZWNvcmQuaGFzMTFUTEQgPSB0cnVlOwotCQkJCX0KLQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShqYXIsIGVudHJpZXNbaV0pOwotCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCVRhZ2xpYkluZm8gaW5mbyA9IGV4dHJhY3RJbmZvKGphckxvY2F0aW9uU3RyaW5nLCBjb250ZW50cyk7Ci0KLQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJVVJMUmVjb3JkIHJlY29yZCA9IG5ldyBVUkxSZWNvcmQoKTsKLQkJCQkJCXJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQkJCXJlY29yZC5iYXNlTG9jYXRpb24gPSBqYXJMb2NhdGlvblN0cmluZzsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmVjb3JkLnVybCA9IG5ldyBVUkwoImphcjpmaWxlOiIgKyBqYXJMb2NhdGlvblN0cmluZyArICIhLyIgKyBlbnRyaWVzW2ldKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJamFyUmVjb3JkLnVybFJlY29yZHMuYWRkKHJlY29yZCk7Ci0KLQkJCQkJCQlpbnQgdGFnbGliRGVsdGFLaW5kID0gSVRhZ2xpYkluZGV4RGVsdGEuQURERUQ7Ci0JCQkJCQkJSGFzaHRhYmxlIHRhYmxlID0gZ2V0SW1wbGljaXRSZWZlcmVuY2VzKGphci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJCWlmICh0YWJsZSAhPSBudWxsICYmIHRhYmxlLmdldChyZWNvcmQuZ2V0VVJJKCkpICE9IG51bGwpIHsKLQkJCQkJCQkJdGFnbGliRGVsdGFLaW5kID0gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRDsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXMoamFyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkucHV0KGluZm8udXJpLCByZWNvcmQpOwotCQkJCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZCwgdGFnbGliRGVsdGFLaW5kKSk7Ci0JCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIHJlY29yZCBmb3IgIiArIHJlY29yZC5nZXRVUkkoKSArICJAIiArIHJlY29yZC5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gZG9uJ3QgcmVjb3JkIHRoaXMgVVJJCi0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiY291bGQgbm90IHJlYWQgcmVzb3VyY2UgIiArIGphci5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoamFyUmVjb3JkLmhhczExVExEKSB7Ci0JCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCBqYXJSZWNvcmQsIGRlbHRhS2luZCkpOwotCQl9Ci0JfQotCi0KLQl2b2lkIHVwZGF0ZVRhZyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kKSB7Ci0JCVRhZ0RpclJlY29yZCByZWNvcmQgPSAoVGFnRGlyUmVjb3JkKSBmVGFnRGlyUmVmZXJlbmNlcy5nZXQocmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSBjcmVhdGVUYWdkaXJSZWNvcmQoKElGb2xkZXIpIHJlc291cmNlLmdldFBhcmVudCgpKTsKLQkJCWZUYWdEaXJSZWZlcmVuY2VzLnB1dChyZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlY29yZCk7Ci0JCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLkFEREVEKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoIXJlY29yZC50YWdzLmNvbnRhaW5zKHJlc291cmNlLmdldE5hbWUoKSkpIHsKLQkJCQlyZWNvcmQudGFncy5hZGQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZCwgSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCkpOwotCQl9Ci0JfQotCi0Jdm9pZCB1cGRhdGVUYWdEaXIoSVJlc291cmNlIHRhZ2RpclJlc291cmNlLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCS8qKgotCQkgKiA4LjQuMTogdGFnIGZpbGVzIGFyZSBsb29zZSBmaWxlcyB1bmRlciAvV0VCLUlORi90YWdzCi0JCSAqLwotCQlpZiAoKHRhZ2RpclJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApIHsKLQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGluZyByZWNvcmQgZm9yIGRpcmVjdG9yeSAiICsgdGFnZGlyUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVRhZ0RpclJlY29yZCByZWNvcmQgPSAoVGFnRGlyUmVjb3JkKSBmVGFnRGlyUmVmZXJlbmNlcy5nZXQodGFnZGlyUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJCXJlY29yZCA9IGNyZWF0ZVRhZ2RpclJlY29yZCgoSUZvbGRlcikgdGFnZGlyUmVzb3VyY2UpOwotCQkJCWZUYWdEaXJSZWZlcmVuY2VzLnB1dCh0YWdkaXJSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlY29yZCk7Ci0JCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBkZWx0YUtpbmQpKTsKLQkJCX0KLQkJCWVsc2UgewotCi0JCQl9Ci0JCX0KLQkJLyoqCi0JCSAqIDguNC4xOiB0YWcgZmlsZXMgY2FuIGFsc28gYmUgcGFja2FnZWQgaW4gdGhlIC9NRVRBLUlORi90YWdzIGZvbGRlcgotCQkgKiBvZiBhIGphciBpbiAvV0VCLUlORi9saWIvICg4LjQuMjogYnV0IG11c3QgYmUgbWVudGlvbmVkIGluIGEgLnRsZCkKLQkJICovCi0JCWVsc2UgewotCQkJLy8gdGhlc2UgdGFncyBhcmUgbWVyZWx5IHN1cmZhY2VkIHdoZW4gdGhlIFRMRCBpcyBtb2RlbGxlZAotCQl9Ci0JfQotCi0Jdm9pZCB1cGRhdGVUTEQoSVJlc291cmNlIHRsZCwgaW50IGRlbHRhS2luZCkgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGluZyByZWNvcmQgZm9yICIgKyB0bGQuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVExEUmVjb3JkIHJlY29yZCA9IGNyZWF0ZVRMRFJlY29yZCh0bGQpOwotCQlmVExEUmVmZXJlbmNlcy5wdXQodGxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgcmVjb3JkKTsKLQkJaWYgKHJlY29yZC5nZXRVUkkoKSAhPSBudWxsICYmIHJlY29yZC5nZXRVUkkoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyh0bGQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5wdXQocmVjb3JkLmdldFVSSSgpLCByZWNvcmQpOwotCQl9Ci0JCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZCwgZGVsdGFLaW5kKSk7Ci0JfQotCi0Jdm9pZCB1cGRhdGVXZWJYTUwoSVJlc291cmNlIHdlYnhtbCwgaW50IGRlbHRhS2luZCkgewotCQlpZiAod2VieG1sLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybjsKLQkJSW5wdXRTdHJlYW0gd2VieG1sQ29udGVudHMgPSBudWxsOwotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3ZWJ4bWxDb250ZW50cyA9ICgoSUZpbGUpIHdlYnhtbCkuZ2V0Q29udGVudHModHJ1ZSk7Ci0JCQlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCXByb3ZpZGVyLnNldElucHV0U3RyZWFtKHdlYnhtbENvbnRlbnRzKTsKLQkJCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQkJcHJvdmlkZXIuc2V0Um9vdEVsZW1lbnROYW1lKCJ3ZWItYXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2Uod2VieG1sLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQlkb2N1bWVudCA9IHByb3ZpZGVyLmdldERvY3VtZW50KGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAod2VieG1sQ29udGVudHMgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQl3ZWJ4bWxDb250ZW50cy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQl9Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGluZyByZWNvcmRzIGZvciAiICsgd2VieG1sLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJV2ViWE1MUmVjb3JkIHdlYnhtbFJlY29yZCA9IG5ldyBXZWJYTUxSZWNvcmQoKTsKLQkJd2VieG1sUmVjb3JkLnBhdGggPSB3ZWJ4bWwuZ2V0RnVsbFBhdGgoKTsKLQkJZldlYlhNTFJlZmVyZW5jZXMucHV0KHdlYnhtbFJlY29yZC5nZXRXZWJYTUwoKS50b1N0cmluZygpLCB3ZWJ4bWxSZWNvcmQpOwotCQlOb2RlTGlzdCB0YWdsaWJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQlmb3IgKGludCBpVGFnbGliID0gMDsgaVRhZ2xpYiA8IHRhZ2xpYnMuZ2V0TGVuZ3RoKCk7IGlUYWdsaWIrKykgewotCQkJU3RyaW5nIHRhZ2xpYlVyaSA9IHJlYWRUZXh0b2ZDaGlsZCh0YWdsaWJzLml0ZW0oaVRhZ2xpYiksICJ0YWdsaWItdXJpIikudHJpbSgpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBzcGVjaWZpZWQgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gcm9vdCBvZiB0aGUgd2ViYXBwCi0JCQlTdHJpbmcgdGFnbGliTG9jYXRpb24gPSByZWFkVGV4dG9mQ2hpbGQodGFnbGlicy5pdGVtKGlUYWdsaWIpLCAidGFnbGliLWxvY2F0aW9uIikudHJpbSgpOyAvLyROT04tTkxTLTEkCi0JCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJCWlmICh0YWdsaWJMb2NhdGlvbi5zdGFydHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXBhdGggPSBuZXcgUGF0aChnZXRMb2NhbFJvb3Qod2VieG1sLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkgKyB0YWdsaWJMb2NhdGlvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXRoID0gbmV3IFBhdGgoVVJJSGVscGVyLm5vcm1hbGl6ZSh0YWdsaWJMb2NhdGlvbiwgd2VieG1sLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZ2V0TG9jYWxSb290KHdlYnhtbC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKSk7Ci0JCQl9Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQlJRmlsZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQlpZiAocmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBudWxsOwotCQkJCQkvKgotCQkJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI1OTYwCi0JCQkJCSAqIAotCQkJCQkgKiBBbHNvIHN1cHBvcnQgbWFwcGluZ3MgdG8gLmphciBmaWxlcwotCQkJCQkgKi8KLQkJCQkJaWYgKCJqYXIiLmVxdWFsc0lnbm9yZUNhc2UocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlKYXJSZWNvcmQgamFyUmVjb3JkID0gY3JlYXRlSkFSUmVjb3JkKHJlc291cmNlKTsKLQkJCQkJCVN0cmluZ1tdIGVudHJpZXMgPSBKYXJVdGlsaXRpZXMuZ2V0RW50cnlOYW1lcyhyZXNvdXJjZSk7Ci0JCQkJCQlmb3IgKGludCBqRW50cnkgPSAwOyBqRW50cnkgPCBlbnRyaWVzLmxlbmd0aDsgakVudHJ5KyspIHsKLQkJCQkJCQlpZiAoZW50cmllc1tqRW50cnldLmVuZHNXaXRoKCIudGxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAoZW50cmllc1tqRW50cnldLmVxdWFscyhKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKSkgewotCQkJCQkJCQkJamFyUmVjb3JkLmhhczExVExEID0gdHJ1ZTsKLQkJCQkJCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKHJlc291cmNlLCBlbnRyaWVzW2pFbnRyeV0pOwotCQkJCQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGNvbnRlbnRzKTsKLQkJCQkJCQkJCQlqYXJSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZWNvcmQgPSBqYXJSZWNvcmQ7Ci0JCQkJCQkvLyB0aGUgc3RvcmVkIFVSSSBzaG91bGQgcmVmbGVjdCB0aGUgd2ViLnhtbCdzIHZhbHVlCi0JCQkJCQlpZiAoamFyUmVjb3JkLmluZm8gPT0gbnVsbCkgewotCQkJCQkJCWphclJlY29yZC5pbmZvID0gbmV3IFRhZ2xpYkluZm8oKTsKLQkJCQkJCX0KLQkJCQkJCWphclJlY29yZC5pbmZvLnVyaSA9IHRhZ2xpYlVyaTsKLQkJCQkJCWphclJlY29yZC5pc01hcHBlZEluV2ViWE1MID0gdHJ1ZTsKLQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIHdlYi54bWwgcmVjb3JkIGZvciAiICsgdGFnbGliVXJpICsgIkAiICsgamFyUmVjb3JkLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVRMRFJlY29yZCB0bGRSZWNvcmQgPSBjcmVhdGVUTERSZWNvcmQocmVzb3VyY2UpOwotCQkJCQkJcmVjb3JkID0gdGxkUmVjb3JkOwotCQkJCQkJLy8gdGhlIHN0b3JlZCBVUkkgc2hvdWxkIHJlZmxlY3QgdGhlIHdlYi54bWwncyB2YWx1ZQotCQkJCQkJdGxkUmVjb3JkLmluZm8udXJpID0gdGFnbGliVXJpOwotCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0ZWQgd2ViLnhtbCByZWNvcmQgZm9yICIgKyB0YWdsaWJVcmkgKyAiQCIgKyB0bGRSZWNvcmQuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQkJCQl3ZWJ4bWxSZWNvcmQudGxkUmVjb3Jkcy5hZGQocmVjb3JkKTsKLQkJCQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5wdXQodGFnbGliVXJpLCByZWNvcmQpOwotCQkJCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBkZWx0YUtpbmQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1RhZ2xpYkluZGV4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9UYWdsaWJJbmRleC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODM2MzQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1RhZ2xpYkluZGV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQSBub24tZXh0ZW5kYWJsZSBpbmRleCBtYW5hZ2VyIGZvciB0YWdsaWJzIHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIEoyRUUKLSAqIElUYWdsaWJSZWdpc3RyeSBidXQgbGFja2luZyBhbnkgdGllcyB0byBwcm9qZWN0IG5hdHVyZXMuIEVhY2ggcmVjb3JkCi0gKiByZXR1cm5lZCBmcm9tIHRoZSBpbmRleCByZXByZXNlbnRzIGEgc2luZ2xlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IuCi0gKiAKLSAqIEluZGV4aW5nIGlzIG9ubHkgcGVyc2lzdGVkIGJldHdlZW4gc2Vzc2lvbnMgZm9yIGVudHJpZXMgb24gdGhlIEphdmEgQnVpbGQKLSAqIFBhdGguIE5ldyBBREQgZXZlbnRzIHdpbGwgYmUgc2VudCB0byBJVGFnbGliSW5kZXhMaXN0ZW5lcnMgZHVyaW5nIGVhY2gKLSAqIHdvcmtiZW5jaCBzZXNzaW9uIGZvciBib3RoIGNhY2hlZCBhbmQgbmV3bHkgZm91bmQgcmVjb3Jkcy4gUkVNT1ZFIGV2ZW50cwotICogYXJlIG5vdCBmaXJlZCBvbiB3b3JrYmVuY2ggc2h1dGRvd24uIFRoZSByZWNvcmQncyBjb250ZW50cyBzaG91bGQgYmUKLSAqIGV4YW1pbmVkIGZvciBhbnkgZnVydGhlciBpbmZvcm1hdGlvbi4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGFnbGliSW5kZXggewotCWNsYXNzIENsYXNzcGF0aENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotCQlMaXN0IHByb2plY3RzSW5kZXhlZCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkJaWYgKCFpc0luZGV4QXZhaWxhYmxlKCkpCi0JCQkJcmV0dXJuOwotCQkJdHJ5IHsKLQkJCQlMT0NLLmFjcXVpcmUoKTsKLQkJCQlpZiAoX2RlYnVnRXZlbnRzKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCByZXNwb25kaW5nIHRvOiIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcHJvamVjdHNJbmRleGVkLmNsZWFyKCk7Ci0JCQkJZWxlbWVudENoYW5nZWQoZXZlbnQuZ2V0RGVsdGEoKSwgdHJ1ZSk7Ci0JCQkJZmlyZUN1cnJlbnREZWx0YShldmVudCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlMT0NLLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBlbGVtZW50Q2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgYm9vbGVhbiBmb3JjZVVwZGF0ZSkgewotCQkJaWYgKGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpCi0JCQkJcmV0dXJuOwotCi0JCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfTU9ERUwpIHsKLQkJCQlJSmF2YUVsZW1lbnREZWx0YVtdIGNoYW5nZWQgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWVsZW1lbnRDaGFuZ2VkKGNoYW5nZWRbaV0sIGZvcmNlVXBkYXRlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBIYW5kbGUgYW55IGNoYW5nZXMgYXQgdGhlIHByb2plY3QgbGV2ZWwKLQkJCWVsc2UgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7Ci0JCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCkgewotCQkJCQlJSmF2YUVsZW1lbnQgcHJvaiA9IGVsZW1lbnQ7Ci0JCQkJCWhhbmRsZUNsYXNzcGF0aENoYW5nZSgoSUphdmFQcm9qZWN0KSBwcm9qLCBmb3JjZVVwZGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJSmF2YUVsZW1lbnREZWx0YVtdIGRlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQkJaWYgKGRlbHRhcy5sZW5ndGggPT0gMCkgewotCQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEIHx8IChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTE9TRUQpICE9IDApIHsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIElmIHRoZSBwcm9qZWN0IGlzIGJlaW5nIGRlbGV0ZWQgb3IgY2xvc2VkLCBqdXN0Ci0JCQkJCQkJICogcmVtb3ZlIHRoZSBkZXNjcmlwdGlvbgotCQkJCQkJCSAqLwotCQkJCQkJCUlKYXZhUHJvamVjdCBwcm9qID0gKElKYXZhUHJvamVjdCkgZWxlbWVudDsKLQkJCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoUHJvamVjdERlc2NyaXB0aW9uKSBmUHJvamVjdERlc2NyaXB0aW9ucy5yZW1vdmUocHJvai5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKSB7Ci0JCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZpbmcgaW5kZXggb2YgIiArIGRlc2NyaXB0aW9uLmZQcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQkvLyByZW1vdmluZyB0aGUgaW5kZXggZmlsZSBlbnN1cmVzIHRoYXQgd2UKLQkJCQkJCQkJLy8gZG9uJ3QgZ2V0IHN0YWxlIGRhdGEgaWYgdGhlIHByb2plY3QgaXMKLQkJCQkJCQkJLy8gcmVvcGVuZWQKLQkJCQkJCQkJcmVtb3ZlSW5kZXgocHJvai5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvKgotCQkJCQkgKiAoZWxzZSkgV2l0aG91dCB0aGUgY2xhc3NwYXRoIGNoYW5naW5nLCB0aGVyZSdzIG5vdGhpbmcKLQkJCQkJICogZWxzZSB0byBkbwotCQkJCQkgKi8KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWVsZW1lbnRDaGFuZ2VkKGRlbHRhc1tpXSwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLyoKLQkJCSAqIE90aGVyIG1vZGlmaWNhdGlvbiB0byB0aGUgY2xhc3NwYXRoIChzdWNoIGFzIHdpdGhpbiBhIGNsYXNzcGF0aAotCQkJICogY29udGFpbmVyIGxpa2UgIldlYiBBcHAgTGlicmFyaWVzIikgZ28gdG8gdGhlIGRlc2NyaXB0aW9uCi0JCQkgKiBpdHNlbGYKLQkJCSAqLwotCQkJZWxzZSBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSCkgIT0gMCB8fCAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgIT0gMCkgewotCQkJCUlKYXZhUHJvamVjdCBhZmZlY3RlZFByb2plY3QgPSBlbGVtZW50LmdldEphdmFQcm9qZWN0KCk7Ci0JCQkJaWYgKGFmZmVjdGVkUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIElmIHRoZSBhZmZlY3RlZCBwcm9qZWN0IGhhcyBhbiBpbmRleCBvbi1kaXNrLCBpdCdzCi0JCQkJCSAqIGdvaW5nIHRvIGJlIGludmFsaWQtLXdlIG5lZWQgdG8gY3JlYXRlL2xvYWQgdGhlCi0JCQkJCSAqIGRlc2NyaXB0aW9uIHNvIGl0IHdpbGwgYmUgdXAgdG8gZGF0ZSBbbG9hZGluZyBub3cgYW5kCi0JCQkJCSAqIHVwZGF0aW5nIGlzIHVzdWFsbHkgZmFzdGVyIHRoYW4gcmVnZW5lcmF0aW5nIHRoZSBlbnRpcmUKLQkJCQkJICogaW5kZXhdLiBJZiB0aGVyZSBpcyBubyBpbmRleCBvbiBkaXNrLCBkbyBub3RoaW5nIG1vcmUuCi0JCQkJCSAqLwotCQkJCQlGaWxlIGluZGV4RmlsZSA9IG5ldyBGaWxlKGNvbXB1dGVJbmRleExvY2F0aW9uKGFmZmVjdGVkUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCQlpZiAoaW5kZXhGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gYWZmZWN0ZWREZXNjcmlwdGlvbiA9IGNyZWF0ZURlc2NyaXB0aW9uKGFmZmVjdGVkUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJaWYgKGFmZmVjdGVkRGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJCWFmZmVjdGVkRGVzY3JpcHRpb24uaGFuZGxlRWxlbWVudENoYW5nZWQoZGVsdGEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXByb2plY3RzSW5kZXhlZC5hZGQoYWZmZWN0ZWRQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUNsYXNzcGF0aENoYW5nZShJSmF2YVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBmb3JjZVVwZGF0ZSkgewotCQkJaWYgKGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpCi0JCQkJcmV0dXJuOwotCi0JCQl0cnkgewotCQkJCS8qIEhhbmRsZSBsYXJnZSBjaGFuZ2VzIHRvIHRoaXMgcHJvamVjdCdzIGJ1aWxkIHBhdGggKi8KLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgJiYgIXByb2plY3RzSW5kZXhlZC5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJLyoKLQkJCQkJICogVXNlIGdldCBpbnN0ZWFkIG9mIGNyZWF0ZSBzaW5jZSB0aGUgZG93bnN0cmVhbQotCQkJCQkgKiAodXBzdHJlYW0/KSBwcm9qZWN0IHdhc24ndCBpdHNlbGYgbW9kaWZpZWQuCi0JCQkJCSAqLwotCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQkJCQlpZiAoZm9yY2VVcGRhdGUpIHsKLQkJCQkJCWRlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb24oKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKChJUHJvamVjdCkgcmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmICFmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJCQlwcm9qZWN0c0luZGV4ZWQuYWRkKHJlc291cmNlKTsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkUGF0aElzRGlydHkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmICghaXNJbmRleEF2YWlsYWJsZSgpKQotCQkJCXJldHVybjsKLQkJCXRyeSB7Ci0JCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQkJaWYgKF9kZWJ1Z0V2ZW50cykgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggcmVzcG9uZGluZyB0bzoiICsgZXZlbnQgKyAiXG4iICsgZXZlbnQuZ2V0RGVsdGEoKSk7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgewotCQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSA6Ci0JCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSA6IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gcGFpciBkZWx0YXMgd2l0aCBwcm9qZWN0cwotCQkJCQkJCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gbmV3IElSZXNvdXJjZURlbHRhW117ZXZlbnQuZ2V0RGVsdGEoKX07Ci0JCQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG51bGw7Ci0KLQkJCQkJCQlpZiAoZGVsdGFzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQkJCQkJaWYgKGRlbHRhc1swXSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlyZXNvdXJjZSA9IGRlbHRhc1swXS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJcmVzb3VyY2UgPSBldmVudC5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJCQkJCQlkZWx0YXMgPSBkZWx0YXNbMF0uZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0W2RlbHRhcy5sZW5ndGhdOwotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJCWlmIChkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJCXByb2plY3RzW2ldID0gKElQcm9qZWN0KSBkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0WzFdOwotCQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJcHJvamVjdHNbMF0gPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQlwcm9qZWN0c1swXSA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKSB7Ci0JCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IG5vdGljZWQgIiArIHByb2plY3RzW2ldLmdldE5hbWUoKSArICIgaXMgYWJvdXQgdG8gYmUgZGVsZXRlZC9jbG9zZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoUHJvamVjdERlc2NyaXB0aW9uKSBmUHJvamVjdERlc2NyaXB0aW9ucy5yZW1vdmUocHJvamVjdHNbaV0pOwotCQkJCQkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZpbmcgaW5kZXggb2YgIiArIGRlc2NyaXB0aW9uLmZQcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJZGVzY3JpcHRpb24uY2xlYXIoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlc291cmNlIGRlbGV0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFIDogewotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBwYWlyIGRlbHRhcyB3aXRoIHByb2plY3RzCi0JCQkJCQkJSVJlc291cmNlRGVsdGFbXSBkZWx0YXMgPSBuZXcgSVJlc291cmNlRGVsdGFbXXtldmVudC5nZXREZWx0YSgpfTsKLQkJCQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gbnVsbDsKLQotCQkJCQkJCWlmIChkZWx0YXMubGVuZ3RoID4gMCkgewotCQkJCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQkJCQkJCQlpZiAoZGVsdGFzWzBdICE9IG51bGwpIHsKLQkJCQkJCQkJCXJlc291cmNlID0gZGVsdGFzWzBdLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlyZXNvdXJjZSA9IGV2ZW50LmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUk9PVCkgewotCQkJCQkJCQkJCWRlbHRhcyA9IGRlbHRhc1swXS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJCQkJCQkJcHJvamVjdHMgPSBuZXcgSVByb2plY3RbZGVsdGFzLmxlbmd0aF07Ci0JCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQkJaWYgKGRlbHRhc1tpXS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCQkJCQkJCQkJcHJvamVjdHNbaV0gPSAoSVByb2plY3QpIGRlbHRhc1tpXS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJcHJvamVjdHMgPSBuZXcgSVByb2plY3RbMV07Ci0JCQkJCQkJCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUFJPSkVDVCkgewotCQkJCQkJCQkJCQlwcm9qZWN0c1swXSA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJCXByb2plY3RzWzBdID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJaWYgKGRlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAoZGVsdGFzW2ldLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuRU5DT0RJTkcgfHwgZGVsdGFzW2ldLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykpCi0JCQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWlmIChkZWx0YXNbaV0gIT0gbnVsbCAmJiBkZWx0YXNbaV0uZ2V0S2luZCgpICE9IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgJiYgcHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24ocHJvamVjdHNbaV0pOwotCQkJCQkJCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiAhZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCQkJCQkJCQkJZGVsdGFzW2ldLmFjY2VwdChkZXNjcmlwdGlvbi5nZXRWaXNpdG9yKCkpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWlmICghcHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkgfHwgKGRlbHRhc1tpXSAhPSBudWxsICYmIGRlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkpIHsKLQkJCQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pIHsKLQkJCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCBub3RpY2VkICIgKyBwcm9qZWN0c1tpXS5nZXROYW1lKCkgKyAiIHdhcyByZW1vdmVkIG9yIGlzIG5vIGxvbmdlciBhY2Nlc3NpYmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChQcm9qZWN0RGVzY3JpcHRpb24pIGZQcm9qZWN0RGVzY3JpcHRpb25zLnJlbW92ZShwcm9qZWN0c1tpXSk7Ci0JCQkJCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJyZW1vdmluZyBpbmRleCBvZiAiICsgZGVzY3JpcHRpb24uZlByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJZGVzY3JpcHRpb24uY2xlYXIoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgcmVzb3VyY2UgY2hhbmdlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWZpcmVDdXJyZW50RGVsdGEoZXZlbnQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdDaGFuZ2VMaXN0ZW5lciA9IGZhbHNlOwotCi0Jc3RhdGljIGJvb2xlYW4gX2RlYnVnRXZlbnRzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvZXZlbnRzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXN0YXRpYyBib29sZWFuIF9kZWJ1Z0luZGV4Q3JlYXRpb24gPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleGNyZWF0aW9uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z1Jlc29sdXRpb24gPSAidHJ1ZSIuZXF1YWxzKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL3Jlc29sdmUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0Jc3RhdGljIFRhZ2xpYkluZGV4IF9pbnN0YW5jZSA9IG5ldyBUYWdsaWJJbmRleCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ1JDMzIgY2hlY2tzdW1DYWxjdWxhdG9yID0gbmV3IENSQzMyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU4gPSAiQ0xFQU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVJUWSA9ICJESVJUWSI7Ci0Jc3RhdGljIGJvb2xlYW4gRU5BQkxFRCA9IGZhbHNlOwotCi0Jc3RhdGljIElMb2NrIExPQ0sgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQotCS8qKgotCSAqIE5PVCBBUEkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGFnbGliSW5kZXhMaXN0ZW5lcihJVGFnbGliSW5kZXhMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZ2V0SW5zdGFuY2UoKS5pc0luaXRpYWxpemVkKCkpCi0JCQlnZXRJbnN0YW5jZSgpLmludGVybmFsQWRkVGFnbGliSW5kZXhMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0Jc3RhdGljIHZvaWQgZmlyZVRhZ2xpYkRlbHRhKElUYWdsaWJJbmRleERlbHRhIGRlbHRhKSB7Ci0JCWlmIChfZGVidWdFdmVudHMpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCBmaXJlZCBkZWx0YToiICsgZGVsdGEgKyAiIFsiICsgZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpLmxlbmd0aCArICJdXG4iICsgKChUYWdsaWJJbmRleERlbHRhKSBkZWx0YSkudHJpZ2dlcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvKgotCQkgKiBGbHVzaCBhbnkgc2hhcmVkIGNhY2hlIGVudHJpZXMsIHRoZSBUYWdsaWJDb250cm9sbGVycyBzaG91bGQgaGFuZGxlCi0JCSAqIHVwZGF0aW5nIHRoZWlyIGRvY3VtZW50cyBhcyBuZWVkZWQuCi0JCSAqLwotCQlJVGFnbGliSW5kZXhEZWx0YVtdIGRlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCUlUYWdsaWJSZWNvcmQgdGFnbGliUmVjb3JkID0gZGVsdGFzW2ldLmdldFRhZ2xpYlJlY29yZCgpOwotCQkJaWYgKHRhZ2xpYlJlY29yZCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IHVuaXF1ZUlkZW50aWZpZXIgPSBUTERDTURvY3VtZW50TWFuYWdlci5nZXRVbmlxdWVJZGVudGlmaWVyKHRhZ2xpYlJlY29yZCk7Ci0JCQkJaWYgKHVuaXF1ZUlkZW50aWZpZXIgIT0gbnVsbCkgewotCQkJCQlUTERDTURvY3VtZW50TWFuYWdlci5nZXRTaGFyZWREb2N1bWVudENhY2hlKCkucmVtb3ZlKHVuaXF1ZUlkZW50aWZpZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJpZGVudGlmaWVyIGZvciAiICsgdGFnbGliUmVjb3JkICsgIiB3YXMgbnVsbCIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzeW5jaHJvbml6ZWQgKFRMRENNRG9jdW1lbnRNYW5hZ2VyLmdldFNoYXJlZERvY3VtZW50Q2FjaGUoKSkgewotCQkJSXRlcmF0b3IgdmFsdWVzID0gVExEQ01Eb2N1bWVudE1hbmFnZXIuZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAodmFsdWVzLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvID0gdmFsdWVzLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkgewotCQkJCQl2YWx1ZXMucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKF9pbnN0YW5jZS5pc0luaXRpYWxpemVkKCkpIHsKLQkJCUlUYWdsaWJJbmRleExpc3RlbmVyW10gbGlzdGVuZXJzID0gX2luc3RhbmNlLmZUYWdsaWJJbmRleExpc3RlbmVyczsKLQkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGlzdGVuZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaXN0ZW5lcnNbal0uaW5kZXhDaGFuZ2VkKGRlbHRhKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogRmluZHMgYWxsIG9mIHRoZSB2aXNpYmxlIElUYWdsaWJSZWNvcmRzIGZvciB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGUKLQkgKiB3b3Jrc3BhY2UuIFRhZ2xpYiBtYXBwaW5ncyBmcm9tIHdlYi54bWwgZmlsZXMgYXJlIG9ubHkgdmlzaWJsZSB0byBwYXRocwotCSAqIHdpdGhpbiB0aGUgd2ViLnhtbCdzIGNvcnJlc3BvbmRpbmcgd2ViIGNvbnRlbnQgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBmdWxsUGF0aCAtCi0JICogICAgICAgICAgICBhIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFsbCBvZiB0aGUgdmlzaWJsZSBJVGFnbGliUmVjb3JkcyBmcm9tIHRoZSBnaXZlbiBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVRhZ2xpYlJlY29yZFtdIGdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoSVBhdGggZnVsbFBhdGgpIHsKLQkJaWYgKCFfaW5zdGFuY2UuaXNJbml0aWFsaXplZCgpKSB7Ci0JCQlyZXR1cm4gbmV3IElUYWdsaWJSZWNvcmRbMF07Ci0JCX0KLQkJSVRhZ2xpYlJlY29yZFtdIHJlY29yZHMgPSBudWxsOwotCQlpZiAoZ2V0SW5zdGFuY2UoKS5pc0luaXRpYWxpemVkKCkpIHsKLQkJCXJlY29yZHMgPSBnZXRJbnN0YW5jZSgpLmludGVybmFsR2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhmdWxsUGF0aCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZWNvcmRzID0gbmV3IElUYWdsaWJSZWNvcmRbMF07Ci0JCX0KLQkJZ2V0SW5zdGFuY2UoKS5maXJlQ3VycmVudERlbHRhKCJlbnVtZXJhdGU6ICIgKyBmdWxsUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlY29yZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSVBhdGggY29uc2lkZXJlZCB0byBiZSB0aGUgd2ViLWFwcCByb290IGZvciB0aGUgZ2l2ZW4gcGF0aC4KLQkgKiBBbGwgcmVzb2x1dGlvbiBmcm9tIHRoZSBnaXZlbiBwYXRoIGJlZ2lubmluZyB3aXRoICcvJyB3aWxsIGJlIHJlbGF0aXZlCi0JICogdG8gdGhlIGNvbXB1dGVkIHdlYi1hcHAgcm9vdC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIGlzIG5vdCBjb3JyZWN0IGluIGZsZXhpYmxlIHByb2plY3RzCi0JICogQHBhcmFtIHBhdGggLQotCSAqICAgICAgICAgICAgYSBwYXRoIHVuZGVyIHRoZSB3ZWItYXBwIHJvb3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCBjb25zaWRlcmVkIHRvIGJlIHRoZSB3ZWItYXBwJ3Mgcm9vdCBmb3IgdGhlIGdpdmVuCi0JICogICAgICAgICBwYXRoIG9yIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRDb250ZXh0Um9vdChJUGF0aCBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlMT0NLLmFjcXVpcmUoKTsKLQkJCWlmIChnZXRJbnN0YW5jZSgpLmlzSW5pdGlhbGl6ZWQoKSkgewotCQkJCXJldHVybiBnZXRJbnN0YW5jZSgpLmludGVybmFsR2V0Q29udGV4dFJvb3QocGF0aCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhZ2xpYkluZGV4IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIE5PVCBBUEkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVUYWdsaWJJbmRleExpc3RlbmVyKElUYWdsaWJJbmRleExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICghZ2V0SW5zdGFuY2UoKS5pc0luaXRpYWxpemVkKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRJbnN0YW5jZSgpLmlzSW5pdGlhbGl6ZWQoKSkKLQkJCWdldEluc3RhbmNlKCkuaW50ZXJuYWxSZW1vdmVUYWdsaWJJbmRleExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhIG1hdGNoaW5nIElUYWdsaWJSZWNvcmQgZ2l2ZW4gdGhlIHJlZmVyZW5jZS4gVHlwaWNhbGx5IHRoZQotCSAqIHJlc3VsdCB3aWxsIGhhdmUgdG8gYmUgY2FzdCB0byBhIHN1YmlpbnRlcmZhY2Ugb2YgSVRhZ2xpYlJlY29yZC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVBhdGggLQotCSAqICAgICAgICAgICAgdGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoIGZvciBJUmVzb3VyY2VzLCBmdWxsIGZpbGVzeXN0ZW0KLQkgKiAgICAgICAgICAgIHBhdGggb3RoZXJ3aXNlCi0JICogQHBhcmFtIHJlZmVyZW5jZSAtCi0JICogICAgICAgICAgICB0aGUgVVJJIHRvIGxvb2t1cCwgZm9yIGV4YW1wbGUgdGhlIHVyaSB2YWx1ZSBmcm9tIGEgdGFnbGliCi0JICogICAgICAgICAgICBkaXJlY3RpdmUKLQkgKiBAcGFyYW0gY3Jvc3NQcm9qZWN0cyAtCi0JICogICAgICAgICAgICB3aGV0aGVyIHRvIHNlYXJjaCBhY3Jvc3MgcHJvamVjdHMgKGN1cnJlbnRseSBpZ25vcmVkKQotCSAqIAotCSAqIEByZXR1cm4gYSB2aXNpYmxlIElUYWdsaWJSZWNvcmQgb3IgbnVsbCBpZiB0aGUgcmVmZXJlbmNlIHBvaW50cyB0byBubwotCSAqICAgICAgICAga25vd24gdGFnIGxpYnJhcnkgZGVzY3JpcHRvcgotCSAqIAotCSAqIEBTZWUgSVRhZ2xpYlJlY29yZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVRhZ2xpYlJlY29yZCByZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSwgYm9vbGVhbiBjcm9zc1Byb2plY3RzKSB7Ci0JCUlUYWdsaWJSZWNvcmQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGdldEluc3RhbmNlKCkuaXNJbml0aWFsaXplZCgpKSB7Ci0JCQlyZXN1bHQgPSBnZXRJbnN0YW5jZSgpLmludGVybmFsUmVzb2x2ZShiYXNlUGF0aCwgcmVmZXJlbmNlLCBjcm9zc1Byb2plY3RzKTsKLQkJfQotCQlnZXRJbnN0YW5jZSgpLmZpcmVDdXJyZW50RGVsdGEoInJlc29sdmU6ICIgKyByZWZlcmVuY2UpOyAvLyROT04tTkxTLTEkCi0JCWlmIChfZGVidWdSZXNvbHV0aW9uKSB7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggY291bGQgbm90IHJlc29sdmUgXCIiICsgcmVmZXJlbmNlICsgIlwiIGZyb20gIiArIGJhc2VQYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzd2l0Y2ggKHJlc3VsdC5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UTEQpIDogewotCQkJCQkJSVRMRFJlY29yZCByZWNvcmQgPSAoSVRMRFJlY29yZCkgcmVzdWx0OwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IHJlc29sdmVkICIgKyBiYXNlUGF0aCArICI6IiArIHJlZmVyZW5jZSArICIgPSAiICsgcmVjb3JkLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOiB7Ci0JCQkJCQlJSmFyUmVjb3JkIHJlY29yZCA9IChJSmFyUmVjb3JkKSByZXN1bHQ7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggcmVzb2x2ZWQgIiArIGJhc2VQYXRoICsgIjoiICsgcmVmZXJlbmNlICsgIiA9ICIgKyByZWNvcmQuZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRBR0RJUikgOiB7Ci0JCQkJCQlJVGFnRGlyUmVjb3JkIHJlY29yZCA9IChJVGFnRGlyUmVjb3JkKSByZXN1bHQ7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggcmVzb2x2ZWQgIiArIGJhc2VQYXRoICsgIjoiICsgcmVmZXJlbmNlICsgIiA9ICIgKyByZWNvcmQuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQkJCUlVUkxSZWNvcmQgcmVjb3JkID0gKElVUkxSZWNvcmQpIHJlc3VsdDsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCByZXNvbHZlZCAiICsgYmFzZVBhdGggKyAiOiIgKyByZWZlcmVuY2UgKyAiID0gIiArIHJlY29yZC5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEluc3RydWN0cyB0aGUgaW5kZXggdG8gc3RvcCBsaXN0ZW5pbmcgZm9yIHJlc291cmNlIGFuZCBjbGFzc3BhdGgKLQkgKiBjaGFuZ2VzLCBhbmQgdG8gZm9yZ2V0IGFsbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJaWYgKF9pbnN0YW5jZS5pc0luaXRpYWxpemVkKCkpIHsKLQkJCQlfaW5zdGFuY2Uuc3RvcCgpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnN0cnVjdHMgdGhlIGluZGV4IHRvIGJlZ2luIGxpc3RlbmluZyBmb3IgcmVzb3VyY2UgYW5kIGNsYXNzcGF0aAotCSAqIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCWJvb2xlYW4gc2h1dHRpbmdEb3duID0gIVBsYXRmb3JtLmlzUnVubmluZygpIHx8IFBsYXRmb3JtLmdldEJ1bmRsZShPU0dJX0ZSQU1FV09SS19JRCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RPUFBJTkc7Ci0JCWlmICghc2h1dHRpbmdEb3duKSB7Ci0JCQl0cnkgewotCQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJCUVOQUJMRUQgPSAhImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eShUYWdsaWJJbmRleC5jbGFzcy5nZXROYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWdldEluc3RhbmNlKCkuaW5pdGlhbGl6ZUluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlMT0NLLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIgZkNsYXNzcGF0aENoYW5nZUxpc3RlbmVyID0gbnVsbDsKLQotCXByaXZhdGUgVGFnbGliSW5kZXhEZWx0YSBmQ3VycmVudFRvcExldmVsRGVsdGEgPSBudWxsOwotCi0JTWFwIGZQcm9qZWN0RGVzY3JpcHRpb25zID0gbnVsbDsKLQotCXByaXZhdGUgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQotCXByaXZhdGUgSVRhZ2xpYkluZGV4TGlzdGVuZXJbXSBmVGFnbGliSW5kZXhMaXN0ZW5lcnMgPSBudWxsOwotCi0JLyoqIHN5bWJvbGljIG5hbWUgZm9yIE9TR0kgZnJhbWV3b3JrICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRhZ2xpYkluZGV4KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSW5zdGFuY2UoKSB7Ci0KLQkJaWYgKGlzSW5pdGlhbGl6ZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJLyoKLQkJCSAqIGNoZWNrIGFnYWluLCBqdXN0IGluY2FzZSBpdCB3YXMgaW5pdGlhbGl6ZWQgb24gYW5vdGhlciB0aHJlYWQsCi0JCQkgKiB3aGlsZSB3ZSB3ZXJlIHdhaXRpbmcgZm9yIHRoZSBsb2NrCi0JCQkgKi8KLQkJCWlmICghaXNJbml0aWFsaXplZCgpKSB7Ci0JCQkJLyoKLQkJCQkgKiBPbmx5IGNvbnNpZGVyIGEgY3Jhc2ggaWYgYSB2YWx1ZSBleGlzdHMgYW5kIGlzIERJUlRZIChub3QgYQotCQkJCSAqIG5ldyB3b3Jrc3BhY2UpCi0JCQkJICovCi0JCQkJaWYgKERJUlRZLmVxdWFsc0lnbm9yZUNhc2UoZ2V0U3RhdGUoKSkpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJBIHdvcmtzcGFjZSBjcmFzaCB3YXMgZGV0ZWN0ZWQuIFRoZSBwcmV2aW91cyBzZXNzaW9uIGRpZCBub3QgZXhpdCBub3JtYWxseS4gTm90IHVzaW5nIHNhdmVkIHRhZ2xpYiBpbmRleGVzLiIpOyAvLyROT04tTkxTLTMkCi0JCQkJCXJlbW92ZUluZGV4ZXMoZmFsc2UpOwotCQkJCX0KLQotCQkJCWZQcm9qZWN0RGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJCWZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCQlmQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIgPSBuZXcgQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIoKTsKLQkJCQlpZiAoRU5BQkxFRCkgewotCQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQkJCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGZDbGFzc3BhdGhDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkJfQotCQkJCXNldEludGlhbGl6ZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGRlbHRhIGFzIGEgY2hpbGQgdG8gYW4gb3ZlcmFsbCBkZWx0YQotCSAqIAotCSAqIEBwYXJhbSBkZWx0YQotCSAqLwotCXZvaWQgYWRkRGVsdGEoSVRhZ2xpYkluZGV4RGVsdGEgZGVsdGEpIHsKLQkJZW5zdXJlRGVsdGEoZGVsdGEuZ2V0UHJvamVjdCgpKS5hZGRDaGlsZERlbHRhKGRlbHRhKTsKLQl9Ci0KLQkvKioKLQkgKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSW5kZXhNYW5hZ2VyCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lclBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGNvbXB1dGVJbmRleExvY2F0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gY29tcHV0ZUluZGV4TmFtZShjb250YWluZXJQYXRoKTsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiLT4gaW5kZXggbmFtZSBmb3IgIiArIGNvbnRhaW5lclBhdGggKyAiIGlzICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmcgaW5kZXhMb2NhdGlvbiA9IGdldFRhZ2xpYkluZGV4U3RhdGVMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSkudG9PU1N0cmluZygpOwotCQlyZXR1cm4gaW5kZXhMb2NhdGlvbjsKLQl9Ci0KLQlTdHJpbmcgY29tcHV0ZUluZGV4TmFtZShJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0JCWNoZWNrc3VtQ2FsY3VsYXRvci5yZXNldCgpOwotCQljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKGNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpLmdldEJ5dGVzKCkpOwotCQkvLyB1c2UgIi5kYXQiIHNvIHdlJ3JlIG5vdCBjb25mdXNlZCB3aXRoIEpEVCBpbmRleGVzCi0JCVN0cmluZyBmaWxlTmFtZSA9IExvbmcudG9TdHJpbmcoY2hlY2tzdW1DYWxjdWxhdG9yLmdldFZhbHVlKCkpICsgIi5kYXQiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlQcm9qZWN0RGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQlkZXNjcmlwdGlvbiA9IChQcm9qZWN0RGVzY3JpcHRpb24pIGZQcm9qZWN0RGVzY3JpcHRpb25zLmdldChwcm9qZWN0KTsKLQkJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJLy8gT25jZSB3ZSd2ZSBzdGFydGVkIGluZGV4aW5nLCB3ZSdyZSBkaXJ0eSBhZ2FpbgotCQkJCWlmIChmUHJvamVjdERlc2NyaXB0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQkJc2V0U3RhdGUoRElSVFkpOwotCQkJCX0KLQkJCQlkZXNjcmlwdGlvbiA9IG5ldyBQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdCwgY29tcHV0ZUluZGV4TG9jYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJZlByb2plY3REZXNjcmlwdGlvbnMucHV0KHByb2plY3QsIGRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgYSBkZWx0YSBleGlzdHMgZm9yIGhvbGRpbmcgaW5kZXggY2hhbmdlIGluZm9ybWF0aW9uCi0JICovCi0JcHJpdmF0ZSBUYWdsaWJJbmRleERlbHRhIGVuc3VyZURlbHRhKElQcm9qZWN0IHByb2plY3QpIHsKLQkJLyoKLQkJICogVGhlIGZpcnN0IGRlbHRhIHRvIGJlIGFkZGVkIHdpbGwgZGV0ZXJtaW5lIHdoaWNoIHByb2plY3QgdGhlCi0JCSAqIHRvcC1sZXZlbCBkZWx0YSB3aWxsIGNvbnRhaW4uCi0JCSAqLwotCQlpZiAoZkN1cnJlbnRUb3BMZXZlbERlbHRhID09IG51bGwpIHsKLQkJCWZDdXJyZW50VG9wTGV2ZWxEZWx0YSA9IG5ldyBUYWdsaWJJbmRleERlbHRhKHByb2plY3QsIG51bGwsIElUYWdsaWJJbmRleERlbHRhLkNIQU5HRUQpOwotCQl9Ci0JCXJldHVybiBmQ3VycmVudFRvcExldmVsRGVsdGE7Ci0JfQotCi0Jdm9pZCBmaXJlQ3VycmVudERlbHRhKE9iamVjdCB0cmlnZ2VyKSB7Ci0JCWlmIChmQ3VycmVudFRvcExldmVsRGVsdGEgIT0gbnVsbCkgewotCQkJZkN1cnJlbnRUb3BMZXZlbERlbHRhLnRyaWdnZXIgPSB0cmlnZ2VyOwotCQkJSVRhZ2xpYkluZGV4RGVsdGEgZGVsdGEgPSBmQ3VycmVudFRvcExldmVsRGVsdGE7Ci0JCQlmQ3VycmVudFRvcExldmVsRGVsdGEgPSBudWxsOwotCQkJZmlyZVRhZ2xpYkRlbHRhKGRlbHRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgY2hlY2sgdG8gc2VlIGlmIHRoZSBPU0dJIGZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU3lzdGVtIEJ1bmRsZSBpcyBzdG9wcGVkIChpZS4gdGhlIGZyYW1ld29yayBpcwotCSAqICAgICAgICAgc2h1dHRpbmcgZG93bikKLQkgKi8KLQlib29sZWFuIGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkgewotCQkvLyBpbiB0aGUgRnJhbWV3b3JrIGNsYXNzIHRoZXJlJ3MgYSBub3RlOgotCQkvLyBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTeXN0ZW0gQnVuZGxlIHRvIFNUT1BQSU5HLgotCQkvLyB0aGlzIG11c3QgYmUgZG9uZSBmaXJzdCBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjE5LjIgZnJvbSB0aGUgT1NHaQotCQkvLyBSMyBzcGVjLgotCQlib29sZWFuIHNodXR0aW5nRG93biA9ICFQbGF0Zm9ybS5pc1J1bm5pbmcoKSB8fCBQbGF0Zm9ybS5nZXRCdW5kbGUoT1NHSV9GUkFNRVdPUktfSUQpLmdldFN0YXRlKCkgPT0gQnVuZGxlLlNUT1BQSU5HOwotCQlyZXR1cm4gc2h1dHRpbmdEb3duOwotCX0KLQotCVByb2plY3REZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCWlmIChpc0luaXRpYWxpemVkKCkpIHsKLQkJCWRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMuZ2V0KHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdGF0ZSgpIHsKLQkJU3RyaW5nIHN0YXRlID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoVGFnbGliSW5kZXguY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0VGFnbGliSW5kZXhTdGF0ZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgidGFnbGliaW5kZXgvIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsQWRkVGFnbGliSW5kZXhMaXN0ZW5lcihJVGFnbGliSW5kZXhMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0cnkgewotCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQlpZiAoZlRhZ2xpYkluZGV4TGlzdGVuZXJzID09IG51bGwpIHsKLQkJCQlmVGFnbGliSW5kZXhMaXN0ZW5lcnMgPSBuZXcgSVRhZ2xpYkluZGV4TGlzdGVuZXJbXXtsaXN0ZW5lcn07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmVGFnbGliSW5kZXhMaXN0ZW5lcnMpKTsKLQkJCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQkJfQotCQkJCWZUYWdsaWJJbmRleExpc3RlbmVycyA9IChJVGFnbGliSW5kZXhMaXN0ZW5lcltdKSBsaXN0ZW5lcnMudG9BcnJheShuZXcgSVRhZ2xpYkluZGV4TGlzdGVuZXJbMF0pOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElUYWdsaWJSZWNvcmRbXSBpbnRlcm5hbEdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoSVBhdGggcGF0aCkgewotCQlJVGFnbGliUmVjb3JkW10gcmVjb3JkcyA9IG5ldyBJVGFnbGliUmVjb3JkWzBdOwotCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC5zZWdtZW50KDApKTsKLQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb24ocHJvamVjdCk7Ci0JCQkJTGlzdCBhdmFpbGFibGVSZWNvcmRzID0gZGVzY3JpcHRpb24uZ2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhwYXRoKTsKLQotCQkJCS8vIElDYXRhbG9nIGNhdGFsb2cgPQotCQkJCS8vIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCQkJLy8gd2hpbGUgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCS8vIElDYXRhbG9nRW50cnlbXSBlbnRyaWVzID0gY2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotCQkJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbihlbnRyaWVzW2ldLmdldFVSSSgpKTsKLQkJCQkvLyB9Ci0JCQkJLy8gSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gY2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykgewotCQkJCS8vIElDYXRhbG9nRW50cnlbXSBlbnRyaWVzMiA9Ci0JCQkJLy8gbmV4dENhdGFsb2dzW2ldLmdldFJlZmVyZW5jZWRDYXRhbG9nKCkuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQkJCQkvLyBmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMyLmxlbmd0aDsgaisrKSB7Ci0JCQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKGVudHJpZXMyW2pdLmdldFVSSSgpKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQotCQkJCXJlY29yZHMgPSAoSVRhZ2xpYlJlY29yZFtdKSBhdmFpbGFibGVSZWNvcmRzLnRvQXJyYXkocmVjb3Jkcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlY29yZHM7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBpbnRlcm5hbEdldENvbnRleHRSb290KElQYXRoIHBhdGgpIHsKLQkJSUZpbGUgYmFzZVJlc291cmNlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24ocGF0aCk7Ci0JCWlmIChiYXNlUmVzb3VyY2UgIT0gbnVsbCAmJiBiYXNlUmVzb3VyY2UuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gYmFzZVJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlRGVzY3JpcHRpb24ocHJvamVjdCk7Ci0JCQlJUGF0aCByb290UGF0aCA9IGRlc2NyaXB0aW9uLmdldExvY2FsUm9vdChiYXNlUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCQlyZXR1cm4gcm9vdFBhdGg7Ci0JCX0KLQkJLy8gdHJ5IHRvIGhhbmRsZSBvdXQtb2Ytd29ya3NwYWNlIHBhdGhzCi0JCUlQYXRoIHJvb3QgPSBwYXRoLm1ha2VBYnNvbHV0ZSgpOwotCQl3aGlsZSAocm9vdC5zZWdtZW50Q291bnQoKSA+IDAgJiYgIXJvb3QuaXNSb290KCkpCi0JCQlyb290ID0gcm9vdC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCXJldHVybiByb290OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFJlbW92ZVRhZ2xpYkluZGV4TGlzdGVuZXIoSVRhZ2xpYkluZGV4TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJaWYgKGZUYWdsaWJJbmRleExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZlRhZ2xpYkluZGV4TGlzdGVuZXJzKSk7Ci0JCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCQkJZlRhZ2xpYkluZGV4TGlzdGVuZXJzID0gKElUYWdsaWJJbmRleExpc3RlbmVyW10pIGxpc3RlbmVycy50b0FycmF5KG5ldyBJVGFnbGliSW5kZXhMaXN0ZW5lclswXSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVRhZ2xpYlJlY29yZCBpbnRlcm5hbFJlc29sdmUoU3RyaW5nIGJhc2VQYXRoLCBmaW5hbCBTdHJpbmcgcmVmZXJlbmNlLCBib29sZWFuIGNyb3NzUHJvamVjdHMpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCUlUYWdsaWJSZWNvcmQgcmVzb2x2ZWQgPSBudWxsOwotCi0JCVBhdGggYmFzZUlQYXRoID0gbmV3IFBhdGgoYmFzZVBhdGgpOwotCQlJUmVzb3VyY2UgYmFzZVJlc291cmNlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24oYmFzZUlQYXRoKTsKLQotCQlpZiAoYmFzZVJlc291cmNlID09IG51bGwpIHsKLQkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJLy8gVHJ5IHRoZSBiYXNlIHBhdGggYXMgYSBmb2xkZXIgZmlyc3QKLQkJCWlmIChiYXNlSVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJYmFzZVJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGb2xkZXIoYmFzZUlQYXRoKTsKLQkJCX0KLQkJCS8vIElmIG5vdCBhIGZvbGRlciwgdGhlbiB0cnkgYmFzZSBwYXRoIGFzIGEgZmlsZQotCQkJaWYgKGJhc2VSZXNvdXJjZSAhPSBudWxsICYmICFiYXNlUmVzb3VyY2UuZXhpc3RzKCkgJiYgYmFzZUlQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCWJhc2VSZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShiYXNlSVBhdGgpOwotCQkJfQotCQkJaWYgKGJhc2VSZXNvdXJjZSA9PSBudWxsICYmIGJhc2VJUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7Ci0JCQkJYmFzZVJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KGJhc2VJUGF0aC5zZWdtZW50KDApKTsKLQkJCX0KLQkJfQotCi0JCWlmIChiYXNlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1MjkKLQkJCSAqIAotCQkJICogVGhpcyBtZXRob2QgcHJvZHVjZXMgYSBsZXNzIGFjY3VyYXRlIHJlc3VsdCwgYnV0IGRvZXNuJ3QKLQkJCSAqIHJlcXVpcmUgdGhhdCB0aGUgZmlsZSBleGlzdCB5ZXQuCi0JCQkgKi8KLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKGJhc2VJUGF0aCk7Ci0JCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkKLQkJCQliYXNlUmVzb3VyY2UgPSBmaWxlc1swXTsKLQkJfQotCQlpZiAoYmFzZVJlc291cmNlICE9IG51bGwpIHsKLQkJCXByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoYmFzZUlQYXRoLnNlZ21lbnQoMCkpOwotCQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBjcmVhdGVEZXNjcmlwdGlvbihwcm9qZWN0KTsKLQkJCQlyZXNvbHZlZCA9IGRlc2NyaXB0aW9uLnJlc29sdmUoYmFzZVBhdGgsIHJlZmVyZW5jZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzb2x2ZWQ7Ci0JfQotCi0JYm9vbGVhbiBpc0luZGV4QXZhaWxhYmxlKCkgewotCQlyZXR1cm4gX2luc3RhbmNlLmlzSW5pdGlhbGl6ZWQoKSAmJiBFTkFCTEVEOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgaW5kZXggZmlsZSBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUluZGV4KElQcm9qZWN0IHByb2plY3QpIHsKLQkJRmlsZSBpbmRleEZpbGUgPSBuZXcgRmlsZShjb21wdXRlSW5kZXhMb2NhdGlvbihwcm9qZWN0LmdldEZ1bGxQYXRoKCkpKTsKLQkJaWYgKGluZGV4RmlsZS5leGlzdHMoKSkgewotCQkJaW5kZXhGaWxlLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBpbmRleCBmaWxlcy4gVXNlZCBmb3IgbWFpbnRlbmFuY2UgYW5kIGtlZXBpbmcgdGhlIGluZGV4IGZvbGRlcgotCSAqIGEgbWFuYWdlYWJsZSBzaXplLgotCSAqIAotCSAqIEBwYXJhbSBzdGFsZU9ubHkgLQotCSAqICAgICAgICAgICAgaWYgPGI+dHJ1ZTwvYj4sIHJlbW92ZXMgb25seSB0aGUgaW5kZXhlcyBmb3IgcHJvamVjdHMgbm90Ci0JICogICAgICAgICAgICBvcGVuIGluIHRoZSB3b3Jrc3BhY2UsIGlmIDxiPmZhbHNlPC9iPiwgcmVtb3ZlcyBhbGwgb2YgdGhlCi0JICogICAgICAgICAgICBpbmRleGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUluZGV4ZXMoYm9vbGVhbiBzdGFsZU9ubHkpIHsKLQkJU3RyaW5nIG9zUGF0aCA9IGdldFRhZ2xpYkluZGV4U3RhdGVMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShvc1BhdGgpOwotCQlpZiAoIWZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5ta2RpcigpOwotCQkJfQotCQkJY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSBhbnkgZXh0cmFuZW91cyBpbmRleCBmaWxlcwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlMaXN0IGluZGV4TmFtZXMgPSBuZXcgQXJyYXlMaXN0KHByb2plY3RzLmxlbmd0aCk7Ci0JCWlmIChzdGFsZU9ubHkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJaW5kZXhOYW1lcy5hZGQoY29tcHV0ZUluZGV4TmFtZShwcm9qZWN0c1tpXS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBmb2xkZXIubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgZmlsZXMgIT0gbnVsbCAmJiBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIWluZGV4TmFtZXMuY29udGFpbnMoZmlsZXNbaV0uZ2V0TmFtZSgpKSkKLQkJCQkJZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U3RhdGUoU3RyaW5nIHN0YXRlKSB7Ci0JCWlmICghc3RhdGUuZXF1YWxzKGdldFN0YXRlKCkpKSB7Ci0JCQlKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFRhZ2xpYkluZGV4LmNsYXNzLmdldE5hbWUoKSwgc3RhdGUpOwotCQkJSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcCgpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQoKSkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihmQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIpOwotCi0JCQkvKgotCQkJICogQ2xlYXJpbmcgdGhlIGV4aXN0aW5nIHNhdmVkIHN0YXRlcyBoZWxwcyBwcnVuZSBkZWFkIGRhdGEgZnJvbQotCQkJICogdGhlIGluZGV4IGZvbGRlci4KLQkJCSAqLwotCQkJcmVtb3ZlSW5kZXhlcyh0cnVlKTsKLQotCQkJSXRlcmF0b3IgaSA9IGZQcm9qZWN0RGVzY3JpcHRpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoUHJvamVjdERlc2NyaXB0aW9uKSBpLm5leHQoKTsKLQkJCQlkZXNjcmlwdGlvbi5zYXZlUmVmZXJlbmNlcygpOwotCQkJfQotCi0JCQlmUHJvamVjdERlc2NyaXB0aW9ucy5jbGVhcigpOwotCi0JCQlzZXRTdGF0ZShDTEVBTik7Ci0JCQlmUHJvamVjdERlc2NyaXB0aW9ucyA9IG51bGw7Ci0JCQlmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0JCQlmQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIgPSBudWxsOwotCQkJc2V0SW50aWFsaXplZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJcmV0dXJuIGluaXRpYWxpemVkOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRJbnRpYWxpemVkKGJvb2xlYW4gaW50aWFsaXplZCkgewotCQl0aGlzLmluaXRpYWxpemVkID0gaW50aWFsaXplZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9UYWdsaWJJbmRleERlbHRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9UYWdsaWJJbmRleERlbHRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTRkOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvVGFnbGliSW5kZXhEZWx0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotcHVibGljIGNsYXNzIFRhZ2xpYkluZGV4RGVsdGEgaW1wbGVtZW50cyBJVGFnbGliSW5kZXhEZWx0YSB7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZDaGlsZHJlbjsKLQlwcml2YXRlIGludCBmRXhwbGljaXRLaW5kID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkltcGxpY2l0S2luZCA9IC0xOwotCXByaXZhdGUgSVByb2plY3QgZlByb2plY3Q7Ci0JcHJpdmF0ZSBJVGFnbGliUmVjb3JkIGZUYWdsaWJSZWNvcmQgPSBudWxsOwotCWxvbmcgdGltZTsKLQlPYmplY3QgdHJpZ2dlciA9IG51bGw7Ci0KLQlUYWdsaWJJbmRleERlbHRhKElQcm9qZWN0IHByb2plY3QsIElUYWdsaWJSZWNvcmQgcmVjb3JkLCBpbnQga2luZCkgewotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JCWZUYWdsaWJSZWNvcmQgPSByZWNvcmQ7Ci0JCWZFeHBsaWNpdEtpbmQgPSBraW5kOwotCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JfQotCi0Jdm9pZCBhZGRDaGlsZERlbHRhKElUYWdsaWJJbmRleERlbHRhIGRlbHRhKSB7Ci0JCWlmIChmQ2hpbGRyZW4gPT0gbnVsbCkKLQkJCWZDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZkNoaWxkcmVuLmFkZChkZWx0YSk7Ci0JCWZJbXBsaWNpdEtpbmQgPSAtMTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlS2luZCgpIHsKLQkJaW50IGFkZGVkID0gMDsKLQkJaW50IHJlbW92ZWQgPSAwOwotCi0JCUlUYWdsaWJJbmRleERlbHRhW10gY2hpbGRyZW4gPSAoSVRhZ2xpYkluZGV4RGVsdGFbXSkgZkNoaWxkcmVuLnRvQXJyYXkobmV3IElUYWdsaWJJbmRleERlbHRhW2ZDaGlsZHJlbi5zaXplKCldKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaW50IGtpbmQgPSBjaGlsZHJlbltpXS5nZXRLaW5kKCk7Ci0JCQlpZiAoa2luZCA9PSBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCkKLQkJCQlhZGRlZCsrOwotCQkJaWYgKGtpbmQgPT0gSVRhZ2xpYkluZGV4RGVsdGEuUkVNT1ZFRCkKLQkJCQlyZW1vdmVkKys7Ci0JCQlpZiAoYWRkZWQgPiAwICYmIHJlbW92ZWQgPiAwKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhZGRlZCA+IDAgJiYgcmVtb3ZlZCA+IDApIHsKLQkJCXJldHVybiBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEOwotCQl9Ci0JCWVsc2UgaWYgKGFkZGVkID4gMCkgewotCQkJcmV0dXJuIElUYWdsaWJJbmRleERlbHRhLkFEREVEOwotCQl9Ci0JCWVsc2UgaWYgKHJlbW92ZWQgPiAwKSB7Ci0JCQlyZXR1cm4gSVRhZ2xpYkluZGV4RGVsdGEuUkVNT1ZFRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEOwotCQl9Ci0JfQotCi0JcHVibGljIElUYWdsaWJJbmRleERlbHRhW10gZ2V0QWZmZWN0ZWRDaGlsZHJlbigpIHsKLQkJaWYgKGZDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElUYWdsaWJJbmRleERlbHRhWzBdOwotCQl9Ci0JCXJldHVybiAoSVRhZ2xpYkluZGV4RGVsdGFbXSkgZkNoaWxkcmVuLnRvQXJyYXkobmV3IElUYWdsaWJJbmRleERlbHRhW2ZDaGlsZHJlbi5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCWlmIChmQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZFeHBsaWNpdEtpbmQ7Ci0JCX0KLQkJaWYgKGZJbXBsaWNpdEtpbmQgPT0gLTEpIHsKLQkJCWZJbXBsaWNpdEtpbmQgPSBjb21wdXRlS2luZCgpOwotCQl9Ci0JCXJldHVybiBmSW1wbGljaXRLaW5kOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHVibGljIElUYWdsaWJSZWNvcmQgZ2V0VGFnbGliUmVjb3JkKCkgewotCQlyZXR1cm4gZlRhZ2xpYlJlY29yZDsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRUaW1lKCkgewotCQlyZXR1cm4gdGltZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFRyaWdnZXIoKSB7Ci0JCXJldHVybiB0cmlnZ2VyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChmVGFnbGliUmVjb3JkICE9IG51bGwpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBmVGFnbGliUmVjb3JkLnRvU3RyaW5nKCk7Ci0JCQlpbnQga2luZCA9IGdldEtpbmQoKTsKLQkJCXN3aXRjaCAoa2luZCkgewotCQkJCWNhc2UgSVRhZ2xpYkluZGV4RGVsdGEuQURERUQgOgotCQkJCQlzdHJpbmcgPSAiIEFEREVEICgiICsgc3RyaW5nICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEIDoKLQkJCQkJc3RyaW5nID0gIiBDSEFOR0VEICgiICsgc3RyaW5nICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEIDoKLQkJCQkJc3RyaW5nID0gIiBSRU1PVkVEICgiICsgc3RyaW5nICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXN0cmluZyA9ICIgb3RoZXI6IiArIGtpbmQgKyAiICgiICsgc3RyaW5nICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaW50IGtpbmQgPSBnZXRLaW5kKCk7Ci0JCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCQljYXNlIElUYWdsaWJJbmRleERlbHRhLkFEREVEIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiVGFnbGliSW5kZXhEZWx0YSgiICsgZlByb2plY3QgKyAiKTpBRERFRFxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiVGFnbGliSW5kZXhEZWx0YSgiICsgZlByb2plY3QgKyAiKTpDSEFOR0VEXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQgOgotCQkJCQlidWZmZXIuYXBwZW5kKCJUYWdsaWJJbmRleERlbHRhKCIgKyBmUHJvamVjdCArICIpOlJFTU9WRURcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJSVRhZ2xpYkluZGV4RGVsdGFbXSBjaGlsZHJlbiA9IGdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlidWZmZXIuYXBwZW5kKCdcdCcpOwotCQkJCWJ1ZmZlci5hcHBlbmQoY2hpbGRyZW5baV0udG9TdHJpbmcoKSk7Ci0JCQkJaWYgKGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoJ1xuJyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGV4dC9JSlNQUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90ZXh0L0lKU1BQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZTRjM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90ZXh0L0lKU1BQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb24gdHlwZXMgZm9yIEpTUC4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJSlNQUGFydGl0aW9ucyB7Ci0KLQlTdHJpbmcgSlNQX0RFRkFVTFQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5ERUZBVUxUX0pTUCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTU1FTlQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgSlNQX1NDUklQVF9QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09OVEVOVF9ERUxJTUlURVIgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJERUxJTUlURVIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT05URU5UX0pBVkEgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKQVZBIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09OVEVOVF9KQVZBU0NSSVBUID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSkFWQVNDUklQVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0RFRkFVTFRfRUwgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKU1BfRUwiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9ERUZBVUxUX0VMMiA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpTUF9FTDIiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEpTUF9ESVJFQ1RJVkUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUGVkQ1NTVGFnbGliQ29udHJvbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUGVkQ1NTVGFnbGliQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODRhNWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTVGFnbGliQ29udHJvbGxlciBpbXBsZW1lbnRzIElEb2N1bWVudFNldHVwUGFydGljaXBhbnQgewotCi0JcHVibGljIHZvaWQgc2V0dXAoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIGlnbm9yZSBUTEQgaW4gY29udGVudCB0eXBlIGNzcyBqc3AKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckpTUGVkQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWZhNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckpTUGVkQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUyBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSwgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5MQU5HVUFHRV9BVFRSSUJVVEV9OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5WQUxJRDsKLQotCQkvLyBpZiBkaXNjcmlwdGlvbiBpcyBudWxsLCB3ZSBhcmUganVzdCBiZWluZyBhc2tlZCB0bwotCQkvLyBhc3Nlc3MgY29udGVudHMgdmFsaWRpdHkKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJLy8gaWYgZGlzY3JpcHRpb24gaXMgbnVsbCwgd2UgYXJlIGp1c3QgYmVpbmcgYXNrZWQgdG8KLQkJLy8gYXNzZXNzIGNvbnRlbnRzIHZhbGlkaXR5Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJCXJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQkJcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gaGFuZGxlIHN0YW5kYXJkIG9uZXMgZmlyc3QsIHRvIGJlIHN1cmUgZGV0ZWN0b3IgcHJvY2Vzc2VzCi0JCWhhbmRsZVN0YW5kYXJkQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCS8vIG5vdyBkbyB0aG9zZSBzcGVjaWZpYyBmb3IgSlNQcwotCQkvLyBub3RlOiBkZXRlY3RvciBzaG91bGQgYWx3YXlzIGJlIG9mIGNvcnJlY3QgaW5zdGFuY2UsIGJ1dCB3ZSdsbAotCQkvLyBjaGVjaywgZm9yIG5vdy4KLQkJaWYgKGRldGVjdG9yIGluc3RhbmNlb2YgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSB7Ci0JCQlKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IganNwRGV0ZWN0b3IgPSAoSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcjsKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGpzcERldGVjdG9yLmdldExhbmd1YWdlKCk7Ci0JCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSwgbGFuZ3VhZ2UpOwotCQkJfQotCQkJU3RyaW5nIGNvbnRlbnRUeXBlQXR0cmlidXRlID0ganNwRGV0ZWN0b3IuZ2V0Q29udGVudFR5cGUoKTsKLQkJCWlmIChjb250ZW50VHlwZUF0dHJpYnV0ZSAhPSBudWxsICYmIGNvbnRlbnRUeXBlQXR0cmlidXRlLmxlbmd0aCgpID4gMCkgewotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSwgY29udGVudFR5cGVBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gT25jZSB3ZSBkZXRlY3RlZCBhIGNoYXJzZXQsIHdlIHNob3VsZCBzZXQgdGhlIHByb3BlcnR5IGV2ZW4KLQkJCS8vIHRob3VnaCBpdCdzIHRoZSBzYW1lIGFzIGphdmFDaGFyc2V0Ci0JCQkvLyBiZWNhdXNlIHRoZXJlIGFyZSBjbGllbnRzIHRoYXQgcmVseSBvbiB0aGlzIHByb3BlcnR5IHRvCi0JCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGNoYXJzZXQgaXMgYWN0dWFsbHkgZGV0ZWN0ZWQgaW4gZmlsZSBvciBub3QuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3RhbmRhcmRDYWxjdWxhdGlvbnMoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RlOiBpZiB3ZSdyZSBhc2tlZCBmb3Igb25lLCB3ZSBzZXQgdGhlbSBhbGwuIEkgbmVlZCB0byBiZSBzdXJlIGlmCi0JCS8vIGNhbGxlZAotCQkvLyBtdWxpdGlwbGUgdGltZXMgKG9uZSBmb3IgZWFjaCwgc2F5KSB0aGF0IHdlIGRvbid0IHdhc3RlIHRpbWUKLQkJLy8gcHJvY2Vzc2luZyBzYW1lCi0JCS8vIGNvbnRlbnQgYWdhaW4uCi0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSAoKEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3IpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCS8vIGJ5IHRleHQgdHlwZS4KLQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQnl0ZU9yZGVyTWFyayA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LCBtYXkKLQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBkZXRlY3RlZEJ5dGVPcmRlck1hcmspOwotCQl9Ci0KLQotCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCS8vIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkvLyBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVAotCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYKLQkJCS8vIGludmFsaWQKLQkJCS8vIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucyBhbgotCQkJLy8gImFwcHJvcHJpYXRlIGRlZmF1bHQiIHRvIHVzZS4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBlbmNvZGluZ01lbWVudG8uZ2V0SW52YWxpZEVuY29kaW5nKCkpOwotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCX0KLQotCQlPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCS8vIHdlIGFsd2F5cyBpbmNsdWRlIGRldGVjdGVkLCBpZiBpdHMgZGlmZmVyZW50IHRoYW4gamF2YQotCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQ2hhcnNldCA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCk7Ci0JCQlpZiAoamF2YUNoYXJzZXQuZXF1YWxzKGV4aXN0aW5nQ2hhcnNldCkpIHsKLQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LgotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGRldGVjdG9yLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShSZWFkZXIgcmVhZGVyKSB7Ci0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSUpTUENTU0ltcG9ydFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NJbXBvcnRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNzRiODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSUpTUENTU0ltcG9ydFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLQotcHVibGljIGludGVyZmFjZSBJSlNQQ1NTSW1wb3J0UnVsZSBleHRlbmRzIElDU1NJbXBvcnRSdWxlLCBJSlNQQ1NTTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjI2NzU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUENTU05vZGUgZXh0ZW5kcyBJQ1NTTm9kZSB7Ci0Jc2hvcnQgSlNQX05PREUgPSAxNjsKLQlTdHJpbmcgZ2V0Q3NzVGV4dCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQQ1NTSW1wb3J0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU0ltcG9ydFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOWRkMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQQ1NTSW1wb3J0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NJbXBvcnRSdWxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLQotcHVibGljIGNsYXNzIEpTUENTU0ltcG9ydFJ1bGVJbXBsIGV4dGVuZHMgQ1NTSW1wb3J0UnVsZUltcGwgaW1wbGVtZW50cyBJSlNQQ1NTSW1wb3J0UnVsZSB7Ci0KLQlKU1BDU1NJbXBvcnRSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JSlNQQ1NTSW1wb3J0UnVsZUltcGwoSlNQQ1NTSW1wb3J0UnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkKLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlKU1BDU1NJbXBvcnRSdWxlSW1wbCBjbG9uZWQgPSBuZXcgSlNQQ1NTSW1wb3J0UnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoSFJFRik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKEhSRUYuZXF1YWxzKG5hbWUpKXsKLQkJCXZhbHVlID0gQ1NTVXRpbC5leHRyYWN0VXJpQ29udGVudHModmFsdWUpOwotCQl9Ci0JCXN1cGVyLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQQ1NTTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYmE3MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQQ1NTTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotY2xhc3MgSlNQQ1NTTm9kZUltcGwgZXh0ZW5kcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJSlNQQ1NTTm9kZSB7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCi0JSlNQQ1NTTm9kZUltcGwoSlNQQ1NTTm9kZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCX0KLQotCUpTUENTU05vZGVJbXBsKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZUZXh0ID0gdGV4dDsKLQl9Ci0JCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJSlNQQ1NTTm9kZUltcGwgY2xvbmVkID0gbmV3IEpTUENTU05vZGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBKU1BfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENzc1RleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRhMGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NNb2RlbFBhcnNlcjsKLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTTW9kZWxJbXBsIGV4dGVuZHMgQ1NTTW9kZWxJbXBsIHsKLQlwcml2YXRlIEpTUGVkQ1NTTW9kZWxQYXJzZXIgZlBhcnNlcjsKLQkKLQlwcm90ZWN0ZWQgQ1NTTW9kZWxQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAoZlBhcnNlciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJZlBhcnNlciA9IG5ldyBKU1BlZENTU01vZGVsUGFyc2VyKGdldERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmUGFyc2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQZWRDU1NNb2RlbFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQZWRDU1NNb2RlbFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE3MjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5KU1BlZENTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NNb2RlbENyZWF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU05vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1J1bGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBKU1BlZENTU01vZGVsUGFyc2VyIGV4dGVuZHMgQ1NTTW9kZWxQYXJzZXIgewotCi0JcHVibGljIEpTUGVkQ1NTTW9kZWxQYXJzZXIoSUNTU0RvY3VtZW50IGRvYykgewotCQlzdXBlcihkb2MpOwotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTTm9kZUltcGwgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCUNTU01vZGVsQ3JlYXRpb25Db250ZXh0IGNyZWF0aW9uQ29udGV4dCA9IGdldENyZWF0aW9uQ29udGV4dCgpOwotCQlpZiAoY3JlYXRpb25Db250ZXh0ID09IG51bGwgfHwgcmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIHR5cGUgPSAoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSByZWdpb24pLmdldFR5cGUoKTsKLQkJQ1NTTm9kZUltcGwgbW9kaWZpZWQgPSBudWxsOwotCi0JCS8vSUNTU05vZGUgdGFyZ2V0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCQotCQlpZiAodHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfRElSRUNUSVZFKXsKLQkJCQotCQkJYm9vbGVhbiBpc0luY2x1ZGUgPSByZWdpb24uZ2V0VGV4dCgpLmluZGV4T2YoImluY2x1ZGUiKSAhPSAtMTsKLQkJCWlmIChpc0luY2x1ZGUpewotCQkJCW1vZGlmaWVkID0gaW5zZXJ0VW5rbm93bkltcG9ydChyZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQltb2RpZmllZCA9IGluc2VydFVua25vd25SdWxlKHJlZ2lvbik7CQkJCQkKLQkJCX0KLQkJfQotCi0JCS8vIHBvc3QgcHJvY2VzcwotCQlpZiAobW9kaWZpZWQgIT0gbnVsbCkgewotCQkJaWYgKG1vZGlmaWVkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG1vZGlmaWVkKS5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmaWVkICE9IG51bGwgPyBtb2RpZmllZCA6IHN1cGVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24pOwotCX0KLQotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0VW5rbm93bkltcG9ydChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBjcmVhdGlvbkNvbnRleHQgPSBnZXRDcmVhdGlvbkNvbnRleHQoKTsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gY3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJSUNTU0RvY3VtZW50IHNoZWV0ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCi0JCVN0cmluZyB0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIgIik7Ci0JICAgIFN0cmluZ1tdIHN0cnMgPSBwYXR0ZXJuLnNwbGl0KHRleHQpOwotCSAgICBTdHJpbmcgaHJlZlZhbHVlID0gbnVsbDsKLQkgICAgZm9yIChpbnQgaT0wO2k8c3Rycy5sZW5ndGg7aSsrKSB7Ci0JICAgIAlTdHJpbmcgaHJlZlN0ciA9ICJmaWxlPVwiIjsKLQkgICAgICBpZiAoc3Ryc1tpXS5zdGFydHNXaXRoKGhyZWZTdHIpKXsKLQkJCQlpbnQgaHJlZlN0cl9sZW5ndGggPSBocmVmU3RyLmxlbmd0aCgpOwotCQkJCS8vIG1pbnVzIDEgdG8gYXZvaWQgcXVvdGU/Ci0JCQkJaW50IGhyZWZWYWx1ZV9sZW5ndGggPSBzdHJzW2ldLmxlbmd0aCgpIC0gMTsKLQkJCQlpZiAoaHJlZlZhbHVlX2xlbmd0aCA+IGhyZWZTdHJfbGVuZ3RoKSB7Ci0JCQkJCWhyZWZWYWx1ZSA9IHN0cnNbaV0uc3Vic3RyaW5nKGhyZWZTdHJfbGVuZ3RoLCBocmVmVmFsdWVfbGVuZ3RoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIElTU1VFOiB0aGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUsIGUuZy4gImZpbGU9IiBoYXMgbm8KLQkJCQkJICogc3Vic2VxdWVudCAndmFsdWUnIC4uLiBhbmQgZnJvbSBjb2RlIGluIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQkgKiBJIGJlbGlldmUgc2hvdWxkIHJldHVybiBudWxsLCByYXRoZXIgdGhhbiBlbXB0eSBzdHJpbmcsIGJ1dCwgdGhpcyBtYXkgCi0JCQkJCSAqIG5lZWQgc29tZSBmaW5lIHR1bmluZyBldmVudHVhbGx5LgotCQkJCQkgKi8KLQkJCQkJaHJlZlZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JICAgIAkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgfQotCQkKLQkJaWYgKGhyZWZWYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUpTUENTU0ltcG9ydFJ1bGVJbXBsIHJ1bGUgPSBuZXcgSlNQQ1NTSW1wb3J0UnVsZUltcGwoKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHNoZWV0KTsKLQkJcnVsZS5hcHBlbmRDaGlsZCgoQ1NTTm9kZUltcGwpc2hlZXQuY3JlYXRlTWVkaWFMaXN0KCkpOwotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbiwgcmVnaW9uKTsKLQotCQkKLQkJaWYgKCFpc1VwZGF0ZUNvbnRleHRBY3RpdmUoKSkgewotCQkJcnVsZS5zZXRIcmVmKGhyZWZWYWx1ZSk7Ly9BdHRyaWJ1dGUoSUNTU0ltcG9ydFJ1bGUuSFJFRiwgaHJlZlZhbHVlKTsKLQkJfQotCi0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFpc1VwZGF0ZUNvbnRleHRBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJLy9wcm9wYWdhdGVSYW5nZVByZUluc2VydChzaGVldCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gY3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJKChDU1NOb2RlSW1wbClzaGVldCkuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJKChDU1NOb2RlSW1wbClzaGVldCkuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQkJLy9jcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRVbmtub3duUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUNTU01vZGVsQ3JlYXRpb25Db250ZXh0IGNyZWF0aW9uQ29udGV4dCA9IGdldENyZWF0aW9uQ29udGV4dCgpOwotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBjcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWlzUGFyc2VGbG9hdGluZygpICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUpTUENTU05vZGVJbXBsIHJ1bGUgPSBuZXcgSlNQQ1NTTm9kZUltcGwoZmxhdE5vZGUuZ2V0VGV4dCgpKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGZsYXROb2RlKTsKLQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghaXNVcGRhdGVDb250ZXh0QWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gY3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCS8vY3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQZWRDU1NEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQZWRDU1NEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODdjYTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUGVkQ1NTRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUGVkQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTRG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBDU1NEb2N1bWVudExvYWRlciB7Ci1wdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQlyZXR1cm4gbmV3IEpTUGVkQ1NTU291cmNlUGFyc2VyKCk7Ci19Ci1wdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCXJldHVybiBuZXcgSlNQZWRDU1NEb2N1bWVudExvYWRlcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0pTUGVkQ1NTTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BlZENTU01vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOTE0YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0pTUGVkQ1NTTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkpTUGVkQ1NTTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQZWRDU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkNTU01vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgSlNQZWRDU1NNb2RlbExvYWRlciBleHRlbmRzIENTU01vZGVsTG9hZGVyIHsKLXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCkgewotCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBuZXcgSlNQZWRDU1NNb2RlbEltcGwoKTsKLQlyZXR1cm4gbW9kZWw7Ci19Ci1wdWJsaWMgSU1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCXJldHVybiBuZXcgSlNQZWRDU1NNb2RlbExvYWRlcigpOwotfQotcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgSlNQZWRDU1NEb2N1bWVudExvYWRlcigpOwotCX0KLQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JKU1BlZENTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2QxYzJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JKU1BlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQZWRDU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkFic3RyYWN0TW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckpTUGVkQ1NTKCl7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQkKLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IEpTUGVkQ1NTTW9kZWxMb2FkZXIoKTsKLQl9Ci0JCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IENTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BlZENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTU291cmNlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQZWRDU1NTb3VyY2VQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyYThhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQZWRDU1NTb3VyY2VQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5KU1BlZENTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLklDU1NUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU1NvdXJjZVBhcnNlciBleHRlbmRzIENTU1NvdXJjZVBhcnNlciB7Ci0KLQlwcml2YXRlIEpTUGVkQ1NTVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbXVzdEJlU3RhcnQoU3RyaW5nIHR5cGUsIFN0cmluZyBkb2NSZWdpb25UeXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0NPTU1FTlQgfHwgdHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfRElSRUNUSVZFIHx8IHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0VORCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB8fCAoZG9jUmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkgJiYgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgfHwgKCFDU1NSZWdpb25VdGlsLmlzU2VsZWN0b3JCZWdnaW5pbmdUeXBlKGRvY1JlZ2lvblR5cGUpICYmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVzdEJlRW5kKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfQ09NTUVOVCB8fCB0eXBlID09IEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0pTUF9ESVJFQ1RJVkUgfHwgdHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfRU5EIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUik7Ci0JfQotCQotCXB1YmxpYyBJQ1NTVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBKU1BlZENTU1Rva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQkKLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEpTUGVkQ1NTU291cmNlUGFyc2VyKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQZWRDU1NUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiMjJlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQZWRDU1NUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNzggKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40LjEgb24gNy8yMi8wOCAxMDozMCBBTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkpTUGVkQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuSUNTU1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuQ1NTVGV4dFJlZ2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS8iPkpGbGV4PC9hPiAxLjQuMQotICogb24gNy8yMi8wOCAxMDozMCBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5EOi93b3Jrc3BhY2VzL3d0cDMwMS93b3Jrc3BhY2Uvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9KU1BlZENTU1Rva2VuaXplci5mbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEpTUGVkQ1NTVG9rZW5pemVyIGltcGxlbWVudHMgSlNQZWRDU1NSZWdpb25Db250ZXh0cywgSUNTU1Rva2VuaXplciB7Ci0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfQlVGRkVSU0laRSA9IDE2Mzg0OwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfRVhQID0gMjE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0pTUF9ESVJFQ1RJVkUgPSAyMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgPSAxMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSU1QT1JUX0RFTElNSVRFUiA9IDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSA9IDE4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUiA9IDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9DSEFSU0VUX0RFTElNSVRFUiA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMTk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1BBR0VfUFNFVURPX1BBR0UgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9JTVBPUlRfVVJJID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCA9IDE1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfRUwgPSAyMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SID0gMTM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0pTUF9ERUNMQVJBVElPTiA9IDIxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTiA9IDE2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9QQUdFX0RFTElNSVRFUiA9IDk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSA9IDE0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9NRURJQV9NRURJVU0gPSA2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfU0NSSVBUTEVUID0gMjA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0NIQVJTRVRfTkFNRSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0pTUF9DT01NRU5UID0gMjM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0lNUE9SVF9NRURJVU0gPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IgPSAxNzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfRk9OVF9GQUNFX0RFTElNSVRFUiA9IDk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX01FRElBX0RFTElNSVRFUiA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX01PRElGSUVSID0gMTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlZSU5JVElBTCA9IDA7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMTFcMFwxXDExXDFcMTdcMVwwXDFcNFwxXDIwXDIyXDBcMVw2XDFcNDBcMVwxMCIrCi0gICAgIlwxXDIyXDFcMzNcMVwzMVwxXDE2XDFcNVwxXDI2XDFcMTJcMVw0MlwxXDE0XDFcNjEiKwotICAgICJcMVwxM1wxXDE1XDFcNDFcMTJcMVwxXDY1XDFcNTRcMVwzMFwxXDM3XDFcMzJcMVwyMSIrCi0gICAgIlwxXDM2XDFcNDdcMVwyN1wxXDQ0XDFcNjNcMVw1MlwxXDY3XDFcNjRcMVw0NVwxXDU1IisKLSAgICAiXDJcMlwxXDI1XDFcNTZcMVw3MFwxXDYwXDFcNTdcMVwyXDFcMjRcMVw1MFwxXDUzIisKLSAgICAiXDFcMjNcNVwyXDFcNzFcMVwzXDFcNzNcMVwxNlwxXDJcMVwxNlwxXDQ2XDFcNyIrCi0gICAgIlwxXDQzXDFcNjJcMVw1MVwxXDY2XDFcNjRcMVw0NVwxXDU1XDJcMlwxXDI1XDFcNTYiKwotICAgICJcMVw3MFwxXDYwXDFcNTdcMVwyXDFcMjRcMVw1MFwxXDUzXDFcMjNcNVwyXDFcMzQiKwotICAgICJcMVw3MlwxXDM1XDFcNzJcMVwwXHVmZjgwXDIiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIFpaX0NNQVAgPSB6elVucGFja0NNYXAoWlpfQ01BUF9QQUNLRUQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBERkEgc3RhdGVzIHRvIGFjdGlvbiBzd2l0Y2ggbGFiZWxzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FDVElPTiA9IHp6VW5wYWNrQWN0aW9uKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9Ci0gICAgIlwzMFwwXDFcMVwxXDJcMVwxXDFcM1wxXDJcNFwxXDFcNCIrCi0gICAgIlwyXDFcMVw1XDFcMVwxXDZcNFwxXDFcN1wzXDFcMVwxMCIrCi0gICAgIlwxXDFcMVwxMFwxXDExXDFcMTJcMVwxXDFcMTJcMVwxM1wxXDE0IisKLSAgICAiXDFcMTVcMVwxXDFcMTVcMVwxNlwxXDFcMVwzXDFcMTdcMVwyMCIrCi0gICAgIlwxXDIxXDFcMVwxXDIxXDFcMjJcMVwxXDFcMjNcMVwyNFwzXDEiKwotICAgICJcMVwyNFwxXDI1XDFcMVwxXDI1XDFcMjZcMVwyN1wxXDMwXDFcMzEiKwotICAgICJcM1wxXDFcMzJcMVwzMVwzXDFcMVwzMVwxXDFcMlwzM1wxXDMiKwotICAgICJcMlwxXDFcMzRcMVwzNVwxXDM2XDFcMzdcMVwxXDFcMFwyXDIiKwotICAgICJcMVw0MFwxXDBcMVw0MVwyXDBcMVw0MlwyXDBcMVw0M1w2XDAiKwotICAgICJcMVw0NFwzXDBcMVw0NVw1XDBcMVw0Nlw0XDBcMlwxMFwxXDAiKwotICAgICJcMlwxMlwxXDBcMlwxNVwxXDE3XDFcMFwyXDIxXDFcMFwxXDI0IisKLSAgICAiXDJcMFwxXDI0XDJcMFwxXDI0XDFcMFwyXDI1XDFcNDdcMlwwIisKLSAgICAiXDFcNTBcMVwwXDFcNTFcMVwzMVwyXDBcMVw1MlwyXDBcMlwzMSIrCi0gICAgIlwxXDMwXDFcNTNcMlwwXDFcMzFcMlwwXDFcNTRcMVw1NVwxXDAiKwotICAgICJcMVw1NlwxXDBcMVwyXDFcNTdcMVw0MFwxXDQxXDEwXDBcMVw0NCIrCi0gICAgIlwxXDBcMVw0NVwyXDBcMVw0NVwyXDBcMVw0NlwyXDBcMVw0NiIrCi0gICAgIlwyXDBcMVwxMFwxXDEyXDFcMTVcMVwyMVwxXDI0XDFcMFwxXDI0IisKLSAgICAiXDJcMFwxXDI0XDFcMFwxXDI1XDFcNDdcMVwzMVwxXDBcMVw1MiIrCi0gICAgIlwyXDBcMVw1MlwxXDBcMVw1M1wxXDYwXDFcMzFcM1wwXDFcMiIrCi0gICAgIlwxXDQwXDFcNDFcMVw2MVw1XDBcMVw2MlwyXDBcMVw0NFw1XDAiKwotICAgICJcMVwxMFwxXDEyXDFcMTVcMVwyMVwxXDI0XDJcMFwxXDI1XDFcNDciKwotICAgICJcMVwzMVwyXDBcMVw1M1wxXDYwXDFcMFwxXDUxXDFcMFwxXDYzIisKLSAgICAiXDFcMlwxXDQwXDFcNDFcM1wwXDFcNjRcMlwwXDFcNDRcMVwwIisKLSAgICAiXDFcNDRcMTBcMFwxXDY1XDFcMTBcMVwxMlwxXDE1XDFcMjFcMVwyNCIrCi0gICAgIlwyXDBcMVwyNVwxXDQ3XDFcMzFcMlwwXDFcNTNcMlw2MFw1XDAiKwotICAgICJcMVw2NlwxXDBcMVwyXDFcNDBcMVw0MVwyXDBcMVw2N1wyXDAiKwotICAgICJcMVw0NFw2XDBcMVw2NVwyXDBcMVwxMFwxXDEyXDFcMTVcMVwyMSIrCi0gICAgIlwxXDI0XDJcMFwxXDI1XDFcNDdcMVwzMVwyXDBcMVw1M1wyXDYwIisKLSAgICAiXDJcMFwxXDY2XDNcMFwxXDJcMVw0MFwxXDQxXDFcMFwxXDcwIisKLSAgICAiXDJcMFwxXDQ0XDEzXDBcMVwxMFwxXDEyXDFcMTVcMVwyMVwxXDI0IisKLSAgICAiXDJcMFwxXDI1XDFcNDdcMVwzMVwyXDBcMVw1M1wyXDYwXDEwXDAiKwotICAgICJcMVw0MFwxXDQxXDFcNzFcMlwwXDFcNDRcNlwwXDFcNjVcMVwwIisKLSAgICAiXDFcNjVcMlwwXDFcNDdcMlwwXDFcNTNcMlw2MFwyXDBcMVw2NiIrCi0gICAgIlwxXDBcMVw2Nlw2XDBcMVw2MFw0XDBcMVw3Mlw0XDBcMVw2MCIrCi0gICAgIlwzXDBcMVw3M1wxMlwwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNDU1XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfUk9XTUFQID0genpVbnBhY2tSb3dNYXAoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfUk9XTUFQX1BBQ0tFRF8wID0KLSAgICAiXDBcMFwwXDc0XDBcMTcwXDBcMjY0XDBcMzYwXDBcdTAxMmNcMFx1MDE2OFwwXHUwMWE0IisKLSAgICAiXDBcdTAxZTBcMFx1MDIxY1wwXHUwMjU4XDBcdTAyOTRcMFx1MDJkMFwwXHUwMzBjXDBcdTAzNDhcMFx1MDM4NCIrCi0gICAgIlwwXHUwM2MwXDBcdTAzZmNcMFx1MDQzOFwwXHUwNDc0XDBcdTA0YjBcMFx1MDRlY1wwXHUwNTI4XDBcdTA1NjQiKwotICAgICJcMFx1MDVhMFwwXHUwNWRjXDBcdTA2MThcMFx1MDY1NFwwXHUwNjkwXDBcdTA2Y2NcMFx1MDcwOFwwXHUwNzQ0IisKLSAgICAiXDBcdTA3ODBcMFx1MDVhMFwwXHUwN2JjXDBcdTA3ZjhcMFx1MDVhMFwwXHUwODM0XDBcdTA1YTBcMFx1MDg3MCIrCi0gICAgIlwwXHUwOGFjXDBcdTA4ZThcMFx1MDkyNFwwXHUwNWEwXDBcdTA5NjBcMFx1MDk5Y1wwXHUwOWQ4XDBcdTBhMTQiKwotICAgICJcMFx1MGE1MFwwXHUwYThjXDBcdTA1YTBcMFx1MGFjOFwwXHUwYjA0XDBcdTBiNDBcMFx1MDVhMFwwXHUwNWEwIisKLSAgICAiXDBcdTBiN2NcMFx1MGJiOFwwXHUwYmY0XDBcdTA1YTBcMFx1MGMzMFwwXHUwYzZjXDBcdTA1YTBcMFx1MDVhMCIrCi0gICAgIlwwXHUwY2E4XDBcdTBjZTRcMFx1MGQyMFwwXHUwNWEwXDBcdTBkNWNcMFx1MDVhMFwwXHUwZDk4XDBcdTBkZDQiKwotICAgICJcMFx1MGUxMFwwXHUwZTRjXDBcdTBlODhcMFx1MGVjNFwwXHUwZjAwXDBcdTBmM2NcMFx1MDVhMFwwXHUwNWEwIisKLSAgICAiXDBcdTBmNzhcMFx1MGZiNFwwXHUwZmYwXDBcdTEwMmNcMFx1MTA2OFwwXHUwNWEwXDBcdTEwYTRcMFx1MTBlMCIrCi0gICAgIlwwXHUxMTFjXDBcdTExNThcMFx1MTE5NFwwXHUxMWQwXDBcdTA3ZjhcMFx1MDVhMFwwXHUxMjBjXDBcdTEyNDgiKwotICAgICJcMFx1MTI4NFwwXHUwN2JjXDBcdTA1YTBcMFx1MDVhMFwwXHUwNWEwXDBcdTEyYzBcMFx1MDYxOFwwXHUxMmZjIisKLSAgICAiXDBcdTEzMzhcMFx1MDZjY1wwXHUxMzc0XDBcdTA3MDhcMFx1MTNiMFwwXHUxM2VjXDBcdTE0MjhcMFx1MTQ2NCIrCi0gICAgIlwwXHUwNzgwXDBcdTA1YTBcMFx1MTRhMFwwXHUxNGRjXDBcdTE1MThcMFx1MTU1NFwwXHUxNTkwXDBcdTE1Y2MiKwotICAgICJcMFx1MTYwOFwwXHUxNjQ0XDBcdTA4NzBcMFx1MTY4MFwwXHUwNWEwXDBcdTA4YWNcMFx1MTZiY1wwXHUxNmY4IisKLSAgICAiXDBcdTA5NjBcMFx1MTczNFwwXHUwNWEwXDBcdTA5OWNcMFx1MTc3MFwwXHUxN2FjXDBcdTBhNTBcMFx1MTdlOCIrCi0gICAgIlwwXHUxODI0XDBcdTBiMDRcMFx1MTg2MFwwXHUxODljXDBcdTBiYjhcMFx1MThkOFwwXHUxOTE0XDBcdTA1YTAiKwotICAgICJcMFx1MGNlNFwwXHUxOTUwXDBcdTE5OGNcMFx1MGRkNFwwXHUxOWM4XDBcdTBlMTBcMFx1MWEwNFwwXHUwNWEwIisKLSAgICAiXDBcdTBlNGNcMFx1MWE0MFwwXHUxYTdjXDBcdTBmMDBcMFx1MWFiOFwwXHUxYWY0XDBcdTFiMzBcMFx1MWI2YyIrCi0gICAgIlwwXHUxMTFjXDBcdTA1YTBcMFx1MGZmMFwwXHUwNWEwXDBcdTFiYThcMFx1MTAyY1wwXHUxYmU0XDBcdTA1YTAiKwotICAgICJcMFx1MTA2OFwwXHUxYzIwXDBcdTFjNWNcMFx1MWM5OFwwXHUxY2Q0XDBcdTExNThcMFx1MWQxMFwwXHUxZDRjIisKLSAgICAiXDBcdTFkODhcMFx1MTFkMFwwXHUxZGM0XDBcdTA1YTBcMFx1MTZmOFwwXHUxMjg0XDBcdTA1YTBcMFx1MWUwMCIrCi0gICAgIlwwXHUxZTNjXDBcdTA1YTBcMFx1MWU3OFwwXHUxZWI0XDBcdTFlZjBcMFx1MWYyY1wwXHUxZjY4XDBcdTFmYTQiKwotICAgICJcMFx1MWZlMFwwXHUyMDFjXDBcdTIwNThcMFx1MjA5NFwwXHUyMGQwXDBcdTIxMGNcMFx1MDg3MFwwXHUyMTQ4IisKLSAgICAiXDBcdTIxODRcMFx1MDhhY1wwXHUyMWMwXDBcdTIxZmNcMFx1MDk2MFwwXHUyMjM4XDBcdTIyNzRcMFx1MDk5YyIrCi0gICAgIlwwXHUyMmIwXDBcdTIyZWNcMFx1MjMyOFwwXHUyMzY0XDBcdTIzYTBcMFx1MjNkY1wwXHUyNDE4XDBcdTI0NTQiKwotICAgICJcMFx1MGUxMFwwXHUyNDkwXDBcdTI0Y2NcMFx1MGU0Y1wwXHUyNTA4XDBcdTI1NDRcMFx1MjU4MFwwXHUyNWJjIisKLSAgICAiXDBcdTI1ZjhcMFx1MTAyY1wwXHUyNjM0XDBcdTI2NzBcMFx1MTA2OFwwXHUyNmFjXDBcdTI2ZThcMFx1MjcyNCIrCi0gICAgIlwwXHUyNzYwXDBcdTI3OWNcMFx1MjdkOFwwXHUyODE0XDBcdTI4NTBcMFx1Mjg4Y1wwXHUyOGM4XDBcdTA1YTAiKwotICAgICJcMFx1MjkwNFwwXHUyOTQwXDBcdTI5N2NcMFx1MjliOFwwXHUyOWY0XDBcdTA1YTBcMFx1MmEzMFwwXHUyYTZjIisKLSAgICAiXDBcdTJhYThcMFx1MmFlNFwwXHUyYjIwXDBcdTJiNWNcMFx1MmI5OFwwXHUyYmQ0XDBcdTJjMTBcMFx1MmM0YyIrCi0gICAgIlwwXHUyYzg4XDBcdTJjYzRcMFx1MmQwMFwwXHUyZDNjXDBcdTJkNzhcMFx1MmRiNFwwXHUyZGYwXDBcdTJlMmMiKwotICAgICJcMFx1MmU2OFwwXHUyZWE0XDBcdTJlZTBcMFx1MmYxY1wwXHUyZjU4XDBcdTJmOTRcMFx1MmZkMFwwXHUwNWEwIisKLSAgICAiXDBcdTMwMGNcMFx1MzA0OFwwXHUzMDg0XDBcdTMwYzBcMFx1MzBmY1wwXHUzMTM4XDBcdTA1YTBcMFx1MzE3NCIrCi0gICAgIlwwXHUzMWIwXDBcdTA1YTBcMFx1MzFlY1wwXHUzMjI4XDBcdTMyNjRcMFx1MzJhMFwwXHUzMmRjXDBcdTMzMTgiKwotICAgICJcMFx1MzM1NFwwXHUzMzkwXDBcdTMzY2NcMFx1MzQwOFwwXHUwNWEwXDBcdTM0NDRcMFx1MzQ4MFwwXHUzNGJjIisKLSAgICAiXDBcdTM0ZjhcMFx1MzUzNFwwXHUzNTcwXDBcdTM1YWNcMFx1MzVlOFwwXHUzNjI0XDBcdTM2NjBcMFx1MzY5YyIrCi0gICAgIlwwXHUzNmQ4XDBcdTM3MTRcMFx1Mzc1MFwwXHUzNzhjXDBcdTM3YzhcMFx1MzgwNFwwXHUyZjk0XDBcdTM4NDAiKwotICAgICJcMFx1Mzg3Y1wwXHUwNWEwXDBcdTM4YjhcMFx1MzhmNFwwXHUzOTMwXDBcdTM5NmNcMFx1MzlhOFwwXHUzOWU0IisKLSAgICAiXDBcdTA1YTBcMFx1M2EyMFwwXHUzYTVjXDBcdTNhOThcMFx1M2FkNFwwXHUzYjEwXDBcdTNiNGNcMFx1M2I4OCIrCi0gICAgIlwwXHUzYmM0XDBcdTNjMDBcMFx1MzM1NFwwXHUzYzNjXDBcdTNjNzhcMFx1M2NiNFwwXHUzY2YwXDBcdTNkMmMiKwotICAgICJcMFx1M2Q2OFwwXHUzZGE0XDBcdTNkZTBcMFx1M2UxY1wwXHUzZTU4XDBcdTNlOTRcMFx1M2VkMFwwXHUzZjBjIisKLSAgICAiXDBcdTNmNDhcMFx1M2Y4NFwwXHUzZmMwXDBcdTNmZmNcMFx1NDAzOFwwXHU0MDc0XDBcdTM3YzhcMFx1NDBiMCIrCi0gICAgIlwwXHU0MGVjXDBcdTQxMjhcMFx1NDE2NFwwXHU0MWEwXDBcdTQxZGNcMFx1NDIxOFwwXHUwNWEwXDBcdTQyNTQiKwotICAgICJcMFx1NDI5MFwwXHU0MmNjXDBcdTQzMDhcMFx1NDM0NFwwXHU0MzgwXDBcdTQzYmNcMFx1NDNmOFwwXHU0NDM0IisKLSAgICAiXDBcdTQ0NzBcMFx1NDRhY1wwXHU0NGU4XDBcdTQ1MjRcMFx1NDU2MFwwXHU0NTljXDBcdTQ1ZDhcMFx1NDYxNCIrCi0gICAgIlwwXHU0NjUwXDBcdTQ2OGNcMFx1NDZjOFwwXHU0NzA0XDBcdTQ3NDBcMFx1NDc3Y1wwXHU0N2I4XDBcdTQ3ZjQiKwotICAgICJcMFx1NDgzMFwwXHU0ODZjXDBcdTQ4YThcMFx1NDhlNFwwXHU0OTIwXDBcdTQ5NWNcMFx1NDk5OFwwXHU0OWQ0IisKLSAgICAiXDBcdTRhMTBcMFx1NGE0Y1wwXHU0YTg4XDBcdTRhYzRcMFx1NGIwMFwwXHU0YjNjXDBcdTA1YTBcMFx1NGI3OCIrCi0gICAgIlwwXHU0YmI0XDBcdTRiZjBcMFx1NGMyY1wwXHU0YzY4XDBcdTRjYTRcMFx1NGNlMFwwXHU0ZDFjXDBcdTRkNTgiKwotICAgICJcMFx1MzNjY1wwXHU0ZDk0XDBcdTM0MDhcMFx1NGRkMFwwXHU0ZTBjXDBcdTRlNDhcMFx1NGU4NFwwXHU0ZWMwIisKLSAgICAiXDBcdTRlZmNcMFx1NGYzOFwwXHU0Zjc0XDBcdTRmYjBcMFx1NGZlY1wwXHUzODQwXDBcdTUwMjhcMFx1Mzg3YyIrCi0gICAgIlwwXHU1MDY0XDBcdTUwYTBcMFx1NTBkY1wwXHU1MTE4XDBcdTUxNTRcMFx1NTE5MFwwXHU1MWNjXDBcdTUyMDgiKwotICAgICJcMFx1NTI0NFwwXHU1MjgwXDBcdTUyYmNcMFx1MDVhMFwwXHU1MmY4XDBcdTUzMzRcMFx1NTM3MFwwXHU1M2FjIisKLSAgICAiXDBcdTA1YTBcMFx1NTNlOFwwXHU1NDI0XDBcdTU0NjBcMFx1MDVhMFwwXHU1NDljXDBcdTU0ZDhcMFx1NTUxNCIrCi0gICAgIlwwXHU1NTUwXDBcdTU1OGNcMFx1NTVjOFwwXHU1NjA0XDBcdTU2NDBcMFx1NTY3Y1wwXHU1NmI4IjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tSb3dNYXAoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNDU1XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja1Jvd01hcChaWl9ST1dNQVBfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrUm93TWFwKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBoaWdoID0gcGFja2VkLmNoYXJBdChpKyspIDw8IDE2OwotICAgICAgcmVzdWx0W2orK10gPSBoaWdoIHwgcGFja2VkLmNoYXJBdChpKyspOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX1RSQU5TID0genpVbnBhY2tUcmFucygpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9UUkFOU19QQUNLRURfMCA9Ci0gICAgIlwyXDMxXDFcMzJcMVwzM1wxXDM0XDFcMzFcMVwzNFwxXDMyXDFcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcMzVcMVwzMVwxXDM2XDFcMzFcMlwzNFwxXDMxIisKLSAgICAiXDFcMzdcM1wzMlwxXDMxXDFcMzJcMVw0MFwyXDMxXDFcNDFcMVwzMSIrCi0gICAgIlwxXDQyXDFcNDNcMlwzMVwxXDQ0XDFcNDVcMTFcMzJcMVwzMVw0XDMyIisKLSAgICAiXDFcMzFcM1wzMlwxXDQ2XDNcMzJcMVw0N1w2XDMxXDFcMzRcMVw1MCIrCi0gICAgIlwxXDM0XDFcMzFcMVw1MVwxXDM0XDFcMzFcMVw1MlwzXDMxXDJcMzQiKwotICAgICJcN1wzMVwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NFwzNlwzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDUyXDNcMzEiKwotICAgICJcMlwzNFw3XDMxXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0IisKLSAgICAiXDEyXDMxXDFcNTRcMjNcMzFcMVwzNFwxXDU1XDFcMzRcMVwzMVwxXDU2IisKLSAgICAiXDFcMzRcMVwzMVwxXDUyXDNcMzFcMlwzNFwyXDMxXDFcNTdcNFwzMSIrCi0gICAgIlwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NFwxMlwzMVwxXDU0IisKLSAgICAiXDIxXDMxXDFcNjBcMVw2MVwxXDM0XDFcMzFcMVwzNFwxXDYwXDFcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcNjJcM1wzMVwyXDM0XDJcMzFcM1w2MFwxXDMxIisKLSAgICAiXDFcNjBcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMVwzMSIrCi0gICAgIlwxMVw2MFwxXDU0XDRcNjBcMVwzMVwzXDYwXDFcMzFcM1w2MFw3XDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNFwxXDMxXDFcNTJcM1wzMSIrCi0gICAgIlwyXDM0XDdcMzFcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDQiKwotICAgICJcMTJcMzFcMVw1NFw0XDMxXDFcNjNcMTRcMzFcMVw2NFwxXDY1XDFcMzQiKwotICAgICJcMVwzMVwxXDM0XDFcNjRcMVwzMVwxXDM0XDFcMzFcMVw2NlwzXDMxIisKLSAgICAiXDJcMzRcMlwzMVwzXDY0XDFcMzFcMVw2NFwxXDUzXDRcMzFcMVw0MiIrCi0gICAgIlwxXDQzXDJcMzFcMVw0NFwxXDMxXDExXDY0XDFcMzFcNFw2NFwxXDMxIisKLSAgICAiXDNcNjRcMVwzMVwzXDY0XDdcMzFcMVwzNFwxXDMxXDFcMzRcMlwzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVw1MlwzXDMxXDJcMzRcN1wzMVwxXDUzXDNcMzEiKwotICAgICJcMVw2N1wxXDQyXDFcNDNcMlwzMVwxXDQ0XDE3XDMxXDFcNzBcMTRcMzEiKwotICAgICJcMVw3MVwxXDcyXDFcMzRcMVwzMVwxXDM0XDFcNzFcMVwzMVwxXDM0IisKLSAgICAiXDFcMzFcMVw3M1wzXDMxXDJcMzRcMlwzMVwzXDcxXDFcMzFcMVw3MSIrCi0gICAgIlwxXDUzXDNcMzFcMVw3NFwxXDQyXDFcNDNcMlwzMVwxXDQ0XDFcMzEiKwotICAgICJcMTFcNzFcMVwzMVw0XDcxXDFcMzFcM1w3MVwxXDc1XDNcNzFcN1wzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDUyXDNcMzEiKwotICAgICJcMlwzNFw3XDMxXDFcNTNcM1wzMVwxXDc0XDFcNDJcMVw0M1wyXDMxIisKLSAgICAiXDFcNDRcMzRcMzFcMVwzMlwxXDMzXDFcMzRcMVwzMVwxXDM0XDFcMzIiKwotICAgICJcMVwzMVwxXDM0XDFcMzFcMVwzNVwxXDMxXDFcMzZcMVwzMVwyXDM0IisKLSAgICAiXDFcMzFcMVwzN1wzXDMyXDFcMzFcMVwzMlwxXDUzXDRcMzFcMVw0MiIrCi0gICAgIlwxXDQzXDJcMzFcMVw0NFwxXDQ1XDExXDMyXDFcMzFcNFwzMlwxXDMxIisKLSAgICAiXDNcMzJcMVw0NlwzXDMyXDFcNDdcNlwzMVwxXDc2XDFcMzFcMVw3NiIrCi0gICAgIlwyXDMxXDFcNzZcMVwzMVwxXDUyXDFcNzdcMVwzNlwxXDMxXDJcNzYiKwotICAgICJcMVwzMVwxXDM3XDVcMzFcMVw1M1wxXDMxXDFcNzdcMVwzMVwxXDc0IisKLSAgICAiXDFcNDJcMVw0M1wyXDMxXDFcNDRcMVw0NVwxNlwzMVwxXDEwMFwzXDMxIisKLSAgICAiXDFcNDZcM1wzMVwxXDQ3XDRcMzFcMVwxMDFcMVwxMDJcMVwzNFwxXDMxIisKLSAgICAiXDFcMzRcMVwxMDFcMVwzMVwxXDM0XDFcMzFcMVwxMDNcM1wzMVwyXDM0IisKLSAgICAiXDJcMzFcM1wxMDFcMVwzMVwxXDEwMVwxXDUzXDRcMzFcMVw0MlwxXDQzIisKLSAgICAiXDJcMzFcMVw0NFwxXDMxXDExXDEwMVwxXDMxXDRcMTAxXDFcMzFcM1wxMDEiKwotICAgICJcMVwzMVwzXDEwMVw3XDMxXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNCIrCi0gICAgIlwxXDMxXDFcNTJcM1wzMVwyXDM0XDdcMzFcMVw1M1w0XDMxXDFcNDIiKwotICAgICJcMVw0M1wxXDEwNFwxXDMxXDFcNDRcMzBcMzFcMVwxMDVcMVwxMDZcMlwzMSIrCi0gICAgIlwxXDEwN1wxXDExMFwxXDM0XDFcMTExXDFcMzRcMVwxMDdcMVwxMTJcMVwzNCIrCi0gICAgIlwxXDMxXDFcMTEzXDNcMzFcMlwzNFwyXDMxXDNcMTA3XDFcMzFcMVwxMDciKwotICAgICJcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMVwzMVwxMVwxMDciKwotICAgICJcMVwzMVw0XDEwN1wxXDMxXDNcMTA3XDFcMzFcM1wxMDdcN1wzMVwxXDM0IisKLSAgICAiXDFcMzFcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDUyXDNcMzFcMlwzNCIrCi0gICAgIlw3XDMxXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0XDMxXDMxIisKLSAgICAiXDFcMTA2XDJcMzFcMVwxMTRcMVwxMTVcMVwzNFwxXDMxXDFcMzRcMVwxMTQiKwotICAgICJcMVwzMVwxXDM0XDFcMzFcMVwxMTZcM1wzMVwyXDM0XDJcMzFcM1wxMTQiKwotICAgICJcMVwzMVwxXDExNFwxXDQwXDJcMzFcMVw0MVwxXDMxXDFcNDJcMVw0MyIrCi0gICAgIlwyXDMxXDFcNDRcMVwzMVwxMVwxMTRcMVwxMTdcNFwxMTRcMVwzMVwzXDExNCIrCi0gICAgIlwxXDMxXDNcMTE0XDdcMzFcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0IisKLSAgICAiXDFcMzFcMVw1MlwzXDMxXDJcMzRcN1wzMVwxXDQwXDJcMzFcMVw0MSIrCi0gICAgIlwxXDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMTJcMzFcMVwxMTdcMTBcMzEiKwotICAgICJcMVwxMjBcN1wzMVwxXDEyMVwxXDEyMlwxXDEyM1wxXDM0XDFcMTI0XDFcMzQiKwotICAgICJcMVwxMjJcMVwxMjVcMVwzNFwxXDEyNlwxXDEyN1wxXDEzMFwxXDEzMVwxXDMxIisKLSAgICAiXDJcMzRcMVwzMVwxXDEzMlwxXDEzM1wyXDEyMlwxXDMxXDFcMTIyXDFcNDAiKwotICAgICJcMlwzMVwxXDQxXDFcMzFcMVw0MlwxXDQzXDFcMzFcMVwxMzRcMVwxMzUiKwotICAgICJcMVwzMVwxMVwxMjJcMVwxMTdcNFwxMjJcMVwxMzZcM1wxMjJcMVwzMVwzXDEyMiIrCi0gICAgIlw0XDMxXDFcMTIxXDFcMTIyXDFcMTIzXDFcMTM3XDFcMTI0XDFcMTM3XDFcMTIyIisKLSAgICAiXDFcMTI1XDFcMTM3XDFcMTI2XDFcMTI3XDFcMTMwXDFcMTMxXDFcMzFcMlwxMzciKwotICAgICJcMVwzMVwxXDEzMlwxXDEzM1wyXDEyMlwxXDMxXDFcMTIyXDFcNDBcMlwzMSIrCi0gICAgIlwxXDQxXDFcMzFcMVw0MlwxXDQzXDFcMzFcMVwxMzRcMVwxMzVcMVwzMSIrCi0gICAgIlwxMVwxMjJcMVwxMTdcNFwxMjJcMVwxMzZcM1wxMjJcMVwzMVwzXDEyMlw3XDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNFwxXDMxXDFcMTQwXDNcMzEiKwotICAgICJcMlwzNFw3XDMxXDFcNTNcMVwxNDFcM1wzMVwxXDQyXDFcMTQyXDFcMTQzIisKLSAgICAiXDFcMTQ0XDFcNDRcMzZcMzFcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0IisKLSAgICAiXDFcMzFcMVw1MlwzXDMxXDJcMzRcN1wzMVwxXDUzXDFcMTQxXDNcMzEiKwotICAgICJcMVw0MlwxXDQzXDJcMzFcMVw0NFwzNlwzMVwxXDM0XDFcMzFcMVwzNCIrCi0gICAgIlwyXDMxXDFcMzRcMVwzMVwxXDUyXDNcMzFcMlwzNFw3XDMxXDFcNTMiKwotICAgICJcNFwzMVwxXDE0NVwxXDQzXDJcMzFcMVw0NFwzNlwzMVwxXDM0XDFcMzEiKwotICAgICJcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDE0NlwzXDMxXDJcMzRcN1wzMSIrCi0gICAgIlwxXDUzXDVcMzFcMVw0M1wyXDMxXDFcNDRcMzJcMzFcNzVcMFwyXDMyIisKLSAgICAiXDFcMTQ3XDNcMFwxXDMyXDNcMFwxXDMyXDdcMFwzXDMyXDFcMCIrCi0gICAgIlwxXDMyXDEzXDBcMTFcMzJcMVwwXDRcMzJcMVwwXDNcMzJcMVwwIisKLSAgICAiXDNcMzJcNFwwXDFcMTUwXDJcMzJcMVwwXDJcMzJcMVwxNTBcMVwzMiIrCi0gICAgIlwxXDBcNVwzMlwyXDBcMjJcMzJcMVwxNTBcMlwzMlwxXDE1MFwyXDMyIisKLSAgICAiXDFcMTUwXDEwXDMyXDFcMTUwXDNcMzJcMVwxNTBcNVwzMlw0XDBcMVwzNCIrCi0gICAgIlwxXDBcMVwzNFwyXDBcMVwzNFw1XDBcMlwzNFw1NFwwXDJcMzIiKwotICAgICJcMVwxNDdcM1wwXDFcMzJcM1wwXDFcMTUxXDdcMFwzXDMyXDFcMCIrCi0gICAgIlwxXDMyXDEzXDBcMTFcMzJcMVwwXDRcMzJcMVwwXDNcMzJcMVwwIisKLSAgICAiXDNcMzJcNFwwXDJcMTUyXDFcMTUzXDNcMFwxXDE1MlwzXDBcMVwxNTIiKwotICAgICJcN1wwXDNcMTUyXDFcMFwxXDE1MlwxM1wwXDExXDE1MlwxXDBcNFwxNTIiKwotICAgICJcMVwwXDNcMTUyXDFcMFwzXDE1Mlw0XDBcMlwxNTRcMVwxNTVcM1wwIisKLSAgICAiXDFcMTU0XDNcMFwxXDE1NFw3XDBcM1wxNTRcMVwwXDFcMTU0XDEzXDAiKwotICAgICJcMTFcMTU0XDFcMFw0XDE1NFwxXDBcM1wxNTRcMVwwXDNcMTU0XDExXDAiKwotICAgICJcMVwxNTZcMlwwXDFcMTU2XDVcMFwyXDE1NlwxMFwwXDFcMTU3XDZcMCIrCi0gICAgIlwxXDE2MFw0MVwwXDFcMTYxXDJcMFwxXDE2MVw1XDBcMlwxNjFcMTNcMCIrCi0gICAgIlwxXDE2MlwxMDJcMFwyXDE2M1wxMFwwXDFcMTY0XDFcMTY1XDFcMTY2XDZcMCIrCi0gICAgIlwyXDE2N1w0NlwwXDFcMTcwXDMzXDBcMVwxNzFcMVwxNzJcM1wwXDFcMTcxIisKLSAgICAiXDNcMFwxXDE3MVw3XDBcM1wxNzFcMVwwXDFcMTcxXDEzXDBcMTFcMTcxIisKLSAgICAiXDFcMFw0XDE3MVwxXDBcM1wxNzFcMVwwXDNcMTcxXDRcMFwyXDE3MyIrCi0gICAgIlwxXDE3NFwxXDBcMVwxNzVcMTFcMTczXDJcMFw1M1wxNzNcMVwwXDJcMTc2IisKLSAgICAiXDFcMTc3XDFcMFwzXDE3NlwxXDE3NVw2XDE3NlwyXDBcNTNcMTc2XDEzXDAiKwotICAgICJcMVwyMDBcMTIwXDBcMVwxNjBcMzRcMFwyXDIwMVwxXDIwMlwxXDBcMVwyMDMiKwotICAgICJcMTFcMjAxXDJcMFw1M1wyMDFcMVwwXDJcMjA0XDFcMjA1XDFcMFwzXDIwNCIrCi0gICAgIlwxXDIwM1w2XDIwNFwyXDBcNTNcMjA0XDI0XDBcMVwyMDZcNTBcMFwyXDYwIisKLSAgICAiXDFcMjA3XDNcMFwxXDYwXDNcMFwxXDYwXDdcMFwzXDYwXDFcMCIrCi0gICAgIlwxXDYwXDEzXDBcMTFcNjBcMVwwXDRcNjBcMVwwXDNcNjBcMVwwIisKLSAgICAiXDNcNjBcNFwwXDFcMjEwXDJcNjBcMVwwXDJcNjBcMVwyMTBcMVw2MCIrCi0gICAgIlwxXDBcNVw2MFwyXDBcMjJcNjBcMVwyMTBcMlw2MFwxXDIxMFwyXDYwIisKLSAgICAiXDFcMjEwXDEwXDYwXDFcMjEwXDNcNjBcMVwyMTBcNVw2MFwxXDBcMlw2MCIrCi0gICAgIlwxXDIwN1wzXDBcMVw2MFwzXDBcMVwyMTFcN1wwXDNcNjBcMVwwIisKLSAgICAiXDFcNjBcMTNcMFwxMVw2MFwxXDBcNFw2MFwxXDBcM1w2MFwxXDAiKwotICAgICJcM1w2MFw0XDBcMlw2NFwxXDIxMlwzXDBcMVw2NFwzXDBcMVw2NCIrCi0gICAgIlw3XDBcM1w2NFwxXDBcMVw2NFwxM1wwXDExXDY0XDFcMFw0XDY0IisKLSAgICAiXDFcMFwzXDY0XDFcMFwzXDY0XDRcMFwxXDIxM1wyXDY0XDFcMCIrCi0gICAgIlwyXDY0XDFcMjEzXDFcNjRcMVwwXDVcNjRcMlwwXDIyXDY0XDFcMjEzIisKLSAgICAiXDJcNjRcMVwyMTNcMlw2NFwxXDIxM1wxMFw2NFwxXDIxM1wzXDY0XDFcMjEzIisKLSAgICAiXDVcNjRcMVwwXDJcNjRcMVwyMTJcM1wwXDFcNjRcM1wwXDFcMjE0IisKLSAgICAiXDdcMFwzXDY0XDFcMFwxXDY0XDEzXDBcMTFcNjRcMVwwXDRcNjQiKwotICAgICJcMVwwXDNcNjRcMVwwXDNcNjRcNFwwXDJcNzFcMVwyMTVcM1wwIisKLSAgICAiXDFcNzFcM1wwXDFcNzFcN1wwXDNcNzFcMVwwXDFcNzFcMTNcMCIrCi0gICAgIlwxMVw3MVwxXDBcNFw3MVwxXDBcM1w3MVwxXDBcM1w3MVw0XDAiKwotICAgICJcMVwyMTZcMlw3MVwxXDBcMlw3MVwxXDIxNlwxXDcxXDFcMFw1XDcxIisKLSAgICAiXDJcMFwyMlw3MVwxXDIxNlwyXDcxXDFcMjE2XDJcNzFcMVwyMTZcMTBcNzEiKwotICAgICJcMVwyMTZcM1w3MVwxXDIxNlw1XDcxXDFcMFwyXDcxXDFcMjE1XDNcMCIrCi0gICAgIlwxXDcxXDNcMFwxXDIxN1w3XDBcM1w3MVwxXDBcMVw3MVwxM1wwIisKLSAgICAiXDExXDcxXDFcMFw0XDcxXDFcMFwzXDcxXDFcMFwzXDcxXDVcMCIrCi0gICAgIlwxXDcxXDFcMjE1XDNcMFwxXDcxXDNcMFwxXDcxXDdcMFwzXDcxIisKLSAgICAiXDFcMFwxXDcxXDEzXDBcMTFcNzFcMVwwXDRcNzFcMVwwXDNcNzEiKwotICAgICJcMVwwXDNcNzFcM1wwXDRcMjIwXDFcNzZcMVwyMjBcMVw3NlwyXDIyMCIrCi0gICAgIlwxXDc2XDJcMjIwXDFcMFwyXDIyMFwyXDc2XDExXDIyMFwxXDBcMVwyMjAiKwotICAgICJcMVwwXDM3XDIyMFwxXDBcMlwxMDFcMVwyMjFcM1wwXDFcMTAxXDNcMCIrCi0gICAgIlwxXDEwMVw3XDBcM1wxMDFcMVwwXDFcMTAxXDEzXDBcMTFcMTAxXDFcMCIrCi0gICAgIlw0XDEwMVwxXDBcM1wxMDFcMVwwXDNcMTAxXDRcMFwxXDIyMlwyXDEwMSIrCi0gICAgIlwxXDBcMlwxMDFcMVwyMjJcMVwxMDFcMVwwXDVcMTAxXDJcMFwyMlwxMDEiKwotICAgICJcMVwyMjJcMlwxMDFcMVwyMjJcMlwxMDFcMVwyMjJcMTBcMTAxXDFcMjIyXDNcMTAxIisKLSAgICAiXDFcMjIyXDVcMTAxXDFcMFwyXDEwMVwxXDIyMVwzXDBcMVwxMDFcM1wwIisKLSAgICAiXDFcMjIzXDdcMFwzXDEwMVwxXDBcMVwxMDFcMTNcMFwxMVwxMDFcMVwwIisKLSAgICAiXDRcMTAxXDFcMFwzXDEwMVwxXDBcM1wxMDFcNDJcMFwxXDEwNFwzNVwwIisKLSAgICAiXDJcMTA3XDFcMjI0XDNcMFwxXDEwN1wzXDBcMVwxMDdcN1wwXDNcMTA3IisKLSAgICAiXDFcMFwxXDEwN1wxM1wwXDExXDEwN1wxXDBcNFwxMDdcMVwwXDNcMTA3IisKLSAgICAiXDFcMFwzXDEwN1w0XDBcMVwyMjVcMlwxMDdcMVwwXDJcMTA3XDFcMjI1IisKLSAgICAiXDFcMTA3XDFcMFw1XDEwN1wyXDBcMjJcMTA3XDFcMjI1XDJcMTA3XDFcMjI1IisKLSAgICAiXDJcMTA3XDFcMjI1XDEwXDEwN1wxXDIyNVwzXDEwN1wxXDIyNVw1XDEwN1wxXDAiKwotICAgICJcMlwyMjZcMVwyMjdcMVwwXDFcMjMwXDExXDIyNlwyXDBcNTNcMjI2XDFcMCIrCi0gICAgIlwyXDIzMVwxXDIzMlwxXDBcM1wyMzFcMVwyMzBcNlwyMzFcMlwwXDUzXDIzMSIrCi0gICAgIlwxXDBcMlwxMDdcMVwyMjRcM1wwXDFcMTA3XDNcMFwxXDIzM1w3XDAiKwotICAgICJcM1wxMDdcMVwwXDFcMTA3XDEzXDBcMTFcMTA3XDFcMFw0XDEwN1wxXDAiKwotICAgICJcM1wxMDdcMVwwXDNcMTA3XDRcMFwyXDExNFwxXDIzNFwzXDBcMVwxMTQiKwotICAgICJcM1wwXDFcMTE0XDdcMFwzXDExNFwxXDBcMVwxMTRcMTNcMFwxMVwxMTQiKwotICAgICJcMVwwXDRcMTE0XDFcMFwzXDExNFwxXDBcM1wxMTRcNFwwXDFcMjM1IisKLSAgICAiXDJcMTE0XDFcMFwyXDExNFwxXDIzNVwxXDExNFwxXDBcNVwxMTRcMlwwIisKLSAgICAiXDIyXDExNFwxXDIzNVwyXDExNFwxXDIzNVwyXDExNFwxXDIzNVwxMFwxMTRcMVwyMzUiKwotICAgICJcM1wxMTRcMVwyMzVcNVwxMTRcMVwwXDJcMTE0XDFcMjM0XDNcMFwxXDExNCIrCi0gICAgIlwzXDBcMVwyMzZcN1wwXDNcMTE0XDFcMFwxXDExNFwxM1wwXDExXDExNCIrCi0gICAgIlwxXDBcNFwxMTRcMVwwXDNcMTE0XDFcMFwzXDExNFw0XDBcMVwxMjEiKwotICAgICJcMVwyMzdcMVwyNDBcM1wwXDFcMjM3XDNcMFwxXDIzN1wxXDBcMVwyNDEiKwotICAgICJcNVwwXDNcMjM3XDFcMFwxXDIzN1wxXDBcMVwyNDJcMTFcMFwxMVwyMzciKwotICAgICJcMVwwXDRcMjM3XDFcMFwzXDIzN1wxXDBcM1wyMzdcNFwwXDJcMTIyIisKLSAgICAiXDFcMjQzXDNcMFwxXDEyMlwzXDBcMVwxMjJcN1wwXDNcMTIyXDFcMjQ0IisKLSAgICAiXDFcMTIyXDEzXDBcMTFcMTIyXDFcMFw0XDEyMlwxXDBcM1wxMjJcMVwwIisKLSAgICAiXDNcMTIyXDRcMFwxXDI0NVwyXDEyMlwxXDBcMlwxMjJcMVwyNDVcMVwxMjIiKwotICAgICJcMVwwXDVcMTIyXDJcMFwyMlwxMjJcMVwyNDVcMlwxMjJcMVwyNDVcMlwxMjIiKwotICAgICJcMVwyNDVcMTBcMTIyXDFcMjQ1XDNcMTIyXDFcMjQ1XDVcMTIyXDFcMFwyXDI0NiIrCi0gICAgIlwxXDI0N1wxXDBcMVwyNTBcMTFcMjQ2XDJcMFw1M1wyNDZcMVwwXDJcMjUxIisKLSAgICAiXDFcMjUyXDFcMFwzXDI1MVwxXDI1MFw2XDI1MVwyXDBcNTNcMjUxXDFcMCIrCi0gICAgIlwxXDI1M1wxXDEyMlwxXDI0M1wzXDBcMVwxMjJcM1wwXDFcMjU0XDFcMCIrCi0gICAgIlwxXDI0MVw1XDBcM1wxMjJcMVwyNDRcMVwxMjJcMTNcMFwxMVwxMjJcMVwwIisKLSAgICAiXDRcMTIyXDFcMFwzXDEyMlwxXDBcM1wxMjJcNFwwXDFcMTIxXDEzXDAiKwotICAgICJcMVwyNDFcNTdcMFwxXDI1NVw3M1wwXDJcMjU2XDFcMjU3XDNcMFwxXDI1NiIrCi0gICAgIlwzXDBcMVwyNTZcN1wwXDNcMjU2XDFcMFwxXDI1NlwxM1wwXDExXDI1NiIrCi0gICAgIlwxXDBcNFwyNTZcMVwwXDNcMjU2XDFcMFwzXDI1Nlw0XDBcMlwxMjIiKwotICAgICJcMVwyNDNcM1wwXDFcMTIyXDNcMFwxXDEyMlwxXDI2MFw2XDBcMVwxMjIiKwotICAgICJcMVwyNjFcMVwxMjJcMVwyNDRcMVwxMjJcMTNcMFwxMVwxMjJcMVwwXDRcMTIyIisKLSAgICAiXDFcMFwzXDEyMlwxXDBcM1wxMjJcN1wwXDFcMjYyXDFcMFwxXDI2MiIrCi0gICAgIlwyXDBcMVwyNjJcNVwwXDJcMjYyXDM0XDBcMVwyNjNcMTZcMFw0XDI2NCIrCi0gICAgIlwxXDEzN1wxXDI2NFwxXDEzN1wyXDI2NFwxXDEzN1w1XDI2NFwyXDEzN1wxNFwyNjQiKwotICAgICJcMVwwXDE2XDI2NFwxXDBcMTdcMjY0XDEzXDBcMVwyNjVcNjZcMFwxXDI2NiIrCi0gICAgIlwyXDBcMVwyNjZcNVwwXDJcMjY2XDExXDBcMVwyNjdcNTRcMFwxXDI3MCIrCi0gICAgIlw2MVwwXDFcMjcxXDFcMzJcMVwxNDdcMVwzMlwxXDBcMVwzMlwxXDI3MSIrCi0gICAgIlwxXDBcMVwzMlwxXDBcMVwzMlwzXDBcMlwzMlwyXDBcM1wzMiIrCi0gICAgIlwxXDBcMVwzMlwxM1wwXDFcMjcxXDJcMzJcMVwyNzFcMlwzMlwxXDI3MSIrCi0gICAgIlwyXDMyXDFcMFw0XDMyXDFcMFwxXDI3MVwyXDMyXDFcMFwxXDI3MSIrCi0gICAgIlwyXDMyXDRcMFwyXDMyXDFcMTQ3XDNcMFwxXDMyXDNcMFwxXDMyIisKLSAgICAiXDdcMFwzXDMyXDFcMFwxXDMyXDJcMFwxXDI3MlwxMFwwXDExXDMyIisKLSAgICAiXDFcMFw0XDMyXDFcMFwzXDMyXDFcMFwzXDMyXDRcMFwxXDI3MyIrCi0gICAgIlwyXDE1MlwxXDBcMlwxNTJcMVwyNzNcMVwxNTJcMVwwXDVcMTUyXDJcMCIrCi0gICAgIlwyMlwxNTJcMVwyNzNcMlwxNTJcMVwyNzNcMlwxNTJcMVwyNzNcMTBcMTUyXDFcMjczIisKLSAgICAiXDNcMTUyXDFcMjczXDVcMTUyXDFcMFwxXDI3NFwyXDE1NFwxXDBcMlwxNTQiKwotICAgICJcMVwyNzRcMVwxNTRcMVwwXDVcMTU0XDJcMFwyMlwxNTRcMVwyNzRcMlwxNTQiKwotICAgICJcMVwyNzRcMlwxNTRcMVwyNzRcMTBcMTU0XDFcMjc0XDNcMTU0XDFcMjc0XDVcMTU0IisKLSAgICAiXDZcMFwxXDE1NlwyXDBcMVwxNTZcNVwwXDJcMTU2XDEwXDBcMVwxNTciKwotICAgICJcNTBcMFwxXDE1N1wyXDBcMVwxNTdcNVwwXDJcMTU3XDY2XDBcMVwyNzUiKwotICAgICJcMTI1XDBcMVwyNzZcMTA0XDBcMVwyNzdcNjZcMFwyXDMwMFw2N1wwXDJcMzAxIisKLSAgICAiXDEwNFwwXDFcMzAyXDEzXDBcNDJcMTcwXDFcMzAzXDMxXDE3MFwxXDBcMlwxNzEiKwotICAgICJcMVwxNzJcM1wwXDFcMTcxXDNcMFwxXDE3MVw3XDBcM1wxNzFcMVwzMDQiKwotICAgICJcMVwxNzFcMTNcMFwxMVwxNzFcMVwwXDRcMTcxXDFcMFwzXDE3MVwxXDAiKwotICAgICJcM1wxNzFcNFwwXDFcMzA1XDJcMTcxXDFcMFwyXDE3MVwxXDMwNVwxXDE3MSIrCi0gICAgIlwxXDBcNVwxNzFcMlwwXDIyXDE3MVwxXDMwNVwyXDE3MVwxXDMwNVwyXDE3MSIrCi0gICAgIlwxXDMwNVwxMFwxNzFcMVwzMDVcM1wxNzFcMVwzMDVcNVwxNzFcMVwwXDFcMzA2IisKLSAgICAiXDFcMTczXDFcMTc0XDFcMTczXDFcMzA3XDFcMTczXDFcMzA2XDEwXDE3M1wxXDMxMCIrCi0gICAgIlwyMlwxNzNcMVwzMDZcMlwxNzNcMVwzMDZcMlwxNzNcMVwzMDZcMTBcMTczXDFcMzA2IisKLSAgICAiXDNcMTczXDFcMzA2XDVcMTczXDFcMFwxXDMxMVwxXDE3NlwxXDE3N1wzXDE3NiIrCi0gICAgIlwxXDMxMVwxXDMxMlw3XDE3NlwxXDMxM1wyMlwxNzZcMVwzMTFcMlwxNzZcMVwzMTEiKwotICAgICJcMlwxNzZcMVwzMTFcMTBcMTc2XDFcMzExXDNcMTc2XDFcMzExXDVcMTc2XDMyXDAiKwotICAgICJcMVwyNzJcNDJcMFwxXDMxNFwxXDIwMVwxXDIwMlwxXDIwMVwxXDMxNVwxXDIwMSIrCi0gICAgIlwxXDMxNFwxMFwyMDFcMVwzMTZcMjJcMjAxXDFcMzE0XDJcMjAxXDFcMzE0XDJcMjAxIisKLSAgICAiXDFcMzE0XDEwXDIwMVwxXDMxNFwzXDIwMVwxXDMxNFw1XDIwMVwxXDBcMVwzMTciKwotICAgICJcMVwyMDRcMVwyMDVcM1wyMDRcMVwzMTdcMVwzMjBcN1wyMDRcMVwzMjFcMjJcMjA0IisKLSAgICAiXDFcMzE3XDJcMjA0XDFcMzE3XDJcMjA0XDFcMzE3XDEwXDIwNFwxXDMxN1wzXDIwNCIrCi0gICAgIlwxXDMxN1w1XDIwNFwyNVwwXDFcMzIyXDQ3XDBcMVwzMjNcMVw2MFwxXDIwNyIrCi0gICAgIlwxXDYwXDFcMFwxXDYwXDFcMzIzXDFcMFwxXDYwXDFcMFwxXDYwIisKLSAgICAiXDNcMFwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwXDEzXDBcMVwzMjMiKwotICAgICJcMlw2MFwxXDMyM1wyXDYwXDFcMzIzXDJcNjBcMVwwXDRcNjBcMVwwIisKLSAgICAiXDFcMzIzXDJcNjBcMVwwXDFcMzIzXDJcNjBcNFwwXDJcNjBcMVwyMDciKwotICAgICJcM1wwXDFcNjBcM1wwXDFcNjBcN1wwXDNcNjBcMVwwXDFcNjAiKwotICAgICJcMlwwXDFcMjcyXDEwXDBcMTFcNjBcMVwwXDRcNjBcMVwwXDNcNjAiKwotICAgICJcMVwwXDNcNjBcNFwwXDFcMzI0XDFcNjRcMVwyMTJcMVw2NFwxXDAiKwotICAgICJcMVw2NFwxXDMyNFwxXDBcMVw2NFwxXDBcMVw2NFwzXDBcMlw2NCIrCi0gICAgIlwyXDBcM1w2NFwxXDBcMVw2NFwxM1wwXDFcMzI0XDJcNjRcMVwzMjQiKwotICAgICJcMlw2NFwxXDMyNFwyXDY0XDFcMFw0XDY0XDFcMFwxXDMyNFwyXDY0IisKLSAgICAiXDFcMFwxXDMyNFwyXDY0XDRcMFwyXDY0XDFcMjEyXDNcMFwxXDY0IisKLSAgICAiXDNcMFwxXDY0XDdcMFwzXDY0XDFcMFwxXDY0XDJcMFwxXDI3MiIrCi0gICAgIlwxMFwwXDExXDY0XDFcMFw0XDY0XDFcMFwzXDY0XDFcMFwzXDY0IisKLSAgICAiXDRcMFwxXDMyNVwxXDcxXDFcMjE1XDFcNzFcMVwwXDFcNzFcMVwzMjUiKwotICAgICJcMVwwXDFcNzFcMVwwXDFcNzFcM1wwXDJcNzFcMlwwXDNcNzEiKwotICAgICJcMVwwXDFcNzFcMTNcMFwxXDMyNVwyXDcxXDFcMzI1XDJcNzFcMVwzMjUiKwotICAgICJcMlw3MVwxXDBcNFw3MVwxXDBcMVwzMjVcMlw3MVwxXDBcMVwzMjUiKwotICAgICJcMlw3MVw0XDBcMlw3MVwxXDIxNVwzXDBcMVw3MVwzXDBcMVw3MSIrCi0gICAgIlw3XDBcM1w3MVwxXDBcMVw3MVwyXDBcMVwyNzJcMTBcMFwxMVw3MSIrCi0gICAgIlwxXDBcNFw3MVwxXDBcM1w3MVwxXDBcM1w3MVw0XDBcMVwzMjYiKwotICAgICJcMVwxMDFcMVwyMjFcMVwxMDFcMVwwXDFcMTAxXDFcMzI2XDFcMFwxXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMTNcMFwxXDMyNlwyXDEwMVwxXDMyNlwyXDEwMVwxXDMyNlwyXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDFcMzI2XDJcMTAxXDFcMFwxXDMyNlwyXDEwMVw0XDAiKwotICAgICJcMlwxMDFcMVwyMjFcM1wwXDFcMTAxXDNcMFwxXDEwMVw3XDBcM1wxMDEiKwotICAgICJcMVwwXDFcMTAxXDJcMFwxXDI3MlwxMFwwXDExXDEwMVwxXDBcNFwxMDEiKwotICAgICJcMVwwXDNcMTAxXDFcMFwzXDEwMVw0XDBcMVwzMjdcMVwxMDdcMVwyMjQiKwotICAgICJcMVwxMDdcMVwwXDFcMTA3XDFcMzI3XDFcMFwxXDEwN1wxXDBcMVwxMDciKwotICAgICJcM1wwXDJcMTA3XDJcMFwzXDEwN1wxXDBcMVwxMDdcMTNcMFwxXDMyNyIrCi0gICAgIlwyXDEwN1wxXDMyN1wyXDEwN1wxXDMyN1wyXDEwN1wxXDBcNFwxMDdcMVwwIisKLSAgICAiXDFcMzI3XDJcMTA3XDFcMFwxXDMyN1wyXDEwN1w0XDBcMVwzMzBcMVwyMjYiKwotICAgICJcMVwyMjdcMVwyMjZcMVwzMzFcMVwyMjZcMVwzMzBcMTBcMjI2XDFcMzMyXDIyXDIyNiIrCi0gICAgIlwxXDMzMFwyXDIyNlwxXDMzMFwyXDIyNlwxXDMzMFwxMFwyMjZcMVwzMzBcM1wyMjYiKwotICAgICJcMVwzMzBcNVwyMjZcMVwwXDFcMzMzXDFcMjMxXDFcMjMyXDNcMjMxXDFcMzMzIisKLSAgICAiXDFcMzM0XDdcMjMxXDFcMzM1XDIyXDIzMVwxXDMzM1wyXDIzMVwxXDMzM1wyXDIzMSIrCi0gICAgIlwxXDMzM1wxMFwyMzFcMVwzMzNcM1wyMzFcMVwzMzNcNVwyMzFcMVwwXDJcMTA3IisKLSAgICAiXDFcMjI0XDNcMFwxXDEwN1wzXDBcMVwxMDdcN1wwXDNcMTA3XDFcMCIrCi0gICAgIlwxXDEwN1wyXDBcMVwyNzJcMTBcMFwxMVwxMDdcMVwwXDRcMTA3XDFcMCIrCi0gICAgIlwzXDEwN1wxXDBcM1wxMDdcNFwwXDFcMzM2XDFcMTE0XDFcMjM0XDFcMTE0IisKLSAgICAiXDFcMFwxXDExNFwxXDMzNlwxXDBcMVwxMTRcMVwwXDFcMTE0XDNcMCIrCi0gICAgIlwyXDExNFwyXDBcM1wxMTRcMVwwXDFcMTE0XDEzXDBcMVwzMzZcMlwxMTQiKwotICAgICJcMVwzMzZcMlwxMTRcMVwzMzZcMlwxMTRcMVwwXDRcMTE0XDFcMFwxXDMzNiIrCi0gICAgIlwyXDExNFwxXDBcMVwzMzZcMlwxMTRcNFwwXDJcMTE0XDFcMjM0XDNcMCIrCi0gICAgIlwxXDExNFwzXDBcMVwxMTRcN1wwXDNcMTE0XDFcMFwxXDExNFwyXDAiKwotICAgICJcMVwyNzJcMTBcMFwxMVwxMTRcMVwwXDRcMTE0XDFcMFwzXDExNFwxXDAiKwotICAgICJcM1wxMTRcNFwwXDJcMjM3XDFcMjQwXDNcMFwxXDIzN1wzXDBcMVwyMzciKwotICAgICJcN1wwXDNcMjM3XDFcMFwxXDIzN1wxM1wwXDExXDIzN1wxXDBcNFwyMzciKwotICAgICJcMVwwXDNcMjM3XDFcMFwzXDIzN1w0XDBcMVwzMzdcMlwyMzdcMVwwIisKLSAgICAiXDJcMjM3XDFcMzM3XDFcMjM3XDFcMFw1XDIzN1wyXDBcMjJcMjM3XDFcMzM3IisKLSAgICAiXDJcMjM3XDFcMzM3XDJcMjM3XDFcMzM3XDEwXDIzN1wxXDMzN1wzXDIzN1wxXDMzNyIrCi0gICAgIlw1XDIzN1wxXDBcMVwzNDBcMVwxMjJcMVwyNDNcMVwxMjJcMVwwXDFcMTIyIisKLSAgICAiXDFcMzQwXDFcMFwxXDEyMlwxXDBcMVwxMjJcM1wwXDJcMTIyXDJcMCIrCi0gICAgIlwzXDEyMlwxXDI0NFwxXDEyMlwxM1wwXDFcMzQwXDJcMTIyXDFcMzQwXDJcMTIyIisKLSAgICAiXDFcMzQwXDJcMTIyXDFcMFw0XDEyMlwxXDBcMVwzNDBcMlwxMjJcMVwwIisKLSAgICAiXDFcMzQwXDJcMTIyXDRcMFwxXDM0MVwxXDI0NlwxXDI0N1wxXDI0NlwxXDM0MiIrCi0gICAgIlwxXDI0NlwxXDM0MVwxMFwyNDZcMVwzNDNcMjJcMjQ2XDFcMzQxXDJcMjQ2XDFcMzQxIisKLSAgICAiXDJcMjQ2XDFcMzQxXDEwXDI0NlwxXDM0MVwzXDI0NlwxXDM0MVw1XDI0NlwxXDAiKwotICAgICJcMVwzNDRcMVwyNTFcMVwyNTJcM1wyNTFcMVwzNDRcMVwzNDVcN1wyNTFcMVwzNDYiKwotICAgICJcMjJcMjUxXDFcMzQ0XDJcMjUxXDFcMzQ0XDJcMjUxXDFcMzQ0XDEwXDI1MVwxXDM0NCIrCi0gICAgIlwzXDI1MVwxXDM0NFw1XDI1MVwxXDBcMVwyNTNcMVwxMjJcMVwyNDNcM1wwIisKLSAgICAiXDFcMTIyXDNcMFwxXDEyMlwxXDBcMVwyNDFcNVwwXDNcMTIyXDFcMjQ0IisKLSAgICAiXDFcMTIyXDFcMFwxXDI0MlwxMVwwXDExXDEyMlwxXDBcNFwxMjJcMVwwIisKLSAgICAiXDNcMTIyXDFcMFwzXDEyMlw0XDBcMlwxMjJcMVwyNDNcM1wwXDFcMTIyIisKLSAgICAiXDNcMFwxXDEyMlw3XDBcM1wxMjJcMVwyNDRcMVwxMjJcMlwwXDFcMjcyIisKLSAgICAiXDEwXDBcMTFcMTIyXDFcMFw0XDEyMlwxXDBcM1wxMjJcMVwwXDNcMTIyIisKLSAgICAiXDRcMFwxXDI1NVwxXDIzN1wxXDI0MFwzXDBcMVwyMzdcM1wwXDFcMjM3IisKLSAgICAiXDdcMFwzXDIzN1wxXDBcMVwyMzdcMVwwXDFcMjQyXDExXDBcMTFcMjM3IisKLSAgICAiXDFcMFw0XDIzN1wxXDBcM1wyMzdcMVwwXDNcMjM3XDRcMFwxXDM0NyIrCi0gICAgIlwyXDI1NlwxXDBcMlwyNTZcMVwzNDdcMVwyNTZcMVwwXDVcMjU2XDJcMCIrCi0gICAgIlwyMlwyNTZcMVwzNDdcMlwyNTZcMVwzNDdcMlwyNTZcMVwzNDdcMTBcMjU2XDFcMzQ3IisKLSAgICAiXDNcMjU2XDFcMzQ3XDVcMjU2XDFcMFwxXDM1MFw1XDBcMVwzNTBcMTFcMCIrCi0gICAgIlwxXDM1MFw1XDBcMVwzNTBcMTNcMFwyXDM1MFwxXDBcMlwzNTBcMVwwIisKLSAgICAiXDJcMzUwXDdcMFwyXDM1MFwyXDBcMlwzNTBcNVwwXDJcMTIyXDFcMjQzIisKLSAgICAiXDNcMFwxXDEyMlwzXDBcMVwxMjJcN1wwXDJcMTIyXDFcMzUxXDFcMjQ0IisKLSAgICAiXDFcMTIyXDEzXDBcMTFcMTIyXDFcMFw0XDEyMlwxXDBcM1wxMjJcMVwwIisKLSAgICAiXDNcMTIyXDYxXDBcMVwzNTJcMzBcMFwxXDM1M1wxNVwwXDFcMzU0XDFcMjcyIisKLSAgICAiXDQyXDBcMVwzNTVcMVwzMlwxXDE0N1wxXDMyXDFcMFwxXDMyXDFcMzU1IisKLSAgICAiXDFcMFwxXDMyXDFcMFwxXDMyXDNcMFwyXDMyXDJcMFwzXDMyIisKLSAgICAiXDFcMFwxXDMyXDEzXDBcMVwzNTVcMlwzMlwxXDM1NVwyXDMyXDFcMzU1IisKLSAgICAiXDJcMzJcMVwwXDRcMzJcMVwwXDFcMzU1XDJcMzJcMVwwXDFcMzU1IisKLSAgICAiXDJcMzJcNFwwXDFcMzU2XDFcMTUyXDFcMTUzXDFcMTUyXDFcMFwxXDE1MiIrCi0gICAgIlwxXDM1NlwxXDBcMVwxNTJcMVwwXDFcMTUyXDNcMFwyXDE1MlwyXDAiKwotICAgICJcM1wxNTJcMVwwXDFcMTUyXDEzXDBcMVwzNTZcMlwxNTJcMVwzNTZcMlwxNTIiKwotICAgICJcMVwzNTZcMlwxNTJcMVwwXDRcMTUyXDFcMFwxXDM1NlwyXDE1MlwxXDAiKwotICAgICJcMVwzNTZcMlwxNTJcNFwwXDFcMzU3XDFcMTU0XDFcMTU1XDFcMTU0XDFcMCIrCi0gICAgIlwxXDE1NFwxXDM1N1wxXDBcMVwxNTRcMVwwXDFcMTU0XDNcMFwyXDE1NCIrCi0gICAgIlwyXDBcM1wxNTRcMVwwXDFcMTU0XDEzXDBcMVwzNTdcMlwxNTRcMVwzNTciKwotICAgICJcMlwxNTRcMVwzNTdcMlwxNTRcMVwwXDRcMTU0XDFcMFwxXDM1N1wyXDE1NCIrCi0gICAgIlwxXDBcMVwzNTdcMlwxNTRcMTZcMFwxXDM2MFwxMjZcMFwyXDM2MVwxMDNcMCIrCi0gICAgIlwxXDM2Mlw3NlwwXDJcMzYzXDc0XDBcMVwzNjRcNzdcMFwxXDM2NVwzXDAiKwotICAgICJcNDFcMTcwXDFcMzY2XDFcMzAzXDMxXDE3MFwyXDBcMVwzNjdcMVwzNzBcMVwzMDQiKwotICAgICJcMVwwXDFcMzA0XDFcMzY3XDFcMFwxXDMwNFwxXDBcMVwzNjdcM1wwIisKLSAgICAiXDJcMzA0XDJcMFwzXDM2N1wxXDBcMVwzNjdcMTNcMFwxMVwzNjdcMVwwIisKLSAgICAiXDRcMzY3XDFcMFwzXDM2N1wxXDBcM1wzNjdcNFwwXDFcMzcxXDFcMTcxIisKLSAgICAiXDFcMTcyXDFcMTcxXDFcMFwxXDE3MVwxXDM3MVwxXDBcMVwxNzFcMVwwIisKLSAgICAiXDFcMTcxXDNcMFwyXDE3MVwyXDBcM1wxNzFcMVwzMDRcMVwxNzFcMTNcMCIrCi0gICAgIlwxXDM3MVwyXDE3MVwxXDM3MVwyXDE3MVwxXDM3MVwyXDE3MVwxXDBcNFwxNzEiKwotICAgICJcMVwwXDFcMzcxXDJcMTcxXDFcMFwxXDM3MVwyXDE3MVw0XDBcMVwzNzIiKwotICAgICJcMVwxNzNcMVwxNzRcMVwxNzNcMVwxNzVcMVwxNzNcMVwzNzJcMzNcMTczXDFcMzcyIisKLSAgICAiXDJcMTczXDFcMzcyXDJcMTczXDFcMzcyXDEwXDE3M1wxXDM3MlwzXDE3M1wxXDM3MiIrCi0gICAgIlw1XDE3M1wxXDBcMlwxNzNcMVwxNzRcMVwwXDFcMTc1XDEyXDE3M1wxXDAiKwotICAgICJcNTNcMTczXDFcMFwxXDM3M1wxXDE3NlwxXDE3N1wzXDE3NlwxXDM3M1wxXDE3NSIrCi0gICAgIlwzMlwxNzZcMVwzNzNcMlwxNzZcMVwzNzNcMlwxNzZcMVwzNzNcMTBcMTc2XDFcMzczIisKLSAgICAiXDNcMTc2XDFcMzczXDVcMTc2XDFcMFwyXDE3NlwxXDE3N1wxXDBcM1wxNzYiKwotICAgICJcMVwxNzVcN1wxNzZcMVwwXDUzXDE3NlwxXDBcMVwzNzRcMVwyMDFcMVwyMDIiKwotICAgICJcMVwyMDFcMVwyMDNcMVwyMDFcMVwzNzRcMzNcMjAxXDFcMzc0XDJcMjAxXDFcMzc0IisKLSAgICAiXDJcMjAxXDFcMzc0XDEwXDIwMVwxXDM3NFwzXDIwMVwxXDM3NFw1XDIwMVwxXDAiKwotICAgICJcMlwyMDFcMVwyMDJcMVwwXDFcMjAzXDEyXDIwMVwxXDBcNTNcMjAxXDFcMCIrCi0gICAgIlwxXDM3NVwxXDIwNFwxXDIwNVwzXDIwNFwxXDM3NVwxXDIwM1wzMlwyMDRcMVwzNzUiKwotICAgICJcMlwyMDRcMVwzNzVcMlwyMDRcMVwzNzVcMTBcMjA0XDFcMzc1XDNcMjA0XDFcMzc1IisKLSAgICAiXDVcMjA0XDFcMFwyXDIwNFwxXDIwNVwxXDBcM1wyMDRcMVwyMDNcN1wyMDQiKwotICAgICJcMVwwXDUzXDIwNFwyNlwwXDFcMzc2XDQ2XDBcMVwzNzdcMVw2MFwxXDIwNyIrCi0gICAgIlwxXDYwXDFcMFwxXDYwXDFcMzc3XDFcMFwxXDYwXDFcMFwxXDYwIisKLSAgICAiXDNcMFwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwXDEzXDBcMVwzNzciKwotICAgICJcMlw2MFwxXDM3N1wyXDYwXDFcMzc3XDJcNjBcMVwwXDRcNjBcMVwwIisKLSAgICAiXDFcMzc3XDJcNjBcMVwwXDFcMzc3XDJcNjBcNFwwXDFcdTAxMDBcMVw2NCIrCi0gICAgIlwxXDIxMlwxXDY0XDFcMFwxXDY0XDFcdTAxMDBcMVwwXDFcNjRcMVwwIisKLSAgICAiXDFcNjRcM1wwXDJcNjRcMlwwXDNcNjRcMVwwXDFcNjRcMTNcMCIrCi0gICAgIlwxXHUwMTAwXDJcNjRcMVx1MDEwMFwyXDY0XDFcdTAxMDBcMlw2NFwxXDBcNFw2NCIrCi0gICAgIlwxXDBcMVx1MDEwMFwyXDY0XDFcMFwxXHUwMTAwXDJcNjRcNFwwXDFcdTAxMDEiKwotICAgICJcMVw3MVwxXDIxNVwxXDcxXDFcMFwxXDcxXDFcdTAxMDFcMVwwXDFcNzEiKwotICAgICJcMVwwXDFcNzFcM1wwXDJcNzFcMlwwXDNcNzFcMVwwXDFcNzEiKwotICAgICJcMTNcMFwxXHUwMTAxXDJcNzFcMVx1MDEwMVwyXDcxXDFcdTAxMDFcMlw3MVwxXDAiKwotICAgICJcNFw3MVwxXDBcMVx1MDEwMVwyXDcxXDFcMFwxXHUwMTAxXDJcNzFcNFwwIisKLSAgICAiXDFcdTAxMDJcMVwxMDFcMVwyMjFcMVwxMDFcMVwwXDFcMTAxXDFcdTAxMDJcMVwwIisKLSAgICAiXDFcMTAxXDFcMFwxXDEwMVwzXDBcMlwxMDFcMlwwXDNcMTAxXDFcMCIrCi0gICAgIlwxXDEwMVwxM1wwXDFcdTAxMDJcMlwxMDFcMVx1MDEwMlwyXDEwMVwxXHUwMTAyXDJcMTAxIisKLSAgICAiXDFcMFw0XDEwMVwxXDBcMVx1MDEwMlwyXDEwMVwxXDBcMVx1MDEwMlwyXDEwMSIrCi0gICAgIlw0XDBcMVx1MDEwM1wxXDEwN1wxXDIyNFwxXDEwN1wxXDBcMVwxMDdcMVx1MDEwMyIrCi0gICAgIlwxXDBcMVwxMDdcMVwwXDFcMTA3XDNcMFwyXDEwN1wyXDBcM1wxMDciKwotICAgICJcMVwwXDFcMTA3XDEzXDBcMVx1MDEwM1wyXDEwN1wxXHUwMTAzXDJcMTA3XDFcdTAxMDMiKwotICAgICJcMlwxMDdcMVwwXDRcMTA3XDFcMFwxXHUwMTAzXDJcMTA3XDFcMFwxXHUwMTAzIisKLSAgICAiXDJcMTA3XDRcMFwxXHUwMTA0XDFcMjI2XDFcMjI3XDFcMjI2XDFcMjMwXDFcMjI2IisKLSAgICAiXDFcdTAxMDRcMzNcMjI2XDFcdTAxMDRcMlwyMjZcMVx1MDEwNFwyXDIyNlwxXHUwMTA0XDEwXDIyNiIrCi0gICAgIlwxXHUwMTA0XDNcMjI2XDFcdTAxMDRcNVwyMjZcMVwwXDJcMjI2XDFcMjI3XDFcMCIrCi0gICAgIlwxXDIzMFwxMlwyMjZcMVwwXDUzXDIyNlwxXDBcMVx1MDEwNVwxXDIzMVwxXDIzMiIrCi0gICAgIlwzXDIzMVwxXHUwMTA1XDFcMjMwXDMyXDIzMVwxXHUwMTA1XDJcMjMxXDFcdTAxMDVcMlwyMzEiKwotICAgICJcMVx1MDEwNVwxMFwyMzFcMVx1MDEwNVwzXDIzMVwxXHUwMTA1XDVcMjMxXDFcMFwyXDIzMSIrCi0gICAgIlwxXDIzMlwxXDBcM1wyMzFcMVwyMzBcN1wyMzFcMVwwXDUzXDIzMVwxXDAiKwotICAgICJcMVx1MDEwNlwxXDExNFwxXDIzNFwxXDExNFwxXDBcMVwxMTRcMVx1MDEwNlwxXDAiKwotICAgICJcMVwxMTRcMVwwXDFcMTE0XDNcMFwyXDExNFwyXDBcM1wxMTRcMVwwIisKLSAgICAiXDFcMTE0XDEzXDBcMVx1MDEwNlwyXDExNFwxXHUwMTA2XDJcMTE0XDFcdTAxMDZcMlwxMTQiKwotICAgICJcMVwwXDRcMTE0XDFcMFwxXHUwMTA2XDJcMTE0XDFcMFwxXHUwMTA2XDJcMTE0IisKLSAgICAiXDRcMFwxXHUwMTA3XDFcMjM3XDFcMjQwXDFcMjM3XDFcMFwxXDIzN1wxXHUwMTA3IisKLSAgICAiXDFcMFwxXDIzN1wxXDBcMVwyMzdcM1wwXDJcMjM3XDJcMFwzXDIzNyIrCi0gICAgIlwxXDBcMVwyMzdcMTNcMFwxXHUwMTA3XDJcMjM3XDFcdTAxMDdcMlwyMzdcMVx1MDEwNyIrCi0gICAgIlwyXDIzN1wxXDBcNFwyMzdcMVwwXDFcdTAxMDdcMlwyMzdcMVwwXDFcdTAxMDciKwotICAgICJcMlwyMzdcNFwwXDFcdTAxMDhcMVwxMjJcMVwyNDNcMVwxMjJcMVwwXDFcMTIyIisKLSAgICAiXDFcdTAxMDhcMVwwXDFcMTIyXDFcMFwxXDEyMlwzXDBcMlwxMjJcMlwwIisKLSAgICAiXDNcMTIyXDFcMjQ0XDFcMTIyXDEzXDBcMVx1MDEwOFwyXDEyMlwxXHUwMTA4XDJcMTIyIisKLSAgICAiXDFcdTAxMDhcMlwxMjJcMVwwXDRcMTIyXDFcMFwxXHUwMTA4XDJcMTIyXDFcMCIrCi0gICAgIlwxXHUwMTA4XDJcMTIyXDRcMFwxXHUwMTA5XDFcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjUwIisKLSAgICAiXDFcMjQ2XDFcdTAxMDlcMzNcMjQ2XDFcdTAxMDlcMlwyNDZcMVx1MDEwOVwyXDI0NlwxXHUwMTA5IisKLSAgICAiXDEwXDI0NlwxXHUwMTA5XDNcMjQ2XDFcdTAxMDlcNVwyNDZcMVwwXDJcMjQ2XDFcMjQ3IisKLSAgICAiXDFcMFwxXDI1MFwxMlwyNDZcMVwwXDUzXDI0NlwxXDBcMVx1MDEwYVwxXDI1MSIrCi0gICAgIlwxXDI1MlwzXDI1MVwxXHUwMTBhXDFcMjUwXDMyXDI1MVwxXHUwMTBhXDJcMjUxXDFcdTAxMGEiKwotICAgICJcMlwyNTFcMVx1MDEwYVwxMFwyNTFcMVx1MDEwYVwzXDI1MVwxXHUwMTBhXDVcMjUxXDFcMCIrCi0gICAgIlwyXDI1MVwxXDI1MlwxXDBcM1wyNTFcMVwyNTBcN1wyNTFcMVwwXDUzXDI1MSIrCi0gICAgIlwxXDBcMVx1MDEwYlwxXDI1NlwxXDI1N1wxXDI1NlwxXDBcMVwyNTZcMVx1MDEwYiIrCi0gICAgIlwxXDBcMVwyNTZcMVwwXDFcMjU2XDNcMFwyXDI1NlwyXDBcM1wyNTYiKwotICAgICJcMVwwXDFcMjU2XDEzXDBcMVx1MDEwYlwyXDI1NlwxXHUwMTBiXDJcMjU2XDFcdTAxMGIiKwotICAgICJcMlwyNTZcMVwwXDRcMjU2XDFcMFwxXHUwMTBiXDJcMjU2XDFcMFwxXHUwMTBiIisKLSAgICAiXDJcMjU2XDRcMFwxXHUwMTBjXDVcMFwxXHUwMTBjXDNcMFwxXHUwMTBkXDVcMCIrCi0gICAgIlwxXHUwMTBjXDVcMFwxXHUwMTBjXDEzXDBcMlx1MDEwY1wxXDBcMlx1MDEwY1wxXDAiKwotICAgICJcMlx1MDEwY1w3XDBcMlx1MDEwY1wyXDBcMlx1MDEwY1w1XDBcMlwxMjJcMVwyNDMiKwotICAgICJcM1wwXDFcMTIyXDNcMFwxXDEyMlw3XDBcM1wxMjJcMVx1MDEwZVwxXDEyMiIrCi0gICAgIlwxM1wwXDExXDEyMlwxXDBcNFwxMjJcMVwwXDNcMTIyXDFcMFwzXDEyMiIrCi0gICAgIlw2MlwwXDFcdTAxMGZcMjdcMFwxXDM1M1wxNVwwXDFcMzU0XDUwXDBcMVwzNTQiKwotICAgICJcMlwwXDFcMzU0XDVcMFwyXDM1NFwxMVwwXDFcdTAxMTBcNDJcMFwxXHUwMTExIisKLSAgICAiXDFcMzJcMVwxNDdcMVwzMlwxXDBcMVwzMlwxXHUwMTExXDFcMFwxXDMyIisKLSAgICAiXDFcMFwxXDMyXDNcMFwyXDMyXDJcMFwzXDMyXDFcMFwxXDMyIisKLSAgICAiXDEzXDBcMVx1MDExMVwyXDMyXDFcdTAxMTFcMlwzMlwxXHUwMTExXDJcMzJcMVwwIisKLSAgICAiXDRcMzJcMVwwXDFcdTAxMTFcMlwzMlwxXDBcMVx1MDExMVwyXDMyXDRcMCIrCi0gICAgIlwxXHUwMTEyXDFcMTUyXDFcMTUzXDFcMTUyXDFcMFwxXDE1MlwxXHUwMTEyXDFcMCIrCi0gICAgIlwxXDE1MlwxXDBcMVwxNTJcM1wwXDJcMTUyXDJcMFwzXDE1MlwxXDAiKwotICAgICJcMVwxNTJcMTNcMFwxXHUwMTEyXDJcMTUyXDFcdTAxMTJcMlwxNTJcMVx1MDExMlwyXDE1MiIrCi0gICAgIlwxXDBcNFwxNTJcMVwwXDFcdTAxMTJcMlwxNTJcMVwwXDFcdTAxMTJcMlwxNTIiKwotICAgICJcNFwwXDFcdTAxMTNcMVwxNTRcMVwxNTVcMVwxNTRcMVwwXDFcMTU0XDFcdTAxMTMiKwotICAgICJcMVwwXDFcMTU0XDFcMFwxXDE1NFwzXDBcMlwxNTRcMlwwXDNcMTU0IisKLSAgICAiXDFcMFwxXDE1NFwxM1wwXDFcdTAxMTNcMlwxNTRcMVx1MDExM1wyXDE1NFwxXHUwMTEzIisKLSAgICAiXDJcMTU0XDFcMFw0XDE1NFwxXDBcMVx1MDExM1wyXDE1NFwxXDBcMVx1MDExMyIrCi0gICAgIlwyXDE1NFwyN1wwXDFcdTAxMTRcMTI3XDBcMVx1MDExNVw3MFwwXDFcdTAxMTZcNjdcMCIrCi0gICAgIlwyXHUwMTE3XDc0XDBcMVx1MDExOFwyMVwwXDJcMzY3XDFcMzcwXDFcdTAxMTlcMVwwIisKLSAgICAiXDFcdTAxMTlcMVwzNjdcMVwwXDFcdTAxMTlcMVx1MDExYVwxXDM2N1wzXDBcMlx1MDExOSIrCi0gICAgIlwyXDBcM1wzNjdcMVwwXDFcMzY3XDEzXDBcMTFcMzY3XDFcMFw0XDM2NyIrCi0gICAgIlwxXDBcM1wzNjdcMVwwXDNcMzY3XDRcMFwxXHUwMTFiXDJcMzY3XDFcMCIrCi0gICAgIlwyXDM2N1wxXHUwMTFiXDFcMzY3XDFcMFw1XDM2N1wyXDBcMjJcMzY3XDFcdTAxMWIiKwotICAgICJcMlwzNjdcMVx1MDExYlwyXDM2N1wxXHUwMTFiXDEwXDM2N1wxXHUwMTFiXDNcMzY3XDFcdTAxMWIiKwotICAgICJcNVwzNjdcMVwwXDFcdTAxMWNcMVwxNzFcMVwxNzJcMVwxNzFcMVwwXDFcMTcxIisKLSAgICAiXDFcdTAxMWNcMVwwXDFcMTcxXDFcMFwxXDE3MVwzXDBcMlwxNzFcMlwwIisKLSAgICAiXDNcMTcxXDFcMzA0XDFcMTcxXDEzXDBcMVx1MDExY1wyXDE3MVwxXHUwMTFjXDJcMTcxIisKLSAgICAiXDFcdTAxMWNcMlwxNzFcMVwwXDRcMTcxXDFcMFwxXHUwMTFjXDJcMTcxXDFcMCIrCi0gICAgIlwxXHUwMTFjXDJcMTcxXDRcMFwxXHUwMTFkXDFcMTczXDFcMTc0XDFcMTczXDFcMTc1IisKLSAgICAiXDFcMTczXDFcdTAxMWRcMzNcMTczXDFcdTAxMWRcMlwxNzNcMVx1MDExZFwyXDE3M1wxXHUwMTFkIisKLSAgICAiXDEwXDE3M1wxXHUwMTFkXDNcMTczXDFcdTAxMWRcNVwxNzNcMVwwXDFcdTAxMWVcMVwxNzYiKwotICAgICJcMVwxNzdcM1wxNzZcMVx1MDExZVwxXDE3NVwzMlwxNzZcMVx1MDExZVwyXDE3NlwxXHUwMTFlIisKLSAgICAiXDJcMTc2XDFcdTAxMWVcMTBcMTc2XDFcdTAxMWVcM1wxNzZcMVx1MDExZVw1XDE3NlwxXDAiKwotICAgICJcMVx1MDExZlwxXDIwMVwxXDIwMlwxXDIwMVwxXDIwM1wxXDIwMVwxXHUwMTFmXDMzXDIwMSIrCi0gICAgIlwxXHUwMTFmXDJcMjAxXDFcdTAxMWZcMlwyMDFcMVx1MDExZlwxMFwyMDFcMVx1MDExZlwzXDIwMSIrCi0gICAgIlwxXHUwMTFmXDVcMjAxXDFcMFwxXHUwMTIwXDFcMjA0XDFcMjA1XDNcMjA0XDFcdTAxMjAiKwotICAgICJcMVwyMDNcMzJcMjA0XDFcdTAxMjBcMlwyMDRcMVx1MDEyMFwyXDIwNFwxXHUwMTIwXDEwXDIwNCIrCi0gICAgIlwxXHUwMTIwXDNcMjA0XDFcdTAxMjBcNVwyMDRcMVwwXDJcdTAxMjFcMVx1MDEyMlwxXDM3NiIrCi0gICAgIlwxXHUwMTIzXDFcMzc2XDFcdTAxMjFcMVx1MDEyNFwxXDM3NlwxXHUwMTI1XDRcdTAxMjFcMlwzNzYiKwotICAgICJcNVx1MDEyMVwxXDBcNDVcdTAxMjFcMVwwXDFcdTAxMjZcMVw2MFwxXDIwN1wxXDYwIisKLSAgICAiXDFcMFwxXDYwXDFcdTAxMjZcMVwwXDFcNjBcMVwwXDFcNjBcM1wwIisKLSAgICAiXDJcNjBcMlwwXDNcNjBcMVwwXDFcNjBcMTNcMFwxXHUwMTI2XDJcNjAiKwotICAgICJcMVx1MDEyNlwyXDYwXDFcdTAxMjZcMlw2MFwxXDBcNFw2MFwxXDBcMVx1MDEyNiIrCi0gICAgIlwyXDYwXDFcMFwxXHUwMTI2XDJcNjBcNFwwXDFcdTAxMjdcMVw2NFwxXDIxMiIrCi0gICAgIlwxXDY0XDFcMFwxXDY0XDFcdTAxMjdcMVwwXDFcNjRcMVwwXDFcNjQiKwotICAgICJcM1wwXDJcNjRcMlwwXDNcNjRcMVwwXDFcNjRcMTNcMFwxXHUwMTI3IisKLSAgICAiXDJcNjRcMVx1MDEyN1wyXDY0XDFcdTAxMjdcMlw2NFwxXDBcNFw2NFwxXDAiKwotICAgICJcMVx1MDEyN1wyXDY0XDFcMFwxXHUwMTI3XDJcNjRcNFwwXDFcdTAxMjhcMVw3MSIrCi0gICAgIlwxXDIxNVwxXDcxXDFcMFwxXDcxXDFcdTAxMjhcMVwwXDFcNzFcMVwwIisKLSAgICAiXDFcNzFcM1wwXDJcNzFcMlwwXDNcNzFcMVwwXDFcNzFcMTNcMCIrCi0gICAgIlwxXHUwMTI4XDJcNzFcMVx1MDEyOFwyXDcxXDFcdTAxMjhcMlw3MVwxXDBcNFw3MSIrCi0gICAgIlwxXDBcMVx1MDEyOFwyXDcxXDFcMFwxXHUwMTI4XDJcNzFcNFwwXDFcdTAxMjkiKwotICAgICJcMVwxMDFcMVwyMjFcMVwxMDFcMVwwXDFcMTAxXDFcdTAxMjlcMVwwXDFcMTAxIisKLSAgICAiXDFcMFwxXDEwMVwzXDBcMlwxMDFcMlwwXDNcMTAxXDFcMFwxXDEwMSIrCi0gICAgIlwxM1wwXDFcdTAxMjlcMlwxMDFcMVx1MDEyOVwyXDEwMVwxXHUwMTI5XDJcMTAxXDFcMCIrCi0gICAgIlw0XDEwMVwxXDBcMVx1MDEyOVwyXDEwMVwxXDBcMVx1MDEyOVwyXDEwMVw0XDAiKwotICAgICJcMVx1MDEyYVwxXDEwN1wxXDIyNFwxXDEwN1wxXDBcMVwxMDdcMVx1MDEyYVwxXDAiKwotICAgICJcMVwxMDdcMVwwXDFcMTA3XDNcMFwyXDEwN1wyXDBcM1wxMDdcMVwwIisKLSAgICAiXDFcMTA3XDEzXDBcMVx1MDEyYVwyXDEwN1wxXHUwMTJhXDJcMTA3XDFcdTAxMmFcMlwxMDciKwotICAgICJcMVwwXDRcMTA3XDFcMFwxXHUwMTJhXDJcMTA3XDFcMFwxXHUwMTJhXDJcMTA3IisKLSAgICAiXDRcMFwxXHUwMTJiXDFcMjI2XDFcMjI3XDFcMjI2XDFcMjMwXDFcMjI2XDFcdTAxMmIiKwotICAgICJcMzNcMjI2XDFcdTAxMmJcMlwyMjZcMVx1MDEyYlwyXDIyNlwxXHUwMTJiXDEwXDIyNlwxXHUwMTJiIisKLSAgICAiXDNcMjI2XDFcdTAxMmJcNVwyMjZcMVwwXDFcdTAxMmNcMVwyMzFcMVwyMzJcM1wyMzEiKwotICAgICJcMVx1MDEyY1wxXDIzMFwzMlwyMzFcMVx1MDEyY1wyXDIzMVwxXHUwMTJjXDJcMjMxXDFcdTAxMmMiKwotICAgICJcMTBcMjMxXDFcdTAxMmNcM1wyMzFcMVx1MDEyY1w1XDIzMVwxXDBcMVx1MDEyZFwxXDExNCIrCi0gICAgIlwxXDIzNFwxXDExNFwxXDBcMVwxMTRcMVx1MDEyZFwxXDBcMVwxMTRcMVwwIisKLSAgICAiXDFcMTE0XDNcMFwyXDExNFwyXDBcM1wxMTRcMVwwXDFcMTE0XDEzXDAiKwotICAgICJcMVx1MDEyZFwyXDExNFwxXHUwMTJkXDJcMTE0XDFcdTAxMmRcMlwxMTRcMVwwXDRcMTE0IisKLSAgICAiXDFcMFwxXHUwMTJkXDJcMTE0XDFcMFwxXHUwMTJkXDJcMTE0XDRcMFwxXHUwMTJlIisKLSAgICAiXDFcMjM3XDFcMjQwXDFcMjM3XDFcMFwxXDIzN1wxXHUwMTJlXDFcMFwxXDIzNyIrCi0gICAgIlwxXDBcMVwyMzdcM1wwXDJcMjM3XDJcMFwzXDIzN1wxXDBcMVwyMzciKwotICAgICJcMTNcMFwxXHUwMTJlXDJcMjM3XDFcdTAxMmVcMlwyMzdcMVx1MDEyZVwyXDIzN1wxXDAiKwotICAgICJcNFwyMzdcMVwwXDFcdTAxMmVcMlwyMzdcMVwwXDFcdTAxMmVcMlwyMzdcNFwwIisKLSAgICAiXDFcdTAxMmZcMVwxMjJcMVwyNDNcMVwxMjJcMVwwXDFcMTIyXDFcdTAxMmZcMVwwIisKLSAgICAiXDFcMTIyXDFcMFwxXDEyMlwzXDBcMlwxMjJcMlwwXDNcMTIyXDFcMjQ0IisKLSAgICAiXDFcMTIyXDEzXDBcMVx1MDEyZlwyXDEyMlwxXHUwMTJmXDJcMTIyXDFcdTAxMmZcMlwxMjIiKwotICAgICJcMVwwXDRcMTIyXDFcMFwxXHUwMTJmXDJcMTIyXDFcMFwxXHUwMTJmXDJcMTIyIisKLSAgICAiXDRcMFwxXHUwMTMwXDFcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjUwXDFcMjQ2XDFcdTAxMzAiKwotICAgICJcMzNcMjQ2XDFcdTAxMzBcMlwyNDZcMVx1MDEzMFwyXDI0NlwxXHUwMTMwXDEwXDI0NlwxXHUwMTMwIisKLSAgICAiXDNcMjQ2XDFcdTAxMzBcNVwyNDZcMVwwXDFcdTAxMzFcMVwyNTFcMVwyNTJcM1wyNTEiKwotICAgICJcMVx1MDEzMVwxXDI1MFwzMlwyNTFcMVx1MDEzMVwyXDI1MVwxXHUwMTMxXDJcMjUxXDFcdTAxMzEiKwotICAgICJcMTBcMjUxXDFcdTAxMzFcM1wyNTFcMVx1MDEzMVw1XDI1MVwxXDBcMVx1MDEzMlwxXDI1NiIrCi0gICAgIlwxXDI1N1wxXDI1NlwxXDBcMVwyNTZcMVx1MDEzMlwxXDBcMVwyNTZcMVwwIisKLSAgICAiXDFcMjU2XDNcMFwyXDI1NlwyXDBcM1wyNTZcMVwwXDFcMjU2XDEzXDAiKwotICAgICJcMVx1MDEzMlwyXDI1NlwxXHUwMTMyXDJcMjU2XDFcdTAxMzJcMlwyNTZcMVwwXDRcMjU2IisKLSAgICAiXDFcMFwxXHUwMTMyXDJcMjU2XDFcMFwxXHUwMTMyXDJcMjU2XDRcMFwxXHUwMTMzIisKLSAgICAiXDVcMFwxXHUwMTMzXDNcMFwxXHUwMTBkXDVcMFwxXHUwMTMzXDVcMFwxXHUwMTMzIisKLSAgICAiXDEzXDBcMlx1MDEzM1wxXDBcMlx1MDEzM1wxXDBcMlx1MDEzM1w3XDBcMlx1MDEzMyIrCi0gICAgIlwyXDBcMlx1MDEzM1w1XDBcMVx1MDEzNFw1XDBcMVx1MDEzNFwxMVwwXDFcdTAxMzQiKwotICAgICJcNVwwXDFcdTAxMzRcMTNcMFwyXHUwMTM0XDFcMFwyXHUwMTM0XDFcMFwyXHUwMTM0IisKLSAgICAiXDdcMFwyXHUwMTM0XDJcMFwyXHUwMTM0XDVcMFwyXHUwMTM1XDFcdTAxMzZcMVx1MDEzNyIrCi0gICAgIlwxXHUwMTM4XDFcdTAxMzdcMVx1MDEzNVwxXHUwMTM5XDFcdTAxMzdcMVx1MDEzYVw0XHUwMTM1XDJcdTAxMzciKwotICAgICJcNVx1MDEzNVwxXDBcNDVcdTAxMzVcNjBcMFwxXHUwMTNiXDE0XDBcMVx1MDEzY1wxXDMyIisKLSAgICAiXDFcMTQ3XDFcMzJcMVwwXDFcMzJcMVx1MDEzY1wxXDBcMVwzMlwxXDAiKwotICAgICJcMVwzMlwzXDBcMlwzMlwyXDBcM1wzMlwxXDBcMVwzMlwxM1wwIisKLSAgICAiXDFcdTAxM2NcMlwzMlwxXHUwMTNjXDJcMzJcMVx1MDEzY1wyXDMyXDFcMFw0XDMyIisKLSAgICAiXDFcMFwxXHUwMTNjXDJcMzJcMVwwXDFcdTAxM2NcMlwzMlw0XDBcMVx1MDEzZCIrCi0gICAgIlwxXDE1MlwxXDE1M1wxXDE1MlwxXDBcMVwxNTJcMVx1MDEzZFwxXDBcMVwxNTIiKwotICAgICJcMVwwXDFcMTUyXDNcMFwyXDE1MlwyXDBcM1wxNTJcMVwwXDFcMTUyIisKLSAgICAiXDEzXDBcMVx1MDEzZFwyXDE1MlwxXHUwMTNkXDJcMTUyXDFcdTAxM2RcMlwxNTJcMVwwIisKLSAgICAiXDRcMTUyXDFcMFwxXHUwMTNkXDJcMTUyXDFcMFwxXHUwMTNkXDJcMTUyXDRcMCIrCi0gICAgIlwxXHUwMTNlXDFcMTU0XDFcMTU1XDFcMTU0XDFcMFwxXDE1NFwxXHUwMTNlXDFcMCIrCi0gICAgIlwxXDE1NFwxXDBcMVwxNTRcM1wwXDJcMTU0XDJcMFwzXDE1NFwxXDAiKwotICAgICJcMVwxNTRcMTNcMFwxXHUwMTNlXDJcMTU0XDFcdTAxM2VcMlwxNTRcMVx1MDEzZVwyXDE1NCIrCi0gICAgIlwxXDBcNFwxNTRcMVwwXDFcdTAxM2VcMlwxNTRcMVwwXDFcdTAxM2VcMlwxNTQiKwotICAgICJcNTNcMFwxXHUwMTNmXDQ3XDBcMVx1MDE0MFwxMTVcMFwyXHUwMTQxXDM3XDBcMVx1MDE0MiIrCi0gICAgIlw2NFwwXDFcdTAxMTlcMVwwXDFcdTAxMTlcMlwwXDFcdTAxMTlcMVx1MDExYVw0XDAiKwotICAgICJcMlx1MDExOVw1NFwwXDFcdTAxNDNcMVwzNjdcMVwzNzBcMVwzNjdcMVwwXDFcMzY3IisKLSAgICAiXDFcdTAxNDNcMVwwXDFcMzY3XDFcdTAxMWFcMVwzNjdcM1wwXDJcMzY3XDJcMCIrCi0gICAgIlwzXDM2N1wxXDBcMVwzNjdcMTNcMFwxXHUwMTQzXDJcMzY3XDFcdTAxNDNcMlwzNjciKwotICAgICJcMVx1MDE0M1wyXDM2N1wxXDBcNFwzNjdcMVwwXDFcdTAxNDNcMlwzNjdcMVwwIisKLSAgICAiXDFcdTAxNDNcMlwzNjdcNFwwXDFcdTAxNDRcMVwxNzFcMVwxNzJcMVwxNzFcMVwwIisKLSAgICAiXDFcMTcxXDFcdTAxNDRcMVwwXDFcMTcxXDFcMFwxXDE3MVwzXDBcMlwxNzEiKwotICAgICJcMlwwXDNcMTcxXDFcMzA0XDFcMTcxXDEzXDBcMVx1MDE0NFwyXDE3MVwxXHUwMTQ0IisKLSAgICAiXDJcMTcxXDFcdTAxNDRcMlwxNzFcMVwwXDRcMTcxXDFcMFwxXHUwMTQ0XDJcMTcxIisKLSAgICAiXDFcMFwxXHUwMTQ0XDJcMTcxXDRcMFwxXHUwMTQ1XDFcMTczXDFcMTc0XDFcMTczIisKLSAgICAiXDFcMTc1XDFcMTczXDFcdTAxNDVcMzNcMTczXDFcdTAxNDVcMlwxNzNcMVx1MDE0NVwyXDE3MyIrCi0gICAgIlwxXHUwMTQ1XDEwXDE3M1wxXHUwMTQ1XDNcMTczXDFcdTAxNDVcNVwxNzNcMVwwXDFcdTAxNDYiKwotICAgICJcMVwxNzZcMVwxNzdcM1wxNzZcMVx1MDE0NlwxXDE3NVwzMlwxNzZcMVx1MDE0NlwyXDE3NiIrCi0gICAgIlwxXHUwMTQ2XDJcMTc2XDFcdTAxNDZcMTBcMTc2XDFcdTAxNDZcM1wxNzZcMVx1MDE0Nlw1XDE3NiIrCi0gICAgIlwxXDBcMVx1MDE0N1wxXDIwMVwxXDIwMlwxXDIwMVwxXDIwM1wxXDIwMVwxXHUwMTQ3IisKLSAgICAiXDMzXDIwMVwxXHUwMTQ3XDJcMjAxXDFcdTAxNDdcMlwyMDFcMVx1MDE0N1wxMFwyMDFcMVx1MDE0NyIrCi0gICAgIlwzXDIwMVwxXHUwMTQ3XDVcMjAxXDFcMFwxXHUwMTQ4XDFcMjA0XDFcMjA1XDNcMjA0IisKLSAgICAiXDFcdTAxNDhcMVwyMDNcMzJcMjA0XDFcdTAxNDhcMlwyMDRcMVx1MDE0OFwyXDIwNFwxXHUwMTQ4IisKLSAgICAiXDEwXDIwNFwxXHUwMTQ4XDNcMjA0XDFcdTAxNDhcNVwyMDRcMVwwXDJcdTAxMjFcMVx1MDEyMiIrCi0gICAgIlwxXHUwMTQ5XDFcMFwyXHUwMTIxXDFcMFwxXHUwMTQ5XDFcdTAxMjVcNFx1MDEyMVwyXHUwMTQ5IisKLSAgICAiXDVcdTAxMjFcMVwwXDQ1XHUwMTIxXDFcMFwxXHUwMTRhXDFcdTAxMjFcMVx1MDEyMlwxXHUwMTQ5IisKLSAgICAiXDJcdTAxMjFcMVx1MDE0YVwxXHUwMTIxXDFcdTAxNDlcMVx1MDE0Ylw0XHUwMTIxXDJcdTAxNDlcMjJcdTAxMjEiKwotICAgICJcMVx1MDE0YVwyXHUwMTIxXDFcdTAxNGFcMlx1MDEyMVwxXHUwMTRhXDEwXHUwMTIxXDFcdTAxNGFcM1x1MDEyMSIrCi0gICAgIlwxXHUwMTRhXDVcdTAxMjFcMVwwXDJcdTAxMjNcMVx1MDE0Y1wxXDBcMVx1MDE0OVwxMVx1MDEyMyIrCi0gICAgIlwyXDBcNTNcdTAxMjNcMVwwXDJcdTAxMjRcMVx1MDE0ZFwxXDBcM1x1MDEyNFwxXHUwMTQ5IisKLSAgICAiXDZcdTAxMjRcMlwwXDUzXHUwMTI0XDFcMFwxXHUwMTRlXDFcNjBcMVwyMDdcMVw2MCIrCi0gICAgIlwxXDBcMVw2MFwxXHUwMTRlXDFcMFwxXDYwXDFcMFwxXDYwXDNcMCIrCi0gICAgIlwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwXDEzXDBcMVx1MDE0ZVwyXDYwIisKLSAgICAiXDFcdTAxNGVcMlw2MFwxXHUwMTRlXDJcNjBcMVwwXDRcNjBcMVwwXDFcdTAxNGUiKwotICAgICJcMlw2MFwxXDBcMVx1MDE0ZVwyXDYwXDRcMFwxXHUwMTRmXDFcNjRcMVwyMTIiKwotICAgICJcMVw2NFwxXDBcMVw2NFwxXHUwMTRmXDFcMFwxXDY0XDFcMFwxXDY0IisKLSAgICAiXDNcMFwyXDY0XDJcMFwzXDY0XDFcMFwxXDY0XDEzXDBcMVx1MDE0ZiIrCi0gICAgIlwyXDY0XDFcdTAxNGZcMlw2NFwxXHUwMTRmXDJcNjRcMVwwXDRcNjRcMVwwIisKLSAgICAiXDFcdTAxNGZcMlw2NFwxXDBcMVx1MDE0ZlwyXDY0XDRcMFwxXHUwMTUwXDFcNzEiKwotICAgICJcMVwyMTVcMVw3MVwxXDBcMVw3MVwxXHUwMTUwXDFcMFwxXDcxXDFcMCIrCi0gICAgIlwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxXDFcMFwxXDcxXDEzXDAiKwotICAgICJcMVx1MDE1MFwyXDcxXDFcdTAxNTBcMlw3MVwxXHUwMTUwXDJcNzFcMVwwXDRcNzEiKwotICAgICJcMVwwXDFcdTAxNTBcMlw3MVwxXDBcMVx1MDE1MFwyXDcxXDRcMFwxXHUwMTUxIisKLSAgICAiXDFcMTAxXDFcMjIxXDFcMTAxXDFcMFwxXDEwMVwxXHUwMTUxXDFcMFwxXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMTNcMFwxXHUwMTUxXDJcMTAxXDFcdTAxNTFcMlwxMDFcMVx1MDE1MVwyXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDFcdTAxNTFcMlwxMDFcMVwwXDFcdTAxNTFcMlwxMDFcNFwwIisKLSAgICAiXDFcdTAxNTJcMVwxMDdcMVwyMjRcMVwxMDdcMVwwXDFcMTA3XDFcdTAxNTJcMVwwIisKLSAgICAiXDFcMTA3XDFcMFwxXDEwN1wzXDBcMlwxMDdcMlwwXDNcMTA3XDFcMCIrCi0gICAgIlwxXDEwN1wxM1wwXDFcdTAxNTJcMlwxMDdcMVx1MDE1MlwyXDEwN1wxXHUwMTUyXDJcMTA3IisKLSAgICAiXDFcMFw0XDEwN1wxXDBcMVx1MDE1MlwyXDEwN1wxXDBcMVx1MDE1MlwyXDEwNyIrCi0gICAgIlw0XDBcMVx1MDE1M1wxXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFwxXDIyNlwxXHUwMTUzIisKLSAgICAiXDMzXDIyNlwxXHUwMTUzXDJcMjI2XDFcdTAxNTNcMlwyMjZcMVx1MDE1M1wxMFwyMjZcMVx1MDE1MyIrCi0gICAgIlwzXDIyNlwxXHUwMTUzXDVcMjI2XDFcMFwxXHUwMTU0XDFcMjMxXDFcMjMyXDNcMjMxIisKLSAgICAiXDFcdTAxNTRcMVwyMzBcMzJcMjMxXDFcdTAxNTRcMlwyMzFcMVx1MDE1NFwyXDIzMVwxXHUwMTU0IisKLSAgICAiXDEwXDIzMVwxXHUwMTU0XDNcMjMxXDFcdTAxNTRcNVwyMzFcMVwwXDFcdTAxNTVcMVwxMTQiKwotICAgICJcMVwyMzRcMVwxMTRcMVwwXDFcMTE0XDFcdTAxNTVcMVwwXDFcMTE0XDFcMCIrCi0gICAgIlwxXDExNFwzXDBcMlwxMTRcMlwwXDNcMTE0XDFcMFwxXDExNFwxM1wwIisKLSAgICAiXDFcdTAxNTVcMlwxMTRcMVx1MDE1NVwyXDExNFwxXHUwMTU1XDJcMTE0XDFcMFw0XDExNCIrCi0gICAgIlwxXDBcMVx1MDE1NVwyXDExNFwxXDBcMVx1MDE1NVwyXDExNFw0XDBcMVx1MDE1NiIrCi0gICAgIlwxXDIzN1wxXDI0MFwxXDIzN1wxXDBcMVwyMzdcMVx1MDE1NlwxXDBcMVwyMzciKwotICAgICJcMVwwXDFcMjM3XDNcMFwyXDIzN1wyXDBcM1wyMzdcMVwwXDFcMjM3IisKLSAgICAiXDEzXDBcMVx1MDE1NlwyXDIzN1wxXHUwMTU2XDJcMjM3XDFcdTAxNTZcMlwyMzdcMVwwIisKLSAgICAiXDRcMjM3XDFcMFwxXHUwMTU2XDJcMjM3XDFcMFwxXHUwMTU2XDJcMjM3XDRcMCIrCi0gICAgIlwxXHUwMTU3XDFcMTIyXDFcMjQzXDFcMTIyXDFcMFwxXDEyMlwxXHUwMTU3XDFcMCIrCi0gICAgIlwxXDEyMlwxXDBcMVwxMjJcM1wwXDJcMTIyXDJcMFwzXDEyMlwxXDI0NCIrCi0gICAgIlwxXDEyMlwxM1wwXDFcdTAxNTdcMlwxMjJcMVx1MDE1N1wyXDEyMlwxXHUwMTU3XDJcMTIyIisKLSAgICAiXDFcMFw0XDEyMlwxXDBcMVx1MDE1N1wyXDEyMlwxXDBcMVx1MDE1N1wyXDEyMiIrCi0gICAgIlw0XDBcMVx1MDE1OFwxXDI0NlwxXDI0N1wxXDI0NlwxXDI1MFwxXDI0NlwxXHUwMTU4IisKLSAgICAiXDMzXDI0NlwxXHUwMTU4XDJcMjQ2XDFcdTAxNThcMlwyNDZcMVx1MDE1OFwxMFwyNDZcMVx1MDE1OCIrCi0gICAgIlwzXDI0NlwxXHUwMTU4XDVcMjQ2XDFcMFwxXHUwMTU5XDFcMjUxXDFcMjUyXDNcMjUxIisKLSAgICAiXDFcdTAxNTlcMVwyNTBcMzJcMjUxXDFcdTAxNTlcMlwyNTFcMVx1MDE1OVwyXDI1MVwxXHUwMTU5IisKLSAgICAiXDEwXDI1MVwxXHUwMTU5XDNcMjUxXDFcdTAxNTlcNVwyNTFcMVwwXDFcdTAxNWFcMVwyNTYiKwotICAgICJcMVwyNTdcMVwyNTZcMVwwXDFcMjU2XDFcdTAxNWFcMVwwXDFcMjU2XDFcMCIrCi0gICAgIlwxXDI1NlwzXDBcMlwyNTZcMlwwXDNcMjU2XDFcMFwxXDI1NlwxM1wwIisKLSAgICAiXDFcdTAxNWFcMlwyNTZcMVx1MDE1YVwyXDI1NlwxXHUwMTVhXDJcMjU2XDFcMFw0XDI1NiIrCi0gICAgIlwxXDBcMVx1MDE1YVwyXDI1NlwxXDBcMVx1MDE1YVwyXDI1Nlw0XDBcMVx1MDE1YiIrCi0gICAgIlw1XDBcMVx1MDE1YlwzXDBcMVx1MDEwZFw1XDBcMVx1MDE1Ylw1XDBcMVx1MDE1YiIrCi0gICAgIlwxM1wwXDJcdTAxNWJcMVwwXDJcdTAxNWJcMVwwXDJcdTAxNWJcN1wwXDJcdTAxNWIiKwotICAgICJcMlwwXDJcdTAxNWJcNVwwXDFcdTAxNWNcNVwwXDFcdTAxNWNcMTFcMFwxXHUwMTVjIisKLSAgICAiXDVcMFwxXHUwMTVjXDEzXDBcMlx1MDE1Y1wxXDBcMlx1MDE1Y1wxXDBcMlx1MDE1YyIrCi0gICAgIlw3XDBcMlx1MDE1Y1wyXDBcMlx1MDE1Y1w1XDBcMlx1MDEzNVwxXHUwMTM2XDFcdTAxNWQiKwotICAgICJcMVwwXDJcdTAxMzVcMVwwXDFcdTAxNWRcMVx1MDEzYVw0XHUwMTM1XDJcdTAxNWRcNVx1MDEzNSIrCi0gICAgIlwxXDBcNDVcdTAxMzVcMVwwXDFcdTAxNWVcMVx1MDEzNVwxXHUwMTM2XDFcdTAxNWRcMlx1MDEzNSIrCi0gICAgIlwxXHUwMTVlXDFcdTAxMzVcMVx1MDE1ZFwxXHUwMTVmXDRcdTAxMzVcMlx1MDE1ZFwyMlx1MDEzNVwxXHUwMTVlIisKLSAgICAiXDJcdTAxMzVcMVx1MDE1ZVwyXHUwMTM1XDFcdTAxNWVcMTBcdTAxMzVcMVx1MDE1ZVwzXHUwMTM1XDFcdTAxNWUiKwotICAgICJcNVx1MDEzNVwxXDBcMlx1MDEzOFwxXHUwMTYwXDFcMFwxXHUwMTVkXDExXHUwMTM4XDJcMCIrCi0gICAgIlw1M1x1MDEzOFwxXDBcMlx1MDEzOVwxXHUwMTYxXDFcMFwzXHUwMTM5XDFcdTAxNWRcNlx1MDEzOSIrCi0gICAgIlwyXDBcNTNcdTAxMzlcMjRcMFwxXHUwMTYyXDUwXDBcMVx1MDE2M1wxXDMyXDFcMTQ3IisKLSAgICAiXDFcMzJcMVwwXDFcMzJcMVx1MDE2M1wxXDBcMVwzMlwxXDBcMVwzMiIrCi0gICAgIlwzXDBcMlwzMlwyXDBcM1wzMlwxXDBcMVwzMlwxM1wwXDFcdTAxNjMiKwotICAgICJcMlwzMlwxXHUwMTYzXDJcMzJcMVx1MDE2M1wyXDMyXDFcMFw0XDMyXDFcMCIrCi0gICAgIlwxXHUwMTYzXDJcMzJcMVwwXDFcdTAxNjNcMlwzMlw0XDBcMVx1MDE2NFwxXDE1MiIrCi0gICAgIlwxXDE1M1wxXDE1MlwxXDBcMVwxNTJcMVx1MDE2NFwxXDBcMVwxNTJcMVwwIisKLSAgICAiXDFcMTUyXDNcMFwyXDE1MlwyXDBcM1wxNTJcMVwwXDFcMTUyXDEzXDAiKwotICAgICJcMVx1MDE2NFwyXDE1MlwxXHUwMTY0XDJcMTUyXDFcdTAxNjRcMlwxNTJcMVwwXDRcMTUyIisKLSAgICAiXDFcMFwxXHUwMTY0XDJcMTUyXDFcMFwxXHUwMTY0XDJcMTUyXDRcMFwxXHUwMTY1IisKLSAgICAiXDFcMTU0XDFcMTU1XDFcMTU0XDFcMFwxXDE1NFwxXHUwMTY1XDFcMFwxXDE1NCIrCi0gICAgIlwxXDBcMVwxNTRcM1wwXDJcMTU0XDJcMFwzXDE1NFwxXDBcMVwxNTQiKwotICAgICJcMTNcMFwxXHUwMTY1XDJcMTU0XDFcdTAxNjVcMlwxNTRcMVx1MDE2NVwyXDE1NFwxXDAiKwotICAgICJcNFwxNTRcMVwwXDFcdTAxNjVcMlwxNTRcMVwwXDFcdTAxNjVcMlwxNTRcNTRcMCIrCi0gICAgIlwyXHUwMTY2XDc0XDBcMVx1MDE2N1wxMDZcMFwyXHUwMTY4XDVcMFwxXHUwMTY5XDFcMzY3IisKLSAgICAiXDFcMzcwXDFcMzY3XDFcMFwxXDM2N1wxXHUwMTY5XDFcMFwxXDM2N1wxXHUwMTFhIisKLSAgICAiXDFcMzY3XDNcMFwyXDM2N1wyXDBcM1wzNjdcMVwwXDFcMzY3XDEzXDAiKwotICAgICJcMVx1MDE2OVwyXDM2N1wxXHUwMTY5XDJcMzY3XDFcdTAxNjlcMlwzNjdcMVwwXDRcMzY3IisKLSAgICAiXDFcMFwxXHUwMTY5XDJcMzY3XDFcMFwxXHUwMTY5XDJcMzY3XDRcMFwxXHUwMTZhIisKLSAgICAiXDFcMTcxXDFcMTcyXDFcMTcxXDFcMFwxXDE3MVwxXHUwMTZhXDFcMFwxXDE3MSIrCi0gICAgIlwxXDBcMVwxNzFcM1wwXDJcMTcxXDJcMFwzXDE3MVwxXDMwNFwxXDE3MSIrCi0gICAgIlwxM1wwXDFcdTAxNmFcMlwxNzFcMVx1MDE2YVwyXDE3MVwxXHUwMTZhXDJcMTcxXDFcMCIrCi0gICAgIlw0XDE3MVwxXDBcMVx1MDE2YVwyXDE3MVwxXDBcMVx1MDE2YVwyXDE3MVw0XDAiKwotICAgICJcMVx1MDE2YlwxXDE3M1wxXDE3NFwxXDE3M1wxXDE3NVwxXDE3M1wxXHUwMTZiXDMzXDE3MyIrCi0gICAgIlwxXHUwMTZiXDJcMTczXDFcdTAxNmJcMlwxNzNcMVx1MDE2YlwxMFwxNzNcMVx1MDE2YlwzXDE3MyIrCi0gICAgIlwxXHUwMTZiXDVcMTczXDFcMFwxXHUwMTZjXDFcMTc2XDFcMTc3XDNcMTc2XDFcdTAxNmMiKwotICAgICJcMVwxNzVcMzJcMTc2XDFcdTAxNmNcMlwxNzZcMVx1MDE2Y1wyXDE3NlwxXHUwMTZjXDEwXDE3NiIrCi0gICAgIlwxXHUwMTZjXDNcMTc2XDFcdTAxNmNcNVwxNzZcMVwwXDFcdTAxNmRcMVwyMDFcMVwyMDIiKwotICAgICJcMVwyMDFcMVwyMDNcMVwyMDFcMVx1MDE2ZFwzM1wyMDFcMVx1MDE2ZFwyXDIwMVwxXHUwMTZkIisKLSAgICAiXDJcMjAxXDFcdTAxNmRcMTBcMjAxXDFcdTAxNmRcM1wyMDFcMVx1MDE2ZFw1XDIwMVwxXDAiKwotICAgICJcMVx1MDE2ZVwxXDIwNFwxXDIwNVwzXDIwNFwxXHUwMTZlXDFcMjAzXDMyXDIwNFwxXHUwMTZlIisKLSAgICAiXDJcMjA0XDFcdTAxNmVcMlwyMDRcMVx1MDE2ZVwxMFwyMDRcMVx1MDE2ZVwzXDIwNFwxXHUwMTZlIisKLSAgICAiXDVcMjA0XDRcMFwxXHUwMTQ5XDFcMFwxXHUwMTQ5XDJcMFwxXHUwMTQ5XDFcdTAxMjUiKwotICAgICJcNFwwXDJcdTAxNDlcNTRcMFwxXHUwMTZmXDFcdTAxMjFcMVx1MDEyMlwxXHUwMTIxXDFcMCIrCi0gICAgIlwxXHUwMTIxXDFcdTAxNmZcMVwwXDFcdTAxMjFcMVx1MDEyNVwxM1x1MDEyMVwxXDBcMTRcdTAxMjEiKwotICAgICJcMVx1MDE2ZlwyXHUwMTIxXDFcdTAxNmZcMlx1MDEyMVwxXHUwMTZmXDEwXHUwMTIxXDFcdTAxNmZcM1x1MDEyMSIrCi0gICAgIlwxXHUwMTZmXDVcdTAxMjFcMVwwXDFcdTAxNzBcMVx1MDEyM1wxXHUwMTRjXDFcdTAxMjNcMVx1MDE3MSIrCi0gICAgIlwxXHUwMTIzXDFcdTAxNzBcMTBcdTAxMjNcMVx1MDE3MlwyMlx1MDEyM1wxXHUwMTcwXDJcdTAxMjNcMVx1MDE3MCIrCi0gICAgIlwyXHUwMTIzXDFcdTAxNzBcMTBcdTAxMjNcMVx1MDE3MFwzXHUwMTIzXDFcdTAxNzBcNVx1MDEyM1wxXDAiKwotICAgICJcMVx1MDE3M1wxXHUwMTI0XDFcdTAxNGRcM1x1MDEyNFwxXHUwMTczXDFcdTAxNzRcN1x1MDEyNFwxXHUwMTc1IisKLSAgICAiXDIyXHUwMTI0XDFcdTAxNzNcMlx1MDEyNFwxXHUwMTczXDJcdTAxMjRcMVx1MDE3M1wxMFx1MDEyNFwxXHUwMTczIisKLSAgICAiXDNcdTAxMjRcMVx1MDE3M1w1XHUwMTI0XDFcMFwxXHUwMTc2XDFcNjBcMVwyMDdcMVw2MCIrCi0gICAgIlwxXDBcMVw2MFwxXHUwMTc2XDFcMFwxXDYwXDFcMFwxXDYwXDNcMCIrCi0gICAgIlwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwXDEzXDBcMVx1MDE3NlwyXDYwIisKLSAgICAiXDFcdTAxNzZcMlw2MFwxXHUwMTc2XDJcNjBcMVwwXDRcNjBcMVwwXDFcdTAxNzYiKwotICAgICJcMlw2MFwxXDBcMVx1MDE3NlwyXDYwXDRcMFwxXHUwMTc3XDFcNjRcMVwyMTIiKwotICAgICJcMVw2NFwxXDBcMVw2NFwxXHUwMTc3XDFcMFwxXDY0XDFcMFwxXDY0IisKLSAgICAiXDNcMFwyXDY0XDJcMFwzXDY0XDFcMFwxXDY0XDEzXDBcMVx1MDE3NyIrCi0gICAgIlwyXDY0XDFcdTAxNzdcMlw2NFwxXHUwMTc3XDJcNjRcMVwwXDRcNjRcMVwwIisKLSAgICAiXDFcdTAxNzdcMlw2NFwxXDBcMVx1MDE3N1wyXDY0XDRcMFwxXHUwMTc4XDFcNzEiKwotICAgICJcMVwyMTVcMVw3MVwxXDBcMVw3MVwxXHUwMTc4XDFcMFwxXDcxXDFcMCIrCi0gICAgIlwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxXDFcMFwxXDcxXDEzXDAiKwotICAgICJcMVx1MDE3OFwyXDcxXDFcdTAxNzhcMlw3MVwxXHUwMTc4XDJcNzFcMVwwXDRcNzEiKwotICAgICJcMVwwXDFcdTAxNzhcMlw3MVwxXDBcMVx1MDE3OFwyXDcxXDRcMFwxXHUwMTc5IisKLSAgICAiXDFcMTAxXDFcMjIxXDFcMTAxXDFcMFwxXDEwMVwxXHUwMTc5XDFcMFwxXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMTNcMFwxXHUwMTc5XDJcMTAxXDFcdTAxNzlcMlwxMDFcMVx1MDE3OVwyXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDFcdTAxNzlcMlwxMDFcMVwwXDFcdTAxNzlcMlwxMDFcNFwwIisKLSAgICAiXDFcdTAxN2FcMVwxMDdcMVwyMjRcMVwxMDdcMVwwXDFcMTA3XDFcdTAxN2FcMVwwIisKLSAgICAiXDFcMTA3XDFcMFwxXDEwN1wzXDBcMlwxMDdcMlwwXDNcMTA3XDFcMCIrCi0gICAgIlwxXDEwN1wxM1wwXDFcdTAxN2FcMlwxMDdcMVx1MDE3YVwyXDEwN1wxXHUwMTdhXDJcMTA3IisKLSAgICAiXDFcMFw0XDEwN1wxXDBcMVx1MDE3YVwyXDEwN1wxXDBcMVx1MDE3YVwyXDEwNyIrCi0gICAgIlw0XDBcMVx1MDE3YlwxXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFwxXDIyNlwxXHUwMTdiIisKLSAgICAiXDMzXDIyNlwxXHUwMTdiXDJcMjI2XDFcdTAxN2JcMlwyMjZcMVx1MDE3YlwxMFwyMjZcMVx1MDE3YiIrCi0gICAgIlwzXDIyNlwxXHUwMTdiXDVcMjI2XDFcMFwxXHUwMTdjXDFcMjMxXDFcMjMyXDNcMjMxIisKLSAgICAiXDFcdTAxN2NcMVwyMzBcMzJcMjMxXDFcdTAxN2NcMlwyMzFcMVx1MDE3Y1wyXDIzMVwxXHUwMTdjIisKLSAgICAiXDEwXDIzMVwxXHUwMTdjXDNcMjMxXDFcdTAxN2NcNVwyMzFcMVwwXDFcdTAxN2RcMVwxMTQiKwotICAgICJcMVwyMzRcMVwxMTRcMVwwXDFcMTE0XDFcdTAxN2RcMVwwXDFcMTE0XDFcMCIrCi0gICAgIlwxXDExNFwzXDBcMlwxMTRcMlwwXDNcMTE0XDFcMFwxXDExNFwxM1wwIisKLSAgICAiXDFcdTAxN2RcMlwxMTRcMVx1MDE3ZFwyXDExNFwxXHUwMTdkXDJcMTE0XDFcMFw0XDExNCIrCi0gICAgIlwxXDBcMVx1MDE3ZFwyXDExNFwxXDBcMVx1MDE3ZFwyXDExNFw0XDBcMVx1MDE3ZSIrCi0gICAgIlwxXDIzN1wxXDI0MFwxXDIzN1wxXDBcMVwyMzdcMVx1MDE3ZVwxXDBcMVwyMzciKwotICAgICJcMVwwXDFcMjM3XDNcMFwyXDIzN1wyXDBcM1wyMzdcMVwwXDFcMjM3IisKLSAgICAiXDEzXDBcMVx1MDE3ZVwyXDIzN1wxXHUwMTdlXDJcMjM3XDFcdTAxN2VcMlwyMzdcMVwwIisKLSAgICAiXDRcMjM3XDFcMFwxXHUwMTdlXDJcMjM3XDFcMFwxXHUwMTdlXDJcMjM3XDRcMCIrCi0gICAgIlwxXHUwMTdmXDFcMTIyXDFcMjQzXDFcMTIyXDFcMFwxXDEyMlwxXHUwMTdmXDFcMCIrCi0gICAgIlwxXDEyMlwxXDBcMVwxMjJcM1wwXDJcMTIyXDJcMFwzXDEyMlwxXDI0NCIrCi0gICAgIlwxXDEyMlwxM1wwXDFcdTAxN2ZcMlwxMjJcMVx1MDE3ZlwyXDEyMlwxXHUwMTdmXDJcMTIyIisKLSAgICAiXDFcMFw0XDEyMlwxXDBcMVx1MDE3ZlwyXDEyMlwxXDBcMVx1MDE3ZlwyXDEyMiIrCi0gICAgIlw0XDBcMVx1MDE4MFwxXDI0NlwxXDI0N1wxXDI0NlwxXDI1MFwxXDI0NlwxXHUwMTgwIisKLSAgICAiXDMzXDI0NlwxXHUwMTgwXDJcMjQ2XDFcdTAxODBcMlwyNDZcMVx1MDE4MFwxMFwyNDZcMVx1MDE4MCIrCi0gICAgIlwzXDI0NlwxXHUwMTgwXDVcMjQ2XDFcMFwxXHUwMTgxXDFcMjUxXDFcMjUyXDNcMjUxIisKLSAgICAiXDFcdTAxODFcMVwyNTBcMzJcMjUxXDFcdTAxODFcMlwyNTFcMVx1MDE4MVwyXDI1MVwxXHUwMTgxIisKLSAgICAiXDEwXDI1MVwxXHUwMTgxXDNcMjUxXDFcdTAxODFcNVwyNTFcMVwwXDFcdTAxODJcMVwyNTYiKwotICAgICJcMVwyNTdcMVwyNTZcMVwwXDFcMjU2XDFcdTAxODJcMVwwXDFcMjU2XDFcMCIrCi0gICAgIlwxXDI1NlwzXDBcMlwyNTZcMlwwXDNcMjU2XDFcMFwxXDI1NlwxM1wwIisKLSAgICAiXDFcdTAxODJcMlwyNTZcMVx1MDE4MlwyXDI1NlwxXHUwMTgyXDJcMjU2XDFcMFw0XDI1NiIrCi0gICAgIlwxXDBcMVx1MDE4MlwyXDI1NlwxXDBcMVx1MDE4MlwyXDI1Nlw0XDBcMVx1MDE4MyIrCi0gICAgIlw1XDBcMVx1MDE4M1wzXDBcMVx1MDEwZFw1XDBcMVx1MDE4M1w1XDBcMVx1MDE4MyIrCi0gICAgIlwxM1wwXDJcdTAxODNcMVwwXDJcdTAxODNcMVwwXDJcdTAxODNcN1wwXDJcdTAxODMiKwotICAgICJcMlwwXDJcdTAxODNcNVwwXDFcdTAxODRcNVwwXDFcdTAxODRcMTFcMFwxXHUwMTg0IisKLSAgICAiXDVcMFwxXHUwMTg0XDEzXDBcMlx1MDE4NFwxXDBcMlx1MDE4NFwxXDBcMlx1MDE4NCIrCi0gICAgIlw3XDBcMlx1MDE4NFwyXDBcMlx1MDE4NFwxMFwwXDFcdTAxNWRcMVwwXDFcdTAxNWQiKwotICAgICJcMlwwXDFcdTAxNWRcMVx1MDEzYVw0XDBcMlx1MDE1ZFw1NFwwXDFcdTAxODVcMVx1MDEzNSIrCi0gICAgIlwxXHUwMTM2XDFcdTAxMzVcMVwwXDFcdTAxMzVcMVx1MDE4NVwxXDBcMVx1MDEzNVwxXHUwMTNhIisKLSAgICAiXDEzXHUwMTM1XDFcMFwxNFx1MDEzNVwxXHUwMTg1XDJcdTAxMzVcMVx1MDE4NVwyXHUwMTM1XDFcdTAxODUiKwotICAgICJcMTBcdTAxMzVcMVx1MDE4NVwzXHUwMTM1XDFcdTAxODVcNVx1MDEzNVwxXDBcMVx1MDE4NlwxXHUwMTM4IisKLSAgICAiXDFcdTAxNjBcMVx1MDEzOFwxXHUwMTg3XDFcdTAxMzhcMVx1MDE4NlwxMFx1MDEzOFwxXHUwMTg4XDIyXHUwMTM4IisKLSAgICAiXDFcdTAxODZcMlx1MDEzOFwxXHUwMTg2XDJcdTAxMzhcMVx1MDE4NlwxMFx1MDEzOFwxXHUwMTg2XDNcdTAxMzgiKwotICAgICJcMVx1MDE4Nlw1XHUwMTM4XDFcMFwxXHUwMTg5XDFcdTAxMzlcMVx1MDE2MVwzXHUwMTM5XDFcdTAxODkiKwotICAgICJcMVx1MDE4YVw3XHUwMTM5XDFcdTAxOGJcMjJcdTAxMzlcMVx1MDE4OVwyXHUwMTM5XDFcdTAxODlcMlx1MDEzOSIrCi0gICAgIlwxXHUwMTg5XDEwXHUwMTM5XDFcdTAxODlcM1x1MDEzOVwxXHUwMTg5XDVcdTAxMzlcNTNcMFwxXHUwMThjIisKLSAgICAiXDIxXDBcMlwzMlwxXDE0N1wxXDMyXDFcMFwyXDMyXDFcMFwxXDMyIisKLSAgICAiXDFcMFwxXDMyXDNcMFwyXDMyXDJcMFwzXDMyXDFcMFwxXDMyIisKLSAgICAiXDEzXDBcMTFcMzJcMVwwXDRcMzJcMVwwXDNcMzJcMVwwXDNcMzIiKwotICAgICJcNFwwXDFcdTAxOGRcMVwxNTJcMVwxNTNcMVwxNTJcMVwwXDFcMTUyXDFcdTAxOGQiKwotICAgICJcMVwwXDFcMTUyXDFcMFwxXDE1MlwzXDBcMlwxNTJcMlwwXDNcMTUyIisKLSAgICAiXDFcMFwxXDE1MlwxM1wwXDFcdTAxOGRcMlwxNTJcMVx1MDE4ZFwyXDE1MlwxXHUwMThkIisKLSAgICAiXDJcMTUyXDFcMFw0XDE1MlwxXDBcMVx1MDE4ZFwyXDE1MlwxXDBcMVx1MDE4ZCIrCi0gICAgIlwyXDE1Mlw0XDBcMVx1MDE4ZVwxXDE1NFwxXDE1NVwxXDE1NFwxXDBcMVwxNTQiKwotICAgICJcMVx1MDE4ZVwxXDBcMVwxNTRcMVwwXDFcMTU0XDNcMFwyXDE1NFwyXDAiKwotICAgICJcM1wxNTRcMVwwXDFcMTU0XDEzXDBcMVx1MDE4ZVwyXDE1NFwxXHUwMThlXDJcMTU0IisKLSAgICAiXDFcdTAxOGVcMlwxNTRcMVwwXDRcMTU0XDFcMFwxXHUwMThlXDJcMTU0XDFcMCIrCi0gICAgIlwxXHUwMThlXDJcMTU0XDU2XDBcMVx1MDE4Zlw2NlwwXDJcdTAxOTBcMjVcMFwxXHUwMTkxIisKLSAgICAiXDFcMzY3XDFcMzcwXDFcMzY3XDFcMFwxXDM2N1wxXHUwMTkxXDFcMFwxXDM2NyIrCi0gICAgIlwxXHUwMTFhXDFcMzY3XDNcMFwyXDM2N1wyXDBcM1wzNjdcMVwwXDFcMzY3IisKLSAgICAiXDEzXDBcMVx1MDE5MVwyXDM2N1wxXHUwMTkxXDJcMzY3XDFcdTAxOTFcMlwzNjdcMVwwIisKLSAgICAiXDRcMzY3XDFcMFwxXHUwMTkxXDJcMzY3XDFcMFwxXHUwMTkxXDJcMzY3XDRcMCIrCi0gICAgIlwxXHUwMTkyXDFcMTcxXDFcMTcyXDFcMTcxXDFcMFwxXDE3MVwxXHUwMTkyXDFcMCIrCi0gICAgIlwxXDE3MVwxXDBcMVwxNzFcM1wwXDJcMTcxXDJcMFwzXDE3MVwxXDMwNCIrCi0gICAgIlwxXDE3MVwxM1wwXDFcdTAxOTJcMlwxNzFcMVx1MDE5MlwyXDE3MVwxXHUwMTkyXDJcMTcxIisKLSAgICAiXDFcMFw0XDE3MVwxXDBcMVx1MDE5MlwyXDE3MVwxXDBcMVx1MDE5MlwyXDE3MSIrCi0gICAgIlw0XDBcMVx1MDE5M1wxXDE3M1wxXDE3NFwxXDE3M1wxXDE3NVwxXDE3M1wxXHUwMTkzIisKLSAgICAiXDMzXDE3M1wxXHUwMTkzXDJcMTczXDFcdTAxOTNcMlwxNzNcMVx1MDE5M1wxMFwxNzNcMVx1MDE5MyIrCi0gICAgIlwzXDE3M1wxXHUwMTkzXDVcMTczXDFcMFwxXHUwMTk0XDFcMTc2XDFcMTc3XDNcMTc2IisKLSAgICAiXDFcdTAxOTRcMVwxNzVcMzJcMTc2XDFcdTAxOTRcMlwxNzZcMVx1MDE5NFwyXDE3NlwxXHUwMTk0IisKLSAgICAiXDEwXDE3NlwxXHUwMTk0XDNcMTc2XDFcdTAxOTRcNVwxNzZcMVwwXDFcdTAxOTVcMVwyMDEiKwotICAgICJcMVwyMDJcMVwyMDFcMVwyMDNcMVwyMDFcMVx1MDE5NVwzM1wyMDFcMVx1MDE5NVwyXDIwMSIrCi0gICAgIlwxXHUwMTk1XDJcMjAxXDFcdTAxOTVcMTBcMjAxXDFcdTAxOTVcM1wyMDFcMVx1MDE5NVw1XDIwMSIrCi0gICAgIlwxXDBcMVx1MDE5NlwxXDIwNFwxXDIwNVwzXDIwNFwxXHUwMTk2XDFcMjAzXDMyXDIwNCIrCi0gICAgIlwxXHUwMTk2XDJcMjA0XDFcdTAxOTZcMlwyMDRcMVx1MDE5NlwxMFwyMDRcMVx1MDE5NlwzXDIwNCIrCi0gICAgIlwxXHUwMTk2XDVcMjA0XDFcMFwxXHUwMTk3XDFcdTAxMjFcMVx1MDEyMlwxXHUwMTIxXDFcMCIrCi0gICAgIlwxXHUwMTIxXDFcdTAxOTdcMVwwXDFcdTAxMjFcMVx1MDEyNVwxM1x1MDEyMVwxXDBcMTRcdTAxMjEiKwotICAgICJcMVx1MDE5N1wyXHUwMTIxXDFcdTAxOTdcMlx1MDEyMVwxXHUwMTk3XDEwXHUwMTIxXDFcdTAxOTdcM1x1MDEyMSIrCi0gICAgIlwxXHUwMTk3XDVcdTAxMjFcMVwwXDFcdTAxOThcMVx1MDEyM1wxXHUwMTRjXDFcdTAxMjNcMVx1MDE0OSIrCi0gICAgIlwxXHUwMTIzXDFcdTAxOThcMzNcdTAxMjNcMVx1MDE5OFwyXHUwMTIzXDFcdTAxOThcMlx1MDEyM1wxXHUwMTk4IisKLSAgICAiXDEwXHUwMTIzXDFcdTAxOThcM1x1MDEyM1wxXHUwMTk4XDVcdTAxMjNcMVwwXDJcdTAxMjNcMVx1MDE0YyIrCi0gICAgIlwyXHUwMTQ5XDFcdTAxNzFcMlx1MDEyM1wxXHUwMTcxXDFcdTAxOTlcNFx1MDEyM1wyXHUwMTQ5XDUzXHUwMTIzIisKLSAgICAiXDFcMFwyXHUwMTIzXDFcdTAxNGNcMVwwXDFcdTAxNDlcMTJcdTAxMjNcMVwwXDUzXHUwMTIzIisKLSAgICAiXDFcMFwxXHUwMTlhXDFcdTAxMjRcMVx1MDE0ZFwzXHUwMTI0XDFcdTAxOWFcMVx1MDE0OVwzMlx1MDEyNCIrCi0gICAgIlwxXHUwMTlhXDJcdTAxMjRcMVx1MDE5YVwyXHUwMTI0XDFcdTAxOWFcMTBcdTAxMjRcMVx1MDE5YVwzXHUwMTI0IisKLSAgICAiXDFcdTAxOWFcNVx1MDEyNFwxXDBcMlx1MDEyNFwxXHUwMTRkXDFcdTAxNDlcMVx1MDEyNFwxXHUwMTc0IisKLSAgICAiXDFcdTAxMjRcMVx1MDE0OVwxXHUwMTc0XDFcdTAxOWJcNFx1MDEyNFwyXHUwMTQ5XDUzXHUwMTI0XDFcMCIrCi0gICAgIlwyXHUwMTI0XDFcdTAxNGRcMVwwXDNcdTAxMjRcMVx1MDE0OVw3XHUwMTI0XDFcMFw1M1x1MDEyNCIrCi0gICAgIlwxXDBcMlw2MFwxXDIwN1wxXDYwXDFcMFwyXDYwXDFcMFwxXDYwIisKLSAgICAiXDFcMFwxXDYwXDNcMFwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwIisKLSAgICAiXDEzXDBcMTFcNjBcMVwwXDRcNjBcMVwwXDNcNjBcMVwwXDNcNjAiKwotICAgICJcNFwwXDJcNjRcMVwyMTJcMVw2NFwxXDBcMlw2NFwxXDBcMVw2NCIrCi0gICAgIlwxXDBcMVw2NFwzXDBcMlw2NFwyXDBcM1w2NFwxXDBcMVw2NCIrCi0gICAgIlwxM1wwXDExXDY0XDFcMFw0XDY0XDFcMFwzXDY0XDFcMFwzXDY0IisKLSAgICAiXDRcMFwyXDcxXDFcMjE1XDFcNzFcMVwwXDJcNzFcMVwwXDFcNzEiKwotICAgICJcMVwwXDFcNzFcM1wwXDJcNzFcMlwwXDNcNzFcMVwwXDFcNzEiKwotICAgICJcMTNcMFwxMVw3MVwxXDBcNFw3MVwxXDBcM1w3MVwxXDBcM1w3MSIrCi0gICAgIlw0XDBcMlwxMDFcMVwyMjFcMVwxMDFcMVwwXDJcMTAxXDFcMFwxXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMTNcMFwxMVwxMDFcMVwwXDRcMTAxXDFcMFwzXDEwMVwxXDBcM1wxMDEiKwotICAgICJcNFwwXDJcMTA3XDFcMjI0XDFcMTA3XDFcMFwyXDEwN1wxXDBcMVwxMDciKwotICAgICJcMVwwXDFcMTA3XDNcMFwyXDEwN1wyXDBcM1wxMDdcMVwwXDFcMTA3IisKLSAgICAiXDEzXDBcMTFcMTA3XDFcMFw0XDEwN1wxXDBcM1wxMDdcMVwwXDNcMTA3IisKLSAgICAiXDRcMFwxXHUwMTljXDFcMjI2XDFcMjI3XDFcMjI2XDFcMjMwXDFcMjI2XDFcdTAxOWMiKwotICAgICJcMzNcMjI2XDFcdTAxOWNcMlwyMjZcMVx1MDE5Y1wyXDIyNlwxXHUwMTljXDEwXDIyNlwxXHUwMTljIisKLSAgICAiXDNcMjI2XDFcdTAxOWNcNVwyMjZcMVwwXDFcdTAxOWRcMVwyMzFcMVwyMzJcM1wyMzEiKwotICAgICJcMVx1MDE5ZFwxXDIzMFwzMlwyMzFcMVx1MDE5ZFwyXDIzMVwxXHUwMTlkXDJcMjMxXDFcdTAxOWQiKwotICAgICJcMTBcMjMxXDFcdTAxOWRcM1wyMzFcMVx1MDE5ZFw1XDIzMVwxXDBcMlwxMTRcMVwyMzQiKwotICAgICJcMVwxMTRcMVwwXDJcMTE0XDFcMFwxXDExNFwxXDBcMVwxMTRcM1wwIisKLSAgICAiXDJcMTE0XDJcMFwzXDExNFwxXDBcMVwxMTRcMTNcMFwxMVwxMTRcMVwwIisKLSAgICAiXDRcMTE0XDFcMFwzXDExNFwxXDBcM1wxMTRcNFwwXDFcdTAxOWVcMVwyMzciKwotICAgICJcMVwyNDBcMVwyMzdcMVwwXDFcMjM3XDFcdTAxOWVcMVwwXDFcMjM3XDFcMCIrCi0gICAgIlwxXDIzN1wzXDBcMlwyMzdcMlwwXDNcMjM3XDFcMFwxXDIzN1wxM1wwIisKLSAgICAiXDFcdTAxOWVcMlwyMzdcMVx1MDE5ZVwyXDIzN1wxXHUwMTllXDJcMjM3XDFcMFw0XDIzNyIrCi0gICAgIlwxXDBcMVx1MDE5ZVwyXDIzN1wxXDBcMVx1MDE5ZVwyXDIzN1w0XDBcMlwxMjIiKwotICAgICJcMVwyNDNcMVwxMjJcMVwwXDJcMTIyXDFcMFwxXDEyMlwxXDBcMVwxMjIiKwotICAgICJcM1wwXDJcMTIyXDJcMFwzXDEyMlwxXDI0NFwxXDEyMlwxM1wwXDExXDEyMiIrCi0gICAgIlwxXDBcNFwxMjJcMVwwXDNcMTIyXDFcMFwzXDEyMlw0XDBcMVx1MDE5ZiIrCi0gICAgIlwxXDI0NlwxXDI0N1wxXDI0NlwxXDI1MFwxXDI0NlwxXHUwMTlmXDMzXDI0NlwxXHUwMTlmIisKLSAgICAiXDJcMjQ2XDFcdTAxOWZcMlwyNDZcMVx1MDE5ZlwxMFwyNDZcMVx1MDE5ZlwzXDI0NlwxXHUwMTlmIisKLSAgICAiXDVcMjQ2XDFcMFwxXHUwMWEwXDFcMjUxXDFcMjUyXDNcMjUxXDFcdTAxYTBcMVwyNTAiKwotICAgICJcMzJcMjUxXDFcdTAxYTBcMlwyNTFcMVx1MDFhMFwyXDI1MVwxXHUwMWEwXDEwXDI1MVwxXHUwMWEwIisKLSAgICAiXDNcMjUxXDFcdTAxYTBcNVwyNTFcMVwwXDFcdTAxYTFcMVwyNTZcMVwyNTdcMVwyNTYiKwotICAgICJcMVwwXDFcMjU2XDFcdTAxYTFcMVwwXDFcMjU2XDFcMFwxXDI1NlwzXDAiKwotICAgICJcMlwyNTZcMlwwXDNcMjU2XDFcMFwxXDI1NlwxM1wwXDFcdTAxYTFcMlwyNTYiKwotICAgICJcMVx1MDFhMVwyXDI1NlwxXHUwMWExXDJcMjU2XDFcMFw0XDI1NlwxXDBcMVx1MDFhMSIrCi0gICAgIlwyXDI1NlwxXDBcMVx1MDFhMVwyXDI1Nlw0XDBcMVx1MDFhMlw1XDBcMVx1MDFhMiIrCi0gICAgIlwzXDBcMVx1MDEwZFw1XDBcMVx1MDFhMlw1XDBcMVx1MDFhMlwxM1wwXDJcdTAxYTIiKwotICAgICJcMVwwXDJcdTAxYTJcMVwwXDJcdTAxYTJcN1wwXDJcdTAxYTJcMlwwXDJcdTAxYTIiKwotICAgICJcNVwwXDFcdTAxYTNcNVwwXDFcdTAxYTNcMTFcMFwxXHUwMWEzXDVcMFwxXHUwMWEzIisKLSAgICAiXDEzXDBcMlx1MDFhM1wxXDBcMlx1MDFhM1wxXDBcMlx1MDFhM1w3XDBcMlx1MDFhMyIrCi0gICAgIlwyXDBcMlx1MDFhM1w1XDBcMVx1MDFhNFwxXHUwMTM1XDFcdTAxMzZcMVx1MDEzNVwxXDAiKwotICAgICJcMVx1MDEzNVwxXHUwMWE0XDFcMFwxXHUwMTM1XDFcdTAxM2FcMTNcdTAxMzVcMVwwXDE0XHUwMTM1IisKLSAgICAiXDFcdTAxYTRcMlx1MDEzNVwxXHUwMWE0XDJcdTAxMzVcMVx1MDFhNFwxMFx1MDEzNVwxXHUwMWE0XDNcdTAxMzUiKwotICAgICJcMVx1MDFhNFw1XHUwMTM1XDFcMFwxXHUwMWE1XDFcdTAxMzhcMVx1MDE2MFwxXHUwMTM4XDFcdTAxNWQiKwotICAgICJcMVx1MDEzOFwxXHUwMWE1XDMzXHUwMTM4XDFcdTAxYTVcMlx1MDEzOFwxXHUwMWE1XDJcdTAxMzhcMVx1MDFhNSIrCi0gICAgIlwxMFx1MDEzOFwxXHUwMWE1XDNcdTAxMzhcMVx1MDFhNVw1XHUwMTM4XDFcMFwyXHUwMTM4XDFcdTAxNjAiKwotICAgICJcMlx1MDE1ZFwxXHUwMTg3XDJcdTAxMzhcMVx1MDE4N1wxXHUwMWE2XDRcdTAxMzhcMlx1MDE1ZFw1M1x1MDEzOCIrCi0gICAgIlwxXDBcMlx1MDEzOFwxXHUwMTYwXDFcMFwxXHUwMTVkXDEyXHUwMTM4XDFcMFw1M1x1MDEzOCIrCi0gICAgIlwxXDBcMVx1MDFhN1wxXHUwMTM5XDFcdTAxNjFcM1x1MDEzOVwxXHUwMWE3XDFcdTAxNWRcMzJcdTAxMzkiKwotICAgICJcMVx1MDFhN1wyXHUwMTM5XDFcdTAxYTdcMlx1MDEzOVwxXHUwMWE3XDEwXHUwMTM5XDFcdTAxYTdcM1x1MDEzOSIrCi0gICAgIlwxXHUwMWE3XDVcdTAxMzlcMVwwXDJcdTAxMzlcMVx1MDE2MVwxXHUwMTVkXDFcdTAxMzlcMVx1MDE4YSIrCi0gICAgIlwxXHUwMTM5XDFcdTAxNWRcMVx1MDE4YVwxXHUwMWE4XDRcdTAxMzlcMlx1MDE1ZFw1M1x1MDEzOVwxXDAiKwotICAgICJcMlx1MDEzOVwxXHUwMTYxXDFcMFwzXHUwMTM5XDFcdTAxNWRcN1x1MDEzOVwxXDBcNTNcdTAxMzkiKwotICAgICJcNDZcMFwyXHUwMWE5XDI1XDBcMlwxNTJcMVwxNTNcMVwxNTJcMVwwXDJcMTUyIisKLSAgICAiXDFcMFwxXDE1MlwxXDBcMVwxNTJcM1wwXDJcMTUyXDJcMFwzXDE1MiIrCi0gICAgIlwxXDBcMVwxNTJcMTNcMFwxMVwxNTJcMVwwXDRcMTUyXDFcMFwzXDE1MiIrCi0gICAgIlwxXDBcM1wxNTJcNFwwXDJcMTU0XDFcMTU1XDFcMTU0XDFcMFwyXDE1NCIrCi0gICAgIlwxXDBcMVwxNTRcMVwwXDFcMTU0XDNcMFwyXDE1NFwyXDBcM1wxNTQiKwotICAgICJcMVwwXDFcMTU0XDEzXDBcMTFcMTU0XDFcMFw0XDE1NFwxXDBcM1wxNTQiKwotICAgICJcMVwwXDNcMTU0XDQ2XDBcMlx1MDFhYVwzMFwwXDFcdTAxYWJcMVwzNjdcMVwzNzAiKwotICAgICJcMVwzNjdcMVwwXDFcMzY3XDFcdTAxYWJcMVwwXDFcMzY3XDFcdTAxMWFcMVwzNjciKwotICAgICJcM1wwXDJcMzY3XDJcMFwzXDM2N1wxXDBcMVwzNjdcMTNcMFwxXHUwMWFiIisKLSAgICAiXDJcMzY3XDFcdTAxYWJcMlwzNjdcMVx1MDFhYlwyXDM2N1wxXDBcNFwzNjdcMVwwIisKLSAgICAiXDFcdTAxYWJcMlwzNjdcMVwwXDFcdTAxYWJcMlwzNjdcNFwwXDJcMTcxXDFcMTcyIisKLSAgICAiXDFcMTcxXDFcMFwyXDE3MVwxXDBcMVwxNzFcMVwwXDFcMTcxXDNcMCIrCi0gICAgIlwyXDE3MVwyXDBcM1wxNzFcMVwzMDRcMVwxNzFcMTNcMFwxMVwxNzFcMVwwIisKLSAgICAiXDRcMTcxXDFcMFwzXDE3MVwxXDBcM1wxNzFcNFwwXDJcMTczXDFcMTc0IisKLSAgICAiXDFcMTczXDFcMTc1XDY2XDE3M1wxXDBcMlwxNzZcMVwxNzdcNFwxNzZcMVwxNzUiKwotICAgICJcNjNcMTc2XDFcMFwyXDIwMVwxXDIwMlwxXDIwMVwxXDIwM1w2NlwyMDFcMVwwIisKLSAgICAiXDJcMjA0XDFcMjA1XDRcMjA0XDFcMjAzXDYzXDIwNFwxXDBcMVx1MDFhY1wxXHUwMTIxIisKLSAgICAiXDFcdTAxMjJcMVx1MDEyMVwxXDBcMVx1MDEyMVwxXHUwMWFjXDFcMFwxXHUwMTIxXDFcdTAxMjUiKwotICAgICJcMTNcdTAxMjFcMVwwXDE0XHUwMTIxXDFcdTAxYWNcMlx1MDEyMVwxXHUwMWFjXDJcdTAxMjFcMVx1MDFhYyIrCi0gICAgIlwxMFx1MDEyMVwxXHUwMWFjXDNcdTAxMjFcMVx1MDFhY1w1XHUwMTIxXDFcMFwxXHUwMWFkXDFcdTAxMjMiKwotICAgICJcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNDlcMVx1MDEyM1wxXHUwMWFkXDMzXHUwMTIzXDFcdTAxYWRcMlx1MDEyMyIrCi0gICAgIlwxXHUwMWFkXDJcdTAxMjNcMVx1MDFhZFwxMFx1MDEyM1wxXHUwMWFkXDNcdTAxMjNcMVx1MDFhZFw1XHUwMTIzIisKLSAgICAiXDFcMFwxXHUwMWFlXDFcdTAxMjRcMVx1MDE0ZFwzXHUwMTI0XDFcdTAxYWVcMVx1MDE0OVwzMlx1MDEyNCIrCi0gICAgIlwxXHUwMWFlXDJcdTAxMjRcMVx1MDFhZVwyXHUwMTI0XDFcdTAxYWVcMTBcdTAxMjRcMVx1MDFhZVwzXHUwMTI0IisKLSAgICAiXDFcdTAxYWVcNVx1MDEyNFwxXDBcMlwyMjZcMVwyMjdcMVwyMjZcMVwyMzBcNjZcMjI2IisKLSAgICAiXDFcMFwyXDIzMVwxXDIzMlw0XDIzMVwxXDIzMFw2M1wyMzFcMVwwXDJcMjM3IisKLSAgICAiXDFcMjQwXDFcMjM3XDFcMFwyXDIzN1wxXDBcMVwyMzdcMVwwXDFcMjM3IisKLSAgICAiXDNcMFwyXDIzN1wyXDBcM1wyMzdcMVwwXDFcMjM3XDEzXDBcMTFcMjM3IisKLSAgICAiXDFcMFw0XDIzN1wxXDBcM1wyMzdcMVwwXDNcMjM3XDRcMFwyXDI0NiIrCi0gICAgIlwxXDI0N1wxXDI0NlwxXDI1MFw2NlwyNDZcMVwwXDJcMjUxXDFcMjUyXDRcMjUxIisKLSAgICAiXDFcMjUwXDYzXDI1MVwxXDBcMlwyNTZcMVwyNTdcMVwyNTZcMVwwXDJcMjU2IisKLSAgICAiXDFcMFwxXDI1NlwxXDBcMVwyNTZcM1wwXDJcMjU2XDJcMFwzXDI1NiIrCi0gICAgIlwxXDBcMVwyNTZcMTNcMFwxMVwyNTZcMVwwXDRcMjU2XDFcMFwzXDI1NiIrCi0gICAgIlwxXDBcM1wyNTZcMTZcMFwxXHUwMTBkXDYxXDBcMVx1MDFhZlw1XDBcMVx1MDFhZiIrCi0gICAgIlwxMVwwXDFcdTAxYWZcNVwwXDFcdTAxYWZcMTNcMFwyXHUwMWFmXDFcMFwyXHUwMWFmIisKLSAgICAiXDFcMFwyXHUwMWFmXDdcMFwyXHUwMWFmXDJcMFwyXHUwMWFmXDVcMFwxXHUwMWIwIisKLSAgICAiXDFcdTAxMzVcMVx1MDEzNlwxXHUwMTM1XDFcMFwxXHUwMTM1XDFcdTAxYjBcMVwwXDFcdTAxMzUiKwotICAgICJcMVx1MDEzYVwxM1x1MDEzNVwxXDBcMTRcdTAxMzVcMVx1MDFiMFwyXHUwMTM1XDFcdTAxYjBcMlx1MDEzNSIrCi0gICAgIlwxXHUwMWIwXDEwXHUwMTM1XDFcdTAxYjBcM1x1MDEzNVwxXHUwMWIwXDVcdTAxMzVcMVwwXDFcdTAxYjEiKwotICAgICJcMVx1MDEzOFwxXHUwMTYwXDFcdTAxMzhcMVx1MDE1ZFwxXHUwMTM4XDFcdTAxYjFcMzNcdTAxMzhcMVx1MDFiMSIrCi0gICAgIlwyXHUwMTM4XDFcdTAxYjFcMlx1MDEzOFwxXHUwMWIxXDEwXHUwMTM4XDFcdTAxYjFcM1x1MDEzOFwxXHUwMWIxIisKLSAgICAiXDVcdTAxMzhcMVwwXDFcdTAxYjJcMVx1MDEzOVwxXHUwMTYxXDNcdTAxMzlcMVx1MDFiMlwxXHUwMTVkIisKLSAgICAiXDMyXHUwMTM5XDFcdTAxYjJcMlx1MDEzOVwxXHUwMWIyXDJcdTAxMzlcMVx1MDFiMlwxMFx1MDEzOVwxXHUwMWIyIisKLSAgICAiXDNcdTAxMzlcMVx1MDFiMlw1XHUwMTM5XDcwXDBcMVx1MDFiM1w1NFwwXDJcdTAxYjRcMjJcMCIrCi0gICAgIlwxXHUwMWI1XDFcMzY3XDFcMzcwXDFcMzY3XDFcMFwxXDM2N1wxXHUwMWI1XDFcMCIrCi0gICAgIlwxXDM2N1wxXHUwMTFhXDFcMzY3XDNcMFwyXDM2N1wyXDBcM1wzNjdcMVwwIisKLSAgICAiXDFcMzY3XDEzXDBcMVx1MDFiNVwyXDM2N1wxXHUwMWI1XDJcMzY3XDFcdTAxYjVcMlwzNjciKwotICAgICJcMVwwXDRcMzY3XDFcMFwxXHUwMWI1XDJcMzY3XDFcMFwxXHUwMWI1XDJcMzY3IisKLSAgICAiXDRcMFwxXHUwMWI2XDFcdTAxMjFcMVx1MDEyMlwxXHUwMTIxXDFcMFwxXHUwMTIxXDFcdTAxYjYiKwotICAgICJcMVwwXDFcdTAxMjFcMVx1MDEyNVwxM1x1MDEyMVwxXDBcMTRcdTAxMjFcMVx1MDFiNlwyXHUwMTIxIisKLSAgICAiXDFcdTAxYjZcMlx1MDEyMVwxXHUwMWI2XDEwXHUwMTIxXDFcdTAxYjZcM1x1MDEyMVwxXHUwMWI2XDVcdTAxMjEiKwotICAgICJcMVwwXDFcdTAxYjdcMVx1MDEyM1wxXHUwMTRjXDFcdTAxMjNcMVx1MDE0OVwxXHUwMTIzXDFcdTAxYjciKwotICAgICJcMzNcdTAxMjNcMVx1MDFiN1wyXHUwMTIzXDFcdTAxYjdcMlx1MDEyM1wxXHUwMWI3XDEwXHUwMTIzXDFcdTAxYjciKwotICAgICJcM1x1MDEyM1wxXHUwMWI3XDVcdTAxMjNcMVwwXDFcdTAxYjhcMVx1MDEyNFwxXHUwMTRkXDNcdTAxMjQiKwotICAgICJcMVx1MDFiOFwxXHUwMTQ5XDMyXHUwMTI0XDFcdTAxYjhcMlx1MDEyNFwxXHUwMWI4XDJcdTAxMjRcMVx1MDFiOCIrCi0gICAgIlwxMFx1MDEyNFwxXHUwMWI4XDNcdTAxMjRcMVx1MDFiOFw1XHUwMTI0XDFcMFwxXHUwMWI5XDVcMCIrCi0gICAgIlwxXHUwMWI5XDExXDBcMVx1MDFiOVw1XDBcMVx1MDFiOVwxM1wwXDJcdTAxYjlcMVwwIisKLSAgICAiXDJcdTAxYjlcMVwwXDJcdTAxYjlcN1wwXDJcdTAxYjlcMlwwXDJcdTAxYjlcNVwwIisKLSAgICAiXDFcdTAxYmFcMVx1MDEzNVwxXHUwMTM2XDFcdTAxMzVcMVwwXDFcdTAxMzVcMVx1MDFiYVwxXDAiKwotICAgICJcMVx1MDEzNVwxXHUwMTNhXDEzXHUwMTM1XDFcMFwxNFx1MDEzNVwxXHUwMWJhXDJcdTAxMzVcMVx1MDFiYSIrCi0gICAgIlwyXHUwMTM1XDFcdTAxYmFcMTBcdTAxMzVcMVx1MDFiYVwzXHUwMTM1XDFcdTAxYmFcNVx1MDEzNVwxXDAiKwotICAgICJcMVx1MDFiYlwxXHUwMTM4XDFcdTAxNjBcMVx1MDEzOFwxXHUwMTVkXDFcdTAxMzhcMVx1MDFiYlwzM1x1MDEzOCIrCi0gICAgIlwxXHUwMWJiXDJcdTAxMzhcMVx1MDFiYlwyXHUwMTM4XDFcdTAxYmJcMTBcdTAxMzhcMVx1MDFiYlwzXHUwMTM4IisKLSAgICAiXDFcdTAxYmJcNVx1MDEzOFwxXDBcMVx1MDFiY1wxXHUwMTM5XDFcdTAxNjFcM1x1MDEzOVwxXHUwMWJjIisKLSAgICAiXDFcdTAxNWRcMzJcdTAxMzlcMVx1MDFiY1wyXHUwMTM5XDFcdTAxYmNcMlx1MDEzOVwxXHUwMWJjXDEwXHUwMTM5IisKLSAgICAiXDFcdTAxYmNcM1x1MDEzOVwxXHUwMWJjXDVcdTAxMzlcNTNcMFwxXHUwMWJkXDIxXDBcMlwzNjciKwotICAgICJcMVwzNzBcMVwzNjdcMVwwXDJcMzY3XDFcMFwxXDM2N1wxXHUwMTFhXDFcMzY3IisKLSAgICAiXDNcMFwyXDM2N1wyXDBcM1wzNjdcMVwwXDFcMzY3XDEzXDBcMTFcMzY3IisKLSAgICAiXDFcMFw0XDM2N1wxXDBcM1wzNjdcMVwwXDNcMzY3XDRcMFwxXHUwMWJlIisKLSAgICAiXDFcdTAxMjFcMVx1MDEyMlwxXHUwMTIxXDFcMFwxXHUwMTIxXDFcdTAxYmVcMVwwXDFcdTAxMjEiKwotICAgICJcMVx1MDEyNVwxM1x1MDEyMVwxXDBcMTRcdTAxMjFcMVx1MDFiZVwyXHUwMTIxXDFcdTAxYmVcMlx1MDEyMSIrCi0gICAgIlwxXHUwMWJlXDEwXHUwMTIxXDFcdTAxYmVcM1x1MDEyMVwxXHUwMWJlXDVcdTAxMjFcMVwwXDFcdTAxYmYiKwotICAgICJcMVx1MDEyM1wxXHUwMTRjXDFcdTAxMjNcMVx1MDE0OVwxXHUwMTIzXDFcdTAxYmZcMzNcdTAxMjNcMVx1MDFiZiIrCi0gICAgIlwyXHUwMTIzXDFcdTAxYmZcMlx1MDEyM1wxXHUwMWJmXDEwXHUwMTIzXDFcdTAxYmZcM1x1MDEyM1wxXHUwMWJmIisKLSAgICAiXDVcdTAxMjNcMVwwXDFcdTAxYzBcMVx1MDEyNFwxXHUwMTRkXDNcdTAxMjRcMVx1MDFjMFwxXHUwMTQ5IisKLSAgICAiXDMyXHUwMTI0XDFcdTAxYzBcMlx1MDEyNFwxXHUwMWMwXDJcdTAxMjRcMVx1MDFjMFwxMFx1MDEyNFwxXHUwMWMwIisKLSAgICAiXDNcdTAxMjRcMVx1MDFjMFw1XHUwMTI0XDFcMFwxXHUwMWMxXDFcdTAxMzVcMVx1MDEzNlwxXHUwMTM1IisKLSAgICAiXDFcMFwxXHUwMTM1XDFcdTAxYzFcMVwwXDFcdTAxMzVcMVx1MDEzYVwxM1x1MDEzNVwxXDAiKwotICAgICJcMTRcdTAxMzVcMVx1MDFjMVwyXHUwMTM1XDFcdTAxYzFcMlx1MDEzNVwxXHUwMWMxXDEwXHUwMTM1XDFcdTAxYzEiKwotICAgICJcM1x1MDEzNVwxXHUwMWMxXDVcdTAxMzVcMVwwXDFcdTAxYzJcMVx1MDEzOFwxXHUwMTYwXDFcdTAxMzgiKwotICAgICJcMVx1MDE1ZFwxXHUwMTM4XDFcdTAxYzJcMzNcdTAxMzhcMVx1MDFjMlwyXHUwMTM4XDFcdTAxYzJcMlx1MDEzOCIrCi0gICAgIlwxXHUwMWMyXDEwXHUwMTM4XDFcdTAxYzJcM1x1MDEzOFwxXHUwMWMyXDVcdTAxMzhcMVwwXDFcdTAxYzMiKwotICAgICJcMVx1MDEzOVwxXHUwMTYxXDNcdTAxMzlcMVx1MDFjM1wxXHUwMTVkXDMyXHUwMTM5XDFcdTAxYzNcMlx1MDEzOSIrCi0gICAgIlwxXHUwMWMzXDJcdTAxMzlcMVx1MDFjM1wxMFx1MDEzOVwxXHUwMWMzXDNcdTAxMzlcMVx1MDFjM1w1XHUwMTM5IisKLSAgICAiXDFcMFwyXHUwMTIxXDFcdTAxMjJcMVx1MDEyMVwxXDBcMlx1MDEyMVwxXDBcMVx1MDEyMSIrCi0gICAgIlwxXHUwMTI1XDEzXHUwMTIxXDFcMFw0NVx1MDEyMVwxXDBcMVx1MDFjNFwxXHUwMTIzXDFcdTAxNGMiKwotICAgICJcMVx1MDEyM1wxXHUwMTQ5XDFcdTAxMjNcMVx1MDFjNFwzM1x1MDEyM1wxXHUwMWM0XDJcdTAxMjNcMVx1MDFjNCIrCi0gICAgIlwyXHUwMTIzXDFcdTAxYzRcMTBcdTAxMjNcMVx1MDFjNFwzXHUwMTIzXDFcdTAxYzRcNVx1MDEyM1wxXDAiKwotICAgICJcMVx1MDFjNVwxXHUwMTI0XDFcdTAxNGRcM1x1MDEyNFwxXHUwMWM1XDFcdTAxNDlcMzJcdTAxMjRcMVx1MDFjNSIrCi0gICAgIlwyXHUwMTI0XDFcdTAxYzVcMlx1MDEyNFwxXHUwMWM1XDEwXHUwMTI0XDFcdTAxYzVcM1x1MDEyNFwxXHUwMWM1IisKLSAgICAiXDVcdTAxMjRcMVwwXDJcdTAxMzVcMVx1MDEzNlwxXHUwMTM1XDFcMFwyXHUwMTM1XDFcMCIrCi0gICAgIlwxXHUwMTM1XDFcdTAxM2FcMTNcdTAxMzVcMVwwXDQ1XHUwMTM1XDFcMFwxXHUwMWM2XDFcdTAxMzgiKwotICAgICJcMVx1MDE2MFwxXHUwMTM4XDFcdTAxNWRcMVx1MDEzOFwxXHUwMWM2XDMzXHUwMTM4XDFcdTAxYzZcMlx1MDEzOCIrCi0gICAgIlwxXHUwMWM2XDJcdTAxMzhcMVx1MDFjNlwxMFx1MDEzOFwxXHUwMWM2XDNcdTAxMzhcMVx1MDFjNlw1XHUwMTM4IisKLSAgICAiXDFcMFwxXHUwMWM3XDFcdTAxMzlcMVx1MDE2MVwzXHUwMTM5XDFcdTAxYzdcMVx1MDE1ZFwzMlx1MDEzOSIrCi0gICAgIlwxXHUwMWM3XDJcdTAxMzlcMVx1MDFjN1wyXHUwMTM5XDFcdTAxYzdcMTBcdTAxMzlcMVx1MDFjN1wzXHUwMTM5IisKLSAgICAiXDFcdTAxYzdcNVx1MDEzOVwxXDBcMlx1MDEyM1wxXHUwMTRjXDFcdTAxMjNcMVx1MDE0OVw2Nlx1MDEyMyIrCi0gICAgIlwxXDBcMlx1MDEyNFwxXHUwMTRkXDRcdTAxMjRcMVx1MDE0OVw2M1x1MDEyNFwxXDBcMlx1MDEzOCIrCi0gICAgIlwxXHUwMTYwXDFcdTAxMzhcMVx1MDE1ZFw2Nlx1MDEzOFwxXDBcMlx1MDEzOVwxXHUwMTYxXDRcdTAxMzkiKwotICAgICJcMVx1MDE1ZFw2M1x1MDEzOSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrVHJhbnMoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbMjIyNjBdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrVHJhbnMoWlpfVFJBTlNfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrVHJhbnMoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1BVU0hCQUNLXzJCSUcgPSAyOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKioKLSAgICogWlpfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FUVFJJQlVURSA9IHp6VW5wYWNrQXR0cmlidXRlKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FUVFJJQlVURV9QQUNLRURfMCA9Ci0gICAgIlwzMFwwXDFcMTFcMTBcMVwxXDExXDJcMVwxXDExXDFcMVwxXDExIisKLSAgICAiXDRcMVwxXDExXDZcMVwxXDExXDNcMVwyXDExXDNcMVwxXDExIisKLSAgICAiXDFcMVwxXDNcMlwxMVwzXDFcMVwxMVwxXDFcMVwxMVwxMFwxIisKLSAgICAiXDJcMTFcNVwxXDFcMTFcN1wxXDFcMTFcMVwzXDNcMVwzXDExIisKLSAgICAiXDFcMVwxXDBcM1wxXDFcMFwxXDFcMlwwXDFcMVwyXDAiKwotICAgICJcMVwxMVw2XDBcMVwxXDNcMFwxXDExXDVcMFwxXDExXDRcMCIrCi0gICAgIlwyXDFcMVwwXDJcMVwxXDBcMlwxXDFcMTVcMVwwXDJcMSIrCi0gICAgIlwxXDBcMVwxXDJcMFwxXDExXDJcMFwxXDFcMVwwXDNcMSIrCi0gICAgIlwyXDBcMVwxMVwxXDBcMVwxMVwxXDFcMlwwXDFcMTFcMlwwIisKLSAgICAiXDRcMVwyXDBcMVwxXDJcMFwxXDE1XDFcMVwxXDBcMVwxMSIrCi0gICAgIlwxXDBcMVwxXDFcMTFcMlwxXDEwXDBcMVwxXDFcMFwxXDEiKwotICAgICJcMlwwXDFcMVwyXDBcMVwxXDJcMFwxXDFcMlwwXDVcMSIrCi0gICAgIlwxXDBcMVwxXDJcMFwxXDFcMVwwXDNcMVwxXDBcMVwxIisKLSAgICAiXDJcMFwxXDFcMVwwXDNcMVwzXDBcM1wxXDFcMTFcNVwwIisKLSAgICAiXDFcMTFcMlwwXDFcMVw1XDBcNVwxXDJcMFwzXDFcMlwwIisKLSAgICAiXDJcMVwxXDBcMVwxXDFcMFwxXDExXDNcMVwzXDBcMVwxMSIrCi0gICAgIlwyXDBcMVwxMVwxXDBcMVwxXDEwXDBcMVwxMVw1XDFcMlwwIisKLSAgICAiXDNcMVwyXDBcM1wxXDVcMFwxXDExXDFcMFwzXDFcMlwwIisKLSAgICAiXDFcMTFcMlwwXDFcMVw2XDBcMVwxXDJcMFw1XDFcMlwwIisKLSAgICAiXDNcMVwyXDBcM1wxXDJcMFwxXDFcM1wwXDNcMVwxXDAiKwotICAgICJcMVwxMVwyXDBcMVwxXDEzXDBcNVwxXDJcMFwzXDFcMlwwIisKLSAgICAiXDNcMVwxMFwwXDJcMVwxXDExXDJcMFwxXDFcNlwwXDFcMSIrCi0gICAgIlwxXDBcMVwxXDJcMFwxXDFcMlwwXDNcMVwyXDBcMVwxIisKLSAgICAiXDFcMFwxXDFcNlwwXDFcMVw0XDBcMVwxMVw0XDBcMVwxMSIrCi0gICAgIlwzXDBcMVwxMVwxMlwwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBdHRyaWJ1dGUoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNDU1XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0F0dHJpYnV0ZShaWl9BVFRSSUJVVEVfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQXR0cmlidXRlKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHp6UmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHp6U3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgenpCdWZmZXJbXSA9IG5ldyBjaGFyW1paX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ek1hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgenpQdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6Q3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6U3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgenpFbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy9wcml2YXRlIGludCB5eWNvbHVtbjsKLQotICAvKiogCi0gICAqIHp6QXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvL3ByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQ7Ci0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aDsKLS8vCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZCdWZmZXJlZFRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfTk9STUFMID0gMTYzODQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7Ci0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOwotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgewotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBzaXplKSB7Ci0JCWZJbml0aWFsQnVmZmVyU2l6ZSA9IHNpemU7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dDsKLQkJU3RyaW5nIG5leHRUb2tlblR5cGU7Ci0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOwotLy8JCVN0cmluZ0J1ZmZlciB0ZXh0OwotCQlpbnQgc3RhcnQ7Ci0JCWludCB0ZXh0TGVuZ3RoOwotCQlpbnQgbGVuZ3RoOwotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCAhPSBudWxsKSB7Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLS8vCQkJdGV4dCA9IGZCdWZmZXJlZFRleHQ7Ci0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQotCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotLy8JCQl0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gQ1NTX0pTUF9TQ1JJUFRMRVQgfHwgY29udGV4dCA9PSBDU1NfSlNQX0VMKXsKLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlICE9IENTU19KU1BfRU5EICYmIG5leHRUb2tlblR5cGUgIT0gQ1NTX0VMX0VORCAmJiBuZXh0VG9rZW5UeXBlICE9IENTU19KU1BfQ09NTUVOVCkgewotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQlpZiAoY29udGV4dC5lcXVhbHMoQ1NTX0pTUF9TQ1JJUFRMRVQpICYmICh5eXN0YXRlKCkgPT0gU1RfSlNQX0RJUkVDVElWRSB8fCB5eXN0YXRlKCkgPT0gU1RfSlNQX0VYUCB8fCB5eXN0YXRlKCkgPT0gU1RfSlNQX0RFQ0xBUkFUSU9OKSl7Ci0JCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLQkJCQkJfQotCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCWlmIChuZXh0VG9rZW5UeXBlID09IG51bGwpewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gWzIzNjAwOF0gLSBTaG91bGQgbm90IHRyeSBhbmQgY29uc2lkZXIgdGhlIHRva2VuIGEKLQkJCQkvLyBjb21tZW50IHVubGVzcyAgYSBjb21tZW50IHdhcyBzdGFydGVkCi0JCQkJaWYgKGNvbnRleHQgPT0gQ1NTX0pTUF9TQ1JJUFRMRVQgJiYgbmV4dFRva2VuVHlwZSA9PSBDU1NfSlNQX0NPTU1FTlQpewotCQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0NPTU1FTlRfRU5EKSB7Ci0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsKLQkJCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCQkJCQlpZiAoY29udGV4dC5lcXVhbHMoQ1NTX0pTUF9TQ1JJUFRMRVQpICYmIHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCl7Ci0JCQkJCQkJY29udGV4dCA9IG5leHRUb2tlblR5cGU7Ci0JCQkJCQl9Ci0KLQkJCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQkJCQkKLQkJCQkJaWYgKGNvbnRleHQgPT0gQ1NTX0pTUF9DT01NRU5UKXsKLQkJCQkJCWNvbnRleHQgPSBDU1NfQ09NTUVOVDsKLQkJCQkJfQotCQkJCX0KLQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJCQkKLQkJCX0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCS8vIHVuZGVmIC0+IGNvbmNhdGVuYXRlIHVuZGVmJ3MKLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgewotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLS8vCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJfSBlbHNlIHsKLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsKLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVmFsdWVUeXBlKGNvbnRleHQpKSB7IC8vIGRlY2xhcmF0aW9uIHZhbHVlIGNhbiBjb250YWluIFZBTFVFX1MKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOwotCQkJCX0gZWxzZSBpZiAoY2FuQ29udGFpblNwYWNlKGNvbnRleHQpKSB7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsKLQkJCQl9Ci0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsKLQkJCQkJCS8vIG5leHQgaXMgc3BhY2UgLT4gYXBwZW5kCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYKLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsKLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047Ci0JCQl9Ci0JCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAJCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsKLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOwotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJCi0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsKLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOwotCQkJdG9rZW5zLmFkZCh0b2tlbik7Ci0JCX0KLQotICAJCXJldHVybiB0b2tlbnM7Ci0gIAl9Ci0gIAkKLSAgCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7Ci0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0gIAkJCXJldHVybiBmYWxzZTsKLSAgCQl9IGVsc2UgewotICAJCQlyZXR1cm4gdHJ1ZTsKLSAgCQl9Ci0gIAl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4geXljaGFyOwotCX0KLQkKLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4genpBdEVPRjsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXp6UmVhZGVyID0gaW47Ci0KLQkJLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQkJenpTdGF0ZSA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJenpMZXhpY2FsU3RhdGUgPSBmSW5pdGlhbFN0YXRlOyAvL1lZSU5JVElBTDsKLQotCQkvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JCWlmICh6ekJ1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7Ci0JCQl6ekJ1ZmZlciA9IG5ldyBjaGFyW2ZJbml0aWFsQnVmZmVyU2l6ZV07Ci0JCX0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJenpNYXJrZWRQb3MgPSAwOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl6elB1c2hiYWNrUG9zID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXp6Q3VycmVudFBvcyA9IDA7Ci0KLQkJLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl6elN0YXJ0UmVhZCA9IDA7Ci0KLQkJLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkJZnJvbSBpbnB1dCAqLwotCQl6ekVuZFJlYWQgPSAwOwotCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0KLQkJLyoqCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLQkJICogbWF0Y2hlZCB0ZXh0Ci0JCSAqLwotCQkvL3l5Y29sdW1uID0gMDsgCi0KLQkJLyoqIAotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLQkJICovCi0JCS8venpBdEJPTCA9IGZhbHNlOwotCQkKLQkJLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJenpBdEVPRiA9IGZhbHNlOwotCi0JCS8qIHVzZXIgdmFyaWFibGVzICovCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BlZENTU1Rva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZkpTUFByZXZpb3VzU3RhdGUgPSBmSW5pdGlhbFN0YXRlOwotCXByaXZhdGUgdm9pZCB5eUpzcEJlZ2luKGludCBuZXdzdGF0ZSl7Ci0JCWZKU1BQcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOwotCQl5eWJlZ2luKG5ld3N0YXRlKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHl5SnNwRW5kKCl7Ci0JCXl5YmVnaW4oZkpTUFByZXZpb3VzU3RhdGUpOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BlZENTU1Rva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUGVkQ1NTVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE3MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6UHVzaGJhY2tQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0gICAgICB6elJlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLSAgICB6elJlYWRlciA9IHJlYWRlcjsKLSAgIC8vIHp6QXRCT0wgID0gdHJ1ZTsKLSAgICB6ekF0RU9GICA9IGZhbHNlOwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkID0gMDsKLSAgICB6ekN1cnJlbnRQb3MgPSB6ek1hcmtlZFBvcyA9IHp6UHVzaGJhY2tQb3MgPSAwOwotICAgIHl5bGluZSA9IHl5Y2hhciA9IDA7Ly95eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHp6TGV4aWNhbFN0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLSAgICByZXR1cm4genpCdWZmZXJbenpTdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6elNjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgdHJ5IHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW1paX1VOS05PV05fRVJST1JdOwotICAgIH0KLQotICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwdWJsaWMgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHp6SW5wdXQ7Ci0gICAgaW50IHp6QWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgenpDdXJyZW50UG9zTDsKLSAgICBpbnQgenpNYXJrZWRQb3NMOwotICAgIGludCB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgIGNoYXIgW10genpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgY2hhciBbXSB6ekNNYXBMID0gWlpfQ01BUDsKLQotICAgIGludCBbXSB6elRyYW5zTCA9IFpaX1RSQU5TOwotICAgIGludCBbXSB6elJvd01hcEwgPSBaWl9ST1dNQVA7Ci0gICAgaW50IFtdIHp6QXR0ckwgPSBaWl9BVFRSSUJVVEU7Ci0gICAgaW50IHp6UHVzaGJhY2tQb3NMID0genpQdXNoYmFja1BvcyA9IC0xOwotICAgIGJvb2xlYW4genpXYXNQdXNoYmFjazsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0genpNYXJrZWRQb3NMLXp6U3RhcnRSZWFkOwotCi0gICAgICBib29sZWFuIHp6UiA9IGZhbHNlOwotICAgICAgZm9yICh6ekN1cnJlbnRQb3NMID0genpTdGFydFJlYWQ7IHp6Q3VycmVudFBvc0wgPCB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpDdXJyZW50UG9zTCsrKSB7Ci0gICAgICAgIHN3aXRjaCAoenpCdWZmZXJMW3p6Q3VycmVudFBvc0xdKSB7Ci0gICAgICAgIGNhc2UgJ1x1MDAwQic6Ci0gICAgICAgIGNhc2UgJ1x1MDAwQyc6Ci0gICAgICAgIGNhc2UgJ1x1MDA4NSc6Ci0gICAgICAgIGNhc2UgJ1x1MjAyOCc6Ci0gICAgICAgIGNhc2UgJ1x1MjAyOSc6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgenpSID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB6elIgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHp6UikKLSAgICAgICAgICAgIHp6UiA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHp6UiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh6elIpIHsKLSAgICAgICAgLy8gcGVlayBvbmUgY2hhcmFjdGVyIGFoZWFkIGlmIGl0IGlzIFxuIChpZiB3ZSBoYXZlIGNvdW50ZWQgb25lIGxpbmUgdG9vIG11Y2gpCi0gICAgICAgIGJvb2xlYW4genpQZWVrOwotICAgICAgICBpZiAoenpNYXJrZWRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICB6elBlZWsgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSA9PSAnXG4nOwotICAgICAgICBlbHNlIGlmICh6ekF0RU9GKQotICAgICAgICAgIHp6UGVlayA9IGZhbHNlOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICBpZiAoZW9mKSAKLSAgICAgICAgICAgIHp6UGVlayA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICB6elBlZWsgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSA9PSAnXG4nOwotICAgICAgICB9Ci0gICAgICAgIGlmICh6elBlZWspIHl5bGluZS0tOwotICAgICAgfQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSB6ekxleGljYWxTdGF0ZTsKLQotICAgICAgenpXYXNQdXNoYmFjayA9IGZhbHNlOwotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIHp6UHVzaGJhY2tQb3MgPSB6elB1c2hiYWNrUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgenpQdXNoYmFja1Bvc0wgPSB6elB1c2hiYWNrUG9zOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHp6TmV4dCA9IHp6VHJhbnNMWyB6elJvd01hcExbenpTdGF0ZV0gKyB6ekNNYXBMW3p6SW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHp6TmV4dCA9PSAtMSkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgenpTdGF0ZSA9IHp6TmV4dDsKLQotICAgICAgICAgIGludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDIpID09IDIgKQotICAgICAgICAgICAgenpQdXNoYmFja1Bvc0wgPSB6ekN1cnJlbnRQb3NMOwotCi0gICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgMSkgPT0gMSApIHsKLSAgICAgICAgICAgIHp6V2FzUHVzaGJhY2sgPSAoenpBdHRyaWJ1dGVzICYgNCkgPT0gNDsKLSAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiA4KSA9PSA4ICkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotICAgICAgaWYgKHp6V2FzUHVzaGJhY2spCi0gICAgICAgIHp6TWFya2VkUG9zID0genpQdXNoYmFja1Bvc0w7Ci0KLSAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19TVFJJTkc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYwOiBicmVhazsKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYxOiBicmVhazsKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYyOiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjM6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY0OiBicmVhazsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IHJldHVybiBVTkRFRklORUQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY1OiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfTEJSQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9NRURJQV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX01FRElVTTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzE6IGJyZWFrOwotICAgICAgICBjYXNlIDk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDcyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9GT05UX0ZBQ0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19GT05UX0ZBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc0OiBicmVhazsKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7IHJldHVybiBDU1NfQ0hBUlNFVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzU6IGJyZWFrOwotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICB7IHl5SnNwRW5kKCk7IHJldHVybiBDU1NfRUxfRU5EOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICAgIHsgeXlKc3BFbmQoKTsgIHJldHVybiBDU1NfSlNQX0VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzc6IGJyZWFrOwotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzk6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfQ0RDOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDgyOiBicmVhazsKLSAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODM6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfQ0RPOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODc6IGJyZWFrOwotICAgICAgICBjYXNlIDUyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODg6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICAgIHsgeXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDkxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVI7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDkyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk3OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1BBR0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19QQUdFX1NFTEVDVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk5OiBicmVhazsKLSAgICAgICAgY2FzZSA1MDogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX0NPTU1FTlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDE6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDI6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAzOiBicmVhazsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfUzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTA0OiBicmVhazsKLSAgICAgICAgY2FzZSA1MTogCi0gICAgICAgICAgeyB5eUpzcEVuZCgpOyByZXR1cm4gQ1NTX0pTUF9DT01NRU5UX0VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTA1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9JRDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTA2OiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0pTUF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfSlNQX0RFQ0w7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSlNQX0VYUCk7IHJldHVybiBDU1NfSlNQX0VYUDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTExOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTM6IGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTE0OiBicmVhazsKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsgcmV0dXJuIENTU19KU1BfQ09NTUVOVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTE1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgICAgeyB5eUpzcEJlZ2luKFNUX0pTUF9TQ1JJUFRMRVQpOyAgcmV0dXJuIENTU19KU1BfU0NSSVBUTEVUOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTY6IGJyZWFrOwotICAgICAgICBjYXNlIDU0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTE3OiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkUpOyByZXR1cm4gQ1NTX0pTUF9ESVJFQ1RJVkU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExODogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0pTUGVkQ1NTUmVnaW9uQ29udGV4dHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovSlNQZWRDU1NSZWdpb25Db250ZXh0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFiMTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovSlNQZWRDU1NSZWdpb25Db250ZXh0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcno7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLQotcHVibGljIGludGVyZmFjZSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzIGV4dGVuZHMgQ1NTUmVnaW9uQ29udGV4dHMgewkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0VYUCA9ICJDU1NfSlNQX0VYUCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0VMID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPUkVJR05fRUxFTUVOVDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfU0NSSVBUTEVUID0gIkNTU19KU1BfU0NSSVBUTEVUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfRElSRUNUSVZFID0gIkNTU19KU1BfRElSRUNUSVZFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfREVDTCA9ICJDU1NfSlNQX0RFQ0wiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9FTkQgPSAiQ1NTX0pTUF9FTkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0VMX0VORCA9ICJDU1NfRUxfRU5EIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfQ09NTUVOVF9FTkQgPSAiQ1NTX0pTUF9DT01NRU5UX0VORCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0NPTU1FTlQgPSAiQ1NTX0pTUF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2ZTIxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIgotCQlwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40IiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iCi0JCXBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlLyoqIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS91aS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC91aS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvKioiIC8+CQkJCQotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvamF2YXNjcmlwdC91aS8qKiIgLz4JCi0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uLyoqIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JTW9kdWxlQ29uc3RhbnRzIiAvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIiAvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDBjMjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWpzcGVkaXRvci5qYXIKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS5qc3QuanNwLnVpXzYuMC4wLmphcgotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNzRkNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2RlYnVnL2pzcGNvbnRlbnRhc3Npc3Q9ZmFsc2UKLW9yZy5lY2xpcHNlLmpzdC5qc3AudWkvcHJvamVjdGlvbnBlcmY9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDJlNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmpzcC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTY5N2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jV2VkIE1hciAyOCAwMzoxMTo0NSBFRFQgMjAwNw0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5M2UyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qc3AudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS40MDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5hdXRvZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmRlcml2ZWQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZm9ybWF0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oYW5kbGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMF0iLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMzAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC40MDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuZGVidWc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzBmODdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKLWFkZGl0aW9uYWwuYnVuZGxlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLm1hbmlwdWxhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdqc3Bfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3anNwX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjliMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdqc3Bfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2pzcF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDk0NGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMTE4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZGVmYXVsdF9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhMTQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX2RlZmF1bHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX2RlZmF1bHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyOWQzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9kZWZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZTA2NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJpdmF0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJvdGVjdGVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcm90ZWN0ZWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3N2IxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcm90ZWN0ZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX3B1YmxpY19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHVibGljX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2I0MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHVibGljX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX2RlZmF1bHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQ0YTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wcml2YXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5MmYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3Byb3RlY3RlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA1NTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3B1YmxpY19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wdWJsaWNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjMmE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3B1YmxpY19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfZGVmYXVsdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfZGVmYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjFiNTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX2RlZmF1bHRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjYmZmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcml2YXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcm90ZWN0ZWRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNThlZWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHVibGljX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViYzQ2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkY2U5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMWMyOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJpdmF0ZV9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcml2YXRlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4ODFkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcml2YXRlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm90ZWN0ZWRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDgzYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyNDcwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3B1YmxpY19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YWY1ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWViZGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZjUxNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4NDYwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFmODFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3anNwZmlsZV93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2pzcGZpbGVfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwZmYwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3anNwZmlsZV93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGRlY2wuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGRlY2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWY0OGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BkZWNsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BleHAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGV4cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNGQ3NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGV4cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODRjMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGluY2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHNjci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1M2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3B0YWdsaWIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHRhZ2xpYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTVlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHRhZ2xpYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3ZmIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1qc3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1qc3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRkZTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy90YWctanNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2M2U0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIE1hdHRoaWFzIEZ1ZXNzZWwsIG1hdC5mdWVzc2VsQGdteC5uZXQgLSBbMTc3Mzg3XSB1c2UgYmFzZSBoeXBlcmxpbmtpbmcgZXh0ZW5zaW9uIHBvaW50cwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVNTRSBKU1AgU291cmNlIEVkaXRvcgotSlNQX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lPUpTUCBFZGl0b3IKLUNTU19KU1BfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9Q1NTIEpTUCBFZGl0b3IKLUpTUF9GaWxlcy5uYW1lPUpTUCBGaWxlcwotSlNQX1NvdXJjZS5uYW1lPUVkaXRvcgotSlNQX1RlbXBsYXRlcy5uYW1lPVRlbXBsYXRlcwotSlNQX1N0eWxlcy5uYW1lPVN0eWxlcwotSlNQX1N5bnRheF9Db2xvcmluZz1TeW50YXggQ29sb3JpbmcKLUpTUF9Tb3VyY2VfdGFyZ2V0X25hbWU9SlNQIFNvdXJjZQotSlNQX1ZhbGlkYXRpb249VmFsaWRhdGlvbgotSlNQX1Byb3BlcnR5X3ZhbGlkYXRpb249SlNQIFN5bnRheAotSlNQX1R5cGluZz1UeXBpbmcKLQotIyBTbmlwcGV0cyBjb250cmlidXRpb25zIGZvciBoZWxwaW5nIHdpdGggSlNQIHN5bnRheAotanNwX3NjcmlwdGxldD08JS4uJT4gc2NyaXB0bGV0Ci1qc3Bfc2NyX2NvbnRlbnQ9PCUgICU+Ci1qc3BfaGlkZGVuX2NvbW1lbnQ9PCUtLS4uLS0lPiBjb21tZW50Ci1qc3BfaGlkZGVuX2NvbW1lbnRfY29udGVudD08JS0tICAtLSU+Ci1qc3BfZGVjbGFyYXRpb249PCUhLi4lPiBkZWNsYXJhdGlvbgotanNwX2RlY2xhcmF0aW9uX2NvbnRlbnQ9PCUhICAlPgotanNwX2V4cHJlc3Npb249PCU9Li4lPiBleHByZXNzaW9uCi1qc3BfZXhwcmVzc2lvbl9jb250ZW50PTwlPSAgJT4KLWpzcF9pbmNsdWRlX2RpcmVjdGl2ZT1pbmNsdWRlIGRpcmVjdGl2ZQotanNwX2luY2x1ZGVfZGlyZWN0aXZlX2NvbnRlbnQ9PCVAIGluY2x1ZGUgZmlsZT0iIiAlPgotanNwX3BhZ2VfZGlyZWN0aXZlPXBhZ2UgZGlyZWN0aXZlCi1qc3BfcGFnZV9kaXJlY3RpdmVfY29udGVudD08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PSIgJT4KLWpzcF90YWdsaWJfZGlyZWN0aXZlPXRhZ2xpYiBkaXJlY3RpdmUKLWpzcF90YWdsaWJfZGlyZWN0aXZlX2NvbnRlbnQ9PCVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICU+Ci1qc3BfdGFnbGliX2RpcmVjdGl2ZV91cmk9VVJJIHRvIHRoZSBjb250YWluaW5nIEpBUiBmaWxlIG9yIHRhZ2xpYiBkZXNjcmlwdG9yICgudGxkKQotanNwX3RhZ2xpYl9kaXJlY3RpdmVfcHJlZml4PU5hbWVzcGFjZSBwcmVmaXggZm9yIHRhZ3MgZnJvbSB0aGlzIGxpYnJhcnkKLUpTUEZyYWdtZW50Q29udGVudFNldHRpbmdzLm5hbWU9SlNQIEZyYWdtZW50Ci1jb21tYW5kLmpzcC5yZWZhY3Rvci5yZW5hbWUubmFtZT1SZW5hbWUKLWNvbW1hbmQuanNwLnJlZmFjdG9yLnJlbmFtZS5kZXNjcmlwdGlvbj1SZW5hbWUgYSBKYXZhIEVsZW1lbnQKLWNvbW1hbmQuanNwLnJlZmFjdG9yLm1vdmUubmFtZT1Nb3ZlCi1jb21tYW5kLmpzcC5yZWZhY3Rvci5tb3ZlLmRlc2NyaXB0aW9uPU1vdmUgYSBKYXZhIEVsZW1lbnQgdG8gYW5vdGhlciBwYWNrYWdlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5uYW1lPUVkaXRpbmcgSlNQIFNvdXJjZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3AuZGVzY3JpcHRpb249RWRpdGluZyBKU1AgU291cmNlCi1zY29wZS5qc3AuY29yZS5qc3Bzb3VyY2UubmFtZT1KU1AgU291cmNlCi1zY29wZS5qc3AuY29yZS5qc3Bzb3VyY2UuZGVzY3JpcHRpb249SlNQIFNvdXJjZQotSlNQX1R5cGVfUmVuYW1lX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFR5cGUgUmVuYW1lIFBhcnRpY2lwYW50Ci1KU1BfTWV0aG9kX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBNZXRob2QgUmVuYW1lIFBhcnRpY2lwYW50Ci1KU1BfUGFja2FnZV9SZW5hbWVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgUGFja2FnZSBSZW5hbWUgUGFydGljaXBhbnQKLUpTUF9UeXBlX01vdmVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgVHlwZSBNb3ZlIFBhcnRpY2lwYW50Ci1BbGxfSlNQX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUFsbCBKU1AKLUpTUF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9TmV3IEpTUAotVGFnX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgVGFnCi1KU1BfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBUYWcKLUpTUF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIEF0dHJpYnV0ZQotSlNQX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgQXR0cmlidXRlIHZhbHVlCi1KU1BfUXVlcnlfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgUXVlcnkgUGFydGljaXBhbnQKLUpTUF9FeHRlbnNpb25fRWxlbWVudC5sYWJlbD1KU1AKLSNvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIGV4dGVuc2lvbiBwb2ludAotX1VJX1dJWkFSRF9OQU1FID0gSlNQCi1fVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBKYXZhU2VydmVyIFBhZ2UKLV9VSV9XSVpBUkRfVEFHX05BTUUgPSBUYWcKLV9VSV9XSVpBUkRfVEFHX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBUYWcgZmlsZQotIyMKLUFkZFRhc2subGFiZWw9QWRkICZUYXNrLi4uCi1BZGRUYXNrLnRvb2x0aXA9QWRkIFRhc2suLi4KLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrLnRvb2x0aXA9QWRkIEJvb2ttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLSMjIEVMIEVycm9yIE1lc3NhZ2UKLSMjCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotUmVuYW1lRWxlbWVudF9sYWJlbD1SZW5hbWUKLU1vdmVFbGVtZW50X2xhYmVsPU1vdmUKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLSMjCi1wcmVmZXJlbmNlS2V5d29yZHMuZmlsZXM9ZWRpdG9yIGpzcCBjcmVhdGluZyBzYXZpbmcgZmlsZXMgc3VmZml4IHNwZWNpZmllZCBlbmNvZGluZyBpYW5hIHZhbGlkYXRpbmcgdmFsaWRhdGUgZnJhZ21lbnRzCi1wcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzPWVkaXRvciBqc3AgdGVtcGxhdGVzIHNuaXBwZXQgbWFjcm9zCi1wcmVmZXJlbmNlS2V5d29yZHMuc3R5bGVzPWVkaXRvciBqc3Agc3R5bGUgY3VzdG9taXplIHN5bnRheCBoaWdobGlnaHRpbmcgdHlwZSB0ZXh0IGNvbnRlbnQgZm9yZWdyb3VuZCBiYWNrZ3JvdW5kIGJvbGQgY29sb3IKLXByZWZlcmVuY2VLZXl3b3Jkcy5mcmFnbWVudHM9ZWRpdG9yIGpzcCBmcmFnbWVudCBsYW5ndWFnZSBjb250ZW50IHR5cGUgdmFsaWRhdGUKLXByZWZlcmVuY2VLZXl3b3Jkcy5zZXZlcml0aWVzPWpzcCBlcnJvcnMgd2FybmluZ3MgaWdub3JlIG9wdGlvbnMgc2V2ZXJpdHkgc2V2ZXJpdGllcyBzdXBwcmVzcyBwcm9qZWN0IHNwZWNpZmljIHByb2plY3RzcGVjaWZpYwotCi0jIwotSlNQSmF2YV9oeXBlcmxpbms9SmF2YSBDb250ZW50IEluIEpTUAotVGFnbGliX2h5cGVybGluaz1UYWdsaWIgRGlyZWN0aXZlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjU5NThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlSlNQX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy8vZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIgotCQkJZXh0ZW5zaW9ucz0ianNwLCBqc2YsIGpzcGYsIGpzcHgsIHRhZywgdGFneCwgdGFnZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkFjdGlvbkNvbnRyaWJ1dG9ySlNQIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIj4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJUNTU19KU1BfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zLy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5BY3Rpb25Db250cmlidXRvckpTUCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotCQkJc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlLnNvdXJjZSI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudmlld3MuY29udGVudG91dGxpbmUuSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0gIAkJPGRvY3VtZW50YXRpb25UZXh0SG92ZXIKLSAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm8uSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQLCBvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiPgotICAJCTwvZG9jdW1lbnRhdGlvblRleHRIb3Zlcj4KLSAgCQk8ZG9jdW1lbnRhdGlvblRleHRIb3ZlcgotICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mby5KU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC5KQVZBIj4KLSAgCQk8L2RvY3VtZW50YXRpb25UZXh0SG92ZXI+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InNvdXJjZWVkaXRpbmd0ZXh0dG9vbHMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQU291cmNlRWRpdGluZ1RleHRUb29scyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iY2hhcmFjdGVycGFpcm1hdGNoZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0LkpTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InN0cnVjdHVyZWR0ZXh0Zm9sZGluZ3Byb3ZpZGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbi5TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMuanNwLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zb3VyY2UsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3Auc3R5bGVzLCxvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByZWZlcmVuY2VzLnZhbGlkYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InNob3dpbnRhcmdldCIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qZHQudWkuUGFja2FnZUV4cGxvcmVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJzcGVsbGluZ3JlZ2lvbnMiCi0JCQl2YWx1ZT0iWE1MX0NPTU1FTlRfVEVYVCwgSlNQX0NPTU1FTlRfVEVYVCwgWE1MX0NPTlRFTlQsIEhUTUxfQ09OVEVOVCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0iYWN0aXZlY29udGV4dHMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSwgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSwgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLm5hdmlnYXRpb24sIG9yZy5lY2xpcHNlLndzdC54bWwuY29tbWVudHMsIG9yZy5lY2xpcHNlLndzdC54bWwuc2VsZWN0aW9uIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgdmFsaWRhdGlvbiBmb3IgSlNQCQkJCQkJCQkJCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQSmF2YVZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmpzcHNvdXJjZXZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULkpBVkEiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgRUwJCQkJCSAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEVMVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuanNwZWxzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSlNQX0VMIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgZGlyZWN0aXZlCQkJICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQRGlyZWN0aXZlVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudGxkc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgYWN0aW9uIHRhZ3MJCQkgICAJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BBY3Rpb25Tb3VyY2VWYWxpZGF0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmpzcGFjdGlvbnZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gY3VzdG9tIFhNTCBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uCQkJCQkgICAJCQkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uTWFya3VwVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5tYXJrdXB2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBIVE1MIChhcyB5b3UgdHlwZSkgdmFsaWRhdGlvbgkJCQkJICAgCQkJCQkJICAJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb24uSlNQQ29udGVudFNvdXJjZVZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb24uaHRtbHN5bnRheHZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUZBVUxUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTUCBVSSBBZGFwdGVyIGZhY3RvcmllcwkJCQkJICAgCQkJCQkJICAJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTUCI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTwvYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24iPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCi0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCQk8IS0tIEpTUCBQUkVGRVJFTkNFIFBBR0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQkJPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSlNQX0ZpbGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMud2ViIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByZWZlcmVuY2VzLmpzcCI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5maWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSlNQX1NvdXJjZS5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMuanNwIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQU291cmNlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3Auc291cmNlIj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUpTUF9UZW1wbGF0ZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5KU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnRlbXBsYXRlcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUpTUF9TeW50YXhfQ29sb3JpbmciCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3Auc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQU3ludGF4Q29sb3JpbmdQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnN0eWxlcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHlsZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUpTUF9WYWxpZGF0aW9uIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMuanNwIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMudmFsaWRhdGlvbiI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zZXZlcml0aWVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfVHlwaW5nIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkpTUFR5cGluZ1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMudHlwaW5nIj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gS2V5d29yZHMgZm9yIHByZWZlcmVuY2UgYW5kIHByb3BlcnRpZXMgcGFnZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkua2V5d29yZHMiPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuZmlsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5maWxlcyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zdHlsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmZyYWdtZW50cyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmZyYWdtZW50cyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuc2V2ZXJpdGllcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnNldmVyaXRpZXMiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRk9SIEpTUC9KQVZBIFJFTkFNRSBQQVJUSUNJUEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnJlbmFtZVBhcnRpY2lwYW50cyI+Ci0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJUpTUF9UeXBlX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVKU1BfTWV0aG9kX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmphdmEucmVmYWN0b3JpbmcuSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiAvPgotCi0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVKU1BfUGFja2FnZV9SZW5hbWVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuamF2YS5yZWZhY3RvcmluZy5KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiAvPgotCi0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiIC8+Ci0KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVuYW1lUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEZPUiBKU1AvSkFWQSBNT1ZFIFBBUlRJQ0lQQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5tb3ZlUGFydGljaXBhbnRzIj4KLQotCQk8bW92ZVBhcnRpY2lwYW50Ci0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVNb3ZlUGFydGljaXBhbnQiCi0JCQluYW1lPSIlSlNQX1R5cGVfTW92ZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlTW92ZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIgLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9tb3ZlUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIGZvciBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnQiPgotCQk8YnJlYWtwb2ludENvbnRyaWJ1dGlvbiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm92aWRlcnMiPgotCQkJPHByb3ZpZGVyCi0JCQkJY29udGVudFR5cGVzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnMuSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIiPgotCQkJCTxjbGFzcyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzLkphdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyIj4KLQkJCQkJPHBhcmFtZXRlciBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiB2YWx1ZT0iKmpzcCxqc3Bfc2VydmxldC5fKiIvPgotCQkJCQk8cGFyYW1ldGVyIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdzb3VyY2UiIHZhbHVlPSIqdGFnLCp0YWd4LHRhZy5fKix0YWd4Ll8qIi8+Ci0JCQkJPC9jbGFzcz4KLQkJCTwvcHJvdmlkZXI+Ci0JCTwvYnJlYWtwb2ludENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gU25pcHBldCBWaWV3IGNvbnRyaWJ1dGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMuU25pcHBldENvbnRyaWJ1dGlvbnMiPgotCQk8Y2F0ZWdvcnkKLQkJCWxhYmVsPSIlSlNQX0V4dGVuc2lvbl9FbGVtZW50LmxhYmVsIgotCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy90YWctanNwLmdpZiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmNhdGVnb3J5MCIKLQkJCWNvbnRlbnR0eXBlcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX2hpZGRlbl9jb21tZW50IgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF9oaWRkZW5fY29tbWVudCI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF9oaWRkZW5fY29tbWVudF9jb250ZW50PC9jb250ZW50PgotCQkJPC9pdGVtPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF9zY3JpcHRsZXQiCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy9qc3BzY3IuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF9zY3JpcHRsZXQiPgotCQkJCTxjb250ZW50PiVqc3Bfc2NyX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX2V4cHJlc3Npb24iCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy9qc3BleHAuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF9leHByZXNzaW9uIj4KLQkJCQk8Y29udGVudD4lanNwX2V4cHJlc3Npb25fY29udGVudDwvY29udGVudD4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3BfZGVjbGFyYXRpb24iCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy9qc3BkZWNsLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfZGVjbGFyYXRpb24iPgotCQkJCTxjb250ZW50PiVqc3BfZGVjbGFyYXRpb25fY29udGVudDwvY29udGVudD4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3BfaW5jbHVkZV9kaXJlY3RpdmUiCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy9qc3BpbmNsLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfaW5jbHVkZV9kaXJlY3RpdmUiPgotCQkJCTxjb250ZW50PiVqc3BfaW5jbHVkZV9kaXJlY3RpdmVfY29udGVudDwvY29udGVudD4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3BfcGFnZV9kaXJlY3RpdmUiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuanNwX3BhZ2VfZGlyZWN0aXZlIj4KLQkJCQk8Y29udGVudD4lanNwX3BhZ2VfZGlyZWN0aXZlX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX3RhZ2xpYl9kaXJlY3RpdmUiCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy9qc3B0YWdsaWIuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF90YWdsaWJfZGlyZWN0aXZlIj4KLQkJCQk8Y29udGVudD4lanNwX3RhZ2xpYl9kaXJlY3RpdmVfY29udGVudDwvY29udGVudD4KLQkJCQk8dmFyaWFibGUKLQkJCQkJZGVzY3JpcHRpb249IiVqc3BfdGFnbGliX2RpcmVjdGl2ZV91cmkiCi0JCQkJCWlkPSJ1cmkiIC8+Ci0KLQkJCQk8dmFyaWFibGUKLQkJCQkJZGVmYXVsdD0ibXlsaWIiCi0JCQkJCWRlc2NyaXB0aW9uPSIlanNwX3RhZ2xpYl9kaXJlY3RpdmVfcHJlZml4IgotCQkJCQlpZD0icHJlZml4IiAvPgotCi0JCQk8L2l0ZW0+Ci0JCTwvY2F0ZWdvcnk+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEFjdGlvblNldCI+Ci0gICAgICAgICAgICA8cGFydCBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTUCBFZGl0b3Igc3BlY2lmaWMgYWN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCTwhLS0gcmVuYW1lIHJlZmFjdG9yIC0tPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQuanNwLnJlZmFjdG9yLnJlbmFtZS5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5yZW5hbWUuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IucmVuYW1lIiAvPgotCi0JCTwhLS0gbW92ZSByZWZhY3RvciAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5tb3ZlLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQuanNwLnJlZmFjdG9yLm1vdmUuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IubW92ZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEtleWJpbmRpbmcgc2NvcGUgZm9yIGpzcCBzb3VyY2UgZWRpdG9yIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3AuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5qc3AuY29yZS5qc3Bzb3VyY2UubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLmpzcC5jb3JlLmpzcHNvdXJjZS5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJPC9jb250ZXh0PgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gS2V5YmluZGluZ3MgZm9yIGpzcCBzb3VyY2UgZWRpdG9yIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIj4KLQkgICAgPCEtLSAgd2luMzI6ICBNMT1DVFJMLCBNMj1TSElGVCwgTTM9QUxUIC0tPgotCQk8IS0tIHJlbmFtZSByZWZhY3RvciAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK1IiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3Auc2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IucmVuYW1lIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQotCQk8IS0tIG1vdmUgcmVmYWN0b3IgLS0+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytWIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuanNwLnNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLm1vdmUiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBUZW1wbGF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZW1wbGF0ZXMiPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVBbGxfSlNQX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0ianNwX2FsbCIgLz4KLQotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVKU1BfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0ianNwX25ldyIgLz4KLQotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVUYWdfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0idGFnX25ldyIgLz4KLQotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVKU1BfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0ianNwX3RhZyIgLz4KLQotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVKU1BfQXR0cmlidXRlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0ianNwX2F0dHJpYnV0ZSIgLz4KLQotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVKU1BfQXR0cmlidXRlX3ZhbHVlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0ianNwX2F0dHJpYnV0ZV92YWx1ZSIgLz4KLQotCQk8aW5jbHVkZQotCQkJZmlsZT0idGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnhtbCIKLQkJCXRyYW5zbGF0aW9ucz0iJG5sJC90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyIgLz4KLQotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBxdWVyeVBhcnRpY2lwYW50IHRvIHBhcnRpY2lwYXRlIGluIGphdmEgc2VyYWNoZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLnF1ZXJ5UGFydGljaXBhbnRzIj4KLQkJPHF1ZXJ5UGFydGljaXBhbnQKLQkJCW5hbWU9IiVKU1BfUXVlcnlfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCW5hdHVyZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpLkpTUFF1ZXJ5UGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qYXZhLnNlYXJjaC51aS5KU1BRdWVyeVBhcnRpY2lwYW50IiAvPgotCi0JPC9leHRlbnNpb24+Ci0JPCEtLSBpbml0aWFsaXplIHhtbCB1aSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBEb2N1bWVudCBwcm92aWRlciBmb3IgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyI+Ci0JCTxwcm92aWRlcgotCQkJaW5wdXRUeXBlcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRGaWxlRG9jdW1lbnRQcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkV4dGVybmFsRmlsZURvY3VtZW50UHJvdmlkZXIiIC8+Ci0KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gTmV3IEpTUCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZC5OZXdKU1BXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9OQU1FIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkLk5ld0pTUFdpemFyZCIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYiPgotCQkJPGRlc2NyaXB0aW9uPiVfVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRTwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0JCTwvd2l6YXJkPgotCi0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZC5OZXdUYWdXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9UQUdfTkFNRSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZC5OZXdUYWdXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2pzcF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX1dJWkFSRF9UQUdfQ1JFQVRFX05FV19GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEFkZCBuZXcgSlNQIHdpemFyZCB0byBQcm9qZWN0IEV4cGxvcmVyIC0tPgotCTxleHRlbnNpb24KLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29tbW9uV2l6YXJkLm5ld0pTUCIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQuTmV3SlNQV2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQk8dGVzdAotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWIiLz4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIgLz4KLQotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIiAvPgotCi0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ3NvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIgLz4KLQotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGxkc291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIiAvPgotCi0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIgLz4KLQotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCTxlZGl0b3JDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZS5lZGl0b3JBY3Rpb25zIgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIj4KLQk8IS0tCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQ2xlYW51cERvY3VtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJUb2dnbGVDb21tZW50IgotCQkJCWxhYmVsPSIlVG9nZ2xlQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJVRvZ2dsZUNvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlRvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iVG9nZ2xlQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iQWRkQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlQWRkQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlQWRkQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQWRkQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJSZW1vdmVCbG9ja0NvbW1lbnQiCi0JCQkJbGFiZWw9IiVSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlJlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW1vdmVCbG9ja0NvbW1lbnQiPgotCQkJPC9hY3Rpb24+LS0+Ci0JCQk8IS0tPGFjdGlvbgotCQkJCWlkPSJSZW5hbWVFbGVtZW50IgotCQkJCWxhYmVsPSIlUmVuYW1lRWxlbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IucmVuYW1lIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW5hbWVFbGVtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJNb3ZlRWxlbWVudCIKLQkJCQlsYWJlbD0iJU1vdmVFbGVtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5tb3ZlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iTW92ZUVsZW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkZpbmRPY2N1cnJlbmNlcyIKLQkJCQlsYWJlbD0iJUZpbmRPY2N1cnJlbmNlc19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkZpbmRPY2N1cnJlbmNlcyI+Ci0JCQk8L2FjdGlvbj4tLT4KLQkJCTwhLS08YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4tLT4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnJ1bGVyLmFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZWxlY3RSdWxlci5sYWJlbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIvPgotICAgICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuUmVuYW1lRWxlbWVudEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLnJlbmFtZSI+Ci0gICAgICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5Nb3ZlRWxlbWVudEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLm1vdmUiPgotICAgICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmhhbmRsZXJzLkpTUEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIj4KLSAgICAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AudWkuanNwU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AudWkuanNwU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPCEtLSBKU1AgRnJhZ21lbnQgUHJvcGVydHkgUGFnZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPCEtLSBmb3IgajJlZSB3ZWIgcHJvamVjdCAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BGcmFnbWVudENvbnRlbnRTZXR0aW5ncy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSI+Ci0gICAgICAgICAJPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICAgCTxhbmQ+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8b3I+IAotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuZnJhZ21lbnRzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BGcmFnbWVudENvbnRlbnRTZXR0aW5ncy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgCTxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgIAk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQkJPG9yPiAKLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BmcmFnbWVudHNvdXJjZSIgLz4KLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3BmcmFnbWVudHNvdXJjZSIgLz4KLQkJCQkJCTwvb3I+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+IAotCQkJPC9lbmFibGVkV2hlbj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmZyYWdtZW50cyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSlNQX1Byb3BlcnR5X3ZhbGlkYXRpb24iIAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcGVydHlQYWdlLnByb2plY3QudmFsaWRhdGlvbiIKLQkJCWNhdGVnb3J5PSJWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UiPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9qZWN0TmF0dXJlIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc2V2ZXJpdGllcyIvPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+CQotCTwhLS0gIGpzcC1mb3ItY3NzIGVkaXRvciBjb25maWd1cmF0aW9ucyAtLT4JCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNTU0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy5KU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRleHQuQ1NTRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic3RydWN0dXJlZHRleHRmb2xkaW5ncHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJwcmVmZXJlbmNlcGFnZXMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3MsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnN0eWxlcyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQkJPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVySlNQZWRDU1MiPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzIj4KLQkJPHRhcmdldAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQluYW1lPSIlSlNQX1NvdXJjZV90YXJnZXRfbmFtZSI+Ci0JCTwvdGFyZ2V0PgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycyI+Ci0JCTxoeXBlcmxpbmtEZXRlY3RvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkpTUEphdmFIeXBlcmxpbmtEZXRlY3RvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluay5KU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQluYW1lPSIlSlNQSmF2YV9oeXBlcmxpbmsiCi0JCQl0YXJnZXRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCTwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0JCTxoeXBlcmxpbmtEZXRlY3RvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLlRhZ2xpYkh5cGVybGlua0RldGVjdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLlRhZ2xpYkh5cGVybGlua0RldGVjdG9yIgotCQkJbmFtZT0iJVRhZ2xpYl9oeXBlcmxpbmsiCi0JCQl0YXJnZXRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCTwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCSAgICAgICAgICAgPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkgICAgICAgICAgICAgIDxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiLz4KLQkgICAgICAgICAgIDwvaXRlcmF0ZT4KLSAgICAgICAgICAgIDwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLQkgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6cmVmYWN0b3JNZW51SWQiPgotCSAgICAgICA8c2VwYXJhdG9yIG5hbWU9ImpzcFJlZmFjdG9yQmVnaW4iIHZpc2libGU9ImZhbHNlIj48L3NlcGFyYXRvcj4KLQkgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLnJlbmFtZSIgaWQ9IlJlbmFtZUVsZW1lbnQiIGxhYmVsPSIlY29tbWFuZC5qc3AucmVmYWN0b3IucmVuYW1lLm5hbWUiIHN0eWxlPSJwdXNoIj4KLQkJCSAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AudWkuanNwU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+Ci0JICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5tb3ZlIiBpZD0iTW92ZUVsZW1lbnQiIGxhYmVsPSIlY29tbWFuZC5qc3AucmVmYWN0b3IubW92ZS5uYW1lIiBzdHlsZT0icHVzaCI+Ci0JCQkgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkgICAgICAgPC9jb21tYW5kPgotCSAgICAgICA8c2VwYXJhdG9yIG5hbWU9ImpzcFJlZmFjdG9yQmVnaW4iIHZpc2libGU9ImZhbHNlIj48L3NlcGFyYXRvcj4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRW5hYmxlIHRoZSBGb3JtYXRIYW5kbGVyIGZvciBKU1AgQ29udGVudCBUeXBlIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLQkJPGhhbmRsZXIgCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5Gb3JtYXRIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdCI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIFNldCB1cCBhIGRlZmluaXRpb24gZm9yIEpTUCBDb250ZW50IFR5cGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BDb250ZW50VHlwZS5kZWZpbml0aW9uIj4KLQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiLz4KLQkJCQk8L2FkYXB0PgotCQkJPC9pdGVyYXRlPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWM3ODI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkNTU1Byb3BlcnR5U291cmNlOwotCi0KLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTUHJvcGVydHlTb3VyY2UgZXh0ZW5kcyBDU1NQcm9wZXJ0eVNvdXJjZSB7Ci0KLQlwdWJsaWMgSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZShJQ1NTTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIHdvcmthcm91bmQgdG8gYXZvaWQgRE9NRXhjZXB0aW9uOiBpZiB2YWx1ZSBjb250YWlucyBqc3AgZWxlbWVudCwgbm90aGluZyBoYXBwZW4uCi0JCVN0cmluZyB2ID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJaWYgKHYuaW5kZXhPZigiJHsiKSAhPSAtMSB8fCB2LmluZGV4T2YoIjwlPSIpICE9IC0xKXsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCVN0cmluZyB0aXRsZSA9IEpTUFVJTWVzc2FnZXMuVGl0bGVfSW52YWxpZFZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbWVzc2FnZSA9IEpTUFVJTWVzc2FnZXMuTWVzc2FnZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcod2luZG93LmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXRQcm9wZXJ0eVZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVySlNQZWRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5ZTg3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUGVkQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUyBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MgewotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckpTUGVkQ1NTKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0pTUGVkQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDM4MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0pTUGVkQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllcy5KU1BlZENTU1Byb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgSlNQZWRDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIGNsYXNzIENTU1Byb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKS5hZGRQcm9wZXJ0eVNoZWV0UGFnZShmUHJvcGVydHlTaGVldFBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDU1NQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgewotCQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZSBmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQlwcml2YXRlIElDU1NOb2RlIGZTb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGZTb3VyY2UgIT0gbnVsbCAmJiBvYmplY3QuZXF1YWxzKGZTb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJZlNvdXJjZSA9IChJQ1NTTm9kZSlvYmplY3Q7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbmV3IEpTUGVkQ1NTUHJvcGVydHlTb3VyY2UoZlNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU291cmNlID0gbnVsbDsKLQkJCQlmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydGllc1JlZnJlc2hKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ERUxBWSA9IDIwMDsKLQotCQlwcml2YXRlIFNldCBwcm9wZXJ0eVNoZWV0UGFnZXMgPSBudWxsOwotCi0JCXB1YmxpYyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpIHsKLQkJCXN1cGVyKFhNTFVJTWVzc2FnZXMuSkZhY2VOb2RlQWRhcHRlcl8xKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMgPSBuZXcgSGFzaFNldCgxKTsKLQkJfQotCi0JCXZvaWQgYWRkUHJvcGVydHlTaGVldFBhZ2UoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcy5hZGQocGFnZSk7Ci0JCQlzY2hlZHVsZShVUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU9iamVjdFtdIHBhZ2VzID0gcHJvcGVydHlTaGVldFBhZ2VzLnRvQXJyYXkoKTsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcy5jbGVhcigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IChQcm9wZXJ0eVNoZWV0UGFnZSkgcGFnZXNbaV07Ci0JCQkJaWYgKHBhZ2UuZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIXBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQlwYWdlLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzUmVmcmVzaEpvYiBmUHJvcGVydGllc1JlZnJlc2hKb2IgPSBudWxsOwotCi0JSVByb3BlcnR5U2hlZXRQYWdlIGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCXByaXZhdGUgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXIgZlJlZnJlc2hBZGFwdGVyID0gbmV3IENTU1Byb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBJTm9kZU5vdGlmaWVyW10gZlNlbGVjdGVkTm90aWZpZXJzOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBKU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldElucHV0U2VsZWN0aW9uKElXb3JrYmVuY2hQYXJ0IHNlbGVjdGluZ1BhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHJlbW92ZSBVSSByZWZyZXNoIGFkYXB0ZXJzCi0JCWlmIChmU2VsZWN0ZWROb3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWROb3RpZmllcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0ucmVtb3ZlQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJfQotCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gbnVsbDsKLQkJfQotCi0JCUlTZWxlY3Rpb24gcHJlZmVycmVkU2VsZWN0aW9uID0gc3VwZXIuZ2V0SW5wdXRTZWxlY3Rpb24oc2VsZWN0aW5nUGFydCwgc2VsZWN0aW9uKTsKLQkJaWYgKHByZWZlcnJlZFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMgPSBuZXcgT2JqZWN0WygoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCksIDAsIHNlbGVjdGVkT2JqZWN0cywgMCwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSBzZWxlY3RlZE9iamVjdHNbaV07Ci0JCQkJCXdoaWxlIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFKSB7Ci0JCQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlzZWxlY3RlZE9iamVjdHNbaV0gPSBub2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvKgotCQkJICogQWRkIFVJIHJlZnJlc2ggYWRhcHRlcnMgYW5kIHJlbWVtYmVyIG5vdGlmaWVycyBmb3IgbGF0ZXIKLQkJCSAqIHJlbW92YWwKLQkJCSAqLwotCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAwKSB7Ci0JCQkJTGlzdCBzZWxlY3RlZE5vdGlmaWVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCXNlbGVjdGVkTm90aWZpZXJzLmFkZChzZWxlY3RlZE9iamVjdHNbaV0pOwotCQkJCQkJKChJTm9kZU5vdGlmaWVyKSBzZWxlY3RlZE9iamVjdHNbaV0pLmFkZEFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmU2VsZWN0ZWROb3RpZmllcnMgPSAoSU5vZGVOb3RpZmllcltdKSBzZWxlY3RlZE5vdGlmaWVycy50b0FycmF5KG5ldyBJTm9kZU5vdGlmaWVyW3NlbGVjdGVkTm90aWZpZXJzLnNpemUoKV0pOwotCQkJfQotCQkJcHJlZmVycmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRPYmplY3RzKTsKLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkU2VsZWN0aW9uOwotCX0KLQotCVByb3BlcnRpZXNSZWZyZXNoSm9iIGdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQlpZiAoZlByb3BlcnRpZXNSZWZyZXNoSm9iID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG5ldyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydGllc1JlZnJlc2hKb2I7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJaWYgKGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbmV3IENTU1Byb3BlcnR5U291cmNlUHJvdmlkZXIoKTsKLQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IHBhZ2U7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKCkgewotCQlzdXBlci51bmNvbmZpZ3VyZSgpOwotCQlpZiAoZlNlbGVjdGVkTm90aWZpZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkTm90aWZpZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZlNlbGVjdGVkTm90aWZpZXJzW2ldLnJlbW92ZUFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCX0KLQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNDE1OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgTWF0dGhpYXMgRnVlc3NlbCwgbWF0LmZ1ZXNzZWxAZ214Lm5ldCAtIFsxNzczODddIHVzZSBiYXNlIGh5cGVybGlua2luZyBleHRlbnNpb24gcG9pbnRzICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuSUphdmFQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHREb3VibGVDbGlja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQuU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUEVMQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmZvcm1hdC5Gb3JtYXR0aW5nU3RyYXRlZ3lKU1BKYXZhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhLkxpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsLkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgSlNQIGNvbnRlbnQuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1A7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMOwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGZKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCgpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3RyYXRlZ2llcyA9IG51bGw7Ci0KLQkJaWYgKGNvbnRlbnRUeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKSB7Ci0JCQkvLyB4bWwgYXV0b2VkaXQgc3RyYXRlZ2llcwotCQkJc3RyYXRlZ2llcyA9IGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSkgewotCQkJLy8ganNwIGphdmEgYXV0b2VkaXQgc3RyYXRlZ2llcwotCQkJTGlzdCBhbGxTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBqYXZhU3RyYXRlZ2llcyA9IGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhbGxTdHJhdGVnaWVzLmFkZChqYXZhU3RyYXRlZ2llc1tpXSk7Ci0JCQl9Ci0JCQkvLyBiZSBzdXJlIHRoaXMgaXMgYWRkZWQgbGFzdCwgYWZ0ZXIgb3RoZXJzLCBzbyBpdCBjYW4gbW9kaWZ5Ci0JCQkvLyByZXN1bHRzIGZyb20gZWFybGllciBzdGVwcy4KLQkJCS8vIGFkZCBhdXRvIGVkaXQgc3RyYXRlZ3kgdGhhdCBoYW5kbGVzIHdoZW4gdGFiIGtleSBpcyBwcmVzc2VkCi0JCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgQXV0b0VkaXRTdHJhdGVneUZvclRhYnMoKSk7Ci0KLQkJCXN0cmF0ZWdpZXMgPSAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQgfHwgY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04pIHsKLQkJCS8vIGh0bWwgYW5kIGpzcCBhdXRvZWRpdCBzdHJhdGVnaWVzCi0JCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCQkvLyBhZGQgdGhlIGpzcCBhdXRvZWRpdCBzdHJhdGVneSBmaXJzdCB0aGVuIGFkZCBhbGwgaHRtbCdzCi0JCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1AoKSk7Ci0KLQkJCUlBdXRvRWRpdFN0cmF0ZWd5W10gaHRtbFN0cmF0ZWdpZXMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaHRtbFN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhbGxTdHJhdGVnaWVzLmFkZChodG1sU3RyYXRlZ2llc1tpXSk7Ci0JCQl9Ci0KLQkJCXN0cmF0ZWdpZXMgPSAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZGVmYXVsdCBhdXRvZWRpdCBzdHJhdGVnaWVzCi0JCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN1cGVyU3RyYXRlZ2llcyA9IHN1cGVyLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWxsU3RyYXRlZ2llcy5hZGQoc3VwZXJTdHJhdGVnaWVzW2ldKTsKLQkJCX0KLQotCQkJLy8gYmUgc3VyZSB0aGlzIGlzIGFkZGVkIGxhc3QsIGFmdGVyIG90aGVycywgc28gaXQgY2FuIG1vZGlmeQotCQkJLy8gcmVzdWx0cyBmcm9tIGVhcmxpZXIgc3RlcHMuCi0JCQkvLyBhZGQgYXV0byBlZGl0IHN0cmF0ZWd5IHRoYXQgaGFuZGxlcyB3aGVuIHRhYiBrZXkgaXMgcHJlc3NlZAotCQkJYWxsU3RyYXRlZ2llcy5hZGQobmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzKCkpOwotCi0JCQlzdHJhdGVnaWVzID0gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQkJfQotCi0JCXJldHVybiBzdHJhdGVnaWVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogQSBsaXR0bGUgYml0IG9mIGNoZWF0aW5nIGJlY2F1c2UgYXNzdW1pbmcgaHRtbCdzIGNvbmZpZ3VyZWQKLQkJCSAqIGNvbnRlbnQgdHlwZXMgd2lsbCBhZGQgZGVmYXVsdCwgdW5rbm93biwgYW5kIGFsbCB4bWwgY29uZmlndXJlZAotCQkJICogY29udGVudCB0eXBlcwotCQkJICovCi0JCQlTdHJpbmdbXSBodG1sVHlwZXMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCVN0cmluZ1tdIGpzcFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUC5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbaHRtbFR5cGVzLmxlbmd0aCArIGpzcFR5cGVzLmxlbmd0aF07Ci0KLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGh0bWxUeXBlcywgMCwgZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMsIGluZGV4LCBodG1sVHlwZXMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoanNwVHlwZXMsIDAsIGZDb25maWd1cmVkQ29udGVudFR5cGVzLCBpbmRleCArPSBodG1sVHlwZXMubGVuZ3RoLCBqc3BUeXBlcy5sZW5ndGgpOwotCQl9Ci0KLQkJcmV0dXJuIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHsKLQkJCS8vIEhUTUwgSmF2YVNjcmlwdAotCQkJSUNvbnRlbnRBc3Npc3RhbnQgaHRtbENvbnRlbnRBc3Npc3RhbnQgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldENvbnRlbnRBc3Npc3RhbnQoc291cmNlVmlld2VyKTsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IGh0bWxDb250ZW50QXNzaXN0YW50LmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLlNDUklQVCk7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117cHJvY2Vzc29yfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQkvLyBIVE1MIENTUwotCQkJSUNvbnRlbnRBc3Npc3RhbnQgaHRtbENvbnRlbnRBc3Npc3RhbnQgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldENvbnRlbnRBc3Npc3RhbnQoc291cmNlVmlld2VyKTsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IGh0bWxDb250ZW50QXNzaXN0YW50LmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUNTU1BhcnRpdGlvbnMuU1RZTEUpOwotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde3Byb2Nlc3Nvcn07Ci0JCX0KLQkJLy8gLy8ganNwY29udGVudGFzc2lzdHByb2Nlc3NvciBoYW5kbGVzIHRoaXM/Ci0JCS8vIGVsc2UgaWYgKChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9uVHlwZXMuSFRNTF9ERUZBVUxUKSB8fAotCQkvLyAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvblR5cGVzLkhUTUxfQ09NTUVOVCkpIHsKLQkJLy8gcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldwotCQkvLyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJLy8gfQotCQllbHNlIGlmICgocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpIHx8IChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpIHx8IChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0RFTElNSVRFUikgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTU1FTlQpKSB7Ci0JCQkvLyBqc3AKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgSlNQQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmICgocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEpIHx8IChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEpKSB7Ci0JCQkvLyBqc3AgamF2YQotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUX0VMKSB7Ci0JCQkvLyBqc3AgZWwKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OKSB7Ci0JCQkvLyB1bmtub3duCi0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCUlDb250ZW50Rm9ybWF0dGVyIGZvcm1hdHRlciA9IHN1cGVyLmdldENvbnRlbnRGb3JtYXR0ZXIoc291cmNlVmlld2VyKTsKLQkJLy8gc3VwZXIgd2FzIHVuYWJsZSB0byBjcmVhdGUgYSBmb3JtYXR0ZXIsIHByb2JhYmx5IGJlY2F1c2UKLQkJLy8gc291cmNlVmlld2VyIGRvZXMgbm90IGhhdmUgZG9jdW1lbnQgc2V0IHlldCwgc28ganVzdCBjcmVhdGUgYQotCQkvLyBnZW5lcmljIG9uZQotCQlpZiAoIShmb3JtYXR0ZXIgaW5zdGFuY2VvZiBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSkKLQkJCWZvcm1hdHRlciA9IG5ldyBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0KLQkJTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlciBtdWx0aUZvcm1hdHRlciA9IChNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSBmb3JtYXR0ZXI7Ci0JCW11bHRpRm9ybWF0dGVyLnNldE1hc3RlclN0cmF0ZWd5KG5ldyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5KG5ldyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCgpKSk7Ci0JCW11bHRpRm9ybWF0dGVyLnNldFNsYXZlU3RyYXRlZ3kobmV3IEZvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEoKSwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwdWJsaWMgSVRleHREb3VibGVDbGlja1N0cmF0ZWd5IGdldERvdWJsZUNsaWNrU3RyYXRlZ3koSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgc3RyYXRlZ3kgPSBudWxsOwotCi0JCS8vIGh0bWwgb3IgamF2YXNjcmlwdAotCQlpZiAoY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCB8fCBjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKQotCQkJc3RyYXRlZ3kgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEgfHwgY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkKLQkJCS8vIEpTUCBKYXZhIG9yIEpTUCBKYXZhU2NyaXB0Ci0JCQlzdHJhdGVneSA9IGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpCi0JCQkvLyBKU1AgKGp1c3QgdHJlYXQgbGlrZSBodG1sKQotCQkJc3RyYXRlZ3kgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJZWxzZQotCQkJc3RyYXRlZ3kgPSBzdXBlci5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCi0JCXJldHVybiBzdHJhdGVneTsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpOwotCQl9Ci0JCXJldHVybiBmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEluZGVudFByZWZpeGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJU3RyaW5nW10gaW5kZW50YXRpb25zID0gbnVsbDsKLQotCQlpZiAoY29udGVudFR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpCi0JCQlpbmRlbnRhdGlvbnMgPSBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWVsc2UKLQkJCWluZGVudGF0aW9ucyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0KLQkJcmV0dXJuIGluZGVudGF0aW9uczsKLQl9Ci0KLQlwcml2YXRlIEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJLyoKLQkJCSAqIE5PVEU6IG51bGwgdGV4dCBlZGl0b3IgaXMgYmVpbmcgcGFzc2VkIHRvCi0JCQkgKiBKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBiZWNhdXNlCi0JCQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZG9lcyBub3Qga25vdyBjdXJyZW50IGVkaXRvci4KLQkJCSAqIHRoaXMgaXMgb2theSBiZWNhdXNlIGVkaXRvciBpcyBub3QgbmVlZGVkIGluIHRoZSBjYXNlcyB3ZSBhcmUKLQkJCSAqIHVzaW5nIGphdmFzb3VyY2V2aWV3ZXJjb25maWd1cmF0aW9uLgotCQkJICovCi0JCQlmSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oSmF2YVVJLmdldENvbG9yTWFuYWdlcigpLCBzdG9yZSwgbnVsbCwgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gZkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5UIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04pIHsKLQkJCXByb3ZpZGVycyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkgewotCQkJcHJvdmlkZXJzID0gZ2V0SFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQlwcm92aWRlcnMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIElDU1NQYXJ0aXRpb25zLlNUWUxFKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQgfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04gfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfUEkpIHsKLQkJCXByb3ZpZGVycyA9IGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckphdmEoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTCkgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCgpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT01NRU5UIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfREVMSU1JVEVSIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckpTUCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckphdmEoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckphdmEgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckphdmE7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckpTUCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckpTUCA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUw7Ci0JfQotCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCi0JCQkJCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJCQlzLmluc2VydCgwLCBzdXBlci5nZXRUZXh0KG5vZGUpKTsKLQkJCQkJCX0KLQkJCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJCXMuaW5zZXJ0KDAsIElQYXRoLlNFUEFSQVRPUik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCU1hcCB0YXJnZXRzID0gc3VwZXIuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKHNvdXJjZVZpZXdlcik7Ci0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1AsIG51bGwpOwotCi0JCS8vIGFsc28gYWRkIGh0bWwgJiB4bWwgc2luY2UgdGhlcmUgY291bGQgYmUgaHRtbC94bWwgY29udGVudCBpbiBqc3AKLQkJLy8gKGp1c3QgaG9wZSB0aGUgaHlwZXJsaW5rIGRldGVjdG9ycyB3aWxsIGRvIGFkZGl0aW9uYWwgY2hlY2tpbmcpCi0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCwgbnVsbCk7Ci0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwsIG51bGwpOwotCQlyZXR1cm4gdGFyZ2V0czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSUFjdGlvbkNvbnN0YW50c0pTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0lBY3Rpb25Db25zdGFudHNKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwMDc4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSUFjdGlvbkNvbnN0YW50c0pTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbkNvbnN0YW50c0pTUCB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfUkVOQU1FX0VMRU1FTlQgPSAiUmVuYW1lRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQgPSAiTW92ZUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSUFjdGlvbkRlZmluaXRpb25JZHNKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTA2MDdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbkRlZmluaXRpb25JZHNKU1AgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTkFNRV9FTEVNRU5UID0gSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLlJFTkFNRV9FTEVNRU5UOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1PVkVfRUxFTUVOVCA9IElKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5NT1ZFX0VMRU1FTlQ7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2N2FlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IEpTUCBVSQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUFVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlOwotCQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKU1BVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2FtcGxlX0pTUF9kb2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQX0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZmFjdG9yX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUVsZW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVFbGVtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRWxlbWVudFdpemFyZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BfY2hhbmdlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpb25Db250cmlidXRvckpTUF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFJlbmFtZUVsZW1lbnRBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BNb3ZlRWxlbWVudEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha3BvaW50Tm90QWxsb3dlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfVEFHX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1RBR19ORVdfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1RBR19ORVdfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNfbGFiZWw7CS8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVfbWV0aG9kX2luOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzX2VuY29kaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQQ29sb3JQYWdlX2pzcF9jb250ZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpdGxlX0ludmFsaWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlX0ludmFsaWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFR5cGluZ19BdXRvX0NvbXBsZXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFR5cGluZ19Db21wbGV0ZV9TY3JpcHRsZXRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFR5cGluZ19Db21wbGV0ZV9CcmFjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzA7Ci0KLQkvLyBiZWxvdyBhcmUgdGhlIHN0cmluZ3MgZm9yIHRoZSB2YWxpZGF0aW9uIHBhZ2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fV2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fSWdub3JlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9IRUFERVJfRElSRUNUSVZFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfRElGRkVSRU5UX1VSSVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19TQU1FX1VSSVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1VSSV9PUl9UQUdESVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1BBR0VfU1VQRVJDTEFTU19OT1RfRk9VTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9OT19GSUxFX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX0ZJTEVfTk9UX0ZPVU5EOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fSEVBREVSX0pBVkE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9KQVZBX05PVElDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfVU5VU0VEX0lNUE9SVDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fSEVBREVSX0VMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRUxfU1lOVEFYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRUxfTEVYRVI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0hFQURFUl9DVVNUT01fQUNUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX1VOS05PV05fQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9OT05fRU1QVFlfSU5MSU5FX1RBRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9WQUxJREFUSU9OX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0ZPVU5EOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9JTlNUQU5USUFURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfUlVOVElNRV9FWENFUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9UQUdfSEFORExFUl9DTEFTU19OT1RfRk9VTkQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0hFQURFUl9TVEFOREFSRF9BQ1RJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9JTlZBTElEX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNCRUFOX01JU1NJTkdfVFlQRV9JTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9BTUJJR1VPVVNfVFlQRV9JTkZPOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUTERIeXBlcmxpbmtfaHlwZXJsaW5rVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDdXN0b21UYWdIeXBlcmxpbmtfaHlwZXJsaW5rVGV4dDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2NiODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGw7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIEpTUFVJUGx1Z2luIGluc3RhbmNlID0gbnVsbDsJCi0JCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUganNwIGVkaXRvci4gCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCQotCS8qKiAKLQkgKiBUaGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUganNwIGVkaXRvci4gCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCi0JcHVibGljIEpTUFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKU1BVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSlNQVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUganNwIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZT0gbmV3IENvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmUoZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCi0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBqc3AgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGpzcCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCUNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BTEwpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVcpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5UQUcpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BVFRSSUJVVEUpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BVFRSSUJVVEVfVkFMVUUpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVdfVEFHKTsKLQkJCQotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnk9IHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MGEzMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIGEgc2FtcGxlIEpTUCBkb2N1bWVudC4gIFBsZWFzZSB0cmFuc2xhdGUgb25seSB0aGUgZm9sbG93aW5nIHBhcnRzOgotIyMgVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMQotIyMgV2VsY29tZSEKLSMjIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjIKLSMjIFdlbGNvbWUhCi1TYW1wbGVfSlNQX2RvYz08JUAgcGFnZSBcblx0bGFuZ3VhZ2U9XCJqYXZhXCIgXG5cdGNvbnRlbnRUeXBlPVwidGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTFcIlxuJT5cbjxqc3A6aW5jbHVkZSBmbHVzaD1cInRydWVcIiBwYWdlPVwidGl0bGVCYXIuanNwXCIvPlxuXG48JS0tIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjEgLS0lPlxuPCVcblx0U3lzdGVtLm91dC5wcmludGxuKFwiV2VsY29tZSFcIik7XG4lPlxuPCUtLSBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4yIC0tJT5cbjxqc3A6c2NyaXB0bGV0PlxuXHRTeXN0ZW0ub3V0LnByaW50bG4oXCJXZWxjb21lIVwiKTtcbjwvanNwOnNjcmlwdGxldD4KLUpTUF9EZWxpbWl0ZXJzX1VJXz1TY3JpcHRpbmcgRWxlbWVudCBEZWxpbWl0ZXJzCi1SZWZhY3Rvcl9sYWJlbD1SZWZhY3RvcgotUmVuYW1lRWxlbWVudF9sYWJlbD1SZW5hbWUKLU1vdmVFbGVtZW50X2xhYmVsPU1vdmUKLU1vdmVFbGVtZW50V2l6YXJkPU1vdmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRzCi0jCi1PSz1PSwotQnJlYWtwb2ludE5vdEFsbG93ZWQ9QSBicmVha3BvaW50IGlzIG5vdCBhbGxvd2VkIG9uIHRoaXMgbGluZQotSlNQX2NoYW5nZXM9SlNQIGNoYW5nZXMKLUFjdGlvbkNvbnRyaWJ1dG9ySlNQXzA9UmVmYSZjdG9yCi1KU1BSZW5hbWVFbGVtZW50QWN0aW9uXzA9RWRpdG9yIHNlbGVjdGlvbiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgcmVuYW1hYmxlIEphdmEgZWxlbWVudAotSlNQTW92ZUVsZW1lbnRBY3Rpb25fMD1FZGl0b3Igc2VsZWN0aW9uIGRvZXMgbm90IHJlc29sdmUgdG8gbW92YWJsZSBKYXZhIGVsZW1lbnRzCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzA9SlNQIFJlbmFtZQotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8xPWluIGZpbGU6IHswfSBsaW5lOiB7MX0KLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMj1Nb3ZlIFR5cGUgJyd7MH0nJyB0byBwYWNrYWdlICcnezF9JycKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMz1SZW5hbWUgTWV0aG9kICcnezB9JycgdG8gJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl80PVJlbmFtZSBUeXBlICcnezB9JycgdG8gJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl81PVJlbmFtZSBQYWNrYWdlICcnezB9JycgdG8gJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl82PUpTUCBSZW5hbWUgQ2hhbmdlCi0jCi1fVUlfV0laQVJEX05FV19USVRMRSA9IE5ldyBKYXZhU2VydmVyIFBhZ2UKLV9VSV9XSVpBUkRfTkVXX0hFQURJTkcgPSBKYXZhU2VydmVyIFBhZ2UKLV9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OID0gQ3JlYXRlIGEgbmV3IEphdmFTZXJ2ZXIgUGFnZS4KLV9VSV9XSVpBUkRfVEFHX05FV19USVRMRSA9IE5ldyBUYWcgRmlsZQotX1VJX1dJWkFSRF9UQUdfTkVXX0hFQURJTkcgPSBUYWcgRmlsZQotX1VJX1dJWkFSRF9UQUdfTkVXX0RFU0NSSVBUSU9OID0gQ3JlYXRlIGEgbmV3IFRhZy4KLV9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9KU1AgPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgezB9LiAKLV9XQVJOSU5HX0ZJTEVfTVVTVF9CRV9JTlNJREVfSkFWQV9QUk9KRUNUID0gSmF2YVNlcnZlciBQYWdlcyBjcmVhdGVkIGluIHByb2plY3RzIHRoYXQgZG8gbm90IHN1cHBvcnQgSmF2YSBtaWdodCBub3Qgd29yayBhcyBleHBlY3RlZC4gCi1fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQgPSBGaWxlcyBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIFdlYiBDb250ZW50IGZvbGRlciB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB5b3VyIGRlcGxveWVkIFdlYiBhcHBsaWNhdGlvbi4gCi1SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMgPSBUaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8wPVNlbGVjdCBKU1AgVGVtcGxhdGUKLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMT1TZWxlY3QgYSB0ZW1wbGF0ZSBhcyBpbml0aWFsIGNvbnRlbnQgaW4gdGhlIEpTUCBwYWdlLgotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8yPU5hbWUKLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMz1EZXNjcmlwdGlvbgotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV80PVVzZSBKU1AgVGVtcGxhdGUKLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNT1QcmV2aWV3Ci1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IEpTUCcgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5KU1AgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi1OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IFRhZyBmaWxlIFRlbXBsYXRlCi1OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBUYWcgZmlsZS4KLU5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgVGFnIGZpbGUgVGVtcGxhdGUKLU5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfNT1QcmV2aWV3Ci1OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IFRhZycgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5KU1AgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi0jIENvcGllZCBmcm9tIHNzZS51aQotQ2xlYW51cERvY3VtZW50X2xhYmVsPUNsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLUNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbj1DbGVhbnVwIERvY3VtZW50Ci1Ub2dnbGVDb21tZW50X2xhYmVsPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X3Rvb2x0aXA9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb249VG9nZ2xlIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9sYWJlbD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wPXswfSAtIHsxfSBPY2N1cnJlbmNlcyBpbiB7Mn0KLU9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMj1maWxlCi1Db250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV89Q29udGVudCBBc3Npc3Qgbm90IGF2YWlsYWJsZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbgotSmF2YV9Db250ZW50X0Fzc2lzdF9pc19ub3RfVUlfPUphdmEgQ29udGVudCBBc3Npc3QgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgY3Vyc29yIGxvY2F0aW9uCi0jCi1PdmVycmlkZV9tZXRob2RfaW49T3ZlcnJpZGUgbWV0aG9kIGluICcKLUNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nPUNyZWF0aW5nIGZpbGVzIGVuY29kaW5nIHByZWZlcmVuY2UKLSMKLUpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzA9SlNQIFNvdXJjZSBwcmVmZXJlbmNlcyBhcmUgYmFzZWQgb24gdGhlIGNvbnRlbnQgd2l0aGluIHRoZSBKU1AuCi1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8xPVNlZSA8YT4nJ3swfScnPC9hPiBmb3IgSlNQIHdpdGggSFRNTCBjb250ZW50LgotSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMj1TZWUgPGE+Jyd7MH0nJzwvYT4gZm9yIEpTUCB3aXRoIFhNTCBjb250ZW50LgotSlNQQ29sb3JQYWdlX2pzcF9jb250ZW50PVNjcmlwdGluZyBFbGVtZW50cwotSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8wPVZhbGlkYXRpbmcgZmlsZXMKLUpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMT1WYWxpZGF0ZSBKU1AgZnJhZ21lbnRzCi0jIEpTUCBGcmFnbWVudHMKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1ub25lCi1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzE9VGhlIHByb3BlcnRpZXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZSB0aGF0IGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSlNQIGZyYWdtZW50IGZpbGVzLiAgVGhlIHByb2plY3Qgc2V0dGluZyBpcyB1c2VkIGlmIHlvdSBzcGVjaWZ5ICJub25lLiIKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMj1MYW5ndWFnZToKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMz1Db250ZW50IFR5cGU6Ci1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzQ9RW5hYmxlIHNwZWNpZmljIHNldHRpbmc6Ci1Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPVRoZSBwcm9wZXJ0aWVzIGZvciBKMkVFIFdlYiBwcm9qZWN0cyBhY3QgYXMgInByb2plY3QiIGRlZmF1bHQgdG8gYmUgbG9va2VkIHVwIHdoZW4gbm8gcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgSlNQIGZyYWdtZW50IGZpbGUuCi0jIENTUyBKU1AKLVRpdGxlX0ludmFsaWRWYWx1ZT1JbnZhbGlkIFZhbHVlCi1NZXNzYWdlX0ludmFsaWRWYWx1ZT1JbnZhbGlkIHByb3BlcnR5IHZhbHVlLgotCi1TeW50YXhDb2xvcmluZ1BhZ2VfMD1TeW50YXggRWxlbWVudDoKLVN5bnRheENvbG9yaW5nUGFnZV8yPUVuYWJsZQotU3ludGF4Q29sb3JpbmdQYWdlXzM9JkJvbGQKLVN5bnRheENvbG9yaW5nUGFnZV80PSZJdGFsaWMKLVN5bnRheENvbG9yaW5nUGFnZV81PSZTdHJpa2V0aHJvdWdoCi1TeW50YXhDb2xvcmluZ1BhZ2VfNj0mVW5kZXJsaW5lCi1fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LPUpTUCBlZGl0aW5nIHByZWZlcmVuY2VzLiAgTm90ZSB0aGF0IHNvbWUgcHJlZmVyZW5jZXMgbWF5IGJlIHNldCBvbiB0aGUgPGE+ezB9PC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi0KLSMgSlNQIFR5cGluZyBQcmVmZXJlbmNlIFBhZ2UKLUpTUFR5cGluZ19BdXRvX0NvbXBsZXRlPUF1dG9tYXRpY2FsbHkgY2xvc2UKLUpTUFR5cGluZ19Db21wbGV0ZV9TY3JpcHRsZXRzPSZTY3JpcHRsZXQgcmVnaW9ucwotSlNQVHlwaW5nX0NvbXBsZXRlX0JyYWNlcz0mQnJhY2VzIGluIEVMIGV4cHJlc3Npb25zCi0jIFZhbGlkYXRpb24gcGFnZSBzdHJpbmdzCi1WYWxpZGF0aW9uX2Rlc2NyaXB0aW9uPVNlbGVjdCB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBwcm9ibGVtczoKLVZhbGlkYXRpb25fV2FybmluZz1XYXJuaW5nCi1WYWxpZGF0aW9uX0Vycm9yPUVycm9yCi1WYWxpZGF0aW9uX0lnbm9yZT1JZ25vcmUKLUpTUFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8wPUVycm9ycy9XYXJuaW5ncwotCi1WQUxJREFUSU9OX0hFQURFUl9ESVJFQ1RJVkU9RGlyZWN0aXZlcwotVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19ESUZGRVJFTlRfVVJJUz1TYW1lIHByZWZpeCB1c2VkIGZvciBkaWZmZXJlbnQgVVJJcyBvciB0YWdkaXI6Ci1WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX1NBTUVfVVJJUz1SZWR1bmRhbnQgdGFnIGxpYnJhcnkgZGlyZWN0aXZlOgotVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfUFJFRklYPU5vIHByZWZpeCBzcGVjaWZpZWQ6Ci1WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19VUklfT1JfVEFHRElSPU5vIFVSSSBvciB0YWdkaXIgc3BlY2lmaWVkOgotVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSPVVucmVzb2x2YWJsZSBVUkkgb3IgdGFnZGlyOgotVkFMSURBVElPTl9ESVJFQ1RJVkVfUEFHRV9TVVBFUkNMQVNTX05PVF9GT1VORD1TdXBlcmNsYXNzIG5vdCBmb3VuZDoKLVZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfTk9fRklMRV9TUEVDSUZJRUQ9SW5jbHVkZWQgZnJhZ21lbnQgZmlsZSBub3Qgc3BlY2lmaWVkOgotVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9GSUxFX05PVF9GT1VORD1JbmNsdWRlZCBmcmFnbWVudCBmaWxlIG5vdCBmb3VuZDoKLQotVkFMSURBVElPTl9IRUFERVJfSkFWQT1KYXZhCi1WQUxJREFUSU9OX0pBVkFfTk9USUNFPVRoZXNlIHZhbHVlcyBvdmVycmlkZSB0aG9zZSBvbiB0aGUgPGE+Jyd7MH0nJzwvYT4gcGFnZToKLVZBTElEQVRJT05fSkFWQV9MT0NBTF9WQVJJQUJMRV9ORVZFUl9VU0VEPUxvY2FsIHZhcmlhYmxlIG5ldmVyIHVzZWQ6Ci1WQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRD1QYXJhbWV0ZXIgaXMgbmV2ZXIgcmVhZDoKLVZBTElEQVRJT05fSkFWQV9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRT1OdWxsIHBvaW50ZXIgYWNjZXNzOgotVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRT1Qb3RlbnRpYWwgbnVsbCBwb2ludGVyIGFjY2VzczoKLVZBTElEQVRJT05fSkFWQV9VTlVTRURfSU1QT1JUPVVudXNlZCBpbXBvcnQ6Ci0JCi1WQUxJREFUSU9OX0hFQURFUl9FTD1FeHByZXNzaW9uIExhbmd1YWdlCi1WQUxJREFUSU9OX0VMX1NZTlRBWD1FTCBTeW50YXggcHJvYmxlbToKLVZBTElEQVRJT05fRUxfTEVYRVI9VW5hYmxlIHRvIGFuYWx5emUgRUwgZXhwcmVzc2lvbiBkdWUgdG8gbGV4aWNhbCBhbmFseXNpcyBlcnJvcjogCi0KLVZBTElEQVRJT05fSEVBREVSX0NVU1RPTV9BQ1RJT05TPUN1c3RvbSBhY3Rpb25zCi1WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEU9TWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGU6Ci1WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfVU5LTk9XTl9BVFRSSUJVVEU9VW5rbm93biBhdHRyaWJ1dGU6Ci1WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTk9OX0VNUFRZX0lOTElORV9UQUc9VGFnIGRlY2xhcmVkIHdpdGggZW1wdHkgY29udGVudCBoYXMgY29udGVudDoKLVZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX1ZBTElEQVRJT05fTUVTU0FHRT1UYWdFeHRyYUluZm8gdmFsaWRhdGlvbiBtZXNzYWdlOgotVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0ZPVU5EPVRhZ0V4dHJhSW5mbyBjbGFzcyBub3Qgb24gSmF2YSBCdWlsZCBQYXRoOgotVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0lOU1RBTlRJQVRFRD1GYWlsdXJlIGluc3RhbnRpYXRpbmcgVGFnRXh0cmFJbmZvIGNsYXNzOgotVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfUlVOVElNRV9FWENFUFRJT049T3RoZXIgcHJvYmxlbXMgd2l0aCBUYWdFeHRyYUluZm8gY2xhc3M6CQotVkFMSURBVElPTl9UUkFOU0xBVElPTl9UQUdfSEFORExFUl9DTEFTU19OT1RfRk9VTkQ9Q2xhc3NpYyB0YWcgaGFuZGxlciBjbGFzcyBub3Qgb24gSmF2YSBCdWlsZCBQYXRoOgotCi1WQUxJREFUSU9OX0hFQURFUl9TVEFOREFSRF9BQ1RJT05TPVN0YW5kYXJkIGFjdGlvbnMKLVZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9JTlZBTElEX0lEPUludmFsaWQgJ2lkJyBzcGVjaWZpZWQgZm9yIGpzcDp1c2VCZWFuOgotVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0JFQU5fTUlTU0lOR19UWVBFX0lORk89TWlzc2luZyB0eXBlIGluZm9ybWF0aW9uIGZvciBqc3A6dXNlQmVhbjoKLVZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9BTUJJR1VPVVNfVFlQRV9JTkZPPUFtYmlndW91cyB0eXBlIGluZm9ybWF0aW9uIGZvciBqc3A6dXNlQmVhbjoKLQotT3Blbj1PcGVuICd7MH0nCi1UTERIeXBlcmxpbmtfaHlwZXJsaW5rVGV4dD1PcGVuIERlc2NyaXB0b3IKLUN1c3RvbVRhZ0h5cGVybGlua19oeXBlcmxpbmtUZXh0PU9wZW4gRGVjbGFyYXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjAwZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYgZGVzaXJlZCwKLSAqIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzIHBsdWdpbi4gT3RoZXIKLSAqIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiBAcGFyYW0gbGV2ZWwgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5IGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjYmMwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Db25maWd1cmFibGVMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIEF1dG9FZGl0U3RyYXRlZ3kgdG8gaGFuZGxlIGNoYXJhY3RlcnMgaW5zZXJ0ZWQgd2hlbiBUYWIga2V5IGlzIHByZXNzZWQKLSAqLwotcHVibGljIGNsYXNzIEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFRBQl9DSEFSQUNURVIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQkvLyBpZiBub3QgaW4gc21hcnQgaW5zZXJ0IG1vZGUganVzdCBpZ25vcmUKLQkJaWYgKCFpc1NtYXJ0SW5zZXJ0TW9kZSgpKQotCQkJcmV0dXJuOwotCi0JCS8vIHNwYWNlcyBmb3IgdGFiIGNoYXJhY3RlcgotCQlpZiAoY29tbWFuZC5sZW5ndGggPT0gMCAmJiBjb21tYW5kLnRleHQgIT0gbnVsbCAmJiBjb21tYW5kLnRleHQubGVuZ3RoKCkgPiAwICYmIGNvbW1hbmQudGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpICE9IC0xKQotCQkJc21hcnRJbnNlcnRGb3JUYWIoY29tbWFuZCwgZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBzcGFjZXMgZm9yIHRhYnMKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvclRhYihEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIHRhYiBrZXkgd2FzIHByZXNzZWQuIG5vdyBjaGVjayBwcmVmZXJlbmNlcyB0byBzZWUgaWYgbmVlZCB0byBpbnNlcnQKLQkJLy8gc3BhY2VzIGluc3RlYWQgb2YgdGFiCi0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gZ2V0SW5kZW50YXRpb25XaWR0aCgpOwotCQlpZiAoaW5kZW50YXRpb25XaWR0aCA+IC0xKSB7Ci0JCQlTdHJpbmcgb3JpZ2luYWxUZXh0ID0gY29tbWFuZC50ZXh0OwotCQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKG9yaWdpbmFsVGV4dCk7Ci0KLQkJCS8vIGRldGVybWluZSB3aGVyZSBpbiBsaW5lIHRoaXMgY29tbWFuZCBiZWdpbnMKLQkJCWludCBsaW5lT2Zmc2V0ID0gLTE7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChjb21tYW5kLm9mZnNldCk7Ci0JCQkJbGluZU9mZnNldCA9IGNvbW1hbmQub2Zmc2V0IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCi0JCQlJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBnZXRMaW5lVHJhY2tlcihkb2N1bWVudCwgb3JpZ2luYWxUZXh0KTsKLQotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJaW50IGluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudFN0cmluZyhpbmRlbnRhdGlvbldpZHRoLCBsaW5lT2Zmc2V0LCBsaW5lVHJhY2tlciwgaW5kZXgpOwotCi0JCQkJLy8gcmVwbGFjZSBcdCBjaGFyYWN0ZXIgd2l0aCBzcGFjZXMKLQkJCQluZXdUZXh0LnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSwgaW5kZW50KTsKLQkJCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZVRyYWNrZXIucmVwbGFjZShpbmRleCwgMSwgaW5kZW50KTsKLQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCByZXBsYWNpbmcgdGV4dCwganVzdAotCQkJCQkJLy8gcmVzZXQgdG8gY3VycmVudCBzdHJpbmcKLQkJCQkJCWxpbmVUcmFja2VyLnNldChuZXdUZXh0LnRvU3RyaW5nKCkpOwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3RhcnRJbmRleCA9IGluZGV4ICsgaW5kZW50Lmxlbmd0aCgpOwotCQkJCWluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIsIHN0YXJ0SW5kZXgpOwotCQkJfQotCQkJY29tbWFuZC50ZXh0ID0gbmV3VGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIG51bWJlciBvZiBzcGFjZXMgZm9yIG5leHQgdGFiIHN0b3AKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudGF0aW9uV2lkdGgsIGludCBsaW5lT2Zmc2V0LCBJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIsIGludCBpbmRleCkgewotCQlpbnQgaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGg7Ci0JCWludCBvZmZzZXRJbkxpbmUgPSAtMTsKLQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGxpbmVUcmFja2VyLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGluZGV4KTsKLQkJCQlpZiAobGluZUluZm8uZ2V0T2Zmc2V0KCkgPT0gMCAmJiBsaW5lT2Zmc2V0ID4gLTEpCi0JCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCQllbHNlCi0JCQkJCW9mZnNldEluTGluZSA9IGluZGV4IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGxpbmVPZmZzZXQgPiAtMSkgewotCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCX0KLQkJfQotCQlpZiAob2Zmc2V0SW5MaW5lID4gLTEgJiYgaW5kZW50YXRpb25XaWR0aCA+IDApIHsKLQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCQkJaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGggLSByZW1haW5kZXI7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudFNpemU7IGkrKykKLQkJCWluZGVudC5hcHBlbmQoJyAnKTsKLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhIGxpbmUgdHJhY2tlciBmb3IgdGV4dCB3aXRoaW4gY29tbWFuZCBpZiB0ZXh0IGlzIG11bHRpLWxpbmUKLQkgKi8KLQlwcml2YXRlIElMaW5lVHJhY2tlciBnZXRMaW5lVHJhY2tlcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBvcmlnaW5hbFRleHQpIHsKLQkJQ29uZmlndXJhYmxlTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBudWxsOwotCQlpbnRbXSBkZWxpbXMgPSBUZXh0VXRpbGl0aWVzLmluZGV4T2YoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBvcmlnaW5hbFRleHQsIDApOwotCQlpZiAoZGVsaW1zWzBdICE9IC0xIHx8IGRlbGltc1sxXSAhPSAtMSkgewotCQkJbGluZVRyYWNrZXIgPSBuZXcgQ29uZmlndXJhYmxlTGluZVRyYWNrZXIoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpKTsKLQkJCWxpbmVUcmFja2VyLnNldChvcmlnaW5hbFRleHQpOwotCQl9Ci0JCXJldHVybiBsaW5lVHJhY2tlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhY3RpdmUgZWRpdG9yIGlzIGluIHNtYXJ0IGluc2VydCBtb2RlLCBmYWxzZSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU21hcnRJbnNlcnRNb2RlKCkgewotCQlib29sZWFuIGlzU21hcnRJbnNlcnRNb2RlID0gZmFsc2U7Ci0KLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCQkJCWVsc2UKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBzbWFydCBpbnNlcnQgbW9kZQotCQlpZiAodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpCi0JCQlpc1NtYXJ0SW5zZXJ0TW9kZSA9IHRydWU7Ci0JCXJldHVybiBpc1NtYXJ0SW5zZXJ0TW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGluZGVudGF0aW9uIHdpZHRoIGlmIHVzaW5nIHNwYWNlcyBmb3IgaW5kZW50YXRpb24sIC0xIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRJbmRlbnRhdGlvbldpZHRoKCkgewotCQlpbnQgd2lkdGggPSAtMTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UuZXF1YWxzKHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpCi0JCQl3aWR0aCA9IHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQlyZXR1cm4gd2lkdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhOGY5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1AgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJT2JqZWN0IHRleHRFZGl0b3IgPSBnZXRBY3RpdmVUZXh0RWRpdG9yKCk7Ci0JCWlmICghKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKSkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0KLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbW1hbmQudGV4dCAhPSBudWxsKSB7Ci0JCQkJCWlmIChjb21tYW5kLnRleHQuZXF1YWxzKCIlIikgJiYgaXNQcmVmZXJlbmNlRW5hYmxlZChKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfU0NSSVBUTEVUUykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gc2NyaXB0bGV0IC0gYWRkIGVuZCAlPgotCQkJCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCk7Ci0JCQkJCQlpZiAocHJlZml4ZWRXaXRoKGRvY3VtZW50LCBjb21tYW5kLm9mZnNldCwgIjwiKSAmJiAhbm9kZS5nZXRTb3VyY2UoKS5lbmRzV2l0aCgiJT4iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQljb21tYW5kLnRleHQgKz0gIiAlPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljb21tYW5kLnNoaWZ0c0NhcmV0ID0gZmFsc2U7Ci0JCQkJCQkJY29tbWFuZC5jYXJldE9mZnNldCA9IGNvbW1hbmQub2Zmc2V0ICsgMTsKLQkJCQkJCQljb21tYW5kLmRvaXQgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY29tbWFuZC50ZXh0LmVxdWFscygieyIpICYmIGlzUHJlZmVyZW5jZUVuYWJsZWQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VMX0JSQUNFUykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCk7Ci0JCQkJCQlpZiAoKHByZWZpeGVkV2l0aChkb2N1bWVudCwgY29tbWFuZC5vZmZzZXQsICIkIikgfHwgcHJlZml4ZWRXaXRoKGRvY3VtZW50LCBjb21tYW5kLm9mZnNldCwgIiMiKSkgJiYgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkhbm9kZS5nZXRTb3VyY2UoKS5lbmRzV2l0aCgifSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCWNvbW1hbmQudGV4dCArPSAiIH0iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJY29tbWFuZC5zaGlmdHNDYXJldCA9IGZhbHNlOwotCQkJCQkJCWNvbW1hbmQuY2FyZXRPZmZzZXQgPSBjb21tYW5kLm9mZnNldCArIDE7Ci0JCQkJCQkJY29tbWFuZC5kb2l0ID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNQcmVmZXJlbmNlRW5hYmxlZChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoa2V5ICE9IG51bGwgJiYgSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY3RpdmUgdGV4dCBlZGl0b3IgaWYgcG9zc2libGUsIG90aGVyd2lzZSB0aGUgYWN0aXZlIGVkaXRvcgotCSAqIHBhcnQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldEFjdGl2ZVRleHRFZGl0b3IoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQkJCQlyZXR1cm4gZWRpdG9yOwotCQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdGV4dEVkaXRvcjsKLQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByZWZpeGVkV2l0aChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmcpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuIGRvY3VtZW50LmdldExlbmd0aCgpID49IHN0cmluZy5sZW5ndGgoKSAmJiBkb2N1bWVudC5nZXQob2Zmc2V0IC0gc3RyaW5nLmxlbmd0aCgpLCBzdHJpbmcubGVuZ3RoKCkpLmVxdWFscyhzdHJpbmcpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvQWJzdHJhY3RCcmVha3BvaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0Fic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTM3NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvQWJzdHJhY3RCcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEFic3RyYWN0IGJyZWFrcG9pbnQgcHJvdmlkZXIgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBicmVha3BvaW50IHByb3ZpZGVyCi0gKiBpbnRlcmZhY2UuCi0gKiAKLSAqIFRoaXMgaXMgYSB0ZW1wb3JhcnkgY2xhc3MgZm9yIEphdmFCcmVha3BvaW50UHJvdmlkZXIgYW5kCi0gKiBKYXZhU2NyaXB0QnJlYWtwb2ludFByb3ZpZGVyLCBhbmQgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gc2VwYXJhdGUgSmF2YSBhbmQKLSAqIEphdmFTY3JpcHQgcGFydHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlciBpbXBsZW1lbnRzIElCcmVha3BvaW50UHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX0xJTkUgPSAtMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBKQVZBID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBKQVZBU0NSSVBUID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW117ImphdmFzY3JpcHQiLCAiamF2YXNjcmlwdDEuMCIsICJqYXZhc2NyaXB0MS4xXzMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSJqYXZhc2NyaXB0MS4yIiwgImphdmFzY3JpcHQxLjMiLCAiamF2YXNjcmlwdDEuNCIsICJqYXZhc2NyaXB0MS41IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCSJqYXZhc2NyaXB0MS42IiwgImpzY3JpcHQiLCAic2FzaHNjcmlwdCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX1BBR0UgPSAianNwOmRpcmVjdGl2ZS5wYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMSURfQ09OVEVOVCA9IC0yOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEID0gMDsKLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmdbXSBoYXlzdGFjaywgU3RyaW5nIG5lZWRsZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGhheXN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaGF5c3RhY2tbaV0uZXF1YWxzKG5lZWRsZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHBhZ2UgbGFuZ3VhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRQYWdlTGFuZ3VhZ2UoRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBVTlNVUFBPUlRFRDsKLQotCQlOb2RlTGlzdCBwYWdlRGlyZWN0aXZlcyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1BfRElSRUNUSVZFX1BBR0UpOwotCQkvLyBTZWFyY2ggZm9yIGZpcnN0IGxhbmd1YWdlIGRpcmVjdGl2ZQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VEaXJlY3RpdmVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBwYWdlRGlyZWN0aXZlcy5pdGVtKGkpOwotCQkJTm9kZSBsYW5ndWFnZUF0dHIgPSBjaGlsZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJsYW5ndWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobGFuZ3VhZ2VBdHRyICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcGFnZUxhbmd1YWdlID0gbGFuZ3VhZ2VBdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChwYWdlTGFuZ3VhZ2UgPT0gbnVsbCB8fCBwYWdlTGFuZ3VhZ2UubGVuZ3RoKCkgPT0gMCkKLQkJCQkJcmV0dXJuIFVOU1VQUE9SVEVEOwotCQkJCXBhZ2VMYW5ndWFnZSA9IHBhZ2VMYW5ndWFnZS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChjb250YWlucyhKQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMsIHBhZ2VMYW5ndWFnZSkpCi0JCQkJCXJldHVybiBKQVZBU0NSSVBUOwotCQkJCWVsc2UgaWYgKHBhZ2VMYW5ndWFnZS5lcXVhbHMoImphdmEiKSkvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBKQVZBOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIFVOU1VQUE9SVEVEOwotCQkJfQotCQl9Ci0JCXJldHVybiBKQVZBOyAvLyBKYXZhIGlzIGRlZmF1bHQgaWYgbm8gbGFuZ3VhZ2UgZGlyZWN0aXZlCi0JfQotCi0JLyoKLQkgKiBTZWFyY2ggdGhlIFJlZ2lvbkNvbnRhaW5lcidzIHJlZ2lvbnMgbG9va2luZyBmb3IgSlNQIGNvbnRlbnQuIElmIHZhbGlkCi0JICogY29udGVudCBpcyBmb3VuZCwgcmV0dXJuIHRoZSBwb3NpdGlvbiA+PSAwIElmIG5vIHZhbGlkIGNvbnRlbnQgaXMKLQkgKiBmb3VuZCwgcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQuIElmIGEgcmVnaW9uIHN0YXJ0cyBhZnRlciB0aGUgbGluZSdzCi0JICogZW5kT2Zmc2V0LCByZXR1cm4gRU5EX09GX0xJTkUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFZhbGlkUmVnaW9uUG9zaXRpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbkNvbnRhaW5lciwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSByZWdpb25Db250YWluZXIuZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCWludCB2YWxpZFBvc2l0aW9uID0gZ2V0VmFsaWRSZWdpb25Qb3NpdGlvbihtb2RlbCwgKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJCQlpZiAodmFsaWRQb3NpdGlvbiA9PSBFTkRfT0ZfTElORSB8fCB2YWxpZFBvc2l0aW9uID49IDApCi0JCQkJCXJldHVybiB2YWxpZFBvc2l0aW9uOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcmVnaW9uIG11c3QgYmUgYXQgbGVhc3QgcGFydGlhbGx5IG9uIHNlbGVjdGVkIGxpbmUKLQkJCQlpZiAocmVnaW9uQ29udGFpbmVyLmdldEVuZE9mZnNldChyZWdpb24pID4gc3RhcnRPZmZzZXQpIHsKLQotCQkJCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSByZWdpb25Db250YWluZXIuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJLy8gaWYgcmVnaW9uIHN0YXJ0cyBhZnRlciBsaW5lJ3MgZW5kT2Zmc2V0LCB3ZSdyZSBkb25lCi0JCQkJCS8vIHNlYXJjaGluZwotCQkJCQlpZiAocmVnaW9uU3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpCi0JCQkJCQlyZXR1cm4gRU5EX09GX0xJTkU7Ci0KLQkJCQkJLy8gSWYgcmVnaW9uIGlzIEpTUCBjb250ZW50LCBtYWtlIHN1cmUgdGhlIGxhbmd1YWdlIGlzCi0JCQkJCS8vIEphdmEgbm90IEphdmFzY3JpcHQgYnkKLQkJCQkJLy8gY2hlY2tpbmcgdGhlIGNvbnRlbnQgYXNzaXN0IGFkYXB0ZXIncyB0eXBlLgotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpKSB7Ci0JCQkJCQkvLyBEV006IHRoaXMgbG9naWMgaXMgbm90IGluY29ycmVjdCAuLi4gZ2l2ZW4gY2hhbmdlcwotCQkJCQkJLy8gdG8gYWRhcHRlcnMsIGV0Yy4KLQkJCQkJCS8vIGJ1dCBwcm9iYWJseSBkb24ndCBuZWVkIGFueXRoaW5nIGhlcmUsIHNpbmNlIGJvdGgKLQkJCQkJCS8vIEphdmEgYW5kIEphdmFTY3JpcHQKLQkJCQkJCS8vIGFyZSBzdXBwb3J0ZWQgaW4gVjUuCi0KLQkJCQkJCS8vIG5zZF9UT0RPOiB2ZXJpZnkgdGhpcyEhIQotCi0JCQkJCQkvLyBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0KLQkJCQkJCS8vIChJTm9kZU5vdGlmaWVyKW1vZGVsLmdldE5vZGUocmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkJLy8gSUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPQotCQkJCQkJLy8gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihDb250ZW50QXNzaXN0QWRhcHRlci5jbGFzcyk7Ci0JCQkJCQkvLyBpZihmYWN0b3J5IGluc3RhbmNlb2YKLQkJCQkJCS8vIEhUTUxDb250ZW50QXNzaXN0QWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCS8vIElOb2RlQWRhcHRlciBhZGFwdGVyID0KLQkJCQkJCS8vICgoSFRNTENvbnRlbnRBc3Npc3RBZGFwdGVyRmFjdG9yeSlmYWN0b3J5KS5jcmVhdGVBZGFwdGVyKG5vdGlmaWVyLAotCQkJCQkJLy8gcmVnaW9uKTsKLQkJCQkJCS8vIGlmKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyIGluc3RhbmNlb2YKLQkJCQkJCS8vIEpTUEphdmFDb250ZW50QXNzaXN0QWRhcHRlcikKLQotCQkJCQkJaWYgKHJlZ2lvblN0YXJ0T2Zmc2V0ID4gc3RhcnRPZmZzZXQpCi0JCQkJCQkJcmV0dXJuIHJlZ2lvblN0YXJ0T2Zmc2V0OwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBzdGFydE9mZnNldDsKLQkJCQkJCS8vIH0KLQkJCQkJfQotCQkJCQkvLyBhIGN1c3RvbSB0YWcsIGpzcDp1c2VCZWFuLCBnZXRwcm9wZXJ0eSBvciBzZXRwcm9wZXJ0eQotCQkJCQkvLyBzdGF0ZW1lbnQgaXMgYWxzbyBhIHZhbGlkIGJyZWFrcG9pbnQgbG9jYXRpb24KLQkJCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpICYmIChpc0N1c3RvbVRhZ1JlZ2lvbihtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJlZ2lvblN0YXJ0T2Zmc2V0KSkgfHwgcmVnaW9uQ29udGFpbmVyLmdldFRleHQocmVnaW9uKS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTikgfHwgcmVnaW9uQ29udGFpbmVyLmdldFRleHQocmVnaW9uKS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuR0VUUFJPUEVSVFkpIHx8IHJlZ2lvbkNvbnRhaW5lci5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZKSkpIHsKLQotCQkJCQkJaWYgKHJlZ2lvblN0YXJ0T2Zmc2V0ID4gc3RhcnRPZmZzZXQpCi0JCQkJCQkJcmV0dXJuIHJlZ2lvblN0YXJ0T2Zmc2V0OwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBzdGFydE9mZnNldDsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIERlZmVjdCAjMjQxMDkwLCB0aGUgVGV4dCBOb2RlcyBpbnNpZGUgb2YgSlNQCi0JCQkJCQkvLyBzY3JpcHRsZXRzLCBleHByZXNzaW9ucywgYW5kIGRlY2xhcmF0aW9ucyBhcmUgdmFsaWQKLQkJCQkJCS8vIGJyZWFrcG9pbnQtYWJsZSBsb2NhdGlvbnMKLQkJCQkJCWJvb2xlYW4gaXNDb2RlTm9kZSA9IGZhbHNlOwotCQkJCQkJSW5kZXhlZFJlZ2lvbiBub2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihyZWdpb25TdGFydE9mZnNldCk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQkJTm9kZSBkb21Ob2RlID0gKE5vZGUpIG5vZGU7Ci0JCQkJCQkJTm9kZSByb290ID0gZG9tTm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCQkJaWYgKHJvb3QgIT0gbnVsbCAmJiByb290LmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QpICYmIGRvbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBkb21Ob2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBwYXJlbnROYW1lID0gZG9tTm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQkJaXNDb2RlTm9kZSA9IHBhcmVudE5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCkgfHwgcGFyZW50TmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTikgfHwgcGFyZW50TmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpc0NvZGVOb2RlKSB7Ci0JCQkJCQkJaWYgKHJlZ2lvblN0YXJ0T2Zmc2V0ID4gc3RhcnRPZmZzZXQpCi0JCQkJCQkJCXJldHVybiByZWdpb25TdGFydE9mZnNldDsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXJldHVybiBzdGFydE9mZnNldDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ3VzdG9tVGFnUmVnaW9uKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJRWxlbWVudCB4bWxFbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSh4bWxFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sRWxlbWVudCk7Ci0JCQlpZiAoZGVjbCBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIpIHsKLQkJCQlDTU5vZGUgY21Ob2RlID0gKChDTU5vZGVXcmFwcGVyKSBkZWNsKS5nZXRPcmlnaW5Ob2RlKCk7Ci0JCQkJcmV0dXJuIGNtTm9kZSBpbnN0YW5jZW9mIFRMREVsZW1lbnREZWNsYXJhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBJU291cmNlRWRpdGluZ1RleHRUb29scyBmU291cmNlRWRpdGluZ1RleHRUb29sczsKLQotCi0JcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRFZGl0b3JJbnB1dFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgZ2V0U291cmNlRWRpdGluZ1RleHRUb29scygpIHsKLQkJcmV0dXJuIGZTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VmFsaWRQb3NpdGlvbihJRG9jdW1lbnQgaWRvYywgaW50IGxpbmVOdW1iZXIpIHsKLQkJaWYgKCEoZ2V0U291cmNlRWRpdGluZ1RleHRUb29scygpIGluc3RhbmNlb2YgSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpKSB7Ci0JCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQkJfQotCQlpZiAoaWRvYyA9PSBudWxsKQotCQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0KLQkJaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0JCXRyeSB7Ci0JCQlzdGFydE9mZnNldCA9IGlkb2MuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyIC0gMSk7Ci0JCQllbmRPZmZzZXQgPSBpZG9jLmdldExpbmVPZmZzZXQobGluZU51bWJlcikgLSAxOwotCi0JCQlpZiAoaWRvYyA9PSBudWxsKQotCQkJCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCQkJU3RyaW5nIGxpbmVUZXh0ID0gaWRvYy5nZXQoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KS50cmltKCk7Ci0KLQkJCS8vIGJsYW5rIGxpbmVzIG9yIGxpbmVzIHdpdGggb25seSBhbiBvcGVuIG9yIGNsb3NlIGJyYWNlIG9yCi0JCQkvLyBzY3JpcHRsZXQgdGFnIGNhbm5vdCBoYXZlIGEgYnJlYWtwb2ludAotCQkJaWYgKGxpbmVUZXh0LmVxdWFscygiIikgfHwgbGluZVRleHQuZXF1YWxzKCJ7IikgfHwgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCWxpbmVUZXh0LmVxdWFscygifSIpIHx8IGxpbmVUZXh0LmVxdWFscygiPCUiKSkvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGlkb2MpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJLy8gZ28gdGhyb3VnaCB0aGUgbm9kZSdzIHJlZ2lvbnMgbG9va2luZyBmb3IgSlNQIGNvbnRlbnQKLQkJLy8gdW50aWwgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgbGluZQotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJaW50IHZhbGlkUG9zaXRpb24gPSBnZXRWYWxpZFJlZ2lvblBvc2l0aW9uKCgoSURPTURvY3VtZW50KSAoKElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBnZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkpLmdldERPTURvY3VtZW50KCkpLmdldE1vZGVsKCksIGZsYXROb2RlLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQotCQkJaWYgKHZhbGlkUG9zaXRpb24gPT0gRU5EX09GX0xJTkUpCi0JCQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0KLQkJCWlmICh2YWxpZFBvc2l0aW9uID49IDApCi0JCQkJcmV0dXJuIHZhbGlkUG9zaXRpb247Ci0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgc291cmNlRWRpdGluZ1RleHRUb29scykgewotCQlmU291cmNlRWRpdGluZ1RleHRUb29scyA9IHNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YUJyZWFrcG9pbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzA3MjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFCcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy5jb3JlLkpESURlYnVnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5JRE9NU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEEgQnJlYWtwb2ludFByb3ZpZGVyIHN1cHBvcnRpbmcgc2VydmVyLXNpZGUgSmF2YSBhcyBhIEpTUCBsYW5ndWFnZQotICogCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUJyZWFrcG9pbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyIHsKLQotCS8qCi0JICogQHBhcmFtIHJlcyBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRUeXBlTmFtZShJUmVzb3VyY2UgcmVzKSB7Ci0JCUlQYXRoIHBhdGggPSByZXMuZ2V0RnVsbFBhdGgoKTsKLQkJLy8gQXNzdW1lIHVuZGVyIFdlYiBDb250ZW50IGZvbGRlciBpZiBtb3JlIHRoYW4gMiBzZWdtZW50cwotCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDIpIHsKLQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQl9Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKElQYXRoLlNFUEFSQVRPUiwgJy4nKTsKLQkJaWYgKHJlcy5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotCQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVOYW1lOwotCX0KLQotCi0KLQlwdWJsaWMgSVN0YXR1cyBhZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpbnQgcG9zID0gZ2V0VmFsaWRQb3NpdGlvbihkb2N1bWVudCwgbGluZU51bWJlcik7Ci0JCWlmIChwb3MgIT0gTk9fVkFMSURfQ09OVEVOVCkgewotCQkJSVJlc291cmNlIHJlcyA9IGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0VHlwZU5hbWUocmVzKTsKLQkJCQl0cnkgewotCQkJCQlKRElEZWJ1Z01vZGVsLmNyZWF0ZUxpbmVCcmVha3BvaW50KHJlcywgdHlwZU5hbWUsIGxpbmVOdW1iZXIsIHBvcywgcG9zLCAwLCB0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSlNQVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssIEpTUFVJTWVzc2FnZXMuT0ssIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgTm9kZSBub2RlLCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgewotCQlJUmVzb3VyY2UgcmVzID0gaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0ID8gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpIDogbnVsbDsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJaWYgKGdldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKSBpbnN0YW5jZW9mIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSB7Ci0JCQlkb2MgPSAoKElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBnZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkpLmdldERPTURvY3VtZW50KCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzICE9IG51bGwgJiYgIWlzQnJlYWtwb2ludEV4aXN0KHJlcywgbGluZU51bWJlcikgJiYgaXNWYWxpZFBvc2l0aW9uKGRvY3VtZW50LCBsaW5lTnVtYmVyKSAmJiAoZ2V0UGFnZUxhbmd1YWdlKGRvYykgPT0gSkFWQSk7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCX0KLQotCS8qCi0JICogQHBhcmFtIHJlcyBAcGFyYW0gbGluZU51bWJlciBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCcmVha3BvaW50RXhpc3QoSVJlc291cmNlIHJlcywgaW50IGxpbmVOdW1iZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBKRElEZWJ1Z01vZGVsLmxpbmVCcmVha3BvaW50RXhpc3RzKGdldFR5cGVOYW1lKHJlcyksIGxpbmVOdW1iZXIpICE9IG51bGw7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gZG9jIEBwYXJhbSBpZG9jIEBwYXJhbSBsaW5lTnVtYmVyIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUG9zaXRpb24oSURvY3VtZW50IGlkb2MsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXJldHVybiBnZXRWYWxpZFBvc2l0aW9uKGlkb2MsIGxpbmVOdW1iZXIpICE9IE5PX1ZBTElEX0NPTlRFTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YVNjcmlwdEJyZWFrcG9pbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YVNjcmlwdEJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzdjNTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTY3JpcHRCcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUJyZWFrcG9pbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIEEgSUJyZWFrcG9pbnRQcm92aWRlciBzdXBwb3J0aW5nIHNlcnZlci1zaWRlIEphdmFTY3JpcHQgYXMgYSBKU1AgbGFuZ3VhZ2UKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVNjcmlwdEJyZWFrcG9pbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBjYW5BZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgewotCQlJUmVzb3VyY2UgcmVzID0gZ2V0RWRpdG9ySW5wdXRSZXNvdXJjZShpbnB1dCk7Ci0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCXJldHVybiByZXMgIT0gbnVsbCAmJiAhaXNCcmVha3BvaW50RXhpc3QocmVzLCBsaW5lTnVtYmVyKSAmJiBpc1ZhbGlkUG9zaXRpb24oZG9jdW1lbnQsIGxpbmVOdW1iZXIpICYmIChnZXRQYWdlTGFuZ3VhZ2UoZG9jKSAhPSBKQVZBKTsKLQl9Ci0KLQotCXB1YmxpYyBJU3RhdHVzIGFkZEJyZWFrcG9pbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgaW5wdXQsIGludCBsaW5lTnVtYmVyLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBwb3MgPSBnZXRWYWxpZFBvc2l0aW9uKGRvY3VtZW50LCBsaW5lTnVtYmVyKTsKLQkJaWYgKHBvcyAhPSBOT19WQUxJRF9DT05URU5UICYmIGNhbkFkZEJyZWFrcG9pbnQoZG9jdW1lbnQsIGlucHV0LCBsaW5lTnVtYmVyLCBvZmZzZXQpKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gZ2V0RWRpdG9ySW5wdXRSZXNvdXJjZShpbnB1dCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQluZXcgSmF2YXNjcmlwdExpbmVCcmVha3BvaW50KHJlcywgbGluZU51bWJlciwgcG9zLCBwb3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCBKU1BVSU1lc3NhZ2VzLk9LLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogQHBhcmFtIHJlcyBAcGFyYW0gbGluZU51bWJlciBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCcmVha3BvaW50RXhpc3QoSVJlc291cmNlIHJlcywgaW50IGxpbmVOdW1iZXIpIHsKLQkJSUJyZWFrcG9pbnRNYW5hZ2VyIG1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IG1hbmFnZXIuZ2V0QnJlYWtwb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCEoYnJlYWtwb2ludHNbaV0gaW5zdGFuY2VvZiBKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQpKQotCQkJCWNvbnRpbnVlOwotCQkJSmF2YXNjcmlwdExpbmVCcmVha3BvaW50IGJyZWFrcG9pbnQgPSAoSmF2YXNjcmlwdExpbmVCcmVha3BvaW50KSBicmVha3BvaW50c1tpXTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGJyZWFrcG9pbnQuZ2V0UmVzb3VyY2UoKS5lcXVhbHMocmVzKSAmJiBicmVha3BvaW50LmdldExpbmVOdW1iZXIoKSA9PSBsaW5lTnVtYmVyKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gZG9jIEBwYXJhbSBpZG9jIEBwYXJhbSBsaW5lTnVtYmVyIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUG9zaXRpb24oSURvY3VtZW50IGlkb2MsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXJldHVybiBnZXRWYWxpZFBvc2l0aW9uKGlkb2MsIGxpbmVOdW1iZXIpICE9IE5PX1ZBTElEX0NPTlRFTlQ7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODk3ZmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmRlYnVnLmNvcmUuSkRJRGVidWdNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUJyZWFrcG9pbnRQcm92aWRlcjsKLQotLyoqCi0gKiBBIElCcmVha3BvaW50UHJvdmlkZXIgc3VwcG9ydGluZyBKU1AgYnJlYWtwb2ludHMgZm9yIGEgTm9uLUphdmEgTGFuZ3VhZ2UKLSAqIFNvdXJjZSBKU1AgcGFnZQotICovCi1wdWJsaWMgY2xhc3MgSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIgaW1wbGVtZW50cyBJQnJlYWtwb2ludFByb3ZpZGVyLCBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xBU1NfUEFUVEVSTiA9ICIqanNwLGpzcF9zZXJ2bGV0Ll8qIjsKLQlwcml2YXRlIE9iamVjdCBmRGF0YSA9IG51bGw7Ci0KLQlwdWJsaWMgSVN0YXR1cyBhZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgZWRpdG9yTGluZU51bWJlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHZhbGlkIHBvc2l0aW9uIHRvIHNldCBicmVha3BvaW50Ci0JCWludCBwb3MgPSBnZXRWYWxpZFBvc2l0aW9uKGRvY3VtZW50LCBlZGl0b3JMaW5lTnVtYmVyKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAocG9zID49IDApIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBnZXRSZXNvdXJjZUZyb21JbnB1dChpbnB1dCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQkJSUJyZWFrcG9pbnQgcG9pbnQgPSBKRElEZWJ1Z01vZGVsLmNyZWF0ZVN0cmF0dW1CcmVha3BvaW50KHJlcywgIkpTUCIsIHJlcy5nZXROYW1lKCksIHBhdGgsIGdldENsYXNzUGF0dGVybihyZXMpLCBlZGl0b3JMaW5lTnVtYmVyLCBwb3MsIHBvcywgMCwgdHJ1ZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocG9pbnQgPT0gbnVsbCkgewotCQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCAidW5zdXBwb3J0ZWQgaW5wdXQgdHlwZSIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJLy8gRm9yIG5vbi1yZXNvdXJjZXMsIHVzZSB0aGUgd29ya3NwYWNlIHJvb3QgYW5kIGEgY29vcmRpbmF0ZWQKLQkJCQkvLyBhdHRyaWJ1dGUgdGhhdCBpcyB1c2VkIHRvCi0JCQkJLy8gcHJldmVudCB1bndhbnRlZCAoYnJlYWtwb2ludCkgbWFya2VycyBmcm9tIGJlaW5nIGxvYWRlZAotCQkJCS8vIGludG8gdGhlIGVkaXRvcnMuCi0JCQkJcmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlTdHJpbmcgaWQgPSBpbnB1dC5nZXROYW1lKCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCAmJiAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkgIT0gbnVsbCAmJiAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSAhPSBudWxsKSB7Ci0JCQkJCWlkID0gKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWF0dHJpYnV0ZXMucHV0KFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbC5TRUNPTkRBUllfSURfS0VZLCBpZCk7Ci0JCQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQkJCUlCcmVha3BvaW50IHBvaW50ID0gSkRJRGVidWdNb2RlbC5jcmVhdGVTdHJhdHVtQnJlYWtwb2ludChyZXMsICJKU1AiLCBpbnB1dC5nZXROYW1lKCksIHBhdGgsIGdldENsYXNzUGF0dGVybihyZXMpLCBlZGl0b3JMaW5lTnVtYmVyLCBwb3MsIHBvcywgMCwgdHJ1ZSwgYXR0cmlidXRlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocG9pbnQgPT0gbnVsbCkgewotCQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCAidW5zdXBwb3J0ZWQgaW5wdXQgdHlwZSIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLklORk8sIEpTUFVJTWVzc2FnZXMuQnJlYWtwb2ludE5vdEFsbG93ZWQsIG51bGwpOwotCQl9Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKU1BVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgSlNQVUlNZXNzYWdlcy5PSywgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDbGFzc1BhdHRlcm4oSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2hvcnROYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiBleHRlbnNpb24ubGVuZ3RoKCkgPCBzaG9ydE5hbWUubGVuZ3RoKCkpIHsKLQkJCQlzaG9ydE5hbWUgPSBzaG9ydE5hbWUuc3Vic3RyaW5nKDAsIHNob3J0TmFtZS5sZW5ndGgoKSAtIGV4dGVuc2lvbi5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQkJaWYgKGZEYXRhIGluc3RhbmNlb2YgU3RyaW5nICYmIGZEYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NDc1Ci0JCQkJICovCi0JCQkJcmV0dXJuIGZEYXRhICsgIixfIiArIHNob3J0TmFtZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZEYXRhIGluc3RhbmNlb2YgTWFwICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICYmIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCWlmICh0eXBlcy5sZW5ndGggPT0gMCkgewotCQkJCQkvLyBpZiBmYWlsZWQgdG8gZmluZCBxdWlja2x5LCBiZSBtb3JlIGFnZ3Jlc3NpdmUKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIG9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJCQlkID0gKChJRmlsZSkgcmVzb3VyY2UpLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQkJCXR5cGVzID0gbmV3IElDb250ZW50VHlwZVtde2QuZ2V0Q29udGVudFR5cGUoKX07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIHNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kCi0JCQkJCQkgKiBmaWxlIHR5cGUgY2hlY2sgYWJvdmUKLQkJCQkJCSAqLwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHdhc24ndCBmb3VuZCBlYXJsaWVyCi0JCQkJaWYgKHR5cGVzID09IG51bGwpIHsKLQkJCQkJdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCVN0cmluZ0J1ZmZlciBwYXR0ZXJuQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiXyIgKyBzaG9ydE5hbWUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IHBhdHRlcm4gPSAoKE1hcCkgZkRhdGEpLmdldCh0eXBlc1tpXS5nZXRJZCgpKTsKLQkJCQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkgewotCQkJCQkJcGF0dGVybkJ1ZmZlci5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGF0dGVybkJ1ZmZlci5hcHBlbmQocGF0dGVybik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHBhdHRlcm5CdWZmZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gREVGQVVMVF9DTEFTU19QQVRURVJOOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUZyb21JbnB1dChpbnB1dCk7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tSW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIGEgdmFsaWQgcG9zaXRpb24gc29tZXdoZXJlIG9uIGxpbmVOdW1iZXIgaW4gZG9jdW1lbnQsIGlkb2MsIHdoZXJlCi0JICogYSBicmVha3BvaW50IGNhbiBiZSBzZXQgYW5kIHJldHVybnMgdGhhdCBwb3NpdGlvbi4gLTEgaXMgcmV0dXJuZWQgaWYgYQotCSAqIHBvc2l0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWRvYwotCSAqIEBwYXJhbSBlZGl0b3JMaW5lTnVtYmVyCi0JICogQHJldHVybiBwb3NpdGlvbiB0byBzZXQgYnJlYWtwb2ludCBvciAtMSBpZiBubyBwb3NpdGlvbiBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgaW50IGdldFZhbGlkUG9zaXRpb24oSURvY3VtZW50IGlkb2MsIGludCBlZGl0b3JMaW5lTnVtYmVyKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaWYgKGlkb2MgIT0gbnVsbCkgewotCi0JCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJaW50IGVuZE9mZnNldCA9IDA7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZSA9IGlkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGVkaXRvckxpbmVOdW1iZXIgLSAxKTsKLQkJCQlzdGFydE9mZnNldCA9IGxpbmUuZ2V0T2Zmc2V0KCk7Ci0JCQkJZW5kT2Zmc2V0ID0gTWF0aC5tYXgobGluZS5nZXRPZmZzZXQoKSwgbGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkpOwotCi0JCQkJU3RyaW5nIGxpbmVUZXh0ID0gaWRvYy5nZXQoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KS50cmltKCk7Ci0KLQkJCQkvLyBibGFuayBsaW5lcyBvciBsaW5lcyB3aXRoIG9ubHkgYW4gb3BlbiBvciBjbG9zZSBicmFjZSBvcgotCQkJCS8vIHNjcmlwdGxldCB0YWcgY2Fubm90IGhhdmUgYSBicmVha3BvaW50Ci0JCQkJaWYgKGxpbmVUZXh0LmVxdWFscygiIikgfHwgbGluZVRleHQuZXF1YWxzKCJ7IikgfHwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJbGluZVRleHQuZXF1YWxzKCJ9IikgfHwgbGluZVRleHQuZXF1YWxzKCI8JSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl7Ci0JCQkJCXJlc3VsdCA9IC0xOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gZ2V0IGFsbCBwYXJ0aXRpb25zIGZvciBjdXJyZW50IGxpbmUKLQkJCQkJSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucyA9IG51bGw7Ci0KLQkJCQkJcGFydGl0aW9ucyA9IGlkb2MuY29tcHV0ZVBhcnRpdGlvbmluZyhzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCi0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25zLmxlbmd0aDsgKytpKSB7Ci0JCQkJCQlTdHJpbmcgdHlwZSA9IHBhcnRpdGlvbnNbaV0uZ2V0VHlwZSgpOwotCQkJCQkJLy8gaWYgZm91bmQganNwIGphdmEgY29udGVudCwganNwIGRpcmVjdGl2ZSB0YWdzLAotCQkJCQkJLy8gY3VzdG9tCi0JCQkJCQkvLyB0YWdzLAotCQkJCQkJLy8gcmV0dXJuIHRoYXQgcG9zaXRpb24KLQkJCQkJCWlmICh0eXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEgfHwgdHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKSB7Ci0JCQkJCQkJcmVzdWx0ID0gcGFydGl0aW9uc1tpXS5nZXRPZmZzZXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVzdWx0ID0gLTE7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZkRhdGEgPSBkYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMpIHsKLQkJLy8gbm90IHVzZWQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFzY3JpcHRMaW5lQnJlYWtwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmFkNTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFzY3JpcHRMaW5lQnJlYWtwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKdWwgMjAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBkYXZpZHcKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEphdmFzY3JpcHRMaW5lQnJlYWtwb2ludCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzCi0JICogQHBhcmFtIGxpbmVOdW1iZXIKLQkgKiBAcGFyYW0gcG9zCi0JICogQHBhcmFtIHBvczEKLQkgKi8KLQlwdWJsaWMgSmF2YXNjcmlwdExpbmVCcmVha3BvaW50KElSZXNvdXJjZSByZXMsIGludCBsaW5lTnVtYmVyLCBpbnQgcG9zLCBpbnQgcG9zMSkgewotCi0JCS8vIFRPRE8gU2hvdWxkIGJlIGRlbGV0ZWQ/IEFsb25nIHdpdGggY2FsbGluZyBjbGFzcz8KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSmF2YXNjcmlwdExpbmVCcmVha3BvaW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F1dG9JbXBvcnRQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXV0b0ltcG9ydFByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZTVhNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXV0b0ltcG9ydFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEdlbnVpdGVjLCBMTEMgLSBGaXggZm9yIGJ1ZyAyMDMzMDMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEF1dG9JbXBvcnRQcm9wb3NhbCBleHRlbmRzIEpTUENvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JCi0JLy8gdGhlIGltcG9ydCBzdHJpbmcsIG5vIHF1b3RlcyBvciBjb2xvbnMKLQlTdHJpbmcgZkltcG9ydERlY2xhcmF0aW9uOwotCQotCXB1YmxpYyBBdXRvSW1wb3J0UHJvcG9zYWwoU3RyaW5nIGltcG9ydERlY2xhcmF0aW9uLCBTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQlzdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjdXJzb3JQb3NpdGlvbiwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgcmVsZXZhbmNlLCB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpOwotCQlzZXRJbXBvcnREZWNsYXJhdGlvbihpbXBvcnREZWNsYXJhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBvZmZzZXQpOwotCQlhZGRJbXBvcnREZWNsYXJhdGlvbih2aWV3ZXIpOwotCX0KLQkvKioKLQkgKiBhZGRzIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24gdG8gdGhlIGRvY3VtZW50IGluIHRoZSB2aWV3ZXIgaW4gdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRJbXBvcnREZWNsYXJhdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJCi0JCUlEb2N1bWVudCBkb2MgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCi0JCS8vIGNhbGN1bGF0ZSBvbmNlIGFuZCBwYXNzIGFsb25nCi0JCWJvb2xlYW4gaXNYbWwgPSBpc1htbEZvcm1hdChkb2MpOwotCQkKLQkJaW50IGluc2VydFBvc2l0aW9uID0gZ2V0SW5zZXJ0UG9zaXRpb24oZG9jLCBpc1htbCk7Ci0JCVN0cmluZyBpbnNlcnRUZXh0ID0gY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oZG9jLCBpc1htbCk7Ci0JCUluc2VydEVkaXQgaW5zZXJ0ID0gbmV3IEluc2VydEVkaXQoaW5zZXJ0UG9zaXRpb24sIGluc2VydFRleHQpOwotCQl0cnkgewotCQkJaW5zZXJ0LmFwcGx5KGRvYyk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgaXMgY29ycmVjdAotCQlzZXRDdXJzb3JQb3NpdGlvbihnZXRDdXJzb3JQb3NpdGlvbigpICsgaW5zZXJ0VGV4dC5sZW5ndGgoKSk7Ci0JfQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcGFyYW0gaXNYbWwKLQkgKiBAcmV0dXJuIHBvc2l0aW9uIGFmdGVyIDxqc3A6cm9vdD4gaWYgeG1sLCBvdGhlcndpc2UgcmlnaHQgYmVmb3JlIHRoZSBkb2N1bWVudCBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SW5zZXJ0UG9zaXRpb24oSURvY3VtZW50IGRvYywgYm9vbGVhbiBpc1htbCkgewotCQlpbnQgcG9zID0gMDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoc01vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Eb2N1bWVudCBkb2N1bWVudE5vZGUgPSAoKElET01Nb2RlbCkgc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQlOb2RlIGRvY0VsZW1lbnQgPSBkb2N1bWVudE5vZGUuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCWlmIChkb2NFbGVtZW50ICE9IG51bGwgJiYgZG9jRWxlbWVudCBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gKChJRE9NRWxlbWVudCkgZG9jRWxlbWVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCWlmIChpc1htbCkgewotCQkJCQkJCS8vIGluc2VydCByaWdodCBhZnRlciBkb2N1bWVudCBlbGVtZW50Ci0JCQkJCQkJcG9zID0gc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBpbnNlcnQgYmVmb3JlIGRvY3VtZW50IGVsZW1lbnQKLQkJCQkJCQlwb3MgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gcG9zOwotCX0KLQkKLSAJLy8gR2VudWl0ZWMgYnVnICM2MjI3LAotCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMzMDMKLQlwcml2YXRlIGJvb2xlYW4gaXNDdXN0b21UYWdEb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7Ci0JCWJvb2xlYW4gaXNUYWcgPSBmYWxzZTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gKChJRE9NTW9kZWwpIHNNb2RlbCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJSUNvbnRlbnRUeXBlIG1vZGVsQ1QgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JCQkJCUlDb250ZW50VHlwZSB0YWdDVCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BUQUcpOwotCQkJCQlpZiAobW9kZWxDVCAhPSBudWxsICYmIHRhZ0NUICE9IG51bGwpIHsKLQkJCQkJCWlzVGFnID0gbW9kZWxDVC5pc0tpbmRPZih0YWdDVCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBpc1RhZzsKLQl9Ci0JCSAKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgZG9jdW1lbnQgaXMgeG1sLWpzcCBzeW50YXgsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1htbEZvcm1hdChJRG9jdW1lbnQgZG9jKSB7Ci0JCWJvb2xlYW4gaXNYbWwgPSBmYWxzZTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoIWlzWG1sKSB7Ci0JCQkJCWlmIChzTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJCUlET01Eb2N1bWVudCBkb2N1bWVudE5vZGUgPSAoKElET01Nb2RlbCkgc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZG9jdW1lbnROb2RlLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQkJaXNYbWwgPSBkb2NFbGVtZW50ICE9IG51bGwgJiYgKChkb2NFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKCJqc3A6cm9vdCIpKSB8fCBkb2NFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoInhtbG5zOmpzcCIpICE9IG51bGwgfHwgKCgoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgJiYgKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gaXNYbWw7Ci0JfQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcGFyYW0gaXNYbWwKLQkgKiBAcmV0dXJuIGFwcHJvcHJpYXRlIGltcG9ydCBkZWNsYXJhdGlvbiBzdHJpbmcgZGVwZW5kaW5nIGlmIGRvY3VtZW50IGlzIHhtbCBvciBub3QKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVJbXBvcnREZWNsYXJhdGlvbihJRG9jdW1lbnQgZG9jLCBib29sZWFuIGlzWG1sKSB7Ci0JCVN0cmluZyBkZWxpbSA9IChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSA/ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jKS5nZXRMaW5lRGVsaW1pdGVyKCkgOiBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvYyk7Ci0JCWJvb2xlYW4gaXNDdXN0b21UYWcgPSBpc0N1c3RvbVRhZ0RvY3VtZW50KGRvYyk7Ci0JCWZpbmFsIFN0cmluZyBvcGVuaW5nOwotCQlmaW5hbCBTdHJpbmcgY2xvc2luZzsKLQkJaWYgKGlzQ3VzdG9tVGFnKSB7Ci0JCQlpZiAoaXNYbWwpIHsKLQkJCQlvcGVuaW5nID0gIjxqc3A6ZGlyZWN0aXZlLnRhZyBpbXBvcnQ9XCIiOyAvLyROT04tTkxTLTEkCi0JCQkJY2xvc2luZyA9ICJcIi8+IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3BlbmluZyA9ICI8JUB0YWcgaW1wb3J0PVwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWNsb3NpbmcgPSAiXCIlPiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChpc1htbCkgewotCQkJCW9wZW5pbmcgPSAiPGpzcDpkaXJlY3RpdmUucGFnZSBpbXBvcnQ9XCIiOyAvLyROT04tTkxTLTEkCi0JCQkJY2xvc2luZyA9ICJcIi8+IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3BlbmluZyA9ICI8JUBwYWdlIGltcG9ydD1cIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljbG9zaW5nID0gIlwiJT4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGltICsgb3BlbmluZyArIGdldEltcG9ydERlY2xhcmF0aW9uKCkgKyBjbG9zaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiBmSW1wb3J0RGVjbGFyYXRpb247Ci0JfQotCXB1YmxpYyB2b2lkIHNldEltcG9ydERlY2xhcmF0aW9uKFN0cmluZyBpbXBvcnREZWNsYXJhdGlvbikgewotCQlmSW1wb3J0RGVjbGFyYXRpb24gPSBpbXBvcnREZWNsYXJhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9CZWFuSW5mb1Byb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9CZWFuSW5mb1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOGJkMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQmVhbkluZm9Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogTmF2aWdhdGVzIHRoZSBJSmF2YVByb2plY3QgY2xhc3NwYXRoIChpbmNsLiBzb3VyY2UpIG9uIGEgZ2l2ZW4gcmVzb3VyY2UgYW5kIGluZmVycyBiZWFuIHByb3BlcnRpZXMKLSAqIGdpdmVuIGEgZnVsbHkgcXVhbGlmaWVkIGJlYW5uYW1lLiBCZWFuIHByb3BlcnRpZXMgY2FuIGJlIHJldHJpZXZlZCB1c2luZzoKLSAqIDxjb2RlPmdldFJ1bnRpbWVQcm9wZXJ0aWVzKElSZXNvdXJjZSBiYXNlUmVzb3VyY2UsIFN0cmluZyB0eXBlTmFtZSk8L2NvZGU+Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmVhbkluZm9Qcm92aWRlciBpbXBsZW1lbnRzIElCZWFuSW5mb1Byb3ZpZGVyIHsKLQotCXB1YmxpYyBjbGFzcyBKYXZhUHJvcGVydHlEZXNjcmlwdG9yIGltcGxlbWVudHMgSUphdmFQcm9wZXJ0eURlc2NyaXB0b3IgewotCQlTdHJpbmcgZlR5cGUgPSBudWxsOwotCQlTdHJpbmcgZk5hbWUgPSBudWxsOwotCQlib29sZWFuIGZSZWFkYWJsZSA9IHRydWU7Ci0JCWJvb2xlYW4gZldyaXRhYmxlID0gdHJ1ZTsKLQotCQlwdWJsaWMgSmF2YVByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIGJvb2xlYW4gcmVhZGFibGUsIGJvb2xlYW4gd3JpdGFibGUpIHsKLQkJCWZOYW1lID0gbmFtZTsKLQkJCWZUeXBlID0gdHlwZTsKLQkJCWZSZWFkYWJsZSA9IHJlYWRhYmxlOwotCQkJZldyaXRhYmxlID0gd3JpdGFibGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlY2xhcmVkVHlwZSgpIHsKLQkJCXJldHVybiBmVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCQlyZXR1cm4gZk5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZk5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZXRSZWFkYWJsZSgpIHsKLQkJCXJldHVybiBmUmVhZGFibGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZXRXcml0ZWFibGUoKSB7Ci0JCQlyZXR1cm4gZldyaXRhYmxlOwotCQl9Ci0JfQotCi0JLy8gbG9va3MgdXAgZW5jb2RlZCB0eXBlIChzZWUgQ2xhc3MuZ2V0TmFtZSksIGFuZCBnaXZlcyB5b3UgYSBkaXNwbGF5YWJsZSBzdHJpbmcKLQlwcml2YXRlIEhhc2hNYXAgZkVuY29kZWRUeXBlTWFwID0gbnVsbDsKLQkvLyB0byBhdm9pZCByZXBlYXQgcHJvcGVydGllcyBmcm9tIHNob3dpbmcgdXAKLQlwcml2YXRlIEhhc2hTZXQgZlJlcGVhdE1ldGhvZHMgPSBudWxsOwotCi0JcHVibGljIEJlYW5JbmZvUHJvdmlkZXIoKSB7Ci0JCWZSZXBlYXRNZXRob2RzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmZlcnJlZCBwcm9wZXJ0aWVzIG9mIGEgYmVhbiBiYXNlZCBvbiB0aGUgcHJvamVjdCBmcm9tIHRoZSBiYXNlUmVzb3VyY2UsCi0JICogYW5kIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYmVhbi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVJlc291cmNlIHRoZSBiYXNlIHJlc291cmNlIHdoZXJlIHRoZSBiZWFuIGlzIGJlaW5nIHVzZWQKLQkgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIDxpPmZ1bGx5IHF1YWxpZmllZDwvaT4gdHlwZSBuYW1lIChlZy4gamF2YXguc3dpbmcuSkJ1dHRvbikgb2YgdGhlIGJlYW4KLQkgKi8KLQlwdWJsaWMgSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRSdW50aW1lUHJvcGVydGllcyhJUmVzb3VyY2UgYmFzZVJlc291cmNlLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGJhc2VSZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQlRdWFsaWZpZWROYW1lIHR5cGVRdWFsaWZpZWROYW1lID0gZ2V0VHlwZVF1YWxpZmllZE5hbWUodHlwZU5hbWUpOwotCQlMaXN0IGdldE1ldGhvZFJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaXNNZXRob2RSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHNldE1ldGhvZFJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZGVzY3JpcHRvclJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlJVHlwZSB0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUodHlwZVF1YWxpZmllZE5hbWUuZ2V0UXVhbGlmaWVyKCkgKyAiLiIgKyB0eXBlUXVhbGlmaWVkTmFtZS5nZXRMb2NhbE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHR5cGUgbXVzdCBleGlzdAotCQkJaWYodHlwZSAhPSBudWxsKSB7Ci0JCQkJSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5ID0gdHlwZS5uZXdUeXBlSGllcmFyY2h5KG51bGwpOwotCQkJCUlUeXBlW10gc3VwZXJzID0gaGllcmFyY2h5LmdldEFsbFN1cGVyY2xhc3Nlcyh0eXBlKTsKLQkKLQkJCQlJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotCQkJCS8vIGl0ZXJhdGUgdGhlIGJlYW4ncyBtZXRob2RzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKQotCQkJCQlhY2NlcHRNZXRob2QoZ2V0TWV0aG9kUmVzdWx0cywgaXNNZXRob2RSZXN1bHRzLCBzZXRNZXRob2RSZXN1bHRzLCBtZXRob2RzW2ldKTsKLQkJCQkvLyB0aGUgYmVhbiBoaWVyYXJjaHkncyBtZXRob2RzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJbWV0aG9kcyA9IHN1cGVyc1tpXS5nZXRNZXRob2RzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kcy5sZW5ndGg7IGorKykKLQkJCQkJCWFjY2VwdE1ldGhvZChnZXRNZXRob2RSZXN1bHRzLCBpc01ldGhvZFJlc3VsdHMsIHNldE1ldGhvZFJlc3VsdHMsIG1ldGhvZHNbal0pOwotCQkJCX0KLQkJCQlhZGFwdE1ldGhvZHNUb1Byb3BlcnR5RGVzY3JpcHRvcnMoZ2V0TWV0aG9kUmVzdWx0cywgaXNNZXRob2RSZXN1bHRzLCBzZXRNZXRob2RSZXN1bHRzLCBkZXNjcmlwdG9yUmVzdWx0cyk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJQcm9ibGVtIG5hdmlnYXRpbmcgSmF2YVByb2plY3QgaW4gQmVhbkluZm9Qcm92aWRlciIsIGptZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJSmF2YVByb3BlcnR5RGVzY3JpcHRvcltdIGZpbmFsUmVzdWx0cyA9IG5ldyBJSmF2YVByb3BlcnR5RGVzY3JpcHRvcltkZXNjcmlwdG9yUmVzdWx0cy5zaXplKCldOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRlc2NyaXB0b3JSZXN1bHRzLnRvQXJyYXkoKSwgMCwgZmluYWxSZXN1bHRzLCAwLCBkZXNjcmlwdG9yUmVzdWx0cy5zaXplKCkpOwotCQlyZXR1cm4gZmluYWxSZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZyb20gbWV0aG9kIGRlY2xhcmF0aW9uIGxpc3RzLCBjcmVhdGVzIGFuZCBmaWxscyBhIGxpc3Qgb2YgSmF2YVByb3BlcnR5RGVzY3JpcHRvcnMuCi0JICogQHBhcmFtIGdldE1ldGhvZHMKLQkgKiBAcGFyYW0gaXNNZXRob2RzCi0JICogQHBhcmFtIHNldE1ldGhvZHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRvclJlc3VsdHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRhcHRNZXRob2RzVG9Qcm9wZXJ0eURlc2NyaXB0b3JzKExpc3QgZ2V0TWV0aG9kcywgTGlzdCBpc01ldGhvZHMsIExpc3Qgc2V0TWV0aG9kcywgTGlzdCBkZXNjcmlwdG9ycykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcmVhZGFibGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUhhc2hNYXAgdHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGl0ZXJhdGUgdGhyb3VnaCBnZXQqIGFuZCBpcyogbWV0aG9kcywgdXBkYXRpbmcgJ3JlYWRhYmxlJyBsaXN0IGFuZCAndHlwZXMnIG1hcAotCQlmaWx0ZXJHZXRNZXRob2RzKGdldE1ldGhvZHMsIHJlYWRhYmxlLCB0eXBlcyk7Ci0JCWZpbHRlcklzTWV0aG9kcyhpc01ldGhvZHMsIHJlYWRhYmxlLCB0eXBlcyk7Ci0KLQkJLy8gaXRlcmF0ZSBzZXQqIG1ldGhvZHMsIGNoZWNraW5nIG92ZXJsYXAgdy8gcmVhZGFibGUKLQkJSXRlcmF0b3IgaXQgPSBzZXRNZXRob2RzLml0ZXJhdG9yKCk7Ci0JCUlNZXRob2QgdGVtcCA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBlbmNvZGVkUGFyYW1zID0gbnVsbDsKLQkJU3RyaW5nIHJldHVyblR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcGFyYW0wID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl0ZW1wID0gKElNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW5hbWUgPSBjcmVhdGVQcm9wZXJ0eU5hbWVGcm9tTWV0aG9kKHRlbXApOwotCQkJLy8gaW52YWxpZCBuYW1pbmcgY29udmVudGlvbgotCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQotCQkJcmV0dXJuVHlwZSA9IGdldERlY29kZWRUeXBlTmFtZSh0ZW1wLmdldFJldHVyblR5cGUoKSk7Ci0JCQkvLyBzZXR0ZXIgc2hvdWxkIGhhdmUgbm8gcmV0dXJuIHR5cGUKLQkJCWlmICghcmV0dXJuVHlwZS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBuZWVkIHRvIGdldCB0eXBlIGZyb20gcGFyYW1ldGVyCi0JCQllbmNvZGVkUGFyYW1zID0gdGVtcC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJaWYgKGVuY29kZWRQYXJhbXMgIT0gbnVsbCAmJiBlbmNvZGVkUGFyYW1zLmxlbmd0aCA+IDApIHsKLQkJCQlpZiAoZW5jb2RlZFBhcmFtcy5sZW5ndGggPiAxKSB7Ci0JCQkJCS8vIG11bHRpcGxlIHBhcmFtcwotCQkJCQlwYXJhbTAgPSBnZXREZWNvZGVkVHlwZU5hbWUoZW5jb2RlZFBhcmFtc1swXSk7Ci0JCQkJCWlmICghcGFyYW0wLmVxdWFscygiaW50IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIG5vdCBhIHZhbGlkIGluZGV4ZWQgcHJvcGVydHkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQkKLQkJCQkJdHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUGFyYW1zWzFdKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG9uZSBwYXJhbSwgcmVndWxhciBzZXR0ZXIKLQkJCQkJaWYgKGlzQXJyYXkoZW5jb2RlZFBhcmFtc1swXSkpCi0JCQkJCQl0eXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRQYXJhbXNbMF0pOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJlYWRhYmxlLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJLy8gd3JpdGFibGUgYW5kIHJlYWRhYmxlCi0JCQkJaWYgKCFmUmVwZWF0TWV0aG9kcy5jb250YWlucyhuYW1lKSkgewotCQkJCQlkZXNjcmlwdG9ycy5hZGQobmV3IEphdmFQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgKFN0cmluZykgdHlwZXMuZ2V0KG5hbWUpLCB0cnVlLCB0cnVlKSk7Ci0JCQkJCXJlYWRhYmxlLnJlbW92ZShuYW1lKTsKLQkJCQkJZlJlcGVhdE1ldGhvZHMuYWRkKG5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdhc24ndCByZWFkYWJsZSwganVzdCB3cml0YWJsZQotCQkJCVN0cmluZ1tdIHBhcmFtcyA9IHRlbXAuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCQkvLyBjYW4ndCBiZSBzZXRQcm9wZXJ0eSBpZiBubyBwYXJhbWV0ZXJzCi0JCQkJaWYgKCEocGFyYW1zLmxlbmd0aCA+IDApKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoIWZSZXBlYXRNZXRob2RzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJCXR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUocGFyYW1zWzBdKTsKLQkJCQkJZGVzY3JpcHRvcnMuYWRkKG5ldyBKYXZhUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIHR5cGUsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJCWZSZXBlYXRNZXRob2RzLmFkZChuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkIGxlZnRvdmVyIGZyb20gcmVhZGFibGUsIGdldCogYW5kIGlzKiBtZXRob2RzIChyZWFkYWJsZSA9IHRydWUsIHdyaXRhYmxlID0gZmFsc2UpCi0JCWl0ID0gcmVhZGFibGUuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJbmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWlmICghZlJlcGVhdE1ldGhvZHMuY29udGFpbnMobmFtZSkpIHsKLQkJCQlkZXNjcmlwdG9ycy5hZGQobmV3IEphdmFQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgKFN0cmluZykgdHlwZXMuZ2V0KG5hbWUpLCB0cnVlLCBmYWxzZSkpOwotCQkJCWZSZXBlYXRNZXRob2RzLmFkZChuYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaWx0ZXJHZXRNZXRob2RzKExpc3QgZ2V0TWV0aG9kcywgTGlzdCByZWFkYWJsZSwgSGFzaE1hcCB0eXBlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlNZXRob2QgdGVtcDsKLQkJU3RyaW5nIG5hbWU7Ci0JCVN0cmluZyBlbmNvZGVkUmV0dXJuVHlwZTsKLQkJU3RyaW5nIHJldHVyblR5cGU7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0TWV0aG9kcy5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBlbmNvZGVkUGFyYW1zOwotCQlTdHJpbmcgcGFyYW1UeXBlOwotCQkvLyBpdGVyYXRlIGdldCogbWV0aG9kcwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl0ZW1wID0gKElNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW5hbWUgPSBjcmVhdGVQcm9wZXJ0eU5hbWVGcm9tTWV0aG9kKHRlbXApOwotCQkJLy8gaW52YWxpZCBiZWFuIG5hbWluZyBjb252ZW50aW9uCi0JCQlpZiAobmFtZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQllbmNvZGVkUmV0dXJuVHlwZSA9IHRlbXAuZ2V0UmV0dXJuVHlwZSgpOwotCQkJcmV0dXJuVHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUmV0dXJuVHlwZSk7Ci0KLQkJCS8vICBjYW4ndCBnZXQgYmUgYSBnZXRQcm9wZXJ0eSBpZiByZXR1cm5zIHZvaWQKLQkJCWlmIChyZXR1cm5UeXBlLmVxdWFscygidm9pZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0KLQkJCS8vIGNoZWNrIHBhcmFtcyBpbiBjYXNlIGl0J3MgaW5kZXhlZCBwcm9wZXR5Ci0JCQllbmNvZGVkUGFyYW1zID0gdGVtcC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJaWYgKGVuY29kZWRQYXJhbXMgIT0gbnVsbCAmJiBlbmNvZGVkUGFyYW1zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJcGFyYW1UeXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRQYXJhbXNbMF0pOwotCQkJCS8vIHN5bnRheCBpcyA+IFR5cGUgZ2V0dGVyKGludCk7Ci0JCQkJaWYgKCFwYXJhbVR5cGUuZXF1YWxzKCJpbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vaXQncyBub3QgYW4gaW5kZXhlZCBwcm9wZXJ0eQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy8gaXQgaXMgaW5kZXhlZCwgcHJvcCB0eXBlIGlzIGFuIEFSUkFZCi0JCQkJcmV0dXJuVHlwZSArPSAiW10iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXJlYWRhYmxlLmFkZChuYW1lKTsKLQkJCXR5cGVzLnB1dChuYW1lLCByZXR1cm5UeXBlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbHRlcklzTWV0aG9kcyhMaXN0IGlzTWV0aG9kUmVzdWx0cywgTGlzdCByZWFkYWJsZSwgSGFzaE1hcCB0eXBlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlNZXRob2QgdGVtcDsKLQkJU3RyaW5nIG5hbWU7Ci0JCVN0cmluZyBlbmNvZGVkUmV0dXJuVHlwZTsKLQkJU3RyaW5nIHJldHVyblR5cGU7Ci0JCVN0cmluZ1tdIGVuY29kZWRQYXJhbXM7Ci0JCVN0cmluZyBwYXJhbVR5cGU7Ci0JCS8vIGl0ZXJhdGUgaXMqIG1ldGhvZHMKLQkJSXRlcmF0b3IgaXQgPSBpc01ldGhvZFJlc3VsdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdGVtcCA9IChJTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQluYW1lID0gY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZCh0ZW1wKTsKLQkJCS8vIGludmFsaWQgYmVhbiBuYW1pbmcgY29udmVudGlvbgotCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWVuY29kZWRSZXR1cm5UeXBlID0gdGVtcC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlyZXR1cm5UeXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRSZXR1cm5UeXBlKTsKLQotCQkJLy8gaXNQcm9wZXJ0eSBvbmx5IHZhbGlkIGZvciBib29sZWFuCi0JCQlpZiAoIXJldHVyblR5cGUuZXF1YWxzKCJib29sZWFuIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQotCQkJLy8gY2hlY2sgcGFyYW1zIGluIGNhc2UgaXQncyBpbmRleGVkIHByb3BldHkKLQkJCWVuY29kZWRQYXJhbXMgPSB0ZW1wLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQlpZiAoZW5jb2RlZFBhcmFtcyAhPSBudWxsICYmIGVuY29kZWRQYXJhbXMubGVuZ3RoID09IDEpIHsKLQkJCQlwYXJhbVR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUoZW5jb2RlZFBhcmFtc1swXSk7Ci0JCQkJLy8gc3ludGF4IGlzID4gVHlwZSBnZXR0ZXIoaW50KTsKLQkJCQlpZiAoIXBhcmFtVHlwZS5lcXVhbHMoImludCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy9pdCdzIG5vdCBhIHZhbGlkIGluZGV4ZWQgcHJvcGVydHkKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCi0JCQlyZWFkYWJsZS5hZGQobmFtZSk7Ci0JCQl0eXBlcy5wdXQobmFtZSwgcmV0dXJuVHlwZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXNzIGluIGEgZ2V0KnxzZXQqfGlzKiBtZXRob2QgYW5kIGl0IHdpbGwgcmV0dXJuIGFuIGluZmVycmVkIHByb3BlcnR5IG5hbWUgdXNpbmcgPGNvZGU+SW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShTdHJpbmcpPC9jb2RlPgotCSAqIEBwYXJhbSB0ZW1wCi0JICogQHJldHVybiBhbiBpbmZlcnJlZCBwcm9wZXJ0eSBuYW1lIGJhc2VkIG9uIHRoZSBJTWV0aG9kIG5hbWUsIG51bGwgaWYgdGhlIG5hbWUgaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byBiZWFuIHNwZWMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVQcm9wZXJ0eU5hbWVGcm9tTWV0aG9kKElNZXRob2QgdGVtcCkgewotCQlTdHJpbmcgbmFtZSA9IHRlbXAuZ2V0RWxlbWVudE5hbWUoKTsKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiaXMiKSkgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobmFtZS5zdWJzdHJpbmcoMikpOwotCQllbHNlCi0JCQkvLyBtdXN0IGJlIGdldCBvciBzZXQKLQkJCW5hbWUgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKDMpKTsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbCBmaWx0ZXJpbmcgb2YgbWV0aG9kcy4gIENoZWNrcyBwcmVmaXggaWYgaXQncyB2YWxpZCBsZW5ndGguICBJZiB0aGUgcHJlZml4IGlzICJnZXQiIHRoZSAgbWV0aG9kIG5hbWUgCi0JICogaXMgcGxhY2VkIGluIHRoZSBnZXRNZXRob2RSZXN1bHRzIExpc3QuICBJZiB0aGUgcHJlZml4IGlzICJpcyIsIHRoZSBuYW1lIGlzIGFkZGVkIHRvIHRoZSBpc01ldGhvZFJlc3VsdHMgbGlzdC4gIElmIHRoZQotCSAqIHByZWZpeCBpcyAic2V0IiwgaXQncyBhZGRlZCB0byB0aGUgc2V0TWV0aG9kUmVzdWx0c0xpc3QuCi0JICogCi0JICogQHBhcmFtIGdldE1ldGhvZFJlc3VsdHMKLQkgKiBAcGFyYW0gaXNNZXRob2RSZXN1bHRzCi0JICogQHBhcmFtIHNldE1ldGhvZFJlc3VsdHMKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFjY2VwdE1ldGhvZChMaXN0IGdldE1ldGhvZFJlc3VsdHMsIExpc3QgaXNNZXRob2RSZXN1bHRzLCBMaXN0IHNldE1ldGhvZFJlc3VsdHMsIElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKCFmUmVwZWF0TWV0aG9kcy5jb250YWlucyhtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCWZSZXBlYXRNZXRob2RzLmFkZChtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQlpbnQgZmxhZ3MgPSBtZXRob2QuZ2V0RmxhZ3MoKTsKLQkJCVN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlpZiAoRmxhZ3MuaXNQdWJsaWMoZmxhZ3MpKSB7Ci0JCQkJaWYgKG1ldGhvZE5hbWUubGVuZ3RoKCkgPiAzICYmIG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0TWV0aG9kUmVzdWx0cy5hZGQobWV0aG9kKTsKLQkJCQllbHNlIGlmIChtZXRob2ROYW1lLmxlbmd0aCgpID4gMiAmJiBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImlzIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJaXNNZXRob2RSZXN1bHRzLmFkZChtZXRob2QpOwotCQkJCWVsc2UgaWYgKG1ldGhvZE5hbWUubGVuZ3RoKCkgPiAzICYmIG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgic2V0IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJc2V0TWV0aG9kUmVzdWx0cy5hZGQobWV0aG9kKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0eXBlTmFtZQotCSAqIEByZXR1cm4gYSBRdWFsaWZpZWQgbmFtZSB3aXRoIHRoZSBwYWNrYWdlIGFzIHRoZSBxdWFsaWZpZXIsIGFuZCBjbGFzcyBuYW1lIGFzIExvY2FsTmFtZQotCSAqLwotCXByaXZhdGUgUXVhbGlmaWVkTmFtZSBnZXRUeXBlUXVhbGlmaWVkTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0eXBlTmFtZSwgIi4iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IHN0LmNvdW50VG9rZW5zKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCVN0cmluZ0J1ZmZlciByb290ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoY291bnQrKyA8IGxlbmd0aCAtIDEpIHsKLQkJCXJvb3QuYXBwZW5kKHN0Lm5leHRUb2tlbigpKTsKLQkJCWlmIChjb3VudCA8IGxlbmd0aCAtIDEpCi0JCQkJcm9vdC5hcHBlbmQoJy4nKTsKLQkJfQotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUocm9vdC50b1N0cmluZygpLCBzdC5uZXh0VG9rZW4oKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGVuY29kZWRUeXBlTmFtZSBpcyBhbiBhcnJheQotCSAqIEBwYXJhbSBlbmNvZGVkVHlwZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZW5jb2RlZFR5cGVOYW1lIGlzIGFuIGFycmF5LCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQXJyYXkoU3RyaW5nIGVuY29kZWRUeXBlTmFtZSkgewotCQlpZiAoZW5jb2RlZFR5cGVOYW1lICE9IG51bGwgJiYgZW5jb2RlZFR5cGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKGVuY29kZWRUeXBlTmFtZS5jaGFyQXQoMCkgPT0gJ1snKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWNvZGVkIChkaXNwbGF5YWJsZSkgbmFtZSBmbyB0aGUgdHlwZS4KLQkgKiBFaXRoZXIgYSBwcmltaXRpdmUgdHlwZSAoaW50LCBsb25nLCBmbG9hdC4uLikgT2JqZWN0IChTdHJpbmcpCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIGRlY29kZWQgbmFtZSBmb3IgdGhlIGVuY29kZWQgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVjb2RlZFR5cGVOYW1lKFN0cmluZyBlbmNvZGVkKSB7Ci0JCUhhc2hNYXAgbWFwID0gZ2V0RW5jb2RlZFR5cGVNYXAoKTsKLQotCQlTdHJpbmdCdWZmZXIgZGVjb2RlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhciBCUkFDS0VUID0gJ1snOwotCQlTdHJpbmcgQlJBQ0tFVFMgPSAiW10iOyAvLyROT04tTkxTLTEkCi0JCWNoYXIgaWRlbnRpZmllciA9ICcgJzsKLQkJaW50IGxhc3QgPSAwOwotCQkvLyBjb3VudCBicmFja2V0cwotCQl3aGlsZSAoZW5jb2RlZC5pbmRleE9mKEJSQUNLRVQsIGxhc3QpICE9IC0xKSB7Ci0JCQlsYXN0Kys7Ci0JCX0KLQkJaWRlbnRpZmllciA9IGVuY29kZWQuY2hhckF0KGxhc3QpOwotCQlPYmplY3QgcHJpbWl0aXZlVHlwZSA9IG1hcC5nZXQoU3RyaW5nLnZhbHVlT2YoaWRlbnRpZmllcikpOwotCQkvLyBMID4gYmluYXJ5IHR5cGUgbmFtZSwgUSA+IHNvdXJjZSB0eXBlIG5hbWUKLQkJaWYgKGlkZW50aWZpZXIgPT0gJ0wnIHx8IGlkZW50aWZpZXIgPT0gJ1EnKSB7Ci0JCQkvLyBoYW5kbGUgb2JqZWN0Ci0JCQlTdHJpbmcgY2xhc3NuYW1lID0gZW5jb2RlZC5zdWJzdHJpbmcobGFzdCArIDEsIGVuY29kZWQubGVuZ3RoKCkgLSAxKTsKLQkJCWRlY29kZWQuYXBwZW5kKGNsYXNzbmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBoYW5kbGUgcHJpbWl0aXZlIHR5cGUgKGZyb20gSUZpZWxkLmdldFNpZ25hdHVyZSgpKQotCQkJZGVjb2RlZC5hcHBlbmQoKFN0cmluZykgcHJpbWl0aXZlVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBoYW5kbGUgcHJpbWl0aXZlIHR5cGUgKGZyb20gQ2xhc3MuZ2V0TmFtZSgpKQotCQkJZGVjb2RlZC5hcHBlbmQoZW5jb2RlZCk7Ci0JCX0KLQkJLy8gaGFuZGxlIGFycmF5cwotCQlpZiAobGFzdCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7Ci0JCQkJZGVjb2RlZC5hcHBlbmQoQlJBQ0tFVFMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWNvZGVkLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICoJZnJvbSBDbGFzcy5nZXROYW1lKCkgamF2YWRvYwotCSAqCWFsc28gc2VlIFNpZ25hdHVyZSBpbiBqZHQuY29yZSBhcGkKLQkgKjxwcmU+Ci0JICoJCQlCICAgICAgICAgICAgYnl0ZQotCSAqCQkJQyAgICAgICAgICAgIGNoYXIKLQkgKgkJCUQgICAgICAgICAgICBkb3VibGUKLQkgKgkJCUYgICAgICAgICAgICBmbG9hdAotCSAqCQkJSSAgICAgICAgICAgIGludAotCSAqCQkJSiAgICAgICAgICAgIGxvbmcKLQkgKgkJCUxjbGFzc25hbWU7ICBjbGFzcyBvciBpbnRlcmZhY2UKLQkgKgkJCVFzb3VyY2VuYW1lOyBzb3VyY2UKLQkgKgkJCVMgICAgICAgICAgICBzaG9ydAotCSAqCQkJWiAgICAgICAgICAgIGJvb2xlYW4KLQkgKgkJCVYJICAgCQkgdm9pZAotCSAqPC9wcmU+Ci0JICoKLQkgKiBAcmV0dXJuIHRoZSAiZW5jb2RpbmcgbGV0dGVyIiB0byAidHlwZSIgbWFwLgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRFbmNvZGVkVHlwZU1hcCgpIHsKLQkJaWYgKGZFbmNvZGVkVHlwZU1hcCA9PSBudWxsKSB7Ci0JCQlmRW5jb2RlZFR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiQiIsICJieXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiQyIsICJjaGFyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiRCIsICJkb3VibGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmRW5jb2RlZFR5cGVNYXAucHV0KCJGIiwgImZsb2F0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiSSIsICJpbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmRW5jb2RlZFR5cGVNYXAucHV0KCJKIiwgImxvbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlmRW5jb2RlZFR5cGVNYXAucHV0KCJTIiwgInNob3J0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiWiIsICJib29sZWFuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiViIsICJ2b2lkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBmRW5jb2RlZFR5cGVNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTIxMjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotLyoqCi0gKiBQdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gbWFrZSB0aGUgYWRkaXRpb25hbCBwcm9wb3NhbCBpbmZvIGludG8gY29udGVudAotICogZml0IGZvciBhbiBIVE1MIHZpZXdlciAoYnkgZXNjYXBpbmcgY2hhcmFjdGVycykKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLWNsYXNzIEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwgZXh0ZW5kcyBUZW1wbGF0ZVByb3Bvc2FsIGltcGxlbWVudHMgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCi0JcHVibGljIEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwoVGVtcGxhdGUgdGVtcGxhdGUsIFRlbXBsYXRlQ29udGV4dCBjb250ZXh0LCBJUmVnaW9uIHJlZ2lvbiwgSW1hZ2UgaW1hZ2UsIGludCByZWxldmFuY2UpIHsKLQkJc3VwZXIodGVtcGxhdGUsIGNvbnRleHQsIHJlZ2lvbiwgaW1hZ2UsIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBzdXBlci5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCXJldHVybiBTdHJpbmdVdGlscy5jb252ZXJ0VG9IVE1MQ29udGVudChhZGRpdGlvbmFsSW5mbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSUJlYW5JbmZvUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lCZWFuSW5mb1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZDllZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSUJlYW5JbmZvUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5JbmZvUHJvdmlkZXIgewotCUlKYXZhUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UnVudGltZVByb3BlcnRpZXMoSVJlc291cmNlIGJhc2VSZXNvdXJjZSwgU3RyaW5nIHR5cGVOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lKYXZhUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JSmF2YVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjNlM2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lKYXZhUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhUHJvcGVydHlEZXNjcmlwdG9yIHsKLQotCVN0cmluZyBnZXREZWNsYXJlZFR5cGUoKTsKLQotCVN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCWJvb2xlYW4gZ2V0UmVhZGFibGUoKTsKLQotCWJvb2xlYW4gZ2V0V3JpdGVhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTFkYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IsIElSZWxlYXNhYmxlIHsKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKRFRfQ09SRV9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgaW50IGZKc3BTb3VyY2VQb3NpdGlvbiwgZkphdmFQb3NpdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZFcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBmVmlld2VyID0gbnVsbDsKLQlwcml2YXRlIEpTUFRyYW5zbGF0aW9uQWRhcHRlciBmVHJhbnNsYXRpb25BZGFwdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KLQkgKiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCi0JICogd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcHJvcG9zYWxzCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb21wbGV0aW9ucyBzaG91bGQKLQkgKiAgICAgICAgICAgIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb21wbGV0aW9uIHByb3Bvc2FscyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqICAgICAgICAgcHJvcG9zYWxzIGFyZSBwb3NzaWJsZQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgcG9zKSB7Ci0JCWluaXRpYWxpemUocG9zKTsKLQotCQlKU1BQcm9wb3NhbENvbGxlY3RvciBjb2xsZWN0b3IgPSBudWxsOwotCQkKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlcikKLQkJCQlmVmlld2VyID0gKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXI7Ci0KLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmVmlld2VyLmdldERvY3VtZW50KCkpOwotCi0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChmVHJhbnNsYXRpb25BZGFwdGVyID09IG51bGwpCi0JCQkJZlRyYW5zbGF0aW9uQWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQlpZiAoZlRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKSB7Ci0KLQkJCQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGZUcmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkJCQlmSmF2YVBvc2l0aW9uID0gdHJhbnNsYXRpb24uZ2V0SmF2YU9mZnNldChnZXREb2N1bWVudFBvc2l0aW9uKCkpOwotCi0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZGVidWcodHJhbnNsYXRpb24pKTsKLQotCQkJCXRyeSB7Ci0KLQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCi0JCQkJCS8vIGNhbid0IGdldCBqYXZhIHByb3Bvc2FscyB3L291dCBhIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJLy8gb3Igd2l0aG91dCBhIHZhbGlkIHBvc2l0aW9uCi0JCQkJCWlmIChjdSA9PSBudWxsIHx8IC0xID09IGZKYXZhUG9zaXRpb24pCi0JCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQkJCQotCQkJCQljb2xsZWN0b3IgPSBnZXRQcm9wb3NhbENvbGxlY3RvcihjdSwgdHJhbnNsYXRpb24pOwotCQkJCQlzeW5jaHJvbml6ZWQgKGN1KSB7Ci0JCQkJCQljdS5jb2RlQ29tcGxldGUoZkphdmFQb3NpdGlvbiwgY29sbGVjdG9yLCAoV29ya2luZ0NvcHlPd25lcikgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY29yZUV4KSB7Ci0JCQkJCS8vIGEgcG9zc2libGUgSmF2YSBNb2RlbCBFeGNlcHRpb24gZHVlIHRvIG5vdCBiZWluZyBhIFdlYgotCQkJCQkvLyAoSmF2YSkgUHJvamVjdAotCQkJCQljb3JlRXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkvLyB0aHJvdyBvdXQgZXhjZXB0aW9ucyBvbiBjb2RlIGFzc2lzdC4KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJaWYoY29sbGVjdG9yICE9IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBjb2xsZWN0b3IuZ2V0SlNQQ29tcGxldGlvblByb3Bvc2FscygpOwotCQkJaWYgKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA8IDEpCi0JCQkJZkVycm9yTWVzc2FnZSA9IEpTUFVJTWVzc2FnZXMuSmF2YV9Db250ZW50X0Fzc2lzdF9pc19ub3RfVUlfOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSlNQUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBKU1BQcm9wb3NhbENvbGxlY3RvcihjdSwgdHJhbnNsYXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgZGVidWdnaW5nIHRyYW5zbGF0aW9uIG1hcHBpbmcgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWJ1ZyhKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbikgewotCQlTdHJpbmdCdWZmZXIgZGVidWdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUhhc2hNYXAganNwMmphdmEgPSB0cmFuc2xhdGlvbi5nZXRKc3AySmF2YU1hcCgpOwotCQlTdHJpbmcgamF2YVRleHQgPSB0cmFuc2xhdGlvbi5nZXRKYXZhVGV4dCgpOwotCQlTdHJpbmcganNwVGV4dCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoKTsKLQkJZGVidWdTdHJpbmcuYXBwZW5kKCJbanNwMkphdmFNYXAgaW4gSlNQQ29tcGxldGlvblByb2Nlc3Nvcl1cclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVidWdTdHJpbmcuYXBwZW5kKCJqc3AgY3Vyc29yIHBvc2l0aW9uID4+ICIgKyBmVmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRDYXJldE9mZnNldCgpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJdGVyYXRvciBpdCA9IGpzcDJqYXZhLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXRyeSB7Ci0JCQkJUG9zaXRpb24ganNwUG9zID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJUG9zaXRpb24gamF2YVBvcyA9IChQb3NpdGlvbikganNwMmphdmEuZ2V0KGpzcFBvcyk7Ci0JCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJqc3AgPiAiICsganNwUG9zLm9mZnNldCArICI6IiArIGpzcFBvcy5sZW5ndGggKyAiOiIgKyBqc3BUZXh0LnN1YnN0cmluZyhqc3BQb3Mub2Zmc2V0LCBqc3BQb3Mub2Zmc2V0ICsganNwUG9zLmxlbmd0aCkgKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoImphdmEgPiAiICsgamF2YVBvcy5vZmZzZXQgKyAiOiIgKyBqYXZhUG9zLmxlbmd0aCArICI6IiArIGphdmFUZXh0LnN1YnN0cmluZyhqYXZhUG9zLm9mZnNldCwgamF2YVBvcy5vZmZzZXQgKyBqYXZhUG9zLmxlbmd0aCkgKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBlYXQgZXhjZXB0aW9ucywgaXQncyBvbmx5IGZvciBkZWJ1ZwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWJ1Z1N0cmluZy50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgcG9zc2libGUgY29udGV4dHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwb3NzaWJsZQotCSAqICAgICAgICAgICAgY29udGV4dHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIHdoaWNoIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIHNob3VsZCBiZSBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29udGV4dCBpbmZvcm1hdGlvbiBvYmplY3RzIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiBubyBjb250ZXh0IGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCB3aGVuIHByZXNzZWQgc2hvdWxkIGF1dG9tYXRpY2FsbHkKLQkgKiBkaXNwbGF5IGNvbnRlbnQtYXNzaXN0IHByb3Bvc2Fscy4KLQkgKiAKLQkgKiBAcmV0dXJuIHN0cmluZyBvZiBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXV0b1Byb3Bvc2FsSW52b2NhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCB3aGVuIHByZXNzZWQgc2hvdWxkIGF1dG9tYXRpY2FsbHkKLQkgKiBkaXNwbGF5IGEgY29udGVudC1hc3Npc3QgdGlwLgotCSAqIAotCSAqIEByZXR1cm4gc3RyaW5nIG9mIGNoYXJhY3RlcnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdXRvVGlwSW52b2NhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQKLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcwotCSAqICAgICAgICAgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsaWRhdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gZGlzcGxheWVkIGNvbnRleHQKLQkgKiBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZGlzbWlzc2VkLiBNYXkgb25seSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGUgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RG9jdW1lbnRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZKc3BTb3VyY2VQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJLy8gVE9ETzogZ2V0IGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UKLQkJLy8gaWYgKGZDb2xsZWN0b3IuZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCAmJgotCQkvLyBmQ29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpLmxlbmd0aCgpID4gMCkKLQkJLy8gcmV0dXJuIGZDb2xsZWN0b3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCXJldHVybiBmRXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGNvZGUgYXNzaXN0IHByb2Nlc3Nvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKGludCBwb3MpIHsKLQkJaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCk7Ci0KLQkJZkpzcFNvdXJjZVBvc2l0aW9uID0gcG9zOwotCQlmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBKYXZhIFBsdWdpbnMgdGhhdCB0aGUgSlNQIHByb2Nlc3NvciByZXF1aXJlcy4KLQkgKiBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0Mzc2NQotCSAqIFdlIHNob3VsZCBub3QgY2FsbCAic3RhcnQiLCBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZSB0aGF0IAotCSAqIHN0YXRlIHRvIGJlIHJlbWVtYmVyZWQsIGFuZCByZS1zdGFydGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIAotCSAqIHRoZSBuZXh0IGJvb3QgdXAgc2VxdWVuY2UuIAotCSAqIAotCSAqIElTU1VFOiB3ZSBtYXkgYmUgYWJsZSB0byBnZXQgcmlkIG9mIHRoaXMgYWxsIHRvZ2V0aGVyLCBpbiBmdXR1cmUsIAotCSAqIHNpbmNlIDk5JSB3ZSBwcm9iYWJseSBoYXZlIGFscmVhZHkgdXNlZCBzb21lIEpEVCBjbGFzcyBieSB0aGUgdGltZSAKLQkgKiB3ZSBuZWVkIEpEVCB0byBiZSBhY3RpdmUgLi4uIGJ1dCAuLi4gdGhpcyBpcyB0aGUgc2FmZXN0IGZpeCBmb3IgCi0JICogdGhpcyBwb2ludCBpbiAxLjUgc3RyZWFtLiBOZXh0IHJlbGVhc2UsIGxldCdzIGp1c3QgcmVtb3ZlIHRoaXMsIAotCSAqIHJlLWRpc2NvdmVyIHdoYXQgZXZlciBidWcgdGhpcyB3YXMgZml4aW5nIChpZiBhbnkpIGFuZCBpZiB0aGVyZSBpcyAKLQkgKiBvbmUsIHRoZW4gd2UnbGwgZWl0aGVyIHB1dCBiYWNrIGluLCBhcyBpcywgb3IgY29tZSB1cCB3aXRoIGEgCi0JICogbW9yZSBhcHByb3ByaWF0ZSBmaXguIAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKYXZhUGx1Z2lucygpIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSkRUX0NPUkVfUExVR0lOX0lEKTsKLQkJCWJ1bmRsZS5sb2FkQ2xhc3MoImR1bW15Q2xhc3NOYW1lVGhhdFNob3VsZE5ldmVyRXhpc3QiKTsKLQkJfQotCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIHRoZSBleHBlY3RlZCByZXN1bHQsIHdlIGp1c3Qgd2FudCB0byAKLQkJCS8vIG51ZGdlIHRoZSBidW5kbGUgdG8gYmUgc3VyZSBpdHMgYWN0aXZhdGVkLiAKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZUcmFuc2xhdGlvbkFkYXB0ZXIgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NWVhZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotCi0vKioKLSAqIEltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgZm9yIHVzZSB3aXRoIEpTUFByb3Bvc2FsQ29sbGVjdG9yLgotICoKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29tcGxldGlvblByb3Bvc2FsIGV4dGVuZHMgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgIHsKLQotCS8qCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCSAqIAotCSAqIFRoaXMgaXMgYSB3cmFwcGVkIHByb3Bvc2FsIHNvIHdlIGRvbid0IG5lZWQgdG8gCi0JICogbWFrZSAic2xvdyIgY2FsbHMgdG8gdGhlIGphdmEgcHJvcG9zYWwgdXAgZnJvbnQsIG9ubHkgd2hlbiBuZWVkZWQKLQkgKiBmb3IgZXhhbXBsZSwgZ2V0QWRkaXRpb25hbEluZm8oKSByZWFkcyBleHRlcm5hbCBqYXZhZG9jLCBhbmQgaXQgbWFrZXMKLQkgKiBubyBzZW5zZQotCSAqLyAKLQlJQ29tcGxldGlvblByb3Bvc2FsIGZKYXZhQ29tcGxldGlvblByb3Bvc2FsID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNQQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGludCBjdXJzb3JQb3NpdGlvbiwgSW1hZ2UgaW1hZ2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiwgU3RyaW5nIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIGludCByZWxldmFuY2UsIGJvb2xlYW4gdXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlKSB7Ci0JCXN1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGN1cnNvclBvc2l0aW9uLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLCBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCByZWxldmFuY2UsIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGFwcGx5aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBvZmZzZXQpOwotCX0KLQotCWZpbmFsIHB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsIGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoKSB7Ci0JCXJldHVybiBmSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgdm9pZCBzZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKElDb21wbGV0aW9uUHJvcG9zYWwgamF2YUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQlmSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCA9IGphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJCi0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCk7Ci0JCWlmKGphdmFQcm9wb3NhbCAhPSBudWxsKQotCQkJYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQkKLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3YzUwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1BDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AyME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudFRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Qcm9wb3NhbENvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTFJlbGV2YW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBBZGRzIHByb3Bvc2FscyBub3Qgbm9ybWFsbHkgY292ZXJlZCBieSB0aGUgZ2VuZXJpYyBiZWhhdmlvciB3aXRoIHRoZQotICogY29udGVudCBtb2RlbAotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCi0JcHJvdGVjdGVkIGludCBkZXB0aENvdW50ID0gMDsKLQlwcm90ZWN0ZWQgSVRleHRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlRW1iZWRkZWRSZXN1bHRzID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVybmFsQWRhcHRlciA9IGZhbHNlOwotCXByb3RlY3RlZCBIYXNoTWFwIGZOYW1lVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCXByb3RlY3RlZCBIYXNoTWFwIGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsW10gRU1QVFlfUFJPUE9TQUxfU0VUID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JcHJpdmF0ZSBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlRlbXBsYXRlQ29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi0JcHVibGljIEpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXROYW1lVG9Qcm9jZXNzb3JNYXAoKTsKLQkJaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JfQotCi0JLyoqCi0JICogaW5pdCBtYXAgZm9yIGV4dHJhIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgKHVzZUJlYW4sCi0JICogZ2V0L3NldFByb3BlcnR5KS4gcG9pbnRzIFt0YWduYW1lID4gcHJvY2Vzc29yXQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXROYW1lVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCWZOYW1lVG9Qcm9jZXNzb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNwUHJvcGVydHlDQVAgPSBuZXcgSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWZOYW1lVG9Qcm9jZXNzb3JNYXAucHV0KEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZLCBqc3BQcm9wZXJ0eUNBUCk7Ci0JCWZOYW1lVG9Qcm9jZXNzb3JNYXAucHV0KEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkdFVFBST1BFUlRZLCBqc3BQcm9wZXJ0eUNBUCk7Ci0JCWZOYW1lVG9Qcm9jZXNzb3JNYXAucHV0KEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4sIG5ldyBKU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3NvcigpKTsKLQkJZk5hbWVUb1Byb2Nlc3Nvck1hcC5wdXQoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQiwgbmV3IEpTUFRhZ2xpYkRpcmVjdGl2ZUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogaW50IG1hcCB0aGF0IHBvaW50cyBbcGFydGl0aW9uID4gcHJvY2Vzc29yXS4gVGhpcyB0YWtlcyBwbGFjZSBvZgotCSAqIGVtYmVkZGVkIGFkYXB0ZXJzIGZvciBub3cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkgewotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciBodG1sUHJvY2Vzc29yID0gbmV3IEhUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCUpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzcEphdmFQcm9jZXNzb3IgPSBuZXcgSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciB4bWxQcm9jZXNzb3IgPSBuZXcgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBqYXZhc2NyaXB0UHJvY2Vzc29yID0gZ2V0SlNDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0KLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxULCBodG1sUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCwgeG1sUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04sIGh0bWxQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxULCBqc3BKYXZhUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFLCB4bWxQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQsIGh0bWxQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUX0VMLCBqc3BKYXZhUHJvY2Vzc29yKTsKLQkJaWYgKGphdmFzY3JpcHRQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULCBqYXZhc2NyaXB0UHJvY2Vzc29yKTsKLQkJCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUhUTUxQYXJ0aXRpb25zLlNDUklQVCwgamF2YXNjcmlwdFByb2Nlc3Nvcik7IC8vIGRlZmF1bHQKLQkJfQotCQkvLyB0bwotCQkvLyBqYXZhc2NyaXB0Ci0JCS8vIGZvcgotCQkvLyBhbGwKLQkJLy8gc2NyaXB0Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tbWVudFByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREb2NUeXBlUHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJaWYgKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BUQUcuZXF1YWxzKCgoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKSkuZ2V0TW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSkpIHsKLQkJCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVdfVEFHKTsKLQkJfQotCQllbHNlIHsKLQkJCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVcpOwotCQl9Ci0KLQkJc3VwZXIuYWRkRW1wdHlEb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUENEQVRBUHJvcG9zYWwoU3RyaW5nIG5vZGVOYW1lLCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnREb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnQ2xvc2VQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhNTFByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURSk7Ci0JfQotCi0JLyoqCi0JICogYWRkIHByb3Bvc2FscyBmb3IgdGFncyBpbiBhdHRyaWJ1dGUgdmFsdWVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURV9WQUxVRSk7Ci0KLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCi0JCS8vIGFkZCBKU1AgZXh0cmEgcHJvcG9zYWxzIGZyb20gSlNQQmVhbkluZm9Db250ZW50QXNzaXN0UHJvY2Vzc29yCi0JCS8vIEpTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3NvcgotCi0JCS8vIDIuMQotCQkvLyBnZXQgcmVzdWx0cyBmcm9tIEpTUFVzZUJlYW4gYW5kIEpTUFByb3BlcnR5IGhlcmUKLQkJLy8gKGxvb2sgdXAgcHJvY2Vzc29yIGluIGEgbWFwIGJhc2VkIG9uIG5vZGUgbmFtZSkKLQkJSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dHJhUHJvY2Vzc29yID0gKEpTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3NvcikgZk5hbWVUb1Byb2Nlc3Nvck1hcC5nZXQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJaWYgKGV4dHJhUHJvY2Vzc29yICE9IG51bGwgJiYgY29udGVudEFzc2lzdFJlcXVlc3QgIT0gbnVsbCkgewotCQkJZXh0cmFQcm9jZXNzb3IuYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQl9Ci0KLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJQ01Eb2N1bWVudCBkb2MgPSBtcS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlKTsKLQkJCS8vIHRoaXMgc2hvdWxkbid0IGhhdmUgdG8gaGF2ZSB0aGUgcHJlZml4IGNvZGVkIGluCi0JCQlpZiAoZG9jIGluc3RhbmNlb2YgSlNQQ01Eb2N1bWVudCB8fCBkb2MgaW5zdGFuY2VvZiBDTU5vZGVXcmFwcGVyIHx8IG5vZGUuZ2V0Tm9kZU5hbWUoKS5zdGFydHNXaXRoKCJqc3A6IikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQgaGF2ZSBhIHZhbHVlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb3BlbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IG9wZW5SZWdpb25zID0gb3Blbi5nZXRSZWdpb25zKCk7Ci0JCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCWlmIChpIDwgMCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVOYW1lID0gb3Blbi5nZXRUZXh0KG5hbWVSZWdpb24pOwotCQlTdHJpbmcgY3VycmVudFZhbHVlID0gbnVsbDsKLQkJaWYgKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkKLQkJCWN1cnJlbnRWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKTsKLQotCQkvLyBvbiBhbiBlbXB0eSB2YWx1ZSwgYWRkIGFsbCB0aGUgSlNQIGFuZCB0YWdsaWIgdGFncwotCQlpZiAoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyAmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpID09IDApIHx8IChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSAmJiAoY3VycmVudFZhbHVlID09IG51bGwgfHwgY3VycmVudFZhbHVlLmxlbmd0aCgpID09IDApKSkgewotCQkJTGlzdCByZWplY3RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFRMRVQpOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRFQ0xBUkFUSU9OKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1BBR0UpOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRVRQUk9QRVJUWSk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9SV0FSRCk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUExVR0lOKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GQUxMQkFDSyk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKTsKLQotCQkJTGlzdCBhZGRpdGlvbmFsRWxlbWVudHMgPSBnZXRBZGRpdGlvbmFsQ2hpbGRyZW4obmV3IEFycmF5TGlzdCgpLCBub2RlLCAtMSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgYWRkaXRpb25hbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGFkZGl0aW9uYWxFbGVtZW50cy5nZXQoaSk7Ci0JCQkJaWYgKHJlamVjdEVsZW1lbnRzLmNvbnRhaW5zKGVkLmdldE5vZGVOYW1lKCkpKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHJpbmcgdGFnbmFtZSA9IGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRSZXF1aXJlZE5hbWUobm9kZSwgZWQpOwotCQkJCVN0cmluZ0J1ZmZlciBjb250ZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2VuZXJhdGVUYWcobm9kZSwgZWQsIGNvbnRlbnRzKTsKLQkJCQljb250ZW50cy5hcHBlbmQoJyInKTsKLQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGNvbnRlbnRzLnRvU3RyaW5nKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBjb250ZW50cy5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIHRhZ25hbWUsIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0pTUF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCX0KLQkJfQotCi0JCWVsc2UgaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQl0cnkgewotCQkJCS8vIENyZWF0ZSBhIG5ldyBtb2RlbCBmb3IgQ29udGVudCBBc3Npc3QgdG8gb3BlcmF0ZSBvbi4gVGhpcwotCQkJCS8vIHdpbGwgc2ltdWxhdGUKLQkJCQkvLyBhIGZ1bGwgRG9jdW1lbnQgYW5kIHRoZW4gYWRqdXN0IHRoZSBvZmZzZXQgbnVtYmVycyBpbiB0aGUKLQkJCQkvLyBsaXN0IG9mIHJlc3VsdHMuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBpbnRlcm5hbE1vZGVsID0gbnVsbDsKLQkJCQlJTW9kZWxNYW5hZ2VyIG1tYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJCQlpbnRlcm5hbE1vZGVsID0gbW1hbmFnZXIuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSBudWxsOwotCQkJCUlET01Nb2RlbCB4bWxPdXRlck1vZGVsID0gbnVsbDsKLQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJeG1sTm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQkJCQl4bWxPdXRlck1vZGVsID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCQlpbnRlcm5hbE1vZGVsLnNldFJlc29sdmVyKHhtbE91dGVyTW9kZWwuZ2V0UmVzb2x2ZXIoKSk7Ci0JCQkJCWludGVybmFsTW9kZWwuc2V0QmFzZUxvY2F0aW9uKHhtbE91dGVyTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCX0KLQkJCQlTdHJpbmcgY29udGVudHMgPSBTdHJpbmdVdGlscy5zdHJpcChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRUZXh0KCkpOwotCQkJCWlmICh4bWxOb2RlICE9IG51bGwgJiYgY29udGVudHMgIT0gbnVsbCkgewotCQkJCQlpbnQgYWRkaXRpb25hbFNoaWZ0cyA9IDA7Ci0JCQkJCS8vIEJlIHN1cmUgdGhhdCBjdXN0b20gdGFncyBmcm9tIHRhZ2xpYnMgYWxzbyBzaG93IHVwCi0JCQkJCS8vIGJ5Ci0JCQkJCS8vIGFkZGluZyB0YWdsaWIgZGVjbGFyYXRpb25zIHRvIHRoZSBpbnRlcm5hbCBtb2RlbC4KLQkJCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcih4bWxPdXRlck1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IHRyYWNrZXJzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2Vycyhjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JCQkJCQlpZiAodHJhY2tlcnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaSA9IDA7IGkgPCB0cmFja2Vycy5zaXplKCk7IGkrKykgewotCQkJCQkJCQlDTURvY3VtZW50VHJhY2tlciB0cmFja2VyID0gKENNRG9jdW1lbnRUcmFja2VyKSB0cmFja2Vycy5nZXQoaSk7Ci0JCQkJCQkJCVN0cmluZyBkZWNsYXJhdGlvbiA9IHRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCQkJCQkJCQlpZiAoZGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJY29udGVudHMgPSBkZWNsYXJhdGlvbiArIGNvbnRlbnRzOwotCQkJCQkJCQkJYWRkaXRpb25hbFNoaWZ0cyArPSBkZWNsYXJhdGlvbi5sZW5ndGgoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBBbHNvIGNvcHkgYW55IGpzcDp1c2VCZWFuIHRhZ3Mgc28gdGhhdAotCQkJCQkvLyBqc3A6W2dzXWV0UHJvcGVydHkgd2lsbCBmdW5jdGlvbgotCQkJCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCQkJZG9jID0gKERvY3VtZW50KSBub2RlOwotCQkJCQllbHNlCi0JCQkJCQlkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQkJTm9kZUxpc3QgdXNlQmVhbnMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTik7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgdXNlQmVhbnMuZ2V0TGVuZ3RoKCk7IGsrKykgewotCQkJCQkJSURPTU5vZGUgdXNlQmVhbiA9IChJRE9NTm9kZSkgdXNlQmVhbnMuaXRlbShrKTsKLQkJCQkJCWlmICh1c2VCZWFuLmdldFN0YXJ0T2Zmc2V0KCkgPCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSkgewotCQkJCQkJCVN0cmluZ0J1ZmZlciB1c2VCZWFuVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoIjxqc3A6dXNlQmVhbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB1c2VCZWFuLmdldEF0dHJpYnV0ZXMoKS5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJCUF0dHIgYXR0ciA9IChBdHRyKSB1c2VCZWFuLmdldEF0dHJpYnV0ZXMoKS5pdGVtKGopOwotCQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoJyAnKTsKLQkJCQkJCQkJdXNlQmVhblRleHQuYXBwZW5kKGF0dHIuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJdXNlQmVhblRleHQuYXBwZW5kKCI9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJdXNlQmVhblRleHQuYXBwZW5kKCciJyk7Ci0JCQkJCQkJfQotCQkJCQkJCXVzZUJlYW5UZXh0LmFwcGVuZCgiLz4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWFkZGl0aW9uYWxTaGlmdHMgKz0gdXNlQmVhblRleHQubGVuZ3RoKCk7Ci0JCQkJCQkJY29udGVudHMgPSB1c2VCZWFuVGV4dC50b1N0cmluZygpICsgY29udGVudHM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaW50ZXJuYWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXQoY29udGVudHMpOwotCQkJCQlpbnQgaW50ZXJuYWxPZmZzZXQgPSAwOwotCQkJCQlib29sZWFuIHF1b3RlZCA9IGZhbHNlOwotCQkJCQkvLyBpZiBxdW90ZWQsIHVzZSBwb3NpdGlvbiBpbnNpZGUgYW5kIHNoaWZ0IGJ5IG9uZQotCQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDAgJiYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkuY2hhckF0KDApID09ICdcJycgfHwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5jaGFyQXQoMCkgPT0gJyInKSkgewotCQkJCQkJaW50ZXJuYWxPZmZzZXQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpIC0gMSArIGFkZGl0aW9uYWxTaGlmdHM7Ci0JCQkJCQlxdW90ZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCS8vIGlmIHVucXVvdGVkLCB1c2UgcG9zaXRpb24gaW5zaWRlCi0JCQkJCWVsc2UgaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkuY2hhckF0KDApID09ICc8JykKLQkJCQkJCWludGVybmFsT2Zmc2V0ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSArIGFkZGl0aW9uYWxTaGlmdHM7Ci0JCQkJCWVsc2UKLQkJCQkJCWludGVybmFsT2Zmc2V0ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgLSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRTdGFydE9mZnNldCgpICsgYWRkaXRpb25hbFNoaWZ0czsKLQkJCQkJZGVwdGhDb3VudCsrOwotCQkJCQlJbmRleGVkUmVnaW9uIGludGVybmFsTm9kZSA9IG51bGw7Ci0JCQkJCWludCB0bXBPZmZzZXQgPSBpbnRlcm5hbE9mZnNldDsKLQkJCQkJd2hpbGUgKGludGVybmFsTm9kZSA9PSBudWxsICYmIHRtcE9mZnNldCA+PSAwKQotCQkJCQkJaW50ZXJuYWxOb2RlID0gaW50ZXJuYWxNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRtcE9mZnNldC0tKTsKLQotCQkJCQlpZiAoaW50ZXJuYWxNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBzZXQgdXAgdGhlIGludGVybmFsIG1vZGVsCi0JCQkJCQlpZiAoaW50ZXJuYWxNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5Rm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKSA9PSBudWxsKSB7Ci0JCQkJCQkJaW50ZXJuYWxNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKS5hZGRGYWN0b3J5KG5ldyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBvdXRlckVtYmVkZGVkVHlwZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIHhtbE91dGVyTW9kZWwuZ2V0RG9jdW1lbnQoKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIGludGVybmFsRW1iZWRkZWRUeXBlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSAoKE5vZGUpIGludGVybmFsTm9kZSkuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWludGVybmFsRW1iZWRkZWRUeXBlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUob3V0ZXJFbWJlZGRlZFR5cGVBZGFwdGVyLmdldEVtYmVkZGVkVHlwZSgpKTsKLQkJCQkJfQotCi0JCQkJCUFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgYWRhcHRlclJlZ2lzdHJ5ID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCQkJSXRlcmF0b3IgYWRhcHRlckxpc3QgPSBhZGFwdGVyUmVnaXN0cnkuZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCQkJCQkvLyBBbmQgYWxsIHRob3NlIGFwcHJvcHJpYXRlIGZvciB0aGlzIHBhcnRpY3VsYXIgdHlwZQotCQkJCQkvLyBvZiBjb250ZW50Ci0JCQkJCXdoaWxlIChhZGFwdGVyTGlzdC5oYXNOZXh0KCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJQWRhcHRlckZhY3RvcnlQcm92aWRlciBwcm92aWRlciA9IChBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSBhZGFwdGVyTGlzdC5uZXh0KCk7Ci0JCQkJCQkJaWYgKHByb3ZpZGVyLmlzRm9yKGludGVybmFsTW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCkpKSB7Ci0JCQkJCQkJCXByb3ZpZGVyLmFkZEFkYXB0ZXJGYWN0b3JpZXMoaW50ZXJuYWxNb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8qKgotCQkJCQkgKiB0aGUgaW50ZXJuYWwgYWRhcHRlciBkb2VzIGFsbCB0aGUgcmVhbCB3b3JrIG9mIHVzaW5nCi0JCQkJCSAqIHRoZSBKU1AgY29udGVudCBtb2RlbCB0byBmb3JtIHByb3Bvc2FscwotCQkJCQkgKi8KLQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdHMgPSBudWxsOwotCQkJCQlkZXB0aENvdW50LS07Ci0JCQkJCWlmIChyZXN1bHRzICE9IG51bGwpIHsKLQkJCQkJCWZvciAoaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSwgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldFJlcGxhY2VtZW50T2Zmc2V0KCkgLSBhZGRpdGlvbmFsU2hpZnRzICsgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0U3RhcnRPZmZzZXQoKSArIChxdW90ZWQgPyAxIDogMCksICgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0Q3Vyc29yUG9zaXRpb24oKSwgcmVzdWx0c1tpXS5nZXRJbWFnZSgpLCByZXN1bHRzW2ldLmdldERpc3BsYXlTdHJpbmcoKSwgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldENvbnRleHRJbmZvcm1hdGlvbigpLCAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpLCAocmVzdWx0c1tpXSBpbnN0YW5jZW9mIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpID8gKChJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRSZWxldmFuY2UoKSA6IElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFcnJvciBpbiBlbWJlZGRlZCBKU1AgQ29udGVudCBBc3Npc3QiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRBZGRpdGlvbmFsQ2hpbGRyZW4oTGlzdCBlbGVtZW50RGVjbHMsIE5vZGUgbm9kZSwgaW50IGNoaWxkSW5kZXgpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJLyoKLQkJCSAqIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbnRlbmRlZCBpbnNlcnRpb24gYXMgaXQgd2lsbCBnaXZlIHVzCi0JCQkgKiB0aGUgY29ycmVjdCBvZmZzZXQgZm9yIGNoZWNraW5nIHBvc2l0aW9uIGRlcGVuZGVudCBDTURvY3VtZW50cwotCQkJICovCi0JCQlpbnQgdGV4dEluc2VydGlvbk9mZnNldCA9IDA7Ci0JCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJaWYgKGNoaWxkcmVuLmdldExlbmd0aCgpID49IGNoaWxkSW5kZXggJiYgY2hpbGRJbmRleCA+PSAwKSB7Ci0JCQkJTm9kZSBub2RlQWxyZWFkeUF0SW5kZXggPSBjaGlsZHJlbi5pdGVtKGNoaWxkSW5kZXgpOwotCQkJCWlmIChub2RlQWxyZWFkeUF0SW5kZXggaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkJCQkJdGV4dEluc2VydGlvbk9mZnNldCA9ICgoSURPTU5vZGUpIG5vZGVBbHJlYWR5QXRJbmRleCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0ZXh0SW5zZXJ0aW9uT2Zmc2V0ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCVRMRENNRG9jdW1lbnRNYW5hZ2VyIG1nciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJTGlzdCBtb3JlQ01Eb2N1bWVudHMgPSBtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKHRleHRJbnNlcnRpb25PZmZzZXQpOwotCQkJCWlmIChtb3JlQ01Eb2N1bWVudHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1vcmVDTURvY3VtZW50cy5zaXplKCk7IGkrKykgewotCQkJCQkJQ01Eb2N1bWVudCBkb2MgPSAoQ01Eb2N1bWVudCkgbW9yZUNNRG9jdW1lbnRzLmdldChpKTsKLQkJCQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gZG9jLmdldEVsZW1lbnRzKCk7Ci0JCQkJCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuaXRlbShqKTsKLQkJCQkJCQkJZWxlbWVudERlY2xzLmFkZChlZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZXQgcG9zaXRpb24gZGVwZW5kZW50IENNRG9jdW1lbnRzIGFuZCBpbnNlcnQgdGhlaXIgdGFncyBhcwotCQkJLy8gcHJvcG9zYWxzCi0KLQkJCU1vZGVsUXVlcnlBZGFwdGVyIG1xQWRhcHRlciA9IG51bGw7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQltcUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSURPTU5vZGUpIG5vZGUpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJZWxzZQotCQkJCW1xQWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgKChJRE9NTm9kZSkgbm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCi0JCQlpZiAobXFBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlDTURvY3VtZW50IGRvYyA9IG1xQWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0JCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJCUNNRG9jdW1lbnQgamNtZG9jID0gZ2V0RGVmYXVsdEpTUENNRG9jdW1lbnQoKElET01Ob2RlKSBub2RlKTsKLQkJCQkJQ01OYW1lZE5vZGVNYXAganNwZWxlbWVudHMgPSBqY21kb2MuZ2V0RWxlbWVudHMoKTsKLQotCQkJCQkvKgotCQkJCQkgKiBGb3IgYSBidWlsdC1pbiBKU1AgYWN0aW9uIHRoZSBjb250ZW50IG1vZGVsIGlzIHByb3Blcmx5Ci0JCQkJCSAqIHNldCB1cCwgc28gZG9uJ3QganVzdCBibGluZGx5IGFkZCB0aGUgcmVzdC0tdW5sZXNzIHRoaXMKLQkJCQkJICogd2lsbCBiZSBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgZG9jdW1lbnQKLQkJCQkJICovCi0JCQkJCWlmIChqc3BlbGVtZW50cyAhPSBudWxsICYmICghKGRvYyBpbnN0YW5jZW9mIEpTUENNRG9jdW1lbnQpIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQkJCQlMaXN0IHJlamVjdEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGRvY3VtZW50IGlzIGluIFhNTCBmb3JtCi0JCQkJCQlEb2N1bWVudCBkb21Eb2MgPSBudWxsOwotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQkJZG9tRG9jID0gKERvY3VtZW50KSBub2RlOwotCQkJCQkJZWxzZQotCQkJCQkJCWRvbURvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0JCQkJCQkvLyBTaG93IFhNTCB0YWcgZm9ybXMgb2YgSlNQIG1hcmtlcnMgaWYganNwOnJvb3QgaXMKLQkJCQkJCS8vIHRoZSBkb2N1bWVudCBlbGVtZW50IE9SIGl0J3MgSFRNTCBidXQKLQkJCQkJCS8vIGlzbid0IHJlYWxseSBpbiB0aGUgdGV4dC4KLQkJCQkJCS8vIElmIHRoZSBkb2N1bWVudCBpc24ndCBzdHJpY3RseSBYTUwsIHB1bGwgb3V0IHRoZQotCQkJCQkJLy8gWE1MIHRhZyBmb3JtcyBpdCBpcyB4bWwgZm9ybWF0Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVUKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5FWFBSRVNTSU9OKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUNMQVJBVElPTik7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX0lOQ0xVREUpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfQVRUUklCVVRFKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVkFSSUFCTEUpOwotCQkJCQkJaWYgKGlzWE1MRm9ybWF0KGRvbURvYykpIHsKLQkJCQkJCQkvLyBqc3AgYWN0aW9ucwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GQUxMQkFDSyk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5DTFVERSk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUldBUkQpOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QTFVHSU4pOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GQUxMQkFDSyk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKTsKLQkJCQkJCX0KLQotCi0JCQkJCQkvLyBkb24ndCBzaG93IGpzcDpyb290IGlmIGEgZG9jdW1lbnQgZWxlbWVudCBhbHJlYWR5Ci0JCQkJCQkvLyBleGlzdHMKLQkJCQkJCUVsZW1lbnQgZG9jRWxlbWVudCA9IGRvbURvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQkJCWlmIChkb2NFbGVtZW50ICE9IG51bGwgJiYgKChkb2NFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKCJqc3A6cm9vdCIpKSB8fCAoKCgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCB8fCAoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSkpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QpOwotCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGpzcGVsZW1lbnRzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikganNwZWxlbWVudHMuaXRlbShqKTsKLQkJCQkJCQlpZiAocmVqZWN0RWxlbWVudHMuY29udGFpbnMoZWQuZ2V0Tm9kZU5hbWUoKSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCWVsZW1lbnREZWNscy5hZGQoZWQpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gTm8gY20gZG9jdW1lbnQgKHN1Y2ggYXMgZm9yIHRoZSBEb2N1bWVudCAoYSBub24tRWxlbWVudCkgbm9kZSBpdHNlbGYpCi0JCQkJZWxzZSB7Ci0JCQkJCUNNTmFtZWROb2RlTWFwIGpzcEVsZW1lbnRzID0gZ2V0RGVmYXVsdEpTUENNRG9jdW1lbnQoKElET01Ob2RlKSBub2RlKS5nZXRFbGVtZW50cygpOwotCQkJCQlpbnQgbGVuZ3RoID0ganNwRWxlbWVudHMuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJCWVsZW1lbnREZWNscy5hZGQoanNwRWxlbWVudHMuaXRlbShpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnREZWNsczsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgSlNQIGZpbGVzIGFuZCBzZWdtZW50cywgdGhpcyBpcyBqdXN0IHRoZSBKU1AKLQkgKiAgICAgICAgIGRvY3VtZW50LCBidXQgd2hlbiBlZGl0aW5nIHRhZyBmaWxlcyBhbmQgdGhlaXIgZnJhZ21lbnRzLCBpdAotCSAqICAgICAgICAgc2hvdWxkIGJlIHRoZSB0YWcgZG9jdW1lbnQuCi0JICogCi0JICogSXQgbWF5IGFsc28gdmFyeSBiYXNlZCBvbiB0aGUgbW9kZWwgYmVpbmcgZWRpdGVkIGluIHRoZSBmdXR1cmUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBub24tZW1iZWRkZWQgQ01Eb2N1bWVudCBmb3IgdGhlIGRvY3VtZW50IGJlaW5nCi0JICogICAgICAgICBlZGl0ZWQuIAotCSAqLwotCUNNRG9jdW1lbnQgZ2V0RGVmYXVsdEpTUENNRG9jdW1lbnQoSURPTU5vZGUgbm9kZSkgewotCQkvLyBoYW5kbGUgdGFnIGZpbGVzIGhlcmUKLQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gbm9kZS5nZXRNb2RlbCgpLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCQlpZiAoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUFRBRy5lcXVhbHMoY29udGVudFR5cGUpKQotCQkJcmV0dXJuIEpTUENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLlRBRzIwX0RPQ19UWVBFKTsKLQotCQlDTURvY3VtZW50IGpjbWRvYyA9IG51bGw7Ci0JCVN0cmluZyBtb2RlbFBhdGggPSBub2RlLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmIChtb2RlbFBhdGggIT0gbnVsbCAmJiAhSU1vZGVsTWFuYWdlci5VTk1BTkFHRURfTU9ERUwuZXF1YWxzKG1vZGVsUGF0aCkpIHsKLQkJCWZsb2F0IHZlcnNpb24gPSBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRKU1BWZXJzaW9uKG5ldyBQYXRoKG1vZGVsUGF0aCkpOwotCQkJamNtZG9jID0gSlNQQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudCh2ZXJzaW9uKTsKLQkJfQotCQlpZiAoamNtZG9jID09IG51bGwpIHsKLQkJCWpjbWRvYyA9IEpTUENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoKTsKLQkJfQotCi0JCXJldHVybiBqY21kb2M7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KEVsZW1lbnQgcGFyZW50LCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBhZGRpdGlvbmFsRWxlbWVudHMgPSBnZXRBZGRpdGlvbmFsQ2hpbGRyZW4obmV3IEFycmF5TGlzdCgpLCBwYXJlbnQsIGluZGV4KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZGVsUXVlcnlBY3Rpb24gaW5zZXJ0QWN0aW9uID0gbmV3IE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRkaXRpb25hbEVsZW1lbnRzLmdldChpKSwgTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIDAsIHBhcmVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCksIG51bGwpOwotCQkJbGlzdC5hZGQoaW5zZXJ0QWN0aW9uKTsKLQkJfQotCi0JCS8vIGFkZCBhbGxvd2VkIGNoaWxkcmVuIG9mIGltcGxpY2l0IHRhZ3MgdGhhdCBkb24ndCBhbHJlYWR5IGV4aXN0Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJTGlzdCBjaGlsZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWNoaWxkTmFtZXMuYWRkKGNoaWxkLmdldE5vZGVOYW1lKCkudG9Mb3dlckNhc2UoKSk7Ci0JCQl9Ci0JCX0KLQkJTGlzdCBhbGxBY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJYWxsQWN0aW9ucy5hZGQoYWN0aW9uKTsKLQkJCWlmIChhY3Rpb24uZ2V0Q01Ob2RlKCkgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBhY3Rpb24uZ2V0Q01Ob2RlKCk7Ci0JCQkJU3RyaW5nIG9tbWlzc2lvbiA9IChTdHJpbmcpIGVkLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJCQlpZiAoIWNoaWxkTmFtZXMuY29udGFpbnMoZWQuZ2V0Tm9kZU5hbWUoKS50b0xvd2VyQ2FzZSgpKSAmJiAoKG9tbWlzc2lvbiAhPSBudWxsKSAmJiAob21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0JPVEgpKSkpIHsKLQkJCQkJTGlzdCBpbXBsaWNpdFZhbGlkQWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudCwgZWQsIDAsIE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUywgTW9kZWxRdWVyeS5WQUxJRElUWV9OT05FLCBpbXBsaWNpdFZhbGlkQWN0aW9ucyk7Ci0JCQkJCWlmIChpbXBsaWNpdFZhbGlkQWN0aW9ucyAhPSBudWxsKSB7Ci0JCQkJCQlJdGVyYXRvciBpbXBsaWNpdFZhbGlkQWN0aW9uc0l0ZXJhdG9yID0gaW1wbGljaXRWYWxpZEFjdGlvbnMuaXRlcmF0b3IoKTsKLQkJCQkJCXdoaWxlIChpbXBsaWNpdFZhbGlkQWN0aW9uc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCU1vZGVsUXVlcnlBY3Rpb24gaW5zZXJ0QWN0aW9uID0gbmV3IE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uKCgoTW9kZWxRdWVyeUFjdGlvbikgaW1wbGljaXRWYWxpZEFjdGlvbnNJdGVyYXRvci5uZXh0KCkpLmdldENNTm9kZSgpLCBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCwgMCwgcGFyZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSwgbnVsbCk7Ci0JCQkJCQkJYWxsQWN0aW9ucy5hZGQoaW5zZXJ0QWN0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWxsQWN0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVSb290Q2hpbGRyZW4oRG9jdW1lbnQgZG9jdW1lbnQsIGludCBjaGlsZEluZGV4KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCFpc1hNTEZvcm1hdChkb2N1bWVudCkpCi0JCQlnZXRBZGRpdGlvbmFsQ2hpbGRyZW4obGlzdCwgZG9jdW1lbnQsIGNoaWxkSW5kZXgpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJaWYgKGRlcHRoQ291bnQgPT0gMCkKLQkJCWZFcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgYWN0aW5nIGFzIGEgImNhdGNoIGFsbCIgZm9yIHB1bGxpbmcgdG9nZXRoZXIgY29udGVudAotCSAqIGFzc2lzdCBwcm9wb3NhbHMgZnJvbSBkaWZmZXJlbnQgUHJvY2Vzc29ycyB3aGVuIGRvY3VtZW50IHBhcnRpdGlvbmluZwotCSAqIGFsb25lIGNvdWxkbid0IGRldGVybWluZSBkZWZpbml0aXZlbHkgd2hhdCBjb250ZW50IGFzc2lzdCBzaG91bGQgc2hvdwotCSAqIHVwIGF0IHRoYXQgcGFydGljdWxhciBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJZlRlbXBsYXRlQ29udGV4dHMuY2xlYXIoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlmVmlld2VyID0gdmlld2VyOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10ganNwUmVzdWx0cyA9IEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGVtYmVkZGVkUmVzdWx0cyA9IEVNUFRZX1BST1BPU0FMX1NFVDsKLQotCQkvLyBjaGVjayB0aGUgYWN0dWFsIHBhcnRpdGlvbiB0eXBlCi0JCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gZ2V0UGFydGl0aW9uVHlwZSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHZpZXdlci5nZXREb2N1bWVudCgpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBBTk9USEVSIFdPUktBUk9VTkQgVU5USUwgUEFSVElUSU9OSU5HIFRBS0VTIENBUkUgT0YgVEhJUwotCQkvLyBjaGVjayBmb3IgeG1sLWpzcCB0YWdzLi4uCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUgJiYgZm4gIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwb3NzaWJsZVhNTEpTUCA9ICgoZm4uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpICYmIGZuLmdldFByZXZpb3VzKCkgIT0gbnVsbCkgPyBmbi5nZXRQcmV2aW91cygpIDogZm47Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHBvc3NpYmxlWE1MSlNQLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zLnNpemUoKSA+IDEpIHsKLQkJCQkvLyBjaGVjayBib3VuZHMgY2FzZXMKLQkJCQlJVGV4dFJlZ2lvbiB4bWxPcGVuT3JDbG9zZSA9IHJlZ2lvbnMuZ2V0KDApOwotCQkJCWlmICh4bWxPcGVuT3JDbG9zZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgZG9jdW1lbnRQb3NpdGlvbiA9PSBwb3NzaWJsZVhNTEpTUC5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCS8vIGRvIHJlZ3VsYXIganNwIGNvbnRlbnQgYXNzaXN0Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHhtbE9wZW5PckNsb3NlLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gJiYgZG9jdW1lbnRQb3NpdGlvbiA+IHBvc3NpYmxlWE1MSlNQLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJLy8gZG8gcmVndWxhciBqc3AgY29udGVudCBhc3Npc3QKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHBvc3NpYmxlIHhtbC1qc3AKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCQlTdHJpbmcgbmFtZSA9IHBvc3NpYmxlWE1MSlNQLmdldFRleHQobmFtZVJlZ2lvbik7Ci0JCQkJCWlmIChuYW1lLmVxdWFscygianNwOnNjcmlwdGxldCIpIHx8IG5hbWUuZXF1YWxzKCJqc3A6ZXhwcmVzc2lvbiIpIHx8IG5hbWUuZXF1YWxzKCJqc3A6ZGVjbGFyYXRpb24iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vICoqIFRISVMgSVMgQSBURU1QIEZJWCBVTlRJTCBQQVJUSVRJT05JTkcgVEFLRVMgQ0FSRSBPRiBUSElTLi4uCi0JCS8vIGNoZWNrIGZvciBYTUwtSlNQIGluIGEgPHNjcmlwdD4gcmVnaW9uCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQkvLyBmbiBzaG91bGQgYmUgYmxvY2sgdGV4dAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkZWNvZGVkU0RSZWdpb24gPSBkZWNvZGVTY3JpcHRCbG9jayhmbi5nZXRGdWxsVGV4dCgpKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZGVjb2RlZCA+ICIgKwotCQkJLy8gYmxvY2tPZlRleHQuc3Vic3RyaW5nKGRlY29kZWRTRFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLAotCQkJLy8gZGVjb2RlZFNEUmVnaW9uLmdldEVuZE9mZnNldCgpKSk7Ci0JCQlpZiAoZGVjb2RlZFNEUmVnaW9uICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkciA9IGRlY29kZWRTRFJlZ2lvbjsKLQkJCQl3aGlsZSAoc2RyICE9IG51bGwpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZHIgIiArIHNkci5nZXRUeXBlKCkpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNkciA+ICIgKwotCQkJCQkvLyBibG9ja09mVGV4dC5zdWJzdHJpbmcoc2RyLmdldFN0YXJ0T2Zmc2V0KCksCi0JCQkJCS8vIHNkci5nZXRFbmRPZmZzZXQoKSkpOwotCQkJCQlpZiAoc2RyLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRTdGFydE9mZnNldCgpICYmIGRvY3VtZW50UG9zaXRpb24gPD0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHNkci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRTdGFydE9mZnNldCgpICYmIGRvY3VtZW50UG9zaXRpb24gPCBmbi5nZXRTdGFydE9mZnNldCgpICsgc2RyLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQkJcmV0dXJuIEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRFbmRPZmZzZXQoKSAmJiBzZHIuZ2V0TmV4dCgpICE9IG51bGwgJiYgc2RyLmdldE5leHQoKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCQkJCQkvLyB0aGUgZW5kIG9mIGFuIG9wZW4gdGFnIDxzY3JpcHQ+Ci0JCQkJCQkJLy8gPGpzcDpzY3JpcHRsZXQ+fCBibGFoIDwvanNwOnNjcmlwdGxldD4KLQkJCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRTdGFydE9mZnNldCgpICYmIHNkci5nZXRQcmV2aW91cygpICE9IG51bGwgJiYgc2RyLmdldFByZXZpb3VzKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc2RyID0gc2RyLmdldE5leHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBjaGVjayBzcGVjaWFsIEpTUCBkZWxpbWl0ZXIgY2FzZXMKLQkJaWYgKGZuICE9IG51bGwgJiYgcGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVIpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm5EZWxpbSA9IGZuOwotCi0JCQkvLyBpZiBpdCdzIGEgbmVzdGVkIEpTUCByZWdpb24sIG5lZWQgdG8gZ2V0IHRoZSBjb3JyZWN0Ci0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCS8vIG5vdCBzdXJlIHdoeSB0aGlzIGNoZWNrIHdhcyB0aGVyZS4uLgotCQkJLy8gaWYgKGZuRGVsaW0uZ2V0VHlwZSgpID09IFhNTFJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJSXRlcmF0b3IgYmxvY2tSZWdpb25zID0gZm5EZWxpbS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHRlbXAgPSBudWxsOwotCQkJSVRleHRSZWdpb25Db250YWluZXIgdHJjOwotCQkJd2hpbGUgKGJsb2NrUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQl0ZW1wID0gKElUZXh0UmVnaW9uKSBibG9ja1JlZ2lvbnMubmV4dCgpOwotCQkJCS8vIHdlIGhpdCBhIG5lc3RlZAotCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJdHJjID0gKElUZXh0UmVnaW9uQ29udGFpbmVyKSB0ZW1wOwotCQkJCQkvLyBpdCdzIGluIHRoaXMgcmVnaW9uCi0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IHRyYy5nZXRTdGFydE9mZnNldCgpICYmIGRvY3VtZW50UG9zaXRpb24gPCB0cmMuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCUl0ZXJhdG9yIG5lc3RlZEpTUFJlZ2lvbnMgPSB0cmMuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAobmVzdGVkSlNQUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCQl0ZW1wID0gKElUZXh0UmVnaW9uKSBuZXN0ZWRKU1BSZWdpb25zLm5leHQoKTsKLQkJCQkJCQlpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUE9wZW5EZWxpbWl0ZXIodGVtcC5nZXRUeXBlKCkpICYmIGRvY3VtZW50UG9zaXRpb24gPT0gdHJjLmdldFN0YXJ0T2Zmc2V0KHRlbXApKSB7Ci0JCQkJCQkJCS8vIEhUTUwgY29udGVudCBhc3Npc3QKLQkJCQkJCQkJLy8gd2UgYWN0dWFsbHkgd2FudCBjb250ZW50IGFzc2lzdCBmb3IgdGhlCi0JCQkJCQkJCS8vIHByZXZpb3VzIHR5cGUgb2YgcmVnaW9uLAotCQkJCQkJCQkvLyB3ZWxsIGdldCB0aG9zZSBwcm9wb3NhbHMgZnJvbSB0aGUgZW1iZWRkZWQKLQkJCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IDApIHsKLQkJCQkJCQkJCXBhcnRpdGlvblR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQQ2xvc2VEZWxpbWl0ZXIodGVtcC5nZXRUeXBlKCkpICYmIGRvY3VtZW50UG9zaXRpb24gPT0gdHJjLmdldFN0YXJ0T2Zmc2V0KHRlbXApKSB7Ci0JCQkJCQkJCS8vIEpTUCBjb250ZW50IGFzc2lzdAotCQkJCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gfQotCQkJfQotCi0JCQkvLyB0YWtlIGNhcmUgb2YgWE1MLUpTUCBkZWxpbXRlciBjYXNlcwotCQkJaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNYTUxKU1BEZWxpbWl0ZXIoZm5EZWxpbSkpIHsKLQkJCQkvLyBzaW5jZSBpdCdzIGEgZGVsaW1pdGVyLCB3ZSBrbm93IGl0J3MgYSBJVGV4dFJlZ2lvbkNvbnRhaW5lcgotCQkJCUlUZXh0UmVnaW9uIGZpcnN0UmVnaW9uID0gZm5EZWxpbS5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQkJCWlmIChmbkRlbGltLmdldFN0YXJ0T2Zmc2V0KCkgPT0gZG9jdW1lbnRQb3NpdGlvbiAmJiAoZmlyc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSkgewotCQkJCQkvLyB8PGpzcDpzY3JpcHRsZXQ+IDwvanNwOnNjcmlwdGxldD4KLQkJCQkJLy8gKHBhKSBjb21tZW50ZWQgb3V0IHNvIHRoYXQgd2UgZ2V0IHJlZ3VsYXIgYmVoYXZpb3IgSlNQCi0JCQkJCS8vIG1hY3JvcyBldGMuLi4KLQkJCQkJLy8gcmV0dXJuIGdldEhUTUxDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwKLQkJCQkJLy8gZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZuRGVsaW0uZ2V0U3RhcnRPZmZzZXQoKSA9PSBkb2N1bWVudFBvc2l0aW9uICYmIChmaXJzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSkgewotCQkJCQkvLyA8anNwOnNjcmlwdGxldD4gfDwvanNwOnNjcmlwdGxldD4KLQkJCQkJLy8gY2hlY2sgcHJldmlvdXMgcGFydGl0aW9uIHR5cGUgdG8gc2VlIGlmIGl0J3MgSkFWQVNDUklQVAotCQkJCQkvLyBpZiBpdCBpcywgd2UncmUganVzdCBnb25uYSBsZXQgdGhlIGVtYmVkZGVkIEpBVkFTQ1JJUFQKLQkJCQkJLy8gYWRhcHRlciBnZXQgdGhlIHByb3Bvc2FscwotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IDApIHsKLQkJCQkJCVN0cmluZyBjaGVja1R5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQlpZiAoY2hlY2tUeXBlICE9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQpIHsgLy8gdGhpcwotCQkJCQkJCS8vIGNoZWNrCi0JCQkJCQkJLy8gaXMKLQkJCQkJCQkvLyBmYWlsaW5nCi0JCQkJCQkJLy8gZm9yCi0JCQkJCQkJLy8gWE1MLUpTUAotCQkJCQkJCS8vIChyZWdpb24KLQkJCQkJCQkvLyBpcwotCQkJCQkJCS8vIG5vdAotCQkJCQkJCS8vIGphdmFzY3JpcHQuLi4pCi0JCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCQlwYXJ0aXRpb25UeXBlID0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgoZmlyc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSAmJiBkb2N1bWVudFBvc2l0aW9uID49IGZuRGVsaW0uZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJLy8gYW55dGhpbmcgZWxzZSBpbmJldHdlZW4KLQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUERlbGltaXRlcihmbkRlbGltKSkgewotCQkJCS8vIHRoZSBkZWxpbWl0ZXIgPCUsIDwlPSwgPCUhLCAuLi4KLQkJCQlpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUENsb3NlRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuRGVsaW0uZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkJLy8gY2hlY2sgcHJldmlvdXMgcGFydGl0aW9uIHR5cGUgdG8gc2VlIGlmIGl0J3MKLQkJCQkJCS8vIEpBVkFTQ1JJUFQKLQkJCQkJCS8vIGlmIGl0IGlzLCB3ZSdyZSBqdXN0IGdvbm5hIGxldCB0aGUgZW1iZWRkZWQKLQkJCQkJCS8vIEpBVkFTQ1JJUFQgYWRhcHRlciBnZXQgdGhlIHByb3Bvc2FscwotCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiAwKSB7Ci0JCQkJCQkJU3RyaW5nIGNoZWNrVHlwZSA9IGdldFBhcnRpdGlvblR5cGUoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24gLSAxKTsKLQkJCQkJCQlpZiAoY2hlY2tUeXBlICE9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQpIHsKLQkJCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJCXBhcnRpdGlvblR5cGUgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BPcGVuRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJCS8vIGlmIGl0J3MgdGhlIGZpcnN0IHBvc2l0aW9uIG9mIG9wZW4gZGVsaW1pdGVyCi0JCQkJCS8vIHVzZSBlbWJlZGRlZCBIVE1MIHJlc3VsdHMKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm5EZWxpbS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCQllbWJlZGRlZFJlc3VsdHMgPSBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZm5EZWxpbS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJLy8gaXQncyBhdCB0aGUgRU9GIDwlfAotCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgSlNQIHJlZ2lvbiBpbnNpZGUgb2YgQ0RBVEEgdy8gbm8gcmVnaW9uCi0JCS8vIDwhW0NEQVRBWyA8JXwlPiBdXT4KLQkJLy8gb3IgYSBjb21tZW50IHJlZ2lvbgotCQkvLyA8IS0tIDwlIHwlPiAtLT4KLQkJaWYgKGZuICE9IG51bGwgJiYgKGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpKSB7Ci0JCQlpZiAoZm4gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCU9iamVjdFtdIGNkYXRhUmVnaW9ucyA9IGZuLmdldFJlZ2lvbnMoKS50b0FycmF5KCk7Ci0JCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQkJSVRleHRSZWdpb24ganNwUmVnaW9uID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNkYXRhUmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlyID0gKElUZXh0UmVnaW9uKSBjZGF0YVJlZ2lvbnNbaV07Ci0JCQkJCWlmIChyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCS8vIENEQVRBIGVtYmVkZGVkIGNvbnRhaW5lciwgb3IgY29tbWVudCBjb250YWluZXIKLQkJCQkJCU9iamVjdFtdIGpzcFJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByKS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBqc3BSZWdpb25zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJanNwUmVnaW9uID0gKElUZXh0UmVnaW9uKSBqc3BSZWdpb25zW2pdOwotCQkJCQkJCWlmIChqc3BSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJCQkJCQlpZiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoanNwUmVnaW9uKSA9PSBkb2N1bWVudFBvc2l0aW9uKQotCQkJCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBpdCdzIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgaWYgc28sIGRvbid0IGFkZCBDREFUQQotCQkvLyBwcm9wb3NhbAotCQlJVGV4dFJlZ2lvbiBhdHRyQ29udGFpbmVyID0gKGZuICE9IG51bGwpID8gZm4uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbikgOiBudWxsOwotCQlpZiAoYXR0ckNvbnRhaW5lciAhPSBudWxsICYmIGF0dHJDb250YWluZXIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJaWYgKGF0dHJDb250YWluZXIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkvLyB0ZXN0IGxvY2F0aW9uIG9mIHRoZSBjdXJzb3IKLQkJCQkvLyByZXR1cm4gbnVsbCBpZiBpdCdzIGluIHRoZSBtaWRkbGUgb2YgYW4gb3Blbi9jbG9zZQotCQkJCS8vIGRlbGltZXRlcgotCQkJCUl0ZXJhdG9yIGF0dHJSZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgYXR0ckNvbnRhaW5lcikuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJSVRleHRSZWdpb24gdGVzdFJlZ2lvbiA9IG51bGw7Ci0JCQkJd2hpbGUgKGF0dHJSZWdpb25zLmhhc05leHQoKSkgewotCQkJCQl0ZXN0UmVnaW9uID0gKElUZXh0UmVnaW9uKSBhdHRyUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCS8vIG5lZWQgdG8gY2hlY2sgZm9yIG90aGVyIHZhbGlkIGF0dHJpYnV0ZSByZWdpb25zCi0JCQkJCWlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQT3BlbkRlbGltaXRlcih0ZXN0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCWlmICghKCgoSVRleHRSZWdpb25Db250YWluZXIpIGF0dHJDb250YWluZXIpLmdldEVuZE9mZnNldCh0ZXN0UmVnaW9uKSA8PSBkb2N1bWVudFBvc2l0aW9uKSkKLQkJCQkJCQlyZXR1cm4gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BDbG9zZURlbGltaXRlcih0ZXN0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCWlmICghKCgoSVRleHRSZWdpb25Db250YWluZXIpIGF0dHJDb250YWluZXIpLmdldFN0YXJ0T2Zmc2V0KHRlc3RSZWdpb24pID49IGRvY3VtZW50UG9zaXRpb24pKQotCQkJCQkJCXJldHVybiBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gVE9ETzogaGFuZGxlIG5vbi1KYXZhIGNvZGUgc3VjaCBhcyBuZXN0ZWQgdGFncwotCQkJCWlmICh0ZXN0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpKQotCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlyZXR1cm4gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQkJfQotCQl9Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLmdldChwYXJ0aXRpb25UeXBlKTsKLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJZW1iZWRkZWRSZXN1bHRzID0gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJLy8gZ2V0IGJlYW4gbWV0aG9kcywgb2JqZWN0cywgYW5kIGNvbnN0YW50cyBpZiB0aGVyZSBhcmUgYW55Li4uCi0JCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBiZWFuUmVzdWx0cyA9IGdldEpTUEphdmFCZWFuUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJaWYgKGJlYW5SZXN1bHRzICE9IG51bGwgJiYgYmVhblJlc3VsdHMubGVuZ3RoID4gMCkgewotCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYWRkZWQgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtiZWFuUmVzdWx0cy5sZW5ndGggKyBlbWJlZGRlZFJlc3VsdHMubGVuZ3RoXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShiZWFuUmVzdWx0cywgMCwgYWRkZWQsIDAsIGJlYW5SZXN1bHRzLmxlbmd0aCk7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZW1iZWRkZWRSZXN1bHRzLCAwLCBhZGRlZCwgYmVhblJlc3VsdHMubGVuZ3RoLCBlbWJlZGRlZFJlc3VsdHMubGVuZ3RoKTsKLQkJCQkJZW1iZWRkZWRSZXN1bHRzID0gYWRkZWQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gdGhlIHBhcnRpdGlvbiB0eXBlIGlzIHByb2JhYmx5IG5vdCBtYXBwZWQKLQkJfQotCi0JCS8vIGZpeCBmb3I6Ci0JCS8vIEhUTUwgY29udGVudCBhc3Npc3QgZ2l2ZSBKU1AgdGFncyBpbiBiZXR3ZWVuIGVtcHR5IHNjcmlwdCB0YWdzCi0JCWlmICghKChnZXRKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSAhPSBudWxsICYmIGdldEpTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpLmdldENsYXNzKCkuaXNJbnN0YW5jZShwKSkgfHwgcCBpbnN0YW5jZW9mIENTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IpKSB7Ci0JCQlmVGVtcGxhdGVDb250ZXh0cy5jbGVhcigpOwotCQkJanNwUmVzdWx0cyA9IHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCX0KLQkJaWYgKHVzZUVtYmVkZGVkUmVzdWx0cykgewotCQkJaWYgKGVtYmVkZGVkUmVzdWx0cyAhPSBudWxsICYmIGVtYmVkZGVkUmVzdWx0cy5sZW5ndGggPiAwKSB7Ci0JCQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW1iZWRkZWRSZXN1bHRzLmxlbmd0aDsgaSsrKQotCQkJCQlyZXN1bHRzLmFkZChlbWJlZGRlZFJlc3VsdHNbaV0pOwotCQkJCWlmIChqc3BSZXN1bHRzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqc3BSZXN1bHRzLmxlbmd0aDsgaSsrKQotCQkJCQkJcmVzdWx0cy5hZGQoanNwUmVzdWx0c1tpXSk7Ci0JCQkJfQotCQkJCWpzcFJlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtyZXN1bHRzLnNpemUoKV07Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzLCBuZXcgUHJvcG9zYWxDb21wYXJhdG9yKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykKLQkJCQkJanNwUmVzdWx0c1tpXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzLmdldChpKTsKLQotCQkJfQotCQl9Ci0JCWlmIChqc3BSZXN1bHRzID09IG51bGwpCi0JCQlqc3BSZXN1bHRzID0gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQlzZXRFcnJvck1lc3NhZ2UoanNwUmVzdWx0cy5sZW5ndGggPT0gMCA/IFVOS05PV05fQ09OVEVYVCA6IG51bGwpOwotCi0JCS8vIGZpeCBmb3I6Ci0JCS8vIGNoZWNrIGZvciB8PCUtLSAtLSU+IGZpcnN0IHBvc2l0aW9uIG9mIGpzcCBjb21tZW50Ci0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT01NRU5UKSB7Ci0JCQlpZiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA9PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGh0bWxSZXN1bHRzID0gZ2V0SFRNTENvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlqc3BSZXN1bHRzID0gbWVyZ2UoanNwUmVzdWx0cywgaHRtbFJlc3VsdHMpOwotCQkJfQotCQl9Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2NjU2Ci0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpIHsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBpbXBvcnRQcm9wb3NhbHMgPSBnZXRJbXBvcnRQcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWlmIChpbXBvcnRQcm9wb3NhbHMubGVuZ3RoID4gMCkKLQkJCQlqc3BSZXN1bHRzID0gbWVyZ2UoanNwUmVzdWx0cywgaW1wb3J0UHJvcG9zYWxzKTsKLQkJfQotCQlyZXR1cm4ganNwUmVzdWx0czsKLQl9Ci0KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRJbXBvcnRQcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlMaXN0IGltcG9ydFByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocHJvcG9zYWxzW2ldIGluc3RhbmNlb2YgSlNQQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0KLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsIGltcG9ydFByb3Bvc2FsID0gYWRqdXN0SW1wb3J0UHJvcG9zYWwoKEpTUENvbXBsZXRpb25Qcm9wb3NhbCkgcHJvcG9zYWxzW2ldKTsKLQkJCQlpbXBvcnRQcm9wb3NhbHMuYWRkKGltcG9ydFByb3Bvc2FsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgaW1wb3J0UHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbaW1wb3J0UHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLQotCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsIGFkanVzdEltcG9ydFByb3Bvc2FsKEpTUENvbXBsZXRpb25Qcm9wb3NhbCBpbXBvcnRQcm9wb3NhbCkgewotCi0JCS8vIGp1c3QgbmVlZCB0byByZW1vdmUgdGhlICI7IgotCQkvLyBhbmQgYWRqdXN0IG9mZnNldHMgZm9yIHRoZSBjaGFuZ2UKLQkJU3RyaW5nIG5ld1JlcGxhY2UgPSBpbXBvcnRQcm9wb3NhbC5nZXRSZXBsYWNlbWVudFN0cmluZygpLnJlcGxhY2VBbGwoIjsiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbXBvcnRQcm9wb3NhbC5zZXRSZXBsYWNlbWVudFN0cmluZyhuZXdSZXBsYWNlKTsKLQotCQlTdHJpbmcgbmV3RGlzcGxheSA9IGltcG9ydFByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKS5yZXBsYWNlQWxsKCI7IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW1wb3J0UHJvcG9zYWwuc2V0RGlzcGxheVN0cmluZyhuZXdEaXNwbGF5KTsKLQotCQlpbnQgbmV3UmVwbGFjZW1lbnRMZW5ndGggPSBpbXBvcnRQcm9wb3NhbC5nZXRSZXBsYWNlbWVudExlbmd0aCgpIC0gMTsKLQkJaW1wb3J0UHJvcG9zYWwuc2V0UmVwbGFjZW1lbnRMZW5ndGgobmV3UmVwbGFjZW1lbnRMZW5ndGgpOwotCi0JCWludCBuZXdDdXJzb3JQb3NpdGlvbiA9IGltcG9ydFByb3Bvc2FsLmdldEN1cnNvclBvc2l0aW9uKCkgLSAxOwotCQlpbXBvcnRQcm9wb3NhbC5zZXRDdXJzb3JQb3NpdGlvbihuZXdDdXJzb3JQb3NpdGlvbik7Ci0KLQkJcmV0dXJuIGltcG9ydFByb3Bvc2FsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgMiBhcnJheXMgb2YgSUNvbXBsZXRpb25Qcm9wb3NhbHMgYW5kIHNvcnRzIHRoZW0gd2l0aCBhCi0JICogUHJvcG9zYWxDb21wYXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBqc3BSZXN1bHRzCi0JICogQHBhcmFtIGh0bWxSZXN1bHRzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG1lcmdlKElDb21wbGV0aW9uUHJvcG9zYWxbXSBqc3BSZXN1bHRzLCBJQ29tcGxldGlvblByb3Bvc2FsW10gaHRtbFJlc3VsdHMpIHsKLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGpzcHMgPSBBcnJheXMuYXNMaXN0KGpzcFJlc3VsdHMpOwotCQlMaXN0IGh0bWxzID0gQXJyYXlzLmFzTGlzdChodG1sUmVzdWx0cyk7Ci0KLQkJcmVzdWx0cy5hZGRBbGwoanNwcyk7Ci0JCXJlc3VsdHMuYWRkQWxsKGh0bWxzKTsKLQotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMsIG5ldyBQcm9wb3NhbENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSByZXN1bHRzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldEpTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJaWYgKGZKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZkpTQ29udGVudEFzc2lzdFByb2Nlc3NvciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MKCkuZ2V0Q29udGVudEFzc2lzdGFudChudWxsKS5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpOwotCQl9Ci0JCXJldHVybiBmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gSlNQSmF2YSBQcm9wb3NhbHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gYW55IGphdmEKLQkgKiBiZWFucyB0aGF0IGluIHNjb3BlIGF0IHRoZSBkb2N1bWVudFBvc2l0aW9uCi0JICogCi0JICogVE9ETyAocGEpIGFyZSB0YWdsaWIgdmFycyBnZXR0aW5nIGZpbHRlcmVkPwotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgQHBhcmFtIGRvY3VtZW50UG9zaXRpb24gQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsW10KLQkgKi8KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRKU1BKYXZhQmVhblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZWd1bGFySlNQUmVzdWx0cyA9IGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCVZlY3RvciBmaWx0ZXJlZFByb3Bvc2FscyA9IG5ldyBWZWN0b3IoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGZpbmFsUmVzdWx0cyA9IEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWd1bGFySlNQUmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCB0ZXN0ID0gcmVndWxhckpTUFJlc3VsdHNbaV07Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicHJvcG9zYWwgPiAiICsgdGVzdC5nZXREaXNwbGF5U3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbGV2YW5jZSA+ICIgKyAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgdGVzdCkuZ2V0UmVsZXZhbmNlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChpc1JlbGV2YW5jZUFsbG93ZWQoKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHRlc3QpLmdldFJlbGV2YW5jZSgpKSkgewotCQkJCWZpbHRlcmVkUHJvcG9zYWxzLmFkZCh0ZXN0KTsKLQkJCX0KLQkJfQotCQlpZiAoZmlsdGVyZWRQcm9wb3NhbHMuc2l6ZSgpID4gMCkgewotCQkJZmluYWxSZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbZmlsdGVyZWRQcm9wb3NhbHMuc2l6ZSgpXTsKLQkJCUl0ZXJhdG9yIGl0ID0gZmlsdGVyZWRQcm9wb3NhbHMuaXRlcmF0b3IoKTsKLQkJCWludCBqID0gMDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlmaW5hbFJlc3VsdHNbaisrXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSBpdC5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbmFsUmVzdWx0czsKLQl9Ci0KLQkvLyBUaGVzZSBhcmUgdGhlIG9ubHkgdGhpbmdzIEknbSBhbGxvd2luZyBmb3IgdXNlIGJlYW4gaWYgdGhlIGxhbmd1YWdlIGlzCi0JLy8gSkFWQVNDUklQVAotCS8vIEknbSBmaWx0ZXJpbmcgYmFzZWQgb24gSmF2YUNvbnRlbnRBc3Npc3RQcm9wb3NhbCByZWxldmFuY2UKLQkvLwotCS8vIDQ4NSA+IG1ldGhvZCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGJlYW4KLQkvLyA0ODYgPiBiZWFuIG9iamVjdAotCS8vIDM4NiA+IGJlYW4gQ09OU1RBTlQKLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmFuY2VBbGxvd2VkKGludCByZWxldmFuY2UpIHsKLQkJcmV0dXJuIChyZWxldmFuY2UgPT0gNDg1IHx8IHJlbGV2YW5jZSA9PSA0ODYgfHwgcmVsZXZhbmNlID09IDMyNik7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiBAcmV0dXJuIElDb21wbGV0aW9uUHJvcG9zYWxbXQotCSAqLwotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEhUTUxDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAuZ2V0KElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpOwotCQlyZXR1cm4gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqIEByZXR1cm4gSUNvbXBsZXRpb25Qcm9wb3NhbFtdCi0JICovCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCUpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5nZXQoSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpOwotCQlyZXR1cm4gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJcGFydGl0aW9uVHlwZSA9IFRleHRVdGlsaXRpZXMuZ2V0Q29udGVudFR5cGUodmlld2VyLmdldERvY3VtZW50KCksIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIHZpZXdlci5tb2RlbE9mZnNldDJXaWRnZXRPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbiksIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcGFydGl0aW9uVHlwZSA9IElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRTsKLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci0KLQkvKgotCSAqICoqIFRFTVAgV09SS0FST1VORCBGT1IgQ01WQyAyNDE4ODIgVGFrZXMgYSBTdHJpbmcgYW5kIGJsb2NrcyBvdXQKLQkgKiBqc3A6c2NyaXB0bGV0LCBqc3A6ZXhwcmVzc2lvbiwgYW5kIGpzcDpkZWNsYXJhdGlvbiBAcGFyYW0gYmxvY2tUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkZWNvZGVTY3JpcHRCbG9jayhTdHJpbmcgYmxvY2tUZXh0KSB7Ci0JCVhNTFNvdXJjZVBhcnNlciBwYXJzZXIgPSBuZXcgWE1MU291cmNlUGFyc2VyKCk7Ci0JCS8vIHVzZSBKU1BfQ09OVEVOVCBmb3IgcmVnaW9uIHR5cGUKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOnNjcmlwdGxldCIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZXhwcmVzc2lvbiIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGVjbGFyYXRpb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyLnJlc2V0KGJsb2NrVGV4dCk7Ci0JCXJldHVybiBwYXJzZXIuZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbnRlbnRBc3Npc3RBZGFwdGVyI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIsIGludCwKLQkgKiAgICAgIEluZGV4ZWRSZWdpb24pCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0LCBJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCk7Ci0JfQotCi0KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLmdldChJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJcmV0dXJuIHAuZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbnRlbnRBc3Npc3RBZGFwdGVyI2dldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYTUxGb3JtYXQoRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlyZXR1cm4gZG9jRWxlbWVudCAhPSBudWxsICYmICgoZG9jRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnJvb3QiKSkgfHwgKCgoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgJiYgKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCS8vIHJlbGVhc2UgKkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JzIGluIG1hcHMKLQkJLy8gQ01WQyAyNTQwMjMKLQkJcmVsZWFzZVBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JCXJlbGVhc2VOYW1lVG9Qcm9jZXNzb3JNYXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCXJlbGVhc2VNYXAoZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQlyZWxlYXNlTWFwKGZOYW1lVG9Qcm9jZXNzb3JNYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VNYXAoSGFzaE1hcCBtYXApIHsKLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlpZiAoIW1hcC5pc0VtcHR5KCkpIHsKLQkJCQlJdGVyYXRvciBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCU9iamVjdCBrZXkgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJa2V5ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobWFwLmdldChrZXkpIGluc3RhbmNlb2YgSVJlbGVhc2FibGUpIHsKLQkJCQkJCSgoSVJlbGVhc2FibGUpIG1hcC5nZXQoa2V5KSkucmVsZWFzZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbWFwLmNsZWFyKCk7Ci0JCQltYXAgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50LAotCSAqICAgICAgU3RyaW5nLCBJVGV4dFJlZ2lvbiwgSURPTU5vZGUsIElET01Ob2RlKQotCSAqLwotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSwgSURPTU5vZGUgeG1sbm9kZSkgewotCi0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QgPSBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmVGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJaWYgKHhtbG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHhtbG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJZG9jID0gKERvY3VtZW50KSB4bWxub2RlOwotCQkJZWxzZQotCQkJCWRvYyA9IHhtbG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQl9Ci0JCVN0cmluZ1tdIGRpcmVjdGl2ZU5hbWVzID0geyJwYWdlIiwgImluY2x1ZGUiLCAidGFnbGliIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCS8vIHN1Z2dlc3QgSlNQIEV4cHJlc3Npb24gaW5zaWRlIG9mIFhNTCBjb21tZW50cwotCQlpZiAoY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUICYmICFpc1hNTEZvcm1hdChkb2MpKSB7Ci0JCQlpZiAocmVxdWVzdCA9PSBudWxsKQotCQkJCXJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh0cmVlTm9kZSwgeG1sbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI8JT0gICU+IiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgNCwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksICJqc3A6ZXhwcmVzc2lvbiIsIG51bGwsICImbHQ7JT0gJSZndDsiLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCS8vIGhhbmRsZSBwcm9wb3NhbHMgaW4gYW5kIGFyb3VuZCBKU1BfRElSRUNUSVZFX09QRU4gYW5kCi0JCS8vIEpTUF9ESVJFQ1RJVkVfTkFNRQotCQllbHNlIGlmICgoY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOICYmIGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgfHwgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSAmJiBkb2N1bWVudFBvc2l0aW9uIDw9IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpKSB7Ci0JCQlpZiAoY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKSB7Ci0JCQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCQkJcmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHhtbG5vZGUsIHhtbG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJSXRlcmF0b3IgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCVN0cmluZyBuYW1lU3RyaW5nID0gbnVsbDsKLQkJCQlpbnQgYmVnaW4gPSByZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQkJCWludCBsZW5ndGggPSByZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCQkJbmFtZVN0cmluZyA9IHNkUmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQkJCWJlZ2luID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCWxlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobmFtZVN0cmluZyA9PSBudWxsKQotCQkJCQluYW1lU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGl2ZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChkaXJlY3RpdmVOYW1lc1tpXS5zdGFydHNXaXRoKG5hbWVTdHJpbmcpIHx8IGRvY3VtZW50UG9zaXRpb24gPD0gYmVnaW4pCi0JCQkJCQlyZXF1ZXN0LmFkZFByb3Bvc2FsKG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoZGlyZWN0aXZlTmFtZXNbaV0sIGJlZ2luLCBsZW5ndGgsIGRpcmVjdGl2ZU5hbWVzW2ldLmxlbmd0aCgpLCBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKSwgZGlyZWN0aXZlTmFtZXNbaV0sIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0pTUCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgeyAvLyBieSBkZWZhdWx0LCBKU1BfRElSRUNUSVZFX05BTUUKLQkJCQlpZiAocmVxdWVzdCA9PSBudWxsKQotCQkJCQlyZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoeG1sbm9kZSwgeG1sbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0aXZlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGRpcmVjdGl2ZU5hbWVzW2ldLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcpKQotCQkJCQkJcmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGRpcmVjdGl2ZU5hbWVzW2ldLCByZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCByZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGRpcmVjdGl2ZU5hbWVzW2ldLmxlbmd0aCgpLCBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKSwgZGlyZWN0aXZlTmFtZXNbaV0sIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0pTUCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmICgoY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FICYmIGRvY3VtZW50UG9zaXRpb24gPiBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSB8fCAoY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSAmJiBkb2N1bWVudFBvc2l0aW9uIDw9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSkgewotCQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCQlyZXF1ZXN0ID0gY29tcHV0ZUF0dHJpYnV0ZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJc3VwZXIuYWRkVGFnQ2xvc2VQcm9wb3NhbHMocmVxdWVzdCk7Ci0JCQkvLyBDTVZDIDI3NDAzMywgdGhpcyBpcyBiZWluZyBhZGRlZCBmb3IgYWxsIDxqc3A6KiB0YWdzCi0JCQkvLyBpbiBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KQotCQkJLy8gc3VwZXIuYWRkQXR0cmlidXRlTmFtZVByb3Bvc2FscyhyZXF1ZXN0KTsKLQkJfQotCQkvLyBubyBuYW1lPzogPCVAICU+Ci0JCWVsc2UgaWYgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UgJiYgZG9jdW1lbnRQb3NpdGlvbiA8PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkKLQkJCQlyZXF1ZXN0ID0gY29tcHV0ZUF0dHJpYnV0ZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJSXRlcmF0b3IgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBudWxsOwotCQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQkJbmFtZVN0cmluZyA9IHNkUmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5hbWVTdHJpbmcgPT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0aXZlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJcmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGRpcmVjdGl2ZU5hbWVzW2ldLCByZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCByZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGRpcmVjdGl2ZU5hbWVzW2ldLmxlbmd0aCgpLCBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKSwgZGlyZWN0aXZlTmFtZXNbaV0sIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0pTUCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGJ1ZzExNTkyNyB1c2Ugb3JpZ2luYWwgZG9jdW1lbnQgcG9zaXRpb24gZm9yIGFsbC9hbnkgcmVnaW9uCi0JCS8vIHRlbXBsYXRlcwotCQlhZGRUZW1wbGF0ZXMocmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BTEwsIGRvY3VtZW50UG9zaXRpb24pOwotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQlwcml2YXRlIEpTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmVGVtcGxhdGVQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlUHJvY2Vzc29yID0gbmV3IEpTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0ZW1wbGF0ZXMgdG8gdGhlIGxpc3Qgb2YgcHJvcG9zYWxzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGVtcGxhdGVzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgY29udGV4dCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZXMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnRPZmZzZXQpIHsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gaWYgYWxyZWFkeSBhZGRpbmcgdGVtcGxhdGUgcHJvcG9zYWxzIGZvciBhIGNlcnRhaW4gY29udGV4dCB0eXBlLCBkbwotCQkvLyBub3QgYWRkIGFnYWluCi0JCWlmICghZlRlbXBsYXRlQ29udGV4dHMuY29udGFpbnMoY29udGV4dCkpIHsKLQkJCWZUZW1wbGF0ZUNvbnRleHRzLmFkZChjb250ZXh0KTsKLQkJCWJvb2xlYW4gdXNlUHJvcG9zYWxMaXN0ID0gIWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNob3VsZFNlcGFyYXRlKCk7Ci0KLQkJCWlmIChnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuc2V0Q29udGV4dFR5cGUoY29udGV4dCk7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGZUZXh0Vmlld2VyLCBzdGFydE9mZnNldCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJaWYgKHVzZVByb3Bvc2FsTGlzdCkKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2Fsc1tpXSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZE1hY3JvKHByb3Bvc2Fsc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuVEFHKTsKLQotCQlzdXBlci5hZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNoaWxkUG9zaXRpb24pOwotCQlpZiAoaXNJbnRlcm5hbEFkYXB0ZXIpCi0JCQl1c2VFbWJlZGRlZFJlc3VsdHMgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjY0OTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50TW9kZWxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSAibnVsbCIgdmVyc2lvbiBvZiBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tbWVudFByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZENvbW1lbnRQcm9wb3NhbChjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50KExpc3QgY29udGVudExpc3QsIENNQ29udGVudCBjb250ZW50KSB7Ci0JCXN1cGVyLmFkZENvbnRlbnQoY29udGVudExpc3QsIGNvbnRlbnQpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRG9jVHlwZVByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZERvY1R5cGVQcm9wb3NhbChjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRFbmRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ1Byb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUpIHsKLQkJc3VwZXIuYWRkRW50aXR5UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBkb2N1bWVudFBvc2l0aW9uLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnRpdHlQcm9wb3NhbHMoVmVjdG9yIHByb3Bvc2FscywgUHJvcGVydGllcyBtYXAsIFN0cmluZyBrZXksIGludCBub2RlT2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbikgewotCQlzdXBlci5hZGRFbnRpdHlQcm9wb3NhbHMocHJvcG9zYWxzLCBtYXAsIGtleSwgbm9kZU9mZnNldCwgcGFyZW50LCBjb21wbGV0aW9uUmVnaW9uKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkUENEQVRBUHJvcG9zYWwobm9kZU5hbWUsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdDbG9zZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCXN1cGVyLmFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY2hpbGRQb3NpdGlvbik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlzdXBlci5hZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdHRyaWJ1dGVJbkxpc3QoSURPTU5vZGUgbm9kZSwgTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmF0dHJpYnV0ZUluTGlzdChub2RlLCBwYXJlbnQsIGNtbm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiZWdpbnNXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBzdXBlci5iZWdpbnNXaXRoKGFTdHJpbmcsIHByZWZpeCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUF0dHJpYnV0ZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlLCBJRE9NTm9kZSB4bWxub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCX0KLQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbnRlbnRQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29udGVudFByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24odmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVFbmRUYWdPcGVuUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUVuZFRhZ09wZW5Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVFbnRpdHlSZWZlcmVuY2VQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlRW50aXR5UmVmZXJlbmNlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUVxdWFsc1Byb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVFcXVhbHNQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVTdGFydERvY3VtZW50UHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZVN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVUYWdDbG9zZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVUYWdDbG9zZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ05hbWVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlVGFnTmFtZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ09wZW5Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlVGFnT3BlblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFkZGl0aW9uYWxJbmZvKENNTm9kZSBwYXJlbnRPck93bmVyLCBDTU5vZGUgY21ub2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZGRpdGlvbmFsSW5mbyhwYXJlbnRPck93bmVyLCBjbW5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleChFbGVtZW50IHBhcmVudCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykgewotCQlyZXR1cm4gc3VwZXIuZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KHBhcmVudCwgaW5kZXgsIHZhbGlkaXR5Q2hlY2tpbmcpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZVJvb3RDaGlsZHJlbihEb2N1bWVudCBkb2N1bWVudCwgaW50IGNoaWxkSW5kZXgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEF2YWlsYWJsZVJvb3RDaGlsZHJlbihkb2N1bWVudCwgY2hpbGRJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24obm9kZSk7Ci0JfQotCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0Q29tcGxldGlvblJlZ2lvbihpbnQgb2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb21wbGV0aW9uUmVnaW9uKG9mZnNldCwgZmxhdE5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXRDb21wbGV0aW9uUmVnaW9uKGludCBkb2N1bWVudFBvc2l0aW9uLCBOb2RlIGRvbW5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbXBsZXRpb25SZWdpb24oZG9jdW1lbnRQb3NpdGlvbiwgZG9tbm9kZSk7Ci0JfQotCi0JcHVibGljIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBnZXRDb250ZW50R2VuZXJhdG9yKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudEdlbmVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCk7Ci0JfQotCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRFbGVtZW50UG9zaXRpb24oTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFBvc2l0aW9uKGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRFcnJvck1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXRjaFN0cmluZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gYVJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TWF0Y2hTdHJpbmcocGFyZW50LCBhUmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWVSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhOb2RlIG5vZGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMobm9kZSwgYWQpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZE5hbWUoTm9kZSBwYXJlbnRPck93bmVyLCBDTU5vZGUgY21ub2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXF1aXJlZE5hbWUocGFyZW50T3JPd25lciwgY21ub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkVGV4dChOb2RlIHBhcmVudE9yT3duZXIsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlcXVpcmVkVGV4dChwYXJlbnRPck93bmVyLCBhdHRyRGVjbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFRleHQoTm9kZSBwYXJlbnRPck93bmVyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVxdWlyZWRUZXh0KHBhcmVudE9yT3duZXIsIGVsZW1lbnREZWNsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRWYWxpZENoaWxkRWxlbWVudERlY2xhcmF0aW9ucyhFbGVtZW50IHBhcmVudCwgaW50IGNoaWxkUG9zaXRpb24sIGludCBraW5kT2ZBY3Rpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKHBhcmVudCwgY2hpbGRQb3NpdGlvbiwga2luZE9mQWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmlzQ2xvc2VSZWdpb24ocmVnaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05hbWVSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBzdXBlci5pc05hbWVSZWdpb24ocmVnaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1F1b3RlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmlzUXVvdGUoc3RyaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydGllcyBtYXBUb1Byb3BlcnRpZXMoQ01OYW1lZE5vZGVNYXAgbWFwKSB7Ci0JCXJldHVybiBzdXBlci5tYXBUb1Byb3BlcnRpZXMobWFwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIGFwcGVuZCkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlLCBhcHBlbmQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgcHJlcGVuZCwgU3RyaW5nIGFwcGVuZCkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlLCBwcmVwZW5kLCBhcHBlbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN0cmluZ3NFcXVhbChTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJcmV0dXJuIHN1cGVyLnN0cmluZ3NFcXVhbChhLCBiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZjRiNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKU1BFTENvbXBsZXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSlNQUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBKU1BFTFByb3Bvc2FsQ29sbGVjdG9yKGN1LCB0cmFuc2xhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1Y2UwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5DTURvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UYWdsaWJUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkFTVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuQVNURnVuY3Rpb25JbnZvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkpTUEVMUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkpTUEVMUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLlNpbXBsZUNoYXJTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCXByb3RlY3RlZCBjaGFyIGVsQ29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBuZXcgY2hhcltdeycuJywgJzonfTsKLQotCXByb3RlY3RlZCBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIGdldEpzcENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmSnNwQ29tcGxldGlvblByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmSnNwQ29tcGxldGlvblByb2Nlc3NvciA9IG5ldyBKU1BFTENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3I7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQotCQkvLyBnZXQgcmVzdWx0cyBmcm9tIEpTUCBjb21wbGV0aW9uIHByb2Nlc3NvcgotCQlmSnNwQ29tcGxldGlvblByb2Nlc3NvciA9IGdldEpzcENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdHMgPSBmSnNwQ29tcGxldGlvblByb2Nlc3Nvci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlmRXJyb3JNZXNzYWdlID0gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCWlmIChyZXN1bHRzLmxlbmd0aCA9PSAwICYmIChmRXJyb3JNZXNzYWdlID09IG51bGwgfHwgZkVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJZkVycm9yTWVzc2FnZSA9IFVOS05PV05fQ09OVEVYVDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCi0JCWlmIChmbGF0ICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnNvclJlZ2lvbiA9IGZsYXQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSA9PSBjdXJzb3JSZWdpb24uZ2V0VHlwZSgpKSB7Ci0JCQkJSVRleHRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjdXJzb3JSZWdpb247Ci0JCQkJY3Vyc29yUmVnaW9uID0gY29udGFpbmVyLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCQkJCWlmIChjdXJzb3JSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UKSB7Ci0JCQkJCVN0cmluZyBlbFRleHQgPSBjb250YWluZXIuZ2V0VGV4dChjdXJzb3JSZWdpb24pLnRyaW0oKTsKLQkJCQkJU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeChkb2N1bWVudFBvc2l0aW9uIC0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KGN1cnNvclJlZ2lvbikgLSAxLCBlbFRleHQpOwotCQkJCQlpZiAobnVsbCAhPSBwcmVmaXgpIHsKLQkJCQkJCUxpc3QgcHJvcG9zYWxzID0gZ2V0RnVuY3Rpb25Qcm9wb3NhbHMocHJlZml4LCAoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQlyZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV07Ci0JCQkJCQlwcm9wb3NhbHMudG9BcnJheShyZXN1bHRzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmaXgoaW50IHJlbGF0aXZlUG9zaXRpb24sIFN0cmluZyBlbFRleHQpIHsKLQkJamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGVsVGV4dCk7Ci0JCUpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyIHNjYW5uZXIgPSBuZXcgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIobmV3IFNpbXBsZUNoYXJTdHJlYW0ocmVhZGVyLCAxLCAxKSk7Ci0JCVRva2VuIGN1clRva2VuID0gbnVsbCwgbGFzdElkZW50aWZpZXIgPSBudWxsOwotCQl3aGlsZSAoSlNQRUxQYXJzZXJDb25zdGFudHMuRU9GICE9IChjdXJUb2tlbiA9IHNjYW5uZXIuZ2V0TmV4dFRva2VuKCkpLmtpbmQpIHsKLQkJCWlmIChKU1BFTFBhcnNlckNvbnN0YW50cy5DT0xPTiA9PSBjdXJUb2tlbi5raW5kICYmIGN1clRva2VuLmVuZENvbHVtbiA9PSByZWxhdGl2ZVBvc2l0aW9uICYmIG51bGwgIT0gbGFzdElkZW50aWZpZXIpIHsKLQkJCQlyZXR1cm4gKGxhc3RJZGVudGlmaWVyLmltYWdlKTsKLQkJCX0KLQotCQkJaWYgKEpTUEVMUGFyc2VyQ29uc3RhbnRzLklERU5USUZJRVIgPT0gY3VyVG9rZW4ua2luZCkgewotCQkJCWxhc3RJZGVudGlmaWVyID0gY3VyVG9rZW47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsYXN0SWRlbnRpZmllciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBnZXRJbnZvY2F0aW9uKGludCByZWxhdGl2ZVBvc2l0aW9uLCBTdHJpbmcgZWxUZXh0KSB7Ci0JCUZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yIHZpc2l0b3IgPSBuZXcgRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IocmVsYXRpdmVQb3NpdGlvbik7Ci0JCUpTUEVMUGFyc2VyIHBhcnNlciA9IEpTUEVMUGFyc2VyLmNyZWF0ZVBhcnNlcihlbFRleHQpOwotCQl0cnkgewotCQkJQVNURXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VyLkV4cHJlc3Npb24oKTsKLQkJCXJldHVybiAoQVNURnVuY3Rpb25JbnZvY2F0aW9uKSBleHByZXNzaW9uLmpqdEFjY2VwdCh2aXNpdG9yLCBudWxsKTsKLQkJfQotCQljYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeyAvKiBwYXJzZSBleGNlcHRpb24gPSBubyBjb21wbGV0aW9uICovCi0JCX0KLQkJcmV0dXJuIChudWxsKTsKLQl9Ci0KLQotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gZWxDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RnVuY3Rpb25Qcm9wb3NhbHMoU3RyaW5nIHByZWZpeCwgU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCVRMRENNRG9jdW1lbnRNYW5hZ2VyIGRvY01nciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIodmlld2VyLmdldERvY3VtZW50KCkpOwotCQlBcnJheUxpc3QgY29tcGxldGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChkb2NNZ3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUl0ZXJhdG9yIHRhZ2xpYnMgPSBkb2NNZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKG9mZnNldCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHRhZ2xpYnMuaGFzTmV4dCgpKSB7Ci0JCQlUYWdsaWJUcmFja2VyIHRyYWNrZXIgPSAoVGFnbGliVHJhY2tlcikgdGFnbGlicy5uZXh0KCk7Ci0JCQlpZiAodHJhY2tlci5nZXRQcmVmaXgoKS5lcXVhbHMocHJlZml4KSkgewotCQkJCUNNRG9jdW1lbnRJbXBsIGRvYyA9IChDTURvY3VtZW50SW1wbCkgdHJhY2tlci5nZXREb2N1bWVudCgpOwotCi0JCQkJTGlzdCBmdW5jdGlvbnMgPSBkb2MuZ2V0RnVuY3Rpb25zKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGZ1bmN0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRMREZ1bmN0aW9uIGZ1bmN0aW9uID0gKFRMREZ1bmN0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoZnVuY3Rpb24uZ2V0TmFtZSgpICsgIigpIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlvZmZzZXQsIDAsIGZ1bmN0aW9uLmdldE5hbWUoKS5sZW5ndGgoKSArIDEsIG51bGwsIGZ1bmN0aW9uLmdldE5hbWUoKSArICIgLSAiICsgZnVuY3Rpb24uZ2V0U2lnbmF0dXJlKCksIG51bGwsIG51bGwsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJY29tcGxldGlvbkxpc3QuYWRkKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbXBsZXRpb25MaXN0OwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMUHJvcG9zYWxDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMUHJvcG9zYWxDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhM2ViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKU1BFTFByb3Bvc2FsQ29sbGVjdG9yIGV4dGVuZHMgSlNQUHJvcG9zYWxDb2xsZWN0b3IgewotCi0JcHVibGljIEpTUEVMUHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJc3VwZXIoY3UsIHRyYW5zbGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsID0gbnVsbDsKLQkJCi0JCWlmKG51bGwgPT0gcHJvcG9zYWwgfHwgbnVsbCA9PSBwcm9wb3NhbC5nZXROYW1lKCkpCi0JCQlyZXR1cm4obnVsbCk7Ci0JCQotCQlTdHJpbmcgcmF3TmFtZSA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIGNvbXBsZXRpb24gPSBudWxsOwotCQkKLQkJaWYocHJvcG9zYWwuZ2V0S2luZCgpID09IENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGICYmIHByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKS5sZW5ndGggPT0gMCkgewotCQkJaWYocmF3TmFtZS5sZW5ndGgoKSA+IDMgJiYgcmF3TmFtZS5zdGFydHNXaXRoKCJnZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29tcGxldGlvbiA9IHJhd05hbWUuc3Vic3RyaW5nKDMsNCkudG9Mb3dlckNhc2UoKSArIHJhd05hbWUuc3Vic3RyaW5nKDQsIHJhd05hbWUubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gamF2YSBvZmZzZXQKLQkJCWludCBvZmZzZXQgPSBwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSArIDE7Ci0JCQkKLQkJCS8vIHJlcGxhY2VtZW50IGxlbmd0aAotCQkJaW50IGxlbmd0aCA9IHByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSAtIG9mZnNldCArIDE7Ci0JCQkKLQkJCS8vIHRyYW5zbGF0ZSBvZmZzZXQgZnJvbSBKYXZhID4gSlNQCi0JCQlvZmZzZXQgPSBnZXRUcmFuc2xhdGlvbigpLmdldEpzcE9mZnNldChvZmZzZXQpOwotCQkJCi0JCQkvLyBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgbXVzdCBiZSBjYWxjdWxhdGVkCi0JCQlpbnQgcG9zaXRpb25BZnRlciA9IG9mZnNldCArIGNvbXBsZXRpb24ubGVuZ3RoKCk7Ci0JCQkJCi0JCQkvLyBmcm9tIGphdmEgcHJvcG9zYWwKLQkJCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IHN1cGVyLmNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkJU3RyaW5nIGxvbmdEaXNwbGF5U3RyaW5nID0gamF2YVByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJCWludCBmaXN0U3BhY2VJbmRleCA9IGxvbmdEaXNwbGF5U3RyaW5nLmluZGV4T2YoJyAnKTsKLQkJCVN0cmluZyBzaG9ydERpc3BsYXlTdHJpbmcgPSBsb25nRGlzcGxheVN0cmluZzsKLQkJCQotCQkJaWYoZmlzdFNwYWNlSW5kZXggIT0gLTEpIHsKLQkJCQlzaG9ydERpc3BsYXlTdHJpbmcgPSBsb25nRGlzcGxheVN0cmluZy5zdWJzdHJpbmcoZmlzdFNwYWNlSW5kZXgpOwotCQkJfQotCQkJCQotCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBjb21wbGV0aW9uICsgIiAiICsgc2hvcnREaXNwbGF5U3RyaW5nOyAvLyROT04tTkxTLTEkCi0JCQlJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiA9IGphdmFQcm9wb3NhbC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLQkJCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCQlpbnQgcmVsZXZhbmNlID0gamF2YVByb3Bvc2FsLmdldFJlbGV2YW5jZSgpOwotCQkJCi0JCQlib29sZWFuIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUgPSB0cnVlOwotCQkJCi0JCQlqc3BQcm9wb3NhbCA9IG5ldyBKU1BDb21wbGV0aW9uUHJvcG9zYWwoY29tcGxldGlvbiwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uQWZ0ZXIsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIGFkZGl0aW9uYWxJbmZvLCByZWxldmFuY2UsIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpOwotCQkJCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDgzCi0JCQkvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbiBkZW1hbmQKLQkJCWpzcFByb3Bvc2FsLnNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoamF2YVByb3Bvc2FsKTsKLQkJCQotCQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLS8vCXByb3RlY3RlZCB2b2lkIGFjY2VwdE1ldGhvZChjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBuYW1lLCBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsIGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsIGNoYXJbXSByZXR1cm5UeXBlTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCByZWxldmFuY2UpIHsKLS8vCQlTdHJpbmcgcmF3TmFtZSA9IFN0cmluZy52YWx1ZU9mKG5hbWUpOwotLy8JCWlmKHBhcmFtZXRlck5hbWVzLmxlbmd0aCA9PSAwICYmIHJhd05hbWUubGVuZ3RoKCkgPiAzICYmIHJhd05hbWUuc3RhcnRzV2l0aCgiZ2V0IikpCi0vLwkJewotLy8JCQlTdHJpbmcgbWFuZ2xlZE5hbWUgPSByYXdOYW1lLnN1YnN0cmluZygzLDQpLnRvTG93ZXJDYXNlKCkgKyByYXdOYW1lLnN1YnN0cmluZyg0LCByYXdOYW1lLmxlbmd0aCgpKTsKLS8vCQkJc3VwZXIuYWNjZXB0RmllbGQoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgbWFuZ2xlZE5hbWUudG9DaGFyQXJyYXkoKSwgcmV0dXJuVHlwZVBhY2thZ2VOYW1lLCByZXR1cm5UeXBlTmFtZSwgbWFuZ2xlZE5hbWUudG9DaGFyQXJyYXkoKSwgbW9kaWZpZXJzLCBzdGFydCwgZW5kLCByZWxldmFuY2UpOwotLy8JCX0KLS8vCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTRiMzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciwgSVJlbGVhc2FibGUgewotCS8qKgotCSAqIFByZWZlcmVuY2UgbGlzdGVuZXIgdG8ga2VlcCB0cmFjayBvZiBjaGFuZ2VzIHRvIGNvbnRlbnQgYXNzaXN0Ci0JICogcHJlZmVyZW5jZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFByZWZlcmVuY2VMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRKYXZhUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJCWlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT04uZXF1YWxzKHByb3BlcnR5KSkgewotCQkJCWZBdXRvQWN0aXZhdGUgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTik7Ci0JCQl9Ci0JCQllbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT05fVFJJR0dFUlNfSkFWQS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQkJU3RyaW5nIGF1dG9DaGFyYWN0ZXJzID0gc3RvcmUuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTl9UUklHR0VSU19KQVZBKTsKLQkJCQljb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSAoYXV0b0NoYXJhY3RlcnMgIT0gbnVsbCkgPyBhdXRvQ2hhcmFjdGVycy50b0NoYXJBcnJheSgpIDogbmV3IGNoYXJbMF07Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkF1dG9BY3RpdmF0ZSA9IHRydWU7Ci0JcHJvdGVjdGVkIGNoYXIgY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBuZXcgY2hhcltdeycuJ307Ci0JcHJvdGVjdGVkIGNoYXIgY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBudWxsOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fQ09OVEVYVCA9IEpTUFVJTWVzc2FnZXMuQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfOwotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIEpTUENvbXBsZXRpb25Qcm9jZXNzb3IgZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBudWxsOwotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZkphdmFQcmVmZXJlbmNlTGlzdGVuZXI7Ci0KLQlwdWJsaWMgSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBwcm9wb3NlZCBjb2RlIGNvbXBsZXRpb25zIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0LWVkaXRvciBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICBhIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvZGUtYXNzaXN0IGl0ZW1zCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQotCQkvLyBnZXQgcmVzdWx0cyBmcm9tIEpTUCBjb21wbGV0aW9uIHByb2Nlc3NvcgotCQlmSnNwQ29tcGxldGlvblByb2Nlc3NvciA9IGdldEpzcENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdHMgPSBmSnNwQ29tcGxldGlvblByb2Nlc3Nvci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlmRXJyb3JNZXNzYWdlID0gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCWlmIChyZXN1bHRzLmxlbmd0aCA9PSAwICYmIChmRXJyb3JNZXNzYWdlID09IG51bGwgfHwgZkVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJZkVycm9yTWVzc2FnZSA9IFVOS05PV05fQ09OVEVYVDsKLQkJfQotCi0JCUlET01Ob2RlIHhOb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0ID0gbnVsbDsKLQkJaWYgKHRyZWVOb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCXhOb2RlID0gKElET01Ob2RlKSB0cmVlTm9kZTsKLQkJCWZsYXQgPSB4Tm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXQgIT0gbnVsbCAmJiBmbGF0LmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkJCWZsYXQgPSBmbGF0LmdldFByZXZpb3VzKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyB0aGlzIGlzIGluIGNhc2UgaXQncyBhIDwlQCwgaXQgd2lsbCBiZSBhIHJlZ2lvbiBjb250YWluZXIuLi4KLQkJSVRleHRSZWdpb24gb3BlblJlZ2lvbiA9IG51bGw7Ci0JCWlmIChmbGF0ICE9IG51bGwgJiYgZmxhdCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgdiA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGZsYXQpLmdldFJlZ2lvbnMoKTsKLQkJCWlmICh2LnNpemUoKSA+IDApCi0JCQkJb3BlblJlZ2lvbiA9IHYuZ2V0KDApOwotCQl9Ci0KLQkJLy8gQUREIENEQVRBIFBST1BPU0FMIElGIElUJ1MgQU4gWE1MLUpTUCBUQUcKLQkJaWYgKGZsYXQgIT0gbnVsbCAmJiBmbGF0LmdldFR5cGUoKSAhPSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gJiYgZmxhdC5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gJiYgZmxhdC5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiAmJiBmbGF0LmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgJiYgKG9wZW5SZWdpb24gIT0gbnVsbCAmJiBvcGVuUmVnaW9uLmdldFR5cGUoKSAhPSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pICYmICFpbkF0dHJpYnV0ZVJlZ2lvbihmbGF0LCBkb2N1bWVudFBvc2l0aW9uKSkgewotCi0JCQkvLyBkZXRlcm1pbmUgaWYgY3Vyc29yIGlzIGJlZm9yZSBvciBhZnRlciBzZWxlY3RlZCByYW5nZQotCQkJaW50IGFkanVzdGVkRG9jUG9zaXRpb24gPSBkb2N1bWVudFBvc2l0aW9uOwotCQkJaW50IHJlYWxDYXJldFBvc2l0aW9uID0gdmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRDYXJldE9mZnNldCgpOwotCQkJaW50IHNlbGVjdGlvbkxlbmd0aCA9IHZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueTsKLQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gcmVhbENhcmV0UG9zaXRpb24pIHsKLQkJCQlhZGp1c3RlZERvY1Bvc2l0aW9uIC09IHNlbGVjdGlvbkxlbmd0aDsKLQkJCX0KLQotCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIGNkYXRhUHJvcG9zYWwgPSBjcmVhdGVDREFUQVByb3Bvc2FsKGFkanVzdGVkRG9jUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQlJQ29tcGxldGlvblByb3Bvc2FsW10gbmV3UmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdHMsIDAsIG5ld1Jlc3VsdHMsIDAsIHJlc3VsdHMubGVuZ3RoKTsKLQkJCW5ld1Jlc3VsdHNbcmVzdWx0cy5sZW5ndGhdID0gY2RhdGFQcm9wb3NhbDsKLQkJCXJlc3VsdHMgPSBuZXdSZXN1bHRzOwotCQl9Ci0KLQkJLy8gKHBhKSAqKiB0aGlzIGlzIGNvZGUgaW4gcHJvZ3Jlc3MuLi4KLQkJLy8gYWRkIGVuZGluZyAlPiBwcm9wb3NhbCBmb3Igbm9uIGNsb3NlZCBKU1AgdGFncwotCQkvLyBTdHJpbmcgdGFnVGV4dCA9IGZsYXQuZ2V0VGV4dCgpOwotCQkvLyAvLyBUT0RPIG5lZWQgYSBtdWNoIGJldHRlciBjb21wYXJlICh1c2luZyBjb25zdGFudHM/KQotCQkvLwkJaWYodGFnVGV4dC5lcXVhbHMoIjwlIikgfHwgdGFnVGV4dC5lcXVhbHMoIjwlPSIpIHx8IHRhZ1RleHQuZXF1YWxzKCI8JSEiKSk7Ci0JCS8vIHsKLQkJLy8JCQlJQ29tcGxldGlvblByb3Bvc2FsIHRlc3RhaCA9IENvbnRlbnRBc3Npc3RVdGlscy5jb21wdXRlSlNQRW5kVGFnUHJvcG9zYWwodmlld2VyLGRvY3VtZW50UG9zaXRpb24sIHRyZWVOb2RlLCAiPCUiICwgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCS8vIGlmKHRlc3RhaCAhPSBudWxsKQotCQkvLyB7Ci0JCS8vCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBuZXdSZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcmVzdWx0cy5sZW5ndGggKyAxXTsKLQkJLy8gU3lzdGVtLmFycmF5Y29weSggcmVzdWx0cywgMCwgbmV3UmVzdWx0cywgMCwgcmVzdWx0cy5sZW5ndGgpOwotCQkvLyBuZXdSZXN1bHRzW3Jlc3VsdHMubGVuZ3RoXSA9IHRlc3RhaDsKLQkJLy8gcmVzdWx0cyA9IG5ld1Jlc3VsdHM7Ci0JCS8vIH0KLQkJLy8gfQotCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCXByaXZhdGUgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUNEQVRBUHJvcG9zYWwoaW50IGFkanVzdGVkRG9jUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIjwhW0NEQVRBW11dPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJYWRqdXN0ZWREb2NQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoLCAvLyBzaG91bGQgYmUgdGhlIHNlbGVjdGlvbiBsZW5ndGgKLQkJCQkJOSwgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9DREFUQVNFQ1RJT04pLCAKLQkJCQkJIkNEQVRBIFNlY3Rpb24iLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NEQVRBKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5BdHRyaWJ1dGVSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0LCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlJVGV4dFJlZ2lvbiBhdHRyQ29udGFpbmVyID0gZmxhdC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGF0dHJDb250YWluZXIgIT0gbnVsbCAmJiBhdHRyQ29udGFpbmVyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCWlmIChhdHRyQ29udGFpbmVyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQkvLyBpZiBubyBsaXN0ZW5lciBoYXMgYmVlbiBjcmVhdGVkLCBwcmVmZXJlbmVzIGhhdmUgbm90IGJlZW4KLQkJLy8gaW5pdGlhbGl6ZWQKLQkJaWYgKGZKYXZhUHJlZmVyZW5jZUxpc3RlbmVyID09IG51bGwpCi0JCQlpbml0aWFsaXplUHJlZmVyZW5jZXMoKTsKLQotCQlpZiAoZkF1dG9BY3RpdmF0ZSkKLQkJCXJldHVybiBjb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIHByZXNlbnRpbmcgY29udGV4dAotCSAqICAgICAgICAgaW5mb3JtYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzCi0JICogICAgICAgICBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBjb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55Ci0JICogY29tcGxldGlvbnMuCi0JICogCi0JICogQHJldHVybiBhbiBlcnJvciBtZXNzYWdlIG9yIG51bGwgaWYgbm8gZXJyb3Igb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyByZW1vdmUgbGlzdGVuZXIgb24gamF2YSBwcmVmZXJlbmNlcyBpZiB3ZSBhZGRlZCBvbmUKLQkJaWYgKGZKYXZhUHJlZmVyZW5jZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWdldEphdmFQcmVmZXJlbmNlU3RvcmUoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZKYXZhUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChmSnNwQ29tcGxldGlvblByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQlmSnNwQ29tcGxldGlvblByb2Nlc3Nvci5yZWxlYXNlKCk7Ci0JCQlmSnNwQ29tcGxldGlvblByb2Nlc3NvciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSlNQQ29tcGxldGlvblByb2Nlc3NvciBnZXRKc3BDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBuZXcgSlNQQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmSnNwQ29tcGxldGlvblByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gbmVlZCB0byBjb21wdXRlIGNvbnRleHQgaW5mbyBoZXJlLCBpZiBpdCdzIEpTUCwgY2FsbCBqYXZhIGNvbXB1dGVyCi0JCUlEb2N1bWVudCBkb2MgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJSURvY3VtZW50UGFydGl0aW9uZXIgZHAgPSBudWxsOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgewotCQkJZHAgPSAoKElEb2N1bWVudEV4dGVuc2lvbjMpIGRvYykuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKTsKLQkJfQotCQlpZiAoZHAgIT0gbnVsbCkgewotCQkJLy9JRG9jdW1lbnRQYXJ0aXRpb25lciBkcCA9IHZpZXdlci5nZXREb2N1bWVudCgpLmdldERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJCVN0cmluZyB0eXBlID0gZHAuZ2V0UGFydGl0aW9uKGRvY3VtZW50T2Zmc2V0KS5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCB8fCB0eXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEpIHsKLQkJCQkvLyBnZXQgY29udGV4dCBpbmZvIGZyb20gY29tcGxldGlvbiByZXN1bHRzLi4uCi0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDb250ZXh0SW5mb3JtYXRpb24gY2kgPSBwcm9wb3NhbHNbaV0uZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCQkJCWlmIChjaSAhPSBudWxsKQotCQkJCQkJcmVzdWx0cy5hZGQoY2kpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb250ZXh0SW5mb3JtYXRpb25bXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJQ29udGV4dEluZm9ybWF0aW9uW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbGlkYXRvciB1c2VkIHRvIGRldGVybWluZSB3aGVuIGRpc3BsYXllZCBjb250ZXh0Ci0JICogaW5mb3JtYXRpb24gc2hvdWxkIGJlIGRpc21pc3NlZC4gTWF5IG9ubHkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhlIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSmF2YVBhcmFtZXRlckxpc3RWYWxpZGF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBqYXZhIHByZWZlcmVuY2Ugc3RvcmUuIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgZ2V0dGluZyBpdCwKLQkgKiBhZGQgYSBwcmVmZXJlbmNlIGxpc3RlbmVyIHRvIGl0LgotCSAqIAotCSAqIEByZXR1cm4gSVByZWZlcmVuY2VTdG9yZQotCSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRKYXZhUHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKGZKYXZhUHJlZmVyZW5jZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZKYXZhUHJlZmVyZW5jZUxpc3RlbmVyID0gbmV3IFByZWZlcmVuY2VMaXN0ZW5lcigpOwotCQkJc3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmSmF2YVByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCX0KLQkJcmV0dXJuIHN0b3JlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgcHJlZmVyZW5jZSBmb3IgY29udGVudCBhc3Npc3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0SmF2YVByZWZlcmVuY2VTdG9yZSgpOwotCi0JCWZBdXRvQWN0aXZhdGUgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTik7Ci0JCVN0cmluZyBhdXRvQ2hhcmFjdGVycyA9IHN0b3JlLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT05fVFJJR0dFUlNfSkFWQSk7Ci0JCWNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9IChhdXRvQ2hhcmFjdGVycyAhPSBudWxsKSA/IGF1dG9DaGFyYWN0ZXJzLnRvQ2hhckFycmF5KCkgOiBuZXcgY2hhclswXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDc3NDRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTFJlbGV2YW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29tcHV0ZXMgYXR0cmlidXRlIHZhbHVlIGNvbXBsZXRpb24gcHJvcG9zYWxzIGZvciAmbHQ7anNwOltnc11ldFByb3BlcnR5Jmd0OyB0YWdzLgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCXB1YmxpYyBKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCi0JCS8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZCBoYXZlIGEgdmFsdWUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpKTsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuOwotCi0JCS8vIGdldCB0aGUgYXR0cmlidXRlIGluIHF1ZXN0aW9uIChmaXJzdCBhdHRyIG5hbWUgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnNvcikKLQkJSVRleHRSZWdpb24gYXR0ck5hbWVSZWdpb24gPSBudWxsOwotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCWF0dHJOYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGktLSk7Ci0JCQlpZiAoYXR0ck5hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoYXR0ck5hbWVSZWdpb24gIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZU5hbWUgPSBvcGVuLmdldFRleHQoYXR0ck5hbWVSZWdpb24pOwotCi0JCS8vIGRldGVybWluZSBnZXQgb3Igc2V0Ci0JCUlUZXh0UmVnaW9uIHRhZ05hbWVSZWdpb24gPSBudWxsOwotCQlib29sZWFuIGlzR2V0UHJvcGVydHkgPSB0cnVlOwotCQlmb3IgKGludCBqID0gMDsgaiA8IG9wZW5SZWdpb25zLnNpemUoKTsgaisrKSB7Ci0JCQl0YWdOYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGopOwotCQkJaWYgKHRhZ05hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FICYmIG9wZW4uZ2V0VGV4dCh0YWdOYW1lUmVnaW9uKS50cmltKCkuZXF1YWxzKCJqc3A6c2V0UHJvcGVydHkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaXNHZXRQcm9wZXJ0eSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCWN1cnJlbnRWYWx1ZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFRleHQoKTsKLQkJZWxzZQotCQkJY3VycmVudFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gbnVsbDsKLQkJLy8gZml4dXBzIHNpbmNlIHRoZSBtYXRjaFN0cmluZyBjb21wdXRhdGlvbnMgZG9uJ3QgY2FyZSBpZiB0aGVyZSBhcmUgcXVvdGVzIGFyb3VuZCB0aGUgdmFsdWUKLQkJaWYgKGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA+IFN0cmluZ1V0aWxzLnN0cmlwKGN1cnJlbnRWYWx1ZSkubGVuZ3RoKCkgJiYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCJcIiIpIHx8IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCInIikpICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW1hdGNoU3RyaW5nID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygxLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpKTsKLQkJZWxzZQotCQkJbWF0Y2hTdHJpbmcgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKDAsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkpOwotCi0JCS8vIGZvciBub3cgd2UgaWdub3JlIGNvbXBsaWNhdGVkIHZhbHVlcyBzdWNoIGFzIGpzcCBlbWJlZGRlZCBpbiBhbiBhdHRyaWJ1dGUKLQkJYm9vbGVhbiBleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSAhPSBudWxsICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXI7Ci0JCWlmIChleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUpIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLmNsZWFyKCk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYWNyb3MoKS5jbGVhcigpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKSkgewotCQkJCWFkZEJlYW5OYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBub2RlLCBtYXRjaFN0cmluZyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUFJPUEVSVFkpKSB7Ci0JCQkJYWRkQmVhblByb3BlcnR5UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBub2RlLCBpc0dldFByb3BlcnR5LCBtYXRjaFN0cmluZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQmVhblByb3BlcnR5UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBJRE9NTm9kZSBub2RlLCBib29sZWFuIGlzR2V0UHJvcGVydHksIFN0cmluZyBtYXRjaFN0cmluZykgewotCQkvLyBhc3N1bWVzIHRoYXQgdGhlIG5vZGUgaXMgdGhlIFtnc11ldFByb3BlcnR5IHRhZwotCQlTdHJpbmcgdXNlQmVhbk5hbWUgPSAoKEVsZW1lbnQpIG5vZGUpLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSk7Ci0JCS8vIHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgYSBjbGFzcy90eXBlL2JlYW5OYW1lIGhhcyBiZWVuIGRlY2xhcmVkCi0JCWlmICh1c2VCZWFuTmFtZSAhPSBudWxsICYmIHVzZUJlYW5OYW1lLmxlbmd0aCgpID4gMCkgewotCQkJTm9kZUxpc3QgdXNlQmVhbnMgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJCWlmICh1c2VCZWFucyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVzZUJlYW5zLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJaWYgKHVzZUJlYW5zLml0ZW0oaikuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlFbGVtZW50IHVzZUJlYW4gPSAoRWxlbWVudCkgdXNlQmVhbnMuaXRlbShqKTsKLQkJCQkJaWYgKHVzZUJlYW4gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uICYmICgoSW5kZXhlZFJlZ2lvbikgdXNlQmVhbikuZ2V0U3RhcnRPZmZzZXQoKSA8IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkJaWYgKHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCkuZXF1YWxzKHVzZUJlYW5OYW1lKSkgewotCQkJCQkJCXR5cGVOYW1lID0gdXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0NMQVNTKTsKLQkJCQkJCQlpZiAodHlwZU5hbWUgPT0gbnVsbCB8fCB0eXBlTmFtZS5sZW5ndGgoKSA8IDEpIHsKLQkJCQkJCQkJdHlwZU5hbWUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICh0eXBlTmFtZSA9PSBudWxsIHx8IHR5cGVOYW1lLmxlbmd0aCgpIDwgMSkgewotCQkJCQkJCQl0eXBlTmFtZSA9IHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9CRUFOX05BTUUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodHlwZU5hbWUgIT0gbnVsbCAmJiB0eXBlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJLy8gZmluZCB0aGUgY2xhc3MvdHlwZS9iZWFuTmFtZSBkZWZpbml0aW9uIGFuZCBvYnRhaW4gdGhlIGxpc3Qgb2YgcHJvcGVydGllcwotCQkJCQlJQmVhbkluZm9Qcm92aWRlciBwcm92aWRlciA9IG5ldyBCZWFuSW5mb1Byb3ZpZGVyKCk7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHByb3ZpZGVyLmdldFJ1bnRpbWVQcm9wZXJ0aWVzKHJlc291cmNlLCB0eXBlTmFtZSk7Ci0JCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGorKykgewotCQkJCQkJSUphdmFQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBkZXNjcmlwdG9yc1tqXTsKLQkJCQkJCS8vIGNoZWNrIHdoZXRoZXIgaXQncyBnZXQgb3Igc2V0IGtpbmRhIHByb3BlcnR5Ci0JCQkJCQlpZiAocGQuZ2V0UmVhZGFibGUoKSAmJiBpc0dldFByb3BlcnR5IHx8IHBkLmdldFdyaXRlYWJsZSgpICYmICFpc0dldFByb3BlcnR5KSB7Ci0JCQkJCQkJLy8gZmlsdGVyIGF0dHIgdmFsdWUgbmFtZQotCQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHBkLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpIHsKLQkJCQkJCQkJZGlzcGxheVN0cmluZyA9IHBkLmdldERpc3BsYXlOYW1lKCk7Ci0JCQkJCQkJCWlmIChwZC5nZXREZWNsYXJlZFR5cGUoKSAhPSBudWxsICYmIHBkLmdldERlY2xhcmVkVHlwZSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCQkJCWRpc3BsYXlTdHJpbmcgKz0gIiAtICIgKyBwZC5nZXREZWNsYXJlZFR5cGUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIHBkLmdldE5hbWUoKSArICJcIiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcGQuZ2V0TmFtZSgpLmxlbmd0aCgpICsgMiwgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9BVFRSSUJVVEUpLAotCQkJCQkJCQkJCQlkaXNwbGF5U3RyaW5nLCBudWxsLCBwZC5nZXREZWNsYXJlZFR5cGUoKSwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQmVhbk5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIElET01Ob2RlIG5vZGUsIFN0cmluZyBtYXRjaFN0cmluZykgewotCQkvLyB3aWxsIG5vdCBjYXRjaCB1c2VCZWFucyBzcGVjaWZpZWQgdXNpbmcgb3RoZXIgdGhhbiBhY3R1YWwgRE9NIE5vZGVzCi0JCU5vZGVMaXN0IHVzZUJlYW5zID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTik7Ci0JCWlmICh1c2VCZWFucyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBudWxsOwotCQkJU3RyaW5nIGNsYXNzT3JUeXBlID0gbnVsbDsKLQkJCVN0cmluZyBpbWFnZU5hbWUgPSBKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DTEFTU19PQko7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHVzZUJlYW5zLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQlpZiAodXNlQmVhbnMuaXRlbShqKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQljb250aW51ZTsKLQkJCQlFbGVtZW50IHVzZUJlYW4gPSAoRWxlbWVudCkgdXNlQmVhbnMuaXRlbShqKTsKLQkJCQlpZiAodXNlQmVhbiBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24gJiYgKChJbmRleGVkUmVnaW9uKSB1c2VCZWFuKS5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCWlkID0gU3RyaW5nVXRpbHMuc3RyaXAodXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0lEKSk7Ci0JCQkJCWRpc3BsYXlTdHJpbmcgPSBudWxsOwotCQkJCQljbGFzc09yVHlwZSA9IG51bGw7Ci0JCQkJCWltYWdlTmFtZSA9IEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NMQVNTX09CSjsKLQkJCQkJLy8gc2V0IHRoZSBJbWFnZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjbGFzcywgdHlwZSwgb3IgYmVhbk5hbWUgYXR0cmlidXRlIGlzIHByZXNlbnQKLQkJCQkJY2xhc3NPclR5cGUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQ0xBU1MpOwotCQkJCQlpZiAoY2xhc3NPclR5cGUgPT0gbnVsbCB8fCBjbGFzc09yVHlwZS5sZW5ndGgoKSA8IDEpIHsKLQkJCQkJCWNsYXNzT3JUeXBlID0gdXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQkJCQkJaW1hZ2VOYW1lID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFVCTElDOwotCQkJCQl9Ci0JCQkJCWlmIChjbGFzc09yVHlwZSA9PSBudWxsIHx8IGNsYXNzT3JUeXBlLmxlbmd0aCgpIDwgMSkgewotCQkJCQkJY2xhc3NPclR5cGUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQkVBTl9OQU1FKTsKLQkJCQkJCWltYWdlTmFtZSA9IEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BVQkxJQzsKLQkJCQkJfQotCQkJCQlpZiAoY2xhc3NPclR5cGUgIT0gbnVsbCAmJiBjbGFzc09yVHlwZS5sZW5ndGgoKSA+IDApCi0JCQkJCQlkaXNwbGF5U3RyaW5nID0gaWQgKyAiIC0gIiArIGNsYXNzT3JUeXBlOyAvLyROT04tTkxTLTEkCi0JCQkJCWVsc2UKLQkJCQkJCWRpc3BsYXlTdHJpbmcgPSBpZDsKLQotCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjM0MQotCQkJCQlpZihpZCAhPSBudWxsKSB7Ci0JCQkJCSAgICAvLyBmaWx0ZXIKLQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IGlkLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgaWQgKyAiXCIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQubGVuZ3RoKCkgKyAyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlTmFtZSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdHJpbmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHByb2plY3QgcmVxdWVzdCBpcyBpbgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJU3RyaW5nIGJhc2Vsb2NhdGlvbiA9IG51bGw7Ci0KLQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSByZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSByZWdpb24uZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJYmFzZWxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiYXNlbG9jYXRpb24gIT0gbnVsbCkgewotCQkJLy8gY29waWVkIGZyb20gSlNQVHJhbnNsYXRpb25BZGFwdGVyI2dldEphdmFQcm9qZWN0Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoYmFzZWxvY2F0aW9uKTsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJZmlsZSA9IHJvb3QuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQl9Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQUHJvcG9zYWxDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZTljZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQUHJvcG9zYWxDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db21wbGV0aW9uUHJvcG9zYWxDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db21wbGV0aW9uUHJvcG9zYWxDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFBhc3NlZCBpbnRvIElDb2RlQ29tcGxldGUjY29kZUNvbXBsZXRlKGludCBvZmZzZXQsIENvbXBsZXRpb25SZXF1ZXN0b3IgcmVxdWVzdG9yKS4KLSAqIEFkYXB0cyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMgdG8gSlNQQ29tcGxldGlvbiBwcm9wb3NhbHMuCi0gKiBUaGlzIGluY2x1ZGVzOgotICogIC0gdHJhbnNsYXRpbmcgb2Zmc2V0cwotICogIC0gImZpeGluZyIgdXAgZGlzcGxheSBzdHJpbmdzCi0gKiAgLSBmaWx0ZXJpbmcgc29tZSB1bndhbnRlZCBwcm9wb3NhbHMKLSAqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUFByb3Bvc2FsQ29sbGVjdG9yIGV4dGVuZHMgQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yIHsKLQotCXByaXZhdGUgSlNQVHJhbnNsYXRpb24gZlRyYW5zbGF0aW9uOwotCXByaXZhdGUgQ29tcGFyYXRvciBmQ29tcGFyYXRvcjsKLQkKLQlwdWJsaWMgSlNQUHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJc3VwZXIoY3UpOwotCQotCQlpZih0cmFuc2xhdGlvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSlNQVHJhbnNsYXRpb24gY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZlRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb247Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHdlIG9ubHkgcmV0dXJuIEpTUENvbXBsZXRpb25Qcm9wb3NhbHMuCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBKU1BDb21wbGV0aW9uUHJvcG9zYWxzCi0JICovCi0JcHVibGljIEpTUENvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEpTUENvbXBsZXRpb25Qcm9wb3NhbHMoKSB7Ci0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbXSBqYXZhUHJvcG9zYWxzID0gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJLy8gbmVlZCB0byBmaWx0ZXIgb3V0IG5vbiBKU1BDb21wbGV0aW9uUHJvcG9zYWxzCi0JCS8vIGJlY2F1c2UgdGhlaXIgb2Zmc2V0cyBoYXZlbid0IGJlZW4gdHJhbnNsYXRlZAotCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFQcm9wb3NhbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKGphdmFQcm9wb3NhbHNbaV0gaW5zdGFuY2VvZiBKU1BDb21wbGV0aW9uUHJvcG9zYWwpCi0JCQkJcmVzdWx0cy5hZGQoamF2YVByb3Bvc2Fsc1tpXSk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzLCBnZXRDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gKEpTUENvbXBsZXRpb25Qcm9wb3NhbFtdKXJlc3VsdHMudG9BcnJheShuZXcgSlNQQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCQotCXByaXZhdGUgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkgewotCQlpZihmQ29tcGFyYXRvciA9PSBudWxsKQotCQkJZkNvbXBhcmF0b3IgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsQ29tcGFyYXRvcigpOwotCQlyZXR1cm4gZkNvbXBhcmF0b3I7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG86Ci0JICogIC0gdHJhbnNsYXRlIEphdmEgLT4gSlNQIG9mZnNldHMKLQkgKiAgLSBmaXggY3Vyc29yLXBvc2l0aW9uLWFmdGVyCi0JICogIC0gZml4IG1hbmdsZWQgc2VydmxldCBuYW1lIGluIGRpc3BsYXkgc3RyaW5nCi0JICogIC0gcmVtb3ZlIHVud2FudGVkIHByb3Bvc2FscyAoc2VydmxldCBjb25zdHJ1Y3RvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJCi0JCUpTUENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbCA9IG51bGw7Ci0JCQotCQkvLyBpZ25vcmUgY29uc3RydWN0b3IgcHJvcG9zYWxzICh0aGV5J3JlIG5vdCByZWxldmFudCBmb3Igb3VyIEpTUCBwcm9wb3NhbCBsaXN0KQotCQlpZighcHJvcG9zYWwuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkKLQkJCWlmKHByb3Bvc2FsLmdldEtpbmQoKSA9PSBDb21wbGV0aW9uUHJvcG9zYWwuVFlQRV9SRUYpIHsKLQkJCQlTdHJpbmcgc2lnbmF0dXJlID0gU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSk7Ci0JCQkJU3RyaW5nIGNvbXBsZXRpb24gPSBTdHJpbmcudmFsdWVPZihwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCkpOwotCQkJCWlmKGNvbXBsZXRpb24uaW5kZXhPZihzaWduYXR1cmUpICE9IC0xKSB7Ci0JCQkJCWpzcFByb3Bvc2FsID0gY3JlYXRlQXV0b0ltcG9ydFByb3Bvc2FsKHByb3Bvc2FsKTsJCQkKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGRlZmF1bHQgYmVoYXZpb3IKLQkJCWlmKGpzcFByb3Bvc2FsID09IG51bGwpCi0JCQkJanNwUHJvcG9zYWwgPSBjcmVhdGVKc3BQcm9wb3NhbChwcm9wb3NhbCk7CQkKLQkJfQotCQlyZXR1cm4ganNwUHJvcG9zYWw7Ci0JfQotCi0JCi0JCi0JcHJpdmF0ZSBKU1BDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlQXV0b0ltcG9ydFByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQkKLQkJSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsID0gbnVsbDsKLQotCQlTdHJpbmcgc2lnbmF0dXJlID0gbmV3IFN0cmluZyhwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKTsKLQkJU3RyaW5nIGNvbXBsZXRpb24gPSBuZXcgU3RyaW5nKHByb3Bvc2FsLmdldENvbXBsZXRpb24oKSk7Ci0JCQotCQkvLyBpdCdzIGZ1bGx5IHF1YWxpZmllZCBzbyB3ZSBzaG91bGQKLQkJLy8gYWRkIGFuIGltcG9ydCBzdGF0ZW1lbnQKLQkJLy8gY3JlYXRlIGFuIGF1dG9pbXBvcnQgcHJvcG9zYWwKLQkJU3RyaW5nIG5ld0NvbXBsZXRpb24gPSBjb21wbGV0aW9uLnJlcGxhY2VBbGwoc2lnbmF0dXJlICsgIi4iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJLy8gamF2YSBvZmZzZXQKLQkJaW50IG9mZnNldCA9IHByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpOwotCQkvLyByZXBsYWNlbWVudCBsZW5ndGgKLQkJaW50IGxlbmd0aCA9IHByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSAtIG9mZnNldDsKLQkJLy8gdHJhbnNsYXRlIG9mZnNldCBmcm9tIEphdmEgPiBKU1AKLQkJb2Zmc2V0ID0gZlRyYW5zbGF0aW9uLmdldEpzcE9mZnNldChvZmZzZXQpOwotCQkvLyBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgbXVzdCBiZSBjYWxjdWxhdGVkCi0JCWludCBwb3NpdGlvbkFmdGVyID0gY2FsY3VsYXRlUG9zaXRpb25BZnRlcihwcm9wb3NhbCwgbmV3Q29tcGxldGlvbiwgb2Zmc2V0KTsKLQkJCi0JCS8vIGZyb20gamF2YSBwcm9wb3NhbAotCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBzdXBlci5jcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBqYXZhUHJvcG9zYWwuZ2V0SW1hZ2UoKTsKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBqYXZhUHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotCQlkaXNwbGF5U3RyaW5nID0gZ2V0VHJhbnNsYXRpb24oKS5maXh1cE1hbmdsZWROYW1lKGRpc3BsYXlTdHJpbmcpOwotCQlJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiA9IGphdmFQcm9wb3NhbC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLQkJLy8gZG9uJ3QgZG8gdGhpcywgaXQncyBzbG93Ci0JCS8vIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCWludCByZWxldmFuY2UgPSBqYXZhUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCk7Ci0JCQotCQlib29sZWFuIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUgPSB0cnVlOwotCQkKLQkJanNwUHJvcG9zYWwgPSBuZXcgQXV0b0ltcG9ydFByb3Bvc2FsKGNvbXBsZXRpb24sIG5ld0NvbXBsZXRpb24sIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbkFmdGVyLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLCBudWxsLCByZWxldmFuY2UsIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpOwotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCQkvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbiBkZW1hbmQKLQkJanNwUHJvcG9zYWwuc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhUHJvcG9zYWwpOwotCQkKLQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCX0KLQotCXByaXZhdGUgSlNQQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUpzcFByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQkKLQkJSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsOwotCQlTdHJpbmcgY29tcGxldGlvbiA9IFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldENvbXBsZXRpb24oKSk7Ci0JCS8vIGphdmEgb2Zmc2V0Ci0JCWludCBvZmZzZXQgPSBwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKTsKLQkJLy8gcmVwbGFjZW1lbnQgbGVuZ3RoCi0JCWludCBsZW5ndGggPSBwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCkgLSBvZmZzZXQ7Ci0JCS8vIHRyYW5zbGF0ZSBvZmZzZXQgZnJvbSBKYXZhID4gSlNQCi0JCW9mZnNldCA9IGZUcmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQob2Zmc2V0KTsKLQkJLy8gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIG11c3QgYmUgY2FsY3VsYXRlZAotCQlpbnQgcG9zaXRpb25BZnRlciA9IGNhbGN1bGF0ZVBvc2l0aW9uQWZ0ZXIocHJvcG9zYWwsIGNvbXBsZXRpb24sIG9mZnNldCk7Ci0JCQotCQkvLyBmcm9tIGphdmEgcHJvcG9zYWwKLQkJSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gc3VwZXIuY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCk7Ci0JCXByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCk7Ci0JCUltYWdlIGltYWdlID0gamF2YVByb3Bvc2FsLmdldEltYWdlKCk7Ci0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gamF2YVByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJZGlzcGxheVN0cmluZyA9IGdldFRyYW5zbGF0aW9uKCkuZml4dXBNYW5nbGVkTmFtZShkaXNwbGF5U3RyaW5nKTsKLQkJSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24gPSBqYXZhUHJvcG9zYWwuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCS8vIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCWludCByZWxldmFuY2UgPSBqYXZhUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCk7Ci0JCQotCQlib29sZWFuIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUgPSB0cnVlOwotCQkKLQkJanNwUHJvcG9zYWwgPSBuZXcgSlNQQ29tcGxldGlvblByb3Bvc2FsKGNvbXBsZXRpb24sIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbkFmdGVyLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLCBudWxsLCByZWxldmFuY2UsIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpOwotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCQkvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbiBkZW1hbmQKLQkJanNwUHJvcG9zYWwuc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhUHJvcG9zYWwpOwotCQkKLQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCX0KLQotCS8qKgotCSAqIENhY2x1YXRlcyB0aGUgd2hlcmUgdGhlIGN1cnNvciBzaG91bGQgYmUgYWZ0ZXIgYXBwbHlpbmcgdGhpcyBwcm9wb3NhbC4KLQkgKiBlZy4gbWV0aG9kKHwpIGlmIHRoZSBtZXRob2QgcHJvcG9zYWwgY2hvc2VuIGhhZCBwYXJhbXMuCi0JICogCi0JICogQHBhcmFtIHByb3Bvc2FsCi0JICogQHBhcmFtIGNvbXBsZXRpb24KLQkgKiBAcGFyYW0gY3VycmVudEN1cnNvck9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVQb3NpdGlvbkFmdGVyKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCwgU3RyaW5nIGNvbXBsZXRpb24sIGludCBjdXJyZW50Q3Vyc29yT2Zmc2V0KSB7Ci0JCS8vIGNhbGN1bGF0ZSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODM5OAotCQkvL2ludCBwb3NpdGlvbkFmdGVyID0gY3VycmVudEN1cnNvck9mZnNldCtjb21wbGV0aW9uLmxlbmd0aCgpOwotCQlpbnQgcG9zaXRpb25BZnRlciA9IGNvbXBsZXRpb24ubGVuZ3RoKCk7Ci0JCQotCQlpbnQga2luZCA9IHByb3Bvc2FsLmdldEtpbmQoKTsKLQkJCi0JCS8vIG1heSBuZWVkIGJldHRlciBsb2dpYyBoZXJlLi4uCi0JCS8vIHB1dCBjdXJzb3IgaW5zaWRlIHBhcmVudGhlc2lzIGlmIHRoZXJlJ3MgcGFyYW1zCi0JCS8vIG9ubHkgY2hlY2tpbmcgZm9yIGFueSBraW5kIG9mIGRlY2xhcmF0aW9uCi0JCWlmKGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiB8fCBraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfREVDTEFSQVRJT04gfHwga2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuUE9URU5USUFMX01FVEhPRF9ERUNMQVJBVElPTiB8fCBraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSB7Ci0JCQlTdHJpbmdbXSBwYXJhbXMgPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpKTsKLQkJCWlmKGNvbXBsZXRpb24ubGVuZ3RoKCkgPiAwICYmIHBhcmFtcy5sZW5ndGggPiAwKQotCQkJCXBvc2l0aW9uQWZ0ZXItLTsKLQkJfQotCQlyZXR1cm4gcG9zaXRpb25BZnRlcjsKLQl9Ci0JCi0Jc3RhdGljIGNoYXJbXSBnZXRUeXBlVHJpZ2dlcnMoKSB7Ci0JCXJldHVybiBUWVBFX1RSSUdHRVJTOwotCX0KLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbiBnZXRUcmFuc2xhdGlvbigpIHsKLQkJcmV0dXJuIGZUcmFuc2xhdGlvbjsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGFnbGliRGlyZWN0aXZlQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGFnbGliRGlyZWN0aXZlQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmY3ZDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFRhZ2xpYkRpcmVjdGl2ZUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZhY2V0TW9kdWxlQ29yZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JSmFyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRMRFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdEaXJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVVJMUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1AyME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUYWdsaWJEaXJlY3RpdmVDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXB1YmxpYyBKU1BUYWdsaWJEaXJlY3RpdmVDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotCVN0cmluZyBnZXRTbWFsbEltYWdlVVJMKElUYWdsaWJSZWNvcmQgdGFnbGliUmVjb3JkKSB7Ci0JCVN0cmluZyB1cmwgPSBudWxsOwotCQlzd2l0Y2ggKHRhZ2xpYlJlY29yZC5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQlJVExEUmVjb3JkIHJlY29yZCA9IChJVExEUmVjb3JkKSB0YWdsaWJSZWNvcmQ7Ci0JCQkJSVJlc291cmNlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocmVjb3JkLmdldFBhdGgoKSk7Ci0JCQkJaWYgKGZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsICYmIHJlY29yZC5nZXREZXNjcmlwdG9yKCkuZ2V0U21hbGxJY29uKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXVybCA9ICJmaWxlOiIgKyBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUoZmlsZS5nZXRGdWxsUGF0aCgpLCByZWNvcmQuZ2V0RGVzY3JpcHRvcigpLmdldFNtYWxsSWNvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQlJSmFyUmVjb3JkIHJlY29yZCA9IChJSmFyUmVjb3JkKSB0YWdsaWJSZWNvcmQ7Ci0JCQkJaWYgKHJlY29yZC5nZXREZXNjcmlwdG9yKCkuZ2V0U21hbGxJY29uKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCS8vIHVybCA9ICJmaWxlOiIgKwotCQkJCQkvLyBVUklIZWxwZXIubm9ybWFsaXplKHJlY29yZC5nZXREZXNjcmlwdG9yKCkuZ2V0U21hbGxJY29uKCksCi0JCQkJCS8vIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlRBR0RJUikgOiB7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgdGFnbGliUmVjb3JkOwotCQkJCWlmIChyZWNvcmQuZ2V0RGVzY3JpcHRvcigpLmdldFNtYWxsSWNvbigpLmxlbmd0aCgpID4gMCkgewotCQkJCQl1cmwgPSBVUklIZWxwZXIubm9ybWFsaXplKHJlY29yZC5nZXREZXNjcmlwdG9yKCkuZ2V0U21hbGxJY29uKCksIHJlY29yZC5nZXRVUkwoKS50b1N0cmluZygpLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlJUGF0aCBiYXNlUGF0aCA9IGdldEJhc2VQYXRoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJaWYgKGJhc2VQYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCi0JCS8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZCBoYXZlIGEgdmFsdWUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpKTsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKGkgPj0gMCkgewotCQkJbmFtZVJlZ2lvbiA9IG9wZW5SZWdpb25zLmdldChpLS0pOwotCQkJaWYgKG5hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbnVsbDsKLQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZU5hbWUgPSBvcGVuLmdldFRleHQobmFtZVJlZ2lvbik7Ci0KLQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCWN1cnJlbnRWYWx1ZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFRleHQoKTsKLQkJZWxzZQotCQkJY3VycmVudFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gbnVsbDsKLQkJLy8gZml4dXBzCi0JCWludCBzdGFydCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQlpbnQgbGVuZ3RoID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJaWYgKGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA+IFN0cmluZ1V0aWxzLnN0cmlwKGN1cnJlbnRWYWx1ZSkubGVuZ3RoKCkgJiYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCJcIiIpIHx8IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCInIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJbWF0Y2hTdHJpbmcgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKDEsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkpOwotCQl9Ci0JCWVsc2UKLQkJCW1hdGNoU3RyaW5nID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygwLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpKTsKLQkJYm9vbGVhbiBleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSAhPSBudWxsICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXI7Ci0JCWlmIChleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUpIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLmNsZWFyKCk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYWNyb3MoKS5jbGVhcigpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGxvd2VyQ2FzZU1hdGNoID0gbWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVVJJKSkgewotCQkJCUlUYWdsaWJSZWNvcmRbXSBhdmFpbGFibGVUYWdsaWJSZWNvcmRzID0gVGFnbGliSW5kZXguZ2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhiYXNlUGF0aCk7Ci0JCQkJLyoKLQkJCQkgKiBhIHNpbXBsZSBlbm91Z2ggd2F5IHRvIHJlbW92ZSBkdXBsaWNhdGVzIChyZXNvbHV0aW9uIGF0Ci0JCQkJICogcnVudGltZSB3b3VsZCBiZSBub25kZXRlcm1pbmlzdGljIGFueXdheSkKLQkJCQkgKi8KLQkJCQlNYXAgdXJpVG9SZWNvcmRzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKGludCB0YWdsaWJSZWNvcmROdW1iZXIgPSAwOyB0YWdsaWJSZWNvcmROdW1iZXIgPCBhdmFpbGFibGVUYWdsaWJSZWNvcmRzLmxlbmd0aDsgdGFnbGliUmVjb3JkTnVtYmVyKyspIHsKLQkJCQkJSVRhZ2xpYlJlY29yZCB0YWdsaWJSZWNvcmQgPSBhdmFpbGFibGVUYWdsaWJSZWNvcmRzW3RhZ2xpYlJlY29yZE51bWJlcl07Ci0JCQkJCUlUYWdsaWJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSB0YWdsaWJSZWNvcmQuZ2V0RGVzY3JpcHRvcigpOwotCQkJCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCQkJc3dpdGNoICh0YWdsaWJSZWNvcmQuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQkJCQljYXNlIElUYWdsaWJSZWNvcmQuVVJMIDoKLQkJCQkJCQl1cmkgPSBkZXNjcmlwdG9yLmdldFVSSSgpOwotCQkJCQkJCXVyaVRvUmVjb3Jkcy5wdXQodXJpLCB0YWdsaWJSZWNvcmQpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJVGFnbGliUmVjb3JkLkpBUiA6IHsKLQkJCQkJCQlJUGF0aCBsb2NhdGlvbiA9ICgoSUphclJlY29yZCkgdGFnbGliUmVjb3JkKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKGxvY2F0aW9uKTsKLQkJCQkJCQlJUGF0aCBsb2NhbENvbnRleHRSb290ID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5jb21wdXRlV2ViQ29udGVudFJvb3RQYXRoKGJhc2VQYXRoKTsKLQkJCQkJCQlmb3IgKGludCBmaWxlTnVtYmVyID0gMDsgZmlsZU51bWJlciA8IGZpbGVzLmxlbmd0aDsgZmlsZU51bWJlcisrKSB7Ci0JCQkJCQkJCWlmIChsb2NhbENvbnRleHRSb290LmlzUHJlZml4T2YoZmlsZXNbZmlsZU51bWJlcl0uZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQkJCQkJCXVyaSA9IElQYXRoLlNFUEFSQVRPUiArIGZpbGVzW2ZpbGVOdW1iZXJdLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhsb2NhbENvbnRleHRSb290LnNlZ21lbnRDb3VudCgpKS50b1N0cmluZygpOwotCQkJCQkJCQkJdXJpVG9SZWNvcmRzLnB1dCh1cmksIHRhZ2xpYlJlY29yZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQl1cmkgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmdldFJ1bnRpbWVQYXRoKGZpbGVzW2ZpbGVOdW1iZXJdLmdldEZ1bGxQYXRoKCkpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQl1cmlUb1JlY29yZHMucHV0KHVyaSwgdGFnbGliUmVjb3JkKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWNhc2UgSVRhZ2xpYlJlY29yZC5UTEQgOiB7Ci0JCQkJCQkJSVBhdGggcGF0aCA9ICgoSVRMRFJlY29yZCkgdGFnbGliUmVjb3JkKS5nZXRQYXRoKCk7Ci0JCQkJCQkJSVBhdGggbG9jYWxDb250ZXh0Um9vdCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuY29tcHV0ZVdlYkNvbnRlbnRSb290UGF0aChiYXNlUGF0aCk7Ci0JCQkJCQkJaWYgKGxvY2FsQ29udGV4dFJvb3QuaXNQcmVmaXhPZihwYXRoKSkgewotCQkJCQkJCQl1cmkgPSBJUGF0aC5TRVBBUkFUT1IgKyBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobG9jYWxDb250ZXh0Um9vdC5zZWdtZW50Q291bnQoKSkudG9TdHJpbmcoKTsKLQkJCQkJCQkJdXJpVG9SZWNvcmRzLnB1dCh1cmksIHRhZ2xpYlJlY29yZCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQl1cmkgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmdldFJ1bnRpbWVQYXRoKHBhdGgpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCXVyaVRvUmVjb3Jkcy5wdXQodXJpLCB0YWdsaWJSZWNvcmQpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvKgotCQkJCSAqIHVzZSB0aGUgcmVjb3JkcyBhbmQgdGhlaXIgZGVzY3JpcHRvcnMgdG8gY29uc3RydWN0Ci0JCQkJICogcHJvcG9zYWxzCi0JCQkJICovCi0JCQkJT2JqZWN0W10gdXJpcyA9IHVyaVRvUmVjb3Jkcy5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgdXJpTnVtYmVyID0gMDsgdXJpTnVtYmVyIDwgdXJpcy5sZW5ndGg7IHVyaU51bWJlcisrKSB7Ci0JCQkJCVN0cmluZyB1cmkgPSB1cmlzW3VyaU51bWJlcl0udG9TdHJpbmcoKTsKLQkJCQkJSVRhZ2xpYlJlY29yZCB0YWdsaWJSZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgdXJpVG9SZWNvcmRzLmdldCh1cmkpOwotCQkJCQlJVGFnbGliRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKHRhZ2xpYlJlY29yZCkuZ2V0RGVzY3JpcHRvcigpOwotCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCAmJiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCB1cmkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5zdGFydHNXaXRoKGxvd2VyQ2FzZU1hdGNoKSkpIHsKLQkJCQkJCVN0cmluZyB1cmwgPSBnZXRTbWFsbEltYWdlVVJMKHRhZ2xpYlJlY29yZCk7Ci0JCQkJCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSlNQVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcih1cmwpOwotCQkJCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsICYmIHVybCAhPSBudWxsKSB7Ci0JCQkJCQkJVVJMIGltYWdlVVJMOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWltYWdlVVJMID0gbmV3IFVSTCh1cmwpOwotCQkJCQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCQkJCQkJCUpTUFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dCh1cmwsIGltYWdlRGVzY3JpcHRvcik7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKSArICI8YnIvPiIgKyBkZXNjcmlwdG9yLmdldFRsaWJWZXJzaW9uKCk7Ci0JCQkJCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWltYWdlID0gSlNQVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHVybCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFKTsKLQkJCQkJCX0KLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIHVyaSArICJcIiIsIHN0YXJ0LCBsZW5ndGgsIHVyaS5sZW5ndGgoKSArIDIsIGltYWdlLCB1cmksIG51bGwsIGFkZGl0aW9uYWxJbmZvLCBJUmVsZXZhbmNlQ29uc3RhbnRzLlJfTk9ORSk7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSKSkgewotCQkJCUlUYWdsaWJSZWNvcmRbXSBhdmFpbGFibGVUYWdsaWJSZWNvcmRzID0gVGFnbGliSW5kZXguZ2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhiYXNlUGF0aCk7Ci0JCQkJLyoKLQkJCQkgKiBhIHNpbXBsZSBlbm91Z2ggd2F5IHRvIHJlbW92ZSBkdXBsaWNhdGVzIChyZXNvbHV0aW9uIGF0Ci0JCQkJICogcnVudGltZSB3b3VsZCBiZSBub25kZXRlcm1pbmlzdGljIGFueXdheSkKLQkJCQkgKi8KLQkJCQlNYXAgdXJpVG9SZWNvcmRzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKGludCB0YWdsaWJSZWNvcmROdW1iZXIgPSAwOyB0YWdsaWJSZWNvcmROdW1iZXIgPCBhdmFpbGFibGVUYWdsaWJSZWNvcmRzLmxlbmd0aDsgdGFnbGliUmVjb3JkTnVtYmVyKyspIHsKLQkJCQkJSVRhZ2xpYlJlY29yZCB0YWdsaWJSZWNvcmQgPSBhdmFpbGFibGVUYWdsaWJSZWNvcmRzW3RhZ2xpYlJlY29yZE51bWJlcl07Ci0JCQkJCVN0cmluZyB1cmkgPSBudWxsOwotCQkJCQlpZiAodGFnbGliUmVjb3JkLmdldFJlY29yZFR5cGUoKSA9PSBJVGFnbGliUmVjb3JkLlRBR0RJUikgewotCQkJCQkJSVBhdGggcGF0aCA9ICgoSVRhZ0RpclJlY29yZCkgdGFnbGliUmVjb3JkKS5nZXRQYXRoKCk7Ci0JCQkJCQlJUGF0aCBsb2NhbENvbnRleHRSb290ID0gVGFnbGliSW5kZXguZ2V0Q29udGV4dFJvb3QoYmFzZVBhdGgpOwotCQkJCQkJaWYgKGxvY2FsQ29udGV4dFJvb3QuaXNQcmVmaXhPZihwYXRoKSkgewotCQkJCQkJCXVyaSA9IElQYXRoLlNFUEFSQVRPUiArIHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhsb2NhbENvbnRleHRSb290LnNlZ21lbnRDb3VudCgpKS50b1N0cmluZygpOwotCQkJCQkJCXVyaVRvUmVjb3Jkcy5wdXQodXJpLCB0YWdsaWJSZWNvcmQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogdXNlIHRoZSByZWNvcmRzIGFuZCB0aGVpciBkZXNjcmlwdG9ycyB0byBjb25zdHJ1Y3QKLQkJCQkgKiBwcm9wb3NhbHMKLQkJCQkgKi8KLQkJCQlPYmplY3RbXSB1cmlzID0gdXJpVG9SZWNvcmRzLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJCQlmb3IgKGludCB1cmlOdW1iZXIgPSAwOyB1cmlOdW1iZXIgPCB1cmlzLmxlbmd0aDsgdXJpTnVtYmVyKyspIHsKLQkJCQkJU3RyaW5nIHVyaSA9IHVyaXNbdXJpTnVtYmVyXS50b1N0cmluZygpOwotCQkJCQlJVGFnbGliUmVjb3JkIHRhZ2xpYlJlY29yZCA9IChJVGFnbGliUmVjb3JkKSB1cmlUb1JlY29yZHMuZ2V0KHVyaSk7Ci0JCQkJCUlUYWdsaWJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAodGFnbGliUmVjb3JkKS5nZXREZXNjcmlwdG9yKCk7Ci0JCQkJCWlmICh1cmkgIT0gbnVsbCAmJiB1cmkubGVuZ3RoKCkgPiAwICYmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHVyaS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpLnN0YXJ0c1dpdGgobG93ZXJDYXNlTWF0Y2gpKSkgewotCQkJCQkJU3RyaW5nIHVybCA9IGdldFNtYWxsSW1hZ2VVUkwodGFnbGliUmVjb3JkKTsKLQkJCQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQkJCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCQkJaW1hZ2VEZXNjcmlwdG9yID0gSlNQVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcih1cmwpOwotCQkJCQkJfQotCQkJCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsICYmIHVybCAhPSBudWxsKSB7Ci0JCQkJCQkJVVJMIGltYWdlVVJMOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWltYWdlVVJMID0gbmV3IFVSTCh1cmwpOwotCQkJCQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCQkJCQkJCUpTUFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dCh1cmwsIGltYWdlRGVzY3JpcHRvcik7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKSArICI8YnIvPiIgKyBkZXNjcmlwdG9yLmdldFRsaWJWZXJzaW9uKCk7Ci0JCQkJCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWltYWdlID0gSlNQVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHVybCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFKTsKLQkJCQkJCX0KLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIHVyaSArICJcIiIsIHN0YXJ0LCBsZW5ndGgsIHVyaS5sZW5ndGgoKSArIDIsIGltYWdlLCB1cmksIG51bGwsIGFkZGl0aW9uYWxJbmZvLCBJUmVsZXZhbmNlQ29uc3RhbnRzLlJfTk9ORSk7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUFJFRklYKSkgewotCQkJCU5vZGUgdXJpQXR0ciA9IG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVVJJKTsKLQkJCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCQlpZiAodXJpQXR0ciAhPSBudWxsKSB7Ci0JCQkJCXVyaSA9IHVyaUF0dHIuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCUlUYWdsaWJSZWNvcmRbXSBhdmFpbGFibGVUYWdsaWJSZWNvcmRzID0gVGFnbGliSW5kZXguZ2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhiYXNlUGF0aCk7Ci0JCQkJCU1hcCBwcmVmaXhNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlmb3IgKGludCB0YWdsaWJyZWNvcmROdW1iZXIgPSAwOyB0YWdsaWJyZWNvcmROdW1iZXIgPCBhdmFpbGFibGVUYWdsaWJSZWNvcmRzLmxlbmd0aDsgdGFnbGlicmVjb3JkTnVtYmVyKyspIHsKLQkJCQkJCUlUYWdsaWJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBhdmFpbGFibGVUYWdsaWJSZWNvcmRzW3RhZ2xpYnJlY29yZE51bWJlcl0uZ2V0RGVzY3JpcHRvcigpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXNjcmlwdG9yLmdldFVSSSgpICE9IG51bGwgJiYgZGVzY3JpcHRvci5nZXRVUkkoKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpLmVxdWFscyh1cmkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKSkpIHsKLQkJCQkJCQlTdHJpbmcgc2hvcnROYW1lID0gZGVzY3JpcHRvci5nZXRTaG9ydE5hbWUoKS50cmltKCk7Ci0JCQkJCQkJaWYgKHNob3J0TmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0JCQkJCQkJCWZvciAoaW50IGNoYXJhY3RlciA9IDA7IGNoYXJhY3RlciA8IHNob3J0TmFtZS5sZW5ndGgoKTsgY2hhcmFjdGVyKyspIHsKLQkJCQkJCQkJCXZhbGlkID0gdmFsaWQgJiYgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc2hvcnROYW1lLmNoYXJBdChjaGFyYWN0ZXIpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAodmFsaWQpIHsKLQkJCQkJCQkJCXByZWZpeE1hcC5wdXQoc2hvcnROYW1lLCBkZXNjcmlwdG9yKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlPYmplY3QgcHJlZml4ZXNbXSA9IHByZWZpeE1hcC5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJlZml4ZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCVN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBwcmVmaXhlc1tqXTsKLQkJCQkJCUlUYWdsaWJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoSVRhZ2xpYkRlc2NyaXB0b3IpIHByZWZpeE1hcC5nZXQocHJlZml4KTsKLQkJCQkJCUltYWdlIGltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgcHJlZml4ICsgIlwiIiwgc3RhcnQsIGxlbmd0aCwgcHJlZml4Lmxlbmd0aCgpICsgMiwgaW1hZ2UsIHByZWZpeCwgbnVsbCwgZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpLCBJUmVsZXZhbmNlQ29uc3RhbnRzLlJfTk9ORSk7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCU5vZGUgZGlyQXR0ciA9IG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSKTsKLQkJCQkJaWYgKGRpckF0dHIgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGRpciA9IGRpckF0dHIuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQlpZiAoZGlyICE9IG51bGwpIHsKLQkJCQkJCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IFRhZ2xpYkluZGV4LnJlc29sdmUoYmFzZVBhdGgudG9TdHJpbmcoKSwgZGlyLCBmYWxzZSk7Ci0JCQkJCQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQkJCQkJCUlUYWdsaWJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSByZWNvcmQuZ2V0RGVzY3JpcHRvcigpOwotCQkJCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQlTdHJpbmcgc2hvcnROYW1lID0gZGVzY3JpcHRvci5nZXRTaG9ydE5hbWUoKTsKLQotCQkJCQkJCQkJSW1hZ2UgaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyBzaG9ydE5hbWUgKyAiXCIiLCBzdGFydCwgbGVuZ3RoLCBzaG9ydE5hbWUubGVuZ3RoKCkgKyAyLCBpbWFnZSwgc2hvcnROYW1lLCBudWxsLCBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCksIElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FKTsKLQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCWlmIChkaXIuc3RhcnRzV2l0aCgiL1dFQi1JTkYvIikpIHsKLQkJCQkJCQkJCQlkaXIgPSBkaXIuc3Vic3RyaW5nKDkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJU3RyaW5nIHByZWZpeCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoZGlyLCAiLyIsICItIik7Ci0KLQkJCQkJCQkJCUltYWdlIGltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgcHJlZml4ICsgIlwiIiwgc3RhcnQsIGxlbmd0aCwgcHJlZml4Lmxlbmd0aCgpICsgMiwgaW1hZ2UsIHByZWZpeCwgbnVsbCwgbnVsbCwgSVJlbGV2YW5jZUNvbnN0YW50cy5SX05PTkUpOwotCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwcm9qZWN0IHJlcXVlc3QgaXMgaW4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQYXRoIGdldEJhc2VQYXRoKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSVBhdGggYmFzZWxvY2F0aW9uID0gbnVsbDsKLQotCQlpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHJlcXVlc3QuZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJYmFzZWxvY2F0aW9uID0gbmV3IFBhdGgobG9jYXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYmFzZWxvY2F0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzYTIwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIENvbXBsZXRpb24gcHJvY2Vzc29yIGZvciBKU1AgVGVtcGxhdGVzLiBNb3N0IG9mIHRoZSB3b3JrIGlzIGFscmVhZHkgZG9uZSBieQotICogdGhlIEpTUCBDb250ZW50IEFzc2lzdCBwcm9jZXNzb3IsIHNvIGJ5IHRoZSB0aW1lIHRoZQotICogSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGlzIGFza2VkIGZvciBjb250ZW50IGFzc2lzdCBwcm9wb3NhbHMsIHRoZQotICoganNwIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciBoYXMgYWxyZWFkeSBzZXQgdGhlIGNvbnRleHQgdHlwZSBmb3IKLSAqIHRlbXBsYXRlcy4KLSAqLwotY2xhc3MgSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGV4dGVuZHMgVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9wb3NhbENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlyZXR1cm4gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMikuZ2V0UmVsZXZhbmNlKCkgLSAoKFRlbXBsYXRlUHJvcG9zYWwpIG8xKS5nZXRSZWxldmFuY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgZmdQcm9wb3NhbENvbXBhcmF0b3IgPSBuZXcgUHJvcG9zYWxDb21wYXJhdG9yKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRleHRUeXBlSWQgPSBudWxsOwotCi0JLyoKLQkgKiBDb3BpZWQgZnJvbSBzdXBlciBjbGFzcyBleGNlcHQgaW5zdGVhZCBvZiBjYWxsaW5nIGNyZWF0ZUNvbnRleHQodmlld2VyLAotCSAqIHJlZ2lvbikgY2FsbCBjcmVhdGVDb250ZXh0KHZpZXdlciwgcmVnaW9uLCBvZmZzZXQpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCi0JCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgdmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJLy8gYWRqdXN0IG9mZnNldCB0byBlbmQgb2Ygbm9ybWFsaXplZCBzZWxlY3Rpb24KLQkJaWYgKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSA9PSBvZmZzZXQpCi0JCQlvZmZzZXQgPSBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJU3RyaW5nIHByZWZpeCA9IGV4dHJhY3RQcmVmaXgodmlld2VyLCBvZmZzZXQpOwotCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbihvZmZzZXQgLSBwcmVmaXgubGVuZ3RoKCksIHByZWZpeC5sZW5ndGgoKSk7Ci0JCVRlbXBsYXRlQ29udGV4dCBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQotCQkvLyBuYW1lIG9mIHRoZSBzZWxlY3Rpb24gdmFyaWFibGVzIHtsaW5lLCB3b3JkfV9zZWxlY3Rpb24KLQkJY29udGV4dC5zZXRWYXJpYWJsZSgic2VsZWN0aW9uIiwgc2VsZWN0aW9uLmdldFRleHQoKSk7IC8vIC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZVtdIHRlbXBsYXRlcyA9IGdldFRlbXBsYXRlcyhjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSk7Ci0KLQkJTGlzdCBtYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSB0ZW1wbGF0ZXNbaV07Ci0JCQl0cnkgewotCQkJCWNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS52YWxpZGF0ZSh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQkJfQotCQkJY2F0Y2ggKFRlbXBsYXRlRXhjZXB0aW9uIGUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0ZW1wbGF0ZS5tYXRjaGVzKHByZWZpeCwgY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLmdldElkKCkpKQotCQkJCW1hdGNoZXMuYWRkKGNyZWF0ZVByb3Bvc2FsKHRlbXBsYXRlLCBjb250ZXh0LCAoSVJlZ2lvbikgcmVnaW9uLCBnZXRSZWxldmFuY2UodGVtcGxhdGUsIHByZWZpeCkpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQobWF0Y2hlcywgZmdQcm9wb3NhbENvbXBhcmF0b3IpOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBtYXRjaGVzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbbWF0Y2hlcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29uY3JldGUgdGVtcGxhdGUgY29udGV4dCBmb3IgdGhlIGdpdmVuIHJlZ2lvbiBpbiB0aGUKLQkgKiBkb2N1bWVudC4gVGhpcyBpbnZvbHZlcyBmaW5kaW5nIG91dCB3aGljaCBjb250ZXh0IHR5cGUgaXMgdmFsaWQgYXQgdGhlCi0JICogZ2l2ZW4gbG9jYXRpb24sIGFuZCB0aGVuIGNyZWF0aW5nIGEgY29udGV4dCBvZiB0aGlzIHR5cGUuIFRoZSBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIDxjb2RlPlNtYXJ0UmVwbGFjZVRlbXBsYXRlQ29udGV4dDwvY29kZT4gZm9yCi0JICogdGhlIGNvbnRleHQgdHlwZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uIFRoaXMgdGFrZXMgdGhlIG9mZnNldCBhdCB3aGljaAotCSAqIGNvbnRlbnQgYXNzaXN0IHdhcyBpbnZva2VkIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIGZvciB3aGljaCB0aGUgY29udGV4dCBpcyBjcmVhdGVkCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiBpbnRvIDxjb2RlPmRvY3VtZW50PC9jb2RlPiBmb3Igd2hpY2ggdGhlCi0JICogICAgICAgICAgICBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgb2Zmc2V0IHdoZXJlIGNvbnRlbnQgYXNzaXN0IHdhcyBpbnZva2VkCi0JICogQHJldHVybiBhIHRlbXBsYXRlIGNvbnRleHQgdGhhdCBjYW4gaGFuZGxlIHRlbXBsYXRlIGluc2VydGlvbiBhdCB0aGUKLQkgKiAgICAgICAgIGdpdmVuIGxvY2F0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVDb250ZXh0IGNyZWF0ZUNvbnRleHQoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyBwcmV0dHkgbXVjaCBzYW1lIGNvZGUgYXMgc3VwZXIuY3JlYXRlQ29udGV4dCBleGNlcHQgY3JlYXRlCi0JCS8vIFNtYXJ0UmVwbGFjZVRlbXBsYXRlQ29udGV4dAotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIGNvbnRleHRUeXBlID0gZ2V0Q29udGV4dFR5cGUodmlld2VyLCByZWdpb24pOwotCQlpZiAoY29udGV4dFR5cGUgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlyZXR1cm4gbmV3IFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KGNvbnRleHRUeXBlLCBkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCksIG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlUHJvcG9zYWwoVGVtcGxhdGUgdGVtcGxhdGUsIFRlbXBsYXRlQ29udGV4dCBjb250ZXh0LCBJUmVnaW9uIHJlZ2lvbiwgaW50IHJlbGV2YW5jZSkgewotCQlyZXR1cm4gbmV3IEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIHJlZ2lvbiwgZ2V0SW1hZ2UodGVtcGxhdGUpLCByZWxldmFuY2UpOwotCX0KLQotCXByb3RlY3RlZCBUZW1wbGF0ZUNvbnRleHRUeXBlIGdldENvbnRleHRUeXBlKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24pIHsKLQkJVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlID0gbnVsbDsKLQotCQlDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpCi0JCQl0eXBlID0gcmVnaXN0cnkuZ2V0Q29udGV4dFR5cGUoZkNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgewotCQkvLyBqdXN0IHJldHVybiB0aGUgc2FtZSBpbWFnZSBmb3Igbm93Ci0JCXJldHVybiBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19KU1ApOwotCX0KLQotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCX0KLQotCXByb3RlY3RlZCBUZW1wbGF0ZVtdIGdldFRlbXBsYXRlcyhTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZXNbXSA9IG51bGw7Ci0KLQkJVGVtcGxhdGVTdG9yZSBzdG9yZSA9IGdldFRlbXBsYXRlU3RvcmUoKTsKLQkJaWYgKHN0b3JlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZXMgPSBzdG9yZS5nZXRUZW1wbGF0ZXMoY29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb250ZXh0VHlwZShTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlmQ29udGV4dFR5cGVJZCA9IGNvbnRleHRUeXBlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFVzZUJlYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMDk4NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEpTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0KLQlwdWJsaWMgSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0KLQkJLy8gRmluZCB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIHdoaWNoIHRoaXMgcG9zaXRpb24gc2hvdWxkIGhhdmUgYSB2YWx1ZQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9wZW4gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvcGVuUmVnaW9ucyA9IG9wZW4uZ2V0UmVnaW9ucygpOwotCQlpbnQgaSA9IG9wZW5SZWdpb25zLmluZGV4T2YoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkpOwotCQlpZiAoaSA8IDApCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaSA+PSAwKSB7Ci0JCQluYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGktLSk7Ci0JCQlpZiAobmFtZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKQotCQkJYXR0cmlidXRlTmFtZSA9IG9wZW4uZ2V0VGV4dChuYW1lUmVnaW9uKTsKLQotCQlTdHJpbmcgY3VycmVudFZhbHVlID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJY3VycmVudFZhbHVlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0VGV4dCgpOwotCQllbHNlCi0JCQljdXJyZW50VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBudWxsOwotCQkvLyBmaXh1cHMKLQkJaW50IHN0YXJ0ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCk7Ci0JCWludCBsZW5ndGggPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQlpZiAoY3VycmVudFZhbHVlLmxlbmd0aCgpID4gU3RyaW5nVXRpbHMuc3RyaXAoY3VycmVudFZhbHVlKS5sZW5ndGgoKSAmJiAoY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoIlwiIikgfHwgY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoIiciKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQltYXRjaFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoMSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSk7Ci0JCQlzdGFydCsrOwotCQkJbGVuZ3RoID0gbWF0Y2hTdHJpbmcubGVuZ3RoKCk7Ci0JCX0gZWxzZQotCQkJbWF0Y2hTdHJpbmcgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKDAsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkpOwotCQlib29sZWFuIGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpICE9IG51bGwgJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLQkJaWYgKGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSkgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuY2xlYXIoKTsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hY3JvcygpLmNsZWFyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0NMQVNTKSkgewotCQkJCS8vIGNsYXNzIGlzIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gY2xhc3NQcm9wb3NhbHMgPSBKYXZhVHlwZUZpbmRlci5nZXRDbGFzc1Byb3Bvc2FscyhyZXNvdXJjZSwgc3RhcnQsIGxlbmd0aCk7Ci0JCQkJaWYgKGNsYXNzUHJvcG9zYWxzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc1Byb3Bvc2Fscy5sZW5ndGg7IGorKykgewotCQkJCQkJSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAoSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwpIGNsYXNzUHJvcG9zYWxzW2pdOwotCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgcHJvcG9zYWwuZ2V0UXVhbGlmaWVkTmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSB8fCBwcm9wb3NhbC5nZXRTaG9ydE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSkpIHsKLQkJCQkvLyB0eXBlIGlzIHRoZSBtb3JlIGdlbmVyYWwgdHlwZSBmb3IgdGhlIGJlYW4KLQkJCQkvLyB3aGljaCBtZWFucyBpdCBtYXkgYmUgYW4gaW50ZXJmYWNlCi0JCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSB0eXBlUHJvcG9zYWxzID0gSmF2YVR5cGVGaW5kZXIuZ2V0VHlwZVByb3Bvc2FscyhyZXNvdXJjZSwgc3RhcnQsIGxlbmd0aCk7Ci0JCQkJaWYgKHR5cGVQcm9wb3NhbHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVQcm9wb3NhbHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gKEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSB0eXBlUHJvcG9zYWxzW2pdOwotCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgcHJvcG9zYWwuZ2V0UXVhbGlmaWVkTmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSB8fCBwcm9wb3NhbC5nZXRTaG9ydE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQkVBTl9OQU1FKSkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYmVhbk5hbWVQcm9wb3NhbHMgPSBKYXZhVHlwZUZpbmRlci5nZXRCZWFuUHJvcG9zYWxzKHJlc291cmNlLCBzdGFydCwgbGVuZ3RoKTsKLQkJCQlpZiAoYmVhbk5hbWVQcm9wb3NhbHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGJlYW5OYW1lUHJvcG9zYWxzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAoYmVhbk5hbWVQcm9wb3NhbHNbal0gaW5zdGFuY2VvZiBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHsKLQkJCQkJCQlKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IChKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCkgYmVhbk5hbWVQcm9wb3NhbHNbal07Ci0JCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSkKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJfSBlbHNlIGlmIChiZWFuTmFtZVByb3Bvc2Fsc1tqXSBpbnN0YW5jZW9mIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCQkJCQkJSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAoSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwpIGJlYW5OYW1lUHJvcG9zYWxzW2pdOwotCQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHByb3Bvc2FsLmdldFF1YWxpZmllZE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkgfHwgcHJvcG9zYWwuZ2V0U2hvcnROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpKQotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHByb2plY3QgcmVxdWVzdCBpcyBpbgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJU3RyaW5nIGJhc2Vsb2NhdGlvbiA9IG51bGw7Ci0KLQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSByZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSByZWdpb24uZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJYmFzZWxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiYXNlbG9jYXRpb24gIT0gbnVsbCkgewotCQkJLy8gY29waWVkIGZyb20gSlNQVHJhbnNsYXRpb25BZGFwdGVyI2dldEphdmFQcm9qZWN0Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoYmFzZWxvY2F0aW9uKTsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJZmlsZSA9IHJvb3QuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQl9Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhUGFyYW1ldGVyTGlzdFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVBhcmFtZXRlckxpc3RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzYTRjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhUGFyYW1ldGVyTGlzdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci0KLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQYXJhbWV0ZXJMaXN0VmFsaWRhdG9yIGltcGxlbWVudHMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciwgSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciB7Ci0KLQlwcml2YXRlIGludCBmUG9zaXRpb247Ci0JcHJpdmF0ZSBJVGV4dFZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgSUNvbnRleHRJbmZvcm1hdGlvbiBmSW5mb3JtYXRpb247Ci0KLQlwcml2YXRlIGludCBmQ3VycmVudFBhcmFtZXRlcjsKLQotCS8qKgotCSAqIEBzZWUgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24sCi0JICogICAgICBJVGV4dFZpZXdlciwgaW50KQotCSAqIEBzZWUgSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciNpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24sCi0JICogICAgICBJVGV4dFZpZXdlciwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCWZQb3NpdGlvbiA9IGRvY3VtZW50UG9zaXRpb247Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZJbmZvcm1hdGlvbiA9IGluZm87Ci0KLQkJZkN1cnJlbnRQYXJhbWV0ZXIgPSAtMTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDb21tZW50RW5kKElEb2N1bWVudCBkLCBpbnQgcG9zLCBpbnQgZW5kKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAocG9zIDwgZW5kKSB7Ci0JCQljaGFyIGN1cnIgPSBkLmdldENoYXIocG9zKTsKLQkJCXBvcysrOwotCQkJaWYgKGN1cnIgPT0gJyonKSB7Ci0JCQkJaWYgKHBvcyA8IGVuZCAmJiBkLmdldENoYXIocG9zKSA9PSAnLycpIHsKLQkJCQkJcmV0dXJuIHBvcyArIDE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0U3RyaW5nRW5kKElEb2N1bWVudCBkLCBpbnQgcG9zLCBpbnQgZW5kLCBjaGFyIGNoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAocG9zIDwgZW5kKSB7Ci0JCQljaGFyIGN1cnIgPSBkLmdldENoYXIocG9zKTsKLQkJCXBvcysrOwotCQkJaWYgKGN1cnIgPT0gJ1xcJykgewotCQkJCS8vIGlnbm9yZSBlc2NhcGVkIGNoYXJhY3RlcnMKLQkJCQlwb3MrKzsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnIgPT0gY2gpIHsKLQkJCQlyZXR1cm4gcG9zOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q2hhckNvdW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBjaGFyIGluY3JlbWVudCwgY2hhciBkZWNyZW1lbnQsIGJvb2xlYW4gY29uc2lkZXJOZXN0aW5nKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCi0JCUFzc2VydC5pc1RydWUoKGluY3JlbWVudCAhPSAwIHx8IGRlY3JlbWVudCAhPSAwKSAmJiBpbmNyZW1lbnQgIT0gZGVjcmVtZW50KTsKLQotCQlpbnQgbmVzdGluZ0xldmVsID0gMDsKLQkJaW50IGNoYXJDb3VudCA9IDA7Ci0JCXdoaWxlIChzdGFydCA8IGVuZCkgewotCQkJY2hhciBjdXJyID0gZG9jdW1lbnQuZ2V0Q2hhcihzdGFydCsrKTsKLQkJCXN3aXRjaCAoY3VycikgewotCQkJCWNhc2UgJy8nIDoKLQkJCQkJaWYgKHN0YXJ0IDwgZW5kKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBkb2N1bWVudC5nZXRDaGFyKHN0YXJ0KTsKLQkJCQkJCWlmIChuZXh0ID09ICcqJykgewotCQkJCQkJCS8vIGEgY29tbWVudCBzdGFydHMsIGFkdmFuY2UgdG8gdGhlIGNvbW1lbnQgZW5kCi0JCQkJCQkJc3RhcnQgPSBnZXRDb21tZW50RW5kKGRvY3VtZW50LCBzdGFydCArIDEsIGVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChuZXh0ID09ICcvJykgewotCQkJCQkJCS8vICcvLyctY29tbWVudDogbm90aGluZyB0byBkbyBhbnltb3JlIG9uIHRoaXMKLQkJCQkJCQkvLyBsaW5lCi0JCQkJCQkJc3RhcnQgPSBlbmQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnKicgOgotCQkJCQlpZiAoc3RhcnQgPCBlbmQpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGRvY3VtZW50LmdldENoYXIoc3RhcnQpOwotCQkJCQkJaWYgKG5leHQgPT0gJy8nKSB7Ci0JCQkJCQkJLy8gd2UgaGF2ZSBiZWVuIGluIGEgY29tbWVudDogZm9yZ2V0IHdoYXQgd2UgcmVhZAotCQkJCQkJCS8vIGJlZm9yZQotCQkJCQkJCWNoYXJDb3VudCA9IDA7Ci0JCQkJCQkJKytzdGFydDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlICciJyA6Ci0JCQkJY2FzZSAnXCcnIDoKLQkJCQkJc3RhcnQgPSBnZXRTdHJpbmdFbmQoZG9jdW1lbnQsIHN0YXJ0LCBlbmQsIGN1cnIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQotCQkJCQlpZiAoY29uc2lkZXJOZXN0aW5nKSB7Ci0KLQkJCQkJCWlmICgnKCcgPT0gY3VycikKLQkJCQkJCQkrK25lc3RpbmdMZXZlbDsKLQkJCQkJCWVsc2UgaWYgKCcpJyA9PSBjdXJyKQotCQkJCQkJCS0tbmVzdGluZ0xldmVsOwotCi0JCQkJCQlpZiAobmVzdGluZ0xldmVsICE9IDApCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlpZiAoaW5jcmVtZW50ICE9IDApIHsKLQkJCQkJCWlmIChjdXJyID09IGluY3JlbWVudCkKLQkJCQkJCQkrK2NoYXJDb3VudDsKLQkJCQkJfQotCi0JCQkJCWlmIChkZWNyZW1lbnQgIT0gMCkgewotCQkJCQkJaWYgKGN1cnIgPT0gZGVjcmVtZW50KQotCQkJCQkJCS0tY2hhckNvdW50OwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hhckNvdW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCBwb3NpdGlvbikgewotCi0JCXRyeSB7Ci0JCQlpZiAocG9zaXRpb24gPCBmUG9zaXRpb24pCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlJUmVnaW9uIGxpbmUgPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChmUG9zaXRpb24pOwotCi0JCQlpZiAocG9zaXRpb24gPCBsaW5lLmdldE9mZnNldCgpIHx8IHBvc2l0aW9uID49IGRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJcmV0dXJuIChnZXRDaGFyQ291bnQoZG9jdW1lbnQsIGZQb3NpdGlvbiwgcG9zaXRpb24sICcoJywgJyknLCBmYWxzZSkgPj0gMCk7Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyI3VwZGF0ZVByZXNlbnRhdGlvbihpbnQsCi0JICogICAgICBUZXh0UHJlc2VudGF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVByZXNlbnRhdGlvbihpbnQgcG9zaXRpb24sIFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0KLQkJaW50IGN1cnJlbnRQYXJhbWV0ZXIgPSAtMTsKLQotCQl0cnkgewotCQkJY3VycmVudFBhcmFtZXRlciA9IGdldENoYXJDb3VudChmVmlld2VyLmdldERvY3VtZW50KCksIGZQb3NpdGlvbiwgcG9zaXRpb24sICcsJywgKGNoYXIpIDAsIHRydWUpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZkN1cnJlbnRQYXJhbWV0ZXIgIT0gLTEpIHsKLQkJCWlmIChjdXJyZW50UGFyYW1ldGVyID09IGZDdXJyZW50UGFyYW1ldGVyKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmSW5mb3JtYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlwcmVzZW50YXRpb24uY2xlYXIoKTsKLQkJZkN1cnJlbnRQYXJhbWV0ZXIgPSBjdXJyZW50UGFyYW1ldGVyOwotCi0JCVN0cmluZyBzID0gZkluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpOwotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgb2NjdXJyZW5jZXMgPSAwOwotCQl3aGlsZSAob2NjdXJyZW5jZXMgPCBmQ3VycmVudFBhcmFtZXRlcikgewotCQkJaW50IGZvdW5kID0gcy5pbmRleE9mKCcsJywgc3RhcnQpOwotCQkJaWYgKGZvdW5kID09IC0xKQotCQkJCWJyZWFrOwotCQkJc3RhcnQgPSBmb3VuZCArIDE7Ci0JCQkrK29jY3VycmVuY2VzOwotCQl9Ci0KLQkJaWYgKG9jY3VycmVuY2VzIDwgZkN1cnJlbnRQYXJhbWV0ZXIpIHsKLQkJCXByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKDAsIHMubGVuZ3RoKCksIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJaWYgKHN0YXJ0ID09IC0xKQotCQkJc3RhcnQgPSAwOwotCi0JCWludCBlbmQgPSBzLmluZGV4T2YoJywnLCBzdGFydCk7Ci0JCWlmIChlbmQgPT0gLTEpCi0JCQllbmQgPSBzLmxlbmd0aCgpOwotCi0JCWlmIChzdGFydCA+IDApCi0JCQlwcmVzZW50YXRpb24uYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZSgwLCBzdGFydCwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCkpOwotCi0JCWlmIChlbmQgPiBzdGFydCkKLQkJCXByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBlbmQgLSBzdGFydCwgbnVsbCwgbnVsbCwgU1dULkJPTEQpKTsKLQotCQlpZiAoZW5kIDwgcy5sZW5ndGgoKSkKLQkJCXByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKGVuZCwgcy5sZW5ndGgoKSAtIGVuZCwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJhOGU2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJQ29tcGxldGlvblByb3Bvc2FsIHdob3NlIHZhbHVlcyBjYW4gYmUKLSAqIHJlYWQgYWZ0ZXIgY3JlYXRpb24uCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgZXh0ZW5kcyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgaW1wbGVtZW50cyBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQotCXByaXZhdGUgaW50IGZDdXJzb3JQb3NpdGlvbiA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZkxvY2FsRGlzcGxheVN0cmluZzsKLQlwcml2YXRlIFN0cmluZyBmU2hvcnROYW1lOwotCXByaXZhdGUgU3RyaW5nIGZRdWFsaWZpZWROYW1lOwotCXByaXZhdGUgU3RyaW5nIGZDb250YWluZXJOYW1lOwotCi0JcHVibGljIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyBxdWFsaWZpZWROYW1lLCBJbWFnZSBpbWFnZSwgU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgY29udGFpbmVyTmFtZSwgIGludCByZWxldmVuY2UsICBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQlzdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBxdWFsaWZpZWROYW1lLmxlbmd0aCgpICsgMiwgaW1hZ2UsIAotICAgICAgICAgICAgICAgIChjb250YWluZXJOYW1lICE9IG51bGwgJiYgY29udGFpbmVyTmFtZS5sZW5ndGgoKSA+IDApID8gdHlwZU5hbWUgKyAiIC0gIiArIGNvbnRhaW5lck5hbWUgOiB0eXBlTmFtZSwgbnVsbCwgbnVsbCwgcmVsZXZlbmNlLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBDTVZDIDI0MzgxNywgc3VwZXJjbGFzcyB3YXMgY29tcGFyaW5nIGluY29ycmVjdCBkaXNwbGF5IHN0cmluZyBpbiB2YWxpZGF0ZSBtZXRob2QuLi4KLQkJLy9zdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBpbWFnZSwgKGNvbnRhaW5lck5hbWUgIT0gbnVsbCAmJiBjb250YWluZXJOYW1lLmxlbmd0aCgpID4gMCk/IHR5cGVOYW1lICsgIiAtICIgKyBjb250YWluZXJOYW1lOnR5cGVOYW1lLypxdWFsaWZpZWROYW1lKi8sIHJlbGV2ZW5jZSk7Ci0JCWZTaG9ydE5hbWUgPSB0eXBlTmFtZTsKLQkJZlF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lOwotCQlmQ29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7Ci0JCWZDdXJzb3JQb3NpdGlvbiA9IGZRdWFsaWZpZWROYW1lLmxlbmd0aCgpICsgMjsKLQkJLy9mUHJvcG9zYWxJbmZvID0gcHJvcG9zYWxJbmZvOwotCQlpZiAoY29udGFpbmVyTmFtZSAhPSBudWxsICYmIGNvbnRhaW5lck5hbWUubGVuZ3RoKCkgPiAwKQotCQkJZkxvY2FsRGlzcGxheVN0cmluZyA9IHR5cGVOYW1lICsgIiAtICIgKyBjb250YWluZXJOYW1lOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWZMb2NhbERpc3BsYXlTdHJpbmcgPSB0eXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBmTG9jYWxEaXNwbGF5U3RyaW5nOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmQ3Vyc29yUG9zaXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCXN1cGVyLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvc2l0aW9uKTsKLQkJZkN1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgewotCQlyZXR1cm4gZlF1YWxpZmllZE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQkvLwkJU3RyaW5nIGluZm8gPSBzdXBlci5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCS8vCQlpZiAoaW5mbyA9PSBudWxsIHx8IGluZm8ubGVuZ3RoKCkgPT0gMCAmJiBmUHJvcG9zYWxJbmZvICE9IG51bGwpCi0JCS8vCQkJcmV0dXJuIGZQcm9wb3NhbEluZm8uZ2V0SW5mbygpOwotCQkvLwkJcmV0dXJuIGluZm87Ci0JCXJldHVybiBudWxsOyAvLyB1bmV4cGxhaW5lZCBOUEUKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJcmV0dXJuIGZTaG9ydE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbXBvcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJU3RyaW5nIGltcG9ydFNwZWMgPSBudWxsOwotCQlib29sZWFuIGlzSW1wb3J0ID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlpZiAoZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfSU1QT1JUKSkgewotCQkJCQlpc0ltcG9ydCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpc0ltcG9ydCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGlzSW1wb3J0ICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWltcG9ydFNwZWMgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltcG9ydFNwZWM7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIGltcG9ydCBwYWdlIGRpcmVjdGl2ZSBmb3IgdGhlIGN1cnJlbnQgdHlwZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIGludCBhcHBseUltcG9ydChJU3RydWN0dXJlZERvY3VtZW50IG1vZGVsKSB7Ci0JCS8vIGlmIHRoZSB0eXBlIGlzIGluIHRoZSBkZWZhdWx0IHBhY2thZ2Ugb3IgamF2YS5sYW5nLCBza2lwIGl0Ci0JCWlmIChmQ29udGFpbmVyTmFtZSA9PSBudWxsIHx8IGZDb250YWluZXJOYW1lLmxlbmd0aCgpID09IDAgfHwgZkNvbnRhaW5lck5hbWUuZXF1YWxzKCJqYXZhLmxhbmciKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIDA7Ci0JCS8vIGNvbGxlY3QgcGFnZSBkaXJlY3RpdmVzIGFuZCBzdG9yZSB0aGVpciBpbXBvcnQgdmFsdWVzCi0JCUxpc3QgaW1wb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gbW9kZWwuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkvLyB1c2UgdGhlIGxhc3QgcG9zaXRpb24gb2YgYSBwYWdlIGRpcmVjdGl2ZSBhcyBhIGhpbnQgYXMgdG8gd2hlcmUgdG8gYWRkCi0JCS8vIGEgbmV3IG9uZQotCQlpbnQgaGludCA9IDA7Ci0JCS8vIHdhdGNoIGZvciBqc3A6cm9vdCBzbyB0aGF0IHdlIHVzZSB0aGUgcmlnaHQgWE1ML0pTUCBmb3JtYXQgZm9yIHRoZSBkaXJlY3RpdmUKLQkJYm9vbGVhbiB1c2VYTUwgPSBmYWxzZTsKLQotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBDYW4ndCBqdXN0IGxvb2sgZm9yIGFsbCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHN0YXJ0aW5nIHdpdGggSlNQX0RJUkVDVElWRV9PUEVOCi0JCQkvLyBzaW5jZSB0aGUgWE1MIGZvcm0gaXMgcmVxdWlyZWQsIHRvbwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lID0gcmVnaW9ucy5nZXQoMSk7Ci0JCQkJLy8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhIEpTUCBkaXJlY3RpdmUKLQkJCQlpZiAobmFtZS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJCS8vIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSAqcGFnZSogZGlyZWN0aXZlCi0JCQkJCWlmIChub2RlLmdldFRleHQobmFtZSkuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9QQUdFKSB8fCBub2RlLmdldFRleHQobmFtZSkuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKSkgewotCQkJCQkJaWYgKG5vZGUuZ2V0RW5kT2Zmc2V0KCkgPCBnZXRSZXBsYWNlbWVudE9mZnNldCgpKQotCQkJCQkJCWhpbnQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQkJCQkJU3RyaW5nIGltcG9ydFNwZWMgPSBnZXRJbXBvcnQobm9kZSk7Ci0JCQkJCQlpZiAoaW1wb3J0U3BlYyAhPSBudWxsKSB7Ci0JCQkJCQkJaW1wb3J0cy5hZGQoaW1wb3J0U3BlYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGlmIHRoaXMgaXMgYSBqc3A6cm9vdCB0YWcsIHVzZSB0aGUgWE1MIGZvcm0KLQkJCQkJdXNlWE1MID0gdXNlWE1MIHx8IG5hbWUuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJfQotCi0JCS8vIGV2YWx1YXRlIHJlcXVpcmVtZW50cyBmb3IgYSAibmV3IiBpbXBvcnQgZGlyZWN0aXZlCi0JCWJvb2xlYW4gbmVlZHNJbXBvcnQgPSAhaW1wb3J0SGFuZGxlcyhmUXVhbGlmaWVkTmFtZSwgaW1wb3J0cyk7Ci0JCWludCBhZGp1c3RtZW50TGVuZ3RoID0gMDsKLQkJLy8gaW5zZXJ0ICJuZXciIGltcG9ydCBkaXJlY3RpdmUKLQkJaWYgKG5lZWRzSW1wb3J0KSB7Ci0JCQlTdHJpbmcgZGlyZWN0aXZlID0gbnVsbDsKLQotCQkJLy8gdmFyeSB0aGUgWE1MIGJlaGF2aW9yCi0JCQlpZiAodXNlWE1MKSB7Ci0JCQkJZGlyZWN0aXZlID0gIjxqc3A6ZGlyZWN0aXZlLnBhZ2UgaW1wb3J0PVwiIiArIGZRdWFsaWZpZWROYW1lICsgIlwiLz4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRpcmVjdGl2ZSA9ICI8JUAgcGFnZSBpbXBvcnQ9XCIiICsgZlF1YWxpZmllZE5hbWUgKyAiXCIgJT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmUgPSBtb2RlbC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChoaW50KTsKLQkJCQlib29sZWFuIHByZXBlbmROZXdMaW5lID0gbGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkgPT0gaGludDsKLQkJCQlib29sZWFuIGFwcGVuZE5ld0xpbmUgPSBoaW50ID09IDA7Ci0JCQkJaWYgKHByZXBlbmROZXdMaW5lKQotCQkJCQlkaXJlY3RpdmUgPSBtb2RlbC5nZXRMaW5lRGVsaW1pdGVyKCkgKyBkaXJlY3RpdmU7Ci0JCQkJaWYgKGFwcGVuZE5ld0xpbmUpCi0JCQkJCWRpcmVjdGl2ZSA9IGRpcmVjdGl2ZSArIG1vZGVsLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCQlhZGp1c3RtZW50TGVuZ3RoID0gZGlyZWN0aXZlLmxlbmd0aCgpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQltb2RlbC5yZXBsYWNlKGhpbnQsIDAsIGRpcmVjdGl2ZSk7Ci0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gTm90IHRoYXQgd2Ugc2hvdWxkIGV2ZXIgZ2V0IGEgQkxFLCBidXQgaWYgc28sIG91cgotCQkJCS8vIHJlcGxhY2VtZW50IG9mZnNldCBmcm9tIHRoZSBDb250ZW50IEFzc2lzdCBjYWxsIHNob3VsZAotCQkJCS8vIHdvcmsKLQkJCQl0cnkgewotCQkJCQltb2RlbC5yZXBsYWNlKGdldFJlcGxhY2VtZW50T2Zmc2V0KCksIDAsIGRpcmVjdGl2ZSk7Ci0JCQkJCWFkanVzdG1lbnRMZW5ndGggPSBkaXJlY3RpdmUubGVuZ3RoKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlMikgewotCQkJCQkvLyBub3cgd2hhdD8KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkanVzdG1lbnRMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogU2VlIGlmIHRoZSBpbXBvcnQgc3BlY2lmaWNhdGlvbiBpcyBhIHdpbGRjYXJkIGltcG9ydCwgYW5kIGlmIHNvLCB0aGF0Ci0JICogaXQgYXBwbGllcyB0byB0aGUgZ2l2ZW4gdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dpbGRjYXJkTWF0Y2goU3RyaW5nIGltcG9ydFNwZWMsIFN0cmluZyB0eXBlKSB7Ci0JCWludCBzcGVjTGVuZ3RoID0gaW1wb3J0U3BlYy5sZW5ndGgoKTsKLQkJaWYgKGltcG9ydFNwZWMuZW5kc1dpdGgoIioiKSAmJiBzcGVjTGVuZ3RoID4gMiAmJiB0eXBlLmxlbmd0aCgpID49IHNwZWNMZW5ndGgpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gcHVsbCBvdXQgdGhlIHBhY2thZ2UgbmFtZSBpbmNsdWRpbmcgdGhlIGZpbmFsICcuJwotCQkJU3RyaW5nIGNvbnRhaW5lciA9IGltcG9ydFNwZWMuc3Vic3RyaW5nKDAsIHNwZWNMZW5ndGggLSAxKTsKLQkJCS8vIHZlcmlmeSB0aGF0IHRoZSB0eXBlIGlzIGluIHRoZSBjb250YWluZXIncyBoaWVyYXJjaHkgYW5kIHRoYXQKLQkJCS8vIHRoZXJlIGFyZSBubyBvdGhlciBwYWNrYWdlIHNlcGFyYXRvcnMgYWZ0ZXJ3YXJkcwotCQkJaWYgKHR5cGUuc3RhcnRzV2l0aChjb250YWluZXIpICYmIHR5cGUuaW5kZXhPZignLicsIHNwZWNMZW5ndGggLSAxKSA8IDApIHsKLQkJCQkvLyBjb250YWluZXIgbWF0Y2hlcwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnRIYW5kbGVzKFN0cmluZyB0eXBlLCBMaXN0IGxpc3RPZkltcG9ydHMpIHsKLQkJSXRlcmF0b3IgaW1wb3J0cyA9IGxpc3RPZkltcG9ydHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGltcG9ydHMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgaW1wb3J0U3BlYyA9IFN0cmluZ1V0aWxzLnN0cmlwKGltcG9ydHMubmV4dCgpLnRvU3RyaW5nKCkpOwotCQkJaWYgKGltcG9ydFNwZWMuZXF1YWxzKHR5cGUpIHx8IGlzV2lsZGNhcmRNYXRjaChpbXBvcnRTcGVjLCB0eXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCBvZmZzZXQpIHsKLQkJLy8gSWYgd2UgaGF2ZSBhIHBhcnNlZCBJU3RydWN0dXJlZERvY3VtZW50LCBpbnNlcnQgdGhlIHNob3J0IG5hbWUgaW5zdGVhZCBvZiB0aGUKLQkJLy8gZnVsbHkgcXVhbGlmaWVkIG5hbWUgYW5kIGEgaW1wb3J0IHBhZ2UgZGlyZWN0aXZlIGlmCi0JCS8vIG5lZWRlZC4gIERvIHRoZSBpbXBvcnQgZmlyc3Qgc28gdGhlIGN1cnNvciBnb2VzIHRvIHRoZSByaWdodCBsb2NhdGlvbgotCQkvLyBhbmQgd2UgZG9uJ3Qgc3VycHJpc2UgdGhlIHVzZXIuCi0KLQkJYm9vbGVhbiBhZGRTaG9ydEZvcm0gPSBmYWxzZTsgLy9kb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZkNvbnRhaW5lck5hbWUgIT0gbnVsbCAmJiBmQ29udGFpbmVyTmFtZS5sZW5ndGgoKSA+IDA7Ci0JCWlmIChhZGRTaG9ydEZvcm0pIHsKLQkJCXNldFJlcGxhY2VtZW50U3RyaW5nKCciJyArIGZTaG9ydE5hbWUgKyAnIicpOwotCQkJaW50IGltcG9ydExlbmd0aCA9IGFwcGx5SW1wb3J0KChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCk7Ci0JCQlzZXRSZXBsYWNlbWVudE9mZnNldChnZXRSZXBsYWNlbWVudE9mZnNldCgpICsgaW1wb3J0TGVuZ3RoKTsKLQkJfQotCi0JCXNldEN1cnNvclBvc2l0aW9uKGdldFJlcGxhY2VtZW50U3RyaW5nKCkubGVuZ3RoKCkpOwotCQlzdXBlci5hcHBseShkb2N1bWVudCwgdHJpZ2dlciwgb2Zmc2V0KTsKLQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjEjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgY2hhciwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLQkJLy8gQ01WQyAyNDM4MTUKLQkJLy8gKHBhKSB0aGlzIGlzIG92ZXJyaWRkZW4gdG8gZ2V0IGFyb3VuZCByZXBsYWNlbWVudCBsZW5ndGggbW9kaWZpY2F0aW9uCi0JCS8vIHdoaWNoIGlzIGRvbmUgaW4gdGhlIHN1cGVyIChzaW5jZSBlY2xpcHNlIDIuMSkKLQkJYXBwbHkodmlld2VyLmdldERvY3VtZW50KCksIHRyaWdnZXIsIG9mZnNldCk7Ci0JfQotCi0JLy8gY29kZSBpcyBib3Jyb3dlZCBmcm9tIEphdmFDb21wbGV0aW9uUHJvcG9zYWwKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydHNXaXRoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgU3RyaW5nIHdvcmQpIHsKLQkJaW50IHdvcmRMZW5ndGggPSB3b3JkID09IG51bGwgPyAwIDogd29yZC5sZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA+IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgKyB3b3JkTGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlpbnQgbGVuZ3RoID0gb2Zmc2V0IC0gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKTsKLQkJCS8vIENNVkMgMjQzODE3Ci0JCQkvLyBzbGlnaHRseSBtb2RpZmllZCB0byBiZSBhIGxpdHRsZSBtb3JlIGZsZXhpYmxlIGZvciBhdHRyaWJ1dGUgdmFsdWUgc3RyaW5nIG1hdGNoaW5nLi4KLQkJCVN0cmluZyBzdGFydCA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGRvY3VtZW50LmdldChnZXRSZXBsYWNlbWVudE9mZnNldCgpLCBsZW5ndGgpKTsKLQkJCXJldHVybiB3b3JkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChzdGFydC50b0xvd2VyQ2FzZSgpKSB8fCBmUXVhbGlmaWVkTmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoc3RhcnQudG9Mb3dlckNhc2UoKSk7Ci0JCQkvL3JldHVybiB3b3JkLnN1YnN0cmluZygwLCBsZW5ndGgpLmVxdWFsc0lnbm9yZUNhc2Uoc3RhcnQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFDb21wbGV0aW9uUHJvcG9zYWwjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGludCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAvLwkgKi8KLQkvLwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCBldmVudCkgewotCS8vCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUoZG9jdW1lbnQsIG9mZnNldCwgZXZlbnQpOwotCS8vCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFDb21wbGV0aW9uUHJvcG9zYWwjc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIsIGJvb2xlYW4gc21hcnRUb2dnbGUpIHsKLQkJLy8gKHBhKSB3ZSBjdXJyZW50bHkgZG9uJ3QgdXNlIHNtYXJ0IHRvZ2dsZS4uLgotCQlzdXBlci5zZWxlY3RlZCh2aWV3ZXIsIGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTFjM2IxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb25zdGFudHM7Ci0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVHlwZUZpbmRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRCZWFuUHJvcG9zYWxzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlcGxhY2VtZW50U3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gdHlwZVByb3Bvc2FscyA9IGdldFR5cGVQcm9wb3NhbHMocmVzb3VyY2UsIHJlcGxhY2VtZW50U3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHNlcmlhbFByb3Bvc2FscyA9IGdldFNlcmlhbGl6ZWRQcm9wb3NhbHMocmVzb3VyY2UsIHJlcGxhY2VtZW50U3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGJlYW5Qcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFt0eXBlUHJvcG9zYWxzLmxlbmd0aCArIHNlcmlhbFByb3Bvc2Fscy5sZW5ndGhdOwotCi0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsUHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQliZWFuUHJvcG9zYWxzW2ldID0gc2VyaWFsUHJvcG9zYWxzW2ldOwotCQl9Ci0JCWZvciAoaSA9IHNlcmlhbFByb3Bvc2Fscy5sZW5ndGg7IGkgPCBzZXJpYWxQcm9wb3NhbHMubGVuZ3RoICsgdHlwZVByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJYmVhblByb3Bvc2Fsc1tpXSA9IHR5cGVQcm9wb3NhbHNbaSAtIHNlcmlhbFByb3Bvc2Fscy5sZW5ndGhdOwotCQl9Ci0JCXJldHVybiBiZWFuUHJvcG9zYWxzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0TWVtYmVycyhJQ29udGFpbmVyIGNvbnRhaW5lciwgTGlzdCBtZW1iZXJzTGlzdCkgewotCQl0cnkgewotCQkJSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKHRydWUpOwotCQkJaWYgKG1lbWJlcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAobWVtYmVyc1tpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQkJCQltZW1iZXJzTGlzdC5hZGQobWVtYmVyc1tpXSk7Ci0JCQkJCWVsc2UgaWYgKG1lbWJlcnNbaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpCi0JCQkJCQlnZXRNZW1iZXJzKChJQ29udGFpbmVyKSBtZW1iZXJzW2ldLCBtZW1iZXJzTGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRTZXJpYWxpemVkUHJvcG9zYWxzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlcGxhY2VtZW50U3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCkgewotCQlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0TWVtYmVycyhyZXNvdXJjZS5nZXRQcm9qZWN0KCksIHJlc291cmNlcyk7Ci0JCUlSZXNvdXJjZSBtZW1iZXJSZXNvdXJjZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQltZW1iZXJSZXNvdXJjZSA9IChJUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQlpZiAobWVtYmVyUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIG1lbWJlclJlc291cmNlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnNlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGF0aCA9IFVSSUhlbHBlci5ub3JtYWxpemUobWVtYmVyUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlc291cmNlLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJbmFtZXMuYWRkKG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIHBhdGggKyAiXCIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJcmVwbGFjZW1lbnRTdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIHBhdGgubGVuZ3RoKCkgKyAyLCBudWxsLCBwYXRoLCBudWxsLCBudWxsLCBJUmVsZXZhbmNlQ29uc3RhbnRzLlJfTk9ORSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgbmFtZXMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtuYW1lcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSByZXBsYWNlbWVudFN0YXJ0Ci0JICogQHBhcmFtIHJlcGxhY2VtZW50TGVuZ3RoCi0JICogQHBhcmFtIHNlYXJjaEZvciBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZmluZFByb3Bvc2FscyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXBsYWNlbWVudFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGludCBzZWFyY2hGb3IsIGJvb2xlYW4gaWdub3JlQWJzdHJhY3RDbGFzc2VzKSB7Ci0KLQkJSmF2YVR5cGVOYW1lUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKYXZhVHlwZU5hbWVSZXF1ZXN0b3IoKTsKLQkJcmVxdWVzdG9yLnNldEpTUE9mZnNldChyZXBsYWNlbWVudFN0YXJ0KTsKLQkJcmVxdWVzdG9yLnNldFJlcGxhY2VtZW50TGVuZ3RoKHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJcmVxdWVzdG9yLnNldElnbm9yZUFic3RyYWN0Q2xhc3NlcyhpZ25vcmVBYnN0cmFjdENsYXNzZXMpOwotCi0JCXRyeSB7Ci0JCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXXtnZXRKYXZhUHJvamVjdChyZXNvdXJjZSl9OwotCQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQkJbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaEFsbFR5cGVOYW1lcyhudWxsLCBudWxsLCBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCB8IFNlYXJjaFBhdHRlcm4uUl9QUkVGSVhfTUFUQ0gsIHNlYXJjaEZvciwgc2NvcGUsIHJlcXVlc3RvciwgSUphdmFTZWFyY2hDb25zdGFudHMuV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0gsIG51bGwpOwotCi0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Yyk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsgCi0JCQkvLyBKYXZhTW9kZWwKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjKTsKLQkJfQotCQlyZXR1cm4gcmVxdWVzdG9yLmdldFByb3Bvc2FscygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFR5cGVQcm9wb3NhbHMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVwbGFjZW1lbnRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCXJldHVybiBmaW5kUHJvcG9zYWxzKHJlc291cmNlLCByZXBsYWNlbWVudFN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRDbGFzc1Byb3Bvc2FscyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXBsYWNlbWVudFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJcmV0dXJuIGZpbmRQcm9wb3NhbHMocmVzb3VyY2UsIHJlcGxhY2VtZW50U3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUywgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJUHJvamVjdCBwcm9qID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvaik7Ci0JCXJldHVybiBqYXZhUHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZU5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlTmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWEyZGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlTmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlR5cGVOYW1lUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29uc3RhbnRzOwotCi0vKioKLSAqIFVzZSB3LyBKRFQgc2VhcmNoIGVuZ2luZSB0byBmaW5kIGFsbCB0eXBlIG5hbWVzLgotICogQ3JlYXRlcyBwcm9wb3NhbHMgZnJvbSBtYXRjaGVzIHJlcG9ydGVkLgotICoKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVOYW1lUmVxdWVzdG9yIGV4dGVuZHMgVHlwZU5hbWVSZXF1ZXN0b3IgewotCQotCXByaXZhdGUgaW50IGZKU1BPZmZzZXQgPSAtMTsKLQlwcml2YXRlIGludCBmUmVwbGFjZW1lbnRMZW5ndGggPSAtMTsKLQlwcml2YXRlIExpc3QgZlByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gZklnbm9yZUFic3RyYWN0Q2xhc3NlcyA9IGZhbHNlOwotCQotCXByaXZhdGUgQ29tcGxldGlvblByb3Bvc2FsTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxMYWJlbFByb3ZpZGVyKCk7Ci0JCi0JcHVibGljIHZvaWQgYWNjZXB0VHlwZShpbnQgbW9kaWZpZXJzLCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBTdHJpbmcgcGF0aCkgewotCi0gICAgICAgIGludCBvZmZzZXQgPSBnZXRKU1BPZmZzZXQoKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IGdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCQotCQkvLyBzb21laG93IG9mZnNldCBvciBsZW5ndGggd2FzIHNldCBpbmNvcnJlY3RseQotCQlpZihvZmZzZXQgPT0gLTEgfHwgbGVuZ3RoID09IC0xKQotCQkJcmV0dXJuOwotCQkvLyBpZ25vcmUgYWJzdHJhY3QgY2xhc3Nlcz8KLQkJaWYoaWdub3JlQWJzdHJhY3RDbGFzc2VzKCkgJiYgRmxhZ3MuaXNBYnN0cmFjdChtb2RpZmllcnMpKQotCQkJcmV0dXJuOwotCQkKLQkJSW1hZ2UgaW1hZ2UgPSBjYWxjdWxhdGVJbWFnZShtb2RpZmllcnMpOwotCQkKLSAgICAgICAgU3RyaW5nIGNvbnRhaW5lck5hbWVTdHJpbmcgPSBuZXcgU3RyaW5nKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lU3RyaW5nID0gU3RyaW5nLnZhbHVlT2Yoc2ltcGxlVHlwZU5hbWUpOwotCQkJCi0gICAgICAgIC8vIGNvbnRhaW5lcm5hbWUgY2FuIGJlIG51bGwKLSAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gY29uY2F0ZW5hdGVOYW1lKGNvbnRhaW5lck5hbWVTdHJpbmcsIHR5cGVOYW1lU3RyaW5nKTsKLQotICAgICAgICBTdHJpbmcgc2ltcGxlTmFtZSA9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKGZ1bGxOYW1lKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc2ltcGxlTmFtZSk7Ci0gICAgICAgIFN0cmluZyB0eXBlUXVhbGlmaWVyID0gU2lnbmF0dXJlLmdldFF1YWxpZmllcihmdWxsTmFtZSk7Ci0gICAgICAgIGlmICh0eXBlUXVhbGlmaWVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgiIC0gIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQodHlwZVF1YWxpZmllcik7Ci0gICAgICAgIH0KLQkJCi0gICAgICAgIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKGZ1bGxOYW1lLCBvZmZzZXQsIGxlbmd0aCwgZnVsbE5hbWUsIGltYWdlLCB0eXBlTmFtZVN0cmluZywgdHlwZVF1YWxpZmllciwgSVJlbGV2YW5jZUNvbnN0YW50cy5SX05PTkUsIHRydWUpOwotICAgICAgICBwcm9wb3NhbC5zZXRUcmlnZ2VyQ2hhcmFjdGVycyhKU1BQcm9wb3NhbENvbGxlY3Rvci5nZXRUeXBlVHJpZ2dlcnMoKSk7Ci0JCWZQcm9wb3NhbHMuYWRkKHByb3Bvc2FsKTsKLQl9Ci0KLQotCXByaXZhdGUgSW1hZ2UgY2FsY3VsYXRlSW1hZ2UoaW50IG1vZGlmaWVycykgewotCQlDb21wbGV0aW9uUHJvcG9zYWwgcCA9IENvbXBsZXRpb25Qcm9wb3NhbC5jcmVhdGUoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGLCBnZXRKU1BPZmZzZXQoKSk7Ci0JCXAuc2V0RmxhZ3MobW9kaWZpZXJzKTsKLQkJCi0JCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjIwNgotCQljaGFyW10gc2lnID0gbmV3IGNoYXJbXXtTaWduYXR1cmUuQ19VTlJFU09MVkVEfTsKLQkJcC5zZXRTaWduYXR1cmUoc2lnKTsKLQkJCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZkxhYmVsUHJvdmlkZXIuY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHApOwotCQlJbWFnZSBpbWFnZSA9IEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoZGVzY3JpcHRvcik7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQ29uY2F0ZW5hdGVzIHR3byBuYW1lcy4gVXNlcyBhIGRvdCBmb3Igc2VwYXJhdGlvbi4gQm90aCBzdHJpbmdzIGNhbiBiZQotICAgICAqIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29uY2F0ZW5hdGVOYW1lKFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmIChuYW1lMSAhPSBudWxsICYmIG5hbWUxLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUyICE9IG51bGwgJiYgbmFtZTIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJy4nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmFtZTIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0JCi0JaW50IGdldEpTUE9mZnNldCgpIHsKLQkJcmV0dXJuIGZKU1BPZmZzZXQ7Ci0JfQotCi0Jdm9pZCBzZXRKU1BPZmZzZXQoaW50IG9mZnNldCkgewotCQlmSlNQT2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCWludCBnZXRSZXBsYWNlbWVudExlbmd0aCgpIHsKLQkJcmV0dXJuIGZSZXBsYWNlbWVudExlbmd0aDsKLQl9Ci0KLQl2b2lkIHNldFJlcGxhY2VtZW50TGVuZ3RoKGludCByZXBsYWNlbWVudExlbmd0aCkgewotCQlmUmVwbGFjZW1lbnRMZW5ndGggPSByZXBsYWNlbWVudExlbmd0aDsKLQl9Ci0Jdm9pZCBzZXRJZ25vcmVBYnN0cmFjdENsYXNzZXMoYm9vbGVhbiBpZ25vcmUpIHsKLQkJZklnbm9yZUFic3RyYWN0Q2xhc3NlcyA9IGlnbm9yZTsKLQl9Ci0JYm9vbGVhbiBpZ25vcmVBYnN0cmFjdENsYXNzZXMoKSB7Ci0JCXJldHVybiBmSWdub3JlQWJzdHJhY3RDbGFzc2VzOwotCX0KLQkKLQlKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscygpIHsKLQkJcmV0dXJuIChKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbFtdKWZQcm9wb3NhbHMudG9BcnJheShuZXcgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWxbZlByb3Bvc2Fscy5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTNjOGUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQIGV4dGVuZHMgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTCB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGZKU1BDb250ZXh0cyA9IG51bGw7Ci0KLQlwdWJsaWMgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQKCkgewotCQlzdXBlcigpOwotCQlpbml0SlNQQ29udGV4dHMoKTsKLQl9Ci0KLQkvKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTCNpbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJc3VwZXIuaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgSlNQQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCi0JCS8vIEpTUAotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxULCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQsIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFLCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0RFTElNSVRFUiwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBqc3BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvciA9IG5ldyBKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSwganNwSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdE5hbWVUb1Byb2Nlc3Nvck1hcCgpIHsKLQkJc3VwZXIuaW5pdE5hbWVUb1Byb2Nlc3Nvck1hcCgpOwotCQlKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNwUHJvcGVydHlDQVAgPSBuZXcgSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWFkZE5hbWVQcm9jZXNzb3IoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VUUFJPUEVSVFksIGpzcFByb3BlcnR5Q0FQKTsKLQkJYWRkTmFtZVByb2Nlc3NvcihKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSwganNwUHJvcGVydHlDQVApOwotCQlhZGROYW1lUHJvY2Vzc29yKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4sIG5ldyBKU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3NvcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdEpTUENvbnRleHRzKCkgewotCQlmSlNQQ29udGV4dHMgPSBuZXcgU3RyaW5nW117RE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4sIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4sIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTn07Ci0JfQotCi0JLyoqCi0JICogUXVpY2sgY2hlY2sgdG8gc2VlIGlmIGNvbnRleHQgKFN0cmluZykgc2hvdWxkIG1hcCB0bwotCSAqIEpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcmV0dXJuIGlmIGl0J3MgYSBKU1AgUmVnaW9uIChmb3Igd2hpY2ggd2UgbmVlZCBKU1AgQ29udGVudCBhc3Npc3QpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBzZFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkpTUENvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBmSlNQQ29udGV4dHNbaV0pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBndWVzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IHN1cGVyLmd1ZXNzQ29udGVudEFzc2lzdFByb2Nlc3Nvcih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJaWYgKHAgPT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgdmlld2VyLmdldERvY3VtZW50KCkpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50T2Zmc2V0KTsKLQkJCWlmIChpc0pTUFJlZ2lvbihzZFJlZ2lvbikpCi0JCQkJcCA9IGdldFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0ZTlkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci0KLS8qKgotICogSnVzdCBsaWtlIERvY3VtZW50VGVtcGxhdGVDb250ZXh0IGV4Y2VwdCBpZiBhbiBpbnNlcnQgb2Zmc2V0IGlzIHBhc3NlZCBpbiwKLSAqIGR1cmluZyBldmFsdWF0aW9uLCB0aGUgInByZWZpeCIgYmVmb3JlIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIGNoZWNrZWQgdG8gc2VlCi0gKiBpZiBpdCBtYXRjaGVzIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZiBzbywgb3ZlcndyaXRlIHRoZSB0ZW1wbGF0ZSBuYW1lLgotICogT3RoZXJ3aXNlLCBqdXN0IGluc2VydCB0aGUgdGVtcGxhdGUgYXQgdGhlIGluc2VydCBvZmZzZXQgbG9jYXRpb24gKGJ5IG5vdAotICogb3ZlcndyaXRpbmcgdGhlIHByZWZpeCB0ZXh0KQotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQgZXh0ZW5kcyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCB7Ci0JcHJpdmF0ZSBpbnQgZkluc2VydE9mZnNldCA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aGlzKHR5cGUsIGRvY3VtZW50LCBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4gVGhlIHN1cHBsaWVkIDxjb2RlPlBvc2l0aW9uPC9jb2RlPgotCSAqIHdpbGwgYmUgcXVlcmllZCB0byBjb21wdXRlIHRoZSA8Y29kZT5nZXRTdGFydDwvY29kZT4gYW5kCi0JICogPGNvZGU+Z2V0RW5kPC9jb2RlPiBtZXRob2RzLCB3aGljaCB3aWxsIHRoZXJlZm9yZSBhbnN3ZXIgdXBkYXRlZAotCSAqIHBvc2l0aW9uIGRhdGEgaWYgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gZGVzY3JpYmluZyB0aGUgYXJlYSBvZiB0aGUgZG9jdW1lbnQgd2hpY2ggZm9ybXMKLQkgKiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBjb250ZXh0Ci0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJc3VwZXIodHlwZSwgZG9jdW1lbnQsIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGluc2VydE9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uIHdoZXJlIGluc2VydCB3YXMKLQkgKiAgICAgICAgICAgIG9yaWdpbmFsbHkgcmVxdWVzdGVkCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5zZXJ0T2Zmc2V0KSB7Ci0JCXRoaXModHlwZSwgZG9jdW1lbnQsIG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOwotCQlmSW5zZXJ0T2Zmc2V0ID0gaW5zZXJ0T2Zmc2V0OwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQjZXZhbHVhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGUpCi0JICovCi0JcHVibGljIFRlbXBsYXRlQnVmZmVyIGV2YWx1YXRlKFRlbXBsYXRlIHRlbXBsYXRlKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIFRlbXBsYXRlRXhjZXB0aW9uIHsKLQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gc3VwZXIuZXZhbHVhdGUodGVtcGxhdGUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmIChmSW5zZXJ0T2Zmc2V0ID4gLTEgJiYgZkluc2VydE9mZnNldCA+IGdldFN0YXJ0KCkpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gZ2V0RG9jdW1lbnQoKS5nZXQoZ2V0U3RhcnQoKSwgZkluc2VydE9mZnNldCAtIGdldFN0YXJ0KCkpOwotCQkJCWlmICghdGVtcGxhdGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotCQkJCQkvLyBnZW5lcmF0ZSBhIG5ldyBidWZmZXIgdGhhdCBhY3R1YWxseSBjb250YWlucyB0aGUKLQkJCQkJLy8gdGV4dCB0aGF0IHdhcyBnb2luZyB0byBiZSBvdmVyd3JpdHRlbgotCQkJCQlidWZmZXIgPSBuZXcgVGVtcGxhdGVCdWZmZXIocHJlZml4ICsgYnVmZmVyLmdldFN0cmluZygpLCBidWZmZXIuZ2V0VmFyaWFibGVzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWUwNzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi0vKioKLSAqIEpTUCBGcmFnbWVudCBQcm9wZXJ0eSBQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX05PTkUgPSBKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQotCS8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHRoZXNlIHN0cmluZ3MvdmFyaWFibGVzCi0JcHJpdmF0ZSBTdHJpbmdbXSBmTGFuZ3VhZ2VzID0ge1NFTEVDVF9OT05FLCAiamF2YSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdCJ9OyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29udGVudFR5cGVzID0ge1NFTEVDVF9OT05FLCAiYXBwbGljYXRpb24veGh0bWwreG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJhcHBsaWNhdGlvbi94bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJInRleHQvaHRtbCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkidGV4dC94bWwiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L2NzcyJ9OyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgQ29tYm8gZkxhbmd1YWdlQ29tYm87Ci0JcHJpdmF0ZSBDb21ibyBmQ29udGVudFR5cGVDb21ibzsKLQotCXB1YmxpYyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQlzZXREZXNjcmlwdGlvbihKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwcm9wZXJ0eVBhZ2UgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAyKTsKLQotCQkvLyBmcmFnbWVudCBsYW5ndWFnZSBjb250cm9sCi0JCVRleHQgbGFuZ3VhZ2VMYWJlbCA9IG5ldyBUZXh0KHByb3BlcnR5UGFnZSwgU1dULlJFQURfT05MWSk7Ci0JCWxhbmd1YWdlTGFiZWwuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMik7Ci0JCWZMYW5ndWFnZUNvbWJvID0gbmV3IENvbWJvKHByb3BlcnR5UGFnZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZkxhbmd1YWdlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZkxhbmd1YWdlQ29tYm8uc2V0SXRlbXMoZkxhbmd1YWdlcyk7Ci0KLQkJLy8gZnJhZ21lbnQgY29udGVudCB0eXBlIGNvbnRyb2wKLQkJVGV4dCBjb250ZW50VHlwZUxhYmVsID0gbmV3IFRleHQocHJvcGVydHlQYWdlLCBTV1QuUkVBRF9PTkxZKTsKLQkJY29udGVudFR5cGVMYWJlbC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8zKTsKLQkJZkNvbnRlbnRUeXBlQ29tYm8gPSBuZXcgQ29tYm8ocHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmQ29udGVudFR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmQ29udGVudFR5cGVDb21iby5zZXRJdGVtcyhmQ29udGVudFR5cGVzKTsKLQotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5KU1BfRlJBR01FTlRfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgdGhpcyBwcm9wZXJ0aWVzIHBhZ2UgaXMgZm9yCi0JICogCi0JICogQHJldHVybiBJUmVzb3VyY2UgZm9yIHRoaXMgcHJvcGVydGllcyBwYWdlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIElSZXNvdXJjZQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlJQWRhcHRhYmxlIGFkYXB0YWJsZSA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBhZGFwdGFibGU7Ci0JCX0gZWxzZSBpZiAoYWRhcHRhYmxlICE9IG51bGwpIHsKLQkJCU9iamVjdCBvID0gYWRhcHRhYmxlLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKW87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBnZXRSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JCWlmIChsYW5ndWFnZSA9PSBudWxsIHx8IGxhbmd1YWdlLmxlbmd0aCgpID09IDApIHsKLQkJCS8vIGlmIG51bGwsIHVzZSBub25lCi0JCQlsYW5ndWFnZSA9IFNFTEVDVF9OT05FOwotCQl9Ci0JCS8qCi0JCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgYWRkIHRvIHRoZQotCQkgKiBjb21ib2JveC4KLQkJICovCi0JCWludCBpbmRleCA9IGZMYW5ndWFnZUNvbWJvLmluZGV4T2YobGFuZ3VhZ2UpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZMYW5ndWFnZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0JCWVsc2UKLQkJCWZMYW5ndWFnZUNvbWJvLnNldFRleHQobGFuZ3VhZ2UpOwotCi0JCVN0cmluZyBjb250ZW50VHlwZSA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwgfHwgY29udGVudFR5cGUubGVuZ3RoKCkgPT0gMCkgewotCQkJLy8gaWYgbnVsbCwgdXNlIG5vbmUKLQkJCWNvbnRlbnRUeXBlID0gU0VMRUNUX05PTkU7Ci0JCX0KLQkJLyoKLQkJICogSWYgaXRlbSBpcyBhbHJlYWR5IHBhcnQgb2YgY29tYm8sIHNlbGVjdCBpdC4gT3RoZXJ3aXNlLCBhZGQgdG8gdGhlCi0JCSAqIGNvbWJvYm94LgotCQkgKi8KLQkJaW5kZXggPSBmQ29udGVudFR5cGVDb21iby5pbmRleE9mKGNvbnRlbnRUeXBlKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmQ29udGVudFR5cGVDb21iby5zZWxlY3QoaW5kZXgpOwotCQllbHNlCi0JCQlmQ29udGVudFR5cGVDb21iby5zZXRUZXh0KGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWludCBpbmRleCA9IGZMYW5ndWFnZUNvbWJvLmluZGV4T2YoU0VMRUNUX05PTkUpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZMYW5ndWFnZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0KLQkJaW5kZXggPSBmQ29udGVudFR5cGVDb21iby5pbmRleE9mKFNFTEVDVF9OT05FKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmQ29udGVudFR5cGVDb21iby5zZWxlY3QoaW5kZXgpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJdHJ5IHsKLQkJCS8vIHNhdmUgdGhlIGZyYWdtZW50IGxhbmd1YWdlCi0JCQlTdHJpbmcgbGFuZ3VhZ2UgPSBmTGFuZ3VhZ2VDb21iby5nZXRUZXh0KCk7Ci0JCQlpZiAobGFuZ3VhZ2UgPT0gbnVsbCB8fCBsYW5ndWFnZS5sZW5ndGgoKSA9PSAwIHx8IGxhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlsYW5ndWFnZSA9IG51bGw7Ci0JCQl9Ci0JCQlKU1BGQ29udGVudFByb3BlcnRpZXMuc2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBnZXRSZXNvdXJjZSgpLCBsYW5ndWFnZSk7Ci0KLQkJCS8vIHNhdmUgZnJhZ21lbnQgY29udGVudCB0eXBlCi0JCQlTdHJpbmcgY29udGVudFR5cGUgPSBmQ29udGVudFR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCB8fCBjb250ZW50VHlwZS5sZW5ndGgoKSA9PSAwIHx8IGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQljb250ZW50VHlwZSA9IG51bGw7Ci0JCQl9Ci0JCQlKU1BGQ29udGVudFByb3BlcnRpZXMuc2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPTlRFTlRUWVBFLCBnZXRSZXNvdXJjZSgpLCBjb250ZW50VHlwZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nIGZpbGUKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTk3NmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIHsKLQlwdWJsaWMgUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXNldERlc2NyaXB0aW9uKEpTUFVJTWVzc2FnZXMuUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk4YTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmphdmFkb2MuU2luZ2xlQ2hhclJlYWRlci4KLSAqIE1vZGlmaWNhdGlvbiB3YXMgbWFkZSB0byBmaXggc3RhdGVtZW50IHVubmVjZXNzYXJpbHkgbmVzdGVkIHdpdGhpbiBlbHNlCi0gKiBjbGF1c2Ugd2FybmluZyBpbiByZWFkKC4uKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbmdsZUNoYXJSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZChjaGFyW10saW50LGludCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjYnVmW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBlbmQgPSBvZmYgKyBsZW47Ci0JCWZvciAoaW50IGkgPSBvZmY7IGkgPCBlbmQ7IGkrKykgewotCQkJaW50IGNoID0gcmVhZCgpOwotCQkJaWYgKGNoID09IC0xKSB7Ci0JCQkJaWYgKGkgPT0gb2ZmKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGkgLSBvZmY7Ci0JCQl9Ci0JCQljYnVmW2ldID0gKGNoYXIpIGNoOwotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBhcyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNoOwotCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAtMSkgewotCQkJYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOTcxNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlJlZmFjdG9yQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5JQWN0aW9uQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSUFjdGlvbkRlZmluaXRpb25JZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkFjdGlvbkNvbnRyaWJ1dG9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci0KLS8qKgotICogQWN0aW9uQ29udHJpYnV0b3JKU1AKLSAqIAotICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgaW5zaWRlIG11bHRpIHBhZ2UgZWRpdG9yJ3MKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yLCBzaW5jZSBjYXNjYWRlZCBpbml0KCkgY2FsbCBmcm9tIHRoZQotICogQWN0aW9uQmFyQ29udHJpYnV0b3Igd2lsbCBjYXVzZXMgZXhjZXB0aW9uIGFuZCBpdCBsZWFkcyB0byBsb3NlIHdob2xlCi0gKiB0b29sYmFycy4KLSAqIAotICogSW5zdGVhZCwgdXNlIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBmb3Igc291cmNlIHBhZ2UgY29udHJpYnV0b3Igb2YKLSAqIG11bHRpIHBhZ2UgZWRpdG9yLgotICogCi0gKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBzdGlsbCB2YWxpZCBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uQ29udHJpYnV0b3JKU1AgZXh0ZW5kcyBBY3Rpb25Db250cmlidXRvckhUTUwgewotCi0JcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gcmVuYW1lRWxlbWVudEFjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gbW92ZUVsZW1lbnRBY3Rpb24gPSBudWxsOwotCXByaXZhdGUgSU1lbnVNYW5hZ2VyIHJlZmFjdG9yTWVudSA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSIsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIEFjdGlvbkNvbnRyaWJ1dG9ySlNQKCkgewotCQlzdXBlcigpOwotCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEpTUFVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsIElBY3Rpb25Db25zdGFudHNKU1AuQUNUSU9OX05BTUVfUkVOQU1FX0VMRU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRFUlNDT1JFKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5SRU5BTUVfRUxFTUVOVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLCBJSGVscENvbnRleHRJZHMuSlNQX1JFRkFDVE9SUkVOQU1FX0hFTFBJRCk7Ci0KLQkJdGhpcy5tb3ZlRWxlbWVudEFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24oYnVuZGxlLCBJQWN0aW9uQ29uc3RhbnRzSlNQLkFDVElPTl9OQU1FX01PVkVfRUxFTUVOVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5NT1ZFX0VMRU1FTlQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMubW92ZUVsZW1lbnRBY3Rpb24sIElIZWxwQ29udGV4dElkcy5KU1BfUkVGQUNUT1JNT1ZFX0hFTFBJRCk7Ci0KLQkJLy8gdGhlIHJlZmFjdG9yIG1lbnUsIGFkZCB0aGUgbWVudSBpdHNlbGYgdG8gYWRkIGFsbCByZWZhY3RvciBhY3Rpb25zCi0JCXRoaXMucmVmYWN0b3JNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKEpTUFVJTWVzc2FnZXMuQWN0aW9uQ29udHJpYnV0b3JKU1BfMCwgUmVmYWN0b3JBY3Rpb25Hcm91cC5NRU5VX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlyZWZhY3Rvck1lbnUuYWRkKHRoaXMucmVuYW1lRWxlbWVudEFjdGlvbik7Ci0JCXJlZmFjdG9yTWVudS5hZGQodGhpcy5tb3ZlRWxlbWVudEFjdGlvbik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5hZGRUb01lbnUobWVudSk7Ci0KLQkJbWVudS5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCwgdGhpcy5yZWZhY3Rvck1lbnUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCi0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbihnZXRUZXh0RWRpdG9yKGdldEFjdGl2ZUVkaXRvclBhcnQoKSksIElBY3Rpb25Db25zdGFudHNKU1AuQUNUSU9OX05BTUVfUkVOQU1FX0VMRU1FTlQpKTsKLQkJdGhpcy5tb3ZlRWxlbWVudEFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKGdldFRleHRFZGl0b3IoZ2V0QWN0aXZlRWRpdG9yUGFydCgpKSwgSUFjdGlvbkNvbnN0YW50c0pTUC5BQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJc3VwZXIuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxOTM2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgSlNQIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IEpTUFVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0KLQotCS8vIC8vIGZpZ3VyZWQgb3V0IG9uIHRoZSBmbHkKLQkvLyAvLyBKU1AgU291cmNlIHBhZ2UgZWRpdG9yCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NPVVJDRVZJRVdfSEVMUElEID0KLQkvLyBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQICsiX3NvdXJjZV9IZWxwSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBKU1AgRmlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA1MCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgU3R5bGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDUxIjsgLy8kTk9OLU5MUy0xJAotCS8vIEpTUCBUZW1wbGF0ZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNTIiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vIEpTUCBGcmFnbWVudCBQcm9wZXJ0eSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0ZSQUdNRU5UX0hFTFBJRCA9IFBSRUZJWCArICJqc3BmMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEpTUCBTb3VyY2UgRWRpdG9yIENvbnRleHQgTWVudQotCS8vIFJlZmFjdG9yIFJlbmFtZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9SRUZBQ1RPUlJFTkFNRV9IRUxQSUQgPSBQUkVGSVggKyAianNwcjAwMTAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBSZWZhY3RvciBNb3ZlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JFRkFDVE9STU9WRV9IRUxQSUQgPSBQUkVGSVggKyAianNwcjAwMjAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBKU1AgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gUFJFRklYICsgImpzcHcwMDEwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGNhOWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICogCi0gKiBOT1RFOiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEZvciBpbWFnZXMgdXNlZCBleHRlcm5hbGx5LCBwbGVhc2UgdXNlIHRoZQotICogU2hhcmVkKioqSW1hZ2VIZWxwZXIgY2xhc3MgaW5zdGVhZC4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBMVUdJTklEID0gSlNQVUlQbHVnaW4uSUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8JIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiBJZiB0aGUgaW1hZ2UgY2Fubm90IGJlIHJldHJpZXZlZCwgYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBhdAotCSAqIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2Ugb3IgbnVsbCBpZiBvbmUgY291bGQKLQkgKiAgICAgICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhbiBpbWFnZQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLSAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgSW1hZ2UgYXNzb2NpYXRlZCB3aXRoIEltYWdlRGVzY3JpcHRvciBmcm9tIHRoZSBpbWFnZQotICAgICAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBJbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBpdCBpcyBjcmVhdGVkCi0gICAgICogZnJvbSB0aGUgSW1hZ2VEZXNjcmlwdG9yCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlCi0gICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gSW1hZ2UgdGhlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSW1hZ2VEZXNjcmlwdG9yIG9yCi0gICAgICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotICAgICAgICAgICAgZGVzY3JpcHRvcj0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICBJbWFnZSByZXN1bHQ9IChJbWFnZSlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChkZXNjcmlwdG9yKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdD0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChkZXNjcmlwdG9yLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV0cmlldmVkLAotCSAqIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCi0JICogaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jYXRlZCB3aXRoIHJlc291cmNlIG9yCi0JICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5IC0gaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgYWRkcyB0aGUgaW1hZ2UgdG8gdGhlCi0JICogaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkKLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZSByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM4ZjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBKU1AgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFZGl0b3JQbHVnaW5JbWFnZXMgeyAJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DTEFTU19PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfR0VORVJJQyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0pTUCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfVEVNUExBVEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9QVUJMSUMgPSAiaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfUFJPVEVDVEVEX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2ZpZWxkX3Byb3RlY3RlZF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1BVQkxJQ19PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wdWJsaWNfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9ERUZBVUxUX09CSj0gImljb25zL2Z1bGwvb2JqMTYvZmllbGRfZGVmYXVsdF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1BSSVZBVEVfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJpdmF0ZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ08gPSAiaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNURURfQ08gPSAiaWNvbnMvZnVsbC9vYmoxNi9wcm90ZWN0ZWRfY28uZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19DTyA9ICJpY29ucy9mdWxsL29iajE2L3B1YmxpY19jby5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJVkFURV9DTyA9ICJpY29ucy9mdWxsL29iajE2L3ByaXZhdGVfY28uZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSQ0xBU1NfREVGQVVMVF9PQko9ICJpY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSQ0xBU1NfUFJJVkFURV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUkNMQVNTX1BST1RFQ1RFRF9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3Byb3RlY3RlZF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSQ0xBU1NfUFVCTElDX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHVibGljX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJJTlRFUkZBQ0VfREVGQVVMVF9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9kZWZhdWx0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJJTlRFUkZBQ0VfUFJJVkFURV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcml2YXRlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJJTlRFUkZBQ0VfUFJPVEVDVEVEX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSSU5URVJGQUNFX1BVQkxJQ19PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX09CSiA9ICJpY29ucy9mdWxsL29iajE2L3BhY2thZ2Vfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9WQVJJQUJMRV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9XSVpCQU5fTkVXSlNQRklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdqc3BmaWxlX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9XSVpCQU5fTkVXVEFHRklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdqc3BmaWxlX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzE1ZDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGludGVyZmFjZQotICovCi1wdWJsaWMgY2xhc3MgSlNQU291cmNlRWRpdGluZ1RleHRUb29scyBleHRlbmRzIFhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgewotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlTGFuZ3VhZ2UoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyBsYW5ndWFnZSA9IG51bGw7Ci0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlkb2MgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJfQotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBhZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgZG9jKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlsYW5ndWFnZSA9IGFkYXB0ZXIuZ2V0TGFuZ3VhZ2UoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlcwotCQkJCU5vZGVMaXN0IHBhZ2VEaXJlY3RpdmVzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VEaXJlY3RpdmVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJRWxlbWVudCBwYWdlRGlyZWN0aXZlID0gKEVsZW1lbnQpIHBhZ2VEaXJlY3RpdmVzLml0ZW0oaSk7Ci0JCQkJCVN0cmluZyBsYW5nVmFsdWUgPSBwYWdlRGlyZWN0aXZlLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfTEFOR1VBR0UpOwotCQkJCQkvLyBsYXN0IG9uZSB0byBkZWNsYXJlIGEgbGFuZ3VhZ2Ugd2lucwotCQkJCQlpZiAobGFuZ1ZhbHVlICE9IG51bGwpCi0JCQkJCQlsYW5ndWFnZSA9IGxhbmdWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgbm8gbGFuZ3VhZ2Ugd2FzIHNwZWNpZmllZCBhbnl3aGVyZSwgYXNzdW1lIEphdmEKLQkJaWYgKGxhbmd1YWdlID09IG51bGwpCi0JCQlsYW5ndWFnZSA9IEpTUDExTmFtZXNwYWNlLkFUVFJfVkFMVUVfSkFWQTsKLQkJcmV0dXJuIGxhbmd1YWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU1BKYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWI5MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU1BKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YSBleHRlbmRzIENvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSB7Ci0KLQkvKiogRG9jdW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZEb2N1bWVudHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCS8qKiBQYXJ0aXRpb25zIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZQYXJ0aXRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGphdmEgZm9ybWF0dGluZyBzdHJhdGVneS4KLQkgKi8KLQlwdWJsaWMgRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdCgpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KCkgewotCQlzdXBlci5mb3JtYXQoKTsKLQotCQlmaW5hbCBJRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURvY3VtZW50KSBmRG9jdW1lbnRzLnJlbW92ZUZpcnN0KCk7Ci0JCWZpbmFsIFR5cGVkUG9zaXRpb24gcGFydGl0aW9uID0gKFR5cGVkUG9zaXRpb24pIGZQYXJ0aXRpb25zLnJlbW92ZUZpcnN0KCk7Ci0KLQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgcGFydGl0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0KLQkJCQlKU1BUcmFuc2xhdGlvblV0aWwgdHJhbnNsYXRpb25VdGlsID0gbmV3IEpTUFRyYW5zbGF0aW9uVXRpbChkb2N1bWVudCk7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRyYW5zbGF0aW9uVXRpbC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQlpZiAoY3UgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY3VTb3VyY2UgPSBjdS5nZXRTb3VyY2UoKTsKLQkJCQkJVGV4dEVkaXQgdGV4dEVkaXQgPSBmb3JtYXRTdHJpbmcoQ29kZUZvcm1hdHRlci5LX0NPTVBJTEFUSU9OX1VOSVQsIGN1U291cmNlLCAwLCBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvY3VtZW50KSwgZ2V0UHJlZmVyZW5jZXMoKSk7Ci0KLQkJCQkJVGV4dEVkaXQganNwRWRpdCA9IHRyYW5zbGF0aW9uVXRpbC5nZXRUcmFuc2xhdGlvbigpLmdldEpzcEVkaXQodGV4dEVkaXQpOwotCQkJCQlpZiAoanNwRWRpdCAhPSBudWxsICYmIGpzcEVkaXQuaGFzQ2hpbGRyZW4oKSkKLQkJCQkJCWpzcEVkaXQuYXBwbHkoZG9jdW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCS8vIENhbiBvbmx5IGhhcHBlbiBvbiBjb25jdXJyZW50IGRvY3VtZW50IG1vZGlmaWNhdGlvbiAtIGxvZwotCQkJCS8vIGFuZCBiYWlsIG91dAotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdGFydHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0YXJ0cyhmaW5hbCBJRm9ybWF0dGluZ0NvbnRleHQgY29udGV4dCkgewotCQlzdXBlci5mb3JtYXR0ZXJTdGFydHMoY29udGV4dCk7Ci0KLQkJZlBhcnRpdGlvbnMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BBUlRJVElPTikpOwotCQlmRG9jdW1lbnRzLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9NRURJVU0pKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdHRlclN0b3BzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdG9wcygpIHsKLQkJc3VwZXIuZm9ybWF0dGVyU3RvcHMoKTsKLQotCQlmUGFydGl0aW9ucy5jbGVhcigpOwotCQlmRG9jdW1lbnRzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IGZvcm1hdFN0cmluZyhpbnQga2luZCwgU3RyaW5nIHN0cmluZywgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBNYXAgb3B0aW9ucykgewotCQlyZXR1cm4gVG9vbEZhY3RvcnkuY3JlYXRlQ29kZUZvcm1hdHRlcihvcHRpb25zKS5mb3JtYXQoa2luZCwgc3RyaW5nLCAwLCBzdHJpbmcubGVuZ3RoKCksIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oYW5kbGVycy9KU1BGaW5kT2NjdXJyZW5jZXNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaGFuZGxlcnMvSlNQRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzQ2N2RhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oYW5kbGVycy9KU1BGaW5kT2NjdXJyZW5jZXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc2VhcmNoLkhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5GaW5kT2NjdXJyZW5jZXNIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgSlNQRmluZE9jY3VycmVuY2VzSGFuZGxlciBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIgewotCXByaXZhdGUgTGlzdCBmUHJvY2Vzc29yczsKLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotCQkJZlByb2Nlc3NvcnMuYWRkKGh0bWxQcm9jZXNzb3IpOwotLy8JCQkgdGVtcG9yYXJ5LCB3b3JrYXJvdW5kIHRvIGRpc2FibGUgZnVuY3Rpb24sIHNpbmNlIHVzaW5nIHRoZSBmdW5jdGlvbiAKLS8vCQkJIGNhbiBlYXNpbHkgY2F1c2UgZGVhZGxvY2sgdG8gb2NjdXIuCi0vLwkJCQkJIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzNjYyCi0vLwkJCUpTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBqc3BQcm9jZXNzb3IgPSBuZXcgSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0vLwkJCWZQcm9jZXNzb3JzLmFkZChqc3BQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjUwMjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogRWRpdG9ySW5wdXQgZm9yIGV4dGVybmFsIGZpbGVzLiBDb3BpZWQgZnJvbQotICogb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZWRpdG9ycy50ZXh0LkphdmFGaWxlRWRpdG9ySW5wdXQKLSAqLwotY2xhc3MgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQsIElMb2NhdGlvblByb3ZpZGVyIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JCi0JLyoqCi0JICogVGhlIHdvcmtiZW5jaCBhZGFwdGVyIHdoaWNoIHNpbXBseSBwcm92aWRlcyB0aGUgbGFiZWwuCi0JICogCi0JICogQHNlZSAgRWNsaXBzZSAzLjEKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFdvcmtiZW5jaEFkYXB0ZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7Ci0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldEltYWdlRGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gKChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgbykuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgRmlsZSBmRmlsZTsKLQlwcml2YXRlIFdvcmtiZW5jaEFkYXB0ZXIgZldvcmtiZW5jaEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoQWRhcHRlcigpOwotCi0JcHVibGljIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KEZpbGUgZmlsZSkgewotCQlzdXBlcigpOwotCQlmRmlsZSA9IGZpbGU7Ci0JCWZXb3JrYmVuY2hBZGFwdGVyID0gbmV3IFdvcmtiZW5jaEFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gZkZpbGUuZXhpc3RzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKLQkgKi8KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUxvY2F0aW9uUHJvdmlkZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChJV29ya2JlbmNoQWRhcHRlci5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQlyZXR1cm4gZldvcmtiZW5jaEFkYXB0ZXI7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JTG9jYXRpb25Qcm92aWRlciNnZXRQYXRoKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhdGgoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgewotCQkJRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoaW5wdXQuZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dCNnZXRQYXRoKCkKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBQYXRoLmZyb21PU1N0cmluZyhmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgfQotCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAobyBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgbzsKLQkJCXJldHVybiBmRmlsZS5lcXVhbHMoaW5wdXQuZkZpbGUpOwotCQl9Ci0JCQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElQYXRoRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgIElQYXRoRWRpdG9ySW5wdXQgaW5wdXQ9IChJUGF0aEVkaXRvcklucHV0KW87Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UGF0aCgpLmVxdWFscyhpbnB1dC5nZXRQYXRoKCkpOwotICAgICAgICB9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkZpbGUuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiYmFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBleHRlcm5hbCBmaWxlcy4KLSAqLwotY2xhc3MgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCQotCXByaXZhdGUgSVJlZ2lvbiBmSHlwZXJsaW5rUmVnaW9uOwotCXByaXZhdGUgRmlsZSBmSHlwZXJsaW5rRmlsZTsKLQotCXB1YmxpYyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIEZpbGUgZmlsZSkgewotCQlmSHlwZXJsaW5rRmlsZSA9IGZpbGU7Ci0JCWZIeXBlcmxpbmtSZWdpb24gPSByZWdpb247Ci0JfQotCQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZIeXBlcmxpbmtSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuT3BlbiwgZkh5cGVybGlua0ZpbGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZkh5cGVybGlua0ZpbGUgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEV4dGVybmFsRmlsZUVkaXRvcklucHV0KGZIeXBlcmxpbmtGaWxlKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCksIHRydWUpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNQSmF2YUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZWFlYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgSlNQIEphdmEgZWxlbWVudHMKLSAqLwotY2xhc3MgSlNQSmF2YUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgSUphdmFFbGVtZW50IGZFbGVtZW50OwotCi0JcHVibGljIEpTUEphdmFIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rUmVnaW9uKCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5PcGVuLCBKYXZhRWxlbWVudExhYmVscy5nZXRFbGVtZW50TGFiZWwoZkVsZW1lbnQsIEphdmFFbGVtZW50TGFiZWxzLkFMTF9QT1NUX1FVQUxJRklFRCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQl0cnkgewotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSmF2YVVJLm9wZW5JbkVkaXRvcihmRWxlbWVudCk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlKYXZhVUkucmV2ZWFsSW5FZGl0b3IoZWRpdG9yLCBmRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTUEphdmFIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2ZGVlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTUEphdmFIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotICogRGV0ZWN0cyBoeXBlcmxpbmtzIGluIEpTUCBKYXZhIGNvbnRlbnQKLSAqLwotcHVibGljIGNsYXNzIEpTUEphdmFIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3IgewotCi0JcHJpdmF0ZSBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhJSmF2YUVsZW1lbnQgZWxlbWVudCwgSVJlZ2lvbiByZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBudWxsOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIG9wZW4gbG9jYWwgdmFyaWFibGUgaW4gdGhlIEpTUCBmaWxlLi4uCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTb3VyY2VSZWZlcmVuY2UpIHsKLQkJCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCQlpbnQganNwT2Zmc2V0ID0gMDsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0KLQkJCQkvLyB0cnkgdG8gbG9jYXRlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkJCQl0cnkgewotCQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlVUklSZXNvbHZlciByZXNvbHZlciA9IHNNb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCQkJaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gcmVzb2x2ZXIuZ2V0RmlsZUJhc2VMb2NhdGlvbigpOwotCQkJCQkJCWZpbGUgPSBnZXRGaWxlKHVyaVN0cmluZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0KLQkJCQkvLyBnZXQgSmF2YSByYW5nZSwgdHJhbnNsYXRlIGNvb3JkaW5hdGUgdG8gSlNQCi0KLQkJCQl0cnkgewotCQkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBudWxsOwotCQkJCQlJSlNQVHJhbnNsYXRpb24ganNwVHJhbnNsYXRpb24gPSBnZXRKU1BUcmFuc2xhdGlvbihkb2N1bWVudCk7Ci0JCQkJCWlmIChqc3BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkvLyBsaW5rIHRvIGxvY2FsIHZhcmlhYmxlIGRlZmluaXRpb25zCi0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElMb2NhbFZhcmlhYmxlKSB7Ci0JCQkJCQkJcmFuZ2UgPSAoKElMb2NhbFZhcmlhYmxlKSBlbGVtZW50KS5nZXROYW1lUmFuZ2UoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGxpbmtpbmcgdG8gZmllbGRzIG9mIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJCWVsc2UgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLQkJCQkJCQlPYmplY3QgY3UgPSAoKElGaWVsZCkgZWxlbWVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCQkJaWYgKGN1ICE9IG51bGwgJiYgY3UuZXF1YWxzKGpzcFRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpKSkKLQkJCQkJCQkJcmFuZ2UgPSAoKElTb3VyY2VSZWZlcmVuY2UpIGVsZW1lbnQpLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBsaW5raW5nIHRvIG1ldGhvZHMgb2YgdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdAotCQkJCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLQkJCQkJCQlPYmplY3QgY3UgPSAoKElNZXRob2QpIGVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQkJCWlmIChjdSAhPSBudWxsICYmIGN1LmVxdWFscyhqc3BUcmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKSkpCi0JCQkJCQkJCXJhbmdlID0gKChJU291cmNlUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHJhbmdlICE9IG51bGwgJiYgZmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlqc3BPZmZzZXQgPSBqc3BUcmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQocmFuZ2UuZ2V0T2Zmc2V0KCkpOwotCQkJCQkJaWYgKGpzcE9mZnNldCA+PSAwKSB7Ci0JCQkJCQkJbGluayA9IG5ldyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKHJlZ2lvbiwgZmlsZSwgbmV3IFJlZ2lvbihqc3BPZmZzZXQsIHJhbmdlLmdldExlbmd0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgam1lLmdldE1lc3NhZ2UoKSwgam1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQkJbGluayA9IG5ldyBKU1BKYXZhSHlwZXJsaW5rKHJlZ2lvbiwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3IjZGV0ZWN0SHlwZXJsaW5rcyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCUxpc3QgaHlwZXJsaW5rcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCi0JCQkvLyBjaGVjayBhbmQgbWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBKYXZhIHR5cGUKLQkJCUpTUFRyYW5zbGF0aW9uIGpzcFRyYW5zbGF0aW9uID0gZ2V0SlNQVHJhbnNsYXRpb24oZG9jdW1lbnQpOwotCQkJaWYgKGpzcFRyYW5zbGF0aW9uICE9IG51bGwpIHsKLQkJCQkvLyBjaGVjayBpZiB3ZSBhcmUgaW4gSlNQIEphdmEgY29udGVudAotCQkJCWludCBqYXZhT2Zmc2V0ID0ganNwVHJhbnNsYXRpb24uZ2V0SmF2YU9mZnNldChyZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCWlmIChqYXZhT2Zmc2V0ID4gLTEpIHsKLQkJCQkJLy8gY2hlY2sgdGhhdCB3ZSBhcmUgbm90IGluIGluZGlyZWN0IEphdmEgY29udGVudCAobGlrZQotCQkJCQkvLyBpbmNsdWRlZCBmaWxlcykKLQkJCQkJaWYgKCFqc3BUcmFuc2xhdGlvbi5pc0luZGlyZWN0KGphdmFPZmZzZXQpKSB7Ci0JCQkJCQkvLyBnZXQgSmF2YSBlbGVtZW50cwotCQkJCQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBqc3BUcmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJLy8gY3JlYXRlIGEgSlNQSmF2YUh5cGVybGluayBmb3IgZWFjaCBKYXZhIGVsZW1lbnQKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0KLQkJCQkJCQkJLy8gZmluZCBoeXBlcmxpbmsgcmFuZ2UgZm9yIEphdmEgZWxlbWVudAotCQkJCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IHNlbGVjdFdvcmQoZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCQkJCUlIeXBlcmxpbmsgbGluayA9IGNyZWF0ZUh5cGVybGluayhlbGVtZW50LCBoeXBlcmxpbmtSZWdpb24sIGRvY3VtZW50KTsKLQkJCQkJCQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJCQkJCQkJaHlwZXJsaW5rcy5hZGQobGluayk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaHlwZXJsaW5rcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElIeXBlcmxpbmtbXSkgaHlwZXJsaW5rcy50b0FycmF5KG5ldyBJSHlwZXJsaW5rWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBpZiBwb3NzaWJsZSwgbnVsbCBpZiBjYW5ub3QgZmluZAotCSAqIGZpbGUgZnJvbSB1cmkuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIHJldHVybnMgSUZpbGUgaWYgZmlsZVN0cmluZyBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZVN0cmluZykgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQotCQlpZiAoZmlsZVN0cmluZyAhPSBudWxsKSB7Ci0JCQlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZVN0cmluZyk7Ci0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAxICYmIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCkuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJCX0KLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKGZpbGVQYXRoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGZpbGUgPT0gbnVsbDsgaSsrKQotCQkJCWlmIChmaWxlc1tpXS5leGlzdHMoKSkKLQkJCQkJZmlsZSA9IGZpbGVzW2ldOwotCQl9Ci0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuIEpTUFRyYW5zbGF0aW9uIGlmIG9uZSBleGlzdHMsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbiBnZXRKU1BUcmFuc2xhdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCi0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0JfQotCi0JLyoqCi0JICogSmF2YSBhbHdheXMgc2VsZWN0cyB3b3JkIHdoZW4gZGVmaW5pbmcgcmVnaW9uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIGFuY2hvcgotCSAqIEByZXR1cm4gSVJlZ2lvbgotCSAqLwotCXByaXZhdGUgSVJlZ2lvbiBzZWxlY3RXb3JkKElEb2N1bWVudCBkb2N1bWVudCwgaW50IGFuY2hvcikgewotCi0JCXRyeSB7Ci0JCQlpbnQgb2Zmc2V0ID0gYW5jaG9yOwotCQkJY2hhciBjOwotCi0JCQl3aGlsZSAob2Zmc2V0ID49IDApIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQotCQkJCQlicmVhazsKLQkJCQktLW9mZnNldDsKLQkJCX0KLQotCQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCi0JCQlvZmZzZXQgPSBhbmNob3I7Ci0JCQlpbnQgbGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJCXdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQotCQkJCQlicmVhazsKLQkJCQkrK29mZnNldDsKLQkJCX0KLQotCQkJaW50IGVuZCA9IG9mZnNldDsKLQotCQkJaWYgKHN0YXJ0ID09IGVuZCkKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCwgMCk7Ci0KLQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0ICsgMSwgZW5kIC0gc3RhcnQgLSAxKTsKLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVExERmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UTERGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmIwZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UTERGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi1jbGFzcyBUTERGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBmUmVzb3VyY2U7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZIeXBlcmxpbmtSZWdpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZlNlYXJjaE5hbWU7Ci0JcHJpdmF0ZSBpbnQgZlNlYXJjaFR5cGU7Ci0KLQlwdWJsaWMgVExERmlsZUh5cGVybGluayhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBzZWFyY2hUeXBlLCBTdHJpbmcgc2VhcmNoTmFtZSwgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24pIHsKLQkJc3VwZXIoKTsKLQkJZlJlc291cmNlID0gcmVzb3VyY2U7Ci0JCWZTZWFyY2hOYW1lID0gc2VhcmNoTmFtZTsKLQkJZlNlYXJjaFR5cGUgPSBzZWFyY2hUeXBlOwotCQlmSHlwZXJsaW5rUmVnaW9uID0gaHlwZXJsaW5rUmVnaW9uOwotCX0KLQotCXByaXZhdGUgSU1hcmtlciBjcmVhdGVNYXJrZXIoSUZpbGUgZmlsZSwgSVJlZ2lvbiByZWdpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXMuc2V0Q2hhclN0YXJ0KElNYXJrZXIsIGludCkKLQkJSU1hcmtlciBtYXJrZXIgPSBmaWxlLmNyZWF0ZU1hcmtlcihKU1BVSVBsdWdpbi5JRCArICJoeXBlcmxpbmsiKTsgLy8kTk9OLU5MUy0xJAotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuVFJBTlNJRU5ULCBCb29sZWFuLlRSVUUpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU09VUkNFX0lELCBnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCXJldHVybiBtYXJrZXI7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZkh5cGVybGlua1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCXJldHVybiBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLk9wZW4sIGZSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IEpTUFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoZlJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGZSZXNvdXJjZTsKLQkJCQlJTWFya2VyIG1hcmtlciA9IG51bGw7Ci0JCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQkJZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQkJCQkJCWlmIChkb21Nb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkJSVJlZ2lvbiB0YXJnZXRSZWdpb24gPSBUYWdsaWJIeXBlcmxpbmtEZXRlY3Rvci5maW5kRGVmaW5pdGlvbihkb21Nb2RlbCwgZlNlYXJjaE5hbWUsIGZTZWFyY2hUeXBlKTsKLQkJCQkJCQlpZiAodGFyZ2V0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCW1hcmtlciA9IGNyZWF0ZU1hcmtlcihmaWxlLCB0YXJnZXRSZWdpb24pOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKG1hcmtlciAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBtYXJrZXIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoZG9tTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJZG9tTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkh5cGVybGlua0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDgyZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLkFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5VUkxIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLkNNRWxlbWVudERlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UYWdsaWJUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUTERSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogRGV0ZWN0cyBoeXBlcmxpbmtzIGZvciB0YWdsaWJzLgotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliSHlwZXJsaW5rRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBKQVJfUFJPVE9DT0wgPSAiamFyOmZpbGU6IjsvLyROT04tTkxTLTEkCi0JLy8gcHJpdmF0ZSBTdHJpbmcgVVJOX1RBR0RJUiA9ICJ1cm46anNwdGFnZGlyOiI7Ci0JcHJpdmF0ZSBTdHJpbmcgVVJOX1RMRCA9ICJ1cm46anNwdGxkOiI7Ci0JcHJpdmF0ZSBTdHJpbmcgWE1MTlMgPSAieG1sbnM6IjsgLy8kTk9OLU5MUy0xJCAKLQkKLQlzdGF0aWMgZmluYWwgaW50IFRBRyA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEUgPSAyOwotCQotCXN0YXRpYyBJUmVnaW9uIGZpbmREZWZpbml0aW9uKElET01Nb2RlbCBtb2RlbCwgU3RyaW5nIHNlYXJjaE5hbWUsIGludCBzZWFyY2hUeXBlKSB7Ci0JCU5vZGVMaXN0IGRlY2xhcmF0aW9ucyA9IG51bGw7Ci0JCWlmIChzZWFyY2hUeXBlID09IFRBRykKLQkJCWRlY2xhcmF0aW9ucyA9IG1vZGVsLmdldERvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiKiIsIEpTUDExVExETmFtZXMuVEFHKTsKLQkJZWxzZSBpZiAoc2VhcmNoVHlwZSA9PSBBVFRSSUJVVEUpCi0JCQlkZWNsYXJhdGlvbnMgPSBtb2RlbC5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCBKU1AxMVRMRE5hbWVzLkFUVFJJQlVURSk7Ci0JCWlmIChkZWNsYXJhdGlvbnMgPT0gbnVsbCB8fCBkZWNsYXJhdGlvbnMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKHNlYXJjaFR5cGUgPT0gVEFHKQotCQkJCWRlY2xhcmF0aW9ucyA9IG1vZGVsLmdldERvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTFUTEROYW1lcy5UQUcpOwotCQkJZWxzZSBpZiAoc2VhcmNoVHlwZSA9PSBBVFRSSUJVVEUpCi0JCQkJZGVjbGFyYXRpb25zID0gbW9kZWwuZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMVRMRE5hbWVzLkFUVFJJQlVURSk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNsYXJhdGlvbnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZUxpc3QgbmFtZXMgPSBtb2RlbC5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDExVExETmFtZXMuTkFNRSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IG5hbWVzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGdldENvbnRhaW5lZFRleHQobmFtZXMuaXRlbShqKSk7Ci0JCQkJaWYgKHNlYXJjaE5hbWUuY29tcGFyZVRvKG5hbWUpID09IDApIHsKLQkJCQkJaW50IHN0YXJ0ID0gLTE7Ci0JCQkJCWludCBlbmQgPSAtMTsKLQkJCQkJTm9kZSBjYXJldCA9IG5hbWVzLml0ZW0oaikuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQlpZiAoY2FyZXQgIT0gbnVsbCkgewotCQkJCQkJc3RhcnQgPSAoKElET01Ob2RlKSBjYXJldCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCQl3aGlsZSAoY2FyZXQgIT0gbnVsbCkgewotCQkJCQkJZW5kID0gKChJRE9NTm9kZSkgY2FyZXQpLmdldEVuZE9mZnNldCgpOwotCQkJCQkJY2FyZXQgPSBjYXJldC5nZXROZXh0U2libGluZygpOwotCQkJCQl9Ci0JCQkJCWlmIChzdGFydCA+IDApIHsKLQkJCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGFpbmVkVGV4dChOb2RlIHBhcmVudCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW4uaXRlbSgwKS5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCQlTdHJpbmcgcmVmZXJlbmNlID0gKChFbnRpdHlSZWZlcmVuY2UpIGNoaWxkKS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAocmVmZXJlbmNlID09IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCXJlZmVyZW5jZSA9ICImIiArIGNoaWxkLmdldE5vZGVOYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJcy5hcHBlbmQocmVmZXJlbmNlLnRyaW0oKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcy5hcHBlbmQoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpKTsKLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcy50b1N0cmluZygpLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgewotCQlJSHlwZXJsaW5rIGh5cGVybGluayA9IG51bGw7Ci0KLQkJaWYgKHRleHRWaWV3ZXIgIT0gbnVsbCAmJiByZWdpb24gIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvYyA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGNoZWNrIGlmIGpzcCB0YWcvZGlyZWN0aXZlIGZpcnN0Ci0JCQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBUZXh0VXRpbGl0aWVzLmdldFBhcnRpdGlvbihkb2MsIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIHJlZ2lvbi5nZXRPZmZzZXQoKSwgZmFsc2UpOwotCQkJCQlpZiAocGFydGl0aW9uICE9IG51bGwgJiYgcGFydGl0aW9uLmdldFR5cGUoKSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKSB7Ci0JCQkJCQkvLyBjaGVjayBpZiBqc3AgdGFnbGliIGRpcmVjdGl2ZQotCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IGdldEN1cnJlbnROb2RlKGRvYywgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uRm9yVGFnbGliID0gZ2V0QmFzZUxvY2F0aW9uRm9yVGFnbGliKGRvYyk7Ci0JCQkJCQkJaWYgKGJhc2VMb2NhdGlvbkZvclRhZ2xpYiAhPSBudWxsICYmIEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIuZXF1YWxzSWdub3JlQ2FzZShjdXJyZW50Tm9kZS5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJCQkvKioKLQkJCQkJCQkJICogVGhlIHRhZ2xpYiBkaXJlY3RpdmUgaXRzZWxmCi0JCQkJCQkJCSAqLwotCQkJCQkJCQkvLyBnZXQgdGhlIHVyaSBhdHRyaWJ1dGUKLQkJCQkJCQkJQXR0ciB0YWdsaWJVUklOb2RlID0gKChFbGVtZW50KSBjdXJyZW50Tm9kZSkuZ2V0QXR0cmlidXRlTm9kZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVVJJKTsKLQkJCQkJCQkJaWYgKHRhZ2xpYlVSSU5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQkJSVRhZ2xpYlJlY29yZCByZWZlcmVuY2UgPSBUYWdsaWJJbmRleC5yZXNvbHZlKGJhc2VMb2NhdGlvbkZvclRhZ2xpYiwgdGFnbGliVVJJTm9kZS5nZXRWYWx1ZSgpLCBmYWxzZSk7Ci0JCQkJCQkJCQkvLyB3aGVuIHVzaW5nIGEgdGFnZGlyCi0JCQkJCQkJCQkvLyAoSVRhZ2xpYlJlY29yZC5UQUdESVIpLAotCQkJCQkJCQkJLy8gdGhlcmUncyBub3RoaW5nIHRvIGxpbmsgdG8KLQkJCQkJCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJCS8vIGhhbmRsZSB0YWdsaWJzCi0JCQkJCQkJCQkJc3dpdGNoIChyZWZlcmVuY2UuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQkJCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQkJCQkJCQkJCUlUTERSZWNvcmQgcmVjb3JkID0gKElUTERSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQkJCQkJCQkJCVN0cmluZyB1cmlTdHJpbmcgPSByZWNvcmQuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbih0YWdsaWJVUklOb2RlLCByZWdpb24pOwotCQkJCQkJCQkJCQkJaWYgKGh5cGVybGlua1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQkJaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKHVyaVN0cmluZywgaHlwZXJsaW5rUmVnaW9uLCBkb2MsIG51bGwpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDoKLQkJCQkJCQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCQkJCQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBnZXRIeXBlcmxpbmtSZWdpb24odGFnbGliVVJJTm9kZSwgcmVnaW9uKTsKLQkJCQkJCQkJCQkJCWlmIChoeXBlcmxpbmtSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJCWh5cGVybGluayA9IG5ldyBUYWdsaWJKYXJVcmlIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCByZWZlcmVuY2UpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKGJhc2VMb2NhdGlvbkZvclRhZ2xpYiAhPSBudWxsICYmIEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QuZXF1YWxzSWdub3JlQ2FzZShjdXJyZW50Tm9kZS5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJCQkvKioKLQkJCQkJCQkJICogVGhlIGpzcDpyb290IGVsZW1lbnQKLQkJCQkJCQkJICovCi0JCQkJCQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IGN1cnJlbnROb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCQkJCQkJCWlmIChhdHRyLmdldE5vZGVOYW1lKCkuc3RhcnRzV2l0aChYTUxOUykpIHsKLQkJCQkJCQkJCQlTdHJpbmcgdXJpID0gU3RyaW5nVXRpbHMuc3RyaXAoYXR0ci5nZXROb2RlVmFsdWUoKSk7Ci0JCQkJCQkJCQkJaWYgKHVyaS5zdGFydHNXaXRoKFVSTl9UTEQpKSB7Ci0JCQkJCQkJCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoVVJOX1RMRC5sZW5ndGgoKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCUlUYWdsaWJSZWNvcmQgcmVmZXJlbmNlID0gVGFnbGliSW5kZXgucmVzb2x2ZShiYXNlTG9jYXRpb25Gb3JUYWdsaWIsIHVyaSwgZmFsc2UpOwotCQkJCQkJCQkJCS8vIHdoZW4gdXNpbmcgYSB0YWdkaXIKLQkJCQkJCQkJCQkvLyAoSVRhZ2xpYlJlY29yZC5UQUdESVIpLAotCQkJCQkJCQkJCS8vIHRoZXJlJ3Mgbm90aGluZyB0byBsaW5rIHRvCi0JCQkJCQkJCQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCS8vIGhhbmRsZSB0YWdsaWJzCi0JCQkJCQkJCQkJCXN3aXRjaCAocmVmZXJlbmNlLmdldFJlY29yZFR5cGUoKSkgewotCQkJCQkJCQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UTEQpIDogewotCQkJCQkJCQkJCQkJCUlUTERSZWNvcmQgcmVjb3JkID0gKElUTERSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQkJCQkJCQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gcmVjb3JkLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCQkJCQkJCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKGF0dHIsIHJlZ2lvbik7Ci0JCQkJCQkJCQkJCQkJaWYgKGh5cGVybGlua1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQkJCWh5cGVybGluayA9IGNyZWF0ZUh5cGVybGluayh1cmlTdHJpbmcsIGh5cGVybGlua1JlZ2lvbiwgZG9jLCBudWxsKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOgotCQkJCQkJCQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCQkJCQkJCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKGF0dHIsIHJlZ2lvbik7Ci0JCQkJCQkJCQkJCQkJaWYgKGh5cGVybGlua1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQkJCWh5cGVybGluayA9IG5ldyBUYWdsaWJKYXJVcmlIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCByZWZlcmVuY2UpOwotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLyoqCi0JCQkJCQkJCSAqIEh5cGVybGluayBjdXN0b20gdGFnIHRvIGl0cyBUTEQgb3IgdGFnIGZpbGUKLQkJCQkJCQkJICovCi0JCQkJCQkJCVRMRENNRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoZG9jKTsKLQkJCQkJCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQlMaXN0IGRvY3VtZW50VHJhY2tlcnMgPSBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGN1cnJlbnROb2RlLmdldFByZWZpeCgpLCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N1bWVudFRyYWNrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGRvY3VtZW50VHJhY2tlcnMuZ2V0KGkpOwotCQkJCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHRyYWNrZXIuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oY3VycmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQkJCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlkZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSAoKENNTm9kZVdyYXBwZXIpIGRlY2wpLmdldE9yaWdpbk5vZGUoKTsKLQkJCQkJCQkJCQkJaWYgKGRlY2wgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwpIHsKLQkJCQkJCQkJCQkJCVN0cmluZyBiYXNlID0gKChDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwpIGRlY2wpLmdldExvY2F0aW9uU3RyaW5nKCk7Ci0JCQkJCQkJCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihjdXJyZW50Tm9kZSwgcmVnaW9uKTsKLQkJCQkJCQkJCQkJCWlmIChoeXBlcmxpbmtSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJCWh5cGVybGluayA9IGNyZWF0ZUh5cGVybGluayhiYXNlLCBoeXBlcmxpbmtSZWdpb24sIGRvYywgY3VycmVudE5vZGUpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGluayAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBJSHlwZXJsaW5rW117aHlwZXJsaW5rfTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwgKGlmIHdpdGhpbiB3b3Jrc3BhY2UsCi0JICogbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gd29ya3NwYWNlLCBvdGhlcndpc2UsIGZpbGUgc3lzdGVtIHBhdGgpCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uRm9yVGFnbGliKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQliYXNlTG9jID0gc01vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlTG9jOwotCX0KLQotCS8vIHRoZSBiZWxvdyBtZXRob2RzIHdlcmUgY29waWVkIGZyb20gVVJJSHlwZXJsaW5rRGV0ZWN0b3IKLQotCXByaXZhdGUgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oTm9kZSBub2RlLCBJUmVnaW9uIGJvdW5kaW5nUmVnaW9uKSB7Ci0JCUlSZWdpb24gaHlwZXJSZWdpb24gPSBudWxsOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJCQlJRE9NTm9kZSBkb2NOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGRvY05vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZXMKLQkJCQlJRE9NQXR0ciBhdHQgPSAoSURPTUF0dHIpIG5vZGU7Ci0JCQkJLy8gZG8gbm90IGluY2x1ZGUgcXVvdGVzIGluIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24KLQkJCQlpbnQgcmVnT2Zmc2V0ID0gYXR0LmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dC5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCByZWdMZW5ndGggPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCVN0cmluZyBhdHRWYWx1ZSA9IGF0dC5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKFN0cmluZ1V0aWxzLmlzUXVvdGVkKGF0dFZhbHVlKSkgewotCQkJCQkJKytyZWdPZmZzZXQ7Ci0JCQkJCQlyZWdMZW5ndGggPSByZWdMZW5ndGggLSAyOwotCQkJCQl9Ci0JCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihyZWdPZmZzZXQsIHJlZ0xlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJLy8gSGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJCQlJRE9NTm9kZSBkb2NOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCWh5cGVyUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbihkb2NOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJCWlmIChoeXBlclJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGRvY05vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvKioKLQkJICogT25seSByZXR1cm4gYSBoeXBlcmxpbmsgcmVnaW9uIHRoYXQgb3ZlcmxhcHMgdGhlIHNlYXJjaCByZWdpb24uCi0JCSAqIFRoaXMgd2lsbCBoZWxwIHVzIHRvIG5vdCB1bmRlcmxpbmUgYXJlYXMgbm90IHVuZGVyIHRoZSBjdXJzb3IuCi0JCSAqLwotCQlpZiAoaHlwZXJSZWdpb24gIT0gbnVsbCAmJiBpbnRlcnNlY3RzKGh5cGVyUmVnaW9uLCBib3VuZGluZ1JlZ2lvbikpCi0JCQlyZXR1cm4gaHlwZXJSZWdpb247Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbnRlcnNlY3RzKElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBJUmVnaW9uIGRldGVjdGlvblJlZ2lvbikgewotCQlpbnQgaHlwZXJMaW5rU3RhcnQgPSBoeXBlcmxpbmtSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCBoeXBlckxpbmtFbmQgPSBoeXBlcmxpbmtSZWdpb24uZ2V0T2Zmc2V0KCkgKyBoeXBlcmxpbmtSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWludCBkZXRlY3Rpb25TdGFydCA9IGRldGVjdGlvblJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJaW50IGRldGVjdGlvbkVuZCA9IGRldGVjdGlvblJlZ2lvbi5nZXRPZmZzZXQoKSArIGRldGVjdGlvblJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJcmV0dXJuIChoeXBlckxpbmtTdGFydCA8PSBkZXRlY3Rpb25TdGFydCAmJiBkZXRlY3Rpb25TdGFydCA8IGh5cGVyTGlua0VuZCkgfHwgKGh5cGVyTGlua1N0YXJ0IDw9IGRldGVjdGlvbkVuZCAmJiBkZXRlY3Rpb25FbmQgPD0gaHlwZXJMaW5rRW5kKTsvLyB8fAotCX0KLQotCXByaXZhdGUgSVJlZ2lvbiBnZXROYW1lUmVnaW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24pIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQluYW1lUmVnaW9uID0gcjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBSZWdpb24oY29udGFpbmVyUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgaHlwZXJsaW5rCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEBwYXJhbSBoeXBlcmxpbmtSZWdpb24KLQkgKiBAcmV0dXJuIElIeXBlcmxpbmsKLQkgKi8KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKFN0cmluZyB1cmlTdHJpbmcsIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgbm9kZSkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBudWxsOwotCi0JCWlmICh1cmlTdHJpbmcgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRlbXAgPSB1cmlTdHJpbmcudG9Mb3dlckNhc2UoKTsKLQkJCWlmICh0ZW1wLnN0YXJ0c1dpdGgoSFRUUF9QUk9UT0NPTCkpIHsKLQkJCQkvLyB0aGlzIGlzIGEgVVJMSHlwZXJsaW5rIHNpbmNlIHRoaXMgaXMgYSB3ZWIgYWRkcmVzcwotCQkJCWxpbmsgPSBuZXcgVVJMSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgdXJpU3RyaW5nKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRlbXAuc3RhcnRzV2l0aChKQVJfUFJPVE9DT0wpKSB7Ci0JCQkJLy8gdGhpcyBpcyBhIFVSTEZpbGVIeXBlcmxpbmsgc2luY2UgdGhpcyBpcyBhIGxvY2FsIGFkZHJlc3MKLQkJCQl0cnkgewotCQkJCQlsaW5rID0gbmV3IFVSTEZpbGVSZWdpb25IeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBUQUcsIG5vZGUuZ2V0TG9jYWxOYW1lKCksIG5ldyBVUkwodXJpU3RyaW5nKSkgewotCQkJCQkJcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkJCQkJCXJldHVybiBKU1BVSU1lc3NhZ2VzLkN1c3RvbVRhZ0h5cGVybGlua19oeXBlcmxpbmtUZXh0OwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aCh1cmlTdHJpbmcpOwotCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCQlpZiAoZmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCWxpbmsgPSBuZXcgVExERmlsZUh5cGVybGluayhmaWxlLCBUQUcsIG5vZGUuZ2V0TG9jYWxOYW1lKCksIGh5cGVybGlua1JlZ2lvbikgewotCQkJCQkJCQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCQkJCQkJCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5DdXN0b21UYWdIeXBlcmxpbmtfaHlwZXJsaW5rVGV4dDsKLQkJCQkJCQkJfQotCQkJCQkJCX07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlsaW5rID0gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBmaWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChsaW5rID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIGlzIGFuIEV4dGVybmFsRmlsZUh5cGVybGluayBzaW5jZSBmaWxlIGRvZXMgbm90IGV4aXN0Ci0JCQkJLy8gaW4gd29ya3NwYWNlCi0JCQkJRmlsZSBleHRlcm5hbEZpbGUgPSBuZXcgRmlsZSh1cmlTdHJpbmcpOwotCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgZXh0ZXJuYWxGaWxlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50LiBudWxsIGlmIG5vCi0JICogbm9kZSBpcyBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIE5vZGUgZWl0aGVyIGVsZW1lbnQsIGRvY3R5cGUsIHRleHQsIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIGdldCB0aGUgY3VycmVudCBub2RlIGF0IHRoZSBvZmZzZXQgKHJldHVybnMgZWl0aGVyOiBlbGVtZW50LAotCQkvLyBkb2N0eXBlLCB0ZXh0KQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCQkJaWYgKGlub2RlID09IG51bGwpIHsKLQkJCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQgLSAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0KLQkJaWYgKGlub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIChOb2RlKSBpbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkphckh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1MmFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkphckh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciB0YWdsaWIgZmlsZXMgaW4gamFycy4KLSAqLwotY2xhc3MgVGFnbGliSmFySHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0Jc3RhdGljIGNsYXNzIFppcFN0b3JhZ2UgaW1wbGVtZW50cyBJU3RvcmFnZSB7Ci0JCUZpbGUgZkZpbGUgPSBudWxsOwotCQlTdHJpbmcgZkVudHJ5TmFtZSA9IG51bGw7Ci0KLQkJWmlwU3RvcmFnZShGaWxlIGZpbGUsIFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJCWZGaWxlID0gZmlsZTsKLQkJCWZFbnRyeU5hbWUgPSBlbnRyeU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlaaXBGaWxlIGZpbGUgPSBuZXcgWmlwRmlsZShmRmlsZSk7Ci0JCQkJWmlwRW50cnkgZW50cnkgPSBmaWxlLmdldEVudHJ5KGZFbnRyeU5hbWUpOwotCQkJCXN0cmVhbSA9IGZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuRVJST1IsIGdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZSkpOwotCQkJfQotCQkJcmV0dXJuIHN0cmVhbTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aCBnZXRGdWxsUGF0aCgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArIElQYXRoLlNFUEFSQVRPUiArIGZFbnRyeU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZFbnRyeU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIElQYXRoIGZaaXBGaWxlUGF0aDsKLQotCXB1YmxpYyBUYWdsaWJKYXJIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElQYXRoIHppcEZpbGVQYXRoKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZaaXBGaWxlUGF0aCA9IHppcEZpbGVQYXRoOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLlRMREh5cGVybGlua19oeXBlcmxpbmtUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBVUkxGaWxlSHlwZXJsaW5rLlN0b3JhZ2VFZGl0b3JJbnB1dChuZXcgWmlwU3RvcmFnZShmWmlwRmlsZVBhdGgudG9GaWxlKCksICJNRVRBLUlORi90YWdsaWIudGxkIikpOyAvLyROT04tTkxTLTEkCi0JCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCXRyeSB7Ci0JCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSmFyVXJpSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkphclVyaUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQwNzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSmFyVXJpSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JSmFyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYlJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklVUkxSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgdGFnbGliIGZpbGVzIGluIGphcnMgb3Igc3BlY2lmaWVkIGJ5IHVybHMuCi0gKi8KLWNsYXNzIFRhZ2xpYkphclVyaUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgSVRhZ2xpYlJlY29yZCBmVGFnbGliUmVjb3JkOwotCXByaXZhdGUgSUh5cGVybGluayBmSHlwZXJsaW5rOwotCi0JcHVibGljIFRhZ2xpYkphclVyaUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSVRhZ2xpYlJlY29yZCByZWNvcmQpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZlRhZ2xpYlJlY29yZCA9IHJlY29yZDsKLQl9Ci0KLQlwcml2YXRlIElIeXBlcmxpbmsgZ2V0SHlwZXJsaW5rKCkgewotCQlpZiAoZkh5cGVybGluayA9PSBudWxsICYmIGZUYWdsaWJSZWNvcmQgIT0gbnVsbCkgewotCQkJc3dpdGNoIChmVGFnbGliUmVjb3JkLmdldFJlY29yZFR5cGUoKSkgewotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgZlRhZ2xpYlJlY29yZDsKLQkJCQkJZkh5cGVybGluayA9IG5ldyBUYWdsaWJKYXJIeXBlcmxpbmsoZlJlZ2lvbiwgcmVjb3JkLmdldExvY2F0aW9uKCkpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCQlJVVJMUmVjb3JkIHJlY29yZCA9IChJVVJMUmVjb3JkKSBmVGFnbGliUmVjb3JkOwotCQkJCQlmSHlwZXJsaW5rID0gbmV3IFVSTEZpbGVIeXBlcmxpbmsoZlJlZ2lvbiwgcmVjb3JkLmdldFVSTCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZIeXBlcmxpbms7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlJUmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0KLQkJSUh5cGVybGluayBsaW5rID0gZ2V0SHlwZXJsaW5rKCk7Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCXJlZ2lvbiA9IGxpbmsuZ2V0SHlwZXJsaW5rUmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuVExESHlwZXJsaW5rX2h5cGVybGlua1RleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJSUh5cGVybGluayBsaW5rID0gZ2V0SHlwZXJsaW5rKCk7Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCWxpbmsub3BlbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9VUkxGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5YzcyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIFVSTHMgKG9wZW5zIGluIHJlYWQtb25seSBtb2RlKQotICovCi1jbGFzcyBVUkxGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0Jc3RhdGljIGNsYXNzIFN0b3JhZ2VFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElTdG9yYWdlRWRpdG9ySW5wdXQgewotCQlJU3RvcmFnZSBmU3RvcmFnZSA9IG51bGw7Ci0KLQkJU3RvcmFnZUVkaXRvcklucHV0KElTdG9yYWdlIHN0b3JhZ2UpIHsKLQkJCWZTdG9yYWdlID0gc3RvcmFnZTsKLQkJfQotCi0JCXB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIGZTdG9yYWdlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkJcmV0dXJuIGZTdG9yYWdlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCXJldHVybiBmU3RvcmFnZS5lcXVhbHMoKChTdG9yYWdlRWRpdG9ySW5wdXQpIG9iaikuZlN0b3JhZ2UpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCQl9Ci0KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBmU3RvcmFnZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJCXJldHVybiBmU3RvcmFnZS5nZXRGdWxsUGF0aCgpICE9IG51bGwgPyBmU3RvcmFnZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgOiBmU3RvcmFnZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVVJMU3RvcmFnZSBpbXBsZW1lbnRzIElTdG9yYWdlIHsKLQkJVVJMIGZVUkwgPSBudWxsOwotCi0JCVVSTFN0b3JhZ2UoVVJMIHVybCkgewotCQkJZlVSTCA9IHVybDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVVJMU3RvcmFnZSkgewotCQkJCXJldHVybiBmVVJMLmVxdWFscygoKFVSTFN0b3JhZ2UpIG9iaikuZlVSTCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0gPSBmVVJMLm9wZW5TdHJlYW0oKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBmVVJMLnRvU3RyaW5nKCksIGUpKTsKLQkJCX0KLQkJCXJldHVybiBzdHJlYW07Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoZlVSTC50b1N0cmluZygpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmVVJMLmdldEZpbGUoKSkubGFzdFNlZ21lbnQoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBVUkwgZlVSTDsKLQotCXB1YmxpYyBVUkxGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBVUkwgdXJsKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZVUkwgPSB1cmw7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuT3BlbiwgZlVSTC50b1N0cmluZygpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZVUkwgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IFN0b3JhZ2VFZGl0b3JJbnB1dChuZXcgVVJMU3RvcmFnZShmVVJMKSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVSZWdpb25IeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVVJMRmlsZVJlZ2lvbkh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzdkNTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVVJMRmlsZVJlZ2lvbkh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgVVJMcyAob3BlbnMgaW4gcmVhZC1vbmx5IG1vZGUpCi0gKi8KLWNsYXNzIFVSTEZpbGVSZWdpb25IeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQlzdGF0aWMgY2xhc3MgU3RvcmFnZUVkaXRvcklucHV0IGltcGxlbWVudHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCB7Ci0JCUlTdG9yYWdlIGZTdG9yYWdlID0gbnVsbDsKLQotCQlTdG9yYWdlRWRpdG9ySW5wdXQoSVN0b3JhZ2Ugc3RvcmFnZSkgewotCQkJZlN0b3JhZ2UgPSBzdG9yYWdlOwotCQl9Ci0KLQkJcHVibGljIElTdG9yYWdlIGdldFN0b3JhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2UgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJcmV0dXJuIGZTdG9yYWdlLmVxdWFscygoKFN0b3JhZ2VFZGl0b3JJbnB1dCkgb2JqKS5mU3RvcmFnZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZTdG9yYWdlLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkJcmV0dXJuIGZTdG9yYWdlLmdldEZ1bGxQYXRoKCkgIT0gbnVsbCA/IGZTdG9yYWdlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSA6IGZTdG9yYWdlLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBVUkxTdG9yYWdlIGltcGxlbWVudHMgSVN0b3JhZ2UgewotCQlVUkwgZlVSTCA9IG51bGw7Ci0KLQkJVVJMU3RvcmFnZShVUkwgdXJsKSB7Ci0JCQlmVVJMID0gdXJsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBVUkxTdG9yYWdlKSB7Ci0JCQkJcmV0dXJuIGZVUkwuZXF1YWxzKCgoVVJMU3RvcmFnZSkgb2JqKS5mVVJMKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN0cmVhbSA9IGZVUkwub3BlblN0cmVhbSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuRVJST1IsIGZVUkwudG9TdHJpbmcoKSwgZSkpOwotCQkJfQotCQkJcmV0dXJuIHN0cmVhbTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aCBnZXRGdWxsUGF0aCgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmVVJMLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKGZVUkwuZ2V0RmlsZSgpKS5sYXN0U2VnbWVudCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIFVSTCBmVVJMOwotCXByaXZhdGUgaW50IGZTZWFyY2hUeXBlOwotCXByaXZhdGUgU3RyaW5nIGZTZWFyY2hOYW1lOwotCi0JcHVibGljIFVSTEZpbGVSZWdpb25IeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIGludCBzZWFyY2hUeXBlLCBTdHJpbmcgc2VhcmNoTmFtZSwgVVJMIHVybCkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmVVJMID0gdXJsOwotCQlmU2VhcmNoTmFtZSA9IHNlYXJjaE5hbWU7Ci0JCWZTZWFyY2hUeXBlID0gc2VhcmNoVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5PcGVuLCBmVVJMLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZlVSTCAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgU3RvcmFnZUVkaXRvcklucHV0KG5ldyBVUkxTdG9yYWdlKGZVUkwpKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCkpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJRWRpdG9yUGFydCBvcGVuZWRFZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQkJSVJlZ2lvbiBkZWZpbml0aW9uUmVnaW9uID0gZmluZERlZmluaXRpb25SZWdpb24obmV3IFVSTFN0b3JhZ2UoZlVSTCkpOwotCQkJCQlpZiAoZGVmaW5pdGlvblJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlvcGVuZWRFZGl0b3IuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKG5ldyBUZXh0U2VsZWN0aW9uKGRlZmluaXRpb25SZWdpb24uZ2V0T2Zmc2V0KCksIGRlZmluaXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVJlZ2lvbiBmaW5kRGVmaW5pdGlvblJlZ2lvbihJU3RvcmFnZSBzdG9yYWdlKSB7Ci0JCUlSZWdpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChzdG9yYWdlLmdldE5hbWUoKSwgc3RvcmFnZS5nZXRDb250ZW50cygpLCBudWxsKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCWRlZmluaXRpb24gPSBUYWdsaWJIeXBlcmxpbmtEZXRlY3Rvci5maW5kRGVmaW5pdGlvbigoSURPTU1vZGVsKSBtb2RlbCwgZlNlYXJjaE5hbWUsIGZTZWFyY2hUeXBlKTsKLQkJCX0KLQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBkZWZpbml0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkODJlODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBmaWxlcyB3aXRoaW4gdGhlIHdvcmtzcGFjZS4gKEFzIGxvbmcgYXMgdGhlcmUgaXMgYW4gSUZpbGUsCi0gKiB0aGlzIGNhbiBiZSB1c2VkKSBPcGVucyB0aGUgZGVmYXVsdCBlZGl0b3IgZm9yIHRoZSBmaWxlLgotICovCi1jbGFzcyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBJRmlsZSBmRmlsZTsKLQlwcml2YXRlIElSZWdpb24gZkhpZ2hsaWdodFJhbmdlOwotCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlLCBJUmVnaW9uIHJhbmdlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQkJZkhpZ2hsaWdodFJhbmdlID0gcmFuZ2U7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuT3BlbiwgZkZpbGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZkZpbGUgIT0gbnVsbCAmJiBmRmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IocGFnZSwgZkZpbGUsIHRydWUpOwotCQkJCS8vIGhpZ2hsaWdodCByYW5nZSBpbiBlZGl0b3IgaWYgcG9zc2libGUKLQkJCQlpZiAoZkhpZ2hsaWdodFJhbmdlICE9IG51bGwgJiYgZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCQkJKChJVGV4dEVkaXRvcikgZWRpdG9yKS5zZXRIaWdobGlnaHRSYW5nZShmSGlnaGxpZ2h0UmFuZ2UuZ2V0T2Zmc2V0KCksIGZIaWdobGlnaHRSYW5nZS5nZXRMZW5ndGgoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0Jhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0Jhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlYWUwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Eb2N1bWVudENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFN0cmVhbUNyZWF0b3I7Ci0KLS8qKgotICogQ3JlYXRlcyBkb2N1bWVudCBjaGFuZ2UocykgZm9yIGFuIElKYXZhRWxlbWVudCByZW5hbWUuCi0gKiBDaGFuZ2VzIGFyZSBjcmVhdGVkIGZvciBldmVyeSB0eXBlICJtYXRjaCIgaW4gdGhlIHdvcmtzcGFjZQotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCQotCS8qKgotCSAqIFdvcmtzcGFjZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBzYXZlIG9uIG1vZGVsIGZvciB1cGRhdGVkIGRvY3VtZW50cy4KLQkgKiBTaG91bGQgb25seSBiZSBkb25lIG9uIG1vZGVscyBub3Qgb3BlbiBpbiBhbiBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTYXZlSnNwRmlsZU9wIGV4dGVuZHMgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQkJCi0JCXByaXZhdGUgSURvY3VtZW50IGZKU1BEb2MgPSBudWxsOwotCQlwcml2YXRlIElGaWxlIGZKU1BGaWxlID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBTYXZlSnNwRmlsZU9wKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MpIHsKLQkJCXRoaXMuZkpTUERvYyA9IGpzcERvYzsKLQkJCXRoaXMuZkpTUEZpbGUgPSBqc3BGaWxlOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3NjUKLQkJCS8vIHNhdmUgZmlsZSB3LyBubyBpbnRlcm1lZGlhdGUgbW9kZWwgY3JlYXRpb24KLQkJCQotCQkJQ29kZWRTdHJlYW1DcmVhdG9yIGNvZGVkU3RyZWFtQ3JlYXRvciA9IG5ldyBDb2RlZFN0cmVhbUNyZWF0b3IoKTsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgRG9jdW1lbnRSZWFkZXIodGhpcy5mSlNQRG9jKTsKLQkJCWNvZGVkU3RyZWFtQ3JlYXRvci5zZXQodGhpcy5mSlNQRmlsZSwgcmVhZGVyKTsKLQkJCQotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGNvZGVkQnl0ZVN0cmVhbSA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBjb2RlZFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvZGVkQnl0ZVN0cmVhbSA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWNvZGVkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvZGVkQnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQlpZiAodGhpcy5mSlNQRmlsZS5leGlzdHMoKSkKLQkJCQkJdGhpcy5mSlNQRmlsZS5zZXRDb250ZW50cyhjb2RlZFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJZWxzZQotCQkJCQl0aGlzLmZKU1BGaWxlLmNyZWF0ZShjb2RlZFN0cmVhbSwgZmFsc2UsIG51bGwpOwotCQkJCQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoY29kZWRCeXRlU3RyZWFtICE9IG51bGwpCi0JCQkJCQljb2RlZEJ5dGVTdHJlYW0uY2xvc2UoKTsKLQkJCQkJaWYoY29kZWRTdHJlYW0gIT0gbnVsbCkKLQkJCQkJCWNvZGVkU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCQkJLy8gdW5saWtlbHkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8gZW5kIGlubmVyIGNsYXNzIFNhdmVKc3BGaWxlT3AKLQkKLQkvKioKLQkgKiBDaGFuZ2UgY2xhc3MgdGhhdCB3cmFwcyBhIHRleHQgZWRpdCBvbiB0aGUganNwIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBEb2N1bWVudENoYW5nZSB7Ci0KLQkJcHJpdmF0ZSBUZXh0RWRpdCBmRWRpdCA9IG51bGw7Ci0JCXByaXZhdGUgSUZpbGUgZkpTUEZpbGUgPSBudWxsOwotCQlwcml2YXRlIElEb2N1bWVudCBmSlNQRG9jID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzA7Ci0JCQotCQlwdWJsaWMgUmVuYW1lQ2hhbmdlKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MsIFRleHRFZGl0IGVkaXQsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJc3VwZXIoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzYsIGpzcERvYyk7Ci0JCQl0aGlzLmZFZGl0ID0gZWRpdDsKLQkJCXRoaXMuZkpTUEZpbGUgPSBqc3BGaWxlOwotCQkJdGhpcy5mSlNQRG9jID0ganNwRG9jOwotCQkJdGhpcy5mRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJRG9jdW1lbnQgZ2V0UHJldmlld0RvY3VtZW50KElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlEb2N1bWVudCBjb3B5RG9jID0gbmV3IERvY3VtZW50KGZKU1BEb2MuZ2V0KCkpOwotCQkJdHJ5IHsKLQkJCQlmRWRpdC5hcHBseShjb3B5RG9jKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlyZXR1cm4gY29weURvYzsKLQkJfQotCQkKLQkJcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVJlbmFtZUNoYW5nZSB1bmRvQ2hhbmdlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJCi0JCQkJaWYoIWlzT3BlbkluRWRpdG9yKHRoaXMuZkpTUERvYykpIHsKLQkJCQkJLy8gYXBwbHkgZWRpdCB0byBKU1AgZG9jIEFORCBzYXZlIG1vZGVsCi0JCQkJCXVuZG9DaGFuZ2UgPSBuZXcgUmVuYW1lQ2hhbmdlKHRoaXMuZkpTUEZpbGUsIHRoaXMuZkpTUERvYywgdGhpcy5mRWRpdC5hcHBseShmSlNQRG9jKSwgdGhpcy5mRGVzY3JpcHRpb24pOwotCQkJCQlzYXZlRmlsZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8ganVzdCBhcHBseSBlZGl0IHRvIEpTUCBkb2N1bWVudAotCQkJCQl1bmRvQ2hhbmdlID0gbmV3IFJlbmFtZUNoYW5nZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MsIHRoaXMuZkVkaXQuYXBwbHkoZkpTUERvYyksIHRoaXMuZkRlc2NyaXB0aW9uKTsKLQkJCQl9Ci0JCQkJCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdW5kb0NoYW5nZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFBlcmZvcm1lZCBpbiBhbiBvcGVyYXRpb24gc2luY2UgaXQgbW9kaWZpZXMgcmVzb3VyY2VzIGluIHRoZSB3b3Jrc3BhY2UKLQkJICogQHBhcmFtIGpzcERvYwotCQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJICovCi0JCXByaXZhdGUgdm9pZCBzYXZlRmlsZShJRmlsZSBqc3BGaWxlLCBJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQkKLQkJCVNhdmVKc3BGaWxlT3Agb3AgID0gbmV3IFNhdmVKc3BGaWxlT3AoanNwRmlsZSwganNwRG9jKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlvcC5ydW4oSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBDaGVja3MgaWYgYSBkb2N1bWVudCBpcyBvcGVuIGluIGFuIGVkaXRvcgotCQkgKiBAcGFyYW0ganNwRG9jCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBpc09wZW5JbkVkaXRvcihJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQkJSVdvcmtiZW5jaFdpbmRvdyB3ID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgewotCi0JCQkJdyA9IHdpbmRvd3NbaV07Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHcuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQotCQkJCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQkJCQlPYmplY3QgbyA9IG51bGw7Ci0JCQkJCUlEb2N1bWVudCBkb2MgPSBudWxsOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZmVyZW5jZXMubGVuZ3RoOyBqKyspIHsKLQotCQkJCQkJZWRpdG9yID0gcmVmZXJlbmNlc1tqXS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzc2NAotCQkJCQkJLy8gdXNlIGFkYXB0ZXIgdG8gZ2V0IElUZXh0RWRpdG9yIChmb3IgdGhpbmdzIGxpa2UKLQkJCQkJCS8vIHBhZ2UgZGVzaWduZXIpCi0JCQkJCQlvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQkJaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQotCQkJCQkJCWRvYyA9ICgoSVRleHRFZGl0b3IpIG8pLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQkJaWYgKGRvYyAhPSBudWxsICYmIGRvYy5lcXVhbHMoanNwRG9jKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mRGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCX0KLQkvLyBlbmQgaW5uZXIgY2xhc3MgUmVuYW1lQ2hhbmdlCi0JCi0JCi0JLyoqIFRoZSB0eXBlIGJlaW5nIHJlbmFtZWQgKHRoZSBvbGQgdHlwZSkqLwotCUlKYXZhRWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0JLyoqIFRoZSBuZXcgbmFtZSBvZiB0aGUgdHlwZSBiZWluZyByZW5hbWVkKi8KLQlwcml2YXRlIFN0cmluZyBmTmV3TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JLyoqIG1hcHMgYSBKU1BTZWFyY2hEb2N1bWVudCBwYXRoIC0+IE11bHRpVGV4dEVkaXQgZm9yIHRoZSBqYXZhIGZpbGUqLwotCXByaXZhdGUgSGFzaE1hcCBmU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG51bGw7Ci0JCi0JcHVibGljIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMuZk5ld05hbWUgPSBuZXdOYW1lOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5mU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmV3IG5hbWUgZm9yIHRoZSBUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROZXdOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mTmV3TmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCVN0cmluZyBtYXRjaERvY3VtZW50UGF0aCA9IGphdmFNYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJU2VhcmNoRG9jdW1lbnQgc2VhcmNoRG9jID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KG1hdGNoRG9jdW1lbnRQYXRoKTsKLQkKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCi0JCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldFJlbmFtZVRleHQoKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKXNlYXJjaERvYywgamF2YU1hdGNoKTsKLQkJCQotCQkJLy8gYWRkIGl0IGZvciB0aGUgY29ycmVjdCBkb2N1bWVudAotCQkJYWRkSmF2YUVkaXQoc2VhcmNoRG9jLmdldFBhdGgoKSwgbmV3IFJlcGxhY2VFZGl0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldExlbmd0aCgpLCByZW5hbWVUZXh0KSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlYXJjaERvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJcmV0dXJuIGdldE5ld05hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRvIHRoZSBtdWx0aSBlZGl0IGZvciBhIGdpdmUgamF2YSBkb2N1bWVudC4KLQkgKiBAcGFyYW0gamF2YURvY3VtZW50Ci0JICogQHBhcmFtIGphdmFFZGl0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEphdmFFZGl0KFN0cmluZyBzZWFyY2hEb2NQYXRoLCBSZXBsYWNlRWRpdCBqYXZhRWRpdCkgewotCQkKLQkJT2JqZWN0IG8gPSB0aGlzLmZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmdldChzZWFyY2hEb2NQYXRoKTsKLQkJaWYobyAhPSBudWxsKSB7Ci0KLQkJCU11bHRpVGV4dEVkaXQgbXVsdGkgPSAoTXVsdGlUZXh0RWRpdClvOwotCQkJbXVsdGkuYWRkQ2hpbGQoamF2YUVkaXQpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdXNlIGEgbXVsdGkgZWRpdCBzbyBkb2MgcG9zaXRpb24gb2Zmc2V0cyBnZXQgdXBkYXRlZCBhdXRvbWF0aWNhbGx5Ci0JCQkvLyB3aGVuIGFkZGluZyBtdWx0aXBsZSBjaGlsZCBlZGl0cwotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aSA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQltdWx0aS5hZGRDaGlsZChqYXZhRWRpdCk7Ci0JCQl0aGlzLmZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLnB1dChzZWFyY2hEb2NQYXRoLCBtdWx0aSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhbGwgSlNQIGNoYW5nZXMgZm9yIHRoZSBzZWFyY2ggbWF0Y2hlcyBmb3IgdGhlIGdpdmVuIFR5cGUKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlW10gZ2V0Q2hhbmdlcygpIHsKLQkJCi0JCUpTUFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJTGlzdCBjaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBrZXlzID0gZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHNlYXJjaERvY1BhdGggPSBudWxsOwotCQlTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IG51bGw7Ci0JCQotCQl3aGlsZShrZXlzLmhhc05leHQoKSkgewotCQkJLy8gY3JlYXRlIG9uIHRoZSBmbHkKLQkJCXNlYXJjaERvY1BhdGggPSAoU3RyaW5nKWtleXMubmV4dCgpOwotCQkJTXVsdGlUZXh0RWRpdCBqYXZhRWRpdCA9IChNdWx0aVRleHRFZGl0KWZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmdldChzZWFyY2hEb2NQYXRoKTsKLQkJCWRlbGVnYXRlID0gc3VwcG9ydC5nZXRTZWFyY2hEb2N1bWVudChzZWFyY2hEb2NQYXRoKTsKLQkJCQotCQkJaWYoZGVsZWdhdGUgIT0gbnVsbCAmJiBkZWxlZ2F0ZSBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQkJSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgamF2YURlbGVnYXRlID0gKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKWRlbGVnYXRlOwotCQkJCWNoYW5nZXMuYWRkKGNyZWF0ZUNoYW5nZShqYXZhRGVsZWdhdGUsIGphdmFEZWxlZ2F0ZS5nZXRKc3BUcmFuc2xhdGlvbigpLmdldEpzcEVkaXQoamF2YUVkaXQpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChDaGFuZ2VbXSljaGFuZ2VzLnRvQXJyYXkobmV3IENoYW5nZVtjaGFuZ2VzLnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIENoYW5nZSBjcmVhdGVDaGFuZ2UoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBUZXh0RWRpdCBlZGl0KSB7Ci0JCQotCQlJRG9jdW1lbnQgZG9jID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCkuZ2V0SnNwRG9jdW1lbnQoKTsKLQkJU3RyaW5nIGZpbGUgPSBzZWFyY2hEb2MuZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIGRvY3VtZW50IGxpbmVzIGFyZSAwIGJhc2VkCi0JCQlTdHJpbmcgbGluZU51bWJlciA9IEludGVnZXIudG9TdHJpbmcoZG9jLmdldExpbmVPZk9mZnNldChlZGl0LmdldE9mZnNldCgpKSArIDEpOwotCQkJZGVzY3JpcHRpb24gKz0gIiAiICsgTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzEsIG5ldyBTdHJpbmdbXXtmaWxlLCBsaW5lTnVtYmVyfSk7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBSZW5hbWVDaGFuZ2Uoc2VhcmNoRG9jLmdldEZpbGUoKSwgZG9jLCBlZGl0LCBkZXNjcmlwdGlvbik7Ci0JfQotCQotCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMjA1Ci0JLy8gb25seSByZWxldmFudCBmb3IgSVR5cGUgcmVmYWN0b3JpbmdzCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGdWxseVF1YWxpZmllZChTdHJpbmcgbWF0Y2hUZXh0KSB7Ci0JCWlmKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQlTdHJpbmcgcGtnID0gKChJVHlwZSlnZXRFbGVtZW50KCkpLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlyZXR1cm4gbWF0Y2hUZXh0LnN0YXJ0c1dpdGgocGtnKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gYmV0dGVyIGRlc2NyaWJlIHRoZSBjaGFuZ2UuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjZjOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLWNsYXNzIEpTUEphdmFTZWxlY3Rpb25Qcm92aWRlciB7Ci0Jc3RhdGljIElKYXZhRWxlbWVudFtdIGdldFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbnVsbDsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkvLyBnZXQgdGhlIEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgZWRpdG9yJ3MgZG9jdW1lbnQKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsgCi0JCQl0cnkgewotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKW1vZGVsOwotCQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJCQkJZWxlbWVudHMgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWE0Y2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1ldGhvZFJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSU1ldGhvZCBtZXRob2QsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUpTUFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCi0JCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTUEluZGV4TWFuYWdlcgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNgotCQkvLyBzdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQkKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yKG1ldGhvZCwgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUobWV0aG9kLCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJLy8gcGFfVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyM2JlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kIGZNZXRob2QgPSBudWxsOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLQkJCXRoaXMuZk1ldGhvZCA9IChJTWV0aG9kKSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZih0aGlzLmZNZXRob2QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQluYW1lID0gdGhpcy5mTWV0aG9kLmdldFNvdXJjZSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNoYW5nZVtdIGNoYW5nZXMgPSBKU1BNZXRob2RSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0Zvcih0aGlzLmZNZXRob2QsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7IAotCQkJaWYoY2hhbmdlcy5sZW5ndGggPiAwKQotCQkJCW11bHRpQ2hhbmdlICA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSlNQVUlNZXNzYWdlcy5KU1BfY2hhbmdlcywgY2hhbmdlcyk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGZlNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1ldGhvZFJlbmFtZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCQotCXB1YmxpYyBKU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG5ld05hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJCi0JCVN0cmluZyBqYXZhVGV4dCA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpLmdldEphdmFUZXh0KCk7Ci0JCVN0cmluZyBtZXRob2RUZXh0ID0gamF2YVRleHQuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJU3RyaW5nIG1ldGhvZFN1ZmZpeCA9IG1ldGhvZFRleHQuc3Vic3RyaW5nKG1ldGhvZFRleHQuaW5kZXhPZigiKCIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ2V0TmV3TmFtZSgpICsgbWV0aG9kU3VmZml4OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCi0JCVN0cmluZyBtZXRob2ROYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMywgbmV3IFN0cmluZ1tde21ldGhvZE5hbWUsIG5ld05hbWV9KTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjczZGJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsOwotCi0vKioKLSAqIEFuIGFjdGlvbiBkZWxlZ2F0ZSB0aGF0IGxhdW5jaGVzIEpEVCBtb3ZlIGVsZW1lbnQgd2l6YXJkCi0gKiAKLSAqIFN0aWxsIHJlbGllcyBoZWF2aWx5IG9uIGludGVybmFsIEFQSQotICogd2lsbCBjaGFuZ2UgcG9zdCAzLjAgd2l0aCBwdWJsaWMgbW92ZSBzdXBwb3J0Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE4MTcgCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQkvL3ByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCS8vZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJLy9mRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudF9sYWJlbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkKLQkJLy8gbm8tb3AgdW50aWwgd2Uga25vdyBob3cgd2UncmUgc3VwcG9zZWQgdG8gdXNlIHRoaXMgCi0JCS8vIGVjbGlwc2UgMy4yTTUKLQkJLy8gcHVibGljIG1vdmUgc3VwcG9ydDogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxODE3Ci0JCQotLy8JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cygpOwotLy8JCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0vLwotLy8JCQkvLyBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgbW92YWJsZQotLy8JCQl0cnkgewotLy8JCQkJSmF2YU1vdmVQcm9jZXNzb3IgcHJvY2Vzc29yID0gSmF2YU1vdmVQcm9jZXNzb3IuY3JlYXRlKGdldFJlc291cmNlcyhlbGVtZW50cyksIGVsZW1lbnRzKTsKLS8vCQkJCQotLy8JCQkJU2hlbGwgcGFyZW50ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotLy8JCQkJTW92ZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IE1vdmVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotLy8KLS8vCQkJCVJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IGNyZWF0ZVdpemFyZChyZWZhY3RvcmluZyk7Ci0vLwotLy8JCQkJLyoKLS8vCQkJCSAqIFdlIHdhbnQgdG8gZ2V0IHRoZSBzaGVsbCBmcm9tIHRoZSByZWZhY3RvcmluZyBkaWFsb2cgYnV0Ci0vLwkJCQkgKiBpdCdzIG5vdCBrbm93biBhdCB0aGlzIHBvaW50LCBzbyB3ZSBwYXNzIHRoZSB3aXphcmQgYW5kCi0vLwkJCQkgKiB0aGVuLCBvbmNlIHRoZSBkaWFsb2cgaXMgb3Blbiwgd2Ugd2lsbCBoYXZlIGFjY2VzcyB0byBpdHMKLS8vCQkJCSAqIHNoZWxsLgotLy8JCQkJICovCi0vLwotLy8JCQkJcHJvY2Vzc29yLnNldENyZWF0ZVRhcmdldFF1ZXJpZXMobmV3IENyZWF0ZVRhcmdldFF1ZXJpZXMod2l6YXJkKSk7Ci0vLwkJCQlwcm9jZXNzb3Iuc2V0UmVvcmdRdWVyaWVzKG5ldyBSZW9yZ1F1ZXJpZXMod2l6YXJkKSk7Ci0vLwkJCQkvLyBTdHJpbmcgb3BlblJlZmFjdG9yaW5nV2l6TXNnID0KLS8vCQkJCS8vIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJPcGVuUmVmYWN0b3JpbmdXaXphcmRBY3Rpb24ucmVmYWN0b3JpbmciKTsKLS8vCQkJCS8vIC8vJE5PTi1OTFMtMSQKLS8vCQkJCVN0cmluZyBvcGVuUmVmYWN0b3JpbmdXaXpNc2cgPSBKU1BVSU1lc3NhZ2VzLk1vdmVFbGVtZW50V2l6YXJkOyAvLyAiTW92ZQotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNlbGVjdGVkCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZWxlbWVudHMiOwotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLS8vCQkJCW5ldyBSZWZhY3RvcmluZ1N0YXJ0ZXIoKS5hY3RpdmF0ZShyZWZhY3RvcmluZywgd2l6YXJkLCBwYXJlbnQsIG9wZW5SZWZhY3RvcmluZ1dpek1zZywgdHJ1ZSk7Ci0vLwotLy8JCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLS8vCi0vLwkJCX0KLS8vCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5KU1BNb3ZlRWxlbWVudEFjdGlvbl8wKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmI5ZDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJUGFja2FnZUZyYWdtZW50IHBrZywgU3RyaW5nIG5ld05hbWUpIHsKLQkJSlNQU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJCi0JCUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEpTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IocGtnLCBuZXdOYW1lKTsKLQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShwa2csIG5ldyBKU1BTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCi0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkKLQkJLy9yZXR1cm4gdGhpcy5wa2c7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZWQ1ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci0KLS8qKgotICogUmVtZW1iZXIgdG8gY2hhbmdlIHRoZSBwbHVnaW4ueG1sIGZpbGUgaWYgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGZQa2cgPSBudWxsOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCXRoaXMuZlBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZih0aGlzLmZQa2cgIT0gbnVsbCkgewotCQkJbmFtZSA9IHRoaXMuZlBrZy5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJIENoYW5nZVtdIGNoYW5nZXMgPSBKU1BQYWNrYWdlUmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IodGhpcy5mUGtnLCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotCQkgQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsKLQkJIGlmKGNoYW5nZXMubGVuZ3RoID4gMCkKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyMTFiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIE92ZXJyaWRlcyBnZXQgZGVzY3JpcHRpb24KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JLyoqCi0JICogRWxlbWVudCBpcyB0aGUgb2xkIHBhY2thZ2UuICBuZXdOYW1lIGlzIHRoZSBuZXcgcGFja2FnZSBuYW1lLgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3RvcihJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoZWxlbWVudCwgbmV3TmFtZSk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNSwgKG5ldyBTdHJpbmdbXXtwYWNrYWdlTmFtZSwgbmV3TmFtZX0pKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4N2ZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkucmVmYWN0b3JpbmcuUmVuYW1lU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiBBbiBhY3Rpb24gZGVsZWdhdGUgdGhhdCBsYXVuY2hlcyBKRFQgcmVuYW1lIGVsZW1lbnQgd2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5SZW5hbWVFbGVtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChKU1BVSU1lc3NhZ2VzLlJlbmFtZUVsZW1lbnRfbGFiZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZ2V0U2VsZWN0ZWRFbGVtZW50KCk7Ci0JCWlmKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJUmVuYW1lU3VwcG9ydCByZW5hbWVTdXBwb3J0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3dpdGNoKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElUeXBlKWVsZW1lbnQsIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElNZXRob2QpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElQYWNrYWdlRnJhZ21lbnQpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZihyZW5hbWVTdXBwb3J0ICE9IG51bGwpIHsKLQkJCQkJcmVuYW1lU3VwcG9ydC5vcGVuRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSAgewotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKEpTUFVJTWVzc2FnZXMuSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wKTsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5hZGRPbmVUaW1lQ2xlYXJMaXN0ZW5lcigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnQgZ2V0U2VsZWN0ZWRFbGVtZW50KCkgewotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigoSVRleHRFZGl0b3IpZkVkaXRvcik7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDEpCi0JCQkJZWxlbWVudCA9IGVsZW1lbnRzWzBdOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDQ4NTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQkKLQkJSlNQU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJCi0JCUpTUFR5cGVNb3ZlUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BUeXBlTW92ZVJlcXVlc3Rvcih0eXBlLCBuZXdOYW1lKTsKLQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZSh0eXBlLCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTJlZmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5Nb3ZlUGFydGljaXBhbnQ7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlUGFydGljaXBhbnQgZXh0ZW5kcyBNb3ZlUGFydGljaXBhbnQgewotCQotCUlUeXBlIGZUeXBlID0gbnVsbDsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQkKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQl0aGlzLmZUeXBlID0gKElUeXBlKWVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZih0aGlzLmZUeXBlICE9IG51bGwpCi0JCQluYW1lID0gdGhpcy5mVHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJaWYocG0gIT0gbnVsbCAmJiBwbS5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7IAotCQlPYmplY3QgZGVzdCA9IGdldEFyZ3VtZW50cygpLmdldERlc3RpbmF0aW9uKCk7Ci0JCQotCQlpZihkZXN0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewkJCi0JCQlDaGFuZ2VbXSBjaGFuZ2VzID0gSlNQVHlwZU1vdmVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0ZvcihmVHlwZSwgKChJUGFja2FnZUZyYWdtZW50KWRlc3QpLmdldEVsZW1lbnROYW1lKCkpOwotCQkJaWYoY2hhbmdlcy5sZW5ndGggPiAwKQotCQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1MzAzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlTW92ZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXB1YmxpYyBKU1BUeXBlTW92ZVJlcXVlc3RvcihJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld1BhY2thZ2UpIHsKLQkJc3VwZXIoZWxlbWVudCwgbmV3UGFja2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuYW1lVGV4dChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgewotCQkKLQkJU3RyaW5nIHJlbmFtZVRleHQgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQotCQlKU1BUcmFuc2xhdGlvbiB0cmFucyA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpOwotCQlTdHJpbmcgbWF0Y2hUZXh0ID0gdHJhbnMuZ2V0SmF2YVRleHQoKS5zdWJzdHJpbmcoamF2YU1hdGNoLmdldE9mZnNldCgpLCBqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkgKyBqYXZhTWF0Y2guZ2V0TGVuZ3RoKCkpOwotCQkKLQkJLy8gaWYgaXQncyBhbiBpbXBvcnQgb3IganNwOnVzZUJlYW4sIHdlIG5lZWQgdG8gYWRkIHRoZSBwYWNrYWdlIG5hbWUgYXMgd2VsbAotCQlpZih0cmFucy5pc0ltcG9ydChqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpIHx8IHRyYW5zLmlzVXNlQmVhbihqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpIHx8IGlzRnVsbHlRdWFsaWZpZWQobWF0Y2hUZXh0KSkgewotCQkJaWYoIWdldE5ld05hbWUoKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJLy8gZ2V0TmV3TmFtZSgpIGlzIHRoZSBwa2cgbmFtZQotCQkJCXJlbmFtZVRleHQgPSBnZXROZXdOYW1lKCkgKyAiLiIgKyByZW5hbWVUZXh0OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlbmFtZVRleHQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMiwgbmV3IFN0cmluZ1tde3R5cGVOYW1lLCBuZXdOYW1lfSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5YmFmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZVJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSlNQU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vIHN1cHBvcnQuaW5kZXhXb3Jrc3BhY2VBbmRXYWl0KCk7Ci0JCi0JCQotCQlKU1BUeXBlUmVuYW1lUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yKHR5cGUsIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHR5cGUsIG5ldyBKU1BTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCi0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzIwNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLQotLyoqCi0gKiBSZW1lbWJlciB0byBjaGFuZ2UgdGhlIHBsdWdpbi54bWwgZmlsZSBpZiB0aGUgbmFtZSBvZiB0aGlzIGNsYXNzIGNoYW5nZXMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0KLQlwcml2YXRlIElUeXBlIGZUeXBlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotCQkJdGhpcy5mVHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYodGhpcy5mVHlwZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW5hbWUgPSB0aGlzLmZUeXBlLmdldFNvdXJjZSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ2hhbmdlW10gY2hhbmdlcyA9ICBKU1BUeXBlUmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IoZlR5cGUsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCWlmKGNoYW5nZXMubGVuZ3RoID4gMCkKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbXVsdGlDaGFuZ2U7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmYxODBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotCi0vKioKLSAqIENyZWF0ZXMgZG9jdW1lbnQgY2hhbmdlKHMpIGZvciBhIHR5cGUgcmVuYW1lLgotICogQ2hhbmdlcyBhcmUgY3JlYXRlZCBmb3IgZXZlcnkgdHlwZSAibWF0Y2giIGluIHRoZSB3b3Jrc3BhY2UKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0KLQlwdWJsaWMgSlNQVHlwZVJlbmFtZVJlcXVlc3RvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcih0eXBlLCBuZXdOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gKElUeXBlKWdldEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCQotCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldE5ld05hbWUoKTsKLQkJCi0JCVN0cmluZyBwa2cgPSBnZXRUeXBlKCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKTsKLQkJU3RyaW5nIG1hdGNoVGV4dCA9IHRyYW5zLmdldEphdmFUZXh0KCkuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJCi0JCS8vIGlmIGl0J3MgYW4gaW1wb3J0IG9yIGpzcDp1c2VCZWFuIG9yIGZ1bGx5IHF1YWxpZmllZCB0eXBlLCB3ZSBuZWVkIHRvIGFkZCB0aGUgcGFja2FnZSBuYW1lIGFzIHdlbGwKLQkJaWYodHJhbnMuaXNJbXBvcnQoamF2YU1hdGNoLmdldE9mZnNldCgpKSB8fCAvKnRyYW5zLmlzVXNlQmVhbihqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpIHx8Ki8gaXNGdWxseVF1YWxpZmllZChtYXRjaFRleHQpKSB7Ci0JCQlpZighcGtnLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZW5hbWVUZXh0ID0gcGtnICsgIi4iICsgcmVuYW1lVGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZW5hbWVUZXh0OwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNCwgbmV3IFN0cmluZ1tde3R5cGVOYW1lLCBuZXdOYW1lfSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL01vdmVFbGVtZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvTW92ZUVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYWJiZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvTW92ZUVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogQSBoYW5kbGVyIHRoYXQgbGF1bmNoZXMgSkRUIG1vdmUgZWxlbWVudCB3aXphcmQKLSAqIAotICogU3RpbGwgcmVsaWVzIGhlYXZpbHkgb24gaW50ZXJuYWwgQVBJCi0gKiB3aWxsIGNoYW5nZSBwb3N0IDMuMCB3aXRoIHB1YmxpYyBtb3ZlIHN1cHBvcnQKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTgxNyAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVFbGVtZW50SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0vLwlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgYXJnMCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIG5vLW9wIHVudGlsIHdlIGtub3cgaG93IHdlJ3JlIHN1cHBvc2VkIHRvIHVzZSB0aGlzIAotCQkvLyBlY2xpcHNlIDMuMk01Ci0JCS8vIHB1YmxpYyBtb3ZlIHN1cHBvcnQ6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTgxNwotCQkKLS8vCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoKTsKLS8vCQlpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgewotLy8KLS8vCQkJLy8gbmVlZCB0byBjaGVjayBpZiBpdCdzIG1vdmFibGUKLS8vCQkJdHJ5IHsKLS8vCQkJCUphdmFNb3ZlUHJvY2Vzc29yIHByb2Nlc3NvciA9IEphdmFNb3ZlUHJvY2Vzc29yLmNyZWF0ZShnZXRSZXNvdXJjZXMoZWxlbWVudHMpLCBlbGVtZW50cyk7Ci0vLwkJCQkKLS8vCQkJCVNoZWxsIHBhcmVudCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLS8vCQkJCU1vdmVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBNb3ZlUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLS8vCi0vLwkJCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBjcmVhdGVXaXphcmQocmVmYWN0b3JpbmcpOwotLy8KLS8vCQkJCS8qCi0vLwkJCQkgKiBXZSB3YW50IHRvIGdldCB0aGUgc2hlbGwgZnJvbSB0aGUgcmVmYWN0b3JpbmcgZGlhbG9nIGJ1dAotLy8JCQkJICogaXQncyBub3Qga25vd24gYXQgdGhpcyBwb2ludCwgc28gd2UgcGFzcyB0aGUgd2l6YXJkIGFuZAotLy8JCQkJICogdGhlbiwgb25jZSB0aGUgZGlhbG9nIGlzIG9wZW4sIHdlIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gaXRzCi0vLwkJCQkgKiBzaGVsbC4KLS8vCQkJCSAqLwotLy8KLS8vCQkJCXByb2Nlc3Nvci5zZXRDcmVhdGVUYXJnZXRRdWVyaWVzKG5ldyBDcmVhdGVUYXJnZXRRdWVyaWVzKHdpemFyZCkpOwotLy8JCQkJcHJvY2Vzc29yLnNldFJlb3JnUXVlcmllcyhuZXcgUmVvcmdRdWVyaWVzKHdpemFyZCkpOwotLy8JCQkJLy8gU3RyaW5nIG9wZW5SZWZhY3RvcmluZ1dpek1zZyA9Ci0vLwkJCQkvLyBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiT3BlblJlZmFjdG9yaW5nV2l6YXJkQWN0aW9uLnJlZmFjdG9yaW5nIik7Ci0vLwkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQlTdHJpbmcgb3BlblJlZmFjdG9yaW5nV2l6TXNnID0gSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudFdpemFyZDsgLy8gIk1vdmUKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzZWxlY3RlZAotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGVsZW1lbnRzIjsKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQluZXcgUmVmYWN0b3JpbmdTdGFydGVyKCkuYWN0aXZhdGUocmVmYWN0b3JpbmcsIHdpemFyZCwgcGFyZW50LCBvcGVuUmVmYWN0b3JpbmdXaXpNc2csIHRydWUpOwotLy8KLS8vCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0vLwotLy8JCQl9Ci0vLwkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotLy8JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKEpTUFVJTWVzc2FnZXMuSlNQTW92ZUVsZW1lbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvUmVuYW1lRWxlbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL1JlbmFtZUVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDU0YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvUmVuYW1lRWxlbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5yZWZhY3RvcmluZy5SZW5hbWVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBsYXRmb3JtU3RhdHVzTGluZVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVFbGVtZW50SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZFZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQkKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKLQkJaWYoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlSZW5hbWVTdXBwb3J0IHJlbmFtZVN1cHBvcnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzd2l0Y2goZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0PSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSVR5cGUpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0PSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSU1ldGhvZCllbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0PSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSVBhY2thZ2VGcmFnbWVudCllbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmKHJlbmFtZVN1cHBvcnQgIT0gbnVsbCkgewotCQkJCQlyZW5hbWVTdXBwb3J0Lm9wZW5EaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQllbHNlICB7Ci0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5KU1BSZW5hbWVFbGVtZW50QWN0aW9uXzApOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElKYXZhRWxlbWVudCBnZXRTZWxlY3RlZEVsZW1lbnQoKSB7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBKU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKChJVGV4dEVkaXRvcilmRWRpdG9yKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMSkKLQkJCQllbGVtZW50ID0gZWxlbWVudHNbMF07Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pTUFNlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWNiN2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pTUFNlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci0KLS8qKgotICogQWNjZXB0cyBtYXRjaGVzIGZyb20gSlNQU2VhcmNoU3VwcG9ydC5zZWFyY2goLi4uKSByZXF1ZXN0LgotICogQWRhcHRzIHRoZSByZXN1bHRzIGZyb20gamF2YSB0byBKU1AgYW5kIGRpc3BsYXlzIGluIHRoZSBTZWFyY2hSZXN1bHRWaWV3LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBNYXBzIGphdmEgc2VhcmNoIGNvb3JkaW5hdGVzIHRvIGNvcnJlc3BvbmRpbmcgSlNQIGNvb3JkaW5hdGVzLgotCSAqIEFkZHMgdGhlIG1hdGNoZXMgdG8gdGhlIFNlYXJjaCBSZXN1bHRzIHZpZXcuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCQkJCi0JCVN0cmluZyBtYXRjaERvY3VtZW50UGF0aCA9IG1hdGNoLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2MgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0U2VhcmNoRG9jdW1lbnQobWF0Y2hEb2N1bWVudFBhdGgpOwotCQkKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQlKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBqYXZhU2VhcmNoRG9jID0gKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKXNlYXJjaERvYzsKLQkJCWludCBqc3BTdGFydCA9IGphdmFTZWFyY2hEb2MuZ2V0SnNwT2Zmc2V0KG1hdGNoLmdldE9mZnNldCgpKTsKLQkJCWludCBqc3BFbmQgPSBqYXZhU2VhcmNoRG9jLmdldEpzcE9mZnNldChtYXRjaC5nZXRPZmZzZXQoKSArIG1hdGNoLmdldExlbmd0aCgpKTsKLQotCQkJSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBqYXZhU2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JCQlTdHJpbmcganNwVGV4dCA9IHRyYW5zLmdldEpzcFRleHQoKTsKLQkJCVN0cmluZyBqYXZhVGV4dCA9IGphdmFTZWFyY2hEb2MuZ2V0SmF2YVRleHQoKTsKLQotCQkJaWYgKERFQlVHKSAKLQkJCQlkaXNwbGF5RGVidWdJbmZvKG1hdGNoLCBqc3BTdGFydCwganNwRW5kLCBqc3BUZXh0LCBqYXZhVGV4dCk7Ci0JCQotCQkJaWYgKGpzcFN0YXJ0ID4gLTEgJiYganNwRW5kID4gLTEpCi0JCQkJYWRkU2VhcmNoTWF0Y2gobmV3IERvY3VtZW50KHRyYW5zLmdldEpzcFRleHQoKSksIGphdmFTZWFyY2hEb2MuZ2V0RmlsZSgpLCBqc3BTdGFydCwganNwRW5kLCBqc3BUZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWFyY2hEb2MKLQkgKiBAcGFyYW0ganNwU3RhcnQKLQkgKiBAcGFyYW0ganNwRW5kCi0JICogQHBhcmFtIGpzcFRyYW5zbGF0aW9uCi0JICogQHBhcmFtIGpzcFRleHQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFyY2hNYXRjaChJRG9jdW1lbnQganNwRG9jdW1lbnQsIElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQpIHsKLQkJLy8gaW1wbGVtZW50IGluIHN1YmNsYXNzCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2JlZ2luUmVwb3J0aW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBiZWdpblJlcG9ydGluZygpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZW5kUmVwb3J0aW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRSZXBvcnRpbmcoKSB7Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZW5kUmVwb3J0aW5nKCkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNlbnRlclBhcnRpY2lwYW50KG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnRlclBhcnRpY2lwYW50KFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZW50ZXJQYXJ0aWNpcGFudCgpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZXhpdFBhcnRpY2lwYW50KG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGl0UGFydGljaXBhbnQoU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBleGl0UGFydGljaXBhbnQoKSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRm9yIGRlYnVnLgotCSAqIEBwYXJhbSBvcmlnTWF0Y2gKLQkgKiBAcGFyYW0ganNwU3RhcnQKLQkgKiBAcGFyYW0ganNwRW5kCi0JICogQHBhcmFtIGpzcFRleHQKLQkgKiBAcGFyYW0gamF2YVRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcGxheURlYnVnSW5mbyhTZWFyY2hNYXRjaCBvcmlnTWF0Y2gsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQsIFN0cmluZyBqYXZhVGV4dCkgewotCi0JCWlmIChvcmlnTWF0Y2ggPT0gbnVsbCB8fCBqc3BTdGFydCA9PSAtMSB8fCBqc3BFbmQgPT0gLTEgfHwganNwRW5kIDwganNwU3RhcnQgfHwganNwVGV4dCA9PSBudWxsIHx8IGphdmFUZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJhY2NlcHQgcG9zc2libGUgbWF0Y2ggW2pzcERvYzogIiArIG9yaWdNYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpICsgIiAiICsgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgIjoiICsgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgb3JpZ01hdGNoLmdldExlbmd0aCgpICsgIl0/Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJtYXRjaCBpbmZvOiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigidGhlIGphdmEgdGV4dCBpczoiICsgamF2YVRleHQuc3Vic3RyaW5nKG9yaWdNYXRjaC5nZXRPZmZzZXQoKSwgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgb3JpZ01hdGNoLmdldExlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJqYXZhIHNlYXJjaCBtYXRjaCB0cmFuc2xhdGVzIHRvIGpzcCBjb29yZHMgW3N0YXJ0OiAiICsganNwU3RhcnQgKyAiIGVuZDoiICsganNwRW5kICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgdGhlIGpzcCB0ZXh0IGlzOiIgKyBqc3BUZXh0LnN1YnN0cmluZyhqc3BTdGFydCwganNwRW5kKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFlZWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc2VhcmNoLkhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2V0cyB1cCBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBmb3IganNwIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29ycwotICovCi1wdWJsaWMgY2xhc3MgSlNQRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvY2Vzc29ycygpIHsKLQkJaWYgKGZQcm9jZXNzb3JzID09IG51bGwpIHsKLQkJCWZQcm9jZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBodG1sUHJvY2Vzc29yID0gbmV3IEhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLQkJCWZQcm9jZXNzb3JzLmFkZChodG1sUHJvY2Vzc29yKTsKLS8vCQkJIHRlbXBvcmFyeSwgd29ya2Fyb3VuZCB0byBkaXNhYmxlIGZ1bmN0aW9uLCBzaW5jZSB1c2luZyB0aGUgZnVuY3Rpb24gCi0vLwkJCSBjYW4gZWFzaWx5IGNhdXNlIGRlYWRsb2NrIHRvIG9jY3VyLgotLy8JCQkJCSBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzY2MgotLy8JCQlKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IganNwUHJvY2Vzc29yID0gbmV3IEpTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotLy8JCQlmUHJvY2Vzc29ycy5hZGQoanNwUHJvY2Vzc29yKTsKLQkJfQotCQlyZXR1cm4gZlByb2Nlc3NvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU4YzNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogQ29uZmlndXJlcyBhIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB3aXRoIEpTUCBwYXJ0aXRpb25zIGFuZCByZWdpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgewotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxULCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UmVnaW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117RE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVH07Ci0JfQotCi0JcHJvdGVjdGVkIElTZWFyY2hRdWVyeSBnZXRTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVnaW9uVGV4dCwgU3RyaW5nIHJlZ2lvblR5cGUsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBKU1BTZWFyY2hRdWVyeShmaWxlLCBnZXRKYXZhRWxlbWVudChkb2N1bWVudCwgdGV4dFNlbGVjdGlvbikpOwotCX0KLQotCXByaXZhdGUgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGdldEphdmFFbGVtZW50c0ZvckN1cnJlbnRTZWxlY3Rpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24pOwotCQlyZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB1c2VzIEpTUFRyYW5zbGF0aW9uIHRvIGdldCBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGN1cnJlbnRseSBzZWxlY3RlZCBJSmF2YUVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnRbXSBnZXRKYXZhRWxlbWVudHNGb3JDdXJyZW50U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQkJLy8gZ2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgdmlld2VyJ3MgZG9jdW1lbnQKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQl0cnkgewotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCi0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDIyMTEKLQkJCQkJZWxlbWVudHMgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZDRmOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoUmVzdWx0OwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCBleHRlbmRzIE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0IHsKLQkKLQlwdWJsaWMgSlNQT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXN1cGVyKHF1ZXJ5KTsKLQl9Ci0JCi0JcHVibGljIE1hdGNoW10gZ2V0TWF0Y2hlcygpIHsKLQkJcmV0dXJuICgoSlNQU2VhcmNoUXVlcnkpZ2V0UXVlcnkoKSkuZ2V0TWF0Y2hlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOGNhMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkJhc2ljU2VhcmNoUXVlcnk7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVNlYXJjaFF1ZXJ5PC9jb2RlPiBmb3IgPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPnMgaW4gSlNQIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNpY1NlYXJjaFF1ZXJ5IHsKLQkKLQkvKiogdGhlIElKYXZhRWxlbWVudCB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZmlsZSAqKi8KLQlwcml2YXRlIElKYXZhRWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0JCi0JcHVibGljIEpTUFNlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGZpbGUpOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCQotCS8vIGZvciBhY2Nlc3MgYnkgaW5uZXIgY2xhc3MKLQlwdWJsaWMgSlNQU2VhcmNoUXVlcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1F1ZXJ5KCkgewotCQkKLQkJY2xlYXJNYXRjaGVzKCk7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeSB7Ci0JCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQkvLyBpbmRleCB0aGUgZmlsZQotCQkJU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSAgc3VwcG9ydC5hZGRKc3BGaWxlKGdldEZpbGUoKSk7Ci0JCQkKLQkJCVN0cmluZyBzY29wZVBhdGggPSBkZWxlZ2F0ZS5nZXRQYXRoKCk7Ci0JCQlKU1BTZWFyY2hTY29wZSBzaW5nbGVGaWxlU2NvcGUgPSBuZXcgSlNQU2VhcmNoU2NvcGUobmV3IFN0cmluZ1tde2dldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHNjb3BlUGF0aH0pOwotCQkJCi0JCQkvLyBwZXJmb3JtIGEgc2VhcmNocwotCQkJLy8gYnkgcGFzc2luZyBpbiB0aGlzIGpzcCBzZWFyY2ggcXVlcnksIHJlcXVzdG9yIGNhbiBhZGQgbWF0Y2hlcwotCQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShnZXRKYXZhRWxlbWVudCgpLCBzaW5nbGVGaWxlU2NvcGUsIG5ldyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKGdldEluc3RhbmNlKCkpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIsIElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmdbXSBhcmdzID0ge2dldFNlYXJjaFRleHQoKSwgZ2V0T2NjdXJyZW5jZXNDb3VudFRleHQoKSwgZ2V0RmlsZW5hbWUoKX07Ci0JCXJldHVybiBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMCwgYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IEpTUFVJTWVzc2FnZXMuT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yOwotCQlpZihnZXRGaWxlKCkgIT0gbnVsbCkKLQkJCWZpbGVuYW1lID0gZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGZpbGVuYW1lOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRPY2N1cnJlbmNlc0NvdW50VGV4dCgpIHsKLQkJU3RyaW5nIGNvdW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcGFfVE9ETyBtYWtlIGR5bmFtaWMKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VhcmNoVGV4dCgpIHsKLQkJcmV0dXJuIGZFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJlcnVuKCkgewotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNjYW5SdW5JbkJhY2tncm91bmQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJ1bkluQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQkKLQkJcmV0dXJuIG5ldyBKU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiNGFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IgewotCQotCXByaXZhdGUgSVNlYXJjaFJlcXVlc3RvciBmSmF2YVJlcXVlc3RvciA9IG51bGw7Ci0JCi0JcHVibGljIEpTUFNlYXJjaFJlcXVlc3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIEpTUFNlYXJjaFJlcXVlc3RvcihJU2VhcmNoUmVxdWVzdG9yIGphdmFSZXF1ZXN0b3IpIHsKLQkJLy8gbmVlZCB0byByZXBvcnQgbWF0Y2hlcyB0byBqYXZhUmVxdWVzdG9yCi0JCXRoaXMuZkphdmFSZXF1ZXN0b3IgPSBqYXZhUmVxdWVzdG9yOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQkKLQkJaWYoIWpzcEZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxpbmVOdW1iZXIgPSAtMTsKLQkJdHJ5IHsKLQkJCWxpbmVOdW1iZXIgPSBqc3BEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoanNwU3RhcnQpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJvZmZzZXQ6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGpzcFN0YXJ0KSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljcmVhdGVTZWFyY2hNYXJrZXIoanNwRmlsZSwganNwU3RhcnQsIGpzcEVuZCwgbGluZU51bWJlcik7Ci0JCQotCQlpZih0aGlzLmZKYXZhUmVxdWVzdG9yICE9IG51bGwpIHsKLQkJCU1hdGNoIG1hdGNoID0gbmV3IE1hdGNoKGpzcEZpbGUsIGpzcFN0YXJ0LCBqc3BFbmQgLSBqc3BTdGFydCk7Ci0JCQl0aGlzLmZKYXZhUmVxdWVzdG9yLnJlcG9ydE1hdGNoKG1hdGNoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqc3BGaWxlCi0JICogQHBhcmFtIGpzcFN0YXJ0Ci0JICogQHBhcmFtIGpzcEVuZAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWFyY2hNYXJrZXIoSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBpbnQgbGluZU51bWJlcikgewotCQkKLQkJdHJ5IHsKLQkJCUlNYXJrZXIgbWFya2VyID0ganNwRmlsZS5jcmVhdGVNYXJrZXIoTmV3U2VhcmNoVUkuU0VBUkNIX01BUktFUik7Ci0JCQlIYXNoTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCg0KTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgbmV3IEludGVnZXIoanNwU3RhcnQpKTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIG5ldyBJbnRlZ2VyKGpzcEVuZCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgbmV3IEludGVnZXIobGluZU51bWJlcikpOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDc5MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIFNwZWNpYWwgcmVxdWVzdG9yIHRoYXQgYWRkcyBzZWFyY2ggcmVzdWx0cyBmb3Igc2luZ2xlIGZpbGUgc2VhcmNoCi0gKiAoVXNlZCBmb3IgSlNQRmluZE9jY3VycmVuY2VzIGFjdGlvbikuCi0gKiBJdCBncm91cHMgZWFjaCBtYXRjaCBhcyBpdCdzIG93biByZXN1bHQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IgewotCi0JcHJpdmF0ZSBKU1BTZWFyY2hRdWVyeSBmUXVlcnkgPSBudWxsOwotCQotCXB1YmxpYyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKEpTUFNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXRoaXMuZlF1ZXJ5ID0gcXVlcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQkvLyBhZGQgbWF0Y2ggdG8gSlNQIHF1ZXJ5Li4uCi0JCXRoaXMuZlF1ZXJ5LmFkZE1hdGNoKGpzcERvY3VtZW50LCBqc3BTdGFydCwganNwRW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQTWF0Y2hQcmVzZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9KU1BNYXRjaFByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIxYTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9KU1BNYXRjaFByZXNlbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5CYXNpY1NlYXJjaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1hdGNoUHJlc2VudGF0aW9uIGltcGxlbWVudHMgSU1hdGNoUHJlc2VudGF0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb24jY3JlYXRlTGFiZWxQcm92aWRlcigpCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb24jc2hvd01hdGNoKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoLCBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93TWF0Y2goTWF0Y2ggbWF0Y2gsIGludCBjdXJyZW50T2Zmc2V0LCBpbnQgY3VycmVudExlbmd0aCwgYm9vbGVhbiBhY3RpdmF0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLS8vCQlPYmplY3Qgb2JqID0gbWF0Y2guZ2V0RWxlbWVudCgpOwotCQkvLyBzaG93IG1hdGNoIGluIEpTUCBlZGl0b3IKLQkJaWYoYWN0aXZhdGUpIHsKLQkJCS8vIHVzZSBzaG93IGluIHRhcmdldD8KLQkJfQotCQllbHNlIHsKLQkJCS8vIGp1c3Qgc2VsZWN0Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQUXVlcnlQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pTUFF1ZXJ5UGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1N2VlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQUXVlcnlQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5FbGVtZW50UXVlcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkgCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BRdWVyeVBhcnRpY2lwYW50IGltcGxlbWVudHMgSVF1ZXJ5UGFydGljaXBhbnQgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjc2VhcmNoKG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVNlYXJjaFJlcXVlc3Rvciwgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb24sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgUXVlcnlTcGVjaWZpY2F0aW9uIHF1ZXJ5U3BlY2lmaWNhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQkvL2luZGV4SWZOZWVkZWQoKTsKLQkJCi0JCS8vIGRvIHNlYXJjaCBiYXNlZCBvbiB0aGUgcGFydGljdWxhciBKYXZhIHF1ZXJ5Ci0JCWlmKHF1ZXJ5U3BlY2lmaWNhdGlvbiBpbnN0YW5jZW9mIEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pIHsKLQkJCS8vIGVsZW1lbnQgc2VhcmNoIChlZy4gZnJvbSBnbG9iYWwgZmluZCByZWZlcmVuY2VzIGluIEphdmEgZmlsZSkKLQkJCUVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24gZWxlbWVudFF1ZXJ5ID0gKEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50UXVlcnkuZ2V0RWxlbWVudCgpOwotCQkJCi0JCQlpZihERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBRdWVyeSBQYXJ0aWNpcGFudCBzZWFyY2hpbmcgb24gRUxFTUVOVDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSlNQU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQkKLQkJCS8vIHBhX1RPRE8gbmVlZCB0byBhZGFwdCBKYXZhU2VhcmNoU2NvcGUgdG8gYSBKU1BTZWFyY2hTY29wZQotCQkJSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNlYXJjaChlbGVtZW50LCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwganNwUmVxdWVzdG9yKTsKLQkJCQotCQl9Ci0JCWVsc2UgaWYocXVlcnlTcGVjaWZpY2F0aW9uIGluc3RhbmNlb2YgUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbikgewotCQkJCi0JCQkvLyBwYXR0ZXJuIHNlYXJjaCAoZWcuIGZyb20gSmF2YSBzZWFyY2ggcGFnZSkKLQkJCVBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24gcGF0dGVyblF1ZXJ5ID0gKFBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24pcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJU3RyaW5nIHBhdHRlcm4gPSBwYXR0ZXJuUXVlcnkuZ2V0UGF0dGVybigpOwotCQkJCi0JCQlpZihERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBRdWVyeSBQYXJ0aWNpcGFudCBzZWFyY2hpbmcgb24gUEFUVEVSTjogIiArIHBhdHRlcm4pOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSlNQU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQkKLQkJCUpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5zZWFyY2gocGF0dGVybiwgCi0JCQkJCQkJCQkJCQkJbmV3IEpTUFNlYXJjaFNjb3BlKCksIAotCQkJCQkJCQkJCQkJCXBhdHRlcm5RdWVyeS5nZXRTZWFyY2hGb3IoKSwgCi0JCQkJCQkJCQkJCQkJcGF0dGVyblF1ZXJ5LmdldExpbWl0VG8oKSwgCi0JCQkJCQkJCQkJCQkJU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0gsIAotCQkJCQkJCQkJCQkJCWZhbHNlLCAKLQkJCQkJCQkJCQkJCQlqc3BSZXF1ZXN0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklRdWVyeVBhcnRpY2lwYW50I2VzdGltYXRlVGlja3Mob3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb24pCi0JICovCi0JcHVibGljIGludCBlc3RpbWF0ZVRpY2tzKFF1ZXJ5U3BlY2lmaWNhdGlvbiBkYXRhKSB7Ci0JCS8vIHBhX1RPRE8gdXNlIHByb2plY3QgZmlsZSBjb3VudGVyIGZyb20gSlNQU2VhcmNoU3VwcG9ydC4uLgotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjZ2V0VUlQYXJ0aWNpcGFudCgpCi0JICovCi0JcHVibGljIElNYXRjaFByZXNlbnRhdGlvbiBnZXRVSVBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gbmV3IEpTUE1hdGNoUHJlc2VudGF0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGU5YjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgSlNQIFVJIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BVSVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUNvbG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFRoZW1lTWFuYWdlcigpLmdldEN1cnJlbnRUaGVtZSgpLmdldENvbG9yUmVnaXN0cnkoKTsKLQotCQkvLyBzZXR0aW5nIHRoZSBzYW1lIGFzIEhUTUwKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEpTUFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCAiPD0iKTsvLyROT04tTkxTLTEkCi0KLQkJLy8gSlNQIFN0eWxlIFByZWZlcmVuY2VzCi0JCVN0cmluZyBOT0JBQ0tHUk9VTkRCT0xEID0gIiB8IG51bGwgfCBmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEpVU1RJVEFMSUMgPSAiIHwgbnVsbCB8IGZhbHNlIHwgdHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCAxMjcsIDAsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgNDIsIDAsIDI1NSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNwZWNpZmllZCB2YWx1ZSBpcyBibGFjazsgbGVhdmluZyBhcyB3aWRnZXQgZGVmYXVsdAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIDYzLCAxMjcsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCAxOTEsIDk1LCA2MykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCwgc3R5bGVWYWx1ZSk7Ci0JCQotCQkvLyBzZXQgZGVmYXVsdCBuZXcganNwIGZpbGUgdGVtcGxhdGUgdG8gdXNlIGluIG5ldyBmaWxlIHdpemFyZAotCQkvKgotCQkgKiBOZWVkIHRvIGZpbmQgdGVtcGxhdGUgbmFtZSB0aGF0IGdvZXMgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGlkIChuYW1lCi0JCSAqIG1heSBjaGFuZ2UgZm9yIGRpZmZlcm50IGxhbmd1YWdlKQotCQkgKi8KLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKS5maW5kVGVtcGxhdGVCeUlkKCJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJCi0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VMX0JSQUNFUywgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX1NDUklQVExFVFMsIHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUFVJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2N2QxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIEpTUCBVSQotICovCi1wdWJsaWMgY2xhc3MgSlNQVUlQcmVmZXJlbmNlTmFtZXMgewotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGlmIGNvZGUgYXNzaXN0IGdldHMgYXV0byBhY3RpdmF0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFID0gZ2V0QXV0b1Byb3Bvc2VLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUtleSgpIHsKLQkJcmV0dXJuICJhdXRvUHJvcG9zZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXV0byBhY3RpdmF0ZSBjb2RlCi0JICogYXNzaXN0LgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQWxsIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyCi0JICogYXV0byBjb2RlIGFzc2lzdC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFX0NPREUgPSBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2VDb2RlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSBjdXN0b21pemVkIHRlbXBsYXRlcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFU19LRVkgPSBnZXRUZW1wbGF0ZXNLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZW1wbGF0ZXNLZXkoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jdXN0b21fdGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIG5ldyBKU1AgZmlsZSB3aXphcmQuCi0JICogVGVtcGxhdGUgbmFtZSBpcyBzdG9yZWQgaW5zdGVhZCBvZiB0ZW1wbGF0ZSBpZCBiZWNhdXNlIHVzZXItY3JlYXRlZAotCSAqIHRlbXBsYXRlcyBkbyBub3QgaGF2ZSB0ZW1wbGF0ZSBpZHMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9URU1QTEFURV9OQU1FID0gIm5ld0ZpbGVUZW1wbGF0ZU5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvLWNvbXBsZXRpbmcgRUwgYnJhY2VzIGFmdGVyIGVudGVyaW5nCi0JICogPGNvZGU+JHs8L2NvZGU+Ci0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX0NPTVBMRVRFX0VMX0JSQUNFUyA9ICJ0eXBpbmdDb21wbGV0ZUVsQnJhY2VzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIHNjcmlwdGxldHMgYWZ0ZXIgZW50ZXJpbmcKLQkgKiA8Y29kZT4mbHQ7JTwvY29kZT4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfQ09NUExFVEVfU0NSSVBUTEVUUyA9ICJ0eXBpbmdDb21wbGV0ZVNjcmlwdGxldHMiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NTdjNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0UHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogQmFzZWQgbG9vc2VseSBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuUHJvcGVydHlBbmRQcmVmZXJlbmNlUGFnZQotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUHJlZmVyZW5jZXMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcmVmZXJlbmNlcy1wcm9wZXJ0aWVzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKgotCSAqIERpc2FibGUgbGluayBkYXRhLCBwcmV2ZW50cyB0aGUgZGlzcGxheSBvZiBhICJ3b3Jrc3BhY2UiIG9yICJwcm9qZWN0IgotCSAqIHNldHRpbmdzIGxpbmsgdG8gcHJldmVudCByZWN1cnNpdmUgZGlhbG9nIGxhdW5jaGluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBESVNBQkxFX0xJTksgPSAiRElTQUJMRV9MSU5LIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgZkRhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gZkVuYWJsZVByb2plY3RTZXR0aW5nczsKLQotCXByaXZhdGUgTGluayBmUHJvamVjdFNldHRpbmdzTGluazsKLQkKLQlwcml2YXRlIENvbnRyb2wgZkNvbW1vbjsKLQkKLQlwcml2YXRlIENvbnRyb2xFbmFibGVTdGF0ZSBmRW5hYmxlbWVudHM7Ci0KLQlwdWJsaWMgQWJzdHJhY3RQcm9wZXJ0eVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5RGF0YShPYmplY3QgZGF0YSkgewotCQlzdXBlci5hcHBseURhdGEoZGF0YSk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7Ci0JCQlmRGF0YSA9IChNYXApIGRhdGE7Ci0JCQl1cGRhdGVMaW5rRW5hYmxlbWVudCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29tbW9uQ29udGVudHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLQlwdWJsaWMgZmluYWwgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbXBvc2l0ZSBjaGVja0xpbmtDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljaGVja0xpbmtDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWNoZWNrTGlua0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3MgPSBuZXcgQnV0dG9uKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0VGV4dChTU0VVSU1lc3NhZ2VzLkVuYWJsZVByb2plY3RTZXR0aW5ncyk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJYm9vbGVhbiBlbmFibGVkRm9yUHJvamVjdCA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKVswXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmdldEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZhbHNlKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0U2VsZWN0aW9uKGVuYWJsZWRGb3JQcm9qZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxhYmVsIHNwYWNlciA9IG5ldyBMYWJlbChjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCX0KLQotCQlmUHJvamVjdFNldHRpbmdzTGluayA9IG5ldyBMaW5rKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCi0JCS8qCi0JCSAqICJlbGVtZW50IiBzaG91bGQgYmUgYSBwcm9qZWN0LCBpZiBudWxsLCBsaW5rIHRvIHBlci1wcm9qZWN0Ci0JCSAqIHByb3BlcnRpZXMKLQkJICovCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0VGV4dCgiPGE+IiArIFNTRVVJTWVzc2FnZXMuQ29uZmlndXJlV29ya3NwYWNlU2V0dGluZ3MgKyAiPC9hPiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0VGV4dCgiPGE+IiArIFNTRVVJTWVzc2FnZXMuQ29uZmlndXJlUHJvamVjdFNldHRpbmdzICsgIjwvYT4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXVwZGF0ZUxpbmtFbmFibGVtZW50KCk7Ci0KLQkJZlByb2plY3RTZXR0aW5nc0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgewotCQkJCQlvcGVuUHJvamVjdFNldHRpbmdzKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvcGVuV29ya3NwYWNlU2V0dGluZ3MoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJCWxpbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCX0KLQotLy8JCWZpbmFsIENvbnRyb2wgY29tbW9uID0gY3JlYXRlQ29tbW9uQ29udGVudHMoY29tcG9zaXRlKTsKLQkJZkNvbW1vbiA9IGNyZWF0ZUNvbW1vbkNvbnRlbnRzKGNvbXBvc2l0ZSk7Ci0JCQotCQlmQ29tbW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWlmIChmRW5hYmxlUHJvamVjdFNldHRpbmdzICE9IG51bGwpIHsKLQkJCVNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uQWRhcHRlciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCWVuYWJsZVByZWZlcmVuY2VDb250ZW50KGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCQlzZWxlY3Rpb25BZGFwdGVyLndpZGdldFNlbGVjdGVkKG51bGwpOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25BZGFwdGVyKTsKLQkJfQotCQkKLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIElTY29wZUNvbnRleHRbXSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQl9Ci0JCXJldHVybiBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCk7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBnZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlPYmplY3QgYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBhZGFwdGVyOwotCQkJfQotCQkJYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2plY3RTZXR0aW5nc0tleSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0eVBhZ2VJRCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbGVtZW50U2V0dGluZ3NFbmFibGVkKCkgewotCQlyZXR1cm4gZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsICYmIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0Jdm9pZCBvcGVuUHJvamVjdFNldHRpbmdzKCkgewotCQlMaXN0RGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0RGlhbG9nKGdldFNoZWxsKCkpIHsKLQotCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQkJQ29udHJvbCBhcmVhID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotCQkJCWdldFRhYmxlVmlld2VyKCkuc2V0U29ydGVyKG5ldyBSZXNvdXJjZVNvcnRlcihSZXNvdXJjZVNvcnRlci5OQU1FKSk7Ci0JCQkJcmV0dXJuIGFyZWE7Ci0JCQl9Ci0JCX07Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFNTRVVJTWVzc2FnZXMuUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMik7Ci0JCWRpYWxvZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJV29ya3NwYWNlKSBpbnB1dEVsZW1lbnQpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQkJZGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShTU0VVSU1lc3NhZ2VzLlByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDEpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCWlmIChyZXN1bHQubGVuZ3RoID4gMCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcm9wZXJ0eURpYWxvZ09uKGdldFNoZWxsKCksIHByb2plY3QsIGdldFByb3BlcnR5UGFnZUlEKCksIG5ldyBTdHJpbmdbXXtnZXRQcm9wZXJ0eVBhZ2VJRCgpfSwgZGF0YSkub3BlbigpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBvcGVuV29ya3NwYWNlU2V0dGluZ3MoKSB7Ci0JCU1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIGdldFByZWZlcmVuY2VQYWdlSUQoKSwgbmV3IFN0cmluZ1tde2dldFByZWZlcmVuY2VQYWdlSUQoKX0sIGRhdGEpLm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJaWYgKGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpKSB7Ci0JCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2V0dGluZyAiICsgZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5hbWUoKSArICI6IiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIAotCQkJCX0KLQkJCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucHV0Qm9vbGVhbihnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSwgZkVuYWJsZVByb2plY3RTZXR0aW5ncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkgKyAiIGZyb20gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCX0KLQkJCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKGdldFByb2plY3RTZXR0aW5nc0tleSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaWYoZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQllbmFibGVQcmVmZXJlbmNlQ29udGVudChmYWxzZSk7Ci0JCX0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpbmtFbmFibGVtZW50KCkgewotCQlpZiAoZkRhdGEgIT0gbnVsbCAmJiBmUHJvamVjdFNldHRpbmdzTGluayAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRFbmFibGVkKCFCb29sZWFuLlRSVUUuZXF1YWxzKGZEYXRhLmdldChESVNBQkxFX0xJTkspKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udHJvbHMgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIGNvbW1vbiBjb250ZW50IHJlZ2lvbgotCSAqIG9mIGEgcHJvcGVydHkgb3IgcHJlZmVyZW5jZSBwYWdlCi0JICogCi0JICogQHBhcmFtIGVuYWJsZSB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgY29tbW9uIGNvbnRlbnQKLQkgKiBhcmVhCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlUHJlZmVyZW5jZUNvbnRlbnQoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYoZW5hYmxlKSB7Ci0JCQlpZihmRW5hYmxlbWVudHMgIT0gbnVsbCkgewotCQkJCWZFbmFibGVtZW50cy5yZXN0b3JlKCk7Ci0JCQkJZkVuYWJsZW1lbnRzID0gbnVsbDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmKGZFbmFibGVtZW50cyA9PSBudWxsKQotCQkJCWZFbmFibGVtZW50cyA9IENvbnRyb2xFbmFibGVTdGF0ZS5kaXNhYmxlKGZDb21tb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTY0ODY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TY3JvbGxlZFBhZ2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQmFzZWQgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLk9wdGlvbnNDb25maWd1cmF0aW9uQmxvY2sKLSAqLwotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgTGlzdCBmQ29tYm9zOwotCXByaXZhdGUgTGlzdCBmRXhwYW5kYWJsZXM7Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGZTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HU19FWFBBTkRFRCA9ICJleHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVmFsaWRhdGlvbkZyYW1ld29yayBmVmFsaWRhdGlvbjsKLQotCXByaXZhdGUgY2xhc3MgQ29tYm9EYXRhIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZktleTsKLQkJcHJpdmF0ZSBpbnRbXSBmU2V2ZXJpdGllczsKLQkJcHJpdmF0ZSBpbnQgZkluZGV4OwotCQlpbnQgb3JpZ2luYWxTZXZlcml0eSA9IC0yOwotCi0JCXB1YmxpYyBDb21ib0RhdGEoU3RyaW5nIGtleSwgaW50W10gc2V2ZXJpdGllcywgaW50IGluZGV4KSB7Ci0JCQlmS2V5ID0ga2V5OwotCQkJZlNldmVyaXRpZXMgPSBzZXZlcml0aWVzOwotCQkJZkluZGV4ID0gaW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJCXJldHVybiBmS2V5OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7Ci0JCQlmSW5kZXggPSBpbmRleDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gZkluZGV4OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIHNldmVyaXR5IGluZGV4IGJhc2VkIG9uIDxjb2RlPnNldmVyaXR5PC9jb2RlPi4KLQkJICogSWYgdGhlIHNldmVyaXR5IGRvZXNuJ3QgZXhpc3QsIHRoZSBpbmRleCBpcyBzZXQgdG8gLTEuCi0JCSAqIAotCQkgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5IGxldmVsCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBmU2V2ZXJpdGllcyAhPSBudWxsICYmIGkgPCBmU2V2ZXJpdGllcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmU2V2ZXJpdGllc1tpXSA9PSBzZXZlcml0eSkgewotCQkJCQlzZXRJbmRleChpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJc2V0SW5kZXgoLTEpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJCXJldHVybiAoZkluZGV4ID49IDAgJiYgZlNldmVyaXRpZXMgIT0gbnVsbCAmJiBmSW5kZXggPCBmU2V2ZXJpdGllcy5sZW5ndGgpID8gZlNldmVyaXRpZXNbZkluZGV4XSA6IC0xOwotCQl9Ci0KLQkJYm9vbGVhbiBpc0NoYW5nZWQoKSB7Ci0JCQlyZXR1cm4gZlNldmVyaXRpZXNbZkluZGV4XSAhPSBvcmlnaW5hbFNldmVyaXR5OwotCQl9Ci0JfQotCi0JcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJZkNvbWJvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZkV4cGFuZGFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCWZWYWxpZGF0aW9uID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENvbWJvIHdpZGdldCBpbiB0aGUgY29tcG9zaXRlIDxjb2RlPnBhcmVudDwvY29kZT4uIFRoZSBkYXRhCi0JICogaW4gdGhlIENvbWJvIGlzIGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5rZXk8L2NvZGU+LiBUaGUgQ29tYm8gZGF0YSBpcwotCSAqIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgaW50ZWdlciA8Y29kZT52YWx1ZXM8L2NvZGU+IHdoZXJlIHRoZSBpbmRleAotCSAqIG9mIDxjb2RlPnZhbHVlczwvY29kZT4gY29ycmVzcG9uZHMgdG8gdGhlIGluZGV4IG9mIDxjb2RlPnZhbHVlTGFiZWxzPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbXBvc2l0ZSB0byBjcmVhdGUgdGhlIGNvbWJvIGJveCBpbgotCSAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwgdG8gZ2l2ZSB0aGUgY29tYm8gYm94Ci0JICogQHBhcmFtIGtleSB0aGUgdW5pcXVlIGtleSB0byBpZGVudGlmeSB0aGUgY29tYm8gYm94Ci0JICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzIHJlcHJlc2VudGVkIGJ5IHRoZSBjb21ibyBvcHRpb25zCi0JICogQHBhcmFtIHZhbHVlTGFiZWxzIHRoZSBjYWx1ZXMgZGlzcGxheWVkIGluIHRoZSBjb21ibyBib3gKLQkgKiBAcGFyYW0gaW5kZW50IGhvdyBmYXIgdG8gaW5kZW50IHRoZSBjb21ibyBib3ggbGFiZWwKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgY29tYm8gYm94Ci0JICovCi0JcHJvdGVjdGVkIENvbWJvIGFkZENvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGtleSwgaW50W10gdmFsdWVzLCBTdHJpbmdbXSB2YWx1ZUxhYmVscywgaW50IGluZGVudCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudDsKLQotCQlMYWJlbCBsYWJlbENvbnRyb2wgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsQ29udHJvbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWxhYmVsQ29udHJvbC5zZXRUZXh0KGxhYmVsKTsKLQkJbGFiZWxDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCi0JCUNvbWJvIGNvbWJvQm94ID0gbmV3Q29tYm9Db250cm9sKHBhcmVudCwga2V5LCB2YWx1ZXMsIHZhbHVlTGFiZWxzKTsKLQkJY29tYm9Cb3guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJcmV0dXJuIGNvbWJvQm94OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ibyBib3ggYW5kIGFzc29jaWF0ZXMgdGhlIGNvbWJvIGRhdGEgd2l0aCB0aGUKLQkgKiBjb21ibyBib3guCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgY29tcG9zaXRlIHRvIGNyZWF0ZSB0aGUgY29tYm8gYm94IGluCi0JICogQHBhcmFtIGtleSB0aGUgdW5pcXVlIGtleSB0byBpZGVudGlmeSB0aGUgY29tYm8gYm94Ci0JICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzIHJlcHJlc2VudGVkIGJ5IHRoZSBjb21ibyBvcHRpb25zCi0JICogQHBhcmFtIHZhbHVlTGFiZWxzIHRoZSB2YWx1ZXMgZGlzcGxheWVkIGluIHRoZSBjb21ibyBib3gKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgY29tYm8gYm94Ci0JICovCi0JcHJvdGVjdGVkIENvbWJvIG5ld0NvbWJvQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlLCBTdHJpbmcga2V5LCBpbnRbXSB2YWx1ZXMsIFN0cmluZ1tdIHZhbHVlTGFiZWxzKSB7Ci0JCUNvbWJvRGF0YSBkYXRhID0gbmV3IENvbWJvRGF0YShrZXksIHZhbHVlcywgLTEpOwotCi0JCUNvbWJvIGNvbWJvQm94ID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvQm94LnNldEl0ZW1zKHZhbHVlTGFiZWxzKTsKLQkJY29tYm9Cb3guc2V0RGF0YShkYXRhKTsKLQkJY29tYm9Cb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWNvbWJvQm94LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQotCQltYWtlU2Nyb2xsYWJsZUNvbXBvc2l0ZUF3YXJlKGNvbWJvQm94KTsKLQotCQlpbnQgc2V2ZXJpdHkgPSAtMTsKLQkJaWYgKGtleSAhPSBudWxsKQotCQkJc2V2ZXJpdHkgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldEludChnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpLCBrZXksIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcsIGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKSk7Ci0KLQkJaWYgKHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SIHx8IHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgfHwgc2V2ZXJpdHkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQlkYXRhLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQkJCWRhdGEub3JpZ2luYWxTZXZlcml0eSA9IHNldmVyaXR5OwotCQl9Ci0KLQkJaWYgKGRhdGEuZ2V0SW5kZXgoKSA+PSAwKQotCQkJY29tYm9Cb3guc2VsZWN0KGRhdGEuZ2V0SW5kZXgoKSk7Ci0KLQkJZkNvbWJvcy5hZGQoY29tYm9Cb3gpOwotCQlyZXR1cm4gY29tYm9Cb3g7Ci0JfQotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGdldFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlpZiAoZlNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWNvbnRyb2xDaGFuZ2VkKGUud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBmU2VsZWN0aW9uTGlzdGVuZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJvbENoYW5nZWQoV2lkZ2V0IHdpZGdldCkgewotCQlDb21ib0RhdGEgZGF0YSA9IChDb21ib0RhdGEpIHdpZGdldC5nZXREYXRhKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb21ibykgewotCQkJZGF0YS5zZXRJbmRleCgoKENvbWJvKSB3aWRnZXQpLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0U2V0dGluZ3NQYWdlI3N0b3JlVmFsdWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJaWYgKGZDb21ib3MgPT0gbnVsbCB8fCBmQ29tYm9zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCUl0ZXJhdG9yIGl0ID0gZkNvbWJvcy5pdGVyYXRvcigpOwotCi0JCUlTY29wZUNvbnRleHRbXSBjb250ZXh0cyA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKTsKLQotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlDb21ib0RhdGEgZGF0YSA9IChDb21ib0RhdGEpICgoQ29tYm8pIGl0Lm5leHQoKSkuZ2V0RGF0YSgpOwotCQkJaWYgKGRhdGEuZ2V0S2V5KCkgIT0gbnVsbCkgewotCQkJCWNvbnRleHRzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucHV0SW50KGRhdGEuZ2V0S2V5KCksIGRhdGEuZ2V0U2V2ZXJpdHkoKSk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRleHRzW2ldLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZmx1c2goKTsKLQkJCX0KLQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRXhwYW5kYWJsZUNvbXBvc2l0ZSBnZXRQYXJlbnRFeHBhbmRhYmxlQ29tcG9zaXRlKENvbnRyb2wgY29udHJvbCkgewotCQlDb250cm9sIHBhcmVudCA9IGNvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEV4cGFuZGFibGVDb21wb3NpdGUpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEV4cGFuZGFibGVDb21wb3NpdGUpIHsKLQkJCXJldHVybiAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBFeHBhbmRhYmxlQ29tcG9zaXRlIGNyZWF0ZVN0eWxlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIGludCBuQ29sdW1ucykgewotCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4Y29tcG9zaXRlID0gbmV3IEV4cGFuZGFibGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5DTElFTlRfSU5ERU5UKTsKLQkJZXhjb21wb3NpdGUuc2V0VGV4dChsYWJlbCk7Ci0JCWV4Y29tcG9zaXRlLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJZXhjb21wb3NpdGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKEpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05UKSk7Ci0JCWV4Y29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlLCBuQ29sdW1ucywgMSkpOwotCQlleGNvbXBvc2l0ZS5hZGRFeHBhbnNpb25MaXN0ZW5lcihuZXcgRXhwYW5zaW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKSB7Ci0JCQkJZXhwYW5kZWRTdGF0ZUNoYW5nZWQoKEV4cGFuZGFibGVDb21wb3NpdGUpIGUuZ2V0U291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJZkV4cGFuZGFibGVzLmFkZChleGNvbXBvc2l0ZSk7Ci0JCW1ha2VTY3JvbGxhYmxlQ29tcG9zaXRlQXdhcmUoZXhjb21wb3NpdGUpOwotCQlyZXR1cm4gZXhjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVTdHlsZVNlY3Rpb25XaXRoQ29udGVudENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIGludCBuQ29sdW1ucykgewotCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4Y29tcG9zaXRlID0gbmV3IEV4cGFuZGFibGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5DTElFTlRfSU5ERU5UKTsKLQkJZXhjb21wb3NpdGUuc2V0VGV4dChsYWJlbCk7Ci0JCWV4Y29tcG9zaXRlLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJZXhjb21wb3NpdGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKEpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05UKSk7Ci0JCWV4Y29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlLCBuQ29sdW1ucywgMSkpOwotCQlleGNvbXBvc2l0ZS5hZGRFeHBhbnNpb25MaXN0ZW5lcihuZXcgRXhwYW5zaW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKSB7Ci0JCQkJZXhwYW5kZWRTdGF0ZUNoYW5nZWQoKEV4cGFuZGFibGVDb21wb3NpdGUpIGUuZ2V0U291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJZkV4cGFuZGFibGVzLmFkZChleGNvbXBvc2l0ZSk7Ci0JCW1ha2VTY3JvbGxhYmxlQ29tcG9zaXRlQXdhcmUoZXhjb21wb3NpdGUpOwotCi0JCUNvbXBvc2l0ZSBpbm5lciA9IG5ldyBDb21wb3NpdGUoZXhjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChleGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQlpbm5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobkNvbHVtbnMsIGZhbHNlKSk7Ci0JCWV4Y29tcG9zaXRlLnNldENsaWVudChpbm5lcik7Ci0JCXJldHVybiBpbm5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBleHBhbmRlZFN0YXRlQ2hhbmdlZChFeHBhbmRhYmxlQ29tcG9zaXRlIGV4cGFuZGFibGUpIHsKLQkJU2Nyb2xsZWRQYWdlQ29udGVudCBwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZSA9IGdldFBhcmVudFNjcm9sbGVkQ29tcG9zaXRlKGV4cGFuZGFibGUpOwotCQlpZiAocGFyZW50U2Nyb2xsZWRDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJcGFyZW50U2Nyb2xsZWRDb21wb3NpdGUucmVmbG93KHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VTY3JvbGxhYmxlQ29tcG9zaXRlQXdhcmUoQ29udHJvbCBjb250cm9sKSB7Ci0JCVNjcm9sbGVkUGFnZUNvbnRlbnQgcGFyZW50U2Nyb2xsZWRDb21wb3NpdGUgPSBnZXRQYXJlbnRTY3JvbGxlZENvbXBvc2l0ZShjb250cm9sKTsKLQkJaWYgKHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXBhcmVudFNjcm9sbGVkQ29tcG9zaXRlLmFkYXB0Q2hpbGQoY29udHJvbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU2Nyb2xsZWRQYWdlQ29udGVudCBnZXRQYXJlbnRTY3JvbGxlZENvbXBvc2l0ZShDb250cm9sIGNvbnRyb2wpIHsKLQkJQ29udHJvbCBwYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZFBhZ2VDb250ZW50KSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZFBhZ2VDb250ZW50KSB7Ci0JCQlyZXR1cm4gKFNjcm9sbGVkUGFnZUNvbnRlbnQpIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmRXhwYW5kYWJsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUgY29tcCA9IChFeHBhbmRhYmxlQ29tcG9zaXRlKSBmRXhwYW5kYWJsZXMuZ2V0KGkpOwotCQkJc2VjdGlvbi5wdXQoU0VUVElOR1NfRVhQQU5ERUQgKyBTdHJpbmcudmFsdWVPZihpKSwgY29tcC5pc0V4cGFuZGVkKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmRXhwYW5kYWJsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUgZXhjb21wb3NpdGU9IChFeHBhbmRhYmxlQ29tcG9zaXRlKSBmRXhwYW5kYWJsZXMuZ2V0KGkpOwotCQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKLQkJCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChpID09IDApOyAvLyBvbmx5IGV4cGFuZCB0aGUgZmlyc3Qgbm9kZSBieSBkZWZhdWx0Ci0JCQl9IGVsc2UgewotCQkJCWV4Y29tcG9zaXRlLnNldEV4cGFuZGVkKHNldHRpbmdzLmdldEJvb2xlYW4oU0VUVElOR1NfRVhQQU5ERUQgKyBTdHJpbmcudmFsdWVPZihpKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRTZXZlcml0aWVzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIGRlZmF1bHRDb250ZXh0ID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkNvbWJvcy5zaXplKCk7IGkrKykgewotCQkJQ29tYm9EYXRhIGRhdGEgPSAoQ29tYm9EYXRhKSAoKENvbWJvKSBmQ29tYm9zLmdldChpKSkuZ2V0RGF0YSgpOwotCQkJaW50IHNldmVyaXR5ID0gZGVmYXVsdENvbnRleHQuZ2V0SW50KGRhdGEuZ2V0S2V5KCksIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQkJZGF0YS5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0JCQkoKENvbWJvKSBmQ29tYm9zLmdldChpKSkuc2VsZWN0KGRhdGEuZ2V0SW5kZXgoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSZXZhbGlkYXRlT25TZXR0aW5nc0NoYW5nZSgpIHsKLQkJSXRlcmF0b3IgaXQgPSBmQ29tYm9zLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJQ29tYm9EYXRhIGRhdGEgPSAoQ29tYm9EYXRhKSAoKENvbWJvKSBpdC5uZXh0KCkpLmdldERhdGEoKTsKLQkJCWlmIChkYXRhLmlzQ2hhbmdlZCgpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWlmKHN1cGVyLnBlcmZvcm1PaygpICYmIHNob3VsZFJldmFsaWRhdGVPblNldHRpbmdzQ2hhbmdlKCkpIHsKLQkJCU1lc3NhZ2VCb3ggbWIgPSBuZXcgTWVzc2FnZUJveCh0aGlzLmdldFNoZWxsKCksIFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5ZRVMgfCBTV1QuTk8gfCBTV1QuQ0FOQ0VMIHwgU1dULklDT05fSU5GT1JNQVRJT04gfCBTV1QuUklHSFQpOwotCQkJbWIuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX1RpdGxlKTsKLQkJCS8qIENob29zZSB3aGljaCBtZXNzYWdlIHRvIHVzZSBiYXNlZCBvbiBpZiBpdHMgcHJvamVjdCBvciB3b3Jrc3BhY2Ugc2V0dGluZ3MgKi8KLQkJCVN0cmluZyBtc2cgPSAoZ2V0UHJvamVjdCgpID09IG51bGwpID8gSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9Xb3Jrc3BhY2UgOiBIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX1Byb2plY3Q7Ci0JCQltYi5zZXRNZXNzYWdlKG1zZyk7Ci0JCQlzd2l0Y2gobWIub3BlbigpKSB7Ci0JCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJY2FzZSBTV1QuWUVTOgotCQkJCQlWYWxpZGF0ZUpvYiBqb2IgPSBuZXcgVmFsaWRhdGVKb2IoSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9qb2JOYW1lKTsKLQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJY2FzZSBTV1QuTk86Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdmFsaWRhdGlvbiBhZnRlciB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIGhhdmUgYmVlbiBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRlSm9iIGV4dGVuZHMgSm9iIHsKLQotCQlwdWJsaWMgVmFsaWRhdGVKb2IoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gbnVsbDsKLQkJCQkvKiBDaGFuZ2VkIHByZWZlcmVuY2VzIGZvciBhIHNpbmdsZSBwcm9qZWN0LCBvbmx5IHZhbGlkYXRlIGl0ICovCi0JCQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKQotCQkJCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtde2dldFByb2plY3QoKX07Ci0JCQkJLyogV29ya3NwYWNlLXdpZGUgcHJlZmVyZW5jZXMgY2hhbmdlZCAqLwotCQkJCWVsc2UgewotCQkJCQkvKiBHZXQgYWxsIG9mIHRoZSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlICovCi0JCQkJCXByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gbnVsbDsKLQkJCQkJTGlzdCBwcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQkvKiBGaWx0ZXIgb3V0IHByb2plY3RzIHRoYXQgdXNlIHByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3Mgb3IgaGF2ZSBiZWVuIGNsb3NlZCAqLwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlwcmVmcyA9IG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdHNbaV0pLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSk7Ci0JCQkJCQlpZiAocHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkgJiYgIXByZWZzLmdldEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZhbHNlKSkKLQkJCQkJCQlwcm9qZWN0TGlzdC5hZGQocHJvamVjdHNbaV0pOwotCQkJCQl9Ci0JCQkJCXByb2plY3RzID0gKElQcm9qZWN0W10pIHByb2plY3RMaXN0LnRvQXJyYXkobmV3IElQcm9qZWN0W3Byb2plY3RMaXN0LnNpemUoKV0pOwotCQkJCX0KLQkJCQlmVmFsaWRhdGlvbi52YWxpZGF0ZShwcm9qZWN0cywgdHJ1ZSwgZmFsc2UsIG1vbml0b3IpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDVhNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHlsZWRUZXh0Q29sb3JQaWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvbG9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29sb3JQYWdlIGV4dGVuZHMgWE1MQ29sb3JQYWdlIHsKLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gc2V0IHVwIFN0eWxlZFRleHRDb2xvclBpY2tlciBkaWZmZXJlbnRseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yUGlja2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHRoZSBjb2xvciBwaWNrZXIKLQkJZlBpY2tlciA9IG5ldyBKU1BTdHlsZWRUZXh0Q29sb3JQaWNrZXIocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZlBpY2tlci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZQaWNrZXIuc2V0UHJlZmVyZW5jZVN0b3JlKGZPdmVybGF5U3RvcmUpOwotCQlzZXR1cFBpY2tlcihmUGlja2VyKTsKLQotCQlmUGlja2VyLnNldFRleHQoZ2V0U2FtcGxlVGV4dCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JCUl0ZXJhdG9yIGkgPSBzdHlsZUxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZylpLm5leHQoKSkpOwkKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuU2FtcGxlX0pTUF9kb2M7IC8vJE5PTi1OTFMtMSQgPSAiPCVAIHBhZ2UgXG5cdGxhbmd1YWdlPVwiamF2YVwiIFxuXHRjb250ZW50VHlwZT1cInRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xXCJcbiU+XG48anNwOmluY2x1ZGUgZmx1c2g9XCJ0cnVlXCIgcGFnZT1cInRpdGxlQmFyLmpzcFwiLz5cblxuPCUtLSBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4xIC0tJT5cbjwlXG5cdFN5c3RlbS5vdXQucHJpbnRsbihcIldlbGNvbWUhXCIpO1xuJT5cbjwlLS0gVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMiAtLSU+XG48anNwOnNjcmlwdGxldD5cblx0U3lzdGVtLm91dC5wcmludGxuKFwiV2VsY29tZSFcIik7XG48L2pzcDpzY3JpcHRsZXQ+IgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXApIHsKLQotCQlpbml0Q29tbW9uQ29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5yZW1vdmUoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCk7IC8vIGxlYXZlIGNvbnRlbnQgYmV0d2VlbiB0YWdzIGFsb25lCi0JCWNvbnRleHRTdHlsZU1hcC5yZW1vdmUoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTik7IC8vIHhtbC9odG1sIHNwZWNpZmljCi0JCWNvbnRleHRTdHlsZU1hcC5yZW1vdmUoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpOyAvLyB4bWwvaHRtbCBzcGVjaWZpYwotCQljb250ZXh0U3R5bGVNYXAucmVtb3ZlKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOyAvLyB4bWwvaHRtbCBzcGVjaWZpYwotCQljb250ZXh0U3R5bGVNYXAucmVtb3ZlKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTF9DTE9TRSk7IC8vIHhtbC9odG1sIHNwZWNpZmljCi0KLQkJLy8JY29udGV4dFN0eWxlTWFwLnB1dChYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgSFRNTENvbG9yTWFuYWdlci5TQ1JJUFRfQVJFQSk7Ci0JCS8vCWNvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuQkxPQ0tfVEVYVCwgSFRNTENvbG9yTWFuYWdlci5TQ1JJUFRfQVJFQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4sIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4sIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQkKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UKTsKLQkJCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQkJaW5pdENvbW1vbkRlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlkZXNjcmlwdGlvbnMucmVtb3ZlKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7IC8vIGxlYXZlIGNvbnRlbnQgYmV0d2VlbiB0YWdzIGFsb25lCi0JCWRlc2NyaXB0aW9ucy5yZW1vdmUoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsgLy8geG1sL2h0bWwgc3BlY2lmaWMKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUiwgSlNQVUlNZXNzYWdlcy5KU1BfRGVsaW1pdGVyc19VSV8pOyAvLyROT04tTkxTLTEkID0gIkpTUCBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCwgSlNQVUlNZXNzYWdlcy5KU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQkJaW5pdENvbW1vblN0eWxlTGlzdChsaXN0KTsKLQkJbGlzdC5yZW1vdmUoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsgLy8gbGVhdmUgY29udGVudCBiZXR3ZWVuIHRhZ3MgYWxvbmUKLQkJbGlzdC5yZW1vdmUoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsgLy8geG1sL2h0bWwgc3BlY2lmaWMKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldHVwUGlja2VyKFN0eWxlZFRleHRDb2xvclBpY2tlciBwaWNrZXIpIHsKLQkJSU1vZGVsTWFuYWdlciBtbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXBpY2tlci5zZXRQYXJzZXIobW1hbmFnZXIuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApLmdldFBhcnNlcigpKTsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb25zIGZvciBoaWdobGlnaHRpbmcgdHlwZXMKLQkJRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQotCQkvLyBtYXAgcmVnaW9uIHR5cGVzIHRvIGhpZ2hsaWdodGluZyB0eXBlcwotCQlEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCQlwaWNrZXIuc2V0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCXBpY2tlci5zZXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJcGlja2VyLnNldFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YWJjNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZTsKLQotcHVibGljIGNsYXNzIEpTUEZpbGVzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBIVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50c0ZvckxvYWRpbmdHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JMb2FkaW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBubyBsb2FkaW5nIHByZWZlcmVuY2VzCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSNpbml0aWFsaXplVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkgewotCQkvLyBubyBsb2FkaW5nIHByZWZlcmVuY2VzCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHNGb3JMb2FkaW5nR3JvdXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJLy8gbm8gbG9hZGluZyBwcmVmZXJlbmNlcwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudWkuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2Ujc3RvcmVWYWx1ZXNGb3JMb2FkaW5nR3JvdXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkgewotCQkvLyBubyBsb2FkaW5nIHByZWZlcmVuY2VzCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3NmI0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCW5ldyBQcmVmZXJlbmNlTGlua0FyZWEoY29tcG9zaXRlLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZWRpdG9yIiwgSlNQVUlNZXNzYWdlcy5fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCkuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmluZGVudCg1LCAwKS5oaW50KDE1MCwgU1dULkRFRkFVTFQpLmNyZWF0ZSgpKTsKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LnN3dERlZmF1bHRzKCkuY3JlYXRlKCkpOwotCi0JCVRleHQgbGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQlsYWJlbC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5ERUZBVUxULCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlQcmVmZXJlbmNlTGlua0FyZWEgZmlsZUVkaXRvcnNBcmVhID0gbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5OT05FLCAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuc291cmNlIiwgSlNQVUlNZXNzYWdlcy5KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8xLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCk7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkRFRkFVTFQsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNTsKLQkJZmlsZUVkaXRvcnNBcmVhLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVByZWZlcmVuY2VMaW5rQXJlYSBjb250ZW50VHlwZUFyZWEgPSBuZXcgUHJlZmVyZW5jZUxpbmtBcmVhKGNvbXBvc2l0ZSwgU1dULk5PTkUsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5zb3VyY2UiLCBKU1BVSU1lc3NhZ2VzLkpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzIsLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuREVGQVVMVCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSA1OwotCQljb250ZW50VHlwZUFyZWEuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFN0eWxlZFRleHRDb2xvclBpY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFN0eWxlZFRleHRDb2xvclBpY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWJkODA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTdHlsZWRUZXh0Q29sb3JQaWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotCi0vKioKLSogT3ZlcnJpZGVzIFN0eWxlZFRleHRDb2xvclBpY2tlciBmb3Igc3BlY2lhbCBlbmFibGVtZW50IGJlaGF2aW9yIAotKiBmb3IgSlNQQ29udGVudCAob25seSBiYWNrZ3JvdW5kIHNldHRhYmxlKQotKiovCi1wdWJsaWMgY2xhc3MgSlNQU3R5bGVkVGV4dENvbG9yUGlja2VyIGV4dGVuZHMgU3R5bGVkVGV4dENvbG9yUGlja2VyIHsKLQkKLQlwdWJsaWMgSlNQU3R5bGVkVGV4dENvbG9yUGlja2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQWN0aXZhdGUgY29udHJvbHMgYmFzZWQgb24gdGhlIGdpdmVuIGxvY2FsIGNvbG9yIHR5cGUuCi0JICogT3ZlcnJpZGRlbiB0byBkaXNhYmxlIGZvcmVncm91bmQgY29sb3IsIGJvbGQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJc3VwZXIuYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQotCQlpZihuYW1lZFN0eWxlID09IElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCkgewotCQkJZkZvcmVncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWlmIChzaG93SXRhbGljKQotCQkJCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTeW50YXhDb2xvcmluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkODEzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29sb3JTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEEgcHJlZmVyZW5jZSBwYWdlIHRvIGNvbmZpZ3VyZSBvdXIgWE1MIHN5bnRheCBjb2xvci4gSXQgcmVzZW1ibGVzIHRoZSBKRFQKLSAqIGFuZCBDRFQgcGFnZXMgZmFyIG1vcmUgdGhhbiBvdXIgb3JpZ2luYWwgY29sb3IgcGFnZSB3aGlsZSByZXRhaW5pbmcgdGhlCi0gKiBleHRyYSAiY2xpY2stdG8tZmluZCIgZnVuY3Rpb25hbGl0eS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpTUFN5bnRheENvbG9yaW5nUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGZCb2xkOwotCXByaXZhdGUgTGFiZWwgZkZvcmVncm91bmRMYWJlbDsKLQlwcml2YXRlIExhYmVsIGZCYWNrZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsZWFyU3R5bGU7Ci0JcHJpdmF0ZSBNYXAgZkNvbnRleHRUb1N0eWxlTWFwOwotCXByaXZhdGUgQ29sb3IgZkRlZmF1bHRGb3JlZ3JvdW5kID0gbnVsbDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0QmFja2dyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkZvcmVncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkJhY2tncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIEJ1dHRvbiBmSXRhbGljOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCXByaXZhdGUgQnV0dG9uIGZTdHJpa2U7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciBmU3R5bGVzVmlld2VyID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwOwotCXByaXZhdGUgU3R5bGVkVGV4dCBmVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmVW5kZXJsaW5lOwotCi0KLQkvLyBhY3RpdmF0ZSBjb250cm9scyBiYXNlZCBvbiB0aGUgZ2l2ZW4gbG9jYWwgY29sb3IgdHlwZQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZShTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlDb2xvciBmb3JlZ3JvdW5kID0gZkRlZmF1bHRGb3JlZ3JvdW5kOwotCQlDb2xvciBiYWNrZ3JvdW5kID0gZkRlZmF1bHRCYWNrZ3JvdW5kOwotCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKSB7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCb2xkLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlmSXRhbGljLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlmVW5kZXJsaW5lLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlUZXh0QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZUZvcihuYW1lZFN0eWxlKTsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlib29sZWFuIGVuYWJsZUJhY2tncm91bmRPbmx5ID0gSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5ULmVxdWFscyhuYW1lZFN0eWxlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQoIWVuYWJsZUJhY2tncm91bmRPbmx5KTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZCghZW5hYmxlQmFja2dyb3VuZE9ubHkpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKCFlbmFibGVCYWNrZ3JvdW5kT25seSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoIWVuYWJsZUJhY2tncm91bmRPbmx5KTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCghZW5hYmxlQmFja2dyb3VuZE9ubHkpOwotCQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKCFlbmFibGVCYWNrZ3JvdW5kT25seSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0xpbmspOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24ocGFyZW50LmdldFNoZWxsKCksIGUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50PSAxNTA7IC8vIG9ubHkgZXhwYW5kIGZ1cnRoZXIgaWYgYW55b25lIGVsc2UgcmVxdWlyZXMgaXQKLQkJbGluay5zZXRMYXlvdXREYXRhKGxpbmtEYXRhKTsKLQotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCVNhc2hGb3JtIGVkaXRvciA9IG5ldyBTYXNoRm9ybShwYWdlQ29tcG9uZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJU2FzaEZvcm0gdG9wID0gbmV3IFNhc2hGb3JtKGVkaXRvciwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3R5bGVFZGl0b3IgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luUmlnaHQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMDsKLQkJY3JlYXRlTGFiZWwoc3R5bGVFZGl0b3IsIEpTUFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzApOwotCQlmU3R5bGVzVmlld2VyID0gY3JlYXRlU3R5bGVzVmlld2VyKHN0eWxlRWRpdG9yKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heChncmlkRGF0YS53aWR0aEhpbnQsIGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKS5sZW5ndGgoKSkpOwotCQl9Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlmU3R5bGVzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgZWRpdGluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJY3JlYXRlTGFiZWwoZWRpdGluZ0NvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1dHRvbiBlbmFibGVyID0gY3JlYXRlQ2hlY2tib3goZWRpdGluZ0NvbXBvc2l0ZSwgSlNQVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMik7Ci0JCWVuYWJsZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVuYWJsZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlDb21wb3NpdGUgZWRpdENvbnRyb2xzID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRpbmdDb21wb3NpdGUsIDIpOwotCQkoKEdyaWRMYXlvdXQpIGVkaXRDb250cm9scy5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDIwOwotCi0JCWZGb3JlZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuRm9yZWdyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmRm9yZWdyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkZvcmVncm91bmRDb2xvciA9IGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmRm9yZWdyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuQmFja2dyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQmFja2dyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkJhY2tncm91bmRDb2xvciA9IGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmQmFja2dyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBKU1BVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8zKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZCb2xkLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBKU1BVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV80KTsKLQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZkl0YWxpYy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlN0cmlrZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgSlNQVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNSk7Ci0JCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZTdHJpa2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZVbmRlcmxpbmUgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIEpTUFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzYpOwotCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmVW5kZXJsaW5lLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJTdHlsZSA9IG5ldyBCdXR0b24oZWRpdGluZ0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmQ2xlYXJTdHlsZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuUmVzdG9yZV9EZWZhdWx0X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUmVzdG9yZSBEZWZhdWx0IgotCQlmQ2xlYXJTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKSk7Ci0JCSgoR3JpZERhdGEpIGZDbGVhclN0eWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgc2FtcGxlQXJlYSA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0b3IsIDEpOwotCi0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gNTsKLQkJY3JlYXRlTGFiZWwoc2FtcGxlQXJlYSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihzYW1wbGVBcmVhLCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YTMgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEzLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWdyaWREYXRhMy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZ3JpZERhdGEzLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTMpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihnZXRUZXh0S2V5TGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkTW91c2VMaXN0ZW5lcihnZXRUZXh0TW91c2VMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihnZXRUcmF2ZXJzZUxpc3RlbmVyKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZUZXh0LCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOwotCQlmRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJZkRvY3VtZW50LnNldChnZXRFeGFtcGxlVGV4dCgpKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGZEb2N1bWVudCk7Ci0KLQkJdG9wLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJZWRpdG9yLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuSlNQX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCWZTdHlsZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpKTsKLQotCQlhcHBseVN0eWxlcygpOwotCi0JCWZTdHlsZXNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1swXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1swXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1sxXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1syXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkl0YWxpYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZTdHJpa2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1s0XTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZlN0cmlrZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s0XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmVW5kZXJsaW5lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNV07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZVbmRlcmxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFRvRGVmYXVsdChuYW1lZFN0eWxlKTsKLQkJCQlhcHBseVN0eWxlcygpOwotCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExpc3Qgdmlld2VyIHdoZXJlIHdlIHNlZSB0aGUgdmFyaW91cyBzeW50YXggZWxlbWVudCBkaXNwbGF5Ci0JICogbmFtZXMtLXdvdWxkIGl0IGV2ZXIgYmUgYSBUcmVlIGxpa2UgSkRUJ3M/Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlU3R5bGVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RydWN0dXJlZFZpZXdlciBzdHlsZXNWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdCBkZXNjcmlwdGlvbiA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0eWxlc1ZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLlNhbXBsZV9KU1BfZG9jOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVkU3R5bGVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCS8vIGVuc3VyZSB0aGUgb2Zmc2V0IGlzIGNsZWFuCi0JCWlmIChvZmZzZXQgPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldChmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJZWxzZSBpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKGRvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWRvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbidzIENvbnRleHQgYXQgdGhpcyBvZmZzZXQKLQkJCUlUZXh0UmVnaW9uIGludGVyZXN0ID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGRvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChyZWdpb25Db250ZXh0KTsKLQkJCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmFtZWRTdHlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZ2V0T3ZlcmxheVN0b3JlKCkgewotCQlyZXR1cm4gZk92ZXJsYXlTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpIHsKLQkJaWYgKGZTdHlsZVByZWZlcmVuY2VLZXlzID09IG51bGwpIHsKLQkJCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCk7Ci0JCQlmU3R5bGVQcmVmZXJlbmNlS2V5cyA9IHN0eWxlczsKLQkJfQotCQlyZXR1cm4gZlN0eWxlUHJlZmVyZW5jZUtleXM7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmF2ZXJzZUxpc3RlbmVyIGdldFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIja2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWlmICgoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB8fCAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykpCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb24pOwotCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKTsKLQkJaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCk7Ci0KLQkJZk92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKSB7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QRV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFN0eWxlVG9EZXNjcmlwdGlvbk1hcCgpIHsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfRGVsaW1pdGVyc19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQsIFhNTFVJTWVzc2FnZXMuQ29tbWVudF9Db250ZW50X1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIFhNTFVJTWVzc2FnZXMuVGFnX0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIFhNTFVJTWVzc2FnZXMuVGFnX05hbWVzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfTmFtZXNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfVmFsdWVzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UsIFhNTFVJTWVzc2FnZXMuRW50aXR5X1JlZmVyZW5jZV9VSV8pOyAvLyROT04tTkxTLTEkID0gIkVudGl0eSBSZWZlcmVuY2VzIgotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUiwgSlNQVUlNZXNzYWdlcy5KU1BfRGVsaW1pdGVyc19VSV8pOyAvLyROT04tTkxTLTEkID0gIkpTUCBEZWxpbWl0ZXJzIgotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQsIEpTUFVJTWVzc2FnZXMuSlNQQ29sb3JQYWdlX2pzcF9jb250ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5sb2FkRGVmYXVsdHMoKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCWFjdGl2YXRlKG51bGwpOwotCQlmVGV4dC5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnByb3BhZ2F0ZSgpOwotCi0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q29sb3JBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5hbWVkU3R5bGUpKTsKLQkJCWZTdHlsZXNWaWV3ZXIucmV2ZWFsKG5hbWVkU3R5bGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhbGx5IHNldCB0aGUgcmVwb3J0aW5nIG5hbWUgb2YgYSBjb250cm9sIGZvciBhY2Nlc3NpYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2libGUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgbiA9IG5hbWU7Ci0JCWNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDYzN2E5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBKU1AgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0JY2xhc3MgSlNQRWRpdFRlbXBsYXRlRGlhbG9nIGV4dGVuZHMgRWRpdFRlbXBsYXRlRGlhbG9nIHsKLQkJcHVibGljIEpTUEVkaXRUZW1wbGF0ZURpYWxvZyhTaGVsbCBwYXJlbnQsIFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSwgQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJc3VwZXIocGFyZW50LCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgcmVnaXN0cnkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewkJCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQotCQkJcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0JCQkJYXNzaXN0YW50LmVuYWJsZUF1dG9BY3RpdmF0aW9uKHRydWUpOwotCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvSW5zZXJ0KHRydWUpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGdldFRlbXBsYXRlUHJvY2Vzc29yKCksIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7Ci0JCQkJcmV0dXJuIGFzc2lzdGFudDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci19Ci0JfQotCi0JcHVibGljIEpTUFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCUpTUFVJUGx1Z2luIGpzcEVkaXRvclBsdWdpbiA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoanNwRWRpdG9yUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0VGVtcGxhdGVTdG9yZShqc3BFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVTdG9yZSgpKTsKLQkJc2V0Q29udGV4dFR5cGVSZWdpc3RyeShqc3BFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBvazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpIHsKLQkJLy8gdGVtcGxhdGUgZm9ybWF0dGluZyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKGFuY2VzdG9yKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuSlNQX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gdmlld2VyQ29uZmlndXJhdGlvbikgewotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQOwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUodmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdCBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLQkgKiBhIGN1c3RvbSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIGVkaXQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgZWRpdGFibGUKLQkgKiBAcGFyYW0gaXNOYW1lTW9kaWZpYWJsZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9yIG1vZGlmaWVkIHRlbXBsYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGVkaXRpb24gZmFpbGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZSBlZGl0VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlKSB7Ci0JCUVkaXRUZW1wbGF0ZURpYWxvZyBkaWFsb2cgPSBuZXcgSlNQRWRpdFRlbXBsYXRlRGlhbG9nKGdldFNoZWxsKCksIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCBnZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KCkpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiBkaWFsb2cuZ2V0VGVtcGxhdGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BUeXBpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGIyZDg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BUeXBpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKU1BUeXBpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBCdXR0b24gZkNsb3NlQnJhY2VzOwotCXByaXZhdGUgQnV0dG9uIGZDbG9zZVNjcmlwdGxldHM7Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCQotCQljcmVhdGVBdXRvQ29tcGxldGUoY29tcG9zaXRlKTsKLQkJCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXV0b0NvbXBsZXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQkKLQkJZ3JvdXAuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUFR5cGluZ19BdXRvX0NvbXBsZXRlKTsKLQkJCi0JCWZDbG9zZUJyYWNlcyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBKU1BVSU1lc3NhZ2VzLkpTUFR5cGluZ19Db21wbGV0ZV9CcmFjZXMpOwotCQkoKEdyaWREYXRhKSBmQ2xvc2VCcmFjZXMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQlmQ2xvc2VTY3JpcHRsZXRzID0gY3JlYXRlQ2hlY2tCb3goZ3JvdXAsIEpTUFVJTWVzc2FnZXMuSlNQVHlwaW5nX0NvbXBsZXRlX1NjcmlwdGxldHMpOwotCQkoKEdyaWREYXRhKSBmQ2xvc2VTY3JpcHRsZXRzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQkKLQkJSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJaW5pdENoZWNrYm94KGZDbG9zZUJyYWNlcywgSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VMX0JSQUNFUyk7Ci0JCWluaXRDaGVja2JveChmQ2xvc2VTY3JpcHRsZXRzLCBKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfU0NSSVBUTEVUUyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJZGVmYXVsdENoZWNrYm94KGZDbG9zZUJyYWNlcywgSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VMX0JSQUNFUyk7Ci0JCWRlZmF1bHRDaGVja2JveChmQ2xvc2VTY3JpcHRsZXRzLCBKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfU0NSSVBUTEVUUyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0Q2hlY2tib3goQnV0dG9uIGJveCwgU3RyaW5nIGtleSkgewotCQlpZihib3ggIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCkKLQkJCWJveC5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihrZXkpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlZmF1bHRDaGVja2JveChCdXR0b24gYm94LCBTdHJpbmcga2V5KSB7Ci0JCWlmKGJveCAhPSBudWxsICYmIGtleSAhPSBudWxsKQotCQkJYm94LnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihrZXkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTF9CUkFDRVMsIChmQ2xvc2VCcmFjZXMgIT0gbnVsbCkgPyBmQ2xvc2VCcmFjZXMuZ2V0U2VsZWN0aW9uKCkgOiBmYWxzZSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9TQ1JJUFRMRVRTLCAoZkNsb3NlU2NyaXB0bGV0cyAhPSBudWxsKSA/IGZDbG9zZVNjcmlwdGxldHMuZ2V0U2VsZWN0aW9uKCkgOiBmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTgxNzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU2Nyb2xsZWRQYWdlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGl4ZWxDb252ZXJ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UgewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HU19TRUNUSU9OX05BTUUgPSAiSlNQVmFsaWRhdGlvblNldmVyaXRpZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFNFVkVSSVRJRVMgPSB7VmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRX07Ci0KLQkvLyBTaG91bGQgZXF1YWwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByb2JsZW1TZXZlcml0aWVzUHJlZmVyZW5jZVBhZ2UuUFJFRl9JRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfU0VWRVJJVFlfUFJFRkVSRU5DRV9QQUdFID0gIm9yZy5lY2xpcHNlLmpkdC51aS5wcmVmZXJlbmNlcy5Qcm9ibGVtU2V2ZXJpdGllc1ByZWZlcmVuY2VQYWdlIjsKLQkvLyBTaG91bGQgZXF1YWwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByb2JsZW1TZXZlcml0aWVzUHJlZmVyZW5jZVBhZ2UuUFJPUF9JRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfU0VWRVJJVFlfUFJPUEVSVFlfUEFHRSA9ICJvcmcuZWNsaXBzZS5qZHQudWkucHJvcGVydHlQYWdlcy5Qcm9ibGVtU2V2ZXJpdGllc1ByZWZlcmVuY2VQYWdlIjsKLQkvLyBTaG91bGQgZXF1YWwgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByb3BlcnR5QW5kUHJlZmVyZW5jZVBhZ2UuREFUQV9OT19MSU5LCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9OT19MSU5LPSAiUHJvcGVydHlBbmRQcmVmZXJlbmNlUGFnZS5ub2xpbmsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFBpeGVsQ29udmVydGVyIGZQaXhlbENvbnZlcnRlcjsKLQlwcml2YXRlIEJ1dHRvbiBmVmFsaWRhdGVGcmFnbWVudHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZk9yaWdpbmFsVmFsaWRhdGVGcmFnbWVudHM7Ci0KLQlwdWJsaWMgSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlCdXR0b24gYyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljLnNldFRleHQodGV4dCk7Ci0JCWMuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuY3JlYXRlKCkpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBwYWdlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlwYWdlLnNldExheW91dChsYXlvdXQpOwotCi0JCWZQaXhlbENvbnZlcnRlciA9IG5ldyBQaXhlbENvbnZlcnRlcihwYXJlbnQpOwotCQkKLQkJR3JvdXAgZmlsZXNHcm91cCA9IG5ldyBHcm91cChwYWdlLCBTV1QuTk9ORSk7Ci0JCWZpbGVzR3JvdXAuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuZ3JhYih0cnVlLCBmYWxzZSkuY3JlYXRlKCkpOwotCQlmaWxlc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlmaWxlc0dyb3VwLnNldFRleHQoSlNQVUlNZXNzYWdlcy5KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzApOwotCQljcmVhdGVGaWxlc1NlY3Rpb24oZmlsZXNHcm91cCk7Ci0KLQkJLy8gc3BhY2VyCi0vLwkJbmV3IExhYmVsKHBhZ2UsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5jcmVhdGUoKSk7Ci0KLQkJR3JvdXAgc2V2ZXJpdGllc0dyb3VwID0gbmV3IEdyb3VwKHBhZ2UsIFNXVC5OT05FKTsKLQkJc2V2ZXJpdGllc0dyb3VwLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmdyYWIodHJ1ZSwgdHJ1ZSkuY3JlYXRlKCkpOwotCQlzZXZlcml0aWVzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXNldmVyaXRpZXNHcm91cC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzApOwotCQlmaW5hbCBDb21wb3NpdGUgY29udGVudCA9IGNyZWF0ZVZhbGlkYXRpb25TZWN0aW9uKHNldmVyaXRpZXNHcm91cCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBmUGl4ZWxDb252ZXJ0ZXIuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZyYWdtZW50R3JvdXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRmlsZXNTZWN0aW9uKEdyb3VwIGZyYWdtZW50R3JvdXApIHsKLQkJZlZhbGlkYXRlRnJhZ21lbnRzID0gY3JlYXRlQ2hlY2tCb3goZnJhZ21lbnRHcm91cCwgSlNQVUlNZXNzYWdlcy5KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZWYWxpZGF0ZUZyYWdtZW50cywgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCQlJU2NvcGVDb250ZXh0W10gY29udGV4dHMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWZPcmlnaW5hbFZhbGlkYXRlRnJhZ21lbnRzID0gY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTLCBjb250ZXh0c1sxXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFURV9GUkFHTUVOVFMsIHRydWUpKTsKLQkJZlZhbGlkYXRlRnJhZ21lbnRzLnNldFNlbGVjdGlvbihmT3JpZ2luYWxWYWxpZGF0ZUZyYWdtZW50cyk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlVmFsaWRhdGlvblNlY3Rpb24oQ29tcG9zaXRlIHBhZ2UpIHsKLQkJaW50IG5Db2x1bW5zID0gMzsKLQotCQlmaW5hbCBTY3JvbGxlZFBhZ2VDb250ZW50IHNwQ29udGVudCA9IG5ldyBTY3JvbGxlZFBhZ2VDb250ZW50KHBhZ2UpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzcENvbnRlbnQuZ2V0Qm9keSgpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQobkNvbHVtbnMsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChKU1BVSU1lc3NhZ2VzLlZhbGlkYXRpb25fZGVzY3JpcHRpb24pOwotCQlkZXNjcmlwdGlvbi5zZXRGb250KHBhZ2UuZ2V0Rm9udCgpKTsKLQotCQlTdHJpbmdbXSBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMgPSBuZXcgU3RyaW5nW117SlNQVUlNZXNzYWdlcy5WYWxpZGF0aW9uX0Vycm9yLCBKU1BVSU1lc3NhZ2VzLlZhbGlkYXRpb25fV2FybmluZywgSlNQVUlNZXNzYWdlcy5WYWxpZGF0aW9uX0lnbm9yZX07Ci0JCUNvbXBvc2l0ZSBzZWN0aW9uOwotCi0JCS8vIGJlZ2luIGRpcmVjdGl2ZXMgc2VjdGlvbgotCQlzZWN0aW9uID0gY3JlYXRlU3R5bGVTZWN0aW9uV2l0aENvbnRlbnRDb21wb3NpdGUoY29tcG9zaXRlLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSEVBREVSX0RJUkVDVElWRSwgbkNvbHVtbnMpOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9VTlJFU09MVkFCTEVfVVJJX09SX1RBR0RJUiwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfVU5SRVNPTFZBQkxFX1VSSV9PUl9UQUdESVIsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19ESUZGRVJFTlRfVVJJUywgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX0RJRkZFUkVOVF9VUklTLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfU0FNRV9VUklTLCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfU0FNRV9VUklTLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1BSRUZJWCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19QUkVGSVgsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfVVJJX09SX1RBR0RJUiwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19VUklfT1JfVEFHRElSLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfRklMRV9OT1RfRk9VTkQsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9GSUxFX05PVF9GT1VORCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX05PX0ZJTEVfU1BFQ0lGSUVELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfTk9fRklMRV9TUEVDSUZJRUQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0vLwkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0RJUkVDVElWRV9QQUdFX1NVUEVSQ0xBU1NfTk9UX0ZPVU5ELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1BBR0VfU1VQRVJDTEFTU19OT1RfRk9VTkQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCS8vIGVuZCBkaXJlY3RpdmVzIHNlY3Rpb24KLQotCQkvLyBiZWdpbiBjdXN0b20gYWN0aW9ucyBzZWN0aW9uCi0JCXNlY3Rpb24gPSBjcmVhdGVTdHlsZVNlY3Rpb25XaXRoQ29udGVudENvbXBvc2l0ZShjb21wb3NpdGUsIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9IRUFERVJfQ1VTVE9NX0FDVElPTlMsIG5Db2x1bW5zKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEUsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX01JU1NJTkdfUkVRVUlSRURfQVRUUklCVVRFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9VTktOT1dOX0FUVFJJQlVURSwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfVU5LTk9XTl9BVFRSSUJVVEUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX05PTl9FTVBUWV9JTkxJTkVfVEFHLCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9OT05fRU1QVFlfSU5MSU5FX1RBRywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9WQUxJREFUSU9OX01FU1NBR0UsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfVkFMSURBVElPTl9NRVNTQUdFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9GT1VORCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfRk9VTkQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0lOU1RBTlRJQVRFRCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfSU5TVEFOVElBVEVELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX1JVTlRJTUVfRVhDRVBUSU9OLCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX1JVTlRJTUVfRVhDRVBUSU9OLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEFHX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5ELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEFHX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5ELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQkvLyBlbmQgY3VzdG9tIGFjdGlvbnMgc2VjdGlvbgotCi0JCS8vIGJlZ2luIHN0YW5kYXJkIGFjdGlvbnMgc2VjdGlvbgotCQlzZWN0aW9uID0gY3JlYXRlU3R5bGVTZWN0aW9uV2l0aENvbnRlbnRDb21wb3NpdGUoY29tcG9zaXRlLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSEVBREVSX1NUQU5EQVJEX0FDVElPTlMsIG5Db2x1bW5zKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fSU5WQUxJRF9JRCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fSU5WQUxJRF9JRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTQkVBTl9NSVNTSU5HX1RZUEVfSU5GTywgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTQkVBTl9NSVNTSU5HX1RZUEVfSU5GTywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fQU1CSUdVT1VTX1RZUEVfSU5GTywgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTRUJFQU5fQU1CSUdVT1VTX1RZUEVfSU5GTywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJLy8gZW5kIHN0YW5kYXJkIGFjdGlvbnMgc2VjdGlvbgotCi0JCS8vIGJlZ2luIEphdmEgc2V2ZXJpdHkgb3ZlcnJpZGUgc2VjdGlvbgotCQlzZWN0aW9uID0gY3JlYXRlU3R5bGVTZWN0aW9uV2l0aENvbnRlbnRDb21wb3NpdGUoY29tcG9zaXRlLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSEVBREVSX0pBVkEsIG5Db2x1bW5zKTsKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0JCQluZXcgUHJlZmVyZW5jZUxpbmtBcmVhKHNlY3Rpb24sIFNXVC5XUkFQIHwgU1dULk1VTFRJIHwgU1dULkxFRlRfVE9fUklHSFQsIEpBVkFfU0VWRVJJVFlfUFJFRkVSRU5DRV9QQUdFLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSkFWQV9OT1RJQ0UsIChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIG51bGwpLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5zcGFuKDIsIDEpLmluZGVudCgwLCAwKS5oaW50KDE1MCwgU1dULkRFRkFVTFQpLmNyZWF0ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCU1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJCWRhdGEucHV0KERBVEFfTk9fTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJCW5ldyBQcmVmZXJlbmNlTGlua0FyZWEoc2VjdGlvbiwgU1dULldSQVAgfCBTV1QuTVVMVEkgfCBTV1QuTEVGVF9UT19SSUdIVCwgSkFWQV9TRVZFUklUWV9QUk9QRVJUWV9QQUdFLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSkFWQV9OT1RJQ0UsIChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIGRhdGEpLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5zcGFuKDIsIDEpLmluZGVudCgwLCAwKS5oaW50KDE1MCwgU1dULkRFRkFVTFQpLmNyZWF0ZSgpKTsKLQkJCS8vIG9wZW4gaW4gc2FtZSBzaGVsbD8KLQkJCS8vIFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcm9wZXJ0eURpYWxvZ09uKGdldFNoZWxsKCksIGdldFByb2plY3QoKSwgSkFWQV9TRVZFUklUWV9QUk9QRVJUWV9QQUdFLCBuZXcgU3RyaW5nW10geyBKQVZBX1NFVkVSSVRZX1BST1BFUlRZX1BBR0UgfSwgZGF0YSkub3BlbigpOwotCQl9Ci0JCWludCBzZWN0aW9uSW5kZW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIpOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSkFWQV9MT0NBTF9WQVJJQUJMRV9ORVZFUl9VU0VELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fSkFWQV9MT0NBTF9WQVJJQUJMRV9ORVZFUl9VU0VELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIHNlY3Rpb25JbmRlbnQpOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSkFWQV9BUkdVTUVOVF9JU19ORVZFUl9VU0VELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fSkFWQV9BUkdVTUVOVF9JU19ORVZFUl9VU0VELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIHNlY3Rpb25JbmRlbnQpOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSkFWQV9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRSwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgc2VjdGlvbkluZGVudCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRSwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfUE9URU5USUFMX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIHNlY3Rpb25JbmRlbnQpOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSkFWQV9VTlVTRURfSU1QT1JULCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fSkFWQV9VTlVTRURfSU1QT1JULCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIHNlY3Rpb25JbmRlbnQpOwotCQkvLyBlbmQgSmF2YSBzZXZlcml0eSBvdmVycmlkZSBzZWN0aW9uCi0KLQkJLy8gYmVnaW4gRUwgc2VjdGlvbgotCQlzZWN0aW9uID0gY3JlYXRlU3R5bGVTZWN0aW9uV2l0aENvbnRlbnRDb21wb3NpdGUoY29tcG9zaXRlLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSEVBREVSX0VMLCBuQ29sdW1ucyk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9FTF9TWU5UQVgsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9FTF9TWU5UQVgsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9FTF9MRVhFUiwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0VMX0xFWEVSLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQkvLyBlbmQgRUwgc2VjdGlvbgotCi0JCXJlc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKGdldERpYWxvZ1NldHRpbmdzKCkuZ2V0U2VjdGlvbihTRVRUSU5HU19TRUNUSU9OX05BTUUpKTsKLQotCQlyZXR1cm4gc3BDb250ZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhnZXREaWFsb2dTZXR0aW5ncygpLmFkZE5ld1NlY3Rpb24oU0VUVElOR1NfU0VDVElPTl9OQU1FKSk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpIHsKLQkJcmV0dXJuIFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMudmFsaWRhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkgewotCQlyZXR1cm4gSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1VTRV9QUk9KRUNUX1NFVFRJTkdTOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlQYWdlSUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm9wZXJ0eVBhZ2UucHJvamVjdC52YWxpZGF0aW9uIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcmVzZXRTZXZlcml0aWVzKCk7Ci0KLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0Q29udGV4dCA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQlib29sZWFuIHZhbGlkYXRlRnJhZ21lbnRzID0gZGVmYXVsdENvbnRleHQuZ2V0Qm9vbGVhbihKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgdHJ1ZSk7Ci0JCWZWYWxpZGF0ZUZyYWdtZW50cy5zZXRTZWxlY3Rpb24odmFsaWRhdGVGcmFnbWVudHMpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFNldHRpbmdzUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSZXZhbGlkYXRlT25TZXR0aW5nc0NoYW5nZSgpIHsKLQkJcmV0dXJuIGZPcmlnaW5hbFZhbGlkYXRlRnJhZ21lbnRzICE9IGZWYWxpZGF0ZUZyYWdtZW50cy5nZXRTZWxlY3Rpb24oKSB8fCBzdXBlci5zaG91bGRSZXZhbGlkYXRlT25TZXR0aW5nc0NoYW5nZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2Ujc3RvcmVWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdXBlci5zdG9yZVZhbHVlcygpOwotCi0JCUlTY29wZUNvbnRleHRbXSBjb250ZXh0cyA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKTsKLQkJYm9vbGVhbiB2YWxpZGF0ZUZyYWdtZW50cyA9IGZWYWxpZGF0ZUZyYWdtZW50cy5nZXRTZWxlY3Rpb24oKTsKLQkJY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTLCB2YWxpZGF0ZUZyYWdtZW50cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYTU4ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb250YWlucyBhIHNldCBvZiBwcm9qZWN0aW9uIG1vZGVsIGFkZGl0aW9ucy9kZWxldGlvbnMvbW9kaWZpY2F0aW9ucwotICovCi1jbGFzcyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JcHJpdmF0ZSBOb2RlIGZOb2RlOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZEZWxldGlvbnM7Ci0JcHJpdmF0ZSBNYXAgZkFkZGl0aW9uczsKLQlwcml2YXRlIEFubm90YXRpb25bXSBmTW9kaWZpY2F0aW9uczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZkRlbGV0aW9ucyA9IGRlbGV0aW9uczsKLQkJZkFkZGl0aW9ucyA9IGFkZGl0aW9uczsKLQkJZk1vZGlmaWNhdGlvbnMgPSBtb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0QWRkaXRpb25zKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlbGV0aW9ucygpIHsKLQkJcmV0dXJuIGZEZWxldGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRNb2RpZmljYXRpb25zKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzMmE4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRvbSBUdXJyZWxsLUNyb2Z0LCBsZWZ0QHVsdHJhc2lzLmNvbSAtIFsxNzQzMDddIEVuYWJsZSBmb2xkaW5nIGZvciBkaXYgdGFncyBpbiBKU1AgYW5kIEhUTUwgZmlsZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uCi0JICogbW9kZWwgbm9kZSBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZQcm9qZWN0aW9uVmlld2VyczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJc3VwZXIoYWRhcHRlcktleSk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoKSB7Ci0JCXRoaXMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3R1YWxseSBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSBwYXJlbnQgb2YgdGFyZ2V0IGlmIHRhcmdldCBpcyB0aGUKLQkgKiAiYWRhcHQtYWJsZSIgbm9kZQotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAoKGlzQWN0aXZlKCkpICYmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSAmJiAoKE5vZGUpIHRhcmdldCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLQkJCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSkgewotCi0JCQkJLy8gYWN0dWFsbHkgd29yayB3aXRoIHRoZSBwYXJlbnQgbm9kZSB0byBsaXN0ZW4gZm9yIGFkZCwKLQkJCQkvLyBkZWxldGUgZXZlbnRzCi0JCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQlJTm9kZU5vdGlmaWVyIHBhcmVudE5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHBhcmVudDsKLQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIHBhcmVudEFkYXB0ZXIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKSBwYXJlbnROb3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCQkJaWYgKHBhcmVudEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQkJLy8gY3JlYXRlIGEgbmV3IGFkYXB0ZXIgZm9yIHBhcmVudAotCQkJCQkJcGFyZW50QWRhcHRlciA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwodGhpcyk7Ci0JCQkJCQlwYXJlbnROb3RpZmllci5hZGRBZGFwdGVyKHBhcmVudEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJCS8vIGNhbGwgdXBkYXRlIG9uIHBhcmVudCBiZWNhdXNlIGEgbmV3IG5vZGUgaGFzIGp1c3QgYmVlbgotCQkJCQkvLyBhZGRlZAotCQkJCQlwYXJlbnRBZGFwdGVyLnVwZGF0ZUFkYXB0ZXIocGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBhIG5vZGUgdHlwZSBhYmxlIHRvIGZvbGQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG5vZGUgaXMgcHJvamVjdGFibGUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gaXNOb2RlUHJvamVjdGFibGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJLy8gbm9kZSBpcyBvbmx5IHByb2plY3RhYmxlIGlmIGl0IGlzIGhlYWQsIGJvZHksIHNjcmlwdCwgc3R5bGUsCi0JCQkvLyB0YWJsZSwgdWwsIG9sIGFuZCBkaXYgdGFncwotCQkJaWYgKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFkuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBULmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJVi5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZhY3RvcnkgaXMgY3VycmVudGx5IGFjdGl2ZWx5IG1hbmFnaW5nIHByb2plY3Rpb24KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCAmJiAhZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgaWYgZG9jdW1lbnQgaXMgbm90IGluIGZsdXguCi0JICogT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZCB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRlbGV0aW9ucwotCSAqIEBwYXJhbSBhZGRpdGlvbnMKLQkgKiBAcGFyYW0gbW9kaWZpY2F0aW9ucwotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMpIHsKLQkJcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIGRlbGV0aW9ucywgYWRkaXRpb25zLCBtb2RpZmljYXRpb25zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0aW9uIHZpZXdlciBpZgotCSAqIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkCi0JICogd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucywgUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gY3JlYXRlIGEgY2hhbmdlIG9iamVjdCBmb3IgbGF0ZXN0IGNoYW5nZSBhbmQgYWRkIHRvIHF1ZXVlCi0JCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSA9IG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucyk7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMuZ2V0KHZpZXdlcik7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlpbmZvLnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGluZm9zLm5leHQoKTsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBnbyB0aHJvdWdoIGV2ZXJ5IHByb2plY3Rpb252aWV3ZXIgYW5kIGNhbGwKLQkJLy8gcmVtb3ZlUHJvamVjdGlvblZpZXdlcih2aWV3ZXIpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaW5mb3MuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQkJaW5mb3MucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHZpZXdlciB0byBsaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyB0aGlzIGZhY3RvcnkgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdmlld2VyJ3MgZG9jdW1lbnQgYW5kIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCSAqICAgICAgICAgICAgYXJlIG5vdCBudWxsCi0JICovCi0Jdm9pZCBhZGRQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHJlbW92ZSBvbGQgZW50cnkgaWYgaXQgZXhpc3RzCi0JCXJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzID09IG51bGwpIHsKLQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgbmV3IG9iamVjdCBjb250YWluaW5nIHByb2plY3Rpb24gdmlld2VyIGFuZCBpdHMgaW5mbwotCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IG5ldyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24odmlld2VyKTsKLQkJZlByb2plY3Rpb25WaWV3ZXJzLnB1dCh2aWV3ZXIsIGluZm8pOwotCQlpbmZvLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiB2aWV3ZXIgZnJvbSB0aGUgbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcwotCSAqIGZhY3RvciBpcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCByZW1vdmVQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCBvZiB2aWV3ZXJzCi0JCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGZQcm9qZWN0aW9uVmlld2Vycy5yZW1vdmUodmlld2VyKTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlpbmZvLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCS8vIGlmIHJlbW92aW5nIGxhc3QgcHJvamVjdGlvbiB2aWV3ZXIsIGNsZWFyIG91dCBldmVyeXRoaW5nCi0JCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSkgewotCQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjJmODlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgZXh0ZW5kcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIHsKLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQKCkgewotCQl0aGlzKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUChPYmplY3QgYWRhcHRlcktleSkgewotCQlzdXBlcihhZGFwdGVyS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBBY3R1YWxseSBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSBwYXJlbnQgb2YgdGFyZ2V0IGlmIHRhcmdldCBpcyB0aGUKLQkgKiAiYWRhcHQtYWJsZSIgbm9kZQotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAoKGlzQWN0aXZlKCkpICYmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSAmJiAoKE5vZGUpIHRhcmdldCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLQkJCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSkgewotCi0JCQkJLy8gYWN0dWFsbHkgd29yayB3aXRoIHRoZSBwYXJlbnQgbm9kZSB0byBsaXN0ZW4gZm9yIGFkZCwKLQkJCQkvLyBkZWxldGUgZXZlbnRzCi0JCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQlJTm9kZU5vdGlmaWVyIHBhcmVudE5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHBhcmVudDsKLQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AgcGFyZW50QWRhcHRlciA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUCkgcGFyZW50Tm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKTsKLQkJCQkJaWYgKHBhcmVudEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQkJLy8gY3JlYXRlIGEgbmV3IGFkYXB0ZXIgZm9yIHBhcmVudAotCQkJCQkJcGFyZW50QWRhcHRlciA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUCh0aGlzKTsKLQkJCQkJCXBhcmVudE5vdGlmaWVyLmFkZEFkYXB0ZXIocGFyZW50QWRhcHRlcik7Ci0JCQkJCX0KLQkJCQkJLy8gY2FsbCB1cGRhdGUgb24gcGFyZW50IGJlY2F1c2UgYSBuZXcgbm9kZSBoYXMganVzdCBiZWVuCi0JCQkJCS8vIGFkZGVkCi0JCQkJCXBhcmVudEFkYXB0ZXIudXBkYXRlQWRhcHRlcihwYXJlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGEgbm9kZSB0eXBlIGFibGUgdG8gZm9sZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgbm9kZSBpcyBwcm9qZWN0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc05vZGVQcm9qZWN0YWJsZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkvLyBub2RlIGlzIG9ubHkgcHJvamVjdGFibGUgaWYgaXQgaXMganNwIHNjcmlwdGxldCB0YWcKLQkJCWlmIChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFRMRVQuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmNDNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCB3aXRoIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgZm9yIHRoaXMKLSAqIGFkYXB0ZXIgbm9kZSdzIGNoaWxkcmVuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQcm9qZWN0aW9uUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS9wcm9qZWN0aW9ucGVyZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIGNsYXNzIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4dGVuZHMgUHJvamVjdGlvbkFubm90YXRpb24gewotCQlwcml2YXRlIGJvb2xlYW4gZklzVmlzaWJsZSA9IGZhbHNlOyAvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQlwcml2YXRlIE5vZGUgZk5vZGU7Ci0KLQkJcHVibGljIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKE5vZGUgbm9kZSwgYm9vbGVhbiBpc0NvbGxhcHNlZCkgewotCQkJc3VwZXIoaXNDb2xsYXBzZWQpOwotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBmTm9kZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKSB7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCX0KLQotCQkvKioKLQkJICogRG9lcyBub3QgcGFpbnQgaGlkZGVuIGFubm90YXRpb25zLiBBbm5vdGF0aW9ucyBhcmUgaGlkZGVuIHdoZW4gdGhleQotCQkgKiBvbmx5IHNwYW4gb25lIGxpbmUuCi0JCSAqIAotCQkgKiBAc2VlIFByb2plY3Rpb25Bbm5vdGF0aW9uI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywKLQkJICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXMsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBDYW52YXMgY2FudmFzLCBSZWN0YW5nbGUgcmVjdGFuZ2xlKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLyoKLQkJCSAqIG9ubHkgbmVlZCB0byBjaGVjayBhbm5vdGF0aW9ucyB0aGF0IGFyZSBleHBhbmRlZCBiZWNhdXNlIGhpZGRlbgotCQkJICogYW5ub3RhdGlvbnMgc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiBnaXZlbiB0aGUgY2hhbmNlIHRvCi0JCQkgKiBjb2xsYXBzZS4KLQkJCSAqLwotCQkJaWYgKCFpc0NvbGxhcHNlZCgpKSB7Ci0JCQkJLy8gd29ya2luZyB3aXRoIHJlY3RhbmdsZSwgc28gbGluZSBoZWlnaHQKLQkJCQlGb250TWV0cmljcyBtZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJCQlpZiAobWV0cmljcyAhPSBudWxsKSB7Ci0JCQkJCS8vIGRvIG5vdCBkcmF3IGFubm90YXRpb25zIHRoYXQgb25seSBzcGFuIG9uZSBsaW5lIGFuZAotCQkJCQkvLyBtYXJrIHRoZW0gYXMgbm90IHZpc2libGUKLQkJCQkJaWYgKChyZWN0YW5nbGUuaGVpZ2h0IC8gbWV0cmljcy5nZXRIZWlnaHQoKSkgPD0gMSkgewotCQkJCQkJZklzVmlzaWJsZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZklzVmlzaWJsZSA9IHRydWU7Ci0JCQlzdXBlci5wYWludChnYywgY2FudmFzLCByZWN0YW5nbGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uI21hcmtDb2xsYXBzZWQoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbWFya0NvbGxhcHNlZCgpIHsKLQkJCS8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCQkvLyBkbyBub3QgbWFyayBjb2xsYXBzZWQgaWYgYW5ub3RhdGlvbiBpcyBub3QgdmlzaWJsZQotCQkJaWYgKGZJc1Zpc2libGUpCi0JCQkJc3VwZXIubWFya0NvbGxhcHNlZCgpOwotCQl9Ci0JfQotCi0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGZBZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIE1hcCBmVGFnQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGZhY3RvcnkpIHsKLQkJZkFkYXB0ZXJGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcm9qZWN0aW9uIHBvc2l0aW9uIGZyb20gdGhlIGdpdmVuIG5vZGUuIEFibGUgdG8gZ2V0Ci0JICogcHJvamVjdGlvbiBwb3NpdGlvbiBpZiBub2RlIGlzTm9kZVByb2plY3RhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBudWxsIGlmIG5vIHByb2plY3Rpb24gcG9zaXRpb24gcG9zc2libGUsIGEgUG9zaXRpb24gb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBQb3NpdGlvbiBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24oTm9kZSBub2RlKSB7Ci0JCVBvc2l0aW9uIHBvcyA9IG51bGw7Ci0JCWlmIChmQWRhcHRlckZhY3RvcnkuaXNOb2RlUHJvamVjdGFibGUobm9kZSkgJiYgbm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCS8vIElEb2N1bWVudCBkb2N1bWVudCA9Ci0JCQkvLyBmQWRhcHRlckZhY3RvcnkuZ2V0UHJvamVjdGlvblZpZXdlcigpLmdldERvY3VtZW50KCk7Ci0JCQkvLyBpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSW5kZXhlZFJlZ2lvbiBpbm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQkJaW50IHN0YXJ0ID0gaW5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBlbmQgPSBpbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChzdGFydCA+PSAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQkJLy8gcmVnaW9uLWJhc2VkCi0JCQkJLy8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IG5vIHJlZ2lvbgotCQkJCS8vIGluY3JlYXNlIHdoZW4gYWRkIG5ld2xpbmUKLQkJCQlwb3MgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCQkvLyB0cnkgewotCQkJCS8vIC8vIGxpbmUtYmFzZWQKLQkJCQkvLyAvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uCi0JCQkJLy8gLy8gaW5jcmVhc2Ugd2hlbiBhZGQgbmV3bGluZQotCQkJCS8vIElSZWdpb24gc3RhcnRMaW5lUmVnaW9uID0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gSVJlZ2lvbiBlbmRMaW5lUmVnaW9uID0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChlbmQpOwotCQkJCS8vIGludCBzdGFydE9mZnNldCA9IHN0YXJ0TGluZVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkvLyBpbnQgZW5kT2Zmc2V0ID0gZW5kTGluZVJlZ2lvbi5nZXRPZmZzZXQoKSArCi0JCQkJLy8gZW5kTGluZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkvLyBpZiAoZW5kT2Zmc2V0ID4gc3RhcnRPZmZzZXQpIHsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24oc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtCi0JCQkJLy8gc3RhcnRPZmZzZXQpOwotCQkJCS8vIH0KLQkJCQkvLwotCQkJCS8vIC8vIGxpbmUtYmFzZWQKLQkJCQkvLyAvLyBubyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgcmVnaW9uIGluY3JlYXNlCi0JCQkJLy8gLy8gd2hlbiBhZGQgbmV3bGluZQotCQkJCS8vIGludCBzdGFydExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJCS8vIGludCBlbmRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGVuZCk7Ci0JCQkJLy8gaWYgKGVuZExpbmUgKyAxIDwgZG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpKSB7Ci0JCQkJLy8gaW50IG9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoc3RhcnRMaW5lKTsKLQkJCQkvLyBpbnQgZW5kT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChlbmRMaW5lICsgMSk7Ci0JCQkJLy8gcG9zID0gbmV3IFBvc2l0aW9uKG9mZnNldCwgZW5kT2Zmc2V0IC0gb2Zmc2V0KTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgbnVsbCwgeCk7Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0JCS8vIH0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGZvciBub2RlIGluIHRoZSBjdXJyZW50IGxpc3Qgb2YgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb25zIGZvciB0aGlzIGFkYXB0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gVGFnUHJvamVjdGlvbkFubm90YXRpb24KLQkgKi8KLQlwcml2YXRlIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGdldEV4aXN0aW5nQW5ub3RhdGlvbihOb2RlIG5vZGUpIHsKLQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gYW5ubyA9IG51bGw7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmICghZlRhZ0Fubm90YXRpb25zLmlzRW1wdHkoKSkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gZlRhZ0Fubm90YXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpICYmIGFubm8gPT0gbnVsbCkgewotCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGEgPSAoVGFnUHJvamVjdGlvbkFubm90YXRpb24pIGl0Lm5leHQoKTsKLQkJCQlOb2RlIG4gPSBhLmdldE5vZGUoKTsKLQkJCQlpZiAobm9kZS5lcXVhbHMobikpIHsKLQkJCQkJYW5ubyA9IGE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhbm5vOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBjaGVjayBpZiBmb2xkaW5nIGlzIGV2ZW4gZW5hYmxlZCwgaWYgbm90LCBqdXN0IGlnbm9yZSBub3RpZnlDaGFuZ2VkCi0JCS8vIGV2ZW50cwotCQlpZiAoIWZBZGFwdGVyRmFjdG9yeS5pc0FjdGl2ZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEKSAmJiAobm90aWZpZXIgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJdXBkYXRlQWRhcHRlcigoTm9kZSkgbm90aWZpZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihOb2RlIG5vZGUpIHsKLQkJdXBkYXRlQWRhcHRlcihub2RlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBvZiBhbGwgdGhlIG5vZGVzIHRoYXQgYXJlIGNoaWxkcmVuIG9mCi0JICogbm9kZSBhbmQgYWRkcyBhbGwgcHJvamVjdGlvbiBhbm5vdGF0aW9ucyB0byB2aWV3ZXIgKGZvciBuZXdseSBhZGRlZAotCSAqIHZpZXdlcnMpCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCB1cGRhdGVBZGFwdGVyKE5vZGUgbm9kZSwgUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCU1hcCBhZGRpdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgcHJvamVjdGlvbkFubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBnbyB0aHJvdWdoIGltbWVkaWF0ZSBjaGlsZCBub2RlcyBhbmQgZmlndXJlIG91dCBwcm9qZWN0aW9uCi0JCS8vIG1vZGVsIGFubm90YXRpb25zCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQlQb3NpdGlvbiBuZXdQb3MgPSBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24oY2hpbGROb2RlKTsKLQkJCQlpZiAobmV3UG9zICE9IG51bGwpIHsKLQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IG5ldyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihjaGlsZE5vZGUsIGZhbHNlKTsKLQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gZXhpc3RpbmcgPSBnZXRFeGlzdGluZ0Fubm90YXRpb24oY2hpbGROb2RlKTsKLQkJCQkJaWYgKGV4aXN0aW5nID09IG51bGwpIHsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbGwgYW5ub3RhdGlvbnMgZm9yIHRoaXMKLQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCXByb2plY3Rpb25Bbm5vdGF0aW9ucy5wdXQobmV3QW5ub3RhdGlvbiwgbmV3UG9zKTsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBhZGQKLQkJCQkJCWFkZGl0aW9ucy5wdXQobmV3QW5ub3RhdGlvbiwgbmV3UG9zKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbGwgYW5ub3RhdGlvbnMgZm9yIHRoaXMKLQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCXByb2plY3Rpb25Bbm5vdGF0aW9ucy5wdXQoZXhpc3RpbmcsIG5ld1Bvcyk7Ci0JCQkJCQkvLyByZW1vdmUgZnJvbSBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBkZWxldGUKLQkJCQkJCWZUYWdBbm5vdGF0aW9ucy5yZW1vdmUoZXhpc3RpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCi0JCQkvLyBpbiB0aGUgZW5kLCB3YW50IHRvIGRlbGV0ZSBhbnl0aGluZyBsZWZ0b3ZlciBpbiBvbGQgbGlzdCwgYWRkCi0JCQkvLyBldmVyeXRoaW5nIGluIGFkZGl0aW9ucywgYW5kIHVwZGF0ZSBldmVyeXRoaW5nIGluCi0JCQkvLyBwcm9qZWN0aW9uQW5ub3RhdGlvbnMKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uW10gb2xkTGlzdCA9IG51bGw7Ci0JCQlpZiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlvbGRMaXN0ID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uW10pIGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvblswXSk7Ci0JCQl9Ci0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbltdIG1vZGlmeUxpc3QgPSBudWxsOwotCQkJaWYgKCFwcm9qZWN0aW9uQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJbW9kaWZ5TGlzdCA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbltdKSBwcm9qZWN0aW9uQW5ub3RhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgUHJvamVjdGlvbkFubm90YXRpb25bMF0pOwotCQkJfQotCi0JCQkvLyBzcGVjaWZpY2FsbHkgYWRkIGFsbCBhbm5vdGF0aW9ucyB0byB2aWV3ZXIKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiAhcHJvamVjdGlvbkFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCWZBZGFwdGVyRmFjdG9yeS5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgbnVsbCwgcHJvamVjdGlvbkFubm90YXRpb25zLCBudWxsLCB2aWV3ZXIpOwotCQkJfQotCi0JCQkvLyBvbmx5IHVwZGF0ZSB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyB0byB1cGRhdGUKLQkJCWlmICgob2xkTGlzdCAhPSBudWxsICYmIG9sZExpc3QubGVuZ3RoID4gMCkgfHwgKCFhZGRpdGlvbnMuaXNFbXB0eSgpKSB8fCAobW9kaWZ5TGlzdCAhPSBudWxsICYmIG1vZGlmeUxpc3QubGVuZ3RoID4gMCkpCi0JCQkJZkFkYXB0ZXJGYWN0b3J5LnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBvbGRMaXN0LCBhZGRpdGlvbnMsIG1vZGlmeUxpc3QpOwotCQl9Ci0KLQkJLy8gc2F2ZSBuZXcgbGlzdCBvZiBhbm5vdGF0aW9ucwotCQlmVGFnQW5ub3RhdGlvbnMgPSBwcm9qZWN0aW9uQW5ub3RhdGlvbnM7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlICE9IG51bGwgPyBub2RlLmdldE5vZGVOYW1lKCkgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLnVwZGF0ZUFkYXB0ZXIgKCIgKyBub2RlTmFtZSArICIpOiIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NTM2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLS8qKgotICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgd2l0aCBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciB0aGlzCi0gKiBhZGFwdGVyIG5vZGUncyBjaGlsZHJlbgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AgZXh0ZW5kcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwgewotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgZmFjdG9yeSkgewotCQlzdXBlcihmYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmODRkMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2plY3Rpb24gdmlld2VyIGFuZCBhbHNvIG1hbmFnZXMgdXBkYXRpbmcKLSAqIHRoZSB2aWV3ZXIncyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLSAqLwotY2xhc3MgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQotCS8qKgotCSAqIExpc3RlbnMgdG8gZG9jdW1lbnQgdG8gYmUgYXdhcmUgb2Ygd2hlbiB0byB1cGRhdGUgdGhlIHByb2plY3Rpb24KLQkgKiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRG9jdW1lbnRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudExpc3RlbmVyIHsKLQkJcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gZkluZm87Ci0KLQkJcHVibGljIERvY3VtZW50TGlzdGVuZXIoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGZJbmZvLmdldERvY3VtZW50KCkgPT0gZG9jdW1lbnQpIHsKLQkJCQlmSW5mby5zZXRJc0RvY3VtZW50Q2hhbmdpbmcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJLy8gcmVnaXN0ZXIgYSBwb3N0IG5vdGlmaWNhdGlvbiByZXBsYWNlIHNvIHRoYXQgcHJvamVjdGlvbgotCQkJLy8gYW5ub3RhdGlvbiBtb2RlbCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgYWxsIGRvY3VtZW50Q2hhbmdlZAotCQkJLy8gbGlzdGVuZXJzIGhhdmUgYmVlbiBub3RpZmllZAotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbiAmJiBmSW5mby5nZXREb2N1bWVudCgpID09IGRvY3VtZW50KSB7Ci0JCQkJaWYgKGZJbmZvLmhhc0NoYW5nZXNRdWV1ZWQoKSkKLQkJCQkJKChJRG9jdW1lbnRFeHRlbnNpb24pIGRvY3VtZW50KS5yZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKHRoaXMsIG5ldyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkluZm8pKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVzc2VudGlhbGx5IGEgcG9zdCBkb2N1bWVudCBjaGFuZ2VkIGxpc3RlbmVyIGJlY2F1c2UgaXQgaXMgY2FsbGVkIGFmdGVyCi0JICogZG9jdW1lbnRjaGFuZ2VkIGhhcyBiZWVuIGZpcmVkLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHsKLQkJcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gZkluZm87Ci0KLQkJcHVibGljIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGVyZm9ybShJRG9jdW1lbnQgZG9jdW1lbnQsIElEb2N1bWVudExpc3RlbmVyIG93bmVyKSB7Ci0JCQlmSW5mby5hcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY3VycmVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uCi0JICogdmlld2VyCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsIGZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsOwotCS8qKgotCSAqIERvY3VtZW50IGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uIHZpZXdlcgotCSAqLwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQkvKioKLQkgKiBMaXN0ZW5lciB0byBmUHJvamVjdGlvblZpZXdlcidzIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBmRG9jdW1lbnRMaXN0ZW5lcjsKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZG9jdW1lbnQgaXMgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmSXNEb2N1bWVudENoYW5naW5nID0gZmFsc2U7Ci0JLyoqCi0JICogTGlzdCBvZiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0aGF0IG5lZWQgdG8gYmUgYXBwbGllZAotCSAqLwotCXByaXZhdGUgTGlzdCBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWZEb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCA9IHZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCk7Ci0JfQotCi0JSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpIHsKLQkJaWYgKGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9PSBudWxsKSB7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlczsKLQl9Ci0KLQl2b2lkIHNldElzRG9jdW1lbnRDaGFuZ2luZyhib29sZWFuIGNoYW5naW5nKSB7Ci0JCWZJc0RvY3VtZW50Q2hhbmdpbmcgPSBjaGFuZ2luZzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudENoYW5naW5nKCkgewotCQlyZXR1cm4gZklzRG9jdW1lbnRDaGFuZ2luZzsKLQl9Ci0KLQkvKioKLQkgKiBBcHBsaWVzIHRoZSBwZW5kaW5nIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjaGFuZ2VzIHRvIHRoZQotCSAqIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQl2b2lkIGFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpIHsKLQkJTGlzdCBxdWV1ZWRDaGFuZ2VzID0gZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKTsKLQkJLy8gZ28gdGhyb3VnaCBhbGwgdGhlIHBlbmRpbmcgYW5ub3RhdGlvbiBjaGFuZ2VzIGFuZCBhcHBseQotCQkvLyB0aGVtIHRvCi0JCS8vIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkJd2hpbGUgKCFxdWV1ZWRDaGFuZ2VzLmlzRW1wdHkoKSkgewotCQkJUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgY2hhbmdlcyA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcykgcXVldWVkQ2hhbmdlcy5yZW1vdmUoMCk7Ci0JCQl0cnkgewotCQkJCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsLm1vZGlmeUFubm90YXRpb25zKGNoYW5nZXMuZ2V0RGVsZXRpb25zKCksIGNoYW5nZXMuZ2V0QWRkaXRpb25zKCksIGNoYW5nZXMuZ2V0TW9kaWZpY2F0aW9ucygpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGxvZyBpdCBiZSBjb250aW51ZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW5ub3RhdGlvbiBjaGFuZ2VzIHF1ZXVlZCB1cCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNDaGFuZ2VzUXVldWVkKCkgewotCQlyZXR1cm4gIWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgbmV3Q2hhbmdlKSB7Ci0JCS8qCi0JCSAqIGZ1dHVyZV9UT0RPOiBtYXliZSBpbXByb3ZlIGJ5IGNoZWNraW5nIGlmIGFubm90YXRpb24gcHJvamVjdGlvbgotCQkgKiBtb2RlbCBjaGFuZ2UgYWxyZWFkeSBleGlzdHMgZm9yIG5vZGUuIGlmIHNvLCB0aHJvdyBvdXQgb2xkIGNoYW5nZS4KLQkJICovCi0JCWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuYWRkKG5ld0NoYW5nZSk7Ci0KLQkJLy8gaWYgZG9jdW1lbnQgaXNuJ3QgY2hhbmdpbmcsIGdvIGFoZWFkIGFuZCBhcHBseSBpdAotCQlpZiAoIWlzRG9jdW1lbnRDaGFuZ2luZygpKSB7Ci0JCQlhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGFkZCBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlnZXREb2N1bWVudCgpLmFkZERvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIHJlbW92ZSBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZ2V0RG9jdW1lbnQoKS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBsaXN0IG9mIHF1ZXVlZCBjaGFuZ2VzIHNpbmNlIGl0IG1heSBubyBsb25nZXIKLQkJLy8gYmUgYWNjdXJhdGUKLQkJaWYgKGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyAhPSBudWxsKSB7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMuY2xlYXIoKTsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyMDhjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHRoZSBwcm9qZWN0aW9uIG1vZGVsIG9mIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgSlNQLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIsIElQcm9qZWN0aW9uTGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkvKioKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBjaGlsZCBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvciBwZXJmb3JtYW5jZQotCSAqIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0NISUxEUkVOID0gMTA7Ci0JLyoqCi0JICogTWF4aW11bSBudW1iZXIgb2Ygc2libGluZyBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvcgotCSAqIHBlcmZvcm1hbmNlIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NJQkxJTkdTID0gMTAwMDsKLQotCS8qKgotCSAqIEFkZHMgYW4gYWRhcHRlciB0byBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBjaGlsZExldmVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihOb2RlIG5vZGUsIGludCBjaGlsZExldmVsKSB7Ci0JCS8vIHN0b3AgYWRkaW5nIGluaXRpYWwgYWRhcHRlcnMgTUFYX0NISUxEUkVOIGxldmVscyBkZWVwIGZvcgotCQkvLyBwZXJmb3JtYW5jZSBzYWtlCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllciAmJiBjaGlsZExldmVsIDwgTUFYX0NISUxEUkVOKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0KLQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBhZGFwdGVyIGZvciB0aGUgY3VycmVudCBub2RlIGFuZCB1cGRhdGUgdGhlCi0JCQkvLyBhZGFwdGVyIHdpdGggcHJvamVjdGlvbiBpbmZvcm1hdGlvbgotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AgYWRhcHRlciA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUCkgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnVwZGF0ZUFkYXB0ZXIobm9kZSwgZlZpZXdlcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBqdXN0IGNhbGwgZ2V0YWRhcHRlciBzbyB0aGUgYWRhcHRlciBpcyBjcmVhdGVkIGFuZAotCQkJCS8vIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZWQKLQkJCQlub3RpZmllci5nZXRBZGFwdGVyRm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKTsKLQkJCX0KLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCBhZGFwdGVyMiA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyMi51cGRhdGVBZGFwdGVyKG5vZGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCBjYWxsIGdldGFkYXB0ZXIgc28gdGhlIGFkYXB0ZXIgaXMgY3JlYXRlZCBhbmQKLQkJCQkvLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkCi0JCQkJbm90aWZpZXIuZ2V0QWRhcHRlckZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJfQotCQkJaW50IHNpYmxpbmdMZXZlbCA9IDA7Ci0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsICYmIHNpYmxpbmdMZXZlbCA8IE1BWF9TSUJMSU5HUykgewotCQkJCU5vZGUgY2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGNoaWxkTm9kZSwgY2hpbGRMZXZlbCArIDEpOwotCQkJCSsrc2libGluZ0xldmVsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIGFkZHMgYW4gYWRhcHRlciBvbnRvIGVhY2ggZm9yIHRyYWNraW5nCi0JICogcHVycG9zZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCWludCBzaWJsaW5nTGV2ZWwgPSAwOwotCQkJCQkJTm9kZSBuZXh0U2libGluZyA9IChOb2RlKSBzdGFydE5vZGU7Ci0JCQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nTGV2ZWwgPCBNQVhfU0lCTElOR1MpIHsKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCQkJbmV4dFNpYmxpbmcgPSBjdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCQkrK3NpYmxpbmdMZXZlbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUC5hZGRBbGxBZGFwdGVyczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgdG8gdXNlIHdpdGggdGhpcwotCSAqIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTAotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBnZXRBZGFwdGVyRmFjdG9yeUhUTUwoYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHNNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCQkJCQkvLyBnZXR0aW5nIHRoZSBwcm9qZWN0aW9ubW9kZWxub2RlYWRhcHRlciBmb3IgdGhlIGZpcnN0Ci0JCQkJCS8vIHRpbWUKLQkJCQkJLy8gc28gZG8gc29tZSBpbml0aWFsaXppbmcKLQkJCQkJaWYgKCFmYWN0b3J5UmVnaXN0cnkuY29udGFpbnMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKSAmJiBjcmVhdGVJZk5lZWRlZCkgewotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBuZXdGYWN0b3J5ID0gbmV3IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoKTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gZmFjdG9yeSByZWdpc3RyeQotCQkJCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkobmV3RmFjdG9yeSk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIHByb3BvZ2F0aW5nIGFkYXB0ZXIKLQkJCQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHNNb2RlbDsKLQkJCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAocHJvcGFnYXRpbmdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3RmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyB0cnkgYW5kIGdldCB0aGUgZmFjdG9yeQotCQkJCQlmYWN0b3J5ID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwpIGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuZ2V0QWRhcHRlckZhY3RvcnlIVE1MOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCB0byB1c2Ugd2l0aCB0aGlzIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgZ2V0QWRhcHRlckZhY3RvcnlKU1AoYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQIGZhY3RvcnkgPSBudWxsOwotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc01vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JCQkJCS8vIGdldHRpbmcgdGhlIHByb2plY3Rpb25tb2RlbG5vZGVhZGFwdGVyIGZvciB0aGUgZmlyc3QKLQkJCQkJLy8gdGltZQotCQkJCQkvLyBzbyBkbyBzb21lIGluaXRpYWxpemluZwotCQkJCQlpZiAoIWZhY3RvcnlSZWdpc3RyeS5jb250YWlucyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcykgJiYgY3JlYXRlSWZOZWVkZWQpIHsKLQkJCQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCBuZXdGYWN0b3J5ID0gbmV3IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCgpOwotCi0JCQkJCQkvLyBhZGQgZmFjdG9yeSB0byBmYWN0b3J5IHJlZ2lzdHJ5Ci0JCQkJCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShuZXdGYWN0b3J5KTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gcHJvcG9nYXRpbmcgYWRhcHRlcgotCQkJCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc01vZGVsOwotCQkJCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWlmIChwcm9wYWdhdGluZ0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXdGYWN0b3J5KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBmYWN0b3J5Ci0JCQkJCWZhY3RvcnkgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQKSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuZ2V0QWRhcHRlckZhY3RvcnlKU1A6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhpcyBwcm92aWRlciB3aXRoIHRoZSBjb3JyZWN0IGRvY3VtZW50LiBBc3N1bWVzIHByb2plY3Rpb24KLQkgKiBpcyBlbmFibGVkLiAob3RoZXJ3aXNlLCBvbmx5IGluc3RhbGwgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoIWlzSW5zdGFsbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkvLyBjbGVhciBvdXQgb2xkIGluZm8KLQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJZkRvY3VtZW50ID0gZlZpZXdlci5nZXREb2N1bWVudCgpOwotCi0JCS8vIHNldCBwcm9qZWN0aW9uIHZpZXdlciBvbiBuZXcgZG9jdW1lbnQncyBhZGFwdGVyIGZhY3RvcnkKLQkJaWYgKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpIHsKLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnlKU1AodHJ1ZSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRQcm9qZWN0aW9uVmlld2VyKGZWaWV3ZXIpOwotCQkJfQotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5MiA9IGdldEFkYXB0ZXJGYWN0b3J5SFRNTCh0cnVlKTsKLQkJCWlmIChmYWN0b3J5MiAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeTIuYWRkUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MzA0Ci0JCQkJLy8gZGlzYWJsZSByZWRyYXcgd2hpbGUgYWRkaW5nIGFsbCBhZGFwdGVycwotCQkJCWZWaWV3ZXIuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQlhZGRBbGxBZGFwdGVycygpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZlZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQLmluaXRpYWxpemU6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlIGEgUHJvamVjdGlvblZpZXdlciB3aXRoIHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyB1bmluc3RhbGwgYmVmb3JlIHRyeWluZyB0byBpbnN0YWxsIG5ldyB2aWV3ZXIKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXVuaW5zdGFsbCgpOwotCQl9Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZWaWV3ZXIuYWRkUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmVmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnlKU1AoZmFsc2UpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5LnJlbW92ZVByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCX0KLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5MiA9IGdldEFkYXB0ZXJGYWN0b3J5SFRNTChmYWxzZSk7Ci0JCWlmIChmYWN0b3J5MiAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5Mi5yZW1vdmVQcm9qZWN0aW9uVmlld2VyKGZWaWV3ZXIpOwotCQl9Ci0KLQkJLy8gY2xlYXIgb3V0IGFsbCBhbm5vdGF0aW9ucwotCQlpZiAoZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkKLQkJCWZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpLnJlbW92ZUFsbEFubm90YXRpb25zKCk7Ci0KLQkJcmVtb3ZlQWxsQWRhcHRlcnMoKTsKLQotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRW5hYmxlZCgpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW4gYWRhcHRlciBmcm9tIG5vZGUgYW5kIGl0cyBjaGlsZHJlbgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGxldmVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKE5vZGUgbm9kZSwgaW50IGxldmVsKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBub2RlOwotCi0JCQkvLyB0cnkgYW5kIGdldCB0aGUgYWRhcHRlciBmb3IgdGhlIGN1cnJlbnQgbm9kZSBhbmQgcmVtb3ZlIGl0Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJbm90aWZpZXIucmVtb3ZlQWRhcHRlcihhZGFwdGVyKTsKLQkJCX0KLQotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlcjIgIT0gbnVsbCkgewotCQkJCW5vdGlmaWVyLnJlbW92ZUFkYXB0ZXIoYWRhcHRlcjIpOwotCQkJfQotCi0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJTm9kZSBjaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQlyZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihjaGlsZE5vZGUsIGxldmVsICsgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgcmVtb3ZlcyBhZGFwdGVyIGZyb20gZWFjaCBmb3IgY2xlYW51cAotCSAqIHB1cnBvc2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG5leHRTaWJsaW5nID0gKE5vZGUpIHN0YXJ0Tm9kZTsKLQkJCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCXJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQLmFkZEFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgZkRvY3VtZW50ICE9IG5ld0lucHV0KSB7Ci0JCQkvLyBkaXNhYmxlIHByb2plY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZXZlcnl0aGluZwotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgcHJvamVjdGlvbiB3YXMgcHJldmlvdXNseSBlbmFibGVkIGJlZm9yZSBpbnB1dCBkb2N1bWVudCBjaGFuZ2VkCi0JCS8vIGFuZCBuZXcgZG9jdW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gb2xkIGRvY3VtZW50Ci0JCWlmIChmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgJiYgZkRvY3VtZW50ID09IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotCQkJcHJvamVjdGlvbkVuYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciBmcm9tIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZDhiMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIHRoZXNlIGFyZSB0aGUgbWFpbiBmYWN0b3JpZXMsIG9uIG1vZGVsJ3MgZmFjdG9yeSByZWdpc3RyeQotCQlhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQkJLy8gLS0tLS0tLQotCQkvLyBNdXN0IHVwZGF0ZS9hZGQgdG8gcHJvcGFnYXRpbmcgYWRhcHRlcnMgaGVyZSB0b28KLQkJYWRkUHJvcGFnYXRpbmdBZGFwdGVycyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTChJSkZhY2VOb2RlQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCi0JCU1vZGVsSGFuZGxlckZvckpTUC5lbnN1cmVUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KHN0cnVjdHVyZWRNb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGFnYXRpbmdBZGFwdGVycyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKHByb3BhZ2F0aW5nQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJLy8gd2hhdCB0byBkbz8KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2lzRm9yKENvbnRlbnRUeXBlRGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JKU1ApOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4MWJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZTsKLQotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNKU1AgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT05URU5UID0gImpzcF9jb250ZW50IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0MThjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXJ7Ci0KLQlwcml2YXRlIFN0cmluZyBmTGFuZ3VhZ2UgPSBudWxsOwotCi0JLy8gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkEgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW10gewotCS8vICJqYXZhc2NyaXB0IiwgImphdmFzY3JpcHQxLjAiLCAiamF2YXNjcmlwdDEuMV8zIiwgImphdmFzY3JpcHQxLjIiLAotCS8vICJqYXZhc2NyaXB0MS4zIiwgImphdmFzY3JpcHQxLjQiLCAiamF2YXNjcmlwdDEuNSIsICJqYXZhc2NyaXB0MS42IiwKLQkvLyAianNjcmlwdCIsICJzYXNoc2NyaXB0IiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCS8vIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCS8vIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy0xMCQKLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8qKgotCQkgKiBhIG1ldGhvZCB0byBjZW50cmFsaXplIGFsbCB0aGUgInN5dGxlIHJ1bGVzIiBmb3IgcmVnaW9ucwotCQkgKi8KLQkJVGV4dEF0dHJpYnV0ZSByZXN1bHQgPSBudWxsOwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBjb21pbmcgdGhyb3VnaCBudWxsLCBidXQganVzdCB0byBjYXRjaCBpdAotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAoKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFKSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhUKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJCQl9Ci0JCQkJLy8gPT09PT09PT09PT09IFRoZXNlIGFyZSBpbiBjb21tb24gd2l0aCBYTUwgLS0tIChmb3IgWE1MIGZvcm0KLQkJCQkvLyBvZiB0YWdzKQotCQkJCS8vICAgICAgICAgICAgICBOb3RlOiB0aGlzIGFzc3VtZSdzIHRoaXMgcHJvdmlkZXIgaXMgb25seSBjYWxsZWQgZm9yCi0JCQkJLy8gICAgICAgICAgICAgIHRydWUgSlNQIE5vZGVzLiBJZiBpdHMgY2FsbGVkIGZvciBvdGhlcnMsIHRoZW4gdGhpcyB3aWxsCi0JCQkJLy8gICAgICAgICAgICAgIGNhdXNlIHRoZWlyIHRhZyBuYW1lcyB0byBiZSBoaWdobGlnaHRlZCB0b28hCi0JCQkJLy8gICAgICAgICAgICAgIEZ1cnRoZXIgY2hlY2tzIGNvdWxkIGJlIGRvbmUgdG8gcHJldmVudCB0aGF0LCBidXQgZG9lc24ndAotCQkJCS8vICAgICAgICAgICAgICBzZWVtIHdvcnRoIGl0LCBzaW5jZSBpZiBhZHBhdGVycyBmYWN0b3JpZXMgYXJlIHdvcmtpbmcKLQkJCQkvLyByaWdodCwKLQkJCQkvLyAgICAgICAgICAgICAgdGhlbiB3b3VsZG4ndCBiZSBuZWVkZWQuCi0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUyk7Ci0JCQkJfQotCi0JCQkJLy8gRE1XOiBhZGRlZCA5LzEvMjAwMiBVbmRlZmluZWQgY29sb3IgbWF5IG5lZWQgYWRkanVzdG1lbnQgOikKLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKQotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCQkJLy8gRE1XIGFkZGVkIDgvMzAvMjAwMiAtLSBzaG91bGQgcHJvdmlkZSBKU1Agc3BlY2lmaWMKLQkJCQkvLyBwcmVmZXJlbmNlIGZvciAiY3VzdG9tIHRhZyBjb250ZW50IiAoYm90aCB0YWcgZGVwZW5kZW50LAotCQkJCS8vIEJMT0NLRURfVEVYVCwgYW5kIG5vdCwgWE1MIENPTlRFTlQpCi0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKQotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJCX0KLQkJfQotCQkvLyBkZWZhdWx0LCByZXR1cm4gbnVsbCB0byBzaWduYWwgIm5vdCBoYW5kbGVkIgotCQkvLyBpbiB3aGljaCBjYXNlLCBvdGhlciBmYWN0b3JpZXMgc2hvdWxkIGJlIHRyaWVkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUyk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5UKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHlsZUtleSA9IG51bGw7Ci0KLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUU7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVI7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUU7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5UOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVI7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhbmd1YWdlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLQkJcmV0dXJuIGZMYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGFuZ3VhZ2UKLQkgKiAgICAgICAgICAgIFRoZSBsYW5ndWFnZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJdGhpcy5mTGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9JU3R5bGVDb25zdGFudHNKU1BKYXZhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9JU3R5bGVDb25zdGFudHNKU1BKYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZjc3MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0pTUEphdmEgewotCVN0cmluZyBKQVZBX0tFWVdPUkQgPSAia2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9TSU5HTEVfTElORV9DT01NRU5UID0gInNpbmdsZV9saW5lX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBVkFfU1RSSU5HID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhQ29kZVNjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2RlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzk1YjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2RlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuRW5kT2ZMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuTXVsdGlMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlNpbmdsZUxpbmVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Xb3JkUnVsZTsKLQotLyoqCi0gKiBBIEphdmEgY29kZSBzY2FubmVyLgotICovCi1jbGFzcyBKYXZhQ29kZVNjYW5uZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlJ1bGVCYXNlZFNjYW5uZXIgewotCXByaXZhdGUgSVRva2VuIGZLZXl3b3JkVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlR5cGVUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmU3RyaW5nVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlNpbmdsZUxpbmVDb21tZW50VG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZkRlZmF1bHRUb2tlbjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnS2V5d29yZHMgPSB7ImFic3RyYWN0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJicmVhayIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiY2FzZSIsICJjYXRjaCIsICJjbGFzcyIsICJjb250aW51ZSIsIC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkiZGVmYXVsdCIsICJkbyIsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJImVsc2UiLCAiZXh0ZW5kcyIsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJImZpbmFsIiwgImZpbmFsbHkiLCAiZm9yIiwgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJImlmIiwgImltcGxlbWVudHMiLCAiaW1wb3J0IiwgImluc3RhbmNlb2YiLCAiaW50ZXJmYWNlIiwgLy8kTk9OLU5MUy01JC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkibmF0aXZlIiwgIm5ldyIsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJInBhY2thZ2UiLCAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicHVibGljIiwgLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJyZXR1cm4iLCAvLyROT04tTkxTLTEkCi0JCQkJInN0YXRpYyIsICJzdXBlciIsICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwgLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJ0aGlzIiwgInRocm93IiwgInRocm93cyIsICJ0cmFuc2llbnQiLCAidHJ5IiwgLy8kTk9OLU5MUy01JC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkidm9sYXRpbGUiLCAvLyROT04tTkxTLTEkCi0JCQkJIndoaWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJzdHJpY3RmcCIsLy8kTk9OLU5MUy0xJAotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdUeXBlcyA9IHsidm9pZCIsICJib29sZWFuIiwgImNoYXIiLCAiYnl0ZSIsICJzaG9ydCIsICJpbnQiLCAibG9uZyIsICJmbG9hdCIsICJkb3VibGUifTsvLyROT04tTkxTLTkkLy8kTk9OLU5MUy04JC8vJE5PTi1OTFMtNyQvLyROT04tTkxTLTYkLy8kTk9OLU5MUy01JC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ0NvbnN0YW50cyA9IHsiZmFsc2UiLCAibnVsbCIsICJ0cnVlIn07Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgSmF2YSBjb2RlIHNjYW5uZXIKLQkgKi8KLQlwdWJsaWMgSmF2YUNvZGVTY2FubmVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUnVsZXMoKSB7Ci0JCUxpc3QgcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gQWRkIHJ1bGUgZm9yIG11bHRpcGxlIGxpbmUgY29tbWVudHMuCi0JCXJ1bGVzLmFkZChuZXcgTXVsdGlMaW5lUnVsZSgiLyoiLCAiKi8iLCBmU2luZ2xlTGluZUNvbW1lbnRUb2tlbikpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIEFkZCBydWxlIGZvciBzaW5nbGUgbGluZSBjb21tZW50cy4KLQkJcnVsZXMuYWRkKG5ldyBFbmRPZkxpbmVSdWxlKCIvLyIsIGZTaW5nbGVMaW5lQ29tbWVudFRva2VuKSk7Ly8kTk9OLU5MUy0xJAotCi0JCS8vIEFkZCBydWxlIGZvciBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLgotCQlydWxlcy5hZGQobmV3IFNpbmdsZUxpbmVSdWxlKCJcIiIsICJcIiIsIGZTdHJpbmdUb2tlbiwgJ1xcJykpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJ1bGVzLmFkZChuZXcgU2luZ2xlTGluZVJ1bGUoIiciLCAiJyIsIGZTdHJpbmdUb2tlbiwgJ1xcJykpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJLy8gQWRkIGdlbmVyaWMgd2hpdGVzcGFjZSBydWxlLgotCQkvL3J1bGVzLmFkZChuZXcgV2hpdGVzcGFjZVJ1bGUobmV3IEphdmFXaGl0ZXNwYWNlRGV0ZWN0b3IoKSkpOwotCi0JCS8vIEFkZCB3b3JkIHJ1bGUgZm9yIGtleXdvcmRzLCB0eXBlcywgYW5kIGNvbnN0YW50cy4KLQkJV29yZFJ1bGUgd29yZFJ1bGUgPSBuZXcgV29yZFJ1bGUobmV3IEphdmFXb3JkRGV0ZWN0b3IoKSwgZkRlZmF1bHRUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdLZXl3b3Jkcy5sZW5ndGg7IGkrKykKLQkJCXdvcmRSdWxlLmFkZFdvcmQoZmdLZXl3b3Jkc1tpXSwgZktleXdvcmRUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdUeXBlcy5sZW5ndGg7IGkrKykKLQkJCXdvcmRSdWxlLmFkZFdvcmQoZmdUeXBlc1tpXSwgZlR5cGVUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdDb25zdGFudHMubGVuZ3RoOyBpKyspCi0JCQl3b3JkUnVsZS5hZGRXb3JkKGZnQ29uc3RhbnRzW2ldLCBmVHlwZVRva2VuKTsKLQkJcnVsZXMuYWRkKHdvcmRSdWxlKTsKLQotCi0JCUlSdWxlW10gcmVzdWx0ID0gbmV3IElSdWxlW3J1bGVzLnNpemUoKV07Ci0JCXJ1bGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJc2V0UnVsZXMocmVzdWx0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VG9rZW5EYXRhKFN0cmluZyB0b2tlbktleSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9LRVlXT1JEKSB7Ci0JCQlmS2V5d29yZFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQkJZlR5cGVUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU1RSSU5HKSB7Ci0JCQlmU3RyaW5nVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpIHsKLQkJCWZTaW5nbGVMaW5lQ29tbWVudFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9IGVsc2UgaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKSB7Ci0JCQlmRGVmYXVsdFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YUNvbG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2xvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTIzODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YUNvbG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLQotLyoqCi0gKiBDb2xvcnMgdXNlZCBpbiB0aGUgSmF2YSBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFDb2xvclByb3ZpZGVyIHsKLQkKLQkvLyBwZW9wbGUgc2hvdWxkIG5vdCBiZSBzZXR0aW5nIHRoZXNlLCBldmVuIHRob3VnaCB0aGV5IGFyZSBjdXJyZW50bHkgbm90IGZpbmFsCi0JcHVibGljIHN0YXRpYyBSR0IgTVVMVElfTElORV9DT01NRU5UID0gbmV3IFJHQigxMjgsIDAsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIFNJTkdMRV9MSU5FX0NPTU1FTlQgPSBuZXcgUkdCKDEyOCwgMTI4LCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBLRVlXT1JEID0gbmV3IFJHQigwLCAwLCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIFRZUEUgPSBuZXcgUkdCKDAsIDAsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgU1RSSU5HID0gbmV3IFJHQigwLCAxMjgsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIERFRkFVTFQgPSBuZXcgUkdCKDAsIDAsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfS0VZV09SRCA9IG5ldyBSR0IoMCwgMTI4LCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX1RBRyA9IG5ldyBSR0IoMTI4LCAxMjgsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19MSU5LID0gbmV3IFJHQigxMjgsIDEyOCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX0RFRkFVTFQgPSBuZXcgUkdCKDAsIDEyOCwgMTI4KTsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBNVUxUSV9MSU5FX0NPTU1FTlRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBLRVlXT1JEX0JPTEQgPSBTV1QuQk9MRDsKLQlwdWJsaWMgc3RhdGljIGludCBUWVBFX0JPTEQgPSBTV1QuQk9MRDsKLQlwdWJsaWMgc3RhdGljIGludCBTVFJJTkdfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgREVGQVVMVF9CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX0tFWVdPUkRfQk9MRCA9IFNXVC5CT0xEOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfVEFHX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfTElOS19CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX0RFRkFVTFRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YUNvbG9yUHJvdmlkZXIgZkluc3RhbmNlID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIEphdmFDb2xvclByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBKYXZhQ29sb3JQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCQotCS8qKgotCSAqIFVzZSBjb2xvcnMgZnJvbSBKRFQgcGx1Z2luCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEphdmFDb2xvcnMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgamR0U3RvcmUgPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlNVUxUSV9MSU5FX0NPTU1FTlQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQlTSU5HTEVfTElORV9DT01NRU5UID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9DT0xPUik7Ci0JCUtFWVdPUkQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IpOwotCQlUWVBFID0gS0VZV09SRDsKLQkJU1RSSU5HID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0NPTE9SKTsKLQkJREVGQVVMVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUik7Ci0JCUpBVkFET0NfS0VZV09SRCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfS0VZV09SRF9DT0xPUik7Ci0JCUpBVkFET0NfVEFHID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19UQUdfQ09MT1IpOwotCQlKQVZBRE9DX0xJTksgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0xJTktTX0NPTE9SKTsKLQkJSkFWQURPQ19ERUZBVUxUID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19ERUZBVUxUX0NPTE9SKTsKLQkJCi0JCU1VTFRJX0xJTkVfQ09NTUVOVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCVNJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJS0VZV09SRF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCVRZUEVfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlTVFJJTkdfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlERUZBVUxUX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJSkFWQURPQ19UQUdfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19UQUdfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUpBVkFET0NfTElOS19CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0xJTktTX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlKQVZBRE9DX0RFRkFVTFRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19ERUZBVUxUX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzYzgxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV2hpdGVzcGFjZURldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi0KLQotLyoqCi0gKiBBIGphdmEgYXdhcmUgd2hpdGUgc3BhY2UgZGV0ZWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhV2hpdGVzcGFjZURldGVjdG9yIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV2hpdGVzcGFjZURldGVjdG9yIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV2hpdGVzcGFjZURldGVjdG9yI2lzV2hpdGVzcGFjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZShjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdvcmREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdvcmREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGY2Mzc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXb3JkRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLQotLyoqCi0gKiBBIEphdmEgYXdhcmUgd29yZCBkZXRlY3Rvci4KLSAqLwotcHVibGljIGNsYXNzIEphdmFXb3JkRGV0ZWN0b3IgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IjaXNXb3JkSWRlbnRpZmllclBhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRQYXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yI2lzV29yZElkZW50aWZpZXJTdGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29yZFN0YXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9MaW5lU3R5bGVQcm92aWRlckZvckphdmEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0xpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2FlZjFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0xpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8vIE5vdGU6IG1hbnkgb2YgdGhlIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyB3ZXJlIGJhc2VkIG9uIChvciBjb3BpZWQgZnJvbSkgdGhvc2UKLS8vIGZvdW5kIGluIHRoZSBleGFtcGxlIEphdmEgRWRpdG9yCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyewotCi0JLyoqIFRoZSBzY2FubmVyIGl0IHVzZXMgKi8KLQlwcml2YXRlIEphdmFDb2RlU2Nhbm5lciBmU2Nhbm5lcjsKLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckphdmEoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTY2FubmVyID0gbmV3IEphdmFDb2RlU2Nhbm5lcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgc3R5bGUgaW5mb3JtYXRpb24gdG8gdGhlIGdpdmVuIHRleHQgcHJlc2VudGF0aW9uLgotCSAqCi0JICogQHBhcmFtIHByZXNlbnRhdGlvbiB0aGUgdGV4dCBwcmVzZW50YXRpb24gdG8gYmUgZXh0ZW5kZWQKLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICogQHBhcmFtIGF0dHIgdGhlIGF0dHJpYnV0ZSBkZXNjcmliaW5nIHRoZSBzdHlsZSBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJhbmdlKENvbGxlY3Rpb24gcHJlc2VudGF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBUZXh0QXR0cmlidXRlIGF0dHIpIHsKLQkJLy8gc3VwcG9ydCBmb3IgdXNlciBkZWZpbmVkIGJhY2tncm91ZCBmb3IgSlNQIHNjcmlwdGxldCByZWdpb25zCi0JCVRleHRBdHRyaWJ1dGUgdGEgPSAoVGV4dEF0dHJpYnV0ZSlnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpOwotCQlDb2xvciBiZ0NvbG9yID0gdGEuZ2V0QmFja2dyb3VuZCgpOwotCQlpZiAoYmdDb2xvciA9PSBudWxsKQotCQkJYmdDb2xvciA9IGF0dHIuZ2V0QmFja2dyb3VuZCgpOwotCQlTdHlsZVJhbmdlIHJlc3VsdCA9IG5ldyBTdHlsZVJhbmdlKG9mZnNldCwgbGVuZ3RoLCBhdHRyLmdldEZvcmVncm91bmQoKSwgYmdDb2xvciwgYXR0ci5nZXRTdHlsZSgpKTsKLQkJaWYoKGF0dHIuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSCkgIT0gMCkgewotCQkJcmVzdWx0LnN0cmlrZW91dCA9IHRydWU7Ci0JCX0KLQkJaWYoKGF0dHIuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwKSB7Ci0JCQlyZXN1bHQudW5kZXJsaW5lID0gdHJ1ZTsKLQkJfQotCQlwcmVzZW50YXRpb24uYWRkKHJlc3VsdCk7Ci0JfQotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGNvbG9yS2V5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCBhZGRzIHRoZSBzdHlsZQotCSAqIGluZm9ybWF0aW9uIHRvIGxpc3Qgb2YgVGV4dEF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3JLZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSmF2YVRleHRBdHRyaWJ1dGUoU3RyaW5nIGNvbG9yS2V5KSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCAmJiBjb2xvcktleSAhPSBudWxsKSB7IAotCQkJVGV4dEF0dHJpYnV0ZSB0YSA9IG51bGw7Ci0JCQlpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0tFWVdPUkQpIHsKLQkJCQkvLyBrZXl3b3JkCi0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0lUQUxJQyk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9VTkRFUkxJTkUpOwotCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJaWYgKGJvbGQpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoaXRhbGljcykgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0cmlrZXRocm91Z2gpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQl9Ci0JCQkJaWYgKHVuZGVybGluZSkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NUUklORykgewotCQkJCS8vIHN0cmluZwotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19JVEFMSUMpOwotCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBzdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TSU5HTEVfTElORV9DT01NRU5UKSB7Ci0JCQkJLy8gc2luZ2xlIGxpbmUgY29tbWVudAotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9JVEFMSUMpOwotCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9VTkRFUkxJTkUpOwotCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJaWYgKGJvbGQpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoaXRhbGljcykgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0cmlrZXRocm91Z2gpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQl9Ci0JCQkJaWYgKHVuZGVybGluZSkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0RFRkFVTFQpIHsKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0lUQUxJQyk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9VTkRFUkxJTkUpOwotCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJaWYgKGJvbGQpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoaXRhbGljcykgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0cmlrZXRocm91Z2gpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQl9Ci0JCQkJaWYgKHVuZGVybGluZSkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0KLQkJCWlmICh0YSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIHRhKTsKLQkJCQlmU2Nhbm5lci5zZXRUb2tlbkRhdGEoY29sb3JLZXksIHRhKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgdGV4dCBhdHRyaWJ1dGUgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gdG9rZW4uIElmIHRoZSB0b2tlbidzCi0JICogZGF0YSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gYW5kIGEgdGV4dCBhdHRyaWJ1dGUgaXQgaXMgYXNzdW1lZCB0aGF0Ci0JICogaXQgaXMgdGhlIGVuY29kZWQgdGV4dCBhdHRyaWJ1dGUuIEl0IHJldHVybnMgdGhlIGRlZmF1bHQgdGV4dCBhdHRyaWJ1dGUKLQkgKiBpZiB0aGVyZSBpcyBubyBlbmNvZGVkIHRleHQgYXR0cmlidXRlIGZvdW5kLgotCSAqCi0JICogQHBhcmFtIHRva2VuIHRoZSB0b2tlbiB3aG9zZSB0ZXh0IGF0dHJpYnV0ZSBpcyB0byBiZSBkZXRlcm1pbmVkCi0JICogQHJldHVybiB0aGUgdG9rZW4ncyB0ZXh0IGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBnZXRUb2tlblRleHRBdHRyaWJ1dGUoSVRva2VuIHRva2VuKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCQkKLQkJT2JqZWN0IGRhdGEgPSB0b2tlbi5nZXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgVGV4dEF0dHJpYnV0ZSkKLQkJCXRhID0gKFRleHRBdHRyaWJ1dGUpZGF0YTsKLQkJZWxzZSB7Ci0JCQl0YSA9IChUZXh0QXR0cmlidXRlKWdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKTsKLQkJfQotCQlyZXR1cm4gdGE7IAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UKTsKLQkJCi0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9LRVlXT1JEKTsKLQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NUUklORyk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TSU5HTEVfTElORV9DT01NRU5UKTsKLQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0RFRkFVTFQpOwotCQkKLQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCQlTdHJpbmcgamF2YVN0eWxlS2V5ID0gbnVsbDsKLQotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZLZXkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJLy8gY2hlY2sgaWYgcHJlZmVyZW5jZSBjaGFuZ2VkIGlzIGEgc3R5bGUgcHJlZmVyZW5jZQotCQkJaWYgKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVI7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVDsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQuZXF1YWxzKHByZWZLZXkpKXx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfS0VZV09SRDsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0JPTEQuZXF1YWxzKHByZWZLZXkpKXx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU1RSSU5HOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xELmVxdWFscyhwcmVmS2V5KSl8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TSU5HTEVfTElORV9DT01NRU5UOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRC5lcXVhbHMocHJlZktleSkpfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJfQotCQlpZiAoamF2YVN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShqYXZhU3R5bGVLZXkpOwotCQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JCX0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwgfHwgamF2YVN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIGZvcmNlIGEgZnVsbCB1cGRhdGUgb2YgdGhlIHRleHQgdmlld2VyCi0JCQlmUmVjSGlnaGxpZ2h0ZXIucmVmcmVzaERpc3BsYXkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IHNzc3NyZXF1ZXN0ZWRTdGFydCwgaW50IHNzc3NyZXF1ZXN0ZWRMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQkvKiBJbml0aWFsaXplIHRoZSB0ZXh0IGF0dHJpYnV0ZXMuIEFsc28gbG9hZCB0aGUgY29sb3JzIGFuZCBpbml0aWFsaXplIHRoZSBydWxlcyBvZiB0aGUgc2Nhbm5lciAqLwotCQlnZXRUZXh0QXR0cmlidXRlcygpOwotCQl0cnkgewotCQkJLy8gaWRlYWxseSwgZXZlbnR1YWxseSwgd2UnbGwgaGF2ZSBhICJ2aXJ0dWFsRG9jdW1lbnQiIHdlIGNhbgotCQkJLy8gcmVmZXIgdG8sIGJ1dCBmb3Igbm93IC4uLiB3ZSdsbCBzaW1wbGUgcmVzY2FuIHRoZSBvbmUgcmVnaW9uLgotCQkJLy8gdXNlIHNpbXBsZSBhZGp1c3RtZW50IChzaW5jZSAic3ViLWNvbnRlbnQiIHN0YXJ0cyBhdCAwCi0JCQlpbnQgbGFzdFN0YXJ0ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCUlUb2tlbiBsYXN0VG9rZW4gPSBUb2tlbi5VTkRFRklORUQ7Ci0JCQlmU2Nhbm5lci5zZXRSYW5nZShnZXREb2N1bWVudCgpLCBsYXN0U3RhcnQsIHR5cGVkUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJSVRva2VuIHRva2VuID0gZlNjYW5uZXIubmV4dFRva2VuKCk7Ci0JCQkJaWYgKHRva2VuLmlzRU9GKCkpIHsKLQkJCQkJaWYgKCFsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSAmJiBsZW5ndGggIT0gMCkgewotCQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCwgbGVuZ3RoLCBnZXRUb2tlblRleHRBdHRyaWJ1dGUobGFzdFRva2VuKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0b2tlbi5pc1doaXRlc3BhY2UoKSkgewotCQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSkgewotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAodG9rZW4gIT0gbGFzdFRva2VuKSB7Ci0JCQkJCWFkZFJhbmdlKGhvbGRSZXN1bHRzLCBsYXN0U3RhcnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGFzdFN0YXJ0ID0gZlNjYW5uZXIuZ2V0VG9rZW5PZmZzZXQoKTsKLQkJCQkJbGVuZ3RoID0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkbid0IGhhcHBlbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8gc3RvcCBvdGhlcgotCQkJLy8gaGlnaGxpZ2h0aW5nLCBpZiBpdCBkb2VzLgotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldEphdmFDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJZ2V0Q29sb3JQcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCWdldEphdmFDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdW5SZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0lTdHlsZUNvbnN0YW50c0pTUEVMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSVN0eWxlQ29uc3RhbnRzSlNQRUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjNDgyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSVN0eWxlQ29uc3RhbnRzSlNQRUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzSlNQRUwgewotCVN0cmluZyBFTF9LRVlXT1JEID0gImtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVMX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvZGVTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxDb2RlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTM0YjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvZGVTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuV2hpdGVzcGFjZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Xb3JkUnVsZTsKLQotLyoqCi0gKiBBIEphdmEgY29kZSBzY2FubmVyLgotICovCi1wdWJsaWMgY2xhc3MgSlNQRUxDb2RlU2Nhbm5lciBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuUnVsZUJhc2VkU2Nhbm5lciB7Ci0JcHJpdmF0ZSBJVG9rZW4gZktleXdvcmRUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmVHlwZVRva2VuOwotCXByaXZhdGUgSVRva2VuIGZEZWZhdWx0VG9rZW47Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdLZXl3b3JkcyA9IHsKLQkJCQkiYW5kIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJkaWQiLCAvLyROT04tTkxTLTEkCi0JCQkJImRpdiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiZW1wdHkiLCAvLyROT04tTkxTLTEkCi0JCQkJImVxIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJnZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiZ3QiLCAvLyROT04tTkxTLTEkCi0JCQkJIm9yIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkibHQiLCAvLyROT04tTkxTLTEkCi0JCQkJIm1vZCIsIC8vJE5PTi1OTFMtMSQKLSAJCQkJIm5lIiwgLy8kTk9OLU5MUy0xJAotIAkJCQkibm90IiAgLy8kTk9OLU5MUy0xJAotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdDb25zdGFudHMgPSB7ImZhbHNlIiwgInRydWUifTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIEphdmEgY29kZSBzY2FubmVyCi0JICovCi0JcHVibGljIEpTUEVMQ29kZVNjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVSdWxlcygpIHsKLQkJTGlzdCBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBBZGQgZ2VuZXJpYyB3aGl0ZXNwYWNlIHJ1bGUuCi0JCXJ1bGVzLmFkZChuZXcgV2hpdGVzcGFjZVJ1bGUobmV3IEpTUEVMV2hpdGVzcGFjZURldGVjdG9yKCkpKTsKLQotCQkvLyBBZGQgd29yZCBydWxlIGZvciBrZXl3b3JkcywgdHlwZXMsIGFuZCBjb25zdGFudHMuCi0JCVdvcmRSdWxlIHdvcmRSdWxlID0gbmV3IFdvcmRSdWxlKG5ldyBKU1BFTFdvcmREZXRlY3RvcigpLCBmRGVmYXVsdFRva2VuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZ0tleXdvcmRzLmxlbmd0aDsgaSsrKQotCQkJd29yZFJ1bGUuYWRkV29yZChmZ0tleXdvcmRzW2ldLCBmS2V5d29yZFRva2VuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZ0NvbnN0YW50cy5sZW5ndGg7IGkrKykKLQkJCXdvcmRSdWxlLmFkZFdvcmQoZmdDb25zdGFudHNbaV0sIGZUeXBlVG9rZW4pOwotCQlydWxlcy5hZGQod29yZFJ1bGUpOwotCi0JCUlSdWxlW10gcmVzdWx0ID0gbmV3IElSdWxlW3J1bGVzLnNpemUoKV07Ci0JCXJ1bGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJc2V0UnVsZXMocmVzdWx0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VG9rZW5EYXRhKFN0cmluZyB0b2tlbktleSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEVMLkVMX0tFWVdPUkQpIHsKLQkJCWZLZXl3b3JkVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCQlmVHlwZVRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9IGVsc2UgaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEVMLkVMX0RFRkFVTFQpIHsKLQkJCWZEZWZhdWx0VG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxDb2xvclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxDb2xvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMTc4YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMQ29sb3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLS8qKgotICogQ29sb3JzIHVzZWQgaW4gdGhlIEphdmEgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFTENvbG9yUHJvdmlkZXIgewotCQotCS8vIHBlb3BsZSBzaG91bGQgbm90IGJlIHNldHRpbmcgdGhlc2UsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGN1cnJlbnRseSBub3QgZmluYWwKLQlwdWJsaWMgc3RhdGljIFJHQiBNVUxUSV9MSU5FX0NPTU1FTlQgPSBuZXcgUkdCKDEyOCwgMCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgU0lOR0xFX0xJTkVfQ09NTUVOVCA9IG5ldyBSR0IoMTI4LCAxMjgsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIEtFWVdPUkQgPSBuZXcgUkdCKDAsIDAsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgVFlQRSA9IG5ldyBSR0IoMCwgMCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBTVFJJTkcgPSBuZXcgUkdCKDAsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgREVGQVVMVCA9IG5ldyBSR0IoMCwgMCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19LRVlXT1JEID0gbmV3IFJHQigwLCAxMjgsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfVEFHID0gbmV3IFJHQigxMjgsIDEyOCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX0xJTksgPSBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfREVGQVVMVCA9IG5ldyBSR0IoMCwgMTI4LCAxMjgpOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IE1VTFRJX0xJTkVfQ09NTUVOVF9CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBTSU5HTEVfTElORV9DT01NRU5UX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEtFWVdPUkRfQk9MRCA9IFNXVC5CT0xEOwotCXB1YmxpYyBzdGF0aWMgaW50IFRZUEVfQk9MRCA9IFNXVC5CT0xEOwotCXB1YmxpYyBzdGF0aWMgaW50IFNUUklOR19CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBERUZBVUxUX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfS0VZV09SRF9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19UQUdfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19MSU5LX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfREVGQVVMVF9CT0xEID0gU1dULk5PUk1BTDsKLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBhbGwgZWRpdG9ycyB1c2Ugc2FtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUkdCIEVESVRPUl9CQUNLR1JPVU5EID0gbmV3IFJHQigyNTUsIDI1NSwgMjU1KTsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBhbGwgZWRpdG9ycyB1c2Ugc2FtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBFRElUT1JfQ1VSUkVOVF9MSU5FID0gdHJ1ZTsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBhbGwgZWRpdG9ycyB1c2Ugc2FtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUkdCIEVESVRPUl9DVVJSRU5UX0xJTkVfQ09MT1IgPSBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwotCQotCXByaXZhdGUgc3RhdGljIEpTUEVMQ29sb3JQcm92aWRlciBmSW5zdGFuY2UgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgSlNQRUxDb2xvclByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBKU1BFTENvbG9yUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQkKLQkvKioKLQkgKiBVc2UgY29sb3JzIGZyb20gSkRUIHBsdWdpbgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRKYXZhQ29sb3JzKCkgewotCQkKLQkJSVByZWZlcmVuY2VTdG9yZSBqZHRTdG9yZSA9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCU1VTFRJX0xJTkVfQ09NTUVOVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9DT0xPUik7Ci0JCVNJTkdMRV9MSU5FX0NPTU1FTlQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJS0VZV09SRCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUik7Ci0JCVRZUEUgPSBLRVlXT1JEOwotCQlTVFJJTkcgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQ09MT1IpOwotCQlERUZBVUxUID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SKTsKLQkJSkFWQURPQ19LRVlXT1JEID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19LRVlXT1JEX0NPTE9SKTsKLQkJSkFWQURPQ19UQUcgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX1RBR19DT0xPUik7Ci0JCUpBVkFET0NfTElOSyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfTElOS1NfQ09MT1IpOwotCQlKQVZBRE9DX0RFRkFVTFQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0RFRkFVTFRfQ09MT1IpOwotCQkKLQkJTVVMVElfTElORV9DT01NRU5UX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01VTFRJX0xJTkVfQ09NTUVOVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlLRVlXT1JEX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJVFlQRV9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCVNUUklOR19CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCURFRkFVTFRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlKQVZBRE9DX1RBR19CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX1RBR19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJSkFWQURPQ19MSU5LX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfTElOS1NfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUpBVkFET0NfREVGQVVMVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0RFRkFVTFRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCQotLy8JCUVESVRPUl9CQUNLR1JPVU5EID0gbmV3IFJHQigyNTUsIDI1NSwgMjU1KTsKLQkJCi0vLwkJSVByZWZlcmVuY2VTdG9yZSBzc2VTdG9yZSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLS8vCQlFRElUT1JfQ1VSUkVOVF9MSU5FID0gc3NlU3RvcmUuZ2V0Qm9vbGVhbihBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9DVVJSRU5UX0xJTkUpOwotLy8JCUVESVRPUl9DVVJSRU5UX0xJTkVfQ09MT1IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHNzZVN0b3JlLCBBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9DVVJSRU5UX0xJTkVfQ09MT1IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTFdoaXRlc3BhY2VEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMV2hpdGVzcGFjZURldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OTk3MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMV2hpdGVzcGFjZURldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDsKLQotCi0KLS8qKgotICogQSBqYXZhIGF3YXJlIHdoaXRlIHNwYWNlIGRldGVjdG9yLgotICovCi1wdWJsaWMgY2xhc3MgSlNQRUxXaGl0ZXNwYWNlRGV0ZWN0b3IgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXaGl0ZXNwYWNlRGV0ZWN0b3IgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXaGl0ZXNwYWNlRGV0ZWN0b3IjaXNXaGl0ZXNwYWNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXb3JkRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTFdvcmREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTBhN2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTFdvcmREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7Ci0KLQotLyoqCi0gKiBBIEphdmEgYXdhcmUgd29yZCBkZXRlY3Rvci4KLSAqLwotcHVibGljIGNsYXNzIEpTUEVMV29yZERldGVjdG9yIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yI2lzV29yZElkZW50aWZpZXJQYXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JkUGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciNpc1dvcmRJZGVudGlmaWVyU3RhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9MaW5lU3R5bGVQcm92aWRlckZvckpTUEVMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTYzNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YS5JU3R5bGVDb25zdGFudHNKU1BKYXZhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vLyBOb3RlOiBtYW55IG9mIHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3Mgd2VyZSBiYXNlZCBvbiAob3IgY29waWVkIGZyb20pCi0vLyB0aG9zZQotLy8gZm91bmQgaW4gdGhlIGV4YW1wbGUgSmF2YSBFZGl0b3IKLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQotCS8qKiBUaGUgc2Nhbm5lciBpdCB1c2VzICovCi0JcHJpdmF0ZSBKU1BFTENvZGVTY2FubmVyIGZTY2FubmVyOwotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTY2FubmVyID0gbmV3IEpTUEVMQ29kZVNjYW5uZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHN0eWxlIGluZm9ybWF0aW9uIHRvIHRoZSBnaXZlbiB0ZXh0IHByZXNlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uCi0JICogICAgICAgICAgICB0aGUgdGV4dCBwcmVzZW50YXRpb24gdG8gYmUgZXh0ZW5kZWQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBkZXNjcmliaW5nIHRoZSBzdHlsZSBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJhbmdlKENvbGxlY3Rpb24gcHJlc2VudGF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBUZXh0QXR0cmlidXRlIGF0dHIpIHsKLQkJLy8gc3VwcG9ydCBmb3IgdXNlciBkZWZpbmVkIGJhY2tncm91ZCBmb3IgSlNQIHNjcmlwdGxldCByZWdpb25zCi0JCVN0cmluZyBzdHlsZVN0cmluZyA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UKTsKLQkJU3RyaW5nW10gcHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlU3RyaW5nKTsKLQkJQ29sb3IgYmdDb2xvciA9IChwcmVmcyAhPSBudWxsICYmIHByZWZzLmxlbmd0aCA9PSAzICYmIHByZWZzWzFdLnN0YXJ0c1dpdGgoIiMiKSAmJiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCT8gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBDb2xvckhlbHBlci50b1JHQihwcmVmc1sxXSkpIDogYXR0ci5nZXRCYWNrZ3JvdW5kKCk7Ci0KLQkJcHJlc2VudGF0aW9uLmFkZChuZXcgU3R5bGVSYW5nZShvZmZzZXQsIGxlbmd0aCwgYXR0ci5nZXRGb3JlZ3JvdW5kKCksIGJnQ29sb3IsIGF0dHIuZ2V0U3R5bGUoKSkpOwotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBjb2xvcktleSBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhbmQgYWRkcyB0aGUgc3R5bGUKLQkgKiBpbmZvcm1hdGlvbiB0byBsaXN0IG9mIFRleHRBdHRyaWJ1dGVzCi0JICogCi0JICogQHBhcmFtIGNvbG9yS2V5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEphdmFUZXh0QXR0cmlidXRlKFN0cmluZyBjb2xvcktleSkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHN0b3JlICE9IG51bGwgJiYgY29sb3JLZXkgIT0gbnVsbCkgewotCQkJVGV4dEF0dHJpYnV0ZSB0YSA9IG51bGw7Ci0JCQlpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQRUwuRUxfS0VZV09SRCkgewotCQkJCS8vIGtleXdvcmQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9ERUZBVUxUKSB7Ci0JCQkJLy8gZGVmYXVsdAotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9JVEFMSUMpOwotCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBzdHlsZSk7Ci0JCQl9Ci0JCQlpZiAodGEgIT0gbnVsbCkgewotCQkJCWdldFRleHRBdHRyaWJ1dGVzKCkucHV0KGNvbG9yS2V5LCB0YSk7Ci0JCQkJZlNjYW5uZXIuc2V0VG9rZW5EYXRhKGNvbG9yS2V5LCB0YSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdGV4dCBhdHRyaWJ1dGUgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gdG9rZW4uIElmIHRoZSB0b2tlbidzCi0JICogZGF0YSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gYW5kIGEgdGV4dCBhdHRyaWJ1dGUgaXQgaXMgYXNzdW1lZCB0aGF0Ci0JICogaXQgaXMgdGhlIGVuY29kZWQgdGV4dCBhdHRyaWJ1dGUuIEl0IHJldHVybnMgdGhlIGRlZmF1bHQgdGV4dCBhdHRyaWJ1dGUKLQkgKiBpZiB0aGVyZSBpcyBubyBlbmNvZGVkIHRleHQgYXR0cmlidXRlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqICAgICAgICAgICAgdGhlIHRva2VuIHdob3NlIHRleHQgYXR0cmlidXRlIGlzIHRvIGJlIGRldGVybWluZWQKLQkgKiBAcmV0dXJuIHRoZSB0b2tlbidzIHRleHQgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldFRva2VuVGV4dEF0dHJpYnV0ZShJVG9rZW4gdG9rZW4pIHsKLQkJVGV4dEF0dHJpYnV0ZSB0YSA9IG51bGw7Ci0KLQkJT2JqZWN0IGRhdGEgPSB0b2tlbi5nZXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgVGV4dEF0dHJpYnV0ZSkKLQkJCXRhID0gKFRleHRBdHRyaWJ1dGUpIGRhdGE7Ci0JCWVsc2UgewotCQkJdGEgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0RFRkFVTFQpOwotCQl9Ci0JCXJldHVybiB0YTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0KLQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0tFWVdPUkQpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVCk7Ci0KLQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCQlTdHJpbmcgamF2YVN0eWxlS2V5ID0gbnVsbDsKLQotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZLZXkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJLy8gY2hlY2sgaWYgcHJlZmVyZW5jZSBjaGFuZ2VkIGlzIGEgc3R5bGUgcHJlZmVyZW5jZQotCQkJaWYgKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVI7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRC5lcXVhbHMocHJlZktleSkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9LRVlXT1JEOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRC5lcXVhbHMocHJlZktleSkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9ERUZBVUxUOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJfQotCQlpZiAoamF2YVN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShqYXZhU3R5bGVLZXkpOwotCQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JCX0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwgfHwgamF2YVN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIGZvcmNlIGEgZnVsbCB1cGRhdGUgb2YgdGhlIHRleHQgdmlld2VyCi0JCQlmUmVjSGlnaGxpZ2h0ZXIucmVmcmVzaERpc3BsYXkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IHNzc3NyZXF1ZXN0ZWRTdGFydCwgaW50IHNzc3NyZXF1ZXN0ZWRMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQl0cnkgewotCQkJLy8gaWRlYWxseSwgZXZlbnR1YWxseSwgd2UnbGwgaGF2ZSBhICJ2aXJ0dWFsRG9jdW1lbnQiIHdlIGNhbgotCQkJLy8gcmVmZXIgdG8sIGJ1dCBmb3Igbm93IC4uLiB3ZSdsbCBzaW1wbGUgcmVzY2FuIHRoZSBvbmUgcmVnaW9uLgotCQkJLy8gdXNlIHNpbXBsZSBhZGp1c3RtZW50IChzaW5jZSAic3ViLWNvbnRlbnQiIHN0YXJ0cyBhdCAwCi0JCQlpbnQgb2Zmc2V0QWRqdXN0bWVudCA9IHR5cGVkUmVnaW9uLmdldE9mZnNldCgpOwotCQkJU3RyaW5nIGNvbnRlbnQgPSBmRG9jdW1lbnQuZ2V0KHR5cGVkUmVnaW9uLmdldE9mZnNldCgpLCB0eXBlZFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoY29udGVudCk7Ci0KLQkJCWludCBsYXN0U3RhcnQgPSAwOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlJVG9rZW4gbGFzdFRva2VuID0gVG9rZW4uVU5ERUZJTkVEOwotCi0JCQlpbnQgcmVtYWluaW5nTGVuZ3RoID0gdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlmU2Nhbm5lci5zZXRSYW5nZShkb2N1bWVudCwgbGFzdFN0YXJ0LCByZW1haW5pbmdMZW5ndGgpOwotCi0JCQl3aGlsZSAodHJ1ZSkgewotCi0JCQkJSVRva2VuIHRva2VuID0gZlNjYW5uZXIubmV4dFRva2VuKCk7Ci0KLQkJCQlpZiAodG9rZW4uaXNFT0YoKSkgewotCQkJCQlpZiAoIWxhc3RUb2tlbi5pc1VuZGVmaW5lZCgpICYmIGxlbmd0aCAhPSAwKQotCQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCArIG9mZnNldEFkanVzdG1lbnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAodG9rZW4uaXNXaGl0ZXNwYWNlKCkpIHsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmIChsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSkgewotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICh0b2tlbiAhPSBsYXN0VG9rZW4pIHsKLQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCArIG9mZnNldEFkanVzdG1lbnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGFzdFN0YXJ0ID0gZlNjYW5uZXIuZ2V0VG9rZW5PZmZzZXQoKTsKLQkJCQkJbGVuZ3RoID0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvIHN0b3Agb3RoZXIKLQkJCS8vIGhpZ2hsaWdodGluZywgaWYgaXQgZG9lcy4KLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKSB7Ci0JCWdldENvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQlnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVuUmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJZ2V0Q29sb3JQcmVmZXJlbmNlcygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCWdldEphdmFDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3MzcxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBQcm92aWRlcyBjb250ZXh0IGhlbHAgZm9yIEpTUCB0YWdzIChTaG93IHRvb2x0aXAgZGVzY3JpcHRpb24pCi0gKiAKLSAqIEBkZXByZWNhdGVkIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgICAgICAgaW5mb3JtYXRpb24gcHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEpTUEluZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24gewotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQotCXB1YmxpYyBKU1BJbmZvcm1hdGlvblByb3ZpZGVyKCkgewotCQlmVGV4dEhvdmVyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbjIoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVySW5mbyh0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OThjYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NIb3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhZG9jQ29udGVudEFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC50ZXh0Lmh0bWwuSFRNTFByaW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uQWJzdHJhY3RIb3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotICogUHJvdmlkZXMgamF2YWRvYyBob3ZlciBoZWxwIGRvY3VtZW50YXRpb24gZm9yIGphdmEgY29kZSBpbnNpZGUgSlNQcwotICovCi1wdWJsaWMgY2xhc3MgSlNQSmF2YUphdmFkb2NIb3ZlclByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0SG92ZXJQcm9jZXNzb3IgewotCS8qCi0JICogQnVsayBvZiB0aGUgd29yayB3YXMgY29waWVkIGZyb20KLQkgKiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLmhvdmVyLkphdmFkb2NIb3ZlcgotCSAqLwotCXByaXZhdGUgZmluYWwgbG9uZyBMQUJFTF9GTEFHUyA9IEphdmFFbGVtZW50TGFiZWxzLkFMTF9GVUxMWV9RVUFMSUZJRUQgfCBKYXZhRWxlbWVudExhYmVscy5NX1BSRV9SRVRVUk5UWVBFIHwgSmF2YUVsZW1lbnRMYWJlbHMuTV9QQVJBTUVURVJfVFlQRVMgfCBKYXZhRWxlbWVudExhYmVscy5NX1BBUkFNRVRFUl9OQU1FUyB8IEphdmFFbGVtZW50TGFiZWxzLk1fRVhDRVBUSU9OUyB8IEphdmFFbGVtZW50TGFiZWxzLkZfUFJFX1RZUEVfU0lHTkFUVVJFIHwgSmF2YUVsZW1lbnRMYWJlbHMuTV9QUkVfVFlQRV9QQVJBTUVURVJTIHwgSmF2YUVsZW1lbnRMYWJlbHMuVF9UWVBFX1BBUkFNRVRFUlMgfCBKYXZhRWxlbWVudExhYmVscy5VU0VfUkVTT0xWRUQ7Ci0JcHJpdmF0ZSBmaW5hbCBsb25nIExPQ0FMX1ZBUklBQkxFX0ZMQUdTID0gTEFCRUxfRkxBR1MgJiB+SmF2YUVsZW1lbnRMYWJlbHMuRl9GVUxMWV9RVUFMSUZJRUQgfCBKYXZhRWxlbWVudExhYmVscy5GX1BPU1RfUVVBTElGSUVEOwotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SG92ZXJJbmZvKElKYXZhRWxlbWVudFtdIHJlc3VsdCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgblJlc3VsdHMgPSByZXN1bHQubGVuZ3RoOwotCQlpZiAoblJlc3VsdHMgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChuUmVzdWx0cyA+IDEpIHsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCQlIVE1MUHJpbnRlci5zdGFydEJ1bGxldExpc3QoYnVmZmVyKTsKLQkJCQlJSmF2YUVsZW1lbnQgY3VyciA9IHJlc3VsdFtpXTsKLQkJCQlpZiAoY3VyciBpbnN0YW5jZW9mIElNZW1iZXIgfHwgY3Vyci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSkKLQkJCQkJSFRNTFByaW50ZXIuYWRkQnVsbGV0KGJ1ZmZlciwgZ2V0SW5mb1RleHQoY3VycikpOwotCQkJCUhUTUxQcmludGVyLmVuZEJ1bGxldExpc3QoYnVmZmVyKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UgewotCi0JCQlJSmF2YUVsZW1lbnQgY3VyciA9IHJlc3VsdFswXTsKLQkJCWlmIChjdXJyIGluc3RhbmNlb2YgSU1lbWJlcikgewotCQkJCUlNZW1iZXIgbWVtYmVyID0gKElNZW1iZXIpIGN1cnI7Ci0JCQkJSFRNTFByaW50ZXIuYWRkU21hbGxIZWFkZXIoYnVmZmVyLCBnZXRJbmZvVGV4dChtZW1iZXIpKTsKLQkJCQlSZWFkZXIgcmVhZGVyOwotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlciA9IEphdmFkb2NDb250ZW50QWNjZXNzLmdldEhUTUxDb250ZW50UmVhZGVyKG1lbWJlciwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCQlIVE1MUHJpbnRlci5hZGRQYXJhZ3JhcGgoYnVmZmVyLCByZWFkZXIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUgfHwgY3Vyci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFX1BBUkFNRVRFUikKLQkJCQlIVE1MUHJpbnRlci5hZGRTbWFsbEhlYWRlcihidWZmZXIsIGdldEluZm9UZXh0KGN1cnIpKTsKLQkJfQotCi0JCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlIVE1MUHJpbnRlci5pbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgMCk7Ci0JCQlIVE1MUHJpbnRlci5hZGRQYWdlRXBpbG9nKGJ1ZmZlcik7Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlciNnZXRIb3ZlckluZm8ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIGhvdmVyUmVnaW9uKSB7Ci0JCS8vIGdldCBKU1AgdHJhbnNsYXRpb24gb2JqZWN0IGZvciB0aGlzIHZpZXdlcidzIGRvY3VtZW50Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodGV4dFZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJdHJ5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJSURPTURvY3VtZW50IHhtbERvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBhZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCQkJCQotCQkJCQlJSmF2YUVsZW1lbnRbXSByZXN1bHQgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKSwgaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCkgKyBob3ZlclJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCXJldHVybiB0cmFuc2xhdGlvbi5maXh1cE1hbmdsZWROYW1lKGdldEhvdmVySW5mbyhyZXN1bHQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlciNnZXRIb3ZlclJlZ2lvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIEphdmFXb3JkRmluZGVyLmZpbmRXb3JkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmZvVGV4dChJSmF2YUVsZW1lbnQgbWVtYmVyKSB7Ci0JCWxvbmcgZmxhZ3MgPSBtZW1iZXIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUgPyBMT0NBTF9WQVJJQUJMRV9GTEFHUyA6IExBQkVMX0ZMQUdTOwotCQlTdHJpbmcgbGFiZWwgPSBKYXZhRWxlbWVudExhYmVscy5nZXRFbGVtZW50TGFiZWwobWVtYmVyLCBmbGFncyk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWwubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IGxhYmVsLmNoYXJBdChpKTsKLQkJCWlmIChjaCA9PSAnPCcpIHsKLQkJCQlidWYuYXBwZW5kKCImbHQ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGNoID09ICc+JykgewotCQkJCWJ1Zi5hcHBlbmQoIiZndDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZChjaCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYTA2ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBQcm92aWRlcyBqYXZhZG9jIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIGphdmEgY29kZSBpbnNpZGUgSlNQcyAoU2hvd3MKLSAqIHRvb2x0aXAgZGVzY3JpcHRpb24pCi0gKiAKLSAqIEBkZXByZWNhdGVkIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgICAgICAgaW5mb3JtYXRpb24gcHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEpTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElJbmZvcm1hdGlvblByb3ZpZGVyLCBJSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBJVGV4dEhvdmVyIGZUZXh0SG92ZXIgPSBudWxsOwotCi0JcHVibGljIEpTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlcigpIHsKLQkJZlRleHRIb3ZlciA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXh0SG92ZXJNYW5hZ2VyKCkuY3JlYXRlQmVzdE1hdGNoSG92ZXIobmV3IEpTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3IoKSk7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0U3ViamVjdChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVyUmVnaW9uKHRleHRWaWV3ZXIsIG9mZnNldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldEluZm9ybWF0aW9uMih0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uMihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJJbmZvKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMmE3YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRhZ2luZm8uSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiBQcm92aWRlcyBob3ZlciBoZWxwIGRvY3VtZW50YXRpb24gZm9yIEpTUCB0YWdzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUYWdJbmZvSG92ZXJQcm9jZXNzb3IgZXh0ZW5kcyBIVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVJlZ2lvbkhlbHAoSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCi0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlSlNQRGlySGVscCgoSURPTU5vZGUpIHRyZWVOb2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlCi0JCQlyZXN1bHQgPSBzdXBlci5jb21wdXRlUmVnaW9uSGVscCh0cmVlTm9kZSwgcGFyZW50Tm9kZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaG92ZXIgaGVscCBmb3IgdGhlIGpzcCBkaXJlY3RpdmUgbmFtZQotCSAqIGZvciBub3csIHRyZWF0IGpzcCBkaXJlY3RpdmVzIGxpa2UgYW55IG90aGVyIHRhZyBuYW1lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlSlNQRGlySGVscChJRE9NTm9kZSB4bWxub2RlLCBJRE9NTm9kZSBwYXJlbnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIGNvbXB1dGVUYWdOYW1lSGVscCh4bWxub2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0phdmFXb3JkRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KYXZhV29yZEZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUxMDllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0phdmFXb3JkRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci0KLS8qKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YVdvcmRGaW5kZXIKLSAqLwotY2xhc3MgSmF2YVdvcmRGaW5kZXIgewotCQotCXB1YmxpYyBzdGF0aWMgSVJlZ2lvbiBmaW5kV29yZChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJCi0JCWludCBzdGFydD0gLTE7Ci0JCWludCBlbmQ9IC0xOwotCQkKLQkJCi0JCXRyeSB7Ci0JCQkKLQkJCWludCBwb3M9IG9mZnNldDsKLQkJCWNoYXIgYzsKLQkJCQotCQkJd2hpbGUgKHBvcyA+PSAwKSB7Ci0JCQkJYz0gZG9jdW1lbnQuZ2V0Q2hhcihwb3MpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQotCQkJCQlicmVhazsKLQkJCQktLXBvczsKLQkJCX0KLQkJCQotCQkJc3RhcnQ9IHBvczsKLQkJCQotCQkJcG9zPSBvZmZzZXQ7Ci0JCQlpbnQgbGVuZ3RoPSBkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJCQotCQkJd2hpbGUgKHBvcyA8IGxlbmd0aCkgewotCQkJCWM9IGRvY3VtZW50LmdldENoYXIocG9zKTsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkKLQkJCQkJYnJlYWs7Ci0JCQkJKytwb3M7Ci0JCQl9Ci0JCQkKLQkJCWVuZD0gcG9zOwotCQkJCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfQotCQkKLQkJaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gLTEpIHsKLQkJCWlmIChzdGFydCA9PSBvZmZzZXQgJiYgZW5kID09IG9mZnNldCkKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihvZmZzZXQsIDApOwotCQkJZWxzZSBpZiAoc3RhcnQgPT0gb2Zmc2V0KQotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjEwNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJKU1AgZXh0ZW5kcyBTaW1wbGVUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19UWVBFID0gZ2V0RW5jb2RpbmdUeXBlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RpbmdUeXBlKCkgewotCQlyZXR1cm4gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZW5jb2RpbmcgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJKU1AoKSB7Ci0JCXN1cGVyKEVOQ09ESU5HX1RZUEUsIEpTUFVJTWVzc2FnZXMuQ3JlYXRpbmdfZmlsZXNfZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShUZW1wbGF0ZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzc3ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTCA9IGdldEFsbCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFID0gZ2V0QXR0cmlidXRlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXID0gZ2V0TmV3KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBnZXRUYWcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19UQUcgPSAidGFnX25ldyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWxsKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2FsbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYXR0cmlidXRlX3ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXcoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfbmV3IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiAianNwIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUYWcoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfdGFnIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTE5ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIEpTUCB0ZW1wbGF0ZSBjb250ZXh0IHR5cGVzLiBUZW1wbGF0ZXMgb2YgdGhpcyBjb250ZXh0IHR5cGUKLSAqIGFwcGx5IHRvIGFueSBwbGFjZSB3aXRoaW4gSlNQIGNvbnRlbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVKU1AgZXh0ZW5kcyBUZW1wbGF0ZUNvbnRleHRUeXBlIHsKLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZUpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkN1cnNvcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5MaW5lU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0pTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0pTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzYzQxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KU1BEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0LkRvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyd7JywgJ30nLCAnKCcsICcpJywgJ1snLCAnXScsJyInLCciJywnXCcnLCdcJyd9OwotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgSlNQRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4sIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlR9LCBuZXcgSmF2YVBhaXJNYXRjaGVyKEJSQUNLRVRTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFDb2RlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiODAyMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5kZXJpdmVkLlNpbmdsZUNoYXJSZWFkZXI7Ci0KLQotLyoqCi0gKiBSZWFkcyBmcm9tIGEgZG9jdW1lbnQgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcy4gTWF5IGJlIGNvbmZpZ3VyZWQgdG8KLSAqIHNraXAgY29tbWVudHMgYW5kIHN0cmluZ3MuCi0gKiAKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0IHNvIHdlIGRvbid0IGhhdmUgdG8KLSAqIGRlcGVuZCBvbiB0aGUgb3JnLmVjbGlwc2UuamR0LnVpIHBsdWdpbi4KLSAqIAotICogTm8gbW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUuCi0gKi8KLWNsYXNzIEphdmFDb2RlUmVhZGVyIGV4dGVuZHMgU2luZ2xlQ2hhclJlYWRlciB7Ci0KLQkvKiogVGhlIEVPRiBjaGFyYWN0ZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0YgPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiBmU2tpcENvbW1lbnRzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZTa2lwU3RyaW5ncyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmRm9yd2FyZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0KLQlwcml2YXRlIGludCBmRW5kID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVOdW1iZXIgPSAtMTsKLQlwcml2YXRlIGludCBmQ2FjaGVkTGluZU9mZnNldCA9IC0xOwotCi0KLQlwdWJsaWMgSmF2YUNvZGVSZWFkZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IHJlYWQgY2hhcmFjdGVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgcmVhZCBoYXMgYmVlbiBjYWxsZWQuCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRm9yd2FyZCA/IGZPZmZzZXQgLSAxIDogZk9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVGb3J3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQotCQlmRm9yd2FyZCA9IHRydWU7Ci0JCWZFbmQgPSBNYXRoLm1pbihmRG9jdW1lbnQuZ2V0TGVuZ3RoKCksIGZPZmZzZXQgKyBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUJhY2t3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQotCQlmRm9yd2FyZCA9IGZhbHNlOwotCQl0cnkgewotCQkJZkNhY2hlZExpbmVOdW1iZXIgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oeC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlYWRlciNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBTaW5nbGVDaGFyUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZkZvcndhcmQgPyByZWFkRm9yd2FyZHMoKSA6IHJlYWRCYWNrd2FyZHMoKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvQ29tbWVudEVuZCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQkJCWlmIChjdXJyZW50ID09ICcqJykgewotCQkJCWlmIChmT2Zmc2V0IDwgZkVuZCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KSA9PSAnLycpIHsKLQkJCQkJKytmT2Zmc2V0OwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9TdHJpbmdFbmQoY2hhciBkZWxpbWl0ZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQkJCWlmIChjdXJyZW50ID09ICdcXCcpIHsKLQkJCQkvLyBpZ25vcmUgZXNjYXBlZCBjaGFyYWN0ZXJzCi0JCQkJKytmT2Zmc2V0OwotCQkJfQotCQkJZWxzZSBpZiAoY3VycmVudCA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b0xpbmVFbmQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCWZPZmZzZXQgPSBmRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lICsgMSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVhZEZvcndhcmRzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCi0JCQlzd2l0Y2ggKGN1cnJlbnQpIHsKLQkJCQljYXNlICcvJyA6Ci0KLQkJCQkJaWYgKGZTa2lwQ29tbWVudHMgJiYgZk9mZnNldCA8IGZFbmQpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBlbmQKLQkJCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCQkJZ290b0NvbW1lbnRFbmQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG5leHQgPT0gJy8nKSB7Ci0JCQkJCQkJLy8gJy8vJy1jb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgbGluZSBlbmQKLQkJCQkJCQlnb3RvTGluZUVuZCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0KLQkJCQljYXNlICciJyA6Ci0JCQkJY2FzZSAnXCcnIDoKLQotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQlnb3RvU3RyaW5nRW5kKGN1cnJlbnQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQkJCX0KLQotCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCX0KLQotCQlyZXR1cm4gRU9GOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTaW5nbGVMaW5lQ29tbWVudCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJaWYgKGxpbmUgPCBmQ2FjaGVkTGluZU51bWJlcikgewotCQkJZkNhY2hlZExpbmVOdW1iZXIgPSBsaW5lOwotCQkJZkNhY2hlZExpbmVPZmZzZXQgPSBmRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCWludCBvZmZzZXQgPSBmT2Zmc2V0OwotCQkJd2hpbGUgKGZDYWNoZWRMaW5lT2Zmc2V0IDwgb2Zmc2V0KSB7Ci0JCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIob2Zmc2V0LS0pOwotCQkJCWlmIChjdXJyZW50ID09ICcvJyAmJiBmQ2FjaGVkTGluZU9mZnNldCA8PSBvZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIob2Zmc2V0KSA9PSAnLycpIHsKLQkJCQkJZk9mZnNldCA9IG9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvQ29tbWVudFN0YXJ0KCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0LS0pOwotCQkJaWYgKGN1cnJlbnQgPT0gJyonICYmIDAgPD0gZk9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KSA9PSAnLycpCi0JCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9TdHJpbmdTdGFydChjaGFyIGRlbGltaXRlcikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCWlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCWlmICghKDAgPD0gZk9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSkgPT0gJ1xcJykpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCS0tZk9mZnNldDsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHJlYWRCYWNrd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCi0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJLS1mT2Zmc2V0OwotCi0JCQloYW5kbGVTaW5nbGVMaW5lQ29tbWVudCgpOwotCi0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCXN3aXRjaCAoY3VycmVudCkgewotCQkJCWNhc2UgJy8nIDoKLQotCQkJCQlpZiAoZlNraXBDb21tZW50cyAmJiBmT2Zmc2V0ID4gMSkgewotCQkJCQkJY2hhciBuZXh0ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCAtIDEpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IGVuZHMsIGFkdmFuY2UgdG8gdGhlIGNvbW1lbnQgc3RhcnQKLQkJCQkJCQlmT2Zmc2V0IC09IDI7Ci0JCQkJCQkJZ290b0NvbW1lbnRTdGFydCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0KLQkJCQljYXNlICciJyA6Ci0JCQkJY2FzZSAnXCcnIDoKLQotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQktLWZPZmZzZXQ7Ci0JCQkJCQlnb3RvU3RyaW5nU3RhcnQoY3VycmVudCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCQkJfQotCi0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCi0JCXJldHVybiBFT0Y7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YVBhaXJNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2ZmZkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgbWF0Y2ggcGFpcnMgb2YgY2hhcmFjdGVycy4KLSAqCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dCBzbyB3ZSBkb24ndCBoYXZlIHRvCi0gKiBkZXBlbmQgb24gdGhlIG9yZy5lY2xpcHNlLmpkdC51aSBwbHVnaW4uCi0gKiAKLSAqIE5vIG1vZGlmaWNhdGlvbnMgd2VyZSBtYWRlLgotICovCi1jbGFzcyBKYXZhUGFpck1hdGNoZXIgaW1wbGVtZW50cyBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgewotCi0JcHJvdGVjdGVkIGNoYXJbXSBmUGFpcnM7Ci0JcHJvdGVjdGVkIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIGludCBmT2Zmc2V0OwotCi0JcHJvdGVjdGVkIGludCBmU3RhcnRQb3M7Ci0JcHJvdGVjdGVkIGludCBmRW5kUG9zOwotCXByb3RlY3RlZCBpbnQgZkFuY2hvcjsKLQotCXByb3RlY3RlZCBKYXZhQ29kZVJlYWRlciBmUmVhZGVyID0gbmV3IEphdmFDb2RlUmVhZGVyKCk7Ci0KLQotCXB1YmxpYyBKYXZhUGFpck1hdGNoZXIoY2hhcltdIHBhaXJzKSB7Ci0JCWZQYWlycyA9IHBhaXJzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNtYXRjaChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIG1hdGNoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCi0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0KLQkJaWYgKGZPZmZzZXQgPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsICYmIG1hdGNoUGFpcnNBdCgpICYmIGZTdGFydFBvcyAhPSBmRW5kUG9zKQotCQkJcmV0dXJuIG5ldyBSZWdpb24oZlN0YXJ0UG9zLCBmRW5kUG9zIC0gZlN0YXJ0UG9zICsgMSk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2dldEFuY2hvcigpCi0JICovCi0JcHVibGljIGludCBnZXRBbmNob3IoKSB7Ci0JCXJldHVybiBmQW5jaG9yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljbGVhcigpOwotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUmVhZGVyID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKGZSZWFkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmUmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hQYWlyc0F0KCkgewotCi0JCWludCBpOwotCQlpbnQgcGFpckluZGV4MSA9IGZQYWlycy5sZW5ndGg7Ci0JCWludCBwYWlySW5kZXgyID0gZlBhaXJzLmxlbmd0aDsKLQotCQlmU3RhcnRQb3MgPSAtMTsKLQkJZkVuZFBvcyA9IC0xOwotCi0JCS8vIGdldCB0aGUgY2hhcnMgcHJlY2VkaW5nIGFuZCBmb2xsb3dpbmcgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JCXRyeSB7Ci0KLQkJCWNoYXIgcHJldkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihNYXRoLm1heChmT2Zmc2V0IC0gMSwgMCkpOwotCQkJLy8gbW9kaWZpZWQgYmVoYXZpb3IgZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4NzkJCQkKLQkJCS8vCQkJY2hhciBuZXh0Q2hhcj0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0KLQkJCS8vIHNlYXJjaCBmb3Igb3BlbmluZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJLy8JCQkJaWYgKG5leHRDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCS8vCQkJCQlmU3RhcnRQb3M9IGZPZmZzZXQ7Ci0JCQkJLy8JCQkJCXBhaXJJbmRleDE9IGk7Ci0JCQkJLy8JCQkJfSBlbHNlIAotCQkJCWlmIChwcmV2Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkJZlN0YXJ0UG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDEgPSBpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc2VhcmNoIGZvciBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIG5leHQgdG8gdGhlIGFjdGl2YXRpb24gcG9pbnQKLQkJCWZvciAoaSA9IDE7IGkgPCBmUGFpcnMubGVuZ3RoOyBpID0gaSArIDIpIHsKLQkJCQlpZiAocHJldkNoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJCWZFbmRQb3MgPSBmT2Zmc2V0IC0gMTsKLQkJCQkJcGFpckluZGV4MiA9IGk7Ci0JCQkJfQotCQkJCS8vCQkJCWVsc2UgaWYgKG5leHRDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCS8vCQkJCQlmRW5kUG9zPSBmT2Zmc2V0OwotCQkJCS8vCQkJCQlwYWlySW5kZXgyPSBpOwotCQkJCS8vCQkJCX0KLQkJCX0KLQotCQkJaWYgKGZFbmRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBSSUdIVDsKLQkJCQlmU3RhcnRQb3MgPSBzZWFyY2hGb3JPcGVuaW5nUGVlcihmRW5kUG9zLCBmUGFpcnNbcGFpckluZGV4MiAtIDFdLCBmUGFpcnNbcGFpckluZGV4Ml0sIGZEb2N1bWVudCk7Ci0JCQkJaWYgKGZTdGFydFBvcyA+IC0xKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWZFbmRQb3MgPSAtMTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZTdGFydFBvcyA+IC0xKSB7Ci0JCQkJZkFuY2hvciA9IExFRlQ7Ci0JCQkJZkVuZFBvcyA9IHNlYXJjaEZvckNsb3NpbmdQZWVyKGZTdGFydFBvcywgZlBhaXJzW3BhaXJJbmRleDFdLCBmUGFpcnNbcGFpckluZGV4MSArIDFdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmRW5kUG9zID4gLTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZlN0YXJ0UG9zID0gLTE7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBzZWFyY2hGb3JDbG9zaW5nUGVlcihpbnQgb2Zmc2V0LCBpbnQgb3BlbmluZ1BlZXIsIGludCBjbG9zaW5nUGVlciwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWZSZWFkZXIuY29uZmlndXJlRm9yd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0ICsgMSwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCksIHRydWUsIHRydWUpOwotCi0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEphdmFDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gb3BlbmluZ1BlZXIgJiYgYyAhPSBjbG9zaW5nUGVlcikKLQkJCQlzdGFjaysrOwotCQkJZWxzZSBpZiAoYyA9PSBjbG9zaW5nUGVlcikKLQkJCQlzdGFjay0tOwotCi0JCQlpZiAoc3RhY2sgPT0gMCkKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQotCQkJYyA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yT3BlbmluZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlmUmVhZGVyLmNvbmZpZ3VyZUJhY2t3YXJkUmVhZGVyKGRvY3VtZW50LCBvZmZzZXQsIHRydWUsIHRydWUpOwotCi0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEphdmFDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gY2xvc2luZ1BlZXIgJiYgYyAhPSBvcGVuaW5nUGVlcikKLQkJCQlzdGFjaysrOwotCQkJZWxzZSBpZiAoYyA9PSBvcGVuaW5nUGVlcikKLQkJCQlzdGFjay0tOwotCi0JCQlpZiAoc3RhY2sgPT0gMCkKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQotCQkJYyA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBmYWJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLkVycm9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoKLSAqIENvcGllZCBmcm9tIGpzcC5jb3JlJ3MgSFRNTFZhbGlkYXRpb25SZXBvcnRlcgotICovCi1jbGFzcyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblJlcG9ydGVyIHsKLQlwcml2YXRlIElWYWxpZGF0b3Igb3duZXIgPSBudWxsOwotCXByaXZhdGUgSVJlcG9ydGVyIHJlcG9ydGVyID0gbnVsbDsKLQlwcml2YXRlIElGaWxlIGZpbGUgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBNZXNzYWdlRmFjdG9yeSBmRmFjdG9yeSA9IG51bGw7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIoSVZhbGlkYXRvciBvd25lciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCWZGYWN0b3J5ID0gbmV3IE1lc3NhZ2VGYWN0b3J5KGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLmZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5yZXBvcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMub3duZXIsIHRoaXMuZmlsZSk7Ci0JCX0KLQkJCi0JfQotCi0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsIHx8IHRoaXMuZmlsZSA9PSBudWxsIHx8IG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpCi0JCQlyZXR1cm47Ci0JCUlNZXNzYWdlIG1lcyA9IHRyYW5zbGF0ZU1lc3NhZ2UobWVzc2FnZSk7Ci0KLQkJaWYgKHRoaXMucmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMub3duZXIsIG1lcyk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogVHJhbnNsYXRlIFZhbGlkYXRpb25NZXNzYWdlIHRvIElNZXNzYWdlIGFuZCBnZW5lcmF0ZSByZXN1bHQgbG9nCi0JICovCi0JcHJpdmF0ZSBJTWVzc2FnZSB0cmFuc2xhdGVNZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaW50IHNldmVyaXR5ID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQlzd2l0Y2ggKG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSU5GT1JNQVRJT04gOgotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlJTWVzc2FnZSBtZXMgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXZlcml0eSwgbWVzc2FnZS5nZXRNZXNzYWdlKCksIHRoaXMuZmlsZSk7Ci0JCW1lcy5zZXRPZmZzZXQobWVzc2FnZS5nZXRPZmZzZXQoKSk7Ci0JCW1lcy5zZXRMZW5ndGgobWVzc2FnZS5nZXRMZW5ndGgoKSk7Ci0JCWlmICh0aGlzLm1vZGVsICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZmxhdE1vZGVsID0gdGhpcy5tb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChmbGF0TW9kZWwgIT0gbnVsbCkgewotCQkJCWludCBsaW5lID0gZmxhdE1vZGVsLmdldExpbmVPZk9mZnNldChtZXNzYWdlLmdldE9mZnNldCgpKTsKLQkJCQltZXMuc2V0TGluZU5vKGxpbmUgKyAxKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwb3J0KEVycm9ySW5mbyBpbmZvKSB7Ci0JCXJlcG9ydChmRmFjdG9yeS5jcmVhdGVNZXNzYWdlKGluZm8pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BBY3Rpb25Tb3VyY2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEFjdGlvblNvdXJjZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWIyMGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEFjdGlvblNvdXJjZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEFjdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5GaWxlQnVmZmVyTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBTb3VyY2UgdmFsaWRhdG9yIChhYmxlIHRvIGNoZWNrIHBhcnRpYWwgZG9jdW1lbnQpIHRoYXQgY2hlY2tzIGZvcjogLQotICogbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzICYgdW5kZWZpbmVkIGF0dHJpYnV0ZXMgaW4ganNwIGFjdGlvbiB0YWdzIHN1Y2gKLSAqIGFzIGpzcCBkaXJlY3RpdmVzIGFuZCBqc3AgY3VzdG9tIHRhZ3MKLSAqLwotcHVibGljIGNsYXNzIEpTUEFjdGlvblNvdXJjZVZhbGlkYXRvciBleHRlbmRzIEpTUEFjdGlvblZhbGlkYXRvciBpbXBsZW1lbnRzIElTb3VyY2VWYWxpZGF0b3IgewotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGJvb2xlYW4gZkVuYWJsZVNvdXJjZVZhbGlkYXRpb247Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkpTUEZDb250ZW50VHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQotCQkvLyBzcGVjaWFsIGNoZWNrcyB0byBzZWUgc291cmNlIHZhbGlkYXRpb24gc2hvdWxkIHJlYWxseSBleGVjdXRlCi0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkvLyBUaGUgYmFzZUxvY2F0aW9uIG1heSBiZSBhIHBhdGggb24gZGlzayBvciByZWxhdGl2ZSB0byB0aGUKLQkJCQkvLyB3b3Jrc3BhY2Ugcm9vdC4gRG9uJ3QgdHJhbnNsYXRlIG9uLWRpc2sgcGF0aHMgdG8KLQkJCQkvLyBpbi13b3Jrc3BhY2UgcmVzb3VyY2VzLgotCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLQkJCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpOwotCQkJCQkvKgotCQkJCQkgKiBJZiB0aGUgSUZpbGUgZG9lc24ndCBleGlzdCwgbWFrZSBzdXJlIGl0J3Mgbm90IHJldHVybmVkCi0JCQkJCSAqLwotCQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJCQlmaWxlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWZFbmFibGVTb3VyY2VWYWxpZGF0aW9uID0gKGZpbGUgIT0gbnVsbCAmJiBpc0JhdGNoVmFsaWRhdG9yUHJlZmVyZW5jZUVuYWJsZWQoZmlsZSkgJiYgc2hvdWxkVmFsaWRhdGUoZmlsZSkgJiYgZnJhZ21lbnRDaGVjayhmaWxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUmVnaW9uIGRpcnR5UmVnaW9uLCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGhlbHBlciA9PSBudWxsIHx8IGZEb2N1bWVudCA9PSBudWxsIHx8ICFmRW5hYmxlU291cmNlVmFsaWRhdGlvbikKLQkJCXJldHVybjsKLQotCQlpZiAoKHJlcG9ydGVyICE9IG51bGwpICYmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpID09IHRydWUpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlJVGV4dEZpbGVCdWZmZXIgZmIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKGZEb2N1bWVudCk7Ci0JCQlpZiAoZmIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZiLmdldExvY2F0aW9uKCkpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkKLQkJCQlyZXR1cm47Ci0JCQlwZXJmb3JtVmFsaWRhdGlvbihmaWxlLCByZXBvcnRlciwgbW9kZWwsIGRpcnR5UmVnaW9uKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBjdXJyZW50IHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBiYXNlZCBvbiBjdXJyZW50IHByb2plY3QgKHdoaWNoCi0JICogaXMgYmFzZWQgb24gY3VycmVudCBkb2N1bWVudCkgb3IgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gaWYgcHJvamVjdCBkb2VzCi0JICogbm90IG92ZXJyaWRlCi0JICogCi0JICogQHJldHVybiBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gZ2V0VmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oSUZpbGUgZmlsZSkgewotCQlWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbnVsbDsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCVByb2plY3RDb25maWd1cmF0aW9uIHByb2plY3RDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCQljb25maWd1cmF0aW9uID0gcHJvamVjdENvbmZpZ3VyYXRpb247Ci0JCQkJCWlmIChwcm9qZWN0Q29uZmlndXJhdGlvbiA9PSBudWxsIHx8IHByb2plY3RDb25maWd1cmF0aW9uLnVzZUdsb2JhbFByZWZlcmVuY2UoKSkgewotCQkJCQkJY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHZhbGlkYXRvciBpcyBlbmFibGVkIGFjY29yZGluZyBpbiBWYWxpZGF0aW9uIHByZWZlcmVuY2VzCi0JICogCi0JICogQHBhcmFtIHZtZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCYXRjaFZhbGlkYXRvclByZWZlcmVuY2VFbmFibGVkKElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQlWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0VmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oZmlsZSk7Ci0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhIG1ldGFkYXRhID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKEpTUENvbnRlbnRWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0JCQkJaWYgKCFjb25maWd1cmF0aW9uLmlzQnVpbGRFbmFibGVkKG1ldGFkYXRhKSAmJiAhY29uZmlndXJhdGlvbi5pc01hbnVhbEVuYWJsZWQobWV0YWRhdGEpKQotCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGZpbGUgaXMgYSBqc3AgZnJhZ21lbnQgb3Igbm90LiBJZiBzbywgY2hlY2sgaWYgdGhlIGZyYWdtZW50Ci0JICogc2hvdWxkIGJlIHZhbGlkYXRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIEFzc3VtZXMgc2hvdWxkVmFsaWRhdGUgd2FzIGFscmVhZHkgY2FsbGVkIG9uIGZpbGUgc28gaXQKLQkgKiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbnVsbCBhbmQgZG9lcyBleGlzdAotCSAqIEByZXR1cm4gZmFsc2UgaWYgZmlsZSBpcyBhIGZyYWdtZW50IGFuZCBpdCBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwKLQkgKiAgICAgICAgIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZyYWdtZW50Q2hlY2soSUZpbGUgZmlsZSkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BWYWxpZGF0b3IKLQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZSA9IHRydWU7Ci0JCS8vIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHBvc3NpYmx5IGEganNwIGZyYWdtZW50Ci0JCWlmIChnZXRKU1BGQ29udGVudFR5cGUoKS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotCQkJLy8gZ2V0IHByZWZlcmVuY2UgZm9yIHZhbGlkYXRlIGpzcCBmcmFnbWVudHMKLQkJCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGVGcmFnbWVudHMgPSBCb29sZWFuLnZhbHVlT2YoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5WQUxJREFURV9GUkFHTUVOVFMsIGZpbGUsIHRydWUpKS5ib29sZWFuVmFsdWUoKTsKLQkJCS8qCi0JCQkgKiBpZiBqc3AgZnJhZ21lbnRzIHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLCBjaGVjayBpZiBmaWxlIGlzCi0JCQkgKiByZWFsbHkganNwIGZyYWdtZW50Ci0JCQkgKi8KLQkJCWlmICghc2hvdWxkVmFsaWRhdGVGcmFnbWVudHMpIHsKLQkJCQlib29sZWFuIGlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50KGZpbGUpOwotCQkJCXNob3VsZFZhbGlkYXRlID0gIWlzRnJhZ21lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFZhbGlkYXRlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQgb3Igbm90IChkb2VzIGEgZGVlcCwgaW5kZXB0aCBjaGVjaywKLQkgKiBsb29raW5nIGludG8gY29udGVudHMgb2YgZmlsZSkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYXNzdW1lcyBmaWxlIGlzIG5vdCBudWxsIGFuZCBleGlzdHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50KElGaWxlIGZpbGUpIHsKLQkJLy8gY29waWVkIGZyb20gSlNQVmFsaWRhdG9yCi0JCWJvb2xlYW4gaXNGcmFnbWVudCA9IGZhbHNlOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkvLyBpdCBjYW4gYmUgbnVsbAotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJaXMgPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJY29udGVudERlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoaXMsIGZpbGUuZ2V0TmFtZSgpLCBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVH0pOwotCQkJfQotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZpbGVDdElkID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZ2V0SWQoKTsKLQkJCQlpc0ZyYWdtZW50ID0gKGZpbGVDdElkICE9IG51bGwgJiYgQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUEZSQUdNRU5ULmVxdWFscyhmaWxlQ3RJZCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBhc3N1bWUgaXQncyBpbnZhbGlkIEpTUAotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gbXVzdCBjbG9zZSBpbnB1dCBzdHJlYW0gaW4gY2FzZSBvdGhlcnMgbmVlZCBpdAotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFZhbGlkYXRlKElGaWxlIGZpbGUpIHsKLQkJLy8gY29waWVkIGZyb20gSlNQVmFsaWRhdG9yCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGU7Ci0JCWRvIHsKLQkJCWlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQl3aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBKU1AgZnJhZ21lbnQgY29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybiBqc3BmIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldEpTUEZDb250ZW50VHlwZSgpIHsKLQkJLy8gY29waWVkIGZyb20gSlNQVmFsaWRhdG9yCi0JCWlmIChmSlNQRkNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZKU1BGQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQpOwotCQl9Ci0JCXJldHVybiBmSlNQRkNvbnRlbnRUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUENvbnRlbnRTb3VyY2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUENvbnRlbnRTb3VyY2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiZDg5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BDb250ZW50U291cmNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQQ29udGVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5IVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5GaWxlQnVmZmVyTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFNvdXJjZSB2YWxpZGF0b3IgZm9yIEpTUCBjb250ZW50LiBUaGlzIHZhbGlkYXRvciBjdXJyZW50bHkgb25seSB2YWxpZGF0ZXMKLSAqIGh0bWwgY29udGVudCBpbiBqc3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb250ZW50U291cmNlVmFsaWRhdG9yIGV4dGVuZHMgSlNQQ29udGVudFZhbGlkYXRvciBpbXBsZW1lbnRzIElTb3VyY2VWYWxpZGF0b3IgewotCS8qCi0JICogTW9zdCBvZiB0aGlzIGNsYXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgSVNvdXJjZVZhbGlkYXRvciBhc3BlY3RzIG9mCi0JICogaHRtbC51aSdzIEhUTUxWYWxpZGF0b3IKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGZFbmFibGVTb3VyY2VWYWxpZGF0aW9uOwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZKU1BGQ29udGVudFR5cGUgPSBudWxsOwotCi0JcHVibGljIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0KLQkJLy8gc3BlY2lhbCBjaGVja3MgdG8gc2VlIHNvdXJjZSB2YWxpZGF0aW9uIHNob3VsZCByZWFsbHkgZXhlY3V0ZQotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJLy8gVGhlIGJhc2VMb2NhdGlvbiBtYXkgYmUgYSBwYXRoIG9uIGRpc2sgb3IgcmVsYXRpdmUgdG8gdGhlCi0JCQkJLy8gd29ya3NwYWNlIHJvb3QuIERvbid0IHRyYW5zbGF0ZSBvbi1kaXNrIHBhdGhzIHRvCi0JCQkJLy8gaW4td29ya3NwYWNlIHJlc291cmNlcy4KLQkJCQlJUGF0aCBiYXNlUGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCQkJLyoKLQkJCQkJICogSWYgdGhlIElGaWxlIGRvZXNuJ3QgZXhpc3QsIG1ha2Ugc3VyZSBpdCdzIG5vdCByZXR1cm5lZAotCQkJCQkgKi8KLQkJCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCQkJZmlsZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlmRW5hYmxlU291cmNlVmFsaWRhdGlvbiA9IChmaWxlICE9IG51bGwgJiYgaXNCYXRjaFZhbGlkYXRvclByZWZlcmVuY2VFbmFibGVkKGZpbGUpICYmIHNob3VsZFZhbGlkYXRlKGZpbGUpICYmIGZyYWdtZW50Q2hlY2soZmlsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB2YWxpZGF0ZSBjYWxsIGlzIGZvciB0aGUgSVNvdXJjZVZhbGlkYXRvciBwYXJ0aWFsIGRvY3VtZW50Ci0JICogdmFsaWRhdGlvbiBhcHByb2FjaAotCSAqIAotCSAqIEBwYXJhbSBkaXJ0eVJlZ2lvbgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChoZWxwZXIgPT0gbnVsbCB8fCBmRG9jdW1lbnQgPT0gbnVsbCB8fCAhZkVuYWJsZVNvdXJjZVZhbGlkYXRpb24pCi0JCQlyZXR1cm47Ci0KLQkJaWYgKChyZXBvcnRlciAhPSBudWxsKSAmJiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSA9PSB0cnVlKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQl0cnkgewotCi0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQl9Ci0KLQkJCWlmIChkb2N1bWVudCA9PSBudWxsIHx8ICFoYXNIVE1MRmVhdHVyZShkb2N1bWVudCkpCi0JCQkJcmV0dXJuOyAvLyBpZ25vcmUKLQotCQkJSVRleHRGaWxlQnVmZmVyIGZiID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcihmRG9jdW1lbnQpOwotCQkJaWYgKGZiID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZiLmdldExvY2F0aW9uKCkpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgd3JvbmcgcmVnaW9uIGlmIGl0J3MgVGV4dCAoaW5zdGVhZCBvZiBFbGVtZW50KQotCQkJLy8gd2UgZG9uJ3Qga25vdyBob3cgdG8gdmFsaWRhdGUgVGV4dAotCQkJSW5kZXhlZFJlZ2lvbiBpciA9IGdldENvdmVyaW5nTm9kZShkaXJ0eVJlZ2lvbik7IC8vIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oZGlydHlSZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGlyIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCXdoaWxlIChpciAhPSBudWxsICYmIGlyIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkvLyBpdCdzIGFzc3VtZWQgdGhhdCB0aGlzIGdldHMgdGhlIEluZGV4ZWRSZWdpb24gdG8KLQkJCQkJLy8gdGhlIHJpZ2h0IG9mIHRoZSBlbmQgb2Zmc2V0Ci0JCQkJCWlyID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihpci5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaXIgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0KLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQkJVmFsaWRhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChWYWxpZGF0aW9uQWRhcHRlcikgZmFjdG9yeS5hZGFwdCgoSU5vZGVOb3RpZmllcikgaXIpOwotCQkJCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQkJCWlmIChyZXBvcnRlciAhPSBudWxsKSB7Ci0JCQkJCUhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwID0gbnVsbDsKLQkJCQkJcmVwID0gZ2V0UmVwb3J0ZXIocmVwb3J0ZXIsIGZpbGUsIChJRE9NTW9kZWwpIG1vZGVsKTsKLQkJCQkJcmVwLmNsZWFyKCk7Ci0JCQkJCWFkYXB0ZXIuc2V0UmVwb3J0ZXIocmVwKTsKLQotCQkJCQlNZXNzYWdlIG1lc3MgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKSk7Ci0JCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3MpOwotCQkJCX0KLQkJCQlhZGFwdGVyLnZhbGlkYXRlKGlyKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJbmRleGVkUmVnaW9uIGdldENvdmVyaW5nTm9kZShJUmVnaW9uIGRpcnR5UmVnaW9uKSB7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBsYXJnZXN0UmVnaW9uID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZGlydHlSZWdpb24uZ2V0T2Zmc2V0KCksIGRpcnR5UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCWxhcmdlc3RSZWdpb24gPSBnZXRMYXJnZXN0KHJlZ2lvbnMpOwotCQl9Ci0JCXJldHVybiBsYXJnZXN0UmVnaW9uOwotCX0KLQotCXByaXZhdGUgSW5kZXhlZFJlZ2lvbiBnZXRMYXJnZXN0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBzZFJlZ2lvbnMpIHsKLQotCQlpZiAoc2RSZWdpb25zID09IG51bGwgfHwgc2RSZWdpb25zLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBjdXJyZW50TGFyZ2VzdCA9IGdldENvcnJlc3BvbmRpbmdOb2RlKHNkUmVnaW9uc1swXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2RSZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXNkUmVnaW9uc1tpXS5pc0RlbGV0ZWQoKSkgewotCQkJCUluZGV4ZWRSZWdpb24gY29ycmVzcG9uZGluZyA9IGdldENvcnJlc3BvbmRpbmdOb2RlKHNkUmVnaW9uc1tpXSk7Ci0KLQkJCQlpZiAoY3VycmVudExhcmdlc3QgaW5zdGFuY2VvZiBUZXh0KQotCQkJCQljdXJyZW50TGFyZ2VzdCA9IGNvcnJlc3BvbmRpbmc7Ci0KLQkJCQlpZiAoY29ycmVzcG9uZGluZyAhPSBudWxsKSB7Ci0JCQkJCWlmICghKGNvcnJlc3BvbmRpbmcgaW5zdGFuY2VvZiBUZXh0KSkgewotCQkJCQkJaWYgKGNvcnJlc3BvbmRpbmcuZ2V0U3RhcnRPZmZzZXQoKSA8PSBjdXJyZW50TGFyZ2VzdC5nZXRTdGFydE9mZnNldCgpICYmIGNvcnJlc3BvbmRpbmcuZ2V0RW5kT2Zmc2V0KCkgPj0gY3VycmVudExhcmdlc3QuZ2V0RW5kT2Zmc2V0KCkpCi0JCQkJCQkJY3VycmVudExhcmdlc3QgPSBjb3JyZXNwb25kaW5nOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnRMYXJnZXN0OwotCX0KLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldENvcnJlc3BvbmRpbmdOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJaW5kZXhlZFJlZ2lvbiA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0KCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzSFRNTEZlYXR1cmUoSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWRhcHRlci5oYXNGZWF0dXJlKEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuSFRNTCk7Ci0JfQotCi0JcHJpdmF0ZSBIVE1MVmFsaWRhdGlvblJlcG9ydGVyIGdldFJlcG9ydGVyKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSURPTU1vZGVsIG1vZGVsKSB7Ci0JCXJldHVybiBuZXcgSFRNTFZhbGlkYXRpb25SZXBvcnRlcih0aGlzLCByZXBvcnRlciwgZmlsZSwgbW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgY3VycmVudCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gY3VycmVudCBwcm9qZWN0ICh3aGljaAotCSAqIGlzIGJhc2VkIG9uIGN1cnJlbnQgZG9jdW1lbnQpIG9yIGdsb2JhbCBjb25maWd1cmF0aW9uIGlmIHByb2plY3QgZG9lcwotCSAqIG5vdCBvdmVycmlkZQotCSAqIAotCSAqIEByZXR1cm4gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGdldFZhbGlkYXRpb25Db25maWd1cmF0aW9uKElGaWxlIGZpbGUpIHsKLQkJVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcm9qZWN0Q29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCQkJY29uZmlndXJhdGlvbiA9IHByb2plY3RDb25maWd1cmF0aW9uOwotCQkJCQlpZiAocHJvamVjdENvbmZpZ3VyYXRpb24gPT0gbnVsbCB8fCBwcm9qZWN0Q29uZmlndXJhdGlvbi51c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCQkJCWNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB2YWxpZGF0b3IgaXMgZW5hYmxlZCBhY2NvcmRpbmcgaW4gVmFsaWRhdGlvbiBwcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSB2bWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQmF0Y2hWYWxpZGF0b3JQcmVmZXJlbmNlRW5hYmxlZChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQkJVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldFZhbGlkYXRpb25Db25maWd1cmF0aW9uKGZpbGUpOwotCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YSBtZXRhZGF0YSA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShKU1BDb250ZW50VmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAobWV0YWRhdGEgIT0gbnVsbCkgewotCQkJCWlmICghY29uZmlndXJhdGlvbi5pc0J1aWxkRW5hYmxlZChtZXRhZGF0YSkgJiYgIWNvbmZpZ3VyYXRpb24uaXNNYW51YWxFbmFibGVkKG1ldGFkYXRhKSkKLQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBmaWxlIGlzIGEganNwIGZyYWdtZW50IG9yIG5vdC4gSWYgc28sIGNoZWNrIGlmIHRoZSBmcmFnbWVudAotCSAqIHNob3VsZCBiZSB2YWxpZGF0ZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBBc3N1bWVzIHNob3VsZFZhbGlkYXRlIHdhcyBhbHJlYWR5IGNhbGxlZCBvbiBmaWxlIHNvIGl0Ci0JICogICAgICAgICAgICBzaG91bGQgbm90IGJlIG51bGwgYW5kIGRvZXMgZXhpc3QKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGZpbGUgaXMgYSBmcmFnbWVudCBhbmQgaXQgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsCi0JICogICAgICAgICB0cnVlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmcmFnbWVudENoZWNrKElGaWxlIGZpbGUpIHsKLQkJLy8gY29waWVkIGZyb20gSlNQVmFsaWRhdG9yCi0JCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGUgPSB0cnVlOwotCQkvLyBxdWljayBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBwb3NzaWJseSBhIGpzcCBmcmFnbWVudAotCQlpZiAoZ2V0SlNQRkNvbnRlbnRUeXBlKCkuaXNBc3NvY2lhdGVkV2l0aChmaWxlLmdldE5hbWUoKSkpIHsKLQkJCS8vIGdldCBwcmVmZXJlbmNlIGZvciB2YWxpZGF0ZSBqc3AgZnJhZ21lbnRzCi0JCQlib29sZWFuIHNob3VsZFZhbGlkYXRlRnJhZ21lbnRzID0gQm9vbGVhbi52YWx1ZU9mKEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuVkFMSURBVEVfRlJBR01FTlRTLCBmaWxlLCB0cnVlKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkvKgotCQkJICogaWYganNwIGZyYWdtZW50cyBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwgY2hlY2sgaWYgZmlsZSBpcwotCQkJICogcmVhbGx5IGpzcCBmcmFnbWVudAotCQkJICovCi0JCQlpZiAoIXNob3VsZFZhbGlkYXRlRnJhZ21lbnRzKSB7Ci0JCQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gaXNGcmFnbWVudChmaWxlKTsKLQkJCQlzaG91bGRWYWxpZGF0ZSA9ICFpc0ZyYWdtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBzaG91bGRWYWxpZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGZpbGUgaXMganNwIGZyYWdtZW50IG9yIG5vdCAoZG9lcyBhIGRlZXAsIGluZGVwdGggY2hlY2ssCi0JICogbG9va2luZyBpbnRvIGNvbnRlbnRzIG9mIGZpbGUpCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZmlsZSBpcyBub3QgbnVsbCBhbmQgZXhpc3RzCi0JICogQHJldHVybiB0cnVlIGlmIGZpbGUgaXMganNwIGZyYWdtZW50LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNGcmFnbWVudChJRmlsZSBmaWxlKSB7Ci0JCS8vIGNvcGllZCBmcm9tIEpTUFZhbGlkYXRvcgotCQlib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJLy8gaXQgY2FuIGJlIG51bGwKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJCWlzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKGlzLCBmaWxlLmdldE5hbWUoKSwgbmV3IFF1YWxpZmllZE5hbWVbXXtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVR9KTsKLQkJCX0KLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlQ3RJZCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0JCQkJaXNGcmFnbWVudCA9IChmaWxlQ3RJZCAhPSBudWxsICYmIENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVC5lcXVhbHMoZmlsZUN0SWQpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBhc3N1bWUgaXQncyBpbnZhbGlkIEpTUAotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIG11c3QgY2xvc2UgaW5wdXQgc3RyZWFtIGluIGNhc2Ugb3RoZXJzIG5lZWQgaXQKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3Qgc3VyZSBob3cgdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBpc0ZyYWdtZW50OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJRmlsZSBmaWxlKSB7Ci0JCS8vIGNvcGllZCBmcm9tIEpTUFZhbGlkYXRvcgotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCQlkbyB7Ci0JCQlpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJd2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgSlNQIGZyYWdtZW50IGNvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4ganNwZiBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRKU1BGQ29udGVudFR5cGUoKSB7Ci0JCS8vIGNvcGllZCBmcm9tIEpTUFZhbGlkYXRvcgotCQlpZiAoZkpTUEZDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlmSlNQRkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUEZSQUdNRU5UKTsKLQkJfQotCQlyZXR1cm4gZkpTUEZDb250ZW50VHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODZlMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLQotLyoqCi0gKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgTWVzc2FnZSBhbGwgdmFsaWRhdG9ycyBpbiBwYWNrYWdlIGNhbiB1c2UuCi0gKi8KLWNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCkgewotCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIChPYmplY3QpIHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCQlzZXRMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKLQkJc2V0VGFyZ2V0T2JqZWN0KHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQlyZXR1cm4gX21lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUEZpbGVXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUEZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzYyNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgLDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci0KLWNsYXNzIE5ld0pTUEZpbGVXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHVibGljIE5ld0pTUEZpbGVXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgdGhlIHNlbGVjdGVkIGZvbGRlciB0byB3ZWIgY29udGVudHMKLQkgKiBmb2xkZXIgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIG91dHNpZGUgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCkgewotCQlzdXBlci5pbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKTsKLQotCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCi0JCWlmICh3ZWJDb250ZW50UGF0aCAhPSBudWxsICYmICF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJc2V0Q29udGFpbmVyRnVsbFBhdGgod2ViQ29udGVudFBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIHRvIHNldCBhZGRpdGlvbmFsIHZhbGlkYXRpb24gc3BlY2lmaWMgdG8ganNwCi0JICogZmlsZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAoKGZ1bGxQYXRoICE9IG51bGwpICYmIChmdWxsUGF0aC5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZSAhPSBudWxsKSkgewotCQkJLy8gY2hlY2sgdGhhdCBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGludmFsaWQgZXh0ZW5zaW9uCi0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUCwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBjaGVjayBhZGRpbmcgZGVmYXVsdAotCQkJLy8gZXh0ZW5zaW9uIGRvZXNuJ3QgZXF1YWwgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMKLQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gZnVsbFBhdGguYXBwZW5kKG5ld0ZpbGVOYW1lKTsKLQotCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCUlTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlUGF0aChyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCS8vIHBhdGggaW52YWxpZAotCQkJCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlpZiAoKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHJlc291cmNlUGF0aCkuZXhpc3RzKCkgfHwgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShKU1BVSU1lc3NhZ2VzLlJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCB0aGUgSVByb2plY3QgZm9yIHRoZSBzZWxlY3Rpb24gcGF0aAotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCXNldE1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5fV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVCwgV0FSTklORyk7Ci0JCQkJfQotCQkJCS8vIGlmIGluc2lkZSB3ZWIgcHJvamVjdCwgY2hlY2sgaWYgaW5zaWRlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJaWYgKGlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJLy8gY2hlY2sgdGhhdCB0aGUgcGF0aCBpcyBpbnNpZGUgdGhlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQkJCWlmICghd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCQkJCXNldE1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQsIFdBUk5JTkcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBkZWZhdWx0IGV4dGVuc2lvbiB0byB0aGUgZmlsZW5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGFkZERlZmF1bHRFeHRlbnNpb24oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBuZXdGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZW5hbWUpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgZXh0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0KLQkJbmV3RmlsZU5hbWUuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZU5hbWUuYXBwZW5kKGV4dCk7Ci0KLQkJcmV0dXJuIG5ld0ZpbGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgZmlsZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250ZW50VHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlID09IG51bGwpCi0JCQlmQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zIGZvciBKU1AgQ29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChmVmFsaWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwYXRoCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHdoaWNoIHByb2plY3QgaXMgbmVlZGVkCi0JICogQHJldHVybiBJUHJvamVjdCBvYmplY3QuIElmIHBhdGggaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHJldHVybgotCSAqICAgICAgICAgdmFsdWUgaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tUGF0aChJUGF0aCBwYXRoKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlpZiAod29ya3NwYWNlLnZhbGlkYXRlUGF0aChwYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5QUk9KRUNUKS5pc09LKCkpIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSB3ZWIgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIHdlYiBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNEeW5hbWljV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXMgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCk7Ci0JCXJldHVybiBpczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIGEgdHlwZSBvZiBqYXZhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHByb2plY3QgdG8gYmUgY2hlY2tlZCAoY2Fubm90IGJlIG51bGwpCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIGEgdHlwZSBvZiBqYXZhIHByb2plY3QsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0phdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBpc0phdmEgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlzSmF2YSA9IHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJcmV0dXJuIGlzSmF2YTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB3aGljaCB3ZWIgY29udGVudHMgcGF0aCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQYXRoIG9mIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQYXRoIHBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmdldFdlYkNvbnRlbnRSb290UGF0aChwcm9qZWN0KTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkZTc5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWZTdG9yZSA9IChUZW1wbGF0ZVN0b3JlKSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExhYmVsIHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogTGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZSBuYW1lICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZTsKLQkvKiogVGhlIHZpZXdlciBkaXNwbGF5cyB0aGUgcGF0dGVybiBvZiBzZWxlY3RlZCB0ZW1wbGF0ZS4gKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBmUGF0dGVyblZpZXdlcjsKLQkvKiogVGhlIHRhYmxlIHByZXNlbnRpbmcgdGhlIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKLQkvKiogVGVtcGxhdGUgc3RvcmUgdXNlZCBieSB0aGlzIHdpemFyZCBwYWdlICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCS8qKiBDaGVja2JveCBmb3IgdXNpbmcgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgQnV0dG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbjsKLQotCXB1YmxpYyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZSIsIEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMSk7Ci0JfQotCi0JLyoqCi0JICogQ29ycmVjdGx5IHJlc2l6ZXMgdGhlIHRhYmxlIHNvIG5vIHBoYW50b20gY29sdW1ucyBhcHBlYXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gYnV0dG9ucwotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbnMKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBjb2x1bW4xCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjMKLQkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBjb2x1bW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlVGFibGVSZXNpemluZyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZSB0YWJsZSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMikgewotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLQkJCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4KLQkJCQkJLy8gd2lkdGgKLQkJCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0KLQotCQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQkJaWYgKG9sZFNpemUueCA+IHdpZHRoKSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zCi0JCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0JCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGUgY2hlY2tib3ggZm9yIHVzZXIgdG8gdXNlIEpTUCBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsoaW5uZXJQYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8zKTsKLQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVtcGxhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlmVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKSB7Ci0JCQkJaWYgKChvYmplY3QxIGluc3RhbmNlb2YgVGVtcGxhdGUpICYmIChvYmplY3QyIGluc3RhbmNlb2YgVGVtcGxhdGUpKSB7Ci0JCQkJCVRlbXBsYXRlIGxlZnQgPSAoVGVtcGxhdGUpIG9iamVjdDE7Ci0JCQkJCVRlbXBsYXRlIHJpZ2h0ID0gKFRlbXBsYXRlKSBvYmplY3QyOwotCQkJCQlpbnQgcmVzdWx0ID0gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQlyZXR1cm4gbGVmdC5nZXREZXNjcmlwdGlvbigpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqZWN0MSwgb2JqZWN0Mik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQotCQlmVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCXVwZGF0ZVZpZXdlcklucHV0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIgdGhhdCBkaXNwbGF5cyBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUncyBjb250ZW50cwotCQlmUGF0dGVyblZpZXdlciA9IGRvQ3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJZlRlbXBsYXRlU3RvcmUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCWNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoaW5uZXJQYXJlbnQsIHRhYmxlLCBjb2x1bW4xLCBjb2x1bW4yKTsKLQkJbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5KU1BfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMgYSBzb3VyY2Ugdmlld2VyIHRvIHByZXNlbnQgdGhlIHRlbXBsYXRlCi0JICogcGF0dGVybiBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBDbGllbnRzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEKLQkgKiBjdXN0b20gc291cmNlIHZpZXdlciBmZWF0dXJpbmcgZS5nLiBzeW50YXggY29sb3JpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgc291cmNlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC50ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGUgZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRlbXBsYXRlIHN0cmluZyB0byBpbnNlcnQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm9uZSBpcyB0byBiZSBpbnNlcnRlZAotCSAqLwotCVN0cmluZyBnZXRUZW1wbGF0ZVN0cmluZygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKLQkJCVRlbXBsYXRlQ29udGV4dCBjb250ZXh0ID0gbmV3IERvY3VtZW50VGVtcGxhdGVDb250ZXh0KGNvbnRleHRUeXBlLCBkb2N1bWVudCwgMCwgMCk7Ci0JCQl0cnkgewotCQkJCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IGNvbnRleHQuZXZhbHVhdGUodGVtcGxhdGUpOwotCQkJCXRlbXBsYXRlU3RyaW5nID0gYnVmZmVyLmdldFN0cmluZygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcGxhdGUgZm9yIG5ldyBqc3AiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgSlNQIEZpbGUgd2l6YXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKEpTUFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBKU1AgRmlsZSB3aXphcmQuCi0JICovCi0Jdm9pZCBzYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEpTUFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSB0ZW1wbGF0ZSBpbiB0aGUgdGFibGUgdmlld2VyIGdpdmVuIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZgotCSAqIHRlbXBsYXRlIG5hbWUgY2Fubm90IGJlIGZvdW5kIG9yIHRlbXBsYXRlTmFtZSBpcyBudWxsLCBqdXN0IHNlbGVjdAotCSAqIGZpcnN0IGl0ZW0gaW4gdGFibGUuIElmIG5vIGl0ZW1zIGluIHRhYmxlIHNlbGVjdCBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCU9iamVjdCB0ZW1wbGF0ZSA9IG51bGw7Ci0KLQkJaWYgKHRlbXBsYXRlTmFtZSAhPSBudWxsICYmIHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIHBpY2sgdGhlIGxhc3QgdXNlZCB0ZW1wbGF0ZQotCQkJdGVtcGxhdGUgPSBmVGVtcGxhdGVTdG9yZS5maW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lLCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCX0KLQotCQkvLyBubyByZWNvcmQgb2YgbGFzdCB1c2VkIHRlbXBsYXRlIHNvIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCWlmICh0ZW1wbGF0ZSA9PSBudWxsKSB7Ci0JCQkvLyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQkJdGVtcGxhdGUgPSBmVGFibGVWaWV3ZXIuZ2V0RWxlbWVudEF0KDApOwotCQl9Ci0KLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRlbXBsYXRlKTsKLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHBhdHRlcm4gdmlld2VyLgotCSAqLwotCXZvaWQgdXBkYXRlVmlld2VySW5wdXQoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJfQotCQllbHNlIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3SlNQV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ODFmNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgTmV3SlNQV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JcHJpdmF0ZSBOZXdKU1BGaWxlV2l6YXJkUGFnZSBmTmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZE9wZW5FZGl0b3JPbkZpbmlzaCA9IHRydWU7Ci0KLQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ4NDI0Ci0JcHVibGljIHZvaWQgc2V0T3BlbkVkaXRvck9uRmluaXNoKGJvb2xlYW4gb3BlbkVkaXRvcikgewotCQl0aGlzLmZTaG91bGRPcGVuRWRpdG9yT25GaW5pc2ggPSBvcGVuRWRpdG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZk5ld0ZpbGVQYWdlID0gbmV3IE5ld0pTUEZpbGVXaXphcmRQYWdlKCJKU1BXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhmU2VsZWN0aW9uKSkpOyAvLyROT04tTkxTLTEkIAotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoSlNQVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19IRUFESU5HKTsKLQkJZk5ld0ZpbGVQYWdlLnNldERlc2NyaXB0aW9uKEpTUFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04pOwotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShmTmV3RmlsZVRlbXBsYXRlc1BhZ2UpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGFwcGx5TGluZURlbGltaXRlcihJRmlsZSBmaWxlLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiksIG5ldyBJU2NvcGVDb250ZXh0W10ge25ldyBQcm9qZWN0U2NvcGUoZmlsZS5nZXRQcm9qZWN0KCkpLCBuZXcgSW5zdGFuY2VTY29wZSgpIH0pOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKHRleHQsICJcclxuIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcciIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXG4iLCBsaW5lRGVsaW1pdGVyKTsKLQkJcmV0dXJuIGNvbnZlcnRlZFRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCXNldFdpbmRvd1RpdGxlKEpTUFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfVElUTEUpOwotCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfV0laQkFOX05FV0pTUEZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGFwcGx5TGluZURlbGltaXRlcihmaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBKU1AgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBvcGVuIHRoZSBmaWxlIGluIGVkaXRvcgotCQkJaWYgKGZTaG91bGRPcGVuRWRpdG9yT25GaW5pc2gpCi0JCQkJb3BlbkVkaXRvcihmaWxlKTsKLQotCQkJLy8gZXZlcnl0aGluZydzIGZpbmUKLQkJCXBlcmZvcm1lZE9LID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcGVyZm9ybWVkT0s7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdUYWdGaWxlV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdUYWdGaWxlV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJjYjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3VGFnRmlsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2ICwyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci0KLWNsYXNzIE5ld1RhZ0ZpbGVXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHVibGljIE5ld1RhZ0ZpbGVXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgdGhlIHNlbGVjdGVkIGZvbGRlciB0byB3ZWIgY29udGVudHMKLQkgKiBmb2xkZXIgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIG91dHNpZGUgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCkgewotCQlzdXBlci5pbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKTsKLQotCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCi0JCWlmICh3ZWJDb250ZW50UGF0aCAhPSBudWxsICYmICF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJc2V0Q29udGFpbmVyRnVsbFBhdGgod2ViQ29udGVudFBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIHRvIHNldCBhZGRpdGlvbmFsIHZhbGlkYXRpb24gc3BlY2lmaWMgdG8ganNwCi0JICogZmlsZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAoKGZ1bGxQYXRoICE9IG51bGwpICYmIChmdWxsUGF0aC5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZSAhPSBudWxsKSkgewotCQkJLy8gY2hlY2sgdGhhdCBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGludmFsaWQgZXh0ZW5zaW9uCi0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUCwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBjaGVjayBhZGRpbmcgZGVmYXVsdAotCQkJLy8gZXh0ZW5zaW9uIGRvZXNuJ3QgZXF1YWwgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMKLQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gZnVsbFBhdGguYXBwZW5kKG5ld0ZpbGVOYW1lKTsKLQotCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCUlTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlUGF0aChyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCS8vIHBhdGggaW52YWxpZAotCQkJCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlpZiAoKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHJlc291cmNlUGF0aCkuZXhpc3RzKCkgfHwgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShKU1BVSU1lc3NhZ2VzLlJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCB0aGUgSVByb2plY3QgZm9yIHRoZSBzZWxlY3Rpb24gcGF0aAotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCXNldE1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5fV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVCwgV0FSTklORyk7Ci0JCQkJfQotCQkJCS8vIGlmIGluc2lkZSB3ZWIgcHJvamVjdCwgY2hlY2sgaWYgaW5zaWRlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJLyoKLQkJCQlpZiAoaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJCQkvLyBjaGVjayB0aGF0IHRoZSBwYXRoIGlzIGluc2lkZSB0aGUgd2ViQ29udGVudCBmb2xkZXIKLQkJCQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KS5hcHBlbmQoIi9XRUItSU5GL3RhZ3MiKTsKLQkJCQkJaWYgKCF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJCQkJc2V0TWVzc2FnZShKU1BVSU1lc3NhZ2VzLl9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCwgV0FSTklORyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJKi8KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZGVmYXVsdCBleHRlbnNpb24gdG8gdGhlIGZpbGVuYW1lCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBhZGREZWZhdWx0RXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgbmV3RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbGVuYW1lKTsKLQotLy8JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgZXh0ID0gInRhZyI7Ly9wcmVmZXJlbmNlLmdldFN0cmluZyhKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQotCQluZXdGaWxlTmFtZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQluZXdGaWxlTmFtZS5hcHBlbmQoZXh0KTsKLQotCQlyZXR1cm4gbmV3RmlsZU5hbWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChmQ29udGVudFR5cGUgPT0gbnVsbCkKLQkJCWZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BUQUcpOwotCQlyZXR1cm4gZkNvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIEpTUCBDb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyBpZiBmaWxlTmFtZSBpcyB2YWxpZCBuYW1lIGZvciBjb250ZW50IHR5cGUuIFRha2VzIGJhc2UgY29udGVudAotCSAqIHR5cGUgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRlbnNpb24gaXMgdmFsaWQgZm9yIHRoaXMgY29udGVudCB0eXBlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhbiBleHRlbnNpb24KLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCS8vIGNoZWNrIHdoYXQgY29udGVudCB0eXBlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgZXh0ZW5zaW9uCi0JCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IoZmlsZU5hbWUpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKSB7Ci0JCQkJdmFsaWQgPSB0eXBlc1tpXS5pc0tpbmRPZih0eXBlKTsKLQkJCQkrK2k7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJdmFsaWQgPSB0cnVlOyAvLyBubyBleHRlbnNpb24gc28gdmFsaWQKLQkJcmV0dXJuIHZhbGlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggd2hpY2ggcHJvamVjdCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQcm9qZWN0IG9iamVjdC4gSWYgcGF0aCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgcmV0dXJuCi0JICogICAgICAgICB2YWx1ZSBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21QYXRoKElQYXRoIHBhdGgpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCi0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWlmICh3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLlBST0pFQ1QpLmlzT0soKSkgewotCQkJCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC50b1N0cmluZygpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBhIHdlYiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBwcm9qZWN0IHRvIGJlIGNoZWNrZWQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb2plY3QgaXMgd2ViIHByb2plY3QsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCWJvb2xlYW4gaXNEeW5hbWljV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXMgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCk7Ci0JCXJldHVybiBpczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIGEgdHlwZSBvZiBqYXZhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHByb2plY3QgdG8gYmUgY2hlY2tlZCAoY2Fubm90IGJlIG51bGwpCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIGEgdHlwZSBvZiBqYXZhIHByb2plY3QsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0phdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBpc0phdmEgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlzSmF2YSA9IHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJcmV0dXJuIGlzSmF2YTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB3aGljaCB3ZWIgY29udGVudHMgcGF0aCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQYXRoIG9mIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQYXRoIHBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmdldFdlYkNvbnRlbnRSb290UGF0aChwcm9qZWN0KTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjY2MzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FV19UQUcpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGVtcGxhdGVzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgZWxlbWVudDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqIExhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUgbmFtZSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWU7Ci0JLyoqIFRoZSB2aWV3ZXIgZGlzcGxheXMgdGhlIHBhdHRlcm4gb2Ygc2VsZWN0ZWQgdGVtcGxhdGUuICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlBhdHRlcm5WaWV3ZXI7Ci0JLyoqIFRoZSB0YWJsZSBwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JLyoqIFRlbXBsYXRlIHN0b3JlIHVzZWQgYnkgdGhpcyB3aXphcmQgcGFnZSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkvKiogQ2hlY2tib3ggZm9yIHVzaW5nIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoIk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UiLCBKU1BVSU1lc3NhZ2VzLk5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSlNQVUlNZXNzYWdlcy5OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzEpOwotCX0KLQotCS8qKgotCSAqIENvcnJlY3RseSByZXNpemVzIHRoZSB0YWJsZSBzbyBubyBwaGFudG9tIGNvbHVtbnMgYXBwZWFyCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIGJ1dHRvbnMKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b25zCi0JICogQHBhcmFtIHRhYmxlCi0JICogICAgICAgICAgICB0aGUgdGFibGUKLQkgKiBAcGFyYW0gY29sdW1uMQotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4yCi0JICogICAgICAgICAgICB0aGUgc2Vjb25kIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4zCi0JICogICAgICAgICAgICB0aGUgdGhpcmQgY29sdW1uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgVGFibGUgdGFibGUsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIpIHsKLQkJcGFyZW50LmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSBhcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJCQlQb2ludCBwcmVmZXJyZWRTaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0JCQkJaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0JCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uCi0JCQkJCS8vIHdpZHRoCi0JCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCQl9Ci0KLQkJCQlQb2ludCBvbGRTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJCWlmIChvbGRTaXplLnggPiB3aWR0aCkgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucwotCQkJCQkvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLQkJCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkJCQkvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGFuY2VzdG9yLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gY3JlYXRlIGNoZWNrYm94IGZvciB1c2VyIHRvIHVzZSBKU1AgVGVtcGxhdGUKLQkJZlVzZVRlbXBsYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV80KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbmFibGVUZW1wbGF0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgVGVtcGxhdGVzIHRhYmxlCi0JCUNvbXBvc2l0ZSBpbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgaW5uZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbm5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaW5uZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJaW5uZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXQoaW5uZXJMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBDcmVhdGUgbGlua2VkIHRleHQgdG8ganVzdCB0byB0ZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfNik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlsaW5rQ2xpY2tlZCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdGFibGUgdGhhdCBkaXNwbGF5cyB0ZW1wbGF0ZXMKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoaW5uZXJQYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMik7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTApOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMS5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV8yKTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjIuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMyk7Ci0KLQkJZlRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlbXBsYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZlRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkgewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJcmV0dXJuIGxlZnQuZ2V0RGVzY3JpcHRpb24oKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iamVjdDEsIG9iamVjdDIpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQl1cGRhdGVWaWV3ZXJJbnB1dCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdmlld2VyIHRoYXQgZGlzcGxheXMgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlJ3MgY29udGVudHMKLQkJZlBhdHRlcm5WaWV3ZXIgPSBkb0NyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCWZUZW1wbGF0ZVN0b3JlID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKTsKLQkJZlRhYmxlVmlld2VyLnNldElucHV0KGZUZW1wbGF0ZVN0b3JlKTsKLQotCQljb25maWd1cmVUYWJsZVJlc2l6aW5nKGlubmVyUGFyZW50LCB0YWJsZSwgY29sdW1uMSwgY29sdW1uMik7Ci0JCWxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSGVscENvbnRleHRJZHMuSlNQX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXNldENvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCBjb25maWd1cmVzIGFuZCByZXR1cm5zIGEgc291cmNlIHZpZXdlciB0byBwcmVzZW50IHRoZSB0ZW1wbGF0ZQotCSAqIHBhdHRlcm4gb24gdGhlIHByZWZlcmVuY2UgcGFnZS4gQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhCi0JICogY3VzdG9tIHNvdXJjZSB2aWV3ZXIgZmVhdHVyaW5nIGUuZy4gc3ludGF4IGNvbG9yaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEByZXR1cm4gYSBjb25maWd1cmVkIHNvdXJjZSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BUQUcpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfNSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJU291cmNlVmlld2VyIHZpZXdlciA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCQl2aWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCUNvbnRyb2wgY29udHJvbCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGluIHBhZ2UgYmFzZWQgb24gZlVzZVRlbXBsYXRlQnV0dG9uJ3MgY3VycmVudAotCSAqIHN0YXRlLgotCSAqLwotCXZvaWQgZW5hYmxlVGVtcGxhdGVzKCkgewotCQlib29sZWFuIGVuYWJsZWQgPSBmVXNlVGVtcGxhdGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKCFlbmFibGVkKSB7Ci0JCQkvLyBzYXZlIGxhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCWVsc2UKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldFNlbGVjdGVkVGVtcGxhdGUoZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSk7Ci0JCX0KLQotCQlmVGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZQYXR0ZXJuVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGVtcGxhdGUgcHJlZmVyZW5jZSBwYWdlIGlkCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSWQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3AudGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlIGdldFNlbGVjdGVkVGVtcGxhdGUoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJdGVtcGxhdGUgPSAoVGVtcGxhdGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gdGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0ZW1wbGF0ZSBzdHJpbmcgdG8gaW5zZXJ0LgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIHRvIGluc2VydCBvciBudWxsIGlmIG5vbmUgaXMgdG8gYmUgaW5zZXJ0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGVtcGxhdGVTdHJpbmcoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IG51bGw7Ci0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlUZW1wbGF0ZUNvbnRleHRUeXBlIGNvbnRleHRUeXBlID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVcpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IG5ldyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIDAsIDApOwotCQkJdHJ5IHsKLQkJCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBjb250ZXh0LmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGJ1ZmZlci5nZXRTdHJpbmcoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIHRlbXBsYXRlIGZvciBuZXcganNwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0ZW1wbGF0ZVN0cmluZzsKLQl9Ci0KLQl2b2lkIGxpbmtDbGlja2VkKCkgewotCQlTdHJpbmcgcGFnZUlkID0gZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpOwotCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgcGFnZUlkLCBuZXcgU3RyaW5nW117cGFnZUlkfSwgbnVsbCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWZUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gTmV3IEpTUCBGaWxlIHdpemFyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhKU1BVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FKTsKLQkJaWYgKHRlbXBsYXRlTmFtZSA9PSBudWxsIHx8IHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlTmFtZTsKLQkJCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0ZW1wbGF0ZSBuYW1lIHVzZWQgZm9yIG5leHQgY2FsbCB0byBOZXcgSlNQIEZpbGUgd2l6YXJkLgotCSAqLwotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCQlKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgdGVtcGxhdGUgaW4gdGhlIHRhYmxlIHZpZXdlciBnaXZlbiB0aGUgdGVtcGxhdGUgbmFtZS4gSWYKLQkgKiB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSBmb3VuZCBvciB0ZW1wbGF0ZU5hbWUgaXMgbnVsbCwganVzdCBzZWxlY3QKLQkgKiBmaXJzdCBpdGVtIGluIHRhYmxlLiBJZiBubyBpdGVtcyBpbiB0YWJsZSBzZWxlY3Qgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlPYmplY3QgdGVtcGxhdGUgPSBudWxsOwotCi0JCWlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBwaWNrIHRoZSBsYXN0IHVzZWQgdGVtcGxhdGUKLQkJCXRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVcpOwotCQl9Ci0KLQkJLy8gbm8gcmVjb3JkIG9mIGxhc3QgdXNlZCB0ZW1wbGF0ZSBzbyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQlpZiAodGVtcGxhdGUgPT0gbnVsbCkgewotCQkJLy8ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJCXRlbXBsYXRlID0gZlRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZW1wbGF0ZSk7Ci0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwYXR0ZXJuIHZpZXdlci4KLQkgKi8KLQl2b2lkIHVwZGF0ZVZpZXdlcklucHV0KCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3VGFnV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1RhZ1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI3MTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3VGFnV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIE5ld1RhZ1dpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgTmV3VGFnRmlsZVdpemFyZFBhZ2UgZk5ld0ZpbGVQYWdlOwotCXByaXZhdGUgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWZOZXdGaWxlUGFnZSA9IG5ldyBOZXdUYWdGaWxlV2l6YXJkUGFnZSgiVGFnV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKElERS5jb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoZlNlbGVjdGlvbikpKTsgLy8kTk9OLU5MUy0xJCAKLQkJZk5ld0ZpbGVQYWdlLnNldFRpdGxlKEpTUFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9UQUdfTkVXX0hFQURJTkcpOwotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oSlNQVUlNZXNzYWdlcy5fVUlfV0laQVJEX1RBR19ORVdfREVTQ1JJUFRJT04pOwotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShmTmV3RmlsZVRlbXBsYXRlc1BhZ2UpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGFwcGx5TGluZURlbGltaXRlcihJRmlsZSBmaWxlLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiksIG5ldyBJU2NvcGVDb250ZXh0W10ge25ldyBQcm9qZWN0U2NvcGUoZmlsZS5nZXRQcm9qZWN0KCkpLCBuZXcgSW5zdGFuY2VTY29wZSgpIH0pOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKHRleHQsICJcclxuIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcciIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXG4iLCBsaW5lRGVsaW1pdGVyKTsKLQkJcmV0dXJuIGNvbnZlcnRlZFRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCXNldFdpbmRvd1RpdGxlKEpTUFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9UQUdfTkVXX1RJVExFKTsKLQotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1dJWkJBTl9ORVdUQUdGSUxFKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcGVyZm9ybWVkT0sgPSBmYWxzZTsKLQotCQkvLyBzYXZlIHVzZXIgb3B0aW9ucyBmb3IgbmV4dCB1c2UKLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLnNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBhZGQgZGVmYXVsdCBleHRlbnNpb24KLQkJU3RyaW5nIGZpbGVOYW1lID0gZk5ld0ZpbGVQYWdlLmdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQlmTmV3RmlsZVBhZ2Uuc2V0RmlsZU5hbWUobmV3RmlsZU5hbWUpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgbmV3IGVtcHR5IGZpbGUKLQkJSUZpbGUgZmlsZSA9IGZOZXdGaWxlUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJLy8gaWYgdGhlcmUgd2FzIHByb2JsZW0gd2l0aCBjcmVhdGluZyBmaWxlLCBpdCB3aWxsIGJlIG51bGwsIHNvIG1ha2UKLQkJLy8gc3VyZSB0byBjaGVjawotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkvLyBwdXQgdGVtcGxhdGUgY29udGVudHMgaW50byBmaWxlCi0JCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2UuZ2V0VGVtcGxhdGVTdHJpbmcoKTsKLQkJCWlmICh0ZW1wbGF0ZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBhcHBseUxpbmVEZWxpbWl0ZXIoZmlsZSwgdGVtcGxhdGVTdHJpbmcpOwotCQkJCS8vIGRldGVybWluZSB0aGUgZW5jb2RpbmcgZm9yIHRoZSBuZXcgZmlsZQotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCi0JCQkJdHJ5IHsKLQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbVdyaXRlciA9IG51bGw7Ci0JCQkJCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBqdXN0IHVzZSBkZWZhdWx0IGVuY29kaW5nCi0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgY2hhclNldCk7Ci0JCQkJCX0KLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5jbG9zZSgpOwotCQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIGNvbnRlbnRzIGZvciBuZXcgVGFnIGZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS92aWV3cy9jb250ZW50b3V0bGluZS9KU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS92aWV3cy9jb250ZW50b3V0bGluZS9KU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhMTU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvdmlld3MvY29udGVudG91dGxpbmUvSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIG91dGxpbmUgdmlldyBwYWdlIHdoaWNoIHNob3dzIEpTUCBjb250ZW50LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBIVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUT0RPOiBBdXRvbWF0ZSB0aGUgbG9hZGluZyBvZiBhIHJlYWwgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgbW9kZWwKLQkvLyB0eXBlIGF0Ci0JLy8gY3JlYXRpb24gdGltZTsgY2xlYXIgb24gdW5Db25maWd1cmUgc28gdGhhdCBhIG5ldyBlbWJlZGRlZAotCS8vIGNvbmZpZ3VyYXRpb24gY2FuCi0JLy8gYmUgdXNlZAotCS8vIHByaXZhdGUgU3RydWN0dXJlZENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBmRW1iZWRkZWRDb25maWd1cmF0aW9uID0KLQkvLyBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBKU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjI5YThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRlbXBsYXRlcy5qc3BzY3JpcHRsZXQubmFtZT1KU1Agc2NyaXB0bGV0Ci1UZW1wbGF0ZXMuanNwc2NyaXB0bGV0LmRlc2M9SlNQIHNjcmlwdGxldCA8JS4uJT4KLVRlbXBsYXRlcy5qc3BzY3JpcHRsZXQuY29udGVudD08JSAke2N1cnNvcn0gJT4KLVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50Lm5hbWU9SlNQIGhpZGRlbiBjb21tZW50Ci1UZW1wbGF0ZXMuanNwaGlkZGVuY29tbWVudC5kZXNjPUpTUCBoaWRkZW4gY29tbWVudCA8JS0tIC0tJT4KLVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50LmNvbnRlbnQ9PCUtLSAke2N1cnNvcn0gLS0lPgotVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLm5hbWU9SlNQIGRlY2xhcmF0aW9uKHMpCi1UZW1wbGF0ZXMuanNwZGVjbGFyYXRpb24uZGVzYz1KU1AgZGVjbGFyYXRpb24ocykgPCUhLi4lPgotVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLmNvbnRlbnQ9PCUhICR7Y3Vyc29yfSAlPgotVGVtcGxhdGVzLmpzcGV4cHJlc3Npb24ubmFtZT1KU1AgZXhwcmVzc2lvbgotVGVtcGxhdGVzLmpzcGV4cHJlc3Npb24uZGVzYz1KU1AgZXhwcmVzc2lvbiA8JT0uLiU+Ci1UZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5jb250ZW50PTwlPSAke2N1cnNvcn0gJT4KLVRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlLm5hbWU9SlNQIGluY2x1ZGUgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZS5kZXNjPUpTUCBpbmNsdWRlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUuY29udGVudD08JUAgaW5jbHVkZSBmaWxlPSIke2N1cnNvcn0iICU+Ci1UZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZS5uYW1lPUpTUCBwYWdlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUuZGVzYz1KU1AgcGFnZSBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlLmNvbnRlbnQ9PCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgJT4KLVRlbXBsYXRlcy5qc3B0YWdsaWJkaXJlY3RpdmUubmFtZT1KU1AgdGFnbGliIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5kZXNjPUpTUCB0YWdsaWIgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlLmNvbnRlbnQ9PCVAIHRhZ2xpYiB1cmk9IiR7Y3Vyc29yfSIgcHJlZml4PSIiICU+Ci1UZW1wbGF0ZXMuanNwaHRtbC5uYW1lPU5ldyBKU1AgRmlsZSAoaHRtbCkKLVRlbXBsYXRlcy5qc3BodG1sLmRlc2M9SlNQIHdpdGggaHRtbCBtYXJrdXAKLVRlbXBsYXRlcy5qc3BodG1sLmNvbnRlbnQ9PCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iXG4gICAgcGFnZUVuY29kaW5nPSIke2VuY29kaW5nfSIlPlxuPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+XG48aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+Ci1UZW1wbGF0ZXMuanNweGh0bWwubmFtZT1OZXcgSlNQIEZpbGUgKHhodG1sKQotVGVtcGxhdGVzLmpzcHhodG1sLmRlc2M9SlNQIHdpdGggeGh0bWwgbWFya3VwCi1UZW1wbGF0ZXMuanNweGh0bWwuY29udGVudD08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz5cbjwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IlxuICAgIHBhZ2VFbmNvZGluZz0iJHtlbmNvZGluZ30iJT5cbjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj5cbjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIC8+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD4KLVRlbXBsYXRlcy5qc3B4aHRtbHhtbC5uYW1lPU5ldyBKU1AgRmlsZSAoeGh0bWwsIHhtbCBzeW50YXgpCi1UZW1wbGF0ZXMuanNweGh0bWx4bWwuZGVzYz1KU1Agd2l0aCB4aHRtbCBtYXJrdXAgYW5kIHhtbCBzdHlsZSBzeW50YXgKLVRlbXBsYXRlcy5qc3B4aHRtbHhtbC5jb250ZW50PTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiA/PlxuPGpzcDpyb290IHhtbG5zOmpzcD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIgdmVyc2lvbj0iMi4wIj5cbiAgICA8anNwOmRpcmVjdGl2ZS5wYWdlIGxhbmd1YWdlPSJqYXZhIlxuICAgICAgICBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IiBwYWdlRW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiAvPlxuICAgIDxqc3A6dGV4dD5cbiAgICAgICAgPCFbQ0RBVEFbIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiA/PiBdXT5cbiAgICA8L2pzcDp0ZXh0PlxuICAgIDxqc3A6dGV4dD5cbiAgICAgICAgPCFbQ0RBVEFbIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4gXV0+XG4gICAgPC9qc3A6dGV4dD5cbjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIC8+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD5cbjwvanNwOnJvb3Q+Ci0KLVRlbXBsYXRlcy5qc3B0YWdkaXJlY3RpdmUubmFtZT1UYWcgZmlsZSB0YWcgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwdGFnZGlyZWN0aXZlLmRlc2M9VGFnIGZpbGUgdGFnIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHRhZ2RpcmVjdGl2ZS5jb250ZW50PTwlQCB0YWcgZGlzcGxheS1uYW1lPSIke2N1cnNvcn0iIGRlc2NyaXB0aW9uPSIiIHNtYWxsLWljb249IiIgJT4KLQotVGVtcGxhdGVzLmpzcHZhcmlhYmxlZGlyZWN0aXZlLm5hbWU9VGFnIHZhcmlhYmxlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHZhcmlhYmxlZGlyZWN0aXZlLmRlc2M9VGFnIHZhcmlhYmxlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHZhcmlhYmxlZGlyZWN0aXZlLmNvbnRlbnQ9PCVAIHZhcmlhYmxlIHZhcmlhYmxlLWNsYXNzPSIke2N1cnNvcn0iIGRlc2NyaXB0aW9uPSIiICU+Ci0KLVRlbXBsYXRlcy5qc3BhdHRyaWJ1dGVkaXJlY3RpdmUubmFtZT1UYWcgYXR0cmlidXRlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcGF0dHJpYnV0ZWRpcmVjdGl2ZS5kZXNjPVRhZyBhdHRyaWJ1dGUgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwYXR0cmlidXRlZGlyZWN0aXZlLmNvbnRlbnQ9PCVAIGF0dHJpYnV0ZSBuYW1lPSIke2N1cnNvcn0iIGRlc2NyaXB0aW9uPSIiIHJlcXVpcmVkPSJmYWxzZSIgdHlwZT0iIiAlPgotCi1UZW1wbGF0ZXMuc2ltcGxldGFnLm5hbWU9TmV3IFRhZyBGaWxlCi1UZW1wbGF0ZXMuc2ltcGxldGFnLmRlc2M9TmV3IEpTUCBUYWcgRmlsZQotVGVtcGxhdGVzLnNpbXBsZXRhZy5jb250ZW50PTwlQCB0YWcgbGFuZ3VhZ2U9ImphdmEiIHBhZ2VFbmNvZGluZz0iJHtlbmNvZGluZ30iJT5cbgotCi1UZW1wbGF0ZXMuc2ltcGxldGFneC5uYW1lPU5ldyBUYWdYIEZpbGUKLVRlbXBsYXRlcy5zaW1wbGV0YWd4LmRlc2M9TmV3IEpTUCBUYWdYIEZpbGUKLVRlbXBsYXRlcy5zaW1wbGV0YWd4LmNvbnRlbnQ9PGpzcDpkaXJlY3RpdmUudGFnIGxhbmd1YWdlPSJqYXZhIiBwYWdlRW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9Ii8+XG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMThkMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwc2NyaXB0bGV0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwc2NyaXB0bGV0IiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwaGlkZGVuY29tbWVudC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50IiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbiIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbi5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BleHByZXNzaW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BleHByZXNzaW9uIiBjb250ZXh0PSJqc3BfYWxsIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGV4cHJlc3Npb24uY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZSIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlIiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwaHRtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BodG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BodG1sIiBjb250ZXh0PSJqc3BfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGh0bWwuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcHhodG1sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHhodG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3B4aHRtbCIgY29udGV4dD0ianNwX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3B4aHRtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNweGh0bWx4bWwubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNweGh0bWx4bWwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcHhodG1seG1sIiBjb250ZXh0PSJqc3BfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHhodG1seG1sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3B0YWdkaXJlY3RpdmUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwdGFnZGlyZWN0aXZlLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3B0YWdkaXJlY3RpdmUiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwdGFnZGlyZWN0aXZlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3B2YXJpYWJsZWRpcmVjdGl2ZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3B2YXJpYWJsZWRpcmVjdGl2ZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwdmFyaWFibGVkaXJlY3RpdmUiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwdmFyaWFibGVkaXJlY3RpdmUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGF0dHJpYnV0ZWRpcmVjdGl2ZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BhdHRyaWJ1dGVkaXJlY3RpdmUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcGF0dHJpYnV0ZWRpcmVjdGl2ZSIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BhdHRyaWJ1dGVkaXJlY3RpdmUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnNpbXBsZXRhZy5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5zaW1wbGV0YWcuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLnNpbXBsZXRhZyIgY29udGV4dD0idGFnX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5zaW1wbGV0YWcuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnNpbXBsZXRhZ3gubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuc2ltcGxldGFneC5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuc2ltcGxldGFneCIgY29udGV4dD0idGFnX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5zaW1wbGV0YWd4LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliODgxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSIiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiY2U0YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YWUxMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTYXQgQXByIDI4IDAzOjM5OjU2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhYzlhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU2F0IEFwciAyOCAwOToyODozMSBFRFQgMjAwNwotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCi1jb21waWxlcnMucC5idWlsZD0xCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1MmYxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1DbGFzc1BhdGg6IC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2MmFmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxwPkp1bmUsIDIwMDg8L3A+Ci08aDM+TGljZW5zZTwvaDM+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gICAoJnF1b3Q7Q29udGVudCZxdW90OykuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9hPi4gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgICBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCAgIHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggICBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAgIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50ICAgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvYT4uPC9wPgotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91ICAgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgICBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSBmb3IgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotPGg0PkFwcHNlcnYgQ29tbW9ucyBzY2hlbWFzIGFuZCBEVERzIHYyX2IzMyAoU3Vic2V0KSA8L2g0PgotPHA+WW91ciB1c2Ugb2YgdGhlIEFwcHNlcnYgQ29tbW9ucyBzY2hlbWFzIGFuZCBEVERzIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCAgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wLiBBICBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZCAgaW4gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvQ0RETHYxLjAudHh0Ij5MSUNFTlNFLnR4dDwvYT4gYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+aHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sPC9hPi4gPC9wPgotPHA+VGhlIHNvdXJjZSBmb3IgdGhlIHNjaGVtYXMgYW5kIERURHMgaXMgYXZhaWxhYmxlIG9uIHRoZSBHbGFzc2Zpc2ggY29tbXVuaXR5IHdlYnNpdGUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9kb3dubG9hZHNpbmRleC5odG1sIj5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvPC9hPi4gPC9wPgotCi08aDQ+SmF2YSBTZXJ2ZXIgRmFjZXMgMS4yIHNjaGVtYSBhbmQgRFREcyAoU3Vic2V0KSA8L2g0PgotPHA+WW91ciB1c2Ugb2YgdGhlIEphdmEgU2VydmVyIEZhY2VzIHNjaGVtYXMgYW5kIERURHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kICBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAuIEEgIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMgY29udGFpbmVkICBpbiB0aGUgZmlsZSA8YSBocmVmPSJhYm91dF9maWxlcy9DRERMdjEuMC50eHQiPkxJQ0VOU0UudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWw8L2E+LiA8L3A+Ci08cD5UaGUgc291cmNlIGZvciB0aGUgc2NoZW1hcyBhbmQgRFREcyBpcyBhdmFpbGFibGUgb24gdGhlIEphdmEgU2VydmVyIEZhY2VzIHByb2plY3QgcGFnZSBvbiB0aGUgR2xhc3NmaXNoIGNvbW11bml0eSB3ZWJzaXRlIGF0IDxhIGhyZWY9Imh0dHBzOi8vamF2YXNlcnZlcmZhY2VzLmRldi5qYXZhLm5ldCI+aHR0cHM6Ly9qYXZhc2VydmVyZmFjZXMuZGV2LmphdmEubmV0LzwvYT4uIDwvcD4KLQotPGg0PkphdmEgUGVyc2lzdGVuY2UgQVBJIFhNTCBTY2hlbWFzPC9oND4KLTxwPllvdXIgdXNlIG9mIHRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBYTUwgU2NoZW1hcyAob3JtXzFfMC54c2QsIHBlcnNpc3RlbmNlXzFfMC54c2QpIGlzIHN1YmplY3QgdG8gIHRoZSB0ZXJtcyBhbmQgIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMC4gQSAgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQgIGluIHRoZSBmaWxlIDxhIGhyZWY9ImFib3V0X2ZpbGVzL0NEREx2MS4wLnR4dCI+TElDRU5TRS50eHQ8L2E+IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPmh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbDwvYT4uIDwvcD4KLTxwPlRoZSBvcmlnaW5hbCBzb3VyY2UgZm9yIHRoZSBzY2hlbWFzIGlzIGF2YWlsYWJsZSBvbiA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS8iPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlLzwvYT4uIDwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvQ0RETHYxLjAudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9DRERMdjEuMC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTRlMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9DRERMdjEuMC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjAKLQotMS4gRGVmaW5pdGlvbnMuCi0KLTEuMS4gQ29udHJpYnV0b3IgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0KLTEuMi4gQ29udHJpYnV0b3IgVmVyc2lvbiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotCi0xLjMuIENvdmVyZWQgU29mdHdhcmUgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgotCi0xLjQuIEV4ZWN1dGFibGUgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4KLQotMS41LiBJbml0aWFsIERldmVsb3BlciBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0xLjYuIExhcmdlciBXb3JrIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0xLjcuIExpY2Vuc2UgbWVhbnMgdGhpcyBkb2N1bWVudC4KLQotMS44LiBMaWNlbnNhYmxlIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgotCi0xLjkuIE1vZGlmaWNhdGlvbnMgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKLQotQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IKLQotQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLTEuMTAuIE9yaWdpbmFsIFNvZnR3YXJlIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcyBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotMS4xMS4gUGF0ZW50IENsYWltcyBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KLQotMS4xMi4gU291cmNlIENvZGUgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuCi0KLTEuMTMuIFlvdSAob3IgWW91cikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCBZb3UgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIGNvbnRyb2wgbWVhbnMgKGEp4XRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYinhb3duZXJzaGlwIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLTIuIExpY2Vuc2UgR3JhbnRzLgotCi0yLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4KLUNvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0oYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZiksIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLCBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLShiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZyBvciBzZWxsaW5nIG9mIE9yaWdpbmFsIFNvZnR3YXJlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZikuCi0oYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnPhMi4xKGEpIGFuZCAoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27hMi4xKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAoMSnhZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoMinhZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSnhdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChpaSnhdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuCi0KLTIuMi4gQ29udHJpYnV0b3IgR3JhbnQuCi1Db25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKLShhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4gdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIFNvZnR3YXJlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbiksIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSnhTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgKDIp4XRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4KLShjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9uc+EyLjIoYSkgYW5kIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucyBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KLShkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbuEyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKeFmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvciBoYXMgZGVsZXRlZCBmcm9tIHRoZSBDb250cmlidXRvciBWZXJzaW9uOyAoMinhZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSnhdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkp4XRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMp4XVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgU29mdHdhcmUgaW4gdGhlIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuCi0KLTMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KLQotMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi0KLUFueSBDb3ZlcmVkIFNvZnR3YXJlIHRoYXQgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGluIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgbXVzdCBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZS4gWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgb2YgYW55IHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLTMuMi4gTW9kaWZpY2F0aW9ucy4KLQotVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KLQotMy4zLiBSZXF1aXJlZCBOb3RpY2VzLgotWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucyB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLiBZb3UgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcgYXR0cmlidXRpb24gdG8gYW55IENvbnRyaWJ1dG9yIG9yIHRoZSBJbml0aWFsIERldmVsb3Blci4KLQotMy40LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zLgotWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cyByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4gSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgotCi0zLjUuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgotWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnRzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybSBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91IGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91IGFsb25lLCBub3QgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zIFlvdSBvZmZlci4KLQotMy42LiBMYXJnZXIgV29ya3MuCi1Zb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4KLQotNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCi0KLTQuMS4gTmV3IFZlcnNpb25zLgotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbiBTZWN0aW9uIDQuMywgbm8gb25lIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuCi0KLTQuMi4gRWZmZWN0IG9mIE5ldyBWZXJzaW9ucy4KLQotWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZyBkaXN0cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4KLTQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuCi0KLVdoZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZCB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKeFyZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIp4W90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgotCi01LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotCi1DT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiBBUyBJUyBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgU09GVFdBUkUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMgRElTQ0xBSU1FUi4KLQotNi4gVEVSTUlOQVRJT04uCi0KLTYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4KLQotNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhcmF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3Qgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgUGFydGljaXBhbnQpIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZSBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdG8gWW91IGJ5IHN1Y2ggUGFydGljaXBhbnQsIHRoZSBJbml0aWFsIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25z4TIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZSBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50IHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkgcGVyaW9kIFlvdSB3aXRoZHJhdyBZb3VyIGNsYWltIHdpdGggcmVzcGVjdCB0byB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlciB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoIFBhcnRpY2lwYW50LgotCi02LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9uc+E2LjEgb3IgNi4yIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKSBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgotCi03LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4KLQotVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFlTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVCBBUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuCi0KLTguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLVRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgY29tbWVyY2lhbCBpdGVtLCBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbiA0OOFDLkYuUi7hMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSAoYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgYXQgNDggQy5GLlIuIOEyNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24gYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OOFDLkYuUi7hMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4gVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQgc3VwZXJzZWRlcywgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3NlcyBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTkuIE1JU0NFTExBTkVPVVMuCi0KLVRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gganVyaXNkaWN0aW9ucyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzIGZlZXMgYW5kIGV4cGVuc2VzLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMgTGljZW5zZS4gWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZSBVbml0ZWQgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kIHRoZSBleHBvcnQgY29udHJvbCBsYXdzIGFuZCByZWd1bGF0aW9uIG9mIGFueSBvdGhlciBjb3VudHJpZXMpIHdoZW4gWW91IHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuCi0KLTEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLgotCi1BcyBiZXR3ZWVuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCB0aGUgQ29udHJpYnV0b3JzLCBlYWNoIHBhcnR5IGlzIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBZb3UgYWdyZWUgdG8gd29yayB3aXRoIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBDb250cmlidXRvcnMgdG8gZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZyBoZXJlaW4gaXMgaW50ZW5kZWQgb3Igc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbiBvZiBsaWFiaWxpdHkuCi0KLU5PVElDRSBQVVJTVUFOVCBUTyBTRUNUSU9OIDkgT0YgVEhFIENPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpCi1UaGUgR2xhc3NGaXNoIGNvZGUgcmVsZWFzZWQgdW5kZXIgdGhlIENEREwgc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEgKGV4Y2x1ZGluZyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucykuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIEZlZGVyYWwgQ291cnRzIG9mIHRoZSBOb3J0aGVybiBEaXN0cmljdCBvZiBDYWxpZm9ybmlhIGFuZCB0aGUgc3RhdGUgY291cnRzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCB3aXRoIHZlbnVlIGx5aW5nIGluIFNhbnRhIENsYXJhIENvdW50eSwgQ2FsaWZvcm5pYS4gCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NGUwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wCi0KLTEuIERlZmluaXRpb25zLgotCi0xLjEuIENvbnRyaWJ1dG9yIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgotCi0xLjIuIENvbnRyaWJ1dG9yIFZlcnNpb24gbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLQotMS4zLiBDb3ZlcmVkIFNvZnR3YXJlIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBmaWxlcyBjb250YWluaW5nIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KLQotMS40LiBFeGVjdXRhYmxlIG1lYW5zIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIGFueSBmb3JtIG90aGVyIHRoYW4gU291cmNlIENvZGUuCi0KLTEuNS4gSW5pdGlhbCBEZXZlbG9wZXIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgZmlyc3QgbWFrZXMgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotMS42LiBMYXJnZXIgV29yayBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBTb2Z0d2FyZSBvciBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotMS43LiBMaWNlbnNlIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0KLTEuOC4gTGljZW5zYWJsZSBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KLQotMS45LiBNb2RpZmljYXRpb25zIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOgotCi1BLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSBvciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnM7Ci0KLUIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yCi0KLUMuIEFueSBuZXcgZmlsZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0xLjEwLiBPcmlnaW5hbCBTb2Z0d2FyZSBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMgb3JpZ2luYWxseSByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTEuMTEuIFBhdGVudCBDbGFpbXMgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCi0KLTEuMTIuIFNvdXJjZSBDb2RlIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgotCi0xLjEzLiBZb3UgKG9yIFlvdXIpIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgWW91IGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCBjb250cm9sIG1lYW5zIChhKeF0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIp4W93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0yLiBMaWNlbnNlIEdyYW50cy4KLQotMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi1Db25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z4TIuMShhKSBhbmQgKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9u4TIuMShiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEp4WZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIp4WZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp4XRoZSBtb2RpZmljYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoaWkp4XRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLgotCi0yLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0oYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLShiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEp4U1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kICgyKeF0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuCi0oYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnPhMi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27hMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAoMSnhZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIp4WZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp4XRoaXJkIHBhcnR5IG1vZGlmaWNhdGlvbnMgb2YgQ29udHJpYnV0b3IgVmVyc2lvbiwgb3IgKGlpKeF0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yICgzKeF1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZSBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLgotCi0zLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCi0KLTMuMS4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgotCi1BbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi0zLjIuIE1vZGlmaWNhdGlvbnMuCi0KLVRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IHJlcHJlc2VudCB0aGF0IFlvdSBiZWxpZXZlIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91ciBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCi0KLTMuMy4gUmVxdWlyZWQgTm90aWNlcy4KLVlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCi0KLTMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KLVlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYSBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLQotMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLVlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLTMuNi4gTGFyZ2VyIFdvcmtzLgotWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG90aGVyIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUuCi0KLTQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi00LjEuIE5ldyBWZXJzaW9ucy4KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZCBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4gU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLgotCi00LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0KLVlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYSBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuCi00LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotCi1XaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSnhcmVuYW1lIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlIGxpY2Vuc2Ugc3Rld2FyZCAoZXhjZXB0IHRvIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKeFvdGhlcndpc2UgbWFrZSBpdCBjbGVhciB0aGF0IHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4KLQotNS4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4KLQotQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gQVMgSVMgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QgVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTCBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTIERJU0NMQUlNRVIuCi0KLTYuIFRFUk1JTkFUSU9OLgotCi02LjEuIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIFByb3Zpc2lvbnMgd2hpY2gsIGJ5IHRoZWlyIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuCi0KLTYuMi4gSWYgWW91IGFzc2VydCBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZyBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0IHdob20gWW91IGFzc2VydCBzdWNoIGNsYWltIGlzIHJlZmVycmVkIHRvIGFzIFBhcnRpY2lwYW50KSBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgYSBDb250cmlidXRvciBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZSBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KSBhbmQgYWxsIENvbnRyaWJ1dG9ycyB1bmRlciBTZWN0aW9uc+EyLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbiBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5IHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aCBQYXJ0aWNpcGFudC4KLQotNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnPhNi4xIG9yIDYuMiBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZCBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbiAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KLQotNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCi0KLVVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTiBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgotCi04LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgotCi1UaGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyBhIGNvbW1lcmNpYWwgaXRlbSwgYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4gNDjhQy5GLlIu4TIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiDhMjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uIGFzIHN1Y2ggdGVybXMgYXJlIHVzZWQgaW4gNDjhQy5GLlIu4TEyLjIxMiAoU2VwdC4gMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzIGFjcXVpcmUgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG9ubHkgdGhvc2UgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMgR292ZXJubWVudCByaWdodHMgaW4gY29tcHV0ZXIgc29mdHdhcmUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi05LiBNSVNDRUxMQU5FT1VTLgotCi1UaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXcgb2YgdGhlIGp1cmlzZGljdGlvbiBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoIGp1cmlzZGljdGlvbnMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgotCi0xMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLQotQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcyByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgotCi1OT1RJQ0UgUFVSU1VBTlQgVE8gU0VDVElPTiA5IE9GIFRIRSBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKQotVGhlIEdsYXNzRmlzaCBjb2RlIHJlbGVhc2VkIHVuZGVyIHRoZSBDRERMIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhIChleGNsdWRpbmcgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMpLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSBhbmQgdGhlIHN0YXRlIGNvdXJ0cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEuIAotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmNkOTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgZHRkc0FuZFNjaGVtYXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvCi1zcmMuaW5jbHVkZXMgPSBkdGRzQW5kU2NoZW1hcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8KLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzIuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8yLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1OGNjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzIuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENBICA5NDMwMywgVS5TLkEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCi1yZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgotb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuICAKLQotVGhpcmQgcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZCAKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4gCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBMb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsIGFuZCBFbnRlcnByaXNlIEphdmFCZWFucywgCi1hcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuIAotYW5kIG90aGVyIGNvdW50cmllcy4KLQotQWxsIFNQQVJDIHRyYWRlbWFya3MgYXJlIHVzZWQgdW5kZXIgbGljZW5zZSBhbmQgYXJlIHRyYWRlbWFya3MKLW9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTUEFSQyBJbnRlcm5hdGlvbmFsLCBJbmMuCi1pbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLiBQcm9kdWN0cyBiZWFyaW5nIFNQQVJDCi10cmFkZW1hcmtzIGFyZSBiYXNlZCB1cG9uIGFuIGFyY2hpdGVjdHVyZSBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAKLQotUG9zdFNjcmlwdCBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMsIEluYy4gCi0KLSAKLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvIAotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotCi0gCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQotSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCi1UTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCi1JTlZBTElELgotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKLTkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4gCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotIAotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnIGF2ZWMgCi1kZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAotZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgotYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4gCi1xdWUgY2Ugc29pdCwgc2FucyBsJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyAKLWJhaWxsZXVycyBkZSBsaWNlbmNlLCBzJ2lsIHkgZW4gYS4gIAotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZSAKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgCi1ldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotIAotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCBsZSBsb2dvIFN1biwgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCwgZXQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsICAKLXNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTdW4gCi1NaWNyb3N5c3RlbXMsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcyBwYXlzLgotIAotVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAotZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQwotSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucwotZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAotYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgCi0KLVBvc3RjcmlwdCBlc3QgdW5lIG1hcnF1ZSBlbnJlZ2lzdHJlJ2UgZCdBZG9iZSBTeXN0ZW1zIEluYy4gCi0gCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0VUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQgRVhDTFVFUywKLURBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUyBOT1RBTU1FTlQKLVRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBIEwnQVBUSVRVREUKLUEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERSBDT05UUkVGQUNPTi4KLS0tPgotCi08IS0tCi1UaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQKLWRlcGxveW1lbnQgZGVzY3JpcHRvci4KLVRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgRUpCIGNvbXBvbmVudHMgYW5kCi1leHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50LgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24tY2xpZW50IChpY29uPywgZGlzcGxheS1uYW1lLCBkZXNjcmlwdGlvbj8sIGVudi1lbnRyeSosCi1lamItcmVmKiwgcmVzb3VyY2UtcmVmKik+Ci0KLTwhLS0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LgotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCi1hcHBsaWNhdGlvbi1jbGllbnQgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUKLWFwcGxpY2F0aW9uLWNsaWVudCBmaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5Ci10aGUgYXBwbGljYXRpb24tY2xpZW50IGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuCi1wcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZAotYnkgdG9vbHMuCi0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGF0IGFuIEVKQgotcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbiBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGVuY29tcGFzc2luZyBKMkVFIEFwcGxpY2F0aW9uCi1wYWNrYWdlLiBUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZQotYmVhbiBpbiB0aGUgc2FtZSBKMkVFIEFwcGxpY2F0aW9uIHBhY2thZ2UuIFVzZWQgaW46IGVqYi1yZWYKLUV4YW1wbGU6IDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0tLT4KLTwhRUxFTUVOVCBlamItbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UKLWJlYW4ncyBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IHRoZSBFSkIKLXJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNsaWVudDsgdGhlCi1leHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsgdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZQotaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW47IGFuZCBhbiBvcHRpb25hbCBlamItbGluawotaW5mb3JtYXRpb24uIFRoZSBvcHRpb25hbCBlamItbGluayBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotZW50ZXJwcmlzZSBiZWFuLgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwgaG9tZSwgcmVtb3RlLAotZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIKLXJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQuIEl0IGlzIHJlY29tbWVuZGVkCi10aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuIFVzZWQgaW46IGVqYi1yZWYKLUV4YW1wbGU6IDxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi1iZWFuLiBUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLTxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci08ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLVVzZWQgaW46IGVqYi1yZWYKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLWVudmlyb25tZW50IGVudHJpZXMuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi1uYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5IChkZXNjcmlwdGlvbj8sIGVudi1lbnRyeS1uYW1lLCBlbnYtZW50cnktdHlwZSwKLWVudi1lbnRyeS12YWx1ZT8pPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotZW52aXJvbm1lbnQgZW50cnkuIFVzZWQgaW46IGVudi1lbnRyeQotRXhhbXBsZTogPGVudi1lbnRyeS1uYW1lPkVtcGxveWVlQXBwREI8L2Vudi1lbnRyeS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZiB0aGUKLWVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGNvZGUuIFRoZQotZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOiBqYXZhLmxhbmcuQm9vbGVhbiwKLWphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLCBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwKLWphdmEubGFuZy5TaG9ydCwgamF2YS5sYW5nLkxvbmcsIGFuZCBqYXZhLmxhbmcuRmxvYXQuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZSBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSBjb25zdHJ1Y3Rvcgotb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlci4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci08ZW52LWVudHJ5LXZhbHVlPi9kYXRhc291cmNlcy9NeURhdGFiYXNlPC9lbnYtZW50cnktdmFsdWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZQotaW50ZXJmYWNlLgotVXNlZCBpbjogZWpiLXJlZgotRXhhbXBsZTogPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+Ci0tLT4KLTwhRUxFTUVOVCBob21lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGljb24gZWxlbWVudCBjb250YWlucyBhIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudCB3aGljaCBzcGVjaWZ5IHRoZQotVVJJcyBmb3IgYSBzbWFsbCBhbmQgYSBsYXJnZSBHSUYgb3IgSlBFRyBpY29uIGltYWdlIHVzZWQgdG8gcmVwcmVzZW50IHRoZQotYXBwbGljYXRpb24gY2xpZW50IGluIGEgR1VJIHRvb2wuCi0tLT4KLTwhRUxFTUVOVCBpY29uIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGFyZ2UgKDMyIHggMzIpCi1pY29uIGltYWdlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLWNsaWVudCBqYXIKLWZpbGUuIFRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQgdGhlIGZpbGUgbmFtZSBtdXN0Ci1lbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LiBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieQotdG9vbHMuCi1FeGFtcGxlOgotPGxhcmdlLWljb24+bGliL2ltYWdlcy9lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLXJlbW90ZSBpbnRlcmZhY2UuCi1Vc2VkIGluOiBlamItcmVmCi1FeGFtcGxlOgotPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0tLT4KLTwhRUxFTUVOVCByZW1vdGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLWF1dGggZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUgc2lnbnMgb24KLXByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24KLXRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9uIGJlaGFsZiBvZiB0aGUgYmVhbi4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgQ29udGFpbmVyCi11c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlIERlcGxveWVyLgotVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLTxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci08cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLS0tPgotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UKLW5hbWUuIFRoZSByZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbgotY2xpZW50J3MgZW52aXJvbm1lbnQgZW50cnkgd2hvc2UgdmFsdWUgY29udGFpbnMgdGhlIEpOREkgbmFtZSBvZiB0aGUgZGF0YQotc291cmNlLgotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlLiBUaGUgdHlwZSBpcwotc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZSAob3IgY2xhc3MpIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZQotZGF0YSBzb3VyY2UuCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYXBwbGljYXRpb24gY2xpZW50cydzCi1yZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLXJlc291cmNlIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsIHRoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5IHR5cGUKLWV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBjb2RlLCBhbmQgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24gKGJlYW4KLW9yIGNvbnRhaW5lcikuCi0KLUV4YW1wbGU6Ci08cmVzb3VyY2UtcmVmPgotPHJlcy1yZWYtbmFtZT5FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci08cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci08L3Jlc291cmNlLXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCk+Ci08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpCi1pY29uIGltYWdlLiBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLWNsaWVudCBqYXIKLWZpbGUuIFRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQgdGhlIGZpbGUgbmFtZSBtdXN0Ci1lbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LiBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieQotdG9vbHMuCi1FeGFtcGxlOgotPHNtYWxsLWljb24+bGliL2ltYWdlcy9lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0byBlYXNpbHkgbWFrZSB0b29sLXNwZWNpZmljIHJlZmVyZW5jZXMgdG8KLXRoZSBlbGVtZW50cyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotIC0tPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uLWNsaWVudCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWQ0NTZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHJlbGF0aW5nIHRvCi10ZWNobm9sb2d5IGVtYm9kaWVkIGluIHRoZSBwcm9kdWN0IHRoYXQgaXMgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuCi1JbiBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzIGxpc3RlZCBhdAotaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwgcGF0ZW50cyBvcgotcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZSBVLlMuIGFuZCBpbiBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSBwcm9kdWN0IHRvIHdoaWNoIGl0IHBlcnRhaW5zIGFyZSBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIFRoaXMgZG9jdW1lbnQgbWF5IGJlIHJlcHJvZHVjZWQgYW5kIGRpc3RyaWJ1dGVkIGJ1dCBtYXkKLW5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzCi1saWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZAotbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgdGhlIFN1biBsb2dvLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgYW5kICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0bwotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkgSU1QTElFRAotV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IKLU5PTi1JTkZSSU5HRU1FTlQsIEFSRSBESVNDTEFJTUVELCBFWENFUFQgVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0gKLURJU0NMQUlNRVJTIEFSRSBIRUxEIFRPIEJFIExFR0FMTFkgSU5WQUxJRC4KLQotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIEUndGF0cy1VbmlzLgotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhIGxlcyBkcm9pdHMgZGUgcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscwotcmVsYXRhbnRzIGFgIGxhIHRlY2hub2xvZ2llIGluY29ycG9yZSdlIGRhbnMgbGUgcHJvZHVpdCBxdWkgZXN0IGRlJ2NyaXQKLWRhbnMgY2UgZG9jdW1lbnQuIEVuIHBhcnRpY3VsaWVyLCBldCBzYW5zIGxhIGxpbWl0YXRpb24sIGNlcyBkcm9pdHMgZGUKLXByb3ByaWUndGUnIGludGVsbGVjdHVlbHMgcGV1dmVudCBpbmNsdXJlIHVuIG91IHBsdXMgZGVzIGJyZXZldHMKLWFtZSdyaWNhaW5zIGUnbnVtZSdyZSdzIGFgIGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGV0IHVuIG91IGxlcwotYnJldmV0cyBwbHVzIHN1cHBsZSdtZW50YWlyZXMgb3UgbGVzIGFwcGxpY2F0aW9ucyBkZSBicmV2ZXQgZW4gYXR0ZW50ZQotZGFucyBsZXMgRSd0YXRzLVVuaXMgZXQgZGFucyBsZXMgYXV0cmVzIHBheXMuCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScKLWF2ZWMgZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhCi1kaXN0cmlidXRpb24sIGV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQ2UgZG9jdW1lbnRpb24gYXNzb2NpZSBuIHBldXQKLWVedHJlIHJlcHJvZHVpdGUgZXQgZGlzdHJpYnVlciwgcGFyIHF1ZWxxdWUgbW95ZW4gcXVlIGNlIHNvaXQsIHNhbnMKLWwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzIGJhaWxsZXVycyBkZQotbGljZW5jZSwgbGUgY2FzIGUnY2hlJ2FudC4KLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQKLWxpY2VuY2llJyBwYXIgZGVzIGZvdXJuaXNzZXVycyBkZSBTdW4uCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICBsZSBsb2dvIFN1biwgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGV0ICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIHNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMKLWRlJ3Bvc2UnZXMgZGUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRSd0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcwotcGF5cy4KLQotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFJ1RBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVAotRVhDTFVFUywgREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTCi1OT1RBTU1FTlQgVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEKLUwnQVBUSVRVREUgQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFCi1DT05UUkVGQUMsT04uCi0tLT4KLQotPCEtLQotVGhpcyBpcyB0aGUgWE1MIERURCBmb3IgdGhlIEoyRUUgMS4zIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiAgQWxsIEoyRUUgMS4zIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi1tdXN0IGluY2x1ZGUgYSBET0NUWVBFIG9mIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICA8IURPQ1RZUEUgYXBwbGljYXRpb24tY2xpZW50IFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4zLy9FTiIKLQkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQiPgotCi0tLT4KLQotPCEtLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBQQ0RBVEEsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLSAgaW4gdGhlIGRhdGEgbWF5IGJlIGlnbm9yZWQuCi0KLS0gSW4gZWxlbWVudHMgd2hvc2UgdmFsdWUgaXMgYW4gImVudW1lcmF0ZWQgdHlwZSIsIHRoZSB2YWx1ZSBpcwotICBjYXNlIHNlbnNpdGl2ZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZSBzYW1lCi0gIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdCBzdGFydGluZyB3aXRoICIvIikKLSAgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLgotICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkKLSAgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzZXJ2bGV0IEFQSS4KLS0tPgotCi0KLTwhLS0KLVRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuIGFwcGxpY2F0aW9uCi1jbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgRUpCIGNvbXBvbmVudHMgYW5kIGV4dGVybmFsIHJlc291cmNlcwotcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50LgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24tY2xpZW50IChpY29uPywgZGlzcGxheS1uYW1lLCBkZXNjcmlwdGlvbj8sCi0JCWVudi1lbnRyeSosIGVqYi1yZWYqLCByZXNvdXJjZS1yZWYqLCByZXNvdXJjZS1lbnYtcmVmKiwKLQkJY2FsbGJhY2staGFuZGxlcj8pPgotCi08IS0tCi1UaGUgY2FsbGJhY2staGFuZGxlciBlbGVtZW50IG5hbWVzIGEgY2xhc3MgcHJvdmlkZWQgYnkgdGhlCi1hcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzIGNvbnN0cnVjdG9yIGFuZCBtdXN0Ci1pbXBsZW1lbnQgdGhlIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyIGludGVyZmFjZS4KLVRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvbnRhaW5lciBhbmQKLXVzZWQgYnkgdGhlIGNvbnRhaW5lciB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlCi11c2VyLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQKLS0tPgotPCFFTEVNRU5UIGNhbGxiYWNrLWhhbmRsZXIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQKLWVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdAotdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBqYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBqYXIgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMKLXVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBqYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uCi13aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQsIGVqYi1yZWYsIGVudi1lbnRyeSwgcmVzb3VyY2UtZW52LXJlZiwKLXJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLWRpc3BsYXllZCBieSB0b29scy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQKLQotRXhhbXBsZToKLQotPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgZWxlbWVudAotdG8gc3BlY2lmeSB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFuCi1lbnRlcnByaXNlIGJlYW4uCi0KLVRoZSBuYW1lIGluIHRoZSBlamItbGluayBlbGVtZW50IGlzIGNvbXBvc2VkIG9mIGEKLXBhdGggbmFtZSBzcGVjaWZ5aW5nIHRoZSBlamItamFyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotYmVhbiB3aXRoIHRoZSBlamItbmFtZSBvZiB0aGUgdGFyZ2V0IGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tCi10aGUgcGF0aCBuYW1lIGJ5ICIjIi4gIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIGphciBmaWxlCi1jb250YWluaW5nIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuLgotVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lIGVqYi1uYW1lIHRvIGJlCi11bmlxdWVseSBpZGVudGlmaWVkLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGVzOgotCi0JPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotCTxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotLS0+Ci08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0JICB0aGUgYXBwbGljYXRpb24gY2xpZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0JLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0tLT4KLTwhRUxFTUVOVCBlamItcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLAotCQlob21lLCByZW1vdGUsIGVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGUKLUVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGFuZCBpcwotcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi13aXRoaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0KLTxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKLXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCTxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0JPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0KLVVzZWQgaW46IGVqYi1yZWYKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLWVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbAotdmFsdWUuICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIG9uZSBtdXN0IGJlIHN1cHBsaWVkCi1kdXJpbmcgZGVwbG95bWVudC4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnkgKGRlc2NyaXB0aW9uPywgZW52LWVudHJ5LW5hbWUsIGVudi1lbnRyeS10eXBlLAotCQllbnYtZW50cnktdmFsdWU/KT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLWVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mCi10aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MKLWNvZGUuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6Ci0KLQlqYXZhLmxhbmcuQm9vbGVhbgotCWphdmEubGFuZy5CeXRlCi0JamF2YS5sYW5nLkNoYXJhY3RlcgotCWphdmEubGFuZy5TdHJpbmcKLQlqYXZhLmxhbmcuU2hvcnQKLQlqYXZhLmxhbmcuSW50ZWdlcgotCWphdmEubGFuZy5Mb25nCi0JamF2YS5sYW5nLkZsb2F0Ci0JamF2YS5sYW5nLkRvdWJsZQotCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi1jb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhIHNpbmdsZSBTdHJpbmcKLXBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0KLTxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotLS0+Ci08IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cyB0aGF0Ci1zcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgYSBsYXJnZSBHSUYgb3IgSlBFRyBpY29uIGltYWdlcwotdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEgR1VJIHRvb2wuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uLWNsaWVudAotLS0+Ci08IUVMRU1FTlQgaWNvbiAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLQotPCEtLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBsYXJnZSAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MKLWphciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKLWJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0KLTxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotLS0+Ci08IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlIHNpZ25zCi1vbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIKLXdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4gSW4gdGhlCi1sYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCi1EZXBsb3llci4KLQotVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0JPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLWF1dGggKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgbWFuYWdlcgotY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXNoYXJpbmctc2NvcGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZAotdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZQotc2hhcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50LCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgb25lIG9mIHRoZQotdHdvIGZvbGxvd2luZzoKLQotCTxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCTxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtc2hhcmluZy1zY29wZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UuIFRoZSB0eXBlCi1pcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQotZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1yZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZQotaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbgotaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkKLXRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0KLUV4YW1wbGU6Ci0KLTxyZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotPC9yZXNvdXJjZS1lbnYtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZiAoZGVzY3JpcHRpb24/LCByZXNvdXJjZS1lbnYtcmVmLW5hbWUsCi0JCXJlc291cmNlLWVudi1yZWYtdHlwZSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZQotZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLVVzZWQgaW46IHJlc291cmNlLWVudi1yZWYKLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgYSByZXNvdXJjZQotZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YQotbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwKLXRoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlCi1leHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50IGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCi0oQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCi1zaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UgKFNoYXJlYWJsZSBvcgotVW5zaGFyZWFibGUpLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQKLQotRXhhbXBsZToKLQotICAgIDxyZXNvdXJjZS1yZWY+Ci0JPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLQk8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCTxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtcmVmIChkZXNjcmlwdGlvbj8sIHJlcy1yZWYtbmFtZSwgcmVzLXR5cGUsIHJlcy1hdXRoLAotCQlyZXMtc2hhcmluZy1zY29wZT8pPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncwotamFyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogaWNvbgotCi1FeGFtcGxlOgotCi08c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50Ci1pbmZvcm1hdGlvbiAoaS5lLiwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGluZm9ybWF0aW9uKSB0byBzdG9yZSB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGluIGEKLXNlcGFyYXRlIGZpbGUsIGFuZCBlYXNpbHkgcmVmZXIgZnJvbSB0aGVzZSB0b29sLXNwZWNpZmljIGZpbGVzIHRvIHRoZQotaW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotVG9vbHMgYXJlIG5vdCBhbGxvd2VkIHRvIGFkZCB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGludG8gdGhlCi1zdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0tLT4KLQotPCFBVFRMSVNUIGFwcGxpY2F0aW9uLWNsaWVudCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjYWxsYmFjay1oYW5kbGVyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBob21lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW1vdGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLWF1dGggaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1zaGFyaW5nLXNjb3BlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzg4OTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuNCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2RzCTEuMTcgMDIvMTEvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgMS40Ci0JZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0Ci0JYmUgbmFtZWQgIk1FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiIGluIHRoZQotCWFwcGxpY2F0aW9uIGNsaWVudCdzIGphciBmaWxlLiAgQWxsIGFwcGxpY2F0aW9uIGNsaWVudAotCWRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZSB0aGUgYXBwbGljYXRpb24KLQljbGllbnQgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8YXBwbGljYXRpb24tY2xpZW50IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0JCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiCi0JICAgICAgdmVyc2lvbj0iMS40Ij4KLQkgICAgICAuLi4KLQkgICAgPC9hcHBsaWNhdGlvbi1jbGllbnQ+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnQiIHR5cGU9ImoyZWU6YXBwbGljYXRpb24tY2xpZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFwcGxpY2F0aW9uLWNsaWVudCBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4KLQlhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uCi0JY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIEVKQiBjb21wb25lbnRzCi0JYW5kIGV4dGVybmFsIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoZSBhcHBsaWNhdGlvbgotCWNsaWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbgotCSAgYXBwbGljYXRpb24gY2xpZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QKLQkgIGJlIHVuaXF1ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uCi0JICBjbGllbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQkgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuVGhlIG5hbWUKLQkgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXMtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotCSAgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLQkgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50Ci0JICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotCSAgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlCi0JICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlCi0JICB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGxpY2F0aW9uLWNsaWVudFR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotCQkgICB0eXBlPSJqMmVlOmVudi1lbnRyeVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotCQkgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotCQkgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FsbGJhY2staGFuZGxlciIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY2FsbGJhY2staGFuZGxlciBlbGVtZW50IG5hbWVzIGEgY2xhc3MgcHJvdmlkZWQgYnkKLQkgICAgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG5vIGFyZ3MKLQkgICAgY29uc3RydWN0b3IgYW5kIG11c3QgaW1wbGVtZW50IHRoZQotCSAgICBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcgotCSAgICBpbnRlcmZhY2UuICBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlCi0JICAgIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgYW5kIHVzZWQgYnkgdGhlIGNvbnRhaW5lcgotCSAgICB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjEuNCIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuNC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MDgyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iNSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpYXBwbGljYXRpb24tY2xpZW50XzUueHNkcwkxLjI2IDAyLzE3LzA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCA1Ci0JZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0Ci0JYmUgbmFtZWQgIk1FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiIGluIHRoZQotCWFwcGxpY2F0aW9uIGNsaWVudCdzIGphciBmaWxlLiAgQWxsIGFwcGxpY2F0aW9uIGNsaWVudAotCWRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZSB0aGUgYXBwbGljYXRpb24KLQljbGllbnQgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCi0JYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxhcHBsaWNhdGlvbi1jbGllbnQgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0JCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QiCi0JICAgICAgdmVyc2lvbj0iNSI+Ci0JICAgICAgLi4uCi0JICAgIDwvYXBwbGljYXRpb24tY2xpZW50PgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uLWNsaWVudCIgdHlwZT0iamF2YWVlOmFwcGxpY2F0aW9uLWNsaWVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCi0JYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbgotCWNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotCWFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KLQljbGllbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4KLQkgIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0Ci0JICBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudi1lbnRyeSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgYXBwbGljYXRpb24KLQkgIGNsaWVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCSAgYXBwbGljYXRpb24gY2xpZW50LgotCi0JICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuVGhlIG5hbWUKLQkgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLQkgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudAotCSAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlCi0JICBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUKLQkgIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUKLQkgIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGxpY2F0aW9uLWNsaWVudFR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0JCSAgIHR5cGU9ImphdmFlZTplbnYtZW50cnlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnNlcnZpY2UtcmVmR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpyZXNvdXJjZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtY29uc3RydWN0IgotCQkgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1kZXN0cm95IgotCQkgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhbGxiYWNrLWhhbmRsZXIiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY2FsbGJhY2staGFuZGxlciBlbGVtZW50IG5hbWVzIGEgY2xhc3MgcHJvdmlkZWQgYnkKLQkgICAgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG5vIGFyZ3MKLQkgICAgY29uc3RydWN0b3IgYW5kIG11c3QgaW1wbGVtZW50IHRoZQotCSAgICBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcgotCSAgICBpbnRlcmZhY2UuICBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlCi0JICAgIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgYW5kIHVzZWQgYnkgdGhlIGNvbnRhaW5lcgotCSAgICB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSI1IgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgNS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLQkgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0JICBkZXNjcmlwdG9ycyBmb3IgdGhpcyBtb2R1bGUgKGUuZy4sIHdlYiBzZXJ2aWNlCi0JICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcwotCSAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0JICB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgYW5ub3RhdGlvbnMKLQkgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgotCi0JICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBzZXQgdG8gInRydWUiLCB0aGUgZGVwbG95bWVudAotCSAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKLQkgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotCSAgb2YgdGhlIGFwcGxpY2F0aW9uLgotCi0JICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotCSAgImZhbHNlIiwgdGhlIGRlcGxveW1lbnQgdG9vbCBtdXN0IGV4YW1pbmUgdGhlIGNsYXNzCi0JICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcwotCSAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfMi5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfMi5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTczNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzIuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENBICA5NDMwMywgVS5TLkEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCi1yZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgotb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuICAKLQotVGhpcmQgcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZCAKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4gCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBMb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsIGFuZCBFbnRlcnByaXNlIEphdmFCZWFucywgCi1hcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuIAotYW5kIG90aGVyIGNvdW50cmllcy4KLQotQWxsIFNQQVJDIHRyYWRlbWFya3MgYXJlIHVzZWQgdW5kZXIgbGljZW5zZSBhbmQgYXJlIHRyYWRlbWFya3MKLW9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTUEFSQyBJbnRlcm5hdGlvbmFsLCBJbmMuCi1pbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLiBQcm9kdWN0cyBiZWFyaW5nIFNQQVJDCi10cmFkZW1hcmtzIGFyZSBiYXNlZCB1cG9uIGFuIGFyY2hpdGVjdHVyZSBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAKLQotUG9zdFNjcmlwdCBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMsIEluYy4gCi0KLSAKLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvIAotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotCi0gCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQotSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCi1UTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCi1JTlZBTElELgotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKLTkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4gCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotIAotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnIGF2ZWMgCi1kZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAotZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgotYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4gCi1xdWUgY2Ugc29pdCwgc2FucyBsJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyAKLWJhaWxsZXVycyBkZSBsaWNlbmNlLCBzJ2lsIHkgZW4gYS4gIAotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZSAKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgCi1ldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotIAotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCBsZSBsb2dvIFN1biwgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCwgZXQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsICAKLXNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTdW4gCi1NaWNyb3N5c3RlbXMsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcyBwYXlzLgotIAotVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAotZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQwotSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucwotZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAotYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgCi0KLVBvc3RjcmlwdCBlc3QgdW5lIG1hcnF1ZSBlbnJlZ2lzdHJlJ2UgZCdBZG9iZSBTeXN0ZW1zIEluYy4gCi0gCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0VUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQgRVhDTFVFUywKLURBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUyBOT1RBTU1FTlQKLVRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBIEwnQVBUSVRVREUKLUEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERSBDT05UUkVGQUNPTi4KLS0tPgotCi08IS0tCi1UaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gVGhlIFVSSSBtdXN0IHNwZWNpZnkKLXRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUKLWFwcGxpY2F0aW9uJ3Mgcm9vdCBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIgbXVzdCByZWFkCi10aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieQotdGhlIHJlc3BlY3RpdmUgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0tLT4KLTwhRUxFTUVOVCBhbHQtZGQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24gKGljb24/LCBkaXNwbGF5LW5hbWUsIGRlc2NyaXB0aW9uPywgbW9kdWxlKywKLXNlY3VyaXR5LXJvbGUqKT4KLQotPCEtLQotVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IHNwZWNpZmllcyB0aGUgY29udGV4dCByb290IG9mIGEgd2ViIGFwcGxpY2F0aW9uCi0tLT4KLTwhRUxFTUVOVCBjb250ZXh0LXJvb3QgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBwcm92aWRlcyBhIGh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZQotYXBwbGljYXRpb24uIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQotYXBwbGljYXRpb24gYXNzZW1ibGVyIHdhbnRzIHRvIHByb3ZpZGUgdGhlIGRlcGxveWVyLgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGFwcGxpY2F0aW9uIG5hbWUuCi1UaGUgYXBwbGljYXRpb24gbmFtZSBpcyBhc3NpZ25lZCB0byB0aGUgYXBwbGljYXRpb24gYnkgdGhlIGFwcGxpY2F0aW9uIGFzc2VtYmxlcgotYW5kIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBkZXBsb3llciBhdCBkZXBsb3ltZW50IHRpbWUuCi0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBlamItamFyLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZQotYXBwbGljYXRpb24gcGFja2FnZS4KLS0tPgotPCFFTEVNRU5UIGVqYiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgYSBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnQgd2hpY2ggc3BlY2lmeSB0aGUKLVVSSXMgZm9yIGEgc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZSB0byByZXByZXNlbnQgdGhlIGFwcGxpY2F0aW9uCi1pbiBhIEdVSS4KLS0tPgotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBqYXZhIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlCi10byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotLS0+Ci08IUVMRU1FTlQgamF2YSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgZm9yIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZSB0bwotcmVwcmVzZW50IHRoZSBhcHBsaWNhdGlvbiBpbiBhIEdVSS4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbW9kdWxlIGVsZW1lbnQgcmVwcmVzZW50cyBhIHNpbmdsZSBKMkVFIG1vZHVsZSBhbmQgY29udGFpbnMgYW4gZWpiLCBqYXZhLCBvcgotd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUgbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlCi1maWxlLCBhbmQgYW4gb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi1wb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLVRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZSBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKMkVFCi1tb2R1bGUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0tLT4KLTwhRUxFTUVOVCBtb2R1bGUgKChlamIgfCBqYXZhIHwgd2ViKSwgYWx0LWRkPyk+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0tLT4KLTwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkgcm9sZSB3aGljaCBpcwotZ2xvYmFsIHRvIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYSBkZXNjcmlwdGlvbiBvZiB0aGUKLXNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLiBUaGUgZGVzY3JpcHRpb25zIGF0IHRoaXMgbGV2ZWwKLW92ZXJyaWRlIHRob3NlIGluIHRoZSBjb21wb25lbnQgbGV2ZWwgc2VjdXJpdHktcm9sZSBkZWZpbml0aW9ucyBhbmQgbXVzdCBiZSB0aGUKLWRlc2NyaXB0aW9ucyB0b29sIGRpc3BsYXkgdG8gdGhlIGRlcGxveWVyLgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIGZvciBhIHNtYWxsIEdJRiBvciBKUEVHIGljb24gaW1hZ2UgdG8KLXJlcHJlc2VudCB0aGUgYXBwbGljYXRpb24gaW4gYSBHVUkuCi0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHdlYiBlbGVtZW50IGNvbnRhaW5zIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YgYSB3ZWIgYXBwbGljYXRpb24KLW1vZHVsZS4KLS0tPgotPCFFTEVNRU5UIHdlYiAod2ViLXVyaSwgY29udGV4dC1yb290KT4KLQotPCEtLQotVGhlIHdlYi11cmkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHdlYiBhcHBsaWNhdGlvbiBmaWxlLCByZWxhdGl2ZSB0byB0aGUKLXRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLS0tPgotPCFFTEVNRU5UIHdlYi11cmkgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRvIGVhc2lseSBtYWtlIHRvb2wtc3BlY2lmaWMgcmVmZXJlbmNlcyB0bwotdGhlIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0gLS0+Ci08IUFUVExJU1QgYWx0LWRkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnRleHQtcm9vdCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgamF2YSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1vZHVsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlYiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItdXJpIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzMuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzMuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmE0OWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV8zLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgKGMpIDIwMDAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgcmVsYXRpbmcgdG8KLXRlY2hub2xvZ3kgZW1ib2RpZWQgaW4gdGhlIHByb2R1Y3QgdGhhdCBpcyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4KLUluIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMgbGlzdGVkIGF0Ci1odHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUgYWRkaXRpb25hbCBwYXRlbnRzIG9yCi1wZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlIFUuUy4gYW5kIGluIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHByb2R1Y3QgdG8gd2hpY2ggaXQgcGVydGFpbnMgYXJlIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiwgYW5kCi1kZWNvbXBpbGF0aW9uLiAgVGhpcyBkb2N1bWVudCBtYXkgYmUgcmVwcm9kdWNlZCBhbmQgZGlzdHJpYnV0ZWQgYnV0IG1heQotbm90IGJlIGNoYW5nZWQgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMKLWxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMgY29weXJpZ2h0ZWQgYW5kCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICB0aGUgU3VuIGxvZ28sICBKYXZhLCAgSmF2YVNlcnZlciBQYWdlcywgIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgIEpEQkMsICBKREssICBKYXZhTWFpbCBhbmQgIGFuZAotRW50ZXJwcmlzZSBKYXZhQmVhbnMgYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvCi1TdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWSBJTVBMSUVECi1XQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUgotTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVCBUTyBUSEUgRVhURU5UIFRIQVQgU1VDSAotRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWSBJTlZBTElELgotCi0KLV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgRSd0YXRzLVVuaXMuCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGEgbGVzIGRyb2l0cyBkZSBwcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzCi1yZWxhdGFudHMgYWAgbGEgdGVjaG5vbG9naWUgaW5jb3Jwb3JlJ2UgZGFucyBsZSBwcm9kdWl0IHF1aSBlc3QgZGUnY3JpdAotZGFucyBjZSBkb2N1bWVudC4gRW4gcGFydGljdWxpZXIsIGV0IHNhbnMgbGEgbGltaXRhdGlvbiwgY2VzIGRyb2l0cyBkZQotcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscyBwZXV2ZW50IGluY2x1cmUgdW4gb3UgcGx1cyBkZXMgYnJldmV0cwotYW1lJ3JpY2FpbnMgZSdudW1lJ3JlJ3MgYWAgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgZXQgdW4gb3UgbGVzCi1icmV2ZXRzIHBsdXMgc3VwcGxlJ21lbnRhaXJlcyBvdSBsZXMgYXBwbGljYXRpb25zIGRlIGJyZXZldCBlbiBhdHRlbnRlCi1kYW5zIGxlcyBFJ3RhdHMtVW5pcyBldCBkYW5zIGxlcyBhdXRyZXMgcGF5cy4KLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJwotYXZlYyBkZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEKLWRpc3RyaWJ1dGlvbiwgZXQgbGEgZGUnY29tcGlsYXRpb24uICBDZSBkb2N1bWVudGlvbiBhc3NvY2llIG4gcGV1dAotZV50cmUgcmVwcm9kdWl0ZSBldCBkaXN0cmlidWVyLCBwYXIgcXVlbHF1ZSBtb3llbiBxdWUgY2Ugc29pdCwgc2FucwotbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgYmFpbGxldXJzIGRlCi1saWNlbmNlLCBsZSBjYXMgZSdjaGUnYW50LgotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZQotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldAotbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIGxlIGxvZ28gU3VuLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgZXQgIGFuZAotRW50ZXJwcmlzZSBKYXZhQmVhbnMgc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcwotZGUncG9zZSdlcyBkZSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFJ3RhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzCi1wYXlzLgotCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0UnVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UCi1FWENMVUVTLCBEQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMKLU5PVEFNTUVOVCBUT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQQotTCdBUFRJVFVERSBBIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUKLUNPTlRSRUZBQyxPTi4KLS0tPgotCi08IS0tCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgSjJFRSAxLjMgYXBwbGljYXRpb24gZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBKMkVFIDEuMyBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi1tdXN0IGluY2x1ZGUgYSBET0NUWVBFIG9mIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICA8IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDCi0JIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotCi0tLT4KLQotPCEtLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBQQ0RBVEEsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLSAgaW4gdGhlIGRhdGEgbWF5IGJlIGlnbm9yZWQuCi0KLS0gSW4gZWxlbWVudHMgd2hvc2UgdmFsdWUgaXMgYW4gImVudW1lcmF0ZWQgdHlwZSIsIHRoZSB2YWx1ZSBpcwotICBjYXNlIHNlbnNpdGl2ZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZSBzYW1lCi0gIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdCBzdGFydGluZyB3aXRoICIvIikKLSAgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLgotICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkKLSAgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzZXJ2bGV0IEFQSS4KLS0tPgotCi0KLTwhLS0KLVRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBKMkVFIGFwcGxpY2F0aW9uCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0tLT4KLTwhRUxFTUVOVCBhcHBsaWNhdGlvbiAoaWNvbj8sIGRpc3BsYXktbmFtZSwgZGVzY3JpcHRpb24/LCBtb2R1bGUrLAotCQlzZWN1cml0eS1yb2xlKik+Ci0KLTwhLS0KLVRoZSBhbHQtZGQgZWxlbWVudCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvIHRoZSBwb3N0LWFzc2VtYmx5Ci12ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIEoyRUUgbW9kdWxlLgotVGhlIFVSSSBtdXN0IHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290IGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdAotc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIgbXVzdCByZWFkIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZnJvbSB0aGUKLWRlZmF1bHQgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieSB0aGUgcmVzcGVjdGl2ZSBjb21wb25lbnQKLXNwZWNpZmljYXRpb24uCi0KLVVzZWQgaW46IG1vZHVsZQotLS0+Ci08IUVMRU1FTlQgYWx0LWRkICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGNvbm5lY3RvciBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgcmVzb3VyY2UgYWRhcHRlciBhcmNoaXZlCi1maWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi1Vc2VkIGluOiBtb2R1bGUKLS0tPgotPCFFTEVNRU5UIGNvbm5lY3RvciAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdCBvZiBhIHdlYgotYXBwbGljYXRpb24uCi0KLVVzZWQgaW46IHdlYgotLS0+Ci08IUVMRU1FTlQgY29udGV4dC1yb290ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50Ci1lbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQKLXRoZSBhcHBsaWNhdGlvbiBlYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotdGhlIGFwcGxpY2F0aW9uIGVhciBmaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scwotdXNlZCBieSB0aGUgYXBwbGljYXRpb24gZWFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbgotd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVXNlZCBpbjogYXBwbGljYXRpb24sIHNlY3VyaXR5LXJvbGUKLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5ZWQgYnkgdG9vbHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotVXNlZCBpbjogYXBwbGljYXRpb24KLQotRXhhbXBsZToKLQotPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamIgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhbiBlamItamFyLCByZWxhdGl2ZSB0byB0aGUgdG9wCi1sZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLQotVXNlZCBpbjogbW9kdWxlCi0tLT4KLTwhRUxFTUVOVCBlamIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMgdGhhdAotc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZXMKLXVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbgotLS0+Ci08IUVMRU1FTlQgaWNvbiAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLQotPCEtLQotVGhlIGphdmEgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwKLXJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLVVzZWQgaW46IG1vZHVsZQotLS0+Ci08IUVMRU1FTlQgamF2YSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgbGFyZ2UgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uJ3MKLWVhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtb2R1bGUgZWxlbWVudCByZXByZXNlbnRzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi1jb25uZWN0b3IsIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUgbW9kdWxlIHR5cGUKLWFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4gb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsCi13aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvIHRoZSBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZSBtb2R1bGUgZWxlbWVudCBmb3IKLWVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uCi0tLT4KLTwhRUxFTUVOVCBtb2R1bGUgKChjb25uZWN0b3IgfCBlamIgfCBqYXZhIHwgd2ViKSwgYWx0LWRkPyk+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotVXNlZCBpbjogc2VjdXJpdHktcm9sZQotLS0+Ci08IUVMRU1FTlQgcm9sZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUKLXNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbgotCi1FeGFtcGxlOgotCi0gICAgPHNlY3VyaXR5LXJvbGU+Ci0JPGRlc2NyaXB0aW9uPgotCSAgICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKLQkgICAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLgotCTwvZGVzY3JpcHRpb24+Ci0JPHJvbGUtbmFtZT5lbXBsb3llZTwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgYXBwbGljYXRpb24ncwotZWFyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogaWNvbgotCi1FeGFtcGxlOgotCi08c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHdlYiBlbGVtZW50IGNvbnRhaW5zIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YgYSB3ZWIKLWFwcGxpY2F0aW9uIG1vZHVsZS4KLQotVXNlZCBpbjogbW9kdWxlCi0tLT4KLTwhRUxFTUVOVCB3ZWIgKHdlYi11cmksIGNvbnRleHQtcm9vdCk+Ci0KLTwhLS0KLVRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIgYXBwbGljYXRpb24gZmlsZSwKLXJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLVVzZWQgaW46IHdlYgotLS0+Ci08IUVMRU1FTlQgd2ViLXVyaSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZS4sIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbC1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRvb2xzIGFyZSBub3QgYWxsb3dlZCB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHRoZQotc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCBhbHQtZGQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXBwbGljYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdG9yIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnRleHQtcm9vdCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgamF2YSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1vZHVsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlYiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItdXJpIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzQueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDU4Y2ZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV80LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMS40Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylhcHBsaWNhdGlvbl8xXzQueHNkcwkxLjEzIDAyLzExLzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gMS40IGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkCi0JIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCIgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgZWFyIGZpbGUuCi0JQWxsIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQotCXRoZSBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEoyRUUgbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi0JYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxhcHBsaWNhdGlvbiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiCi0JICAgICAgdmVyc2lvbj0iMS40Ij4KLQkgICAgICAuLi4KLQkgICAgPC9hcHBsaWNhdGlvbj4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEoyRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24iIHR5cGU9ImoyZWU6YXBwbGljYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRQotCWFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iY29udGV4dC1yb290LXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSB1bmlxdWUKLQkgIGluIHRoZSBlYXIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bW9kdWxlL2oyZWU6d2ViIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmNvbnRleHQtcm9vdCIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlY3VyaXR5LXJvbGUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgc2VjdXJpdHktcm9sZS1uYW1lIGVsZW1lbnQgY29udGVudAotCSAgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGVhci4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhcHBsaWNhdGlvblR5cGUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHRoZQotCWFwcGxpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZSIKLQkJICAgdHlwZT0iajJlZTptb2R1bGVUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZQotCSAgICBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKMkVFIG1vZHVsZSBpbiB0aGUKLQkgICAgYXBwbGljYXRpb24gcGFja2FnZS4gQSBtb2R1bGUgZWxlbWVudCBpcyBkZWZpbmVkCi0JICAgIGJ5IG1vZHVsZVR5cGUgZGVmaW5pdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjEuNCIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuNC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1vZHVsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtb2R1bGVUeXBlIGRlZmluZXMgYSBzaW5nbGUgSjJFRSBtb2R1bGUgYW5kIGNvbnRhaW5zIGEKLQljb25uZWN0b3IsIGVqYiwgamF2YSwgb3Igd2ViIGVsZW1lbnQsIHdoaWNoIGluZGljYXRlcyB0aGUKLQltb2R1bGUgdHlwZSBhbmQgY29udGFpbnMgYSBwYXRoIHRvIHRoZSBtb2R1bGUgZmlsZSwgYW5kIGFuCi0Jb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8KLQl0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdG9yIgotCQkgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQotCSAgICAgIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUKLQkgICAgICB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZWpiIgotCQkgICAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwKLQkgICAgICByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbgotCSAgICAgIHBhY2thZ2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iamF2YSIKLQkJICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGphdmEgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIGphdmEKLQkgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wCi0JICAgICAgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0id2ViIgotCQkgICAgIHR5cGU9ImoyZWU6d2ViVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFsdC1kZCIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi0JICAgIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICAgIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4gIFRoZSBVUkkgbXVzdAotCSAgICBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0JICAgIGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290Ci0JICAgIGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llcgotCSAgICBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0Ci0JICAgIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUKLQkgICAgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYlR5cGUgZGVmaW5lcyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mCi0JYSB3ZWIgYXBwbGljYXRpb24gbW9kdWxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItdXJpIgotCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdlYi11cmkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHdlYgotCSAgICBhcHBsaWNhdGlvbiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZQotCSAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRleHQtcm9vdCIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCi0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdAotCSAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fNS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTA5NjYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjUiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWFwcGxpY2F0aW9uXzUueHNkcwkxLjE3IDA4LzA1LzA1Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIGFwcGxpY2F0aW9uIDUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQKLQkiTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIiBpbiB0aGUgYXBwbGljYXRpb24ncyBlYXIgZmlsZS4KLQlBbGwgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlCi0JdGhlIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8YXBwbGljYXRpb24geG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0JCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl81LnhzZCIKLQkgICAgICB2ZXJzaW9uPSI1Ij4KLQkgICAgICAuLi4KLQkgICAgPC9hcHBsaWNhdGlvbj4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24iIHR5cGU9ImphdmFlZTphcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBKYXZhIEVFCi0JYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJjb250ZXh0LXJvb3QtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgY29udGVudCBtdXN0IGJlIHVuaXF1ZQotCSAgaW4gdGhlIGVhci4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1vZHVsZS9qYXZhZWU6d2ViIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6Y29udGV4dC1yb290Ii8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0ic2VjdXJpdHktcm9sZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBzZWN1cml0eS1yb2xlLW5hbWUgZWxlbWVudCBjb250ZW50Ci0JICBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgZWFyLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhcHBsaWNhdGlvblR5cGUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHRoZQotCWFwcGxpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibW9kdWxlIgotCQkgICB0eXBlPSJqYXZhZWU6bW9kdWxlVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUKLQkgICAgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSmF2YSBFRSBtb2R1bGUgaW4gdGhlCi0JICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuIEEgbW9kdWxlIGVsZW1lbnQgaXMgZGVmaW5lZAotCSAgICBieSBtb2R1bGVUeXBlIGRlZmluaXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlicmFyeS1kaXJlY3RvcnkiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbGlicmFyeS1kaXJlY3RvcnkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lCi0JICAgIG9mIGEgZGlyZWN0b3J5IHdpdGhpbiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSwgcmVsYXRpdmUKLQkgICAgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4gIEFsbCBmaWxlcwotCSAgICBuYW1lZCAiKi5qYXIiIGluIHRoaXMgZGlyZWN0b3J5IG11c3QgYmUgbWFkZSBhdmFpbGFibGUKLQkgICAgaW4gdGhlIGNsYXNzIHBhdGggb2YgYWxsIGNvbXBvbmVudHMgaW5jbHVkZWQgaW4gdGhpcwotCSAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgSWYgdGhpcyBlbGVtZW50IGlzbid0IHNwZWNpZmllZCwKLQkgICAgdGhlIGRpcmVjdG9yeSBuYW1lZCAibGliIiBpcyBzZWFyY2hlZC4gIEFuIGVtcHR5IGVsZW1lbnQKLQkgICAgbWF5IGJlIHVzZWQgdG8gZGlzYWJsZSBzZWFyY2hpbmcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iNSIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtb2R1bGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbW9kdWxlVHlwZSBkZWZpbmVzIGEgc2luZ2xlIEphdmEgRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi0JY29ubmVjdG9yLCBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlCi0JbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbgotCW9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvCi0JdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3RvciIKLQkJICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQotCSAgICAgIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUKLQkgICAgICB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZWpiIgotCQkgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamIgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhbiBlamItamFyLAotCSAgICAgIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uCi0JICAgICAgcGFja2FnZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJqYXZhIgotCQkgICAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBqYXZhIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhCi0JICAgICAgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcAotCSAgICAgIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IndlYiIKLQkJICAgICB0eXBlPSJqYXZhZWU6d2ViVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFsdC1kZCIKLQkJICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUKLQkgICAgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgICAgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIEphdmEgRUUgbW9kdWxlLiAgVGhlIFVSSSBtdXN0Ci0JICAgIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQKLQkgICAgZGVzY3JpcHRvciBmaWxlIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbidzIHJvb3QKLQkgICAgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyCi0JICAgIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQKLQkgICAgbG9jYXRpb24gYW5kIGZpbGUgbmFtZSByZXF1aXJlZCBieSB0aGUgcmVzcGVjdGl2ZQotCSAgICBjb21wb25lbnQgc3BlY2lmaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2ViVHlwZSBkZWZpbmVzIHRoZSB3ZWItdXJpIGFuZCBjb250ZXh0LXJvb3Qgb2YKLQlhIHdlYiBhcHBsaWNhdGlvbiBtb2R1bGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi11cmkiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIKLQkgICAgYXBwbGljYXRpb24gZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUKLQkgICAgYXBwbGljYXRpb24gcGFja2FnZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXJvb3QiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCi0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdAotCSAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfMC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzAuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWIzYjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfMC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IDIwMDAtMjAwMSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCi1yZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgotb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIExvZ28sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsCi1hcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuCi1hbmQgb3RoZXIgY291bnRyaWVzLgotCi1BbGwgU1BBUkMgdHJhZGVtYXJrcyBhcmUgdXNlZCB1bmRlciBsaWNlbnNlIGFuZCBhcmUgdHJhZGVtYXJrcwotb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFNQQVJDIEludGVybmF0aW9uYWwsIEluYy4KLWluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuIFByb2R1Y3RzIGJlYXJpbmcgU1BBUkMKLXRyYWRlbWFya3MgYXJlIGJhc2VkIHVwb24gYW4gYXJjaGl0ZWN0dXJlIGRldmVsb3BlZCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvCi1TdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQotSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCi1UTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCi1JTlZBTElELgotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLUNvcHlyaWdodCAyMDAwLTIwMDEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4KLVRvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCi0KLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjCi1kZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAotZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgotYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4KLXF1ZSBjZSBzb2l0LCBzYW5zIGwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuCi0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0Ci1ldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIGxlIGxvZ28gU3VuLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLAotc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcyBkZSdwb3NlJ2VzIGRlIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLQotVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAotZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQwotSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucwotZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAotYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuCi0KLUxBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRVRBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVCBFWENMVUVTLAotREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTIE5PVEFNTUVOVAotVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEgTCdBUFRJVFVERQotQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFIENPTlRSRUZBQ09OLgotLS0+Ci0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBDb25uZWN0b3IgMS4wIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLUFsbCBDb25uZWN0b3IgMS4wIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQotb2YgdGhlIGZvbGxvd2luZyBmb3JtOgotCi0gIDwhRE9DVFlQRSBjb25uZWN0b3IgUFVCTElDCi0JIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBDb25uZWN0b3IgMS4wLy9FTiIKLQkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiPgotCi0tLT4KLQotPCEtLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBQQ0RBVEEsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLSAgaW4gdGhlIGRhdGEgbWF5IGJlIGlnbm9yZWQuCi0KLS0gSW4gZWxlbWVudHMgd2hvc2UgdmFsdWUgaXMgYW4gImVudW1lcmF0ZWQgdHlwZSIsIHRoZSB2YWx1ZSBpcwotICBjYXNlIHNlbnNpdGl2ZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZSBzYW1lCi0gIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdCBzdGFydGluZyB3aXRoICIvIikKLSAgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLgotICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkKLSAgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzZXJ2bGV0IEFQSS4KLS0tPgotCi0KLTwhLS0KLVRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gLSB2ZW5kb3IKLW5hbWUsIHZlcnNpb24sIHNwZWNpZmljYXRpb24gdmVyc2lvbiBzdXBwb3J0ZWQsIGljb24gLSAgYWJvdXQgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gSXQgYWxzbyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUKLWltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2gKLXRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci4KLS0tPgotPCFFTEVNRU5UIGNvbm5lY3RvciAoZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LCBpY29uPywgdmVuZG9yLW5hbWUsCi1zcGVjLXZlcnNpb24sIGVpcy10eXBlLCB2ZXJzaW9uLCBsaWNlbnNlPywgcmVzb3VyY2VhZGFwdGVyKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllcyBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20KLXN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gTm90ZSB0aGF0IHRoaXMgc3VwcG9ydCBpcyBmb3IKLXRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBub3QgZm9yIHRoZSB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4gVGhlCi1vcHRpb25hbCBkZXNjcmlwdGlvbiBzcGVjaWZpZXMgYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQKLWZvciB0aGUgc3VwcG9ydCBvZiBzZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi1Ob3RlIHRoYXQgQmFzaWNQYXNzd29yZCBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotLS0+Ci08IUVMRU1FTlQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtICgKLWRlc2NyaXB0aW9uPywgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUsIGNyZWRlbnRpYWwtaW50ZXJmYWNlKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24KLW1lY2hhbmlzbS4KLQotVGhlIGV4YW1wbGUgdmFsdWVzIGFyZToKLSAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkCi0gICAgICAgICAgICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjUKLSAgICAgICAgICAgICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotCi1BbnkgYWRkaXRpb25hbCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUKLUNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotVXNlZCBpbjogYXV0aGVudGljYXRpb24tbWVjaGFuaXNtCi0tLT4KLTwhRUxFTUVOVCBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgc2luZ2xlCi1jb25maWd1cmF0aW9uIHByb3BlcnR5IGZvciBhIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZS4KLQotRWFjaCBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UgY3JlYXRlcyBjb25uZWN0aW9ucyB0byBhCi1zcGVjaWZpYyBFSVMgaW5zdGFuY2UgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgY29uZmlndXJlZCBvbiB0aGUKLU1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZS4gVGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGFyZQotc3BlY2lmaWVkIG9ubHkgb25jZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBldmVuIHRob3VnaCBhCi1yZXNvdXJjZSBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSBNYW5hZ2VkQ29ubm5lY3Rpb24tCi1GYWN0b3J5IGluc3RhbmNlcyAodGhhdCBjcmVhdGUgY29ubmVjdGlvbnMgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZgotdGhlIHNhbWUgRUlTKS4KLQotVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLCB0eXBlCi1hbmQgYW4gb3B0aW9uYWwgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIElmIHRoZSByZXNvdXJjZQotYWRhcHRlciBwcm92aWRlciBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsdWUgdGhhbiB0aGUgZGVwbG95ZXIgaXMKLXJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotCi1BbnkgYm91bmRzIG9yIHdlbGwtZGVmaW5lZCB2YWx1ZXMgb2YgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkCi1pbiB0aGUgZGVzY3JpcHRpb24gZWxlbWVudC4KLQotVXNlZCBpbjogcmVzb3VyY2VhZGFwdGVyCi0tLT4KLTwhRUxFTUVOVCBjb25maWctcHJvcGVydHkgKGRlc2NyaXB0aW9uPywgY29uZmlnLXByb3BlcnR5LW5hbWUsCi1jb25maWctcHJvcGVydHktdHlwZSwgY29uZmlnLXByb3BlcnR5LXZhbHVlPyk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgY29uZmlndXJhdGlvbgotcHJvcGVydHkuCi0KLVRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIGRlZmluZXMgYSBzZXQgb2Ygd2VsbC1kZWZpbmVkIHByb3BlcnRpZXMKLWFsbCBvZiB0eXBlIGphdmEubGFuZy5TdHJpbmcuIFRoZXNlIGFyZSBhcyBmb2xsb3dzOgotICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+U2VydmVyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgIDxjb25maWctcHJvcGVydHktbmFtZT5Qb3J0TnVtYmVyPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPlVzZXJOYW1lPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPlBhc3N3b3JkPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPkNvbm5lY3Rpb25VUkw8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotCi1BIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgY2FuIGV4dGVuZCB0aGlzIHByb3BlcnR5IHNldCB0byBpbmNsdWRlCi1wcm9wZXJ0aWVzIHNwZWNpZmljIHRvIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBpdHMgdW5kZXJseWluZyBFSVMuCi0KLVVzZWQgaW46IGNvbmZpZy1wcm9wZXJ0eQotCi1FeGFtcGxlOiA8Y29uZmlnLXByb3BlcnR5LW5hbWU+U2VydmVyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBjb25maWctcHJvcGVydHktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS10eXBlIGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YQotdHlwZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgYXMgcmVxdWlyZWQgYnkgTWFuYWdlZENvbm5lY3Rpb24tCi1GYWN0b3J5IGluc3RhbmNlLgotCi1UaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGNvbmZpZy1wcm9wZXJ0eS10eXBlOgotICAgamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLAotICAgamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsIGphdmEubGFuZy5TaG9ydCwKLSAgIGphdmEubGFuZy5Mb25nLCBqYXZhLmxhbmcuRmxvYXQsIGphdmEubGFuZy5DaGFyYWN0ZXIKLQotVXNlZCBpbjogY29uZmlnLXByb3BlcnR5Ci0KLUV4YW1wbGU6IDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLS0tPgotPCFFTEVNRU5UIGNvbmZpZy1wcm9wZXJ0eS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LXZhbHVlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIGNvbmZpZ3VyYXRpb24KLWVudHJ5LgotCi1Vc2VkIGluOiBjb25maWctcHJvcGVydHkKLQotRXhhbXBsZTogPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT5Xb21iYXRTZXJ2ZXI8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLS0tPgotPCFFTEVNRU5UIGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbm5lY3Rpb24taW1wbC1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZAotbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBjbGFzcyB0aGF0IGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlcgotc3BlY2lmaWMgQ29ubmVjdGlvbiBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotCi1FeGFtcGxlOiA8Y29ubmVjdGlvbi1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkltcGwKLSAgICAgICAgIDwvY29ubmVjdGlvbi1pbXBsLWNsYXNzPgotLS0+Ci08IUVMRU1FTlQgY29ubmVjdGlvbi1pbXBsLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgY29ubmVjdGlvbi1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLW5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotCi1FeGFtcGxlOiA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb24KLSAgICAgICAgIDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0tLT4KLTwhRUxFTUVOVCBjb25uZWN0aW9uLWludGVyZmFjZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLW5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyCi1zcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotCi1FeGFtcGxlOiA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5SW1wbAotICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotLS0+Ci08IUVMRU1FTlQgY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSBzcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZAotbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotCi1FeGFtcGxlOiA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnkKLSAgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotT1IKLTxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLS0tPgotPCFFTEVNRU5UIGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNyZWRlbnRpYWwtaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgaW50ZXJmYWNlIHRoYXQgdGhlCi1yZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGZvciB0aGUgcmVwcmVzZW50YXRpb24KLW9mIHRoZSBjcmVkZW50aWFscy4gVGhpcyBlbGVtZW50IHNob3VsZCBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9uIHNlcnZlcgotdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwgaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UgYXMgcGFydCBvZiB0aGUKLXNlY3VyaXR5IGNvbnRyYWN0LgotCi1UaGUgcG9zc2libGUgdmFsdWVzIGFyZToKLSAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsCi0gICAgICAgIDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0gICAgICAgIDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0KLVVzZWQgaW46IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbQotLS0+Ci08IUVMRU1FTlQgY3JlZGVudGlhbC1pbnRlcmZhY2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQKLWVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdAotdGhlIHJlc291cmNlIGFkYXB0ZXIgcmFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLXRoZSByZXNvdXJjZSBhZGFwdGVyIHJhciBmaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scwotdXNlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlciByYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uCi13aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotCi1Vc2VkIGluOiBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20sIGNvbmZpZy1wcm9wZXJ0eSwgY29ubmVjdG9yLCBsaWNlbnNlLAotc2VjdXJpdHktcGVybWlzc2lvbgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLWRpc3BsYXllZCBieSB0b29scy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLQotRXhhbXBsZToKLQotPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGVpcy10eXBlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHRoZQotRUlTLiBGb3IgZXhhbXBsZSwgdGhlIHR5cGUgb2YgYW4gRUlTIGNhbiBiZSBwcm9kdWN0IG5hbWUgb2YgRUlTCi1pbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbiBpbmZvLgotCi1UaGlzIGhlbHBzIGluIGlkZW50aWZ5aW5nIEVJUyBpbnN0YW5jZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoCi10aGlzIHJlc291cmNlIGFkYXB0ZXIuCi0KLVVzZWQgaW46IGNvbm5lY3RvcgotLS0+Ci08IUVMRU1FTlQgZWlzLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMgdGhhdAotc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZXMKLXVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLS0tPgotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgbGFyZ2UgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIHJlc291cmNlIGFkYXB0ZXIncwotcmFyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogaWNvbgotCi1FeGFtcGxlOgotCi08bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgbGljZW5zZSBzcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlIHJlc291cmNlCi1hZGFwdGVyIG1vZHVsZS4gVGhpcyBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGEgbGljZW5zZSBpcyByZXF1aXJlZAotdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLCBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLW9mIHRoZSBsaWNlbnNpbmcgdGVybXMgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YKLWNvbm5lY3Rpb24gcmVzdHJpY3Rpb25zKS4KLQotVXNlZCBpbjogY29ubmVjdG9yCi0tLT4KLTwhRUxFTUVOVCBsaWNlbnNlIChkZXNjcmlwdGlvbj8sIGxpY2Vuc2UtcmVxdWlyZWQpPgotCi08IS0tCi1UaGUgZWxlbWVudCBsaWNlbnNlLXJlcXVpcmVkIHNwZWNpZmllcyB3aGV0aGVyIGEgbGljZW5zZSBpcyByZXF1aXJlZAotdG8gZGVwbG95IGFuZCB1c2UgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZgotdGhlIGZvbGxvd2luZzoKLQotCTxsaWNlbnNlLXJlcXVpcmVkPnRydWU8L2xpY2Vuc2UtcmVxdWlyZWQ+Ci0JPGxpY2Vuc2UtcmVxdWlyZWQ+ZmFsc2U8L2xpY2Vuc2UtcmVxdWlyZWQ+Ci0KLVVzZWQgaW46IGxpY2Vuc2UKLS0tPgotPCFFTEVNRU5UIGxpY2Vuc2UtcmVxdWlyZWQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQKLW5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBqYXZheC5yZXNvdXJjZS5zcGkuTWFuYWdlZC0KLUNvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YKLXJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZAotY29udHJhY3RzLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLQotRXhhbXBsZToKLSAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz5jb20ud29tYmF0Lk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUltcGwKLSAgPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlCi1hZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtCi1Db25uZWN0aW9uIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlIHJlc291cmNlCi1hZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZSB1bmRlcmx5aW5nIEVJUyBpbnN0YW5jZS4KLQotVGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIDxyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+dHJ1ZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotICAgICAgICA8cmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PmZhbHNlPC9yZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+Ci1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLS0tPgotPCFFTEVNRU5UIHJlYXV0aGVudGljYXRpb24tc3VwcG9ydCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlciBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlCi1hZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHktcXVhbGlmaWVkIG5hbWVzIG9mCi1jbGFzcy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YgdGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUKLXNwZWNpZmllZCBjb250cmFjdHMsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvdmlkZWQsCi1jb25maWd1cmFibGUgcHJvcGVydGllcyBmb3IgTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlcywKLW9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkIGFuZCBhZGRpdGlvbmFsCi1yZXF1aXJlZCBzZWN1cml0eSBwZXJtaXNzaW9ucy4KLQotSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi1yZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotc3VwcG9ydCBhbnkgc3RhbmRhcmQgc2VjdXJpdHkgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyBhcyBwYXJ0Ci1vZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzIHRoZSBzZWN1cml0eQotcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0KLVVzZWQgaW46IGNvbm5lY3RvcgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2VhZGFwdGVyICgKLW1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcywgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlLAotY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcywgY29ubmVjdGlvbi1pbnRlcmZhY2UsCi1jb25uZWN0aW9uLWltcGwtY2xhc3MsIHRyYW5zYWN0aW9uLXN1cHBvcnQsIGNvbmZpZy1wcm9wZXJ0eSosCi1hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20qLCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQsIHNlY3VyaXR5LXBlcm1pc3Npb24qCi0pPgotCi08IS0tCi1UaGUgZWxlbWVudCBzZWN1cml0eSBwZXJtaXNzaW9uIHNwZWNpZmllcyBhIHNlY3VyaXR5IHBlcm1pc3Npb24gdGhhdAotaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLQotVGhlIHNlY3VyaXR5IHBlcm1pc3Npb24gbGlzdGVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXJlIG9uZXMKLXRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZSBkZWZhdWx0IHBlcm1pc3Npb24gc2V0Ci1hcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3RvciBzcGVjaWZpY2F0aW9uLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24KLWNhbiBtZW50aW9uIHNwZWNpZmljIHJlYXNvbiB0aGF0IHJlc291cmNlIGFkYXB0ZXIgcmVxdWlyZXMgYSBnaXZlbgotc2VjdXJpdHkgcGVybWlzc2lvbi4KLQotVXNlZCBpbjogcmVzb3VyY2VhZGFwdGVyCi0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1wZXJtaXNzaW9uIChkZXNjcmlwdGlvbj8sIHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IHBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIGJhc2VkCi1vbiB0aGUgU2VjdXJpdHkgcG9saWN5IGZpbGUgc3ludGF4LiBSZWZlciB0byB0aGUgZm9sbG93aW5nIFVSTCBmb3IKLVN1bidzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIHNwZWNpZmljYXRpb246Ci0KLWh0dHA6Ci0KLVVzZWQgaW46IHNlY3VyaXR5LXBlcm1pc3Npb24KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIHJlc291cmNlIGFkYXB0ZXIncwotcmFyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogaWNvbgotCi1FeGFtcGxlOgotCi08c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgc3BlYy12ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgY29ubmVjdG9yCi1hcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlCi1hZGFwdGVyLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95ZXIgdG8gY29uZmlndXJlIHRoZSByZXNvdXJjZQotYWRhcHRlciB0byBzdXBwb3J0IGRlcGxveW1lbnQgYW5kIHJ1bnRpbWUgcmVxdWlyZW1lbnRzIG9mIHRoZQotY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLVVzZWQgaW46IGNvbm5lY3RvcgotCi1FeGFtcGxlOgotICA8c3BlYy12ZXJzaW9uPjEuMDwvc3BlYy12ZXJzaW9uPgotLS0+Ci08IUVMRU1FTlQgc3BlYy12ZXJzaW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRyYW5zYWN0aW9uLXN1cHBvcnQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxldmVsIG9mIHRyYW5zYWN0aW9uCi1zdXBwb3J0IHByb3ZpZGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotVGhlIHZhbHVlIG9mIHRyYW5zYWN0aW9uLXN1cHBvcnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSA8dHJhbnNhY3Rpb24tc3VwcG9ydD5Ob1RyYW5zYWN0aW9uPC90cmFuc2FjdGlvbi1zdXBwb3J0PgotIDx0cmFuc2FjdGlvbi1zdXBwb3J0PkxvY2FsVHJhbnNhY3Rpb248L3RyYW5zYWN0aW9uLXN1cHBvcnQ+Ci0gPHRyYW5zYWN0aW9uLXN1cHBvcnQ+WEFUcmFuc2FjdGlvbjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLQotVXNlZCBpbjogcmVzb3VyY2VhZGFwdGVyCi0tLT4KLTwhRUxFTUVOVCB0cmFuc2FjdGlvbi1zdXBwb3J0ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgdmVuZG9yLW5hbWUgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIKLXZlbmRvci4KLQotVXNlZCBpbjogY29ubmVjdG9yCi0KLUV4YW1wbGU6Ci0gIDx2ZW5kb3ItbmFtZT5Xb21iYXQgQ29ycC48L3ZlbmRvci1uYW1lPgotLS0+Ci08IUVMRU1FTlQgdmVuZG9yLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCB2ZXJzaW9uIHNwZWNpZmllcyBhIHN0cmluZy1iYXNlZCB2ZXJzaW9uIG9mIHRoZQotcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLQotRXhhbXBsZToKLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotLS0+Ci08IUVMRU1FTlQgdmVyc2lvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZS4sIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbC1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRvb2xzIGFyZSBub3QgYWxsb3dlZCB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHRoZQotc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29uZmlnLXByb3BlcnR5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbmZpZy1wcm9wZXJ0eS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbmZpZy1wcm9wZXJ0eS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb25uZWN0aW9uLWltcGwtY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdGlvbi1pbnRlcmZhY2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdG9yIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNyZWRlbnRpYWwtaW50ZXJmYWNlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlaXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGljZW5zZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaWNlbnNlLXJlcXVpcmVkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2VhZGFwdGVyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXBlcm1pc3Npb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3BlYy12ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zYWN0aW9uLXN1cHBvcnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmVuZG9yLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfNS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQxOTEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIxLjUiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWNvbm5lY3Rvcl8xXzUueHNkcwkxLjI3IDA2LzE3LzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgQ29ubmVjdG9yIDEuNSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotCSJNRVRBLUlORi9yYS54bWwiIGluIHRoZSBjb25uZWN0b3IncyByYXIgZmlsZS4gIEFsbCBDb25uZWN0b3IKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGNvbm5lY3RvciByZXNvdXJjZQotCWFkYXB0ZXIgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxjb25uZWN0b3IgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQkJIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QiCi0JICAgICAgdmVyc2lvbj0iMS41Ij4KLQkgICAgICAuLi4KLQkgICAgPC9jb25uZWN0b3I+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvY29ubmVjdG9yXzFfNS54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiIHR5cGU9ImoyZWU6Y29ubmVjdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbm5lY3RvciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzCi0JZ2VuZXJhbCBpbmZvcm1hdGlvbiAtIHZlbmRvciBuYW1lLCByZXNvdXJjZSBhZGFwdGVyIHZlcnNpb24sCi0JaWNvbiAtIGFib3V0IHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZS4gSXQgYWxzbyBpbmNsdWRlcwotCWluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLQlhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIGVsZW1lbnQKLQlyZXNvdXJjZWFkYXB0ZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY3RpdmF0aW9uc3BlY1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhY3RpdmF0aW9uc3BlY1R5cGUgc3BlY2lmaWVzIGFuIGFjdGl2YXRpb24KLQlzcGVjaWZpY2F0aW9uLiAgVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5IHF1YWxpZmllZAotCUphdmEgY2xhc3MgbmFtZSBvZiBhbiBhY3RpdmF0aW9uIHNwZWNpZmljYXRpb24gYW5kIGEgc2V0IG9mCi0JcmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uc3BlYy1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVsZW1lbnQgYWN0aXZhdGlvbnNwZWMtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseQotCSAgICAgIHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGFjdGl2YXRpb24KLQkgICAgICBzcGVjaWZpY2F0aW9uIGNsYXNzLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQotCSAgICAgIGphdmF4LnJlc291cmNlLnNwaS5BY3RpdmF0aW9uU3BlYyBpbnRlcmZhY2UuIFRoZQotCSAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYQotCSAgICAgIEphdmFCZWFuLgotCi0JICAgICAgRXhhbXBsZToKLQkJICA8YWN0aXZhdGlvbnNwZWMtY2xhc3M+Y29tLndvbWJhdC5BY3RpdmF0aW9uU3BlY0ltcGwKLQkJICA8L2FjdGl2YXRpb25zcGVjLWNsYXNzPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSIKLQkJICAgdHlwZT0iajJlZTpyZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRtaW5vYmplY3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYWRtaW5vYmplY3RUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhbgotCWFkbWluaXN0ZXJlZCBvYmplY3QuICBBZG1pbmlzdGVyZWQgb2JqZWN0cyBhcmUgc3BlY2lmaWMgdG8gYQotCW1lc3NhZ2luZyBzdHlsZSBvciBtZXNzYWdlIHByb3ZpZGVyLiAgVGhpcyBjb250YWlucwotCWluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieQotCWFuIGFkbWluaXN0ZXJlZCBvYmplY3QsIGl0cyBKYXZhIGNsYXNzIG5hbWUgYW5kIGl0cwotCWNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZG1pbm9iamVjdC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWludGVyZmFjZSBzcGVjaWZpZXMgdGhlCi0JICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSBvZiB0aGUKLQkgICAgICBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4KLQotCSAgICAgIEV4YW1wbGU6Ci0JCTxhZG1pbm9iamVjdC1pbnRlcmZhY2U+amF2YXguam1zLkRlc3RpbmF0aW9uCi0JCTwvYWRtaW5vYmplY3QtaW50ZXJmYWNlPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRtaW5vYmplY3QtY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGFkbWlub2JqZWN0LWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QuCi0KLQkgICAgICBFeGFtcGxlOgotCQkgIDxhZG1pbm9iamVjdC1jbGFzcz5jb20ud29tYmF0LkRlc3RpbmF0aW9uSW1wbAotCQkgIDwvYWRtaW5vYmplY3QtY2xhc3M+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIHNwZWNpZmllcyBhbiBhdXRoZW50aWNhdGlvbgotCW1lY2hhbmlzbSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIE5vdGUgdGhhdCB0aGlzCi0Jc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlCi0JdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBzcGVjaWZpZXMKLQlhbnkgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyByZXF1aXJlbWVudCBmb3IgdGhlIHN1cHBvcnQgb2YKLQlzZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi0JTm90ZSB0aGF0IEJhc2ljUGFzc3dvcmQgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCi0JamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0JVGhlIEtlcmJ2NSBtZWNoYW5pc20gdHlwZSBzaG91bGQgc3VwcG9ydCB0aGUKLQlvcmcuaWV0Zi5qZ3NzLkdTU0NyZWRlbnRpYWwgaW50ZXJmYWNlIG9yIHRoZSBkZXByZWNhdGVkCi0JamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsIGludGVyZmFjZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzCi0JICAgICAgdHlwZSBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCi0KLQkgICAgICBUaGUgZXhhbXBsZSB2YWx1ZXMgYXJlOgotCi0JICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQKLQkgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotCi0JICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NQotCSAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0KLQkgICAgICBBbnkgYWRkaXRpb25hbCBzZWN1cml0eSBtZWNoYW5pc21zIGFyZSBvdXRzaWRlIHRoZQotCSAgICAgIHNjb3BlIG9mIHRoZSBDb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcmVkZW50aWFsLWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpjcmVkZW50aWFsLWludGVyZmFjZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHktbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICBjb25maWd1cmF0aW9uIHByb3BlcnR5LgotCi0JICBUaGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBkZWZpbmVzIGEgc2V0IG9mIHdlbGwtZGVmaW5lZAotCSAgcHJvcGVydGllcyBhbGwgb2YgdHlwZSBqYXZhLmxhbmcuU3RyaW5nLiBUaGVzZSBhcmUgYXMKLQkgIGZvbGxvd3MuCi0KLQkgICAgICAgU2VydmVyTmFtZQotCSAgICAgICBQb3J0TnVtYmVyCi0JICAgICAgIFVzZXJOYW1lCi0JICAgICAgIFBhc3N3b3JkCi0JICAgICAgIENvbm5lY3Rpb25VUkwKLQotCSAgQSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGNhbiBleHRlbmQgdGhpcyBwcm9wZXJ0eSBzZXQgdG8KLQkgIGluY2x1ZGUgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgaXRzCi0JICB1bmRlcmx5aW5nIEVJUy4KLQotCSAgUG9zc2libGUgdmFsdWVzIGluY2x1ZGUKLQkJICBTZXJ2ZXJOYW1lCi0JCSAgUG9ydE51bWJlcgotCQkgIFVzZXJOYW1lCi0JCSAgUGFzc3dvcmQKLQkJICBDb25uZWN0aW9uVVJMCi0KLQkgIEV4YW1wbGU6IDxjb25maWctcHJvcGVydHktbmFtZT5TZXJ2ZXJOYW1lPC9jb25maWctcHJvcGVydHktbmFtZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZFN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBjb25maWctcHJvcGVydHktdHlwZVR5cGUgY29udGFpbnMgdGhlIGZ1bGx5Ci0JICBxdWFsaWZpZWQgSmF2YSB0eXBlIG9mIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLQotCSAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlczoKLQkgICAgIGphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwKLQkgICAgIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsCi0JICAgICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0KLQkgIFVzZWQgaW46IGNvbmZpZy1wcm9wZXJ0eQotCi0JICBFeGFtcGxlOgotCSAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQm9vbGVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuSW50ZWdlciIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Eb3VibGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TaG9ydCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Mb25nIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkNoYXJhY3RlciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSBzaW5nbGUKLQljb25maWd1cmF0aW9uIHByb3BlcnR5IHRoYXQgbWF5IGJlIHVzZWQgZm9yIHByb3ZpZGluZwotCWNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0KLQlUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIG5hbWUsCi0JdHlwZSBhbmQgYW4gb3B0aW9uYWwgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuIElmCi0JdGhlIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4KLQl0aGUgZGVwbG95ZXIgaXMgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBhIHZhbGlkIHZhbHVlIGZvcgotCWEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLQotCUFueSBib3VuZHMgb3Igd2VsbC1kZWZpbmVkIHZhbHVlcyBvZiBwcm9wZXJ0aWVzIHNob3VsZCBiZQotCWRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24gZWxlbWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LXZhbHVlIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBjb250YWlucyB0aGUgdmFsdWUKLQkgICAgICBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuIE5vdGUsIGl0IGlzIHBvc3NpYmxlIGZvciBhCi0JICAgICAgcmVzb3VyY2UgYWRhcHRlciBkZXBsb3llciB0byBvdmVycmlkZSB0aGlzCi0JICAgICAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBkdXJpbmcgZGVwbG95bWVudC4KLQotCSAgICAgIEV4YW1wbGU6Ci0JICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT5Xb21iYXRTZXJ2ZXI8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSBkZWZpbmVzIGEgc2V0IG9mIGNvbm5lY3Rpb24KLQlpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHBlcnRhaW5pbmcgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24KLQl0eXBlLiBUaGlzIGFsc28gaW5jbHVkZXMgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yCi0JTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlcyB0aGF0IG1heSBiZSBwcm9kdWNlZCBvdXQKLQlvZiB0aGlzIHNldC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyBzcGVjaWZpZXMKLQkgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotCSAgICAgIGltcGxlbWVudHMgdGhlCi0JICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCi0JICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UKLQkgICAgICBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZQotCSAgICAgIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0JICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQotCSAgICAgIEV4YW1wbGU6Ci0JICAgICAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4KLQkJICBjb20ud29tYmF0Lk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUltcGwKLQkgICAgICA8L21hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIHNwZWNpZmllcwotCSAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbkZhY3RvcnkKLQkgICAgICBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCi0JICAgICAgRXhhbXBsZToKLQkgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnkKLQkgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLQotCSAgICAgIE9SCi0KLQkgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uRmFjdG9yeQotCSAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVsZW1lbnQgY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyBzcGVjaWZpZXMKLQkgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0JICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLQkgICAgICBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKLQkgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBjb25uZWN0aW9uLWludGVyZmFjZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBpbnRlcmZhY2Ugc3VwcG9ydGVkCi0JICAgICAgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JCSAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uCi0JCSAgPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWltcGwtY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3NUeXBlIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgQ29ubmVjdGlvbiBjbGFzcyB0aGF0Ci0JICAgICAgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIENvbm5lY3Rpb24KLQkgICAgICBpbnRlcmZhY2UuICBJdCBpcyB1c2VkIGJ5IHRoZSBjb25uZWN0aW9uLWltcGwtY2xhc3MKLQkgICAgICBlbGVtZW50cy4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkJICA8Y29ubmVjdGlvbi1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkltcGwKLQkJICA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY29ubmVjdG9yVHlwZSBkZWZpbmVzIGEgcmVzb3VyY2UgYWRhcHRlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZW5kb3ItbmFtZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgdmVuZG9yLW5hbWUgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICAgIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgdmVuZG9yLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVpcy10eXBlIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCBlaXMtdHlwZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkgICAgdHlwZSBvZiB0aGUgRUlTLiBGb3IgZXhhbXBsZSwgdGhlIHR5cGUgb2YgYW4gRUlTIGNhbgotCSAgICBiZSBwcm9kdWN0IG5hbWUgb2YgRUlTIGluZGVwZW5kZW50IG9mIGFueSB2ZXJzaW9uCi0JICAgIGluZm8uCi0KLQkgICAgVGhpcyBoZWxwcyBpbiBpZGVudGlmeWluZyBFSVMgaW5zdGFuY2VzIHRoYXQgY2FuIGJlCi0JICAgIHVzZWQgd2l0aCB0aGlzIHJlc291cmNlIGFkYXB0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2VhZGFwdGVyLXZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlbGVtZW50IHJlc291cmNlYWRhcHRlci12ZXJzaW9uIHNwZWNpZmllcyBhIHN0cmluZy1iYXNlZCB2ZXJzaW9uCi0JICAgIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIGZyb20gdGhlIHJlc291cmNlIGFkYXB0ZXIKLQkgICAgcHJvdmlkZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWNlbnNlIgotCQkgICB0eXBlPSJqMmVlOmxpY2Vuc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZWFkYXB0ZXIiCi0JCSAgIHR5cGU9ImoyZWU6cmVzb3VyY2VhZGFwdGVyVHlwZSIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjEuNSIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlCi0JICBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcwotCSAgc3VwcG9ydGVkIGJ5IHRoaXMgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBpbmZvcm1hdGlvbgotCSAgZW5hYmxlcyBkZXBsb3llciB0byBjb25maWd1cmUgdGhlIHJlc291cmNlIGFkYXB0ZXIgdG8KLQkgIHN1cHBvcnQgZGVwbG95bWVudCBhbmQgcnVudGltZSByZXF1aXJlbWVudHMgb2YgdGhlCi0JICBjb3JyZXNwb25kaW5nIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjcmVkZW50aWFsLWludGVyZmFjZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjcmVkZW50aWFsLWludGVyZmFjZVR5cGUgc3BlY2lmaWVzIHRoZQotCWludGVyZmFjZSB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uCi0Jc3VwcG9ydHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLQljcmVkZW50aWFscy4gVGhpcyBlbGVtZW50KHMpIHRoYXQgdXNlIHRoaXMgdHlwZSwKLQlpLmUuIGNyZWRlbnRpYWwtaW50ZXJmYWNlLCAgc2hvdWxkIGJlIHVzZWQgYnkKLQlhcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwKLQlpbnRlcmZhY2UgaXQgc2hvdWxkIHVzZSBhcyBwYXJ0IG9mIHRoZSBzZWN1cml0eQotCWNvbnRyYWN0LgotCi0JVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0KLQlqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsCi0Jb3JnLmlldGYuamdzcy5HU1NDcmVkZW50aWFsCi0JamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LkdlbmVyaWNDcmVkZW50aWFsCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDplbnVtZXJhdGlvbgotCSAgICAgdmFsdWU9ImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwiLz4KLQk8eHNkOmVudW1lcmF0aW9uCi0JICAgICB2YWx1ZT0ib3JnLmlldGYuamdzcy5HU1NDcmVkZW50aWFsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbgotCSAgICAgdmFsdWU9ImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24KLQlhYm91dCBhbiBpbmJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24KLQlzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIKLQlsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBtZXNzYWdlYWRhcHRlciBlbGVtZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VhZGFwdGVyIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2VhZGFwdGVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlbGlzdGVuZXItdHlwZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2VsaXN0ZW5lci10eXBlIGVsZW1lbnQgY29udGVudCBtdXN0IGJlCi0JICAgICAgdW5pcXVlIGluIHRoZSBtZXNzYWdlYWRhcHRlci4gU2V2ZXJhbCBtZXNzYWdlbGlzdGVuZXJzCi0JICAgICAgY2FuIG5vdCB1c2UgdGhlIHNhbWUgbWVzc2FnZWxpc3RlbmVyLXR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lciIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlbGlzdGVuZXItdHlwZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGljZW5zZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsaWNlbnNlVHlwZSBzcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlCi0JcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIFRoaXMgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBhCi0JbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGlzIHJlc291cmNlIGFkYXB0ZXIsCi0JYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMKLQkoZXhhbXBsZXM6IGR1cmF0aW9uIG9mIGxpY2Vuc2UsIG51bWJlciBvZiBjb25uZWN0aW9uCi0JcmVzdHJpY3Rpb25zKS4gSXQgaXMgdXNlZCBieSB0aGUgbGljZW5zZSBlbGVtZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpY2Vuc2UtcmVxdWlyZWQiCi0JCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCBsaWNlbnNlLXJlcXVpcmVkIHNwZWNpZmllcyB3aGV0aGVyIGEKLQkgICAgbGljZW5zZSBpcyByZXF1aXJlZCB0byBkZXBsb3kgYW5kIHVzZSB0aGUKLQkgICAgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mCi0JICAgIHRoZSBmb2xsb3dpbmcsICJ0cnVlIiBvciAiZmFsc2UiLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2VhZGFwdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JbWVzc2FnaW5nIGNhcGFiaWxpdGllcyBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcwotCWNvbnRhaW5zIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLQlyZXNvdXJjZSBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCi0JbWVzc2FnZWxpc3RlbmVyIGVsZW1lbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2VsaXN0ZW5lclR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZWxpc3RlbmVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEKLQlzcGVjaWZpYyBtZXNzYWdlIGxpc3RlbmVyIHN1cHBvcnRlZCBieSB0aGUgbWVzc2FnaW5nCi0JcmVzb3VyY2UgYWRhcHRlci4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIEphdmEgdHlwZQotCW9mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbgotCXNwZWNpZmljYXRpb24uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZWxpc3RlbmVyLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IG1lc3NhZ2VsaXN0ZW5lci10eXBlIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIGEgbWVzc2FnZQotCSAgICAgIGxpc3RlbmVyIGludGVyZmFjZS4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkJPG1lc3NhZ2VsaXN0ZW5lci10eXBlPmphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIKLQkJPC9tZXNzYWdlbGlzdGVuZXItdHlwZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb25zcGVjIgotCQkgICB0eXBlPSJqMmVlOmFjdGl2YXRpb25zcGVjVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dAotCWFuIG91dGJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseQotCXF1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZgotCXRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMgZm9yCi0JY29ubmVjdGlvbiBtYW5hZ2VtZW50LCBsZXZlbCBvZiB0cmFuc2FjdGlvbiBzdXBwb3J0Ci0JcHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkCi0JYW5kIGFkZGl0aW9uYWwgcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuCi0KLQlJZiB0aGVyZSBpcyBubyBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gc3BlY2lmaWVkIGFzIHBhcnQgb2YKLQlyZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnQgdGhlbiB0aGUgcmVzb3VyY2UgYWRhcHRlciBkb2VzIG5vdAotCXN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMKLQlwYXJ0IG9mIHNlY3VyaXR5IGNvbnRyYWN0LiBUaGUgYXBwbGljYXRpb24gc2VydmVyIGlnbm9yZXMKLQl0aGUgc2VjdXJpdHkgcGFydCBvZiB0aGUgc3lzdGVtIGNvbnRyYWN0cyBpbiB0aGlzIGNhc2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1kZWZpbml0aW9uIgotCQkgICB0eXBlPSJqMmVlOmNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24tc3VwcG9ydCIKLQkJICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSIKLQkJICAgdHlwZT0iajJlZTphdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IgotCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IHNwZWNpZmllcwotCSAgICB3aGV0aGVyIHRoZSByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCi0JICAgIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGV4aXN0aW5nIE1hbmFnZWQtIENvbm5lY3Rpb24KLQkgICAgaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGZvciB0aGUKLQkgICAgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUKLQkgICAgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoaXMgZWxlbWVudCBtdXN0IGhhdmUKLQkgICAgZWl0aGVyIGEgInRydWUiIG9yICJmYWxzZSIgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLQkgIG9mIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdXNlZCBmb3Igc3BlY2lmeWluZyBhCi0JICByZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWUuIEl0IGlzIHVzZWQKLQkgIGJ5IHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSBlbGVtZW50cy4KLQotCSAgRXhhbXBsZToKLQotCSAgPHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT5EZXN0aW5hdGlvbjwvcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2VhZGFwdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCXJlc291cmNlIGFkYXB0ZXIuIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLQlyZXNvdXJjZSBhZGFwdGVyIEphdmEgY2xhc3MgbmFtZSwgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLAotCWluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLQlhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCi0Jb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyIGFuZCBpbmJvdW5kLXJlc291cmNlYWRhcHRlcgotCWVsZW1lbnRzLCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGFkbWluaXN0ZXJlZCBvYmplY3RzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXItY2xhc3Mgc3BlY2lmaWVzIHRoZQotCSAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCi0JICAgIHRoZSBqYXZheC5yZXNvdXJjZS5zcGkuUmVzb3VyY2VBZGFwdGVyCi0JICAgIGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YKLQkgICAgcmVzb3VyY2UgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvcgotCSAgICBhcmNoaXRlY3R1cmUgc3BlY2lmaWVkIGNvbnRyYWN0cy4gVGhlIGltcGxlbWVudGF0aW9uCi0JICAgIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eSIKLQkJICAgdHlwZT0iajJlZTpjb25maWctcHJvcGVydHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyIgotCQkgICB0eXBlPSJqMmVlOm91dGJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0iY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIGVsZW1lbnQgY29udGVudAotCSAgICAgIG11c3QgYmUgdW5pcXVlIGluIHRoZSBvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXIuCi0JICAgICAgTXVsdGlwbGUgY29ubmVjdGlvbi1kZWZpbml0aW9ucyBjYW4gbm90IHVzZSB0aGUKLQkgICAgICBzYW1lIGNvbm5lY3Rpb25mYWN0b3J5LXR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmNvbm5lY3Rpb24tZGVmaW5pdGlvbiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluYm91bmQtcmVzb3VyY2VhZGFwdGVyIgotCQkgICB0eXBlPSJqMmVlOmluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRtaW5vYmplY3QiCi0JCSAgIHR5cGU9ImoyZWU6YWRtaW5vYmplY3RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcGVybWlzc2lvbiIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktcGVybWlzc2lvblR5cGUgc3BlY2lmaWVzIGEgc2VjdXJpdHkKLQlwZXJtaXNzaW9uIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgY29kZS4KLQotCVRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIGxpc3RlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JYXJlIG9uZXMgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UgcmVxdWlyZWQgYnkgdGhlCi0JZGVmYXVsdCBwZXJtaXNzaW9uIHNldCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3RvcgotCXNwZWNpZmljYXRpb24uIFRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBjYW4gbWVudGlvbiBzcGVjaWZpYwotCXJlYXNvbiB0aGF0IHJlc291cmNlIGFkYXB0ZXIgcmVxdWlyZXMgYSBnaXZlbiBzZWN1cml0eQotCXBlcm1pc3Npb24uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCBzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWMgc3BlY2lmaWVzIGEgc2VjdXJpdHkKLQkgICAgcGVybWlzc2lvbiBiYXNlZCBvbiB0aGUgU2VjdXJpdHkgcG9saWN5IGZpbGUKLQkgICAgc3ludGF4LiBSZWZlciB0byB0aGUgZm9sbG93aW5nIFVSTCBmb3IgU3VuJ3MKLQkgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlY3VyaXR5IHBlcm1pc3Npb24KLQkgICAgc3BlY2lmaWNhdGlvbjoKLQotCSAgICBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjQvZG9jcy9ndWlkZS9zZWN1cml0eS9Qb2xpY3lGaWxlcy5odG1sI0ZpbGVTeW50YXgKLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSBzcGVjaWZpZXMgdGhlIGxldmVsIG9mCi0JdHJhbnNhY3Rpb24gc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gSXQgaXMKLQl1c2VkIGJ5IHRyYW5zYWN0aW9uLXN1cHBvcnQgZWxlbWVudHMuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBOb1RyYW5zYWN0aW9uCi0JICAgIExvY2FsVHJhbnNhY3Rpb24KLQkgICAgWEFUcmFuc2FjdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm9UcmFuc2FjdGlvbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsVHJhbnNhY3Rpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYQVRyYW5zYWN0aW9uIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMV8xLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8xXzEuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmQ4MzhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8xXzEuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsODk0ICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENBICA5NDMwMywgVS5TLkEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCi1yZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgotb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuICAKLQotVGhpcmQgcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZCAKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4gCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBMb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsIGFuZCBFbnRlcnByaXNlIEphdmFCZWFucywgCi1hcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuIAotYW5kIG90aGVyIGNvdW50cmllcy4KLQotQWxsIFNQQVJDIHRyYWRlbWFya3MgYXJlIHVzZWQgdW5kZXIgbGljZW5zZSBhbmQgYXJlIHRyYWRlbWFya3MKLW9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTUEFSQyBJbnRlcm5hdGlvbmFsLCBJbmMuCi1pbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLiBQcm9kdWN0cyBiZWFyaW5nIFNQQVJDCi10cmFkZW1hcmtzIGFyZSBiYXNlZCB1cG9uIGFuIGFyY2hpdGVjdHVyZSBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAKLQotUG9zdFNjcmlwdCBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMsIEluYy4gCi0KLSAKLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvIAotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotCi0gCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQotSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCi1UTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCi1JTlZBTElELgotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKLTkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4gCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotIAotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnIGF2ZWMgCi1kZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAotZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgotYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4gCi1xdWUgY2Ugc29pdCwgc2FucyBsJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyAKLWJhaWxsZXVycyBkZSBsaWNlbmNlLCBzJ2lsIHkgZW4gYS4gIAotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZSAKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgCi1ldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotIAotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCBsZSBsb2dvIFN1biwgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCwgZXQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsICAKLXNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTdW4gCi1NaWNyb3N5c3RlbXMsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcyBwYXlzLgotIAotVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAotZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQwotSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucwotZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAotYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgCi0KLVBvc3RjcmlwdCBlc3QgdW5lIG1hcnF1ZSBlbnJlZ2lzdHJlJ2UgZCdBZG9iZSBTeXN0ZW1zIEluYy4gCi0gCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0VUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQgRVhDTFVFUywKLURBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUyBOT1RBTU1FTlQKLVRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBIEwnQVBUSVRVREUKLUEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERSBDT05UUkVGQUNPTi4KLS0tPgotCi0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBFSkIgMS4xIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLS0tPgotCi0KLTwhLS0KLVRoZSBhc3NlbWJseS1kZXNjcmlwdG9yIGVsZW1lbnQgY29udGFpbnMgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uCi0KLVRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhcnRzOgotdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywKLWFuZCB0aGUgZGVmaW5pdGlvbiBvZiB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvciBlbnRlcnByaXNlIGJlYW5zIHdpdGgKLWNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLgotCi1BbGwgdGhlIHBhcnRzIGFyZSBvcHRpb25hbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZQotbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLVByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMKLW9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyLgotCi1Vc2VkIGluOiBlamItamFyCi0tLT4KLTwhRUxFTUVOVCBhc3NlbWJseS1kZXNjcmlwdG9yIChzZWN1cml0eS1yb2xlKiwgbWV0aG9kLXBlcm1pc3Npb24qLAotCQljb250YWluZXItdHJhbnNhY3Rpb24qKT4KLQotPCEtLQotVGhlIGNtcC1maWVsZCBlbGVtZW50IGRlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUgZmllbGQKLWVsZW1lbnQgaW5jbHVkZXMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLCBhbmQgdGhlIG5hbWUgb2YKLXRoZSBmaWVsZC4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCBjbXAtZmllbGQgKGRlc2NyaXB0aW9uPywgZmllbGQtbmFtZSk+Ci0KLTwhLS0KLVRoZSBjb250YWluZXItdHJhbnNhY3Rpb24gZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZCBpbnZvY2F0aW9ucy4KLVRoZSBlbGVtZW50IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2YgbWV0aG9kCi1lbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLlRoZSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8KLWJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLQotVXNlZCBpbjogYXNzZW1ibHktZGVzY3JpcHRvcgotLS0+Ci08IUVMRU1FTlQgY29udGFpbmVyLXRyYW5zYWN0aW9uIChkZXNjcmlwdGlvbj8sIG1ldGhvZCssCi0JCXRyYW5zLWF0dHJpYnV0ZSk+Ci0KLTwhLS0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBwcm92aWRlCi10ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LgotCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUgZWpiLWphcgotZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgZWpiLWphciBmaWxlCi0oaS5lLiB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUKLWNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQKLWVsZW1lbnQuCi0KLVVzZWQgaW46IGNtcC1maWVsZCwgY29udGFpbmVyLXRyYW5zYWN0aW9uLCBlamItamFyLCBlbnRpdHksIGVudi1lbnRyeSwKLWVqYi1yZWYsIG1ldGhvZCwgbWV0aG9kLXBlcm1pc3Npb24sIHJlc291cmNlLXJlZiwgc2VjdXJpdHktcm9sZSwKLXNlY3VyaXR5LXJvbGUtcmVmLCBhbmQgc2Vzc2lvbi4KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5IGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBlamItamFyLCBzZXNzaW9uLCBhbmQgZW50aXR5Ci0KLUV4YW1wbGU6Ci0JPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4KLQotVXNlZCBpbjogZW50aXR5IGFuZCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0JCTxlamItY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZUJlYW48L2VqYi1jbGFzcz4KLS0tPgotPCFFTEVNRU5UIGVqYi1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUiBmaWxlIHRoYXQgY29udGFpbnMKLXRoZSBjbGFzcyBmaWxlcyBuZWNlc3NhcnkgZm9yIGEgY2xpZW50IHByb2dyYW0gdG8gYWNjZXNzIHRoZSBlbnRlcnByaXNlCi1iZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLiBUaGUgRGVwbG95ZXIgc2hvdWxkIG1ha2UgdGhlIGVqYi1jbGllbnQgSkFSCi1maWxlIGFjY2Vzc2libGUgdG8gdGhlIGNsaWVudCdzIGNsYXNzLWxvYWRlci4KLQotVXNlZCBpbjogZWpiLWphcgotCi1FeGFtcGxlOgotCTxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXI8L2VqYi1jbGllbnQtamFyPgotLS0+Ci08IUVMRU1FTlQgZWpiLWNsaWVudC1qYXIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWphciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlLAotb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZSwgb3B0aW9uYWwgbGFyZ2UKLWljb24gZmlsZSBuYW1lLCBtYW5kYXRvcnkgc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLWVudGVycHJpc2UgYmVhbnMsIG9wdGlvbmFsIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGRlc2NyaXB0b3IsIGFuZCBhbgotb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUgZWpiLWphci4KLS0tPgotPCFFTEVNRU5UIGVqYi1qYXIgKGRlc2NyaXB0aW9uPywgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sCi0JCWxhcmdlLWljb24/LCBlbnRlcnByaXNlLWJlYW5zLCBhc3NlbWJseS1kZXNjcmlwdG9yPywKLQkJZWpiLWNsaWVudC1qYXI/KT4KLQotPCEtLQotVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhbgotRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW5vdGhlciBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIGVqYi1qYXIKLWZpbGUuCi0KLVRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbiBlbnRlcnByaXNlCi1iZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSwgb3IgaW4gYW5vdGhlciBlamItamFyIGZpbGUgaW4gdGhlIHNhbWUKLUoyRUUgYXBwbGljYXRpb24gdW5pdC4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCQk8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgotLS0+Ci08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbmFtZS4gVGhpcyBuYW1lIGlzCi1hc3NpZ25lZCBieSB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIGVudGVycHJpc2UgYmVhbiBpbgotdGhlIGVqYi1qYXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgYW1vbmcKLXRoZSBuYW1lcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUuCi0KLVRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIG5hbWU7IHRoZXJlZm9yZSB0aGUKLW5hbWUgY2FuIGJlIGNoYW5nZWQgZHVyaW5nIHRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBwcm9jZXNzIHdpdGhvdXQKLWJyZWFraW5nIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBmdW5jdGlvbi4KLQotVGhlcmUgaXMgbm8gYXJjaGl0ZWN0ZWQgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGVqYi1uYW1lIGluIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCB0aGUgSk5ESSBuYW1lIHRoYXQgdGhlIERlcGxveWVyIHdpbGwgYXNzaWduCi10byB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4KLQotVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi1Vc2VkIGluOiBlbnRpdHksIG1ldGhvZCwgYW5kIHNlc3Npb24KLQotRXhhbXBsZToKLQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvCi1hbm90aGVyIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb247IHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgcmVmZXJlbmNpbmcKLWVudGVycHJpc2UgYmVhbjsgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOwotdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UKLWJlYW47IGFuZCBhbiBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbi4KLQotVGhlIG9wdGlvbmFsIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkCi1lbnRlcnByaXNlIGJlYW4uIEl0IGlzIHVzZWQgdHlwaWNhbGx5IGluIGVqYi1qYXIgZmlsZXMgdGhhdCBjb250YWluIGFuCi1hc3NlbWJsZWQgYXBwbGljYXRpb24uCi0KLVVzZWQgaW46IGVudGl0eSBhbmQgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwgaG9tZSwKLQkJcmVtb3RlLCBlamItbGluaz8pPgotCi08IS0tCi1UaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQgotcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBlbnZpcm9ubWVudC4KLQotSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0JCTxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZAotZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkJPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLQkJPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0KLVVzZWQgaW46IGVqYi1yZWYKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiBvbmUgb3IgbW9yZQotZW50ZXJwcmlzZSBiZWFucy4KLS0tPgotPCFFTEVNRU5UIGVudGVycHJpc2UtYmVhbnMgKHNlc3Npb24gfCBlbnRpdHkpKz4KLQotPCEtLQotVGhlIGVudGl0eSBlbGVtZW50IGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMKLW9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uCi1maWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lOyBhIG5hbWUgYXNzaWduZWQgdG8gdGhlCi1lbnRlcnByaXNlIGJlYW4gaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkKLWJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlczsgdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24KLWNsYXNzOyB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGU7IHRoZSBlbnRpdHkgYmVhbidzCi1wcmltYXJ5IGtleSBjbGFzcyBuYW1lOyBhbiBpbmRpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlZW50cmFuY3k7Ci1hbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkczsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbgotb2YgdGhlIHByaW1hcnkga2V5IGZpZWxkOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyaWVzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQgotcmVmZXJlbmNlczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlczsKLWFuZCBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgotZmFjdG9yeSByZWZlcmVuY2VzLgotCi1UaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUKLWVudGl0eSdzIHBlcnNpc3RlbmN5LXR5cGUgaXMgQ29udGFpbmVyLgotCi1UaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQKLXRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotCi1BdCBsZWFzdCBvbmUgY21wLWZpZWxkIGVsZW1lbnQgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmIHRoZQotZW50aXR5J3MgcGVyc2lzdGVuY3ktdHlwZSBpcyBDb250YWluZXIsIGFuZCBub25lIG11c3Qgbm90IGJlIHByZXNlbnQgaWYKLXRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uCi0KLVVzZWQgaW46IGVudGVycHJpc2UtYmVhbnMKLS0tPgotPCFFTEVNRU5UIGVudGl0eSAoZGVzY3JpcHRpb24/LCBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywKLQkJbGFyZ2UtaWNvbj8sIGVqYi1uYW1lLCBob21lLCByZW1vdGUsIGVqYi1jbGFzcywKLQkJcGVyc2lzdGVuY2UtdHlwZSwgcHJpbS1rZXktY2xhc3MsIHJlZW50cmFudCwKLQkJY21wLWZpZWxkKiwgcHJpbWtleS1maWVsZD8sIGVudi1lbnRyeSosCi0JCWVqYi1yZWYqLCBzZWN1cml0eS1yb2xlLXJlZiosIHJlc291cmNlLXJlZiopPgotCi08IS0tCi1UaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyaWVzLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4KLQotVXNlZCBpbjogZW50aXR5IGFuZCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnkgKGRlc2NyaXB0aW9uPywgZW52LWVudHJ5LW5hbWUsIGVudi1lbnRyeS10eXBlLAotCQllbnYtZW50cnktdmFsdWU/KT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWVudmlyb25tZW50IGVudHJ5LgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQkJPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mCi10aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLWNvZGUuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6Ci1qYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi1qYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LCBqYXZhLmxhbmcuTG9uZywgYW5kCi1qYXZhLmxhbmcuRmxvYXQuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCQk8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyeS4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0JCTxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGNvbnRhaW5lciBtYW5hZ2VkIGZpZWxkLgotVGhlIG5hbWUgbXVzdCBiZSBhIHB1YmxpYyBmaWVsZCBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIG9uZSBvZgotaXRzIHN1cGVyY2xhc3Nlcy4KLQotVXNlZCBpbjogY21wLWZpZWxkCi0KLUV4YW1wbGU6Ci0JCTxmaWVsZC1uYW1lPmZpcnN0TmFtZTwvZmllbGQtTmFtZT4KLS0tPgotPCFFTEVNRU5UIGZpZWxkLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmLCBlbnRpdHksIGFuZCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0JCTxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotLS0+Ci08IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBsYXJnZQotKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGVqYi1qYXIKLWZpbGUuCi0KLVRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQgdGhlIGZpbGUgbmFtZQotbXVzdCBlbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LiAgVGhlIGljb24gY2FuCi1iZSB1c2VkIGJ5IHRvb2xzLgotCi1FeGFtcGxlOgotCTxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWhvbWUgb3IgcmVtb3RlIGludGVyZmFjZSwgb3IgYSBzZXQgb2YgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQKLW11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIGRlY2xhcmVkIGluIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8KLWRpc3Rpbmd1aXNoIGJldHdlZW4gYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBkZWZpbmVkIGluCi1ib3RoIHRoZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlOyB0aGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLXRoZSBtZXRob2QgbmFtZTsgYW5kIHRoZSBvcHRpb25hbCBtZXRob2QtcGFyYW1zIGVsZW1lbnRzIGlkZW50aWZ5IGEKLXNpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbWV0aG9kIG5hbWUuCi0KLVRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHN5bnRheDoKLQotMS4gCTxtZXRob2Q+Ci0JCTxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgIAkJPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCTwvbWV0aG9kPgotCi0gICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBzcGVjaWZpZWQKLSAgIGVudGVycHJpc2UgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLgotCi0yLiAJPG1ldGhvZD4KLQkJPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgCQk8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLQk8L21ldGhvZD4+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZiB0aGUKLSAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzIHdpdGgKLSAgIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YgdGhpcyBzdHlsZSByZWZlcnMgdG8KLSAgIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuCi0KLQotCi0KLQotMy4gCTxtZXRob2Q+Ci0JCTxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgIAkJPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0JCTxtZXRob2QtcGFyYW1zPgotICAgCQkJPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAJCQk8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAJCQkuLi4KLSAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tbjwvbWV0aG9kLXBhcmFtPgotCQk8L21ldGhvZC1wYXJhbXM+Ci0JPG1ldGhvZD4JCi0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mCi0gICBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2ggUEFSQU0tbiBhcmUgdGhlCi0gICBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYKLSAgIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudAotICAgY29udGFpbnMgbm8gbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0gICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZiBzcXVhcmUKLSAgIGJyYWNrZXRzIChlLmcuIGludFtdW10pLgotCi0KLVVzZWQgaW46IG1ldGhvZC1wZXJtaXNzaW9uIGFuZCBjb250YWluZXItdHJhbnNhY3Rpb24KLQotRXhhbXBsZXM6Ci0KLSAgICBTdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIG1ldGhvZHMgb2YKLQkJdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXM6Ci0KLQkJPG1ldGhvZD4KLQkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCQkJPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCQk8L21ldGhvZD4KLQotCVN0eWxlIDI6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgY3JlYXRlCi0JCW1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2U6Ci0KLSAgICAJCTxtZXRob2Q+Ci0JCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkJCTxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCQk8L21ldGhvZD4KLQotCVN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQotCQljcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi0JIAlFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi0gICAgCQk8bWV0aG9kPgotCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkJCTxtZXRob2QtcGFyYW1zPgotCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkJPC9tZXRob2QtcGFyYW1zPgotCQk8L21ldGhvZD4KLQotCQotCVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi0JbW9yZSBjb21wbGV4IHBhcmFtZXRlciB0eXBlcy4gVGhlIG1ldGhvZAotCQkJZm9vYmFyKGNoYXIgcywgaW50IGksIGludFtdIGlhciwgbXlwYWNrYWdlLk15Q2xhc3MgbXljbCwKLQkJCQlteXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikKLSAgICAgICAgd291bGQgYmUgc3BlY2lmaWVkIGFzOgotCi0gICAgCQk8bWV0aG9kPgotCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JCQk8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLQkJCTxtZXRob2QtcGFyYW1zPgotCQkJCTxtZXRob2QtcGFyYW0+Y2hhcjwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+Ci0JCQkJPG1ldGhvZC1wYXJhbT5pbnRbXTwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3M8L21ldGhvZC1wYXJhbT4KLQkJCQk8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPgotCQkJPC9tZXRob2QtcGFyYW1zPgotCQk8L21ldGhvZD4KLQotCVRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcwotICAgbmVjZXNzYXJ5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lCi0gICBpbnRlcmZhY2UgYW5kIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIHRoYXQgaXMKLSAgIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UuCi0KLQlGb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCBlbGVtZW50Ci0KLSAgIAkJPG1ldGhvZD4KLQkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCQkJPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0JCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkJCTxtZXRob2QtcGFyYW1zPgotCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkJPC9tZXRob2QtcGFyYW1zPgotCQk8L21ldGhvZD4KLQotCWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kCi0gICBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLSAgIG1ldGhvZCBkZWZpbmVkIGluIHRoZSBob21lIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotCi0gICAJCTxtZXRob2Q+Ci0JCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkJCTxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLQkJCTxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCQkJPG1ldGhvZC1wYXJhbXM+Ci0JCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCQkJPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCQk8L21ldGhvZC1wYXJhbXM+Ci0JCTwvbWV0aG9kPgotCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QgKGRlc2NyaXB0aW9uPywgZWpiLW5hbWUsIG1ldGhvZC1pbnRmPywgbWV0aG9kLW5hbWUsCi0JCQltZXRob2QtcGFyYW1zPyk+Ci0KLTwhLS0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvIGRpZmZlcmVudGlhdGUKLWJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgdGhhdCBhcmUgZGVmaW5lZAotaW4gYm90aCB0aGUgcmVtb3RlIGFuZCBob21lIGludGVyZmFjZXMuCi0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JCTxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLQkJPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0KLVVzZWQgaW46IG1ldGhvZAotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLWludGYgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIG1ldGhvZCwKLW9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMgdXNlZCB3aGVuIHRoZSBlbGVtZW50Ci1kZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kIGhvbWUKLWludGVyZmFjZXMuCi0KLVVzZWQgaW46IG1ldGhvZAotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kLXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZgotYSBtZXRob2QgcGFyYW1ldGVyLgotCi1Vc2VkIGluOiBtZXRob2QtcGFyYW1zCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtcGFyYW0gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEKLXR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotCi1Vc2VkIGluOiBtZXRob2QKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1wYXJhbXMgKG1ldGhvZC1wYXJhbSopPgotCi08IS0tCi1UaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBzZWN1cml0eSByb2xlcwotYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbiBtZXRob2RzLiBUaGUKLW1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdAotb2Ygc2VjdXJpdHkgcm9sZSBuYW1lcywgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IG11c3QgYmUKLWRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQKLXRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUKLWFuZC9vciBob21lIGludGVyZmFjZXMuCi0KLVVzZWQgaW46IGFzc2VtYmx5LWRlc2NyaXB0b3IKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1wZXJtaXNzaW9uIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSssIG1ldGhvZCspPgotCi08IS0tCi1UaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlCi1tYW5hZ2VtZW50IHR5cGUuCi0KLVRoZSBwZXJzaXN0ZW5jZS10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0JCTxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0JCTxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCBwZXJzaXN0ZW5jZS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi1lbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzLgotCi1JZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMgZGVmZXJyZWQgdG8gZGVwbG95bWVudAotdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQotVXNlZCBpbjogZW50aXR5Ci0KLUV4YW1wbGVzOgotCTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLQk8cHJpbS1rZXktY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlSUQ8L3ByaW0ta2V5LWNsYXNzPgotCTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuT2JqZWN0PC9wcmltLWtleS1jbGFzcz4KLQotLS0+Ci08IUVMRU1FTlQgcHJpbS1rZXktY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcHJpbWFyeQota2V5IGZpZWxkIGZvciBhbiBlbnRpdHkgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQotVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZCBpbiB0aGUgY21wLWZpZWxkCi1lbGVtZW50LCBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkga2V5Ci10eXBlLgotCi1UaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5IGtleSBtYXBzIHRvCi1tdWx0aXBsZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMgKGkuZS4gdGhlIGtleSBpcyBhIGNvbXBvdW5kIGtleSkuIEluCi10aGlzIGNhc2UsIHRoZSBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLXRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuIGNsYXNzCi10aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0KLVVzZWQgaW46IGVudGl0eQotCi1FeGFtcGxlOgotCTxwcmlta2V5LWZpZWxkPkVtcGxveWVlSWQ8L3ByaW1rZXktZmllbGQ+Ci0tLT4KLTwhRUxFTUVOVCBwcmlta2V5LWZpZWxkICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eSBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuCi0KLVRoZSByZWVudHJhbnQgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQkJPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0JCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCByZWVudHJhbnQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZiwgZW50aXR5LCBhbmQgc2Vzc2lvbgotCi1FeGFtcGxlOgotCQk8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLS0tPgotPCFFTEVNRU5UIHJlbW90ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtYXV0aCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSBzaWducwotb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyCi13aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBiZWFuLiBJbiB0aGUKLWxhdHRlciBjYXNlLCB0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLURlcGxveWVyLgotCi1UaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCQk8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotCQk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLS0tPgotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlIG1hbmFnZXIKLWNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUgaXMKLXNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgKG9yIGNsYXNzKSBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZAotYnkgdGhlIGRhdGEgc291cmNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgZW50ZXJwcmlzZSBiZWFuJ3MKLXJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsCi10aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZAotYnkgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLCBhbmQgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24gKGJlYW4gb3IKLWNvbnRhaW5lcikuCi0KLVVzZWQgaW46IGVudGl0eSBhbmQgc2Vzc2lvbgotCi1FeGFtcGxlOgotCQk8cmVzb3VyY2UtcmVmPgotCQkJPHJlcy1yZWYtbmFtZT5FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci0JCQk8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCQkJPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0JCTwvcmVzb3VyY2UtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtcmVmIChkZXNjcmlwdGlvbj8sIHJlcy1yZWYtbmFtZSwgcmVzLXR5cGUsCi0JCQlyZXMtYXV0aCk+Ci0KLTwhLS0KLVRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIGxpbmsgYSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSB0byBhCi1kZWZpbmVkIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2YKLW9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotVXNlZCBpbjogc2VjdXJpdHktcm9sZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJvbGUtbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotVXNlZCBpbjogbWV0aG9kLXBlcm1pc3Npb24sIHNlY3VyaXR5LXJvbGUsIGFuZCBzZWN1cml0eS1yb2xlLXJlZgotLS0+Ci08IUVMRU1FTlQgcm9sZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5IHJvbGUuCi1UaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkKLXJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotCi1Vc2VkIGluOiBhc3NlbWJseS1kZXNjcmlwdG9yCi0KLUV4YW1wbGU6Ci0JCTxzZWN1cml0eS1yb2xlPgotCQkJPGRlc2NyaXB0aW9uPgotCQkJCVRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobwotCQkJCWFyZSBhdXRob3JpemVkIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUKLQkJCQlzZXJ2aWNlIGFwcGxpY2F0aW9uLgotCQkJPC9kZXNjcmlwdGlvbj4KLQkJCTxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLQkJPC9zZWN1cml0eS1yb2xlPgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eQotcm9sZSByZWZlcmVuY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSwKLWFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgZGVmaW5lZCBzZWN1cml0eSByb2xlLgotCi1UaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkIGFzIHRoZQotcGFyYW1ldGVyIHRvIHRoZSBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kLgotCi1UaGUgdmFsdWUgb2YgdGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotVXNlZCBpbjogZW50aXR5IGFuZCBzZXNzaW9uCi0KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUtcmVmIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSwgcm9sZS1saW5rPyk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLXR5cGUgZWxlbWVudCBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLXN0YXRlZnVsIHNlc3Npb24sIG9yIHN0YXRlbGVzcyBzZXNzaW9uLgotCi1UaGUgc2Vzc2lvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0JCTxzZXNzaW9uLXR5cGU+U3RhdGVmdWw8L3Nlc3Npb24tdHlwZT4KLQkJPHNlc3Npb24tdHlwZT5TdGF0ZWxlc3M8L3Nlc3Npb24tdHlwZT4KLS0tPgotPCFFTEVNRU5UIHNlc3Npb24tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uIGVsZW1lbnQgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMKLW9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uCi1maWxlIG5hbWU7IG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lOyBhIG5hbWUgYXNzaWduZWQgdG8gdGhlCi1lbnRlcnByaXNlIGJlYW4gaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRpb247IHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbgotYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzOyB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24KLWNsYXNzOyB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlOyB0aGUgc2Vzc2lvbiBiZWFuJ3MKLXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZTsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotZW52aXJvbm1lbnQgZW50cmllczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIKLXJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7Ci1hbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24KLWZhY3RvcnkgcmVmZXJlbmNlcy4KLQotVGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkKLWFyZSBvbWl0dGVkIHdoZW4gaWYgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLVVzZWQgaW46IGVudGVycHJpc2UtYmVhbnMKLS0tPgotPCFFTEVNRU5UIHNlc3Npb24gKGRlc2NyaXB0aW9uPywgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sCi0JCWxhcmdlLWljb24/LCBlamItbmFtZSwgaG9tZSwgcmVtb3RlLCBlamItY2xhc3MsCi0JCXNlc3Npb24tdHlwZSwgdHJhbnNhY3Rpb24tdHlwZSwgZW52LWVudHJ5KiwKLQkJZWpiLXJlZiosIHNlY3VyaXR5LXJvbGUtcmVmKiwgcmVzb3VyY2UtcmVmKik+Ci0KLTwhLS0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBzbWFsbAotKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGVqYi1qYXIKLWZpbGUuCi0KLVRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQgdGhlIGZpbGUgbmFtZQotbXVzdCBlbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LgotCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotRXhhbXBsZToKLQk8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgdHJhbnNhY3Rpb24KLW1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQkJPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLQkJPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotCi1Vc2VkIGluOiBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCB0cmFuc2FjdGlvbi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRyYW5zLWF0dHJpYnV0ZSBlbGVtZW50IHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZSB0aGUKLXRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIGludm9jYXRpb24gdG8gYW4KLWVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzIG1ldGhvZC4KLQotVGhlIHZhbHVlIG9mIHRyYW5zLWF0dHJpYnV0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCQk8dHJhbnMtYXR0cmlidXRlPk5vdFN1cHBvcnRlZDwvdHJhbnMtYXR0cmlidXRlPgotCQk8dHJhbnMtYXR0cmlidXRlPlN1cHBvcnRzPC90cmFucy1hdHRyaWJ1dGU+Ci0JCTx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLQkJPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlc05ldzwvdHJhbnMtYXR0cmlidXRlPgotCQk8dHJhbnMtYXR0cmlidXRlPk1hbmRhdG9yeTwvdHJhbnMtYXR0cmlidXRlPgotCQk8dHJhbnMtYXR0cmlidXRlPk5ldmVyPC90cmFucy1hdHRyaWJ1dGU+Ci0KLVVzZWQgaW46IGNvbnRhaW5lci10cmFuc2FjdGlvbgotLS0+Ci08IUVMRU1FTlQgdHJhbnMtYXR0cmlidXRlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50Ci1pbmZvcm1hdGlvbiAoaS5lIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgRUpCIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaW5mb3JtYXRpb24pIHRvIHN0b3JlIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gYQotc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tIHRoZXNlIHRvb2xzLXNwZWNpZmljIGZpbGVzIHRvIHRoZQotaW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotVGhlIEVKQiBhcmNoaXRlY3R1cmUgZG9lcyBub3QgYWxsb3cgdGhlIHRvb2xzIHRvIGFkZCB0aGUgbm9uLXN0YW5kYXJkCi1pbmZvcm1hdGlvbiBpbnRvIHRoZSBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci08IUFUVExJU1QgYXNzZW1ibHktZGVzY3JpcHRvciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjbXAtZmllbGQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udGFpbmVyLXRyYW5zYWN0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWNsaWVudC1qYXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWphciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW50ZXJwcmlzZS1iZWFucyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnRpdHkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmaWVsZC1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLWludGYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLXBhcmFtIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1wYXJhbXMgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLXBlcm1pc3Npb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGVyc2lzdGVuY2UtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcmltLWtleS1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcmlta2V5LWZpZWxkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZW50cmFudCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW1vdGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLWF1dGggaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0cmFuc2FjdGlvbi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zLWF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzAuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMmNjN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcxICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyByZWxhdGluZyB0bwotdGVjaG5vbG9neSBlbWJvZGllZCBpbiB0aGUgcHJvZHVjdCB0aGF0IGlzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LgotSW4gcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cyBsaXN0ZWQgYXQKLWh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZSBhZGRpdGlvbmFsIHBhdGVudHMgb3IKLXBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUgVS5TLiBhbmQgaW4gb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgcHJvZHVjdCB0byB3aGljaCBpdCBwZXJ0YWlucyBhcmUgZGlzdHJpYnV0ZWQKLXVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBUaGlzIGRvY3VtZW50IG1heSBiZSByZXByb2R1Y2VkIGFuZCBkaXN0cmlidXRlZCBidXQgbWF5Ci1ub3QgYmUgY2hhbmdlZCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cwotbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIHRoZSBTdW4gbG9nbywgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGFuZCAgYW5kCi1FbnRlcnByaXNlIEphdmFCZWFucyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzIFN1YmplY3QgdG8KLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLURPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQUxMIEVYUFJFU1MgT1IgSU1QTElFRAotQ09ORElUSU9OUywgUkVQUkVTRU5UQVRJT05TIEFORCBXQVJSQU5USUVTLCBJTkNMVURJTkcgQU5ZIElNUExJRUQKLVdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SCi1OT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUIFRPIFRIRSBFWFRFTlQgVEhBVCBTVUNICi1ESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZIElOVkFMSUQuCi0KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi1Db3B5cmlnaHQgKGMpIDIwMDAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBFJ3RhdHMtVW5pcy4KLVRvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gYSBsZXMgZHJvaXRzIGRlIHByb3ByaWUndGUnIGludGVsbGVjdHVlbHMKLXJlbGF0YW50cyBhYCBsYSB0ZWNobm9sb2dpZSBpbmNvcnBvcmUnZSBkYW5zIGxlIHByb2R1aXQgcXVpIGVzdCBkZSdjcml0Ci1kYW5zIGNlIGRvY3VtZW50LiBFbiBwYXJ0aWN1bGllciwgZXQgc2FucyBsYSBsaW1pdGF0aW9uLCBjZXMgZHJvaXRzIGRlCi1wcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzIHBldXZlbnQgaW5jbHVyZSB1biBvdSBwbHVzIGRlcyBicmV2ZXRzCi1hbWUncmljYWlucyBlJ251bWUncmUncyBhYCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBldCB1biBvdSBsZXMKLWJyZXZldHMgcGx1cyBzdXBwbGUnbWVudGFpcmVzIG91IGxlcyBhcHBsaWNhdGlvbnMgZGUgYnJldmV0IGVuIGF0dGVudGUKLWRhbnMgbGVzIEUndGF0cy1VbmlzIGV0IGRhbnMgbGVzIGF1dHJlcyBwYXlzLgotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnCi1hdmVjIGRlcyBsaWNlbmNlcyBxdWkgZW4gcmVzdHJlaWduZW50IGwndXRpbGlzYXRpb24sIGxhIGNvcGllLCBsYQotZGlzdHJpYnV0aW9uLCBldCBsYSBkZSdjb21waWxhdGlvbi4gIENlIGRvY3VtZW50aW9uIGFzc29jaWUgbiBwZXV0Ci1lXnRyZSByZXByb2R1aXRlIGV0IGRpc3RyaWJ1ZXIsIHBhciBxdWVscXVlIG1veWVuIHF1ZSBjZSBzb2l0LCBzYW5zCi1sJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyBiYWlsbGV1cnMgZGUKLWxpY2VuY2UsIGxlIGNhcyBlJ2NoZSdhbnQuCi0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0Ci1saWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgbGUgbG9nbyBTdW4sICBKYXZhLCAgSmF2YVNlcnZlciBQYWdlcywgIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgIEpEQkMsICBKREssICBKYXZhTWFpbCBldCAgYW5kCi1FbnRlcnByaXNlIEphdmFCZWFucyBzb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzCi1kZSdwb3NlJ2VzIGRlIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYXV4IEUndGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMKLXBheXMuCi0KLUxBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRSdUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQKLUVYQ0xVRVMsIERBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUwotTk9UQU1NRU5UIFRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBCi1MJ0FQVElUVURFIEEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERQotQ09OVFJFRkFDLE9OLgotLS0+Ci0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBFSkIgMi4wIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLUFsbCBFSkIgMi4wIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQotb2YgdGhlIGZvbGxvd2luZyBmb3JtOgotCi0gIDwhRE9DVFlQRSBlamItamFyIFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIKLQkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLQotLS0+Ci0KLTwhLS0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1lbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgotCi0tIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKLSAgY2FzZSBzZW5zaXRpdmUuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQotICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCi0gIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KLSAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5Ci0gIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCi0tLT4KLQotCi08IS0tCi1UaGUgZWpiLWphciBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yLiBJdCBjb250YWlucwotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlCi0JLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQktIGFuIG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lCi0JLSBhbiBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZQotCS0gbWFuZGF0b3J5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkCi0JICBlbnRlcnByaXNlIGJlYW5zCi0JLSBhIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMsIGlmIGFueQotCS0gYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcgotCS0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUgZWpiLWphci4KLS0tPgotPCFFTEVNRU5UIGVqYi1qYXIgKGRlc2NyaXB0aW9uPywgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sCi1sYXJnZS1pY29uPywgZW50ZXJwcmlzZS1iZWFucywgcmVsYXRpb25zaGlwcz8sIGFzc2VtYmx5LWRlc2NyaXB0b3I/LAotZWpiLWNsaWVudC1qYXI/KT4KLQotPCEtLQotVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBhYnN0cmFjdAotc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCCi1RTCBxdWVyaWVzLgotCi1Gb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aG9zZSBsb2NhbAotaW50ZXJmYWNlIGlzIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIGFic3RyYWN0LXNjaGVtYS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgYWNrbm93bGVkZ2UtbW9kZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIEpNUyBBVVRPX0FDS05PV0xFREdFIG9yCi1EVVBTX09LX0FDS05PV0xFREdFIG1lc3NhZ2UgYWNrbm93bGVkZ21lbnQgc2VtYW50aWNzIHNob3VsZCBiZSB1c2VkCi1mb3IgdGhlIG9uTWVzc2FnZSBtZXNzYWdlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiB0aGF0IHVzZXMgYmVhbgotbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4KLQotVGhlIGFja25vd2xlZGdlLW1vZGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxhY2tub3dsZWRnZS1tb2RlPkF1dG8tYWNrbm93bGVkZ2U8L2Fja25vd2xlZGdlLW1vZGU+Ci0JPGFja25vd2xlZGdlLW1vZGU+RHVwcy1vay1hY2tub3dsZWRnZTwvYWNrbm93bGVkZ2Vtb2RlPgotCi1Vc2VkIGluOiBtZXNzYWdlLWRyaXZlbgotLS0+Ci08IUVMRU1FTlQgYWNrbm93bGVkZ2UtbW9kZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBhc3NlbWJseS1kZXNjcmlwdG9yIGVsZW1lbnQgY29udGFpbnMgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uCi0KLVRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhcnRzOgotdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZAotcGVybWlzc2lvbnMsIHRoZSBkZWZpbml0aW9uIG9mIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yCi1lbnRlcnByaXNlIGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gYW5kCi1hIGxpc3Qgb2YgbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQuCi0KLUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlCi1saXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcwotb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLVVzZWQgaW46IGVqYi1qYXIKLS0tPgotPCFFTEVNRU5UIGFzc2VtYmx5LWRlc2NyaXB0b3IgKHNlY3VyaXR5LXJvbGUqLCBtZXRob2QtcGVybWlzc2lvbiosCi1jb250YWluZXItdHJhbnNhY3Rpb24qLCBleGNsdWRlLWxpc3Q/KT4KLQotPCEtLQotVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhIHBhcnRpY3VsYXIKLXJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQKLXVwb24gdGhlIGxpZmV0aW1lIG9mIGFub3RoZXIgZW50aXR5IGJlYW4uIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50Ci1jYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50IGNvbnRhaW5lZAotaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4gd2hpY2ggdGhlIG90aGVyIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgotCi1Vc2VkIGluOiBlamItcmVsYXRpb25zaGlwLXJvbGUKLS0tPgotPCFFTEVNRU5UIGNhc2NhZGUtZGVsZXRlIEVNUFRZPgotCi08IS0tCi1UaGUgY21wLWZpZWxkIGVsZW1lbnQgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQotZmllbGQgZWxlbWVudCBpbmNsdWRlcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsIGFuZCB0aGUKLW5hbWUgb2YgdGhlIGZpZWxkLgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIGNtcC1maWVsZCAoZGVzY3JpcHRpb24/LCBmaWVsZC1uYW1lKT4KLQotPCEtLQotVGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIGFuIGVudGl0eSBiZWFuCi13aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLgotCi1UaGUgY21wLXZlcnNpb24gZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxjbXAtdmVyc2lvbj4xLng8L2NtcC12ZXJzaW9uPgotCTxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotCi1UaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY21wLXZlcnNpb24gZWxlbWVudCBpcyAyLnguCi0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgY21wLXZlcnNpb24gKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBjbXItZmllbGQgZWxlbWVudCBkZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mIGEKLXJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBhbmQKLXRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhIHJvbGUgb2YgYQotcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkCi1mb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yIG1ldGhvZHMgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoZQotY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcyB1c2VkIG9ubHkgZm9yIGNvbGxlY3Rpb24tdmFsdWVkCi1jbXItZmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkLgotCi1Vc2VkIGluOiBlamItcmVsYXRpb25zaGlwLXJvbGUKLS0tPgotPCFFTEVNRU5UIGNtci1maWVsZCAoZGVzY3JpcHRpb24/LCBjbXItZmllbGQtbmFtZSwgY21yLWZpZWxkLXR5cGU/KT4KLQotPCEtLQotVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgbG9naWNhbAotcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbiBjbGFzcy4gVGhlIG5hbWUgb2YgdGhlIGNtci1maWVsZAotbXVzdCBiZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzCi13aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkKLWNtci1maWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdCBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwgcHJlZml4ZWQgYnkKLSJnZXQiIG9yICJzZXQiLgotCi1Vc2VkIGluOiBjbXItZmllbGQKLS0tPgotPCFFTEVNRU5UIGNtci1maWVsZC1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjbGFzcyBvZiBhCi1jb2xsZWN0aW9uLXZhbHVlZCBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4KLWNsYXNzLiBUaGUgdmFsdWUgb2YgdGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgbXVzdCBiZSBlaXRoZXI6Ci1qYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBqYXZhLnV0aWwuU2V0LgotCi1Vc2VkIGluOiBjbXItZmllbGQKLS0tPgotPCFFTEVNRU5UIGNtci1maWVsZC10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvbiBlbGVtZW50IHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lcgotbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kCi1pbnZvY2F0aW9ucy4gVGhlIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdAotb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuIFRoZSB0cmFuc2FjdGlvbgotYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kcy4KLQotVXNlZCBpbjogYXNzZW1ibHktZGVzY3JpcHRvcgotLS0+Ci08IUVMRU1FTlQgY29udGFpbmVyLXRyYW5zYWN0aW9uIChkZXNjcmlwdGlvbj8sIG1ldGhvZCssIHRyYW5zLWF0dHJpYnV0ZSk+Ci0KLTwhLS0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudAotZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0Ci10aGUgZW50ZXJwcmlzZSBiZWFuIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgotdGhlIGVudGVycHJpc2UgYmVhbiBlamItamFyIGZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzCi11c2VkIGJ5IHRoZSBlbnRlcnByaXNlIGJlYW4gZWpiLWphciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24KLXdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0KLVVzZWQgaW46IGNtcC1maWVsZCwgY21yLWZpZWxkLCBjb250YWluZXItdHJhbnNhY3Rpb24sIGVqYi1qYXIsCi1lamItbG9jYWwtcmVmLCBlamItcmVmLCBlamItcmVsYXRpb24sIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSwgZW50aXR5LAotZW52LWVudHJ5LCBleGNsdWRlLWxpc3QsIG1lc3NhZ2UtZHJpdmVuLCBtZXRob2QsIG1ldGhvZC1wZXJtaXNzaW9uLAotcXVlcnksIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSwgcmVsYXRpb25zaGlwcywgcmVzb3VyY2UtZW52LXJlZiwKLXJlc291cmNlLXJlZiwgcnVuLWFzLCBzZWN1cml0eS1pZGVudGl0eSwgc2VjdXJpdHktcm9sZSwKLXNlY3VyaXR5LXJvbGUtcmVmLCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBKTVMKLWRlc3RpbmF0aW9uLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlIGV4cGVjdGVkIHRvCi1iZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVzdGluYXRpb24uCi0KLVRoZSBkZXN0aW5hdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLTxkZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvZGVzdGluYXRpb24tdHlwZT4KLTxkZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5Ub3BpYzwvZGVzdGluYXRpb24tdHlwZT4KLQotVXNlZCBpbjogbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24KLS0tPgotPCFFTEVNRU5UIGRlc3RpbmF0aW9uLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLWRpc3BsYXllZCBieSB0b29scy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotCi1Vc2VkIGluOiBlamItamFyLCBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgY2xhc3MuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLQotRXhhbXBsZToKLQotPGVqYi1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlQmVhbjwvZWpiLWNsYXNzPgotLS0+Ci08IUVMRU1FTlQgZWpiLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSIGZpbGUgdGhhdCBjb250YWlucwotdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYSBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlCi1lbnRlcnByaXNlIGJlYW5zIGluIHRoZSBlamItamFyIGZpbGUuCi0KLVVzZWQgaW46IGVqYi1qYXIKLQotRXhhbXBsZToKLQotPGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcjwvZWpiLWNsaWVudC1qYXI+Ci0tLT4KLTwhRUxFTUVOVCBlamItY2xpZW50LWphciAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgb3IgZWpiLWxvY2FsLXJlZgotZWxlbWVudHMgdG8gc3BlY2lmeSB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFuCi1lbnRlcnByaXNlIGJlYW4uCi0KLVRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgotZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSBvciBpbiBhbm90aGVyIGVqYi1qYXIKLWZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUgY29tcG9zZWQgb2YgYQotcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi1iZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20KLXRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgZWpiLWphciBmaWxlCi1jb250YWluaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4gdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuLgotVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lIGVqYi1uYW1lIHRvIGJlCi11bmlxdWVseSBpZGVudGlmaWVkLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlamItcmVmCi0KLUV4YW1wbGVzOgotCi0JPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotCTxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotLS0+Ci08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxvY2FsLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkgIHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQktIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBlamItbG9jYWwtcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLAotCQlsb2NhbC1ob21lLCBsb2NhbCwgZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIG5hbWUuIFRoaXMgbmFtZSBpcwotYXNzaWduZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBuYW1lIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4KLXRoZSBlamItamFyIGZpbGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi1hbW9uZyB0aGUgbmFtZXMgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlLgotCi1UaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZWpiLW5hbWUgaW4gdGhlCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIHRoZSBKTkRJIG5hbWUgdGhhdCB0aGUgRGVwbG95ZXIgd2lsbCBhc3NpZ24KLXRvIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lLgotCi1UaGUgbmFtZSBmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnggbXVzdCBjb25mb3JtIHRvIHRoZQotbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4gVGhlIG5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGgKLWNtcC12ZXJzaW9uIDIueCBtdXN0IG5vdCBiZSBhIHJlc2VydmVkIGxpdGVyYWwgaW4gRUpCIFFMLgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBtZXRob2QsIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSwKLXNlc3Npb24KLQotRXhhbXBsZToKLQotPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcWwgZWxlbWVudCBjb250YWlucyB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMKLWEgZmluZGVyIG9yIHNlbGVjdCBxdWVyeS4gVGhpcyBlbGVtZW50IGlzIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZgotYSBxdWVyeSBlbGVtZW50IHdob3NlIGNvbnRlbnRzIHNwZWNpZnkgdGhlIGZpbmRlciBvciB0aGUgc2VsZWN0IG1ldGhvZAotdGhhdCB1c2VzIHRoZSBxdWVyeS4gVGhlIGNvbnRlbnQgbXVzdCBiZSBhIHZhbGlkIEVKQiBRTCBxdWVyeSBzdHJpbmcKLWZvciB0aGUgZW50aXR5IGJlYW4gZm9yIHdoaWNoIHRoZSBxdWVyeSBpcyBzcGVjaWZpZWQuCi0KLVRoZSBlamItcWwgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYWxsIHF1ZXJpZXMgdGhhdCBhcmUKLWV4cHJlc3NpYmxlIGluIEVKQiBRTC4KLQotVXNlZCBpbjogcXVlcnkKLQotRXhhbXBsZToKLTxxdWVyeT4KLSAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICA8bWV0aG9kLW5hbWU+ZWpiU2VsZWN0UGVuZGluZ0xpbmVpdGVtczwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICA8ZWpiLXFsPlNFTEVDVCBPQkpFQ1QobCkgRlJPTSBMaW5lSXRlbXMgbCBXSEVSRSBsLnNoaXBwZWQgPD4gVFJVRQotICAgIDwvZWpiLXFsPgotPC9xdWVyeT4KLQotLS0+Ci08IUVMRU1FTlQgZWpiLXFsICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8KLWFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgotCSAgdGhlIGVudGVycHJpc2UgYmVhbiB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCS0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsCi0JCWhvbWUsIHJlbW90ZSwgZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoZQotRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgZW52aXJvbm1lbnQgYW5kIGlzCi1yZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLXdpdGhpbiB0aGUgZW50ZXJwcmlzZSBiZWFuLgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYKLQotRXhhbXBsZToKLQotPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQotcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLQk8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgZWpiLXJlbGF0aW9uIGVsZW1lbnQgZGVzY3JpYmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvCi1lbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIEFuIGVqYi1yZWxhdGlvbgotZWxlbWVudCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OwotYW5kIGV4YWN0bHkgdHdvIHJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUKLWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50cy4gVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCwgaWYKLXNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLgotCi1Vc2VkIGluOiByZWxhdGlvbnNoaXBzCi0tLT4KLTwhRUxFTUVOVCBlamItcmVsYXRpb24gKGRlc2NyaXB0aW9uPywgZWpiLXJlbGF0aW9uLW5hbWU/LCBlamItcmVsYXRpb25zaGlwLXJvbGUsCi1lamItcmVsYXRpb25zaGlwLXJvbGUpPgotCi08IS0tCi1UaGUgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lIGZvciBhIHJlbGF0aW9uc2hpcC4KLQotVXNlZCBpbjogZWpiLXJlbGF0aW9uCi0tLT4KLTwhRUxFTUVOVCBlamItcmVsYXRpb24tbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudCBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi1yZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0KLVRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgYW4KLW9wdGlvbmFsIG5hbWUgZm9yIHRoZSByZWxhdGlvbnNoaXAgcm9sZTsgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZQotbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlCi1mdW5jdGlvbmFsaXR5IGZvciB0aGUgcm9sZTsgdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUKLWNtci1maWVsZCwgaWYgYW55LCBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUKLXJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0KLVRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5IGJlYW4gYnkKLW1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMsIGJvdGgKLXJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZQotZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZCBpbiB0ZXJtcyBvZiB3aGljaCB0aGUgcmVsYXRpb25zaGlwCi1pcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YgYSBjbXItZmllbGQgZWxlbWVudCBpbiBhbgotZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcyB0aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMKLXVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQgdGhlIGVudGl0eSBiZWFuIHRoYXQgcGFydGljaXBhdGVzCi1pbiB0aGUgcmVsYXRpb25zaGlwIGlzICJub3QgYXdhcmUiIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0KLVVzZWQgaW46IGVqYi1yZWxhdGlvbgotCi1FeGFtcGxlOgotCi08ZWpiLXJlbGF0aW9uPgotICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zCi0gICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgIDxlamItbmFtZT5Qcm9kdWN0RUpCPC9lamItbmFtZT4KLSAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotCi0tLT4KLTwhRUxFTUVOVCBlamItcmVsYXRpb25zaGlwLXJvbGUgKGRlc2NyaXB0aW9uPywgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU/LAotbXVsdGlwbGljaXR5LCBjYXNjYWRlLWRlbGV0ZT8sIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSwgY21yLWZpZWxkPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYSBuYW1lIGZvciBhIHJvbGUgdGhhdAotaXMgdW5pcXVlIHdpdGhpbiBhbiBlamItcmVsYXRpb24uIERpZmZlcmVudCByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlCi1zYW1lIG5hbWUgZm9yIGEgcm9sZS4KLQotVXNlZCBpbjogZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0tLT4KLTwhRUxFTUVOVCBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBvZiBvbmUgb3IgbW9yZQotZW50ZXJwcmlzZSBiZWFucy4KLS0tPgotPCFFTEVNRU5UIGVudGVycHJpc2UtYmVhbnMgKHNlc3Npb24gfCBlbnRpdHkgfCBtZXNzYWdlLWRyaXZlbikrPgotCi08IS0tCi1UaGUgZW50aXR5IGVsZW1lbnQgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbgotY29uc2lzdHMgb2Y6Ci0KLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQktIGFuIG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lCi0JLSBhbiBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZQotCS0gYSB1bmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGhvbWUgYW5kIHJlbW90ZQotICAgICAgICAgIGludGVyZmFjZXMsIGlmIGFueQotCS0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0JICBpbnRlcmZhY2VzLCBpZiBhbnkKLQktIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JLSB0aGUgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUKLQktIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWUKLQktIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotCS0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbgotCS0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyBhYnN0cmFjdAotCSAgc2NoZW1hIG5hbWUKLQktIGFuIG9wdGlvbmFsIGxpc3Qgb2YgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZAotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudCBlbnRyaWVzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQiByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLQkgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIG1hbmFnZXIKLSAgICAgICAgICBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucwotCSAgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eQotCSAgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4KLQotVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFuCi1lbnRpdHkgYmVhbiB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlIGFuZCBjbXAtdmVyc2lvbiAyLnguCi0KLVRoZSBvcHRpb25hbCBwcmlta2V5LWZpZWxkIG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmIHRoZQotZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuCi0KLVRoZSBvcHRpb25hbCBjbXAtdmVyc2lvbiBlbGVtZW50IG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmCi10aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuIElmIHRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzCi1Db250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGl0cyB2YWx1ZQotZGVmYXVsdHMgdG8gMi54LgotCi1UaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmIHRoZSBlbnRpdHkKLWJlYW4gY21wLXZlcnNpb24gaXMgMS54LgotCi1UaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmIHRoZSBlbnRpdHkKLWJlYW4gaGFzIGEgcmVtb3RlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2UuCi0KLVRoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUKLWVudGl0eSBiZWFuIGhhcyBhIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZS4KLQotRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoIHRoZQotaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZC4KLQotVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcwotQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZCBxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4KLWZpbmRCeVByaW1hcnlLZXkgaGF2ZSBiZWVuIGRlZmluZWQgZm9yIHRoZSBlbnRpdHkgYmVhbi4KLQotVGhlIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZSB0aGF0Ci10aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZgotdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMS54LAotYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotCi1Vc2VkIGluOiBlbnRlcnByaXNlLWJlYW5zCi0KLS0tPgotPCFFTEVNRU5UIGVudGl0eSAoZGVzY3JpcHRpb24/LCBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywKLQkJbGFyZ2UtaWNvbj8sIGVqYi1uYW1lLCBob21lPywgcmVtb3RlPywgbG9jYWwtaG9tZT8sCi0JCWxvY2FsPywgZWpiLWNsYXNzLCBwZXJzaXN0ZW5jZS10eXBlLCBwcmltLWtleS1jbGFzcywKLQkJcmVlbnRyYW50LCBjbXAtdmVyc2lvbj8sIGFic3RyYWN0LXNjaGVtYS1uYW1lPywKLQkJY21wLWZpZWxkKiwgcHJpbWtleS1maWVsZD8sIGVudi1lbnRyeSosIGVqYi1yZWYqLAotCQllamItbG9jYWwtcmVmKiwgc2VjdXJpdHktcm9sZS1yZWYqLCBzZWN1cml0eS1pZGVudGl0eT8sCi0JCXJlc291cmNlLXJlZiosIHJlc291cmNlLWVudi1yZWYqLCBxdWVyeSopPgotCi08IS0tCi1UaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwKLXZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZSBzdXBwbGllZAotZHVyaW5nIGRlcGxveW1lbnQuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeSAoZGVzY3JpcHRpb24/LCBlbnYtZW50cnktbmFtZSwgZW52LWVudHJ5LXR5cGUsCi0JCWVudi1lbnRyeS12YWx1ZT8pPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBlbnRlcnByaXNlIGJlYW4uCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YKLXRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBlbnRlcnByaXNlIGJlYW4ncwotY29kZS4KLQotVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZToKLQotCWphdmEubGFuZy5Cb29sZWFuCi0JamF2YS5sYW5nLkJ5dGUKLQlqYXZhLmxhbmcuQ2hhcmFjdGVyCi0JamF2YS5sYW5nLlN0cmluZwotCWphdmEubGFuZy5TaG9ydAotCWphdmEubGFuZy5JbnRlZ2VyCi0JamF2YS5sYW5nLkxvbmcKLQlqYXZhLmxhbmcuRmxvYXQKLQlqYXZhLmxhbmcuRG91YmxlCi0KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKLWNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZwotcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwgYSBzaW5nbGUgY2hhcmFjdGVyLgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBleGNsdWRlIGxpc3QgZWxlbWVudCBzcGVjaWZpZXMgb25lIG9yIG1vcmUgbWV0aG9kcyB3aGljaCB0aGUKLUFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLgotCi1JZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZSBpbiB0aGUKLWV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIHNob3VsZCBjb25zaWRlciB0aG9zZSBtZXRob2RzIHRvIGJlCi11bmNhbGxhYmxlLgotCi1Vc2VkIGluOiBhc3NlbWJseS1kZXNjcmlwdG9yCi0tLT4KLTwhRUxFTUVOVCBleGNsdWRlLWxpc3QgKGRlc2NyaXB0aW9uPywgbWV0aG9kKyk+Ci0KLTwhLS0KLVRoZSBmaWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY29udGFpbmVyIG1hbmFnZWQKLWZpZWxkLgotCi1UaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54IG11c3QKLWJlZ2luIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMgd2hvc2UKLW5hbWVzIGNvbnNpc3RzIG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgZmllbGQtbmFtZSBpbgotd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotVGhlIG5hbWUgb2YgdGhlIGNtcC1maWVsZCBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDEueCBtdXN0Ci1kZW5vdGUgYSBwdWJsaWMgZmllbGQgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBvbmUgb2YgaXRzCi1zdXBlcmNsYXNzZXMuCi0KLVVzZWQgaW46IGNtcC1maWVsZAotCi1FeGFtcGxlOgotCi0KLQk8ZmllbGQtbmFtZT5maXJzdE5hbWU8L2ZpZWxkLU5hbWU+Ci0KLS0tPgotPCFFTEVNRU5UIGZpZWxkLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmLCBlbnRpdHksIHNlc3Npb24KLQotRXhhbXBsZToKLQotPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+Ci0tLT4KLTwhRUxFTUVOVCBob21lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBsYXJnZSAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLWVqYi1qYXIgZmlsZS4KLQotVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBlamItamFyLCBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBsb2NhbCBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZW50aXR5LCBzZXNzaW9uCi0KLS0tPgotPCFFTEVNRU5UIGxvY2FsICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgbG9jYWwtaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlbnRpdHksIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIGxvY2FsLWhvbWUgKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBtZXNzYWdlLWRyaXZlbiBlbGVtZW50IGRlY2xhcmVzIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4gVGhlCi1kZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCS0gYW4gb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWUKLQktIGFuIG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lCi0JLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbgotCSAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCS0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCS0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MKLQkgIG1lc3NhZ2Ugc2VsZWN0b3IKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZQotCSAgYWNrbm93bGVkZ21lbnQgbW9kZSBmb3IgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLQkgIGlmIGJlYW4tbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBpcyB1c2VkCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUKLQkgIGludGVuZGVkIGRlc3RpbmF0aW9uIHR5cGUgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQgZW50cmllcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5Ci0JICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyCi0JICBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICAgICAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCi0KLVVzZWQgaW46IGVudGVycHJpc2UtYmVhbnMKLS0tPgotPCFFTEVNRU5UIG1lc3NhZ2UtZHJpdmVuIChkZXNjcmlwdGlvbj8sIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LAotCQlsYXJnZS1pY29uPywgZWpiLW5hbWUsIGVqYi1jbGFzcywgdHJhbnNhY3Rpb24tdHlwZSwKLQkJbWVzc2FnZS1zZWxlY3Rvcj8sIGFja25vd2xlZGdlLW1vZGU/LAotCQltZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj8sIGVudi1lbnRyeSosIGVqYi1yZWYqLAotCQllamItbG9jYWwtcmVmKiwgc2VjdXJpdHktaWRlbnRpdHk/LCByZXNvdXJjZS1yZWYqLAotCQlyZXNvdXJjZS1lbnYtcmVmKik+Ci0KLTwhLS0KLVRoZSBtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbiBlbGVtZW50IHByb3ZpZGVzIGFkdmljZSB0byB0aGUgRGVwbG95ZXIKLWFzIHRvIHdoZXRoZXIgYSBtZXNzYWdlLWRyaXZlbiBiZWFuIGlzIGludGVuZGVkIGZvciBhIFF1ZXVlIG9yIGEKLVRvcGljLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6IHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbgotYmVhbidzIGludGVuZGVkIGRlc3RpbmF0aW9uIGFuZCBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB3aGV0aGVyIGEKLWR1cmFibGUgb3Igbm9uLWR1cmFibGUgc3Vic2NyaXB0aW9uIHNob3VsZCBiZSB1c2VkIGlmIHRoZQotZGVzdGluYXRpb24tdHlwZSBpcyBqYXZheC5qbXMuVG9waWMuCi0KLVVzZWQgaW46IG1lc3NhZ2UtZHJpdmVuCi0tLT4KLTwhRUxFTUVOVCBtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbiAoZGVzdGluYXRpb24tdHlwZSwKLXN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5Pyk+Ci0KLTwhLS0KLVRoZSBtZXNzYWdlLXNlbGVjdG9yIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBKTVMgbWVzc2FnZQotc2VsZWN0b3IgdG8gYmUgdXNlZCBpbiBkZXRlcm1pbmluZyB3aGljaCBtZXNzYWdlcyBhIG1lc3NhZ2UtZHJpdmVuCi1iZWFuIGlzIHRvIHJlY2VpdmUuCi0KLUV4YW1wbGU6Ci08bWVzc2FnZS1zZWxlY3Rvcj5KTVNUeXBlID0gYGNhcicgQU5EIGNvbG9yID0gYGJsdWUnIEFORCB3ZWlnaHQgJmd0OyAyNTAwCi08L21lc3NhZ2Utc2VsZWN0b3I+Ci0KLVVzZWQgaW46IG1lc3NhZ2UtZHJpdmVuCi0tLT4KLTwhRUxFTUVOVCBtZXNzYWdlLXNlbGVjdG9yICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZQotYmVhbidzIGhvbWUgb3IgY29tcG9uZW50IGludGVyZmFjZSwgb3IsIGluIHRoZSBjYXNlIG9mIGEgbWVzc2FnZS1kcml2ZW4KLWJlYW4sIHRoZSBiZWFuJ3Mgb25NZXNzYWdlIG1ldGhvZCwgb3IgYSBzZXQgb2YgbWV0aG9kcy4gVGhlIGVqYi1uYW1lCi1lbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGRlY2xhcmVkIGluCi10aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8KLWRpc3Rpbmd1aXNoIGJldHdlZW4gYSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBtdWx0aXBseQotZGVmaW5lZCBhY3Jvc3MgaW4gYm90aCB0aGUgaG9tZSBhbmQgY29tcG9uZW50IGludGVyZmFjZXM7IHRoZQotbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsCi1tZXRob2QtcGFyYW1zIGVsZW1lbnRzIGlkZW50aWZ5IGEgc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzCi13aXRoIGFuIG92ZXJsb2FkZWQgbWV0aG9kIG5hbWUuCi0KLVRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHN5bnRheDoKLQotMS4KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPgotCi0gICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBzcGVjaWZpZWQKLSAgIGVudGVycHJpc2UgYmVhbidzIGhvbWUgYW5kIGNvbXBvbmVudCBpbnRlcmZhY2VzLgotCi0yLgotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4+Ci0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZiB0aGUKLSAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzIHdpdGgKLSAgIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YgdGhpcyBzdHlsZSByZWZlcnMgdG8KLSAgIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuCi0KLQotMy4KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIC4uLgotICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLW48L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08bWV0aG9kPgotCi0KLSAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mCi0gICBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2ggUEFSQU0tbiBhcmUgdGhlCi0gICBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYKLSAgIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudAotICAgY29udGFpbnMgbm8gbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0gICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZiBzcXVhcmUKLSAgIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIHRoZQotICAgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoaXMgc3R5bGUgcmVmZXJzIHRvIGFsbCBvZiB0aGUgb3ZlcmxvYWRlZAotICAgbWV0aG9kcy4KLQotCi1Vc2VkIGluOiBjb250YWluZXItdHJhbnNhY3Rpb24sIGV4Y2x1ZGUtbGlzdCwgbWV0aG9kLXBlcm1pc3Npb24KLQotRXhhbXBsZXM6Ci0KLVN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyBvZgotdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBhbmQgY29tcG9uZW50IGludGVyZmFjZXM6Ci0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+Ci0KLVN0eWxlIDI6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUgY3JlYXRlCi1tZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+Ci0KLQotU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi1jcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi1FbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLQotVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLW1vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QKLWZvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsCi1teXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikgd291bGQgYmUgc3BlY2lmaWVkIGFzOgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5mb29iYXI8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmNoYXI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5pbnQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5pbnRbXTwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3NbXVtdPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLQotVGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzIG5lY2Vzc2FyeQotdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIHRoYXQgaXMgbXVsdGlwbHkgZGVmaW5lZCBhY3Jvc3MgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBob21lIGFuZCBjb21wb25lbnQgaW50ZXJmYWNlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi1zaWduYXR1cmUuCi0KLQotRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLQotY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QgZGVmaW5lZAotaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QgZGVmaW5lZAotaW4gdGhlIHJlbW90ZSBob21lIGludGVyZmFjZSwgd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLWFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUgaW50ZXJmYWNlCi13aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0gICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0gICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICA8L21ldGhvZC1wYXJhbXM+Ci08L21ldGhvZD4KLQotCi1UaGUgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aXRoIGFsbCB0aHJlZSBTdHlsZXMgb2YgdGhlCi1tZXRob2QgZWxlbWVudCB1c2FnZS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQKLWV4YW1wbGUgY291bGQgYmUgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCi1FbXBsb3llZVNlcnZpY2UgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZS4KLQotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotLS0+Ci08IUVMRU1FTlQgbWV0aG9kIChkZXNjcmlwdGlvbj8sIGVqYi1uYW1lLCBtZXRob2QtaW50Zj8sIG1ldGhvZC1uYW1lLAotbWV0aG9kLXBhcmFtcz8pPgotCi08IS0tCi0KLVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvIGRpZmZlcmVudGlhdGUKLWJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUgdGhhdCBhcmUgbXVsdGlwbHkKLWRlZmluZWQgYWNyb3NzIHRoZSBjb21wb25lbnQgYW5kIGhvbWUgaW50ZXJmYWNlcyAoZS5nLCBpbiBib3RoIGFuCi1lbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgYW5kIGxvY2FsIGludGVyZmFjZXM7IGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBldGMuKQotCi1UaGUgbWV0aG9kLWludGYgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotCTxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotCTxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotCTxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0KLVVzZWQgaW46IG1ldGhvZAotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLWludGYgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIG1ldGhvZAotb3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcyB1c2VkIHdoZW4gdGhlIGVsZW1lbnQKLWRlbm90ZXMgYWxsIHRoZSBtZXRob2RzIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGNvbXBvbmVudCBhbmQgaG9tZQotaW50ZXJmYWNlcy4KLQotVXNlZCBpbjogbWV0aG9kLCBxdWVyeS1tZXRob2QKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1ldGhvZC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWUKLW9mIGEgbWV0aG9kIHBhcmFtZXRlci4KLQotVXNlZCBpbjogbWV0aG9kLXBhcmFtcwotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLXBhcmFtICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBhIGxpc3Qgb2YgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhCi10eXBlIG5hbWVzIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVycy4KLQotVXNlZCBpbjogbWV0aG9kLCBxdWVyeS1tZXRob2QKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1wYXJhbXMgKG1ldGhvZC1wYXJhbSopPgotCi08IS0tCi0KLVRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlIHNlY3VyaXR5Ci1yb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZSBiZWFuIG1ldGhvZHMuIFRoZQotbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0Ci1vZiBzZWN1cml0eSByb2xlIG5hbWVzIG9yIGFuIGluZGljYXRvciB0byBzdGF0ZSB0aGF0IHRoZSBtZXRob2QgaXMKLXVuY2hlY2tlZCBmb3IgYXV0aG9yaXphdGlvbiwgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IG11c3QgYmUKLWRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwKLWFuZCB0aGUgbWV0aG9kcyBtdXN0IGJlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLWNvbXBvbmVudCBhbmQvb3IgaG9tZSBpbnRlcmZhY2VzLgotCi0KLVVzZWQgaW46IGFzc2VtYmx5LWRlc2NyaXB0b3IKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1wZXJtaXNzaW9uIChkZXNjcmlwdGlvbj8sIChyb2xlLW5hbWUrfHVuY2hlY2tlZCksIG1ldGhvZCspPgotCi08IS0tCi1UaGUgbXVsdGlwbGljaXR5IGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGUgdGhhdAotcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uCi0KLVRoZSBtdWx0aXBsaWNpdHkgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0JPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0KLVVzZWQgaW46IGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotLS0+Ci08IUVMRU1FTlQgbXVsdGlwbGljaXR5ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZQotbWFuYWdlbWVudCB0eXBlLgotCi1UaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLQk8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgcGVyc2lzdGVuY2UtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBwcmltLWtleS1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhbgotZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcy4KLQotSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzIGRlZmVycmVkIHRvIGRlcGxveW1lbnQKLXRpbWUsIHRoZSBwcmltLWtleS1jbGFzcyBlbGVtZW50IHNob3VsZCBzcGVjaWZ5IGphdmEubGFuZy5PYmplY3QuCi0KLVVzZWQgaW46IGVudGl0eQotCi1FeGFtcGxlczoKLQotCTxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLQotCTxwcmltLWtleS1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVJRDwvcHJpbS1rZXktY2xhc3M+Ci0KLQk8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLk9iamVjdDwvcHJpbS1rZXktY2xhc3M+Ci0KLS0tPgotPCFFTEVNRU5UIHByaW0ta2V5LWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHByaW1hcnkKLWtleSBmaWVsZCBmb3IgYW4gZW50aXR5IHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuCi0KLVRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUgb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQgaW4gdGhlIGNtcC1maWVsZAotZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleQotdHlwZS4KLQotVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyBub3QgdXNlZCBpZiB0aGUgcHJpbWFyeSBrZXkgbWFwcyB0bwotbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbgotdGhpcyBjYXNlLCB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kCi10aGVpciBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbgotY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCi1Vc2VkIGluOiBlbnRpdHkKLQotRXhhbXBsZToKLQotCTxwcmlta2V5LWZpZWxkPkVtcGxveWVlSWQ8L3ByaW1rZXktZmllbGQ+Ci0KLS0tPgotPCFFTEVNRU5UIHByaW1rZXktZmllbGQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcXVlcnkgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgYSBmaW5kZXIgb3Igc2VsZWN0IHF1ZXJ5LiBJdAotY29udGFpbnMKLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeQotCS0gdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QKLQkgIG1ldGhvZCBpdCBpcyB1c2VkIGJ5Ci0gICAgICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmVzdWx0IHR5cGUgbWFwcGluZywgaWYKLSAgICAgICAgICB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZCBhbmQgZW50aXR5IG9iamVjdHMgYXJlCi0gICAgICAgICAgcmV0dXJuZWQuCi0gICAgCS0gdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBxdWVyeS4KLQotUXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwgbXVzdCB1c2UgdGhlIGVqYi1xbCBlbGVtZW50IHRvCi1zcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeSBpcyBub3QgZXhwcmVzc2libGUgaW4gRUpCIFFMLCB0aGUKLWRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUKLXF1ZXJ5IGFuZCB0aGUgZWpiLXFsIGVsZW1lbnQgc2hvdWxkIGJlIGVtcHR5LgotCi1UaGUgcmVzdWx0LXR5cGUtbWFwcGluZyBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBJdCBjYW4gb25seSBiZSBwcmVzZW50Ci1pZiB0aGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyBhIHNlbGVjdCBtZXRob2QgdGhhdCByZXR1cm5zIGVudGl0eQotb2JqZWN0cy4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzCi0iTG9jYWwiLgotCi0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgcXVlcnkgKGRlc2NyaXB0aW9uPywgcXVlcnktbWV0aG9kLCByZXN1bHQtdHlwZS1tYXBwaW5nPywgZWpiLXFsKT4KLQotPCEtLQotVGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvcgotc2VsZWN0IHF1ZXJ5LgotCi1UaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci1tZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLUVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi1tZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0KLVVzZWQgaW46IHF1ZXJ5Ci0KLUV4YW1wbGU6Ci0KLTxxdWVyeT4KLSAgICA8ZGVzY3JpcHRpb24+TWV0aG9kIGZpbmRzIGxhcmdlIG9yZGVyczwvZGVzY3JpcHRpb24+Ci0gICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgPG1ldGhvZC1uYW1lPmZpbmRMYXJnZU9yZGVyczwvbWV0aG9kLW5hbWU+Ci0gICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICA8ZWpiLXFsPlNFTEVDVCBPQkpFQ1QobykgRlJPTSBPcmRlciBvIFdIRVJFIG8uYW1vdW50ICZndDsgMTAwMDwvZWpiLXFsPgotPC9xdWVyeT4KLQotLS0+Ci08IUVMRU1FTlQgcXVlcnktbWV0aG9kIChtZXRob2QtbmFtZSwgbWV0aG9kLXBhcmFtcyk+Ci0KLTwhLS0KLVRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkgYmVhbiBpcyByZWVudHJhbnQgb3IKLW5vdC4KLQotVGhlIHJlZW50cmFudCBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0JPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIHJlZW50cmFudCAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhIHJvbGUKLXRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZQotZWxlbWVudCB1bmlxdWVseSBpZGVudGlmaWVzIGFuIGVudGl0eSBiZWFuLgotCi1Vc2VkIGluOiBlamItcmVsYXRpb25zaGlwLXJvbGUKLS0tPgotPCFFTEVNRU5UIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSAoZGVzY3JpcHRpb24/LCBlamItbmFtZSk+Ci0KLTwhLS0KLVRoZSByZWxhdGlvbnNoaXBzIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluIHdoaWNoCi1lbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSBwYXJ0aWNpcGF0ZS4gVGhlCi1yZWxhdGlvbnNoaXBzIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YKLWVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2ggc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQKLXJlbGF0aW9uc2hpcHMuCi0KLQotVXNlZCBpbjogZWpiLWphcgotLS0+Ci08IUVMRU1FTlQgcmVsYXRpb25zaGlwcyAoZGVzY3JpcHRpb24/LCBlamItcmVsYXRpb24rKT4KLQotPCEtLQotVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1yZWYsIGVudGl0eSwgc2Vzc2lvbgotCi1FeGFtcGxlOgotCi08cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLS0tPgotPCFFTEVNRU5UIHJlbW90ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtYXV0aCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSBzaWducwotb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyCi13aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4uIEluIHRoZQotbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotRGVwbG95ZXIuCi0KLVRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlIG1hbmFnZXIKLWNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBlbnRlcnByaXNlIGJlYW4uCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1zaGFyaW5nLXNjb3BlIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMgb2J0YWluZWQKLXRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUKLXNoYXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBtdXN0IGJlIG9uZSBvZiB0aGUKLXR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLQk8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCi1UaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXNoYXJpbmctc2NvcGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlLiBUaGUgdHlwZQotaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKLWV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UKLWluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4KLWluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5Ci10aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLQotRXhhbXBsZToKLQotPHJlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci08L3Jlc291cmNlLWVudi1yZWY+Ci0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmIChkZXNjcmlwdGlvbj8sIHJlc291cmNlLWVudi1yZWYtbmFtZSwKLQkJcmVzb3VyY2UtZW52LXJlZi10eXBlKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlCi1lbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi10aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGVudGVycHJpc2UgYmVhbi4KLQotVXNlZCBpbjogcmVzb3VyY2UtZW52LXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBhIHJlc291cmNlCi1lbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhCi1sYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHJlc291cmNlLWVudi1yZWYKLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1yZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLAotdGhlIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUKLWV4cGVjdGVkIGJ5IHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSwgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLShBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLXNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZSAoU2hhcmVhYmxlIG9yCi1VbnNoYXJlYWJsZSkuCi0KLVVzZWQgaW46IGVudGl0eSwgbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLQotRXhhbXBsZToKLQotICAgIDxyZXNvdXJjZS1yZWY+Ci0JPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLQk8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCTxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtcmVmIChkZXNjcmlwdGlvbj8sIHJlcy1yZWYtbmFtZSwgcmVzLXR5cGUsIHJlcy1hdXRoLAotCQlyZXMtc2hhcmluZy1zY29wZT8pPgotCi08IS0tCi0KLVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgcXVlcnkgZWxlbWVudCB0byBzcGVjaWZ5Ci13aGV0aGVyIGFuIGFic3RyYWN0IHNjaGVtYSB0eXBlIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgc2VsZWN0IG1ldGhvZAotaXMgdG8gYmUgbWFwcGVkIHRvIGFuIEVKQkxvY2FsT2JqZWN0IG9yIEVKQk9iamVjdCB0eXBlLgotCi1UaGUgcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLQotVXNlZCBpbjogcXVlcnkKLS0tPgotPCFFTEVNRU5UIHJlc3VsdC10eXBlLW1hcHBpbmcgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHNlY3VyaXR5IHJvbGUuIFRoZQotcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMKLWRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0KLVVzZWQgaW46IHNlY3VyaXR5LXJvbGUtcmVmCi0tLT4KLTwhRUxFTUVOVCByb2xlLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1UaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLVVzZWQgaW46IG1ldGhvZC1wZXJtaXNzaW9uLCBydW4tYXMsIHNlY3VyaXR5LXJvbGUsIHNlY3VyaXR5LXJvbGUtcmVmCi0tLT4KLTwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcnVuLWFzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlCi1leGVjdXRpb24gb2YgdGhlIGVudGVycHJpc2UgYmVhbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1Vc2VkIGluOiBzZWN1cml0eS1pZGVudGl0eQotLS0+Ci08IUVMRU1FTlQgcnVuLWFzIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+Ci0KLTwhLS0KLQotVGhlIHNlY3VyaXR5LWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzCi1zZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtZXRob2RzIG9mCi10aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMgaWRlbnRpdHkgaXMgdG8gYmUKLXVzZWQuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlCi1zZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1pZGVudGl0eSAoZGVzY3JpcHRpb24/LCAodXNlLWNhbGxlci1pZGVudGl0eXxydW4tYXMpKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUKLXNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotCi1Vc2VkIGluOiBhc3NlbWJseS1kZXNjcmlwdG9yCi0KLUV4YW1wbGU6Ci0KLSAgICA8c2VjdXJpdHktcm9sZT4KLQk8ZGVzY3JpcHRpb24+Ci0JICAgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAotCSAgICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0JPC9kZXNjcmlwdGlvbj4KLQk8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eQotcm9sZSByZWZlcmVuY2UgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSwKLWFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlIHNlY3VyaXR5IHJvbGUgaXMgbm90Ci1zcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbiBhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotCi1UaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkIGFzIHRoZQotcGFyYW1ldGVyIHRvIHRoZSBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kCi1vciB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLgotCi1Vc2VkIGluOiBlbnRpdHksIHNlc3Npb24KLQotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZS1yZWYgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lLCByb2xlLWxpbms/KT4KLQotPCEtLQotVGhlIHNlc3Npb24gZWxlbWVudCBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotb2Y6Ci0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JLSBhbiBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZQotCS0gYW4gb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWUKLQktIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbgotCS0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZSBhbmQKLQkgIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKLQktIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQKLQkgIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueQotCS0gdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JLSB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlCi0JLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZQotICAgICAgICAgIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIG1hbmFnZXIKLQkgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlIGVudmlyb25tZW50Ci0JICByZWZlcmVuY2VzLgotCi1UaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleQotYXJlIG9taXR0ZWQgd2hlbiBpZiBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotRWl0aGVyIGJvdGggdGhlIGxvY2FsLWhvbWUgYW5kIHRoZSBsb2NhbCBlbGVtZW50cyBvciBib3RoIHRoZQotaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlIHNlc3Npb24gYmVhbi4KLQotVXNlZCBpbjogZW50ZXJwcmlzZS1iZWFucwotLS0+Ci08IUVMRU1FTlQgc2Vzc2lvbiAoZGVzY3JpcHRpb24/LCBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywKLWxhcmdlLWljb24/LCBlamItbmFtZSwgaG9tZT8sIHJlbW90ZT8sIGxvY2FsLWhvbWU/LCBsb2NhbD8sCi1lamItY2xhc3MsIHNlc3Npb24tdHlwZSwgdHJhbnNhY3Rpb24tdHlwZSwgZW52LWVudHJ5KiwgZWpiLXJlZiosCi1lamItbG9jYWwtcmVmKiwgc2VjdXJpdHktcm9sZS1yZWYqLCBzZWN1cml0eS1pZGVudGl0eT8sIHJlc291cmNlLXJlZiosCi1yZXNvdXJjZS1lbnYtcmVmKik+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLXR5cGUgZWxlbWVudCBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uCi0KLVRoZSBzZXNzaW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxzZXNzaW9uLXR5cGU+U3RhdGVmdWw8L3Nlc3Npb24tdHlwZT4KLQk8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotLS0+Ci08IUVMRU1FTlQgc2Vzc2lvbi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLWVqYi1qYXIgZmlsZS4KLQotVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBlamItamFyLCBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxzbWFsbC1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZzwvc21hbGwtaWNvbj4KLS0tPgotPCFFTEVNRU5UIHNtYWxsLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIEpNUyB0b3BpYwotc3Vic2NyaXB0aW9uIGlzIGludGVuZGVkIHRvIGJlIGR1cmFibGUgb3Igbm9uZHVyYWJsZS4KLQotVGhlIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8c3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+RHVyYWJsZTwvc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+Ci0JPHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5Pk5vbkR1cmFibGU8L3N1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PgotCi1Vc2VkIGluOiBtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbgotLS0+Ci08IUVMRU1FTlQgc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHkgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdHJhbnMtYXR0cmlidXRlIGVsZW1lbnQgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QgbWFuYWdlCi10aGUgdHJhbnNhY3Rpb24gYm91bmRhcmllcyB3aGVuIGRlbGVnYXRpbmcgYSBtZXRob2QgaW52b2NhdGlvbiB0byBhbgotZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLgotCi1UaGUgdmFsdWUgb2YgdHJhbnMtYXR0cmlidXRlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQotCTx0cmFucy1hdHRyaWJ1dGU+Tm90U3VwcG9ydGVkPC90cmFucy1hdHRyaWJ1dGU+Ci0JPHRyYW5zLWF0dHJpYnV0ZT5TdXBwb3J0czwvdHJhbnMtYXR0cmlidXRlPgotCTx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLQk8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVzTmV3PC90cmFucy1hdHRyaWJ1dGU+Ci0JPHRyYW5zLWF0dHJpYnV0ZT5NYW5kYXRvcnk8L3RyYW5zLWF0dHJpYnV0ZT4KLQk8dHJhbnMtYXR0cmlidXRlPk5ldmVyPC90cmFucy1hdHRyaWJ1dGU+Ci0KLVVzZWQgaW46IGNvbnRhaW5lci10cmFuc2FjdGlvbgotLS0+Ci08IUVMRU1FTlQgdHJhbnMtYXR0cmlidXRlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHRyYW5zYWN0aW9uLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0JPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotCi1Vc2VkIGluOiBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgdHJhbnNhY3Rpb24tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB1bmNoZWNrZWQgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBhIG1ldGhvZCBpcyBub3QgY2hlY2tlZCBmb3IgYXV0aG9yaXphdGlvbgotYnkgdGhlIGNvbnRhaW5lciBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QuCi0KLVVzZWQgaW46IG1ldGhvZC1wZXJtaXNzaW9uCi0tLT4KLTwhRUxFTUVOVCB1bmNoZWNrZWQgRU1QVFk+Ci0KLTwhLS0KLQotVGhlIHVzZS1jYWxsZXItaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkKLWlkZW50aXR5IGJlIHVzZWQgYXMgdGhlIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQotVXNlZCBpbjogc2VjdXJpdHktaWRlbnRpdHkKLS0tPgotPCFFTEVNRU5UIHVzZS1jYWxsZXItaWRlbnRpdHkgRU1QVFk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZS4sIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbC1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRvb2xzIGFyZSBub3QgYWxsb3dlZCB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHRoZQotc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCBhYnN0cmFjdC1zY2hlbWEtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhY2tub3dsZWRnZS1tb2RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFzc2VtYmx5LWRlc2NyaXB0b3IgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY2FzY2FkZS1kZWxldGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY21wLWZpZWxkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNtcC12ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNtci1maWVsZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjbXItZmllbGQtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjbXItZmllbGQtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb250YWluZXItdHJhbnNhY3Rpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzdGluYXRpb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1jbGllbnQtamFyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1qYXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxvY2FsLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcWwgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWxhdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVsYXRpb24tbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVsYXRpb25zaGlwLXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW50ZXJwcmlzZS1iZWFucyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnRpdHkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBleGNsdWRlLWxpc3QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmllbGQtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBob21lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYWwgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYWwtaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXNzYWdlLWRyaXZlbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXNzYWdlLXNlbGVjdG9yIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtaW50ZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtcGFyYW0gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLXBhcmFtcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtcGVybWlzc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtdWx0aXBsaWNpdHkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGVyc2lzdGVuY2UtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcmltLWtleS1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcmlta2V5LWZpZWxkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHF1ZXJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHF1ZXJ5LW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWVudHJhbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbGF0aW9uc2hpcHMgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtc2hhcmluZy1zY29wZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc3VsdC10eXBlLW1hcHBpbmcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1saW5rIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJvbGUtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBydW4tYXMgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktaWRlbnRpdHkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1yb2xlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXNzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zLWF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0cmFuc2FjdGlvbi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHVuY2hlY2tlZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB1c2UtY2FsbGVyLWlkZW50aXR5IGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMl8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5NDI2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMl8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIyMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjIuMSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWpiLWphcl8yXzEueHNkcwkxLjIzIDA4LzAxLzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgRUpCIDIuMSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi9lamItamFyLnhtbCIgaW4KLQl0aGUgRUpCJ3MgamFyIGZpbGUuICBBbGwgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQotCXRoZSBlamItamFyIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8ZWpiLWphciB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCQkgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIgotCSAgICAgIHZlcnNpb249IjIuMSI+Ci0JICAgICAgLi4uCi0JICAgIDwvZWpiLWphcj4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIHRoZQotCUoyRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWphciIgdHlwZT0iajJlZTplamItamFyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgZWpiLWphciBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9ImVqYi1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZWpiLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBlbnRlcnByaXNlCi0JICBiZWFuLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnRlcnByaXNlLWJlYW5zLyoiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJlamItbmFtZS1yZWZlcmVuY2VzIgotCQlyZWZlcj0iajJlZTplamItbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotCSAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIG11c3QgYmUgdG8gYSBzcGVjaWZpYyBlamItbmFtZQotCSAgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGVudGVycHJpc2UtYmVhbnMgZWxlbWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvcgotCSAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS9qMmVlOnJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIvPgotICAgICAgPHhzZDpmaWVsZAotCSAgIHhwYXRoPSJqMmVlOmVqYi1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotCi0gICAgPHhzZDprZXkgbmFtZT0icm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0JICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6YXNzZW1ibHktZGVzY3JpcHRvci9qMmVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotCi0gICAgPHhzZDprZXlyZWYgbmFtZT0icm9sZS1uYW1lLXJlZmVyZW5jZXMiCi0JCXJlZmVyPSJqMmVlOnJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotCSAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudGVycHJpc2UtYmVhbnMvKi9qMmVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbGluayIvPgotICAgIDwveHNkOmtleXJlZj4KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlCi0JY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBwYWlyIGZvciBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0KLQlUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLQltZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSBlbGVtZW50IGNvbnRhaW5zCi0JICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YKLQkgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0JICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKLQkgICAgbmFtZXMgYXJlIHJlY29nbml6ZWQ6IGFja25vd2xlZGdlTW9kZSwKLQkgICAgbWVzc2FnZVNlbGVjdG9yLCBkZXN0aW5hdGlvblR5cGUsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHkKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQKLQkgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLQkgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCWV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbgotCWluIGl0cyBvcGVyYXRpb25hbCBlbnZpcm9ubWVudC4gVGhpcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbgotCWFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotCWRlc3RpbmF0aW9uIHR5cGUsIGV0Yy4KLQotCVRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZgotCW5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi0JVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0JbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImoyZWU6YWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXNzZW1ibHktZGVzY3JpcHRvclR5cGUgZGVmaW5lcwotCWFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uLgotCi0JVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotCWZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZQotCWRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLCB0aGUgZGVmaW5pdGlvbiBvZgotCXRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotCWNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIGFuZCBhIGxpc3Qgb2YKLQltZXRob2RzIHRvIGJlIGV4Y2x1ZGVkIGZyb20gYmVpbmcgaW52b2tlZC4KLQotCUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi0Jb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLQlQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZC1wZXJtaXNzaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci10cmFuc2FjdGlvbiIKLQkJICAgdHlwZT0iajJlZTpjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtbGlzdCIKLQkJICAgdHlwZT0iajJlZTpleGNsdWRlLWxpc3RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtZmllbGRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21wLWZpZWxkVHlwZSBkZXNjcmliZXMgYSBjb250YWluZXItbWFuYWdlZCBmaWVsZC4gVGhlCi0JY21wLWZpZWxkVHlwZSBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsCi0JYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4KLQotCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgICAgY21wLXZlcnNpb24gMi54IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZQotCSAgICBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZQotCSAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0JICAgIGZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLAotCSAgICBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgICAgY21wLXZlcnNpb24gMS54IG11c3QgZGVub3RlIGEgcHVibGljIGZpZWxkIG9mIHRoZQotCSAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLXZlcnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21wLXZlcnNpb25UeXBlIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbgotCXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLQljbXAtdmVyc2lvbiBlbGVtZW50cy4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICAxLngKLQkgICAgMi54Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxLngiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLngiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXItZmllbGQtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXItZmllbGQtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgY2xhc3Mgb2YgYQotCWNvbGxlY3Rpb24tdmFsdWVkIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkKLQliZWFuIGNsYXNzLiBUaGUgdmFsdWUgb2YgYW4gZWxlbWVudCB1c2luZyBjbXItZmllbGQtdHlwZVR5cGUKLQltdXN0IGJlIGVpdGhlcjogamF2YS51dGlsLkNvbGxlY3Rpb24gb3IgamF2YS51dGlsLlNldC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS51dGlsLlNldCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXItZmllbGRUeXBlIGRlc2NyaWJlcyB0aGUgYmVhbiBwcm92aWRlcidzIHZpZXcgb2YKLQlhIHJlbGF0aW9uc2hpcC4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotCXRoZSBuYW1lIGFuZCB0aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYQotCXJvbGUgb2YgYSByZWxhdGlvbnNoaXAuIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50Ci0JY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZCBmb3IgdGhlIGdldCBhbmQgc2V0IGFjY2Vzc29yCi0JbWV0aG9kcyBmb3IgdGhlIHJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgaXMKLQl1c2VkIG9ubHkgZm9yIGNvbGxlY3Rpb24tdmFsdWVkIGNtci1maWVsZHMuIEl0IHNwZWNpZmllcyB0aGUKLQl0eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4KLQkgICAgY2xhc3MuIFRoZSBuYW1lIG9mIHRoZSBjbXItZmllbGQgbXVzdCBiZWdpbiB3aXRoIGEKLQkgICAgbG93ZXJjYXNlIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzCi0JICAgIHdob3NlIG5hbWVzIGNvbnNpc3Qgb2YgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0JICAgIHNwZWNpZmllZCBieSBjbXItZmllbGQtbmFtZSBpbiB3aGljaCB0aGUgZmlyc3QKLQkgICAgbGV0dGVyIGlzIHVwcGVyY2FzZWQsIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtci1maWVsZC10eXBlIgotCQkgICB0eXBlPSJqMmVlOmNtci1maWVsZC10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyCi0JbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLQltZXRob2QgaW52b2NhdGlvbnMuIEl0IGRlZmluZXMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEKLQlsaXN0IG9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLiBUaGUKLQl0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZAotCW1ldGhvZHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZFR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnMtYXR0cmlidXRlIgotCQkgICB0eXBlPSJqMmVlOnRyYW5zLWF0dHJpYnV0ZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItY2xhc3NUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItY2xhc3NUeXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLQkgIGVudGVycHJpc2UgYmVhbidzIGNsYXNzLiBJdCBpcyB1c2VkIGJ5IGVqYi1jbGFzcyBlbGVtZW50cy4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxlamItY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZUJlYW48L2VqYi1jbGFzcz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItamFyVHlwZSBkZWZpbmVzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQgotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgY29udGFpbnMKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUKLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lCi0JICAgIC0gbWFuZGF0b3J5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkCi0JICAgICAgZW50ZXJwcmlzZSBiZWFucwotCSAgICAtIGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywKLQkgICAgICBpZiBhbnkKLQkgICAgLSBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yCi0JICAgIC0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUKLQkgICAgICBlamItamFyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGVycHJpc2UtYmVhbnMiCi0JCSAgIHR5cGU9ImoyZWU6ZW50ZXJwcmlzZS1iZWFuc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXBzIgotCQkgICB0eXBlPSJqMmVlOnJlbGF0aW9uc2hpcHNUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6dW5pcXVlIG5hbWU9InJlbGF0aW9uc2hpcC1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlbGF0aW9uLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICByZWxhdGlvbnNoaXBzLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVsYXRpb24iLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlbGF0aW9uLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3IiCi0JCSAgIHR5cGU9ImoyZWU6YXNzZW1ibHktZGVzY3JpcHRvclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50Ci0JICAgIGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUKLQkgICAgcHJvZHVjZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsaWVudC1qYXIiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUgotCSAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhCi0JICAgICAgY2xpZW50IHByb2dyYW0gdG8gYWNjZXNzIHRoZQotCSAgICAgIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkJICA8ZWpiLWNsaWVudC1qYXI+ZW1wbG95ZWVfc2VydmljZV9jbGllbnQuamFyCi0JCSAgPC9lamItY2xpZW50LWphcj4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iMi4xIgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUKLQkgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QKLQkgIGNvbXBseSB3aXRoLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95bWVudCB0b29scwotCSAgdG8gdmFsaWRhdGUgYSBwYXJ0aWN1bGFyIEVKQiBEZXBsb3ltZW50Ci0JICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQgotCSAgc2NoZW1hLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLW5hbWVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyBuYW1lLiBJdCBpcwotCSAgdXNlZCBieSBlamItbmFtZSBlbGVtZW50cy4gVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZQotCSAgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUKLQkgIGVqYi1qYXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZQotCSAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgc2FtZQotCSAgZWpiLWphciBmaWxlLgotCi0JICBUaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdXNlZAotCSAgZWpiLW5hbWUgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgdGhlIEpOREkgbmFtZSB0aGF0Ci0JICB0aGUgRGVwbG95ZXIgd2lsbCBhc3NpZ24gdG8gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUuCi0KLQkgIFRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwKLQkgIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi0JICBFeGFtcGxlOgotCi0JICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZE5NVE9LRU5UeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItcmVsYXRpb25UeXBlIGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bwotCWVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiAgSXQgaXMgdXNlZAotCWJ5IGVqYi1yZWxhdGlvbiBlbGVtZW50cy4gSXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4KLQlvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28KLQlyZWxhdGlvbnNoaXAgcm9sZSBkZWNsYXJhdGlvbnMsIGRlZmluZWQgYnkgdGhlCi0JZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnRzLiBUaGUgbmFtZSBvZiB0aGUKLQlyZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgotCWZpbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lCi0JICAgIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlIGZvciBhIHJlbGF0aW9uc2hpcC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIKLQkJICAgdHlwZT0iajJlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi0JICByZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0KLQkgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0JICBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhCi0JICBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsCi0JICBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOwotCSAgdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgY21yLWZpZWxkLCBpZiBhbnksCi0JICBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzCi0JICBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0KLQkgIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLQotCSAgVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5Ci0JICBiZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsCi0JICByZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCi0JICByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZAotCSAgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YKLQkgIGEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcwotCSAgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQKLQkgIHRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzCi0JICAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotCi0JICBFeGFtcGxlOgotCi0JICA8ZWpiLXJlbGF0aW9uPgotCSAgICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLQkgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotCQkgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5wcm9kdWN0LWhhcy1saW5laXRlbXMKLQkJICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotCQkgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0JCSAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLQkJICA8ZWpiLW5hbWU+UHJvZHVjdEVKQjwvZWpiLW5hbWU+Ci0JCSAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0JICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotCSAgPC9lamItcmVsYXRpb24+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYQotCSAgICBuYW1lIGZvciBhIHJvbGUgdGhhdCBpcyB1bmlxdWUgd2l0aGluIGFuCi0JICAgIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLQkgICAgc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGlwbGljaXR5IgotCQkgICB0eXBlPSJqMmVlOm11bHRpcGxpY2l0eVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRlbGV0ZSIKLQkJICAgdHlwZT0iajJlZTplbXB0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYQotCSAgICBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0JICAgIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YKLQkgICAgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuCi0JICAgIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUKLQkgICAgZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4KLQkgICAgd2hpY2ggdGhlIG90aGVyIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCSAgICBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb25zaGlwLXJvbGUtc291cmNlIgotCQkgICB0eXBlPSJqMmVlOnJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQiCi0JCSAgIHR5cGU9ImoyZWU6Y21yLWZpZWxkVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50ZXJwcmlzZS1iZWFuc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbnRlcnByaXNlLWJlYW5zVHlwZSBkZWNsYXJlcyBvbmUgb3IgbW9yZSBlbnRlcnByaXNlCi0JYmVhbnMuIEVhY2ggYmVhbiBjYW4gYmUgYSBzZXNzaW9uLCBlbnRpdHkgb3IgbWVzc2FnZS1kcml2ZW4KLQliZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIKLQkJICAgdHlwZT0iajJlZTpzZXNzaW9uLWJlYW5UeXBlIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0JICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLQkgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1sb2NhbC1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXMtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLQkgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiCi0JCSAgIHR5cGU9ImoyZWU6ZW50aXR5LWJlYW5UeXBlIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLQkgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotCSAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLQkgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRyaXZlbiIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRyaXZlbi1iZWFuVHlwZSI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLQkgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotCSAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXMtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0JICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVudGl0eS1iZWFuVHlwZSBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi0JY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZQotCSAgICAtIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotCSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGhvbWUKLQkgICAgICBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBsb2NhbCBob21lIGFuZCBsb2NhbAotCSAgICAgIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UgbWFuYWdlbWVudCB0eXBlCi0JICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZQotCSAgICAtIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCi0JICAgICAgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbgotCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MKLQkgICAgICBhYnN0cmFjdCBzY2hlbWEgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkKLQkgICAgICBmaWVsZAotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQKLQkgICAgICBlbnRyaWVzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotCSAgICAgIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIKLQkgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLQkgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucwotCSAgICAgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLQkgICAgICBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgotCi0JVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKLQlmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSBhbmQKLQljbXAtdmVyc2lvbiAyLnguCi0KLQlUaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvcgotCWlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4KLQotCVRoZSBvcHRpb25hbCBjbXAtdmVyc2lvbiBlbGVtZW50IG1heSBiZSBwcmVzZW50IGluIHRoZQotCWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZgotCXRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uCi0JZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgZGVmYXVsdHMgdG8gMi54LgotCi0JVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotCXRoZSBlbnRpdHkgYmVhbiBjbXAtdmVyc2lvbiBpcyAxLnguCi0KLQlUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0JdGhlIGVudGl0eSBiZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotCi0JVGhlIG9wdGlvbmFsIGxvY2FsLWhvbWUgYW5kIGxvY2FsIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkCi0JaWYgdGhlIGVudGl0eSBiZWFuIGhhcyBhIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZS4KLQotCUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotCXRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkLgotCi0JVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUKLQlwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQKLQlxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZAotCWZvciB0aGUgZW50aXR5IGJlYW4uCi0KLQlUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlCi0Jc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtCi0JYXJlIGVtcHR5LgotCi0JQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKLQlkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQKLQl0aGUgY21wLXZlcnNpb24gaXMgMS54LCBhbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmIHRoZQotCWVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotCQkgICB0eXBlPSJqMmVlOmhvbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0JCSAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLQkJICAgdHlwZT0iajJlZTpsb2NhbC1ob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6cGVyc2lzdGVuY2UtdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltLWtleS1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0JICAgIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0KLQkgICAgSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzCi0JICAgIGRlZmVycmVkIHRvIGRlcGxveW1lbnQgdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzCi0JICAgIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWVudHJhbnQiCi0JCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYW4gZW50aXR5Ci0JICAgIGJlYW4gaXMgcmVlbnRyYW50IG9yIG5vdC4KLQotCSAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3bwotCSAgICBmb2xsb3dpbmc6IHRydWUgb3IgZmFsc2UKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtdmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpjbXAtdmVyc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFic3RyYWN0LXNjaGVtYS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmphdmEtaWRlbnRpZmllclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotCSAgICBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuCi0KLQkgICAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5Ci0JICAgIGJlYW4gd2hvc2UgbG9jYWwgaW50ZXJmYWNlIGlzCi0JICAgIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtcC1maWVsZCIKLQkJICAgdHlwZT0iajJlZTpjbXAtZmllbGRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWtleS1maWVsZCIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotCSAgICBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZCBmb3IgYW4gZW50aXR5IHdpdGgKLQkgICAgY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuCi0KLQkgICAgVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZAotCSAgICBpbiB0aGUgY21wLWZpZWxkIGVsZW1lbnQsIGFuZCB0aGUgdHlwZSBvZiB0aGUgZmllbGQKLQkgICAgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLQotCSAgICBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5Ci0JICAgIGtleSBtYXBzIHRvIG11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotCSAgICAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4gdGhpcyBjYXNlLCB0aGUKLQkgICAgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kCi0JICAgIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YKLQkgICAgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29tcHJpc2UgdGhlIGtleS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWlkZW50aXR5IgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiCi0JCSAgIHR5cGU9ImoyZWU6cXVlcnlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhjbHVkZS1saXN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGV4Y2x1ZGUtbGlzdFR5cGUgc3BlY2lmaWVzIG9uZSBvciBtb3JlIG1ldGhvZHMgd2hpY2gKLQl0aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCi0KLQlJZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZQotCWluIHRoZSBleGNsdWRlIGxpc3QsIHRoZSBEZXBsb3llciBzaG91bGQgY29uc2lkZXIgdGhvc2UKLQltZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZFR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kcml2ZW4tYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXNzYWdlLWRyaXZlbiBlbGVtZW50IGRlY2xhcmVzIGEgbWVzc2FnZS1kcml2ZW4KLQliZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZS4KLQkgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbgotCSAgICAgIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQkgICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdpbmcKLQkgICAgICB0eXBlCi0JICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluawotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MKLQkgICAgICBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQKLQkgICAgICBlbnRyaWVzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIHNlcnZpY2UKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5Ci0JICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgbWV0aG9kcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0JICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmVqYi1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdpbmctdHlwZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UKLQkgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLiBJZgotCSAgICB0aGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcwotCSAgICBhc3N1bWVkIHRvIGJlIGphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24tdHlwZSIKLQkJICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWciCi0JCSAgIHR5cGU9ImoyZWU6YWN0aXZhdGlvbi1jb25maWdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWlkZW50aXR5IgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLWludGZUeXBlIj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvCi0JZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLQlzaWduYXR1cmUgdGhhdCBhcmUgbXVsdGlwbHkgZGVmaW5lZCBhY3Jvc3MgdGhlIGhvbWUgYW5kCi0JY29tcG9uZW50IGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotCXJlbW90ZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvciBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi0JaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGV0Yy4pOyB0aGUgY29tcG9uZW50IGFuZCB3ZWIKLQlzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMsIGFuZCBzbyBvbi4KLQotCVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgSG9tZQotCSAgICBSZW1vdGUKLQkgICAgTG9jYWxIb21lCi0JICAgIExvY2FsCi0JICAgIFNlcnZpY2VFbmRwb2ludAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSG9tZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW90ZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsSG9tZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2VydmljZUVuZHBvaW50Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLW5hbWVUeXBlIGNvbnRhaW5zIGEgbmFtZSBvZiBhbiBlbnRlcnByaXNlCi0JYmVhbiBtZXRob2Qgb3IgdGhlIGFzdGVyaXNrICgqKSBjaGFyYWN0ZXIuIFRoZSBhc3RlcmlzayBpcwotCXVzZWQgd2hlbiB0aGUgZWxlbWVudCBkZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbgotCWVudGVycHJpc2UgYmVhbidzIGNsaWVudCB2aWV3IGludGVyZmFjZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1wYXJhbXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLXBhcmFtc1R5cGUgZGVmaW5lcyBhIGxpc3Qgb2YgdGhlCi0JZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOmphdmEtdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWV0aG9kLXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBwcmltaXRpdmUKLQkgICAgb3IgYSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWUgb2YgYSBtZXRob2QKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZSBzcGVjaWZpZXMgdGhhdCBvbmUgb3IgbW9yZQotCXNlY3VyaXR5IHJvbGVzIGFyZSBhbGxvd2VkIHRvIGludm9rZSBvbmUgb3IgbW9yZSBlbnRlcnByaXNlCi0JYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIGNvbnNpc3RzIG9mIGFuCi0Jb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBzZWN1cml0eSByb2xlIG5hbWVzIG9yIGFuCi0JaW5kaWNhdG9yIHRvIHN0YXRlIHRoYXQgdGhlIG1ldGhvZCBpcyB1bmNoZWNrZWQgZm9yCi0JYXV0aG9yaXphdGlvbiwgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLQlUaGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlCi0JbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIG9mIHRoZQotCWRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcwotCWRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCBhbmQvb3Igd2ViCi0Jc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0JCSAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0idW5jaGVja2VkIgotCQkgICAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHVuY2hlY2tlZCBlbGVtZW50IHNwZWNpZmllcyB0aGF0IGEgbWV0aG9kIGlzCi0JICAgICAgbm90IGNoZWNrZWQgZm9yIGF1dGhvcml6YXRpb24gYnkgdGhlIGNvbnRhaW5lcgotCSAgICAgIHByaW9yIHRvIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLQkJICAgdHlwZT0iajJlZTptZXRob2RUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1ldGhvZFR5cGUgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZQotCSAgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50Ci0JICBpbnRlcmZhY2UsIG9yLCBpbiB0aGUgY2FzZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4sIHRoZQotCSAgYmVhbidzIG1lc3NhZ2UgbGlzdGVuZXIgbWV0aG9kLCBvciBhIHNldCBvZiBzdWNoCi0JICBtZXRob2RzLiBUaGUgZWpiLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUKLQkgIGVudGVycHJpc2UgYmVhbnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlCi0JICBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEKLQkgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSB0aGF0IGlzIG11bHRpcGx5IGRlZmluZWQKLQkgIGFjcm9zcyB0aGUgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQKLQkgIGludGVyZmFjZXM7IHRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWV0aG9kCi0JICBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgYQotCSAgc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZAotCSAgbWV0aG9kIG5hbWUuCi0KLQkgIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdXNpbmcgbWV0aG9kVHlwZSBlbGVtZW50Ci0JICB3aXRoaW4gYSBtZXRob2QgZWxlbWVudDoKLQotCSAgMS4KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZQotCSAgICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYgotCSAgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotCi0JICAyLgotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0JICAgICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0JICAgICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZgotCSAgICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLQkgICAgIG5hbWUuCi0KLQkgIDMuCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLQkJICAuLi4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLW48L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYQotCSAgICAgc2V0IG9mIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaAotCSAgICAgUEFSQU0tbiBhcmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZQotCSAgICAgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQKLQkgICAgIGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBubwotCSAgICAgbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0JICAgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZgotCSAgICAgc3F1YXJlIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLQkgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoaXMgc3R5bGUgcmVmZXJzCi0JICAgICB0byBhbGwgb2YgdGhlIG92ZXJsb2FkZWQgbWV0aG9kcy4KLQotCSAgRXhhbXBsZXM6Ci0KLQkgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUKLQkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50LAotCSAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXM6Ci0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFN0eWxlIDI6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUKLQkgIGNyZWF0ZSBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUKLQkgIGludGVyZmFjZShzKS4KLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICBTdHlsZSAzOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byB0aGUKLQkgIGNyZWF0ZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgTGFzdE5hbWUpIG1ldGhvZCBvZiB0aGUKLQkgIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UocykuCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi0JICBtb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi0JICBmb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotCSAgbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmNoYXI8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmludDwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+aW50W108L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzc1tdW108L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgVGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzCi0JICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIHRoYXQgaXMgbXVsdGlwbHkKLQkgIGRlZmluZWQgYWNyb3NzIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lLCBjb21wb25lbnQsIGFuZC9vcgotCSAgd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi0JICBzaWduYXR1cmUuCi0KLQkgIEZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKQotCSAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUKLQkgIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBob21lCi0JICBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIGFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLQkgIGludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdpdGggYWxsIHRoIHJlZSBTdHlsZXMKLQkgIG9mIHRoZSBtZXRob2QgZWxlbWVudCB1c2FnZS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKLQkgIG1ldGhvZCBlbGVtZW50IGV4YW1wbGUgY291bGQgYmUgdXNlZCB0byByZWZlciB0byBhbGwgdGhlCi0JICBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZS4KLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtaW50ZiIKLQkJICAgdHlwZT0iajJlZTptZXRob2QtaW50ZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im11bHRpcGxpY2l0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtdWx0aXBsaWNpdHlUeXBlIGRlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZQotCXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbi4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBPbmUKLQkgICAgTWFueQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFueSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcGVyc2lzdGVuY2UtdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UKLQltYW5hZ2VtZW50IHR5cGUuCi0KLQlUaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIEJlYW4KLQkgICAgQ29udGFpbmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFuIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvciBzZWxlY3QKLQkgIHF1ZXJ5LgotCi0JICBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JICBtZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLQkgIEVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi0JICBtZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0KLQkgIEl0IGlzIHVzZWQgYnkgdGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50LgotCi0JICBFeGFtcGxlOgotCi0JICA8cXVlcnk+Ci0JICAgICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8L2Rlc2NyaXB0aW9uPgotCSAgICAgIDxxdWVyeS1tZXRob2Q+Ci0JCSAgPG1ldGhvZC1uYW1lPmZpbmRMYXJnZU9yZGVyczwvbWV0aG9kLW5hbWU+Ci0JCSAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotCSAgICAgIDwvcXVlcnktbWV0aG9kPgotCSAgICAgIDxlamItcWw+Ci0JCVNFTEVDVCBPQkpFQ1QobykgRlJPTSBPcmRlciBvCi0JCSAgV0hFUkUgby5hbW91bnQgJmd0OyAxMDAwCi0JICAgICAgPC9lamItcWw+Ci0JICA8L3F1ZXJ5PgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLQkJICAgdHlwZT0iajJlZTptZXRob2QtcGFyYW1zVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHF1ZXJ5VHlwZSBkZWZpbmVzIGEgZmluZGVyIG9yIHNlbGVjdAotCXF1ZXJ5LiBJdCBjb250YWlucwotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeQotCSAgICAtIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmaW5kZXIgb3Igc2VsZWN0Ci0JICAgICAgbWV0aG9kIGl0IGlzIHVzZWQgYnkKLQkJLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQgdHlwZQotCQkgIG1hcHBpbmcsIGlmIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kCi0JCSAgYW5kIGVudGl0eSBvYmplY3RzIGFyZSByZXR1cm5lZC4KLQkJLSB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LgotCi0JUXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwgbXVzdCB1c2UgdGhlIGVqYi1xbAotCWVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkgaXMgbm90IGV4cHJlc3NpYmxlCi0JaW4gRUpCIFFMLCB0aGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgYmUgdXNlZCB0bwotCWRlc2NyaWJlIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIHF1ZXJ5IGFuZCB0aGUgZWpiLXFsIGVsZW1lbnQKLQlzaG91bGQgYmUgZW1wdHkuCi0KLQlUaGUgcmVzdWx0LXR5cGUtbWFwcGluZyBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBJdCBjYW4gb25seQotCWJlIHByZXNlbnQgaWYgdGhlIHF1ZXJ5LW1ldGhvZCBzcGVjaWZpZXMgYSBzZWxlY3QgbWV0aG9kCi0JdGhhdCByZXR1cm5zIGVudGl0eSBvYmplY3RzLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQotCXJlc3VsdC10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyAiTG9jYWwiLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktbWV0aG9kIgotCQkgICB0eXBlPSJqMmVlOnF1ZXJ5LW1ldGhvZFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOnJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcWwiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGRlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhCi0Jcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQQotCXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgaXMgdXNlZCBieQotCXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50cyB0byB1bmlxdWVseSBpZGVudGlmeSBhbgotCWVudGl0eSBiZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmVqYi1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcHNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVsYXRpb25zaGlwc1R5cGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluCi0Jd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UKLQlwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHNUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0JZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaAotCXNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWxhdGlvblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InJvbGUtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZWxhdGlvbnNoaXAgcm9sZS4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgYSByZWxhdGlvbnNoaXAsIGJ1dCBjYW4gYmUgcmV1c2VkIGluIGRpZmZlcmVudAotCSAgICAgIHJlbGF0aW9uc2hpcHMuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yCi0JICAgICAgIHhwYXRoPSIuLy9qMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIi8+Ci0JICA8eHNkOmZpZWxkCi0JICAgICAgIHhwYXRoPSIuIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8KLQlzcGVjaWZ5IHdoZXRoZXIgYW4gYWJzdHJhY3Qgc2NoZW1hIHR5cGUgcmV0dXJuZWQgYnkgYSBxdWVyeQotCWZvciBhIHNlbGVjdCBtZXRob2QgaXMgdG8gYmUgbWFwcGVkIHRvIGFuIEVKQkxvY2FsT2JqZWN0IG9yCi0JRUpCT2JqZWN0IHR5cGUuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBMb2NhbAotCSAgICBSZW1vdGUKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktaWRlbnRpdHlUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncwotCXNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlCi0JbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMKLQlpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCWFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0idXNlLWNhbGxlci1pZGVudGl0eSIKLQkJICAgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSB1c2UtY2FsbGVyLWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQKLQkgICAgICB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUKLQkgICAgICBzZWN1cml0eSBpZGVudGl0eSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLQkgICAgICBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2RzLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLQkJICAgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2Vzc2lvbi1iZWFuVHlwZSBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZQotCWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0JICAgICAgaWNvbiBmaWxlIG5hbWUKLQkgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotCSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZSBhbmQKLQkgICAgICByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotCSAgICAgIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBuYW1lIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB3ZWIgc2VydmljZSBlbmRwb2ludAotCSAgICAgIGludGVyZmFjZSwgaWYgYW55Ci0JICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZQotCSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgZW52aXJvbm1lbnQgZW50cmllcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsCi0JICAgICAgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotCSAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotCSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotCSAgICAgIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0JICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0KLQlUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlCi0JdGhhdCB0aGV5IGFyZSBvbWl0dGVkIHdoZW4gaWYgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUKLQllbXB0eS4KLQotCUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotCXRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUKLQlzZXNzaW9uIGJlYW4uCi0KLQlUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBpZiB0aGUKLQliZWFuIGlzIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotCQkgICB0eXBlPSJqMmVlOmhvbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0JCSAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLQkJICAgdHlwZT0iajJlZTpsb2NhbC1ob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50IgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyB3ZWIKLQkgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIFRoZSBzZXJ2aWNlLWVuZHBvaW50Ci0JICAgIGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhIHN0YXRlbGVzcwotCSAgICBzZXNzaW9uIGJlYW4uIFRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG11c3QgYmUgYQotCSAgICB2YWxpZCBKQVgtUlBDIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTplamItY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10eXBlIgotCQkgICB0eXBlPSJqMmVlOnNlc3Npb24tdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIgotCQkgICB0eXBlPSJqMmVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXNzaW9uLXR5cGVUeXBlIGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBzZXNzaW9uIGJlYW4gaXMgYQotCXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uIEl0IGlzIHVzZWQgYnkKLQlzZXNzaW9uLXR5cGUgZWxlbWVudHMuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgU3RhdGVmdWwKLQkgICAgU3RhdGVsZXNzCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZWZ1bCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbGVzcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zLWF0dHJpYnV0ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFucy1hdHRyaWJ1dGVUeXBlIHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0Ci0JbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZAotCWludm9jYXRpb24gdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgTm90U3VwcG9ydGVkCi0JICAgIFN1cHBvcnRzCi0JICAgIFJlcXVpcmVkCi0JICAgIFJlcXVpcmVzTmV3Ci0JICAgIE1hbmRhdG9yeQotCSAgICBOZXZlcgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3VwcG9ydGVkIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3VwcG9ydHMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlZCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVzTmV3Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFuZGF0b3J5Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmV2ZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRyYW5zYWN0aW9uLXR5cGVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncwotCXRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLQotCVRoZSB0cmFuc2FjdGlvbi10eXBlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIEJlYW4KLQkgICAgQ29udGFpbmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFuIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfM18wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8zXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI4MjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8zXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjcwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMy4wIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyllamItamFyXzNfMC54c2RzCTEuNTEgMDIvMjMvMDYKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAgICAgIFUuUy5BCi0gICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgRUpCIDMuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi9lamItamFyLnhtbCIgaW4KLQl0aGUgRUpCJ3MgamFyIGZpbGUuICBBbGwgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQotCXRoZSBlamItamFyIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxlamItamFyIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCQkgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMC54c2QiCi0JICAgICAgdmVyc2lvbj0iMy4wIj4KLQkgICAgICAuLi4KLQkgICAgPC9lamItamFyPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgdGhlCi0JSmF2YSBFRSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItamFyIiB0eXBlPSJqYXZhZWU6ZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIGVqYi1qYXIgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJlamItbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVqYi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gZW50ZXJwcmlzZQotCSAgYmVhbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnRlcnByaXNlLWJlYW5zLyoiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9ImVqYi1uYW1lLXJlZmVyZW5jZXMiCi0JCXJlZmVyPSJqYXZhZWU6ZWpiLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLQkgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBtdXN0IGJlIHRvIGEgc3BlY2lmaWMgZWpiLW5hbWUKLQkgIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IKLXhwYXRoPSIuLy9qYXZhZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlL2phdmFlZTpyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UiLz4KLSAgICAgIDx4c2Q6ZmllbGQKLQkgICB4cGF0aD0iamF2YWVlOmVqYi1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotCi0gICAgPHhzZDprZXkgbmFtZT0icm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCi0JICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTphc3NlbWJseS1kZXNjcmlwdG9yL2phdmFlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotCi0gICAgPHhzZDprZXlyZWYgbmFtZT0icm9sZS1uYW1lLXJlZmVyZW5jZXMiCi0JCXJlZmVyPSJqYXZhZWU6cm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0JICBzZWN1cml0eS1yb2xlLXJlZiB0byBhIHNwZWNpZmllZCByb2xlLW5hbWUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnRlcnByaXNlLWJlYW5zLyovamF2YWVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIG5hbWUvdmFsdWUKLQljb25maWd1cmF0aW9uIHByb3BlcnR5IHBhaXIgZm9yIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotCVRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhcgotCW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUgZWxlbWVudCBjb250YWlucwotCSAgICB0aGUgbmFtZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnR5IG9mCi0JICAgIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotCSAgICBGb3IgSk1TIG1lc3NhZ2UtZHJpdmVuIGJlYW5zLCB0aGUgZm9sbG93aW5nIHByb3BlcnR5Ci0JICAgIG5hbWVzIGFyZSByZWNvZ25pemVkOiBhY2tub3dsZWRnZU1vZGUsCi0JICAgIG1lc3NhZ2VTZWxlY3RvciwgZGVzdGluYXRpb25UeXBlLCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5Ci0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIGVsZW1lbnQKLQkgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KLQkgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjdGl2YXRpb24tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFjdGl2YXRpb24tY29uZmlnVHlwZSBkZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCWV4cGVjdGVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbgotCWluIGl0cyBvcGVyYXRpb25hbCBlbnZpcm9ubWVudC4gVGhpcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbgotCWFib3V0IG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50LCBtZXNzYWdlIHNlbGVjdG9yLCBleHBlY3RlZAotCWRlc3RpbmF0aW9uIHR5cGUsIGV0Yy4KLQotCVRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZgotCW5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgotCi0JVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0JbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eSIKLQkJICAgdHlwZT0iamF2YWVlOmFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvbi1leGNlcHRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFwcGxpY2F0aW9uLWV4Y2VwdGlvblR5cGUgZGVjbGFyZXMgYW4gYXBwbGljYXRpb24KLSAgICAgICAgZXhjZXB0aW9uLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLSAgICAgICAgICAgIC0gdGhlIGV4Y2VwdGlvbiBjbGFzcy4gV2hlbiB0aGUgY29udGFpbmVyIHJlY2VpdmVzCi0gICAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBvZiB0aGlzIHR5cGUsIGl0IGlzIHJlcXVpcmVkIHRvCi0gICAgICAgICAgICAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24gYXMgYW4gYXBwbGNhdGlvbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgdG8gdGhlIGNsaWVudCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgYSBjaGVja2VkCi0gICAgICAgICAgICAgIG9yIHVuY2hlY2tlZCBleGNlcHRpb24uCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIHJvbGxiYWNrIGVsZW1lbnQuIElmIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICBzZXQgdG8gdHJ1ZSwgdGhlIGNvbnRhaW5lciBtdXN0IHJvbGxiYWNrIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJlZm9yZSBmb3J3YXJkaW5nIHRoZSBleGNlcHRpb24gdG8gdGhlCi0gICAgICAgICAgICAgIGNsaWVudC4gIElmIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGZhbHNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sbGJhY2siCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFyb3VuZC1pbnZva2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGFyb3VuZC1pbnZva2UgdHlwZSBzcGVjaWZpZXMgYSBtZXRob2Qgb24gYQotICAgICAgICBjbGFzcyB0byBiZSBjYWxsZWQgZHVyaW5nIHRoZSBhcm91bmQgaW52b2tlIHBvcnRpb24gb2YgYW4KLSAgICAgICAgZWpiIGludm9jYXRpb24uICBOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZQotICAgICAgICBhcm91bmQgaW52b2tlIG1ldGhvZCBhbmQgdGhhdCB0aGUgbWV0aG9kIG1heSBub3QgYmUKLSAgICAgICAgb3ZlcmxvYWRlZC4KLQotICAgICAgICBJZiB0aGUgY2xhc3MgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4KLSAgICAgICAgdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBjYWxsYmFjayBpcyBhc3N1bWVkIHRvIGJlIHRoZQotICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBvciBjb21wb25lbnQgY2xhc3MgaW4gc2NvcGUgYXQgdGhlCi0gICAgICAgIGxvY2F0aW9uIGluIHRoZSBkZXNjcmlwdG9yIGluIHdoaWNoIHRoZSBhcm91bmQgaW52b2tlCi0gICAgICAgIGRlZmluaXRpb24gYXBwZWFycy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXNzZW1ibHktZGVzY3JpcHRvclR5cGUgZGVmaW5lcwotCWFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uLgotCi0JVGhlIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mIHRoZQotCWZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZQotCWRlZmluaXRpb24gb2YgbWV0aG9kIHBlcm1pc3Npb25zLCB0aGUgZGVmaW5pdGlvbiBvZgotCXRyYW5zYWN0aW9uIGF0dHJpYnV0ZXMgZm9yIGVudGVycHJpc2UgYmVhbnMgd2l0aAotCWNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLCB0aGUgZGVmaW5pdGlvbgotICAgICAgICBvZiBpbnRlcmNlcHRvciBiaW5kaW5ncywgYSBsaXN0IG9mCi0JbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQsIGFuZCBhIGxpc3Qgb2YKLSAgICAgICAgZXhjZXB0aW9uIHR5cGVzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwbGljYXRpb24gZXhjZXB0aW9ucy4KLQotCUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi0Jb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLQlQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBlcm1pc3Npb24iCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2QtcGVybWlzc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3ItYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aW50ZXJjZXB0b3ItYmluZGluZ1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1saXN0IgotCQkgICB0eXBlPSJqYXZhZWU6ZXhjbHVkZS1saXN0VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tZXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcHBsaWNhdGlvbi1leGNlcHRpb25UeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC1maWVsZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXAtZmllbGRUeXBlIGRlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUKLQljbXAtZmllbGRUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwKLQlhbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4KLQotCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgICAgY21wLXZlcnNpb24gMi54IG11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZQotCSAgICBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZQotCSAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0JICAgIGZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0IGxldHRlciBpcyB1cHBlcmNhc2VkLAotCSAgICBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgICAgY21wLXZlcnNpb24gMS54IG11c3QgZGVub3RlIGEgcHVibGljIGZpZWxkIG9mIHRoZQotCSAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLXZlcnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21wLXZlcnNpb25UeXBlIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbgotCXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLQljbXAtdmVyc2lvbiBlbGVtZW50cy4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICAxLngKLQkgICAgMi54Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEueCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIueCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtci1maWVsZC10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNtci1maWVsZC10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjbGFzcyBvZiBhCi0JY29sbGVjdGlvbi12YWx1ZWQgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eQotCWJlYW4gY2xhc3MuIFRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IHVzaW5nIGNtci1maWVsZC10eXBlVHlwZQotCW11c3QgYmUgZWl0aGVyOiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBqYXZhLnV0aWwuU2V0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5TZXQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXItZmllbGRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21yLWZpZWxkVHlwZSBkZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mCi0JYSByZWxhdGlvbnNoaXAuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQKLQl0aGUgbmFtZSBhbmQgdGhlIGNsYXNzIHR5cGUgb2YgYSBmaWVsZCBpbiB0aGUgc291cmNlIG9mIGEKLQlyb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudAotCWNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIHVzZWQgZm9yIHRoZSBnZXQgYW5kIHNldCBhY2Nlc3NvcgotCW1ldGhvZHMgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBjbXItZmllbGQtdHlwZSBlbGVtZW50IGlzCi0JdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBjbXItZmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlCi0JdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGlzIHVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkgYmVhbgotCSAgICBjbGFzcy4gVGhlIG5hbWUgb2YgdGhlIGNtci1maWVsZCBtdXN0IGJlZ2luIHdpdGggYQotCSAgICBsb3dlcmNhc2UgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMKLQkgICAgd2hvc2UgbmFtZXMgY29uc2lzdCBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQKLQkgICAgc3BlY2lmaWVkIGJ5IGNtci1maWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdAotCSAgICBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTpjbXItZmllbGQtdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lcgotCW11c3QgbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbidzCi0JbWV0aG9kIGludm9jYXRpb25zLiBJdCBkZWZpbmVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhCi0JbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS4gVGhlCi0JdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQKLQltZXRob2RzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFucy1hdHRyaWJ1dGUiCi0JCSAgIHR5cGU9ImphdmFlZTp0cmFucy1hdHRyaWJ1dGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWNsYXNzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLWNsYXNzVHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi0JICBlbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4gSXQgaXMgdXNlZCBieSBlamItY2xhc3MgZWxlbWVudHMuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8ZWpiLWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2VCZWFuPC9lamItY2xhc3M+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItamFyVHlwZSBkZWZpbmVzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQgotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gSXQgY29udGFpbnMKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUKLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lCi0JICAgIC0gc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgaW5jbHVkZWQKLQkgICAgICBlbnRlcnByaXNlIGJlYW5zIHRoYXQgaXMgbm90IHNwZWNpZmllZCB0aHJvdWdoCi0gICAgICAgICAgICAgIGFubm90YXRpb25zCi0gICAgICAgICAgICAtIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgaW50ZXJjZXB0b3IgY2xhc3NlcwotCSAgICAtIGEgZGVzY3JpcHRvciBmb3IgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcywKLQkgICAgICBpZiBhbnkuCi0JICAgIC0gYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcgotCSAgICAtIGFuIG9wdGlvbmFsIG5hbWUgb2YgYW4gZWpiLWNsaWVudC1qYXIgZmlsZSBmb3IgdGhlCi0JICAgICAgZWpiLWphci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGVycHJpc2UtYmVhbnMiCi0JCSAgIHR5cGU9ImphdmFlZTplbnRlcnByaXNlLWJlYW5zVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvcnMiCi0JCSAgIHR5cGU9ImphdmFlZTppbnRlcmNlcHRvcnNUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcHMiCi0JCSAgIHR5cGU9ImphdmFlZTpyZWxhdGlvbnNoaXBzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJyZWxhdGlvbnNoaXAtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZWxhdGlvbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgcmVsYXRpb25zaGlwcy4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVsYXRpb24iLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVsYXRpb24tbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzZW1ibHktZGVzY3JpcHRvciIKLQkJICAgdHlwZT0iamF2YWVlOmFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotCSAgICBkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlCi0JICAgIHByb2R1Y2VyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGllbnQtamFyIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUgotCSAgICAgIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhCi0JICAgICAgY2xpZW50IHByb2dyYW0gdG8gYWNjZXNzIHRoZQotCSAgICAgIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkJICA8ZWpiLWNsaWVudC1qYXI+ZW1wbG95ZWVfc2VydmljZV9jbGllbnQuamFyCi0JCSAgPC9lamItY2xpZW50LWphcj4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIzLjAiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotCSAgRUpCIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgbXVzdAotCSAgY29tcGx5IHdpdGguIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3ltZW50IHRvb2xzCi0JICB0byB2YWxpZGF0ZSBhIHBhcnRpY3VsYXIgRUpCIERlcGxveW1lbnQKLQkgIERlc2NyaXB0b3Igd2l0aCByZXNwZWN0IHRvIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgRUpCCi0JICBzY2hlbWEuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLQkgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0JICBkZXNjcmlwdG9ycyBmb3IgdGhpcyBtb2R1bGUgKGUuZy4sIHdlYiBzZXJ2aWNlCi0JICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcwotCSAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0JICB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgYW5ub3RhdGlvbnMKLQkgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgotCi0JICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBzZXQgdG8gInRydWUiLCB0aGUgZGVwbG95bWVudAotCSAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKLQkgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotCSAgb2YgdGhlIGFwcGxpY2F0aW9uLgotCi0JICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotCSAgImZhbHNlIiwgdGhlIGRlcGxveW1lbnQgdG9vbCBtdXN0IGV4YW1pbmUgdGhlIGNsYXNzCi0JICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcwotCSAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItbmFtZVR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIG5hbWUuIEl0IGlzCi0JICB1c2VkIGJ5IGVqYi1uYW1lIGVsZW1lbnRzLiBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlCi0JICBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gbmFtZSB0aGUgZW50ZXJwcmlzZSBiZWFuIGluIHRoZQotCSAgZWpiLWphciBmaWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlCi0JICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBzYW1lCi0JICBlamItamFyIGZpbGUuCi0KLQkgIFRoZXJlIGlzIG5vIGFyY2hpdGVjdGVkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB1c2VkCi0JICBlamItbmFtZSBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCB0aGUgSk5ESSBuYW1lIHRoYXQKLQkgIHRoZSBEZXBsb3llciB3aWxsIGFzc2lnbiB0byB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4KLQotCSAgVGhlIG5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbAotCSAgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTp4c2ROTVRPS0VOVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVsYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLXJlbGF0aW9uVHlwZSBkZXNjcmliZXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28KLQllbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIEl0IGlzIHVzZWQKLQlieSBlamItcmVsYXRpb24gZWxlbWVudHMuIEl0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuCi0Jb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsgYW5kIGV4YWN0bHkgdHdvCi0JcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZQotCWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50cy4gVGhlIG5hbWUgb2YgdGhlCi0JcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIKLQlmaWxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50IHByb3ZpZGVzIGEgdW5pcXVlIG5hbWUKLQkgICAgd2l0aGluIHRoZSBlamItamFyIGZpbGUgZm9yIGEgcmVsYXRpb25zaGlwLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi0JICByZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0KLQkgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0JICBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhCi0JICBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsCi0JICBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOwotCSAgdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgY21yLWZpZWxkLCBpZiBhbnksCi0JICBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzCi0JICBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0KLQkgIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLQotCSAgVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5Ci0JICBiZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsCi0JICByZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCi0JICByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZAotCSAgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YKLQkgIGEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcwotCSAgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQKLQkgIHRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzCi0JICAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotCi0JICBFeGFtcGxlOgotCi0JICA8ZWpiLXJlbGF0aW9uPgotCSAgICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KLQkgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotCQkgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5wcm9kdWN0LWhhcy1saW5laXRlbXMKLQkJICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotCQkgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0JCSAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLQkJICA8ZWpiLW5hbWU+UHJvZHVjdEVKQjwvZWpiLW5hbWU+Ci0JCSAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0JICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotCSAgPC9lamItcmVsYXRpb24+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgZWxlbWVudCBkZWZpbmVzIGEKLQkgICAgbmFtZSBmb3IgYSByb2xlIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiBhbgotCSAgICBlamItcmVsYXRpb24uIERpZmZlcmVudCByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlCi0JICAgIHNhbWUgbmFtZSBmb3IgYSByb2xlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpcGxpY2l0eSIKLQkJICAgdHlwZT0iamF2YWVlOm11bHRpcGxpY2l0eVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRlbGV0ZSIKLQkJICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhCi0JICAgIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwLCB0aGUgbGlmZXRpbWUgb2Ygb25lIG9yIG1vcmUKLQkgICAgZW50aXR5IGJlYW5zIGlzIGRlcGVuZGVudCB1cG9uIHRoZSBsaWZldGltZSBvZgotCSAgICBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4KLQkgICAgb25seSBiZSBzcGVjaWZpZWQgZm9yIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCSAgICBlbGVtZW50IGNvbnRhaW5lZCBpbiBhbiBlamItcmVsYXRpb24gZWxlbWVudCBpbgotCSAgICB3aGljaCB0aGUgb3RoZXIgZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0JICAgIGVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UiCi0JCSAgIHR5cGU9ImphdmFlZTpyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkIgotCQkgICB0eXBlPSJqYXZhZWU6Y21yLWZpZWxkVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50ZXJwcmlzZS1iZWFuc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbnRlcnByaXNlLWJlYW5zVHlwZSBkZWNsYXJlcyBvbmUgb3IgbW9yZSBlbnRlcnByaXNlCi0JYmVhbnMuIEVhY2ggYmVhbiBjYW4gYmUgYSBzZXNzaW9uLCBlbnRpdHkgb3IgbWVzc2FnZS1kcml2ZW4KLQliZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOnNlc3Npb24tYmVhblR5cGUiPgotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLQkgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotCSAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItbG9jYWwtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0JICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudi1lbnRyeSIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eSIKLQkJICAgdHlwZT0iamF2YWVlOmVudGl0eS1iZWFuVHlwZSI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0JICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLQkgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgICAgICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLQkgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kcml2ZW4iCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRyaXZlbi1iZWFuVHlwZSI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YKLQkgICAgICBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbgotCSAgICAgIHRoZSBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBiZSBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItbG9jYWwtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUKLQkgICAgICBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVudGl0eS1iZWFuVHlwZSBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi0JY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZQotCSAgICAtIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotCSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbWFwcGVkLW5hbWUgZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgICAgICAgdmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcGh5c2ljYWwKLSAgICAgICAgICAgICAgam5kaS1uYW1lIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZS4gVGhpcwotICAgICAgICAgICAgICBlbGVtZW50IGlzIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4KLSAgICAgICAgICAgICAgQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaG9tZQotCSAgICAgIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsCi0JICAgICAgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgICAgLSB0aGUgb3B0aW9uYWwgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUuIElmCi0gICAgICAgICAgICAgIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0JICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MgbmFtZQotCSAgICAtIGFuIGluZGljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVlbnRyYW5jeQotCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCi0JICAgICAgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbgotCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MKLQkgICAgICBhYnN0cmFjdCBzY2hlbWEgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzCi0JICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkKLQkgICAgICBmaWVsZAotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQKLQkgICAgICBlbnRyaWVzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotCSAgICAgIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIKLQkgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLQkgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgc2V0IG9mIHF1ZXJ5IGRlY2xhcmF0aW9ucwotCSAgICAgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLQkgICAgICBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgotCi0JVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKLQlmb3IgYW4gZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSBhbmQKLQljbXAtdmVyc2lvbiAyLnguCi0KLQlUaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvcgotCWlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4KLQotCVRoZSBvcHRpb25hbCBjbXAtdmVyc2lvbiBlbGVtZW50IG1heSBiZSBwcmVzZW50IGluIHRoZQotCWRlc2NyaXB0b3IgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZgotCXRoZSBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uCi0JZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgZGVmYXVsdHMgdG8gMi54LgotCi0JVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotCXRoZSBlbnRpdHkgYmVhbiBjbXAtdmVyc2lvbiBpcyAxLnguCi0KLQlUaGUgb3B0aW9uYWwgaG9tZSBhbmQgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0JdGhlIGVudGl0eSBiZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotCi0JVGhlIG9wdGlvbmFsIGxvY2FsLWhvbWUgYW5kIGxvY2FsIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkCi0JaWYgdGhlIGVudGl0eSBiZWFuIGhhcyBhIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZS4KLQotCUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotCXRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkLgotCi0JVGhlIG9wdGlvbmFsIHF1ZXJ5IGVsZW1lbnRzIG11c3QgYmUgcHJlc2VudCBpZiB0aGUKLQlwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQKLQlxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZAotCWZvciB0aGUgZW50aXR5IGJlYW4uCi0KLQlUaGUgb3RoZXIgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlCi0Jc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtCi0JYXJlIGVtcHR5LgotCi0JQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKLQlkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQKLQl0aGUgY21wLXZlcnNpb24gaXMgMS54LCBhbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmIHRoZQotCWVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotCQkgICB0eXBlPSJqYXZhZWU6aG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLQkJICAgdHlwZT0iamF2YWVlOnJlbW90ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbC1ob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6cGVyc2lzdGVuY2UtdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltLWtleS1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcHJpbS1rZXktY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUKLQkgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLQkgICAgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcy4KLQotCSAgICBJZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMKLQkgICAgZGVmZXJyZWQgdG8gZGVwbG95bWVudCB0aW1lLCB0aGUgcHJpbS1rZXktY2xhc3MKLQkgICAgZWxlbWVudCBzaG91bGQgc3BlY2lmeSBqYXZhLmxhbmcuT2JqZWN0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZW50cmFudCIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eQotCSAgICBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuCi0KLQkgICAgVGhlIHJlZW50cmFudCBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28KLQkgICAgZm9sbG93aW5nOiB0cnVlIG9yIGZhbHNlCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21wLXZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpjbXAtdmVyc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFic3RyYWN0LXNjaGVtYS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JICAgIGNtcC12ZXJzaW9uIDIueC4gSXQgaXMgdXNlZCBpbiBFSkIgUUwgcXVlcmllcy4KLQotCSAgICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkKLQkgICAgYmVhbiB3aG9zZSBsb2NhbCBpbnRlcmZhY2UgaXMKLQkgICAgY29tLmFjbWUuY29tbWVyY2UuT3JkZXIgbWlnaHQgYmUgT3JkZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21wLWZpZWxkIgotCQkgICB0eXBlPSJqYXZhZWU6Y21wLWZpZWxkVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1rZXktZmllbGQiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotCSAgICBuYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZCBmb3IgYW4gZW50aXR5IHdpdGgKLQkgICAgY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuCi0KLQkgICAgVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZAotCSAgICBpbiB0aGUgY21wLWZpZWxkIGVsZW1lbnQsIGFuZCB0aGUgdHlwZSBvZiB0aGUgZmllbGQKLQkgICAgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLQotCSAgICBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIG5vdCB1c2VkIGlmIHRoZSBwcmltYXJ5Ci0JICAgIGtleSBtYXBzIHRvIG11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotCSAgICAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4gdGhpcyBjYXNlLCB0aGUKLQkgICAgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kCi0JICAgIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YKLQkgICAgdGhlIGVudGl0eSBiZWFuIGNsYXNzIHRoYXQgY29tcHJpc2UgdGhlIGtleS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LWlkZW50aXR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiCi0JCSAgIHR5cGU9ImphdmFlZTpxdWVyeVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleGNsdWRlLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXhjbHVkZS1saXN0VHlwZSBzcGVjaWZpZXMgb25lIG9yIG1vcmUgbWV0aG9kcyB3aGljaAotCXRoZSBBc3NlbWJsZXIgbWFya3MgdG8gYmUgdW5jYWxsYWJsZS4KLQotCUlmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlCi0JaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIHNob3VsZCBjb25zaWRlciB0aG9zZQotCW1ldGhvZHMgdG8gYmUgdW5jYWxsYWJsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZFR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5pdC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNyZWF0ZS1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmVhbi1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJjZXB0b3ItYmluZGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW50ZXJjZXB0b3ItYmluZGluZ1R5cGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIGJpbmRpbmcgb2YKLSAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3NlcyB0byBiZWFucyB3aXRoaW4gdGhlIGVqYi1qYXIuCi0gICAgICAgIEl0IGNvbnNpc3RzIG9mIDoKLQotICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gICAgICAgICAgLSBUaGUgbmFtZSBvZiBhbiBlamIgd2l0aGluIHRoZSBlamItamFyIG9yIHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIsCi0gICAgICAgICAgICB3aGljaCBpcyB1c2VkIHRvIGRlZmluZSBpbnRlcmNlcHRvcnMgdGhhdCBhcmUgYm91bmQgdG8gYWxsCi0gICAgICAgICAgICBiZWFucyBpbiB0aGUgZWpiLWphci4KLSAgICAgICAgICAtIEEgbGlzdCBvZiBpbnRlcmNlcHRvciBjbGFzc2VzIHRoYXQgYXJlIGJvdW5kIHRvIHRoZSBjb250ZW50cyBvZgotICAgICAgICAgICAgdGhlIGVqYi1uYW1lIGVsZW1lbnQgb3IgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSB0b3RhbCBvcmRlcmluZwotICAgICAgICAgICAgb3ZlciB0aGUgaW50ZXJjZXB0b3JzIGRlZmluZWQgZm9yIHRoZSBnaXZlbiBsZXZlbCBhbmQgYWJvdmUuCi0gICAgICAgICAgLSBBbiBvcHRpb25hbCBleGNsdWRlLWRlZmF1bHQtaW50ZXJjZXB0b3JzIGVsZW1lbnQuICBJZiBzZXQgdG8gdHJ1ZSwKLSAgICAgICAgICAgIHNwZWNpZmllcyB0aGF0IGRlZmF1bHQgaW50ZXJjZXB0b3JzIGFyZSBub3QgdG8gYmUgYXBwbGllZCB0bwotICAgICAgICAgICAgYSBiZWFuLWNsYXNzIGFuZC9vciBidXNpbmVzcyBtZXRob2QuCi0gICAgICAgICAgLSBBbiBvcHRpb25hbCBleGNsdWRlLWNsYXNzLWludGVyY2VwdG9ycyBlbGVtZW50LiAgSWYgc2V0IHRvIHRydWUsCi0gICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBjbGFzcyBpbnRlcmNlcHRvcnMgYXJlIG5vdCB0byBiZSBhcHBsaWVkIHRvCi0gICAgICAgICAgICBhIGJ1c2luZXNzIG1ldGhvZC4KLSAgICAgICAgICAtIEFuIG9wdGlvbmFsIHNldCBvZiBtZXRob2QgZWxlbWVudHMgZm9yIGRlc2NyaWJpbmcgdGhlIG5hbWUvcGFyYW1zCi0gICAgICAgICAgICBvZiBhIG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvci4KLQotICAgICAgICAgSW50ZXJjZXB0b3JzIGJvdW5kIHRvIGFsbCBjbGFzc2VzIHVzaW5nIHRoZSB3aWxkY2FyZCBzeW50YXgKLSAgICAgICAgICIqIiBhcmUgZGVmYXVsdCBpbnRlcmNlcHRvcnMgZm9yIHRoZSBjb21wb25lbnRzIGluIHRoZSBlamItamFyLgotICAgICAgICAgSW4gYWRkaXRpb24sIGludGVyY2VwdG9ycyBtYXkgYmUgYm91bmQgYXQgdGhlIGxldmVsIG9mIHRoZSBiZWFuCi0gICAgICAgICBjbGFzcyAoY2xhc3MtbGV2ZWwgaW50ZXJjZXB0b3JzKSBvciBidXNpbmVzcyBtZXRob2RzIChtZXRob2QtbGV2ZWwKLSAgICAgICAgIGludGVyY2VwdG9ycyApLgotCi0gICAgICAgICBUaGUgYmluZGluZyBvZiBpbnRlcmNlcHRvcnMgdG8gY2xhc3NlcyBpcyBhZGRpdGl2ZS4gIElmIGludGVyY2VwdG9ycwotICAgICAgICAgYXJlIGJvdW5kIGF0IHRoZSBjbGFzcy1sZXZlbCBhbmQvb3IgZGVmYXVsdC1sZXZlbCBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgbWV0aG9kLWxldmVsLCBib3RoIGNsYXNzLWxldmVsIGFuZC9vciBkZWZhdWx0LWxldmVsIGFzIHdlbGwgYXMKLSAgICAgICAgIG1ldGhvZC1sZXZlbCB3aWxsIGFwcGx5LgotCi0gICAgICAgICBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBzdHlsZXMgb2YgdGhlIGludGVyY2VwdG9yIGVsZW1lbnQgc3ludGF4IDoKLQotICAgICAgICAgMS4KLSAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nPgotICAgICAgICAgICA8ZWpiLW5hbWU+KjwvZWpiLW5hbWU+Ci0gICAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0KLSAgICAgICAgIFNwZWNpZnlpbmcgdGhlIGVqYi1uYW1lIGFzIHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIgZGVzaWduYXRlcwotICAgICAgICAgZGVmYXVsdCBpbnRlcmNlcHRvcnMgKGludGVyY2VwdG9ycyB0aGF0IGFwcGx5IHRvIGFsbCBzZXNzaW9uIGFuZAotICAgICAgICAgbWVzc2FnZS1kcml2ZW4gYmVhbnMgY29udGFpbmVkIGluIHRoZSBlamItamFyKS4KLQotICAgICAgICAgMi4KLSAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nPgotICAgICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0KLSAgICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBpbnRlcmNlcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICAgICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbihjbGFzcy1sZXZlbCBpbnRlcmNlcHRvcnMpLgotCi0gICAgICAgICAzLgotICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0KLSAgICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3Igd2l0aAotICAgICAgICAgdGhlIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcwotICAgICAgICAgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mIHRoaXMgc3R5bGUgcmVmZXJzCi0gICAgICAgICB0byBhbGwgdGhlIG1ldGhvZHMgd2l0aCB0aGUgb3ZlcmxvYWRlZCBuYW1lLiAgTWV0aG9kLWxldmVsCi0gICAgICAgICBpbnRlcmNlcHRvcnMgY2FuIG9ubHkgYmUgYXNzb2NpYXRlZCB3aXRoIGJ1c2luZXNzIG1ldGhvZHMgb2YgdGhlCi0gICAgICAgICBiZWFuIGNsYXNzLiAgIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmQgdmFsdWUgIioiIGNhbm5vdCBiZSB1c2VkCi0gICAgICAgICB0byBzcGVjaWZ5IG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvcnMuCi0KLSAgICAgICAgIDQuCi0gICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS1OPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLQotICAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhIG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvciB3aXRoCi0gICAgICAgICB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZiB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gIFRoaXMKLSAgICAgICAgIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhIHNldCBvZiBtZXRob2RzCi0gICAgICAgICB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gIFRoZSB2YWx1ZXMgUEFSQU0tMSB0aHJvdWdoIFBBUkFNLU4KLSAgICAgICAgIGFyZSB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgIChpZiB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dCBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQKLSAgICAgICAgIGNvbnRhaW5zIG5vIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICAgICAgICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2Ygc3F1YXJlCi0gICAgICAgICBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1vcmRlciIKLQkJICAgICB0eXBlPSJqYXZhZWU6aW50ZXJjZXB0b3Itb3JkZXJUeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1pbnRlcmNlcHRvcnMiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1jbGFzcy1pbnRlcmNlcHRvcnMiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmNlcHRvci1vcmRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgVGhlIGludGVyY2VwdG9yLW9yZGVyVHlwZSBlbGVtZW50IGRlc2NyaWJlcyBhIHRvdGFsIG9yZGVyaW5nCi0gICAgICAgIG9mIGludGVyY2VwdG9yIGNsYXNzZXMuCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJjZXB0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGludGVyY2VwdG9yVHlwZSBlbGVtZW50IGRlY2xhcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzLiAgSXQgY29uc2lzdHMgb2YgOgotCi0gICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgICAgICAgICAgLSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGludGVyY2VwdG9yIGNsYXNzLgotICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIGFyb3VuZCBpbnZva2UgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IGVudmlyb25tZW50IGRlcGVuZGVuY2llcyBmb3IgdGhlIGludGVyY2VwdG9yCi0gICAgICAgICAgICAgIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBwb3N0LWFjdGl2YXRlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gICAgICAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBwcmUtcGFzc2l2YXRlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gICAgICAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvci1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcm91bmQtaW52b2tlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtaW52b2tlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1hY3RpdmF0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGFzc2l2YXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyY2VwdG9yc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgaW50ZXJjZXB0b3JzVHlwZSBlbGVtZW50IGRlY2xhcmVzIG9uZSBvciBtb3JlIGludGVyY2VwdG9yCi0gICAgICAgIGNsYXNzZXMgdXNlZCBieSBjb21wb25lbnRzIHdpdGhpbiB0aGlzIGVqYi1qYXIuICBUaGUgZGVjbGFyYXRpb24KLSAgICAgICAgY29uc2lzdHMgb2YgOgotCi0gICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgICAgICAgICAgLSBPbmUgb3IgbW9yZSBpbnRlcmNlcHRvciBlbGVtZW50cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnRlcmNlcHRvciIKLQkJICAgdHlwZT0iamF2YWVlOmludGVyY2VwdG9yVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRyaXZlbi1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbgotCWJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lLgotCSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0JICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICAgICAgICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICAgICAgICAgICAgICBqbmRpLW5hbWUgb2YgZGVzdGluYXRpb24gZnJvbSB3aGljaCB0aGlzIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLSAgICAgICAgICAgICAgc2hvdWxkIGNvbnN1bWUuICBUaGlzIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZAotICAgICAgICAgICAgICBieSBhbGwgaW1wbGVtZW50YXRpb25zLiAgQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotCSAgICAtIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZwotCSAgICAgIHR5cGUKLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB0aW1lb3V0IG1ldGhvZC4KLQkgICAgLSB0aGUgb3B0aW9uYWwgbWVzc2FnZS1kcml2ZW4gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQKLSAgICAgICAgICAgICAgdHlwZS4gSWYgaXQgaXMgbm90IGRlZmluZWQsIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0JICAgICAgYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMKLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiBjbGFzcyBhbmQvb3IKLSAgICAgICAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtaW52b2tlIG1ldGhvZHMuCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotCSAgICAgIGVudHJpZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIgc2VydmljZQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkKLQkgICAgICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICBtZXRob2RzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5Ci0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLQkgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotCSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTplamItY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICBUaGUgZWpiLWNsYXNzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQotICAgICAgICAgICAgIG9mIHRoZSBiZWFuIGNsYXNzIGZvciB0aGlzIGVqYi4gIEl0IGlzIHJlcXVpcmVkIHVubGVzcwotICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tcG9uZW50LWRlZmluaW5nIGFubm90YXRpb24gZm9yIHRoZSBzYW1lCi0gICAgICAgICAgICAgZWpiLW5hbWUuCi0KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdpbmctdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWVzc2FnZQotCSAgICBsaXN0ZW5lciBpbnRlcmZhY2Ugb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZW91dC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24tdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOnRyYW5zYWN0aW9uLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnIgotCQkgICB0eXBlPSJqYXZhZWU6YWN0aXZhdGlvbi1jb25maWdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcm91bmQtaW52b2tlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtaW52b2tlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1pbnRmVHlwZSI+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgYSBtZXRob2QgZWxlbWVudCB0bwotCWRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi0Jc2lnbmF0dXJlIHRoYXQgYXJlIG11bHRpcGx5IGRlZmluZWQgYWNyb3NzIHRoZSBob21lIGFuZAotCWNvbXBvbmVudCBpbnRlcmZhY2VzIChlLmcsIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLQlyZW1vdGUgYW5kIGxvY2FsIGludGVyZmFjZXMgb3IgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotCWhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBldGMuKTsgdGhlIGNvbXBvbmVudCBhbmQgd2ViCi0Jc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLCBhbmQgc28gb24uIFRoZSBMb2NhbCBhcHBsaWVzIHRvCi0gICAgICAgIGJvdGggbG9jYWwgY29tcG9uZW50IGludGVyZmFjZSBhbmQgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlLgotICAgICAgICBTaW1pbGFybHksIFJlbW90ZSBhcHBsaWVzIHRvIGJvdGggcmVtb3RlIGNvbXBvbmVudCBpbnRlcmZhY2UKLSAgICAgICAgYW5kIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlLgotCi0JVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBIb21lCi0JICAgIFJlbW90ZQotCSAgICBMb2NhbEhvbWUKLQkgICAgTG9jYWwKLQkgICAgU2VydmljZUVuZHBvaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEhvbWUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VFbmRwb2ludCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1ldGhvZC1uYW1lVHlwZSBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZQotCWJlYW4gbWV0aG9kIG9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMKLQl1c2VkIHdoZW4gdGhlIGVsZW1lbnQgZGVub3RlcyBhbGwgdGhlIG1ldGhvZHMgb2YgYW4KLQllbnRlcnByaXNlIGJlYW4ncyBjbGllbnQgdmlldyBpbnRlcmZhY2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1wYXJhbXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLXBhcmFtc1R5cGUgZGVmaW5lcyBhIGxpc3Qgb2YgdGhlCi0JZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtIgotCQkgICB0eXBlPSJqYXZhZWU6amF2YS10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXRob2QtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIHByaW1pdGl2ZQotCSAgICBvciBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiBhIG1ldGhvZAotCSAgICBwYXJhbWV0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLXBlcm1pc3Npb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlCi0Jc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLQliZWFuIG1ldGhvZHMuIFRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUgY29uc2lzdHMgb2YgYW4KLQlvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4KLQlpbmRpY2F0b3IgdG8gc3RhdGUgdGhhdCB0aGUgbWV0aG9kIGlzIHVuY2hlY2tlZCBmb3IKLQlhdXRob3JpemF0aW9uLCBhbmQgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cy4KLQotCVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUKLQltdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgb2YgdGhlCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQgdGhlIG1ldGhvZHMgbXVzdCBiZSBtZXRob2RzCi0JZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudAotICAgICAgICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIKLQkJICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmNoZWNrZWQiCi0JCSAgICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSB1bmNoZWNrZWQgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBhIG1ldGhvZCBpcwotCSAgICAgIG5vdCBjaGVja2VkIGZvciBhdXRob3JpemF0aW9uIGJ5IHRoZSBjb250YWluZXIKLQkgICAgICBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2RUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1ldGhvZFR5cGUgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZQotCSAgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotCSAgaW50ZXJmYWNlLCBvciwgaW4gdGhlIGNhc2Ugb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLCB0aGUKLQkgIGJlYW4ncyBtZXNzYWdlIGxpc3RlbmVyIG1ldGhvZCwgb3IgYSBzZXQgb2Ygc3VjaAotCSAgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlCi0JICBlbnRlcnByaXNlIGJlYW5zIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZQotCSAgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhCi0JICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBtdWx0aXBseSBkZWZpbmVkCi0JICBhY3Jvc3MgdGhlIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZQotICAgICAgICAgIGVuZHBvaW50IG50ZXJmYWNlczsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotICAgICAgICAgIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkKLSAgICAgICAgICBhIHNpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQKLQkgIG1ldGhvZCBuYW1lLgotCi0JICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHVzaW5nIG1ldGhvZFR5cGUgZWxlbWVudAotCSAgd2l0aGluIGEgbWV0aG9kIGVsZW1lbnQ6Ci0KLQkgIDEuCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUKLQkgICAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50LAotICAgICAgICAgICAgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotCi0JICAyLgotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0JICAgICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0JICAgICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZgotCSAgICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLQkgICAgIG5hbWUuCi0KLQkgIDMuCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KLQkJICAuLi4KLQkJICA8bWV0aG9kLXBhcmFtPlBBUkFNLW48L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYQotCSAgICAgc2V0IG9mIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaAotCSAgICAgUEFSQU0tbiBhcmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZQotCSAgICAgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQKLQkgICAgIGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBubwotCSAgICAgbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0JICAgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZgotCSAgICAgc3F1YXJlIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLQkgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoaXMgc3R5bGUgcmVmZXJzCi0JICAgICB0byBhbGwgb2YgdGhlIG92ZXJsb2FkZWQgbWV0aG9kcy4KLQotCSAgRXhhbXBsZXM6Ci0KLQkgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUKLQkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsCi0gICAgICAgICAgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlczoKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZQotCSAgY3JlYXRlIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZQotCSAgaW50ZXJmYWNlKHMpLgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQotCSAgY3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZQotCSAgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZShzKS4KLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLQkgIG1vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QKLQkgIGZvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsCi0JICBteXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikgd291bGQgYmUgc3BlY2lmaWVkIGFzOgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5mb29iYXI8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+Y2hhcjwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5pbnRbXTwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3M8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBUaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLQkgIG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgdGhhdCBpcyBtdWx0aXBseQotCSAgZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsCi0gICAgICAgICAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotCSAgc2lnbmF0dXJlLiBIb3dldmVyLCBpZiB0aGUgc2FtZSBtZXRob2QgaXMgYSBtZXRob2Qgb2YgYm90aCB0aGUKLSAgICAgICAgICBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2UsIGFuZCB0aGUgbG9jYWwgY29tcG9uZW50IGludGVyZmFjZSwKLSAgICAgICAgICB0aGUgc2FtZSBhdHRyaWJ1dGUgYXBwbGllcyB0byB0aGUgbWV0aG9kIGZvciBib3RoIGludGVyZmFjZXMuCi0gICAgICAgICAgTGlrZXdpc2UsIGlmIHRoZSBzYW1lIG1ldGhvZCBpcyBhIG1ldGhvZCBvZiBib3RoIHRoZSByZW1vdGUKLSAgICAgICAgICBidXNpbmVzcyBpbnRlcmZhY2UgYW5kIHRoZSByZW1vdGUgY29tcG9uZW50IGludGVyZmFjZSwgdGhlIHNhbWUKLSAgICAgICAgICBhdHRyaWJ1dGUgYXBwbGllcyB0byB0aGUgbWV0aG9kIGZvciBib3RoIGludGVyZmFjZXMuCi0KLQkgIEZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKQotCSAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUKLQkgIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBob21lCi0JICBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIGFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLQkgIGludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdpdGggYWxsIHRocmVlIFN0eWxlcwotCSAgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotCSAgbWV0aG9kIGVsZW1lbnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUKLQkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlCi0gICAgICAgICAgYW5kIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlLgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLQkgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtaW50ZiIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZC1pbnRmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW1zIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im11bHRpcGxpY2l0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtdWx0aXBsaWNpdHlUeXBlIGRlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZQotCXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbi4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBPbmUKLQkgICAgTWFueQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPbmUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW55Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2QtcGFyYW1zVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwZXJzaXN0ZW5jZS10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZQotCW1hbmFnZW1lbnQgdHlwZS4KLQotCVRoZSBwZXJzaXN0ZW5jZS10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgQmVhbgotCSAgICBDb250YWluZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHF1ZXJ5LW1ldGhvZCBzcGVjaWZpZXMgdGhlIG1ldGhvZCBmb3IgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JICBxdWVyeS4KLQotCSAgVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgZmluZGVyIG9yIHNlbGVjdAotCSAgbWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0JICBFYWNoIG1ldGhvZC1wYXJhbSBtdXN0IGJlIGRlZmluZWQgZm9yIGEgcXVlcnktbWV0aG9kIHVzaW5nIHRoZQotCSAgbWV0aG9kLXBhcmFtcyBlbGVtZW50LgotCi0JICBJdCBpcyB1c2VkIGJ5IHRoZSBxdWVyeS1tZXRob2QgZWxlbWVudC4KLQotCSAgRXhhbXBsZToKLQotCSAgPHF1ZXJ5PgotCSAgICAgIDxkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzPC9kZXNjcmlwdGlvbj4KLQkgICAgICA8cXVlcnktbWV0aG9kPgotCQkgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8L21ldGhvZC1uYW1lPgotCQkgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLQkgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLQkgICAgICA8ZWpiLXFsPgotCQlTRUxFQ1QgT0JKRUNUKG8pIEZST00gT3JkZXIgbwotCQkgIFdIRVJFIG8uYW1vdW50ICZndDsgMTAwMAotCSAgICAgIDwvZWpiLXFsPgotCSAgPC9xdWVyeT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZC1wYXJhbXNUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcXVlcnlUeXBlIGRlZmluZXMgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JcXVlcnkuIEl0IGNvbnRhaW5zCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0JICAgIC0gdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QKLQkgICAgICBtZXRob2QgaXQgaXMgdXNlZCBieQotCQktIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHJlc3VsdCB0eXBlCi0JCSAgbWFwcGluZywgaWYgdGhlIHF1ZXJ5IGlzIGZvciBhIHNlbGVjdCBtZXRob2QKLQkJICBhbmQgZW50aXR5IG9iamVjdHMgYXJlIHJldHVybmVkLgotCQktIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuCi0KLQlRdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTCBtdXN0IHVzZSB0aGUgZWpiLXFsCi0JZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeSBpcyBub3QgZXhwcmVzc2libGUKLQlpbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvCi0JZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudAotCXNob3VsZCBiZSBlbXB0eS4KLQotCVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIEl0IGNhbiBvbmx5Ci0JYmUgcHJlc2VudCBpZiB0aGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyBhIHNlbGVjdCBtZXRob2QKLQl0aGF0IHJldHVybnMgZW50aXR5IG9iamVjdHMuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi0JcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzICJMb2NhbCIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LW1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOnF1ZXJ5LW1ldGhvZFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXN1bHQtdHlwZS1tYXBwaW5nIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1xbCIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSBkZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYQotCXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLQlyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGlzIHVzZWQgYnkKLQlyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudHMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4KLQllbnRpdHkgYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZWxhdGlvbnNoaXBzVHlwZSBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcHMgaW4KLQl3aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZQotCXBhcnRpY2lwYXRlLiBUaGUgcmVsYXRpb25zaGlwc1R5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwKLQlkZXNjcmlwdGlvbjsgYW5kIGEgbGlzdCBvZiBlamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoCi0Jc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWxhdGlvblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InJvbGUtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZWxhdGlvbnNoaXAgcm9sZS4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgYSByZWxhdGlvbnNoaXAsIGJ1dCBjYW4gYmUgcmV1c2VkIGluIGRpZmZlcmVudAotCSAgICAgIHJlbGF0aW9uc2hpcHMuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yCi0JICAgICAgIHhwYXRoPSIuLy9qYXZhZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiLz4KLQkgIDx4c2Q6ZmllbGQKLQkgICAgICAgeHBhdGg9Ii4iLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbW92ZS1tZXRob2RUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlYW4tbWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldGFpbi1pZi1leGNlcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvCi0Jc3BlY2lmeSB3aGV0aGVyIGFuIGFic3RyYWN0IHNjaGVtYSB0eXBlIHJldHVybmVkIGJ5IGEgcXVlcnkKLQlmb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvcgotCUVKQk9iamVjdCB0eXBlLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgTG9jYWwKLQkgICAgUmVtb3RlCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxvY2FsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktaWRlbnRpdHlUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncwotCXNlY3VyaXR5IGlkZW50aXR5IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlCi0JbWV0aG9kcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuIG9yIHdoZXRoZXIgYSBzcGVjaWZpYyBydW4tYXMKLQlpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCWFuZCBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5IHRvIGJlIHVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2UtY2FsbGVyLWlkZW50aXR5IgotCQkgICAgIHR5cGU9ImphdmFlZTplbXB0eVR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0Ci0JICAgICAgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGJlIHVzZWQgYXMgdGhlCi0JICAgICAgc2VjdXJpdHkgaWRlbnRpdHkgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlCi0JICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJydW4tYXMiCi0JCSAgICAgdHlwZT0iamF2YWVlOnJ1bi1hc1R5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2Vzc2lvbi1iZWFuVHlwZSBkZWNsYXJlcyBhbiBzZXNzaW9uIGJlYW4uIFRoZQotCWRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0JICAgICAgaWNvbiBmaWxlIG5hbWUKLQkgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotCSAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCi0gICAgICAgICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCi0gICAgICAgICAgICAgIGpuZGktbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGhvbWUvYnVzaW5lc3MgaW50ZXJmYWNlLgotICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZCBieSBhbGwKLSAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zLiBBbnkgdXNlIG9mIHRoaXMgZWxlbWVudCBpcyBub24tcG9ydGFibGUuCi0gICAgICAgICAgICAtIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHJlbW90ZSBvciBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2VzLAotICAgICAgICAgICAgICBpZiBhbnkKLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lIGFuZAotCSAgICAgIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kCi0JICAgICAgbG9jYWwgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIG5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHdlYiBzZXJ2aWNlIGVuZHBvaW50Ci0JICAgICAgaW50ZXJmYWNlLCBpZiBhbnkKLQkgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB0aW1lb3V0IG1ldGhvZC4KLQkgICAgLSB0aGUgb3B0aW9uYWwgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotICAgICAgICAgICAgICBJZiBpdCBpcyBub3QgcHJlc2VudCwgaXQgaXMgZGVmYXVsdGVkIHRvIENvbnRhaW5lci4KLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgc2Vzc2lvbiBiZWFuIGNsYXNzIGFuZC9vcgotICAgICAgICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC1pbnZva2UgbWV0aG9kcy4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgZW52aXJvbm1lbnQgZW50cmllcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsCi0JICAgICAgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYgotCSAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eQotCSAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotCSAgICAgIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0JICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0KLQlUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlCi0JdGhhdCB0aGV5IGFyZSBvbWl0dGVkIHdoZW4gaWYgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUKLQllbXB0eS4KLQotCUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAotCXRoZSBob21lIGFuZCB0aGUgcmVtb3RlIGVsZW1lbnRzIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUKLQlzZXNzaW9uIGJlYW4uCi0KLQlUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBpZiB0aGUKLQliZWFuIGlzIGEgc3RhdGVsZXNzIHNlc3Npb24gYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotCQkgICB0eXBlPSJqYXZhZWU6aG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLQkJICAgdHlwZT0iamF2YWVlOnJlbW90ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbC1ob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJ1c2luZXNzLWxvY2FsIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnVzaW5lc3MtcmVtb3RlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludCIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyB3ZWIKLQkgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIFRoZSBzZXJ2aWNlLWVuZHBvaW50Ci0JICAgIGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhIHN0YXRlbGVzcwotCSAgICBzZXNzaW9uIGJlYW4uIFRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG11c3QgYmUgYQotCSAgICB2YWxpZCBKQVgtUlBDIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgIFRoZSBlamItY2xhc3MgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0gICAgICAgICAgICAgb2YgdGhlIGJlYW4gY2xhc3MgZm9yIHRoaXMgZWpiLiAgSXQgaXMgcmVxdWlyZWQgdW5sZXNzCi0gICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21wb25lbnQtZGVmaW5pbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHNhbWUKLSAgICAgICAgICAgICBlamItbmFtZS4KLQotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlc3Npb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZW91dC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1tZXRob2QiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmluaXQtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGluaXQtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtYXBwaW5ncyBmb3IKLQkgICAgRUpCIDIueCBzdHlsZSBjcmVhdGUgbWV0aG9kcyBmb3IgYW4gRUpCIDMuMCBiZWFuLgotCSAgICBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBzdGF0ZWZ1bAotICAgICAgICAgICAgc2Vzc2lvbiBiZWFucy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdmUtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpyZW1vdmUtbWV0aG9kVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlbW92ZS1tZXRob2QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1hcHBpbmdzIGZvcgotCSAgICBFSkIgMi54IHN0eWxlIHJlbW92ZSBtZXRob2RzIGZvciBhbiBFSkIgMy4wIGJlYW4uCi0JICAgIFRoaXMgZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHN0YXRlZnVsCi0gICAgICAgICAgICBzZXNzaW9uIGJlYW5zLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcm91bmQtaW52b2tlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTphcm91bmQtaW52b2tlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1hY3RpdmF0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGFzc2l2YXRlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXNzaW9uLXR5cGVUeXBlIGRlc2NyaWJlcyB3aGV0aGVyIHRoZSBzZXNzaW9uIGJlYW4gaXMgYQotCXN0YXRlZnVsIHNlc3Npb24gb3Igc3RhdGVsZXNzIHNlc3Npb24uIEl0IGlzIHVzZWQgYnkKLQlzZXNzaW9uLXR5cGUgZWxlbWVudHMuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgU3RhdGVmdWwKLQkgICAgU3RhdGVsZXNzCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlZnVsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVsZXNzIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnMtYXR0cmlidXRlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRyYW5zLWF0dHJpYnV0ZVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QKLQltYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kCi0JaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBOb3RTdXBwb3J0ZWQKLQkgICAgU3VwcG9ydHMKLQkgICAgUmVxdWlyZWQKLQkgICAgUmVxdWlyZXNOZXcKLQkgICAgTWFuZGF0b3J5Ci0JICAgIE5ldmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFN1cHBvcnRlZCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRzIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZWQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlc05ldyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNhY3Rpb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFuc2FjdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLQl0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUuCi0KLQlUaGUgdHJhbnNhY3Rpb24tdHlwZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBCZWFuCi0JICAgIENvbnRhaW5lcgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJCZWFuIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfMV80LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV8xXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjIzMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTYwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjEuNCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpajJlZV8xXzQueHNkcwkxLjQzIDAzLzA5LzE2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotPHhzZDphbm5vdGF0aW9uPgotPHhzZDpkb2N1bWVudGF0aW9uPgotCi1UaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KLXNoYXJlYWJsZSBzY2hlbWEocykgb2YgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQotaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgotCi1EZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgajJlZSBhcHBsaWNhdGlvbjsKLSAgICBhcHBsaWNhdGlvbiBjbGllbnQ7Ci0gICAgd2ViIGFwcGxpY2F0aW9uOwotICAgIGVudGVycHJpc2UgYmVhbjsKLSAgICByZXNvdXJjZSBhZGFwdGVyOwotCi1EZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIGVhciBmaWxlOwotICAgIHdhciBmaWxlOwotICAgIGphciBmaWxlOwotICAgIHJhciBmaWxlOwotCi08L3hzZDpkb2N1bWVudGF0aW9uPgotPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLQkgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPQotCSJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Z3JvdXAgbmFtZT0iZGVzY3JpcHRpb25Hcm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBkZXNjcmlwdGlvbiByZWxhdGVkCi0JZWxlbWVudHMgY29uc2lzdGVudCBhY3Jvc3MgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgotCi0JQWxsIGVsZW1lbnRzIG1heSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBsYW5ndWFnZXMsCi0JdG8gc3VwcG9ydCBsb2NhbGl6YXRpb24gb2YgdGhlIGNvbnRlbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLQkJICAgdHlwZT0iajJlZTppY29uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVzY3JpcHRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZGVzY3JpcHRpb24gdHlwZSBpcyB1c2VkIGJ5IGEgZGVzY3JpcHRpb24gZWxlbWVudCB0bwotCXByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBlbGVtZW50cwotCXRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUKLQlEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZSBmaWxlIHByb2R1Y2VyIHdhbnRzCi0JdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLQlEZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlCi0JdG9vbHMgdXNlZCBieSBzdWNoIGEgRGVwbG95bWVudCBGaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheQotCXRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQKLQljb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0KLQlUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLQlkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBpbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZXdleS12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGRlZmluZXMgYSBkZXdleSBkZWNpbWFsIHdoaWNoIGlzIHVzZWQKLQl0byBkZXNjcmliZSB2ZXJzaW9ucyBvZiBkb2N1bWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRlY2ltYWwiPgotICAgICAgPHhzZDp3aGl0ZVNwYWNlIHZhbHVlPSJjb2xsYXBzZSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc3BsYXktbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGRpc3BsYXktbmFtZSB0eXBlIGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkCi0JICB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuIEl0IGlzIHVzZWQgYnkgZGlzcGxheS1uYW1lCi0JICBlbGVtZW50cy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgotCi0JICBFeGFtcGxlOgotCi0JICAuLi4KLQkgICAgIDxkaXNwbGF5LW5hbWUgeG1sOmxhbmc9ImVuIj5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLQotCSAgVGhlIHZhbHVlIG9mIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgaXMgImVuIiAoRW5nbGlzaCkgYnkgZGVmYXVsdC4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItbGlua1R5cGUgaXMgdXNlZCBieSBlamItbGluawotCSAgZWxlbWVudHMgaW4gdGhlIGVqYi1yZWYgb3IgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyB0byBzcGVjaWZ5Ci0JICB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGVudGVycHJpc2UgYmVhbi4KLQotCSAgVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuCi0JICBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlIG9yIGluIGFub3RoZXIgZWpiLWphcgotCSAgZmlsZSBpbiB0aGUgc2FtZSBKMkVFIGFwcGxpY2F0aW9uIHVuaXQuCi0KLQkgIEFsdGVybmF0aXZlbHksIHRoZSBuYW1lIGluIHRoZSBlamItbGluayBlbGVtZW50IG1heSBiZQotCSAgY29tcG9zZWQgb2YgYSBwYXRoIG5hbWUgc3BlY2lmeWluZyB0aGUgZWpiLWphciBjb250YWluaW5nIHRoZQotCSAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4gd2l0aCB0aGUgZWpiLW5hbWUgb2YgdGhlIHRhcmdldAotCSAgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGggbmFtZSBieSAiIyIuICBUaGUKLQkgIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKLQkgIGJlYW4uICBUaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUKLQkgIGVqYi1uYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLQkgIEV4YW1wbGVzOgotCi0JICAgICAgPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotCSAgICAgIDxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbG9jYWwtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IKLQl0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwKLQlob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudAotCSAgICAgIENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbgotCSAgICAtIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCSAgICAtIHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZQotCSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLQkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItcmVmLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi10eXBlIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWYtdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsLWhvbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwiCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWxUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLWxpbmtUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi0JICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmpuZGktbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1yZWYtdHlwZVR5cGUgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCi0JcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0KLQlUaGUgZWpiLXJlZi10eXBlIGRlc2lnbmF0ZXMgYSB2YWx1ZQotCXRoYXQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCSAgICBFbnRpdHkKLQkgICAgU2Vzc2lvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vzc2lvbiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLXJlZlR5cGUgaXMgdXNlZCBieSBlamItcmVmIGVsZW1lbnRzIGZvciB0aGUKLQlkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lLiBUaGUKLQlkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0JICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZQotCSAgICAgIGJlYW4KLQkgICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQkgICAgLSB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgICAgICBlbnRlcnByaXNlIGJlYW4KLQkgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotCSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLXJlZi10eXBlVHlwZSIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLQkJICAgdHlwZT0iajJlZTpob21lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLQkJICAgdHlwZT0iajJlZTpyZW1vdGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLWxpbmtUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBpcyB1c2VkIHRvIGRlc2lnbmF0ZSBhbiBlbXB0eQotCWVsZW1lbnQgd2hlbiB1c2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGlzIHR5cGUgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZQotCSAgYXBwbGljYXRpb24ncyBjb2RlLgotCi0JICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGU6Ci0KLQkgICAgICBqYXZhLmxhbmcuQm9vbGVhbgotCSAgICAgIGphdmEubGFuZy5CeXRlCi0JICAgICAgamF2YS5sYW5nLkNoYXJhY3RlcgotCSAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgICAgICBqYXZhLmxhbmcuU2hvcnQKLQkgICAgICBqYXZhLmxhbmcuSW50ZWdlcgotCSAgICAgIGphdmEubGFuZy5Mb25nCi0JICAgICAgamF2YS5sYW5nLkZsb2F0Ci0JICAgICAgamF2YS5sYW5nLkRvdWJsZQotCi0JICBFeGFtcGxlOgotCi0JICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQm9vbGVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5CeXRlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkNoYXJhY3RlciIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuSW50ZWdlciIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Mb25nIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzCi0JZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotCWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbgotCW9wdGlvbmFsIHZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZQotCXN1cHBsaWVkIGR1cmluZyBkZXBsb3ltZW50LgotCi0JSXQgaXMgdXNlZCBieSBlbnYtZW50cnkgZWxlbWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotCSAgICAgIGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYQotCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LiBUaGUgdW5pcXVlbmVzcwotCSAgICAgIGNvbnN0cmFpbnRzIG11c3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGRlY2xhcmVkCi0JICAgICAgY29udGV4dC4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS10eXBlIgotCQkgICB0eXBlPSJqMmVlOmVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS12YWx1ZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUKLQkgICAgICBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQotCSAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEKLQkgICAgICBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsCi0JICAgICAgYSBzaW5nbGUgY2hhcmFjdGVyLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSB0aGUgbmFtZSBvZiBhCi0JSmF2YSBjbGFzcyBvciBpbnRlcmZhY2UuICBUaGUgbmFtZSBpcyBpbiB0aGUgZm9ybSBvZiBhCi0JImJpbmFyeSBuYW1lIiwgYXMgZGVmaW5lZCBpbiB0aGUgSkxTLiAgVGhpcyBpcyB0aGUgZm9ybQotCW9mIG5hbWUgdXNlZCBpbiBDbGFzcy5mb3JOYW1lKCkuICBUb29scyB0aGF0IG5lZWQgdGhlCi0JY2Fub25pY2FsIG5hbWUgKHRoZSBuYW1lIHVzZWQgaW4gc291cmNlIGNvZGUpIHdpbGwgbmVlZAotCXRvIGNvbnZlcnQgdGhpcyBiaW5hcnkgbmFtZSB0byB0aGUgY2Fub25pY2FsIG5hbWUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyaWMtYm9vbGVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIGZvdXIgZGlmZmVyZW50IHZhbHVlcyB3aGljaCBjYW4gZGVzaWduYXRlCi0JYm9vbGVhbiB2YWx1ZXMuIFRoaXMgaW5jbHVkZXMgdmFsdWVzIHllcyBhbmQgbm8gd2hpY2ggYXJlCi0Jbm90IGRlc2lnbmF0ZWQgYnkgeHNkOmJvb2xlYW4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRydWUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmYWxzZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InllcyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaG9tZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mCi0JICBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lIGludGVyZmFjZS4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpY29uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzCi0JdGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yCi0JSlBFRyBpY29uIGltYWdlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYQotCUdVSSB0b29sLgotCi0JVGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotCWljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKQotCWJ5IGRlZmF1bHQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic21hbGwtaWNvbiIgdHlwZT0iajJlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLQkgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi0JICAgICAgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50Ci0JICAgICAgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlLgotCi0JICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLQkgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkgICAgICA8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGFyZ2UtaWNvbiIgdHlwZT0iajJlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLQkgICAgICBjb250YWluaW5nIGEgbGFyZ2UKLQkgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlCi0JICAgICAgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudAotCSAgICAgIEZpbGUuCi0KLQkgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotCSAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGphdmEtaWRlbnRpZmllclR5cGUgZGVmaW5lcyBhIEphdmEgaWRlbnRpZmllci4KLQlUaGUgdXNlcnMgb2YgdGhpcyB0eXBlIHNob3VsZCBmdXJ0aGVyIHZlcmlmeSB0aGF0Ci0JdGhlIGNvbnRlbnQgZG9lcyBub3QgY29udGFpbiBKYXZhIHJlc2VydmVkIGtleXdvcmRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSIoJHxffFxwe0x9KShccHtMfXxccHtOZH18X3wkKSoiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGlzIGEgZ2VuZXJpYyB0eXBlIHRoYXQgZGVzaWduYXRlcyBhIEphdmEgcHJpbWl0aXZlCi0JdHlwZSBvciBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBpbnRlcmZhY2UvdHlwZSwKLQlvciBhbiBhcnJheSBvZiBzdWNoIHR5cGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXlxwe1p9XSoiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgam5kaS1uYW1lVHlwZSB0eXBlIGRlc2lnbmF0ZXMgYSBKTkRJIG5hbWUgaW4gdGhlCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JamF2YTpjb21wL2VudiBjb250ZXh0LiAgQSBKTkRJIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCURlcGxveW1lbnQgQ29tcG9uZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgSk5ESSBlbnZpcm9ubWVudAotCXJlZmVyZW5jZSBlbGVtZW50cyBjb25zaXN0ZW50IGFjcm9zcyBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeSIKLQkJICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLQkJICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLWxvY2FsLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOnNlcnZpY2UtcmVmR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6cmVzb3VyY2UtZW52LXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imxpc3RlbmVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxpc3RlbmVyVHlwZSBpbmRpY2F0ZXMgdGhlIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIKLQlhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZQotCSAgICBhcHBsaWNhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIKLQkgICAgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4gVGhlIHZhbHVlIGlzIHRoZSBmdWxseQotCSAgICBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBsaXN0ZW5lciBjbGFzcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbC1ob21lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsLWhvbWVUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZAotCW5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZSBpbnRlcmZhY2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbFR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLQllbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSBpcyB1c2VkIHRvIGxpbmsgYSBtZXNzYWdlCi0JZGVzdGluYXRpb24gcmVmZXJlbmNlIG9yIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdG8gYSBtZXNzYWdlCi0JZGVzdGluYXRpb24uCi0KLQlUaGUgQXNzZW1ibGVyIHNldHMgdGhlIHZhbHVlIHRvIHJlZmxlY3QgdGhlIGZsb3cgb2YgbWVzc2FnZXMKLQliZXR3ZWVuIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIGluIHRoZSBhcHBsaWNhdGlvbi4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgYSBtZXNzYWdlCi0JZGVzdGluYXRpb24gaW4gdGhlIHNhbWUgRGVwbG95bWVudCBGaWxlIG9yIGluIGFub3RoZXIKLQlEZXBsb3ltZW50IEZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi0JQWx0ZXJuYXRpdmVseSwgdGhlIHZhbHVlIG1heSBiZSBjb21wb3NlZCBvZiBhIHBhdGggbmFtZQotCXNwZWNpZnlpbmcgYSBEZXBsb3ltZW50IEZpbGUgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZAotCW1lc3NhZ2UgZGVzdGluYXRpb24gd2l0aCB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIHRoZQotCWRlc3RpbmF0aW9uIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aCBuYW1lIGJ5Ci0JIiMiLiBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBEZXBsb3ltZW50IEZpbGUKLQljb250YWluaW5nIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlCi0JbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgYWxsb3dzIG11bHRpcGxlIG1lc3NhZ2UKLQlkZXN0aW5hdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0JICBvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgZGVzdGluYXRpb24KLQkgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLQkgIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLQotCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkJICAtIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lCi0JCSAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlCi0JCSAgLSBhIHNwZWNpZmljYXRpb24gYXMgdG8gd2hldGhlciB0aGUKLQkJICAgIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yCi0JCSAgICBjb25zdW1pbmcgb3IgcHJvZHVjaW5nIG1lc3NhZ2VzLCBvciBib3RoCi0JCSAgLSBhIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24KLQotCSAgRXhhbXBsZXM6Ci0KLQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPkNvbnN1bWVzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Q29ycG9yYXRlU3RvY2tzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Ci0JICA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICAgIHRoZSBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cwotCSAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlCi0JICAgIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLWphciAoZm9yIGVudGVycHJpc2UgYmVhbnMpIG9yIGEKLQkgICAgRGVwbG95bWVudCBGaWxlIChmb3Igb3RoZXJzKS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHlwZSBvZgotCSAgdGhlIGRlc3RpbmF0aW9uLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlCi0JICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVzdGluYXRpb24uCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUKLQkgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlCi0JbWVzc2FnZSBkZXN0aW5hdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS4gIFRoZSB2YWx1ZQotCWluZGljYXRlcyB3aGV0aGVyIG1lc3NhZ2VzIGFyZSBjb25zdW1lZCBmcm9tIHRoZSBtZXNzYWdlCi0JZGVzdGluYXRpb24sIHByb2R1Y2VkIGZvciB0aGUgZGVzdGluYXRpb24sIG9yIGJvdGguICBUaGUKLQlBc3NlbWJsZXIgbWFrZXMgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24gaW4gbGlua2luZyBwcm9kdWNlcnMKLQlvZiBhIGRlc3RpbmF0aW9uIHdpdGggaXRzIGNvbnN1bWVycy4KLQotCVRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSBlbGVtZW50IG11c3QgYmUKLQlvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkgICAgQ29uc3VtZXMKLQkgICAgUHJvZHVjZXMKLQkgICAgQ29uc3VtZXNQcm9kdWNlcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlcyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzUHJvZHVjZXMiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgc3BlY2lmaWVzIGEgbWVzc2FnZQotCSAgZGVzdGluYXRpb24uIFRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIGRlc2NyaWJlZCBieSB0aGlzCi0JICBlbGVtZW50IGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGRlc3RpbmF0aW9uIGJ5IHRoZSBEZXBsb3llci4KLQotCSAgVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gZWxlbWVudCBjb250YWluczoKLQotCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkJICAtIGFuIG9wdGlvbmFsIGRpc3BsYXktbmFtZQotCQkgIC0gYW4gb3B0aW9uYWwgaWNvbgotCQkgIC0gYSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgd2hpY2ggbXVzdCBiZSB1bmlxdWUKLQkJICAgIGFtb25nIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZXMgd2l0aGluIHRoZSBzYW1lCi0JCSAgICBEZXBsb3ltZW50IEZpbGUuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Ci0JICA8L21lc3NhZ2UtZGVzdGluYXRpb24+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYQotCSAgICBuYW1lIGZvciBhIG1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIG5hbWUgbXVzdCBiZQotCSAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIG1lc3NhZ2UgZGVzdGluYXRpb25zCi0JICAgIHdpdGhpbiB0aGUgRGVwbG95bWVudCBGaWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtLXZhbHVlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGlzIGEgZ2VuZXJhbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZQotCXBhcmFtZXRlci92YWx1ZSBsaXN0cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICBwYXJhbWV0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS12YWx1ZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhdGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBlaXRoZXIgYSByZWxhdGl2ZQotCXBhdGggb3IgYW4gYWJzb2x1dGUgcGF0aCBzdGFydGluZyB3aXRoIGEgIi8iLgotCi0JSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIERlcGxveW1lbnQgRmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLAotCXRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YKLQl0aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMKLQlhcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbW90ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZQotCSAgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzLWF1dGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVzLWF1dGhUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudAotCWNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3IKLQl3aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0Jb24gYmVoYWxmIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudC4gSW4gdGhlIGxhdHRlciBjYXNlLAotCXRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotCURlcGxveWVyLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIEFwcGxpY2F0aW9uCi0JICAgIENvbnRhaW5lcgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXMtc2hhcmluZy1zY29wZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXMtc2hhcmluZy1zY29wZSB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zCi0Jb2J0YWluZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCi0JZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlIHNoYXJlZC4gVGhlIHZhbHVlLCBpZiBzcGVjaWZpZWQsCi0JbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgU2hhcmVhYmxlCi0JICAgIFVuc2hhcmVhYmxlCi0KLQlUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWFibGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNoYXJlYWJsZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLWVudi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZQotCSAgcmVzb3VyY2UtZW52LXR5cGUgZWxlbWVudHMuICBJdCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QKLQkgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLQkgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gaW5kaWNhdGlvbiBvZgotCSAgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQotCSAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4KLQotCSAgRXhhbXBsZToKLQotCSAgPHJlc291cmNlLWVudi1yZWY+Ci0JICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotCSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotCSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlCi0JICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0JICA8L3Jlc291cmNlLWVudi1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdAotCSAgICBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUKLQkgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUKLQkgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yCi0JICAgIGludGVyZmFjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHJlc291cmNlLXJlZlR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQKLQkgIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCSAgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLCB0aGUgaW5kaWNhdGlvbiBvZiB0aGUKLQkgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbgotCSAgKEFwcGxpY2F0aW9uIG9yIENvbnRhaW5lciksIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mCi0JICB0aGUgc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlCi0JICAoU2hhcmVhYmxlIG9yIFVuc2hhcmVhYmxlKS4KLQotCSAgRXhhbXBsZToKLQotCSAgPHJlc291cmNlLXJlZj4KLQkgICAgICA8cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotCSAgICAgIDxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+Ci0JICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0JICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0JICA8L3Jlc291cmNlLXJlZj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1yZWYtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4KLQkgICAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBGaWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YQotCSAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkCi0JICAgIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCi0JICAgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1hdXRoIgotCQkgICB0eXBlPSJqMmVlOnJlcy1hdXRoVHlwZSIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXNoYXJpbmctc2NvcGUiCi0JCSAgIHR5cGU9ImoyZWU6cmVzLXNoYXJpbmctc2NvcGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyb2xlLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcm9sZS1uYW1lVHlwZSBkZXNpZ25hdGVzIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQotCVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYSB0b2tlbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJydW4tYXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcnVuLWFzVHlwZSBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZQotCXVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgYSBjb21wb25lbnQuIEl0IGNvbnRhaW5zIGFuCi0Jb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZWN1cml0eS1yb2xlLXJlZlR5cGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEKLQlzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBpbiBhIGNvbXBvbmVudCdzIG9yIGEKLQlEZXBsb3ltZW50IENvbXBvbmVudCdzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbgotCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlCi0JY29kZSwgYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUKLQlzZWN1cml0eSByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbgotCWFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkCi0JICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlCi0JICAgIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2Qgb3IgdGhlCi0JICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbGluayIKLQkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkCi0JICAgIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4KLQkgICAgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZQotCSAgICBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBzZWN1cml0eS1yb2xlVHlwZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5Ci0JICByb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUKLQkgIHNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotCi0JICBFeGFtcGxlOgotCi0JICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0JICAgICAgPGRlc2NyaXB0aW9uPgotCQkgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAotCQkgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KLQkgICAgICA8L2Rlc2NyaXB0aW9uPgotCSAgICAgIDxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLQkgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyBhIHNwZWNpYWwgc3RyaW5nIGRhdGF0eXBlIHRoYXQgaXMgZGVmaW5lZCBieSBKMkVFIGFzCi0JYSBiYXNlIHR5cGUgZm9yIGRlZmluaW5nIGNvbGxhcHNlZCBzdHJpbmdzLiBXaGVuIHNjaGVtYXMKLQlyZXF1aXJlIHRyYWlsaW5nL2xlYWRpbmcgc3BhY2UgZWxpbWluYXRpb24gYXMgd2VsbCBhcwotCWNvbGxhcHNpbmcgdGhlIGV4aXN0aW5nIHdoaXRlc3BhY2UsIHRoaXMgYmFzZSB0eXBlIG1heSBiZQotCXVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJ1ZS1mYWxzZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgc2ltcGxlIHR5cGUgZGVzaWduYXRlcyBhIGJvb2xlYW4gd2l0aCBvbmx5IHR3bwotCXBlcm1pc3NpYmxlIHZhbHVlcwotCi0JLSB0cnVlCi0JLSBmYWxzZQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZEJvb2xlYW5UeXBlIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9Iih0cnVlfGZhbHNlKSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVybC1wYXR0ZXJuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHVybC1wYXR0ZXJuVHlwZSBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuCi0JSXQgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDExLjIgb2YgdGhlCi0JU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4gVGhpcyBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gYmUgaW4KLQlVUkwtZGVjb2RlZCBmb3JtIGFuZCBtdXN0IG5vdCBjb250YWluIENSKCN4RCkgb3IgTEYoI3hBKS4KLQlJZiBpdCBjb250YWlucyB0aG9zZSBjaGFyYWN0ZXJzLCB0aGUgY29udGFpbmVyIG11c3QgaW5mb3JtCi0JdGhlIGRldmVsb3BlciB3aXRoIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZS4KLQlUaGUgY29udGFpbmVyIG11c3QgcHJlc2VydmUgYWxsIGNoYXJhY3RlcnMgaW5jbHVkaW5nIHdoaXRlc3BhY2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RBbnlVUklUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6YW55VVJJLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmFueVVSSSI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RCb29sZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmJvb2xlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6Ym9vbGVhbiI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmludGVnZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6aW50ZWdlciI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2ROTVRPS0VOVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOk5NVE9LRU4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6Tk1UT0tFTiI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2ROb25OZWdhdGl2ZUludGVnZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RQb3NpdGl2ZUludGVnZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6cG9zaXRpdmVJbnRlZ2VyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnBvc2l0aXZlSW50ZWdlciI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RRTmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpRTmFtZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpRTmFtZSI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4c2RTdHJpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6c3RyaW5nLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjE5MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4ODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuMSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkcwkxLjExIDA5LzAzLzAzCi0KLSAgICAgIEJhc2VkIG9uIGoyZWVfamF4cnBjX21hcHBpbmdfMV8wLmR0ZCwgTGFzdCB1cGRhdGVkOiAwOS8xOS8yMDAyIDEwOjI2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIEphdmEgbWFwcGluZyB0byBhIGtub3duIFdTREwgZG9jdW1lbnQuCi0KLQlJdCBjb250YWlucyB0aGUgbWFwcGluZyBiZXR3ZWVuIHBhY2thZ2UgbmFtZXMgYW5kIFhNTCBuYW1lc3BhY2VzLAotCVdTREwgcm9vdCB0eXBlcyBhbmQgSmF2YSBhcnRpZmFjdHMsIGFuZCB0aGUgc2V0IG9mIG1hcHBpbmdzIGZvcgotCXNlcnZpY2VzLgotCi0JQWxsIGphdmEtd3NkbC1tYXBwaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZSB0aGUKLQlzY2hlbWEgYnkgdXNpbmcgdGhlIEoyRUUgbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi0JYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUKLQl2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPGphdmEtd3NkbC1tYXBwaW5nIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0JCWh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIgotCSAgICAgIHZlcnNpb249IjEuMSI+Ci0JICAgICAgLi4uCi0JICAgIDwvamF2YS13c2RsLW1hcHBpbmc+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YS13c2RsLW1hcHBpbmciIHR5cGU9ImoyZWU6amF2YS13c2RsLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGlzIHRoZSByb290IG9mIHRoZSBqYXZhLXdzZGwtbWFwcGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6ZWxlbWVudD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlciBlbGVtZW50IGRlZmluZXMgdGhlIG9yZGVyCi0JdGhhdCBjb21wbGV4VHlwZSBlbGVtZW50IHZhbHVlcyBhcmUgYXBwbGllZCB0byBhIEphdmEKLQlleGNlcHRpb24gY29uc3RydWN0b3IuIEVsZW1lbnQgbmFtZXMgYXJlIHNwZWNpZmllZCBmb3IgZWFjaAotCXBhcmFtZXRlciBvZiB0aGUgY29uc3RydWN0b3IsIGluY2x1ZGluZyBlbGVtZW50IG5hbWVzIG9mCi0JaW5oZXJpdGVkIHR5cGVzIGlmIG5lY2Vzc2FyeS4KLQotCVVzZWQgaW46IGV4Y2VwdGlvbi1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsZW1lbnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIGNvbXBsZXhUeXBlCi0JICAgIGVsZW1lbnQgbmFtZSBhdHRyaWJ1dGUgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhjZXB0aW9uLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXhjZXB0aW9uLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhlCi0Jc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb24gdHlwZXMgYW5kIHdzZGwgZmF1bHRzIGFuZAotCVNPQVAgaGVhZGVyZmF1bHRzLgotCi0JVGhpcyBlbGVtZW50IHNob3VsZCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlCi0JbWFwcGluZyBiZXR3ZWVuIGEgbWV0aG9kIGFuZCBhbiBvcGVyYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhlCi0JbWFwcGluZyBjb250ZXh0LgotCi0JVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tdHlwZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGV4Y2VwdGlvbi10eXBlIGVsZW1lbnQgZGVmaW5lcyBKYXZhIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbi4KLQkgICAgSXQgbWF5IGJlIGEgc2VydmljZSBzcGVjaWZpYyBleGNlcHRpb24uCi0KLQkgICAgSXQgbXVzdCBiZSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1tZXNzYWdlLXBhcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2UtcGFydC1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgZWxlbWVudCBpcyByZXF1aXJlZCBvbmx5Ci0gICAgICAgICAgICB3aGVuIHRoZSBtZXNzYWdlIHJlZmVyZW5jZWQgYnkgdGhlIHdzZGwtbWVzc2FnZSBlbGVtZW50Ci0gICAgICAgICAgICBoYXMgbW9yZSB0aGFuIG9uZSBwYXJ0LgotCi0gICAgICAgICAgICBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gbXVsdGlwbGUgaGVhZGVyZmF1bHRzIHVzZSB0aGUKLSAgICAgICAgICAgIHNhbWUgbWVzc2FnZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIiCi0JCSAgIHR5cGU9ImoyZWU6Y29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLXdzZGwtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgSmF2YSBtYXBwaW5nIHRvIGEga25vd24gV1NETCBkb2N1bWVudC4KLQotCUl0IGNvbnRhaW5zIHRoZSBtYXBwaW5nIGJldHdlZW4gcGFja2FnZSBuYW1lcyBhbmQgWE1MIG5hbWVzcGFjZXMsCi0JV1NETCByb290IHR5cGVzIGFuZCBKYXZhIGFydGlmYWN0cywgYW5kIHRoZSBzZXQgb2YgbWFwcGluZ3MgZm9yCi0Jc2VydmljZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpwYWNrYWdlLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YS14bWwtdHlwZS1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOmphdmEteG1sLXR5cGUtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpleGNlcHRpb24tbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIgotCQkgICAgIHR5cGU9ImoyZWU6c2VydmljZS1pbnRlcmZhY2UtbWFwcGluZ1R5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmciCi0JCSAgICAgdHlwZT0iajJlZTpzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIxLjEiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjEuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS14bWwtdHlwZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGphdmEteG1sLXR5cGUtbWFwcGluZyBlbGVtZW50IGNvbnRhaW5zIGEgamF2YS10eXBlIHRoYXQgaXMgdGhlCi0JZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MsIHByaW1pdGl2ZSB0eXBlLCBvciBhcnJheQotCXR5cGUsIFFOYW1lIG9mIHRoZSBYTUwgcm9vdCB0eXBlIG9yIGFub255bW91cyB0eXBlLCB0aGUgV1NETCB0eXBlCi0Jc2NvcGUgdGhlIFFOYW1lIGFwcGxpZXMgdG8gYW5kIHRoZSBzZXQgb2YgdmFyaWFibGUgbWFwcGluZ3MgZm9yCi0JZWFjaCBwdWJsaWMgdmFyaWFibGUgd2l0aGluIHRoZSBKYXZhIGNsYXNzLgotCi0JVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YS10eXBlIgotCQkgICB0eXBlPSJqMmVlOmphdmEtdHlwZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF2YS10eXBlIGVsZW1lbnQgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mCi0JICAgIGEgSmF2YSBjbGFzcywgcHJpbWl0aXZlLCBvciBhcnJheSB0eXBlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPGNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QtdHlwZS1xbmFtZSIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcm9vdC10eXBlLXFuYW1lIGlkZW50aWZpZXMgdGhlIFdTREwgUU5hbWUgb2YgYW4gWE1MIHR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbm9ueW1vdXMtdHlwZS1xbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgYW5vbnltb3VzLXR5cGUtcW5hbWUgaWRlbnRpZmllcyB0aGUgV1NETCBRTmFtZSBvZiBhbgotCSAgICAgIGFub255bW91cyBYTUwgdHlwZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwvY2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InFuYW1lLXNjb3BlIgotCQkgICB0eXBlPSJqMmVlOnFuYW1lLXNjb3BlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6dmFyaWFibGUtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBhCi0JSmF2YSBtZXRob2QgcGFyYW1ldGVycyBhbmQgYSB3c2RsLW1lc3NhZ2UuCi0KLQlVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLXBvc2l0aW9uIgotCQkgICB0eXBlPSJqMmVlOnhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGFyYW0tcG9zaXRpb24gZWxlbWVudCBkZWZpbmVzIHRoZSBwb3NpdGlvbiBvZiBhCi0JICAgIHBhcmFtZXRlciB3aXRoaW4gYSBKYXZhIG1ldGhvZC4gIEl0IG11c3QgYmUgYW4gaW50ZWdlcgotCSAgICBzdGFydGluZyBmcm9tIDAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tdHlwZSIKLQkJICAgdHlwZT0iajJlZTpqYXZhLXR5cGVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBhcmFtLXR5cGUgZWxlbWVudCBkZWZpbmVzIHRoZSBmdWxseSBxdWFsaWZpZWQKLQkgICAgY2xhc3MgbmFtZSBvZiBhIEphdmEgY2xhc3MsIHByaW1pdGl2ZSwgb3IgYXJyYXkgdHlwZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLW1lc3NhZ2UtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2UtbWFwcGluZ1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYWNrYWdlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcGFja2FnZS1tYXBwaW5nIGluZGljYXRlcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGphdmEtcGFja2FnZS1uYW1lCi0JYW5kIFhNTCBuYW1lc3BhY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQuCi0KLQlVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwYWNrYWdlLXR5cGUgaW5kaWNhdGVzIHRoZSBKYXZhIHBhY2thZ2UgbmFtZS4gSXQgbXVzdCBiZSBhIGZ1bGx5Ci0JICAgIHF1YWxpZmllZCBwYWNrYWdlIG5hbWUsIGV2ZW4gdGhvdWdoIHRoZSBYTUwgc2NoZW1hIHR5cGUgaXMKLQkgICAgZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2VVUkkiCi0JCSAgIHR5cGU9ImoyZWU6eHNkQW55VVJJVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBuYW1lc3BhY2VVUkkgZWxlbWVudCBpbmRpY2F0ZXMgYSBVUkkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW1ldGVyLW1vZGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcGFyYW1ldGVyLW1vZGUgZWxlbWVudCBkZWZpbmVzIHRoZSBtb2RlIG9mIHRoZSBwYXJhbWV0ZXIuCi0JSXQgY2FuIGhhdmUgb25seSB0aHJlZSB2YWx1ZXMsIElOLCBPVVQsIElOT1VULgotCi0JVXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOT1VUIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBvcnQtbWFwcGluZyBkZWZpbmVzIHRoZSBtYXBwaW5nIG9mIHRoZSBXU0RMIHBvcnQgbmFtZSBhdHRyaWJ1dGUKLQl0byB0aGUgSmF2YSBuYW1lIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZQotCW1ldGhvZCBnZXR7amF2YS1uYW1lfS4KLQotCVVzZWQgaW46IHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwb3J0LW1hcHBpbmcgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiB0aGUgV1NETCBwb3J0IG5hbWUKLQkgICAgYXR0cmlidXRlIHRvIHRoZSBKYXZhIG5hbWUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgR2VuZXJhdGVkCi0JICAgIFNlcnZpY2UgSW50ZXJmYWNlIG1ldGhvZCBnZXR7amF2YS1uYW1lfS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqYXZhLXBvcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF2YS1wb3J0LW5hbWUgZWxlbWVudCBpcyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgcG9ydAotCSAgICBuYW1lIGluIEphdmEuICBJdCBpcyB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIEdlbmVyYXRlZAotCSAgICBTZXJ2aWNlIEludGVyZmFjZSBtZXRob2QgZ2V0e2phdmEtcG9ydC1uYW1lfS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxbmFtZS1zY29wZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBxbmFtZS1zY29wZSBlbGVtZW50cyBzY29wZXMgdGhlIHJlZmVyZW5jZSBvZiBhIFFOYW1lIHRvIHRoZSBXU0RMCi0JZWxlbWVudCB0eXBlIGl0IGFwcGxpZXMgdG8uIFRoZSB2YWx1ZSBvZiBxbmFtZS1zY29wZSBtYXkgYmUKLQlzaW1wbGVUeXBlLCBjb21wbGV4VHlwZSwgb3IgZWxlbWVudC4KLQotCVVzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2ltcGxlVHlwZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBsZXhUeXBlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBkZWZpbmVzIGEgdHVwbGUKLQl0byBzcGVjaWZ5IFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0bwotCVdTREwgcG9ydCB0eXBlcyBhbmQgV1NETCBiaW5kaW5ncy4KLQotCUFuIGludGVyZmFjZSBtYXkgYmUgbWFwcGVkIHRvIGEgcG9ydC10eXBlIGFuZCBiaW5kaW5nIG11bHRpcGxlCi0JdGltZXMuIFRoaXMgaGFwcGVucyByYXJlbHkuCi0KLQlVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YQotCSAgICB0eXBlIGZvciB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlLiBUaGUgbmFtZSBtdXN0IGJlIGEgZnVsbHkKLQkgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1wb3J0LXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdzZGwtcG9ydC10eXBlIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBwb3J0IHR5cGUKLQkgICAgYnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgcG9ydCB0eXBlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtYmluZGluZyIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1iaW5kaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBiaW5kaW5nCi0JICAgIGJ5IGEgUU5BTUUgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyAgdGhlIGJpbmRpbmcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgb2YKLQlKYXZhIG1ldGhvZHMgdG8gb3BlcmF0aW9ucyAod2hpY2ggYXJlIG5vdCB1bmlxdWVseSBxdWFsaWZpZWQgYnkKLQlxbmFtZXMpLgotCi0JVGhlIHdzZGwtb3BlcmF0aW9uIHNob3VsZCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlCi0JcG9ydFR5cGUgYW5kIGJpbmRpbmcgaW4gd2hpY2ggdGhpcyBkZWZpbml0aW9uIGlzIGVtYmVkZGVkIHdpdGhpbi4KLQlTZWUgdGhlIGRlZmluaXRpb25zIGZvciBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIGFuZAotCXNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmcgdG8gYWNxdWlyZSB0aGUgcHJvcGVyIGNvbnRleHQuICBUaGUKLQl3cmFwcGVkLWVsZW1lbnQgaW5kaWNhdG9yIHNob3VsZCBvbmx5IGJlIHNwZWNpZmllZCB3aGVuIGEgV1NETAotCW1lc3NhZ2Ugd3JhcHMgYW4gZWxlbWVudCB0eXBlLiAgVGhlIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcgaXMKLQlub3Qgc3BlY2lmaWVkIGZvciBvbmUtd2F5IG9wZXJhdGlvbnMuCi0KLQlVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEtbWV0aG9kLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGphdmEtbWV0aG9kLW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBuYW1lIG9mIGEgSmF2YSBtZXRob2QKLQkgICAgd2l0aGluIGFuIGludGVyZmFjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLW9wZXJhdGlvbiIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1vcGVyYXRpb24gZWxlbWVudCBkZWZpbmVzIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBXU0RMCi0JICAgIGRvY3VtZW50LiAgSXQgbXVzdCBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gYSBwb3J0IHR5cGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JhcHBlZC1lbGVtZW50IgotCQkgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3JhcHBlZC1lbGVtZW50IGVsZW1lbnQgaXMgZGVmaW5lZCB3aGVuIGEgV1NETCBtZXNzYWdlCi0JICAgIHdpdGggYSBzaW5nbGUgcGFydCBpcyB1c2VkIHRvIHdyYXAgYW4gZWxlbWVudCB0eXBlIGFuZCB0aGUKLQkgICAgZWxlbWVudCdzIG5hbWUgbWF0Y2hlcyB0aGUgb3BlcmF0aW9uIG5hbWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTp3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBob3cgYSBKYXZhIHR5cGUgZm9yCi0JdGhlIHNlcnZpY2UgaW50ZXJmYWNlIG1hcHMgdG8gYSBXU0RMIHNlcnZpY2UuCi0KLQlVc2VkIGluOiBqYXZhLXdzZGwtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIGZvciB0aGUgc2VydmljZS4KLQkgICAgRm9yIHN0YXRpYyBzZXJ2aWNlcywgaXQgaXMgamF2YXgueG1sLnJwYy5TZXJ2aWNlIGludGVyZmFjZS4gRm9yCi0JICAgIGdlbmVyYXRlZCBzZXJ2aWNlLCBpdCB3b3VsZCBiZSB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZSBuYW1lLgotCi0JICAgIFRoZSBuYW1lIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLXNlcnZpY2UtbmFtZSIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1zZXJ2aWNlLW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSB3c2RsIHNlcnZpY2UgbmFtZQotCSAgICBieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBzZXJ2aWNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpwb3J0LW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB2YXJpYWJsZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBhCi0JSmF2YSBjbGFzcyBkYXRhIG1lbWJlciBvciBKYXZhQmVhbnMgcHJvcGVydHkgdG8gYW4gWE1MIGVsZW1lbnQKLQlvciBhdHRyaWJ1dGUgbmFtZSBvZiBhbiBYTUwgcm9vdCB0eXBlLiBJZiB0aGUgZGF0YS1tZW1iZXIKLQllbGVtZW50IGlzIHByZXNlbnQsIHRoZSBKYXZhIHZhcmlhYmxlIG5hbWUgaXMgYSBwdWJsaWMgZGF0YQotCW1lbWJlci4gIElmIGRhdGEtbWVtYmVyCWlzIG5vdCBwcmVzZW50LCB0aGUgSmF2YSB2YXJpYWJsZSBuYW1lCi0JaXMgYSBKYXZhQmVhbnMgcHJvcGVydHkuCi0KLQlVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YS12YXJpYWJsZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXZhLXZhcmlhYmxlLW5hbWUgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIHB1YmxpYyBkYXRhIG1lbWJlciBvcgotCSAgICBKYXZhQmVhbnMgcHJvcGVydHkgd2l0aGluIGEgSmF2YSBjbGFzcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhLW1lbWJlciIKLQkJICAgdHlwZT0iajJlZTplbXB0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGRhdGEtbWVtYmVyIGVsZW1lbnQgaXMgYSBib29sZWFuIGluZGljYXRvciB0aGF0IGEgSmF2YQotCSAgICB2YXJpYWJsZSBpcyBhIHB1YmxpYyBkYXRhIG1lbWJlciBhbmQgbm90IGEgSmF2YUJlYW5zIHByb3BlcnR5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtYXR0cmlidXRlLW5hbWUiCi0JCSAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgeG1sLWF0dHJpYnV0ZS1uYW1lIGVsZW1lbnQgZGVmaW5lcyBuYW1lIGF0dHJpYnV0ZSB2YWx1ZQotCSAgICAgIG9mIGEgV1NETCBhdHRyaWJ1dGUgZWxlbWVudCB3aXRoaW4gYSByb290IHR5cGUuICBUaGUgdmFsdWUKLQkgICAgICBvZiBhbiB4bWwtYXR0cmlidXRlLW5hbWUgZWxlbWVudCBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZgotCSAgICAgIHRoZSByZWYgYXR0cmlidXRlIGlmIG1hcHBpbmcgYW4gYXR0cmlidXRlIHJlZmVyZW5jZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LW5hbWUiCi0JCSAgICAgdHlwZT0iajJlZTpzdHJpbmciPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgeG1sLWVsZW1lbnQtbmFtZSBlbGVtZW50IGRlZmluZXMgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgb2YKLQkgICAgICBhIFdTREwgZWxlbWVudCB3aXRoaW4gYSByb290IHR5cGUuICBUaGUgdmFsdWUgb2YgYW4KLQkgICAgICB4bWwtZWxlbWVudC1uYW1lIGVsZW1lbnQgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIHJlZgotCSAgICAgIGF0dHJpYnV0ZSBpZiBtYXBwaW5nIGFuIGVsZW1lbnQgcmVmZXJlbmNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtd2lsZGNhcmQiCi0JCSAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgeG1sLXdpbGRjYXJkIGVsZW1lbnQgYXNzb2NpYXRlcyB0aGUgdmFyaWFibGUtbWFwcGluZyB3aXRoCi0JICAgICAgYW4geHNkOmFueSBlbGVtZW50IHdpdGhpbiBhIHJvb3QgdHlwZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3c2RsLW1lc3NhZ2UtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3c2RsLW1lc3NhZ2UtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgdG8gYQotCXNwZWNpZmljIG1lc3NhZ2UgYW5kIGl0cyBwYXJ0LiBUb2dldGhlciB0aGV5IGRlZmluZSB1bmlxdWVseQotCXRoZSBtYXBwaW5nIGZvciBhIHNwZWNpZmljIHBhcmFtZXRlci4gUGFydHMgd2l0aGluIGEgbWVzc2FnZQotCWNvbnRleHQgYXJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgd2l0aCB0aGVpciBuYW1lcy4KLQotCVRoZSBwYXJhbWV0ZXItbW9kZSBpcyBkZWZpbmVkIGJ5IHRoZSBtYXBwaW5nIHRvIGluZGljYXRlCi0Jd2hldGhlciB0aGUgbWFwcGluZyB3aWxsIGJlIElOLCBPVVQsIG9yIElOT1VULi4gIFRoZSBwcmVzZW5jZQotCW9mIHRoZSBzb2FwLWhlYWRlciBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMKLQltYXBwZWQgdG8gYSBzb2FwIGhlYWRlciBvbmx5LiAgV2hlbiBhYnNlbnQsIGl0IG1lYW5zIHRoYXQgdGhlCi0Jd3NkbC1tZXNzYWdlIGlzIG1hcHBlZCB0byBhIEphdmEgcGFyYW1ldGVyLiBUaGUgc29hcCBoZWFkZXJzCi0JYXJlIGludGVycHJldGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSBwcm92aWRlZCBpbiB0aGUgbWFwcGluZy4KLQotCVVzZWQgaW46IG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1tZXNzYWdlLXBhcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2UtcGFydC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlci1tb2RlIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtZXRlci1tb2RlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIgotCQkgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc29hcC1oZWFkZXIgZWxlbWVudCBpcyBhIGJvb2xlYW4gZWxlbWVudCBpbmRpY2F0aW5nIHRoYXQKLQkgICAgYSBwYXJhbWV0ZXIgaXMgbWFwcGVkIHRvIGEgU09BUCBoZWFkZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3NkbC1tZXNzYWdlLXBhcnQtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCUludGVycHJldGF0aW9uIG9mIHRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGVsZW1lbnQgZGVwZW5kcyBvbgotCXdoZXRoZXIgb3Igbm90IHdyYXBwZWQtZWxlbWVudCBoYXMgYmVlbiBkZWZpbmVkIGluIHRoZQotCXNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcuICBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgbm90Ci0Jc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgcGFydC4gSXQKLQlzaG91bGQgYWx3YXlzIGJlIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byBhIHdzZGwtbWVzc2FnZQotCWVsZW1lbnQuIElmIHdyYXBwZWQtZWxlbWVudCBpcyBzcGVjaWZpZWQsIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUKLQlyZWZlcnMgdG8gYW4gZWxlbWVudCBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuCi0KLQlVc2VkIGluOiB3c2RsLW1lc3NhZ2UtbWFwcGluZywgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3c2RsLW1lc3NhZ2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd3NkbC1tZXNzYWdlIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgbWVzc2FnZSBieSBhIFFOQU1FLgotCi0JVXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcsCi0JZXhjZXB0aW9uLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2RRTmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nICBlbGVtZW50IGRlZmluZXMgdGhlIG1hcHBpbmcgZm9yIHRoZQotCW1ldGhvZCdzIHJldHVybiB2YWx1ZS4gSXQgZGVmaW5lcyB0aGUgbWFwcGluZyB0byBhIHNwZWNpZmljIG1lc3NhZ2UKLQlhbmQgaXRzIHBhcnQuICBUb2dldGhlciB0aGV5IGRlZmluZSB1bmlxdWVseSB0aGUgbWFwcGluZyBmb3IgYQotCXNwZWNpZmljIHBhcmFtZXRlci4gUGFydHMgd2l0aGluIGEgbWVzc2FnZSBjb250ZXh0IGFyZSB1bmlxdWVseQotCWlkZW50aWZpZWQgd2l0aCB0aGVpciBuYW1lcy4gVGhlIHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWUgaXMgbm90Ci0Jc3BlY2lmaWVkIGlmIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSBvciBPVVQgcGFyYW1ldGVycy4KLQotCVVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXJldHVybi12YWx1ZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG1ldGhvZC1yZXR1cm4tdmFsdWUgIGVsZW1lbnQgZGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZAotCSAgICBjbGFzcyBuYW1lIG9yIHZvaWQgdHlwZSBmb3IgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZQotCSAgICB0eXBlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1tZXNzYWdlLXBhcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTp3c2RsLW1lc3NhZ2UtcGFydC1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMmE3OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIxLjEiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWoyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2RzCTEuMTEgMDIvMTEvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiB3ZWIgc2VydmljZQotCWRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKMkVFIEFwcGxpY2F0aW9uCi0JU2VydmVyIGFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZAotCXNlcnZpY2VzLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkCi0JIk1FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbCIgaW4gdGhlIHdlYiBzZXJ2aWNlcycgamFyIGZpbGUuCi0KLQlVc2VkIGluOiB3ZWJzZXJ2aWNlcy54bWwKLQotCUFsbCB3ZWJzZXJ2aWNlcyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlCi0Jd2Vic2VydmljZXMgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHZlcnNpb24KLQllbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDx3ZWJzZXJ2aWNlcyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCQlodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiCi0JICAgICAgdmVyc2lvbj0iMS4xIj4KLQkgICAgICAuLi4KLQkgICAgPC93ZWJzZXJ2aWNlcz4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZiB0aGUKLQlzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIHRoZSBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2VzIiB0eXBlPSJqMmVlOndlYnNlcnZpY2VzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYnNlcnZpY2VzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIHdlYiBzZXJ2aWNlcwotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHdlYiBzZXJ2aWNlCi0JZGVzY3JpcHRpb25zIHRoYXQgYXJlIHRvIGJlIGRlcGxveWVkIGludG8gdGhlIEoyRUUgQXBwbGljYXRpb24gU2VydmVyCi0JYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGhleSBoYXZlIG9uIGNvbnRhaW5lciByZXNvdXJjZXMgYW5kIHNlcnZpY2VzLgotCi0JVXNlZCBpbjogd2Vic2VydmljZXMueG1sCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSBpZGVudGlmaWVzIHRoZSBjb2xsZWN0aW9uIG9mCi0JICBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDIG1hcHBpbmcuIFRoZQotCSAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqMmVlOndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSIvPgotICAgIDwveHNkOmtleT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcG9ydC1jb21wb25lbnQgZWxlbWVudCBhc3NvY2lhdGVzIGEgV1NETCBwb3J0IHdpdGggYSB3ZWIgc2VydmljZQotCWludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb24uICBJdCBkZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBwb3J0IGFzIGEKLQljb21wb25lbnQsIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBvcHRpb25hbCBkaXNwbGF5IG5hbWUsIG9wdGlvbmFsIGljb25pYwotCXJlcHJlc2VudGF0aW9ucywgV1NETCBwb3J0IFFOYW1lLCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSwgU2VydmljZQotCUltcGxlbWVudGF0aW9uIEJlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0JCSAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQgY29tcG9uZW50J3MKLQkgICAgICBuYW1lLiAgVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUgcHJvZHVjZXIgdG8gbmFtZQotCSAgICAgIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4gaW4gdGhlIG1vZHVsZSdzIGRlcGxveW1lbnQKLQkgICAgICBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQKLQkgICAgICBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLQotCSAgICAgIFVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLQkgICAgICBFeGFtcGxlOgotCQkgICAgICA8cG9ydC1jb21wb25lbnQtbmFtZT5FbXBsb3llZVNlcnZpY2UKLQkJICAgICAgPC9wb3J0LWNvbXBvbmVudC1uYW1lPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtcG9ydCIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwgcG9ydCBRTmFtZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBvcnQgY29tcG9uZW50J3MgU2VydmljZSBFbmRwb2ludAotCSAgICAgIEludGVyZmFjZS4KLQotCSAgICAgIFVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLQkgICAgICBFeGFtcGxlOgotCQkgICAgICA8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhbiIKLQkJICAgdHlwZT0iajJlZTpzZXJ2aWNlLWltcGwtYmVhblR5cGUiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0JCSAgIHR5cGU9ImoyZWU6cG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3J0LWNvbXBvbmVudF9oYW5kbGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlCi0JaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuCi0KLQlVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCSAgICBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlciBpbXBsZW1lbnRhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1oZWFkZXIiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZQotCSAgICBoYW5kbGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtcm9sZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdCB0aGUKLQkgICAgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtaW1wbC1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQgZGVmaW5lcyB0aGUgd2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0JQSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNhbiBiZSBhbiBFSkIgYmVhbiBjbGFzcyBvciBKQVgtUlBDIHdlYgotCWNvbXBvbmVudC4gIEV4aXN0aW5nIEVKQiBpbXBsZW1lbnRhdGlvbnMgYXJlIGV4cG9zZWQgYXMgYSB3ZWIgc2VydmljZQotCXVzaW5nIGFuIGVqYi1saW5rLgotCi0JVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotCQkgICB0eXBlPSJqMmVlOmVqYi1saW5rVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbGluayIKLQkJICAgdHlwZT0iajJlZTpzZXJ2bGV0LWxpbmtUeXBlIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbGlua1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHNlcnZsZXQtbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQKLQkgIHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEKLQkgIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludC4KLQotCSAgVGhlIHZhbHVlIG9mIHRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBzZXJ2bGV0LW5hbWUgb2YKLQkgIGEgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50IGluIHRoZSBzYW1lIFdBUiBmaWxlLgotCi0JICBVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbgotCi0JICBFeGFtcGxlOgotCQkgIDxzZXJ2bGV0LWxpbms+U3RvY2tRdW90ZVNlcnZpY2U8L3NlcnZsZXQtbGluaz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24gZWxlbWVudCBkZWZpbmVzIGEgV1NETCBkb2N1bWVudCBmaWxlCi0JYW5kIHRoZSBzZXQgb2YgUG9ydCBjb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgV1NETCBwb3J0cwotCWRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUKLQl3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIG1vZHVsZS4KLQotCUFsbCBXU0RMIGZpbGUgcG9ydHMgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBwb3J0LWNvbXBvbmVudCBlbGVtZW50Ci0JZGVmaW5lZC4KLQotCVVzZWQgaW46IHdlYnNlcnZpY2VzCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iajJlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0JCSAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgotCSAgICBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDCi0JICAgIG1hcHBpbmcuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtZmlsZSIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIFdTREwgZmlsZSBpbiB0aGUKLQkgICAgbW9kdWxlLiAgVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF4cnBjLW1hcHBpbmctZmlsZSIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLQkgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudCIKLQkJICAgdHlwZT0iajJlZTpwb3J0LWNvbXBvbmVudFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6a2V5IG5hbWU9InBvcnQtY29tcG9uZW50X2hhbmRsZXItbmFtZS1rZXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpoYW5kbGVyIi8+Ci0JICA8eHNkOmZpZWxkIHhwYXRoPSJqMmVlOmhhbmRsZXItbmFtZSIvPgotCTwveHNkOmtleT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic2VydmljZXNUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6a2V5IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUta2V5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgIDwhW0NEQVRBWwotCi0JCVRoZSBwb3J0LWNvbXBvbmVudC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEgcG9ydAotCQljb21wb25lbnQncyBuYW1lLiAgVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUKLQkJcHJvZHVjZXIgdG8gbmFtZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZQotCQltb2R1bGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JCWFtb25nIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLQotCQlVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0JCUV4YW1wbGU6Ci0JCQk8cG9ydC1jb21wb25lbnQtbmFtZT5FbXBsb3llZVNlcnZpY2UKLQkJCTwvcG9ydC1jb21wb25lbnQtbmFtZT4KLQotCQldXT4KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnBvcnQtY29tcG9uZW50Ii8+Ci0JICA8eHNkOmZpZWxkIHhwYXRoPSJqMmVlOnBvcnQtY29tcG9uZW50LW5hbWUiLz4KLQk8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjEuMSIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuMS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTRhNTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuMSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2RzCTEuMTAgMDIvMTEvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50LXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0Jb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQl0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci0JSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotCWJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIGVsZW1lbnQgZGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZAotCSAgICBKYXZhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2Ugb2YgYQotCSAgICBXU0RMIHBvcnQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudC1saW5rIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcG9ydC1jb21wb25lbnQtbGluayBlbGVtZW50IGxpbmtzIGEgcG9ydC1jb21wb25lbnQtcmVmCi0JICAgIHRvIGEgc3BlY2lmaWMgcG9ydC1jb21wb25lbnQgcmVxdWlyZWQgdG8gYmUgbWFkZSBhdmFpbGFibGUKLQkgICAgYnkgYSBzZXJ2aWNlIHJlZmVyZW5jZS4KLQotCSAgICBUaGUgdmFsdWUgb2YgYSBwb3J0LWNvbXBvbmVudC1saW5rIG11c3QgYmUgdGhlCi0JICAgIHBvcnQtY29tcG9uZW50LW5hbWUgb2YgYSBwb3J0LWNvbXBvbmVudCBpbiB0aGUgc2FtZSBtb2R1bGUKLQkgICAgb3IgYW5vdGhlciBtb2R1bGUgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24gdW5pdC4gVGhlIHN5bnRheAotCSAgICBmb3Igc3BlY2lmaWNhdGlvbiBmb2xsb3dzIHRoZSBzeW50YXggZGVmaW5lZCBmb3IgZWpiLWxpbmsKLQkgICAgaW4gdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJzZXJ2aWNlLXJlZkdyb3VwIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotCQkgICB0eXBlPSJqMmVlOnNlcnZpY2UtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDprZXkgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlci1uYW1lLWtleSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmhhbmRsZXIiLz4KLQkgIDx4c2Q6ZmllbGQgeHBhdGg9ImoyZWU6aGFuZGxlci1uYW1lIi8+Ci0JPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZpY2UtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSByZWZlcmVuY2UgdG8gYSBXZWIKLQlzZXJ2aWNlLiBJdCBjb250YWlucyBvcHRpb25hbCBkZXNjcmlwdGlvbiwgZGlzcGxheSBuYW1lIGFuZAotCWljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwKLQlhbiBvcHRpb25hbCBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLCBhbiBvcHRpb25hbCBzZXQKLQlvZiBKQVgtUlBDIG1hcHBpbmdzLCBhbiBvcHRpb25hbCBRTmFtZSBmb3IgdGhlIHNlcnZpY2UgZWxlbWVudCwKLQlhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkCi0JYnkgdGhlIGNvbnRhaW5lciB0byBhIFdTREwgcG9ydCwgYW5kIGFuIG9wdGlvbmFsIHNldCBvZiBoYW5kbGVycy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2VydmljZS1yZWYtbmFtZSBlbGVtZW50IGRlY2xhcmVzIGxvZ2ljYWwgbmFtZSB0aGF0IHRoZQotCSAgICBjb21wb25lbnRzIGluIHRoZSBtb2R1bGUgdXNlIHRvIGxvb2sgdXAgdGhlIFdlYiBzZXJ2aWNlLiBJdAotCSAgICBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzZXJ2aWNlIHJlZmVyZW5jZSBuYW1lcyBzdGFydCB3aXRoCi0JICAgICJzZXJ2aWNlLyIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWludGVyZmFjZSIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAgICBuYW1lIG9mIHRoZSBKQVgtUlBDIFNlcnZpY2UgaW50ZXJmYWNlIHRoZSBjbGllbnQgZGVwZW5kcyBvbi4KLQkgICAgSW4gbW9zdCBjYXNlcyB0aGUgdmFsdWUgd2lsbCBiZSBqYXZheC54bWwucnBjLlNlcnZpY2UuICBBIEpBWC1SUEMKLQkgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtZmlsZSIKLQkJICAgdHlwZT0iajJlZTp4c2RBbnlVUklUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgVVJJIGxvY2F0aW9uIG9mIGEgV1NETAotCSAgICBmaWxlLiBUaGUgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGpheHJwYy1tYXBwaW5nLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdAotCSAgICBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5Ci0JICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFdTREwgZGVzY3JpcHRpb24gaW4gdGhlIHdzZGwtZmlsZS4gIFRoZQotCSAgICBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlIGZpbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXFuYW1lIgotCQkgICB0eXBlPSJqMmVlOnhzZFFOYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2VydmljZS1xbmFtZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBzcGVjaWZpYyBXU0RMIHNlcnZpY2UKLQkgICAgZWxlbWVudCB0aGF0IGlzIGJlaW5nIHJlZmVyZWQgdG8uICBJdCBpcyBub3Qgc3BlY2lmaWVkIGlmIG5vCi0JICAgIHdzZGwtZmlsZSBpcyBkZWNsYXJlZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LXJlZiIKLQkJICAgdHlwZT0iajJlZTpwb3J0LWNvbXBvbmVudC1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLQkgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQkgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotCSAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0JICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0JCSAgIHR5cGU9ImoyZWU6c2VydmljZS1yZWZfaGFuZGxlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuCi0JICAgIGFjY2VzcyB0aGUgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZQotCSAgICBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKLQkgICAgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwgcG9ydHMgb2YgdGhlCi0JICAgIHNlcnZpY2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotCWluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZgotCXBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQKLQl3aXRoIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KLQotCVVzZWQgaW46IHNlcnZpY2UtcmVmCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBoYW5kbGVyCi0JICAgIGltcGxlbWVudGF0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLWhlYWRlciIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBRTmFtZSBvZiBhIFNPQVAgaGVhZGVyIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQKLQkgICAgYnkgdGhlIGhhbmRsZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLXJvbGUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQKLQkgICAgdGhlIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcG9ydC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgV1NETCBwb3J0LW5hbWUgdGhhdCBhCi0JICAgIGhhbmRsZXIgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlXzUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfNS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTAxODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iNSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpamF2YWVlXzUueHNkcwkxLjY1IDA2LzAyLzE3Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi1zaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLWludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLQotRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIGoyZWUgYXBwbGljYXRpb247Ci0gICAgYXBwbGljYXRpb24gY2xpZW50OwotICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAgICBlbnRlcnByaXNlIGJlYW47Ci0gICAgcmVzb3VyY2UgYWRhcHRlcjsKLQotRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICBlYXIgZmlsZTsKLSAgICB3YXIgZmlsZTsKLSAgICBqYXIgZmlsZTsKLSAgICByYXIgZmlsZTsKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0JICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmdyb3VwIG5hbWU9ImRlc2NyaXB0aW9uR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgZGVzY3JpcHRpb24gcmVsYXRlZAotCWVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEphdmEgRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLQotCUFsbCBlbGVtZW50cyBtYXkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbGFuZ3VhZ2VzLAotCXRvIHN1cHBvcnQgbG9jYWxpemF0aW9uIG9mIHRoZSBjb250ZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmRpc3BsYXktbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotCQkgICB0eXBlPSJqYXZhZWU6aWNvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KLQlwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZWxlbWVudHMKLQl0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cwotCXRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JRGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZQotCXRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKLQl0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0Ci0JY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotCi0JVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi0JZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZXdleS12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGRlZmluZXMgYSBkZXdleSBkZWNpbWFsIHRoYXQgaXMgdXNlZAotCXRvIGRlc2NyaWJlIHZlcnNpb25zIG9mIGRvY3VtZW50cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJcLj9bMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNwbGF5LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotCSAgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQotCSAgZWxlbWVudHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotCSAgRXhhbXBsZToKLQotCSAgLi4uCi0JICAgICA8ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiI+Ci0JICAgICAgIEVtcGxveWVlIFNlbGYgU2VydmljZQotCSAgICAgPC9kaXNwbGF5LW5hbWU+Ci0KLQkgIFRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuCi0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItbGlua1R5cGUgaXMgdXNlZCBieSBlamItbGluawotCSAgZWxlbWVudHMgaW4gdGhlIGVqYi1yZWYgb3IgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyB0byBzcGVjaWZ5Ci0JICB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGVudGVycHJpc2UgYmVhbi4KLQotCSAgVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuCi0JICBlbnRlcnByaXNlIGJlYW4gaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlIG9yIGluIGFub3RoZXIgZWpiLWphcgotCSAgZmlsZSBpbiB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uIHVuaXQuCi0KLQkgIEFsdGVybmF0aXZlbHksIHRoZSBuYW1lIGluIHRoZSBlamItbGluayBlbGVtZW50IG1heSBiZQotCSAgY29tcG9zZWQgb2YgYSBwYXRoIG5hbWUgc3BlY2lmeWluZyB0aGUgZWpiLWphciBjb250YWluaW5nIHRoZQotCSAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4gd2l0aCB0aGUgZWpiLW5hbWUgb2YgdGhlIHRhcmdldAotCSAgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGggbmFtZSBieSAiIyIuICBUaGUKLQkgIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKLQkgIGJlYW4uICBUaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUKLQkgIGVqYi1uYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLQkgIEV4YW1wbGVzOgotCi0JICAgICAgPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotCSAgICAgIDxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1sb2NhbC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLWxvY2FsLXJlZlR5cGUgaXMgdXNlZCBieSBlamItbG9jYWwtcmVmIGVsZW1lbnRzIGZvcgotCXRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbAotCWhvbWUgb3IgdG8gdGhlIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotICAgICAgICBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudAotCSAgICAgIENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4KLQkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkCi0gICAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbiBvciB0aGUgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIHRoZQotICAgICAgICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLQkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQKLSAgICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuLiBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1sb2NhbC1yZWYgcmVmZXJzCi0gICAgICAgICAgICAgIHRvIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLQkgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotCSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgICAgICAtIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIGVudGVycHJpc2UKLSAgICAgICAgICAgICAgYmVhbiBpbnRvIGEgY29tcG9uZW50IGZpZWxkIG9yIHByb3BlcnR5LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsLWhvbWVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotCQkgICB0eXBlPSJqYXZhZWU6bG9jYWxUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLWxpbmtUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCSAgRGVwbG95bWVudCBDb21wb25lbnQuCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgRXhhbXBsZToKLQotCSAgPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpqbmRpLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItcmVmLXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQotCXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotCi0JVGhlIGVqYi1yZWYtdHlwZSBkZXNpZ25hdGVzIGEgdmFsdWUKLQl0aGF0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgRW50aXR5Ci0JICAgIFNlc3Npb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRW50aXR5Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2Vzc2lvbiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLXJlZlR5cGUgaXMgdXNlZCBieSBlamItcmVmIGVsZW1lbnRzIGZvciB0aGUKLQlkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lIG9yCi0gICAgICAgIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0JVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YKLQkgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0JICAgICAgYmVhbi4KLQkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAgICAgICAgIC0gdGhlIG9wdGlvbmFsIHJlbW90ZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgICAgICAgIG9yIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UKLSAgICAgICAgICAgICAgYmVhbgotCSAgICAtIHRoZSBvcHRpb25hbCBleHBlY3RlZCBob21lIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZAotICAgICAgICAgICAgICBlbnRlcnByaXNlIGJlYW4uICBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1yZWYKLSAgICAgICAgICAgICAgcmVmZXJzIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0JICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLQkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICAgICAgLSBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCBlbnRlcnByaXNlCi0gICAgICAgICAgICAgIGJlYW4gaW50byBhIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotCQkgICB0eXBlPSJqYXZhZWU6cmVtb3RlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBpcyB1c2VkIHRvIGRlc2lnbmF0ZSBhbiBlbXB0eQotCWVsZW1lbnQgd2hlbiB1c2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGlzIHR5cGUgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZQotCSAgYXBwbGljYXRpb24ncyBjb2RlLgotCi0JICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGU6Ci0KLQkgICAgICBqYXZhLmxhbmcuQm9vbGVhbgotCSAgICAgIGphdmEubGFuZy5CeXRlCi0JICAgICAgamF2YS5sYW5nLkNoYXJhY3RlcgotCSAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgICAgICBqYXZhLmxhbmcuU2hvcnQKLQkgICAgICBqYXZhLmxhbmcuSW50ZWdlcgotCSAgICAgIGphdmEubGFuZy5Mb25nCi0JICAgICAgamF2YS5sYW5nLkZsb2F0Ci0JICAgICAgamF2YS5sYW5nLkRvdWJsZQotCi0JICBFeGFtcGxlOgotCi0JICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJ5dGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQ2hhcmFjdGVyIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLlN0cmluZyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TaG9ydCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5JbnRlZ2VyIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkxvbmciLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuRmxvYXQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuRG91YmxlIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVudi1lbnRyeVR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGFuIGFwcGxpY2F0aW9uJ3MKLQllbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi0JZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYSB0eXBlCi0JKG9wdGlvbmFsIGlmIHRoZSB2YWx1ZSBpcyBpbmplY3RlZCwgb3RoZXJ3aXNlIHJlcXVpcmVkKSwgYW5kCi0JYW4gb3B0aW9uYWwgdmFsdWUuCi0KLQlJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLQl0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0KLQlJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIGluamVjdGlvbiBpcyByZXF1ZXN0ZWQsCi0Jbm8gaW5qZWN0aW9uIHdpbGwgb2NjdXIgYW5kIG5vIGVudHJ5IG9mIHRoZSBzcGVjaWZpZWQgbmFtZQotCXdpbGwgYmUgY3JlYXRlZC4gIFRoaXMgYWxsb3dzIGFuIGluaXRpYWwgdmFsdWUgdG8gYmUKLQlzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBjb2RlIHdpdGhvdXQgYmVpbmcgaW5jb3JyZWN0bHkKLQljaGFuZ2VkIHdoZW4gbm8gb3ZlcnJpZGUgaGFzIGJlZW4gc3BlY2lmaWVkLgotCi0JSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGFuZCBubyBpbmplY3Rpb24gaXMgcmVxdWVzdGVkLAotCWEgdmFsdWUgbXVzdCBiZSBzdXBwbGllZCBkdXJpbmcgZGVwbG95bWVudC4KLQotCVRoaXMgdHlwZSBpcyB1c2VkIGJ5IGVudi1lbnRyeSBlbGVtZW50cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUKLQkgICAgICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotCSAgICAgIGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYQotCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50LiBUaGUgdW5pcXVlbmVzcwotCSAgICAgIGNvbnN0cmFpbnRzIG11c3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGRlY2xhcmVkCi0JICAgICAgY29udGV4dC4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6ZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIEphdmEgbGFuZ3VhZ2UKLQkgICAgICB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeS4gIElmIGFuIGluamVjdGlvbiB0YXJnZXQKLQkgICAgICBpcyBzcGVjaWZpZWQgZm9yIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgdGhlIHR5cGUgbWF5Ci0JICAgICAgYmUgb21pdHRlZCwgb3IgbXVzdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0JICAgICAgdGFyZ2V0LiAgSWYgbm8gaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIHRoZSB0eXBlCi0JICAgICAgaXMgcmVxdWlyZWQuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS12YWx1ZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbnYtZW50cnktdmFsdWUgZGVzaWduYXRlcyB0aGUgdmFsdWUgb2YgYQotCSAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZQotCSAgICAgIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi0JICAgICAgY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYQotCSAgICAgIHNpbmdsZSBTdHJpbmcgcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwKLQkgICAgICBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSB0aGUgbmFtZSBvZiBhCi0JSmF2YSBjbGFzcyBvciBpbnRlcmZhY2UuICBUaGUgbmFtZSBpcyBpbiB0aGUgZm9ybSBvZiBhCi0JImJpbmFyeSBuYW1lIiwgYXMgZGVmaW5lZCBpbiB0aGUgSkxTLiAgVGhpcyBpcyB0aGUgZm9ybQotCW9mIG5hbWUgdXNlZCBpbiBDbGFzcy5mb3JOYW1lKCkuICBUb29scyB0aGF0IG5lZWQgdGhlCi0JY2Fub25pY2FsIG5hbWUgKHRoZSBuYW1lIHVzZWQgaW4gc291cmNlIGNvZGUpIHdpbGwgbmVlZAotCXRvIGNvbnZlcnQgdGhpcyBiaW5hcnkgbmFtZSB0byB0aGUgY2Fub25pY2FsIG5hbWUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJpYy1ib29sZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGRlZmluZXMgZm91ciBkaWZmZXJlbnQgdmFsdWVzIHdoaWNoIGNhbiBkZXNpZ25hdGUKLQlib29sZWFuIHZhbHVlcy4gVGhpcyBpbmNsdWRlcyB2YWx1ZXMgeWVzIGFuZCBubyB3aGljaCBhcmUKLQlub3QgZGVzaWduYXRlZCBieSB4c2Q6Ym9vbGVhbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhvbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZgotCSAgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpY29uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzCi0JdGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGLCBKUEVHLAotCW9yIFBORyBpY29uIGltYWdlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYQotCUdVSSB0b29sLgotCi0JVGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotCWljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKQotCWJ5IGRlZmF1bHQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic21hbGwtaWNvbiIgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotCSAgICAgIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLQkgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQKLQkgICAgICBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUuCi0KLQkgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGluIHRoZSBHSUYsIEpQRUcsIG9yIFBORyBmb3JtYXQuCi0JICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhcmdlLWljb24iIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLQkgICAgICBjb250YWluaW5nIGEgbGFyZ2UKLQkgICAgICAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlCi0JICAgICAgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudAotCSAgICAgIEZpbGUuCi0KLQkgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGluIHRoZSBHSUYsIEpQRUcsIG9yIFBORyBmb3JtYXQuCi0JICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JQW4gaW5qZWN0aW9uIHRhcmdldCBzcGVjaWZpZXMgYSBjbGFzcyBhbmQgYSBuYW1lIHdpdGhpbgotCXRoYXQgY2xhc3MgaW50byB3aGljaCBhIHJlc291cmNlIHNob3VsZCBiZSBpbmplY3RlZC4KLQotCVRoZSBpbmplY3Rpb24gdGFyZ2V0IGNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkCi0JY2xhc3MgbmFtZSB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIGluamVjdGlvbi4gIFRoZQotCUphdmEgRUUgc3BlY2lmaWNhdGlvbnMgZGVzY3JpYmUgd2hpY2ggY2xhc3NlcyBjYW4gYmUgYW4KLQlpbmplY3Rpb24gdGFyZ2V0LgotCi0JVGhlIGluamVjdGlvbiB0YXJnZXQgbmFtZSBzcGVjaWZpZXMgdGhlIHRhcmdldCB3aXRoaW4KLQl0aGUgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHRhcmdldCBpcyBmaXJzdCBsb29rZWQgZm9yIGFzIGEKLQlKYXZhQmVhbnMgcHJvcGVydHkgbmFtZS4gIElmIG5vdCBmb3VuZCwgdGhlIHRhcmdldCBpcwotCWxvb2tlZCBmb3IgYXMgYSBmaWVsZCBuYW1lLgotCi0JVGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIHRhcmdldAotCWR1cmluZyBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2xhc3MgYnkgZWl0aGVyIGNhbGxpbmcgdGhlCi0Jc2V0IG1ldGhvZCBmb3IgdGhlIHRhcmdldCBwcm9wZXJ0eSBvciBieSBzZXR0aW5nIGEgdmFsdWUKLQlpbnRvIHRoZSBuYW1lZCBmaWVsZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5qZWN0aW9uLXRhcmdldC1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgamF2YS1pZGVudGlmaWVyVHlwZSBkZWZpbmVzIGEgSmF2YSBpZGVudGlmaWVyLgotCVRoZSB1c2VycyBvZiB0aGlzIHR5cGUgc2hvdWxkIGZ1cnRoZXIgdmVyaWZ5IHRoYXQKLQl0aGUgY29udGVudCBkb2VzIG5vdCBjb250YWluIEphdmEgcmVzZXJ2ZWQga2V5d29yZHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iKCR8X3xccHtMfSkoXHB7TH18XHB7TmR9fF98JCkqIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyBhIGdlbmVyaWMgdHlwZSB0aGF0IGRlc2lnbmF0ZXMgYSBKYXZhIHByaW1pdGl2ZQotCXR5cGUgb3IgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgaW50ZXJmYWNlL3R5cGUsCi0Jb3IgYW4gYXJyYXkgb2Ygc3VjaCB0eXBlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXlxwe1p9XSoiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgam5kaS1uYW1lVHlwZSB0eXBlIGRlc2lnbmF0ZXMgYSBKTkRJIG5hbWUgaW4gdGhlCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JamF2YTpjb21wL2VudiBjb250ZXh0LiAgQSBKTkRJIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCURlcGxveW1lbnQgQ29tcG9uZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmdyb3VwIG5hbWU9ImpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBncm91cCBrZWVwcyB0aGUgdXNhZ2Ugb2YgdGhlIGNvbnRhaW5lZCBKTkRJIGVudmlyb25tZW50Ci0JcmVmZXJlbmNlIGVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEphdmEgRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotCQkgICB0eXBlPSJqYXZhZWU6ZW52LWVudHJ5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1sb2NhbC1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbG9jYWwtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2UtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtY29uc3RydWN0IgotCQkgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1kZXN0cm95IgotCQkgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxpZmVjeWNsZS1jYWxsYmFjayB0eXBlIHNwZWNpZmllcyBhIG1ldGhvZCBvbiBhCi0JY2xhc3MgdG8gYmUgY2FsbGVkIHdoZW4gYSBsaWZlY3ljbGUgZXZlbnQgb2NjdXJzLgotCU5vdGUgdGhhdCBlYWNoIGNsYXNzIG1heSBoYXZlIG9ubHkgb25lIGxpZmVjeWNsZSBjYWxsYmFjawotICAgICAgICBtZXRob2QgZm9yIGFueSBnaXZlbiBldmVudCBhbmQgdGhhdCB0aGUgbWV0aG9kIG1heSBub3QKLQliZSBvdmVybG9hZGVkLgotCi0gICAgICAgIElmIHRoZSBsaWZlZnljbGUtY2FsbGJhY2stY2xhc3MgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4KLSAgICAgICAgdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBjYWxsYmFjayBpcyBhc3N1bWVkIHRvIGJlIHRoZQotICAgICAgICBjb21wb25lbnQgY2xhc3MgaW4gc2NvcGUgYXQgdGhlIHBsYWNlIGluIHRoZSBkZXNjcmlwdG9yCi0gICAgICAgIGluIHdoaWNoIHRoZSBjYWxsYmFjayBkZWZpbml0aW9uIGFwcGVhcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1jYWxsYmFjay1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlLWNhbGxiYWNrLW1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imxpc3RlbmVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxpc3RlbmVyVHlwZSBpbmRpY2F0ZXMgdGhlIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIKLQlhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUKLQkgICAgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViCi0JICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkKLQkgICAgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgbGlzdGVuZXIgY2xhc3MuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWwtaG9tZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbC1ob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLQluYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbFR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLQllbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIGlzIHVzZWQgdG8gbGluayBhIG1lc3NhZ2UKLQlkZXN0aW5hdGlvbiByZWZlcmVuY2Ugb3IgbWVzc2FnZS1kcml2ZW4gYmVhbiB0byBhIG1lc3NhZ2UKLQlkZXN0aW5hdGlvbi4KLQotCVRoZSBBc3NlbWJsZXIgc2V0cyB0aGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgZmxvdyBvZiBtZXNzYWdlcwotCWJldHdlZW4gcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMgaW4gdGhlIGFwcGxpY2F0aW9uLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiBhIG1lc3NhZ2UKLQlkZXN0aW5hdGlvbiBpbiB0aGUgc2FtZSBEZXBsb3ltZW50IEZpbGUgb3IgaW4gYW5vdGhlcgotCURlcGxveW1lbnQgRmlsZSBpbiB0aGUgc2FtZSBKYXZhIEVFIGFwcGxpY2F0aW9uIHVuaXQuCi0KLQlBbHRlcm5hdGl2ZWx5LCB0aGUgdmFsdWUgbWF5IGJlIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lCi0Jc3BlY2lmeWluZyBhIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nIHRoZSByZWZlcmVuY2VkCi0JbWVzc2FnZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgdGhlCi0JZGVzdGluYXRpb24gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkKLQkiIyIuIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZQotCWNvbnRhaW5pbmcgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCBpcyByZWZlcmVuY2luZyB0aGUKLQltZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgbWVzc2FnZQotCWRlc3RpbmF0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0JICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0KLQkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JCSAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZQotCQkgIC0gYW4gb3B0aW9uYWwgbWVzc2FnZSBkZXN0aW5hdGlvbiB0eXBlCi0JCSAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIKLQkJICAgIHRoZSBkZXN0aW5hdGlvbiBpcyB1c2VkIGZvcgotCQkgICAgY29uc3VtaW5nIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aC4KLQkJICAgIGlmIG5vdCBzcGVjaWZpZWQsICJib3RoIiBpcyBhc3N1bWVkLgotCQkgIC0gYW4gb3B0aW9uYWwgbGluayB0byB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbgotCQkgIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKLQotCSAgVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZSBtdXN0IGJlIHN1cHBsaWVkIHVubGVzcyBhbgotCSAgaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgdGhlIHR5cGUKLQkgIG9mIHRoZSB0YXJnZXQgaXMgdXNlZC4gIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHR5cGUKLQkgIG11c3QgYmUgYXNzaWdubWVudCBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotCSAgdGFyZ2V0LgotCi0JICBFeGFtcGxlczoKLQotCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+Ci0JCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Q29uc3VtZXMKLQkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2U+Ci0JCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MKLQkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbGluaz4KLQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICAgIHRoZSBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cwotCSAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlCi0JICAgIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLWphciAoZm9yIGVudGVycHJpc2UgYmVhbnMpIG9yIGEKLQkgICAgRGVwbG95bWVudCBGaWxlIChmb3Igb3RoZXJzKS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotCi0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YKLQkgIHRoZSBkZXN0aW5hdGlvbi4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZQotCSAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotCi0JICBFeGFtcGxlOgotCi0JICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0JICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlCi0JbWVzc2FnZSBkZXN0aW5hdGlvbiBpbmRpY2F0ZWQgYnkgdGhlIHJlZmVyZW5jZS4gIFRoZSB2YWx1ZQotCWluZGljYXRlcyB3aGV0aGVyIG1lc3NhZ2VzIGFyZSBjb25zdW1lZCBmcm9tIHRoZSBtZXNzYWdlCi0JZGVzdGluYXRpb24sIHByb2R1Y2VkIGZvciB0aGUgZGVzdGluYXRpb24sIG9yIGJvdGguICBUaGUKLQlBc3NlbWJsZXIgbWFrZXMgdXNlIG9mIHRoaXMgaW5mb3JtYXRpb24gaW4gbGlua2luZyBwcm9kdWNlcnMKLQlvZiBhIGRlc3RpbmF0aW9uIHdpdGggaXRzIGNvbnN1bWVycy4KLQotCVRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSBlbGVtZW50IG11c3QgYmUKLQlvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkgICAgQ29uc3VtZXMKLQkgICAgUHJvZHVjZXMKLQkgICAgQ29uc3VtZXNQcm9kdWNlcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lcyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlByb2R1Y2VzIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXNQcm9kdWNlcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlCi0JICBkZXN0aW5hdGlvbi4gVGhlIGxvZ2ljYWwgZGVzdGluYXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMKLQkgIGVsZW1lbnQgaXMgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZGVzdGluYXRpb24gYnkgdGhlIERlcGxveWVyLgotCi0JICBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOgotCi0JCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCQkgIC0gYW4gb3B0aW9uYWwgZGlzcGxheS1uYW1lCi0JCSAgLSBhbiBvcHRpb25hbCBpY29uCi0JCSAgLSBhIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZSB3aGljaCBtdXN0IGJlIHVuaXF1ZQotCQkgICAgYW1vbmcgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lcyB3aXRoaW4gdGhlIHNhbWUKLQkJICAgIERlcGxveW1lbnQgRmlsZS4KLQkJICAtIGFuIG9wdGlvbmFsIG1hcHBlZCBuYW1lCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Q29ycG9yYXRlU3RvY2tzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWU+Ci0JICA8L21lc3NhZ2UtZGVzdGluYXRpb24+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEKLQkgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUKLQkgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucwotCSAgICB3aXRoaW4gdGhlIERlcGxveW1lbnQgRmlsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyBtZXNzYWdlIGRlc3RpbmF0aW9uCi0JICAgICAgc2hvdWxkIGJlIG1hcHBlZCB0by4gIEVhY2ggbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYKLQkgICAgICBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGlzIG1lc3NhZ2UgZGVzdGluYXRpb24gd2lsbAotCSAgICAgIGRlZmluZSBhIG5hbWUgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgcmVmZXJlbmNpbmcKLQkgICAgICBjb21wb25lbnQuICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudgotCSAgICAgIG5hbWVzcGFjZS4pICBNYW55IGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0bwotCSAgICAgIG1hcCB0aGVzZSBsb2NhbCBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlCi0JICAgICAgYXBwbGljYXRpb24gc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbAotCSAgICAgIEpOREkgbmFtZSwgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uICBFYWNoIG9mIHRoZQotCSAgICAgIGxvY2FsIG5hbWVzIHNob3VsZCBiZSBtYXBwZWQgdG8gdGhpcyBzYW1lIGdsb2JhbCBuYW1lLgotCi0JICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW0tdmFsdWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlCi0JcGFyYW1ldGVyL3ZhbHVlIGxpc3RzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICBwYXJhbWV0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS12YWx1ZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYQotCSAgICBwYXJhbWV0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGF0aFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGVpdGhlciBhIHJlbGF0aXZlCi0JcGF0aCBvciBhbiBhYnNvbHV0ZSBwYXRoIHN0YXJ0aW5nIHdpdGggYSAiLyIuCi0KLQlJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgRGVwbG95bWVudCBGaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBEZXBsb3ltZW50IEZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sCi0JdGhvc2Ugc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZgotCXRoZSBEZXBsb3ltZW50IEZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcwotCWFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBwZXJzaXN0ZW5jZSBjb250ZXh0Ci0JICBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLQkgIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLQotCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkJICAtIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZSBuYW1lCi0JCSAgLSBhbiBvcHRpb25hbCBwZXJzaXN0ZW5jZSB1bml0IG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkLAotICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBwZXJzaXN0ZW5jZSB1bml0IGlzIGFzc3VtZWQuCi0JCSAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIKLQkJICAgIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHR5cGUgaXMgVHJhbnNhY3Rpb24gb3IKLQkJICAgIEV4dGVuZGVkLiAgSWYgbm90IHNwZWNpZmllZCwgVHJhbnNhY3Rpb24gaXMgYXNzdW1lZC4KLSAgICAgICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiBwZXJzaXN0ZW5jZSBwcm9wZXJ0aWVzCi0JCSAgLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotCi0JICBFeGFtcGxlczoKLQotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotICAgICAgICAgICAgICA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlQ29udGV4dAotICAgICAgICAgICAgICA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+Ci0gICAgICAgICAgICA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotCi0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWY+Ci0gICAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPm15UGVyc2lzdGVuY2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPgotICAgICAgICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1uYW1lPlBlcnNpc3RlbmNlVW5pdDEKLSAgICAgICAgICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtbmFtZT4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZT5FeHRlbmRlZDwvcGVyc2lzdGVuY2UtY29udGV4dC10eXBlPgotICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLQkgICAgdGhlIG5hbWUgb2YgYSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZTsgaXRzCi0JICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0JICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIob3IgQmVhblByb3ZpZGVyKSBtYXkgdXNlIHRoZQotICAgICAgICAgICAgZm9sbG93aW5nIHN5bnRheCB0byBhdm9pZCB0aGUgbmVlZCB0byByZW5hbWUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHVuaXRzIHRvIGhhdmUgdW5pcXVlIG5hbWVzIHdpdGhpbiBhIEphdmEgRUUgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgc3BlY2lmaWVzIHRoZSBwYXRobmFtZSBvZiB0aGUKLSAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGZvciB0aGUgcmVmZXJlbmNlZAotICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBhbmQgYXBwZW5kcyB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHVuaXQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGhuYW1lIGJ5ICMuIFRoZSBwYXRobmFtZSBpcwotICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBqYXIgZmlsZS4KLSAgICAgICAgICAgIEluIHRoaXMgbWFubmVyLCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cyB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IG5hbWUgbWF5IGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgd2hlbiB0aGUKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjYW5ub3QgY2hhbmdlIHBlcnNpc3RlbmNlIHVuaXQgbmFtZXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXByb3BlcnR5IgotCQkgICB0eXBlPSJqYXZhZWU6cHJvcGVydHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgcHJvcGVydGllcyBmb3IgdGhlIGNvbnRhaW5lciBvciBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgcHJvdmlkZXIuICBWZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcyBtYXkgYmUgaW5jbHVkZWQgaW4KLSAgICAgICAgICAgIHRoZSBzZXQgb2YgcHJvcGVydGllcy4gIFByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHJlY29nbml6ZWQKLSAgICAgICAgICAgIGJ5IGEgdmVuZG9yIG11c3QgYmUgaWdub3JlZC4gIEVudHJpZXMgdGhhdCBtYWtlIHVzZSBvZiB0aGUKLSAgICAgICAgICAgIG5hbWVzcGFjZSBqYXZheC5wZXJzaXN0ZW5jZSBhbmQgaXRzIHN1Ym5hbWVzcGFjZXMgbXVzdCBub3QKLSAgICAgICAgICAgIGJlIHVzZWQgZm9yIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzLiAgVGhlIG5hbWVzcGFjZQotICAgICAgICAgICAgamF2YXgucGVyc2lzdGVuY2UgaXMgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgc3BlY2lmaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHJhbnNhY3Rpb25hbAotCW5hdHVyZSBvZiBhIHBlcnNpc3RlbmNlIGNvbnRleHQgcmVmZXJlbmNlLgotCi0JVGhlIHZhbHVlIG9mIHRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUgZWxlbWVudCBtdXN0IGJlCi0Jb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICAgIFRyYW5zYWN0aW9uCi0gICAgICAgICAgICBFeHRlbmRlZAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUcmFuc2FjdGlvbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVuZGVkIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBwZXJzaXN0ZW5jZS11bml0LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLQkgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgcGVyc2lzdGVuY2UgdW5pdAotCSAgYXNzb2NpYXRlZCB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0KLQkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JCSAgLSB0aGUgcGVyc2lzdGVuY2UgdW5pdCByZWZlcmVuY2UgbmFtZQotCQkgIC0gYW4gb3B0aW9uYWwgcGVyc2lzdGVuY2UgdW5pdCBuYW1lLiAgSWYgbm90IHNwZWNpZmllZCwKLSAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgcGVyc2lzdGVuY2UgdW5pdCBpcyBhc3N1bWVkLgotCQkgIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKLQotCSAgRXhhbXBsZXM6Ci0KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZj4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZVVuaXQKLSAgICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPgotICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZj4KLQotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmPgotICAgICAgICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlVW5pdAotICAgICAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtbmFtZT5QZXJzaXN0ZW5jZVVuaXQxCi0gICAgICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LW5hbWU+Ci0gICAgICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotCSAgICB0aGUgbmFtZSBvZiBhIHBlcnNpc3RlbmNlIHVuaXQgcmVmZXJlbmNlOyBpdHMKLQkgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlcihvciBCZWFuUHJvdmlkZXIpIG1heSB1c2UgdGhlCi0gICAgICAgICAgICBmb2xsb3dpbmcgc3ludGF4IHRvIGF2b2lkIHRoZSBuZWVkIHRvIHJlbmFtZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgdW5pdHMgdG8gaGF2ZSB1bmlxdWUgbmFtZXMgd2l0aGluIGEgSmF2YSBFRSBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lIG9mIHRoZQotICAgICAgICAgICAgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgZm9yIHRoZSByZWZlcmVuY2VkCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IGFuZCBhcHBlbmRzIHRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAgdW5pdCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aG5hbWUgYnkgIy4gVGhlIHBhdGhuYW1lIGlzCi0gICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gY29tcG9uZW50IGphciBmaWxlLgotICAgICAgICAgICAgSW4gdGhpcyBtYW5uZXIsIG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzIHdpdGggdGhlIHNhbWUKLSAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgbmFtZSBtYXkgYmUgdW5pcXVlbHkgaWRlbnRpZmllZCB3aGVuIHRoZQotICAgICAgICAgICAgQXBwbGljYXRpb24gQXNzZW1ibGVyIGNhbm5vdCBjaGFuZ2UgcGVyc2lzdGVuY2UgdW5pdCBuYW1lcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JU3BlY2lmaWVzIGEgbmFtZS92YWx1ZSBwYWlyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVtb3RlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lCi0JICBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcy1hdXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlcy1hdXRoVHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgRGVwbG95bWVudCBDb21wb25lbnQKLQljb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yCi0Jd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCW9uIGJlaGFsZiBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSwKLQl0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLQlEZXBsb3llci4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBBcHBsaWNhdGlvbgotCSAgICBDb250YWluZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGljYXRpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXMtc2hhcmluZy1zY29wZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXMtc2hhcmluZy1zY29wZSB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zCi0Jb2J0YWluZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCi0JZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlIHNoYXJlZC4gVGhlIHZhbHVlLCBpZiBzcGVjaWZpZWQsCi0JbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgU2hhcmVhYmxlCi0JICAgIFVuc2hhcmVhYmxlCi0KLQlUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNoYXJlYWJsZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlVuc2hhcmVhYmxlIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzb3VyY2UtZW52LXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lCi0JICByZXNvdXJjZS1lbnYtdHlwZSBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdAotCSAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLQkgIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQotCSAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBvcHRpb25hbAotCSAgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUKLQkgIGV4cGVjdGVkIGJ5IHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLgotCi0JICBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLQkgIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvciBKYXZhQmVhbnMgcHJvcGVydGllcy4KLQotCSAgVGhlIHJlc291cmNlIGVudmlyb25tZW50IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLQkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0JICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0JICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLQkgIHRhcmdldC4KLQotCSAgRXhhbXBsZToKLQotCSAgPHJlc291cmNlLWVudi1yZWY+Ci0JICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotCSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotCSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlCi0JICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0JICA8L3Jlc291cmNlLWVudi1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QKLQkgICAgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZQotCSAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZQotCSAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IKLQkgICAgaW50ZXJmYWNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHJlc291cmNlLXJlZlR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQKLQkgIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCSAgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLCBhbiBvcHRpb25hbCBpbmRpY2F0aW9uIG9mCi0JICB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUsIGFuIG9wdGlvbmFsIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLQkgIChBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZgotCSAgdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQotCSAgKFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuCi0KLQkgIEl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZgotCSAgdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yIEphdmFCZWFucyBwcm9wZXJ0aWVzLgotCi0JICBUaGUgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLQkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0JICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0JICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLQkgIHRhcmdldC4KLQotCSAgRXhhbXBsZToKLQotCSAgPHJlc291cmNlLXJlZj4KLQkgICAgICA8cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotCSAgICAgIDxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+Ci0JICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0JICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0JICA8L3Jlc291cmNlLXJlZj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCi0JICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgRmlsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhCi0JICAgIHNvdXJjZS4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQKLQkgICAgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKLQkgICAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLWF1dGgiCi0JCSAgIHR5cGU9ImphdmFlZTpyZXMtYXV0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzLXNoYXJpbmctc2NvcGUiCi0JCSAgIHR5cGU9ImphdmFlZTpyZXMtc2hhcmluZy1zY29wZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotCi0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmdyb3VwIG5hbWU9InJlc291cmNlR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgZ3JvdXAgY29sbGVjdHMgZWxlbWVudHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCB0aGUKLQlKTkRJIHJlc291cmNlIGVsZW1lbnRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKLQkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKLQkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCi0KLQkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0JICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluamVjdGlvbi10YXJnZXQiCi0JCSAgIHR5cGU9ImphdmFlZTppbmplY3Rpb24tdGFyZ2V0VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpncm91cD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm9sZS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJvbGUtbmFtZVR5cGUgZGVzaWduYXRlcyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLQlUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGEgdG9rZW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJydW4tYXNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcnVuLWFzVHlwZSBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZQotCXVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgYSBjb21wb25lbnQuIEl0IGNvbnRhaW5zIGFuCi0Jb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZCB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpyb2xlLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhCi0Jc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncyBvciBhCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4KLQlvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZQotCWNvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlCi0Jc2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4KLQlhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQKLQkgICAgYXMgdGhlIHBhcmFtZXRlciB0byB0aGUKLQkgICAgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZCBvciB0aGUKLQkgICAgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1saW5rIgotCQkgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAotCSAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluCi0JICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUKLQkgICAgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1yb2xlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgc2VjdXJpdHktcm9sZVR5cGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotCSAgcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YKLQkgIHRoZSBzZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxzZWN1cml0eS1yb2xlPgotCSAgICAgIDxkZXNjcmlwdGlvbj4KLQkJICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKLQkJICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0JICAgICAgPC9kZXNjcmlwdGlvbj4KLQkgICAgICA8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0JICAgICAgPC9zZWN1cml0eS1yb2xlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpyb2xlLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RyaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGlzIGEgc3BlY2lhbCBzdHJpbmcgZGF0YXR5cGUgdGhhdCBpcyBkZWZpbmVkIGJ5IEphdmEgRUUgYXMKLQlhIGJhc2UgdHlwZSBmb3IgZGVmaW5pbmcgY29sbGFwc2VkIHN0cmluZ3MuIFdoZW4gc2NoZW1hcwotCXJlcXVpcmUgdHJhaWxpbmcvbGVhZGluZyBzcGFjZSBlbGltaW5hdGlvbiBhcyB3ZWxsIGFzCi0JY29sbGFwc2luZyB0aGUgZXhpc3Rpbmcgd2hpdGVzcGFjZSwgdGhpcyBiYXNlIHR5cGUgbWF5IGJlCi0JdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cnVlLWZhbHNlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBzaW1wbGUgdHlwZSBkZXNpZ25hdGVzIGEgYm9vbGVhbiB3aXRoIG9ubHkgdHdvCi0JcGVybWlzc2libGUgdmFsdWVzCi0KLQktIHRydWUKLQktIGZhbHNlCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTp4c2RCb29sZWFuVHlwZSI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSIodHJ1ZXxmYWxzZSkiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cmwtcGF0dGVyblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB1cmwtcGF0dGVyblR5cGUgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLgotCUl0IG11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZQotCVNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uIFRoaXMgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGJlIGluCi0JVVJMLWRlY29kZWQgZm9ybSBhbmQgbXVzdCBub3QgY29udGFpbiBDUigjeEQpIG9yIExGKCN4QSkuCi0JSWYgaXQgY29udGFpbnMgdGhvc2UgY2hhcmFjdGVycywgdGhlIGNvbnRhaW5lciBtdXN0IGluZm9ybQotCXRoZSBkZXZlbG9wZXIgd2l0aCBhIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuCi0JVGhlIGNvbnRhaW5lciBtdXN0IHByZXNlcnZlIGFsbCBjaGFyYWN0ZXJzIGluY2x1ZGluZyB3aGl0ZXNwYWNlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQW55VVJJVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmFueVVSSS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDphbnlVUkkiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQm9vbGVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpib29sZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDppbnRlZ2VyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTk1UT0tFTlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpOTVRPS0VOLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpub25OZWdhdGl2ZUludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnBvc2l0aXZlSW50ZWdlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpwb3NpdGl2ZUludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUU5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6UU5hbWUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6UU5hbWUiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkU3RyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnN0cmluZy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhjYjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMS4yIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2RzCTEuMTggMDIvMTMvMDYKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAgICAgIFUuUy5BCi0gICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSXQgc3BlY2lmaWVzIHRoZSBzZXQgb2Ygd2ViIHNlcnZpY2UKLQlkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSmF2YSBFRSBBcHBsaWNhdGlvbgotCVNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQKLQlzZXJ2aWNlcy4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotCSJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiIGluIHRoZSB3ZWIgc2VydmljZXMnIGphciBmaWxlLgotCi0JVXNlZCBpbjogd2Vic2VydmljZXMueG1sCi0KLQlBbGwgd2Vic2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZQotCXdlYnNlcnZpY2VzIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHZlcnNpb24KLQllbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDx3ZWJzZXJ2aWNlcyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQkJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCIKLQkgICAgICB2ZXJzaW9uPSIxLjIiPgotCSAgICAgIC4uLgotCSAgICA8L3dlYnNlcnZpY2VzPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mIHRoZQotCXNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgdGhlIEphdmEgRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlcyIgdHlwZT0iamF2YWVlOndlYnNlcnZpY2VzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYnNlcnZpY2VzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIHdlYiBzZXJ2aWNlcwotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHdlYiBzZXJ2aWNlCi0JZGVzY3JpcHRpb25zIHRoYXQgYXJlIHRvIGJlIGRlcGxveWVkIGludG8gdGhlIEphdmEgRUUgQXBwbGljYXRpb24gU2VydmVyCi0JYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGhleSBoYXZlIG9uIGNvbnRhaW5lciByZXNvdXJjZXMgYW5kIHNlcnZpY2VzLgotCi0JVXNlZCBpbjogd2Vic2VydmljZXMueG1sCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHdlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSBpZGVudGlmaWVzIHRoZSBjb2xsZWN0aW9uIG9mCi0JICBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDIG1hcHBpbmcuIFRoZQotCSAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOndlYnNlcnZpY2UtZGVzY3JpcHRpb24iLz4KLSAgICAgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhhbmRsZXItY2hhaW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWluLgotICAgICAgSGFuZGxlcmNoYWluIGNhbiBiZSBkZWZpbmVkIHN1Y2ggdGhhdCB0aGUgaGFuZGxlcnMgaW4gdGhlCi0gICAgICBoYW5kbGVyY2hhaW4gb3BlcmF0ZSxhbGwgcG9ydHMgb2YgYSBzZXJ2aWNlLCBvbiBhIHNwZWNpZmljCi0gICAgICBwb3J0IG9yIG9uIGEgbGlzdCBvZiBwcm90b2NvbC1iaW5kaW5ncy4gVGhlIGNob2ljZSBvZiBlbGVtZW50cwotICAgICAgc2VydmljZS1uYW1lLXBhdHRlcm4sIHBvcnQtbmFtZS1wYXR0ZXJuIGFuZCBwcm90b2NvbC1iaW5kaW5ncwotICAgICAgYXJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBoYW5kbGVycyBpbiBoYW5kbGVyLWNoYWluIGFyZQotICAgICAgZm9yIGEgc2VydmljZSwgcG9ydCBvciBwcm90b2NvbCBiaW5kaW5nLiBJZiBub25lIG9mIHRoZXNlCi0gICAgICBjaG9pY2VzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgaGFuZGxlci1jaGFpbiBlbGVtZW50IHRoZW4gdGhlCi0gICAgICBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhlIGhhbmRsZXItY2hhaW4gd2lsbCBiZSBhcHBsaWVkIG9uCi0gICAgICBldmVyeXRoaW5nLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1uYW1lLXBhdHRlcm4iCi0JCSAgICAgIHR5cGU9ImphdmFlZTpxbmFtZS1wYXR0ZXJuIiAvPgotICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtbmFtZS1wYXR0ZXJuIgotCQkgICAgICB0eXBlPSJqYXZhZWU6cW5hbWUtcGF0dGVybiIgLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm90b2NvbC1iaW5kaW5ncyIKLQkJICAgICAgdHlwZT0iamF2YWVlOnByb3RvY29sLWJpbmRpbmdMaXN0VHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhhbmRsZXItY2hhaW5zVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgaGFuZGxlci1jaGFpbnMgZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW5zIGFzc29jaWF0ZWQKLSAgICAgIHdpdGggdGhpcyBzZXJ2aWNlIG9yIHNlcnZpY2UgZW5kcG9pbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6aGFuZGxlci1jaGFpblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgYXNzb2NpYXRlcyBhIFdTREwgcG9ydCB3aXRoIGEgd2ViIHNlcnZpY2UKLQlpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhCi0JY29tcG9uZW50LCBvcHRpb25hbCBkZXNjcmlwdGlvbiwgb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBpY29uaWMKLQlyZXByZXNlbnRhdGlvbnMsIFdTREwgcG9ydCBRTmFtZSwgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UsIFNlcnZpY2UKLQlJbXBsZW1lbnRhdGlvbiBCZWFuLgotCi0JVGhpcyBlbGVtZW50IGFsc28gYXNzb2NpYXRlcyBhIFdTREwgc2VydmljZSB3aXRoIGEgSkFYLVdTIFByb3ZpZGVyCi0JaW1wbGVtZW50YXRpb24uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotCQkgICB0eXBlPSJqYXZhZWU6aWNvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBwb3J0LWNvbXBvbmVudC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEgcG9ydCBjb21wb25lbnQncwotCSAgICAgIG5hbWUuICBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlIG1vZHVsZSBwcm9kdWNlciB0byBuYW1lCi0JICAgICAgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUgbW9kdWxlJ3MgZGVwbG95bWVudAotCSAgICAgIGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIGFtb25nIHRoZSBwb3J0IGNvbXBvbmVudAotCSAgICAgIG5hbWVzIGRlZmluZWQgaW4gdGhlIHNhbWUgbW9kdWxlLgotCi0JICAgICAgVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotCSAgICAgIEV4YW1wbGU6Ci0JCSAgICAgIDxwb3J0LWNvbXBvbmVudC1uYW1lPkVtcGxveWVlU2VydmljZQotCQkgICAgICA8L3BvcnQtY29tcG9uZW50LW5hbWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1zZXJ2aWNlIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIG5hbWUgc3BhY2UgYW5kIGxvY2FsIG5hbWUgcGFydCBvZiB0aGUgV1NETAotCSAgICBzZXJ2aWNlIFFOYW1lLiBUaGlzIGlzIHJlcXVpcmVkIHRvIGJlIHNwZWNpZmllZCBmb3IKLQkgICAgcG9ydCBjb21wb25lbnRzIHRoYXQgYXJlIEpBWC1XUyBQcm92aWRlciBpbXBsZW1lbnRhdGlvbnMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1wb3J0IgotCQkgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIG5hbWUgc3BhY2UgYW5kIGxvY2FsIG5hbWUgcGFydCBvZiB0aGUgV1NETAotCSAgICBwb3J0IFFOYW1lLiBUaGlzIGlzIG5vdCByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQgZm9yIHBvcnQKLQkgICAgY29tcG9uZW50cyB0aGF0IGFyZSBKQVgtV1MgUHJvdmlkZXIgaW1wbGVtZW50YXRpb25zCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLW10b20iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgU09BUCBNVE9NL1hPUCBtZWNoYW5pc20gZm9yIGFuCi0gICAgICAgICAgICBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbi4KLQotCSAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm90b2NvbC1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpwcm90b2NvbC1iaW5kaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgdGhlIHByb3RvY29sIGJpbmRpbmcgdXNlZCBieSB0aGUgcG9ydC1jb21wb25lbnQuCi0JICAgIElmIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSBkZWZhdWx0IGJpbmRpbmcgaXMKLSAgICAgICAgICAgIHVzZWQgKFNPQVAgMS4xIG92ZXIgSFRUUCkKLQotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3J0IGNvbXBvbmVudCdzIFNlcnZpY2UgRW5kcG9pbnQKLQkgICAgICBJbnRlcmZhY2UuCi0KLQkgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0JICAgICAgRXhhbXBsZToKLQkJICAgICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0KLQkgICAgICBUaGlzIG1heSBub3QgYmUgc3BlY2lmaWVkIGluIGNhc2UgdGhlcmUgaXMgbm8gU2VydmljZQotCSAgICAgIEVucG9pbnQgSW50ZXJmYWNlIGFzIGlzIHRoZSBjYXNlIHdpdGggZGlyZWN0bHkgdXNpbmcgYW4KLQkgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB3aXRoIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uLgotCi0JICAgICAgV2hlbiB0aGUgcG9ydCBjb21wb25lbnQgaXMgYSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbgotCSAgICAgIHRoaXMgaXMgbm90IHNwZWNpZmllZC4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhbiIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtaW1wbC1iZWFuVHlwZSIvPgotCi0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKLQkJICAgICB0eXBlPSJqYXZhZWU6cG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJIFRvIGJlIHVzZWQgd2l0aCBKQVgtUlBDIGJhc2VkIHJ1bnRpbWUgb25seS4KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbnMiCi0JCSAgICAgdHlwZT0iamF2YWVlOmhhbmRsZXItY2hhaW5zVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJIFRvIGJlIHVzZWQgd2l0aCBKQVgtV1MgYmFzZWQgcnVudGltZSBvbmx5LgotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotCWluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLgotCi0JVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi0JICAgIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1oZWFkZXIiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RRTmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBRTmFtZSBvZiBhIFNPQVAgaGVhZGVyIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhlCi0JICAgIGhhbmRsZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1yb2xlIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQgdGhlCi0JICAgIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InByb3RvY29sLVVSSUFsaWFzVHlwZSI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgIERlZmluZXMgdGhlIHR5cGUgdGhhdCBpcyB1c2VkIGZvciBzcGVjaWZ5aW5nIHRva2VucyB0aGF0Ci0JICAgc3RhcnQgd2l0aCAjIyB3aGljaCBhcmUgdXNlZCB0byBhbGlhcyBleGlzdGluZyBzdGFuZGFyZAotCSAgIHByb3RvY29sIGJpbmRpbmdzIGFuZCBzdXBwb3J0IGFsaWFzZXMgZm9yIG5ldyBzdGFuZGFyZAotCSAgIGJpbmRpbmcgVVJJcyB0aGF0IGFyZSBpbnRyb2R1Y2VkIGluIGZ1dHVyZSBzcGVjaWZpY2F0aW9ucy4KLQotCSAgIFRoZSBmb2xsb3dpbmcgdG9rZW5zIGFsaWFzIHRoZSBzdGFuZGFyZCBwcm90b2NvbCBiaW5kaW5nCi0JICAgVVJJczoKLQotCSAgICMjU09BUDExX0hUVFAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHAiCi0JICAgIyNTT0FQMTFfSFRUUF9NVE9NID0KLSAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwP210b209dHJ1ZSIKLSAgICAgICAgICAgIyNTT0FQMTJfSFRUUCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iCi0gICAgICAgICAgICMjU09BUDEyX0hUVFBfTVRPTSA9Ci0JCSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvP210b209dHJ1ZSIKLSAgICAgICAgICAgIyNYTUxfSFRUUCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaHR0cCIKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iIyMuKyIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICBEZWZpbmVzIHRoZSB0eXBlIHVzZWQgZm9yIHNwZWNpZnlpbmcgYSBsaXN0IG9mCi0JICAgcHJvdG9jb2wtYmluZGluZ1R5cGUocykuIEZvciBlLmcuCi0KLQkgICAgIyNTT0FQMTFfSFRUUCAjI1NPQVAxMl9IVFRQICMjWE1MX0hUVFAKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9ImphdmFlZTpwcm90b2NvbC1iaW5kaW5nVHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InByb3RvY29sLWJpbmRpbmdUeXBlIj4KLSAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgRGVmaW5lcyB0aGUgdHlwZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBVUkkgZm9yIHRoZQotCSAgIHByb3RvY29sIGJpbmRpbmcgdXNlZCBieSB0aGUgcG9ydC1jb21wb25lbnQuICBGb3IKLQkgICBwb3J0YWJpbGl0eSBvbmUgY291bGQgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRva2VucyB0aGF0Ci0JICAgYWxpYXMgdGhlIHN0YW5kYXJkIGJpbmRpbmcgdHlwZXM6Ci0KLQkgICAgIyNTT0FQMTFfSFRUUAotCSAgICAjI1NPQVAxMV9IVFRQX01UT00KLQkgICAgIyNTT0FQMTJfSFRUUAotCSAgICAjI1NPQVAxMl9IVFRQX01UT00KLQkgICAgIyNYTUxfSFRUUAotCi0JICAgT3RoZXIgc3BlY2lmaWNhdGlvbnMgY291bGQgZGVmaW5lIHRva2VucyB0aGF0IHN0YXJ0IHdpdGggIyMKLQkgICB0byBhbGlhcyBuZXcgc3RhbmRhcmQgYmluZGluZyBVUklzIHRoYXQgYXJlIGludHJvZHVjZWQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0ieHNkOmFueVVSSSBqYXZhZWU6cHJvdG9jb2wtVVJJQWxpYXNUeXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icW5hbWUtcGF0dGVybiI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIFFOYW1lIHBhdHRlcm4gaW4gdGhlCi0JICAgICBhdHRyaWJ1dGUgc2VydmljZS1uYW1lLXBhdHRlcm4gYW5kIHBvcnQtbmFtZS1wYXR0ZXJuIGluCi0JICAgICB0aGUgaGFuZGxlci1jaGFpbiBlbGVtZW50Ci0KLQkgICAgIEZvciBleGFtcGxlLCB0aGUgdmFyaW91cyBmb3JtcyBhY2NlcHRhYmxlIGhlcmUgZm9yCi0JICAgICBzZXJ2aWNlLW5hbWUtcGF0dGVybiBhdHRyaWJ1dGUgaW4gaGFuZGxlci1jaGFpbiBlbGVtZW50Ci0JICAgICBhcmUgOgotCi0JICAgICBFeGFjdCBOYW1lOiBzZXJ2aWNlLW5hbWUtcGF0dGVybj0ibnMxOkVjaG9TZXJ2aWNlIgotCi0JCSBJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzCi0JCSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgd2l0aAotCQkgdGhpcyBleGFjdCBzZXJ2aWNlIG5hbWUuIFRoZSBuYW1lc3BhY2UgcHJlZml4IG11c3QKLQkJIGhhdmUgYmVlbiBkZWNsYXJlZCBpbiBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotCQkgYXR0cmlidXRlIGluIGVpdGhlciB0aGUgc3RhcnQtdGFnIG9mIHRoZSBlbGVtZW50Ci0JCSB3aGVyZSB0aGUgcHJlZml4IGlzIHVzZWQgb3IgaW4gYW4gYW4gYW5jZXN0b3IKLQkJIGVsZW1lbnQgKGkuZS4gYW4gZWxlbWVudCBpbiB3aG9zZSBjb250ZW50IHRoZQotCQkgcHJlZml4ZWQgbWFya3VwIG9jY3VycykKLQotCSAgICAgUGF0dGVybiA6IHNlcnZpY2UtbmFtZS1wYXR0ZXJuPSJuczE6RWNob1NlcnZpY2UqIgotCi0JCSBJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzCi0JCSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgd2hvc2UKLQkJIFNlcnZpY2UgbmFtZXMgYXJlIGxpa2UgRWNob1NlcnZpY2UxLCBFY2hvU2VydmljZUZvbwotCQkgZXRjLiBUaGUgbmFtZXNwYWNlIHByZWZpeCBtdXN0IGhhdmUgYmVlbiBkZWNsYXJlZCBpbgotCQkgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlIGluIGVpdGhlciB0aGUKLQkJIHN0YXJ0LXRhZyBvZiB0aGUgZWxlbWVudCB3aGVyZSB0aGUgcHJlZml4IGlzIHVzZWQgb3IKLQkJIGluIGFuIGFuIGFuY2VzdG9yIGVsZW1lbnQgKGkuZS4gYW4gZWxlbWVudCBpbiB3aG9zZQotCQkgY29udGVudCB0aGUgcHJlZml4ZWQgbWFya3VwIG9jY3VycykKLQotCSAgICAgV2lsZCBDYXJkIDogc2VydmljZS1uYW1lLXBhdHRlcm49IioiCi0KLQkJSW4gdGhpcyBjYXNlLCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhpcyBoYW5kbGVyLWNoYWluCi0JCWVsZW1lbnQgd2lsbCBhcHBseSB0byBwb3J0cyBvZiBhbGwgc2VydmljZSBuYW1lcy4KLQotCSAgICBUaGUgc2FtZSBjYW4gYmUgYXBwbGllZCB0byBwb3J0LW5hbWUgYXR0cmlidXRlIGluCi0JICAgIGhhbmRsZXItY2hhaW4gZWxlbWVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJcKnwoW1xpLVs6XV1bXGMtWzpdXSo6KT9bXGktWzpdXVtcYy1bOl1dKlwqPyIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IGRlZmluZXMgdGhlIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotCUEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgYW4gRUpCIGJlYW4gY2xhc3Mgb3IgSkFYLVJQQyB3ZWIKLQljb21wb25lbnQuICBFeGlzdGluZyBFSkIgaW1wbGVtZW50YXRpb25zIGFyZSBleHBvc2VkIGFzIGEgd2ViIHNlcnZpY2UKLQl1c2luZyBhbiBlamItbGluay4KLQotCVVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1saW5rVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbGluayIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbGlua1R5cGUiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldC1saW5rVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgc2VydmxldC1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudAotCSAgdG8gc3BlY2lmeSB0aGF0IGEgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuIGlzIGRlZmluZWQgYXMgYQotCSAgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50LgotCi0JICBUaGUgdmFsdWUgb2YgdGhlIHNlcnZsZXQtbGluayBlbGVtZW50IG11c3QgYmUgdGhlIHNlcnZsZXQtbmFtZSBvZgotCSAgYSBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQgaW4gdGhlIHNhbWUgV0FSIGZpbGUuCi0KLQkgIFVzZWQgaW46IHNlcnZpY2UtaW1wbC1iZWFuCi0KLQkgIEV4YW1wbGU6Ci0JCSAgPHNlcnZsZXQtbGluaz5TdG9ja1F1b3RlU2VydmljZTwvc2VydmxldC1saW5rPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgZG9jdW1lbnQgZmlsZQotCWFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMKLQlkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlCi0Jd2Vic2VydmljZS1kZXNjcmlwdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBtb2R1bGUuCi0KLQlBbGwgV1NETCBmaWxlIHBvcnRzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydC1jb21wb25lbnQgZWxlbWVudAotCWRlZmluZWQuCi0KLQlVc2VkIGluOiB3ZWJzZXJ2aWNlcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmRpc3BsYXktbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLQkJICAgdHlwZT0iamF2YWVlOmljb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgotCSAgICBwb3J0LWNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgV1NETCBmaWxlIGFuZCBKQVgtUlBDCi0JICAgIG1hcHBpbmcuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtZmlsZSIKLQkJICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIFdTREwgZmlsZSBpbiB0aGUKLQkgICAgbW9kdWxlLiAgVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF4cnBjLW1hcHBpbmctZmlsZSIKLQkJICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLQkgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgICBUaGlzIGlzIG5vdCByZXF1aXJlZCB3aGVuIEpBWC1XUyBiYXNlZCBydW50aW1lIGlzIHVzZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQiCi0JCSAgIHR5cGU9ImphdmFlZTpwb3J0LWNvbXBvbmVudFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6a2V5IG5hbWU9InBvcnQtY29tcG9uZW50X2hhbmRsZXItbmFtZS1rZXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmhhbmRsZXIiLz4KLQkgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpoYW5kbGVyLW5hbWUiLz4KLQk8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNlcnZpY2VzVHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDprZXkgbmFtZT0icG9ydC1jb21wb25lbnQtbmFtZS1rZXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICAgPCFbQ0RBVEFbCi0KLQkJVGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0Ci0JCWNvbXBvbmVudCdzIG5hbWUuICBUaGlzIG5hbWUgaXMgYXNzaWduZWQgYnkgdGhlIG1vZHVsZQotCQlwcm9kdWNlciB0byBuYW1lIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4gaW4gdGhlCi0JCW1vZHVsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkJYW1vbmcgdGhlIHBvcnQgY29tcG9uZW50IG5hbWVzIGRlZmluZWQgaW4gdGhlIHNhbWUgbW9kdWxlLgotCi0JCVVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLQkJRXhhbXBsZToKLQkJCTxwb3J0LWNvbXBvbmVudC1uYW1lPkVtcGxveWVlU2VydmljZQotCQkJPC9wb3J0LWNvbXBvbmVudC1uYW1lPgotCi0JCV1dPgotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpwb3J0LWNvbXBvbmVudCIvPgotCSAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOnBvcnQtY29tcG9uZW50LW5hbWUiLz4KLQk8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iMS4yIgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS4yLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjBkZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMS4yIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkcwkxLjE5IDAyLzEzLzA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnQtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLQlvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotCXRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLQlJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0JYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKLQkgICAgSmF2YSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG9mIGEKLQkgICAgV1NETCBwb3J0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLW10b20iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgU09BUCBNVE9NL1hPUCBtZWNoYW5pc20gb24gdGhlIGNsaWVudAotCSAgICBzaWRlIGZvciBhIHBvcnQtY29tcG9uZW50LgotCi0JICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtbGluayIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcG9ydC1jb21wb25lbnQtbGluayBlbGVtZW50IGxpbmtzIGEgcG9ydC1jb21wb25lbnQtcmVmCi0JICAgIHRvIGEgc3BlY2lmaWMgcG9ydC1jb21wb25lbnQgcmVxdWlyZWQgdG8gYmUgbWFkZSBhdmFpbGFibGUKLQkgICAgYnkgYSBzZXJ2aWNlIHJlZmVyZW5jZS4KLQotCSAgICBUaGUgdmFsdWUgb2YgYSBwb3J0LWNvbXBvbmVudC1saW5rIG11c3QgYmUgdGhlCi0JICAgIHBvcnQtY29tcG9uZW50LW5hbWUgb2YgYSBwb3J0LWNvbXBvbmVudCBpbiB0aGUgc2FtZSBtb2R1bGUKLQkgICAgb3IgYW5vdGhlciBtb2R1bGUgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24gdW5pdC4gVGhlIHN5bnRheAotCSAgICBmb3Igc3BlY2lmaWNhdGlvbiBmb2xsb3dzIHRoZSBzeW50YXggZGVmaW5lZCBmb3IgZWpiLWxpbmsKLQkgICAgaW4gdGhlIEVKQiAyLjAgc3BlY2lmaWNhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJzZXJ2aWNlLXJlZkdyb3VwIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmtleSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyLW5hbWUta2V5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpoYW5kbGVyIi8+Ci0JICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6aGFuZGxlci1uYW1lIi8+Ci0JPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZpY2UtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSByZWZlcmVuY2UgdG8gYSBXZWIKLQlzZXJ2aWNlLiBJdCBjb250YWlucyBvcHRpb25hbCBkZXNjcmlwdGlvbiwgZGlzcGxheSBuYW1lIGFuZAotCWljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwKLQlhbiBvcHRpb25hbCBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLCBhbiBvcHRpb25hbCBzZXQKLQlvZiBKQVgtUlBDIG1hcHBpbmdzLCBhbiBvcHRpb25hbCBRTmFtZSBmb3IgdGhlIHNlcnZpY2UgZWxlbWVudCwKLQlhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkCi0JYnkgdGhlIGNvbnRhaW5lciB0byBhIFdTREwgcG9ydCwgYW5kIGFuIG9wdGlvbmFsIHNldCBvZiBoYW5kbGVycy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtcmVmLW5hbWUgZWxlbWVudCBkZWNsYXJlcyBsb2dpY2FsIG5hbWUgdGhhdCB0aGUKLQkgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQKLQkgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc2VydmljZSByZWZlcmVuY2UgbmFtZXMgc3RhcnQgd2l0aAotCSAgICAic2VydmljZS8iLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAgICBuYW1lIG9mIHRoZSBKQVgtUlBDIFNlcnZpY2UgaW50ZXJmYWNlIHRoZSBjbGllbnQgZGVwZW5kcyBvbi4KLQkgICAgSW4gbW9zdCBjYXNlcyB0aGUgdmFsdWUgd2lsbCBiZSBqYXZheC54bWwucnBjLlNlcnZpY2UuICBBIEpBWC1SUEMKLQkgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLXJlZi10eXBlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UtcmVmCi0JICAgIGVsZW1lbnQgdGhhdCBpcyBpbmplY3RlZCBvciByZXR1cm5lZCB3aGVuIGEgSk5ESSBsb29rdXAgaXMgZG9uZS4KLQkgICAgVGhpcyBtdXN0IGJlIGVpdGhlciBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIFNlcnZpY2UgY2xhc3Mgb3IKLQkgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIGNsYXNzLgotCSAgICBUaGlzIGlzIG9ubHkgdXNlZCB3aXRoIEpBWC1XUyBydW50aW1lIHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nCi0JICAgIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gY2FuIGJlIHVzZWQgdG8gZGVub3RlIGJvdGggYSBTZXJ2aWNlCi0JICAgIG9yIGEgUG9ydC4KLQotCSAgICBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIHR5cGUgb2Ygc2VydmljZS1yZWYgZWxlbWVudAotCSAgICB0aGF0IGlzIGluamVjdGVkIG9yIHJldHVybmVkIHdoZW4gYSBKTkRJIGxvb2t1cCBpcyBkb25lIGlzCi0JICAgIGFsd2F5cyBhIFNlcnZpY2UgaW50ZXJmYWNlL2NsYXNzLgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtZmlsZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZEFueVVSSVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdzZGwtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBVUkkgbG9jYXRpb24gb2YgYSBXU0RMCi0JICAgIGZpbGUuIFRoZSBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF4cnBjLW1hcHBpbmctZmlsZSIKLQkJICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLQkgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZSBmaWxlLgotCi0JICAgIFRoaXMgaXMgbm90IHJlcXVpcmVkIHdoZW4gSkFYLVdTIGJhc2VkIHJ1bnRpbWUgaXMgdXNlZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RRTmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtcW5hbWUgZWxlbWVudCBkZWNsYXJlcyB0aGUgc3BlY2lmaWMgV1NETCBzZXJ2aWNlCi0JICAgIGVsZW1lbnQgdGhhdCBpcyBiZWluZyByZWZlcmVkIHRvLiAgSXQgaXMgbm90IHNwZWNpZmllZCBpZiBubwotCSAgICB3c2RsLWZpbGUgaXMgZGVjbGFyZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudC1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpwb3J0LWNvbXBvbmVudC1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLQkgICAgb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQkgICAgdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotCSAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0JICAgIGJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpjaG9pY2U+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKLQkJICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSIKLQkJICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCSAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4KLQkJYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlCi0JCUhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZQotCQloYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGFsbCBwb3J0cyBvZiB0aGUKLQkJc2VydmljZS4KLQotCQlUbyBiZSB1c2VkIHdpdGggSkFYLVJQQyBiYXNlZCBydW50aW1lIG9ubHkuCi0KLQkgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPC94c2Q6ZWxlbWVudD4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNoYWlucyIKLQkJICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluc1R5cGUiCi0JCSAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCSBUbyBiZSB1c2VkIHdpdGggSkFYLVdTIGJhc2VkIHJ1bnRpbWUgb25seS4KLQkgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgaGFuZGxlci1jaGFpbiBlbGVtZW50IGRlZmluZXMgdGhlIGhhbmRsZXJjaGFpbi4KLSAgICAgIEhhbmRsZXJjaGFpbiBjYW4gYmUgZGVmaW5lZCBzdWNoIHRoYXQgdGhlIGhhbmRsZXJzIGluIHRoZQotICAgICAgaGFuZGxlcmNoYWluIG9wZXJhdGUsYWxsIHBvcnRzIG9mIGEgc2VydmljZSwgb24gYSBzcGVjaWZpYwotICAgICAgcG9ydCBvciBvbiBhIGxpc3Qgb2YgcHJvdG9jb2wtYmluZGluZ3MuIFRoZSBjaG9pY2Ugb2YgZWxlbWVudHMKLSAgICAgIHNlcnZpY2UtbmFtZS1wYXR0ZXJuLCBwb3J0LW5hbWUtcGF0dGVybiBhbmQgcHJvdG9jb2wtYmluZGluZ3MKLSAgICAgIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgaGFuZGxlcnMgaW4gaGFuZGxlci1jaGFpbiBhcmUKLSAgICAgIGZvciBhIHNlcnZpY2UsIHBvcnQgb3IgcHJvdG9jb2wgYmluZGluZy4gSWYgbm9uZSBvZiB0aGVzZQotICAgICAgY2hvaWNlcyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCB0aGVuIHRoZQotICAgICAgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoZSBoYW5kbGVyLWNoYWluIHdpbGwgYmUgYXBwbGllZCBvbgotICAgICAgZXZlcnl0aGluZy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtbmFtZS1wYXR0ZXJuIgotCQkgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfcW5hbWUtcGF0dGVybiIgLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUtcGF0dGVybiIKLQkgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZl9xbmFtZS1wYXR0ZXJuIiAvPgotICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3RvY29sLWJpbmRpbmdzIgotCSAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmX3Byb3RvY29sLWJpbmRpbmdMaXN0VHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfaGFuZGxlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmX2hhbmRsZXItY2hhaW5zVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgaGFuZGxlci1jaGFpbnMgZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW5zIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAgICBzZXJ2aWNlIG9yIHNlcnZpY2UgZW5kcG9pbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfaGFuZGxlci1jaGFpblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLQlpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLQlwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkCi0Jd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi0KLQlVc2VkIGluOiBzZXJ2aWNlLXJlZgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlcgotCSAgICBpbXBsZW1lbnRhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqYXZhZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLWhlYWRlciIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFFOYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZAotCSAgICBieSB0aGUgaGFuZGxlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0Ci0JICAgIHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcG9ydC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgV1NETCBwb3J0LW5hbWUgdGhhdCBhCi0JICAgIGhhbmRsZXIgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNlcnZpY2UtcmVmX3Byb3RvY29sLVVSSUFsaWFzVHlwZSI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgIERlZmluZXMgdGhlIHR5cGUgdGhhdCBpcyB1c2VkIGZvciBzcGVjaWZ5aW5nIHRva2VucyB0aGF0Ci0JICAgc3RhcnQgd2l0aCAjIyB3aGljaCBhcmUgdXNlZCB0byBhbGlhcyBleGlzdGluZyBzdGFuZGFyZAotCSAgIHByb3RvY29sIGJpbmRpbmdzIGFuZCBzdXBwb3J0IGFsaWFzZXMgZm9yIG5ldyBzdGFuZGFyZAotCSAgIGJpbmRpbmcgVVJJcyB0aGF0IGFyZSBpbnRyb2R1Y2VkIGluIGZ1dHVyZSBzcGVjaWZpY2F0aW9ucy4KLQotCSAgIFRoZSBmb2xsb3dpbmcgdG9rZW5zIGFsaWFzIHRoZSBzdGFuZGFyZCBwcm90b2NvbCBiaW5kaW5nCi0JICAgVVJJczoKLQotCSAgICMjU09BUDExX0hUVFAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHAiCi0JICAgIyNTT0FQMTFfSFRUUF9NVE9NID0KLSAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwP210b209dHJ1ZSIKLSAgICAgICAgICAgIyNTT0FQMTJfSFRUUCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iCi0gICAgICAgICAgICMjU09BUDEyX0hUVFBfTVRPTSA9Ci0gICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8/bXRvbT10cnVlIgotICAgICAgICAgICAjI1hNTF9IVFRQID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9odHRwIgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIjIy4rIi8+Ci0gICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNlcnZpY2UtcmVmX3Byb3RvY29sLWJpbmRpbmdMaXN0VHlwZSI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgIERlZmluZXMgdGhlIHR5cGUgdXNlZCBmb3Igc3BlY2lmeWluZyBhIGxpc3Qgb2YKLQkgICBwcm90b2NvbC1iaW5kaW5nVHlwZShzKS4gRm9yIGUuZy4KLQotCSAgICAjI1NPQVAxMV9IVFRQICMjU09BUDEyX0hUVFAgIyNYTUxfSFRUUAotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmX3Byb3RvY29sLWJpbmRpbmdUeXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ic2VydmljZS1yZWZfcHJvdG9jb2wtYmluZGluZ1R5cGUiPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICBEZWZpbmVzIHRoZSB0eXBlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlIFVSSSBmb3IgdGhlCi0JICAgcHJvdG9jb2wgYmluZGluZyB1c2VkIGJ5IHRoZSBwb3J0LWNvbXBvbmVudC4gIEZvcgotCSAgIHBvcnRhYmlsaXR5IG9uZSBjb3VsZCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgdG9rZW5zIHRoYXQKLQkgICBhbGlhcyB0aGUgc3RhbmRhcmQgYmluZGluZyB0eXBlczoKLQotCSAgICAjI1NPQVAxMV9IVFRQCi0JICAgICMjU09BUDExX0hUVFBfTVRPTQotICAgICAgICAgICAgIyNTT0FQMTJfSFRUUAotICAgICAgICAgICAgIyNTT0FQMTJfSFRUUF9NVE9NCi0gICAgICAgICAgICAjI1hNTF9IVFRQCi0KLQkgICBPdGhlciBzcGVjaWZpY2F0aW9ucyBjb3VsZCBkZWZpbmUgdG9rZW5zIHRoYXQgc3RhcnQgd2l0aCAjIwotCSAgIHRvIGFsaWFzIG5ldyBzdGFuZGFyZCBiaW5kaW5nIFVSSXMgdGhhdCBhcmUgaW50cm9kdWNlZC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2Q6YW55VVJJIGphdmFlZTpzZXJ2aWNlLXJlZl9wcm90b2NvbC1VUklBbGlhc1R5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9xbmFtZS1wYXR0ZXJuIj4KLSAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgUU5hbWUgcGF0dGVybiBpbiB0aGUKLQkgICAgIGF0dHJpYnV0ZSBzZXJ2aWNlLW5hbWUtcGF0dGVybiBhbmQgcG9ydC1uYW1lLXBhdHRlcm4gaW4KLQkgICAgIHRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQKLQotCSAgICAgRm9yIGV4YW1wbGUsIHRoZSB2YXJpb3VzIGZvcm1zIGFjY2VwdGFibGUgaGVyZSBmb3IKLQkgICAgIHNlcnZpY2UtbmFtZS1wYXR0ZXJuIGF0dHJpYnV0ZSBpbiBoYW5kbGVyLWNoYWluIGVsZW1lbnQKLQkgICAgIGFyZSA6Ci0KLQkgICAgIEV4YWN0IE5hbWU6IHNlcnZpY2UtbmFtZS1wYXR0ZXJuPSJuczE6RWNob1NlcnZpY2UiCi0KLQkJIEluIHRoaXMgY2FzZSwgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoaXMKLQkJIGhhbmRsZXItY2hhaW4gZWxlbWVudCB3aWxsIGFwcGx5IHRvIGFsbCBwb3J0cyB3aXRoCi0JCSB0aGlzIGV4YWN0IHNlcnZpY2UgbmFtZS4gVGhlIG5hbWVzcGFjZSBwcmVmaXggbXVzdAotCQkgaGF2ZSBiZWVuIGRlY2xhcmVkIGluIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0JCSBhdHRyaWJ1dGUgaW4gZWl0aGVyIHRoZSBzdGFydC10YWcgb2YgdGhlIGVsZW1lbnQKLQkJIHdoZXJlIHRoZSBwcmVmaXggaXMgdXNlZCBvciBpbiBhbiBhbiBhbmNlc3RvcgotCQkgZWxlbWVudCAoaS5lLiBhbiBlbGVtZW50IGluIHdob3NlIGNvbnRlbnQgdGhlCi0JCSBwcmVmaXhlZCBtYXJrdXAgb2NjdXJzKQotCi0JICAgICBQYXR0ZXJuIDogc2VydmljZS1uYW1lLXBhdHRlcm49Im5zMTpFY2hvU2VydmljZSoiCi0KLQkJIEluIHRoaXMgY2FzZSwgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoaXMKLQkJIGhhbmRsZXItY2hhaW4gZWxlbWVudCB3aWxsIGFwcGx5IHRvIGFsbCBwb3J0cyB3aG9zZQotCQkgU2VydmljZSBuYW1lcyBhcmUgbGlrZSBFY2hvU2VydmljZTEsIEVjaG9TZXJ2aWNlRm9vCi0JCSBldGMuIFRoZSBuYW1lc3BhY2UgcHJlZml4IG11c3QgaGF2ZSBiZWVuIGRlY2xhcmVkIGluCi0JCSBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGUgaW4gZWl0aGVyIHRoZQotCQkgc3RhcnQtdGFnIG9mIHRoZSBlbGVtZW50IHdoZXJlIHRoZSBwcmVmaXggaXMgdXNlZCBvcgotCQkgaW4gYW4gYW4gYW5jZXN0b3IgZWxlbWVudCAoaS5lLiBhbiBlbGVtZW50IGluIHdob3NlCi0JCSBjb250ZW50IHRoZSBwcmVmaXhlZCBtYXJrdXAgb2NjdXJzKQotCi0JICAgICBXaWxkIENhcmQgOiBzZXJ2aWNlLW5hbWUtcGF0dGVybj0iKiIKLQotCQlJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzIGhhbmRsZXItY2hhaW4KLQkJZWxlbWVudCB3aWxsIGFwcGx5IHRvIHBvcnRzIG9mIGFsbCBzZXJ2aWNlIG5hbWVzLgotCi0JICAgIFRoZSBzYW1lIGNhbiBiZSBhcHBsaWVkIHRvIHBvcnQtbmFtZSBhdHRyaWJ1dGUgaW4KLQkgICAgaGFuZGxlci1jaGFpbiBlbGVtZW50LgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlwqfChbXGktWzpdXVtcYy1bOl1dKjopP1tcaS1bOl1dW1xjLVs6XV0qXCo/Ii8+Ci0gICAgIDwveHNkOnJlc3RyaWN0aW9uPgotCi0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MGE3NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMi4wIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylqc3BfMl8wLnhzZHMJMS4xNyAwMy8xOC8wMwotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEpTUCAyLjAgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICB0eXBlcy4gIFRoZSBKU1AgMi4wIHNjaGVtYSBjb250YWlucyBhbGwgdGhlIHNwZWNpYWwKLSAgICAgIHN0cnVjdHVyZXMgYW5kIGRhdGF0eXBlcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gdXNlIEpTUCBmaWxlcwotICAgICAgZnJvbSBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2NoZW1hIGlzIHVzZWQgYnkgdGhlIHdlYi1hcHBfMl80LnhzZAotICAgICAgZmlsZSB0byBkZWZpbmUgSlNQIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpzcC1jb25maWdUeXBlIGlzIHVzZWQgdG8gcHJvdmlkZSBnbG9iYWwgY29uZmlndXJhdGlvbgotCWluZm9ybWF0aW9uIGZvciB0aGUgSlNQIGZpbGVzIGluIGEgd2ViIGFwcGxpY2F0aW9uLiBJdCBoYXMKLQl0d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYiIKLQkJICAgdHlwZT0iajJlZTp0YWdsaWJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwIgotCQkgICB0eXBlPSJqMmVlOmpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtZmlsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZQotCXdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGJlZ2lubmluZyB3aXRoIGEgYC8nLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6cGF0aFR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgotCWZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4KLQlBbGwgZmlsZXMgc28gZGVzY3JpYmVkIGFyZSBkZWVtZWQgdG8gYmUgSlNQIGZpbGVzLiAgVGhlCi0JZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgZGVzY3JpYmVkOgotCi0JICAgIC0gQ29udHJvbCB3aGV0aGVyIEVMIGlzIGlnbm9yZWQKLQkgICAgLSBDb250cm9sIHdoZXRoZXIgc2NyaXB0aW5nIGVsZW1lbnRzIGFyZSBpbnZhbGlkCi0JICAgIC0gSW5kaWNhdGUgcGFnZUVuY29kaW5nIGluZm9ybWF0aW9uLgotCSAgICAtIEluZGljYXRlIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCBkb2N1bWVudCAoWE1MKQotCSAgICAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbC1pZ25vcmVkIgotCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgc2V0IHRoZSBpc0VMSWdub3JlZAotCSAgICBwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHRoZQotCSAgICBFTCBldmFsdWF0aW9uIGlzIGVuYWJsZWQgZm9yIFdlYiBBcHBsaWNhdGlvbnMgdXNpbmcKLQkgICAgYSBTZXJ2bGV0IDIuNCBvciBncmVhdGVyIHdlYi54bWwsIGFuZCBkaXNhYmxlZAotCSAgICBvdGhlcndpc2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFnZS1lbmNvZGluZyIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YgdGhlCi0JICAgIHBhZ2VFbmNvZGluZyBwYWdlIGRpcmVjdGl2ZS4gIEl0IGlzIGEKLQkgICAgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MKLQkgICAgaW4gdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlCi0JICAgIG9mIGEgSlNQIHBhZ2UgYW5kIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAgICBtYXRjaGluZyB0aGUgcGFnZS4gIEl0IGlzIGFsc28gYSB0cmFuc2xhdGlvbi10aW1lCi0JICAgIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50IGVuY29kaW5ncyBpbiB0aGUgcHJvbG9nCi0JICAgIG9yIHRleHQgZGVjbGFyYXRpb24gb2YgYSBkb2N1bWVudCBpbiBYTUwgc3ludGF4IGFuZAotCSAgICBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGRvY3VtZW50LgotCSAgICBJdCBpcyBsZWdhbCB0byBuYW1lIHRoZSBzYW1lIGVuY29kaW5nIHRocm91Z2gKLQkgICAgbXVsaXRwbGUgbWVjaGFuaXNtcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY3JpcHRpbmctaW52YWxpZCIKLQkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IGRpc2FibGUgc2NyaXB0aW5nIGluIGEKLQkgICAgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgc2NyaXB0aW5nIGlzCi0JICAgIGVuYWJsZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaXMteG1sIgotCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBJZiB0cnVlLCBkZW5vdGVzIHRoYXQgdGhlIGdyb3VwIG9mIHJlc291cmNlcwotCSAgICB0aGF0IG1hdGNoIHRoZSBVUkwgcGF0dGVybiBhcmUgSlNQIGRvY3VtZW50cywKLQkgICAgYW5kIHRodXMgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBYTUwgZG9jdW1lbnRzLgotCSAgICBJZiBmYWxzZSwgdGhlIHJlc291cmNlcyBhcmUgYXNzdW1lZCB0byBub3QKLQkgICAgYmUgSlNQIGRvY3VtZW50cywgdW5sZXNzIHRoZXJlIGlzIGFub3RoZXIKLQkgICAgcHJvcGVydHkgZ3JvdXAgdGhhdCBpbmRpY2F0ZXMgb3RoZXJ3aXNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluY2x1ZGUtcHJlbHVkZSIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLQkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotCSAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCi0JICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLQkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAotCSAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLWNvZGEiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5jbHVkZS1jb2RhIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0JICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLQkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0JICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKLQkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnbGliVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRhZ2xpYlR5cGUgZGVmaW5lcyB0aGUgc3ludGF4IGZvciBkZWNsYXJpbmcgaW4KLQl0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRoYXQgYSB0YWcgbGlicmFyeSBpcwotCWF2YWlsYWJsZSB0byB0aGUgYXBwbGljYXRpb24uICBUaGlzIGNhbiBiZSBkb25lCi0JdG8gb3ZlcnJpZGUgaW1wbGljaXQgbWFwIGVudHJpZXMgZnJvbSBUTEQgZmlsZXMgYW5kCi0JZnJvbSB0aGUgY29udGFpbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi11cmkiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGEKLQkgICAgdGFnIGxpYnJhcnkgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiAgVGhlIGJvZHkKLQkgICAgb2YgdGhlIHRhZ2xpYi11cmkgZWxlbWVudCBtYXkgYmUgZWl0aGVyIGFuCi0JICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4KLQkgICAgVGhlcmUgc2hvdWxkIGJlIG5vIGVudHJpZXMgaW4gd2ViLnhtbCB3aXRoIHRoZQotCSAgICBzYW1lIHRhZ2xpYi11cmkgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItbG9jYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICB0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi0JICAgIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKLQkgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5Ci0JICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8xLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjMzODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qc3BfMl8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMi4xIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylqc3BfMl8xLnhzZHMJMS41IDA4LzExLzA1Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEpTUCAyLjEgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICB0eXBlcy4gIFRoZSBKU1AgMi4xIHNjaGVtYSBjb250YWlucyBhbGwgdGhlIHNwZWNpYWwKLSAgICAgIHN0cnVjdHVyZXMgYW5kIGRhdGF0eXBlcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gdXNlIEpTUCBmaWxlcwotICAgICAgZnJvbSBhIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2NoZW1hIGlzIHVzZWQgYnkgdGhlIHdlYi1hcHBfMl81LnhzZAotICAgICAgZmlsZSB0byBkZWZpbmUgSlNQIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpzcC1jb25maWdUeXBlIGlzIHVzZWQgdG8gcHJvdmlkZSBnbG9iYWwgY29uZmlndXJhdGlvbgotCWluZm9ybWF0aW9uIGZvciB0aGUgSlNQIGZpbGVzIGluIGEgd2ViIGFwcGxpY2F0aW9uLiBJdCBoYXMKLQl0d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYiIKLQkJICAgdHlwZT0iamF2YWVlOnRhZ2xpYlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtcHJvcGVydHktZ3JvdXAiCi0JCSAgIHR5cGU9ImphdmFlZTpqc3AtcHJvcGVydHktZ3JvdXBUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWZpbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUKLQl3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBiZWdpbm5pbmcgd2l0aCBhIGAvJy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6cGF0aFR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgotCWZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4KLQlBbGwgZmlsZXMgc28gZGVzY3JpYmVkIGFyZSBkZWVtZWQgdG8gYmUgSlNQIGZpbGVzLiAgVGhlCi0JZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgZGVzY3JpYmVkOgotCi0JICAgIC0gQ29udHJvbCB3aGV0aGVyIEVMIGlzIGlnbm9yZWQuCi0JICAgIC0gQ29udHJvbCB3aGV0aGVyIHNjcmlwdGluZyBlbGVtZW50cyBhcmUgaW52YWxpZC4KLQkgICAgLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcgaW5mb3JtYXRpb24uCi0JICAgIC0gSW5kaWNhdGUgdGhhdCBhIHJlc291cmNlIGlzIGEgSlNQIGRvY3VtZW50IChYTUwpLgotCSAgICAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLgotICAgICAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSAjeyBpcyBhbGxvd2VkCi0gICAgICAgICAgICAgIHdoZW4gdXNlZCBhcyBhIFN0cmluZyBsaXRlcmFsLgotICAgICAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgdGVtcGxhdGUgdGV4dCBjb250YWluaW5nIG9ubHkKLSAgICAgICAgICAgICAgd2hpdGVzcGFjZXMgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIHJlc3BvbnNlIG91dHB1dC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsLWlnbm9yZWQiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTElnbm9yZWQKLQkgICAgcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCB0aGUKLQkgICAgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWIgQXBwbGljYXRpb25zIHVzaW5nCi0JICAgIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlciB3ZWIueG1sLCBhbmQgZGlzYWJsZWQKLQkgICAgb3RoZXJ3aXNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhZ2UtZW5jb2RpbmciCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YgdGhlCi0JICAgIHBhZ2VFbmNvZGluZyBwYWdlIGRpcmVjdGl2ZS4gIEl0IGlzIGEKLQkgICAgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MKLQkgICAgaW4gdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlCi0JICAgIG9mIGEgSlNQIHBhZ2UgYW5kIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAgICBtYXRjaGluZyB0aGUgcGFnZS4gIEl0IGlzIGFsc28gYSB0cmFuc2xhdGlvbi10aW1lCi0JICAgIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50IGVuY29kaW5ncyBpbiB0aGUgcHJvbG9nCi0JICAgIG9yIHRleHQgZGVjbGFyYXRpb24gb2YgYSBkb2N1bWVudCBpbiBYTUwgc3ludGF4IGFuZAotCSAgICBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGRvY3VtZW50LgotCSAgICBJdCBpcyBsZWdhbCB0byBuYW1lIHRoZSBzYW1lIGVuY29kaW5nIHRocm91Z2gKLQkgICAgbXVsaXRwbGUgbWVjaGFuaXNtcy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY3JpcHRpbmctaW52YWxpZCIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgZGlzYWJsZSBzY3JpcHRpbmcgaW4gYQotCSAgICBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCBzY3JpcHRpbmcgaXMKLQkgICAgZW5hYmxlZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpcy14bWwiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgSWYgdHJ1ZSwgZGVub3RlcyB0aGF0IHRoZSBncm91cCBvZiByZXNvdXJjZXMKLQkgICAgdGhhdCBtYXRjaCB0aGUgVVJMIHBhdHRlcm4gYXJlIEpTUCBkb2N1bWVudHMsCi0JICAgIGFuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4KLQkgICAgSWYgZmFsc2UsIHRoZSByZXNvdXJjZXMgYXJlIGFzc3VtZWQgdG8gbm90Ci0JICAgIGJlIEpTUCBkb2N1bWVudHMsIHVubGVzcyB0aGVyZSBpcyBhbm90aGVyCi0JICAgIHByb3BlcnR5IGdyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLXByZWx1ZGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLQkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotCSAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCi0JICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLQkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAotCSAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLWNvZGEiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbmNsdWRlLWNvZGEgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKLQkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQotCSAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCi0JICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKLQkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBlbmQgb2YgZWFjaAotCSAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZlcnJlZC1zeW50YXgtYWxsb3dlZC1hcy1saXRlcmFsIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgVGhlIGNoYXJhY3RlciBzZXF1ZW5jZSAjeyBpcyByZXNlcnZlZCBmb3IgRUwgZXhwcmVzc2lvbnMuCi0gICAgICAgICAgICAgQ29uc2VxdWVudGx5LCBhIHRyYW5zbGF0aW9uIGVycm9yIG9jY3VycyBpZiB0aGUgI3sKLSAgICAgICAgICAgICBjaGFyYWN0ZXIgc2VxdWVuY2UgaXMgdXNlZCBhcyBhIFN0cmluZyBsaXRlcmFsLCB1bmxlc3MKLSAgICAgICAgICAgICB0aGlzIGVsZW1lbnQgaXMgZW5hYmxlZCAodHJ1ZSkuIERpc2FibGVkIChmYWxzZSkgYnkKLSAgICAgICAgICAgICBkZWZhdWx0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyaW0tZGlyZWN0aXZlLXdoaXRlc3BhY2VzIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgdGVtcGxhdGUgdGV4dCBjb250YWluaW5nIG9ubHkgd2hpdGVzcGFjZXMKLSAgICAgICAgICAgICBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzcG9uc2Ugb3V0cHV0LiBJdCBoYXMgbm8KLSAgICAgICAgICAgICBlZmZlY3Qgb24gSlNQIGRvY3VtZW50cyAoWE1MIHN5bnRheCkuIERpc2FibGVkIChmYWxzZSkKLSAgICAgICAgICAgICBieSBkZWZhdWx0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ2xpYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWdsaWJUeXBlIGRlZmluZXMgdGhlIHN5bnRheCBmb3IgZGVjbGFyaW5nIGluCi0JdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0aGF0IGEgdGFnIGxpYnJhcnkgaXMKLQlhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjYW4gYmUgZG9uZQotCXRvIG92ZXJyaWRlIGltcGxpY2l0IG1hcCBlbnRyaWVzIGZyb20gVExEIGZpbGVzIGFuZAotCWZyb20gdGhlIGNvbnRhaW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItdXJpIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGEKLQkgICAgdGFnIGxpYnJhcnkgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiAgVGhlIGJvZHkKLQkgICAgb2YgdGhlIHRhZ2xpYi11cmkgZWxlbWVudCBtYXkgYmUgZWl0aGVyIGFuCi0JICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4KLQkgICAgVGhlcmUgc2hvdWxkIGJlIG5vIGVudHJpZXMgaW4gd2ViLnhtbCB3aXRoIHRoZQotCSAgICBzYW1lIHRhZ2xpYi11cmkgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItbG9jYXRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIHRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24KLQkgICAgKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYgotCSAgICBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYnJhcnkKLQkgICAgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL29ybV8xXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9vcm1fMV8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkOWM3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL29ybV8xXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczpvcm09Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCi0gIHZlcnNpb249IjEuMCI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylvcm1fMV8wLnhzZCAxLjAgIEZlYiAxNCAyMDA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotCi0gICAgICBDb3B5cmlnaHQgMjAwNS0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLQotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLQotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0KLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotCi0gICAgICBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBDRERMIGxpY2Vuc2UuCi0gICAgICAKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIHBlcnNpc3RlbmNlIG9iamVjdC1yZWxhdGlvbmFsIAotICAgICAgIG1hcHBpbmcgZmlsZS4KLSAgICAgICBUaGUgZmlsZSBtYXkgYmUgbmFtZWQgIk1FVEEtSU5GL29ybS54bWwiIGluIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUgCi0gICAgICAgdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgYXMgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aC4KLQotICAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIi8+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBtYXBwaW5nCi0gICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAxLiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IGNvbnRhaW5zIG1ldGFkYXRhCi0gICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgIAotICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgIHRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGRlZmluZWQgaW4KLSAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgIG5hbWVkLW5hdGl2ZS1xdWVyeSBhbmQgc3FsLXJlc3VsdC1zZXQtbWFwcGluZyBlbGVtZW50cyBhcmUgZ2xvYmFsCi0gICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIGFsc28gCi0gICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnkgb3IgbmFtZWQtbmF0aXZlLXF1ZXJ5Ci0gICAgICAgIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSAKLSAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICA0LiBUaGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBlYWNoIGRlZmluZQotICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgIGJlIHBhcnRpYWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuMCIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkIHRoZW4gCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCi0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUgCi0gICAgICAgIHVubGVzcyB0aGV5IGFyZSBvdmVycmlkZGVuIGJ5IGxvY2FsIGFubm90YXRpb24gb3IgWE1MIAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLiAKLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcyBvciBzZWNvbmRhcnkgdGFibGVzCi0gICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhdGFsb2cgLSBVc2VkIGFzIHRoZSBjYXRhbG9nIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZCAKLSAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIAotICAgICAgICB0aGUgZGVmYXVsdGluZyBydWxlcyBmb3IgdGhlIGVudGl0eSBhbmQgaXRzIHN1YmVsZW1lbnRzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci12YWx1ZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKLSAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtbG9hZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdExvYWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbi1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtblJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY29uZGFyeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICB9Ci0KLSAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZC1pZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgewotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBGZXRjaFR5cGUgeyBMQVpZLCBFQUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFaWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgewotICAgICAgICAgIE9SRElOQUwsCi0gICAgICAgICAgU1RSSU5HCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYXNjYWRlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7IEFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBHZW5lcmF0ZWRWYWx1ZSB7Ci0gICAgICAgICAgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3koKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgICAgU3RyaW5nIGdlbmVyYXRvcigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06Z2VuZXJhdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2VuZXJhdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgeyBTVFJJTkcsIENIQVIsIElOVEVHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiRFRZUEUiOwotICAgICAgICAgIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDMxOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkYWJsZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmVtYmVkZGFibGUtYXR0cmlidXRlcyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlLWF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGEgbWFwcGVkIHN1cGVyY2xhc3MuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgCi0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDE7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9wZXJzaXN0ZW5jZV8xXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9wZXJzaXN0ZW5jZV8xXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2ExNTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvcGVyc2lzdGVuY2VfMV8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBwZXJzaXN0ZW5jZS54bWwgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIgCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zOnBlcnNpc3RlbmNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIxLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpcGVyc2lzdGVuY2VfMV8wLnhzZCAgMS4wICBGZWIgOSAyMDA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgSEVBREVSLgotCi0gICAgICBDb3B5cmlnaHQgMjAwNS0yMDA3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZQotICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9ubHkgKCJHUEwiKSBvciB0aGUgQ29tbW9uCi0gICAgICBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UoIkNEREwiKSAoY29sbGVjdGl2ZWx5LCB0aGUKLSAgICAgICJMaWNlbnNlIikuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgICAgIHRoZSBMaWNlbnNlLiBZb3UgY2FuIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgICAgIGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCBvcgotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotICAgICAgTGljZW5zZS4KLQotICAgICAgV2hlbiBkaXN0cmlidXRpbmcgdGhlIHNvZnR3YXJlLCBpbmNsdWRlIHRoaXMgTGljZW5zZSBIZWFkZXIKLSAgICAgIE5vdGljZSBpbiBlYWNoIGZpbGUgYW5kIGluY2x1ZGUgdGhlIExpY2Vuc2UgZmlsZSBhdAotICAgICAgZ2xhc3NmaXNoL2Jvb3RzdHJhcC9sZWdhbC9MSUNFTlNFLnR4dC4gIFN1biBkZXNpZ25hdGVzIHRoaXMKLSAgICAgIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMKLSAgICAgIHByb3ZpZGVkIGJ5IFN1biBpbiB0aGUgR1BMIFZlcnNpb24gMiBzZWN0aW9uIG9mIHRoZSBMaWNlbnNlIGZpbGUKLSAgICAgIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLiAgSWYgYXBwbGljYWJsZSwgYWRkIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJlbG93IHRoZSBMaWNlbnNlIEhlYWRlciwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzIFtdCi0gICAgICByZXBsYWNlZCBieSB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbjoKLSAgICAgICJQb3J0aW9ucyBDb3B5cmlnaHRlZCBbeWVhcl0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXSIKLQotICAgICAgQ29udHJpYnV0b3Iocyk6Ci0KLSAgICAgIElmIHlvdSB3aXNoIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdG8gYmUgZ292ZXJuZWQgYnkgb25seSB0aGUKLSAgICAgIENEREwgb3Igb25seSB0aGUgR1BMIFZlcnNpb24gMiwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBhZGRpbmcKLSAgICAgICJbQ29udHJpYnV0b3JdIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBbQ0RETCBvciBHUEwgVmVyc2lvbiAyXSBsaWNlbnNlLiIgIElmIHlvdQotICAgICAgZG9uJ3QgaW5kaWNhdGUgYSBzaW5nbGUgY2hvaWNlIG9mIGxpY2Vuc2UsIGEgcmVjaXBpZW50IGhhcyB0aGUKLSAgICAgIG9wdGlvbiB0byBkaXN0cmlidXRlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZQotICAgICAgQ0RETCwgdGhlIEdQTCBWZXJzaW9uIDIgb3IgdG8gZXh0ZW5kIHRoZSBjaG9pY2Ugb2YgbGljZW5zZSB0byBpdHMKLSAgICAgIGxpY2Vuc2VlcyBhcyBwcm92aWRlZCBhYm92ZS4gIEhvd2V2ZXIsIGlmIHlvdSBhZGQgR1BMIFZlcnNpb24gMgotICAgICAgY29kZSBhbmQgdGhlcmVmb3JlLCBlbGVjdGVkIHRoZSBHUEwgVmVyc2lvbiAyIGxpY2Vuc2UsIHRoZW4gdGhlCi0gICAgICBvcHRpb24gYXBwbGllcyBvbmx5IGlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gc3VjaAotICAgICAgb3B0aW9uIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotCi0gICAgICBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGVsZWN0cyB0byBpbmNsdWRlIHRoaXMgc29mdHdhcmUgaW4gdGhpcwotICAgICAgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBDRERMIGxpY2Vuc2UuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgcGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICBUaGUgZmlsZSBtdXN0IGJlIG5hbWVkICJNRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiIGluIHRoZSAKLSAgICAgcGVyc2lzdGVuY2UgYXJjaGl2ZS4KLSAgICAgUGVyc2lzdGVuY2UgY29uZmlndXJhdGlvbiBmaWxlcyBtdXN0IGluZGljYXRlCi0gICAgIHRoZSBwZXJzaXN0ZW5jZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHBlcnNpc3RlbmNlIG5hbWVzcGFjZToKLQotICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQotCi0gICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICAgIDxwZXJzaXN0ZW5jZSB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UKLSAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIgotICAgICAgICB2ZXJzaW9uPSIxLjAiPgotICAgICAgICAgIC4uLgotICAgICAgPC9wZXJzaXN0ZW5jZT4KLQotICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gb2YgYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdmlkZXIiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXIgY2xhc3MgdGhhdCBzdXBwbGllcyBFbnRpdHlNYW5hZ2VycyBmb3IgdGhpcyAKLSAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianRhLWRhdGEtc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRoZSBjb250YWluZXItc3BlY2lmaWMgbmFtZSBvZiB0aGUgSlRBIGRhdGFzb3VyY2UgdG8gdXNlLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub24tanRhLWRhdGEtc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFRoZSBjb250YWluZXItc3BlY2lmaWMgbmFtZSBvZiBhIG5vbi1KVEEgZGF0YXNvdXJjZSB0byB1c2UuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBpbmctZmlsZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgRmlsZSBjb250YWluaW5nIG1hcHBpbmcgaW5mb3JtYXRpb24uIExvYWRlZCBhcyBhIHJlc291cmNlIAotICAgICAgICAgICAgICAgICAgICBieSB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imphci1maWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBKYXIgZmlsZSB0aGF0IHNob3VsZCBiZSBzY2FubmVkIGZvciBlbnRpdGllcy4gCi0gICAgICAgICAgICAgICAgICAgIE5vdCBhcHBsaWNhYmxlIHRvIEphdmEgU0UgcGVyc2lzdGVuY2UgdW5pdHMuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBDbGFzcyB0byBzY2FuIGZvciBhbm5vdGF0aW9ucy4gIEl0IHNob3VsZCBiZSBhbm5vdGF0ZWQgCi0gICAgICAgICAgICAgICAgICAgIHdpdGggZWl0aGVyIEBFbnRpdHksIEBFbWJlZGRhYmxlIG9yIEBNYXBwZWRTdXBlcmNsYXNzLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBXaGVuIHNldCB0byB0cnVlIHRoZW4gb25seSBsaXN0ZWQgY2xhc3NlcyBhbmQgamFycyB3aWxsIAotICAgICAgICAgICAgICAgICAgICBiZSBzY2FubmVkIGZvciBwZXJzaXN0ZW50IGNsYXNzZXMsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIAotICAgICAgICAgICAgICAgICAgICBqYXIgb3IgZGlyZWN0b3J5IHdpbGwgYWxzbyBiZSBzY2FubmVkLiBOb3QgYXBwbGljYWJsZSB0byAKLSAgICAgICAgICAgICAgICAgICAgSmF2YSBTRSBwZXJzaXN0ZW5jZSB1bml0cy4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgQSBsaXN0IG9mIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEEgbmFtZS12YWx1ZSBwYWlyLgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgTmFtZSB1c2VkIGluIGNvZGUgdG8gcmVmZXJlbmNlIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLSAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNhY3Rpb24tdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwZXJzaXN0ZW5jZTpwZXJzaXN0ZW5jZS11bml0LXRyYW5zYWN0aW9uLXR5cGUiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICBUeXBlIG9mIHRyYW5zYWN0aW9ucyB1c2VkIGJ5IEVudGl0eU1hbmFnZXJzIGZyb20gdGhpcyAKLSAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InBlcnNpc3RlbmNlOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjAiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtdHJhbnNhY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFRyYW5zYWN0aW9uVHlwZSB7IEpUQSwgUkVTT1VSQ0VfTE9DQUwgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpUQSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVTT1VSQ0VfTE9DQUwiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfMi5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8yLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0MzlmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8yLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LiAgCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQgCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuIAotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gTG9nbywgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsIAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLiAKLWFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUFsbCBTUEFSQyB0cmFkZW1hcmtzIGFyZSB1c2VkIHVuZGVyIGxpY2Vuc2UgYW5kIGFyZSB0cmFkZW1hcmtzCi1vciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU1BBUkMgSW50ZXJuYXRpb25hbCwgSW5jLgotaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4gUHJvZHVjdHMgYmVhcmluZyBTUEFSQwotdHJhZGVtYXJrcyBhcmUgYmFzZWQgdXBvbiBhbiBhcmNoaXRlY3R1cmUgZGV2ZWxvcGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuIAotCi0gCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0byAKLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLQotIAotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuIAotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLSAKLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjIAotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuIAotcXVlIGNlIHNvaXQsIHNhbnMgbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuICAKLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUgCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLSAKLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgbGUgbG9nbyBTdW4sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLCAgCi1zb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU3VuIAotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLSAKLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIAotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuIAotIAotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UIEVYQ0xVRVMsCi1EQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMgTk9UQU1NRU5UCi1UT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQSBMJ0FQVElUVURFCi1BIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUgQ09OVFJFRkFDT04uCi0tLT4KLQotPCEtLQotVGhlIHdlYi1hcHAgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvcgotYSB3ZWIgYXBwbGljYXRpb24KLS0tPgotCi08IUVMRU1FTlQgd2ViLWFwcCAoaWNvbj8sIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywgZGlzdHJpYnV0YWJsZT8sCi1jb250ZXh0LXBhcmFtKiwgc2VydmxldCosIHNlcnZsZXQtbWFwcGluZyosIHNlc3Npb24tY29uZmlnPywKLW1pbWUtbWFwcGluZyosIHdlbGNvbWUtZmlsZS1saXN0PywgZXJyb3ItcGFnZSosIHRhZ2xpYiosCi1yZXNvdXJjZS1yZWYqLCBzZWN1cml0eS1jb25zdHJhaW50KiwgbG9naW4tY29uZmlnPywgc2VjdXJpdHktcm9sZSosCi1lbnYtZW50cnkqLCBlamItcmVmKik+Ci0KLTwhLS0KLVRoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgYSBzbWFsbC1pY29uIGFuZCBhIGxhcmdlLWljb24gZWxlbWVudAotd2hpY2ggc3BlY2lmeSB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZm9yIGEgc21hbGwgYW5kCi1sYXJnZSBpbWFnZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgd2ViIGFwcGxpY2F0aW9uIGluIGEgR1VJIHRvb2wuIEF0IGEKLW1pbmltdW0sIHRvb2xzIG11c3QgYWNjZXB0IEdJRiBhbmQgSlBFRyBmb3JtYXQgaW1hZ2VzLgotLS0+Ci0KLTwhRUxFTUVOVCBpY29uIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHdlYgotYXBwbGljYXRpb24gb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTZ4MTYgcGl4ZWwpIGljb24gaW1hZ2UuCi0tLT4KLQotPCFFTEVNRU5UIHNtYWxsLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHdlYgotYXBwbGljYXRpb24gb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBsYXJnZSAoMzJ4MzIgcGl4ZWwpIGljb24gaW1hZ2UuCi0tLT4KLQotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKLXRvIGJlIGRpc3BsYXllZCBieSBHVUkgdG9vbHMKLS0tPgotCi08IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIGRlc2NyaXB0aXZlIHRleHQgYWJvdXQKLXRoZSBwYXJlbnQgZWxlbWVudC4KLS0tPgotCi08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzdHJpYnV0YWJsZSBlbGVtZW50LCBieSBpdHMgcHJlc2VuY2UgaW4gYSB3ZWIgYXBwbGljYXRpb24KLWRlcGxveW1lbnQgZGVzY3JpcHRvciwgaW5kaWNhdGVzIHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMKLXByb2dyYW1tZWQgYXBwcm9wcmlhdGVseSB0byBiZSBkZXBsb3llZCBpbnRvIGEgZGlzdHJpYnV0ZWQgc2VydmxldAotY29udGFpbmVyCi0tLT4KLQotPCFFTEVNRU5UIGRpc3RyaWJ1dGFibGUgRU1QVFk+Ci0KLTwhLS0KLVRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgd2ViCi1hcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotLS0+Ci0KLTwhRUxFTUVOVCBjb250ZXh0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KLQotPCEtLQotVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLS0tPgotCi08IUVMRU1FTlQgcGFyYW0tbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KLS0tPgotCi08IUVMRU1FTlQgcGFyYW0tdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEKLXNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaXMKLXByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kIGxvYWRlZC4KLS0tPgotCi08IUVMRU1FTlQgc2VydmxldCAoaWNvbj8sIHNlcnZsZXQtbmFtZSwgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LAotKHNlcnZsZXQtY2xhc3N8anNwLWZpbGUpLCBpbml0LXBhcmFtKiwgbG9hZC1vbi1zdGFydHVwPywgc2VjdXJpdHktcm9sZS1yZWYqKT4KLQotPCEtLQotVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKLXNlcnZsZXQuCi0tLT4KLQotPCFFTEVNRU5UIHNlcnZsZXQtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi1vZiB0aGUgc2VydmxldC4KLS0tPgotCi08IUVMRU1FTlQgc2VydmxldC1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4KLXRoZSB3ZWIgYXBwbGljYXRpb24uCi0tLT4KLQotPCFFTEVNRU5UIGpzcC1maWxlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgotaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQKLS0tPgotCi08IUVMRU1FTlQgaW5pdC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+Ci0KLTwhLS0KLVRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNlcnZsZXQgc2hvdWxkIGJlCi1sb2FkZWQgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mCi10aGVzZSBlbGVtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9yZGVyIGluIHdoaWNoCi10aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBMb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBoaWdoZXIKLWludGVnZXJzLiBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm90IGEKLXBvc2l0aXZlIGludGVnZXIsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIGl0IGF0IGFueSB0aW1lIGluIHRoZQotc3RhcnR1cCBzZXF1ZW5jZS4KLS0tPgotCi08IUVMRU1FTlQgbG9hZC1vbi1zdGFydHVwICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlcnZsZXQtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYSBzZXJ2bGV0Ci1hbmQgYSB1cmwgcGF0dGVybgotLS0+Ci0KLTwhRUxFTUVOVCBzZXJ2bGV0LW1hcHBpbmcgKHNlcnZsZXQtbmFtZSwgdXJsLXBhdHRlcm4pPgotCi08IS0tCi1UaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlCi1tYXBwaW5nLiBNdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTAgb2YgdGhlIFNlcnZsZXQKLUFQSSBTcGVjaWZpY2F0aW9uLgotLS0+Ci0KLTwhRUxFTUVOVCB1cmwtcGF0dGVybiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLWNvbmZpZyBlbGVtZW50IGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycyBmb3IKLXRoaXMgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci0KLTwhRUxFTUVOVCBzZXNzaW9uLWNvbmZpZyAoc2Vzc2lvbi10aW1lb3V0Pyk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dAotaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUKLXNwZWNpZmllZCB0aW1lb3V0IG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0tLT4KLQotPCFFTEVNRU5UIHNlc3Npb24tdGltZW91dCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtaW1lLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotYW5kIGEgbWltZSB0eXBlLgotLS0+Ci0KLTwhRUxFTUVOVCBtaW1lLW1hcHBpbmcgKGV4dGVuc2lvbiwgbWltZS10eXBlKT4KLQotPCEtLQotVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KLWV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLS0tPgotCi08IUVMRU1FTlQgZXh0ZW5zaW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1pbWUtdHlwZSBlbGVtZW50IGNvbnRhaW5zIGEgZGVmaW5lZCBtaW1lIHR5cGUuIGV4YW1wbGU6Ci0idGV4dC9wbGFpbiIKLS0tPgotCi08IUVMRU1FTlQgbWltZS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lIGZpbGVzCi1lbGVtZW50cy4KLS0tPgotCi08IUVMRU1FTlQgd2VsY29tZS1maWxlLWxpc3QgKHdlbGNvbWUtZmlsZSspPgotCi08IS0tCi1UaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZSBhcyBhIGRlZmF1bHQKLXdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0tLT4KLQotPCFFTEVNRU5UIHdlbGNvbWUtZmlsZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0YWdsaWIgZWxlbWVudCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgSlNQIHRhZyBsaWJyYXJ5LgotLS0+Ci0KLTwhRUxFTUVOVCB0YWdsaWIgKHRhZ2xpYi11cmksIHRhZ2xpYi1sb2NhdGlvbik+Ci0KLTwhLS0KLVRoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24KLW9mIHRoZSB3ZWIueG1sIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYgotQXBwbGljYXRpb24uCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2xpYi11cmkgKCNQQ0RBVEEpPgotCi08IS0tCi10aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIChhcyBhIHJlc291cmNlCi1yZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcKLUxpYmFyeSBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2xpYi1sb2NhdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlcnJvci1wYWdlIGVsZW1lbnQgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQotb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0tLT4KLQotPCFFTEVNRU5UIGVycm9yLXBhZ2UgKChlcnJvci1jb2RlIHwgZXhjZXB0aW9uLXR5cGUpLCBsb2NhdGlvbik+Ci0KLTwhLS0KLVRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAotLS0+Ci0KLTwhRUxFTUVOVCBlcnJvci1jb2RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGV4Y2VwdGlvbiB0eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYQotSmF2YSBleGNlcHRpb24gdHlwZS4KLS0tPgotCi08IUVMRU1FTlQgZXhjZXB0aW9uLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGluIHRoZQotd2ViIGFwcGxpY2F0aW9uCi0tLT4KLQotPCFFTEVNRU5UIGxvY2F0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSBXZWIKLUFwcGxpY2F0aW9uJ3MgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLgotLS0+Ci0KLTwhRUxFTUVOVCByZXNvdXJjZS1yZWYgKGRlc2NyaXB0aW9uPywgcmVzLXJlZi1uYW1lLCByZXMtdHlwZSwgcmVzLWF1dGgpPgotCi08IS0tCi1UaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZQotZmFjdG9yeSByZWZlcmVuY2UgbmFtZS4KLS0tPgotCi08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSAoSmF2YSBjbGFzcykgdHlwZSBvZiB0aGUgZGF0YQotc291cmNlLgotLS0+Ci0KLTwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtYXV0aCBlbGVtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQKLWNvZGUgcGVyZm9ybXMgcmVzb3VyY2Ugc2lnbm9uIHByb2dyYW1tYXRpY2FsbHkgb3Igd2hldGhlciB0aGUKLWNvbnRhaW5lciBzaWducyBvbnRvIHRoZSByZXNvdXJjZSBiYXNlZCBvbiB0aGUgcHJpbmNpcGxlIG1hcHBpbmcKLWluZm9ybWF0aW9uIHN1cHBsaWVkIGJ5IHRoZSBkZXBsb3llci4gTXVzdCBiZSBDT05UQUlORVIgb3IgU0VSVkxFVAotLS0+Ci0KLTwhRUxFTUVOVCByZXMtYXV0aCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdHkKLWNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zCi0tLT4KLQotPCFFTEVNRU5UIHNlY3VyaXR5LWNvbnN0cmFpbnQgKHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uKywKLWF1dGgtY29uc3RyYWludD8sIHVzZXItZGF0YS1jb25zdHJhaW50Pyk+Ci0KLTwhLS0KLVRoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKLW9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViCi1hcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzCi1hcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMgdG8gYWxsIEhUVFAKLW1ldGhvZHMuCi0tLT4KLQotPCFFTEVNRU5UIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uICh3ZWItcmVzb3VyY2UtbmFtZSwgZGVzY3JpcHRpb24/LAotdXJsLXBhdHRlcm4qLCBodHRwLW1ldGhvZCopPgotCi08IS0tCi1UaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UKLWNvbGxlY3Rpb24KLS0tPgotCi08IUVMRU1FTlQgd2ViLXJlc291cmNlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikKLS0tPgotCi08IUVMRU1FTlQgaHR0cC1tZXRob2QgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdXNlci1kYXRhLWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyBkYXRhCi1jb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZAotLS0+Ci0KLTwhRUxFTUVOVCB1c2VyLWRhdGEtY29uc3RyYWludCAoZGVzY3JpcHRpb24/LCB0cmFuc3BvcnQtZ3VhcmFudGVlKT4KLQotPCEtLQotVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgotYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi1DT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkKLXRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi1yZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbgotc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlIGNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zCi10aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEKLWZhc2hpb24gdGhhdCBwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YKLXRoZSB0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKLUNPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcyByZXF1aXJlZC4KLS0tPgotCi08IUVMRU1FTlQgdHJhbnNwb3J0LWd1YXJhbnRlZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBhdXRoLWNvbnN0cmFpbnQgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdCBzaG91bGQKLWJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLiBUaGUgcm9sZSB1c2VkIGhlcmUKLW11c3QgYXBwZWFyIGluIGEgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudC4KLS0tPgotCi08IUVMRU1FTlQgYXV0aC1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSopPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotLS0+Ci0KLTwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbG9naW4tY29uZmlnIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi1tZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IKLXRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4KLW1lY2hhbmlzbS4KLS0tPgotCi08IUVMRU1FTlQgbG9naW4tY29uZmlnIChhdXRoLW1ldGhvZD8sIHJlYWxtLW5hbWU/LCBmb3JtLWxvZ2luLWNvbmZpZz8pPgotCi08IS0tCi1UaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0byB1c2UgaW4gSFRUUAotQmFzaWMgYXV0aG9yaXphdGlvbgotLS0+Ci0KLTwhRUxFTUVOVCByZWFsbS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGZvcm0tbG9naW4tY29uZmlnIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IgcGFnZXMKLXRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZCBhdXRoZW50aWNhdGlvbgotaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCBmb3JtLWxvZ2luLWNvbmZpZyAoZm9ybS1sb2dpbi1wYWdlLCBmb3JtLWVycm9yLXBhZ2UpPgotCi08IS0tCi1UaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKLXdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZAotLS0+Ci0KLTwhRUxFTUVOVCBmb3JtLWxvZ2luLXBhZ2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKLXdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwKLWNhbiBiZSBmb3VuZAotLS0+Ci0KLTwhRUxFTUVOVCBmb3JtLWVycm9yLXBhZ2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLW1lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8gZ2FpbmluZyBhY2Nlc3MKLXRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbgotY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkCi1tZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBmb3IgdGhpcyBlbGVtZW50IGFyZSAiQkFTSUMiLCAiRElHRVNUIiwKLSJGT1JNIiwgb3IgIkNMSUVOVC1DRVJUIi4KLS0tPgotCi08IUVMRU1FTlQgYXV0aC1tZXRob2QgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlIHdoaWNoIGlzIHVzZWQgaW4gdGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRzIHBsYWNlZCBvbiB0aGUgd2ViCi1hcHBsaWNhdGlvbi4KLS0tPgotCi08IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSByb2xlLiBUaGlzIGVsZW1lbnQKLW11c3QgY29udGFpbiBhIG5vbi1lbXB0eSBzdHJpbmcuCi0tLT4KLQotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUtcmVmIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSwgcm9sZS1saW5rKT4KLQotPCEtLQotVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIHVzZWQgdG8gbGluayBhIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlCi10byBhIGRlZmluZWQgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiB0aGUKLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlCi1lbGVtZW50cy4KLS0tPgotCi08IUVMRU1FTlQgcm9sZS1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhbgotYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhpcyBlbGVtZW50IGlzIHJlcXVpcmVkIHRvIGJlCi1ob25vcmVkIG9uIGluIEoyRUUgY29tcGxpYW50IHNlcnZsZXQgY29udGFpbmVycy4KLS0tPgotCi08IUVMRU1FTlQgZW52LWVudHJ5IChkZXNjcmlwdGlvbj8sIGVudi1lbnRyeS1uYW1lLCBlbnYtZW50cnktdmFsdWU/LAotZW52LWVudHJ5LXR5cGUpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24ncwotZW52aXJvbm1lbnQgZW50cnkKLS0tPgotCi08IUVMRU1FTlQgZW52LWVudHJ5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuCi1hcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGVudHJ5Ci0tLT4KLQotPCFFTEVNRU5UIGVudi1lbnRyeS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSB0eXBlCi1vZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24KLWNvZGUuIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6Ci1qYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi1qYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuRmxvYXQuCi0tLT4KLQotPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIHRvIGRlY2xhcmUgYSByZWZlcmVuY2UgdG8gYW4KLWVudGVycHJpc2UgYmVhbi4gCi0tLT4KLQotPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsIGhvbWUsIHJlbW90ZSwKLWVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLXJlZmVyZW5jZS4gVGhpcyBpcyB0aGUgSk5ESSBuYW1lIHRoYXQgdGhlIHNlcnZsZXQgY29kZSB1c2VzIHRvIGdldCBhCi1yZWZlcmVuY2UgdG8gdGhlIGVudGVycHJpc2UgYmVhbi4KLS0tPgotCi08IUVMRU1FTlQgZWpiLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCBqYXZhIGNsYXNzIHR5cGUgb2YKLXRoZSByZWZlcmVuY2VkIEVKQi4KLS0tPgotCi08IUVMRU1FTlQgZWpiLXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1ob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQotRUpCJ3MgaG9tZSBpbnRlcmZhY2UKLS0tPgotCi08IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQotRUpCJ3MgcmVtb3RlIGludGVyZmFjZQotLS0+Ci0KLTwhRUxFTUVOVCByZW1vdGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQgdG8gc3BlY2lmeQotdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbiBFSkIgaW4gYW4gZW5jb21wYXNzaW5nIEphdmEyCi1FbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIGFwcGxpY2F0aW9uIHBhY2thZ2UuIFRoZSB2YWx1ZSBvZiB0aGUKLWVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW5kIEVKQiBpbiB0aGUgSjJFRQotYXBwbGljYXRpb24gcGFja2FnZS4KLS0tPgotCi08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRvIGVhc2lseSBtYWtlIHRvb2wtc3BlY2lmaWMKLXJlZmVyZW5jZXMgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoaXMgYWxsb3dzCi10b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50IGluZm9ybWF0aW9uIChpLmUgaW5mb3JtYXRpb24KLWJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uKSB0byBzdG9yZSB0aGUKLW5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhIHNlcGFyYXRlIGZpbGUsIGFuZCBlYXNpbHkgcmVmZXIgZnJvbQotdGhlc2UgdG9vbHMtc3BlY2lmaWMgZmlsZXMgdG8gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCB3ZWItYXBwCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0tLT4KLQotPCFBVFRMSVNUIHdlYi1hcHAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3RyaWJ1dGFibGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udGV4dC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwYXJhbS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBhcmFtLXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldC1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQtY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QganNwLWZpbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaW5pdC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2FkLW9uLXN0YXJ0dXAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldC1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHVybC1wYXR0ZXJuIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24tY29uZmlnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24tdGltZW91dCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtaW1lLW1hcHBpbmcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXh0ZW5zaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1pbWUtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWxjb21lLWZpbGUtbGlzdCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWxjb21lLWZpbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZ2xpYi11cmkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnbGliLWxvY2F0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVycm9yLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXJyb3ItY29kZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBleGNlcHRpb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2NhdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLXJlc291cmNlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaHR0cC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXNlci1kYXRhLWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdHJhbnNwb3J0LWd1YXJhbnRlZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdXRoLWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvZ2luLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWFsbS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZvcm0tbG9naW4tY29uZmlnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZvcm0tbG9naW4tcGFnZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmb3JtLWVycm9yLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXV0aC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1yb2xlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW1vdGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8zLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzMuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTNhYjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzMuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MyArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgKGMpIDIwMDAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgcmVsYXRpbmcgdG8KLXRlY2hub2xvZ3kgZW1ib2RpZWQgaW4gdGhlIHByb2R1Y3QgdGhhdCBpcyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4KLUluIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMgbGlzdGVkIGF0Ci1odHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUgYWRkaXRpb25hbCBwYXRlbnRzIG9yCi1wZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlIFUuUy4gYW5kIGluIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHByb2R1Y3QgdG8gd2hpY2ggaXQgcGVydGFpbnMgYXJlIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiwgYW5kCi1kZWNvbXBpbGF0aW9uLiAgVGhpcyBkb2N1bWVudCBtYXkgYmUgcmVwcm9kdWNlZCBhbmQgZGlzdHJpYnV0ZWQgYnV0IG1heQotbm90IGJlIGNoYW5nZWQgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMKLWxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMgY29weXJpZ2h0ZWQgYW5kCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICB0aGUgU3VuIGxvZ28sICBKYXZhLCAgSmF2YVNlcnZlciBQYWdlcywgIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgIEpEQkMsICBKREssICBKYXZhTWFpbCBhbmQgIGFuZAotRW50ZXJwcmlzZSBKYXZhQmVhbnMgYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvCi1TdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWSBJTVBMSUVECi1XQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUgotTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVCBUTyBUSEUgRVhURU5UIFRIQVQgU1VDSAotRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWSBJTlZBTElELgotCi0KLV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgRSd0YXRzLVVuaXMuCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGEgbGVzIGRyb2l0cyBkZSBwcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzCi1yZWxhdGFudHMgYWAgbGEgdGVjaG5vbG9naWUgaW5jb3Jwb3JlJ2UgZGFucyBsZSBwcm9kdWl0IHF1aSBlc3QgZGUnY3JpdAotZGFucyBjZSBkb2N1bWVudC4gRW4gcGFydGljdWxpZXIsIGV0IHNhbnMgbGEgbGltaXRhdGlvbiwgY2VzIGRyb2l0cyBkZQotcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscyBwZXV2ZW50IGluY2x1cmUgdW4gb3UgcGx1cyBkZXMgYnJldmV0cwotYW1lJ3JpY2FpbnMgZSdudW1lJ3JlJ3MgYWAgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgZXQgdW4gb3UgbGVzCi1icmV2ZXRzIHBsdXMgc3VwcGxlJ21lbnRhaXJlcyBvdSBsZXMgYXBwbGljYXRpb25zIGRlIGJyZXZldCBlbiBhdHRlbnRlCi1kYW5zIGxlcyBFJ3RhdHMtVW5pcyBldCBkYW5zIGxlcyBhdXRyZXMgcGF5cy4KLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJwotYXZlYyBkZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEKLWRpc3RyaWJ1dGlvbiwgZXQgbGEgZGUnY29tcGlsYXRpb24uICBDZSBkb2N1bWVudGlvbiBhc3NvY2llIG4gcGV1dAotZV50cmUgcmVwcm9kdWl0ZSBldCBkaXN0cmlidWVyLCBwYXIgcXVlbHF1ZSBtb3llbiBxdWUgY2Ugc29pdCwgc2FucwotbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgYmFpbGxldXJzIGRlCi1saWNlbmNlLCBsZSBjYXMgZSdjaGUnYW50LgotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZQotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldAotbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIGxlIGxvZ28gU3VuLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgZXQgIGFuZAotRW50ZXJwcmlzZSBKYXZhQmVhbnMgc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcwotZGUncG9zZSdlcyBkZSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFJ3RhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzCi1wYXlzLgotCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0UnVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UCi1FWENMVUVTLCBEQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMKLU5PVEFNTUVOVCBUT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQQotTCdBUFRJVFVERSBBIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUKLUNPTlRSRUZBQyxPTi4KLS0tPgotCi08IS0tCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgU2VydmxldCAyLjMgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotQWxsIFNlcnZsZXQgMi4zIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQotb2YgdGhlIGZvbGxvd2luZyBmb3JtOgotCi0gIDwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+Ci0KLS0tPgotCi08IS0tCi1UaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBjb250YWluIFBDREFUQSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQotICBpbiB0aGUgZGF0YSBtYXkgYmUgaWdub3JlZC4KLQotLSBJbiBlbGVtZW50cyB3aG9zZSB2YWx1ZSBpcyBhbiAiZW51bWVyYXRlZCB0eXBlIiwgdGhlIHZhbHVlIGlzCi0gIGNhc2Ugc2Vuc2l0aXZlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlIHNhbWUKLSAgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90IHN0YXJ0aW5nIHdpdGggIi8iKQotICBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuCi0gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeQotICBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIHNlcnZsZXQgQVBJLgotLS0+Ci0KLQotPCEtLQotVGhlIHdlYi1hcHAgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvcgotYSB3ZWIgYXBwbGljYXRpb24uCi0tLT4KLTwhRUxFTUVOVCB3ZWItYXBwIChpY29uPywgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LCBkaXN0cmlidXRhYmxlPywKLWNvbnRleHQtcGFyYW0qLCBmaWx0ZXIqLCBmaWx0ZXItbWFwcGluZyosIGxpc3RlbmVyKiwgc2VydmxldCosCi1zZXJ2bGV0LW1hcHBpbmcqLCBzZXNzaW9uLWNvbmZpZz8sIG1pbWUtbWFwcGluZyosIHdlbGNvbWUtZmlsZS1saXN0PywKLWVycm9yLXBhZ2UqLCB0YWdsaWIqLCByZXNvdXJjZS1lbnYtcmVmKiwgcmVzb3VyY2UtcmVmKiwgc2VjdXJpdHktY29uc3RyYWludCosCi1sb2dpbi1jb25maWc/LCBzZWN1cml0eS1yb2xlKiwgZW52LWVudHJ5KiwgZWpiLXJlZiosICBlamItbG9jYWwtcmVmKik+Ci0KLTwhLS0KLVRoZSBhdXRoLWNvbnN0cmFpbnQgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdCBzaG91bGQKLWJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lCi11c2VkIGhlcmUgbXVzdCBlaXRoZXIgY29ycmVzcG9uZCB0byB0aGUgcm9sZS1uYW1lIG9mIG9uZSBvZiB0aGUKLXNlY3VyaXR5LXJvbGUgZWxlbWVudHMgZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlCi10aGUgc3BlY2lhbGx5IHJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgotaW5kaWNhdGluZyBhbGwgcm9sZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gSWYgYm90aCAiKiIgYW5kCi1yb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwgcm9sZXMuCi1JZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcyB0byB0aGUgcG9ydGlvbiBvZgotdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlIGNvbnRhaW5pbmcgc2VjdXJpdHktY29uc3RyYWludC4KLVRoZSBjb250YWluZXIgbWF0Y2hlcyByb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZwotYWNjZXNzLgotCi0KLVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLS0tPgotPCFFTEVNRU5UIGF1dGgtY29uc3RyYWludCAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUqKT4KLQotPCEtLQotVGhlIGF1dGgtbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvIGdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkgYW4gYXV0aG9yaXphdGlvbgotY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkCi1tZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBmb3IgdGhpcyBlbGVtZW50IGFyZSAiQkFTSUMiLCAiRElHRVNUIiwKLSJGT1JNIiwgb3IgIkNMSUVOVC1DRVJUIi4KLQotVXNlZCBpbjogbG9naW4tY29uZmlnCi0tLT4KLTwhRUxFTUVOVCBhdXRoLW1ldGhvZCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgd2ViCi1hcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBjb250ZXh0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50Ci1lbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQKLXRoZSB3ZWIgYXBwbGljYXRpb24gd2FyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLXRoZSB3ZWIgYXBwbGljYXRpb24gd2FyIGZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzCi11c2VkIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24gd2FyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbgotd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVXNlZCBpbjogYXV0aC1jb25zdHJhaW50LCBjb250ZXh0LXBhcmFtLCBlamItbG9jYWwtcmVmLCBlamItcmVmLAotZW52LWVudHJ5LCBmaWx0ZXIsIGluaXQtcGFyYW0sIHJlc291cmNlLWVudi1yZWYsIHJlc291cmNlLXJlZiwgcnVuLWFzLAotc2VjdXJpdHktcm9sZSwgc2VjdXJpdHktcm9sZS1yZWYsIHNlcnZsZXQsIHVzZXItZGF0YS1jb25zdHJhaW50LAotd2ViLWFwcCwgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5ZWQgYnkgdG9vbHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotVXNlZCBpbjogZmlsdGVyLCBzZWN1cml0eS1jb25zdHJhaW50LCBzZXJ2bGV0LCB3ZWItYXBwCi0KLUV4YW1wbGU6Ci0KLTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGlzdHJpYnV0YWJsZSBlbGVtZW50LCBieSBpdHMgcHJlc2VuY2UgaW4gYSB3ZWIgYXBwbGljYXRpb24KLWRlcGxveW1lbnQgZGVzY3JpcHRvciwgaW5kaWNhdGVzIHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMKLXByb2dyYW1tZWQgYXBwcm9wcmlhdGVseSB0byBiZSBkZXBsb3llZCBpbnRvIGEgZGlzdHJpYnV0ZWQgc2VydmxldAotY29udGFpbmVyCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGRpc3RyaWJ1dGFibGUgRU1QVFk+Ci0KLTwhLS0KLVRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgb3IgZWpiLWxvY2FsLXJlZgotZWxlbWVudHMgdG8gc3BlY2lmeSB0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFuCi1lbnRlcnByaXNlIGJlYW4uCi0KLVRoZSBuYW1lIGluIHRoZSBlamItbGluayBlbGVtZW50IGlzIGNvbXBvc2VkIG9mIGEKLXBhdGggbmFtZSBzcGVjaWZ5aW5nIHRoZSBlamItamFyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotYmVhbiB3aXRoIHRoZSBlamItbmFtZSBvZiB0aGUgdGFyZ2V0IGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tCi10aGUgcGF0aCBuYW1lIGJ5ICIjIi4gIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIHdhciBmaWxlCi1jb250YWluaW5nIHRoZSB3ZWIgYXBwbGljYXRpb24gdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuLgotVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lIGVqYi1uYW1lIHRvIGJlCi11bmlxdWVseSBpZGVudGlmaWVkLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlamItcmVmCi0KLUV4YW1wbGVzOgotCi0JPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLQotCTxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLQotLS0+Ci08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxvY2FsLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24KLQkgIHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQktIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBlamItbG9jYWwtcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLAotCQlsb2NhbC1ob21lLCBsb2NhbCwgZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8KLWFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgotCSAgdGhlIHdlYiBhcHBsaWNhdGlvbiB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCS0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsCi0JCWhvbWUsIHJlbW90ZSwgZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoZQotRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzCi1yZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLXdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYKLQotRXhhbXBsZToKLQotPGVqYi1yZWYtbmFtZT5lamIvUGF5cm9sbDwvZWpiLXJlZi1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQotcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLQk8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYiBhcHBsaWNhdGlvbidzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwKLXZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZSBzdXBwbGllZAotZHVyaW5nIGRlcGxveW1lbnQuCi0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnkgKGRlc2NyaXB0aW9uPywgZW52LWVudHJ5LW5hbWUsIGVudi1lbnRyeS12YWx1ZT8sCi1lbnYtZW50cnktdHlwZSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgd2ViIGFwcGxpY2F0aW9ucydzCi1lbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LW5hbWU+bWluQW1vdW50PC9lbnYtZW50cnktbmFtZT4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mCi10aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MKLWNvZGUuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6Ci0KLQlqYXZhLmxhbmcuQm9vbGVhbgotCWphdmEubGFuZy5CeXRlCi0JamF2YS5sYW5nLkNoYXJhY3RlcgotCWphdmEubGFuZy5TdHJpbmcKLQlqYXZhLmxhbmcuU2hvcnQKLQlqYXZhLmxhbmcuSW50ZWdlcgotCWphdmEubGFuZy5Mb25nCi0JamF2YS5sYW5nLkZsb2F0Ci0JamF2YS5sYW5nLkRvdWJsZQotCi1Vc2VkIGluOiBlbnYtZW50cnkKLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHdlYiBhcHBsaWNhdGlvbidzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi1jb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhIHNpbmdsZSBTdHJpbmcKLXBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQKLQotVXNlZCBpbjogZXJyb3ItcGFnZQotLS0+Ci08IUVMRU1FTlQgZXJyb3ItY29kZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlcnJvci1wYWdlIGVsZW1lbnQgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQotb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGVycm9yLXBhZ2UgKChlcnJvci1jb2RlIHwgZXhjZXB0aW9uLXR5cGUpLCBsb2NhdGlvbik+Ci0KLTwhLS0KLVRoZSBleGNlcHRpb24gdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEKLUphdmEgZXhjZXB0aW9uIHR5cGUuCi0KLVVzZWQgaW46IGVycm9yLXBhZ2UKLS0tPgotPCFFTEVNRU5UIGV4Y2VwdGlvbi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KLWV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLQotVXNlZCBpbjogbWltZS1tYXBwaW5nCi0tLT4KLTwhRUxFTUVOVCBleHRlbnNpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1EZWNsYXJlcyBhIGZpbHRlciBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0bwotZWl0aGVyIGEgc2VydmxldCBvciBhIFVSTCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCB1c2luZwotdGhlIGZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZQotaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGF0Ci1ydW50aW1lIHZpYSB0aGUgRmlsdGVyQ29uZmlnIGludGVyZmFjZS4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgZmlsdGVyIChpY29uPywgZmlsdGVyLW5hbWUsIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywKLWZpbHRlci1jbGFzcywgaW5pdC1wYXJhbSopPgotCi08IS0tCi1UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgotCi1Vc2VkIGluOiBmaWx0ZXIKLS0tPgotPCFFTEVNRU5UIGZpbHRlci1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLURlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZQotY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycwotdG8gYXBwbHkgdG8gYSByZXF1ZXN0LCBhbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZQotcmVxdWVzdCBVUkkgdG8gYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycwotdG8gYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uIHNlcnZsZXQtbmFtZSwKLW9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaAotc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluIHdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluCi13aGljaCBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhCi1zZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUgZmlsdGVyLW5hbWUKLXZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSA8ZmlsdGVyLW5hbWU+IHN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlCi08ZmlsdGVyPiBkZWNsYXJhdGlvbnMgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgZmlsdGVyLW1hcHBpbmcgKGZpbHRlci1uYW1lLCAodXJsLXBhdHRlcm4gfCBzZXJ2bGV0LW5hbWUpKT4KLQotPCEtLQotVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBtYXAgdGhlIGZpbHRlci4KLUVhY2ggZmlsdGVyIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiBmaWx0ZXIsIGZpbHRlci1tYXBwaW5nCi0tLT4KLTwhRUxFTUVOVCBmaWx0ZXItbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcAotd2hlcmUgdGhlIGVycm9yIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiBsb2dpbiBpcyBub3Qgc3VjY2Vzc2Z1bAotY2FuIGJlIGZvdW5kLiBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLXJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLVVzZWQgaW46IGZvcm0tbG9naW4tY29uZmlnCi0tLT4KLTwhRUxFTUVOVCBmb3JtLWVycm9yLXBhZ2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZm9ybS1sb2dpbi1jb25maWcgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvciBwYWdlcwotdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkIGF1dGhlbnRpY2F0aW9uCi1pcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCi0KLVVzZWQgaW46IGxvZ2luLWNvbmZpZwotLS0+Ci08IUVMRU1FTlQgZm9ybS1sb2dpbi1jb25maWcgKGZvcm0tbG9naW4tcGFnZSwgZm9ybS1lcnJvci1wYWdlKT4KLQotPCEtLQotVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwCi13aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUgZm91bmQuIFRoZSBwYXRoCi1iZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotVXNlZCBpbjogZm9ybS1sb2dpbi1jb25maWcKLS0tPgotPCFFTEVNRU5UIGZvcm0tbG9naW4tcGFnZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1yZWYKLQotRXhhbXBsZToKLQotPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+Ci0tLT4KLTwhRUxFTUVOVCBob21lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGh0dHAtbWV0aG9kIGNvbnRhaW5zIGFuIEhUVFAgbWV0aG9kIChHRVQgfCBQT1NUIHwuLi4pLgotCi1Vc2VkIGluOiB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbgotLS0+Ci08IUVMRU1FTlQgaHR0cC1tZXRob2QgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMgdGhhdAotc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZXMKLXVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotCi1Vc2VkIGluOiBmaWx0ZXIsIHNlcnZsZXQsIHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4KLWluaXRpYWxpemF0aW9uIHBhcmFtIG9mIHRoZSBzZXJ2bGV0Ci0KLVVzZWQgaW46IGZpbHRlciwgc2VydmxldAotLS0+Ci08IUVMRU1FTlQgaW5pdC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+Ci0KLTwhLS0KLVRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZSB3aXRoaW4KLXRoZSB3ZWIgYXBwbGljYXRpb24gYmVnaW5uaW5nIHdpdGggYSBgLycuCi0KLVVzZWQgaW46IHNlcnZsZXQKLS0tPgotPCFFTEVNRU5UIGpzcC1maWxlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBsYXJnZSAoMzIgeCAzMikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MKLXdhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsaXN0ZW5lciBlbGVtZW50IGluZGljYXRlcyB0aGUgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYgotYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgbGlzdGVuZXIgKGxpc3RlbmVyLWNsYXNzKT4KLQotPCEtLQotVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gbXVzdCBiZQotcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiBUaGUgdmFsdWUgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGxpc3RlbmVyIGNsYXNzLgotCi0KLVVzZWQgaW46IGxpc3RlbmVyCi0tLT4KLTwhRUxFTUVOVCBsaXN0ZW5lci1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHNlcnZsZXQgc2hvdWxkIGJlCi1sb2FkZWQgKGluc3RhbnRpYXRlZCBhbmQgaGF2ZSBpdHMgaW5pdCgpIGNhbGxlZCkgb24gdGhlIHN0YXJ0dXAKLW9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZgotdGhlc2UgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4gd2hpY2gKLXRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIElmIHRoZSB2YWx1ZSBpcyBhIG5lZ2F0aXZlIGludGVnZXIsCi1vciB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgdGhlCi1zZXJ2bGV0IHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlIGludGVnZXIKLW9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZCBpbml0aWFsaXplIHRoZSBzZXJ2bGV0IGFzIHRoZQotYXBwbGljYXRpb24gaXMgZGVwbG95ZWQuIFRoZSBjb250YWluZXIgbXVzdCBndWFyYW50ZWUgdGhhdAotc2VydmxldHMgbWFya2VkIHdpdGggbG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZCBiZWZvcmUgc2VydmxldHMKLW1hcmtlZCB3aXRoIGhpZ2hlciBpbnRlZ2Vycy4gVGhlIGNvbnRhaW5lciBtYXkgY2hvb3NlIHRoZSBvcmRlcgotb2YgbG9hZGluZyBvZiBzZXJ2bGV0cyB3aXRoIHRoZSBzYW1lIGxvYWQtb24tc3RhcnQtdXAgdmFsdWUuCi0KLVVzZWQgaW46IHNlcnZsZXQKLS0tPgotPCFFTEVNRU5UIGxvYWQtb24tc3RhcnR1cCAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIGxvY2FsIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmCi0KLS0tPgotPCFFTEVNRU5UIGxvY2FsICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgbG9jYWwtaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmCi0tLT4KLTwhRUxFTUVOVCBsb2NhbC1ob21lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgd2ViCi1hcHBsaWNhdGlvbiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YKLXRoZSBsb2NhdGlvbiBtdXN0IGhhdmUgYSBsZWFkaW5nIGAvJy4KLQotVXNlZCBpbjogZXJyb3ItcGFnZQotLS0+Ci08IUVMRU1FTlQgbG9jYXRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbG9naW4tY29uZmlnIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi1tZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IKLXRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4KLW1lY2hhbmlzbS4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgbG9naW4tY29uZmlnIChhdXRoLW1ldGhvZD8sIHJlYWxtLW5hbWU/LCBmb3JtLWxvZ2luLWNvbmZpZz8pPgotCi08IS0tCi1UaGUgbWltZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24KLWFuZCBhIG1pbWUgdHlwZS4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgbWltZS1tYXBwaW5nIChleHRlbnNpb24sIG1pbWUtdHlwZSk+Ci0KLTwhLS0KLVRoZSBtaW1lLXR5cGUgZWxlbWVudCBjb250YWlucyBhIGRlZmluZWQgbWltZSB0eXBlLiBleGFtcGxlOgotInRleHQvcGxhaW4iCi0KLVVzZWQgaW46IG1pbWUtbWFwcGluZwotLS0+Ci08IUVMRU1FTlQgbWltZS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4gRWFjaCBwYXJhbWV0ZXIKLW5hbWUgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCi1Vc2VkIGluOiBjb250ZXh0LXBhcmFtLCBpbml0LXBhcmFtCi0tLT4KLTwhRUxFTUVOVCBwYXJhbS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgotCi1Vc2VkIGluOiBjb250ZXh0LXBhcmFtLCBpbml0LXBhcmFtCi0tLT4KLTwhRUxFTUVOVCBwYXJhbS12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvIHVzZSBpbiBIVFRQCi1CYXNpYyBhdXRob3JpemF0aW9uLgotCi1Vc2VkIGluOiBsb2dpbi1jb25maWcKLS0tPgotPCFFTEVNRU5UIHJlYWxtLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCi08cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLS0tPgotPCFFTEVNRU5UIHJlbW90ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtYXV0aCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZSBzaWducwotb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyCi13aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIEluIHRoZQotbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotRGVwbG95ZXIuCi0KLVRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlIG1hbmFnZXIKLWNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXNoYXJpbmctc2NvcGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZAotdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZQotc2hhcmVkLiBUaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50LCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgb25lIG9mIHRoZQotdHdvIGZvbGxvd2luZzoKLQotCTxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCTxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtc2hhcmluZy1zY29wZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UuIFRoZSB0eXBlCi1pcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQotZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MKLXJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlCi1pbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuCi1pbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieQotdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLUV4YW1wbGU6Ci0KLTxyZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotPC9yZXNvdXJjZS1lbnYtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZiAoZGVzY3JpcHRpb24/LCByZXNvdXJjZS1lbnYtcmVmLW5hbWUsCi0JCXJlc291cmNlLWVudi1yZWYtdHlwZSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZQotZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogcmVzb3VyY2UtZW52LXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBhIHJlc291cmNlCi1lbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhCi1sYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHJlc291cmNlLWVudi1yZWYKLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MKLXJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsCi10aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZQotZXhwZWN0ZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbgotKEFwcGxpY2F0aW9uIG9yIENvbnRhaW5lciksIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZQotc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlIChTaGFyZWFibGUgb3IKLVVuc2hhcmVhYmxlKS4KLQotVXNlZCBpbjogd2ViLWFwcAotCi1FeGFtcGxlOgotCi0gICAgPHJlc291cmNlLXJlZj4KLQk8cmVzLXJlZi1uYW1lPmpkYmMvRW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotCTxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+Ci0JPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0JPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1yZWYgKGRlc2NyaXB0aW9uPywgcmVzLXJlZi1uYW1lLCByZXMtdHlwZSwgcmVzLWF1dGgsCi0JCXJlcy1zaGFyaW5nLXNjb3BlPyk+Ci0KLTwhLS0KLVRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgc2VjdXJpdHkgcm9sZS4gVGhlCi1yb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eSByb2xlcwotZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotVXNlZCBpbjogc2VjdXJpdHktcm9sZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJvbGUtbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotVXNlZCBpbjogYXV0aC1jb25zdHJhaW50LCBydW4tYXMsIHNlY3VyaXR5LXJvbGUsIHNlY3VyaXR5LXJvbGUtcmVmCi0tLT4KLTwhRUxFTUVOVCByb2xlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcnVuLWFzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlCi1leGVjdXRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGFuZAotdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1Vc2VkIGluOiBzZXJ2bGV0Ci0tLT4KLTwhRUxFTUVOVCBydW4tYXMgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eQotY29uc3RyYWludHMgd2l0aCBvbmUgb3IgbW9yZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbnMKLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktY29uc3RyYWludCAoZGlzcGxheS1uYW1lPywgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24rLAotYXV0aC1jb25zdHJhaW50PywgdXNlci1kYXRhLWNvbnN0cmFpbnQ/KT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5Ci1yb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUKLXNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0KLUV4YW1wbGU6Ci0KLSAgICA8c2VjdXJpdHktcm9sZT4KLQk8ZGVzY3JpcHRpb24+Ci0JICAgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAotCSAgICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0JPC9kZXNjcmlwdGlvbj4KLQk8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcm9sZSAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktcm9sZS1yZWYgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eQotcm9sZSByZWZlcmVuY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbidzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cwotb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSwKLWFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlIHNlY3VyaXR5IHJvbGUgaXMgbm90Ci1zcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbiBhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotCi1UaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkIGFzIHRoZQotcGFyYW1ldGVyIHRvIHRoZSBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kCi1vciB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLgotCi1Vc2VkIGluOiBzZXJ2bGV0Ci0KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUtcmVmIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSwgcm9sZS1saW5rPyk+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYQotc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcwotcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQgbG9hZGVkLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBzZXJ2bGV0IChpY29uPywgc2VydmxldC1uYW1lLCBkaXNwbGF5LW5hbWU/LCBkZXNjcmlwdGlvbj8sCi0oc2VydmxldC1jbGFzc3xqc3AtZmlsZSksIGluaXQtcGFyYW0qLCBsb2FkLW9uLXN0YXJ0dXA/LCBydW4tYXM/LCBzZWN1cml0eS1yb2xlLXJlZiopPgotCi08IS0tCi1UaGUgc2VydmxldC1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotb2YgdGhlIHNlcnZsZXQuCi0KLVVzZWQgaW46IHNlcnZsZXQKLS0tPgotPCFFTEVNRU5UIHNlcnZsZXQtY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhIHNlcnZsZXQKLWFuZCBhIHVybCBwYXR0ZXJuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIHNlcnZsZXQtbWFwcGluZyAoc2VydmxldC1uYW1lLCB1cmwtcGF0dGVybik+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlCi1zZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLVVzZWQgaW46IGZpbHRlci1tYXBwaW5nLCBzZXJ2bGV0LCBzZXJ2bGV0LW1hcHBpbmcKLS0tPgotPCFFTEVNRU5UIHNlcnZsZXQtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLWNvbmZpZyBlbGVtZW50IGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycyBmb3IKLXRoaXMgd2ViIGFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBzZXNzaW9uLWNvbmZpZyAoc2Vzc2lvbi10aW1lb3V0Pyk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dAotaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUKLXNwZWNpZmllZCB0aW1lb3V0IG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi1JZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcyB0aGUgZGVmYXVsdAotYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUgb3V0LgotCi1Vc2VkIGluOiBzZXNzaW9uLWNvbmZpZwotLS0+Ci08IUVMRU1FTlQgc2Vzc2lvbi10aW1lb3V0ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MKLXdhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0YWdsaWIgZWxlbWVudCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgSlNQIHRhZyBsaWJyYXJ5LgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCB0YWdsaWIgKHRhZ2xpYi11cmksIHRhZ2xpYi1sb2NhdGlvbik+Ci0KLTwhLS0KLXRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gKGFzIGEgcmVzb3VyY2UKLXJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZwotTGliYXJ5IERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLQotVXNlZCBpbjogdGFnbGliCi0tLT4KLTwhRUxFTUVOVCB0YWdsaWItbG9jYXRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSwgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uCi1vZiB0aGUgd2ViLnhtbCBkb2N1bWVudCwgaWRlbnRpZnlpbmcgYSBUYWcgTGlicmFyeSB1c2VkIGluIHRoZSBXZWIKLUFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiB0YWdsaWIKLS0tPgotPCFFTEVNRU5UIHRhZ2xpYi11cmkgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdHJhbnNwb3J0LWd1YXJhbnRlZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi1iZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IKLUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueQotdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24KLXJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluCi1zdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMKLXRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYQotZmFzaGlvbiB0aGF0IHByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20gb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZgotdGhlIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvcgotQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzIHJlcXVpcmVkLgotCi1Vc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAotLS0+Ci08IUVMRU1FTlQgdHJhbnNwb3J0LWd1YXJhbnRlZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB1cmwtcGF0dGVybiBlbGVtZW50IGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4gTXVzdAotZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZSBTZXJ2bGV0IEFQSQotU3BlY2lmaWNhdGlvbi4KLQotVXNlZCBpbjogZmlsdGVyLW1hcHBpbmcsIHNlcnZsZXQtbWFwcGluZywgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24KLS0tPgotPCFFTEVNRU5UIHVybC1wYXR0ZXJuICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHVzZXItZGF0YS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cgZGF0YQotY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZSBwcm90ZWN0ZWQuCi0KLVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLS0tPgotPCFFTEVNRU5UIHVzZXItZGF0YS1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHRyYW5zcG9ydC1ndWFyYW50ZWUpPgotCi08IS0tCi1UaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0Ci1vZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbiBhIHdlYgotYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmIG5vIEhUVFAgbWV0aG9kcwotYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzIHRvIGFsbCBIVFRQCi1tZXRob2RzLgotCi1Vc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0tLT4KLTwhRUxFTUVOVCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiAod2ViLXJlc291cmNlLW5hbWUsIGRlc2NyaXB0aW9uPywKLXVybC1wYXR0ZXJuKiwgaHR0cC1tZXRob2QqKT4KLQotPCEtLQotVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViIHJlc291cmNlCi1jb2xsZWN0aW9uLgotCi1Vc2VkIGluOiB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbgotLS0+Ci08IUVMRU1FTlQgd2ViLXJlc291cmNlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgd2VsY29tZS1maWxlIGVsZW1lbnQgY29udGFpbnMgZmlsZSBuYW1lIHRvIHVzZSBhcyBhIGRlZmF1bHQKLXdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0KLVVzZWQgaW46IHdlbGNvbWUtZmlsZS1saXN0Ci0tLT4KLTwhRUxFTUVOVCB3ZWxjb21lLWZpbGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUgZmlsZXMKLWVsZW1lbnRzLgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCB3ZWxjb21lLWZpbGUtbGlzdCAod2VsY29tZS1maWxlKyk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZS4sIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbC1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRvb2xzIGFyZSBub3QgYWxsb3dlZCB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHRoZQotc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCBhdXRoLWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXV0aC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udGV4dC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzdHJpYnV0YWJsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItbG9jYWwtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVycm9yLWNvZGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXJyb3ItcGFnZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBleGNlcHRpb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBleHRlbnNpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmlsdGVyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZpbHRlci1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmaWx0ZXItbWFwcGluZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmaWx0ZXItbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmb3JtLWVycm9yLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZm9ybS1sb2dpbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZm9ybS1sb2dpbi1wYWdlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaHR0cC1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpbml0LXBhcmFtIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGpzcC1maWxlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdGVuZXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdGVuZXItY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9hZC1vbi1zdGFydHVwIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2FsIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2FsLWhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9naW4tY29uZmlnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1pbWUtbWFwcGluZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtaW1lLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGFyYW0tbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwYXJhbS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWFsbS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbW90ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtYXV0aCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXNoYXJpbmctc2NvcGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJ1bi1hcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1jb25zdHJhaW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXJ2bGV0LWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQtbWFwcGluZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXJ2bGV0LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbi10aW1lb3V0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZ2xpYi1sb2NhdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWdsaWItdXJpIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zcG9ydC1ndWFyYW50ZWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXJsLXBhdHRlcm4gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXNlci1kYXRhLWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLWFwcCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWItcmVzb3VyY2UtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWxjb21lLWZpbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2VsY29tZS1maWxlLWxpc3QgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl80LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWEyNTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMi40Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyl3ZWItYXBwXzJfNC54c2RzCTEuNjAgMDMvMDgvMjYKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDA0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBTZXJ2bGV0IDIuNCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJXRUItSU5GL3dlYi54bWwiIGluIHRoZQotCXdlYiBhcHBsaWNhdGlvbidzIHdhciBmaWxlLiAgQWxsIFNlcnZsZXQgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotCW11c3QgaW5kaWNhdGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEoyRUUKLQluYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotCSAgICAgIHZlcnNpb249IjIuNCI+Ci0JICAgICAgLi4uCi0JICAgIDwvd2ViLWFwcD4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEoyRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImpzcF8yXzAueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1hcHAiIHR5cGU9ImoyZWU6d2ViLWFwcFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCB0aGUgc3ViLWVsZW1lbnRzCi0Jb2YgdGhpcyBlbGVtZW50IGNhbiBiZSBpbiB0aGUgYXJiaXRyYXJ5IG9yZGVyLiBCZWNhdXNlIG9mCi0JdGhhdCwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgZWxlbWVudHMgb2YgZGlzdHJpYnV0YWJsZSwKLQlzZXNzaW9uLWNvbmZpZywgd2VsY29tZS1maWxlLWxpc3QsIGpzcC1jb25maWcsIGxvZ2luLWNvbmZpZywKLQlhbmQgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCB3YXMgY2hhbmdlZCBmcm9tICI/IiB0byAiKiIKLQlpbiB0aGlzIHNjaGVtYS4gIEhvd2V2ZXIsIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW5zdGFuY2UKLQlmaWxlIG11c3Qgbm90IGNvbnRhaW4gbXVsdGlwbGUgZWxlbWVudHMgb2Ygc2Vzc2lvbi1jb25maWcsCi0JanNwLWNvbmZpZywgYW5kIGxvZ2luLWNvbmZpZy4gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZWxlbWVudHMgb2YKLQl3ZWxjb21lLWZpbGUtbGlzdCBvciBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0LCB0aGUgY29udGFpbmVyCi0JbXVzdCBjb25jYXRpbmF0ZSB0aGUgZWxlbWVudCBjb250ZW50cy4gIFRoZSBtdWx0aXBsZSBvY2N1cmFuY2UKLQlvZiB0aGUgZWxlbWVudCBkaXN0cmlidXRhYmxlIGlzIHJlZHVuZGFudCBhbmQgdGhlIGNvbnRhaW5lcgotCXRyZWF0cyB0aGF0IGNhc2UgZXhhY3RseSBpbiB0aGUgc2FtZSB3YXkgd2hlbiB0aGVyZSBpcyBvbmx5Ci0Jb25lIGRpc3RyaWJ1dGFibGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtc2VydmxldC1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlcnZsZXQuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZXJ2bGV0Ii8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnNlcnZsZXQtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZmlsdGVyLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZmlsdGVyIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWx0ZXIuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpmaWx0ZXIiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZmlsdGVyLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItbG9jYWwtcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgotCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCi0JICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotCSAgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLQkgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCi0JICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotCSAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotCSAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXMtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSB3ZWIKLQkgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lCi0JICBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJ3ZWItYXBwLXJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgQSByb2xlLW5hbWUta2V5IGlzIHNwZWNpZmllZCB0byBhbGxvdyB0aGUgcmVmZXJlbmNlcwotCSAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotCi0gICAgPHhzZDprZXlyZWYgbmFtZT0id2ViLWFwcC1yb2xlLW5hbWUtcmVmZXJlbmNlcyIKLQkJcmVmZXI9ImoyZWU6d2ViLWFwcC1yb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLQkgIHNlY3VyaXR5LXJvbGUtcmVmIHRvIGEgc3BlY2lmaWVkIHJvbGUtbmFtZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZXJ2bGV0L2oyZWU6c2VjdXJpdHktcm9sZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGgtY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdXRoLWNvbnN0cmFpbnRUeXBlIGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0Ci0Jc2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZQotCWNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUgdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQKLQl0byB0aGUgcm9sZS1uYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cwotCWRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBvciBiZSB0aGUgc3BlY2lhbGx5Ci0JcmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yCi0JaW5kaWNhdGluZyBhbGwgcm9sZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gSWYgYm90aCAiKiIKLQlhbmQgcm9sZW5hbWVzIGFwcGVhciwgdGhlIGNvbnRhaW5lciBpbnRlcnByZXRzIHRoaXMgYXMgYWxsCi0Jcm9sZXMuICBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcwotCXRvIHRoZSBwb3J0aW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVzY3JpYmVkIGJ5IHRoZQotCWNvbnRhaW5pbmcgc2VjdXJpdHktY29uc3RyYWludC4gIFRoZSBjb250YWluZXIgbWF0Y2hlcwotCXJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nIGFjY2Vzcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGgtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGF1dGgtbWV0aG9kVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLQltZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvCi0JZ2FpbmluZyBhY2Nlc3MgdG8gYW55IHdlYiByZXNvdXJjZXMgd2hpY2ggYXJlIHByb3RlY3RlZCBieQotCWFuIGF1dGhvcml6YXRpb24gY29uc3RyYWludCwgYSB1c2VyIG11c3QgaGF2ZSBhdXRoZW50aWNhdGVkCi0JdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgYXJlICJCQVNJQyIsCi0JIkRJR0VTVCIsICJGT1JNIiwgIkNMSUVOVC1DRVJUIiwgb3IgYSB2ZW5kb3Itc3BlY2lmaWMKLQlhdXRoZW50aWNhdGlvbiBzY2hlbWUuCi0KLQlVc2VkIGluOiBsb2dpbi1jb25maWcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNwYXRjaGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGRpc3BhdGNoZXIgaGFzIGZvdXIgbGVnYWwgdmFsdWVzOiBGT1JXQVJELCBSRVFVRVNULCBJTkNMVURFLAotCWFuZCBFUlJPUi4gQSB2YWx1ZSBvZiBGT1JXQVJEIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkCi0JdW5kZXIgUmVxdWVzdERpc3BhdGNoZXIuZm9yd2FyZCgpIGNhbGxzLiAgQSB2YWx1ZSBvZiBSRVFVRVNUCi0JbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvCi0JdGhlIHBhdGggb3Igc2VydmxldC4gQSB2YWx1ZSBvZiBJTkNMVURFIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZQotCWFwcGxpZWQgdW5kZXIgUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpIGNhbGxzLiAgQSB2YWx1ZSBvZgotCUVSUk9SIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyIHRoZSBlcnJvciBwYWdlCi0JbWVjaGFuaXNtLiAgVGhlIGFic2VuY2Ugb2YgYW55IGRpc3BhdGNoZXIgZWxlbWVudHMgaW4gYQotCWZpbHRlci1tYXBwaW5nIGluZGljYXRlcyBhIGRlZmF1bHQgb2YgYXBwbHlpbmcgZmlsdGVycyBvbmx5IHVuZGVyCi0Jb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSBwYXRoIG9yIHNlcnZsZXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPUldBUkQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkNMVURFIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUVTVCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVSUk9SIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbmNvZGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbmNvZGluZ1R5cGUgZGVmaW5lcyBJQU5BIGNoYXJhY3RlciBzZXRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXlxzXSsiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItY29kZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAotCi0JVXNlZCBpbjogZXJyb3ItcGFnZQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6eHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSJcZHszfSIvPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlcnJvci1wYWdlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVycm9yLXBhZ2VUeXBlIGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUKLQlvciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvci1jb2RlIgotCQkgICAgIHR5cGU9ImoyZWU6ZXJyb3ItY29kZVR5cGUiLz4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tdHlwZSIKLQkJICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZXhjZXB0aW9uLXR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkgICAgICBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6d2FyLXBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZQotCSAgICByZXNvdXJjZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JICAgIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gbXVzdCBoYXZlCi0JICAgIGEgbGVhZGluZyBgLycuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViCi0JYXBwbGljYXRpb24gaXMgZG9uZSBieSB1c2luZyBmaWx0ZXItbWFwcGluZ1R5cGUuCi0JVGhlIGNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZwotCWRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsCi0JYW5kIGluIHdoYXQgb3JkZXIuIFRoZSBjb250YWluZXIgbWF0Y2hlcyB0aGUgcmVxdWVzdCBVUkkgdG8KLQlhIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzIHRvCi0JYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uCi0Jc2VydmxldC1uYW1lLCBvciBvbiB1cmwtcGF0dGVybiBmb3IgZWFjaCBmaWx0ZXItbWFwcGluZwotCWVsZW1lbnQsIGRlcGVuZGluZyBvbiB3aGljaCBzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4KLQl3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaAotCWZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEKLQlzZXJ2bGV0IGFwcGVhciBpbiB0aGUgbGlzdCBvZiBmaWx0ZXItbWFwcGluZyBlbGVtZW50cy5UaGUKLQlmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgZmlsdGVyLW5hbWUKLQlzdWItZWxlbWVudHMgb2Ygb25lIG9mIHRoZSBmaWx0ZXIgZGVjbGFyYXRpb25zIGluIHRoZQotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbmFtZSIKLQkJICAgdHlwZT0iajJlZTpmaWx0ZXItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0JCSAgICAgdHlwZT0iajJlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGF0Y2hlciIKLQkJICAgdHlwZT0iajJlZTpkaXNwYXRjaGVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXItbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlciBpcyBkZWNsYXJlCi0JYnkgdXNpbmcgZmlsdGVyLW5hbWVUeXBlLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBtYXAgdGhlCi0JZmlsdGVyLiAgRWFjaCBmaWx0ZXIgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4KLQotCVVzZWQgaW46IGZpbHRlciwgZmlsdGVyLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGZpbHRlclR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgZmlsdGVyIGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4gVGhlIGZpbHRlciBpcyBtYXBwZWQgdG8gZWl0aGVyIGEgc2VydmxldCBvciBhCi0JVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZQotCWZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZQotCWluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmZpbHRlci1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGZpbHRlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcwotCSAgICBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiBhIHNlcnZsZXQgZmlsdGVyCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZm9ybS1sb2dpbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZm9ybS1sb2dpbi1jb25maWdUeXBlIHNwZWNpZmllcyB0aGUgbG9naW4gYW5kIGVycm9yCi0JcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkCi0JYXV0aGVudGljYXRpb24gaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotCi0JVXNlZCBpbjogbG9naW4tY29uZmlnCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWxvZ2luLXBhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6d2FyLXBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIKLQkgICAgYXBwIHdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZQotCSAgICBmb3VuZC4gIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAotCSAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1lcnJvci1wYWdlIgotCQkgICB0eXBlPSJqMmVlOndhci1wYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbgotCSAgICB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZAotCSAgICB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZC4KLQkgICAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi0JICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJodHRwLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGh0dHAtbWV0aG9kIGNvbnRhaW5zIGFuIEhUVFAgbWV0aG9kIHJlY29nbml6ZWQgYnkgdGhlCi0Jd2ViLWFwcCwgZm9yIGV4YW1wbGUgR0VULCBQT1NULCAuLi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iR0VUIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBVVCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFTEVURSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhFQUQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJT05TIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVFJBQ0UiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QgY29udGFpbnMgb25lIG9yIG1vcmUKLQlsb2NhbGUtZW5jb2RpbmctbWFwcGluZyhzKS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpsb2NhbGUtZW5jb2RpbmctbWFwcGluZ1R5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcgY29udGFpbnMgbG9jYWxlIG5hbWUgYW5kCi0JZW5jb2RpbmcgbmFtZS4gVGhlIGxvY2FsZSBuYW1lIG11c3QgYmUgZWl0aGVyICJMYW5ndWFnZS1jb2RlIiwKLQlzdWNoIGFzICJqYSIsIGRlZmluZWQgYnkgSVNPLTYzOSBvciAiTGFuZ3VhZ2UtY29kZV9Db3VudHJ5LWNvZGUiLAotCXN1Y2ggYXMgImphX0pQIi4gICJDb3VudHJ5IGNvZGUiIGlzIGRlZmluZWQgYnkgSVNPLTMxNjYuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNvZGluZyIKLQkJICAgdHlwZT0iajJlZTplbmNvZGluZ1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2FsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbGVUeXBlIGRlZmluZXMgdmFsaWQgbG9jYWxlIGRlZmluZWQgYnkgSVNPLTYzOS0xCi0JYW5kIElTTy0zMTY2LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbYS16XXsyfShffC0pPyhbXHB7TH1cLVxwe05kfV17Mn0pPyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9naW4tY29uZmlnVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLQltZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUKLQl1c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUKLQluZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4gbWVjaGFuaXNtLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtbWV0aG9kIgotCQkgICB0eXBlPSJqMmVlOmF1dGgtbWV0aG9kVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhbG0tbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvCi0JICAgIHVzZSBpbiBIVFRQIEJhc2ljIGF1dGhvcml6YXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1jb25maWciCi0JCSAgIHR5cGU9ImoyZWU6Zm9ybS1sb2dpbi1jb25maWdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtaW1lLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWltZS1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotCWFuZCBhIG1pbWUgdHlwZS4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuCi0JICBleHRlbnNpb24uIGV4YW1wbGU6ICJ0eHQiCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6bWltZS10eXBlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtaW1lLXR5cGVUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBkZWZpbmVkIG1pbWUgdHlwZS4KLQotCUV4YW1wbGU6Ci0JInRleHQvcGxhaW4iCi0KLQlVc2VkIGluOiBtaW1lLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW15ccHtDY31eXHNdKy9bXlxwe0NjfV5cc10rIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9uRW1wdHlTdHJpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JVGhpcyB0eXBlIGRlZmluZXMgYSBzdHJpbmcgd2hpY2ggY29udGFpbnMgYXQgbGVhc3Qgb25lCi0JY2hhcmFjdGVyLgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6bWluTGVuZ3RoIHZhbHVlPSIxIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZWN1cml0eS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGFzc29jaWF0ZQotCXNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlCi0JY29sbGVjdGlvbnMKLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIgotCQkgICB0eXBlPSJqMmVlOndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLWNvbnN0cmFpbnQiCi0JCSAgIHR5cGU9ImoyZWU6YXV0aC1jb25zdHJhaW50VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1kYXRhLWNvbnN0cmFpbnQiCi0JCSAgIHR5cGU9ImoyZWU6dXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmxldC1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEKLQlzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0JCSAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldC1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKLQlzZXJ2bGV0LiBFYWNoIHNlcnZsZXQgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2bGV0VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBzZXJ2bGV0LgotCUl0IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEKLQlzZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cAotCWVsZW1lbnQgaXMgcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQKLQlsb2FkZWQuCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWNsYXNzIgotCQkgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtZmlsZSIKLQkJICAgICB0eXBlPSJqMmVlOmpzcC1maWxlVHlwZSIvPgotCi0gICAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYWQtb24tc3RhcnR1cCIKLQkJICAgdHlwZT0iajJlZTp4c2RJbnRlZ2VyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMKLQkgICAgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIChpbnN0YW50aWF0ZWQgYW5kIGhhdmUKLQkgICAgaXRzIGluaXQoKSBjYWxsZWQpIG9uIHRoZSBzdGFydHVwIG9mIHRoZSB3ZWIKLQkgICAgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZiB0aGVzZQotCSAgICBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbgotCSAgICB3aGljaCB0aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBJZiB0aGUgdmFsdWUKLQkgICAgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLCBvciB0aGUgZWxlbWVudCBpcyBub3QKLQkgICAgcHJlc2VudCwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgdGhlIHNlcnZsZXQKLQkgICAgd2hlbmV2ZXIgaXQgY2hvb3Nlcy4gSWYgdGhlIHZhbHVlIGlzIGEgcG9zaXRpdmUKLQkgICAgaW50ZWdlciBvciAwLCB0aGUgY29udGFpbmVyIG11c3QgbG9hZCBhbmQKLQkgICAgaW5pdGlhbGl6ZSB0aGUgc2VydmxldCBhcyB0aGUgYXBwbGljYXRpb24gaXMKLQkgICAgZGVwbG95ZWQuIFRoZSBjb250YWluZXIgbXVzdCBndWFyYW50ZWUgdGhhdAotCSAgICBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBsb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkCi0JICAgIGJlZm9yZSBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBoaWdoZXIgaW50ZWdlcnMuIFRoZQotCSAgICBjb250YWluZXIgbWF5IGNob29zZSB0aGUgb3JkZXIgb2YgbG9hZGluZyBvZgotCSAgICBzZXJ2bGV0cyB3aXRoIHRoZSBzYW1lIGxvYWQtb24tc3RhcnQtdXAgdmFsdWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icnVuLWFzIgotCQkgICB0eXBlPSJqMmVlOnJ1bi1hc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlc3Npb24tY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMKLQlmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10aW1lb3V0IgotCQkgICB0eXBlPSJqMmVlOnhzZEludGVnZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdAotCSAgICBzZXNzaW9uIHRpbWVvdXQgaW50ZXJ2YWwgZm9yIGFsbCBzZXNzaW9ucyBjcmVhdGVkCi0JICAgIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgc3BlY2lmaWVkIHRpbWVvdXQKLQkgICAgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KLQkgICAgSWYgdGhlIHRpbWVvdXQgaXMgMCBvciBsZXNzLCB0aGUgY29udGFpbmVyIGVuc3VyZXMKLQkgICAgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUKLQkgICAgb3V0LiBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvbnRhaW5lcgotCSAgICBtdXN0IHNldCBpdHMgZGVmYXVsdCB0aW1lb3V0IHBlcmlvZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCi0JYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi0JQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90Ci0JcmVxdWlyZSBhbnkgdHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMKLQl0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUKLQljbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4ndCBiZQotCWNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi0JcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdAotCXByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20gb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZiB0aGUKLQl0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKLQlDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMKLQlyZXF1aXJlZC4KLQotCVVzZWQgaW46IHVzZXItZGF0YS1jb25zdHJhaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR1JBTCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPTkZJREVOVElBTCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHVzZXItZGF0YS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGhvdwotCWRhdGEgY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZQotCXByb3RlY3RlZC4KLQotCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlIgotCQkgICB0eXBlPSJqMmVlOnRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2FyLXBhdGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBhIHBhdGggc3RhcnRpbmcKLQl3aXRoIGEgIi8iIGFuZCBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiBhIFdBUgotCWZpbGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9Ii8uKiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0id2ViLWFwcC12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCi0Jd2ViLWFwcGxpY2F0aW9uIHN1cHBvcnRlZC4gSXQgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlCi0JdmVyc2lvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi40Ii8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1hcHBUeXBlIj4KLQotICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3RyaWJ1dGFibGUiCi0JCSAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dC1wYXJhbSIKLQkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiPgotCi0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uCi0JICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0Ci0JICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiCi0JCSAgIHR5cGU9ImoyZWU6ZmlsdGVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOmZpbHRlci1tYXBwaW5nVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyIgotCQkgICB0eXBlPSJqMmVlOmxpc3RlbmVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQiCi0JCSAgIHR5cGU9ImoyZWU6c2VydmxldFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6c2VydmxldC1tYXBwaW5nVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tY29uZmlnIgotCQkgICB0eXBlPSJqMmVlOnNlc3Npb24tY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTptaW1lLW1hcHBpbmdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2VsY29tZS1maWxlLWxpc3QiCi0JCSAgIHR5cGU9ImoyZWU6d2VsY29tZS1maWxlLWxpc3RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItcGFnZSIKLQkJICAgdHlwZT0iajJlZTplcnJvci1wYWdlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1jb25maWciCi0JCSAgIHR5cGU9ImoyZWU6anNwLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1jb25zdHJhaW50IgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4tY29uZmlnIgotCQkgICB0eXBlPSJqMmVlOmxvZ2luLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotCQkgICB0eXBlPSJqMmVlOnNlY3VyaXR5LXJvbGVUeXBlIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCIKLQkJICAgdHlwZT0iajJlZTpsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSIvPgotICAgIDwveHNkOmNob2ljZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6d2ViLWFwcC12ZXJzaW9uVHlwZSIKLQkJICAgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0Ci0Jb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4KLQlhIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYKLQlubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludAotCWFwcGxpZXMgdG8gYWxsIEhUVFAgbWV0aG9kcy4KLQotCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItcmVzb3VyY2UtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIKLQkgICAgcmVzb3VyY2UgY29sbGVjdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaHR0cC1tZXRob2QiCi0JCSAgIHR5cGU9ImoyZWU6aHR0cC1tZXRob2RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VsY29tZS1maWxlLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUKLQlmaWxlcyBlbGVtZW50cy4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUiCi0JCSAgIHR5cGU9InhzZDpzdHJpbmciCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UKLQkgICAgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl81LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA5MDJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMi41Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyl3ZWItYXBwXzJfNS54c2RzCTEuNjIgMDUvMDgvMDYKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAgICAgIFUuUy5BCi0gICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAyLjUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZCAiV0VCLUlORi93ZWIueG1sIiBpbiB0aGUKLQl3ZWIgYXBwbGljYXRpb24ncyB3YXIgZmlsZS4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLQltdXN0IGluZGljYXRlIHRoZSB3ZWIgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFCi0JbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0JICAgICAgdmVyc2lvbj0iMi41Ij4KLQkgICAgICAuLi4KLQkgICAgPC93ZWItYXBwPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqc3BfMl8xLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLWFwcCIgdHlwZT0iamF2YWVlOndlYi1hcHBUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvciBmb3IgYSB3ZWIgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgdGhlIHN1Yi1lbGVtZW50cwotCW9mIHRoaXMgZWxlbWVudCBjYW4gYmUgaW4gdGhlIGFyYml0cmFyeSBvcmRlci4gQmVjYXVzZSBvZgotCXRoYXQsIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGVsZW1lbnRzIG9mIGRpc3RyaWJ1dGFibGUsCi0Jc2Vzc2lvbi1jb25maWcsIHdlbGNvbWUtZmlsZS1saXN0LCBqc3AtY29uZmlnLCBsb2dpbi1jb25maWcsCi0JYW5kIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3Qgd2FzIGNoYW5nZWQgZnJvbSAiPyIgdG8gIioiCi0JaW4gdGhpcyBzY2hlbWEuICBIb3dldmVyLCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluc3RhbmNlCi0JZmlsZSBtdXN0IG5vdCBjb250YWluIG11bHRpcGxlIGVsZW1lbnRzIG9mIHNlc3Npb24tY29uZmlnLAotCWpzcC1jb25maWcsIGFuZCBsb2dpbi1jb25maWcuIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIG9mCi0Jd2VsY29tZS1maWxlLWxpc3Qgb3IgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCwgdGhlIGNvbnRhaW5lcgotCW11c3QgY29uY2F0ZW5hdGUgdGhlIGVsZW1lbnQgY29udGVudHMuICBUaGUgbXVsdGlwbGUgb2NjdXJlbmNlCi0Jb2YgdGhlIGVsZW1lbnQgZGlzdHJpYnV0YWJsZSBpcyByZWR1bmRhbnQgYW5kIHRoZSBjb250YWluZXIKLQl0cmVhdHMgdGhhdCBjYXNlIGV4YWN0bHkgaW4gdGhlIHNhbWUgd2F5IHdoZW4gdGhlcmUgaXMgb25seQotCW9uZSBkaXN0cmlidXRhYmxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXNlcnZsZXQtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZXJ2bGV0LgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpzZXJ2bGV0Ii8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6c2VydmxldC1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1maWx0ZXItbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBmaWx0ZXIgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbHRlci4KLQkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZmlsdGVyIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZmlsdGVyLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItbG9jYWwtcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgotCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1sb2NhbC1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgotCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLQkgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0JICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotCSAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotCSAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHdlYgotCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUKLQkgIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJ3ZWItYXBwLXJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgQSByb2xlLW5hbWUta2V5IGlzIHNwZWNpZmllZCB0byBhbGxvdyB0aGUgcmVmZXJlbmNlcwotCSAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9IndlYi1hcHAtcm9sZS1uYW1lLXJlZmVyZW5jZXMiCi0JCXJlZmVyPSJqYXZhZWU6d2ViLWFwcC1yb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLQkgIHNlY3VyaXR5LXJvbGUtcmVmIHRvIGEgc3BlY2lmaWVkIHJvbGUtbmFtZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnNlcnZsZXQvamF2YWVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cm9sZS1saW5rIi8+Ci0gICAgPC94c2Q6a2V5cmVmPgotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF1dGgtY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdXRoLWNvbnN0cmFpbnRUeXBlIGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0Ci0Jc2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZQotCWNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUgdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQKLQl0byB0aGUgcm9sZS1uYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cwotCWRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBvciBiZSB0aGUgc3BlY2lhbGx5Ci0JcmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yCi0JaW5kaWNhdGluZyBhbGwgcm9sZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gSWYgYm90aCAiKiIKLQlhbmQgcm9sZW5hbWVzIGFwcGVhciwgdGhlIGNvbnRhaW5lciBpbnRlcnByZXRzIHRoaXMgYXMgYWxsCi0Jcm9sZXMuICBJZiBubyByb2xlcyBhcmUgZGVmaW5lZCwgbm8gdXNlciBpcyBhbGxvd2VkIGFjY2VzcwotCXRvIHRoZSBwb3J0aW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVzY3JpYmVkIGJ5IHRoZQotCWNvbnRhaW5pbmcgc2VjdXJpdHktY29uc3RyYWludC4gIFRoZSBjb250YWluZXIgbWF0Y2hlcwotCXJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nIGFjY2Vzcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdXRoLW1ldGhvZFR5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi0JbWVjaGFuaXNtIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0bwotCWdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkKLQlhbiBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUgYXV0aGVudGljYXRlZAotCXVzaW5nIHRoZSBjb25maWd1cmVkIG1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGFyZSAiQkFTSUMiLAotCSJESUdFU1QiLCAiRk9STSIsICJDTElFTlQtQ0VSVCIsIG9yIGEgdmVuZG9yLXNwZWNpZmljCi0JYXV0aGVudGljYXRpb24gc2NoZW1lLgotCi0JVXNlZCBpbjogbG9naW4tY29uZmlnCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNwYXRjaGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGRpc3BhdGNoZXIgaGFzIGZvdXIgbGVnYWwgdmFsdWVzOiBGT1JXQVJELCBSRVFVRVNULCBJTkNMVURFLAotCWFuZCBFUlJPUi4gQSB2YWx1ZSBvZiBGT1JXQVJEIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkCi0JdW5kZXIgUmVxdWVzdERpc3BhdGNoZXIuZm9yd2FyZCgpIGNhbGxzLiAgQSB2YWx1ZSBvZiBSRVFVRVNUCi0JbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvCi0JdGhlIHBhdGggb3Igc2VydmxldC4gQSB2YWx1ZSBvZiBJTkNMVURFIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZQotCWFwcGxpZWQgdW5kZXIgUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpIGNhbGxzLiAgQSB2YWx1ZSBvZgotCUVSUk9SIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyIHRoZSBlcnJvciBwYWdlCi0JbWVjaGFuaXNtLiAgVGhlIGFic2VuY2Ugb2YgYW55IGRpc3BhdGNoZXIgZWxlbWVudHMgaW4gYQotCWZpbHRlci1tYXBwaW5nIGluZGljYXRlcyBhIGRlZmF1bHQgb2YgYXBwbHlpbmcgZmlsdGVycyBvbmx5IHVuZGVyCi0Jb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSBwYXRoIG9yIHNlcnZsZXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9SV0FSRCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOQ0xVREUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVRVNUIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVJST1IiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVuY29kaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVuY29kaW5nVHlwZSBkZWZpbmVzIElBTkEgY2hhcmFjdGVyIHNldHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHNdKyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlcnJvci1jb2RlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0Ci0KLQlVc2VkIGluOiBlcnJvci1wYWdlCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnhzZFBvc2l0aXZlSW50ZWdlclR5cGUiPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iXGR7M30iLz4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItcGFnZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlcnJvci1wYWdlVHlwZSBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCi0Jb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViCi0JYXBwbGljYXRpb24uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItY29kZSIKLQkJICAgICB0eXBlPSJqYXZhZWU6ZXJyb3ItY29kZVR5cGUiLz4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24tdHlwZSIKLQkJICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBleGNlcHRpb24tdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAgICAgIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOndhci1wYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUKLQkgICAgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCSAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIG11c3QgaGF2ZQotCSAgICBhIGxlYWRpbmcgYC8nLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlci1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYgotCWFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgdXNpbmcgZmlsdGVyLW1hcHBpbmdUeXBlLgotCVRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcKLQlkZWNsYXJhdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgdG8gYSByZXF1ZXN0LAotCWFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvCi0JYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0bwotCWFwcGx5IGl0IG1hdGNoZXMgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIGVpdGhlciBvbgotCXNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcKLQllbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluCi0Jd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4gd2hpY2gKLQlmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhCi0Jc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlCi0JZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIGZpbHRlci1uYW1lCi0Jc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgZmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpmaWx0ZXItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLQkJICAgICB0eXBlPSJqYXZhZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BhdGNoZXIiCi0JCSAgIHR5cGU9ImphdmFlZTpkaXNwYXRjaGVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXItbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlciBpcyBkZWNsYXJlCi0JYnkgdXNpbmcgZmlsdGVyLW5hbWVUeXBlLiBUaGlzIG5hbWUgaXMgdXNlZCB0byBtYXAgdGhlCi0JZmlsdGVyLiAgRWFjaCBmaWx0ZXIgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4KLQotCVVzZWQgaW46IGZpbHRlciwgZmlsdGVyLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZmlsdGVyVHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBmaWx0ZXIgaW4gdGhlIHdlYgotCWFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEKLQlVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlCi0JZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCi0JaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmZpbHRlci1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMKLQkgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlcgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcm0tbG9naW4tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGZvcm0tbG9naW4tY29uZmlnVHlwZSBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvcgotCXBhZ2VzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZAotCWF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KLQotCVVzZWQgaW46IGxvZ2luLWNvbmZpZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1wYWdlIgotCQkgICB0eXBlPSJqYXZhZWU6d2FyLXBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIKLQkgICAgYXBwIHdoZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZQotCSAgICBmb3VuZC4gIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAotCSAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1lcnJvci1wYWdlIgotCQkgICB0eXBlPSJqYXZhZWU6d2FyLXBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluCi0JICAgIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkCi0JICAgIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kLgotCSAgICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLQkgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iaHR0cC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCUEgSFRUUCBtZXRob2QgdHlwZSBhcyBkZWZpbmVkIGluIEhUVFAgMS4xIHNlY3Rpb24gMi4yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbJiMzMzstJiMxMjY7LVtcKFwpJiM2MDsmIzYyO0AsOzomIzM0Oy9cW1xdPz1ce1x9XFxccHtafV1dKyIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvYWQtb24tc3RhcnR1cFR5cGUiPgotICAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXM9ImphdmFlZTpudWxsLWNoYXJUeXBlIHhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCBjb250YWlucyBvbmUgb3IgbW9yZQotCWxvY2FsZS1lbmNvZGluZy1tYXBwaW5nKHMpLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIgotCQkgICB0eXBlPSJqYXZhZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmdUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIGNvbnRhaW5zIGxvY2FsZSBuYW1lIGFuZAotCWVuY29kaW5nIG5hbWUuIFRoZSBsb2NhbGUgbmFtZSBtdXN0IGJlIGVpdGhlciAiTGFuZ3VhZ2UtY29kZSIsCi0Jc3VjaCBhcyAiamEiLCBkZWZpbmVkIGJ5IElTTy02Mzkgb3IgIkxhbmd1YWdlLWNvZGVfQ291bnRyeS1jb2RlIiwKLQlzdWNoIGFzICJqYV9KUCIuICAiQ291bnRyeSBjb2RlIiBpcyBkZWZpbmVkIGJ5IElTTy0zMTY2LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZSIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNvZGluZyIKLQkJICAgdHlwZT0iamF2YWVlOmVuY29kaW5nVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jYWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsZVR5cGUgZGVmaW5lcyB2YWxpZCBsb2NhbGUgZGVmaW5lZCBieSBJU08tNjM5LTEKLQlhbmQgSVNPLTMxNjYuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlthLXpdezJ9KF98LSk/KFtccHtMfVwtXHB7TmR9XXsyfSk/Ii8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2dpbi1jb25maWdUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotCW1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZQotCXVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZQotCW5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbiBtZWNoYW5pc20uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aC1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTphdXRoLW1ldGhvZFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWxtLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvCi0JICAgIHVzZSBpbiBIVFRQIEJhc2ljIGF1dGhvcml6YXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1jb25maWciCi0JCSAgIHR5cGU9ImphdmFlZTpmb3JtLWxvZ2luLWNvbmZpZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtaW1lLW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uCi0JYW5kIGEgbWltZSB0eXBlLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KLQkgIGV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWltZS10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6bWltZS10eXBlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtaW1lLXR5cGVUeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBkZWZpbmVkIG1pbWUgdHlwZS4KLQotCUV4YW1wbGU6Ci0JInRleHQvcGxhaW4iCi0KLQlVc2VkIGluOiBtaW1lLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Q2N9XlxzXSsvW15ccHtDY31eXHNdKyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vbkVtcHR5U3RyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCVRoaXMgdHlwZSBkZWZpbmVzIGEgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotCWNoYXJhY3Rlci4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6bWluTGVuZ3RoIHZhbHVlPSIxIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJudWxsLWNoYXJUeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBhc3NvY2lhdGUKLQlzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZQotCWNvbGxlY3Rpb25zCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6d2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtY29uc3RyYWludCIKLQkJICAgdHlwZT0iamF2YWVlOmF1dGgtY29uc3RyYWludFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50IgotCQkgICB0eXBlPSJqYXZhZWU6dXNlci1kYXRhLWNvbnN0cmFpbnRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmxldC1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEKLQlzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgdHlwZT0iamF2YWVlOnVybC1wYXR0ZXJuVHlwZSIKLSAgICAgICAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlCi0Jc2VydmxldC4gRWFjaCBzZXJ2bGV0IG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCi0JYXBwbGljYXRpb24uCi0gICAgICAgIFRoZSBzcGVjaWFsIHNlcnZsZXQgbmFtZSBvZiAiKiIgbWF5IGJlIHVzZWQgdG8gcmVmZXJlbmNlIGFsbAotICAgICAgICBzZXJ2bGV0cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZsZXRUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIHNlcnZsZXQuCi0JSXQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYQotCXNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwCi0JZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZAotCWxvYWRlZC4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWNsYXNzIgotCQkgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImpzcC1maWxlIgotCQkgICAgIHR5cGU9ImphdmFlZTpqc3AtZmlsZVR5cGUiLz4KLQotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYWQtb24tc3RhcnR1cCIKLQkJICAgdHlwZT0iamF2YWVlOmxvYWQtb24tc3RhcnR1cFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzCi0JICAgIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlCi0JICAgIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViCi0JICAgIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YgdGhlc2UKLQkgICAgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4KLQkgICAgd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlCi0JICAgIGlzIGEgbmVnYXRpdmUgaW50ZWdlciwgb3IgdGhlIGVsZW1lbnQgaXMgbm90Ci0JICAgIHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZSBzZXJ2bGV0Ci0JICAgIHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlCi0JICAgIGludGVnZXIgb3IgMCwgdGhlIGNvbnRhaW5lciBtdXN0IGxvYWQgYW5kCi0JICAgIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlIGFwcGxpY2F0aW9uIGlzCi0JICAgIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQKLQkgICAgc2VydmxldHMgbWFya2VkIHdpdGggbG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZAotCSAgICBiZWZvcmUgc2VydmxldHMgbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUKLQkgICAgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyIG9mIGxvYWRpbmcgb2YKLQkgICAgc2VydmxldHMgd2l0aCB0aGUgc2FtZSBsb2FkLW9uLXN0YXJ0LXVwIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLQkJICAgdHlwZT0iamF2YWVlOnJ1bi1hc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2Vzc2lvbi1jb25maWdUeXBlIGRlZmluZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVycwotCWZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLXRpbWVvdXQiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RJbnRlZ2VyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQKLQkgICAgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZAotCSAgICBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0Ci0JICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0JICAgIElmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzCi0JICAgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBzZXNzaW9ucyBpcyBuZXZlciB0byB0aW1lCi0JICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIKLQkgICAgbXVzdCBzZXQgaXRzIGRlZmF1bHQgdGltZW91dCBwZXJpb2QuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgotCWJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcgotCUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAotCXJlcXVpcmUgYW55IHRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zCi0JdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlCi0JY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUKLQljaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgotCXJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQKLQlwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlCi0JdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCi0JQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzCi0JcmVxdWlyZWQuCi0KLQlVc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR1JBTCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNPTkZJREVOVElBTCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHVzZXItZGF0YS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGhvdwotCWRhdGEgY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZQotCXByb3RlY3RlZC4KLQotCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWUiCi0JCSAgIHR5cGU9ImphdmFlZTp0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Indhci1wYXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgYSBwYXRoIHN0YXJ0aW5nCi0Jd2l0aCBhICIvIiBhbmQgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgYSBXQVIKLQlmaWxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9Ii8uKiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0id2ViLWFwcC12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCi0Jd2ViLWFwcGxpY2F0aW9uIHN1cHBvcnRlZC4gSXQgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlCi0JdmVyc2lvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi41Ii8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYi1hcHBUeXBlIj4KLQotICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzdHJpYnV0YWJsZSIKLQkJICAgdHlwZT0iamF2YWVlOmVtcHR5VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRleHQtcGFyYW0iCi0JCSAgIHR5cGU9ImphdmFlZTpwYXJhbS12YWx1ZVR5cGUiPgotCi0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uCi0JICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0Ci0JICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiCi0JCSAgIHR5cGU9ImphdmFlZTpmaWx0ZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW1hcHBpbmciCi0JCSAgIHR5cGU9ImphdmFlZTpmaWx0ZXItbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciIKLQkJICAgdHlwZT0iamF2YWVlOmxpc3RlbmVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQiCi0JCSAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbWFwcGluZyIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWNvbmZpZyIKLQkJICAgdHlwZT0iamF2YWVlOnNlc3Npb24tY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtbWFwcGluZyIKLQkJICAgdHlwZT0iamF2YWVlOm1pbWUtbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUtbGlzdCIKLQkJICAgdHlwZT0iamF2YWVlOndlbGNvbWUtZmlsZS1saXN0VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLXBhZ2UiCi0JCSAgIHR5cGU9ImphdmFlZTplcnJvci1wYWdlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1jb25maWciCi0JCSAgIHR5cGU9ImphdmFlZTpqc3AtY29uZmlnVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnQiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1jb25zdHJhaW50VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luLWNvbmZpZyIKLQkJICAgdHlwZT0iamF2YWVlOmxvZ2luLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlIgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZVR5cGUiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOndlYi1hcHAtdmVyc2lvblR5cGUiCi0JCSAgIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotCSAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCBvdGhlciByZWxhdGVkIGRlcGxveW1lbnQKLQkgIGRlc2NyaXB0b3JzIGZvciB0aGlzIG1vZHVsZSAoZS5nLiwgd2ViIHNlcnZpY2UKLQkgIGRlc2NyaXB0b3JzKSBhcmUgY29tcGxldGUsIG9yIHdoZXRoZXIgdGhlIGNsYXNzCi0JICBmaWxlcyBhdmFpbGFibGUgdG8gdGhpcyBtb2R1bGUgYW5kIHBhY2thZ2VkIHdpdGgKLQkgIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbm5vdGF0aW9ucwotCSAgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgaW5mb3JtYXRpb24uCi0KLQkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50Ci0JICB0b29sIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudAotCSAgaW5mb3JtYXRpb24sIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIGZpbGVzCi0JICBvZiB0aGUgYXBwbGljYXRpb24uCi0KLQkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvCi0JICAiZmFsc2UiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MKLQkgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzCi0JICBzcGVjaWZpZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldAotCW9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluCi0JYSB3ZWIgYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmCi0Jbm8gSFRUUCBtZXRob2RzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQKLQlhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuCi0KLQlVc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIKLQkgICAgcmVzb3VyY2UgY29sbGVjdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICB0eXBlPSJqYXZhZWU6dXJsLXBhdHRlcm5UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imh0dHAtbWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6aHR0cC1tZXRob2RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VsY29tZS1maWxlLWxpc3RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUKLQlmaWxlcyBlbGVtZW50cy4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWxjb21lLWZpbGUiCi0JCSAgIHR5cGU9InhzZDpzdHJpbmciCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UKLQkgICAgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8wLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxYzk5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsODc0ICswLDAgQEAKLTwhLS0KLSAgICBEVEQgZm9yIHRoZSBKYXZhU2VydmVyIEZhY2VzIEFwcGxpY2F0aW9uIENvbmZpZ3VyYXRpb24gRmlsZSAoVmVyc2lvbiAxLjApCi0KLSAgICBUbyBzdXBwb3J0IHZhbGlkYXRpb24gb2YgeW91ciBjb25maWd1cmF0aW9uIGZpbGUocyksIGluY2x1ZGUgdGhlIGZvbGxvd2luZwotICAgIERPQ1RZUEUgZWxlbWVudCBhdCB0aGUgYmVnaW5uaW5nIChhZnRlciB0aGUgInhtbCIgZGVjbGFyYXRpb24pOgotCi0gICAgPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMKLSAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIgotICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMC5kdGQiPgotCi0gICAgJElkOiB3ZWItZmFjZXNjb25maWdfMV8wLmR0ZCx2IDEuMSAyMDA3LzA1LzI1IDIxOjEyOjQ5IGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLS0tPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT0gRGVmaW5lZCBUeXBlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tCi0gICAgQW4gIkFjdGlvbiIgaXMgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIGEgbWV0aG9kIGJpbmRpbmcKLSAgICBleHByZXNzaW9uIHRoYXQgcG9pbnRzIGF0IGEgbWV0aG9kIHdpdGggbm8gYXJndW1lbnRzIHRoYXQgcmV0dXJucyBhCi0gICAgU3RyaW5nLiAgSXQgbXVzdCBiZSBicmFja2V0ZWQgd2l0aCAiI3t9IiwgZm9yIGV4YW1wbGUsCi0gICAgIiN7Y2FyZGVtby5idXlDYXJ9Ii4KLS0tPgotPCFFTlRJVFkgJSBBY3Rpb24gIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiQ2xhc3NOYW1lIiBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaXMKLSAgICBpbnN0YW50aWF0ZWQgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZW5jbG9zaW5nIGVsZW1lbnQuCi0tLT4KLTwhRU5USVRZICUgQ2xhc3NOYW1lICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEFuICJJZGVudGlmaWVyIiBpcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRoYXQgY29uZm9ybXMgdG8gdGhlIHZhcmlhYmxlCi0gICAgbmFtaW5nIGNvbnZlbnRpb25zIG9mIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIChKTFMgU2VjdGlvbiA/Lj8uPykuCi0tLT4KLTwhRU5USVRZICUgSWRlbnRpZmllciAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJKYXZhVHlwZSIgaXMgZWl0aGVyIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpcwotICAgIGluc3RhbnRpYXRlZCB0byBwcm92aWRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBlbmNsb3NpbmcgZWxlbWVudCwgb3IKLSAgICB0aGUgbmFtZSBvZiBhIEphdmEgcHJpbWl0aXZlIHR5cGUgKHN1Y2ggYXMgaW50IG9yIGNoYXIpLiAgVGhlIGNsYXNzIG5hbWUKLSAgICBvciBwcmltaXRpdmUgdHlwZSBtYXkgb3B0aW9uYWxseSBiZSBmb2xsb3dlZCBieSAiW10iIHRvIGluZGljYXRlIHRoYXQKLSAgICB0aGUgdW5kZXJseWluZyBkYXRhIG11c3QgYmUgYW4gYXJyYXksIHJhdGhlciB0aGFuIGEgc2NhbGFyIHZhcmlhYmxlLgotLS0+Ci08IUVOVElUWSAlIEphdmFUeXBlICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIkxhbmd1YWdlIiBpcyBhIGxvd2VyIGNhc2UgdHdvLWxldHRlciBjb2RlIGZvciBhIGxhbmd1YWdlIGFzIGRlZmluZWQKLSAgICBieSBJU0wtNjM5LgotLS0+Ci08IUVOVElUWSAlIExhbmd1YWdlICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIlJlc291cmNlUGF0aCIgaXMgdGhlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGggdG8gYSByZXNvdXJjZSBmaWxlCi0gICAgKHN1Y2ggYXMgYSBsb2dvIGltYWdlKS4KLS0tPgotPCFFTlRJVFkgJSBSZXNvdXJjZVBhdGggIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiU2NvcGUiIGlzIHRoZSB3ZWxsLWtub3duIG5hbWUgb2YgYSBzY29wZSBpbiB3aGljaCBtYW5hZ2VkIGJlYW5zIG1heQotICAgIG9wdGlvbmFsbHkgYmUgZGVmaW5lZCB0byBiZSBjcmVhdGVkIGluLgotLS0+Ci08IUVOVElUWSAlIFNjb3BlICIocmVxdWVzdHxzZXNzaW9ufGFwcGxpY2F0aW9uKSI+Ci0KLQotCi08IS0tCi0gICAgQSAiU2NvcGVPck5vbmUiIGVsZW1lbnQgZGVmaW5lcyB0aGUgbGVnYWwgdmFsdWVzIGZvciB0aGUKLSAgICA8bWFuYWdlZC1iZWFuLXNjb3BlPiBlbGVtZW50J3MgYm9keSBjb250ZW50LCB3aGljaCBpbmNsdWRlcwotICAgIGFsbCBvZiB0aGUgc2NvcGVzIHJlc3ByZXNlbnRlZCBieSB0aGUgIlNjb3BlIiB0eXBlLCBwbHVzIHRoZQotICAgICJub25lIiB2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgYSBjcmVhdGVkIGJlYW4gc2hvdWxkIG5vdCBiZQotICAgIHN0b3JlZCBpbnRvIGFueSBzY29wZS4KLS0tPgotPCFFTlRJVFkgJSBTY29wZU9yTm9uZSAiKHJlcXVlc3R8c2Vzc2lvbnxhcHBsaWNhdGlvbnxub25lKSI+Ci0KLQotPCEtLQotICAgIEEgIlZpZXdJZFBhdHRlcm4iIGlzIGEgcGF0dGVybiBmb3IgbWF0Y2hpbmcgdmlldyBpZGVudGlmaWVycyBpbgotICAgIG9yZGVyIHRvIGRldGVybWluZSB3aGV0aGVyIGEgcGFydGljdWxhciBuYXZpZ2F0aW9uIHJ1bGUgc2hvdWxkIGJlCi0gICAgZmlyZWQuICBJdCBtdXN0IGNvbnRhaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCi0gICAgLSBUaGUgZXhhY3QgbWF0Y2ggZm9yIGEgdmlldyBpZGVudGlmaWVyIHRoYXQgaXMgcmVjb2duaXplZAotICAgICAgYnkgdGhlIHRoZSBWaWV3SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBiZWluZyB1c2VkIChzdWNoIGFzCi0gICAgICAiL2luZGV4LmpzcCIgaWYgeW91IGFyZSB1c2luZyB0aGUgZGVmYXVsdCBWaWV3SGFuZGxlcikuCi0KLSAgICAtIEEgcHJvcGVyIHByZWZpeCBvZiBhIHZpZXcgaWRlbnRpZmllciwgcGx1cyBhIHRyYWlsaW5nICIqIgotICAgICAgY2hhcmFjdGVyLiAgVGhpcyBwYXR0ZXJuIGluZGljYXRlcyB0aGF0IGFsbCB2aWV3IGlkZW50aWZpZXJzIHRoYXQKLSAgICAgIG1hdGNoIHRoZSBwb3J0aW9uIG9mIHRoZSBwYXR0ZXJuIHVwIHRvIHRoZSBhc3RlcmlzayB3aWxsIG1hdGNoIHRoZQotICAgICAgc3Vycm91bmRpbmcgcnVsZS4gIFdoZW4gbW9yZSB0aGFuIG9uZSBtYXRjaCBleGlzdHMsIHRoZSBtYXRjaCB3aXRoCi0gICAgICB0aGUgbG9uZ2VzdCBwYXR0ZXJuIGlzIHNlbGVjdGVkLgotCi0gICAgLSBBbiAiKiIgY2hhcmFjdGVyLCB3aGljaCBtZWFucyB0aGF0IHRoaXMgcGF0dGVybiBhcHBsaWVzIHRvIGFsbAotICAgICAgdmlldyBpZGVudGlmaWVycy4KLS0tPgotPCFFTlRJVFkgJSBWaWV3SWRQYXR0ZXJuICJDREFUQSI+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PSBUb3AgTGV2ZWwgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0KLSAgICBUaGUgImZhY2VzLWNvbmZpZyIgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotICAgIGhpZXJhcmNoeSwgYW5kIGNvbnRhaW5zIG5lc3RlZCBlbGVtZW50cyBmb3IgYWxsIG9mIHRoZSBvdGhlciBjb25maWd1cmF0aW9uCi0gICAgc2V0dGluZ3MuCi0tLT4KLTwhRUxFTUVOVCBmYWNlcy1jb25maWcgICAgKChhcHBsaWNhdGlvbnxmYWN0b3J5fGNvbXBvbmVudHxjb252ZXJ0ZXJ8bWFuYWdlZC1iZWFufG5hdmlnYXRpb24tcnVsZXxyZWZlcmVuY2VkLWJlYW58cmVuZGVyLWtpdHxsaWZlY3ljbGV8dmFsaWRhdG9yKSopPgotPCFBVFRMSVNUIGZhY2VzLWNvbmZpZwotICAgICAgIHhtbG5zIENEQVRBICNGSVhFRCAiaHR0cDovL2phdmEuc3VuLmNvbS9KU0YvQ29uZmlndXJhdGlvbiI+Ci0KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IERlZmluaXRpb24gRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIFRoZSAiYXBwbGljYXRpb24iIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gZGVmaW5lIHRoZSB2YXJpb3VzCi0gICAgcGVyLWFwcGxpY2F0aW9uLXNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBhcnRpZmFjdHMgZm9yIGEgcGFydGljdWxhciB3ZWIKLSAgICBhcHBsaWNhdGlvbiB0aGF0IGlzIHV0aWxpemluZyBKYXZhU2VydmVyIEZhY2VzLiAgRm9yIG5lc3RlZCBlbGVtZW50cwotICAgIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQsIHRoZSBKU0YgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgc3VpdGFibGUKLSAgICBkZWZhdWx0LgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24gICAgICgoYWN0aW9uLWxpc3RlbmVyfGRlZmF1bHQtcmVuZGVyLWtpdC1pZHxtZXNzYWdlLWJ1bmRsZXxuYXZpZ2F0aW9uLWhhbmRsZXJ8dmlldy1oYW5kbGVyfHN0YXRlLW1hbmFnZXJ8cHJvcGVydHktcmVzb2x2ZXJ8dmFyaWFibGUtcmVzb2x2ZXJ8bG9jYWxlLWNvbmZpZykqKT4KLQotCi08IS0tCi0gICAgVGhlICJmYWN0b3J5IiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUgdmFyaW91cwotICAgIEZhY3RvcmllcyB0aGF0IGNvbXByaXNlIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBKYXZhU2VydmVyCi0gICAgRmFjZXMuICBGb3IgbmVzdGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQsIHRoZSBKU0YKLSAgICBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdWl0YWJsZSBkZWZhdWx0LgotLS0+Ci08IUVMRU1FTlQgZmFjdG9yeSAgICAgKChhcHBsaWNhdGlvbi1mYWN0b3J5fGZhY2VzLWNvbnRleHQtZmFjdG9yeXxsaWZlY3ljbGUtZmFjdG9yeXxyZW5kZXIta2l0LWZhY3RvcnkpKik+Ci0KLQotPCEtLQotICAgIFRoZSAiYXR0cmlidXRlIiBlbGVtZW50IHJlcHJlc2VudHMgYSBuYW1lZCwgdHlwZWQsIHZhbHVlIGFzc29jaWF0ZWQgd2l0aAotICAgIHRoZSBwYXJlbnQgVUlDb21wb25lbnQgdmlhIHRoZSBnZW5lcmljIGF0dHJpYnV0ZXMgbWVjaGFuaXNtLgotCi0gICAgQXR0cmlidXRlIG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmVudCAob3IgcmVsYXRlZCkKLSAgICBjb21wb25lbnQuCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGF0dHJpYnV0ZS1uYW1lLCBhdHRyaWJ1dGUtY2xhc3MsIGRlZmF1bHQtdmFsdWU/LCBzdWdnZXN0ZWQtdmFsdWU/LCBhdHRyaWJ1dGUtZXh0ZW5zaW9uKik+Ci0KLTwhLS0gCi0gICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGF0dHJpYnV0ZS4gIE1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgc3BlY2lmaWMgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGF0dHJpYnV0ZS1leHRlbnNpb24gQU5ZPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbXBvbmVudCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgVUlDb21wb25lbnQgaW1wbGVtZW50YXRpb24KLSAgICBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgdHlwZSBpZGVudGlmaWVyLAotICAgIGFsb25nIHdpdGggaXRzIGFzc29jaWF0ZWQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcy4gIENvbXBvbmVudCB0eXBlcyBtdXN0Ci0gICAgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmVjb2duaXplZAotICAgIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBsb2dpYyBvZiB0aGlzIGNvbXBvbmVudC4gIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzCi0gICAgaWRlbnRpZnkgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgdGhlIGNvbXBvbmVudCBjbGFzcyB0aGF0IG1heSBiZSBleHBvc2VkCi0gICAgZm9yIG1hbmlwdWxhdGlvbiB2aWEgdG9vbHMuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGNvbXBvbmVudC10eXBlLCBjb21wb25lbnQtY2xhc3MsIGF0dHJpYnV0ZSosIHByb3BlcnR5KiwgY29tcG9uZW50LWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBjb21wb25lbnQuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQtZXh0ZW5zaW9uIEFOWT4KLQotCi0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgQ29udmVydGVyIGltcGxlbWVudGF0aW9uCi0gICAgY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIGNvbnZlcnRlciBpZGVudGlmaWVyLgotICAgIENvbnZlcnRlciBpZGVudGlmaWVycyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgbWF5IGJlCi0gICAgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMKLSAgICBwcm9wZXJ0aWVzIG9mIHRoZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZAotICAgIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuCi0tLT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXIgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIChjb252ZXJ0ZXItaWQgfCBjb252ZXJ0ZXItZm9yLWNsYXNzKSwgY29udmVydGVyLWNsYXNzLCBhdHRyaWJ1dGUqLCBwcm9wZXJ0eSopPgotCi0KLTwhLS0KLSAgICBUaGUgImljb24iIGVsZW1lbnQgY29udGFpbnMgInNtYWxsLWljb24iIGFuZCAibGFyZ2UtaWNvbiIgZWxlbWVudHMgdGhhdAotICAgIHNwZWNpZnkgdGhlIHJlc29ydWNlIHBhdGhzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yIEpQRyBpY29uIGltYWdlcwotICAgIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotLS0+Ci08IUVMRU1FTlQgaWNvbiAgICAgICAgICAgIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotPCFBVFRMSVNUIGljb24gICAgICAgICAgICB4bWw6bGFuZyAgICAgICAgJUxhbmd1YWdlOyAgICAgICNJTVBMSUVEPgotCi08IS0tCi0gICAgVGhlICJsaWZlY3ljbGUiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gc3BlY2lmeQotICAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGJlaGF2aW91ciBvZiB0aGUgZGVmYXVsdCBMaWZlY3ljbGUKLSAgICBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0tLT4KLTwhRUxFTUVOVCBsaWZlY3ljbGUgICAgICAgKHBoYXNlLWxpc3RlbmVyKik+Ci0KLTwhLS0KLSAgICAgVGhlICJsb2NhbGUtY29uZmlnIiBlbGVtZW50IGFsbG93cyB0aGUgYXBwIGRldmVsb3BlciB0byBkZWNsYXJlIHRoZQotICAgICBzdXBwb3J0ZWQgbG9jYWxlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIAotLS0+Ci08IUVMRU1FTlQgbG9jYWxlLWNvbmZpZyAoZGVmYXVsdC1sb2NhbGU/LCBzdXBwb3J0ZWQtbG9jYWxlKik+Ci0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YUJlYW4sIG9mIGEgcGFydGljdWxhciBjbGFzcywKLSAgICB0aGF0IHdpbGwgYmUgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkIGF0IHJ1bnRpbWUgKGJ5IHRoZSBkZWZhdWx0Ci0gICAgVmFyaWFibGVSZXNvbHZlciBpbXBsZW1lbnRhdGlvbikgaWYgaXQgaXMgcmVmZXJlbmNlZCBhcyB0aGUgZmlyc3QgZWxlbWVudAotICAgIG9mIGEgdmFsdWUgYmluZGluZyBleHByZXNzaW9uLCBhbmQgbm8gY29ycmVzcG9uZGluZyBiZWFuIGNhbiBiZQotICAgIGlkZW50aWZpZWQgaW4gYW55IHNjb3BlLiAgSW4gYWRkaXRpb24gdG8gdGhlIGNyZWF0aW9uIG9mIHRoZSBtYW5hZ2VkIGJlYW4sCi0gICAgYW5kIHRoZSBvcHRpb25hbCBzdG9yaW5nIG9mIGl0IGludG8gdGhlIHNwZWNpZmllZCBzY29wZSwgdGhlIG5lc3RlZAotICAgIG1hbmFnZWQtcHJvcGVydHkgZWxlbWVudHMgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YKLSAgICBzZXR0YWJsZSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgY3JlYXRlZCBpbnN0YW5jZS4KLS0tPgotPCFFTEVNRU5UIG1hbmFnZWQtYmVhbiAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgbWFuYWdlZC1iZWFuLW5hbWUsIG1hbmFnZWQtYmVhbi1jbGFzcywgbWFuYWdlZC1iZWFuLXNjb3BlLCAobWFuYWdlZC1wcm9wZXJ0eSogfCBtYXAtZW50cmllcyB8IGxpc3QtZW50cmllcykpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtcHJvcGVydHkiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHByb3BlcnR5IG9mIGEKLSAgICBtYW5hZ2VkIGJlYW4gdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAob3IgdmFsdWUgc2V0KQotICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nIG1hbmFnZWQgYmVhbiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLXByb3BlcnR5IChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBwcm9wZXJ0eS1uYW1lLCBwcm9wZXJ0eS1jbGFzcz8sIChtYXAtZW50cmllc3xudWxsLXZhbHVlfHZhbHVlfGxpc3QtZW50cmllcykpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hcC1lbnRyeSIgZWxlbWVudCByZXByc2VudHMgYSBzaW5nbGUga2V5LWVudHJ5IHBhaXIgdGhhdAotICAgIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGEgbWFuYWdlZCBwcm9wZXJ0eSBvZiB0eXBlCi0gICAgamF2YS51dGlsLk1hcC4KLS0tPgotPCFFTEVNRU5UIG1hcC1lbnRyeSAoa2V5LCAobnVsbC12YWx1ZXx2YWx1ZSkpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hcC1lbnRyaWVzJyBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2Yga2V5LWVudHJ5IHBhaXJzIHRoYXQKLSAgICB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgdHlwZQotICAgIGphdmEudXRpbC5NYXAuICBJbiBhZGRpdGlvbiwgdGhlIEphdmEgY2xhc3MgdHlwZXMgb2YgdGhlIGtleSBhbmQgZW50cnkKLSAgICB2YWx1ZXMgbWF5IGJlIG9wdGlvbmFsbHkgZGVjbGFyZWQuCi0tLT4KLTwhRUxFTUVOVCBtYXAtZW50cmllcyAoa2V5LWNsYXNzPywgdmFsdWUtY2xhc3M/LCBtYXAtZW50cnkqKT4KLQotCi08IS0tCi0gICAgVGhlIGJhc2UgbmFtZSBvZiBhIHJlc291cmNlIGJ1bmRsZSByZXByZXNlbnRpbmcgdGhlIG1lc3NhZ2UgcmVzb3VyY2VzCi0gICAgZm9yIHRoaXMgYXBwbGljYXRpb24uICBTZWUgdGhlIEphdmFEb2NzIGZvciB0aGUgImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSIKLSAgICBjbGFzcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgc3ludGF4IG9mIHJlc291cmNlIGJ1bmRsZSBuYW1lcy4KLS0tPgotCi08IUVMRU1FTlQgbWVzc2FnZS1idW5kbGUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgIm5hdmlnYXRpb24tY2FzZSIgZWxlbWVudCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mCi0gICAgY29uZGl0aW9ucyB0aGF0IG11c3QgbWF0Y2ggZm9yIHRoaXMgY2FzZSB0byBiZSBleGVjdXRlZCwgYW5kIHRoZQotICAgIHZpZXcgaWQgb2YgdGhlIGNvbXBvbmVudCB0cmVlIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIG5leHQuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLWNhc2UgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGZyb20tYWN0aW9uPywgZnJvbS1vdXRjb21lPywgdG8tdmlldy1pZCwgcmVkaXJlY3Q/KT4KLQotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLXJ1bGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIGRlY2lzaW9uIHJ1bGUKLSAgICB0aGF0IHdpbGwgYmUgdXRpbGl6ZWQgYnkgdGhlIGRlZmF1bHQgTmF2aWdhdGlvbkhhbmRsZXIKLSAgICBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIGRlY2lzaW9ucyBvbiB3aGF0IHZpZXcgc2hvdWxkIGJlIGRpc3BsYXllZAotICAgIG5leHQsIGJhc2VkIG9uIHRoZSB2aWV3IGlkIGJlaW5nIHByb2Nlc3NlZC4KLS0tPgotPCFFTEVNRU5UIG5hdmlnYXRpb24tcnVsZSAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgZnJvbS12aWV3LWlkPywgbmF2aWdhdGlvbi1jYXNlKik+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHkiIGVsZW1lbnQgcmVwcmVzZW50cyBhIEphdmFCZWFuIHByb3BlcnR5IG9mIHRoZSBKYXZhIGNsYXNzCi0gICAgcmVwcmVzZW50ZWQgYnkgb3VyIHBhcmVudCBlbGVtZW50LgotCi0gICAgUHJvcGVydHkgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgSmF2YSBjbGFzcwotICAgIHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBlbGVtZW50LCBhbmQgbXVzdCBjb3JyZXNwb25kIHRvCi0gICAgcHJvcGVydHkgbmFtZXMgdGhhdCB3aWxsIGJlIHJlY29nbml6ZWQgd2hlbiBwZXJmb3JtaW5nIGludHJvc3BlY3Rpb24KLSAgICBhZ2FpbnN0IHRoYXQgY2xhc3MgdmlhIGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHkgICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBwcm9wZXJ0eS1uYW1lLCBwcm9wZXJ0eS1jbGFzcywgZGVmYXVsdC12YWx1ZT8sIHN1Z2dlc3RlZC12YWx1ZT8sIHByb3BlcnR5LWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBwcm9wZXJ0eS4gIE1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgc3BlY2lmaWMgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LWV4dGVuc2lvbiBBTlk+Ci0KLTwhLS0KLSAgICBUaGUgInJlZmVyZW5jZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGF0IGRlc2lnbiB0aW1lIHRoZSBwcm9taXNlCi0gICAgdGhhdCBhIEphdmEgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aWxsIGV4aXN0IGF0IHJ1bnRpbWUgaW4gc29tZQotICAgIHNjb3BlLCB1bmRlciB0aGUgc3BlY2lmaWVkIGtleS4gIFRoaXMgY2FuIGJlIHVzZWQgYnkgZGVzaWduIHRpbWUgdG9vbHMKLSAgICB0byBjb25zdHJ1Y3QgdXNlciBpbnRlcmZhY2UgZGlhbG9ncyBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUKLSAgICBzcGVjaWZpZWQgY2xhc3MuICBUaGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBhIHJlZmVyZW5jZWQgYmVhbgotICAgIGVsZW1lbnQgaGFzIG5vIGltcGFjdCBvbiB0aGUgSmF2YVNlcnZlciBGYWNlcyBydW50aW1lIGVudmlyb25tZW50Ci0gICAgaW5zaWRlIGEgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgcmVmZXJlbmNlZC1iZWFuIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCByZWZlcmVuY2VkLWJlYW4tbmFtZSwgcmVmZXJlbmNlZC1iZWFuLWNsYXNzKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJLaXQgaW1wbGVtZW50YXRpb24KLSAgICB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgcmVuZGVyLWtpdC1pZC4gIElmIG5vCi0gICAgcmVuZGVyLWtpdC1pZCBpcyBzcGVjaWZpZWQsIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZWZhdWx0IFJlbmRlcktpdAotICAgIChSZW5kZXJLaXRGYWN0b3J5LkRFRkFVTFRfUkVOREVSX0tJVCkgaXMgYXNzdW1lZC4KLS0tPgotPCFFTEVNRU5UIHJlbmRlci1raXQgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcmVuZGVyLWtpdC1pZD8sIHJlbmRlci1raXQtY2xhc3M/LCByZW5kZXJlciopPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlcmVyIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJlciBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgZmFtaWx5Ci0gICAgYW5kIHJlbmRlcmVyIHR5cGUgaWRlbnRpZmllcnMsIGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgIHBhcmVudCAicmVuZGVyLWtpdCIgZWxlbWVudC4gIENvbWJpbmF0aW9ucyBvZiBjb21wb25lbnQgZmFtaWx5IGFuZCByZW5kZXJlcgotICAgIHR5cGUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQKLSAgICAicmVuZGVyLWtpdCIgZWxlbWVudC4KLQotICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGNvbXBvbmVudCBhdHRyaWJ1dGVzIHRoYXQKLSAgICBhcmUgcmVjb2duaXplZCBieSB0aGlzIHJlbmRlcmVyLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXIgICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBjb21wb25lbnQtZmFtaWx5LCByZW5kZXJlci10eXBlLCByZW5kZXJlci1jbGFzcywgYXR0cmlidXRlKiwgcmVuZGVyZXItZXh0ZW5zaW9uKik+Ci0KLTwhLS0gCi0gICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHJlbmRlcmVyLiAgTWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICBzcGVjaWZpYyBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXItZXh0ZW5zaW9uIEFOWT4KLQotPCEtLQotICAgIFRoZSAidmFsaWRhdG9yIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24KLSAgICBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkZW50aWZpZXIuCi0gICAgVmFsaWRhdG9yIGlkZW50aWZpZXJzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUKLSAgICBjb25maWd1cmVkIG9uIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIHRvIGFmZmVjdCB0aGUKLSAgICBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4gIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucwotICAgIHByb3BlcnRpZXMgb2YgdGhlIFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IG1heSBiZSBjb25maWd1cmVkCi0gICAgdG8gYWZmZWN0IHRoZSBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4KLS0tPgotPCFFTEVNRU5UIHZhbGlkYXRvciAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgdmFsaWRhdG9yLWlkLCB2YWxpZGF0b3ItY2xhc3MsIGF0dHJpYnV0ZSosIHByb3BlcnR5Kik+Ci0KLQotPCEtLQotICAgIFRoZSAibGlzdC1lbnRyaWVzIiBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2YgaW5pdGlhbGl6YXRpb24KLSAgICBlbGVtZW50cyBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQgaXMgYSBqYXZhLnV0aWwuTGlzdCBvciBhbgotICAgIGFycmF5LiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGNhbiBvcHRpb25hbGx5Ci0gICAgYmUgdXNlZCB0byBkZWNsYXJlIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaCB2YWx1ZSBzaG91bGQgYmUKLSAgICBjb252ZXJ0ZWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgQ29sbGVjdGlvbi4KLS0tPgotPCFFTEVNRU5UIGxpc3QtZW50cmllcyAgICAodmFsdWUtY2xhc3M/LCAobnVsbC12YWx1ZXx2YWx1ZSkqKT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IFN1Ym9yZGluYXRlIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIFRoZSAiYWN0aW9uLWxpc3RlbmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBBY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBJbnZva2UgQXBwbGljYXRpb24gcGhhc2Ugb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUuCi0gICAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgYWN0aW9uLWxpc3RlbmVyICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiYXBwbGljYXRpb24tZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgbmFtZSBvZiB0aGUgY29uY3JldGUgQXBwbGljYXRpb25GYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQKLSAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShBUFBMSUNBVElPTl9GQUNUT1JZKSBpcwotICAgIGNhbGxlZC4gSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24tZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIHZhbHVlCi0gICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXR0cmlidXRlIG5hbWUuICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUtY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyB2YWx1ZSB3aWxsIGJlIHN0b3JlZCwgaW4gdGhlIGdlbmVyaWMgYXR0cmlidXRlcyBvZiB0aGUKLSAgICBVSUNvbXBvbmVudCB3ZSBhcmUgcmVsYXRlZCB0by4KLS0tPgotPCFFTEVNRU5UIGF0dHJpYnV0ZS1uYW1lICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29tcG9uZW50LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBVSUNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQtZmFtaWx5IiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGNvbXBvbmVudCBmYW1pbHkgZm9yCi0gICAgd2hpY2ggdGhlIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50IHdpbGwgYmUKLSAgICB1c2VkLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWZhbWlseSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImNvbXBvbmVudC10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KLS0tPgotPCFFTEVNRU5UIGNvbXBvbmVudC10eXBlICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29udmVydGVyLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGNvbnZlcnRlci1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29udmVydGVyLWZvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIGZvciB3aGljaCBhIENvbnZlcnRlciBjbGFzcyB3aWxsIGJlIHJlZ2lzdGVyZWQuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGNvbnZlcnRlci1mb3ItY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgQ29udmVydGVyIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyLWlkICAgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiZGVmYXVsdC1yZW5kZXIta2l0LWlkIiBlbGVtZW50IGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gZGVmaW5lCi0gICAgYSByZW5kZXJraXQgdG8gYmUgdXNlZCBvdGhlciB0aGFuIHRoZSBzdGFuZGFyZCBvbmUuIAotLS0+Ci08IUVMRU1FTlQgZGVmYXVsdC1yZW5kZXIta2l0LWlkICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgIFRoZSAiZGVmYXVsdC1sb2NhbGUiIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGRlZmF1bHQgbG9jYWxlIGZvciB0aGlzCi0gICAgIGFwcGxpY2F0aW9uIGluc3RhbmNlLiAgSXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMKLSAgICAgOmxhbmd1YWdlOltfOmNvdW50cnk6W186dmFyaWFudDpdXSB3aXRob3V0IHRoZSBjb2xvbnMsIGZvciBleGFtcGxlCi0gICAgICJqYV9KUF9TSklTIi4gIFRoZSBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIHNlZ21lbnRzIG1heSBiZSAnLScgb3IKLSAgICAgJ18nLgotLS0+Ci08IUVMRU1FTlQgZGVmYXVsdC1sb2NhbGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJkZWZhdWx0LXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUKLSAgICBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgZGlmZmVycyBmcm9tIHRoZQotICAgICJzdWdnZXN0ZWQtdmFsdWUiIGluIHRoYXQgdGhlIHByb3BlcnR5IG9yIGF0dHJpYnV0ZSBtdXN0IHRha2UgdGhlCi0gICAgdmFsdWUsIHdoZXJlYXMgaW4gInN1Z2dlc3RlZC12YWx1ZSIgdGFraW5nIHRoZSB2YWx1ZSBpcyBvcHRpb25hbC4KLS0tPgotPCFFTEVNRU5UIGRlZmF1bHQtdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJkZXNjcmlwdGlvbiIgZWxlbWVudCBjb250YWlucyBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIGVsZW1lbnQKLSAgICBpdCBpcyBuZXN0ZWQgaW4sIG9wdGlvbmFsbHkgZmxhZ2dlZCB3aXRoIGEgbGFuZ3VhZ2UgY29kZSB1c2luZyB0aGUKLSAgICAieG1sOmxhbmciIGF0dHJpYnV0ZS4KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICAgICBBTlk+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gICAgIHhtbDpsYW5nICAgICAgICAlTGFuZ3VhZ2U7ICAgICAgI0lNUExJRUQ+Ci0KLQotPCEtLQotICAgIFRoZSAiZGlzcGxheS1uYW1lIiBlbGVtZW50IGlzIGEgc2hvcnQgZGVzY3JpcHRpdmUgbmFtZSBkZXNjcmliaW5nIHRoZQotICAgIGVudGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgaXQgaXMgbmVzdGVkIGluLCBpbnRlbmRlZCB0byBiZQotICAgIGRpc3BsYXllZCBieSB0b29scywgYW5kIG9wdGlvbmFsbHkgZmxhZ2dlZCB3aXRoIGEgbGFuZ3VhZ2UgY29kZSB1c2luZwotICAgIHRoZSAieG1sOmxhbmciIGF0dHJpYnV0ZS4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAgICAoI1BDREFUQSk+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lICAgIHhtbDpsYW5nICAgICAgICAlTGFuZ3VhZ2U7ICAgICAgI0lNUExJRUQ+Ci0KLTwhLS0KLSAgICBUaGUgImZhY2VzLWNvbnRleHQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gICAgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgRmFjZXNDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgotICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGQUNFU19DT05URVhUX0ZBQ1RPUlkpIGlzIGNhbGxlZC4gSXQgbXVzdAotICAgIGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBmYWNlcy1jb250ZXh0LWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJmcm9tLWFjdGlvbiIgZWxlbWVudCBjb250YWlucyBhbiBhY3Rpb24gcmVmZXJlbmNlIGV4cHJlc3Npb24KLSAgICB0aGF0IG11c3QgaGF2ZSBiZWVuIGV4ZWN1dGVkIChieSB0aGUgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciBmb3IgaGFuZGxpbmcKLSAgICBhcHBsaWNhdGlvbiBsZXZlbCBldmVudHMpIGluIG9yZGVyIHRvIHNlbGVjdCB0aGlzIG5hdmlnYXRpb24gcnVsZS4gIElmCi0gICAgbm90IHNwZWNpZmllZCwgdGhpcyBydWxlIHdpbGwgYmUgcmVsZXZhbnQgbm8gbWF0dGVyIHdoaWNoIGFjdGlvbiByZWZlcmVuY2UKLSAgICB3YXMgZXhlY3V0ZWQgKG9yIGlmIG5vIGFjdGlvbiByZWZlcmVuY2Ugd2FzIGV4ZWN1dGVkKS4KLQotICAgIFRoaXMgdmFsdWUgbXVzdCBiZSBvZiB0eXBlICJBY3Rpb24iLgotLS0+Ci08IUVMRU1FTlQgZnJvbS1hY3Rpb24gKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImZyb20tb3V0Y29tZSIgZWxlbWVudCBjb250YWlucyBhIGxvZ2ljYWwgb3V0Y29tZSBzdHJpbmcgcmV0dXJuZWQKLSAgICBieSB0aGUgZXhlY3V0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGFjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgdmlhIGFuCi0gICAgImFjdGlvblJlZiIgcHJvcGVydHkgKG9yIGEgbGl0ZXJhbCB2YWx1ZSBzcGVjaWZpZWQgYnkgYW4gImFjdGlvbiIKLSAgICBwcm9wZXJ0eSkgb2YgYSBVSUNvbW1hbmQgY29tcG9uZW50LiAgSWYgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgd2lsbCBiZQotICAgIHJlbGV2YW50IG9ubHkgaWYgdGhlIG91dGNvbWUgdmFsdWUgbWF0Y2hlcyB0aGlzIGVsZW1lbnQncyB2YWx1ZS4gIElmCi0gICAgbm90IHNwZWNpZmllZCwgdGhpcyBydWxlIHdpbGwgYmUgcmVsZXZhbnQgbm8gbWF0dGVyIHdoYXQgdGhlIG91dGNvbWUKLSAgICB2YWx1ZSB3YXMuCi0tLT4KLTwhRUxFTUVOVCBmcm9tLW91dGNvbWUgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImZyb20tdmlldy1pZCIgZWxlbWVudCBjb250YWlucyB0aGUgdmlldyBpZGVudGlmaWVyIG9mIHRoZSB2aWV3Ci0gICAgZm9yIHdoaWNoIHRoZSBjb250YWluaW5nIG5hdmlnYXRpb24gcnVsZSBpcyByZWxldmFudC4gIElmIG5vCi0gICAgImZyb20tdmlldyIgZWxlbWVudCBpcyBzcGVjaWZpZWQsIHRoaXMgcnVsZSBhcHBsaWVzIHRvIG5hdmlnYXRpb24KLSAgICBkZWNpc2lvbnMgb24gYWxsIHZpZXdzLiAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGEgdmFsdWUKLSAgICBvZiAiKiIgaXMgYXNzdW1lZCwgbWVhbmluZyB0aGF0IHRoaXMgbmF2aWdhdGlvbiBydWxlIGFwcGxpZXMgdG8gYWxsCi0gICAgdmlld3MuCi0KLSAgICBUaGlzIHZhbHVlIG11c3QgYmUgb2YgdHlwZSAiVmlld0lkUGF0dGVybiIuCi0tLT4KLTwhRUxFTUVOVCBmcm9tLXZpZXctaWQgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImtleSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWFwIGtleSB0aGF0Ci0gICAgd2lsbCBiZSBzdG9yZWQgaW4gYSBtYW5hZ2VkIHByb3BlcnR5IG9mIHR5cGUgamF2YS51dGlsLk1hcC4gIAotLS0+Ci08IUVMRU1FTlQga2V5ICAgICAgICAgICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJrZXktY2xhc3MiIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2ggImtleSIKLSAgICBlbGVtZW50IGluIGEgc2V0IG9mICJtYXAtZW50cnkiIGVsZW1lbnRzIHdpbGwgYmUgY29udmVydGVkIHRvLiAgSXQKLSAgICBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuICBJZiBvbWl0dGVkLCAiamF2YS5sYW5nLlN0cmluZyIKLSAgICBpcyBhc3N1bWVkLgotLS0+Ci08IUVMRU1FTlQga2V5LWNsYXNzICAgICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJsYXJnZS1pY29uIiBlbGVtZW50IGNvbnRhaW5zIHRoZSByZXNvdXJjZSBwYXRoIHRvIGEgbGFyZ2UgKDMyeDMyKQotICAgIGljb24gaW1hZ2UuICBUaGUgaW1hZ2UgbWF5IGJlIGluIGVpdGhlciBHSUYgb3IgSlBHIGZvcm1hdC4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gICAgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImxpZmVjeWNsZS1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBMaWZlY3ljbGVGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShMSUZFQ1lDTEVfRkFDVE9SWSkgaXMgY2FsbGVkLiBJdCBtdXN0IGJlIAotICAgIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBsaWZlY3ljbGUtZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbi1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLSAgICBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlCi0gICAgaWYgY3JlYXRpb24gb2YgdGhlIHNwZWNpZmllZCBtYW5hZ2VkIGJlYW4gaXMgcmVxdWVzdGVkLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0KLSAgICBUaGUgc3BlY2lmaWVkIGNsYXNzIG11c3QgY29uZm9ybSB0byBzdGFuZGFyZCBKYXZhQmVhbnMgY29udmVudGlvbnMuCi0gICAgSW4gcGFydGljdWxhciwgaXQgbXVzdCBoYXZlIGEgcHVibGljIHplcm8tYXJndW1lbnRzIGNvbnN0cnVjdG9yLCBhbmQKLSAgICB6ZXJvIG9yIG1vcmUgcHVibGljIHByb3BlcnR5IHNldHRlcnMuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tY2xhc3MgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBhdHRyaWJ1dGUgbmFtZSB1bmRlcgotICAgIHdoaWNoIGEgbWFuYWdlZCBiZWFuIHdpbGwgYmUgc2VhcmNoZWQgZm9yLCBhcyB3ZWxsIGFzIHN0b3JlZCAodW5sZXNzCi0gICAgdGhlICJtYW5hZ2VkLWJlYW4tc2NvcGUiIHZhbHVlIGlzICJub25lIikuICBJdCBtdXN0IGJlIG9mIHR5cGUKLSAgICAiSWRlbnRpZmllciIuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tbmFtZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAibWFuYWdlZC1iZWFuLXNjb3BlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIHNjb3BlIGludG8gd2hpY2ggYSBuZXdseQotICAgIGNyZWF0ZWQgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBtYW5hZ2VkIGJlYW4gd2lsbCBiZSBzdG9yZWQgKHVubGVzcwotICAgIHRoZSB2YWx1ZSBpcyAibm9uZSIpLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJTY29wZU9yTm9uZSIuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tc2NvcGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIE5hdmlnYXRpb25IYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICBkdXJpbmcgdGhlIEludm9rZSBBcHBsaWNhdGlvbiBwaGFzZSBvZiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZSwKLSAgICBpZiB0aGUgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciAocHJvdmlkZWQgYnkgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbikgaXMgdXNlZC4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLWhhbmRsZXIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgInBoYXNlLWxpc3RlbmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLW5hbWUgb2YgdGhlIGNvbmNyZXRlIFBoYXNlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlCi1yZWdpc3RlcmVkIG9uIHRoZSBMaWZlY3ljbGUuIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHBoYXNlLWxpc3RlbmVyICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAicmVkaXJlY3QiIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgbmF2aWdhdGlvbiB0byB0aGUgc3BlY2lmaWVkCi0gICAgInRvLXZpZXctaWQiIHNob3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgcGVyZm9ybWluZyBhbiBIVFRQIHJlZGlyZWN0Ci0gICAgcmF0aGVyIHRoYW4gdGhlIHVzdWFsIFZpZXdIYW5kbGVyIG1lY2hhbmlzbXMuCi0tLT4KLTwhRUxFTUVOVCByZWRpcmVjdCBFTVBUWT4KLQotPCEtLQotICAgIFRoZSAic3VnZ2VzdGVkLXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvcgotICAgIGF0dHJpYnV0ZSBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgaXMgYWR2aXNvcnkKLSAgICBvbmx5IGFuZCBpcyBpbnRlbmRlZCBmb3IgdG9vbHMgdG8gdXNlIHdoZW4gcG9wdWxhdGluZyBwYWxsZXR0ZXMuCi0tLT4KLTwhRUxFTUVOVCBzdWdnZXN0ZWQtdmFsdWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLQotICAgIFRoZSAidmlldy1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBWaWV3SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIHJlcXVlc3QKLSAgICBwcm9jZXNzaW5nIGxpZmVjeWNsZS4gIFRoZSBmYWNlcyBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYQotICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcwotLS0+Ci08IUVMRU1FTlQgdmlldy1oYW5kbGVyICgjUENEQVRBKT4KLQotPCEtLQotCi0gICAgVGhlICJzdGF0ZS1tYW5hZ2VyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBTdGF0ZU1hbmFnZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIGR1cmluZyB0aGUgUmVzdG9yZSBWaWV3IGFuZCBSZW5kZXIgUmVzcG9uc2UgcGhhc2VzIG9mIHRoZSByZXF1ZXN0Ci0gICAgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEKLSAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MKLS0tPgotPCFFTEVNRU5UIHN0YXRlLW1hbmFnZXIgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBtYW5hZ2VkIHByb3BlcnR5IGluIHdoaWNoIHdlCi0gICAgYXJlIG5lc3RlZCB3aWxsIGJlIGV4cGxpY2l0bHkgc2V0IHRvIG51bGwgaWYgb3VyIG1hbmFnZWQgYmVhbiBpcwotICAgIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gb21pdHRpbmcgdGhlIG1hbmFnZWQKLSAgICBwcm9wZXJ0eSBlbGVtZW50IGVudGlyZWx5LCB3aGljaCB3aWxsIGNhdXNlIG5vIHByb3BlcnR5IHNldHRlciB0byBiZQotICAgIGNhbGxlZCBmb3IgdGhpcyBwcm9wZXJ0eS4KLQotICAgIFRoZSAibnVsbC12YWx1ZSIgZWxlbWVudCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQKLSAgICAicHJvcGVydHktY2xhc3MiIGlkZW50aWZpZXMgYSBKYXZhIGNsYXNzLCBub3QgYSBKYXZhIHByaW1pdGl2ZS4KLS0tPgotPCFFTEVNRU5UIG51bGwtdmFsdWUgRU1QVFk+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHktY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YSB0eXBlIG9mIHRoZSB2YWx1ZQotICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3BlcnR5IG5hbWUuICBJdCBtdXN0IGJlIG9mIHR5cGUgIkphdmFUeXBlIi4KLSAgICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSBleGlzdGluZyBjbGFzc2VzOyBob3dldmVyLAotICAgIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZ29pbmcKLSAgICB0byBiZSB0aGUgc291cmNlIGZvciBnZW5lcmF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZXMuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1jbGFzcyAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5LW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YUJlYW5zIHByb3BlcnR5IG5hbWUKLSAgICB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBtYXkgYmUgc3RvcmVkLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHktbmFtZSAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJwcm9wZXJ0eS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgUHJvcGVydHlSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZAotICAgIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb25zLgotICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LXJlc29sdmVyICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyAoZWl0aGVyIGFic3RyYWN0IG9yIGNvbmNyZXRlKSBvciBKYXZhIGludGVyZmFjZQotICAgIGltcGxlbWVudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZWQgYmVhbi4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVmZXJlbmNlZC1iZWFuLWNsYXNzICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgYXR0cmlidXRlIG5hbWUgdW5kZXIKLSAgICB3aGljaCB0aGUgY29ycmVzcG9uZGluZyByZWZlcmVuY2VkIGJlYW4gbWF5IGJlIGFzc3VtZWQgdG8gYmUgc3RvcmVkLAotICAgIGluIG9uZSBvZiB0aGUgc2NvcGVzIGRlZmluZWQgYnkgdGhlICJTY29wZSIgdHlwZS4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJJZGVudGlmaWVyIi4KLS0tPgotPCFFTEVNRU5UIHJlZmVyZW5jZWQtYmVhbi1uYW1lICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0LWlkIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlCi0gICAgUmVuZGVyS2l0IHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0LWlkICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlci1raXQtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFJlbmRlcktpdCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyLWtpdC1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFJlbmRlcmVyIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXJlci1jbGFzcyAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFJlbmRlcktpdEZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIHdoZW4gRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KFJFTkRFUl9LSVRfRkFDVE9SWSkgaXMgY2FsbGVkLiBJdCBtdXN0IGJlIAotICAgIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0LWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJyZW5kZXJlci10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgYSByZW5kZXJlciB0eXBlIGlkZW50aWZpZXIgZm9yIHRoZQotICAgIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50LgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXItdHlwZSAgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAic21hbGwtaWNvbiIgZWxlbWVudCBjb250YWlucyB0aGUgcmVzb3VyY2UgcGF0aCB0byBhIGxhcmdlICgxNngxNikKLSAgICBpY29uIGltYWdlLiAgVGhlIGltYWdlIG1heSBiZSBpbiBlaXRoZXIgR0lGIG9yIEpQRyBmb3JtYXQuCi0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICAgICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgIFRoZSAic3VwcG9ydGVkLWxvY2FsZSIgZWxlbWVudCBhbGxvd3MgYXV0aG9ycyB0byBkZWNsYXJlIHdoaWNoCi0gICAgIGxvY2FsZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIGFwcGxpY2F0aW9uIGluc3RhbmNlLgotCi0gICAgIEl0IG11c3QgYmUgc3BlY2lmaWVkIGFzIDpsYW5ndWFnZTpbXzpjb3VudHJ5OltfOnZhcmlhbnQ6XV0gd2l0aG91dAotICAgICB0aGUgY29sb25zLCBmb3IgZXhhbXBsZSAiamFfSlBfU0pJUyIuICBUaGUgc2VwYXJhdG9ycyBiZXR3ZWVuIHRoZQotICAgICBzZWdtZW50cyBtYXkgYmUgJy0nIG9yICdfJy4KLS0tPgotPCFFTEVNRU5UIHN1cHBvcnRlZC1sb2NhbGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJ0by12aWV3IiBlbGVtZW50IGNvbnRhaW5zIHRoZSB2aWV3IGlkZW50aWZpZXIgb2YgdGhlIG5leHQgdmlldwotICAgIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpZiB0aGlzIG5hdmlnYXRpb24gcnVsZSBpcyBtYXRjaGVkLiAgSXQKLSAgICBtdXN0IGJlIG9mIHR5cGUgIlZpZXdJZCIuCi0tLT4KLTwhRUxFTUVOVCB0by12aWV3LWlkICAgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbGlkYXRvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCB2YWxpZGF0b3ItY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbGlkYXRvci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgVmFsaWRhdG9yIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotLS0+Ci08IUVMRU1FTlQgdmFsaWRhdG9yLWlkICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJ2YWx1ZSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbGl0ZXJhbAotICAgIHZhbHVlIHRvIHdoaWNoIGEgc2NhbGFyIG1hbmFnZWQgcHJvcGVydHkgd2lsbCBiZSBzZXQsIG9yIGEgdmFsdWUKLSAgICBiaW5kaW5nIGV4cHJlc3Npb24gKCIjey4uLn0iKSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlCi0gICAgcmVxdWlyZWQgdmFsdWUuICBJdCB3aWxsIGJlIGNvbnZlcnRlZCBhcyBzcGVjaWZpZWQgZm9yIHRoZSBhY3R1YWwKLSAgICBwcm9wZXJ0eSB0eXBlLgotLS0+Ci08IUVMRU1FTlQgdmFsdWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoCi0gICAgInZhbHVlIiBlbGVtZW50J3MgdmFsdWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8sIHByaW9yIHRvIGFkZGluZyBpdCB0bwotICAgIHRoZSAibGlzdC1lbnRyaWVzIiBsaXN0IGZvciBhIG1hbmFnZWQgcHJvcGVydHkgdGhhdCBpcyBhCi0gICAgamF2YS51dGlsLkxpc3QsIG9yIGEgIm1hcC1lbnRyaWVzIiBtYXAgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0Ci0gICAgaXMgYSBqYXZhLnV0aWwuTWFwLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLiAgSWYgb21pdHRlZCwKLSAgICAiamF2YS5sYW5nLlN0cmluZyIgaXMgYXNzdW1lZC4KLS0tPgotPCFFTEVNRU5UIHZhbHVlLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAidmFyaWFibGUtcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdmFsdWUgYmluZGluZyBleHByZXNzaW9ucy4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCB2YXJpYWJsZS1yZXNvbHZlciAoI1BDREFUQSk+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IElkZW50aWZpZXIgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IUFUVExJU1QgYWN0aW9uLWxpc3RlbmVyICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhcHBsaWNhdGlvbi1mYWN0b3J5ICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZS1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUtZXh0ZW5zaW9uICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlLW5hbWUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50LWV4dGVuc2lvbiAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudC1mYW1pbHkgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtdHlwZSAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnZlcnRlci1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb252ZXJ0ZXItZm9yLWNsYXNzICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyLWlkICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlZmF1bHQtbG9jYWxlICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZWZhdWx0LXJlbmRlci1raXQtaWQgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVmYXVsdC12YWx1ZSAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjZXMtY29uZmlnICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY2VzLWNvbnRleHQtZmFjdG9yeSAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZnJvbS1hY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZyb20tb3V0Y29tZSAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmcm9tLXZpZXctaWQgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBrZXktY2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpZmVjeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaWZlY3ljbGUtZmFjdG9yeSAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdC1lbnRyaWVzICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2FsZS1jb25maWcgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4gICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1iZWFuLWNsYXNzICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtYmVhbi1uYW1lICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4tc2NvcGUgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1wcm9wZXJ0eSAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hcC1lbnRyaWVzICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYXAtZW50cnkgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWVzc2FnZS1idW5kbGUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG5hdmlnYXRpb24tY2FzZSAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYXZpZ2F0aW9uLWhhbmRsZXIgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbmF2aWdhdGlvbi1ydWxlICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG51bGwtdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwaGFzZS1saXN0ZW5lciAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LWNsYXNzICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eS1leHRlbnNpb24gICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHktbmFtZSAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LXJlc29sdmVyICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWRpcmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVmZXJlbmNlZC1iZWFuICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZmVyZW5jZWQtYmVhbi1jbGFzcyAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWZlcmVuY2VkLWJlYW4tbmFtZSAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdCAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlci1raXQtY2xhc3MgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXIta2l0LWZhY3RvcnkgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdC1pZCAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXJlci1jbGFzcyAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyZXItZXh0ZW5zaW9uICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyLXR5cGUgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3RhdGUtbWFuYWdlciAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHN1Z2dlc3RlZC12YWx1ZSAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzdXBwb3J0ZWQtbG9jYWxlICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdG8tdmlldy1pZCAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbGlkYXRvciAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWxpZGF0b3ItY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsaWRhdG9yLWlkICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWx1ZS1jbGFzcyAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFyaWFibGUtcmVzb2x2ZXIgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZpZXctaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZGFkOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8xLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDg5NSArMCwwIEBACi08IS0tCi0gICAgRFREIGZvciB0aGUgSmF2YVNlcnZlciBGYWNlcyBBcHBsaWNhdGlvbiBDb25maWd1cmF0aW9uIEZpbGUgKFZlcnNpb24gMS4xKQotCi0gICAgVG8gc3VwcG9ydCB2YWxpZGF0aW9uIG9mIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlKHMpLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcKLSAgICBET0NUWVBFIGVsZW1lbnQgYXQgdGhlIGJlZ2lubmluZyAoYWZ0ZXIgdGhlICJ4bWwiIGRlY2xhcmF0aW9uKToKLQotICAgIDwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4xLy9FTiIKLSAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIj4KLQotICAgICRJZDogd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQsdiAxLjEgMjAwNy8wNS8yNSAyMToxMjo0OCBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0tLT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IERlZmluZWQgVHlwZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIEFuICJBY3Rpb24iIGlzIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIG1ldGhvZCBiaW5kaW5nCi0gICAgZXhwcmVzc2lvbiB0aGF0IHBvaW50cyBhdCBhIG1ldGhvZCB3aXRoIG5vIGFyZ3VtZW50cyB0aGF0IHJldHVybnMgYQotICAgIFN0cmluZy4gIEl0IG11c3QgYmUgYnJhY2tldGVkIHdpdGggIiN7fSIsIGZvciBleGFtcGxlLAotICAgICIje2NhcmRlbW8uYnV5Q2FyfSIuCi0tLT4KLTwhRU5USVRZICUgQWN0aW9uICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIkNsYXNzTmFtZSIgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGlzCi0gICAgaW5zdGFudGlhdGVkIHRvIHByb3ZpZGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGVuY2xvc2luZyBlbGVtZW50LgotLS0+Ci08IUVOVElUWSAlIENsYXNzTmFtZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBbiAiSWRlbnRpZmllciIgaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IGNvbmZvcm1zIHRvIHRoZSB2YXJpYWJsZQotICAgIG5hbWluZyBjb252ZW50aW9ucyBvZiB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSAoSkxTIFNlY3Rpb24gPy4/Lj8pLgotLS0+Ci08IUVOVElUWSAlIElkZW50aWZpZXIgIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiSmF2YVR5cGUiIGlzIGVpdGhlciB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaXMKLSAgICBpbnN0YW50aWF0ZWQgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZW5jbG9zaW5nIGVsZW1lbnQsIG9yCi0gICAgdGhlIG5hbWUgb2YgYSBKYXZhIHByaW1pdGl2ZSB0eXBlIChzdWNoIGFzIGludCBvciBjaGFyKS4gIFRoZSBjbGFzcyBuYW1lCi0gICAgb3IgcHJpbWl0aXZlIHR5cGUgbWF5IG9wdGlvbmFsbHkgYmUgZm9sbG93ZWQgYnkgIltdIiB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgdGhlIHVuZGVybHlpbmcgZGF0YSBtdXN0IGJlIGFuIGFycmF5LCByYXRoZXIgdGhhbiBhIHNjYWxhciB2YXJpYWJsZS4KLS0tPgotPCFFTlRJVFkgJSBKYXZhVHlwZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJMYW5ndWFnZSIgaXMgYSBsb3dlciBjYXNlIHR3by1sZXR0ZXIgY29kZSBmb3IgYSBsYW5ndWFnZSBhcyBkZWZpbmVkCi0gICAgYnkgSVNMLTYzOS4KLS0tPgotPCFFTlRJVFkgJSBMYW5ndWFnZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJSZXNvdXJjZVBhdGgiIGlzIHRoZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZQotICAgIChzdWNoIGFzIGEgbG9nbyBpbWFnZSkuCi0tLT4KLTwhRU5USVRZICUgUmVzb3VyY2VQYXRoICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIlNjb3BlIiBpcyB0aGUgd2VsbC1rbm93biBuYW1lIG9mIGEgc2NvcGUgaW4gd2hpY2ggbWFuYWdlZCBiZWFucyBtYXkKLSAgICBvcHRpb25hbGx5IGJlIGRlZmluZWQgdG8gYmUgY3JlYXRlZCBpbi4KLS0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJlcXVlc3R8c2Vzc2lvbnxhcHBsaWNhdGlvbikiPgotCi0KLQotPCEtLQotICAgIEEgIlNjb3BlT3JOb25lIiBlbGVtZW50IGRlZmluZXMgdGhlIGxlZ2FsIHZhbHVlcyBmb3IgdGhlCi0gICAgPG1hbmFnZWQtYmVhbi1zY29wZT4gZWxlbWVudCdzIGJvZHkgY29udGVudCwgd2hpY2ggaW5jbHVkZXMKLSAgICBhbGwgb2YgdGhlIHNjb3BlcyByZXNwcmVzZW50ZWQgYnkgdGhlICJTY29wZSIgdHlwZSwgcGx1cyB0aGUKLSAgICAibm9uZSIgdmFsdWUgaW5kaWNhdGluZyB0aGF0IGEgY3JlYXRlZCBiZWFuIHNob3VsZCBub3QgYmUKLSAgICBzdG9yZWQgaW50byBhbnkgc2NvcGUuCi0tLT4KLTwhRU5USVRZICUgU2NvcGVPck5vbmUgIihyZXF1ZXN0fHNlc3Npb258YXBwbGljYXRpb258bm9uZSkiPgotCi0KLTwhLS0KLSAgICBBICJWaWV3SWRQYXR0ZXJuIiBpcyBhIHBhdHRlcm4gZm9yIG1hdGNoaW5nIHZpZXcgaWRlbnRpZmllcnMgaW4KLSAgICBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIgbmF2aWdhdGlvbiBydWxlIHNob3VsZCBiZQotICAgIGZpcmVkLiAgSXQgbXVzdCBjb250YWluIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLQotICAgIC0gVGhlIGV4YWN0IG1hdGNoIGZvciBhIHZpZXcgaWRlbnRpZmllciB0aGF0IGlzIHJlY29nbml6ZWQKLSAgICAgIGJ5IHRoZSB0aGUgVmlld0hhbmRsZXIgaW1wbGVtZW50YXRpb24gYmVpbmcgdXNlZCAoc3VjaCBhcwotICAgICAgIi9pbmRleC5qc3AiIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgVmlld0hhbmRsZXIpLgotCi0gICAgLSBBIHByb3BlciBwcmVmaXggb2YgYSB2aWV3IGlkZW50aWZpZXIsIHBsdXMgYSB0cmFpbGluZyAiKiIKLSAgICAgIGNoYXJhY3Rlci4gIFRoaXMgcGF0dGVybiBpbmRpY2F0ZXMgdGhhdCBhbGwgdmlldyBpZGVudGlmaWVycyB0aGF0Ci0gICAgICBtYXRjaCB0aGUgcG9ydGlvbiBvZiB0aGUgcGF0dGVybiB1cCB0byB0aGUgYXN0ZXJpc2sgd2lsbCBtYXRjaCB0aGUKLSAgICAgIHN1cnJvdW5kaW5nIHJ1bGUuICBXaGVuIG1vcmUgdGhhbiBvbmUgbWF0Y2ggZXhpc3RzLCB0aGUgbWF0Y2ggd2l0aAotICAgICAgdGhlIGxvbmdlc3QgcGF0dGVybiBpcyBzZWxlY3RlZC4KLQotICAgIC0gQW4gIioiIGNoYXJhY3Rlciwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIHBhdHRlcm4gYXBwbGllcyB0byBhbGwKLSAgICAgIHZpZXcgaWRlbnRpZmllcnMuCi0tLT4KLTwhRU5USVRZICUgVmlld0lkUGF0dGVybiAiQ0RBVEEiPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT0gVG9wIExldmVsIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tCi0gICAgVGhlICJmYWNlcy1jb25maWciIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgICBoaWVyYXJjaHksIGFuZCBjb250YWlucyBuZXN0ZWQgZWxlbWVudHMgZm9yIGFsbCBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbgotICAgIHNldHRpbmdzLgotLS0+Ci08IUVMRU1FTlQgZmFjZXMtY29uZmlnICAgICgoYXBwbGljYXRpb258ZmFjdG9yeXxjb21wb25lbnR8Y29udmVydGVyfG1hbmFnZWQtYmVhbnxuYXZpZ2F0aW9uLXJ1bGV8cmVmZXJlbmNlZC1iZWFufHJlbmRlci1raXR8bGlmZWN5Y2xlfHZhbGlkYXRvcikqKT4KLTwhQVRUTElTVCBmYWNlcy1jb25maWcKLSAgICAgICB4bWxucyBDREFUQSAjRklYRUQgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0NvbmZpZ3VyYXRpb24iPgotCi0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PSBEZWZpbml0aW9uIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0KLSAgICBUaGUgImFwcGxpY2F0aW9uIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUgdmFyaW91cwotICAgIHBlci1hcHBsaWNhdGlvbi1zaW5nbGV0b24gaW1wbGVtZW50YXRpb24gYXJ0aWZhY3RzIGZvciBhIHBhcnRpY3VsYXIgd2ViCi0gICAgYXBwbGljYXRpb24gdGhhdCBpcyB1dGlsaXppbmcgSmF2YVNlcnZlciBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMKLSAgICB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgSlNGIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIHN1aXRhYmxlCi0gICAgZGVmYXVsdC4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uICAgICAoKGFjdGlvbi1saXN0ZW5lcnxkZWZhdWx0LXJlbmRlci1raXQtaWR8bWVzc2FnZS1idW5kbGV8bmF2aWdhdGlvbi1oYW5kbGVyfHZpZXctaGFuZGxlcnxzdGF0ZS1tYW5hZ2VyfHByb3BlcnR5LXJlc29sdmVyfHZhcmlhYmxlLXJlc29sdmVyfGxvY2FsZS1jb25maWcpKik+Ci0KLQotPCEtLQotICAgIFRoZSAiZmFjdG9yeSIgZWxlbWVudCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgdGhlIHZhcmlvdXMKLSAgICBGYWN0b3JpZXMgdGhhdCBjb21wcmlzZSBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgSmF2YVNlcnZlcgotICAgIEZhY2VzLiAgRm9yIG5lc3RlZCBlbGVtZW50cyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgSlNGCi0gICAgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgc3VpdGFibGUgZGVmYXVsdC4KLS0tPgotPCFFTEVNRU5UIGZhY3RvcnkgICAgICgoYXBwbGljYXRpb24tZmFjdG9yeXxmYWNlcy1jb250ZXh0LWZhY3Rvcnl8bGlmZWN5Y2xlLWZhY3Rvcnl8cmVuZGVyLWtpdC1mYWN0b3J5KSopPgotCi0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZSIgZWxlbWVudCByZXByZXNlbnRzIGEgbmFtZWQsIHR5cGVkLCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgKLSAgICB0aGUgcGFyZW50IFVJQ29tcG9uZW50IHZpYSB0aGUgZ2VuZXJpYyBhdHRyaWJ1dGVzIG1lY2hhbmlzbS4KLQotICAgIEF0dHJpYnV0ZSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJlbnQgKG9yIHJlbGF0ZWQpCi0gICAgY29tcG9uZW50LgotLS0+Ci08IUVMRU1FTlQgYXR0cmlidXRlICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBhdHRyaWJ1dGUtbmFtZSwgYXR0cmlidXRlLWNsYXNzLCBkZWZhdWx0LXZhbHVlPywgc3VnZ2VzdGVkLXZhbHVlPywgYXR0cmlidXRlLWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBhdHRyaWJ1dGUuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUtZXh0ZW5zaW9uIEFOWT4KLQotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFVJQ29tcG9uZW50IGltcGxlbWVudGF0aW9uCi0gICAgY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIHR5cGUgaWRlbnRpZmllciwKLSAgICBhbG9uZyB3aXRoIGl0cyBhc3NvY2lhdGVkIHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMuICBDb21wb25lbnQgdHlwZXMgbXVzdAotICAgIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlY29nbml6ZWQKLSAgICBieSB0aGUgaW1wbGVtZW50YXRpb24gbG9naWMgb2YgdGhpcyBjb21wb25lbnQuICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cwotICAgIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIHRoZSBjb21wb25lbnQgY2xhc3MgdGhhdCBtYXkgYmUgZXhwb3NlZAotICAgIGZvciBtYW5pcHVsYXRpb24gdmlhIHRvb2xzLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50ICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBjb21wb25lbnQtdHlwZSwgY29tcG9uZW50LWNsYXNzLCBmYWNldCosIGF0dHJpYnV0ZSosIHByb3BlcnR5KiwgY29tcG9uZW50LWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBjb21wb25lbnQuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQtZXh0ZW5zaW9uIEFOWT4KLQotPCEtLQotICAgRGVmaW5lIHRoZSBuYW1lIGFuZCBvdGhlciBkZXNpZ24tdGltZSBpbmZvcm1hdGlvbiBmb3IgYSBmYWNldCB0aGF0IGlzCi0gICBhc3NvY2lhdGVkIHdpdGggYSByZW5kZXJlciBvciBhIGNvbXBvbmVudC4KLS0tPgotCi08IUVMRU1FTlQgZmFjZXQgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGZhY2V0LW5hbWUsIGZhY2V0LWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBmYWNldC4gIE1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgc3BlY2lmaWMgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGZhY2V0LWV4dGVuc2lvbiBBTlk+Ci0KLTwhLS0KLSAgICBUaGUgImZhY2V0LW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZmFjZXQgbmFtZSB1bmRlciB3aGljaCBhCi0gICAgVUlDb21wb25lbnQgd2lsbCBiZSBhZGRlZCB0byBpdHMgcGFyZW50LiAgSXQgbXVzdCBiZSBvZiB0eXBlCi0gICAgIklkZW50aWZpZXIiLgotLS0+Ci08IUVMRU1FTlQgZmFjZXQtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgQ29udmVydGVyIGltcGxlbWVudGF0aW9uCi0gICAgY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIGNvbnZlcnRlciBpZGVudGlmaWVyLgotICAgIENvbnZlcnRlciBpZGVudGlmaWVycyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgbWF5IGJlCi0gICAgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMKLSAgICBwcm9wZXJ0aWVzIG9mIHRoZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZAotICAgIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuCi0tLT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXIgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIChjb252ZXJ0ZXItaWQgfCBjb252ZXJ0ZXItZm9yLWNsYXNzKSwgY29udmVydGVyLWNsYXNzLCBhdHRyaWJ1dGUqLCBwcm9wZXJ0eSopPgotCi0KLTwhLS0KLSAgICBUaGUgImljb24iIGVsZW1lbnQgY29udGFpbnMgInNtYWxsLWljb24iIGFuZCAibGFyZ2UtaWNvbiIgZWxlbWVudHMgdGhhdAotICAgIHNwZWNpZnkgdGhlIHJlc29ydWNlIHBhdGhzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGIG9yIEpQRyBpY29uIGltYWdlcwotICAgIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotLS0+Ci08IUVMRU1FTlQgaWNvbiAgICAgICAgICAgIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotPCFBVFRMSVNUIGljb24gICAgICAgICAgICB4bWw6bGFuZyAgICAgICAgJUxhbmd1YWdlOyAgICAgICNJTVBMSUVEPgotCi08IS0tCi0gICAgVGhlICJsaWZlY3ljbGUiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gc3BlY2lmeQotICAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGJlaGF2aW91ciBvZiB0aGUgZGVmYXVsdCBMaWZlY3ljbGUKLSAgICBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0tLT4KLTwhRUxFTUVOVCBsaWZlY3ljbGUgICAgICAgKHBoYXNlLWxpc3RlbmVyKik+Ci0KLTwhLS0KLSAgICAgVGhlICJsb2NhbGUtY29uZmlnIiBlbGVtZW50IGFsbG93cyB0aGUgYXBwIGRldmVsb3BlciB0byBkZWNsYXJlIHRoZQotICAgICBzdXBwb3J0ZWQgbG9jYWxlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIAotLS0+Ci08IUVMRU1FTlQgbG9jYWxlLWNvbmZpZyAoZGVmYXVsdC1sb2NhbGU/LCBzdXBwb3J0ZWQtbG9jYWxlKik+Ci0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YUJlYW4sIG9mIGEgcGFydGljdWxhciBjbGFzcywKLSAgICB0aGF0IHdpbGwgYmUgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkIGF0IHJ1bnRpbWUgKGJ5IHRoZSBkZWZhdWx0Ci0gICAgVmFyaWFibGVSZXNvbHZlciBpbXBsZW1lbnRhdGlvbikgaWYgaXQgaXMgcmVmZXJlbmNlZCBhcyB0aGUgZmlyc3QgZWxlbWVudAotICAgIG9mIGEgdmFsdWUgYmluZGluZyBleHByZXNzaW9uLCBhbmQgbm8gY29ycmVzcG9uZGluZyBiZWFuIGNhbiBiZQotICAgIGlkZW50aWZpZWQgaW4gYW55IHNjb3BlLiAgSW4gYWRkaXRpb24gdG8gdGhlIGNyZWF0aW9uIG9mIHRoZSBtYW5hZ2VkIGJlYW4sCi0gICAgYW5kIHRoZSBvcHRpb25hbCBzdG9yaW5nIG9mIGl0IGludG8gdGhlIHNwZWNpZmllZCBzY29wZSwgdGhlIG5lc3RlZAotICAgIG1hbmFnZWQtcHJvcGVydHkgZWxlbWVudHMgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2YKLSAgICBzZXR0YWJsZSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgY3JlYXRlZCBpbnN0YW5jZS4KLS0tPgotPCFFTEVNRU5UIG1hbmFnZWQtYmVhbiAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgbWFuYWdlZC1iZWFuLW5hbWUsIG1hbmFnZWQtYmVhbi1jbGFzcywgbWFuYWdlZC1iZWFuLXNjb3BlLCAobWFuYWdlZC1wcm9wZXJ0eSogfCBtYXAtZW50cmllcyB8IGxpc3QtZW50cmllcykpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtcHJvcGVydHkiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHByb3BlcnR5IG9mIGEKLSAgICBtYW5hZ2VkIGJlYW4gdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAob3IgdmFsdWUgc2V0KQotICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nIG1hbmFnZWQgYmVhbiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLXByb3BlcnR5IChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBwcm9wZXJ0eS1uYW1lLCBwcm9wZXJ0eS1jbGFzcz8sIChtYXAtZW50cmllc3xudWxsLXZhbHVlfHZhbHVlfGxpc3QtZW50cmllcykpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hcC1lbnRyeSIgZWxlbWVudCByZXByc2VudHMgYSBzaW5nbGUga2V5LWVudHJ5IHBhaXIgdGhhdAotICAgIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGEgbWFuYWdlZCBwcm9wZXJ0eSBvZiB0eXBlCi0gICAgamF2YS51dGlsLk1hcC4KLS0tPgotPCFFTEVNRU5UIG1hcC1lbnRyeSAoa2V5LCAobnVsbC12YWx1ZXx2YWx1ZSkpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hcC1lbnRyaWVzJyBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2Yga2V5LWVudHJ5IHBhaXJzIHRoYXQKLSAgICB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgdHlwZQotICAgIGphdmEudXRpbC5NYXAuICBJbiBhZGRpdGlvbiwgdGhlIEphdmEgY2xhc3MgdHlwZXMgb2YgdGhlIGtleSBhbmQgZW50cnkKLSAgICB2YWx1ZXMgbWF5IGJlIG9wdGlvbmFsbHkgZGVjbGFyZWQuCi0tLT4KLTwhRUxFTUVOVCBtYXAtZW50cmllcyAoa2V5LWNsYXNzPywgdmFsdWUtY2xhc3M/LCBtYXAtZW50cnkqKT4KLQotCi08IS0tCi0gICAgVGhlIGJhc2UgbmFtZSBvZiBhIHJlc291cmNlIGJ1bmRsZSByZXByZXNlbnRpbmcgdGhlIG1lc3NhZ2UgcmVzb3VyY2VzCi0gICAgZm9yIHRoaXMgYXBwbGljYXRpb24uICBTZWUgdGhlIEphdmFEb2NzIGZvciB0aGUgImphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSIKLSAgICBjbGFzcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgc3ludGF4IG9mIHJlc291cmNlIGJ1bmRsZSBuYW1lcy4KLS0tPgotCi08IUVMRU1FTlQgbWVzc2FnZS1idW5kbGUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgIm5hdmlnYXRpb24tY2FzZSIgZWxlbWVudCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mCi0gICAgY29uZGl0aW9ucyB0aGF0IG11c3QgbWF0Y2ggZm9yIHRoaXMgY2FzZSB0byBiZSBleGVjdXRlZCwgYW5kIHRoZQotICAgIHZpZXcgaWQgb2YgdGhlIGNvbXBvbmVudCB0cmVlIHRoYXQgc2hvdWxkIGJlIHNlbGVjdGVkIG5leHQuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLWNhc2UgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGZyb20tYWN0aW9uPywgZnJvbS1vdXRjb21lPywgdG8tdmlldy1pZCwgcmVkaXJlY3Q/KT4KLQotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLXJ1bGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIGRlY2lzaW9uIHJ1bGUKLSAgICB0aGF0IHdpbGwgYmUgdXRpbGl6ZWQgYnkgdGhlIGRlZmF1bHQgTmF2aWdhdGlvbkhhbmRsZXIKLSAgICBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIGRlY2lzaW9ucyBvbiB3aGF0IHZpZXcgc2hvdWxkIGJlIGRpc3BsYXllZAotICAgIG5leHQsIGJhc2VkIG9uIHRoZSB2aWV3IGlkIGJlaW5nIHByb2Nlc3NlZC4KLS0tPgotPCFFTEVNRU5UIG5hdmlnYXRpb24tcnVsZSAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgZnJvbS12aWV3LWlkPywgbmF2aWdhdGlvbi1jYXNlKik+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHkiIGVsZW1lbnQgcmVwcmVzZW50cyBhIEphdmFCZWFuIHByb3BlcnR5IG9mIHRoZSBKYXZhIGNsYXNzCi0gICAgcmVwcmVzZW50ZWQgYnkgb3VyIHBhcmVudCBlbGVtZW50LgotCi0gICAgUHJvcGVydHkgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgSmF2YSBjbGFzcwotICAgIHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBlbGVtZW50LCBhbmQgbXVzdCBjb3JyZXNwb25kIHRvCi0gICAgcHJvcGVydHkgbmFtZXMgdGhhdCB3aWxsIGJlIHJlY29nbml6ZWQgd2hlbiBwZXJmb3JtaW5nIGludHJvc3BlY3Rpb24KLSAgICBhZ2FpbnN0IHRoYXQgY2xhc3MgdmlhIGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHkgICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBwcm9wZXJ0eS1uYW1lLCBwcm9wZXJ0eS1jbGFzcywgZGVmYXVsdC12YWx1ZT8sIHN1Z2dlc3RlZC12YWx1ZT8sIHByb3BlcnR5LWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBwcm9wZXJ0eS4gIE1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgc3BlY2lmaWMgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LWV4dGVuc2lvbiBBTlk+Ci0KLTwhLS0KLSAgICBUaGUgInJlZmVyZW5jZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGF0IGRlc2lnbiB0aW1lIHRoZSBwcm9taXNlCi0gICAgdGhhdCBhIEphdmEgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aWxsIGV4aXN0IGF0IHJ1bnRpbWUgaW4gc29tZQotICAgIHNjb3BlLCB1bmRlciB0aGUgc3BlY2lmaWVkIGtleS4gIFRoaXMgY2FuIGJlIHVzZWQgYnkgZGVzaWduIHRpbWUgdG9vbHMKLSAgICB0byBjb25zdHJ1Y3QgdXNlciBpbnRlcmZhY2UgZGlhbG9ncyBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUKLSAgICBzcGVjaWZpZWQgY2xhc3MuICBUaGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBhIHJlZmVyZW5jZWQgYmVhbgotICAgIGVsZW1lbnQgaGFzIG5vIGltcGFjdCBvbiB0aGUgSmF2YVNlcnZlciBGYWNlcyBydW50aW1lIGVudmlyb25tZW50Ci0gICAgaW5zaWRlIGEgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgcmVmZXJlbmNlZC1iZWFuIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCByZWZlcmVuY2VkLWJlYW4tbmFtZSwgcmVmZXJlbmNlZC1iZWFuLWNsYXNzKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJLaXQgaW1wbGVtZW50YXRpb24KLSAgICB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgcmVuZGVyLWtpdC1pZC4gIElmIG5vCi0gICAgcmVuZGVyLWtpdC1pZCBpcyBzcGVjaWZpZWQsIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZWZhdWx0IFJlbmRlcktpdAotICAgIChSZW5kZXJLaXRGYWN0b3J5LkRFRkFVTFRfUkVOREVSX0tJVCkgaXMgYXNzdW1lZC4KLS0tPgotPCFFTEVNRU5UIHJlbmRlci1raXQgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcmVuZGVyLWtpdC1pZD8sIHJlbmRlci1raXQtY2xhc3M/LCByZW5kZXJlciopPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlcmVyIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJlciBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgZmFtaWx5Ci0gICAgYW5kIHJlbmRlcmVyIHR5cGUgaWRlbnRpZmllcnMsIGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgIHBhcmVudCAicmVuZGVyLWtpdCIgZWxlbWVudC4gIENvbWJpbmF0aW9ucyBvZiBjb21wb25lbnQgZmFtaWx5IGFuZCByZW5kZXJlcgotICAgIHR5cGUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQKLSAgICAicmVuZGVyLWtpdCIgZWxlbWVudC4KLQotICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGNvbXBvbmVudCBhdHRyaWJ1dGVzIHRoYXQKLSAgICBhcmUgcmVjb2duaXplZCBieSB0aGlzIHJlbmRlcmVyLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXIgICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBjb21wb25lbnQtZmFtaWx5LCByZW5kZXJlci10eXBlLCByZW5kZXJlci1jbGFzcywgZmFjZXQqLCBhdHRyaWJ1dGUqLCByZW5kZXJlci1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgcmVuZGVyZXIuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXJlci1leHRlbnNpb24gQU5ZPgotCi08IS0tCi0gICAgVGhlICJ2YWxpZGF0b3IiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCB2YWxpZGF0b3IgaWRlbnRpZmllci4KLSAgICBWYWxpZGF0b3IgaWRlbnRpZmllcnMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0IG1heSBiZQotICAgIGNvbmZpZ3VyZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgdG8gYWZmZWN0IHRoZQotICAgIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLiAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgcHJvcGVydGllcyBvZiB0aGUgVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQKLSAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLgotLS0+Ci08IUVMRU1FTlQgdmFsaWRhdG9yICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCB2YWxpZGF0b3ItaWQsIHZhbGlkYXRvci1jbGFzcywgYXR0cmlidXRlKiwgcHJvcGVydHkqKT4KLQotCi08IS0tCi0gICAgVGhlICJsaXN0LWVudHJpZXMiIGVsZW1lbnQgcmVwcmVzZW50cyBhIHNldCBvZiBpbml0aWFsaXphdGlvbgotICAgIGVsZW1lbnRzIGZvciBhIG1hbmFnZWQgcHJvcGVydHkgdGhhdCBpcyBhIGphdmEudXRpbC5MaXN0IG9yIGFuCi0gICAgYXJyYXkuICBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSAidmFsdWUtY2xhc3MiIGVsZW1lbnQgY2FuIG9wdGlvbmFsbHkKLSAgICBiZSB1c2VkIHRvIGRlY2xhcmUgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoIHZhbHVlIHNob3VsZCBiZQotICAgIGNvbnZlcnRlZCBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBDb2xsZWN0aW9uLgotLS0+Ci08IUVMRU1FTlQgbGlzdC1lbnRyaWVzICAgICh2YWx1ZS1jbGFzcz8sIChudWxsLXZhbHVlfHZhbHVlKSopPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT0gU3Vib3JkaW5hdGUgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tCi0gICAgVGhlICJhY3Rpb24tbGlzdGVuZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIEFjdGlvbkxpc3RlbmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICBkdXJpbmcgdGhlIEludm9rZSBBcHBsaWNhdGlvbiBwaGFzZSBvZiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZS4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBhY3Rpb24tbGlzdGVuZXIgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJhcHBsaWNhdGlvbi1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLSAgICBuYW1lIG9mIHRoZSBjb25jcmV0ZSBBcHBsaWNhdGlvbkZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdAotICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4gRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEFQUExJQ0FUSU9OX0ZBQ1RPUlkpIGlzCi0gICAgY2FsbGVkLiBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBhcHBsaWNhdGlvbi1mYWN0b3J5ICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiYXR0cmlidXRlLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZSBvZiB0aGUgdmFsdWUKLSAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBhdHRyaWJ1dGUgbmFtZS4gIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGF0dHJpYnV0ZS1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiYXR0cmlidXRlLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbmFtZSB1bmRlciB3aGljaCB0aGUKLSAgICBjb3JyZXNwb25kaW5nIHZhbHVlIHdpbGwgYmUgc3RvcmVkLCBpbiB0aGUgZ2VuZXJpYyBhdHRyaWJ1dGVzIG9mIHRoZQotICAgIFVJQ29tcG9uZW50IHdlIGFyZSByZWxhdGVkIHRvLgotLS0+Ci08IUVMRU1FTlQgYXR0cmlidXRlLW5hbWUgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFVJQ29tcG9uZW50IGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQtY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbXBvbmVudC1mYW1pbHkiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgY29tcG9uZW50IGZhbWlseSBmb3IKLSAgICB3aGljaCB0aGUgUmVuZGVyZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCAicmVuZGVyZXIiIGVsZW1lbnQgd2lsbCBiZQotICAgIHVzZWQuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQtZmFtaWx5ICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiY29tcG9uZW50LXR5cGUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbmFtZSB1bmRlciB3aGljaCB0aGUKLSAgICBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LXR5cGUgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb252ZXJ0ZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIENvbnZlcnRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyLWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb252ZXJ0ZXItZm9yLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgZm9yIHdoaWNoIGEgQ29udmVydGVyIGNsYXNzIHdpbGwgYmUgcmVnaXN0ZXJlZC4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyLWZvci1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29udmVydGVyLWlkIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGlkZW50aWZpZXIgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyBDb252ZXJ0ZXIgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0tLT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXItaWQgICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJkZWZhdWx0LXJlbmRlci1raXQtaWQiIGVsZW1lbnQgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBkZWZpbmUKLSAgICBhIHJlbmRlcmtpdCB0byBiZSB1c2VkIG90aGVyIHRoYW4gdGhlIHN0YW5kYXJkIG9uZS4gCi0tLT4KLTwhRUxFTUVOVCBkZWZhdWx0LXJlbmRlci1raXQtaWQgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICAgVGhlICJkZWZhdWx0LWxvY2FsZSIgZWxlbWVudCBkZWNsYXJlcyB0aGUgZGVmYXVsdCBsb2NhbGUgZm9yIHRoaXMKLSAgICAgYXBwbGljYXRpb24gaW5zdGFuY2UuICBJdCBtdXN0IGJlIHNwZWNpZmllZCBhcwotICAgICA6bGFuZ3VhZ2U6W186Y291bnRyeTpbXzp2YXJpYW50Ol1dIHdpdGhvdXQgdGhlIGNvbG9ucywgZm9yIGV4YW1wbGUKLSAgICAgImphX0pQX1NKSVMiLiAgVGhlIHNlcGFyYXRvcnMgYmV0d2VlbiB0aGUgc2VnbWVudHMgbWF5IGJlICctJyBvcgotICAgICAnXycuCi0tLT4KLTwhRUxFTUVOVCBkZWZhdWx0LWxvY2FsZSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImRlZmF1bHQtdmFsdWUiIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG9yIGF0dHJpYnV0ZQotICAgIGluIHdoaWNoIHRoaXMgZWxlbWVudCByZXNpZGVzLiAgVGhpcyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlCi0gICAgInN1Z2dlc3RlZC12YWx1ZSIgaW4gdGhhdCB0aGUgcHJvcGVydHkgb3IgYXR0cmlidXRlIG11c3QgdGFrZSB0aGUKLSAgICB2YWx1ZSwgd2hlcmVhcyBpbiAic3VnZ2VzdGVkLXZhbHVlIiB0YWtpbmcgdGhlIHZhbHVlIGlzIG9wdGlvbmFsLgotLS0+Ci08IUVMRU1FTlQgZGVmYXVsdC12YWx1ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImRlc2NyaXB0aW9uIiBlbGVtZW50IGNvbnRhaW5zIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudAotICAgIGl0IGlzIG5lc3RlZCBpbiwgb3B0aW9uYWxseSBmbGFnZ2VkIHdpdGggYSBsYW5ndWFnZSBjb2RlIHVzaW5nIHRoZQotICAgICJ4bWw6bGFuZyIgYXR0cmlidXRlLgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gICAgIEFOWT4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiAgICAgeG1sOmxhbmcgICAgICAgICVMYW5ndWFnZTsgICAgICAjSU1QTElFRD4KLQotCi08IS0tCi0gICAgVGhlICJkaXNwbGF5LW5hbWUiIGVsZW1lbnQgaXMgYSBzaG9ydCBkZXNjcmlwdGl2ZSBuYW1lIGRlc2NyaWJpbmcgdGhlCi0gICAgZW50aXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCBpdCBpcyBuZXN0ZWQgaW4sIGludGVuZGVkIHRvIGJlCi0gICAgZGlzcGxheWVkIGJ5IHRvb2xzLCBhbmQgb3B0aW9uYWxseSBmbGFnZ2VkIHdpdGggYSBsYW5ndWFnZSBjb2RlIHVzaW5nCi0gICAgdGhlICJ4bWw6bGFuZyIgYXR0cmlidXRlLgotLS0+Ci08IUVMRU1FTlQgZGlzcGxheS1uYW1lICAgICgjUENEQVRBKT4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgICAgeG1sOmxhbmcgICAgICAgICVMYW5ndWFnZTsgICAgICAjSU1QTElFRD4KLQotPCEtLQotICAgIFRoZSAiZmFjZXMtY29udGV4dC1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQKLSAgICBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSBGYWNlc0NvbnRleHRGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0gICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZBQ0VTX0NPTlRFWFRfRkFDVE9SWSkgaXMgY2FsbGVkLiBJdCBtdXN0Ci0gICAgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGZhY2VzLWNvbnRleHQtZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImZyb20tYWN0aW9uIiBlbGVtZW50IGNvbnRhaW5zIGFuIGFjdGlvbiByZWZlcmVuY2UgZXhwcmVzc2lvbgotICAgIHRoYXQgbXVzdCBoYXZlIGJlZW4gZXhlY3V0ZWQgKGJ5IHRoZSBkZWZhdWx0IEFjdGlvbkxpc3RlbmVyIGZvciBoYW5kbGluZwotICAgIGFwcGxpY2F0aW9uIGxldmVsIGV2ZW50cykgaW4gb3JkZXIgdG8gc2VsZWN0IHRoaXMgbmF2aWdhdGlvbiBydWxlLiAgSWYKLSAgICBub3Qgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgd2lsbCBiZSByZWxldmFudCBubyBtYXR0ZXIgd2hpY2ggYWN0aW9uIHJlZmVyZW5jZQotICAgIHdhcyBleGVjdXRlZCAob3IgaWYgbm8gYWN0aW9uIHJlZmVyZW5jZSB3YXMgZXhlY3V0ZWQpLgotCi0gICAgVGhpcyB2YWx1ZSBtdXN0IGJlIG9mIHR5cGUgIkFjdGlvbiIuCi0tLT4KLTwhRUxFTUVOVCBmcm9tLWFjdGlvbiAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiZnJvbS1vdXRjb21lIiBlbGVtZW50IGNvbnRhaW5zIGEgbG9naWNhbCBvdXRjb21lIHN0cmluZyByZXR1cm5lZAotICAgIGJ5IHRoZSBleGVjdXRpb24gb2YgYW4gYXBwbGljYXRpb24gYWN0aW9uIG1ldGhvZCBzZWxlY3RlZCB2aWEgYW4KLSAgICAiYWN0aW9uUmVmIiBwcm9wZXJ0eSAob3IgYSBsaXRlcmFsIHZhbHVlIHNwZWNpZmllZCBieSBhbiAiYWN0aW9uIgotICAgIHByb3BlcnR5KSBvZiBhIFVJQ29tbWFuZCBjb21wb25lbnQuICBJZiBzcGVjaWZpZWQsIHRoaXMgcnVsZSB3aWxsIGJlCi0gICAgcmVsZXZhbnQgb25seSBpZiB0aGUgb3V0Y29tZSB2YWx1ZSBtYXRjaGVzIHRoaXMgZWxlbWVudCdzIHZhbHVlLiAgSWYKLSAgICBub3Qgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgd2lsbCBiZSByZWxldmFudCBubyBtYXR0ZXIgd2hhdCB0aGUgb3V0Y29tZQotICAgIHZhbHVlIHdhcy4KLS0tPgotPCFFTEVNRU5UIGZyb20tb3V0Y29tZSAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiZnJvbS12aWV3LWlkIiBlbGVtZW50IGNvbnRhaW5zIHRoZSB2aWV3IGlkZW50aWZpZXIgb2YgdGhlIHZpZXcKLSAgICBmb3Igd2hpY2ggdGhlIGNvbnRhaW5pbmcgbmF2aWdhdGlvbiBydWxlIGlzIHJlbGV2YW50LiAgSWYgbm8KLSAgICAiZnJvbS12aWV3IiBlbGVtZW50IGlzIHNwZWNpZmllZCwgdGhpcyBydWxlIGFwcGxpZXMgdG8gbmF2aWdhdGlvbgotICAgIGRlY2lzaW9ucyBvbiBhbGwgdmlld3MuICBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgYSB2YWx1ZQotICAgIG9mICIqIiBpcyBhc3N1bWVkLCBtZWFuaW5nIHRoYXQgdGhpcyBuYXZpZ2F0aW9uIHJ1bGUgYXBwbGllcyB0byBhbGwKLSAgICB2aWV3cy4KLQotICAgIFRoaXMgdmFsdWUgbXVzdCBiZSBvZiB0eXBlICJWaWV3SWRQYXR0ZXJuIi4KLS0tPgotPCFFTEVNRU5UIGZyb20tdmlldy1pZCAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAia2V5IiBlbGVtZW50IGlzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXAga2V5IHRoYXQKLSAgICB3aWxsIGJlIHN0b3JlZCBpbiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgdHlwZSBqYXZhLnV0aWwuTWFwLiAgCi0tLT4KLTwhRUxFTUVOVCBrZXkgICAgICAgICAgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImtleS1jbGFzcyIgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaCAia2V5IgotICAgIGVsZW1lbnQgaW4gYSBzZXQgb2YgIm1hcC1lbnRyeSIgZWxlbWVudHMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8uICBJdAotICAgIG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4gIElmIG9taXR0ZWQsICJqYXZhLmxhbmcuU3RyaW5nIgotICAgIGlzIGFzc3VtZWQuCi0tLT4KLTwhRUxFTUVOVCBrZXktY2xhc3MgICAgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImxhcmdlLWljb24iIGVsZW1lbnQgY29udGFpbnMgdGhlIHJlc291cmNlIHBhdGggdG8gYSBsYXJnZSAoMzJ4MzIpCi0gICAgaWNvbiBpbWFnZS4gIFRoZSBpbWFnZSBtYXkgYmUgaW4gZWl0aGVyIEdJRiBvciBKUEcgZm9ybWF0LgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAgICAgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAibGlmZWN5Y2xlLWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIExpZmVjeWNsZUZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIHdoZW4gRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KExJRkVDWUNMRV9GQUNUT1JZKSBpcyBjYWxsZWQuIEl0IG11c3QgYmUgCi0gICAgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGxpZmVjeWNsZS1mYWN0b3J5ICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAibWFuYWdlZC1iZWFuLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotICAgIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgYSBuZXcgaW5zdGFuY2UKLSAgICBpZiBjcmVhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1hbmFnZWQgYmVhbiBpcyByZXF1ZXN0ZWQuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLQotICAgIFRoZSBzcGVjaWZpZWQgY2xhc3MgbXVzdCBjb25mb3JtIHRvIHN0YW5kYXJkIEphdmFCZWFucyBjb252ZW50aW9ucy4KLSAgICBJbiBwYXJ0aWN1bGFyLCBpdCBtdXN0IGhhdmUgYSBwdWJsaWMgemVyby1hcmd1bWVudHMgY29uc3RydWN0b3IsIGFuZAotICAgIHplcm8gb3IgbW9yZSBwdWJsaWMgcHJvcGVydHkgc2V0dGVycy4KLS0tPgotPCFFTEVNRU5UIG1hbmFnZWQtYmVhbi1jbGFzcyAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbi1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGF0dHJpYnV0ZSBuYW1lIHVuZGVyCi0gICAgd2hpY2ggYSBtYW5hZ2VkIGJlYW4gd2lsbCBiZSBzZWFyY2hlZCBmb3IsIGFzIHdlbGwgYXMgc3RvcmVkICh1bmxlc3MKLSAgICB0aGUgIm1hbmFnZWQtYmVhbi1zY29wZSIgdmFsdWUgaXMgIm5vbmUiKS4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJJZGVudGlmaWVyIi4KLS0tPgotPCFFTEVNRU5UIG1hbmFnZWQtYmVhbi1uYW1lICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4tc2NvcGUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgc2NvcGUgaW50byB3aGljaCBhIG5ld2x5Ci0gICAgY3JlYXRlZCBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIG1hbmFnZWQgYmVhbiB3aWxsIGJlIHN0b3JlZCAodW5sZXNzCi0gICAgdGhlIHZhbHVlIGlzICJub25lIikuICBJdCBtdXN0IGJlIG9mIHR5cGUgIlNjb3BlT3JOb25lIi4KLS0tPgotPCFFTEVNRU5UIG1hbmFnZWQtYmVhbi1zY29wZSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgIm5hdmlnYXRpb24taGFuZGxlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgTmF2aWdhdGlvbkhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIGR1cmluZyB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIHBoYXNlIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLAotICAgIGlmIHRoZSBkZWZhdWx0IEFjdGlvbkxpc3RlbmVyIChwcm92aWRlZCBieSB0aGUgSlNGIGltcGxlbWVudGF0aW9uKSBpcyB1c2VkLgotICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIG5hdmlnYXRpb24taGFuZGxlciAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSAicGhhc2UtbGlzdGVuZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotbmFtZSBvZiB0aGUgY29uY3JldGUgUGhhc2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUKLXJlZ2lzdGVyZWQgb24gdGhlIExpZmVjeWNsZS4gSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcGhhc2UtbGlzdGVuZXIgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJyZWRpcmVjdCIgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCBuYXZpZ2F0aW9uIHRvIHRoZSBzcGVjaWZpZWQKLSAgICAidG8tdmlldy1pZCIgc2hvdWxkIGJlIGFjY29tcGxpc2hlZCBieSBwZXJmb3JtaW5nIGFuIEhUVFAgcmVkaXJlY3QKLSAgICByYXRoZXIgdGhhbiB0aGUgdXN1YWwgVmlld0hhbmRsZXIgbWVjaGFuaXNtcy4KLS0tPgotPCFFTEVNRU5UIHJlZGlyZWN0IEVNUFRZPgotCi08IS0tCi0gICAgVGhlICJzdWdnZXN0ZWQtdmFsdWUiIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG9yCi0gICAgYXR0cmlidXRlIGluIHdoaWNoIHRoaXMgZWxlbWVudCByZXNpZGVzLiAgVGhpcyB2YWx1ZSBpcyBhZHZpc29yeQotICAgIG9ubHkgYW5kIGlzIGludGVuZGVkIGZvciB0b29scyB0byB1c2Ugd2hlbiBwb3B1bGF0aW5nIHBhbGxldHRlcy4KLS0tPgotPCFFTEVNRU5UIHN1Z2dlc3RlZC12YWx1ZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotCi0gICAgVGhlICJ2aWV3LWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFZpZXdIYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICBkdXJpbmcgdGhlIFJlc3RvcmUgVmlldyBhbmQgUmVuZGVyIFJlc3BvbnNlIHBoYXNlcyBvZiB0aGUgcmVxdWVzdAotICAgIHByb2Nlc3NpbmcgbGlmZWN5Y2xlLiAgVGhlIGZhY2VzIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhCi0gICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzCi0tLT4KLTwhRUxFTUVOVCB2aWV3LWhhbmRsZXIgKCNQQ0RBVEEpPgotCi08IS0tCi0KLSAgICBUaGUgInN0YXRlLW1hbmFnZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFN0YXRlTWFuYWdlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIHJlcXVlc3QKLSAgICBwcm9jZXNzaW5nIGxpZmVjeWNsZS4gIFRoZSBmYWNlcyBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYQotICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcwotLS0+Ci08IUVMRU1FTlQgc3RhdGUtbWFuYWdlciAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgIm51bGwtdmFsdWUiIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhlIG1hbmFnZWQgcHJvcGVydHkgaW4gd2hpY2ggd2UKLSAgICBhcmUgbmVzdGVkIHdpbGwgYmUgZXhwbGljaXRseSBzZXQgdG8gbnVsbCBpZiBvdXIgbWFuYWdlZCBiZWFuIGlzCi0gICAgYXV0b21hdGljYWxseSBjcmVhdGVkLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBvbWl0dGluZyB0aGUgbWFuYWdlZAotICAgIHByb3BlcnR5IGVsZW1lbnQgZW50aXJlbHksIHdoaWNoIHdpbGwgY2F1c2Ugbm8gcHJvcGVydHkgc2V0dGVyIHRvIGJlCi0gICAgY2FsbGVkIGZvciB0aGlzIHByb3BlcnR5LgotCi0gICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgYXNzb2NpYXRlZAotICAgICJwcm9wZXJ0eS1jbGFzcyIgaWRlbnRpZmllcyBhIEphdmEgY2xhc3MsIG5vdCBhIEphdmEgcHJpbWl0aXZlLgotLS0+Ci08IUVMRU1FTlQgbnVsbC12YWx1ZSBFTVBUWT4KLQotCi08IS0tCi0gICAgVGhlICJwcm9wZXJ0eS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIHZhbHVlCi0gICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcGVydHkgbmFtZS4gIEl0IG11c3QgYmUgb2YgdHlwZSAiSmF2YVR5cGUiLgotICAgIElmIG5vdCBzcGVjaWZpZWQsIGl0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIGV4aXN0aW5nIGNsYXNzZXM7IGhvd2V2ZXIsCi0gICAgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBnb2luZwotICAgIHRvIGJlIHRoZSBzb3VyY2UgZm9yIGdlbmVyYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3Nlcy4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LWNsYXNzICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHktbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhQmVhbnMgcHJvcGVydHkgbmFtZQotICAgIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG1heSBiZSBzdG9yZWQuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1uYW1lICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5LXJlc29sdmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBQcm9wZXJ0eVJlc29sdmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkCi0gICAgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbnMuCi0gICAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHktcmVzb2x2ZXIgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlZmVyZW5jZWQtYmVhbi1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLSAgICBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIChlaXRoZXIgYWJzdHJhY3Qgb3IgY29uY3JldGUpIG9yIEphdmEgaW50ZXJmYWNlCi0gICAgaW1wbGVtZW50ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlZCBiZWFuLiAgSXQgbXVzdCBiZSBvZiB0eXBlCi0gICAgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZWZlcmVuY2VkLWJlYW4tY2xhc3MgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBhdHRyaWJ1dGUgbmFtZSB1bmRlcgotICAgIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZWQgYmVhbiBtYXkgYmUgYXNzdW1lZCB0byBiZSBzdG9yZWQsCi0gICAgaW4gb25lIG9mIHRoZSBzY29wZXMgZGVmaW5lZCBieSB0aGUgIlNjb3BlIiB0eXBlLiAgSXQgbXVzdCBiZSBvZiB0eXBlCi0gICAgIklkZW50aWZpZXIiLgotLS0+Ci08IUVMRU1FTlQgcmVmZXJlbmNlZC1iZWFuLW5hbWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlci1raXQtaWQiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIGZvciB0aGUKLSAgICBSZW5kZXJLaXQgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCAicmVuZGVyLWtpdCIgZWxlbWVudC4KLS0tPgotPCFFTEVNRU5UIHJlbmRlci1raXQtaWQgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyLWtpdC1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgUmVuZGVyS2l0IGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0LWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXJlci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHJlbmRlcmVyLWNsYXNzICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInJlbmRlci1raXQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgUmVuZGVyS2l0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgd2hlbiBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoUkVOREVSX0tJVF9GQUNUT1JZKSBpcyBjYWxsZWQuIEl0IG11c3QgYmUgCi0gICAgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHJlbmRlci1raXQtZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInJlbmRlcmVyLXR5cGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhIHJlbmRlcmVyIHR5cGUgaWRlbnRpZmllciBmb3IgdGhlCi0gICAgUmVuZGVyZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCAicmVuZGVyZXIiIGVsZW1lbnQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXJlci10eXBlICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJzbWFsbC1pY29uIiBlbGVtZW50IGNvbnRhaW5zIHRoZSByZXNvdXJjZSBwYXRoIHRvIGEgbGFyZ2UgKDE2eDE2KQotICAgIGljb24gaW1hZ2UuICBUaGUgaW1hZ2UgbWF5IGJlIGluIGVpdGhlciBHSUYgb3IgSlBHIGZvcm1hdC4KLS0tPgotPCFFTEVNRU5UIHNtYWxsLWljb24gICAgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICAgVGhlICJzdXBwb3J0ZWQtbG9jYWxlIiBlbGVtZW50IGFsbG93cyBhdXRob3JzIHRvIGRlY2xhcmUgd2hpY2gKLSAgICAgbG9jYWxlcyBhcmUgc3VwcG9ydGVkIGluIHRoaXMgYXBwbGljYXRpb24gaW5zdGFuY2UuCi0KLSAgICAgSXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgOmxhbmd1YWdlOltfOmNvdW50cnk6W186dmFyaWFudDpdXSB3aXRob3V0Ci0gICAgIHRoZSBjb2xvbnMsIGZvciBleGFtcGxlICJqYV9KUF9TSklTIi4gIFRoZSBzZXBhcmF0b3JzIGJldHdlZW4gdGhlCi0gICAgIHNlZ21lbnRzIG1heSBiZSAnLScgb3IgJ18nLgotLS0+Ci08IUVMRU1FTlQgc3VwcG9ydGVkLWxvY2FsZSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInRvLXZpZXciIGVsZW1lbnQgY29udGFpbnMgdGhlIHZpZXcgaWRlbnRpZmllciBvZiB0aGUgbmV4dCB2aWV3Ci0gICAgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGlmIHRoaXMgbmF2aWdhdGlvbiBydWxlIGlzIG1hdGNoZWQuICBJdAotICAgIG11c3QgYmUgb2YgdHlwZSAiVmlld0lkIi4KLS0tPgotPCFFTEVNRU5UIHRvLXZpZXctaWQgICAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAidmFsaWRhdG9yLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHZhbGlkYXRvci1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAidmFsaWRhdG9yLWlkIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGlkZW50aWZpZXIgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyBWYWxpZGF0b3IgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0tLT4KLTwhRUxFTUVOVCB2YWxpZGF0b3ItaWQgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbHVlIiBlbGVtZW50IGlzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBsaXRlcmFsCi0gICAgdmFsdWUgdG8gd2hpY2ggYSBzY2FsYXIgbWFuYWdlZCBwcm9wZXJ0eSB3aWxsIGJlIHNldCwgb3IgYSB2YWx1ZQotICAgIGJpbmRpbmcgZXhwcmVzc2lvbiAoIiN7Li4ufSIpIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUKLSAgICByZXF1aXJlZCB2YWx1ZS4gIEl0IHdpbGwgYmUgY29udmVydGVkIGFzIHNwZWNpZmllZCBmb3IgdGhlIGFjdHVhbAotICAgIHByb3BlcnR5IHR5cGUuCi0tLT4KLTwhRUxFTUVOVCB2YWx1ZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAidmFsdWUtY2xhc3MiIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2gKLSAgICAidmFsdWUiIGVsZW1lbnQncyB2YWx1ZSB3aWxsIGJlIGNvbnZlcnRlZCB0bywgcHJpb3IgdG8gYWRkaW5nIGl0IHRvCi0gICAgdGhlICJsaXN0LWVudHJpZXMiIGxpc3QgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0IGlzIGEKLSAgICBqYXZhLnV0aWwuTGlzdCwgb3IgYSAibWFwLWVudHJpZXMiIG1hcCBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQKLSAgICBpcyBhIGphdmEudXRpbC5NYXAuICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuICBJZiBvbWl0dGVkLAotICAgICJqYXZhLmxhbmcuU3RyaW5nIiBpcyBhc3N1bWVkLgotLS0+Ci08IUVMRU1FTlQgdmFsdWUtY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJ2YXJpYWJsZS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgVmFyaWFibGVSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZAotICAgIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb25zLgotICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHZhcmlhYmxlLXJlc29sdmVyICgjUENEQVRBKT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSWRlbnRpZmllciBBdHRyaWJ1dGVzID09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhQVRUTElTVCBhY3Rpb24tbGlzdGVuZXIgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXBwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uLWZhY3RvcnkgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlLWNsYXNzICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZS1leHRlbnNpb24gICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUtbmFtZSAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudC1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtZXh0ZW5zaW9uICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50LWZhbWlseSAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudC10eXBlICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb252ZXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyLWNsYXNzICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnZlcnRlci1mb3ItY2xhc3MgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb252ZXJ0ZXItaWQgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVmYXVsdC1sb2NhbGUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlZmF1bHQtcmVuZGVyLWtpdC1pZCAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZWZhdWx0LXZhbHVlICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWNlcy1jb25maWcgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjZXMtY29udGV4dC1mYWN0b3J5ICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWNldC1leHRlbnNpb24gICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjZXQtbmFtZSAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmcm9tLWFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZnJvbS1vdXRjb21lICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZyb20tdmlldy1pZCAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qga2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGtleS1jbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlmZWN5Y2xlICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpZmVjeWNsZS1mYWN0b3J5ICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaXN0LWVudHJpZXMgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYWxlLWNvbmZpZyAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtYmVhbiAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4tY2xhc3MgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1iZWFuLW5hbWUgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtYmVhbi1zY29wZSAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLXByb3BlcnR5ICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFwLWVudHJpZXMgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hcC1lbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXNzYWdlLWJ1bmRsZSAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbmF2aWdhdGlvbi1jYXNlICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG5hdmlnYXRpb24taGFuZGxlciAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYXZpZ2F0aW9uLXJ1bGUgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbnVsbC12YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBoYXNlLWxpc3RlbmVyICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHktY2xhc3MgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LWV4dGVuc2lvbiAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eS1uYW1lICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHktcmVzb2x2ZXIgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZGlyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWZlcmVuY2VkLWJlYW4gICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVmZXJlbmNlZC1iZWFuLWNsYXNzICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZmVyZW5jZWQtYmVhbi1uYW1lICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXIta2l0ICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdC1jbGFzcyAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlci1raXQtZmFjdG9yeSAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXIta2l0LWlkICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyLWNsYXNzICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXJlci1leHRlbnNpb24gICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyZXItdHlwZSAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzdGF0ZS1tYW5hZ2VyICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3VnZ2VzdGVkLXZhbHVlICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHN1cHBvcnRlZC1sb2NhbGUgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0by12aWV3LWlkICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsaWRhdG9yICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbGlkYXRvci1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWxpZGF0b3ItaWQgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbHVlLWNsYXNzICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YXJpYWJsZS1yZXNvbHZlciAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgdmlldy1oYW5kbGVyICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8yLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4NTdmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjA3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gIjEuMCIgZW5jb2RpbmcgPSAiVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMS4yIj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgJElkOiB3ZWItZmFjZXNjb25maWdfMV8yLnhzZCx2IDEuMSAyMDA3LzA1LzI1IDIxOjEyOjQ5IGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBDb3B5cmlnaHQgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKLSAgICAgICAgICAgIDkwMSBTYW4gQW50b25pbyBSb2FkLCAKLSAgICAgICAgICAgIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIAotICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IAotICAgICAgICAgICAgcmlnaHRzIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEphdmEgRUUsCi0gICAgICAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIDwhW0NEQVRBWwotCi0gICAgICAgICAgICBUaGUgWE1MIFNjaGVtYSBmb3IgdGhlIEphdmFTZXJ2ZXIgRmFjZXMgQXBwbGljYXRpb24KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gRmlsZSAoVmVyc2lvbiAxLjIpLgotCi0gICAgICAgICAgICBBbGwgSmF2YVNlcnZlciBGYWNlcyBjb25maWd1cmF0aW9uIGZpbGVzIG11c3QgaW5kaWNhdGUKLSAgICAgICAgICAgIHRoZSBKYXZhU2VydmVyIEZhY2VzIHNjaGVtYSBieSBpbmRpY2F0aW5nIHRoZSBKYXZhU2VydmVyCi0gICAgICAgICAgICBGYWNlcyBuYW1lc3BhY2U6Ci0KLSAgICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCi0gICAgICAgICAgICBhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gICAgICAgICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgICAgICA8ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPgotICAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgPC9mYWNlcy1jb25maWc+Ci0KLSAgICAgICAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQKLSAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIHNjaGVtYSB1c2luZyB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0gICAgICAgICAgICBmb3IgamF2YWVlIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLSAgICAgICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZAotCi0gICAgICAgICAgICBdXT4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWUgPSAiZmFjZXMtY29uZmlnIiB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiZmFjZXMtY29uZmlnIiBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaGllcmFyY2h5LCBhbmQgY29udGFpbnMgbmVzdGVkIGVsZW1lbnRzIGZvciBhbGwKLSAgICAgICAgICAgICAgICBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctY29udmVydGVyLUlELXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXIgSURzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXItaWQiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy1jb252ZXJ0ZXItZm9yLWNsYXNzLXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAnY29udmVydGVyLWZvci1jbGFzcycgZWxlbWVudCB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUKLSAgICAgICAgICAgICAgICAgICAgd2l0aGluIGEgZG9jdW1lbnQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmNvbnZlcnRlciIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmNvbnZlcnRlci1mb3ItY2xhc3MiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy12YWxpZGF0b3ItSUQtdW5pcXVlbmVzcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvciBJRHMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnZhbGlkYXRvciIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnZhbGlkYXRvci1pZCIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZmFjZXMtY29uZmlnLW1hbmFnZWQtYmVhbi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBNYW5hZ2VkIGJlYW4gbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1hbmFnZWQtYmVhbiIvPgotICAgICAgICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1hbmFnZWQtYmVhbi1uYW1lIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLSAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJmYWNlcy1jb25maWciIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBoaWVyYXJjaHksIGFuZCBjb250YWlucyBuZXN0ZWQgZWxlbWVudHMgZm9yIGFsbAotICAgICAgICAgICAgICAgIG9mIHRoZSBvdGhlciBjb25maWd1cmF0aW9uIHNldHRpbmdzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWN0b3J5VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWNvbXBvbmVudFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1jb252ZXJ0ZXJUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24tcnVsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tcnVsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZWZlcmVuY2VkLWJlYW5UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlbmRlci1raXRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbGlmZWN5Y2xlVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbGlkYXRvclR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWNlcy1jb25maWctZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZCIgdHlwZSA9ICJ4c2Q6SUQiLz4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12ZXJzaW9uVHlwZSIKLSAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgZmFjZXMtY29uZmlnLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImFwcGxpY2F0aW9uIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUKLSAgICAgICAgICAgICAgICB2YXJpb3VzIHBlci1hcHBsaWNhdGlvbi1zaW5nbGV0b24gaW1wbGVtZW50YXRpb24gYXJ0aWZhY3RzIGZvcgotICAgICAgICAgICAgICAgIGEgcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb24gdGhhdCBpcyB1dGlsaXppbmcgCi0gICAgICAgICAgICAgICAgSmF2YVNlcnZlciBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgICAgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdWl0YWJsZSBkZWZhdWx0LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGlvbi1saXN0ZW5lciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhY3Rpb24tbGlzdGVuZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIGR1cmluZyB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIHBoYXNlIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtcmVuZGVyLWtpdC1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgImRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgZWxlbWVudCBhbGxvd3MgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHRvIGRlZmluZSBhIHJlbmRlcmtpdCB0byBiZSB1c2VkIG90aGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGhlIHN0YW5kYXJkIG9uZS4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1idW5kbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJhc2UgbmFtZSBvZiBhIHJlc291cmNlIGJ1bmRsZSByZXByZXNlbnRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lc3NhZ2UgcmVzb3VyY2VzIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgU2VlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBKYXZhRG9jcyBmb3IgdGhlICJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBzeW50YXggb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgYnVuZGxlIG5hbWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24taGFuZGxlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJuYXZpZ2F0aW9uLWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIGR1cmluZyB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIHBoYXNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLCBpZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciAocHJvdmlkZWQgYnkgdGhlIEpTRiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbikgaXMgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2aWV3LWhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidmlldy1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgVmlld0hhbmRsZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFJlc3RvcmUgVmlldyBhbmQgUmVuZGVyIFJlc3BvbnNlIHBoYXNlcyBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZS4gIFRoZSBmYWNlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBkZWZhdWx0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdGUtbWFuYWdlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJzdGF0ZS1tYW5hZ2VyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgU3RhdGVNYW5hZ2VyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsLXJlc29sdmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgImVsLXJlc29sdmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LmVsLkVMUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTCBleHByZXNzaW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1yZXNvbHZlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5UmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHZhbHVlIGJpbmRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtcmVzb2x2ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ2YXJpYWJsZS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdmFsdWUgYmluZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IAotICAgICAgICAgICAgICAgIG5hbWU9ImxvY2FsZS1jb25maWciCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1sb2NhbGUtY29uZmlnVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IAotICAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlLWJ1bmRsZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uLXJlc291cmNlLWJ1bmRsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvbi1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlkIiB0eXBlID0gInhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctYXBwbGljYXRpb24tcmVzb3VyY2UtYnVuZGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICBUaGUgcmVzb3VyY2UtYnVuZGxlIGVsZW1lbnQgaW5zaWRlIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50Ci0gICAgICAgICAgICAgIHJlZmVyZW5jZXMgYSBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgaW5zdGFuY2UgYnkgbmFtZQotICAgICAgICAgICAgICB1c2luZyB0aGUgdmFyIGVsZW1lbnQuICBSZXNvdXJjZUJ1bmRsZXMgcmVmZXJlbmNlZCBpbiB0aGlzCi0gICAgICAgICAgICAgIG1hbm5lciBtYXkgYmUgcmV0dXJuZWQgYnkgYSBjYWxsIHRvCi0gICAgICAgICAgICAgIEFwcGxpY2F0aW9uLmdldFJlc291cmNlQnVuZGxlKCkgcGFzc2luZyB0aGUgY3VycmVudAotICAgICAgICAgICAgICBGYWNlc0NvbnRleHQgZm9yIHRoaXMgcmVxdWVzdCBhbmQgdGhlIHZhbHVlIG9mIHRoZSB2YXIKLSAgICAgICAgICAgICAgZWxlbWVudCBiZWxvdy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGluc3RhbmNlLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbmFtZSBieSB3aGljaCB0aGlzIFJlc291cmNlQnVuZGxlIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyByZXRyaWV2ZWQgYnkgYSBjYWxsIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbi5nZXRSZXNvdXJjZUJ1bmRsZSgpLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgYXBwbGljYXRpb24uICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctZmFjdG9yeVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImZhY3RvcnkiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gZGVmaW5lIHRoZSAKLSAgICAgICAgICAgICAgICB2YXJpb3VzIEZhY3RvcmllcyB0aGF0IGNvbXByaXNlIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiAKLSAgICAgICAgICAgICAgICBvZiBKYXZhU2VydmVyIEZhY2VzLiAgRm9yIG5lc3RlZCBlbGVtZW50cyB0aGF0IGFyZSBub3QgCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGUgSlNGIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIHN1aXRhYmxlIAotICAgICAgICAgICAgICAgIGRlZmF1bHQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImFwcGxpY2F0aW9uLWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25GYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCB3aGVuIAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEFQUExJQ0FUSU9OX0ZBQ1RPUlkpIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXMtY29udGV4dC1mYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZmFjZXMtY29udGV4dC1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWNlc0NvbnRleHRGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkIHdoZW4gCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRkFDRVNfQ09OVEVYVF9GQUNUT1JZKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibGlmZWN5Y2xlLWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgTGlmZWN5Y2xlRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoTElGRUNZQ0xFX0ZBQ1RPUlkpIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlbmRlci1raXQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSBSZW5kZXJLaXRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShSRU5ERVJfS0lUX0ZBQ1RPUlkpIGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjdG9yeS1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWN0b3J5LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZCIgdHlwZSA9ICJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctZmFjdG9yeS1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGZhY3RvcnkuICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWF0dHJpYnV0ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImF0dHJpYnV0ZSIgZWxlbWVudCByZXByZXNlbnRzIGEgbmFtZWQsIHR5cGVkLCB2YWx1ZQotICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50IFVJQ29tcG9uZW50IHZpYSB0aGUgZ2VuZXJpYwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgbWVjaGFuaXNtLgotCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlIG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHBhcmVudAotICAgICAgICAgICAgICAgIChvciByZWxhdGVkKSBjb21wb25lbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImF0dHJpYnV0ZS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGljaCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSB3aWxsIGJlIHN0b3JlZCwgaW4gdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyBhdHRyaWJ1dGVzIG9mIHRoZSBVSUNvbXBvbmVudCB3ZSBhcmUgcmVsYXRlZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhdHRyaWJ1dGUtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXR0cmlidXRlIG5hbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZGVmYXVsdC12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3VnZ2VzdGVkLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctc3VnZ2VzdGVkLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlkIiB0eXBlID0gInhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1hdHRyaWJ1dGUtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBhdHRyaWJ1dGUuICBJdCBtYXkgY29udGFpbiAKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctY29tcG9uZW50VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiY29tcG9uZW50IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBVSUNvbXBvbmVudAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIHR5cGUgaWRlbnRpZmllciwgYWxvbmcgd2l0aCBpdHMgYXNzb2NpYXRlZCAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzLiAgQ29tcG9uZW50IHR5cGVzIG11c3QgYmUgdW5pcXVlIAotICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdCAKLSAgICAgICAgICAgICAgICBhcmUgcmVjb2duaXplZCBieSB0aGUgaW1wbGVtZW50YXRpb24gbG9naWMgb2YgdGhpcyBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgCi0gICAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBjbGFzcyB0aGF0IG1heSBiZSBleHBvc2VkIGZvciBtYW5pcHVsYXRpb24gCi0gICAgICAgICAgICAgICAgdmlhIHRvb2xzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb21wb25lbnQtdHlwZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBuYW1lIHVuZGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgY2xhc3Mgc2hvdWxkIGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29tcG9uZW50LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjb25jcmV0ZSBVSUNvbXBvbmVudCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWNldFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctY29tcG9uZW50LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1jb21wb25lbnQtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgY29tcG9uZW50LiAgSXQgbWF5IGNvbnRhaW4gCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1kZWZhdWx0LWxvY2FsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImRlZmF1bHQtbG9jYWxlIiBlbGVtZW50IGRlY2xhcmVzIHRoZSBkZWZhdWx0IGxvY2FsZSAKLSAgICAgICAgICAgICAgICBmb3IgdGhpcyBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KLQotICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgc3BlY2lmaWVkIGFzIDpsYW5ndWFnZTpbXzpjb3VudHJ5OltfOnZhcmlhbnQ6XV0KLSAgICAgICAgICAgICAgICB3aXRob3V0IHRoZSBjb2xvbnMsIGZvciBleGFtcGxlICJqYV9KUF9TSklTIi4gIFRoZQotICAgICAgICAgICAgICAgIHNlcGFyYXRvcnMgYmV0d2VlbiB0aGUgc2VnbWVudHMgbWF5IGJlICctJyBvciAnXycuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpmYWNlcy1jb25maWctbG9jYWxlVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZGVmYXVsdC12YWx1ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImRlZmF1bHQtdmFsdWUiIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG9yCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlIGluIHdoaWNoIHRoaXMgZWxlbWVudCByZXNpZGVzLiAgVGhpcyB2YWx1ZSBkaWZmZXJzCi0gICAgICAgICAgICAgICAgZnJvbSB0aGUgInN1Z2dlc3RlZC12YWx1ZSIgaW4gdGhhdCB0aGUgcHJvcGVydHkgb3IgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgbXVzdCB0YWtlIHRoZSB2YWx1ZSwgd2hlcmVhcyBpbiAic3VnZ2VzdGVkLXZhbHVlIiB0YWtpbmcgdGhlCi0gICAgICAgICAgICAgICAgdmFsdWUgaXMgb3B0aW9uYWwuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1lbC1leHByZXNzaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEVMIGV4cHJlc3Npb25zIHByZXNlbnQgd2l0aGluIGEgZmFjZXMgY29uZmlnIGZpbGUKLSAgICAgICAgICAgICAgICBtdXN0IHN0YXJ0IHdpdGggdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBvZiAnI3snIGFuZAotICAgICAgICAgICAgICAgIGVuZCB3aXRoICd9Jy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iI1x7LipcfSIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZmFjZXRUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIGFuZCBvdGhlciBkZXNpZ24tdGltZSBpbmZvcm1hdGlvbiBmb3IgYSBmYWNldAotICAgICAgICAgICAgICAgIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcmVuZGVyZXIgb3IgYSBjb21wb25lbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2V0LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImZhY2V0LW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZmFjZXQgbmFtZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIHdoaWNoIGEgVUlDb21wb25lbnQgd2lsbCBiZSBhZGRlZCB0byBpdHMgcGFyZW50LiAgCi0gICAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIklkZW50aWZpZXIiLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjZXQtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWZhY2V0LWV4dGVuc2lvblR5cGUiPgotICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGZhY2V0LiAgSXQgbWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZnJvbS12aWV3LWlkVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiBmcm9tLXZpZXctaWQgbXVzdCBjb250YWluIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICAgICAgICAgICAgICAgIHZhbHVlczoKLQotICAgICAgICAgICAgICAgICAgLSBUaGUgZXhhY3QgbWF0Y2ggZm9yIGEgdmlldyBpZGVudGlmaWVyIHRoYXQgaXMgcmVjb2duaXplZAotICAgICAgICAgICAgICAgICAgICBieSB0aGUgdGhlIFZpZXdIYW5kbGVyIGltcGxlbWVudGF0aW9uIGJlaW5nIHVzZWQgKHN1Y2ggYXMKLSAgICAgICAgICAgICAgICAgICAgIi9pbmRleC5qc3AiIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgVmlld0hhbmRsZXIpLgotCi0gICAgICAgICAgICAgICAgICAtIEEgcHJvcGVyIHByZWZpeCBvZiBhIHZpZXcgaWRlbnRpZmllciwgcGx1cyBhIHRyYWlsaW5nIAotICAgICAgICAgICAgICAgICAgICAiKiIgY2hhcmFjdGVyLiAgVGhpcyBwYXR0ZXJuIGluZGljYXRlcyB0aGF0IGFsbCB2aWV3IAotICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVycyB0aGF0IG1hdGNoIHRoZSBwb3J0aW9uIG9mIHRoZSBwYXR0ZXJuIHVwIHRvIAotICAgICAgICAgICAgICAgICAgICB0aGUgYXN0ZXJpc2sgd2lsbCBtYXRjaCB0aGUgc3Vycm91bmRpbmcgcnVsZS4gIFdoZW4gbW9yZSAKLSAgICAgICAgICAgICAgICAgICAgdGhhbiBvbmUgbWF0Y2ggZXhpc3RzLCB0aGUgbWF0Y2ggd2l0aCB0aGUgbG9uZ2VzdCBwYXR0ZXJuIAotICAgICAgICAgICAgICAgICAgICBpcyBzZWxlY3RlZC4KLQotICAgICAgICAgICAgICAgICAgLSBBbiAiKiIgY2hhcmFjdGVyLCB3aGljaCBtZWFucyB0aGF0IHRoaXMgcGF0dGVybiBhcHBsaWVzIAotICAgICAgICAgICAgICAgICAgICB0byBhbGwgdmlldyBpZGVudGlmaWVycy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1mcm9tLWFjdGlvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImZyb20tYWN0aW9uIiBlbGVtZW50IGNvbnRhaW5zIGFuIGFjdGlvbiByZWZlcmVuY2UgCi0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiB0aGF0IG11c3QgaGF2ZSBiZWVuIGV4ZWN1dGVkIChieSB0aGUgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICBBY3Rpb25MaXN0ZW5lciBmb3IgaGFuZGxpbmcgYXBwbGljYXRpb24gbGV2ZWwgZXZlbnRzKSAKLSAgICAgICAgICAgICAgICBpbiBvcmRlciB0byBzZWxlY3QgdGhlIG5hdmlnYXRpb24gcnVsZS4gIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAgICAgIHRoaXMgcnVsZSB3aWxsIGJlIHJlbGV2YW50IG5vIG1hdHRlciB3aGljaCBhY3Rpb24gcmVmZXJlbmNlIAotICAgICAgICAgICAgICAgIHdhcyBleGVjdXRlZCAob3IgaWYgbm8gYWN0aW9uIHJlZmVyZW5jZSB3YXMgZXhlY3V0ZWQpLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWVsLWV4cHJlc3Npb25UeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1jb252ZXJ0ZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIENvbnZlcnRlcgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIGNvbnZlcnRlciBpZGVudGlmaWVyLiAgQ29udmVydGVyIGlkZW50aWZpZXJzIG11c3QgCi0gICAgICAgICAgICAgICAgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdAotICAgICAgICAgICAgICAgIG1heSBiZSBjb25maWd1cmVkIG9uIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIAotICAgICAgICAgICAgICAgIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICBOZXN0ZWQgInByb3BlcnR5IgotICAgICAgICAgICAgICAgIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIHRoZSBDb252ZXJ0ZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IG1heSBiZSBjb25maWd1cmVkIHRvIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24gb2YgdGhlIENvbnZlcnRlci4gICJhdHRyaWJ1dGUiIGFuZCAicHJvcGVydHkiIAotICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBhbGxvdyBjb21wb25lbnQgZGV2ZWxvcGVycyB0byAKLSAgICAgICAgICAgICAgICBtb3JlIGNvbXBsZXRlbHkgZGVzY3JpYmUgdGhlaXIgY29tcG9uZW50cyB0byB0b29scyBhbmQgdXNlcnMuCi0gICAgICAgICAgICAgICAgVGhlc2UgZWxlbWVudHMgaGF2ZSBubyByZXF1aXJlZCBydW50aW1lIHNlbWFudGljcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXItaWQiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXIgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWZvci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgImNvbnZlcnRlci1mb3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHdoaWNoIGEgQ29udmVydGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHdpbGwgYmUgcmVnaXN0ZXJlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgQ29udmVydGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyB0aGF0IG1heSBiZSBjb25maWd1cmVkIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIHRvIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICBUaGlzIGF0dHJpYnV0ZSBpcwotICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJpbHkgZm9yIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHRvIGhhdmUgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgdGhlIENvbnZlcnRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1heSBiZSBjb25maWd1cmVkIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBDb252ZXJ0ZXIuICBUaGlzIGF0dHJpYnV0ZSBpcyBwcmltYXJpbHkgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1jb252ZXJ0ZXItZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctY29udmVydGVyLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgY29udmVydGVyLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWxpZmVjeWNsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJsaWZlY3ljbGUiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gc3BlY2lmeQotICAgICAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGJlaGF2aW91ciBvZiB0aGUgZGVmYXVsdCBMaWZlY3ljbGUKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGhhc2UtbGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwaGFzZS1saXN0ZW5lciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgUGhhc2VMaXN0ZW5lciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkIG9uIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIExpZmVjeWNsZS4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxpZmVjeWNsZS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctbGlmZWN5Y2xlLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgbGlmZWN5Y2xlLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctbG9jYWxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSBsb2NhbGVUeXBlIGRlZmluZXMgdmFsaWQgbG9jYWxlIGRlZmluZWQgYnkgSVNPLTYzOS0xCi0gICAgICAgICAgICAgICAgYW5kIElTTy0zMTY2LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlthLXpdezJ9KF98LSk/KFtccHtMfVwtXHB7TmR9XXsyfSk/Ii8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbG9jYWxlLWNvbmZpZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImxvY2FsZS1jb25maWciIGVsZW1lbnQgYWxsb3dzIHRoZSBhcHAgZGV2ZWxvcGVyIHRvIAotICAgICAgICAgICAgICAgIGRlY2xhcmUgdGhlwqBzdXBwb3J0ZWQgbG9jYWxlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1sb2NhbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1kZWZhdWx0LWxvY2FsZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3VwcG9ydGVkLWxvY2FsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXN1cHBvcnRlZC1sb2NhbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW5UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1iZWFuIiBlbGVtZW50IHJlcHJlc2VudHMgYSBKYXZhQmVhbiwgb2YgYSAKLSAgICAgICAgICAgICAgICBwYXJ0aWN1bGFyIGNsYXNzLCB0aGF0IHdpbGwgYmUgZHluYW1pY2FsbHkgaW5zdGFudGlhdGVkIAotICAgICAgICAgICAgICAgIGF0IHJ1bnRpbWUgKGJ5IHRoZSBkZWZhdWx0IFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24pIAotICAgICAgICAgICAgICAgIGlmIGl0IGlzIHJlZmVyZW5jZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSB2YWx1ZSBiaW5kaW5nIAotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24sIGFuZCBubyBjb3JyZXNwb25kaW5nIGJlYW4gY2FuIGJlIGlkZW50aWZpZWQgaW4gCi0gICAgICAgICAgICAgICAgYW55IHNjb3BlLiAgSW4gYWRkaXRpb24gdG8gdGhlIGNyZWF0aW9uIG9mIHRoZSBtYW5hZ2VkIGJlYW4sIAotICAgICAgICAgICAgICAgIGFuZCB0aGUgb3B0aW9uYWwgc3RvcmluZyBvZiBpdCBpbnRvIHRoZSBzcGVjaWZpZWQgc2NvcGUsIAotICAgICAgICAgICAgICAgIHRoZSBuZXN0ZWQgbWFuYWdlZC1wcm9wZXJ0eSBlbGVtZW50cyBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgICAgICAgICBpbml0aWFsaXplIHRoZSBjb250ZW50cyBvZiBzZXR0YWJsZSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiAKLSAgICAgICAgICAgICAgICB0aGUgY3JlYXRlZCBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJtYW5hZ2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHVuZGVyIHdoaWNoIGEgbWFuYWdlZCBiZWFuIHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICBiZSBzZWFyY2hlZCBmb3IsIGFzIHdlbGwgYXMgc3RvcmVkICh1bmxlc3MgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgIm1hbmFnZWQtYmVhbi1zY29wZSIgdmFsdWUgaXMgIm5vbmUiKS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1iZWFuLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IHdpbGwgYmUgCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkYHRvIGluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlIGlmIGNyZWF0aW9uIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZGBtYW5hZ2VkIGJlYW4gaXMgcmVxdWVzdGVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3BlY2lmaWVkIGNsYXNzIG11c3QgY29uZm9ybSB0byBzdGFuZGFyZCBKYXZhQmVhbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlbnRpb25zLiAgSW4gcGFydGljdWxhciwgaXQgbXVzdCBoYXZlIGEgcHVibGljCi0gICAgICAgICAgICAgICAgICAgICAgICB6ZXJvLWFyZ3VtZW50cyBjb25zdHJ1Y3RvciwgYW5kIHplcm8gb3IgbW9yZSBwdWJsaWMKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IHNldHRlcnMuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJtYW5hZ2VkLWJlYW4tc2NvcGUiCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tc2NvcGVPck5vbmVUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJtYW5hZ2VkLWJlYW4tc2NvcGUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgc2NvcGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHdoaWNoIGEgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIAotICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlZCBiZWFuIHdpbGwgYmUgc3RvcmVkICh1bmxlc3MgdGhlIHZhbHVlIGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgIm5vbmUiKS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtcHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFuYWdlZC1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWVudHJpZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFwLWVudHJpZXNUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3QtZW50cmllcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1saXN0LWVudHJpZXNUeXBlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hbmFnZWQtYmVhbi1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBtYW5hZ2VkLWJlYW4uICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tc2NvcGVPck5vbmVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgbGVnYWwgdmFsdWVzIGZvciB0aGUgPG1hbmFnZWQtYmVhbi1zY29wZT4KLSAgICAgICAgICAgICAgICBlbGVtZW50J3MgYm9keSBjb250ZW50LCB3aGljaCBpbmNsdWRlcyBhbGwgb2YgdGhlIHNjb3BlcwotICAgICAgICAgICAgICAgIG5vcm1hbGx5IHVzZWQgaW4gYSB3ZWIgYXBwbGljYXRpb24sIHBsdXMgdGhlICJub25lIiB2YWx1ZQotICAgICAgICAgICAgICAgIGluZGljYXRpbmcgdGhhdCBhIGNyZWF0ZWQgYmVhbiBzaG91bGQgbm90IGJlIHN0b3JlZCBpbnRvCi0gICAgICAgICAgICAgICAgYW55IHNjb3BlLgotICAgICAgICAgICAgICAgIF1dPgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVxdWVzdCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNlc3Npb24iLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhcHBsaWNhdGlvbiIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiLz4KLSAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFuYWdlZC1wcm9wZXJ0eVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJtYW5hZ2VkLXByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBvZiBhIG1hbmFnZWQgYmVhbiB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCB0byB0aGUgCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIHZhbHVlIChvciB2YWx1ZSBzZXQpIGlmIHRoZSBjb3JyZXNwb25kaW5nIAotICAgICAgICAgICAgICAgIG1hbmFnZWQgYmVhbiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmFCZWFucyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IG5hbWUgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgbWF5IAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgc3RvcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInByb3BlcnR5LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9wZXJ0eSBuYW1lLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSBleGlzdGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM7IGhvd2V2ZXIsIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBnb2luZyB0byBiZSB0aGUgc291cmNlIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGdlbmVyYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1lbnRyaWVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hcC1lbnRyaWVzVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW51bGwtdmFsdWVUeXBlIj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdC1lbnRyaWVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxpc3QtZW50cmllc1R5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW1hcC1lbnRyeVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJtYXAtZW50cnkiIGVsZW1lbnQgcmVwcnNlbnRzIGEgc2luZ2xlIGtleS1lbnRyeSBwYWlyIAotICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYSBtYW5hZ2VkIAotICAgICAgICAgICAgICAgIHByb3BlcnR5IG9mIHR5cGUgamF2YS51dGlsLk1hcC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImtleSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXAga2V5IHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gYSBtYW5hZ2VkIHByb3BlcnR5IG9mIAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBqYXZhLnV0aWwuTWFwLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1udWxsLXZhbHVlVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW1hcC1lbnRyaWVzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm1hcC1lbnRyaWVzJyBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2Yga2V5LWVudHJ5IHBhaXJzIAotICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYSBtYW5hZ2VkIHByb3BlcnR5IAotICAgICAgICAgICAgICAgIG9mIHR5cGUgamF2YS51dGlsLk1hcC4gIEluIGFkZGl0aW9uLCB0aGUgSmF2YSBjbGFzcyB0eXBlcyAKLSAgICAgICAgICAgICAgICBvZiB0aGUga2V5IGFuZCBlbnRyeSB2YWx1ZXMgbWF5IGJlIG9wdGlvbmFsbHkgZGVjbGFyZWQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAia2V5LWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggImtleSIgZWxlbWVudCBpbiBhIHNldCBvZiAibWFwLWVudHJ5IiBlbGVtZW50cyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgY29udmVydGVkIHRvLiAgSWYgb21pdHRlZCwgImphdmEubGFuZy5TdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgaXMgYXNzdW1lZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsdWUtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAtZW50cnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYXAtZW50cnlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbmF2aWdhdGlvbi1jYXNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm5hdmlnYXRpb24tY2FzZSIgZWxlbWVudCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIAotICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIGNvbmRpdGlvbnMgdGhhdCBtdXN0IG1hdGNoIGZvciB0aGlzIGNhc2UgdG8gCi0gICAgICAgICAgICAgICAgYmUgZXhlY3V0ZWQsIGFuZCB0aGUgdmlldyBpZCBvZiB0aGUgY29tcG9uZW50IHRyZWUgdGhhdCAKLSAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2VsZWN0ZWQgbmV4dC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmcm9tLWFjdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZyb20tYWN0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmcm9tLW91dGNvbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJmcm9tLW91dGNvbWUiIGVsZW1lbnQgY29udGFpbnMgYSBsb2dpY2FsIG91dGNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZXhlY3V0aW9uIG9mIGFuIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gbWV0aG9kIHNlbGVjdGVkIHZpYSBhbiAiYWN0aW9uUmVmIiBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAgICAgKG9yIGEgbGl0ZXJhbCB2YWx1ZSBzcGVjaWZpZWQgYnkgYW4gImFjdGlvbiIgcHJvcGVydHkpCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiBhIFVJQ29tbWFuZCBjb21wb25lbnQuICBJZiBzcGVjaWZpZWQsIHRoaXMgcnVsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcmVsZXZhbnQgb25seSBpZiB0aGUgb3V0Y29tZSB2YWx1ZSBtYXRjaGVzIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlbGVtZW50J3MgdmFsdWUuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJlbGV2YW50IG5vIG1hdHRlciB3aGF0IHRoZSBvdXRjb21lIHZhbHVlIHdhcy4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvLXZpZXctaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidG8tdmlldy1pZCIgZWxlbWVudCBjb250YWlucyB0aGUgdmlldyBpZGVudGlmaWVyIAotICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG5leHQgdmlldyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaWYgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbiBydWxlIGlzIG1hdGNoZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJyZWRpcmVjdCIKLSAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlZGlyZWN0VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1uYXZpZ2F0aW9uLXJ1bGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJuYXZpZ2F0aW9uLXJ1bGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIAotICAgICAgICAgICAgICAgIGRlY2lzaW9uIHJ1bGUgdGhhdCB3aWxsIGJlIHV0aWxpemVkIGJ5IHRoZSBkZWZhdWx0IAotICAgICAgICAgICAgICAgIE5hdmlnYXRpb25IYW5kbGVyIGltcGxlbWVudGF0aW9uIHRvIG1ha2UgZGVjaXNpb25zIG9uIAotICAgICAgICAgICAgICAgIHdoYXQgdmlldyBzaG91bGQgYmUgZGlzcGxheWVkIG5leHQsIGJhc2VkIG9uIHRoZSAKLSAgICAgICAgICAgICAgICB2aWV3IGlkIGJlaW5nIHByb2Nlc3NlZC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZyb20tdmlldy1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZyb20tdmlldy1pZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF2aWdhdGlvbi1jYXNlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbmF2aWdhdGlvbi1jYXNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJuYXZpZ2F0aW9uLXJ1bGUtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbmF2aWdhdGlvbi1ydWxlLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tcnVsZS1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIG5hdmlnYXRpb24tcnVsZS4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbnVsbC12YWx1ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgIm51bGwtdmFsdWUiIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhlIG1hbmFnZWQKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBpbiB3aGljaCB3ZSBhcmUgbmVzdGVkIHdpbGwgYmUgZXhwbGljaXRseQotICAgICAgICAgICAgICAgIHNldCB0byBudWxsIGlmIG91ciBtYW5hZ2VkIGJlYW4gaXMgYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgIGNyZWF0ZWQuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIG9taXR0aW5nIHRoZSBtYW5hZ2VkCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgZWxlbWVudCBlbnRpcmVseSwgd2hpY2ggd2lsbCBjYXVzZSBubwotICAgICAgICAgICAgICAgIHByb3BlcnR5IHNldHRlciB0byBiZSBjYWxsZWQgZm9yIHRoaXMgcHJvcGVydHkuCi0KLSAgICAgICAgICAgICAgICBUaGUgIm51bGwtdmFsdWUiIGVsZW1lbnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZQotICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgInByb3BlcnR5LWNsYXNzIiBpZGVudGlmaWVzIGEgSmF2YSBjbGFzcywKLSAgICAgICAgICAgICAgICBub3QgYSBKYXZhIHByaW1pdGl2ZS4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXByb3BlcnR5VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgInByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYSBKYXZhQmVhbiBwcm9wZXJ0eSBvZiB0aGUgCi0gICAgICAgICAgICAgICAgSmF2YSBjbGFzcyByZXByZXNlbnRlZCBieSBvdXIgcGFyZW50IGVsZW1lbnQuCi0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBKYXZhIAotICAgICAgICAgICAgICAgIGNsYXNzIHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBlbGVtZW50LCBhbmQgbXVzdCAKLSAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIHByb3BlcnR5IG5hbWVzIHRoYXQgd2lsbCBiZSByZWNvZ25pemVkIHdoZW4gCi0gICAgICAgICAgICAgICAgcGVyZm9ybWluZyBpbnRyb3NwZWN0aW9uIGFnYWluc3QgdGhhdCBjbGFzcyB2aWEgCi0gICAgICAgICAgICAgICAgamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmFCZWFucyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IG5hbWUgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgc3RvcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmphdmEtdHlwZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInByb3BlcnR5LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9wZXJ0eSBuYW1lLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSBleGlzdGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM7IGhvd2V2ZXIsIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIGlmIAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBnb2luZyB0byBiZSB0aGUgc291cmNlIGZvciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1kZWZhdWx0LXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdWdnZXN0ZWQtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1zdWdnZXN0ZWQtdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXByb3BlcnR5LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1wcm9wZXJ0eS1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHByb3BlcnR5LiAgSXQgbWF5IGNvbnRhaW4gCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlZGlyZWN0VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUaGUgInJlZGlyZWN0IiBlbGVtZW50IGluZGljYXRlcyB0aGF0IG5hdmlnYXRpb24gdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCAidG8tdmlldy1pZCIgc2hvdWxkIGJlIGFjY29tcGxpc2hlZCBieSAKLSAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWluZyBhbiBIVFRQIHJlZGlyZWN0IHJhdGhlciB0aGFuIHRoZSB1c3VhbCAKLSAgICAgICAgICAgICAgICAgICAgVmlld0hhbmRsZXIgbWVjaGFuaXNtcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVmZXJlbmNlZC1iZWFuVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgInJlZmVyZW5jZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGF0IGRlc2lnbiB0aW1lIHRoZSAKLSAgICAgICAgICAgICAgICBwcm9taXNlIHRoYXQgYSBKYXZhIG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2lsbCBleGlzdCBhdCAKLSAgICAgICAgICAgICAgICBydW50aW1lIGluIHNvbWUgc2NvcGUsIHVuZGVyIHRoZSBzcGVjaWZpZWQga2V5LiAgVGhpcyBjYW4gYmUgCi0gICAgICAgICAgICAgICAgdXNlZCBieSBkZXNpZ24gdGltZSB0b29scyB0byBjb25zdHJ1Y3QgdXNlciBpbnRlcmZhY2UgZGlhbG9ncyAKLSAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHByZXNlbmNlIAotICAgICAgICAgICAgICAgIG9yIGFic2VuY2Ugb2YgYSByZWZlcmVuY2VkIGJlYW4gZWxlbWVudCBoYXMgbm8gaW1wYWN0IG9uIHRoZSAKLSAgICAgICAgICAgICAgICBKYXZhU2VydmVyIEZhY2VzIHJ1bnRpbWUgZW52aXJvbm1lbnQgaW5zaWRlIGEgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbi1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZCBiZWFuIG1heSBiZSBhc3N1bWVkIHRvIGJlIHN0b3JlZCwgaW4gb25lIAotICAgICAgICAgICAgICAgICAgICAgICAgb2YgJ3JlcXVlc3QnLCAnc2Vzc2lvbicsIG9yICdhcHBsaWNhdGlvbicgc2NvcGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyAKLSAgICAgICAgICAgICAgICAgICAgICAgIChlaXRoZXIgYWJzdHJhY3Qgb3IgY29uY3JldGUpIG9yIEphdmEgaW50ZXJmYWNlIAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlZCBiZWFuLiAKLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyLWtpdFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJyZW5kZXIta2l0IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBSZW5kZXJLaXQgCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIAotICAgICAgICAgICAgICAgIHJlbmRlci1raXQtaWQuICBJZiBubyByZW5kZXIta2l0LWlkIGlzIHNwZWNpZmllZCwgdGhlIAotICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgb2YgdGhlIGRlZmF1bHQgUmVuZGVyS2l0IAotICAgICAgICAgICAgICAgIChSZW5kZXJLaXRGYWN0b3J5LkRFRkFVTFRfUkVOREVSX0tJVCkgaXMgYXNzdW1lZC4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIAotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyLWtpdC1pZCIgZWxlbWVudCByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIFJlbmRlcktpdCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IAotICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlci1raXQiIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyLWtpdC1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgUmVuZGVyS2l0IAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlbmRlcmVyVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZW5kZXIta2l0LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZW5kZXJlclR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJyZW5kZXJlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyZXIgCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIGNvbXBvbmVudCBmYW1pbHkgYW5kIHJlbmRlcmVyIHR5cGUgaWRlbnRpZmllcnMsIAotICAgICAgICAgICAgICAgIGluIHRoZSBSZW5kZXJLaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQgInJlbmRlci1raXQiIAotICAgICAgICAgICAgICAgIGVsZW1lbnQuICBDb21iaW5hdGlvbnMgb2YgY29tcG9uZW50IGZhbWlseSBhbmQgCi0gICAgICAgICAgICAgICAgcmVuZGVyZXIgdHlwZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIFJlbmRlcktpdCAKLSAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmVudCAicmVuZGVyLWtpdCIgZWxlbWVudC4KLQotICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGNvbXBvbmVudCAKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlY29nbml6ZWQgYnkgdGhpcyByZW5kZXJlci4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIAotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWZhbWlseSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb21wb25lbnQtZmFtaWx5IiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGZhbWlseSBmb3Igd2hpY2ggdGhlIFJlbmRlcmVyIHJlcHJlc2VudGVkIAotICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHBhcmVudCAicmVuZGVyZXIiIGVsZW1lbnQgd2lsbCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci10eXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlbmRlcmVyLXR5cGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhIHJlbmRlcmVyIHR5cGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIGZvciB0aGUgUmVuZGVyZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZW5kZXJlciIgZWxlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlcmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZW5kZXJlci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjb25jcmV0ZSBSZW5kZXJlcgotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZhY2V0VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlcmVyLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXJlbmRlcmVyLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZW5kZXJlci1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHJlbmRlcmVyLiAgSXQgbWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgICBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyLWtpdC1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHJlbmRlci1raXQuICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXN1Z2dlc3RlZC12YWx1ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgInN1Z2dlc3RlZC12YWx1ZSIgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgb3IKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgaW4gd2hpY2ggdGhpcyBlbGVtZW50IHJlc2lkZXMuICBUaGlzIHZhbHVlIGlzIAotICAgICAgICAgICAgICAgIGFkdmlzb3J5IG9ubHkgYW5kIGlzIGludGVuZGVkIGZvciB0b29scyB0byB1c2Ugd2hlbiAKLSAgICAgICAgICAgICAgICBwb3B1bGF0aW5nIHBhbGxldHRlcy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1zdXBwb3J0ZWQtbG9jYWxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAic3VwcG9ydGVkLWxvY2FsZSIgZWxlbWVudCBhbGxvd3MgYXV0aG9ycyB0byBkZWNsYXJlCi0gICAgICAgICAgICAgICAgd2hpY2ggbG9jYWxlcyBhcmUgc3VwcG9ydGVkIGluIHRoaXMgYXBwbGljYXRpb24gaW5zdGFuY2UuCi0KLSAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIHNwZWNpZmllZCBhcyA6bGFuZ3VhZ2U6W186Y291bnRyeTpbXzp2YXJpYW50Ol1dCi0gICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgY29sb25zLCBmb3IgZXhhbXBsZSAiamFfSlBfU0pJUyIuICBUaGUKLSAgICAgICAgICAgICAgICBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIHNlZ21lbnRzIG1heSBiZSAnLScgb3IgJ18nLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxvY2FsZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4gCi0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy12YWxpZGF0b3JUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJ2YWxpZGF0b3IiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFZhbGlkYXRvcgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIHZhbGlkYXRvciBpZGVudGlmaWVyLiAgVmFsaWRhdG9yIGlkZW50aWZpZXJzIG11c3QgCi0gICAgICAgICAgICAgICAgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdCAKLSAgICAgICAgICAgICAgICBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciAKLSAgICAgICAgICAgICAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLiAgTmVzdGVkICJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgVmFsaWRhdG9yCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBWYWxpZGF0b3IuICAiYXR0cmlidXRlIiBhbmQgInByb3BlcnR5IiAKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYWxsb3cgY29tcG9uZW50IGRldmVsb3BlcnMgdG8gCi0gICAgICAgICAgICAgICAgbW9yZSBjb21wbGV0ZWx5IGRlc2NyaWJlIHRoZWlyIGNvbXBvbmVudHMgdG8gdG9vbHMgYW5kIHVzZXJzLgotICAgICAgICAgICAgICAgIFRoZXNlIGVsZW1lbnRzIGhhdmUgbm8gcmVxdWlyZWQgcnVudGltZSBzZW1hbnRpY3MuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidmFsaWRhdG9yLWlkIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGlkZW50aWZpZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyBWYWxpZGF0b3IgY2xhc3Mgc2hvdWxkIAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVnaXN0ZXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInZhbGlkYXRvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgVmFsaWRhdG9yIAotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWF0dHJpYnV0ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyB0aGF0IG1heSBiZSBjb25maWd1cmVkIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIHRvIGFmZmVjdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBWYWxpZGF0b3IuICBUaGlzIGF0dHJpYnV0ZSBpcwotICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJpbHkgZm9yIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHRvIGhhdmUgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgdGhlIFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1heSBiZSBjb25maWd1cmVkIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBWYWxpZGF0b3IuICBUaGlzIGF0dHJpYnV0ZSBpcyBwcmltYXJpbHkgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbi10aW1lIHRvb2xzIGFuZCBpcyBub3Qgc3BlY2lmaWVkIHRvIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgYW55IG1lYW5pbmcgYXQgcnVudGltZS4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWxpZGF0b3ItZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctdmFsaWRhdG9yLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgdmFsaWRhdG9yLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgInZhbHVlIiBlbGVtZW50IGlzIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YKLSAgICAgICAgICAgICAgICBhIGxpdGVyYWwgdmFsdWUgdG8gd2hpY2ggYSBzY2FsYXIgbWFuYWdlZCBwcm9wZXJ0eQotICAgICAgICAgICAgICAgIHdpbGwgYmUgc2V0LCBvciBhIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbiAoIiN7Li4ufSIpCi0gICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSByZXF1aXJlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgICBJdCB3aWxsIGJlIGNvbnZlcnRlZCBhcyBzcGVjaWZpZWQgZm9yIHRoZSBhY3R1YWwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSB0eXBlLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnVuaW9uIAotICAgICAgICAgICAgbWVtYmVyVHlwZXM9ImphdmFlZTpmYWNlcy1jb25maWctZWwtZXhwcmVzc2lvblR5cGUgeHNkOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXZhbHVlLWNsYXNzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoCi0gICAgICAgICAgICAgICAgInZhbHVlIiBlbGVtZW50J3MgdmFsdWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8sIHByaW9yIHRvIGFkZGluZyAKLSAgICAgICAgICAgICAgICBpdCB0byB0aGUgImxpc3QtZW50cmllcyIgbGlzdCBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQgaXMgCi0gICAgICAgICAgICAgICAgYSBqYXZhLnV0aWwuTGlzdCwgb3IgYSAibWFwLWVudHJpZXMiIG1hcCBmb3IgYSBtYW5hZ2VkIAotICAgICAgICAgICAgICAgIHByb3BlcnR5IHRoYXQgaXMgYSBqYXZhLnV0aWwuTWFwLiAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1saXN0LWVudHJpZXNUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibGlzdC1lbnRyaWVzIiBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2YgaW5pdGlhbGl6YXRpb24KLSAgICAgICAgICAgICAgICBlbGVtZW50cyBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQgaXMgYSBqYXZhLnV0aWwuTGlzdCBvciBhbgotICAgICAgICAgICAgICAgIGFycmF5LiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGNhbiAKLSAgICAgICAgICAgICAgICBvcHRpb25hbGx5IGJlIHVzZWQgdG8gZGVjbGFyZSB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2ggCi0gICAgICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBDb2xsZWN0aW9uLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbHVlLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW51bGwtdmFsdWVUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbHVlVHlwZSIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy12ZXJzaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgotICAgICAgICAgICAgICAgIGZhY2VzLWNvbmZpZyBzdXBwb3J0ZWQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEuMiIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzhlODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENBICA5NDMwMywgVS5TLkEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIAotVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCi1yZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgotb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuICAKLQotVGhpcmQgcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZCAKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4gCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBMb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsIGFuZCBFbnRlcnByaXNlIEphdmFCZWFucywgCi1hcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuIAotYW5kIG90aGVyIGNvdW50cmllcy4KLQotQWxsIFNQQVJDIHRyYWRlbWFya3MgYXJlIHVzZWQgdW5kZXIgbGljZW5zZSBhbmQgYXJlIHRyYWRlbWFya3MKLW9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTUEFSQyBJbnRlcm5hdGlvbmFsLCBJbmMuCi1pbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLiBQcm9kdWN0cyBiZWFyaW5nIFNQQVJDCi10cmFkZW1hcmtzIGFyZSBiYXNlZCB1cG9uIGFuIGFyY2hpdGVjdHVyZSBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAKLQotUG9zdFNjcmlwdCBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMsIEluYy4gCi0KLSAKLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvIAotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotCi0gCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQotSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCi1UTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCi1JTlZBTElELgotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCAKLTkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4gCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotIAotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnIGF2ZWMgCi1kZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAotZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgotYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4gCi1xdWUgY2Ugc29pdCwgc2FucyBsJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyAKLWJhaWxsZXVycyBkZSBsaWNlbmNlLCBzJ2lsIHkgZW4gYS4gIAotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZSAKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgCi1ldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotIAotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCBsZSBsb2dvIFN1biwgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCwgZXQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsICAKLXNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTdW4gCi1NaWNyb3N5c3RlbXMsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcyBwYXlzLgotIAotVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAotZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQwotSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucwotZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAotYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgCi0KLVBvc3RjcmlwdCBlc3QgdW5lIG1hcnF1ZSBlbnJlZ2lzdHJlJ2UgZCdBZG9iZSBTeXN0ZW1zIEluYy4gCi0gCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0VUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQgRVhDTFVFUywKLURBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUyBOT1RBTU1FTlQKLVRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBIEwnQVBUSVRVREUKLUEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERSBDT05UUkVGQUNPTi4KLS0tPgotCi08IS0tCi0KLSAgIFRoaXMgaXMgdGhlIERURCBkZWZpbmluZyB0aGUgSmF2YVNlcnZlciBQYWdlcyAxLjEgVGFnIExpYnJhcnkKLSAgIGRlc2NyaXB0b3IgKC50bGQpIChYTUwpIGZpbGUgZm9ybWF0L3N5bnRheC4KLQotICAgQSBUYWcgTGlicmFyeSBpcyBhIEpBUiBmaWxlIGNvbnRhaW5pbmcgYSB2YWxpZCBpbnN0YW5jZSBvZiBhIFRhZyBMaWJyYXJ5Ci0gICBEZXNjcmlwdG9yICh0YWdsaWIudGxkKSBmaWxlIGluIHRoZSBNRVRBLUlORiBzdWJkaXJlY3RvcnksIGFsb25nIHdpdGggdGhlCi0gICBhcHByb3ByaWF0ZSBpbXBsZW1lbnRpbmcgY2xhc3NlcywgYW5kIG90aGVyIHJlc291cmNlcyByZXF1aXJlZCB0bwotICAgaW1wbGVtZW50IHRoZSB0YWdzIGRlZmluZWQgdGhlcmVpbi4KLQotICAtLT4KLQotPCEtLQotVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6Ci0KLXRsaWJ2ZXJzaW9uCXRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbgotanNwdmVyc2lvbgl0aGUgdmVyc2lvbiBvZiBKU1AgdGhlIHRhZyBsaWJyYXJ5IGRlcGVuZHMgdXBvbgotCi1zaG9ydG5hbWUJYSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieQotCQlhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhIG1uZW1vbmljCi0JCXZhbHVlOyBmb3IgZXhhbXBsZSwgdGhlIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZAotCQlwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKLXVyaQkJYSB1cmkgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhpcyB0YWdsaWIKLWluZm8JCWEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwKLQkJc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUKLS0tPgotCi08IUVMRU1FTlQgdGFnbGliICh0bGlidmVyc2lvbiwganNwdmVyc2lvbj8sIHNob3J0bmFtZSwgdXJpPywgaW5mbz8sIHRhZyspID4KLTwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQKLQkgIHhtbG5zIENEQVRBICNGSVhFRAotCQkiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZCIKLT4KLQotPCEtLQotRGVzY3JpYmVzIHRoaXMgdmVyc2lvbiAobnVtYmVyKSBvZiB0aGUgdGFnbGlicmFyeSAoZGV3ZXkgZGVjaW1hbCkKLQotI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotLS0+Ci0KLTwhRUxFTUVOVCB0bGlidmVyc2lvbiAoI1BDREFUQSkgPgotCi08IS0tCi1EZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeSByZXF1aXJlcyBpbgotb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCi0KLVRoZSBkZWZhdWx0IGlzIDEuMQotCi0jUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCi0tLT4KLQotPCFFTEVNRU5UIGpzcHZlcnNpb24gICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgYSBzaG9ydCAoZGVmYXVsdCkgc2hvcnRuYW1lIHRvIGJlIHVzZWQgZm9yIHRhZ3MgYW5kCi12YXJpYWJsZSBuYW1lcyB1c2VkL2NyZWF0ZWQgYnkgdGhpcyB0YWcgbGlicmFyeS4gIERvIG5vdCB1c2UKLXdoaXRlIHNwYWNlLCBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzIG9yIHVuZGVyc2NvcmUuCi0KLSNQQ0RBVEEgOjo9IE5NVE9LRU4KLS0tPgotCi08IUVMRU1FTlQgc2hvcnRuYW1lICAgICAgKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgdmVyc2lvbiBvZgotdGhlIHRhZ2xpYnJhcnkgTGVhdmUgaXQgZW1wdHkgaWYgaXQgZG9lcyBub3QgYXBwbHkuCi0tLT4KLQotPCFFTEVNRU5UIHVyaQkgKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBhbiBhcmJpdHJhcnkgdGV4dCBzdHJpbmcgZGVzY2lyYmluZyB0aGUgdGFnIGxpYnJhcnkKLS0tPgotCi08IUVMRU1FTlQgaW5mbwkoI1BDREFUQSkgPgotCi08IS0tCi1UaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnksIGRlZmluaW5nOgotCi0tIHRoZSB1bmlxdWUgdGFnL2VsZW1lbnQgbmFtZQotLSB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotLSBhbiBvcHRpb25hbCBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0tIHRoZSBib2R5IGNvbnRlbnQgdHlwZSAoaGludCkKLS0gb3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0tIGFueSBhdHRyaWJ1dGVzCi0tLT4KLQotPCFFTEVNRU5UIHRhZyAobmFtZSwgdGFnY2xhc3MsIHRlaWNsYXNzPywgYm9keWNvbnRlbnQ/LCBpbmZvPywgYXR0cmlidXRlKikgPgotCi08IS0tCi1EZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJsdmV0LmpzcC50YWdleHQuVGFnIHRoYXQgaW1wbGVtZW50cwotdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yIHRoaXMgdGFnLiAocmVxdWlyZWQpCi0KLSNQQ0RBVEEgOjo9IGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLS0tPgotCi08IUVMRU1FTlQgdGFnY2xhc3MgKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbyBmb3IKLXRoaXMgdGFnLiAob3B0aW9uYWwpCi0KLUlmIHRoaXMgaXMgbm90IGdpdmVuLCB0aGUgY2xhc3MgaXMgbm90IGNvbnN1bHRlZCBhdCB0cmFuc2xhdGlvbiB0aW1lLgotCi0jUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0tLT4KLQotPCFFTEVNRU5UIHRlaWNsYXNzICgjUENEQVRBKSA+Ci0KLTwhLS0KLVByb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4gUHJpbWFyaWx5Ci1pbnRlbmRlZCBmb3IgdXNlIGJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMuCi0KLVRoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgdmFsdWVzIHNwZWNpZmllZDoKLQotdGFnZGVwZW5kZW50CVRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZwotCQlpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseSBpbiBhCi0JCWRpZmZlcmVudCAibGFuZ2FnZSIsIGUuZyBlbWJlZGRlZCBTUUwgc3RhdGVtZW50cy4KLQotSlNQCQlUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1Agc3ludGF4Ci0KLWVtcHR5CQlUaGUgYm9keSBtdXN0IGJlIGVtcHR5Ci0KLVRoZSBkZWZhdWx0IChpZiBub3QgZGVmaW5lZCkgaXMgSlNQCi0KLSNQQ0RBVEEgOjo9ICB0YWdkZXBlbmRlbnQgfCBKU1AgfCBlbXB0eQotCi0tLT4KLQotPCFFTEVNRU5UIGJvZHljb250ZW50ICgjUENEQVRBKSA+Ci0KLTwhLS0KLVRoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWcKLQotQW4gYXR0cmlidXRlIGRlZmluaXRpb24gaXMgY29tcG9zZWQgb2Y6Ci0KLS0gdGhlIGF0dHJpYnV0ZXMgbmFtZSAocmVxdWlyZWQpCi0tIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwgKG9wdGlvbmFsKQotLSBpZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCBydW50aW1lCi0gIGJ5IGEgc2NyaXB0bGV0IGV4cHJlc3Npb24gKG9wdGlvbmFsKQotCi0tLT4KLQotPCFFTEVNRU5UIGF0dHJpYnV0ZSAobmFtZSwgcmVxdWlyZWQ/ICwgcnRleHBydmFsdWU/KSA+Ci0KLTwhLS0KLURlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZyBkZWZpbmVkCi0KLSNQQ0RBVEEgOjo9IE5NVE9LRU4KLS0tPgotCi08IUVMRU1FTlQgbmFtZQkoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbC4KLQotI1BDREFUQSA6Oj0gdHJ1ZSB8IGZhbHNlIHwgeWVzIHwgbm8KLQotSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUgdGhlIGF0dHJpYnV0ZQotaXMgb3B0aW9uYWwuCi0tLT4KLQotPCFFTEVNRU5UIHJlcXVpcmVkICAgICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldCBleHByZXNzaW9ucyBhcwotYSB2YWx1ZSwgaS5lIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkCi1hdCByZXF1ZXN0IHRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbgotdGltZS4KLQotI1BDREFUQSA6Oj0gdHJ1ZSB8IGZhbHNlIHwgeWVzIHwgbm8KLQotSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUgdGhlIGF0dHJpYnV0ZQotaGFzIGEgc3RhdGljIHZhbHVlCi0tLT4KLQotPCFFTEVNRU5UIHJ0ZXhwcnZhbHVlICgjUENEQVRBKSA+Ci0KLTwhQVRUTElTVCB0bGlidmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBqc3B2ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNob3J0bmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB1cmkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaW5mbyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGVpY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYm9keWNvbnRlbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVxdWlyZWQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcnRleHBydmFsdWUgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmViNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLQotPCEtLQotICAgQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCi0gIC0tPgotCi08IS0tCi0KLSAgIFRoaXMgaXMgdGhlIERURCBkZWZpbmluZyB0aGUgSmF2YVNlcnZlciBQYWdlcyAxLjIgVGFnIExpYnJhcnkKLSAgIGRlc2NyaXB0b3IgKC50bGQpIChYTUwpIGZpbGUgZm9ybWF0L3N5bnRheC4KLQotICAgQSBUYWcgTGlicmFyeSBpcyBhIEpBUiBmaWxlIGNvbnRhaW5pbmcgYSB2YWxpZCBpbnN0YW5jZSBvZiBhIFRhZyBMaWJyYXJ5Ci0gICBEZXNjcmlwdG9yICh0YWdsaWIudGxkKSBmaWxlIGluIHRoZSBNRVRBLUlORiBzdWJkaXJlY3RvcnksIGFsb25nIHdpdGggdGhlCi0gICBhcHByb3ByaWF0ZSBpbXBsZW1lbnRpbmcgY2xhc3NlcywgYW5kIG90aGVyIHJlc291cmNlcyByZXF1aXJlZCB0bwotICAgaW1wbGVtZW50IHRoZSB0YWdzIGRlZmluZWQgdGhlcmVpbi4KLQotICAgVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KLSAgLS0+Ci0gIAotPCFOT1RBVElPTiBXRUItSlNQVEFHTElCLjFfMiBQVUJMSUMKLSAgICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIj4KLQotPCEtLQotVGhpcyBpcyB0aGUgWE1MIERURCBmb3IgdGhlIEpTUCAxLjIgVGFnIExpYnJhcnkgRGVzY3JpcHRvci4KLUFsbCBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3JzIG11c3QgaW5jbHVkZSBhIERPQ1RZUEUKLW9mIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICA8IURPQ1RZUEUgdGFnbGliCi0gICAgICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgotCSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIj4KLQotLS0+Ci0KLTwhLS0KLVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgotCi10bGliLXZlcnNpb24JdGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCi0KLWpzcC12ZXJzaW9uCXRoZSB2ZXJzaW9uIG9mIEpTUCB0aGUgdGFnIGxpYnJhcnkgZGVwZW5kcyB1cG9uCi0KLXNob3J0LW5hbWUJYSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieQotCQlhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhIG1uZW1vbmljCi0JCXZhbHVlOyBmb3IgZXhhbXBsZSwgdGhlIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZAotCQlwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKLQotdXJpCQlhIHVyaSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGlzIHRhZ2xpYgotCi1kaXNwbGF5LW5hbWUgICAgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0Ci0gICAgICAgICAgICAgICAgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCi1zbWFsbC1pY29uICAgICAgb3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0KLWxhcmdlLWljb24gICAgICBvcHRpb25hbCBsYXJnZS1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQotZGVzY3JpcHRpb24JYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLAotCQlzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZQotCi12YWxpZGF0b3IgICAgICAgb3B0aW9uYWwgVGFnTGlicmFyeVZhbGlkYXRvciBpbmZvcm1hdGlvbgotCi1saXN0ZW5lciAgICAgICAgb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgc3BlY2lmaWNhdGlvbgotCi0KLS0tPgotCi08IUVMRU1FTlQgdGFnbGliICh0bGliLXZlcnNpb24sIGpzcC12ZXJzaW9uLCBzaG9ydC1uYW1lLCB1cmk/LAotICAgICAgICAgICAgICAgICAgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sIGxhcmdlLWljb24/LCBkZXNjcmlwdGlvbj8sCi0gICAgICAgICAgICAgICAgICB2YWxpZGF0b3I/LCBsaXN0ZW5lciosIHRhZyspID4KLQotPCFBVFRMSVNUIHRhZ2xpYiBpZCBJRCAjSU1QTElFRAotCSAgeG1sbnMgQ0RBVEEgI0ZJWEVECi0JCSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9UYWdMaWJyYXJ5RGVzY3JpcHRvciIKLT4KLQotPCEtLQotRGVzY3JpYmVzIHRoaXMgdmVyc2lvbiAobnVtYmVyKSBvZiB0aGUgdGFnbGlicmFyeSAoZGV3ZXkgZGVjaW1hbCkKLQotI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotLS0+Ci0KLTwhRUxFTUVOVCB0bGliLXZlcnNpb24gKCNQQ0RBVEEpID4KLQotPCEtLQotRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkgcmVxdWlyZXMgaW4KLW9yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQotCi1UaGUgZGVmYXVsdCBpcyAxLjIKLQotI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotLS0+Ci0KLTwhRUxFTUVOVCBqc3AtdmVyc2lvbiAgKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBhIHNob3J0IChkZWZhdWx0KSBzaG9ydC1uYW1lIHRvIGJlIHVzZWQgZm9yIHRhZ3MgYW5kCi12YXJpYWJsZSBuYW1lcyB1c2VkL2NyZWF0ZWQgYnkgdGhpcyB0YWcgbGlicmFyeS4gIERvIG5vdCB1c2UKLXdoaXRlIHNwYWNlLCBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzIG9yIHVuZGVyc2NvcmUuCi0KLSNQQ0RBVEEgOjo9IE5NVE9LRU4KLS0tPgotCi08IUVMRU1FTlQgc2hvcnQtbmFtZSAgICAgICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHZlcnNpb24gb2YKLXRoZSB0YWdsaWJyYXJ5LiAgTGVhdmUgaXQgZW1wdHkgaWYgaXQgZG9lcyBub3QgYXBwbHkuCi0tLT4KLQotPCFFTEVNRU5UIHVyaQkgKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBhbiBhcmJpdHJhcnkgdGV4dCBzdHJpbmcgZGVzY2lyYmluZyB0aGUgdGFnIGxpYnJhcnkKLS0tPgotCi08IUVMRU1FTlQgZGVzY3JpcHRpb24JKCNQQ0RBVEEpID4KLQotPCEtLQotCi1EZWZpbmVzIGFuIG9wdGlvbmFsIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvCi12YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5LgotLS0+Ci0KLTwhRUxFTUVOVCB2YWxpZGF0b3IgKHZhbGlkYXRvci1jbGFzcywgaW5pdC1wYXJhbSosIGRlc2NyaXB0aW9uPykgPgotCi0KLTwhLS0KLQotRGVmaW5lcyB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvCi12YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5LgotLS0+Ci0KLTwhRUxFTUVOVCB2YWxpZGF0b3ItY2xhc3MgKCNQQ0RBVEEpID4KLQotCi08IS0tCi0KLVRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4KLWluaXRpYWxpemF0aW9uIHBhcmFtCi0tLT4KLQotPCFFTEVNRU5UIGluaXQtcGFyYW0gKHBhcmFtLW5hbWUsIHBhcmFtLXZhbHVlLCBkZXNjcmlwdGlvbj8pPgotCi08IS0tCi0KLVRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuCi0tLT4KLQotPCFFTEVNRU5UIHBhcmFtLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KLS0tPgotCi08IUVMRU1FTlQgcGFyYW0tdmFsdWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLQotRGVmaW5lcyBhbiBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBvYmplY3QgdG8gYmUgaW5zdGFudGlhdGVkIGFuZAotcmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5LgotLS0+Ci0KLTwhRUxFTUVOVCBsaXN0ZW5lciAobGlzdGVuZXItY2xhc3MpID4KLQotPCEtLQotCi1UaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiB0aGF0Ci1tdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4gIFNlZSB0aGUKLVNlcnZsZXQgMi4zIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCi0tLT4KLQotPCFFTEVNRU5UIGxpc3RlbmVyLWNsYXNzICgjUENEQVRBKSA+Ci0KLQotPCEtLQotVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LiAgSXQgaGFzIG9uZQotYXR0cmlidXRlLCBpZC4KLQotVGhlIHRhZyBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6Ci0KLW5hbWUgICAgICAgICAgICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKLQotdGFnLWNsYXNzICAgICAgICAgVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZwotICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZwotCi10ZWktY2xhc3MgICAgICAgICBBbiBvcHRpb25hbCBzdWJjbGFzcyBvZgotICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotCi1ib2R5LWNvbnRlbnQgICAgICBUaGUgYm9keSBjb250ZW50IHR5cGUKLQotZGlzcGxheS1uYW1lICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkCi0gICAgICAgICAgICAgICAgICBieSB0b29scwotCi1zbWFsbC1pY29uICAgICAgICBPcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQotbGFyZ2UtaWNvbiAgICAgICAgT3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0KLWRlc2NyaXB0aW9uICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCi12YXJpYWJsZSAgICAgICAgICBPcHRpb25hbCBzY3JpcHRpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24KLQotYXR0cmlidXRlICAgICAgICAgQWxsIGF0dHJpYnV0ZXMgb2YgdGhpcyBhY3Rpb24KLQotZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiBhCi0gICAgICAgICAgICAgICAgICB1c2Ugb2YgdGhpcyB0YWcKLQotLS0+Ci0KLTwhRUxFTUVOVCB0YWcgKG5hbWUsIHRhZy1jbGFzcywgdGVpLWNsYXNzPywgYm9keS1jb250ZW50PywgZGlzcGxheS1uYW1lPywKLSAgICAgICAgICAgICAgIHNtYWxsLWljb24/LCBsYXJnZS1pY29uPywgZGVzY3JpcHRpb24/LCB2YXJpYWJsZSosIGF0dHJpYnV0ZSosCi0gICAgICAgICAgICAgICBleGFtcGxlPykgPgotCi08IS0tCi1EZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJsdmV0LmpzcC50YWdleHQuVGFnIHRoYXQgaW1wbGVtZW50cwotdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yIHRoaXMgdGFnLiAocmVxdWlyZWQpCi0KLSNQQ0RBVEEgOjo9IGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLS0tPgotCi08IUVMRU1FTlQgdGFnLWNsYXNzICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yCi10aGlzIHRhZy4gKG9wdGlvbmFsKQotCi1JZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQgdHJhbnNsYXRpb24gdGltZS4KLQotI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotLS0+Ci0KLTwhRUxFTUVOVCB0ZWktY2xhc3MgKCNQQ0RBVEEpID4KLQotPCEtLQotUHJvdmlkZXMgYSBoaW50IGFzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBib2R5IG9mIHRoaXMgdGFnLiBQcmltYXJpbHkKLWludGVuZGVkIGZvciB1c2UgYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scy4KLQotVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSB2YWx1ZXMgc3BlY2lmaWVkOgotCi10YWdkZXBlbmRlbnQJVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnCi0JCWltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5IGluIGEKLQkJZGlmZmVyZW50ICJsYW5nYWdlIiwgZS5nIGVtYmVkZGVkIFNRTCBzdGF0ZW1lbnRzLgotCi1KU1AJCVRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUCBzeW50YXgKLQotZW1wdHkJCVRoZSBib2R5IG11c3QgYmUgZW1wdHkKLQotVGhlIGRlZmF1bHQgKGlmIG5vdCBkZWZpbmVkKSBpcyBKU1AKLQotI1BDREFUQSA6Oj0gIHRhZ2RlcGVuZGVudCB8IEpTUCB8IGVtcHR5Ci0KLS0tPgotCi08IUVMRU1FTlQgYm9keS1jb250ZW50ICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkCi10byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuCi0tLT4KLQotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSkgPgotCi0KLTwhLS0KLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlCi0oMzIgeCAzMikgaWNvbiBpbWFnZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUKLXRhZyBsaWJyYXJ5LiAgVGhlIGltYWdlIG11c3QgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQsIGFuZAotdGhlIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIHRoZSBzdWZmaXggIi5qcGciIG9yICIuZ2lmIiByZXNwZWN0aXZlbHkuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLS0tPgotCi08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSkgPgotCi08IS0tCi0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBsYXJnZQotKDMyIHggMzIpIGljb24gaW1hZ2UuICBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlCi10YWcgbGlicmFyeS4gIFRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQKLXRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0tLT4KLQotPCFFTEVNRU5UIHNtYWxsLWljb24gKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUKLW9mIHRoZSB1c2Ugb2YgYSB0YWcuCi0tLT4KLQotPCFFTEVNRU5UIGV4YW1wbGUgKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgdmFyaWFibGUgdGFnIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzCi1kZWZpbmVkIGJ5IHRoaXMgdGFnLiAgSXQgaXMgYSAodHJhbnNsYXRpb24gdGltZSkgZXJyb3IgZm9yIGEgdGFnCi10aGF0IGhhcyBvbmUgb3IgbW9yZSB2YXJpYWJsZSBzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvCi1jbGFzcyB0aGF0IHJldHVybnMgYSBub24tbnVsbCBvYmplY3QuCi0KLVRoZSBzdWJlbGVtZW50cyBvZiB2YXJpYWJsZSBhcmUgb2YgdGhlIGZvcm06Ci0KLW5hbWUtZ2l2ZW4gICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgbmFtZSBhcyBhIGNvbnN0YW50Ci0KLW5hbWUtZnJvbS1hdHRyaWJ1dGUgICAgICBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLiAgT25lIG9mIG5hbWUtZ2l2ZW4gb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLgotCi12YXJpYWJsZS1jbGFzcyAgICAgICAgICAgTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgaXMgZGVmYXVsdC4KLQotZGVjbGFyZSAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG9yIG5vdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlIGlzIHRoZSBkZWZhdWx0LgotCi1zY29wZSAgICAgICAgICAgICAgICAgICAgVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyYWlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkLiAgTkVTVEVEIGlzIGRlZmF1bHQuCi0KLWRlc2NyaXB0aW9uICAgICAgICAgICAgICBPcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHZhcmlhYmxlCi0KLS0tPgotCi08IUVMRU1FTlQgdmFyaWFibGUgKCAobmFtZS1naXZlbiB8IG5hbWUtZnJvbS1hdHRyaWJ1dGUpLCB2YXJpYWJsZS1jbGFzcz8sCi0gICAgICAgICAgICAgICAgICAgIGRlY2xhcmU/LCBzY29wZT8sIGRlc2NyaXB0aW9uPykgPgotCi08IS0tCi0KLVRoZSBuYW1lIGZvciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgT25lIG9mIG5hbWUtZ2l2ZW4gb3IKLW5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCi0tLT4KLQotPCFFTEVNRU5UIG5hbWUtZ2l2ZW4gKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uLXRpbWUpIHZhbHVlIHdpbGwgZ2l2ZQotdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLiAgT25lIG9mIG5hbWUtZ2l2ZW4gb3IgbmFtZS1mcm9tLWF0dHJpYnV0ZQotaXMgcmVxdWlyZWQuCi0tLT4KLQotPCFFTEVNRU5UIG5hbWUtZnJvbS1hdHRyaWJ1dGUgKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgY2xhc3MgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBUaGUKLWRlZmF1bHQgaXMgamF2YS5sYW5nLlN0cmluZy4KLS0tPgotCi08IUVMRU1FTlQgdmFyaWFibGUtY2xhc3MgKCNQQ0RBVEEpID4KLQotPCEtLQotCi1XaGV0aGVyIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgdG8gYmUgZGVmaW5lZCBvciBub3QuICBTZWUKLVRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4gIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgInRydWUiCi1pcyB0aGUgZGVmYXVsdC4KLS0tPgotCi08IUVMRU1FTlQgZGVjbGFyZSAoI1BDREFUQSkgPgotCi08IS0tCi0KLVRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4KLVRoZSBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAiTkVTVEVEIiBpcyB0aGUgZGVmYXVsdC4gIE90aGVyIGxlZ2FsCi12YWx1ZXMgYXJlICJBVF9CRUdJTiIgYW5kICJBVF9FTkQiLgotLS0+Ci0KLTwhRUxFTUVOVCBzY29wZSAoI1BDREFUQSkgPgotCi08IS0tCi0KLVRoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWcKLQotQW4gYXR0cmlidXRlIGRlZmluaXRpb24gaXMgY29tcG9zZWQgb2Y6Ci0JCi0tIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQotLSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsIChvcHRpb25hbCkKLS0gaWYgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcnVudGltZQotICBieSBhIHNjcmlwdGxldCBleHByZXNzaW9uIChvcHRpb25hbCkKLS0gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgKG9wdGlvbmFsKQotLSBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbWVhbmluZyBvZiB0aGUgYXR0cmlidXRlIChvcHRpb25hbCkKLQotLS0+Ci0KLQotPCEtLQotVGhlIGF0dHJpYnV0ZSB0YWcgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nIHRhZwotCi1BbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBpcyBjb21wb3NlZCBvZjoKLQotLSB0aGUgYXR0cmlidXRlcyBuYW1lIChyZXF1aXJlZCkKLQotLSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsIChvcHRpb25hbCkKLQotLSBpZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCBydW50aW1lCi0gIGJ5IGEgc2NyaXB0bGV0IGV4cHJlc3Npb24gKG9wdGlvbmFsKQotCi0tIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIChvcHRpb25hbCkKLQotLSBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbWVhbmluZyBvZiB0aGUgYXR0cmlidXRlIChvcHRpb25hbCkKLS0tPgotCi08IUVMRU1FTlQgYXR0cmlidXRlIChuYW1lLCByZXF1aXJlZD8gLCBydGV4cHJ2YWx1ZT8sIHR5cGU/LCBkZXNjcmlwdGlvbj8pID4KLQotPCEtLQotRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nIGRlZmluZWQKLQotI1BDREFUQSA6Oj0gTk1UT0tFTgotLS0+Ci0KLTwhRUxFTUVOVCBuYW1lCSgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsLgotCi0jUENEQVRBIDo6PSB0cnVlIHwgZmFsc2UgfCB5ZXMgfCBubwotCi1JZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUgYXR0cmlidXRlCi1pcyBvcHRpb25hbC4KLS0tPgotCi08IUVMRU1FTlQgcmVxdWlyZWQgICAgKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0IGV4cHJlc3Npb25zIGFzCi1hIHZhbHVlLCBpLmUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQKLWF0IHJlcXVlc3QgdGltZSwgYXMgb3Bwb3NlZCB0byBhIHN0YXRpYyB2YWx1ZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uCi10aW1lLgotCi0jUENEQVRBIDo6PSB0cnVlIHwgZmFsc2UgfCB5ZXMgfCBubwotCi1JZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUgYXR0cmlidXRlCi1oYXMgYSBzdGF0aWMgdmFsdWUKLS0tPgotCi08IUVMRU1FTlQgcnRleHBydmFsdWUgKCNQQ0RBVEEpID4KLQotCi08IS0tCi0KLURlZmluZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZS4gIEZvciBzdGF0aWMgdmFsdWVzCi0odGhvc2UgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbiB0aW1lKSB0aGUgdHlwZSBpcyBhbHdheXMKLWphdmEubGFuZy5TdHJpbmcuCi0tLT4KLQotPCFFTEVNRU5UIHR5cGUgKCNQQ0RBVEEpID4KLQotCi08IS0tIElEIGF0dHJpYnV0ZXMgLS0+Ci0KLTwhQVRUTElTVCB0bGliLXZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QganNwLXZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2hvcnQtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB1cmkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXhhbXBsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnLWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRlaS1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBib2R5LWNvbnRlbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVxdWlyZWQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcnRleHBydmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci0KLQotPCFBVFRMSVNUIHBhcmFtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGFyYW0tdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdGVuZXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdGVuZXItY2xhc3MgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNTg2NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIyLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZHMJMS4zNiAwOC8xOC8wMwotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEpTUCBUYWdsaWJyYXJ5Ci0JZGVzY3JpcHRvci4gIEFsbCBUYWdsaWJyYXJ5IGRlc2NyaXB0b3JzIG11c3QKLQlpbmRpY2F0ZSB0aGUgdGFnIGxpYnJhcnkgc2NoZW1hIGJ5IHVzaW5nIHRoZSBUYWdsaWJyYXJ5Ci0JbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi0JYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPHRhZ2xpYiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotCSAgICAgIHZlcnNpb249IjIuMCI+Ci0JICAgICAgLi4uCi0JICAgIDwvdGFnbGliPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZAotCXZlcnNpb24gb2YgdGhlIHNjaGVtYSB1c2luZyB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JZm9yIEoyRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWIiIHR5cGU9ImoyZWU6dGxkVGFnbGliVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QuCi0JVGhlIGRlZmluaXRpb24gb2YgdGFnbGliIGlzIHByb3ZpZGVkCi0JYnkgdGhlIHRsZFRhZ2xpYlR5cGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ0YWctbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB0YWdsaWIgZWxlbWVudCBjb250YWlucywgYW1vbmcgb3RoZXIgdGhpbmdzLCB0YWcgYW5kCi0JICB0YWctZmlsZSBlbGVtZW50cy4KLQkgIFRoZSBuYW1lIHN1YmVsZW1lbnRzIG9mIHRoZXNlIGVsZW1lbnRzIG11c3QgZWFjaCBiZSB1bmlxdWUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6dGFnfGoyZWU6dGFnLWZpbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZ1bmN0aW9uLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgdGFnbGliIGVsZW1lbnQgY29udGFpbnMgZnVuY3Rpb24gZWxlbWVudHMuCi0JICBUaGUgbmFtZSBzdWJlbGVtZW50cyBvZiB0aGVzZSBlbGVtZW50cyBtdXN0IGVhY2ggYmUgdW5pcXVlLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmZ1bmN0aW9uIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJib2R5LWNvbnRlbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGJvZHkgdGhhdCBpcyB2YWxpZCBmb3IgYSB0YWcuCi0JVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBKU1AgY29udGFpbmVyIHRvIHZhbGlkYXRlCi0JdGhhdCBhIHRhZyBpbnZvY2F0aW9uIGhhcyB0aGUgY29ycmVjdCBib2R5IHN5bnRheCBhbmQKLQlieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzIHRvIGFzc2lzdCB0aGUgcGFnZSBhdXRob3IKLQlpbiBwcm92aWRpbmcgYSB2YWxpZCB0YWcgYm9keS4KLQotCVRoZXJlIGFyZSBjdXJyZW50bHkgZm91ciB2YWx1ZXMgc3BlY2lmaWVkOgotCi0JdGFnZGVwZW5kZW50ICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZwotCQkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkKLQkJCWluIGEgZGlmZmVyZW50ICJsYW5ndWFnZSIsIGUuZyBlbWJlZGRlZCBTUUwKLQkJCXN0YXRlbWVudHMuCi0KLQlKU1AgICAgICAgICAgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQCi0JCQlzeW50YXguCi0KLQllbXB0eSAgICAgICAgICAgVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQotCi0Jc2NyaXB0bGVzcyAgICAgIFRoZSBib2R5IGFjY2VwdHMgb25seSB0ZW1wbGF0ZSB0ZXh0LCBFTAotCQkJRXhwcmVzc2lvbnMsIGFuZCBKU1AgYWN0aW9uIGVsZW1lbnRzLiAgTm8KLQkJCXNjcmlwdGluZyBlbGVtZW50cyBhcmUgYWxsb3dlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idGFnZGVwZW5kZW50Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSlNQIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZW1wdHkiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzY3JpcHRsZXNzIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXh0ZW5zaWJsZVR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXh0ZW5zaWJsZVR5cGUgaXMgYW4gYWJzdHJhY3QgYmFzZSB0eXBlIHRoYXQgaXMgdXNlZCB0bwotCWRlZmluZSB0aGUgdHlwZSBvZiBleHRlbnNpb24tZWxlbWVudHMuIEluc3RhbmNlIGRvY3VtZW50cwotCW11c3Qgc3Vic3RpdHV0ZSBhIGtub3duIHR5cGUgdG8gZGVmaW5lIHRoZSBleHRlbnNpb24gYnkKLQl1c2luZyB4c2k6dHlwZSBhdHRyaWJ1dGUgdG8gZGVmaW5lIHRoZSBhY3R1YWwgdHlwZSBvZgotCWV4dGVuc2lvbi1lbGVtZW50cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZ1bmN0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGZ1bmN0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIGVhY2gKLQlmdW5jdGlvbiBpbiB0aGUgdGFnIGxpYnJhcnkgdGhhdCBpcyB0byBiZSBleHBvc2VkIHRvIHRoZSBFTC4KLQotCVRoZSBmdW5jdGlvbiBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6Ci0KLQlkZXNjcmlwdGlvbiAgICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCi0JZGlzcGxheS1uYW1lICAgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotCQkJICAgIGRpc3BsYXllZCBieSB0b29scwotCi0JaWNvbiAgICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZAotCQkJICAgIGJ5IHRvb2xzCi0KLQluYW1lICAgICAgICAgICAgICAgIEEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24KLQotCWZ1bmN0aW9uLWNsYXNzICAgICAgUHJvdmlkZXMgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAotCQkJICAgIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uCi0KLQlmdW5jdGlvbi1zaWduYXR1cmUgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhCi0JCQkgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgb2YgdGhlIEphdmEKLQkJCSAgICBtZXRob2QgdGhhdCBpcyB0byBiZSB1c2VkIHRvIGltcGxlbWVudAotCQkJICAgIHRoZSBmdW5jdGlvbi4KLQotCWV4YW1wbGUgICAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KLQkJCSAgICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgZnVuY3Rpb24KLQotCWZ1bmN0aW9uLWV4dGVuc2lvbiAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQkgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBmdW5jdGlvbiwgZm9yIHRvb2wKLQkJCSAgICBjb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIEEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFByb3ZpZGVzIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSmF2YQotCSAgICBjbGFzcyBjb250YWluaW5nIHRoZSBzdGF0aWMgbWV0aG9kIHRoYXQgaW1wbGVtZW50cwotCSAgICB0aGUgZnVuY3Rpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1zaWduYXR1cmUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgb2YgdGhlIHN0YXRpYyBKYXZhIG1ldGhvZCB0aGF0IGlzCi0JICAgIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbi4gIFRoZSBzeW50YXggb2YgdGhlCi0JICAgIGZ1bmN0aW9uLXNpZ25hdHVyZSBlbGVtZW50IGlzIGFzIGZvbGxvd3M6Ci0KLQkJRnVuY3Rpb25TaWduYXR1cmUgOjo9IFJldHVyblR5cGUgUyBNZXRob2ROYW1lIFM/Ci0JCQkJICAgICAgJygnIFM/IFBhcmFtZXRlcnM/IFM/ICcpJwotCi0gICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgICAgOjo9IFR5cGUKLQotCQlNZXRob2ROYW1lICAgICAgICA6Oj0gSWRlbnRpZmllcgotCi0JCVBhcmFtZXRlcnMgICAgICAgIDo6PSAgIFBhcmFtZXRlcgotCQkJCSAgICAgIHwgKCBQYXJhbWV0ZXIgUz8gJywnIFM/IFBhcmFtZXRlcnMgKQotCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyICAgICAgICAgOjo9IFR5cGUKLQotCQlXaGVyZToKLQotIAkJICAgICogVHlwZSBpcyBhIGJhc2ljIHR5cGUgb3IgYSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0JCSAgICAgIChpbmNsdWRpbmcgcGFja2FnZSBuYW1lKSwgYXMgcGVyIHRoZSAnVHlwZScgcHJvZHVjdGlvbgotCQkgICAgICBpbiB0aGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBTZWNvbmQgRWRpdGlvbiwKLQkJICAgICAgQ2hhcHRlciAxOC4KLQotICAgICAgICAgICAgICAgICAgICAqIElkZW50aWZpZXIgaXMgYSBKYXZhIGlkZW50aWZpZXIsIGFzIHBlciB0aGUgJ0lkZW50aWZpZXInCi0JCSAgICAgIHByb2R1Y3Rpb24gaW4gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kCi0JCSAgICAgIEVkaXRpb24sIENoYXB0ZXIgMTguCi0KLQkgICAgRXhhbXBsZToKLQotCSAgICBqYXZhLmxhbmcuU3RyaW5nIG5pY2tOYW1lKCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQgKQotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCi0JICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqMmVlOnRsZC1leHRlbnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRnVuY3Rpb24gZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAotCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnRmlsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlZmluZXMgYW4gYWN0aW9uIGluIHRoaXMgdGFnIGxpYnJhcnkgdGhhdCBpcyBpbXBsZW1lbnRlZAotCWFzIGEgLnRhZyBmaWxlLgotCi0JVGhlIHRhZy1maWxlIGVsZW1lbnQgaGFzIHR3byByZXF1aXJlZCBzdWJlbGVtZW50czoKLQotCWRlc2NyaXB0aW9uICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCi0JZGlzcGxheS1uYW1lICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLQkJCSAgZGlzcGxheWVkIGJ5IHRvb2xzCi0KLQlpY29uICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZAotCQkJICBieSB0b29scwotCi0JbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQotCi0JcGF0aCAgICAgICAgICAgICAgV2hlcmUgdG8gZmluZCB0aGUgLnRhZyBmaWxlIGltcGxlbWVudGluZyB0aGlzCi0JCQkgIGFjdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYgotCQkJICBhcHBsaWNhdGlvbiBvciB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUgZm9yIGEKLQkJCSAgdGFnIGxpYnJhcnkgcGFja2FnZWQgaW4gYSBKQVIuICBUaGlzIG11c3QKLQkJCSAgYmVnaW4gd2l0aCAvV0VCLUlORi90YWdzIGlmIHRoZSAudGFnIGZpbGUKLQkJCSAgcmVzaWRlcyBpbiB0aGUgV0FSLCBvciAvTUVUQS1JTkYvdGFncyBpZiB0aGUKLQkJCSAgLnRhZyBmaWxlIHJlc2lkZXMgaW4gYSBKQVIuCi0KLQlleGFtcGxlICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgotCQkJICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgdGFnCi0KLQl0YWctZXh0ZW5zaW9uICAgICBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCSAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWcsIGZvciB0b29sCi0JCQkgIGNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLQkJICAgdHlwZT0iajJlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGF0aCIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgotCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgYSB0YWcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqMmVlOnRsZC1leHRlbnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGFnIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKLQkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWcgZGVmaW5lcyBhIHVuaXF1ZSB0YWcgaW4gdGhpcyB0YWcgbGlicmFyeS4gIEl0IGhhcyBvbmUKLQlhdHRyaWJ1dGUsIGlkLgotCi0JVGhlIHRhZyBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6Ci0KLQlkZXNjcmlwdGlvbiAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQotCWRpc3BsYXktbmFtZSAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi0JCQkgIGRpc3BsYXllZCBieSB0b29scwotCi0JaWNvbiAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKLQkJCSAgYnkgdG9vbHMKLQotCW5hbWUgICAgICAgICAgICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKLQotCXRhZy1jbGFzcyAgICAgICAgIFRoZSB0YWcgaGFuZGxlciBjbGFzcyBpbXBsZW1lbnRpbmcKLQkJCSAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcFRhZwotCi0JdGVpLWNsYXNzICAgICAgICAgQW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YKLQkJCSAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotCi0JYm9keS1jb250ZW50ICAgICAgVGhlIGJvZHkgY29udGVudCB0eXBlCi0KLQl2YXJpYWJsZSAgICAgICAgICBPcHRpb25hbCBzY3JpcHRpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24KLQotCWF0dHJpYnV0ZSAgICAgICAgIEFsbCBhdHRyaWJ1dGVzIG9mIHRoaXMgYWN0aW9uIHRoYXQgYXJlCi0JCQkgIGV2YWx1YXRlZCBwcmlvciB0byBpbnZvY2F0aW9uLgotCi0JZHluYW1pYy1hdHRyaWJ1dGVzIFdoZXRoZXIgdGhpcyB0YWcgc3VwcG9ydHMgYWRkaXRpb25hbAotCQkJICAgYXR0cmlidXRlcyB3aXRoIGR5bmFtaWMgbmFtZXMuICBJZgotCQkJICAgdHJ1ZSwgdGhlIHRhZy1jbGFzcyBtdXN0IGltcGxlbWVudCB0aGUKLQkJCSAgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5EeW5hbWljQXR0cmlidXRlcwotCQkJICAgaW50ZXJmYWNlLiAgRGVmYXVsdHMgdG8gZmFsc2UuCi0KLQlleGFtcGxlICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgotCQkJICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgdGFnCi0KLQl0YWctZXh0ZW5zaW9uICAgICBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCSAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWcsIGZvciB0b29sCi0JCQkgIGNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLQkJICAgdHlwZT0iajJlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJsdmV0LmpzcC50YWdleHQuSnNwVGFnCi0JICAgIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IKLQkgICAgdGhpcyB0YWcuIChyZXF1aXJlZCkKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlaS1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0JICAgIGZvciB0aGlzIHRhZy4gKG9wdGlvbmFsKQotCi0JICAgIElmIHRoaXMgaXMgbm90IGdpdmVuLCB0aGUgY2xhc3MgaXMgbm90IGNvbnN1bHRlZCBhdAotCSAgICB0cmFuc2xhdGlvbiB0aW1lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJvZHktY29udGVudCIKLQkJICAgdHlwZT0iajJlZTpib2R5LWNvbnRlbnRUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgU3BlY2lmaWVzIHRoZSBmb3JtYXQgZm9yIHRoZSBib2R5IG9mIHRoaXMgdGFnLgotCSAgICBUaGUgZGVmYXVsdCBpbiBKU1AgMS4yIHdhcyAiSlNQIiBidXQgYmVjYXVzZSB0aGlzCi0JICAgIGlzIGFuIGludmFsaWQgc2V0dGluZyBmb3Igc2ltcGxlIHRhZyBoYW5kbGVycywgdGhlcmUKLQkgICAgaXMgbm8gbG9uZ2VyIGEgZGVmYXVsdCBpbiBKU1AgMi4wLiAgQSByZWFzb25hYmxlCi0JICAgIGRlZmF1bHQgZm9yIHNpbXBsZSB0YWcgaGFuZGxlcnMgaXMgInNjcmlwdGxlc3MiIGlmCi0JICAgIHRoZSB0YWcgY2FuIGhhdmUgYSBib2R5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlIgotCQkgICB0eXBlPSJqMmVlOnZhcmlhYmxlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLQkJICAgdHlwZT0iajJlZTp0bGQtYXR0cmlidXRlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImR5bmFtaWMtYXR0cmlidXRlcyIKLQkJICAgdHlwZT0iajJlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KLQkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGEgdGFnLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iajJlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRhZyBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0Ci0JICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtYXR0cmlidXRlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGF0dHJpYnV0ZSBlbGVtZW50IGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZwotCXRhZy4gIFRoZSBhdHRyaWJ1dHJlIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cwotCWRlZmluaW5nOgotCi0JZGVzY3JpcHRpb24gICAgIGEgZGVzY3JpcHRpb24gb2YgdGhlIGF0dHJpYnV0ZQotCi0JbmFtZSAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLQotCXJlcXVpcmVkICAgICAgICB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3IKLQkJCW9wdGlvbmFsCi0KLQlydGV4cHJ2YWx1ZSAgICAgd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIGEgcnVudGltZSBhdHRyaWJ1dGUKLQotCXR5cGUgICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlcwotCi0JZnJhZ21lbnQgICAgICAgIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgaXMgYSBmcmFnbWVudAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqMmVlOmphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZCIKLQkJICAgdHlwZT0iajJlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvcgotCSAgICBvcHRpb25hbC4KLQotCSAgICBJZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZQotCSAgICB0aGUgYXR0cmlidXRlIGlzIG9wdGlvbmFsLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOnNlcXVlbmNlPgotCSAgPHhzZDplbGVtZW50IG5hbWU9InJ0ZXhwcnZhbHVlIgotCQkgICAgICAgdHlwZT0iajJlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotCQkgICAgICAgbWluT2NjdXJzPSIwIj4KLQkgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQlEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQKLQkJZXhwcmVzc2lvbnMgYXMgYSB2YWx1ZSwgaS5lIHRoZSB2YWx1ZSBvZiB0aGUKLQkJYXR0cmlidXRlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJlcXVlc3QKLQkJdGltZSwgYXMgb3Bwb3NlZCB0byBhIHN0YXRpYyB2YWx1ZSBkZXRlcm1pbmVkIGF0Ci0JCXRyYW5zbGF0aW9uIHRpbWUuCi0KLQkJSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUgdGhlCi0JCWF0dHJpYnV0ZSBoYXMgYSBzdGF0aWMgdmFsdWUKLQotCSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwveHNkOmFubm90YXRpb24+Ci0KLQkgIDwveHNkOmVsZW1lbnQ+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZSIKLQkJICAgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0JICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJRGVmaW5lcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlLiAgRm9yCi0JCXN0YXRpYyB2YWx1ZXMgKHRob3NlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24gdGltZSkKLQkJdGhlIHR5cGUgaXMgYWx3YXlzIGphdmEubGFuZy5TdHJpbmcuCi0KLQkgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPC94c2Q6ZWxlbWVudD4KLQk8L3hzZDpzZXF1ZW5jZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZnJhZ21lbnQiCi0JCSAgICAgdHlwZT0iajJlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMCI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgICJ0cnVlIiBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBvZiB0eXBlCi0JICAgICAgamF2YXguanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCwgcmVwcmVzZW50aW5nIGR5bmFtaWMKLQkgICAgICBjb250ZW50IHRoYXQgY2FuIGJlIHJlLWV2YWx1YXRlZCBhcyBtYW55IHRpbWVzCi0JICAgICAgYXMgbmVlZGVkIGJ5IHRoZSB0YWcgaGFuZGxlci4gIElmIG9taXR0ZWQgb3IgImZhbHNlIiwKLQkgICAgICB0aGUgZGVmYXVsdCBpcyBzdGlsbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcKLQlkZWZpbmVkLgotCi0JVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6eHNkTk1UT0tFTlR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWV4dGVuc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0bGQtZXh0ZW5zaW9uVHlwZSBpcyB1c2VkIHRvIGluZGljYXRlCi0JZXh0ZW5zaW9ucyB0byBhIHNwZWNpZmljIFRMRCBlbGVtZW50LgotCi0JSXQgaXMgdXNlZCBieSBlbGVtZW50cyB0byBkZXNpZ25hdGUgYW4gZXh0ZW5zaW9uIGJsb2NrCi0JdGhhdCBpcyB0YXJnZXRlZCB0byBhIHNwZWNpZmljIGV4dGVuc2lvbiBkZXNpZ25hdGVkIGJ5Ci0JYSBzZXQgb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIHRoYXQgYXJlIGRlY2xhcmVkIGJ5IGEKLQluYW1lc3BhY2UuIFRoZSBuYW1lc3BhY2UgaWRlbnRpZmllcyB0aGUgZXh0ZW5zaW9uIHRvCi0JdGhlIHRvb2wgdGhhdCBwcm9jZXNzZXMgdGhlIGV4dGVuc2lvbi4KLQotCVRoZSB0eXBlIG9mIHRoZSBleHRlbnNpb24tZWxlbWVudCBpcyBhYnN0cmFjdC4gVGhlcmVmb3JlLAotCWEgY29uY3JldGUgdHlwZSBtdXN0IGJlIHNwZWNpZmllZCBieSB0aGUgVExEIHVzaW5nCi0JeHNpOnR5cGUgYXR0cmlidXRlIGZvciBlYWNoIGV4dGVuc2lvbi1lbGVtZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbi1lbGVtZW50IgotCQkgICB0eXBlPSJqMmVlOmV4dGVuc2libGVUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIgotCQkgICB1c2U9InJlcXVpcmVkIgotCQkgICB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGRUYWdsaWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdCwgaXQgZGVmaW5lczoKLQotCWRlc2NyaXB0aW9uICAgICBhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsCi0JCQlzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZQotCi0JZGlzcGxheS1uYW1lICAgIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhCi0JCQlzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkCi0JCQlieSB0b29scwotCi0JaWNvbiAgICAgICAgICAgIG9wdGlvbmFsIGljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCi0JdGxpYi12ZXJzaW9uICAgIHRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbgotCi0Jc2hvcnQtbmFtZSAgICAgIGEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlCi0JCQl1c2VkIGJ5IGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZQotCQkJbmFtZXMgd2l0aCBhIG1uZW1vbmljIHZhbHVlOyBmb3IgZXhhbXBsZSwKLQkJCXRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQgcHJlZml4Ci0JCQl2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcwotCi0JdXJpICAgICAgICAgICAgIGEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCi0KLQl2YWxpZGF0b3IgICAgICAgb3B0aW9uYWwgVGFnTGlicmFyeVZhbGlkYXRvciBpbmZvcm1hdGlvbgotCi0JbGlzdGVuZXIgICAgICAgIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIHNwZWNpZmljYXRpb24KLQotCXRhZyAgICAgICAgICAgICB0YWdzIGluIHRoaXMgdGFnIGxpYnJhcnkKLQotCXRhZy1maWxlICAgICAgICB0YWcgZmlsZXMgaW4gdGhpcyB0YWcgbGlicmFyeQotCi0JZnVuY3Rpb24gICAgICAgIHplcm8gb3IgbW9yZSBFTCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzCi0JCQl0YWcgbGlicmFyeQotCi0JdGFnbGliLWV4dGVuc2lvbiB6ZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCWluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnbGliLCBmb3IgdG9vbAotCQkJY29uc3VtcHRpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGxpYi12ZXJzaW9uIgotCQkgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVzY3JpYmVzIHRoaXMgdmVyc2lvbiAobnVtYmVyKSBvZiB0aGUgdGFnbGlicmFyeS4KLQkgICAgSXQgaXMgZGVzY3JpYmVkIGFzIGEgZGV3ZXkgZGVjaW1hbC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2hvcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIHNpbXBsZSBkZWZhdWx0IG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5Ci0JICAgIGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEKLQkgICAgbW5lbW9uaWN2YWx1ZTsgZm9yIGV4YW1wbGUsIGl0IG1heSBiZSB1c2VkIGFzIHRoZQotCSAgICBwcmVmZXJyZWQgcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzLiAgRG8KLQkgICAgbm90IHVzZSB3aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cwotCSAgICBvciB1bmRlcnNjb3JlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJpIgotCQkgICB0eXBlPSJqMmVlOnhzZEFueVVSSVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzCi0JICAgIHZlcnNpb24gb2YgdGhlIHRhZ2xpYnJhcnkuICBMZWF2ZSBpdCBlbXB0eSBpZiBpdAotCSAgICBkb2VzIG5vdCBhcHBseS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvciIKLQkJICAgdHlwZT0iajJlZTp2YWxpZGF0b3JUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciIKLQkJICAgdHlwZT0iajJlZTpsaXN0ZW5lclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWciCi0JCSAgIHR5cGU9ImoyZWU6dGFnVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1maWxlIgotCQkgICB0eXBlPSJqMmVlOnRhZ0ZpbGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZnVuY3Rpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iajJlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRhZ2xpYiBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0Ci0JICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iMi4wIgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIERlc2NyaWJlcyB0aGUgSlNQIHZlcnNpb24gKG51bWJlcikgdGhpcyB0YWdsaWJyYXJ5Ci0JICByZXF1aXJlcyBpbiBvcmRlciB0byBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkKLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbGlkYXRvclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCUEgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUKLQl0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5IGlzCi0JZGVmaW5lZCBieSBhIHZhbGlkYXRvclR5cGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQKLQkgICAgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcwotCSAgICB0YWcgbGlicmFyeS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4KLQkgICAgaW5pdGlhbGl6YXRpb24gcGFyYW0uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLXNjb3BlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGRlZmluZXMgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4gIFNlZQotCVRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4gIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUsCi0JIk5FU1RFRCIsICJBVF9CRUdJTiIgYW5kICJBVF9FTkQiLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORVNURUQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVF9CRUdJTiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUX0VORCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHZhcmlhYmxlVHlwZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgc2NyaXB0aW5nCi0JdmFyaWFibGVzIGRlZmluZWQgYnkgdXNpbmcgdGhpcyB0YWcuICBJdCBpcyBhICh0cmFuc2xhdGlvbgotCXRpbWUpIGVycm9yIGZvciBhIHRhZyB0aGF0IGhhcyBvbmUgb3IgbW9yZSB2YXJpYWJsZQotCXN1YmVsZW1lbnRzIHRvIGhhdmUgYSBUYWdFeHRyYUluZm8gY2xhc3MgdGhhdCByZXR1cm5zIGEKLQlub24tbnVsbCB2YWx1ZSBmcm9tIGEgY2FsbCB0byBnZXRWYXJpYWJsZUluZm8oKS4KLQotCVRoZSBzdWJlbGVtZW50cyBvZiB2YXJpYWJsZVR5cGUgYXJlIG9mIHRoZSBmb3JtOgotCi0JZGVzY3JpcHRpb24gICAgICAgICAgICAgIE9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMKLQkJCQkgdmFyaWFibGUKLQotCW5hbWUtZ2l2ZW4gICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgbmFtZSBhcyBhIGNvbnN0YW50Ci0KLQluYW1lLWZyb20tYXR0cmlidXRlICAgICAgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlCi0JCQkJICh0cmFuc2xhdGlvbiB0aW1lKSB2YWx1ZSB3aWxsCi0JCQkJIGdpdmUgdGhlIG5hbWUgb2YgdGhlCi0JCQkJIHZhcmlhYmxlLiAgT25lIG9mIG5hbWUtZ2l2ZW4gb3IKLQkJCQkgbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KLQotCXZhcmlhYmxlLWNsYXNzICAgICAgICAgICBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuCi0JCQkJIGphdmEubGFuZy5TdHJpbmcgaXMgZGVmYXVsdC4KLQotCWRlY2xhcmUgICAgICAgICAgICAgICAgICBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZAotCQkJCSBvciBub3QuICBUcnVlIGlzIHRoZSBkZWZhdWx0LgotCi0Jc2NvcGUgICAgICAgICAgICAgICAgICAgIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmFpYmxlCi0JCQkJIGRlZmluZWQuICBORVNURUQgaXMgZGVmYXVsdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWdpdmVuIgotCQkgICAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBuYW1lIGZvciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1mcm9tLWF0dHJpYnV0ZSIKLQkJICAgICB0eXBlPSJqMmVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UKLQkgICAgICAodHJhbnNsYXRpb24tdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mCi0JICAgICAgdGhlIHZhcmlhYmxlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGNsYXNzIGZvciB0aGUgc2NyaXB0aW5nCi0JICAgIHZhcmlhYmxlLiAgVGhlIGRlZmF1bHQgaXMgamF2YS5sYW5nLlN0cmluZy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVjbGFyZSIKLQkJICAgdHlwZT0iajJlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCi0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFdoZXRoZXIgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyB0byBiZSBkZWZpbmVkCi0JICAgIG9yIG5vdC4gIFNlZSBUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuICBUaGlzCi0JICAgIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJ0cnVlIiBpcyB0aGUgZGVmYXVsdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY29wZSIKLQkJICAgdHlwZT0iajJlZTp2YXJpYWJsZS1zY29wZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAiTkVTVEVEIiBpcyB0aGUgZGVmYXVsdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhOGU5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMi4xIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKXdlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2RzCTEuMQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgVGFnbGlicmFyeQotCWRlc2NyaXB0b3IuICBBbGwgVGFnbGlicmFyeSBkZXNjcmlwdG9ycyBtdXN0Ci0JaW5kaWNhdGUgdGhlIHRhZyBsaWJyYXJ5IHNjaGVtYSBieSB1c2luZyB0aGUgVGFnbGlicmFyeQotCW5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCi0JYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPHRhZ2xpYiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0JICAgICAgdmVyc2lvbj0iMi4xIj4KLQkgICAgICAuLi4KLQkgICAgPC90YWdsaWI+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkCi0JdmVyc2lvbiBvZiB0aGUgc2NoZW1hIHVzaW5nIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLQlmb3IgSmF2YSBFRSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYiIgdHlwZT0iamF2YWVlOnRsZFRhZ2xpYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LgotCVRoZSBkZWZpbml0aW9uIG9mIHRhZ2xpYiBpcyBwcm92aWRlZAotCWJ5IHRoZSB0bGRUYWdsaWJUeXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0idGFnLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgdGFnbGliIGVsZW1lbnQgY29udGFpbnMsIGFtb25nIG90aGVyIHRoaW5ncywgdGFnIGFuZAotCSAgdGFnLWZpbGUgZWxlbWVudHMuCi0JICBUaGUgbmFtZSBzdWJlbGVtZW50cyBvZiB0aGVzZSBlbGVtZW50cyBtdXN0IGVhY2ggYmUgdW5pcXVlLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6dGFnfGphdmFlZTp0YWctZmlsZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmdW5jdGlvbi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHRhZ2xpYiBlbGVtZW50IGNvbnRhaW5zIGZ1bmN0aW9uIGVsZW1lbnRzLgotCSAgVGhlIG5hbWUgc3ViZWxlbWVudHMgb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBlYWNoIGJlIHVuaXF1ZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmZ1bmN0aW9uIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6bmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICA8L3hzZDplbGVtZW50PgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJvZHktY29udGVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgYm9keSB0aGF0IGlzIHZhbGlkIGZvciBhIHRhZy4KLQlUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGhlIEpTUCBjb250YWluZXIgdG8gdmFsaWRhdGUKLQl0aGF0IGEgdGFnIGludm9jYXRpb24gaGFzIHRoZSBjb3JyZWN0IGJvZHkgc3ludGF4IGFuZAotCWJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMgdG8gYXNzaXN0IHRoZSBwYWdlIGF1dGhvcgotCWluIHByb3ZpZGluZyBhIHZhbGlkIHRhZyBib2R5LgotCi0JVGhlcmUgYXJlIGN1cnJlbnRseSBmb3VyIHZhbHVlcyBzcGVjaWZpZWQ6Ci0KLQl0YWdkZXBlbmRlbnQgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnCi0JCQlpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseQotCQkJaW4gYSBkaWZmZXJlbnQgImxhbmd1YWdlIiwgZS5nIGVtYmVkZGVkIFNRTAotCQkJc3RhdGVtZW50cy4KLQotCUpTUCAgICAgICAgICAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1AKLQkJCXN5bnRheC4KLQotCWVtcHR5ICAgICAgICAgICBUaGUgYm9keSBtdXN0IGJlIGVtcHR5Ci0KLQlzY3JpcHRsZXNzICAgICAgVGhlIGJvZHkgYWNjZXB0cyBvbmx5IHRlbXBsYXRlIHRleHQsIEVMCi0JCQlFeHByZXNzaW9ucywgYW5kIEpTUCBhY3Rpb24gZWxlbWVudHMuICBObwotCQkJc2NyaXB0aW5nIGVsZW1lbnRzIGFyZSBhbGxvd2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRhZ2RlcGVuZGVudCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpTUCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVtcHR5Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2NyaXB0bGVzcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2libGVUeXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGV4dGVuc2libGVUeXBlIGlzIGFuIGFic3RyYWN0IGJhc2UgdHlwZSB0aGF0IGlzIHVzZWQgdG8KLQlkZWZpbmUgdGhlIHR5cGUgb2YgZXh0ZW5zaW9uLWVsZW1lbnRzLiBJbnN0YW5jZSBkb2N1bWVudHMKLQltdXN0IHN1YnN0aXR1dGUgYSBrbm93biB0eXBlIHRvIGRlZmluZSB0aGUgZXh0ZW5zaW9uIGJ5Ci0JdXNpbmcgeHNpOnR5cGUgYXR0cmlidXRlIHRvIGRlZmluZSB0aGUgYWN0dWFsIHR5cGUgb2YKLQlleHRlbnNpb24tZWxlbWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdW5jdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBmdW5jdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBlYWNoCi0JZnVuY3Rpb24gaW4gdGhlIHRhZyBsaWJyYXJ5IHRoYXQgaXMgdG8gYmUgZXhwb3NlZCB0byB0aGUgRUwuCi0KLQlUaGUgZnVuY3Rpb24gZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotCi0JZGVzY3JpcHRpb24gICAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQotCWRpc3BsYXktbmFtZSAgICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLQkJCSAgICBkaXNwbGF5ZWQgYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKLQkJCSAgICBieSB0b29scwotCi0JbmFtZSAgICAgICAgICAgICAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uCi0KLQlmdW5jdGlvbi1jbGFzcyAgICAgIFByb3ZpZGVzIHRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQKLQkJCSAgICBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbgotCi0JZnVuY3Rpb24tc2lnbmF0dXJlICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBhcyBpbiB0aGUgSmF2YQotCQkJICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIG9mIHRoZSBKYXZhCi0JCQkgICAgbWV0aG9kIHRoYXQgaXMgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQKLQkJCSAgICB0aGUgZnVuY3Rpb24uCi0KLQlleGFtcGxlICAgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCi0JCQkgICAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIGZ1bmN0aW9uCi0KLQlmdW5jdGlvbi1leHRlbnNpb24gIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQotCQkJICAgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZnVuY3Rpb24sIGZvciB0b29sCi0JCQkgICAgY29uc3VtcHRpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBQcm92aWRlcyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEKLQkgICAgY2xhc3MgY29udGFpbmluZyB0aGUgc3RhdGljIG1ldGhvZCB0aGF0IGltcGxlbWVudHMKLQkgICAgdGhlIGZ1bmN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tc2lnbmF0dXJlIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgb2YgdGhlIHN0YXRpYyBKYXZhIG1ldGhvZCB0aGF0IGlzCi0JICAgIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbi4gIFRoZSBzeW50YXggb2YgdGhlCi0JICAgIGZ1bmN0aW9uLXNpZ25hdHVyZSBlbGVtZW50IGlzIGFzIGZvbGxvd3M6Ci0KLQkJRnVuY3Rpb25TaWduYXR1cmUgOjo9IFJldHVyblR5cGUgUyBNZXRob2ROYW1lIFM/Ci0JCQkJICAgICAgJygnIFM/IFBhcmFtZXRlcnM/IFM/ICcpJwotCi0gICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgICAgOjo9IFR5cGUKLQotCQlNZXRob2ROYW1lICAgICAgICA6Oj0gSWRlbnRpZmllcgotCi0JCVBhcmFtZXRlcnMgICAgICAgIDo6PSAgIFBhcmFtZXRlcgotCQkJCSAgICAgIHwgKCBQYXJhbWV0ZXIgUz8gJywnIFM/IFBhcmFtZXRlcnMgKQotCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyICAgICAgICAgOjo9IFR5cGUKLQotCQlXaGVyZToKLQotIAkJICAgICogVHlwZSBpcyBhIGJhc2ljIHR5cGUgb3IgYSBmdWxseSBxdWFsaWZpZWQKLQkJICAgICAgSmF2YSBjbGFzcyBuYW1lIChpbmNsdWRpbmcgcGFja2FnZSBuYW1lKSwKLQkJICAgICAgYXMgcGVyIHRoZSAnVHlwZScgcHJvZHVjdGlvbiBpbiB0aGUgSmF2YQotCQkgICAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBTZWNvbmQgRWRpdGlvbiwKLQkJICAgICAgQ2hhcHRlciAxOC4KLQotICAgICAgICAgICAgICAgICAgICAqIElkZW50aWZpZXIgaXMgYSBKYXZhIGlkZW50aWZpZXIsIGFzIHBlcgotCQkgICAgICB0aGUgJ0lkZW50aWZpZXInIHByb2R1Y3Rpb24gaW4gdGhlIEphdmEKLQkJICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kCi0JCSAgICAgIEVkaXRpb24sIENoYXB0ZXIgMTguCi0KLQkgICAgRXhhbXBsZToKLQotCSAgICBqYXZhLmxhbmcuU3RyaW5nIG5pY2tOYW1lKCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQgKQotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KLQkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIEZ1bmN0aW9uIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdAotICAgICAgICAgICAgYWZmZWN0IHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdGaWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVmaW5lcyBhbiBhY3Rpb24gaW4gdGhpcyB0YWcgbGlicmFyeSB0aGF0IGlzIGltcGxlbWVudGVkCi0JYXMgYSAudGFnIGZpbGUuCi0KLQlUaGUgdGFnLWZpbGUgZWxlbWVudCBoYXMgdHdvIHJlcXVpcmVkIHN1YmVsZW1lbnRzOgotCi0JZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0KLQlkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotCQkJICBkaXNwbGF5ZWQgYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCi0JCQkgIGJ5IHRvb2xzCi0KLQluYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0KLQlwYXRoICAgICAgICAgICAgICBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMKLQkJCSAgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCi0JCQkgIGFwcGxpY2F0aW9uIG9yIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSBmb3IgYQotCQkJICB0YWcgbGlicmFyeSBwYWNrYWdlZCBpbiBhIEpBUi4gIFRoaXMgbXVzdAotCQkJICBiZWdpbiB3aXRoIC9XRUItSU5GL3RhZ3MgaWYgdGhlIC50YWcgZmlsZQotCQkJICByZXNpZGVzIGluIHRoZSBXQVIsIG9yIC9NRVRBLUlORi90YWdzIGlmIHRoZQotCQkJICAudGFnIGZpbGUgcmVzaWRlcyBpbiBhIEpBUi4KLQotCWV4YW1wbGUgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCi0JCQkgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyB0YWcKLQotCXRhZy1leHRlbnNpb24gICAgIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQotCQkJICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywgZm9yIHRvb2wKLQkJCSAgY29uc3VtcHRpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGF0aCIKLQkJICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KLQkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGEgdGFnLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1leHRlbnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGFnIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKLQkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWcgZGVmaW5lcyBhIHVuaXF1ZSB0YWcgaW4gdGhpcyB0YWcgbGlicmFyeS4gIEl0IGhhcyBvbmUKLQlhdHRyaWJ1dGUsIGlkLgotCi0JVGhlIHRhZyBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6Ci0KLQlkZXNjcmlwdGlvbiAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQotCWRpc3BsYXktbmFtZSAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi0JCQkgIGRpc3BsYXllZCBieSB0b29scwotCi0JaWNvbiAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKLQkJCSAgYnkgdG9vbHMKLQotCW5hbWUgICAgICAgICAgICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKLQotCXRhZy1jbGFzcyAgICAgICAgIFRoZSB0YWcgaGFuZGxlciBjbGFzcyBpbXBsZW1lbnRpbmcKLQkJCSAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcFRhZwotCi0JdGVpLWNsYXNzICAgICAgICAgQW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YKLQkJCSAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotCi0JYm9keS1jb250ZW50ICAgICAgVGhlIGJvZHkgY29udGVudCB0eXBlCi0KLQl2YXJpYWJsZSAgICAgICAgICBPcHRpb25hbCBzY3JpcHRpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24KLQotCWF0dHJpYnV0ZSAgICAgICAgIEFsbCBhdHRyaWJ1dGVzIG9mIHRoaXMgYWN0aW9uIHRoYXQgYXJlCi0JCQkgIGV2YWx1YXRlZCBwcmlvciB0byBpbnZvY2F0aW9uLgotCi0JZHluYW1pYy1hdHRyaWJ1dGVzIFdoZXRoZXIgdGhpcyB0YWcgc3VwcG9ydHMgYWRkaXRpb25hbAotCQkJICAgYXR0cmlidXRlcyB3aXRoIGR5bmFtaWMgbmFtZXMuICBJZgotCQkJICAgdHJ1ZSwgdGhlIHRhZy1jbGFzcyBtdXN0IGltcGxlbWVudCB0aGUKLQkJCSAgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5EeW5hbWljQXR0cmlidXRlcwotCQkJICAgaW50ZXJmYWNlLiAgRGVmYXVsdHMgdG8gZmFsc2UuCi0KLQlleGFtcGxlICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgotCQkJICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgdGFnCi0KLQl0YWctZXh0ZW5zaW9uICAgICBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCSAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWcsIGZvciB0b29sCi0JCQkgIGNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJsdmV0LmpzcC50YWdleHQuSnNwVGFnCi0JICAgIHRoYXQgaW1wbGVtZW50cyB0aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IKLQkgICAgdGhpcyB0YWcuIChyZXF1aXJlZCkKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlaS1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLQkgICAgZm9yIHRoaXMgdGFnLiAob3B0aW9uYWwpCi0KLQkgICAgSWYgdGhpcyBpcyBub3QgZ2l2ZW4sIHRoZSBjbGFzcyBpcyBub3QgY29uc3VsdGVkIGF0Ci0JICAgIHRyYW5zbGF0aW9uIHRpbWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYm9keS1jb250ZW50IgotCQkgICB0eXBlPSJqYXZhZWU6Ym9keS1jb250ZW50VHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFNwZWNpZmllcyB0aGUgZm9ybWF0IGZvciB0aGUgYm9keSBvZiB0aGlzIHRhZy4KLQkgICAgVGhlIGRlZmF1bHQgaW4gSlNQIDEuMiB3YXMgIkpTUCIgYnV0IGJlY2F1c2UgdGhpcwotCSAgICBpcyBhbiBpbnZhbGlkIHNldHRpbmcgZm9yIHNpbXBsZSB0YWcgaGFuZGxlcnMsIHRoZXJlCi0JICAgIGlzIG5vIGxvbmdlciBhIGRlZmF1bHQgaW4gSlNQIDIuMC4gIEEgcmVhc29uYWJsZQotCSAgICBkZWZhdWx0IGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzIGlzICJzY3JpcHRsZXNzIiBpZgotCSAgICB0aGUgdGFnIGNhbiBoYXZlIGEgYm9keS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZSIKLQkJICAgdHlwZT0iamF2YWVlOnZhcmlhYmxlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1hdHRyaWJ1dGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHluYW1pYy1hdHRyaWJ1dGVzIgotCQkgICB0eXBlPSJqYXZhZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KLQkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGEgdGFnLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1leHRlbnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGFnIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKLQkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1hdHRyaWJ1dGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXR0cmlidXRlIGVsZW1lbnQgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nCi0JdGFnLiAgVGhlIGF0dHJpYnV0ZSBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMKLQlkZWZpbmluZzoKLQotCWRlc2NyaXB0aW9uICAgICBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhdHRyaWJ1dGUKLQotCW5hbWUgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0KLQlyZXF1aXJlZCAgICAgICAgd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCi0JCQlvcHRpb25hbAotCi0JcnRleHBydmFsdWUgICAgIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBhIHJ1bnRpbWUgYXR0cmlidXRlCi0KLQl0eXBlICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMKLQotCWZyYWdtZW50ICAgICAgICB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGlzIGEgZnJhZ21lbnQKLQotICAgICAgICBkZWZlcnJlZC12YWx1ZSAgcHJlc2VudCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyB0byBiZSBwYXJzZWQgYXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uCi0KLSAgICAgICAgZGVmZXJyZWQtbWV0aG9kIHByZXNlbnQgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgdG8gYmUgcGFyc2VkIGFzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWlyZWQiCi0JCSAgIHR5cGU9ImphdmFlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvcgotCSAgICBvcHRpb25hbC4KLQotCSAgICBJZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZQotCSAgICB0aGUgYXR0cmlidXRlIGlzIG9wdGlvbmFsLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJydGV4cHJ2YWx1ZSIKLQkJICAgICAgICAgdHlwZT0iamF2YWVlOmdlbmVyaWMtYm9vbGVhblR5cGUiPgotCSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkgIERlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldAotCQkgIGV4cHJlc3Npb25zIGFzIGEgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlCi0JCSAgYXR0cmlidXRlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJlcXVlc3QKLQkJICB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQKLQkJICB0cmFuc2xhdGlvbiB0aW1lLgotCQkgIElmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZQotCQkgIGF0dHJpYnV0ZSBoYXMgYSBzdGF0aWMgdmFsdWUKLQotCSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCSAgICA8L3hzZDplbGVtZW50PgotCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZSIKLQkJICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0JICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCSAgRGVmaW5lcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlLgotICAgICAgICAgICAgICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG9taXR0ZWQsIHRoZSBleHBlY3RlZCB0eXBlIGlzCi0gICAgICAgICAgICAgICAgICBhc3N1bWVkIHRvIGJlICJqYXZhLmxhbmcuT2JqZWN0Ii4KLQotCSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCSAgICA8L3hzZDplbGVtZW50PgotCSAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLQkgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmVycmVkLXZhbHVlIgotCQkgICAgICAgICB0eXBlPSJqYXZhZWU6dGxkLWRlZmVycmVkLXZhbHVlVHlwZSIKLQkJICAgICAgICAgbWluT2NjdXJzPSIwIj4KLQkgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgIFByZXNlbnQgaWYgdGhlIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSBpcyB0byBiZQotICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSB0YWcgaGFuZGxlciBhcyBhCi0gICAgICAgICAgICAgICAgICBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24uIFRoaXMgYWxsb3dzIGZvciBkZWZlcnJlZAotICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiBFTCBleHByZXNzaW9ucy4gQW4gb3B0aW9uYWwgc3ViZWxlbWVudAotICAgICAgICAgICAgICAgICAgd2lsbCBjb250YWluIHRoZSBleHBlY3RlZCB0eXBlIHRoYXQgdGhlIHZhbHVlIHdpbGwKLSAgICAgICAgICAgICAgICAgIGJlIGNvZXJjZWQgdG8gYWZ0ZXIgZXZhbHVhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbi4KLSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIGRlZmF1bHRzIHRvIE9iamVjdCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLgotCi0JICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0JICAgIDwveHNkOmVsZW1lbnQ+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZlcnJlZC1tZXRob2QiCi0JCSAgICAgICB0eXBlPSJqYXZhZWU6dGxkLWRlZmVycmVkLW1ldGhvZFR5cGUiCi0JCSAgICAgICBtaW5PY2N1cnM9IjAiPgotCSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFByZXNlbnQgaWYgdGhlIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSBpcyB0byBiZQotICAgICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgdGFnIGhhbmRsZXIgYXMgYQotICAgICAgICAgICAgICAgIGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24uIFRoaXMgYWxsb3dzIGZvciBkZWZlcnJlZAotICAgICAgICAgICAgICAgIGV2YWx1YXRpb24gb2YgYW4gRUwgZXhwcmVzc2lvbiB0aGF0IGlkZW50aWZpZXMgYQotICAgICAgICAgICAgICAgIG1ldGhvZCB0byBiZSBpbnZva2VkIG9uIGFuIE9iamVjdC4gQW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICBzdWJlbGVtZW50IHdpbGwgY29udGFpbiB0aGUgZXhwZWN0ZWQgbWV0aG9kCi0gICAgICAgICAgICAgICAgc2lnbmF0dXJlLiBUaGUgc2lnbmF0dXJlIGRlZmF1bHRzIHRvICJ2b2lkIG1ldGhvZCgpIgotICAgICAgICAgICAgICAgIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuCi0KLQkgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotCi0JPHhzZDplbGVtZW50IG5hbWU9ImZyYWdtZW50IgotCQkgICAgIHR5cGU9ImphdmFlZTpnZW5lcmljLWJvb2xlYW5UeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMCI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgICJ0cnVlIiBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBvZiB0eXBlCi0JICAgICAgamF2YXguanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCwgcmVwcmVzZW50aW5nIGR5bmFtaWMKLQkgICAgICBjb250ZW50IHRoYXQgY2FuIGJlIHJlLWV2YWx1YXRlZCBhcyBtYW55IHRpbWVzCi0JICAgICAgYXMgbmVlZGVkIGJ5IHRoZSB0YWcgaGFuZGxlci4gIElmIG9taXR0ZWQgb3IgImZhbHNlIiwKLQkgICAgICB0aGUgZGVmYXVsdCBpcyBzdGlsbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZwotCWRlZmluZWQuCi0KLQlUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnhzZE5NVE9LRU5UeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1kZWZlcnJlZC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gcHJvdmlkZSB0aGUgdmFsdWUgZm9yIGEKLSAgICAgICAgdGFnIGhhbmRsZXIgYXR0cmlidXRlIHRoYXQgYWNjZXB0cyBhIGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24uCi0KLQlUaGUgZGVmZXJyZWQtbWV0aG9kIGVsZW1lbnQgaGFzIG9uZSBvcHRpb25hbCBzdWJlbGVtZW50OgotCi0JbWV0aG9kLXNpZ25hdHVyZSAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgYXMgaW4gdGhlIEphdmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWVzLCB0aGF0IGlzIGV4cGVjdGVkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWV0aG9kIGJlaW5nIGlkZW50aWZpZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXNpZ25hdHVyZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFByb3ZpZGVzIHRoZSBleHBlY3RlZCBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZCBpZGVudGlmaWVkCi0gICAgICAgICAgICBieSB0aGUgamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbi4KLQotICAgICAgICAgICAgVGhpcyBkaXNhbWJpZ3VhdGVzIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgZW5zdXJlcyB0aGF0Ci0gICAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlLgotCi0gICAgICAgICAgICBUaGUgc3ludGF4IG9mIHRoZSBtZXRob2Qtc2lnbmF0dXJlIGVsZW1lbnQgaXMgaWRlbnRpY2FsCi0gICAgICAgICAgICB0byB0aGF0IG9mIHRoZSBmdW5jdGlvbi1zaWduYXR1cmUgZWxlbWVudC4gIFNlZSB0aGUKLSAgICAgICAgICAgIGRvY3VtZW50YXRpb24gZm9yIGZ1bmN0aW9uLXNpZ25hdHVyZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0JICAgIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaXMgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMgb25seQotCSAgICBhbmQgaXMgaWdub3JlZCBieSB0aGUgSlNQIGNvbnRhaW5lci4KLQotICAgICAgICAgICAgRXhhbXBsZToKLQotICAgICAgICAgICAgICBib29sZWFuIHZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcpCi0KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1kZWZlcnJlZC12YWx1ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBwcm92aWRlIHRoZSB2YWx1ZSBmb3IgYQotICAgICAgICB0YWcgaGFuZGxlciBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGEgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uLgotCi0JVGhlIGRlZmVycmVkLXZhbHVlIGVsZW1lbnQgaGFzIG9uZSBvcHRpb25hbCBzdWJlbGVtZW50OgotCi0JdHlwZSAgICAgICAgICAgIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIHRoYXQgaXMgdGhlCi0gICAgICAgICAgICBleHBlY3RlZCB0eXBlIGZvciB0aGlzIGRlZmVycmVkIGV4cHJlc3Npb24uICBJZiB0aGlzCi0gICAgICAgICAgICBlbGVtZW50IGlzIG9taXR0ZWQsIHRoZSBleHBlY3RlZCB0eXBlIGlzIGFzc3VtZWQgdG8gYmUKLSAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0Ii4KLQotICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWV4dGVuc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0bGQtZXh0ZW5zaW9uVHlwZSBpcyB1c2VkIHRvIGluZGljYXRlCi0JZXh0ZW5zaW9ucyB0byBhIHNwZWNpZmljIFRMRCBlbGVtZW50LgotCi0JSXQgaXMgdXNlZCBieSBlbGVtZW50cyB0byBkZXNpZ25hdGUgYW4gZXh0ZW5zaW9uIGJsb2NrCi0JdGhhdCBpcyB0YXJnZXRlZCB0byBhIHNwZWNpZmljIGV4dGVuc2lvbiBkZXNpZ25hdGVkIGJ5Ci0JYSBzZXQgb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIHRoYXQgYXJlIGRlY2xhcmVkIGJ5IGEKLQluYW1lc3BhY2UuIFRoZSBuYW1lc3BhY2UgaWRlbnRpZmllcyB0aGUgZXh0ZW5zaW9uIHRvCi0JdGhlIHRvb2wgdGhhdCBwcm9jZXNzZXMgdGhlIGV4dGVuc2lvbi4KLQotCVRoZSB0eXBlIG9mIHRoZSBleHRlbnNpb24tZWxlbWVudCBpcyBhYnN0cmFjdC4gVGhlcmVmb3JlLAotCWEgY29uY3JldGUgdHlwZSBtdXN0IGJlIHNwZWNpZmllZCBieSB0aGUgVExEIHVzaW5nCi0JeHNpOnR5cGUgYXR0cmlidXRlIGZvciBlYWNoIGV4dGVuc2lvbi1lbGVtZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbi1lbGVtZW50IgotCQkgICB0eXBlPSJqYXZhZWU6ZXh0ZW5zaWJsZVR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiCi0JCSAgIHVzZT0icmVxdWlyZWQiCi0JCSAgIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZFRhZ2xpYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgotCi0JZGVzY3JpcHRpb24gICAgIGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzCi0JCQl0YWdsaWIsIHNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCi0KLQlkaXNwbGF5LW5hbWUgICAgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEKLQkJCXNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQKLQkJCWJ5IHRvb2xzCi0KLQlpY29uICAgICAgICAgICAgb3B0aW9uYWwgaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0KLQl0bGliLXZlcnNpb24gICAgdGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCi0KLQlzaG9ydC1uYW1lICAgICAgYSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUKLQkJCXVzZWQgYnkgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlCi0JCQluYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLAotCQkJdGhlIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXgKLQkJCXZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCi0KLQl1cmkgICAgICAgICAgICAgYSB1cmkgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhpcyB0YWdsaWIKLQotCXZhbGlkYXRvciAgICAgICBvcHRpb25hbCBUYWdMaWJyYXJ5VmFsaWRhdG9yIGluZm9ybWF0aW9uCi0KLQlsaXN0ZW5lciAgICAgICAgb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgc3BlY2lmaWNhdGlvbgotCi0JdGFnICAgICAgICAgICAgIHRhZ3MgaW4gdGhpcyB0YWcgbGlicmFyeQotCi0JdGFnLWZpbGUgICAgICAgIHRhZyBmaWxlcyBpbiB0aGlzIHRhZyBsaWJyYXJ5Ci0KLQlmdW5jdGlvbiAgICAgICAgemVybyBvciBtb3JlIEVMIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMKLQkJCXRhZyBsaWJyYXJ5Ci0KLQl0YWdsaWItZXh0ZW5zaW9uIHplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQotCQkJaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWdsaWIsIGZvciB0b29sCi0JCQljb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRsaWItdmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVzY3JpYmVzIHRoaXMgdmVyc2lvbiAobnVtYmVyKSBvZiB0aGUgdGFnbGlicmFyeS4KLQkgICAgSXQgaXMgZGVzY3JpYmVkIGFzIGEgZGV3ZXkgZGVjaW1hbC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2hvcnQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGEgc2ltcGxlIGRlZmF1bHQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKLQkgICAgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYQotCSAgICBtbmVtb25pY3ZhbHVlOyBmb3IgZXhhbXBsZSwgaXQgbWF5IGJlIHVzZWQgYXMgdGhlCi0JICAgIHByZWZlcnJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMuICBEbwotCSAgICBub3QgdXNlIHdoaXRlIHNwYWNlLCBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzCi0JICAgIG9yIHVuZGVyc2NvcmUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmkiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RBbnlVUklUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcwotCSAgICB2ZXJzaW9uIG9mIHRoZSB0YWdsaWJyYXJ5LiAgTGVhdmUgaXQgZW1wdHkgaWYgaXQKLQkgICAgZG9lcyBub3QgYXBwbHkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiCi0JCSAgIHR5cGU9ImphdmFlZTp2YWxpZGF0b3JUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciIKLQkJICAgdHlwZT0iamF2YWVlOmxpc3RlbmVyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZyIKLQkJICAgdHlwZT0iamF2YWVlOnRhZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZmlsZSIKLQkJICAgdHlwZT0iamF2YWVlOnRhZ0ZpbGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpmdW5jdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUYWdsaWIgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90Ci0gICAgICAgICAgICBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjIuMSIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeQotCSAgcmVxdWlyZXMgaW4gb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWxpZGF0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlBIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlCi0JdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeSBpcwotCWRlZmluZWQgYnkgYSB2YWxpZGF0b3JUeXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZAotCSAgICB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzCi0JICAgIHRhZyBsaWJyYXJ5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImphdmFlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuCi0JICAgIGluaXRpYWxpemF0aW9uIHBhcmFtLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1zY29wZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBTZWUKLQlUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuICBUaGUgYWxsb3dlZCB2YWx1ZXMgYXJlLAotCSJORVNURUQiLCAiQVRfQkVHSU4iIGFuZCAiQVRfRU5EIi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJORVNURUQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVF9CRUdJTiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUX0VORCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHZhcmlhYmxlVHlwZSBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgc2NyaXB0aW5nCi0JdmFyaWFibGVzIGRlZmluZWQgYnkgdXNpbmcgdGhpcyB0YWcuICBJdCBpcyBhICh0cmFuc2xhdGlvbgotCXRpbWUpIGVycm9yIGZvciBhIHRhZyB0aGF0IGhhcyBvbmUgb3IgbW9yZSB2YXJpYWJsZQotCXN1YmVsZW1lbnRzIHRvIGhhdmUgYSBUYWdFeHRyYUluZm8gY2xhc3MgdGhhdCByZXR1cm5zIGEKLQlub24tbnVsbCB2YWx1ZSBmcm9tIGEgY2FsbCB0byBnZXRWYXJpYWJsZUluZm8oKS4KLQotCVRoZSBzdWJlbGVtZW50cyBvZiB2YXJpYWJsZVR5cGUgYXJlIG9mIHRoZSBmb3JtOgotCi0JZGVzY3JpcHRpb24gICAgICAgICAgICAgIE9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMKLQkJCQkgdmFyaWFibGUKLQotCW5hbWUtZ2l2ZW4gICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgbmFtZSBhcyBhIGNvbnN0YW50Ci0KLQluYW1lLWZyb20tYXR0cmlidXRlICAgICAgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlCi0JCQkJICh0cmFuc2xhdGlvbiB0aW1lKSB2YWx1ZSB3aWxsCi0JCQkJIGdpdmUgdGhlIG5hbWUgb2YgdGhlCi0JCQkJIHZhcmlhYmxlLiAgT25lIG9mIG5hbWUtZ2l2ZW4gb3IKLQkJCQkgbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KLQotCXZhcmlhYmxlLWNsYXNzICAgICAgICAgICBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuCi0JCQkJIGphdmEubGFuZy5TdHJpbmcgaXMgZGVmYXVsdC4KLQotCWRlY2xhcmUgICAgICAgICAgICAgICAgICBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZAotCQkJCSBvciBub3QuICBUcnVlIGlzIHRoZSBkZWZhdWx0LgotCi0Jc2NvcGUgICAgICAgICAgICAgICAgICAgIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmFpYmxlCi0JCQkJIGRlZmluZWQuICBORVNURUQgaXMgZGVmYXVsdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZ2l2ZW4iCi0JCSAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCi0JPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZnJvbS1hdHRyaWJ1dGUiCi0JCSAgICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UKLQkgICAgICAodHJhbnNsYXRpb24tdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mCi0JICAgICAgdGhlIHZhcmlhYmxlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgY2xhc3MgZm9yIHRoZSBzY3JpcHRpbmcKLQkgICAgdmFyaWFibGUuICBUaGUgZGVmYXVsdCBpcyBqYXZhLmxhbmcuU3RyaW5nLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWNsYXJlIgotCQkgICB0eXBlPSJqYXZhZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBXaGV0aGVyIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgdG8gYmUgZGVmaW5lZAotCSAgICBvciBub3QuICBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhpcwotCSAgICBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAidHJ1ZSIgaXMgdGhlIGRlZmF1bHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NvcGUiCi0JCSAgIHR5cGU9ImphdmFlZTp2YXJpYWJsZS1zY29wZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAiTkVTVEVEIiBpcyB0aGUgZGVmYXVsdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDAwNjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcwotQnVuZGxlLU5hbWUuMCA9IEpFRSBSZWxhdGVkIFNjaGVtYXMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2UzOTFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCi0gICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgIDwhLS0gQ2F0YWxvZyBDb250cmlidXRpb25zICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFJlZ2lzdGVyIHdlbGwga25vd24gV2ViIERURHMgYW5kIFhTRHMgICAgLS0+Ci0gICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4KLSAgICAgICAgPGNhdGFsb2dDb250cmlidXRpb24gaWQ9ImRlZmF1bHQiPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4yLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfMi5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9hcHBsaWNhdGlvbl8xXzIuZHRkIiAvPgotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV8zLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV80LnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl81LnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIENsaWVudCAxLjIvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfMi5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8yLmR0ZCIgLz4KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IDEuMy8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfMC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9jb25uZWN0b3JfMV8wLmR0ZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvY29ubmVjdG9yXzFfNS54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMV8xLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2VqYi1qYXJfMV8xLmR0ZCIgLz4KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9lamItamFyXzJfMC5kdGQiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfM18wLnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS8iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qMmVlXzFfNC54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIiAvPgotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qMmVlX2pheHJwY19tYXBwaW5nXzFfMS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfNS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qYXZhZWVfNS54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkIiAvPgotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qc3BfMl8wLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2pzcF8yXzAueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvanNwXzJfMS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qc3BfMl8xLnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8yLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMi4yLmR0ZCIgLz4KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzMuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIiAvPgotCi0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl80LnhzZCIgLz4KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfNS54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMS8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZCIgLz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZCIgLz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMC5kdGQiIC8+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMS8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIiAvPgotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiIC8+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtXzFfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9vcm1fMV8wLnhzZCIgLz4KLSAgIAotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlXzFfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9wZXJzaXN0ZW5jZV8xXzAueHNkIiAvPiAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgPC9jYXRhbG9nQ29udHJpYnV0aW9uPgotCi0gICAgPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0ZjEyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vY3NzLyoqLyoiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWJmNjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWNzc21vZGVsLmphcgotYnVpbGQueG1sCi1kZXYucHJvcGVydGllcwotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOTc1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9kZWJ1Zy90cmFjZWZpbHRlcj0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjA0NmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWRjMjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSNXZWQgTWFyIDI4IDAzOjEzOjUyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZjA3MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMzAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcno7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0iWzIuOS4wLDMuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5O2V4Y2x1ZGU6PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmEyODMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGNzc3Byb2ZpbGUvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2MDMzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNzcyI+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL2Nzcy9vdmVydmlldy5odG1sIj48L2Rlc2NyaXB0aW9uPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MucHJvcGVydGllcyIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkNTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkNTU0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzLXByb2ZpbGUuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3MtcHJvZmlsZS5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYjNlZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3MtcHJvZmlsZS5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPCEtLSBEVEQgZm9yIENTUyBNZXRhIE1vZGVsIFByb2ZpbGUgLS0+Ci08IS0tCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLS0+Ci08IS0tIEVudGl0aWVzIC0tPgotCi08IS0tIG5hbWUtZGVmaW5pdGlvbgk6IEluIGRlZmluaW5nIG1ldGEgbW9kZWwgb2JqZWN0LCBvYmplY3QgbmFtZSAtLT4KLTwhLS0gaXMgZ2l2ZW4gYnkgdXNpbmcgdGhpcyBhdHRyaWJ1dGUuIC0tPgotCi08IUVOVElUWSAlIG5hbWUtZGVmaW5pdGlvbiAnbmFtZSBDREFUQSAjUkVRVUlSRUQnID4KLQotPCEtLSBuYW1lLXJlZmVyZW5jZQkJOiB1c2VkIHRvIHJlZmVyIG1ldGEgbW9kZWwgb2JqZWN0IHRoYXQgZGVmaW5lZCAtLT4KLTwhLS0gYnkgbmFtZS1kZWZpbml0aW9uIC0tPgotCi08IUVOVElUWSAlIG5hbWUtcmVmZXJlbmNlICduYW1lIENEQVRBICNSRVFVSVJFRCcgPgotCi08IS0tIGF2YWlsYWJpbGl0eQkJOiBDU1MgTWV0YSBNb2RlbCBQcm9maWxlIHBlcm1pdCBpbXBvcnRpbmcgLS0+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+Ci08IUVMRU1FTlQgcHJvcGVydHkgRU1QVFkgPgotPCFBVFRMSVNUIHByb3BlcnR5ICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPiAKLTwhRUxFTUVOVCBkZXNjcmlwdG9yIEVNUFRZID4KLTwhQVRUTElTVCBkZXNjcmlwdG9yICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczEueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGEwZWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTwhLS08IURPQ1RZUEUgY3NzLXByb2ZpbGUgU1lTVEVNICJjc3MtcHJvZmlsZS5kdGQiID4tLT4KLTxjc3MtcHJvZmlsZT4KLQk8c3R5bGVzaGVldC1kZWY+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+Ci08L2Nzcy1wcm9maWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MyLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxYWNiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPCEtLTwhRE9DVFlQRSBjc3MtcHJvZmlsZSBTWVNURU0gImNzcy1wcm9maWxlLmR0ZCIgPi0tPgotPGNzcy1wcm9maWxlPgotCTxzdHlsZXNoZWV0LWRlZj4KLQkJPGRlc2NyaXB0aW9uPiVjc3MyLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPGNoYXJzZXQtcnVsZS8+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+Ci08L2Nzcy1wcm9maWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLW1vYmlsZTFfMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNWQ3NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLW1vYmlsZTFfMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLS0+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+Ci0JPC9jb250YWluZXItZGVmPgotPC9jc3MtcHJvZmlsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtd2FwLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS13YXAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDQwMWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS13YXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPCEtLTwhRE9DVFlQRSBjc3MtcHJvZmlsZSBTWVNURU0gImNzcy1wcm9maWxlLmR0ZCIgPi0tPgotPGNzcy1wcm9maWxlPgotICAgICAgICA8cHJvZmlsZS1pbXBvcnQgbmFtZT0iY3NzcHJvZmlsZS1jc3MyLnhtbCIvPgotICAgICAgICA8c3R5bGVzaGVldC1kZWY+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+dHJ1ZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mYWxzZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBhdXNlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wYXVzZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLQotPC9jc3MtcHJvZmlsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDdlMzk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgY3NzcHJvZmlsZS1jc3MxLnhtbAotY3NzMS5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbj1DYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAxCi1jc3MxLmNhdGVnb3J5LWRlZi5ib3guY2FwdGlvbj1Cb3ggbW9kZWwKLWNzczEuY2F0ZWdvcnktZGVmLmNvbG9yYW5kYmFja2dyb3VuZC5jYXB0aW9uPUNvbG9ycyBhbmQgQmFja2dyb3VuZHMKLWNzczEuY2F0ZWdvcnktZGVmLmNsYXNzaWZpY2F0aW9uLmNhcHRpb249Q2xhc3NpZmljYXRpb24KLWNzczEuY2F0ZWdvcnktZGVmLmZvbnQuY2FwdGlvbj1Gb250Ci1jc3MxLmNhdGVnb3J5LWRlZi50ZXh0LmNhcHRpb249VGV4dAotIyBjc3Nwcm9maWxlLWNzczIueG1sCi1jc3MyLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPUNhc2NhZGluZyBTdHlsZSBTaGVldHMsIGxldmVsIDIKLWNzczIuY2F0ZWdvcnktZGVmLmF1cmFsLmNhcHRpb249QXVyYWwKLWNzczIuY2F0ZWdvcnktZGVmLmJveC5jYXB0aW9uPUJveCBtb2RlbAotY3NzMi5jYXRlZ29yeS1kZWYuY29sb3JhbmRiYWNrZ3JvdW5kLmNhcHRpb249Q29sb3JzIGFuZCBCYWNrZ3JvdW5kcwotY3NzMi5jYXRlZ29yeS1kZWYuY29udGVudC5jYXB0aW9uPUdlbmVyYXRlZCBjb250ZW50L0xpc3QKLWNzczIuY2F0ZWdvcnktZGVmLmZvbnQuY2FwdGlvbj1Gb250cwotY3NzMi5jYXRlZ29yeS1kZWYucGFnZS5jYXB0aW9uPVBhZ2VkIG1lZGlhCi1jc3MyLmNhdGVnb3J5LWRlZi50YWJsZXMuY2FwdGlvbj1UYWJsZXMKLWNzczIuY2F0ZWdvcnktZGVmLnRleHQuY2FwdGlvbj1UZXh0Ci1jc3MyLmNhdGVnb3J5LWRlZi52aXN1YWwuY2FwdGlvbj1WaXN1YWwKLWNzczIuY2F0ZWdvcnktZGVmLnVpLmNhcHRpb249VXNlciBpbnRlcmZhY2UKLSMgY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sCi1tb2JpbGUxXzAuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb249Q1NTIE1vYmlsZSBQcm9maWxlIDEuMAotIyBjc3Nwcm9maWxlLXdhcC54bWwKLXdhcC5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbj1XQ1NTIDEuMAotd2FwLmNhdGVnb3J5LWRlZi53YXAuY2FwdGlvbj1XQ1NTIEV4dGVuc2lvbnMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvZGVzY3JpcHRpb24udHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9kZXNjcmlwdGlvbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzFmMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9kZXNjcmlwdGlvbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotCi0gKiBOb25lIG9mIHRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSAKLSAqIG5lZWQgdG8gYmUgdHJhbnNsYXRlZCAKLSAqIGV4Y2VwdCBmb3IgY3NzcHJvZmlsZS5wcm9wZXJ0aWVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ZjZWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIENTUyBNb2RlbAotY3NzcHJvZmlsZV9jc3MyLm5hbWU9Q1NTMjogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cywgbGV2ZWwgMgotY3NzcHJvZmlsZV9jc3MxLm5hbWU9Q1NTMTogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cywgbGV2ZWwgMQotY3NzcHJvZmlsZV9tb2JpbGUxXzAubmFtZT1DU1MgTW9iaWxlIFByb2ZpbGUgMS4wCi1jc3Nwcm9maWxlX3dhcC5uYW1lPVdDU1MgMS4wCi1TdHJ1Y3R1cmVkX0NTU19Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPVN0cnVjdHVyZWQgQ1NTIERvY3VtZW50IEZhY3RvcnkgRXh0ZW5zaW9uCi1DU1NfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9Q1NTCi1fdGFza01hcmtlci5uYW1lPUNTUyBUYXNrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjdiNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNzc3Byb2ZpbGUiPgotCQk8cHJvZmlsZQotCQkJbmFtZT0iJWNzc3Byb2ZpbGVfY3NzMi5uYW1lIgotCQkJZGVmYXVsdD0idHJ1ZSIKLQkJCXVyaT0iY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczIueG1sIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nwcm9maWxlLmNzczIiPgotCQk8L3Byb2ZpbGU+Ci0JCTxwcm9maWxlCi0JCQluYW1lPSIlY3NzcHJvZmlsZV9jc3MxLm5hbWUiCi0JCQl1cmk9ImNzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MxLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS5jc3MxIj4KLQkJPC9wcm9maWxlPgotCQk8cHJvZmlsZQotCQkJbmFtZT0iJWNzc3Byb2ZpbGVfbW9iaWxlMV8wLm5hbWUiCi0JCQl1cmk9ImNzc3Byb2ZpbGUvY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nwcm9maWxlLm1vYmlsZTFfMCI+Ci0JCTwvcHJvZmlsZT4KLQkJPHByb2ZpbGUKLQkJCW5hbWU9IiVjc3Nwcm9maWxlX3dhcC5uYW1lIgotCQkJdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtd2FwLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS53YXAiPgotCQk8L3Byb2ZpbGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yQ1NTIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIj4KLQkJPHNjYW5uZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3MuQ1NTRmlsZVRhc2tTY2FubmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50YXNrcy5DU1NGaWxlVGFza1NjYW5uZXI6b3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRhc2tNYXJrZXIiCi0JCQljb250ZW50VHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJ0YXNrTWFya2VyIgotCQluYW1lPSIlX3Rhc2tNYXJrZXIubmFtZSIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotCQk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGFza21hcmtlciIvPgotCQk8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzIgotCQluYW1lPSIlU3RydWN0dXJlZF9DU1NfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iY3NzIj4KLQkJPC9maWxlVHlwZXM+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0UHJvY2Vzc29ycyI+Ci0JCTxwcm9jZXNzb3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvckNTUyIKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiPgotCQk8L3Byb2Nlc3Nvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9ImNzcyIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUNTU19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJjc3Nzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0Ij4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkNvbnRlbnREZXNjcmliZXJGb3JDU1MiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIGNzcyBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3OWE5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgQ1NTIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWW91X2Nhbm5vdF91c2VfQ1NTU3R5bGVTaGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xY29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMmNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzNjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF80Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMjVjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8yNmNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzI3Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMjhjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF81Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNmNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzdjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF84Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENTU0NvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5MmVkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENTU0NvcmVQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDU1NDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENTU0NvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJLy8gbGlzdGVuIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMga2V5cwotCQlDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIuc3RhcnR1cCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gc3RvcCBsaXN0ZW5uaW5nIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMKLQkJLy8ga2V5cwotCQlDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIuc2h1dGRvd24oKTsKLQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NzFjZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Zb3VfY2Fubm90X3VzZV9DU1NTdHlsZVNoZV9VSV89WW91IGNhbm5vdCB1c2UgQ1NTU3R5bGVTaGVldC5nZXRPd25lclJ1bGUoKSBiZWNhdXNlIG9mIG1hbnkgcmVmZXJlbmNlcnMgb2YgdGhpcyBydWxlXG5QbGVhc2UgdXNlIGdldE9ud2VyUnVsZXMoKQotXzFjb25jYXRfRVJST1JfPXswfWZpcnN0IGZsYXQgbm9kZSBpcyBudWxsLgotXzJjb25jYXRfRVJST1JfPXswfWZpcnN0IGZsYXQgbm9kZSBpcyBub3QgaW4gbW9kZWwuCi1fM2NvbmNhdF9FUlJPUl89ezB9bGFzdCBmbGF0IG5vZGUgaXMgbnVsbC4KLV80Y29uY2F0X0VSUk9SXz17MH1sYXN0IGZsYXQgbm9kZSBpcyBub3QgaW4gbW9kZWwuCi1fMjVjb25jYXRfRVJST1JfPXswfWZpcnN0IHJlZ2lvbiBpcyBudWxsLgotXzI2Y29uY2F0X0VSUk9SXz17MH1maXJzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLgotXzI3Y29uY2F0X0VSUk9SXz17MH1sYXN0IHJlZ2lvbiBpcyBudWxsLgotXzI4Y29uY2F0X0VSUk9SXz17MH1sYXN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuCi1fNWNvbmNhdF9FUlJPUl89ezB9Zmlyc3QgcmVnaW9uIGlzIG51bGwuCi1fNmNvbmNhdF9FUlJPUl89ezB9Zmlyc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4KLV83Y29uY2F0X0VSUk9SXz17MH1sYXN0IHJlZ2lvbiBpcyBudWxsLgotXzhjb25jYXRfRVJST1JfPXswfWxhc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4KLSMKLUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZz1VcGRhdGluZyBDU1MgQ29udGVudCBTZXR0aW5ncwotQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nPVByb2JsZW0gc2F2aW5nIENTUyBDb250ZW50IFNldHRpbmdzIGZvciB7MH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmZmZGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjZkODZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTQ2xlYW51cFN0cmF0ZWd5IHsKLQotCXN0YXRpYyBmaW5hbCBzaG9ydCBBU0lTID0gMDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgTE9XRVIgPSAxOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUFBFUiA9IDI7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0SWRlbnRDYXNlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0UHJvcE5hbWVDYXNlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0UHJvcFZhbHVlQ2FzZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldFNlbGVjdG9yVGFnQ2FzZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0Zvcm1hdFNvdXJjZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc1F1b3RlVmFsdWVzKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZm9ybWF0U291cmNlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkZW50Q2FzZQotCSAqICAgICAgICAgICAgc2hvcnQKLQkgKi8KLQl2b2lkIHNldElkZW50Q2FzZShzaG9ydCBpZGVudENhc2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb3BOYW1lQ2FzZQotCSAqICAgICAgICAgICAgc2hvcnQKLQkgKi8KLQl2b2lkIHNldFByb3BOYW1lQ2FzZShzaG9ydCBwcm9wTmFtZUNhc2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb3BWYWx1ZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRQcm9wVmFsdWVDYXNlKHNob3J0IHByb3BWYWx1ZUNhc2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHF1b3RlVmFsdWVzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRRdW90ZVZhbHVlcyhib29sZWFuIHF1b3RlVmFsdWVzKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RvclRhZ0Nhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRTZWxlY3RvclRhZ0Nhc2Uoc2hvcnQgc2VsZWN0b3JUYWdDYXNlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3lJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjE5MGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotCi0KLQotcHVibGljIGNsYXNzIENTU0NsZWFudXBTdHJhdGVneUltcGwgaW1wbGVtZW50cyBDU1NDbGVhbnVwU3RyYXRlZ3kgewotCi0Jc3RhdGljIHByaXZhdGUgQ1NTQ2xlYW51cFN0cmF0ZWd5IGluc3RhbmNlID0gbnVsbDsKLQkvLyBpbml0aWFsaXplIHdpdGggZGVmYXVsdHMKLQlwcm90ZWN0ZWQgc2hvcnQgZklkZW50Q2FzZSA9IEFTSVM7Ci0JcHJvdGVjdGVkIHNob3J0IGZQcm9wTmFtZUNhc2UgPSBBU0lTOwotCXByb3RlY3RlZCBzaG9ydCBmUHJvcFZhbHVlQ2FzZSA9IEFTSVM7Ci0JcHJvdGVjdGVkIHNob3J0IGZTZWxlY3RvclRhZ0Nhc2UgPSBVUFBFUjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmUXVvdGVWYWx1ZXMgPSB0cnVlOwotCXByb3RlY3RlZCBib29sZWFuIGZGb3JtYXRTb3VyY2UgPSB0cnVlOwotCi0JLyoqCi0JICogQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRJZGVudENhc2UoKSB7Ci0JCXJldHVybiBmSWRlbnRDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5Ci0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTQ2xlYW51cFN0cmF0ZWd5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IENTU0NsZWFudXBTdHJhdGVneUltcGwoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0UHJvcE5hbWVDYXNlKCkgewotCQlyZXR1cm4gZlByb3BOYW1lQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldFByb3BWYWx1ZUNhc2UoKSB7Ci0JCXJldHVybiBmUHJvcFZhbHVlQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldFNlbGVjdG9yVGFnQ2FzZSgpIHsKLQkJcmV0dXJuIGZTZWxlY3RvclRhZ0Nhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJZklkZW50Q2FzZSA9IGdldENsZWFudXBDYXNlVmFsdWUocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX0lERU5USUZJRVIpKTsKLQkJZlByb3BOYW1lQ2FzZSA9IGdldENsZWFudXBDYXNlVmFsdWUocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1BST1BFUlRZX05BTUUpKTsKLQkJZlByb3BWYWx1ZUNhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9WQUxVRSkpOwotCQlmU2VsZWN0b3JUYWdDYXNlID0gZ2V0Q2xlYW51cENhc2VWYWx1ZShwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfU0VMRUNUT1IpKTsKLQkJZlF1b3RlVmFsdWVzID0gcHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKTsKLQkJZkZvcm1hdFNvdXJjZSA9IHByZWZzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENTU0NsZWFudXBTdHJhdGVneSBlcXVpdmFsZW50IGNhc2Ugc2hvcnQgdmFsdWUgd2hlbiBnaXZlbiBhbgotCSAqIGludAotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZXF1aXZhbGVudCBjYXNlIHNob3J0IG9yIEFTSVMgaWYgY2Fubm90IGJlIGRldGVybWluZWQKLQkgKi8KLQlwcml2YXRlIHNob3J0IGdldENsZWFudXBDYXNlVmFsdWUoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUiA6Ci0JCQkJcmV0dXJuIExPV0VSOwotCQkJY2FzZSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDoKLQkJCQlyZXR1cm4gVVBQRVI7Ci0JCX0KLQkJcmV0dXJuIEFTSVM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3JtYXRTb3VyY2UoKSB7Ci0JCXJldHVybiBmRm9ybWF0U291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUXVvdGVWYWx1ZXMoKSB7Ci0JCXJldHVybiBmUXVvdGVWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZvcm1hdFNvdXJjZQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSkgewotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZGVudENhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWRlbnRDYXNlKHNob3J0IGlkZW50Q2FzZSkgewotCQlmSWRlbnRDYXNlID0gaWRlbnRDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wTmFtZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcE5hbWVDYXNlKHNob3J0IHByb3BOYW1lQ2FzZSkgewotCQlmUHJvcE5hbWVDYXNlID0gcHJvcE5hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wVmFsdWVDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BWYWx1ZUNhc2Uoc2hvcnQgcHJvcFZhbHVlQ2FzZSkgewotCQlmUHJvcFZhbHVlQ2FzZSA9IHByb3BWYWx1ZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHF1b3RlVmFsdWVzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVvdGVWYWx1ZXMoYm9vbGVhbiBxdW90ZVZhbHVlcykgewotCQlmUXVvdGVWYWx1ZXMgPSBxdW90ZVZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0b3JUYWdDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yVGFnQ2FzZShzaG9ydCBzZWxlY3RvclRhZ0Nhc2UpIHsKLQkJZlNlbGVjdG9yVGFnQ2FzZSA9IHNlbGVjdG9yVGFnQ2FzZTsKLQl9Ci0KLQkvLyBUT0RPOiBhIHNhdmVPcHRpb25zIHNob3VsZCBiZSBhZGRlZCB0byBDU1NDbGVhbnVwU3RyYXRlZ3kgaW50ZXJmYWNlCi0JcHVibGljIHZvaWQgc2F2ZU9wdGlvbnMoKSB7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURFTlRJRklFUiwgZklkZW50Q2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfTkFNRSwgZlByb3BOYW1lQ2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUsIGZQcm9wVmFsdWVDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9TRUxFQ1RPUiwgZlNlbGVjdG9yVGFnQ2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgZlF1b3RlVmFsdWVzKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIGZGb3JtYXRTb3VyY2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhZGYzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU0Zvcm1hdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwUHJvY2Vzc29yQ1NTIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciB7Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlDU1NGb3JtYXRVdGlsIGZvcm1hdFV0aWwgPSBDU1NGb3JtYXRVdGlsLmdldEluc3RhbmNlKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCUlDU1NEb2N1bWVudCBkb2MgPSAoKElDU1NNb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIGRvYyk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gZm9ybWF0dGVyLmNsZWFudXAoZG9jKTsKLQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZG9jKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBlbmRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIGRvYykuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJZm9ybWF0VXRpbC5yZXBsYWNlU291cmNlKGRvYy5nZXRNb2RlbCgpLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIGJ1Zi50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUxpc3QgY3Nzbm9kZXMgPSBmb3JtYXRVdGlsLmNvbGxlY3RDU1NOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJaWYgKGNzc25vZGVzICE9IG51bGwgJiYgIWNzc25vZGVzLmlzRW1wdHkoKSkgewotCQkJCUlDU1NNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc3Nub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSBjc3Nub2Rlcy5nZXQoaSk7Ci0JCQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBub2RlKTsKLQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IGZvcm1hdHRlci5jbGVhbnVwKG5vZGUpOwotCQkJCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCWludCBlbmRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJCQkJaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCQkJCQltb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJCQl9Ci0JCQkJCQlmb3JtYXRVdGlsLnJlcGxhY2VTb3VyY2UobW9kZWwsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgYnVmLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBzaG91bGQgaW1wbGVtZW50LCBvciBkZWxldGU/Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gc2hvdWxkIGltcGxlbWVudCwgb3IgZGVsZXRlPwotCi0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgZ2V0Q2xlYW51cEhhbmRsZXIoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBnZXRGb3JtYXRQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSU1lZGlhR3JvdXBJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSU1lZGlhR3JvdXBJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDAyYWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lNZWRpYUdyb3VwSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lZGlhR3JvdXBJRCB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0NPTlRJTlVPVVMgPSAiY29udGludW91cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX1BBR0VEID0gInBhZ2VkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9WSVNVQUwgPSAidmlzdWFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQVVSQUwgPSAiYXVyYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9UQUNUSUxFID0gInRhY3RpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0dSSUQgPSAiZ3JpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0JJVE1BUCA9ICJiaXRtYXAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0lOVEVSQUNUSVZFID0gImludGVyYWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQUxMID0gImFsbCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JVmFsSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lWYWxJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDljMWExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lWYWxJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbElEIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfMTAwID0gIjEwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzIwMCA9ICIyMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl8zMDAgPSAiMzAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfNDAwID0gIjQwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzUwMCA9ICI1MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl82MDAgPSAiNjAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfNzAwID0gIjcwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzgwMCA9ICI4MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl85MDAgPSAiOTAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUJPVkUgPSAiYWJvdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BQlNPTFVURSA9ICJhYnNvbHV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FDVElWRUJPUkRFUiA9ICJBY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BQ1RJVkVDQVBUSU9OID0gIkFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BTEwgPSAiYWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUxXQVlTID0gImFsd2F5cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FQUFdPUktTUEFDRSA9ICJBcHBXb3Jrc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BUVVBID0gImFxdWEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BUk1FTklBTiA9ICJhcm1lbmlhbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FVVE8gPSAiYXV0byI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FWT0lEID0gImF2b2lkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkFDS0dST1VORCA9ICJCYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkFTRUxJTkUgPSAiYmFzZWxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CRUhJTkQgPSAiYmVoaW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkVMT1cgPSAiYmVsb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CSURJX09WRVJSSURFID0gImJpZGktb3ZlcnJpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CTEFDSyA9ICJibGFjayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JMSU5LID0gImJsaW5rIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkxPQ0sgPSAiYmxvY2siOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CTFVFID0gImJsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CT0xERVIgPSAiYm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQk9USCA9ICJib3RoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JVVFRPTkZBQ0UgPSAiQnV0dG9uRmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JVVFRPTkhJR0hMSUdIVCA9ICJCdXR0b25IaWdobGlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CVVRUT05TSEFET1cgPSAiQnV0dG9uU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQlVUVE9OVEVYVCA9ICJCdXR0b25UZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0FQSVRBTElaRSA9ICJjYXBpdGFsaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0FQVElPTiA9ICJjYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0FQVElPTlRFWFQgPSAiQ2FwdGlvblRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DRU5URVIgPSAiY2VudGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0VOVEVSX0xFRlQgPSAiY2VudGVyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DRU5URVJfUklHSFQgPSAiY2VudGVyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0hJTEQgPSAiY2hpbGQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DSVJDTEUgPSAiY2lyY2xlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0pLX0lERU9HUkFQSElDID0gImNqay1pZGVvZ3JhcGhpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NMT1NFX1FVT1RFID0gImNsb3NlLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09OREVOU0VEID0gImNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NPTExBUFNFID0gImNvbGxhcHNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09NUEFDVCA9ICJjb21wYWN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ1JPUCA9ICJjcm9wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ1JPU1MgPSAiY3Jvc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DUk9TU0hBSVIgPSAiY3Jvc3NoYWlyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ1VSU0lWRSA9ICJjdXJzaXZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfREFTSEVEID0gImRhc2hlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RFQ0lNQUwgPSAiZGVjaW1hbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RFQ0lNQUxfTEVBRElOR19aRVJPID0gImRlY2ltYWwtbGVhZGluZy16ZXJvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRElHSVRTID0gImRpZ2l0cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RJU0MgPSAiZGlzYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RPVFRFRCA9ICJkb3R0ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ET1VCTEUgPSAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRV9SRVNJWkUgPSAiZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FTUJFRCA9ICJlbWJlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VYUEFOREVEID0gImV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRVhUUkFfQ09OREVOU0VEID0gImV4dHJhLWNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VYVFJBX0VYUEFOREVEID0gImV4dHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkFOVEFTWSA9ICJmYW50YXN5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkFSX0xFRlQgPSAiZmFyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVJfUklHSFQgPSAiZmFyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkFTVCA9ICJmYXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkFTVEVSID0gImZhc3RlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZFTUFMRSA9ICJmZW1hbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GSVhFRCA9ICJmaXhlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZVQ0hTSUEgPSAiZnVjaHNpYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dFT1JHSUFOID0gImdlb3JnaWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR1JBWSA9ICJncmF5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR1JBWVRFWFQgPSAiR3JheVRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HUkVFTiA9ICJncmVlbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dST09WRSA9ICJncm9vdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9IRUJSRVcgPSAiaGVicmV3IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSEVMUCA9ICJoZWxwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElEREVOID0gImhpZGRlbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJREUgPSAiaGlkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJR0ggPSAiaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJR0hMSUdIVCA9ICJIaWdobGlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISUdITElHSFRURVhUID0gIkhpZ2hsaWdodFRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISUdIRVIgPSAiaGlnaGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElSQUdBTkEgPSAiaGlyYWdhbmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISVJBR0FOQV9JUk9IQSA9ICJoaXJhZ2FuYS1pcm9oYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOQUNUSVZFQk9SREVSID0gIkluYWN0aXZlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5BQ1RJVkVDQVBUSU9OID0gIkluYWN0aXZlQ2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOQUNUSVZFQ0FQVElPTlRFWFQgPSAiSW5hY3RpdmVDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lORk9CQUNLR1JPVU5EID0gIkluZm9CYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5GT1RFWFQgPSAiSW5mb1RleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkxJTkUgPSAiaW5saW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5MSU5FX1RBQkxFID0gImlubGluZS10YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOU0VUID0gImluc2V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5TSURFID0gImluc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOVkVSVCA9ICJpbnZlcnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JVEFMSUMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSlVTVElGWSA9ICJqdXN0aWZ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfS0FUQUtBTkEgPSAia2F0YWthbmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9LQVRBS0FOQV9JUk9IQSA9ICJrYXRha2FuYS1pcm9oYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xBTkRTQ0FQRSA9ICJsYW5kc2NhcGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MQVJHRSA9ICJsYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xBUkdFUiA9ICJsYXJnZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MRUZUID0gImxlZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MRUZUX1NJREUgPSAibGVmdC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEVGVFdBUkRTID0gImxlZnR3YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xFVkVMID0gImxldmVsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElHSFRFUiA9ICJsaWdodGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElNRSA9ICJsaW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElORV9USFJPVUdIID0gImxpbmUtdGhyb3VnaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xJU1RfSVRFTSA9ICJsaXN0LWl0ZW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1VEID0gImxvdWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1cgPSAibG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVIgPSAibG93ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUl9BTFBIQSA9ICJsb3dlci1hbHBoYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSX0dSRUVLID0gImxvd2VyLWdyZWVrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJfTEFUSU4gPSAibG93ZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUl9ST01BTiA9ICJsb3dlci1yb21hbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSQ0FTRSA9ICJsb3dlcmNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MVFIgPSAibHRyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUFMRSA9ICJtYWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUFSS0VSID0gIm1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01BUk9PTiA9ICJtYXJvb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NRURJVU0gPSAibWVkaXVtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUVOVSA9ICJtZW51IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUVOVVRFWFQgPSAiTWVudVRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NRVNTQUdFX0JPWCA9ICJtZXNzYWdlLWJveCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NSVggPSAibWl4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTU9OT1NQQUNFID0gIm1vbm9zcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01PVkUgPSAibW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05fUkVTSVpFID0gIm4tcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTkFSUk9XRVIgPSAibmFycm93ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OQVZZID0gIm5hdnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ORV9SRVNJWkUgPSAibmUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9fQ0xPU0VfUVVPVEUgPSAibm8tY2xvc2UtcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT19PUEVOX1FVT1RFID0gIm5vLW9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT19SRVBFQVQgPSAibm8tcmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9ORSA9ICJub25lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9STUFMID0gIm5vcm1hbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PV1JBUCA9ICJub3dyYXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OV19SRVNJWkUgPSAibnctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT0JMSVFVRSA9ICJvYmxpcXVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT0xJVkUgPSAib2xpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PTkNFID0gIm9uY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PUEVOX1FVT1RFID0gIm9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PVVRTRVQgPSAib3V0c2V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT1VUU0lERSA9ICJvdXRzaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT1ZFUkxJTkUgPSAib3ZlcmxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9QT0lOVEVSID0gInBvaW50ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9QT1JUUkFJVCA9ICJwb3J0cmFpdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1BSRSA9ICJwcmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9QVVJQTEUgPSAicHVycGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUkVEID0gInJlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFTEFUSVZFID0gInJlbGF0aXZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUkVQRUFUID0gInJlcGVhdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFUEVBVF9YID0gInJlcGVhdC14IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUkVQRUFUX1kgPSAicmVwZWF0LXkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SSURHRSA9ICJyaWRnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JJR0hUID0gInJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUklHSFRfU0lERSA9ICJyaWdodC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUklHSFRXQVJEUyA9ICJyaWdodHdhcmRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUlRMID0gInJ0bCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JVTl9JTiA9ICJydW4taW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TX1JFU0laRSA9ICJzLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NBTlNfU0VSSUYgPSAic2Fucy1zZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NDUk9MTCA9ICJzY3JvbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TQ1JPTExCQVIgPSAiU2Nyb2xsYmFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VfUkVTSVpFID0gInNlLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFTUlfQ09OREVOU0VEID0gInNlbWktY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VNSV9FWFBBTkRFRCA9ICJzZW1pLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VQQVJBVEUgPSAic2VwYXJhdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRVJJRiA9ICJzZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NIT1cgPSAic2hvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NJTEVOVCA9ICJzaWxlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TSUxWRVIgPSAic2lsdmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0xPVyA9ICJzbG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0xPV0VSID0gInNsb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMID0gInNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU01BTExfQ0FQUyA9ICJzbWFsbC1jYXBzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU01BTExfQ0FQVElPTiA9ICJzbWFsbC1jYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU01BTExFUiA9ICJzbWFsbGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU09GVCA9ICJzb2Z0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU09MSUQgPSAic29saWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TUEVMTF9PVVQgPSAic3BlbGwtb3V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1FVQVJFID0gInNxdWFyZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NUQVRJQyA9ICJzdGF0aWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TVEFUVVNfQkFSID0gInN0YXR1cy1iYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TVUIgPSAic3ViIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1VQRVIgPSAic3VwZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TV19SRVNJWkUgPSAic3ctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEUgPSAidGFibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9DQVBUSU9OID0gInRhYmxlLWNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9DRUxMID0gInRhYmxlLWNlbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9DT0xVTU4gPSAidGFibGUtY29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ09MVU1OX0dST1VQID0gInRhYmxlLWNvbHVtbi1ncm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0ZPT1RFUl9HUk9VUCA9ICJ0YWJsZS1mb290ZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9IRUFERVJfR1JPVVAgPSAidGFibGUtaGVhZGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfUk9XID0gInRhYmxlLXJvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX1JPV19HUk9VUCA9ICJ0YWJsZS1yb3ctZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9URUFMID0gInRlYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9URVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9URVhUX1RPUCA9ICJ0ZXh0LXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RFWFRfQk9UVE9NID0gInRleHQtYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhJQ0sgPSAidGhpY2siOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USElOID0gInRoaW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USFJFRUREQVJLU0hBRE9XID0gIlRocmVlRERhcmtTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USFJFRURGQUNFID0gIlRocmVlREZhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USFJFRURISUdITElHSFQgPSAiVGhyZWVESGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVETElHSFRTSEFET1cgPSAiVGhyZWVETGlnaHRTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USFJFRURTSEFET1cgPSAiVGhyZWVEU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RSQU5TUEFSRU5UID0gInRyYW5zcGFyZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVUxUUkFfQ09OREVOU0VEID0gInVsdHJhLWNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VMVFJBX0VYUEFOREVEID0gInVsdHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVU5ERVJMSU5FID0gInVuZGVybGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VQUEVSX0FMUEhBID0gInVwcGVyLWFscGhhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVVBQRVJfTEFUSU4gPSAidXBwZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VUFBFUl9ST01BTiA9ICJ1cHBlci1yb21hbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VQUEVSQ0FTRSA9ICJ1cHBlcmNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9WSVNJQkxFID0gInZpc2libGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XX1JFU0laRSA9ICJ3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dBSVQgPSAid2FpdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dISVRFID0gIndoaXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0lERVIgPSAid2lkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSU5ET1cgPSAiV2luZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0lORE9XRlJBTUUgPSAiV2luZG93RnJhbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSU5ET1dURVhUID0gIldpbmRvd1RleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0ZBU1QgPSAieC1mYXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9ISUdIID0gIngtaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfTEFSR0UgPSAieC1sYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfTE9VRCA9ICJ4LWxvdWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0xPVyA9ICJ4LWxvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfU0xPVyA9ICJ4LXNsb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX1NNQUxMID0gIngtc21hbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX1NPRlQgPSAieC1zb2Z0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWFhfU01BTEwgPSAieHgtc21hbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YWF9MQVJHRSA9ICJ4eC1sYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1lFTExPVyA9ICJ5ZWxsb3ciOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxM2Y3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01Db250YWluZXIgZXh0ZW5kcyBQcm9wQ01Ob2RlIHsKLQotCXByaXZhdGUgamF2YS51dGlsLlZlY3RvciBub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0FCU09MVVRFX1NJWkUgPSAiYWJzb2x1dGUtc2l6ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9CT1JERVJfU1RZTEUgPSAiYm9yZGVyLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0JPUkRFUl9XSURUSCA9ICJib3JkZXItd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQ09MT1IgPSAiY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfU1lTVEVNX0NPTE9SID0gInN5c3RlbS1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9HRU5FUklDX0ZBTUlMWSA9ICJnZW5lcmljLWZhbWlseSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9HRU5FUklDX1ZPSUNFID0gImdlbmVyaWMtdm9pY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfTUFSR0lOX1dJRFRIID0gIm1hcmdpbi13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9QQURESU5HX1dJRFRIID0gInBhZGRpbmctd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfUkVMQVRJVkVfU0laRSA9ICJyZWxhdGl2ZS1zaXplIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNQ29udGFpbmVyKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCU9iamVjdCBhcHBlbmRDaGlsZChPYmplY3Qgbm9kZSkgewotCQlpZiAoIW5vZGVzLmNvbnRhaW5zKG5vZGUpKQotCQkJbm9kZXMuYWRkKG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCWludCBuQ2hpbGQgPSBnZXROdW1DaGlsZCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZDsgaSsrKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU3RyaW5nICYmIGlkZW50aWZpZXIuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBjaGlsZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBQcm9wQ01Db250YWluZXIgJiYgKChQcm9wQ01Db250YWluZXIpIGNoaWxkKS5jYW5IYXZlKGlkZW50aWZpZXIpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENoaWxkQXQoaW50IGluZGV4KSB7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IGluZGV4IDwgMCB8fCBub2Rlcy5zaXplKCkgPD0gaW5kZXgpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIFByb3BDTUNvbnRhaW5lciBnZXRDb250SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDIwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01Db250YWluZXIpIG5vZGU7Ci0KLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCS8vIHJlZ2lzdGVyCi0JCQlub2RlID0gbmV3IFByb3BDTUNvbnRhaW5lcihuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTUNvbnRhaW5lcikgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldElkZW50aWZpZXJzKFNldCBpZGVudHMpIHsKLQkJaWYgKGlkZW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbkNoaWxkcmVuID0gbm9kZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSsrKSB7Ci0JCQlPYmplY3Qgbm9kZSA9IG5vZGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgUHJvcENNTm9kZSkKLQkJCQkoKFByb3BDTU5vZGUpIG5vZGUpLmdldElkZW50aWZpZXJzKGlkZW50cyk7Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCWlkZW50cy5hZGQobm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bUNoaWxkKCkgewotCQlpZiAobm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX0NPTlRBSU5FUjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcykgewotCQlpZiAodmFsdWVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBuQ2hpbGRyZW4gPSBub2Rlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkcmVuOyBpKyspIHsKLQkJCU9iamVjdCBub2RlID0gbm9kZXMuZWxlbWVudEF0KGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9wQ01Ob2RlKQotCQkJCSgoUHJvcENNTm9kZSkgbm9kZSkuZ2V0VmFsdWVzKHZhbHVlcyk7Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJaWYgKCF2YWx1ZXMuY29udGFpbnMobm9kZSkpCi0JCQkJCXZhbHVlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlPYmplY3QgcmVtb3ZlQ2hpbGQoT2JqZWN0IG5vZGUpIHsKLQkJbm9kZXMucmVtb3ZlKG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRm9udFByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Gb250UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4ZTIxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Gb250UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01Gb250UHJvcGVydHkgZXh0ZW5kcyBQcm9wQ01Qcm9wZXJ0eSB7Ci0KLQkvLyBzdGF0aWMgZmllbGRzCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgY2FjaGVkSWRNYXAgPSBudWxsOwotCS8vIHNlbGVjdGluZyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX1NUWUxFID0gImZvbnQtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX1ZBUklBTlQgPSAiZm9udC12YXJpYW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9XRUlHSFQgPSAiZm9udC13ZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX1NUUkVUQ0ggPSAiZm9udC1zdHJldGNoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9TSVpFID0gImZvbnQtc2l6ZSI7Ly8kTk9OLU5MUy0xJAotCS8vIHF1YWxpZmljYXRpb24gcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1VOSUNPREVfUkFOR0UgPSAidW5pY29kZS1yYW5nZSI7Ly8kTk9OLU5MUy0xJAotCS8vIG51bWVyaWMgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1VOSVRTX1BFUl9FTSA9ICJ1bml0cy1wZXItZW0iOy8vJE5PTi1OTFMtMSQKLQkvLyByZWZlcmVuY2luZyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfU1JDID0gInNyYyI7Ly8kTk9OLU5MUy0xJAotCS8vIG1hdGNoaW5nIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9QQU5PU0VfMSA9ICJwYW5vc2UtMSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1NURU1WID0gInN0ZW12IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfU1RFTUggPSAic3RlbWgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9TTE9QRSA9ICJzbG9wZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0NBUF9IRUlHSFQgPSAiY2FwLWhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1hfSEVJR0hUID0gIngtaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQVNDRU5UID0gImFzY2VudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0RFU0NFTlQgPSAiZGVzY2VudCI7Ly8kTk9OLU5MUy0xJAotCS8vIHN5bnRoZXNpcyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfV0lEVEhTID0gIndpZHRocyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0JCT1ggPSAiYmJveCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0RFRklOSVRJT05fU1JDID0gImRlZmluaXRpb24tc3JjIjsvLyROT04tTkxTLTEkCi0JLy8gYWxpZ25tZW50IHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9CQVNFTElORSA9ICJiYXNlbGluZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0NFTlRFUkxJTkUgPSAiY2VudGVybGluZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX01BVEhMSU5FID0gIm1hdGhsaW5lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfVE9QTElORSA9ICJ0b3BsaW5lIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNRm9udFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcENNUHJvcGVydHkgZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTUZvbnRQcm9wZXJ0eShuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0TmFtZUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmtleXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldFByb3BlcnR5RW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9GT05UUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgbmFtZXMoKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMua2V5U2V0KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBuYW1lcyhPYmplY3QgbWVkaWFHcm91cCkgewotCQlpZiAobWVkaWFHcm91cCA9PSBudWxsKQotCQkJcmV0dXJuIG5hbWVzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCVZlY3RvciBwcm9wZXJ0aWVzID0gbmV3IFZlY3RvcigpOwotCi0JCUl0ZXJhdG9yIGl0ID0gaW5zdGFuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3AgPSAoUHJvcENNUHJvcGVydHkpIGl0Lm5leHQoKTsKLQkJCWlmIChwcm9wLmdldE1lZGlhR3JvdXBzKCkuY29udGFpbnMobWVkaWFHcm91cCkpCi0JCQkJcHJvcGVydGllcy5hZGQocHJvcC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogSWYgaXRlbnRpZmllciBpcyBudWxsLCBnZXQgYWxsIHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBwcm9wZXJ0aWVzRm9yKFN0cmluZyBpZGVudGlmaWVyLCBib29sZWFuIHNob3J0aGFuZHMpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIGlmIGlkZW50aWZpZXIgaXMgbnVsbCwgZ2V0IGFsbCBwcm9wZXJ0aWVzCi0JCWlmIChpZGVudGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMudmFsdWVzKCkpOwotCi0JCWlmIChjYWNoZWRJZE1hcCA9PSBudWxsKSB7Ci0JCQkvLyBzdGFydCBjYWNoZWluZwotCQkJY2FjaGVkSWRNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWFyY2ggY2FjaGVkCi0JCQlPYmplY3QgcmV0ID0gY2FjaGVkSWRNYXAuZ2V0KGlkZW50aWZpZXIgKyBTdHJpbmcudmFsdWVPZihzaG9ydGhhbmRzKSk7Ci0JCQlpZiAocmV0ICE9IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBWZWN0b3IoKENvbGxlY3Rpb24pIHJldCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUKLQkJRW51bWVyYXRpb24gcHJvcGVydGllcyA9IGdldFByb3BlcnR5RW51bSgpOwotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlIChwcm9wZXJ0aWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gKFByb3BDTVByb3BlcnR5KSBwcm9wZXJ0aWVzLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoIXNob3J0aGFuZHMgJiYgcHJvcC5pc1Nob3J0aGFuZCgpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHByb3AuY2FuSGF2ZShpZGVudGlmaWVyKSkKLQkJCQlzZXQuYWRkKHByb3ApOwotCQl9Ci0KLQkJLy8gY2FjaGUKLQkJY2FjaGVkSWRNYXAucHV0KGlkZW50aWZpZXIgKyBTdHJpbmcudmFsdWVPZihzaG9ydGhhbmRzKSwgc2V0KTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihzZXQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01GdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlZmM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01GdW5jdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTUZ1bmN0aW9uIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0FUVFIgPSAiYXR0ciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9DT1VOVEVSID0gImNvdW50ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfUkdCID0gInJnYiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9TSEFQRSA9ICJyZWN0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1VSSSA9ICJ1cmwiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfRk9STUFUID0gImZvcm1hdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9MT0NBTCA9ICJsb2NhbCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTUZ1bmN0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgcHVibGljIFByb3BDTUZ1bmN0aW9uIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNRnVuY3Rpb24pIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNRnVuY3Rpb24obmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01GdW5jdGlvbikgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9GVU5DOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKHRoaXMpKQotCQkJdmFsdWVzLmFkZCh0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmE4NGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BDTU5vZGUgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfSURFTlRJRklFUiA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfUFJPUEVSVFkgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX05VTUJFUiA9IDI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfU1RSSU5HID0gMzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9GVU5DID0gNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9DT05UQUlORVIgPSA1OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX1NVQlBST1BFUlRZID0gNjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9GT05UUFJPUEVSVFkgPSA3OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX1VOSUNPREVfUkFOR0UgPSA4OwotCXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIHNob3J0IExPQURJTkcgPSAwOyAvLyAwIDogbm90IGluaXRpYWxpemVkLCAxIDogdW5kZXIKLQkJCQkJCQkJCQkvLyBpbml0aWFsaXppbmcsIDIgOiBpbml0aWFsaXplLWRvbmUKLQkJCQkJCQkJCQkvLyBhbmQgZml4IERCCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUHJvcENNTm9kZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTZXQgZ2V0SWRlbnRpZmllcnMoKSB7Ci0JCUhhc2hTZXQgaWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJZ2V0SWRlbnRpZmllcnMoaWRzKTsKLQkJcmV0dXJuIGlkczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGdldElkZW50aWZpZXJzKFNldCBpbmRlbnRzKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGFic3RyYWN0IHNob3J0IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFZhbHVlcygpIHsKLQkJVmVjdG9yIHZhbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWdldFZhbHVlcyh2YWxzKTsKLQkJcmV0dXJuIHZhbHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXRQcm9wZXJ0eUNNKCkgewotCQlpZiAoIWlzTmVlZEluaXRpYWxpemUoKSkKLQkJCXJldHVybjsKLQkJTE9BRElORyA9IDE7Ci0KLQkJUHJvcENNTnVtYmVyLmluaXROdW1iZXJDTURpbSgpOwotCi0JCS8vIGF6aW11dGgKLQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9BWklNVVRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0FOR0xFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVF9TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GQVJfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkFSX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVF9TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CRUhJTkQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlRXQVJEUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFRXQVJEUyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0KLQkJLy8gYmFja2dyb3VuZAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNik7Ci0KLQkJLy8gYmFja2dyb3VuZC1hdHRhY2htZW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0NST0xMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GSVhFRCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVFJBTlNQQVJFTlQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1pbWFnZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtcG9zaXRpb24gLS0tLSBzdWItcHJvcGVydGllcyBob3Jpem9udGFsCi0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtcG9zaXRpb24gLS0tLSBzdWItcHJvcGVydGllcyB2ZXJ0aWNhbAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLXBvc2l0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1yZXBlYXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFUEVBVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVQRUFUX1gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFUEVBVF9ZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT19SRVBFQVQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSkpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoOSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItY29sbGFwc2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MTEFQU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTExBUFNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRVBBUkFURSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKSk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UUkFOU1BBUkVOVCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1zcGFjaW5nCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NQQUNJTkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXRvcAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItcmlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItYm90dG9tCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1sZWZ0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItdG9wLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci10b3Atc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci10b3Atd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1yaWdodC1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1yaWdodC1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItcmlnaHQtd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbS1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItYm90dG9tLXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItYm90dG9tLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItbGVmdC1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWxlZnQtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItbGVmdC13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm90dG9tCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2FwdGlvbi1zaWRlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0FQVElPTl9TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xlYXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTEVBUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NUQVRJQyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGlwIC0tLS0gc3ViLXByb3BlcnRpZXMgdG9wCi0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCSgoUHJvcENNU3ViUHJvcGVydHkpIHByb3ApLnNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcCAtLS0tIHN1Yi1wcm9wZXJ0aWVzIHJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJKChQcm9wQ01TdWJQcm9wZXJ0eSkgcHJvcCkuc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGlwIC0tLS0gc3ViLXByb3BlcnRpZXMgYm90dG9tCi0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCSgoUHJvcENNU3ViUHJvcGVydHkpIHByb3ApLnNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcCAtLS0tIHN1Yi1wcm9wZXJ0aWVzIGxlZnQKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCSgoUHJvcENNU3ViUHJvcGVydHkpIHByb3ApLnNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1NIQVBFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY29udGVudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTlRFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfQU5ZKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfQ09VTlRFUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX0FUVFIpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PUEVOX1FVT1RFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DTE9TRV9RVU9URSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9fT1BFTl9RVU9URSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9fQ0xPU0VfUVVPVEUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOyAvLyBpbmZpbml0ZQotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FMTCk7Ci0KLQkJLy8gY291bnRlci1pbmNyZW1lbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX0lOQ1JFTUVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9DT1VOVEVSX0lEKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQUxMKTsKLQotCQkvLyBjb3VudGVyLXJlc2V0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9SRVNFVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9DT1VOVEVSX0lEKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQUxMKTsKLQotCQkvLyBjdWUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQkVGT1JFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9BRlRFUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGN1ZS1hZnRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9BRlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGN1ZS1iZWZvcmUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQkVGT1JFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gY3Vyc29yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VSU09SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DUk9TU0hBSVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RFRkFVTFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1BPSU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01PVkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ORV9SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05XX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTl9SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1dfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfV19SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RFWFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1dBSVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hFTFApOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOyAvLyBpbmZpbml0ZQotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIGRpcmVjdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJUkVDVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTFRSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SVEwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZGlzcGxheQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJU1BMQVkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lOTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkxPQ0spOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xJU1RfSVRFTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUlVOX0lOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT01QQUNUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NQVJLRVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkxJTkVfVEFCTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX1JPV19HUk9VUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfSEVBREVSX0dST1VQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9GT09URVJfR1JPVVApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX1JPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfQ09MVU1OX0dST1VQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9DT0xVTU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0NFTEwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0NBUFRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FMTCk7Ci0KLQkJLy8gZWxldmF0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRUxFVkFUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0FOR0xFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkVMT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFVkVMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BQk9WRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElHSEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGVtcHR5LWNlbGxzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRU1QVFlfQ0VMTFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NIT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJREUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZmxvYXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GTE9BVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DQVBUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JQ09OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRU5VKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRVNTQUdFX0JPWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExfQ0FQVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1RBVFVTX0JBUik7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LWZhbWlseQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0ZPTlQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX0ZBTUlMWSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1zaXplCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9BQlNPTFVURV9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUkVMQVRJVkVfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXNpemUtYWRqdXN0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFX0FESlVTVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtc3RyZXRjaAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RSRVRDSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSURFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTkFSUk9XRVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFTUlfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRU1JX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JVEFMSUMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09CTElRVUUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXZhcmlhbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMX0NBUFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXdlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT0xEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8xMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzIwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMzAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl80MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzUwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNjAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl83MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzgwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfOTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MSUdIVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT0xERVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBoZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsZWZ0dAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsZXR0ZXItc3BhY2luZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFVFRFUl9TUEFDSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaW5lLWhlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpc3Qtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaXN0LXN0eWxlLWltYWdlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaXN0LXN0eWxlLXBvc2l0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PVVRTSURFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpc3Qtc3R5bGUtdHlwZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRElTQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0lSQ0xFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TUVVBUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RFQ0lNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RFQ0lNQUxfTEVBRElOR19aRVJPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUl9ST01BTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVVBQRVJfUk9NQU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSX0dSRUVLKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUl9BTFBIQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJfTEFUSU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VQUEVSX0FMUEhBKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VUFBFUl9MQVRJTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSEVCUkVXKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BUk1FTklBTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfR0VPUkdJQU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NKS19JREVPR1JBUEhJQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElSQUdBTkEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0tBVEFLQU5BKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISVJBR0FOQV9JUk9IQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfS0FUQUtBTkFfSVJPSEEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4tdG9wCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4tcmlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luLWJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luLWxlZnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJrZXItb2Zmc2V0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS0VSX09GRlNFVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmtzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NST1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NST1NTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIG1heC1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWF4LXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWluLWhlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtaW4td2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBvcnBoYW5zCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1JQSEFOUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gb3V0bGluZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9XSURUSCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gb3V0bGluZS1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5WRVJUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBvdXRsaW5lLXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gb3V0bGluZS13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIG92ZXJmbG93Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1ZFUkZMT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1ZJU0lCTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJRERFTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0NST0xMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmctdG9wCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmctcmlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nLWJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nLWxlZnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZ2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX1BBR0VfSUQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBwYWdlLWJyZWFrLWFmdGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19BRlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxXQVlTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVk9JRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHBhZ2UtYnJlYWstYmVmb3JlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19CRUZPUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMV0FZUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVZPSUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBwYWdlLWJyZWFrLWluc2lkZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfSU5TSURFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVk9JRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gcGF1c2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9USU1FKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGF1c2UtYWZ0ZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9BRlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9USU1FKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBhdXNlLWJlZm9yZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0JFRk9SRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9USU1FKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBpdGNoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfRlJFUVVFTkNZKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9MT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISUdIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0hJR0gpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwaXRjaC1yYW5nZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIX1JBTkdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwbGF5LWR1cmluZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BMQVlfRFVSSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NSVgpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFUEVBVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcG9zaXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QT1NJVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUJTT0xVVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFTEFUSVZFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GSVhFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1RBVElDKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHF1b3RlcwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1FVT1RFUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9BTlkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHJpY2huZXNzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklDSE5FU1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBzaXplCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9QT1JUUkFJVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEFORFNDQVBFKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHNwZWFrCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUspOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1BFTExfT1VUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3BlYWstaGVhZGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfSEVBREVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PTkNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTFdBWVMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzcGVhay1udW1lcmFsCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfTlVNRVJBTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRElHSVRTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT05USU5VT1VTKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3BlYWstcHVuY3R1YXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19QVU5DVFVBVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09ERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHNwZWVjaC1yYXRlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFRUNIX1JBVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9TTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZBU1QpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfRkFTVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHN0cmVzcwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NUUkVTUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gdGFibGUtbGF5b3V0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEFCTEVfTEFZT1VUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GSVhFRCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LWFsaWduCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9BTElHTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSlVTVElGWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9BTlkpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtZGVjb3JhdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfREVDT1JBVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVU5ERVJMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PVkVSTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTElORV9USFJPVUdIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CTElOSyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtaW5kZW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9JTkRFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LXNoYWRvdwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfU0hBRE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LXRyYW5zZm9ybQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfVFJBTlNGT1JNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DQVBJVEFMSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VUFBFUkNBU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSQ0FTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0b3AKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB1bmljb2RlLWJpZGkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9VTklDT0RFX0JJREkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRU1CRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JJRElfT1ZFUlJJREUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdmVydGljYWwtYWxpZ24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WRVJUSUNBTF9BTElHTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9URVhUX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1VCKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CQVNFTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUlERExFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVVBFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEVYVF9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHZpc2liaWxpdHkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WSVNJQklMSVRZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9WSVNJQkxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISURERU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTExBUFNFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHZvaWNlLWZhbWlseQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9WT0lDRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfVk9JQ0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gdm9sdW1lCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9MVU1FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NJTEVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9TT0ZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TT0ZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPVUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfTE9VRCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHdoaXRlLXNwYWNlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0hJVEVfU1BBQ0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUFJFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1dSQVApOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gd2lkb3dzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lET1dTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyB3aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gd29yZC1zcGFjaW5nCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV09SRF9TUEFDSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB6LWluZGV4Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfWl9JTkRFWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvKiogKioqKioqKiogZm9udCBwcm9wZXJ0aWVzICoqKioqKioqKiAqLwotCQkvLyBmb250LWZhbWlseQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfRkFNSUxZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0ZPTlQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX0ZBTUlMWSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtc3R5bGUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JVEFMSUMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09CTElRVUUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXZhcmlhbnQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX1ZBUklBTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMX0NBUFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC13ZWlnaHQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX1dFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9MRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8yMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzMwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNDAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl81MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzYwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNzAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl84MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzkwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTEwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtc3RyZXRjaAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfU1RSRVRDSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VTFRSQV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYVFJBX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRU1JX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VNSV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYVFJBX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VTFRSQV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXNpemUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX1NJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0FCU09MVVRFX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9SRUxBVElWRV9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTEwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIHVuaWNvZGUtcmFuZ2UKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9VTklDT0RFX1JBTkdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01VUmFuZ2UuZ2V0SW5zdGFuY2VPZihQcm9wQ01VUmFuZ2UuVkFMX1VSQU5HRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIHVuaXRzLXBlci1lbQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1VOSVRTX1BFUl9FTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBzcmMKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9TUkMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX0ZPUk1BVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX0xPQ0FMKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gcGFub3NlLTEKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9QQU5PU0VfMSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgxMCk7Ci0KLQkJLy8gc3RlbXYKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9TVEVNVik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBzdGVtaAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1NURU1IKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHNsb3BlCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfU0xPUEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gY2FwLWhlaWdodAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0NBUF9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8geC1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9YX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBhc2NlbnQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9BU0NFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gZGVzY2VudAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0RFU0NFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gd2lkdGhzCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfV0lEVEhTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVVSYW5nZS5nZXRJbnN0YW5jZU9mKFByb3BDTVVSYW5nZS5WQUxfVVJBTkdFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gYmJveAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0JCT1gpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCi0JCS8vIGRlZmluaXRpb24tc3JjCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfREVGSU5JVElPTl9TUkMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCi0JCS8vIGJhc2VsaW5lCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQkFTRUxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gY2VudGVybGluZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0NFTlRFUkxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gbWF0aGxpbmUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9NQVRITElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyB0b3BsaW5lCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfVE9QTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvKiogKioqKioqKiogY29udGFpbmVycyAqKioqKioqKiogKi8KLQotCQkvLyBhYnNvbHV0ZS1zaXplCi0JCVByb3BDTUNvbnRhaW5lciBjb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQUJTT0xVVEVfU0laRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWFhfU01BTEwpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1hfU01BTEwpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0xBUkdFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0xBUkdFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YWF9MQVJHRSk7Ci0KLQkJLy8gYm9yZGVyLXN0eWxlCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NPTElEKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9EQVNIRUQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0RPVFRFRCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRE9VQkxFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9HUk9PVkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1JJREdFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTlNFVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfT1VUU0VUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISURERU4pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCi0JCS8vIGJvcmRlci13aWR0aAotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USElOKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RISUNLKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCi0JCS8vIGNvbG9yCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVFVQSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkxBQ0spOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JMVUUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0ZVQ0hTSUEpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0dSQVkpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0dSRUVOKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MSU1FKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NQVJPT04pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX05BVlkpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX09MSVZFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9QVVJQTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1JFRCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0lMVkVSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9URUFMKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSElURSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWUVMTE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9TWVNURU1fQ09MT1IpKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9SR0IpKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0hBU0gpKTsKLQotCQkvLyBzeXN0ZW0gY29sb3IKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1NZU1RFTV9DT0xPUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUNUSVZFQk9SREVSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BQ1RJVkVDQVBUSU9OKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BUFBXT1JLU1BBQ0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JBQ0tHUk9VTkQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JVVFRPTkZBQ0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JVVFRPTkhJR0hMSUdIVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQlVUVE9OU0hBRE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CVVRUT05URVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DQVBUSU9OVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfR1JBWVRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0hJR0hMSUdIVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElHSExJR0hUVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5BQ1RJVkVCT1JERVIpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOQUNUSVZFQ0FQVElPTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5BQ1RJVkVDQVBUSU9OVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5GT0JBQ0tHUk9VTkQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lORk9URVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRU5VKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRU5VVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0NST0xMQkFSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRUREQVJLU0hBRE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRURGQUNFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRURISUdITElHSFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RIUkVFRExJR0hUU0hBRE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRURTSEFET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1dJTkRPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0lORE9XRlJBTUUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1dJTkRPV1RFWFQpOwotCi0JCS8vIGdlbmVyaWMtZmFtaWx5Ci0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX0ZBTUlMWSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VSSUYpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NBTlNfU0VSSUYpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0NVUlNJVkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0ZBTlRBU1kpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01PTk9TUEFDRSk7Ci0KLQkJLy8gZ2VuZXJpYy12b2ljZQotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19WT0lDRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUFMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkVNQUxFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DSElMRCk7Ci0KLQkJLy8gbWFyZ2luLXdpZHRoCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0KLQkJLy8gcGFkZGluZy13aWR0aAotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQotCQkvLyByZWxhdGl2ZS1zaXplCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9SRUxBVElWRV9TSVpFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTUFMTEVSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MQVJHRVIpOwotCi0JCUxPQURJTkcgPSAyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0xvYWRpbmcoKSB7Ci0JCXJldHVybiBMT0FESU5HID09IDE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTmVlZEluaXRpYWxpemUoKSB7Ci0JCXJldHVybiBMT0FESU5HID09IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTnVtYmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01OdW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5NmJiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01OdW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNTnVtYmVyIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9BTkdMRSA9ICJhbmdsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfRlJFUVVFTkNZID0gImZyZXF1ZW5jeSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfSU5URUdFUiA9ICJpbnRlZ2VyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9MRU5HVEggPSAibGVuZ3RoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9QRVJDRU5UQUdFID0gInBlcmNlbnRhZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX1RJTUUgPSAidGltZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfSEFTSCA9ICJoYXNoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfTlVNID0gIm51bWJlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9DTSA9ICJjbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9ERUcgPSAiZGVnIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0VNUyA9ICJlbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9FWFMgPSAiZXgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fR1JBRCA9ICJncmFkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0hBU0ggPSAiIyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9IWiA9ICJIeiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9JTiA9ICJpbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9JTlRFR0VSID0gIklOVEVHRVIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fS0haID0gImtIeiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9NTSA9ICJtbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9NUyA9ICJtcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9OVU1CRVIgPSAiTlVNQkVSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX1BDID0gInBjIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX1BFUkNFTlRBR0UgPSAiJSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QVCA9ICJwdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QWCA9ICJweCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9SQUQgPSAicmFkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX1MgPSAicyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgamF2YS51dGlsLlZlY3RvciBmRGltcyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01OdW1iZXIoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGltZW5zaW9uKHNob3J0IHByaW1pdGl2ZVR5cGUpIHsKLQkJc3dpdGNoIChwcmltaXRpdmVUeXBlKSB7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJcmV0dXJuIERJTV9DTTsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRyA6Ci0JCQkJcmV0dXJuIERJTV9ERUc7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FTVMgOgotCQkJCXJldHVybiBESU1fRU1TOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRVhTIDoKLQkJCQlyZXR1cm4gRElNX0VYUzsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQgOgotCQkJCXJldHVybiBESU1fR1JBRDsKLQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19IQVNIIDoKLQkJCQlyZXR1cm4gRElNX0hBU0g7IC8vIHByZWZpeCBkaW1lbnNpb24gLi4uLgotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCXJldHVybiBESU1fSFo7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTiA6Ci0JCQkJcmV0dXJuIERJTV9JTjsKLQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSIDoKLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haIDoKLQkJCQlyZXR1cm4gRElNX0tIWjsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01NIDoKLQkJCQlyZXR1cm4gRElNX01NOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTVMgOgotCQkJCXJldHVybiBESU1fTVM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVIgOgotCQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQyA6Ci0JCQkJcmV0dXJuIERJTV9QQzsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0UgOgotCQkJCXJldHVybiBESU1fUEVSQ0VOVEFHRTsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUIDoKLQkJCQlyZXR1cm4gRElNX1BUOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFggOgotCQkJCXJldHVybiBESU1fUFg7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQgOgotCQkJCXJldHVybiBESU1fUkFEOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUyA6Ci0JCQkJcmV0dXJuIERJTV9TOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFNldCBnZXREaW1lbnNpb25zKCkgewotCQlIYXNoU2V0IHZhbHMgPSBuZXcgSGFzaFNldCgpOwotCQlJdGVyYXRvciBpdCA9IGZEaW1zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXZhbHMuYWRkKGl0Lm5leHQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldElkZW50aWZpZXJzKFNldCBpbmRlbnRzKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHB1YmxpYyBQcm9wQ01OdW1iZXIgZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDIwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01OdW1iZXIpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNTnVtYmVyKG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNTnVtYmVyKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX05VTUJFUjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcykgewotCQlpZiAodmFsdWVzICE9IG51bGwgJiYgIXZhbHVlcy5jb250YWlucyh0aGlzKSkKLQkJCXZhbHVlcy5hZGQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHZvaWQgaW5pdE51bWJlckNNRGltKCkgewotCQlQcm9wQ01OdW1iZXIgbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfQU5HTEUpOwotCQludW0uZkRpbXMuYWRkKERJTV9ERUcpOwotCQludW0uZkRpbXMuYWRkKERJTV9HUkFEKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUkFEKTsKLQotCQludW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9GUkVRVUVOQ1kpOwotCQludW0uZkRpbXMuYWRkKERJTV9IWik7Ci0JCW51bS5mRGltcy5hZGQoRElNX0tIWik7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfSEFTSCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0hBU0gpOwotCi0JCS8vIG51bSA9IGdldEluc3RhbmNlT2YoVkFMX0lOVEVHRVIpOwotCQkvLyBudW0uZkRpbXMuYWRkKERJTV9JTlRFR0VSKTsKLQotCQludW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9MRU5HVEgpOwotCQludW0uZkRpbXMuYWRkKERJTV9DTSk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0VNUyk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0VYUyk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0lOKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fTU0pOwotCQludW0uZkRpbXMuYWRkKERJTV9QQyk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1BUKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUFgpOwotCi0JCS8vIG51bSA9IGdldEluc3RhbmNlT2YoVkFMX05VTUJFUik7Ci0JCS8vIG51bS5mRGltcy5hZGQoRElNX05VTUJFUik7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfUEVSQ0VOVEFHRSk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1BFUkNFTlRBR0UpOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX1RJTUUpOwotCQludW0uZkRpbXMuYWRkKERJTV9NUyk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1MpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYWIzOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNUHJvcGVydHkgZXh0ZW5kcyBQcm9wQ01Db250YWluZXIgewotCi0JLy8gc3RhdGljIGZpZWxkcwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGNhY2hlZElkTWFwID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0FaSU1VVEggPSAiYXppbXV0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkcgPSAiYmFja2dyb3VuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfQVRUQUNITUVOVCA9ICJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX0NPTE9SID0gImJhY2tncm91bmQtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX0lNQUdFID0gImJhY2tncm91bmQtaW1hZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX1BPU0lUSU9OID0gImJhY2tncm91bmQtcG9zaXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX1JFUEVBVCA9ICJiYWNrZ3JvdW5kLXJlcGVhdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSID0gImJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0NPTExBUFNFID0gImJvcmRlci1jb2xsYXBzZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0NPTE9SID0gImJvcmRlci1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1NQQUNJTkcgPSAiYm9yZGVyLXNwYWNpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9TVFlMRSA9ICJib3JkZXItc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1AgPSAiYm9yZGVyLXRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUID0gImJvcmRlci1yaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTSA9ICJib3JkZXItYm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVCA9ICJib3JkZXItbGVmdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9DT0xPUiA9ICJib3JkZXItdG9wLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfQ09MT1IgPSAiYm9yZGVyLXJpZ2h0LWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX0NPTE9SID0gImJvcmRlci1ib3R0b20tY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX0NPTE9SID0gImJvcmRlci1sZWZ0LWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX1NUWUxFID0gImJvcmRlci10b3Atc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9TVFlMRSA9ICJib3JkZXItcmlnaHQtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fU1RZTEUgPSAiYm9yZGVyLWJvdHRvbS1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfU1RZTEUgPSAiYm9yZGVyLWxlZnQtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfV0lEVEggPSAiYm9yZGVyLXRvcC13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX1dJRFRIID0gImJvcmRlci1yaWdodC13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9XSURUSCA9ICJib3JkZXItYm90dG9tLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9XSURUSCA9ICJib3JkZXItbGVmdC13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1dJRFRIID0gImJvcmRlci13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9UVE9NID0gImJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ0FQVElPTl9TSURFID0gImNhcHRpb24tc2lkZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ0xFQVIgPSAiY2xlYXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NMSVAgPSAiY2xpcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09MT1IgPSAiY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NPTlRFTlQgPSAiY29udGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09VTlRFUl9JTkNSRU1FTlQgPSAiY291bnRlci1pbmNyZW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NPVU5URVJfUkVTRVQgPSAiY291bnRlci1yZXNldCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VFID0gImN1ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VFX0FGVEVSID0gImN1ZS1hZnRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VFX0JFRk9SRSA9ICJjdWUtYmVmb3JlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVVJTT1IgPSAiY3Vyc29yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9ESVJFQ1RJT04gPSAiZGlyZWN0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9ESVNQTEFZID0gImRpc3BsYXkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0VMRVZBVElPTiA9ICJlbGV2YXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0VNUFRZX0NFTExTID0gImVtcHR5LWNlbGxzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GTE9BVCA9ICJmbG9hdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVCA9ICJmb250IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX0ZBTUlMWSA9ICJmb250LWZhbWlseSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TSVpFID0gImZvbnQtc2l6ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TSVpFX0FESlVTVCA9ICJmb250LXNpemUtYWRqdXN0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NUUkVUQ0ggPSAiZm9udC1zdHJldGNoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NUWUxFID0gImZvbnQtc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfVkFSSUFOVCA9ICJmb250LXZhcmlhbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfV0VJR0hUID0gImZvbnQtd2VpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9IRUlHSFQgPSAiaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MRUZUID0gImxlZnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xFVFRFUl9TUEFDSU5HID0gImxldHRlci1zcGFjaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSU5FX0hFSUdIVCA9ICJsaW5lLWhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRSA9ICJsaXN0LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX0lNQUdFID0gImxpc3Qtc3R5bGUtaW1hZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfUE9TSVRJT04gPSAibGlzdC1zdHlsZS1wb3NpdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9UWVBFID0gImxpc3Qtc3R5bGUtdHlwZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOID0gIm1hcmdpbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX1RPUCA9ICJtYXJnaW4tdG9wIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fUklHSFQgPSAibWFyZ2luLXJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fQk9UVE9NID0gIm1hcmdpbi1ib3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9MRUZUID0gIm1hcmdpbi1sZWZ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJLRVJfT0ZGU0VUID0gIm1hcmtlci1vZmZzZXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUktTID0gIm1hcmtzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVhfSEVJR0hUID0gIm1heC1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BWF9XSURUSCA9ICJtYXgtd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01JTl9IRUlHSFQgPSAibWluLWhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUlOX1dJRFRIID0gIm1pbi13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1JQSEFOUyA9ICJvcnBoYW5zIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FID0gIm91dGxpbmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfQ09MT1IgPSAib3V0bGluZS1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9TVFlMRSA9ICJvdXRsaW5lLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX1dJRFRIID0gIm91dGxpbmUtd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09WRVJGTE9XID0gIm92ZXJmbG93IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HID0gInBhZGRpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfVE9QID0gInBhZGRpbmctdG9wIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX1JJR0hUID0gInBhZGRpbmctcmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfQk9UVE9NID0gInBhZGRpbmctYm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX0xFRlQgPSAicGFkZGluZy1sZWZ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFID0gInBhZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0VfQlJFQUtfQUZURVIgPSAicGFnZS1icmVhay1hZnRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19CRUZPUkUgPSAicGFnZS1icmVhay1iZWZvcmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0VfQlJFQUtfSU5TSURFID0gInBhZ2UtYnJlYWstaW5zaWRlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRSA9ICJwYXVzZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0VfQUZURVIgPSAicGF1c2UtYWZ0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFX0JFRk9SRSA9ICJwYXVzZS1iZWZvcmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BJVENIID0gInBpdGNoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QSVRDSF9SQU5HRSA9ICJwaXRjaC1yYW5nZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUExBWV9EVVJJTkcgPSAicGxheS1kdXJpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BPU0lUSU9OID0gInBvc2l0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9RVU9URVMgPSAicXVvdGVzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9SSUNITkVTUyA9ICJyaWNobmVzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUklHSFQgPSAicmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NJWkUgPSAic2l6ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUsgPSAic3BlYWsiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLX0hFQURFUiA9ICJzcGVhay1oZWFkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLX05VTUVSQUwgPSAic3BlYWstbnVtZXJhbCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfUFVOQ1RVQVRJT04gPSAic3BlYWstcHVuY3R1YXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUVDSF9SQVRFID0gInNwZWVjaC1yYXRlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TVFJFU1MgPSAic3RyZXNzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9UQUJMRV9MQVlPVVQgPSAidGFibGUtbGF5b3V0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0FMSUdOID0gInRleHQtYWxpZ24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfREVDT1JBVElPTiA9ICJ0ZXh0LWRlY29yYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfSU5ERU5UID0gInRleHQtaW5kZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX1NIQURPVyA9ICJ0ZXh0LXNoYWRvdyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9UUkFOU0ZPUk0gPSAidGV4dC10cmFuc2Zvcm0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RPUCA9ICJ0b3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1VOSUNPREVfQklESSA9ICJ1bmljb2RlLWJpZGkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1ZFUlRJQ0FMX0FMSUdOID0gInZlcnRpY2FsLWFsaWduIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WSVNJQklMSVRZID0gInZpc2liaWxpdHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1ZPSUNFX0ZBTUlMWSA9ICJ2b2ljZS1mYW1pbHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1ZPTFVNRSA9ICJ2b2x1bWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1dISVRFX1NQQUNFID0gIndoaXRlLXNwYWNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XSURPV1MgPSAid2lkb3dzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XSURUSCA9ICJ3aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV09SRF9TUEFDSU5HID0gIndvcmQtc3BhY2luZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfWl9JTkRFWCA9ICJ6LWluZGV4IjsvLyROT04tTkxTLTEkCi0JLy8gaW5zdGFuY2UgZmllbGRzCi0JcHJpdmF0ZSBpbnQgZk1pblZhbHVlQ291bnQgPSAxOwotCXByaXZhdGUgaW50IGZNYXhWYWx1ZUNvdW50ID0gMTsKLQlwcml2YXRlIE9iamVjdFtdIG1lZGlhR3JvdXBzOwotCXByb3RlY3RlZCBMaXN0IGNvbnRhaW5lcnM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JT2JqZWN0IGFwcGVuZENoaWxkKE9iamVjdCBub2RlKSB7Ci0JCU9iamVjdCByZXQgPSBzdXBlci5hcHBlbmRDaGlsZChub2RlKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9wQ01Qcm9wZXJ0eSkgewotCQkJLy8gcmVnaXN0ZXIgc2hvcnRoYW5kIGNvbnRhaW5lcgotCQkJUHJvcENNUHJvcGVydHkgY20gPSAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0JCQlpZiAoY20uY29udGFpbmVycyA9PSBudWxsKQotCQkJCWNtLmNvbnRhaW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCQlpZiAoIWNtLmNvbnRhaW5lcnMuY29udGFpbnModGhpcykpCi0JCQkJY20uY29udGFpbmVycy5hZGQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFwcGVuZE1lZGlhR3JvdXAoT2JqZWN0IG1nKSB7Ci0JCWlmIChtZWRpYUdyb3VwcyA9PSBudWxsKQotCQkJbWVkaWFHcm91cHMgPSBuZXcgT2JqZWN0WzFdOwotCQllbHNlIHsKLQkJCU9iamVjdFtdIG9sZE1lZGlhR3JvdXBzID0gbWVkaWFHcm91cHM7Ci0JCQltZWRpYUdyb3VwcyA9IG5ldyBPYmplY3Rbb2xkTWVkaWFHcm91cHMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZE1lZGlhR3JvdXBzLCAwLCBtZWRpYUdyb3VwcywgMCwgb2xkTWVkaWFHcm91cHMubGVuZ3RoKTsKLQkJfQotCQltZWRpYUdyb3Vwc1ttZWRpYUdyb3Vwcy5sZW5ndGggLSAxXSA9IG1nOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcENNUHJvcGVydHkgZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMjAwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJbm9kZSA9IG5ldyBQcm9wQ01Qcm9wZXJ0eShuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4VmFsdWVDb3VudCgpIHsKLQkJcmV0dXJuIGZNYXhWYWx1ZUNvdW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lZGlhR3JvdXBzKCkgewotCQlpZiAobWVkaWFHcm91cHMgIT0gbnVsbCkKLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KG1lZGlhR3JvdXBzKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pblZhbHVlQ291bnQoKSB7Ci0JCXJldHVybiBmTWluVmFsdWVDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldE5hbWVFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5rZXlzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0eUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpIHsKLQkJcmV0dXJuIChjb250YWluZXJzID09IG51bGwpID8gMCA6IGNvbnRhaW5lcnMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX1BST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hvcnRoYW5kKCkgewotCQlpbnQgbkNoaWxkID0gZ2V0TnVtQ2hpbGQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGQ7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGdldENoaWxkQXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvcENNUHJvcGVydHkgJiYgIShvYmogaW5zdGFuY2VvZiBQcm9wQ01TdWJQcm9wZXJ0eSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIG5hbWVzKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIG5ldyBWZWN0b3IoaW5zdGFuY2VzLmtleVNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgbmFtZXMoT2JqZWN0IG1lZGlhR3JvdXApIHsKLQkJaWYgKG1lZGlhR3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybiBuYW1lcygpOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlWZWN0b3IgcHJvcGVydGllcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlJdGVyYXRvciBpdCA9IGluc3RhbmNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gKFByb3BDTVByb3BlcnR5KSBpdC5uZXh0KCk7Ci0JCQlpZiAocHJvcC5nZXRNZWRpYUdyb3VwcygpLmNvbnRhaW5zKG1lZGlhR3JvdXApKQotCQkJCXByb3BlcnRpZXMuYWRkKHByb3AuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIElmIGlkZW50aWZpZXIgaXMgbnVsbCwgZ2V0IGFsbCBwcm9wZXJ0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgcHJvcGVydGllc0ZvcihTdHJpbmcgaWRlbnRpZmllciwgYm9vbGVhbiBzaG9ydGhhbmRzKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBpZiBpZGVudGlmaWVyIGlzIG51bGwsIGdldCBhbGwgcHJvcGVydGllcwotCQlpZiAoaWRlbnRpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBWZWN0b3IoaW5zdGFuY2VzLnZhbHVlcygpKTsKLQotCQlpZiAoY2FjaGVkSWRNYXAgPT0gbnVsbCkgewotCQkJLy8gc3RhcnQgY2FjaGVpbmcKLQkJCWNhY2hlZElkTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2VhcmNoIGNhY2hlZAotCQkJT2JqZWN0IHJldCA9IGNhY2hlZElkTWFwLmdldChpZGVudGlmaWVyICsgU3RyaW5nLnZhbHVlT2Yoc2hvcnRoYW5kcykpOwotCQkJaWYgKHJldCAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgVmVjdG9yKChDb2xsZWN0aW9uKSByZXQpOwotCQl9Ci0KLQkJLy8gY3JlYXRlCi0JCUVudW1lcmF0aW9uIHByb3BlcnR5RW51bSA9IGdldFByb3BlcnR5RW51bSgpOwotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlIChwcm9wZXJ0eUVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3AgPSAoUHJvcENNUHJvcGVydHkpIHByb3BlcnR5RW51bS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCFzaG9ydGhhbmRzICYmIHByb3AuaXNTaG9ydGhhbmQoKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChwcm9wLmNhbkhhdmUoaWRlbnRpZmllcikpCi0JCQkJc2V0LmFkZChwcm9wKTsKLQkJfQotCi0JCS8vIGNhY2hlCi0JCWNhY2hlZElkTWFwLnB1dChpZGVudGlmaWVyICsgU3RyaW5nLnZhbHVlT2Yoc2hvcnRoYW5kcyksIHNldCk7Ci0KLQkJcmV0dXJuIG5ldyBWZWN0b3Ioc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXhWYWx1ZUNvdW50KGludCBuZXdNYXhWYWx1ZUNvdW50KSB7Ci0JCWZNYXhWYWx1ZUNvdW50ID0gbmV3TWF4VmFsdWVDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNaW5WYWx1ZUNvdW50KGludCBuZXdNaW5WYWx1ZUNvdW50KSB7Ci0JCWZNaW5WYWx1ZUNvdW50ID0gbmV3TWluVmFsdWVDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUHJvcENNUHJvcGVydHkgc2hvcnRoYW5kQ29udGFpbmVyQXQoaW50IGkpIHsKLQkJaWYgKGNvbnRhaW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaSA8IDAgfHwgY29udGFpbmVycy5zaXplKCkgPD0gaSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBjb250YWluZXJzLmdldChpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3Igc2hvcnRoYW5kQ29udGFpbmVySXRlcmF0b3IoKSB7Ci0JCWlmIChjb250YWluZXJzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCX0KLQkJCX07Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGNvbnRhaW5lcnMuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3RyaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMWU4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVN0cmluZyBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfRk9OVCA9ICJmb250IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9DT1VOVEVSX0lEID0gImNvdW50ZXJJZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfUEFHRV9JRCA9ICJwYWdlSWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX1ZPSUNFID0gInZvaWNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9BTlkgPSAiYW55IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTVN0cmluZyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldElkZW50aWZpZXJzKFNldCBpbmRlbnRzKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHB1YmxpYyBQcm9wQ01TdHJpbmcgZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01TdHJpbmcpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJbm9kZSA9IG5ldyBQcm9wQ01TdHJpbmcobmFtZSk7Ci0JCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0KLQkJcmV0dXJuIChQcm9wQ01TdHJpbmcpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfU1RSSU5HOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKHRoaXMpKQotCQkJdmFsdWVzLmFkZCh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdWJQcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3ViUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlYmIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdWJQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNU3ViUHJvcGVydHkgZXh0ZW5kcyBQcm9wQ01Qcm9wZXJ0eSB7Ci0KLQkvLyBzdGF0aWMgZmllbGRzCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQkdfUE9TSVRJT05fWCA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uSCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQkdfUE9TSVRJT05fWSA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uViI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQ0xJUF9UT1AgPSAiY2xpcFRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQ0xJUF9SSUdIVCA9ICJjbGlwUmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfQk9UVE9NID0gImNsaXBCb3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfTEVGVCA9ICJjbGlwTGVmdCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTVN1YlByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBzaG9ydGhhbmRDb250YWluZXJBdCgwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVByb3BlcnR5IGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJbm9kZSA9IG5ldyBQcm9wQ01TdWJQcm9wZXJ0eShuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0TmFtZUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmtleXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldFByb3BlcnR5RW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9TVUJQUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBuYW1lcygpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy5rZXlTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5IHByb3ApIHsKLQkJaWYgKGNvbnRhaW5lcnMgPT0gbnVsbCkKLQkJCWNvbnRhaW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbnRhaW5lcnMuY2xlYXIoKTsKLQkJY29udGFpbmVycy5hZGQocHJvcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVVSYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzU3MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNVVJhbmdlIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1VSQU5HRSA9ICJ1cmFuZ2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01VUmFuZ2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcENNVVJhbmdlIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNVVJhbmdlKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCW5vZGUgPSBuZXcgUHJvcENNVVJhbmdlKG5hbWUpOwotCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCi0JCXJldHVybiAoUHJvcENNVVJhbmdlKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX1VOSUNPREVfUkFOR0U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmJhMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVV0aWwgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1pbnVzKENvbGxlY3Rpb24gc3JjLCBDb2xsZWN0aW9uIHJlZikgewotCQlJdGVyYXRvciBpdCA9IHJlZi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKHNyYy5jb250YWlucyhvYmopKQotCQkJCXNyYy5yZW1vdmUob2JqKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBsdXMoQ29sbGVjdGlvbiBzcmMsIENvbGxlY3Rpb24gcmVmKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVmLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXNyYy5jb250YWlucyhvYmopKQotCQkJCXNyYy5hZGQob2JqKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ1NTQ29udGVudFByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ1NTQ29udGVudFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiYzU4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJvcGVydGllcyBjb25zdGFudHMgdXNlZCBieSBDU1MuIENsaWVudHMgc2hvdWxkIG9ubHkgcmVhZCBhbmQgbW9kaWZ5IHRoZQotICogQ1NTIHByb3BlcnRpZXMgcHJvZ3JhbW1hdGljYWxseSB1c2luZyB0aGlzIGNsYXNzLgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb250ZW50UHJvcGVydGllcyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDU1NDT1JFX0lEID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfS0VZID0gIjxwcm9qZWN0PiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGNzcyBwcm9maWxlIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BST0ZJTEUgPSAiY3NzLXByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgYSBwcmVmZXJlbmNlIGtleSBiYXNlZCBvbiByZXNvdXJjZVBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0aGUga2V5IHdpbGwgYmUgYmFzZWQgb2ZmIG9mCi0JICogQHJldHVybiBwcmVmZXJlbmNlIGtleSBiYXNlZCBvbiByZXNvdXJjZVBhdGggKGJhc2ljYWxseSB0aGUKLQkgKiAgICAgICAgIHJlc291cmNlUGF0aCB3aXRob3V0IHRoZSBmaWxlbmFtZSk7IFBST0pFQ1RfS0VZIGlmIHJlc291cmNlUGF0aAotCSAqICAgICAgICAgaXMgbnVsbAotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0S2V5Rm9yKElQYXRoIHJlc291cmNlUGF0aCkgewotCQlTdHJpbmcga2V5ID0gUFJPSkVDVF9LRVk7Ci0JCWlmIChyZXNvdXJjZVBhdGggIT0gbnVsbCAmJiByZXNvdXJjZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlrZXkgPSByZXNvdXJjZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcmVmZXJlbmNlcyBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdCBzY29wZSBhbmQKLQkgKiBwcmVmZXJlbmNlIGtleSAoc3ViTm9kZSkgSWYgY3JlYXRlIGlzIHRydWUsIHRoZSBwcmVmZXJlbmNlIG5vZGUgd2lsbCBiZQotCSAqIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgdGhlIHByZWZlcmVuY2Ugbm9kZSBpcyB1bmRlcgotCSAqIEBwYXJhbSBwcmVmZXJlbmNlS2V5Ci0JICogICAgICAgICAgICB0aGUgc3Vibm9kZS9jYXRlZ29yeSB0aGUgcHJlZmVyZW5jZSBub2RlIGlzIGxvY2F0ZWQgaW4KLQkgKiBAcGFyYW0gY3JlYXRlCi0JICogICAgICAgICAgICBpZiB0cnVlLCBhIHByZWZlcmVuY2Ugbm9kZSB3aWxsIGJlIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90Ci0JICogICAgICAgICAgICBhbHJlYWR5IGV4aXN0Ci0JICogQHJldHVybiBQcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2plY3Qgc2NvcGUgYW5kCi0JICogICAgICAgICBwcmVmZXJlbmNlIGtleS4gbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGZvdW5kIGFuZCBjcmVhdGUgaXMKLQkgKiAgICAgICAgIGZhbHNlCi0JICovCi0Jc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwcmVmZXJlbmNlS2V5LCBib29sZWFuIGNyZWF0ZSkgewotCQlpZiAoY3JlYXRlKQotCQkJLy8gY3JlYXRlIGFsbCBub2RlcyBkb3duIHRvIHRoZSBvbmUgd2UgYXJlIGludGVyZXN0ZWQgaW4KLQkJCXJldHVybiBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLmdldE5vZGUoQ1NTQ09SRV9JRCkubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJLy8gYmUgY2FyZWZ1bCBsb29raW5nIHVwIGZvciBvdXIgbm9kZSBzbyBub3QgdG8gY3JlYXRlIGFueSBub2RlcyBhcwotCQkvLyBzaWRlIGVmZmVjdAotCQlQcmVmZXJlbmNlcyBub2RlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0Um9vdE5vZGUoKS5ub2RlKFByb2plY3RTY29wZS5TQ09QRSk7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPIG9uY2UgYnVnIDkwNTAwIGlzIGZpeGVkLCBzaG91bGQgYmUgYXMgc2ltcGxlIGFzIHRoaXM6Ci0JCQkvLyBTdHJpbmcgcGF0aCA9IHByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsKLQkJCS8vIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gRU5DT0RJTkdfUFJFRl9OT0RFOwotCQkJLy8gcmV0dXJuIG5vZGUubm9kZUV4aXN0cyhwYXRoKSA/IG5vZGUubm9kZShwYXRoKSA6IG51bGw7Ci0JCQkvLyBmb3Igbm93LCB0YWtlIHRoZSBsb25nIHdheQotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMocHJvamVjdC5nZXROYW1lKCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUubm9kZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhDU1NDT1JFX0lEKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLm5vZGUoQ1NTQ09SRV9JRCk7Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhwcmVmZXJlbmNlS2V5KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBub2RlLm5vZGUocHJlZmVyZW5jZUtleSk7Ci0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub2RlRXhpc3RzIGZhaWxlZAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCByZXRyaWV2ZSBwcmVmZXJlbmNlIG5vZGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRleHQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY29udGV4dCBpcwotCSAqICAgICAgICAgICAgYXZhaWxhYmxlIGFuZCB0aGUgd29ya3NwYWNlIHNldHRpbmcgc2hvdWxkIGJlIHRha2VuLiBOb3RlCi0JICogICAgICAgICAgICB0aGF0IHBhc3NpbmcgPGNvZGU+bnVsbDwvY29kZT4gc2hvdWxkIGJlIGF2b2lkZWQuCi0JICogQHBhcmFtIHJlY3Vyc2UKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHBhcmVudCBzaG91bGQgYmUgcXVlcmllZCB0aWxsIHByb3BlcnR5IGlzIGZvdW5kCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUga2V5LgotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVjdXJzZSkgewotCQlTdHJpbmcgdmFsID0gbnVsbDsKLQkJLy8gYm9vbGVhbiBwcmVmZXJlbmNlRm91bmQgPSBmYWxzZTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcyhwcm9qZWN0LCBrZXksIGZhbHNlKTsKLQkJCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCQl2YWwgPSBpbnRlcm5hbEdldFByb3BlcnR5KHJlc291cmNlLCByZWN1cnNlLCBwcmVmZXJlbmNlcyk7Ci0JCQkJCS8vIHByZWZlcmVuY2VGb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIC8vIG5vIHByZWZlcmVuY2VzIGZvdW5kIC0gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsCi0JCS8vIC8vIHNob3J0LWNpcmN1aXQKLQkJLy8gLy8gbG9va3VwIGJ5IGZhbGxpbmcgYmFjayB0byB3b3Jrc3BhY2UncyBkZWZhdWx0Ci0JCS8vIC8vIHNldHRpbmcKLQkJLy8gaWYgKCFwcmVmZXJlbmNlRm91bmQpCi0JCS8vIHZhbCA9IGdldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxHZXRQcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVjdXJzZSwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgbnVsbCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsICYmIHJlc291cmNlICE9IHJlc291cmNlLmdldFByb2plY3QoKSAmJiByZWN1cnNlKSB7Ci0JCQl2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IobnVsbCksIG51bGwpOwotCQl9Ci0KLQkJLy8gV29ya2JlbmNoIHByZWZlcmVuY2UgbWF5IG5vdCBiZSBuZWVkZWQgc28gbGVhdmUgb3V0IGZvciBub3cKLQkJLy8gLy8gZW5zdXJlIHdlIGRlZmF1bHQgdG8gdGhlIHdvcmtzcGFjZSBwcmVmZXJlbmNlIGlmIG5vbmUgaXMgZm91bmQKLQkJLy8gcmV0dXJuIHZhbHVlID09IG51bGwgPyBnZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSkgOiB2YWx1ZTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRleHQuIE5vdGUgY29udGV4dCBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGtleS4gSWYgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRoZSBrZXkgaXMgcmVtb3ZlZCBmcm9tIHByb3BlcnRpZXMuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCXByZWZlcmVuY2VzLnJlbW92ZShnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCWVsc2UKLQkJCQkJcHJlZmVyZW5jZXMucHV0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgdmFsdWUpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIHNhdmUgY2hhbmdlcwotCQkJCQlwcmVmZXJlbmNlcy5mbHVzaCgpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDU1NDT1JFX0lELCBJU3RhdHVzLkVSUk9SLCAiVW5hYmxlIHRvIHNldCBwcm9wZXJ0eSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyBqdXN0IHNldCBhIHByZWZlcmVuY2UgaW4gdGhlIGluc3RhbmNlIHNjb3BlCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKSB7Ci0JCS8vIHNldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJLy8gfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWE0YjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciB7Ci0JcHVibGljIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQlmSm9iID0gbmV3IENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciBfaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGZKb2I7Ci0KLQkvKioKLQkgKiBUaGlzIGpvYiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiB0byBzY2hlZHVsZSBvcGVyYXRpb25zIHRoYXQgbmVlZCB0byBtb2RpZnkgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX1VQREFURV9ERUxBWSA9IDUwMDsKLQkJcHJpdmF0ZSBMaXN0IGFzeW5jQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCkgewotCQkJc3VwZXIoQ1NTQ29yZU1lc3NhZ2VzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZyk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQ2hhbmdlcyhTZXQgbmV3Q2hhbmdlcykgewotCQkJaWYgKG5ld0NoYW5nZXMuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJYXN5bmNDaGFuZ2VzLmFkZEFsbChuZXdDaGFuZ2VzKTsKLQkJCQlhc3luY0NoYW5nZXMubm90aWZ5KCk7Ci0JCQl9Ci0JCQlzY2hlZHVsZShQUk9QRVJUSUVTX1VQREFURV9ERUxBWSk7Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0TmV4dENoYW5nZSgpIHsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJcmV0dXJuIGFzeW5jQ2hhbmdlcy5pc0VtcHR5KCkgPyBudWxsIDogKElQcm9qZWN0KSBhc3luY0NoYW5nZXMucmVtb3ZlKGFzeW5jQ2hhbmdlcy5zaXplKCkgLSAxKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhDU1NDb250ZW50UHJvcGVydGllcy5DU1NDT1JFX0lELCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgQ1NTQ29yZU1lc3NhZ2VzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgbnVsbCk7Ci0JCQltb25pdG9yID0gbW9uaXRvciA9PSBudWxsID8gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSA6IG1vbml0b3I7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcsIGFzeW5jQ2hhbmdlcy5zaXplKCkpOwotCQkJCXRyeSB7Ci0JCQkJCUlQcm9qZWN0IG5leHQ7Ci0JCQkJCXdoaWxlICgobmV4dCA9IGdldE5leHRDaGFuZ2UoKSkgIT0gbnVsbCkgewotCQkJCQkJLy8ganVzdCBleGl0IGlmIHRoZSBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biBvciBoYXMKLQkJCQkJCS8vIGJlZW4gc2h1dCBkb3duCi0JCQkJCQkvLyBpdCBpcyB0b28gbGF0ZSB0byBjaGFuZ2UgdGhlIHdvcmtzcGFjZSBhdCB0aGlzCi0JCQkJCQkvLyBwb2ludCBhbnl3YXkKLQkJCQkJCWlmIChQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLm9zZ2kiKS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gc2F2ZSB0aGUgcHJlZmVyZW5jZXMgbm9kZXMKLQkJCQkJCQlpZiAobmV4dC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQkvLyBzYXZlIGNzcyBwcm9maWxlIHByZWZlcmVuY2VzCi0JCQkJCQkJCVByZWZlcmVuY2VzIHByb2plY3RQcmVmcyA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKG5leHQsIENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBmYWxzZSk7Ci0JCQkJCQkJCWlmIChwcm9qZWN0UHJlZnMgIT0gbnVsbCkKLQkJCQkJCQkJCXByb2plY3RQcmVmcy5mbHVzaCgpOwotCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gd2UgZ290IGFuIGVycm9yIHNhdmluZwotCQkJCQkJCVN0cmluZyBkZXRhaWxNZXNzYWdlID0gTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZywgbmV4dC5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJCQlyZXN1bHQuYWRkKG5ldyBTdGF0dXMoMSA8PCAoSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQgJSAxMDAgLyAzMyksIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBkZXRhaWxNZXNzYWdlLCBlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2Ijc2hvdWxkUnVuKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFJ1bigpIHsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJcmV0dXJuICFhc3luY0NoYW5nZXMuaXNFbXB0eSgpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbnRyeUNoYW5nZXMoSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCS8vIGNoZWNrIGVhY2ggcmVzb3VyY2Ugd2l0aCBjc3MgY29udGVudCBzZXR0aW5nIHRvIHNlZSBpZiBpdCBoYXMKLQkJCS8vIGJlZW4gbW92ZWQvZGVsZXRlZAotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMgPSBmYWxzZTsKLQotCQkJLy8gcHJvamVjdCBhZmZlY3RlZAotCQkJSVByb2plY3QgY3VycmVudFByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3REZWx0YS5nZXRSZXNvdXJjZSgpOwotCi0JCQlyZXNvdXJjZUNoYW5nZXMgPSBwcm9jZXNzUHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBwcm9qZWN0RGVsdGEsIHByb2plY3RzVG9TYXZlKTsKLQotCQkJLy8gaWYgdGhlcmUgd2FzIGEgcHJlZmVyZW5jZSBrZXkgY2hhbmdlLCBuZWVkIHRvIHNhdmUgcHJlZmVyZW5jZXMKLQkJCWlmIChyZXNvdXJjZUNoYW5nZXMpCi0JCQkJcHJvamVjdHNUb1NhdmUuYWRkKGN1cnJlbnRQcm9qZWN0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBHb2VzIHRocm91Z2ggYWxsIHRoZSByZXNvdXJjZS1kZXBlbmRlbnQgcHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoCi0JCSAqIGN1cnJlbnRQcm9qZWN0ICYga2V5IGFuZCB1cGRhdGVzIHRoZSBwcmVmZXJlbmNlIGtleXMgaWYgbmVlZGVkCi0JCSAqIGJhc2VkIG9uIHByb2plY3REZWx0YQotCQkgKiAKLQkJICogQHBhcmFtIGN1cnJlbnRQcm9qZWN0Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBwcm9qZWN0IG9mIHRoZSBwcmVmZXJlbmNlcyB0byBiZSBsb29rZWQgYXQKLQkJICogQHBhcmFtIGtleQotCQkgKiAgICAgICAgICAgIGN1cnJlbnQga2V5L3N1YmNhdGVnb3J5IG9mIHRoZSBwcmVmZXJlbmNlcyB0byBiZSBsb29rZWQKLQkJICogICAgICAgICAgICBhdAotCQkgKiBAcGFyYW0gcHJvamVjdERlbHRhCi0JCSAqICAgICAgICAgICAgdGhlIGNoYW5nZXMgdG8gcHJvY2VzcyB0aGUgcHJlZmVyZW5jZSBrZXlzIGFnYWluc3QKLQkJICogQHBhcmFtIHByb2plY3RzVG9TYXZlCi0JCSAqICAgICAgICAgICAgdGhlIHByb2plY3RzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkL3NhdmVkCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiBjdXJyZW50UHJvamVjdCdzIHByZWZlcmVuY2VzIHdlcmUgbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUHJlZmVyZW5jZXMoSVByb2plY3QgY3VycmVudFByb2plY3QsIFN0cmluZyBrZXksIElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCi0JCQkvLyBnZXQgdGhlIHByb2plY3Qta2V5IHByZWZlcmVuY2Ugbm9kZQotCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJaWYgKHByb2plY3RQcmVmcyA9PSBudWxsKQotCQkJCS8vIG5vIHByZWZlcmVuY2VzIGZvciB0aGlzIHByb2plY3Qta2V5LCBqdXN0IGJhaWwKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdbXSBhZmZlY3RlZFJlc291cmNlczsKLQkJCXRyeSB7Ci0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBwcm9qZWN0UHJlZnMua2V5cygpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbXMgd2l0aCB0aGUgcHJvamVjdCBzY29wZS4uLiB3ZSBnb25uYSBtaXNzIHRoZQotCQkJCS8vIGNoYW5nZXMgKGJ1dCB3aWxsIGxvZykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiUHJvYmxlbSByZXRyZWl2aW5nIEpTUCBGcmFnbWVudCBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBnbyB0aHJvdWdoIGVhY2ggcHJlZmVyZW5jZSBrZXkgKHdoaWNoIGlzIHJlYWxseSBhIGZpbGUgbmFtZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBzZWUgaWYgcHJlZmVyZW5jZSBrZXkvZmlsZSBuYW1lIHdhcyBmaWxlIHRoYXQgd2FzIGNoYW5nZWQKLQkJCQlJUmVzb3VyY2VEZWx0YSBtZW1iZXJEZWx0YSA9IHByb2plY3REZWx0YS5maW5kTWVtYmVyKG5ldyBQYXRoKGFmZmVjdGVkUmVzb3VyY2VzW2ldKSk7Ci0JCQkJLy8gbm8gY2hhbmdlcyBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JCQkJaWYgKG1lbWJlckRlbHRhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtZW1iZXJEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQlyZXNvdXJjZUNoYW5nZXMgPSB0cnVlOwotCQkJCQkvLyByZW1vdmUgdGhlIHNldHRpbmcgZm9yIHRoZSBvcmlnaW5hbCBsb2NhdGlvbgotCQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJvamVjdFByZWZzLmdldChhZmZlY3RlZFJlc291cmNlc1tpXSwgbnVsbCk7Ci0JCQkJCXByb2plY3RQcmVmcy5yZW1vdmUoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pOwotCQkJCQlpZiAoKG1lbWJlckRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCQkJCQkJLy8gaWYgbW92aW5nLCBjb3B5IHRoZSBzZXR0aW5nIGZvciB0aGUgbmV3IGxvY2F0aW9uCi0JCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkuc2VnbWVudCgwKSk7Ci0JCQkJCQlQcmVmZXJlbmNlcyB0YXJnZXRQcmVmcyA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKHRhcmdldFByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJCQl0YXJnZXRQcmVmcy5wdXQoQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0S2V5Rm9yKG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkpLCBjdXJyZW50VmFsdWUpOwotCQkJCQkJaWYgKHRhcmdldFByb2plY3QgIT0gY3VycmVudFByb2plY3QpCi0JCQkJCQkJcHJvamVjdHNUb1NhdmUuYWRkKHRhcmdldFByb2plY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc291cmNlQ2hhbmdlczsKLQkJfQotCi0JCS8qKgotCQkgKiBGb3IgYW55IGNoYW5nZSB0byB0aGUgZW5jb2RpbmcgZmlsZSBvciBhbnkgcmVzb3VyY2Ugd2l0aCBlbmNvZGluZwotCQkgKiBzZXQsIGp1c3QgZGlzY2FyZCB0aGUgY2FjaGUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUlSZXNvdXJjZURlbHRhW10gcHJvamVjdERlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCS8vIHByb2Nlc3MgZWFjaCBwcm9qZWN0IGluIHRoZSBkZWx0YQotCQkJU2V0IHByb2plY3RzVG9TYXZlID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdERlbHRhcy5sZW5ndGg7IGkrKykKLQkJCQkvLyBub3RoaW5nIHRvIGRvIGlmIGEgcHJvamVjdCBoYXMgYmVlbiBhZGRlZC9yZW1vdmVkL21vdmVkCi0JCQkJaWYgKHByb2plY3REZWx0YXNbaV0uZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgKHByb2plY3REZWx0YXNbaV0uZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pID09IDApCi0JCQkJCXByb2Nlc3NFbnRyeUNoYW5nZXMocHJvamVjdERlbHRhc1tpXSwgcHJvamVjdHNUb1NhdmUpOwotCQkJZkpvYi5hZGRDaGFuZ2VzKHByb2plY3RzVG9TYXZlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc3RhcnR1cCgpIHsKLQkJX2luc3RhbmNlID0gbmV3IENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjg3NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBubyBtZWFucyBtZWFudCB0byBiZQotICogZ2VuZXJhbCBwdXJwb3NlLiBJdHMgdXNlIGlzIHJlc3RyaWN0ZWQgdG8gdGhvc2UgY2FzZXMgd2hlcmUgdGhlIGlucHV0Ci0gKiBzdHJlYW0gY2FuIGJlIHJlZ2FyZGVkIGFzIGFzY2lpIGp1c3QgbG9uZyBlbm91Z2ggdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHJlYWwKLSAqIGVuY29kaW5nIHNob3VsZCBiZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQnl0ZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gQ29kZWRJTy5NQVhfQlVGX1NJWkU7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHJvdGVjdGVkIEJ5dGVSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmZCdWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgewotCQl0aGlzLmZJbnB1dFN0cmVhbS5tYXJrKHJlYWRBaGVhZExpbWl0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYjAgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCXJldHVybiAoYjAgJiAweDAwRkYpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsZW5ndGggPiB0aGlzLmZCdWZmZXIubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSB0aGlzLmZCdWZmZXIubGVuZ3RoOwotCQl9Ci0KLQkJaW50IGNvdW50ID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCh0aGlzLmZCdWZmZXIsIDAsIGxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbnQgYjAgPSB0aGlzLmZCdWZmZXJbaV07Ci0JCQkvLyB0aGUgMHgwMEZGIGlzIHRvICJsb3NlIiB0aGUgbmVnYXRpdmUgYml0cyBmaWxsZWQgaW4gdGhlIGJ5dGUgdG8KLQkJCS8vIGludCBjb252ZXJzaW9uCi0JCQkvLyAoYW5kIHdoaWNoIHdvdWxkIGJlIHRoZXJlIGlmIGNhc3QgZGlyZWN0bHkgZnJvbSBieXRlIHRvIGNoYXIpLgotCQkJY2hhciBjMCA9IChjaGFyKSAoYjAgJiAweDAwRkYpOwotCQkJY2hbb2Zmc2V0ICsgaV0gPSBjMDsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ucmVzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLnNraXAobik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmRmZmVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MCArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiA3LzI4LzA4IDU6MTkgUE0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gNy8yOC8wOCA1OjE5IFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L3dvcmtzcGFjZXMvd3RwMzAxL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpGbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIENTU0hlYWRUb2tlbml6ZXIgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTUV9TVFJJTkcgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQ0hBUlNFVF9SVUxFID0gNDsKLQotICAvKioKLSAgICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsIDcKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDFcMTFcMTBcMFwxXDZcMVwxMFwyXDBcMVw3XDIyXDBcMVw2XDFcMFwxXDM3IisKLSAgICAiXDJcMFwxXDQyXDFcMFwxXDQwXDdcMFwxXDQxXDEzXDBcMVwzNlwxXDEzXDFcMTIiKwotICAgICJcMVwzNVwxXDE0XDFcMjBcMVwyM1wxXDBcMVwyMVwxXDMyXDFcMjZcMVwwXDFcMzQiKwotICAgICJcMVwyMlwxXDMzXDJcMFwxXDE3XDFcMTZcMVwzMFwxXDMxXDJcMFwxXDI0XDFcMjUiKwotICAgICJcMVwyN1wzXDBcMVwxNVwxMFwwXDFcMjNcMVwwXDFcMjFcMVwzMlwxXDI2XDFcMCIrCi0gICAgIlwxXDM0XDFcMjJcMVwzM1wyXDBcMVwxN1wxXDE2XDFcMzBcMVwzMVwyXDBcMVwyNCIrCi0gICAgIlwxXDI1XDFcMjdcM1wwXDFcMTVcMTAyXDBcMVw0XDNcMFwxXDVcMTdcMFwxXDMiKwotICAgICJcMTZcMFwxXDFcMjBcMFwxXDNcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotLy8gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKiAKLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgCQkgKiBmcm9tIGlucHV0IAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0vLyAgCQl5eWxpbmUgPSAwOwotCi0gIAkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXljaGFyID0gMDsKLQotICAJCS8qKgotICAJCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gIAkJICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAJCSAqLwotLy8gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0gIAkJCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQkKLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIENTU0hlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE2MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgeXlfYXRCT0wgPSB5eV9tYXJrZWRQb3MgPD0gMCB8fCB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdcbic7Ci0gICAgICBpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xyJykgewotICAgICAgICB5eV9hdEJPTCA9IHl5X2FkdmFuY2UoKSAhPSAnXG4nOwotICAgICAgICBpZiAoIXl5X2F0RU9GKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICBpZiAoeXlfYXRCT0wpCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZSsxXTsKLSAgICAgIGVsc2UKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXljbWFwW3l5X2lucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4geXlfbm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHl5X2Zvck5leHQ6IHsgc3dpdGNoICh5eV9zdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHl5X3N0YXRlID0gNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfc3RhdGUgPSA2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA2NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X3N0YXRlID0gNjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDc2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDc4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gODM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA4NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA4NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gODE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSA4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA5MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gODc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA5MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X3N0YXRlID0gODk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogeXlfc3RhdGUgPSA5NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gOTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDk4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gOTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9zdGF0ZSA9IDk1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDEwMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTAyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gOTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTA0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gMTA1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gMTAxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSAxMDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9zdGF0ZSA9IDEwNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDEwNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHl5X2lzRmluYWwgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggeXlfbm9Mb29rQWhlYWQgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAxMTk6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgY2FzZSAxMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyAgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5SdWxlRW5kOyB9Ci0gICAgICAgIGNhc2UgMTIxOiBicmVhazsKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTIyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSAge3l5YmVnaW4oQ0hBUlNFVF9SVUxFKTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFO30gfQotICAgICAgICBjYXNlIDEyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O30gfQotICAgICAgICBjYXNlIDEyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgICB7IGlmKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30gfQotICAgICAgICBjYXNlIDEyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7IH0KLSAgICAgICAgY2FzZSAxMjY6IGJyZWFrOwotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOyB9Ci0gICAgICAgIGNhc2UgMTI3OiBicmVhazsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgfQotICAgICAgICBjYXNlIDEyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTsgfQotICAgICAgICBjYXNlIDEyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsgfQotICAgICAgICBjYXNlIDEzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NOyB9Ci0gICAgICAgIGNhc2UgMTMxOiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgICB7ICBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyAgfQotICAgICAgICBjYXNlIDEzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMTMzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSAxMzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgICB7ICBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSAxMzc6IGJyZWFrOwotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzODogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBDU1NIZWFkVG9rZW5pemVyIHNjYW5uZXIgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgc2Nhbm5lciA9IG5ldyBDU1NIZWFkVG9rZW5pemVyKCBuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgQ1NTSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZG8gewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTkxYTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMgewotCi0JU3RyaW5nIFJ1bGVFbmQgPSAiUnVsZUVuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0hBUlNFVF9SVUxFID0gIkNIQVJTRVRfUlVMRSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjVmYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLQotCi0KLXB1YmxpYyBjbGFzcyBDU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCWNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIE51bGxNZW1lbnRvKCkgewotCQkJc3VwZXIoKTsKLQkJCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBDU1NIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50bzsKLQlwcml2YXRlIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQlwcml2YXRlIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogVGhlcmUgaXMgbm8gc3BlYyBkZWZpbmVkIGVuY29kaW5nIGZvciBDU1MsIHNvIE51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBzaG91bGQgbWF0Y2ggd2hhdCdzIGluIHBsdWdpbi54bWwgKG9yIGxvb2sgaXQgdXAgZnJvbSB0aGVyZSkuCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0oU3RyaW5nIHRva2VuVHlwZSkgewotCQlib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IGZhbHNlOwotCQlpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUgfHwgdG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCWJ5dGVbXSBib20gPSAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUpID8gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzE2QkUgOiBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZMRTsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VW5pY29kZUJPTShib20pOwotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBDU1NIZWFkVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBDU1NIZWFkVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGVnYWxTdHJpbmcoU3RyaW5nIHZhbHVlVG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmICh2YWx1ZVRva2VuVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljaGVja0luQ29udGVudHMoKTsKLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJY2hlY2tIZXVyaXN0aWNzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tJbkNvbnRlbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQ1NTSGVhZFRva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tlbml6ZXIoKTsKLQkJdG9rZW5pemVyLnJlc2V0KGZSZWFkZXIpOwotCQlIZWFkUGFyc2VyVG9rZW4gdG9rZW4gPSBudWxsOwotCQlTdHJpbmcgdG9rZW5UeXBlID0gbnVsbDsKLQkJZG8gewotCQkJdG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQl0b2tlblR5cGUgPSB0b2tlbi5nZXRUeXBlKCk7Ci0JCQlpZiAoY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKHRva2VuVHlwZSkpIHsKLQkJCQkvLyBzaWRlIGVmZmVjdCBvZiBjYW5IYW5kbGUgaXMgdG8gY3JlYXRlIGFwcHJvcHJpYXRlIG1lbWVudG8KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLkNIQVJTRVRfUlVMRSkgewotCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQlTdHJpbmcgdmFsdWVUb2tlblR5cGUgPSB2YWx1ZVRva2VuLmdldFR5cGUoKTsKLQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodmFsdWVUb2tlblR5cGUpKSB7Ci0JCQkJCQljcmVhdGVFbmNvZGluZ01lbWVudG8odmFsdWVUb2tlbi5nZXRUZXh0KCksIEVuY29kaW5nTWVtZW50by5GT1VORF9FTkNPRElOR19JTl9DT05URU5UKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0hldXJpc3RpY3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlib29sZWFuIG5vSGV1cmlzdGljID0gZmFsc2U7Ci0JCVN0cmluZyBoZXVyaXN0aWNFbmNvZGluZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVszXTsKLQkJCWludCBuUmVhZCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZSZWFkZXIucmVhZHkoKSkgewotCQkJCQlpbnQgb25lQnl0ZSA9IGZSZWFkZXIucmVhZCgpOwotCQkJCQluUmVhZCsrOwotCQkJCQlpZiAob25lQnl0ZSA8PSAweEZGKSB7Ci0JCQkJCQlieXRlc1tpXSA9IChieXRlKSBvbmVCeXRlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbm9IZXVyaXN0aWMgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlub0hldXJpc3RpYyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbm9IZXVyaXN0aWMgJiYgblJlYWQgPT0gMykgewotCQkJCWhldXJpc3RpY0VuY29kaW5nID0gRW5jb2RpbmdHdWVzc2VyLmd1ZXNzRW5jb2RpbmcoYnl0ZXMsIDMpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBhbnkgSU8gZXhjZXB0aW9uLCB0aGVuIG5vdCBhIGhldXJpc3RpYyBjYXNlCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCX0KLQkJaWYgKGhldXJpc3RpY0VuY29kaW5nICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhoZXVyaXN0aWNFbmNvZGluZywgRW5jb2RpbmdNZW1lbnRvLkdVRVNTRURfRU5DT0RJTkdfRlJPTV9TVFJFQU0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gVE9ETzogaWYgZGV0ZWN0ZWRDaGFyc2V0IGFuZCBzcGVjIGRlZmF1bHQgaXMKLQkJLy8gbnVsbCwgbmVlZCB0byB1c2UgIndvcmsKLQkJLy8gYmVuY2ggYmFzZWQiIGRlZmF1bHRzLgotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEBwYXJhbSByZWFzb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZQotCQkJLy8gdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcwotCQkJLy8gbm90IHByZXNlbnQuCi0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJaGFuZGxlU3BlY0RlZmF1bHQoKTsKLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkvLyBzYWZ0eSBuZXQKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgTnVsbE1lbWVudG8oKTsKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldFNwZWNEZWZhdWx0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlyZXNldEFsbCgpOwotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGVuYyA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jKTsKLQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3BlY0RlZmF1bHQoKSB7Ci0JCVN0cmluZyBlbmNvZGluZ05hbWU7Ci0JCWVuY29kaW5nTmFtZSA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuY29kaW5nTmFtZSAhPSBudWxsKSB7Ci0JCQkvLyBjcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSBrbm93IEJ5dGVSZWFkZXIKLQkJCS8vIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXNldEFsbCgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGlTdG9yYWdlLmdldENvbnRlbnRzKCk7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJc2V0KHJlc2V0dGFibGVTdHJlYW0pOwotCQkvLyBUT0RPIHdlJ2xsIG5lZWQgdG8gInJlbWVtYmVyIiBJRmlsZSwgb3IKLQkJLy8gZ2V0IGl0cyAob3IgaXRzIHByb2plY3Qncykgc2V0dGluZ3MsIGluIGNhc2UKLQkJLy8gdGhvc2UgYXJlIG5lZWRlZCB0byBoYW5kbGUgY2FzZXMgd2hlbiB0aGUKLQkJLy8gZW5jb2RpbmcgaXMgbm90IGluIHRoZSBmaWxlIHN0cmVhbS4KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBwYXJ0IG9mIGludGVyZmFjZSB0byBoZWxwIGF2b2lkIGNvbmZ1c2lvbiAuLi4gaXQKLQkgKiBleHBlY3RlZCB0aGlzIFJlYWRlciBpcyBhIHdlbGwgZm9ybWVkIGNoYXJhY3RlciByZWFkZXIgLi4uIHRoYXQgaXMsIGl0cwotCSAqIGFsbCByZWFkeSBiZWVuIGRldGVybWluZWQgdG8gbm90IGJlIGEgdW5pY29kZSBtYXJrZWQgaW5wdXQgc3RyZWFtLiBBbmQsCi0JICogaXRzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24sIGF0IHBvc2l0aW9uIHplcm8sIHJlYWR5IHRvCi0JICogcmVhZCBmaXJzdCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJaWYgKCFmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJfQotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2JsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmIG1hcmthYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDg2M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9yQ1NTIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCi0JCXJldHVybiBTVVBQT1JURURfT1BUSU9OUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCS8vIGN1cnJlbnRseSBubyBzcGVjaWZpYyBjaGVjayBmb3IgdmFsaWRpbHR5Ci0JCS8vIGJhc2VkIG9uIGNvbnRlbnRzLgotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlVmFsaWRpdHkoUmVhZGVyIHJlYWRlcikgewotCQkvLyBjdXJyZW50bHkgbm8gc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkaWx0eQotCQkvLyBiYXNlZCBvbiBjb250ZW50cy4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRldGVjdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDYWxjdWxhdGlvbnMoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RlOiBpZiB3ZSdyZSBhc2tlZCBmb3Igb25lLCB3ZSBzZXQgdGhlbSBhbGwuIEkgbmVlZCB0byBiZSBzdXJlIGlmCi0JCS8vIGNhbGxlZAotCQkvLyBtdWxpdGlwbGUgdGltZXMgKG9uZSBmb3IgZWFjaCwgc2F5KSB0aGF0IHdlIGRvbid0IHdhc3RlIHRpbWUKLQkJLy8gcHJvY2Vzc2luZyBzYW1lCi0JCS8vIGNvbnRlbnQgYWdhaW4uCi0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSAoKENTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3IpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCS8vIGJ5IHRleHQgdHlwZS4KLQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQnl0ZU9yZGVyTWFyayA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LCBtYXkKLQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBkZXRlY3RlZEJ5dGVPcmRlck1hcmspOwotCQl9Ci0KLQotCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCS8vIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkvLyBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVAotCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYKLQkJCS8vIGludmFsaWQKLQkJCS8vIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucyBhbgotCQkJLy8gImFwcHJvcHJpYXRlIGRlZmF1bHQiIHRvIHVzZS4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBlbmNvZGluZ01lbWVudG8uZ2V0SW52YWxpZEVuY29kaW5nKCkpOwotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCX0KLQotCQlPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCS8vIHdlIGFsd2F5cyBpbmNsdWRlIGRldGVjdGVkLCBpZiBpdHMgZGlmZmVyZW50IHRoYW4gamF2YQotCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQ2hhcnNldCA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCk7Ci0JCQlpZiAoamF2YUNoYXJzZXQuZXF1YWxzKGV4aXN0aW5nQ2hhcnNldCkpIHsKLQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQudGhlCi0JCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZ2V0RGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMgbmVlZCB0bwotCQkJCQkvLyBhZGQsIEknbSBhc3N1bWluZwotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIE9iamVjdCBkZXRlY3RlZENoYXJzZXQsIE9iamVjdCBqYXZhQ2hhcnNldCkgewotCQkvLyBzaW5jZSBlcXVhbCwgd2UgZG9uJ3QgbmVlZCB0byBhZGQsIGJ1dCBpZiBvdXIgZGV0ZWN0ZWQgdmVyc2lvbiBpcwotCQkvLyBkaWZmZXJlbnQgdGhhbiBqYXZhQ2hhcnNldCwgdGhlbiB3ZSBzaG91bGQgYWRkIGl0LiBUaGlzIHdpbGwKLQkJLy8gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgdGhlcmUncyBkaWZmZXJlbmNlcyBpbiBjYXNlLCBvciBkaWZmZXJlbmNlcwotCQkvLyBkdWUgdG8gb3ZlcnJpZGUgcHJvcGVydGllcwotCQlpZiAoZGV0ZWN0ZWRDaGFyc2V0ICE9IG51bGwpIHsKLQotCQkJLy8gT25jZSB3ZSBkZXRlY3RlZCBhIGNoYXJzZXQsIHdlIHNob3VsZCBzZXQgdGhlIHByb3BlcnR5IGV2ZW4KLQkJCS8vIHRob3VnaCBpdCdzIHRoZSBzYW1lIGFzIGphdmFDaGFyc2V0Ci0JCQkvLyBiZWNhdXNlIHRoZXJlIGFyZSBjbGllbnRzIHRoYXQgcmVseSBvbiB0aGlzIHByb3BlcnR5IHRvCi0JCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGNoYXJzZXQgaXMgYWN0dWFsbHkgZGV0ZWN0ZWQgaW4gZmlsZSBvciBub3QuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmVudChJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQkvLyBlbHNlIGlmCi0JCS8vIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuRU5DT0RJTkdfTUVNRU5UTykpCi0JCS8vIHJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDgwMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIAotICogVGhpcyBpcyBwb3J0ZWQgZnJvbSBQYWdlRGVzaWduZXIncyBocGJjb20vS2FuamkuY3BwJ3MKLSAqIEthbmppOjpndWVzc19rYW5qaV9jb2RlKCksCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ0d1ZXNzZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSSA9IDA7IC8vIEFTQ0lJCi0JLy8gSVNPLTIwMjItSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUlfSU4gPSA4OyAvLyBUaGlzIGlzIGFmdGVyIElTTzIwMjIncyBjaGFuZ2UKLQkvLyBTaGlmdC1KSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVVDX0hBTEZLQU5BID0gNjsgLy8gVGhpcyBpcyBIYWxmIEthbmEgaW4gRVVDLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVVQ19KUCA9IDM7IC8vIFRoaXMgaXMgRVVDLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTTzIwMjJfSlAgPSA0OyAvLyBUaGlzIGlzIElTTy0yMDIyLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpJU19IQUxGS0FOQSA9IDc7IC8vIFRIaXMgaXMgSGFsZiBLYW5hIGluCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FVUMxID0gMHg0MDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VVQzIgPSAoYnl0ZSkgMHg4MDsKLQkvLyBBU0NJSQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSklOID0gMHgwMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pPVVQgPSAweDAyOwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVNDID0gMHgwNDsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pJUyA9IDB4MDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9TRlQxID0gMHgxMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX1NGVDIgPSAweDIwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga3R5cGVbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAwMCAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDEwICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgLyogISIjJCUmJyAqLy8qICIgKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiAoKSorLC0uLyAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qIDAxMjM0NTY3ICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogODk6OyA8PT4/ICovCi0JMHgyOSwgMHgyOCwgMHgyYiwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogQEFCQ0RFRkcgKi8KLQkweDJhLCAweDI4LCAweDJhLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBISUpLTE1OTyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIFBRUlNUVVZXICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogWFlaW1xdXl8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBhYmNkZWZnICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogaGlqa2xtbm8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBwcXJzdHV2dyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MDAsIC8qIHh5ent8fX4gKi8KLQkweDIwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAvKiA4MCAqLwotCTB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIC8qIDkwICovCi0JMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgyMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEEwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEIwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEMwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEQwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIC8qIEUwICovCi0JKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIC8qIEYwICovCi0JKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4YzAsIDB4MDAsfTsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNPODg1OV8xID0gMTsgLy8gSVNPLTEKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hJRlRfSklTID0gMjsgLy8gVGhpcyBpcyBTaGlmdC1KSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0pJU19IQUxGS0FOQSA9IDU7IC8vIFRoaXMgaXMgSGFsZiBLYW5hIGluCi0KLQkvKioKLQkgKiBDdXJyZW50bHksIG9ubHkgSmFwYW5lc2UgZW5jb2RpbmdzIGFyZSBzdXBwb3J0ZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAtMTsgLy8gVW5rbm93bgotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIGludAotCSAqIAotCSAqIENvbnZlcnQgcHJpdmF0ZSBpbnQgdG8gSUFOQSBFbmNvZGluZyBuYW1lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9JQU5BRW5jb2RpbmdOYW1lKGludCBjb2RlKSB7Ci0JCVN0cmluZyBlbmNvZGluZyA9IG51bGw7Ci0KLQkJc3dpdGNoIChjb2RlKSB7Ci0JCQljYXNlIFNISUZUX0pJUyA6Ci0JCQljYXNlIFNKSVNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIlNoaWZ0X0pJUyI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBFVUNfSlAgOgotCQkJY2FzZSBFVUNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIkVVQy1KUCI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBJU08yMDIyX0pQIDoKLQkJCWNhc2UgSklTX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJJU08tMjAyMi1KUCI7Ly8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGd1ZXNzZWQgSmF2YSBFbmNvZGluZyBuYW1lIHRhcmdldDogYnl0ZXMgdG8gYmUgaW5zcGVjdGVkIGxlbmd0aDoKLQkgKiBsZW5ndGggb2YgdGFyZ2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3Vlc3NFbmNvZGluZyhieXRlW10gdGFyZ2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBjb2RlID0gVU5LTk9XTjsKLQotCQkvLyBDdXJyZW50bHksIG9ubHkgSmFwYW5lc2UgaXMgc3VwcG9ydGVkLgotCQlTdHJpbmcgc3lzdGVtX2N0eXBlID0gamF2YS51dGlsLkxvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGpwX2N0eXBlID0gamF2YS51dGlsLkxvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpOwotCQlpZiAoc3lzdGVtX2N0eXBlLmNvbXBhcmVUbyhqcF9jdHlwZSkgPT0gMCkgewotCQkJLy8gT2ssIEknbSB1bmRlciBqYV9KUC4KLQkJCWNvZGUgPSBBU0NJSTsKLQkJCWludCBwb3MgPSAwOwotCQkJd2hpbGUgKChjb2RlID09IEFTQ0lJKSAmJiAobGVuZ3RoID4gMCkpIHsKLQkJCQlpbnQgY2gxID0gdGFyZ2V0W3Bvc107Ci0JCQkJY2gxID0gY2gxICYgMHgwMDAwMDBGRjsKLQkJCQlpbnQgY2gyID0gKGxlbmd0aCA+PSAyKSA/IHRhcmdldFtwb3MgKyAxXSA6IDA7Ci0JCQkJY2gyID0gY2gyICYgMHgwMDAwMDBGRjsKLQkJCQlpbnQgY2gzID0gKGxlbmd0aCA+PSAzKSA/IHRhcmdldFtwb3MgKyAyXSA6IDA7Ci0JCQkJY2gzID0gY2gzICYgMHgwMDAwMDBGRjsKLQkJCQljb2RlID0gZ3Vlc3NKYXBhbmVzZUthbmppQ29kZShjaDEsIGNoMiwgY2gzLCAwKTsKLQkJCQlwb3MrKzsKLQkJCQlsZW5ndGgtLTsKLQkJCX0KLQkJCXN3aXRjaCAoY29kZSkgewotCQkJCWNhc2UgSVNPMjAyMl9KUCA6Ci0JCQkJY2FzZSBKSVNfSEFMRktBTkEgOgotCQkJCQljb2RlID0gSVNPMjAyMl9KUDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBFVUNfSlAgOgotCQkJCQljb2RlID0gRVVDX0pQOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJY29kZSA9IFNISUZUX0pJUzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKGNvbnZlcnRUb0lBTkFFbmNvZGluZ05hbWUoY29kZSkpOwotCX0KLQotCS8qKgotCSAqIEd1ZXNzIHRoZSBlbmNvZGluZy4gaGFsZmthbmFfZmxhZyA9IDB4MDEgKCBkZXRlY3QgU0pJUyBoYWxmIGthbmEgKQotCSAqIGhhbGZrYW5hX2ZsYWcgPSAweDAyICggZGV0ZWN0IEVVQyBoYWxmIGthbmEgKQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBndWVzc0phcGFuZXNlS2FuamlDb2RlKGludCBjaDEsIGludCBjaDIsIGludCBjaDMsIGludCBoYWxma2FuYV9mbGFnKSB7Ci0JCWJvb2xlYW4gc2ppc19oYW5rYWt1X2ZsYWcgPSAoKGhhbGZrYW5hX2ZsYWcgJiAweDAxKSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQkJYm9vbGVhbiBldWNfaGFua2FrdV9mbGFnID0gKChoYWxma2FuYV9mbGFnICYgMHgwMikgIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0KLQkJaWYgKGNoMSA9PSAwKQotCQkJcmV0dXJuIFVOS05PV047Ci0JCWlmIChzamlzX2hhbmtha3VfZmxhZyAmJiBjaDEgPj0gMHhhMSAmJiBjaDEgPD0gMHhkZikKLQkJCXJldHVybiBTSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChldWNfaGFua2FrdV9mbGFnICYmIGNoMSA9PSAweDhlICYmIGNoMiA+PSAweGExICYmIGNoMiA8PSAweGRmKQotCQkJcmV0dXJuIEVVQ19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoKChrdHlwZVtjaDFdICYgS1RfU0ZUMSkgIT0gMCkgJiYgKChrdHlwZVtjaDJdICYgS1RfU0ZUMikgIT0gMCkpCi0JCQlyZXR1cm4gU0hJRlRfSklTOwotCQllbHNlIGlmICgoKGt0eXBlW2NoMV0gJiBLVF9FVUMxKSAhPSAwKSAmJiAoKGt0eXBlW2NoMl0gJiBLVF9FVUMyKSAhPSAwKSkKLQkJCXJldHVybiBFVUNfSlA7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmICgoa3R5cGVbY2gyXSAmIEtUX0pJTikgIT0gMCkpCi0JCQlyZXR1cm4gSVNPMjAyMl9KUDsKLQkJZWxzZSBpZiAoY2gxID49IDB4YTEgJiYgY2gxIDw9IDB4ZGYpCi0JCQlyZXR1cm4gU0pJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgY2gyID09IDB4MjgvKiAnKCcgKi8mJiBjaDMgPT0gMHg0OS8qICdJJyAqLykKLQkJCXJldHVybiBKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmIGNoMiA9PSAweDI4LyogJygnICovJiYgKChrdHlwZVtjaDNdICYgS1RfSk9VVCkgIT0gMCkpCi0JCQlyZXR1cm4gQVNDSUlfSU47Ci0KLQkJcmV0dXJuIEFTQ0lJOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ0d1ZXNzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZGMwMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYThjYWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gbGlzdC5sZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BYnN0cmFjdENTU05vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0Q1NTTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3OTkxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0Q1NTTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q1NTTm9kZUxpc3QgewotCi0JcHJvdGVjdGVkIFZlY3RvciBub2RlcyA9IG51bGw7Ci0KLQlJQ1NTTm9kZSBhcHBlbmROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJdGhpcy5ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJdGhpcy5ub2Rlcy5hZGRFbGVtZW50KG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiB0aGlzLm5vZGVzLnNpemUoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBJQ1NTTm9kZSBpdGVtSW1wbChpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSUNTU05vZGUpIHRoaXMubm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQotCUlDU1NOb2RlIHJlbW92ZU5vZGUoaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gbm9kZQotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0KLQkJSUNTU05vZGUgcmVtb3ZlZCA9IChJQ1NTTm9kZSkgdGhpcy5ub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLm5vZGVzLnJlbW92ZUVsZW1lbnRBdChpbmRleCk7Ci0JCXJldHVybiByZW1vdmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQXR0ckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQXR0ckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwNGE0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0F0dHJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTQXR0ckltcGwgZXh0ZW5kcyBDU1NSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTQXR0ciB7Ci0KLQlwcml2YXRlIFN0cmluZyBmTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIG93bmVyQ1NTTm9kZSA9IG51bGw7Ci0KLQlDU1NBdHRySW1wbChDU1NBdHRySW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQl0aGlzLmZOYW1lID0gdGhhdC5mTmFtZTsKLQkJdGhpcy5zZXRWYWx1ZSh0aGF0LmZWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ1NTQXR0ciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0F0dHJJbXBsKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCXJldHVybiBuZXcgQ1NTQXR0ckltcGwodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIElDU1NOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBVFRSX05PREU7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldE93bmVyQ1NTTm9kZSgpIHsKLQkJcmV0dXJuIG93bmVyQ1NTTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIC8qICh0aGlzLm5hbWUgPT0gbnVsbCkgKi9mYWxzZTsKLQkJaWYgKHRoaXMuZk5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRoaXMuZk5hbWUuZXF1YWxzKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZChTdHJpbmcgb2xkVmFsdWUpIHsKLQkJaWYgKHRoaXMub3duZXJDU1NOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZm9yIG1vZGVsCi0JCUlDU1NEb2N1bWVudCBkb2MgPSBvd25lckNTU05vZGUuZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLnZhbHVlQ2hhbmdlZCh0aGlzLCBvbGRWYWx1ZSk7Ci0KLQkJLy8gZm9yIGFkYXB0ZXJzCi0JCVN0cmluZyB2YWx1ZSA9IGdldFZhbHVlKCk7Ci0JCXRoaXMub3duZXJDU1NOb2RlLm5vdGlmeShDSEFOR0UsIHRoaXMsIG9sZFZhbHVlLCB2YWx1ZSwgdGhpcy5vd25lckNTU05vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3TmFtZSkgewotCQlmTmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJDU1NOb2RlKENTU05vZGVJbXBsIG5ld093bmVyQ1NTTm9kZSkgewotCQlvd25lckNTU05vZGUgPSBuZXdPd25lckNTU05vZGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSBmVmFsdWU7Ci0JCWZWYWx1ZSA9IG5ld1ZhbHVlOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZChvbGRWYWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NDaGFyc2V0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQ2hhcnNldFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NmMzMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NDaGFyc2V0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NDaGFyc2V0UnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlSW1wbCBpbXBsZW1lbnRzIElDU1NDaGFyc2V0UnVsZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NDaGFyc2V0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTQ2hhcnNldFJ1bGVJbXBsKENTU0NoYXJzZXRSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU0NoYXJzZXRSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTQ2hhcnNldFJ1bGVJbXBsKHRoaXMpOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVuY29kaW5nIGluZm9ybWF0aW9uIHVzZWQgaW4gdGhpcyA8Y29kZT5AY2hhcnNldDwvY29kZT4gcnVsZS4KLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIHZhbHVlIGhhcyBhCi0JICogICAgICAgICAgICAgICAgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBlbmNvZGluZwotCSAqICAgICAgICAgICAgICAgIHJ1bGUgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKGdldEF0dHJpYnV0ZShFTkNPRElORykpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDSEFSU0VUUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIENIQVJTRVRfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgcXVvdGUgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCVN0cmluZyBlbmMgPSBDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhlbmNvZGluZyk7Ci0JCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShlbmMsIHF1b3RlKTsKLQkJc2V0QXR0cmlidXRlKEVOQ09ESU5HLCBxdW90ZSArIGVuYyArIHF1b3RlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RlY2xhcmF0aW9uSXRlbVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkOWYwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RlY2xhcmF0aW9uSXRlbVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ291bnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlmaW5hbCBjbGFzcyBGbG9hdEluZm8gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlGbG9hdEluZm8oU3RyaW5nIHRleHQpIHsKLQkJCXBhcnNlKHRleHQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJdm9pZCBwYXJzZShTdHJpbmcgdGV4dCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZlZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZklkZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBiTnVtID0gdHJ1ZTsKLQkJCWludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotCQkJCWlmIChiTnVtKSB7Ci0JCQkJCWlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JyB8fCBjID09ICcuJyB8fCBjID09ICcrJyB8fCBjID09ICctJykgewotCQkJCQkJYnVmVmFsdWUuYXBwZW5kKGMpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYnVmSWRlbnQuYXBwZW5kKGMpOwotCQkJCQkJYk51bSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlidWZJZGVudC5hcHBlbmQoYyk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIHZhbHVlU3RyID0gYnVmVmFsdWUudG9TdHJpbmcoKTsKLQkJCWZWYWx1ZSA9IEZsb2F0LnZhbHVlT2YodmFsdWVTdHIpLmZsb2F0VmFsdWUoKTsKLQkJCWZJZGVudGlmaWVyID0gYnVmSWRlbnQudG9TdHJpbmcoKTsKLQkJCWZUeXBlID0gZ2V0RmxvYXRWYWx1ZVR5cGUodmFsdWVTdHIsIGZJZGVudGlmaWVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCWZsb2F0IGdldFZhbHVlKCkgewotCQkJcmV0dXJuIGZWYWx1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCVN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQkJcmV0dXJuIGZJZGVudGlmaWVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJc2hvcnQgZ2V0VmFsdWVUeXBlKCkgewotCQkJcmV0dXJuIGZUeXBlOwotCQl9Ci0KLQkJcHJpdmF0ZSBmbG9hdCBmVmFsdWUgPSAwLjBmOwotCQlwcml2YXRlIFN0cmluZyBmSWRlbnRpZmllciA9IG51bGw7Ci0JCXByaXZhdGUgc2hvcnQgZlR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVU5LTk9XTjsKLQl9Ci0KLQlmaW5hbCBzdGF0aWMgaW50IFNfTk9STUFMID0gMDsKLQlmaW5hbCBzdGF0aWMgaW50IFNfRlVOQ1RJT04gPSAxOwotCWZpbmFsIHN0YXRpYyBpbnQgU19GT05UX1NMQVNIID0gMjsKLQlmaW5hbCBzdGF0aWMgaW50IFNfQ09NTUFfU0VQQVJBVElPTiA9IDM7Ci0JcHJpdmF0ZSBJQ1NTRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZlBhcmVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZUZW1wU3RydWN0dXJlZERvY3VtZW50ID0gZmFsc2U7Ci0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQgZlVwZGF0ZUNvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyKElDU1NEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gZG9jOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUF0dHJWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygiYXR0ciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBnZXRDU1NQcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQVRUUik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoMCk7Ci0JCXZhbHVlLnNldFZhbHVlKGdldFRleHQocmVnaW9uKSk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUNvdW50ZXJzVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImNvdW50ZXJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklOR307Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWludCBzaXplID0gdmFsdWVSZWdpb25zLnNpemUoKTsKLQkJaWYgKHNpemUgIT0gMiAmJiBzaXplICE9IDMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ291bnRlckltcGwgdmFsdWUgPSBnZXRDb3VudGVyKCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KGkpOwotCQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KHJlZ2lvbik7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXZhbHVlLnNldElkZW50aWZpZXIodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLklERU5USUZJRVIpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCQl2YWx1ZS5zZXRTZXBhcmF0b3IodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLlNFUEFSQVRPUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMiA6Ci0JCQkJCXZhbHVlLnNldExpc3RTdHlsZSh0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuTElTVFNUWUxFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUNvdW50ZXJWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygiY291bnRlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlR9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpbnQgc2l6ZSA9IHZhbHVlUmVnaW9ucy5zaXplKCk7Ci0JCWlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNvdW50ZXJJbXBsIHZhbHVlID0gZ2V0Q291bnRlcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQl2YWx1ZS5zZXRJZGVudGlmaWVyKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5JREVOVElGSUVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJdmFsdWUuc2V0TGlzdFN0eWxlKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5MSVNUU1RZTEUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTdHlsZURlY2xJdGVtSW1wbCBjcmVhdGVEZWNsYXJhdGlvbkl0ZW0oSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGdldFByb3BlcnR5TmFtZShub2RlUmVnaW9ucyk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWl0ZW0gPSBnZXRDU1NTdHlsZURlY2xJdGVtKG5hbWUpOwotCQl9Ci0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZUZsb2F0VmFsdWUoU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCUZsb2F0SW5mbyBpbmZvID0gbmV3IEZsb2F0SW5mbyh0ZXh0KTsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoaW5mby5nZXRWYWx1ZVR5cGUoKSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl2YWx1ZS5zZXRWYWx1ZShpbmZvLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVGb3JtYXRWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygiZm9ybWF0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJLy8gZm9ybWF0IGNhbiB0YWtlIHZhcmlhYmxlIGFyZ3MuCi0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KDApOwotCQl2YWx1ZS5zZXRWYWx1ZShDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhnZXRUZXh0KHJlZ2lvbikpKTsKLQotCQlyZXR1cm4gdmFsdWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVMb2NhbFZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJsb2NhbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklOR307Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoMCk7Ci0JCXZhbHVlLnNldFZhbHVlKENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKGdldFRleHQocmVnaW9uKSkpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVQcmltaXRpdmVWYWx1ZShJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQlpZiAoaXNCbGFuayh0eXBlKSkgewotCQkJdmFsdWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJdmFsdWUgPSBjcmVhdGVGbG9hdFZhbHVlKHRleHQsIHR5cGUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZSh0ZXh0LCB0eXBlKTsKLQkJfQotCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IGNyZWF0ZVN0cmluZ1ZhbHVlKHRleHQsIHR5cGUpOwotCQl9Ci0KLQkJaWYgKCFmVGVtcFN0cnVjdHVyZWREb2N1bWVudCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQl2YWx1ZS5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlUHJpbWl0aXZlVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gbnVsbDsKLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2UocmVnaW9ucyk7Ci0JCWlmIChyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGV4dC5lcXVhbHMoInJnYigiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVSZ2JWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJjb3VudGVyKCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZUNvdW50ZXJWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJjb3VudGVycygiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVDb3VudGVyc1ZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoImF0dHIoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlQXR0clZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoImZvcm1hdCgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVGb3JtYXRWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJsb2NhbCgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVMb2NhbFZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAodGV4dC5lcXVhbHMoInJlY3QoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlUmVjdFZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9IGNyZWF0ZVN0cmluZ1ZhbHVlKHJlZ2lvbnMpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZShyZWdpb25zKTsKLQkJfQotCi0JCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWUuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9ucy5nZXQoMCksIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVJlY3RWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygicmVjdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UfTsgLy8gSURFTlQ6Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnYXV0bycKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgIT0gNCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlSZWN0SW1wbCB2YWx1ZSA9IGdldFJlY3QoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoaSk7Ci0JCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgY2hpbGRWYWx1ZSA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0VG9wKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRSaWdodCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0Qm90dG9tKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMyA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRMZWZ0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjaGlsZFZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJc2V0U3RyaW5nVmFsdWUoY2hpbGRWYWx1ZSwgdGV4dCwgdHlwZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRGbG9hdFZhbHVlKGNoaWxkVmFsdWUsIHRleHQsIHR5cGUpOwotCQkJfQotCQkJaWYgKCFmVGVtcFN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCWNoaWxkVmFsdWUuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVJnYlZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJyZ2IiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaWYgKHZhbHVlUmVnaW9ucy5zaXplKCkgIT0gMykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlSR0JDb2xvckltcGwgdmFsdWUgPSBnZXRSR0JDb2xvcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldChpKTsKLQkJCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjaGlsZFZhbHVlID0gbnVsbDsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRSZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldEdyZWVuKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMiA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRCbHVlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjaGlsZFZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXNldEZsb2F0VmFsdWUoY2hpbGRWYWx1ZSwgZ2V0VGV4dChyZWdpb24pLCByZWdpb24uZ2V0VHlwZSgpKTsKLQkJCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQljaGlsZFZhbHVlLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVTdHJpbmdWYWx1ZShTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJc2hvcnQgdmFsdWVUeXBlID0gZ2V0U3RyaW5nVmFsdWVUeXBlKHRleHQsIHR5cGUpOwotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBnZXRDU1NQcmltaXRpdmVWYWx1ZSh2YWx1ZVR5cGUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKHZhbHVlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJKSB7Ci0JCQkJdGV4dCA9IENTU1V0aWwuZXh0cmFjdFVyaUNvbnRlbnRzKHRleHQpOwotCQkJfQotCQkJZWxzZSBpZiAodmFsdWVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TVFJJTkcpIHsKLQkJCQl0ZXh0ID0gQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHModGV4dCk7Ci0JCQl9Ci0JCQl2YWx1ZS5zZXRWYWx1ZSh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlU3RyaW5nVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIHR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7Ci0JCWlmIChyZWdpb25zLnNpemUoKSA9PSAxKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVTdHJpbmdWYWx1ZShtYWtlU3RyaW5nKHJlZ2lvbnMpLCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENvdW50ZXJJbXBsIGdldENvdW50ZXIoKSB7Ci0JCUNvdW50ZXJJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDb3VudGVyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENvdW50ZXJJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGdldENTU1ByaW1pdGl2ZVZhbHVlKHNob3J0IHR5cGUpIHsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NQcmltaXRpdmVWYWx1ZSh0eXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUodHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTdHlsZURlY2xJdGVtSW1wbCBnZXRDU1NTdHlsZURlY2xJdGVtKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0ICE9IG51bGwgJiYgZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU1N0eWxlRGVjbEl0ZW0ocHJvcGVydHlOYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NTdHlsZURlY2xJdGVtKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHNob3J0IGdldEZsb2F0VmFsdWVUeXBlKFN0cmluZyBpZGVudCkgewotCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCXNob3J0IHZhbHVlVHlwZTsKLQkJaWYgKGlkZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVI7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0U7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJweCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJjbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJpbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJkZWciKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInJhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZ3JhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoIm1zIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJoeiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJraHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTjsKLQkJfQotCQlyZXR1cm4gdmFsdWVUeXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBzaG9ydCBnZXRGbG9hdFZhbHVlVHlwZShTdHJpbmcgdmFsdWUsIFN0cmluZyBpZGVudCkgewotCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCXNob3J0IHZhbHVlVHlwZTsKLQkJaWYgKGlkZW50Lmxlbmd0aCgpID09IDApIHsKLQkJCWlmICgwIDw9IHZhbHVlLmluZGV4T2YoJy4nKSkgewotCQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0U7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImV4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJweCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJjbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTTsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJpbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJwYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJkZWciKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInJhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZ3JhZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoIm1zIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoInMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJoeiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWjsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJraHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTjsKLQkJfQotCQlyZXR1cm4gdmFsdWVUeXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEZ1bmN0aW9uTmFtZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpIDwgMikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb24gZmlyc3RSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJaWYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoZmlyc3RSZWdpb24pOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGgoKSAtIDEpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgbWV0aG9kIGhhcyBubyB2YWxpZGF0aW9uIGNoZWNrLCB0aGVuIHJlZ2lvbnMgbXVzdCBiZSBwYXNzZWQKLQkgKiBnZXRGdW5jdGlvbk5hbWUoKS4uLgotCSAqLwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucywgU3RyaW5nW10gYWNjZXB0cykgewotCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQkJaW50IG5BY2NlcHRzID0gKGFjY2VwdHMgIT0gbnVsbCkgPyBhY2NlcHRzLmxlbmd0aCA6IDA7Ci0JCUl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCWkubmV4dCgpOyAvLyBza2lwIEZVTkNUSU9OCi0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzQmxhbmsodHlwZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChuQWNjZXB0cyA9PSAwKSB7Ci0JCQkJbmV3UmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGlBY2NlcHQgPSAwOyBpQWNjZXB0IDwgbkFjY2VwdHM7IGlBY2NlcHQrKykgewotCQkJCQlpZiAodHlwZSA9PSBhY2NlcHRzW2lBY2NlcHRdKSB7Ci0JCQkJCQluZXdSZWdpb25zLmFkZChyZWdpb24pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkvLyBWZWN0b3Igbm9kZVJlZ2lvbnMgPSBuZXcgVmVjdG9yKGZsYXROb2RlLmdldFJlZ2lvbnMoKSk7Ci0JLy8gcmV0dXJuIGdldFByb3BlcnR5TmFtZShub2RlUmVnaW9ucyk7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMpIHsKLQkJSVRleHRSZWdpb25MaXN0IG5hbWVSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCXdoaWxlICghbm9kZVJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlUmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShuYW1lUmVnaW9ucyk7Ci0JCQkJbmFtZSA9IG1ha2VTdHJpbmcobmFtZVJlZ2lvbnMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmFtZVJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBSZWN0SW1wbCBnZXRSZWN0KCkgewotCQlSZWN0SW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0UmVjdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChSZWN0SW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SRUNUKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFJHQkNvbG9ySW1wbCBnZXRSR0JDb2xvcigpIHsKLQkJUkdCQ29sb3JJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRSR0JDb2xvcigpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChSR0JDb2xvckltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1IpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc2hvcnQgZ2V0U3RyaW5nVmFsdWVUeXBlKFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlzaG9ydCB2YWx1ZVR5cGU7Ci0JCWlmICh0ZXh0LnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJpbmhlcml0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTkhFUklUX1BSSU1JVElWRTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HKSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSDsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiB0ZXh0LmVxdWFscygiLCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09NTUE7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgdGV4dC5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UpIHsKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJBTkdFOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UOwotCQl9Ci0JCXJldHVybiB2YWx1ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZVN0cmluZyhJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlib29sZWFuIGJTcGFjZSA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZWdpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICghYlNwYWNlICYmIGlzQmxhbmsodHlwZSkpIHsKLQkJCQlidWYuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQliU3BhY2UgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZChnZXRUZXh0KHJlZ2lvbikpOwotCQkJCWJTcGFjZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50VGVtcG9yYXJ5KGJvb2xlYW4gYlRlbXApIHsKLQkJZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBiVGVtcDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RmxvYXRWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUsIFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlGbG9hdEluZm8gaW5mbyA9IG5ldyBGbG9hdEluZm8odGV4dCk7Ci0JCXZhbHVlLnNldEZsb2F0VmFsdWUoaW5mby5nZXRWYWx1ZVR5cGUoKSwgaW5mby5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U3RyaW5nVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlLCBTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJc2hvcnQgdmFsdWVUeXBlID0gZ2V0U3RyaW5nVmFsdWVUeXBlKHRleHQsIHR5cGUpOwotCQl2YWx1ZS5zZXRTdHJpbmdWYWx1ZSh2YWx1ZVR5cGUsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpdGVtCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsSXRlbQotCSAqIEBwYXJhbSBub2RlUmVnaW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvcgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEltcG9ydGFudEF0dHJpYnV0ZShJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtLCBJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMpIHsKLQkJaWYgKGl0ZW0gPT0gbnVsbCB8fCBub2RlUmVnaW9ucyA9PSBudWxsIHx8IG5vZGVSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGVSZWdpb25zLmdldChub2RlUmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCkgewotCQkJaXRlbS5zZXRQcmlvcml0eShnZXRUZXh0KHJlZ2lvbikpOwotCQkJQ1NTQXR0ckltcGwgYXR0ciA9ICgoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIGl0ZW0pLmdldEF0dHJpYnV0ZU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5UKTsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJbm9kZVJlZ2lvbnMucmVtb3ZlKHJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFVwZGF0ZUNvbnRleHQoQ1NTTW9kZWxVcGRhdGVDb250ZXh0IHVwZGF0ZUNvbnRleHQpIHsKLQkJZlVwZGF0ZUNvbnRleHQgPSB1cGRhdGVDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb2xvblNlcGFyYXRvcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbCBzZXR1cERlY2xhcmF0aW9uSXRlbShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWhhc0NvbG9uU2VwYXJhdG9yKGZsYXROb2RlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmUGFyZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0KLQkJSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOyAvLyBtYWtlCi0JCS8vIGNvcHkKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgbmV3SXRlbSA9IGNyZWF0ZURlY2xhcmF0aW9uSXRlbShub2RlUmVnaW9ucyk7Ci0JCWlmIChuZXdJdGVtID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJbmV3SXRlbS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSwgZmxhdE5vZGUpOwotCQl9Ci0KLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2Uobm9kZVJlZ2lvbnMpOwotCQlzZXR1cEltcG9ydGFudEF0dHJpYnV0ZShuZXdJdGVtLCBub2RlUmVnaW9ucyk7Ci0JCS8vIE5vdywgbm9kZVJlZ2lvbnMganVzdCBoYXMgcmVnaW9ucyBmb3IgdmFsdWUuCi0JCXNldHVwVmFsdWVzKG5ld0l0ZW0sIG5vZGVSZWdpb25zKTsKLQkJcmV0dXJuIG5ld0l0ZW07Ci0JfQotCi0Jdm9pZCBzZXR1cFZhbHVlcyhJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudFJlZ2lvbiwgSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCWZQYXJlbnRSZWdpb24gPSBwYXJlbnRSZWdpb247Ci0JCXNldHVwVmFsdWVzKGl0ZW0sIG5vZGVSZWdpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBub2RlUmVnaW9ucyBtdXN0IGJlIGJyb2tlbi4gSWYgeW91IG5lZWQgYWZ0ZXIsIG1ha2UgY29weSBvZiB0aGVtLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cFZhbHVlcyhJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtLCBJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMpIHsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uQnVmID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBpdGVtLmdldFByb3BlcnR5TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0JCWJvb2xlYW4gYkZvbnQgPSAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpKTsKLQkJLy8gKHNob3J0LWhhbmQpIGZvbnQKLQkJaW50IHN0YXR1cyA9IChwcm9wZXJ0eU5hbWUuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpKSA/IFNfQ09NTUFfU0VQQVJBVElPTiA6IFNfTk9STUFMOwotCQl3aGlsZSAoIW5vZGVSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJdmFsdWUgPSBudWxsOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbm9kZVJlZ2lvbnMucmVtb3ZlKDApOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSIHx8IHR5cGUKLQkJCS8vID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCS8vIGJyZWFrOwotCQkJLy8gfQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCQljYXNlIFNfTk9STUFMIDoKLQkJCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJCQlyZWdpb25CdWYuYWRkKHJlZ2lvbik7Ci0JCQkJCQlzdGF0dXMgPSBTX0ZVTkNUSU9OOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGJGb250ICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIGZQYXJlbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJCXN0YXR1cyA9IFNfRk9OVF9TTEFTSDsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghaXNCbGFuayh0eXBlKSkgewotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb24pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU19GVU5DVElPTiA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJCQkJcmVnaW9uQnVmLmFkZChyZWdpb24pOwotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb25CdWYpOwotCQkJCQkJcmVnaW9uQnVmLmNsZWFyKCk7Ci0JCQkJCQlzdGF0dXMgPSBTX05PUk1BTDsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghaXNCbGFuayh0eXBlKSkgewotCQkJCQkJcmVnaW9uQnVmLmFkZChyZWdpb24pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU19GT05UX1NMQVNIIDoKLQkJCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTikgewotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb24pOwotCQkJCQkJc3RhdHVzID0gU19DT01NQV9TRVBBUkFUSU9OOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCFpc0JsYW5rKHR5cGUpKSB7Ci0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTX0NPTU1BX1NFUEFSQVRJT04gOgotCQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgZlBhcmVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzKCIsIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb25CdWYpOwotCQkJCQkJcmVnaW9uQnVmLmNsZWFyKCk7Ci0JCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCWlmIChmVXBkYXRlQ29udGV4dCA9PSBudWxsIHx8ICFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQkJCQkJCWl0ZW0uYXBwZW5kVmFsdWUodmFsdWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCWlmIChmVXBkYXRlQ29udGV4dCA9PSBudWxsIHx8ICFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQkJCWl0ZW0uYXBwZW5kVmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIXJlZ2lvbkJ1Zi5pc0VtcHR5KCkpIHsKLQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uQnVmKTsKLQkJCWlmIChmVXBkYXRlQ29udGV4dCA9PSBudWxsIHx8ICFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQkJaXRlbS5hcHBlbmRWYWx1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gKGZQYXJlbnRSZWdpb24gIT0gbnVsbCkgPyBmUGFyZW50UmVnaW9uLmdldFRleHQocmVnaW9uKSA6ICIiOyAvLyROT04tTkxTLTEkIAotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCbGFuayhTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRG9jdW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RvY3VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2E1NDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRG9jdW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTRG9jdW1lbnRJbXBsIGV4dGVuZHMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU0RvY3VtZW50IHsKLQotCXByaXZhdGUgQ1NTTW9kZWxJbXBsIGZNb2RlbCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NEb2N1bWVudEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NEb2N1bWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlDU1NEb2N1bWVudEltcGwoQ1NTRG9jdW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JSUNTU05vZGUgY3JlYXRlQ1NTQXR0cihTdHJpbmcgbmFtZSkgewotCQlDU1NBdHRySW1wbCBhdHRyID0gbmV3IENTU0F0dHJJbXBsKG5hbWUpOwotCQlhdHRyLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTQ2hhcnNldFJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU0NoYXJzZXRSdWxlIGNyZWF0ZUNTU0NoYXJzZXRSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGUKLQkgKi8KLQlwdWJsaWMgQ1NTRm9udEZhY2VSdWxlIGNyZWF0ZUNTU0ZvbnRGYWNlUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTSW1wb3J0UnVsZSBjcmVhdGVDU1NJbXBvcnRSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5JQ1NTTWVkaWFSdWxlCi0JICovCi0JcHVibGljIElDU1NNZWRpYVJ1bGUgY3JlYXRlQ1NTTWVkaWFSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQYWdlUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTUGFnZVJ1bGUgY3JlYXRlQ1NTUGFnZVJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JcHVibGljIElDU1NQcmltaXRpdmVWYWx1ZSBjcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShzaG9ydCBwcmltaXRpdmVUeXBlKSB7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IG51bGw7Ci0JCWlmIChwcmltaXRpdmVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT1VOVEVSKQotCQkJdmFsdWUgPSBuZXcgQ291bnRlckltcGwoKTsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVCkKLQkJCXZhbHVlID0gbmV3IFJlY3RJbXBsKCk7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SKQotCQkJdmFsdWUgPSBuZXcgUkdCQ29sb3JJbXBsKCk7Ci0JCWVsc2UKLQkJCXZhbHVlID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbChwcmltaXRpdmVUeXBlKTsKLQkJdmFsdWUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENTU1J1bGUgY3JlYXRlQ1NTUnVsZShTdHJpbmcgcnVsZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsSXRlbSBjcmVhdGVDU1NTdHlsZURlY2xJdGVtKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgaXRlbSA9IG5ldyBDU1NTdHlsZURlY2xJdGVtSW1wbChwcm9wZXJ0eU5hbWUpOwotCQlpdGVtLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVSdWxlCi0JICovCi0JcHVibGljIElDU1NTdHlsZVJ1bGUgY3JlYXRlQ1NTU3R5bGVSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZQotCSAqLwotCXB1YmxpYyBDU1NVbmtub3duUnVsZSBjcmVhdGVDU1NVbmtub3duUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QKLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGNyZWF0ZU1lZGlhTGlzdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQl2b2lkIHNldE1vZGVsKENTU01vZGVsSW1wbCBtb2RlbCkgewotCQl0aGlzLmZNb2RlbCA9IG1vZGVsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRm9udEZhY2VSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NGb250RmFjZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwY2Q5ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NGb250RmFjZVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU0ZvbnRGYWNlUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlRGVjbENvbnRhaW5lciBpbXBsZW1lbnRzIENTU0ZvbnRGYWNlUnVsZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NGb250RmFjZVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU0ZvbnRGYWNlUnVsZUltcGwoQ1NTRm9udEZhY2VSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU0ZvbnRGYWNlUnVsZUltcGwgY2xvbmVkID0gbmV3IENTU0ZvbnRGYWNlUnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBleHRyYWN0UHJlU3RyaW5nKCkgewotCQlyZXR1cm4gIkBmb250LWZhY2UiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRk9OVEZBQ0VSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gRk9OVF9GQUNFX1JVTEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NJbXBvcnRSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NJbXBvcnRSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmEzODViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTSW1wb3J0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklNb2RlbFByb3ZpZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlVSTE1vZGVsUHJvdmlkZXJDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTSW1wb3J0UnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlSW1wbCBpbXBsZW1lbnRzIElDU1NJbXBvcnRSdWxlIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmRGlydHkgPSB0cnVlOwotCXByaXZhdGUgSUNTU1N0eWxlU2hlZXQgZlN0eWxlU2hlZXQ7Ci0KLQkvKioKLSAgICAgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotICAgICAqLwotCXB1YmxpYyBDU1NJbXBvcnRSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTSW1wb3J0UnVsZUltcGwoQ1NTSW1wb3J0UnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NJbXBvcnRSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTSW1wb3J0UnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2xvc2VTdHlsZVNoZWV0KCkgewotCQlpZiAoZlN0eWxlU2hlZXQgIT0gbnVsbCkgewotCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSBmU3R5bGVTaGVldDsKLQkJCWZTdHlsZVNoZWV0ID0gbnVsbDsgLy8gdG8gcHJldmVudCBsb29wLCB3ZSBtdXN0IHJlc2V0IGZTdHlsZVNoZWV0Ci0JCQkJCQkJCS8vIGJlZm9yZSBhbGwgY2xvc2luZyBhY3Rpb24KLQotCQkJc2hlZXQuZ2V0TW9kZWwoKS5yZW1vdmVTdHlsZUxpc3RlbmVyKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIGlmIChnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09Ci0JCQkvLyBJQ1NTTW9kZWwuRU1CRURERUQpIHsgLy8gY2FzZSBTVFlMRSB0YWcKLQkJCS8vIGFkYXB0ZXIgPSAoTW9kZWxQcm92aWRlQWRhcHRlcikKLQkJCS8vICgoSU5vZGVOb3RpZmllcilnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIH0KLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5tb2RlbFJlbW92ZWQoc2hlZXQuZ2V0TW9kZWwoKSk7Ci0KLQkJCXNoZWV0LmdldE1vZGVsKCkucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbG9jYXRpb24gb2YgdGhlIHN0eWxlIHNoZWV0IHRvIGJlIGltcG9ydGVkLiBUaGUgYXR0cmlidXRlIHdpbGwgbm90Ci0JICogY29udGFpbiB0aGUgPGNvZGU+InVybCguLi4pIjwvY29kZT4gc3BlY2lmaWVyIGFyb3VuZCB0aGUgVVJJLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJcmV0dXJuIENTU1V0aWwuZXh0cmFjdFVyaUNvbnRlbnRzKGdldEF0dHJpYnV0ZShIUkVGKSk7Ci0JfQotCi0JLyoqCi0JICogQSBsaXN0IG9mIG1lZGlhIHR5cGVzIGZvciB3aGljaCB0aGlzIHN0eWxlIHNoZWV0IG1heSBiZSB1c2VkLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QgZ2V0TWVkaWEoKSB7Ci0JCUlDU1NOb2RlIG1lZGlhID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAobWVkaWEgIT0gbnVsbCkgewotCQkJaWYgKG1lZGlhIGluc3RhbmNlb2YgTWVkaWFMaXN0KSB7Ci0JCQkJcmV0dXJuIChNZWRpYUxpc3QpIG1lZGlhOwotCQkJfQotCQl9Ci0KLQkJLy8gVEhJUyBDQVNFIElTIEVSUk9SIENBU0UKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIElNUE9SVFJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3R5bGUgc2hlZXQgcmVmZXJyZWQgdG8gYnkgdGhpcyBydWxlLCBpZiBpdCBoYXMgYmVlbiBsb2FkZWQuIFRoZQotCSAqIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzdHlsZSBzaGVldCBoYXMKLQkgKiBub3QgeWV0IGJlZW4gbG9hZGVkIG9yIGlmIGl0IHdpbGwgbm90IGJlIGxvYWRlZCAoZS5nLiBpZiB0aGUgc3R5bGUKLQkgKiBzaGVldCBpcyBmb3IgYSBtZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVzZXIgYWdlbnQpLgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZVNoZWV0IGdldFN0eWxlU2hlZXQoKSB7Ci0KLQkJaWYgKGZEaXJ0eSkgewotCQkJLy8gTk9URTogdHJ5L2NhdGNoIGJsb2NrIGlzIGEgVEVNUCBmaXggdG8gYXZvaWQgY29tcGlsZSBlcnJvcnM6Ci0JCQl0cnkgewotCQkJCWNsb3NlU3R5bGVTaGVldCgpOwotCi0JCQkJaWYgKGdldEhyZWYoKSA9PSBudWxsIHx8IGdldEhyZWYoKS5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCWZEaXJ0eSA9IGZhbHNlOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgeyAvLyBjYXNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBTVFlMRQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGFnCi0JCQkJCWJhc2VNb2RlbCA9ICgoSURPTU5vZGUpIGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldE93bmVyRE9NTm9kZSgpKS5nZXRNb2RlbCgpOwotCQkJCX0KLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJCS8vIGlmIChnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09Ci0JCQkJLy8gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UgU1RZTEUgdGFnCi0JCQkJLy8gYWRhcHRlciA9IChNb2RlbFByb3ZpZGVBZGFwdGVyKQotCQkJCS8vICgoSU5vZGVOb3RpZmllcilnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyBsb2FkIG1vZGVsIGZyb20gSU1vZGVsTWFuYWdlcgotCQkJCVVSTE1vZGVsUHJvdmlkZXJDU1MgcHJvdmlkZXIgPSBuZXcgVVJMTW9kZWxQcm92aWRlckNTUygpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBwcm92aWRlci5nZXRNb2RlbEZvclJlYWQoYmFzZU1vZGVsLCBnZXRIcmVmKCkpOwotCQkJCWZEaXJ0eSA9IGZhbHNlOwotCi0JCQkJaWYgKG5ld01vZGVsID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWlmICghKG5ld01vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSkgewotCQkJCQluZXdNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJLy8gbm90aWZ5IGFkYXB0ZXIKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLm1vZGVsUHJvdmlkZWQobmV3TW9kZWwpOwotCi0JCQkJZlN0eWxlU2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpICgoSUNTU01vZGVsKSBuZXdNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlpZiAoZlN0eWxlU2hlZXQgIT0gbnVsbCkKLQkJCQkJZlN0eWxlU2hlZXQuZ2V0TW9kZWwoKS5hZGRTdHlsZUxpc3RlbmVyKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmU3R5bGVTaGVldDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBJTVBPUlRfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoU3R5bGVTaGVldCgpIHsKLQkJaWYgKCFmRGlydHkpIHsKLQkJCWNsb3NlU3R5bGVTaGVldCgpOwotCQkJZkRpcnR5ID0gdHJ1ZTsKLQkJCW5vdGlmeShJTm9kZU5vdGlmaWVyLkNIQU5HRSwgZ2V0QXR0cmlidXRlTm9kZShIUkVGKSwgbnVsbCwgbnVsbCwgZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlbGVhc2VSdWxlKCkgewotCQlpZiAoZlN0eWxlU2hlZXQgIT0gbnVsbCkgewotCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSBmU3R5bGVTaGVldDsKLQkJCWZTdHlsZVNoZWV0ID0gbnVsbDsgLy8gdG8gcHJldmVudCBsb29wLCB3ZSBtdXN0IHJlc2V0IGZTdHlsZVNoZWV0Ci0JCQkJCQkJCS8vIGJlZm9yZSBhbGwgY2xvc2luZyBhY3Rpb24KLQotCQkJc2hlZXQuZ2V0TW9kZWwoKS5yZW1vdmVTdHlsZUxpc3RlbmVyKGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIGlmIChnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09Ci0JCQkvLyBJQ1NTTW9kZWwuRU1CRURERUQpIHsgLy8gY2FzZSBTVFlMRSB0YWcKLQkJCS8vIGFkYXB0ZXIgPSAoTW9kZWxQcm92aWRlQWRhcHRlcikKLQkJCS8vICgoSU5vZGVOb3RpZmllcilnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIH0KLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5tb2RlbFJlbGVhc2VkKHNoZWV0LmdldE1vZGVsKCkpOwotCi0JCQlzaGVldC5nZXRNb2RlbCgpLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGhyZWYKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZkRpcnR5ID0gdHJ1ZTsKLQkJc2V0QXR0cmlidXRlKEhSRUYsIENTU0xpbmtDb252ZXJ0ZXIuYWRkRnVuYyhocmVmKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNZWRpYVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01lZGlhUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3NWM4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01lZGlhUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNZWRpYVJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBJQ1NTTWVkaWFSdWxlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU01lZGlhUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTTWVkaWFSdWxlSW1wbChDU1NNZWRpYVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgYXBwZW5kUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIGFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgcnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTTWVkaWFSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTTWVkaWFSdWxlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBkZWxldGUgYSBydWxlIGZyb20gdGhlIG1lZGlhIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgbWVkaWEgYmxvY2sncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlCi0JICogICAgICAgICAgICBydWxlIHRvIHJlbW92ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBkb2VzIG5vdAotCSAqICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gYSBydWxlIGluIHRoZSBtZWRpYSBydWxlIGxpc3QuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG1lZGlhIHJ1bGUKLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVSdWxlKGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUNTU05vZGVJbXBsIG5vZGUgPSBnZXRJbmRleGVkUnVsZShpbmRleCk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGxpc3Qgb2YgYWxsIENTUyBydWxlcyBjb250YWluZWQgd2l0aGluIHRoZSBtZWRpYSBibG9jay4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZUxpc3QgZ2V0Q3NzUnVsZXMoKSB7Ci0JCUNTU1J1bGVMaXN0SW1wbCBsaXN0ID0gbmV3IENTU1J1bGVMaXN0SW1wbCgpOwotCi0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpCi0JCQkJbGlzdC5hcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JQ1NTUnVsZUltcGwgZ2V0SW5kZXhlZFJ1bGUoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpIHsKLQkJCQlpZiAoaSsrID09IGluZGV4KQotCQkJCQlyZXR1cm4gKENTU1J1bGVJbXBsKSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiBtZWRpYSB0eXBlcyBmb3IgdGhpcyBydWxlLgotCSAqLwotCXB1YmxpYyBNZWRpYUxpc3QgZ2V0TWVkaWEoKSB7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIE1lZGlhTGlzdEltcGwpCi0JCQkJcmV0dXJuIChNZWRpYUxpc3QpIG5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gTUVESUFSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gTUVESUFfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGluc2VydCBhIG5ldyBydWxlIGludG8gdGhlIG1lZGlhIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBUaGUgcGFyc2FibGUgdGV4dCByZXByZXNlbnRpbmcgdGhlIHJ1bGUuIEZvciBydWxlIHNldHMgdGhpcwotCSAqICAgICAgICAgICAgY29udGFpbnMgYm90aCB0aGUgc2VsZWN0b3IgYW5kIHRoZSBzdHlsZSBkZWNsYXJhdGlvbi4gRm9yCi0JICogICAgICAgICAgICBhdC1ydWxlcywgdGhpcyBzcGVjaWZpZXMgYm90aCB0aGUgYXQtaWRlbnRpZmllciBhbmQgdGhlIHJ1bGUKLQkgKiAgICAgICAgICAgIGNvbnRlbnQuCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBUaGUgaW5kZXggd2l0aGluIHRoZSBtZWRpYSBibG9jaydzIHJ1bGUgY29sbGVjdGlvbiBvZiB0aGUKLQkgKiAgICAgICAgICAgIHJ1bGUgYmVmb3JlIHdoaWNoIHRvIGluc2VydCB0aGUgc3BlY2lmaWVkIHJ1bGUuIElmIHRoZQotCSAqICAgICAgICAgICAgc3BlY2lmaWVkIGluZGV4IGlzIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhlIG1lZGlhIGJsb2NrcydzCi0JICogICAgICAgICAgICBydWxlIGNvbGxlY3Rpb24sIHRoZSBydWxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUKLQkgKiAgICAgICAgICAgIG1lZGlhIGJsb2NrLgotCSAqIEByZXR1cm4gVGhlIGluZGV4IHdpdGhpbiB0aGUgbWVkaWEgYmxvY2sncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlIG5ld2x5Ci0JICogICAgICAgICBpbnNlcnRlZCBydWxlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIHJ1bGUgY2Fubm90IGJlCi0JICogICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgZS5nLiwgaWYgYW4KLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5AaW1wb3J0PC9jb2RlPiBydWxlIGlzIGluc2VydGVkIGFmdGVyIGEgc3RhbmRhcmQgcnVsZSBzZXQgb3Igb3RoZXIKLQkgKiAgICAgICAgIGF0LXJ1bGUuIDxicj4KLQkgKiAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBpcyBub3QgYSB2YWxpZAotCSAqICAgICAgICAgaW5zZXJ0aW9uIHBvaW50LiA8YnI+Ci0JICogICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG1lZGlhIHJ1bGUgaXMKLQkgKiAgICAgICAgIHJlYWRvbmx5LiA8YnI+Ci0JICogICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBydWxlIGhhcyBhIHN5bnRheCBlcnJvciBhbmQKLQkgKiAgICAgICAgIGlzIHVucGFyc2FibGUuCi0JICovCi0JcHVibGljIGludCBpbnNlcnRSdWxlKFN0cmluZyBydWxlLCBpbnQgaW5kZXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpbnQgbGVuZ3RoID0gZ2V0Q3NzUnVsZXMoKS5nZXRMZW5ndGgoKTsKLQkJaWYgKGluZGV4IDwgMCB8fCBsZW5ndGggPCBpbmRleCkKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCi0JCUNTU1J1bGVJbXBsIHJlZlJ1bGUgPSAobGVuZ3RoICE9IGluZGV4KSA/IGdldEluZGV4ZWRSdWxlKGluZGV4KSA6IG51bGw7Ci0KLQkJQ1NTUnVsZUltcGwgbmV3UnVsZSA9IChDU1NSdWxlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1J1bGUocnVsZSk7Ci0KLQkJLy8gcHJldmVudCBmcm9tIG5lc3RpbmcgQG1lZGlhIHJ1bGUKLQkJaWYgKG5ld1J1bGUuZ2V0VHlwZSgpID09IENTU1J1bGUuTUVESUFfUlVMRSkKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLlNZTlRBWF9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0KLQkJaW5zZXJ0QmVmb3JlKG5ld1J1bGUsIHJlZlJ1bGUpOwotCi0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld1J1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJlZlJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIGluc2VydFJ1bGVCZWZvcmUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgbmV3UnVsZSwgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVmUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdSdWxlID09IG51bGwgJiYgcmVmUnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgaW5zZXJ0QmVmb3JlKChDU1NOb2RlSW1wbCkgbmV3UnVsZSwgKENTU05vZGVJbXBsKSByZWZSdWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZW1vdmVSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlcGxhY2VSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG9sZFJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIG9sZFJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlcGxhY2VDaGlsZCgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgb2xkUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbENyZWF0aW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbENyZWF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDk0YTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLS8qKgotICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLSAqLwotcHVibGljIGNsYXNzIENTU01vZGVsQ3JlYXRpb25Db250ZXh0IHsKLQotCXByaXZhdGUgQ1NTTm9kZUltcGwgZlJvb3ROb2RlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZUYXJnZXROb2RlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZOZXh0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlJlcGFyc2VTdGFydCA9IC0xOwotCXByaXZhdGUgaW50IGZSZXBhcnNlRW5kID0gLTE7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbENvbnRleHQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbENyZWF0aW9uQ29udGV4dChDU1NOb2RlSW1wbCByb290Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCWZSb290Tm9kZSA9IHJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2xlYXIoKSB7Ci0JCWZOZXh0Tm9kZSA9IG51bGw7Ci0JCWZUYXJnZXROb2RlID0gbnVsbDsKLQkJcmVzZXRSZXBhcnNlUmFuZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NOb2RlSW1wbCBnZXROZXh0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0UmVwYXJzZUVuZCgpIHsKLQkJcmV0dXJuIGZSZXBhcnNlRW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRSZXBhcnNlU3RhcnQoKSB7Ci0JCXJldHVybiBmUmVwYXJzZVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU05vZGVJbXBsIGdldFJvb3ROb2RlKCkgewotCQlyZXR1cm4gZlJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU05vZGVJbXBsIGdldFRhcmdldE5vZGUoKSB7Ci0JCXJldHVybiBmVGFyZ2V0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzVG9SZXBhcnNlKCkgewotCQlyZXR1cm4gKDAgPD0gZ2V0UmVwYXJzZVN0YXJ0KCkgJiYgMCA8PSBnZXRSZXBhcnNlRW5kKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVzZXRSZXBhcnNlUmFuZ2UoKSB7Ci0JCWZSZXBhcnNlU3RhcnQgPSBmUmVwYXJzZUVuZCA9IC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0TGFzdCgpIHsKLQkJZk5leHROb2RlID0gbnVsbDsKLQotCQlpZiAoIShmUm9vdE5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IGZSb290Tm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmUm9vdE5vZGUpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCUNTU05vZGVJbXBsIG5vZGUgPSBmUm9vdE5vZGU7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJSUNTU05vZGUgbGFzdENoaWxkID0gbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCQlpZiAobGFzdENoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyICYmICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBsYXN0Q2hpbGQpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCW5vZGUgPSAoQ1NTTm9kZUltcGwpIGxhc3RDaGlsZDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWZUYXJnZXROb2RlID0gbm9kZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0TmV4dE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlmTmV4dE5vZGUgPSAoQ1NTTm9kZUltcGwpIG5vZGU7Ci0JCWlmIChmTmV4dE5vZGUgIT0gbnVsbCkgewotCQkJZlRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpIGZOZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFJlcGFyc2VFbmQoaW50IGVuZCkgewotCQlmUmVwYXJzZUVuZCA9IGVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFJlcGFyc2VTdGFydChpbnQgc3RhcnQpIHsKLQkJZlJlcGFyc2VTdGFydCA9IHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0VGFyZ2V0Tm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWZUYXJnZXROb2RlID0gKENTU05vZGVJbXBsKSBub2RlOwotCQlpZiAoZk5leHROb2RlICE9IG51bGwgJiYgZk5leHROb2RlLmdldFBhcmVudE5vZGUoKSAhPSBmVGFyZ2V0Tm9kZSkgewotCQkJZk5leHROb2RlID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2NGQ0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsRGVsZXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsRGVsZXRpb25Db250ZXh0IHsKLQotCXByaXZhdGUgaW50IGZPbGRTdGFydCA9IC0xOwotCXByaXZhdGUgaW50IGZPbGRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGZOZXdTdGFydCA9IC0xOwotCXByaXZhdGUgaW50IGZOZXdMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGZMZW5ndGhEaWZmZXJlbmNlID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gbnVsbDsKLQkvLyBwcml2YXRlIElDU1NOb2RlIGZSb290Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlJlbW92ZWRSYW5nZUJlZ2luID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlJlbW92ZWRSYW5nZUVuZCA9IC0xOwotCXByaXZhdGUgQ1NTTm9kZUxpc3RJbXBsIGZOb2Rlc1RvQmVSZW1vdmVkID0gbmV3IENTU05vZGVMaXN0SW1wbCgpOwotCi0JLyoqCi0JICogQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbERlbGV0aW9uQ29udGV4dChJQ1NTTm9kZSByb290Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCS8vIGZSb290Tm9kZSA9IHJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gYWRkTm9kZVRvQmVSZW1vdmVkKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG5Ob2RlcyA9IGZOb2Rlc1RvQmVSZW1vdmVkLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5Ob2RlczsgaSsrKSB7Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSBmTm9kZXNUb0JlUmVtb3ZlZC5pdGVtKGkpOwotCQkJaWYgKENTU01vZGVsVXRpbC5pc1BhcmVudE9mKHBhcmVudCwgbm9kZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZk5vZGVzVG9CZVJlbW92ZWQuYXBwZW5kTm9kZShub2RlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBleHBhbmRSZW1vdmVkUmFuZ2VCZWdpbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IG5ld0JlZ2luID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsgLy8gZk9sZFN0YXJ0ID09IGZOZXdTdGFydCwgcmlnaHQ/PwotCQlpZiAoZlJlbW92ZWRSYW5nZUJlZ2luIDwgMCB8fCBuZXdCZWdpbiA8IGZSZW1vdmVkUmFuZ2VCZWdpbikgewotCQkJZlJlbW92ZWRSYW5nZUJlZ2luID0gbmV3QmVnaW47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGV4cGFuZFJlbW92ZWRSYW5nZUVuZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IG5ld0VuZCA9IGZsYXROb2RlLmdldEVuZCgpICsgKChpc09sZE5vZGUoZmxhdE5vZGUpKSA/IGZMZW5ndGhEaWZmZXJlbmNlIDogMCk7Ci0JCWlmIChmUmVtb3ZlZFJhbmdlRW5kIDwgMCB8fCBmUmVtb3ZlZFJhbmdlRW5kIDwgbmV3RW5kKSB7Ci0JCQlmUmVtb3ZlZFJhbmdlRW5kID0gbmV3RW5kOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgZmluZENvbnRhaW5lcihDU1NOb2RlSW1wbCBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJLy8gQW0gaSBhIGNvbnRhaW5lciBvZiBmbGF0Tm9kZT8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbnQgZmlyc3RTdGFydCA9IGdldE9yaWdpbmFsT2Zmc2V0KGZpcnN0Tm9kZSk7Ci0JCQlpbnQgbGFzdFN0YXJ0ID0gZ2V0T3JpZ2luYWxPZmZzZXQobGFzdE5vZGUpOwotCQkJaW50IHN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQotCQkJaWYgKGZpcnN0U3RhcnQgPD0gc3RhcnQgJiYgc3RhcnQgPD0gbGFzdFN0YXJ0KSB7Ci0JCQkJLy8gSSBhbSBhIGNvbnRhaW5lciwgaXMgbXkgY2hpbGQgYSBjb250YWluZXIgPwotCQkJCWZvciAoSUNTU05vZGUgbm9kZSA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU05vZGVJbXBsKSB7Ci0JCQkJCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gZmluZENvbnRhaW5lcigoQ1NTTm9kZUltcGwpIG5vZGUsIGZsYXROb2RlKTsKLQkJCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBmaW5kRGVsZXRpb25UYXJnZXQoQ1NTTm9kZUltcGwgcGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0YXJnZXQgPSBmaW5kQ29udGFpbmVyKHBhcmVudCwgZmxhdE5vZGUpOwotCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludChmbGF0Tm9kZS50b1N0cmluZygpICsgIjogIik7Ci0KLQkJLy8gY2hpbGQgYSg9PT09PSliKD09PT09KWMKLQkJLy8gcGFyZW50ICg9PT09PT09PT09PT09PT09KSBhLGMgY2FuIHJlbW92ZSBwYXJlbnQsIGJ1dCBiIGNhbm5vdC4KLQotCQlJQ1NTTm9kZSBjaGlsZDsKLQotCQlmb3IgKGNoaWxkID0gdGFyZ2V0LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbCAmJiAhKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKTsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkvLyBqdXN0IGFkdmFuY2luZwotCQl9Ci0KLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGFyZ2V0IGhhcyBubyBjaGlsZHJlbi4iKTsgLy8gVEVTVEJZQ09aWQotCQkJcmV0dXJuIHRhcmdldDsgLy8gaGFzIG5vIGNoaWxkIGNvbnRhaW5lcnMuCi0JCX0KLQkJZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRTdGFydCgpIDwgZ2V0T3JpZ2luYWxPZmZzZXQoZmlyc3ROb2RlKSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZmxhdE5vZGUgaXMgaW4gZnJvbnQgb2YgZmlyc3QgY2hpbGQiKTsKLQkJCQkvLyAvLyBURVNUQllDT1pZCi0JCQkJcmV0dXJuIHRhcmdldDsgLy8gYQotCQkJfQotCQl9Ci0KLQkJZm9yIChjaGlsZCA9IHRhcmdldC5nZXRMYXN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbCAmJiAhKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKTsgY2hpbGQgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSkgewotCQkJLy8ganVzdCBhZHZhbmNpbmcKLQkJfQotCi0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInRhcmdldCBoYXMgbm8gY2hpbGRyZW4uIik7IC8vIFRFU1RCWUNPWlkKLQkJCXJldHVybiB0YXJnZXQ7IC8vIGhhcyBubyBjaGlsZCBjb250YWluZXJzLgotCQl9Ci0JCWVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZ2V0T3JpZ2luYWxPZmZzZXQoZmlyc3ROb2RlKSA8IGZsYXROb2RlLmdldFN0YXJ0KCkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImZsYXROb2RlIGlzIGluIGFmdGVyIG9mIGxhc3QgY2hpbGQiKTsKLQkJCQkvLyAvLyBURVNUQllDT1pZCi0JCQkJcmV0dXJuIHRhcmdldDsgLy8gYwotCQkJfQotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmbGF0Tm9kZSBpbm5lciBvZiBjaGlsZHJlbiIpOyAvLyBURVNUQllDT1pZCi0JCXJldHVybiBudWxsOyAvLyBiCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgZ2V0Tm9kZXNUb0JlUmVtb3ZlZCgpIHsKLQkJQ29sbGVjdGlvbiBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IG5Ob2RlcyA9IGZOb2Rlc1RvQmVSZW1vdmVkLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5Ob2RlczsgaSsrKSB7Ci0JCQlub2Rlcy5hZGQoZk5vZGVzVG9CZVJlbW92ZWQuaXRlbShpKSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0T3JpZ2luYWxPZmZzZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQlpZiAoMCA8PSBmTGVuZ3RoRGlmZmVyZW5jZSkgewotCQkJCWlmIChmTmV3U3RhcnQgKyBmTmV3TGVuZ3RoIDwgb2Zmc2V0KSB7Ci0JCQkJCW9mZnNldCAtPSBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZk9sZFN0YXJ0ICsgZk9sZExlbmd0aCA8PSBvZmZzZXQgfHwgKGZOZXdTdGFydCA8IDAgJiYgZk9sZFN0YXJ0IDw9IG9mZnNldCAmJiAhaXNPbGROb2RlKGZsYXROb2RlKSkgfHwgKDAgPD0gZk5ld1N0YXJ0ICYmIGZOZXdTdGFydCArIGZOZXdMZW5ndGggPD0gb2Zmc2V0ICYmICFpc09sZE5vZGUoZmxhdE5vZGUpKSkgewotCQkJCQlvZmZzZXQgLT0gZkxlbmd0aERpZmZlcmVuY2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0UmVtb3ZlZFJhbmdlQmVnaW4oKSB7Ci0JCXJldHVybiBmUmVtb3ZlZFJhbmdlQmVnaW47Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldFJlbW92ZWRSYW5nZUVuZCgpIHsKLQkJcmV0dXJuIGZSZW1vdmVkUmFuZ2VFbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzT2xkTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCWlmIChlLm5leHRFbGVtZW50KCkgPT0gZmxhdE5vZGUpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0dXBDb250ZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCWZPbGRMZW5ndGggPSBDU1NVdGlsLmdldFRleHRMZW5ndGgob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkgJiYgKGZsYXROb2RlID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKSAhPSBudWxsKSB7Ci0JCQlmT2xkU3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZk9sZFN0YXJ0ID0gLTE7Ci0JCX0KLQkJZk5ld0xlbmd0aCA9IENTU1V0aWwuZ2V0VGV4dExlbmd0aChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCAmJiAwIDwgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSAmJiAoZmxhdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpICE9IG51bGwpIHsKLQkJCWZOZXdTdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQlmUmVtb3ZlZFJhbmdlQmVnaW4gPSBmTmV3U3RhcnQ7Ci0JCQlmUmVtb3ZlZFJhbmdlRW5kID0gZk5ld1N0YXJ0ICsgZk5ld0xlbmd0aDsKLQkJfQotCQllbHNlIHsKLQkJCWZOZXdTdGFydCA9IC0xOwotCQkJZlJlbW92ZWRSYW5nZUJlZ2luID0gZlJlbW92ZWRSYW5nZUVuZCA9IC0xOwotCQl9Ci0JCWZMZW5ndGhEaWZmZXJlbmNlID0gZk5ld0xlbmd0aCAtIGZPbGRMZW5ndGg7Ci0JCWZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQotCQkvLyBjbGVhbnVwIG5vZGVzCi0JCXdoaWxlICgwIDwgZk5vZGVzVG9CZVJlbW92ZWQuZ2V0TGVuZ3RoKCkpIHsKLQkJCWZOb2Rlc1RvQmVSZW1vdmVkLnJlbW92ZU5vZGUoMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkNmQ0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbC5DU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGwuQ1NTU3R5bGVOb3RpZnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0ZWRDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuU2VsZWN0b3JzQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIENTU01vZGVsSW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSUNTU01vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBDU1NEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgb3JnLnczYy5kb20uTm9kZSBvd25lck5vZGUgPSBudWxsOwotCXByaXZhdGUgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIHN0eWxlTm90aWZpZXIgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxQYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZXIgZlVwZGF0ZXIgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElEX05PTl9FWFRFUk5BTF9DU1MgPSAiKipfTk9OX0VYVEVSTkFMX0NTU18qKioiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENTU01vZGVsSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZXZlbnQuQ1NTU3R5bGVMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLmFkZFN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXZvaWQgYXR0clJlcGxhY2VkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5ld0F0dHIsIENTU05vZGVJbXBsIG9sZEF0dHIpIHsKLQkJaWYgKCFmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlKSB7Ci0JCQlDU1NNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldFVwZGF0ZXIoKTsKLQkJCXVwZGF0ZXIuYXR0clJlcGxhY2VkKHBhcmVudE5vZGUsIG5ld0F0dHIsIG9sZEF0dHIpOwotCQl9Ci0KLQkJSUNTU1NlbGVjdG9yIHJlbW92ZWRbXSA9IG51bGwsIGFkZGVkW10gPSBudWxsOwotCQlpZiAob2xkQXR0ciAhPSBudWxsICYmIG9sZEF0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgb2xkQXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSkgewotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgb2xkQXR0cjsKLQkJCS8vIGNvbGxlY3QgY2hhbmdlZCBzZWxlY3RvcgotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCXJlbW92ZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJcmVtb3ZlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCX0KLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCAmJiBuZXdBdHRyLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFICYmICgoQ1NTQXR0ckltcGwpIG5ld0F0dHIpLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoQ1NTQXR0ckltcGwpIG5ld0F0dHI7Ci0JCQkvLyBjb2xsZWN0IGNoYW5nZWQgc2VsZWN0b3IKLQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQlhZGRlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCX0KLQkJaWYgKHJlbW92ZWQgIT0gbnVsbCB8fCBhZGRlZCAhPSBudWxsIHx8IGdldERvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpIHsKLQkJCWdldFN0eWxlTm90aWZpZXIoKS5maXJlKHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQkJfQotCQkvLyBmb3IgaHJlZiBhdHRyaWJ1dGUKLQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCAmJiBnZXRTdHlsZUxpc3RlbmVycygpLnNpemUoKSA+IDApIHsKLQkJCWJvb2xlYW4gdXBkYXRlID0gZmFsc2U7Ci0JCQlpZiAob2xkQXR0ciAhPSBudWxsICYmIG9sZEF0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgb2xkQXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCXVwZGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAobmV3QXR0ciAhPSBudWxsICYmIG5ld0F0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbmV3QXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCXVwZGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAodXBkYXRlKQotCQkJCSgoSUNTU0ltcG9ydFJ1bGUpIHBhcmVudE5vZGUpLmdldFN0eWxlU2hlZXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5iZWdpblJlY29yZGluZygpOwotCi0JCU5vZGUgbm9kZSA9IGdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCXZvaWQgY2hpbGRSZXBsYWNlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHsKLQkJaWYgKCFmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlKSB7Ci0JCQlDU1NNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldFVwZGF0ZXIoKTsKLQkJCXVwZGF0ZXIuY2hpbGRSZXBsYWNlZChwYXJlbnROb2RlLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCQl9Ci0KLQkJLy8gYWx3YXlzIGNoZWNrIGFuZCBzZW5kIHNlbGVjdG9yIGV2ZW50Ci0JCUlDU1NTZWxlY3RvciByZW1vdmVkW10gPSBudWxsLCBhZGRlZFtdID0gbnVsbDsKLQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUgfHwgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBUlVMRV9OT0RFKSB7Ci0JCQkvLyBjb2xsZWN0IG9sZCBzZWxlY3RvcnMKLQkJCVNlbGVjdG9yc0NvbGxlY3RvciBzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJc2VsVHJhdi5hcHBseShvbGRDaGlsZCk7Ci0JCQlpbnQgblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJaWYgKG5TZWwgPiAwKSB7Ci0JCQkJcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbblNlbF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsOyBpKyspCi0JCQkJCXJlbW92ZWRbaV0gPSAoSUNTU1NlbGVjdG9yKSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLmdldChpKTsKLQkJCX0KLQkJCS8vIGNvbGxlY3QgbmV3IHNlbGVjdG9ycwotCQkJc2VsVHJhdiA9IG5ldyBTZWxlY3RvcnNDb2xsZWN0b3IoKTsKLQkJCXNlbFRyYXYuYXBwbHkobmV3Q2hpbGQpOwotCQkJblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJaWYgKG5TZWwgPiAwKSB7Ci0JCQkJYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gbW9kaWZpY2F0aW9uCi0JCQlJQ1NTTm9kZSBydWxlID0gcGFyZW50Tm9kZTsKLQkJCXdoaWxlIChydWxlICE9IG51bGwpIHsKLQkJCQlpZiAocnVsZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpCi0JCQkJCWJyZWFrOwotCQkJCXJ1bGUgPSBydWxlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWlmIChydWxlICE9IG51bGwpIHsKLQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSAoKElDU1NTdHlsZVJ1bGUpIHJ1bGUpLmdldFNlbGVjdG9ycygpOwotCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJfQotCQl9Ci0JCWlmIChyZW1vdmVkICE9IG51bGwgfHwgYWRkZWQgIT0gbnVsbCB8fCBnZXREb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSB7Ci0JCQkvLyBzZW5kIHNlbGVjdG9yIGNoYW5nZWQgZXZlbnQKLQkJCWdldFN0eWxlTm90aWZpZXIoKS5maXJlKHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQkJfQotCQkvLyBjbG9zZSByZW1vdmVkIGltcG9ydC1ydWxlJ3MgZXh0ZXJuYWwgc3R5bGUgc2hlZXRzCi0JCXsKLQkJCUltcG9ydFJ1bGVDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRSdWxlQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG9sZENoaWxkKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRSdWxlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJKChDU1NJbXBvcnRSdWxlSW1wbCkgaXQubmV4dCgpKS5jbG9zZVN0eWxlU2hlZXQoKTsKLQkJCX0KLQkJfQotCQkvLyBzZW5kIGV2ZW50cyB0byBsaXN0ZW5lciBmb3IgbmV3IGltcG9ydC1ydWxlcwotCQlpZiAoZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsICYmIGdldFN0eWxlTGlzdGVuZXJzKCkuc2l6ZSgpID4gMCkgewotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShuZXdDaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VJbXBvcnRlZCgpIHsKLQkJaWYgKCFpc1NoYXJlZCgpKSB7Ci0JCQkvLyByZWxlYXNlIGxpc3RlbmVycwotCQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgewotCQkJCVZlY3RvciB0b1JlbW92ZSA9IG5ldyBWZWN0b3IoZ2V0U3R5bGVMaXN0ZW5lcnMoKSk7Ci0JCQkJSXRlcmF0b3IgaXQgPSB0b1JlbW92ZS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJcmVtb3ZlU3R5bGVMaXN0ZW5lcigoSUNTU1N0eWxlTGlzdGVuZXIpIGl0Lm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2xvc2UgaW1wb3J0IHJ1bGVzCi0JCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShnZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGl0MiA9IHRyYXYuZ2V0UnVsZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Mi5oYXNOZXh0KCkpIHsKLQkJCQkoKENTU0ltcG9ydFJ1bGVJbXBsKSBpdDIubmV4dCgpKS5yZWxlYXNlUnVsZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDU1NEb2N1bWVudEltcGwgY3JlYXRlRG9jdW1lbnQoKSB7Ci0JCUNTU0RvY3VtZW50SW1wbCBkb2MgPSBudWxsOwotCQlpbnQgcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX1NUWUxFU0hFRVQ7Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBjYXNlIGlzIGV4dGVybmFsIENTUyBmaWxlCi0JCQlkb2MgPSAoQ1NTU3R5bGVTaGVldEltcGwpIERPTUNTU0ltcGwuY3JlYXRlQ1NTU3R5bGVTaGVldChudWxsLCBudWxsKTsgLy8gcGFyYW1ldGVycwotCQkJLy8gYXJlCi0JCQkvLyBmb3IKLQkJCS8vIFNUWUxFLXRhZwotCQkJcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX1NUWUxFU0hFRVQ7Ci0JCX0KLQkJZWxzZSBpZiAob3duZXJOb2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCAmJiAoKEVsZW1lbnQpIG93bmVyTm9kZSkuZ2V0VGFnTmFtZSgpLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJTVFlMRSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJLy8gdGhpcyBjYXNlIGlzIFNUWUxFLXRhZwotCQkJRWxlbWVudCBzdHlsZSA9IChFbGVtZW50KSBvd25lck5vZGU7Ci0JCQlkb2MgPSAoQ1NTU3R5bGVTaGVldEltcGwpIERPTUNTU0ltcGwuY3JlYXRlQ1NTU3R5bGVTaGVldChzdHlsZS5nZXRBdHRyaWJ1dGUoIlRJVExFIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXN0eWxlLmdldEF0dHJpYnV0ZSgiTUVESUEiKSk7Ly8kTk9OLU5MUy0xJAotCQkJcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX1NUWUxFU0hFRVQ7Ci0JCX0KLQkJZWxzZSBpZiAob3duZXJOb2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCB8fCBvd25lck5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5BdHRyKSB7Ci0JCQkvLyBJbmxpbmUgYXR0cmlidXRlcwotCQkJZG9jID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBET01DU1NJbXBsLmNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLQkJCXBhcnNlck1vZGUgPSBDU1NTb3VyY2VQYXJzZXIuTU9ERV9ERUNMQVJBVElPTjsKLQkJfQotCQlSZWdpb25QYXJzZXIgcmVnaW9uUGFyc2VyID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UGFyc2VyKCk7Ci0JCWlmIChyZWdpb25QYXJzZXIgaW5zdGFuY2VvZiBDU1NTb3VyY2VQYXJzZXIpIHsKLQkJCSgoQ1NTU291cmNlUGFyc2VyKSByZWdpb25QYXJzZXIpLnNldFBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lckRPTU5vZGUoKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5lbmRSZWNvcmRpbmcocmVxdWVzdGVyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZW5kUmVjb3JkaW5nKHJlcXVlc3Rlcik7Ci0KLQkJZ2V0U3R5bGVOb3RpZmllcigpLmVuZFJlY29yZGluZygpOwotCX0KLQotCXB1YmxpYyBJQ1NTRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQl0aGlzLmRvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoKTsKLQkJCXRoaXMuZG9jdW1lbnQuc2V0TW9kZWwodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JCXN0cnVjdHVyZWREb2N1bWVudCA9IHN1cGVyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCi0JCS8vIHRoZSBmaXJzdCB0aW1lCi0JCUFzc2VydC5pc05vdE51bGwoZ2V0TW9kZWxIYW5kbGVyKCkpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0TW9kZWxIYW5kbGVyKCkuZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0RG9jdW1lbnQoKSkuZ2V0Q29udGFpbmVyTm9kZShvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldE93bmVyRE9NTm9kZSgpIHsKLQkJcmV0dXJuIG93bmVyTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3duZXJOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIGlmIHRoZSBjYXNlIG9mIGV4dGVybmFsIENTUyBtb2RlbCwgeW91Ci0JICogICAgICAgICAgICBzaG91bGQgc2V0IG51bGwsIGVsc2UgaWYgaW50ZXJuYWwgY3NzLCB5b3Ugc2hvdWxkIHNldAotCSAqICAgICAgICAgICAgU1RZTEUtdGFnIG5vZGUsIGVsc2UgaWYgaW5saW5lIGNzcywgeW91IHNob3VsZCBzZXQgdGhlCi0JICogICAgICAgICAgICBlbGVtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHN0eWxlLWF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRPTU5vZGUoTm9kZSBub2RlKSB7Ci0JCS8vIHByb2hpYml0IG93bmVyIGNoYW5nZQotCQlBc3NlcnQuaXNUcnVlKG93bmVyTm9kZSA9PSBudWxsKTsKLQkJb3duZXJOb2RlID0gbm9kZTsKLQkJaWYgKG93bmVyTm9kZSAhPSBudWxsKSB7IC8vIGZvciBpbnRlcm5hbC9pbmxpbmUgQ1NTIGNvbnRleHQKLQkJCXRyeSB7Ci0JCQkJc2V0SWQoSURfTk9OX0VYVEVSTkFMX0NTUyk7Ci0JCQl9Ci0JCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkJLy8gaW1wb3NzaWJsZQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTTW9kZWxQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAoZlBhcnNlciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJZlBhcnNlciA9IG5ldyBDU1NNb2RlbFBhcnNlcihkb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN0eWxlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gZ2V0U3R5bGVOb3RpZmllcigpLmdldFN0eWxlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0U3R5bGVTaGVldFR5cGUoKSB7Ci0JCWlmIChnZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24pCi0JCQlyZXR1cm4gSU5MSU5FOwotCQlpZiAoZ2V0T3duZXJET01Ob2RlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBFTUJFRERFRDsKLQkJZWxzZQotCQkJcmV0dXJuIEVYVEVSTkFMOwotCX0KLQotCXByaXZhdGUgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIGdldFN0eWxlTm90aWZpZXIoKSB7Ci0JCWlmIChzdHlsZU5vdGlmaWVyID09IG51bGwpIHsKLQkJCXN0eWxlTm90aWZpZXIgPSAob3duZXJOb2RlICE9IG51bGwpID8gbmV3IENTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIodGhpcykgOiBuZXcgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBzdHlsZU5vdGlmaWVyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTW9kZWxVcGRhdGVyIGdldFVwZGF0ZXIoKSB7Ci0JCWlmIChmVXBkYXRlciA9PSBudWxsKSB7Ci0JCQlmVXBkYXRlciA9IG5ldyBDU1NNb2RlbFVwZGF0ZXIodGhpcyk7Ci0JCQlmVXBkYXRlci5zZXRQYXJzZXIoZ2V0UGFyc2VyKCkpOwotCQl9Ci0JCXJldHVybiBmVXBkYXRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlY29yZGluZygpIHsKLQkJcmV0dXJuIGdldFN0eWxlTm90aWZpZXIoKS5pc1JlY29yZGluZygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiAoZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBFWFRFUk5BTCkgJiYgc3VwZXIuaXNTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBmb3IgdGhlIGNhc2UKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAoZmxhdE5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGdldERvY3VtZW50KCkpLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlDU1NNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJcGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIG5vQ2hhbmdlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJLy8gbm9wCi0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID09IG51bGwgJiYgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQotCQlDU1NNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJcGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjbGVhbnVwIC0+IHJlYnVpbGQgQ1NTIE5vZGVzIFRoaXMgaXMgcHJlLWJldGEgZml4IGZvciAxNzgxNzYuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaE5vZGVzKCkgewotCQkvLyBjbGVhbnVwIG9sZCBub2RlcwotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGdldERvY3VtZW50KCkpLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCi0JCWdldFBhcnNlcigpLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJU3RyaW5nIHNvdXJjZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRUZXh0KCk7Ci0KLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsIDAsIHNvdXJjZS5sZW5ndGgoKSwgbnVsbCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dCh0aGlzLCAwLCAwLCBzb3VyY2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFJlZ2lvbigpOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSB0cnVlOwotCi0JCUNTU01vZGVsUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQlwYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQlwYXJzZXIuY2hhbmdlUmVnaW9uKGZsYXROb2RlLCByZWdpb24pOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2xkUmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJaWYgKG9sZFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdSZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJQ1NTTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCXBhcnNlci5yZXBsYWNlUmVnaW9ucyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21FZGl0KCkgewotCQljbG9zZUltcG9ydGVkKCk7Ci0JCWlmIChnZXRTdHlsZVNoZWV0VHlwZSgpID09IEVYVEVSTkFMKSB7Ci0JCQlzdXBlci5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJY2xvc2VJbXBvcnRlZCgpOwotCQlpZiAoZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBFWFRFUk5BTCkgewotCQkJc3VwZXIucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5ldmVudC5DU1NTdHlsZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkucmVtb3ZlU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50KQotCQkJcmV0dXJuOyAvLyBub3RpbmcgdG8gZG8KLQotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQlvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbmV3TW9kZWwobmV3IE5ld0RvY3VtZW50RXZlbnQobmV3U3RydWN0dXJlZERvY3VtZW50LCB0aGlzKSk7Ci0JCQl9Ci0JCQluZXdTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNyY01vZGVsCi0JICogICAgICAgICAgICBjb20uaW1iLnNlZC5jc3MubW9kZS5pbnRlZmFjZXMuSUNTU01vZGVsCi0JICogQHBhcmFtIHJlbW92ZWQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NTZWxlY3RvcltdCi0JICogQHBhcmFtIGFkZGVkCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLnN0eWxlQ2hhbmdlZChzcmNNb2RlbCwgcmVtb3ZlZCwgYWRkZWQsIG1lZGlhKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3JjTW9kZWwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkuc3R5bGVVcGRhdGUoc3JjTW9kZWwpOwotCX0KLQotCXZvaWQgdmFsdWVDaGFuZ2VkKENTU05vZGVJbXBsIG5vZGUsIFN0cmluZyBvbGRWYWx1ZSkgewotCQlpZiAoIWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUpIHsKLQkJCUNTU01vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0VXBkYXRlcigpOwotCQkJdXBkYXRlci52YWx1ZUNoYW5nZWQobm9kZSwgb2xkVmFsdWUpOwotCQl9Ci0KLQkJSUNTU1NlbGVjdG9yIHJlbW92ZWRbXSA9IG51bGwsIGFkZGVkW10gPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBub2RlKS5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgbm9kZTsKLQkJCQkvLyBjb2xsZWN0IGNoYW5nZWQgc2VsZWN0b3IKLQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChhdHRyLmdldFZhbHVlKCkpOwotCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCi0JCQkJLy8gZ2V0IG9sZCB2YWx1ZQotCQkJCWxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChvbGRWYWx1ZSk7Ci0JCQkJcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJCXJlbW92ZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgewotCQkJCUlDU1NOb2RlIHJ1bGUgPSBub2RlOwotCQkJCXdoaWxlIChydWxlICE9IG51bGwpIHsKLQkJCQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKQotCQkJCQkJYnJlYWs7Ci0JCQkJCXJ1bGUgPSBydWxlLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0JCQkJaWYgKHJ1bGUgIT0gbnVsbCkgewotCQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSAoKElDU1NTdHlsZVJ1bGUpIHJ1bGUpLmdldFNlbGVjdG9ycygpOwotCQkJCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVtb3ZlZCAhPSBudWxsIHx8IGFkZGVkICE9IG51bGwgfHwgZ2V0RG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJLy8gc2VuZCBzZWxlY3RvciBjaGFuZ2VkIGV2ZW50Ci0JCQlnZXRTdHlsZU5vdGlmaWVyKCkuZmlyZShyZW1vdmVkLCBhZGRlZCwgbnVsbCk7Ci0JCX0KLQkJLy8gZm9yIGhyZWYgYXR0cmlidXRlCi0JCWlmIChnZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwgJiYgZ2V0U3R5bGVMaXN0ZW5lcnMoKS5zaXplKCkgPiAwKSB7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbm9kZSkuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCSgoSUNTU0ltcG9ydFJ1bGUpICgoSUNTU0F0dHIpIG5vZGUpLmdldE93bmVyQ1NTTm9kZSgpKS5nZXRTdHlsZVNoZWV0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsTm9kZUZlZWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbE5vZGVGZWVkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlNjQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsTm9kZUZlZWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsTm9kZUZlZWRlciB7Ci0JLyoqCi0JICogY3VycmVudGx5IElDU1NEb2N1bWVudCBpcyB1c2VkIGJ1dCBtYXkgZ28gYmFjayB0byBDU1NEb2N1bWVudEltcGwgaW4gZnV0dXJlLgotCSAqLwotCUlDU1NEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCUNTU01vZGVsVXBkYXRlQ29udGV4dCBmVXBkYXRlQ29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbE5vZGVGZWVkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbE5vZGVGZWVkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ1NTTW9kZWxOb2RlRmVlZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogY3VycmVudGx5IElDU1NEb2N1bWVudCBpcyB1c2VkIGJ1dCBtYXkgZ28gYmFjayB0byBDU1NEb2N1bWVudEltcGwgaW4gZnV0dXJlLgotCSAqLwotCUNTU01vZGVsTm9kZUZlZWRlcihJQ1NTRG9jdW1lbnQgZG9jdW1lbnQsIENTU01vZGVsVXBkYXRlQ29udGV4dCB1cGRhdGVDb250ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmVXBkYXRlQ29udGV4dCA9IHVwZGF0ZUNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTQ2hhcnNldFJ1bGVJbXBsIGdldENTU0NoYXJzZXRSdWxlKCkgewotCQlDU1NDaGFyc2V0UnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NDaGFyc2V0UnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NDaGFyc2V0UnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NDaGFyc2V0UnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0ZvbnRGYWNlUnVsZUltcGwgZ2V0Q1NTRm9udEZhY2VSdWxlKCkgewotCQlDU1NGb250RmFjZVJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTRm9udEZhY2VSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU0ZvbnRGYWNlUnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NGb250RmFjZVJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NJbXBvcnRSdWxlSW1wbCBnZXRDU1NJbXBvcnRSdWxlKCkgewotCQlDU1NJbXBvcnRSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU0ltcG9ydFJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTSW1wb3J0UnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NJbXBvcnRSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTWVkaWFSdWxlSW1wbCBnZXRDU1NNZWRpYVJ1bGUoKSB7Ci0JCUNTU01lZGlhUnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NNZWRpYVJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTTWVkaWFSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU01lZGlhUnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCBnZXRDU1NQYWdlUnVsZSgpIHsKLQkJQ1NTUGFnZVJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTUGFnZVJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTUGFnZVJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUGFnZVJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZVJ1bGVJbXBsIGdldENTU1N0eWxlUnVsZSgpIHsKLQkJQ1NTU3R5bGVSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU1N0eWxlUnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NTdHlsZVJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTU3R5bGVSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmFkYWEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NSdWxlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ29yZU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NNb2RlbFBhcnNlciB7Ci0KLQlwcml2YXRlIElDU1NEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQgZkNyZWF0aW9uQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbERlbGV0aW9uQ29udGV4dCBmRGVsZXRpb25Db250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsVXBkYXRlQ29udGV4dCBmVXBkYXRlQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbE5vZGVGZWVkZXIgZkZlZWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZQYXJzZUZsb2F0aW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbFBhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ1NTTW9kZWxQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHByb3ZkZWQgdGhpcyBtZXRob2QgYnV0IG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnNlRmxvYXRpbmcoKXsKLQkJcmV0dXJuIGZQYXJzZUZsb2F0aW5nOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHJvdmRlZCB0aGlzIG1ldGhvZCBidXQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBnZXRDcmVhdGlvbkNvbnRleHQoKXsKLQkJcmV0dXJuIGZDcmVhdGlvbkNvbnRleHQ7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwcm92ZGVkIHRoaXMgbWV0aG9kIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGVDb250ZXh0QWN0aXZlKCl7Ci0JCXJldHVybiBmVXBkYXRlQ29udGV4dCAhPSBudWxsID8gZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSA6IGZhbHNlOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NNb2RlbFBhcnNlcihJQ1NTRG9jdW1lbnQgZG9jKSB7Ci0JCXRoaXMoKTsKLQkJZkRvY3VtZW50ID0gZG9jOwotCQlmQ3JlYXRpb25Db250ZXh0ID0gbmV3IENTU01vZGVsQ3JlYXRpb25Db250ZXh0KChDU1NOb2RlSW1wbClkb2MpOwotCQlmRGVsZXRpb25Db250ZXh0ID0gbmV3IENTU01vZGVsRGVsZXRpb25Db250ZXh0KGRvYyk7Ci0JCWZVcGRhdGVDb250ZXh0ID0gbmV3IENTU01vZGVsVXBkYXRlQ29udGV4dCgpOwotCQlmRmVlZGVyID0gbmV3IENTU01vZGVsTm9kZUZlZWRlcihkb2MsIGZVcGRhdGVDb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ldyBDb3JlTm9kZUxpc3QoZmxhdE5vZGUsIGZsYXROb2RlKSwgbmV3IENvcmVOb2RlTGlzdChmbGF0Tm9kZSwgZmxhdE5vZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNoYW5nZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwgfHwgcmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZkRvY3VtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0ID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShmbGF0Tm9kZSk7Ci0JCWlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobmV4dCkgPT0gdHlwZSkgewotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlU3RhcnQoZmxhdE5vZGUuZ2V0RW5kKCkpOwotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlRW5kKG5leHQuZ2V0RW5kKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBEZWxldGlvbkNvbnRleHQoKSB7Ci0JCS8vIHNldHVwRGVsZXRpb25Db250ZXh0KG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gY2xlYW51cEZpcnN0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSwgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCkgewotCQlpZiAoZmlyc3ROb2RlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmaXJzdE5vZGUgPT0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldE5leHROb2RlSW5DdXJyZW50KGZpcnN0Tm9kZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChsYXN0Tm9kZSA9PSBudWxsIHx8IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaXNPbGROb2RlKGxhc3ROb2RlKSB8fCBuZXh0Tm9kZSA9PSBudWxsIHx8IGxhc3ROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBuZXh0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJdGFyZ2V0LnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwsIG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGFyZ2V0LnNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5leHROb2RlKTsKLQkJCX0KLQkJCUlDU1NOb2RlIHBhcmVudCA9IHRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJY2xlYW51cEZpcnN0Tm9kZShmaXJzdE5vZGUsIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBjbGVhbnVwTGFzdE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSwgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCkgewotCQlpZiAobGFzdE5vZGUgPT0gbnVsbCB8fCB0YXJnZXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGxhc3ROb2RlID09IHRhcmdldC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFByZXZOb2RlSW5DdXJyZW50KGxhc3ROb2RlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3ROb2RlID09IG51bGwgfHwgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUoZmlyc3ROb2RlKSB8fCBwcmV2Tm9kZSA9PSBudWxsIHx8IHByZXZOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBmaXJzdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCXRhcmdldC5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRhcmdldC5zZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHByZXZOb2RlKTsKLQkJCX0KLQkJCUlDU1NOb2RlIHBhcmVudCA9IHRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJY2xlYW51cExhc3ROb2RlKGxhc3ROb2RlLCAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBjbGVhbnVwVXBkYXRlQ29udGV4dCgpIHsKLQkJaW50IHJlbWFpbnMgPSBmVXBkYXRlQ29udGV4dC5nZXROb2RlQ291bnQoKTsKLQkJZlVwZGF0ZUNvbnRleHQuY2xlYW51cENvbnRleHQoKTsKLQkJcmV0dXJuIHJlbWFpbnM7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGZsb2F0aW5nIENTUyBydWxlIChvd25lciBkb2N1bWVudCB3aWxsIGJlIHNldCkgdGhpcyBpcyBmb3IKLQkgKiBDU1NTdHlsZVNoZWV0LmNyZWF0ZUNTU1J1bGUoU3RyaW5nKQotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKi8KLQlDU1NSdWxlIGNyZWF0ZUNTU1J1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzKSB7Ci0JCWlmIChmbGF0Tm9kZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmUGFyc2VGbG9hdGluZyA9IHRydWU7Ci0KLQkJLy8gc2V0dXAgY3JlYXRpb24gY29udGV4dAotCQlmQ3JlYXRpb25Db250ZXh0LmNsZWFyKCk7Ci0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShudWxsKTsKLQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShudWxsKTsKLQkJQ1NTUnVsZUltcGwgcGFyZW50UnVsZSA9IG51bGw7Ci0KLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZmxhdE5vZGVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDU1NOb2RlSW1wbCBtb2RpZmllZCA9IGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlpZiAocGFyZW50UnVsZSA9PSBudWxsICYmIG1vZGlmaWVkIGluc3RhbmNlb2YgQ1NTUnVsZUltcGwpIHsKLQkJCQlwYXJlbnRSdWxlID0gKENTU1J1bGVJbXBsKSBtb2RpZmllZDsKLQkJCX0KLQkJfQotCi0JCWZQYXJzZUZsb2F0aW5nID0gZmFsc2U7Ci0KLQkJaWYgKHBhcmVudFJ1bGUgIT0gbnVsbCkgewotCQkJQ1NTTW9kZWxVdGlsLmNsZWFudXBDb250YWluZXIocGFyZW50UnVsZSk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50UnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZEJyYWNlQ2xvc2UoaW50IGRlcHRoLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0LCBib29sZWFuIGJCcmVha1NpYmxpbmcpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBudWxsOwotCQlpbnQgYnJhY2VMZXZlbCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHN0YXJ0LmdldE5leHQoKTsKLQkJZm9yICg7IHJlZ2lvbiAhPSBudWxsOyByZWdpb24gPSByZWdpb24uZ2V0TmV4dCgpKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldE5vZGVBdChvZmZzZXQpOwotCQkJaW50IGRlcHRoSGl0ID0gKG5vZGUgIT0gbnVsbCkgPyBDU1NNb2RlbFV0aWwuZ2V0RGVwdGgobm9kZSkgOiAtMTsKLQkJCWlmIChkZXB0aCA8PSBkZXB0aEhpdCkgewotCQkJCS8vIHNpYmxpbmcgaXMgZm91bmQgYmVmb3JlICJ9IgotCQkJCWlmIChiQnJlYWtTaWJsaW5nKSB7Ci0JCQkJCUNTU05vZGVJbXBsIHBhcmVudCA9IChDU1NOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCXdoaWxlIChkZXB0aCA8PSBDU1NNb2RlbFV0aWwuZ2V0RGVwdGgocGFyZW50KSkgewotCQkJCQkJbm9kZSA9IHBhcmVudDsKLQkJCQkJCXBhcmVudCA9IChDU1NOb2RlSW1wbCkgcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgbm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IHByZXZOb2RlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShyZWdpb24pOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCWJyYWNlTGV2ZWwrKzsKLQkJCX0KLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQlicmFjZUxldmVsLS07Ci0JCQkJaWYgKGJyYWNlTGV2ZWwgPCAwKSB7Ci0JCQkJCXJlc3VsdCA9IHJlZ2lvbjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcHJldk5vZGUgPSByZWdpb247Ci0JCX0KLQotCQlpZiAocmVzdWx0ID09IG51bGwgJiYgcmVnaW9uID09IG51bGwpIHsKLQkJCS8vIHJlYWNoIHRoZSBlbmQgb2YgZG9jdW1lbnQKLQkJCXJlc3VsdCA9IHByZXZOb2RlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5vZGVMaXN0ID0gbnVsbDsKLQkJaWYgKDAgPD0gc3RhcnQgJiYgc3RhcnQgPD0gZW5kKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSBmRG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIENTU01vZGVsSW1wbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKChDU1NNb2RlbEltcGwpIG1vZGVsKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kIC0gMSk7Ci0JCQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCAmJiBlbmROb2RlICE9IG51bGwpIHsKLQkJCQkJCW5vZGVMaXN0ID0gbmV3IENvcmVOb2RlTGlzdChzdGFydE5vZGUsIGVuZE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZ2V0Tm9kZUF0KGludCBvZmZzZXQpIHsKLQkJQ1NTTm9kZUltcGwgcm9vdE5vZGUgPSBmQ3JlYXRpb25Db250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCUlDU1NOb2RlIHRhcmdldCA9IHJvb3ROb2RlLmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTTm9kZUltcGwpIHRhcmdldDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRCcmFjZUNsb3NlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCUlDU1NOb2RlIHRhcmdldCA9IENTU01vZGVsVXRpbC5maW5kQnJhY2VDb250YWluZXIoZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCkpOwotCi0JCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHBhcmVudCA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHRhcmdldDsKLQkJaWYgKENTU01vZGVsVXRpbC5pc0ludGVycnVwdGlvbihwYXJlbnQsIHJlZ2lvbikpIHsKLQkJCUlDU1NOb2RlIG5vZGUgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZVN0YXJ0KHBhcmVudC5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VFbmQocGFyZW50LmdldEVuZE9mZnNldCgpKTsKLQkJCQkoKENTU05vZGVJbXBsKSBub2RlKS5yZW1vdmVDaGlsZChwYXJlbnQpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUNTU1BhZ2VSdWxlIHx8IHBhcmVudCBpbnN0YW5jZW9mIElDU1NNZWRpYVJ1bGUgfHwgcGFyZW50IGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8IHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCUNTU01vZGVsVXRpbC5leHBhbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIocGFyZW50LCByZWdpb24pOwotCQkJaWYgKCFDU1NNb2RlbFV0aWwuaXNCcmFjZUNsb3NlZCh0YXJnZXQpKSB7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHBhcmVudC5nZXRQYXJlbnROb2RlKCkpOwotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUocGFyZW50LmdldE5leHRTaWJsaW5nKCkpOwotCQkJCXJldHVybiBwYXJlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydEJyYWNlT3BlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGtleVJlZ2lvbiA9IENTU1V0aWwuZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCWlmIChrZXlSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCFmUGFyc2VGbG9hdGluZykgewotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldE5vZGVBdChrZXlSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmICEobm9kZSBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGtleVJlZ2lvbik7Ci0KLQkJQ1NTTm9kZUltcGwgaW5zZXJ0ZWQgPSBudWxsOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRQYWdlUnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0TWVkaWFSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0Rm9udEZhY2VSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChDU1NVdGlsLmlzU2VsZWN0b3JUZXh0KGtleVJlZ2lvbikpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0U3R5bGVSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCi0JCWlmIChpbnNlcnRlZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJLy8gQ1NTTW9kZWxVdGlsLmV4cGFuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKWluc2VydGVkLAotCQkJLy8gZmxhdE5vZGUpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZUNsb3NlID0gZmluZEJyYWNlQ2xvc2UoQ1NTTW9kZWxVdGlsLmdldERlcHRoKGluc2VydGVkKSwgcmVnaW9uLCAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpKTsKLQkJCWlmIChicmFjZUNsb3NlICE9IG51bGwpIHsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VTdGFydChyZWdpb24uZ2V0RW5kKCkpOwotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZUVuZChicmFjZUNsb3NlLmdldEVuZCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydENoYXJzZXRSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYmVnaW5Eb2NSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kRG9jUmVnaW9uKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChiZWdpbkRvY1JlZ2lvbi5nZXRSZWdpb25zKCkpOwotCQlyZWdpb25zLnJlbW92ZSgwKTsgLy8gbXVzdCBiZSAiQGNoYXJzZXQiCi0JCUlUZXh0UmVnaW9uIGVuY29kaW5nUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHJlZ2lvbnMucmVtb3ZlKDApOwotCQkJaWYgKHRleHRSZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSB0ZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcpIHsKLQkJCQllbmNvZGluZ1JlZ2lvbiA9IHRleHRSZWdpb247Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZW5jb2RpbmdSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NDaGFyc2V0UnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTQ2hhcnNldFJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCXJ1bGUuc2V0QXR0cmlidXRlKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORywgYmVnaW5Eb2NSZWdpb24uZ2V0VGV4dChlbmNvZGluZ1JlZ2lvbikpOwotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgZW5kRG9jUmVnaW9uKTsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IHJ1bGUuZ2V0QXR0cmlidXRlTm9kZShJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGJlZ2luRG9jUmVnaW9uLCBlbmNvZGluZ1JlZ2lvbiwgZW5jb2RpbmdSZWdpb24pOwotCQl9Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTTm9kZUltcGwgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmQ3JlYXRpb25Db250ZXh0ID09IG51bGwgfHwgcmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIHR5cGUgPSAoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSByZWdpb24pLmdldFR5cGUoKTsKLQkJQ1NTTm9kZUltcGwgbW9kaWZpZWQgPSBudWxsOwotCi0JCUlDU1NOb2RlIHRhcmdldCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCi0JCWlmICgoZlBhcnNlRmxvYXRpbmcgJiYgdGFyZ2V0ID09IG51bGwpIHx8IHRhcmdldCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSB7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKSB7Ci0JCQkJbW9kaWZpZWQgPSBpbnNlcnRTZW1pQ29sb25Gb3JSdWxlKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQltb2RpZmllZCA9IGluc2VydEJyYWNlT3BlbihyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJbW9kaWZpZWQgPSBpbnNlcnRCcmFjZUNsb3NlKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCBDU1NVdGlsLmlzU2VsZWN0b3JUZXh0KHJlZ2lvbikpIHsKLQkJCQljaGVja05leHROb2RlKHJlZ2lvbiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCkgewotCQkJCWNoZWNrTmV4dE5vZGUocmVnaW9uLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgodGFyZ2V0IGluc3RhbmNlb2YgQ1NTUnVsZURlY2xDb250YWluZXIgfHwgdGFyZ2V0IGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbikgJiYgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkpIHsKLQkJCW1vZGlmaWVkID0gaW5zZXJ0U3R5bGVEZWNsYXJhdGlvbkl0ZW0ocmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCW1vZGlmaWVkID0gaW5zZXJ0U2VtaUNvbG9uRm9yU3R5bGVEZWNsYXJhdGlvbkl0ZW0ocmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCW1vZGlmaWVkID0gaW5zZXJ0QnJhY2VDbG9zZShyZWdpb24pOwotCQl9Ci0KLQkJLy8gcG9zdCBwcm9jZXNzCi0JCWlmIChtb2RpZmllZCAhPSBudWxsKSB7Ci0JCQlpZiAobW9kaWZpZWQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbW9kaWZpZWQpLnByb3BhZ2F0ZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCkgewotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSByZWdpb25MaXN0LmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24pOwotCQkJaWYgKGZDcmVhdGlvbkNvbnRleHQuaXNUb1JlcGFyc2UoKSkgewotCQkJCWludCBvcmlnU3RhcnQgPSByZWdpb24uZ2V0RW5kKCk7Ci0JCQkJaW50IG9yaWdFbmQgPSByZWdpb25MaXN0Lml0ZW0ocmVnaW9uTGlzdC5nZXRMZW5ndGgoKSAtIDEpLmdldEVuZCgpOwotCQkJCWludCBuZXdTdGFydCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0UmVwYXJzZVN0YXJ0KCk7Ci0JCQkJaW50IG5ld0VuZCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0UmVwYXJzZUVuZCgpOwotCQkJCWlmIChuZXdTdGFydCA8IG9yaWdTdGFydCB8fCBvcmlnRW5kIDwgbmV3RW5kKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld05vZGVMaXN0ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdChuZXdTdGFydCwgbmV3RW5kKTsKLQkJCQkJc2V0dXBDcmVhdGlvbkNvbnRleHQobmV3Tm9kZUxpc3QuaXRlbSgwKSk7Ci0JCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3Tm9kZUxpc3QpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmQ3JlYXRpb25Db250ZXh0LnJlc2V0UmVwYXJzZVJhbmdlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRGb250RmFjZVJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VOb2RlKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU0ZvbnRGYWNlUnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTRm9udEZhY2VSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24sIGJyYWNlTm9kZSk7Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHJ1bGUpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydEltcG9ydFJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBiZWdpbkRvY1JlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmREb2NSZWdpb24pIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGJlZ2luRG9jUmVnaW9uLmdldFJlZ2lvbnMoKSk7Ci0JCXJlZ2lvbnMucmVtb3ZlKDApOyAvLyBtdXN0IGJlICJAaW1wb3J0IgotCQlJVGV4dFJlZ2lvbiBocmVmUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHJlZ2lvbnMucmVtb3ZlKDApOwotCQkJaWYgKHRleHRSZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSB0ZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HKSB7Ci0JCQkJaHJlZlJlZ2lvbiA9IHRleHRSZWdpb247Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaHJlZlJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU0ltcG9ydFJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU0ltcG9ydFJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShyZWdpb25zKTsKLQkJTWVkaWFMaXN0SW1wbCBtZWRpYUxpc3QgPSAoTWVkaWFMaXN0SW1wbCkgcnVsZS5nZXRNZWRpYSgpOwotCQlzZXRNZWRpYUxpc3QobWVkaWFMaXN0LCBiZWdpbkRvY1JlZ2lvbiwgcmVnaW9ucyk7Ci0KLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlydWxlLnNldEF0dHJpYnV0ZShJQ1NTSW1wb3J0UnVsZS5IUkVGLCBiZWdpbkRvY1JlZ2lvbi5nZXRUZXh0KGhyZWZSZWdpb24pKTsKLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oYmVnaW5Eb2NSZWdpb24sIGVuZERvY1JlZ2lvbik7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBydWxlLmdldEF0dHJpYnV0ZU5vZGUoSUNTU0ltcG9ydFJ1bGUuSFJFRik7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oYmVnaW5Eb2NSZWdpb24sIGhyZWZSZWdpb24sIGhyZWZSZWdpb24pOwotCQl9Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRNZWRpYVJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZU5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTTWVkaWFSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NNZWRpYVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsKLQkJcmVnaW9ucy5yZW1vdmUoMCk7IC8vIG11c3QgYmUgIkBtZWRpYSIKLQotCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShyZWdpb25zKTsKLQkJTWVkaWFMaXN0SW1wbCBtZWRpYUxpc3QgPSAoTWVkaWFMaXN0SW1wbCkgcnVsZS5nZXRNZWRpYSgpOwotCQlzZXRNZWRpYUxpc3QobWVkaWFMaXN0LCBmbGF0Tm9kZSwgcmVnaW9ucyk7Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSwgYnJhY2VOb2RlKTsKLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0UGFnZVJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZU5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gZ2V0IHNlbGVjdG9yIHJlZ2lvbnMKLQkJSVRleHRSZWdpb25MaXN0IHNlbGVjdG9yUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsKLQkJc2VsZWN0b3JSZWdpb25zLnJlbW92ZSgwKTsgLy8gbXVzdCBiZSAiQHBhZ2UiCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHNlbGVjdG9yUmVnaW9ucyk7Ci0KLQkJQ1NTUGFnZVJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU1BhZ2VSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlTdHJpbmcgc2VsZWN0b3JTdHIgPSBDU1NVdGlsLmdldFJlZ2lvblRleHQoZmxhdE5vZGUsIHNlbGVjdG9yUmVnaW9ucyk7Ci0JCQlpZiAoMCA8IHNlbGVjdG9yU3RyLmxlbmd0aCgpKSB7Ci0JCQkJcnVsZS5zZXRTZWxlY3RvclRleHQoc2VsZWN0b3JTdHIpOwotCQkJfQotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSwgYnJhY2VOb2RlKTsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IHJ1bGUuZ2V0QXR0cmlidXRlTm9kZShJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmIHNlbGVjdG9yUmVnaW9ucyAhPSBudWxsICYmICFzZWxlY3RvclJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZsYXROb2RlLCBzZWxlY3RvclJlZ2lvbnMuZ2V0KDApLCBzZWxlY3RvclJlZ2lvbnMuZ2V0KHNlbGVjdG9yUmVnaW9ucy5zaXplKCkgLSAxKSk7Ci0JCX0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0U2VtaUNvbG9uRm9yUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGtleVJlZ2lvbiA9IENTU1V0aWwuZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGtleVJlZ2lvbik7Ci0KLQkJQ1NTTm9kZUltcGwgaW5zZXJ0ZWQgPSBudWxsOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydEltcG9ydFJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0Q2hhcnNldFJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0KLQkJcmV0dXJuIGluc2VydGVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0U2VtaUNvbG9uRm9yU3R5bGVEZWNsYXJhdGlvbkl0ZW0oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJLy8gb25seSB0YXJnZXQvbmV0IG5vZGUgaXMgY2hhbmdlZC4gbm90aGluZyB0byBkby4KLQotCQlDU1NOb2RlSW1wbCB0YXJnZXROb2RlID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCWludCBvZmZzZXQgPSB0YXJnZXROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkvLyB3aWRlbiBkb2N1bWVudCByZWdpb24gcmFuZ2UKLQkJCS8vICgoQ1NTU3R5bGVEZWNsSXRlbUltcGwpdGFyZ2V0Tm9kZSkuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24pOwotCQkJQ1NTTW9kZWxVdGlsLmV4cGFuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIHRhcmdldE5vZGUsIHJlZ2lvbik7Ci0JCQkvLyBwc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbmRpY2F0ZXMgQ1NTU3R5bGVEZWNsSXRlbQotCQkJSUNTU05vZGUgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHBhcmVudE5vZGUpOwotCQkJSUNTU05vZGUgbmV4dCA9IG51bGw7Ci0JCQlpZiAocGFyZW50Tm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gdGFyZ2V0Tm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgJiYgb2Zmc2V0IDwgKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCQluZXh0ID0gY2hpbGQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0KLQkJCXJldHVybiB0YXJnZXROb2RlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTdHlsZURlY2xhcmF0aW9uSXRlbShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbikgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBwYXJlbnQgPSBudWxsOwotCQlDU1NOb2RlSW1wbCBub2RlID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZURlY2xDb250YWluZXIpIHsKLQkJCUNTU1J1bGVEZWNsQ29udGFpbmVyIGRlY2xDb250YWluZXIgPSAoQ1NTUnVsZURlY2xDb250YWluZXIpIG5vZGU7Ci0JCQlwYXJlbnQgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIGRlY2xDb250YWluZXIuZ2V0U3R5bGUoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIHsKLQkJCXBhcmVudCA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgbm9kZTsKLQkJfQotCi0JCUNTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciBpdGVtUGFyc2VyID0gbmV3IENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlcihwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaXRlbVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRUZW1wb3JhcnkoZmFsc2UpOwotCQlpdGVtUGFyc2VyLnNldFVwZGF0ZUNvbnRleHQoZlVwZGF0ZUNvbnRleHQpOwotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBkZWNsSXRlbSA9IGl0ZW1QYXJzZXIuc2V0dXBEZWNsYXJhdGlvbkl0ZW0oZG9jUmVnaW9uKTsKLQkJaWYgKGRlY2xJdGVtID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJZGVjbEl0ZW0uc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jUmVnaW9uLCBkb2NSZWdpb24pOwotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBkZWNsSXRlbSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoZGVjbEl0ZW0sIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKGRlY2xJdGVtKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShkZWNsSXRlbSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBkZWNsSXRlbTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFN0eWxlUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlTm9kZSkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBnZXQgc2VsZWN0b3IgcmVnaW9ucwotCQlJVGV4dFJlZ2lvbkxpc3Qgc2VsZWN0b3JSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShzZWxlY3RvclJlZ2lvbnMpOwotCi0JCUNTU1N0eWxlUnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTU3R5bGVSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlTdHJpbmcgc2VsZWN0b3JTdHIgPSBDU1NVdGlsLmdldFJlZ2lvblRleHQoZmxhdE5vZGUsIHNlbGVjdG9yUmVnaW9ucyk7Ci0JCQlpZiAoc2VsZWN0b3JTdHIgIT0gbnVsbCAmJiAwIDwgc2VsZWN0b3JTdHIubGVuZ3RoKCkpIHsKLQkJCQlydWxlLnNldFNlbGVjdG9yVGV4dChzZWxlY3RvclN0cik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBicmFjZU5vZGUpOwotCQlDU1NBdHRySW1wbCBhdHRyID0gcnVsZS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NQYWdlUnVsZS5TRUxFQ1RPUik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgc2VsZWN0b3JSZWdpb25zICE9IG51bGwgJiYgIXNlbGVjdG9yUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZmxhdE5vZGUsIHNlbGVjdG9yUmVnaW9ucy5nZXQoMCksIHNlbGVjdG9yUmVnaW9ucy5nZXQoc2VsZWN0b3JSZWdpb25zLnNpemUoKSAtIDEpKTsKLQkJfQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByZXRlbmRSZW1vdmVOb2RlKCkgewotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZVcGRhdGVDb250ZXh0LmdldERlbGV0aW9uVGFyZ2V0KCk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3ROb2RlICE9IG51bGwpIHsKLQkJCWZEZWxldGlvbkNvbnRleHQuZXhwYW5kUmVtb3ZlZFJhbmdlQmVnaW4oZmlyc3ROb2RlKTsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQlmRGVsZXRpb25Db250ZXh0LmV4cGFuZFJlbW92ZWRSYW5nZUVuZChsYXN0Tm9kZSk7Ci0JCX0KLQotCQlzaHJpbmtDb250YWluZXIoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZlVwZGF0ZUNvbnRleHQuZ2V0RGVsZXRpb25UYXJnZXRQYXJlbnQoKSwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICoJY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBjaGlsZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQoQ1NTTm9kZUltcGwgcGFyZW50LCBDU1NOb2RlSW1wbCBjaGlsZCkgewotCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgfHwgIShwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50Q29udGFpbmVyID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50OwotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY2hpbGRDb250YWluZXIgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBjaGlsZENvbnRhaW5lci5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gY2hpbGRDb250YWluZXIuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3ROb2RlID09IG51bGwgfHwgbGFzdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBwYXJlbnRDb250YWluZXIuaW5jbHVkZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZpcnN0Tm9kZSwgbGFzdE5vZGUpOwotCQlpZiAoYk1vZGlmaWVkKSB7Ci0JCQlwYXJlbnRDb250YWluZXIucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQlkbyB7Ci0JCQkJZmxhdE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFByZXZOb2RlKGZsYXROb2RlKTsKLQkJCQl0eXBlID0gKGZsYXROb2RlICE9IG51bGwpID8gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKSA6IG51bGw7Ci0JCQl9Ci0JCQl3aGlsZSAodHlwZSAhPSBudWxsICYmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gaWYgKGZEZWxldGlvbkNvbnRleHQuaXNJblJlbW92ZWRSYW5nZShmbGF0Tm9kZSkpIHsgLy8gYWxyZWFkeQotCQkvLyByZW1vdmVkCi0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBub2RlID0gZkRlbGV0aW9uQ29udGV4dC5maW5kRGVsZXRpb25UYXJnZXQoKENTU05vZGVJbXBsKWZEb2N1bWVudCwgZmxhdE5vZGUpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUgPT0gZkRvY3VtZW50KSB7Ci0JCQlyZXR1cm47IC8vIG5vdCBhdHRhY2hlZCB3aXRoIGFueSB0cmVlTm9kZQotCQl9Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgewotCQkJSUNTU05vZGUgcnVsZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBDU1NTdHlsZVJ1bGVJbXBsKSB7Ci0JCQkJbm9kZSA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHJ1bGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBJQ1NTTm9kZSBwID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCS8vIGlmIChwID09IG51bGwgfHwgISAocCBpbnN0YW5jZW9mCi0JCS8vIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0JCS8vIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQgPQotCQkvLyAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKXA7Ci0KLQkJaWYgKGZEZWxldGlvbkNvbnRleHQuYWRkTm9kZVRvQmVSZW1vdmVkKG5vZGUpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmaXJzdE5vZGUgIT0gbnVsbCkgewotCQkJCWZEZWxldGlvbkNvbnRleHQuZXhwYW5kUmVtb3ZlZFJhbmdlQmVnaW4oZmlyc3ROb2RlKTsKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJZkRlbGV0aW9uQ29udGV4dC5leHBhbmRSZW1vdmVkUmFuZ2VFbmQobGFzdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gc2hyaW5rQ29udGFpbmVyKG5vZGUpOwotCQkvLyBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzKSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IGZsYXROb2Rlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJfQotCi0JCUl0ZXJhdG9yIGkgPSBmRGVsZXRpb25Db250ZXh0LmdldE5vZGVzVG9CZVJlbW92ZWQoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NOb2RlSW1wbCBub2RlID0gKENTU05vZGVJbXBsKSBpLm5leHQoKTsKLQkJCWlmICghKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSAoQ1NTTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc2hyaW5rQ29udGFpbmVyKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCwgKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSk7Ci0JCQlwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpIHsKLQkJaWYgKGZEb2N1bWVudCA9PSBudWxsIHx8IGZDcmVhdGlvbkNvbnRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCAmJiAwIDwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSkgewotCQkJc2V0dXBEZWxldGlvbkNvbnRleHQobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCQlzaG9ydCB1cGRhdGVNb2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0VXBkYXRlTW9kZSgpOwotCQkJaWYgKHVwZGF0ZU1vZGUgPT0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JRExFKSB7Ci0JCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXByZXRlbmRSZW1vdmVOb2RlKCk7Ci0JCQl9Ci0JCQluZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdChmRGVsZXRpb25Db250ZXh0LmdldFJlbW92ZWRSYW5nZUJlZ2luKCksIGZEZWxldGlvbkNvbnRleHQuZ2V0UmVtb3ZlZFJhbmdlRW5kKCkpOwotCQkJY2xlYW51cERlbGV0aW9uQ29udGV4dCgpOwotCQl9Ci0KLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCAmJiAwIDwgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSkgewotCQkJc2V0dXBDcmVhdGlvbkNvbnRleHQobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKTsKLQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCX0KLQotCQkvLyBtYWtlIGRvY3VtZW50IGhvbGQgd2hvbGUgc3RydWN0dXJlZERvY3VtZW50Ci0JCS8qCi0JCSAqIGJvb2xlYW4gYlVwZGF0ZSA9IGZhbHNlOyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQkgKiBmbGF0Tm9kZSA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOyBiVXBkYXRlID0KLQkJICogYlVwZGF0ZSB8fCAoZmxhdE5vZGUgPT0gbnVsbCB8fAotCQkgKiBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmlzT2xkTm9kZShmbGF0Tm9kZSkgfHwKLQkJICogZmxhdE5vZGUuZ2V0UHJldmlvdXMoKSAhPSBudWxsKTsgZmxhdE5vZGUgPQotCQkgKiBmRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOyBiVXBkYXRlID0gYlVwZGF0ZSB8fAotCQkgKiAoZmxhdE5vZGUgPT0gbnVsbCB8fCBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmlzT2xkTm9kZShmbGF0Tm9kZSkgfHwKLQkJICogZmxhdE5vZGUuZ2V0TmV4dCgpICE9IG51bGwpOwotCQkgKi8KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcilmRG9jdW1lbnQpLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJLyogfSAqLwotCi0JCS8vIHJlbW92ZSBpbiBvZmZpY2lhbCByZWxlYXNlCi0JCS8vIENTU01vZGVsVXRpbC5kaWFnbm9zZVRyZWUoZkRvY3VtZW50LAotCQkvLyBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlcGxhY2VSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChuZXdSZWdpb25zID09IG51bGwgfHwgb2xkUmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZEb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldENyZWF0aW9uVGFyZ2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCB8fCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA8PSAwKSB7Ci0JCQkvLyB0b3Agb2YgZG9jdW1lbnQKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShmRG9jdW1lbnQpOwotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShmRG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJQ1NTTm9kZUltcGwgY3Vyc29yTm9kZSA9IGdldE5vZGVBdChjdXJzb3JQb3MpOwotCQlpZiAoY3Vyc29yTm9kZSA9PSBudWxsKSB7IC8vIGVuZCBvZiBkb2N1bWVudAotCQkJY3Vyc29yTm9kZSA9IChDU1NOb2RlSW1wbClmRG9jdW1lbnQ7Ci0JCX0KLQotCQkvLyBmaW5kIGVkZ2Ugb2YgdHJlZSBub2RlCi0JCUNTU05vZGVJbXBsIG5vZGUgPSBudWxsOwotCQkvLyBib29sZWFuIGJPdmVyU2VtaUNvbG9uID0gZmFsc2U7Ci0JCWJvb2xlYW4gYk92ZXJPcGVuQnJhY2UgPSBmYWxzZTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJZm9yIChmbGF0Tm9kZSA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsgZmxhdE5vZGUgIT0gbnVsbDsgZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXRQcmV2aW91cygpKSB7Ci0JCQlub2RlID0gZ2V0Tm9kZUF0KGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSAoQ1NTTm9kZUltcGwpZkRvY3VtZW50OwotCQkJfQotCQkJaWYgKG5vZGUgIT0gY3Vyc29yTm9kZSB8fCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgPT0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGZsYXROb2RlICE9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJCQkvLyBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8Ci0JCQkJLy8gdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJLy8gYk92ZXJTZW1pQ29sb24gPSB0cnVlOwotCQkJCS8vIH0gZWxzZQotCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQkJYk92ZXJPcGVuQnJhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNTU05vZGVJbXBsIHRhcmdldE5vZGUgPSBudWxsOwotCi0JCS8vIGlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCS8vIHY8LS18Ci0JCS8vIEFBQUFBQQotCQkvLyBCQkJCQkJCQkJCIGN1cnNvck5vZGU6QSAsIG5vZGU6QiAtPiB0YXJnZXQgaXMgQQotCQkvLyB0YXJnZXROb2RlID0gKG5vZGUgPT0gbnVsbCkgPyBmRG9jdW1lbnQgOiBub2RlOwotCQkvLyB9IGVsc2UKLQkJaWYgKGN1cnNvck5vZGUgPT0gbm9kZSkgewotCQkJLy8gdjwtLXwKLQkJCS8vIEFBQUFBQQotCQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkEgLCBub2RlOkIgLT4gdGFyZ2V0IGlzIEEKLQkJCWlmIChiT3Zlck9wZW5CcmFjZSAmJiBjdXJzb3JOb2RlIGluc3RhbmNlb2YgQ1NTUnVsZURlY2xDb250YWluZXIpIHsKLQkJCQl0YXJnZXROb2RlID0gKENTU05vZGVJbXBsKSAoKENTU1J1bGVEZWNsQ29udGFpbmVyKSBjdXJzb3JOb2RlKS5nZXRTdHlsZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGFyZ2V0Tm9kZSA9IGN1cnNvck5vZGU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB2PC0tfAotCQkJLy8gQUFBCi0JCQkvLyBCQkJCQkJCQkJCIGN1cnNvck5vZGU6QiAsIG5vZGU6QSAtPiBkZXBlbmQgb24gQSdzIG5vZGUgdHlwZQotCQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgPT0gSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgfHwgbm9kZVR5cGUgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQkJLy8gdGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkoKGJPdmVyU2VtaUNvbG9uKSA/Ci0JCQkJLy8gbm9kZS5nZXRQYXJlbnROb2RlKCkgOiBub2RlKTsgLy8gTlAKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkJdGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0YXJnZXROb2RlID0gbm9kZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQl0YXJnZXROb2RlID0gKENTU05vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRhcmdldE5vZGUgPSBub2RlOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHRhcmdldE5vZGUpOwotCQlJQ1NTTm9kZSBuZXh0ID0gbnVsbDsKLQkJaWYgKHRhcmdldE5vZGUuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gdGFyZ2V0Tm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciAmJiBjdXJzb3JQb3MgPCAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJbmV4dCA9IGNoaWxkOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldFJlcGFyc2VSYW5nZSgpIHsKLQkJZkNyZWF0aW9uQ29udGV4dC5jbGVhcigpOwotCX0KLQotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50RXZlbnQoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgPT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIoKTsKLQkJfQotCQlmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmluaXRpYWxpemUoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIHJlZ2lvbnM6IHN1cnJvdW5kaW5nIHNwYWNlcyBzaG91bGQgYmUgcmVtb3ZlZC4gUS4gV2h5IGRpZCB5b3Ugc2V0Ci0JICogbWVkaWFUYWJsZSA/IEEuIE1lZGlhTGlzdCBtYXkgaGF2ZSB0d28gb3IgbW9yZSBtZWRpdW0gdGhhdCBoYXZlIHNhbWUKLQkgKiB2YWx1ZSwgdGhlbiBzZWFyY2luZyBpbiBNZWRpYUxpc3QgaXMgbm90IHBlcmZlY3QuIFEuCi0JICogZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSBpcyBub3QgY2FyZS4gQXJlIHlvdSBPSz8gQS4gT0suCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1lZGlhTGlzdChNZWRpYUxpc3RJbXBsIG1lZGlhTGlzdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucykgewotCQlpZiAobWVkaWFMaXN0ID09IG51bGwgfHwgdGV4dFJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNvbGxlY3Rpb24gbWVkaWFUYWJsZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCUNTU05vZGVMaXN0SW1wbCBhdHRycyA9IG1lZGlhTGlzdC5nZXRNZWRpYSgpOwotCQlmb3IgKGludCBpID0gMDsgaSAhPSBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQltZWRpYVRhYmxlLmFkZChhdHRycy5pdGVtKGkpKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHN0YXJ0ID0gbnVsbDsKLQkJSVRleHRSZWdpb24gZW5kID0gbnVsbDsKLQotCQlJdGVyYXRvciBpID0gdGV4dFJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgKChpLmhhc05leHQoKSkgPyBpLm5leHQoKSA6IG51bGwpOwotCQl3aGlsZSAodGV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElVTSkgewotCQkJCVN0cmluZyBtZWRpdW1TdHIgPSByZWdpb24uZ2V0VGV4dCh0ZXh0UmVnaW9uKTsKLQkJCQlpZiAoMCA8IG1lZGl1bVN0ci5sZW5ndGgoKSkgewotCQkJCQlDU1NBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJCQkJLy8gaXMgdGhlIG1lZGl1bSBhbHJlYWR5IHNldCA/Ci0JCQkJCUl0ZXJhdG9yIGlUYWJsZSA9IG1lZGlhVGFibGUuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGlUYWJsZS5oYXNOZXh0KCkpIHsKLQkJCQkJCUNTU0F0dHJJbXBsIGNhaSA9IChDU1NBdHRySW1wbCkgaVRhYmxlLm5leHQoKTsKLQkJCQkJCWlmIChtZWRpdW1TdHIuZXF1YWxzSWdub3JlQ2FzZShjYWkuZ2V0VmFsdWUoKSkpIHsKLQkJCQkJCQlhdHRyID0gY2FpOwotCQkJCQkJCW1lZGlhVGFibGUucmVtb3ZlKGNhaSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJCQkJLy8gaXMgbm90IHNldC4gY3JlYXRlIG5ldyBhdHRyaWJ1dGUKLQkJCQkJCVN0cmluZyBrZXkgPSAibWVkaXVtUCIgKyBtZWRpYUxpc3QubWVkaXVtQ291bnRlcisrOyAvLyROT04tTkxTLTEkCi0JCQkJCQltZWRpYUxpc3Quc2V0QXR0cmlidXRlKGtleSwgbWVkaXVtU3RyKTsKLQkJCQkJCWF0dHIgPSBtZWRpYUxpc3QuZ2V0QXR0cmlidXRlTm9kZShrZXkpOwotCQkJCQl9Ci0JCQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24ocmVnaW9uLCB0ZXh0UmVnaW9uLCB0ZXh0UmVnaW9uKTsKLQkJCQkJaWYgKHN0YXJ0ID09IG51bGwpIHsKLQkJCQkJCXN0YXJ0ID0gdGV4dFJlZ2lvbjsKLQkJCQkJfQotCQkJCQllbmQgPSB0ZXh0UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCXRleHRSZWdpb24gPSAoSVRleHRSZWdpb24pICgoaS5oYXNOZXh0KCkpID8gaS5uZXh0KCkgOiBudWxsKTsKLQkJfQotCi0JCWlmIChzdGFydCAhPSBudWxsICYmIGVuZCAhPSBudWxsKSB7Ci0JCQltZWRpYUxpc3Quc2V0UmFuZ2VSZWdpb24ocmVnaW9uLCBzdGFydCwgZW5kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cENyZWF0aW9uQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlyZXNldFJlcGFyc2VSYW5nZSgpOwotCQlyZXNldENyZWF0aW9uVGFyZ2V0KHJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwRGVsZXRpb25Db250ZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpIHsKLQkJZkRlbGV0aW9uQ29udGV4dC5zZXR1cENvbnRleHQobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXR1cFVwZGF0ZUNvbnRleHQoc2hvcnQgdXBkYXRlTW9kZSwgSUNTU05vZGUgcGFyZW50Tm9kZSwgSUNTU05vZGUgdGFyZ2V0Tm9kZSkgewotCQlmVXBkYXRlQ29udGV4dC5zZXR1cENvbnRleHQodXBkYXRlTW9kZSwgcGFyZW50Tm9kZSwgdGFyZ2V0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzaHJpbmtDb250YWluZXIoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCQliTW9kaWZpZWQgPSBiTW9kaWZpZWQgfHwgY2xlYW51cExhc3ROb2RlKGNoaWxkLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcGFyZW50KTsKLQkJYk1vZGlmaWVkID0gYk1vZGlmaWVkIHx8IGNsZWFudXBGaXJzdE5vZGUoY2hpbGQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcGFyZW50KTsKLQotCQlpZiAoYk1vZGlmaWVkKSB7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKGNoaWxkICE9IG5vZGUgJiYgbm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLnByb3BhZ2F0ZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQljaGlsZC5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmNGU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IHsKLQotCi0JY2xhc3MgQ1NTTm9kZVVwZGF0ZVRyYXZlcnNlciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQkJcHVibGljIENTU05vZGVVcGRhdGVUcmF2ZXJzZXIoKSB7Ci0JCQlzdXBlcigpOwotCQkJc2V0VHJhdmVyc2VJbXBvcnRlZChmYWxzZSk7Ci0JCQlzZXRUcmF2ZXJzZUltcG9ydEZpcnN0KGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyBMaW5rZWRMaXN0IGdldE5vZGVMaXN0KCkgewotCQkJcmV0dXJuIGZUcmF2Tm9kZUxpc3Q7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCQlmVHJhdk5vZGVMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgfHwgbm9kZSBpbnN0YW5jZW9mIENTU0F0dHJJbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKSB7Ci0JCQkJLy8gc2tpcAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlRyYXZOb2RlTGlzdC5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZUNvbnRhaW5lcikgewotCQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJCX0KLQkJfQotCi0JCUxpbmtlZExpc3QgZlRyYXZOb2RlTGlzdCA9IG51bGw7Ci0JfQotCi0JSUNTU05vZGUgZkxhc3ROb2RlID0gbnVsbDsKLQlJQ1NTTm9kZSBmRGVsZXRpb25UYXJnZXRQYXJlbnQgPSBudWxsOwotCUlDU1NOb2RlIGZEZWxldGlvblRhcmdldCA9IG51bGw7Ci0JTGlua2VkTGlzdCBmTm9kZUxpc3QgPSBudWxsOwotCXByaXZhdGUgc2hvcnQgZlVwZGF0ZU1vZGUgPSBVUERBVEVfSURMRTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0lETEUgPSAwOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfSU5TRVJUX0ZOQ09OVEFJTkVSID0gMTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSID0gMjsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUiA9IDM7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9SRU1PVkVfUkNPTlRBSU5FUiA9IDQ7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9DSEFOR0VfUkNPTlRBSU5FUiA9IDU7Ci0KLQkvKioKLQkgKiBDU1NOb2RlVXBkYXRlUXVldWUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbFVwZGF0ZUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjbGVhbnVwQ29udGV4dCgpIHsKLQkJZk5vZGVMaXN0ID0gbnVsbDsKLQkJZkRlbGV0aW9uVGFyZ2V0ID0gbnVsbDsKLQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gbnVsbDsKLQkJZlVwZGF0ZU1vZGUgPSBVUERBVEVfSURMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDb3VudGVySW1wbCBnZXRDb3VudGVyKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENvdW50ZXJJbXBsKSB7Ci0JCQlyZXR1cm4gKENvdW50ZXJJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ291bnRlckltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0NoYXJzZXRSdWxlSW1wbCBnZXRDU1NDaGFyc2V0UnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NDaGFyc2V0UnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTQ2hhcnNldFJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTQ2hhcnNldFJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NGb250RmFjZVJ1bGVJbXBsIGdldENTU0ZvbnRGYWNlUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU0ZvbnRGYWNlUnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NGb250RmFjZVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NJbXBvcnRSdWxlSW1wbCBnZXRDU1NJbXBvcnRSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0ltcG9ydFJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU0ltcG9ydFJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTSW1wb3J0UnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU01lZGlhUnVsZUltcGwgZ2V0Q1NTTWVkaWFSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTTWVkaWFSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU01lZGlhUnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCBnZXRDU1NQYWdlUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQYWdlUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTUGFnZVJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTUGFnZVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoc2hvcnQgdHlwZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSAoKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgbm9kZSkuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IHR5cGUgfHwgKChub2RlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIHx8IG5vZGVUeXBlID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUikgJiYgKHR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiB8fCB0eXBlID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUikpKSB7Ci0JCQkJcmV0dXJuIChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgbm9kZTsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBbIiArIHR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiXSBpcyBleHBlY3RlZCwgYnV0IHR5cGUgaXMgWyIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgKyAiXTogXCIiICsgdmFsdWUuZ2VuZXJhdGVTb3VyY2UoKSArICJcIiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQcmltaXRpdmVWYWx1ZUltcGwoIiArIHR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiKSBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJfQotCi0JCXVuZ2V0Tm9kZSgpOwotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGdldENTU1ByaW1pdGl2ZVZhbHVlQW55KCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJcmV0dXJuIChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQcmltaXRpdmVWYWx1ZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGdldENTU1N0eWxlRGVjbEl0ZW0oU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsICYmICgoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIG5vZGUpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIChDU1NTdHlsZURlY2xJdGVtSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1N0eWxlRGVjbEl0ZW1JbXBsKCIgKyBwcm9wZXJ0eU5hbWUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkiKSBpcyBleHBlY3RlZCwgYnV0ICIgKyBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsvLyROT04tTkxTLTEkCi0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlUnVsZUltcGwgZ2V0Q1NTU3R5bGVSdWxlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlUnVsZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTU3R5bGVSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1N0eWxlUnVsZUltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlJQ1NTTm9kZSBnZXREZWxldGlvblRhcmdldCgpIHsKLQkJcmV0dXJuIGZEZWxldGlvblRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0RGVsZXRpb25UYXJnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBmRGVsZXRpb25UYXJnZXRQYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBJQ1NTTm9kZSBnZXROb2RlKCkgewotCQlJQ1NTTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGZOb2RlTGlzdCAhPSBudWxsICYmIDAgPCBmTm9kZUxpc3Quc2l6ZSgpKSB7Ci0JCQlub2RlID0gKElDU1NOb2RlKSBmTm9kZUxpc3QucmVtb3ZlRmlyc3QoKTsKLQkJfQotCQlmTGFzdE5vZGUgPSBub2RlOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0Tm9kZUNvdW50KCkgewotCQlpZiAoZk5vZGVMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiBmTm9kZUxpc3Quc2l6ZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gSUNTU05vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkvLyByZXR1cm4gZlBhcmVudE5vZGU7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCVJlY3RJbXBsIGdldFJlY3QoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgUmVjdEltcGwpIHsKLQkJCXJldHVybiAoUmVjdEltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJSZWN0SW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JUkdCQ29sb3JJbXBsIGdldFJHQkNvbG9yKCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJHQkNvbG9ySW1wbCkgewotCQkJcmV0dXJuIChSR0JDb2xvckltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJSR0JDb2xvckltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRVcGRhdGVNb2RlKCkgewotCQlyZXR1cm4gZlVwZGF0ZU1vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIChmTm9kZUxpc3QgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXR1cENvbnRleHQoc2hvcnQgdXBkYXRlTW9kZSwgSUNTU05vZGUgcGFyZW50Tm9kZSwgSUNTU05vZGUgdGFyZ2V0Tm9kZSkgewotCQlmVXBkYXRlTW9kZSA9IHVwZGF0ZU1vZGU7Ci0KLQkJSUNTU05vZGUgdHJhdmVyc2VSb290OwotCQlpZiAodXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfQ0hBTkdFX1JDT05UQUlORVIpIHsKLQkJCXRyYXZlcnNlUm9vdCA9IHBhcmVudE5vZGU7Ci0JCQl3aGlsZSAodHJhdmVyc2VSb290IGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJdHJhdmVyc2VSb290ID0gdHJhdmVyc2VSb290LmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRyYXZlcnNlUm9vdCA9IHRhcmdldE5vZGU7Ci0JCX0KLQotCQlpZiAodXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgfHwgLy8gcmVnaW9uCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpbnNlcnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vID0+Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmbGF0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub2RlCi0JCQkJCXVwZGF0ZU1vZGUgPT0gVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUikgewotCQkJZkRlbGV0aW9uVGFyZ2V0ID0gdHJhdmVyc2VSb290OwotCQkJaWYgKGZEZWxldGlvblRhcmdldCA9PSB0YXJnZXROb2RlKSB7Ci0JCQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gcGFyZW50Tm9kZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZEZWxldGlvblRhcmdldFBhcmVudCA9IGZEZWxldGlvblRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmRGVsZXRpb25UYXJnZXQgPSBudWxsOwotCQkJZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gbnVsbDsKLQkJfQotCi0JCWlmICh1cGRhdGVNb2RlID09IFVQREFURV9JTlNFUlRfUkNPTlRBSU5FUiB8fCB1cGRhdGVNb2RlID09IFVQREFURV9JTlNFUlRfRk5DT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgfHwgLy8gcmVnaW9uCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlbW92ZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyA9PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByZS1pbnNlcnQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmxhdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBub2RlCi0JCQkJCXVwZGF0ZU1vZGUgPT0gVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSKSB7Ci0JCQlDU1NOb2RlVXBkYXRlVHJhdmVyc2VyIHRyYXZlcnNlciA9IG5ldyBDU1NOb2RlVXBkYXRlVHJhdmVyc2VyKCk7Ci0JCQl0cmF2ZXJzZXIuYXBwbHkodHJhdmVyc2VSb290KTsKLQkJCWZOb2RlTGlzdCA9IHRyYXZlcnNlci5nZXROb2RlTGlzdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZk5vZGVMaXN0ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmdldE5vZGUoKSB7Ci0JCWlmIChmTm9kZUxpc3QgIT0gbnVsbCAmJiBmTGFzdE5vZGUgIT0gbnVsbCkgewotCQkJZk5vZGVMaXN0LmFkZEZpcnN0KGZMYXN0Tm9kZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyYmNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5BdHRyQ2hhbmdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsVXBkYXRlciB7Ci0KLQlwcml2YXRlIENTU01vZGVsSW1wbCBmTW9kZWwgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxQYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbFVwZGF0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbFVwZGF0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTW9kZWxVcGRhdGVyKENTU01vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQlmTW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgdm9pZCBhdHRySW5zZXJ0ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTQXR0ckltcGwgYXR0cikgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihwYXJlbnROb2RlKTsKLQotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNhbm5vdCBnZXQgZm9ybWF0IGFkYXB0ZXIgOiAiICsgcGFyZW50Tm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSOwotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBhdHRyKTsKLQotCQkvLyBnZXQgZm9ybWF0dGVkIGluZm8KLQkJQXR0ckNoYW5nZUNvbnRleHQgcmVnaW9uID0gbmV3IEF0dHJDaGFuZ2VDb250ZXh0KCk7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZyhmb3JtYXR0ZXIuZm9ybWF0QXR0ckNoYW5nZWQocGFyZW50Tm9kZSwgYXR0ciwgdHJ1ZSwgcmVnaW9uKSk7Ci0KLQkJLy8gc2V0IHRleHQKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gaW5zZXJ0VGV4dChyZWdpb24uc3RhcnQsIHJlZ2lvbi5lbmQgLSByZWdpb24uc3RhcnQsIHRleHQpOwotCi0JCWludCBuUmVtYWlucyA9IGZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQotCQlpZiAoMCA8IG5SZW1haW5zICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXR0clJlbW92ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTQXR0ckltcGwgYXR0cikgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihwYXJlbnROb2RlKTsKLQotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNhbm5vdCBnZXQgZm9ybWF0IGFkYXB0ZXIgOiAiICsgcGFyZW50Tm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSOwotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBhdHRyKTsKLQotCQkvLyBnZXQgZm9ybWF0dGVkIGluZm8KLQkJQXR0ckNoYW5nZUNvbnRleHQgcmVnaW9uID0gbmV3IEF0dHJDaGFuZ2VDb250ZXh0KCk7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZyhmb3JtYXR0ZXIuZm9ybWF0QXR0ckNoYW5nZWQocGFyZW50Tm9kZSwgYXR0ciwgZmFsc2UsIHJlZ2lvbikpOwotCi0JCS8vIHNldCB0ZXh0Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IGluc2VydFRleHQocmVnaW9uLnN0YXJ0LCByZWdpb24uZW5kIC0gcmVnaW9uLnN0YXJ0LCB0ZXh0KTsKLQotCQlpbnQgblJlbWFpbnMgPSBmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0KLQkJaWYgKDAgPCBuUmVtYWlucyAmJiAhKHJlc3VsdCBpbnN0YW5jZW9mIE5vQ2hhbmdlRXZlbnQpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYXR0clJlcGxhY2VkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5ld0F0dHIsIENTU05vZGVJbXBsIG9sZEF0dHIpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9sZEF0dHIgIT0gbnVsbCkgewotCQkJYXR0clJlbW92ZWQocGFyZW50Tm9kZSwgKENTU0F0dHJJbXBsKSBvbGRBdHRyKTsKLQkJfQotCi0JCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCWF0dHJJbnNlcnRlZChwYXJlbnROb2RlLCAoQ1NTQXR0ckltcGwpIG5ld0F0dHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoaWxkSW5zZXJ0ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlzaG9ydCB1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JRExFOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQl1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JTlNFUlRfRk5DT05UQUlORVI7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSU5TRVJUX1JDT05UQUlORVI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJXaGF0J3MgdGhpcyBub2RlPyA6ICIgKyBub2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZlBhcnNlci5zZXR1cFVwZGF0ZUNvbnRleHQodXBkYXRlTW9kZSwgcGFyZW50Tm9kZSwgbm9kZSk7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gZGVmYXVsdEluc2VydGVkKHBhcmVudE5vZGUsIG5vZGUpOwotCi0JCWludCBuUmVtYWlucyA9IGZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQotCQlpZiAoMCA8IG5SZW1haW5zICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoaWxkUmVtb3ZlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lETEU7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCXVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQl1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9SRU1PVkVfUkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIldoYXQncyB0aGlzIG5vZGU/IDogIiArIG5vZGUuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBub2RlKTsKLQotCQlDU1NOb2RlSW1wbCBwcmV2ID0gZ2V0T2xkUHJldmlvdXMocGFyZW50Tm9kZSwgbm9kZSk7Ci0JCUNTU05vZGVJbXBsIG5leHQgPSBnZXRPbGROZXh0KHBhcmVudE5vZGUsIG5vZGUpOwotCQlpbnQgaW5zZXJ0UG9zID0gLTEsIGVuZFBvcyA9IC0xOwotCQlTdHJpbmcgc291cmNlID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQlpbnNlcnRQb3MgPSBwcmV2LmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0UG9zID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW5zZXJ0UG9zIC09IG5lYXJlc3RTcGFjZUxlbmd0aEJlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRQb3MpOwotCQl9Ci0JCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCWVuZFBvcyA9IG5leHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWVuZFBvcyA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQllbmRQb3MgKz0gbmVhcmVzdFNwYWNlTGVuZ3RoQWZ0ZXIocGFyZW50Tm9kZSwgZW5kUG9zKTsKLQkJfQotCQlzb3VyY2UgPSBnZXRTcGFjZUJlZm9yZShwYXJlbnROb2RlLCBuZXh0LCBub2RlKTsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0OwotCQlpZiAoc291cmNlLmxlbmd0aCgpID4gMCkgewotCQkJcmVzdWx0ID0gaW5zZXJ0VGV4dChpbnNlcnRQb3MsIGVuZFBvcyAtIGluc2VydFBvcywgc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IHJlbW92ZVRleHQoaW5zZXJ0UG9zLCBlbmRQb3MgLSBpbnNlcnRQb3MpOwotCQl9Ci0KLQkJaW50IG5SZW1haW5zID0gZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCWlmICgwIDwgblJlbWFpbnMgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAkJCi0JCX0KLQotCQkvKgotCQkgKiBpbnQgcmVtb3ZlU3RhcnQgPSAtMTsgaW50IHJlbW92ZUVuZCA9IC0xOyBpZiAobm9kZSBpbnN0YW5jZW9mCi0JCSAqIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkgKiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0KLQkJICogKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcilub2RlOwotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9Ci0JCSAqIGNvbnRhaW5lci5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0KLQkJICogY29udGFpbmVyLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsgaWYgKGZpcnN0Tm9kZSAhPSBudWxsICYmCi0JCSAqIGxhc3ROb2RlICE9IG51bGwpIHsgcmVtb3ZlU3RhcnQgPSBmaXJzdE5vZGUuZ2V0U3RhcnQoKTsgcmVtb3ZlRW5kID0KLQkJICogbGFzdE5vZGUuZ2V0RW5kKCk7IH0gfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCSAqIENTU1JlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoQ1NTUmVnaW9uQ29udGFpbmVyKW5vZGU7Ci0JCSAqIElUZXh0UmVnaW9uIGZpcnN0UmVnaW9uID0gY29udGFpbmVyLmdldEZpcnN0UmVnaW9uKCk7IElUZXh0UmVnaW9uCi0JCSAqIGxhc3RSZWdpb24gPSBjb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpOyBpZiAoZmlyc3RSZWdpb24gIT0gbnVsbCAmJgotCQkgKiBsYXN0UmVnaW9uICE9IG51bGwpIHsgcmVtb3ZlU3RhcnQgPSBmaXJzdFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkgKiByZW1vdmVFbmQgPSBsYXN0UmVnaW9uLmdldEVuZE9mZnNldCgpOyB9IH0gaWYgKDAgPD0gcmVtb3ZlU3RhcnQgJiYKLQkJICogMCA8PSByZW1vdmVFbmQpIHsgcmVtb3ZlVGV4dChyZW1vdmVTdGFydCwgcmVtb3ZlRW5kIC0gcmVtb3ZlU3RhcnQgKwotCQkgKiAxKTsgfQotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNoaWxkUmVwbGFjZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvbGRDaGlsZCAhPSBudWxsKSB7Ci0JCQljaGlsZFJlbW92ZWQocGFyZW50Tm9kZSwgb2xkQ2hpbGQpOwotCQl9Ci0KLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkSW5zZXJ0ZWQocGFyZW50Tm9kZSwgbmV3Q2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBkZWZhdWx0SW5zZXJ0ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlpbnQgaW5zZXJ0UG9zID0gLTE7Ci0JCUlDU1NOb2RlIHNpYmxpbmc7Ci0JCVN0cmluZyBwcmVTcGFjZSA9ICIiLCBwb3N0U3BhY2UgPSAiIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAoaW5zZXJ0UG9zIDwgMCkgewotCQkJaWYgKChzaWJsaW5nID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSkgIT0gbnVsbCkgewotCQkJCS8vIGFmdGVyIHByZXZpb3VzIGNoaWxkCi0JCQkJaW5zZXJ0UG9zID0gZ2V0VGV4dEVuZChzaWJsaW5nKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnNlcnRQb3MgPCAwKSB7Ci0JCQlpZiAoKHNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpICE9IG51bGwpIHsKLQkJCQkvLyBiZWZvcmUgbmV4dCBjaGlsZAotCQkJCWluc2VydFBvcyA9IGdldFRleHRTdGFydChzaWJsaW5nKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnNlcnRQb3MgPCAwKSB7Ci0JCQkvLyBwb3NpdGlvbiBvZiBwYXJlbnQKLQkJCWluc2VydFBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKHBhcmVudE5vZGUpOwotCQl9Ci0KLQkJaWYgKGluc2VydFBvcyA8IDApIHsKLQkJCS8vIGZpcnN0dGltZQotCQkJaW5zZXJ0UG9zID0gMDsKLQkJfQotCi0JCS8vIGZvcm1hdCBwcmV2aW91cyBzcGFjZXMKLQkJbGVuZ3RoID0gbmVhcmVzdFNwYWNlTGVuZ3RoQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydFBvcyk7Ci0JCWluc2VydFBvcyAtPSBsZW5ndGg7Ci0JCXByZVNwYWNlID0gZ2V0U3BhY2VCZWZvcmUocGFyZW50Tm9kZSwgbm9kZSwgbnVsbCk7Ci0JCS8vIGZvcm1hdCBwb3N0IHNwYWNlcwotCQlsZW5ndGggKz0gbmVhcmVzdFNwYWNlTGVuZ3RoQWZ0ZXIocGFyZW50Tm9kZSwgaW5zZXJ0UG9zICsgbGVuZ3RoKTsKLQkJcG9zdFNwYWNlID0gZ2V0U3BhY2VCZWZvcmUocGFyZW50Tm9kZSwgbm9kZS5nZXROZXh0U2libGluZygpLCBudWxsKTsKLQotCQkvLyBzZXQgdGV4dAotCQlTdHJpbmcgdGV4dCA9IHByZVNwYWNlICsgbm9kZS5nZW5lcmF0ZVNvdXJjZSgpLnRyaW0oKSArIHBvc3RTcGFjZTsKLQkJcmV0dXJuIGluc2VydFRleHQoaW5zZXJ0UG9zLCBsZW5ndGgsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgaW50IGdldENoaWxkSW5zZXJ0UG9zKENTU05vZGVJbXBsIG5vZGUpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIobm9kZSk7Ci0JCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBmb3JtYXR0ZXIuZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBub2RlLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGdldE9sZE5leHQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlDU1NOb2RlSW1wbCBjaGlsZCA9IChDU1NOb2RlSW1wbCkgcGFyZW50Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJQ1NTTm9kZUltcGwgcmV0ID0gbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldEVuZE9mZnNldCgpIDwgY2hpbGQuZ2V0RW5kT2Zmc2V0KCkpCi0JCQkJcmV0ID0gY2hpbGQ7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCQljaGlsZCA9IChDU1NOb2RlSW1wbCkgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBnZXRPbGRQcmV2aW91cyhDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCUNTU05vZGVJbXBsIGNoaWxkID0gKENTU05vZGVJbXBsKSBwYXJlbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJQ1NTTm9kZUltcGwgcmV0ID0gbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKQotCQkJCXJldCA9IGNoaWxkOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQkJY2hpbGQgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNwYWNlQmVmb3JlKElDU1NOb2RlIHBhcmVudE5vZGUsIElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIHRvUmVtb3ZlKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBwYXJlbnROb2RlKTsKLQotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBleGNlcHRGb3IgPSBudWxsOwotCQkJaWYgKHRvUmVtb3ZlICE9IG51bGwpIHsKLQkJCQlDU1NOb2RlSW1wbCByZW1vdmUgPSAoQ1NTTm9kZUltcGwpIHRvUmVtb3ZlOwotCQkJCWV4Y2VwdEZvciA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbihyZW1vdmUuZ2V0U3RhcnRPZmZzZXQoKSwgcmVtb3ZlLmdldEVuZE9mZnNldCgpIC0gcmVtb3ZlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRCZWZvcmUocGFyZW50Tm9kZSwgbm9kZSwgZXhjZXB0Rm9yKS50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dEVuZChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBlbmQgPSAtMTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQllbmQgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJZW5kID0gKChDU1NSZWdpb25Db250YWluZXIpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dFN0YXJ0KElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJc3RhcnQgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCQlzdGFydCA9ICgoQ1NTUmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGluc2VydFRleHQoaW50IHN0YXJ0LCBpbnQgb2xkTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodGV4dCAhPSBudWxsICYmIDAgPCBvbGRMZW5ndGggJiYgc3RhcnQgKyBvbGRMZW5ndGggPD0gc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJLy8gbWluaW1pemUgdGV4dCBjaGFuZ2UKLQkJCQlTdHJpbmcgZGVsVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnQsIG9sZExlbmd0aCk7Ci0JCQkJaW50IG5ld0xlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0JCQkJaW50IHNob3J0ZXJMZW4gPSBNYXRoLm1pbihvbGRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JCQkJaW50IHN0TWF0Y2hMZW47Ci0JCQkJZm9yIChzdE1hdGNoTGVuID0gMDsgc3RNYXRjaExlbiA8IHNob3J0ZXJMZW4gJiYgdGV4dC5jaGFyQXQoc3RNYXRjaExlbikgPT0gZGVsVGV4dC5jaGFyQXQoc3RNYXRjaExlbik7IHN0TWF0Y2hMZW4rKykgewotCQkJCQkvLyAKLQkJCQl9Ci0JCQkJaWYgKDAgPCBzdE1hdGNoTGVuICYmIHN0TWF0Y2hMZW4gPCBzaG9ydGVyTGVuICYmIHRleHQuY2hhckF0KHN0TWF0Y2hMZW4gLSAxKSA9PSAweDAwMGQgJiYgKHRleHQuY2hhckF0KHN0TWF0Y2hMZW4pID09IDB4MDAwYSB8fCBkZWxUZXh0LmNoYXJBdChzdE1hdGNoTGVuKSA9PSAweDAwMGEpKSB7Ci0JCQkJCS8vIG11c3Qgbm90IGRpdmlkZSAwZC0+MGEgc2VxdWVuY2UKLQkJCQkJc3RNYXRjaExlbi0tOwotCQkJCX0KLQkJCQlpZiAoc3RNYXRjaExlbiA9PSBzaG9ydGVyTGVuKSB7Ci0JCQkJCWlmIChvbGRMZW5ndGggPCBuZXdMZW5ndGgpIHsgLy8ganVzdCBpbnNlcnQKLQkJCQkJCW9sZExlbmd0aCA9IDA7Ci0JCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKHN0TWF0Y2hMZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG5ld0xlbmd0aCA8IG9sZExlbmd0aCkgeyAvLyBqdXN0IHJlbW92ZQotCQkJCQkJb2xkTGVuZ3RoIC09IHN0TWF0Y2hMZW47Ci0JCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7IC8vIG5vdGhpbmcgdG8gZG8KLQkJCQkJCW9sZExlbmd0aCA9IDA7Ci0JCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW50IGVkTWF0Y2hMZW47Ci0JCQkJCWZvciAoZWRNYXRjaExlbiA9IDA7IHN0TWF0Y2hMZW4gKyBlZE1hdGNoTGVuIDwgc2hvcnRlckxlbiAmJiB0ZXh0LmNoYXJBdChuZXdMZW5ndGggLSBlZE1hdGNoTGVuIC0gMSkgPT0gZGVsVGV4dC5jaGFyQXQob2xkTGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpOyBlZE1hdGNoTGVuKyspIHsKLQkJCQkJCS8vCi0JCQkJCX0KLQkJCQkJaWYgKDAgPCBlZE1hdGNoTGVuICYmIHRleHQuY2hhckF0KG5ld0xlbmd0aCAtIGVkTWF0Y2hMZW4pID09IDB4MDAwYSAmJiAoKGVkTWF0Y2hMZW4gPCBuZXdMZW5ndGggJiYgdGV4dC5jaGFyQXQobmV3TGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpID09IDB4MDAwZCkgfHwgKGVkTWF0Y2hMZW4gPCBvbGRMZW5ndGggJiYgZGVsVGV4dC5jaGFyQXQob2xkTGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpID09IDB4MDAwZCkpKSB7Ci0JCQkJCQkvLyBtdXN0IG5vdCBkaXZpZGUgMGQtPjBhIHNlcXVlbmNlCi0JCQkJCQllZE1hdGNoTGVuLS07Ci0JCQkJCX0KLQkJCQkJb2xkTGVuZ3RoIC09IHN0TWF0Y2hMZW4gKyBlZE1hdGNoTGVuOwotCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQlpZiAoc3RNYXRjaExlbiArIGVkTWF0Y2hMZW4gPCBuZXdMZW5ndGgpIHsKLQkJCQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZyhzdE1hdGNoTGVuLCBuZXdMZW5ndGggLSBlZE1hdGNoTGVuKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXRleHQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKDAgPCBvbGRMZW5ndGggfHwgdGV4dCAhPSBudWxsKSB7Ci0JCQkJLy8gU3RyaW5nIGRlbFRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0LCBvbGRMZW5ndGgpOwotCQkJCXJlc3VsdCA9IHN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChmTW9kZWwsIHN0YXJ0LCBvbGRMZW5ndGgsIHRleHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcml2YXRlIGludCBuZWFyZXN0U3BhY2VMZW5ndGhBZnRlcihDU1NOb2RlSW1wbCBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vZGUpOwotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBmb3JtYXR0ZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKG5vZGUsIGluc2VydFBvcyk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcml2YXRlIGludCBuZWFyZXN0U3BhY2VMZW5ndGhCZWZvcmUoQ1NTTm9kZUltcGwgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub2RlKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUobm9kZSwgaW5zZXJ0UG9zKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlbW92ZVRleHQoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChmTW9kZWwsIHN0YXJ0LCBsZW5ndGgsIG5ldyBTdHJpbmcoIiIpKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFBhcnNlcihDU1NNb2RlbFBhcnNlciBwYXJzZXIpIHsKLQkJZlBhcnNlciA9IHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHZhbHVlQ2hhbmdlZChDU1NOb2RlSW1wbCBub2RlLCBTdHJpbmcgb2xkVmFsdWUpIHsKLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIlRvbyBCYWQuLiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkoKG5vZGUgPT0gbnVsbCkgPyAibnVsbCIgOiBub2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzdGFydCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZTsKLQkJCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBhdHRyLmdldE93bmVyQ1NTTm9kZSgpKTsKLQkJCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCQlzdGFydCA9IGZvcm1hdHRlci5nZXRBdHRySW5zZXJ0UG9zKGF0dHIuZ2V0T3duZXJDU1NOb2RlKCksIGF0dHIuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCWludCBvbGRMZW5ndGggPSAob2xkVmFsdWUgPT0gbnVsbCkgPyAwIDogb2xkVmFsdWUubGVuZ3RoKCk7Ci0JCS8vIGZsYXNoIG9sZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uL0lUZXh0UmVnaW9uCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1JlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0UmFuZ2VSZWdpb24obnVsbCwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgbmV3IHNvdXJjZQotCQlTdHJpbmcgbmV3VmFsdWUgPSBub2RlLmdlbmVyYXRlU291cmNlKCk7Ci0KLQkJSUNTU05vZGUgcGFyZW50OwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSkgewotCQkJcGFyZW50ID0gKChJQ1NTQXR0cikgbm9kZSkuZ2V0T3duZXJDU1NOb2RlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCi0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfQ0hBTkdFX1JDT05UQUlORVIsIHBhcmVudCwgbm9kZSk7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gaW5zZXJ0VGV4dChzdGFydCwgb2xkTGVuZ3RoLCBuZXdWYWx1ZSk7Ci0KLQkJaW50IG5SZW1haW5zID0gZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCWlmICgwIDwgblJlbWFpbnMgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAkJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliMTM3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NSdWxlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNb2RlbFV0aWwgewotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gY2FuQ29udGFpbkJyYWNlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlICE9IG51bGwgJiYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lciB8fCBub2RlIGluc3RhbmNlb2YgQ1NTUnVsZURlY2xDb250YWluZXIpKSA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXN0YXRpYyB2b2lkIGNsZWFudXBDb250YWluZXIoSUNTU05vZGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWNsZWFudXBDb250YWluZXIoY2hpbGQpOwotCQl9Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJKChDU1NSZWdpb25Db250YWluZXIpIHBhcmVudCkuc2V0UmFuZ2VSZWdpb24obnVsbCwgbnVsbCwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBkaWFnbm9zZU5vZGUoSUNTU05vZGUgcGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQkvLyBjaGVjayB0aGlzCi0JCVZlY3RvciBlcnJvcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBub2RlID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50OwotCQkJU3RyaW5nIG5vZGVUZXh0ID0gQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSArICI6ICI7Ly8kTk9OLU5MUy0xJAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsICYmICghKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCB8fCBub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldEltcGwpIHx8IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpKSB7Ci0JCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzFjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1maXJzdCBmbGF0IG5vZGUgaXMgbnVsbC4iCi0JCQl9Ci0JCQllbHNlIGlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZmxhdE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG1vZGVsTm9kZSkgewotCQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fMmNvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWZpcnN0IGZsYXQgbm9kZSBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJCWZsYXROb2RlID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCAmJiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgfHwgbm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXRJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl8zY29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9bGFzdCBmbGF0IG5vZGUgaXMgbnVsbC4iCi0JCQl9Ci0JCQllbHNlIGlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZmxhdE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG1vZGVsTm9kZSkgewotCQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fNGNvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWxhc3QgZmxhdCBub2RlIGlzIG5vdCBpbiBtb2RlbC4iCi0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJQ1NTUmVnaW9uQ29udGFpbmVyIG5vZGUgPSAoQ1NTUmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCQlTdHJpbmcgbm9kZVRleHQgPSBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpICsgIjogIjsvLyROT04tTkxTLTEkCi0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudFJlZ2lvbiA9IG5vZGUuZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCAmJiAoIShub2RlIGluc3RhbmNlb2YgTWVkaWFMaXN0SW1wbCkgfHwgbm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkpIHsKLQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fMjVjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1maXJzdCByZWdpb24gaXMgbnVsbC4iCi0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBwYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uIG1vZGVsUmVnaW9uID0gbW9kZWxOb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBtb2RlbFJlZ2lvbikgewotCQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fMjZjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1maXJzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCQlyZWdpb24gPSBub2RlLmdldExhc3RSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCAmJiAoIShub2RlIGluc3RhbmNlb2YgTWVkaWFMaXN0SW1wbCkgfHwgbm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkpIHsKLQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fMjdjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IHJlZ2lvbiBpcyBudWxsLiIKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb24gbW9kZWxSZWdpb24gPSBtb2RlbE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uICE9IG1vZGVsUmVnaW9uKSB7Ci0JCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl8yOGNvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWxhc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4iCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUNTU05vZGVMaXN0IGF0dHJzID0gcGFyZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IG5BdHRycyA9IGF0dHJzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJQ1NTUmVnaW9uQ29udGFpbmVyIG5vZGUgPSAoQ1NTUmVnaW9uQ29udGFpbmVyKSBhdHRyOwotCQkJU3RyaW5nIG5vZGVUZXh0ID0gQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSArICIoIiArIGF0dHIuZ2V0TmFtZSgpICsgIik6ICI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGUuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50UmVnaW9uID0gbm9kZS5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmIDAgPCBhdHRyLmdldFZhbHVlKCkubGVuZ3RoKCkpIHsKLQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fNWNvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWZpcnN0IHJlZ2lvbiBpcyBudWxsLiIKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb24gbW9kZWxSZWdpb24gPSBtb2RlbE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uICE9IG1vZGVsUmVnaW9uKSB7Ci0JCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl82Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4iCi0JCQkJfQotCQkJfQotCQkJcmVnaW9uID0gbm9kZS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwgJiYgMCA8IGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSkgewotCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl83Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9bGFzdCByZWdpb24gaXMgbnVsbC4iCi0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBwYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uIG1vZGVsUmVnaW9uID0gbW9kZWxOb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBtb2RlbFJlZ2lvbikgewotCQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fOGNvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWxhc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4iCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFlcnJvcnMuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpID0gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NVdGlsLmRlYnVnT3V0KChTdHJpbmcpIGkubmV4dCgpKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gZGlhZ25vc2VUcmVlKElDU1NOb2RlIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gY2hlY2sgY2hpbGRyZW4KLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJZGlhZ25vc2VUcmVlKGNoaWxkLCBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0KLQkJZGlhZ25vc2VOb2RlKHBhcmVudCwgc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBuZWVkZWQsIG1vZGlmeSBsYXN0IGZsYXQgbm9kZQotCSAqLwotCXN0YXRpYyB2b2lkIGV4cGFuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcihDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCB8fCBmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGxhc3ROb2RlID09IGZsYXROb2RlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGxhc3ROb2RlID09IG51bGwgfHwgbGFzdE5vZGUuZ2V0U3RhcnQoKSA8IGZsYXROb2RlLmdldFN0YXJ0KCkpIHsKLQkJCXRhcmdldC5zZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJfQotCX0KLQotCS8qCi0JICogCi0JICovCi0Jc3RhdGljIElDU1NOb2RlIGZpbmRCcmFjZUNvbnRhaW5lcihJQ1NTTm9kZSBub2RlKSB7Ci0JCWZvciAoSUNTU05vZGUgaSA9IG5vZGU7IGkgIT0gbnVsbDsgaSA9IGkuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAoQ1NTTW9kZWxVdGlsLmNhbkNvbnRhaW5CcmFjZShpKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBpbnQgZ2V0RGVwdGgoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgZGVwdGggPSAtMTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJZGVwdGgrKzsKLQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNCcmFjZUNsb3NlZChJQ1NTTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gYkNsb3NlZCA9IHRydWU7Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQlyZXR1cm4gYkNsb3NlZDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0ID09IG51bGwgfHwgbGFzdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gYkNsb3NlZDsKLQkJfQotCQlpZiAobGFzdC5nZXRTdGFydCgpIDwgZmlyc3QuZ2V0U3RhcnQoKSkgewotCQkJcmV0dXJuIGJDbG9zZWQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZmlyc3Q7Ci0JCWludCBuT3BlbiA9IDA7Ci0JCWludCBuQ2xvc2UgPSAwOwotCQlkbyB7Ci0JCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJbk9wZW4rKzsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCW5DbG9zZSsrOwotCQkJfQotCQkJZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKGZsYXROb2RlICE9IG51bGwgJiYgZmxhdE5vZGUgIT0gbGFzdCk7Ci0KLQkJaWYgKChuT3BlbiA9PSAwICYmIG5DbG9zZSA9PSAwKSB8fCBuQ2xvc2UgPCBuT3BlbikgewotCQkJYkNsb3NlZCA9IGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGJDbG9zZWQ7Ci0JfQotCi0JLyoqCi0JICogb25seSBmb3IgaW5zZXJ0aW9uLi4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc0ludGVycnVwdGlvbihDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCB8fCBmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IHN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSB0YXJnZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IHRhcmdldC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdE5vZGUgIT0gbnVsbCAmJiBmaXJzdE5vZGUuZ2V0U3RhcnQoKSA8IHN0YXJ0ICYmIGxhc3ROb2RlICE9IG51bGwgJiYgc3RhcnQgPCBsYXN0Tm9kZS5nZXRTdGFydCgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNQYXJlbnRPZihJQ1NTTm9kZSBwYXJlbnQsIElDU1NOb2RlIGNoaWxkKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBjaGlsZDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChwYXJlbnQgPT0gbm9kZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjExNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTTmFtZWROb2RlTWFwSW1wbCBleHRlbmRzIENTU05vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIElDU1NOYW1lZE5vZGVNYXAgewotCi0JLyoqCi0JICogQ1NTTmFtZWROb2RlTWFwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU05hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIElDU1NOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdCA9IG5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ1NTQXR0ckltcGwgJiYgKChDU1NBdHRySW1wbCkgb2JqKS5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShuYW1lKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIChJQ1NTTm9kZSkgb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzN2RhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3ROb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENTU05vZGVJbXBsIGV4dGVuZHMgQWJzdHJhY3ROb3RpZmllciBpbXBsZW1lbnRzIElDU1NOb2RlLCBJbmRleGVkUmVnaW9uIHsKLQotCXByaXZhdGUgQ1NTRG9jdW1lbnRJbXBsIGZPd25lckRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZQYXJlbnROb2RlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZOZXh0U2libGluZyA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmUHJldmlvdXNTaWJsaW5nID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZGaXJzdENoaWxkID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZMYXN0Q2hpbGQgPSBudWxsOwotCXByb3RlY3RlZCBDU1NOYW1lZE5vZGVNYXBJbXBsIGZBdHRycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NOb2RlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU05vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU05vZGVJbXBsKENTU05vZGVJbXBsIHRoYXQpIHsKLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5mT3duZXJEb2N1bWVudCA9IHRoYXQuZk93bmVyRG9jdW1lbnQ7Ci0JCQlpZiAodGhhdC5mQXR0cnMgIT0gbnVsbCkgewotCQkJCWludCBuQXR0cnMgPSB0aGF0LmZBdHRycy5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoQ1NTQXR0ckltcGwpIHRoYXQuZkF0dHJzLml0ZW0oaSk7Ci0JCQkJCXNldEF0dHJpYnV0ZShhdHRyLmdldE5hbWUoKSwgYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgYXBwZW5kQ2hpbGQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUNoaWxkTm9kZXMoSUNTU05vZGUgbmV3UGFyZW50LCBib29sZWFuIGRlZXApIHsKLQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudCA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCUNTU05vZGVJbXBsIGNvbnRhaW5lciA9IChDU1NOb2RlSW1wbCkgbmV3UGFyZW50OwotCQljb250YWluZXIucmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJQ1NTTm9kZUltcGwgY2xvbmVkID0gKENTU05vZGVJbXBsKSBjaGlsZC5jbG9uZU5vZGUoZGVlcCk7Ci0JCQlpZiAoY2xvbmVkICE9IG51bGwpCi0JCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAoZ2V0U3RhcnRPZmZzZXQoKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVTb3VyY2UoKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKHRoaXMpOwotCQlyZXR1cm4gZm9ybWF0dGVyLmZvcm1hdCh0aGlzKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ1NTQXR0ckltcGwgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgbmFtZSkgewotCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbkF0dHJzID0gZkF0dHJzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSBmQXR0cnMuaXRlbShpKTsKLQkJCWlmIChhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQlyZXR1cm4gYXR0cjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgSUNTU05hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQlmQXR0cnMgPSBuZXcgQ1NTTmFtZWROb2RlTWFwSW1wbCgpOwotCQlyZXR1cm4gZkF0dHJzOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJQ1NTTm9kZUxpc3RJbXBsIGxpc3QgPSBuZXcgQ1NTTm9kZUxpc3RJbXBsKCk7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlsaXN0LmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JSUNTU05vZGUgZ2V0Q29tbW9uQW5jZXN0b3IoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChJQ1NTTm9kZSBuYSA9IG5vZGU7IG5hICE9IG51bGw7IG5hID0gbmEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlmb3IgKElDU1NOb2RlIHRhID0gdGhpczsgdGEgIT0gbnVsbDsgdGEgPSB0YS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAodGEgPT0gbmEpCi0JCQkJCXJldHVybiB0YTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQlDU1NEb2N1bWVudEltcGwgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKSB7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IHRoaXM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0RvY3VtZW50SW1wbCkgewotCQkJCUNTU0RvY3VtZW50SW1wbCBkb2MgPSAoQ1NTRG9jdW1lbnRJbXBsKSBub2RlOwotCQkJCWlmIChkb2MuaXNEb2N1bWVudCgpKQotCQkJCQlyZXR1cm4gZG9jOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUNTU05vZGVJbXBsIGdldENvbnRhaW5lck5vZGUoaW50IG9mZnNldCkgewotCQlpZiAoIWNvbnRhaW5zKG9mZnNldCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCUlDU1NOb2RlIGZvdW5kID0gKChDU1NOb2RlSW1wbCkgY2hpbGQpLmdldENvbnRhaW5lck5vZGUob2Zmc2V0KTsKLQkJCWlmIChmb3VuZCAhPSBudWxsKQotCQkJCXJldHVybiAoQ1NTTm9kZUltcGwpIGZvdW5kOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZyA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQkJaWYgKHJlZyAhPSBudWxsKQotCQkJCXJldHVybiByZWc7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmZGaXJzdENoaWxkOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmZMYXN0Q2hpbGQ7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5mTmV4dFNpYmxpbmc7Ci0JfQotCi0JSUNTU05vZGUgZ2V0Tm9kZUF0KGludCBvZmZzZXQpIHsKLQkJLy8gdGhlIHNhbWUgYXMgZ2V0Q29udGFpbmVyTm9kZSgpCi0JCXJldHVybiBnZXRDb250YWluZXJOb2RlKG9mZnNldCk7Ci0JfQotCi0JcHVibGljIElDU1NEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5mT3duZXJEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZlBhcmVudE5vZGU7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZlByZXZpb3VzU2libGluZzsKLQl9Ci0KLQlJQ1NTTm9kZSBnZXRSb290Tm9kZSgpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gKENTU05vZGVJbXBsKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiB0aGlzOwotCQlyZXR1cm4gcGFyZW50LmdldFJvb3ROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuICh0aGlzLmZGaXJzdENoaWxkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgaW5zZXJ0QmVmb3JlKENTU05vZGVJbXBsIG5ld0NoaWxkLCBDU1NOb2RlSW1wbCByZWZDaGlsZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTTm9kZUltcGwgY2hpbGQgPSBuZXdDaGlsZDsKLQkJQ1NTTm9kZUltcGwgbmV4dCA9IHJlZkNoaWxkOwotCQlDU1NOb2RlSW1wbCBwcmV2ID0gbnVsbDsKLQkJaWYgKG5leHQgPT0gbnVsbCkgewotCQkJcHJldiA9IHRoaXMuZkxhc3RDaGlsZDsKLQkJCXRoaXMuZkxhc3RDaGlsZCA9IGNoaWxkOwotCQl9Ci0JCWVsc2UgewotCQkJcHJldiA9IChDU1NOb2RlSW1wbCkgbmV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKGNoaWxkKTsKLQkJfQotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZGaXJzdENoaWxkID0gY2hpbGQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotCQljaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0JCWNoaWxkLnNldE5leHRTaWJsaW5nKG5leHQpOwotCQljaGlsZC5zZXRQYXJlbnROb2RlKHRoaXMpOwotCi0JCW5vdGlmeUNoaWxkUmVwbGFjZWQoY2hpbGQsIG51bGwpOwotCi0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBdHRyUmVwbGFjZWQoQ1NTTm9kZUltcGwgbmV3QXR0ciwgQ1NTTm9kZUltcGwgb2xkQXR0cikgewotCQkvLyBmb3IgbW9kZWwKLQkJSUNTU0RvY3VtZW50IGRvYyA9IGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ1NTTW9kZWxJbXBsIG1vZGVsID0gKENTU01vZGVsSW1wbCkgZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5hdHRyUmVwbGFjZWQodGhpcywgbmV3QXR0ciwgb2xkQXR0cik7Ci0KLQkJLy8gZm9yIGFkYXB0ZXJzCi0JCWludCB0eXBlID0gQ0hBTkdFOwotCQlpZiAobmV3QXR0ciA9PSBudWxsKQotCQkJdHlwZSA9IFJFTU9WRTsKLQkJZWxzZSBpZiAob2xkQXR0ciA9PSBudWxsKQotCQkJdHlwZSA9IEFERDsKLQkJbm90aWZ5KHR5cGUsIG9sZEF0dHIsIG9sZEF0dHIsIG5ld0F0dHIsIGdldFN0YXJ0T2Zmc2V0KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUNoaWxkUmVwbGFjZWQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB7Ci0JCS8vIGZvciBtb2RlbAotCQlJQ1NTRG9jdW1lbnQgZG9jID0gZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmNoaWxkUmVwbGFjZWQodGhpcywgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQotCQkvLyBmb3IgYWRhcHRlcnMKLQkJaW50IHR5cGUgPSBDSEFOR0U7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IFJFTU9WRTsKLQkJZWxzZSBpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBBREQ7Ci0JCW5vdGlmeSh0eXBlLCBvbGRDaGlsZCwgb2xkQ2hpbGQsIG5ld0NoaWxkLCBnZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQl2b2lkIHJlbW92ZUF0dHJpYnV0ZU5vZGUoQ1NTTm9kZUltcGwgYXR0cikgewotCQkvLyBmaW5kCi0JCWludCBuQXR0cnMgPSBmQXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJzOyBpKyspIHsKLQkJCWlmIChmQXR0cnMuaXRlbShpKSA9PSBhdHRyKSB7Ci0JCQkJZkF0dHJzLnJlbW92ZU5vZGUoaSk7Ci0JCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDU1NOb2RlSW1wbCByZW1vdmVDaGlsZChDU1NOb2RlSW1wbCBvbGRDaGlsZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvbGRDaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gdGhpcykKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGNsb3NlIGltcG9ydCBydWxlcwotCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQl0cmF2LmFwcGx5KG9sZENoaWxkKTsKLQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldFJ1bGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJKChDU1NJbXBvcnRSdWxlSW1wbCkgaXQubmV4dCgpKS5jbG9zZVN0eWxlU2hlZXQoKTsKLQkJfQotCi0JCUNTU05vZGVJbXBsIGNoaWxkID0gb2xkQ2hpbGQ7Ci0JCUNTU05vZGVJbXBsIHByZXYgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQlDU1NOb2RlSW1wbCBuZXh0ID0gKENTU05vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZGaXJzdENoaWxkID0gbmV4dDsKLQkJZWxzZQotCQkJcHJldi5zZXROZXh0U2libGluZyhuZXh0KTsKLQotCQlpZiAobmV4dCA9PSBudWxsKQotCQkJdGhpcy5mTGFzdENoaWxkID0gcHJldjsKLQkJZWxzZQotCQkJbmV4dC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0KLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZShudWxsKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKG51bGwsIGNoaWxkKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCQlJQ1NTTm9kZSBuZXh0Q2hpbGQgPSBudWxsOwotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IG5leHRDaGlsZCkgewotCQkJbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENTU05vZGVJbXBsIHJlcGxhY2VDaGlsZChDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpCi0JCQlpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG9sZENoaWxkKTsKLQkJcmV0dXJuIHJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICoKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ1NTQXR0ckltcGwgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCVN0cmluZyBvbGRWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQkJZkF0dHJzID0gbmV3IENTU05hbWVkTm9kZU1hcEltcGwoKTsKLQkJCUNTU0RvY3VtZW50SW1wbCBkb2MgPSAoQ1NTRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJYXR0ciA9IChDU1NBdHRySW1wbCkgZG9jLmNyZWF0ZUNTU0F0dHIobmFtZSk7Ci0JCQlhdHRyLnNldE93bmVyQ1NTTm9kZSh0aGlzKTsKLQkJCWZBdHRycy5hcHBlbmROb2RlKGF0dHIpOwotCQkJbm90aWZ5QXR0clJlcGxhY2VkKGF0dHIsIG51bGwpOwotCQl9Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjc3NUZXh0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzVGV4dChTdHJpbmcgY3NzVGV4dCkgewotCQkvLyBUT0RPIDogY2FsbCBmbGF0IG1vZGVsIHBhcnNlciBhbmQgcmVwbGFjZSBteXNlbGYgd2l0aCBuZXcgdGhyZWUhIQotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5leHRTaWJsaW5nKElDU1NOb2RlIG5leHRTaWJsaW5nKSB7Ci0JCXRoaXMuZk5leHRTaWJsaW5nID0gKENTU05vZGVJbXBsKSBuZXh0U2libGluZzsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRvY3VtZW50KElDU1NEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXRoaXMuZk93bmVyRG9jdW1lbnQgPSAoQ1NTRG9jdW1lbnRJbXBsKSBvd25lckRvY3VtZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQYXJlbnROb2RlKElDU1NOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5mUGFyZW50Tm9kZSA9IChDU1NOb2RlSW1wbCkgcGFyZW50Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJldmlvdXNTaWJsaW5nKElDU1NOb2RlIHByZXZpb3VzU2libGluZykgewotCQl0aGlzLmZQcmV2aW91c1NpYmxpbmcgPSAoQ1NTTm9kZUltcGwpIHByZXZpb3VzU2libGluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3RhcnQgPSBnZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPj0gMCkgewotCQkJaW50IGVuZCA9IGdldEVuZE9mZnNldCgpOwotCQkJaWYgKGVuZCA+PSAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5kIC0gc3RhcnQ7Ci0JCQkJaWYgKHJlc3VsdCA8IC0xKSB7Ci0JCQkJCXJlc3VsdCA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDEzODcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotCi1jbGFzcyBDU1NOb2RlTGlzdEltcGwgZXh0ZW5kcyBBYnN0cmFjdENTU05vZGVMaXN0IGltcGxlbWVudHMgSUNTU05vZGVMaXN0IHsKLQotCUNTU05vZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGl0ZW1JbXBsKGluZGV4KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1BhZ2VSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQYWdlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ5ZDU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1BhZ2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NQYWdlUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlRGVjbENvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NQYWdlUnVsZSB7Ci0KLQlJQ1NTU2VsZWN0b3JMaXN0IGZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChudWxsKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1BhZ2VSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NQYWdlUnVsZUltcGwoQ1NTUGFnZVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTUGFnZVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NQYWdlUnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBleHRyYWN0UHJlU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcHJlU3RyID0gbmV3IFN0cmluZ0J1ZmZlcigiQHBhZ2UgIik7Ly8kTk9OLU5MUy0xJAotCQlwcmVTdHIuYXBwZW5kKGdldFNlbGVjdG9yVGV4dCgpKTsKLQotCQlyZXR1cm4gcHJlU3RyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFBBR0VSVUxFX05PREU7Ci0JfQotCi0JcHVibGljIElDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCkgewotCQlyZXR1cm4gZlNlbGVjdG9yTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFyc2FibGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFnZSBzZWxlY3RvciBmb3IgdGhlIHJ1bGUuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBDU1Mgc3RyaW5nIHZhbHVlIGhhcwotCSAqICAgICAgICAgICAgICAgIGEgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBydWxlIGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclRleHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoU0VMRUNUT1IpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFBBR0VfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RvclRleHQoU3RyaW5nIHNlbGVjdG9yVGV4dCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShTRUxFQ1RPUiwgc2VsZWN0b3JUZXh0KTsKLQkJZlNlbGVjdG9yTGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKHNlbGVjdG9yVGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMWYxODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUHJpbWl0aXZlQ29udGFpbmVyIGV4dGVuZHMgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHsKLQotCUNTU1ByaW1pdGl2ZUNvbnRhaW5lcihDU1NQcmltaXRpdmVDb250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlDU1NQcmltaXRpdmVDb250YWluZXIoc2hvcnQgcHJpbWl0aXZlVHlwZSkgewotCQlzdXBlcihwcmltaXRpdmVUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0UHJpbWl0aXZlcygpOwotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3duZXJEb2N1bWVudChJQ1NTRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQpOwotCi0JCWluaXRQcmltaXRpdmVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYmMwOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5Db3VudGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5SR0JDb2xvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUmVjdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZXh0ZW5kcyBDU1NSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTUHJpbWl0aXZlVmFsdWUgewotCi0JcHJvdGVjdGVkIHNob3J0IGZQcmltaXRpdmVUeXBlID0gQ1NTX1VOS05PV047Ci0JcHJpdmF0ZSBmbG9hdCBmRmxvYXRWYWx1ZSA9IDAuMGY7Ci0JcHJpdmF0ZSBTdHJpbmcgZlN0cmluZ1ZhbHVlID0gbnVsbDsKLQotCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbChDU1NQcmltaXRpdmVWYWx1ZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQl0aGlzLmZQcmltaXRpdmVUeXBlID0gdGhhdC5mUHJpbWl0aXZlVHlwZTsKLQkJdGhpcy5mRmxvYXRWYWx1ZSA9IHRoYXQuZkZsb2F0VmFsdWU7Ci0JCXRoaXMuZlN0cmluZ1ZhbHVlID0gdGhhdC5mU3RyaW5nVmFsdWU7Ci0JfQotCi0JQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHNob3J0IHByaW1pdGl2ZVR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJZlByaW1pdGl2ZVR5cGUgPSBwcmltaXRpdmVUeXBlOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoaXMpOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIENvdW50ZXIgdmFsdWUuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgY291bnRlciB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiBNb2RpZmljYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgY2FuIGJlIGFjaGlldmVkIHVzaW5nCi0JICogdGhlIDxjb2RlPkNvdW50ZXI8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBDb3VudGVyIHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIENvdW50ZXIgdmFsdWUgKGUuZy4gdGhpcyBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5DU1NfQ09VTlRFUjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBDb3VudGVyIGdldENvdW50ZXJWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q1NTVmFsdWVUZXh0KCkgewotCQlyZXR1cm4gZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEEgY29kZSBkZWZpbmluZyB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgYXMgZGVmaW5lZCBhYm92ZS4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Q3NzVmFsdWVUeXBlKCkgewotCQlpZiAoZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU19JTkhFUklUX1BSSU1JVElWRSkgewotCQkJcmV0dXJuIENTU19JTkhFUklUOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENTU19QUklNSVRJVkVfVkFMVUU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCBhIGZsb2F0IHZhbHVlIGluIGEgc3BlY2lmaWVkIHVuaXQuIElmIHRoaXMKLQkgKiBDU1MgdmFsdWUgZG9lc24ndCBjb250YWluIGEgZmxvYXQgdmFsdWUgb3IgY2FuJ3QgYmUgY29udmVydGVkIGludG8gdGhlCi0JICogc3BlY2lmaWVkIHVuaXQsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogCi0JICogQHBhcmFtIHVuaXRUeXBlCi0JICogICAgICAgICAgICBBIHVuaXQgY29kZSB0byBnZXQgdGhlIGZsb2F0IHZhbHVlLiBUaGUgdW5pdCBjb2RlIGNhbiBvbmx5Ci0JICogICAgICAgICAgICBiZSBhIGZsb2F0IHVuaXQgdHlwZSAoaS5lLiA8Y29kZT5DU1NfTlVNQkVSPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19QRVJDRU5UQUdFPC9jb2RlPiw8Y29kZT5DU1NfRU1TPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19FWFM8L2NvZGU+LDxjb2RlPkNTU19QWDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfQ008L2NvZGU+LDxjb2RlPkNTU19NTTwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfSU48L2NvZGU+LDxjb2RlPkNTU19QVDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEM8L2NvZGU+LDxjb2RlPkNTU19ERUc8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1JBRDwvY29kZT4sPGNvZGU+Q1NTX0dSQUQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX01TPC9jb2RlPiw8Y29kZT5DU1NfUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfSFo8L2NvZGU+LDxjb2RlPkNTU19LSFo8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0RJTUVOU0lPTjwvY29kZT4pLgotCSAqIEByZXR1cm4gVGhlIGZsb2F0IHZhbHVlIGluIHRoZSBzcGVjaWZpZWQgdW5pdC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBmbG9hdCB2YWx1ZSBvciBpZiB0aGUgZmxvYXQgdmFsdWUgY2FuJ3QgYmUKLQkgKiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHVuaXQuCi0JICovCi0JcHVibGljIGZsb2F0IGdldEZsb2F0VmFsdWUoc2hvcnQgdW5pdFR5cGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKGZQcmltaXRpdmVUeXBlKSB7Ci0JCQljYXNlIENTU19OVU1CRVIgOgotCQkJY2FzZSBDU1NfUEVSQ0VOVEFHRSA6Ci0JCQljYXNlIENTU19FTVMgOgotCQkJY2FzZSBDU1NfRVhTIDoKLQkJCWNhc2UgQ1NTX1BYIDoKLQkJCWNhc2UgQ1NTX0NNIDoKLQkJCWNhc2UgQ1NTX01NIDoKLQkJCWNhc2UgQ1NTX0lOIDoKLQkJCWNhc2UgQ1NTX1BUIDoKLQkJCWNhc2UgQ1NTX1BDIDoKLQkJCWNhc2UgQ1NTX0RFRyA6Ci0JCQljYXNlIENTU19SQUQgOgotCQkJY2FzZSBDU1NfR1JBRCA6Ci0JCQljYXNlIENTU19NUyA6Ci0JCQljYXNlIENTU19TIDoKLQkJCWNhc2UgQ1NTX0haIDoKLQkJCWNhc2UgQ1NTX0tIWiA6Ci0JCQljYXNlIENTU19ESU1FTlNJT04gOgotCQkJY2FzZSBDU1NfSU5URUdFUiA6Ci0JCQljYXNlIENTU19IQVNIIDoKLQkJCQlyZXR1cm4gZkZsb2F0VmFsdWU7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgyMDAxLzAxLzE3Ci0JICogMTI6MTI6MTgpCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFBSSU1JVElWRVZBTFVFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIGNvbnN0YW50cyBzcGVjaWZpZWQgYWJvdmUuCi0JICovCi0JcHVibGljIHNob3J0IGdldFByaW1pdGl2ZVR5cGUoKSB7Ci0JCXJldHVybiBmUHJpbWl0aXZlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgUmVjdCB2YWx1ZS4gSWYgdGhpcyBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSByZWN0IHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIE1vZGlmaWNhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcKLQkgKiB0aGUgPGNvZGU+UmVjdDwvY29kZT4gaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIFJlY3QgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgUmVjdCB2YWx1ZS4gKGUuZy4gdGhpcyBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5DU1NfUkVDVDwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBSZWN0IGdldFJlY3RWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIFJHQiBjb2xvci4gSWYgdGhpcyBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSBSR0IgY29sb3IgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5SR0JDb2xvcjwvY29kZT4gaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFJHQiBjb2xvciB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBhdHRhY2hlZCBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgICAgIGNhbid0IHJldHVybiBhIFJHQiBjb2xvciB2YWx1ZSAoZS5nLiB0aGlzIGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkNTU19SR0JDT0xPUjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBSR0JDb2xvciBnZXRSR0JDb2xvclZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgc3RyaW5nIHZhbHVlLiBJZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgc3RyaW5nIHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLiBTb21lCi0JICogcHJvcGVydGllcyAobGlrZSAnZm9udC1mYW1pbHknIG9yICd2b2ljZS1mYW1pbHknKSBjb252ZXJ0IGEgd2hpdGVzcGFjZQotCSAqIHNlcGFyYXRlZCBsaXN0IG9mIGlkZW50cyB0byBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgdmFsdWUgaW4gdGhlIGN1cnJlbnQgdW5pdC4gVGhlIGN1cnJlbnQKLQkgKiAgICAgICAgIDxjb2RlPnByaW1pdGl2ZVR5cGU8L2NvZGU+IGNhbiBvbmx5IGJlIGEgc3RyaW5nIHVuaXQgdHlwZQotCSAqICAgICAgICAgKGkuZS4gPGNvZGU+Q1NTX1NUUklORzwvY29kZT4sPGNvZGU+Q1NTX1VSSTwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5DU1NfSURFTlQ8L2NvZGU+IGFuZCA8Y29kZT5DU1NfQVRUUjwvY29kZT4pLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIHN0cmluZyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAoZlByaW1pdGl2ZVR5cGUpIHsKLQkJCWNhc2UgQ1NTX1NUUklORyA6Ci0JCQljYXNlIENTU19VUkkgOgotCQkJY2FzZSBDU1NfSURFTlQgOgotCQkJY2FzZSBDU1NfQVRUUiA6Ci0JCQljYXNlIENTU19VUkFOR0UgOgotCQkJY2FzZSBDU1NfRk9STUFUIDoKLQkJCWNhc2UgQ1NTX0xPQ0FMIDoKLQkJCWNhc2UgQ1NTX0hBU0ggOgotCQkJY2FzZSBDU1NfQ09NTUEgOgotCQkJY2FzZSBDU1NfU0xBU0ggOgotCQkJY2FzZSBDU1NfSU5IRVJJVF9QUklNSVRJVkUgOgotCQkJCXJldHVybiBmU3RyaW5nVmFsdWU7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlWYWx1ZUNoYW5nZWQoU3RyaW5nIG9sZFZhbHVlKSB7Ci0JCS8vIGZvciBtb2RlbAotCQlJQ1NTRG9jdW1lbnQgZG9jID0gZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLnZhbHVlQ2hhbmdlZCh0aGlzLCBvbGRWYWx1ZSk7Ci0KLQkJLy8gZm9yIGFkYXB0ZXJzCi0JCW5vdGlmeShDSEFOR0UsIG5ldyBTaG9ydChmUHJpbWl0aXZlVHlwZSksIG51bGwsIG51bGwsIGdldFN0YXJ0T2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEEgbWV0aG9kIHRvIHNldCB0aGUgZmxvYXQgdmFsdWUgd2l0aCBhIHNwZWNpZmllZCB1bml0LiBJZiB0aGUgcHJvcGVydHkKLQkgKiBhdHRhY2hlZCB3aXRoIHRoaXMgdmFsdWUgY2FuIG5vdCBhY2NlcHQgdGhlIHNwZWNpZmllZCB1bml0IG9yIHRoZSBmbG9hdAotCSAqIHZhbHVlLCB0aGUgdmFsdWUgd2lsbCBiZSB1bmNoYW5nZWQgYW5kIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPgotCSAqIHdpbGwgYmUgcmFpc2VkLgotCSAqIAotCSAqIEBwYXJhbSB1bml0VHlwZQotCSAqICAgICAgICAgICAgQSB1bml0IGNvZGUgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIHVuaXQgY29kZSBjYW4gb25seSBiZSBhCi0JICogICAgICAgICAgICBmbG9hdCB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX05VTUJFUjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEVSQ0VOVEFHRTwvY29kZT4sPGNvZGU+Q1NTX0VNUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRVhTPC9jb2RlPiw8Y29kZT5DU1NfUFg8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0NNPC9jb2RlPiw8Y29kZT5DU1NfTU08L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0lOPC9jb2RlPiw8Y29kZT5DU1NfUFQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BDPC9jb2RlPiw8Y29kZT5DU1NfREVHPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19SQUQ8L2NvZGU+LDxjb2RlPkNTU19HUkFEPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19NUzwvY29kZT4sPGNvZGU+Q1NTX1M8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0haPC9jb2RlPiw8Y29kZT5DU1NfS0haPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19ESU1FTlNJT048L2NvZGU+KS4KLQkgKiBAcGFyYW0gZmxvYXRWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyBmbG9hdCB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBhdHRhY2hlZCBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZmxvYXQgdmFsdWUgb3IgdGhlIHVuaXQgdHlwZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGbG9hdFZhbHVlKHNob3J0IHVuaXRUeXBlLCBmbG9hdCBmbG9hdFZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc3dpdGNoICh1bml0VHlwZSkgewotCQkJY2FzZSBDU1NfTlVNQkVSIDoKLQkJCWNhc2UgQ1NTX1BFUkNFTlRBR0UgOgotCQkJY2FzZSBDU1NfRU1TIDoKLQkJCWNhc2UgQ1NTX0VYUyA6Ci0JCQljYXNlIENTU19QWCA6Ci0JCQljYXNlIENTU19DTSA6Ci0JCQljYXNlIENTU19NTSA6Ci0JCQljYXNlIENTU19JTiA6Ci0JCQljYXNlIENTU19QVCA6Ci0JCQljYXNlIENTU19QQyA6Ci0JCQljYXNlIENTU19ERUcgOgotCQkJY2FzZSBDU1NfUkFEIDoKLQkJCWNhc2UgQ1NTX0dSQUQgOgotCQkJY2FzZSBDU1NfTVMgOgotCQkJY2FzZSBDU1NfUyA6Ci0JCQljYXNlIENTU19IWiA6Ci0JCQljYXNlIENTU19LSFogOgotCQkJY2FzZSBDU1NfRElNRU5TSU9OIDoKLQkJCWNhc2UgQ1NTX0lOVEVHRVIgOgotCQkJCVN0cmluZyBvbGRWYWx1ZSA9IGdldENTU1ZhbHVlVGV4dCgpOwotCQkJCWZQcmltaXRpdmVUeXBlID0gdW5pdFR5cGU7Ci0JCQkJZkZsb2F0VmFsdWUgPSBmbG9hdFZhbHVlOwotCQkJCW5vdGlmeVZhbHVlQ2hhbmdlZChvbGRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIG1ldGhvZCB0byBzZXQgdGhlIHN0cmluZyB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgdW5pdC4gSWYgdGhlCi0JICogcHJvcGVydHkgYXR0YWNoZWQgdG8gdGhpcyB2YWx1ZSBjYW4ndCBhY2NlcHQgdGhlIHNwZWNpZmllZCB1bml0IG9yIHRoZQotCSAqIHN0cmluZyB2YWx1ZSwgdGhlIHZhbHVlIHdpbGwgYmUgdW5jaGFuZ2VkIGFuZCBhCi0JICogPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHJhaXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nVHlwZQotCSAqICAgICAgICAgICAgQSBzdHJpbmcgY29kZSBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgc3RyaW5nIGNvZGUgY2FuIG9ubHkgYmUKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nIHVuaXQgdHlwZSAoaS5lLiA8Y29kZT5DU1NfU1RSSU5HPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19VUkk8L2NvZGU+LDxjb2RlPkNTU19JREVOVDwvY29kZT4sIGFuZAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0FUVFI8L2NvZGU+KS4KLQkgKiBAcGFyYW0gc3RyaW5nVmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgc3RyaW5nIHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIHN0cmluZyB2YWx1ZSBvciBpZiB0aGUgc3RyaW5nIHZhbHVlIGNhbid0IGJlCi0JICogICAgICAgICAgICAgICAgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCB1bml0LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmluZ1ZhbHVlKHNob3J0IHN0cmluZ1R5cGUsIFN0cmluZyBzdHJpbmdWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAoc3RyaW5nVHlwZSkgewotCQkJY2FzZSBDU1NfU1RSSU5HIDoKLQkJCWNhc2UgQ1NTX1VSSSA6Ci0JCQljYXNlIENTU19JREVOVCA6Ci0JCQljYXNlIENTU19BVFRSIDoKLQkJCWNhc2UgQ1NTX1VSQU5HRSA6Ci0JCQljYXNlIENTU19GT1JNQVQgOgotCQkJY2FzZSBDU1NfTE9DQUwgOgotCQkJY2FzZSBDU1NfSEFTSCA6Ci0JCQljYXNlIENTU19DT01NQSA6Ci0JCQljYXNlIENTU19TTEFTSCA6Ci0JCQljYXNlIENTU19JTkhFUklUX1BSSU1JVElWRSA6Ci0JCQkJU3RyaW5nIG9sZFZhbHVlID0gZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJZlByaW1pdGl2ZVR5cGUgPSBzdHJpbmdUeXBlOwotCQkJCWZTdHJpbmdWYWx1ZSA9IHN0cmluZ1ZhbHVlOwotCQkJCW5vdGlmeVZhbHVlQ2hhbmdlZChvbGRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgyMDAxLzAxLzI0Ci0JICogMTU6MDY6MjUpCi0JICogCi0JICogQHBhcmFtIGZsb2F0VmFsdWUKLQkgKiAgICAgICAgICAgIGZsb2F0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGZsb2F0IGZsb2F0VmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXRGbG9hdFZhbHVlKGdldFByaW1pdGl2ZVR5cGUoKSwgZmxvYXRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8yNAotCSAqIDE1OjA2OjI1KQotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nIHN0cmluZ1ZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0U3RyaW5nVmFsdWUoZ2V0UHJpbWl0aXZlVHlwZSgpLCBzdHJpbmdWYWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjllOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NSZWdpb25Db250YWluZXIgZXh0ZW5kcyBDU1NOb2RlSW1wbCB7Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGZGaXJzdFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmTGFzdFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZQYXJlbnRSZWdpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ1NTUmVnaW9uQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTUmVnaW9uQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU1JlZ2lvbkNvbnRhaW5lcihDU1NSZWdpb25Db250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENzc1RleHQoKSB7Ci0JCWlmIChmRmlyc3RSZWdpb24gPT0gbnVsbCB8fCBmTGFzdFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGdlbmVyYXRlU291cmNlKCk7Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmUGFyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBiSW4gPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50ID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoYkluKSB7Ci0JCQkJc291cmNlLmFwcGVuZChmUGFyZW50UmVnaW9uLmdldFRleHQoY3VycmVudCkpOwotCQkJCWlmIChjdXJyZW50ID09IGZMYXN0UmVnaW9uKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChjdXJyZW50ID09IGZGaXJzdFJlZ2lvbikgewotCQkJCQliSW4gPSB0cnVlOwotCQkJCQlzb3VyY2UuYXBwZW5kKGZQYXJlbnRSZWdpb24uZ2V0VGV4dChjdXJyZW50KSk7Ci0JCQkJCWlmIChjdXJyZW50ID09IGZMYXN0UmVnaW9uKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0TGFzdFJlZ2lvbigpOwotCQlpZiAoIShyZWdpb24gPT0gbnVsbCB8fCBmUGFyZW50UmVnaW9uID09IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSBmUGFyZW50UmVnaW9uLmdldEVuZE9mZnNldChyZWdpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZQYXJlbnRSZWdpb247Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCXJldHVybiBmRmlyc3RSZWdpb247Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZMYXN0UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFJlZ2lvbihpbnQgaW5kZXgpIHsKLQkJaWYgKGdldEZpcnN0UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZQYXJlbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJaWYgKHJlZ2lvbnMuZ2V0KGkpID09IGdldEZpcnN0UmVnaW9uKCkpIHsKLQkJCQlpZiAoaSArIGluZGV4IDwgcmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJSVRleHRSZWdpb24gdGFyZ2V0ID0gcmVnaW9ucy5nZXQoaSArIGluZGV4KTsKLQkJCQkJaWYgKHRhcmdldC5nZXRTdGFydCgpIDw9IGdldExhc3RSZWdpb24oKS5nZXRTdGFydCgpKQotCQkJCQkJcmV0dXJuIHRhcmdldDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0UmVnaW9uQ291bnQoKSB7Ci0JCXZhbGlkYXRlUmFuZ2UoKTsKLQotCQlpZiAoZ2V0Rmlyc3RSZWdpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChnZXRGaXJzdFJlZ2lvbigpID09IGdldExhc3RSZWdpb24oKSkKLQkJCXJldHVybiAxOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZQYXJlbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCi0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50ID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoaiAhPSAwIHx8IGN1cnJlbnQgPT0gZ2V0Rmlyc3RSZWdpb24oKSkKLQkJCQlqKys7Ci0JCQlpZiAoY3VycmVudCA9PSBnZXRMYXN0UmVnaW9uKCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGo7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldEZpcnN0UmVnaW9uKCk7Ci0JCWlmICghKHJlZ2lvbiA9PSBudWxsIHx8IGZQYXJlbnRSZWdpb24gPT0gbnVsbCkpIHsKLQkJCXJlc3VsdCA9IGZQYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIHNldEZpcnN0UmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQl0aGlzLmZGaXJzdFJlZ2lvbiA9IHJlZ2lvbjsKLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIHNldExhc3RSZWdpb24oSVRleHRSZWdpb24gbGFzdFJlZ2lvbikgewotCQl0aGlzLmZMYXN0UmVnaW9uID0gbGFzdFJlZ2lvbjsKLQkJcmV0dXJuIGxhc3RSZWdpb247Ci0JfQotCi0Jdm9pZCBzZXRSYW5nZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudFJlZ2lvbiwgSVRleHRSZWdpb24gZmlyc3RSZWdpb24sIElUZXh0UmVnaW9uIGxhc3RSZWdpb24pIHsKLQkJdGhpcy5mUGFyZW50UmVnaW9uID0gcGFyZW50UmVnaW9uOwotCQl0aGlzLmZGaXJzdFJlZ2lvbiA9IGZpcnN0UmVnaW9uOwotCQl0aGlzLmZMYXN0UmVnaW9uID0gbGFzdFJlZ2lvbjsKLQotCQlpZiAoZmlyc3RSZWdpb24gPT0gbnVsbCAmJiBsYXN0UmVnaW9uID09IG51bGwpIHsKLQkJCXNldEZpcnN0UmVnaW9uKG51bGwpOwotCQkJc2V0TGFzdFJlZ2lvbihudWxsKTsKLQkJfQotCQllbHNlIHsgLy8gcmFuZ2UgdmFsaWRhdGlvbgotCQkJdmFsaWRhdGVSYW5nZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUmFuZ2UoKSB7Ci0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJaWYgKHRoaXMuZkZpcnN0UmVnaW9uICE9IG51bGwgfHwgdGhpcy5mTGFzdFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5mRmlyc3RSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuZkZpcnN0UmVnaW9uID0gdGhpcy5mTGFzdFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5mTGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5mTGFzdFJlZ2lvbiA9IHRoaXMuZkZpcnN0UmVnaW9uOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmZGaXJzdFJlZ2lvbi5nZXRTdGFydCgpID4gdGhpcy5mTGFzdFJlZ2lvbi5nZXRTdGFydCgpKSB7Ci0JCQkJLy8gbmVlZCB0byBzd2FwIGZpcnN0IGZvciBsYXN0Ci0JCQkJSVRleHRSZWdpb24gcmVnID0gZkZpcnN0UmVnaW9uOwotCQkJCWZGaXJzdFJlZ2lvbiA9IGZMYXN0UmVnaW9uOwotCQkJCWZMYXN0UmVnaW9uID0gcmVnOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVEZWNsQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVEZWNsQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MzgxNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlRGVjbENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUnVsZURlY2xDb250YWluZXIgZXh0ZW5kcyBDU1NSdWxlSW1wbCB7Ci0KLQkvKioKLQkgKiBDU1NSdWxlRGVjbENvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU1J1bGVEZWNsQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU1J1bGVEZWNsQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUnVsZURlY2xDb250YWluZXIoQ1NTUnVsZURlY2xDb250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlhYnN0cmFjdCBTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCkgewotCi0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pCi0JCQkJcmV0dXJuIChDU1NTdHlsZURlY2xhcmF0aW9uKSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmU2ZTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVNoZWV0OwotCi0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU1J1bGVJbXBsIGV4dGVuZHMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgQ1NTUnVsZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NSdWxlSW1wbChDU1NSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgcnVsZSBpcyBjb250YWluZWQgaW5zaWRlIGFub3RoZXIgcnVsZSAoZS5nLiBhIHN0eWxlIHJ1bGUgaW5zaWRlCi0JICogYW4KLQkgKiAKLQkgKiBAbWVkaWEgYmxvY2spLCB0aGlzIGlzIHRoZSBjb250YWluaW5nIHJ1bGUuIElmIHRoaXMgcnVsZSBpcyBub3QgbmVzdGVkCi0JICogICAgICAgIGluc2lkZSBhbnkgb3RoZXIgcnVsZXMsIHRoaXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBnZXRQYXJlbnRSdWxlKCkgewotCQlJQ1NTTm9kZSBydWxlID0gZ2V0UGFyZW50Tm9kZSgpOwotCi0JCS8vIHBhcmVudCBydWxlIGlzIHVzZWQgb25seSBpZiBwYXJlbnQgaXMgbWVkaWEgcnVsZQotCQlpZiAocnVsZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZUltcGwpCi0JCQlyZXR1cm4gKENTU1J1bGUpIHJ1bGU7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0eWxlIHNoZWV0IHRoYXQgY29udGFpbnMgdGhpcyBydWxlLgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZVNoZWV0IGdldFBhcmVudFN0eWxlU2hlZXQoKSB7Ci0JCUlDU1NOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldEltcGwpCi0JCQkJcmV0dXJuIChDU1NTdHlsZVNoZWV0KSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjE1YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1J1bGVMaXN0SW1wbCBleHRlbmRzIEFic3RyYWN0Q1NTTm9kZUxpc3QgaW1wbGVtZW50cyBDU1NSdWxlTGlzdCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NSdWxlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSBhIENTUyBydWxlIGJ5IG9yZGluYWwgaW5kZXguIFRoZSBvcmRlciBpbiB0aGlzCi0JICogY29sbGVjdGlvbiByZXByZXNlbnRzIHRoZSBvcmRlciBvZiB0aGUgcnVsZXMgaW4gdGhlIENTUyBzdHlsZSBzaGVldC4gSWYKLQkgKiBpbmRleCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBydWxlcyBpbiB0aGUgbGlzdCwgdGhpcwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGluZGV4SW5kZXgKLQkgKiAgICAgICAgICAgIGludG8gdGhlIGNvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBzdHlsZSBydWxlIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5DU1NSdWxlTGlzdDwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQgaXMKLQkgKiAgICAgICAgIG5vdCBhIHZhbGlkIGluZGV4LgotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ1NTUnVsZSkgaXRlbUltcGwoaW5kZXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNmRkNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2VsZWN0b3JBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvckNvbWJpbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU2VsZWN0b3IgaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3IgewotCi0JcHJpdmF0ZSBpbnQgZlNwZWNpZmljaXR5ID0gLTE7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZUb2tlbnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSXRlbXMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmUGFyc2VFcnJvcnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmTmFtZUVycm9ycyA9IG51bGw7Ci0KLQlDU1NTZWxlY3RvcihMaXN0IHRva2VucykgewotCQlmVG9rZW5zID0gbmV3IEFycmF5TGlzdCh0b2tlbnMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqID09IG51bGwgfHwgdGhpcy5nZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNTU1NlbGVjdG9yIGZvcmVpZ24gPSAoQ1NTU2VsZWN0b3IpIG9iajsKLQotCQkvLyBpZiAoZlNwZWNpZmljaXR5ICE9IGZvcmVpZ24uZlNwZWNpZmljaXR5KSByZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGdldExlbmd0aCgpICE9IGZvcmVpZ24uZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIWdldEl0ZW0oaSkuZXF1YWxzKGZvcmVpZ24uZ2V0SXRlbShpKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElDU1NTZWxlY3Rvckl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGZJdGVtcyA9PSBudWxsKSB7Ci0JCQlmSXRlbXMgPSBwYXJzZVNlbGVjdG9yKGZUb2tlbnMpOwotCQl9Ci0JCWlmIChmSXRlbXMgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZkl0ZW1zLnNpemUoKSkgewotCQkJcmV0dXJuIChJQ1NTU2VsZWN0b3JJdGVtKSBmSXRlbXMuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSB7Ci0JCWlmIChmSXRlbXMgPT0gbnVsbCkgewotCQkJZkl0ZW1zID0gcGFyc2VTZWxlY3RvcihmVG9rZW5zKTsKLQkJfQotCQlyZXR1cm4gKGZJdGVtcyAhPSBudWxsKSA/IGZJdGVtcy5pdGVyYXRvcigpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAoZkl0ZW1zID09IG51bGwpIHsKLQkJCWZJdGVtcyA9IHBhcnNlU2VsZWN0b3IoZlRva2Vucyk7Ci0JCX0KLQkJcmV0dXJuIChmSXRlbXMgIT0gbnVsbCkgPyBmSXRlbXMuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudCkgZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy8gY2FzdCBlcnJvciBvciBudWxsIHBvaW50ZXIgLi4uCi0JCQllbGVtZW50ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgZ2V0UHJldmlvdXNFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlFbGVtZW50IHAgPSBudWxsOwotCQlmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlwID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIGEgc2VsZWN0b3IncyBzcGVjaWZpY2l0eSBhID0gdGhlIG51bWJlciBvZiBJRCBhdHRyaWJ1dGVzIGluCi0JICogdGhlIHNlbGVjdG9yIGIgPSB0aGUgbnVtYmVyIG9mIG90aGVyIGF0dHJpYnV0ZXMgYW5kIHBzZXVkby1jbGFzc2VzIGluCi0JICogdGhlIHNlbGVjdG9yIGMgPSB0aGUgbnVtYmVyIG9mIGVsZW1lbnQgbmFtZXMgaW4gdGhlIHNlbGVjdG9yIChpZ25vcmUKLQkgKiBwc2V1ZG8tZWxlbWVudHMpIENvbmNhdGVuYXRpbmcgdGhlIHRocmVlIG51bWJlcnMgYS1iLWMgKGluIGEgbnVtYmVyCi0JICogc3lzdGVtIHdpdGggYSBsYXJnZSBiYXNlKSBnaXZlcyB0aGUgc3BlY2lmaWNpdHkuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwZWNpZmljaXR5KCkgewotCQlpZiAoZlNwZWNpZmljaXR5IDwgMCkgewotCQkJaW50IG5JRHMgPSAwOwotCQkJaW50IG5BdHRyaWJ1dGVzID0gMDsKLQkJCWludCBuRWxlbWVudHMgPSAwOwotCQkJSXRlcmF0b3IgaSA9IGdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSAoSUNTU1NlbGVjdG9ySXRlbSkgaS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCQlDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciA9IChDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCQkJbklEcyArPSBzZWxlY3Rvci5nZXROdW1PZklEcygpOwotCQkJCQluQXR0cmlidXRlcyArPSBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKTsKLQkJCQkJbkF0dHJpYnV0ZXMgKz0gc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0JCQkJCW5BdHRyaWJ1dGVzICs9IHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKTsKLQkJCQkJaWYgKCFzZWxlY3Rvci5pc1VuaXZlcnNhbCgpKSB7Ci0JCQkJCQluRWxlbWVudHMrKzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZTcGVjaWZpY2l0eSA9IG5JRHMgKiAxMDAwMCArIG5BdHRyaWJ1dGVzICogMTAwICsgbkVsZW1lbnRzOwotCQl9Ci0KLQkJcmV0dXJuIGZTcGVjaWZpY2l0eTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUl0ZXJhdG9yIGkgPSBnZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGkubmV4dCgpOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSB7Ci0JCQkJCS8vIElmIGl0ZW0gaXMgREVTQ0VOREFOVCBjb21iaW5hdG9yLCBpdCBpcyBqdXN0IHNpbmdsZQotCQkJCQkvLyBzcGFjZS4KLQkJCQkJLy8gVGhlbiwgeW91IGRvbnQgaGF2ZSB0byBhcHBlbmQgc3RyaW5nLi4KLQkJCQkJaWYgKCgoQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSBpdGVtKS5nZXRDb21iaW5hdG9yVHlwZSgpICE9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVCkgewotCQkJCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWJ1Zi5hcHBlbmQoaXRlbS5nZXRTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJ1Zi5hcHBlbmQoaXRlbS5nZXRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJZkNhY2hlZFN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIGZDYWNoZWRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChvcmcudzNjLmRvbS5FbGVtZW50IGVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcgcHNldWRvTmFtZSkgewotCQlFbGVtZW50IHRhcmdldCA9IGVsZW1lbnQ7Ci0JCWNoYXIgY29tYmluYXRvclR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLlVOS05PV047Ci0JCUVsZW1lbnQgY2h1bmtTdGFydEVsZW1lbnQgPSBudWxsOyAvLyBmb3IgQ0hJTEQgYW5kIEFESkFDRU5UCi0JCQkJCQkJCQkJCS8vIGNvbWJpbmF0b3IKLQkJaW50IGNodW5rU3RhcnRJdGVtID0gLTE7IC8vIGZvciBDSElMRCBhbmQgQURKQUNFTlQgY29tYmluYXRvcgotCQlpbnQgbnVtSXRlbXMgPSBnZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaUl0ZW0gPSBudW1JdGVtcyAtIDE7IGlJdGVtID49IDA7IGlJdGVtLS0pIHsKLQkJCS8vIENoZWNrIFNlbGVjdG9yIEl0ZW1zCi0JCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSBnZXRJdGVtKGlJdGVtKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgSUNTU1NpbXBsZVNlbGVjdG9yKSB7Ci0JCQkJLy8gU2ltcGxlIFNlbGVjdG9yCi0JCQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKCFtYXRjaEV4YWN0bHkoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSwgdGFyZ2V0LCBwc2V1ZG9OYW1lKSkgewotCQkJCQlzd2l0Y2ggKGNvbWJpbmF0b3JUeXBlKSB7Ci0JCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVCA6Ci0JCQkJCQkJZG8gewotCQkJCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KHRhcmdldCk7Ci0JCQkJCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQkJd2hpbGUgKCFtYXRjaEV4YWN0bHkoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSwgdGFyZ2V0LCBwc2V1ZG9OYW1lKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQ0hJTEQgOgotCQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkFESkFDRU5UIDoKLQkJCQkJCQlpZiAoY2h1bmtTdGFydEVsZW1lbnQgIT0gbnVsbCAmJiBjaHVua1N0YXJ0RWxlbWVudCAhPSBlbGVtZW50KSB7Ci0JCQkJCQkJCS8vIHByZXZpb3VzIGNvbmJpbmF0b3IgbXVzdCBiZSBERVNDRU5ERU5ULgotCQkJCQkJCQkvLyBnb3RvIHBhcmVudAotCQkJCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KGNodW5rU3RhcnRFbGVtZW50KTsKLQkJCQkJCQkJaUl0ZW0gPSBjaHVua1N0YXJ0SXRlbSArIDE7Ci0JCQkJCQkJCWNodW5rU3RhcnRFbGVtZW50ID0gbnVsbDsKLQkJCQkJCQkJY2h1bmtTdGFydEl0ZW0gPSAtMTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJLy8gb3RoZXIgY29tYmluYXRvcnMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSB7Ci0JCQkJLy8gQ29tYmluYXRvciAoICIrIiwgIj4iLCAiICIsIC4uLikKLQkJCQlpZiAoaUl0ZW0gPT0gbnVtSXRlbXMgLSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGxhc3QgaXRlbSBpcyBjb21iaW5hdG9yCi0KLQkJCQlJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIHNjID0gKElDU1NTZWxlY3RvckNvbWJpbmF0b3IpIGl0ZW07Ci0JCQkJY29tYmluYXRvclR5cGUgPSBzYy5nZXRDb21iaW5hdG9yVHlwZSgpOwotCQkJCXN3aXRjaCAoY29tYmluYXRvclR5cGUpIHsKLQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQgOgotCQkJCQkJdGFyZ2V0ID0gZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRCA6Ci0JCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5BREpBQ0VOVCA6Ci0JCQkJCQlpZiAoY2h1bmtTdGFydEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkJCWNodW5rU3RhcnRFbGVtZW50ID0gdGFyZ2V0OwotCQkJCQkJCWNodW5rU3RhcnRJdGVtID0gaUl0ZW0gKyAxOyAvLyBzYWZlIGJlY2F1c2UgdGhpcwotCQkJCQkJCQkJCQkJCQkvLyBpcyBub3QgYSBsYXN0IGl0ZW0uCi0JCQkJCQl9Ci0JCQkJCQlpZiAoY29tYmluYXRvclR5cGUgPT0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5DSElMRCkgewotCQkJCQkJCXRhcmdldCA9IGdldFBhcmVudEVsZW1lbnQodGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXRhcmdldCA9IGdldFByZXZpb3VzRWxlbWVudCh0YXJnZXQpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2hhdCBpcyB0aGlzIGl0ZW0gPz8/Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIE9LIHRoaXMgc2VsZWN0b3IgbWFjaGVzIHRoZSBlbGVtZW50LgotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtYXRjaEV4YWN0bHkoSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCUlTdHlsZVNlbGVjdG9yQWRhcHRlciBhZGFwdGVyID0gKElTdHlsZVNlbGVjdG9yQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRBZGFwdGVyRm9yKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLm1hdGNoKHNlbGVjdG9yLCBlbGVtZW50LCBwc2V1ZG9OYW1lKTsKLQkJfQotCi0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBpOwotCQlTdHJpbmcga2V5OwotCi0JCS8vIFRPRE86IFBzZXVkb05hbWUKLQotCQkvLyBjaGVjayB0YWcgbmFtZQotCQlpZiAoIXNlbGVjdG9yLmlzVW5pdmVyc2FsKCkgJiYgIWVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoc2VsZWN0b3IuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZAotCQlpID0gc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlpZiAoaSA+IDEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJa2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGtleSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghc2VsZWN0b3IuZ2V0SUQoMCkuZXF1YWxzKGtleSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgY2xhc3MKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpOwotCQlpZiAoaSA+IDApIHsKLQkJCWtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihrZXkpOwotCQkJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCWlmIChzZWxlY3Rvci5nZXRDbGFzcyhpKS5lcXVhbHModG9rZW5pemVyLm5leHRUb2tlbigpKSkgewotCQkJCQkJb2sgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFvaykKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgYXR0cmlidXRlcwotCQlmb3IgKGkgPSBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWxlY3Rvci5nZXRBdHRyaWJ1dGUoaSksICI9fnwgXHRcclxuXGYiKTsvLyROT04tTkxTLTEkCi0JCQlpbnQgY291bnRUb2tlbnMgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJCWlmIChjb3VudFRva2VucyA+IDApIHsKLQkJCQlTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpZiAoYXR0clZhbHVlID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoY291bnRUb2tlbnMgPiAxKSB7Ci0JCQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oIj0gXHRcclxuXGYiKTsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1Rva2VuaXplciBhdHRyVmFsdWVUb2tlbml6ZXIgPSBudWxsOwotCQkJCQlpZiAodG9rZW4uZXF1YWxzKCJ+IikpIHsvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyVmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ8IikpIHsvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyVmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSwgIi0iKTsvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGF0dHJWYWx1ZVRva2VuaXplciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQkJCQl3aGlsZSAoYXR0clZhbHVlVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQlpZiAodG9rZW4uZXF1YWxzKGF0dHJWYWx1ZVRva2VuaXplci5uZXh0VG9rZW4oKSkpIHsKLQkJCQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghb2spCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmICghYXR0clZhbHVlLmVxdWFscyh0b2tlbikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHBhcnNlU2VsZWN0b3IoTGlzdCB0b2tlbnMpIHsKLQkJQ1NTU2VsZWN0b3JQYXJzZXIgcGFyc2VyID0gbmV3IENTU1NlbGVjdG9yUGFyc2VyKHRva2Vucyk7Ci0JCUxpc3Qgc2VsZWN0b3IgPSBwYXJzZXIuZ2V0U2VsZWN0b3IoKTsKLQkJSXRlcmF0b3IgaSA9IHBhcnNlci5nZXRFcnJvcnMoKTsKLQkJZlBhcnNlRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWZQYXJzZUVycm9ycy5hZGQoaS5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RvcjsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RXJyb3JzKCkgewotCQlpZiAoZk5hbWVFcnJvcnMgPT0gbnVsbCkgewotCQkJZk5hbWVFcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBpSXRlbSA9IGdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaUl0ZW0uaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGlJdGVtLm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIElDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCQlpZiAoISgoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtKS5pc1VuaXZlcnNhbCgpKSB7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9ICgoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtKS5nZXROYW1lKCk7Ci0JCQkJCQlpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKSkgewotCQkJCQkJCWZOYW1lRXJyb3JzLmFkZChpdGVtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoZlBhcnNlRXJyb3JzKTsKLQkJZXJyb3JzLmFkZEFsbChmTmFtZUVycm9ycyk7Ci0JCXJldHVybiBlcnJvcnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ1NTU2VsZWN0b3IjZ2V0RXJyb3JDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRFcnJvckNvdW50KCkgewotCQlpbnQgbkVycm9ycyA9IDA7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRFcnJvcnMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQluRXJyb3JzKys7Ci0JCQlpLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gbkVycm9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yQ29tYmluYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxNWFhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yQ29tYmluYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yQ29tYmluYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGV4dGVuZHMgQ1NTU2VsZWN0b3JJdGVtIGltcGxlbWVudHMgSUNTU1NlbGVjdG9yQ29tYmluYXRvciB7Ci0KLQljaGFyIGZUeXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5VTktOT1dOOwotCi0JLyoqCi0JICogQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENTU1NlbGVjdG9yQ29tYmluYXRvcihjaGFyIHR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJc2V0Q29tYmluYXRvclR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogPT0gbnVsbCB8fCB0aGlzLmdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGZvcmVpZ24gPSAoQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSBvYmo7Ci0KLQkJcmV0dXJuIChnZXRDb21iaW5hdG9yVHlwZSgpID09IGZvcmVpZ24uZ2V0Q29tYmluYXRvclR5cGUoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBjaGFyIGdldENvbWJpbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1UeXBlKCkgewotCQlyZXR1cm4gQ09NQklOQVRPUjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChmVHlwZSk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldENvbWJpbmF0b3JUeXBlKGNoYXIgdHlwZSkgewotCQlmVHlwZSA9IHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MzY2NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU1NlbGVjdG9ySXRlbSBpbXBsZW1lbnRzIElDU1NTZWxlY3Rvckl0ZW0gewotCi0JLyoqCi0JICogQ1NTU2VsZWN0b3JJdGVtIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENTU1NlbGVjdG9ySXRlbSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbVR5cGUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIzMWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1NlbGVjdG9yTGlzdEltcGwgaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3JMaXN0IHsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ2FjaGVkU3RyaW5nID0gbnVsbDsgLy8gbm9ybWFsaXplZCBzdHJpbmcKLQlwcml2YXRlIExpc3QgZlNlbGVjdG9ycyA9IG51bGw7Ci0KLQlwdWJsaWMgQ1NTU2VsZWN0b3JMaXN0SW1wbChTdHJpbmcgY3NzVGV4dCkgewotCQlzdXBlcigpOwotCQlmVGV4dCA9IGNzc1RleHQ7Ci0JCXBhcnNlU2VsZWN0b3JUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogPT0gbnVsbCB8fCB0aGlzLmdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ1NTU2VsZWN0b3JMaXN0SW1wbCBmb3JlaWduID0gKENTU1NlbGVjdG9yTGlzdEltcGwpIG9iajsKLQotCQlpZiAoZ2V0TGVuZ3RoKCkgIT0gZm9yZWlnbi5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmICghZ2V0U2VsZWN0b3IoaSkuZXF1YWxzKGZvcmVpZ24uZ2V0U2VsZWN0b3IoaSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3IgZ2V0U2VsZWN0b3IoaW50IGluZGV4KSB7Ci0JCUxpc3Qgc2VsZWN0b3JzID0gZ2V0U2VsZWN0b3JzKCk7Ci0JCWlmICgwIDw9IGluZGV4ICYmIGluZGV4IDwgc2VsZWN0b3JzLnNpemUoKSkgewotCQkJcmV0dXJuIChJQ1NTU2VsZWN0b3IpIHNlbGVjdG9ycy5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0U2VsZWN0b3JzKCkgewotCQlpZiAoZlNlbGVjdG9ycyA9PSBudWxsKSB7Ci0JCQlwYXJzZVNlbGVjdG9yVGV4dCgpOwotCQl9Ci0JCXJldHVybiBmU2VsZWN0b3JzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlpZiAoZkNhY2hlZFN0cmluZyA9PSBudWxsKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBiRmlyc3QgPSB0cnVlOwotCQkJLy8gZ3JvdXBzIGlzIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHNlbGVjdG9ycwotCQkJSXRlcmF0b3IgaSA9IGdldFNlbGVjdG9ycygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoIWJGaXJzdCkgewotCQkJCQlidWYuYXBwZW5kKCIsICIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJSUNTU1NlbGVjdG9yIGl0ZW0gPSAoSUNTU1NlbGVjdG9yKSBpLm5leHQoKTsKLQkJCQlidWYuYXBwZW5kKGl0ZW0uZ2V0U3RyaW5nKCkpOwotCQkJCWJGaXJzdCA9IGZhbHNlOwotCQkJfQotCQkJZkNhY2hlZFN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGVkU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2goRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQlpbnQgblNlbGVjdG9ycyA9IGdldExlbmd0aCgpOwotCQlmb3IgKGludCBpU2VsZWN0b3IgPSAwOyBpU2VsZWN0b3IgPCBuU2VsZWN0b3JzOyBpU2VsZWN0b3IrKykgewotCQkJLy8gQ2hlY2sgZWFjaCBTZWxlY3RvciBMaXN0cwotCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoaVNlbGVjdG9yKTsKLQkJCWlmIChzZWxlY3Rvci5tYXRjaChlbGVtZW50LCBwc2V1ZG9OYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlU2VsZWN0b3JUZXh0KCkgewotCQlmU2VsZWN0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZlRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfU1RZTEVTSEVFVCwgZlRleHQpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgdG9rZW5Hcm91cCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCUNTU1RleHRUb2tlbiB0b2tlbiA9IHRva2Vuc1tpXTsKLQkJCWlmICh0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IgJiYgMCA8IHRva2VuR3JvdXAuc2l6ZSgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENTU1NlbGVjdG9yKHRva2VuR3JvdXApOwotCQkJCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JCQkJCWZTZWxlY3RvcnMuYWRkKHNlbGVjdG9yKTsKLQkJCQl9Ci0JCQkJdG9rZW5Hcm91cC5jbGVhcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdG9rZW5Hcm91cC5hZGQodG9rZW5zW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAoMCA8IHRva2VuR3JvdXAuc2l6ZSgpKSB7Ci0JCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgQ1NTU2VsZWN0b3IodG9rZW5Hcm91cCk7Ci0JCQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotCQkJCWZTZWxlY3RvcnMuYWRkKHNlbGVjdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RXJyb3JzKCkgewotCQlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaVNlbGVjdG9yID0gZ2V0U2VsZWN0b3JzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlTZWxlY3Rvci5oYXNOZXh0KCkpIHsKLQkJCUl0ZXJhdG9yIGlFcnJvciA9ICgoSUNTU1NlbGVjdG9yKSBpU2VsZWN0b3IubmV4dCgpKS5nZXRFcnJvcnMoKTsKLQkJCXdoaWxlIChpRXJyb3IuaGFzTmV4dCgpKSB7Ci0JCQkJZXJyb3JzLmFkZChpRXJyb3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRFcnJvckNvdW50KCkgewotCQlpbnQgbkVycm9ycyA9IDA7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRFcnJvcnMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQluRXJyb3JzKys7Ci0JCQlpLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gbkVycm9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MDU2MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvclBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvckNvbWJpbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1NlbGVjdG9yUGFyc2VyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBJRExFID0gMDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQVRUUklCVVRFID0gMTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0lNUExFID0gMjsKLQotCXByaXZhdGUgTGlzdCBmVG9rZW5zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkl0ZW1zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkVycm9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTZWxlY3RvclBhcnNlcihMaXN0IHRva2VucykgewotCQlzdXBlcigpOwotCQlmVG9rZW5zID0gbmV3IEFycmF5TGlzdCh0b2tlbnMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUxpc3QgZ2V0U2VsZWN0b3IoKSB7Ci0JCWlmIChmSXRlbXMgPT0gbnVsbCkgewotCQkJcGFyc2VTZWxlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmSXRlbXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlU2VsZWN0b3IoKSB7Ci0JCWZJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IGF0dHJCdWYgPSBudWxsOwotCQlDU1NTaW1wbGVTZWxlY3RvciBpdGVtID0gbnVsbDsKLQotCQlpbnQgc3RhdHVzID0gSURMRTsKLQkJSXRlcmF0b3IgaSA9IGZUb2tlbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NUZXh0VG9rZW4gdG9rZW4gPSAoQ1NTVGV4dFRva2VuKSBpLm5leHQoKTsKLQkJCWlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCQljYXNlIElETEUgOgotCQkJCQlpZiAoaXNUYWcodG9rZW4pKSB7Ci0JCQkJCQlpdGVtID0gY3JlYXRlU2ltcGxlKCk7Ci0JCQkJCQlhcHBlbmRUYWcoaXRlbSwgdG9rZW4pOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzSUQodG9rZW4pKSB7Ci0JCQkJCQlpdGVtID0gY3JlYXRlU2ltcGxlKCk7Ci0JCQkJCQlhcHBlbmRJRChpdGVtLCB0b2tlbik7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNDbGFzcyh0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCWFwcGVuZENsYXNzKGl0ZW0sIHRva2VuKTsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc1BzZXVkbyh0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCWFwcGVuZFBzZXVkbyhpdGVtLCB0b2tlbik7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNBdHRyaWJ1dGVCZWdpbih0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCXN0YXR1cyA9IEFUVFJJQlVURTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWFkZEVycm9yKHRva2VuKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNJTVBMRSA6Ci0JCQkJCWlmIChpc0lEKHRva2VuKSkgewotCQkJCQkJYXBwZW5kSUQoaXRlbSwgdG9rZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzQ2xhc3ModG9rZW4pKSB7Ci0JCQkJCQlhcHBlbmRDbGFzcyhpdGVtLCB0b2tlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNQc2V1ZG8odG9rZW4pKSB7Ci0JCQkJCQlhcHBlbmRQc2V1ZG8oaXRlbSwgdG9rZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzQXR0cmlidXRlQmVnaW4odG9rZW4pKSB7Ci0JCQkJCQlzdGF0dXMgPSBBVFRSSUJVVEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNDb21iaW5hdG9yKHRva2VuKSkgeyAvLyBjb21iaW5hdG9yCi0JCQkJCQljbG9zZUl0ZW0oaXRlbSk7Ci0JCQkJCQljbG9zZUl0ZW0oY3JlYXRlQ29tYmluYXRvcih0b2tlbikpOwotCQkJCQkJc3RhdHVzID0gSURMRTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWFkZEVycm9yKHRva2VuKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEFUVFJJQlVURSA6Ci0JCQkJCWlmIChpc0F0dHJpYnV0ZUVuZCh0b2tlbikpIHsKLQkJCQkJCWFwcGVuZEF0dHJpYnV0ZShpdGVtLCBhdHRyQnVmKTsKLQkJCQkJCWF0dHJCdWYgPSBudWxsOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGF0dHJCdWYgPT0gbnVsbCkgewotCQkJCQkJCWF0dHJCdWYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlhdHRyQnVmLmFkZCh0b2tlbik7Ci0JCQkJCQlpZiAoIWlzQXR0cmlidXRlQ29udGVudCh0b2tlbikpIHsKLQkJCQkJCQlhZGRFcnJvcih0b2tlbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJY2xvc2VJdGVtKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyaWJ1dGVDb250ZW50KENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZUVuZChDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyaWJ1dGVCZWdpbihDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbWJpbmF0b3IoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUHNldWRvKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2xhc3MoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0lEKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUYWcoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04pOwotCX0KLQotCXByaXZhdGUgQ1NTU2ltcGxlU2VsZWN0b3IgY3JlYXRlU2ltcGxlKCkgewotCQlyZXR1cm4gbmV3IENTU1NpbXBsZVNlbGVjdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogaWYgIiAiIG9yICIrIiBvciAiPiIgYXBwZWFyZWQsIGNsb3NlIHNpbXBsZXNlbGVjdG9yIGFuZCBhZGQgbmV3Ci0JICogY29tYmluYXRvcgotCSAqLwotCXByaXZhdGUgQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGNyZWF0ZUNvbWJpbmF0b3IoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCWNoYXIgdHlwZSA9IDA7Ci0KLQkJU3RyaW5nIHN0ciA9IHRva2VuLmltYWdlOwotCQlpZiAoc3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7IC8vIHNwYWNlCi0JCQl0eXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5ERVNDRU5EQU5UOwotCQl9Ci0JCWVsc2UgaWYgKHN0ci5lcXVhbHMoIisiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0eXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5BREpBQ0VOVDsKLQkJfQotCQllbHNlIGlmIChzdHIuZXF1YWxzKCI+IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHlwZSA9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQ0hJTEQ7Ci0JCX0KLQotCQlpZiAoMCA8IHR5cGUpIHsKLQkJCXJldHVybiBuZXcgQ1NTU2VsZWN0b3JDb21iaW5hdG9yKHR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VJdGVtKElDU1NTZWxlY3Rvckl0ZW0gaXRlbSkgewotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlmSXRlbXMuYWRkKGl0ZW0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFRhZyhDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJaXRlbS5zZXROYW1lKHRva2VuLmltYWdlKTsKLQkJaWYgKHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04pIHsKLQkJCWFkZEVycm9yKHRva2VuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGlmICIjeHh4eCIgYXBwZWFyZWQsIGFkZCBJRCB0byBjdXJyZW50IHNlbGVjdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZElEKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdGV4dCA9IHRva2VuLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBpZENvbnRlbnQgPSB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpKTsKLQkJaXRlbS5hZGRJRChpZENvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIGlmICIueHh4eCIgYXBwZWFyZWQsIGFkZCBDbGFzcyB0byBjdXJyZW50IHNlbGVjdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENsYXNzKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdGV4dCA9IHRva2VuLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBjbGFzc0NvbnRlbnQgPSB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpKTsKLQkJaXRlbS5hZGRDbGFzcyhjbGFzc0NvbnRlbnQpOwotCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NDb250ZW50LmNoYXJBdCgwKSkpIHsKLQkJCWFkZEVycm9yKHRva2VuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGlmICI6eHh4eCIgYXBwZWFyZWQsIGFkZCBQc2V1ZG8oZWxlbWVudC9jbGFzcykgdG8gY3VycmVudCBzZWxlY3RvcgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRQc2V1ZG8oQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdG9rZW4udG9TdHJpbmcoKTsKLQkJU3RyaW5nIHBzZXVkb0NvbnRlbnQgPSB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpKTsKLQkJaXRlbS5hZGRQc2V1ZG9OYW1lKHBzZXVkb0NvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRBdHRyaWJ1dGUoQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgTGlzdCB0b2tlbnMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlDU1NUZXh0VG9rZW4gdG9rZW47Ci0JCUl0ZXJhdG9yIGkgPSB0b2tlbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQl0b2tlbiA9IChDU1NUZXh0VG9rZW4pIGkubmV4dCgpOwotCQkJYnVmLmFwcGVuZCh0b2tlbi5pbWFnZSk7Ci0JCX0KLQotCQlpdGVtLmFkZEF0dHJpYnV0ZShidWYudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JTGlzdCBnZXRTZWxlY3RvclRhZ3MoKSB7Ci0JCUxpc3QgdGFnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHRhZ0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEVycm9yKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlpZiAoZkVycm9ycyA9PSBudWxsKSB7Ci0JCQlmRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZFcnJvcnMuYWRkKHRva2VuKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvciBnZXRFcnJvcnMoKSB7Ci0JCXJldHVybiAoZkVycm9ycyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKSA6IGZFcnJvcnMuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NpbXBsZVNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NpbXBsZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MjhlOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTaW1wbGVTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTaW1wbGVTZWxlY3RvciBleHRlbmRzIENTU1NlbGVjdG9ySXRlbSBpbXBsZW1lbnRzIElDU1NTaW1wbGVTZWxlY3RvciB7Ci0KLQlwcml2YXRlIFN0cmluZyBmTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlN0cmluZ0J1ZiA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZQc2V1ZG9OYW1lID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkF0dHJpYnV0ZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZDbGFzcyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZJRCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NTaW1wbGVTZWxlY3RvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDU1NTaW1wbGVTZWxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKSB7Ci0JCWlmIChmQXR0cmlidXRlID09IG51bGwpIHsKLQkJCWZBdHRyaWJ1dGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZkF0dHJpYnV0ZS5hZGQoYXR0cmlidXRlKTsKLQkJYWRkVG9CdWYoIlsiKTsvLyROT04tTkxTLTEkCi0JCWFkZFRvQnVmKGF0dHJpYnV0ZSk7Ci0JCWFkZFRvQnVmKCJdIik7Ly8kTk9OLU5MUy0xJAotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFkZENsYXNzKFN0cmluZyBjbHMpIHsKLQkJaWYgKGZDbGFzcyA9PSBudWxsKSB7Ci0JCQlmQ2xhc3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZkNsYXNzLmFkZChjbHMpOwotCQlhZGRUb0J1ZigiLiIpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVG9CdWYoY2xzKTsKLQkJZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRJRChTdHJpbmcgaWQpIHsKLQkJaWYgKGZJRCA9PSBudWxsKSB7Ci0JCQlmSUQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZklELmFkZChpZCk7Ci0JCWFkZFRvQnVmKCIjIik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihpZCk7Ci0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkUHNldWRvTmFtZShTdHJpbmcgY2xzKSB7Ci0JCWlmIChmUHNldWRvTmFtZSA9PSBudWxsKSB7Ci0JCQlmUHNldWRvTmFtZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmUHNldWRvTmFtZS5hZGQoY2xzKTsKLQkJYWRkVG9CdWYoIjoiKTsvLyROT04tTkxTLTEkCi0JCWFkZFRvQnVmKGNscyk7Ci0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUb0J1ZihTdHJpbmcgc3RyKSB7Ci0JCWlmIChmU3RyaW5nQnVmID09IG51bGwpIHsKLQkJCWZTdHJpbmdCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQkJZlN0cmluZ0J1Zi5hcHBlbmQoc3RyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiA9PSBudWxsIHx8IHRoaXMuZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDU1NTaW1wbGVTZWxlY3RvciBmb3JlaWduID0gKENTU1NpbXBsZVNlbGVjdG9yKSBvYmo7Ci0KLQkJaWYgKGdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0TmFtZSgpKSAhPSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWludCBpOwotCi0JCS8vIGNvbXBhcmUgcHNldWRvLWNsYXNzZXMgLyBwc2V1ZG8tZWxlbWVudHMKLQkJaWYgKGdldE51bU9mUHNldWRvTmFtZXMoKSAhPSBmb3JlaWduLmdldE51bU9mUHNldWRvTmFtZXMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpID0gMDsgaSA8IGdldE51bU9mUHNldWRvTmFtZXMoKTsgaSsrKSB7Ci0JCQlpZiAoZ2V0UHNldWRvTmFtZShpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0UHNldWRvTmFtZShpKSkgIT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjb21wYXJlIGNsYXNzZXMKLQkJaWYgKGdldE51bU9mQ2xhc3NlcygpICE9IGZvcmVpZ24uZ2V0TnVtT2ZDbGFzc2VzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBnZXROdW1PZkNsYXNzZXMoKTsgaSsrKSB7Ci0JCQlpZiAoZ2V0Q2xhc3MoaSkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldENsYXNzKGkpKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNvbXBhcmUgSURzCi0JCWlmIChnZXROdW1PZklEcygpICE9IGZvcmVpZ24uZ2V0TnVtT2ZJRHMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpID0gMDsgaSA8IGdldE51bU9mSURzKCk7IGkrKykgewotCQkJaWYgKGdldElEKGkpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZm9yZWlnbi5nZXRJRChpKSkgIT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjb21wYXJlIEF0dHJpYnV0ZXMKLQkJaWYgKGdldE51bU9mQXR0cmlidXRlcygpICE9IGZvcmVpZ24uZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBnZXROdW1PZkF0dHJpYnV0ZXMoKTsgaSsrKSB7Ci0JCQlpZiAoZ2V0QXR0cmlidXRlKGkpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZm9yZWlnbi5nZXRBdHRyaWJ1dGUoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoaW50IGluZGV4KSB7Ci0JCWlmIChmQXR0cmlidXRlICE9IG51bGwgJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IGZBdHRyaWJ1dGUuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZkF0dHJpYnV0ZS5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzcyhpbnQgaW5kZXgpIHsKLQkJaWYgKGZDbGFzcyAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmQ2xhc3Muc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZkNsYXNzLmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKGludCBpbmRleCkgewotCQlpZiAoZklEICE9IG51bGwgJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IGZJRC5zaXplKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBmSUQuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbVR5cGUoKSB7Ci0JCXJldHVybiBTSU1QTEU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gKGZOYW1lICE9IG51bGwpID8gZk5hbWUgOiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZkF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiAoZkF0dHJpYnV0ZSAhPSBudWxsKSA/IGZBdHRyaWJ1dGUuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bU9mQ2xhc3NlcygpIHsKLQkJcmV0dXJuIChmQ2xhc3MgIT0gbnVsbCkgPyBmQ2xhc3Muc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bU9mSURzKCkgewotCQlyZXR1cm4gKGZJRCAhPSBudWxsKSA/IGZJRC5zaXplKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpIHsKLQkJcmV0dXJuIChmUHNldWRvTmFtZSAhPSBudWxsKSA/IGZQc2V1ZG9OYW1lLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBzZXVkb05hbWUoaW50IGluZGV4KSB7Ci0JCWlmIChmUHNldWRvTmFtZSAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmUHNldWRvTmFtZS5zaXplKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBmUHNldWRvTmFtZS5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlpZiAoZkNhY2hlZFN0cmluZyA9PSBudWxsKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihnZXROYW1lKCkpOwotCQkJaWYgKGZTdHJpbmdCdWYgIT0gbnVsbCkgewotCQkJCWJ1Zi5hcHBlbmQoZlN0cmluZ0J1Zi50b1N0cmluZygpKTsKLQkJCX0KLQkJCWZDYWNoZWRTdHJpbmcgPSBidWYudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZkNhY2hlZFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VuaXZlcnNhbCgpIHsKLQkJcmV0dXJuIChmTmFtZSA9PSBudWxsIHx8IGZOYW1lLmVxdWFscygiKiIpKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZOYW1lID0gbmFtZTsKLQkJZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YmYzODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8qKgotICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBleHRlbmRzIENTU05vZGVJbXBsIHsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ1NTQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDc3NUZXh0KCkgewotCQlpZiAoZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIGdlbmVyYXRlU291cmNlKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCkpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCXdoaWxlIChub2RlICE9IGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQkJc3RyLmFwcGVuZChub2RlLmdldFRleHQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0RW5kKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IGluZGV4KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQlmb3IgKGludCBpID0gaW5kZXg7IGkgPiAwOyBpLS0pIHsKLQkJCWlmIChub2RlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKSB7Ci0JCWlmIChmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCWludCBpID0gMDsKLQkJZm9yICg7IG5vZGUgIT0gbnVsbDsgaSsrKQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQlyZXR1cm4gaTsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlib29sZWFuIGluY2x1ZGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QpIHsKLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQotCQkvLyB2YWxpZGF0ZSByYW5nZSBvZiBwYXJhbWV0ZXJzCi0JCWlmIChmaXJzdCAhPSBudWxsICYmIGxhc3QgIT0gbnVsbCkgewotCQkJaWYgKGZpcnN0LmdldFN0YXJ0KCkgPiBsYXN0LmdldFN0YXJ0KCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmaXJzdDsKLQkJCQlmaXJzdCA9IGxhc3Q7Ci0JCQkJbGFzdCA9IG5vZGU7Ci0JCQl9Ci0JCX0KLQotCQkvLyB2YWxpZGF0ZSBtaW5lCi0JCWJvb2xlYW4gYiA9IHZhbGlkYXRlUmFuZ2UoKTsKLQkJYk1vZGlmaWVkID0gYiB8fCBiTW9kaWZpZWQ7Ci0KLQkJaWYgKGZpcnN0ICE9IG51bGwpIHsKLQkJCWlmIChnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgfHwgZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydCgpID4gZmlyc3QuZ2V0U3RhcnQoKSkgewotCQkJCXNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZpcnN0KTsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGxhc3QgIT0gbnVsbCkgewotCQkJaWYgKGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsIHx8IGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydCgpIDwgbGFzdC5nZXRTdGFydCgpKSB7Ci0JCQkJc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihsYXN0KTsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcmUtdmFsaWRhdGUKLQkJaWYgKGJNb2RpZmllZCkKLQkJCXZhbGlkYXRlUmFuZ2UoKTsKLQotCQlyZXR1cm4gYk1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3BhZ2F0ZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCi0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBiTW9kaWZpZWQ7Ci0KLQkJYm9vbGVhbiBiID0gcGFyZW50LmluY2x1ZGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQliTW9kaWZpZWQgPSBiIHx8IGJNb2RpZmllZDsKLQotCQlpZiAoYikKLQkJCXBhcmVudC5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkvLyBlbHNlIG5lZWQgbm90IHVwZGF0ZSByYW5nZSBvZiBhbmNlc3RvcnMKLQotCQlyZXR1cm4gYk1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjc3NUZXh0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzVGV4dChTdHJpbmcgY3NzVGV4dCkgewotCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0RW5kT2Zmc2V0KCkgLSBnZXRTdGFydE9mZnNldCgpLCBjc3NUZXh0KTsKLQkJfQotCQllbHNlCi0JCQlzdXBlci5zZXRDc3NUZXh0KGNzc1RleHQpOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUpIHsKLQkJaWYgKGZpcnN0Tm9kZSAhPSBudWxsKQotCQkJc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmlyc3ROb2RlKTsKLQkJaWYgKGxhc3ROb2RlICE9IG51bGwpCi0JCQlzZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGxhc3ROb2RlKTsKLQotCQlpZiAoZmlyc3ROb2RlID09IG51bGwgJiYgbGFzdE5vZGUgPT0gbnVsbCkgewotCQkJc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQlzZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgeyAvLyByYW5nZSB2YWxpZGF0aW9uCi0JCQl2YWxpZGF0ZVJhbmdlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVSYW5nZSgpIHsKLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQotCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCB8fCBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aGlzLmZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGhpcy5sYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMubGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMuZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSA+IHRoaXMubGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpKSB7Ci0JCQkJLy8gbmVlZCB0byBzd2FwIGZpcnN0IGZvciBsYXN0Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYk1vZGlmaWVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsSXRlbUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsSXRlbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhNWNjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbEl0ZW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5TdHlsZURlY2xJdGVtRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU3R5bGVEZWNsSXRlbUltcGwgZXh0ZW5kcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTU3R5bGVEZWNsSXRlbSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZlByb3BlcnR5TmFtZTsKLQotCS8qKgotCSAqIENTU1N0eWxlRGVjbEl0ZW1JbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTU3R5bGVEZWNsSXRlbUltcGwoQ1NTU3R5bGVEZWNsSXRlbUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJdGhpcy5mUHJvcGVydHlOYW1lID0gdGhhdC5mUHJvcGVydHlOYW1lOwotCX0KLQotCS8qKgotCSAqIENTU1N0eWxlRGVjbEl0ZW1JbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTU3R5bGVEZWNsSXRlbUltcGwoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCXB1YmxpYyBJQ1NTUHJpbWl0aXZlVmFsdWUgYXBwZW5kVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGluc2VydFZhbHVlQmVmb3JlKHZhbHVlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGNsb25lZCA9IG5ldyBDU1NTdHlsZURlY2xJdGVtSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlVmFsdWVTb3VyY2UoKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKHRoaXMpOwotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwgJiYgZm9ybWF0dGVyIGluc3RhbmNlb2YgU3R5bGVEZWNsSXRlbUZvcm1hdHRlcikKLQkJCXJldHVybiAoKFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIpIGZvcm1hdHRlcikuZm9ybWF0VmFsdWUodGhpcykudG9TdHJpbmcoKTsKLQkJZWxzZQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZQotCSAqLwotCXB1YmxpYyBDU1NWYWx1ZSBnZXRDU1NWYWx1ZSgpIHsKLQkJaW50IG5WYWx1ZSA9IGdldExlbmd0aCgpOwotCQlpZiAoblZhbHVlIDw9IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoblZhbHVlID09IDEpCi0JCQlyZXR1cm4gaXRlbSgwKTsKLQkJZWxzZQotCQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q1NTVmFsdWVUZXh0KCkgewotCQlpZiAoZ2V0Rmlyc3RDaGlsZCgpID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkvLyBjaGVjayB3aGV0aGVyIGNoaWxkcmVuIGhhcyBmbGF0bm9kZXMKLQkJSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCQlyZXR1cm4gZ2VuZXJhdGVWYWx1ZVNvdXJjZSgpOwotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBnZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgLSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIGdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJcmV0dXJuIG5vZGUuZ2V0VGV4dCgpLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldENzc1ZhbHVlVHlwZSgpIHsKLQkJcmV0dXJuIENTU19WQUxVRV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKQotCQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVERUNMSVRFTV9OT0RFOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByaW9yaXR5KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKElNUE9SVEFOVCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZlByb3BlcnR5TmFtZS50cmltKCk7Ci0JCXJldHVybiBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKG5hbWUpICE9IG51bGwgPyBmUHJvcGVydHlOYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpIDogbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHJlZlZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgaW5zZXJ0VmFsdWVCZWZvcmUoSUNTU1ByaW1pdGl2ZVZhbHVlIG5ld1ZhbHVlLCBJQ1NTUHJpbWl0aXZlVmFsdWUgcmVmVmFsdWUpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIG5ld1ZhbHVlLCAoQ1NTTm9kZUltcGwpIHJlZlZhbHVlKTsKLQkJcmV0dXJuIChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBDU1NWYWx1ZSBpdGVtKGludCBpbmRleCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJCWlmIChpKysgPT0gaW5kZXgpCi0JCQkJCXJldHVybiAoQ1NTVmFsdWUpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCXB1YmxpYyBJQ1NTUHJpbWl0aXZlVmFsdWUgcmVtb3ZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJSUNTU05vZGUgbm9kZSA9IHJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgdmFsdWUpOwotCQlyZXR1cm4gKElDU1NQcmltaXRpdmVWYWx1ZSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlwdWJsaWMgSUNTU1ByaW1pdGl2ZVZhbHVlIHJlcGxhY2VWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgbmV3VmFsdWUsIElDU1NQcmltaXRpdmVWYWx1ZSBvbGRWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ld1ZhbHVlOwotCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkKLQkJCWluc2VydFZhbHVlQmVmb3JlKG5ld1ZhbHVlLCBvbGRWYWx1ZSk7Ci0JCXJldHVybiByZW1vdmVWYWx1ZShvbGRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1ZhbHVlVGV4dChTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlJQ1NTTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCUlDU1NOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQkJcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBjaGlsZCk7Ci0JCQl9Ci0JCQljaGlsZCA9IG5leHQ7Ci0JCX0KLQkJc2V0Q3NzVmFsdWVUZXh0Q29yZSh2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENzc1ZhbHVlVGV4dENvcmUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gdXNlIHRlbXBvcmFyeSBkb2N1bWVudAotCQlzeW5jaHJvbml6ZWQgKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsLmNsYXNzKSB7Ci0JCQlpZiAoc2hhcmVkU3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbmV3IENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JCQkJc2hhcmVkU3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkoKENTU1NvdXJjZVBhcnNlcikgc2hhcmVkU3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKS5zZXRQYXJzZXJNb2RlKENTU1NvdXJjZVBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFKTsKLQotCQkJfQotCQkJc2hhcmVkU3RydWN0dXJlZERvY3VtZW50LnNldCh2YWx1ZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChub2RlLmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIgaXRlbVBhcnNlciA9IG5ldyBDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIoZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWl0ZW1QYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50VGVtcG9yYXJ5KHRydWUpOwotCQkJLy8gbWFrZSBhIGNvcHkgb2Ygbm9kZWxpc3QgYmVjYXVzZSBzZXR1cFZhbHVlcyB3aWxsIGRlc3Ryb3kgbGlzdAotCQkJSVRleHRSZWdpb25MaXN0IG5vZGVMaXN0ID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChub2RlLmdldFJlZ2lvbnMoKSk7Ci0JCQlpdGVtUGFyc2VyLnNldHVwVmFsdWVzKHRoaXMsIG5vZGUsIG5vZGVMaXN0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc2hhcmVkU3RydWN0dXJlZERvY3VtZW50OwotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ByaW9yaXR5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoamF2YS5sYW5nLlN0cmluZyBuZXdQcmlvcml0eSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShJTVBPUlRBTlQsIG5ld1ByaW9yaXR5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1NjQ4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQgewotCi0JcHJvdGVjdGVkIElDU1NEb2N1bWVudCBmT3duZXJEb2N1bWVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUNoaWxkTm9kZXMoSUNTU05vZGUgc3JjLCBJQ1NTTm9kZSBkZXN0KSB7Ci0JCWlmIChmT3duZXJEb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEoZGVzdCBpbnN0YW5jZW9mIENTU05vZGVJbXBsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ1NTTm9kZUltcGwgY29udGFpbmVyID0gKENTU05vZGVJbXBsKSBkZXN0OwotCQljb250YWluZXIucmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBzcmMuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsKSB7Ci0JCQkJLy8gZXh0cmFjdCBzaG9ydGhhbmQgcHJvcGVydHkgLi4KLQkJCQkvLyAtLT4gVGVtcAotCQkJCUlDU1NOb2RlIGNsb25lZCA9IGNoaWxkLmNsb25lTm9kZShmYWxzZSk7Ci0JCQkJaWYgKGNsb25lZCBpbnN0YW5jZW9mIENTU05vZGVJbXBsKSB7Ci0JCQkJCSgoQ1NTTm9kZUltcGwpIGNsb25lZCkuc2V0T3duZXJEb2N1bWVudChmT3duZXJEb2N1bWVudCk7Ci0JCQkJCWNvbnRhaW5lci5hcHBlbmRDaGlsZCgoQ1NTTm9kZUltcGwpIGNsb25lZCk7Ci0JCQkJCWNsb25lQ2hpbGROb2RlcyhjaGlsZCwgY2xvbmVkKTsKLQkJCQl9Ci0JCQkJLy8gPC0tIFRlbXAKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlDU1NOb2RlIGNsb25lZCA9IGNoaWxkLmNsb25lTm9kZShmYWxzZSk7Ci0JCQkJaWYgKGNsb25lZCBpbnN0YW5jZW9mIENTU05vZGVJbXBsKSB7Ci0JCQkJCSgoQ1NTTm9kZUltcGwpIGNsb25lZCkuc2V0T3duZXJEb2N1bWVudChmT3duZXJEb2N1bWVudCk7Ci0JCQkJCWNvbnRhaW5lci5hcHBlbmRDaGlsZCgoQ1NTTm9kZUltcGwpIGNsb25lZCk7Ci0JCQkJCWNsb25lQ2hpbGROb2RlcyhjaGlsZCwgY2xvbmVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZVN0eWxlRGVjbGFyYXRpb24oKSB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIGRlY2wgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwodHJ1ZSk7Ci0JCWRlY2wuc2V0T3duZXJEb2N1bWVudChkZWNsKTsKLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYWVkNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIGV4dGVuZHMgQ1NTRG9jdW1lbnRJbXBsIGltcGxlbWVudHMgSUNTU1N0eWxlRGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBib29sZWFuIGZJc0RvY3VtZW50OwotCi0JQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJdGhpcy5mSXNEb2N1bWVudCA9IHRoYXQuZklzRG9jdW1lbnQ7Ci0JCWlmIChmSXNEb2N1bWVudCkgewotCQkJc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJfQotCX0KLQotCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsKGJvb2xlYW4gaXNEb2N1bWVudCkgewotCQlzdXBlcigpOwotCQlmSXNEb2N1bWVudCA9IGlzRG9jdW1lbnQ7Ci0JCWlmIChmSXNEb2N1bWVudCkgewotCQkJc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIGNsb25lZCA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JcHVibGljIElDU1NTdHlsZURlY2xJdGVtIGdldERlY2xJdGVtTm9kZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXRMYXN0Q2hpbGQoKTsKLQkJcHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lLnRyaW0oKTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCkgewotCQkJCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSAoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGU7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCkudHJpbSgpKSA9PSAwKQotCQkJCQlyZXR1cm4gaXRlbTsKLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWludCBpID0gMDsKLQkJSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCkKLQkJCQlpKys7Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBTVFlMRURFQ0xBUkFUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIENTUyBydWxlIHRoYXQgY29udGFpbnMgdGhpcyBkZWNsYXJhdGlvbiBibG9jayBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIHRoaXMgPGNvZGU+Q1NTU3R5bGVEZWNsYXJhdGlvbjwvY29kZT4gaXMgbm90IGF0dGFjaGVkIHRvIGEKLQkgKiA8Y29kZT5DU1NSdWxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBnZXRQYXJlbnRSdWxlKCkgewotCQlJQ1NTTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NSdWxlKQotCQkJcmV0dXJuIChDU1NSdWxlKSBwYXJlbnQ7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgb2YgYSBDU1MKLQkgKiBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCB3aXRoaW4gdGhpcyBkZWNsYXJhdGlvbiBibG9jay4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBhIHNob3J0aGFuZAotCSAqIHByb3BlcnR5LiBTaG9ydGhhbmQgcHJvcGVydHkgdmFsdWVzIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZAotCSAqIGFzIHN0cmluZ3MsIHVzaW5nIHRoZSA8Y29kZT5nZXRQcm9wZXJ0eVZhbHVlPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5zZXRQcm9wZXJ0eTwvY29kZT4gbWV0aG9kcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldAotCSAqICAgICAgICAgZm9yIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0LgotCSAqLwotCXB1YmxpYyBDU1NWYWx1ZSBnZXRQcm9wZXJ0eUNTU1ZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IGdldERlY2xJdGVtTm9kZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJcmV0dXJuIGl0ZW0uZ2V0Q1NTVmFsdWUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgcHJpb3JpdHkgb2YgYSBDU1MgcHJvcGVydHkgKGUuZy4gdGhlCi0JICogPGNvZGU+ImltcG9ydGFudCI8L2NvZGU+IHF1YWxpZmllcikgaWYgdGhlIHByb3BlcnR5IGhhcyBiZWVuCi0JICogZXhwbGljaXRseSBzZXQgaW4gdGhpcyBkZWNsYXJhdGlvbiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJpb3JpdHkgKGUuZy4KLQkgKiAgICAgICAgIDxjb2RlPiJpbXBvcnRhbnQiPC9jb2RlPikgaWYgb25lIGV4aXN0cy4gVGhlIGVtcHR5IHN0cmluZyBpZgotCSAqICAgICAgICAgbm9uZSBleGlzdHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVByaW9yaXR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IGdldERlY2xJdGVtTm9kZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJcmV0dXJuIGl0ZW0uZ2V0UHJpb3JpdHkoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2YgYSBDU1MgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseQotCSAqIHNldCB3aXRoaW4gdGhpcyBkZWNsYXJhdGlvbiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgQ1NTIHByb3BlcnR5LiBTZWUgdGhlIENTUyBwcm9wZXJ0eSBpbmRleC4KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldAotCSAqICAgICAgICAgZm9yIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suIFJldHVybnMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGUKLQkgKiAgICAgICAgIHByb3BlcnR5IGhhcyBub3QgYmVlbiBzZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJQ1NTVmFsdWUgdmFsdWUgPSBnZXRQcm9wZXJ0eUNTU1ZhbHVlKHByb3BlcnR5TmFtZSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJcmV0dXJuICgoSUNTU1ZhbHVlKSB2YWx1ZSkuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmSXNEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgc2V0IGluIHRoaXMKLQkgKiBkZWNsYXJhdGlvbiBibG9jay4gVGhlIG9yZGVyIG9mIHRoZSBwcm9wZXJ0aWVzIHJldHJpZXZlZCB1c2luZyB0aGlzCi0JICogbWV0aG9kIGRvZXMgbm90IGhhdmUgdG8gYmUgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBzZXQuIFRoaXMKLQkgKiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIGFsbCBwcm9wZXJ0aWVzIGluIHRoaXMgZGVjbGFyYXRpb24KLQkgKiBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IG9mIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIHJldHJpZXZlLgotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGF0IHRoaXMgb3JkaW5hbCBwb3NpdGlvbi4gVGhlIGVtcHR5Ci0JICogICAgICAgICBzdHJpbmcgaWYgbm8gcHJvcGVydHkgZXhpc3RzIGF0IHRoaXMgcG9zaXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBpdGVtKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGkgPSAwOwotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbEl0ZW1JbXBsKSB7Ci0JCQkJaWYgKGkgIT0gaW5kZXgpCi0JCQkJCWkrKzsKLQkJCQllbHNlIHsKLQkJCQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgaXRlbSA9IChDU1NTdHlsZURlY2xJdGVtSW1wbCkgbm9kZTsKLQkJCQkJcmV0dXJuIGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbEl0ZW0gcmVtb3ZlRGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG9sZERlY2wpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gKElDU1NTdHlsZURlY2xJdGVtKSByZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIG9sZERlY2wpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmVtb3ZlIGEgQ1NTIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IHdpdGhpbiB0aGlzCi0JICogZGVjbGFyYXRpb24gYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQKLQkgKiAgICAgICAgIGZvciB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlCi0JICogICAgICAgICBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0IG9yIHRoZSBwcm9wZXJ0eSBuYW1lIGRvZXMgbm90Ci0JICogICAgICAgICBjb3JyZXNwb25kIHRvIGEga25vd24gQ1NTIHByb3BlcnR5LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBkZWNsYXJhdGlvbgotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5IG9yIHRoZSBwcm9wZXJ0eSBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlbW92ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gZ2V0RGVjbEl0ZW1Ob2RlKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCXJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgaXRlbSk7Ci0JCQlyZXR1cm4gaXRlbS5nZXRDc3NUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NTdHlsZURlY2xJdGVtIHNldERlY2xJdGVtTm9kZShJQ1NTU3R5bGVEZWNsSXRlbSBuZXdEZWNsKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld0RlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSBnZXREZWNsSXRlbU5vZGUobmV3RGVjbC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWlmIChpdGVtICE9IG51bGwpCi0JCQlyZXR1cm4gKElDU1NTdHlsZURlY2xJdGVtKSByZXBsYWNlQ2hpbGQoKENTU05vZGVJbXBsKSBuZXdEZWNsLCAoQ1NTTm9kZUltcGwpIGl0ZW0pOwotCQllbHNlCi0JCQlyZXR1cm4gKElDU1NTdHlsZURlY2xJdGVtKSBhcHBlbmRDaGlsZCgoQ1NTTm9kZUltcGwpIG5ld0RlY2wpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWUgYW5kIHByaW9yaXR5IHdpdGhpbiB0aGlzIGRlY2xhcmF0aW9uCi0JICogYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLQkgKiBAcGFyYW0gcHJpb3JpdHkKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgcHJpb3JpdHkgb2YgdGhlIHByb3BlcnR5IChlLmcuCi0JICogICAgICAgICAgICA8Y29kZT4iaW1wb3J0YW50IjwvY29kZT4pLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaGFzIGEgc3ludGF4Ci0JICogICAgICAgICAgICAgICAgZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGRlY2xhcmF0aW9uCi0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkgb3IgdGhlIHByb3BlcnR5IGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIHByaW9yaXR5KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFlvdSBjYW4gdXNlIHRoaXMgb25seSBpZiBDU1NWYWx1ZS5zZXRDc3NUZXh0KCkgaXMgaW1wbGVtZW50ZWQKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgaXRlbSA9IChDU1NTdHlsZURlY2xJdGVtSW1wbCkgZ2V0RGVjbEl0ZW1Ob2RlKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCWl0ZW0gPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NTdHlsZURlY2xJdGVtKHByb3BlcnR5TmFtZSk7Ci0JCQlhcHBlbmRDaGlsZChpdGVtKTsKLQkJfQotCi0JCS8vIElDU1NOb2RlIG5leHQgPSBpdGVtLmdldE5leHRTaWJsaW5nKCk7Ci0JCS8vIHJlbW92ZUNoaWxkKGl0ZW0pOwotCi0JCWl0ZW0uc2V0Q3NzVmFsdWVUZXh0KHZhbHVlKTsKLQkJaXRlbS5zZXRQcmlvcml0eShwcmlvcml0eSk7Ci0KLQkJLy8gaW5zZXJ0QmVmb3JlKGl0ZW0sIChDU1NOb2RlSW1wbCluZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY2ZjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1N0eWxlUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlRGVjbENvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NTdHlsZVJ1bGUgewotCi0JSUNTU1NlbGVjdG9yTGlzdCBmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwobnVsbCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU1N0eWxlUnVsZUltcGwoQ1NTU3R5bGVSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1N0eWxlUnVsZUltcGwgY2xvbmVkID0gbmV3IENTU1N0eWxlUnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBleHRyYWN0UHJlU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFUlVMRV9OT0RFOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3JMaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJcmV0dXJuIGZTZWxlY3Rvckxpc3Q7Ci0JfQotCi0JLyoqCi0JICogVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlbGVjdG9yIGZvciB0aGUgcnVsZSBzZXQuIFRoZQotCSAqIGltcGxlbWVudGF0aW9uIG1heSBoYXZlIHN0cmlwcGVkIG91dCBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2Ugd2hpbGUKLQkgKiBwYXJzaW5nIHRoZSBzZWxlY3Rvci4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIENTUyBzdHJpbmcgdmFsdWUgaGFzCi0JICogICAgICAgICAgICAgICAgYSBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHJ1bGUgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVGV4dCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShTRUxFQ1RPUik7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RvclRleHQoU3RyaW5nIHNlbGVjdG9yVGV4dCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShTRUxFQ1RPUiwgc2VsZWN0b3JUZXh0KTsKLQkJZlNlbGVjdG9yTGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKHNlbGVjdG9yVGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVNoZWV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVNoZWV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzMxZmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVTaGVldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRSdWxlQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTdHlsZVNoZWV0SW1wbCBleHRlbmRzIENTU0RvY3VtZW50SW1wbCBpbXBsZW1lbnRzIElDU1NTdHlsZVNoZWV0IHsKLQotCi0JY2xhc3MgSW50ZXJuYWxOb2RlTGlzdCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLQotCQlWZWN0b3Igbm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlpZiAobm9kZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gMDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaSkgewotCQkJaWYgKG5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoaSA8IDAgfHwgbm9kZXMuc2l6ZSgpIDw9IGkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKE5vZGUpIG5vZGVzLmdldChpKTsKLQkJfQotCX0KLQotCWNsYXNzIEludGVybmFsU3R5bGVTaGVldExpc3QgZXh0ZW5kcyBBYnN0cmFjdENTU05vZGVMaXN0IGltcGxlbWVudHMgU3R5bGVTaGVldExpc3QgewotCi0JCXB1YmxpYyBJQ1NTTm9kZSBhcHBlbmROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJCWlmIChub2RlcyA9PSBudWxsIHx8ICFub2Rlcy5jb250YWlucyhub2RlKSkKLQkJCQlyZXR1cm4gc3VwZXIuYXBwZW5kTm9kZShub2RlKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBTdHlsZVNoZWV0IGl0ZW0oaW50IGkpIHsKLQkJCXJldHVybiAoU3R5bGVTaGVldCkgaXRlbUltcGwoaSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkRpc2FibGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZVNoZWV0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQl9Ci0KLQlDU1NTdHlsZVNoZWV0SW1wbChDU1NTdHlsZVNoZWV0SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQlzZXRPd25lckRvY3VtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIGFwcGVuZFJ1bGUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChydWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSBhcHBlbmRDaGlsZCgoQ1NTTm9kZUltcGwpIHJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1N0eWxlU2hlZXRJbXBsIGNsb25lZCA9IG5ldyBDU1NTdHlsZVNoZWV0SW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTQ2hhcnNldFJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU0NoYXJzZXRSdWxlIGNyZWF0ZUNTU0NoYXJzZXRSdWxlKCkgewotCQlDU1NDaGFyc2V0UnVsZUltcGwgcnVsZSA9IG5ldyBDU1NDaGFyc2V0UnVsZUltcGwoKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGUKLQkgKi8KLQlwdWJsaWMgQ1NTRm9udEZhY2VSdWxlIGNyZWF0ZUNTU0ZvbnRGYWNlUnVsZSgpIHsKLQkJQ1NTRm9udEZhY2VSdWxlSW1wbCBydWxlID0gbmV3IENTU0ZvbnRGYWNlUnVsZUltcGwoKTsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgc3R5bGUgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLQotCQlydWxlLmFwcGVuZENoaWxkKHN0eWxlKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU0ltcG9ydFJ1bGUgY3JlYXRlQ1NTSW1wb3J0UnVsZSgpIHsKLQkJQ1NTSW1wb3J0UnVsZUltcGwgcnVsZSA9IG5ldyBDU1NJbXBvcnRSdWxlSW1wbCgpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhID0gKE1lZGlhTGlzdEltcGwpIGNyZWF0ZU1lZGlhTGlzdCgpOwotCi0JCXJ1bGUuYXBwZW5kQ2hpbGQobWVkaWEpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuSUNTU01lZGlhUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTTWVkaWFSdWxlIGNyZWF0ZUNTU01lZGlhUnVsZSgpIHsKLQkJQ1NTTWVkaWFSdWxlSW1wbCBydWxlID0gbmV3IENTU01lZGlhUnVsZUltcGwoKTsKLQkJTWVkaWFMaXN0SW1wbCBtZWRpYSA9IChNZWRpYUxpc3RJbXBsKSBjcmVhdGVNZWRpYUxpc3QoKTsKLQotCQlydWxlLmluc2VydEJlZm9yZShtZWRpYSwgKENTU05vZGVJbXBsKSBydWxlLmdldEZpcnN0Q2hpbGQoKSk7IC8vIG1lZGlhCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyB0b3AKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBjaGlsZHJlbgotCQkJCQkJCQkJCQkJCQkJCQkJLy8gbGlzdAotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU1BhZ2VSdWxlIGNyZWF0ZUNTU1BhZ2VSdWxlKCkgewotCQlDU1NQYWdlUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NQYWdlUnVsZUltcGwoKTsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgc3R5bGUgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLQotCQlydWxlLmFwcGVuZENoaWxkKHN0eWxlKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGNyZWF0ZUNTU1J1bGUoU3RyaW5nIHJ1bGUpIHsKLQkJQ1NTRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbmV3IENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnNldChydWxlKTsKLQotCQkvL0NTU01vZGVsUGFyc2VyIG1vZGVsUGFyc2VyID0gbmV3IENTU01vZGVsUGFyc2VyKChDU1NEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCUNTU01vZGVsUGFyc2VyIG1vZGVsUGFyc2VyID0gbmV3IENTU01vZGVsUGFyc2VyKGdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCXJldHVybiBtb2RlbFBhcnNlci5jcmVhdGVDU1NSdWxlKHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZGVjbCA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbChmYWxzZSk7Ci0JCWRlY2wuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlUnVsZSBjcmVhdGVDU1NTdHlsZVJ1bGUoKSB7Ci0JCUNTU1N0eWxlUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NTdHlsZVJ1bGVJbXBsKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHN0eWxlID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkJcnVsZS5hcHBlbmRDaGlsZChzdHlsZSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZQotCSAqLwotCXB1YmxpYyBDU1NVbmtub3duUnVsZSBjcmVhdGVDU1NVbmtub3duUnVsZSgpIHsKLQkJQ1NTVW5rbm93blJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTVW5rbm93blJ1bGVJbXBsKCk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdAotCSAqLwotCXB1YmxpYyBNZWRpYUxpc3QgY3JlYXRlTWVkaWFMaXN0KCkgewotCQlNZWRpYUxpc3RJbXBsIG1lZGlhID0gbmV3IE1lZGlhTGlzdEltcGwoKTsKLQkJbWVkaWEuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gbWVkaWE7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBkZWxldGUgYSBydWxlIGZyb20gdGhlIHN0eWxlIHNoZWV0LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGxpc3Qgb2YgdGhlIHJ1bGUgdG8KLQkgKiAgICAgICAgICAgIHJlbW92ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBkb2VzIG5vdAotCSAqICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gYSBydWxlIGluIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUgbGlzdC4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBzdHlsZSBzaGVldAotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVJ1bGUoaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IGdldEluZGV4ZWRSdWxlKGluZGV4KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBsaXN0IG9mIGFsbCBDU1MgcnVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQuIFRoaXMKLQkgKiBpbmNsdWRlcyBib3RoIHJ1bGUgc2V0cyBhbmQgYXQtcnVsZXMuCi0JICovCi0JcHVibGljIENTU1J1bGVMaXN0IGdldENzc1J1bGVzKCkgewotCQlDU1NSdWxlTGlzdEltcGwgbGlzdCA9IG5ldyBDU1NSdWxlTGlzdEltcGwoKTsKLQotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJbGlzdC5hcHBlbmROb2RlKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBzdHlsZSBzaGVldCBpcyBhcHBsaWVkIHRvIHRoZSBkb2N1bWVudC4KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyBub3QuIE1vZGlmeWluZyB0aGlzIGF0dHJpYnV0ZSBtYXkgY2F1c2UgYQotCSAqIG5ldyByZXNvbHV0aW9uIG9mIHN0eWxlIGZvciB0aGUgZG9jdW1lbnQuIEEgc3R5bGVzaGVldCBvbmx5IGFwcGxpZXMgaWYKLQkgKiBib3RoIGFuIGFwcHJvcHJpYXRlIG1lZGl1bSBkZWZpbml0aW9uIGlzIHByZXNlbnQgYW5kIHRoZSBkaXNhYmxlZAotCSAqIGF0dHJpYnV0ZSBpcyBmYWxzZS4gU28sIGlmIHRoZSBtZWRpYSBkb2Vzbid0IGFwcGx5IHRvIHRoZSBjdXJyZW50IHVzZXIKLQkgKiBhZ2VudCwgdGhlIDxjb2RlPmRpc2FibGVkPC9jb2RlPiBhdHRyaWJ1dGUgaXMgaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREaXNhYmxlZCgpIHsKLQkJcmV0dXJuIGZEaXNhYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3R5bGUgc2hlZXQgaXMgYSBsaW5rZWQgc3R5bGUgc2hlZXQsIHRoZSB2YWx1ZSBvZiBpdHMgYXR0cmlidXRlCi0JICogaXMgaXRzIGxvY2F0aW9uLiBGb3IgaW5saW5lIHN0eWxlIHNoZWV0cywgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlCi0JICogaXMgPGNvZGU+bnVsbDwvY29kZT4uIFNlZSB0aGUgaHJlZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlCi0JICogPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudCBpbiBIVE1MIDQuMCwgYW5kIHRoZSBocmVmIHBzZXVkby1hdHRyaWJ1dGUKLQkgKiBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldCBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCXJldHVybiBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCS8qCi0JCQkgKiBPYmplY3QgaWQgPSBtb2RlbC5nZXRJZCgpOyBpZiAoaWQgIT0gbnVsbCkgeyBpZiAoaWQgaW5zdGFuY2VvZgotCQkJICogSVJlc291cmNlKSB7IC8vIFRPRE86IG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGlzIGlzIGNvcnJlY3Qgb3IKLQkJCSAqIG5vdCwgbGF0ZXIuIHJldHVybiAoKElSZXNvdXJjZSlpZCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOyB9Ci0JCQkgKiByZXR1cm4gaWQudG9TdHJpbmcoKTsgfQotCQkJICovfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlDU1NSdWxlSW1wbCBnZXRJbmRleGVkUnVsZShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBpID0gMDsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCWlmIChpKysgPT0gaW5kZXgpCi0JCQkJCXJldHVybiAoQ1NTUnVsZUltcGwpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGludGVuZGVkIGRlc3RpbmF0aW9uIG1lZGlhIGZvciBzdHlsZSBpbmZvcm1hdGlvbi4gVGhlIG1lZGlhIGlzCi0JICogb2Z0ZW4gc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5vd25lck5vZGU8L2NvZGU+LiBJZiBubyBtZWRpYSBoYXMgYmVlbgotCSAqIHNwZWNpZmllZCwgdGhlIDxjb2RlPk1lZGlhTGlzdDwvY29kZT4gd2lsbCBiZSBlbXB0eS4gU2VlIHRoZSBtZWRpYQotCSAqIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUgPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudCBpbiBIVE1MIDQuMCwKLQkgKiBhbmQgdGhlIG1lZGlhIHBzZXVkby1hdHRyaWJ1dGUgZm9yIHRoZSBYTUwgc3R5bGUgc2hlZXQgcHJvY2Vzc2luZwotCSAqIGluc3RydWN0aW9uIC4gTW9kaWZ5aW5nIHRoZSBtZWRpYSBsaXN0IG1heSBjYXVzZSBhIGNoYW5nZSB0byB0aGUKLQkgKiBhdHRyaWJ1dGUgPGNvZGU+ZGlzYWJsZWQ8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZWRpYUxpc3QgZ2V0TWVkaWEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBTVFlMRVNIRUVUX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIG5vZGUgdGhhdCBhc3NvY2lhdGVzIHRoaXMgc3R5bGUgc2hlZXQgd2l0aCB0aGUgZG9jdW1lbnQuIEZvciBIVE1MLAotCSAqIHRoaXMgbWF5IGJlIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlPkxJTks8L2NvZGU+IG9yIDxjb2RlPlNUWUxFPC9jb2RlPgotCSAqIGVsZW1lbnQuIEZvciBYTUwsIGl0IG1heSBiZSB0aGUgbGlua2luZyBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiBGb3IKLQkgKiBzdHlsZSBzaGVldHMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgb3RoZXIgc3R5bGUgc2hlZXRzLCB0aGUgdmFsdWUgb2YgdGhpcwotCSAqIGF0dHJpYnV0ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRPd25lck5vZGUoKSB7Ci0JCS8vIGZvciA8TElOSz4gdGFnIG9yIDxTVFlMRT4gdGFnCi0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKQotCQkJcmV0dXJuIG1vZGVsLmdldE93bmVyRE9NTm9kZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLk5vZGVMaXN0IGdldE93bmVyTm9kZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IChnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgPyBuZXcgVmVjdG9yKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSkgOiBudWxsOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsTm9kZUxpc3Qgbm9kZXMgPSBuZXcgSW50ZXJuYWxOb2RlTGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpIHsKLQkJCQlub2Rlcy5ub2Rlcy5hZGQoKChJU3R5bGVTaGVldEFkYXB0ZXIpIG9iaikuZ2V0RWxlbWVudCgpKTsKLQkJCX0KLQkJfQotCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIG5vZGVzOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICogQHBhcmFtIGRvYwotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0T3duZXJOb2RlcyhEb2N1bWVudCBkb2MpIHsKLQkJTGlzdCBsaXN0ID0gKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSA/IG5ldyBWZWN0b3IoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpKSA6IG51bGw7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZXJuYWxOb2RlTGlzdCBub2RlcyA9IG5ldyBJbnRlcm5hbE5vZGVMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTdHlsZVNoZWV0QWRhcHRlcikgewotCQkJCUVsZW1lbnQgZWxlID0gKChJU3R5bGVTaGVldEFkYXB0ZXIpIG9iaikuZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGUuZ2V0T3duZXJEb2N1bWVudCgpID09IGRvYykKLQkJCQkJbm9kZXMubm9kZXMuYWRkKGVsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkKLQkJCXJldHVybiBub2RlczsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBzdHlsZSBzaGVldCBjb21lcyBmcm9tIGFuIDxjb2RlPkBpbXBvcnQ8L2NvZGU+IHJ1bGUsIHRoZSA8Y29kZT5vd25lclJ1bGU8L2NvZGU+IGF0dHJpYnV0ZSB3aWxsCi0JICogICAgICAgICBjb250YWluIHRoZSA8Y29kZT5DU1NJbXBvcnRSdWxlPC9jb2RlPi4gSW4gdGhhdCBjYXNlLCB0aGUKLQkgKiAgICAgICAgIDxjb2RlPm93bmVyTm9kZTwvY29kZT4gYXR0cmlidXRlIGluIHRoZQotCSAqICAgICAgICAgPGNvZGU+U3R5bGVTaGVldDwvY29kZT4gaW50ZXJmYWNlIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogICAgICAgICBJZiB0aGUgc3R5bGUgc2hlZXQgY29tZXMgZnJvbSBhbiBlbGVtZW50IG9yIGEgcHJvY2Vzc2luZwotCSAqICAgICAgICAgaW5zdHJ1Y3Rpb24sIHRoZSA8Y29kZT5vd25lclJ1bGU8L2NvZGU+IGF0dHJpYnV0ZSB3aWxsIGJlCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBhbmQgdGhlIDxjb2RlPm93bmVyTm9kZTwvY29kZT4gYXR0cmlidXRlCi0JICogICAgICAgICB3aWxsIGNvbnRhaW4gdGhlIDxjb2RlPk5vZGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGdldE93bmVyUnVsZSgpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgQ1NTQ29yZU1lc3NhZ2VzLllvdV9jYW5ub3RfdXNlX0NTU1N0eWxlU2hlX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiWW91IGNhbm5vdCB1c2UgQ1NTU3R5bGVTaGVldC5nZXRPd25lclJ1bGUoKSBiZWNhdXNlIG9mIG1hbnkgcmVmZXJlbmNlcnMgb2YgdGhpcyBydWxlXG5QbGVhc2UgdXNlIGdldE9ud2VyUnVsZXMoKSIKLQkJLy8gZm9yIEBpbXBvcnQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3QKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0IGdldE93bmVyUnVsZXMoKSB7Ci0JCVN0eWxlU2hlZXRMaXN0IGxpc3QgPSBnZXRQYXJlbnRTdHlsZVNoZWV0cygpOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNTU1J1bGVMaXN0SW1wbCBydWxlTGlzdCA9IG5ldyBDU1NSdWxlTGlzdEltcGwoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUltcG9ydFJ1bGVDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRSdWxlQ29sbGVjdG9yKHRoaXMpOwotCQkJdHJhdi5hcHBseSgoSUNTU1N0eWxlU2hlZXQpIGxpc3QuaXRlbShpKSk7Ci0JCQlydWxlTGlzdC5ub2Rlcy5hZGRBbGwodHJhdi5nZXRSdWxlcygpKTsKLQkJfQotCQlyZXR1cm4gcnVsZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogRm9yIHN0eWxlIHNoZWV0IGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgdGhlIGNvbmNlcHQgb2Ygc3R5bGUgc2hlZXQKLQkgKiBpbmNsdXNpb24sIHRoaXMgYXR0cmlidXRlIHJlcHJlc2VudHMgdGhlIGluY2x1ZGluZyBzdHlsZSBzaGVldCwgaWYgb25lCi0JICogZXhpc3RzLiBJZiB0aGUgc3R5bGUgc2hlZXQgaXMgYSB0b3AtbGV2ZWwgc3R5bGUgc2hlZXQsIG9yIHRoZSBzdHlsZQotCSAqIHNoZWV0IGxhbmd1YWdlIGRvZXMgbm90IHN1cHBvcnQgaW5jbHVzaW9uLCB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUKLQkgKiBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldCBnZXRQYXJlbnRTdHlsZVNoZWV0KCkgewotCQlDU1NSdWxlIG93bmVyID0gZ2V0T3duZXJSdWxlKCk7Ci0JCWlmIChvd25lciAhPSBudWxsKQotCQkJcmV0dXJuIG93bmVyLmdldFBhcmVudFN0eWxlU2hlZXQoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdAotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdCBnZXRQYXJlbnRTdHlsZVNoZWV0cygpIHsKLQkJTGlzdCBsaXN0ID0gKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSA/IG5ldyBWZWN0b3IoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpKSA6IG51bGw7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZXJuYWxTdHlsZVNoZWV0TGlzdCBzaGVldHMgPSBuZXcgSW50ZXJuYWxTdHlsZVNoZWV0TGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCQlzaGVldHMuYXBwZW5kTm9kZSgoKElDU1NNb2RlbCkgb2JqKS5nZXREb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCQlpZiAoc2hlZXRzLmdldExlbmd0aCgpID4gMCkKLQkJCXJldHVybiBzaGVldHM7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBhZHZpc29yeSB0aXRsZS4gVGhlIHRpdGxlIGlzIG9mdGVuIHNwZWNpZmllZCBpbiB0aGUKLQkgKiA8Y29kZT5vd25lck5vZGU8L2NvZGU+LiBTZWUgdGhlIHRpdGxlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUKLQkgKiA8Y29kZT5MSU5LPC9jb2RlPiBlbGVtZW50IGluIEhUTUwgNC4wLCBhbmQgdGhlIHRpdGxlIHBzZXVkby1hdHRyaWJ1dGUKLQkgKiBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldCBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCU5vZGUgbm9kZSA9IGdldE93bmVyTm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKEVsZW1lbnQpIG5vZGUpLmdldEF0dHJpYnV0ZSgiVElUTEUiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgdGhlIHN0eWxlIHNoZWV0IGxhbmd1YWdlIGZvciB0aGlzIHN0eWxlIHNoZWV0LiBUaGUgc3R5bGUKLQkgKiBzaGVldCBsYW5ndWFnZSBpcyBzcGVjaWZpZWQgYXMgYSBjb250ZW50IHR5cGUgKGUuZy4gInRleHQvY3NzIikuIFRoZQotCSAqIGNvbnRlbnQgdHlwZSBpcyBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPm93bmVyTm9kZTwvY29kZT4uIEFsc28KLQkgKiBzZWUgdGhlIHR5cGUgYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZSA8Y29kZT5MSU5LPC9jb2RlPiBlbGVtZW50Ci0JICogaW4gSFRNTCA0LjAsIGFuZCB0aGUgdHlwZSBwc2V1ZG8tYXR0cmlidXRlIGZvciB0aGUgWE1MIHN0eWxlIHNoZWV0Ci0JICogcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCU5vZGUgbm9kZSA9IGdldE93bmVyTm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKEVsZW1lbnQpIG5vZGUpLmdldEF0dHJpYnV0ZSgiVFlQRSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGluc2VydCBhIG5ldyBydWxlIGludG8gdGhlIHN0eWxlIHNoZWV0LiBUaGUgbmV3IHJ1bGUgbm93Ci0JICogYmVjb21lcyBwYXJ0IG9mIHRoZSBjYXNjYWRlLgotCSAqIAotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBUaGUgcGFyc2FibGUgdGV4dCByZXByZXNlbnRpbmcgdGhlIHJ1bGUuIEZvciBydWxlIHNldHMgdGhpcwotCSAqICAgICAgICAgICAgY29udGFpbnMgYm90aCB0aGUgc2VsZWN0b3IgYW5kIHRoZSBzdHlsZSBkZWNsYXJhdGlvbi4gRm9yCi0JICogICAgICAgICAgICBhdC1ydWxlcywgdGhpcyBzcGVjaWZpZXMgYm90aCB0aGUgYXQtaWRlbnRpZmllciBhbmQgdGhlIHJ1bGUKLQkgKiAgICAgICAgICAgIGNvbnRlbnQuCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBUaGUgaW5kZXggd2l0aGluIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUgbGlzdCBvZiB0aGUgcnVsZQotCSAqICAgICAgICAgICAgYmVmb3JlIHdoaWNoIHRvIGluc2VydCB0aGUgc3BlY2lmaWVkIHJ1bGUuIElmIHRoZSBzcGVjaWZpZWQKLQkgKiAgICAgICAgICAgIGluZGV4IGlzIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0eWxlIHNoZWV0J3MgcnVsZQotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiwgdGhlIHJ1bGUgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBzdHlsZQotCSAqICAgICAgICAgICAgc2hlZXQuCi0JICogQHJldHVybiBUaGUgaW5kZXggd2l0aGluIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUgY29sbGVjdGlvbiBvZiB0aGUgbmV3bHkKLQkgKiAgICAgICAgIGluc2VydGVkIHJ1bGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgcnVsZSBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgICAgICBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGUuZy4gaWYgYW4KLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5AaW1wb3J0PC9jb2RlPiBydWxlIGlzIGluc2VydGVkIGFmdGVyIGEgc3RhbmRhcmQgcnVsZSBzZXQgb3Igb3RoZXIKLQkgKiAgICAgICAgIGF0LXJ1bGUuIDxicj4KLQkgKiAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBpcyBub3QgYSB2YWxpZAotCSAqICAgICAgICAgaW5zZXJ0aW9uIHBvaW50LiA8YnI+Ci0JICogICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHN0eWxlIHNoZWV0IGlzCi0JICogICAgICAgICByZWFkb25seS4gPGJyPgotCSAqICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcnVsZSBoYXMgYSBzeW50YXggZXJyb3IgYW5kCi0JICogICAgICAgICBpcyB1bnBhcnNhYmxlLgotCSAqLwotCXB1YmxpYyBpbnQgaW5zZXJ0UnVsZShTdHJpbmcgcnVsZSwgaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaW50IGxlbmd0aCA9IGdldENzc1J1bGVzKCkuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChpbmRleCA8IDAgfHwgbGVuZ3RoIDwgaW5kZXgpCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IGdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNTU1J1bGVJbXBsIHJlZlJ1bGUgPSAobGVuZ3RoICE9IGluZGV4KSA/IGdldEluZGV4ZWRSdWxlKGluZGV4KSA6IG51bGw7Ci0JCWludCBvZmZzZXQgPSAocmVmUnVsZSAhPSBudWxsKSA/IHJlZlJ1bGUuZ2V0U3RhcnRPZmZzZXQoKSA6IGRvYy5nZXRMZW5ndGgoKTsKLQkJZG9jLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgcnVsZSk7Ci0KLQkJLy8gaW5zZXJ0QmVmb3JlKChDU1NOb2RlSW1wbCkgY3JlYXRlQ1NTUnVsZShydWxlKSxyZWZSdWxlKTsKLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gbmV3UnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcmVmUnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgaW5zZXJ0UnVsZUJlZm9yZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBuZXdSdWxlLCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZWZSdWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1J1bGUgPT0gbnVsbCAmJiByZWZSdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSBpbnNlcnRCZWZvcmUoKENTU05vZGVJbXBsKSBuZXdSdWxlLCAoQ1NTTm9kZUltcGwpIHJlZlJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlbW92ZVJ1bGUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChydWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSByZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIHJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVwbGFjZVJ1bGUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgbmV3UnVsZSwgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgb2xkUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdSdWxlID09IG51bGwgJiYgb2xkUnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgcmVwbGFjZUNoaWxkKChDU1NOb2RlSW1wbCkgbmV3UnVsZSwgKENTU05vZGVJbXBsKSBvbGRSdWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBzZXREaXNhYmxlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlZChib29sZWFuIGRpc2FibGVkKSB7Ci0JCXRoaXMuZkRpc2FibGVkID0gZGlzYWJsZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NVbmtub3duUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTVW5rbm93blJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5M2VkNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NVbmtub3duUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NVbmtub3duUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlSW1wbCBpbXBsZW1lbnRzIENTU1Vua25vd25SdWxlIHsKLQotCS8vIFRPRE86IFRoaXMgZmllbGQgaXMgbmV2ZXIgcmVhZAotCVN0cmluZyBmQ3NzVGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NVbmtub3duUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTVW5rbm93blJ1bGVJbXBsKENTU1Vua25vd25SdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1Vua25vd25SdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTVW5rbm93blJ1bGVJbXBsKHRoaXMpOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFVOS05PV05SVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVU5LTk9XTl9SVUxFOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjc3NUZXh0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzVGV4dChTdHJpbmcgY3NzVGV4dCkgewotCQl0aGlzLmZDc3NUZXh0ID0gY3NzVGV4dDsKLQotCQlzdXBlci5zZXRDc3NUZXh0KGNzc1RleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ291bnRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ291bnRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5MjFmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvdW50ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDb3VudGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ291bnRlcjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDb3VudGVySW1wbCBleHRlbmRzIENTU1ByaW1pdGl2ZUNvbnRhaW5lciBpbXBsZW1lbnRzIElDb3VudGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCUNvdW50ZXJJbXBsKCkgewotCQlzdXBlcihDU1NfQ09VTlRFUik7Ci0JfQotCi0JQ291bnRlckltcGwoQ291bnRlckltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDb3VudGVySW1wbCBjbG9uZWQgPSBuZXcgQ291bnRlckltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBDb3VudGVyIHZhbHVlLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIGNvdW50ZXIgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5Db3VudGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgQ291bnRlciB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBDb3VudGVyIHZhbHVlIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX0NPVU5URVI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgQ291bnRlciBnZXRDb3VudGVyVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvdW50ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKElERU5USUZJRVIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBzdHlsZSBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShMSVNUU1RZTEUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBzZXBhcmF0b3Igb2YgdGhlIG5lc3RlZCBjb3VudGVycy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcGFyYXRvcigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShTRVBBUkFUT1IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQcmltaXRpdmVzKCkgewotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkZW50aWZpZXIKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShJREVOVElGSUVSLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdFN0eWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZShTdHJpbmcgbGlzdFN0eWxlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKExJU1RTVFlMRSwgbGlzdFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gU2VwYXJhdG9yCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgU2VwYXJhdG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKFNFUEFSQVRPUiwgU2VwYXJhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTUNTU0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NQ1NTSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjc5MDdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NQ1NTSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERPTUNTU0ltcGwgewotCi0JLyoqCi0JICogRE9NQ1NTSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBET01DU1NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBkb2N1bWVudCA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCh0cnVlKTsKLQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBtZWRpYQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENTU1N0eWxlU2hlZXQgY3JlYXRlQ1NTU3R5bGVTaGVldChTdHJpbmcgdGl0bGUsIFN0cmluZyBtZWRpYSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgQ1NTU3R5bGVTaGVldEltcGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L01lZGlhTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWVkaWFMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODRiM2IxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWVkaWFMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgTWVkaWFMaXN0SW1wbCBleHRlbmRzIENTU1JlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIE1lZGlhTGlzdCB7Ci0KLQlpbnQgbWVkaXVtQ291bnRlcjsKLQotCS8qKgotCSAqIE1lZGlhTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlNZWRpYUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1lZGlhTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlNZWRpYUxpc3RJbXBsKE1lZGlhTGlzdEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBtZWRpdW0gPGNvZGU+bmV3TWVkaXVtPC9jb2RlPiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiBJZiB0aGUKLQkgKiA8Y29kZT5uZXdNZWRpdW08L2NvZGU+IGlzIGFscmVhZHkgdXNlZCwgaXQgaXMgZmlyc3QgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TWVkaXVtVGhlCi0JICogICAgICAgICAgICBuZXcgbWVkaXVtIHRvIGFkZC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogSWYgdGhlIG1lZGl1bSBjb250YWlucyBjaGFyYWN0ZXJzCi0JICogICAgICAgICAgICAgICAgdGhhdCBhcmUgaW52YWxpZCBpbiB0aGUgdW5kZXJseWluZyBzdHlsZSBsYW5ndWFnZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbGlzdCBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZE1lZGl1bShTdHJpbmcgbmV3TWVkaXVtKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld01lZGl1bSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNTU05vZGVMaXN0SW1wbCBtID0gZ2V0TWVkaWEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgIT0gbS5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAobmV3TWVkaXVtLmVxdWFscyhpdGVtKGkpKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlzZXRBdHRyaWJ1dGUoIm1lZGl1bSIgKyBJbnRlZ2VyLnRvU3RyaW5nKG1lZGl1bUNvdW50ZXIrKyksIG5ld01lZGl1bSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCU1lZGlhTGlzdEltcGwgY2xvbmVkID0gbmV3IE1lZGlhTGlzdEltcGwodGhpcyk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgbWVkaXVtIGluZGljYXRlZCBieSA8Y29kZT5vbGRNZWRpdW08L2NvZGU+IGZyb20gdGhlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIG9sZE1lZGl1bVRoZQotCSAqICAgICAgICAgICAgbWVkaXVtIHRvIGRlbGV0ZSBpbiB0aGUgbWVkaWEgbGlzdC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbGlzdCBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9UX0ZPVU5EX0VSUjogUmFpc2VkIGlmIDxjb2RlPm9sZE1lZGl1bTwvY29kZT4gaXMgbm90Ci0JICogICAgICAgICAgICAgICAgaW4gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlTWVkaXVtKFN0cmluZyBvbGRNZWRpdW0pIHRocm93cyBET01FeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSAhPSBnZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAob2xkTWVkaXVtLmVxdWFscyhpdGVtKGkpKSkgewotCQkJCXJlbW92ZUF0dHJpYnV0ZU5vZGUoKENTU0F0dHJJbXBsKSBmQXR0cnMuaXRlbShpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIG1lZGlhIGluIHRoZSBsaXN0LiBUaGUgcmFuZ2Ugb2YgdmFsaWQgbWVkaWEgaXMKLQkgKiA8Y29kZT4wPC9jb2RlPiB0byA8Y29kZT5sZW5ndGgtMTwvY29kZT4gaW5jbHVzaXZlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TWVkaWEoKS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIENTU05vZGVMaXN0SW1wbAotCSAqLwotCUNTU05vZGVMaXN0SW1wbCBnZXRNZWRpYSgpIHsKLQkJaWYgKGZBdHRycyA9PSBudWxsKQotCQkJZkF0dHJzID0gbmV3IENTU05hbWVkTm9kZU1hcEltcGwoKTsKLQkJcmV0dXJuIGZBdHRyczsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFyc2FibGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgbGlzdC4gVGhpcyBpcyBhCi0JICogY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgdmFsdWUgaGFzIGEKLQkgKiAgICAgICAgICAgICAgICBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG1lZGlhIGxpc3QKLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lZGlhVGV4dCgpIHsKLQkJcmV0dXJuIGdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgyMDAxLzAxLzE3Ci0JICogMTg6NTA6MjkpCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE1FRElBTElTVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiB0aCBpbiB0aGUgbGlzdC4gSWYgPGNvZGU+aW5kZXg8L2NvZGU+Ci0JICogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgbWVkaWEgaW4gdGhlIGxpc3QsIHRoaXMKLQkgKiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgSW5kZXggaW50byB0aGUgY29sbGVjdGlvbi4KLQkgKiBAcmV0dXJuIFRoZSBtZWRpdW0gYXQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiB0aCBwb3NpdGlvbiBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPk1lZGlhTGlzdDwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQgaXMKLQkgKiAgICAgICAgIG5vdCBhIHZhbGlkIGluZGV4LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBnZXRMZW5ndGgoKSA8PSBpbmRleCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoKENTU0F0dHJJbXBsKSBnZXRNZWRpYSgpLml0ZW0oaW5kZXgpKS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIHNldE1lZGlhVGV4dCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZWRpYVRleHQoU3RyaW5nIG1lZGlhVGV4dCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldENzc1RleHQobWVkaWFUZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JHQkNvbG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SR0JDb2xvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1NTAyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JHQkNvbG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUkdCQ29sb3I7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgUkdCQ29sb3JJbXBsIGV4dGVuZHMgQ1NTUHJpbWl0aXZlQ29udGFpbmVyIGltcGxlbWVudHMgUkdCQ29sb3IgewotCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZlJlZDsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmR3JlZW47Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZkJsdWU7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlSR0JDb2xvckltcGwoKSB7Ci0JCXN1cGVyKENTU19SR0JDT0xPUik7Ci0JfQotCi0JUkdCQ29sb3JJbXBsKFJHQkNvbG9ySW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWZSZWQgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZlJlZCk7Ci0JCWFwcGVuZENoaWxkKGZSZWQpOwotCi0JCWZHcmVlbiA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mR3JlZW4pOwotCQlhcHBlbmRDaGlsZChmR3JlZW4pOwotCi0JCWZCbHVlID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZCbHVlKTsKLQkJYXBwZW5kQ2hpbGQoZkJsdWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVJHQkNvbG9ySW1wbCBjbG9uZWQgPSBuZXcgUkdCQ29sb3JJbXBsKHRoaXMpOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGJsdWUgdmFsdWUgb2YgdGhlIFJHQiBjb2xvci4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0Qmx1ZSgpIHsKLQkJcmV0dXJuIGZCbHVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBncmVlbiB2YWx1ZSBvZiB0aGUgUkdCIGNvbG9yLgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRHcmVlbigpIHsKLQkJcmV0dXJuIGZHcmVlbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgcmVkIHZhbHVlIG9mIHRoZSBSR0IgY29sb3IuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldFJlZCgpIHsKLQkJcmV0dXJuIGZSZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuUkdCQ29sb3IKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFJHQkNvbG9yIGdldFJHQkNvbG9yVmFsdWUoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFByaW1pdGl2ZXMoKSB7Ci0KLQkJZlJlZCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZlJlZCk7Ci0KLQkJZkdyZWVuID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmR3JlZW4pOwotCi0JCWZCbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmQmx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjk1ZWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJlY3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgUmVjdEltcGwgZXh0ZW5kcyBDU1NQcmltaXRpdmVDb250YWluZXIgaW1wbGVtZW50cyBSZWN0IHsKLQotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZUb3A7Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZlJpZ2h0OwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZCb3R0b207Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZkxlZnQ7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlSZWN0SW1wbCgpIHsKLQkJc3VwZXIoQ1NTX1JFQ1QpOwotCX0KLQotCVJlY3RJbXBsKFJlY3RJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJZlRvcCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mVG9wKTsKLQkJYXBwZW5kQ2hpbGQoZlRvcCk7Ci0KLQkJZlJpZ2h0ID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZSaWdodCk7Ci0JCWFwcGVuZENoaWxkKGZSaWdodCk7Ci0KLQkJZkJvdHRvbSA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mQm90dG9tKTsKLQkJYXBwZW5kQ2hpbGQoZkJvdHRvbSk7Ci0KLQkJZkxlZnQgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZkxlZnQpOwotCQlhcHBlbmRDaGlsZChmTGVmdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJUmVjdEltcGwgY2xvbmVkID0gbmV3IFJlY3RJbXBsKHRoaXMpOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGJvdHRvbSBvZiB0aGUgcmVjdC4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0Qm90dG9tKCkgewotCQlyZXR1cm4gZkJvdHRvbTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgbGVmdCBvZiB0aGUgcmVjdC4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0TGVmdCgpIHsKLQkJcmV0dXJuIGZMZWZ0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLlJlY3QKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFJlY3QgZ2V0UmVjdFZhbHVlKCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSByaWdodCBvZiB0aGUgcmVjdC4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0UmlnaHQoKSB7Ci0JCXJldHVybiBmUmlnaHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHRvcCBvZiB0aGUgcmVjdC4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0VG9wKCkgewotCQlyZXR1cm4gZlRvcDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UHJpbWl0aXZlcygpIHsKLQotCQlmVG9wID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmVG9wKTsKLQotCQlmUmlnaHQgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZSaWdodCk7Ci0KLQkJZkJvdHRvbSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZkJvdHRvbSk7Ci0KLQkJZkxlZnQgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZMZWZ0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0eWxlU2hlZXRMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHlsZVNoZWV0TGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhMWJmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0eWxlU2hlZXRMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgU3R5bGVTaGVldExpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RDU1NOb2RlTGlzdCBpbXBsZW1lbnRzIFN0eWxlU2hlZXRMaXN0IHsKLQotCS8qKgotCSAqIFN0eWxlU2hlZXRMaXN0SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCVN0eWxlU2hlZXRMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIGEgc3R5bGUgc2hlZXQgYnkgb3JkaW5hbCBpbmRleC4gSWYgaW5kZXggaXMgZ3JlYXRlcgotCSAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBzdHlsZSBzaGVldHMgaW4gdGhlIGxpc3QsIHRoaXMgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleEluZGV4Ci0JICogICAgICAgICAgICBpbnRvIHRoZSBjb2xsZWN0aW9uCi0JICogQHJldHVybiBUaGUgc3R5bGUgc2hlZXQgYXQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBwb3NpdGlvbiBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPlN0eWxlU2hlZXRMaXN0PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhhdAotCSAqICAgICAgICAgaXMgbm90IGEgdmFsaWQgaW5kZXguCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgaXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChTdHlsZVNoZWV0KSBpdGVtSW1wbChpbmRleCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFhNTFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5DU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIENTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yIGV4dGVuZHMgQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgZG9jdW1lbnQgaXMgZW1wdHksIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBub2RlcywKLQkJLy8gc28gbm8gbmVlZCB0byBjb250aW51ZS4KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgbm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBudWxsOwotCQkJLy8gc2tpcCBhbnkgaW5pdGlhbCB3aGl0ZXNwYWNlCi0JCQkvLyBOb3RlIHRoYXQgQGNoYXJzZXQgImVuY29kaW5nbmFtZSI7Ci0JCQkvLyBtdXN0IGFwcGVhciBhdCB2ZXJ5IGJlZ2lubmluZyBvZiBkb2N1bWVudCwKLQkJCS8vIHRvIGJlIHZhbGlkLgotCQkJLy8gTWF5IGhhdmUgdG8gdGVzdCB3aXRoICJkYW1hZ2VkIiBmaWxlcyAoZS5nLgotCQkJLy8gYmVnaW5uaW5nIEVPTHMsIGV0Yy4sIHRvIHZlcmlmeSB0aGlzIHdvcmtzCi0JCQkvLyBhcyBleHBlY3RlZC4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCW5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJCWlmIChnZXRUeXBlKG5vZGUpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0TmV4dFJlZ2lvbk9mVHlwZShDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgcmVnaW9ucyk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGdldE5leHRSZWdpb25PZlR5cGUoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORywgcmVnaW9ucyk7Ci0JCQkJaWYgKHZhbHVlUmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gaWYgZGlkbid0IGZpbmQgdGhlIHJlZ2lvbiwgaXRzIHByb2JhYmx5IGR1ZSB0byBpbGwKLQkJCQkJLy8gZm9ybWVkIGlucHV0LCBzdWNoIGFzCi0JCQkJCS8vIEBjaGFyc2V0ICJJU08tODg1OS02OwotCQkJCQkvLyBzbyB3ZSdsbCB0cnkgYWdhaW4gZm9yICJ1bmtub3duIiByZWdpb24uCi0JCQkJCS8vIElmIHRoYXQgZmFpbHMsIHdlJ2xsIGdpdmUgdXA/Ci0JCQkJCXJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCQlyZWdpb24gPSBnZXROZXh0UmVnaW9uT2ZUeXBlKENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VULCByZWdpb25zKTsKLQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZVJlZ2lvbiA9IGdldE5leHRSZWdpb25PZlR5cGUoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04sIHJlZ2lvbnMpOwotCQkJCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQlyZXN1bHQgPSBub2RlLmdldFRleHQodmFsdWVSZWdpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBub2RlLmdldFRleHQodmFsdWVSZWdpb24pOwotCQkJCX0KLQkJCQlyZXN1bHQgPSBTdHJpbmdVdGlscy5zdHJpcE5vbkxldHRlckRpZ2l0cyhyZXN1bHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZ05hbWUoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQllbmMgPSBnZXRFbmNvZGluZ05hbWUoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFRPRE8gSW1wb3J0YW50OiBuZWVkIHRvIGltcGxlbWVudCBzb21lICJyYXciIHBhcnNlciBmb3IKLQkJCS8vIElEb2N1bWVudCBsZXZlbAotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCVN0cmluZyByZXN1bHQgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbk9mVHlwZShTdHJpbmcgdHlwZSwgSXRlcmF0b3IgcmVnaW9ucykgewotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gdHlwZSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2ZmYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ0d1ZXNzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQuQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTRG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1NTX0lEID0gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQlwcml2YXRlIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0KLQotCXB1YmxpYyBDU1NEb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVuY29kaW5nTmFtZUJ5R3Vlc3MoYnl0ZVtdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgaWFuYUVuYyA9IG51bGw7Ci0JCWlhbmFFbmMgPSBFbmNvZGluZ0d1ZXNzZXIuZ3Vlc3NFbmNvZGluZyhzdHJpbmcsIGxlbmd0aCk7Ci0JCXJldHVybiBpYW5hRW5jOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgZW5jb2RpbmcuIEZvciBDU1MgdGhlcmUgaXMgbm8gc3BlYydkIGRlZmF1bHQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKSB7Ci0JCS8vIERNVzogSSBjb3BpZWQgdGhpcyBmcm9tIENTU01vZGVsSW1wbGUgLi4uCi0JCS8vIGJ1dCBhbSBub3Qgc3VyZSBpdHMgcmlnaHQKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgcmVQYXJzZXIgPSBuZXcgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQkJcmVQYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuc2V0UmVQYXJzZXIocmVQYXJzZXIpOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQkvLyByZXR1cm4gbmV3IENTU1JlZ2lvblBhcnNlcigpOwotCQlyZXR1cm4gbmV3IENTU1NvdXJjZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBkZWxpbWl0ZXIgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDU1NfSUQpOwotCQlpZiAoZGVsaW1pdGVyID09IG51bGwpCi0JCQlkZWxpbWl0ZXIgPSBzdXBlci5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKGZpbGUpOwotCQlyZXR1cm4gZGVsaW1pdGVyOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID09IG51bGwpIHsKLQkJCWRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzcxMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlTGlzdGVuZXIgewotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzdHlsZUNoYW5nZWQoSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc3R5bGVVcGRhdGUoSUNTU01vZGVsIHNyY01vZGVsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0OWVlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZU5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZU5vdGlmaWVyIGV4dGVuZHMgSUNTU1N0eWxlTGlzdGVuZXIgewotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUxpc3QgZ2V0U3R5bGVMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNSZWNvcmRpbmcoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDMxYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyIGV4dGVuZHMgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIHsKLQotCS8qKgotCSAqIENTU0VtYmVkZGVkU3R5bGVOb3RpZnlBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKi8KLQlwdWJsaWMgQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlcihJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm9kZS5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTGlzdGVuZXIpIHsKLQkJCSgoSUNTU1N0eWxlTGlzdGVuZXIpIGFkYXB0ZXIpLnN0eWxlQ2hhbmdlZChzcmNNb2RlbCwgcmVtb3ZlZCwgYWRkZWQsIG1lZGlhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBtb2RlbC5nZXRPd25lckRPTU5vZGUoKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub2RlLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVMaXN0ZW5lcikgewotCQkJKChJQ1NTU3R5bGVMaXN0ZW5lcikgYWRhcHRlcikuc3R5bGVVcGRhdGUoc3JjTW9kZWwpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVFdmVudERlbGl2ZXJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVFdmVudERlbGl2ZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzYwMTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlRXZlbnREZWxpdmVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1N0eWxlRXZlbnREZWxpdmVyZXIgewotCi0JcHJpdmF0ZSBWZWN0b3IgZlZpc2l0ZWQgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBJQ1NTTW9kZWwgZlNyY01vZGVsOwotCXByaXZhdGUgSUNTU1NlbGVjdG9yW10gZlJlbW92ZWQ7Ci0JcHJpdmF0ZSBJQ1NTU2VsZWN0b3JbXSBmQWRkZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZk1lZGlhOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1N0eWxlRXZlbnREZWxpdmVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmlyZShJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJaWYgKHNyY01vZGVsID09IG51bGwgfHwgc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRoaXMuZlNyY01vZGVsID0gc3JjTW9kZWw7Ci0JCXRoaXMuZlJlbW92ZWQgPSByZW1vdmVkOwotCQl0aGlzLmZBZGRlZCA9IGFkZGVkOwotCQl0aGlzLmZNZWRpYSA9IG1lZGlhOwotCi0JCS8vIHByb2hpYml0IGRlbGl2ZXJpbmcgdG8gc3JjTW9kZWwKLQkJZlZpc2l0ZWQuY2xlYXIoKTsKLQkJZlZpc2l0ZWQuYWRkKHNyY01vZGVsKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2aXNpdCgoSUNTU1N0eWxlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVG8oSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQl0aGlzLmZTcmNNb2RlbCA9IHNyY01vZGVsOwotCQl0aGlzLmZSZW1vdmVkID0gcmVtb3ZlZDsKLQkJdGhpcy5mQWRkZWQgPSBhZGRlZDsKLQkJdGhpcy5mTWVkaWEgPSBtZWRpYTsKLQotCQkvLyBwcm9oaWJpdCBkZWxpdmVyaW5nIHRvIHNyY01vZGVsCi0JCWZWaXNpdGVkLmNsZWFyKCk7Ci0JCS8vIHZpc2l0ZWQuYWRkKHNyY01vZGVsKTsgOiBiZWNhdXNlIGxvb3BpbmcgcHJvYmxlbQotCQl2aXNpdChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJaWYgKHNyY01vZGVsID09IG51bGwgfHwgc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRoaXMuZlNyY01vZGVsID0gc3JjTW9kZWw7Ci0KLQkJLy8gcHJvaGliaXQgZGVsaXZlcmluZyB0byBzcmNNb2RlbAotCQlmVmlzaXRlZC5jbGVhcigpOwotCQlmVmlzaXRlZC5hZGQoc3JjTW9kZWwpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCXZpc2l0VXBkYXRlKChJQ1NTU3R5bGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVVcGRhdGVUbyhJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JCWlmIChzcmNNb2RlbCA9PSBudWxsIHx8IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmZTcmNNb2RlbCA9IHNyY01vZGVsOwotCi0JCS8vIHByb2hpYml0IGRlbGl2ZXJpbmcgdG8gc3JjTW9kZWwKLQkJZlZpc2l0ZWQuY2xlYXIoKTsKLQkJLy8gdmlzaXRlZC5hZGQoc3JjTW9kZWwpOwotCQl2aXNpdFVwZGF0ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXQoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwgfHwgZlZpc2l0ZWQuY29udGFpbnMobGlzdGVuZXIpKQotCQkJcmV0dXJuOwotCi0JCS8vIGZpcmUgZXZlbnQgdG8gbGlzdGVuZXIKLQkJbGlzdGVuZXIuc3R5bGVDaGFuZ2VkKGZTcmNNb2RlbCwgZlJlbW92ZWQsIGZBZGRlZCwgZk1lZGlhKTsKLQkJZlZpc2l0ZWQuYWRkKGxpc3RlbmVyKTsKLQotCQkvLyB0cmF2ZXJzZSBub3RpZmllcgotCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVOb3RpZmllcikgewotCQkJSUNTU1N0eWxlTm90aWZpZXIgbm90aWZpZXIgPSAoSUNTU1N0eWxlTm90aWZpZXIpIGxpc3RlbmVyOwotCQkJaWYgKG5vdGlmaWVyLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgewotCQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IG5vdGlmaWVyLmdldFN0eWxlTGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXZpc2l0KChJQ1NTU3R5bGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdFVwZGF0ZShJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCB8fCBmVmlzaXRlZC5jb250YWlucyhsaXN0ZW5lcikpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZmlyZSBldmVudCB0byBsaXN0ZW5lcgotCQlsaXN0ZW5lci5zdHlsZVVwZGF0ZShmU3JjTW9kZWwpOwotCQlmVmlzaXRlZC5hZGQobGlzdGVuZXIpOwotCi0JCS8vIHRyYXZlcnNlIG5vdGlmaWVyCi0JCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDU1NTdHlsZU5vdGlmaWVyKSB7Ci0JCQlJQ1NTU3R5bGVOb3RpZmllciBub3RpZmllciA9IChJQ1NTU3R5bGVOb3RpZmllcikgbGlzdGVuZXI7Ci0JCQlpZiAobm90aWZpZXIuZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gbGlzdGVuZXJzID0gbm90aWZpZXIuZ2V0U3R5bGVMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdmlzaXRVcGRhdGUoKElDU1NTdHlsZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlTm90aWZ5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MzNiMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0ZWRDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuU2VsZWN0b3JzQ29sbGVjdG9yOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHlsZU5vdGlmeUFkYXB0ZXIgaW1wbGVtZW50cyBJQ1NTU3R5bGVOb3RpZmllciB7Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLlZlY3RvciBsaXN0ZW5lcnM7Ci0JcHJvdGVjdGVkIGZpbmFsIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWwgbW9kZWw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVjb3JkaW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyKElDU1NNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAobGlzdGVuZXJzID09IG51bGwpCi0JCQlsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCi0JCQkvLyBzZW5kIG5ldyBzZWxlY3RvcnMgZXZlbnQgdG8gbGlzdGVuZXIKLQkJCUltcG9ydGVkQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0ZWRDb2xsZWN0b3IoKTsKLQkJCXRyYXYuYXBwbHkobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJdGVyYXRvciBpdCA9IHRyYXYuZ2V0RXh0ZXJuYWxzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU3R5bGVTaGVldCBzaGVldCA9IChJQ1NTU3R5bGVTaGVldCkgaXQubmV4dCgpOwotCQkJCS8vIGNvbGxlY3Qgc2VsZWN0b3JzCi0JCQkJU2VsZWN0b3JzQ29sbGVjdG9yIHNlbFRyYXYgPSBuZXcgU2VsZWN0b3JzQ29sbGVjdG9yKCk7Ci0JCQkJc2VsVHJhdi5hcHBseShzaGVldCk7Ci0JCQkJaW50IG5TZWwgPSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLnNpemUoKTsKLQkJCQlJQ1NTU2VsZWN0b3JbXSBhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbblNlbF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsOyBpKyspCi0JCQkJCWFkZGVkW2ldID0gKElDU1NTZWxlY3Rvcikgc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5nZXQoaSk7Ci0KLQkJCQkvLyBmaXJlIGV2ZW50Ci0JCQkJQ1NTU3R5bGVFdmVudERlbGl2ZXJlciBkZWxpdmVyZXIgPSBuZXcgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpOwotCQkJCWRlbGl2ZXJlci5maXJlVG8obGlzdGVuZXIsIHNoZWV0LmdldE1vZGVsKCksIG51bGwsIGFkZGVkLCBudWxsLyoKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogbWVkaWEKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogd2lsbAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBiZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBpbXBsZW1lbnRlZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBpbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogZnV0dXJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqLyk7Ci0JCQl9Ci0KLQkJCS8vIGFkZCBsaXN0ZW5lcgotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZygpIHsKLQkJcmVjb3JkaW5nID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoKSB7Ci0JCXJlY29yZGluZyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmUoSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQkvLyBzZW5kIHNlbGVjdG9yIGNoYW5nZWQgZXZlbnQKLQkJQ1NTU3R5bGVFdmVudERlbGl2ZXJlciBkZWxpdiA9IG5ldyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyKCk7Ci0JCWRlbGl2LmZpcmUobW9kZWwsIHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRTdHlsZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlY29yZGluZygpIHsKLQkJcmV0dXJuIHJlY29yZGluZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQotCQkJLy8gc2VuZCBvbGQgc2VsZWN0b3JzIGV2ZW50IHRvIGxpc3RlbmVyCi0JCQlJbXBvcnRlZENvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydGVkQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldEV4dGVybmFscygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBjb2xsZWN0IHNlbGVjdG9ycwotCQkJCVNlbGVjdG9yc0NvbGxlY3RvciBzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJCXNlbFRyYXYuYXBwbHkoc2hlZXQpOwotCQkJCWludCBuU2VsID0gc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JCQkJSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbblNlbF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsOyBpKyspCi0JCQkJCXJlbW92ZWRbaV0gPSAoSUNTU1NlbGVjdG9yKSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLmdldChpKTsKLQotCQkJCS8vIGZpcmUgZXZlbnQKLQkJCQlDU1NTdHlsZUV2ZW50RGVsaXZlcmVyIGRlbGl2ZXJlciA9IG5ldyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyKCk7Ci0JCQkJZGVsaXZlcmVyLmZpcmVUbyhsaXN0ZW5lciwgc2hlZXQuZ2V0TW9kZWwoKSwgcmVtb3ZlZCwgbnVsbCwgbnVsbC8qCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIG1lZGlhCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHdpbGwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogYmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW1wbGVtZW50ZWQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGZ1dHVyZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKi8pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWwgc3JjTW9kZWwsIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yW10gYWRkZWQsIGphdmEubGFuZy5TdHJpbmcgbWVkaWEpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZVVwZGF0ZShvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3ZDA3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTRm9ybWF0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEZvcm1hdFByb2Nlc3NvckNTUyBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JLyoKLQkgKiBNYXggbGVuZ3RoIG9mIHRleHQgdG8gYmUgZm9ybWF0dGVkIHRvIGJlIGNvbnNpZGVyZWQgYSAic21hbGwgY2hhbmdlIgotCSAqIFVzZWQgZm9yIGRvY3VtZW50IHJld3JpdGUgc2Vzc2lvbiB0eXBlLgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9TTUFMTF9GT1JNQVRfU0laRSA9IDEwMDA7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiY3NzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJQ1NTRm9ybWF0VXRpbCBmb3JtYXRVdGlsID0gQ1NTRm9ybWF0VXRpbC5nZXRJbnN0YW5jZSgpOwotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQkvLyBCVUcxMDI4MjIgdGFrZSBhZHZhbnRhZ2Ugb2YgSURvY3VtZW50RXh0ZW5zaW9uNAotCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBkb2NFeHQ0ID0gbnVsbDsKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJZG9jRXh0NCA9IChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQl9Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSByZXdyaXRlVHlwZSA9IChsZW5ndGggPiBNQVhfU01BTExfRk9STUFUX1NJWkUpID8gRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEIDogRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEX1NNQUxMOwotCQkJCXJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCB8fCBkb2NFeHQ0LmdldEFjdGl2ZVJld3JpdGVTZXNzaW9uKCkgIT0gbnVsbCkgPyBudWxsIDogZG9jRXh0NC5zdGFydFJld3JpdGVTZXNzaW9uKHJld3JpdGVUeXBlKTsKLQotCQkJCUlDU1NEb2N1bWVudCBkb2MgPSAoKElDU1NNb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBkb2MpOwotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBmb3JtYXR0ZXIuZm9ybWF0KGRvYyk7Ci0JCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZG9jKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBkb2MpLmdldEVuZE9mZnNldCgpOwotCQkJCQlmb3JtYXRVdGlsLnJlcGxhY2VTb3VyY2UoZG9jLmdldE1vZGVsKCksIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgYnVmLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIEJVRzEwMjgyMiB0YWtlIGFkdmFudGFnZSBvZiBJRG9jdW1lbnRFeHRlbnNpb240Ci0JCQkJaWYgKGRvY0V4dDQgIT0gbnVsbCAmJiByZXdyaXRlU2Vzc2lvbiAhPSBudWxsKQotCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlMaXN0IGNzc25vZGVzID0gZm9ybWF0VXRpbC5jb2xsZWN0Q1NTTm9kZXMoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQkJCWlmIChjc3Nub2RlcyAhPSBudWxsICYmICFjc3Nub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQlJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCi0JCQkJLy8gQlVHMTAyODIyIHRha2UgYWR2YW50YWdlIG9mIElEb2N1bWVudEV4dGVuc2lvbjQKLQkJCQlJRG9jdW1lbnRFeHRlbnNpb240IGRvY0V4dDQgPSBudWxsOwotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNCkgc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCX0KLQkJCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJCXRyeSB7Ci0JCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHJld3JpdGVUeXBlID0gKGxlbmd0aCA+IE1BWF9TTUFMTF9GT1JNQVRfU0laRSkgPyBEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5VTlJFU1RSSUNURUQgOiBEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5VTlJFU1RSSUNURURfU01BTEw7Ci0JCQkJCXJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCB8fCBkb2NFeHQ0LmdldEFjdGl2ZVJld3JpdGVTZXNzaW9uKCkgIT0gbnVsbCkgPyBudWxsIDogZG9jRXh0NC5zdGFydFJld3JpdGVTZXNzaW9uKHJld3JpdGVUeXBlKTsKLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNzc25vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSBjc3Nub2Rlcy5nZXQoaSk7Ci0JCQkJCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgbm9kZSk7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gZm9ybWF0dGVyLmZvcm1hdChub2RlKTsKLQkJCQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQlpZiAobW9kZWwgPT0gbnVsbCkgewotCQkJCQkJCQltb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZvcm1hdFV0aWwucmVwbGFjZVNvdXJjZShtb2RlbCwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBidWYudG9TdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCS8vIEJVRzEwMjgyMiB0YWtlIGFkdmFudGFnZSBvZiBJRG9jdW1lbnRFeHRlbnNpb240Ci0JCQkJCWlmIChkb2NFeHQ0ICE9IG51bGwgJiYgcmV3cml0ZVNlc3Npb24gIT0gbnVsbCkKLQkJCQkJCWRvY0V4dDQuc3RvcFJld3JpdGVTZXNzaW9uKHJld3JpdGVTZXNzaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Fic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDZjZjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Fic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdExpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgaW1wbGVtZW50cyBDU1NTb3VyY2VHZW5lcmF0b3IgewotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBzaG9ydCBHRU5FUkFURSA9IDA7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBzaG9ydCBGT1JNQVQgPSAxOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgc2hvcnQgQ0xFQU5VUCA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBzaG9ydCBzdHJhdGVneTsKLQotCS8qKgotCSAqIAotCSAqLwotCUFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZERlbGltQmVmb3JlKElDU1NOb2RlIG5vZGUsIENvbXBvdW5kUmVnaW9uIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0NsZWFudXAoKSAmJiAhZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpCi0JCQlyZXR1cm47IC8vIGZvciBub3QgZm9ybWF0dGluZyBjYXNlIG9uIGNsZWFudXAgYWN0aW9uCi0JCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0KLQkJYm9vbGVhbiBuZWVkSW5kZW50ID0gIShub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpOwotCQlpZiAodG9BcHBlbmQgPT0gbnVsbCkgewotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlpZiAobmVlZEluZGVudCkKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyB0eXBlID0gdG9BcHBlbmQuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcih0b0FwcGVuZC5nZXREb2N1bWVudFJlZ2lvbigpLCB0b0FwcGVuZC5nZXRUZXh0UmVnaW9uKCkpOwotCQkJCWl0LnByZXYoKTsKLQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCWlmIChwcmV2ID09IG51bGwgfHwgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIFRleHRVdGlsaXRpZXMuaW5kZXhPZihEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSUywgaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChwcmV2KSwgMClbMF0gPj0gMCkpIHsKLQkJCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLmdldFRleHQoKSwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IodG9BcHBlbmQuZ2V0RG9jdW1lbnRSZWdpb24oKSwgdG9BcHBlbmQuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldiksIDApWzBdID49IDApIHsKLQkJCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJCQlpbnQgYXBwZW5kID0gMTsKLQkJCQkJaWYgKGxlbmd0aCArIGFwcGVuZCA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZFNwYWNlQmVmb3JlKElDU1NOb2RlIG5vZGUsIENvbXBvdW5kUmVnaW9uIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgdG9BcHBlbmQgPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2xlYW51cCgpICYmICFnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXJldHVybjsgLy8gZm9yIG5vdCBmb3JtYXR0aW5nIGNhc2Ugb24gY2xlYW51cCBhY3Rpb24KLQkJU3RyaW5nIHR5cGUgPSB0b0FwcGVuZC5nZXRUeXBlKCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCWJvb2xlYW4gbmVlZEluZGVudCA9ICEobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCS8vIGNoZWNrIHdoZXRoZXIgcHJldmlvdXMgcmVnaW9uIGlzICdTJyBhbmQgaGFzIENSLUxGCi0JCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IodG9BcHBlbmQuZ2V0RG9jdW1lbnRSZWdpb24oKSwgdG9BcHBlbmQuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCWl0LnByZXYoKTsKLQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgVGV4dFV0aWxpdGllcy5pbmRleE9mKERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTLCBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHByZXYpLCAwKVswXSA+PSAwKSB7Ci0JCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLmdldFRleHQoKSwgc291cmNlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgJiYgcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSkpIHsKLQkJCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCS8vIH0gZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ1VSTFlfQlJBQ0VfQ0xPU0UpIHsKLQkJCS8vIH0gZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU5DTFVERVMgfHwgdHlwZSA9PQotCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RBU0hNQVRDSCkgewotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiAmJiBub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCWludCBuID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNKTsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCQlpbnQgbGVuZ3RoID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCQlpbnQgYXBwZW5kID0gMTsKLQkJCQlpZiAobGVuZ3RoICsgbiArIGFwcGVuZCA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQkJbiA9IDA7IC8vIG5vIHNwYWNlIGlzIG5lY2Vzc2FyeQotCQkJCX0KLQkJCX0KLQkJCS8vIG5vIGRlbGltaXRlciBjYXNlCi0JCQl3aGlsZSAobi0tID4gMCkKLQkJCQlzb3VyY2UuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJCWludCBhcHBlbmQgPSAxOwotCQkJCWlmIChsZW5ndGggKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT1JFSUdOX0VMRU1FTlQgPT0gdHlwZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLmdldFRleHQoKSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTcGFjZUJlZm9yZShJQ1NTTm9kZSBub2RlLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2xlYW51cCgpICYmICFnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXJldHVybjsgLy8gZm9yIG5vdCBmb3JtYXR0aW5nIGNhc2Ugb24gY2xlYW51cCBhY3Rpb24KLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmICh0b0FwcGVuZCAhPSBudWxsICYmIHRvQXBwZW5kLnN0YXJ0c1dpdGgoInsiKSAmJiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfTkVXTElORV9PTl9PUEVOX0JSQUNFKSkgey8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSBpZiAoLyogISBtZ3IuaXNPbmVQcm9wZXJ0eVBlckxpbmUoKSAmJiAqL3ByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJaW50IG4gPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJaW50IGFwcGVuZCA9ICh0b0FwcGVuZCAhPSBudWxsKSA/IFRleHRVdGlsaXRpZXMuaW5kZXhPZihEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSUywgdG9BcHBlbmQsIDApWzBdIDogMDsKLQkJCWlmICh0b0FwcGVuZCAhPSBudWxsKQotCQkJCWFwcGVuZCA9IChhcHBlbmQgPCAwKSA/IHRvQXBwZW5kLmxlbmd0aCgpIDogYXBwZW5kOwotCQkJaWYgKG4gKyBhcHBlbmQgKyAxID4gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc291cmNlLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSkgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IENMRUFOVVA7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBmb3JtYXRQcm9jKG5vZGUpOwotCQlzdHJhdGVneSA9IG9sZFN0cmF0ZWd5OwotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKSB7Ci0JCXNob3J0IG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gQ0xFQU5VUDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSwgcmVnaW9uKTsKLQkJc3RyYXRlZ3kgPSBvbGRTdHJhdGVneTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkSWRlbnRSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKCFzdGd5LmlzRm9ybWF0U291cmNlKCkpCi0JCQl0ZXh0ID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCWVsc2UKLQkJCXRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQkKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORyB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkpCi0JCQlyZXR1cm4gZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbiwgMCwgc3RneSk7Ci0KLQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQlpZiAoc3RneS5nZXRJZGVudENhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCXJldHVybiB0ZXh0OwotCQkJZWxzZSBpZiAoc3RneS5nZXRJZGVudENhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQl9Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCXJldHVybiB0ZXh0OwotCQllbHNlIGlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkUHJvcE5hbWVSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKCFzdGd5LmlzRm9ybWF0U291cmNlKCkpCi0JCQl0ZXh0ID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCWVsc2UKLQkJCXRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQkKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORyB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkpCi0JCQlyZXR1cm4gZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbiwgMSwgc3RneSk7Ci0JCWlmIChpc0NsZWFudXAoKSkgewotCQkJaWYgKHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMgfHwgcmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkpCi0JCQkJcmV0dXJuIHRleHQ7Ci0JCQllbHNlIGlmIChzdGd5LmdldFByb3BOYW1lQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJZWxzZQotCQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSkKLQkJCXJldHVybiB0ZXh0OwotCQllbHNlIGlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmICghc3RneS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQllbHNlCi0JCQl0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJCi0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKQotCQkJcmV0dXJuIGRlY29yYXRlZFJlZ2lvbihyZWdpb24sIDIsIHN0Z3kpOwotCQlpZiAoaXNDbGVhbnVwKCkpIHsKLQkJCWlmIChzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSAhPSBDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUykgewotCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKQotCQkJCQkJdGV4dCA9IHRleHQudG9VcHBlckNhc2UoKTsKLQkJCQkJZWxzZQotCQkJCQkJdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBpbnQgdHlwZSwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoIXN0Z3kuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXRleHQgPSByZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJZWxzZQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChyZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkgfHwgcmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQlTdHJpbmcgdXJpID0gQ1NTTGlua0NvbnZlcnRlci5zdHJpcEZ1bmModGV4dCk7Ci0KLQkJCWJvb2xlYW4gcHJlZklzVXBwZXIgPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JCQlib29sZWFuIHVwcGVyID0gKHR5cGUgPT0gMCkgPyBwcmVmSXNVcHBlciA6ICgodHlwZSA9PSAxKSA/IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQkJU3RyaW5nIGZ1bmMgPSB0ZXh0LnN1YnN0cmluZygwLCA0KTsKLQkJCWlmIChpc0NsZWFudXAoKSkgewotCQkJCXVwcGVyID0gKCh0eXBlID09IDApID8gc3RneS5nZXRJZGVudENhc2UoKSA6ICgodHlwZSA9PSAxKSA/IHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgOiBzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSkpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUjsKLQkJCQlmdW5jID0gKCh0eXBlID09IDApID8gc3RneS5nZXRJZGVudENhc2UoKSA6ICgodHlwZSA9PSAxKSA/IHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgOiBzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSkpID09IENTU0NsZWFudXBTdHJhdGVneS5BU0lTID8gdGV4dC5zdWJzdHJpbmcoMCwgNCkgOiAodXBwZXIgPyAiVVJMKCIgOiAidXJsKCIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKCFpc0NsZWFudXAoKSAmJiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSkpIHx8IChpc0NsZWFudXAoKSAmJiBzdGd5LmlzUXVvdGVWYWx1ZXMoKSkpIHsKLQkJCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZSh1cmksIHF1b3RlKTsKLQkJCQl0ZXh0ID0gZnVuYyArIHF1b3RlICsgdXJpICsgcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoaXNDbGVhbnVwKCkgJiYgIXN0Z3kuaXNRdW90ZVZhbHVlcygpKSB7Ci0JCQkJdGV4dCA9IGZ1bmMgKyBDU1NMaW5rQ29udmVydGVyLnJlbW92ZUZ1bmModGV4dCkgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGV4dCA9IGZ1bmMgKyB1cmkgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORyAmJiAoIWlzQ2xlYW51cCgpIHx8IHN0Z3kuaXNRdW90ZVZhbHVlcygpKSkgewotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCS8vIGJlZ2dpbm5pbmcKLQkJCWlmICghdGV4dC5zdGFydHNXaXRoKHF1b3RlKSkgewotCQkJCWlmICh0ZXh0LnN0YXJ0c1dpdGgoIlwiIikgfHwgdGV4dC5zdGFydHNXaXRoKCJcJyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdGV4dCA9IHF1b3RlICsgdGV4dC5zdWJzdHJpbmcoMSk7Ci0JCQkJZWxzZQotCQkJCQl0ZXh0ID0gcXVvdGUgKyB0ZXh0OwotCQkJfQotCQkJLy8gZW5kaW5nCi0JCQlpZiAoIXRleHQuZW5kc1dpdGgocXVvdGUpKSB7Ci0JCQkJaWYgKHRleHQuZW5kc1dpdGgoIlwiIikgfHwgdGV4dC5lbmRzV2l0aCgiXCciKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCgpIC0gMSkgKyBxdW90ZTsKLQkJCQllbHNlCi0JCQkJCXRleHQgPSB0ZXh0ICsgcXVvdGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSkgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IEZPUk1BVDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSk7Ci0JCXN0cmF0ZWd5ID0gb2xkU3RyYXRlZ3k7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IEZPUk1BVDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSwgcmVnaW9uKTsKLQkJc3RyYXRlZ3kgPSBvbGRTdHJhdGVneTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoaW5zZXJ0ICYmIChhdHRyICE9IG51bGwpID8gYXR0ci5nZXRWYWx1ZSgpIDogIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJldHdlZW4gY2hpbGRyZW4oJ2NoaWxkJyBhbmQgaXRzIHByZXZpb3VzCi0JICogc2libGluZykgYW5kIGFwcGVuZCB0byBzdHJpbmcgYnVmZmVyCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmV0d2VlbiBjaGlsZHJlbignY2hpbGQnIGFuZCBpdHMgcHJldmlvdXMKLQkgKiBzaWJsaW5nKSBhbmQgYXBwZW5kIHRvIHN0cmluZyBidWZmZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldFBhcmVudE5vZGUoKSA9PSBub2RlKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9ybWF0QmVmb3JlKG5vZGUsIGNoaWxkLCAvKiAoY2hpbGQgIT0gbnVsbCkgPyAoY2hpbGQuZ2V0Q3NzVGV4dCgpKSA6ICovIiIsIGJ1ZiwgZXhjZXB0Rm9yKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZXR3ZWVuIGNoaWxkcmVuKCdjaGlsZCcgYW5kIGl0cyBwcmV2aW91cwotCSAqIHNpYmxpbmcpIGFuZCBhcHBlbmQgdG8gc3RyaW5nIGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmb3JtYXRDaGlsZHJlbihJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJLy8gYXBwZW5kIGNoaWxkCi0JCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgKChJTm9kZU5vdGlmaWVyKSBjaGlsZCkuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgY2hpbGQpOwotCQkJfQotCQkJU3RyaW5nQnVmZmVyIGNoaWxkU291cmNlID0gKChBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlcikgZm9ybWF0dGVyKS5mb3JtYXRQcm9jKGNoaWxkKTsKLQkJCWlmICghZmlyc3QpIHsKLQkJCQlmb3JtYXRCZWZvcmUobm9kZSwgY2hpbGQsIG5ldyBTdHJpbmcoY2hpbGRTb3VyY2UpLCBzb3VyY2UsIG51bGwpOwotCQkJfQotCQkJc291cmNlLmFwcGVuZChjaGlsZFNvdXJjZSk7Ci0JCQkvLyBhcHBlbmQgYmV0d2VlbiBjaGlsZHJlbgotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJZmlyc3QgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZvcm1hdENoaWxkcmVuKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpbnQgY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlTdHJpbmdCdWZmZXIgY2hpbGRTb3VyY2UgPSBudWxsOwotCQkJYm9vbGVhbiB0b0ZpbmlzaCA9IGZhbHNlOwotCQkJaWYgKHN0YXJ0IDwgY3VyRW5kKSB7Ci0JCQkJaW50IGN1clN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpZiAoY3VyU3RhcnQgPCBlbmQpIHsKLQkJCQkJLy8gYXBwZW5kIGNoaWxkCi0JCQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSAoKElOb2RlTm90aWZpZXIpIGNoaWxkKS5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCQkJCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQkJY2hpbGRTb3VyY2UgPSAoKEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyKSBmb3JtYXR0ZXIpLmZvcm1hdFByb2MoY2hpbGQpOwotCQkJCQllbHNlCi0JCQkJCQljaGlsZFNvdXJjZSA9ICgoQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIpIGZvcm1hdHRlcikuZm9ybWF0UHJvYyhjaGlsZCwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQl0b0ZpbmlzaCA9IHRydWU7Ci0JCQl9Ci0JCQkvLyBhcHBlbmQgYmV0d2VlbiBjaGlsZHJlbgotCQkJaWYgKCFmaXJzdCkgewotCQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCk7IC8vIGNoYW5nZQotCQkJCS8vIG9ubHkKLQkJCQkvLyBzdGFydAotCQkJCWlmIChzdGFydCA8IGN1ckVuZCkgewotCQkJCQlpbnQgY3VyU3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJaWYgKGN1clN0YXJ0IDwgZW5kKSB7Ci0JCQkJCQlTdHJpbmcgdG9BcHBlbmQgPSAoY2hpbGRTb3VyY2UgIT0gbnVsbCkgPyBuZXcgU3RyaW5nKGNoaWxkU291cmNlKSA6ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQkJCWZvcm1hdEJlZm9yZShub2RlLCBjaGlsZCwgdG9BcHBlbmQsIHNvdXJjZSwgbnVsbCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZm9ybWF0QmVmb3JlKG5vZGUsIGNoaWxkLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNoaWxkU291cmNlICE9IG51bGwpIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGNoaWxkU291cmNlKTsKLQkJCX0KLQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQlpZiAodG9GaW5pc2gpCi0JCQkJYnJlYWs7Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGFmdGVyIHRoZSBsYXN0IGNoaWxkIGFuZCBhcHBlbmQgdG8gc3RyaW5nCi0JICogYnVmZmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQgYW5kIGFwcGVuZCB0byBzdHJpbmcKLQkgKiBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmVmb3JlIHRoZSBmaXJzdCBjaGlsZCBhbmQgYXBwZW5kIHRvIHN0cmluZwotCSAqIGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmVmb3JlIHRoZSBmaXJzdCBjaGlsZCBhbmQgYXBwZW5kIHRvIHN0cmluZwotCSAqIGJ1ZmZlcgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdFByb2MoSUNTU05vZGUgbm9kZSkgewotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3JtYXRQcmUobm9kZSwgc291cmNlKTsKLQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgc291cmNlKTsKLQkJZm9ybWF0UG9zdChub2RlLCBzb3VyY2UpOwotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0UHJvYyhJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY3VyU3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBjdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0UHJlKG5vZGUsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXRQcmUobm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQkJY3VyU3RhcnQgPSBjdXJFbmQ7Ci0JCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdENoaWxkcmVuKG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJCWN1clN0YXJ0ID0gY3VyRW5kOwotCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdFBvc3Qobm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdFBvc3Qobm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJY3VyRW5kID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRQcmUobm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdFByZShub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCQljdXJTdGFydCA9IGN1ckVuZDsKLQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRQb3N0KG5vZGUsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXRQb3N0KG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByb3RlY3RlZCBDU1NDbGVhbnVwU3RyYXRlZ3kgZ2V0Q2xlYW51cFN0cmF0ZWd5KElDU1NOb2RlIG5vZGUpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IGN1cnJlbnRTdHJhdGVneSA9IENTU0NsZWFudXBTdHJhdGVneUltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJSUNTU0RvY3VtZW50IGRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gY3VycmVudFN0cmF0ZWd5OwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gY3VycmVudFN0cmF0ZWd5OwotCQlpZiAobW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSAhPSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCS8vIFRPRE8gLSBUUkFOU0lUSU9OIE5ha2Ftb3JpLXNhbiwgb3IgS2l0LCBob3cgY2FuIHdlIG1vdmUgdG8KLQkJCS8vICJIVE1MIiBwbHVnaW4/Ci0JCQkvLyBjYW4gd2Ugc3ViY2xhc3M/Ci0JCQkvLyBjdXJyZW50U3RyYXRlZ3kgPSBDU1NJbkhUTUxDbGVhbnVwU3RyYXRlZ3lJbXBsLmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZGVudChJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQlJQ1NTTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTQXR0cikKLQkJCXBhcmVudCA9ICgoSUNTU0F0dHIpIG5vZGUpLmdldE93bmVyQ1NTTm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAobm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uKQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgcGFyZW50SW5kZW50ID0gZ2V0SW5kZW50KHBhcmVudCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSkKLQkJCXJldHVybiBwYXJlbnRJbmRlbnQgKyBnZXRJbmRlbnRTdHJpbmcoKTsKLQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24pCi0JCQlyZXR1cm4gcGFyZW50SW5kZW50ICsgZ2V0SW5kZW50U3RyaW5nKCk7Ci0JCXJldHVybiBwYXJlbnRJbmRlbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRMYXN0TGluZUxlbmd0aChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcoc291cmNlKTsKLQkJaW50IG4gPSBzdHIubGFzdEluZGV4T2YoZGVsaW0pOwotCQlpZiAobiA8IDApCi0JCQlyZXR1cm4gc3RyLmxlbmd0aCgpOwotCi0JCXJldHVybiBzdHIubGVuZ3RoKCkgLSBuIC0gZGVsaW0ubGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDwgMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zKSkKLQkJCXJldHVybiAwOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlyZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQkvLyBpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJgotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSICYmCi0JCQkvLyByZWdpb24uZ2V0VHlwZSgpICE9Ci0JCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpbnQgcG9zID0gKGZvdW5kID8gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA6IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkgLSBpbnNlcnRQb3M7Ci0JCXJldHVybiAocG9zID49IDApID8gcG9zIDogMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDw9IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcyAtIDEpKQotCQkJcmV0dXJuIDA7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0UG9zIC0gMSk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyAtIDEpOwotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJcmVnaW9uID0gaXQucHJldigpOwotCQkJLy8gaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiAmJgotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSAhPQotCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHBvcyA9IGluc2VydFBvcyAtIChmb3VuZCA/IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSA6IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikpOwotCQkvLyBmbGF0Tm9kZSA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkvLyBpZiAoZm91bmQpIHsKLQkJLy8gaWYgKHJlZ2lvbi5nZXRMZW5ndGgoKSAhPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpKSB7Ci0JCS8vIHBvcyA9IGluc2VydFBvcyAtIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKTsKLQkJLy8gfSBlbHNlIHsKLQkJLy8gcG9zID0gaW5zZXJ0UG9zIC0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCS8vIH0KLQkJLy8gfSBlbHNlIHsKLQkJLy8gcG9zID0gaW5zZXJ0UG9zIC0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJLy8gfQotCQlyZXR1cm4gKHBvcyA+PSAwKSA/IHBvcyA6IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoSUNTU05vZGUgbm9kZSkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSAobm9kZSAhPSBudWxsKSA/IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkgOiBudWxsOwotCQlyZXR1cm4gKG1vZGVsICE9IG51bGwpID8gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpIDogIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFRPRE8gOiBjaGVjayB3aGV0aGVyIHRvIHVzZSBtb2RlbC5nZXRMaW5lRGVsaW1pdGVyKCkgb3IKLQkJLy8gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uW10gZ2V0T3V0c2lkZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudCBtb2RlbCwgSVJlZ2lvbiByZWcpIHsKLQkJQ29tcG91bmRSZWdpb25bXSByZXQgPSBuZXcgQ29tcG91bmRSZWdpb25bMl07Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKG1vZGVsLCByZWcuZ2V0T2Zmc2V0KCkpOwotCQlpdC5wcmV2KCk7Ci0JCWlmIChpdC5oYXNQcmV2KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlyZXRbMF0gPSBuZXcgQ29tcG91bmRSZWdpb24oZG9jdW1lbnRSZWdpb24sIHRleHRSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0WzBdID0gbnVsbDsKLQkJfQotCQlpdC5yZXNldChtb2RlbCwgcmVnLmdldE9mZnNldCgpICsgcmVnLmdldExlbmd0aCgpKTsKLQkJaWYgKGl0Lmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXJldFsxXSA9IG5ldyBDb21wb3VuZFJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgdGV4dFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXRbMV0gPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENTU1NvdXJjZUdlbmVyYXRvciBnZXRQYXJlbnRGb3JtYXR0ZXIoSUNTU05vZGUgbm9kZSkgewotCQlJQ1NTTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gKENTU1NvdXJjZUdlbmVyYXRvcikgKChJTm9kZU5vdGlmaWVyKSBwYXJlbnQpLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJCWZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIHBhcmVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZm9ybWF0dGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbltdIGdldFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudCBtb2RlbCwgSVJlZ2lvbiByZWcsIElSZWdpb24gZXhjZXB0Rm9yLCBTdHJpbmcgcGlja3VwVHlwZSkgewotCQlpbnQgc3RhcnQgPSByZWcuZ2V0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSByZWcuZ2V0T2Zmc2V0KCkgKyByZWcuZ2V0TGVuZ3RoKCk7Ci0JCWludCBzdGFydEUgPSAoZXhjZXB0Rm9yICE9IG51bGwpID8gZXhjZXB0Rm9yLmdldE9mZnNldCgpIDogLTE7Ci0JCWludCBlbmRFID0gKGV4Y2VwdEZvciAhPSBudWxsKSA/IGV4Y2VwdEZvci5nZXRPZmZzZXQoKSArIGV4Y2VwdEZvci5nZXRMZW5ndGgoKSA6IDA7Ci0KLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBtb2RlbC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCWJvb2xlYW4gcGlja3VwZWQgPSBmYWxzZTsKLQkJd2hpbGUgKGZsYXROb2RlICE9IG51bGwgJiYgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IGVuZCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlJdGVyYXRvciBpdCA9IHJlZ2lvbkxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8IHN0YXJ0KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoZW5kIDw9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChzdGFydEUgPj0gMCAmJiBzdGFydEUgPD0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSAmJiBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSA8PSBlbmRFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPKQotCQkJCQlsaXN0LmFkZChuZXcgQ29tcG91bmRSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbikpOwotCQkJCWVsc2UgaWYgKCFwaWNrdXBlZCAmJiByZWdpb24uZ2V0VHlwZSgpID09IHBpY2t1cFR5cGUpIHsKLQkJCQkJbGlzdC5hZGQobmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCByZWdpb24pKTsKLQkJCQkJcGlja3VwZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChsaXN0LnNpemUoKSA+IDApIHsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG5ldyBDb21wb3VuZFJlZ2lvbltsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocmVnaW9ucyk7Ci0JCQlyZXR1cm4gcmVnaW9uczsKLQkJfQotCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uWzBdOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbltdIGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoSVN0cnVjdHVyZWREb2N1bWVudCBtb2RlbCwgSVJlZ2lvbiByZWcsIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWludCBzdGFydCA9IHJlZy5nZXRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHJlZy5nZXRPZmZzZXQoKSArIHJlZy5nZXRMZW5ndGgoKSAtIDE7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbW9kZWwuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCAmJiBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpIDw9IGVuZCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlJdGVyYXRvciBpdCA9IHJlZ2lvbkxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8IHN0YXJ0KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoZW5kIDwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgKGlzQ2xlYW51cCgpICYmICFzdGd5LmlzRm9ybWF0U291cmNlKCkpKSAvLyBmb3IKLQkJCQkJLy8gbm90Ci0JCQkJCS8vIGZvcm1hdHRpbmcKLQkJCQkJLy8gY2FzZQotCQkJCQkvLyBvbgotCQkJCQkvLyBjbGVhbnVwCi0JCQkJCS8vIGFjdGlvbgotCQkJCQlsaXN0LmFkZChuZXcgQ29tcG91bmRSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbikpOwotCQkJfQotCQkJZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbmV3IENvbXBvdW5kUmVnaW9uW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShyZWdpb25zKTsKLQkJCXJldHVybiByZWdpb25zOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb25bMF07Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGluY2x1ZGVzKElSZWdpb24gcmVnaW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAocmVnaW9uLmdldE9mZnNldCgpIDw9IHN0YXJ0KSAmJiAoZW5kIDw9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzQ2xlYW51cCgpIHsKLQkJcmV0dXJuIHN0cmF0ZWd5ID09IENMRUFOVVA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRm9ybWF0KCkgewotCQlyZXR1cm4gc3RyYXRlZ3kgPT0gRk9STUFUOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZXNQcmVFbmQoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gKHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkUyhDb21wb3VuZFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSZWdpb24gb3ZlcmxhcHBlZFJlZ2lvbihJUmVnaW9uIHJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChvdmVybGFwcyhyZWdpb24sIHN0YXJ0LCBlbmQpKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gKHJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBzdGFydCkgPyBzdGFydCA6IHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBsZW5ndGggPSAoKGVuZCA8PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpID8gZW5kIDogcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSAtIG9mZnNldDsKLQkJCXJldHVybiBuZXcgRm9ybWF0UmVnaW9uKG9mZnNldCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3ZlcmxhcHMoSVJlZ2lvbiByZWdpb24sIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIChzdGFydCA8IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgJiYgKHJlZ2lvbi5nZXRPZmZzZXQoKSA8IGVuZCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJDaGFuZ2VDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyQ2hhbmdlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjRhNzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJDaGFuZ2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXR0ckNoYW5nZUNvbnRleHQgewotCi0JcHVibGljIGludCBzdGFydCwgZW5kOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEF0dHJDaGFuZ2VDb250ZXh0KCkgewotCQlzdXBlcigpOwotCQlzdGFydCA9IGVuZCA9IDA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxYTlkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEF0dHJGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIEF0dHJGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlBdHRyRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGU7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSB8fCBhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIHJlZ2lvbnNbaSAtIDFdLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NJbXBvcnRSdWxlLkhSRUYpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORykpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkgPT0gbnVsbCB8fCBhdHRyLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBjb3VudGVyIGF0dHJpYnV0ZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCi0JCQlTdHJpbmcgdmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQl2YWx1ZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikgfHwgYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NQYWdlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCVN0cmluZyB1cmkgPSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NMaW5rQ29udmVydGVyLnN0cmlwRnVuYyh2YWx1ZSk7Ci0JCQkJU3RyaW5nIGZ1bmMgPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSID8gIlVSTCgiIDogInVybCgiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEVfSU5fVVJJKSkgewotCQkJCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUodXJpLCBxdW90ZSk7Ci0JCQkJCXZhbHVlID0gZnVuYyArIHF1b3RlICsgdXJpICsgcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdmFsdWUgPSBmdW5jICsgdXJpICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HKSkgewotCQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQkJaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCJcIiIpICYmICF2YWx1ZS5zdGFydHNXaXRoKCJcJyIpKS8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gcXVvdGUgKyB2YWx1ZTsKLQkJCQlpZiAoIXZhbHVlLmVuZHNXaXRoKCJcIiIpICYmICF2YWx1ZS5lbmRzV2l0aCgiXCciKSkvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IHZhbHVlICsgcXVvdGU7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5UKSkgewotCQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKSA9PSBudWxsIHx8IGF0dHIuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCXZhbHVlID0gdmFsdWUudG9VcHBlckNhc2UoKTsKLQkJCQllbHNlCi0JCQkJCXZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQlzb3VyY2UuYXBwZW5kKHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlmb3JtYXRQcmUobm9kZSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBBdHRyRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQXR0ckZvcm1hdHRlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NGb3JtYXRVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NGb3JtYXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MDg1MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTRm9ybWF0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JQ1NTTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTRm9ybWF0VXRpbCB7Ci0JcHVibGljIExpc3QgY29sbGVjdENTU05vZGVzKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUluZGV4ZWRSZWdpb24gc3RhcnROb2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydCk7Ci0JCUluZGV4ZWRSZWdpb24gZW5kTm9kZSA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnQgKyBsZW5ndGggLSAxKTsKLQotCQlpZiAoc3RhcnROb2RlID09IG51bGwgfHwgZW5kTm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZXM7Ci0JCX0KLQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwgJiYgc3RhcnROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUgJiYgZW5kTm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkvLyBDU1MgbW9kZWwKLQkJCUlDU1NOb2RlIGNhID0gZ2V0Q29tbW9uQW5jZXN0b3IoKElDU1NOb2RlKSBzdGFydE5vZGUsIChJQ1NTTm9kZSkgZW5kTm9kZSk7Ci0JCQlpZiAoY2EgIT0gbnVsbCkgewotCQkJCWZvciAoSUNTU05vZGUgbm9kZSA9IGNhLmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsICYmIHN0YXJ0ICsgbGVuZ3RoIDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChzdGFydCA8ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCAmJiBzdGFydE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSAmJiBlbmROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJc3RhcnROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoVGV4dCkgc3RhcnROb2RlKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlpZiAoZW5kTm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQllbmROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoVGV4dCkgZW5kTm9kZSkuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJLy8gSFRNTCBtb2RlbCwgbWF5YmUKLQkJCUlET01Ob2RlIGNhID0gKElET01Ob2RlKSBnZXRDb21tb25BbmNlc3RvcigoTm9kZSkgc3RhcnROb2RlLCAoTm9kZSkgZW5kTm9kZSk7Ci0JCQlmaW5kQ1NTKG5vZGVzLCBjYSk7Ci0JCX0KLQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q29tbW9uQW5jZXN0b3IgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q29tbW9uQW5jZXN0b3IoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgewotCQlpZiAobm9kZTEgPT0gbnVsbCB8fCBub2RlMiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIG5hID0gbm9kZTI7IG5hICE9IG51bGw7IG5hID0gbmEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlmb3IgKE5vZGUgdGEgPSBub2RlMTsgdGEgIT0gbnVsbDsgdGEgPSB0YS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAodGEgPT0gbmEpCi0JCQkJCXJldHVybiB0YTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRDU1MoTGlzdCBjc3NOb2RlcywgSURPTU5vZGUgbm9kZSkgewotCQlJQ1NTTW9kZWxBZGFwdGVyIGFkYXB0ZXI7Ci0JCWFkYXB0ZXIgPSAoSUNTU01vZGVsQWRhcHRlcikgbm9kZS5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCUlDU1NNb2RlbCBtb2RlbCA9IGFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKSB7Ci0JCQkJY3NzTm9kZXMuYWRkKG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJYWRhcHRlciA9IChJQ1NTTW9kZWxBZGFwdGVyKSBub2RlLmdldEFkYXB0ZXJGb3IoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlJQ1NTTW9kZWwgbW9kZWwgPSBhZGFwdGVyLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuSU5MSU5FKSB7Ci0JCQkJCWNzc05vZGVzLmFkZChtb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKElET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSAoSURPTU5vZGUpIGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWZpbmRDU1MoY3NzTm9kZXMsIGNoaWxkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUNTU05vZGUgZ2V0Q29tbW9uQW5jZXN0b3IoSUNTU05vZGUgbm9kZUEsIElDU1NOb2RlIG5vZGVCKSB7Ci0JCWlmIChub2RlQSA9PSBudWxsIHx8IG5vZGVCID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChJQ1NTTm9kZSBuYSA9IG5vZGVBOyBuYSAhPSBudWxsOyBuYSA9IG5hLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChJQ1NTTm9kZSB0YSA9IG5vZGVCOyB0YSAhPSBudWxsOyB0YSA9IHRhLmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmICh0YSA9PSBuYSkgewotCQkJCQlyZXR1cm4gdGE7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VTb3VyY2UoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHNvdXJjZSkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAob2Zmc2V0ID49IDAgJiYgbGVuZ3RoID49IDAgJiYgb2Zmc2V0ICsgbGVuZ3RoIDw9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoc291cmNlID09IG51bGwpCi0JCQkJc291cmNlID0gbmV3IFN0cmluZygpOwotCQkJLy8gV2UgdXNlICdzdHJ1Y3R1cmVkRG9jdW1lbnQnIGFzIHRoZSByZXF1ZXN0ZXIgb2JqZWN0IGp1c3Qgc28KLQkJCS8vIHRoaXMgYW5kIHRoZSBvdGhlcgotCQkJLy8gZm9ybWF0LXJlbGF0ZWQgJ3JlcGFsY2VUZXh0JyAoaW4gcmVwbGFjZVNvdXJjZSkgY2FuIHVzZSB0aGUKLQkJCS8vIHNhbWUgcmVxdWVzdGVyLgotCQkJLy8gT3RoZXJ3aXNlLCBpZiByZXF1ZXN0ZXIgaXMgbm90IGlkZW50aWNhbCwKLQkJCS8vIHRoZSB1bmRvIGdyb3VwIGdldHMgImJyb2tlbiIgaW50byBtdWx0aXBsZSBwaWVjZXMgYmFzZWQKLQkJCS8vIG9uIHRoZSByZXF1ZXN0ZXJzIGJlaW5nIGRpZmZlcmVudC4gVGVjaG5pY2FsbHksIGFueSB1bmlxdWUsCi0JCQkvLyBjb21tb24KLQkJCS8vIHJlcXVlc3RlciBvYmplY3Qgd291bGQgd29yay4KLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTRm9ybWF0VXRpbCBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTRm9ybWF0VXRpbCgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBDU1NGb3JtYXRVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU0Zvcm1hdFV0aWwgZkluc3RhbmNlOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0NzNhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24KLQkgKi8KLQlTdHJpbmdCdWZmZXIgY2xlYW51cChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmdCdWZmZXIgZm9ybWF0KElDU1NOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjg5YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NTb3VyY2VHZW5lcmF0b3IgZ2V0U291cmNlRm9ybWF0dGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIHRhcmdldDsKLQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgOgotCQkJCXJldHVybiBDaGFyc2V0UnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5GT05URkFDRVJVTEVfTk9ERSA6Ci0JCQkJcmV0dXJuIEZvbnRGYWNlUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUgOgotCQkJCXJldHVybiBJbXBvcnRSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLk1FRElBTElTVF9OT0RFIDoKLQkJCQlyZXR1cm4gTWVkaWFMaXN0Rm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLk1FRElBUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gTWVkaWFSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JCQkJaWYgKHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIpCi0JCQkJCXJldHVybiBDb3VudGVyRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQkJZWxzZSBpZiAodmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVCkKLQkJCQkJcmV0dXJuIFJlY3RGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQllbHNlIGlmICh2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlLkNTU19SR0JDT0xPUikKLQkJCQkJcmV0dXJuIFJHQkZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlBBR0VSVUxFX05PREUgOgotCQkJCXJldHVybiBQYWdlUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUgOgotCQkJCXJldHVybiBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJcmV0dXJuIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVSVUxFX05PREUgOgotCQkJCXJldHVybiBTdHlsZVJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFIDoKLQkJCQlyZXR1cm4gU3R5bGVTaGVldEZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5BVFRSX05PREUgOgotCQkJCXJldHVybiBBdHRyRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gVW5rbm93blJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkgZkluc3RhbmNlOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyZThhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU291cmNlR2VuZXJhdG9yIGV4dGVuZHMgQ1NTU291cmNlRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgcmVnaW9uKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gZXhjZXB0Rm9yKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCWludCBnZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcyk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCWludCBnZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ2hhcnNldFJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NoYXJzZXRSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NGVlZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ2hhcnNldFJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENoYXJzZXRSdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgQ0hBUlNFVCA9ICJAY2hhcnNldCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIENoYXJzZXRSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JQ2hhcnNldFJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0LnByZXYoKTsKLQkJCQlpZiAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCkgKyAxOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQpIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGF0dHIuZ2V0VmFsdWUoKSwgYnVmKTsKLQkJCWJ1Zi5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlmb3JtYXRQcmUobm9kZSwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzb3VyY2UpOwotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCVN0cmluZyBzdHIgPSBDSEFSU0VUOwotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBDSEFSU0VULnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlTdHJpbmcgZW5jID0gKChJQ1NTQ2hhcnNldFJ1bGUpIG5vZGUpLmdldEVuY29kaW5nKCk7Ci0JCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoZW5jLCBxdW90ZSk7Ci0JCQlzdHIgPSBxdW90ZSArICgoZW5jICE9IG51bGwpID8gZW5jIDogIiIpICsgcXVvdGUgKyAiOyI7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzdHIsIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKSAmJiAhcmVnaW9uc1tpXS5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaWYgKCFJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORyk7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbnNbXSA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCBpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpLCBzdGd5KTsKLQkJZm9yIChpbnQgaSA9IHJlZ2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlyZXR1cm4gcmVnaW9uc1tpXS5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiBpTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpCi0JCQkJcmV0dXJuIG4gLSAxOwotCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENoYXJzZXRSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IENoYXJzZXRSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db21wb3VuZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29tcG91bmRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MmZlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db21wb3VuZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1jbGFzcyBDb21wb3VuZFJlZ2lvbiB7Ci0KLQlDb21wb3VuZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZkRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb247Ci0JCXRoaXMuZlRleHRSZWdpb24gPSB0ZXh0UmVnaW9uOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0VGV4dFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZUZXh0UmVnaW9uOwotCX0KLQotCVN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlRleHRSZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCVN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZkRvY3VtZW50UmVnaW9uLmdldFRleHQoZlRleHRSZWdpb24pOwotCX0KLQkKLQkvLyBCdWcgMjE4OTkzOiBBZGRlZCB0byBnZXQgdGV4dCB3aXRoIHdoaXRlc3BhY2UgZm9yIGNsZWFudXAKLQkvLyB3aXRob3V0IGZvcm1hdHRpbmcKLQlTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoZlRleHRSZWdpb24pOwotCX0KLQotCWludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbik7Ci0JfQotCi0JaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoZlRleHRSZWdpb24pOwotCX0KLQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZEb2N1bWVudFJlZ2lvbjsKLQlwcml2YXRlIElUZXh0UmVnaW9uIGZUZXh0UmVnaW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db3VudGVyRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db3VudGVyRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMTcyNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ291bnRlckZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDb3VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3VudGVyRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb3VudGVyRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JQ291bnRlckZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZTsKLQotCQlpZiAoIUlDb3VudGVyLklERU5USUZJRVIuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkgJiYgIUlDb3VudGVyLkxJU1RTVFlMRS5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSAmJiAhSUNvdW50ZXIuU0VQQVJBVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIHNvdXJjZTsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQljb250ZXh0LnN0YXJ0ID0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJY29udGV4dC5lbmQgPSBpTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQotCQlJQ291bnRlciBjb3VudGVyID0gKElDb3VudGVyKSBub2RlOwotCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQlTdHJpbmcgc2VwID0gY291bnRlci5nZXRTZXBhcmF0b3IoKTsKLQkJU3RyaW5nIGlkZW50ID0gY291bnRlci5nZXRJZGVudGlmaWVyKCk7Ci0JCVN0cmluZyBzdHlsZSA9IGNvdW50ZXIuZ2V0TGlzdFN0eWxlKCk7Ci0KLQkJaWYgKElDb3VudGVyLklERU5USUZJRVIuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsKLQkJCWlmIChpbnNlcnQpCi0JCQkJaWRlbnQgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQllbHNlCi0JCQkJaWRlbnQgPSAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoSUNvdW50ZXIuTElTVFNUWUxFLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7Ci0JCQlpZiAoaW5zZXJ0KQotCQkJCXN0eWxlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJZWxzZQotCQkJCXN0eWxlID0gbnVsbDsKLQkJfQotCQllbHNlIGlmIChJQ291bnRlci5TRVBBUkFUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsKLQkJCWlmIChpbnNlcnQpCi0JCQkJc2VwID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJZWxzZQotCQkJCXNlcCA9IG51bGw7Ci0JCX0KLQotCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc2VwLCBxdW90ZSk7Ci0JCXNlcCA9IChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogKHF1b3RlICsgc2VwICsgcXVvdGUpOwotCi0JCVN0cmluZyBmdW5jID0gKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSA/ICJjb3VudGVyKCIgOiAiY291bnRlcnMoIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikgewotCQkJaWRlbnQgPSBpZGVudC50b1VwcGVyQ2FzZSgpOwotCQkJc3R5bGUgPSBzdHlsZS50b1VwcGVyQ2FzZSgpOwotCQkJZnVuYyA9IGZ1bmMudG9VcHBlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCWlkZW50ID0gaWRlbnQudG9Mb3dlckNhc2UoKTsKLQkJCXN0eWxlID0gc3R5bGUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlpZiAoc2VwID09IG51bGwgfHwgc2VwLmxlbmd0aCgpID09IDApIHsKLQkJCXNvdXJjZS5hcHBlbmQoZnVuYyk7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBpZGVudCwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoaWRlbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGlkZW50LCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChpZGVudCk7Ci0JCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc2VwLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzZXApOwotCQl9Ci0KLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUubGVuZ3RoKCkgIT0gMCkgewotCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0eWxlLCBzb3VyY2UpOwotCQl9Ci0JCXNvdXJjZS5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0KLQkJLyoKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPQotCQkgKiBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkgKiBJVGV4dFJlZ2lvbltdIHJlZ2lvbnMgPQotCQkgKiBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3Ci0JCSAqIEZvcm1hdFJlZ2lvbihjb250ZXh0LnN0YXJ0LCBjb250ZXh0LmVuZCAtIGNvbnRleHQuc3RhcnQgKyAxKSk7IGludAotCQkgKiBjb21tYXNbMl07IGludCBudW1Db21tYSA9IDA7IGZvcihpbnQgaiA9IDA7IGogPHJlZ2lvbnMubGVuZ3RoOyBqKyspIHsKLQkJICogaWYgKHJlZ2lvbnNbal0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNPTU1BKSB7Ci0JCSAqIGNvbW1hc1tudW1Db21tYSsrXSA9IGo7IGlmIChudW1Db21tYSA+IDEpIGJyZWFrOyB9IH0KLQkJICogCi0JCSAqIGlmIChJQ291bnRlci5JREVOVElGSUVSLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7IH0gZWxzZQotCQkgKiBpZiAoSUNvdW50ZXIuTElTVFNUWUxFLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7IH0gZWxzZQotCQkgKiBpZiAoSUNvdW50ZXIuU0VQQVJBVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7IGJvb2xlYW4KLQkJICogc2tpcFNwYWNlID0gZmFsc2U7IFN0cmluZyBmdW5jID0gaW5zZXJ0ID8gImNvdW50ZXJzKCIgOiAiY291bnRlcigiOwotCQkgKiBpZiAobWdyLmlzUHJvcFZhbHVlVXBwZXJDYXNlKCkpIGZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCSAqIAotCQkgKiBmb3IoaW50IGk9MDsgaSA8cmVnaW9ucy5sZW5ndGg7IGkrKykgeyBpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0KLQkJICogQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkgKiBzb3VyY2UuYXBwZW5kKGZ1bmMpOyBlbHNlIHsgaWYgKG51bUNvbW1hID09IDIgJiYgY29tbWFzWzFdIDwgaSkgewotCQkgKiAgfSBlbHNlIGlmIChudW1Db21tYSA9PSAxICYmIGNvbW1hc1swXSA8IGkgJiYgaW5zZXJ0KSB7Ci0JCSAqICB9IGVsc2UgaWYgKG51bUNvbW1hID09IDEgJiYgY29tbWFzWzBdIDwgaSAmJiAhIGluc2VydCkgeyB9IGVsc2UgaWYKLQkJICogKG51bUNvbW1hID09IDAgJiYgaW5zZXJ0ICYmIHJlZ2lvbnNbaV0uZ2V0VHlwZSA9PQotCQkgKiBDU1NSZWdpb25Db250ZXh0cy5QQVJFTlRIRVNJU19DTE9TRSkgeyBzb3VyY2UuYXBwZW5kKCIsIik7Ci0JCSAqIGFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsYXR0ci5nZXRWYWx1ZSgpLHNvdXJjZSk7Ci0JCSAqIHNvdXJjZS5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsgfQotCQkgKiAKLQkJICogaWYgKGkgIT0gMCAmJiAhc2tpcFNwYWNlKQotCQkgKiBhcHBlbmRTcGFjZUJlZm9yZShub2RlLHJlZ2lvbnNbaV0sc291cmNlKTsKLQkJICogc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSkpOyB9IHNraXBTcGFjZSA9Ci0JCSAqIGZhbHNlOwotCQkgKiAKLQkJICogaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09Ci0JCSAqIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgc2tpcFNwYWNlID0gdHJ1ZTsgfSB9Ci0JCSAqLwotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWJvb2xlYW4gc2tpcFNwYWNlID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwICYmICFza2lwU3BhY2UpCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc2tpcFNwYWNlID0gZmFsc2U7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXNraXBTcGFjZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJSUNvdW50ZXIgY291bnRlciA9IChJQ291bnRlcikgbm9kZTsKLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQlTdHJpbmcgc2VwYXJhdG9yID0gY291bnRlci5nZXRTZXBhcmF0b3IoKTsKLQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzZXBhcmF0b3IsIHF1b3RlKTsKLQkJCVN0cmluZyBzZXAgPSAoc2VwYXJhdG9yID09IG51bGwgfHwgc2VwYXJhdG9yLmxlbmd0aCgpID09IDApID8gbnVsbCA6IChxdW90ZSArIHNlcGFyYXRvciArIHF1b3RlKTsKLQkJCVN0cmluZyBpZGVudCA9IGNvdW50ZXIuZ2V0SWRlbnRpZmllcigpOwotCQkJU3RyaW5nIHN0eWxlID0gY291bnRlci5nZXRMaXN0U3R5bGUoKTsKLQkJCVN0cmluZyBmdW5jID0gKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSA/ICJjb3VudGVyKCIgOiAiY291bnRlcnMoIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJLy8gbm9ybWFsaXplCi0JCQlpZiAoaWRlbnQgPT0gbnVsbCkKLQkJCQlpZGVudCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChzdHlsZSA9PSBudWxsKQotCQkJCXN0eWxlID0gIiI7Ly8kTk9OLU5MUy0xJAotCi0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikgewotCQkJCWlkZW50ID0gaWRlbnQudG9VcHBlckNhc2UoKTsKLQkJCQlzdHlsZSA9IHN0eWxlLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZnVuYyA9IGZ1bmMudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlkZW50ID0gaWRlbnQudG9Mb3dlckNhc2UoKTsKLQkJCQlzdHlsZSA9IHN0eWxlLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VwID09IG51bGwgfHwgc2VwLmxlbmd0aCgpID09IDApIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGlkZW50LCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoaWRlbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBpZGVudCwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGlkZW50KTsKLQkJCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHNlcCwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHNlcCk7Ci0JCQl9Ci0KLQkJCWlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmxlbmd0aCgpICE9IDApIHsKLQkJCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0eWxlLCBzb3VyY2UpOwotCQkJfQotCQkJc291cmNlLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKElDb3VudGVyLklERU5USUZJRVIuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ291bnRlci5JREVOVElGSUVSKTsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJCXJldHVybiAtMTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpKTsKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJfQotCQllbHNlIGlmIChJQ291bnRlci5MSVNUU1RZTEUuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ291bnRlci5MSVNUU1RZTEUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSkpOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IpCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZSBpZiAoSUNvdW50ZXIuU0VQQVJBVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNvdW50ZXIuU0VQQVJBVE9SKTsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpKTsKLQkJCWJvb2xlYW4gaGFzQ29tbWEgPSBmYWxzZTsKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SKSB7Ci0JCQkJCWlmICghaGFzQ29tbWEpCi0JCQkJCQloYXNDb21tYSA9IHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb3VudGVyRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IENvdW50ZXJGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlY2xDb250YWluZXJGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlY2xDb250YWluZXJGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3OTk5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWNsQ29udGFpbmVyRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNsQ29udGFpbmVyRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlEZWNsQ29udGFpbmVyRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkU2VsZWN0b3JSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBDb21wb3VuZFJlZ2lvbiBwcmV2UmVnaW9uLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCQkKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoIXN0Z3kuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXRleHQgPSByZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJZWxzZQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETykgewotCQkJc2hvcnQgc2VsQ2FzZSA9IHN0Z3kuZ2V0U2VsZWN0b3JUYWdDYXNlKCk7Ci0JCQlpZiAoc2VsQ2FzZSA9PSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpIHsKLQkJCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoc2VsQ2FzZSA9PSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpIHsKLQkJCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQotCQlyZXR1cm4gZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbiwgMCwgc3RneSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGE2NzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZFNwYWNlQmV0d2VlbihJQ1NTTm9kZSBub2RlLCBDb21wb3VuZFJlZ2lvbiBwcmV2LCBDb21wb3VuZFJlZ2lvbiBuZXh0LCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChpc0NsZWFudXAoKSAmJiAhZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpCi0JCQlyZXR1cm47IC8vIGZvciBub3QgZm9ybWF0dGluZyBjYXNlIG9uIGNsZWFudXAgYWN0aW9uCi0KLQkJLy8gaW4gc2VsZWN0b3IKLQkJU3RyaW5nIHByZXZUeXBlID0gcHJldi5nZXRUeXBlKCk7Ci0JCVN0cmluZyBuZXh0VHlwZSA9IG5leHQuZ2V0VHlwZSgpOwotCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZShwcmV2VHlwZSkgJiYgQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZShuZXh0VHlwZSkpIHsKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03Mzk5MAotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDUzOQotCQkJLy8gRm9ybWF0dGluZyBDU1MgZmlsZSBzcGxpdHMgZWxlbWVudC5jbGFzcyBpbnRvIGVsZW1lbnQgLiBjbGFzcwotCQkJaWYgKCgocHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEKSAmJiAobmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IG5leHRUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCkpIHx8ICgocHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MpICYmIG5leHRUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pIHx8IChuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKSkgewotCQkJCS8vIEluZGl2aWR1YWxseSwgU0VMRUNUT1JfRUxFTUVOVF9OQU1FLCBTRUxFQ1RPUl9DTEFTUywgYW5kIFNFTEVDVE9SX0lEIGNhbiBhbGwgYmUgYmVnaW5uaW5nIHR5cGVzLgotCQkJCS8vIEJ1dCwgd2Ugc2hvdWxkIG5vdCBpbnNlcnQgYSBzcGFjZSBpbiBiZXR3ZWVuIHdoZW4gdGhleSBhcmUgZm9sbG93ZWQgYnkgU0VMRUNUT1JfQ0xBU1Mgb3IgU0VMRUNUT1JfSUQuCi0JCQkJLy8gRm9yIGV4YW1wbGU6IEgxLnBhc3RvcmFsIGFuZCBIMSN6OTh5IGFuZCAucGFzdG9yYWwub3RoZXIgYW5kICNteWlkLm15Y2xhc3MKLQkJCQkvLwotCQkJCS8vIEFsc28sIHNwYWNlIGlzIG5vdyBub3QgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB3aGVuIFNFTEVDVE9SX0VMRU1FTlRfTkFNRSBpcyBmb2xsb3dlZCBieSBTRUxFQ1RPUl9QU0VVRE8sIG9yIHdoZW4KLQkJCQkvLyBTRUxFQ1RPUl9DTEFTUyBpcyBmb2xsb3dlZCBieSBTRUxFQ1RPUl9QU0VVRE8uCi0JCQkJLy8gRm9yIGV4YW1wbGU6IFA6Zmlyc3QtbGV0dGVyIGFuZCBBLmV4dGVybmFsOnZpc2l0ZWQKLQkJCX0KLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBuZXh0LCBzb3VyY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTiAmJiBuZXh0VHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJaWYgKHByZXYuZ2V0RW5kT2Zmc2V0KCkgIT0gbmV4dC5nZXRTdGFydE9mZnNldCgpKSB7IC8vIG5vdAotCQkJCQkJCQkJCQkJCQkJCS8vIHNlcXVlbnRpYWwKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBuZXh0LCBzb3VyY2UpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IG5leHRUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBuZXh0LCBzb3VyY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKQotCQkJcmV0dXJuIG47Ci0JCXJldHVybiAtMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb250RmFjZVJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0NmVlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb250RmFjZVJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZvbnRGYWNlUnVsZUZvcm1hdHRlciBleHRlbmRzIERlY2xDb250YWluZXJGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIEZPTlRfRkFDRSA9ICJAZm9udC1mYWNlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgRm9udEZhY2VSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JRm9udEZhY2VSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHN0ciA9IEZPTlRfRkFDRTsKLQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBGT05UX0ZBQ0UudG9VcHBlckNhc2UoKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRm9udEZhY2VSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEZvbnRGYWNlUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwYzlkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIEZvcm1hdFJlZ2lvbiBpbXBsZW1lbnRzIElSZWdpb24gewotCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCwgZkxlbmd0aDsKLQotCS8qKgotCSAqIAotCSAqLwotCUZvcm1hdFJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldChvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSByZWdpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aGlzLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMuZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldExlbmd0aChpbnQgbmV3TGVuZ3RoKSB7Ci0JCWZMZW5ndGggPSBuZXdMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRPZmZzZXQoaW50IG5ld09mZnNldCkgewotCQlmT2Zmc2V0ID0gbmV3T2Zmc2V0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9GdW5jdGlvbkZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRnVuY3Rpb25Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0N2YwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9GdW5jdGlvbkZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgRnVuY3Rpb25Gb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlGdW5jdGlvbkZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkvLyBnZXQgbWVhbmluZyByZWdpb25zCi0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBudWxsOwotCQkJaWYgKGV4Y2VwdEZvciA9PSBudWxsKQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWVsc2UgewotCQkJCVN0cmluZyBwaWNrdXBUeXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOwotCQkJCWlmIChwcmV2ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBleHRyYWN0IHNvdXJjZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJldiAhPSBudWxsICYmIGNoaWxkICE9IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIGJldHdlZW4KLQkJCS8vIHBhcmFtZXRlcnMKLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZSBub2RlLCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJc291cmNlLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDIsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJU3RyaW5nIGZ1bmMgPSBnZXRGdW5jKCk7Ci0JCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCWZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEZ1bmMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0ltcG9ydFJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0ltcG9ydFJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3NTg1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9JbXBvcnRSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgSU1QT1JUID0gIkBpbXBvcnQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBJbXBvcnRSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JSW1wb3J0UnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NJbXBvcnRSdWxlLkhSRUYuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0LnByZXYoKTsKLQkJCQlpZiAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWl0Lm5leHQoKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJaXQubmV4dCgpOwotCQkJCWl0Lm5leHQoKTsKLQkJCQlpZiAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZQotCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIC0gMSk7Ci0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgLSAxKTsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQgJiYgYXR0ci5nZXRWYWx1ZSgpICE9IG51bGwgJiYgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgYXR0ci5nZXRWYWx1ZSgpLCBidWYpOwotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIGJ1Zik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCS8vIGZvciBtZWRpYS10eXBlCi0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1I7Ci0JCQkJaWYgKHByZXYgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJCQlwaWNrdXBUeXBlID0gbnVsbDsKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgZXhjZXB0Rm9yLCBwaWNrdXBUeXBlKTsKLQkJCX0KLQkJCS8vIGV4dHJhY3Qgc291cmNlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCS8vIGJlCi0JCQkJLy8gY29tbWVudHMKLQkJCX0KLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQl9IGVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6ID8/Pz8KLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfSBlbHNlIGlmIChjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6IGJldHdlZW4gJ3VybCgpJyBhbmQKLQkJCS8vIG1lZGlhIHR5cGVzCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkvLyBjb21tZW50cwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNvdXJjZS5hcHBlbmQoIjsiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpICYmICFyZWdpb25zW2ldLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IHJlZ2lvbnNbaV0uZ2V0VGV4dCgpOwotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUKQotCQkJCQlzdHIgPSBkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCQllbHNlCi0JCQkJCXN0ciA9IGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCVN0cmluZyBzdHIgPSBJTVBPUlQ7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IElNUE9SVC50b1VwcGVyQ2FzZSgpOwotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCXN0ciA9ICJ1cmwoIjsvLyROT04tTkxTLTEkCi0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBzdHIudG9VcHBlckNhc2UoKTsKLQkJCVN0cmluZyBocmVmID0gKChJQ1NTSW1wb3J0UnVsZSkgbm9kZSkuZ2V0SHJlZigpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKGhyZWYsIHF1b3RlKTsKLQkJCXN0ciA9IHN0ciArIHF1b3RlICsgaHJlZiArIHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0ciwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QpICYmICgob3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0KSBjaGlsZCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHIgPSByZWdpb25zW2ldLmdldFRleHQoKTsKLQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUKQotCQkJCXN0ciA9IGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpOwotCQkJZWxzZQotCQkJCXN0ciA9IGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIUlDU1NJbXBvcnRSdWxlLkhSRUYuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NJbXBvcnRSdWxlLkhSRUYpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlGb3JtYXRSZWdpb24gZm9ybWF0UmVnaW9uID0gbnVsbDsKLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJZm9ybWF0UmVnaW9uID0gbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIC0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCWVsc2UKLQkJCWZvcm1hdFJlZ2lvbiA9IG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBpTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJQ29tcG91bmRSZWdpb24gcmVnaW9uc1tdID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBmb3JtYXRSZWdpb24sIGdldENsZWFudXBTdHJhdGVneShub2RlKSk7Ci0KLQkJYm9vbGVhbiBhdHJ1bGUgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCkgewotCQkJCWF0cnVsZSA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKCFhdHJ1bGUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gKGNoaWxkICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiBpTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpCi0JCQkJcmV0dXJuIG4gLSAxOwotCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEltcG9ydFJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSW1wb3J0UnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFMaXN0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYUxpc3RGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0ZWIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYUxpc3RGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFMaXN0Rm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBNZWRpYUxpc3RGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlNZWRpYUxpc3RGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJYm9vbGVhbiBmaXJzdCA9IGZhbHNlLCBsYXN0ID0gZmFsc2U7Ci0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0LnByZXYoKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SIHx8IHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRleHQuc3RhcnQgPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJZmlyc3QgPSB0cnVlOwotCi0JCQkJfQotCQkJCWl0LnJlc2V0KGZsYXROb2RlLCByZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgbmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiB8fCBuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPCBjb250ZXh0LmVuZCkgewotCQkJCQljb250ZXh0LmVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWxhc3QgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbGFzdCA9IHRydWU7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SIHx8IHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRleHQuc3RhcnQgPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJZmlyc3QgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQgJiYgYXR0ci5nZXRWYWx1ZSgpICE9IG51bGwgJiYgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCkgewotCQkJaWYgKCFmaXJzdCkKLQkJCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGF0dHIuZ2V0VmFsdWUoKSwgYnVmKTsKLQkJCWJ1Zi5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCWlmICghbGFzdCkgewotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSBpZiAoIWZpcnN0ICYmICFsYXN0KSB7Ci0JCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlNZWRpYUxpc3QgbGlzdCA9IChNZWRpYUxpc3QpIG5vZGU7Ci0JCQlpbnQgbiA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCVN0cmluZyBtZWRpdW0gPSBsaXN0Lml0ZW0oaSk7Ci0JCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQltZWRpdW0gPSBtZWRpdW0udG9VcHBlckNhc2UoKTsKLQkJCQllbHNlCi0JCQkJCW1lZGl1bSA9IG1lZGl1bS50b0xvd2VyQ2FzZSgpOwotCi0JCQkJaWYgKGkgIT0gMCkgewotCQkJCQlzb3VyY2UuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbWVkaXVtLCBzb3VyY2UpOwotCQkJCX0KLQkJCQlzb3VyY2UuYXBwZW5kKG1lZGl1bSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0KLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGlOb2RlLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJLyoKLQkJICogSVRleHRSZWdpb24gcmVnaW9uc1tdID0KLQkJICogZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLAotCQkgKiBuZXcgRm9ybWF0UmVnaW9uKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGlOb2RlLmdldEVuZE9mZnNldCgpIC0KLQkJICogaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIDEpKTsgZm9yKGludCBpPXJlZ2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOwotCQkgKiBpLS0pIHsgaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLklNUE9SVEFOVF9TWU0pCi0JCSAqIHJldHVybiByZWdpb25zW2ldLmdldFN0YXJ0T2Zmc2V0KCk7IH0KLQkJICovCi0JCXJldHVybiBpTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBNZWRpYUxpc3RGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgTWVkaWFMaXN0Rm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYVJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL01lZGlhUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTlmNTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL01lZGlhUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSdWxlRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE1FRElBID0gIkBtZWRpYSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIE1lZGlhUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCU1lZGlhUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJaWYgKChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB8fCAocHJldiA9PSBudWxsICYmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpKSkgewotCQkJCQlwaWNrdXBUeXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRTsKLQkJCQl9Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBleHRyYWN0IHNvdXJjZQotCQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBiZXR3ZWVuCi0JCQkJLy8gIkBtZWRpYSIKLQkJCQkvLyBhbmQKLQkJCQkvLyBtZWRpYXR5cGUKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCS8vIGJlCi0JCQkJCS8vIGNvbW1lbnRzCi0JCQkJfQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJfSBlbHNlIGlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsIHx8IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpKSB7IC8vIGJldHdlZW4KLQkJCQkvLyBtZWRpYXR5cGUKLQkJCQkvLyBhbmQKLQkJCQkvLyB0aGUKLQkJCQkvLyBmaXJzdAotCQkJCS8vIHN0eWxlCi0JCQkJLy8gcnVsZQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJLy8gYmUKLQkJCQkJLy8gY29tbWVudHMKLQkJCQl9Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0gZWxzZSB7IC8vIGJldHdlZW4gc3R5bGVzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkvLyBiZQotCQkJCQkvLyBjb21tZW50cwotCQkJCX0KLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgcHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBhZnRlcgotCQkJCS8vIHRoZQotCQkJCS8vIGxhc3QKLQkJCQkvLyBzdHlsZQotCQkJCS8vIHJ1bGUKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLmdldFBhcmVudE5vZGUoKSwgbnVsbCwgc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7IC8vIGJldHdlZW4KLQkJCQkvLyAiQG1lZGlhIgotCQkJCS8vIGFuZAotCQkJCS8vIG1lZGlhdHlwZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJfSBlbHNlIGlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7IC8vIGJldHdlZW4KLQkJCQkvLyBtZWRpYXR5cGUKLQkJCQkvLyBhbmQKLQkJCQkvLyB0aGUKLQkJCQkvLyBmaXJzdAotCQkJCS8vIHN0eWxlCi0JCQkJLy8gcnVsZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBudWxsLCBzb3VyY2UpOwotCQkJfSBlbHNlIHsgLy8gbm9ybWFsIGNhc2UKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7IC8vIGJldHdlZW4KLQkJCS8vICJAbWVkaWEiCi0JCQkvLyBhbmQKLQkJCS8vIG1lZGlhdHlwZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsIHx8IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpKSB7IC8vIGJldHdlZW4KLQkJCS8vIG1lZGlhdHlwZQotCQkJLy8gYW5kCi0JCQkvLyB0aGUKLQkJCS8vIGZpcnN0Ci0JCQkvLyBzdHlsZQotCQkJLy8gcnVsZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBiZXR3ZWVuIHN0eWxlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gc291cmNlIGZvcm1hdHRpbmcKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWlmIChub2RlLmdldExhc3RDaGlsZCgpID09IG51bGwgfHwgbm9kZS5nZXRMYXN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJvb2xlYW4gYkluQ3VybHlCcmFjZSA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWJJbkN1cmx5QnJhY2UpCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQllbHNlCi0JCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKQotCQkJCQkJYkluQ3VybHlCcmFjZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCWlmIChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgbm9kZS5nZXRMYXN0Q2hpbGQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgInsiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCXNvdXJjZS5hcHBlbmQoIn0iKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJU3RyaW5nIHN0ciA9IE1FRElBOwotCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IE1FRElBLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCX0KLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgKGNoaWxkIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0KSAmJiAoKG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdCkgY2hpbGQpLmdldExlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBNZWRpYVJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgTWVkaWFSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0TmV4dFNpYmxpbmcoKSA9PSBub2RlLmdldExhc3RDaGlsZCgpKSB7IC8vIGluc2VydGVkCi0JCQkvLyBmaXJzdAotCQkJLy8gc3R5bGUKLQkJCS8vIHJ1bGUKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gMDsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKG5ub2RlLmdldEVuZE9mZnNldCgpIDw9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWludCBwb3MgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pIC0gaW5zZXJ0UG9zOwotCQkJcmV0dXJuIChwb3MgPj0gMCkgPyBwb3MgOiAwOwotCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihub2RlLCBpbnNlcnRQb3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0TmV4dFNpYmxpbmcoKSA9PSBub2RlLmdldExhc3RDaGlsZCgpKSB7IC8vIGluc2VydGVkCi0JCQkvLyBmaXJzdAotCQkJLy8gc3R5bGUKLQkJCS8vIHJ1bGUKLQkJCWludCBwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChwb3MgPD0gMCkKLQkJCQlwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkgKyA2IC8qCi0JCQkJCQkJCQkJCQkJCQkJCSAqIGxlbmd0aAotCQkJCQkJCQkJCQkJCQkJCQkgKiBvZgotCQkJCQkJCQkJCQkJCQkJCQkgKiAiQG1lZGlhIgotCQkJCQkJCQkJCQkJCQkJCQkgKi87Ci0JCQlyZXR1cm4gaW5zZXJ0UG9zIC0gcG9zOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKG5vZGUsIGluc2VydFBvcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUGFnZVJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1BhZ2VSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMWY3YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUGFnZVJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBhZ2VSdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVjbENvbnRhaW5lckZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgUEFHRSA9ICJAcGFnZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFBhZ2VSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUGFnZVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5uZXh0KCk7Ci0JCQkJaWYgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZXh0KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHBvcyA9IGdldEF0dHJJbnNlcnRQb3Mobm9kZSwgYXR0ci5nZXROYW1lKCkpOwotCQkJCWNvbnRleHQuc3RhcnQgPSBwb3M7Ci0JCQkJY29udGV4dC5lbmQgPSBwb3M7Ci0JCQkJLyoKLQkJCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0KLQkJCQkgKiBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldE5vZGVBdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJICogSVRleHRSZWdpb24gcmVnaW9uID0KLQkJCQkgKiBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJICogaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuUykgewotCQkJCSAqIGNvbnRleHQuc3RhcnQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsgY29udGV4dC5lbmQgPQotCQkJCSAqIHJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsgfSBlbHNlIHsgY29udGV4dC5zdGFydCA9Ci0JCQkJICogZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCkgKyAxOyBjb250ZXh0LmVuZCA9Ci0JCQkJICogZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7IH0KLQkJCQkgKi99Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0KSB7Ci0JCQlTdHJpbmcgdmFsID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSA+IDApIHsKLQkJCQlidWYuYXBwZW5kKHZhbCk7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIGJ1Zik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlTdHJpbmcgc3RyID0gUEFHRTsKLQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBQQUdFLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlzdHIgPSAoKElDU1NQYWdlUnVsZSkgbm9kZSkuZ2V0U2VsZWN0b3JUZXh0KCk7Ci0JCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0ciwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQl9Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgKGkgPT0gMCkgPyBvdXRzaWRlWzBdIDogcmVnaW9uc1tpIC0gMV0sIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgcmVnaW9uc1tyZWdpb25zLmxlbmd0aCAtIDFdLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIUlDU1NQYWdlUnVsZS5TRUxFQ1RPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWVsc2UgaWYgKCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQlpZiAoaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPj0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBQYWdlUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBQYWdlUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1ByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTVjOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlQcmltaXRpdmVWYWx1ZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJYm9vbGVhbiBhcHBlbmRRdW90ZSA9IHJlZ2lvbnMubGVuZ3RoID4gMSAmJiBub2RlLmdldFBhcmVudE5vZGUoKSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtICYmIGlzQ2xlYW51cCgpICYmIGdldENsZWFudXBTdHJhdGVneShub2RlKS5pc1F1b3RlVmFsdWVzKCkgJiYgKCgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUuZ2V0UGFyZW50Tm9kZSgpKS5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9GT05UKSB8fCAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlLmdldFBhcmVudE5vZGUoKSkuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpIHx8ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUuZ2V0UGFyZW50Tm9kZSgpKS5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9WT0lDRV9GQU1JTFkpKTsKLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlib29sZWFuIHNraXBTcGFjZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCAmJiAhc2tpcFNwYWNlKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzdHJCdWYpOwotCQkJCXNraXBTcGFjZSA9IGZhbHNlOwotCQkJCXN0ckJ1Zi5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlza2lwU3BhY2UgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoYXBwZW5kUXVvdGUpIHsKLQkJCQlzb3VyY2UuYXBwZW5kKHF1b3RlKTsKLQkJCQlTdHJpbmcgc3RyID0gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JCQkJc3RyID0gc3RyLnJlcGxhY2UoJ1wnJywgJyAnKTsKLQkJCQlzdHIgPSBzdHIucmVwbGFjZSgnXCInLCAnICcpOwotCQkJCXN0ciA9IHN0ci50cmltKCk7Ci0JCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJCXNvdXJjZS5hcHBlbmQocXVvdGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc291cmNlLmFwcGVuZChzdHJCdWYpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JCQlzaG9ydCB0eXBlID0gdmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQotCQkJU3RyaW5nIHN0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVIgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0UgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRVhTIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ00gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01NIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BDIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ERUcgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JBRCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTVMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1MgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0haIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19LSFogOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVIgOgotCQkJCQlpZiAodmFsdWUuZ2V0RmxvYXRWYWx1ZSh0eXBlKSA9PSAoKGludCkgdmFsdWUuZ2V0RmxvYXRWYWx1ZSh0eXBlKSkpIHsKLQkJCQkJCXN0ciA9IEludGVnZXIudG9TdHJpbmcoKGludCkgdmFsdWUuZ2V0RmxvYXRWYWx1ZSh0eXBlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlzdHIgPSBGbG9hdC50b1N0cmluZyh2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0ggOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTkhFUklUX1BSSU1JVElWRSA6Ci0JCQkJCXN0ciA9IHZhbHVlLmdldFN0cmluZ1ZhbHVlKCk7Ci0JCQkJCWlmIChzdHIgIT0gbnVsbCkgewotCQkJCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCQkJc3RyID0gc3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJc3RyLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkFOR0UgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPTU1BIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU0xBU0ggOgotCQkJCQlzdHIgPSB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpOwotCQkJfQotCi0JCQlTdHJpbmcgcHJlU3RyID0gbnVsbCwgcG9zdFN0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19BVFRSIDoKLQkJCQkJcHJlU3RyID0gImF0dHIoIjsvLyROT04tTkxTLTEkCi0JCQkJCXBvc3RTdHIgPSAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJCXBvc3RTdHIgPSAiY20iOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVI6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHIDoKLQkJCQkJcG9zdFN0ciA9ICJkZWciOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQkJcG9zdFN0ciA9ICJlbSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFMgOgotCQkJCQlwb3N0U3RyID0gImV4IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQgOgotCQkJCQlwb3N0U3RyID0gImdyYWQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCQlwb3N0U3RyID0gIkh6IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOIDoKLQkJCQkJcG9zdFN0ciA9ICJpbiI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19LSFogOgotCQkJCQlwb3N0U3RyID0gImtIeiI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJCXBvc3RTdHIgPSAibW0iOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTVMgOgotCQkJCQlwb3N0U3RyID0gIm1zIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BDIDoKLQkJCQkJcG9zdFN0ciA9ICJwYyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQkJcG9zdFN0ciA9ICIlIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUIDoKLQkJCQkJcG9zdFN0ciA9ICJwdCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QWCA6Ci0JCQkJCXBvc3RTdHIgPSAicHgiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQkJcG9zdFN0ciA9ICJyYWQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1Q6Ci0JCQkJLy8gY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1MgOgotCQkJCQlwb3N0U3RyID0gInMiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HIDoKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHN0ciwgcXVvdGUpOwotCQkJCQlwcmVTdHIgPSBxdW90ZTsKLQkJCQkJcG9zdFN0ciA9IHF1b3RlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkgOgotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc3RyLCBxdW90ZSk7Ci0JCQkJCXByZVN0ciA9ICJ1cmwoIiArIHF1b3RlOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9IHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gdGhlIGZvbGxvd2luZ3MgYXJlIG9yaWdpbmFsIHByaW1pdGl2ZSB2YWx1ZXMKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVU5LTk9XTiA6Ci0JCQkJLy8gdXNlIHN0cgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09NTUEgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RJTUVOU0lPTiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5IRVJJVF9QUklNSVRJVkUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJBTkdFIDoKLQkJCQkJcHJlU3RyID0gIlUrIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQgOgotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc3RyLCBxdW90ZSk7Ci0JCQkJCXByZVN0ciA9ICJmb3JtYXQoIiArIHF1b3RlOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9IHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0xPQ0FMIDoKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHN0ciwgcXVvdGUpOwotCQkJCQlwcmVTdHIgPSAibG9jYWwoIiArIHF1b3RlOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9IHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikgewotCQkJCWlmIChwcmVTdHIgIT0gbnVsbCkKLQkJCQkJcHJlU3RyID0gcHJlU3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQkJaWYgKHBvc3RTdHIgIT0gbnVsbCkKLQkJCQkJcG9zdFN0ciA9IHBvc3RTdHIudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCWlmIChwcmVTdHIgIT0gbnVsbCkKLQkJCQlzb3VyY2UuYXBwZW5kKHByZVN0cik7Ci0JCQlpZiAoc3RyICE9IG51bGwpCi0JCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJaWYgKHBvc3RTdHIgIT0gbnVsbCkKLQkJCQlzb3VyY2UuYXBwZW5kKHBvc3RTdHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SR0JGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JHQkZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjkwOWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JHQkZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJHQkZvcm1hdHRlciBleHRlbmRzIEZ1bmN0aW9uRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJHQkZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVJHQkZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bmMoKSB7Ci0JCXJldHVybiAicmdiKCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFJHQkZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBSR0JGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SZWN0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SZWN0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZWM4MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUmVjdEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlY3RGb3JtYXR0ZXIgZXh0ZW5kcyBGdW5jdGlvbkZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZWN0Rm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUmVjdEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bmMoKSB7Ci0JCXJldHVybiAicmVjdCgiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBSZWN0Rm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFJlY3RGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xJdGVtRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xJdGVtRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOWMwNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsSXRlbUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZURlY2xJdGVtRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZURlY2xJdGVtRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JU3R5bGVEZWNsSXRlbUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQWZ0ZXJDb2xvblNwYWNlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpbnQgbiA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0pOwotCi0JCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJaW50IGFwcGVuZCA9IGdldEZpcnN0Q2hpbGRSZWdpb25MZW5ndGgobm9kZSk7Ci0JCQlpZiAobGVuZ3RoICsgbiArIGFwcGVuZCA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJbiA9IDA7IC8vIG5vIHNwYWNlIGlzIG5lY2Vzc2FyeQotCQkJfQotCQl9Ci0JCS8vIG5vIGRlbGltaXRlciBjYXNlCi0JCXdoaWxlIChuLS0gPiAwKQotCQkJc291cmNlLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGludCBnZXRGaXJzdENoaWxkUmVnaW9uTGVuZ3RoKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU05vZGUgZmlyc3RDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIDE7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgZmlyc3RDaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIHN0YXJ0KTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZyA9IGl0ci5uZXh0KCk7Ci0JCQlpZiAocmVnICE9IG51bGwgJiYgcmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQlyZXR1cm4gcmVnLmdldFRleHRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVC5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQucHJldigpOwotCQkJCWlmIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCAmJiBhdHRyLmdldFZhbHVlKCkgIT0gbnVsbCAmJiBhdHRyLmdldFZhbHVlKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgZXhjZXB0Rm9yLCBudWxsKTsKLQkJCX0KLQkJCS8vIGdlbmVyYXRlIHNvdXJjZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCWlmICgoKElDU1NQcmltaXRpdmVWYWx1ZSkgY2hpbGQpLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPTU1BKQotCQkJCXRvQXBwZW5kID0gIiwiOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKCgoSUNTU1ByaW1pdGl2ZVZhbHVlKSBjaGlsZCkuZ2V0UHJpbWl0aXZlVHlwZSgpID09IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU0xBU0gpCi0JCQkJdG9BcHBlbmQgPSAiLyI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIHRvQXBwZW5kICE9IG51bGwgJiYgIXRvQXBwZW5kLmVxdWFscygiLCIpICYmICF0b0FwcGVuZC5lcXVhbHMoIi8iKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDIsIHN0Z3kpKTsgLy8gbXVzdCBiZQotCQkJLy8gY29tbWVudHMKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCWlmICh0b0FwcGVuZCAhPSAiLCIgJiYgdG9BcHBlbmQgIT0gIi8iKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJLy8gYXBwZW5kICIhaW1wb3J0YW50IgotCQkJU3RyaW5nIHByaW9yaXR5ID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJpb3JpdHkoKTsKLQkJCWlmIChwcmlvcml0eSAhPSBudWxsICYmIHByaW9yaXR5Lmxlbmd0aCgpID4gMCkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHByaW9yaXR5LCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQocHJpb3JpdHkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wTmFtZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRvZSBzb3VyY2UKLQkJCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSAoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGU7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXNvdXJjZS5hcHBlbmQoaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKS50b1VwcGVyQ2FzZSgpKTsKLQkJCWVsc2UKLQkJCQlzb3VyY2UuYXBwZW5kKGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCkpOwotCi0JCQlpbnQgayA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQkJaW50IGFwcGVuZCA9IDE7Ci0JCQkJaWYgKGxlbmd0aCArIGsgKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCQlrID0gMDsgLy8gbm8gc3BhY2UgaXMgbmVjZXNzYXJ5Ci0JCQkJfQotCQkJfQotCQkJLy8gbm8gZGVsaW1pdGVyIGNhc2UKLQkJCXdoaWxlIChrLS0gPiAwKQotCQkJCXNvdXJjZS5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCI6Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghaXNDbGVhbnVwKCkgfHwgZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpIHsKLQkJCWFwcGVuZEFmdGVyQ29sb25TcGFjZShub2RlLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BOYW1lUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikgJiYgKCFpc0NsZWFudXAoKSB8fCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkpIHsKLQkJCQlhcHBlbmRBZnRlckNvbG9uU3BhY2Uobm9kZSwgc291cmNlKTsKLQkJCX0gZWxzZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdFZhbHVlKElDU1NOb2RlIG5vZGUpIHsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgc291cmNlKTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCk7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbnNbXSA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCBpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpLCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkpOwotCQlmb3IgKGludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQpCi0JCQkJcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPCAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCAmJiBmbGF0Tm9kZS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJbiAtPSBmbGF0Tm9kZS5nZXRMZW5ndGgoKTsKLQkJfQotCQlpZiAobiA+IDApIHsKLQkJCVN0cmluZyBpbXBvcnRhbnQgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcmlvcml0eSgpOwotCQkJaWYgKGltcG9ydGFudCAhPSBudWxsICYmIGltcG9ydGFudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBmaW5kIGJlZm9yZSAiIWltcG9ydGFudCIgcG9zaXRpb24KLQkJCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkpOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCQlpZiAoaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gZmxhdE5vZGUpCi0JCQkJCQlicmVhazsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCkKLQkJCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCS8vIHNraXAgbGFzdCBzcGFjZQotCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCW4gLT0gcmVnaW9uLmdldExlbmd0aCgpIC0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCX0KLQotCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVEZWNsSXRlbUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmM5Mjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCi0JCS8vIGNoZWNrIG5vIGNoaWxkCi0JCWlmIChjaGlsZCA9PSBudWxsICYmIHByZXYgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlDU1NNb2RlbCBjc3NNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24gd2l0aCBubwotCQkJLy8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCQkJaWYgKGV4Y2VwdEZvciA9PSBudWxsKQotCQkJCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyBwaWNrdXBUeXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsKLQkJCQkJCWlmIChwcmV2ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCQkJCQlwaWNrdXBUeXBlID0gbnVsbDsKLQkJCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJCQl9Ci0JCQkJCS8vIGV4dHJhY3Qgc291cmNlCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkJLy8gYmUgY29tbWVudHMKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChwcmV2ICE9IG51bGwgJiYgY2hpbGQgIT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOgotCQkJLy8gYmV0d2VlbiB0d28gZGVjbGFyYXRpb25zCi0JCQkvLyBCVUc5MzAzNy1wcm9wZXJ0aWVzIHZpZXcgYWRkcyBleHRyYSA7IHdoZW4gYWRkIG5ldyBwcm9wZXJ0eQotCQkJYm9vbGVhbiBzZW1pY29sb25Gb3VuZCA9IGZhbHNlOwotCi0JCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJLy8gQlVHMjAyNjE1IC0gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN0eWxlIGRlY2xhcmF0aW9uIHdpdGggbm8KLQkJCS8vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNzc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQlpbnQgcHJldlN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQkJCQlpbnQgcHJldkVuZCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHByZXZTdGFydCwgcHJldkVuZCAtIHByZXZTdGFydCksIHN0Z3kpOwotCQkJCQlpbnQgaSA9IHJlZ2lvbnMubGVuZ3RoIC0gMTsKLQkJCQkJd2hpbGUgKGkgPj0gMCAmJiAhc2VtaWNvbG9uRm91bmQpIHsKLQkJCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKQotCQkJCQkJCXNlbWljb2xvbkZvdW5kID0gdHJ1ZTsKLQkJCQkJCS0taTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghc2VtaWNvbG9uRm91bmQpCi0JCQkJc291cmNlLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcmV2ID09IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDogYmVmb3JlIHRoZSBmaXJzdAotCQkJLy8gZGVjbGFyYXRpb24KLQkJCW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yIGl0ID0gbnVsbDsKLQkJCWlmIChlbmQgPiAwKSB7Ci0JCQkJSUNTU01vZGVsIGNzc01vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24gd2l0aAotCQkJCS8vIG5vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaXQgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBlbmQgLSAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCWlmIChwb3MgPj0gMCkgewotCQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24KLQkJCQkJLy8gd2l0aCBubyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvcyAtIDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGl0ICE9IG51bGwpIHsKLQkJCQlpbnQgbGltaXQgPSAoKEluZGV4ZWRSZWdpb24pICgobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgPyBub2RlLmdldFBhcmVudE5vZGUoKSA6IG5vZGUpKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gY3VyUmVnID0gaXQucHJldigpOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IGN1clJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBjdXJSZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGN1clJlZykgPD0gbGltaXQpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hpbGQgPT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOiBhZnRlciB0aGUgbGFzdAotCQkJLy8gZGVjbGFyYXRpb24KLQkJCW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yIGl0ID0gbnVsbDsKLQkJCWlmIChzdGFydCA+IDApIHsKLQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCS8vIEJVRzIwMjYxNSAtIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRoCi0JCQkJLy8gbm8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjc3NNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCWlmIChwb3MgPj0gMCkgewotCQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24KLQkJCQkJLy8gd2l0aCBubyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXQgIT0gbnVsbCkgewotCQkJCWludCBsaW1pdCA9ICgoSW5kZXhlZFJlZ2lvbikgKChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSA/IG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZSkpLmdldEVuZE9mZnNldCgpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gY3VyUmVnID0gaXQubmV4dCgpOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IGN1clJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBjdXJSZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQkvLyBCdWcgMjE5MDA0IC0gQmVmb3JlIGFwcGVuZGluZyBhIDssIG1ha2Ugc3VyZSB0aGF0IHRoZXJlCi0JCQkJCQkvLyBpc24ndCBvbmUgYWxyZWFkeQotCQkJCQkJYm9vbGVhbiBzZW1pY29sb25Gb3VuZCA9IGZhbHNlOwotCQkJCQkJd2hpbGUoaXQuaGFzTmV4dCgpICYmICFzZW1pY29sb25Gb3VuZCkgewotCQkJCQkJCWlmKGl0Lm5leHQoKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCQkJc2VtaWNvbG9uRm91bmQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZighc2VtaWNvbG9uRm91bmQpCi0JCQkJCQkJc291cmNlLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChsaW1pdCA8PSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoY3VyUmVnKSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkgewotCQkJCS8vIGdldCBuZXh0IHJlZ2lvbgotCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQlDb21wb3VuZFJlZ2lvbiB0b0FwcGVuZFJlZ2lvbiA9IG51bGw7Ci0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCUlDU1NNb2RlbCBjc3NNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJCS8vIEJVRzIwMjYxNSAtIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzdHlsZSBkZWNsYXJhdGlvbgotCQkJCQkvLyB3aXRoIG5vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjc3NNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zKTsKLQkJCQkJCQl0b0FwcGVuZFJlZ2lvbiA9IG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIHRvQXBwZW5kUmVnaW9uLCBzb3VyY2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKChwcmV2ICE9IG51bGwgfHwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA8PSAwKSkgewotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkgJiYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG5vZGUgfHwgIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJZWxzZSBpZiAocHJldiAhPSBudWxsIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG5vZGUpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSUNTU01vZGVsIGNzc01vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJLy8gQlVHMjAyNjE1IC0gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN0eWxlIGRlY2xhcmF0aW9uCi0JCS8vIHdpdGggbm8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNzc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCQkJfQotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpICYmIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpICYmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKSAhPSBub2RlIHx8ICFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSkpIHsKLQkJCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpbnQgcG9zID0gc3VwZXIuZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChwb3MgPCAwKSB7Ci0JCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gZ2V0UGFyZW50Rm9ybWF0dGVyKG5vZGUpOwotCQkJcmV0dXJuIChmb3JtYXR0ZXIgIT0gbnVsbCkgPyBmb3JtYXR0ZXIuZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZS5nZXRQYXJlbnROb2RlKCkpIDogLTE7Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcykpIHsKLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsICYmIG5ub2RlLmdldEVuZE9mZnNldCgpIDw9IDApIHsKLQkJCQlDU1NTb3VyY2VHZW5lcmF0b3IgcG50Rm9ybWF0dGVyID0gZ2V0UGFyZW50Rm9ybWF0dGVyKG5vZGUpOwotCQkJCWlmIChwbnRGb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHBudEZvcm1hdHRlci5nZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIobm9kZS5nZXRQYXJlbnROb2RlKCksIGluc2VydFBvcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKG5vZGUsIGluc2VydFBvcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8PSAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MgLSAxKSkgewotCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwgJiYgbm5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkgewotCQkJCUNTU1NvdXJjZUdlbmVyYXRvciBwbnRGb3JtYXR0ZXIgPSBnZXRQYXJlbnRGb3JtYXR0ZXIobm9kZSk7Ci0JCQkJaWYgKHBudEZvcm1hdHRlciAhPSBudWxsKQotCQkJCQlyZXR1cm4gcG50Rm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIGluc2VydFBvcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShub2RlLCBpbnNlcnRQb3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2E5OGI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlUnVsZUZvcm1hdHRlciBleHRlbmRzIERlY2xDb250YWluZXJGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JU3R5bGVSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWlmICghSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0Lm5leHQoKTsKLQkJCQlpZiAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCkgewotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIGJ1Zik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgcmVnaW9uc1tpIC0gMV0sIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRTZWxlY3RvclJlZ2lvbihyZWdpb25zW2ldLCAoaSAhPSAwKSA/IHJlZ2lvbnNbaSAtIDFdIDogbnVsbCwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVN0cmluZyBzdHIgPSAoKElDU1NTdHlsZVJ1bGUpIG5vZGUpLmdldFNlbGVjdG9yVGV4dCgpOwotCQkJLy8gYXBwZW5kU3BhY2VCZWZvcmUobm9kZSxzdHIsc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCAoaSA9PSAwKSA/IG91dHNpZGVbMF0gOiByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkU2VsZWN0b3JSZWdpb24ocmVnaW9uc1tpXSwgKGkgIT0gMCkgPyByZWdpb25zW2kgLSAxXSA6IG51bGwsIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgcmVnaW9uc1tyZWdpb25zLmxlbmd0aCAtIDFdLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIUlDU1NTdHlsZVJ1bGUuU0VMRUNUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJZWxzZQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZVJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVNoZWV0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVNoZWV0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODNjYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVTaGVldEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZVNoZWV0Rm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVTaGVldEZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0eWxlU2hlZXRGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChwcmV2ID09IG51bGwgJiYgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVI7Ci0JCQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCAocmVnaW9ucy5sZW5ndGggPiAwKSA/IHJlZ2lvbnNbMF0gOiBudWxsLCBzb3VyY2UpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBjb21tZW50cwotCQkJCQkJCQkJCQkJCQkJCQkJLy8gb3IKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNlbWlfY29sb24KLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikgewotCQkJCQkvLyBhcHBlbmQgZGVsaW0gYWZ0ZXIKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocHJldiAhPSBudWxsKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJldiAhPSBudWxsICYmIGNoaWxkICE9IG51bGwpIHsgLy8gc291cmNlIGdlbmVyYXRpb24gOgotCQkJCQkJCQkJCQkJCS8vIGJldHdlZW4gdHdvIHJ1bGVzCi0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQl9Ci0JCWVsc2UgaWYgKCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAocHJldiA9PSBudWxsKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nIDogYmVmb3JlIHRoZSBmaXJzdCBydWxlCi0JCQkJSUNTU05vZGUgbmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCWlmIChuZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBuZXh0KS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQkJCXBvcyA9ICgoSW5kZXhlZFJlZ2lvbikgbmV4dCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpZiAocG9zICE9IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQlDb21wb3VuZFJlZ2lvbltdIHByZXZSZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oMCwgcG9zKSwgbnVsbCwgbnVsbCk7Ci0JCQkJCWlmIChwcmV2UmVnaW9ucyAhPSBudWxsICYmIHByZXZSZWdpb25zLmxlbmd0aCA+IDApCi0JCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkID09IG51bGwpIHsgLy8gc291cmNlIGZvcm1hdHRpbmcgOiBhZnRlciB0aGUgbGFzdAotCQkJCQkJCQkJCS8vIHJ1bGUKLQkJCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDw9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoc3RhcnQgPD0gMCkgewotCQkJCQlpbnQgcG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQkJCWlmIChwb3MgPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QgYmUKLQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJfQotCQkJaWYgKChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5sZW5ndGggPiAwICYmIHJlZ2lvbnNbcmVnaW9ucy5sZW5ndGggLSAxXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQykgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UgeyAvLyBzb3VyY2UgZ2VuZXJhdGlvbgotCQkJaWYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkgIT0gbnVsbCAmJiBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQlyZXR1cm47IC8vIG5vdGhpbmcKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGUgbm9kZSwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDApIHsKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgcmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETyB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKQotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJCWlmIChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKHNvdXJjZS5sZW5ndGgoKSA+IDAgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkpIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkgIT0gbnVsbCAmJiBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKSB7Ci0JCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJLy8gc291cmNlLmFwcGVuZCgiPCEtLSIpOwotCQkJLy8gYXBwZW5kRGVsaW1CZWZvcmUobm9kZSxudWxsLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybjsgLy8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkgfHwgcmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETyB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKSB7Ci0JCQkJaWYgKHNvdXJjZS5sZW5ndGgoKSA+IDAgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnID0gaXQucHJldigpOwotCQkJCWlmIChyZWcuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWcpOwotCQkJfQotCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlU2hlZXRGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVTaGVldEZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvVW5rbm93blJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1Vua25vd25SdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYWJlZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvVW5rbm93blJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmtub3duUnVsZUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgVW5rbm93blJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlVbmtub3duUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCUNTU1Vua25vd25SdWxlIHJ1bGUgPSAoQ1NTVW5rbm93blJ1bGUpIG5vZGU7Ci0JCQlzb3VyY2UuYXBwZW5kKHJ1bGUuZ2V0Q3NzVGV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBVbmtub3duUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBVbmtub3duUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DYXRlZ29yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmFjMTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NQ2F0ZWdvcnkgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JU3RyaW5nIGdldENhcHRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2hhcnNldFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2hhcnNldFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2ZDQ2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNoYXJzZXRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1DaGFyc2V0UnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZGI1ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUNvbnRhaW5lciBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3OTc5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTURlc2NyaXB0b3IgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JSXRlcmF0b3IgZ2V0VmFsdWVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZvbnRGYWNlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Gb250RmFjZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4ZGZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZvbnRGYWNlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NRm9udEZhY2VSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZ1bmN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZTcwNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1GdW5jdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NRnVuY3Rpb24gZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JU3RyaW5nIGdldEZ1bmN0aW9uU3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUltcG9ydFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NSW1wb3J0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmJkMmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NSW1wb3J0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NSW1wb3J0UnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1LZXl3b3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUtleXdvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4MzdmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUtleXdvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUtleXdvcmQgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JU3RyaW5nIGdldEtleXdvcmRTdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTWVkaWFSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU1lZGlhUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTZiN2Q5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTWVkaWFSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1NZWRpYVJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTU4NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1Ob2RlIHsKLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7Ci0KLQlJdGVyYXRvciBnZXRDaGlsZE5vZGVzKCk7Ci0KLQlJdGVyYXRvciBnZXREZXNjZW5kYW50cygpOwotCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIF9QUkVGSVggPSAiQ1NTTU0uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9LRVlXT1JEID0gX1BSRUZJWCArICJLZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9VTklUID0gX1BSRUZJWCArICJVbml0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9GVU5DVElPTiA9IF9QUkVGSVggKyAiRnVuY3Rpb24iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NUUklORyA9IF9QUkVGSVggKyAiU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVFlMRV9TSEVFVCA9IF9QUkVGSVggKyAiU3R5bGVTaGVldCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUFJPUEVSVFkgPSBfUFJFRklYICsgIlByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERVNDUklQVE9SID0gX1BSRUZJWCArICJEZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9DT05UQUlORVIgPSBfUFJFRklYICsgIkNvbnRhaW5lciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTlVNQkVSID0gX1BSRUZJWCArICJOdW1iZXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NFUEFSQVRPUiA9IF9QUkVGSVggKyAiU2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9DSEFSU0VUX1JVTEUgPSBfUFJFRklYICsgIkNoYXJzZXRSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JTVBPUlRfUlVMRSA9IF9QUkVGSVggKyAiSW1wb3J0UnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1RZTEVfUlVMRSA9IF9QUkVGSVggKyAiU3R5bGVSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NRURJQV9SVUxFID0gX1BSRUZJWCArICJNZWRpYVJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BBR0VfUlVMRSA9IF9QUkVGSVggKyAiUGFnZVJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZPTlRfRkFDRV9SVUxFID0gX1BSRUZJWCArICJGb250RmFjZVJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NBVEVHT1JZID0gX1BSRUZJWCArICJDYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUVUQV9NT0RFTCA9IF9QUkVGSVggKyAiTWV0YU1vZGVsIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TRUxFQ1RPUiA9IF9QUkVGSVggKyAiU2VsZWN0b3IiOyAvLyROT04tTkxTLTEkCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1OdW1iZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzBmNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1OdW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTU51bWJlciBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1QYWdlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1QYWdlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2EwODQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUGFnZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVBhZ2VSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MmY3MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NUHJvcGVydHkgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JU3RyaW5nIGdldENhdGVnb3J5TmFtZSgpOwotCi0JSXRlcmF0b3IgZ2V0VmFsdWVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0M2JiY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1TZWxlY3RvciBleHRlbmRzIENTU01NTm9kZSB7Ci0JU3RyaW5nIGdldFNlbGVjdG9yVHlwZSgpOwotCi0JU3RyaW5nIGdldFNlbGVjdG9yU3RyaW5nKCk7Ci0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FWFBSRVNTSU9OID0gIkV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BTRVVET19DTEFTUyA9ICJQc2V1ZG9DbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUFNFVURPX0VMRU1FTlQgPSAiUHNldWRvRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGVtYmVkZGVkIGV4cHJlc3Npb24gdHlwZQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9ERVNDRU5EQU5UID0gImRlc2NlbmRhbnQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX0NISUxEID0gImNoaWxkIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9BREpBQ0VOVCA9ICJhZGphY2VudCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fVU5JVkVSU0FMID0gInVuaXZlcnNhbCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fQVRUUklCVVRFID0gImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3RyaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDgzNzRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1TdHJpbmcgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkNzQ5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NU3R5bGVSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlU2hlZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVTaGVldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjhiMmEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVTaGVldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NU3R5bGVTaGVldCBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Vbml0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3ZDEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVVuaXQgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JU3RyaW5nIGdldFVuaXRTdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01ldGFNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTWV0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzA0OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTWV0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTWV0YU1vZGVsIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCS8vIHB1YmxpYyBpbnRlcmZhY2UgQ1NTTWV0YU1vZGVsIHsKLQlDU1NNTVN0eWxlU2hlZXQgZ2V0U3R5bGVTaGVldCgpOwotCi0JLyoKLQkgKiBTaG9ydGN1dCB0byBhY2Nlc3MgcHJvcGVydHkgbm9kZQotCSAqLwotCS8vIEl0ZXJhdG9yIGdldFByb3BlcnRpZXMoKTsKLQkvLyBJdGVyYXRvciBnZXREZXNjcmlwdG9ycygpOwotCS8vIENTU01NUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0JLyoKLQkgKiBhY2Nlc3MgdG8gY2F0ZWdvcnkgaW5mb3JtYXRpb24KLQkgKi8KLQlJdGVyYXRvciBnZXRDYXRlZ29yaWVzKCk7Ci0KLQkvKgotCSAqIFV0aWxpdGllcwotCSAqLwotCS8vIEl0ZXJhdG9yIGNvbGxlY3ROb2Rlc0J5VHlwZShTdHJpbmcgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZGM5ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTUHJvZmlsZSB7Ci0KLQlTdHJpbmcgZ2V0UHJvZmlsZUlEKCk7Ci0KLQlTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKTsKLQotCVVSTCBnZXRQcm9maWxlVVJMKCk7Ci0KLQlDU1NNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCk7Ci0KLQlib29sZWFuIGlzRGVmYXVsdCgpOwotCi0JU3RyaW5nIGdldE93bmVyUGx1Z2luSUQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMDBjYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbC5SZWdpc3RyeVJlYWRlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDU1NQcm9maWxlUmVnaXN0cnkgewotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1Byb2ZpbGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTUHJvZmlsZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0UHJvZmlsZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGZQcm9maWxlcy52YWx1ZXMoKSkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBnZXRQcm9maWxlKFN0cmluZyBwcm9maWxlSUQpIHsKLQkJcmV0dXJuIChDU1NQcm9maWxlKSBmUHJvZmlsZXMuZ2V0KHByb2ZpbGVJRCk7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZ2V0RGVmYXVsdFByb2ZpbGUoKSB7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRQcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IChDU1NQcm9maWxlKSBpLm5leHQoKTsKLQkJCWlmIChwcm9maWxlLmlzRGVmYXVsdCgpKSB7Ci0JCQkJcmV0dXJuIHByb2ZpbGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU1Byb2ZpbGVSZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJZlByb2ZpbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJSXRlcmF0b3IgaSA9IG5ldyBSZWdpc3RyeVJlYWRlcigpLmVudW1Qcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBwcm9maWxlID0gaS5uZXh0KCk7Ci0JCQlpZiAocHJvZmlsZSBpbnN0YW5jZW9mIENTU1Byb2ZpbGUpIHsKLQkJCQlmUHJvZmlsZXMucHV0KCgoQ1NTUHJvZmlsZSkgcHJvZmlsZSkuZ2V0UHJvZmlsZUlEKCksIHByb2ZpbGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBDU1NQcm9maWxlUmVnaXN0cnkgZkluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmUHJvZmlsZXMgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NGdW5jdGlvbklELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0Z1bmN0aW9uSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0ZTE2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0Z1bmN0aW9uSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTRnVuY3Rpb25JRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfQVRUUiA9ICJhdHRyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9DT1VOVEVSID0gImNvdW50ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX1JHQiA9ICJyZ2IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX1JFQ1QgPSAicmVjdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfRk9STUFUID0gImZvcm1hdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfTE9DQUwgPSAibG9jYWwiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0tleXdvcmRJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NLZXl3b3JkSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmODk4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0tleXdvcmRJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTS2V5d29yZElEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18xMDAgPSAiMTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18yMDAgPSAiMjAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS18zMDAgPSAiMzAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS180MDAgPSAiNDAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS181MDAgPSAiNTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS182MDAgPSAiNjAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS183MDAgPSAiNzAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS184MDAgPSAiODAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS185MDAgPSAiOTAwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BQk9WRSA9ICJhYm92ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUJTT0xVVEUgPSAiYWJzb2x1dGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FDVElWRUJPUkRFUiA9ICJBY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FDVElWRUNBUFRJT04gPSAiQWN0aXZlQ2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUxMID0gImFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUxXQVlTID0gImFsd2F5cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVBQV09SS1NQQUNFID0gIkFwcFdvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVFVQSA9ICJhcXVhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BUk1FTklBTiA9ICJhcm1lbmlhbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVVUTyA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BVk9JRCA9ICJhdm9pZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkFDS0dST1VORCA9ICJCYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CQVNFTElORSA9ICJiYXNlbGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkVISU5EID0gImJlaGluZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkVMT1cgPSAiYmVsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JJRElfT1ZFUlJJREUgPSAiYmlkaS1vdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxBQ0sgPSAiYmxhY2siOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JMSU5LID0gImJsaW5rIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CTE9DSyA9ICJibG9jayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxVRSA9ICJibHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPTERFUiA9ICJib2xkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPVEggPSAiYm90aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9ORkFDRSA9ICJCdXR0b25GYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05ISUdITElHSFQgPSAiQnV0dG9uSGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05TSEFET1cgPSAiQnV0dG9uU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CVVRUT05URVhUID0gIkJ1dHRvblRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NBUElUQUxJWkUgPSAiY2FwaXRhbGl6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0FQVElPTiA9ICJjYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DQVBUSU9OVEVYVCA9ICJDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0VOVEVSID0gImNlbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0VOVEVSX0xFRlQgPSAiY2VudGVyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NFTlRFUl9SSUdIVCA9ICJjZW50ZXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NISUxEID0gImNoaWxkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSVJDTEUgPSAiY2lyY2xlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSktfSURFT0dSQVBISUMgPSAiY2prLWlkZW9ncmFwaGljIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DTE9TRV9RVU9URSA9ICJjbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT05ERU5TRUQgPSAiY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT0xMQVBTRSA9ICJjb2xsYXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09NUEFDVCA9ICJjb21wYWN0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1AgPSAiY3JvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ1JPU1MgPSAiY3Jvc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1NTSEFJUiA9ICJjcm9zc2hhaXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NVUlNJVkUgPSAiY3Vyc2l2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREFTSEVEID0gImRhc2hlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVDSU1BTCA9ICJkZWNpbWFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ERUNJTUFMX0xFQURJTkdfWkVSTyA9ICJkZWNpbWFsLWxlYWRpbmctemVybyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ESUdJVFMgPSAiZGlnaXRzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ESVNDID0gImRpc2MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RPVFRFRCA9ICJkb3R0ZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VfUkVTSVpFID0gImUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FTUJFRCA9ICJlbWJlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYVFJBX0NPTkRFTlNFRCA9ICJleHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYVFJBX0VYUEFOREVEID0gImV4dHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQU5UQVNZID0gImZhbnRhc3kiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZBUl9MRUZUID0gImZhci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVJfUklHSFQgPSAiZmFyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVNUID0gImZhc3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZBU1RFUiA9ICJmYXN0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZFTUFMRSA9ICJmZW1hbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0ZJWEVEID0gImZpeGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GVUNIU0lBID0gImZ1Y2hzaWEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dFT1JHSUFOID0gImdlb3JnaWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkFZID0gImdyYXkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dSQVlURVhUID0gIkdyYXlUZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkVFTiA9ICJncmVlbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfR1JPT1ZFID0gImdyb292ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSEVCUkVXID0gImhlYnJldyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSEVMUCA9ICJoZWxwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISURERU4gPSAiaGlkZGVuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISURFID0gImhpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJR0ggPSAiaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSExJR0hUID0gIkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSExJR0hUVEVYVCA9ICJIaWdobGlnaHRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISUdIRVIgPSAiaGlnaGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISVJBR0FOQSA9ICJoaXJhZ2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElSQUdBTkFfSVJPSEEgPSAiaGlyYWdhbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5BQ1RJVkVCT1JERVIgPSAiSW5hY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQ0FQVElPTiA9ICJJbmFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQ0FQVElPTlRFWFQgPSAiSW5hY3RpdmVDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5GT0JBQ0tHUk9VTkQgPSAiSW5mb0JhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lORk9URVhUID0gIkluZm9UZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkxJTkUgPSAiaW5saW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkxJTkVfVEFCTEUgPSAiaW5saW5lLXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTlNFVCA9ICJpbnNldCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5TSURFID0gImluc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5WRVJUID0gImludmVydCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSlVTVElGWSA9ICJqdXN0aWZ5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19LQVRBS0FOQSA9ICJrYXRha2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfS0FUQUtBTkFfSVJPSEEgPSAia2F0YWthbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xBTkRTQ0FQRSA9ICJsYW5kc2NhcGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xBUkdFID0gImxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MQVJHRVIgPSAibGFyZ2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRUZUID0gImxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFRlRfU0lERSA9ICJsZWZ0LXNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFRlRXQVJEUyA9ICJsZWZ0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xFVkVMID0gImxldmVsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MSUdIVEVSID0gImxpZ2h0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xJTUUgPSAibGltZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElORV9USFJPVUdIID0gImxpbmUtdGhyb3VnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElTVF9JVEVNID0gImxpc3QtaXRlbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9VRCA9ICJsb3VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1cgPSAibG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUiA9ICJsb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfQUxQSEEgPSAibG93ZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSX0dSRUVLID0gImxvd2VyLWdyZWVrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUl9MQVRJTiA9ICJsb3dlci1sYXRpbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfUk9NQU4gPSAibG93ZXItcm9tYW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSQ0FTRSA9ICJsb3dlcmNhc2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xUUiA9ICJsdHIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01BTEUgPSAibWFsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUFSS0VSID0gIm1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUFST09OID0gIm1hcm9vbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVESVVNID0gIm1lZGl1bSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVOVSA9ICJtZW51IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NRU5VVEVYVCA9ICJNZW51VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVTU0FHRV9CT1ggPSAibWVzc2FnZS1ib3giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01JWCA9ICJtaXgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01PTk9TUEFDRSA9ICJtb25vc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01PVkUgPSAibW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTl9SRVNJWkUgPSAibi1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05BUlJPV0VSID0gIm5hcnJvd2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OQVZZID0gIm5hdnkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05FX1JFU0laRSA9ICJuZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PX0NMT1NFX1FVT1RFID0gIm5vLWNsb3NlLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT19PUEVOX1FVT1RFID0gIm5vLW9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PX1JFUEVBVCA9ICJuby1yZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PTkUgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9STUFMID0gIm5vcm1hbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9XUkFQID0gIm5vd3JhcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTldfUkVTSVpFID0gIm53LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT0JMSVFVRSA9ICJvYmxpcXVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PTElWRSA9ICJvbGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT05DRSA9ICJvbmNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PUEVOX1FVT1RFID0gIm9wZW4tcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09VVFNFVCA9ICJvdXRzZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09VVFNJREUgPSAib3V0c2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT1ZFUkxJTkUgPSAib3ZlcmxpbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BPSU5URVIgPSAicG9pbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUE9SVFJBSVQgPSAicG9ydHJhaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BSRSA9ICJwcmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BVUlBMRSA9ICJwdXJwbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFRCA9ICJyZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFTEFUSVZFID0gInJlbGF0aXZlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRVBFQVQgPSAicmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRVBFQVRfWCA9ICJyZXBlYXQteCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUkVQRUFUX1kgPSAicmVwZWF0LXkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JJREdFID0gInJpZGdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUklHSFRfU0lERSA9ICJyaWdodC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSUdIVFdBUkRTID0gInJpZ2h0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JUTCA9ICJydGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JVTl9JTiA9ICJydW4taW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NfUkVTSVpFID0gInMtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TQU5TX1NFUklGID0gInNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NDUk9MTCA9ICJzY3JvbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NDUk9MTEJBUiA9ICJTY3JvbGxiYXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFX1JFU0laRSA9ICJzZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFTUlfQ09OREVOU0VEID0gInNlbWktY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRU1JX0VYUEFOREVEID0gInNlbWktZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NFUEFSQVRFID0gInNlcGFyYXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRVJJRiA9ICJzZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0hPVyA9ICJzaG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TSUxFTlQgPSAic2lsZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TSUxWRVIgPSAic2lsdmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTE9XID0gInNsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NMT1dFUiA9ICJzbG93ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMID0gInNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTUFMTF9DQVBTID0gInNtYWxsLWNhcHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMX0NBUFRJT04gPSAic21hbGwtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU01BTExFUiA9ICJzbWFsbGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TT0ZUID0gInNvZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NPTElEID0gInNvbGlkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TUEVMTF9PVVQgPSAic3BlbGwtb3V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TUVVBUkUgPSAic3F1YXJlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVEFUVVNfQkFSID0gInN0YXR1cy1iYXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NVQiA9ICJzdWIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NVUEVSID0gInN1cGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TV19SRVNJWkUgPSAic3ctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRSA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEFCTEVfQ0FQVElPTiA9ICJ0YWJsZS1jYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9DRUxMID0gInRhYmxlLWNlbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NPTFVNTiA9ICJ0YWJsZS1jb2x1bW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NPTFVNTl9HUk9VUCA9ICJ0YWJsZS1jb2x1bW4tZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0ZPT1RFUl9HUk9VUCA9ICJ0YWJsZS1mb290ZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0hFQURFUl9HUk9VUCA9ICJ0YWJsZS1oZWFkZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX1JPVyA9ICJ0YWJsZS1yb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX1JPV19HUk9VUCA9ICJ0YWJsZS1yb3ctZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RFQUwgPSAidGVhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19URVhUX1RPUCA9ICJ0ZXh0LXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVF9CT1RUT00gPSAidGV4dC1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RISUNLID0gInRoaWNrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USElOID0gInRoaW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RIUkVFRERBUktTSEFET1cgPSAiVGhyZWVERGFya1NoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVERkFDRSA9ICJUaHJlZURGYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRURISUdITElHSFQgPSAiVGhyZWVESGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRURMSUdIVFNIQURPVyA9ICJUaHJlZURMaWdodFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVEU0hBRE9XID0gIlRocmVlRFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVFJBTlNQQVJFTlQgPSAidHJhbnNwYXJlbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VMVFJBX0NPTkRFTlNFRCA9ICJ1bHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VMVFJBX0VYUEFOREVEID0gInVsdHJhLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VTkRFUkxJTkUgPSAidW5kZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUl9BTFBIQSA9ICJ1cHBlci1hbHBoYSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVVBQRVJfTEFUSU4gPSAidXBwZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VQUEVSX1JPTUFOID0gInVwcGVyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUkNBU0UgPSAidXBwZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19WSVNJQkxFID0gInZpc2libGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dfUkVTSVpFID0gInctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XQUlUID0gIndhaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dISVRFID0gIndoaXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XSURFUiA9ICJ3aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lORE9XID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lORE9XRlJBTUUgPSAiV2luZG93RnJhbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dJTkRPV1RFWFQgPSAiV2luZG93VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9GQVNUID0gIngtZmFzdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9ISUdIID0gIngtaGlnaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9MQVJHRSA9ICJ4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX0xPVUQgPSAieC1sb3VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX0xPVyA9ICJ4LWxvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TTE9XID0gIngtc2xvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TTUFMTCA9ICJ4LXNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YX1NPRlQgPSAieC1zb2Z0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19YWF9TTUFMTCA9ICJ4eC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWFhfTEFSR0UgPSAieHgtbGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1lFTExPVyA9ICJ5ZWxsb3ciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01NVHlwZUNvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNTVR5cGVDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2ODA1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01NVHlwZUNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENTU01NVHlwZUNvbGxlY3RvciBleHRlbmRzIENTU01ldGFNb2RlbFRyYXZlcnNlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVHlwZUNvbGxlY3Rvci4KLQkgKi8KLQlwdWJsaWMgQ1NTTU1UeXBlQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGx5KENTU01NTm9kZSBub2RlLCBTdHJpbmcgdHlwZSkgewotCQlmVHlwZSA9IHR5cGU7Ci0JCWZOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYXBwbHkobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdE5lc3RlZFR5cGUoYm9vbGVhbiBuZXN0ZWQpIHsKLQkJZk5lc3RlZCA9IG5lc3RlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlzaG9ydCByYyA9IFRSQVZfQ09OVDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKGZUeXBlID09IG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQkJaWYgKCFmTm9kZXMuY29udGFpbnMobm9kZSkpIHsKLQkJCQkJZk5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQkJaWYgKCFmTmVzdGVkKSB7Ci0JCQkJCXJjID0gVFJBVl9QUlVORTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXROb2RlcygpIHsKLQkJcmV0dXJuIGZOb2Rlcy5pdGVyYXRvcigpOwotCX0KLQotCi0JcHJpdmF0ZSBib29sZWFuIGZOZXN0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmVHlwZSA9IG51bGw7Ci0JTGlzdCBmTm9kZXMgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZWRpYUdyb3VwSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWVkaWFHcm91cElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OGNmN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZWRpYUdyb3VwSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTWVkaWFHcm91cElEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX1BBR0VEID0gInBhZ2VkIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX1ZJU1VBTCA9ICJ2aXN1YWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0FVUkFMID0gImF1cmFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9UQUNUSUxFID0gInRhY3RpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fR1JJRCA9ICJncmlkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9CSVRNQVAgPSAiYml0bWFwIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0lOVEVSQUNUSVZFID0gImludGVyYWN0aXZlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0FMTCA9ICJhbGwiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkYTY5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTTWV0YU1vZGVsRmluZGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTWV0YU1vZGVsRmluZGVyLgotCSAqLwotCXByaXZhdGUgQ1NTTWV0YU1vZGVsRmluZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgcHVibGljIENTU01ldGFNb2RlbEZpbmRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTTWV0YU1vZGVsRmluZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGZpbmRNZXRhTW9kZWxGb3IoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gQ1NTUHJvZmlsZUZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRQcm9maWxlRm9yKG5vZGUpLmdldE1ldGFNb2RlbCgpOwotCX0KLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZmluZE1ldGFNb2RlbEZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXJldHVybiBDU1NQcm9maWxlRmluZGVyLmdldEluc3RhbmNlKCkuZmluZFByb2ZpbGVGb3IobW9kZWwpLmdldE1ldGFNb2RlbCgpOwotCi0JfQotCi0JLy8gZmluZE1ldGFNb2RlbEZvcihOb2RlKSBpcyBub3QgdXNlZC4KLQkvLyBFdmVuIGlmIGl0IGlzIHVzZWQsIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoCi0JLy8gZmluZE1ldGFNb2RlbEZvcihJU3RydWN0dXJlZE1vZGVsKSBlYXNpbHkKLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZmluZE1ldGFNb2RlbEZvcihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCXJldHVybiBDU1NQcm9maWxlRmluZGVyLmdldEluc3RhbmNlKCkuZmluZFByb2ZpbGVGb3IoYmFzZUxvY2F0aW9uKS5nZXRNZXRhTW9kZWwoKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBDU1NNZXRhTW9kZWxGaW5kZXIgZkluc3RhbmNlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVHJhdmVyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFRyYXZlcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJlZGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVHJhdmVyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIENTU01ldGFNb2RlbFRyYXZlcnNlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVHJhdmVyc2VyLgotCSAqLwotCXB1YmxpYyBDU1NNZXRhTW9kZWxUcmF2ZXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgYXBwbHkoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJZlRyYXZTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JCWJlZ2luKG5vZGUpOwotCQl0cmF2ZXJzZShub2RlKTsKLQkJZW5kKG5vZGUpOwotCX0KLQotCXByaXZhdGUgZmluYWwgc2hvcnQgdHJhdmVyc2UoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCi0JCWZUcmF2U3RhY2sucHVzaChub2RlKTsKLQotCQlzaG9ydCByYzsKLQkJcmMgPSBwcmVOb2RlKG5vZGUpOwotCi0JCWlmIChyYyA9PSBUUkFWX0NPTlQpIHsKLQkJCUl0ZXJhdG9yIGkgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU01NTm9kZSBjaGlsZCA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJCXNob3J0IHJjQ2hpbGQgPSB0cmF2ZXJzZShjaGlsZCk7Ci0JCQkJaWYgKHJjQ2hpbGQgPT0gVFJBVl9TVE9QKSB7Ci0JCQkJCWZUcmF2U3RhY2sucG9wKCk7Ci0JCQkJCXJldHVybiBUUkFWX1NUT1A7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJjID09IFRSQVZfU1RPUCkgewotCQkJZlRyYXZTdGFjay5wb3AoKTsKLQkJCXJldHVybiBUUkFWX1NUT1A7Ci0JCX0KLQotCQlyYyA9IHBvc3ROb2RlKG5vZGUpOwotCi0JCWZUcmF2U3RhY2sucG9wKCk7Ci0JCXJldHVybiAocmMgPT0gVFJBVl9QUlVORSkgPyBUUkFWX0NPTlQgOiByYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihDU1NNTU5vZGUgbm9kZSkgewotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5kKENTU01NTm9kZSBub2RlKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCXByb3RlY3RlZCBzaG9ydCBwb3N0Tm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCi0JU3RhY2sgZlRyYXZTdGFjayA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IFRSQVZfQ09OVCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCBUUkFWX1NUT1AgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgVFJBVl9QUlVORSA9IDI7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYTc1Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci0KLQotcHVibGljIGNsYXNzIENTU01ldGFNb2RlbFV0aWwgewotCXB1YmxpYyBDU1NNZXRhTW9kZWxVdGlsKENTU01ldGFNb2RlbCBtZXRhbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJZk1ldGFNb2RlbCA9IG1ldGFtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldERlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gY29sbGVjdE5vZGVzQnlUeXBlKENTU01NTm9kZS5UWVBFX0RFU0NSSVBUT1IpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBjb2xsZWN0Tm9kZXNCeVR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJQ1NTTU1UeXBlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBDU1NNTVR5cGVDb2xsZWN0b3IoKTsKLQkJY29sbGVjdG9yLmFwcGx5KGZNZXRhTW9kZWwsIHR5cGUpOwotCQlyZXR1cm4gY29sbGVjdG9yLmdldE5vZGVzKCk7Ci0JfQotCi0JcHVibGljIENTU01NUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJdGVyYXRvciBpUHJvcGVydHkgPSBnZXRQcm9wZXJ0aWVzKCk7Ci0JCXdoaWxlIChpUHJvcGVydHkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGlQcm9wZXJ0eS5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJcmV0dXJuIChDU1NNTVByb3BlcnR5KSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDU1NNTURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcihTdHJpbmcgZGVzY3JpcHRvck5hbWUpIHsKLQkJSXRlcmF0b3IgaURlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9ycygpOwotCQl3aGlsZSAoaURlc2NyaXB0b3IuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGlEZXNjcmlwdG9yLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGRlc2NyaXB0b3JOYW1lKSkgewotCQkJCXJldHVybiAoQ1NTTU1EZXNjcmlwdG9yKSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDU1NNTU5vZGUgZ2V0TWV0YU1vZGVsTm9kZUZvcihJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24pIHsKLQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSB7Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJCXJldHVybiBnZXRQcm9wZXJ0eSgoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGUpIHsKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcigoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoZlR5cGVNYXAgPT0gbnVsbCkgewotCQkJZlR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZlR5cGVNYXAucHV0KG5ldyBTaG9ydChJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSksIENTU01NTm9kZS5UWVBFX1NUWUxFX1JVTEUpOwotCQkJZlR5cGVNYXAucHV0KG5ldyBTaG9ydChJQ1NTTm9kZS5GT05URkFDRVJVTEVfTk9ERSksIENTU01NTm9kZS5UWVBFX0ZPTlRfRkFDRV9SVUxFKTsKLQkJCWZUeXBlTWFwLnB1dChuZXcgU2hvcnQoSUNTU05vZGUuUEFHRVJVTEVfTk9ERSksIENTU01NTm9kZS5UWVBFX1BBR0VfUlVMRSk7Ci0JCX0KLQotCQlTdHJpbmcgbm9kZVR5cGUgPSAoU3RyaW5nKSBmVHlwZU1hcC5nZXQobmV3IFNob3J0KG5vZGUuZ2V0Tm9kZVR5cGUoKSkpOwotCQlpZiAobm9kZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJdGVyYXRvciBpTm9kZXMgPSBjb2xsZWN0Tm9kZXNCeVR5cGUobm9kZVR5cGUpOwotCQlpZiAoaU5vZGVzLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIHRhcmdldE5vZGUgPSAoQ1NTTU1Ob2RlKSBpTm9kZXMubmV4dCgpOwotCQkJaWYgKCFpTm9kZXMuaGFzTmV4dCgpKSB7IC8vIGl0J3Mgb25seSBvbmUKLQkJCQlyZXR1cm4gdGFyZ2V0Tm9kZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgewotCQlyZXR1cm4gZk1ldGFNb2RlbDsKLQl9Ci0KLQotCXByaXZhdGUgQ1NTTWV0YU1vZGVsIGZNZXRhTW9kZWwgPSBudWxsOwotCXByaXZhdGUgTWFwIGZUeXBlTWFwID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTnVtYmVySUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTnVtYmVySUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNjk4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU051bWJlcklELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU051bWJlcklEIHsKLQotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fQU5HTEUgPSAiYW5nbGUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0ZSRVFVRU5DWSA9ICJmcmVxdWVuY3kiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0lOVEVHRVIgPSAiaW50ZWdlciI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fTEVOR1RIID0gImxlbmd0aCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fUEVSQ0VOVEFHRSA9ICJwZXJjZW50YWdlIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9USU1FID0gInRpbWUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0hBU0ggPSAiaGFzaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX05VTSA9ICJudW1iZXIiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvZmlsZUZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9maWxlRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkN2Y1MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9maWxlRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NQcm9maWxlRmluZGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTUHJvZmlsZUZpbmRlci4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVGaW5kZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBwdWJsaWMgQ1NTUHJvZmlsZUZpbmRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTUHJvZmlsZUZpbmRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZmluZFByb2ZpbGVGb3IoSUNTU05vZGUgbm9kZSkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQltb2RlbCA9IGRvYy5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaW5kUHJvZmlsZUZvcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZmluZFByb2ZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlPYmplY3QgbW9kZWxUeXBlID0gKChJQ1NTTW9kZWwpIG1vZGVsKS5nZXRTdHlsZVNoZWV0VHlwZSgpOwotCQkJaWYgKG1vZGVsVHlwZSA9PSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG1vZGVsVHlwZSA9PSBJQ1NTTW9kZWwuRU1CRURERUQgfHwgbW9kZWxUeXBlID09IElDU1NNb2RlbC5JTkxJTkUpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsgLy8gbWF5IGJlIG51bGwKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gZmluZFByb2ZpbGVGb3IoYmFzZUxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBmaW5kUHJvZmlsZUZvcihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gbnVsbDsKLQotCQlpZiAoYmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCAmJiBwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQlyZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb2ZpbGVJRCA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCByZXNvdXJjZSwgdHJ1ZSk7Ci0JCQkJaWYgKHByb2ZpbGVJRCAhPSBudWxsICYmIDAgPCBwcm9maWxlSUQubGVuZ3RoKCkpIHsKLQkJCQkJcHJvZmlsZSA9IHJlZy5nZXRQcm9maWxlKHByb2ZpbGVJRCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChwcm9maWxlICE9IG51bGwpID8gcHJvZmlsZSA6IHJlZy5nZXREZWZhdWx0UHJvZmlsZSgpOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIENTU1Byb2ZpbGVGaW5kZXIgZkluc3RhbmNlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvcGVydHlJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9wZXJ0eUlELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MGU4ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9wZXJ0eUlELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NQcm9wZXJ0eUlEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9BWklNVVRIID0gImF6aW11dGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JHID0gImJhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX0FUVEFDSE1FTlQgPSAiYmFja2dyb3VuZC1hdHRhY2htZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19DT0xPUiA9ICJiYWNrZ3JvdW5kLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19JTUFHRSA9ICJiYWNrZ3JvdW5kLWltYWdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19QT1NJVElPTiA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19SRVBFQVQgPSAiYmFja2dyb3VuZC1yZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUiA9ICJib3JkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xMQVBTRSA9ICJib3JkZXItY29sbGFwc2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xPUiA9ICJib3JkZXItY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9TUEFDSU5HID0gImJvcmRlci1zcGFjaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1RZTEUgPSAiYm9yZGVyLXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QID0gImJvcmRlci10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVCA9ICJib3JkZXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT00gPSAiYm9yZGVyLWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlQgPSAiYm9yZGVyLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfQ09MT1IgPSAiYm9yZGVyLXRvcC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX0NPTE9SID0gImJvcmRlci1yaWdodC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9DT0xPUiA9ICJib3JkZXItYm90dG9tLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9DT0xPUiA9ICJib3JkZXItbGVmdC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9TVFlMRSA9ICJib3JkZXItdG9wLXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfU1RZTEUgPSAiYm9yZGVyLXJpZ2h0LXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1NUWUxFID0gImJvcmRlci1ib3R0b20tc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1NUWUxFID0gImJvcmRlci1sZWZ0LXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX1dJRFRIID0gImJvcmRlci10b3Atd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9XSURUSCA9ICJib3JkZXItcmlnaHQtd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fV0lEVEggPSAiYm9yZGVyLWJvdHRvbS13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfV0lEVEggPSAiYm9yZGVyLWxlZnQtd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9XSURUSCA9ICJib3JkZXItd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPVFRPTSA9ICJib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NBUFRJT05fU0lERSA9ICJjYXB0aW9uLXNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NMRUFSID0gImNsZWFyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTElQID0gImNsaXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NPTE9SID0gImNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT05URU5UID0gImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NPVU5URVJfSU5DUkVNRU5UID0gImNvdW50ZXItaW5jcmVtZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX1JFU0VUID0gImNvdW50ZXItcmVzZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRSA9ICJjdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9BRlRFUiA9ICJjdWUtYWZ0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9CRUZPUkUgPSAiY3VlLWJlZm9yZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VSU09SID0gImN1cnNvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElTUExBWSA9ICJkaXNwbGF5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTEVWQVRJT04gPSAiZWxldmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTVBUWV9DRUxMUyA9ICJlbXB0eS1jZWxscyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRkxPQVQgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlQgPSAiZm9udCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRSA9ICJmb250LXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRV9BREpVU1QgPSAiZm9udC1zaXplLWFkanVzdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFJFVENIID0gImZvbnQtc3RyZXRjaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1ZBUklBTlQgPSAiZm9udC12YXJpYW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1dFSUdIVCA9ICJmb250LXdlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfSEVJR0hUID0gImhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MRVRURVJfU1BBQ0lORyA9ICJsZXR0ZXItc3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElORV9IRUlHSFQgPSAibGluZS1oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEUgPSAibGlzdC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9JTUFHRSA9ICJsaXN0LXN0eWxlLWltYWdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1BPU0lUSU9OID0gImxpc3Qtc3R5bGUtcG9zaXRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfVFlQRSA9ICJsaXN0LXN0eWxlLXR5cGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTiA9ICJtYXJnaW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9UT1AgPSAibWFyZ2luLXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX1JJR0hUID0gIm1hcmdpbi1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0JPVFRPTSA9ICJtYXJnaW4tYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fTEVGVCA9ICJtYXJnaW4tbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS0VSX09GRlNFVCA9ICJtYXJrZXItb2Zmc2V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJLUyA9ICJtYXJrcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX0hFSUdIVCA9ICJtYXgtaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVhfV0lEVEggPSAibWF4LXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fSEVJR0hUID0gIm1pbi1oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01JTl9XSURUSCA9ICJtaW4td2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09SUEhBTlMgPSAib3JwaGFucyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORSA9ICJvdXRsaW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX0NPTE9SID0gIm91dGxpbmUtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfU1RZTEUgPSAib3V0bGluZS1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9XSURUSCA9ICJvdXRsaW5lLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVkVSRkxPVyA9ICJvdmVyZmxvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElORyA9ICJwYWRkaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX1RPUCA9ICJwYWRkaW5nLXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19SSUdIVCA9ICJwYWRkaW5nLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX0JPVFRPTSA9ICJwYWRkaW5nLWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19MRUZUID0gInBhZGRpbmctbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0FGVEVSID0gInBhZ2UtYnJlYWstYWZ0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0VfQlJFQUtfQkVGT1JFID0gInBhZ2UtYnJlYWstYmVmb3JlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0lOU0lERSA9ICJwYWdlLWJyZWFrLWluc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0UgPSAicGF1c2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFX0FGVEVSID0gInBhdXNlLWFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9CRUZPUkUgPSAicGF1c2UtYmVmb3JlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QSVRDSCA9ICJwaXRjaCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0hfUkFOR0UgPSAicGl0Y2gtcmFuZ2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BMQVlfRFVSSU5HID0gInBsYXktZHVyaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QT1NJVElPTiA9ICJwb3NpdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUVVPVEVTID0gInF1b3RlcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUklDSE5FU1MgPSAicmljaG5lc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1JJR0hUID0gInJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TSVpFID0gInNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLID0gInNwZWFrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19IRUFERVIgPSAic3BlYWstaGVhZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19OVU1FUkFMID0gInNwZWFrLW51bWVyYWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLX1BVTkNUVUFUSU9OID0gInNwZWFrLXB1bmN0dWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVFQ0hfUkFURSA9ICJzcGVlY2gtcmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1RSRVNTID0gInN0cmVzcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEFCTEVfTEFZT1VUID0gInRhYmxlLWxheW91dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9BTElHTiA9ICJ0ZXh0LWFsaWduIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0RFQ09SQVRJT04gPSAidGV4dC1kZWNvcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0lOREVOVCA9ICJ0ZXh0LWluZGVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9TSEFET1cgPSAidGV4dC1zaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfVFJBTlNGT1JNID0gInRleHQtdHJhbnNmb3JtIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9UT1AgPSAidG9wIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9VTklDT0RFX0JJREkgPSAidW5pY29kZS1iaWRpIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WRVJUSUNBTF9BTElHTiA9ICJ2ZXJ0aWNhbC1hbGlnbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVklTSUJJTElUWSA9ICJ2aXNpYmlsaXR5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0lDRV9GQU1JTFkgPSAidm9pY2UtZmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0xVTUUgPSAidm9sdW1lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XSElURV9TUEFDRSA9ICJ3aGl0ZS1zcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lET1dTID0gIndpZG93cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1dPUkRfU1BBQ0lORyA9ICJ3b3JkLXNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1pfSU5ERVggPSAiei1pbmRleCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTU3RyaW5nSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTU3RyaW5nSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyMmNmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1N0cmluZ0lELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1N0cmluZ0lEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19BTlkgPSAiYW55IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19DT1VOVEVSX0lERU5USUZJRVIgPSAiY291bnRlci1pZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19GQU1JTFlfTkFNRSA9ICJmYW1pbHktbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfRk9OVF9GQUNFX05BTUUgPSAiZm9udC1mYWNlLW5hbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX1BBR0VfSURFTlRJRklFUiA9ICJwYWdlLWlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX1NQRUNJRklDX1ZPSUNFID0gInNwZWNpZmljLXZvaWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19VUkFOR0UgPSAidXJhbmdlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NVbml0SUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTVW5pdElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNDZkMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NVbml0SUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTVW5pdElEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9DTSA9ICJjbSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9ERUcgPSAiZGVnIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0VNUyA9ICJlbSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9FWFMgPSAiZXgiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfR1JBRCA9ICJncmFkIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0hBU0ggPSAiIyI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9IWiA9ICJIeiI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9JTiA9ICJpbiI7Ly8kTk9OLU5MUy0xJAotCS8vIGZpbmFsIHN0YXRpYyBTdHJpbmcgVV9JTlRFR0VSID0gIklOVEVHRVIiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfS0haID0gImtIeiI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9NTSA9ICJtbSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9NUyA9ICJtcyI7Ly8kTk9OLU5MUy0xJAotCS8vIGZpbmFsIHN0YXRpYyBTdHJpbmcgVV9OVU1CRVIgPSAiTlVNQkVSIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1BDID0gInBjIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1BFUkNFTlRBR0UgPSAiJSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QVCA9ICJwdCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QWCA9ICJweCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9SQUQgPSAicmFkIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1MgPSAicyI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1DYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiMGU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1DYXRlZ29yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1DYXRlZ29yeUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1DYXRlZ29yeSB7Ci0KLQlwdWJsaWMgQ1NTTU1DYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9DQVRFR09SWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FwdGlvbigpIHsKLQkJcmV0dXJuIGZDYXB0aW9uOwotCX0KLQotCXZvaWQgc2V0Q2FwdGlvbihTdHJpbmcgY2FwdGlvbikgewotCQlmQ2FwdGlvbiA9IGNhcHRpb247Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0Q2FwdGlvbigpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENhcHRpb24oKTsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZDYXB0aW9uID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNoYXJzZXRSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2hhcnNldFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjRiNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2hhcnNldFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NQ2hhcnNldFJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NQ2hhcnNldFJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1DaGFyc2V0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9DSEFSU0VUX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNvbnRhaW5lckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNvbnRhaW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlNzllYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Db250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUNvbnRhaW5lckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Db250YWluZXIgewotCi0KLQlwdWJsaWMgQ1NTTU1Db250YWluZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ09OVEFJTkVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9OVU1CRVIgfHwgdHlwZSA9PSBUWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBUWVBFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gVFlQRV9DT05UQUlORVIpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRGVzY3JpcHRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMWQ2NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLWNsYXNzIENTU01NRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1EZXNjcmlwdG9yIHsKLQotCi0JcHVibGljIENTU01NRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9ERVNDUklQVE9SOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9OVU1CRVIgfHwgdHlwZSA9PSBUWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBUWVBFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gVFlQRV9DT05UQUlORVIgfHwgdHlwZSA9PSBUWVBFX1NUUklORyB8fCB0eXBlID09IFRZUEVfU0VQQVJBVE9SKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1EZXNjcmlwdG9yI2dldFZhbHVlcygpCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldFZhbHVlcygpIHsKLQkJVmFsdWVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IFZhbHVlQ29sbGVjdG9yKCk7Ci0JCWNvbGxlY3Rvci5hcHBseSh0aGlzKTsKLQkJcmV0dXJuIGNvbGxlY3Rvci5nZXROb2RlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRm9udEZhY2VSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRm9udEZhY2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQxY2E5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZvbnRGYWNlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Gb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NRm9udEZhY2VSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUZvbnRGYWNlUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTUZvbnRGYWNlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9GT05UX0ZBQ0VfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0VHlwZSgpID09IFRZUEVfREVTQ1JJUFRPUik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRnVuY3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1GdW5jdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3ZjIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1GdW5jdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1GdW5jdGlvbkltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1GdW5jdGlvbiB7Ci0KLQlwdWJsaWMgQ1NTTU1GdW5jdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9GVU5DVElPTjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjcG9zdFNldEF0dHJpYnV0ZSgpCi0JICovCi0JLy8gdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQkvLyBzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JLy8gaWYgKG5hbWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vCi0JLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9BVFRSKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfQ09VTlRFUik7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX1JHQik7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX1JFQ1QpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9VUkkpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9GT1JNQVQpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9MT0NBTCk7Ci0JLy8KLQkvLyBpZiAoISBsaXN0LmNvbnRhaW5zKG5hbWUudG9Mb3dlckNhc2UoKSkpIHsKLQkvLyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsKLQkvLyB9Ci0JLy8gfQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRGdW5jdGlvblN0cmluZygpOwotCX0KLQotCXZvaWQgc2V0RnVuY3Rpb25TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldEZ1bmN0aW9uU3RyaW5nKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1JbXBvcnRSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NSW1wb3J0UnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkZmU4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1JbXBvcnRSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NSW1wb3J0UnVsZUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1JbXBvcnRSdWxlIHsKLQotCi0JcHVibGljIENTU01NSW1wb3J0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9JTVBPUlRfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUtleXdvcmRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1LZXl3b3JkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI1NTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUtleXdvcmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NS2V5d29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1LZXl3b3JkSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUtleXdvcmQgewotCi0JcHVibGljIENTU01NS2V5d29yZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9LRVlXT1JEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NS2V5d29yZCNnZXRLZXl3b3JkU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleXdvcmRTdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldEtleXdvcmRTdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldEtleXdvcmRTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0S2V5d29yZFN0cmluZygpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmVmFsdWUgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTWVkaWFSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTWVkaWFSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlOTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU1lZGlhUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1NZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NTWVkaWFSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU1lZGlhUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTU1lZGlhUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9NRURJQV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZDdmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLQotYWJzdHJhY3QgY2xhc3MgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NTm9kZSB7Ci0KLQlwdWJsaWMgQ1NTTU1Ob2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGZBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nKSBmQXR0cmlidXRlcy5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkTm9kZXMoKSB7Ci0JCWlmIChmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oZkNoaWxkTm9kZXMpLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RGVzY2VuZGFudHMoKSB7Ci0JCUxpc3QgZGVzY2VuZGFudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGlDaGlsZCA9IGdldENoaWxkTm9kZXMoKTsKLQkJd2hpbGUgKGlDaGlsZC5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBjaGlsZCA9IChDU1NNTU5vZGUpIGlDaGlsZC5uZXh0KCk7Ci0JCQlJdGVyYXRvciBpRGVzY2VuZGFudCA9IGNoaWxkLmdldERlc2NlbmRhbnRzKCk7Ci0JCQlpZiAoaURlc2NlbmRhbnQuaGFzTmV4dCgpKSB7Ci0JCQkJd2hpbGUgKGlEZXNjZW5kYW50Lmhhc05leHQoKSkgewotCQkJCQlDU1NNTU5vZGUgZGVzY2VuZGFudCA9IChDU1NNTU5vZGUpIGlEZXNjZW5kYW50Lm5leHQoKTsKLQkJCQkJaWYgKCFkZXNjZW5kYW50cy5jb250YWlucyhkZXNjZW5kYW50KSkgewotCQkJCQkJZGVzY2VuZGFudHMuYWRkKGRlc2NlbmRhbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFkZXNjZW5kYW50cy5jb250YWlucyhjaGlsZCkpIHsKLQkJCQkJZGVzY2VuZGFudHMuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24oZGVzY2VuZGFudHMpLml0ZXJhdG9yKCk7Ci0JfQotCi0Jdm9pZCBhcHBlbmRDaGlsZChDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZkNoaWxkTm9kZXMgPT0gbnVsbCkgewotCQkJZkNoaWxkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJaWYgKCFmQ2hpbGROb2Rlcy5jb250YWlucyhjaGlsZCkpIHsKLQkJCWZDaGlsZE5vZGVzLmFkZChjaGlsZCk7Ci0JCQkoKENTU01NTm9kZUltcGwpIGNoaWxkKS5mUmVmQ291bnQrKzsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlQ2hpbGQoQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsIHx8IGZDaGlsZE5vZGVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVyYXRvciBpID0gZkNoaWxkTm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoaS5uZXh0KCkgPT0gY2hpbGQpIHsKLQkJCQlpLnJlbW92ZSgpOwotCQkJCSgoQ1NTTU1Ob2RlSW1wbCkgY2hpbGQpLmZSZWZDb3VudC0tOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlQWxsQ2hpbGROb2RlcygpIHsKLQkJaWYgKGZDaGlsZE5vZGVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVyYXRvciBpID0gZkNoaWxkTm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkoKENTU01NTm9kZUltcGwpIGkubmV4dCgpKS5mUmVmQ291bnQtLTsKLQkJfQotCQlmQ2hpbGROb2Rlcy5jbGVhcigpOwotCX0KLQotCWFic3RyYWN0IGJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpOwotCi0Jdm9pZCBpbml0aWFsaXplQXR0cmlidXRlKE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJaWYgKGZBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWZBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlmQXR0cmlidXRlcy5wdXRBbGwoYXR0cmlidXRlcyk7Ci0JCXBvc3RTZXRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlmRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQl2b2lkIHBvc3RTZXRBdHRyaWJ1dGUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJLy8gZGVmYXVsdCA6IG5vcAotCX0KLQotCWFic3RyYWN0IHNob3J0IGdldEVycm9yKCk7Ci0KLQlpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKLQkJcmV0dXJuIChmQ2hpbGROb2RlcyAhPSBudWxsKSA/IGZDaGlsZE5vZGVzLnNpemUoKSA6IDA7Ci0JfQotCi0JaW50IGdldFJlZmVyZW5jZUNvdW50KCkgewotCQlyZXR1cm4gZlJlZkNvdW50OwotCX0KLQotCi0JcHJpdmF0ZSBMaXN0IGZDaGlsZE5vZGVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb24gPSBudWxsOwotCXByaXZhdGUgTWFwIGZBdHRyaWJ1dGVzID0gbnVsbDsKLQlwcml2YXRlIGludCBmUmVmQ291bnQgPSAwOyAvLyBmb3IgZXJyb3IgY2hlY2sKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX05PVF9BVkFJTEFCTEUgPSAiIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTnVtYmVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTnVtYmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFlM2U0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU51bWJlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1OdW1iZXI7Ci0KLWNsYXNzIENTU01NTnVtYmVySW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU51bWJlciB7Ci0KLQotCXB1YmxpYyBDU1NNTU51bWJlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9OVU1CRVI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXRUeXBlKCkgPT0gVFlQRV9VTklUKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBhZ2VSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUGFnZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOGNjZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUGFnZVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NUGFnZVJ1bGU7Ci0KLWNsYXNzIENTU01NUGFnZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NUGFnZVJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1QYWdlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9QQUdFX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfUFJPUEVSVFkgfHwgdHlwZSA9PSBUWVBFX1NFTEVDVE9SKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTI5ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NUHJvcGVydHk7Ci0KLQotY2xhc3MgQ1NTTU1Qcm9wZXJ0eUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Qcm9wZXJ0eSB7Ci0JcHVibGljIENTU01NUHJvcGVydHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUFJPUEVSVFk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX05VTUJFUiB8fCB0eXBlID09IFRZUEVfS0VZV09SRCB8fCB0eXBlID09IFRZUEVfRlVOQ1RJT04gfHwgdHlwZSA9PSBUWVBFX0NPTlRBSU5FUiB8fCB0eXBlID09IFRZUEVfU1RSSU5HIHx8IHR5cGUgPT0gVFlQRV9TRVBBUkFUT1IgfHwgdHlwZSA9PSBUWVBFX1BST1BFUlRZKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Qcm9wZXJ0eSNnZXRDYXRlZ29yeU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnlOYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKEFUVFJfQ0FURUdPUlkpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRWYWx1ZXMoKSB7Ci0JCVZhbHVlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBWYWx1ZUNvbGxlY3RvcigpOwotCQljb2xsZWN0b3IuYXBwbHkodGhpcyk7Ci0JCXJldHVybiBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvQ2xhc3NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5NTk4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotY2xhc3MgQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwgZXh0ZW5kcyBDU1NNTVNlbGVjdG9ySW1wbCB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNTVBzZXVkb0NsYXNzSW1wbC4KLQkgKi8KLQlwdWJsaWMgQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUFNFVURPX0NMQVNTOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0b3JTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9ICI6IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViZTkxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1wdWJsaWMgY2xhc3MgQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCBleHRlbmRzIENTU01NU2VsZWN0b3JJbXBsIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01NUHNldWRvRWxlbWVudEltcGwuCi0JICovCi0JcHVibGljIENTU01NUHNldWRvRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUFNFVURPX0VMRU1FTlQ7Ci0JfQotCi0Jdm9pZCBzZXRTZWxlY3RvclN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJZlZhbHVlID0gIjoiICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NWI0Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1jbGFzcyBDU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBDU1NNTVNlbGVjdG9ySW1wbCB7Ci0KLQlwdWJsaWMgQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVNlbGVjdG9yI2dldFNlbGVjdG9yVHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0VYUFJFU1NJT047Ci0JfQotCi0Jdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnBvc3RTZXRBdHRyaWJ1dGUoKTsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQltYXAucHV0KEVYUFJFU1NJT05fQURKQUNFTlQudG9Mb3dlckNhc2UoKSwgIisiKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fQVRUUklCVVRFLnRvTG93ZXJDYXNlKCksICJbXSIpOyAvLyROT04tTkxTLTEkCi0JCW1hcC5wdXQoRVhQUkVTU0lPTl9DSElMRC50b0xvd2VyQ2FzZSgpLCAiPiIpOyAvLyROT04tTkxTLTEkCi0JCW1hcC5wdXQoRVhQUkVTU0lPTl9ERVNDRU5EQU5ULnRvTG93ZXJDYXNlKCksICInICciKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fVU5JVkVSU0FMLnRvTG93ZXJDYXNlKCksICIqIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmVmFsdWUgPSAoU3RyaW5nKSBtYXAuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0JCWlmIChmVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmMjQzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1TZWxlY3RvcjsKLQotCi1hYnN0cmFjdCBjbGFzcyBDU1NNTVNlbGVjdG9ySW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVNlbGVjdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNTVNlbGVjdG9ySW1wbC4KLQkgKi8KLQlwdWJsaWMgQ1NTTU1TZWxlY3RvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGUjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TRUxFQ1RPUjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1TZWxlY3RvciNnZXRTZWxlY3RvclN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclN0cmluZygpIHsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JTdHJpbmcoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0cmluZ0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0cmluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhjZGU0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHJpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU3RyaW5nOwotCi1jbGFzcyBDU1NNTVN0cmluZ0ltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TdHJpbmcgewotCi0KLQlwdWJsaWMgQ1NTTU1TdHJpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfU1RSSU5HOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjcG9zdFNldEF0dHJpYnV0ZSgpCi0JICovCi0JLy8gdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQkvLyBzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JLy8gaWYgKG5hbWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vCi0JLy8gTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0FOWS50b0xvd2VyQ2FzZSgpLCAiPGFueT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19DT1VOVEVSX0lERU5USUZJRVIudG9Mb3dlckNhc2UoKSwgIjxjb3VudGVyPiIpOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfRkFNSUxZX05BTUUudG9Mb3dlckNhc2UoKSwgIjxmYW1pbHktbmFtZT4iKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0ZPTlRfRkFDRV9OQU1FLnRvTG93ZXJDYXNlKCksCi0JLy8gIjxmb250LWZhY2UtbmFtZT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19QQUdFX0lERU5USUZJRVIudG9Mb3dlckNhc2UoKSwKLQkvLyAiPHBhZ2UtaWRlbnRpZmllcj4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19TUEVDSUZJQ19WT0lDRS50b0xvd2VyQ2FzZSgpLAotCS8vICI8c3BlY2lmaWMtdm9pY2U+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfVVJBTkdFLnRvTG93ZXJDYXNlKCksICI8dXJhbmdlPiIpOyAvLyROT04tTkxTLTEkCi0JLy8KLQkvLyBmVmFsdWUgPSAoU3RyaW5nKW1hcC5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkvLyBpZiAoZlZhbHVlID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyB9Ci0JLy8KLQkvLyAvKgotCS8vICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCS8vICovCi0JLy8gcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkvLyByZXR1cm4gZlZhbHVlOwotCS8vIH0KLQkvLwotCS8vIHByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjU3YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVN0eWxlUnVsZTsKLQotY2xhc3MgQ1NTTU1TdHlsZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NU3R5bGVSdWxlIHsKLQotCi0JcHVibGljIENTU01NU3R5bGVSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1NUWUxFX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfUFJPUEVSVFkgfHwgdHlwZSA9PSBUWVBFX1NFTEVDVE9SKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0eWxlU2hlZXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVNoZWV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDdmZDAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0eWxlU2hlZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU3R5bGVTaGVldDsKLQotY2xhc3MgQ1NTTU1TdHlsZVNoZWV0SW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVN0eWxlU2hlZXQgewotCi0KLQlwdWJsaWMgQ1NTTU1TdHlsZVNoZWV0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1NUWUxFX1NIRUVUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX0NIQVJTRVRfUlVMRSB8fCB0eXBlID09IFRZUEVfSU1QT1JUX1JVTEUgfHwgdHlwZSA9PSBUWVBFX1BBR0VfUlVMRSB8fCB0eXBlID09IFRZUEVfTUVESUFfUlVMRSB8fCB0eXBlID09IFRZUEVfRk9OVF9GQUNFX1JVTEUgfHwgdHlwZSA9PSBUWVBFX1NUWUxFX1JVTEUpOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NVW5pdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVVuaXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMTU0YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NVW5pdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NVW5pdDsKLQotLyoqCi0gKiBDU1NNTVVuaXQgOiBlbWJlZGRlZCB0eXBlCi0gKi8KLWNsYXNzIENTU01NVW5pdEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Vbml0IHsKLQotCXB1YmxpYyBDU1NNTVVuaXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfVU5JVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVVuaXQjZ2V0VW5pdFN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbml0U3RyaW5nKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI3Bvc3RTZXRBdHRyaWJ1dGUoKQotCSAqLwotCS8vIHZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7Ci0JLy8gc3VwZXIucG9zdFNldEF0dHJpYnV0ZSgpOwotCS8vIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCS8vIGlmIChuYW1lID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0NNLnRvTG93ZXJDYXNlKCksICJjbSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0RFRy50b0xvd2VyQ2FzZSgpLCAiZGVnIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfRU1TLnRvTG93ZXJDYXNlKCksICJlbSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0VYUy50b0xvd2VyQ2FzZSgpLCAiZXgiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9HUkFELnRvTG93ZXJDYXNlKCksICJncmFkIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfSEFTSC50b0xvd2VyQ2FzZSgpLCAiIyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0haLnRvTG93ZXJDYXNlKCksICJIeiIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0lOLnRvTG93ZXJDYXNlKCksICJpbiIpOy8vJE5PTi1OTFMtMSQKLQkvLyAvLyBtYXAucHV0KENTU1VuaXRJRC5VX0lOVEVHRVIudG9Mb3dlckNhc2UoKSwKLQkvLyAiKGludGVnZXIpIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfS0haLnRvTG93ZXJDYXNlKCksICJrSHoiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9NTS50b0xvd2VyQ2FzZSgpLCAibW0iKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9NUy50b0xvd2VyQ2FzZSgpLCAibXMiKTsvLyROT04tTkxTLTEkCi0JLy8gLy8gbWFwLnB1dChDU1NVbml0SUQuVV9OVU1CRVIudG9Mb3dlckNhc2UoKSwgIihudW1iZXIpIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUEMudG9Mb3dlckNhc2UoKSwgInBjIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUEVSQ0VOVEFHRS50b0xvd2VyQ2FzZSgpLCAiJSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BULnRvTG93ZXJDYXNlKCksICJwdCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BYLnRvTG93ZXJDYXNlKCksICJweCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1JBRC50b0xvd2VyQ2FzZSgpLCAicmFkIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUy50b0xvd2VyQ2FzZSgpLCAicyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBmVmFsdWUgPSAoU3RyaW5nKW1hcC5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkvLyBpZiAoZlZhbHVlID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyB9Ci0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFVuaXRTdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldFVuaXRTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0VW5pdFN0cmluZygpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNZXRhTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTWV0YU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQwZGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNZXRhTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1TdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotCi0KLWNsYXNzIENTU01ldGFNb2RlbEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTWV0YU1vZGVsIHsKLQkvLyBjbGFzcyBDU1NNZXRhTW9kZWxJbXBsIGltcGxlbWVudHMgQ1NTTWV0YU1vZGVsIHsKLQlwdWJsaWMgQ1NTTWV0YU1vZGVsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGVQb29sID0gbmV3IE5vZGVQb29sKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9NRVRBX01PREVMOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX1NUWUxFX1NIRUVUIHx8IHR5cGUgPT0gVFlQRV9DQVRFR09SWSk7Ci0JfQotCi0JcHVibGljIENTU01NU3R5bGVTaGVldCBnZXRTdHlsZVNoZWV0KCkgewotCQlJdGVyYXRvciBpID0gZ2V0Q2hpbGROb2RlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gVFlQRV9TVFlMRV9TSEVFVCkgewotCQkJCXJldHVybiAoQ1NTTU1TdHlsZVNoZWV0KSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCQkvLyByZXR1cm4gZlN0eWxlU2hlZXQ7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENhdGVnb3JpZXMoKSB7Ci0JCUxpc3QgY2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaSA9IGdldENoaWxkTm9kZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFRZUEVfQ0FURUdPUlkpIHsKLQkJCQljYXRlZ29yaWVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2F0ZWdvcmllcy5pdGVyYXRvcigpOwotCX0KLQotCXZvaWQgbG9hZENvbXBsZXRlZCgpIHsKLQkJZk5vZGVQb29sID0gbnVsbDsKLQl9Ci0KLQkvLyBMaXN0IGZDYXRlZ29yaWVzID0gbnVsbDsKLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNpc1ZhbGlkKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldFN0eWxlU2hlZXQoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCU5vZGVQb29sIGdldE5vZGVQb29sKCkgewotCQlyZXR1cm4gZk5vZGVQb29sOwotCX0KLQotCi0JcHJpdmF0ZSBOb2RlUG9vbCBmTm9kZVBvb2wgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM0NWY0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0KLWNsYXNzIENTU1Byb2ZpbGVJbXBsIGltcGxlbWVudHMgQ1NTUHJvZmlsZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTWV0YU1vZGVsUHJvZmlsZUluZm9JbXBsLgotCSAqLwotCXByaXZhdGUgQ1NTUHJvZmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvSW1wbC4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJvZmlsZUltcGwoU3RyaW5nIGlkLCBVUkwgdXJsKSB7Ci0JCXRoaXMoKTsKLQkJZklEID0gaWQ7Ci0JCWZVUkwgPSB1cmw7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvSW1wbC4KLQkgKi8KLQlDU1NQcm9maWxlSW1wbChTdHJpbmcgaWQsIFVSTCB1cmwsIFN0cmluZyByZWxhdGl2ZVVSSSkgewotCQlzdXBlcigpOwotCQlmSUQgPSBpZDsKLQkJZlVSTCA9IHVybDsKLQkJZlJlbGF0aXZlVVJJID0gcmVsYXRpdmVVUkk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvI2dldFByb2ZpbGVJRCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9maWxlSUQoKSB7Ci0JCXJldHVybiBmSUQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvI2dldFByb2ZpbGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gKGZOYW1lID09IG51bGwpID8gZklEIDogZk5hbWU7Ci0JfQotCi0JcHVibGljIENTU01ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7Ci0JCWlmIChmTWV0YU1vZGVsID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBnZXRQcm9maWxlVVJMKCkub3BlblN0cmVhbSgpOwotCQkJCVByb2ZpbGVMb2FkZXIgbG9hZGVyID0gbmV3IFByb2ZpbGVMb2FkZXIoZ2V0UmVzb3VyY2VCdW5kbGUoKSwgZ2V0TG9nZ2luZygpKTsKLQkJCQlmTWV0YU1vZGVsID0gbG9hZGVyLmxvYWRQcm9maWxlKGlucHV0KTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ2Fubm90IG9wZW4gc3RyZWFtIGZvciBwcm9maWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZk1ldGFNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0KLQkJQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IGdldE93bmVyUGx1Z2luSUQoKTsKLQkJaWYgKHBsdWdpbklEICE9IG51bGwpIHsKLQkJCWJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkvLyBuZWVkZWQgdG8gd29yayBhcm91bmQgRmlsZUxvY2F0b3Iub3BlblN0cmVhbSBub3QgbG9va2luZyBmb3IKLQkJCQkvLyBmaWxlcyB3aXRoIEphdmEgbmFtaW5nIGNvbnZlbnRpb25zIChCVUcxMDMzNDUpCi0JCQkJSVBhdGhbXSBwYXRocyA9IGdldFJlc291cmNlQnVuZGxlUGF0aHMoKTsKLQkJCQlpZiAocGF0aHMgIT0gbnVsbCkgewotCQkJCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0JCQkJCWludCBpID0gMDsKLQkJCQkJd2hpbGUgKGkgPCBwYXRocy5sZW5ndGggJiYgaW5TdHJlYW0gPT0gbnVsbCkgewotCQkJCQkJSVBhdGggcGF0aCA9IHBhdGhzW2ldOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpblN0cmVhbSA9IEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0oYnVuZGxlLCBwYXRoLCB0cnVlKTsKLQkJCQkJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkKLQkJCQkJCQkJcmVzb3VyY2VCdW5kbGUgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShpblN0cmVhbSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQkrK2k7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIHVuYWJsZSB0byBvcGVuIHN0cmVhbSB3aXRoIGN1cnJlbnQgcGF0aCBzbyBqdXN0Ci0JCQkJCQkJLy8gdHJ5IG5leHQgcGF0aAotCQkJCQkJCSsraTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCWlmIChpblN0cmVhbSAhPSBudWxsKQotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcG90ZW50aWFsIHJlc291cmNlIGJ1bmRsZSBwYXRocyBvciBudWxsIGlmIHRoZXJlCi0JICogYXJlIG5vbmUKLQkgKiAKLQkgKiBAcmV0dXJuIElQYXRoW10gb3IgbnVsbAotCSAqLwotCXByaXZhdGUgSVBhdGhbXSBnZXRSZXNvdXJjZUJ1bmRsZVBhdGhzKCkgewotCQlJUGF0aFtdIHBhdGhzID0gbmV3IElQYXRoWzBdOwotCi0JCWlmIChmUmVsYXRpdmVVUkkgIT0gbnVsbCkgewotCQkJLy8gb3JpZ2luYWwgcGF0aCA9IGxvY2F0aW9uIG9mIHByb2ZpbGUueG1sIC0gcHJvZmlsZS54bWwKLQkJCUlQYXRoIG9yaWdpbmFsUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGZSZWxhdGl2ZVVSSSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCi0JCQlTdHJpbmcgYmFzZU5hbWUgPSAiY3NzcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQgCi0JCQlWZWN0b3IgbmFtZXMgPSBjYWxjdWxhdGVCdW5kbGVOYW1lcyhiYXNlTmFtZSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0KLQkJCWludCBhID0gMDsKLQkJCXBhdGhzID0gbmV3IElQYXRoW25hbWVzLnNpemUoKV07Ci0JCQlmb3IgKGludCBpID0gbmFtZXMuc2l6ZSgpOyBpID4gMDsgLS1pKSB7Ci0JCQkJU3RyaW5nIGJ1bmRsZU5hbWUgPSAoU3RyaW5nKSBuYW1lcy5nZXQoaSAtIDEpOwotCQkJCUlQYXRoIHBhdGggPSBvcmlnaW5hbFBhdGguYXBwZW5kKGJ1bmRsZU5hbWUpLmFkZEZpbGVFeHRlbnNpb24oInByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXBhdGhzW2FdID0gcGF0aDsKLQkJCQkrK2E7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhdGhzOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgYnVuZGxlcyBhbG9uZyB0aGUgc2VhcmNoIHBhdGggZnJvbSB0aGUgYmFzZSBidW5kbGUgdG8gdGhlCi0JICogYnVuZGxlIHNwZWNpZmllZCBieSBiYXNlTmFtZSBhbmQgbG9jYWxlLjxiciAvPgotCSAqIAotCSAqIEBwYXJhbSBiYXNlTmFtZQotCSAqICAgICAgICAgICAgdGhlIGJhc2UgYnVuZGxlIG5hbWUKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICB0aGUgbG9jYWxlCi0JICogQHBhcmFtIG5hbWVzCi0JICogICAgICAgICAgICB0aGUgdmVjdG9yIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgYnVuZGxlcyBhbG9uZyB0aGUKLQkgKiAgICAgICAgICAgIHNlYXJjaCBwYXRoLgotCSAqIAotCSAqLwotCXByaXZhdGUgVmVjdG9yIGNhbGN1bGF0ZUJ1bmRsZU5hbWVzKFN0cmluZyBiYXNlTmFtZSwgTG9jYWxlIGxvY2FsZSkgewotCSAgICAvLyB0aGlzIG1ldGhvZCBjYW4gYmUgZGVsZXRlZCBhZnRlciBCVUcxMDMzNDUgaXMgZml4ZWQKLQkJZmluYWwgVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoNCk7IC8vIGRlZmF1bHQgc2l6ZSA0Ci0JCWZpbmFsIFN0cmluZyBsYW5ndWFnZSA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotCQlmaW5hbCBpbnQgbGFuZ3VhZ2VMZW5ndGggPSBsYW5ndWFnZS5sZW5ndGgoKTsKLQkJZmluYWwgU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpOwotCQlmaW5hbCBpbnQgY291bnRyeUxlbmd0aCA9IGNvdW50cnkubGVuZ3RoKCk7Ci0JCWZpbmFsIFN0cmluZyB2YXJpYW50ID0gbG9jYWxlLmdldFZhcmlhbnQoKTsKLQkJZmluYWwgaW50IHZhcmlhbnRMZW5ndGggPSB2YXJpYW50Lmxlbmd0aCgpOwotCi0JCXJlc3VsdC5hZGRFbGVtZW50KGJhc2VOYW1lKTsgLy8gYXQgbGVhc3QgYWRkIGJhc2UgbmFtZQotCQlpZiAobGFuZ3VhZ2VMZW5ndGggKyBjb3VudHJ5TGVuZ3RoICsgdmFyaWFudExlbmd0aCA9PSAwKSB7Ci0JCQkvLyBUaGUgbG9jYWxlIGlzICIiLCAiIiwgIiIuCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciB0ZW1wID0gbmV3IFN0cmluZ0J1ZmZlcihiYXNlTmFtZSk7Ci0JCXRlbXAuYXBwZW5kKCdfJyk7Ci0JCXRlbXAuYXBwZW5kKGxhbmd1YWdlKTsKLQkJaWYgKGxhbmd1YWdlTGVuZ3RoID4gMCkgewotCQkJcmVzdWx0LmFkZEVsZW1lbnQodGVtcC50b1N0cmluZygpKTsKLQkJfQotCi0JCWlmIChjb3VudHJ5TGVuZ3RoICsgdmFyaWFudExlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXRlbXAuYXBwZW5kKCdfJyk7Ci0JCXRlbXAuYXBwZW5kKGNvdW50cnkpOwotCQlpZiAoY291bnRyeUxlbmd0aCA+IDApIHsKLQkJCXJlc3VsdC5hZGRFbGVtZW50KHRlbXAudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAodmFyaWFudExlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXRlbXAuYXBwZW5kKCdfJyk7Ci0JCXRlbXAuYXBwZW5kKHZhcmlhbnQpOwotCQlyZXN1bHQuYWRkRWxlbWVudCh0ZW1wLnRvU3RyaW5nKCkpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvI2dldFByb2ZpbGVVUkwoKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0UHJvZmlsZVVSTCgpIHsKLQkJcmV0dXJuIGZVUkw7Ci0JfQotCi0Jdm9pZCBzZXRQcm9maWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlmTmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZkRlZmF1bHQ7Ci0JfQotCi0Jdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gaXNEZWZhdWx0KSB7Ci0JCWZEZWZhdWx0ID0gaXNEZWZhdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T3duZXJQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIGZPd25lclBsdWdpbklEOwotCX0KLQotCXZvaWQgc2V0T3duZXJQbHVnaW5JRChTdHJpbmcgcGx1Z2luSUQpIHsKLQkJZk93bmVyUGx1Z2luSUQgPSBwbHVnaW5JRDsKLQl9Ci0KLQkvKioKLQkgKiBoaWRkZW4gb3B0aW9uIDogbG9nZ2luZwotCSAqLwotCXZvaWQgc2V0TG9nZ2luZyhib29sZWFuIGxvZ2dpbmcpIHsKLQkJZkxvZ2dpbmcgPSBsb2dnaW5nOwotCX0KLQotCWJvb2xlYW4gZ2V0TG9nZ2luZygpIHsKLQkJcmV0dXJuIGZMb2dnaW5nOwotCX0KLQotCi0JU3RyaW5nIGZJRCA9IG51bGw7Ci0JU3RyaW5nIGZOYW1lID0gbnVsbDsKLQlVUkwgZlVSTCA9IG51bGw7Ci0JQ1NTTWV0YU1vZGVsIGZNZXRhTW9kZWwgPSBudWxsOwotCVN0cmluZyBmT3duZXJQbHVnaW5JRCA9IG51bGw7Ci0JYm9vbGVhbiBmRGVmYXVsdCA9IGZhbHNlOwotCWJvb2xlYW4gZkxvZ2dpbmcgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmUmVsYXRpdmVVUkkgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiNWUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLQotCi1jbGFzcyBDU1NQcm9maWxlVGVzdCB7Ci0KLQotCS8qKgotCSAqIFRlc3QgdXNlIG9ubHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlDU1NNZXRhTW9kZWwgbWV0YW1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IG5ldyBDU1NQcm9maWxlSW1wbCgidGVzdCIsIG5ldyBVUkwoYXJnc1swXSkpOyAvLyROT04tTkxTLTEkCi0JCQltZXRhbW9kZWwgPSBwcm9maWxlLmdldE1ldGFNb2RlbCgpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAobWV0YW1vZGVsID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvKgotCQkgKiBDU1NNTVR5cGVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENTU01NVHlwZUNvbGxlY3RvcigpOwotCQkgKiBjb2xsZWN0b3IuYXBwbHkobWV0YW1vZGVsLCBDU1NNTU5vZGUuVFlQRV9QUk9QRVJUWSk7IEl0ZXJhdG9yCi0JCSAqIGlQcm9wZXJ0eSA9IGNvbGxlY3Rvci5nZXROb2RlcygpOyB3aGlsZSAoaVByb3BlcnR5Lmhhc05leHQoKSkgewotCQkgKiBDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpaVByb3BlcnR5Lm5leHQoKTsKLQkJICogU3lzdGVtLm91dC5wcmludGxuKCJQcm9wZXJ0eSAiICsgbm9kZS5nZXROYW1lKCkgKyAiIGNhbiBjb250YWluOiIpOwotCQkgKiAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQgSXRlcmF0b3IgaVZhbHVlID0KLQkJICogbm9kZS5nZXREZXNjZW5kYW50cygpOyB3aGlsZSAoaVZhbHVlLmhhc05leHQoKSkgewotCQkgKiBkZWJ1Z091dCgoQ1NTTU1Ob2RlKWlWYWx1ZS5uZXh0KCksIDAsIGZhbHNlKTsgfSB9Ci0JCSAqLwotCQlkZWJ1Z091dChtZXRhbW9kZWwsIDAsIHRydWUpOwotCX0KLQotCXN0YXRpYyB2b2lkIGRlYnVnT3V0KENTU01NTm9kZSBub2RlLCBpbnQgZGVwdGgsIGJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0JCVN0cmluZyB0eXBlID0gbm9kZS5nZXRUeXBlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnQoIlsgIiArIG5vZGUuZ2V0TmFtZSgpICsgIigiICsgdHlwZSArICIpIF0iKTsgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJaWYgKHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfVU5JVCB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX1NFTEVDVE9SKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIgLT4gIiArIG5vZGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCQlpZiAocmVjdXJzaXZlKSB7Ci0JCQlqYXZhLnV0aWwuSXRlcmF0b3IgaU5vZGUgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCXdoaWxlIChpTm9kZS5oYXNOZXh0KCkpIHsKLQkJCQlkZWJ1Z091dCgoQ1NTTU1Ob2RlKSBpTm9kZS5uZXh0KCksIGRlcHRoICsgMSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvTWV0YU1vZGVsRXJyb3JzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvTWV0YU1vZGVsRXJyb3JzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTM4MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL01ldGFNb2RlbEVycm9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbnRlcmZhY2UgTWV0YU1vZGVsRXJyb3JzIHsKLQotCXN0YXRpYyBmaW5hbCBzaG9ydCBOT19FUlJPUiA9IDA7Ci0KLQkvLyBNQVNLCi0Jc3RhdGljIGZpbmFsIHNob3J0IE1BU0tfV0FSTklORyA9IDB4MTAwMDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgTUFTS19FUlJPUiA9IDB4MjAwMDsKLQotCS8vIEVSUk9SCi0Jc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX05PVF9ERUZJTkVEID0gTUFTS19FUlJPUiArIDB4MDE7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX0lOVkFMSURfTkFNRSA9IE1BU0tfRVJST1IgKyAweDA0OwotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9JTlZBSUxEX0NISUxEID0gTUFTS19FUlJPUiArIDB4MDI7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX05PX0NISUxEID0gTUFTS19FUlJPUiArIDB4MDg7Ci0JLy8gc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX05PX0VTU0VOVElBTF9DSElMRCA9IE1BU0tfRVJST1IgKyAweDEwCi0KLQkvLyBXQVJOSU5HCi0Jc3RhdGljIGZpbmFsIHNob3J0IFdBUk5JTkdfSEFTX05PX0NISUxEID0gTUFTS19XQVJOSU5HICsgMHgwMTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Ob2RlUG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL05vZGVQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Y2I1NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL05vZGVQb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotCi1jbGFzcyBOb2RlUG9vbCB7Ci0KLQlOb2RlUG9vbCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZUNsYXNzTmFtZVRhYmxlKCk7Ci0JfQotCi0JQ1NTTU1Ob2RlSW1wbCBnZXROb2RlKFN0cmluZyB0YWdOYW1lLCBTdHJpbmcgbm9kZU5hbWUpIHsKLQkJaWYgKG5vZGVOYW1lICE9IG51bGwpIHsKLQkJCW5vZGVOYW1lID0gbm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgY2xhc3NOYW1lcy5nZXQodGFnTmFtZSk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTWFwIG5vZGVzID0gKE1hcCkgbm9kZVJlZ2lzdHJ5LmdldChjbGFzc05hbWUpOwotCQlpZiAobm9kZXMgPT0gbnVsbCkgewotCQkJbm9kZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJbm9kZVJlZ2lzdHJ5LnB1dChjbGFzc05hbWUsIG5vZGVzKTsKLQkJfQotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgbm9kZXMuZ2V0KG5vZGVOYW1lKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJbm9kZSA9IGNyZWF0ZU5ld05vZGUoY2xhc3NOYW1lKTsKLQkJCW5vZGVzLnB1dChub2RlTmFtZSwgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBDU1NNTU5vZGVJbXBsIGNyZWF0ZU5ld05vZGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSBudWxsOwotCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCWNsYXNzTmFtZSA9IGdldFBhY2thZ2VOYW1lKCkgKyAiLiIgKyBjbGFzc05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJbm9kZSA9IChDU1NNTU5vZGVJbXBsKSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oY2xhc3NOYW1lICsgIiBpcyBDcmVhdGVkIik7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIEVycm9yIGNoZWNrIGZ1bmN0aW9uOiBmaW5kIG5vZGVzIHRoYXQgYXJlIG5vdCByZWZlcnJlZCBieSBhbnkgbm9kZQotCSAqLwotCUl0ZXJhdG9yIGdldFN0cmF5Tm9kZXMoKSB7Ci0JCUxpc3Qgc3RyYXlOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaU1hcCA9IG5vZGVSZWdpc3RyeS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaU1hcC5oYXNOZXh0KCkpIHsKLQkJCU1hcCBub2RlcyA9IChNYXApIGlNYXAubmV4dCgpOwotCQkJSXRlcmF0b3IgaU5vZGUgPSBub2Rlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGlOb2RlLmhhc05leHQoKSkgewotCQkJCUNTU01NTm9kZUltcGwgbm9kZSA9IChDU1NNTU5vZGVJbXBsKSBpTm9kZS5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUuZ2V0UmVmZXJlbmNlQ291bnQoKSA9PSAwKSB7Ci0JCQkJCXN0cmF5Tm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyYXlOb2Rlcy5pdGVyYXRvcigpOwotCX0KLQotCS8vIFRoaXMgY2xhc3MgbXVzdCBub3QgYmUgaW5uZXIgY2xhc3MgOikKLQlwcml2YXRlIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLQkJaWYgKGZQYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQlpbnQgcG9zID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoMCA8IHBvcykgewotCQkJCWZQYWNrYWdlTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZQYWNrYWdlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZQYWNrYWdlTmFtZTsKLQl9Ci0KLQl2b2lkIGluaXRpYWxpemVDbGFzc05hbWVUYWJsZSgpIHsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlNUWUxFU0hFRVRfREVGLCBDTEFTU19TVFlMRV9TSEVFVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5DSEFSU0VUX1JVTEVfREVGLCBDTEFTU19DSEFSU0VUX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ0hBUlNFVF9SVUxFLCBDTEFTU19DSEFSU0VUX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuRk9OVEZBQ0VfUlVMRV9ERUYsIENMQVNTX0ZPTlRfRkFDRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkZPTlRGQUNFX1JVTEUsIENMQVNTX0ZPTlRfRkFDRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLklNUE9SVF9SVUxFX0RFRiwgQ0xBU1NfSU1QT1JUX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuSU1QT1JUX1JVTEUsIENMQVNTX0lNUE9SVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLk1FRElBX1JVTEVfREVGLCBDTEFTU19NRURJQV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLk1FRElBX1JVTEUsIENMQVNTX01FRElBX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUEFHRV9SVUxFX0RFRiwgQ0xBU1NfUEFHRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBBR0VfUlVMRSwgQ0xBU1NfUEFHRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlNUWUxFX1JVTEVfREVGLCBDTEFTU19TVFlMRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlNUWUxFX1JVTEUsIENMQVNTX1NUWUxFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFJPUEVSVFlfREVGLCBDTEFTU19QUk9QRVJUWSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QUk9QRVJUWSwgQ0xBU1NfUFJPUEVSVFkpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRPUl9ERUYsIENMQVNTX0RFU0NSSVBUT1IpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRPUiwgQ0xBU1NfREVTQ1JJUFRPUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5DT05UQUlORVJfREVGLCBDTEFTU19DT05UQUlORVIpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ09OVEFJTkVSLCBDTEFTU19DT05UQUlORVIpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuTlVNQkVSX0RFRiwgQ0xBU1NfTlVNQkVSKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLk5VTUJFUiwgQ0xBU1NfTlVNQkVSKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfREVGLCBDTEFTU19LRVlXT1JEKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLktFWVdPUkQsIENMQVNTX0tFWVdPUkQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuVU5JVCwgQ0xBU1NfVU5JVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5VTklUX0RFRiwgQ0xBU1NfVU5JVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTiwgQ0xBU1NfRlVOQ1RJT04pOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuRlVOQ1RJT05fREVGLCBDTEFTU19GVU5DVElPTik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TRUxFQ1RPUl9FWFBSRVNTSU9OLCBDTEFTU19TRUxFQ1RPUl9FWFBSRVNTSU9OKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBTRVVET19FTEVNRU5ULCBDTEFTU19QU0VVRE9fRUxFTUVOVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fRUxFTUVOVF9ERUYsIENMQVNTX1BTRVVET19FTEVNRU5UKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBTRVVET19DTEFTUywgQ0xBU1NfUFNFVURPX0NMQVNTKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBTRVVET19DTEFTU19ERUYsIENMQVNTX1BTRVVET19DTEFTUyk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFJJTkcsIENMQVNTX1NUUklORyk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5DQVRFR09SWV9ERUYsIENMQVNTX0NBVEVHT1JZKTsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZQYWNrYWdlTmFtZTsKLQkvKgotCSAqIENvbnZlcnNpb24gVGFibGVzIG5vZGVSZWdpc3RyeSA6IGNsYXNzIG5hbWUgLT4gaGFzaCBvZiBub2RlIGluc3RhbmNlcwotCSAqIGNsYXNzTmFtZXMgOiBQcm9maWxlIFRhZyBuYW1lIC0+IGphdmEgY2xhc3MgbmFtZQotCSAqLwotCXByaXZhdGUgTWFwIG5vZGVSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgY2xhc3NOYW1lcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfU1RZTEVfU0hFRVQgPSAiQ1NTTU1TdHlsZVNoZWV0SW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfQ0hBUlNFVF9SVUxFID0gIkNTU01NQ2hhcnNldFJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19GT05UX0ZBQ0VfUlVMRSA9ICJDU1NNTUZvbnRGYWNlUnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0lNUE9SVF9SVUxFID0gIkNTU01NSW1wb3J0UnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX01FRElBX1JVTEUgPSAiQ1NTTU1NZWRpYVJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QQUdFX1JVTEUgPSAiQ1NTTU1QYWdlUnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1NUWUxFX1JVTEUgPSAiQ1NTTU1TdHlsZVJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QUk9QRVJUWSA9ICJDU1NNTVByb3BlcnR5SW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfREVTQ1JJUFRPUiA9ICJDU1NNTURlc2NyaXB0b3JJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19DT05UQUlORVIgPSAiQ1NTTU1Db250YWluZXJJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19OVU1CRVIgPSAiQ1NTTU1OdW1iZXJJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19LRVlXT1JEID0gIkNTU01NS2V5d29yZEltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1VOSVQgPSAiQ1NTTU1Vbml0SW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRlVOQ1RJT04gPSAiQ1NTTU1GdW5jdGlvbkltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1NUUklORyA9ICJDU1NNTVN0cmluZ0ltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0NBVEVHT1JZID0gIkNTU01NQ2F0ZWdvcnlJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19TRUxFQ1RPUl9FWFBSRVNTSU9OID0gIkNTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUFNFVURPX0NMQVNTID0gIkNTU01NUHNldWRvQ2xhc3NJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QU0VVRE9fRUxFTUVOVCA9ICJDU1NNTVBzZXVkb0VsZW1lbnRJbXBsIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhNmIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLQotY2xhc3MgUHJvZmlsZUhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLQlwdWJsaWMgUHJvZmlsZUhhbmRsZXIoQ1NTTWV0YU1vZGVsSW1wbCBtZXRhbW9kZWwsIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBib29sZWFuIGxvZ2dpbmcpIHsKLQkJc3VwZXIoKTsKLQkJZk1ldGFNb2RlbCA9IG1ldGFtb2RlbDsKLQkJZk5vZGVQb29sID0gbWV0YW1vZGVsLmdldE5vZGVQb29sKCk7Ci0JCWZSZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotCQlmTG9nZ2luZyA9IGxvZ2dpbmc7Ci0JfQotCi0JcHVibGljIFByb2ZpbGVIYW5kbGVyKENTU01ldGFNb2RlbEltcGwgbWV0YW1vZGVsLCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSkgewotCQlzdXBlcigpOwotCQlmTWV0YU1vZGVsID0gbWV0YW1vZGVsOwotCQlmTm9kZVBvb2wgPSBtZXRhbW9kZWwuZ2V0Tm9kZVBvb2woKTsKLQkJZlJlc291cmNlQnVuZGxlID0gcmVzb3VyY2VCdW5kbGU7Ci0JCWZMb2dnaW5nID0gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5LmVxdWFscygiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQkJaWYgKCFrZXkuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQkJaWYgKGtleS5zdGFydHNXaXRoKCIlJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBrZXkuc3Vic3RyaW5nKDEpOwotCQl9Ci0KLQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkuc3Vic3RyaW5nKDEpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnREb2N1bWVudCIpOwotCQkvLyBmTm9kZVN0YWNrLnB1c2gobWV0YW1vZGVsKTsKLQkJLy8gZkN1cnJlbnROb2RlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQluZXcgRXJyb3JDb3JyZWN0b3IoKS5kb0NvcnJlY3QoZk1ldGFNb2RlbCk7Ci0JCWlmIChmTG9nZ2luZykgewotCQkJSXRlcmF0b3IgaSA9IGZOb2RlUG9vbC5nZXRTdHJheU5vZGVzKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJCVN0cmluZyBzdHIgPSAiW0NTU1Byb2ZpbGUgV2FybmluZ10gIiArIG5vZGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RyICs9ICIoIiArIG5vZGUuZ2V0VHlwZSgpICsgIikgaXMgbm90IHJlZmVycmVkIGJ5IGFueSBub2RlLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsIHN0cik7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlUYWdOb2RlIHRhZ05vZGUgPSBudWxsOwotCQlDU1NNTU5vZGVJbXBsIHBhcmVudE5vZGUgPSBudWxsOwotCQlpZiAoMCA8IGZOb2RlU3RhY2suc2l6ZSgpKSB7Ci0JCQl0YWdOb2RlID0gKFRhZ05vZGUpIGZOb2RlU3RhY2sucGVlaygpOwotCQkJcGFyZW50Tm9kZSA9IHRhZ05vZGUubm9kZTsKLQkJfQotCi0JCUNTU01NTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0JCWlmIChxTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBST0ZJTEVfSU1QT1JUKSkgeyAvLyBpbXBvcnQKLQkJCVN0cmluZyBwcm9maWxlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FX1JFRkVSRU5DRSk7Ci0JCQlpbXBvcnRQcm9maWxlKHByb2ZpbGVOYW1lKTsKLQkJfQotCQllbHNlIGlmIChpc0RlZmluaXRpb24ocU5hbWUpKSB7IC8vIG5vZGUgY3JlYXRpb24KLQkJCVN0cmluZyBub2RlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FX0RFRklOSVRJT04pOwotCQkJbm9kZSA9IGZOb2RlUG9vbC5nZXROb2RlKHFOYW1lLCBub2RlTmFtZSk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG92ZXJ3cml0ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9PVkVSV1JJVEUpOwotCQkJCWlmIChvdmVyd3JpdGUgPT0gbnVsbCB8fCBvdmVyd3JpdGUuZXF1YWxzKEFUVFJfVkFMVUVfT1ZFUldSSVRFX0ZBTFNFKSkgewotCQkJCQlub2RlLnJlbW92ZUFsbENoaWxkTm9kZXMoKTsKLQkJCQl9Ci0JCQkJTWFwIGF0dHJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWF0dHJNYXAucHV0KGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSksIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlub2RlLmluaXRpYWxpemVBdHRyaWJ1dGUoYXR0ck1hcCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlID09IG51bGwpIHsgLy8gbm9kZSByZWZlcmVuY2UKLQkJCVN0cmluZyBub2RlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQVRUUl9OQU1FX1JFRkVSRU5DRSk7Ci0JCQlub2RlID0gZk5vZGVQb29sLmdldE5vZGUocU5hbWUsIG5vZGVOYW1lKTsKLQkJfQotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5jYW5Db250YWluKG5vZGUpKSB7Ci0JCQkJU3RyaW5nIGVuYWJsZWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfRU5BQkxFRCk7Ci0JCQkJaWYgKGVuYWJsZWQgIT0gbnVsbCAmJiBlbmFibGVkLmVxdWFscyhBVFRSX1ZBTFVFX0VOQUJMRURfRkFMU0UpKSB7Ci0JCQkJCXBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1NUWUxFX1NIRUVUIHx8IG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0NBVEVHT1JZKSB7Ci0JCQkJZk1ldGFNb2RlbC5hcHBlbmRDaGlsZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChmTG9nZ2luZyAmJiBwYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIHBhcmVudE5vZGUuZ2V0VHlwZSgpICsgIiBjYW5ub3QgY29udGFpbiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlub2RlLmdldFR5cGUoKSArICIgKCIgKyBxTmFtZSArICIpIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZk5vZGVTdGFjay5wdXNoKG5ldyBUYWdOb2RlKHFOYW1lLCAobm9kZSAhPSBudWxsKSA/IG5vZGUgOiBwYXJlbnROb2RlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlmTm9kZVN0YWNrLnBvcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlUYWdOb2RlIHRhZ05vZGUgPSAoVGFnTm9kZSkgZk5vZGVTdGFjay5wZWVrKCk7Ci0JCVN0cmluZyB0YWdOYW1lID0gdGFnTm9kZS50YWc7Ci0JCWlmICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuS0VZV09SRF9WQUxVRSkgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9WQUxVRSkgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNFTEVDVE9SX1ZBTFVFKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRJT04pIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DQVBUSU9OKSkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlidWYuYXBwZW5kKGNoW3N0YXJ0ICsgaV0pOwotCQkJfQotCQkJU3RyaW5nIHZhbHVlID0gZ2V0UmVzb3VyY2VTdHJpbmcoYnVmLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJCUNTU01NTm9kZUltcGwgbm9kZSA9IHRhZ05vZGUubm9kZTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfS0VZV09SRCAmJiB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuS0VZV09SRF9WQUxVRSkpIHsKLQkJCQkJKChDU1NNTUtleXdvcmRJbXBsKSBub2RlKS5zZXRLZXl3b3JkU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfVU5JVCAmJiB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuVU5JVF9WQUxVRSkpIHsKLQkJCQkJKChDU1NNTVVuaXRJbXBsKSBub2RlKS5zZXRVbml0U3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfRlVOQ1RJT04gJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkZVTkNUSU9OX1ZBTFVFKSkgewotCQkJCQkoKENTU01NRnVuY3Rpb25JbXBsKSBub2RlKS5zZXRGdW5jdGlvblN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1NFTEVDVE9SICYmICgoQ1NTTU1TZWxlY3Rvcikgbm9kZSkuZ2V0U2VsZWN0b3JUeXBlKCkgPT0gQ1NTTU1TZWxlY3Rvci5UWVBFX1BTRVVET19FTEVNRU5UKSB7Ci0JCQkJCSgoQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCkgbm9kZSkuc2V0U2VsZWN0b3JTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUiAmJiAoKENTU01NU2VsZWN0b3IpIG5vZGUpLmdldFNlbGVjdG9yVHlwZSgpID09IENTU01NU2VsZWN0b3IuVFlQRV9QU0VVRE9fQ0xBU1MpIHsKLQkJCQkJKChDU1NNTVBzZXVkb0NsYXNzSW1wbCkgbm9kZSkuc2V0U2VsZWN0b3JTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9DQVRFR09SWSAmJiB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FQVElPTikpIHsKLQkJCQkJKChDU1NNTUNhdGVnb3J5SW1wbCkgbm9kZSkuc2V0Q2FwdGlvbih2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5ERVNDUklQVElPTikpIHsKLQkJCQkJbm9kZS5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmaW5pdGlvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gKHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TVFlMRVNIRUVUX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkNIQVJTRVRfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5JTVBPUlRfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5QQUdFX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuTUVESUFfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GT05URkFDRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNUWUxFX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuS0VZV09SRF9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5OVU1CRVJfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUFJPUEVSVFlfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRPUl9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DT05UQUlORVJfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuVU5JVF9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TVFJJTkcpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DQVRFR09SWV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fQ0xBU1NfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUFNFVURPX0VMRU1FTlRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU0VMRUNUT1JfRVhQUkVTU0lPTikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNFUEFSQVRPUikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRQcm9maWxlKFN0cmluZyBwcm9maWxlTmFtZSkgewotCQlVUkwgcHJvZmlsZVVSTCA9IG51bGw7Ci0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gcmVnLmdldFByb2ZpbGUocHJvZmlsZU5hbWUpOwotCQlpZiAocHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkvLyBmaXJzdDogZmluZCBVUkwgYnkgSUQKLQkJCXByb2ZpbGVVUkwgPSBwcm9maWxlLmdldFByb2ZpbGVVUkwoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlY29uZDogZmluZCBVUkwgYnkgZmlsZW5hbWUgb2YgcHJvZmlsZSBVUkwKLQkJCUl0ZXJhdG9yIGkgPSByZWcuZ2V0UHJvZmlsZXMoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCXByb2ZpbGUgPSAoQ1NTUHJvZmlsZSkgaS5uZXh0KCk7Ci0JCQkJVVJMIHVybCA9IHByb2ZpbGUuZ2V0UHJvZmlsZVVSTCgpOwotCQkJCWlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKHByb2ZpbGVOYW1lKSkgewotCQkJCQlwcm9maWxlVVJMID0gdXJsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2ZpbGVVUkwgPT0gbnVsbCkgewotCQkJLy8gZmluYWw6IGl0IG1heSBiZSB1cmwgaXRzZWxmCi0JCQl0cnkgewotCQkJCXByb2ZpbGVVUkwgPSBuZXcgVVJMKHByb2ZpbGVOYW1lKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2ZpbGVVUkwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlQcm9maWxlTG9hZGVyLmxvYWRQcm9maWxlKGZNZXRhTW9kZWwsIHByb2ZpbGVVUkwub3BlblN0cmVhbSgpLCBmUmVzb3VyY2VCdW5kbGUsIGZMb2dnaW5nKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ2Fubm90IG9wZW4gc3RyZWFtIGZvciBwcm9maWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgVGFnTm9kZSB7Ci0KLQkJU3RyaW5nIHRhZyA9IG51bGw7Ci0JCUNTU01NTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0KLQkJVGFnTm9kZShTdHJpbmcgdGFnLCBDU1NNTU5vZGVJbXBsIG5vZGUpIHsKLQkJCXRoaXMudGFnID0gdGFnOwotCQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJfQotCX0KLQotCWNsYXNzIEVycm9yQ29ycmVjdG9yIHsKLQotCQl2b2lkIGRvQ29ycmVjdChDU1NNTU5vZGVJbXBsIG5vZGUpIHsKLQkJCUl0ZXJhdG9yIGkgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCUFycmF5TGlzdCBlcnJvck5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlSW1wbCBjaGlsZCA9IChDU1NNTU5vZGVJbXBsKSBpLm5leHQoKTsKLQkJCQlkb0NvcnJlY3QoY2hpbGQpOwotCQkJCXNob3J0IGVycm9yID0gY2hpbGQuZ2V0RXJyb3IoKTsKLQkJCQlpZiAoZXJyb3IgIT0gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SKSB7Ci0JCQkJCS8vIG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQllcnJvck5vZGVzLmFkZChjaGlsZCk7Ci0KLQkJCQkJU3RyaW5nIHN0ciA9ICJbQ1NTUHJvZmlsZSBFcnJvcl0gIiArIG5vZGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCXN0ciArPSAiKCIgKyBub2RlLmdldFR5cGUoKSArICIpIGNvbnRhaW5zIGVycm9yIG5vZGU6ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlzdHIgKz0gY2hpbGQuZ2V0TmFtZSgpICsgIigiICsgY2hpbGQuZ2V0VHlwZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc3RyICs9ICIgLSBlcnJvciBjb2RlID0gIiArIGVycm9yOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChmTG9nZ2luZykgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIHN0cik7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWludCBlcnJvclNpemUgPSBlcnJvck5vZGVzLnNpemUoKTsKLQkJCWlmIChlcnJvclNpemUgPiAwKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlcnJvclNpemU7IGorKykgewotCQkJCQlDU1NNTU5vZGVJbXBsIGVycm9yTm9kZSA9IChDU1NNTU5vZGVJbXBsKSBlcnJvck5vZGVzLmdldChqKTsKLQkJCQkJbm9kZS5yZW1vdmVDaGlsZChlcnJvck5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBDU1NNZXRhTW9kZWxJbXBsIGZNZXRhTW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZVBvb2wgZk5vZGVQb29sID0gbnVsbDsKLQlwcml2YXRlIFN0YWNrIGZOb2RlU3RhY2sgPSBuZXcgU3RhY2soKTsKLQlib29sZWFuIGZMb2dnaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTkFNRV9ERUZJTklUSU9OID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfTkFNRV9SRUZFUkVOQ0UgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9PVkVSV1JJVEUgPSAib3ZlcndyaXRlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9WQUxVRV9PVkVSV1JJVEVfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfVkFMVUVfRU5BQkxFRF9GQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlS2V5d29yZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlS2V5d29yZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3NzEzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUtleXdvcmRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWludGVyZmFjZSBQcm9maWxlS2V5d29yZHMgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBDU1NfUFJPRklMRSA9ICJjc3MtcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0ZJTEVfSU1QT1JUID0gInByb2ZpbGUtaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVTSEVFVF9ERUYgPSAic3R5bGVzaGVldC1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDSEFSU0VUX1JVTEUgPSAiY2hhcnNldC1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX1JVTEUgPSAiaW1wb3J0LXJ1bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQQUdFX1JVTEUgPSAicGFnZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTUVESUFfUlVMRSA9ICJtZWRpYS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRk9OVEZBQ0VfUlVMRSA9ICJmb250ZmFjZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVfUlVMRSA9ICJzdHlsZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hBUlNFVF9SVUxFX0RFRiA9ICJjaGFyc2V0LXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX1JVTEVfREVGID0gImltcG9ydC1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBBR0VfUlVMRV9ERUYgPSAicGFnZS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1FRElBX1JVTEVfREVGID0gIm1lZGlhLXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRk9OVEZBQ0VfUlVMRV9ERUYgPSAiZm9udGZhY2UtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9SVUxFX0RFRiA9ICJzdHlsZS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZVTkNUSU9OX0RFRiA9ICJmdW5jdGlvbi1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGVU5DVElPTl9WQUxVRSA9ICJmdW5jdGlvbi12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtFWVdPUkRfREVGID0gImtleXdvcmQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZV09SRF9WQUxVRSA9ICJrZXl3b3JkLXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBOVU1CRVJfREVGID0gIm51bWJlci1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVTklUID0gInVuaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVTklUX0RFRiA9ICJ1bml0LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVOSVRfVkFMVUUgPSAidW5pdC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9ERUYgPSAiY29udGFpbmVyLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0RFRiA9ICJjYXRlZ29yeS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDQVBUSU9OID0gImNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9ERUYgPSAicHJvcGVydHktZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRPUl9ERUYgPSAiZGVzY3JpcHRvci1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTRUxFQ1RPUl9FWFBSRVNTSU9OID0gInNlbGVjdG9yLWV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fQ0xBU1MgPSAicHNldWRvLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFNFVURPX0VMRU1FTlQgPSAicHNldWRvLWVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fQ0xBU1NfREVGID0gInBzZXVkby1jbGFzcy1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fRUxFTUVOVF9ERUYgPSAicHNldWRvLWVsZW1lbnQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU0VMRUNUT1JfVkFMVUUgPSAic2VsZWN0b3ItdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBOVU1CRVIgPSAibnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZV09SRCA9ICJrZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRlVOQ1RJT04gPSAiZnVuY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVIgPSAiY29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUEFSQVRPUiA9ICJzZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUT1IgPSAiZGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQyYWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNZXRhTW9kZWw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotCi0KLWNsYXNzIFByb2ZpbGVMb2FkZXIgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUHJvZmlsZUxvYWRlci4KLQkgKi8KLQlwcml2YXRlIFByb2ZpbGVMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JUHJvZmlsZUxvYWRlcihSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCXRoaXMoKTsKLQkJZlJlc291cmNlQnVuZGxlID0gcmVzb3VyY2VCdW5kbGU7Ci0JCWZMb2dnaW5nID0gbG9nZ2luZzsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBsb2FkUHJvZmlsZShDU1NNZXRhTW9kZWxJbXBsIG1ldGFtb2RlbCwgSW5wdXRTdHJlYW0gaW5wdXQsIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBib29sZWFuIGxvZ2dpbmcpIHsKLQkJdHJ5IHsKLQkJCVhNTFJlYWRlciB4bWxSZWFkZXIgPSBYTUxSZWFkZXJVdGlsLmNyZWF0ZVhNTFJlYWRlcihQQVJTRVJfTkFNRSk7Ci0JCQkvLyBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcihQQVJTRVJfTkFNRSk7Ci0JCQl4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IFByb2ZpbGVIYW5kbGVyKG1ldGFtb2RlbCwgcmVzb3VyY2VCdW5kbGUsIGxvZ2dpbmcpKTsKLQkJCXhtbFJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXQpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlDU1NNZXRhTW9kZWwgbG9hZFByb2ZpbGUoSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJaWYgKGZNZXRhTW9kZWwgPT0gbnVsbCkgewotCQkJZk1ldGFNb2RlbCA9IG5ldyBDU1NNZXRhTW9kZWxJbXBsKCk7Ci0JCX0KLQkJbG9hZFByb2ZpbGUoZk1ldGFNb2RlbCwgaW5wdXQsIGZSZXNvdXJjZUJ1bmRsZSwgZkxvZ2dpbmcpOwotCQlmTWV0YU1vZGVsLmxvYWRDb21wbGV0ZWQoKTsKLQkJcmV0dXJuIGZNZXRhTW9kZWw7Ci0JfQotCi0KLQlDU1NNZXRhTW9kZWxJbXBsIGZNZXRhTW9kZWwgPSBudWxsOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVJTRVJfTkFNRSA9ICJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZMb2dnaW5nID0gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ4M2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVnaXN0cnlSZWFkZXIgewotCi0JLy8KLQlwcml2YXRlIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjc3Nwcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIFRBR19OQU1FID0gInByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfTE9HR0lORyA9ICJsb2dnaW5nIjsgLy8gSGlkZGVuIE9wdGlvbiAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTWV0YU1vZGVsUmVnaXN0cnlSZWFkZXIuCi0JICovCi0JcHVibGljIFJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDU1NQcm9maWxlIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNTU1Byb2ZpbGVJbXBsIGluZm8gPSBudWxsOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJU3RyaW5nIHN0cklEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCVN0cmluZyBzdHJOQU1FID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotCQkJU3RyaW5nIHN0clVSSSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9VUkkpOwotCi0JCQlpZiAoc3RySUQgIT0gbnVsbCB8fCBzdHJVUkkgIT0gbnVsbCkgewotCQkJCUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0JCQkJYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoc3RyVVJJKTsKLQkJCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBwYXRoLCBudWxsKTsKLQkJCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXVybCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTCh1cmwpOwotCQkJCQkJCWluZm8gPSBuZXcgQ1NTUHJvZmlsZUltcGwoc3RySUQsIHVybCwgc3RyVVJJKTsKLQkJCQkJCQlpbmZvLnNldFByb2ZpbGVOYW1lKHN0ck5BTUUpOwotCQkJCQkJCWluZm8uc2V0RGVmYXVsdCgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFRkFVTFQpICE9IG51bGwpKTsKLQkJCQkJCQlpbmZvLnNldExvZ2dpbmcoKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MT0dHSU5HKSAhPSBudWxsKSk7Ci0JCQkJCQkJaW5mby5zZXRPd25lclBsdWdpbklEKHBsdWdpbklkKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyB0aHJvdWdoCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ1NTIFByb2ZpbGU6ICIgKyBzdHJJRCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBXZSBzaW1wbHkgcmVxdWlyZSBhbiAnYWRkJyBtZXRob2QsIG9mIHdoYXQgZXZlciBpdCBpcyB3ZSBhcmUgdG8gcmVhZAotCSAqIGludG8KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZW51bVByb2ZpbGVzKCkgewotCQlTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlDU1NQcm9maWxlIGluZm8gPSByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQkJLy8gbnVsbCBjYW4gYmUgcmV0dXJuZWQgaWYgdGhlcmUncyBhbiBlcnJvciByZWFkaW5nIHRoZQotCQkJCS8vIGVsZW1lbnQKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCXNldC5hZGQoaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzZXQuaXRlcmF0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9WYWx1ZUNvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1ZhbHVlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjQ3YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1ZhbHVlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxUcmF2ZXJzZXI7Ci0KLQotCi1jbGFzcyBWYWx1ZUNvbGxlY3RvciBleHRlbmRzIENTU01ldGFNb2RlbFRyYXZlcnNlciB7Ci0JcHVibGljIHZvaWQgYmVnaW4oQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJZk5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKENTU01NTm9kZSBub2RlKSB7Ci0JCXNob3J0IHJjID0gVFJBVl9DT05UOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9ERVNDUklQVE9SIHx8IHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfQ09OVEFJTkVSKSB7Ci0JCQkJcmMgPSBUUkFWX0NPTlQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZOb2Rlcy5jb250YWlucyhub2RlKSkgewotCQkJCQlmTm9kZXMuYWRkKG5vZGUpOwotCQkJCQlyYyA9IFRSQVZfUFJVTkU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBmTm9kZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQotCXByaXZhdGUgTGlzdCBmTm9kZXMgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1hNTFJlYWRlclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9YTUxSZWFkZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDMxOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1hNTFJlYWRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotCi0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotCi1jbGFzcyBYTUxSZWFkZXJVdGlsIHsKLQotCXN0YXRpYyBwdWJsaWMgWE1MUmVhZGVyIGNyZWF0ZVhNTFJlYWRlcihTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCkuZ2V0WE1MUmVhZGVyKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0NTU01vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjJhMzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0NTU01vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU01vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCS8qKgotCSAqIENTU0xvYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDU1NNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vZGVsTG9hZGVyI25ld01vZGVsKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ldyBDU1NNb2RlbEltcGwoKTsKLQkJLy8gbm93IGRvbmUgaW4gY3JlYXRlCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCS8vIG1vZGVsLnNldEZhY3RvcnlSZWdpc3RyeShkZWZhdWx0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjAwM2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvckNTUyBleHRlbmRzIEFic3RyYWN0TW9kZWxIYW5kbGVyIGltcGxlbWVudHMgSU1vZGVsSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckNTUygpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IENTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50VHlwZURlc2NyaXB0aW9uI2dldE1vZGVsTG9hZGVyKCkKLQkgKi8KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IENTU01vZGVsTG9hZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NSZWdpb25VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NSZWdpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTJiOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTUmVnaW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTUmVnaW9uVXRpbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWNsYXJhdGlvblZhbHVlVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogdGhlc2UgdHlwZSBjYW4gYmUgYmVnZ2luaW5nIG9mIHNlbGVjdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0b3JCZWdnaW5pbmdUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlY2xhcmF0aW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiB8fCBpc0RlY2xhcmF0aW9uVmFsdWVUeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUik7Ci0JfQotCi0JLyoqCi0JICogVGhlc2UgdHlwZXMgY29uc2lzdCBzZWxlY3RvciByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWxlY3RvclR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMTMzNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci0KLQotcHVibGljIGNsYXNzIENTU1NvdXJjZVBhcnNlciBpbXBsZW1lbnRzIFJlZ2lvblBhcnNlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TVFlMRVNIRUVUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMjsKLQotCXByaXZhdGUgbG9uZyBmU3RhcnRUaW1lOwotCXByaXZhdGUgbG9uZyBmU3RvcFRpbWU7Ci0JcHJpdmF0ZSBJQ1NTVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZXJNb2RlKGludCBtb2RlKSB7Ci0JCWludCBpbml0aWFsU3RhdGU7Ci0JCWludCBidWZzaXplOwotCQlzd2l0Y2ggKG1vZGUpIHsKLQkJCWNhc2UgTU9ERV9TVFlMRVNIRUVUIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuWVlJTklUSUFMOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT047Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9OT1JNQUw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVfREVDTEFSQVRJT05fVkFMVUUgOgotCQkJCWluaXRpYWxTdGF0ZSA9IENTU1Rva2VuaXplci5TVF9ERUNMQVJBVElPTl9QUkVfVkFMVUU7Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9TTUFMTDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybjsKLQkJfQotCQlpZiAoMCA8IGluaXRpYWxTdGF0ZSkgewotCQkJSUNTU1Rva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tlbml6ZXIoKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsU3RhdGUoaW5pdGlhbFN0YXRlKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsQnVmZmVyU2l6ZShidWZzaXplKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkbm9kZSA9IG51bGw7Ci0JCWlmIChoZWFkbm9kZSA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcucGVyZlRlc3QpIHsKLQkJCQlmU3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQloZWFkbm9kZSA9IHBhcnNlTm9kZXMoKTsKLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCWZTdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0tIGNyZWF0aW5nIG5vZGVzIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQgLS0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBUaW1lIHBhcnNlIGFuZCBpbml0IGFsbCByZWdpb25zOiAiICsgKGZTdG9wVGltZSAtIGZTdGFydFRpbWUpICsgIiAobXNlY3MpIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZm9yICIgKyBmUmVnaW9ucy5zaXplKCkgKyAiCi0JCQkJLy8gUmVnaW9ucyIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICBhbmQgIiArIF9jb3VudE5vZGVzKGhlYWRub2RlKSArICIgTm9kZXMiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVhZG5vZGU7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCWlmICghZ2V0VG9rZW5pemVyKCkuaXNFT0YoKSkgewotCQkJaGVhZE5vZGUgPSBnZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJCS8vIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBhcnNpbmcgaGFzIG5vdCBmaW5pc2hlZCIpOwotCQl9Ci0JCS8vIGZvciBtZW1vcnkgcmVjb3ZlcnksIHdlIGFzc3VtZSBpZiBzb21lb25lCi0JCS8vIHJlcXVlc3RzIGFsbCByZWdpb25zLCB3ZSBjYW4gcmVzZXQgb3VyIGJpZwotCQkvLyBtZW1vcnkgY29uc3VtaW5nIG9iamVjdHMKLQkJLy8gYnV0IHRoZSBuZXcgImdldFJlZ2lvbnMiIG1ldGhvZCBpcyB0aGVuIG1vcmUgZXhwZW5zaXZlLgotCQkvLyBJIGRvbid0IHRoaW5rIGl0cyB1c2VkIG11Y2gsIHRob3VnaC4KLQkJTGlzdCBsb2NhbFJlZ2lvbnNMaXN0ID0gZ2V0UmVnaW9ucyhoZWFkTm9kZSk7Ci0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gbG9jYWxSZWdpb25zTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0UmVnaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gaGVhZE5vZGUKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUpIHsKLQkJTGlzdCBhbGxSZWdpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gaGVhZE5vZGU7Ci0JCXdoaWxlIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMgPSBjdXJyZW50Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVSZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWxsUmVnaW9ucy5hZGQobm9kZVJlZ2lvbnMuZ2V0KGkpKTsKLQkJCX0KLQkJCWN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBhbGxSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcHJpbVJlc2V0KCk7Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KHJlYWRlciwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlciwgaW50IG9mZnNldCkgewotCQlyZXNldChyZWFkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCkgewotCQlyZXNldChuZXcgU3RyaW5nUmVhZGVyKGlucHV0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0LCBpbnQgb2Zmc2V0KSB7Ci0JCXJlc2V0KGlucHV0KTsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU1NvdXJjZVBhcnNlcigpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJzZU5vZGVzKCkgewotCQkvLyByZWdpb25zIGFyZSBpbml0aWFsbHkgcmVwb3J0ZWQgYXMgY29tcGxldGUgb2Zmc2V0cyB3aXRoaW4gdGhlCi0JCS8vIHNjYW5uZWQgaW5wdXQKLQkJLy8gdGhleSBhcmUgYWRqdXN0ZWQgaGVyZSB0byBiZSBpbmRleGVzIGZyb20gdGhlIGN1cnJlbnROb2RlJ3Mgc3RhcnQKLQkJLy8gb2Zmc2V0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJU3RyaW5nIGN1cnJlbnRSZWdpb25UeXBlID0gbnVsbDsKLQotCQl3aGlsZSAoKHJlZ2lvbiA9IGdldE5leHRSZWdpb24oKSkgIT0gbnVsbCkgewotCQkJdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAobXVzdEJlU3RhcnQodHlwZSwgY3VycmVudFJlZ2lvblR5cGUpICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQotCQkJaWYgKChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmlzRW5kZWQoKSkgfHwgY3VycmVudE5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmICFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCWxhc3ROb2RlID0gY3VycmVudE5vZGU7Ci0JCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJY3VycmVudFJlZ2lvblR5cGUgPSB0eXBlOwotCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJfQotCi0JCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQotCQkJaWYgKG11c3RCZUVuZCh0eXBlKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCi0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmICFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQl9Ci0KLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbih0eXBlKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdXN0QmVTdGFydChTdHJpbmcgdHlwZSwgU3RyaW5nIGRvY1JlZ2lvblR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgfHwgKGRvY1JlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHx8ICghQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZShkb2NSZWdpb25UeXBlKSAmJiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKSkpOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG11c3RCZUVuZChTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUik7Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBnZXROZXh0UmVnaW9uKCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVnaW9uID0gZ2V0VG9rZW5pemVyKCkuZ2V0TmV4dFRva2VuKCk7Ci0JCQkvLyBETVc6IDIvMTIvMDMgUmVtb3ZlZCBzdGF0ZQotCQkJLy8gaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmUmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCS8vIH0KLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5wdXQgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldFRva2VuaXplcigpLmdldE9mZnNldCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiBpbnB1dCBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0VG9rZW5pemVyKCkuZ2V0T2Zmc2V0KCkgKyAiICgiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgKyAiKSIsIGUpOyAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbVJlc2V0KCkgewotCi0JCWdldFRva2VuaXplcigpLnJlc2V0KG5ldyBjaGFyWzBdKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgSUNTU1Rva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgQ1NTVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGlzIGEgc2ltcGxlIHV0aWxpdHkgdG8gY291bnQgbm9kZXMuIFVzZWQgb25seSBmb3IgZGVidWcKLQkgKiBzdGF0ZW1lbnRzLgotCSAqLwotCXByaXZhdGUgaW50IF9jb3VudE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZXMpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gbm9kZXM7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJcmVzdWx0Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOWYyMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQllbHNlIHsKLQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjExNGM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1Rva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3MiArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQuMiBvbiA3LzE3LzA4IDE6MDkgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLkNTU1RleHRSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40LjIKLSAqIG9uIDcvMTcvMDggMTowOSBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5DU1NUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgQ1NTVG9rZW5pemVyIGltcGxlbWVudHMgQ1NTUmVnaW9uQ29udGV4dHMsIElDU1NUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSAxNjM4NDsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgPSAyNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSU1QT1JUX0RFTElNSVRFUiA9IDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUgPSAzODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1IgPSAyMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfQ0hBUlNFVF9ERUxJTUlURVIgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9WQUxVRSA9IDQwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9QQUdFX1BTRVVET19QQUdFID0gMTY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0lNUE9SVF9VUkkgPSA2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EID0gMzI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiA9IDI4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTiA9IDM0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9QQUdFX0RFTElNSVRFUiA9IDE4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAzMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfTUVESUFfTUVESVVNID0gMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0NIQVJTRVRfTkFNRSA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0lNUE9SVF9NRURJVU0gPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IgPSAzNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfRk9OVF9GQUNFX0RFTElNSVRFUiA9IDIwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9NRURJQV9ERUxJTUlURVIgPSAxNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfTU9ESUZJRVIgPSAyNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLQotICAvKioKLSAgICogWlpfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWlpfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAwLCAgMSwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsIAotICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICAwLCAgMCwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAKLSAgICAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOAotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDExXDBcMVwxMlwxXDE3XDFcMFwxXDRcMVwyMFwyMlwwXDFcNlwxXDMxXDFcMTEiKwotICAgICJcMVwyMVwxXDE2XDFcNzJcMVwxNlwxXDVcMVwyNVwxXDEzXDFcMzVcMVwxNVwxXDU1IisKLSAgICAiXDFcMTBcMVwxNFwxXDM0XDEyXDFcMVw2MlwxXDUwXDFcMzBcMVw2N1wxXDMyXDFcMjciKwotICAgICJcMVwzNlwxXDQzXDFcMjZcMVw0MFwxXDU3XDFcNDZcMVw2NFwxXDYxXDFcNDFcMVw1MSIrCi0gICAgIlwyXDJcMVwyNFwxXDUyXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDIzXDFcNDRcMVw0NyIrCi0gICAgIlwxXDIyXDVcMlwxXDY2XDFcM1wxXDcxXDFcMTZcMVwyXDFcMTZcMVw0MlwxXDciKwotICAgICJcMVwzN1wxXDU2XDFcNDVcMVw2M1wxXDYxXDFcNDFcMVw1MVwyXDJcMVwyNFwxXDUyIisKLSAgICAiXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDIzXDFcNDRcMVw0N1wxXDIyXDVcMlwxXDYwIisKLSAgICAiXDFcNzBcMVwzM1wxXDcwXDFcMFx1ZmY4MFwyIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcMjNcMFwxXDFcMVwyXDFcMVwxXDNcNFwxXDFcNFwxXDEiKwotICAgICJcMVw1XDFcMVwxXDZcMVw3XDNcMVwxXDEwXDNcMVwxXDExIisKLSAgICAiXDJcMVwxXDEyXDFcMTNcMlwxXDFcMTRcMVwxNVwxXDE2XDJcMSIrCi0gICAgIlwxXDE3XDFcMVwxXDNcMVwyMFwxXDIxXDFcMjJcMlwxXDFcMjMiKwotICAgICJcMVwxXDFcMjRcMVwyNVw0XDFcMVwyNlwyXDFcMVwyN1wxXDMwIisKLSAgICAiXDFcMzFcMVwzMlw0XDFcMVwzM1wzXDFcMVwzMlwxXDFcMlwzNCIrCi0gICAgIlwxXDNcMVwwXDFcMlwxXDBcMVwzNVwxXDBcMVwzNlwxMFwwIisKLSAgICAiXDFcNlw0XDBcMVwzN1w0XDBcMVw0MFw0XDBcMVwxMVwxXDAiKwotICAgICJcMVwxM1wxXDBcMVwxNlwxXDBcMVw0MVwxXDBcMVwyMlwxXDAiKwotICAgICJcMVwyNVwyXDBcMVwyNVwzXDBcMVwyNlwxXDQyXDNcMFwxXDQzIisKLSAgICAiXDFcMFwxXDMyXDFcNDRcMVwzMlwyXDBcMVw0NVwyXDBcMVwzMSIrCi0gICAgIlwxXDQ2XDJcMFwxXDMyXDJcMFwxXDQ3XDFcMlwxXDUwXDFcMzUiKwotICAgICJcMVwzNlwxMFwwXDFcNlwxXDBcMVwzN1wyXDBcMVwzN1wyXDAiKwotICAgICJcMVw0MFwyXDBcMVw0MFwyXDBcMVwxMVwxXDEzXDFcMTZcMVwyMiIrCi0gICAgIlwxXDI1XDFcMFwxXDI1XDJcMFwxXDI1XDFcMFwxXDI2XDFcNDIiKwotICAgICJcMVwzMlwxXDBcMVwzMlwxXDBcMVw0NVwyXDBcMVw0NVwxXDAiKwotICAgICJcMVw0NlwxXDUxXDFcMzJcMVwwXDFcMlwxXDM1XDFcMzZcMVw1MiIrCi0gICAgIlwxXDUzXDEwXDBcMVw2XDVcMFwxXDExXDFcMTNcMVwxNlwxXDIyIisKLSAgICAiXDFcMjVcMlwwXDFcMjZcMVw0MlwyXDMyXDJcMFwxXDQ2XDFcNTEiKwotICAgICJcMVwwXDFcNDRcMVwwXDFcMlwxXDM1XDFcMzZcM1wwXDFcNTQiKwotICAgICJcMlwwXDFcNlwxXDBcMVw2XDEwXDBcMVw1NVwxXDExXDFcMTMiKwotICAgICJcMVwxNlwxXDIyXDFcMjVcMlwwXDFcMjZcMVw0MlwyXDMyXDJcMCIrCi0gICAgIlwxXDQ2XDJcNTFcNVwwXDFcNTZcMVwwXDFcMlwxXDM1XDFcMzYiKwotICAgICJcMlwwXDFcNTdcMlwwXDFcNlw2XDBcMVw1NVwyXDBcMVwxMSIrCi0gICAgIlwxXDEzXDFcMTZcMVwyMlwxXDI1XDJcMFwxXDI2XDFcNDJcMlwzMiIrCi0gICAgIlwyXDBcMVw0NlwyXDUxXDJcMFwxXDU2XDNcMFwxXDJcMVwzNSIrCi0gICAgIlwxXDM2XDFcMFwxXDYwXDJcMFwxXDZcMTNcMFwxXDExXDFcMTMiKwotICAgICJcMVwxNlwxXDIyXDFcMjVcMlwwXDFcMjZcMVw0MlwyXDMyXDJcMCIrCi0gICAgIlwxXDQ2XDJcNTFcMTBcMFwxXDM1XDFcMzZcMVw2MVwyXDBcMVw2IisKLSAgICAiXDZcMFwxXDU1XDFcMFwxXDU1XDJcMFwxXDQyXDFcMzJcMlwwIisKLSAgICAiXDFcNDZcMlw1MVwyXDBcMVw1NlwxXDBcMVw1Nlw2XDBcMVwzMiIrCi0gICAgIlwxXDUxXDRcMFwxXDYyXDRcMFwxXDUxXDNcMFwxXDYzXDEyXDAiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0MzRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9ST1dNQVAgPSB6elVucGFja1Jvd01hcCgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9ST1dNQVBfUEFDS0VEXzAgPQotICAgICJcMFwwXDBcNzNcMFwxNjZcMFwyNjFcMFwzNTRcMFx1MDEyN1wwXHUwMTYyXDBcdTAxOWQiKwotICAgICJcMFx1MDFkOFwwXHUwMjEzXDBcdTAyNGVcMFx1MDI4OVwwXHUwMmM0XDBcdTAyZmZcMFx1MDMzYVwwXHUwMzc1IisKLSAgICAiXDBcdTAzYjBcMFx1MDNlYlwwXHUwNDI2XDBcdTA0NjFcMFx1MDQ5Y1wwXHUwNGQ3XDBcdTA1MTJcMFx1MDU0ZCIrCi0gICAgIlwwXHUwNTg4XDBcdTA1YzNcMFx1MDVmZVwwXHUwNDYxXDBcdTA2MzlcMFx1MDQ2MVwwXHUwNjc0XDBcdTA2YWYiKwotICAgICJcMFx1MDQ2MVwwXHUwNmVhXDBcdTA3MjVcMFx1MDc2MFwwXHUwNDYxXDBcdTA3OWJcMFx1MDdkNlwwXHUwODExIisKLSAgICAiXDBcdTA4NGNcMFx1MDg4N1wwXHUwOGMyXDBcdTA0NjFcMFx1MDhmZFwwXHUwOTM4XDBcdTA5NzNcMFx1MDQ2MSIrCi0gICAgIlwwXHUwNDYxXDBcdTA5YWVcMFx1MDllOVwwXHUwYTI0XDBcdTA0NjFcMFx1MGE1ZlwwXHUwYTlhXDBcdTA0NjEiKwotICAgICJcMFx1MDQ2MVwwXHUwYWQ1XDBcdTBiMTBcMFx1MGI0YlwwXHUwNDYxXDBcdTBiODZcMFx1MDQ2MVwwXHUwYmMxIisKLSAgICAiXDBcdTBiZmNcMFx1MGMzN1wwXHUwYzcyXDBcdTBjYWRcMFx1MGNlOFwwXHUwZDIzXDBcdTBkNWVcMFx1MDQ2MSIrCi0gICAgIlwwXHUwNDYxXDBcdTBkOTlcMFx1MGRkNFwwXHUwZTBmXDBcdTBlNGFcMFx1MGU4NVwwXHUwZWMwXDBcdTA0NjEiKwotICAgICJcMFx1MGVmYlwwXHUwZjM2XDBcdTBmNzFcMFx1MGZhY1wwXHUwZmU3XDBcdTA2MzlcMFx1MDQ2MVwwXHUxMDIyIisKLSAgICAiXDBcdTA0ZDdcMFx1MTA1ZFwwXHUxMDk4XDBcdTA1ODhcMFx1MTBkM1wwXHUwNWMzXDBcdTExMGVcMFx1MTE0OSIrCi0gICAgIlwwXHUxMTg0XDBcdTExYmZcMFx1MTFmYVwwXHUxMjM1XDBcdTEyNzBcMFx1MTJhYlwwXHUxMmU2XDBcdTEzMjEiKwotICAgICJcMFx1MTM1Y1wwXHUwNmVhXDBcdTEzOTdcMFx1MDQ2MVwwXHUwNzYwXDBcdTEzZDJcMFx1MDc5YlwwXHUxNDBkIisKLSAgICAiXDBcdTA0NjFcMFx1MDdkNlwwXHUxNDQ4XDBcdTE0ODNcMFx1MDg4N1wwXHUxNGJlXDBcdTA5MzhcMFx1MTRmOSIrCi0gICAgIlwwXHUwOWU5XDBcdTE1MzRcMFx1MTU2ZlwwXHUwNDYxXDBcdTBiMTBcMFx1MTVhYVwwXHUwYmZjXDBcdTE1ZTUiKwotICAgICJcMFx1MGMzN1wwXHUxNjIwXDBcdTA0NjFcMFx1MGNhZFwwXHUxNjViXDBcdTBkMjNcMFx1MTY5NlwwXHUxNmQxIisKLSAgICAiXDBcdTE3MGNcMFx1MTc0N1wwXHUwZWZiXDBcdTA0NjFcMFx1MGUwZlwwXHUxNzgyXDBcdTA0NjFcMFx1MTdiZCIrCi0gICAgIlwwXHUwZTRhXDBcdTE3ZjhcMFx1MDQ2MVwwXHUwZWMwXDBcdTE4MzNcMFx1MTg2ZVwwXHUwZjcxXDBcdTE4YTkiKwotICAgICJcMFx1MThlNFwwXHUxOTFmXDBcdTBmZTdcMFx1MTk1YVwwXHUwNDYxXDBcdTE5OTVcMFx1MDQ2MVwwXHUxOWQwIisKLSAgICAiXDBcdTFhMGJcMFx1MWE0NlwwXHUxYTgxXDBcdTFhYmNcMFx1MWFmN1wwXHUxYjMyXDBcdTFiNmRcMFx1MWJhOCIrCi0gICAgIlwwXHUxYmUzXDBcdTFjMWVcMFx1MWM1OVwwXHUwNmVhXDBcdTFjOTRcMFx1MWNjZlwwXHUwNzYwXDBcdTFkMGEiKwotICAgICJcMFx1MWQ0NVwwXHUwNzliXDBcdTFkODBcMFx1MWRiYlwwXHUwN2Q2XDBcdTFkZjZcMFx1MWUzMVwwXHUxZTZjIisKLSAgICAiXDBcdTFlYTdcMFx1MWVlMlwwXHUxZjFkXDBcdTFmNThcMFx1MWY5M1wwXHUwYzM3XDBcdTFmY2VcMFx1MjAwOSIrCi0gICAgIlwwXHUwY2FkXDBcdTIwNDRcMFx1MjA3ZlwwXHUyMGJhXDBcdTIwZjVcMFx1MjEzMFwwXHUyMTZiXDBcdTIxYTYiKwotICAgICJcMFx1MGU0YVwwXHUyMWUxXDBcdTIyMWNcMFx1MGVjMFwwXHUyMjU3XDBcdTIyOTJcMFx1MjJjZFwwXHUyMzA4IisKLSAgICAiXDBcdTIzNDNcMFx1MjM3ZVwwXHUyM2I5XDBcdTIzZjRcMFx1MDQ2MVwwXHUwNDYxXDBcdTI0MmZcMFx1MjQ2YSIrCi0gICAgIlwwXHUyNGE1XDBcdTI0ZTBcMFx1MjUxYlwwXHUyNTU2XDBcdTI1OTFcMFx1MjVjY1wwXHUyNjA3XDBcdTI2NDIiKwotICAgICJcMFx1MjY3ZFwwXHUyNmI4XDBcdTI2ZjNcMFx1MjcyZVwwXHUyNzY5XDBcdTI3YTRcMFx1MjdkZlwwXHUyODFhIisKLSAgICAiXDBcdTI4NTVcMFx1Mjg5MFwwXHUyOGNiXDBcdTI5MDZcMFx1Mjk0MVwwXHUyOTdjXDBcdTI5YjdcMFx1MjlmMiIrCi0gICAgIlwwXHUyYTJkXDBcdTJhNjhcMFx1MmFhM1wwXHUyYWRlXDBcdTJiMTlcMFx1MmI1NFwwXHUyYjhmXDBcdTJiY2EiKwotICAgICJcMFx1MmMwNVwwXHUyYzQwXDBcdTJjN2JcMFx1MmNiNlwwXHUwNDYxXDBcdTJjZjFcMFx1MmQyY1wwXHUwNDYxIisKLSAgICAiXDBcdTJkNjdcMFx1MmRhMlwwXHUyZGRkXDBcdTJlMThcMFx1MmU1M1wwXHUyZThlXDBcdTJlYzlcMFx1MmYwNCIrCi0gICAgIlwwXHUyZjNmXDBcdTJmN2FcMFx1MDQ2MVwwXHUyZmI1XDBcdTJmZjBcMFx1MzAyYlwwXHUzMDY2XDBcdTMwYTEiKwotICAgICJcMFx1MzBkY1wwXHUzMTE3XDBcdTMxNTJcMFx1MzE4ZFwwXHUzMWM4XDBcdTMyMDNcMFx1MzIzZVwwXHUzMjc5IisKLSAgICAiXDBcdTMyYjRcMFx1MzJlZlwwXHUzMzJhXDBcdTMzNjVcMFx1MzNhMFwwXHUyYjE5XDBcdTMzZGJcMFx1MzQxNiIrCi0gICAgIlwwXHUwNDYxXDBcdTM0NTFcMFx1MzQ4Y1wwXHUzNGM3XDBcdTM1MDJcMFx1MzUzZFwwXHUzNTc4XDBcdTA0NjEiKwotICAgICJcMFx1MzViM1wwXHUzNWVlXDBcdTM2MjlcMFx1MzY2NFwwXHUzNjlmXDBcdTM2ZGFcMFx1MzcxNVwwXHUzNzUwIisKLSAgICAiXDBcdTM3OGJcMFx1MmVjOVwwXHUzN2M2XDBcdTM4MDFcMFx1MzgzY1wwXHUzODc3XDBcdTM4YjJcMFx1MzhlZCIrCi0gICAgIlwwXHUzOTI4XDBcdTM5NjNcMFx1Mzk5ZVwwXHUzOWQ5XDBcdTNhMTRcMFx1M2E0ZlwwXHUzYThhXDBcdTNhYzUiKwotICAgICJcMFx1M2IwMFwwXHUzYjNiXDBcdTNiNzZcMFx1M2JiMVwwXHUzYmVjXDBcdTNjMjdcMFx1MzM2NVwwXHUzYzYyIisKLSAgICAiXDBcdTNjOWRcMFx1M2NkOFwwXHUzZDEzXDBcdTNkNGVcMFx1M2Q4OVwwXHUzZGM0XDBcdTA0NjFcMFx1M2RmZiIrCi0gICAgIlwwXHUzZTNhXDBcdTNlNzVcMFx1M2ViMFwwXHUzZWViXDBcdTNmMjZcMFx1M2Y2MVwwXHUzZjljXDBcdTNmZDciKwotICAgICJcMFx1NDAxMlwwXHU0MDRkXDBcdTQwODhcMFx1NDBjM1wwXHU0MGZlXDBcdTQxMzlcMFx1NDE3NFwwXHU0MWFmIisKLSAgICAiXDBcdTQxZWFcMFx1NDIyNVwwXHU0MjYwXDBcdTQyOWJcMFx1NDJkNlwwXHU0MzExXDBcdTQzNGNcMFx1NDM4NyIrCi0gICAgIlwwXHU0M2MyXDBcdTQzZmRcMFx1NDQzOFwwXHU0NDczXDBcdTQ0YWVcMFx1NDRlOVwwXHU0NTI0XDBcdTQ1NWYiKwotICAgICJcMFx1NDU5YVwwXHU0NWQ1XDBcdTQ2MTBcMFx1NDY0YlwwXHU0Njg2XDBcdTQ2YzFcMFx1NDZmY1wwXHUwNDYxIisKLSAgICAiXDBcdTQ3MzdcMFx1NDc3MlwwXHU0N2FkXDBcdTQ3ZThcMFx1NDgyM1wwXHU0ODVlXDBcdTQ4OTlcMFx1NDhkNCIrCi0gICAgIlwwXHU0OTBmXDBcdTJmM2ZcMFx1NDk0YVwwXHUyZjdhXDBcdTQ5ODVcMFx1NDljMFwwXHU0OWZiXDBcdTRhMzYiKwotICAgICJcMFx1NGE3MVwwXHU0YWFjXDBcdTRhZTdcMFx1NGIyMlwwXHU0YjVkXDBcdTRiOThcMFx1NGJkM1wwXHUzM2RiIisKLSAgICAiXDBcdTRjMGVcMFx1MzQxNlwwXHU0YzQ5XDBcdTRjODRcMFx1NGNiZlwwXHU0Y2ZhXDBcdTRkMzVcMFx1NGQ3MCIrCi0gICAgIlwwXHU0ZGFiXDBcdTRkZTZcMFx1NGUyMVwwXHU0ZTVjXDBcdTRlOTdcMFx1NGVkMlwwXHUwNDYxXDBcdTRmMGQiKwotICAgICJcMFx1NGY0OFwwXHU0ZjgzXDBcdTRmYmVcMFx1MDQ2MVwwXHU0ZmY5XDBcdTUwMzRcMFx1NTA2ZlwwXHUwNDYxIisKLSAgICAiXDBcdTUwYWFcMFx1NTBlNVwwXHU1MTIwXDBcdTUxNWJcMFx1NTE5NlwwXHU1MWQxXDBcdTUyMGNcMFx1NTI0NyIrCi0gICAgIlwwXHU1MjgyXDBcdTUyYmQiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja1Jvd01hcCgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0MzRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrUm93TWFwKFpaX1JPV01BUF9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tSb3dNYXAoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGhpZ2ggPSBwYWNrZWQuY2hhckF0KGkrKykgPDwgMTY7Ci0gICAgICByZXN1bHRbaisrXSA9IGhpZ2ggfCBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfVFJBTlMgPSB6elVucGFja1RyYW5zKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX1RSQU5TX1BBQ0tFRF8wID0KLSAgICAiXDJcMjRcMVwyNVwxXDI2XDFcMjdcMVwyNFwxXDI3XDFcMjVcMVwzMCIrCi0gICAgIlwxXDI0XDFcMjdcMVwyNFwxXDMxXDJcMjRcMlwyN1wxXDMyXDNcMjUiKwotICAgICJcMVwyNFwxXDI1XDFcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDM2IisKLSAgICAiXDFcMzdcMTFcMjVcMVwyNFw0XDI1XDFcMjRcMlwyNVwxXDI0XDFcMjUiKwotICAgICJcMVw0MFwzXDI1XDFcNDFcMTBcMjRcMVwyN1wxXDQyXDFcMjdcMVwyNCIrCi0gICAgIlwxXDQzXDFcNDRcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzXDJcMjQiKwotICAgICJcMVwzNFwxXDM1XDFcMjRcMVwzN1w0MFwyNFwxXDI3XDFcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjRcMlwyN1w3XDI0XDFcMzMiKwotICAgICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDI0XDFcNDVcMjZcMjQiKwotICAgICJcMVwyN1wxXDQ2XDFcMjdcMVwyNFwxXDQzXDFcNDdcMVwyN1w0XDI0IisKLSAgICAiXDJcMjdcMVwyNFwxXDUwXDVcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNSIrCi0gICAgIlwxXDI0XDFcMzdcMTFcMjRcMVw0NVwyNFwyNFwxXDUxXDFcNTJcMVwyNyIrCi0gICAgIlwxXDI0XDFcMjdcMVw1MVwxXDUzXDFcMjRcMVwyN1w0XDI0XDJcMjciKwotICAgICJcMVwyNFwzXDUxXDFcMjRcMVw1MVwxXDI0XDFcMzNcMlwyNFwxXDM0IisKLSAgICAiXDFcMzVcMVwyNFwxXDM3XDExXDUxXDFcNDVcNFw1MVwxXDI0XDJcNTEiKwotICAgICJcMVwyNFwxXDUxXDFcMjRcM1w1MVwxMVwyNFwxXDI3XDFcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjRcMlwyN1w3XDI0XDFcMzMiKwotICAgICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDI0XDFcNDVcNFwyNCIrCi0gICAgIlwxXDU0XDE3XDI0XDFcNTVcMVw1NlwxXDI3XDFcMjRcMVwyN1wxXDU1IisKLSAgICAiXDFcNTdcMVwyNFwxXDI3XDRcMjRcMlwyN1wxXDI0XDNcNTVcMVwyNCIrCi0gICAgIlwxXDU1XDFcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciKwotICAgICJcMTFcNTVcMVwyNFw0XDU1XDFcMjRcMlw1NVwxXDI0XDFcNTVcMVwyNCIrCi0gICAgIlwzXDU1XDExXDI0XDFcMjdcMVwyNFwxXDI3XDFcMjRcMVw0M1wxXDI0IisKLSAgICAiXDFcMjdcNFwyNFwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNSIrCi0gICAgIlwxXDI0XDFcMzdcMTZcMjRcMVw2MFwyXDI0XDFcNjFcMTRcMjRcMVw2MiIrCi0gICAgIlwxXDYzXDFcMjdcMVwyNFwxXDI3XDFcNjJcMVw2NFwxXDI0XDFcMjciKwotICAgICJcNFwyNFwyXDI3XDFcMjRcM1w2MlwxXDI0XDFcNjJcMVwyNFwxXDMzIisKLSAgICAiXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVw2MlwxXDI0XDRcNjIiKwotICAgICJcMVwyNFwyXDYyXDFcNjVcMVw2MlwxXDY2XDNcNjJcMTFcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcMjdcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0XDJcMjciKwotICAgICJcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wyMVwyNCIrCi0gICAgIlwxXDY1XDE2XDI0XDFcNjdcMVwyNFwxXDY3XDFcMjRcMVw0M1wxXDI0IisKLSAgICAiXDFcNjdcMVwyNFwxXDMxXDFcNzBcMVwyNFwyXDY3XDFcMzJcNlwyNCIrCi0gICAgIlwxXDMzXDFcMjRcMVw3MFwxXDM0XDFcMzVcMVwzNlwxXDM3XDE2XDI0IisKLSAgICAiXDFcNzFcMlwyNFwxXDY1XDFcMjRcMVw0MFwzXDI0XDFcNDFcNlwyNCIrCi0gICAgIlwxXDcyXDFcNzNcMVwyN1wxXDI0XDFcMjdcMVw3MlwxXDc0XDFcMjQiKwotICAgICJcMVwyN1w0XDI0XDJcMjdcMVwyNFwzXDcyXDFcMjRcMVw3MlwxXDI0IisKLSAgICAiXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDcyXDFcMjQiKwotICAgICJcNFw3MlwxXDI0XDJcNzJcMVwyNFwxXDcyXDFcMjRcM1w3MlwxMVwyNCIrCi0gICAgIlwxXDI3XDFcMjRcMVwyN1wxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjQiKwotICAgICJcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IisKLSAgICAiXDMwXDI0XDFcNzVcMVw3NlwxXDc3XDNcMjRcMVwxMDBcMVwxMDFcMVwyNyIrCi0gICAgIlwxXDEwMlwxXDI3XDFcMTAwXDFcMTAzXDFcMTA0XDFcMjdcNFwyNFwyXDI3IisKLSAgICAiXDFcMjRcM1wxMDBcMVwyNFwxXDEwMFwxXDI0XDFcMzNcMlwyNFwxXDM0IisKLSAgICAiXDFcMzVcMVwyNFwxXDM3XDExXDEwMFwxXDI0XDRcMTAwXDFcMjRcMlwxMDAiKwotICAgICJcMVwyNFwxXDEwMFwxXDI0XDNcMTAwXDExXDI0XDFcMjdcMVwyNFwxXDI3IisKLSAgICAiXDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNFwyXDI3XDdcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMzJcMjRcMVw3N1wzXDI0IisKLSAgICAiXDFcMTA1XDFcMTA2XDFcMjdcMVwyNFwxXDI3XDFcMTA1XDFcMTA3XDFcMjQiKwotICAgICJcMVwyN1w0XDI0XDJcMjdcMVwyNFwzXDEwNVwxXDI0XDFcMTA1XDFcMjQiKwotICAgICJcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcMTA1XDFcMTEwIisKLSAgICAiXDRcMTA1XDFcMjRcMlwxMDVcMVwyNFwxXDEwNVwxXDI0XDNcMTA1XDExXDI0IisKLSAgICAiXDFcMjdcMVwyNFwxXDI3XDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNCIrCi0gICAgIlwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciKwotICAgICJcMTFcMjRcMVwxMTBcMTFcMjRcMVwxMTFcMTFcMjRcMVwxMTJcMVwxMTNcMVwxMTQiKwotICAgICJcMVwyN1wxXDExNVwxXDI3XDFcMTEzXDFcMTE2XDFcMTE3XDFcMjdcMVwxMjAiKwotICAgICJcMVwxMjFcMVwxMjJcMVwyNFwyXDI3XDFcMTIzXDFcMTI0XDJcMTEzXDFcMjQiKwotICAgICJcMVwxMTNcMVwyNFwxXDMzXDFcMTI1XDFcMjRcMVwzNFwxXDEyNlwxXDI0IisKLSAgICAiXDFcMzdcMTFcMTEzXDFcMTEwXDRcMTEzXDFcMTI3XDJcMTEzXDFcMjRcMVwxMTMiKwotICAgICJcMVwyNFwzXDExM1w2XDI0XDFcMTEyXDFcMTEzXDFcMTE0XDFcMTMwXDFcMTE1IisKLSAgICAiXDFcMTMwXDFcMTEzXDFcMTE2XDFcMTE3XDFcMTMwXDFcMTIwXDFcMTIxXDFcMTIyIisKLSAgICAiXDFcMjRcMlwxMzBcMVwxMjNcMVwxMjRcMlwxMTNcMVwyNFwxXDExM1wxXDI0IisKLSAgICAiXDFcMzNcMVwxMjVcMVwyNFwxXDM0XDFcMTI2XDFcMjRcMVwzN1wxMVwxMTMiKwotICAgICJcMVwxMTBcNFwxMTNcMVwxMjdcMlwxMTNcMVwyNFwxXDExM1wxXDI0XDNcMTEzIisKLSAgICAiXDVcMjRcNzRcMFwyXDI1XDFcMTMxXDNcMFwyXDI1XDExXDBcM1wyNSIrCi0gICAgIlwxXDBcMVwyNVwxMFwwXDExXDI1XDFcMFw0XDI1XDFcMFwyXDI1IisKLSAgICAiXDFcMFwxXDI1XDFcMFwzXDI1XDZcMFwxXDEzMlwyXDI1XDFcMCIrCi0gICAgIlwyXDI1XDFcMTMyXDJcMjVcMVwwXDRcMjVcMlwwXDE2XDI1XDFcMTMyIisKLSAgICAiXDJcMjVcMVwxMzJcMlwyNVwxXDEzMlwxMFwyNVwxXDEzMlw0XDI1XDFcMTMyIisKLSAgICAiXDdcMjVcNFwwXDFcMjdcMVwwXDFcMjdcM1wwXDFcMjdcNFwwIisKLSAgICAiXDJcMjdcNTRcMFwxXDI1XDFcMTMxXDNcMFwxXDI1XDFcMTMzXDExXDAiKwotICAgICJcM1wyNVwxXDBcMVwyNVwxMFwwXDExXDI1XDFcMFw0XDI1XDFcMCIrCi0gICAgIlwyXDI1XDFcMFwxXDI1XDFcMFwzXDI1XDZcMFwyXDEzNFwxXDEzNSIrCi0gICAgIlwzXDBcMlwxMzRcMTFcMFwzXDEzNFwxXDBcMVwxMzRcMTBcMFwxMVwxMzQiKwotICAgICJcMVwwXDRcMTM0XDFcMFwyXDEzNFwxXDBcMVwxMzRcMVwwXDNcMTM0IisKLSAgICAiXDZcMFwyXDEzNlwxXDEzN1wzXDBcMlwxMzZcMTFcMFwzXDEzNlwxXDAiKwotICAgICJcMVwxMzZcMTBcMFwxMVwxMzZcMVwwXDRcMTM2XDFcMFwyXDEzNlwxXDAiKwotICAgICJcMVwxMzZcMVwwXDNcMTM2XDM2XDBcMVwxNDBcNzZcMFwxXDE0MVw3NFwwIisKLSAgICAiXDJcMTQyXDEwXDBcMVwxNDNcMVwxNDRcMVwxNDVcN1wwXDJcMTQ2XDEwXDAiKwotICAgICJcMVwxNDdcMVwxNTBcM1wwXDFcMTQ3XDFcMTUxXDExXDBcM1wxNDdcMVwwIisKLSAgICAiXDFcMTQ3XDEwXDBcMTFcMTQ3XDFcMFw0XDE0N1wxXDBcMlwxNDdcMVwwIisKLSAgICAiXDFcMTQ3XDFcMFwzXDE0N1w2XDBcMlwxNTJcMVwxNTNcMVwwXDFcMTU0IisKLSAgICAiXDExXDE1MlwyXDBcNTJcMTUyXDEwXDBcMVwxMzNcNjNcMFwyXDE1NVwxXDE1NiIrCi0gICAgIlwxXDBcNFwxNTVcMVwxNTRcNVwxNTVcMlwwXDUyXDE1NVwxXDBcMlwxNTciKwotICAgICJcMVwxNjBcMVwwXDFcMTYxXDExXDE1N1wyXDBcNTJcMTU3XDFcMFwyXDE2MiIrCi0gICAgIlwxXDE2M1wxXDBcNFwxNjJcMVwxNjFcNVwxNjJcMlwwXDUyXDE2MlwyM1wwIisKLSAgICAiXDFcMTY0XDUwXDBcMlw1MVwxXDE2NVwzXDBcMlw1MVwxMVwwXDNcNTEiKwotICAgICJcMVwwXDFcNTFcMTBcMFwxMVw1MVwxXDBcNFw1MVwxXDBcMlw1MSIrCi0gICAgIlwxXDBcMVw1MVwxXDBcM1w1MVw2XDBcMVwxNjZcMlw1MVwxXDAiKwotICAgICJcMlw1MVwxXDE2NlwyXDUxXDFcMFw0XDUxXDJcMFwxNlw1MVwxXDE2NiIrCi0gICAgIlwyXDUxXDFcMTY2XDJcNTFcMVwxNjZcMTBcNTFcMVwxNjZcNFw1MVwxXDE2NiIrCi0gICAgIlw3XDUxXDJcMFwxXDUxXDFcMTY1XDNcMFwxXDUxXDFcMTMzXDExXDAiKwotICAgICJcM1w1MVwxXDBcMVw1MVwxMFwwXDExXDUxXDFcMFw0XDUxXDFcMCIrCi0gICAgIlwyXDUxXDFcMFwxXDUxXDFcMFwzXDUxXDZcMFwyXDU1XDFcMTY3IisKLSAgICAiXDNcMFwyXDU1XDExXDBcM1w1NVwxXDBcMVw1NVwxMFwwXDExXDU1IisKLSAgICAiXDFcMFw0XDU1XDFcMFwyXDU1XDFcMFwxXDU1XDFcMFwzXDU1IisKLSAgICAiXDZcMFwxXDE3MFwyXDU1XDFcMFwyXDU1XDFcMTcwXDJcNTVcMVwwIisKLSAgICAiXDRcNTVcMlwwXDE2XDU1XDFcMTcwXDJcNTVcMVwxNzBcMlw1NVwxXDE3MCIrCi0gICAgIlwxMFw1NVwxXDE3MFw0XDU1XDFcMTcwXDdcNTVcMlwwXDFcNTVcMVwxNjciKwotICAgICJcM1wwXDFcNTVcMVwxMzNcMTFcMFwzXDU1XDFcMFwxXDU1XDEwXDAiKwotICAgICJcMTFcNTVcMVwwXDRcNTVcMVwwXDJcNTVcMVwwXDFcNTVcMVwwIisKLSAgICAiXDNcNTVcNlwwXDJcNjJcMVwxNzFcM1wwXDJcNjJcMTFcMFwzXDYyIisKLSAgICAiXDFcMFwxXDYyXDEwXDBcMTFcNjJcMVwwXDRcNjJcMVwwXDJcNjIiKwotICAgICJcMVwwXDFcNjJcMVwwXDNcNjJcNlwwXDFcMTcyXDJcNjJcMVwwIisKLSAgICAiXDJcNjJcMVwxNzJcMlw2MlwxXDBcNFw2MlwyXDBcMTZcNjJcMVwxNzIiKwotICAgICJcMlw2MlwxXDE3MlwyXDYyXDFcMTcyXDEwXDYyXDFcMTcyXDRcNjJcMVwxNzIiKwotICAgICJcN1w2MlwyXDBcMVw2MlwxXDE3MVwzXDBcMVw2MlwxXDEzM1wxMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMTBcMFwxMVw2MlwxXDBcNFw2MlwxXDAiKwotICAgICJcMlw2MlwxXDBcMVw2MlwxXDBcM1w2Mlw3XDBcMVw2MlwxXDE3MSIrCi0gICAgIlwzXDBcMVw2MlwxXDE3M1wxMVwwXDNcNjJcMVwwXDFcNjJcMTBcMCIrCi0gICAgIlwxMVw2MlwxXDBcNFw2MlwxXDBcMlw2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcM1w2Mlw1XDBcNFwxNzRcMVw2N1wxXDE3NFwxXDY3XDNcMTc0XDFcNjciKwotICAgICJcMlwxNzRcMVwwXDFcMTc0XDJcNjdcMTFcMTc0XDFcMFwxXDE3NFwxXDAiKwotICAgICJcMjBcMTc0XDFcMFwyXDE3NFwxXDBcMTJcMTc0XDFcMFwyXDcyXDFcMTc1IisKLSAgICAiXDNcMFwyXDcyXDExXDBcM1w3MlwxXDBcMVw3MlwxMFwwXDExXDcyIisKLSAgICAiXDFcMFw0XDcyXDFcMFwyXDcyXDFcMFwxXDcyXDFcMFwzXDcyIisKLSAgICAiXDZcMFwxXDE3NlwyXDcyXDFcMFwyXDcyXDFcMTc2XDJcNzJcMVwwIisKLSAgICAiXDRcNzJcMlwwXDE2XDcyXDFcMTc2XDJcNzJcMVwxNzZcMlw3MlwxXDE3NiIrCi0gICAgIlwxMFw3MlwxXDE3Nlw0XDcyXDFcMTc2XDdcNzJcMlwwXDFcNzJcMVwxNzUiKwotICAgICJcM1wwXDFcNzJcMVwxMzNcMTFcMFwzXDcyXDFcMFwxXDcyXDEwXDAiKwotICAgICJcMTFcNzJcMVwwXDRcNzJcMVwwXDJcNzJcMVwwXDFcNzJcMVwwIisKLSAgICAiXDNcNzJcNzRcMFwxXDc1XDRcMFwyXDEwMFwxXDE3N1wzXDBcMlwxMDAiKwotICAgICJcMTFcMFwzXDEwMFwxXDBcMVwxMDBcMTBcMFwxMVwxMDBcMVwwXDRcMTAwIisKLSAgICAiXDFcMFwyXDEwMFwxXDBcMVwxMDBcMVwwXDNcMTAwXDZcMFwxXDIwMCIrCi0gICAgIlwyXDEwMFwxXDBcMlwxMDBcMVwyMDBcMlwxMDBcMVwwXDRcMTAwXDJcMCIrCi0gICAgIlwxNlwxMDBcMVwyMDBcMlwxMDBcMVwyMDBcMlwxMDBcMVwyMDBcMTBcMTAwXDFcMjAwIisKLSAgICAiXDRcMTAwXDFcMjAwXDdcMTAwXDFcMFwyXDIwMVwxXDIwMlwxXDBcMVwyMDMiKwotICAgICJcMTFcMjAxXDJcMFw1MlwyMDFcMlwwXDFcMTAwXDFcMTc3XDNcMFwxXDEwMCIrCi0gICAgIlwxXDEzM1wxMVwwXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDExXDEwMFwxXDAiKwotICAgICJcNFwxMDBcMVwwXDJcMTAwXDFcMFwxXDEwMFwxXDBcM1wxMDBcNlwwIisKLSAgICAiXDJcMjA0XDFcMjA1XDFcMFw0XDIwNFwxXDIwM1w1XDIwNFwyXDBcNTJcMjA0IisKLSAgICAiXDFcMFwyXDEwNVwxXDIwNlwzXDBcMlwxMDVcMTFcMFwzXDEwNVwxXDAiKwotICAgICJcMVwxMDVcMTBcMFwxMVwxMDVcMVwwXDRcMTA1XDFcMFwyXDEwNVwxXDAiKwotICAgICJcMVwxMDVcMVwwXDNcMTA1XDZcMFwxXDIwN1wyXDEwNVwxXDBcMlwxMDUiKwotICAgICJcMVwyMDdcMlwxMDVcMVwwXDRcMTA1XDJcMFwxNlwxMDVcMVwyMDdcMlwxMDUiKwotICAgICJcMVwyMDdcMlwxMDVcMVwyMDdcMTBcMTA1XDFcMjA3XDRcMTA1XDFcMjA3XDdcMTA1IisKLSAgICAiXDJcMFwxXDEwNVwxXDIwNlwzXDBcMVwxMDVcMVwxMzNcMTFcMFwzXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcMTBcMFwxMVwxMDVcMVwwXDRcMTA1XDFcMFwyXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcMVwwXDNcMTA1XDZcMFwxXDExMlwxXDIxMFwxXDIxMSIrCi0gICAgIlwzXDBcMVwyMTBcMVwyMTJcM1wwXDFcMjEzXDVcMFwzXDIxMFwxXDAiKwotICAgICJcMVwyMTBcMTBcMFwxMVwyMTBcMVwwXDRcMjEwXDFcMFwyXDIxMFwxXDAiKwotICAgICJcMVwyMTBcMVwwXDNcMjEwXDRcMFwxXDIxNFwxXDBcMlwxMTNcMVwyMTUiKwotICAgICJcM1wwXDJcMTEzXDNcMFwxXDIxNlw1XDBcM1wxMTNcMVwyMTdcMVwxMTMiKwotICAgICJcMTBcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMFwyXDExM1wxXDBcMVwxMTMiKwotICAgICJcMVwwXDNcMTEzXDZcMFwxXDIyMFwyXDExM1wxXDBcMlwxMTNcMVwyMjAiKwotICAgICJcMlwxMTNcMVwwXDRcMTEzXDJcMFwxNlwxMTNcMVwyMjBcMlwxMTNcMVwyMjAiKwotICAgICJcMlwxMTNcMVwyMjBcMTBcMTEzXDFcMjIwXDRcMTEzXDFcMjIwXDdcMTEzXDFcMCIrCi0gICAgIlwyXDIyMVwxXDIyMlwxXDBcMVwyMjNcMTFcMjIxXDJcMFw1MlwyMjFcMVwwIisKLSAgICAiXDFcMTEyXDFcMTEzXDFcMjE1XDNcMFwxXDExM1wxXDEzM1wzXDBcMVwyMTMiKwotICAgICJcNVwwXDNcMTEzXDFcMFwxXDExM1wxMFwwXDExXDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTNcNlwwXDJcMjI0IisKLSAgICAiXDFcMjI1XDFcMFw0XDIyNFwxXDIyM1w1XDIyNFwyXDBcNTJcMjI0XDFcMCIrCi0gICAgIlwxXDIyNlw3MlwwXDFcMTEyXDEyXDBcMVwyMTNcNTdcMFwyXDIyN1wxXDIzMCIrCi0gICAgIlwzXDBcMlwyMjdcMTFcMFwzXDIyN1wxXDBcMVwyMjdcMTBcMFwxMVwyMjciKwotICAgICJcMVwwXDRcMjI3XDFcMFwyXDIyN1wxXDBcMVwyMjdcMVwwXDNcMjI3IisKLSAgICAiXDZcMFwyXDExM1wxXDIxNVwzXDBcMlwxMTNcM1wwXDFcMjE2XDFcMjMxIisKLSAgICAiXDRcMFwxXDExM1wxXDIzMlwxXDExM1wxXDIxN1wxXDExM1wxMFwwXDExXDExMyIrCi0gICAgIlwxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTMiKwotICAgICJcMTFcMFwxXDIzM1wxXDBcMVwyMzNcM1wwXDFcMjMzXDRcMFwyXDIzMyIrCi0gICAgIlwzMFwwXDFcMjM0XDIxXDBcNFwyMzVcMVwxMzBcMVwyMzVcMVwxMzBcM1wyMzUiKwotICAgICJcMVwxMzBcNFwyMzVcMlwxMzBcMTJcMjM1XDFcMFwxNFwyMzVcMVwwXDIyXDIzNSIrCi0gICAgIlwxXDBcMVwyMzZcMVwyNVwxXDEzMVwxXDI1XDFcMFwxXDI1XDFcMjM2IisKLSAgICAiXDFcMjVcMVwwXDFcMjVcNFwwXDJcMjVcMVwwXDNcMjVcMVwwIisKLSAgICAiXDFcMjVcMTBcMFwxXDIzNlwyXDI1XDFcMjM2XDJcMjVcMVwyMzZcMlwyNSIrCi0gICAgIlwxXDBcNFwyNVwxXDBcMVwyMzZcMVwyNVwxXDBcMVwyNVwxXDAiKwotICAgICJcMVwyMzZcMlwyNVwzN1wwXDFcMjM3XDQxXDBcMVwyNDBcMlwxMzRcMVwwIisKLSAgICAiXDJcMTM0XDFcMjQwXDJcMTM0XDFcMFw0XDEzNFwyXDBcMTZcMTM0XDFcMjQwIisKLSAgICAiXDJcMTM0XDFcMjQwXDJcMTM0XDFcMjQwXDEwXDEzNFwxXDI0MFw0XDEzNFwxXDI0MCIrCi0gICAgIlw3XDEzNFwxXDBcMVwyNDFcMlwxMzZcMVwwXDJcMTM2XDFcMjQxXDJcMTM2IisKLSAgICAiXDFcMFw0XDEzNlwyXDBcMTZcMTM2XDFcMjQxXDJcMTM2XDFcMjQxXDJcMTM2IisKLSAgICAiXDFcMjQxXDEwXDEzNlwxXDI0MVw0XDEzNlwxXDI0MVw3XDEzNlwxMFwwXDFcMjQyIisKLSAgICAiXDYyXDBcMzVcMTQxXDFcMjQzXDM1XDE0MVw0MVwwXDFcMjQ0XDEwM1wwXDFcMjQ1IisKLSAgICAiXDY1XDBcMlwyNDZcNjZcMFwyXDI0N1wxMDNcMFwxXDI1MFwxN1wwXDJcMTQ3IisKLSAgICAiXDFcMTUwXDNcMFwyXDE0N1wxMVwwXDNcMTQ3XDFcMjUxXDFcMTQ3XDEwXDAiKwotICAgICJcMTFcMTQ3XDFcMFw0XDE0N1wxXDBcMlwxNDdcMVwwXDFcMTQ3XDFcMCIrCi0gICAgIlwzXDE0N1w2XDBcMVwyNTJcMlwxNDdcMVwwXDJcMTQ3XDFcMjUyXDJcMTQ3IisKLSAgICAiXDFcMFw0XDE0N1wyXDBcMTZcMTQ3XDFcMjUyXDJcMTQ3XDFcMjUyXDJcMTQ3IisKLSAgICAiXDFcMjUyXDEwXDE0N1wxXDI1Mlw0XDE0N1wxXDI1Mlw3XDE0N1wyXDBcMVwxNDciKwotICAgICJcMVwxNTBcM1wwXDFcMTQ3XDEyXDBcM1wxNDdcMVwwXDFcMTQ3XDEwXDAiKwotICAgICJcMTFcMTQ3XDFcMFw0XDE0N1wxXDBcMlwxNDdcMVwwXDFcMTQ3XDFcMCIrCi0gICAgIlwzXDE0N1w2XDBcMVwyNTNcMVwxNTJcMVwxNTNcMVwxNTJcMVwyNTRcMVwxNTIiKwotICAgICJcMVwyNTNcMTBcMTUyXDFcMjU1XDE2XDE1MlwxXDI1M1wyXDE1MlwxXDI1M1wyXDE1MiIrCi0gICAgIlwxXDI1M1wxMFwxNTJcMVwyNTNcNFwxNTJcMVwyNTNcN1wxNTJcMVwwXDFcMjU2IisKLSAgICAiXDFcMTU1XDFcMTU2XDNcMTU1XDFcMjU2XDFcMTU1XDFcMjU3XDZcMTU1XDFcMjYwIisKLSAgICAiXDE2XDE1NVwxXDI1NlwyXDE1NVwxXDI1NlwyXDE1NVwxXDI1NlwxMFwxNTVcMVwyNTYiKwotICAgICJcNFwxNTVcMVwyNTZcN1wxNTVcMVwwXDFcMjYxXDFcMTU3XDFcMTYwXDFcMTU3IisKLSAgICAiXDFcMjYyXDFcMTU3XDFcMjYxXDEwXDE1N1wxXDI2M1wxNlwxNTdcMVwyNjFcMlwxNTciKwotICAgICJcMVwyNjFcMlwxNTdcMVwyNjFcMTBcMTU3XDFcMjYxXDRcMTU3XDFcMjYxXDdcMTU3IisKLSAgICAiXDFcMFwxXDI2NFwxXDE2MlwxXDE2M1wzXDE2MlwxXDI2NFwxXDE2MlwxXDI2NSIrCi0gICAgIlw2XDE2MlwxXDI2NlwxNlwxNjJcMVwyNjRcMlwxNjJcMVwyNjRcMlwxNjJcMVwyNjQiKwotICAgICJcMTBcMTYyXDFcMjY0XDRcMTYyXDFcMjY0XDdcMTYyXDI0XDBcMVwyNjdcNDdcMCIrCi0gICAgIlwxXDI3MFwxXDUxXDFcMTY1XDFcNTFcMVwwXDFcNTFcMVwyNzBcMVw1MSIrCi0gICAgIlwxXDBcMVw1MVw0XDBcMlw1MVwxXDBcM1w1MVwxXDBcMVw1MSIrCi0gICAgIlwxMFwwXDFcMjcwXDJcNTFcMVwyNzBcMlw1MVwxXDI3MFwyXDUxXDFcMCIrCi0gICAgIlw0XDUxXDFcMFwxXDI3MFwxXDUxXDFcMFwxXDUxXDFcMFwxXDI3MCIrCi0gICAgIlwyXDUxXDZcMFwxXDI3MVwxXDU1XDFcMTY3XDFcNTVcMVwwXDFcNTUiKwotICAgICJcMVwyNzFcMVw1NVwxXDBcMVw1NVw0XDBcMlw1NVwxXDBcM1w1NSIrCi0gICAgIlwxXDBcMVw1NVwxMFwwXDFcMjcxXDJcNTVcMVwyNzFcMlw1NVwxXDI3MSIrCi0gICAgIlwyXDU1XDFcMFw0XDU1XDFcMFwxXDI3MVwxXDU1XDFcMFwxXDU1IisKLSAgICAiXDFcMFwxXDI3MVwyXDU1XDZcMFwxXDI3MlwxXDYyXDFcMTcxXDFcNjIiKwotICAgICJcMVwwXDFcNjJcMVwyNzJcMVw2MlwxXDBcMVw2Mlw0XDBcMlw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxMFwwXDFcMjcyXDJcNjJcMVwyNzIiKwotICAgICJcMlw2MlwxXDI3MlwyXDYyXDFcMFw0XDYyXDFcMFwxXDI3MlwxXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwxXDI3MlwyXDYyXDdcMFwxXDYyXDFcMTcxIisKLSAgICAiXDNcMFwxXDYyXDEyXDBcM1w2MlwxXDBcMVw2MlwxMFwwXDExXDYyIisKLSAgICAiXDFcMFw0XDYyXDFcMFwyXDYyXDFcMFwxXDYyXDFcMFwzXDYyIisKLSAgICAiXDZcMFwxXDI3M1wxXDcyXDFcMTc1XDFcNzJcMVwwXDFcNzJcMVwyNzMiKwotICAgICJcMVw3MlwxXDBcMVw3Mlw0XDBcMlw3MlwxXDBcM1w3MlwxXDAiKwotICAgICJcMVw3MlwxMFwwXDFcMjczXDJcNzJcMVwyNzNcMlw3MlwxXDI3M1wyXDcyIisKLSAgICAiXDFcMFw0XDcyXDFcMFwxXDI3M1wxXDcyXDFcMFwxXDcyXDFcMCIrCi0gICAgIlwxXDI3M1wyXDcyXDZcMFwxXDI3NFwxXDEwMFwxXDE3N1wxXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMVwyNzRcMVwxMDBcMVwwXDFcMTAwXDRcMFwyXDEwMFwxXDAiKwotICAgICJcM1wxMDBcMVwwXDFcMTAwXDEwXDBcMVwyNzRcMlwxMDBcMVwyNzRcMlwxMDAiKwotICAgICJcMVwyNzRcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXDI3NFwxXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMVwwXDFcMjc0XDJcMTAwXDZcMFwxXDI3NVwxXDIwMVwxXDIwMiIrCi0gICAgIlwxXDIwMVwxXDI3NlwxXDIwMVwxXDI3NVwxMFwyMDFcMVwyNzdcMTZcMjAxXDFcMjc1IisKLSAgICAiXDJcMjAxXDFcMjc1XDJcMjAxXDFcMjc1XDEwXDIwMVwxXDI3NVw0XDIwMVwxXDI3NSIrCi0gICAgIlw3XDIwMVwxXDBcMVwzMDBcMVwyMDRcMVwyMDVcM1wyMDRcMVwzMDBcMVwyMDQiKwotICAgICJcMVwzMDFcNlwyMDRcMVwzMDJcMTZcMjA0XDFcMzAwXDJcMjA0XDFcMzAwXDJcMjA0IisKLSAgICAiXDFcMzAwXDEwXDIwNFwxXDMwMFw0XDIwNFwxXDMwMFw3XDIwNFwxXDBcMVwzMDMiKwotICAgICJcMVwxMDVcMVwyMDZcMVwxMDVcMVwwXDFcMTA1XDFcMzAzXDFcMTA1XDFcMCIrCi0gICAgIlwxXDEwNVw0XDBcMlwxMDVcMVwwXDNcMTA1XDFcMFwxXDEwNVwxMFwwIisKLSAgICAiXDFcMzAzXDJcMTA1XDFcMzAzXDJcMTA1XDFcMzAzXDJcMTA1XDFcMFw0XDEwNSIrCi0gICAgIlwxXDBcMVwzMDNcMVwxMDVcMVwwXDFcMTA1XDFcMFwxXDMwM1wyXDEwNSIrCi0gICAgIlw2XDBcMlwyMTBcMVwyMTFcM1wwXDJcMjEwXDExXDBcM1wyMTBcMVwwIisKLSAgICAiXDFcMjEwXDEwXDBcMTFcMjEwXDFcMFw0XDIxMFwxXDBcMlwyMTBcMVwwIisKLSAgICAiXDFcMjEwXDFcMFwzXDIxMFw2XDBcMVwzMDRcMlwyMTBcMVwwXDJcMjEwIisKLSAgICAiXDFcMzA0XDJcMjEwXDFcMFw0XDIxMFwyXDBcMTZcMjEwXDFcMzA0XDJcMjEwIisKLSAgICAiXDFcMzA0XDJcMjEwXDFcMzA0XDEwXDIxMFwxXDMwNFw0XDIxMFwxXDMwNFw3XDIxMCIrCi0gICAgIlwyXDBcMVwyMTBcMVwyMTFcM1wwXDFcMjEwXDEyXDBcM1wyMTBcMVwwIisKLSAgICAiXDFcMjEwXDEwXDBcMTFcMjEwXDFcMFw0XDIxMFwxXDBcMlwyMTBcMVwwIisKLSAgICAiXDFcMjEwXDFcMFwzXDIxMFw2XDBcMlwzMDVcMVwzMDZcM1wwXDJcMzA1IisKLSAgICAiXDExXDBcM1wzMDVcMVwwXDFcMzA1XDEwXDBcMTFcMzA1XDFcMFw0XDMwNSIrCi0gICAgIlwxXDBcMlwzMDVcMVwwXDFcMzA1XDFcMFwzXDMwNVw2XDBcMVwzMDciKwotICAgICJcMVwxMTNcMVwyMTVcMVwxMTNcMVwwXDFcMTEzXDFcMzA3XDFcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcMVwyMTZcMlwwXDJcMTEzXDFcMFwzXDExM1wxXDIxNyIrCi0gICAgIlwxXDExM1wxMFwwXDFcMzA3XDJcMTEzXDFcMzA3XDJcMTEzXDFcMzA3XDJcMTEzIisKLSAgICAiXDFcMFw0XDExM1wxXDBcMVwzMDdcMVwxMTNcMVwwXDFcMTEzXDFcMCIrCi0gICAgIlwxXDMwN1wyXDExM1w2XDBcMVwzMTBcMVwyMjFcMVwyMjJcMVwyMjFcMVwzMTEiKwotICAgICJcMVwyMjFcMVwzMTBcMTBcMjIxXDFcMzEyXDE2XDIyMVwxXDMxMFwyXDIyMVwxXDMxMCIrCi0gICAgIlwyXDIyMVwxXDMxMFwxMFwyMjFcMVwzMTBcNFwyMjFcMVwzMTBcN1wyMjFcMVwwIisKLSAgICAiXDFcMzEzXDFcMjI0XDFcMjI1XDNcMjI0XDFcMzEzXDFcMjI0XDFcMzE0XDZcMjI0IisKLSAgICAiXDFcMzE1XDE2XDIyNFwxXDMxM1wyXDIyNFwxXDMxM1wyXDIyNFwxXDMxM1wxMFwyMjQiKwotICAgICJcMVwzMTNcNFwyMjRcMVwzMTNcN1wyMjRcMVwwXDFcMjI2XDFcMjEwXDFcMjExIisKLSAgICAiXDNcMFwxXDIxMFwxXDIxMlwxMVwwXDNcMjEwXDFcMFwxXDIxMFwxMFwwIisKLSAgICAiXDExXDIxMFwxXDBcNFwyMTBcMVwwXDJcMjEwXDFcMFwxXDIxMFwxXDAiKwotICAgICJcM1wyMTBcNFwwXDFcMjE0XDFcMFwxXDMxNlwyXDIyN1wxXDBcMlwyMjciKwotICAgICJcMVwzMTZcMlwyMjdcMVwwXDRcMjI3XDJcMFwxNlwyMjdcMVwzMTZcMlwyMjciKwotICAgICJcMVwzMTZcMlwyMjdcMVwzMTZcMTBcMjI3XDFcMzE2XDRcMjI3XDFcMzE2XDdcMjI3IisKLSAgICAiXDFcMFwxXDMxN1w1XDBcMVwzMTdcMTZcMFwyXDMxN1w3XDBcMlwzMTciKwotICAgICJcMVwwXDJcMzE3XDFcMFwyXDMxN1w3XDBcMlwzMTdcM1wwXDJcMzE3IisKLSAgICAiXDdcMFwyXDExM1wxXDIxNVwzXDBcMlwxMTNcM1wwXDFcMjE2XDVcMCIrCi0gICAgIlwyXDExM1wxXDMyMFwxXDIxN1wxXDExM1wxMFwwXDExXDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTNcNTdcMFwxXDMyMSIrCi0gICAgIlwyMVwwXDFcMzIyXDFcMjVcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXDMyMiIrCi0gICAgIlwxXDI1XDFcMFwxXDI1XDRcMFwyXDI1XDFcMFwzXDI1XDFcMCIrCi0gICAgIlwxXDI1XDEwXDBcMVwzMjJcMlwyNVwxXDMyMlwyXDI1XDFcMzIyXDJcMjUiKwotICAgICJcMVwwXDRcMjVcMVwwXDFcMzIyXDFcMjVcMVwwXDFcMjVcMVwwIisKLSAgICAiXDFcMzIyXDJcMjVcNlwwXDFcMzIzXDFcMTM0XDFcMTM1XDFcMTM0XDFcMCIrCi0gICAgIlwxXDEzNFwxXDMyM1wxXDEzNFwxXDBcMVwxMzRcNFwwXDJcMTM0XDFcMCIrCi0gICAgIlwzXDEzNFwxXDBcMVwxMzRcMTBcMFwxXDMyM1wyXDEzNFwxXDMyM1wyXDEzNCIrCi0gICAgIlwxXDMyM1wyXDEzNFwxXDBcNFwxMzRcMVwwXDFcMzIzXDFcMTM0XDFcMCIrCi0gICAgIlwxXDEzNFwxXDBcMVwzMjNcMlwxMzRcNlwwXDFcMzI0XDFcMTM2XDFcMTM3IisKLSAgICAiXDFcMTM2XDFcMFwxXDEzNlwxXDMyNFwxXDEzNlwxXDBcMVwxMzZcNFwwIisKLSAgICAiXDJcMTM2XDFcMFwzXDEzNlwxXDBcMVwxMzZcMTBcMFwxXDMyNFwyXDEzNiIrCi0gICAgIlwxXDMyNFwyXDEzNlwxXDMyNFwyXDEzNlwxXDBcNFwxMzZcMVwwXDFcMzI0IisKLSAgICAiXDFcMTM2XDFcMFwxXDEzNlwxXDBcMVwzMjRcMlwxMzZcMTVcMFwxXDMyNSIrCi0gICAgIlw2MlwwXDM0XDE0MVwxXDMyNlwxXDI0M1wzNVwxNDFcNDJcMFwyXDMyN1wxMDJcMCIrCi0gICAgIlwxXDMzMFw3NVwwXDJcMzMxXDc0XDBcMVwzMzJcNzZcMFwxXDMzM1w3XDAiKwotICAgICJcMVwzMzRcMVwzMzVcMVwyNTFcMVwwXDFcMjUxXDFcMzM0XDFcMzM2XDFcMCIrCi0gICAgIlwxXDI1MVw0XDBcMlwyNTFcMVwwXDNcMzM0XDFcMFwxXDMzNFwxMFwwIisKLSAgICAiXDExXDMzNFwxXDBcNFwzMzRcMVwwXDJcMzM0XDFcMFwxXDMzNFwxXDAiKwotICAgICJcM1wzMzRcNlwwXDFcMzM3XDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMFwxXDE0NyIrCi0gICAgIlwxXDMzN1wxXDE0N1wxXDBcMVwxNDdcNFwwXDJcMTQ3XDFcMFwzXDE0NyIrCi0gICAgIlwxXDI1MVwxXDE0N1wxMFwwXDFcMzM3XDJcMTQ3XDFcMzM3XDJcMTQ3XDFcMzM3IisKLSAgICAiXDJcMTQ3XDFcMFw0XDE0N1wxXDBcMVwzMzdcMVwxNDdcMVwwXDFcMTQ3IisKLSAgICAiXDFcMFwxXDMzN1wyXDE0N1w2XDBcMVwzNDBcMVwxNTJcMVwxNTNcMVwxNTIiKwotICAgICJcMVwxNTRcMVwxNTJcMVwzNDBcMjdcMTUyXDFcMzQwXDJcMTUyXDFcMzQwXDJcMTUyIisKLSAgICAiXDFcMzQwXDEwXDE1MlwxXDM0MFw0XDE1MlwxXDM0MFw3XDE1MlwxXDBcMlwxNTIiKwotICAgICJcMVwxNTNcMVwwXDFcMTU0XDEyXDE1MlwxXDBcNTJcMTUyXDFcMFwxXDM0MSIrCi0gICAgIlwxXDE1NVwxXDE1NlwzXDE1NVwxXDM0MVwxXDE1NVwxXDE1NFwyNVwxNTVcMVwzNDEiKwotICAgICJcMlwxNTVcMVwzNDFcMlwxNTVcMVwzNDFcMTBcMTU1XDFcMzQxXDRcMTU1XDFcMzQxIisKLSAgICAiXDdcMTU1XDFcMFwyXDE1NVwxXDE1NlwxXDBcNFwxNTVcMVwxNTRcNlwxNTUiKwotICAgICJcMVwwXDUyXDE1NVwxXDBcMVwzNDJcMVwxNTdcMVwxNjBcMVwxNTdcMVwxNjEiKwotICAgICJcMVwxNTdcMVwzNDJcMjdcMTU3XDFcMzQyXDJcMTU3XDFcMzQyXDJcMTU3XDFcMzQyIisKLSAgICAiXDEwXDE1N1wxXDM0Mlw0XDE1N1wxXDM0Mlw3XDE1N1wxXDBcMlwxNTdcMVwxNjAiKwotICAgICJcMVwwXDFcMTYxXDEyXDE1N1wxXDBcNTJcMTU3XDFcMFwxXDM0M1wxXDE2MiIrCi0gICAgIlwxXDE2M1wzXDE2MlwxXDM0M1wxXDE2MlwxXDE2MVwyNVwxNjJcMVwzNDNcMlwxNjIiKwotICAgICJcMVwzNDNcMlwxNjJcMVwzNDNcMTBcMTYyXDFcMzQzXDRcMTYyXDFcMzQzXDdcMTYyIisKLSAgICAiXDFcMFwyXDE2MlwxXDE2M1wxXDBcNFwxNjJcMVwxNjFcNlwxNjJcMVwwIisKLSAgICAiXDUyXDE2MlwyNVwwXDFcMzQ0XDQ2XDBcMVwzNDVcMVw1MVwxXDE2NVwxXDUxIisKLSAgICAiXDFcMFwxXDUxXDFcMzQ1XDFcNTFcMVwwXDFcNTFcNFwwXDJcNTEiKwotICAgICJcMVwwXDNcNTFcMVwwXDFcNTFcMTBcMFwxXDM0NVwyXDUxXDFcMzQ1IisKLSAgICAiXDJcNTFcMVwzNDVcMlw1MVwxXDBcNFw1MVwxXDBcMVwzNDVcMVw1MSIrCi0gICAgIlwxXDBcMVw1MVwxXDBcMVwzNDVcMlw1MVw2XDBcMVwzNDZcMVw1NSIrCi0gICAgIlwxXDE2N1wxXDU1XDFcMFwxXDU1XDFcMzQ2XDFcNTVcMVwwXDFcNTUiKwotICAgICJcNFwwXDJcNTVcMVwwXDNcNTVcMVwwXDFcNTVcMTBcMFwxXDM0NiIrCi0gICAgIlwyXDU1XDFcMzQ2XDJcNTVcMVwzNDZcMlw1NVwxXDBcNFw1NVwxXDAiKwotICAgICJcMVwzNDZcMVw1NVwxXDBcMVw1NVwxXDBcMVwzNDZcMlw1NVw2XDAiKwotICAgICJcMVwzNDdcMVw2MlwxXDE3MVwxXDYyXDFcMFwxXDYyXDFcMzQ3XDFcNjIiKwotICAgICJcMVwwXDFcNjJcNFwwXDJcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMTBcMFwxXDM0N1wyXDYyXDFcMzQ3XDJcNjJcMVwzNDdcMlw2MlwxXDAiKwotICAgICJcNFw2MlwxXDBcMVwzNDdcMVw2MlwxXDBcMVw2MlwxXDBcMVwzNDciKwotICAgICJcMlw2Mlw2XDBcMVwzNTBcMVw3MlwxXDE3NVwxXDcyXDFcMFwxXDcyIisKLSAgICAiXDFcMzUwXDFcNzJcMVwwXDFcNzJcNFwwXDJcNzJcMVwwXDNcNzIiKwotICAgICJcMVwwXDFcNzJcMTBcMFwxXDM1MFwyXDcyXDFcMzUwXDJcNzJcMVwzNTAiKwotICAgICJcMlw3MlwxXDBcNFw3MlwxXDBcMVwzNTBcMVw3MlwxXDBcMVw3MiIrCi0gICAgIlwxXDBcMVwzNTBcMlw3Mlw2XDBcMVwzNTFcMVwxMDBcMVwxNzdcMVwxMDAiKwotICAgICJcMVwwXDFcMTAwXDFcMzUxXDFcMTAwXDFcMFwxXDEwMFw0XDBcMlwxMDAiKwotICAgICJcMVwwXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDFcMzUxXDJcMTAwXDFcMzUxIisKLSAgICAiXDJcMTAwXDFcMzUxXDJcMTAwXDFcMFw0XDEwMFwxXDBcMVwzNTFcMVwxMDAiKwotICAgICJcMVwwXDFcMTAwXDFcMFwxXDM1MVwyXDEwMFw2XDBcMVwzNTJcMVwyMDEiKwotICAgICJcMVwyMDJcMVwyMDFcMVwyMDNcMVwyMDFcMVwzNTJcMjdcMjAxXDFcMzUyXDJcMjAxIisKLSAgICAiXDFcMzUyXDJcMjAxXDFcMzUyXDEwXDIwMVwxXDM1Mlw0XDIwMVwxXDM1Mlw3XDIwMSIrCi0gICAgIlwxXDBcMlwyMDFcMVwyMDJcMVwwXDFcMjAzXDEyXDIwMVwxXDBcNTJcMjAxIisKLSAgICAiXDFcMFwxXDM1M1wxXDIwNFwxXDIwNVwzXDIwNFwxXDM1M1wxXDIwNFwxXDIwMyIrCi0gICAgIlwyNVwyMDRcMVwzNTNcMlwyMDRcMVwzNTNcMlwyMDRcMVwzNTNcMTBcMjA0XDFcMzUzIisKLSAgICAiXDRcMjA0XDFcMzUzXDdcMjA0XDFcMFwyXDIwNFwxXDIwNVwxXDBcNFwyMDQiKwotICAgICJcMVwyMDNcNlwyMDRcMVwwXDUyXDIwNFwxXDBcMVwzNTRcMVwxMDVcMVwyMDYiKwotICAgICJcMVwxMDVcMVwwXDFcMTA1XDFcMzU0XDFcMTA1XDFcMFwxXDEwNVw0XDAiKwotICAgICJcMlwxMDVcMVwwXDNcMTA1XDFcMFwxXDEwNVwxMFwwXDFcMzU0XDJcMTA1IisKLSAgICAiXDFcMzU0XDJcMTA1XDFcMzU0XDJcMTA1XDFcMFw0XDEwNVwxXDBcMVwzNTQiKwotICAgICJcMVwxMDVcMVwwXDFcMTA1XDFcMFwxXDM1NFwyXDEwNVw2XDBcMVwzNTUiKwotICAgICJcMVwyMTBcMVwyMTFcMVwyMTBcMVwwXDFcMjEwXDFcMzU1XDFcMjEwXDFcMCIrCi0gICAgIlwxXDIxMFw0XDBcMlwyMTBcMVwwXDNcMjEwXDFcMFwxXDIxMFwxMFwwIisKLSAgICAiXDFcMzU1XDJcMjEwXDFcMzU1XDJcMjEwXDFcMzU1XDJcMjEwXDFcMFw0XDIxMCIrCi0gICAgIlwxXDBcMVwzNTVcMVwyMTBcMVwwXDFcMjEwXDFcMFwxXDM1NVwyXDIxMCIrCi0gICAgIlw2XDBcMlwzMDVcMVwzMDZcM1wwXDJcMzA1XDNcMFwxXDIxNlw1XDAiKwotICAgICJcM1wzMDVcMVwwXDFcMzA1XDEwXDBcMTFcMzA1XDFcMFw0XDMwNVwxXDAiKwotICAgICJcMlwzMDVcMVwwXDFcMzA1XDFcMFwzXDMwNVw2XDBcMVwzNTZcMlwzMDUiKwotICAgICJcMVwwXDJcMzA1XDFcMzU2XDJcMzA1XDFcMFw0XDMwNVwyXDBcMTZcMzA1IisKLSAgICAiXDFcMzU2XDJcMzA1XDFcMzU2XDJcMzA1XDFcMzU2XDEwXDMwNVwxXDM1Nlw0XDMwNSIrCi0gICAgIlwxXDM1Nlw3XDMwNVwxXDBcMVwzNTdcMVwxMTNcMVwyMTVcMVwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDFcMzU3XDFcMTEzXDFcMFwxXDExM1wxXDBcMVwyMTZcMlwwIisKLSAgICAiXDJcMTEzXDFcMFwzXDExM1wxXDIxN1wxXDExM1wxMFwwXDFcMzU3XDJcMTEzIisKLSAgICAiXDFcMzU3XDJcMTEzXDFcMzU3XDJcMTEzXDFcMFw0XDExM1wxXDBcMVwzNTciKwotICAgICJcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXDM1N1wyXDExM1w2XDBcMVwzNjAiKwotICAgICJcMVwyMjFcMVwyMjJcMVwyMjFcMVwyMjNcMVwyMjFcMVwzNjBcMjdcMjIxXDFcMzYwIisKLSAgICAiXDJcMjIxXDFcMzYwXDJcMjIxXDFcMzYwXDEwXDIyMVwxXDM2MFw0XDIyMVwxXDM2MCIrCi0gICAgIlw3XDIyMVwxXDBcMlwyMjFcMVwyMjJcMVwwXDFcMjIzXDEyXDIyMVwxXDAiKwotICAgICJcNTJcMjIxXDFcMFwxXDM2MVwxXDIyNFwxXDIyNVwzXDIyNFwxXDM2MVwxXDIyNCIrCi0gICAgIlwxXDIyM1wyNVwyMjRcMVwzNjFcMlwyMjRcMVwzNjFcMlwyMjRcMVwzNjFcMTBcMjI0IisKLSAgICAiXDFcMzYxXDRcMjI0XDFcMzYxXDdcMjI0XDFcMFwyXDIyNFwxXDIyNVwxXDAiKwotICAgICJcNFwyMjRcMVwyMjNcNlwyMjRcMVwwXDUyXDIyNFwxXDBcMVwzNjJcMVwyMjciKwotICAgICJcMVwyMzBcMVwyMjdcMVwwXDFcMjI3XDFcMzYyXDFcMjI3XDFcMFwxXDIyNyIrCi0gICAgIlw0XDBcMlwyMjdcMVwwXDNcMjI3XDFcMFwxXDIyN1wxMFwwXDFcMzYyIisKLSAgICAiXDJcMjI3XDFcMzYyXDJcMjI3XDFcMzYyXDJcMjI3XDFcMFw0XDIyN1wxXDAiKwotICAgICJcMVwzNjJcMVwyMjdcMVwwXDFcMjI3XDFcMFwxXDM2MlwyXDIyN1w2XDAiKwotICAgICJcMVwzNjNcNVwwXDFcMzYzXDFcMzY0XDE1XDBcMlwzNjNcN1wwXDJcMzYzIisKLSAgICAiXDFcMFwyXDM2M1wxXDBcMlwzNjNcN1wwXDJcMzYzXDNcMFwyXDM2MyIrCi0gICAgIlw3XDBcMlwxMTNcMVwyMTVcM1wwXDJcMTEzXDNcMFwxXDIxNlw1XDAiKwotICAgICJcM1wxMTNcMVwzNjVcMVwxMTNcMTBcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMCIrCi0gICAgIlwyXDExM1wxXDBcMVwxMTNcMVwwXDNcMTEzXDYwXDBcMVwzNjZcMjBcMCIrCi0gICAgIlwxXDM2N1wxXDI1XDFcMTMxXDFcMjVcMVwwXDFcMjVcMVwzNjdcMVwyNSIrCi0gICAgIlwxXDBcMVwyNVw0XDBcMlwyNVwxXDBcM1wyNVwxXDBcMVwyNSIrCi0gICAgIlwxMFwwXDFcMzY3XDJcMjVcMVwzNjdcMlwyNVwxXDM2N1wyXDI1XDFcMCIrCi0gICAgIlw0XDI1XDFcMFwxXDM2N1wxXDI1XDFcMFwxXDI1XDFcMFwxXDM2NyIrCi0gICAgIlwyXDI1XDZcMFwxXDM3MFwxXDEzNFwxXDEzNVwxXDEzNFwxXDBcMVwxMzQiKwotICAgICJcMVwzNzBcMVwxMzRcMVwwXDFcMTM0XDRcMFwyXDEzNFwxXDBcM1wxMzQiKwotICAgICJcMVwwXDFcMTM0XDEwXDBcMVwzNzBcMlwxMzRcMVwzNzBcMlwxMzRcMVwzNzAiKwotICAgICJcMlwxMzRcMVwwXDRcMTM0XDFcMFwxXDM3MFwxXDEzNFwxXDBcMVwxMzQiKwotICAgICJcMVwwXDFcMzcwXDJcMTM0XDZcMFwxXDM3MVwxXDEzNlwxXDEzN1wxXDEzNiIrCi0gICAgIlwxXDBcMVwxMzZcMVwzNzFcMVwxMzZcMVwwXDFcMTM2XDRcMFwyXDEzNiIrCi0gICAgIlwxXDBcM1wxMzZcMVwwXDFcMTM2XDEwXDBcMVwzNzFcMlwxMzZcMVwzNzEiKwotICAgICJcMlwxMzZcMVwzNzFcMlwxMzZcMVwwXDRcMTM2XDFcMFwxXDM3MVwxXDEzNiIrCi0gICAgIlwxXDBcMVwxMzZcMVwwXDFcMzcxXDJcMTM2XDMwXDBcMVwzNzJcMTIzXDAiKwotICAgICJcMVwzNzNcNjdcMFwxXDM3NFw2NlwwXDJcMzc1XDczXDBcMVwzNzZcMjRcMCIrCi0gICAgIlwyXDMzNFwxXDMzNVwxXDM3N1wxXDBcMVwzNzdcMlwzMzRcMVwwXDFcMzc3IisKLSAgICAiXDFcdTAxMDBcM1wwXDJcMzc3XDFcMFwzXDMzNFwxXDBcMVwzMzRcMTBcMCIrCi0gICAgIlwxMVwzMzRcMVwwXDRcMzM0XDFcMFwyXDMzNFwxXDBcMVwzMzRcMVwwIisKLSAgICAiXDNcMzM0XDZcMFwxXHUwMTAxXDJcMzM0XDFcMFwyXDMzNFwxXHUwMTAxXDJcMzM0IisKLSAgICAiXDFcMFw0XDMzNFwyXDBcMTZcMzM0XDFcdTAxMDFcMlwzMzRcMVx1MDEwMVwyXDMzNCIrCi0gICAgIlwxXHUwMTAxXDEwXDMzNFwxXHUwMTAxXDRcMzM0XDFcdTAxMDFcN1wzMzRcMlwwXDFcMzM0IisKLSAgICAiXDFcMzM1XDNcMFwxXDMzNFwxMlwwXDNcMzM0XDFcMFwxXDMzNFwxMFwwIisKLSAgICAiXDExXDMzNFwxXDBcNFwzMzRcMVwwXDJcMzM0XDFcMFwxXDMzNFwxXDAiKwotICAgICJcM1wzMzRcNlwwXDFcdTAxMDJcMVwxNDdcMVwxNTBcMVwxNDdcMVwwXDFcMTQ3IisKLSAgICAiXDFcdTAxMDJcMVwxNDdcMVwwXDFcMTQ3XDRcMFwyXDE0N1wxXDBcM1wxNDciKwotICAgICJcMVwyNTFcMVwxNDdcMTBcMFwxXHUwMTAyXDJcMTQ3XDFcdTAxMDJcMlwxNDdcMVx1MDEwMiIrCi0gICAgIlwyXDE0N1wxXDBcNFwxNDdcMVwwXDFcdTAxMDJcMVwxNDdcMVwwXDFcMTQ3IisKLSAgICAiXDFcMFwxXHUwMTAyXDJcMTQ3XDZcMFwxXHUwMTAzXDFcMTUyXDFcMTUzXDFcMTUyIisKLSAgICAiXDFcMTU0XDFcMTUyXDFcdTAxMDNcMjdcMTUyXDFcdTAxMDNcMlwxNTJcMVx1MDEwM1wyXDE1MiIrCi0gICAgIlwxXHUwMTAzXDEwXDE1MlwxXHUwMTAzXDRcMTUyXDFcdTAxMDNcN1wxNTJcMVwwXDFcdTAxMDQiKwotICAgICJcMVwxNTVcMVwxNTZcM1wxNTVcMVx1MDEwNFwxXDE1NVwxXDE1NFwyNVwxNTVcMVx1MDEwNCIrCi0gICAgIlwyXDE1NVwxXHUwMTA0XDJcMTU1XDFcdTAxMDRcMTBcMTU1XDFcdTAxMDRcNFwxNTVcMVx1MDEwNCIrCi0gICAgIlw3XDE1NVwxXDBcMVx1MDEwNVwxXDE1N1wxXDE2MFwxXDE1N1wxXDE2MVwxXDE1NyIrCi0gICAgIlwxXHUwMTA1XDI3XDE1N1wxXHUwMTA1XDJcMTU3XDFcdTAxMDVcMlwxNTdcMVx1MDEwNVwxMFwxNTciKwotICAgICJcMVx1MDEwNVw0XDE1N1wxXHUwMTA1XDdcMTU3XDFcMFwxXHUwMTA2XDFcMTYyXDFcMTYzIisKLSAgICAiXDNcMTYyXDFcdTAxMDZcMVwxNjJcMVwxNjFcMjVcMTYyXDFcdTAxMDZcMlwxNjJcMVx1MDEwNiIrCi0gICAgIlwyXDE2MlwxXHUwMTA2XDEwXDE2MlwxXHUwMTA2XDRcMTYyXDFcdTAxMDZcN1wxNjJcMVwwIisKLSAgICAiXDJcdTAxMDdcMVx1MDEwOFwxXDM0NFwxXHUwMTA5XDFcMzQ0XDJcdTAxMDdcMVx1MDEwYVwxXDM0NCIrCi0gICAgIlwxXHUwMTBiXDNcdTAxMDdcMlwzNDRcNFx1MDEwN1wxXDBcNDVcdTAxMDdcMVwwXDFcdTAxMGMiKwotICAgICJcMVw1MVwxXDE2NVwxXDUxXDFcMFwxXDUxXDFcdTAxMGNcMVw1MVwxXDAiKwotICAgICJcMVw1MVw0XDBcMlw1MVwxXDBcM1w1MVwxXDBcMVw1MVwxMFwwIisKLSAgICAiXDFcdTAxMGNcMlw1MVwxXHUwMTBjXDJcNTFcMVx1MDEwY1wyXDUxXDFcMFw0XDUxIisKLSAgICAiXDFcMFwxXHUwMTBjXDFcNTFcMVwwXDFcNTFcMVwwXDFcdTAxMGNcMlw1MSIrCi0gICAgIlw2XDBcMVx1MDEwZFwxXDU1XDFcMTY3XDFcNTVcMVwwXDFcNTVcMVx1MDEwZCIrCi0gICAgIlwxXDU1XDFcMFwxXDU1XDRcMFwyXDU1XDFcMFwzXDU1XDFcMCIrCi0gICAgIlwxXDU1XDEwXDBcMVx1MDEwZFwyXDU1XDFcdTAxMGRcMlw1NVwxXHUwMTBkXDJcNTUiKwotICAgICJcMVwwXDRcNTVcMVwwXDFcdTAxMGRcMVw1NVwxXDBcMVw1NVwxXDAiKwotICAgICJcMVx1MDEwZFwyXDU1XDZcMFwxXHUwMTBlXDFcNjJcMVwxNzFcMVw2MlwxXDAiKwotICAgICJcMVw2MlwxXHUwMTBlXDFcNjJcMVwwXDFcNjJcNFwwXDJcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMTBcMFwxXHUwMTBlXDJcNjJcMVx1MDEwZVwyXDYyIisKLSAgICAiXDFcdTAxMGVcMlw2MlwxXDBcNFw2MlwxXDBcMVx1MDEwZVwxXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFwxXHUwMTBlXDJcNjJcNlwwXDFcdTAxMGZcMVw3MlwxXDE3NSIrCi0gICAgIlwxXDcyXDFcMFwxXDcyXDFcdTAxMGZcMVw3MlwxXDBcMVw3Mlw0XDAiKwotICAgICJcMlw3MlwxXDBcM1w3MlwxXDBcMVw3MlwxMFwwXDFcdTAxMGZcMlw3MiIrCi0gICAgIlwxXHUwMTBmXDJcNzJcMVx1MDEwZlwyXDcyXDFcMFw0XDcyXDFcMFwxXHUwMTBmIisKLSAgICAiXDFcNzJcMVwwXDFcNzJcMVwwXDFcdTAxMGZcMlw3Mlw2XDBcMVx1MDExMCIrCi0gICAgIlwxXDEwMFwxXDE3N1wxXDEwMFwxXDBcMVwxMDBcMVx1MDExMFwxXDEwMFwxXDAiKwotICAgICJcMVwxMDBcNFwwXDJcMTAwXDFcMFwzXDEwMFwxXDBcMVwxMDBcMTBcMCIrCi0gICAgIlwxXHUwMTEwXDJcMTAwXDFcdTAxMTBcMlwxMDBcMVx1MDExMFwyXDEwMFwxXDBcNFwxMDAiKwotICAgICJcMVwwXDFcdTAxMTBcMVwxMDBcMVwwXDFcMTAwXDFcMFwxXHUwMTEwXDJcMTAwIisKLSAgICAiXDZcMFwxXHUwMTExXDFcMjAxXDFcMjAyXDFcMjAxXDFcMjAzXDFcMjAxXDFcdTAxMTEiKwotICAgICJcMjdcMjAxXDFcdTAxMTFcMlwyMDFcMVx1MDExMVwyXDIwMVwxXHUwMTExXDEwXDIwMVwxXHUwMTExIisKLSAgICAiXDRcMjAxXDFcdTAxMTFcN1wyMDFcMVwwXDFcdTAxMTJcMVwyMDRcMVwyMDVcM1wyMDQiKwotICAgICJcMVx1MDExMlwxXDIwNFwxXDIwM1wyNVwyMDRcMVx1MDExMlwyXDIwNFwxXHUwMTEyXDJcMjA0IisKLSAgICAiXDFcdTAxMTJcMTBcMjA0XDFcdTAxMTJcNFwyMDRcMVx1MDExMlw3XDIwNFwxXDBcMVx1MDExMyIrCi0gICAgIlwxXDEwNVwxXDIwNlwxXDEwNVwxXDBcMVwxMDVcMVx1MDExM1wxXDEwNVwxXDAiKwotICAgICJcMVwxMDVcNFwwXDJcMTA1XDFcMFwzXDEwNVwxXDBcMVwxMDVcMTBcMCIrCi0gICAgIlwxXHUwMTEzXDJcMTA1XDFcdTAxMTNcMlwxMDVcMVx1MDExM1wyXDEwNVwxXDBcNFwxMDUiKwotICAgICJcMVwwXDFcdTAxMTNcMVwxMDVcMVwwXDFcMTA1XDFcMFwxXHUwMTEzXDJcMTA1IisKLSAgICAiXDZcMFwxXHUwMTE0XDFcMjEwXDFcMjExXDFcMjEwXDFcMFwxXDIxMFwxXHUwMTE0IisKLSAgICAiXDFcMjEwXDFcMFwxXDIxMFw0XDBcMlwyMTBcMVwwXDNcMjEwXDFcMCIrCi0gICAgIlwxXDIxMFwxMFwwXDFcdTAxMTRcMlwyMTBcMVx1MDExNFwyXDIxMFwxXHUwMTE0XDJcMjEwIisKLSAgICAiXDFcMFw0XDIxMFwxXDBcMVx1MDExNFwxXDIxMFwxXDBcMVwyMTBcMVwwIisKLSAgICAiXDFcdTAxMTRcMlwyMTBcNlwwXDFcdTAxMTVcMVwzMDVcMVwzMDZcMVwzMDVcMVwwIisKLSAgICAiXDFcMzA1XDFcdTAxMTVcMVwzMDVcMVwwXDFcMzA1XDFcMFwxXDIxNlwyXDAiKwotICAgICJcMlwzMDVcMVwwXDNcMzA1XDFcMFwxXDMwNVwxMFwwXDFcdTAxMTVcMlwzMDUiKwotICAgICJcMVx1MDExNVwyXDMwNVwxXHUwMTE1XDJcMzA1XDFcMFw0XDMwNVwxXDBcMVx1MDExNSIrCi0gICAgIlwxXDMwNVwxXDBcMVwzMDVcMVwwXDFcdTAxMTVcMlwzMDVcNlwwXDFcdTAxMTYiKwotICAgICJcMVwxMTNcMVwyMTVcMVwxMTNcMVwwXDFcMTEzXDFcdTAxMTZcMVwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDFcMFwxXDIxNlwyXDBcMlwxMTNcMVwwXDNcMTEzXDFcMjE3IisKLSAgICAiXDFcMTEzXDEwXDBcMVx1MDExNlwyXDExM1wxXHUwMTE2XDJcMTEzXDFcdTAxMTZcMlwxMTMiKwotICAgICJcMVwwXDRcMTEzXDFcMFwxXHUwMTE2XDFcMTEzXDFcMFwxXDExM1wxXDAiKwotICAgICJcMVx1MDExNlwyXDExM1w2XDBcMVx1MDExN1wxXDIyMVwxXDIyMlwxXDIyMVwxXDIyMyIrCi0gICAgIlwxXDIyMVwxXHUwMTE3XDI3XDIyMVwxXHUwMTE3XDJcMjIxXDFcdTAxMTdcMlwyMjFcMVx1MDExNyIrCi0gICAgIlwxMFwyMjFcMVx1MDExN1w0XDIyMVwxXHUwMTE3XDdcMjIxXDFcMFwxXHUwMTE4XDFcMjI0IisKLSAgICAiXDFcMjI1XDNcMjI0XDFcdTAxMThcMVwyMjRcMVwyMjNcMjVcMjI0XDFcdTAxMThcMlwyMjQiKwotICAgICJcMVx1MDExOFwyXDIyNFwxXHUwMTE4XDEwXDIyNFwxXHUwMTE4XDRcMjI0XDFcdTAxMThcN1wyMjQiKwotICAgICJcMVwwXDFcdTAxMTlcMVwyMjdcMVwyMzBcMVwyMjdcMVwwXDFcMjI3XDFcdTAxMTkiKwotICAgICJcMVwyMjdcMVwwXDFcMjI3XDRcMFwyXDIyN1wxXDBcM1wyMjdcMVwwIisKLSAgICAiXDFcMjI3XDEwXDBcMVx1MDExOVwyXDIyN1wxXHUwMTE5XDJcMjI3XDFcdTAxMTlcMlwyMjciKwotICAgICJcMVwwXDRcMjI3XDFcMFwxXHUwMTE5XDFcMjI3XDFcMFwxXDIyN1wxXDAiKwotICAgICJcMVx1MDExOVwyXDIyN1w2XDBcMVx1MDExYVw1XDBcMVx1MDExYVwxXDM2NFwxNVwwIisKLSAgICAiXDJcdTAxMWFcN1wwXDJcdTAxMWFcMVwwXDJcdTAxMWFcMVwwXDJcdTAxMWFcN1wwIisKLSAgICAiXDJcdTAxMWFcM1wwXDJcdTAxMWFcN1wwXDFcdTAxMWJcNVwwXDFcdTAxMWJcMTZcMCIrCi0gICAgIlwyXHUwMTFiXDdcMFwyXHUwMTFiXDFcMFwyXHUwMTFiXDFcMFwyXHUwMTFiXDdcMCIrCi0gICAgIlwyXHUwMTFiXDNcMFwyXHUwMTFiXDdcMFwyXHUwMTFjXDFcdTAxMWRcMVx1MDExZVwxXHUwMTFmIisKLSAgICAiXDFcdTAxMWVcMlx1MDExY1wxXHUwMTIwXDFcdTAxMWVcMVx1MDEyMVwzXHUwMTFjXDJcdTAxMWVcNFx1MDExYyIrCi0gICAgIlwxXDBcNDVcdTAxMWNcNTRcMFwxXHUwMTIyXDE3XDBcMVx1MDEyM1wxXDI1XDFcMTMxIisKLSAgICAiXDFcMjVcMVwwXDFcMjVcMVx1MDEyM1wxXDI1XDFcMFwxXDI1XDRcMCIrCi0gICAgIlwyXDI1XDFcMFwzXDI1XDFcMFwxXDI1XDEwXDBcMVx1MDEyM1wyXDI1IisKLSAgICAiXDFcdTAxMjNcMlwyNVwxXHUwMTIzXDJcMjVcMVwwXDRcMjVcMVwwXDFcdTAxMjMiKwotICAgICJcMVwyNVwxXDBcMVwyNVwxXDBcMVx1MDEyM1wyXDI1XDZcMFwxXHUwMTI0IisKLSAgICAiXDFcMTM0XDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXHUwMTI0XDFcMTM0XDFcMCIrCi0gICAgIlwxXDEzNFw0XDBcMlwxMzRcMVwwXDNcMTM0XDFcMFwxXDEzNFwxMFwwIisKLSAgICAiXDFcdTAxMjRcMlwxMzRcMVx1MDEyNFwyXDEzNFwxXHUwMTI0XDJcMTM0XDFcMFw0XDEzNCIrCi0gICAgIlwxXDBcMVx1MDEyNFwxXDEzNFwxXDBcMVwxMzRcMVwwXDFcdTAxMjRcMlwxMzQiKwotICAgICJcNlwwXDFcdTAxMjVcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcdTAxMjUiKwotICAgICJcMVwxMzZcMVwwXDFcMTM2XDRcMFwyXDEzNlwxXDBcM1wxMzZcMVwwIisKLSAgICAiXDFcMTM2XDEwXDBcMVx1MDEyNVwyXDEzNlwxXHUwMTI1XDJcMTM2XDFcdTAxMjVcMlwxMzYiKwotICAgICJcMVwwXDRcMTM2XDFcMFwxXHUwMTI1XDFcMTM2XDFcMFwxXDEzNlwxXDAiKwotICAgICJcMVx1MDEyNVwyXDEzNlw1MVwwXDFcdTAxMjZcNTFcMFwxXHUwMTI3XDExMVwwXDJcdTAxMjgiKwotICAgICJcMzdcMFwxXHUwMTI5XDY2XDBcMVwzNzdcMVwwXDFcMzc3XDNcMFwxXDM3NyIrCi0gICAgIlwxXHUwMTAwXDNcMFwyXDM3N1w1M1wwXDFcdTAxMmFcMVwzMzRcMVwzMzVcMVwzMzQiKwotICAgICJcMVwwXDFcMzM0XDFcdTAxMmFcMVwzMzRcMVwwXDFcMzM0XDFcdTAxMDBcM1wwIisKLSAgICAiXDJcMzM0XDFcMFwzXDMzNFwxXDBcMVwzMzRcMTBcMFwxXHUwMTJhXDJcMzM0IisKLSAgICAiXDFcdTAxMmFcMlwzMzRcMVx1MDEyYVwyXDMzNFwxXDBcNFwzMzRcMVwwXDFcdTAxMmEiKwotICAgICJcMVwzMzRcMVwwXDFcMzM0XDFcMFwxXHUwMTJhXDJcMzM0XDZcMFwxXHUwMTJiIisKLSAgICAiXDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTJiXDFcMTQ3XDFcMCIrCi0gICAgIlwxXDE0N1w0XDBcMlwxNDdcMVwwXDNcMTQ3XDFcMjUxXDFcMTQ3XDEwXDAiKwotICAgICJcMVx1MDEyYlwyXDE0N1wxXHUwMTJiXDJcMTQ3XDFcdTAxMmJcMlwxNDdcMVwwXDRcMTQ3IisKLSAgICAiXDFcMFwxXHUwMTJiXDFcMTQ3XDFcMFwxXDE0N1wxXDBcMVx1MDEyYlwyXDE0NyIrCi0gICAgIlw2XDBcMVx1MDEyY1wxXDE1MlwxXDE1M1wxXDE1MlwxXDE1NFwxXDE1MlwxXHUwMTJjIisKLSAgICAiXDI3XDE1MlwxXHUwMTJjXDJcMTUyXDFcdTAxMmNcMlwxNTJcMVx1MDEyY1wxMFwxNTJcMVx1MDEyYyIrCi0gICAgIlw0XDE1MlwxXHUwMTJjXDdcMTUyXDFcMFwxXHUwMTJkXDFcMTU1XDFcMTU2XDNcMTU1IisKLSAgICAiXDFcdTAxMmRcMVwxNTVcMVwxNTRcMjVcMTU1XDFcdTAxMmRcMlwxNTVcMVx1MDEyZFwyXDE1NSIrCi0gICAgIlwxXHUwMTJkXDEwXDE1NVwxXHUwMTJkXDRcMTU1XDFcdTAxMmRcN1wxNTVcMVwwXDFcdTAxMmUiKwotICAgICJcMVwxNTdcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDEyZVwyN1wxNTdcMVx1MDEyZSIrCi0gICAgIlwyXDE1N1wxXHUwMTJlXDJcMTU3XDFcdTAxMmVcMTBcMTU3XDFcdTAxMmVcNFwxNTdcMVx1MDEyZSIrCi0gICAgIlw3XDE1N1wxXDBcMVx1MDEyZlwxXDE2MlwxXDE2M1wzXDE2MlwxXHUwMTJmXDFcMTYyIisKLSAgICAiXDFcMTYxXDI1XDE2MlwxXHUwMTJmXDJcMTYyXDFcdTAxMmZcMlwxNjJcMVx1MDEyZlwxMFwxNjIiKwotICAgICJcMVx1MDEyZlw0XDE2MlwxXHUwMTJmXDdcMTYyXDFcMFwyXHUwMTA3XDFcdTAxMDhcMVx1MDEzMCIrCi0gICAgIlwxXDBcM1x1MDEwN1wxXDBcMVx1MDEzMFwxXHUwMTBiXDNcdTAxMDdcMlx1MDEzMFw0XHUwMTA3IisKLSAgICAiXDFcMFw0NVx1MDEwN1wxXDBcMVx1MDEzMVwxXHUwMTA3XDFcdTAxMDhcMVx1MDEzMFwyXHUwMTA3IisKLSAgICAiXDFcdTAxMzFcMlx1MDEwN1wxXHUwMTMwXDFcdTAxMzJcM1x1MDEwN1wyXHUwMTMwXDE2XHUwMTA3XDFcdTAxMzEiKwotICAgICJcMlx1MDEwN1wxXHUwMTMxXDJcdTAxMDdcMVx1MDEzMVwxMFx1MDEwN1wxXHUwMTMxXDRcdTAxMDdcMVx1MDEzMSIrCi0gICAgIlw3XHUwMTA3XDFcMFwyXHUwMTA5XDFcdTAxMzNcMVwwXDFcdTAxMzBcMTFcdTAxMDlcMlwwIisKLSAgICAiXDUyXHUwMTA5XDFcMFwyXHUwMTBhXDFcdTAxMzRcMVwwXDRcdTAxMGFcMVx1MDEzMFw1XHUwMTBhIisKLSAgICAiXDJcMFw1Mlx1MDEwYVwxXDBcMVx1MDEzNVwxXDUxXDFcMTY1XDFcNTFcMVwwIisKLSAgICAiXDFcNTFcMVx1MDEzNVwxXDUxXDFcMFwxXDUxXDRcMFwyXDUxXDFcMCIrCi0gICAgIlwzXDUxXDFcMFwxXDUxXDEwXDBcMVx1MDEzNVwyXDUxXDFcdTAxMzVcMlw1MSIrCi0gICAgIlwxXHUwMTM1XDJcNTFcMVwwXDRcNTFcMVwwXDFcdTAxMzVcMVw1MVwxXDAiKwotICAgICJcMVw1MVwxXDBcMVx1MDEzNVwyXDUxXDZcMFwxXHUwMTM2XDFcNTVcMVwxNjciKwotICAgICJcMVw1NVwxXDBcMVw1NVwxXHUwMTM2XDFcNTVcMVwwXDFcNTVcNFwwIisKLSAgICAiXDJcNTVcMVwwXDNcNTVcMVwwXDFcNTVcMTBcMFwxXHUwMTM2XDJcNTUiKwotICAgICJcMVx1MDEzNlwyXDU1XDFcdTAxMzZcMlw1NVwxXDBcNFw1NVwxXDBcMVx1MDEzNiIrCi0gICAgIlwxXDU1XDFcMFwxXDU1XDFcMFwxXHUwMTM2XDJcNTVcNlwwXDFcdTAxMzciKwotICAgICJcMVw2MlwxXDE3MVwxXDYyXDFcMFwxXDYyXDFcdTAxMzdcMVw2MlwxXDAiKwotICAgICJcMVw2Mlw0XDBcMlw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxMFwwIisKLSAgICAiXDFcdTAxMzdcMlw2MlwxXHUwMTM3XDJcNjJcMVx1MDEzN1wyXDYyXDFcMFw0XDYyIisKLSAgICAiXDFcMFwxXHUwMTM3XDFcNjJcMVwwXDFcNjJcMVwwXDFcdTAxMzdcMlw2MiIrCi0gICAgIlw2XDBcMVx1MDEzOFwxXDcyXDFcMTc1XDFcNzJcMVwwXDFcNzJcMVx1MDEzOCIrCi0gICAgIlwxXDcyXDFcMFwxXDcyXDRcMFwyXDcyXDFcMFwzXDcyXDFcMCIrCi0gICAgIlwxXDcyXDEwXDBcMVx1MDEzOFwyXDcyXDFcdTAxMzhcMlw3MlwxXHUwMTM4XDJcNzIiKwotICAgICJcMVwwXDRcNzJcMVwwXDFcdTAxMzhcMVw3MlwxXDBcMVw3MlwxXDAiKwotICAgICJcMVx1MDEzOFwyXDcyXDZcMFwxXHUwMTM5XDFcMTAwXDFcMTc3XDFcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwxXHUwMTM5XDFcMTAwXDFcMFwxXDEwMFw0XDBcMlwxMDBcMVwwIisKLSAgICAiXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDFcdTAxMzlcMlwxMDBcMVx1MDEzOVwyXDEwMCIrCi0gICAgIlwxXHUwMTM5XDJcMTAwXDFcMFw0XDEwMFwxXDBcMVx1MDEzOVwxXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMVwwXDFcdTAxMzlcMlwxMDBcNlwwXDFcdTAxM2FcMVwyMDFcMVwyMDIiKwotICAgICJcMVwyMDFcMVwyMDNcMVwyMDFcMVx1MDEzYVwyN1wyMDFcMVx1MDEzYVwyXDIwMVwxXHUwMTNhIisKLSAgICAiXDJcMjAxXDFcdTAxM2FcMTBcMjAxXDFcdTAxM2FcNFwyMDFcMVx1MDEzYVw3XDIwMVwxXDAiKwotICAgICJcMVx1MDEzYlwxXDIwNFwxXDIwNVwzXDIwNFwxXHUwMTNiXDFcMjA0XDFcMjAzXDI1XDIwNCIrCi0gICAgIlwxXHUwMTNiXDJcMjA0XDFcdTAxM2JcMlwyMDRcMVx1MDEzYlwxMFwyMDRcMVx1MDEzYlw0XDIwNCIrCi0gICAgIlwxXHUwMTNiXDdcMjA0XDFcMFwxXHUwMTNjXDFcMTA1XDFcMjA2XDFcMTA1XDFcMCIrCi0gICAgIlwxXDEwNVwxXHUwMTNjXDFcMTA1XDFcMFwxXDEwNVw0XDBcMlwxMDVcMVwwIisKLSAgICAiXDNcMTA1XDFcMFwxXDEwNVwxMFwwXDFcdTAxM2NcMlwxMDVcMVx1MDEzY1wyXDEwNSIrCi0gICAgIlwxXHUwMTNjXDJcMTA1XDFcMFw0XDEwNVwxXDBcMVx1MDEzY1wxXDEwNVwxXDAiKwotICAgICJcMVwxMDVcMVwwXDFcdTAxM2NcMlwxMDVcNlwwXDFcdTAxM2RcMVwyMTBcMVwyMTEiKwotICAgICJcMVwyMTBcMVwwXDFcMjEwXDFcdTAxM2RcMVwyMTBcMVwwXDFcMjEwXDRcMCIrCi0gICAgIlwyXDIxMFwxXDBcM1wyMTBcMVwwXDFcMjEwXDEwXDBcMVx1MDEzZFwyXDIxMCIrCi0gICAgIlwxXHUwMTNkXDJcMjEwXDFcdTAxM2RcMlwyMTBcMVwwXDRcMjEwXDFcMFwxXHUwMTNkIisKLSAgICAiXDFcMjEwXDFcMFwxXDIxMFwxXDBcMVx1MDEzZFwyXDIxMFw2XDBcMVx1MDEzZSIrCi0gICAgIlwxXDMwNVwxXDMwNlwxXDMwNVwxXDBcMVwzMDVcMVx1MDEzZVwxXDMwNVwxXDAiKwotICAgICJcMVwzMDVcMVwwXDFcMjE2XDJcMFwyXDMwNVwxXDBcM1wzMDVcMVwwIisKLSAgICAiXDFcMzA1XDEwXDBcMVx1MDEzZVwyXDMwNVwxXHUwMTNlXDJcMzA1XDFcdTAxM2VcMlwzMDUiKwotICAgICJcMVwwXDRcMzA1XDFcMFwxXHUwMTNlXDFcMzA1XDFcMFwxXDMwNVwxXDAiKwotICAgICJcMVx1MDEzZVwyXDMwNVw2XDBcMVx1MDEzZlwxXDExM1wxXDIxNVwxXDExM1wxXDAiKwotICAgICJcMVwxMTNcMVx1MDEzZlwxXDExM1wxXDBcMVwxMTNcMVwwXDFcMjE2XDJcMCIrCi0gICAgIlwyXDExM1wxXDBcM1wxMTNcMVwyMTdcMVwxMTNcMTBcMFwxXHUwMTNmXDJcMTEzIisKLSAgICAiXDFcdTAxM2ZcMlwxMTNcMVx1MDEzZlwyXDExM1wxXDBcNFwxMTNcMVwwXDFcdTAxM2YiKwotICAgICJcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXHUwMTNmXDJcMTEzXDZcMFwxXHUwMTQwIisKLSAgICAiXDFcMjIxXDFcMjIyXDFcMjIxXDFcMjIzXDFcMjIxXDFcdTAxNDBcMjdcMjIxXDFcdTAxNDAiKwotICAgICJcMlwyMjFcMVx1MDE0MFwyXDIyMVwxXHUwMTQwXDEwXDIyMVwxXHUwMTQwXDRcMjIxXDFcdTAxNDAiKwotICAgICJcN1wyMjFcMVwwXDFcdTAxNDFcMVwyMjRcMVwyMjVcM1wyMjRcMVx1MDE0MVwxXDIyNCIrCi0gICAgIlwxXDIyM1wyNVwyMjRcMVx1MDE0MVwyXDIyNFwxXHUwMTQxXDJcMjI0XDFcdTAxNDFcMTBcMjI0IisKLSAgICAiXDFcdTAxNDFcNFwyMjRcMVx1MDE0MVw3XDIyNFwxXDBcMVx1MDE0MlwxXDIyN1wxXDIzMCIrCi0gICAgIlwxXDIyN1wxXDBcMVwyMjdcMVx1MDE0MlwxXDIyN1wxXDBcMVwyMjdcNFwwIisKLSAgICAiXDJcMjI3XDFcMFwzXDIyN1wxXDBcMVwyMjdcMTBcMFwxXHUwMTQyXDJcMjI3IisKLSAgICAiXDFcdTAxNDJcMlwyMjdcMVx1MDE0MlwyXDIyN1wxXDBcNFwyMjdcMVwwXDFcdTAxNDIiKwotICAgICJcMVwyMjdcMVwwXDFcMjI3XDFcMFwxXHUwMTQyXDJcMjI3XDZcMFwxXHUwMTQzIisKLSAgICAiXDVcMFwxXHUwMTQzXDFcMzY0XDE1XDBcMlx1MDE0M1w3XDBcMlx1MDE0M1wxXDAiKwotICAgICJcMlx1MDE0M1wxXDBcMlx1MDE0M1w3XDBcMlx1MDE0M1wzXDBcMlx1MDE0M1w3XDAiKwotICAgICJcMVx1MDE0NFw1XDBcMVx1MDE0NFwxNlwwXDJcdTAxNDRcN1wwXDJcdTAxNDRcMVwwIisKLSAgICAiXDJcdTAxNDRcMVwwXDJcdTAxNDRcN1wwXDJcdTAxNDRcM1wwXDJcdTAxNDRcN1wwIisKLSAgICAiXDJcdTAxMWNcMVx1MDExZFwxXHUwMTQ1XDFcMFwzXHUwMTFjXDFcMFwxXHUwMTQ1XDFcdTAxMjEiKwotICAgICJcM1x1MDExY1wyXHUwMTQ1XDRcdTAxMWNcMVwwXDQ1XHUwMTFjXDFcMFwxXHUwMTQ2XDFcdTAxMWMiKwotICAgICJcMVx1MDExZFwxXHUwMTQ1XDJcdTAxMWNcMVx1MDE0NlwyXHUwMTFjXDFcdTAxNDVcMVx1MDE0N1wzXHUwMTFjIisKLSAgICAiXDJcdTAxNDVcMTZcdTAxMWNcMVx1MDE0NlwyXHUwMTFjXDFcdTAxNDZcMlx1MDExY1wxXHUwMTQ2XDEwXHUwMTFjIisKLSAgICAiXDFcdTAxNDZcNFx1MDExY1wxXHUwMTQ2XDdcdTAxMWNcMVwwXDJcdTAxMWZcMVx1MDE0OFwxXDAiKwotICAgICJcMVx1MDE0NVwxMVx1MDExZlwyXDBcNTJcdTAxMWZcMVwwXDJcdTAxMjBcMVx1MDE0OVwxXDAiKwotICAgICJcNFx1MDEyMFwxXHUwMTQ1XDVcdTAxMjBcMlwwXDUyXHUwMTIwXDIzXDBcMVx1MDE0YVw1MFwwIisKLSAgICAiXDFcdTAxNGJcMVwyNVwxXDEzMVwxXDI1XDFcMFwxXDI1XDFcdTAxNGJcMVwyNSIrCi0gICAgIlwxXDBcMVwyNVw0XDBcMlwyNVwxXDBcM1wyNVwxXDBcMVwyNSIrCi0gICAgIlwxMFwwXDFcdTAxNGJcMlwyNVwxXHUwMTRiXDJcMjVcMVx1MDE0YlwyXDI1XDFcMCIrCi0gICAgIlw0XDI1XDFcMFwxXHUwMTRiXDFcMjVcMVwwXDFcMjVcMVwwXDFcdTAxNGIiKwotICAgICJcMlwyNVw2XDBcMVx1MDE0Y1wxXDEzNFwxXDEzNVwxXDEzNFwxXDBcMVwxMzQiKwotICAgICJcMVx1MDE0Y1wxXDEzNFwxXDBcMVwxMzRcNFwwXDJcMTM0XDFcMFwzXDEzNCIrCi0gICAgIlwxXDBcMVwxMzRcMTBcMFwxXHUwMTRjXDJcMTM0XDFcdTAxNGNcMlwxMzRcMVx1MDE0YyIrCi0gICAgIlwyXDEzNFwxXDBcNFwxMzRcMVwwXDFcdTAxNGNcMVwxMzRcMVwwXDFcMTM0IisKLSAgICAiXDFcMFwxXHUwMTRjXDJcMTM0XDZcMFwxXHUwMTRkXDFcMTM2XDFcMTM3XDFcMTM2IisKLSAgICAiXDFcMFwxXDEzNlwxXHUwMTRkXDFcMTM2XDFcMFwxXDEzNlw0XDBcMlwxMzYiKwotICAgICJcMVwwXDNcMTM2XDFcMFwxXDEzNlwxMFwwXDFcdTAxNGRcMlwxMzZcMVx1MDE0ZCIrCi0gICAgIlwyXDEzNlwxXHUwMTRkXDJcMTM2XDFcMFw0XDEzNlwxXDBcMVx1MDE0ZFwxXDEzNiIrCi0gICAgIlwxXDBcMVwxMzZcMVwwXDFcdTAxNGRcMlwxMzZcNTJcMFwyXHUwMTRlXDczXDAiKwotICAgICJcMVx1MDE0ZlwxMDZcMFwyXHUwMTUwXDdcMFwxXHUwMTUxXDFcMzM0XDFcMzM1XDFcMzM0IisKLSAgICAiXDFcMFwxXDMzNFwxXHUwMTUxXDFcMzM0XDFcMFwxXDMzNFwxXHUwMTAwXDNcMCIrCi0gICAgIlwyXDMzNFwxXDBcM1wzMzRcMVwwXDFcMzM0XDEwXDBcMVx1MDE1MVwyXDMzNCIrCi0gICAgIlwxXHUwMTUxXDJcMzM0XDFcdTAxNTFcMlwzMzRcMVwwXDRcMzM0XDFcMFwxXHUwMTUxIisKLSAgICAiXDFcMzM0XDFcMFwxXDMzNFwxXDBcMVx1MDE1MVwyXDMzNFw2XDBcMVx1MDE1MiIrCi0gICAgIlwxXDE0N1wxXDE1MFwxXDE0N1wxXDBcMVwxNDdcMVx1MDE1MlwxXDE0N1wxXDAiKwotICAgICJcMVwxNDdcNFwwXDJcMTQ3XDFcMFwzXDE0N1wxXDI1MVwxXDE0N1wxMFwwIisKLSAgICAiXDFcdTAxNTJcMlwxNDdcMVx1MDE1MlwyXDE0N1wxXHUwMTUyXDJcMTQ3XDFcMFw0XDE0NyIrCi0gICAgIlwxXDBcMVx1MDE1MlwxXDE0N1wxXDBcMVwxNDdcMVwwXDFcdTAxNTJcMlwxNDciKwotICAgICJcNlwwXDFcdTAxNTNcMVwxNTJcMVwxNTNcMVwxNTJcMVwxNTRcMVwxNTJcMVx1MDE1MyIrCi0gICAgIlwyN1wxNTJcMVx1MDE1M1wyXDE1MlwxXHUwMTUzXDJcMTUyXDFcdTAxNTNcMTBcMTUyXDFcdTAxNTMiKwotICAgICJcNFwxNTJcMVx1MDE1M1w3XDE1MlwxXDBcMVx1MDE1NFwxXDE1NVwxXDE1NlwzXDE1NSIrCi0gICAgIlwxXHUwMTU0XDFcMTU1XDFcMTU0XDI1XDE1NVwxXHUwMTU0XDJcMTU1XDFcdTAxNTRcMlwxNTUiKwotICAgICJcMVx1MDE1NFwxMFwxNTVcMVx1MDE1NFw0XDE1NVwxXHUwMTU0XDdcMTU1XDFcMFwxXHUwMTU1IisKLSAgICAiXDFcMTU3XDFcMTYwXDFcMTU3XDFcMTYxXDFcMTU3XDFcdTAxNTVcMjdcMTU3XDFcdTAxNTUiKwotICAgICJcMlwxNTdcMVx1MDE1NVwyXDE1N1wxXHUwMTU1XDEwXDE1N1wxXHUwMTU1XDRcMTU3XDFcdTAxNTUiKwotICAgICJcN1wxNTdcMVwwXDFcdTAxNTZcMVwxNjJcMVwxNjNcM1wxNjJcMVx1MDE1NlwxXDE2MiIrCi0gICAgIlwxXDE2MVwyNVwxNjJcMVx1MDE1NlwyXDE2MlwxXHUwMTU2XDJcMTYyXDFcdTAxNTZcMTBcMTYyIisKLSAgICAiXDFcdTAxNTZcNFwxNjJcMVx1MDE1Nlw3XDE2Mlw0XDBcMVx1MDEzMFwxXDBcMVx1MDEzMCIrCi0gICAgIlwzXDBcMVx1MDEzMFwxXHUwMTBiXDNcMFwyXHUwMTMwXDUzXDBcMVx1MDE1N1wxXHUwMTA3IisKLSAgICAiXDFcdTAxMDhcMVx1MDEwN1wxXDBcMVx1MDEwN1wxXHUwMTU3XDFcdTAxMDdcMVwwXDFcdTAxMDciKwotICAgICJcMVx1MDEwYlwxMVx1MDEwN1wxXDBcMTFcdTAxMDdcMVx1MDE1N1wyXHUwMTA3XDFcdTAxNTdcMlx1MDEwNyIrCi0gICAgIlwxXHUwMTU3XDEwXHUwMTA3XDFcdTAxNTdcNFx1MDEwN1wxXHUwMTU3XDdcdTAxMDdcMVwwXDFcdTAxNTgiKwotICAgICJcMVx1MDEwOVwxXHUwMTMzXDFcdTAxMDlcMVx1MDE1OVwxXHUwMTA5XDFcdTAxNThcMTBcdTAxMDlcMVx1MDE1YSIrCi0gICAgIlwxNlx1MDEwOVwxXHUwMTU4XDJcdTAxMDlcMVx1MDE1OFwyXHUwMTA5XDFcdTAxNThcMTBcdTAxMDlcMVx1MDE1OCIrCi0gICAgIlw0XHUwMTA5XDFcdTAxNThcN1x1MDEwOVwxXDBcMVx1MDE1YlwxXHUwMTBhXDFcdTAxMzRcM1x1MDEwYSIrCi0gICAgIlwxXHUwMTViXDFcdTAxMGFcMVx1MDE1Y1w2XHUwMTBhXDFcdTAxNWRcMTZcdTAxMGFcMVx1MDE1YlwyXHUwMTBhIisKLSAgICAiXDFcdTAxNWJcMlx1MDEwYVwxXHUwMTViXDEwXHUwMTBhXDFcdTAxNWJcNFx1MDEwYVwxXHUwMTViXDdcdTAxMGEiKwotICAgICJcMVwwXDFcdTAxNWVcMVw1MVwxXDE2NVwxXDUxXDFcMFwxXDUxXDFcdTAxNWUiKwotICAgICJcMVw1MVwxXDBcMVw1MVw0XDBcMlw1MVwxXDBcM1w1MVwxXDAiKwotICAgICJcMVw1MVwxMFwwXDFcdTAxNWVcMlw1MVwxXHUwMTVlXDJcNTFcMVx1MDE1ZVwyXDUxIisKLSAgICAiXDFcMFw0XDUxXDFcMFwxXHUwMTVlXDFcNTFcMVwwXDFcNTFcMVwwIisKLSAgICAiXDFcdTAxNWVcMlw1MVw2XDBcMVx1MDE1ZlwxXDU1XDFcMTY3XDFcNTVcMVwwIisKLSAgICAiXDFcNTVcMVx1MDE1ZlwxXDU1XDFcMFwxXDU1XDRcMFwyXDU1XDFcMCIrCi0gICAgIlwzXDU1XDFcMFwxXDU1XDEwXDBcMVx1MDE1ZlwyXDU1XDFcdTAxNWZcMlw1NSIrCi0gICAgIlwxXHUwMTVmXDJcNTVcMVwwXDRcNTVcMVwwXDFcdTAxNWZcMVw1NVwxXDAiKwotICAgICJcMVw1NVwxXDBcMVx1MDE1ZlwyXDU1XDZcMFwxXHUwMTYwXDFcNjJcMVwxNzEiKwotICAgICJcMVw2MlwxXDBcMVw2MlwxXHUwMTYwXDFcNjJcMVwwXDFcNjJcNFwwIisKLSAgICAiXDJcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMTBcMFwxXHUwMTYwXDJcNjIiKwotICAgICJcMVx1MDE2MFwyXDYyXDFcdTAxNjBcMlw2MlwxXDBcNFw2MlwxXDBcMVx1MDE2MCIrCi0gICAgIlwxXDYyXDFcMFwxXDYyXDFcMFwxXHUwMTYwXDJcNjJcNlwwXDFcdTAxNjEiKwotICAgICJcMVw3MlwxXDE3NVwxXDcyXDFcMFwxXDcyXDFcdTAxNjFcMVw3MlwxXDAiKwotICAgICJcMVw3Mlw0XDBcMlw3MlwxXDBcM1w3MlwxXDBcMVw3MlwxMFwwIisKLSAgICAiXDFcdTAxNjFcMlw3MlwxXHUwMTYxXDJcNzJcMVx1MDE2MVwyXDcyXDFcMFw0XDcyIisKLSAgICAiXDFcMFwxXHUwMTYxXDFcNzJcMVwwXDFcNzJcMVwwXDFcdTAxNjFcMlw3MiIrCi0gICAgIlw2XDBcMVx1MDE2MlwxXDEwMFwxXDE3N1wxXDEwMFwxXDBcMVwxMDBcMVx1MDE2MiIrCi0gICAgIlwxXDEwMFwxXDBcMVwxMDBcNFwwXDJcMTAwXDFcMFwzXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMTBcMFwxXHUwMTYyXDJcMTAwXDFcdTAxNjJcMlwxMDBcMVx1MDE2MlwyXDEwMCIrCi0gICAgIlwxXDBcNFwxMDBcMVwwXDFcdTAxNjJcMVwxMDBcMVwwXDFcMTAwXDFcMCIrCi0gICAgIlwxXHUwMTYyXDJcMTAwXDZcMFwxXHUwMTYzXDFcMjAxXDFcMjAyXDFcMjAxXDFcMjAzIisKLSAgICAiXDFcMjAxXDFcdTAxNjNcMjdcMjAxXDFcdTAxNjNcMlwyMDFcMVx1MDE2M1wyXDIwMVwxXHUwMTYzIisKLSAgICAiXDEwXDIwMVwxXHUwMTYzXDRcMjAxXDFcdTAxNjNcN1wyMDFcMVwwXDFcdTAxNjRcMVwyMDQiKwotICAgICJcMVwyMDVcM1wyMDRcMVx1MDE2NFwxXDIwNFwxXDIwM1wyNVwyMDRcMVx1MDE2NFwyXDIwNCIrCi0gICAgIlwxXHUwMTY0XDJcMjA0XDFcdTAxNjRcMTBcMjA0XDFcdTAxNjRcNFwyMDRcMVx1MDE2NFw3XDIwNCIrCi0gICAgIlwxXDBcMVx1MDE2NVwxXDEwNVwxXDIwNlwxXDEwNVwxXDBcMVwxMDVcMVx1MDE2NSIrCi0gICAgIlwxXDEwNVwxXDBcMVwxMDVcNFwwXDJcMTA1XDFcMFwzXDEwNVwxXDAiKwotICAgICJcMVwxMDVcMTBcMFwxXHUwMTY1XDJcMTA1XDFcdTAxNjVcMlwxMDVcMVx1MDE2NVwyXDEwNSIrCi0gICAgIlwxXDBcNFwxMDVcMVwwXDFcdTAxNjVcMVwxMDVcMVwwXDFcMTA1XDFcMCIrCi0gICAgIlwxXHUwMTY1XDJcMTA1XDZcMFwxXHUwMTY2XDFcMjEwXDFcMjExXDFcMjEwXDFcMCIrCi0gICAgIlwxXDIxMFwxXHUwMTY2XDFcMjEwXDFcMFwxXDIxMFw0XDBcMlwyMTBcMVwwIisKLSAgICAiXDNcMjEwXDFcMFwxXDIxMFwxMFwwXDFcdTAxNjZcMlwyMTBcMVx1MDE2NlwyXDIxMCIrCi0gICAgIlwxXHUwMTY2XDJcMjEwXDFcMFw0XDIxMFwxXDBcMVx1MDE2NlwxXDIxMFwxXDAiKwotICAgICJcMVwyMTBcMVwwXDFcdTAxNjZcMlwyMTBcNlwwXDFcdTAxNjdcMVwzMDVcMVwzMDYiKwotICAgICJcMVwzMDVcMVwwXDFcMzA1XDFcdTAxNjdcMVwzMDVcMVwwXDFcMzA1XDFcMCIrCi0gICAgIlwxXDIxNlwyXDBcMlwzMDVcMVwwXDNcMzA1XDFcMFwxXDMwNVwxMFwwIisKLSAgICAiXDFcdTAxNjdcMlwzMDVcMVx1MDE2N1wyXDMwNVwxXHUwMTY3XDJcMzA1XDFcMFw0XDMwNSIrCi0gICAgIlwxXDBcMVx1MDE2N1wxXDMwNVwxXDBcMVwzMDVcMVwwXDFcdTAxNjdcMlwzMDUiKwotICAgICJcNlwwXDFcdTAxNjhcMVwxMTNcMVwyMTVcMVwxMTNcMVwwXDFcMTEzXDFcdTAxNjgiKwotICAgICJcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXDIxNlwyXDBcMlwxMTNcMVwwIisKLSAgICAiXDNcMTEzXDFcMjE3XDFcMTEzXDEwXDBcMVx1MDE2OFwyXDExM1wxXHUwMTY4XDJcMTEzIisKLSAgICAiXDFcdTAxNjhcMlwxMTNcMVwwXDRcMTEzXDFcMFwxXHUwMTY4XDFcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcMVx1MDE2OFwyXDExM1w2XDBcMVx1MDE2OVwxXDIyMVwxXDIyMiIrCi0gICAgIlwxXDIyMVwxXDIyM1wxXDIyMVwxXHUwMTY5XDI3XDIyMVwxXHUwMTY5XDJcMjIxXDFcdTAxNjkiKwotICAgICJcMlwyMjFcMVx1MDE2OVwxMFwyMjFcMVx1MDE2OVw0XDIyMVwxXHUwMTY5XDdcMjIxXDFcMCIrCi0gICAgIlwxXHUwMTZhXDFcMjI0XDFcMjI1XDNcMjI0XDFcdTAxNmFcMVwyMjRcMVwyMjNcMjVcMjI0IisKLSAgICAiXDFcdTAxNmFcMlwyMjRcMVx1MDE2YVwyXDIyNFwxXHUwMTZhXDEwXDIyNFwxXHUwMTZhXDRcMjI0IisKLSAgICAiXDFcdTAxNmFcN1wyMjRcMVwwXDFcdTAxNmJcMVwyMjdcMVwyMzBcMVwyMjdcMVwwIisKLSAgICAiXDFcMjI3XDFcdTAxNmJcMVwyMjdcMVwwXDFcMjI3XDRcMFwyXDIyN1wxXDAiKwotICAgICJcM1wyMjdcMVwwXDFcMjI3XDEwXDBcMVx1MDE2YlwyXDIyN1wxXHUwMTZiXDJcMjI3IisKLSAgICAiXDFcdTAxNmJcMlwyMjdcMVwwXDRcMjI3XDFcMFwxXHUwMTZiXDFcMjI3XDFcMCIrCi0gICAgIlwxXDIyN1wxXDBcMVx1MDE2YlwyXDIyN1w2XDBcMVx1MDE2Y1w1XDBcMVx1MDE2YyIrCi0gICAgIlwxXDM2NFwxNVwwXDJcdTAxNmNcN1wwXDJcdTAxNmNcMVwwXDJcdTAxNmNcMVwwIisKLSAgICAiXDJcdTAxNmNcN1wwXDJcdTAxNmNcM1wwXDJcdTAxNmNcN1wwXDFcdTAxNmRcNVwwIisKLSAgICAiXDFcdTAxNmRcMTZcMFwyXHUwMTZkXDdcMFwyXHUwMTZkXDFcMFwyXHUwMTZkXDFcMCIrCi0gICAgIlwyXHUwMTZkXDdcMFwyXHUwMTZkXDNcMFwyXHUwMTZkXDEyXDBcMVx1MDE0NVwxXDAiKwotICAgICJcMVx1MDE0NVwzXDBcMVx1MDE0NVwxXHUwMTIxXDNcMFwyXHUwMTQ1XDUzXDBcMVx1MDE2ZSIrCi0gICAgIlwxXHUwMTFjXDFcdTAxMWRcMVx1MDExY1wxXDBcMVx1MDExY1wxXHUwMTZlXDFcdTAxMWNcMVwwIisKLSAgICAiXDFcdTAxMWNcMVx1MDEyMVwxMVx1MDExY1wxXDBcMTFcdTAxMWNcMVx1MDE2ZVwyXHUwMTFjXDFcdTAxNmUiKwotICAgICJcMlx1MDExY1wxXHUwMTZlXDEwXHUwMTFjXDFcdTAxNmVcNFx1MDExY1wxXHUwMTZlXDdcdTAxMWNcMVwwIisKLSAgICAiXDFcdTAxNmZcMVx1MDExZlwxXHUwMTQ4XDFcdTAxMWZcMVx1MDE3MFwxXHUwMTFmXDFcdTAxNmZcMTBcdTAxMWYiKwotICAgICJcMVx1MDE3MVwxNlx1MDExZlwxXHUwMTZmXDJcdTAxMWZcMVx1MDE2ZlwyXHUwMTFmXDFcdTAxNmZcMTBcdTAxMWYiKwotICAgICJcMVx1MDE2Zlw0XHUwMTFmXDFcdTAxNmZcN1x1MDExZlwxXDBcMVx1MDE3MlwxXHUwMTIwXDFcdTAxNDkiKwotICAgICJcM1x1MDEyMFwxXHUwMTcyXDFcdTAxMjBcMVx1MDE3M1w2XHUwMTIwXDFcdTAxNzRcMTZcdTAxMjBcMVx1MDE3MiIrCi0gICAgIlwyXHUwMTIwXDFcdTAxNzJcMlx1MDEyMFwxXHUwMTcyXDEwXHUwMTIwXDFcdTAxNzJcNFx1MDEyMFwxXHUwMTcyIisKLSAgICAiXDdcdTAxMjBcNDdcMFwxXHUwMTc1XDI0XDBcMlwyNVwxXDEzMVwxXDI1XDFcMCIrCi0gICAgIlwzXDI1XDFcMFwxXDI1XDRcMFwyXDI1XDFcMFwzXDI1XDFcMCIrCi0gICAgIlwxXDI1XDEwXDBcMTFcMjVcMVwwXDRcMjVcMVwwXDJcMjVcMVwwIisKLSAgICAiXDFcMjVcMVwwXDNcMjVcNlwwXDFcdTAxNzZcMVwxMzRcMVwxMzVcMVwxMzQiKwotICAgICJcMVwwXDFcMTM0XDFcdTAxNzZcMVwxMzRcMVwwXDFcMTM0XDRcMFwyXDEzNCIrCi0gICAgIlwxXDBcM1wxMzRcMVwwXDFcMTM0XDEwXDBcMVx1MDE3NlwyXDEzNFwxXHUwMTc2IisKLSAgICAiXDJcMTM0XDFcdTAxNzZcMlwxMzRcMVwwXDRcMTM0XDFcMFwxXHUwMTc2XDFcMTM0IisKLSAgICAiXDFcMFwxXDEzNFwxXDBcMVx1MDE3NlwyXDEzNFw2XDBcMVx1MDE3N1wxXDEzNiIrCi0gICAgIlwxXDEzN1wxXDEzNlwxXDBcMVwxMzZcMVx1MDE3N1wxXDEzNlwxXDBcMVwxMzYiKwotICAgICJcNFwwXDJcMTM2XDFcMFwzXDEzNlwxXDBcMVwxMzZcMTBcMFwxXHUwMTc3IisKLSAgICAiXDJcMTM2XDFcdTAxNzdcMlwxMzZcMVx1MDE3N1wyXDEzNlwxXDBcNFwxMzZcMVwwIisKLSAgICAiXDFcdTAxNzdcMVwxMzZcMVwwXDFcMTM2XDFcMFwxXHUwMTc3XDJcMTM2XDU0XDAiKwotICAgICJcMVx1MDE3OFw2NVwwXDJcdTAxNzlcMzBcMFwxXHUwMTdhXDFcMzM0XDFcMzM1XDFcMzM0IisKLSAgICAiXDFcMFwxXDMzNFwxXHUwMTdhXDFcMzM0XDFcMFwxXDMzNFwxXHUwMTAwXDNcMCIrCi0gICAgIlwyXDMzNFwxXDBcM1wzMzRcMVwwXDFcMzM0XDEwXDBcMVx1MDE3YVwyXDMzNCIrCi0gICAgIlwxXHUwMTdhXDJcMzM0XDFcdTAxN2FcMlwzMzRcMVwwXDRcMzM0XDFcMFwxXHUwMTdhIisKLSAgICAiXDFcMzM0XDFcMFwxXDMzNFwxXDBcMVx1MDE3YVwyXDMzNFw2XDBcMVx1MDE3YiIrCi0gICAgIlwxXDE0N1wxXDE1MFwxXDE0N1wxXDBcMVwxNDdcMVx1MDE3YlwxXDE0N1wxXDAiKwotICAgICJcMVwxNDdcNFwwXDJcMTQ3XDFcMFwzXDE0N1wxXDI1MVwxXDE0N1wxMFwwIisKLSAgICAiXDFcdTAxN2JcMlwxNDdcMVx1MDE3YlwyXDE0N1wxXHUwMTdiXDJcMTQ3XDFcMFw0XDE0NyIrCi0gICAgIlwxXDBcMVx1MDE3YlwxXDE0N1wxXDBcMVwxNDdcMVwwXDFcdTAxN2JcMlwxNDciKwotICAgICJcNlwwXDFcdTAxN2NcMVwxNTJcMVwxNTNcMVwxNTJcMVwxNTRcMVwxNTJcMVx1MDE3YyIrCi0gICAgIlwyN1wxNTJcMVx1MDE3Y1wyXDE1MlwxXHUwMTdjXDJcMTUyXDFcdTAxN2NcMTBcMTUyXDFcdTAxN2MiKwotICAgICJcNFwxNTJcMVx1MDE3Y1w3XDE1MlwxXDBcMVx1MDE3ZFwxXDE1NVwxXDE1NlwzXDE1NSIrCi0gICAgIlwxXHUwMTdkXDFcMTU1XDFcMTU0XDI1XDE1NVwxXHUwMTdkXDJcMTU1XDFcdTAxN2RcMlwxNTUiKwotICAgICJcMVx1MDE3ZFwxMFwxNTVcMVx1MDE3ZFw0XDE1NVwxXHUwMTdkXDdcMTU1XDFcMFwxXHUwMTdlIisKLSAgICAiXDFcMTU3XDFcMTYwXDFcMTU3XDFcMTYxXDFcMTU3XDFcdTAxN2VcMjdcMTU3XDFcdTAxN2UiKwotICAgICJcMlwxNTdcMVx1MDE3ZVwyXDE1N1wxXHUwMTdlXDEwXDE1N1wxXHUwMTdlXDRcMTU3XDFcdTAxN2UiKwotICAgICJcN1wxNTdcMVwwXDFcdTAxN2ZcMVwxNjJcMVwxNjNcM1wxNjJcMVx1MDE3ZlwxXDE2MiIrCi0gICAgIlwxXDE2MVwyNVwxNjJcMVx1MDE3ZlwyXDE2MlwxXHUwMTdmXDJcMTYyXDFcdTAxN2ZcMTBcMTYyIisKLSAgICAiXDFcdTAxN2ZcNFwxNjJcMVx1MDE3Zlw3XDE2MlwxXDBcMVx1MDE4MFwxXHUwMTA3XDFcdTAxMDgiKwotICAgICJcMVx1MDEwN1wxXDBcMVx1MDEwN1wxXHUwMTgwXDFcdTAxMDdcMVwwXDFcdTAxMDdcMVx1MDEwYiIrCi0gICAgIlwxMVx1MDEwN1wxXDBcMTFcdTAxMDdcMVx1MDE4MFwyXHUwMTA3XDFcdTAxODBcMlx1MDEwN1wxXHUwMTgwIisKLSAgICAiXDEwXHUwMTA3XDFcdTAxODBcNFx1MDEwN1wxXHUwMTgwXDdcdTAxMDdcMVwwXDFcdTAxODFcMVx1MDEwOSIrCi0gICAgIlwxXHUwMTMzXDFcdTAxMDlcMVx1MDEzMFwxXHUwMTA5XDFcdTAxODFcMjdcdTAxMDlcMVx1MDE4MVwyXHUwMTA5IisKLSAgICAiXDFcdTAxODFcMlx1MDEwOVwxXHUwMTgxXDEwXHUwMTA5XDFcdTAxODFcNFx1MDEwOVwxXHUwMTgxXDdcdTAxMDkiKwotICAgICJcMVwwXDJcdTAxMDlcMVx1MDEzM1wyXHUwMTMwXDFcdTAxNTlcM1x1MDEwOVwxXHUwMTU5XDFcdTAxODIiKwotICAgICJcM1x1MDEwOVwyXHUwMTMwXDUyXHUwMTA5XDFcMFwyXHUwMTA5XDFcdTAxMzNcMVwwXDFcdTAxMzAiKwotICAgICJcMTJcdTAxMDlcMVwwXDUyXHUwMTA5XDFcMFwxXHUwMTgzXDFcdTAxMGFcMVx1MDEzNFwzXHUwMTBhIisKLSAgICAiXDFcdTAxODNcMVx1MDEwYVwxXHUwMTMwXDI1XHUwMTBhXDFcdTAxODNcMlx1MDEwYVwxXHUwMTgzXDJcdTAxMGEiKwotICAgICJcMVx1MDE4M1wxMFx1MDEwYVwxXHUwMTgzXDRcdTAxMGFcMVx1MDE4M1w3XHUwMTBhXDFcMFwyXHUwMTBhIisKLSAgICAiXDFcdTAxMzRcMVx1MDEzMFwxXHUwMTBhXDFcdTAxNWNcMlx1MDEwYVwxXHUwMTMwXDFcdTAxNWNcMVx1MDE4NCIrCi0gICAgIlwzXHUwMTBhXDJcdTAxMzBcNTJcdTAxMGFcMVwwXDJcdTAxMGFcMVx1MDEzNFwxXDBcNFx1MDEwYSIrCi0gICAgIlwxXHUwMTMwXDZcdTAxMGFcMVwwXDUyXHUwMTBhXDFcMFwyXDUxXDFcMTY1XDFcNTEiKwotICAgICJcMVwwXDNcNTFcMVwwXDFcNTFcNFwwXDJcNTFcMVwwXDNcNTEiKwotICAgICJcMVwwXDFcNTFcMTBcMFwxMVw1MVwxXDBcNFw1MVwxXDBcMlw1MSIrCi0gICAgIlwxXDBcMVw1MVwxXDBcM1w1MVw2XDBcMlw1NVwxXDE2N1wxXDU1IisKLSAgICAiXDFcMFwzXDU1XDFcMFwxXDU1XDRcMFwyXDU1XDFcMFwzXDU1IisKLSAgICAiXDFcMFwxXDU1XDEwXDBcMTFcNTVcMVwwXDRcNTVcMVwwXDJcNTUiKwotICAgICJcMVwwXDFcNTVcMVwwXDNcNTVcNlwwXDJcNjJcMVwxNzFcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2Mlw0XDBcMlw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxMFwwXDExXDYyXDFcMFw0XDYyXDFcMFwyXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwzXDYyXDZcMFwyXDcyXDFcMTc1XDFcNzIiKwotICAgICJcMVwwXDNcNzJcMVwwXDFcNzJcNFwwXDJcNzJcMVwwXDNcNzIiKwotICAgICJcMVwwXDFcNzJcMTBcMFwxMVw3MlwxXDBcNFw3MlwxXDBcMlw3MiIrCi0gICAgIlwxXDBcMVw3MlwxXDBcM1w3Mlw2XDBcMlwxMDBcMVwxNzdcMVwxMDAiKwotICAgICJcMVwwXDNcMTAwXDFcMFwxXDEwMFw0XDBcMlwxMDBcMVwwXDNcMTAwIisKLSAgICAiXDFcMFwxXDEwMFwxMFwwXDExXDEwMFwxXDBcNFwxMDBcMVwwXDJcMTAwIisKLSAgICAiXDFcMFwxXDEwMFwxXDBcM1wxMDBcNlwwXDFcdTAxODVcMVwyMDFcMVwyMDIiKwotICAgICJcMVwyMDFcMVwyMDNcMVwyMDFcMVx1MDE4NVwyN1wyMDFcMVx1MDE4NVwyXDIwMVwxXHUwMTg1IisKLSAgICAiXDJcMjAxXDFcdTAxODVcMTBcMjAxXDFcdTAxODVcNFwyMDFcMVx1MDE4NVw3XDIwMVwxXDAiKwotICAgICJcMVx1MDE4NlwxXDIwNFwxXDIwNVwzXDIwNFwxXHUwMTg2XDFcMjA0XDFcMjAzXDI1XDIwNCIrCi0gICAgIlwxXHUwMTg2XDJcMjA0XDFcdTAxODZcMlwyMDRcMVx1MDE4NlwxMFwyMDRcMVx1MDE4Nlw0XDIwNCIrCi0gICAgIlwxXHUwMTg2XDdcMjA0XDFcMFwyXDEwNVwxXDIwNlwxXDEwNVwxXDBcM1wxMDUiKwotICAgICJcMVwwXDFcMTA1XDRcMFwyXDEwNVwxXDBcM1wxMDVcMVwwXDFcMTA1IisKLSAgICAiXDEwXDBcMTFcMTA1XDFcMFw0XDEwNVwxXDBcMlwxMDVcMVwwXDFcMTA1IisKLSAgICAiXDFcMFwzXDEwNVw2XDBcMVx1MDE4N1wxXDIxMFwxXDIxMVwxXDIxMFwxXDAiKwotICAgICJcMVwyMTBcMVx1MDE4N1wxXDIxMFwxXDBcMVwyMTBcNFwwXDJcMjEwXDFcMCIrCi0gICAgIlwzXDIxMFwxXDBcMVwyMTBcMTBcMFwxXHUwMTg3XDJcMjEwXDFcdTAxODdcMlwyMTAiKwotICAgICJcMVx1MDE4N1wyXDIxMFwxXDBcNFwyMTBcMVwwXDFcdTAxODdcMVwyMTBcMVwwIisKLSAgICAiXDFcMjEwXDFcMFwxXHUwMTg3XDJcMjEwXDZcMFwxXHUwMTg4XDFcMzA1XDFcMzA2IisKLSAgICAiXDFcMzA1XDFcMFwxXDMwNVwxXHUwMTg4XDFcMzA1XDFcMFwxXDMwNVwxXDAiKwotICAgICJcMVwyMTZcMlwwXDJcMzA1XDFcMFwzXDMwNVwxXDBcMVwzMDVcMTBcMCIrCi0gICAgIlwxXHUwMTg4XDJcMzA1XDFcdTAxODhcMlwzMDVcMVx1MDE4OFwyXDMwNVwxXDBcNFwzMDUiKwotICAgICJcMVwwXDFcdTAxODhcMVwzMDVcMVwwXDFcMzA1XDFcMFwxXHUwMTg4XDJcMzA1IisKLSAgICAiXDZcMFwyXDExM1wxXDIxNVwxXDExM1wxXDBcM1wxMTNcMVwwXDFcMTEzIisKLSAgICAiXDFcMFwxXDIxNlwyXDBcMlwxMTNcMVwwXDNcMTEzXDFcMjE3XDFcMTEzIisKLSAgICAiXDEwXDBcMTFcMTEzXDFcMFw0XDExM1wxXDBcMlwxMTNcMVwwXDFcMTEzIisKLSAgICAiXDFcMFwzXDExM1w2XDBcMVx1MDE4OVwxXDIyMVwxXDIyMlwxXDIyMVwxXDIyMyIrCi0gICAgIlwxXDIyMVwxXHUwMTg5XDI3XDIyMVwxXHUwMTg5XDJcMjIxXDFcdTAxODlcMlwyMjFcMVx1MDE4OSIrCi0gICAgIlwxMFwyMjFcMVx1MDE4OVw0XDIyMVwxXHUwMTg5XDdcMjIxXDFcMFwxXHUwMThhXDFcMjI0IisKLSAgICAiXDFcMjI1XDNcMjI0XDFcdTAxOGFcMVwyMjRcMVwyMjNcMjVcMjI0XDFcdTAxOGFcMlwyMjQiKwotICAgICJcMVx1MDE4YVwyXDIyNFwxXHUwMThhXDEwXDIyNFwxXHUwMThhXDRcMjI0XDFcdTAxOGFcN1wyMjQiKwotICAgICJcMVwwXDFcdTAxOGJcMVwyMjdcMVwyMzBcMVwyMjdcMVwwXDFcMjI3XDFcdTAxOGIiKwotICAgICJcMVwyMjdcMVwwXDFcMjI3XDRcMFwyXDIyN1wxXDBcM1wyMjdcMVwwIisKLSAgICAiXDFcMjI3XDEwXDBcMVx1MDE4YlwyXDIyN1wxXHUwMThiXDJcMjI3XDFcdTAxOGJcMlwyMjciKwotICAgICJcMVwwXDRcMjI3XDFcMFwxXHUwMThiXDFcMjI3XDFcMFwxXDIyN1wxXDAiKwotICAgICJcMVx1MDE4YlwyXDIyN1w2XDBcMVx1MDE4Y1w1XDBcMVx1MDE4Y1wxXDM2NFwxNVwwIisKLSAgICAiXDJcdTAxOGNcN1wwXDJcdTAxOGNcMVwwXDJcdTAxOGNcMVwwXDJcdTAxOGNcN1wwIisKLSAgICAiXDJcdTAxOGNcM1wwXDJcdTAxOGNcN1wwXDFcdTAxOGRcNVwwXDFcdTAxOGRcMTZcMCIrCi0gICAgIlwyXHUwMThkXDdcMFwyXHUwMThkXDFcMFwyXHUwMThkXDFcMFwyXHUwMThkXDdcMCIrCi0gICAgIlwyXHUwMThkXDNcMFwyXHUwMThkXDdcMFwxXHUwMThlXDFcdTAxMWNcMVx1MDExZFwxXHUwMTFjIisKLSAgICAiXDFcMFwxXHUwMTFjXDFcdTAxOGVcMVx1MDExY1wxXDBcMVx1MDExY1wxXHUwMTIxXDExXHUwMTFjIisKLSAgICAiXDFcMFwxMVx1MDExY1wxXHUwMThlXDJcdTAxMWNcMVx1MDE4ZVwyXHUwMTFjXDFcdTAxOGVcMTBcdTAxMWMiKwotICAgICJcMVx1MDE4ZVw0XHUwMTFjXDFcdTAxOGVcN1x1MDExY1wxXDBcMVx1MDE4ZlwxXHUwMTFmXDFcdTAxNDgiKwotICAgICJcMVx1MDExZlwxXHUwMTQ1XDFcdTAxMWZcMVx1MDE4ZlwyN1x1MDExZlwxXHUwMThmXDJcdTAxMWZcMVx1MDE4ZiIrCi0gICAgIlwyXHUwMTFmXDFcdTAxOGZcMTBcdTAxMWZcMVx1MDE4Zlw0XHUwMTFmXDFcdTAxOGZcN1x1MDExZlwxXDAiKwotICAgICJcMlx1MDExZlwxXHUwMTQ4XDJcdTAxNDVcMVx1MDE3MFwzXHUwMTFmXDFcdTAxNzBcMVx1MDE5MFwzXHUwMTFmIisKLSAgICAiXDJcdTAxNDVcNTJcdTAxMWZcMVwwXDJcdTAxMWZcMVx1MDE0OFwxXDBcMVx1MDE0NVwxMlx1MDExZiIrCi0gICAgIlwxXDBcNTJcdTAxMWZcMVwwXDFcdTAxOTFcMVx1MDEyMFwxXHUwMTQ5XDNcdTAxMjBcMVx1MDE5MSIrCi0gICAgIlwxXHUwMTIwXDFcdTAxNDVcMjVcdTAxMjBcMVx1MDE5MVwyXHUwMTIwXDFcdTAxOTFcMlx1MDEyMFwxXHUwMTkxIisKLSAgICAiXDEwXHUwMTIwXDFcdTAxOTFcNFx1MDEyMFwxXHUwMTkxXDdcdTAxMjBcMVwwXDJcdTAxMjBcMVx1MDE0OSIrCi0gICAgIlwxXHUwMTQ1XDFcdTAxMjBcMVx1MDE3M1wyXHUwMTIwXDFcdTAxNDVcMVx1MDE3M1wxXHUwMTkyXDNcdTAxMjAiKwotICAgICJcMlx1MDE0NVw1Mlx1MDEyMFwxXDBcMlx1MDEyMFwxXHUwMTQ5XDFcMFw0XHUwMTIwXDFcdTAxNDUiKwotICAgICJcNlx1MDEyMFwxXDBcNTJcdTAxMjBcNDJcMFwyXHUwMTkzXDMwXDBcMlwxMzRcMVwxMzUiKwotICAgICJcMVwxMzRcMVwwXDNcMTM0XDFcMFwxXDEzNFw0XDBcMlwxMzRcMVwwIisKLSAgICAiXDNcMTM0XDFcMFwxXDEzNFwxMFwwXDExXDEzNFwxXDBcNFwxMzRcMVwwIisKLSAgICAiXDJcMTM0XDFcMFwxXDEzNFwxXDBcM1wxMzRcNlwwXDJcMTM2XDFcMTM3IisKLSAgICAiXDFcMTM2XDFcMFwzXDEzNlwxXDBcMVwxMzZcNFwwXDJcMTM2XDFcMCIrCi0gICAgIlwzXDEzNlwxXDBcMVwxMzZcMTBcMFwxMVwxMzZcMVwwXDRcMTM2XDFcMCIrCi0gICAgIlwyXDEzNlwxXDBcMVwxMzZcMVwwXDNcMTM2XDQ0XDBcMlx1MDE5NFwzM1wwIisKLSAgICAiXDFcdTAxOTVcMVwzMzRcMVwzMzVcMVwzMzRcMVwwXDFcMzM0XDFcdTAxOTVcMVwzMzQiKwotICAgICJcMVwwXDFcMzM0XDFcdTAxMDBcM1wwXDJcMzM0XDFcMFwzXDMzNFwxXDAiKwotICAgICJcMVwzMzRcMTBcMFwxXHUwMTk1XDJcMzM0XDFcdTAxOTVcMlwzMzRcMVx1MDE5NVwyXDMzNCIrCi0gICAgIlwxXDBcNFwzMzRcMVwwXDFcdTAxOTVcMVwzMzRcMVwwXDFcMzM0XDFcMCIrCi0gICAgIlwxXHUwMTk1XDJcMzM0XDZcMFwyXDE0N1wxXDE1MFwxXDE0N1wxXDBcM1wxNDciKwotICAgICJcMVwwXDFcMTQ3XDRcMFwyXDE0N1wxXDBcM1wxNDdcMVwyNTFcMVwxNDciKwotICAgICJcMTBcMFwxMVwxNDdcMVwwXDRcMTQ3XDFcMFwyXDE0N1wxXDBcMVwxNDciKwotICAgICJcMVwwXDNcMTQ3XDZcMFwyXDE1MlwxXDE1M1wxXDE1MlwxXDE1NFw2NVwxNTIiKwotICAgICJcMVwwXDJcMTU1XDFcMTU2XDVcMTU1XDFcMTU0XDYxXDE1NVwxXDBcMlwxNTciKwotICAgICJcMVwxNjBcMVwxNTdcMVwxNjFcNjVcMTU3XDFcMFwyXDE2MlwxXDE2M1w1XDE2MiIrCi0gICAgIlwxXDE2MVw2MVwxNjJcMVwwXDFcdTAxOTZcMVx1MDEwN1wxXHUwMTA4XDFcdTAxMDdcMVwwIisKLSAgICAiXDFcdTAxMDdcMVx1MDE5NlwxXHUwMTA3XDFcMFwxXHUwMTA3XDFcdTAxMGJcMTFcdTAxMDdcMVwwIisKLSAgICAiXDExXHUwMTA3XDFcdTAxOTZcMlx1MDEwN1wxXHUwMTk2XDJcdTAxMDdcMVx1MDE5NlwxMFx1MDEwN1wxXHUwMTk2IisKLSAgICAiXDRcdTAxMDdcMVx1MDE5Nlw3XHUwMTA3XDFcMFwxXHUwMTk3XDFcdTAxMDlcMVx1MDEzM1wxXHUwMTA5IisKLSAgICAiXDFcdTAxMzBcMVx1MDEwOVwxXHUwMTk3XDI3XHUwMTA5XDFcdTAxOTdcMlx1MDEwOVwxXHUwMTk3XDJcdTAxMDkiKwotICAgICJcMVx1MDE5N1wxMFx1MDEwOVwxXHUwMTk3XDRcdTAxMDlcMVx1MDE5N1w3XHUwMTA5XDFcMFwxXHUwMTk4IisKLSAgICAiXDFcdTAxMGFcMVx1MDEzNFwzXHUwMTBhXDFcdTAxOThcMVx1MDEwYVwxXHUwMTMwXDI1XHUwMTBhXDFcdTAxOTgiKwotICAgICJcMlx1MDEwYVwxXHUwMTk4XDJcdTAxMGFcMVx1MDE5OFwxMFx1MDEwYVwxXHUwMTk4XDRcdTAxMGFcMVx1MDE5OCIrCi0gICAgIlw3XHUwMTBhXDFcMFwyXDIwMVwxXDIwMlwxXDIwMVwxXDIwM1w2NVwyMDFcMVwwIisKLSAgICAiXDJcMjA0XDFcMjA1XDVcMjA0XDFcMjAzXDYxXDIwNFwxXDBcMlwyMTBcMVwyMTEiKwotICAgICJcMVwyMTBcMVwwXDNcMjEwXDFcMFwxXDIxMFw0XDBcMlwyMTBcMVwwIisKLSAgICAiXDNcMjEwXDFcMFwxXDIxMFwxMFwwXDExXDIxMFwxXDBcNFwyMTBcMVwwIisKLSAgICAiXDJcMjEwXDFcMFwxXDIxMFwxXDBcM1wyMTBcNlwwXDFcdTAxOTlcMVwzMDUiKwotICAgICJcMVwzMDZcMVwzMDVcMVwwXDFcMzA1XDFcdTAxOTlcMVwzMDVcMVwwXDFcMzA1IisKLSAgICAiXDFcMFwxXDIxNlwyXDBcMlwzMDVcMVwwXDNcMzA1XDFcMFwxXDMwNSIrCi0gICAgIlwxMFwwXDFcdTAxOTlcMlwzMDVcMVx1MDE5OVwyXDMwNVwxXHUwMTk5XDJcMzA1XDFcMCIrCi0gICAgIlw0XDMwNVwxXDBcMVx1MDE5OVwxXDMwNVwxXDBcMVwzMDVcMVwwXDFcdTAxOTkiKwotICAgICJcMlwzMDVcNlwwXDJcMjIxXDFcMjIyXDFcMjIxXDFcMjIzXDY1XDIyMVwxXDAiKwotICAgICJcMlwyMjRcMVwyMjVcNVwyMjRcMVwyMjNcNjFcMjI0XDFcMFwyXDIyN1wxXDIzMCIrCi0gICAgIlwxXDIyN1wxXDBcM1wyMjdcMVwwXDFcMjI3XDRcMFwyXDIyN1wxXDAiKwotICAgICJcM1wyMjdcMVwwXDFcMjI3XDEwXDBcMTFcMjI3XDFcMFw0XDIyN1wxXDAiKwotICAgICJcMlwyMjdcMVwwXDFcMjI3XDFcMFwzXDIyN1wxNVwwXDFcMzY0XDYzXDAiKwotICAgICJcMVx1MDE5YVw1XDBcMVx1MDE5YVwxNlwwXDJcdTAxOWFcN1wwXDJcdTAxOWFcMVwwIisKLSAgICAiXDJcdTAxOWFcMVwwXDJcdTAxOWFcN1wwXDJcdTAxOWFcM1wwXDJcdTAxOWFcN1wwIisKLSAgICAiXDFcdTAxOWJcMVx1MDExY1wxXHUwMTFkXDFcdTAxMWNcMVwwXDFcdTAxMWNcMVx1MDE5YlwxXHUwMTFjIisKLSAgICAiXDFcMFwxXHUwMTFjXDFcdTAxMjFcMTFcdTAxMWNcMVwwXDExXHUwMTFjXDFcdTAxOWJcMlx1MDExYyIrCi0gICAgIlwxXHUwMTliXDJcdTAxMWNcMVx1MDE5YlwxMFx1MDExY1wxXHUwMTliXDRcdTAxMWNcMVx1MDE5Ylw3XHUwMTFjIisKLSAgICAiXDFcMFwxXHUwMTljXDFcdTAxMWZcMVx1MDE0OFwxXHUwMTFmXDFcdTAxNDVcMVx1MDExZlwxXHUwMTljIisKLSAgICAiXDI3XHUwMTFmXDFcdTAxOWNcMlx1MDExZlwxXHUwMTljXDJcdTAxMWZcMVx1MDE5Y1wxMFx1MDExZlwxXHUwMTljIisKLSAgICAiXDRcdTAxMWZcMVx1MDE5Y1w3XHUwMTFmXDFcMFwxXHUwMTlkXDFcdTAxMjBcMVx1MDE0OVwzXHUwMTIwIisKLSAgICAiXDFcdTAxOWRcMVx1MDEyMFwxXHUwMTQ1XDI1XHUwMTIwXDFcdTAxOWRcMlx1MDEyMFwxXHUwMTlkXDJcdTAxMjAiKwotICAgICJcMVx1MDE5ZFwxMFx1MDEyMFwxXHUwMTlkXDRcdTAxMjBcMVx1MDE5ZFw3XHUwMTIwXDY1XDBcMVx1MDE5ZSIrCi0gICAgIlw1MlwwXDJcdTAxOWZcMjVcMFwxXHUwMWEwXDFcMzM0XDFcMzM1XDFcMzM0XDFcMCIrCi0gICAgIlwxXDMzNFwxXHUwMWEwXDFcMzM0XDFcMFwxXDMzNFwxXHUwMTAwXDNcMFwyXDMzNCIrCi0gICAgIlwxXDBcM1wzMzRcMVwwXDFcMzM0XDEwXDBcMVx1MDFhMFwyXDMzNFwxXHUwMWEwIisKLSAgICAiXDJcMzM0XDFcdTAxYTBcMlwzMzRcMVwwXDRcMzM0XDFcMFwxXHUwMWEwXDFcMzM0IisKLSAgICAiXDFcMFwxXDMzNFwxXDBcMVx1MDFhMFwyXDMzNFw2XDBcMVx1MDFhMVwxXHUwMTA3IisKLSAgICAiXDFcdTAxMDhcMVx1MDEwN1wxXDBcMVx1MDEwN1wxXHUwMWExXDFcdTAxMDdcMVwwXDFcdTAxMDciKwotICAgICJcMVx1MDEwYlwxMVx1MDEwN1wxXDBcMTFcdTAxMDdcMVx1MDFhMVwyXHUwMTA3XDFcdTAxYTFcMlx1MDEwNyIrCi0gICAgIlwxXHUwMWExXDEwXHUwMTA3XDFcdTAxYTFcNFx1MDEwN1wxXHUwMWExXDdcdTAxMDdcMVwwXDFcdTAxYTIiKwotICAgICJcMVx1MDEwOVwxXHUwMTMzXDFcdTAxMDlcMVx1MDEzMFwxXHUwMTA5XDFcdTAxYTJcMjdcdTAxMDlcMVx1MDFhMiIrCi0gICAgIlwyXHUwMTA5XDFcdTAxYTJcMlx1MDEwOVwxXHUwMWEyXDEwXHUwMTA5XDFcdTAxYTJcNFx1MDEwOVwxXHUwMWEyIisKLSAgICAiXDdcdTAxMDlcMVwwXDFcdTAxYTNcMVx1MDEwYVwxXHUwMTM0XDNcdTAxMGFcMVx1MDFhM1wxXHUwMTBhIisKLSAgICAiXDFcdTAxMzBcMjVcdTAxMGFcMVx1MDFhM1wyXHUwMTBhXDFcdTAxYTNcMlx1MDEwYVwxXHUwMWEzXDEwXHUwMTBhIisKLSAgICAiXDFcdTAxYTNcNFx1MDEwYVwxXHUwMWEzXDdcdTAxMGFcMVwwXDJcMzA1XDFcMzA2XDFcMzA1IisKLSAgICAiXDFcMFwzXDMwNVwxXDBcMVwzMDVcMVwwXDFcMjE2XDJcMFwyXDMwNSIrCi0gICAgIlwxXDBcM1wzMDVcMVwwXDFcMzA1XDEwXDBcMTFcMzA1XDFcMFw0XDMwNSIrCi0gICAgIlwxXDBcMlwzMDVcMVwwXDFcMzA1XDFcMFwzXDMwNVw2XDBcMVx1MDFhNCIrCi0gICAgIlw1XDBcMVx1MDFhNFwxNlwwXDJcdTAxYTRcN1wwXDJcdTAxYTRcMVwwXDJcdTAxYTQiKwotICAgICJcMVwwXDJcdTAxYTRcN1wwXDJcdTAxYTRcM1wwXDJcdTAxYTRcN1wwXDFcdTAxYTUiKwotICAgICJcMVx1MDExY1wxXHUwMTFkXDFcdTAxMWNcMVwwXDFcdTAxMWNcMVx1MDFhNVwxXHUwMTFjXDFcMCIrCi0gICAgIlwxXHUwMTFjXDFcdTAxMjFcMTFcdTAxMWNcMVwwXDExXHUwMTFjXDFcdTAxYTVcMlx1MDExY1wxXHUwMWE1IisKLSAgICAiXDJcdTAxMWNcMVx1MDFhNVwxMFx1MDExY1wxXHUwMWE1XDRcdTAxMWNcMVx1MDFhNVw3XHUwMTFjXDFcMCIrCi0gICAgIlwxXHUwMWE2XDFcdTAxMWZcMVx1MDE0OFwxXHUwMTFmXDFcdTAxNDVcMVx1MDExZlwxXHUwMWE2XDI3XHUwMTFmIisKLSAgICAiXDFcdTAxYTZcMlx1MDExZlwxXHUwMWE2XDJcdTAxMWZcMVx1MDFhNlwxMFx1MDExZlwxXHUwMWE2XDRcdTAxMWYiKwotICAgICJcMVx1MDFhNlw3XHUwMTFmXDFcMFwxXHUwMWE3XDFcdTAxMjBcMVx1MDE0OVwzXHUwMTIwXDFcdTAxYTciKwotICAgICJcMVx1MDEyMFwxXHUwMTQ1XDI1XHUwMTIwXDFcdTAxYTdcMlx1MDEyMFwxXHUwMWE3XDJcdTAxMjBcMVx1MDFhNyIrCi0gICAgIlwxMFx1MDEyMFwxXHUwMWE3XDRcdTAxMjBcMVx1MDFhN1w3XHUwMTIwXDQ3XDBcMVx1MDFhOFwyNFwwIisKLSAgICAiXDJcMzM0XDFcMzM1XDFcMzM0XDFcMFwzXDMzNFwxXDBcMVwzMzRcMVx1MDEwMCIrCi0gICAgIlwzXDBcMlwzMzRcMVwwXDNcMzM0XDFcMFwxXDMzNFwxMFwwXDExXDMzNCIrCi0gICAgIlwxXDBcNFwzMzRcMVwwXDJcMzM0XDFcMFwxXDMzNFwxXDBcM1wzMzQiKwotICAgICJcNlwwXDFcdTAxYTlcMVx1MDEwN1wxXHUwMTA4XDFcdTAxMDdcMVwwXDFcdTAxMDdcMVx1MDFhOSIrCi0gICAgIlwxXHUwMTA3XDFcMFwxXHUwMTA3XDFcdTAxMGJcMTFcdTAxMDdcMVwwXDExXHUwMTA3XDFcdTAxYTkiKwotICAgICJcMlx1MDEwN1wxXHUwMWE5XDJcdTAxMDdcMVx1MDFhOVwxMFx1MDEwN1wxXHUwMWE5XDRcdTAxMDdcMVx1MDFhOSIrCi0gICAgIlw3XHUwMTA3XDFcMFwxXHUwMWFhXDFcdTAxMDlcMVx1MDEzM1wxXHUwMTA5XDFcdTAxMzBcMVx1MDEwOSIrCi0gICAgIlwxXHUwMWFhXDI3XHUwMTA5XDFcdTAxYWFcMlx1MDEwOVwxXHUwMWFhXDJcdTAxMDlcMVx1MDFhYVwxMFx1MDEwOSIrCi0gICAgIlwxXHUwMWFhXDRcdTAxMDlcMVx1MDFhYVw3XHUwMTA5XDFcMFwxXHUwMWFiXDFcdTAxMGFcMVx1MDEzNCIrCi0gICAgIlwzXHUwMTBhXDFcdTAxYWJcMVx1MDEwYVwxXHUwMTMwXDI1XHUwMTBhXDFcdTAxYWJcMlx1MDEwYVwxXHUwMWFiIisKLSAgICAiXDJcdTAxMGFcMVx1MDFhYlwxMFx1MDEwYVwxXHUwMWFiXDRcdTAxMGFcMVx1MDFhYlw3XHUwMTBhXDFcMCIrCi0gICAgIlwxXHUwMWFjXDFcdTAxMWNcMVx1MDExZFwxXHUwMTFjXDFcMFwxXHUwMTFjXDFcdTAxYWNcMVx1MDExYyIrCi0gICAgIlwxXDBcMVx1MDExY1wxXHUwMTIxXDExXHUwMTFjXDFcMFwxMVx1MDExY1wxXHUwMWFjXDJcdTAxMWMiKwotICAgICJcMVx1MDFhY1wyXHUwMTFjXDFcdTAxYWNcMTBcdTAxMWNcMVx1MDFhY1w0XHUwMTFjXDFcdTAxYWNcN1x1MDExYyIrCi0gICAgIlwxXDBcMVx1MDFhZFwxXHUwMTFmXDFcdTAxNDhcMVx1MDExZlwxXHUwMTQ1XDFcdTAxMWZcMVx1MDFhZCIrCi0gICAgIlwyN1x1MDExZlwxXHUwMWFkXDJcdTAxMWZcMVx1MDFhZFwyXHUwMTFmXDFcdTAxYWRcMTBcdTAxMWZcMVx1MDFhZCIrCi0gICAgIlw0XHUwMTFmXDFcdTAxYWRcN1x1MDExZlwxXDBcMVx1MDFhZVwxXHUwMTIwXDFcdTAxNDlcM1x1MDEyMCIrCi0gICAgIlwxXHUwMWFlXDFcdTAxMjBcMVx1MDE0NVwyNVx1MDEyMFwxXHUwMWFlXDJcdTAxMjBcMVx1MDFhZVwyXHUwMTIwIisKLSAgICAiXDFcdTAxYWVcMTBcdTAxMjBcMVx1MDFhZVw0XHUwMTIwXDFcdTAxYWVcN1x1MDEyMFwxXDBcMlx1MDEwNyIrCi0gICAgIlwxXHUwMTA4XDFcdTAxMDdcMVwwXDNcdTAxMDdcMVwwXDFcdTAxMDdcMVx1MDEwYlwxMVx1MDEwNyIrCi0gICAgIlwxXDBcNDVcdTAxMDdcMVwwXDFcdTAxYWZcMVx1MDEwOVwxXHUwMTMzXDFcdTAxMDlcMVx1MDEzMCIrCi0gICAgIlwxXHUwMTA5XDFcdTAxYWZcMjdcdTAxMDlcMVx1MDFhZlwyXHUwMTA5XDFcdTAxYWZcMlx1MDEwOVwxXHUwMWFmIisKLSAgICAiXDEwXHUwMTA5XDFcdTAxYWZcNFx1MDEwOVwxXHUwMWFmXDdcdTAxMDlcMVwwXDFcdTAxYjBcMVx1MDEwYSIrCi0gICAgIlwxXHUwMTM0XDNcdTAxMGFcMVx1MDFiMFwxXHUwMTBhXDFcdTAxMzBcMjVcdTAxMGFcMVx1MDFiMFwyXHUwMTBhIisKLSAgICAiXDFcdTAxYjBcMlx1MDEwYVwxXHUwMWIwXDEwXHUwMTBhXDFcdTAxYjBcNFx1MDEwYVwxXHUwMWIwXDdcdTAxMGEiKwotICAgICJcMVwwXDJcdTAxMWNcMVx1MDExZFwxXHUwMTFjXDFcMFwzXHUwMTFjXDFcMFwxXHUwMTFjIisKLSAgICAiXDFcdTAxMjFcMTFcdTAxMWNcMVwwXDQ1XHUwMTFjXDFcMFwxXHUwMWIxXDFcdTAxMWZcMVx1MDE0OCIrCi0gICAgIlwxXHUwMTFmXDFcdTAxNDVcMVx1MDExZlwxXHUwMWIxXDI3XHUwMTFmXDFcdTAxYjFcMlx1MDExZlwxXHUwMWIxIisKLSAgICAiXDJcdTAxMWZcMVx1MDFiMVwxMFx1MDExZlwxXHUwMWIxXDRcdTAxMWZcMVx1MDFiMVw3XHUwMTFmXDFcMCIrCi0gICAgIlwxXHUwMWIyXDFcdTAxMjBcMVx1MDE0OVwzXHUwMTIwXDFcdTAxYjJcMVx1MDEyMFwxXHUwMTQ1XDI1XHUwMTIwIisKLSAgICAiXDFcdTAxYjJcMlx1MDEyMFwxXHUwMWIyXDJcdTAxMjBcMVx1MDFiMlwxMFx1MDEyMFwxXHUwMWIyXDRcdTAxMjAiKwotICAgICJcMVx1MDFiMlw3XHUwMTIwXDFcMFwyXHUwMTA5XDFcdTAxMzNcMVx1MDEwOVwxXHUwMTMwXDY1XHUwMTA5IisKLSAgICAiXDFcMFwyXHUwMTBhXDFcdTAxMzRcNVx1MDEwYVwxXHUwMTMwXDYxXHUwMTBhXDFcMFwyXHUwMTFmIisKLSAgICAiXDFcdTAxNDhcMVx1MDExZlwxXHUwMTQ1XDY1XHUwMTFmXDFcMFwyXHUwMTIwXDFcdTAxNDlcNVx1MDEyMCIrCi0gICAgIlwxXHUwMTQ1XDYxXHUwMTIwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tUcmFucygpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFsyMTI0MF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tUcmFucyhaWl9UUkFOU19QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tUcmFucyhTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKgotICAgKiBaWl9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQVRUUklCVVRFID0genpVbnBhY2tBdHRyaWJ1dGUoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQVRUUklCVVRFX1BBQ0tFRF8wID0KLSAgICAiXDIzXDBcMVwxMVw3XDFcMVwxMVwxXDFcMVwxMVwyXDFcMVwxMSIrCi0gICAgIlwzXDFcMVwxMVw2XDFcMVwxMVwzXDFcMlwxMVwzXDFcMVwxMSIrCi0gICAgIlwyXDFcMlwxMVwzXDFcMVwxMVwxXDFcMVwxMVwxMFwxXDJcMTEiKwotICAgICJcNlwxXDFcMTFcNlwxXDFcMTFcMVwxXDFcMFwxXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcMVwxXDEwXDBcMVwxXDRcMFwxXDExXDRcMCIrCi0gICAgIlwxXDExXDRcMFwxXDFcMVwwXDFcMVwxXDBcMVwxXDFcMCIrCi0gICAgIlwxXDExXDFcMFwxXDFcMVwwXDFcMVwyXDBcMVwxMVwzXDAiKwotICAgICJcMlwxXDNcMFwxXDExXDFcMFwxXDFcMVwxMVwxXDFcMlwwIisKLSAgICAiXDFcMTFcMlwwXDJcMVwyXDBcMVwxXDJcMFwxXDExXDFcMSIrCi0gICAgIlwxXDExXDJcMVwxMFwwXDFcMVwxXDBcMVwxXDJcMFwxXDEiKwotICAgICJcMlwwXDFcMVwyXDBcMVwxXDJcMFw1XDFcMVwwXDFcMSIrCi0gICAgIlwyXDBcMVwxXDFcMFwzXDFcMVwwXDFcMVwxXDBcMVwxIisKLSAgICAiXDJcMFwxXDFcMVwwXDNcMVwxXDBcM1wxXDJcMTFcMTBcMCIrCi0gICAgIlwxXDFcNVwwXDVcMVwyXDBcNFwxXDJcMFwyXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcM1wxXDNcMFwxXDExXDJcMFwxXDExXDFcMCIrCi0gICAgIlwxXDFcMTBcMFwxXDExXDVcMVwyXDBcNFwxXDJcMFwzXDEiKwotICAgICJcNVwwXDFcMTFcMVwwXDNcMVwyXDBcMVwxMVwyXDBcMVwxIisKLSAgICAiXDZcMFwxXDFcMlwwXDVcMVwyXDBcNFwxXDJcMFwzXDEiKwotICAgICJcMlwwXDFcMVwzXDBcM1wxXDFcMFwxXDExXDJcMFwxXDEiKwotICAgICJcMTNcMFw1XDFcMlwwXDRcMVwyXDBcM1wxXDEwXDBcMlwxIisKLSAgICAiXDFcMTFcMlwwXDFcMVw2XDBcMVwxXDFcMFwxXDFcMlwwIisKLSAgICAiXDJcMVwyXDBcM1wxXDJcMFwxXDFcMVwwXDFcMVw2XDAiKwotICAgICJcMlwxXDRcMFwxXDExXDRcMFwxXDExXDNcMFwxXDExXDEyXDAiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0F0dHJpYnV0ZSgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0MzRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQXR0cmlidXRlKFpaX0FUVFJJQlVURV9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBdHRyaWJ1dGUoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBwcml2YXRlIGludCB5eWNvbHVtbjsKLQotICAvKiogCi0gICAqIHp6QXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEJPTCA9IHRydWU7Ci0KLSAgLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVGSU5FRCA9ICJ1bmRlZmluZWQiOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0OwotLy8JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkVGV4dExlbmd0aDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7Ci0vLwlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyZWRUZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU1RleHRSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX05PUk1BTCA9IDE2Mzg0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX1NNQUxMID0gMjU2OwotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsKLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTdGF0ZShpbnQgc3RhdGUpIHsKLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgewotCQlmSW5pdGlhbEJ1ZmZlclNpemUgPSBzaXplOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQ7Ci0JCVN0cmluZyBuZXh0VG9rZW5UeXBlOwotCQlib29sZWFuIHNwYWNlRm9sbG93czsKLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsKLQkJaW50IHN0YXJ0OwotCQlpbnQgdGV4dExlbmd0aDsKLQkJaW50IGxlbmd0aDsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgewotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0OwotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0KLQkJCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLS8vCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJc3RhcnQgPSB5eWNoYXI7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCS8vIHVuZGVmIC0+IGNvbmNhdGVuYXRlIHVuZGVmJ3MKLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgewotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLS8vCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJfSBlbHNlIHsKLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsKLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVmFsdWVUeXBlKGNvbnRleHQpKSB7IC8vIGRlY2xhcmF0aW9uIHZhbHVlIGNhbiBjb250YWluIFZBTFVFX1MKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOwotCQkJCX0gZWxzZSBpZiAoY2FuQ29udGFpblNwYWNlKGNvbnRleHQpKSB7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsKLQkJCQl9Ci0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsKLQkJCQkJCS8vIG5leHQgaXMgc3BhY2UgLT4gYXBwZW5kCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYKLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsKLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047Ci0JCQl9Ci0JCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAJCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsKLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOwotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJCi0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsKLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOwotCQkJdG9rZW5zLmFkZCh0b2tlbik7Ci0JCX0KLQotICAJCXJldHVybiB0b2tlbnM7Ci0gIAl9Ci0gIAkKLSAgCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7Ci0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0gIAkJCXJldHVybiBmYWxzZTsKLSAgCQl9IGVsc2UgewotICAJCQlyZXR1cm4gdHJ1ZTsKLSAgCQl9Ci0gIAl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4geXljaGFyOwotCX0KLQkKLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4genpBdEVPRjsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXp6UmVhZGVyID0gaW47Ci0KLQkJLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQkJenpTdGF0ZSA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJenpMZXhpY2FsU3RhdGUgPSBmSW5pdGlhbFN0YXRlOyAvL1lZSU5JVElBTDsKLQotCQkvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JCWlmICh6ekJ1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7Ci0JCQl6ekJ1ZmZlciA9IG5ldyBjaGFyW2ZJbml0aWFsQnVmZmVyU2l6ZV07Ci0JCX0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJenpNYXJrZWRQb3MgPSAwOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotLy8JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXp6Q3VycmVudFBvcyA9IDA7Ci0KLQkJLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl6elN0YXJ0UmVhZCA9IDA7Ci0KLQkJLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkJZnJvbSBpbnB1dCAqLwotCQl6ekVuZFJlYWQgPSAwOwotCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0KLQkJLyoqCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLQkJICogbWF0Y2hlZCB0ZXh0Ci0JCSAqLwotLy8JCXl5Y29sdW1uID0gMDsgCi0KLQkJLyoqIAotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLQkJICovCi0vLwkJeXlfYXRCT0wgPSBmYWxzZTsKLQkJCi0JCS8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJenpBdEVPRiA9IGZhbHNlOwotCi0JCS8qIHVzZXIgdmFyaWFibGVzICovCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBDU1NUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkZWQgdG8gd29ya2Fyb3VuZCBzdHJpY3RlciBjb21waWxhdGlvbiBvcHRpb25zIHdpdGhvdXQgY3JlYXRpbmcKLQkgKiBhbiBhbHRlcm5hdGUgc2tlbGV0b24gZmlsZQotCSAqLwotCXZvaWQgX3VzZVByaXZhdGVzKCkgewotCQlTeXN0ZW0ub3V0LnByaW50KHl5Y29sdW1uKTsKLQkJU3lzdGVtLm91dC5wcmludCh5eWxpbmUpOwotCQlTeXN0ZW0ub3V0LnByaW50KEJvb2xlYW4udG9TdHJpbmcoenpBdEJPTCkpOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTcwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpSZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh6elN0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIHp6U3RhcnRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpFbmRSZWFkLXp6U3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHp6RW5kUmVhZC09IHp6U3RhcnRSZWFkOwotICAgICAgenpDdXJyZW50UG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ek1hcmtlZFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotICAgICAgenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLmxlbmd0aC16ekVuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPiAwKSB7Ci0gICAgICB6ekVuZFJlYWQrPSBudW1SZWFkOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyB1bmxpa2VseSBidXQgbm90IGltcG9zc2libGU6IHJlYWQgMCBjaGFyYWN0ZXJzLCBidXQgbm90IGF0IGVuZCBvZiBzdHJlYW0gICAgCi0gICAgaWYgKG51bVJlYWQgPT0gMCkgewotICAgICAgaW50IGMgPSB6elJlYWRlci5yZWFkKCk7Ci0gICAgICBpZiAoYyA9PSAtMSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHp6QnVmZmVyW3p6RW5kUmVhZCsrXSA9IChjaGFyKSBjOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9ICAgICAKLSAgICB9Ci0KLQkvLyBudW1SZWFkIDwgMAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB6ekF0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh6elJlYWRlciAhPSBudWxsKQotICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0gMDsKLSAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHp6TGV4aWNhbFN0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLSAgICByZXR1cm4genpCdWZmZXJbenpTdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6elNjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgdHJ5IHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW1paX1VOS05PV05fRVJST1JdOwotICAgIH0KLQotICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwdWJsaWMgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHp6SW5wdXQ7Ci0gICAgaW50IHp6QWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgenpDdXJyZW50UG9zTDsKLSAgICBpbnQgenpNYXJrZWRQb3NMOwotICAgIGludCB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgIGNoYXIgW10genpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgY2hhciBbXSB6ekNNYXBMID0gWlpfQ01BUDsKLQotICAgIGludCBbXSB6elRyYW5zTCA9IFpaX1RSQU5TOwotICAgIGludCBbXSB6elJvd01hcEwgPSBaWl9ST1dNQVA7Ci0gICAgaW50IFtdIHp6QXR0ckwgPSBaWl9BVFRSSUJVVEU7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0KLSAgICAgIHl5Y2hhcis9IHp6TWFya2VkUG9zTC16elN0YXJ0UmVhZDsKLQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSBaWl9MRVhTVEFURVt6ekxleGljYWxTdGF0ZV07Ci0KLQotICAgICAgenpGb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikgewotICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3MgID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zICAgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHp6Q3VycmVudFBvc0wgID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMICAgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCAgICAgID0genpCdWZmZXI7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMICAgICA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCB6ek5leHQgPSB6elRyYW5zTFsgenpSb3dNYXBMW3p6U3RhdGVdICsgenpDTWFwTFt6eklucHV0XSBdOwotICAgICAgICAgIGlmICh6ek5leHQgPT0gLTEpIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIHp6U3RhdGUgPSB6ek5leHQ7Ci0KLSAgICAgICAgICBpbnQgenpBdHRyaWJ1dGVzID0genpBdHRyTFt6elN0YXRlXTsKLSAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiAxKSA9PSAxICkgewotICAgICAgICAgICAgenpBY3Rpb24gPSB6elN0YXRlOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDgpID09IDggKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgenpNYXJrZWRQb3MgPSB6ek1hcmtlZFBvc0w7Ci0KLSAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19TVFJJTkc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDUyOiBicmVhazsKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDUzOiBicmVhazsKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgICAgLy8gbG9va2FoZWFkIGV4cHJlc3Npb24gd2l0aCBmaXhlZCBsb29rYWhlYWQgbGVuZ3RoCi0gICAgICAgICAgeXlwdXNoYmFjaygxKTsKLSAgICAgICAgICB7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTY6IGJyZWFrOwotICAgICAgICBjYXNlIDE6IAotICAgICAgICAgIHsgcmV0dXJuIFVOREVGSU5FRDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTc6IGJyZWFrOwotICAgICAgICBjYXNlIDk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDU4OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDU5OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DTEFTUzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjA6IGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19MQlJBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYxOiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX01FRElBX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9GT05UX0ZBQ0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19GT05UX0ZBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY2OiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7IHJldHVybiBDU1NfQ0hBUlNFVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjk6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfQ0RDOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDcyOiBicmVhazsKLSAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzM6IGJyZWFrOwotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfQ0RPOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzg6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODI6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgICAvLyBsb29rYWhlYWQgZXhwcmVzc2lvbiB3aXRoIGZpeGVkIGxvb2thaGVhZCBsZW5ndGgKLSAgICAgICAgICB5eXB1c2hiYWNrKDEpOwotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODM6IGJyZWFrOwotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODY6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9QQUdFX0RFTElNSVRFUik7IHJldHVybiBDU1NfUEFHRV9TRUxFQ1RPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODg6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICAgIHsgcmV0dXJuIENTU19DT01NRU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDkyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDkzOiBicmVhazsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfUzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0lEOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTg6IGJyZWFrOwotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAwOiBicmVhazsKLSAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAxOiBicmVhazsKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VUkk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwMjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9JQ1NTVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9JQ1NTVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTVlY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSUNTU1Rva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIGN1cnJlbnRseSBwcm92aWRlIHRoaXMgaW50ZXJmYWNlIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1Rva2VuaXplciB7Ci0KLQl2b2lkIHNldEluaXRpYWxTdGF0ZShpbnQgaW5pdGlhbFN0YXRlKTsKLQotCXZvaWQgc2V0SW5pdGlhbEJ1ZmZlclNpemUoaW50IGJ1ZnNpemUpOwotCi0JYm9vbGVhbiBpc0VPRigpOwotCi0Jdm9pZCByZXNldChSZWFkZXIgcmVhZGVyLCBpbnQgaSk7Ci0KLQlJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCByZXNldChjaGFyW10gY3MpOwotCi0JaW50IGdldE9mZnNldCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0NTU1RleHRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0NTU1RleHRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyN2ZmNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NUZXh0UmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIENTU1RleHRSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NUZXh0UmVnaW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVSZWdpb24oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJcmVnaW9uID0gbmV3IENvbnRleHRSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBDU1NUZXh0UmVnaW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NUZXh0UmVnaW9uRmFjdG9yeSBmSW5zdGFuY2UgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1JlZ2lvbkNvbnRleHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTUmVnaW9uQ29udGV4dHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyNzM1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTUmVnaW9uQ29udGV4dHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyejsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTUmVnaW9uQ29udGV4dHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DT01NRU5UID0gIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NETyA9ICJDRE8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NEQyA9ICJDREMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1MgPSAiUyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUxJTUlURVIgPSAiREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19MQlJBQ0UgPSAiTEJSQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19SQlJBQ0UgPSAiUkJSQUNFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0lNUE9SVCA9ICJJTVBPUlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BBR0UgPSAiUEFHRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTUVESUEgPSAiTUVESUEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0ZPTlRfRkFDRSA9ICJGT05UX0ZBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NIQVJTRVQgPSAiQ0hBUlNFVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQVRLRVlXT1JEID0gIkFUS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TVFJJTkcgPSAiU1RSSU5HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19VUkkgPSAiVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19NRURJVU0gPSAiTUVESVVNIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19NRURJQV9TRVBBUkFUT1IgPSAiTUVESUFfU0VQQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NIQVJTRVRfTkFNRSA9ICJDSEFSU0VUX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUEFHRV9TRUxFQ1RPUiA9ICJDU1NfUEFHRV9TRUxFQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgPSAiU0VMRUNUT1JfRUxFTUVOVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9VTklWRVJTQUwgPSAiU0VMRUNUT1JfVU5JVkVSU0FMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9QU0VVRE8gPSAiU0VMRUNUT1JfUFNFVURPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9DTEFTUyA9ICJTRUxFQ1RPUl9DTEFTUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfSUQgPSAiU0VMRUNUT1JfSUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IgPSAiU0VMRUNUT1JfQ09NQklOQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SID0gIlNFTEVDVE9SX1NFUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQgPSAiU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EID0gIlNFTEVDVE9SX0FUVFJJQlVURV9FTkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FID0gIlNFTEVDVE9SX0FUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAiU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgPSAiU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZID0gIkRFQ0xBUkFUSU9OX1BST1BFUlRZIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IgPSAiREVDTEFSQVRJT05fU0VQQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgPSAiREVDTEFSQVRJT05fREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCA9ICJERUNMQVJBVElPTl9WQUxVRV9JREVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSA9ICJERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgPSAiREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiA9ICJERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UgPSAiREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyA9ICJERUNMQVJBVElPTl9WQUxVRV9TVFJJTkciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSA9ICJERUNMQVJBVElPTl9WQUxVRV9VUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0ggPSAiREVDTEFSQVRJT05fVkFMVUVfSEFTSCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSA9ICJERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQgPSAiQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgPSAiREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MgPSAiREVDTEFSQVRJT05fVkFMVUVfUyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19VTktOT1dOID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGb3IgbnVsbCBvYmplY3QgOiBDU1NUb2tlbml6ZXIgbmV2ZXIgc2V0IHRoaXMgdmFsdWUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfVU5ERUZJTkVEID0gIlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLSAJICogY3VycmVudGx5IHByb3ZpZGVkIHRoaXMgZmllbGQgYnV0IG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfRk9SRUlHTl9FTEVNRU5UID0gIkZPUkVJR05fRUxFTUVOVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0UGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjUzNjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1Rva2VuaXplcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDU1NUZXh0UGFyc2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1NUWUxFU0hFRVQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfREVDTEFSQVRJT04gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfREVDTEFSQVRJT05fVkFMVUUgPSAyOwotCi0JcHVibGljIENTU1RleHRQYXJzZXIoaW50IHBhcnNlck1vZGUpIHsKLQkJaW5pdGlhbGl6ZVBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JfQotCi0JcHVibGljIENTU1RleHRQYXJzZXIoaW50IHBhcnNlck1vZGUsIFJlYWRlciByZWFkZXIpIHsKLQkJaW5pdGlhbGl6ZVBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JCXJlc2V0KHJlYWRlcik7Ci0JfQotCi0JcHVibGljIENTU1RleHRQYXJzZXIoaW50IHBhcnNlck1vZGUsIFN0cmluZyBpbnB1dCkgewotCQlpbml0aWFsaXplUGFyc2VyTW9kZShwYXJzZXJNb2RlKTsKLQkJcmVzZXQoaW5wdXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQocmVhZGVyLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQpIHsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQobmV3IFN0cmluZ1JlYWRlcihpbnB1dCksIDApOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0VG9rZW5bXSBnZXRUb2tlbnMoKSB7Ci0JCUxpc3QgdG9rZW5MaXN0ID0gZ2V0VG9rZW5MaXN0KCk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IG5ldyBDU1NUZXh0VG9rZW5bdG9rZW5MaXN0LnNpemUoKV07Ci0JCXJldHVybiAoQ1NTVGV4dFRva2VuW10pIHRva2VuTGlzdC50b0FycmF5KHRva2Vucyk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VG9rZW5MaXN0KCkgewotCQlMaXN0IHRva2VuczsKLQkJdHJ5IHsKLQkJCXRva2VucyA9IGdldFRva2VuaXplcigpLnBhcnNlVGV4dCgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0b2tlbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQYXJzZXJNb2RlKGludCBwYXJzZXJNb2RlKSB7Ci0JCWludCBpbml0aWFsU3RhdGU7Ci0JCWludCBidWZzaXplOwotCQlzd2l0Y2ggKHBhcnNlck1vZGUpIHsKLQkJCWNhc2UgTU9ERV9TVFlMRVNIRUVUIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuWVlJTklUSUFMOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT047Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9OT1JNQUw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVfREVDTEFSQVRJT05fVkFMVUUgOgotCQkJCWluaXRpYWxTdGF0ZSA9IENTU1Rva2VuaXplci5TVF9ERUNMQVJBVElPTl9QUkVfVkFMVUU7Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9TTUFMTDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybjsKLQkJfQotCQlpZiAoMCA8IGluaXRpYWxTdGF0ZSkgewotCQkJQ1NTVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQkJdG9rZW5pemVyLnNldEluaXRpYWxTdGF0ZShpbml0aWFsU3RhdGUpOwotCQkJdG9rZW5pemVyLnNldEluaXRpYWxCdWZmZXJTaXplKGJ1ZnNpemUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDU1NUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IENTU1Rva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgQ1NTVG9rZW5pemVyIGZUb2tlbml6ZXIgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1RleHRUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1RleHRUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2M5MDc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0VG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyejsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTVGV4dFRva2VuIHsKLQlwdWJsaWMgU3RyaW5nIGtpbmQ7Ci0JcHVibGljIFN0cmluZyBpbWFnZTsKLQlwdWJsaWMgaW50IHN0YXJ0OwotCXB1YmxpYyBpbnQgbGVuZ3RoOwotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIChpbWFnZSAhPSBudWxsKSA/IGltYWdlIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDU2Mjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBDU1MgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQotCQkvLyBmb3JtYXR0aW5nIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgNzIpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMsIGZhbHNlKTsKLQkJbm9kZS5wdXQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQik7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSwgMSk7Ci0KLQkJLy8gY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIHRydWUpOwotCi0JCS8vIGNvZGUgZ2VuZXJhdGlvbiBwcmVmZXJlbmNlcwotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VULCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlZmF1bHRFbmMgPSAiVVRGLTgiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN5c3RlbUVuYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzeXN0ZW1FbmMgIT0gbnVsbCkgewotCQkJZGVmYXVsdEVuYyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRQcmVmZXJyZWREZWZhdWx0SWFuYU5hbWUoc3lzdGVtRW5jLCAiVVRGLTgiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQsIGRlZmF1bHRFbmMpOwotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sICJjc3MiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGFkZGl0aW9uYWwgY3NzIGNvcmUgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0sIDApOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0sIDEpOwotCQlub2RlLnB1dChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSwgIlwiIik7Ly8kTk9OLU5MUy0xJAotCQlub2RlLnB1dChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9CRVRXRUVOX1ZBTFVFLCAiICIpOy8vJE5PTi1OTFMtMSQKLQkJbm9kZS5wdXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSwgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSwgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiwgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSwgZmFsc2UpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUiwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQkvLyBDU1MgY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9JREVOVElGSUVSLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9WQUxVRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfU0VMRUNUT1IsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZhMDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENTUyBjb3JlIHByZWZlcmVuY2Uga2V5cy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9JREVOVElGSUVSID0gImlkZW50aWZpZXJDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfUFJPUEVSVFlfTkFNRSA9ICJwcm9wTmFtZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTRV9QUk9QRVJUWV9WQUxVRSA9ICJwcm9wVmFsdWVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9CRVRXRUVOX1ZBTFVFID0gImJldHdlZW5WYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUFJPUF9QT1NUX0RFTElNID0gInBvc3REZWxpbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUFJPUF9QUkVfREVMSU0gPSAicHJlRGVsaW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1FVT1RFID0gInF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9RVU9URV9JTl9VUkkgPSAicXVvdGVJblVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UgPSAibmV3TGluZU9uT3BlbkJyYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQSU5HX09ORV9QRVJfTElORSA9ICJvbmVQcm9wZXJ0eVBlckxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSID0gInByb2hpYml0V3JhcE9uQXR0ciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENTUyBjbGVhbnVwIHByZWZlcmVuY2UgbmFtZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0NBU0VfSURFTlRJRklFUiA9ICJjbGVhbnVwSWRlbnRpZmllckNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1BST1BFUlRZX05BTUUgPSAiY2xlYW51cFByb3BOYW1lQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUgPSAiY2xlYW51cFByb3BWYWx1ZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1NFTEVDVE9SID0gImNsZWFudXBTZWxlY3RvckNhc2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHRlbnNpb24gdG8gdXNlIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIE5ldyBDU1MgRmlsZQotCSAqIFdpemFyZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gImRlZmF1bHRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIG1heGltdW0gd2lkdGggb2YgYSBsaW5lIGJlZm9yZSBhIGxpbmUgc3BsaXQgaXMgbmVlZGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfV0lEVEggPSAibGluZVdpZHRoIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgYWxsIGJsYW5rcyBsaW5lcyBzaG91bGQgYmUgY2xlYXJlZCBkdXJpbmcgZm9ybWF0dGluZy4KLQkgKiBCbGFuayBsaW5lcyB3aWxsIGJlIGtlcHQgd2hlbiBmYWxzZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUl9BTExfQkxBTktfTElORVMgPSAiY2xlYXJBbGxCbGFua0xpbmVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mICNJTkRFTlRBVElPTl9DSEFSIGZvciAxIGluZGVudGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX1NJWkUgPSAiaW5kZW50YXRpb25TaXplIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2hhcmFjdGVyIHVzZWQgZm9yIGluZGVudGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtUQUIsIFNQQUNFfQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRBVElPTl9DSEFSID0gImluZGVudGF0aW9uQ2hhciI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogdGFiIGNoYXJhY3RlciB3aGVuIGZvcm1hdHRpbmcuCi0JICogCi0JICogQHNlZSAjU1BBQ0UKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCID0gInRhYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjSU5ERU5UQVRJT05fQ0hBUi4gSW5kaWNhdGVzIHRvIHVzZQotCSAqIHNwYWNlIGNoYXJhY3RlciB3aGVuIGZvcm1hdHRpbmcuCi0JICogCi0JICogQHNlZSAjVEFCCi0JICogQHNlZSAjSU5ERU5UQVRJT05fQ0hBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFID0gInNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHF1b3RlIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGNsZWFudXAgcHJvY2Vzc29yIHNob3VsZCBmb3JtYXQgc291cmNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIGNhc2UgcHJlZmVyZW5jZXMgSW5kaWNhdGVzIHRvIGxlYXZlIGNhc2UgYXMgaXMuCi0JICogCi0JICogQHNlZSAjTE9XRVIKLQkgKiBAc2VlICNVUFBFUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTSVMgPSAwOwotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBjYXNlIHByZWZlcmVuY2VzIEluZGljYXRlcyB0byBtYWtlIG5hbWUKLQkgKiBsb3dlcmNhc2UuCi0JICogCi0JICogQHNlZSAjQVNJUwotCSAqIEBzZWUgI1VQUEVSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9XRVIgPSAxOwotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBjYXNlIHByZWZlcmVuY2VzIEluZGljYXRlcyB0byBtYWtlIG5hbWUKLQkgKiB1cHBlcmNhc2UuCi0JICogCi0JICogQHNlZSAjTE9XRVIKLQkgKiBAc2VlICNBU0lTCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBQRVIgPSAyOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JQ1NTTW9kZWxBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lDU1NNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAxODgxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lDU1NNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NNb2RlbEFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JSUNTU01vZGVsIGdldE1vZGVsKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lNb2RlbFByb3ZpZGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lNb2RlbFByb3ZpZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjk0ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JTW9kZWxQcm92aWRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFByb3ZpZGVBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgbW9kZWxQcm92aWRlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLQotCS8qKgotCSAqLwotCXZvaWQgbW9kZWxSZWxlYXNlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLQotCS8qKgotCSAqLwotCXZvaWQgbW9kZWxSZW1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNmE5MzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyIGV4dGVuZHMgSUNTU01vZGVsQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRTdHlsZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTI5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVTZWxlY3RvckFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gcHNldWRvTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCWJvb2xlYW4gbWF0Y2goSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2hlZXRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTQ3NTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2hlZXRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlU2hlZXRBZGFwdGVyIGV4dGVuZHMgSUNTU01vZGVsQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIEhUTUwvWE1MIGVsZW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBhZGFwdGVyCi0JICovCi0JRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIENTUyBkb2N1bWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gdGhpcyBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0U2hlZXQoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSB0aW1lIG9mIHJlbGVhc2luZyBIVE1ML1hNTCBtb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgdGltZSBvZiByZW1vdmluZyB0aGlzIEVsZW1lbnQgZnJvbSB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTYzODg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JRW51bWVyYXRpb24gZ2V0Q2xhc3NlcygpOwotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0TGlzdCBnZXRTdHlsZVNoZWV0cygpOwotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTYyMmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzLCB3aXRoIGl0cyBvbmUgZmllbGQsIGlzIGEgY29udmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcmluZyB0byBhIGNvbnRlbnRUeXBlIElELiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkCi0gKiBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgZmlsZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29udGVudFR5cGVJZEZvckNTUyB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQKLQkgKiBwcm90ZWN0ZWQgbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9DU1MgPSBnZXRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0FjY2Vzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMmFmYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU0FjY2VzcyB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5WZWN0b3IKLQkgKi8KLQlWZWN0b3IgZ2V0Q2xhc3NOYW1lcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQXR0ci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQXR0ci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDgwYThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0F0dHIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NBdHRyIGV4dGVuZHMgSUNTU05vZGUgewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlJQ1NTTm9kZSBnZXRPd25lckNTU05vZGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQ2hhcnNldFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0NoYXJzZXRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzRlZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQ2hhcnNldFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NDaGFyc2V0UnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NDaGFyc2V0UnVsZSB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIEVOQ09ESU5HID0gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0RvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NmMwZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NEb2N1bWVudCBleHRlbmRzIElDU1NOb2RlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlCi0JICovCi0JSUNTU0NoYXJzZXRSdWxlIGNyZWF0ZUNTU0NoYXJzZXRSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGUKLQkgKi8KLQlDU1NGb250RmFjZVJ1bGUgY3JlYXRlQ1NTRm9udEZhY2VSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlCi0JICovCi0JSUNTU0ltcG9ydFJ1bGUgY3JlYXRlQ1NTSW1wb3J0UnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuSUNTU01lZGlhUnVsZQotCSAqLwotCUlDU1NNZWRpYVJ1bGUgY3JlYXRlQ1NTTWVkaWFSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQYWdlUnVsZQotCSAqLwotCUlDU1NQYWdlUnVsZSBjcmVhdGVDU1NQYWdlUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoc2hvcnQgcHJpbWl0aXZlVHlwZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlDU1NSdWxlIGNyZWF0ZUNTU1J1bGUoU3RyaW5nIHJ1bGUpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCUlDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlJQ1NTU3R5bGVEZWNsSXRlbSBjcmVhdGVDU1NTdHlsZURlY2xJdGVtKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVSdWxlCi0JICovCi0JSUNTU1N0eWxlUnVsZSBjcmVhdGVDU1NTdHlsZVJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlCi0JICovCi0JQ1NTVW5rbm93blJ1bGUgY3JlYXRlQ1NTVW5rbm93blJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0Ci0JICovCi0JTWVkaWFMaXN0IGNyZWF0ZU1lZGlhTGlzdCgpOwotCi0JSUNTU01vZGVsIGdldE1vZGVsKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzRG9jdW1lbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0ltcG9ydFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0ltcG9ydFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkOTBkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NJbXBvcnRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NJbXBvcnRSdWxlIGV4dGVuZHMgSUNTU05vZGUsIENTU0ltcG9ydFJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBIUkVGID0gImhyZWYiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlZnJlc2hTdHlsZVNoZWV0KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaHJlZgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNZWRpYVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU01lZGlhUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQwMzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU01lZGlhUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTTWVkaWFSdWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NNZWRpYVJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgSUNTU1J1bGVDb250YWluZXIsIENTU01lZGlhUnVsZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU01vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTZlNTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU01vZGVsIGV4dGVuZHMgSUNTU1N0eWxlTm90aWZpZXIsIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUwgPSAiZXh0ZXJuYWxDU1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRURERUQgPSAiZW1iZWRkZWRDU1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5MSU5FID0gImlubGluZUNTUyI7IC8vJE5PTi1OTFMtMSQKLQotCUlDU1NEb2N1bWVudCBnZXREb2N1bWVudCgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JTm9kZSBnZXRPd25lckRPTU5vZGUoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqLwotCU9iamVjdCBnZXRTdHlsZVNoZWV0VHlwZSgpOwotCi0JLyoqCi0JICogY2xlYW51cCAtPiByZWJ1aWxkIENTUyBOb2RlcyBUaGlzIGlzIHByZS1iZXRhIGZpeCBmb3IgMTc4MTc2LgotCSAqLwotCXZvaWQgcmVmcmVzaE5vZGVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOYW1lZE5vZGVNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05hbWVkTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mjg2OWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05hbWVkTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU05hbWVkTm9kZU1hcCBleHRlbmRzIElDU1NOb2RlTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlJQ1NTTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjE3ZTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOb2RlIHsKLQotCXNob3J0IEFUVFJfTk9ERSA9IC0xOwotCXNob3J0IFVOS05PV05SVUxFX05PREUgPSAwOwotCXNob3J0IFNUWUxFUlVMRV9OT0RFID0gMTsKLQlzaG9ydCBDSEFSU0VUUlVMRV9OT0RFID0gMjsKLQlzaG9ydCBJTVBPUlRSVUxFX05PREUgPSAzOwotCXNob3J0IE1FRElBUlVMRV9OT0RFID0gNDsKLQlzaG9ydCBGT05URkFDRVJVTEVfTk9ERSA9IDU7Ci0Jc2hvcnQgUEFHRVJVTEVfTk9ERSA9IDY7Ci0Jc2hvcnQgU1RZTEVTSEVFVF9OT0RFID0gNzsKLQlzaG9ydCBTVFlMRURFQ0xBUkFUSU9OX05PREUgPSA4OwotCXNob3J0IFNUWUxFREVDTElURU1fTk9ERSA9IDk7Ci0Jc2hvcnQgVkFMVUVMSVNUX05PREUgPSAxMDsKLQlzaG9ydCBQUklNSVRJVkVWQUxVRV9OT0RFID0gMTE7Ci0Jc2hvcnQgTUVESUFMSVNUX05PREUgPSAxMjsKLQlzaG9ydCBET0NVTUVOVENTU1NUWUxFX05PREUgPSAxMzsKLQlzaG9ydCBMSU5LU1RZTEVfTk9ERSA9IDE0OwotCXNob3J0IEVMRU1FTlRDU1NJTkxJTkVTVFlMRV9OT0RFID0gMTU7Ci0KLQlJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05hbWVkTm9kZU1hcAotCSAqLwotCUlDU1NOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpOwotCi0JSUNTU05vZGVMaXN0IGdldENoaWxkTm9kZXMoKTsKLQotCUlDU1NOb2RlIGdldEZpcnN0Q2hpbGQoKTsKLQotCUlDU1NOb2RlIGdldExhc3RDaGlsZCgpOwotCi0JSUNTU05vZGUgZ2V0TmV4dFNpYmxpbmcoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXROb2RlVHlwZSgpOwotCi0JSUNTU0RvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKTsKLQotCUlDU1NOb2RlIGdldFBhcmVudE5vZGUoKTsKLQotCUlDU1NOb2RlIGdldFByZXZpb3VzU2libGluZygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwZGZiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU05vZGVMaXN0IHsKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldExlbmd0aCgpOwotCi0JSUNTU05vZGUgaXRlbShpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUGFnZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1BhZ2VSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTI0YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUGFnZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NQYWdlUnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NQYWdlUnVsZSB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIFNFTEVDVE9SID0gInNlbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JSUNTU1NlbGVjdG9yTGlzdCBnZXRTZWxlY3RvcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ByaW1pdGl2ZVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQcmltaXRpdmVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmVhY2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ByaW1pdGl2ZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTUHJpbWl0aXZlVmFsdWUgZXh0ZW5kcyBJQ1NTTm9kZSwgSUNTU1ZhbHVlLCBDU1NQcmltaXRpdmVWYWx1ZSB7Ci0KLQlzaG9ydCBDU1NfSU5URUdFUiA9IDI2OwotCXNob3J0IENTU19IQVNIID0gMjc7Ci0Jc2hvcnQgQ1NTX1VSQU5HRSA9IDI4OwotCXNob3J0IENTU19GT1JNQVQgPSAyOTsKLQlzaG9ydCBDU1NfTE9DQUwgPSAzMDsKLQlzaG9ydCBDU1NfU0xBU0ggPSAzMTsKLQlzaG9ydCBDU1NfQ09NTUEgPSAzMjsKLQlzaG9ydCBDU1NfSU5IRVJJVF9QUklNSVRJVkUgPSAzMzsKLQotCS8qKgotCSAqIEBwYXJhbSBmbG9hdFZhbHVlCi0JICogICAgICAgICAgICBmbG9hdAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKGZsb2F0IGZsb2F0VmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgc3RyaW5nVmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NSdWxlQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NSdWxlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YWU1OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUnVsZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1J1bGVDb250YWluZXIgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlDU1NSdWxlIGFwcGVuZFJ1bGUoQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSByZWZSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqLwotCUNTU1J1bGUgaW5zZXJ0UnVsZUJlZm9yZShDU1NSdWxlIG5ld1J1bGUsIENTU1J1bGUgcmVmUnVsZSkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JQ1NTUnVsZSByZW1vdmVSdWxlKENTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlDU1NSdWxlIHJlcGxhY2VSdWxlKENTU1J1bGUgbmV3UnVsZSwgQ1NTUnVsZSBvbGRSdWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTU0MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2VsZWN0b3IgewotCi0JSUNTU1NlbGVjdG9ySXRlbSBnZXRJdGVtKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCUl0ZXJhdG9yIGdldEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFNwZWNpZmljaXR5KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCWJvb2xlYW4gbWF0Y2goRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvciBnZXRFcnJvcnMoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRFcnJvckNvdW50KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yQ29tYmluYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQ0M2MwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yQ29tYmluYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvciBleHRlbmRzIElDU1NTZWxlY3Rvckl0ZW0gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERFU0NFTkRBTlQgPSAnICc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENISUxEID0gJz4nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBBREpBQ0VOVCA9ICcrJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgVU5LTk9XTiA9ICc/JzsgLy8gZXJyb3IgY2FzZQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQljaGFyIGdldENvbWJpbmF0b3JUeXBlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9ySXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZlOGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9ySXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NlbGVjdG9ySXRlbSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1QTEUgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTUJJTkFUT1IgPSAyOwotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0SXRlbVR5cGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRTdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3N2ZkMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NlbGVjdG9yTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCUl0ZXJhdG9yIGdldEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLlZlY3RvcgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JSUNTU1NlbGVjdG9yIGdldFNlbGVjdG9yKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0RXJyb3JDb3VudCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgZ2V0RXJyb3JzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCWJvb2xlYW4gbWF0Y2goRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTaW1wbGVTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2ltcGxlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5ZmI4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTaW1wbGVTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NpbXBsZVNlbGVjdG9yIGV4dGVuZHMgSUNTU1NlbGVjdG9ySXRlbSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JU3RyaW5nIGdldENsYXNzKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCVN0cmluZyBnZXRJRChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWludCBnZXROdW1PZkF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWludCBnZXROdW1PZkNsYXNzZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWludCBnZXROdW1PZklEcygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mUHNldWRvTmFtZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JU3RyaW5nIGdldFBzZXVkb05hbWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNVbml2ZXJzYWwoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbEl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbEl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5Y2Q2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVEZWNsSXRlbSBleHRlbmRzIElDU1NOb2RlLCBJQ1NTVmFsdWVMaXN0IHsKLQotCWphdmEubGFuZy5TdHJpbmcgSU1QT1JUQU5UID0gImltcG9ydGFudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIGFwcGVuZFZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlCi0JICovCi0JQ1NTVmFsdWUgZ2V0Q1NTVmFsdWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRQcmlvcml0eSgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgcmVtb3ZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSByZXBsYWNlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIG5ld1ZhbHVlLCBJQ1NTUHJpbWl0aXZlVmFsdWUgb2xkVmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJpb3JpdHkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHNldFByaW9yaXR5KFN0cmluZyBwcmlvcml0eSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODczNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBleHRlbmRzIElDU1NEb2N1bWVudCwgQ1NTU3R5bGVEZWNsYXJhdGlvbiB7Ci0KLQlJQ1NTU3R5bGVEZWNsSXRlbSBnZXREZWNsSXRlbU5vZGUoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQlJQ1NTU3R5bGVEZWNsSXRlbSByZW1vdmVEZWNsSXRlbU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0gb2xkRGVjbCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCUlDU1NTdHlsZURlY2xJdGVtIHNldERlY2xJdGVtTm9kZShJQ1NTU3R5bGVEZWNsSXRlbSBuZXdEZWNsKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0ZTFhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZTsKLQotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVSdWxlIGV4dGVuZHMgSUNTU05vZGUsIENTU1N0eWxlUnVsZSB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIFNFTEVDVE9SID0gInNlbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JSUNTU1NlbGVjdG9yTGlzdCBnZXRTZWxlY3RvcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlU2hlZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlU2hlZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0MGViMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVNoZWV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVTaGVldCBleHRlbmRzIElDU1NEb2N1bWVudCwgSUNTU1J1bGVDb250YWluZXIsIENTU1N0eWxlU2hlZXQgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCU5vZGVMaXN0IGdldE93bmVyTm9kZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKiBAcGFyYW0gZG9jCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCU5vZGVMaXN0IGdldE93bmVyTm9kZXMoRG9jdW1lbnQgZG9jKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0Ci0JICovCi0JQ1NTUnVsZUxpc3QgZ2V0T3duZXJSdWxlcygpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdAotCSAqLwotCVN0eWxlU2hlZXRMaXN0IGdldFBhcmVudFN0eWxlU2hlZXRzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2OTE0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1ZhbHVlIGV4dGVuZHMgQ1NTVmFsdWUgewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldENTU1ZhbHVlVGV4dCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NWYWx1ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5YzU3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NWYWx1ZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTVmFsdWVMaXN0IGV4dGVuZHMgSUNTU1ZhbHVlLCBDU1NWYWx1ZUxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBhcHBlbmRWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSByZW1vdmVWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ291bnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ291bnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjgyNGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNvdW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNvdW50ZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvdW50ZXIgZXh0ZW5kcyBJQ1NTTm9kZSwgQ291bnRlciB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIElERU5USUZJRVIgPSAiaWRlbnRpZmllciI7IC8vJE5PTi1OTFMtMSQKLQlqYXZhLmxhbmcuU3RyaW5nIExJU1RTVFlMRSA9ICJsaXN0c3R5bGUiOyAvLyROT04tTkxTLTEkCi0JamF2YS5sYW5nLlN0cmluZyBTRVBBUkFUT1IgPSAic2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIGlkZW50aWZpZXIKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RTdHlsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldExpc3RTdHlsZShTdHJpbmcgbGlzdFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIFNlcGFyYXRvcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgc2VwYXJhdG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb25DU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNDRlOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb25DU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkRPTUltcGxlbWVudGF0aW9uQ1NTOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01JbXBsZW1lbnRhdGlvbkNTUyBleHRlbmRzIERPTUltcGxlbWVudGF0aW9uQ1NTIHsKLQotCUlDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRG9jdW1lbnRTdHlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRG9jdW1lbnRTdHlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQ2MDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURvY3VtZW50U3R5bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuRG9jdW1lbnRTdHlsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudFN0eWxlIGV4dGVuZHMgRG9jdW1lbnRTdHlsZSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gbmV3U2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JU3R5bGVTaGVldCBhcHBlbmRTaGVldChTdHlsZVNoZWV0IG5ld1NoZWV0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG5ld1NoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIHJlZlNoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0eWxlU2hlZXQgaW5zZXJ0U2hlZXRCZWZvcmUoU3R5bGVTaGVldCBuZXdTaGVldCwgU3R5bGVTaGVldCByZWZTaGVldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBvbGRTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlTdHlsZVNoZWV0IHJlbW92ZVNoZWV0KFN0eWxlU2hlZXQgb2xkU2hlZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gbmV3U2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gb2xkU2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JU3R5bGVTaGVldCByZXBsYWNlU2hlZXQoU3R5bGVTaGVldCBuZXdTaGVldCwgU3R5bGVTaGVldCBvbGRTaGVldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ1NTUHJlZmVyZW5jZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wcmVmZXJlbmNlcy9DU1NQcmVmZXJlbmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmFmZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9wcmVmZXJlbmNlcy9DU1NQcmVmZXJlbmNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIGp1c3QgYWNjZXNzIHByZWZlcmVuY2VzIGRpcmVjdGx5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDU1NQcmVmZXJlbmNlSGVscGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1ByZWZlcmVuY2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1ByZWZlcmVuY2VIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmV0d2VlblZhbHVlU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQkVUV0VFTl9WQUxVRSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heExpbmVXaWR0aCgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gcHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdW90ZVN0cmluZyhJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJLy8gbmFrYW1vcmlfVE9ETyBjc3MgcHJlZiB0cmFuc2l0aW9uCi0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRTcGFjZXNQb3N0RGVsaW1pdGVyKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwYWNlc1ByZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lkZW50VXBwZXJDYXNlKCkgewotCQlpZiAoZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmV3TGluZU9uT3BlbkJyYWNlKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfTkVXTElORV9PTl9PUEVOX0JSQUNFKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09uZVByb3BlcnR5UGVyTGluZSgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9oaWJpdFdyYXBPbkF0dHIoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcE5hbWVVcHBlckNhc2UoKSB7Ci0JCWlmIChnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wVmFsdWVVcHBlckNhc2UoKSB7Ci0JCWlmIChnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUXVvdGVJblVSSSgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URV9JTl9VUkkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEJldHdlZW5WYWx1ZVN0cmluZyhTdHJpbmcgbmV3QmV0d2VlblZhbHVlU3RyaW5nKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQkVUV0VFTl9WQUxVRSwgbmV3QmV0d2VlblZhbHVlU3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJZGVudFVwcGVyQ2FzZShib29sZWFuIG5ld0lkZW50VXBwZXJDYXNlKSB7Ci0JCWludCB0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJaWYgKG5ld0lkZW50VXBwZXJDYXNlKQotCQkJdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIsIHRoZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE9uZVByb3BlcnR5UGVyTGluZShib29sZWFuIG5ld09uZVByb3BlcnR5UGVyTGluZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FLCBuZXdPbmVQcm9wZXJ0eVBlckxpbmUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByb2hpYml0V3JhcE9uQXR0cihib29sZWFuIG5ld1Byb2hpYml0V3JhcE9uQXR0cikgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSLCBuZXdQcm9oaWJpdFdyYXBPbkF0dHIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByb3BOYW1lVXBwZXJDYXNlKGJvb2xlYW4gbmV3UHJvcE5hbWVVcHBlckNhc2UpIHsKLQkJaW50IHRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSOwotCQlpZiAobmV3UHJvcE5hbWVVcHBlckNhc2UpCi0JCQl0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSwgdGhlQ2FzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcFZhbHVlVXBwZXJDYXNlKGJvb2xlYW4gbmV3UHJvcFZhbHVlVXBwZXJDYXNlKSB7Ci0JCWludCB0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJaWYgKG5ld1Byb3BWYWx1ZVVwcGVyQ2FzZSkKLQkJCXRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSwgdGhlQ2FzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVvdGVTdHJpbmcoU3RyaW5nIHF1b3RlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUsIHF1b3RlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGFjZXNQb3N0RGVsaW1pdGVyKGludCBudW0pIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0sIG51bSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BhY2VzUHJlRGVsaW1pdGVyKGludCBudW0pIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSwgbnVtKTsKLQl9Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlDU1NDb3JlUGx1Z2luIGNzc01vZGVsUGx1Z2luID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBjc3NNb2RlbFBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgQ1NTUHJlZmVyZW5jZUhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NQcmVmZXJlbmNlSGVscGVyIGZJbnN0YW5jZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUNTU1BhcnRpdGlvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUNTU1BhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZmNmNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lDU1NQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlczsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuIEl0IGRlZmluZXMgdGhlCi0gKiBwYXJ0aXRpb25pbmcgZm9yIENTUyBhbmQgYWxsIGl0cyBwYXJ0aXRpb25zLiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlCi0gKiBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTUGFydGl0aW9uVHlwZXMgZXh0ZW5kcyBJU3RydWN0dXJlZFBhcnRpdGlvblR5cGVzIHsKLQotCVN0cmluZyBTVFlMRSA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90YXNrcy9DU1NGaWxlVGFza1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGFza3MvQ1NTRmlsZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOWJmYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90YXNrcy9DU1NGaWxlVGFza1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXI7Ci0KLXB1YmxpYyBjbGFzcyBDU1NGaWxlVGFza1NjYW5uZXIgZXh0ZW5kcyBTdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyIHsKLQlwdWJsaWMgQ1NTRmlsZVRhc2tTY2FubmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tbWVudGVkVGV4dChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBiZWdpbiwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRleHQgPSBzdXBlci5nZXRDb21tZW50ZWRUZXh0KGRvY3VtZW50LCBiZWdpbiwgbGVuZ3RoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0LmVuZHNXaXRoKCIqLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCgpIC0gMik7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiB0ZXh0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YTQyMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgcGxhY2UgdG8gcHV0ICJyZXBhcnNpbmciIGxvZ2ljLiBUaGlzIGlzCi0gKiB0aGUgbG9naWMgdGhhdCByZXBhcnNlcyB0aGUgdGV4dCBpbmNyZW1lbnRhbGx5LCBhcyBhIHVzZXIgdHlwZXMgaW4gbmV3Ci0gKiBjaGFyYWN0ZXJzLCBvciBET00gbm9kZXMgYXJlIGluc2VydGVkIG9yIGRlbGV0ZWQuIE5vdGU6IGl0IGlzIG5vdCBhIHRocmVhZAotICogc2FmZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JY2xhc3MgUmVwYXJzZVJhbmdlIHsKLQkJUmVwYXJzZVJhbmdlKCkgewotCQkJcmVzZXQoKTsKLQkJfQotCi0JCVJlcGFyc2VSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCWZSYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCQlmUmFuZ2VFbmQgPSBlbmQ7Ci0JCX0KLQotCQl2b2lkIHNldFN0YXJ0KGludCBzdGFydCkgewotCQkJZlJhbmdlU3RhcnQgPSBzdGFydDsKLQkJfQotCi0JCXZvaWQgc2V0RW5kKGludCBlbmQpIHsKLQkJCWZSYW5nZUVuZCA9IGVuZDsKLQkJfQotCi0JCWludCBnZXRTdGFydCgpIHsKLQkJCXJldHVybiBmUmFuZ2VTdGFydDsKLQkJfQotCi0JCWludCBnZXRFbmQoKSB7Ci0JCQlyZXR1cm4gZlJhbmdlRW5kOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1ZhbGlkKCkgewotCQkJcmV0dXJuICgwIDwgZlJhbmdlRW5kIC0gZlJhbmdlU3RhcnQpID8gdHJ1ZSA6IGZhbHNlOwotCQl9Ci0KLQkJdm9pZCByZXNldCgpIHsKLQkJCWZSYW5nZVN0YXJ0ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQlmUmFuZ2VFbmQgPSAwOwotCQl9Ci0KLQkJdm9pZCBleHBhbmQoUmVwYXJzZVJhbmdlIHJhbmdlKSB7Ci0JCQlpZiAocmFuZ2UgPT0gbnVsbCB8fCAhcmFuZ2UuaXNWYWxpZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IHN0YXJ0ID0gcmFuZ2UuZ2V0U3RhcnQoKTsKLQkJCWlmIChzdGFydCA8IGZSYW5nZVN0YXJ0KSB7Ci0JCQkJZlJhbmdlU3RhcnQgPSBzdGFydDsKLQkJCX0KLQkJCWludCBlbmQgPSByYW5nZS5nZXRFbmQoKTsKLQkJCWlmIChmUmFuZ2VFbmQgPCBlbmQpIHsKLQkJCQlmUmFuZ2VFbmQgPSBlbmQ7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGludCBmUmFuZ2VTdGFydDsKLQkJcHJpdmF0ZSBpbnQgZlJhbmdlRW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQkvLyBwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkvLyBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzMigpIHsKLQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBzcGVjaWFsUG9zaXRpb25VcGRhdGUoZlN0YXJ0LCBmU3RhcnQgKwotCS8vIGZMZW5ndGhUb1JlcGxhY2UgLSAxKTsKLQkvLyBpZiAocmVzdWx0ID09IG51bGwpIHsKLQkvLyByZXN1bHQgPSBjaGVja0luc2lkZUJyYWNlKCk7Ci0JLy8gfQotCS8vIHJldHVybiByZXN1bHQ7Ci0JLy8gfQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uU3ludGF4KCkgewotCQlpbnQgY2hlY2tTdGFydCA9IGZTdGFydDsKLQkJaW50IGNoZWNrRW5kID0gZlN0YXJ0ICsgZkxlbmd0aFRvUmVwbGFjZSAtIDE7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChjaGVja0VuZCk7Ci0JCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJY2hlY2tFbmQgPSBlbmRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKGNoZWNrU3RhcnQsIGNoZWNrRW5kKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JEZWxpbWl0ZXIocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yVW5rbm93blJlZ2lvbihyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclF1b3RlcyhyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JDb21tZW50cyhyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSkpOwotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JCcmFjZXMocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQ7Ci0KLQkJcmVzdWx0ID0gY2hlY2tJbnNpZGVCcmFjZShyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZXBhcnNlKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JVbmtub3duUmVnaW9uKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpbnQgbmV3U3RhcnQgPSBzdGFydDsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQgLSAxKTsKLQkJaWYgKGl0ZXJhdG9yLmhhc1ByZXYoKSkgewotCQkJaXRlcmF0b3IucHJldigpOyAvLyBza2lwIG15c2VsZgotCQl9Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNQcmV2KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXJhdG9yLnByZXYoKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKSB7Ci0JCQkJbmV3U3RhcnQgPSBpdGVyYXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3RhcnQgIT0gbmV3U3RhcnQpIHsKLQkJCXJldHVybiBuZXcgUmVwYXJzZVJhbmdlKG5ld1N0YXJ0LCBlbmQpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JEZWxpbWl0ZXIoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChkaXJ0eVN0YXJ0ICE9IG51bGwgJiYgZGlydHlTdGFydC5nZXRTdGFydCgpIDwgc3RhcnQpIHsKLQkJCXN0YXJ0ID0gZGlydHlTdGFydC5nZXRTdGFydCgpOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCWlmIChkb2NSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGRvY1JlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2UmVnaW9uID0gZG9jUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBSZXBhcnNlUmFuZ2UocHJldlJlZ2lvbi5nZXRTdGFydCgpLCBlbmQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JRdW90ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCVJlcGFyc2VSYW5nZSByYW5nZSA9IG5ldyBSZXBhcnNlUmFuZ2UoKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICJcIiIsICJcIiIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiXCciLCAiXCciKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChyYW5nZS5pc1ZhbGlkKCkpID8gcmFuZ2UgOiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yQ29tbWVudHMoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCVJlcGFyc2VSYW5nZSByYW5nZSA9IG5ldyBSZXBhcnNlUmFuZ2UoKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICIvKiIsICIqLyIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiPCUiLCAiJT4iKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChyYW5nZS5pc1ZhbGlkKCkpID8gcmFuZ2UgOiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yQnJhY2VzKGludCBzdGFydCwgaW50IGVuZCkgewotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiWyIsICJdIikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICIoIiwgIikiKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgInsiLCAifSIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKHJhbmdlLmlzVmFsaWQoKSkgPyByYW5nZSA6IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0luc2lkZUJyYWNlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWJvb2xlYW4gYkRlY2xhcmF0aW9uID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblR5cGUodHlwZSkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJYkRlY2xhcmF0aW9uID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWJEZWNsYXJhdGlvbikgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2UmVnaW9uID0gQ1NTVXRpbC5maW5kUHJldmlvdXNTaWduaWZpY2FudE5vZGUocmVnaW9uKTsKLQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQl0eXBlID0gcHJldlJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblR5cGUodHlwZSkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJCWJEZWNsYXJhdGlvbiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghYkRlY2xhcmF0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRSZWdpb24gPSBDU1NVdGlsLmZpbmROZXh0U2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IG5leHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25UeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCQliRGVjbGFyYXRpb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiRGVjbGFyYXRpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24gPSBmaW5kUnVsZVN0YXJ0KHJlZ2lvbik7Ci0JCQlpZiAoc3RhcnRSZWdpb24gIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQpOwotCQkJCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSByZXBhcnNlKHN0YXJ0UmVnaW9uLCBlbmRSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kUnVsZVN0YXJ0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBzdGFydFJlZ2lvbjsKLQkJLy8gZmluZCAneycKLQkJd2hpbGUgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJcmVnaW9uID0gcmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCX0KLQkJLy8gaWYgKHJlZ2lvbiA9PSBzdGFydFJlZ2lvbikgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyBlbHNlCi0JCWlmIChyZWdpb24gIT0gbnVsbCkgeyAvLyAneycgaXMgZm91bmQKLQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJaWYgKGlzTGVhZGluZ0RlY2xhcmF0aW9uVHlwZShyZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGVhZGluZ0RlY2xhcmF0aW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFIHx8IENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvclR5cGUodHlwZSkpOwotCX0KLQotCS8vIHB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCS8vIGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Cb3VuZHJ5Q2FzZXMoKSB7Ci0JLy8gcmV0dXJuIHNwZWNpYWxQb3NpdGlvblVwZGF0ZShmU3RhcnQsIGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxKTsKLQkvLyB9Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBSZXBhcnNlUmFuZ2UgZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIG9wZW5lciwgU3RyaW5nIGNsb3NlcikgewotCQlTdHJpbmdCdWZmZXIgZGVsZXRpb25CdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ0J1ZmZlciBpbnNlcnRpb25CdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBxdW90ZUxlbiA9IE1hdGgubWF4KG9wZW5lci5sZW5ndGgoKSwgY2xvc2VyLmxlbmd0aCgpKTsKLQkJaWYgKDEgPCBxdW90ZUxlbikgewotCQkJLyoqCi0JCQkgKiBleCkgb3BlbmVyID0gIkFCQyIsIGNsb3NlciA9ICJYWVoiIG1vZGVsOiBBQkNERUYuLi4uLi4uVVZXWFlaCi0JCQkgKiBkZWxldGlvbjogQ0RFRi4uLi4uLi5VVldYIHByZS9wb3N0OiBBQiAvIFlaCi0JCQkgKi8KLQkJCWludCBhZGRTdGFydCA9IHN0YXJ0IC0gKHF1b3RlTGVuIC0gMSk7Ci0JCQlpZiAoMCA8PSBhZGRTdGFydCkgewotCQkJCVN0cmluZyBhZGRTdHIgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChhZGRTdGFydCwgcXVvdGVMZW4gLSAxKTsKLQkJCQlkZWxldGlvbkJ1Zi5hcHBlbmQoYWRkU3RyKTsKLQkJCQlpbnNlcnRpb25CdWYuYXBwZW5kKGFkZFN0cik7Ci0JCQl9Ci0JCQlkZWxldGlvbkJ1Zi5hcHBlbmQoZkRlbGV0ZWRUZXh0KTsKLQkJCWluc2VydGlvbkJ1Zi5hcHBlbmQoZkNoYW5nZXMpOwotCQkJaWYgKGVuZCArIChxdW90ZUxlbiAtIDEpIDwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCVN0cmluZyBhZGRTdHIgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChlbmQgKyAxLCBxdW90ZUxlbiAtIDEpOwotCQkJCWRlbGV0aW9uQnVmLmFwcGVuZChhZGRTdHIpOwotCQkJCWluc2VydGlvbkJ1Zi5hcHBlbmQoYWRkU3RyKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWRlbGV0aW9uQnVmLmFwcGVuZChmRGVsZXRlZFRleHQpOwotCQkJaW5zZXJ0aW9uQnVmLmFwcGVuZChmQ2hhbmdlcyk7Ci0JCX0KLQkJU3RyaW5nIGRlbGV0aW9uID0gZGVsZXRpb25CdWYudG9TdHJpbmcoKTsKLQkJU3RyaW5nIGluc2VydGlvbiA9IGluc2VydGlvbkJ1Zi50b1N0cmluZygpOwotCi0JCWludCByYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCWludCByYW5nZUVuZCA9IGVuZDsKLQotCQlpZiAoMCA8PSBkZWxldGlvbi5pbmRleE9mKG9wZW5lcikgfHwgMCA8PSBkZWxldGlvbi5pbmRleE9mKGNsb3NlcikgfHwgMCA8PSBpbnNlcnRpb24uaW5kZXhPZihvcGVuZXIpIHx8IDAgPD0gaW5zZXJ0aW9uLmluZGV4T2YoY2xvc2VyKSkgewotCQkJaW50IHMsIGU7Ci0JCQl0cnkgewotCQkJCWlmIChzdGFydCA8PSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJCUlSZWdpb24gc3RhcnRSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoc3RhcnQgLSAxLCBvcGVuZXIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJaWYgKHN0YXJ0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCXMgPSBzdGFydFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXMgPSAtMTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcyA9IC0xOwotCQkJCX0KLQkJCQlpZiAoZW5kIDwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpIHsKLQkJCQkJSVJlZ2lvbiBlbmRSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoZW5kICsgMSwgY2xvc2VyLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQllID0gZW5kUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZSA9IC0xOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllID0gLTE7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpZiAoMCA8PSBzKSB7Ci0JCQkJcmFuZ2VTdGFydCA9IE1hdGgubWluKHJhbmdlU3RhcnQsIHMpOwotCQkJfQotCQkJaWYgKDAgPD0gZSkgewotCQkJCXJhbmdlRW5kID0gTWF0aC5tYXgocmFuZ2VFbmQsIGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJhbmdlU3RhcnQgPCBzdGFydCB8fCBlbmQgPCByYW5nZUVuZCkgewotCQkJcmV0dXJuIG5ldyBSZXBhcnNlUmFuZ2UocmFuZ2VTdGFydCwgcmFuZ2VFbmQpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjODNhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTU19HRU5FUklDID0gMTAxMTA5OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIENTU19HRU5FUklDIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkODE0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyIHsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0ID0gbnVsbDsKLQlJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCVN0cmluZyBmT3JpZ2luYWxDaGFuZ2VzID0gbnVsbDsKLQlpbnQgZk9yaWdpbmFsT2Zmc2V0ID0gMDsKLQlpbnQgZk9yaWdpbmFsTGVuZ3RoVG9SZXBsYWNlID0gMDsKLQlpbnQgZkxlbmd0aERpZmZlcmVuY2UgPSAwOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFdhbGtlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWluaXRpYWxpemUoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogT2xkIE5vZGVzOiAtLVtPMV0tLVtPMl0tLVtPM10tLS0gOiAvIFwgQ3VycmVudCBOb2RlczoKLQkgKiAtLS1bQzFdLS0tLS1bQzJdLS0tLS1bQzNdLS0tLS1bQzRdLS0tCi0JICogCi0JICogSW5wdXQ6IE8xIC0+IE91dHB1dDogTzIgSW5wdXQ6IE8yIC0+IE91dHB1dDogTzMgSW5wdXQ6IE8zIC0+IE91dHB1dDogQzQKLQkgKiBJbnB1dDogQ24gLT4gT3V0cHV0OiBDbisxCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUgPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQluZXh0Tm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQkJaWYgKG5leHROb2RlID09IG51bGwpIHsKLQkJCQlpZiAoaXNPbGROb2RlKG5vZGUpKSB7Ci0JCQkJCS8vIHRoaXMgbWF5IGJlIHRoZSBlbmQgb2Ygb2xkIGZsYXRub2RlcwotCQkJCQlpbnQgbmV3U3RhcnQgPSBub2RlLmdldEVuZCgpIC0gZkxlbmd0aERpZmZlcmVuY2U7Ci0JCQkJCW5leHROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXdTdGFydCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBPbGQgTm9kZXM6IC0tW08xXS0tW08yXS0tW08zXS0tLSA6IC8gXCBDdXJyZW50IE5vZGVzOgotCSAqIC0tLVtDMV0tLS0tLVtDMl0tLS0tLVtDM10tLS0tLVtDNF0tLS0KLQkgKiAKLQkgKiBJbnB1dDogTyogLT4gT3V0cHV0OiBDNCBJbnB1dDogQ24gLT4gT3V0cHV0OiBDbisxCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dE5vZGVJbkN1cnJlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUgPSBudWxsOwotCQlpZiAoaXNPbGROb2RlKG5vZGUpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZEVuZE5vZGUgPSBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5pdGVtKGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0LmdldExlbmd0aCgpIC0gMSk7Ci0JCQlpbnQgbmV3U3RhcnQgPSBvbGRFbmROb2RlLmdldEVuZCgpIC0gZkxlbmd0aERpZmZlcmVuY2U7Ci0JCQluZXh0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3U3RhcnQpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJbmV4dE5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gbmV4dE5vZGU7Ci0JfQotCi0JLyoqCi0JICogT2xkIE5vZGVzOiAtLVtPMV0tLVtPMl0tLVtPM10tLS0gOiAvIFwgQ3VycmVudCBOb2RlczoKLQkgKiAtLS1bQzFdLS0tLS1bQzJdLS0tLS1bQzNdLS0tLS1bQzRdLS0tCi0JICogCi0JICogSW5wdXQ6IE8xIC0+IE91dHB1dDogQzEgSW5wdXQ6IE8yIC0+IE91dHB1dDogTzEgSW5wdXQ6IE8zIC0+IE91dHB1dDogTzIKLQkgKiBJbnB1dDogQ24gLT4gT3V0cHV0OiBDbi0xCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UHJldk5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlwcmV2Tm9kZSA9IG5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChwcmV2Tm9kZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzT2xkTm9kZShub2RlKSkgewotCQkJCQkvLyB0aGlzIG1heSBiZSB0aGUgc3RhcnQgb2Ygb2xkIGZsYXRub2RlcwotCQkJCQlpbnQgbmV3RW5kID0gbm9kZS5nZXRTdGFydCgpIC0gMTsKLQkJCQkJcHJldk5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5ld0VuZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwcmV2Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBPbGQgTm9kZXM6IC0tW08xXS0tW08yXS0tW08zXS0tLSA6IC8gXCBDdXJyZW50IE5vZGVzOgotCSAqIC0tLVtDMV0tLS0tLVtDMl0tLS0tLVtDM10tLS0tLVtDNF0tLS0KLQkgKiAKLQkgKiBJbnB1dDogTyogLT4gT3V0cHV0OiBDMSBJbnB1dDogQ24gLT4gT3V0cHV0OiBDbi0xCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UHJldk5vZGVJbkN1cnJlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBudWxsOwotCQlpZiAoaXNPbGROb2RlKG5vZGUpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0YXJ0Tm9kZSA9IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0Lml0ZW0oMCk7Ci0JCQlpbnQgbmV3RW5kID0gb2xkU3RhcnROb2RlLmdldFN0YXJ0KCkgLSAxOwotCQkJcHJldk5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5ld0VuZCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlwcmV2Tm9kZSA9IG5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJfQotCQlyZXR1cm4gcHJldk5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWZPcmlnaW5hbENoYW5nZXMgPSBldmVudC5nZXRUZXh0KCk7Ci0JCWZPcmlnaW5hbE9mZnNldCA9IGV2ZW50LmdldE9mZnNldCgpOwotCQlmT3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UgPSBldmVudC5nZXRMZW5ndGgoKTsKLQkJZkxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShmT3JpZ2luYWxDaGFuZ2VzLCBmT3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UpOwotCi0JCWlmIChldmVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSB7Ci0JCQlmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIGV2ZW50KS5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09sZE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWJvb2xlYW4gYk9sZCA9IGZhbHNlOwotCQlpZiAoZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgIT0gbnVsbCkgewotCQkJRW51bWVyYXRpb24gZSA9IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0LmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCWlmIChlLm5leHRFbGVtZW50KCkgPT0gbm9kZSkgewotCQkJCQliT2xkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBiT2xkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQ1M2MxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUyBleHRlbmRzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gbGVnYWxUeXBlcyA9IG5ldyBTdHJpbmdbXXtJQ1NTUGFydGl0aW9ucy5TVFlMRSwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OfTsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBsZWdhbFR5cGVzOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0Fic3RyYWN0Q3NzVHJhdmVyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQWJzdHJhY3RDc3NUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxMWI1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQWJzdHJhY3RDc3NUcmF2ZXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwdWJsaWMgc3RhdGljIHNob3J0IFRSQVZfQ09OVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBzaG9ydCBUUkFWX1BSVU5FID0gMTsKLQlwdWJsaWMgc3RhdGljIHNob3J0IFRSQVZfU1RPUCA9IDI7Ci0JcHJvdGVjdGVkIGphdmEudXRpbC5TdGFjayB0cmF2U3RhY2s7Ci0JcHJpdmF0ZSBib29sZWFuIGZUcmF2ZXJzZUltcG9ydGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZUcmF2ZXJzZUltcG9ydEZpcnN0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIHRyYXZlcnNlZFNoZWV0czsKLQotCS8qKgotCSAqIENzc1Byb3BDTU5vZGUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RDc3NUcmF2ZXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhcHBseShJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJYXBwbHkobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgYXBwbHkoSUNTU05vZGUgcm9vdCkgewotCQl0cmF2U3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJaWYgKGZUcmF2ZXJzZUltcG9ydGVkKSB7Ci0JCQl0cmF2ZXJzZWRTaGVldHMgPSBuZXcgVmVjdG9yKCk7Ci0JCQlpZiAocm9vdCAhPSBudWxsICYmIHJvb3QuZ2V0T3duZXJEb2N1bWVudCgpICE9IG51bGwgJiYgcm9vdC5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCQl0cmF2ZXJzZWRTaGVldHMuYWRkKHJvb3QuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGZpcnN0IGNhbGwgYmVnaW4oKQotCQliZWdpbihyb290KTsKLQotCQkvLyB0cmF2ZXJzZQotCQl0cmF2ZXJzZShyb290KTsKLQotCQkvLyBsYXN0IGNhbGwgZW5kKCkKLQkJZW5kKHJvb3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgZW5kKElDU1NOb2RlIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1RyYXZlcnNlSW1wb3J0ZWQoKSB7Ci0JCXJldHVybiBmVHJhdmVyc2VJbXBvcnRlZDsKLQl9Ci0KLQotCXByb3RlY3RlZCBzaG9ydCBwb3N0Tm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoc2hvcnQpIDA7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoc2hvcnQpIDA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1RyYXZlcnNlSW1wb3J0ZWQKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRUcmF2ZXJzZUltcG9ydGVkKGJvb2xlYW4gbmV3VHJhdmVyc2VJbXBvcnRlZCkgewotCQlmVHJhdmVyc2VJbXBvcnRlZCA9IG5ld1RyYXZlcnNlSW1wb3J0ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1RyYXZlcnNlSW1wb3J0Rmlyc3QKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRUcmF2ZXJzZUltcG9ydEZpcnN0KGJvb2xlYW4gbmV3VHJhdmVyc2VJbXBvcnRGaXJzdCkgewotCQlmVHJhdmVyc2VJbXBvcnRGaXJzdCA9IG5ld1RyYXZlcnNlSW1wb3J0Rmlyc3Q7Ci0JfQotCi0KLQlwcml2YXRlIGZpbmFsIHNob3J0IHRyYXZlcnNlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0KLQkJdHJhdlN0YWNrLnB1c2gobm9kZSk7Ci0KLQkJLy8gcHJlLWFjdGlvbgotCQlzaG9ydCByZXQgPSBwcmVOb2RlKG5vZGUpOwotCi0JCWlmIChyZXQgPT0gVFJBVl9DT05UKSB7Ci0JCQlpZiAoZlRyYXZlcnNlSW1wb3J0ZWQgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpKSB7Ci0JCQkJSUNTU0ltcG9ydFJ1bGUgcnVsZSA9IChJQ1NTSW1wb3J0UnVsZSkgbm9kZTsKLQkJCQkvLyB0cmF2ZXJzZSBleHRlcm5hbCBzdHlsZS1zaGVldAotCQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gKElDU1NTdHlsZVNoZWV0KSBydWxlLmdldFN0eWxlU2hlZXQoKTsKLQkJCQlpZiAoc2hlZXQgIT0gbnVsbCAmJiAhdHJhdmVyc2VkU2hlZXRzLmNvbnRhaW5zKHNoZWV0KSkgeyAvLyBwcmV2ZW50Ci0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG9vcAotCQkJCQl0cmF2ZXJzZWRTaGVldHMuYWRkKHNoZWV0KTsKLQkJCQkJc2hvcnQgcmV0RXh0ID0gdHJhdmVyc2Uoc2hlZXQpOwotCQkJCQlpZiAocmV0RXh0ID09IFRSQVZfU1RPUCkgewotCQkJCQkJdHJhdlN0YWNrLnBvcCgpOwotCQkJCQkJcmV0dXJuIHJldEV4dDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gY29sbGVjdCBjaGlsZHJlbgotCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChmVHJhdmVyc2VJbXBvcnRGaXJzdCkgewotCQkJCUFycmF5TGlzdCBvdGhlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpCi0JCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQllbHNlCi0JCQkJCQlvdGhlcnMuYWRkKGNoaWxkKTsKLQkJCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCQljaGlsZHJlbi5hZGRBbGwob3RoZXJzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHRyYXZlcnNlIGNoaWxkcmVuCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJY2hpbGQgPSAoSUNTU05vZGUpIGNoaWxkcmVuLmdldChpKTsKLQkJCQlzaG9ydCByZXRDaGlsZCA9IHRyYXZlcnNlKGNoaWxkKTsKLQkJCQlpZiAocmV0Q2hpbGQgPT0gVFJBVl9TVE9QKSB7Ci0JCQkJCXRyYXZTdGFjay5wb3AoKTsKLQkJCQkJcmV0dXJuIHJldENoaWxkOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChyZXQgPT0gVFJBVl9TVE9QKSB7Ci0JCQl0cmF2U3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJLy8gcG9zdC1hY3Rpb24KLQkJcmV0ID0gcG9zdE5vZGUobm9kZSk7Ci0KLQkJdHJhdlN0YWNrLnBvcCgpOwotCQlyZXR1cm4gKHJldCA9PSBUUkFWX1BSVU5FKSA/IFRSQVZfQ09OVCA6IHJldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTQ2xhc3NUcmF2ZXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NDbGFzc1RyYXZlcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2EzNTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NDbGFzc1RyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU0NsYXNzVHJhdmVyc2VyIGV4dGVuZHMgQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JQXJyYXlMaXN0IGZDbGFzc05hbWVzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU0NsYXNzVHJhdmVyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDbGFzc05hbWVzKElDU1NTdHlsZVJ1bGUgcnVsZSkgewotCQlJQ1NTU2VsZWN0b3JMaXN0IHNlbGVjdG9yTGlzdCA9IHJ1bGUuZ2V0U2VsZWN0b3JzKCk7Ci0JCUl0ZXJhdG9yIGlTZWxlY3RvciA9IHNlbGVjdG9yTGlzdC5nZXRJdGVyYXRvcigpOwotCQl3aGlsZSAoaVNlbGVjdG9yLmhhc05leHQoKSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gKElDU1NTZWxlY3RvcikgaVNlbGVjdG9yLm5leHQoKTsKLQkJCUl0ZXJhdG9yIGlJdGVtID0gc2VsZWN0b3IuZ2V0SXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpSXRlbS5oYXNOZXh0KCkpIHsKLQkJCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSAoSUNTU1NlbGVjdG9ySXRlbSkgaUl0ZW0ubmV4dCgpOwotCQkJCWlmIChpdGVtLmdldEl0ZW1UeXBlKCkgPT0gSUNTU1NlbGVjdG9ySXRlbS5TSU1QTEUpIHsKLQkJCQkJSUNTU1NpbXBsZVNlbGVjdG9yIHNlbCA9IChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW07Ci0JCQkJCWludCBuQ2xhc3NlcyA9IHNlbC5nZXROdW1PZkNsYXNzZXMoKTsKLQkJCQkJZm9yIChpbnQgaUNsYXNzID0gMDsgaUNsYXNzIDwgbkNsYXNzZXM7IGlDbGFzcysrKSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gc2VsLmdldENsYXNzKGlDbGFzcyk7Ci0JCQkJCQlpZiAoIWZDbGFzc05hbWVzLmNvbnRhaW5zKGNsYXNzTmFtZSkpCi0JCQkJCQkJZkNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChmQ2xhc3NOYW1lcyA9PSBudWxsKQotCQkJZkNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5kKElDU1NOb2RlIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDbGFzc05hbWVzKCkgewotCQlyZXR1cm4gKGZDbGFzc05hbWVzICE9IG51bGwpID8gZkNsYXNzTmFtZXMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwb3N0Tm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlzaG9ydCByZXQ7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJYWRkQ2xhc3NOYW1lcygoSUNTU1N0eWxlUnVsZSkgbm9kZSk7Ci0JCQlyZXQgPSBUUkFWX1BSVU5FOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCB8fCBub2RlIGluc3RhbmNlb2YgSUNTU01lZGlhUnVsZSB8fCBub2RlIGluc3RhbmNlb2YgSUNTU0ltcG9ydFJ1bGUpIHsKLQkJCXJldCA9IFRSQVZfQ09OVDsKLQkJfQotCQllbHNlIHsKLQkJCXJldCA9IFRSQVZfUFJVTkU7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTTGlua0NvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU0xpbmtDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3ZGNkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTTGlua0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU0xpbmtDb252ZXJ0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9CRUdJTiA9ICJ1cmwoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5EID0gIikiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRF9RVU9URSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU19RVU9URSA9ICJcJyI7IC8vJE5PTi1OTFMtMSQKLQotCUlTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU0xpbmtDb252ZXJ0ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQliYXNlTW9kZWwgPSBtb2RlbDsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsICYmICgoSUNTU01vZGVsKSBtb2RlbCkuZ2V0U3R5bGVTaGVldFR5cGUoKSAhPSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpICgoSUNTU01vZGVsKSBtb2RlbCkuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCQliYXNlTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRGdW5jKFN0cmluZyB2YWx1ZSkgewotCQlpZiAoIXZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVVJMX0JFR0lOKSkgewotCQkJLy8gcGFfVE9ETyBjc3MgcHJlZgotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJdmFsdWUgPSBDU1NVdGlsLnN0cmlwUXVvdGVzKHZhbHVlKTsKLQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZSh2YWx1ZSwgcXVvdGUpOwotCQkJU3RyaW5nIHN0ciA9IFVSTF9CRUdJTjsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IHN0ci50b1VwcGVyQ2FzZSgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyKTsKLQkJCWJ1Zi5hcHBlbmQocXVvdGUpOwotCQkJYnVmLmFwcGVuZCh2YWx1ZSk7Ci0JCQlidWYuYXBwZW5kKHF1b3RlKTsKLQkJCWJ1Zi5hcHBlbmQoVVJMX0VORCk7Ci0JCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChiYXNlTW9kZWwgPT0gbnVsbCkgewotCQkJYmFzZU1vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCWlmIChiYXNlTW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwgJiYgKChJQ1NTTW9kZWwpIGJhc2VNb2RlbCkuZ2V0U3R5bGVTaGVldFR5cGUoKSAhPSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSAoKElDU1NNb2RlbCkgYmFzZU1vZGVsKS5nZXRPd25lckRPTU5vZGUoKTsKLQkJCQliYXNlTW9kZWwgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXJsKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlzb3VyY2UgPSBzb3VyY2UudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCXJldHVybiBzb3VyY2Uuc3RhcnRzV2l0aChVUkxfQkVHSU4pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5QUklNSVRJVkVWQUxVRV9OT0RFKSB7Ci0JCQl0b0Fic29sdXRlKChDU1NWYWx1ZSkgbm9kZSk7Ci0JCX0gZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJSUNTU0ltcG9ydFJ1bGUgaVJ1bGUgPSAoSUNTU0ltcG9ydFJ1bGUpIG5vZGU7Ci0JCQlpUnVsZS5zZXRIcmVmKHRvQWJzb2x1dGUoYWRkRnVuYyhpUnVsZS5nZXRIcmVmKCkpKSk7Ci0JCX0KLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVGdW5jKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWTsKLQkJU3RyaW5nIGZpZWxkID0gdmFsdWUudHJpbSgpOwotCQkvLyBmaXJzdCA6IHRlYXIgInVybCguLi4uKSIKLQkJaWYgKGZpZWxkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChVUkxfQkVHSU4pKSB7Ci0JCQlpbnQgdXJsID0gZmllbGQudG9Mb3dlckNhc2UoKS5pbmRleE9mKFVSTF9CRUdJTik7Ci0JCQlpbnQgZW5kUGFyZW50aGVzaXMgPSBmaWVsZC5sYXN0SW5kZXhPZihVUkxfRU5EKTsKLQkJCWlmIChlbmRQYXJlbnRoZXNpcyA+IHVybCkgewotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHVybCArIDQsIGVuZFBhcmVudGhlc2lzKTsKLQkJCX0gZWxzZQotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHVybCArIDQpOwotCQl9Ci0JCXJldHVybiBmaWVsZC50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBGdW5jKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBFTVBUWTsKLQkJLy8gZmlyc3QgOiB0ZWFyICJ1cmwoLi4uLikiCi0JCVN0cmluZyBmaWVsZCA9IHJlbW92ZUZ1bmModmFsdWUpOwotCQkvLyBzZWNvbmQgOiB0ZWFyIHF1b3RhdGlvbnMKLQkJaWYgKGZpZWxkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChEX1FVT1RFKSkgewotCQkJaW50IHF1b3RlID0gZmllbGQuaW5kZXhPZihEX1FVT1RFKTsKLQkJCWludCBlbmQgPSBmaWVsZC5sYXN0SW5kZXhPZihEX1FVT1RFKTsKLQkJCWlmIChlbmQgPiBxdW90ZSkgewotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHF1b3RlICsgMSwgZW5kKTsKLQkJCX0gZWxzZQotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHF1b3RlICsgMSk7Ci0JCX0gZWxzZSBpZiAoZmllbGQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFNfUVVPVEUpKSB7Ci0JCQlpbnQgcXVvdGUgPSBmaWVsZC5pbmRleE9mKFNfUVVPVEUpOwotCQkJaW50IGVuZCA9IGZpZWxkLmxhc3RJbmRleE9mKFNfUVVPVEUpOwotCQkJaWYgKGVuZCA+IHF1b3RlKSB7Ci0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcocXVvdGUgKyAxLCBlbmQpOwotCQkJfSBlbHNlCi0JCQkJZmllbGQgPSBmaWVsZC5zdWJzdHJpbmcocXVvdGUgKyAxKTsKLQkJfQotCi0JCXJldHVybiBmaWVsZC50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyB0b0Fic29sdXRlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKGlzVXJsKHNvdXJjZSkpIHsKLQkJCVN0cmluZyB1cmwgPSBDU1NQYXRoU2VydmljZS5nZXRBYnNvbHV0ZVVSTChiYXNlTW9kZWwsIHN0cmlwRnVuYyhzb3VyY2UpKTsKLQkJCXJldHVybiAodXJsICE9IG51bGwpID8gYWRkRnVuYyh1cmwpIDogKFVSTF9CRUdJTiArIFVSTF9FTkQpOwotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gdG9BYnNvbHV0ZShDU1NWYWx1ZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQlJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUgPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCQkJaWYgKHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJKSB7Ci0JCQkJdmFsdWUuc2V0VmFsdWUoc3RyaXBGdW5jKHRvQWJzb2x1dGUoVVJMX0JFR0lOICsgdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKSArIFVSTF9FTkQpKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NQYXRoU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1BhdGhTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MzI4MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1BhdGhTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1BhdGhTZXJ2aWNlIHsKLQotCS8vIENvbnN0YW50cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFVVJMU0NIRU1FID0gImZpbGUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMQ09MT04gPSAiOiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRVVSTFBSRUZJWCA9IEZJTEVVUkxTQ0hFTUUgKyBVUkxDT0xPTiArICIvLyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxTRVBBUkFUT1IgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlVVJMKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB7Ci0JCVN0cmluZyBhYnNMaW5rID0gVVJMTW9kZWxQcm92aWRlckNTUy5yZXNvbHZlVVJJKGJhc2VNb2RlbCwgcmVmLCB0cnVlKTsKLQkJU3RyaW5nIHVybCA9IGFic0xpbms7Ci0JCWlmIChhYnNMaW5rICE9IG51bGwpIHsgLy8gaWYgaXQgaGFzIG5vdCBzY2hlbWUsIHdlIG11c3QgYWRkICJmaWxlIgotCQkJCQkJCQkvLyBzY2hlbWUKLQkJCXRyeSB7Ci0JCQkJbmV3IGphdmEubmV0LlVSTChhYnNMaW5rKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChhYnNMaW5rKTsKLQkJCQlpZiAocGF0aCAhPSBudWxsKQotCQkJCQl1cmwgPSB0b1VSTChwYXRoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGxvY2F0aW9uMkZpbGUoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQlpZiAoZmlsZSA9PSBudWxsICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGZpbGUgVVJMIGZvciB0aGUgcGF0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9VUkwoSVBhdGggcGF0aCkgewotCQlwYXRoID0gbmV3IFBhdGgocGF0aC50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWlmIChwYXRoLmlzVU5DKCkgPT0gdHJ1ZSkgewotCQkJLy8gaXQncyBVTkMuIHJldHVybiBmaWxlOi8vaG9zdC9mb28vYmFyL2Jhei5odG1sCi0JCQlyZXR1cm4gRklMRVVSTFNDSEVNRSArIFVSTENPTE9OICsgcGF0aC50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBGSUxFVVJMUFJFRklYICsgVVJMU0VQQVJBVE9SICsgcGF0aC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTZWxlY3Rvckxpc3RGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmM3YjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTZWxlY3Rvckxpc3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTU2VsZWN0b3JMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeSB7Ci0Jc3RhdGljIHN5bmNocm9uaXplZCBwdWJsaWMgQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIElDU1NTZWxlY3Rvckxpc3QgY3JlYXRlU2VsZWN0b3JMaXN0KFN0cmluZyBzZWxlY3RvclN0cmluZykgewotCQlyZXR1cm4gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoc2VsZWN0b3JTdHJpbmcpOwotCX0KLQotCi0JcHJpdmF0ZSBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU1NlbGVjdG9yTGlzdEZhY3RvcnkgZkluc3RhbmNlOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5OGEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkgZXh0ZW5kcyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NTdHlsZURlY2xhcmF0aW9uCi0JICogQHBhcmFtIGRlY2wKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZVN0eWxlRGVjbGFyYXRpb24oSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBuZXdOb2RlID0gY3JlYXRlU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZPd25lckRvY3VtZW50ID0gbmV3Tm9kZTsKLQkJY2xvbmVDaGlsZE5vZGVzKGRlY2wsIG5ld05vZGUpOwotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzdjMWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENTU1V0aWwgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnT3V0KFN0cmluZyBzdHIpIHsKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgImNzcyB3YXJuaW5nOiAiICsgc3RyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCS8vIHB1YmxpYyBzdGF0aWMgVmVjdG9yIGV4dHJhY3RNZWRpYUNvbnRlbnRzKFZlY3RvciByZWdpb25zKSB7Ci0JLy8gVmVjdG9yIG1lZGlhID0gbmV3IFZlY3RvcigpOwotCS8vIGlmIChyZWdpb25zID09IG51bGwpIHsgcmV0dXJuIG1lZGlhOyB9Ci0JLy8KLQkvLyBib29sZWFuIGJSZWFkeSA9IHRydWU7Ci0JLy8gZm9yIChJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JLy8gSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKWkubmV4dCgpOwotCS8vIGlmIChyZWdpb24gPT0gbnVsbCkgeyBjb250aW51ZTsgfQotCS8vIFN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkvLyBpZiAoYlJlYWR5KSB7Ci0JLy8gaWYgKHR5cGUgPT0gSURFTlQpIHsKLQkvLyBtZWRpYS5hZGRFbGVtZW50KHJlZ2lvbi5nZXRUZXh0KCkpOwotCS8vIGJSZWFkeSA9IGZhbHNlOwotCS8vIH0KLQkvLyB9IGVsc2UgewotCS8vIGlmICh0eXBlID09IENPTU1BKSB7Ci0JLy8gYlJlYWR5ID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vIHJldHVybiBtZWRpYTsKLQkvLyB9Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFN0cmluZ0NvbnRlbnRzKFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBzdHJpcFF1b3Rlcyh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0VXJpQ29udGVudHMoU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGNvbnRlbnRzID0gdGV4dC50cmltKCk7Ci0JCWlmIChjb250ZW50cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInVybCgiKSAmJiAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRlbnRzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIikiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8vIHN0cmlwICJ1cmwoIiwgIikiCi0JCQljb250ZW50cyA9IGNvbnRlbnRzLnN1YnN0cmluZyg0LCBjb250ZW50cy5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCWNvbnRlbnRzID0gc3RyaXBRdW90ZXMoY29udGVudHMpOwotCi0JCXJldHVybiBjb250ZW50czsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZE5leHRTaWduaWZpY2FudE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUpIHsKLQkJaWYgKHN0YXJ0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBzdGFydE5vZGUuZ2V0TmV4dCgpOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobm9kZSk7Ci0JCQlpZiAodHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZE5vZGVCYWNrd2FyZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmROb2RlLCBTdHJpbmcgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGU7Ci0JCWZvciAobm9kZSA9IHN0YXJ0Tm9kZTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQcmV2aW91cygpKSB7Ci0JCQlpZiAobm9kZS5nZXRTdGFydE9mZnNldCgpIDwgZW5kTm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJbm9kZSA9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5vZGUpID09IHR5cGUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZE5vZGVGb3J3YXJkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZTsKLQkJZm9yIChub2RlID0gc3RhcnROb2RlOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHQoKSkgewotCQkJaWYgKGVuZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCW5vZGUgPSBudWxsOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKSA9PSB0eXBlKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmRQcmV2aW91c1NpZ25pZmljYW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSkgewotCQlpZiAoc3RhcnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHN0YXJ0Tm9kZS5nZXRQcmV2aW91cygpOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobm9kZSk7Ci0JCQlpZiAodHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldFByZXZpb3VzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NTdHJpbmcoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBuYW1lID0gb2JqZWN0LmdldENsYXNzKCkudG9TdHJpbmcoKTsKLQkJCWludCBsYXN0UGVyaW9kID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGxhc3RQZXJpb2QgKyAxKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTkRFRklORUQ7Ci0JCX0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTkRFRklORUQ7Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCXJldHVybiByZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExlbmd0aERpZmZlcmVuY2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3Tm9kZXMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZE5vZGVzKSB7Ci0JCWludCBuZXdMZW4gPSBnZXRUZXh0TGVuZ3RoKG5ld05vZGVzKTsKLQkJaW50IG9sZExlbiA9IGdldFRleHRMZW5ndGgob2xkTm9kZXMpOwotCQlyZXR1cm4gbmV3TGVuIC0gb2xkTGVuOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlZ2lvblRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJYnVmLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFRleHRMZW5ndGgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgbm9kZXMpIHsKLQkJaW50IGxlbmd0aCA9IDA7Ci0KLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWZvciAoRW51bWVyYXRpb24gZSA9IG5vZGVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoICs9IGZsYXROb2RlLmdldFRleHQoKS5sZW5ndGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZW5ndGgoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCWlmICh0b2tlbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCWRvdWJsZSBudW1iZXIgPSBEb3VibGUucGFyc2VEb3VibGUodG9rZW4uaW1hZ2UpOwotCQkJaWYgKG51bWJlciA9PSAwLjApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlbGVjdG9yVGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUocmVnaW9uKTsKLQkJaWYgKENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUodHlwZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04pIHsKLQkJCS8vIFN0cmluZyB0ZXh0ID0gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQkJLy8gaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0LmluZGV4T2YoJy4nKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vIH0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcFF1b3RlcyhTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBjb250ZW50cyA9IHRleHQudHJpbSgpOwotCQlpZiAoMiA8PSBjb250ZW50cy5sZW5ndGgoKSkgewotCQkJY2hhciBmaXJzdCA9IGNvbnRlbnRzLmNoYXJBdCgwKTsKLQkJCWNoYXIgbGFzdCA9IGNvbnRlbnRzLmNoYXJBdChjb250ZW50cy5sZW5ndGgoKSAtIDEpOwotCQkJaWYgKChmaXJzdCA9PSAnXCInICYmIGxhc3QgPT0gJ1wiJykgfHwgKGZpcnN0ID09ICdcJycgJiYgbGFzdCA9PSAnXCcnKSkgewotCQkJCWNvbnRlbnRzID0gY29udGVudHMuc3Vic3RyaW5nKDEsIGNvbnRlbnRzLmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGVjdFF1b3RlKFN0cmluZyBzb3VyY2UsIFN0cmluZyBkZWZhdWx0UXVvdGUpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIGRlZmF1bHRRdW90ZTsKLQkJZmluYWwgU3RyaW5nIERfUVVPVEUgPSAiXCIiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBTX1FVT1RFID0gIlwnIjsgLy8kTk9OLU5MUy0xJAotCi0JCWludCBkSW5kZXggPSBzb3VyY2UuaW5kZXhPZihEX1FVT1RFKTsKLQkJaW50IHNJbmRleCA9IHNvdXJjZS5pbmRleE9mKFNfUVVPVEUpOwotCQlpZiAoZEluZGV4IDwgMCAmJiBzSW5kZXggPCAwKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdFF1b3RlOwotCQl9Ci0JCWVsc2UgaWYgKGRJbmRleCA8IDApIHsKLQkJCXJldHVybiBEX1FVT1RFOwotCQl9Ci0JCWVsc2UgaWYgKHNJbmRleCA8IDApIHsKLQkJCXJldHVybiBTX1FVT1RFOwotCQl9Ci0JCWVsc2UgaWYgKGRJbmRleCA8IHNJbmRleCkgewotCQkJcmV0dXJuIFNfUVVPVEU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRF9RVU9URTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdHJpcFN1cnJvdW5kaW5nU3BhY2UoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXdoaWxlICghcmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCXJlZ2lvbnMucmVtb3ZlKDApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQlyZWdpb25zLnJlbW92ZShyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0UnVsZUNvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0ltcG9ydFJ1bGVDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjOTE1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0UnVsZUNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0UnVsZUNvbGxlY3RvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXByb3RlY3RlZCBqYXZhLnV0aWwuVmVjdG9yIHJ1bGVzID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBJQ1NTU3R5bGVTaGVldCB0YXJnZXQgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEltcG9ydFJ1bGVDb2xsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRyYXZlcnNlSW1wb3J0ZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbXBvcnRSdWxlQ29sbGVjdG9yKElDU1NTdHlsZVNoZWV0IHNoZWV0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRhcmdldCA9IHNoZWV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuVmVjdG9yIGdldFJ1bGVzKCkgewotCQlyZXR1cm4gcnVsZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBUlVMRV9OT0RFIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpIHsKLQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCUlDU1NJbXBvcnRSdWxlIGltcCA9IChJQ1NTSW1wb3J0UnVsZSkgbm9kZTsKLQkJCQlpZiAoaW1wLmdldFN0eWxlU2hlZXQoKSAhPSB0YXJnZXQpCi0JCQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQkJfQotCQkJaWYgKCFydWxlcy5jb250YWlucyhub2RlKSkKLQkJCQlydWxlcy5hZGQobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0ltcG9ydGVkQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0ZWRDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyYTdhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0ZWRDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRlZENvbGxlY3RvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXByb3RlY3RlZCBqYXZhLnV0aWwuVmVjdG9yIGV4dGVybmFscyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbXBvcnRlZENvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VHJhdmVyc2VJbXBvcnRlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlcm5hbHMoKSB7Ci0JCXJldHVybiBleHRlcm5hbHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBUlVMRV9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQlpZiAoIWV4dGVybmFscy5jb250YWlucyhub2RlKSkgewotCQkJCWV4dGVybmFscy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9SZWdpb25JdGVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1JlZ2lvbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDAwMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1JlZ2lvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvbkl0ZXJhdG9yIHsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1ckRvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIGludCBjdXJyZW50ID0gLTE7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGludCBpbmRleCkgewotCQlzdXBlcigpOwotCi0JCXJlc2V0KHN0cnVjdHVyZWREb2N1bWVudCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZWdpb25JdGVyYXRvcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJc3VwZXIoKTsKLQkJcmVzZXQoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gY3VyRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJaWYgKGRvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChjdXJyZW50IDwgMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGN1cnJlbnQgPCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2KCkgewotCQkvLyB0aGUgc2FtZSBhcyBoYXNOZXh0KCkKLQkJcmV0dXJuIGhhc05leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gbmV4dCgpIHsKLQkJaWYgKGRvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGN1cnJlbnQgPCAwIHx8IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKSA9PSBudWxsIHx8IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPD0gY3VycmVudCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoY3VycmVudCk7Ci0JCWN1ckRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb247Ci0KLQkJaWYgKGN1cnJlbnQgPj0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJY3VycmVudCA9IC0xOwotCQl9Ci0JCWN1cnJlbnQrKzsKLQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBwcmV2KCkgewotCQlpZiAoZG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY3VycmVudCA8IDAgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpID09IG51bGwgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA8PSBjdXJyZW50KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldChjdXJyZW50KTsKLQkJY3VyRG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbjsKLQotCQlpZiAoY3VycmVudCA9PSAwKSB7Ci0JCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQljdXJyZW50ID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJCWVsc2UKLQkJCQljdXJyZW50ID0gMDsKLQkJfQotCQljdXJyZW50LS07Ci0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JCWRvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4KTsKLQkJY3VyRG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbjsKLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4KTsKLQkJCWN1cnJlbnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuaW5kZXhPZihyZWdpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiBmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRvY3VtZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0JCQljdXJEb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCQkJY3VycmVudCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5pbmRleE9mKHJlZ2lvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNDRjYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25Db2xsZWN0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlpbnQgc3RhcnQsIGVuZDsKLQlMaXN0IHNlbGVjdGVkTm9kZXM7Ci0KLQkvKioKLQkgKiBTZWxlY3Rpb25Db2xsZWN0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJlZ2luKElDU1NOb2RlIG5vZGUpIHsKLQkJc2VsZWN0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKCkgewotCQlpZiAoc2VsZWN0ZWROb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Qoc2VsZWN0ZWROb2Rlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpTm9kZS5nZXRTdGFydE9mZnNldCgpIDw9IGVuZCAmJiBzdGFydCA8IGlOb2RlLmdldEVuZE9mZnNldCgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJCUluZGV4ZWRSZWdpb24gaUZpcnN0Q2hpbGQgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBpTGFzdENoaWxkID0gKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJaWYgKGlGaXJzdENoaWxkID09IG51bGwgfHwgc3RhcnQgPCBpRmlyc3RDaGlsZC5nZXRTdGFydE9mZnNldCgpIHx8IGlMYXN0Q2hpbGQuZ2V0RW5kT2Zmc2V0KCkgPD0gZW5kKQotCQkJCQlzZWxlY3RlZE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQkJaWYgKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPiBlbmQpCi0JCQlyZXR1cm4gVFJBVl9TVE9QOwotCQllbHNlCi0JCQlyZXR1cm4gVFJBVl9QUlVORTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWdpb24oaW50IG5ld1N0YXJ0LCBpbnQgbmV3RW5kKSB7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWVuZCA9IG5ld0VuZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0b3JWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDUyZTE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTZWxlY3Rvckxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0b3JWYWxpZGF0b3IgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFNlbGVjdG9yVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBTZWxlY3RvclZhbGlkYXRvcihTdHJpbmcgdGV4dCkgewotCQlzdXBlcigpOwotCQlmVGV4dCA9IHRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0ZXh0IGNvbnNpc3RzIG9mIG9uZSBDTEFTUyBzZWxlY3Rvci4gc3ludGF4IGNoZWNrCi0JICogaXMgYSBsaXR0bGUgbG9vc2UgKC4xMjMgaXMgcGFzc2VkKQotCSAqIAotCSAqICIuY2xhc3MiIC0+IHRydWUgIi4xMjMiIC0+IHRydWUgIi5jbGFzcyAsIC5jbGFzczIiIC0+IGZhbHNlCi0JICogIi5jbGFzcy5jbGFzczIiIC0+IGZhbHNlICIuMTIze30iIC0+IGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGFzcygpIHsKLQkJSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yID0gZ2V0T25seU9uZVNpbXBsZVNlbGVjdG9yKCk7Ci0JCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHNlbGVjdG9yLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mQXR0cmlidXRlcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCkgPT0gMSAmJiBzZWxlY3Rvci5nZXROdW1PZklEcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpID09IDApOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgY29uc2lzdHMgb2Ygb25lIElEIHNlbGVjdG9yLgotCSAqIAotCSAqICIjSUQiIC0+IHRydWUgIkgxI215SUQiIC0+IGZhbHNlICIjYWJje30iIC0+IGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJRCgpIHsKLQkJSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yID0gZ2V0T25seU9uZVNpbXBsZVNlbGVjdG9yKCk7Ci0JCWlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHNlbGVjdG9yLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mQXR0cmlidXRlcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZklEcygpID09IDEgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpID09IDApOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBvdmVyYWxsIGNoZWNrCi0JICogCi0JICogIlAjaG9nZTk4ICsgKjpob3ZlciA+IEE6bGluaywgQS5leHRlcm5hbDp2aXNpdGVkIiAtPiB0cnVlICJIMSBIMiB7fSIgLT4KLQkgKiBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXBhcnNlKCk7Ci0JCXJldHVybiAoZlNlbGVjdG9yTGlzdCAhPSBudWxsICYmIGZTZWxlY3Rvckxpc3QuZ2V0RXJyb3JDb3VudCgpID09IDApOwotCX0KLQotCXByaXZhdGUgSUNTU1NpbXBsZVNlbGVjdG9yIGdldE9ubHlPbmVTaW1wbGVTZWxlY3RvcigpIHsKLQkJcGFyc2UoKTsKLQkJaWYgKGZTZWxlY3Rvckxpc3QgIT0gbnVsbCAmJiBmU2VsZWN0b3JMaXN0LmdldExlbmd0aCgpID09IDEpIHsKLQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IGZTZWxlY3Rvckxpc3QuZ2V0U2VsZWN0b3IoMCk7Ci0JCQlpbnQgbkl0ZW0gPSBzZWxlY3Rvci5nZXRMZW5ndGgoKTsKLQkJCWlmIChuSXRlbSA9PSAxKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gc2VsZWN0b3IuZ2V0SXRlbSgwKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIElDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCQlyZXR1cm4gKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlKCkgewotCQlpZiAoZlNlbGVjdG9yTGlzdCA9PSBudWxsKSB7Ci0JCQlpZiAoZlRleHQgIT0gbnVsbCkgewotCQkJCWZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChmVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0ID0gbnVsbDsKLQlwcml2YXRlIElDU1NTZWxlY3Rvckxpc3QgZlNlbGVjdG9yTGlzdCA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0b3JzQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0b3JzQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OTNmZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yc0NvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RvcnNDb2xsZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIHNlbGVjdG9ycyA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgVmVjdG9yIHNlbGVjdG9yc1RvQXZvaWQgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFNlbGVjdG9yc0NvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VHJhdmVyc2VJbXBvcnRlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0b3JUb0F2b2lkKElDU1NTZWxlY3RvciBzZWxUb0F2b2lkKSB7Ci0JCWlmIChzZWxUb0F2b2lkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChzZWxlY3RvcnNUb0F2b2lkID09IG51bGwpCi0JCQlzZWxlY3RvcnNUb0F2b2lkID0gbmV3IFZlY3RvcigpOwotCi0JCWlmICghc2VsZWN0b3JzVG9Bdm9pZC5jb250YWlucyhzZWxUb0F2b2lkKSkKLQkJCXNlbGVjdG9yc1RvQXZvaWQuYWRkKHNlbFRvQXZvaWQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdG9yVG9Bdm9pZChJQ1NTU3R5bGVSdWxlIHJ1bGUpIHsKLQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gcnVsZS5nZXRTZWxlY3RvcnMoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0LmdldEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlDU1NTZWxlY3RvciBzZWwgPSAoSUNTU1NlbGVjdG9yKSBpdC5uZXh0KCk7Ci0JCQlhZGRTZWxlY3RvclRvQXZvaWQoc2VsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRTZWxlY3RvcnMoKSB7Ci0JCXJldHVybiBzZWxlY3RvcnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFKSB7Ci0JCQlJQ1NTU3R5bGVSdWxlIHJ1bGUgPSAoSUNTU1N0eWxlUnVsZSkgbm9kZTsKLQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IHJ1bGUuZ2V0U2VsZWN0b3JzKCk7Ci0JCQlJdGVyYXRvciBpdCA9IGxpc3QuZ2V0SXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChzZWxlY3RvcnNUb0F2b2lkICE9IG51bGwgJiYgc2VsZWN0b3JzVG9Bdm9pZC5jb250YWlucyhvYmopKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoIXNlbGVjdG9ycy5jb250YWlucyhvYmopKQotCQkJCQlzZWxlY3RvcnMuYWRkKG9iaik7Ci0JCQl9Ci0JCQlyZXR1cm4gVFJBVl9QUlVORTsKLQkJfQotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yc1RvQXZvaWQoamF2YS51dGlsLlZlY3RvciBuZXdTZWxlY3RvcnNUb0F2b2lkKSB7Ci0JCXNlbGVjdG9yc1RvQXZvaWQgPSBuZXdTZWxlY3RvcnNUb0F2b2lkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1ZTEwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuUGF0aEhlbHBlcjsKLQotLyoqCi0gKiBIeXBlcmxpbmsgbWFuYWdlci4gUHJvdmVkIHVzZWZ1bCBzZXJ2aWNlcyBsaWtlIGxpbmsgY29udmVyc2lvbiBBbiB1dGlsaXR5Ci0gKiBjbGFzcyB0byBoZWxwIG90aGVyIHBhcnNyZSBtb2R1bGVzIHRvIGNvbnZlcnQgbGlua3MKLSAqLwotcHVibGljIGNsYXNzIFVSTEhlbHBlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTF9TRUFSQ0hfU0lHID0gImZpbGU6LyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MX1NJRyA9ICJmaWxlOi8vLyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBSRUxBVElWRV9QQVRIX1NJRyA9ICIuLiI7Ly8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9TTEFTSCA9ICIvIjsvLyROT04tTkxTLTEkCQotCXByaXZhdGUgVVJMIGZCYXNlVXJsID0gbnVsbDsgLy8gYmFzZSB1cmwuIGFzc3VtZWQgdG8gYSBhYnN1bHV0ZSB1cmwKLQlwcml2YXRlIFN0cmluZyBmQmFzZVVybFN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBVUkwgZkRvY1Jvb3QgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZEb2NSb290U3RyaW5nID0gbnVsbDsKLQotCXB1YmxpYyBVUkxIZWxwZXIoU3RyaW5nIGJhc2VVcmwpIHsKLQkJaW5pdGlhbGl6ZShiYXNlVXJsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsLCBTdHJpbmcgZG9jUm9vdCkgewotCQlpbml0aWFsaXplKGJhc2VVcmwsIGRvY1Jvb3QpOwotCX0KLQotCS8qKgotCSAqIFNwZWNpYWwgYWR1anVzdCBmb3IgZmlsZSB1cmwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGFkanVzdEZpbGVQcm90b2NvbFVybChTdHJpbmcgdXJsKSB7Ci0JCWlmICh1cmwuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MX1NFQVJDSF9TSUcpKSB7Ci0JCQl1cmwgPSBGSUxFX1BST1RPQ09MX1NJRyArIHVybC5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTF9TRUFSQ0hfU0lHLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIHVybCwgVVJMIGJhc2VVcmwsIFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJU3RyaW5nIGFic1VybCA9IHVybDsKLQkJaWYgKGJhc2VVcmwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBkbyBzcGVjaWFsIHRoaW5nIGZpbGUgcHJvdG9jb2wKLQkJCQlpZiAoYmFzZVVybC5nZXRQcm90b2NvbCgpLmVxdWFsc0lnbm9yZUNhc2UoImZpbGUiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gcmVtb3ZlIHRoZSBmaXN0Ci0JCQkJCWlmICh1cmwuc3RhcnRzV2l0aCgiLyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMSk7Ci0JCQkJCS8vIGVtcHR5IHN0cmluZyBjYXVzZXMgbWFsZm9ybWVkIGV4Y2VwdGlvbgotCQkJCQlTdHJpbmcgdGVtcFVybCA9IHVybDsKLQkJCQkJaWYgKCIiLmVxdWFscyh1cmwpKS8vJE5PTi1OTFMtMSQKLQkJCQkJCXRlbXBVcmwgPSAiICI7Ly8kTk9OLU5MUy0xJAotCQkJCQlVUkwgbmV3VXJsID0gbmV3IFVSTChiYXNlVXJsLCB0ZW1wVXJsKTsKLQkJCQkJLy8gZG8gZXh0cmEgbWF0aCBmb3IgZmlsZSBwcm90b2NvbCB0byBzdXBwb3J0IGllIGJhc2VkCi0JCQkJCWFic1VybCA9IGFkanVzdEZpbGVQcm90b2NvbFVybChuZXdVcmwudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlVUkwgbmV3VXJsID0gbmV3IFVSTChmQmFzZVVybCwgdXJsKTsKLQkJCQkJYWJzVXJsID0gbmV3VXJsLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkgewotCQkJfQotCQkJLy8gY29udmVydCBldmVyeXRoaW5nIHRvIGZvcndhcmQgc2xhc2gKLQkJCWFic1VybCA9IFBhdGhIZWxwZXIuc3dpdGNoVG9Gb3J3YXJkU2xhc2hlcyhhYnNVcmwpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdGhlIGdpdmVuIG1heSBiZSBiYXNlZCBvbiBmaWxlCi0JCQlpZiAodXJsU3RyaW5nICE9IG51bGwpIHsKLQkJCQkvLyBzd2ljaCB0aGUgdXJsIHRvIHByb3BlciBkaXJlY3Rpb24KLQkJCQl1cmwgPSBQYXRoSGVscGVyLnJlbW92ZUxlYWRpbmdTZXBhcmF0b3IodXJsKTsKLQkJCQlGaWxlIGZsZSA9IG5ldyBGaWxlKHVybFN0cmluZywgdXJsKTsKLQkJCQlhYnNVcmwgPSBmbGUuZ2V0UGF0aCgpOwotCi0JCQl9Ci0JCQkvLyBjb252ZXJ0IGV2ZXJ5dGhpbmcgdG8gZm9yd2FyZCBzbGFzaAotCQkJYWJzVXJsID0gUGF0aEhlbHBlci5zd2l0Y2hUb0ZvcndhcmRTbGFzaGVzKGFic1VybCk7Ci0KLQkJCS8vIGlmIHRoZSBwYXRoIGVuZHMgd2l0aCAiLi4iIHdlIG5lZWQgdG8gYWRkIGEgdGVybWluYXRpbmcgc2xhc2gKLQkJCS8vIG9yCi0JCQkvLyBlbHNlIHRoZSBsaW5rIHdpbGwgbm90IGJlIHJlc29sdmVkIGNvcnJlY3RseS4gKGl0IHdpbGwgbG9vawotCQkJLy8gbGlrZQotCQkJLy8gL3VybC9wYXRoL3RvL3NvbWV3aGVyZS8uLiBpbnN0ZWFkIG9mIC91cmwvcGF0aC90by8KLQkJCWlmIChhYnNVcmwuZW5kc1dpdGgoRk9SV0FSRF9TTEFTSCArIFJFTEFUSVZFX1BBVEhfU0lHKSkgewotCQkJCWFic1VybCArPSBGT1JXQVJEX1NMQVNIOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRoIHRvIGFic29sdXRlCi0JCWFic1VybCA9IFBhdGhIZWxwZXIuYWRqdXN0UGF0aChhYnNVcmwpOwotCQlyZXR1cm4gYWJzVXJsOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKFN0cmluZyBiYXNlVXJsLCBTdHJpbmcgZG9jUm9vdCkgewotCQkvLwotCQkvLyBGaW5kIG91dCB3aGV0aGVyIGJhZXMgdXJsIGlzIGEgdXJsIG9yIGZpbGUgbmFtZQotCQkvLwotCQl0cnkgewotCQkJU3RyaW5nIHRlbXAgPSBQYXRoSGVscGVyLmFwcGVuZFRyYWlsaW5nVVJMU2xhc2goYmFzZVVybCk7Ci0JCQlmQmFzZVVybCA9IG5ldyBVUkwodGVtcCk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKLQkJfQotCQlpZiAoZkJhc2VVcmwgPT0gbnVsbCkgewotCQkJLy8gaXQgaXMgYSBmaWxlIGJhc2VkIHVybAotCQkJZkJhc2VVcmxTdHJpbmcgPSBiYXNlVXJsOwotCQl9Ci0KLQkJLy8gZG8gdGhlIHNhbWUgZm9yIGRvYyByb290Ci0JCWlmIChkb2NSb290ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHRlbXAgPSBQYXRoSGVscGVyLmFwcGVuZFRyYWlsaW5nVVJMU2xhc2goZG9jUm9vdCk7Ci0JCQkJZkRvY1Jvb3QgPSBuZXcgVVJMKHRlbXApOwotCi0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQkJfQotCQkJaWYgKGZEb2NSb290ID09IG51bGwpIHsKLQkJCQkvLyBpdCBpcyBhIGZpbGUgYmFzZWQgdXJsCi0JCQkJZkRvY1Jvb3RTdHJpbmcgPSBkb2NSb290OwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgZ2l2ZW4gdXJsIHRvIGEgYWJvbHV0ZSB1cmwgdXNpbmcgdGhlIGJhc2UgdXJsIElucHV0IHVybCBjYW4KLQkgKiBiZSBvZiBhbnkgb3RoZSBmb2xsb3dpbmcgZm9ybWF0IEFic29sdXRlIHVybHMgLS0tLS0tLS0tLS0tLS0gLgotCSAqIGh0dHA6Ly93d3cuZm9vLmNvbS8gLiBodHRwOi8vd3d3LmZvby5jb20gLiBodHRwOi8vd3d3LmZvby5jb20vZm9sZGVyIC4KLQkgKiBodHRwOi8vd3d3LmZvby5jb20vZm9sZGVyLyAuIGh0dHA6Ly93d3cuZm9vLmNvbS9pbmRleC5odG1sIC4KLQkgKiBodHRwOi8vd3d3LmZvby5jb20vZm9sZGVyL2luZGV4Lmh0bWwgLgotCSAqIGh0dHA6Ly93d3cuZm9vLmNvbS9mb2xkZXIvLi4vaW5kZXguaHRtbCBVcmwgcmVsYXRpdmUgb24gZG9jdW1lbnQgcm9vdAotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLiAvIC4gL2ZvbGRlciAuIC9pbmRleC5odG1sIC4KLQkgKiAvZm9sZGVyL2luZGV4Lmh0bWwgLiAvZm9sZGVyLy4uL2luZGV4Lmh0bWwKLQkgKiAKLQkgKiBTZWxmIHJlbGF0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLiBpbmRleC5odG1sIC4gLi9pbmRleC5odG1sIC4KLQkgKiAuLi9pbmRleC5odG1sIC4gZm9sZGVyL2luZGV4Lmh0bWwgLiBmb2xkZXIvLi4vaW5kZXguaHRtbAotCSAqIAotCSAqIGZpbGUgYmFzZWQgdXJsIGFkZHMgYW5vdGhlciBkaW1lbnNpb24gc2luY2UgaXQgZG9lc24ndCBoYXZlIGEgZG9jdW1lbnQKLQkgKiByb290IFNvIHVzZXMgZkRvY1Jvb3QgaWYgcHJvdmlkZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvQWJzb2x1dGUoU3RyaW5nIHVybCkgewotCQlTdHJpbmcgYWJzVXJsID0gdXJsOwotCi0JCVVSTCBuZXdVcmwgPSBudWxsOwotCQkvLyB0cnkgdG8gc2VlIGl0IGlzIGEgYWJzb2x1dGUgdXJsCi0JCXRyeSB7Ci0JCQluZXdVcmwgPSBuZXcgVVJMKHVybCk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkgewotCQl9Ci0JCS8vIGlmIGRvY3VtZW50IHJvb3QgaXMgcHJvdmlkZWQKLQkJLy8gZG8gc3BlY2lhbCBjYXNlCi0JCWlmIChuZXdVcmwgPT0gbnVsbCkgewotCQkJaWYgKGZEb2NSb290ID09IG51bGwgJiYgZkRvY1Jvb3RTdHJpbmcgPT0gbnVsbCkgewotCQkJCS8vIHRyeSB0byBjaGVjayByZWxhdGl2ZSB1cmwKLQkJCQlhYnNVcmwgPSBjb252ZXJ0KHVybCwgZkJhc2VVcmwsIGZCYXNlVXJsU3RyaW5nKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGRvYyByb290IGlzIHByb3ZpZGVkCi0JCQkJLy8gaWYgdGhlIHVybCBpcyBhIGRvYyByb290IGJhc2VkIHVzZSBkb2Mgcm9vdAotCi0JCQkJaWYgKHVybC5zdGFydHNXaXRoKCIvIikpLy8kTk9OLU5MUy0xJAotCQkJCQlhYnNVcmwgPSBjb252ZXJ0KHVybCwgZkRvY1Jvb3QsIGZEb2NSb290U3RyaW5nKTsKLQkJCQllbHNlCi0JCQkJCWFic1VybCA9IGNvbnZlcnQodXJsLCBmQmFzZVVybCwgZkJhc2VVcmxTdHJpbmcpOwotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFic1VybDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGZyb20gYW4gYWJzb2x1dGUgdXJsIHRvIHJlbGF0aXZlIHVybCBiYXNlZCBvbiB0aGUgZ2l2ZW4gdXJsCi0JICogQm90aCBhcmUgYXNzdW1lZCB0byBiZSBhYmxzdXRlIHVybAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9SZWxhdGl2ZShTdHJpbmcgdXJsLCBTdHJpbmcgZG9jdW1lbnRVcmwpIHsKLQkJU3RyaW5nIG91dHB1dCA9IHVybDsKLQkJLy8gYXNzdW1pbmcgYm90aCB1cmxzIGFyZSBhYnNvbHV0ZQotCQl0cnkgewotCQkJVVJMIGlucHV0VXJsID0gbmV3IFVSTCh1cmwpOwotCQkJVVJMIGRvY1VybCA9IG5ldyBVUkwoZG9jdW1lbnRVcmwpOwotCQkJLy8gZmlsdGVyIG91dCBpZiB0aGUgdXJscyBhcmUgbm90IGZybyB0aGUgc2FtZSBkb21haW4KLQkJCWlmICghaW5wdXRVcmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoZG9jVXJsLmdldFByb3RvY29sKCkpIHx8ICFpbnB1dFVybC5nZXRIb3N0KCkuZXF1YWxzKGRvY1VybC5nZXRIb3N0KCkpIHx8IGlucHV0VXJsLmdldFBvcnQoKSAhPSBkb2NVcmwuZ2V0UG9ydCgpKQotCQkJCXJldHVybiBvdXRwdXQ7Ci0JCQkvLyBib3RoIHVybCBhcmUgY29taW5nIGZvcm0gdGhlIHNhbWUgcGxhY2UKLQkJCS8vIHN0cmlwIG9mZiB0aGUgZG9tYWluIHBhcnRzCi0JCQlTdHJpbmcgaW5wdXROYW1lID0gaW5wdXRVcmwuZ2V0RmlsZSgpOwotCQkJU3RyaW5nIGRvY05hbWUgPSBkb2NVcmwuZ2V0RmlsZSgpOwotCQkJb3V0cHV0ID0gUGF0aEhlbHBlci5jb252ZXJ0VG9SZWxhdGl2ZShpbnB1dE5hbWUsIGRvY05hbWUpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLQkJCW91dHB1dCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMTW9kZWxQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1VSTE1vZGVsUHJvdmlkZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxODBkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMTW9kZWxQcm92aWRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlBhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuUHJvamVjdFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFVSTE1vZGVsUHJvdmlkZXJDU1MgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9NT0RFTF9GT1JfUkVBRCA9IDE7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9ORVdfTU9ERUxfRk9SX1JFQUQgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTU9ERUxfRk9SX0VESVQgPSAzOwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTkVXX01PREVMX0ZPUl9FRElUID0gNDsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9CVUZGRVJfU0laRSA9IDQwOTY7Ci0JLy8gSU1vZGVsTWFuYWdlcgotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFVSTE1vZGVsUHJvdmlkZXJDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gb2J0YWluIG1vZGVsIG1hbmFnZXIKLQkJbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgSUQgZnJvbSBhIGZpbGVuYW1lLiBUaGlzIG11c3QgYmUgc2FtZSBhcwotCSAqIEZpbGVNb2RlbFByb3ZpZGVyLmNhbGN1bGF0ZUlkKElGaWxlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjYWxjdWxhdGVJZChJUGF0aCBmdWxsSVBhdGgpIHsKLQkJcmV0dXJuIGZ1bGxJUGF0aC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDb21tb25Nb2RlbEZvcihmaW5hbCBJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgZmluYWwgU3RyaW5nIHJlZiwgZmluYWwgaW50IHdoaWNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBmaXJzdCwgY3JlYXRlIGFic29sdXRlIHVybAotCQlTdHJpbmcgYWJzVVJMID0gcmVzb2x2ZVVSSShiYXNlTW9kZWwsIHJlZiwgdHJ1ZSk7Ci0JCWlmICgoYWJzVVJMID09IG51bGwpIHx8IChhYnNVUkwubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbmVlZCB0byByZW1vdmUgZmlsZTovLyBzY2hlbWUgaWYgbmVjZXNzYXJ5Ci0JCXRyeSB7Ci0JCQlmaW5hbCBVUkwgYVVSTCA9IG5ldyBVUkwoYWJzVVJMKTsKLQkJCS8vIEFuIGFjdHVhbCBVUkwgd2FzIGdpdmVuLCBvbmx5IGZpbGU6Ly8vIGlzIHN1cHBvcnRlZAotCQkJLy8gcmVzb2x2ZSBpdCBieSBmaW5kaW5nIHRoZSBmaWxlIGl0IHBvaW50cyB0bwotCQkJaWYgKCFhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpICYmIChhVVJMLmdldEhvc3QoKS5lcXVhbHMoImxvY2FsaG9zdCIpIHx8IGFVUkwuZ2V0SG9zdCgpLmxlbmd0aCgpID09IDApKSB7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCWFic1VSTCA9IGFVUkwuZ2V0RmlsZSgpOwotCQkJCQlmaW5hbCBJUGF0aCBpcGF0aCA9IG5ldyBQYXRoKGFic1VSTCk7Ci0JCQkJCS8vIGlmIHBhdGggaGFzIGEgZGV2aWNlLCBhbmQgaWYgaXQgYmVnaW5zIHdpdGgKLQkJCQkJLy8gSVBhdGguU0VQQVJBVE9SLCByZW1vdmUgaXQKLQkJCQkJZmluYWwgU3RyaW5nIGRldmljZSA9IGlwYXRoLmdldERldmljZSgpOwotCQkJCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCWlmIChkZXZpY2UuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCQkJCWZpbmFsIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2Uuc3Vic3RyaW5nKDEpOwotCQkJCQkJCWFic1VSTCA9IGlwYXRoLnNldERldmljZShuZXdEZXZpY2UpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1mdUV4YykgewotCQl9Ci0KLQkJLy8gbmV4dCwgZGVjaWRlIHByb2plY3QKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWZpbmFsIElQYXRoIGZ1bGxJUGF0aCA9IG5ldyBQYXRoKGFic1VSTCk7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gd29ya3NwYWNlLmdldENvbnRhaW5lckZvckxvY2F0aW9uKGZ1bGxJUGF0aCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJLy8gZnVsbElQYXRoIGRvZXNuJ3QgZXhpc3QgaW4gd29ya3NwYWNlCi0JCQlwcm9qZWN0ID0gY29udGFpbmVyLmdldFByb2plY3QoKTsKLQkJfQotCi0JCS8vIElmIEhUTUwgZG9jdW1lbnQgaGFzIGEgbGluayB0byBhbiBleHRlcm4gQ1NTIHdoaWNoIGlzIG5vdCBpbgotCQkvLyBJUHJvamVjdAotCQkvLyB3b3Jrc3BhY2UuZ2V0Q29udGFpbmVyRm9yTG9hdGlvbigpIG1heSByZXR1cm4gbnVsbC4gV2UgbmVlZCB0byB0YWtlCi0JCS8vIGNhcmUKLQkJLy8gb2YgdGhpcyBjYXNlCi0KLQkJLy8gbm93LCBnZXQgYWJzVVJMJ3MgSUZpbGUKLQkJaWYgKChwcm9qZWN0ICE9IG51bGwpICYmIChwcm9qZWN0LmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihmdWxsSVBhdGgpID09IGZhbHNlKSkgewotCQkJLy8gaXQncyBhdCBvdXRzaWRlIG9mIFByb2plY3QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlQYXRoIGZpbGVQYXRoID0gZnVsbElQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocHJvamVjdC5nZXRMb2NhdGlvbigpLnNlZ21lbnRDb3VudCgpKTsKLQkJCUlGaWxlIGZpbGUgPSAoZmlsZVBhdGggIT0gbnVsbCAmJiAhZmlsZVBhdGguaXNFbXB0eSgpKSA/IHByb2plY3QuZ2V0RmlsZShmaWxlUGF0aCkgOiBudWxsOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBvYnRhaW4gbW9kZWwKLQkJCWlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX0VESVQpIHsKLQkJCQltb2RlbCA9IGdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfUkVBRCkgewotCQkJCW1vZGVsID0gZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJfQotCi0JCQkvLyBzZXR0aW5nIHN5bmNocm9uaXphdGlvbiBzdGFtcCBpcyBJTW9kZWxNYW5hZ2VyJ3MgY2xpZW50J3MKLQkJCS8vIHJlc3BvbnNpYmlsaXR5Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpID09IElSZXNvdXJjZS5OVUxMX1NUQU1QKQotCQkJCW1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgaWQgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQkJLy8gb2J0YWluIHJlc29sdmVyCi0JCQlVUklSZXNvbHZlciByZXNvbHZlciA9IChwcm9qZWN0ICE9IG51bGwpID8gKFVSSVJlc29sdmVyKSBwcm9qZWN0LmdldEFkYXB0ZXIoVVJJUmVzb2x2ZXIuY2xhc3MpIDogbnVsbDsKLQkJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQkJLy8gUHJvamVjdFJlc29sdmVyIGNhbiB0YWtlIGNhcmUgb2YgdGhlIGNhc2UgaWYgcHJvamVjdCBpcwotCQkJCS8vIG51bGwuCi0JCQkJcmVzb2x2ZXIgPSBuZXcgUHJvamVjdFJlc29sdmVyKHByb2plY3QpOwotCQkJfQotCQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gdGhlcmUgaXMgbm8gcHJvamVjdC4gd2UgY2FuJ3QgZXhwZWN0IElQcm9qZWN0IGhlbHAgdG8gY3JlYXRlCi0JCQkvLyBpZC9pbnB1dFN0cmVhbQotCQkJRmlsZSBmaWxlID0gZnVsbElQYXRoLnRvRmlsZSgpOwotCi0JCQkvLyBvYmF0aW4gaWQKLQkJCWlkID0gY2FsY3VsYXRlSWQoZnVsbElQYXRoKTsKLQotCQkJLy8gb2J0YWluIElucHV0U3RyZWFtCi0JCQl0cnkgewotCQkJCWluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotCQkJCS8vIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciB3ZSBkb24ndCBoYXZlIHJlYWQgcGVybWlzc2lvbgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBvYnRhaW4gbW9kZWwKLQkJCXRyeSB7Ci0JCQkJaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfRURJVCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChpZCwgaW5TdHJlYW0sIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9SRUFEKSB7Ci0JCQkJCW1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpblN0cmVhbSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlKSB7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBjbG9zZSBub3cgIQotCQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2V0IGxvY2F0aW9uaWQKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkgPT0gbnVsbCkgewotCQkJbW9kZWwuc2V0QmFzZUxvY2F0aW9uKGZ1bGxJUGF0aC50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25Nb2RlbEZvcihiYXNlTW9kZWwsIHJlZiwgR0VUX01PREVMX0ZPUl9FRElUKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJLy8gY3JlYXRlIGEgZmFrZSBJbnB1dFN0cmVhbQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGZpbGUsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uTW9kZWxGb3IoYmFzZU1vZGVsLCByZWYsIEdFVF9NT0RFTF9GT1JfUkVBRCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCi0JCS8vIGNyZWF0ZSBhIGZha2UgSW5wdXRTdHJlYW0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB7Ci0JCWlmIChpRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TmV3TW9kZWxGb3JFZGl0KGlGaWxlLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2Ugcml1KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlQWxyZWFkeUV4aXN0cyByYWUpIHsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXROZXdNb2RlbEZvckVkaXQoaUZpbGUsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSByaXUpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VBbHJlYWR5RXhpc3RzIHJhZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqIDxjb2RlPnJlc29sdmVDcm9zc1Byb2plY3RMaW5rczwvY29kZT46IElmIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcwotCSAqIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcHJvcGVybHkgcmVzb2x2ZSB0aGUgVVJJIGlmIGl0IGlzCi0JICogYSB2YWxpZCBVUkkgcG9pbnRpbmcgdG8gYW5vdGhlciAoYXBwcm9wcmlhdGUpIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVSSShJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZiwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gZ2V0IHJlc29sdmVyIGluIE1vZGVsCi0JCWZpbmFsIFVSSVJlc29sdmVyIHJlc29sdmVyID0gYmFzZU1vZGVsLmdldFJlc29sdmVyKCk7Ci0KLQkJLy8gcmVzb2x2ZSB0byBhYnNvbHV0ZSB1cmwKLQkJZmluYWwgU3RyaW5nIGFic3VybCA9IChyZXNvbHZlciAhPSBudWxsKSA/IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkocmVmLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIDogbnVsbDsKLQkJaWYgKChyZXNvbHZlciAhPSBudWxsKSAmJiAoYWJzdXJsID09IG51bGwpICYmIChyZWYgIT0gbnVsbCkgJiYgKHJlZi50cmltKCkubGVuZ3RoKCkgPiAwKSAmJiAocmVmLnRyaW0oKS5jaGFyQXQoMCkgPT0gJy8nKSkgewotCQkJLy8gdG8gcmVhY2ggaGVyZSBtZWFucyA6Ci0JCQkvLyByZWYgaXMgYSBEb2Nyb290IHJlbGF0aXZlCi0JCQkvLyByZXNvbHZlciBjYW4ndCByZXNvbHZlIHJlZgotCQkJLy8gc28gdGhhdCBocmVmIGlzIGEgYnJva2VuIGFuZCBzaG91bGQgbm90IGNyZWF0ZSBtb2RlbAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKChhYnN1cmwgIT0gbnVsbCkgJiYgKGFic3VybC5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXR1cm4gYWJzdXJsOwotCQl9Ci0KLQkJLy8gbWF5YmUgcmVmIGlzIGF0IG91dHNpZGUgb2YgdGhlIFByb2plY3QKLQkJLy8gb2J0YWluIGRvY3Jvb3Q7Ci0JCWZpbmFsIElDb250YWluZXIgY29udGFpbmVyID0gKHJlc29sdmVyICE9IG51bGwpID8gcmVzb2x2ZXIuZ2V0Um9vdExvY2F0aW9uKCkgOiBudWxsOwotCQlTdHJpbmcgZG9jcm9vdCA9IG51bGw7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJZG9jcm9vdCA9IGNvbnRhaW5lci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKGRvY3Jvb3QgPT0gbnVsbCkgewotCQkJZG9jcm9vdCA9IGJhc2VNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlpZiAoZG9jcm9vdCA9PSBudWxsKSB7Ci0JCQkvLyBzaG91bGQgbm90IGJlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG9idGFpbiBkb2N1bWVudCB1cmwKLQkJU3RyaW5nIG1vZGVsQmFzZUxvY2F0aW9uID0gYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAoKG1vZGVsQmFzZUxvY2F0aW9uID09IG51bGwpIHx8IChtb2RlbEJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZmFsbGJhY2suLi4KLQkJCW1vZGVsQmFzZUxvY2F0aW9uID0gYmFzZU1vZGVsLmdldElkKCk7Ci0JCX0KLQkJaWYgKChtb2RlbEJhc2VMb2NhdGlvbiA9PSBudWxsKSB8fCAobW9kZWxCYXNlTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGkgY2FuJ3QgcmVzb2x2ZSB1cmkgIQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyByZXNvbHZlIHVybAotCQlVUkxIZWxwZXIgaGVscGVyID0gbmV3IFVSTEhlbHBlcihQYXRoSGVscGVyLmdldENvbnRhaW5pbmdGb2xkZXJQYXRoKG1vZGVsQmFzZUxvY2F0aW9uKSwgUGF0aEhlbHBlci5nZXRDb250YWluaW5nRm9sZGVyUGF0aChQYXRoSGVscGVyLmFwcGVuZFRyYWlsaW5nVVJMU2xhc2goZG9jcm9vdCkpKTsKLQkJcmV0dXJuIGhlbHBlci50b0Fic29sdXRlKHJlZik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4MDEzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWFN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLklWYWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogZm9yIGhvcml6b250YWwgdmFsdWUgb2YgJ2JhY2tncm91bmQtcG9zaXRpb24nCi0gKi8KLXB1YmxpYyBjbGFzcyBCYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyIGltcGxlbWVudHMgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQmFja2dyb3VuZFBvc2l0aW9uWFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTVGV4dFRva2VuW10gY29ycmVjdE1lYW5pbmdUb2tlbihDU1NUZXh0VG9rZW5bXSBzcmMpIHsKLQkJamF2YS51dGlsLkFycmF5TGlzdCBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyAmJiBzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlsaXN0LmFkZChzcmNbaV0pOwotCQl9Ci0JCUNTU1RleHRUb2tlbltdIHJldCA9IG5ldyBDU1NUZXh0VG9rZW5bbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTikpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3BYID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQkJUHJvcENNUHJvcGVydHkgcHJvcFkgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlTGlzdCkgewotCQkJCUlDU1NWYWx1ZUxpc3QgbGlzdCA9IChJQ1NTVmFsdWVMaXN0KSBvYmo7Ci0JCQkJSUNTU1ZhbHVlIHZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDApOwotCQkJCWlmICh2YWx1ZS5nZXRDc3NWYWx1ZVR5cGUoKSA9PSBDU1NWYWx1ZS5DU1NfUFJJTUlUSVZFX1ZBTFVFKSB7Ci0JCQkJCUlDU1NQcmltaXRpdmVWYWx1ZSBwcmltID0gKElDU1NQcmltaXRpdmVWYWx1ZSkgdmFsdWU7Ci0JCQkJCWlmIChwcmltLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQpIHsKLQkJCQkJCS8vIGNoZWNrIG5vdCB0b3Agb3IgYm90dG9tCi0JCQkJCQlpZiAoIXByb3BYLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSAmJiBwcm9wWS5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkpIHsKLQkJCQkJCQkvLyBjYXNlIG9yZGVyIGlzIHZlcnRpY2FsIC0+IGhvcml6b250YWwKLQkJCQkJCQl2YWx1ZSA9IChJQ1NTVmFsdWUpIGxpc3QuaXRlbSgxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzdHIgPSB2YWx1ZS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgewotCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBvYmopLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCWlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9CT1RUT00pIHx8IHN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX1RPUCkpCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQkJCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzdHIpOwotCQkJCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQotCQkJCXRva2VucyA9IGNvcnJlY3RNZWFuaW5nVG9rZW4odG9rZW5zKTsKLQkJCQlpZiAodG9rZW5zLmxlbmd0aCA9PSAwKQotCQkJCQlzdHIgPSAiIjsvLyROT04tTkxTLTEkCi0JCQkJZWxzZSBpZiAodG9rZW5zLmxlbmd0aCA9PSAxICYmICh0b2tlbnNbMF0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9CT1RUT00pIHx8IHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX1RPUCkpKQotCQkJCQlzdHIgPSAiIjsvLyROT04tTkxTLTEkCi0JCQkJZWxzZQotCQkJCQlzdHIgPSB0b2tlbnNbMF0uaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIgOiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgbmV3VmFsdWUgPSBudWxsOwotCQlTdHJpbmcgdmFsSCA9IHZhbHVlOwotCQlTdHJpbmcgdmFsViA9IHByb3BlcnRpZXMuZ2V0QmFja2dyb3VuZFBvc2l0aW9uWSgpOwotCQlpZiAodmFsViA9PSBudWxsIHx8IHZhbFYubGVuZ3RoKCkgPT0gMCkKLQkJCW5ld1ZhbHVlID0gdmFsSDsKLQkJZWxzZSBpZiAodmFsSCA9PSBudWxsIHx8IHZhbEgubGVuZ3RoKCkgPT0gMCkgewotCQkJQ29sbGVjdGlvbiB2YWxYID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLmdldFZhbHVlcygpOwotCQkJQ29sbGVjdGlvbiB2YWxZID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLmdldFZhbHVlcygpOwotCQkJUHJvcENNVXRpbC5taW51cyh2YWxZLCB2YWxYKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdmFsWS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iai50b1N0cmluZygpLmVxdWFscyh2YWxWLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCS8vIG5lZWQgbm90IGNvbXBlbnNhdGUgZm9yIC4uLgotCQkJCQluZXdWYWx1ZSA9IHZhbFY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNvbXBlbnNhdGUgZm9yIEhvcml6b250YWwgdmFsdWUKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgdmFsViBpcyBsZW5ndGggb3Igbm90Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHZhbFYudHJpbSgpKTsKLQkJCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCQkJaWYgKHRva2VucyAhPSBudWxsICYmIHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCQluZXdWYWx1ZSA9IElWYWxJRC5WX0xFRlQgKyAiICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQluZXdWYWx1ZSA9ICIwJSAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJbmV3VmFsdWUgPSB2YWxIICsgIiAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCXByb3BlcnRpZXMuc2V0QmFja2dyb3VuZFBvc2l0aW9uKG5ld1ZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4ZGY5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLklWYWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogZm9yIHZlcnRpY2FsIHZhbHVlIG9mICdiYWNrZ3JvdW5kLXBvc2l0aW9uJwotICovCi1wdWJsaWMgY2xhc3MgQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlciBpbXBsZW1lbnRzIElTdWJQcm9wZXJ0eUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENTU1RleHRUb2tlbltdIGNvcnJlY3RNZWFuaW5nVG9rZW4oQ1NTVGV4dFRva2VuW10gc3JjKSB7Ci0JCWphdmEudXRpbC5BcnJheUxpc3QgbGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc3JjW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgc3JjW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MgJiYgc3JjW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJbGlzdC5hZGQoc3JjW2ldKTsKLQkJfQotCQlDU1NUZXh0VG9rZW5bXSByZXQgPSBuZXcgQ1NTVGV4dFRva2VuW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJU3RyaW5nIHN0ciA9IG51bGw7Ci0JCU9iamVjdCBvYmogPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wWCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKTsKLQkJCVByb3BDTVByb3BlcnR5IHByb3BZID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZUxpc3QpIHsKLQkJCQlJQ1NTVmFsdWVMaXN0IGxpc3QgPSAoSUNTU1ZhbHVlTGlzdCkgb2JqOwotCQkJCWludCBpbmRleCA9IDE7Ci0JCQkJSUNTU1ZhbHVlIHZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDApOwotCQkJCWlmICh2YWx1ZS5nZXRDc3NWYWx1ZVR5cGUoKSA9PSBDU1NWYWx1ZS5DU1NfUFJJTUlUSVZFX1ZBTFVFKSB7Ci0JCQkJCUlDU1NQcmltaXRpdmVWYWx1ZSBwcmltID0gKElDU1NQcmltaXRpdmVWYWx1ZSkgdmFsdWU7Ci0JCQkJCWlmIChwcmltLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQpIHsKLQkJCQkJCS8vIGNoZWNrIG5vdCB0b3Agb3IgYm90dG9tCi0JCQkJCQlpZiAoIXByb3BYLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSAmJiBwcm9wWS5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkpIHsKLQkJCQkJCQkvLyBjYXNlIG9yZGVyIGlzIHZlcnRpY2FsIC0+IGhvcml6b250YWwKLQkJCQkJCQlpbmRleCA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3RyID0gKChJQ1NTVmFsdWUpIGxpc3QuaXRlbShpbmRleCkpLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJaWYgKCFzdHIuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9CT1RUT00pICYmICFzdHIuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9UT1ApKQotCQkJCQlzdHIgPSAiIjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdHIgPSBvYmoudG9TdHJpbmcoKTsKLQkJCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc3RyKTsKLQkJCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0KLQkJCQl0b2tlbnMgPSBjb3JyZWN0TWVhbmluZ1Rva2VuKHRva2Vucyk7Ci0JCQkJaWYgKHRva2Vucy5sZW5ndGggPT0gMSAmJiAodG9rZW5zWzBdLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQk9UVE9NKSB8fCB0b2tlbnNbMF0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9UT1ApKSkKLQkJCQkJc3RyID0gdG9rZW5zWzBdLmltYWdlOwotCQkJCWVsc2UgaWYgKHRva2Vucy5sZW5ndGggPiAxKQotCQkJCQlzdHIgPSB0b2tlbnNbMV0uaW1hZ2U7Ci0JCQkJZWxzZQotCQkJCQlzdHIgPSAiIjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIgOiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgbmV3VmFsdWUgPSBudWxsOwotCQlTdHJpbmcgdmFsSCA9IHByb3BlcnRpZXMuZ2V0QmFja2dyb3VuZFBvc2l0aW9uWCgpOwotCQlTdHJpbmcgdmFsViA9IHZhbHVlOwotCQlpZiAodmFsSCAhPSBudWxsICYmICh2YWxILnRyaW0oKS5lcXVhbHMoIjAlIikgLyogZGVmYXVsdCB2YWx1ZSAqL3x8IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsSC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9MRUZUKSAvKgotCQkJCQkJCQkJCQkJCQkJCSAqIGFub3RoZXIKLQkJCQkJCQkJCQkJCQkJCQkgKiBkZWZhdWx0Ci0JCQkJCQkJCQkJCQkJCQkJICogdmFsdWUKLQkJCQkJCQkJCQkJCQkJCQkgKi8pKQotCQkJdmFsSCA9IG51bGw7Ci0JCWlmICh2YWxWID09IG51bGwgfHwgdmFsVi5sZW5ndGgoKSA9PSAwKQotCQkJbmV3VmFsdWUgPSB2YWxIOwotCQllbHNlIGlmICh2YWxIID09IG51bGwgfHwgdmFsSC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlDb2xsZWN0aW9uIHZhbFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkuZ2V0VmFsdWVzKCk7Ci0JCQlDb2xsZWN0aW9uIHZhbFkgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkuZ2V0VmFsdWVzKCk7Ci0JCQlQcm9wQ01VdGlsLm1pbnVzKHZhbFksIHZhbFgpOwotCQkJSXRlcmF0b3IgaXQgPSB2YWxZLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqLnRvU3RyaW5nKCkuZXF1YWxzKHZhbFYudG9Mb3dlckNhc2UoKSkpIHsKLQkJCQkJLy8gbmVlZCBub3QgY29tcGVuc2F0ZSBmb3IgLi4uCi0JCQkJCW5ld1ZhbHVlID0gdmFsVjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLy8gY29tcGVuc2F0ZSBmb3IgSG9yaXpvbnRhbCB2YWx1ZQotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayB2YWxWIGlzIGxlbmd0aCBvciBub3QKLQkJCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgdmFsVi50cmltKCkpOwotCQkJCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJCQlpZiAodG9rZW5zICE9IG51bGwgJiYgdG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCW5ld1ZhbHVlID0gSVZhbElELlZfTEVGVCArICIgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlCi0JCQkJCW5ld1ZhbHVlID0gIjAlICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlCi0JCQluZXdWYWx1ZSA9IHZhbEggKyAiICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJcHJvcGVydGllcy5zZXRCYWNrZ3JvdW5kUG9zaXRpb24obmV3VmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYWQyOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JhY2tncm91bmQnIHByb3BlcnR5ICdiYWNrZ3JvdW5kJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYmFja2dyb3VuZC1hdHRhY2htZW50JywgJ2JhY2tncm91bmQtY29sb3InLCAnYmFja2dyb3VuZC1pbWFnZScsCi0gKiAnYmFja2dyb3VuZC1wb3NpdGlvbicsICdiYWNrZ3JvdW5kLXJlcGVhdCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBpbWFnZSA9ICIiLCByZXBlYXQgPSAiIiwgYXR0YWNoID0gIiIsIHBvcyA9ICIiOy8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BJbWFnZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BSZXBlYXQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEF0dGFjaCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFBvcyA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcEltYWdlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFJlcGVhdC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXJlcGVhdCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQXR0YWNoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJYXR0YWNoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BQb3MuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCWlmIChwb3MgPT0gbnVsbCB8fCBwb3MubGVuZ3RoKCkgPD0gMCkKLQkJCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZQotCQkJCQkJcG9zID0gcG9zICsgIiAiICsgdG9rZW5zW2ldLmltYWdlOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCWlmIChwb3MgPT0gbnVsbCB8fCBwb3MubGVuZ3RoKCkgPD0gMCkKLQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UKLQkJCQkJcG9zID0gcG9zICsgIiAiICsgdG9rZW5zW2ldLmltYWdlOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wSW1hZ2UuZ2V0TmFtZSgpLCBpbWFnZSk7Ci0JCWRlc3Quc2V0KHByb3BSZXBlYXQuZ2V0TmFtZSgpLCByZXBlYXQpOwotCQlkZXN0LnNldChwcm9wQXR0YWNoLmdldE5hbWUoKSwgYXR0YWNoKTsKLQkJZGVzdC5zZXQocHJvcFBvcy5nZXROYW1lKCksIHBvcyk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIGltYWdlID0gbnVsbCwgcmVwZWF0ID0gbnVsbCwgYXR0YWNoID0gbnVsbCwgcG9zID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEltYWdlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFJlcGVhdCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQXR0YWNoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wSW1hZ2UuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wUmVwZWF0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJcmVwZWF0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BBdHRhY2guY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlhdHRhY2ggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQkJaWYgKHBvcyA9PSBudWxsKQotCQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlCi0JCQkJCQlwb3MgPSBwb3MgKyAiICIgKyB0b2tlbnNbaV0uaW1hZ2U7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKSB7Ci0JCQkJaWYgKHBvcyA9PSBudWxsKQotCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZQotCQkJCQlwb3MgPSBwb3MgKyAiICIgKyB0b2tlbnNbaV0uaW1hZ2U7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wSW1hZ2UgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gaW1hZ2U7Ci0JCWVsc2UgaWYgKHByb3BSZXBlYXQgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gcmVwZWF0OwotCQllbHNlIGlmIChwcm9wQXR0YWNoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGF0dGFjaDsKLQkJZWxzZSBpZiAocHJvcFBvcyA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBwb3M7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTA3ZTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1ib3R0b20nIHByb3BlcnR5ICdib3JkZXItYm90dG9tJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLWJvdHRvbS1jb2xvcicsICdib3JkZXItYm90dG9tLXN0eWxlJywgJ2JvcmRlci1ib3R0b20td2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2M2NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItY29sb3InIHByb3BlcnR5ICdib3JkZXItY29sb3InIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItdG9wLWNvbG9yJywgJ2JvcmRlci1yaWdodC1jb2xvcicsICdib3JkZXItYm90dG9tLWNvbG9yJywKLSAqICdib3JkZXItbGVmdC1jb2xvcicsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWlkZW50c1tqKytdID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nW10gZGVzdHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGogPT0gMSkgewotCQkJZGVzdHNbMF0gPSBkZXN0c1sxXSA9IGRlc3RzWzJdID0gZGVzdHNbM10gPSBpZGVudHNbMF07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzJdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWRlc3RzWzBdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJCWRlc3RzWzJdID0gaWRlbnRzWzJdOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJZGVzdHNba10gPSBpZGVudHNba107Ci0JCX0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SLCBkZXN0c1swXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SLCBkZXN0c1sxXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUiwgZGVzdHNbMl0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SLCBkZXN0c1szXSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQlpZGVudHNbaisrXSA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaiA9PSAxKQotCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUiB8fCBwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbM107Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YjcyMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1sZWZ0JyBwcm9wZXJ0eSAnYm9yZGVyLWxlZnQnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItbGVmdC1jb2xvcicsICdib3JkZXItbGVmdC1zdHlsZScsICdib3JkZXItbGVmdC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclJpZ2h0U2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclJpZ2h0U2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGE1ZmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLXJpZ2h0JyBwcm9wZXJ0eSAnYm9yZGVyLXJpZ2h0JyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXJpZ2h0LWNvbG9yJywgJ2JvcmRlci1yaWdodC1zdHlsZScsICdib3JkZXItcmlnaHQtd2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlclJpZ2h0U2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzE4YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyJyBwcm9wZXJ0eSAnYm9yZGVyJyB3aWxsIGJlIGV4cGFuZGVkIHRvICdib3JkZXItY29sb3InLAotICogJ2JvcmRlci1zdHlsZScsICdib3JkZXItd2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDA5YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItc3R5bGUnIHByb3BlcnR5ICdib3JkZXItc3R5bGUnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItdG9wLXN0eWxlJywgJ2JvcmRlci1yaWdodC1zdHlsZScsICdib3JkZXItYm90dG9tLXN0eWxlJywKLSAqICdib3JkZXItbGVmdC1zdHlsZScsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFLCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3MzhmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItdG9wJyBwcm9wZXJ0eSAnYm9yZGVyLXRvcCcgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci10b3AtY29sb3InLCAnYm9yZGVyLXRvcC1zdHlsZScsICdib3JkZXItdG9wLXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTk4ZWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLXdpZHRoJyBwcm9wZXJ0eSAnYm9yZGVyLXdpZHRoJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXRvcC13aWR0aCcsICdib3JkZXItcmlnaHQtd2lkdGgnLCAnYm9yZGVyLWJvdHRvbS13aWR0aCcsCi0gKiAnYm9yZGVyLWxlZnQtd2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nW10gZGVzdHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGogPT0gMSkgewotCQkJZGVzdHNbMF0gPSBkZXN0c1sxXSA9IGRlc3RzWzJdID0gZGVzdHNbM10gPSBpZGVudHNbMF07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzJdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWRlc3RzWzBdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJCWRlc3RzWzJdID0gaWRlbnRzWzJdOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJZGVzdHNba10gPSBpZGVudHNba107Ci0JCX0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRILCBkZXN0c1swXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRILCBkZXN0c1sxXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCwgZGVzdHNbMl0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRILCBkZXN0c1szXSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NTU1Byb3BlcnR5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NTU1Byb3BlcnR5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjgzYThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DU1NQcm9wZXJ0eUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1Byb3BlcnR5Q29udGV4dCBpbXBsZW1lbnRzIElDU1MyUHJvcGVydGllcyB7Ci0KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGZQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCUhhc2hTZXQgZk1vZGlmaWVkID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIHN1YlByb3BlcnR5QWRhcHRlcnM7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBzaG9ydGhhbmRBZGFwdGVyczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NQcm9wZXJ0eUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRTaG9ydGhhbmRBZGFwdGVycygpOwotCQlpbml0U3ViUHJvcGVydHlBZGFwdGVycygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NQcm9wZXJ0eUNvbnRleHQoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlzdXBlcigpOwotCQlpbml0U2hvcnRoYW5kQWRhcHRlcnMoKTsKLQkJaW5pdFN1YlByb3BlcnR5QWRhcHRlcnMoKTsKLQkJaW5pdGlhbGl6ZShkZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGV4cG9ydHMgYWxsIHByb3BlcnR5L3ZhbHVlIHBhaXJzIHRvICdkZWNsJyBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5RnVsbChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVudW1lcmF0aW9uIGtleXMgPSBmUHJvcGVydGllcy5rZXlzKCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJT2JqZWN0IHZhbCA9IGZQcm9wZXJ0aWVzLmdldChrZXkpOwotCQkJU3RyaW5nIHZhbHVlID0gKHZhbCBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgPyAoKElDU1NWYWx1ZSkgdmFsKS5nZXRDU1NWYWx1ZVRleHQoKSA6IHZhbC50b1N0cmluZygpOwotCi0JCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCWRlY2wucmVtb3ZlUHJvcGVydHkoa2V5LnRvU3RyaW5nKCkpOwotCQkJZWxzZQotCQkJCWRlY2wuc2V0UHJvcGVydHkoa2V5LnRvU3RyaW5nKCksIHZhbHVlLnRyaW0oKSwgKHZhbCBpbnN0YW5jZW9mIFZhbHVlRGF0YSAmJiAoKFZhbHVlRGF0YSkgdmFsKS5pbXBvcnRhbnQpID8gIiFpbXBvcnRhbnQiIDogIiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGV4cG9ydHMgbW9kaWZpZWQgcHJvcGVydHkvdmFsdWUgcGFpcnMgdG8gJ2RlY2wnCi0JICogZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseU1vZGlmaWVkKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCB8fCBmTW9kaWZpZWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSBmTW9kaWZpZWQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLQkJCU9iamVjdCB2YWwgPSBmUHJvcGVydGllcy5nZXQoa2V5KTsKLQkJCVN0cmluZyB2YWx1ZSA9ICh2YWwgaW5zdGFuY2VvZiBJQ1NTVmFsdWUpID8gKChJQ1NTVmFsdWUpIHZhbCkuZ2V0Q1NTVmFsdWVUZXh0KCkgOiAoKHZhbCAhPSBudWxsKSA/IHZhbC50b1N0cmluZygpIDogbnVsbCk7Ci0KLQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJZGVjbC5yZW1vdmVQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSk7Ci0JCQllbHNlCi0JCQkJZGVjbC5zZXRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSwgdmFsdWUudHJpbSgpLCAodmFsIGluc3RhbmNlb2YgVmFsdWVEYXRhICYmICgoVmFsdWVEYXRhKSB2YWwpLmltcG9ydGFudCkgPyAiIWltcG9ydGFudCIgOiAiIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBjbG9uZSBvZiB0aGlzIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQlDU1NQcm9wZXJ0eUNvbnRleHQgY2xvbmUgPSBuZXcgQ1NTUHJvcGVydHlDb250ZXh0KCk7Ci0JCWlmICh0aGlzLmZNb2RpZmllZCAhPSBudWxsKQotCQkJY2xvbmUuZk1vZGlmaWVkID0gKEhhc2hTZXQpIHRoaXMuZk1vZGlmaWVkLmNsb25lKCk7Ci0JCWVsc2UKLQkJCWNsb25lLmZNb2RpZmllZCA9IG51bGw7Ci0JCWNsb25lLmZQcm9wZXJ0aWVzID0gKEhhc2h0YWJsZSkgdGhpcy5mUHJvcGVydGllcy5jbG9uZSgpOwotCQlyZXR1cm4gY2xvbmU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIGEgc2hvcnQtaGFuZCBwcm9wZXJ0eSdzIHZhbHVlIHRvIGVhY2ggbGVhZgotCSAqIHByb3BlcnR5J3MgdmFsdWUgYW5kIHNldCB0aGVtIHRvICdmb3JlaWduJwotCSAqIAotCSAqIEZvciBleGFtcGxlLCBnaXZlbiBbcHJvcD1ib3JkZXItdG9wLCB2YWx1ZT0ic29saWQgMXB4IHllbGxvdyJdIHdpbGwgYmUKLQkgKiBleHBhbmRlZCB0byBbYm9yZGVyLXRvcC1jb2xvcj15ZWxsb3csIGJvcmRlci10b3Atc3R5bGU9c29saWQsCi0JICogYm9yZGVyLXRvcC13aWR0aD0xcHhdIGFuZCB0aGV5IGFyZSBzdG9yZWQgdG8gJ2ZvcmVpZ24nIGNvbnRleHQuCi0JICogCi0JICogTm90ZSB0aGF0IHJlY3Vyc2l2ZWx5IHNob3J0aGFuZGVkIHByb3BlcnR5IGxpa2UgJ2JvcmRlcicgd2lsbCBiZQotCSAqIGV4cGFuZGVkIHRvIGFsbCBkZXNjZW5kYW50IGxlYWYgcHJvcGVydGllcyBsaWtlCi0JICogJ2JvcmRlci1bdG9wL3JpZ2h0L2JvdHRvbS9sZWZ0XS1bY29sb3Ivc3R5bGUvd2lkdGhdJwotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGZvcmVpZ24KLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uLkNTU1Byb3BlcnR5Q29udGV4dAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBleHBhbmRUb0xlYWYoUHJvcENNUHJvcGVydHkgcHJvcCwgU3RyaW5nIHZhbHVlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZm9yZWlnbikgewotCQkvLyBleHBhbmQgc2hvcnRoYW5kIHByb3BlcnR5Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCUlTaG9ydGhhbmRBZGFwdGVyIGFkYXB0ZXIgPSAoSVNob3J0aGFuZEFkYXB0ZXIpIHNob3J0aGFuZEFkYXB0ZXJzLmdldChwcm9wKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLmV4cGFuZCh2YWx1ZSwgZm9yZWlnbik7Ci0JCQkJZm9yZWlnbi5zZXQocHJvcC5nZXROYW1lKCksICIiKTsvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wLmdldE51bUNoaWxkKCk7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqID0gcHJvcC5nZXRDaGlsZEF0KGkpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvcENNUHJvcGVydHkgJiYgIShvYmogaW5zdGFuY2VvZiBQcm9wQ01TdWJQcm9wZXJ0eSkpIHsKLQkJCQkJCVByb3BDTVByb3BlcnR5IGV4cGFuZGVkUHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgb2JqOwotCQkJCQkJdmFsdWUgPSBmb3JlaWduLmdldChleHBhbmRlZFByb3AuZ2V0TmFtZSgpKTsKLQkJCQkJCWV4cGFuZFRvTGVhZihleHBhbmRlZFByb3AsIHZhbHVlLCBmb3JlaWduKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCF2YWx1ZS5lcXVhbHMoZm9yZWlnbi5nZXQocHJvcC5nZXROYW1lKCkpKSkgewotCQkJCWZvcmVpZ24uc2V0KHByb3AuZ2V0TmFtZSgpLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdmFsdWUgb2YgJ3Byb3AnLiBRdWVyeWluZyB2YWx1ZSBtZWNoYW5pc20gY2hlY2tzCi0JICogc2hvcnQtaGFuZCBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEZvciBleGFtcGxlLCBnaXZlbiAiYmFja2dyb3VuZD1maXhlZCB3aGl0ZSIgaXMgc2V0IGluIHRoaXMgaW5zYXRuY2UgYW5kCi0JICogcGFyYW0gInByb3A9YmFja2dyb3VuZC1jb2xvciIsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSAid2hpdGUiLgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5IHByb3ApIHsKLQkJaWYgKHByb3AgaW5zdGFuY2VvZiBQcm9wQ01TdWJQcm9wZXJ0eSkgewotCQkJSVN1YlByb3BlcnR5QWRhcHRlciBhZGFwdGVyID0gKElTdWJQcm9wZXJ0eUFkYXB0ZXIpIHN1YlByb3BlcnR5QWRhcHRlcnMuZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0KHRoaXMpOwotCQl9Ci0JCVN0cmluZyBzdHIgPSBnZXQocHJvcC5nZXROYW1lKCkpOwotCQlpZiAoKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKSAmJiBwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCkgPiAwKSB7Ci0JCQkvLyBnZXQgZXhwYW5kZWQgcHJvcGVydHkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpOyBpKyspIHsKLQkJCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUGFyZW50ID0gcHJvcC5zaG9ydGhhbmRDb250YWluZXJBdChpKTsKLQkJCQlTdHJpbmcgc3RyUGFyZW50ID0gZ2V0KHByb3BQYXJlbnQpOwotCQkJCWlmIChzdHJQYXJlbnQgIT0gbnVsbCAmJiBzdHJQYXJlbnQudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlJU2hvcnRoYW5kQWRhcHRlciBhZGFwdGVyID0gKElTaG9ydGhhbmRBZGFwdGVyKSBzaG9ydGhhbmRBZGFwdGVycy5nZXQocHJvcFBhcmVudCk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBleHRyYWN0ZWRWYWx1ZSA9IGFkYXB0ZXIuZXh0cmFjdChzdHJQYXJlbnQsIHByb3ApOwotCQkJCQkJcmV0dXJuIChleHRyYWN0ZWRWYWx1ZSAhPSBudWxsKSA/IGV4dHJhY3RlZFZhbHVlIDogIiI7Ly8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdHI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhbHVlIG9mICdwcm9wJy4gUXVlcnlpbmcgdmFsdWUgbWVjaGFuaXNtIGRvZXMKLQkgKiBub3QgY2FyZSBzaG9ydGhhbmQgcHJvcGVydGllcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldChTdHJpbmcgcHJvcE5hbWUpIHsKLQkJU3RyaW5nIHN0ciA9IG51bGw7Ci0JCU9iamVjdCBvYmogPSBmUHJvcGVydGllcy5nZXQocHJvcE5hbWUpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpCi0JCQkJc3RyID0gKChJQ1NTVmFsdWUpIG9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQllbHNlCi0JCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIgOiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBhemltdXRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXppbXV0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQVpJTVVUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kQXR0YWNobWVudCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1pbWFnZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZEltYWdlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1wb3NpdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTikpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvblgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpKTsKLQkJLyoKLQkJICogU3RyaW5nIHN0ciA9IG51bGw7IE9iamVjdCBvYmogPQotCQkgKiBmUHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7IGlmIChvYmogIT0gbnVsbCkgewotCQkgKiBQcm9wQ01Qcm9wZXJ0eSBwcm9wWCA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKTsKLQkJICogUHJvcENNUHJvcGVydHkgcHJvcFkgPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCSAqIGlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7IElDU1NWYWx1ZUxpc3QgbGlzdCA9Ci0JCSAqIChJQ1NTVmFsdWVMaXN0KSBvYmo7IElDU1NWYWx1ZSB2YWx1ZSA9IChJQ1NTVmFsdWUpIGxpc3QuaXRlbSgwKTsgaWYKLQkJICogKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsKLQkJICogSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsgaWYKLQkJICogKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgeyAvLyBjaGVjawotCQkgKiBub3QgdG9wIG9yIGJvdHRvbSBpZiAoIXByb3BYLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSAmJgotCQkgKiBwcm9wWS5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkpIHsgLy8gY2FzZSBvcmRlciBpcyB2ZXJ0aWNhbCAtPgotCQkgKiBob3Jpem9udGFsIHZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDEpOyB9IH0gfSBzdHIgPQotCQkgKiB2YWx1ZS5nZXRDU1NWYWx1ZVRleHQoKTsgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsgc3RyID0KLQkJICogKChJQ1NTVmFsdWUpb2JqKS5nZXRDU1NWYWx1ZVRleHQoKTsgfSBlbHNlIHN0ciA9IG9iai50b1N0cmluZygpOyB9Ci0JCSAqIHJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvblkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpKTsKLQkJLyoKLQkJICogU3RyaW5nIHN0ciA9IG51bGw7IE9iamVjdCBvYmogPQotCQkgKiBmUHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7IGlmIChvYmogIT0gbnVsbCkgewotCQkgKiBQcm9wQ01Qcm9wZXJ0eSBwcm9wWCA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKTsKLQkJICogUHJvcENNUHJvcGVydHkgcHJvcFkgPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCSAqIGlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7IElDU1NWYWx1ZUxpc3QgbGlzdCA9Ci0JCSAqIChJQ1NTVmFsdWVMaXN0KSBvYmo7IGludCBpbmRleCA9IDE7IElDU1NWYWx1ZSB2YWx1ZSA9IChJQ1NTVmFsdWUpCi0JCSAqIGxpc3QuaXRlbSgwKTsgaWYgKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09Ci0JCSAqIENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsgSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPQotCQkgKiAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsgaWYgKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09Ci0JCSAqIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgeyAvLyBjaGVjayBub3QgdG9wIG9yIGJvdHRvbSBpZgotCQkgKiAoIXByb3BYLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSAmJgotCQkgKiBwcm9wWS5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkpIHsgLy8gY2FzZSBvcmRlciBpcyB2ZXJ0aWNhbCAtPgotCQkgKiBob3Jpem9udGFsIGluZGV4ID0gMDsgfSB9IH0gc3RyID0KLQkJICogKChJQ1NTVmFsdWUpbGlzdC5pdGVtKGluZGV4KSkuZ2V0Q1NTVmFsdWVUZXh0KCk7IH0gZWxzZSBpZiAob2JqCi0JCSAqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7IC8vIGRvIG5vdGhpbmcgLS0tIHZhbHVlIGlzIG51bGwgfSBlbHNlIHN0ciA9Ci0JCSAqIG9iai50b1N0cmluZygpOyB9IHJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1yZXBlYXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kUmVwZWF0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1ib3R0b20gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckJvdHRvbSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWJvdHRvbS1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQm90dG9tQ29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1ib3R0b20tc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckJvdHRvbVN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItYm90dG9tLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJCb3R0b21XaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWNvbGxhcHNlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJDb2xsYXBzZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTExBUFNFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckNvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1sZWZ0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJMZWZ0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWxlZnQtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckxlZnRDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1sZWZ0LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJMZWZ0U3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItbGVmdC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyTGVmdFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXJpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJSaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItcmlnaHQtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclJpZ2h0Q29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXJpZ2h0LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJSaWdodFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1yaWdodC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyUmlnaHRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItc3BhY2luZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyU3BhY2luZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NQQUNJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyU3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXRvcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyVG9wKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItdG9wLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJUb3BDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXRvcC1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyVG9wU3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci10b3Atd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclRvcFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlcldpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvdHRvbSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm90dG9tKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1RUT00pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNhcHRpb24tc2lkZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FwdGlvblNpZGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NBUFRJT05fU0lERSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY2xlYXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsZWFyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTEVBUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY2xpcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpcEJvdHRvbSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXBMZWZ0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXBSaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpcFRvcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNvbnRlbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTlRFTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNvdW50ZXItaW5jcmVtZW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3VudGVySW5jcmVtZW50KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX0lOQ1JFTUVOVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY291bnRlci1yZXNldCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q291bnRlclJlc2V0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX1JFU0VUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmbG9hdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3NzRmxvYXQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZMT0FUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjdWUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1ZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjdWUtYWZ0ZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1ZUFmdGVyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQUZURVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1ZS1iZWZvcmUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1ZUJlZm9yZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0JFRk9SRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY3Vyc29yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJzb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVUlNPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZGlyZWN0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXJlY3Rpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJUkVDVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZGlzcGxheSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElTUExBWSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZWxldmF0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGV2YXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VMRVZBVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZW1wdHktY2VsbHMgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVtcHR5Q2VsbHMoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VNUFRZX0NFTExTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LWZhbWlseSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udEZhbWlseSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtc2l6ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFNpemUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC1zaXplLWFkanVzdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFNpemVBZGp1c3QoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRV9BREpVU1QpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtc3RyZXRjaCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFN0cmV0Y2goKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RSRVRDSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXZhcmlhbnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRWYXJpYW50KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtd2VpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250V2VpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgaGVpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0hFSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGVmdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGVmdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVGVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGV0dGVyLXNwYWNpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExldHRlclNwYWNpbmcoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFVFRFUl9TUEFDSU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsaW5lLWhlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZUhlaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpc3Qtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGlzdC1zdHlsZS1pbWFnZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFN0eWxlSW1hZ2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpc3Qtc3R5bGUtcG9zaXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZVBvc2l0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsaXN0LXN0eWxlLXR5cGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZVR5cGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJnaW4oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luLWJvdHRvbSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luQm90dG9tKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4tbGVmdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luTGVmdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbi1yaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luUmlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luLXRvcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luVG9wKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJrZXItb2Zmc2V0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJrZXJPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktFUl9PRkZTRVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmtzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJrcygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS1MpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1heC1oZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1heEhlaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX0hFSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWF4LXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXhXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtaW4taGVpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNaW5IZWlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9IRUlHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1pbi13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWluV2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3JwaGFucyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JwaGFucygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1JQSEFOUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3V0bGluZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3V0bGluZS1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZUNvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvdXRsaW5lLXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRsaW5lU3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG91dGxpbmUtd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dGxpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3ZlcmZsb3cgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE92ZXJmbG93KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVkVSRkxPVykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFkZGluZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElORykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZy1ib3R0b20gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZGRpbmdCb3R0b20oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nLWxlZnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZGRpbmdMZWZ0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZGRpbmctcmlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZGRpbmdSaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZy10b3AgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZGRpbmdUb3AoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWdlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWdlLWJyZWFrLWFmdGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlQnJlYWtBZnRlcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19BRlRFUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFnZS1icmVhay1iZWZvcmUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VCcmVha0JlZm9yZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19CRUZPUkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZ2UtYnJlYWstaW5zaWRlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlQnJlYWtJbnNpZGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfSU5TSURFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYXVzZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF1c2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYXVzZS1hZnRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF1c2VBZnRlcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQUZURVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhdXNlLWJlZm9yZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF1c2VCZWZvcmUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0JFRk9SRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGl0Y2ggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBpdGNoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGl0Y2gtcmFuZ2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBpdGNoUmFuZ2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIX1JBTkdFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwbGF5LWR1cmluZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGxheUR1cmluZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUExBWV9EVVJJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBvc2l0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUE9TSVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHF1b3RlcyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVvdGVzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9RVU9URVMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHJpY2huZXNzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSaWNobmVzcygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklDSE5FU1MpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHJpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uLklTaG9ydGhhbmRBZGFwdGVyCi0JICogQHBhcmFtIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTaG9ydGhhbmRBZGFwdGVyIGdldFNob3J0aGFuZEFkYXB0ZXIoUHJvcENNUHJvcGVydHkgcHJvcCkgewotCQlyZXR1cm4gKElTaG9ydGhhbmRBZGFwdGVyKSBzaG9ydGhhbmRBZGFwdGVycy5nZXQocHJvcCk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzaXplIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaXplKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TSVpFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzcGVhayBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYWsoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzcGVhay1oZWFkZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWFrSGVhZGVyKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19IRUFERVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWFrLW51bWVyYWwgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWFrTnVtZXJhbCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfTlVNRVJBTCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlYWstcHVuY3R1YXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWFrUHVuY3R1YXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX1BVTkNUVUFUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzcGVlY2gtcmF0ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlZWNoUmF0ZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFRUNIX1JBVEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHN0cmVzcyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyZXNzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TVFJFU1MpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRhYmxlLWxheW91dCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVMYXlvdXQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RBQkxFX0xBWU9VVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC1hbGlnbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEFsaWduKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0FMSUdOKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LWRlY29yYXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHREZWNvcmF0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0RFQ09SQVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtaW5kZW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0SW5kZW50KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0lOREVOVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC1zaGFkb3cgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRTaGFkb3coKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfU0hBRE9XKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LXRyYW5zZm9ybSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFRyYW5zZm9ybSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9UUkFOU0ZPUk0pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRvcCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9wKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UT1ApKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHVuaWNvZGUtYmlkaSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5pY29kZUJpZGkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1VOSUNPREVfQklESSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdmVydGljYWwtYWxpZ24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnRpY2FsQWxpZ24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZFUlRJQ0FMX0FMSUdOKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB2aXNpYmlsaXR5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaXNpYmlsaXR5KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WSVNJQklMSVRZKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB2b2ljZS1mYW1pbHkgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZvaWNlRmFtaWx5KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0lDRV9GQU1JTFkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHZvbHVtZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vm9sdW1lKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0xVTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHdoaXRlLXNwYWNlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaGl0ZVNwYWNlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSElURV9TUEFDRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd2lkb3dzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaWRvd3MoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRE9XUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgd29yZC1zcGFjaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXb3JkU3BhY2luZygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV09SRF9TUEFDSU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB6LWluZGV4IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRaSW5kZXgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1pfSU5ERVgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJZlByb3BlcnRpZXMuY2xlYXIoKTsKLQkJaWYgKGZNb2RpZmllZCAhPSBudWxsKQotCQkJZk1vZGlmaWVkLmNsZWFyKCk7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IG5Qcm9wZXJ0aWVzID0gZGVjbC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUHJvcGVydGllczsgaSsrKSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWUgPSBkZWNsLml0ZW0oaSk7Ci0JCQlpZiAocHJvcE5hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcm9wTiA9IHByb3BOYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChwcm9wTi5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCUNTU1ZhbHVlIHZhbCA9IGRlY2wuZ2V0UHJvcGVydHlDU1NWYWx1ZShwcm9wTmFtZSk7Ci0JCQkJCWlmICh2YWwgIT0gbnVsbCkKLQkJCQkJCWZQcm9wZXJ0aWVzLnB1dChwcm9wTiwgdmFsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgdm9pZCBpbml0U2hvcnRoYW5kQWRhcHRlcnMoKSB7Ci0JCWlmIChzaG9ydGhhbmRBZGFwdGVycyA9PSBudWxsKSB7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCS8vIHJlZ2lzdGVyCi0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHKSwgbmV3IEJhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVIpLCBuZXcgQm9yZGVyU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKSwgbmV3IEJvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKSwgbmV3IEJvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKSwgbmV3IEJvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUCksIG5ldyBCb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFQpLCBuZXcgQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NKSwgbmV3IEJvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUKSwgbmV3IEJvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKSwgbmV3IEZvbnRTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKSwgbmV3IExpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTiksIG5ldyBNYXJnaW5TaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKSwgbmV3IFBhZGRpbmdTaG9ydGhhbmRBZGFwdGVyKCkpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgdm9pZCBpbml0U3ViUHJvcGVydHlBZGFwdGVycygpIHsKLQkJaWYgKHN1YlByb3BlcnR5QWRhcHRlcnMgPT0gbnVsbCkgewotCQkJc3ViUHJvcGVydHlBZGFwdGVycyA9IG5ldyBIYXNodGFibGUoKTsKLQotCQkJLy8gcmVnaXN0ZXIKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCwgbmV3IEJhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1ksIG5ldyBCYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCwgbmV3IENsaXBUb3BTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQsIG5ldyBDbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NLCBuZXcgQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZULCBuZXcgQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotCQlyZXR1cm4gKGZNb2RpZmllZCAhPSBudWxsICYmIGZNb2RpZmllZC5zaXplKCkgIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIHByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmUHJvcGVydGllcy5rZXlzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIHByb3BlcnRpZXNNb2RpZmllZCgpIHsKLQkJaWYgKGZNb2RpZmllZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uKSBmTW9kaWZpZWQuY2xvbmUoKSkuaXRlcmF0b3IoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl9Ci0JCQl9OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyB0aGUgdmFsdWUgb2Ygc2hvcnRoYW5kICdwcm9wJyB0byAnZm9yZWlnbicKLQkgKiBjb250ZXh0LiBOb3RlIHRoYXQgaWYgdGhpcyBoYXMgcGFyZW50IHNob3J0aGFuZCBwcm9wZXJ0aWVzIG9mICdwcm9wJywKLQkgKiB0aGV5IGFyZSBhbGwgZXhwYW5kZWQgdG8gJ2ZvcmVpZ24nIGNvbnRleHQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVjdXJzaXZlRXh0cmFjdChQcm9wQ01Qcm9wZXJ0eSBwcm9wLCBDU1NQcm9wZXJ0eUNvbnRleHQgZm9yZWlnbikgewotCQkvLyBleHBhbmQgc2hvcnRoYW5kIHByb3BlcnR5Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpOyBpKyspIHsKLQkJCXJlY3Vyc2l2ZUV4dHJhY3QocHJvcC5zaG9ydGhhbmRDb250YWluZXJBdChpKSwgZm9yZWlnbik7Ci0JCX0KLQkJU3RyaW5nIHN0ciA9IGdldChwcm9wLmdldE5hbWUoKSk7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlzdHIgPSBmb3JlaWduLmdldChwcm9wLmdldE5hbWUoKSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJSVNob3J0aGFuZEFkYXB0ZXIgYWRhcHRlciA9IChJU2hvcnRoYW5kQWRhcHRlcikgc2hvcnRoYW5kQWRhcHRlcnMuZ2V0KHByb3ApOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuZXhwYW5kKHN0ciwgZm9yZWlnbik7Ci0JCQkJZm9yZWlnbi5zZXQocHJvcC5nZXROYW1lKCksICIiKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVEZXNjZW5kYW50cyhQcm9wQ01Qcm9wZXJ0eSBwcm9wKSB7Ci0JCWlmIChwcm9wLmlzU2hvcnRoYW5kKCkpIHsKLQkJCS8vIHJlbW92ZSBwcm9wZXJ0aWVzCi0JCQlpbnQgbiA9IHByb3AuZ2V0TnVtQ2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IHByb3AuZ2V0Q2hpbGRBdChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvcENNUHJvcGVydHkpIHsKLQkJCQkJcmVtb3ZlRGVzY2VuZGFudHMoKFByb3BDTVByb3BlcnR5KSBvYmopOwotCi0JCQkJCVN0cmluZyBzdHIgPSBnZXQob2JqLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkKLQkJCQkJCXNldChvYmoudG9TdHJpbmcoKSwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldE1vZGlmaWVkKCkgewotCQlpZiAoZk1vZGlmaWVkICE9IG51bGwpCi0JCQlmTW9kaWZpZWQuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHBhaXIgb2YgJ3Byb3AnLyd2YWx1ZScuIElmIHNob3J0aGFuZCBwcm9wZXJ0aWVzCi0JICogcmVsYXRlZCB0byAncHJvcCcgYXJlIGFscmVhZHkgZGVmaW5lZCwgdGhleSB3aWxsIGJlIGV4cGFuZGVkIHRvIGF2b2lkCi0JICogcHJvcGVydHkgY29uZmxpY3Rpb24uIElmIGRlc2NlbmRhbnQgcHJvcGVydGllcyBvZiAncHJvcCcgYXJlIGFscmVhZHkKLQkgKiBkZWZpbmVkLCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCB0byBhdm9pZCBwcm9wZXJ0eSBjb25mbGljdGlvbi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eSBwcm9wLCBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHByb3AgaW5zdGFuY2VvZiBQcm9wQ01TdWJQcm9wZXJ0eSkgewotCQkJSVN1YlByb3BlcnR5QWRhcHRlciBhZGFwdGVyID0gKElTdWJQcm9wZXJ0eUFkYXB0ZXIpIHN1YlByb3BlcnR5QWRhcHRlcnMuZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnNldCh0aGlzLCB2YWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChwcm9wLmdldFNob3J0aGFuZENvbnRhaW5lckNvdW50KCkgPiAwKSB7Ci0JCQkvLyBleHBhbmQgc2hvcnRoYW5kIHByb3BlcnR5Ci0JCQlDU1NQcm9wZXJ0eUNvbnRleHQgY29udGV4dCA9IG5ldyBDU1NQcm9wZXJ0eUNvbnRleHQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpOyBpKyspIHsKLQkJCQlyZWN1cnNpdmVFeHRyYWN0KHByb3Auc2hvcnRoYW5kQ29udGFpbmVyQXQoaSksIGNvbnRleHQpOwotCQkJfQotCQkJRW51bWVyYXRpb24gcHJvcGVydGllcyA9IGNvbnRleHQucHJvcGVydGllcygpOwotCQkJd2hpbGUgKHByb3BlcnRpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgcHJvcEZvcmVpZ24gPSBwcm9wZXJ0aWVzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQlzZXQocHJvcEZvcmVpZ24sIGNvbnRleHQuZ2V0KHByb3BGb3JlaWduKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZW1vdmVEZXNjZW5kYW50cyhwcm9wKTsKLQotCQlzZXQocHJvcC5nZXROYW1lKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHBhaXIgb2YgJ3Byb3BOYW1lJy8ndmFsdWUnIHJlZ2FyZGxlc3Mgb2YgaXRzCi0JICogc2hvcnRoYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0KFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGtleSA9IHByb3BOYW1lOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCWZQcm9wZXJ0aWVzLnJlbW92ZShrZXkpOwotCQllbHNlCi0JCQlmUHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JCWlmIChmTW9kaWZpZWQgPT0gbnVsbCkKLQkJCWZNb2RpZmllZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZNb2RpZmllZC5hZGQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBemltdXRoKFN0cmluZyBhemltdXRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9BWklNVVRIKSwgYXppbXV0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChTdHJpbmcgYmFja2dyb3VuZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkcpLCBiYWNrZ3JvdW5kKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQXR0YWNobWVudChTdHJpbmcgYmFja2dyb3VuZEF0dGFjaG1lbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpLCBiYWNrZ3JvdW5kQXR0YWNobWVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKFN0cmluZyBiYWNrZ3JvdW5kQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKSwgYmFja2dyb3VuZENvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kSW1hZ2UoU3RyaW5nIGJhY2tncm91bmRJbWFnZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpLCBiYWNrZ3JvdW5kSW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvbihTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTiksIGJhY2tncm91bmRQb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uWChqYXZhLmxhbmcuU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvblgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLCBiYWNrZ3JvdW5kUG9zaXRpb25YKTsKLQkJLyoKLQkJICogU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsgU3RyaW5nIHZhbEggPSBiYWNrZ3JvdW5kUG9zaXRpb25YOyBTdHJpbmcKLQkJICogdmFsViA9IGdldEJhY2tncm91bmRQb3NpdGlvblkoKTsgaWYgKHZhbFYgPT0gbnVsbCB8fAotCQkgKiB2YWxWLmxlbmd0aCgpPT0gMCkgbmV3VmFsdWUgPSB2YWxIOyBlbHNlIGlmICh2YWxIID09IG51bGwgfHwKLQkJICogdmFsSC5sZW5ndGgoKSA9PSAwKSB7IENvbGxlY3Rpb24gdmFsWCA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKS5nZXRWYWx1ZXMoKTsKLQkJICogQ29sbGVjdGlvbiB2YWxZID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLmdldFZhbHVlcygpOwotCQkgKiBQcm9wQ01VdGlsLm1pbnVzKHZhbFksdmFsWCk7IEl0ZXJhdG9yIGl0ID0gdmFsWS5pdGVyYXRvcigpOwotCQkgKiB3aGlsZShpdC5oYXNOZXh0KCkpIHsgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsgaWYKLQkJICogKG9iai50b1N0cmluZygpLmVxdWFscyh2YWxWLnRvTG93ZXJDYXNlKCkpKSB7IC8vIG5lZWQgbm90Ci0JCSAqIGNvbXBlbnNhdGUgZm9yIC4uLiBuZXdWYWx1ZSA9IHZhbFY7IGJyZWFrOyB9IH0gLy8gY29tcGVuc2F0ZSBmb3IKLQkJICogSG9yaXpvbnRhbCB2YWx1ZSBpZiAobmV3VmFsdWUgPT0gbnVsbCkgbmV3VmFsdWUgPSAiMCUgIiArIHZhbFY7IH0KLQkJICogZWxzZSBuZXdWYWx1ZSA9IHZhbEggKyAiICIgKyB2YWxWOyBzZXRCYWNrZ3JvdW5kUG9zaXRpb24obmV3VmFsdWUpOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKGphdmEubGFuZy5TdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uWSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSksIGJhY2tncm91bmRQb3NpdGlvblkpOwotCQkvKgotCQkgKiBTdHJpbmcgbmV3VmFsdWUgPSBudWxsOyBTdHJpbmcgdmFsSCA9IGdldEJhY2tncm91bmRQb3NpdGlvblgoKTsKLQkJICogU3RyaW5nIHZhbFYgPSBiYWNrZ3JvdW5kUG9zaXRpb25ZOyBpZiAodmFsViA9PSBudWxsIHx8Ci0JCSAqIHZhbFYubGVuZ3RoKCk9PSAwKSBuZXdWYWx1ZSA9IHZhbEg7IGVsc2UgaWYgKHZhbEggPT0gbnVsbCB8fAotCQkgKiB2YWxILmxlbmd0aCgpID09IDApIHsgQ29sbGVjdGlvbiB2YWxYID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLmdldFZhbHVlcygpOwotCQkgKiBDb2xsZWN0aW9uIHZhbFkgPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkuZ2V0VmFsdWVzKCk7Ci0JCSAqIFByb3BDTVV0aWwubWludXModmFsWSx2YWxYKTsgSXRlcmF0b3IgaXQgPSB2YWxZLml0ZXJhdG9yKCk7Ci0JCSAqIHdoaWxlKGl0Lmhhc05leHQoKSkgeyBPYmplY3Qgb2JqID0gaXQubmV4dCgpOyBpZgotCQkgKiAob2JqLnRvU3RyaW5nKCkuZXF1YWxzKHZhbFYudG9Mb3dlckNhc2UoKSkpIHsgLy8gbmVlZCBub3QKLQkJICogY29tcGVuc2F0ZSBmb3IgLi4uIG5ld1ZhbHVlID0gdmFsVjsgYnJlYWs7IH0gfSAvLyBjb21wZW5zYXRlIGZvcgotCQkgKiBIb3Jpem9udGFsIHZhbHVlIGlmIChuZXdWYWx1ZSA9PSBudWxsKSBuZXdWYWx1ZSA9ICIwJSAiICsgdmFsVjsgfQotCQkgKiBlbHNlIG5ld1ZhbHVlID0gdmFsSCArICIgIiArIHZhbFY7IHNldEJhY2tncm91bmRQb3NpdGlvbihuZXdWYWx1ZSk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRSZXBlYXQoU3RyaW5nIGJhY2tncm91bmRSZXBlYXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCksIGJhY2tncm91bmRSZXBlYXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlcihTdHJpbmcgYm9yZGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVIpLCBib3JkZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbShTdHJpbmcgYm9yZGVyQm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NKSwgYm9yZGVyQm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b21Db2xvcihTdHJpbmcgYm9yZGVyQm90dG9tQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpLCBib3JkZXJCb3R0b21Db2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQm90dG9tU3R5bGUoU3RyaW5nIGJvcmRlckJvdHRvbVN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKSwgYm9yZGVyQm90dG9tU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbVdpZHRoKFN0cmluZyBib3JkZXJCb3R0b21XaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCksIGJvcmRlckJvdHRvbVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJDb2xsYXBzZShTdHJpbmcgYm9yZGVyQ29sbGFwc2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xMQVBTRSksIGJvcmRlckNvbGxhcHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJDb2xvcihTdHJpbmcgYm9yZGVyQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUiksIGJvcmRlckNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0KFN0cmluZyBib3JkZXJMZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVCksIGJvcmRlckxlZnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnRDb2xvcihTdHJpbmcgYm9yZGVyTGVmdENvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUiksIGJvcmRlckxlZnRDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVmdFN0eWxlKFN0cmluZyBib3JkZXJMZWZ0U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKSwgYm9yZGVyTGVmdFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0V2lkdGgoU3RyaW5nIGJvcmRlckxlZnRXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpLCBib3JkZXJMZWZ0V2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0KFN0cmluZyBib3JkZXJSaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUKSwgYm9yZGVyUmlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0Q29sb3IoU3RyaW5nIGJvcmRlclJpZ2h0Q29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUiksIGJvcmRlclJpZ2h0Q29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0U3R5bGUoU3RyaW5nIGJvcmRlclJpZ2h0U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSksIGJvcmRlclJpZ2h0U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclJpZ2h0V2lkdGgoU3RyaW5nIGJvcmRlclJpZ2h0V2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCksIGJvcmRlclJpZ2h0V2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclNwYWNpbmcoU3RyaW5nIGJvcmRlclNwYWNpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TUEFDSU5HKSwgYm9yZGVyU3BhY2luZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyU3R5bGUoU3RyaW5nIGJvcmRlclN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpLCBib3JkZXJTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wKFN0cmluZyBib3JkZXJUb3ApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1ApLCBib3JkZXJUb3ApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcENvbG9yKFN0cmluZyBib3JkZXJUb3BDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUiksIGJvcmRlclRvcENvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3BTdHlsZShTdHJpbmcgYm9yZGVyVG9wU3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpLCBib3JkZXJUb3BTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wV2lkdGgoU3RyaW5nIGJvcmRlclRvcFdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKSwgYm9yZGVyVG9wV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlcldpZHRoKFN0cmluZyBib3JkZXJXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKSwgYm9yZGVyV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvdHRvbShTdHJpbmcgYm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1RUT00pLCBib3R0b20pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhcHRpb25TaWRlKFN0cmluZyBjYXB0aW9uU2lkZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0FQVElPTl9TSURFKSwgY2FwdGlvblNpZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsZWFyKFN0cmluZyBjbGVhcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xFQVIpLCBjbGVhcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcChTdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBCb3R0b20oamF2YS5sYW5nLlN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBMZWZ0KGphdmEubGFuZy5TdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSwgY2xpcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpcFJpZ2h0KGphdmEubGFuZy5TdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBUb3AoamF2YS5sYW5nLlN0cmluZyBjbGlwKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBjb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09MT1IpLCBjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09OVEVOVCksIGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvdW50ZXJJbmNyZW1lbnQoU3RyaW5nIGNvdW50ZXJJbmNyZW1lbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfSU5DUkVNRU5UKSwgY291bnRlckluY3JlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q291bnRlclJlc2V0KFN0cmluZyBjb3VudGVyUmVzZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfUkVTRVQpLCBjb3VudGVyUmVzZXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc0Zsb2F0KFN0cmluZyBjc3NGbG9hdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRkxPQVQpLCBjc3NGbG9hdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VlKFN0cmluZyBjdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRSksIGN1ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VlQWZ0ZXIoU3RyaW5nIGN1ZUFmdGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQUZURVIpLCBjdWVBZnRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VlQmVmb3JlKFN0cmluZyBjdWVCZWZvcmUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9CRUZPUkUpLCBjdWVCZWZvcmUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnNvcihTdHJpbmcgY3Vyc29yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVVJTT1IpLCBjdXJzb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpcmVjdGlvbihTdHJpbmcgZGlyZWN0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVJFQ1RJT04pLCBkaXJlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXkoU3RyaW5nIGRpc3BsYXkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJU1BMQVkpLCBkaXNwbGF5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGV2YXRpb24oU3RyaW5nIGVsZXZhdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRUxFVkFUSU9OKSwgZWxldmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbXB0eUNlbGxzKFN0cmluZyBlbXB0eUNlbGxzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTVBUWV9DRUxMUyksIGVtcHR5Q2VsbHMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnQoU3RyaW5nIGZvbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpLCBmb250KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250RmFtaWx5KFN0cmluZyBmb250RmFtaWx5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSksIGZvbnRGYW1pbHkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRTaXplKFN0cmluZyBmb250U2l6ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKSwgZm9udFNpemUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRTaXplQWRqdXN0KFN0cmluZyBmb250U2l6ZUFkanVzdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFX0FESlVTVCksIGZvbnRTaXplQWRqdXN0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U3RyZXRjaChTdHJpbmcgZm9udFN0cmV0Y2gpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RSRVRDSCksIGZvbnRTdHJldGNoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U3R5bGUoU3RyaW5nIGZvbnRTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSksIGZvbnRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFZhcmlhbnQoU3RyaW5nIGZvbnRWYXJpYW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpLCBmb250VmFyaWFudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFdlaWdodChTdHJpbmcgZm9udFdlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpLCBmb250V2VpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoU3RyaW5nIGhlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfSEVJR0hUKSwgaGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZWZ0KFN0cmluZyBsZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRUZUKSwgbGVmdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV0dGVyU3BhY2luZyhTdHJpbmcgbGV0dGVyU3BhY2luZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVUVEVSX1NQQUNJTkcpLCBsZXR0ZXJTcGFjaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5lSGVpZ2h0KFN0cmluZyBsaW5lSGVpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCksIGxpbmVIZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZShTdHJpbmcgbGlzdFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFKSwgbGlzdFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGVJbWFnZShTdHJpbmcgbGlzdFN0eWxlSW1hZ2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpLCBsaXN0U3R5bGVJbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlUG9zaXRpb24oU3RyaW5nIGxpc3RTdHlsZVBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKSwgbGlzdFN0eWxlUG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZVR5cGUoU3RyaW5nIGxpc3RTdHlsZVR5cGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSksIGxpc3RTdHlsZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpbihTdHJpbmcgbWFyZ2luKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU4pLCBtYXJnaW4pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpbkJvdHRvbShTdHJpbmcgbWFyZ2luQm90dG9tKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKSwgbWFyZ2luQm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5MZWZ0KFN0cmluZyBtYXJnaW5MZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCksIG1hcmdpbkxlZnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpblJpZ2h0KFN0cmluZyBtYXJnaW5SaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKSwgbWFyZ2luUmlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmdpblRvcChTdHJpbmcgbWFyZ2luVG9wKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKSwgbWFyZ2luVG9wKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJrZXJPZmZzZXQoU3RyaW5nIG1hcmtlck9mZnNldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS0VSX09GRlNFVCksIG1hcmtlck9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFya3MoU3RyaW5nIG1hcmtzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLUyksIG1hcmtzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXhIZWlnaHQoU3RyaW5nIG1heEhlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX0hFSUdIVCksIG1heEhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4V2lkdGgoU3RyaW5nIG1heFdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfV0lEVEgpLCBtYXhXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWluSGVpZ2h0KFN0cmluZyBtaW5IZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9IRUlHSFQpLCBtaW5IZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbldpZHRoKFN0cmluZyBtaW5XaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX1dJRFRIKSwgbWluV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9ycGhhbnMoU3RyaW5nIG9ycGhhbnMpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09SUEhBTlMpLCBvcnBoYW5zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lKFN0cmluZyBvdXRsaW5lKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FKSwgb3V0bGluZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZUNvbG9yKFN0cmluZyBvdXRsaW5lQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfQ09MT1IpLCBvdXRsaW5lQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVTdHlsZShTdHJpbmcgb3V0bGluZVN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1NUWUxFKSwgb3V0bGluZVN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lV2lkdGgoU3RyaW5nIG91dGxpbmVXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9XSURUSCksIG91dGxpbmVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcmZsb3coU3RyaW5nIG92ZXJmbG93KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVkVSRkxPVyksIG92ZXJmbG93KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nKFN0cmluZyBwYWRkaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HKSwgcGFkZGluZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ0JvdHRvbShTdHJpbmcgcGFkZGluZ0JvdHRvbSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pLCBwYWRkaW5nQm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nTGVmdChTdHJpbmcgcGFkZGluZ0xlZnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCksIHBhZGRpbmdMZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWRkaW5nUmlnaHQoU3RyaW5nIHBhZGRpbmdSaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCksIHBhZGRpbmdSaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ1RvcChTdHJpbmcgcGFkZGluZ1RvcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApLCBwYWRkaW5nVG9wKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlKFN0cmluZyBwYWdlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFKSwgcGFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUJyZWFrQWZ0ZXIoU3RyaW5nIHBhZ2VCcmVha0FmdGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0FGVEVSKSwgcGFnZUJyZWFrQWZ0ZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VCcmVha0JlZm9yZShTdHJpbmcgcGFnZUJyZWFrQmVmb3JlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0JFRk9SRSksIHBhZ2VCcmVha0JlZm9yZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZUJyZWFrSW5zaWRlKFN0cmluZyBwYWdlQnJlYWtJbnNpZGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfSU5TSURFKSwgcGFnZUJyZWFrSW5zaWRlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXVzZShTdHJpbmcgcGF1c2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFKSwgcGF1c2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdXNlQWZ0ZXIoU3RyaW5nIHBhdXNlQWZ0ZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0FGVEVSKSwgcGF1c2VBZnRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF1c2VCZWZvcmUoU3RyaW5nIHBhdXNlQmVmb3JlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9CRUZPUkUpLCBwYXVzZUJlZm9yZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGl0Y2goU3RyaW5nIHBpdGNoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSCksIHBpdGNoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaXRjaFJhbmdlKFN0cmluZyBwaXRjaFJhbmdlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSF9SQU5HRSksIHBpdGNoUmFuZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBsYXlEdXJpbmcoU3RyaW5nIHBsYXlEdXJpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BMQVlfRFVSSU5HKSwgcGxheUR1cmluZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zaXRpb24oU3RyaW5nIHBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QT1NJVElPTiksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZXMoU3RyaW5nIHF1b3RlcykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUVVPVEVTKSwgcXVvdGVzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWNobmVzcyhTdHJpbmcgcmljaG5lc3MpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJQ0hORVNTKSwgcmljaG5lc3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpZ2h0KFN0cmluZyByaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUklHSFQpLCByaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShTdHJpbmcgc2l6ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU0laRSksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWFrKFN0cmluZyBzcGVhaykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUspLCBzcGVhayk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlYWtIZWFkZXIoU3RyaW5nIHNwZWFrSGVhZGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19IRUFERVIpLCBzcGVha0hlYWRlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlYWtOdW1lcmFsKFN0cmluZyBzcGVha051bWVyYWwpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX05VTUVSQUwpLCBzcGVha051bWVyYWwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWFrUHVuY3R1YXRpb24oU3RyaW5nIHNwZWFrUHVuY3R1YXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX1BVTkNUVUFUSU9OKSwgc3BlYWtQdW5jdHVhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BlZWNoUmF0ZShTdHJpbmcgc3BlZWNoUmF0ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFRUNIX1JBVEUpLCBzcGVlY2hSYXRlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJlc3MoU3RyaW5nIHN0cmVzcykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1RSRVNTKSwgc3RyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZUxheW91dChTdHJpbmcgdGFibGVMYXlvdXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RBQkxFX0xBWU9VVCksIHRhYmxlTGF5b3V0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0QWxpZ24oU3RyaW5nIHRleHRBbGlnbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9BTElHTiksIHRleHRBbGlnbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dERlY29yYXRpb24oU3RyaW5nIHRleHREZWNvcmF0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0RFQ09SQVRJT04pLCB0ZXh0RGVjb3JhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dEluZGVudChTdHJpbmcgdGV4dEluZGVudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9JTkRFTlQpLCB0ZXh0SW5kZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0U2hhZG93KFN0cmluZyB0ZXh0U2hhZG93KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1NIQURPVyksIHRleHRTaGFkb3cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRUcmFuc2Zvcm0oU3RyaW5nIHRleHRUcmFuc2Zvcm0pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfVFJBTlNGT1JNKSwgdGV4dFRyYW5zZm9ybSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9wKFN0cmluZyB0b3ApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RPUCksIHRvcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pY29kZUJpZGkoU3RyaW5nIHVuaWNvZGVCaWRpKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9VTklDT0RFX0JJREkpLCB1bmljb2RlQmlkaSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVydGljYWxBbGlnbihTdHJpbmcgdmVydGljYWxBbGlnbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVkVSVElDQUxfQUxJR04pLCB2ZXJ0aWNhbEFsaWduKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmlsaXR5KFN0cmluZyB2aXNpYmlsaXR5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WSVNJQklMSVRZKSwgdmlzaWJpbGl0eSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vm9pY2VGYW1pbHkoU3RyaW5nIHZvaWNlRmFtaWx5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0lDRV9GQU1JTFkpLCB2b2ljZUZhbWlseSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vm9sdW1lKFN0cmluZyB2b2x1bWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPTFVNRSksIHZvbHVtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2hpdGVTcGFjZShTdHJpbmcgd2hpdGVTcGFjZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0hJVEVfU1BBQ0UpLCB3aGl0ZVNwYWNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWRvd3MoU3RyaW5nIHdpZG93cykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lET1dTKSwgd2lkb3dzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRFRIKSwgd2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmRTcGFjaW5nKFN0cmluZyB3b3JkU3BhY2luZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV09SRF9TUEFDSU5HKSwgd29yZFNwYWNpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFpJbmRleChTdHJpbmcgekluZGV4KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9aX0lOREVYKSwgekluZGV4KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwZGFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci0KLS8qKgotICogRm9yIGJvdHRvbSB2YWx1ZSBvZiAnY2xpcCcgcHJvcGVydHkncyByZWN0KCkgZnVuY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIENsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQob3JnLnczYy5kb20uY3NzLlJlY3QgcmVjdCkgewotCQlyZXR1cm4gcmVjdC5nZXRCb3R0b20oKS5nZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGluZGV4KCkgewotCQlyZXR1cm4gMjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b3AgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApKTsKLQkJU3RyaW5nIHJpZ2h0ID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpKTsKLQkJU3RyaW5nIGxlZnQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHRvcCwgcmlnaHQsIHZhbHVlLCBsZWZ0LCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwTGVmdFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MmI5OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLQotLyoqCi0gKiBGb3IgbGVmdCB2YWx1ZSBvZiAnY2xpcCcgcHJvcGVydHkncyByZWN0KCkgZnVuY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIENsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyIGV4dGVuZHMgQ2xpcFN1YlN0eWxlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChvcmcudzNjLmRvbS5jc3MuUmVjdCByZWN0KSB7Ci0JCXJldHVybiByZWN0LmdldExlZnQoKS5nZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGluZGV4KCkgewotCQlyZXR1cm4gMzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b3AgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApKTsKLQkJU3RyaW5nIHJpZ2h0ID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpKTsKLQkJU3RyaW5nIGJvdHRvbSA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSkpOwotCi0JCXNldChwcm9wZXJ0aWVzLCB0b3AsIHJpZ2h0LCBib3R0b20sIHZhbHVlLCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkMWUyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFJpZ2h0U3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLQotLyoqCi0gKiBGb3IgcmlnaHQgdmFsdWUgb2YgJ2NsaXAnIHByb3BlcnR5J3MgcmVjdCgpIGZ1bmN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChvcmcudzNjLmRvbS5jc3MuUmVjdCByZWN0KSB7Ci0JCXJldHVybiByZWN0LmdldFJpZ2h0KCkuZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBpbmRleCgpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgdG9wID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSk7Ci0JCVN0cmluZyBib3R0b20gPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQkJU3RyaW5nIGxlZnQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHRvcCwgdmFsdWUsIGJvdHRvbSwgbGVmdCwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlOTZiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLklWYWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJlY3Q7Ci0KLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgY2xpcCBzdWItcHJvcGVydGllcwotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ2xpcFN1YlN0eWxlQWRhcHRlciBpbXBsZW1lbnRzIElTdWJQcm9wZXJ0eUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBTdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJU3RyaW5nIHN0ciA9IG51bGw7Ci0JCU9iamVjdCBvYmogPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5jc3MuUmVjdCkgewotCQkJCXN0ciA9IGdldCgob3JnLnczYy5kb20uY3NzLlJlY3QpIG9iaik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBvYmopLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXN0ciA9IHN0ci50cmltKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpbnQgcG9zID0gc3RyLmluZGV4T2YoInJlY3QoIik7Ly8kTk9OLU5MUy0xJAotCQkJCWlmIChwb3MgPj0gMCkgewotCQkJCQlTdHJpbmcgc3ViU3RyID0gbnVsbDsKLQkJCQkJcG9zICs9IDU7Ci0JCQkJCWludCBpID0gMDsKLQkJCQkJZG8gewotCQkJCQkJaW50IHBvc0VuZCA9IHN0ci5pbmRleE9mKCIsIiwgcG9zKTsvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAocG9zRW5kIDwgMCkKLQkJCQkJCQlwb3NFbmQgPSBzdHIuaW5kZXhPZigiKSIsIHBvcyk7Ly8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHBvc0VuZCA8IDAgJiYgcG9zIDwgc3RyLmxlbmd0aCgpKQotCQkJCQkJCXBvc0VuZCA9IHN0ci5sZW5ndGgoKTsKLQkJCQkJCWlmIChwb3NFbmQgPj0gcG9zKSB7Ci0JCQkJCQkJc3ViU3RyID0gc3RyLnN1YnN0cmluZyhwb3MsIHBvc0VuZCk7Ci0JCQkJCQkJcG9zID0gcG9zRW5kICsgMTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlwb3MgPSAtMTsKLQkJCQkJfQotCQkJCQl3aGlsZSAoaSsrIDwgaW5kZXgoKSAmJiBwb3MgPiAwKTsKLQotCQkJCQlpZiAocG9zID4gMCkKLQkJCQkJCXN0ciA9IHN1YlN0ci50cmltKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXN0ciA9IG51bGw7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RyID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0KFJlY3QgcmVjdCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlhYnN0cmFjdCBpbnQgaW5kZXgoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgyMDAxLzEwLzA0Ci0JICogMTk6MjU6NDYpCi0JICogCi0JICogQHBhcmFtIHByb3BlcnRpZXMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uLklDU1MyUHJvcGVydGllcwotCSAqIEBwYXJhbSB0b3AKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmlnaHQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYm90dG9tCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGxlZnQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmVtb3ZlQ2hlY2sKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQl2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHRvcCwgU3RyaW5nIHJpZ2h0LCBTdHJpbmcgYm90dG9tLCBTdHJpbmcgbGVmdCwgYm9vbGVhbiByZW1vdmVDaGVjaykgewotCQlpZiAodG9wID09IG51bGwgfHwgdG9wLmxlbmd0aCgpID09IDApCi0JCQl0b3AgPSBJVmFsSUQuVl9BVVRPOwotCQlpZiAocmlnaHQgPT0gbnVsbCB8fCByaWdodC5sZW5ndGgoKSA9PSAwKQotCQkJcmlnaHQgPSBJVmFsSUQuVl9BVVRPOwotCQlpZiAoYm90dG9tID09IG51bGwgfHwgYm90dG9tLmxlbmd0aCgpID09IDApCi0JCQlib3R0b20gPSBJVmFsSUQuVl9BVVRPOwotCQlpZiAobGVmdCA9PSBudWxsIHx8IGxlZnQubGVuZ3RoKCkgPT0gMCkKLQkJCWxlZnQgPSBJVmFsSUQuVl9BVVRPOwotCi0JCWlmIChyZW1vdmVDaGVjayAmJiB0b3AudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQVVUTykgJiYgcmlnaHQudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQVVUTykgJiYgYm90dG9tLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0FVVE8pICYmIGxlZnQudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQVVUTykpIHsKLQkJCXByb3BlcnRpZXMuc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSwgbnVsbCk7Ci0JCX0KLQkJZWxzZQotCQkJcHJvcGVydGllcy5zZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApLCAicmVjdCgiICsgdG9wICsgIiwgIiArIHJpZ2h0ICsgIiwgIiArIGJvdHRvbSArICIsICIgKyBsZWZ0ICsgIikiKTsvLyROT04tTkxTLTUkLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwVG9wU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFRvcFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTVjMTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwVG9wU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLQotLyoqCi0gKiBGb3IgdG9wIHZhbHVlIG9mICdjbGlwJyBwcm9wZXJ0eSdzIHJlY3QoKSBmdW5jdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xpcFRvcFN1YlN0eWxlQWRhcHRlciBleHRlbmRzIENsaXBTdWJTdHlsZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBUb3BTdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChvcmcudzNjLmRvbS5jc3MuUmVjdCByZWN0KSB7Ci0JCXJldHVybiByZWN0LmdldFRvcCgpLmdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgaW5kZXgoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHJpZ2h0ID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpKTsKLQkJU3RyaW5nIGJvdHRvbSA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSkpOwotCQlTdHJpbmcgbGVmdCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0xFRlQpKTsKLQotCQlzZXQocHJvcGVydGllcywgdmFsdWUsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0ZvbnRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vRm9udFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4NDhlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vRm9udFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5JVmFsSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnZm9udCcgcHJvcGVydHkgJ2ZvbnQnIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsCi0gKiAnZm9udC1zdHlsZScsICdmb250LXZhcmlhbnQnLCAnZm9udC13ZWlnaHQnLCAnbGluZS1oZWlnaHQnLAotICovCi1wdWJsaWMgY2xhc3MgRm9udFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRm9udFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgc3R5bGUgPSBudWxsLCB2YXJpYW50ID0gbnVsbCwgd2VpZ2h0ID0gbnVsbCwgc2l6ZSA9IG51bGwsIGhlaWdodCA9IG51bGwsIGZhbWlseSA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BGb250ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BWYXJpYW50ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXZWlnaHQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU2l6ZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpOwotCQlib29sZWFuIGJOb3JtYWxTcGVjaWZpZWQgPSBmYWxzZTsKLQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJLy8gZmlyc3Qgb2YgYWxsLCBjaGVjayBmb250IGlkZW50cwotCQkJCWlmIChpID09IDApIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wRm9udC5nZXROdW1DaGlsZCgpOyBqKyspIHsKLQkJCQkJCU9iamVjdCBvYmogPSBwcm9wRm9udC5nZXRDaGlsZEF0KGkpOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZyAmJiB0b2tlbnNbaV0uaW1hZ2UuY29tcGFyZVRvSWdub3JlQ2FzZShvYmoudG9TdHJpbmcoKSkgPT0gMCkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gdmFsdWUgIm5vcm1hbCIgaXMgc2hhcmVkICEhCi0JCQkJaWYgKHRva2Vuc1tpXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX05PUk1BTCkpIHsKLQkJCQkJYk5vcm1hbFNwZWNpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wVmFyaWFudC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl2YXJpYW50ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wV2VpZ2h0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXdlaWdodCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFNpemUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCQlzaXplID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgJiYgd2VpZ2h0ID09IG51bGwgJiYgcHJvcFdlaWdodC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQl3ZWlnaHQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCXNpemUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCX0KLQkJfQotCi0JCWlmIChiTm9ybWFsU3BlY2lmaWVkKSB7Ci0JCQlpZiAoc3R5bGUgPT0gbnVsbCkKLQkJCQlzdHlsZSA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh2YXJpYW50ID09IG51bGwpCi0JCQkJdmFyaWFudCA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh3ZWlnaHQgPT0gbnVsbCkKLQkJCQl3ZWlnaHQgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCX0KLQotCQkvLyBza2lwIHdoaXRlc3BhY2UKLQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUykKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIGxpbmUtaGVpZ2h0ID8KLQkJaWYgKGkgPCB0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiB0b2tlbnNbaV0uaW1hZ2UuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCWhlaWdodCA9IHRva2Vuc1tpKytdLmltYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBmb250LWZhbWlseQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQl9Ci0JCWZhbWlseSA9IGJ1Zi50b1N0cmluZygpLnRyaW0oKTsKLQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUsIHN0eWxlKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQsIHZhcmlhbnQpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hULCB3ZWlnaHQpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSwgc2l6ZSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQsIGhlaWdodCk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFksIGZhbWlseSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBzdHlsZSA9IG51bGwsIHZhcmlhbnQgPSBudWxsLCB3ZWlnaHQgPSBudWxsLCBzaXplID0gbnVsbCwgaGVpZ2h0ID0gbnVsbCwgZmFtaWx5ID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEZvbnQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFZhcmlhbnQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdlaWdodCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTaXplID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BIZWlnaHQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wRmFtaWx5ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKTsKLQkJYm9vbGVhbiBiTm9ybWFsU3BlY2lmaWVkID0gZmFsc2U7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCS8vIGZpcnN0IG9mIGFsbCwgY2hlY2sgZm9udCBpZGVudHMKLQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcEZvbnQuZ2V0TnVtQ2hpbGQoKTsgaisrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gcHJvcEZvbnQuZ2V0Q2hpbGRBdChpKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcgJiYgdG9rZW5zW2ldLmltYWdlLmNvbXBhcmVUb0lnbm9yZUNhc2Uob2JqLnRvU3RyaW5nKCkpID09IDApCi0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gdmFsdWUgIm5vcm1hbCIgaXMgc2hhcmVkICEhCi0JCQkJaWYgKHRva2Vuc1tpXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX05PUk1BTCkpIHsKLQkJCQkJYk5vcm1hbFNwZWNpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wVmFyaWFudC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl2YXJpYW50ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQllbHNlIGlmIChwcm9wV2VpZ2h0LmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXdlaWdodCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFNpemUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCQlzaXplID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgJiYgd2VpZ2h0ID09IG51bGwgJiYgcHJvcFdlaWdodC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpIHsKLQkJCQl3ZWlnaHQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCXNpemUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJYnJlYWs7IC8vIGlmIHNpemUgZm91bmQsIGJyZWFrIGxvb3AKLQkJCX0KLQkJfQotCi0JCWlmIChiTm9ybWFsU3BlY2lmaWVkKSB7Ci0JCQlpZiAoc3R5bGUgPT0gbnVsbCkKLQkJCQlzdHlsZSA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh2YXJpYW50ID09IG51bGwpCi0JCQkJdmFyaWFudCA9IElWYWxJRC5WX05PUk1BTDsKLQkJCWlmICh3ZWlnaHQgPT0gbnVsbCkKLQkJCQl3ZWlnaHQgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCX0KLQotCQkvLyBza2lwIHdoaXRlc3BhY2UKLQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0b2tlbnNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUykKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIGxpbmUtaGVpZ2h0ID8KLQkJaWYgKGkgPCB0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiB0b2tlbnNbaV0uaW1hZ2UuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpKys7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJCWhlaWdodCA9IHRva2Vuc1tpKytdLmltYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBmb250LWZhbWlseQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQl9Ci0JCWZhbWlseSA9IGJ1Zi50b1N0cmluZygpLnRyaW0oKTsKLQotCQlpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wVmFyaWFudCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB2YXJpYW50OwotCQllbHNlIGlmIChwcm9wV2VpZ2h0ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdlaWdodDsKLQkJZWxzZSBpZiAocHJvcFNpemUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc2l6ZTsKLQkJZWxzZSBpZiAocHJvcEhlaWdodCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBoZWlnaHQ7Ci0JCWVsc2UgaWYgKHByb3BGYW1pbHkgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gZmFtaWx5OwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSUNTUzJQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSUNTUzJQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZjY0MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lDU1MyUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTUzJQcm9wZXJ0aWVzOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTUzJQcm9wZXJ0aWVzIGV4dGVuZHMgQ1NTMlByb3BlcnRpZXMgewotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhcHBseUZ1bGwoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFwcGx5TW9kaWZpZWQoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KFByb3BDTVByb3BlcnR5IHByb3ApOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvblgoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xpcEJvdHRvbSgpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldENsaXBMZWZ0KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xpcFJpZ2h0KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xpcFRvcCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc01vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvciBwcm9wZXJ0aWVzTW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVzZXRNb2RpZmllZCgpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXQoUHJvcENNUHJvcGVydHkgcHJvcCwgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRCYWNrZ3JvdW5kUG9zaXRpb25YKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvblkoU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0Q2xpcEJvdHRvbShTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwTGVmdChTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwUmlnaHQoU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0Q2xpcFRvcChTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkNDA1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSVNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU3ViUHJvcGVydHlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSVN1YlByb3BlcnR5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTY5ZjBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU3ViUHJvcGVydHlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdWJQcm9wZXJ0eUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcyk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0xpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9MaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTMyNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0xpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnbGlzdC1zdHlsZScgcHJvcGVydHkgJ2xpc3Qtc3R5bGUnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdsaXN0LXN0eWxlLWltYWdlJywgJ2xpc3Qtc3R5bGUtcG9zaXRpb24nLCAnbGlzdC1zdHlsZS10eXBlJywKLSAqLwotcHVibGljIGNsYXNzIExpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBpbWFnZSA9ICIiLCBwb3MgPSAiIiwgdHlwZSA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wVHlwZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSW1hZ2UgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIHsgLy8gdmFsdWU9Im5vbmUiIGlzIHNoYXJlZCAhIQotCQkJCQlpZiAocHJvcFR5cGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJdHlwZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJaWYgKHByb3BJbWFnZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wUG9zLmdldE5hbWUoKSwgcG9zKTsKLQkJZGVzdC5zZXQocHJvcFR5cGUuZ2V0TmFtZSgpLCB0eXBlKTsKLQkJZGVzdC5zZXQocHJvcEltYWdlLmdldE5hbWUoKSwgaW1hZ2UpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgaW1hZ2UgPSBudWxsLCBwb3MgPSBudWxsLCB0eXBlID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFBvcyA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFR5cGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEltYWdlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BQb3MuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSB7IC8vIHZhbHVlPSJub25lIiBpcyBzaGFyZWQgISEKLQkJCQkJaWYgKHByb3BUeXBlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXR5cGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWlmIChwcm9wSW1hZ2UuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BQb3MgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gcG9zOwotCQllbHNlIGlmIChwcm9wVHlwZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB0eXBlOwotCQllbHNlIGlmIChwcm9wSW1hZ2UgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gaW1hZ2U7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9NYXJnaW5TaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTWFyZ2luU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NmMWU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9NYXJnaW5TaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ21hcmdpbicgcHJvcGVydHkgJ21hcmdpbicgd2lsbCBiZSBleHBhbmRlZCB0byAnbWFyZ2luLXRvcCcsCi0gKiAnbWFyZ2luLXJpZ2h0JywgJ21hcmdpbi1ib3R0b20nLCAnbWFyZ2luLWxlZnQnLAotICovCi1wdWJsaWMgY2xhc3MgTWFyZ2luU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBNYXJnaW5TaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1AsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NLCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaiA9PSAxKQotCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCB8fCBwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZUKQotCQkJCXJldHVybiBpZGVudHNbM107Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vUGFkZGluZ1Nob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9QYWRkaW5nU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTI0MzZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9QYWRkaW5nU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdwYWRkaW5nJyBwcm9wZXJ0eSAncGFkZGluZycgd2lsbCBiZSBleHBhbmRlZCB0byAncGFkZGluZy10b3AnLAotICogJ3BhZGRpbmctcmlnaHQnLCAncGFkZGluZy1ib3R0b20nLCAncGFkZGluZy1sZWZ0JywKLSAqLwotcHVibGljIGNsYXNzIFBhZGRpbmdTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFBhZGRpbmdTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1AsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hULCBkZXN0c1sxXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00sIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaiA9PSAxKQotCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1AgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1ZhbHVlRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1ZhbHVlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTI4MmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9WYWx1ZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZURhdGEgewotCi0JcHVibGljIFN0cmluZyB2YWx1ZTsKLQlwdWJsaWMgYm9vbGVhbiBpbXBvcnRhbnQgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBWYWx1ZURhdGEoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFZhbHVlRGF0YShTdHJpbmcgdmFsLCBib29sZWFuIGltcCkgewotCQlzdXBlcigpOwotCQl2YWx1ZSA9IHZhbDsKLQkJaW1wb3J0YW50ID0gaW1wOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3RleHQvSUNTU1BhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdGV4dC9JQ1NTUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDZhZmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvdGV4dC9JQ1NTUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0OwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLiBJdCBkZWZpbmVzIHRoZQotICogcGFydGl0aW9uaW5nIGZvciBDU1MgYW5kIGFsbCBpdHMgcGFydGl0aW9ucy4gQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZQotICogcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTUGFydGl0aW9ucyB7Ci0KLQlTdHJpbmcgU1RZTEUgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5TVFlMRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODYyOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIKLQkJcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvdzNjL2RvbS9jc3MvKiovKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlLyoqIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvY29yZS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS91aS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC91aS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlQWRhcHRlckZhY3RvcnkiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5ncyIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9jb21wb25lbnRjb3JlL2ludGVybmFsL3V0aWwvSU1vZHVsZUNvbnN0YW50cyIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3V0aWwvZW1mL3dvcmtiZW5jaC9ubHMvRU1GV29ya2JlbmNoUmVzb3VyY2VIYW5kbGVyIiAvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIKLQkJcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iIC8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzdmOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWNzc2VkaXRvci5qYXIKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWRldi5wcm9wZXJ0aWVzCi1iaW4KLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmMGI1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjAzNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNzcy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTc0YzE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jV2VkIE1hciAyOCAwMzoyMDo0MSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5ODY0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNzcy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjQwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jc3MudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuYXV0b2VkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXQudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zZWxlY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5wcm9wZXJ0aWVzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjQwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjIuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy44LjEsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhYzk2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdjc3Nfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3Y3NzX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NGY3NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdjc3Nfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y3NzX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2Nzc193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjI4N2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y3NzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9hdXJhbF9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9hdXJhbF9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMTcwNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXVyYWxfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYm94bW9kZWxfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYm94bW9kZWxfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA1MGY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2JveG1vZGVsX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NoYXJzZXRfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jaGFyc2V0X3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTkzODQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NoYXJzZXRfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19zZWxlY3Rvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19zZWxlY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjRkN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfc2VsZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29sYmFja19wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jb2xiYWNrX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhMjMwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jb2xiYWNrX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NvbnRlbnRfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29udGVudF9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzNkZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29udGVudF9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHluYW1lLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eW5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGU1OGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eW5hbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfZnVuY3Rpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfZnVuY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2QxMmRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2Z1bmN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2lkZW50aWZpZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfaWRlbnRpZmllci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZGJkZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfaWRlbnRpZmllci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV91bml0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX3VuaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDhhM2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX3VuaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udF9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9mb250X3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhNWY4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9mb250X3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2ZvbnRmYWNlX3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udGZhY2VfcnVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZjU5ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udGZhY2VfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9pZF9zZWxlY3Rvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9pZF9zZWxlY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODU3ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvaWRfc2VsZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlua19ydWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfcnVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZDg5Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlua19ydWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfc2VsZWN0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlua19zZWxlY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NWI3OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlua19zZWxlY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9tZWRpYV9ydWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L21lZGlhX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzkxZjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L21lZGlhX3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3RoZXJfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3RoZXJfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjBjMjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L290aGVyX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BhZ2VfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjVmNjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BhZ2VfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlZG1lZGlhX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BhZ2VkbWVkaWFfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYzNWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BhZ2VkbWVkaWFfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHNldWRvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BzZXVkby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNmE2ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHNldWRvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzVkMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zdHlsZV9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3NmZmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zdHlsZV9ydWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3N0eWxlc2hlZXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVzaGVldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZmRlMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVzaGVldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZV9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZV9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYzc2Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGVfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWY4MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZ19zZWxlY3Rvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfc2VsZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTg1MGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZ19zZWxlY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0X3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RleHRfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmY2M2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RleHRfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdWlfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdWlfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWE4Yjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3VpX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3Vua25vd25fcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi91bmtub3duX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTdlNGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3Vua25vd25fcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi92aXN1YWxfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmlzdWFsX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhOGIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi92aXN1YWxfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2Nzc2ZpbGVfd2l6LnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdjc3NmaWxlX3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OGU2M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2Nzc2ZpbGVfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzOTg5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVNTRSBDU1MgU291cmNlIEVkaXRvcgotQ1NTX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lPUNTUyBFZGl0b3IKLUNTU19GaWxlcy5uYW1lPUNTUyBGaWxlcwotQ1NTX1NvdXJjZS5uYW1lPUVkaXRvcgotQ1NTX1N0eWxlcy5uYW1lPVN0eWxlcwotQ1NTX1RlbXBsYXRlcy5uYW1lPVRlbXBsYXRlcwotQ1NTX1N5bnRheF9Db2xvcmluZz1TeW50YXggQ29sb3JpbmcKLVdlYkNvbnRlbnRTZXR0aW5ncy5uYW1lPVdlYiBDb250ZW50IFNldHRpbmdzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZSBmb2xsb3dpbmcgcHJvcGVydHkga2V5cyBtYXliZSB1bnVzZWQuIENvbW1lbnRlZCBvdXQgb24gMTIvNy8yMDA0LiBVbmNvbW1lbnQgaWYgbmVlZGVkLgotI0NTU19Bbm5vdGF0aW9ucy5uYW1lPUNTUyBBbm5vdGF0aW9ucwotCi0KLSNvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIGV4dGVuc2lvbiBwb2ludAotX1VJX1dJWkFSRF9OQU1FID0gQ1NTCi1fVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBDYXNjYWRpbmcgU3R5bGUgU2hlZXQKLSMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIwotQ2xlYW51cERvY3VtZW50X2xhYmVsPUNsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLSMjCi1BbGxfQ1NTX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUFsbCBDU1MKLUNTU19OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9TmV3IENTUwotIyMKLXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcz1lZGl0b3IgY3NzIGNyZWF0aW5nIHNhdmluZyBmaWxlcyBzdWZmaXggc3BlY2lmaWVkIGVuY29kaW5nIGlhbmEKLXByZWZlcmVuY2VLZXl3b3Jkcy5zb3VyY2U9ZWRpdG9yIGNzcyBzb3VyY2UgZm9ybWF0dGluZyBsaW5lIHdpZHRoIGluc2VydCBicmVhayBwcm9wZXJ0aWVzIHdyYXBwaW5nIHN0eWxlIGF0dHJpYnV0ZSBodG1sIGluZGVudCB0YWJzIHNwYWNlcyBzaXplIGNhcGl0YWxpemF0aW9uIGlkZW50aWZpZXIgcHJvcGVydHkgbmFtZSB2YWx1ZSB1cHBlcmNhc2UgbG93ZXJjYXNlCi1wcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzPWVkaXRvciBjc3MgdGVtcGxhdGVzIHNuaXBwZXQgbWFjcm9zCi1wcmVmZXJlbmNlS2V5d29yZHMuc3R5bGVzPWVkaXRvciBjc3Mgc3R5bGUgY3VzdG9taXplIHN5bnRheCBoaWdobGlnaHRpbmcgdHlwZSB0ZXh0IGNvbnRlbnQgZm9yZWdyb3VuZCBiYWNrZ3JvdW5kIGJvbGQgY29sb3IKLXByZWZlcmVuY2VLZXl3b3Jkcy53ZWJjb250ZW50PWVkaXRvciBjc3Mgd2ViIGNvbnRlbnQgc2V0dGluZ3MgcHJvZmlsZSBzdHlsZQotCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmNzcy5uYW1lPUVkaXRpbmcgQ1NTIFNvdXJjZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5jc3MuZGVzY3JpcHRpb249RWRpdGluZyBDU1MgU291cmNlCi0KLUNvbG9ycy5hdG1hcmtSdWxlPUF0IE1hcmsgUnVsZQotQ29sb3JzLnNlbGVjdG9yPVNlbGVjdG9yCi1Db2xvcnMubWVkaWE9TWVkaWEKLUNvbG9ycy5jb21tZW50PUNvbW1lbnQKLUNvbG9ycy5wcm9wZXJ0eU5hbWU9UHJvcGVydHkgTmFtZQotQ29sb3JzLnByb3BlcnR5VmFsdWU9UHJvcGVydHkgVmFsdWUKLUNvbG9ycy51cmk9VVJJCi1Db2xvcnMuc3RyaW5nPVN0cmluZwotQ29sb3JzLmVycm9yPUVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDU3NmI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVDU1NfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQWN0aW9uQ29udHJpYnV0b3JDU1MiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUuQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLnByb3BlcnRpZXMuQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGV4dC5DU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzdHJ1Y3R1cmVkdGV4dGZvbGRpbmdwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24uU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJDU1MiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImF1dG9lZGl0c3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5hdXRvZWRpdC5TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5TVFlMRSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJlZmVyZW5jZXMuY3NzIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnN0eWxlcyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0iYWN0aXZlY29udGV4dHMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5jc3MubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuY3NzLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiPgotCQk8L2NvbnRleHQ+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MiPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmFubm90YXRpb25Nb2RlbENyZWF0aW9uIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVDU1NfRmlsZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy53ZWIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5DU1NGaWxlc1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJlZmVyZW5jZXMuY3NzIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmZpbGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVDU1NfU291cmNlLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcmVmZXJlbmNlcy5jc3MiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5DU1NTb3VyY2VQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcy5zb3VyY2UiPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuc291cmNlIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVDU1NfVGVtcGxhdGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS50ZW1wbGF0ZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUNTU19TeW50YXhfQ29sb3JpbmciCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTU3ludGF4Q29sb3JpbmdQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnN0eWxlcyI+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuc3R5bGVzIi8+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gQ1NTIENvbnRlbnQgU2V0dGluZ3MgUHJvcGVydHkgUGFnZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVXZWJDb250ZW50U2V0dGluZ3MubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5jc3MiPgotICAgICAgICAgCTxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgIAk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQkJPG9yPiAKLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPiAKLQkJCTwvZW5hYmxlZFdoZW4+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkud2ViY29udGVudCIvPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEtleXdvcmRzIGZvciBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmZpbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuZmlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnNvdXJjZSIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVtcGxhdGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zdHlsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5zdHlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLndlYmNvbnRlbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS53ZWJjb250ZW50Ii8+Ci0gICAgPC9leHRlbnNpb24+Ci0KLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiPjwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiPjwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGluaXRpYWxpemUgY3NzIHVpIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIE5ldyBDU1Mgd2l6YXJkIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQk8d2l6YXJkCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQuTmV3Q1NTV2l6YXJkIgotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkFNRSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZC5OZXdDU1NXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2Nzc193aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX1dJWkFSRF9DUkVBVEVfTkVXX0ZJTEU8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+Ci0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OmVkaXQ/YWZ0ZXI9YWRkaXRpb25zIj4KLQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmNvbnRlbnRBc3Npc3QucHJvcG9zYWxzIiBpZD0iQ1NTQ29udGVudEFzc2lzdCIgc3R5bGU9InB1c2giPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gVGVtcGxhdGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlQWxsX0NTU19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlQ1NTIgotCQkJaWQ9ImNzc19hbGwiPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVDU1NfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVDU1MiCi0JCQlpZD0iY3NzX25ldyI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxpbmNsdWRlCi0JCQlmaWxlPSJ0ZW1wbGF0ZXMvY3NzZGVmYXVsdC10ZW1wbGF0ZXMueG1sIgotCQkJdHJhbnNsYXRpb25zPSIkbmwkL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIj4KLQkJPC9pbmNsdWRlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLQkJPGhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmhhbmRsZXJzLkNsZWFudXBEb2N1bWVudEhhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJPGhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmhhbmRsZXJzLlN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIj4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIvPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIvPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCQk8aGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnMuU3RydWN0dXJlZFNlbGVjdE5leHRIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJPGhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmhhbmRsZXJzLlN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0hhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJPCEtLSBUT0RPIFVzZSB0aGUgaGFuZGxlciBmcm9tIFNTRSBvciBYTUwncyBkZWNsYXJhdGlvbiAtLT4KLQkJPGhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5SGFuZGxlciIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBDU1MgZWRpdG9yIGFjdGlvbnMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+Ci0JCTwhLS08ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UuZWRpdG9yQWN0aW9ucyIKLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aS5DbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdDU1NBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3ROZXh0Q1NTQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0NTU0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5Ij4KLQkJCTwvYWN0aW9uPgotCQk8L2VkaXRvckNvbnRyaWJ1dGlvbj4tLT4KLSAgICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIi8+Ci0JICAgICAgICAgICA8L2l0ZXJhdGU+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIERlZmluZSB0aGVtZSAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotCQk8dGhlbWUKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS5pZGUuc3lzdGVtRGVmYXVsdCI+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJBVE1BUktfUlVMRSIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9IlNFTEVDVE9SIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iTUVESUEiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJDT01NRU5UIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX1NFTEVDVElPTiI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJQUk9QRVJUWV9OQU1FIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iUFJPUEVSVFlfVkFMVUUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJVUkkiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJTVFJJTkciCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJFUlJPUiIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJPC90aGVtZT4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IkFUTUFSS19SVUxFIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5hdG1hcmtSdWxlIgotCQkJdmFsdWU9IjYzLCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iU0VMRUNUT1IiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLnNlbGVjdG9yIgotCQkJdmFsdWU9IjYzLCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iTUVESUEiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLm1lZGlhIgotCQkJdmFsdWU9IjQyLCAwLCAyMjUiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IkNPTU1FTlQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmNvbW1lbnQiCi0JCQl2YWx1ZT0iNjMsIDk1LCAxOTEiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IlBST1BFUlRZX05BTUUiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLnByb3BlcnR5TmFtZSIKLQkJCXZhbHVlPSIxMjcsIDAsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iUFJPUEVSVFlfVkFMVUUiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLnByb3BlcnR5VmFsdWUiCi0JCQl2YWx1ZT0iNDIsIDAsIDIyNSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iVVJJIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy51cmkiCi0JCQl2YWx1ZT0iNDIsIDAsIDIyNSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iU1RSSU5HIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5zdHJpbmciCi0JCQl2YWx1ZT0iNDIsIDAsIDIyNSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iRVJST1IiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmVycm9yIgotCQkJdmFsdWU9IjE5MSwgNjMsIDYzIj4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBFbmFibGUgdGhlIEZvcm1hdEhhbmRsZXIgZm9yIENTUyBDb250ZW50IFR5cGUgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotCQk8aGFuZGxlciAKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkZvcm1hdEhhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0Ij4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc0NvbnRlbnRUeXBlLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc0NvbnRlbnRUeXBlLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gU2V0IHVwIGEgZGVmaW5pdGlvbiBmb3IgQ1NTIENvbnRlbnQgVHlwZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc0NvbnRlbnRUeXBlLmRlZmluaXRpb24iPgotCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L2l0ZXJhdGU+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDcwOTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5NdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc291cmNlIHZpZXdlciB3aGljaCBzaG93cyBDU1MuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUyBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JDU1M7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MoKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElBdXRvRWRpdFN0cmF0ZWd5W10gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJTGlzdCBhbGxTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN1cGVyU3RyYXRlZ2llcyA9IHN1cGVyLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlclN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKHN1cGVyU3RyYXRlZ2llc1tpXSk7Ci0JCX0KLQotCQlyZXR1cm4gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbMF0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXXtJQ1NTUGFydGl0aW9ucy5TVFlMRSwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT059OwotCQl9Ci0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gbnVsbDsKLQotCQlpZiAoKHBhcnRpdGlvblR5cGUgPT0gSUNTU1BhcnRpdGlvbnMuU1RZTEUpIHx8IChwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTikpIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCUlDb250ZW50Rm9ybWF0dGVyIGZvcm1hdHRlciA9IHN1cGVyLmdldENvbnRlbnRGb3JtYXR0ZXIoc291cmNlVmlld2VyKTsKLQkJLy8gc3VwZXIgd2FzIHVuYWJsZSB0byBjcmVhdGUgYSBmb3JtYXR0ZXIsIHByb2JhYmx5IGJlY2F1c2UKLQkJLy8gc291cmNlVmlld2VyIGRvZXMgbm90IGhhdmUgZG9jdW1lbnQgc2V0IHlldCwgc28ganVzdCBjcmVhdGUgYQotCQkvLyBnZW5lcmljIG9uZQotCQlpZiAoIShmb3JtYXR0ZXIgaW5zdGFuY2VvZiBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSkKLQkJCWZvcm1hdHRlciA9IG5ldyBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpLCBJQ1NTUGFydGl0aW9ucy5TVFlMRSk7Ci0KLQkJKChNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSBmb3JtYXR0ZXIpLnNldE1hc3RlclN0cmF0ZWd5KG5ldyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5KG5ldyBGb3JtYXRQcm9jZXNzb3JDU1MoKSkpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEluZGVudFByZWZpeGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJVmVjdG9yIHZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQotCQkvLyBwcmVmaXhbMF0gaXMgZWl0aGVyICdcdCcgb3IgJyAnIHggdGFiV2lkdGgsIGRlcGVuZGluZyBvbiBwcmVmZXJlbmNlCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCWJvb2xlYW4gdXNlU3BhY2VzID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMoaW5kZW50Q2hhclByZWYpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJU3RyaW5nQnVmZmVyIHByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYXBwZW5kVGFiID0gZmFsc2U7Ci0KLQkJCWlmICh1c2VTcGFjZXMpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiArIGkgPCBpbmRlbnRhdGlvbldpZHRoOyBqKyspCi0JCQkJCXByZWZpeC5hcHBlbmQoJyAnKTsKLQotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFRhYiA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCi0JCQkJaWYgKGkgIT0gaW5kZW50YXRpb25XaWR0aCkKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGFwcGVuZFRhYikgewotCQkJCXByZWZpeC5hcHBlbmQoJ1x0Jyk7Ci0JCQkJdmVjdG9yLmFkZChwcmVmaXgudG9TdHJpbmcoKSk7Ci0JCQkJLy8gcmVtb3ZlIHRoZSB0YWIgc28gdGhhdCBpbmRlbnRhdGlvbiAtIHRhYiBpcyBhbHNvIGFuIGluZGVudAotCQkJCS8vIHByZWZpeAotCQkJCXByZWZpeC5kZWxldGVDaGFyQXQocHJlZml4Lmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCQl2ZWN0b3IuYWRkKHByZWZpeC50b1N0cmluZygpKTsKLQkJfQotCi0JCXZlY3Rvci5hZGQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChTdHJpbmdbXSkgdmVjdG9yLnRvQXJyYXkobmV3IFN0cmluZ1t2ZWN0b3Iuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlMaW5lU3R5bGVQcm92aWRlcltdIHByb3ZpZGVycyA9IG51bGw7Ci0KLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUNTU1BhcnRpdGlvbnMuU1RZTEUpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTKCl9OwotCQl9Ci0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckNTUyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckNTUygpOwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJGb3JDU1M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0FjdGlvbkNvbnRyaWJ1dG9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQWN0aW9uQ29udHJpYnV0b3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiNDVhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQWN0aW9uQ29udHJpYnV0b3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXRhcmdldFRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLQotLyoqCi0gKiBBY3Rpb25Db250cmlidXRvckNTUwotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvckNTUyBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSIsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ29udGVudEFzc2lzdCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ2xlYW51cERvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGb3JtYXREb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmRm9ybWF0QWN0aXZlRWxlbWVudHMgPSBudWxsOwotCi0JcHVibGljIEFjdGlvbkNvbnRyaWJ1dG9yQ1NTKCkgewotCQlzdXBlcigpOwotCi0JCVJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gQ1NTVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCi0JCS8vIGVkaXQgY29tbWFuZHMKLQkJZkNvbnRlbnRBc3Npc3QgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkNvbnRlbnRBc3Npc3Quc2V0QWN0aW9uRGVmaW5pdGlvbklkKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5DT05URU5UX0FTU0lTVF9QUk9QT1NBTFMpOwotCi0JCS8vIHNvdXJjZSBjb21tYW5kcwotCQlmQ2xlYW51cERvY3VtZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZDbGVhbnVwRG9jdW1lbnQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuQ0xFQU5VUF9ET0NVTUVOVCk7Ci0KLQkJZkZvcm1hdERvY3VtZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZGb3JtYXREb2N1bWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVRfRE9DVU1FTlQpOwotCi0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cyA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuRk9STUFUX0FDVElWRV9FTEVNRU5UUyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGVkaXQgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIGVkaXRNZW51ID0gbWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0JCWlmIChlZGl0TWVudSAhPSBudWxsKSB7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmRXhwYW5kU2VsZWN0aW9uVG9NZW51KTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZDb250ZW50QXNzaXN0KTsKLQkJCWVkaXRNZW51LmFkZChmTWVudUFkZGl0aW9uc0dyb3VwTWFya2VyKTsKLQkJfQotCi0JCS8vIHNvdXJjZSBjb21tYW5kcwotCQlTdHJpbmcgc291cmNlTWVudUxhYmVsID0gQ1NTVUlNZXNzYWdlcy5Tb3VyY2VNZW51X2xhYmVsOwotCQlTdHJpbmcgc291cmNlTWVudUlkID0gInNvdXJjZU1lbnVJZCI7IC8vJE5PTi1OTFMtMSQKLQkJSU1lbnVNYW5hZ2VyIHNvdXJjZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoc291cmNlTWVudUxhYmVsLCBzb3VyY2VNZW51SWQpOwotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULCBzb3VyY2VNZW51KTsKLQkJaWYgKHNvdXJjZU1lbnUgIT0gbnVsbCkgewotCQkJc291cmNlTWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdFJpZ2h0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdExlZnQpOwotCQkJc291cmNlTWVudS5hZGQoZkNsZWFudXBEb2N1bWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmRm9ybWF0RG9jdW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZkZvcm1hdEFjdGl2ZUVsZW1lbnRzKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCX0KLQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudSA9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKLQkJaWYgKG5hdmlnYXRlTWVudSAhPSBudWxsKSB7Ci0JCQlJTWVudU1hbmFnZXIgZ290b0dyb3VwID0gbmF2aWdhdGVNZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR09fVE8pOwotCQkJaWYgKGdvdG9Hcm91cCAhPSBudWxsKSB7Ci0JCQkJZ290b0dyb3VwLmFkZChmR290b01hdGNoaW5nQnJhY2tldEFjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0KLQkJZkNvbnRlbnRBc3Npc3Quc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUykpOwotCi0JCWZDbGVhbnVwRG9jdW1lbnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DTEVBTlVQX0RPQ1VNRU5UKSk7Ci0JCWZGb3JtYXREb2N1bWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCkpOwotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKSk7Ci0JCWZDbGVhbnVwRG9jdW1lbnQuc2V0RW5hYmxlZCh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCQlmRm9ybWF0RG9jdW1lbnQuc2V0RW5hYmxlZCh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0RW5hYmxlZCh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1Nzc2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDU1NVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDU1NVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElORk9fTm90X0NhdGVnb3JpemVkXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9XcmFwcGluZ1dpdGhvdXRBdHRyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfV3JhcHBpbmdJbnNlcnRMaW5lQnJlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlR3JvdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlSWRlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUlkZW50VXBwZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlSWRlbnRMb3dlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX1NlbGVjdG9yVGFnTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZVVwcGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BOYW1lTG93ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlVXBwZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlTG93ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWVVcHBlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX1NlbGVjdG9yVGFnTmFtZUxvd2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JTYW1wbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvck5vcm1hbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQXRtYXJrUnVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU2VsZWN0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvck1lZGlhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JDb21tZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclByb3BlcnR5VmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclVyaTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU3RyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JDb2xvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU2VtaUNvbG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JDdXJseUJyYWNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0QWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfQ1NTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaXRsZV9JbnZhbGlkVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZV9JbnZhbGlkVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0TWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1NTX0NsZWFudXBfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkZW50aWZpZXJfY2FzZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5X25hbWVfY2FzZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5X3ZhbHVlX2Nhc2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3Rvcl90YWdfbmFtZV9jYXNlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVvdGVfdmFsdWVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRfc291cmNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBc19pc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG93ZXJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwcGVyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdHRpbmdfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpbmVfd2lkdGhfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRfdXNpbmdfdGFic187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50X3VzaW5nX3NwYWNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudGF0aW9uX3NpemVfdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzX2VuY29kaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlR3JvdXBfbmFtZUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2VmOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkNTU1VJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1M7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MudWkiOyAvLyROT04tTkxTLTEkCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENTU1VJUGx1Z2luIHBsdWdpbjsJCi0JCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgY3NzIHVpLgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIGNzcyB1aS4KLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENTU1VJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENTU1VJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgY3NzIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBjc3MgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLCBDU1NVSVByZWZlcmVuY2VOYW1lcy5URU1QTEFURVNfS0VZKTsKLQotCQkJdHJ5IHsKLQkJCQlmVGVtcGxhdGVTdG9yZS5sb2FkKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgY3NzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBjc3MgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuQUxMKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuTkVXKTsKLQotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJfQotCi0JCXJldHVybiBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzRiYjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotSU5GT19Ob3RfQ2F0ZWdvcml6ZWRfMT1Ob3QgQ2F0ZWdvcml6ZWQKLQotIyMgQ1NTIFByZWZlcmVuY2VzIC0tIHNvdXJjZSAjIwotUHJlZnNMYWJlbF9XcmFwcGluZ1dpdGhvdXRBdHRyPURpc2FibGUgd3JhcHBpbmcgaW4gc3R5bGUgJmF0dHJpYnV0ZSBvZiBIVE1MCi1QcmVmc0xhYmVsX1dyYXBwaW5nSW5zZXJ0TGluZUJyZWFrPUluc2VydCAmbGluZSBicmVhayBiZXR3ZWVuIHByb3BlcnRpZXMKLQotUHJlZnNMYWJlbF9DYXNlR3JvdXA9Q2FwaXRhbGl6YXRpb24gc3R5bGUKLVByZWZzTGFiZWxfQ2FzZUlkZW50PUlkZW50aWZpZXI6Ci1QcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZT1Qcm9wZXJ0eSBuYW1lOgotUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlPVByb3BlcnR5IHZhbHVlOgotUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWU9U2VsZWN0b3IgdGFnIG5hbWU6Ci0KLVByZWZzTGFiZWxfQ2FzZUlkZW50VXBwZXI9JlVwcGVyY2FzZQotUHJlZnNMYWJlbF9DYXNlSWRlbnRMb3dlcj1MJm93ZXJjYXNlCi1QcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZVVwcGVyPVUmcHBlcmNhc2UKLVByZWZzTGFiZWxfQ2FzZVByb3BOYW1lTG93ZXI9TG8md2VyY2FzZQotUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlVXBwZXI9VXBwJmVyY2FzZQotUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlTG93ZXI9TG93ZSZyY2FzZQotUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWVVcHBlcj1VcHBlciZjYXNlCi1QcmVmc0xhYmVsX1NlbGVjdG9yVGFnTmFtZUxvd2VyPUxvd2VyY2Emc2UKLQotIyMgQ1NTIFByZWZlcmVuY2VzIC0tIGNvbG9yICMjCi0KLSMjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhIHNhbXBsZSBDU1MgZG9jdW1lbnQuICBQbGVhc2UgdHJhbnNsYXRlIG9ubHkgdGhlIGZvbGxvd2luZyBwYXJ0czoKLSMjIFNhbXBsZSBTdHlsZXMKLVByZWZzTGFiZWxfQ29sb3JTYW1wbGU9QGltcG9ydCB1cmwoIi4uL3NhbXBsZTIuY3NzIik7XG5cbi8qIFNhbXBsZSBTdHlsZXMgKi9cblxuQk9EWSB7XG5cdGNvbG9yIDogYmxhY2s7XG5cdGJhY2tncm91bmQtY29sb3IgOiByZ2IoMTgxLCAyNTMsIDIxMSk7XG5cdHRleHQtYWxpZ24gOiBjZW50ZXI7XG5cdGZvbnQtZmFtaWx5IDogIkhlaXNlaSBNaW5jaG8gVzMiLCBzZXJpZlxufVxuXG5AcGFnZSA6bGVmdCB7IG1hcmdpbi1sZWZ0IDogNGNtIH1cblxuQG1lZGlhIGF1cmFsIHtcblx0UC5oZWlkaSB7XG5cdFx0YXppbXV0aCA6IGNlbnRlci1sZWZ0O1xuXHRcdGVsZXZhdGlvbiA6IDEyLjNkZWc7XG5cdFx0cGF1c2UgOiAzMG1zIDEuNnNcblx0fVxufVxuCi0KLVByZWZzTGFiZWxfQ29sb3JOb3JtYWw9RGVmYXVsdAotUHJlZnNMYWJlbF9Db2xvckF0bWFya1J1bGU9QXQtUnVsZQotUHJlZnNMYWJlbF9Db2xvclNlbGVjdG9yPVNlbGVjdG9yCi1QcmVmc0xhYmVsX0NvbG9yTWVkaWE9TWVkaWEgTmFtZQotUHJlZnNMYWJlbF9Db2xvckNvbW1lbnQ9Q29tbWVudAotUHJlZnNMYWJlbF9Db2xvclByb3BlcnR5TmFtZT1Qcm9wZXJ0eSBOYW1lCi1QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlWYWx1ZT1Qcm9wZXJ0eSBWYWx1ZQotUHJlZnNMYWJlbF9Db2xvclVyaT1VUkkKLVByZWZzTGFiZWxfQ29sb3JTdHJpbmc9UXVvdGVkIFN0cmluZwotUHJlZnNMYWJlbF9Db2xvckNvbG9uPVByb3BlcnR5IERlbGltaXRlcgotUHJlZnNMYWJlbF9Db2xvclNlbWlDb2xvbj1TZW1pQ29sb24KLVByZWZzTGFiZWxfQ29sb3JDdXJseUJyYWNlPUN1cmx5IEJyYWNlCi1QcmVmc0xhYmVsX0NvbG9yRXJyb3I9RXJyb3IKLSMKLVNvcnRBY3Rpb25fMD1Tb3J0Ci0jCi1fVUlfV0laQVJEX05FV19USVRMRSA9IE5ldyBDYXNjYWRpbmcgU3R5bGUgU2hlZXQKLV9VSV9XSVpBUkRfTkVXX0hFQURJTkcgPSBDYXNjYWRpbmcgU3R5bGUgU2hlZXQKLV9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OID0gQ3JlYXRlIGEgbmV3IENTUyBmaWxlLgotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0NTUyA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uCi1fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQgPSBGaWxlcyBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIFdlYiBDb250ZW50IGZvbGRlciB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB5b3VyIGRlcGxveWVkIFdlYiBhcHBsaWNhdGlvbi4gCi0jCi1UaXRsZV9JbnZhbGlkVmFsdWU9SW52YWxpZCBWYWx1ZQotTWVzc2FnZV9JbnZhbGlkVmFsdWU9SW52YWxpZCBwcm9wZXJ0eSB2YWx1ZS4KLSMgQ29waWVkIGZyb20gc3NlLnVpCi1Gb3JtYXRNZW51X2xhYmVsPUYmb3JtYXQKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DJmxlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLVVJX25vbmU9bm9uZQotQ2xlYW51cF9VSV89Q2xlYW51cAotQ1NTX0NsZWFudXBfVUlfPUNTUyBDbGVhbnVwCi1JZGVudGlmaWVyX2Nhc2VfX1VJXz1JZGVudGlmaWVyIGNhc2U6Ci1Qcm9wZXJ0eV9uYW1lX2Nhc2VfX1VJXz1Qcm9wZXJ0eSBuYW1lIGNhc2U6Ci1Qcm9wZXJ0eV92YWx1ZV9jYXNlX19VSV89UHJvcGVydHkgdmFsdWUgY2FzZToKLVNlbGVjdG9yX3RhZ19uYW1lX2Nhc2VfX1VJXz1TZWxlY3RvciB0YWcgbmFtZSBjYXNlOgotUXVvdGVfdmFsdWVzX1VJXz1RdW90ZSB2YWx1ZXMKLUZvcm1hdF9zb3VyY2VfVUlfPSZGb3JtYXQgc291cmNlCi1Bc19pc19VSV89QXMtaXMKLUxvd2VyX1VJXz1Mb3dlcgotVXBwZXJfVUlfPVVwcGVyCi1Tb3VyY2VNZW51X2xhYmVsPSZTb3VyY2UKLUZvcm1hdHRpbmdfVUlfPUZvcm1hdHRpbmcKLUxpbmVfd2lkdGhfX1VJXz1MaW5lICZ3aWR0aDoKLUluZGVudF91c2luZ190YWJzXz0mSW5kZW50IHVzaW5nIHRhYnMKLUluZGVudF91c2luZ19zcGFjZXM9SSZuZGVudCB1c2luZyBzcGFjZXMKLUluZGVudGF0aW9uX3NpemU9SW4mZGVudGF0aW9uIHNpemU6Ci1JbmRlbnRhdGlvbl9zaXplX3RpcD1JbmRlbnRhdGlvbiBzaXplCi1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw9JkVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9Jk5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9JlByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi0jIwotQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc9Q3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgcHJlZmVyZW5jZQotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgQ1NTIFRlbXBsYXRlCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBDU1MgcGFnZS4KLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgQ1NTIFRlbXBsYXRlCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzU9UHJldmlldzoKLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgQ1NTJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkNTUyBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KLSMgQ1NTIENvbnRlbnQgU2V0dGluZ3MKLUNTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPVRoZSB0eXBlIG9mIENTUyB0byB1c2UuICBUaGUgcHJvamVjdCBzZXR0aW5nIGlzIHVzZWQgaWYgeW91IHNwZWNpZnkgIm5vbmUuIgotQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzE9Q1NTIFByb2ZpbGU6Ci1TeW50YXhDb2xvcmluZ1BhZ2VfMD1TeW50YXggRWxlbWVudDoKLVN5bnRheENvbG9yaW5nUGFnZV8yPUVuYWJsZQotU3ludGF4Q29sb3JpbmdQYWdlXzM9JkJvbGQKLVN5bnRheENvbG9yaW5nUGFnZV80PSZJdGFsaWMKLVN5bnRheENvbG9yaW5nUGFnZV81PSZTdHJpa2V0aHJvdWdoCi1TeW50YXhDb2xvcmluZ1BhZ2VfNj0mVW5kZXJsaW5lCi1fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LPUNTUyBlZGl0aW5nIHByZWZlcmVuY2VzLiAgTm90ZSB0aGF0IHNvbWUgcHJlZmVyZW5jZXMgbWF5IGJlIHNldCBvbiB0aGUgPGE+ezB9PC9hPiBwcmVmZXJlbmNlIHBhZ2UuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZWJhNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MudWkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5Q1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWIwY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5Q1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCi0JY2xhc3MgQ29tcG91bmRSZWdpb24gewotCi0JCUNvbXBvdW5kUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb247Ci0JCQl0aGlzLnRleHRSZWdpb24gPSB0ZXh0UmVnaW9uOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJCXJldHVybiBkb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIGdldFRleHRSZWdpb24oKSB7Ci0JCQlyZXR1cm4gdGV4dFJlZ2lvbjsKLQkJfQotCi0JCWludCBnZXRTdGFydCgpIHsKLQkJCXJldHVybiB0ZXh0UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCX0KLQotCQlpbnQgZ2V0RW5kKCkgewotCQkJcmV0dXJuIHRleHRSZWdpb24uZ2V0RW5kKCk7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiB0ZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJfQotCi0JCVN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuIGRvY3VtZW50UmVnaW9uLmdldFRleHQodGV4dFJlZ2lvbik7Ci0JCX0KLQotCQlpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCQlyZXR1cm4gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGV4dFJlZ2lvbik7Ci0JCX0KLQotCQlpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQkJcmV0dXJuIGRvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCh0ZXh0UmVnaW9uKTsKLQkJfQotCi0JCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbjsKLQkJcHJpdmF0ZSBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uOwotCi0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXV0b0luZGVudEFmdGVyQ2xvc2UoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWlmICghc2V0UmFuZ2VGb3JDbG9zZShjb21tYW5kKSkKLQkJCXJldHVybjsKLQotCQlpbnQgcG9zaXRpb24gPSBjb21tYW5kLm9mZnNldCArIGNvbW1hbmQubGVuZ3RoOwotCi0JCWlmIChwb3NpdGlvbiA9PSAtMSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZ2V0IG9wZW4gYnJhY2UgcmVnaW9uCi0JCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbiA9IHByZXZDb3JyZXNwb25kZW5jZShwb3NpdGlvbiwgcmVnaW9uVHlwZSk7Ci0KLQkJLy8gZ2V0IGluZGVudGF0aW9uCi0JCVN0cmluZyBzdHIgPSBnZXRJbmRlbnRGb3IocmVnaW9uLCBmYWxzZSk7Ci0KLQkJLy8gYXBwZW5kIHRvIGlucHV0Ci0JCWlmIChzdHIgIT0gbnVsbCkKLQkJCWNvbW1hbmQudGV4dCA9IHN0ciArIGNvbW1hbmQudGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBwcmV2aW91cyBsaW5lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF1dG9JbmRlbnRBZnRlck5ld0xpbmUoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gc2VsZWN0IG5lYXJlc3Qgd2hpdGUgc3BhY2VzIHRvIHJlcGxhY2Ugd2l0aCBuZXctbGluZQotCQlzZXRSYW5nZUZvck5ld0xpbmUoY29tbWFuZCk7Ci0KLQkJLy8gZ2V0IHBvc2l0aW9uCi0JCWludCBwb3NpdGlvbiA9IGNvbW1hbmQub2Zmc2V0OwotCi0JCWlmIChwb3NpdGlvbiA9PSAtMSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZ2V0IGN1cnJlbnQgcmVnaW9uCi0JCUNvbXBvdW5kUmVnaW9uIGN1cnJlbnRSZWdpb24gPSBnZXRSZWdpb24oY29tbWFuZC5vZmZzZXQgKyBjb21tYW5kLmxlbmd0aCk7Ci0KLQkJLy8gZ2V0IGtleSByZWdpb24KLQkJQ29tcG91bmRSZWdpb24ga2V5UmVnaW9uID0gZ2V0UHJldktleVJlZ2lvbihwb3NpdGlvbiwgY3VycmVudFJlZ2lvbik7Ci0KLQkJLy8gZ2V0IGluZGVudCBzdHJpbmcKLQkJU3RyaW5nIHN0ciA9IGdldEluZGVudEZvcihrZXlSZWdpb24sIHRydWUpOwotCi0JCS8vIGNoZWNrIGFub3RoZXIgaW5kZW50YXRpb24KLQkJaW50IHNoaWZ0ID0gbmVlZFNoaWZ0KGtleVJlZ2lvbiwgY29tbWFuZC5vZmZzZXQgKyBjb21tYW5kLmxlbmd0aCk7Ci0KLQkJLy8gY3JlYXRlIHRleHQgdG8gcmVwbGFjZQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihjb21tYW5kLnRleHQpOwotCQlpZiAoc3RyICE9IG51bGwpCi0JCQlidWYuYXBwZW5kKHN0cik7Ci0JCXdoaWxlIChzaGlmdC0tICE9IDApCi0JCQlidWYuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJY29tbWFuZC50ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlPYmplY3QgdGV4dEVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKCEodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKQotCQkJcmV0dXJuOwotCi0JCS8vIHJldHVybjsKLQkJLy8gLyoKLQkJc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCi0JCWlmIChjb21tYW5kLmxlbmd0aCA9PSAwICYmIGNvbW1hbmQudGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoZW5kc1dpdGgoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBjb21tYW5kLnRleHQpICE9IC0xKSB7Ci0JCQkJYXV0b0luZGVudEFmdGVyTmV3TGluZShjb21tYW5kKTsKLQkJCX0gZWxzZSBpZiAoY29tbWFuZC50ZXh0LmVxdWFscygifSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCWF1dG9JbmRlbnRBZnRlckNsb3NlKGNvbW1hbmQsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpOwotCQkJfSBlbHNlIGlmIChjb21tYW5kLnRleHQuZXF1YWxzKCJdIikpIHsvLyROT04tTkxTLTEkCi0JCQkJYXV0b0luZGVudEFmdGVyQ2xvc2UoY29tbWFuZCwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOwotCQkJfSBlbHNlIGlmIChjb21tYW5kLnRleHQuZXF1YWxzKCIpIikpIHsvLyROT04tTkxTLTEkCi0JCQkJYXV0b0luZGVudEFmdGVyQ2xvc2UoY29tbWFuZCwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKTsKLQkJCX0KLQkJfQotCQkvLyAqLwotCQkKLQkJLy8gc3BhY2VzIGZvciB0YWIgY2hhcmFjdGVyCi0JCWlmIChjb21tYW5kLnRleHQgIT0gbnVsbCAmJiBjb21tYW5kLnRleHQubGVuZ3RoKCkgPiAwICYmIGNvbW1hbmQudGV4dC5jaGFyQXQoMCkgPT0gJ1x0JykKLQkJCXNtYXJ0SW5zZXJ0Rm9yVGFiKGNvbW1hbmQsIGRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZGVudEZvcihDb21wb3VuZFJlZ2lvbiByZWdpb24sIGJvb2xlYW4gaW5kZW50Rm9yTmV4dFJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHJlZ2lvbi5nZXREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkvLyBnZXQgbWVhbmZ1bCBmbGF0IG5vZGUKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJaXQucHJldigpOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gciA9IGl0LnByZXYoKTsKLQkJCQkJcmVnaW9uID0gbmV3IENvbXBvdW5kUmVnaW9uKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCByKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZmxhdE5vZGUgPSByZWdpb24uZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCQkvLyBnZXQgaW5kZW50IHN0cmluZwotCQkJCWludCBwb3NpdGlvbiA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJaW50IGxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCQlpbnQgZW5kID0gZmluZEVuZE9mV2hpdGVTcGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0LCBwb3NpdGlvbik7Ci0JCQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCX0gZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIHx8Ci0JCQkvLyByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQVJFTlRIRVNJU19PUEVOIHx8Ci0JCQkJCQlyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlpbnQgcG9zaXRpb24gPSBmbGF0Tm9kZS5nZXRTdGFydCgpICsgcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJaW50IGxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCQlpbnQgZW5kID0gZmluZEVuZE9mV2hpdGVTcGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0LCBwb3NpdGlvbik7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RydWN0dXJlZERvY3VtZW50LmdldChzdGFydCwgZW5kIC0gc3RhcnQpKTsKLQkJCQlwb3NpdGlvbiArPSByZWdpb24uZ2V0VGV4dCgpLmxlbmd0aCgpOwotCQkJCWlmIChpbmRlbnRGb3JOZXh0UmVnaW9uKSB7Ci0JCQkJCWludCB0b2tlblN0YXJ0ID0gZmluZEVuZE9mV2hpdGVTcGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uLCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKSArIHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lTGVuZ3RoKGxpbmUpIC0gMSk7Ci0JCQkJCWlmICh0b2tlblN0YXJ0IDwgc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSkgKyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZUxlbmd0aChsaW5lKSAtIDEpIHsKLQkJCQkJCXBvc2l0aW9uID0gdG9rZW5TdGFydDsKLQkJCQkJfQotCQkJCX0KLQkJCQl3aGlsZSAocG9zaXRpb24gLSBlbmQgPiAwKSB7Ci0JCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQkJCWVuZCsrOwotCQkJCX0KLQkJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNwKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y3ApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbiBnZXRQcmV2S2V5UmVnaW9uKGludCBwb3NpdGlvbiwgQ29tcG91bmRSZWdpb24gY3VycmVudFJlZ2lvbikgewotCQlpZiAoY3VycmVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGN1cnJlbnRSZWdpb24gIT0gbnVsbCAmJiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gcHJldkNvcnJlc3BvbmRlbmNlKGN1cnJlbnRSZWdpb24pOwotCQl9Ci0KLQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3NpdGlvbiAtIDEpOwotCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gaXQucHJldigpOwotCQkJQ29tcG91bmRSZWdpb24gcmVnaW9uID0gbmV3IENvbXBvdW5kUmVnaW9uKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCByKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fAotCQkJCQkJcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIHx8Ci0JCQkJCQkvLyByZWdpb24uZ2V0VHlwZSgpID09Ci0JCQkJCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfQlJBQ0tFVF9DTE9TRSB8fAotCQkJCQkJLy8gLy8gcmVnaW9uLmdldFR5cGUoKSA9PQotCQkJCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBUkVOVEhFU0lTX09QRU4gfHwKLQkJCQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0KLQkJCQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQVJFTlRIRVNJU19DTE9TRSB8fAotCQkJCQkJcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fAotCQkJCQkJLy8gcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09MT04gfHwKLQkJCQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQKLQkJCQkJCS8vIHx8Ci0JCQkJCQlyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQkJLy8gc2tpcCB0byBMQlJBQ0UKLQkJCQlDb21wb3VuZFJlZ2lvbiBwYyA9IHByZXZDb3JyZXNwb25kZW5jZShyZWdpb24pOwotCQkJCS8vIGd1YXJkIGZvciBOUEUKLQkJCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTEzMTgKLQkJCQlpZiAocGMgPT0gbnVsbCkgYnJlYWs7Ci0JCQkJaXQucmVzZXQocGMuZ2V0RG9jdW1lbnRSZWdpb24oKSwgcGMuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORykgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0VG1wID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zaXRpb24pOwotCQkJCWlmIChyZWdpb24gPT0gaXRUbXAucHJldigpKQotCQkJCQlyZXR1cm4gcmVnaW9uOyAvLyBwb3NpdGlvbiBpcyBpbnNpZGUgb2Ygc3RyaW5nCi0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdFRtcCA9IG5ldyBSZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uKTsKLQkJCQlpZiAocmVnaW9uID09IGl0VG1wLnByZXYoKSkKLQkJCQkJcmV0dXJuIHJlZ2lvbjsgLy8gcG9zaXRpb24gaXMgaW5zaWRlIG9mIGNvbW1lbnQKLQkJCX0gZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJCVN0cmluZyBzdHIgPSByZWdpb24uZ2V0VGV4dCgpOwotCQkJCWlmIChzdHIuY2hhckF0KHN0ci5sZW5ndGgoKSAtIDEpID09ICdcXCcpCi0JCQkJCXJldHVybiByZWdpb247Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUikgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0UHJldiA9IG5ldyBSZWdpb25JdGVyYXRvcihyZWdpb24uZ2V0RG9jdW1lbnRSZWdpb24oKSwgcmVnaW9uLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJd2hpbGUgKGl0UHJldi5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uUHJldiA9IGl0UHJldi5wcmV2KCk7Ci0JCQkJCWlmIChyZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIGlmIChyZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkJCXJldHVybiByZWdpb247Ci0JCQkJCX0gZWxzZSBpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCQkJd2hpbGUgKGl0UHJldi5oYXNQcmV2KCkpIHsKLQkJCQkJCQlyZWdpb25QcmV2ID0gaXRQcmV2LnByZXYoKTsKLQkJCQkJCQlpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCByZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgcmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCQkJCX0KLQkJCQkJCWlmIChyZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb24gZ2V0UmVnaW9uKGludCBwb3NpdGlvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvc2l0aW9uKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbikpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IG5lZWRTaGlmdChDb21wb3VuZFJlZ2lvbiByZWdpb24sIGludCBwb3NpdGlvbikgewotCQlpbnQgc2hpZnQgPSAwOwotCQlpZiAocmVnaW9uID09IG51bGwgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCS8vIGdldCBub24gc3BhY2UgcmVnaW9uCi0JCQlDb21wb3VuZFJlZ2lvbiBjciA9IGdldFJlZ2lvbihwb3NpdGlvbiAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoY3IuZ2V0RG9jdW1lbnRSZWdpb24oKSwgY3IuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCUlUZXh0UmVnaW9uIG5lYXJlc3RSZWdpb24gPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCW5lYXJlc3RSZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChuZWFyZXN0UmVnaW9uICE9IG51bGwgJiYgKG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgbmVhcmVzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCBuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpKQotCQkJCXNoaWZ0LS07Ci0JCQllbHNlIGlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQlzaGlmdC0tOwotCQkJc2hpZnQrKzsKLQkJfQotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uKTsKLQkJCWlmICghaXQuaGFzUHJldigpIHx8IGl0LnByZXYoKS5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkKLQkJCQlzaGlmdCsrOwotCQkJZWxzZQotCQkJCXNoaWZ0ID0gMDsKLQkJfQotCQlyZXR1cm4gc2hpZnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uIHByZXZDb3JyZXNwb25kZW5jZShpbnQgcG9zaXRpb24sIFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zaXRpb24gLSAxKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaW50IG5lc3QgPSAxOwotCQlpZiAocmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkvLyBza2lwIHRvIExCUkFDRQotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCXJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKQotCQkJCQluZXN0LS07Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKQotCQkJCQluZXN0Kys7Ci0JCQkJaWYgKG5lc3QgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobmVzdCA9PSAwKQotCQkJCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb24oaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHJlZ2lvbik7Ci0JCX0KLQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpIHsKLQkJCS8vIHNraXAgdG8gQlJBQ0tFVF9PUEVOCi0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQpCi0JCQkJCW5lc3QtLTsKLQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKQotCQkJCQluZXN0Kys7Ci0JCQkJaWYgKG5lc3QgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobmVzdCA9PSAwKQotCQkJCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb24oaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHJlZ2lvbik7Ci0JCX0KLQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSB7Ci0JCQkvLyBza2lwIHRvIFBBUkVOVEhFU0lTX09QRU4KLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlyZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKC8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0KLQkJCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFSRU5USEVTSVNfT1BFTiB8fAotCQkJCXJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQluZXN0LS07Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCW5lc3QrKzsKLQkJCQlpZiAobmVzdCA8PSAwKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChuZXN0ID09IDApCi0JCQkJcmV0dXJuIG5ldyBDb21wb3VuZFJlZ2lvbihpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb24gcHJldkNvcnJlc3BvbmRlbmNlKENvbXBvdW5kUmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcmVnaW9uLmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCWludCBwb3NpdGlvbiA9IGZsYXROb2RlLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIHByZXZDb3JyZXNwb25kZW5jZShwb3NpdGlvbiwgcmVnaW9uLmdldFR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNldFJhbmdlRm9yQ2xvc2UoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJaW50IHBvc2l0aW9uID0gY29tbWFuZC5vZmZzZXQ7Ci0KLQkJaWYgKHBvc2l0aW9uID09IC0xIHx8IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gZmluZCBzdGFydCBvZiBsaW5lCi0JCQlpbnQgcCA9IChwb3NpdGlvbiA9PSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPyBwb3NpdGlvbiAtIDEgOiBwb3NpdGlvbik7Ci0KLQkJCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChwKTsKLQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBzdGFydCk7Ci0JCQlib29sZWFuIGFsbFdoaXRlU3BhY2UgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIHdoZXRoZXIgdGhlIHRleHQgZnJvbSBsU3RhcnQgdG8gcG9zaXRpb24gaXMgd2hpdGUgc3BhY2UKLQkJCS8vIG9yIG5vdAotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pID4gcCkgewotCQkJCQlhbGxXaGl0ZVNwYWNlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFsbFdoaXRlU3BhY2UpIHsKLQkJCQljb21tYW5kLmxlbmd0aCA9IGNvbW1hbmQubGVuZ3RoIC0gKHN0YXJ0IC0gY29tbWFuZC5vZmZzZXQpOwotCQkJCWNvbW1hbmQub2Zmc2V0ID0gc3RhcnQ7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y3ApIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjcCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJhbmdlRm9yTmV3TGluZShEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlpbnQgcG9zaXRpb24gPSBjb21tYW5kLm9mZnNldDsKLQotCQlpZiAocG9zaXRpb24gPT0gLTEgfHwgc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyBhZGQgcHJlLW5lYXJlc3Qgd2hpdGUgc3BhY2VzIHRvIHJlcGxhY2UgdGFyZ2V0Ci0JCQlpZiAocG9zaXRpb24gPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbiAtIDEpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvc2l0aW9uIC0gMSk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCQlpbnQgZW5kID0gY29tbWFuZC5vZmZzZXQgKyBjb21tYW5kLmxlbmd0aDsKLQkJCQkJCWludCBuTGluZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24pOwotCQkJCQkJaW50IG5TdGFydFBvcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2Zmc2V0KG5MaW5lKTsKLQkJCQkJCWlmIChuU3RhcnRQb3MgPCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pKQotCQkJCQkJCW5TdGFydFBvcyA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQljb21tYW5kLm9mZnNldCA9IG5TdGFydFBvczsKLQkJCQkJCWNvbW1hbmQubGVuZ3RoID0gZW5kIC0gY29tbWFuZC5vZmZzZXQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFkZCBwb3N0LW5lYXJlc3Qgd2hpdGUgc3BhY2VzIHRvIHJlcGxhY2UgdGFyZ2V0Ci0JCQlpZiAocG9zaXRpb24gPCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbik7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCQlpbnQgbkxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQkJCVN0cmluZyBjdXJyZW50TGluZURlbGltID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIobkxpbmUpOwotCQkJCQkJaW50IG5FbmRQb3MgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChuTGluZSkgKyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZUxlbmd0aChuTGluZSkgLSAoKGN1cnJlbnRMaW5lRGVsaW0gIT0gbnVsbCkgPyBjdXJyZW50TGluZURlbGltLmxlbmd0aCgpIDogMCk7Ci0JCQkJCQlpZiAobkVuZFBvcyA+IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pKQotCQkJCQkJCW5FbmRQb3MgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCWNvbW1hbmQubGVuZ3RoID0gbkVuZFBvcyAtIGNvbW1hbmQub2Zmc2V0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3QgY3VzdG9taXplIGNvbW1hbmQKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGVuZHNXaXRoKFN0cmluZ1tdIHNlYXJjaFN0cmluZ3MsIFN0cmluZyB0ZXh0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRleHQuZW5kc1dpdGgoc2VhcmNoU3RyaW5nc1tpXSkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBmaW5kRW5kT2ZXaGl0ZVNwYWNlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGVuZCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKG9mZnNldCA8IGVuZCkgewotCQkJY2hhciBjID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJaWYgKGMgIT0gJyAnICYmIGMgIT0gJ1x0JykgewotCQkJCXJldHVybiBvZmZzZXQ7Ci0JCQl9Ci0JCQlvZmZzZXQrKzsKLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRleHRFZGl0b3I7Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBJbnNlcnQgc3BhY2VzIGZvciB0YWJzCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JUYWIoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyB0YWIga2V5IHdhcyBwcmVzc2VkLiBub3cgY2hlY2sgcHJlZmVyZW5jZXMgdG8gc2VlIGlmIG5lZWQgdG8gaW5zZXJ0Ci0JCS8vIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYgotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoaW5kZW50YXRpb25XaWR0aCAhPSAwKSB7Ci0JCQkJaW50IGluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoOwotCQkJCXRyeSB7Ci0JCQkJCUlSZWdpb24gZmlyc3RMaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCQlpbnQgb2Zmc2V0SW5MaW5lID0gY29tbWFuZC5vZmZzZXQgLSBmaXJzdExpbmUuZ2V0T2Zmc2V0KCk7Ci0JCQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCi0JCQkJCWluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoIC0gcmVtYWluZGVyOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50U2l6ZTsgaSsrKQotCQkJCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCQl9Ci0KLQkJCS8vIHJlcGxhY2UgXHQgY2hhcmFjdGVycyB3aXRoIHNwYWNlcwotCQkJY29tbWFuZC50ZXh0ID0gaW5kZW50LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDQUNhbmRpZGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ0FDYW5kaWRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2ZjRlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDQUNhbmRpZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZVR5cGU7Ci0KLWNsYXNzIENTU0NBQ2FuZGlkYXRlIHsKLQotCXByaXZhdGUgU3RyaW5nIGZSZXBsYWNlbWVudFN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkN1cnNvclBvc2l0aW9uID0gMDsKLQlwcml2YXRlIFN0cmluZyBmRGlzcGxheVN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NJbWFnZVR5cGUgZkltYWdlVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NDQUNhbmRpZGF0ZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0NBQ2FuZGlkYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlpbnQgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmQ3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gZkRpc3BsYXlTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCUNTU0ltYWdlVHlwZSBnZXRJbWFnZVR5cGUoKSB7Ci0JCXJldHVybiBmSW1hZ2VUeXBlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlTdHJpbmcgZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSB7Ci0JCXJldHVybiBmUmVwbGFjZW1lbnRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgc2V0Q3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCWZDdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIHNldERpc3BsYXlTdHJpbmcoU3RyaW5nIGRpc3BsYXlTdHJpbmcpIHsKLQkJZkRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIHNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlKSB7Ci0JCWZJbWFnZVR5cGUgPSBpbWFnZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgc2V0UmVwbGFjZW1lbnRTdHJpbmcoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nKSB7Ci0JCWZSZXBsYWNlbWVudFN0cmluZyA9IHJlcGxhY2VtZW50U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSk7Ci0JCWJ1Zi5hcHBlbmQoIlwiIik7Ly8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKGdldERpc3BsYXlTdHJpbmcoKSk7Ci0JCWJ1Zi5hcHBlbmQoIlwiIik7Ly8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKCIoIik7Ly8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKGdldEN1cnNvclBvc2l0aW9uKCkpOwotCQlidWYuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhODU5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLWNsYXNzIENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IHsKLQotCXByaXZhdGUgaW50IGZSZXBsYWNlQmVnaW4gPSAtMTsKLQlwcml2YXRlIFN0cmluZyBmVGV4dFRvUmVwbGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHRUb0NvbXBhcmUgPSBudWxsOwotCXByaXZhdGUgaW50IGZUYXJnZXRQb3MgPSAtMTsKLQlwcml2YXRlIElDU1NOb2RlIGZUYXJnZXROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCBmQ3Vyc29yUG9zID0gLTE7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgaW50IGZEb2N1bWVudE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBjaGFyIGZRdW90ZSA9IDA7Ci0JcHJpdmF0ZSBJQ1NTTW9kZWwgZk1vZGVsID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlNlbGVjdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDb250ZW50QXNzaXN0Q29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JQ1NTQ29udGVudEFzc2lzdENvbnRleHQoaW50IGRvY3VtZW50UG9zaXRpb24sIElDU1NOb2RlIG5vZGUsIGludCBkb2N1bWVudE9mZnNldCwgY2hhciBxdW90ZSkgewotCQl0aGlzKCk7Ci0JCWZDdXJzb3JQb3MgPSBkb2N1bWVudFBvc2l0aW9uOwotCQlmRG9jdW1lbnRPZmZzZXQgPSBkb2N1bWVudE9mZnNldDsKLQkJZlF1b3RlID0gcXVvdGU7Ci0JCWluaXRpYWxpemUobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCX0KLQkKLQlDU1NDb250ZW50QXNzaXN0Q29udGV4dChpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSUNTU05vZGUgbm9kZSwgaW50IGRvY3VtZW50T2Zmc2V0LCBjaGFyIHF1b3RlLCBib29sZWFuIHNlbGVjdGVkKSB7Ci0JCXRoaXMoKTsKLQkJZkN1cnNvclBvcyA9IGRvY3VtZW50UG9zaXRpb247Ci0JCWZEb2N1bWVudE9mZnNldCA9IGRvY3VtZW50T2Zmc2V0OwotCQlmUXVvdGUgPSBxdW90ZTsKLQkJZlNlbGVjdGVkID0gc2VsZWN0ZWQ7Ci0JCWluaXRpYWxpemUobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldEN1cnNvclBvcygpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0RG9jdW1lbnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRPZmZzZXQ7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCUlDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIElDU1NOb2RlIGdldE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAoSUNTU05vZGUpICgoZk1vZGVsICE9IG51bGwpID8gZk1vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gY2hhcgotCSAqLwotCWNoYXIgZ2V0UXVvdGVPZlN0eWxlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gZlF1b3RlOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFJlZ2lvbkJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQkvLwlTdHJpbmcgZ2V0UmVnaW9uVGV4dCgpIHsKLQkvLwkJSVRleHRSZWdpb24gdGFyZ2V0UmVnaW9uID0gZ2V0VGFyZ2V0UmVnaW9uKCk7Ci0JLy8JCWlmICh0YXJnZXRSZWdpb24gIT0gbnVsbCkgewotCS8vCQkJcmV0dXJuIHRhcmdldFJlZ2lvbi5nZXRUZXh0KCk7Ci0JLy8JCX0gZWxzZSB7Ci0JLy8JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkvLwkJfQotCS8vCX0KLQkvKioKLQkgKiAgCi0JICovCi0JaW50IGdldFJlcGxhY2VCZWdpbigpIHsKLQkJcmV0dXJuIGZSZXBsYWNlQmVnaW47Ci0JfQotCi0JSUNTU05vZGUgZ2V0VGFyZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZUYXJnZXROb2RlOwotCX0KLQotCXByaXZhdGUgaW50IGdldFRhcmdldFBvcygpIHsKLQkJcmV0dXJuIGZUYXJnZXRQb3M7Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0VGFyZ2V0UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9uQnlPZmZzZXQoZ2V0VGFyZ2V0UG9zKCkpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRUYXJnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50UmVnaW9uQnlPZmZzZXQoZ2V0VGFyZ2V0UG9zKCkpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbkJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpID8gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpIDogbnVsbDsKLQl9Ci0KLQlJVGV4dFJlZ2lvbiBnZXRUYXJnZXRSZWdpb25QcmV2aW91cygpIHsKLQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBnZXRUYXJnZXRSZWdpb24oKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBudWxsOwotCQlpZiAodGFyZ2V0UmVnaW9uID09IG51bGwpIHsKLQkJCWlmICgwIDwgZkN1cnNvclBvcykgewotCQkJCWl0ZXJhdG9yID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZDdXJzb3JQb3MgLSAxKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWl0ZXJhdG9yID0gZ2V0UmVnaW9uSXRlcmF0b3IoKTsKLQkJCWlmIChpdGVyYXRvci5oYXNQcmV2KCkpIHsKLQkJCQlpdGVyYXRvci5wcmV2KCk7Ci0JCQl9IGVsc2UgewotCQkJCWl0ZXJhdG9yID0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAoaXRlcmF0b3IgIT0gbnVsbCkgewotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXJhdG9yLnByZXYoKTsKLQkJCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDKSB7Ci0JCQkJCXByZXZpb3VzUmVnaW9uID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJldmlvdXNSZWdpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFRleHRUb0NvbXBhcmUoKSB7Ci0JCXJldHVybiBmVGV4dFRvQ29tcGFyZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JU3RyaW5nIGdldFRleHRUb1JlcGxhY2UoKSB7Ci0JCXJldHVybiBmVGV4dFRvUmVwbGFjZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoSUNTU0RvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJQ1NTTW9kZWwgbW9kZWwgPSBkb2MuZ2V0TW9kZWwoKTsKLQkJZk1vZGVsID0gbW9kZWw7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlpbml0aWFsaXplVGFyZ2V0UG9zKCk7Ci0JCWluaXRpYWxpemVUYXJnZXRUZXh0KCk7Ci0JCWluaXRpYWxpemVUYXJnZXROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFyZ2V0Tm9kZSgpIHsKLQkJaWYgKGZDdXJzb3JQb3MgPT0gMCkgewotCQkJZlRhcmdldE5vZGUgPSBmTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpbmQgZWRnZSBvZiB0cmVlIG5vZGUKLQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IGdldE5vZGVBdChmQ3Vyc29yUG9zKTsKLQkJaWYgKGN1cnNvck5vZGUgPT0gbnVsbCkgeyAvLyBlbmQgb2YgZG9jdW1lbnQKLQkJCWN1cnNvck5vZGUgPSBmTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQlJQ1NTTm9kZSBub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZkN1cnNvclBvcyAtIDEpOwotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCAmJiAobm9kZSA9IGdldE5vZGVBdChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSkgPT0gY3Vyc29yTm9kZSAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkgIT0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXRQcmV2aW91cygpOwotCQl9Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7IC8vIHRvcCBvZiBkb2N1bWVudAotCQkJZlRhcmdldE5vZGUgPSAobm9kZSA9PSBudWxsKSA/IGZNb2RlbC5nZXREb2N1bWVudCgpIDogbm9kZTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyAgIHY8LS18Ci0JCS8vICAgQUFBQUFBCi0JCS8vIEJCQkJCQkJCQkIgY3Vyc29yTm9kZTpBICwgbm9kZTpCIC0+IHRhcmdldCBpcyBBCi0JCWlmIChjdXJzb3JOb2RlICE9IG51bGwpIHsKLQkJCWZvciAoSUNTU05vZGUgcGFyZW50ID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHBhcmVudCA9PSBjdXJzb3JOb2RlKSB7Ci0JCQkJCWZUYXJnZXROb2RlID0gY3Vyc29yTm9kZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyAgICAgdjwtLXwKLQkJLy8gICBBQUEKLQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkIgLCBub2RlOkEgLT4gZGVwZW5kIG9uIEEncyBub2RlIHR5cGUKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCWlmIChub2RlVHlwZSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUgfHwgbm9kZVR5cGUgPT0gSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpIHsKLQkJCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJZlRhcmdldE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZlRhcmdldE5vZGUgPSBub2RlOwotCQkJfQotCQkJLy8JCQlmVGFyZ2V0Tm9kZSA9IChiT3ZlclNlbWlDb2xvbikgPyBub2RlLmdldFBhcmVudE5vZGUoKSA6IG5vZGU7Ci0JCX0gZWxzZSBpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9IGVsc2UgewotCQkJZlRhcmdldE5vZGUgPSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFBvcygpIHsKLQkJaWYgKGZDdXJzb3JQb3MgPT0gMCB8fCBpc1NwZWNpYWxEZWxpbWl0ZXJSZWdpb24oZkN1cnNvclBvcyAtIDEpKSB7Ci0JCQlmVGFyZ2V0UG9zID0gZkN1cnNvclBvczsKLQkJfSBlbHNlIHsKLQkJCWZUYXJnZXRQb3MgPSBmQ3Vyc29yUG9zIC0gMTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRleHQoKSB7Ci0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IGdldFRhcmdldFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZ2V0VGFyZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHRhcmdldFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlmUmVwbGFjZUJlZ2luID0gZkN1cnNvclBvczsKLQkJCWZUZXh0VG9SZXBsYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZUZXh0VG9Db21wYXJlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyByZWdpb25UZXh0ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dCh0YXJnZXRSZWdpb24pOwotCQkJaW50IHJlZ2lvblN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGFyZ2V0UmVnaW9uKTsKLQkJCWlmICghZlNlbGVjdGVkICYmIChyZWdpb25TdGFydCA9PSBmQ3Vyc29yUG9zIHx8IHJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpID09IDAgfHwgcmVnaW9uU3RhcnQgKyByZWdpb25UZXh0Lmxlbmd0aCgpIC0gMSA8IGZUYXJnZXRQb3MpKSB7Ci0JCQkJLy8gdG8gaW5zZXJ0aW9uCi0JCQkJZlJlcGxhY2VCZWdpbiA9IGZDdXJzb3JQb3M7Ci0JCQkJZlRleHRUb1JlcGxhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWZUZXh0VG9Db21wYXJlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdG8gcmVwbGFjZQotCQkJCWZSZXBsYWNlQmVnaW4gPSByZWdpb25TdGFydDsKLQkJCQlmVGV4dFRvUmVwbGFjZSA9IHJlZ2lvblRleHQ7Ci0JCQkJaWYoZkN1cnNvclBvcyA+PSBmUmVwbGFjZUJlZ2luICYmIHJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpID49IChmQ3Vyc29yUG9zIC0gZlJlcGxhY2VCZWdpbikpCi0JCQkJCWZUZXh0VG9Db21wYXJlID0gcmVnaW9uVGV4dC5zdWJzdHJpbmcoMCwgZkN1cnNvclBvcyAtIGZSZXBsYWNlQmVnaW4pOwotCQkJCWVsc2UKLQkJCQkJZlRleHRUb0NvbXBhcmUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NwZWNpYWxEZWxpbWl0ZXJSZWdpb24oaW50IHBvcykgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25CeU9mZnNldChwb3MpOwotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JYm9vbGVhbiBpc1RhcmdldFBvc0FmdGVyT2YoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBmVGFyZ2V0Tm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHN0YXJ0IDwgMCB8fCAoKEluZGV4ZWRSZWdpb24pIGZUYXJnZXROb2RlKS5nZXRFbmRPZmZzZXQoKSA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlSZWdpb25JdGVyYXRvciBpUmVnaW9uID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0KTsKLQkJd2hpbGUgKGlSZWdpb24uaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpUmVnaW9uLm5leHQoKTsKLQkJCWlmIChmVGFyZ2V0UG9zIDwgaVJlZ2lvbi5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IHJlZ2lvblR5cGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JYm9vbGVhbiBpc1RhcmdldFBvc0JlZm9yZU9mKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCXJldHVybiAhaXNUYXJnZXRQb3NBZnRlck9mKHJlZ2lvblR5cGUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSByZWdpb25UeXBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JYm9vbGVhbiB0YXJnZXRGb2xsb3dzKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGlSZWdpb247Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIDw9IGZUYXJnZXRQb3MpIHsKLQkJCWlSZWdpb24gPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwotCQl9IGVsc2UgewotCQkJaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBmVGFyZ2V0UG9zKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2hhcihmVGFyZ2V0UG9zKSkgJiYgaVJlZ2lvbi5oYXNQcmV2KCkpIHsKLQkJCQkJcmVnaW9uID0gaVJlZ2lvbi5wcmV2KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWlSZWdpb24gPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwotCQkJfQotCQl9Ci0JCXdoaWxlIChpUmVnaW9uLmhhc1ByZXYoKSkgewotCQkJcmVnaW9uID0gaVJlZ2lvbi5wcmV2KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpID09IHJlZ2lvblR5cGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCWJvb2xlYW4gdGFyZ2V0SGFzKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIGZUYXJnZXROb2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGdldFRhcmdldFBvcygpIDwgMCB8fCBlbmQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVJlZ2lvbkl0ZXJhdG9yIGlSZWdpb24gPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgZ2V0VGFyZ2V0UG9zKCkpOwotCQl3aGlsZSAoaVJlZ2lvbi5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGlSZWdpb24ubmV4dCgpOwotCQkJaWYgKGVuZCA8PSBpUmVnaW9uLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IHJlZ2lvblR5cGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JUmVnaW9uSXRlcmF0b3IgZ2V0UmVnaW9uSXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVnaW9uSXRlcmF0b3IoZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIGdldFRhcmdldFBvcygpKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKLQkJQ1NTTWV0YU1vZGVsRmluZGVyIGZpbmRlciA9IENTU01ldGFNb2RlbEZpbmRlci5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gZmluZGVyLmZpbmRNZXRhTW9kZWxGb3IoZ2V0TW9kZWwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTIzMTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklDU1NNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5TdHlsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXByaXZhdGUgaW50IGZEb2N1bWVudE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBjaGFyIGZRdW90ZSA9IDA7Ci0JcHJpdmF0ZSBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYSBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb2RlLWFzc2lzdCBpdGVtcwotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiArIGZEb2N1bWVudE9mZnNldCk7Ci0JCUlET01Ob2RlIHhOb2RlID0gbnVsbDsKLQkJSURPTU5vZGUgcGFyZW50ID0gbnVsbDsKLQkJQ1NTUHJvcG9zYWxBcnJhbmdlciBhcnJhbmdlciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNFbXB0eURvY3VtZW50ID0gZmFsc2U7Ci0JCS8vIElmIHRoZXJlIGlzIGEgc2VsZWN0ZWQgcmVnaW9uLCB3ZSdsbCBuZWVkIHRvIHJlcGxhY2UgdGhlIHRleHQKLQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJYm9vbGVhbiBzZWxlY3RlZCA9IChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uZ2V0VGV4dCgpICE9IG51bGwgJiYgc2VsZWN0aW9uLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQkJCi0JCS8vIGJhaWwgaWYgd2UgY291bGRuJ3QgZ2V0IGFuIGluZGV4ZWQgbm9kZQotCQkvLyBpZihpbmRleGVkTm9kZSA9PSBudWxsKSByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCWlmIChpbmRleGVkTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQl4Tm9kZSA9IChJRE9NTm9kZSkgaW5kZXhlZE5vZGU7Ci0JCQlwYXJlbnQgPSAoSURPTU5vZGUpIHhOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQkvLyBuZWVkIHRvIGdldCBpbiBoZXJlIGlmIHRoZXJlIGluIHRoZSBubyAwIHJlZ2lvbiA8c3R5bGU+fDwvc3R5bGU+Ci0JCS8vIGNhc2UKLQkJaWYgKCh4Tm9kZSAhPSBudWxsKSAmJiB4Tm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkgewotCQkJLy8gbm93IHdlIGtub3cgdGhlIGN1cnNvciBpcyBpbiBhIDxzdHlsZT4gdGFnIHcvb3V0IHJlZ2lvbgotCQkJSVN0cnVjdHVyZWRNb2RlbCBjc3NNb2RlbCA9IGdldENTU01vZGVsKHhOb2RlKTsKLQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRqdXN0IG9mZnNldHMgZm9yIGVtYmVkZGVkIHN0eWxlCi0JCQkJaW50IG9mZnNldCA9IGRvY3VtZW50UG9zaXRpb24gKyBmRG9jdW1lbnRPZmZzZXQ7Ci0JCQkJaW50IHBvcyA9IDA7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocG9zKTsKLQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQlrZXlJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIocG9zLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBvZmZzZXQsIChjaGFyKSAwLCBzZWxlY3RlZCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHBhcmVudCAhPSBudWxsKSAmJiBwYXJlbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpIHsKLQkJCS8vIG5vdyB3ZSBrbm93IHRoZSBjdXJzb3IgaXMgaW4gYSA8c3R5bGU+IHRhZyB3aXRoIGEgcmVnaW9uCi0JCQkvLyB1c2UgdGhlIHBhcmVudCBiZWNhdXNlIHRoYXQgd2lsbCBiZSB0aGUgPHN0eWxlPiB0YWcKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgY3NzTW9kZWwgPSBnZXRDU1NNb2RlbChwYXJlbnQpOwotCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBhZGp1c3Qgb2Zmc2V0cyBmb3IgZW1iZWRkZWQgc3R5bGUKLQkJCQlpbnQgb2Zmc2V0ID0gaW5kZXhlZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgcG9zID0gZG9jdW1lbnRQb3NpdGlvbiAtIG9mZnNldDsKLQkJCQlJbmRleGVkUmVnaW9uIGtleUluZGV4ZWROb2RlID0gY3NzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihwb3MpOwotCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJYXJyYW5nZXIgPSBuZXcgQ1NTUHJvcG9zYWxBcnJhbmdlcihwb3MsIChJQ1NTTm9kZSkga2V5SW5kZXhlZE5vZGUsIG9mZnNldCwgKGNoYXIpIDAsIHNlbGVjdGVkKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpbmRleGVkTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkvLyBnZXQgbW9kZWwgZm9yIG5vZGUgdy8gc3R5bGUgYXR0cmlidXRlCi0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gZ2V0Q1NTTW9kZWwoKElET01Ob2RlKSBpbmRleGVkTm9kZSk7Ci0JCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCUluZGV4ZWRSZWdpb24ga2V5SW5kZXhlZE5vZGUgPSBjc3NNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24gLSBmRG9jdW1lbnRPZmZzZXQpOwotCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJaWYgKGtleUluZGV4ZWROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQkJLy8gaW5saW5lIHN0eWxlIGZvciBhIHRhZywgbm90IGVtYmVkZGVkCi0JCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIoZG9jdW1lbnRQb3NpdGlvbiwgKElDU1NOb2RlKSBrZXlJbmRleGVkTm9kZSwgZkRvY3VtZW50T2Zmc2V0LCBmUXVvdGUsIHNlbGVjdGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJLy8gd2hlbiBlZGl0aW5nIGV4dGVybmFsIENTUyB1c2luZyBDU1MgRGVzaWduZXIsIElDU1NOb2RlIGlzCi0JCQkvLyBwYXNzZWQuCi0JCQlJQ1NTRG9jdW1lbnQgY3NzZG9jID0gKChJQ1NTTm9kZSkgaW5kZXhlZE5vZGUpLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChjc3Nkb2MgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgY3NzTW9kZWwgPSBjc3Nkb2MuZ2V0TW9kZWwoKTsKLQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlJbmRleGVkUmVnaW9uIGtleUluZGV4ZWROb2RlID0gY3NzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uIC0gZkRvY3VtZW50T2Zmc2V0KTsKLQkJCQkJaWYgKGtleUluZGV4ZWROb2RlID09IG51bGwpIHsKLQkJCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJfQotCQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCQkJLy8gaW5saW5lIHN0eWxlIGZvciBhIHRhZywgbm90IGVtYmVkZGVkCi0JCQkJCQlhcnJhbmdlciA9IG5ldyBDU1NQcm9wb3NhbEFycmFuZ2VyKGRvY3VtZW50UG9zaXRpb24sIChJQ1NTTm9kZSkga2V5SW5kZXhlZE5vZGUsIGZEb2N1bWVudE9mZnNldCwgZlF1b3RlLCBzZWxlY3RlZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKGluZGV4ZWROb2RlID09IG51bGwpICYmIGlzVmlld2VyRW1wdHkodmlld2VyKSkgewotCQkJaXNFbXB0eURvY3VtZW50ID0gdHJ1ZTsKLQkJCS8vIHRoZSB0b3Agb2YgZW1wdHkgQ1NTIERvY3VtZW50Ci0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY3NzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCQlpZiAoY3NzTW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbiAtIGZEb2N1bWVudE9mZnNldCk7Ci0JCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlrZXlJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGtleUluZGV4ZWROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQkJCS8vIGlubGluZSBzdHlsZSBmb3IgYSB0YWcsIG5vdCBlbWJlZGRlZAotCQkJCQkJYXJyYW5nZXIgPSBuZXcgQ1NTUHJvcG9zYWxBcnJhbmdlcihkb2N1bWVudFBvc2l0aW9uLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBmRG9jdW1lbnRPZmZzZXQsIGZRdW90ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKQotCQkJCQljc3NNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJaWYgKGFycmFuZ2VyICE9IG51bGwpIHsKLQkJCWZEb2N1bWVudE9mZnNldCA9IDA7Ci0JCQlwcm9wb3NhbHMgPSBhcnJhbmdlci5nZXRQcm9wb3NhbHMoKTsKLQotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG5ld2ZpbGVwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBhbnlwcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCS8vIGFkZCB0ZW1wbGF0ZSBwcm9wb3NhbHMKLQkJCWlmIChnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzRW1wdHlEb2N1bWVudCkgewotCQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLk5FVyk7Ci0JCQkJCW5ld2ZpbGVwcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLkFMTCk7Ci0JCQkJYW55cHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCX0KLQotCQkJLy8gYWRkIGVuZCB0YWcgaWYgcGFyZW50IGlzIG5vdCBjbG9zZWQKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgZW5kVGFnID0gWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5jb21wdXRlWE1MRW5kVGFnUHJvcG9zYWwodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uLCBpbmRleGVkTm9kZSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLCBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX1RBR19HRU5FUklDKTsgCi0KLQkJCS8vIGFkZCB0aGUgYWRkaXRpb25hbCBwcm9wb3NhbHMKLQkJCWludCBhZGRpdGlvbmFsTGVuZ3RoID0gbmV3ZmlsZXByb3Bvc2Fscy5sZW5ndGggKyBhbnlwcm9wb3NhbHMubGVuZ3RoOwotCQkJYWRkaXRpb25hbExlbmd0aCA9IChlbmRUYWcgIT0gbnVsbCkgPyArK2FkZGl0aW9uYWxMZW5ndGggOiBhZGRpdGlvbmFsTGVuZ3RoOwotCQkJaWYgKGFkZGl0aW9uYWxMZW5ndGggPiAwKSB7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHBsdXNPbmVzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLmxlbmd0aCArIGFkZGl0aW9uYWxMZW5ndGhdOwotCQkJCWludCBhcHBlbmRQb3MgPSBwcm9wb3NhbHMubGVuZ3RoOwotCQkJCS8vIGFkZCBlbmQgdGFnIHByb3Bvc2FsCi0JCQkJaWYgKGVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvcG9zYWxzLCAwLCBwbHVzT25lcywgMSwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0JCQkJCXBsdXNPbmVzWzBdID0gZW5kVGFnOwotCQkJCQkrK2FwcGVuZFBvczsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb3Bvc2FscywgMCwgcGx1c09uZXMsIDAsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQkJCX0KLQkJCQkvLyBhZGQgaXRlbXMgaW4gbmV3ZmlsZXByb3Bvc2FscwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3ZmlsZXByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlwbHVzT25lc1thcHBlbmRQb3MgKyBpXSA9IG5ld2ZpbGVwcm9wb3NhbHNbaV07Ci0JCQkJfQotCQkJCS8vIGFkZCBpdGVtcyBpbiBhbnlwcm9wb3NhbHMKLQkJCQlhcHBlbmRQb3MgPSBhcHBlbmRQb3MgKyBuZXdmaWxlcHJvcG9zYWxzLmxlbmd0aDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFueXByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlwbHVzT25lc1thcHBlbmRQb3MgKyBpXSA9IGFueXByb3Bvc2Fsc1tpXTsKLQkJCQl9Ci0JCQkJcHJvcG9zYWxzID0gcGx1c09uZXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbm8gdGV4dCBvciBpdCdzIGFsbCB3aGl0ZSBzcGFjZSwgb3RoZXJ3aXNlCi0JICogcmV0dXJucyBmYWxzZQotCSAqIAotCSAqIEBwYXJhbSB0cmVlTm9kZQotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlld2VyRW1wdHkoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlib29sZWFuIGlzRW1wdHkgPSBmYWxzZTsKLQkJU3RyaW5nIHRleHQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0JCWlmICgodGV4dCA9PSBudWxsKSB8fCAoKHRleHQgIT0gbnVsbCkgJiYgdGV4dC50cmltKCkuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCWlzRW1wdHkgPSB0cnVlOwotCQlyZXR1cm4gaXNFbXB0eTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQ1NTTW9kZWwgZm9yIGFuIGluZGV4ZWQgbm9kZQotCSAqIAotCSAqIEBwYXJhbSBpbmRleGVkTm9kZQotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDU1NNb2RlbChJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlKSB7Ci0JLy8gaWYgKGluZGV4ZWROb2RlID09IG51bGwpIHJldHVybiBudWxsOwotCS8vIE5vZGUgbm9kZSA9IChOb2RlKWluZGV4ZWROb2RlOwotCS8vIElOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcilub2RlLmdldFBhcmVudE5vZGUoKTsKLQkvLyBpZiAobm90aWZpZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JLy8gSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPQotCS8vIFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChub3RpZmllcik7Ci0JLy8gaWYgKGFkYXB0ZXIgPT0gbnVsbCB8fCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBDU1NNb2RlbEFkYXB0ZXIpKSByZXR1cm4KLQkvLyBudWxsOwotCS8vIENTU01vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSAoQ1NTTW9kZWxBZGFwdGVyKWFkYXB0ZXI7Ci0JLy8gcmV0dXJuIG1vZGVsQWRhcHRlci5nZXRNb2RlbCgpOwotCS8vIH0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDU1Ntb2RlbCBmb3IgYSBnaXZlbiBYTUwgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDU1NNb2RlbChJRE9NTm9kZSBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbWVudCk7Ci0JCWlmICgoYWRhcHRlciA9PSBudWxsKSB8fCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ1NTTW9kZWxBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IChJQ1NTTW9kZWxBZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gbW9kZWxBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBjb250ZXh0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHBvc3NpYmxlCi0JICogICAgICAgICAgICBjb250ZXh0cwotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29udGV4dCBpbmZvcm1hdGlvbgotCSAqICAgICAgICAgICAgc2hvdWxkIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb250ZXh0IGluZm9ybWF0aW9uIG9iamVjdHMgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIG5vIGNvbnRleHQgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgcG9zc2libGUgY29tcGxldGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIGNvbXBsZXRpb24gcHJvcG9zYWwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcyBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIHByZXNlbnRpbmcgY29udGV4dAotCSAqICAgICAgICAgaW5mb3JtYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzCi0JICogICAgICAgICBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dAotCSAqIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZSBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb250ZXh0IGluZm9ybWF0aW9uIHZhbGlkYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55Ci0JICogY29tcGxldGlvbnMuCi0JICogCi0JICogQHJldHVybiBhbiBlcnJvciBtZXNzYWdlIG9yIG51bGwgaWYgbm8gZXJyb3Igb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wNS8yMgotCSAqIDEwOjM3OjA1KQotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJZkRvY3VtZW50T2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBxdW90ZQotCSAqICAgICAgICAgICAgY2hhcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1b3RlQ2hhck9mU3R5bGVBdHRyaWJ1dGUoY2hhciBxdW90ZSkgewotCQlmUXVvdGUgPSBxdW90ZTsKLQl9Ci0KLQlwcml2YXRlIENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmVGVtcGxhdGVQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlUHJvY2Vzc29yID0gbmV3IENTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVQcm9jZXNzb3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxBcnJhbmdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxBcnJhbmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDhmNzE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsQXJyYW5nZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci0KLWNsYXNzIENTU1Byb3Bvc2FsQXJyYW5nZXIgewotCi0JcHJpdmF0ZSBMaXN0IGZQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBDU1NDb250ZW50QXNzaXN0Q29udGV4dCBmQ29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEFycmFuZ2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9wb3NhbEFycmFuZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsQXJyYW5nZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NQcm9wb3NhbEFycmFuZ2VyKGludCBkb2N1bWVudFBvc2l0aW9uLCBJQ1NTTm9kZSBub2RlLCBpbnQgZG9jdW1lbnRPZmZzZXQsIGNoYXIgcXVvdGUpIHsKLQkJdGhpcygpOwotCQlmQ29udGV4dCA9IG5ldyBDU1NDb250ZW50QXNzaXN0Q29udGV4dChkb2N1bWVudFBvc2l0aW9uLCBub2RlLCBkb2N1bWVudE9mZnNldCwgcXVvdGUpOwotCX0KLQkKLQlDU1NQcm9wb3NhbEFycmFuZ2VyKGludCBkb2N1bWVudFBvc2l0aW9uLCBJQ1NTTm9kZSBub2RlLCBpbnQgZG9jdW1lbnRPZmZzZXQsIGNoYXIgcXVvdGUsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJdGhpcygpOwotCQlmQ29udGV4dCA9IG5ldyBDU1NDb250ZW50QXNzaXN0Q29udGV4dChkb2N1bWVudFBvc2l0aW9uLCBub2RlLCBkb2N1bWVudE9mZnNldCwgcXVvdGUsIHNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0Jdm9pZCBidWlsZFByb3Bvc2FscygpIHsKLQkJZlByb3Bvc2Fscy5jbGVhcigpOwotCi0JCS8qCi0JCSAqIFN0cmluZyB0ZXh0OyBJQ29tcGxldGlvblByb3Bvc2FsIGl0ZW07IHRleHQgPSAiLS0tLSBUZXN0Ci0JCSAqIEluZm9ybWF0aW9uIC0tLS0iOyBpdGVtID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwKLQkJICogZkNvbnRleHQuZ2V0UmVwbGFjZUJlZ2luKCksIDAsIDAsIG51bGwsIHRleHQsIG51bGwsIG51bGwpOwotCQkgKiBmUHJvcG9zYWxzLmFkZChpdGVtKTsKLQkJICogCi0JCSAqIHRleHQgPSAiVGFyZ2V0OiBcIiIgKyBmQ29udGV4dC5nZXRSZWdpb25UZXh0KCkgKyAiXCIiOwotCQkgKiAKLQkJICogaXRlbSA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGZDb250ZXh0LmdldFJlcGxhY2VCZWdpbigpLCAwLCAwLAotCQkgKiBudWxsLCB0ZXh0LCBudWxsLCBudWxsKTsgZlByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCSAqIAotCQkgKiB0ZXh0ID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpLmdldENsYXNzKCkudG9TdHJpbmcoKTsgaW50Ci0JCSAqIGxhc3RQZXJpb2RQb3MgPSB0ZXh0Lmxhc3RJbmRleE9mKCcuJyk7IHRleHQgPSAiTm9kZTogIiArCi0JCSAqIHRleHQuc3Vic3RyaW5nKGxhc3RQZXJpb2RQb3MgKyAxKTsgaXRlbSA9IG5ldwotCQkgKiBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGZDb250ZXh0LmdldFJlcGxhY2VCZWdpbigpLCAwLCAwLCBudWxsLAotCQkgKiB0ZXh0LCBudWxsLCBudWxsKTsgZlByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCSAqLwotCi0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCS8vaW50IHRhcmdldFBvcyA9IGZDb250ZXh0LmdldFRhcmdldFBvcygpOwotCQlpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvckFueVJ1bGUoKTsKLQkJfSBlbHNlIGlmICgodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NNZWRpYVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NBZnRlck9mKENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpKSB8fCAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NCZWZvcmVPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yQW55UnVsZSgpOwotCQkJLy8JCWJ1aWxkUHJvcG9zYWxzRm9yU3R5bGVSdWxlKCk7Ci0JCX0gZWxzZSBpZiAoKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NCZWZvcmVPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yUGFnZVJ1bGVQc2V1ZG9DbGFzcygpOwotCQl9IGVsc2UgaWYgKCh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8IHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUgfHwgdGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSAmJiAodGFyZ2V0Tm9kZS5nZXRPd25lckRvY3VtZW50KCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbiB8fCBmQ29udGV4dC50YXJnZXRGb2xsb3dzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHx8IGZDb250ZXh0LnRhcmdldEZvbGxvd3MoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkpKSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uTmFtZSgpOwotCQl9IGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJaWYgKGZDb250ZXh0LmlzVGFyZ2V0UG9zQWZ0ZXJPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSkgewotCQkJCWJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uTmFtZSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOwotCQl9Ci0JCS8qCi0JCSAqIGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUgfHwgKCh0YXJnZXROb2RlCi0JCSAqIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8Ci0JCSAqIHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbiB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YKLQkJICogSUNTU1N0eWxlRGVjbEl0ZW0pICYmCi0JCSAqIGZDb250ZXh0LmlzVGFyZ2V0UG9zQWZ0ZXJPZihDU1NSZWdpb25Db250ZXh0cy5DT0xPTikpKSB7Ci0JCSAqIGJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOyB9Ci0JCSAqLwotCi0JCS8vIGZvciBUZXN0Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JBbnlSdWxlKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnKGZDb250ZXh0KTsKLQkJZlByb3Bvc2Fscy5hZGRBbGwoZ2VuZXJhdG9yLmdldFByb3Bvc2FscygpKTsKLQkJZ2VuZXJhdG9yID0gbmV3IENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25OYW1lKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uTmFtZShmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JEZWNsYXJhdGlvblZhbHVlKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yUGFnZVJ1bGVQc2V1ZG9DbGFzcygpIHsKLQkJQ1NTUHJvcG9zYWxHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvcihmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JTdHlsZVJ1bGUoKSB7Ci0JCUNTU1Byb3Bvc2FsR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQkJZ2VuZXJhdG9yID0gbmV3IENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZyhmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yKGZDb250ZXh0KTsKLQkJZlByb3Bvc2Fscy5hZGRBbGwoZ2VuZXJhdG9yLmdldFByb3Bvc2FscygpKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscygpIHsKLQkJYnVpbGRQcm9wb3NhbHMoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FsQXJyYXkgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsW2ZQcm9wb3NhbHMuc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaUl0ZW0gPSBmUHJvcG9zYWxzLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpSXRlbS5oYXNOZXh0KCk7IGkrKykgewotCQkJcHJvcG9zYWxBcnJheVtpXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSBpSXRlbS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsQXJyYXk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTIxNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLWFic3RyYWN0IGNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCi0JcHJvdGVjdGVkIGNsYXNzIFN0cmluZ0FuZE9mZnNldCB7Ci0JCVN0cmluZ0FuZE9mZnNldChTdHJpbmcgc3RyaW5nLCBpbnQgb2Zmc2V0KSB7Ci0JCQl0aGlzLmZTdHJpbmcgPSBzdHJpbmc7Ci0JCQl0aGlzLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCX0KLQotCQlTdHJpbmcgZlN0cmluZzsKLQkJaW50IGZPZmZzZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGZDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9wb3NhbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NQcm9wb3NhbEdlbmVyYXRvcihDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZkNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrTGVhZGluZ0NvbG9uKCkgewotCQlib29sZWFuIGhhc0xlYWRpbmdDb2xvbiA9IGZhbHNlOwotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJaWYgKHRhcmdldFJlZ2lvbiA9PSBudWxsICYmIDAgPCBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKSkgewotCQkJdGFyZ2V0UmVnaW9uID0gZkNvbnRleHQuZ2V0UmVnaW9uQnlPZmZzZXQoZkNvbnRleHQuZ2V0Q3Vyc29yUG9zKCkgLSAxKTsKLQkJCWlmICh0YXJnZXRSZWdpb24gIT0gbnVsbCAmJiB0YXJnZXRSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pIHsKLQkJCQloYXNMZWFkaW5nQ29sb24gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBCVUcgOTI4NDggLSBDaGFuZ2VkIGhvdyBwc2V1ZG8tc2VsZWN0b3JzIGFyZSBkZWZpbmVkIGluIHRoZQotCQkJLy8gdG9rZW5pemVyCi0JCQkvLyBUaGUgdGFyZ2V0IHJlZ2lvbiBzaG91bGQgYmUgdGhlIENTU19TRUxFQ1RPUl9QU0VVRE8gbm93Ci0JCQlpZiAodGFyZ2V0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPKSB7Ci0JCQkJaGFzTGVhZGluZ0NvbG9uID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFzTGVhZGluZ0NvbG9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdBbmRPZmZzZXQgZ2VuZXJhdGVCcmFjZXMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZkNvbnRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBpbmRlbnRTdHIgPSBnZXRJbmRlbnRTdHJpbmcoKTsKLQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UpKSB7Ci0JCQlidWYuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQl9Ci0JCWJ1Zi5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FKSkgewotCQkJYnVmLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJCWJ1Zi5hcHBlbmQoaW5kZW50U3RyKTsKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaW50IG9mZnNldCA9IGJ1Zi5sZW5ndGgoKTsKLQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpKSB7Ci0JCQlidWYuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQl9IGVsc2UgewotCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlidWYuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFN0cmluZ0FuZE9mZnNldChidWYudG9TdHJpbmcoKSwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQW5kT2Zmc2V0IGdlbmVyYXRlUGFyZW50aGVzaXMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBvZmZzZXQ7Ci0JCWJ1Zi5hcHBlbmQoIigiKTsvLyROT04tTkxTLTEkCi0JCW9mZnNldCA9IDE7Ci0JCWJ1Zi5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgU3RyaW5nQW5kT2Zmc2V0KGJ1Zi50b1N0cmluZygpLCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdBbmRPZmZzZXQgZ2VuZXJhdGVRdW90ZXMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXIgcXVvdGVDaGFyID0gZ2V0UXVvdGVDaGFyKCk7Ci0JCWJ1Zi5hcHBlbmQocXVvdGVDaGFyKTsKLQkJYnVmLmFwcGVuZChxdW90ZUNoYXIpOwotCQlyZXR1cm4gbmV3IFN0cmluZ0FuZE9mZnNldChidWYudG9TdHJpbmcoKSwgMSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0FuZE9mZnNldCBnZW5lcmF0ZVNlbWljb2xvbigpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG9mZnNldDsKLQkJYnVmLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJb2Zmc2V0ID0gMDsKLQkJcmV0dXJuIG5ldyBTdHJpbmdBbmRPZmZzZXQoYnVmLnRvU3RyaW5nKCksIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0FuZE9mZnNldCBnZW5lcmF0ZVVSSSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlib29sZWFuIGlzUXVvdGVJblVSSSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URV9JTl9VUkkpOwotCQljaGFyIHF1b3RlQ2hhciA9IGdldFF1b3RlQ2hhcigpOwotCQlidWYuYXBwZW5kKCJ1cmwoIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoaXNRdW90ZUluVVJJKSB7Ci0JCQlidWYuYXBwZW5kKHF1b3RlQ2hhcik7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGJ1Zi5sZW5ndGgoKTsKLQkJaWYgKGlzUXVvdGVJblVSSSkgewotCQkJYnVmLmFwcGVuZChxdW90ZUNoYXIpOwotCQl9Ci0JCWJ1Zi5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgU3RyaW5nQW5kT2Zmc2V0KGJ1Zi50b1N0cmluZygpLCBvZmZzZXQpOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCk7Ci0KLQlMaXN0IGdldFByb3Bvc2FscygpIHsKLQkJTGlzdCBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQ1NTSW1hZ2VIZWxwZXIgaW1hZ2VIZWxwZXIgPSBDU1NJbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gZ2V0Q2FuZGlkYXRlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGNhbmRpZGF0ZSA9IChDU1NDQUNhbmRpZGF0ZSkgaS5uZXh0KCk7Ci0JCQlJbWFnZSBpbWFnZSA9IGltYWdlSGVscGVyLmdldEltYWdlKGNhbmRpZGF0ZS5nZXRJbWFnZVR5cGUoKSk7Ci0JCQlJQ29tcGxldGlvblByb3Bvc2FsIGl0ZW0gPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsKGNhbmRpZGF0ZS5nZXRSZXBsYWNlbWVudFN0cmluZygpLCBmQ29udGV4dC5nZXRSZXBsYWNlQmVnaW4oKSArIGZDb250ZXh0LmdldERvY3VtZW50T2Zmc2V0KCksIGZDb250ZXh0LmdldFRleHRUb1JlcGxhY2UoKS5sZW5ndGgoKSwgY2FuZGlkYXRlLmdldEN1cnNvclBvc2l0aW9uKCksIGltYWdlLCBjYW5kaWRhdGUuZ2V0RGlzcGxheVN0cmluZygpLCBudWxsLCBudWxsKTsKLQkJCXByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gY2hhcgotCSAqLwotCXByaXZhdGUgY2hhciBnZXRRdW90ZUNoYXIoKSB7Ci0KLQkJU3RyaW5nIHF1b3RlU3RyID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQljaGFyIHF1b3RlQ2hhciA9IChxdW90ZVN0ciAhPSBudWxsICYmIDAgPCBxdW90ZVN0ci5sZW5ndGgoKSkgPyBxdW90ZVN0ci5jaGFyQXQoMCkgOiAnIic7Ci0JCWNoYXIgYXR0clF1b3RlID0gZkNvbnRleHQuZ2V0UXVvdGVPZlN0eWxlQXR0cmlidXRlKCk7Ci0JCWlmIChhdHRyUXVvdGUgIT0gMCkgewotCQkJaWYgKGF0dHJRdW90ZSA9PSAnIicgJiYgcXVvdGVDaGFyID09ICciJykgewotCQkJCXF1b3RlQ2hhciA9ICdcJyc7Ci0JCQl9IGVsc2UgaWYgKGF0dHJRdW90ZSA9PSAnXCcnICYmIHF1b3RlQ2hhciA9PSAnXCcnKSB7Ci0JCQkJcXVvdGVDaGFyID0gJyInOwotCQkJfQotCQl9Ci0JCXJldHVybiBxdW90ZUNoYXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgdGV4dCkgewotCQlTdHJpbmcgdGV4dFRvQ29tcGFyZSA9IGZDb250ZXh0LmdldFRleHRUb0NvbXBhcmUoKTsKLQkJaWYgKHRleHRUb0NvbXBhcmUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKHRleHQudG9VcHBlckNhc2UoKS5pbmRleE9mKHRleHRUb0NvbXBhcmUudG9VcHBlckNhc2UoKSkgPT0gMCk7Ci0JCX0KLQkJLyoKLQkJICogU3RyaW5nIHRleHRUb1JlcGxhY2UgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCk7IGlmCi0JCSAqICh0ZXh0VG9SZXBsYWNlLmxlbmd0aCgpID09IDApIHsgcmV0dXJuIHRydWU7IH0gZWxzZSB7IHJldHVybgotCQkgKiAodGV4dC50b1VwcGVyQ2FzZSgpLmluZGV4T2YodGV4dFRvUmVwbGFjZS50b1VwcGVyQ2FzZSgpKSA9PSAwKTsgfQotCQkgKi8KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yQXRtYXJrUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmEwMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuU2VsZWN0aW9uQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1jbGFzcyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUgZXh0ZW5kcyBDU1NQcm9wb3NhbEdlbmVyYXRvciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlVzZVVwcGVyQ2FzZSA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUID0gIkBjaGFyc2V0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTlRfRkFDRSA9ICJAZm9udC1mYWNlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVCA9ICJAaW1wb3J0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBID0gIkBtZWRpYSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFID0gIkBwYWdlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDU1NBdG1hcmtSdWxlUHJvcG9zYWxHZW5lcmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0KTsKLQkJZlVzZVVwcGVyQ2FzZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIENTU0NBQ2FuZGlkYXRlIGdldENhbmRpZGF0ZUNoYXJzZXRSdWxlKCkgewotCQkvLyBjaGVjayBjb250ZW50IG1vZGVsCi0JCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJaWYgKCF1dGlsLmNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9DSEFSU0VUX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBlbWJlZGRlZCBvciBub3QKLQkJaWYgKGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgY2FyZXQgcHJlY2VkZSBhbGwgb3RoZXIgcnVsZXMuCi0JCWludCBvZmZzZXQgPSBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKTsKLQkJaWYgKDAgPCBvZmZzZXQpIHsKLQkJCVNlbGVjdGlvbkNvbGxlY3RvciB0cmF2ID0gbmV3IFNlbGVjdGlvbkNvbGxlY3RvcigpOwotCQkJdHJhdi5zZXRSZWdpb24oMCwgb2Zmc2V0IC0gMSk7Ci0JCQl0cmF2LmFwcGx5KGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJdGVyYXRvciBpID0gdHJhdi5nZXRTZWxlY3RlZE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU05vZGUgJiYgIShvYmogaW5zdGFuY2VvZiBJQ1NTRG9jdW1lbnQpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSAwOwotCQlTdHJpbmcgaWRlbnQgPSAoZlVzZVVwcGVyQ2FzZSkgPyBDSEFSU0VULnRvVXBwZXJDYXNlKCkgOiBDSEFSU0VULnRvTG93ZXJDYXNlKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoaWRlbnQpOwotCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCk7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlUXVvdGVzKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0JCXNhbyA9IGdlbmVyYXRlU2VtaWNvbG9uKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCi0JCVN0cmluZyB0ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKGlzTWF0Y2godGV4dCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcodGV4dCk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfQ0hBUlNFVCk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ0FDYW5kaWRhdGUgZ2V0Q2FuZGlkYXRlRm9udEZhY2VSdWxlKCkgewotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCWlmICghdXRpbC5jb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfRk9OVF9GQUNFX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJU3RyaW5nIGlkZW50ID0gKGZVc2VVcHBlckNhc2UpID8gRk9OVF9GQUNFLnRvVXBwZXJDYXNlKCkgOiBGT05UX0ZBQ0UudG9Mb3dlckNhc2UoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChpZGVudCk7Ci0JCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJU3RyaW5nQW5kT2Zmc2V0IHNhbzsKLQkJc2FvID0gZ2VuZXJhdGVCcmFjZXMoKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQotCQlTdHJpbmcgdGV4dCA9IGJ1Zi50b1N0cmluZygpOwotCi0JCWlmIChpc01hdGNoKHRleHQpKSB7Ci0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyhpZGVudCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuUlVMRV9GT05URkFDRSk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ0FDYW5kaWRhdGUgZ2V0Q2FuZGlkYXRlSW1wb3J0UnVsZSgpIHsKLQkJLy8gY2hlY2sgY29udGVudCBtb2RlbAotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCWlmICghdXRpbC5jb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfSU1QT1JUX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBjaGFyc2V0IGFuZCBpbXBvcnQgY2FuIHByZWNlZGUgaW1wb3J0IHJ1bGUuCi0JCWludCBvZmZzZXQgPSBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKTsKLQkJaWYgKDAgPCBvZmZzZXQpIHsKLQkJCVNlbGVjdGlvbkNvbGxlY3RvciB0cmF2ID0gbmV3IFNlbGVjdGlvbkNvbGxlY3RvcigpOwotCQkJdHJhdi5zZXRSZWdpb24oMCwgb2Zmc2V0IC0gMSk7Ci0JCQl0cmF2LmFwcGx5KGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJdGVyYXRvciBpID0gdHJhdi5nZXRTZWxlY3RlZE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU05vZGUgJiYgIShvYmogaW5zdGFuY2VvZiBJQ1NTRG9jdW1lbnQgfHwgb2JqIGluc3RhbmNlb2YgSUNTU0NoYXJzZXRSdWxlIHx8IG9iaiBpbnN0YW5jZW9mIElDU1NJbXBvcnRSdWxlKSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJU3RyaW5nIGlkZW50ID0gKGZVc2VVcHBlckNhc2UpID8gSU1QT1JULnRvVXBwZXJDYXNlKCkgOiBJTVBPUlQudG9Mb3dlckNhc2UoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChpZGVudCk7Ci0JCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJU3RyaW5nQW5kT2Zmc2V0IHNhbzsKLQkJc2FvID0gZ2VuZXJhdGVVUkkoKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQkJc2FvID0gZ2VuZXJhdGVTZW1pY29sb24oKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0KLQkJU3RyaW5nIHRleHQgPSBidWYudG9TdHJpbmcoKTsKLQotCQlpZiAoaXNNYXRjaCh0ZXh0KSkgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfSU1QT1JUKTsKLQkJCXJldHVybiBpdGVtOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDQUNhbmRpZGF0ZSBnZXRDYW5kaWRhdGVNZWRpYVJ1bGUoKSB7Ci0JCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJaWYgKCF1dGlsLmNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9NRURJQV9SVUxFKS5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCVN0cmluZyBpZGVudCA9IChmVXNlVXBwZXJDYXNlKSA/IE1FRElBLnRvVXBwZXJDYXNlKCkgOiBNRURJQS50b0xvd2VyQ2FzZSgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGlkZW50KTsKLQkJYnVmLmFwcGVuZCgiICAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKSAtIDE7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCi0JCVN0cmluZyB0ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKGlzTWF0Y2godGV4dCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmLnRvU3RyaW5nKCkpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKGlkZW50KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5SVUxFX01FRElBKTsKLQkJCXJldHVybiBpdGVtOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDQUNhbmRpZGF0ZSBnZXRDYW5kaWRhdGVQYWdlUnVsZSgpIHsKLQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQlpZiAoIXV0aWwuY29sbGVjdE5vZGVzQnlUeXBlKENTU01NTm9kZS5UWVBFX1BBR0VfUlVMRSkuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSAwOwotCQlTdHJpbmcgaWRlbnQgPSAoZlVzZVVwcGVyQ2FzZSkgPyBQQUdFLnRvVXBwZXJDYXNlKCkgOiBQQUdFLnRvTG93ZXJDYXNlKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoaWRlbnQpOwotCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCk7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0KLQkJU3RyaW5nIHRleHQgPSBidWYudG9TdHJpbmcoKTsKLQotCQlpZiAoaXNNYXRjaCh0ZXh0KSkgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfUEFHRSk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2FuZGlkYXRlcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2FuZGlkYXRlcygpIHsKLQkJTGlzdCBjYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvblByZXZpb3VzKCk7Ci0JCS8vCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZDb250ZXh0LmdldFNpZ25pZmljYW50VGFyZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCQkJfQotCQl9Ci0KLQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbTsKLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlSW1wb3J0UnVsZSgpKSAhPSBudWxsKSB7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCQlpZiAoKGl0ZW0gPSBnZXRDYW5kaWRhdGVDaGFyc2V0UnVsZSgpKSAhPSBudWxsKSB7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCQlpZiAoKGl0ZW0gPSBnZXRDYW5kaWRhdGVNZWRpYVJ1bGUoKSkgIT0gbnVsbCkgewotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlUGFnZVJ1bGUoKSkgIT0gbnVsbCkgewotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlRm9udEZhY2VSdWxlKCkpICE9IG51bGwpIHsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjg5MDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLQotY2xhc3MgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUgZXh0ZW5kcyBDU1NQcm9wb3NhbEdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDYW5kaWRhdGVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCkgewotCQlMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHByZURlbGltID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7IGkrKykgewotCQkJcHJlRGVsaW0gKz0gJyAnOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgcG9zdERlbGltID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0pOyBpKyspIHsKLQkJCXBvc3REZWxpbSArPSAnICc7Ly8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJYm9vbGVhbiBiRm9udFJ1bGUgPSBmYWxzZTsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gdGFyZ2V0Tm9kZTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZSkgewotCQkJCWJGb250UnVsZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCUl0ZXJhdG9yIGlOYW1lcyA9IHV0aWwuY29sbGVjdE5vZGVzQnlUeXBlKChiRm9udFJ1bGUpID8gQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUiA6IENTU01NTm9kZS5UWVBFX1BST1BFUlRZKTsKLQkJd2hpbGUgKGlOYW1lcy5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaU5hbWVzLm5leHQoKTsKLQkJCW5hbWVzLmFkZChub2RlKTsKLQkJfQotCQlzb3J0TmFtZXMobmFtZXMpOwotCQkvLyBDb2xsZWN0aW9ucy5zb3J0KG5hbWVzKTsKLQotCQlib29sZWFuIGJBZGRDb2xvbiA9IHRydWU7Ci0JCWlmICgodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUgfHwgdGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtIHx8IHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbikgJiYgZkNvbnRleHQudGFyZ2V0SGFzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpKSB7Ci0JCQliQWRkQ29sb24gPSBmYWxzZTsKLQkJfQotCi0JCUl0ZXJhdG9yIGkgPSBuYW1lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJdGV4dCA9IChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpID8gdGV4dC50b1VwcGVyQ2FzZSgpIDogdGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKCFpc01hdGNoKHRleHQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWludCBjdXJzb3JQb3MgPSAwOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJ1Zi5hcHBlbmQodGV4dCk7Ci0JCQlidWYuYXBwZW5kKHByZURlbGltKTsKLQkJCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJCWlmIChiQWRkQ29sb24pIHsKLQkJCQlidWYuYXBwZW5kKCc6Jyk7Ly8kTk9OLU5MUy0xJAotCQkJCWJ1Zi5hcHBlbmQocG9zdERlbGltKTsKLQkJCQljdXJzb3JQb3MgKz0gMSArIHBvc3REZWxpbS5sZW5ndGgoKTsKLQkJCX0KLQkJCS8vIGlmICghICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pKSB7Ci0JCQkvLyBidWYuYXBwZW5kKCc7Jyk7Ly8kTk9OLU5MUy0xJAotCQkJLy8gfQotCi0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyh0ZXh0KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKGdldENhdGVnb3J5SW1hZ2VUeXBlKG5vZGUpKTsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQl2b2lkIHNvcnROYW1lcyhMaXN0IG5hbWVzKSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmFtZXMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJQ1NTTU1Ob2RlIG5vZGUxID0gKENTU01NTm9kZSkgbzE7Ci0JCQkJQ1NTTU1Ob2RlIG5vZGUyID0gKENTU01NTm9kZSkgbzI7Ci0JCQkJaWYgKG5vZGUxID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfSBlbHNlIGlmIChub2RlMiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJaW50IGRpZmYgPSAwOwotCQkJCVN0cmluZyBjYXRlZ29yeTEgPSBub2RlMS5nZXRBdHRyaWJ1dGUoImNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgY2F0ZWdvcnkyID0gbm9kZTIuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGNhdGVnb3J5MSA9PSBudWxsKSB7Ci0JCQkJCWlmIChjYXRlZ29yeTIgPT0gbnVsbCkgewotCQkJCQkJZGlmZiA9IDA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoY2F0ZWdvcnkyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpZmYgPSBjYXRlZ29yeTEuY29tcGFyZVRvKGNhdGVnb3J5Mik7Ci0JCQkJfQotCQkJCWlmIChkaWZmID09IDApIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBub2RlMS5nZXROYW1lKCk7Ci0JCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIG5hbWUuY29tcGFyZVRvKG5vZGUyLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZGlmZjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogcmV0cmlldmUgZGVmYXVsdCBjYXRlZ29yeSBpY29uIG5hbWUgVE9ETzogaWYgbm9kZSBoYXMgImljb24iKD8pLCB1c2UKLQkgKiBpdC4KLQkgKi8KLQlDU1NJbWFnZVR5cGUgZ2V0Q2F0ZWdvcnlJbWFnZVR5cGUoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJQ1NTSW1hZ2VUeXBlIGltYWdlVHlwZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjYXRlZ29yeSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJCWltYWdlVHlwZSA9IENTU0ltYWdlVHlwZS5nZXRJbWFnZVR5cGUoY2F0ZWdvcnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoaW1hZ2VUeXBlID09IG51bGwpID8gQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0RFRkFVTFQgOiBpbWFnZVR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvblZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkOTkzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTnVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTRnVuY3Rpb25JRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci0KLWNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZSBleHRlbmRzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRBTlQgPSAiIWltcG9ydGFudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gZlVzZVVwcGVyQ2FzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkFwcGVuZFNlbWlDb2xvbjsKLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZShDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKGNvbnRleHQpOwotCQlmVXNlVXBwZXJDYXNlID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRnVuY3Rpb24oTGlzdCBjYW5kaWRhdGVzLCBDU1NNTUZ1bmN0aW9uIHByb3ApIHsKLQkJU3RyaW5nIHRleHQgPSBwcm9wLnRvU3RyaW5nKCk7Ci0JCWlmICghaXNNYXRjaCh0ZXh0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChwcm9wLmdldE5hbWUoKS5lcXVhbHMoQ1NTRnVuY3Rpb25JRC5GX1VSSSkpIHsKLQkJCVN0cmluZ0FuZE9mZnNldCBzYW8gPSBnZW5lcmF0ZVVSSSgpOwotCQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCQljdXJzb3JQb3MgPSBzYW8uZk9mZnNldDsKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQocHJvcC50b1N0cmluZygpKTsKLQkJCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJCVN0cmluZ0FuZE9mZnNldCBzYW8gPSBnZW5lcmF0ZVBhcmVudGhlc2lzKCk7Ci0JCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQkJfQotCi0JCXRleHQgPSBidWYudG9TdHJpbmcoKTsKLQkJdGV4dCA9IChmVXNlVXBwZXJDYXNlKSA/IHRleHQudG9VcHBlckNhc2UoKSA6IHRleHQudG9Mb3dlckNhc2UoKTsKLQotCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcodGV4dCk7Ci0JCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuVkFMVUVfRlVOQ1RJT04pOwotCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTnVtYmVyKExpc3QgY2FuZGlkYXRlcywgQ1NTTU1OdW1iZXIgcHJvcCkgewotCQlTdHJpbmcgZnVsbFRleHQgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCk7Ci0JCS8vIHNraXAgbnVtYmVyCi0JCWludCB1bml0SW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsVGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoZnVsbFRleHQuY2hhckF0KGkpKSkgewotCQkJCXVuaXRJbmRleCA9IGkgKyAxOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyB1bml0U3ViVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBudW1TdWJUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKDAgPD0gdW5pdEluZGV4KSB7Ci0JCQludW1TdWJUZXh0ID0gZnVsbFRleHQuc3Vic3RyaW5nKDAsIHVuaXRJbmRleCk7Ci0JCQlpZiAodW5pdEluZGV4IDwgZnVsbFRleHQubGVuZ3RoKCkpIHsKLQkJCQl1bml0U3ViVGV4dCA9IGZ1bGxUZXh0LnN1YnN0cmluZyh1bml0SW5kZXgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdW5pdFN1YlRleHQgPSBmdWxsVGV4dDsKLQkJfQotCi0JCUl0ZXJhdG9yIGkgPSBwcm9wLmdldERlc2NlbmRhbnRzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Vbml0IHVuaXQgPSAoQ1NTTU1Vbml0KSBpLm5leHQoKTsKLQkJCVN0cmluZyB1bml0U3RyaW5nID0gdW5pdC5nZXRVbml0U3RyaW5nKCk7Ci0JCQlpZiAoKDAgPCB1bml0U3ViVGV4dC5sZW5ndGgoKSAmJiB1bml0U3RyaW5nLmluZGV4T2YodW5pdFN1YlRleHQpICE9IDApIHx8ICgwIDwgbnVtU3ViVGV4dC5sZW5ndGgoKSAmJiB1bml0U3RyaW5nLmVxdWFscygiIyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCVN0cmluZyB0ZXh0ID0gbnVtU3ViVGV4dCArIHVuaXRTdHJpbmc7Ci0JCQl0ZXh0ID0gKGZVc2VVcHBlckNhc2UpID8gdGV4dC50b1VwcGVyQ2FzZSgpIDogdGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyh0ZXh0KTsKLQkJCWlmICgwIDwgbnVtU3ViVGV4dC5sZW5ndGgoKSB8fCB0ZXh0LmVxdWFscygiIyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKHRleHQubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKDApOwotCQkJfQotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlZBTFVFX05VTUJFUik7Ci0JCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tTZW1pQ29sb24oKSB7Ci0JCWZBcHBlbmRTZW1pQ29sb24gPSBmYWxzZTsKLQotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsICYmIHRhcmdldFJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJLy8gZmluZCB0cmFpbGluZyAiOiIgb3IgIjsiCi0JCQkvLyBpZiAiOiIgYmVmb3JlICI7IiBpcyBmb3VuZCwgYWRkICI7IgotCQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBmQ29udGV4dC5nZXRSZWdpb25JdGVyYXRvcigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIgPSBpdGVyYXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGl0ZXJhdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IGNvbnRhaW5lcikgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUikgewotCQkJCQlmQXBwZW5kU2VtaUNvbG9uID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmQXBwZW5kU2VtaUNvbG9uKSB7Ci0JCQkJLy8gc2Vjb25kIGNoYW5jZToKLQkJCQkvLyBsZWFkaW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgbm90ICI7IgotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IENTU1V0aWwuZmluZE5leHRTaWduaWZpY2FudE5vZGUoY29udGFpbmVyKTsKLQkJCQlpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkJZkFwcGVuZFNlbWlDb2xvbiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRTZW1pQ29sb24oQ1NTQ0FDYW5kaWRhdGUgaXRlbSkgewotCQlpZiAoZkFwcGVuZFNlbWlDb2xvbikgewotCQkJU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nID0gaXRlbS5nZXRSZXBsYWNlbWVudFN0cmluZygpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhyZXBsYWNlbWVudFN0cmluZyArICI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBjdXJzb3JQb3NpdGlvbiA9IGl0ZW0uZ2V0Q3Vyc29yUG9zaXRpb24oKTsKLQkJCWlmIChyZXBsYWNlbWVudFN0cmluZy5sZW5ndGgoKSA8PSBjdXJzb3JQb3NpdGlvbikgewotCQkJCS8vIGN1cnNvcnBvcyBpcyB0YWlsIG9mIHN0cmluZwotCQkJCWN1cnNvclBvc2l0aW9uKys7Ci0JCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3NpdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbWlDb2xvbihMaXN0IGNhbmRpZGF0ZXMpIHsKLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJSUNTU05vZGUgZmlyc3RDaGlsZCA9IHRhcmdldE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChmaXJzdENoaWxkIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZmlyc3RDaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpZiAoZkNvbnRleHQuZ2V0Q3Vyc29yUG9zKCkgPD0gc3RhcnRPZmZzZXQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gYkFkZENsb3NlciA9IGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvbigpOwotCQlpZiAodGFyZ2V0UmVnaW9uICE9IG51bGwgJiYgdGFyZ2V0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkvLyBmaW5kIHRyYWlsaW5nICI6IiBvciAiOyIKLQkJCS8vIGlmICI6IiBiZWZvcmUgIjsiIGlzIGZvdW5kLCBhZGQgIjsiCi0JCQlSZWdpb25JdGVyYXRvciBpdGVyYXRvciA9IGZDb250ZXh0LmdldFJlZ2lvbkl0ZXJhdG9yKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRhaW5lciA9IGl0ZXJhdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoaXRlcmF0b3IuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gY29udGFpbmVyKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJCWJBZGRDbG9zZXIgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWJBZGRDbG9zZXIpIHsKLQkJCQkvLyBzZWNvbmQgY2hhbmNlOgotCQkJCS8vIGxlYWRpbmcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBub3QgIjsiCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShjb250YWluZXIpOwotCQkJCWlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCQliQWRkQ2xvc2VyID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYkFkZENsb3NlcikgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJU3RyaW5nIHRleHQgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCkgKyAiOyI7Ly8kTk9OLU5MUy0xJAotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyh0ZXh0KTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24odGV4dC5sZW5ndGgoKSk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoIjsiKTsvLyROT04tTkxTLTEkCi0JCQlpdGVtLnNldEltYWdlVHlwZShudWxsKTsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdHJpbmcoTGlzdCBjYW5kaWRhdGVzLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoIWlzTWF0Y2godGV4dCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRleHQgPSAoZlVzZVVwcGVyQ2FzZSkgPyB0ZXh0LnRvVXBwZXJDYXNlKCkgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0KLQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKHRleHQpOwotCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKHRleHQubGVuZ3RoKCkpOwotCQlpdGVtLnNldERpc3BsYXlTdHJpbmcodGV4dCk7Ci0JCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5WQUxVRV9TVFJJTkcpOwotCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJbXBvcnRhbnQoTGlzdCBjYW5kaWRhdGVzKSB7Ci0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCXdoaWxlICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIDEuIGhhcyBubyBwcmlvcml0eSByZWdpb24KLQkJLy8gMi4gY3Vyc29yIHBvc2l0aW9uIGlzIGFmdGVyIG9mIGxhc3QgY2hpbGQKLQkJLy8gMy4gbm9ybWFsIGlzTWF0Y2ggbWV0aG9kCi0JCVN0cmluZyBwcmlvcml0eSA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIHRhcmdldE5vZGUpLmdldFByaW9yaXR5KCk7Ci0JCWlmIChwcmlvcml0eSA9PSBudWxsIHx8IHByaW9yaXR5Lmxlbmd0aCgpID09IDApIHsKLQkJCUlDU1NOb2RlIGxhc3RDaGlsZCA9IHRhcmdldE5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpZiAobGFzdENoaWxkIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCWludCBzdGFydE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbGFzdENoaWxkKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCS8vCWludCBlbmRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pbGFzdENoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlpZiAoc3RhcnRPZmZzZXQgPCBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKSAmJiBpc01hdGNoKElNUE9SVEFOVCkpIHsKLQkJCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKElNUE9SVEFOVCk7Ci0JCQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oSU1QT1JUQU5ULmxlbmd0aCgpKTsKLQkJCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKElNUE9SVEFOVCk7Ci0JCQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5WQUxVRV9TVFJJTkcpOwotCQkJCQlhcHBlbmRTZW1pQ29sb24oaXRlbSk7Ci0JCQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldENhbmRpZGF0ZXMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENhbmRpZGF0ZXMoKSB7Ci0JCUxpc3QgY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQljaGVja1NlbWlDb2xvbigpOyAvLyBjaGVjayBzaG91bGQgYWRkIHNlbWktY29sb24gb3Igbm90Ci0KLQkJU3RyaW5nIG5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUoKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQkJSXRlcmF0b3IgaSA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCWlmIChpc0ZvbnRGYWNlUnVsZSgpKSB7Ci0JCQkJQ1NTTU1EZXNjcmlwdG9yIGRlc2MgPSB1dGlsLmdldERlc2NyaXB0b3IobmFtZSk7Ci0JCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQlpID0gZGVzYy5nZXRWYWx1ZXMoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUNTU01NUHJvcGVydHkgcHJvcCA9IHV0aWwuZ2V0UHJvcGVydHkobmFtZSk7Ci0JCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCQlpID0gcHJvcC5nZXRWYWx1ZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGUgdmFsID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHZhbHVlVHlwZSA9IHZhbC5nZXRUeXBlKCk7Ci0JCQkJaWYgKHZhbHVlVHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9LRVlXT1JEKSB7Ci0JCQkJCWFkZFN0cmluZyhjYW5kaWRhdGVzLCB2YWwudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfTlVNQkVSKSB7Ci0JCQkJCWFkZE51bWJlcihjYW5kaWRhdGVzLCAoQ1NTTU1OdW1iZXIpIHZhbCk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfRlVOQ1RJT04pIHsKLQkJCQkJYWRkRnVuY3Rpb24oY2FuZGlkYXRlcywgKENTU01NRnVuY3Rpb24pIHZhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYWRkSW1wb3J0YW50KGNhbmRpZGF0ZXMpOwotCQlhZGRTZW1pQ29sb24oY2FuZGlkYXRlcyk7Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCXdoaWxlICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJcmV0dXJuICgoSUNTU1N0eWxlRGVjbEl0ZW0pIHRhcmdldE5vZGUpLmdldFByb3BlcnR5TmFtZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRm9udEZhY2VSdWxlKCkgewotCQlJQ1NTTm9kZSB0YXJnZXROb2RlID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQl3aGlsZSAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgewotCQkJdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCXRhcmdldE5vZGUgPSB0YXJnZXROb2RlLmdldFBhcmVudE5vZGUoKTsgLy8gZ2V0IERlY2xhcmF0aW9uCi0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gaW5saW5lIHN0eWxlIGhhcyBubyBydWxlIG5vZGUKLQkJCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7IC8vIGdldCBydWxlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICh0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckhUTUxUYWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjI4YzE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZyBleHRlbmRzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCS8qKgotCSAqIENTU1N0eWxlUnVsZVByb3Bvc2FsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnKENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoY29udGV4dCk7Ci0KLQkJaWYgKGZIVE1MVGFncyA9PSBudWxsKSB7Ci0JCQlmSFRNTFRhZ3MgPSBzZXR1cEhUTUxUYWdzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRDYW5kaWRhdGVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCkgewotCQlMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKGNoZWNrTGVhZGluZ0NvbG9uKCkpIHsKLQkJCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQkvLyBYSFRNTCByZXF1aXJlcyBsb3dlciBjYXNlCi0JCWJvb2xlYW4gYkxvd2VyQ2FzZSA9IGZhbHNlOwotCQlpZiAoZkNvbnRleHQuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJTm9kZSBkb21Ob2RlID0gZkNvbnRleHQuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKTsKLQkJCWlmIChkb21Ob2RlICE9IG51bGwgJiYgIShkb21Ob2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0JCQkJZG9tTm9kZSA9IGRvbU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCWlmIChkb21Ob2RlIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSB7Ci0JCQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgZG9tTm9kZSkuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJCWJMb3dlckNhc2UgPSAoYWRhcHRlci5nZXRUYWdOYW1lQ2FzZSgpID09IERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQotCQlpbnQgbGVuZ3RoID0gZkhUTUxUYWdzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHRhZ1RleHQgPSBmSFRNTFRhZ3NbaV07Ci0JCQlpZiAoYkxvd2VyQ2FzZSkgewotCQkJCXRhZ1RleHQgPSB0YWdUZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQlpZiAoIWlzTWF0Y2godGFnVGV4dCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYnVmLmFwcGVuZCh0YWdUZXh0KTsKLQkJCWN1cnNvclBvcyArPSB0YWdUZXh0Lmxlbmd0aCgpOwotCQkJYm9vbGVhbiBpblJ1bGUgPSAoZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSk7Ci0JCQlpZiAoIWluUnVsZSB8fCBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQkJY3Vyc29yUG9zICs9IDE7Ci0JCQl9Ci0JCQlpZiAoIWluUnVsZSkgewotCQkJCVN0cmluZ0FuZE9mZnNldCBzYW8gPSBnZW5lcmF0ZUJyYWNlcygpOwotCQkJCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQkJCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQkJCX0KLQotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcodGFnVGV4dCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuU0VMRUNUT1JfVEFHKTsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc2V0dXBIVE1MVGFncygpIHsKLQkJQ01Eb2N1bWVudCBjbWRvYyA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBjbWRvYy5nZXRFbGVtZW50cygpOwotCQlWZWN0b3IgbmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCWludCBuRWxlbWVudHMgPSBlbGVtZW50cy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuRWxlbWVudHM7IGkrKykgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlYyA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuaXRlbShpKTsKLQkJCWlmIChpc0F0dHJEZWZpbmVkKGVkZWMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpKSB7Ci0JCQkJbmFtZXMuYWRkKGVkZWMuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChuYW1lcyk7Ci0JCVN0cmluZ1tdIHRhZ3MgPSBuZXcgU3RyaW5nW25hbWVzLnNpemUoKV07Ci0JCUl0ZXJhdG9yIGlOYW1lcyA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpTmFtZXMuaGFzTmV4dCgpOyBpKyspIHsKLQkJCXRhZ3NbaV0gPSAoU3RyaW5nKSBpTmFtZXMubmV4dCgpOwotCQl9Ci0JCXJldHVybiB0YWdzOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXR0ckRlZmluZWQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlYywgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChlZGVjID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDTU5hbWVkTm9kZU1hcCBhdHRycyA9IGVkZWMuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYXR0ci5nZXRBdHRyTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZIVE1MVGFncyA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYWY2NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNTVR5cGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqICAKLSAqLwotY2xhc3MgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvciBleHRlbmRzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yKENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2FuZGlkYXRlcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2FuZGlkYXRlcygpIHsKLQkJTGlzdCBjYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWJvb2xlYW4gaGFzTGVhZGluZ0NvbG9uID0gY2hlY2tMZWFkaW5nQ29sb24oKTsKLQkJU3RyaW5nIHRleHRUb1JlcGxhY2UgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCk7Ci0JCWlmICghaGFzTGVhZGluZ0NvbG9uICYmIDAgPCB0ZXh0VG9SZXBsYWNlLmxlbmd0aCgpICYmICF0ZXh0VG9SZXBsYWNlLmVxdWFscyhmQ29udGV4dC5nZXRUZXh0VG9Db21wYXJlKCkpKSB7Ci0JCQkvLyBjdXJzb3IgcGxhY2VkIG1pZHBvaW50IG9mIHRoZSByZWdpb24KLQkJCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZkNvbnRleHQuZ2V0VGFyZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgIUNTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUodHlwZSkpIHsKLQkJCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiB1c2VVcHBlckNhc2UgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQotCQlMaXN0IHRhZ3MgPSBnZXRTZWxlY3RvclRhZ3MoKTsKLQkJQ29sbGVjdGlvbnMuc29ydCh0YWdzKTsKLQkJSXRlcmF0b3IgaSA9IHRhZ3MuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJaWYgKGhhc0xlYWRpbmdDb2xvbiAmJiAhaXNNYXRjaCh0ZXh0KSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJdGV4dCA9ICh1c2VVcHBlckNhc2UpID8gdGV4dC50b1VwcGVyQ2FzZSgpIDogdGV4dC50b0xvd2VyQ2FzZSgpOwotCi0JCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkKLQkJCWlmICghaGFzTGVhZGluZ0NvbG9uKQotCQkJCWJ1Zi5hcHBlbmQodGV4dFRvUmVwbGFjZSk7Ci0JCQkKLQkJCWJ1Zi5hcHBlbmQodGV4dCk7Ci0JCQljdXJzb3JQb3MgKz0gYnVmLmxlbmd0aCgpOwotCi0JCQlpZiAoMCA8IGJ1Zi5sZW5ndGgoKSkgewotCQkJCWJvb2xlYW4gaW5SdWxlID0gKGZDb250ZXh0LmdldFRhcmdldE5vZGUoKSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUgfHwgZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpIGluc3RhbmNlb2YgSUNTU1BhZ2VSdWxlKTsKLQkJCQlpZiAoIWluUnVsZSB8fCAodGV4dFRvUmVwbGFjZS5sZW5ndGgoKSA9PSAwICYmICFoYXNMZWFkaW5nQ29sb24pKSB7Ci0JCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQkJCWN1cnNvclBvcyArPSAxOwotCQkJCX0KLQkJCQlpZiAoIWluUnVsZSkgewotCQkJCQlTdHJpbmdBbmRPZmZzZXQgc2FvID0gZ2VuZXJhdGVCcmFjZXMoKTsKLQkJCQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCQkJCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQkJCQl9Ci0JCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmLnRvU3RyaW5nKCkpOwotCQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCQlpdGVtLnNldERpc3BsYXlTdHJpbmcodGV4dCk7Ci0JCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX1BTRVVETyk7Ci0JCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlMaXN0IGdldFNlbGVjdG9yVGFncygpIHsKLQkJTGlzdCB0YWdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ1NTTm9kZSB0YXJnZXROb2RlID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlTdHJpbmcgcm9vdFR5cGUgPSAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NQYWdlUnVsZSkgPyBDU1NNTU5vZGUuVFlQRV9QQUdFX1JVTEUgOiBDU1NNTU5vZGUuVFlQRV9TVFlMRV9SVUxFOwotCi0JCUNTU01NVHlwZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgQ1NTTU1UeXBlQ29sbGVjdG9yKCk7Ci0JCWNvbGxlY3Rvci5jb2xsZWN0TmVzdGVkVHlwZShmYWxzZSk7Ci0JCWNvbGxlY3Rvci5hcHBseShmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSwgcm9vdFR5cGUpOwotCQlJdGVyYXRvciBpOwotCQlpID0gY29sbGVjdG9yLmdldE5vZGVzKCk7Ci0JCWlmICghaS5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0YWdMaXN0OwotCQl9Ci0JCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCWkgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgY2hpbGQgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCWlmIChjaGlsZC5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfU0VMRUNUT1IpIHsKLQkJCQlTdHJpbmcgc2VsVHlwZSA9ICgoQ1NTTU1TZWxlY3RvcikgY2hpbGQpLmdldFNlbGVjdG9yVHlwZSgpOwotCQkJCWlmIChzZWxUeXBlID09IENTU01NU2VsZWN0b3IuVFlQRV9QU0VVRE9fQ0xBU1MgfHwgc2VsVHlwZSA9PSBDU1NNTVNlbGVjdG9yLlRZUEVfUFNFVURPX0VMRU1FTlQpIHsKLQkJCQkJdGFnTGlzdC5hZGQoKChDU1NNTVNlbGVjdG9yKSBjaGlsZCkuZ2V0U2VsZWN0b3JTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0YWdMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDViZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLkNTU0VkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlSGVscGVyOwotCi0KLS8qKgotICogQ29tcGxldGlvbiBwcm9jZXNzb3IgZm9yIENTUyBUZW1wbGF0ZXMuIE1vc3Qgb2YgdGhlIHdvcmsgaXMgYWxyZWFkeSBkb25lCi0gKiBieSB0aGUgQ1NTIENvbnRlbnQgQXNzaXN0IHByb2Nlc3Nvciwgc28gYnkgdGhlIHRpbWUgdGhlCi0gKiBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgaXMgYXNrZWQgZm9yIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FscywgdGhlCi0gKiBDU1MgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGhhcyBhbHJlYWR5IHNldCB0aGUgY29udGV4dCB0eXBlIGZvcgotICogdGVtcGxhdGVzLgotICovCi1jbGFzcyBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgewotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCXByb3RlY3RlZCBUZW1wbGF0ZUNvbnRleHRUeXBlIGdldENvbnRleHRUeXBlKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24pIHsKLQkJVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlID0gbnVsbDsKLQotCQlDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpCi0JCQl0eXBlID0gcmVnaXN0cnkuZ2V0Q29udGV4dFR5cGUoZkNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgewotCQkvLyBqdXN0IHJldHVybiB0aGUgc2FtZSBpbWFnZSBmb3Igbm93Ci0JCXJldHVybiBDU1NJbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RFTVBMQVRFKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVbXSBnZXRUZW1wbGF0ZXMoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGVzW10gPSBudWxsOwotCi0JCVRlbXBsYXRlU3RvcmUgc3RvcmUgPSBnZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsKQotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCX0KLQotCXZvaWQgc2V0Q29udGV4dFR5cGUoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJZkNvbnRleHRUeXBlSWQgPSBjb250ZXh0VHlwZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUw0ME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTDQwTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzBlMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTDQwTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLS8qKgotICogUHJvdmlkZSBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGUgSFRNTCA0LjA/IHNwZWNpZmljYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTDQwTmFtZXNwYWNlIHsKLQotCS8vIEVsZW1lbnQgbmFtZXMKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbGVtZW50TmFtZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEEgPSAiQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJCUiA9ICJBQkJSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1JPTllNID0gIkFDUk9OWU0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1MgPSAiQUREUkVTUyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTEVUID0gIkFQUExFVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJFQSA9ICJBUkVBIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCID0gIkIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0UgPSAiQkFTRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRUZPTlQgPSAiQkFTRUZPTlQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJETyA9ICJCRE8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJHU09VTkQgPSAiQkdTT1VORCI7IC8vIEQyMDU1MTMKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSUcgPSAiQklHIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTElOSyA9ICJCTElOSyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tRVU9URSA9ICJCTE9DS1FVT1RFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZID0gIkJPRFkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSID0gIkJSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVVRUT04gPSAiQlVUVE9OIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBUSU9OID0gIkNBUFRJT04iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFTlRFUiA9ICJDRU5URVIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJVEUgPSAiQ0lURSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERSA9ICJDT0RFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0wgPSAiQ09MIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xHUk9VUCA9ICJDT0xHUk9VUCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREQgPSAiREQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTCA9ICJERUwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERGTiA9ICJERk4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUiA9ICJESVIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJViA9ICJESVYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERMID0gIkRMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVCA9ICJEVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU0gPSAiRU0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEID0gIkVNQkVEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRFNFVCA9ICJGSUVMRFNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9OVCA9ICJGT05UIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNID0gIkZPUk0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FID0gIkZSQU1FIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFNRVNFVCA9ICJGUkFNRVNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDEgPSAiSDEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgyID0gIkgyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMyA9ICJIMyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDQgPSAiSDQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg1ID0gIkg1IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINiA9ICJINiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRCA9ICJIRUFEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIUiA9ICJIUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTCA9ICJIVE1MIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJID0gIkkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElGUkFNRSA9ICJJRlJBTUUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNRyA9ICJJTUciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUID0gIklOUFVUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlMgPSAiSU5TIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU0lOREVYID0gIklTSU5ERVgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtCRCA9ICJLQkQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gIkxBQkVMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdFTkQgPSAiTEVHRU5EIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSSA9ICJMSSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOSyA9ICJMSU5LIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVAgPSAiTUFQIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VID0gIk1FTlUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEEgPSAiTUVUQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9CUiA9ICJOT0JSIjsgLy8gRDIwNTUxMyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PRU1CRUQgPSAiTk9FTUJFRCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9GUkFNRVMgPSAiTk9GUkFNRVMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PU0NSSVBUID0gIk5PU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1QgPSAiT0JKRUNUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTCA9ICJPTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUR1JPVVAgPSAiT1BUR1JPVVAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTiA9ICJPUFRJT04iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFAgPSAiUCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU0gPSAiUEFSQU0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRSA9ICJQUkUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFEgPSAiUSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUyA9ICJTIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QID0gIlNBTVAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVCA9ICJTQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVCA9ICJTRUxFQ1QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNNQUxMID0gIlNNQUxMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFOID0gIlNQQU4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklLRSA9ICJTVFJJS0UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUk9ORyA9ICJTVFJPTkciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFID0gIlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUIgPSAiU1VCIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVAgPSAiU1VQIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRSA9ICJUQUJMRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEJPRFkgPSAiVEJPRFkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFREID0gIlREIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUQVJFQSA9ICJURVhUQVJFQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEZPT1QgPSAiVEZPT1QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIID0gIlRIIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVBRCA9ICJUSEVBRCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAiVElUTEUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSID0gIlRSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUVCA9ICJUVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVSA9ICJVIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTCA9ICJVTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSID0gIlZBUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JSID0gIldCUiI7IC8vIEQyMDU1MTMgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJRVUVFID0gIk1BUlFVRUUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9DT05GSUcgPSAiU1NJOkNPTkZJRyI7IC8vIEQyMTAzOTMKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRUNITyA9ICJTU0k6RUNITyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0VYRUMgPSAiU1NJOkVYRUMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GU0laRSA9ICJTU0k6RlNJWkUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GTEFTVE1PRCA9ICJTU0k6RkxBU1RNT0QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9JTkNMVURFID0gIlNTSTpJTkNMVURFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfUFJJTlRFTlYgPSAiU1NJOlBSSU5URU5WIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfU0VUID0gIlNTSTpTRVQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9XTUwgPSAid21sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQ0FSRCA9ICJjYXJkIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfVEVNUExBVEUgPSAidGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BQ0NFU1MgPSAiYWNjZXNzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfRE8gPSAiZG8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9PTkVWRU5UID0gIm9uZXZlbnQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9USU1FUiA9ICJ0aW1lciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FOQ0hPUiA9ICJhbmNob3IiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9QUkVWID0gInByZXYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9SRUZSRVNIID0gInJlZnJlc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9HTyA9ICJnbyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX05PT1AgPSAibm9vcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX1NFVFZBUiA9ICJzZXR2YXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9QT1NURklFTEQgPSAicG9zdGZpZWxkIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIENoYXJhY3RlciBFbnRpdGllcwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVudGl0eU5hbWUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQUNVVEVfVSA9ICJBYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFBQ1VURV9MID0gImFhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNJUkNfVSA9ICJBY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNJUkNfTCA9ICJhY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNVVEUgPSAiYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFFTElHX1UgPSAiQUVsaWciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFFTElHX0wgPSAiYWVsaWciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFHUkFWRV9VID0gIkFncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUdSQVZFX0wgPSAiYWdyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEVGU1lNID0gImFsZWZzeW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBX1UgPSAiQWxwaGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBX0wgPSAiYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFNUCA9ICJhbXAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFORCA9ICJhbmQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFORyA9ICJhbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSSU5HX1UgPSAiQXJpbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSSU5HX0wgPSAiYXJpbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTWU1QID0gImFzeW1wIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVElMREVfVSA9ICJBdGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUSUxERV9MID0gImF0aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVNTF9VID0gIkF1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVTUxfTCA9ICJhdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRFFVTyA9ICJiZHF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVUQV9VID0gIkJldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFVEFfTCA9ICJiZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUlZCQVIgPSAiYnJ2YmFyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUxMID0gImJ1bGwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUCA9ICJjYXAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENDRURJTF9VID0gIkNjZWRpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0NFRElMX0wgPSAiY2NlZGlsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRURJTCA9ICJjZWRpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VOVCA9ICJjZW50IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElfVSA9ICJDaGkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENISV9MID0gImNoaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0lSQyA9ICJjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTFVCUyA9ICJjbHVicyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORyA9ICJjb25nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZID0gImNvcHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSQVJSID0gImNyYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVAgPSAiY3VwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU4gPSAiY3VycmVuIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQUdHRVJfVSA9ICJEYWdnZXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBR0dFUl9MID0gImRhZ2dlciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFSUl9VID0gImRBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBUlJfTCA9ICJkYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUcgPSAiZGVnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQV9VID0gIkRlbHRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQV9MID0gImRlbHRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFNUyA9ICJkaWFtcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElWSURFID0gImRpdmlkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFDVVRFX1UgPSAiRWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQUNVVEVfTCA9ICJlYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDSVJDX1UgPSAiRWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDSVJDX0wgPSAiZWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVHUkFWRV9VID0gIkVncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUdSQVZFX0wgPSAiZWdyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICJlbXB0eSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1TUCA9ICJlbXNwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlNQID0gImVuc3AiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVQU0lMT05fVSA9ICJFcHNpbG9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUFNJTE9OX0wgPSAiZXBzaWxvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVSVYgPSAiZXF1aXYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUQV9VID0gIkV0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRBX0wgPSAiZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVEhfVSA9ICJFVEgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUSF9MID0gImV0aCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVVNTF9VID0gIkV1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVVTUxfTCA9ICJldW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVVJPID0gImV1cm8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYSVNUID0gImV4aXN0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTk9GID0gImZub2YiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkFMTCA9ICJmb3JhbGwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUMxMiA9ICJmcmFjMTIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUMxNCA9ICJmcmFjMTQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUMzNCA9ICJmcmFjMzQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQVNMID0gImZyYXNsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHQU1NQV9VID0gIkdhbW1hIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHQU1NQV9MID0gImdhbW1hIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRSA9ICJnZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1QgPSAiZ3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBUlJfVSA9ICJoQXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVJSX0wgPSAiaGFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBUlRTID0gImhlYXJ0cyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMTElQID0gImhlbGxpcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUFDVVRFX1UgPSAiSWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQUNVVEVfTCA9ICJpYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDSVJDX1UgPSAiSWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDSVJDX0wgPSAiaWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElFWENMID0gImlleGNsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR1JBVkVfVSA9ICJJZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElHUkFWRV9MID0gImlncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0UgPSAiaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORklOID0gImluZmluIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlQgPSAiaW50IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJT1RBX1UgPSAiSW90YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU9UQV9MID0gImlvdGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElRVUVTVCA9ICJpcXVlc3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTSU4gPSAiaXNpbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVNTF9VID0gIkl1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVTUxfTCA9ICJpdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLQVBQQV9VID0gIkthcHBhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLQVBQQV9MID0gImthcHBhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU1CREFfVSA9ICJMYW1iZGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBTUJEQV9MID0gImxhbWJkYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFORyA9ICJsYW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVFVTyA9ICJsYXF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFSUl9VID0gImxBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBUlJfTCA9ICJsYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQ0VJTCA9ICJsY2VpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERRVU8gPSAibGRxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFID0gImxlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRkxPT1IgPSAibGZsb29yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT1dBU1QgPSAibG93YXN0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT1ogPSAibG96IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMUk0gPSAibHJtIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMU0FRVU8gPSAibHNhcXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMU1FVTyA9ICJsc3F1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFQgPSAibHQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BQ1IgPSAibWFjciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTURBU0ggPSAibWRhc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JQ1JPID0gIm1pY3JvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSURET1QgPSAibWlkZG90IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5VUyA9ICJtaW51cyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVfVSA9ICJNdSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVfTCA9ICJtdSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFCTEEgPSAibmFibGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5CU1AgPSAibmJzcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkRBU0ggPSAibmRhc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FID0gIm5lIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOSSA9ICJuaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UID0gIm5vdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USU4gPSAibm90aW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TVUIgPSAibnN1YiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlRJTERFX1UgPSAiTnRpbGRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVElMREVfTCA9ICJudGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VX1UgPSAiTnUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VX0wgPSAibnUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9BQ1VURV9VID0gIk9hY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FDVVRFX0wgPSAib2FjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQ0lSQ19VID0gIk9jaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQ0lSQ19MID0gIm9jaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRUxJR19VID0gIk9FbGlnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRUxJR19MID0gIm9lbGlnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPR1JBVkVfVSA9ICJPZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9HUkFWRV9MID0gIm9ncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xJTkUgPSAib2xpbmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NRUdBX1UgPSAiT21lZ2EiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NRUdBX0wgPSAib21lZ2EiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSUNST05fVSA9ICJPbWljcm9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlDUk9OX0wgPSAib21pY3JvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BMVVMgPSAib3BsdXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SID0gIm9yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRGID0gIm9yZGYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SRE0gPSAib3JkbSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NMQVNIX1UgPSAiT3NsYXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPU0xBU0hfTCA9ICJvc2xhc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9USUxERV9VID0gIk90aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RJTERFX0wgPSAib3RpbGRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVElNRVMgPSAib3RpbWVzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVU1MX1UgPSAiT3VtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VNTF9MID0gIm91bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkEgPSAicGFyYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVCA9ICJwYXJ0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJNSUwgPSAicGVybWlsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJQID0gInBlcnAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBISV9VID0gIlBoaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhJX0wgPSAicGhpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9VID0gIlBpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9MID0gInBpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSVYgPSAicGl2IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVTTU4gPSAicGx1c21uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1VORCA9ICJwb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUVfVSA9ICJQcmltZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUVfTCA9ICJwcmltZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRCA9ICJwcm9kIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QID0gInByb3AiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBTSV9VID0gIlBzaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFNJX0wgPSAicHNpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UID0gInF1b3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBRElDID0gInJhZGljIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HID0gInJhbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBUVVPID0gInJhcXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVJSX1UgPSAickFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFSUl9MID0gInJhcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJDRUlMID0gInJjZWlsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRFFVTyA9ICJyZHF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBTCA9ICJyZWFsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUcgPSAicmVnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRkxPT1IgPSAicmZsb29yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSE9fVSA9ICJSaG8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJIT19MID0gInJobyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkxNID0gInJsbSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlNBUVVPID0gInJzYXF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlNRVU8gPSAicnNxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCUVVPID0gInNicXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FST05fVSA9ICJTY2Fyb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQVJPTl9MID0gInNjYXJvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0RPVCA9ICJzZG90IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUID0gInNlY3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIWSA9ICJzaHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR01BX1UgPSAiU2lnbWEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR01BX0wgPSAic2lnbWEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR01BRiA9ICJzaWdtYWYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTSA9ICJzaW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQURFUyA9ICJzcGFkZXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQiA9ICJzdWIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQkUgPSAic3ViZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VNID0gInN1bSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQID0gInN1cCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQMSA9ICJzdXAxIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVAyID0gInN1cDIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUDMgPSAic3VwMyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRSA9ICJzdXBlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWkxJRyA9ICJzemxpZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFVX1UgPSAiVGF1IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVVfTCA9ICJ0YXUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVJFNCA9ICJ0aGVyZTQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVRBX1UgPSAiVGhldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVRBX0wgPSAidGhldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVRBU1lNID0gInRoZXRhc3ltIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSElOU1AgPSAidGhpbnNwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSE9STl9VID0gIlRIT1JOIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSE9STl9MID0gInRob3JuIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSUxERSA9ICJ0aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVMgPSAidGltZXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQURFID0gInRyYWRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQUNVVEVfVSA9ICJVYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVBQ1VURV9MID0gInVhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUFSUl9VID0gInVBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVBUlJfTCA9ICJ1YXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQ0lSQ19VID0gIlVjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQ0lSQ19MID0gInVjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVR1JBVkVfVSA9ICJVZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVHUkFWRV9MID0gInVncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1MID0gInVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBTSUggPSAidXBzaWgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQU0lMT05fVSA9ICJVcHNpbG9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUFNJTE9OX0wgPSAidXBzaWxvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVVNTF9VID0gIlV1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVVTUxfTCA9ICJ1dW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUlFUlAgPSAid2VpZXJwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSV9VID0gIlhpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSV9MID0gInhpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZQUNVVEVfVSA9ICJZYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlBQ1VURV9MID0gInlhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVOID0gInllbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWVVNTF9VID0gIll1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlVTUxfTCA9ICJ5dW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVRBX1UgPSAiWmV0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVUQV9MID0gInpldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpXSiA9ICJ6d2oiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpXTkogPSAienduaiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MNDBfVVJJID0gImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvZnJhbWVzZXQuZHRkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUw0MF9UQUdfUFJFRklYID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBnbG9iYWwgYXR0cmlidXRlIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lEID0gImlkIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NMQVNTID0gImNsYXNzIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NUWUxFID0gInN0eWxlIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RJVExFID0gInRpdGxlIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xBTkcgPSAibGFuZyI7IC8vICVpMThuOwotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RJUiA9ICJkaXIiOyAvLyAlaTE4bjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkNMSUNLID0gIm9uY2xpY2siOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OREJMQ0xJQ0sgPSAib25kYmxjbGljayI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05NT1VTRURPV04gPSAib25tb3VzZWRvd24iOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05NT1VTRVVQID0gIm9ubW91c2V1cCI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VPVkVSID0gIm9ubW91c2VvdmVyIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VNT1ZFID0gIm9ubW91c2Vtb3ZlIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VPVVQgPSAib25tb3VzZW91dCI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05LRVlQUkVTUyA9ICJvbmtleXByZXNzIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTktFWURPV04gPSAib25rZXlkb3duIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05LRVlVUCA9ICJvbmtleXVwIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkhFTFAgPSAib25oZWxwIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQkdDT0xPUiA9ICJiZ2NvbG9yIjsgLy8gJWJvZHljb2xvcjssCi0JCQkJCQkJCQkJCQkJCQkgIC8vIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEVYVCA9ICJ0ZXh0IjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MSU5LID0gImxpbmsiOyAvLyAlYm9keWNvbG9yOwotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZMSU5LID0gInZsaW5rIjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSU5LID0gImFsaW5rIjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vIEhUTUwKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUk9GSUxFID0gInByb2ZpbGUiOyAvLyBIRUFECi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05MT0FEID0gIm9ubG9hZCI7IC8vIEJPRFkKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05VTkxPQUQgPSAib251bmxvYWQiOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CQUNLR1JPVU5EID0gImJhY2tncm91bmQiOyAvLyBCT0RZLAotCQkJCQkJCQkJCQkJCQkJCQkvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NSQyA9ICJzcmMiOyAvLyBJTUcgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTFQgPSAiYWx0IjsgLy8gSU1HLEFSRUEKLQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTE9OR0RFU0MgPSAibG9uZ2Rlc2MiOyAvLyBJTUcKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05BTUUgPSAibmFtZSI7IC8vIElNRyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyBJTUcsIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1dJRFRIID0gIndpZHRoIjsgLy8gSU1HLCBUQUJMRSxIUgotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVVNFTUFQID0gInVzZW1hcCI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU01BUCA9ICJpc21hcCI7IC8vIElNRyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gImFsaWduIjsgLy8gSU1HLCBUQUJMRSxIUgotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQk9SREVSID0gImJvcmRlciI7IC8vIElNRywgVEFCTEUKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gImhzcGFjZSI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSAidnNwYWNlIjsgLy8gSU1HCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01BUEZJTEUgPSAibWFwZmlsZSI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NVTU1BUlkgPSAic3VtbWFyeSI7IC8vIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRlJBTUUgPSAiZnJhbWUiOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUlVMRVMgPSAicnVsZXMiOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0VMTFNQQUNJTkcgPSAiY2VsbHNwYWNpbmciOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0VMTFBBRERJTkcgPSAiY2VsbHBhZGRpbmciOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfREFUQVBBR0VTSVpFID0gImRhdGFwYWdlc2l6ZSI7IC8vIFRBQkxFLEhSCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTE9SID0gImNvbG9yIjsgLy8gQkFTRUZPTlQsRk9OVAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRkFDRSA9ICJmYWNlIjsgLy8gQkFTRUZPTlQsRk9OVAotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NJWkUgPSAic2l6ZSI7IC8vIEJBU0VGT05ULEZPTlQKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEVBUiA9ICJjbGVhciI7IC8vIEJSIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0hBUEUgPSAic2hhcGUiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT09SRFMgPSAiY29vcmRzIjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IUkVGID0gImhyZWYiOyAvLyBBUkVBIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEFSR0VUID0gInRhcmdldCI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTk9IUkVGID0gIm5vaHJlZiI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEFCSU5ERVggPSAidGFiaW5kZXgiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BQ0NFU1NLRVkgPSAiYWNjZXNza2V5IjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkZPQ1VTID0gIm9uZm9jdXMiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05CTFVSID0gIm9uYmx1ciI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0hBUlNFVCA9ICJjaGFyc2V0IjsgLy8gTElOSwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hSRUZMQU5HID0gImhyZWZsYW5nIjsgLy8gTElOSwotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9ICJ0eXBlIjsgLy8gTElOSyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JFTCA9ICJyZWwiOyAvLyBMSU5LIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUkVWID0gInJldiI7IC8vIExJTksgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NRURJQSA9ICJtZWRpYSI7IC8vIExJTksKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZBTFVFID0gInZhbHVlIjsgLy8gUEFSQU0KLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZBTFVFVFlQRSA9ICJ2YWx1ZXR5cGUiOyAvLyBQQVJBTQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OT1NIQURFID0gIm5vc2hhZGUiOyAvLyBIUgotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIRUNLRUQgPSAiY2hlY2tlZCI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRElTQUJMRUQgPSAiZGlzYWJsZWQiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUkVBRE9OTFkgPSAicmVhZG9ubHkiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFYTEVOR1RIID0gIm1heGxlbmd0aCI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OU0VMRUNUID0gIm9uc2VsZWN0IjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OQ0hBTkdFID0gIm9uY2hhbmdlIjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDQ0VQVCA9ICJhY2NlcHQiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU1RZTEUgPSAiaXN0eWxlIjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0hBUiA9ICJjaGFyIjsgLy8gQ09MIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0hBUk9GRiA9ICJjaGFyb2ZmIjsgLy8gQ09MCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMSUdOID0gInZhbGlnbiI7IC8vIENPTAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TUEFOID0gInNwYW4iOyAvLyBDT0wgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GUkFNRUJPUkRFUiA9ICJmcmFtZWJvcmRlciI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVJHSU5XSURUSCA9ICJtYXJnaW53aWR0aCI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVJHSU5IRUlHSFQgPSAibWFyZ2luaGVpZ2h0IjsgLy8gRlJBTUUKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTk9SRVNJWkUgPSAibm9yZXNpemUiOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NST0xMSU5HID0gInNjcm9sbGluZyI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BST01QVCA9ICJwcm9tcHQiOyAvLyBJU0lOREVYCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hUVFBfRVFVSVYgPSAiaHR0cC1lcXVpdiI7IC8vIE1FVEEKLQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05URU5UID0gImNvbnRlbnQiOyAvLyBNRVRBCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NIRU1FID0gInNjaGVtZSI7IC8vIE1FVEEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRVJSTVNHID0gImVycm1zZyI7IC8vIHNzaTpjb25maWcKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0laRUZNVCA9ICJzaXplZm10IjsgLy8gc3NpOmNvbmZpZwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RJTUVGTVQgPSAidGltZWZtdCI7IC8vIHNzaTpjb25maWcKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQVIgPSAidmFyIjsgLy8gc3NpOmVjaG8KLQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0dJID0gImNnaSI7IC8vIHNzaTpleGVjCi0JCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NNRCA9ICJjbWQiOyAvLyBzc2k6ZXhlYwotCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gImZpbGUiOyAvLyBzc2k6ZnNpemUKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WSVJUVUFMID0gInZpcnR1YWwiOyAvLyBzc2k6ZnNpemUKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRUxFQ1RFRCA9ICJzZWxlY3RlZCI7IC8vIE9QVElPTgotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEFCRUwgPSAibGFiZWwiOyAvLyBPUFRJT04KLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JPV1MgPSAicm93cyI7IC8vIFRFWFRBUkVBCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09MUyA9ICJjb2xzIjsgLy8gVEVYVEFSRUEKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7IC8vIFNDUklQVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfREVGRVIgPSAiZGVmZXIiOyAvLyBTQ1JJUFQKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VWRU5UID0gImV2ZW50IjsgLy8gU0NSSVBUCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GT1IgPSAiZm9yIjsgLy8gU0NSSVBUIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09NUEFDVCA9ICJjb21wYWN0IjsgLy8gT0wvVUwKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TVEFSVCA9ICJzdGFydCI7IC8vIE9ML1VMCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ESVJFQ1RLRVkgPSAiZGlyZWN0a2V5IjsgLy8gQQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFQkFTRSA9ICJjb2RlYmFzZSI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVJDSElWRSA9ICJhcmNoaXZlIjsgLy8gQVBQTEVUCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERSA9ICJjb2RlIjsgLy8gQVBQTEVUCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT0JKRUNUID0gIm9iamVjdCI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVlTQ1JJUFQgPSAibWF5c2NyaXB0IjsgLy8gQVBQTEVUCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NJVEUgPSAiY2l0ZSI7IC8vIEJMT0NLUVVPVEUKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQUNSTyA9ICJtYWNybyI7IC8vIEQyVyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RBVEVUSU1FID0gImRhdGV0aW1lIjsgLy8gSU5TL0RFTAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTE9PUCA9ICJsb29wIjsgLy8gRU1CRUQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ISURERU4gPSAiaGlkZGVuIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVk9MVU1FID0gInZvbHVtZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FVVE9TVEFSVCA9ICJhdXRvc3RhcnQiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BVVRPUExBWSA9ICJhdXRvcGxheSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BVVRPU0laRSA9ICJhdXRvc2l6ZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05UUk9MTEVSID0gImNvbnRyb2xsZXIiOy8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TQ0FMRSA9ICJzY2FsZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSE9XQ09OVFJPTFMgPSAic2hvd2NvbnRyb2xzIjsvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BMQVlDT1VOVCA9ICJwbGF5Y291bnQiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9SRVBFQVQgPSAicmVwZWF0IjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFORUwgPSAicGFuZWwiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFMRVRURSA9ICJwYWxldHRlIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9URVhURk9DVVMgPSAidGV4dGZvY3VzIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUNUSU9OID0gImFjdGlvbiI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUVUSE9EID0gIm1ldGhvZCI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRU5DVFlQRSA9ICJlbmN0eXBlIjsgLy8gRk9STQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OU1VCTUlUID0gIm9uc3VibWl0IjsgLy8gRk9STQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05SRVNFVCA9ICJvbnJlc2V0IjsgLy8gRk9STQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDQ0VQVF9DSEFSU0VUID0gImFjY2VwdC1jaGFyc2V0IjsvLyBGT1JNCi0JCQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JFSEFWSU9SID0gImJlaGF2aW9yIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NST0xMQU1PVU5UID0gInNjcm9sbGFtb3VudCI7Ly8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDUk9MTERFTEFZID0gInNjcm9sbGRlbGF5IjsvLyBNQVJRVUVFCi0JCQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RSVUVTUEVFRCA9ICJ0cnVlc3BlZWQiOyAvLyBNQVJRVUVFCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RFQ0xBUkUgPSAiZGVjbGFyZSI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NMQVNTSUQgPSAiY2xhc3NpZCI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RBVEEgPSAiZGF0YSI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREVUWVBFID0gImNvZGV0eXBlIjsgLy8gT0JKRUNUCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TVEFOREJZID0gInN0YW5kYnkiOyAvLyBPQkpFQ1QKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NVUxUSVBMRSA9ICJtdWx0aXBsZSI7IC8vIFNFTEVDVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUJCUiA9ICJhYmJyIjsgLy8gVEgvVEQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BWElTID0gImF4aXMiOyAvLyBUSC9URCAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFQURFUlMgPSAiaGVhZGVycyI7IC8vIFRIL1RECi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NPUEUgPSAic2NvcGUiOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUk9XU1BBTiA9ICJyb3dzcGFuIjsgLy8gVEgvVEQKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0xTUEFOID0gImNvbHNwYW4iOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05PV1JBUCA9ICJub3dyYXAiOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCS8vIDw8RDIwNTUxNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UT1BNQVJHSU4gPSAidG9wbWFyZ2luIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CT1RUT01NQVJHSU4gPSAiYm90dG9tbWFyZ2luIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MRUZUTUFSR0lOID0gImxlZnRtYXJnaW4iOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUklHSFRNQVJHSU4gPSAicmlnaHRtYXJnaW4iOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CT1JERVJDT0xPUiA9ICJib3JkZXJjb2xvciI7IC8vIFRBQkxFL1RSL1RIL1REL0ZSQU1FU0VUL0ZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCS8vIGZvciBXTUwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX1RJVExFID0gInRpdGxlIjsgLy8gY2FyZAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9ET01BSU4gPSAiZG9tYWluIjsgLy8gYWNjZXNzCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfUEFUSCA9ICJwYXRoIjsgLy8gYWNjZXNzCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9PTkVOVEVSRk9SV0FSRCA9ICJvbmVudGVyZm9yd2FyZCI7IC8vIHRlbXBsYXRlLGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT05FTlRFUkJBQ0tXQVJEID0gIm9uZW50ZXJiYWNrd2FyZCI7IC8vIHRlbXBsYXRlLGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9PTlBJQ0sgPSAib25waWNrIjsgLy8gb3B0aW9uCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT05USU1FUiA9ICJvbnRpbWVyIjsgLy8gdGVtcGxhdGUsY2FyZAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfTkVXQ09OVEVYVCA9ICJuZXdjb250ZXh0IjsgLy8gY2FyZAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT1JERVJFRCA9ICJvcmRlcmVkIjsgLy8gY2FyZAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT1BUSU9OQUwgPSAib3B0aW9uYWwiOyAvLyBkbwotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9DQUNIRV9DT05UUk9MID0gImNhY2hlLWNvbnRyb2wiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfU0VORFJFRkVSRVIgPSAic2VuZHJlZmVyZXIiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9NRVRIT0QgPSAibWV0aG9kIjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9FTkNUWVBFID0gImVuY3R5cGUiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfQUNDRVBUX0NIQVJTRVQgPSAiYWNjZXB0LWNoYXJzZXQiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9DT0xVTU5TID0gImNvbHVtbnMiOyAvLyB0YWJsZQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCS8vIEQyMDU1MTQKLQkvLzw8RDIxNTY4NAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GUkFNRVNQQUNJTkcgPSAiZnJhbWVzcGFjaW5nIjsgLy8gRlJBTUVTRVQKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkvL0QyMTU2ODQKLQkvLyBnbG9iYWwgYXR0cmlidXRlIHZhbHVlczsgbWFpbmx5IHVzZWQgaW4gZW51bWVyYXRpb24uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9WRVJTSU9OX1RSQU5TSVRJT05BTCA9ICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1ZFUlNJT05fRlJBTUVTRVQgPSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xUUiA9ICJsdHIiOyAvLyBkaXIgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUlRMID0gInJ0bCI7IC8vIGRpciAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgYWxpZ24gKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UT1AgPSAidG9wIjsgLy8gYWxpZ24gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTUlERExFID0gIm1pZGRsZSI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gImJvdHRvbSI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9ICJsZWZ0IjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NFTlRFUiA9ICJjZW50ZXIiOyAvLyBhbGlnbgotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gInJpZ2h0IjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSlVTVElGWSA9ICJqdXN0aWZ5IjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NIQVIgPSAiY2hhciI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgdmFsaWduIChiYXNlbGluZSkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JBU0VMSU5FID0gImJhc2VsaW5lIjsgLy8gdmFsaWduCi0JCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBjbGVhciAobGVmdHxhbGx8cmlnaHR8bm9uZSk6IGxlZnQgYW5kIHJpZ2h0IGFyZSBhbHJlYWR5IGRlZmluZWQKLQkvLyBhYm92ZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FMTCA9ICJhbGwiOyAvLyBjbGVhciAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9OT05FID0gIm5vbmUiOyAvLyBjbGVhcgotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHNoYXBlIChyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRUNUID0gInJlY3QiOyAvLyBzaGFwZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ0lSQ0xFID0gImNpcmNsZSI7IC8vIHNoYXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUE9MWSA9ICJwb2x5IjsgLy8gc2hhcGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vIHNoYXBlCi0JCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgdmFsdWV0eXBlIChkYXRhfHJlZnxvYmplY3QpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9EQVRBID0gImRhdGEiOyAvLyB2YWx1ZXR5cGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFRiA9ICJyZWYiOyAvLyB2YWx1ZXR5cGUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9PQkpFQ1QgPSAib2JqZWN0IjsgLy8gdmFsdWV0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHR5cGUgb2YgSU5QVVQKLQkvLyAgICAgICAodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLQkvLyAgICAgICAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVEVYVCA9ICJ0ZXh0IjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUEFTU1dPUkQgPSAicGFzc3dvcmQiOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NIRUNLQk9YID0gImNoZWNrYm94IjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SQURJTyA9ICJyYWRpbyI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfU1VCTUlUID0gInN1Ym1pdCI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRVNFVCA9ICJyZXNldCI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRklMRSA9ICJmaWxlIjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSElEREVOID0gImhpZGRlbiI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9JTUFHRSA9ICJpbWFnZSI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQlVUVE9OID0gImJ1dHRvbiI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3Igc3BhbiwgY29sc3Bhbiwgcm93c3BhbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfMSA9ICIxIjsgLy8gc3BhbiAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgZnJhbWVib3JkZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzAgPSAiMCI7IC8vIEZSQU1FIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBzY3JvbGxpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1lFUyA9ICJ5ZXMiOyAvLyBGUkFNRSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9OTyA9ICJubyI7IC8vIEZSQU1FIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FVVE8gPSAiYXV0byI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgVUwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0RJU0MgPSAiZGlzYyI7IC8vIFVMOnR5cGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NRVUFSRSA9ICJzcXVhcmUiOyAvLyBVTDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIGZyYW1lIG9mIFRBQkxFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9WT0lEID0gInZvaWQiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUJPVkUgPSAiYWJvdmUiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CRUxPVyA9ICJiZWxvdyI7IC8vIFRBQkxFOmZyYW1lCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0hTSURFUyA9ICJoc2lkZXMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xIUyA9ICJsaHMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JIUyA9ICJyaHMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1ZTSURFUyA9ICJ2c2lkZXMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JPWCA9ICJib3giOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JPUkRFUiA9ICJib3JkZXIiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBydWxlcyBvZiBUQUJMRQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfR1JPVVBTID0gImdyb3VwcyI7IC8vIFRBQkxFOnJ1bGVzCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUk9XUyA9ICJyb3dzIjsgLy8gVEVYVEFSRUEKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NPTFMgPSAiY29scyI7IC8vIFRFWFRBUkVBCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgbWV0aG9kIG9mIEZPUk0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0dFVCA9ICJnZXQiOyAvLyBGT1JNIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BPU1QgPSAicG9zdCI7IC8vIEZPUk0gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRCA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3Igc2NvcGUgb2YgKFRIIHwgVEQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ST1cgPSAicm93IjsgLy8gKFRIfFREKTpzY29wZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NPTCA9ICJjb2wiOyAvLyAoVEh8VEQpOnNjb3BlCi0JCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUk9XR1JPVVAgPSAicm93Z3JvdXAiOy8vIChUSHxURCk6c2NvcGUKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DT0xHUk9VUCA9ICJjb2xncm91cCI7Ly8gKFRIfFREKTpzY29wZQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBhdXRvPz8gb2YgRU1CRUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9GQUxTRSA9ICJmYWxzZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBiZWhhdmlybyBvZiBNQVJRVUVFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TQ1JPTEwgPSAic2Nyb2xsIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NMSURFID0gInNsaWRlIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BTFRFUk5BVEUgPSAiYWx0ZXJuYXRlIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBkaXJlY3Rpb24gb2YgTUFSUVVFRQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVVAgPSAidXAiOyAvLyBNQVJRVUVFIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0RPV04gPSAiZG93biI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciB0eXBlIG9mIExJIChEMTk5MjQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9OVU1CRVIgPSAiMSI7IC8vIExJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xPV0VSX0FMUEhBID0gImEiOyAvLyBMSQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9DU1NOb2RlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0NTU05vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDQ5MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0NTU05vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0vKioKLSAqIEFkYXB0cyB0aGUgQ1NTIERPTSBub2RlIHRvIGEgSkZhY2Ugdmlld2VyLgotICovCi1jbGFzcyBDU1NOb2RlQWRhcHRlciBpbXBsZW1lbnRzIElKRmFjZU5vZGVBZGFwdGVyLCBJTm9kZUFkYXB0ZXIsIFJ1bm5hYmxlIHsKLQljbGFzcyBOb3RpZnlDb250ZXh0IHsKLQkJTm90aWZ5Q29udGV4dChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JCQl0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLQkJCXRoaXMuY2hhbmdlZEZlYXR1cmUgPSBjaGFuZ2VkRmVhdHVyZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJCXRoaXMucG9zID0gcG9zOwotCQl9Ci0KLQkJdm9pZCBmaXJlKCkgewotCQkJaW50ZXJuYWxOb3RpZnlDaGFuZ2VkKG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCX0KLQotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyOwotCQlpbnQgZXZlbnRUeXBlOwotCQlPYmplY3QgY2hhbmdlZEZlYXR1cmU7Ci0JCU9iamVjdCBvbGRWYWx1ZTsKLQkJT2JqZWN0IG5ld1ZhbHVlOwotCQlpbnQgcG9zOwotCX0KLQotCWNsYXNzIFN0eWxlVmlld1VwZGF0ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChsYXN0VXBkYXRlciA9PSB0aGlzKSB7Ci0JCQkJaW50ZXJuYWxBY3Rpb25QZXJmb3JtZWQoKTsKLQkJCQlsYXN0VXBkYXRlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIFZlY3RvciBub3RpZnlRdWV1ZTsKLQlTdHlsZVZpZXdVcGRhdGVyIGxhc3RVcGRhdGVyOwotCXByb3RlY3RlZCBpbnQgZGVsYXlNU2VjcyA9IDUwMDsKLQlmaW5hbCBzdGF0aWMgQ2xhc3MgQURBUFRFUl9LRVkgPSBJSkZhY2VOb2RlQWRhcHRlci5jbGFzczsKLQotCXB1YmxpYyBDU1NOb2RlQWRhcHRlcihJTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxBY3Rpb25QZXJmb3JtZWQoKSB7Ci0JCWlmIChub3RpZnlRdWV1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiByZWZyZXNoX2FsbCA9IGZhbHNlOwotCQlib29sZWFuIHJlZnJlc2hfcnVsZSA9IGZhbHNlOwotCQlpbnQgcG9zX2FsbCA9IDA7Ci0JCUxpc3QgdGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZnlRdWV1ZS5zaXplKCk7IGkrKykgewotCQkJTm90aWZ5Q29udGV4dCBjb250ZXh0ID0gKE5vdGlmeUNvbnRleHQpIG5vdGlmeVF1ZXVlLmdldChpKTsKLQkJCWlmIChjb250ZXh0Lm5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlyZWZyZXNoX2FsbCA9IHRydWU7Ci0JCQkJcG9zX2FsbCA9IGk7Ci0JCQl9Ci0JCQlpZiAoY29udGV4dC5ub3RpZmllciBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQkJcmVmcmVzaF9ydWxlID0gdHJ1ZTsKLQkJCQl0YXJnZXRzLmFkZChjb250ZXh0KTsKLQkJCQkvLyBwb3NfcnVsZSA9IGk7Ci0JCQl9Ci0JCQkvLyAoKE5vdGlmeUNvbnRleHQpIG5vdGlmeVF1ZXVlLmdldChpKSkuZmlyZSgpOwotCQl9Ci0JCWlmIChyZWZyZXNoX2FsbCkgewotCQkJKChOb3RpZnlDb250ZXh0KSBub3RpZnlRdWV1ZS5nZXQocG9zX2FsbCkpLmZpcmUoKTsKLQkJfQotCQllbHNlIGlmIChyZWZyZXNoX3J1bGUpIHsKLQkJCUl0ZXJhdG9yIGkgPSB0YXJnZXRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQkoKE5vdGlmeUNvbnRleHQpIGkubmV4dCgpKS5maXJlKCk7Ci0JCQl9Ci0JCQkvLyBlbHNlIGlmIChyZWZyZXNoX3J1bGUpIGludGVybmFsUmVmcmVzaEFsbCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZnlRdWV1ZS5zaXplKCk7IGkrKykgewotCQkJCSgoTm90aWZ5Q29udGV4dCkgbm90aWZ5UXVldWUuZ2V0KGkpKS5maXJlKCk7Ci0JCQl9Ci0JCX0KLQkJbm90aWZ5UXVldWUuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgdGhlIG9iamVjdCBiZWluZyBhZGFwdGVyICh0aGUgbm90aWZpZXIpIHdoZW4gc29tZXRoaW5nIGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgaW50ZXJuYWxOb3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSAoKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldExpc3RlbmVycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQlub3RpZnlDaGFuZ2VkRm9yU3RydWN0dXJlZFZpZXdlcigoU3RydWN0dXJlZFZpZXdlcikgbGlzdGVuZXIsIG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCQkJbm90aWZ5Q2hhbmdlZEZvclByb3BlcnR5U2hlZXRQYWdlKChQcm9wZXJ0eVNoZWV0UGFnZSkgbGlzdGVuZXIsIG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5Q2hhbmdlZEZvclByb3BlcnR5U2hlZXRQYWdlKFByb3BlcnR5U2hlZXRQYWdlIHBhZ2UsIElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKHBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgcGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQlwYWdlLnJlZnJlc2goKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlDaGFuZ2VkRm9yU3RydWN0dXJlZFZpZXdlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciwgSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAodmlld2VyLmdldENvbnRyb2woKSA9PSBudWxsIHx8IHZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlJQ1NTTm9kZSB0ZW1wID0gKGNoYW5nZWRGZWF0dXJlICE9IG51bGwpID8gKElDU1NOb2RlKSBjaGFuZ2VkRmVhdHVyZSA6IChJQ1NTTm9kZSkgbmV3VmFsdWU7Ci0JCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3IgKDs7KSB7Ci0JCQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmICh0ZW1wID09IG51bGwpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAodGVtcCA9PSBudWxsIHx8IHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkgewotCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSUNTU05vZGUgdGVtcCA9IChJQ1NTTm9kZSkgbm90aWZpZXI7Ci0JCQkJaWYgKHRlbXAgIT0gbnVsbCkgewotCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmICh0ZW1wID09IG51bGwgfHwgdGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlJQ1NTTm9kZSB0ZW1wID0gKGNoYW5nZWRGZWF0dXJlICE9IG51bGwpID8gKElDU1NOb2RlKSBjaGFuZ2VkRmVhdHVyZSA6IChJQ1NTTm9kZSkgbmV3VmFsdWU7Ci0JCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3IgKDs7KSB7Ci0JCQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmICh0ZW1wID09IG51bGwpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodGVtcCA9PSBudWxsIHx8ICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobmV3VmFsdWUgIT0gbnVsbCAmJiAobmV3VmFsdWUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKChJQ1NTTm9kZSkgbmV3VmFsdWUpLmdldFBhcmVudE5vZGUoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJQ1NTTm9kZSB0ZW1wID0gKElDU1NOb2RlKSBub3RpZmllcjsKLQkJCQkJaWYgKHRlbXAgIT0gbnVsbCkgewotCQkJCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJCWlmICh0ZW1wID09IG51bGwgfHwgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkpIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQkJSUNTU05vZGUgdGVtcCA9IChjaGFuZ2VkRmVhdHVyZSAhPSBudWxsKSA/IChJQ1NTTm9kZSkgY2hhbmdlZEZlYXR1cmUgOiAoSUNTU05vZGUpIG5ld1ZhbHVlOwotCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZm9yICg7OykgewotCQkJCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAodGVtcCA9PSBudWxsKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHRlbXAgPT0gbnVsbCB8fCAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSkgewotCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdmlld2VyLnJlZnJlc2gobm90aWZpZXIpOwotCQkJCUlDU1NOb2RlIHRlbXAgPSAoSUNTU05vZGUpIG5vdGlmaWVyOwotCQkJCWlmICh0ZW1wICE9IG51bGwpIHsKLQkJCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQlpZiAodGVtcCA9PSBudWxsIHx8ICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGludGVybmFsUmVmcmVzaEFsbCgpIHsKLQkJQ29sbGVjdGlvbiBsaXN0ZW5lcnMgPSAoKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKSBhZGFwdGVyRmFjdG9yeSkuZ2V0TGlzdGVuZXJzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBsaXN0ZW5lcjsKLQkJCQlpZiAodmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJCQlQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKFByb3BlcnR5U2hlZXRQYWdlKSBsaXN0ZW5lcjsKLQkJCQlpZiAocGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhcGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoQURBUFRFUl9LRVkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgb2JqZWN0IGJlaW5nIGFkYXB0ZXIgKHRoZSBub3RpZmllcikgd2hlbiBzb21ldGhpbmcgaGFzCi0JICogY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKG5vdGlmeVF1ZXVlID09IG51bGwpCi0JCQlub3RpZnlRdWV1ZSA9IG5ldyBWZWN0b3IoKTsKLQkJbm90aWZ5UXVldWUuYWRkKG5ldyBOb3RpZnlDb250ZXh0KG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcykpOwotCQkvLyBUT0RPLWZ1dHVyZTogdGhlcmUncyBwcm9iYWJseSBhIGJldHRlciB3YXkgdGhhbiByZWx5aW5nIG9uIGFzeW5jCi0JCS8vIGV4ZWMKLQkJaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpKQotCQkJZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyhkZWxheU1TZWNzLCB0aGlzKTsKLQkJZWxzZQotCQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0RGlzcGxheSgpICE9IG51bGwpIHsKLQkJCQkJCWdldERpc3BsYXkoKS50aW1lckV4ZWMoZGVsYXlNU2VjcywgdGhpcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQl9Ci0KLQlEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBvbmx5IGZvciB0aW1lckV4ZWMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbGFzdFVwZGF0ZXIgPSBuZXcgU3R5bGVWaWV3VXBkYXRlcigpOwotCQlnZXREaXNwbGF5KCkuYXN5bmNFeGVjKGxhc3RVcGRhdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIGNvbnRhaW5pbmcgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBnaXZlbiBlbGVtZW50LAotCSAqIHdoaWNoIHJlcHJlc2VudHMgYSBub2RlIGluIGEgdHJlZS4gVGhlIGRpZmZlcmVuY2UgdG8KLQkgKiA8Y29kZT5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhPYmplY3QpPC9jb2RlPiBpcyBhcwotCSAqIGZvbGxvd3M6IDxjb2RlPmdldEVsZW1lbnRzPC9jb2RlPiBpcyBjYWxsZWQgdG8gb2J0YWluIHRoZSB0cmVlCi0JICogdmlld2VyJ3Mgcm9vdCBlbGVtZW50cy4gTWV0aG9kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBpcyB1c2VkIHRvCi0JICogb2J0YWluIHRoZSBjaGlsZHJlbiBvZiBhIGdpdmVuIG5vZGUgaW4gdGhlIHRyZWUsIHdoaWNoIGNhbiBjYW4gYmUgYQotCSAqIHJvb3Qgbm9kZSwgdG9vLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgb2JqZWN0OwotCi0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFKSB7Ci0JCQkJZm9yIChub2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbCAmJiAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbik7IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQkvLyBub3AKLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUNTU05vZGUgY2hpbGQgPSAobm9kZSAhPSBudWxsKSA/IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpIDogbnVsbDsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpICYmICEoY2hpbGQgaW5zdGFuY2VvZiBNZWRpYUxpc3QpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogUmVxdWlyZWQgdG8gY29ycmVjdGx5IGNvbm5lY3QgdGhlIHJlZnJlc2hpbmcgYmVoYXZpb3IgdG8KLQkJCQkgKiB0aGUgdHJlZQotCQkJCSAqLwotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJKChJTm9kZU5vdGlmaWVyKSBjaGlsZCkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJfQotCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiB3aXRoIHRoZSBlbGVtZW50cyBiZWxvbmdpbmcgdG8gdGhlIHBhc3NlZAotCSAqIGVsZW1lbnQuIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhCi0JICogbGlzdCBldGMuCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVGhlIHJvb3QgaXMgdXN1YWxseSBhbiBpbnN0YW5jZSBvZiBhbiBYTUxTdHJ1Y3R1cmVkTW9kZWwgaW4KLQkJLy8gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGV4dHJhY3QgdGhlIGRvY3VtZW50LgotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCUFycmF5TGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gaW50ZXJuYWxHZXRFbGVtZW50cyhvYmplY3QsIHYpOwotCQkJYWRkRWxlbWVudHMob2JqZWN0LCB2KTsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gdi50b0FycmF5KCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkvKgotCQkJCSAqIFJlcXVpcmVkIHRvIGNvcnJlY3RseSBjb25uZWN0IHRoZSByZWZyZXNoaW5nIGJlaGF2aW9yIHRvCi0JCQkJICogdGhlIHRyZWUKLQkJCQkgKi8KLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCSgoSU5vZGVOb3RpZmllcikgZWxlbWVudHNbaV0pLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UuIEVsZW1lbnQKLQkgKiAgICAgICAgICAgIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIG5vIGlucHV0IG9iamVjdCBpcyBzZXQKLQkgKiAgICAgICAgICAgIHRvIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJQ1NTSW1hZ2VIZWxwZXIgaGVscGVyID0gQ1NTSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCXJldHVybiBoZWxwZXIuZ2V0SW1hZ2UoQ1NTSW1hZ2VUeXBlLmdldEltYWdlVHlwZSgoSUNTU05vZGUpIGVsZW1lbnQpKTsKLQkJCS8vIEltYWdlIGltYWdlID0gZ2V0Q1NTTm9kZUltYWdlKGVsZW1lbnQpOwotCQkJLy8gcmV0dXJuIGltYWdlOwotCQkJLy8gcmV0dXJuIGdldEFkYXB0ZXIoZWxlbWVudCkuZ2V0TGFiZWxJbWFnZSgoSUNTU05vZGUpIGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgdGV4dC4gRWxlbWVudCBjYW4KLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgbm8gaW5wdXQgb2JqZWN0IGlzIHNldCB0bwotCSAqICAgICAgICAgICAgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dChPYmplY3QgZWxlbWVudCkgewotCQkvLyBUaGlzIHdhcyByZXR1cm5pbmcgbnVsbCwgb24gb2NjYXNpb24gLi4uIHByb2JhYmx5IHNob3VsZCBub3QgYmUsCi0JCS8vIGJ1dAotCQkvLyB0b29rIHRoZSBxdWljayBhbmQgZWFzeSB3YXkgb3V0IGZvciBub3cuIChkbXcgMy84LzAxKQotCi0JCVN0cmluZyByZXN1bHQgPSAiIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBtZWRpYVRleHQ7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCXN3aXRjaCAoKChJQ1NTTm9kZSkgZWxlbWVudCkuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgSUNTU05vZGUuU1RZTEVSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAoKElDU1NTdHlsZVJ1bGUpIGVsZW1lbnQpLmdldFNlbGVjdG9ycygpLmdldFN0cmluZygpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIDoKLQkJCQkJcmVzdWx0ID0gIkBmb250LWZhY2UiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAoKENTU0ltcG9ydFJ1bGUpIGVsZW1lbnQpLmdldEhyZWYoKTsKLQkJCQkJbWVkaWFUZXh0ID0gZ2V0TWVkaWFUZXh0KChDU1NJbXBvcnRSdWxlKSBlbGVtZW50KTsKLQkJCQkJaWYgKG1lZGlhVGV4dCAhPSBudWxsICYmIDAgPCBtZWRpYVRleHQubGVuZ3RoKCkpIHsKLQkJCQkJCXJlc3VsdCArPSAiICgiICsgbWVkaWFUZXh0ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlBBR0VSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAiQHBhZ2UiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUgOgotCQkJCQlyZXN1bHQgPSAicHJvcGVydGllcyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIGVsZW1lbnQpLmdldFByb3BlcnR5TmFtZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCQlyZXN1bHQgPSAoKElDU1NQcmltaXRpdmVWYWx1ZSkgZWxlbWVudCkuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICJAbWVkaWEiOy8vJE5PTi1OTFMtMSQKLQkJCQkJbWVkaWFUZXh0ID0gZ2V0TWVkaWFUZXh0KChJQ1NTTWVkaWFSdWxlKSBlbGVtZW50KTsKLQkJCQkJaWYgKG1lZGlhVGV4dCAhPSBudWxsICYmIDAgPCBtZWRpYVRleHQubGVuZ3RoKCkpIHsKLQkJCQkJCXJlc3VsdCArPSAiICgiICsgbWVkaWFUZXh0ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAiQGNoYXJzZXQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoTWVkaWFMaXN0KSBlbGVtZW50KS5nZXRNZWRpYVRleHQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkvLyBJQ1NTTm9kZSBub2RlID0gKChJQ1NTTm9kZSllbGVtZW50KTsKLQkJLy8gcmVzdWx0ID0gZ2V0QWRhcHRlcihlbGVtZW50KS5nZXRMYWJlbFRleHQoKElDU1NOb2RlKSBlbGVtZW50KTsKLQkJLy8gfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gSW4KLQkgKiB0aGlzIGNhc2UgdGhlIHRyZWUgdmlld2VyIGNhbid0IGV4cGFuZCBhIGdpdmVuIG5vZGUgY29ycmVjdGx5IGlmCi0JICogcmVxdWVzdGVkLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBub2RlID0gKChJQ1NTTm9kZSkgb2JqZWN0KS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpIHsKLQkJCQkvKgotCQkJCSAqIFJlcXVpcmVkIHRvIGFsc28gY29ycmVjdGx5IGNvbm5lY3Qgc3R5bGUgZGVjbGFyYXRpb24gdG8gdGhlCi0JCQkJICogcmVmcmVzaGluZyBiZWhhdmlvciBpbiB0aGUgdHJlZQotCQkJCSAqLwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkoKElOb2RlTm90aWZpZXIpIG5vZGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCX0KLQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBlbGVtZW50IGhhcyBjaGlsZHJlbi4KLQkgKiBPdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gcmV0dXJuIGdldEFkYXB0ZXIob2JqZWN0KS5oYXNDaGlsZHJlbigoSUNTU05vZGUpIG9iamVjdCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJLyoKLQkJCSAqIFJlcXVpcmVkIHRvIGNvcnJlY3RseSBjb25uZWN0IHRoZSByZWZyZXNoaW5nIGJlaGF2aW9yIHRvIHRoZQotCQkJICogdHJlZQotCQkJICovCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCSgoSU5vZGVOb3RpZmllcikgb2JqZWN0KS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKChJQ1NTTm9kZSkgb2JqZWN0KS5oYXNDaGlsZE5vZGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFbGVtZW50cyhPYmplY3QgZWxlbWVudCwgQXJyYXlMaXN0IHYpIHsKLQotCQlJQ1NTTm9kZSBub2RlOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoSUNTU01vZGVsKSBlbGVtZW50OwotCQkJSUNTU0RvY3VtZW50IGRvYyA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlub2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoKElDU1NOb2RlKSBlbGVtZW50KS5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuOwotCi0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCXYuYWRkKG5vZGUpOwotCQkJfQotCi0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZWRpYVRleHQoQ1NTUnVsZSBydWxlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJQ1NTTm9kZSBjaGlsZCA9IChydWxlICE9IG51bGwpID8gKChJQ1NTTm9kZSkgcnVsZSkuZ2V0Rmlyc3RDaGlsZCgpIDogbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJcmVzdWx0ID0gKChNZWRpYUxpc3QpIGNoaWxkKS5nZXRNZWRpYVRleHQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2U4ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MgZXh0ZW5kcyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKCkgewotCQl0aGlzKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IENTU05vZGVBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBzaW5nbGV0b25BZGFwdGVyOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzE1NWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3Mgb25seSBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0aGF0IHlvdSBzaG91bGQKLSAqICAgICAgICAgICAgIGFjdHVhbGx5IGltcGxlbWVudCB5b3Vyc2VsZi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9IENTU1VJTWVzc2FnZXMuVUlfbm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCWNvbWJvLmFkZChOT05FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSUQoKTsKLQkJCVN0cmluZyBuYW1lID0gcHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwotCQkJY29tYm8uYWRkKG5hbWUsIGlkKTsKLQkJfQotCQljb21iby5zb3J0QnlLZXkoMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjBmMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3RPblByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGluc3RlYWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSB7Ci0KLQlwcml2YXRlIGZpbmFsIGludCBOX0NTU19QUk9GSUxFID0gMDsKLQotCi0KLQlwdWJsaWMgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQludW1iZXJPZkNvbWJvID0gMTsKLQkJbnVtQ29scyA9IDI7Ci0JCW51bVJvd3MgPSAxOwotCQljb21ibyA9IG5ldyBDb21ib0xpc3RPblByb3BlcnR5UGFnZVtzdXBlci5udW1iZXJPZkNvbWJvXTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNTU0NvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX0NTU19QUk9GSUxFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoQ1NTX0xBQkVMKTsKLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0Q1NTTWV0YU1vZGVsUmVnaXN0cnlJbnRvKGNvbWJvW05fQ1NTX1BST0ZJTEVdKTsKLQkJaWYgKGNvbWJvW05fQ1NTX1BST0ZJTEVdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpbml0VmFsdWUgPSBjb250ZW50U2V0dGluZ3MuZ2V0UHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX0NTU19QUk9GSUxFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2V0dGluZ3NQYWdlR1VJKCkgewotCi0JCWludCB0eXBlID0gKChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKSkuZ2V0VHlwZSgpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCS8vY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHByb3BlcnR5UGFnZSxudW1Db2xzLG51bVJvd3MpOwotCQkJCWNyZWF0ZUNTU0NvbWJvQm94KCk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5DU1NfQ09OVEVOVF9TRVRUSU5HU19IRUxQSUQpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzIGluc3RhbnRpYXRlZCBieSByZXNvdXJjZSBleGNlcHQgRklMRSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRTZWxlY3RlZFByb3BlcnR5SW50byhNYXAgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlSW5Db21ibywgaW50IGluZGV4KSB7Ci0KLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oKSBpbiBjbGFzcyBDU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiKTsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU5vbmVQcm9wZXJ0eShpbnQgaW5kZXgpIHsKLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gZGVsZXRlTm9uZVByb3BlcnR5KCkgaW4gY2xhc3MgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxZGZmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ1NTQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfTk9ORSA9IENTU1VJTWVzc2FnZXMuVUlfbm9uZTsKLQotCXByaXZhdGUgQ29tYm8gZlByb2ZpbGVDb21ibzsKLQlwcml2YXRlIExpc3QgZlByb2ZpbGVJZHM7Ci0KLQlwdWJsaWMgQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQlzZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLkNTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHByb3BlcnR5UGFnZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCi0JCS8vIENTUyBQcm9maWxlIGNvbnRyb2wKLQkJVGV4dCBsYW5ndWFnZUxhYmVsID0gbmV3IFRleHQocHJvcGVydHlQYWdlLCBTV1QuUkVBRF9PTkxZKTsKLQkJbGFuZ3VhZ2VMYWJlbC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzEpOwotCQlmUHJvZmlsZUNvbWJvID0gbmV3IENvbWJvKHByb3BlcnR5UGFnZSwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmUHJvZmlsZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcG9wdWxhdGVWYWx1ZXMoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJvcGVydHlQYWdlLCBJSGVscENvbnRleHRJZHMuQ1NTX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgdGhpcyBwcm9wZXJ0aWVzIHBhZ2UgaXMgZm9yCi0JICogCi0JICogQHJldHVybiBJUmVzb3VyY2UgZm9yIHRoaXMgcHJvcGVydGllcyBwYWdlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIElSZXNvdXJjZQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCVN0cmluZyBwcm9maWxlID0gQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTX1BST0ZJTEUsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKHByb2ZpbGUgIT0gbnVsbCAmJiBwcm9maWxlLmxlbmd0aCgpID4gMCkgewotCQkJLyoKLQkJCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgc2VsZWN0Ci0JCQkgKiBub25lLgotCQkJICovCi0JCQlpbmRleCA9IGZQcm9maWxlSWRzLmluZGV4T2YocHJvZmlsZSk7Ci0JCX0KLQkJaW5kZXggPSBpbmRleCA+PSAwID8gaW5kZXggOiAwOwotCQlmUHJvZmlsZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVmFsdWVzKCkgewotCQlmUHJvZmlsZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gYWRkIG5vbmUgZmlyc3QKLQkJZlByb2ZpbGVDb21iby5hZGQoU0VMRUNUX05PTkUpOwotCQlmUHJvZmlsZUlkcy5hZGQobnVsbCk7Ci0KLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSUQoKTsKLQkJCVN0cmluZyBuYW1lID0gcHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwotCQkJZlByb2ZpbGVDb21iby5hZGQobmFtZSk7Ci0JCQlmUHJvZmlsZUlkcy5hZGQoaWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlpbnQgaW5kZXggPSBmUHJvZmlsZUNvbWJvLmluZGV4T2YoU0VMRUNUX05PTkUpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZQcm9maWxlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWludCBpbmRleCA9IGZQcm9maWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGZQcm9maWxlSWRzLmdldChpbmRleCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwIHx8IGlkLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlpZCA9IG51bGw7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCUNTU0NvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBnZXRSZXNvdXJjZSgpLCBpZCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nCi0JCQkJLy8gZmlsZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkNTU0RlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyZDZkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DbGVhbnVwUHJvY2Vzc29yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi0vKioKLSAqIENsZWFudXAgYWN0aW9uIGRlbGVnYXRlIGZvciBDU1MgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBmQ2xlYW51cFByb2Nlc3NvcjsKLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZFZGl0b3IgPSBudWxsOwotCQlmQ2xlYW51cFByb2Nlc3NvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChDU1NVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlmaW5hbCBJVGV4dEVkaXRvciBlZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0JCQlEaWFsb2cgY2xlYW51cERpYWxvZyA9IG5ldyBDbGVhbnVwRGlhbG9nQ1NTKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0KLQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZkVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIHJ1bm5hYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnCi0JCQkJCQkvLyBtb2RlbAotCQkJCQkJLy8gY2hhbmdlCi0JCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQotCQkJCQkJLy8gZW5kIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29yID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvciA9IG5ldyBDbGVhbnVwUHJvY2Vzc29yQ1NTKCk7Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwMDdhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRGlhbG9nQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwRGlhbG9nQ1NTIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgYm9vbGVhbiBlbWJlZGRlZENTUzsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbklkZW50Q2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25JZGVudENhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbklkZW50Q2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94UXVvdGVWYWx1ZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hGb3JtYXRTb3VyY2U7Ci0KLQkvKioKLQkgKiBDU1NDbGVhbnVwRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqLwotCXB1YmxpYyBDbGVhbnVwRGlhbG9nQ1NTKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGlzRW1iZWRkZWRDU1MoKSkKLQkJCWdldFNoZWxsKCkuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkNTU19DbGVhbnVwX1VJXyk7Ci0JCWVsc2UKLQkJCWdldFNoZWxsKCkuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkNsZWFudXBfVUlfKTsKLQotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCXBhbmVsLnNldExheW91dChsYXlvdXQpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFuZWwsIElIZWxwQ29udGV4dElkcy5DU1NfQ0xFQU5VUF9IRUxQSUQpOwotCi0JCS8vIENvbnZlcnQgaWRlbnQgY2FzZQotCQkvLyBBQ0M6IEdyb3VwIHJhZGlvIGJ1dHRvbnMgdG9nZXRoZXIgc28gYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCS8vCQlMYWJlbCBpZGVudENhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkvLwkJaWRlbnRDYXNlTGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJZGVudGlmaWVyX2Nhc2VfX1VJXyIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJJZGVudGlmaWVyIGNhc2U6IgotCQkvLwkJQ2FudmFzIGlkZW50Q2FzZSA9IG5ldyBDYW52YXMocGFuZWwsIFNXVC5OVUxMKTsKLQkJR3JvdXAgaWRlbnRDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCWlkZW50Q2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuSWRlbnRpZmllcl9jYXNlX19VSV8pOwotCQlHcmlkTGF5b3V0IGhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlpZGVudENhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzID0gbmV3IEJ1dHRvbihpZGVudENhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUFzaXMuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkFzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyID0gbmV3IEJ1dHRvbihpZGVudENhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlciA9IG5ldyBCdXR0b24oaWRlbnRDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuVXBwZXJfVUlfKTsKLQotCQkvLyBDb252ZXJ0IHByb3BlcnR5IG5hbWUgY2FzZQotCQkvLyBBQ0M6IEdyb3VwIHJhZGlvIGJ1dHRvbnMgdG9nZXRoZXIgc28gYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCS8vCQlMYWJlbCBwcm9wTmFtZUNhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkvLwkJcHJvcE5hbWVDYXNlTGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQcm9wZXJ0eV9uYW1lX2Nhc2VfX1VJXyIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJQcm9wZXJ0eSBuYW1lIGNhc2U6IgotCQkvLwkJQ2FudmFzIHByb3BOYW1lQ2FzZSA9IG5ldyBDYW52YXMocGFuZWwsIFNXVC5OVUxMKTsKLQkJR3JvdXAgcHJvcE5hbWVDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCXByb3BOYW1lQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJvcGVydHlfbmFtZV9jYXNlX19VSV8pOwotCQloTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJcHJvcE5hbWVDYXNlLnNldExheW91dChoTGF5b3V0KTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcyA9IG5ldyBCdXR0b24ocHJvcE5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VBc2lzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Bc19pc19VSV8pOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VMb3dlciA9IG5ldyBCdXR0b24ocHJvcE5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VMb3dlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTG93ZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHByb3BOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlVwcGVyX1VJXyk7Ci0KLQkJLy8gQ29udmVydCBwcm9wZXJ0eSBWYWx1ZSBjYXNlCi0JCS8vIEFDQzogR3JvdXAgcmFkaW8gYnV0dG9ucyB0b2dldGhlciBzbyBhc3NvY2lhdGVkIGxhYmVsIGlzIHJlYWQKLQkJLy8JCUxhYmVsIHByb3BWYWx1ZUNhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkvLwkJcHJvcFZhbHVlQ2FzZUxhYmVsLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvcGVydHlfdmFsdWVfY2FzZV9fVUlfIikpOwotCQkvLyAvLyROT04tTkxTLTEkID0gIlByb3BlcnR5IHZhbHVlIGNhc2U6IgotCQkvLwkJQ2FudmFzIHByb3BWYWx1ZUNhc2UgPSBuZXcgQ2FudmFzKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCUdyb3VwIHByb3BWYWx1ZUNhc2UgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OVUxMKTsKLQkJcHJvcFZhbHVlQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJvcGVydHlfdmFsdWVfY2FzZV9fVUlfKTsKLQkJaExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWhMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXByb3BWYWx1ZUNhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpcyA9IG5ldyBCdXR0b24ocHJvcFZhbHVlQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUFzaXMuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkFzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VMb3dlciA9IG5ldyBCdXR0b24ocHJvcFZhbHVlQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHByb3BWYWx1ZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VVcHBlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuVXBwZXJfVUlfKTsKLQotCQlpZiAoIWlzRW1iZWRkZWRDU1MoKSkgewotCQkJLy8gQ29udmVydCBzZWxlY3RvciB0YWcgY2FzZQotCQkJLy8gQUNDOiBHcm91cCByYWRpbyBidXR0b25zIHRvZ2V0aGVyIHNvIGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQkJLy8JCQlMYWJlbCBzZWxlY3RvclRhZ0Nhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkJLy8JCQlzZWxlY3RvclRhZ0Nhc2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdG9yX3RhZ19uYW1lX2Nhc2VfX1VJXyIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQgPSAiU2VsZWN0b3IgdGFnIG5hbWUgY2FzZToiCi0JCQkvLwkJCUNhbnZhcyBzZWxlY3RvclRhZ0Nhc2UgPSBuZXcgQ2FudmFzKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCQlHcm91cCBzZWxlY3RvclRhZ0Nhc2UgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OVUxMKTsKLQkJCXNlbGVjdG9yVGFnQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuU2VsZWN0b3JfdGFnX25hbWVfY2FzZV9fVUlfKTsKLQkJCWhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJCXNlbGVjdG9yVGFnQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzID0gbmV3IEJ1dHRvbihzZWxlY3RvclRhZ0Nhc2UsIFNXVC5SQURJTyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Bc19pc19VSV8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlTG93ZXIgPSBuZXcgQnV0dG9uKHNlbGVjdG9yVGFnQ2FzZSwgU1dULlJBRElPKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHNlbGVjdG9yVGFnQ2FzZSwgU1dULlJBRElPKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZVVwcGVyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5VcHBlcl9VSV8pOwotCQl9Ci0KLQkJLy8gUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotCQlmQ2hlY2tCb3hRdW90ZVZhbHVlcyA9IG5ldyBCdXR0b24ocGFuZWwsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveFF1b3RlVmFsdWVzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5RdW90ZV92YWx1ZXNfVUlfKTsKLQotCQlpZiAoIWlzRW1iZWRkZWRDU1MoKSkgewotCQkJLy8gRm9ybWF0IHNvdXJjZQotCQkJZkNoZWNrQm94Rm9ybWF0U291cmNlID0gbmV3IEJ1dHRvbihwYW5lbCwgU1dULkNIRUNLKTsKLQkJCWZDaGVja0JveEZvcm1hdFNvdXJjZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuRm9ybWF0X3NvdXJjZV9VSV8pOwotCQl9Ci0KLQkJc2V0Q2xlYW51cE9wdGlvbnMoKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRDU1MoKSB7Ci0JCXJldHVybiBlbWJlZGRlZENTUzsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl1cGRhdGVDbGVhbnVwT3B0aW9ucygpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xlYW51cE9wdGlvbnMoKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChzdGd5LmdldElkZW50Q2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChzdGd5LmdldElkZW50Q2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25JZGVudENhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZSBpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUFzaXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZVVwcGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UgaWYgKHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChzdGd5LmdldFNlbGVjdG9yVGFnQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChzdGd5LmdldFNlbGVjdG9yVGFnQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlpZiAoZkNoZWNrQm94UXVvdGVWYWx1ZXMgIT0gbnVsbCkKLQkJCWZDaGVja0JveFF1b3RlVmFsdWVzLnNldFNlbGVjdGlvbihzdGd5LmlzUXVvdGVWYWx1ZXMoKSk7Ci0KLQkJaWYgKGZDaGVja0JveEZvcm1hdFNvdXJjZSAhPSBudWxsKQotCQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFNlbGVjdGlvbihzdGd5LmlzRm9ybWF0U291cmNlKCkpOwotCi0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdFbWJlZGRlZENTUwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYmVkZGVkQ1NTKGJvb2xlYW4gbmV3RW1iZWRkZWRDU1MpIHsKLQkJZW1iZWRkZWRDU1MgPSBuZXdFbWJlZGRlZENTUzsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2xlYW51cE9wdGlvbnMoKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdGd5LnNldElkZW50Q2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpOwotCQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uSWRlbnRDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRJZGVudENhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKTsKLQkJCWVsc2UKLQkJCQlzdGd5LnNldElkZW50Q2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wTmFtZUNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKTsKLQkJCWVsc2UgaWYgKGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0UHJvcE5hbWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5MT1dFUik7Ci0JCQllbHNlCi0JCQkJc3RneS5zZXRQcm9wTmFtZUNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5VUFBFUik7Ci0JCQllbHNlIGlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5MT1dFUik7Ci0JCQllbHNlCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5BU0lTKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdGd5LnNldFNlbGVjdG9yVGFnQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpOwotCQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRTZWxlY3RvclRhZ0Nhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKTsKLQkJCWVsc2UKLQkJCQlzdGd5LnNldFNlbGVjdG9yVGFnQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyk7Ci0JCX0KLQotCQlpZiAoZkNoZWNrQm94UXVvdGVWYWx1ZXMgIT0gbnVsbCkKLQkJCXN0Z3kuc2V0UXVvdGVWYWx1ZXMoZkNoZWNrQm94UXVvdGVWYWx1ZXMuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCWlmIChmQ2hlY2tCb3hGb3JtYXRTb3VyY2UgIT0gbnVsbCkKLQkJCXN0Z3kuc2V0Rm9ybWF0U291cmNlKGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJLy8gc2F2ZSB0aGVzZSB2YWx1ZXMgdG8gcHJlZmVyZW5jZXMKLQkJKChDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsKSBzdGd5KS5zYXZlT3B0aW9ucygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdG9yL0NTU0VkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTU5ZTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIENTUyBTb3VyY2UgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NFZGl0b3JQbHVnaW5JbWFnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU09SVCA9ICJpY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TVFlMRVNIRUVUID0gImljb25zL2Z1bGwvb2JqMTYvc3R5bGVzaGVldC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9SVUxFX0NIQVJTRVQgPSAiaWNvbnMvZnVsbC9vYmoxNi9jaGFyc2V0X3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9GT05URkFDRSA9ICJpY29ucy9mdWxsL29iajE2L2ZvbnRmYWNlX3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9JTVBPUlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9saW5rX3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9NRURJQSA9ICJpY29ucy9mdWxsL29iajE2L21lZGlhX3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9QQUdFID0gImljb25zL2Z1bGwvb2JqMTYvcGFnZV9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfU1RZTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9zdHlsZV9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfVU5LTk9XTiA9ICJpY29ucy9mdWxsL29iajE2L3Vua25vd25fcnVsZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX0NMQVNTID0gImljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfc2VsZWN0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU0VMRUNUT1JfSUQgPSAiaWNvbnMvZnVsbC9vYmoxNi9pZF9zZWxlY3Rvci5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TRUxFQ1RPUl9QU0VVRE8gPSAiaWNvbnMvZnVsbC9vYmoxNi9wc2V1ZG8uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU0VMRUNUT1JfVEFHID0gImljb25zL2Z1bGwvb2JqMTYvdGFnX3NlbGVjdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX0xJTksgPSAiaWNvbnMvZnVsbC9vYmoxNi9saW5rX3NlbGVjdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX0RFRkFVTFQgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWdfc2VsZWN0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9WQUxVRV9GVU5DVElPTiA9ICJpY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2Z1bmN0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1ZBTFVFX05VTUJFUiA9ICJpY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX3VuaXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVkFMVUVfU1RSSU5HID0gImljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfaWRlbnRpZmllci5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX0FVUkFMID0gImljb25zL2Z1bGwvb2JqMTYvYXVyYWxfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfQk9YID0gImljb25zL2Z1bGwvb2JqMTYvYm94bW9kZWxfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EID0gImljb25zL2Z1bGwvb2JqMTYvY29sYmFja19wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9DT05URU5UID0gImljb25zL2Z1bGwvb2JqMTYvY29udGVudF9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9GT05UID0gImljb25zL2Z1bGwvb2JqMTYvZm9udF9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9QQUdFID0gImljb25zL2Z1bGwvb2JqMTYvcGFnZWRtZWRpYV9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9UQUJMRVMgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWJsZV9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9URVhUID0gImljb25zL2Z1bGwvb2JqMTYvdGV4dF9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9VSSA9ICJpY29ucy9mdWxsL29iajE2L3VpX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX1ZJU1VBTCA9ICJpY29ucy9mdWxsL29iajE2L3Zpc3VhbF9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9ERUZBVUxUID0gImljb25zL2Z1bGwvb2JqMTYvb3RoZXJfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEVNUExBVEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fTkVXQ1NTRklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdjc3NmaWxlX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzYyMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIENTUyBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBDU1NVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIENTUyBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1MgKyJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENTUyBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUFJFRldFQlhfRklMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8vIENTUyBTb3VyY2UgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMTEiOyAvLyROT04tTkxTLTEkCi0JLy8gQ1NTIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAxMiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDU1MgVGVtcGxhdGUgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMTMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDU1MgQ2xlYW51cCBkaWFsb2cKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ0xFQU5VUF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEzMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDU1MgQ29udGVudCBTZXR0aW5ncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DT05URU5UX1NFVFRJTkdTX0hFTFBJRCA9IFBSRUZJWCArICJtaXNjMDE4MCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBDU1MgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gUFJFRklYICsgImNzc3cwMDEwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL0NsZWFudXBEb2N1bWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9DbGVhbnVwRG9jdW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjNiM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL0NsZWFudXBEb2N1bWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DbGVhbnVwUHJvY2Vzc29yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aS5DbGVhbnVwRGlhbG9nQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwRG9jdW1lbnRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yUGFydDsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgbyA9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJCi0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IHRleHRFZGl0b3I7Ci0JCQlEaWFsb2cgY2xlYW51cERpYWxvZyA9IG5ldyBDbGVhbnVwRGlhbG9nQ1NTKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0KLQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29yID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvciA9IG5ldyBDbGVhbnVwUHJvY2Vzc29yQ1NTKCk7Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTk5ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXIgewotCQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IChJQ1NTTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkgewotCQkJCUlDU1NOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3ROZXh0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3ROZXh0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNjYjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0TmV4dEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3ROZXh0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJaW50IG9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlvZmZzZXQgPSAwOwotCi0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIG9mZnNldCk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCi0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIGN1cnNvck5vZGUgPSAoSUNTU05vZGUpIGluZGV4ZWRSZWdpb247Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkgewotCQkJCUlDU1NOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCQluZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24oY3VycmVudE9mZnNldCwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGN1cnJlbnRPZmZzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyN2E0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5BYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBjdXJzb3JOb2RlID0gKElDU1NOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWludCBjdXJyZW50T2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBjdXJyZW50RW5kT2Zmc2V0ID0gY3VycmVudE9mZnNldCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gY3VycmVudEVuZE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpIHsKLQkJCQlJQ1NTTm9kZSBuZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQlpZiAobmV3Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnRFbmRPZmZzZXQgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaW1hZ2UvQ1NTSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDJiZTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5DU1NFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotcHVibGljIGNsYXNzIENTU0ltYWdlSGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBDU1NJbWFnZUhlbHBlciBmSW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU0ltYWdlSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsJLy8gc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIE1hcCBmVHlwZU1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU0ltYWdlSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENTU1VJUGx1Z2luLklELCByZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQlkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQl9IGVsc2UgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENTU1VJUGx1Z2luLklELCBpbWFnZUZpbGVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChpbWFnZUZpbGVQYXRoLCBpbWFnZURlc2NyaXB0b3IpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogYnkgdHlwZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShDU1NJbWFnZVR5cGUgdHlwZSkgewotCQlpZiAoZlR5cGVNYXAgPT0gbnVsbCkgewotCQkJZlR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TVFlMRVNIRUVULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TVFlMRVNIRUVUKTsKLQotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX0NIQVJTRVQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfQ0hBUlNFVCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlJVTEVfRk9OVEZBQ0UsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfRk9OVEZBQ0UpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX0lNUE9SVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUlVMRV9JTVBPUlQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX01FRElBLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX01FRElBKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9QQUdFLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX1BBR0UpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX1NUWUxFLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX1NUWUxFKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9VTktOT1dOLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX1VOS05PV04pOwotCi0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX0NMQVNTLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9DTEFTUyk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX0lELCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9JRCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX1BTRVVETywgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU0VMRUNUT1JfUFNFVURPKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU0VMRUNUT1JfVEFHLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9UQUcpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9MSU5LLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9MSU5LKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU0VMRUNUT1JfREVGQVVMVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU0VMRUNUT1JfREVGQVVMVCk7Ci0KLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuVkFMVUVfRlVOQ1RJT04sIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1ZBTFVFX0ZVTkNUSU9OKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuVkFMVUVfTlVNQkVSLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9WQUxVRV9OVU1CRVIpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5WQUxVRV9TVFJJTkcsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1ZBTFVFX1NUUklORyk7Ci0KLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfQVVSQUwsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0FVUkFMKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfQk9YLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9CT1gpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9DT0xPUkFOREJBQ0tHUk9VTkQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0NPTE9SQU5EQkFDS0dST1VORCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0NPTlRFTlQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0NPTlRFTlQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9GT05ULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9GT05UKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfUEFHRSwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfUEFHRSk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1RBQkxFUywgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfVEFCTEVTKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfVEVYVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfVEVYVCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1VJLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9VSSk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1ZJU1VBTCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfVklTVUFMKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfREVGQVVMVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfREVGQVVMVCk7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlKChTdHJpbmcpIGZUeXBlTWFwLmdldCh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogYnkgcmVsYXRpdmUgcGF0aChmcm9tIGhlcmUpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyYmY5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaW1hZ2UvQ1NTSW1hZ2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2U7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NJbWFnZVR5cGUgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZk5hbWU7Ci0KLQlwcml2YXRlIENTU0ltYWdlVHlwZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLmZOYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgU1RZTEVTSEVFVCA9IG5ldyBDU1NJbWFnZVR5cGUoIlNUWUxFU0hFRVQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9DSEFSU0VUID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9DSEFSU0VUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX0ZPTlRGQUNFID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9GT05URkFDRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9JTVBPUlQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJSVUxFX0lNUE9SVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9NRURJQSA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfTUVESUEiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFJVTEVfUEFHRSA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfUEFHRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9TVFlMRSA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfU1RZTEUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFJVTEVfVU5LTk9XTiA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfVU5LTk9XTiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9DTEFTUyA9IG5ldyBDU1NJbWFnZVR5cGUoIlNFTEVDVE9SX0NMQVNTIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9JRCA9IG5ldyBDU1NJbWFnZVR5cGUoIlNFTEVDVE9SX0lEIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9ERUZBVUxUID0gbmV3IENTU0ltYWdlVHlwZSgiU0VMRUNUT1JfREVGQVVMVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgU0VMRUNUT1JfUFNFVURPID0gbmV3IENTU0ltYWdlVHlwZSgiU0VMRUNUT1JfUFNFVURPIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9UQUcgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJTRUxFQ1RPUl9UQUciKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX0xJTksgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJTRUxFQ1RPUl9MSU5LIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFZBTFVFX0ZVTkNUSU9OID0gbmV3IENTU0ltYWdlVHlwZSgiVkFMVUVfRlVOQ1RJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFZBTFVFX05VTUJFUiA9IG5ldyBDU1NJbWFnZVR5cGUoIlZBTFVFX05VTUJFUiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgVkFMVUVfU1RSSU5HID0gbmV3IENTU0ltYWdlVHlwZSgiVkFMVUVfU1RSSU5HIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0FVUkFMID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQVVSQUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0JPWCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX0JPWCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9DT05URU5UID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQ09OVEVOVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfRk9OVCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX0ZPTlQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1BBR0UgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9QQUdFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9UQUJMRVMgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9UQUJMRVMiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1RFWFQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9URVhUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9VSSA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1VJIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9WSVNVQUwgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9WSVNVQUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0RFRkFVTFQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9ERUZBVUxUIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGJ5IG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENTU0ltYWdlVHlwZSBnZXRJbWFnZVR5cGUoSUNTU05vZGUgbm9kZSkgewotCQlDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NDaGFyc2V0UnVsZSkgewotCQkJaW1hZ2VUeXBlID0gUlVMRV9DSEFSU0VUOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfRk9OVEZBQ0U7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU0ltcG9ydFJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfSU1QT1JUOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfTUVESUE7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1BhZ2VSdWxlKSB7Ci0JCQlpbWFnZVR5cGUgPSBSVUxFX1BBR0U7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlUnVsZSkgewotCQkJaW1hZ2VUeXBlID0gZ2V0SW1hZ2VUeXBlKCgoSUNTU1N0eWxlUnVsZSkgbm9kZSkuZ2V0U2VsZWN0b3JzKCkpOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRJbWFnZVR5cGUocGFyZW50KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCVN0cmluZyBuYW1lID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoZG9jICE9IG51bGwpID8gZG9jLmdldE1vZGVsKCkgOiBudWxsOwotCQkJQ1NTTWV0YU1vZGVsRmluZGVyIGZpbmRlciA9IENTU01ldGFNb2RlbEZpbmRlci5nZXRJbnN0YW5jZSgpOwotCQkJQ1NTTWV0YU1vZGVsIG1ldGFNb2RlbCA9IGZpbmRlci5maW5kTWV0YU1vZGVsRm9yKG1vZGVsKTsKLQkJCS8vIGlzIGZvbnQtZmFjZSBydWxlID8KLQkJCUlDU1NOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKSB7Ci0JCQkJCWltYWdlVHlwZSA9IENTU0ltYWdlVHlwZS5DQVRFR09SWV9GT05UOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpbWFnZVR5cGUgPT0gbnVsbCkgewotCQkJCUNTU01NUHJvcGVydHkgcHJvcCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKG1ldGFNb2RlbCkuZ2V0UHJvcGVydHkobmFtZSk7Ci0JCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY2F0ZWdvcnkgPSBwcm9wLmdldEF0dHJpYnV0ZSgiY2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbWFnZVR5cGUgPSBnZXRJbWFnZVR5cGUoY2F0ZWdvcnkpOwotCQkJCX0KLQkJCQlpZiAoaW1hZ2VUeXBlID09IG51bGwpIHsKLQkJCQkJaW1hZ2VUeXBlID0gQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0RFRkFVTFQ7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NWYWx1ZSkgewotCQkJc3dpdGNoICgoKENTU1ZhbHVlKSBub2RlKS5nZXRDc3NWYWx1ZVR5cGUoKSkgewotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU0gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRElNRU5TSU9OIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0ggOgotCQkJCQlpbWFnZVR5cGUgPSBWQUxVRV9OVU1CRVI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1QgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCA6Ci0JCQkJCWltYWdlVHlwZSA9IFZBTFVFX0ZVTkNUSU9OOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaW1hZ2VUeXBlID0gVkFMVUVfU1RSSU5HOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2VUeXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ1NTSW1hZ2VUeXBlIGdldEltYWdlVHlwZShJQ1NTU2VsZWN0b3JMaXN0IHNlbGVjdG9yTGlzdCkgewotCQlpZiAoc2VsZWN0b3JMaXN0ID09IG51bGwgfHwgc2VsZWN0b3JMaXN0LmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBTRUxFQ1RPUl9ERUZBVUxUOwotCQl9Ci0JCUNTU0ltYWdlVHlwZSBpbWFnZVR5cGUgPSBudWxsOwotCQlpbnQgblNlbGVjdG9ycyA9IHNlbGVjdG9yTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsZWN0b3JzOyBpKyspIHsKLQkJCUNTU0ltYWdlVHlwZSBjYW5kaWRhdGUgPSBnZXRJbWFnZVR5cGUoc2VsZWN0b3JMaXN0LmdldFNlbGVjdG9yKGkpKTsKLQkJCWlmIChpbWFnZVR5cGUgPT0gbnVsbCkgewotCQkJCWltYWdlVHlwZSA9IGNhbmRpZGF0ZTsKLQkJCX0gZWxzZSBpZiAoaW1hZ2VUeXBlICE9IGNhbmRpZGF0ZSkgewotCQkJCWltYWdlVHlwZSA9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGltYWdlVHlwZSA9PSBudWxsKSA/IFNFTEVDVE9SX0RFRkFVTFQgOiBpbWFnZVR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDU1NJbWFnZVR5cGUgZ2V0SW1hZ2VUeXBlKElDU1NTZWxlY3RvciBzZWxlY3RvcikgewotCQlDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlID0gU0VMRUNUT1JfREVGQVVMVDsKLQkJaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc2VsZWN0b3IuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGltYWdlVHlwZTsKLQkJfQotCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSBzZWxlY3Rvci5nZXRJdGVtKHNlbGVjdG9yLmdldExlbmd0aCgpIC0gMSk7Ci0JCWlmIChpdGVtLmdldEl0ZW1UeXBlKCkgPT0gSUNTU1NlbGVjdG9ySXRlbS5TSU1QTEUpIHsKLQkJCUlDU1NTaW1wbGVTZWxlY3RvciBzcyA9IChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW07Ci0JCQlpZiAoMCA8IHNzLmdldE51bU9mSURzKCkpIHsKLQkJCQlpbWFnZVR5cGUgPSBTRUxFQ1RPUl9JRDsKLQkJCX0gZWxzZSBpZiAoMCA8IHNzLmdldE51bU9mQ2xhc3NlcygpKSB7Ci0JCQkJaW1hZ2VUeXBlID0gU0VMRUNUT1JfQ0xBU1M7Ci0JCQl9IGVsc2UgaWYgKDAgPCBzcy5nZXROdW1PZlBzZXVkb05hbWVzKCkpIHsKLQkJCQlpbWFnZVR5cGUgPSBTRUxFQ1RPUl9QU0VVRE87Ci0JCQl9IGVsc2UgewotCQkJCWltYWdlVHlwZSA9IFNFTEVDVE9SX1RBRzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2VUeXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ1NTSW1hZ2VUeXBlIGdldEltYWdlVHlwZShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKGZDYXRlZ29yeU1hcCA9PSBudWxsKSB7Ci0JCQlmQ2F0ZWdvcnlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZkNhdGVnb3J5TWFwLnB1dCgiYXVyYWwiLCBDQVRFR09SWV9BVVJBTCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoImJveCIsIENBVEVHT1JZX0JPWCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoImNvbG9yYW5kYmFja2dyb3VuZCIsIENBVEVHT1JZX0NPTE9SQU5EQkFDS0dST1VORCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoImNvbnRlbnQiLCBDQVRFR09SWV9DT05URU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgiZm9udCIsIENBVEVHT1JZX0ZPTlQpOyAvLyROT04tTkxTLTEkCi0JCQlmQ2F0ZWdvcnlNYXAucHV0KCJwYWdlIiwgQ0FURUdPUllfUEFHRSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInRhYmxlcyIsIENBVEVHT1JZX1RBQkxFUyk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInRleHQiLCBDQVRFR09SWV9URVhUKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgidWkiLCBDQVRFR09SWV9VSSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInZpc3VhbCIsIENBVEVHT1JZX1ZJU1VBTCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlID0gKENTU0ltYWdlVHlwZSkgZkNhdGVnb3J5TWFwLmdldChjYXRlZ29yeSk7Ci0JCXJldHVybiAoaW1hZ2VUeXBlID09IG51bGwpID8gQ0FURUdPUllfREVGQVVMVCA6IGltYWdlVHlwZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgZkNhdGVnb3J5TWFwID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzE0ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgQ1NTIFVJIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NVSVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBDU1MgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgSlVTVElUQUxJQyA9ICIgfCBudWxsIHwgZmFsc2UgfCB0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFLCA2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SLCA2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEsIDQyLCAwLCAyMjUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FLCAxMjcsIDAsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFLCA0MiwgMCwgMjI1KSArIEpVU1RJVEFMSUM7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0NTUy5VUkksIDQyLCAwLCAyMjUpICsgSlVTVElUQUxJQzsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuVVJJLCBzdHlsZVZhbHVlKTsKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcsIDQyLCAwLCAyMjUpICsgSlVTVElUQUxJQzsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTiwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04sIHN0eWxlVmFsdWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUiwgMTkxLCA2MywgNjMpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuRVJST1IsIHN0eWxlVmFsdWUpOwotCQkKLQkJLy8gc2V0IGRlZmF1bHQgbmV3IGNzcyBmaWxlIHRlbXBsYXRlIHRvIHVzZSBpbiBuZXcgZmlsZSB3aXphcmQKLQkJLyoKLQkJICogTmVlZCB0byBmaW5kIHRlbXBsYXRlIG5hbWUgdGhhdCBnb2VzIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBpZCAobmFtZQotCQkgKiBtYXkgY2hhbmdlIGZvciBkaWZmZXJudCBsYW5ndWFnZSkKLQkJICovCi0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCkuZmluZFRlbXBsYXRlQnlJZCgib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMubmV3Y3NzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NVSVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWI3ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBrZXlzIGZvciBDU1MgVUkKLSAqLwotcHVibGljIGNsYXNzIENTU1VJUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIENTU1VJUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIGluc3RhbmNlCi0JfQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgQ1NTIGZpbGUgd2l6YXJkLgotCSAqIFRlbXBsYXRlIG5hbWUgaXMgc3RvcmVkIGluc3RlYWQgb2YgdGVtcGxhdGUgaWQgYmVjYXVzZSB1c2VyLWNyZWF0ZWQKLQkgKiB0ZW1wbGF0ZXMgZG8gbm90IGhhdmUgdGVtcGxhdGUgaWRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJuZXdGaWxlVGVtcGxhdGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0NvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0NvbG9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjYzYmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RDb2xvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHlsZWRUZXh0Q29sb3JQaWNrZXI7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIENTU0NvbG9yUGFnZSBleHRlbmRzIEFic3RyYWN0Q29sb3JQYWdlIHsKLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQkJSXRlcmF0b3IgaSA9IHN0eWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQkoKEdyaWREYXRhKSBwYWdlQ29tcG9uZW50LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsKLQotCQlzdXBlci5jcmVhdGVDb250ZW50cyhwYWdlQ29tcG9uZW50KTsKLQotCQkvLyBhc3NpZ25pbmcgb25lIGhlbHAgZm9yIHdob2xlIGdyb3VwCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbG9yaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbG9yaW5nQ29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29sb3JpbmdDb21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBhc3NpZ25pbmcgb25lIGhlbHAgZm9yIHdob2xlIGdyb3VwCi0JCXJldHVybiBjb2xvcmluZ0NvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTYW1wbGVUZXh0IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclNhbXBsZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0U3R5bGVNYXAKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5ULCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUywgSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSLCBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JELCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElVTSwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRV9TRUxFQ1RPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ09NQklOQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSLCBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTiwgSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuRGljdGlvbmFyeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9ucyBmb3IgaGlsaWdodGluZyB0eXBlcwotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvck5vcm1hbCk7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQXRtYXJrUnVsZSk7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU2VsZWN0b3IpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvck1lZGlhKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckNvbW1lbnQpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlOYW1lKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eVZhbHVlKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yVXJpKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORywgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU3RyaW5nKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JDb2xvbik7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTZW1pQ29sb24pOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckN1cmx5QnJhY2UpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuRVJST1IsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckVycm9yKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUik7Ci0JfQotCi0JLyoqCi0JICogc2V0dXBQaWNrZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBQaWNrZXIoU3R5bGVkVGV4dENvbG9yUGlja2VyIHBpY2tlcikgewotCQlJTW9kZWxNYW5hZ2VyIG1tYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJcGlja2VyLnNldFBhcnNlcihtbWFuYWdlci5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUykuZ2V0UGFyc2VyKCkpOwotCi0JCURpY3Rpb25hcnkgZGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0KLQkJRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJcGlja2VyLnNldENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlwaWNrZXIuc2V0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCXBpY2tlci5zZXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZSNzYXZlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0ZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjYmU3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTEZpbGVzUHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDU1NGaWxlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgc2Nyb2xsZWRDb21wb3NpdGUgPSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQpOwotCQljcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAoc2Nyb2xsZWRDb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2Nyb2xsZWRDb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5DU1NfUFJFRldFQlhfRklMRVNfSEVMUElEKTsKLQkJCi0JCXNldFNpemUoc2Nyb2xsZWRDb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHNjcm9sbGVkQ29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwZXJmb3JtRGVmYXVsdHNGb3JDcmVhdGluZ0dyb3VwKCk7Ci0KLSAgICAgICAgdXBkYXRlQXBwbHlCdXR0b24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yQ3JlYXRpbmdHcm91cCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1NvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNTM3M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1NvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VMaW5rQXJlYTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENTU1NvdXJjZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JLy8gQ29udGVudCBBc3Npc3QKLQlwcm90ZWN0ZWQgQnV0dG9uIGZBdXRvUHJvcG9zZTsKLQlwcm90ZWN0ZWQgTGFiZWwgZkF1dG9Qcm9wb3NlTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBmQXV0b1Byb3Bvc2VUZXh0OwotCXByb3RlY3RlZCBCdXR0b24gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZJZGVudExvd2VyOwotCS8vIGNhc2Ugb2Ygb3V0cHV0IGNoYXJhY3RlcgotCS8vIGNhc2Ugb2YgaWRlbnRpZmllcgotCXByb3RlY3RlZCBCdXR0b24gZklkZW50VXBwZXI7Ci0JcHJpdmF0ZSBTcGlubmVyIGZJbmRlbnRhdGlvblNpemU7Ci0JcHJpdmF0ZSBCdXR0b24gZkluZGVudFVzaW5nU3BhY2VzOwotCQotCXByaXZhdGUgQnV0dG9uIGZJbmRlbnRVc2luZ1RhYnM7Ci0JLy8gRm9ybWF0dGluZwotCXByb3RlY3RlZCBMYWJlbCBmTGluZVdpZHRoTGFiZWw7Ci0JCi0JcHJvdGVjdGVkIFRleHQgZkxpbmVXaWR0aFRleHQ7Ci0JLy8gcHJvaGliaXQgd3JhcHBpbmcgaWYgc3R5bGUgYXR0cmlidXRlCi0JcHJvdGVjdGVkIEJ1dHRvbiBmTm93cmFwQXR0cjsKLQkvLyBvbmUgcHJvcGVydHkgcGVyIG9uZSBsaW5lCi0JcHJvdGVjdGVkIEJ1dHRvbiBmUHJvcGVydHlQZXJMaW5lOwotCXByb3RlY3RlZCBCdXR0b24gZlByb3BOYW1lTG93ZXI7Ci0KLQkvLyBjYXNlIG9mIHByb3BlcnR5IG5hbWUKLQlwcm90ZWN0ZWQgQnV0dG9uIGZQcm9wTmFtZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlByb3BWYWx1ZUxvd2VyOwotCS8vIGNhc2Ugb2YgcHJvcGVydHkgdmFsdWUKLQlwcm90ZWN0ZWQgQnV0dG9uIGZQcm9wVmFsdWVVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZTcGxpdE11bHRpQXR0cnM7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0lOREVOVEFUSU9OX1NJWkUgPSAxNjsKLQlwcml2YXRlIGZpbmFsIGludCBNSU5fSU5ERU5UQVRJT05fU0laRSA9IDA7Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuQ1NTX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQpOwotCi0JCW5ldyBQcmVmZXJlbmNlTGlua0FyZWEoY29tcG9zaXRlLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZWRpdG9yIiwgQ1NTVUlNZXNzYWdlcy5fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCkuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmhpbnQoMTUwLCBTV1QuREVGQVVMVCkuY3JlYXRlKCkpOwotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3Rvcnkuc3d0RGVmYXVsdHMoKS5jcmVhdGUoKSk7Ci0KLQkJY3JlYXRlQ29udGVudHNGb3JGb3JtYXR0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JDb250ZW50QXNzaXN0R3JvdXAoY29tcG9zaXRlKTsKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIG5vdCBjb250ZW50IGFzc2lzdCwgYnV0IHByZWZlcnJlZCBjYXNlCi0JCUdyb3VwIGNhc2VHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMyk7Ci0JCWNhc2VHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlR3JvdXApOwotCi0JCS8vIHVzZSBncm91cCBmb3IgcmFkaW8gYnV0dG9ucyBzbyB0aGF0IGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQlHcm91cCBpZGVudEdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJaWRlbnRHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlSWRlbnQpOwotCQlmSWRlbnRVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKGlkZW50R3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlSWRlbnRVcHBlcik7Ci0JCWZJZGVudExvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24oaWRlbnRHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0Nhc2VJZGVudExvd2VyKTsKLQotCQkvLyB1c2UgZ3JvdXAgZm9yIHJhZGlvIGJ1dHRvbnMgc28gdGhhdCBhc3NvY2lhdGVkIGxhYmVsIGlzIHJlYWQKLQkJR3JvdXAgcHJvcE5hbWVHcm91cCA9IGNyZWF0ZUdyb3VwKGNhc2VHcm91cCwgMSk7Ci0JCXByb3BOYW1lR3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BOYW1lKTsKLQkJZlByb3BOYW1lVXBwZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihwcm9wTmFtZUdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BOYW1lVXBwZXIpOwotCQlmUHJvcE5hbWVMb3dlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHByb3BOYW1lR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWVMb3dlcik7Ci0KLQkJLy8gdXNlIGdyb3VwIGZvciByYWRpbyBidXR0b25zIHNvIHRoYXQgYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCUdyb3VwIHByb3BWYWx1ZUdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJcHJvcFZhbHVlR3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZSk7Ci0JCWZQcm9wVmFsdWVVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHByb3BWYWx1ZUdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZVVwcGVyKTsKLQkJZlByb3BWYWx1ZUxvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24ocHJvcFZhbHVlR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlTG93ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGZvcm1hdHRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWZvcm1hdHRpbmdHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuRm9ybWF0dGluZ19VSV8pOwotCi0JCWZMaW5lV2lkdGhMYWJlbCA9IGNyZWF0ZUxhYmVsKGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5MaW5lX3dpZHRoX19VSV8pOwotCQlmTGluZVdpZHRoVGV4dCA9IG5ldyBUZXh0KGZvcm1hdHRpbmdHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDI1OwotCQlmTGluZVdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJZkxpbmVXaWR0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLQkJZlByb3BlcnR5UGVyTGluZSA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX1dyYXBwaW5nSW5zZXJ0TGluZUJyZWFrKTsKLQkJKChHcmlkRGF0YSkgZlByb3BlcnR5UGVyTGluZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlmTm93cmFwQXR0ciA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX1dyYXBwaW5nV2l0aG91dEF0dHIpOwotCQkoKEdyaWREYXRhKSBmTm93cmFwQXR0ci5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCWZJbmRlbnRVc2luZ1RhYnMgPSBjcmVhdGVSYWRpb0J1dHRvbihmb3JtYXR0aW5nR3JvdXAsIENTU1VJTWVzc2FnZXMuSW5kZW50X3VzaW5nX3RhYnNfKTsKLQkJKChHcmlkRGF0YSkgZkluZGVudFVzaW5nVGFicy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkluZGVudFVzaW5nU3BhY2VzID0gY3JlYXRlUmFkaW9CdXR0b24oZm9ybWF0dGluZ0dyb3VwLCBDU1NVSU1lc3NhZ2VzLkluZGVudF91c2luZ19zcGFjZXMpOwotCQkoKEdyaWREYXRhKSBmSW5kZW50VXNpbmdTcGFjZXMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQljcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIENTU1VJTWVzc2FnZXMuSW5kZW50YXRpb25fc2l6ZSk7Ci0JCWZJbmRlbnRhdGlvblNpemUgPSBuZXcgU3Bpbm5lcihmb3JtYXR0aW5nR3JvdXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0VG9vbFRpcFRleHQoQ1NTVUlNZXNzYWdlcy5JbmRlbnRhdGlvbl9zaXplX3RpcCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWluaW11bShNSU5fSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWF4aW11bShNQVhfSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0SW5jcmVtZW50KDEpOwotCQlmSW5kZW50YXRpb25TaXplLnNldFBhZ2VJbmNyZW1lbnQoNCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0JCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gbm90IGNvbnRlbnQgYXNzaXN0LCBidXQgcHJlZmVycmVkIGNhc2UKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCWZJZGVudFVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmSWRlbnRMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZlByb3BOYW1lVXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZQcm9wTmFtZUxvd2VyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmUHJvcFZhbHVlVXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmUHJvcFZhbHVlTG93ZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KHByZWZzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJZlByb3BlcnR5UGVyTGluZS5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkpOwotCQlmTm93cmFwQXR0ci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikpOwotCQkKLQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9IGVsc2UgewotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQkJCi0JCWZJbmRlbnRhdGlvblNpemUuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCi0JCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCWVuYWJsZVZhbHVlcygpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBub3QgY29udGVudCBhc3Npc3QsIGJ1dCBwcmVmZXJyZWQgY2FzZQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJZklkZW50VXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmSWRlbnRMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWZQcm9wTmFtZVVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZlByb3BOYW1lTG93ZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmUHJvcFZhbHVlVXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZlByb3BWYWx1ZUxvd2VyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJZkxpbmVXaWR0aFRleHQuc2V0VGV4dChwcmVmcy5nZXREZWZhdWx0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQlmUHJvcGVydHlQZXJMaW5lLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkpOwotCQlmTm93cmFwQXR0ci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpKTsKLQkJCi0JCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9CQkKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCi0JCWRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXN0b3JlVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBub3QgY29udGVudCBhc3Npc3QsIGJ1dCBwcmVmZXJyZWQgY2FzZQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIsIChmSWRlbnRVcHBlci5nZXRTZWxlY3Rpb24oKSkgPyBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDogQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FLCAoZlByb3BOYW1lVXBwZXIuZ2V0U2VsZWN0aW9uKCkpID8gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUsIChmUHJvcFZhbHVlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpID8gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCX0KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgZkxpbmVXaWR0aFRleHQuZ2V0VGV4dCgpKTsKLQkJcHJlZnMuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUsIGZQcm9wZXJ0eVBlckxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiwgZk5vd3JhcEF0dHIuZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJaWYgKGZJbmRlbnRVc2luZ1RhYnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCKTsKLQkJfSBlbHNlIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UpOwotCQl9Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIGZJbmRlbnRhdGlvblNpemUuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTeW50YXhDb2xvcmluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkNDAxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29sb3JTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0NTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBBIHByZWZlcmVuY2UgcGFnZSB0byBjb25maWd1cmUgb3VyIFhNTCBzeW50YXggY29sb3IuIEl0IHJlc2VtYmxlcyB0aGUgSkRUCi0gKiBhbmQgQ0RUIHBhZ2VzIGZhciBtb3JlIHRoYW4gb3VyIG9yaWdpbmFsIGNvbG9yIHBhZ2Ugd2hpbGUgcmV0YWluaW5nIHRoZQotICogZXh0cmEgImNsaWNrLXRvLWZpbmQiIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDU1NTeW50YXhDb2xvcmluZ1BhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQm9sZDsKLQlwcml2YXRlIExhYmVsIGZGb3JlZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBmQmFja2dyb3VuZExhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZDbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGZDb250ZXh0VG9TdHlsZU1hcDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gZkl0YWxpYzsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmU3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlN0eWxlVG9EZXNjcmlwdGlvbk1hcDsKLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVuZGVybGluZTsKLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBmRGVmYXVsdEZvcmVncm91bmQ7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSBmRGVmYXVsdEJhY2tncm91bmQ7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0xpbmspOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24ocGFyZW50LmdldFNoZWxsKCksIGUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50PSAxNTA7IC8vIG9ubHkgZXhwYW5kIGZ1cnRoZXIgaWYgYW55b25lIGVsc2UgcmVxdWlyZXMgaXQKLQkJbGluay5zZXRMYXlvdXREYXRhKGxpbmtEYXRhKTsKLQotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCVNhc2hGb3JtIGVkaXRvciA9IG5ldyBTYXNoRm9ybShwYWdlQ29tcG9uZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJU2FzaEZvcm0gdG9wID0gbmV3IFNhc2hGb3JtKGVkaXRvciwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3R5bGVFZGl0b3IgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luUmlnaHQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMDsKLQkJY3JlYXRlTGFiZWwoc3R5bGVFZGl0b3IsIENTU1VJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzApOwotCQlmU3R5bGVzVmlld2VyID0gY3JlYXRlU3R5bGVzVmlld2VyKHN0eWxlRWRpdG9yKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heChncmlkRGF0YS53aWR0aEhpbnQsIGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKS5sZW5ndGgoKSkpOwotCQl9Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlmU3R5bGVzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgZWRpdGluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJY3JlYXRlTGFiZWwoZWRpdGluZ0NvbXBvc2l0ZSwgIiIpOwotCQlCdXR0b24gZW5hYmxlciA9IGNyZWF0ZUNoZWNrYm94KGVkaXRpbmdDb21wb3NpdGUsIENTU1VJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzIpOwotCQllbmFibGVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbmFibGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJQ29tcG9zaXRlIGVkaXRDb250cm9scyA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0aW5nQ29tcG9zaXRlLCAyKTsKLQkJKChHcmlkTGF5b3V0KSBlZGl0Q29udHJvbHMuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAyMDsKLQotCQlmRm9yZWdyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoZWRpdENvbnRyb2xzLCBTU0VVSU1lc3NhZ2VzLkZvcmVncm91bmRfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkZvcmVncm91bmRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yID0gbmV3IENvbG9yU2VsZWN0b3IoZWRpdENvbnRyb2xzKTsKLQkJQnV0dG9uIGZGb3JlZ3JvdW5kQ29sb3IgPSBmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJZkZvcmVncm91bmRDb2xvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQmFja2dyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoZWRpdENvbnRyb2xzLCBTU0VVSU1lc3NhZ2VzLkJhY2tncm91bmRfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkJhY2tncm91bmRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yID0gbmV3IENvbG9yU2VsZWN0b3IoZWRpdENvbnRyb2xzKTsKLQkJQnV0dG9uIGZCYWNrZ3JvdW5kQ29sb3IgPSBmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJZkJhY2tncm91bmRDb2xvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQm9sZCA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgQ1NTVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMyk7Ci0JCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmQm9sZC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkl0YWxpYyA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgQ1NTVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNCk7Ci0JCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZJdGFsaWMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZTdHJpa2UgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIENTU1VJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzUpOwotCQlmU3RyaWtlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmU3RyaWtlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmVW5kZXJsaW5lID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBDU1NVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV82KTsKLQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZlVuZGVybGluZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkNsZWFyU3R5bGUgPSBuZXcgQnV0dG9uKGVkaXRpbmdDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZkNsZWFyU3R5bGUuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlJlc3RvcmVfRGVmYXVsdF9VSV8pOyAvLyROT04tTkxTLTEkID0gIlJlc3RvcmUgRGVmYXVsdCIKLQkJZkNsZWFyU3R5bGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORykpOwotCQkoKEdyaWREYXRhKWZDbGVhclN0eWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgc2FtcGxlQXJlYSA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0b3IsIDEpOwotCi0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gNTsKLQkJY3JlYXRlTGFiZWwoc2FtcGxlQXJlYSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihzYW1wbGVBcmVhLCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YTMgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEzLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWdyaWREYXRhMy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZ3JpZERhdGEzLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTMpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsKLQkJZlRleHQuYWRkS2V5TGlzdGVuZXIoZ2V0VGV4dEtleUxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZE1vdXNlTGlzdGVuZXIoZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIoZ2V0VHJhdmVyc2VMaXN0ZW5lcigpKTsKLQkJc2V0QWNjZXNzaWJsZShmVGV4dCwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsKLQkJZkRvY3VtZW50ID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUyk7Ci0JCWZEb2N1bWVudC5zZXQoZ2V0RXhhbXBsZVRleHQoKSk7Ci0JCXZpZXdlci5zZXREb2N1bWVudChmRG9jdW1lbnQpOwotCi0JCXRvcC5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCWVkaXRvci5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlmU3R5bGVzVmlld2VyLnNldElucHV0KGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKSk7Ci0KLQkJYXBwbHlTdHlsZXMoKTsKLQotCQlmU3R5bGVzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMF07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMF0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMV07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMV0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCb2xkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMl07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZCb2xkLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzJdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZJdGFsaWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1szXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkl0YWxpYy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1szXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmU3RyaWtlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNF07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZTdHJpa2UuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNF0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZlVuZGVybGluZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzVdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmVW5kZXJsaW5lLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzVdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFRvRGVmYXVsdChuYW1lZFN0eWxlKTsKLQkJCQlhcHBseVN0eWxlcygpOwotCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExpc3Qgdmlld2VyIHdoZXJlIHdlIHNlZSB0aGUgdmFyaW91cyBzeW50YXggZWxlbWVudCBkaXNwbGF5Ci0JICogbmFtZXMtLXdvdWxkIGl0IGV2ZXIgYmUgYSBUcmVlIGxpa2UgSkRUJ3M/Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlU3R5bGVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RydWN0dXJlZFZpZXdlciBzdHlsZXNWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdCBkZXNjcmlwdGlvbiA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0eWxlc1ZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTYW1wbGU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwotCQllbHNlIGlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldCgwKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiAhZG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgdGhlIElUZXh0UmVnaW9uJ3MgQ29udGV4dCBhdCB0aGlzIG9mZnNldAotCQkJSVRleHRSZWdpb24gaW50ZXJlc3QgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGludGVyZXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAob2Zmc2V0ID4gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChpbnRlcmVzdCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgcmVnaW9uQ29udGV4dCA9IGludGVyZXN0LmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25Db250ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyBmaW5kIHRoZSBuYW1lZCBzdHlsZSAoaW50ZXJuYWwvc2VsZWN0YWJsZSBuYW1lKSBmb3IgdGhhdAotCQkJLy8gY29udGV4dAotCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBnZXRPdmVybGF5U3RvcmUoKSB7Ci0JCXJldHVybiBmT3ZlcmxheVN0b3JlOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkgewotCQlpZiAoZlN0eWxlUHJlZmVyZW5jZUtleXMgPT0gbnVsbCkgewotCQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUik7Ci0JCQlmU3R5bGVQcmVmZXJlbmNlS2V5cyA9IHN0eWxlczsKLQkJfQotCQlyZXR1cm4gZlN0eWxlUHJlZmVyZW5jZUtleXM7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmF2ZXJzZUxpc3RlbmVyIGdldFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIja2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWlmICgoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB8fCAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykpCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb24pOwotCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKTsKLQkJaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCk7Ci0KLQkJZk92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKSB7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPLCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TLCBJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIsIElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UsIElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJLCBJU3R5bGVDb25zdGFudHNDU1MuVVJJKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESVVNLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVF9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFX1NFTEVDVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8sIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUywgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIsIElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOLCBJU3R5bGVDb25zdGFudHNDU1MuRVJST1IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCkgewotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JOb3JtYWwpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JBdG1hcmtSdWxlKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU2VsZWN0b3IpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JNZWRpYSk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQ29tbWVudCk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlOYW1lKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlWYWx1ZSk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuVVJJLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JVcmkpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORywgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU3RyaW5nKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQ29sb24pOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04sIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclNlbWlDb2xvbik7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckN1cmx5QnJhY2UpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JFcnJvcik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLmxvYWREZWZhdWx0cygpOwotCQlhcHBseVN0eWxlcygpOwotCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJYWN0aXZhdGUobnVsbCk7Ci0JCWZUZXh0LnJlZHJhdygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkucHJvcGFnYXRlKCk7Ci0KLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RDb2xvckF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBnZXROYW1lZFN0eWxlQXRPZmZzZXQob2Zmc2V0KTsKLQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZWRTdHlsZSkpOwotCQkJZlN0eWxlc1ZpZXdlci5yZXZlYWwobmFtZWRTdHlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJfQotCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWZpY2FsbHkgc2V0IHRoZSByZXBvcnRpbmcgbmFtZSBvZiBhIGNvbnRyb2wgZm9yIGFjY2Vzc2liaWxpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWNjZXNzaWJsZShDb250cm9sIGNvbnRyb2wsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIFN0cmluZyBuID0gbmFtZTsKLQkJY29udHJvbC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpCi0JCQkJCWUucmVzdWx0ID0gbjsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTM1MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBDU1MgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0KLQljbGFzcyBDU1NFZGl0VGVtcGxhdGVEaWFsb2cgZXh0ZW5kcyBFZGl0VGVtcGxhdGVEaWFsb2cgewotCQlwdWJsaWMgQ1NTRWRpdFRlbXBsYXRlRGlhbG9nKFNoZWxsIHBhcmVudCwgVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlLCBDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCByZWdpc3RyeSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7CQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCi0JCQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29udGVudEFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50ID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKLQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0FjdGl2YXRpb24odHJ1ZSk7Ci0JCQkJYXNzaXN0YW50LmVuYWJsZUF1dG9JbnNlcnQodHJ1ZSk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoZ2V0VGVtcGxhdGVQcm9jZXNzb3IoKSwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQkJCQlyZXR1cm4gYXNzaXN0YW50OwotCQkJfQotCQl9OwotCQlyZXR1cm4gZG9DcmVhdGVWaWV3ZXIocGFyZW50LCBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLX0KLQl9Ci0KLQlwdWJsaWMgQ1NTVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJQ1NTVUlQbHVnaW4gY3NzVUlQbHVnaW4gPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKGNzc1VJUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0VGVtcGxhdGVTdG9yZShjc3NVSVBsdWdpbi5nZXRUZW1wbGF0ZVN0b3JlKCkpOwotCQlzZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KGNzc1VJUGx1Z2luLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2lzU2hvd0Zvcm1hdHRlclNldHRpbmcoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvd0Zvcm1hdHRlclNldHRpbmcoKSB7Ci0JCS8vIHRlbXBsYXRlIGZvcm1hdHRpbmcgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhhbmNlc3Rvcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2NyZWF0ZVZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUygpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBkb0NyZWF0ZVZpZXdlcihwYXJlbnQsIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCX0KLQotCVNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHZpZXdlckNvbmZpZ3VyYXRpb24pIHsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQkJdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlEKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXQgZGlhbG9nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCi0JICogYSBjdXN0b20gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZQotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGJlaW5nIGVkaXRlZAotCSAqIEBwYXJhbSBlZGl0Ci0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBkaWFsb2cgc2hvdWxkIGJlIGVkaXRhYmxlCi0JICogQHBhcmFtIGlzTmFtZU1vZGlmaWFibGUKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRlbXBsYXRlIG5hbWUgbWF5IGJlIG1vZGlmaWVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBvciBtb2RpZmllZCB0ZW1wbGF0ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBlZGl0aW9uIGZhaWxlZAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcGxhdGUgZWRpdFRlbXBsYXRlKFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSkgewotCQlFZGl0VGVtcGxhdGVEaWFsb2cgZGlhbG9nID0gbmV3IENTU0VkaXRUZW1wbGF0ZURpYWxvZyhnZXRTaGVsbCgpLCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgZ2V0Q29udGV4dFR5cGVSZWdpc3RyeSgpKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gZGlhbG9nLmdldFRlbXBsYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTEwOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0vKioKLSAqIENvbnRhaW5zIGEgc2V0IG9mIHByb2plY3Rpb24gbW9kZWwgYWRkaXRpb25zL2RlbGV0aW9ucy9tb2RpZmljYXRpb25zCi0gKi8KLWNsYXNzIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBjaGFuZ2UgTm9kZSB0byBJQ1NTTm9kZQotCXByaXZhdGUgSUNTU05vZGUgZk5vZGU7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uW10gZkRlbGV0aW9uczsKLQlwcml2YXRlIE1hcCBmQWRkaXRpb25zOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZNb2RpZmljYXRpb25zOwotCi0JcHVibGljIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKElDU1NOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZkRlbGV0aW9ucyA9IGRlbGV0aW9uczsKLQkJZkFkZGl0aW9ucyA9IGFkZGl0aW9uczsKLQkJZk1vZGlmaWNhdGlvbnMgPSBtb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0QWRkaXRpb25zKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlbGV0aW9ucygpIHsKLQkJcmV0dXJuIGZEZWxldGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRNb2RpZmljYXRpb25zKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBmTm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2ZTU2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLS8qKgotICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgd2l0aCBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciB0aGlzCi0gKiBhZGFwdGVyIG5vZGUncyBjaGlsZHJlbgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQcm9qZWN0aW9uUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuY3NzLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiRcCi0KLQlwcml2YXRlIGNsYXNzIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4dGVuZHMgUHJvamVjdGlvbkFubm90YXRpb24gewotCQlwcml2YXRlIGJvb2xlYW4gZklzVmlzaWJsZSA9IGZhbHNlOyAvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQlwcml2YXRlIElDU1NOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihJQ1NTTm9kZSBub2RlLCBib29sZWFuIGlzQ29sbGFwc2VkKSB7Ci0JCQlzdXBlcihpc0NvbGxhcHNlZCk7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgSUNTU05vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBmTm9kZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKQotCQkJCXN1cGVyLm1hcmtDb2xsYXBzZWQoKTsKLQkJfQotCX0KLQotCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXAgZlRhZ0Fubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZmFjdG9yeSkgewotCQlmQWRhcHRlckZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3Rpb24gcG9zaXRpb24gZnJvbSB0aGUgZ2l2ZW4gbm9kZS4gQWJsZSB0byBnZXQKLQkgKiBwcm9qZWN0aW9uIHBvc2l0aW9uIGlmIG5vZGUgaXNOb2RlUHJvamVjdGFibGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gcHJvamVjdGlvbiBwb3NpdGlvbiBwb3NzaWJsZSwgYSBQb3NpdGlvbiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFBvc2l0aW9uIGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihJQ1NTTm9kZSBub2RlKSB7Ci0JCVBvc2l0aW9uIHBvcyA9IG51bGw7Ci0JCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSAmJiBub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJLy8gSURvY3VtZW50IGRvY3VtZW50ID0KLQkJCS8vIGZBZGFwdGVyRmFjdG9yeS5nZXRQcm9qZWN0aW9uVmlld2VyKCkuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGlub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKHN0YXJ0ID49IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCQkvLyByZWdpb24tYmFzZWQKLQkJCQkvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uIGluY3JlYXNlIHdoZW4KLQkJCQkvLyBhZGQgbmV3bGluZQotCQkJCXBvcyA9IG5ldyBQb3NpdGlvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCS8vIHRyeSB7Ci0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24KLQkJCQkvLyAvLyBpbmNyZWFzZSB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gSVJlZ2lvbiBzdGFydExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBJUmVnaW9uIGVuZExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGVuZCk7Ci0JCQkJLy8gaW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnRMaW5lUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBlbmRMaW5lUmVnaW9uLmdldE9mZnNldCgpICsKLQkJCQkvLyBlbmRMaW5lUmVnaW9uLmdldExlbmd0aCgpOwotCQkJCS8vIGlmIChlbmRPZmZzZXQgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0KLQkJCQkvLyBzdGFydE9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vCi0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIG5vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCByZWdpb24gaW5jcmVhc2UKLQkJCQkvLyAvLyB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gaW50IHN0YXJ0TGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gaW50IGVuZExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpZiAoZW5kTGluZSArIDEgPCBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCkpIHsKLQkJCQkvLyBpbnQgb2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzdGFydExpbmUpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGVuZExpbmUgKyAxKTsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24ob2Zmc2V0LCBlbmRPZmZzZXQgLSBvZmZzZXQpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBudWxsLCB4KTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGZvciBub2RlIGluIHRoZSBjdXJyZW50IGxpc3Qgb2YgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb25zIGZvciB0aGlzIGFkYXB0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gVGFnUHJvamVjdGlvbkFubm90YXRpb24KLQkgKi8KLQlwcml2YXRlIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGdldEV4aXN0aW5nQW5ub3RhdGlvbihJQ1NTTm9kZSBub2RlKSB7Ci0JCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBudWxsOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSAmJiBhbm5vID09IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJSUNTU05vZGUgbiA9IGEuZ2V0Tm9kZSgpOwotCQkJCWlmIChub2RlLmVxdWFscyhuKSkgewotCQkJCQlhbm5vID0gYTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFubm87Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBhIG5vZGUgdHlwZSBhYmxlIHRvIGZvbGQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG5vZGUgaXMgcHJvamVjdGFibGUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05vZGVQcm9qZWN0YWJsZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXNob3J0IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSB8fCB0eXBlID09IElDU1NOb2RlLlBBR0VSVUxFX05PREUgfHwgdHlwZSA9PSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSB8fCB0eXBlID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSB8fCB0eXBlID09IElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIHx8IHR5cGUgPT0gSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGNoZWNrIGlmIGZvbGRpbmcgaXMgZXZlbiBlbmFibGVkLCBpZiBub3QsIGp1c3QgaWdub3JlIG5vdGlmeUNoYW5nZWQKLQkJLy8gZXZlbnRzCi0JCWlmICghZkFkYXB0ZXJGYWN0b3J5LmlzQWN0aXZlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHdvcmthcm91bmQgZm9yIEJ1Zzg1MzQyIC0gU1RSVUNUUkVfQ0hBTkdFRCBpcyBuZXZlciBmaXJlZCBzbyBuZWVkCi0JCS8vIHRvIGxpc3RlbiBmb3IgZXZlcnkgQURELCBSRU1PVkUKLQkJLy8gaWYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgJiYgKG5vdGlmaWVyCi0JCS8vIGluc3RhbmNlb2YgSUNTU05vZGUpKSB7Ci0JCWlmICgoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgJiYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU05vZGUpKSB7Ci0JCQl1cGRhdGVBZGFwdGVyKChJQ1NTTm9kZSkgbm90aWZpZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihJQ1NTTm9kZSBub2RlKSB7Ci0JCXVwZGF0ZUFkYXB0ZXIobm9kZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUgYW5kIGFkZHMgYWxsIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgdG8gdmlld2VyIChmb3IgbmV3bHkgYWRkZWQKLQkgKiB2aWV3ZXJzKQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihJQ1NTTm9kZSBub2RlLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJTWFwIGFkZGl0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGdvIHRocm91Z2ggaW1tZWRpYXRlIGNoaWxkIG5vZGVzIGFuZCBmaWd1cmUgb3V0IHByb2plY3Rpb24KLQkJLy8gbW9kZWwgYW5ub3RhdGlvbnMKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSUNTU05vZGUgY2hpbGROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQlQb3NpdGlvbiBuZXdQb3MgPSBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24oY2hpbGROb2RlKTsKLQkJCQlpZiAobmV3UG9zICE9IG51bGwpIHsKLQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IG5ldyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihjaGlsZE5vZGUsIGZhbHNlKTsKLQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gZXhpc3RpbmcgPSBnZXRFeGlzdGluZ0Fubm90YXRpb24oY2hpbGROb2RlKTsKLQkJCQkJaWYgKGV4aXN0aW5nID09IG51bGwpIHsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbGwgYW5ub3RhdGlvbnMgZm9yIHRoaXMKLQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCXByb2plY3Rpb25Bbm5vdGF0aW9ucy5wdXQobmV3QW5ub3RhdGlvbiwgbmV3UG9zKTsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBhZGQKLQkJCQkJCWFkZGl0aW9ucy5wdXQobmV3QW5ub3RhdGlvbiwgbmV3UG9zKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbGwgYW5ub3RhdGlvbnMgZm9yIHRoaXMKLQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCXByb2plY3Rpb25Bbm5vdGF0aW9ucy5wdXQoZXhpc3RpbmcsIG5ld1Bvcyk7Ci0JCQkJCQkvLyByZW1vdmUgZnJvbSBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBkZWxldGUKLQkJCQkJCWZUYWdBbm5vdGF0aW9ucy5yZW1vdmUoZXhpc3RpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCi0JCQkvLyBpbiB0aGUgZW5kLCB3YW50IHRvIGRlbGV0ZSBhbnl0aGluZyBsZWZ0b3ZlciBpbiBvbGQgbGlzdCwgYWRkCi0JCQkvLyBldmVyeXRoaW5nIGluIGFkZGl0aW9ucywgYW5kIHVwZGF0ZSBldmVyeXRoaW5nIGluCi0JCQkvLyBwcm9qZWN0aW9uQW5ub3RhdGlvbnMKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uW10gb2xkTGlzdCA9IG51bGw7Ci0JCQlpZiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlvbGRMaXN0ID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uW10pIGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvblswXSk7Ci0JCQl9Ci0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbltdIG1vZGlmeUxpc3QgPSBudWxsOwotCQkJaWYgKCFwcm9qZWN0aW9uQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJbW9kaWZ5TGlzdCA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbltdKSBwcm9qZWN0aW9uQW5ub3RhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgUHJvamVjdGlvbkFubm90YXRpb25bMF0pOwotCQkJfQotCi0JCQkvLyBzcGVjaWZpY2FsbHkgYWRkIGFsbCBhbm5vdGF0aW9ucyB0byB2aWV3ZXIKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiAhcHJvamVjdGlvbkFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCWZBZGFwdGVyRmFjdG9yeS5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgbnVsbCwgcHJvamVjdGlvbkFubm90YXRpb25zLCBudWxsLCB2aWV3ZXIpOwotCQkJfQotCi0JCQkvLyBvbmx5IHVwZGF0ZSB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyB0byB1cGRhdGUKLQkJCWlmICgob2xkTGlzdCAhPSBudWxsICYmIG9sZExpc3QubGVuZ3RoID4gMCkgfHwgKCFhZGRpdGlvbnMuaXNFbXB0eSgpKSB8fCAobW9kaWZ5TGlzdCAhPSBudWxsICYmIG1vZGlmeUxpc3QubGVuZ3RoID4gMCkpCi0JCQkJZkFkYXB0ZXJGYWN0b3J5LnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBvbGRMaXN0LCBhZGRpdGlvbnMsIG1vZGlmeUxpc3QpOwotCQl9Ci0KLQkJLy8gc2F2ZSBuZXcgbGlzdCBvZiBhbm5vdGF0aW9ucwotCQlmVGFnQW5ub3RhdGlvbnMgPSBwcm9qZWN0aW9uQW5ub3RhdGlvbnM7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlICE9IG51bGwgPyBub2RlLnRvU3RyaW5nKCkgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MudXBkYXRlQWRhcHRlciAoIiArIG5vZGVOYW1lICsgIik6IiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDcyMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQkvKioKLQkgKiBMaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIG1vZGVsIG5vZGUgYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmUHJvamVjdGlvblZpZXdlcnM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKCkgewotCQl0aGlzKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyhPYmplY3QgYWRhcHRlcktleSkgewotCQlzdXBlcihhZGFwdGVyS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MgYWRhcHRlciA9IG51bGw7Ci0KLQkJaWYgKChpc0FjdGl2ZSgpKSAmJiAodGFyZ2V0IGluc3RhbmNlb2YgSUNTU05vZGUpKSB7Ci0JCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSB0YXJnZXQ7Ci0JCQlzaG9ydCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJLy8gb25seSBhZGQgZm9yIHRvcCBzdHlsZXNoZWV0IG5vZGUKLQkJCWlmICh0eXBlID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJCWFkYXB0ZXIgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1ModGhpcyk7Ci0JCQkJYWRhcHRlci51cGRhdGVBZGFwdGVyKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBmYWN0b3J5IGlzIGN1cnJlbnRseSBhY3RpdmVseSBtYW5hZ2luZyBwcm9qZWN0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwgJiYgIWZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhJQ1NTTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucykgewotCQlxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGZvciBhIHNwZWNpZmljIHByb2plY3Rpb24gdmlld2VyIGlmCi0JICogZG9jdW1lbnQgaXMgbm90IGluIGZsdXguIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQKLQkgKiB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRlbGV0aW9ucwotCSAqIEBwYXJhbSBhZGRpdGlvbnMKLQkgKiBAcGFyYW0gbW9kaWZpY2F0aW9ucwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhJQ1NTTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucywgUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gY3JlYXRlIGEgY2hhbmdlIG9iamVjdCBmb3IgbGF0ZXN0IGNoYW5nZSBhbmQgYWRkIHRvIHF1ZXVlCi0JCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSA9IG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucyk7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMuZ2V0KHZpZXdlcik7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlpbmZvLnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGluZm9zLm5leHQoKTsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBnbyB0aHJvdWdoIGV2ZXJ5IHByb2plY3Rpb252aWV3ZXIgYW5kIGNhbGwKLQkJLy8gcmVtb3ZlUHJvamVjdGlvblZpZXdlcih2aWV3ZXIpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaW5mb3MuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQkJaW5mb3MucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHZpZXdlciB0byBsaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyB0aGlzIGZhY3RvcnkgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdmlld2VyJ3MgZG9jdW1lbnQgYW5kIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCSAqICAgICAgICAgICAgYXJlIG5vdCBudWxsCi0JICovCi0Jdm9pZCBhZGRQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHJlbW92ZSBvbGQgZW50cnkgaWYgaXQgZXhpc3RzCi0JCXJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzID09IG51bGwpIHsKLQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgbmV3IG9iamVjdCBjb250YWluaW5nIHByb2plY3Rpb24gdmlld2VyIGFuZCBpdHMgaW5mbwotCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IG5ldyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24odmlld2VyKTsKLQkJZlByb2plY3Rpb25WaWV3ZXJzLnB1dCh2aWV3ZXIsIGluZm8pOwotCQlpbmZvLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiB2aWV3ZXIgZnJvbSB0aGUgbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcwotCSAqIGZhY3RvciBpcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCByZW1vdmVQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCBvZiB2aWV3ZXJzCi0JCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGZQcm9qZWN0aW9uVmlld2Vycy5yZW1vdmUodmlld2VyKTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlpbmZvLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCS8vIGlmIHJlbW92aW5nIGxhc3QgcHJvamVjdGlvbiB2aWV3ZXIsIGNsZWFyIG91dCBldmVyeXRoaW5nCi0JCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSkgewotCQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDU4ZmQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9qZWN0aW9uIHZpZXdlciBhbmQgYWxzbyBtYW5hZ2VzIHVwZGF0aW5nCi0gKiB0aGUgdmlld2VyJ3MgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0gKi8KLWNsYXNzIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIGRvY3VtZW50IHRvIGJlIGF3YXJlIG9mIHdoZW4gdG8gdXBkYXRlIHRoZSBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBEb2N1bWVudExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChmSW5mby5nZXREb2N1bWVudCgpID09IGRvY3VtZW50KSB7Ci0JCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKHRydWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCS8vIHJlZ2lzdGVyIGEgcG9zdCBub3RpZmljYXRpb24gcmVwbGFjZSBzbyB0aGF0IHByb2plY3Rpb24KLQkJCS8vIGFubm90YXRpb24gbW9kZWwgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGFsbCBkb2N1bWVudENoYW5nZWQKLQkJCS8vIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24gJiYgZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWlmIChmSW5mby5oYXNDaGFuZ2VzUXVldWVkKCkpCi0JCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uKSBkb2N1bWVudCkucmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZSh0aGlzLCBuZXcgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZJbmZvKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc3NlbnRpYWxseSBhIHBvc3QgZG9jdW1lbnQgY2hhbmdlZCBsaXN0ZW5lciBiZWNhdXNlIGl0IGlzIGNhbGxlZCBhZnRlcgotCSAqIGRvY3VtZW50Y2hhbmdlZCBoYXMgYmVlbiBmaXJlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm0oSURvY3VtZW50IGRvY3VtZW50LCBJRG9jdW1lbnRMaXN0ZW5lciBvd25lcikgewotCQkJZkluZm8uYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCQlmSW5mby5zZXRJc0RvY3VtZW50Q2hhbmdpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGN1cnJlbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIHZpZXdlcgotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLQkvKioKLQkgKiBEb2N1bWVudCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JLyoqCi0JICogTGlzdGVuZXIgdG8gZlByb2plY3Rpb25WaWV3ZXIncyBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXI7Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRvY3VtZW50IGlzIGluIHRoZSBtaWRkbGUgb2YgY2hhbmdpbmcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzRG9jdW1lbnRDaGFuZ2luZyA9IGZhbHNlOwotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCi0JcHVibGljIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlmRG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgPSB2aWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpOwotCX0KLQotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKSB7Ci0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0JfQotCi0Jdm9pZCBzZXRJc0RvY3VtZW50Q2hhbmdpbmcoYm9vbGVhbiBjaGFuZ2luZykgewotCQlmSXNEb2N1bWVudENoYW5naW5nID0gY2hhbmdpbmc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRG9jdW1lbnRDaGFuZ2luZygpIHsKLQkJcmV0dXJuIGZJc0RvY3VtZW50Q2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgcGVuZGluZyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0byB0aGUKLQkgKiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0Jdm9pZCBhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKSB7Ci0JCUxpc3QgcXVldWVkQ2hhbmdlcyA9IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCk7Ci0JCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBwZW5kaW5nIGFubm90YXRpb24gY2hhbmdlcyBhbmQgYXBwbHkKLQkJLy8gdGhlbSB0bwotCQkvLyB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JCXdoaWxlICghcXVldWVkQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIGNoYW5nZXMgPSAoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMpIHF1ZXVlZENoYW5nZXMucmVtb3ZlKDApOwotCQkJdHJ5IHsKLQkJCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbC5tb2RpZnlBbm5vdGF0aW9ucyhjaGFuZ2VzLmdldERlbGV0aW9ucygpLCBjaGFuZ2VzLmdldEFkZGl0aW9ucygpLCBjaGFuZ2VzLmdldE1vZGlmaWNhdGlvbnMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYmUgY29udGludWUKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFubm90YXRpb24gY2hhbmdlcyBxdWV1ZWQgdXAsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaGFzQ2hhbmdlc1F1ZXVlZCgpIHsKLQkJcmV0dXJuICFnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBpZiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4KLQkgKiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICovCi0JcHVibGljIHZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSkgewotCQkvKgotCQkgKiBmdXR1cmVfVE9ETzogbWF5YmUgaW1wcm92ZSBieSBjaGVja2luZyBpZiBhbm5vdGF0aW9uIHByb2plY3Rpb24KLQkJICogbW9kZWwgY2hhbmdlIGFscmVhZHkgZXhpc3RzIGZvciBub2RlLiBpZiBzbywgdGhyb3cgb3V0IG9sZCBjaGFuZ2UuCi0JCSAqLwotCQlnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpLmFkZChuZXdDaGFuZ2UpOwotCi0JCS8vIGlmIGRvY3VtZW50IGlzbid0IGNoYW5naW5nLCBnbyBhaGVhZCBhbmQgYXBwbHkgaXQKLQkJaWYgKCFpc0RvY3VtZW50Q2hhbmdpbmcoKSkgewotCQkJYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBhZGQgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZEb2N1bWVudExpc3RlbmVyID0gbmV3IERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyByZW1vdmUgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyICE9IG51bGwpIHsKLQkJCWdldERvY3VtZW50KCkucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgbGlzdCBvZiBxdWV1ZWQgY2hhbmdlcyBzaW5jZSBpdCBtYXkgbm8gbG9uZ2VyCi0JCS8vIGJlIGFjY3VyYXRlCi0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgIT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzLmNsZWFyKCk7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMDYyMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIHByb2plY3Rpb24gbW9kZWwgb2YgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciBDU1MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckNTUyBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciwgSVByb2plY3Rpb25MaXN0ZW5lciwgSVRleHRJbnB1dExpc3RlbmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wcm9qZWN0aW9ucGVyZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkXAotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEp1c3QgYWRkIGFkYXB0ZXIgdG8gdG9wIHN0eWxlc2hlZXQgbm9kZS4gVGhpcyBhZGFwdGVyIHdpbGwgdHJhY2sKLQkgKiBjaGlsZHJlbiBhZGRpdGlvbi9kZWxldGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCQkJSUNTU01vZGVsIGNzc01vZGVsID0gKElDU1NNb2RlbCkgc01vZGVsOwotCQkJCQlJQ1NTRG9jdW1lbnQgY3NzRG9jID0gY3NzTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGNzc0RvYyBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgY3NzRG9jOwotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MgYWRhcHRlciA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUykgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlhZGFwdGVyLnVwZGF0ZUFkYXB0ZXIoY3NzRG9jLCBmVmlld2VyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGp1c3QgY2FsbCBnZXRhZGFwdGVyIHNvIHRoZSBhZGFwdGVyIGlzIGNyZWF0ZWQKLQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkvLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkCi0JCQkJCQkJbm90aWZpZXIuZ2V0QWRhcHRlckZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5jbGFzcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckNTUy5hZGRBbGxBZGFwdGVyczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyB0byB1c2Ugd2l0aCB0aGlzIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZ2V0QWRhcHRlckZhY3RvcnkoYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCkgewotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQkJCQkJLy8gZ2V0dGluZyB0aGUgcHJvamVjdGlvbm1vZGVsbm9kZWFkYXB0ZXIgZm9yIHRoZSBmaXJzdAotCQkJCQkvLyB0aW1lCi0JCQkJCS8vIHNvIGRvIHNvbWUgaW5pdGlhbGl6aW5nCi0JCQkJCWlmICghZmFjdG9yeVJlZ2lzdHJ5LmNvbnRhaW5zKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKSAmJiBjcmVhdGVJZk5lZWRlZCkgewotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTIG5ld0ZhY3RvcnkgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKCk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIGZhY3RvcnkgcmVnaXN0cnkKLQkJCQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KG5ld0ZhY3RvcnkpOwotCQkJCQl9Ci0KLQkJCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGZhY3RvcnkKLQkJCQkJZmFjdG9yeSA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MpIGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gY2xlYXIgb3V0IG9sZCBpbmZvCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCWZEb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkvLyBzZXQgcHJvamVjdGlvbiB2aWV3ZXIgb24gbmV3IGRvY3VtZW50J3MgYWRhcHRlciBmYWN0b3J5Ci0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KHRydWUpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MzA0Ci0JCQkJLy8gZGlzYWJsZSByZWRyYXcgd2hpbGUgYWRkaW5nIGFsbCBhZGFwdGVycwotCQkJCWZWaWV3ZXIuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQlhZGRBbGxBZGFwdGVycygpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZlZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTLmluaXRpYWxpemU6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlIGEgUHJvamVjdGlvblZpZXdlciB3aXRoIHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyB1bmluc3RhbGwgYmVmb3JlIHRyeWluZyB0byBpbnN0YWxsIG5ldyB2aWV3ZXIKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXVuaW5zdGFsbCgpOwotCQl9Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZWaWV3ZXIuYWRkUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmVmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoZmFsc2UpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5LnJlbW92ZVByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgYWxsIGFubm90YXRpb25zCi0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKQotCQkJZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkucmVtb3ZlQWxsQW5ub3RhdGlvbnMoKTsKLQotCQlyZW1vdmVBbGxBZGFwdGVycygpOwotCi0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhZGFwdGVyIGZyb20gdG9wIHN0eWxlc2hlZXQgbm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBbGxBZGFwdGVycygpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSAoSUNTU01vZGVsKSBzTW9kZWw7Ci0JCQkJCUlDU1NEb2N1bWVudCBjc3NEb2MgPSBjc3NNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQlpZiAoY3NzRG9jIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBjc3NEb2M7Ci0JCQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJbm90aWZpZXIucmVtb3ZlQWRhcHRlcihhZGFwdGVyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTLmFkZEFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgZkRvY3VtZW50ICE9IG5ld0lucHV0KSB7Ci0JCQkvLyBkaXNhYmxlIHByb2plY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZXZlcnl0aGluZwotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgcHJvamVjdGlvbiB3YXMgcHJldmlvdXNseSBlbmFibGVkIGJlZm9yZSBpbnB1dCBkb2N1bWVudCBjaGFuZ2VkCi0JCS8vIGFuZCBuZXcgZG9jdW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gb2xkIGRvY3VtZW50Ci0JCWlmIChmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgJiYgZkRvY3VtZW50ID09IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotCQkJcHJvamVjdGlvbkVuYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciBmcm9tIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjBlOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBBIElQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBKRmFjZSB2aWV3ZXIgdXNlZCB0byBkaXNwbGF5Ci0gKiBwcm9wZXJ0aWVzIG9mIENTUyBub2Rlcy4KLSAqLwotcHVibGljIGNsYXNzIENTU1Byb3BlcnR5U291cmNlIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlLCBJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24gewotCXByb3RlY3RlZCBJQ1NTTm9kZSBmTm9kZSA9IG51bGw7Ci0JLy8gZm9yIHBlcmZvcm1hbmNlLi4uCi0JZmluYWwgc3RhdGljIENsYXNzIEFEQVBURVJfS0VZID0gSVByb3BlcnR5U291cmNlLmNsYXNzOwotCWZpbmFsIGJvb2xlYW4gUEVSRl9HRVRERVNDUklQVE9SUyA9IGZhbHNlOwotCXByaXZhdGUgbG9uZyB0aW1lMDsKLQotCXB1YmxpYyBDU1NQcm9wZXJ0eVNvdXJjZShJQ1NTTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSAgdGFyZ2V0OwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJLy8gdGhlIGRpc3BsYXlOYW1lIE1VU1QgYmUgc2V0Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUsIGZOb2RlKTsKLQkJLy8gSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3Ci0JCS8vIFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihDU1NNTU5vZGUgbm9kZSwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5nZXROYW1lKCksIGNhdGVnb3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBjYXRlZ29yeSkgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlpZiAobmFtZSAhPSBudWxsICYmIDAgPCBuYW1lLmxlbmd0aCgpKSB7Ci0JCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLQkJCQljYXRlZ29yeSA9IENTU1VJTWVzc2FnZXMuSU5GT19Ob3RfQ2F0ZWdvcml6ZWRfMTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIG5hbWUsIGZOb2RlLCBjYXRlZ29yeSk7Ci0JCQkvLyBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJLy8gZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIG5hbWUsIGZOb2RlKTsKLQkJCS8vIH0gZWxzZSB7Ci0JCQkvLyBkZXNjcmlwdG9yID0gbmV3IENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgbmFtZSwgZk5vZGUsCi0JCQkvLyBjYXRlZ29yeSk7Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbHVlIGZvciB0aGlzIG9iamVjdCB0aGF0IGNhbiBiZSBlZGl0dGVkIGluIGEgcHJvcGVydHkKLQkgKiBzaGVldC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmFsdWUgdGhhdCBjYW4gYmUgZWRpdHRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyBhbGwgZGVzY3JpcHRvcnMuCi0JICovCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCUNTU01ldGFNb2RlbCBtZXRhbW9kZWwgPSBDU1NNZXRhTW9kZWxGaW5kZXIuZ2V0SW5zdGFuY2UoKS5maW5kTWV0YU1vZGVsRm9yKGZOb2RlKTsKLQkJSXRlcmF0b3IgaVByb3BlcnRpZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCXN3aXRjaCAoZk5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSA6Ci0JCQljYXNlIElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuUEFHRVJVTEVfTk9ERSA6Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJQ1NTTU1Ob2RlIG1tUGFyZW50ID0gbmV3IENTU01ldGFNb2RlbFV0aWwobWV0YW1vZGVsKS5nZXRNZXRhTW9kZWxOb2RlRm9yKGZOb2RlKTsKLQkJCQlpZiAobW1QYXJlbnQgIT0gbnVsbCkgewotCQkJCQlpUHJvcGVydGllcyA9IG1tUGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJQ1NTTU1Ob2RlIG1tTm9kZSA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKG1ldGFtb2RlbCkuZ2V0TWV0YU1vZGVsTm9kZUZvcihmTm9kZSk7Ci0JCQkJaWYgKG1tTm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlQcm9wZXJ0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtbU5vZGUpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBzZXR1cCBjYXRlZ29yaWVzCi0JCU1hcCBjYXRlZ29yaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJSXRlcmF0b3IgaUNhdGVnb3JpZXMgPSBtZXRhbW9kZWwuZ2V0Q2F0ZWdvcmllcygpOwotCQl3aGlsZSAoaUNhdGVnb3JpZXMuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTUNhdGVnb3J5IGNhdGVnb3J5ID0gKENTU01NQ2F0ZWdvcnkpIGlDYXRlZ29yaWVzLm5leHQoKTsKLQkJCWNhdGVnb3JpZXMucHV0KGNhdGVnb3J5LmdldE5hbWUoKSwgY2F0ZWdvcnkuZ2V0Q2FwdGlvbigpKTsKLQkJfQotCi0JCS8vIGNvbGxlY3QgcHJvcGVydHkgbmFtZXMKLQkJU2V0IGRlY2xhcmVkUHJvcGVydGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChpUHJvcGVydGllcy5oYXNOZXh0KCkpIHsKLQkJCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUNTU05vZGVMaXN0IG5vZGVMaXN0ID0gKChJQ1NTTm9kZSkgZGVjbGFyYXRpb24pLmdldENoaWxkTm9kZXMoKTsKLQkJCQlpbnQgblByb3BzID0gKG5vZGVMaXN0ICE9IG51bGwpID8gbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgOiAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblByb3BzOyBpKyspIHsKLQkJCQkJSUNTU05vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQkJCQlpZiAobmFtZSAhPSBudWxsICYmIDAgPCBuYW1lLmxlbmd0aCgpKSB7Ci0JCQkJCQkJZGVjbGFyZWRQcm9wZXJ0aWVzLmFkZChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBmaXJzdDogcHJvcGVydGllcyBmcm9tIGNvbnRlbnQgbW9kZWwKLQkJd2hpbGUgKGlQcm9wZXJ0aWVzLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpUHJvcGVydGllcy5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkgfHwgbm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUikgewotCQkJCVN0cmluZyBjYXRlZ29yeSA9IChTdHJpbmcpIGNhdGVnb3JpZXMuZ2V0KG5vZGUuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAoZGVjbGFyZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJCWRlY2xhcmVkUHJvcGVydGllcy5yZW1vdmUobmFtZSk7Ci0JCQkJfQotCQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBjYXRlZ29yeSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2Vjb25kOiBleGlzdGluZyBwcm9wZXJ0aWVzIGJ1dCBub3QgaW4gY29udGVudCBtb2RlbAotCQlJdGVyYXRvciBpUmVtYWlucyA9IGRlY2xhcmVkUHJvcGVydGllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaVJlbWFpbnMuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoKFN0cmluZykgaVJlbWFpbnMubmV4dCgpLCBudWxsKTsKLQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQl9Ci0JCX0KLQotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gcmVzdWx0QXJyYXkgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltkZXNjcmlwdG9ycy5zaXplKCldOwotCQlpZiAoUEVSRl9HRVRERVNDUklQVE9SUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAoSVByb3BlcnR5RGVzY3JpcHRvcltdKSBkZXNjcmlwdG9ycy50b0FycmF5KHJlc3VsdEFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgbmFtZWQgcHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhcyBuYW1lZCBieSBpdHMgcHJvcGVydHkgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gbnVsbDsKLQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBuYW1lLnRvU3RyaW5nKCk7Ci0KLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG51bGw7Ci0KLQkJc3dpdGNoIChmTm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJdmFsdWVTdHJpbmcgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBmTm9kZSkuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJdmFsdWVTdHJpbmcgPSBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKG5hbWVTdHJpbmcpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFIDoKLQkJCQl2YWx1ZVN0cmluZyA9ICgoQ1NTU3R5bGVEZWNsYXJhdGlvbikgZk5vZGUpLmdldFByb3BlcnR5VmFsdWUobmFtZVN0cmluZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NOb2RlIHBhcmVudCA9IGZOb2RlOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJdmFsdWVTdHJpbmcgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBwYXJlbnQpLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHZhbHVlU3RyaW5nID09IG51bGwpIHsKLQkJCXZhbHVlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiB2YWx1ZVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3BlcnR5IHZhbHVlIGhhcyBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMKLQkgKiAgICAgICAgIGNoYW5nZWQgZnJvbSBpdHMgb3JpZ2luYWwgZGVmYXVsdCB2YWx1ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gZ2V0RGVjbGFyYXRpb25Ob2RlKCk7Ci0JCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5LnRvU3RyaW5nKCkpOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgMCA8IHZhbHVlLmxlbmd0aCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkncyB2YWx1ZSB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB0byByZXNldAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3Qgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCWRlY2xhcmF0aW9uLnJlbW92ZVByb3BlcnR5KHN0ci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVkIHByb3BlcnR5IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIHNldAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbDsKLQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBuYW1lLnRvU3RyaW5nKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHZhbHVlU3RyaW5nID09IG51bGwgfHwgdmFsdWVTdHJpbmcubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlkZWNsYXJhdGlvbi5yZW1vdmVQcm9wZXJ0eShuYW1lU3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlY2xhcmF0aW9uLnNldFByb3BlcnR5KG5hbWVTdHJpbmcsIHZhbHVlU3RyaW5nLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQ1NTVUlNZXNzYWdlcy5UaXRsZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IENTU1VJTWVzc2FnZXMuTWVzc2FnZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKHdpbmRvdy5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb25Ob2RlKCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbnVsbDsKLQotCQlzd2l0Y2ggKGZOb2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJZGVjbGFyYXRpb24gPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbikgZk5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NOb2RlIHBhcmVudCA9IGZOb2RlOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pKSB7Ci0JCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBwYXJlbnQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZGVjbGFyYXRpb247Ci0JfQotCi0JLy8gQnVnIDEzMDAzOSAtIEltcGxlbWVudCBJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5UmVtb3ZhYmxlKE9iamVjdCBuYW1lKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KE9iamVjdCBuYW1lKSB7Ci0JCWlmKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJCi0JCWlmKGRlY2xhcmF0aW9uICE9IG51bGwpCi0JCQlkZWNsYXJhdGlvbi5yZW1vdmVQcm9wZXJ0eShuYW1lLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjMjdhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1BhdGhTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgVGV4dFByb3BlcnR5RGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBmaW5hbCBJQ1NTTm9kZSBmTm9kZTsKLQotCS8qKgotCSAqIENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgSUNTU05vZGUgbm9kZSkgewotCQlzdXBlcihpZCwgZGlzcGxheU5hbWUpOwotCQl0aGlzLmZOb2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgSUNTU05vZGUgbm9kZSwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXN1cGVyKGlkLCBkaXNwbGF5TmFtZSk7Ci0JCXRoaXMuZk5vZGUgPSBub2RlOwotCQlzZXRDYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRVhURVJOQUwgJiYgZmluZEVkaXRvcihtb2RlbCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBjaGVjayB3aGV0aGVyIElGaWxlIGlzIHJlYWRvbmx5IHRvIHByb2hpYml0IGVkaXRpbmcgYmVmb3JlCi0JCS8vIHZhbGlkYXRlRWRpdCgpCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbW9kZWw7Ci0JCWlmIChtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJc3RydWN0dXJlZE1vZGVsID0gKChJRE9NTm9kZSkgbW9kZWwuZ2V0T3duZXJET01Ob2RlKCkpLmdldE1vZGVsKCk7Ci0JCQlpZiAoc3RydWN0dXJlZE1vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IENTU1BhdGhTZXJ2aWNlLmxvY2F0aW9uMkZpbGUoc3RydWN0dXJlZE1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmlzUmVhZE9ubHkoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBzdXBlci5jcmVhdGVQcm9wZXJ0eUVkaXRvcihwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElFZGl0b3JQYXJ0IGZpbmRFZGl0b3IoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCUlXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3dzW2ldLmdldFBhZ2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBhZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvcnMgPSBwYWdlc1tqXS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBlZGl0b3JzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IGVkaXRQYXJ0ID0gZWRpdG9yc1trXS5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCQlpZiAoZWRpdFBhcnQgIT0gbnVsbCkgewotCQkJCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdFBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQkJCQlJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotCQkJCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJCQkJLy9UT0RPIFVyZ2VudCBuZWVkcyB0byBiZSBmaXhlZAotCQkJCQkJCQkvLyBJIHRoaW5rIHdlIG5lZWQgJ2VxdWFscycgKG9yICdlcXVpdmFsZW50JwotCQkJCQkJCQkvLyBvbiBtb2RlbCkgZm9yIGNhc2VzIGxpa2UgdGhpcwotCQkJCQkJCQlpZiAoU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jYWxjdWxhdGVJZChmaWxlKS5lcXVhbHMobW9kZWwuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJCXJldHVybiBlZGl0UGFydDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3ZGNiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckNTUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBhZGQgdGhlIG5vcm1hbCBjb250ZW50IGJhc2VkIGZhY3RvcmllcyB0byBtb2RlbCdzIHJlZ2lzdHJ5Ci0JCWFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ0NTU0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMWE3MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2VsZWN0cyBlbmNsb3NpbmcgQ1NTIGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdDU1NBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIGN1cnNvck5vZGUgPSAoSUNTU05vZGUpIGluZGV4ZWRSZWdpb247Ci0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWludCBjdXJyZW50T2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBjdXJyZW50RW5kT2Zmc2V0ID0gY3VycmVudE9mZnNldCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gY3VycmVudEVuZE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpIHsKLQkJCQlJQ1NTTm9kZSBuZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdE5leHRDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTIyYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlOwotCi0vKioKLSAqIFNlbGVjdHMgbmV4dCBDU1MgZWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdE5leHRDU1NBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlpbnQgb2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSAxOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCW9mZnNldCA9IDA7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgb2Zmc2V0KTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IChJQ1NTTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpbnQgY3VycmVudE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgY3VycmVudEVuZE9mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJaWYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSBjdXJyZW50RW5kT2Zmc2V0KSB7Ci0JCQkJSUNTU05vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV3Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihjdXJyZW50T2Zmc2V0LCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gY3VycmVudE9mZnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0NTU0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0NTU0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Mjg5YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZWxlY3RzIHByZXZpb3VzIENTUyBlbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIGN1cnNvck5vZGUgPSAoSUNTU05vZGUpIGluZGV4ZWRSZWdpb247Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkgewotCQkJCUlDU1NOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQkJbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudEVuZE9mZnNldCAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjUzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0NTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIHN5bWJvbGljIG5hbWUgb2Ygc3R5bGVzIHVzZWQgYnkgTGluZVN0eWxlUHJvdmlkZXIsCi0gKiBDb2xvck1hbmFnZXIsIGFuZCBhbnkgb3RoZXJzIHdobyBtYXkgYmUgaW50ZXJlc3RlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0NTUyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMID0gIk5PUk1BTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVE1BUktfUlVMRSA9ICJBVE1BUktfUlVMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUiA9ICJTRUxFQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQSA9ICJNRURJQSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UID0gIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJQUk9QRVJUWV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZBTFVFID0gIlBST1BFUlRZX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSSA9ICJVUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HID0gIlNUUklORyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPTiA9ICJDT0xPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRU1JX0NPTE9OID0gIlNFTUlfQ09MT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSTFlfQlJBQ0UgPSAiQ1VSTFlfQlJBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1IgPSAiRVJST1IiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjA1MDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCS8qKiBDb250YWlucyByZWdpb24gdG8gc3R5bGUgbWFwcGluZyAqLwotCXByaXZhdGUgTWFwIGZDb2xvclR5cGVzOwotCi0JLyoqCi0JICogTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckNTUygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVGb3IodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rIHVwIHRoZSBUZXh0QXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gcmVnaW9uIGNvbnRleHQuIE1pZ2h0IHJldHVybgotCSAqIG51bGwgZm9yIHVudXN1YWwgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChmQ29sb3JUeXBlcy5nZXQodHlwZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0QXR0cmlidXRlcygpIHsKLQkJaWYgKGZDb2xvclR5cGVzID09IG51bGwpIHsKLQkJCWZDb2xvclR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8sIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TLCBJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04pOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UsIElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcsIElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESVVNLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFX1NFTEVDVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8sIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNILCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04pOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTiwgSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04uZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuQ09MT047Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQ7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuTUVESUE7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04uZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkc7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5VUkkuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuVVJJOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gdGhpcyBpcyBhcm91bmQgZm9yIG9sZCBkZXByZWNhdGVkIHByZWZlcmVuY2VzQ2hhbmdlZCgpIG1ldGhvZAotCQkJLy8gVE9ETyByZW1vdmUgd2hlbiBwcmVmZXJlbmNlc0NoYW5nZWQoKSBpcyByZW1vdmVkCi0JCQlsb2FkQ29sb3JzKCk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZDb2xvclR5cGVzICE9IG51bGwpIHsKLQkJCWZDb2xvclR5cGVzLmNsZWFyKCk7Ci0JCQlmQ29sb3JUeXBlcyA9IG51bGw7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCWluaXRBdHRyaWJ1dGVzKCk7Ci0JCQotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuRVJST1IpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1Y2IwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUyBleHRlbmRzIExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTIHsKLQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IGxpbmVSZXF1ZXN0U3RhcnQsIGludCBsaW5lUmVxdWVzdExlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlpbnQgcmVnaW9uU3RhcnQgPSB0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJaW50IHJlZ2lvbkVuZCA9IHJlZ2lvblN0YXJ0ICsgdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gd2hvbGVSZWdpb24gPSBnZXREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHJlZ2lvblN0YXJ0KTsKLQotCQlMaXN0IHRva2VuczsKLQkJaW50IG9mZnNldDsKLQotCQlQYXJzZXJDYWNoZSBjYWNoZSA9IGdldENhY2hlZFBhcnNpbmdSZXN1bHQod2hvbGVSZWdpb24pOwotCQlpZiAoY2FjaGUgPT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gd2hvbGVSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCVN0cmluZyBjb250ZW50OwotCQkJY29udGVudCA9IHdob2xlUmVnaW9uLmdldFRleHQoKTsKLQotCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfU1RZTEVTSEVFVCwgY29udGVudCk7Ci0JCQl0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5MaXN0KCk7Ci0JCQljYWNoZVBhcnNpbmdSZXN1bHQod2hvbGVSZWdpb24sIG5ldyBQYXJzZXJDYWNoZShvZmZzZXQsIHRva2VucykpOwotCQl9IGVsc2UgewotCQkJdG9rZW5zID0gY2FjaGUudG9rZW5zOwotCQkJb2Zmc2V0ID0gY2FjaGUub2Zmc2V0OwotCQl9Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoMCA8IHRva2Vucy5zaXplKCkpIHsKLQkJCWludCBzdGFydCA9IG9mZnNldDsKLQkJCWludCBlbmQgPSBzdGFydDsKLQkJCUl0ZXJhdG9yIGkgPSB0b2tlbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU1RleHRUb2tlbiB0b2tlbiA9IChDU1NUZXh0VG9rZW4pIGkubmV4dCgpOwotCQkJCWVuZCA9IHN0YXJ0ICsgdG9rZW4ubGVuZ3RoOwotCQkJCWludCBzdHlsZUxlbmd0aCA9IHRva2VuLmxlbmd0aDsKLQkJCQkvKiBUaGUgdG9rZW4gc3RhcnRzIGluIHRoZSByZWdpb24gKi8KLQkJCQlpZiAocmVnaW9uU3RhcnQgPD0gc3RhcnQgJiYgc3RhcnQgPCByZWdpb25FbmQpIHsKLQkJCQkJLyogWzIzOTQxNV0gVGhlIHJlZ2lvbiBtYXkgbm90IHNwYW4gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgdG9rZW4gLQotCQkJCQkgKiBBZGp1c3QgdGhlIGxlbmd0aCBzbyB0aGF0IGl0IGRvZXNuJ3Qgb3ZlcmxhcCB3aXRoIG90aGVyIHN0eWxlIHJhbmdlcyAqLwotCQkJCQlpZiAocmVnaW9uRW5kIDwgZW5kKQotCQkJCQkJc3R5bGVMZW5ndGggPSByZWdpb25FbmQgLSBzdGFydDsKLQkJCQkJYWRkU3R5bGVSYW5nZShob2xkUmVzdWx0cywgZ2V0QXR0cmlidXRlRm9yKHRva2VuLmtpbmQpLCBzdGFydCwgc3R5bGVMZW5ndGgpOwotCQkJCX0KLQkJCQkvKiBUaGUgcmVnaW9uIHN0YXJ0cyBpbiB0aGUgdG9rZW4gKi8KLQkJCQllbHNlIGlmIChzdGFydCA8PSByZWdpb25TdGFydCAmJiByZWdpb25TdGFydCA8IGVuZCApIHsKLQkJCQkJLyogVGhlIHRva2VuIG1heSBub3Qgc3BhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSByZWdpb24gKi8KLQkJCQkJaWYgKGVuZCA8IHJlZ2lvbkVuZCkKLQkJCQkJCXN0eWxlTGVuZ3RoID0gZW5kIC0gcmVnaW9uU3RhcnQ7Ci0JCQkJCWFkZFN0eWxlUmFuZ2UoaG9sZFJlc3VsdHMsIGdldEF0dHJpYnV0ZUZvcih0b2tlbi5raW5kKSwgcmVnaW9uU3RhcnQsIHN0eWxlTGVuZ3RoKTsKLQkJCQl9Ci0JCQkJc3RhcnQgKz0gdG9rZW4ubGVuZ3RoOwotCQkJfQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRTdHlsZVJhbmdlKENvbGxlY3Rpb24gaG9sZFJlc3VsdHMsIFRleHRBdHRyaWJ1dGUgYXR0cmlidXRlLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKQotCQkJaG9sZFJlc3VsdHMuYWRkKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBlbmQsIGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRTdHlsZSgpKSk7Ci0JCWVsc2UKLQkJCWhvbGRSZXN1bHRzLmFkZChuZXcgU3R5bGVSYW5nZShzdGFydCwgZW5kLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW51cENhY2hlKCkgewotCQlmQ2FjaGVLZXkgPSAtMTsKLQkJZkNhY2hlUmVzdWx0ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFBhcnNlckNhY2hlIGdldENhY2hlZFBhcnNpbmdSZXN1bHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGZDYWNoZUtleSA9PSByZWdpb24uZ2V0VGV4dCgpLmhhc2hDb2RlKCkpIHsKLQkJCXJldHVybiBmQ2FjaGVSZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlUGFyc2luZ1Jlc3VsdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgUGFyc2VyQ2FjaGUgcmVzdWx0KSB7Ci0JCWZDYWNoZUtleSA9IHJlZ2lvbi5nZXRUZXh0KCkuaGFzaENvZGUoKTsKLQkJZkNhY2hlUmVzdWx0ID0gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJY2xlYW51cENhY2hlKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQYXJzZXJDYWNoZSB7Ci0JCVBhcnNlckNhY2hlKGludCBuZXdPZmZzZXQsIExpc3QgbmV3VG9rZW5zKSB7Ci0JCQlvZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCQl0b2tlbnMgPSBuZXdUb2tlbnM7Ci0JCX0KLQotCQlpbnQgb2Zmc2V0OwotCQlMaXN0IHRva2VuczsKLQl9Ci0KLQlpbnQgZkNhY2hlS2V5ID0gLTE7Ci0JUGFyc2VyQ2FjaGUgZkNhY2hlUmVzdWx0ID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3ZGE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUyBleHRlbmRzIFNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RZUEUgPSBnZXRFbmNvZGluZ1R5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUygpIHsKLQkJc3VwZXIoRU5DT0RJTkdfVFlQRSwgQ1NTVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlc19lbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5ODFjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIENTUyB0ZW1wbGF0ZSBjb250ZXh0IHR5cGVzLiBUZW1wbGF0ZXMgb2YgdGhpcyBjb250ZXh0IHR5cGUKLSAqIGFwcGx5IHRvIGFueSBwbGFjZSB3aXRoaW4gQ1NTIGNvbnRlbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVDU1MgZXh0ZW5kcyBUZW1wbGF0ZUNvbnRleHRUeXBlIHsKLQotCXB1YmxpYyBUZW1wbGF0ZUNvbnRleHRUeXBlQ1NTKCkgewotCQlzdXBlcigpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuQ3Vyc29yKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRGF0ZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRvbGxhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkxpbmVTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5UaW1lKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVXNlcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLldvcmRTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5ZZWFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMTM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gImNzc19hbGwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSAiY3NzX25ldyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZXh0L0NTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZXh0L0NTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyZGJjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGV4dC9DU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBDU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXByaXZhdGUgaW50IGZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuTEVGVDsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZENvbnRleHRzCi0JICogQHBhcmFtIG5leHRNYXRjaGVyCi0JICovCi0JcHVibGljIENTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZ2V0QW5jaG9yKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFuY2hvcigpIHsKLQkJcmV0dXJuIGZBbmNob3I7Ci0JfQotCi0JcHVibGljIElSZWdpb24gbWF0Y2goSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gciA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJaWYgKHIuZ2V0UHJldmlvdXMoKSAhPSBudWxsICYmIHIuZ2V0U3RhcnRPZmZzZXQoKSA9PSBvZmZzZXQgJiYgci5nZXRQcmV2aW91cygpLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkpIHsKLQkJCQkJciA9IHIuZ2V0UHJldmlvdXMoKTsKLQkJCQl9Ci0JCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSkgewotCQkJCQl3aGlsZSAociAhPSBudWxsICYmICFyLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkpIHsKLQkJCQkJCXIgPSByLmdldFByZXZpb3VzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG5ldyBSZWdpb24oci5nZXRTdGFydE9mZnNldCgpLCAxKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoci5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpKSB7Ci0JCQkJCXdoaWxlIChyICE9IG51bGwgJiYgIXIuZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSkgewotCQkJCQkJciA9IHIuZ2V0TmV4dCgpOwotCQkJCQl9Ci0JCQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgUmVnaW9uKHIuZ2V0RW5kT2Zmc2V0KCkgLSAxLCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzZjNjkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbnkgdXNlZCBNb2R1bGUgQ29yZSBhbmQgRmFjZXRzIEFQSXMgYWxvbmcgd2l0aAotICogZmFsbGJhY2tzIGZvciB1c2Ugb24gbm9uLWNvbXBsaWFudCBwcm9qZWN0cyBhbmQgd2hlbiB0aG9zZSBzZXJ2aWNlcyBhcmUgbm90Ci0gKiBhdmFpbGFibGUgYXQgcnVudGltZS4KLSAqIAotICogQmVjYXVzZSBNb2R1bGVDb3JlIEFQSSBjYWxscyBjYW4gcmVzdWx0IGluIGxvY2tzIG5lZWRpbmcgdG8gYmUgYWNxdWlyZWQsCi0gKiBub25lIG9mIHRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCB3aGlsZSBvdGhlciB0aHJlYWQgbG9ja3MgaGF2ZQotICogYWxyZWFkeSBiZWVuIGFjcXVpcmVkLgotICovCi1maW5hbCBjbGFzcyBGYWNldE1vZHVsZUNvcmVTdXBwb3J0IHsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZHVtcF9OQ0RGRSA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuaXNXZWJQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjE5MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIFdyYXBwZXIgY2xhc3MgZm9yIGFsbCBGYWNldC1yZWxhdGVkIGNhbGxzLiBJZiB0aGUgRmFjZXQgb3IgTW9kdWxlQ29yZQotICogYnVuZGxlcyBhcmUgbm90IGF2YWlsYWJsZSwgdGhpcyBjbGFzcyB3aWxsIG5vdCBsb2FkLCBvciBpZiBpdCBkb2VzLCBpdHMKLSAqIG1ldGhvZHMgd2lsbCBjYXVzZSBOb0NsYXNzRGVmRm91bmRFcnJvcnMuIFRoaXMgYWxsb3dzIHVzIHRvCi0gKiBjb21wYXJ0bWVudGFsaXplIHRoZSBkZXBlbmRlbmNpZXMuCi0gKiAKLSAqLwotZmluYWwgY2xhc3MgRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlIHsKLQkvKioKLQkgKiBDb3BpZWQgdG8gYXZvaWQgdW5uZWVkZWQgZXh0cmEgZGVwZW5kZW5jeSAocGx1cyBpdCdzIHVuY2xlYXIgd2h5IHRoZQotCSAqIHZhbHVlIGlzIGluIHRoYXQgcGx1Zy1pbikuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9XRUJfTU9EVUxFID0gImpzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NUX1dFQl9NT0RVTEUgPSAid3N0LndlYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgSVBhdGggdG8gdGhlICJyb290IiBvZiB0aGUgd2ViIGNvbnRlbnRzCi0JICovCi0Jc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0KLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwgJiYgY29tcG9uZW50LmV4aXN0cygpKSB7Ci0JCQlwYXRoID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBpcyA9IGZhbHNlOwotCQl0cnkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKEpTVF9XRUJfTU9EVUxFKSkgewotCQkJCUlQcm9qZWN0RmFjZXQgZmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSlNUX1dFQl9NT0RVTEUpOwotCQkJCWlzID0gaXMgfHwgKGZhY2V0ZWQgIT0gbnVsbCAmJiBmYWNldGVkLmhhc1Byb2plY3RGYWNldChmYWNldCkpOwotCQkJfQotCQkJaWYgKFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZChXU1RfV0VCX01PRFVMRSkpIHsKLQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KFdTVF9XRUJfTU9EVUxFKTsKLQkJCQlpcyA9IGlzIHx8IChmYWNldGVkICE9IG51bGwgJiYgZmFjZXRlZC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU0ZpbGVXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU0ZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzY0MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotCi1jbGFzcyBOZXdDU1NGaWxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQkKLQlwdWJsaWMgTmV3Q1NTRmlsZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0gICAgfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgdGhlIHNlbGVjdGVkIGZvbGRlciB0byB3ZWIgY29udGVudHMgCi0JICogZm9sZGVyIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBvdXRzaWRlIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyLiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKSB7Ci0JCXN1cGVyLmluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpOwotCQkKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQkJCi0JCWlmICh3ZWJDb250ZW50UGF0aCAhPSBudWxsICYmICF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJc2V0Q29udGFpbmVyRnVsbFBhdGgod2ViQ29udGVudFBhdGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgYWRkaXRpb25hbCB2YWxpZGF0aW9uIHNwZWNpZmljIHRvIAotCSAqIGNzcyBmaWxlcy4gCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQotCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKChmdWxsUGF0aCAhPSBudWxsKSAmJiAoZnVsbFBhdGguaXNFbXB0eSgpID09IGZhbHNlKSAmJiAoZmlsZU5hbWUgIT0gbnVsbCkpIHsKLQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZpbGVOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChDU1NVSU1lc3NhZ2VzLl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9DU1MsIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gY2hlY2sgYWRkaW5nIGRlZmF1bHQKLQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5GT0xERVIpOwotCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkvLyBwYXRoIGludmFsaWQKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKCh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihyZXNvdXJjZVBhdGgpLmV4aXN0cygpIHx8IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoQ1NTVUlNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBnZXQgdGhlIElQcm9qZWN0IGZvciB0aGUgc2VsZWN0aW9uIHBhdGgKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQkJLy8gaWYgaW5zaWRlIHdlYiBwcm9qZWN0LCBjaGVjayBpZiBpbnNpZGUgd2ViQ29udGVudCBmb2xkZXIKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgaXNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJLy8gY2hlY2sgdGhhdCB0aGUgcGF0aCBpcyBpbnNpZGUgdGhlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQkJCQlpZiAoIXdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZnVsbFBhdGgpKSB7Ci0JCQkJCXNldE1lc3NhZ2UoQ1NTVUlNZXNzYWdlcy5fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQsIFdBUk5JTkcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChmQ29udGVudFR5cGUgPT0gbnVsbCkKLQkJCWZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1MpOwotCQlyZXR1cm4gZkNvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIENTUyBDb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgYWRkRGVmYXVsdEV4dGVuc2lvbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIG5ld0ZpbGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihmaWxlbmFtZSk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQotCQluZXdGaWxlTmFtZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQluZXdGaWxlTmFtZS5hcHBlbmQoZXh0KTsKLQotCQlyZXR1cm4gbmV3RmlsZU5hbWUudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHdoaWNoIHByb2plY3QgaXMgbmVlZGVkCi0JICogQHJldHVybiBJUHJvamVjdCBvYmplY3QuIElmIHBhdGggaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHJldHVybiB2YWx1ZSAKLQkgKiAJCSAgIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uIAotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21QYXRoKElQYXRoIHBhdGgpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJaWYgKHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuUFJPSkVDVCkuaXNPSygpKSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnRvU3RyaW5nKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSB3ZWIgcHJvamVjdC4gCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIHdlYiBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuaXNXZWJQcm9qZWN0KHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHdoaWNoIHdlYiBjb250ZW50cyBwYXRoIGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVBhdGggb2YgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIKLQkgKi8KLQlwcml2YXRlIElQYXRoIGdldFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwMDM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkNTU1VJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLk5FVyk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWZTdG9yZSA9IChUZW1wbGF0ZVN0b3JlKSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExhYmVsIHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogTGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZSBuYW1lICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZTsKLQkvKiogVGhlIHZpZXdlciBkaXNwbGF5cyB0aGUgcGF0dGVybiBvZiBzZWxlY3RlZCB0ZW1wbGF0ZS4gKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBmUGF0dGVyblZpZXdlcjsKLQkvKiogVGhlIHRhYmxlIHByZXNlbnRpbmcgdGhlIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKLQkvKiogVGVtcGxhdGUgc3RvcmUgdXNlZCBieSB0aGlzIHdpemFyZCBwYWdlICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCS8qKiBDaGVja2JveCBmb3IgdXNpbmcgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgQnV0dG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbjsKLQotCXB1YmxpYyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZSIsIENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLk5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMSk7Ci0JfQotCi0JLyoqCi0JICogQ29ycmVjdGx5IHJlc2l6ZXMgdGhlIHRhYmxlIHNvIG5vIHBoYW50b20gY29sdW1ucyBhcHBlYXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gYnV0dG9ucwotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbnMKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBjb2x1bW4xCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjMKLQkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBjb2x1bW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlVGFibGVSZXNpemluZyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZSB0YWJsZSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMikgewotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLQkJCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4KLQkJCQkJLy8gd2lkdGgKLQkJCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0KLQotCQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQkJaWYgKG9sZFNpemUueCA+IHdpZHRoKSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zCi0JCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0JCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGUgY2hlY2tib3ggZm9yIHVzZXIgdG8gdXNlIENTUyBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsoaW5uZXJQYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8zKTsKLQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVtcGxhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlmVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKSB7Ci0JCQkJaWYgKChvYmplY3QxIGluc3RhbmNlb2YgVGVtcGxhdGUpICYmIChvYmplY3QyIGluc3RhbmNlb2YgVGVtcGxhdGUpKSB7Ci0JCQkJCVRlbXBsYXRlIGxlZnQgPSAoVGVtcGxhdGUpIG9iamVjdDE7Ci0JCQkJCVRlbXBsYXRlIHJpZ2h0ID0gKFRlbXBsYXRlKSBvYmplY3QyOwotCQkJCQlpbnQgcmVzdWx0ID0gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQlyZXR1cm4gbGVmdC5nZXREZXNjcmlwdGlvbigpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqZWN0MSwgb2JqZWN0Mik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQotCQlmVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCXVwZGF0ZVZpZXdlcklucHV0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIgdGhhdCBkaXNwbGF5cyBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUncyBjb250ZW50cwotCQlmUGF0dGVyblZpZXdlciA9IGRvQ3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJZlRlbXBsYXRlU3RvcmUgPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCWNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoaW5uZXJQYXJlbnQsIHRhYmxlLCBjb2x1bW4xLCBjb2x1bW4yKTsKLQkJbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5DU1NfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMgYSBzb3VyY2Ugdmlld2VyIHRvIHByZXNlbnQgdGhlIHRlbXBsYXRlCi0JICogcGF0dGVybiBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBDbGllbnRzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEKLQkgKiBjdXN0b20gc291cmNlIHZpZXdlciBmZWF0dXJpbmcgZS5nLiBzeW50YXggY29sb3JpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgc291cmNlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUyk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV81KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGNzcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBDU1MgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IENTUyBGaWxlIHdpemFyZC4KLQkgKi8KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiNDU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIE5ld0NTU1dpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgTmV3Q1NTRmlsZVdpemFyZFBhZ2UgZk5ld0ZpbGVQYWdlOwotCXByaXZhdGUgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWZOZXdGaWxlUGFnZSA9IG5ldyBOZXdDU1NGaWxlV2l6YXJkUGFnZSgiQ1NTV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKElERS5jb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoZlNlbGVjdGlvbikpKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoQ1NTVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19IRUFESU5HKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oQ1NTVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19ERVNDUklQVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkUGFnZShmTmV3RmlsZVBhZ2UpOwotCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZSA9IG5ldyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBhcHBseUxpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSwgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLCBuZXcgSVNjb3BlQ29udGV4dFtdIHtuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKSwgbmV3IEluc3RhbmNlU2NvcGUoKSB9KTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZSh0ZXh0LCAiXHJcbiIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXHIiLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxuIiwgbGluZURlbGltaXRlcik7Ci0JCXJldHVybiBjb252ZXJ0ZWRUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShDU1NVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX1RJVExFKTsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IENTU0ltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX05FV0NTU0ZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGFwcGx5TGluZURlbGltaXRlcihmaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBDU1MgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjOWQ4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBvdXRsaW5lIHZpZXcgcGFnZSB3aGljaCBzaG93cyBDU1MgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9TT1JUX1BSRUYgPSAib3V0bGluZS1zb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBDU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBzdXBlci5jcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCi0JCVNvcnRBY3Rpb24gc29ydEFjdGlvbiA9IG5ldyBTb3J0QWN0aW9uKHZpZXdlciwgQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX1NPUlRfUFJFRik7Ci0JCUlDb250cmlidXRpb25JdGVtIHNvcnRJdGVtID0gbmV3IFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShzb3J0QWN0aW9uKTsKLQotCQlpZiAoaXRlbXMgPT0gbnVsbCkgewotCQkJaXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bMV07Ci0JCQlpdGVtc1swXSA9IHNvcnRJdGVtOwotCQl9Ci0JCWVsc2UgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjb21iaW5lZEl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW2l0ZW1zLmxlbmd0aCArIDFdOwotCQkJY29tYmluZWRJdGVtc1swXSA9IHNvcnRJdGVtOwotCQkJU3lzdGVtLmFycmF5Y29weShpdGVtcywgMCwgY29tYmluZWRJdGVtcywgMSwgaXRlbXMubGVuZ3RoKTsKLQkJCWl0ZW1zID0gY29tYmluZWRJdGVtczsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyID09IG51bGwpCi0JCQlmQ29udGVudFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUygpOwotCQlyZXR1cm4gZkNvbnRlbnRQcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRGaWx0ZXJlZE5vZGUoT2JqZWN0IG8pIHsKLQkJSUNTU05vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChvIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoSUNTU05vZGUpIG87Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkpIHsKLQkJCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0RmlsdGVyZWROb2RlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCU9iamVjdFtdIGZpbHRlcmVkID0gbmV3IE9iamVjdFtvYmplY3RzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyZWQubGVuZ3RoOyBpKyspIHsKLQkJCWZpbHRlcmVkW2ldID0gZ2V0RmlsdGVyZWROb2RlKG9iamVjdHNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZDsKLQl9Ci0KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MoKTsKLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5TdHJ1Y3R1cmVkQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVNlbGVjdGlvbiBmaWx0ZXJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBmaWx0ZXJlZE5vZGVzID0gZ2V0RmlsdGVyZWROb2RlcygoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSk7Ci0JCQlmaWx0ZXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbHRlcmVkTm9kZXMpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZFNlbGVjdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGYzNTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotCi0vKioKLSAqIEEgQ29udGVudCBwcm92aWRlciBmb3IgYSBKRmFjZSB2aWV3ZXIgdXNlZCB0byBkaXNwbGF5IENTUyBub2Rlcy4gVGhpcwotICogY29udGVudCBwcm92aWRlciBkb2VzIG5vdCB1c2UgYWRhcHRlcnMuCi0gKi8KLWNsYXNzIEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUyBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBKRmFjZU5vZGVDb250ZW50UHJvdmlkZXJDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50cyhPYmplY3QgZWxlbWVudCwgQXJyYXlMaXN0IHYpIHsKLQotCQlJQ1NTTm9kZSBub2RlOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoSUNTU01vZGVsKSBlbGVtZW50OwotCQkJSUNTU0RvY3VtZW50IGRvYyA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlub2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoKElDU1NOb2RlKSBlbGVtZW50KS5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuOwotCi0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCXYuYWRkKG5vZGUpOwotCQkJfQotCi0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmlzdWFsIHBhcnQgdGhhdCBpcyB1c2luZyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWJvdXQgdG8gYmUKLQkgKiBkaXNwb3NlZC4gRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIGNvbnRhaW5pbmcgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBnaXZlbiBlbGVtZW50LAotCSAqIHdoaWNoIHJlcHJlc2VudHMgYSBub2RlIGluIGEgdHJlZS4gVGhlIGRpZmZlcmVuY2UgdG8KLQkgKiA8Y29kZT5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhPYmplY3QpPC9jb2RlPiBpcyBhcwotCSAqIGZvbGxvd3M6IDxjb2RlPmdldEVsZW1lbnRzPC9jb2RlPiBpcyBjYWxsZWQgdG8gb2J0YWluIHRoZSB0cmVlCi0JICogdmlld2VyJ3Mgcm9vdCBlbGVtZW50cy4gTWV0aG9kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBpcyB1c2VkIHRvCi0JICogb2J0YWluIHRoZSBjaGlsZHJlbiBvZiBhIGdpdmVuIG5vZGUgaW4gdGhlIHRyZWUsIHdoaWNoIGNhbiBjYW4gYmUgYQotCSAqIHJvb3Qgbm9kZSwgdG9vLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gd2l0aCB0aGUgZWxlbWVudHMgYmVsb25naW5nIHRvIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwgaXRlbXMgaW4gYQotCSAqIGxpc3QgZXRjLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gSW4KLQkgKiB0aGlzIGNhc2UgdGhlIHRyZWUgdmlld2VyIGNhbid0IGV4cGFuZCBhIGdpdmVuIG5vZGUgY29ycmVjdGx5IGlmCi0JICogcmVxdWVzdGVkLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaGFzIGNoaWxkcmVuLgotCSAqIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihvYmplY3QpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG9sZElucHV0ICE9IG51bGwgJiYgb2xkSW5wdXQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgb2xkSW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCQlpZiAobmV3SW5wdXQgIT0gbnVsbCAmJiBuZXdJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCUlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgKChJU3RydWN0dXJlZE1vZGVsKSBuZXdJbnB1dCkuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRMaXN0ZW5lcih2aWV3ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgaXMgZGVsZXRlZCBvciBub3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpGYWNlIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGFibGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QgVGhlIG9iamVjdCB0byBnZXQgdGhlIGFkYXB0ZXIgZm9yCi0JICovCi0JcHJpdmF0ZSBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmIChhZGFwdGFibGUgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCWFkYXB0YWJsZSA9ICgoSUNTU01vZGVsKSBhZGFwdGFibGUpLmdldERvY3VtZW50KCk7Ci0JCX0KLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElDU1NOb2RlICYmIGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9ICgoSU5vZGVOb3RpZmllcikgYWRhcHRhYmxlKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChub2RlQWRhcHRlciBpbnN0YW5jZW9mIElKRmFjZU5vZGVBZGFwdGVyKQotCQkJCWFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpIG5vZGVBZGFwdGVyOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvSkZhY2VOb2RlTGFiZWxQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjRkZTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotCi1jbGFzcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSkZhY2UgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGFkYXB0YWJsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBUaGUgb2JqZWN0IHRvIGdldCB0aGUgYWRhcHRlciBmb3IKLQkgKi8KLQlwcml2YXRlIElKRmFjZU5vZGVBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZSkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJYWRhcHRhYmxlID0gKChJQ1NTTW9kZWwpIGFkYXB0YWJsZSkuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQlpZiAoYWRhcHRhYmxlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKG5vZGVBZGFwdGVyIGluc3RhbmNlb2YgSUpGYWNlTm9kZUFkYXB0ZXIpCi0JCQkJYWRhcHRlciA9IChJSkZhY2VOb2RlQWRhcHRlcikgbm9kZUFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UuIEVsZW1lbnQKLQkgKiAgICAgICAgICAgIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIG5vIGlucHV0IG9iamVjdCBpcyBzZXQKLQkgKiAgICAgICAgICAgIHRvIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoZWxlbWVudCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlpbWFnZSA9IGFkYXB0ZXIuZ2V0TGFiZWxJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgdGV4dC4gRWxlbWVudCBjYW4KLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgbm8gaW5wdXQgb2JqZWN0IGlzIHNldCB0bwotCSAqICAgICAgICAgICAgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbGVtZW50KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdGV4dCA9IGFkYXB0ZXIuZ2V0TGFiZWxUZXh0KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgbGFiZWwgcHJvdmlkZXIgaXMgYWZmZWN0ZWQgYnkgdGhlIGdpdmVuIGRvbWFpbgotCSAqIGV2ZW50LgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RlZChPYmplY3QgZHVtbXkpIHsvLyBEb21haW5FdmVudCBldmVudCkgewotCQkvLyByZXR1cm4gZXZlbnQuaXNNb2RpZmllcihEb21haW5FdmVudC5OT05fU1RSVUNUVVJFX0NIQU5HRSk7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSBhCi0JICogbm9uLXN0cnVjdHVyYWwgdmlld2VyIHVwZGF0ZS4gSWYgdGhlIHByb3BlcnR5IG1lbnRpb25lZCBpbiB0aGUgdXBkYXRlCi0JICogZG9lcyBub3QgYWZmZWN0IHRoZSBsYWJlbCwgdGhlbiB0aGUgdmlld2VyIG5lZWQgbm90IHVwZGF0ZSB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd291bGQgYmUgdW5hZmZlY3RlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1NvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwZGJmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5DU1NFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLQotLyoKLSAqIEJhc2VkIG9uIERURENvbnRlbnRPdXRsaW5lUGFnZSNTb3J0QWN0aW9uCi0gKi8KLWNsYXNzIFNvcnRBY3Rpb24gZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiB7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwdWJsaWMgU29ydEFjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJc3VwZXIoQ1NTVUlNZXNzYWdlcy5Tb3J0QWN0aW9uXzAsIHN0b3JlLCBwcmVmZXJlbmNlS2V5LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1NTVUlQbHVnaW4uSUQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NPUlQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoZGVzYyk7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCXRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWlmIChpc0NoZWNrZWQoKSkgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlpZiAoaXNDaGVja2VkKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihudWxsKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldElucHV0KHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhleHBhbmRlZEVsZW1lbnRzKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvcHJvcGVydGllcy9DU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGMxZmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ1NTUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHNoZWV0IHBhZ2Ugd2hpY2ggc2hvd3MgQ1NTIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIGNsYXNzIENTU1Byb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKS5hZGRQcm9wZXJ0eVNoZWV0UGFnZShmUHJvcGVydHlTaGVldFBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDU1NQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgewotCQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZSBmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQlwcml2YXRlIElDU1NOb2RlIGZTb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGZTb3VyY2UgIT0gbnVsbCAmJiBvYmplY3QuZXF1YWxzKGZTb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJZlNvdXJjZSA9IChJQ1NTTm9kZSlvYmplY3Q7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbmV3IENTU1Byb3BlcnR5U291cmNlKGZTb3VyY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlNvdXJjZSA9IG51bGw7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBmUHJvcGVydHlTb3VyY2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb3BlcnRpZXNSZWZyZXNoSm9iIGV4dGVuZHMgVUlKb2IgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQkJcHJpdmF0ZSBTZXQgcHJvcGVydHlTaGVldFBhZ2VzID0gbnVsbDsKLQotCQlwdWJsaWMgUHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCQlzdXBlcihYTUxVSU1lc3NhZ2VzLkpGYWNlTm9kZUFkYXB0ZXJfMSk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQkJcHJvcGVydHlTaGVldFBhZ2VzID0gbmV3IEhhc2hTZXQoMSk7Ci0JCX0KLQotCQl2b2lkIGFkZFByb3BlcnR5U2hlZXRQYWdlKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuYWRkKHBhZ2UpOwotCQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlPYmplY3RbXSBwYWdlcyA9IHByb3BlcnR5U2hlZXRQYWdlcy50b0FycmF5KCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuY2xlYXIoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoUHJvcGVydHlTaGVldFBhZ2UpIHBhZ2VzW2ldOwotCQkJCWlmIChwYWdlLmdldENvbnRyb2woKSAhPSBudWxsICYmICFwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCXByaXZhdGUgUHJvcGVydGllc1JlZnJlc2hKb2IgZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbnVsbDsKLQotCUlQcm9wZXJ0eVNoZWV0UGFnZSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbnVsbDsKLQotCXByaXZhdGUgSU5vZGVBZGFwdGVyIGZSZWZyZXNoQWRhcHRlciA9IG5ldyBDU1NQcm9wZXJ0eVNoZWV0UmVmcmVzaEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgSU5vZGVOb3RpZmllcltdIGZTZWxlY3RlZE5vdGlmaWVyczsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5wdXRTZWxlY3Rpb24oSVdvcmtiZW5jaFBhcnQgc2VsZWN0aW5nUGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gcmVtb3ZlIFVJIHJlZnJlc2ggYWRhcHRlcnMKLQkJaWYgKGZTZWxlY3RlZE5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCWZTZWxlY3RlZE5vdGlmaWVyc1tpXS5yZW1vdmVBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQl9Ci0JCQlmU2VsZWN0ZWROb3RpZmllcnMgPSBudWxsOwotCQl9Ci0KLQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBzdXBlci5nZXRJbnB1dFNlbGVjdGlvbihzZWxlY3RpbmdQYXJ0LCBzZWxlY3Rpb24pOwotCQlpZiAocHJlZmVycmVkU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cyA9IG5ldyBPYmplY3RbKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCldOwotCQkJU3lzdGVtLmFycmF5Y29weSgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSwgMCwgc2VsZWN0ZWRPYmplY3RzLCAwLCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIHNlbGVjdGVkT2JqZWN0c1tpXTsKLQkJCQkJd2hpbGUgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5QUklNSVRJVkVWQUxVRV9OT0RFIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUpIHsKLQkJCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCXNlbGVjdGVkT2JqZWN0c1tpXSA9IG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBBZGQgVUkgcmVmcmVzaCBhZGFwdGVycyBhbmQgcmVtZW1iZXIgbm90aWZpZXJzIGZvciBsYXRlcgotCQkJICogcmVtb3ZhbAotCQkJICovCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQlMaXN0IHNlbGVjdGVkTm90aWZpZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3RzW2ldIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJc2VsZWN0ZWROb3RpZmllcnMuYWRkKHNlbGVjdGVkT2JqZWN0c1tpXSk7Ci0JCQkJCQkoKElOb2RlTm90aWZpZXIpIHNlbGVjdGVkT2JqZWN0c1tpXSkuYWRkQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IChJTm9kZU5vdGlmaWVyW10pIHNlbGVjdGVkTm90aWZpZXJzLnRvQXJyYXkobmV3IElOb2RlTm90aWZpZXJbc2VsZWN0ZWROb3RpZmllcnMuc2l6ZSgpXSk7Ci0JCQl9Ci0JCQlwcmVmZXJyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZE9iamVjdHMpOwotCQl9Ci0JCXJldHVybiBwcmVmZXJyZWRTZWxlY3Rpb247Ci0JfQotCi0JUHJvcGVydGllc1JlZnJlc2hKb2IgZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCWlmIChmUHJvcGVydGllc1JlZnJlc2hKb2IgPT0gbnVsbCkgewotCQkJZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbmV3IFByb3BlcnRpZXNSZWZyZXNoSm9iKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYjsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQlpZiAoZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBuZXcgQ1NTUHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotCQkJZlByb3BlcnR5U2hlZXRQYWdlID0gcGFnZTsKLQkJfQotCQlyZXR1cm4gZlByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKCk7Ci0JCWlmIChmU2VsZWN0ZWROb3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWROb3RpZmllcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0ucmVtb3ZlQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJfQotCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjgyZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRlbXBsYXRlcy5uZXdjc3MubmFtZT1OZXcgQ1NTIEZpbGUKLVRlbXBsYXRlcy5uZXdjc3MuZGVzYz1uZXcgY3NzIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS90ZW1wbGF0ZXMvY3NzZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTBmMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLm5ld2Nzcy5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5uZXdjc3MuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLm5ld2NzcyIgY29udGV4dD0iY3NzX25ldyIgZW5hYmxlZD0idHJ1ZSI+QENIQVJTRVQgIiR7ZW5jb2Rpbmd9Ijs8L3RlbXBsYXRlPgotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1NWViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbnRlbnRtb2RlbC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJlbWZtb2RlbC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzYXhwYXJzZXIvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXZhbGlkYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmExMzk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotcnVudGltZQotZHRkY29yZS5qYXIKLSouemlwCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1AZG90Ci1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjI0OWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY5YjM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNTYXQgTWFyIDI0IDAyOjE2OjMyIEVEVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzgwOTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTm92IDE1IDAyOjA4OjQ1IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE5ODgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jV2VkIE5vdiAxNSAwMjowODo0NSBFU1QgMjAwNg0KLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MA0KLWNvbXBpbGVycy5wLmJ1aWxkPTANCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MA0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xDQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTANCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE4NjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0LAotIHJvc2UKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMSwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenk7IGV4Y2x1ZGU6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudCIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzMyYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbAotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgY29udGVudG1vZGVsLyxcCi0gICAgICAgICAgIGVtZm1vZGVsLyxcCi0gICAgICAgICAgIHNheHBhcnNlci8sXAotICAgICAgICAgICBzcmMtdmFsaWRhdGlvbi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRjMTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuZHRkIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL2R0ZC9vdmVydmlldy5odG1sIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkRURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudEZhY3RvcnlEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRGYWN0b3J5RFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTY0YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudEZhY3RvcnlEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgYnVpbGRlciBoYW5kbGVzIGJ1aWxkaW5nIC5kdGQgZ3JhbW1hciBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlEVEQgaW1wbGVtZW50cyBDTURvY3VtZW50RmFjdG9yeSB7Ci0JcHVibGljIENNRG9jdW1lbnRGYWN0b3J5RFREKCkgewotCX0KLQotCi0JcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCS8vIHdvcmsgYXJvdW5kIGEgYnVnIGluIG91ciBwYXJzZXJzCi0JCS8vIHRvZG8uLi4gcmV2aXNpdCB0aGlzCi0JCS8vCi0vLwkJaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDQ4MQotLy8JCVN0cmluZyBmaWxlUHJvdG9jb2wgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkCi0vLwkJaWYgKHVyaS5zdGFydHNXaXRoKGZpbGVQcm90b2NvbCkpIHsKLS8vCQkJdXJpID0gdXJpLnN1YnN0cmluZyhmaWxlUHJvdG9jb2wubGVuZ3RoKCkpOwotLy8JCX0KLQotCQlDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBEVERJbXBsLmJ1aWxkQ01Eb2N1bWVudCh1cmkpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiY291bGQgbm90IGNyZWF0ZSBjb250ZW50IG1vZGVsIGZvciBVUkk6ICIgKyB1cmksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTdjNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQ01Ob2RlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OID0gImRvY3VtZW50YXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9TT1VSQ0UgPSAiZG9jdW1lbnRhdGlvblNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFID0gImRvY3VtZW50YXRpb25MYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9NT0ZfTk9USUZJRVIgPSAia2V5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRklOSVRJT05fSU5GTyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbkluZm8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVGSU5JVElPTiA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUik7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvYmplY3QpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EVERJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EVERJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTgwY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRFRESW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERCYXNpY1R5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFRETWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbnRpdHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRGF0YVR5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01FbnRpdHlEZWNsYXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci0KLQotcHVibGljIGNsYXNzIERUREltcGwgewotCXN0YXRpYyB7Ci0JCS8vIENhbGwgaW5pdCBvbiB0aGUgRFREIHBhY2thZ2UgdG8gYXZvaWQgc3RyYW5nZSBpbml0aWFsaXphdGlvbiBidWdzCi0JCS8vCi0JCURURFBhY2thZ2VJbXBsLmluaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIERUREFkYXB0ZXJGYWN0b3J5SW1wbCBkdGRBZGFwdGVyRmFjdG9yeUltcGwgPSBuZXcgRFREQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBDTURhdGFUeXBlSW5mb1RhYmxlIGNtRGF0YVR5cGVJbmZvVGFibGUgPSBuZXcgQ01EYXRhVHlwZUluZm9UYWJsZSgpOwotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGJ1aWxkRFRETW9kZWwodXJpKTsKLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoZHRkRmlsZSk7Ci0JCQotCQlyZXR1cm4gY21Eb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERUREZpbGUgYnVpbGREVERNb2RlbChTdHJpbmcgdXJpKSB7Ci0JCURURFV0aWwgZHRkVXRpbCA9IG5ldyBEVERVdGlsKCk7Ci0JCWR0ZFV0aWwuc2V0ZXhwYW5kRW50aXR5UmVmZXJlbmNlcyh0cnVlKTsKLQkJZHRkVXRpbC5wYXJzZShuZXcgUmVzb3VyY2VTZXRJbXBsKCksIHVyaSk7Ci0JCXJldHVybiBkdGRVdGlsLmdldERUREZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KERUREZpbGUgZHRkRmlsZSkgewotCQlyZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoZHRkRmlsZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTU5vZGUgZ2V0QWRhcHRlcihOb3RpZmllciBvKSB7Ci0JCXJldHVybiAoQ01Ob2RlKSBkdGRBZGFwdGVyRmFjdG9yeUltcGwuYWRhcHQobyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TWluT2NjdXJIZWxwZXIoRFREUmVwZWF0YWJsZUNvbnRlbnQgY29udGVudCkgewotCQlpbnQgb2NjdXJlbmNlID0gY29udGVudC5nZXRPY2N1cnJlbmNlKCkuZ2V0VmFsdWUoKTsKLQkJYm9vbGVhbiBpc09wdGlvbmFsID0gKG9jY3VyZW5jZSA9PSBEVERPY2N1cnJlbmNlVHlwZS5PUFRJT05BTCB8fCBvY2N1cmVuY2UgPT0gRFRET2NjdXJyZW5jZVR5cGUuWkVST19PUl9NT1JFKTsKLQkJcmV0dXJuIGlzT3B0aW9uYWwgPyAwIDogMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRNYXhPY2N1ckhlbHBlcihEVERSZXBlYXRhYmxlQ29udGVudCBjb250ZW50KSB7Ci0JCWludCBvY2N1cmVuY2UgPSBjb250ZW50LmdldE9jY3VycmVuY2UoKS5nZXRWYWx1ZSgpOwotCQlib29sZWFuIGlzTXVsdGkgPSAob2NjdXJlbmNlID09IERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFIHx8IG9jY3VyZW5jZSA9PSBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkUpOwotCQlyZXR1cm4gaXNNdWx0aSA/IC0xIDogMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCQlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFREQXR0cmlidXRlKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBEVERBdHRyaWJ1dGVBZGFwdGVyKChEVERBdHRyaWJ1dGUpIHRhcmdldCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREVsZW1lbnRBZGFwdGVyKChEVERFbGVtZW50KSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRERmlsZUFkYXB0ZXIoKERUREZpbGUpIHRhcmdldCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRER3JvdXBDb250ZW50QWRhcHRlcigoRFRER3JvdXBDb250ZW50KSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERFbnRpdHkpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREVudGl0eUFkYXB0ZXIoKERUREVudGl0eSkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERUREJhc2VBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBEVERCYXNlQWRhcHRlciBleHRlbmRzIENNTm9kZUltcGwgewotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gdHlwZSA9PSBkdGRBZGFwdGVyRmFjdG9yeUltcGw7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkNNRG9jdW1lbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudCgpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OKSkgewotCQkJCXJlc3VsdCA9IGdldERvY3VtZW50YXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPKSkgewotCQkJCXJlc3VsdCA9IGdldERlZmluaXRpb25JbmZvKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT04pKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0RGVmaW5pdGlvbigpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0S2V5KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJzcGVjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGdldFNwZWMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoKTsKLQkJCQkJaWYgKGNtRG9jdW1lbnQgaW5zdGFuY2VvZiBEVERGaWxlQWRhcHRlcikgewotCQkJCQkJQW5ub3RhdGlvbk1hcCBtYXAgPSAoKERUREZpbGVBZGFwdGVyKSBjbURvY3VtZW50KS5hbm5vdGF0aW9uTWFwOwotCQkJCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHNwZWMgPSBnZXRTcGVjKCk7Ci0JCQkJCQkJaWYgKHNwZWMgIT0gbnVsbCkgewotCQkJCQkJCQlyZXN1bHQgPSBtYXAuZ2V0UHJvcGVydHkoZ2V0U3BlYygpLCBwcm9wZXJ0eU5hbWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJCU1hcCBnbG9iYWxQcm9wZXJ0eU1hcCA9ICgoRFRERmlsZUFkYXB0ZXIpIGNtRG9jdW1lbnQpLmdsb2JhbFByb3BlcnR5TWFwOwotCQkJCQkJCXJlc3VsdCA9IGdsb2JhbFByb3BlcnR5TWFwLmdldChwcm9wZXJ0eU5hbWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKSB7Ci0JCQlyZXR1cm4gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYygpIHsKLQkJCXJldHVybiBnZXROb2RlTmFtZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRFREQXR0cmlidXRlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFREQXR0cmlidXRlQWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0JCXByb3RlY3RlZCBEVERBdHRyaWJ1dGUgYXR0cmlidXRlOwotCQlwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLQotCQlwdWJsaWMgRFREQXR0cmlidXRlQWRhcHRlcihEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQl0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLQkJCWRhdGFUeXBlID0gbmV3IERhdGFUeXBlSW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTcGVjKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpICsgIi9AIiArIGF0dHJpYnV0ZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCQlyZXR1cm4gZGF0YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oYXR0cmlidXRlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQkJaW50IHVzYWdlID0gT1BUSU9OQUw7Ci0JCQlzd2l0Y2ggKGF0dHJpYnV0ZS5nZXREZWZhdWx0S2luZCgpLmdldFZhbHVlKCkpIHsKLQkJCQljYXNlIERURERlZmF1bHRLaW5kLlJFUVVJUkVEIDogewotCQkJCQl1c2FnZSA9IFJFUVVJUkVEOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBEVEREZWZhdWx0S2luZC5GSVhFRCA6IHsKLQkJCQkJdXNhZ2UgPSBGSVhFRDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHVzYWdlOwotCQl9Ci0KLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJCURUREZpbGUgZHRkRmlsZSA9IGF0dHJpYnV0ZS5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpOwotCQkJcmV0dXJuIGR0ZEZpbGUgIT0gbnVsbCA/IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBjbGFzcyBEYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlIHsKLQkJCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaXNWYWxpZEVtcHR5VmFsdWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBkYXRhVHlwZU5hbWUgPSBnZXREYXRhVHlwZU5hbWUoKTsKLQkJCQkJcmVzdWx0ID0gKGRhdGFUeXBlTmFtZSA9PSBudWxsIHx8IGRhdGFUeXBlTmFtZS5lcXVhbHMoQ01EYXRhVHlwZS5DREFUQSkpID8gInRydWUiIDogImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkgewotCQkJCXJldHVybiBjbURhdGFUeXBlSW5mb1RhYmxlLmdldERhdGFUeXBlTmFtZShhdHRyaWJ1dGUuZ2V0RFREVHlwZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGNtRGF0YVR5cGVJbmZvVGFibGUuZ2V0SW5zdGFuY2VWYWx1ZShhdHRyaWJ1dGUuZ2V0RFREVHlwZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQkJCWludCByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JCQkJaW50IGRlZmF1bHRWYWx1ZUtpbmQgPSBhdHRyaWJ1dGUuZ2V0RGVmYXVsdEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChkZWZhdWx0VmFsdWVLaW5kID09IERURERlZmF1bHRLaW5kLk5PRklYRUQpIHsKLQkJCQkJcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9ERUZBVUxUOwotCQkJCX0KLQkJCQllbHNlIGlmIChkZWZhdWx0VmFsdWVLaW5kID09IERURERlZmF1bHRLaW5kLkZJWEVEKSB7Ci0JCQkJCXJlc3VsdCA9IElNUExJRURfVkFMVUVfRklYRUQ7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkgewotCQkJCU9iamVjdFtdIG9iamVjdExpc3QgPSBhdHRyaWJ1dGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpLnRvQXJyYXkoKTsKLQkJCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW29iamVjdExpc3QubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdExpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJcmVzdWx0W2ldID0gb2JqZWN0TGlzdFtpXS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBEVERFbGVtZW50QmFzZUFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIERUREVsZW1lbnRCYXNlQWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCQlwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCk7Ci0KLQkJcHJvdGVjdGVkIENNRG9jdW1lbnRhdGlvbiBkb2N1bWVudGF0aW9uID0gbnVsbDsKLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIEVMRU1FTlRfREVDTEFSQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIGdldERUREVsZW1lbnQoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCByZXN1bHQgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQlMaXN0IGF0dHJpYnV0ZUxpc3QgPSBnZXREVERFbGVtZW50KCkuZ2V0RFREQXR0cmlidXRlKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCURUREF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkJCQlyZXN1bHQuZ2V0SGFzaHRhYmxlKCkucHV0KGF0dHJpYnV0ZS5nZXROYW1lKCksIGdldEFkYXB0ZXIoYXR0cmlidXRlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQkJcmV0dXJuIChDTUNvbnRlbnQpIGdldEFkYXB0ZXIoZ2V0RFRERWxlbWVudCgpLmdldENvbnRlbnQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQkJLy8gdG9kbwotCQkJaW50IHJlc3VsdCA9IEVMRU1FTlQ7Ci0JCQlEVERFbGVtZW50Q29udGVudCBkdGRFbGVtZW50Q29udGVudCA9IGdldERUREVsZW1lbnQoKS5nZXRDb250ZW50KCk7Ci0JCQlpZiAoZHRkRWxlbWVudENvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50KSB7Ci0JCQkJcmVzdWx0ID0gUENEQVRBOwotCQkJfQotCQkJZWxzZSBpZiAoZHRkRWxlbWVudENvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQlEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gKERUREdyb3VwQ29udGVudCkgZHRkRWxlbWVudENvbnRlbnQ7Ci0JCQkJaW50IGdyb3VwS2luZCA9IGdyb3VwQ29udGVudC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChncm91cEtpbmQgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSkgewotCQkJCQlMaXN0IGxpc3QgPSBncm91cENvbnRlbnQuZ2V0Q29udGVudCgpOwotCQkJCQlpZiAobGlzdC5zaXplKCkgPiAwICYmIGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJCQkJcmVzdWx0ID0gTUlYRUQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRFbGVtZW50Q29udGVudCBpbnN0YW5jZW9mIERUREFueUNvbnRlbnQpIHsKLQkJCQlyZXN1bHQgPSBBTlk7Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRFbGVtZW50Q29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJCXJlc3VsdCA9IEVNUFRZOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBnZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCQlpbnQgY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJYm9vbGVhbiBoYXNEYXRhVHlwZSA9IGNvbnRlbnRUeXBlID09IFBDREFUQSB8fCBjb250ZW50VHlwZSA9PSBNSVhFRDsKLQkJCXJldHVybiBoYXNEYXRhVHlwZSA/IGRhdGFUeXBlIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIENNTmFtZWROb2RlTWFwSW1wbC5FTVBUWV9OQU1FRF9OT0RFX01BUDsKLQkJfQotCi0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCQlEVERGaWxlIGR0ZEZpbGUgPSBnZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpOwotCQkJcmV0dXJuIGR0ZEZpbGUgIT0gbnVsbCA/IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpIDogbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKSB7Ci0JCQlDTU5vZGVMaXN0SW1wbCBub2RlTGlzdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQkJaWYgKGRvY3VtZW50YXRpb24gPT0gbnVsbCkgewotCQkJCVN0cmluZyBjb21tZW50ID0gZ2V0RFRERWxlbWVudCgpLmdldENvbW1lbnQoKTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29tbWVudCwgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJdmFsdWUgKz0gc3QubmV4dFRva2VuKCkudHJpbSgpICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWRvY3VtZW50YXRpb24gPSBuZXcgQ01Eb2N1bWVudGF0aW9uSW1wbCh2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRvY3VtZW50YXRpb24gIT0gbnVsbCkgewotCQkJCW5vZGVMaXN0LmdldExpc3QoKS5hZGQoZG9jdW1lbnRhdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ01Eb2N1bWVudGF0aW9uSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRhdGlvbiB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLQkJcHVibGljIENNRG9jdW1lbnRhdGlvbkltcGwoU3RyaW5nIHZhbHVlKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIERPQ1VNRU5UQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREVsZW1lbnRBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERFbGVtZW50QWRhcHRlciBleHRlbmRzIERUREVsZW1lbnRCYXNlQWRhcHRlciB7Ci0JCXByb3RlY3RlZCBEVERFbGVtZW50IGVsZW1lbnQ7Ci0KLQkJcHVibGljIERUREVsZW1lbnRBZGFwdGVyKERUREVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJCWRhdGFUeXBlID0gbmV3IENNRGF0YVR5cGVJbXBsKCIjUENEQVRBIiwgZ2V0RFRERWxlbWVudCgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkgewotCQkJcmV0dXJuICJnbG9iYWwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIgZXh0ZW5kcyBEVERFbGVtZW50QmFzZUFkYXB0ZXIgewotCQlwcm90ZWN0ZWQgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY29udGVudDsKLQotCQlwdWJsaWMgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGNvbnRlbnQpIHsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCQlkYXRhVHlwZSA9IG5ldyBDTURhdGFUeXBlSW1wbCgiI1BDREFUQSIsIGdldERUREVsZW1lbnQoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0KLQkJcHJvdGVjdGVkIERUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpIHsKLQkJCXJldHVybiBjb250ZW50LmdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQkJcmV0dXJuIGdldE1pbk9jY3VySGVscGVyKGNvbnRlbnQpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJCXJldHVybiBnZXRNYXhPY2N1ckhlbHBlcihjb250ZW50KTsKLQkJfQotCi0KLQkJcHVibGljIENNTm9kZSBnZXREZWZpbml0aW9uKCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoZ2V0RFRERWxlbWVudCgpKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRERW50aXR5QWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRERW50aXR5QWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbnRpdHlEZWNsYXJhdGlvbiB7Ci0JCXByb3RlY3RlZCBEVERFbnRpdHkgZHRkRW50aXR5OwotCi0JCXB1YmxpYyBEVERFbnRpdHlBZGFwdGVyKERUREVudGl0eSBkdGRFbnRpdHkpIHsKLQkJCXRoaXMuZHRkRW50aXR5ID0gZHRkRW50aXR5OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBFTlRJVFlfREVDTEFSQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBkdGRFbnRpdHk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZHRkRW50aXR5LmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGR0ZEVudGl0eS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBEVERJbnRlcm5hbEVudGl0eSkgewotCQkJCURUREludGVybmFsRW50aXR5IGNvbnRlbnQgPSAoRFRESW50ZXJuYWxFbnRpdHkpIGR0ZEVudGl0eS5nZXRDb250ZW50KCk7Ci0JCQkJdmFsdWUgPSBjb250ZW50LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREdyb3VwQ29udGVudEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREdyb3VwQ29udGVudEFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNR3JvdXAgewotCQlwcm90ZWN0ZWQgRFRER3JvdXBDb250ZW50IGNvbnRlbnQ7Ci0KLQkJcHVibGljIERUREdyb3VwQ29udGVudEFkYXB0ZXIoRFRER3JvdXBDb250ZW50IGNvbnRlbnQpIHsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBHUk9VUDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQkJCXJldHVybiBkZXNjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCQlMaXN0IGxpc3QgPSBjb250ZW50LmdldENvbnRlbnQoKTsKLQkJCUNNTm9kZUxpc3RJbXBsIHJlc3VsdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlDTU5vZGUgbm9kZSA9IGdldEFkYXB0ZXIoKE5vdGlmaWVyKSBpLm5leHQoKSk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQuZ2V0TGlzdCgpLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQotCQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQkJcmV0dXJuIGdldE1heE9jY3VySGVscGVyKGNvbnRlbnQpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJCXJldHVybiBnZXRNaW5PY2N1ckhlbHBlcihjb250ZW50KTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7Ci0JCQkvLyB0b2RvLi4uIGhhbmRsZSBBTE9ORSBjYXNlIGJ5IGNoZWNraWcgaWYgY2hpbGQgY291bnQgPT0gMQotCQkJaW50IGdyb3VwS2luZCA9IGNvbnRlbnQuZ2V0R3JvdXBLaW5kKCkuZ2V0VmFsdWUoKTsKLQkJCXJldHVybiAoZ3JvdXBLaW5kID09IERUREdyb3VwS2luZC5DSE9JQ0UpID8gQ0hPSUNFIDogU0VRVUVOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEVERGaWxlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRERmlsZUFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnQgewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERFRkFVTFRfUk9PVF9OQU1FID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZhdWx0Um9vdE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQkJcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBuYW1lZE5vZGVNYXA7Ci0JCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgZW50aXR5Tm9kZU1hcDsKLQotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwID0gbmV3IEFubm90YXRpb25NYXAoKTsKLQkJcHJvdGVjdGVkIE1hcCBnbG9iYWxQcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHVibGljIERUREZpbGVBZGFwdGVyKERUREZpbGUgZHRkRmlsZSkgewotCQkJdGhpcy5kdGRGaWxlID0gZHRkRmlsZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGR0ZEZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbk1hcCBnZXRBbm5vdGF0aW9uTWFwKCkgewotCQkJcmV0dXJuIGFubm90YXRpb25NYXA7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCQlpZiAobmFtZWROb2RlTWFwID09IG51bGwpIHsKLQkJCQluYW1lZE5vZGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCURUREVsZW1lbnQgZHRkRWxlbWVudCA9IChEVERFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCW5hbWVkTm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoZHRkRWxlbWVudC5nZXROYW1lKCksIGdldEFkYXB0ZXIoZHRkRWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuYW1lZE5vZGVNYXA7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCQlpZiAoZW50aXR5Tm9kZU1hcCA9PSBudWxsKSB7Ci0JCQkJZW50aXR5Tm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkJCS8vIGFkZCB0aGUgYnVpbHQgaW4gZW50aXR5IGRlY2xhcmF0aW9ucwotCQkJCS8vCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImFtcCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYW1wIiwgIiYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImx0IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJsdCIsICI8IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJndCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiZ3QiLCAiPiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgicXVvdCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgicXVvdCIsICJcIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiYXBvcyIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYXBvcyIsICInIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQkJZm9yIChJdGVyYXRvciBpID0gZHRkRmlsZS5saXN0RFRERW50aXR5KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCURUREVudGl0eSBkdGRFbnRpdHkgPSAoRFRERW50aXR5KSBpLm5leHQoKTsKLQkJCQkJaWYgKCFkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBkdGRFbnRpdHkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJCS8vIGZvciBub3cuLi4ganVzdCBoYW5kbGUgRFRESW50ZXJuYWxFbnRpdHkKLQkJCQkJCS8vCi0JCQkJCQlpZiAoZHRkRW50aXR5LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIERUREludGVybmFsRW50aXR5KSB7Ci0JCQkJCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoZHRkRW50aXR5LmdldE5hbWUoKSwgZ2V0QWRhcHRlcihkdGRFbnRpdHkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBlbnRpdHlOb2RlTWFwOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBET0NVTUVOVDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gZHRkRmlsZS5nZXROYW1lKCkgKyAiLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX1JPT1RfTkFNRSkpIHsKLQkJCQlEVERNZXRyaWNzIG1ldHJpY3MgPSBuZXcgRFRETWV0cmljcyhkdGRGaWxlKTsKLQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBtZXRyaWNzLmdldExlYXN0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJCQlpZiAoZHRkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGR0ZEVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImFubm90YXRpb25NYXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gYW5ub3RhdGlvbk1hcDsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImdsb2JhbFByb3BlcnR5TWFwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGdsb2JhbFByb3BlcnR5TWFwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ01EYXRhVHlwZUluZm9UYWJsZSB7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBpbnN0YW5jZVZhbHVlVGFibGU7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBkYXRhVHlwZU5hbWVUYWJsZTsKLQotCQlwdWJsaWMgQ01EYXRhVHlwZUluZm9UYWJsZSgpIHsKLQkJCS8vIGhhc2h0YWJsZS5wdXQoRFREVHlwZS5DREFUQSwgbnVsbCkpOwotCQkJaW5zdGFuY2VWYWx1ZVRhYmxlID0gbmV3IFN0cmluZ1tEVERCYXNpY1R5cGVJbXBsLmJhc2ljVHlwZUtpbmRzLmxlbmd0aF07Ci0JCQlpbnN0YW5jZVZhbHVlVGFibGVbRFREQmFzaWNUeXBlS2luZC5FTlRJVFldID0gImVudGl0eSI7IC8vJE5PTi1OTFMtMSQKLQkJCWluc3RhbmNlVmFsdWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTXSA9ICJlbnRpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJCWluc3RhbmNlVmFsdWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5dID0gIm5tdG9rZW4iOyAvLyROT04tTkxTLTEkCi0JCQlpbnN0YW5jZVZhbHVlVGFibGVbRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU10gPSAibm10b2tlbnMiOyAvLyROT04tTkxTLTEkCi0KLQkJCWRhdGFUeXBlTmFtZVRhYmxlID0gbmV3IFN0cmluZ1tEVERCYXNpY1R5cGVJbXBsLmJhc2ljVHlwZUtpbmRzLmxlbmd0aF07Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkNEQVRBXSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLklEXSA9IENNRGF0YVR5cGUuSUQ7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLklEUkVGXSA9IENNRGF0YVR5cGUuSURSRUY7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkVOVElUWV0gPSBDTURhdGFUeXBlLkVOVElUWTsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuRU5USVRJRVNdID0gQ01EYXRhVHlwZS5FTlRJVElFUzsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl0gPSBDTURhdGFUeXBlLk5NVE9LRU47Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5TXSA9IENNRGF0YVR5cGUuTk1UT0tFTlM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlVmFsdWUoRFREVHlwZSBkdGRUeXBlKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChkdGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKSB7Ci0JCQkJaW50IGtpbmQgPSAoKERUREJhc2ljVHlwZSkgZHRkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGtpbmQgPj0gMCAmJiBraW5kIDwgRFREQmFzaWNUeXBlSW1wbC5iYXNpY1R5cGVEZXNjcmlwdGlvbnMubGVuZ3RoKSB7Ci0JCQkJCXJlc3VsdCA9IGluc3RhbmNlVmFsdWVUYWJsZVtraW5kXTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoRFREVHlwZSBkdGRUeXBlKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChkdGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKSB7Ci0JCQkJaW50IGtpbmQgPSAoKERUREJhc2ljVHlwZSkgZHRkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGtpbmQgPj0gMCAmJiBraW5kIDwgRFREQmFzaWNUeXBlSW1wbC5iYXNpY1R5cGVEZXNjcmlwdGlvbnMubGVuZ3RoKSB7Ci0JCQkJCXJlc3VsdCA9IGRhdGFUeXBlTmFtZVRhYmxlW2tpbmRdOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGR0ZFR5cGUgaW5zdGFuY2VvZiBEVERFbnVtZXJhdGlvblR5cGUpIHsKLQkJCQlyZXN1bHQgPSBDTURhdGFUeXBlLkVOVU07Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBbnlDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREFueUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxM2JmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREFueUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QW55IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBbnlDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREFueUNvbnRlbnQgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudCB7Ci19IC8vIERUREFueUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQXR0cmlidXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTk4NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0VmFsdWVTdHJpbmcgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREF0dHJpYnV0ZSBleHRlbmRzIEVBdHRyaWJ1dGUsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQkvLyBOT04tR0VOIGludGVyZmFjZXMgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQKLQotCXB1YmxpYyBEVERUeXBlIGdldERURFR5cGUoKTsKLQotCXB1YmxpYyB2b2lkIHNldERURFR5cGUoRFREVHlwZSB0eXBlKTsKLQotCXB1YmxpYyB2b2lkIHNldERUREJhc2ljVHlwZShpbnQgdmFsdWUpOwotCi0JcHVibGljIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvbihTdHJpbmdbXSBlbnVtVmFsdWVzLCBpbnQgZW51bUtpbmQpOwotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9Db21tZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEtpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZAotCSAqIEBzZWUgI3NldERlZmF1bHRLaW5kKERURERlZmF1bHRLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9EZWZhdWx0S2luZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURERlZmF1bHRLaW5kIGdldERlZmF1bHRLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kCi0JICogQHNlZSAjZ2V0RGVmYXVsdEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRLaW5kKERURERlZmF1bHRLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdFZhbHVlU3RyaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfRGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+JwotCSAqICAgICAgICAgICAgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRWYWx1ZVN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFZhbHVlU3RyaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqIHJlZmVyZW5jZSBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uCi0JICogaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYXR0cmlidXRlVHlwZVJlZmVyZW5jZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXREVERBdHRyaWJ1dGUgPGVtPkRURCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZQotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREVsZW1lbnQoRFRERWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0RFREQXR0cmlidXRlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJEVERBdHRyaWJ1dGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREVsZW1lbnQoRFRERWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gRFREQXR0cmlidXRlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwMzI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2ljIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREJhc2ljVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERCYXNpY1R5cGUgZXh0ZW5kcyBFQ2xhc3MsIERURFR5cGUgewotCS8vIE5PTi1HRU4gaW50ZXJmYWNlcyBEVERUeXBlCi0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlLiBUaGUKLQkgKiBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLCB0aGVyZQotCSAqIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQKLQkgKiBAc2VlICNzZXRLaW5kKERUREJhc2ljVHlwZUtpbmQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQmFzaWNUeXBlX0tpbmQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERCYXNpY1R5cGVLaW5kIGdldEtpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLaW5kKERUREJhc2ljVHlwZUtpbmQgdmFsdWUpOwotfSAvLyBEVERCYXNpY1R5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlS2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGVLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZmU5Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGVLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+QmFzaWMgVHlwZSBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQmFzaWNUeXBlS2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUREJhc2ljVHlwZUtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9ORV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DREFUQTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNDREFUQV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0RBVEEgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEUkVGPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lEUkVGX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRFJFRiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRFJFRlM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSURSRUZTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRFJFRlMgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RU5USVRZPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0VOVElUWV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVOVElUSUVTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0VOVElUSUVTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVElFUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OTVRPS0VOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05NVE9LRU5fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5NVE9LRU4gPSA3OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk1UT0tFTlM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk1UT0tFTlNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5NVE9LRU5TID0gODsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT05FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIE5PTkVfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKE5PTkUsICJOT05FIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNEQVRBPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0RBVEE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQ0RBVEEKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgQ0RBVEFfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKENEQVRBLCAiQ0RBVEEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgSURfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKElELCAiSUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SURSRUY8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JRFJFRjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRFJFRgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBJRFJFRl9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoSURSRUYsICJJRFJFRiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRFJFRlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JRFJFRlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSURSRUZTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIElEUkVGU19MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoSURSRUZTLCAiSURSRUZTIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVOVElUWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVOVElUWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNFTlRJVFkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgRU5USVRZX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChFTlRJVFksICJFTlRJVFkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RU5USVRJRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FTlRJVElFUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNFTlRJVElFUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBFTlRJVElFU19MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoRU5USVRJRVMsICJFTlRJVElFUyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OTVRPS0VOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk1UT0tFTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOTVRPS0VOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIE5NVE9LRU5fTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKE5NVE9LRU4sICJOTVRPS0VOIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5NVE9LRU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk1UT0tFTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk1UT0tFTlMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgTk1UT0tFTlNfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKE5NVE9LRU5TLCAiTk1UT0tFTlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkJhc2ljIFR5cGUgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmRbXSBWQUxVRVNfQVJSQVkgPSBuZXcgRFREQmFzaWNUeXBlS2luZFtde05PTkVfTElURVJBTCwgQ0RBVEFfTElURVJBTCwgSURfTElURVJBTCwgSURSRUZfTElURVJBTCwgSURSRUZTX0xJVEVSQUwsIEVOVElUWV9MSVRFUkFMLCBFTlRJVElFU19MSVRFUkFMLCBOTVRPS0VOX0xJVEVSQUwsIE5NVE9LRU5TX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5CYXNpYyBUeXBlIEtpbmQ8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5CYXNpYyBUeXBlIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREQmFzaWNUeXBlS2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURUREJhc2ljVHlwZUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5CYXNpYyBUeXBlIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREJhc2ljVHlwZUtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5PTkUgOgotCQkJCXJldHVybiBOT05FX0xJVEVSQUw7Ci0JCQljYXNlIENEQVRBIDoKLQkJCQlyZXR1cm4gQ0RBVEFfTElURVJBTDsKLQkJCWNhc2UgSUQgOgotCQkJCXJldHVybiBJRF9MSVRFUkFMOwotCQkJY2FzZSBJRFJFRiA6Ci0JCQkJcmV0dXJuIElEUkVGX0xJVEVSQUw7Ci0JCQljYXNlIElEUkVGUyA6Ci0JCQkJcmV0dXJuIElEUkVGU19MSVRFUkFMOwotCQkJY2FzZSBFTlRJVFkgOgotCQkJCXJldHVybiBFTlRJVFlfTElURVJBTDsKLQkJCWNhc2UgRU5USVRJRVMgOgotCQkJCXJldHVybiBFTlRJVElFU19MSVRFUkFMOwotCQkJY2FzZSBOTVRPS0VOIDoKLQkJCQlyZXR1cm4gTk1UT0tFTl9MSVRFUkFMOwotCQkJY2FzZSBOTVRPS0VOUyA6Ci0JCQkJcmV0dXJuIE5NVE9LRU5TX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERUREJhc2ljVHlwZUtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERUREJhc2ljVHlwZUtpbmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjNmYjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgY2xhc3MgRFREQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERfRVJST1JfTElORV9QUkVGSVggPSAiPCEtLUVSUk9SICI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERfRVJST1JfTElORV9TVUZGSVggPSAiIC0tPiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfRVhURU5TSU9OID0gImR0ZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRVhURU5TSU9OID0gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUlfRVhURU5TSU9OID0gInhtaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfWE1JX0VYVEVOU0lPTiA9ICJkdGQueG1pIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2Njc1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURENvbnRlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURENvbnRlbnQgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudCA8ZW0+RFREIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEZpbGU8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RFRERmlsZShEVERGaWxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURENvbnRlbnRfRFRERmlsZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iRFREQ29udGVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmlsZSBnZXREVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSk7Ci0KLX0gLy8gRFREQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEREZWZhdWx0S2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEREZWZhdWx0S2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTU3YzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERGVmYXVsdEtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEREZWZhdWx0S2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERURERlZmF1bHRLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTVBMSUVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lNUExJRURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUExJRUQgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVRVUlSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjUkVRVUlSRURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0ZJWEVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVhFRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT0ZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PRklYRURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PRklYRUQgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU1QTElFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklNUExJRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSU1QTElFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmQgSU1QTElFRF9MSVRFUkFMID0gbmV3IERURERlZmF1bHRLaW5kKElNUExJRUQsICJJTVBMSUVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFUVVJUkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVRVUlSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjUkVRVUlSRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kIFJFUVVJUkVEX0xJVEVSQUwgPSBuZXcgRFRERGVmYXVsdEtpbmQoUkVRVUlSRUQsICJSRVFVSVJFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0ZJWEVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZCBGSVhFRF9MSVRFUkFMID0gbmV3IERURERlZmF1bHRLaW5kKEZJWEVELCAiRklYRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PRklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9GSVhFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmQgTk9GSVhFRF9MSVRFUkFMID0gbmV3IERURERlZmF1bHRLaW5kKE5PRklYRUQsICJOT0ZJWEVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZFtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVEREZWZhdWx0S2luZFtde0lNUExJRURfTElURVJBTCwgUkVRVUlSRURfTElURVJBTCwgRklYRURfTElURVJBTCwgTk9GSVhFRF9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURERlZmF1bHRLaW5kIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRFRERGVmYXVsdEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURERlZmF1bHRLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBJTVBMSUVEIDoKLQkJCQlyZXR1cm4gSU1QTElFRF9MSVRFUkFMOwotCQkJY2FzZSBSRVFVSVJFRCA6Ci0JCQkJcmV0dXJuIFJFUVVJUkVEX0xJVEVSQUw7Ci0JCQljYXNlIEZJWEVEIDoKLQkJCQlyZXR1cm4gRklYRURfTElURVJBTDsKLQkJCWNhc2UgTk9GSVhFRCA6Ci0JCQkJcmV0dXJuIE5PRklYRURfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFRERGVmYXVsdEtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERURERlZmF1bHRLaW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODEwOTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldERUREF0dHJpYnV0ZSA8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVsZW1lbnQgZXh0ZW5kcyBFQ2xhc3MsIERURENvbnRlbnQsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQotCXB1YmxpYyB2b2lkIGFkZERUREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgYXR0cmlidXRlKTsKLQotCS8vIHJldHVybnMgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIHNhbWUgRFRERmlsZSB0aGF0IHJlZmVyZW5jZSB0aGlzIGVsZW1lbnQKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWZlcmVuY2VzKCk7Ci0KLQkvLyByZXR1cm4gYSBicmllZiBzdHJpbmcgbGlzdGluZyB0aGUgYXR0cmlidXRlcwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlRGV0YWlsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRfQ29tbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udGVudChEVERFbGVtZW50Q29udGVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50X0NvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJlbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnRDb250ZW50IGdldENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250ZW50KERUREVsZW1lbnRDb250ZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBBdHRyaWJ1dGU8L2I+PC9lbT4nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlCi0JICoge0BsaW5rIERUREF0dHJpYnV0ZX0uIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQgPGVtPkRURCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEKLQkgKiBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQKLQkgKiAgICAgICAgIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRfRFREQXR0cmlidXRlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQKLQkgKiBAbW9kZWwgdHlwZT0iRFREQXR0cmlidXRlIiBvcHBvc2l0ZT0iRFRERWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERUREF0dHJpYnV0ZSgpOwotCi19IC8vIERUREVsZW1lbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudENvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczNmFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50Q29udGVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERWxlbWVudENvbnRlbnQgZXh0ZW5kcyBFT2JqZWN0LCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0KLQkvLyBmb3Igc2hvd2luZyBuYW1lcyB0byBiZSB1c2VkIGluIHRoZSB0cmVlCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpOwotCi0JLy8gZm9yIHNob3dpbmcgaXRlbXMgaW4gdGhlIHRhYmxlCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50RGV0YWlsKCk7Ci0KLQlwdWJsaWMgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCk7Ci0KLQkvLyBnZXQgdGhlIG1vc3Qgb3V0ZXIgRFRER3JvdXBDb250ZW50Ci0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXREVERHcm91cENvbnRlbnQoKTsKLQotCS8vIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgY29udGVudCBpcyB0aGUgZmlyc3QKLQkvLyBpbiB0aGUgZWxlbWVudAotCS8vIGVnIDwhRUxFTUVOVCBibGFoIGZpcnN0RWxlbWVudD4KLQkvLyA8IUVMRU1FTlQgYmxhaCAoKGZpcnN0RWxlbWVudCwgc2Vjb25kRWxlbWVudCkgfCBsYXN0RWxlbWVudCkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R3JvdXAoRFRER3JvdXBDb250ZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRlbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREdyb3VwQ29udGVudCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHcm91cChEVERHcm91cENvbnRlbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RWxlbWVudChEVERFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRDb250ZW50X0VsZW1lbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRlbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoRFRERWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gRFRERWxlbWVudENvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRlMWJiZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCNnZXRSZWZlcmVuY2VkRWxlbWVudCA8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGV4dGVuZHMgRFREUmVwZWF0YWJsZUNvbnRlbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgRWxlbWVudDwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlZEVsZW1lbnQoRFRERWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50IGdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50I2dldFJlZmVyZW5jZWRFbGVtZW50IDxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZWRFbGVtZW50KERUREVsZW1lbnQgdmFsdWUpOwotCi19IC8vIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVtcHR5Q29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbXB0eUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyNjgyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVtcHR5Q29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbXB0eSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW1wdHlDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVtcHR5Q29udGVudCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50IHsKLX0gLy8gRFRERW1wdHlDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YjQ1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2lzUGFyYW1ldGVyRW50aXR5IDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERW50aXR5IGV4dGVuZHMgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgRW50aXR5PC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmFtZXRlckVudGl0eShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNpc1BhcmFtZXRlckVudGl0eSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT4nCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNQYXJhbWV0ZXJFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmFtZXRlckVudGl0eShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5IDxlbT5EVEQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udGVudChEVERFbnRpdHlDb250ZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9Db250ZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IkRUREVudGl0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHlDb250ZW50IGdldENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudAotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRlbnQoRFRERW50aXR5Q29udGVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJtIEVudGl0eSBSZWY8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPicgcmVmZXJlbmNlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJtRW50aXR5UmVmKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImVudGl0eSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBnZXRQYXJtRW50aXR5UmVmKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFybUVudGl0eVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFybUVudGl0eVJlZihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUKLQkgKiB7QGxpbmsgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudH0uIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cwotCSAqIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IDxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZQotCSAqICAgICAgICAgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IgotCSAqICAgICAgICBvcHBvc2l0ZT0iZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVudGl0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFREQXR0cmlidXRlfS4gSXQKLQkgKiBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJEVERBdHRyaWJ1dGUiIG9wcG9zaXRlPSJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFREQXR0cmlidXRlfS4gSXQKLQkgKiBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJEVERBdHRyaWJ1dGUiIG9wcG9zaXRlPSJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpOwotCi19IC8vIERUREVudGl0eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2MjZjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5IDxlbT5EVEQgRW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eUNvbnRlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVudGl0eUNvbnRlbnQgZXh0ZW5kcyBFT2JqZWN0LCBEVERPYmplY3QgewotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRW50aXR5PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEVudGl0eTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVudGl0eTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREVudGl0eShEVERFbnRpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5Q29udGVudF9EVERFbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldERUREVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eSA8ZW0+RFREIEVudGl0eTwvZW0+fScKLQkgKiBjb250YWluZXIgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVudGl0eTwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi19IC8vIERUREVudGl0eUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Yjk3ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGV4dGVuZHMgRFREUmVwZWF0YWJsZUNvbnRlbnQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogcmVmZXJlbmNlIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50X0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZW50aXR5UmVmZXJlbmNlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi19IC8vIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtR3JvdXBLaW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1Hcm91cEtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwM2RjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1Hcm91cEtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnVtR3JvdXBLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERW51bUdyb3VwS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+TkFNRSBUT0tFTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOQU1FX1RPS0VOX0dST1VQX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX1RPS0VOX0dST1VQID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PVEFUSU9OIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PVEFUSU9OX0dST1VQX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTl9HUk9VUCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OQU1FIFRPS0VOIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TkFNRSBUT0tFTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbAotCSAqIG9iamVjdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05BTUVfVE9LRU5fR1JPVVAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREVudW1Hcm91cEtpbmQgTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMID0gbmV3IERUREVudW1Hcm91cEtpbmQoTkFNRV9UT0tFTl9HUk9VUCwgIk5BTUVfVE9LRU5fR1JPVVAiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UQVRJT04gR1JPVVA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT1RBVElPTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT1RBVElPTl9HUk9VUAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERW51bUdyb3VwS2luZCBOT1RBVElPTl9HUk9VUF9MSVRFUkFMID0gbmV3IERUREVudW1Hcm91cEtpbmQoTk9UQVRJT05fR1JPVVAsICJOT1RBVElPTl9HUk9VUCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRERW51bUdyb3VwS2luZFtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVERFbnVtR3JvdXBLaW5kW117TkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMLCBOT1RBVElPTl9HUk9VUF9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREVudW1Hcm91cEtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEVERFbnVtR3JvdXBLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERFbnVtR3JvdXBLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOQU1FX1RPS0VOX0dST1VQIDoKLQkJCQlyZXR1cm4gTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMOwotCQkJY2FzZSBOT1RBVElPTl9HUk9VUCA6Ci0JCQkJcmV0dXJuIE5PVEFUSU9OX0dST1VQX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERUREVudW1Hcm91cEtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERUREVudW1Hcm91cEtpbmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bWVyYXRpb25UeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1lcmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTAxYjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bWVyYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudW1lcmF0aW9uIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVudW1lcmF0aW9uVHlwZSBleHRlbmRzIEVFbnVtLCBEVERUeXBlIHsKLQotCXB1YmxpYyBFTGlzdCBnZXRFbnVtTGl0ZXJhbHMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gVGhlCi0JICogbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwgdGhlcmUKLQkgKiByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kCi0JICogQHNlZSAjc2V0S2luZChEVERFbnVtR3JvdXBLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudW1lcmF0aW9uVHlwZV9LaW5kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW51bUdyb3VwS2luZCBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2luZChEVERFbnVtR3JvdXBLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERFbnVtZXJhdGlvblR5cGUgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREZpbGUoRFRERmlsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJEVERFbnVtZXJhdGlvblR5cGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZpbGUgZ2V0RFRERmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSk7Ci0KLX0gLy8gRFRERW51bWVyYXRpb25UeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVycm9yTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFcnJvck1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzZTljNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVycm9yTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotcHVibGljIGNsYXNzIERUREVycm9yTWVzc2FnZSB7Ci0JcHVibGljIFN0cmluZyBlcnJvcktleTsKLQlwdWJsaWMgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQlwdWJsaWMgU3RyaW5nIGxpbmVObzsKLQlwdWJsaWMgU3RyaW5nIGNoYXJPZmZTZXQ7Ci0JcHVibGljIFN0cmluZyBkZWNsYXJhdGlvblR5cGU7Ci0JcHVibGljIFN0cmluZyBkZWNsYXJhdGlvbk5hbWU7Ci0JcHVibGljIFN0cmluZyBzb3VyY2VMaW5lOwotCi0KLQlwdWJsaWMgRFRERXJyb3JNZXNzYWdlKFN0cmluZyBkZWNsYXJhdGlvblR5cGUsIFN0cmluZyBkZWNsYXJhdGlvbk5hbWUsIFN0cmluZyBsaW5lTm8sIFN0cmluZyBjaGFyT2ZmU2V0LCBTdHJpbmcgZXJyb3JLZXksIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJdGhpcyhkZWNsYXJhdGlvblR5cGUsIGRlY2xhcmF0aW9uTmFtZSwgbGluZU5vLCBjaGFyT2ZmU2V0LCBlcnJvcktleSwgZXJyb3JNZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRFRERXJyb3JNZXNzYWdlKFN0cmluZyBkZWNsYXJhdGlvblR5cGUsIFN0cmluZyBkZWNsYXJhdGlvbk5hbWUsIFN0cmluZyBsaW5lTm8sIFN0cmluZyBjaGFyT2ZmU2V0LCBTdHJpbmcgZXJyb3JLZXksIFN0cmluZyBlcnJvck1lc3NhZ2UsIFN0cmluZyBzcmNMaW5lKSB7Ci0JCXRoaXMuZGVjbGFyYXRpb25UeXBlID0gZGVjbGFyYXRpb25UeXBlOwotCQl0aGlzLmRlY2xhcmF0aW9uTmFtZSA9IGRlY2xhcmF0aW9uTmFtZTsKLQkJdGhpcy5saW5lTm8gPSBsaW5lTm87Ci0JCXRoaXMuY2hhck9mZlNldCA9IGNoYXJPZmZTZXQ7Ci0JCXRoaXMuZXJyb3JLZXkgPSBlcnJvcktleTsKLQkJdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JCXRoaXMuc291cmNlTGluZSA9IHNyY0xpbmU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIoIiArIGRlY2xhcmF0aW9uVHlwZSArICI6IiArIGRlY2xhcmF0aW9uTmFtZSArICIpICIgKyBsaW5lTm8gKyAiOiIgKyBjaGFyT2ZmU2V0ICsgIiAiICsgZXJyb3JNZXNzYWdlOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0b1N0cmluZ0dlbigpIHsKLQotCQlyZXR1cm4gIigiICsgZGVjbGFyYXRpb25UeXBlICsgIjoiICsgZGVjbGFyYXRpb25OYW1lICsgIikgIiArIGxpbmVObyArICI6IiArIGNoYXJPZmZTZXQgKyAiICIgKyBlcnJvck1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkZTM2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgYW4gSURvbWFpbk1vZGVsIHRvIGF1Z21lbnQKLSAqIGdldEVsZW1lbnRQcm9wZXJ0eSBmb3IgYW55IERURCBvYmplY3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERXh0ZW5kZXIgewotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KERURE9iamVjdCBkdGRPYmplY3QsIE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlcm5hbEVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlcm5hbEVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjhiMzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZXJuYWxFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlcm5hbCBFbnRpdHk8L2I+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+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoRFRERmlsZSB2YWx1ZSk7Ci0KLX0gLy8gRFRERXh0ZXJuYWxFbnRpdHkKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyNzc3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgcHJvdmlkZXMgYQotICogY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYwotICogLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Hcm91cCBDb250ZW50PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JvdXAgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRER3JvdXBDb250ZW50IGNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdHRyaWJ1dGU8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdHRyaWJ1dGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREF0dHJpYnV0ZSBjcmVhdGVEVERBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnQgY3JlYXRlRFRERWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbXB0eSBDb250ZW50PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW1wdHkgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW1wdHlDb250ZW50IGNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BbnkgQ29udGVudDwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFueSBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERBbnlDb250ZW50IGNyZWF0ZURUREFueUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERQQ0RhdGFDb250ZW50IGNyZWF0ZURURFBDRGF0YUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZpbGU8L2VtPicuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GaWxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERGaWxlIGNyZWF0ZURUREZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzaWMgVHlwZTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2ljIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREJhc2ljVHlwZSBjcmVhdGVEVERCYXNpY1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Tm90YXRpb248L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRETm90YXRpb24gY3JlYXRlRFRETm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50aXR5PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgY3JlYXRlRFRERW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERXh0ZXJuYWxFbnRpdHkgY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERJbnRlcm5hbEVudGl0eSBjcmVhdGVEVERJbnRlcm5hbEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERQYWNrYWdlIGdldERURFBhY2thZ2UoKTsKLQotfSAvLyBEVERGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFlMjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2lzUGFyc2VFcnJvciA8ZW0+UGFyc2UgRXJyb3I8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudCA8ZW0+RFREIENvbnRlbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREZpbGUgZXh0ZW5kcyBFTmFtZWRFbGVtZW50LCBEVERPYmplY3QgewotCi0JcHVibGljIEVMaXN0IGdldERURE9iamVjdCgpOwotCi0JcHVibGljIExpc3QgbGlzdERUREVsZW1lbnQoKTsKLQotCXB1YmxpYyBMaXN0IGxpc3REVEROb3RhdGlvbigpOwotCi0JcHVibGljIExpc3QgbGlzdERUREVudGl0eSgpOwotCi0JcHVibGljIExpc3QgbGlzdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCi0JcHVibGljIExpc3QgbGlzdERUREVsZW1lbnRBbmREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQotCXB1YmxpYyBEVERFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBEVERFbnRpdHkgZmluZEVudGl0eShTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgRFRETm90YXRpb24gZmluZE5vdGF0aW9uKFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZmluZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoYm9vbGVhbiBpbmNsdWRlRXJyb3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21tZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyc2UgRXJyb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJzZUVycm9yKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERmlsZV9QYXJzZUVycm9yKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1BhcnNlRXJyb3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNpc1BhcnNlRXJyb3IgPGVtPlBhcnNlIEVycm9yPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1BhcnNlRXJyb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcnNlRXJyb3IoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgQ29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIERURENvbnRlbnR9LiBJdAotCSAqIGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgQ29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UKLQkgKiBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBDb250ZW50PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogICAgICAgICByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX0RURENvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUKLQkgKiBAbW9kZWwgdHlwZT0iRFREQ29udGVudCIgb3Bwb3NpdGU9IkRUREZpbGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREVERDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRW51bWVyYXRpb24gVHlwZTwvYj48L2VtPicKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUKLQkgKiB7QGxpbmsgRFRERW51bWVyYXRpb25UeXBlfS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEKLQkgKiBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT4nCi0JICogICAgICAgICBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlCi0JICogQG1vZGVsIHR5cGU9IkRUREVudW1lcmF0aW9uVHlwZSIgb3Bwb3NpdGU9IkRUREZpbGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLQotfSAvLyBEVERGaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERHcm91cENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNzIwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JvdXAgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldEdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRER3JvdXBDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREdyb3VwQ29udGVudCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFBvc2l0aW9uKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmR9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAgS2luZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cCBLaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kCi0JICogQHNlZSAjc2V0R3JvdXBLaW5kKERUREdyb3VwS2luZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERHcm91cENvbnRlbnRfR3JvdXBLaW5kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRER3JvdXBLaW5kIGdldEdyb3VwS2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0R3JvdXBLaW5kIDxlbT5Hcm91cCBLaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwIEtpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQKLQkgKiBAc2VlICNnZXRHcm91cEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyb3VwS2luZChEVERHcm91cEtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIERUREVsZW1lbnRDb250ZW50fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UKLQkgKiAgICAgICAgIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRER3JvdXBDb250ZW50X0NvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cAotCSAqIEBtb2RlbCB0eXBlPSJEVERFbGVtZW50Q29udGVudCIgb3Bwb3NpdGU9Imdyb3VwIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbnRlbnQoKTsKLQotfSAvLyBEVERHcm91cENvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBLaW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGQ4YjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRER3JvdXBLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRER3JvdXBLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRVFVRU5DRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNTRVFVRU5DRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VRVUVOQ0UgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0hPSUNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0NIT0lDRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFUVVFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VRVUVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjU0VRVUVOQ0UKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREdyb3VwS2luZCBTRVFVRU5DRV9MSVRFUkFMID0gbmV3IERUREdyb3VwS2luZChTRVFVRU5DRSwgIlNFUVVFTkNFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIT0lDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNIT0lDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNDSE9JQ0UKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREdyb3VwS2luZCBDSE9JQ0VfTElURVJBTCA9IG5ldyBEVERHcm91cEtpbmQoQ0hPSUNFLCAiQ0hPSUNFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRER3JvdXBLaW5kW10gVkFMVUVTX0FSUkFZID0gbmV3IERUREdyb3VwS2luZFtde1NFUVVFTkNFX0xJVEVSQUwsIENIT0lDRV9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRER3JvdXBLaW5kIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRFRER3JvdXBLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRER3JvdXBLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBTRVFVRU5DRSA6Ci0JCQkJcmV0dXJuIFNFUVVFTkNFX0xJVEVSQUw7Ci0JCQljYXNlIENIT0lDRSA6Ci0JCQkJcmV0dXJuIENIT0lDRV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEVERHcm91cEtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERUREdyb3VwS2luZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERJbnRlcm5hbEVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERJbnRlcm5hbEVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjI4NzI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRESW50ZXJuYWxFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVybmFsIEVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREludGVybmFsRW50aXR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREludGVybmFsRW50aXR5IGV4dGVuZHMgRFRERW50aXR5Q29udGVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwgdGhlcmUKLQkgKiByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRESW50ZXJuYWxFbnRpdHlfVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEVERJbnRlcm5hbEVudGl0eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERMZXhpY2FsSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERMZXhpY2FsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc5OTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETGV4aWNhbEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgY2xhc3MgRFRETGV4aWNhbEluZm8gaW1wbGVtZW50cyBEVERTb3VyY2VPZmZzZXQgewotCS8vIEJlZ2luIFVzZXIgRGVmaW5lZCBNZXRob2RzCi0JaW50IHN0YXJ0T2Zmc2V0OwotCWludCBlbmRPZmZzZXQ7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGVuZE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQotCQl0aGlzLmVuZE9mZnNldCA9IHY7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0U3RhcnRPZmZzZXRHZW4oKSB7Ci0KLQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdGFydE9mZnNldEdlbihpbnQgdikgewotCi0JCXRoaXMuc3RhcnRPZmZzZXQgPSB2OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RW5kT2Zmc2V0R2VuKCkgewotCi0JCXJldHVybiBlbmRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5kT2Zmc2V0R2VuKGludCB2KSB7Ci0KLQotCQl0aGlzLmVuZE9mZnNldCA9IHY7Ci0JfQotfS8vIERURFNvdXJjZU9mZnNldApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEROb3RhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEROb3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDZiYjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEROb3RhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVEROb3RhdGlvbiBleHRlbmRzIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRETm90YXRpb25fQ29tbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3lzdGVtIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTeXN0ZW1JRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3lzdGVtSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN5c3RlbUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTeXN0ZW1JRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVibGljIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdWJsaWNJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRETm90YXRpb25fUHVibGljSUQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVibGljSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1YmxpY0lEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdWJsaWNJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFRERXh0ZXJuYWxFbnRpdHl9LiBJdCBpcwotCSAqIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEROb3RhdGlvbl9FbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXROb3RhdGlvbgotCSAqIEBtb2RlbCB0eXBlPSJEVERFeHRlcm5hbEVudGl0eSIgb3Bwb3NpdGU9Im5vdGF0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFbnRpdHkoKTsKLQotfSAvLyBEVEROb3RhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPYmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwM2RiNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vLyBSZWYgcGFja2FnZQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIERURE9iamVjdCBleHRlbmRzIEVPYmplY3QgewotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKTsKLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKTsKLQotfSAvLyBEVERPYmplY3QKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2NjdXJyZW5jZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2NjdXJyZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4ZmI0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE9jY3VycmVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRET2NjdXJyZW5jZVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERPY2N1cnJlbmNlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+T05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05FID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PUFRJT05BTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNPUFRJT05BTF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgPSA2MzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9ORSBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORV9PUl9NT1JFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkVfT1JfTU9SRSA9IDQzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WkVSTyBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1pFUk9fT1JfTU9SRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWkVST19PUl9NT1JFID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgT05FX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoT05FLCAiT05FIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9QVElPTkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1BUSU9OQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT1BUSU9OQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURE9jY3VycmVuY2VUeXBlIE9QVElPTkFMX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoT1BUSU9OQUwsICJPUFRJT05BTCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PTkUgT1IgTU9SRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9ORSBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORV9PUl9NT1JFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBPTkVfT1JfTU9SRV9MSVRFUkFMID0gbmV3IERURE9jY3VycmVuY2VUeXBlKE9ORV9PUl9NT1JFLCAiT05FX09SX01PUkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WkVSTyBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+WkVSTyBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1pFUk9fT1JfTU9SRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgWkVST19PUl9NT1JFX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoWkVST19PUl9NT1JFLCAiWkVST19PUl9NT1JFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZVtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVERPY2N1cnJlbmNlVHlwZVtde09ORV9MSVRFUkFMLCBPUFRJT05BTF9MSVRFUkFMLCBPTkVfT1JfTU9SRV9MSVRFUkFMLCBaRVJPX09SX01PUkVfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk9jY3VycmVuY2UgVHlwZTwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk9jY3VycmVuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERPY2N1cnJlbmNlVHlwZSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURURE9jY3VycmVuY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERPY2N1cnJlbmNlVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgT05FIDoKLQkJCQlyZXR1cm4gT05FX0xJVEVSQUw7Ci0JCQljYXNlIE9QVElPTkFMIDoKLQkJCQlyZXR1cm4gT1BUSU9OQUxfTElURVJBTDsKLQkJCWNhc2UgT05FX09SX01PUkUgOgotCQkJCXJldHVybiBPTkVfT1JfTU9SRV9MSVRFUkFMOwotCQkJY2FzZSBaRVJPX09SX01PUkUgOgotCQkJCXJldHVybiBaRVJPX09SX01PUkVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFRET2NjdXJyZW5jZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERURE9jY3VycmVuY2VUeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBDRGF0YUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUENEYXRhQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2FmNWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUENEYXRhQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UEMgRGF0YSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUENEYXRhQ29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERQQ0RhdGFDb250ZW50IGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnQgewotfSAvLyBEVERQQ0RhdGFDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGU4NGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLiBJdCBjb250YWlucwotICogYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogPGxpPmVhY2ggZW51bSw8L2xpPgotICogPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiZHRkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9jb20vaWJtL2V0b29scy9kdGQuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRURFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRDb250ZW50SW1wbCA8ZW0+RWxlbWVudCBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50Q29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbGVtZW50Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9DT05URU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbGVtZW50IENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERSZXBlYXRhYmxlQ29udGVudEltcGwgPGVtPlJlcGVhdGFibGUgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX1JFUEVBVEFCTEVfQ09OVEVOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFID0gRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVwZWF0YWJsZSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRER3JvdXBDb250ZW50SW1wbCA8ZW0+R3JvdXAgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRER3JvdXBDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREdyb3VwQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX19HUk9VUCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX19FTEVNRU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Hcm91cCBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwgPGVtPkF0dHJpYnV0ZTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0VUWVBFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fQ0hBTkdFQUJMRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19DSEFOR0VBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1ZPTEFUSUxFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1ZPTEFUSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19UUkFOU0lFTlQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVFJBTlNJRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgTGl0ZXJhbDwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fTUFOWSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDb250YWluaW5nIENsYXNzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuc2V0dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19VTlNFVFRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0lEID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19FQVRUUklCVVRFX1RZUEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fQ09NTUVOVCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19ERUZBVUxUX0tJTkQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlIFN0cmluZzwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORyA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXR0cmlidXRlPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRJbXBsIDxlbT5FbGVtZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19BQlNUUkFDVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fSU5URVJGQUNFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5URVJGQUNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9BVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX1JFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVJlZmVyZW5jZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQ29udGFpbm1lbnRzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfQ09OVEFJTk1FTlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9DT05UQUlOTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBPcGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3VwZXIgVHlwZXM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9TVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUlEIEF0dHJpYnV0ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUlEX0FUVFJJQlVURSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VJRF9BVFRSSUJVVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19EVERfRklMRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fQ09NTUVOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fQ09OVEVOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19EVERfQVRUUklCVVRFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RWxlbWVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbXB0eUNvbnRlbnRJbXBsIDxlbT5FbXB0eSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbXB0eUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW1wdHlDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTVBUWV9DT05URU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbXB0eSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU1QVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREFueUNvbnRlbnRJbXBsIDxlbT5BbnkgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQW55Q29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERBbnlDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9BTllfQ09OVEVOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BTllfQ09OVEVOVF9fR1JPVVAgPSBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BbnkgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FOWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUENEYXRhQ29udGVudEltcGwgPGVtPlBDIERhdGEgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUENEYXRhQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERQQ0RhdGFDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9QQ19EQVRBX0NPTlRFTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUENfREFUQV9DT05URU5UX19HUk9VUCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQ19EQVRBX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwgPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9jY3VycmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgRWxlbWVudDwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbCA8ZW0+RmlsZTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERmlsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9GSUxFID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9GSUxFX19DT01NRU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJzZSBFcnJvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRklMRV9fUEFSU0VfRVJST1IgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBDb250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEVfX0RURF9DT05URU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRW51bWVyYXRpb24gVHlwZTwvYj48L2VtPicKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERCYXNpY1R5cGVJbXBsIDxlbT5CYXNpYyBUeXBlPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERCYXNpY1R5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREQmFzaWNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzcyBOYW1lPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0FCU1RSQUNUID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19JTlRFUkZBQ0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlRFUkZBQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VTVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VPUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX0FUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0FUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUmVmZXJlbmNlczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VSRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBDb250YWlubWVudHM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9DT05UQUlOTUVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0NPTlRBSU5NRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIE9wZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9PUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9PUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdXBlciBUeXBlczwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSUQgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FSURfQVRUUklCVVRFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUlEX0FUVFJJQlVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19LSU5EID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmFzaWMgVHlwZTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnVtZXJhdGlvblR5cGVJbXBsIDxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnVtZXJhdGlvblR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FRU5VTV9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgPSBFY29yZVBhY2thZ2UuRUVOVU1fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0lOU1RBTkNFX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VyaWFsaXphYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19TRVJJQUxJWkFCTEUgPSBFY29yZVBhY2thZ2UuRUVOVU1fX1NFUklBTElaQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTGl0ZXJhbHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTID0gRWNvcmVQYWNrYWdlLkVFTlVNX19FTElURVJBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCA9IEVjb3JlUGFja2FnZS5FRU5VTV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFID0gRWNvcmVQYWNrYWdlLkVFTlVNX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVFTlVNX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQ29udGVudEltcGwgPGVtPkNvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURENvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfQ09OVEVOVCA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQ09OVEVOVF9fRFREX0ZJTEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURE5vdGF0aW9uSW1wbCA8ZW0+Tm90YXRpb248L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURE5vdGF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9OT1RBVElPTiA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fX0RURF9GSUxFID0gRFREX0NPTlRFTlRfX0RURF9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX19DT01NRU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3lzdGVtIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9fU1lTVEVNX0lEID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGljIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9fUFVCTElDX0lEID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX19FTlRJVFkgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Tm90YXRpb248L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9GRUFUVVJFX0NPVU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsIDxlbT5FbnRpdHk8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19EVERfRklMRSA9IERURF9DT05URU5UX19EVERfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0NPTU1FTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgRW50aXR5PC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFkgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0NPTlRFTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJtIEVudGl0eSBSZWY8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW50aXR5PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUNvbnRlbnRJbXBsIDxlbT5FbnRpdHkgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5Q29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbnRpdHlDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTlRJVFlfQ09OVEVOVCA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBFbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVudGl0eSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFeHRlcm5hbEVudGl0eUltcGwgPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERXh0ZXJuYWxFbnRpdHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWSA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBFbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgPSBEVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3lzdGVtIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdWJsaWMgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9fUFVCTElDX0lEID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREludGVybmFsRW50aXR5SW1wbCA8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERJbnRlcm5hbEVudGl0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERJbnRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfSU5URVJOQUxfRU5USVRZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEVudGl0eTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA9IERURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfSU5URVJOQUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIDxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0UgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA9IERURF9DT05URU5UX19EVERfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCA8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVCA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9jY3VycmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlIDxlbT5PY2N1cnJlbmNlIFR5cGU8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRET2NjdXJyZW5jZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX09DQ1VSUkVOQ0VfVFlQRSA9IDIwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERGVmYXVsdEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0RFRkFVTFRfS0lORCA9IDIxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQgPGVtPkJhc2ljIFR5cGUgS2luZDwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREJhc2ljVHlwZUtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfS0lORCA9IDIyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQgPGVtPkVudW0gR3JvdXAgS2luZDwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVudW1Hcm91cEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1fR1JPVVBfS0lORCA9IDIzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRER3JvdXBLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9HUk9VUF9LSU5EID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGUgPGVtPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldFhNTFNjaGVtYURlZmluZWRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFhNTF9TQ0hFTUFfREVGSU5FRF9UWVBFID0gMjU7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQgPGVtPkVsZW1lbnQgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudCBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERWxlbWVudENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudENvbnRlbnRfRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQgPGVtPkdyb3VwIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyb3VwIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRER3JvdXBDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldEdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hcm91cCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0R3JvdXBLaW5kKCkKLQkgKiBAc2VlICNnZXREVERHcm91cENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREdyb3VwQ29udGVudF9Hcm91cEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQoKQotCSAqIEBzZWUgI2dldERUREdyb3VwQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRER3JvdXBDb250ZW50X0NvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlIDxlbT5BdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0Q29tbWVudCgpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERBdHRyaWJ1dGVfQ29tbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRLaW5kKCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9EZWZhdWx0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0VmFsdWVTdHJpbmcgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9EZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRURCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCgpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29tbWVudCgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERWxlbWVudF9Db21tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29udGVudCgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudF9Db250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldERUREF0dHJpYnV0ZSA8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRURCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQgPGVtPkVtcHR5IENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVtcHR5IENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERW1wdHlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQgPGVtPkFueSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BbnkgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREQW55Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50IDxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBDIERhdGEgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREUENEYXRhQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCA8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQjZ2V0UmVmZXJlbmNlZEVsZW1lbnQgPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50I2dldFJlZmVyZW5jZWRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRfUmVmZXJlbmNlZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQgPGVtPlJlcGVhdGFibGUgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVwZWF0YWJsZSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudCNnZXRPY2N1cnJlbmNlIDxlbT5PY2N1cnJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9jY3VycmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50I2dldE9jY3VycmVuY2UoKQotCSAqIEBzZWUgI2dldERURFJlcGVhdGFibGVDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERSZXBlYXRhYmxlQ29udGVudF9PY2N1cnJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUgPGVtPkZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXRDb21tZW50KCkKLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERGaWxlX0NvbW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2lzUGFyc2VFcnJvciA8ZW0+UGFyc2UgRXJyb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyc2UgRXJyb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjaXNQYXJzZUVycm9yKCkKLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERGaWxlX1BhcnNlRXJyb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudCA8ZW0+RFREIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EVEQgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERDb250ZW50KCkKLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERGaWxlX0RURENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlIDxlbT5CYXNpYyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNpYyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREJhc2ljVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSNnZXRLaW5kKCkKLQkgKiBAc2VlICNnZXREVERCYXNpY1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREJhc2ljVHlwZV9LaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSA8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0S2luZCgpCi0JICogQHNlZSAjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFbnVtZXJhdGlvblR5cGVfS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRURCBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSgpCi0JICogQHNlZSAjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5vdGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRETm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldENvbW1lbnQoKQotCSAqIEBzZWUgI2dldERURE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVEROb3RhdGlvbl9Db21tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFN5c3RlbUlEKCkKLQkgKiBAc2VlICNnZXREVEROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1YmxpYyBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0UHVibGljSUQoKQotCSAqIEBzZWUgI2dldERURE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldEVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFRETm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERURE5vdGF0aW9uX0VudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb21tZW50KCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREVudGl0eV9Db21tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2lzUGFyYW1ldGVyRW50aXR5IDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNpc1BhcmFtZXRlckVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0NvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZiA8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2UgPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eV9FbnRpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50IDxlbT5FbnRpdHkgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5IENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVudGl0eUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkgPGVtPkRURCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRURCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHlDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSA8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFeHRlcm5hbEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lzdGVtIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRTeXN0ZW1JRCgpCi0JICogQHNlZSAjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREV4dGVybmFsRW50aXR5X1N5c3RlbUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFB1YmxpY0lEKCkKLQkgKiBAc2VlICNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfUHVibGljSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+Tm90YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uKCkKLQkgKiBAc2VlICNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIDxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpCi0JICogQHNlZSAjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREV4dGVybmFsRW50aXR5X0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkgPGVtPkludGVybmFsIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRESW50ZXJuYWxFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXREVERJbnRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRESW50ZXJuYWxFbnRpdHlfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIDxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSA8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50X0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERURENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RFREIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZSgpCi0JICogQHNlZSAjZ2V0RFREQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFREQ29udGVudF9EVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUgPGVtPk9jY3VycmVuY2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5PY2N1cnJlbmNlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERURE9jY3VycmVuY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQgPGVtPkRlZmF1bHQgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5EZWZhdWx0IEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERURERlZmF1bHRLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZCA8ZW0+QmFzaWMgVHlwZSBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkJhc2ljIFR5cGUgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREVERCYXNpY1R5cGVLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZCA8ZW0+RW51bSBHcm91cCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkVudW0gR3JvdXAgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREVERFbnVtR3JvdXBLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kIDxlbT5Hcm91cCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkdyb3VwIEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREVERHcm91cEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZSA8ZW0+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLlhNTFNjaGVtYURlZmluZWRUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFhNTFNjaGVtYURlZmluZWRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmFjdG9yeSBnZXREVERGYWN0b3J5KCk7Ci0KLX0gLy8gRFREUGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGY5MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGV4dGVuZHMgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlLiBJdCBpcwotCSAqIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZgotCSAqIEBtb2RlbCBvcHBvc2l0ZT0icGFybUVudGl0eVJlZiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBnZXRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotfSAvLyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVwZWF0YWJsZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVwZWF0YWJsZUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliNTEyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFJlcGVhdGFibGVDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcGVhdGFibGUgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQjZ2V0T2NjdXJyZW5jZSA8ZW0+T2NjdXJyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERSZXBlYXRhYmxlQ29udGVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVwZWF0YWJsZUNvbnRlbnQgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudCB7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PY2N1cnJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9jY3VycmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZQotCSAqIEBzZWUgI3NldE9jY3VycmVuY2UoRFRET2NjdXJyZW5jZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnRfT2NjdXJyZW5jZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURE9jY3VycmVuY2VUeXBlIGdldE9jY3VycmVuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQjZ2V0T2NjdXJyZW5jZSA8ZW0+T2NjdXJyZW5jZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PY2N1cnJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUKLQkgKiBAc2VlICNnZXRPY2N1cnJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPY2N1cnJlbmNlKERURE9jY3VycmVuY2VUeXBlIHZhbHVlKTsKLQotfSAvLyBEVERSZXBlYXRhYmxlQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWRkMWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLQotcHVibGljIGludGVyZmFjZSBEVERSZXNvdXJjZSB7Ci0JLy8gRW51bWVyYXRpb24gQ29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZSUNPTiA9ICJpY29ucy9hbnkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRJQ09OID0gImljb25zL2VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWUlDT04gPSAiaWNvbnMvZW50aXR5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVJQ09OID0gImljb25zL2F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05JQ09OID0gImljb25zL25vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWUlDT04gPSAiaWNvbnMvZW1wdHljb250ZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0RBVEFJQ09OID0gImljb25zL29uZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZUkVGRVJFTkNFSUNPTiA9ICJpY29ucy9lbnRpdHlfcmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORUlDT04gPSAiaWNvbnMvb25lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTElDT04gPSAiaWNvbnMvb3B0aW9uYWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORU9STU9SRUlDT04gPSAiaWNvbnMvb25lb3Jtb3JlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFSUNPTiA9ICJpY29ucy96ZXJvb3Jtb3JlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORVNFUVVFTkNFSUNPTiA9ICJpY29ucy9vbmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxTRVFVRU5DRUlDT04gPSAiaWNvbnMvb3B0aW9uYWxzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL29uZW9ybW9yZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL3plcm9vcm1vcmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVDSE9JQ0VJQ09OID0gImljb25zL29uZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxDSE9JQ0VJQ09OID0gImljb25zL29wdGlvbmFsY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVDSE9JQ0VJQ09OID0gImljb25zL29uZW9ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRUNIT0lDRUlDT04gPSAiaWNvbnMvemVyb29ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERGSUxFSUNPTiA9ICJpY29ucy9EVERGaWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0RURCA9ICJpY29ucy9uZXdkdGRfd2l6LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdIVE1MRk9STSA9ICJpY29ucy9nZW5odG1mb3JtX3dpei5naWYiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFNvdXJjZU9mZnNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERTb3VyY2VPZmZzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzNjI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFNvdXJjZU9mZnNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotcHVibGljIGludGVyZmFjZSBEVERTb3VyY2VPZmZzZXQgewotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdik7Ci0KLX0vLyBEVERTb3VyY2VPZmZzZXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NzQ2MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgaW50ZXJmYWNlIERURFR5cGUgZXh0ZW5kcyBEVERPYmplY3QgewotCS8vIGNvbnN0YW50IHN0cmluZ3MgZm9yIGR0ZCBhdHRyaWJ1dGUgdHlwZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5vbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQSA9ICJDaGFyYWN0ZXIgRGF0YSAoQ0RBVEEpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIklkZW50aWZpZXIgKElEKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRiA9ICJJRCBSZWZlcmVuY2UgKElEUkVGKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRlMgPSAiSUQgUmVmZXJlbmNlcyAoSURSRUZTKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiRW50aXR5IE5hbWUgKEVOVElUWSkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVMgPSAiRW50aXR5IE5hbWVzIChFTlRJVElFUykiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9ICJOYW1lIFRva2VuIChOTVRPS0VOKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOUyA9ICJOYW1lIFRva2VucyAoTk1UT0tFTlMpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1fTkFNRV9UT0tFTl9HUk9VUCA9ICJFbnVtZXJhdGVkIE5hbWUgVG9rZW5zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1fTk9UQVRJT05fR1JPVVAgPSAiRW51bWVyYXRlZCBOT1RBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9YTUxTY2hlbWFEZWZpbmVkVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9YTUxTY2hlbWFEZWZpbmVkVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGM2OGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvWE1MU2NoZW1hRGVmaW5lZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldFhNTFNjaGVtYURlZmluZWRUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MU2NoZW1hRGVmaW5lZFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9ORV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IC0xOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U1RSSU5HPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1NUUklOR19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJPT0xFQU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQk9PTEVBTl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9PTEVBTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GTE9BVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNGTE9BVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxPQVQgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RE9VQkxFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RPVUJMRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRFQ0lNQUw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjREVDSU1BTF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDSU1BTCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FSU5TVEFOVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRUlOU1RBTlQgPSA2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRURVUkFUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUVEVVJBVElPTl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRURVUkFUSU9OID0gNzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFQ1VSUklOR0lOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjUkVDVVJSSU5HSU5TVEFOVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVDVVJSSU5HSU5TVEFOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CSU5BUlk8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQklOQVJZX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5BUlkgPSA5OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1VSSV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFR0VSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lOVEVHRVJfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHRVIgPSAxMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRBVEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjREFURV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFURSA9IDEyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgTk9ORV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKE5PTkUsICJOT05FIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNTVFJJTkcKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFNUUklOR19MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFNUUklORywgIlNUUklORyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CT09MRUFOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Qk9PTEVBTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNCT09MRUFOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBCT09MRUFOX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoQk9PTEVBTiwgIkJPT0xFQU4iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RkxPQVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GTE9BVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNGTE9BVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgRkxPQVRfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShGTE9BVCwgIkZMT0FUIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRPVUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRPVUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNET1VCTEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIERPVUJMRV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKERPVUJMRSwgIkRPVUJMRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ERUNJTUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+REVDSU1BTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNERUNJTUFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBERUNJTUFMX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoREVDSU1BTCwgIkRFQ0lNQUwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRUlOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5USU1FSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FSU5TVEFOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgVElNRUlOU1RBTlRfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShUSU1FSU5TVEFOVCwgIlRJTUVJTlNUQU5UIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVEVVJBVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRJTUVEVVJBVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FRFVSQVRJT04KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFRJTUVEVVJBVElPTl9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFRJTUVEVVJBVElPTiwgIlRJTUVEVVJBVElPTiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRUNVUlJJTkdJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVDVVJSSU5HSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbAotCSAqIG9iamVjdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1JFQ1VSUklOR0lOU1RBTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFJFQ1VSUklOR0lOU1RBTlRfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShSRUNVUlJJTkdJTlNUQU5ULCAiUkVDVVJSSU5HSU5TVEFOVCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CSU5BUlk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CSU5BUlk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQklOQVJZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBCSU5BUllfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShCSU5BUlksICJCSU5BUlkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVSSTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNVUkkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFVSSV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFVSSSwgIlVSSSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFR0VSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5URUdFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJTlRFR0VSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBJTlRFR0VSX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoSU5URUdFUiwgIklOVEVHRVIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REFURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5EQVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RBVEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIERBVEVfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShEQVRFLCAiREFURSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRJTUU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgVElNRV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFRJTUUsICJUSU1FIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlW10gVkFMVUVTX0FSUkFZID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlW117Tk9ORV9MSVRFUkFMLCBTVFJJTkdfTElURVJBTCwgQk9PTEVBTl9MSVRFUkFMLCBGTE9BVF9MSVRFUkFMLCBET1VCTEVfTElURVJBTCwgREVDSU1BTF9MSVRFUkFMLCBUSU1FSU5TVEFOVF9MSVRFUkFMLCBUSU1FRFVSQVRJT05fTElURVJBTCwgUkVDVVJSSU5HSU5TVEFOVF9MSVRFUkFMLCBCSU5BUllfTElURVJBTCwgVVJJX0xJVEVSQUwsIElOVEVHRVJfTElURVJBTCwgREFURV9MSVRFUkFMLCBUSU1FX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTFNjaGVtYURlZmluZWRUeXBlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJWE1MU2NoZW1hRGVmaW5lZFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoCi0JICogdGhlIHNwZWNpZmllZCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MU2NoZW1hRGVmaW5lZFR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5PTkUgOgotCQkJCXJldHVybiBOT05FX0xJVEVSQUw7Ci0JCQljYXNlIFNUUklORyA6Ci0JCQkJcmV0dXJuIFNUUklOR19MSVRFUkFMOwotCQkJY2FzZSBCT09MRUFOIDoKLQkJCQlyZXR1cm4gQk9PTEVBTl9MSVRFUkFMOwotCQkJY2FzZSBGTE9BVCA6Ci0JCQkJcmV0dXJuIEZMT0FUX0xJVEVSQUw7Ci0JCQljYXNlIERPVUJMRSA6Ci0JCQkJcmV0dXJuIERPVUJMRV9MSVRFUkFMOwotCQkJY2FzZSBERUNJTUFMIDoKLQkJCQlyZXR1cm4gREVDSU1BTF9MSVRFUkFMOwotCQkJY2FzZSBUSU1FSU5TVEFOVCA6Ci0JCQkJcmV0dXJuIFRJTUVJTlNUQU5UX0xJVEVSQUw7Ci0JCQljYXNlIFRJTUVEVVJBVElPTiA6Ci0JCQkJcmV0dXJuIFRJTUVEVVJBVElPTl9MSVRFUkFMOwotCQkJY2FzZSBSRUNVUlJJTkdJTlNUQU5UIDoKLQkJCQlyZXR1cm4gUkVDVVJSSU5HSU5TVEFOVF9MSVRFUkFMOwotCQkJY2FzZSBCSU5BUlkgOgotCQkJCXJldHVybiBCSU5BUllfTElURVJBTDsKLQkJCWNhc2UgVVJJIDoKLQkJCQlyZXR1cm4gVVJJX0xJVEVSQUw7Ci0JCQljYXNlIElOVEVHRVIgOgotCQkJCXJldHVybiBJTlRFR0VSX0xJVEVSQUw7Ci0JCQljYXNlIERBVEUgOgotCQkJCXJldHVybiBEQVRFX0xJVEVSQUw7Ci0JCQljYXNlIFRJTUUgOgotCQkJCXJldHVybiBUSU1FX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFhNTFNjaGVtYURlZmluZWRUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvLyBYTUxTY2hlbWFEZWZpbmVkVHlwZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREFueUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQW55Q29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU4MTI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQW55Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BbnkgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERBbnlDb250ZW50SW1wbCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREFueUNvbnRlbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiQU5ZIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREQW55Q29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREQW55Q29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQXR0cmlidXRlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREF0dHJpYnV0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2MDIwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQXR0cmlidXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVBdHRyaWJ1dGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERMZXhpY2FsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF0dHJpYnV0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+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+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0S2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0S2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFZhbHVlU3RyaW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRWYWx1ZVN0cmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVERBdHRyaWJ1dGVJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQmFzaWNUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREJhc2ljVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmOWE4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQmFzaWNUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNpYyBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREJhc2ljVHlwZUltcGwjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERCYXNpY1R5cGVJbXBsIGV4dGVuZHMgRUNsYXNzSW1wbCBpbXBsZW1lbnRzIERUREJhc2ljVHlwZSwgRUNsYXNzIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGJhc2ljVHlwZVN0cmluZ3NbXSA9IHtEVERUeXBlLk5PTkUsIERURFR5cGUuQ0RBVEEsIERURFR5cGUuSUQsIERURFR5cGUuSURSRUYsIERURFR5cGUuSURSRUZTLCBEVERUeXBlLkVOVElUWSwgRFREVHlwZS5FTlRJVElFUywgRFREVHlwZS5OTVRPS0VOLCBEVERUeXBlLk5NVE9LRU5TfTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGJhc2ljVHlwZURlc2NyaXB0aW9uc1tdID0ge0RURENvcmVNZXNzYWdlcy5fVUlfTk9ORV9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfSURFTlRJRklFUl9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRV9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRVNfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9FTlRJVFlfTkFNRV9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVElUWV9OQU1FU19ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX05BTUVfVE9LRU5fREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9OQU1FX1RPS0VOU19ERVNDfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGJhc2ljVHlwZUtpbmRzW10gPSB7RFREQmFzaWNUeXBlS2luZC5OT05FLCBEVERCYXNpY1R5cGVLaW5kLkNEQVRBLCBEVERCYXNpY1R5cGVLaW5kLklELCBEVERCYXNpY1R5cGVLaW5kLklEUkVGLCBEVERCYXNpY1R5cGVLaW5kLklEUkVGUywgRFREQmFzaWNUeXBlS2luZC5FTlRJVFksIERUREJhc2ljVHlwZUtpbmQuRU5USVRJRVMsIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTiwgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU307Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKSB7Ci0JCXJldHVybiBnZXRUeXBlU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKCkgewotCQlpbnQga2luZCA9IGdldEtpbmQoKS5nZXRWYWx1ZSgpOwotCQlpZiAoa2luZCA+PSAwICYmIGtpbmQgPCBiYXNpY1R5cGVTdHJpbmdzLmxlbmd0aCkgewotCQkJcmV0dXJuIGJhc2ljVHlwZVN0cmluZ3Nba2luZF07Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGdldFR5cGVEZXNjcmlwdGlvbihnZXRLaW5kKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlRGVzY3JpcHRpb24oaW50IHR5cGVLaW5kKSB7Ci0JCWlmICh0eXBlS2luZCA+PSAwICYmIHR5cGVLaW5kIDwgYmFzaWNUeXBlRGVzY3JpcHRpb25zLmxlbmd0aCkgewotCQkJcmV0dXJuIGJhc2ljVHlwZURlc2NyaXB0aW9uc1t0eXBlS2luZF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJLy8gVEJECi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIEtJTkRfRURFRkFVTFQgPSBEVERCYXNpY1R5cGVLaW5kLk5PTkVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGVLaW5kIGtpbmQgPSBLSU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREJhc2ljVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQmFzaWNUeXBlS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2luZChEVERCYXNpY1R5cGVLaW5kIG5ld0tpbmQpIHsKLQkJRFREQmFzaWNUeXBlS2luZCBvbGRLaW5kID0ga2luZDsKLQkJa2luZCA9IG5ld0tpbmQgPT0gbnVsbCA/IEtJTkRfRURFRkFVTFQgOiBuZXdLaW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19LSU5ELCBvbGRLaW5kLCBraW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVPcGVyYXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFT3BlcmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVSZWZlcmVuY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VDTEFTU0lGSUVSUywgRVBhY2thZ2UuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA6Ci0JCQkJcmV0dXJuIGlzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuIGlzSW50ZXJmYWNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBnZXRFU3VwZXJUeXBlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVPcGVyYXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZ2V0RVJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCXJldHVybiBnZXRFQXR0cmlidXRlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxDb250YWlubWVudHMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9PUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUlEX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19LSU5EIDoKLQkJCQlyZXR1cm4gZ2V0S2luZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX05BTUUgOgotCQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoKENsYXNzKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA6Ci0JCQkJc2V0QWJzdHJhY3QoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFIDoKLQkJCQlzZXRJbnRlcmZhY2UoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVNVUEVSX1RZUEVTIDoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTIDoKLQkJCQlnZXRFQXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQgOgotCQkJCXNldEtpbmQoKERUREJhc2ljVHlwZUtpbmQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fTkFNRSA6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fQUJTVFJBQ1QgOgotCQkJCXNldEFic3RyYWN0KEFCU1RSQUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOVEVSRkFDRSA6Ci0JCQkJc2V0SW50ZXJmYWNlKElOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCWdldEVBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQgOgotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RUFubm90YXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzc05hbWUgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzTmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3MgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzcyk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fQUJTVFJBQ1QgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwKSAhPSBBQlNUUkFDVF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJTlRFUkZBQ0VfRUZMQUcpICE9IDApICE9IElOVEVSRkFDRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVNVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZVN1cGVyVHlwZXMgIT0gbnVsbCAmJiAhZ2V0RVN1cGVyVHlwZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZU9wZXJhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RU9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGVSZWZlcmVuY2VzICE9IG51bGwgJiYgIWdldEVSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGVBdHRyaWJ1dGVzICE9IG51bGwgJiYgIWdldEVBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQ29udGFpbm1lbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX09QRVJBVElPTlMgOgotCQkJCXJldHVybiAhZ2V0RUFsbE9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FSURfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fS0lORCA6Ci0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChraW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIERUREJhc2ljVHlwZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURENvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MTQ3Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURENvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTmFtZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIERURENvbnRlbnRJbXBsIGV4dGVuZHMgRU5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBEVERDb250ZW50LCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREZpbGUpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSBuZXdEVERGaWxlKSB7Ci0JCWlmIChuZXdEVERGaWxlICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgJiYgbmV3RFRERmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUsIG5ld0RUREZpbGUsIG5ld0RUREZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBEVERDb250ZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzY2OTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudCBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRDb250ZW50SW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudENvbnRlbnRJbXBsI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRERWxlbWVudENvbnRlbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEVERFbGVtZW50Q29udGVudCB7Ci0KLQlwdWJsaWMgRFRERWxlbWVudENvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGdldERUREVsZW1lbnQoKSB7Ci0JCURUREVsZW1lbnRDb250ZW50IGMgPSBnZXREVERHcm91cENvbnRlbnQoKTsKLQkJaWYgKGMgIT0gbnVsbCkKLQkJCXJldHVybiBjLmdldEVsZW1lbnQoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvLyBnZXQgdGhlIG1vc3Qgb3V0ZXIgRFRER3JvdXBDb250ZW50Ci0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXREVERHcm91cENvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnRDb250ZW50IGMgPSB0aGlzOwotCQl3aGlsZSAoYy5nZXRHcm91cCgpICE9IG51bGwpIHsKLQkJCWMgPSBjLmdldEdyb3VwKCk7Ci0JCX0KLQkJcmV0dXJuICgoYyBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgPyAoRFRER3JvdXBDb250ZW50KSBjIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJaW50IGNudCA9IDA7Ci0JCURURE9iamVjdCBwYXJlbnQgPSBnZXRHcm91cCgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXBhcmVudCA9IGdldEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCURUREdyb3VwQ29udGVudCBncm91cCA9IChEVERHcm91cENvbnRlbnQpIHBhcmVudDsKLQkJCUl0ZXJhdG9yIGkgPSBncm91cC5nZXRDb250ZW50KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCURUREVsZW1lbnRDb250ZW50IGNvbnRlbnQgPSAoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpOwotCQkJCWlmIChjb250ZW50ID09IHRoaXMpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICgoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB8fCAoY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljbnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKCgocGFyZW50ID09IG51bGwpID8gIk5VTExfUEFSRU5UIiA6IHBhcmVudC5nZXRQYXRobmFtZSgpKSwgIkNvbnRlbnQiLCBudWxsLCBjbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudENvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkvLyBUaGlzIG1lYW5zIHRoaXMgaXMgdGhlIG9ubHkgZWxlbWVudCBjb250ZW50IGluIHRoZSBlbGVtZW50Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlEVERHcm91cENvbnRlbnQgZ3JvdXAgPSBnZXRHcm91cCgpOwotCQlpbnQgcG9zID0gZ3JvdXAuZ2V0Q29udGVudFBvc2l0aW9uKHRoaXMpOwotCQlpZiAocG9zID09IDApIHsKLQkJCS8vIG5vdyByZWN1cnNlIGFuZCBlbnN1cmUgdGhpcyBncm91cCBpcyB0aGUgZmlyc3QgZ3JvdXAKLQkJCXJldHVybiBncm91cC5pc0ZpcnN0RWxlbWVudENvbnRlbnQoKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREZXRhaWwoKSB7Ci0JCS8vIG1vc3QgdGltZXMsIGNvbnRlbnQgbmFtZSBpcyBmaW5lLiBIb3dldmVyIGZvciBncm91cHMsCi0JCS8vIHdlIGRpZG4ndCB3YW50IGEgbG9uZyBuYW1lIHRvIHNob3cgdXAgaW4gdGhlIHRyZWUsCi0JCS8vIHNvIHdlIGNyZWF0ZWQgYSBnZXQgY29udGVudGRldGFpbCB0byBnZXQgdG8gdGhlIGxvbmcKLQkJLy8gbmFtZSAoZ2V0Q29udGVudE5hbWUgd2lsbCBnZXQgdGhlIHNob3J0IG9uZS4KLQkJcmV0dXJuIGdldENvbnRlbnROYW1lKCk7Ci0JfQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERFbGVtZW50Q29udGVudCNnZXRDb250ZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERWxlbWVudENvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXRHcm91cCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREdyb3VwQ29udGVudCkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JvdXAoRFRER3JvdXBDb250ZW50IG5ld0dyb3VwKSB7Ci0JCWlmIChuZXdHcm91cCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgJiYgbmV3R3JvdXAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdHcm91cCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0dyb3VwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcm91cCkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3R3JvdXAsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQLCBuZXdHcm91cCwgbmV3R3JvdXApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERWxlbWVudCkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChEVERFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgJiYgbmV3RWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0VsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RWxlbWVudCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBuZXdFbGVtZW50LCBuZXdFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBEVERFbGVtZW50Q29udGVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjc0ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERMZXhpY2FsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREVmlzaXRvcjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVsZW1lbnRJbXBsIGV4dGVuZHMgRUNsYXNzSW1wbCBpbXBsZW1lbnRzIERUREVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCXB1YmxpYyBEVERFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbGVtZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJZ2V0RFREQXR0cmlidXRlKCkuYWRkKGF0dHJpYnV0ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiRWxlbSIsIGdldE5hbWUoKSwgLTEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gRFREUGF0aG5hbWVVdGlsLnBhcnNlUGF0aENvbXBvbmVudChyZWxhdGl2ZVBhdGgpOwotCi0JCVN0cmluZyB0eXBlID0gKFN0cmluZykgcmVzdWx0WzBdOwotCi0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlEVERPYmplY3Qgb2JqID0gbnVsbDsKLQkJaWYgKHR5cGUuZXF1YWxzKCJBdHRyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gVE9ETzogZml4IHBvcnQKLQkJCS8vIG9iaiA9IGZpbmRBdHRyaWJ1dGUobmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUuZXF1YWxzKCJDb250ZW50IikpIHx8ICh0eXBlLmVxdWFscygiRWxlbVJlZiIpKSB8fCAodHlwZS5lcXVhbHMoIkVudFJlZiIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJb2JqID0gZ2V0Q29udGVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgcmVzdFBhdGggPSAoU3RyaW5nKSByZXN1bHRbM107Ci0KLQkJaWYgKChyZXN0UGF0aCA9PSBudWxsKSB8fCAob2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG9iai5maW5kT2JqZWN0KHJlc3RQYXRoKTsKLQkJfQotCX0KLQotCS8vIHJldHVybnMgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIHNhbWUgRFRERmlsZSB0aGF0IHJlZmVyZW5jZSB0aGlzIGVsZW1lbnQKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWZlcmVuY2VzKCkgewotCQlEVERGaWxlIGZpbGUgPSBnZXREVERGaWxlKCk7Ci0JCWZpbmFsIENvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCURURFZpc2l0b3IgdmlzaXRSZWZzID0gbmV3IERURFZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmdldFJlZmVyZW5jZWRFbGVtZW50KCkgPT0gRFRERWxlbWVudEltcGwudGhpcykgewotCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJfQotCQl9OwotCQl2aXNpdFJlZnMudmlzaXREVERGaWxlKGZpbGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlRGV0YWlsKCkgewotCQlTdHJpbmcgYXR0cmlidXRlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbiBhdHRyaWJ1dGVzID0gZ2V0RFREQXR0cmlidXRlKCk7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2Vlbk9uZSA9IGZhbHNlOwotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaSA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKHNlZW5PbmUpIHsKLQkJCQkJYXR0cmlidXRlU3RyaW5nID0gYXR0cmlidXRlU3RyaW5nICsgIiwgIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2Vlbk9uZSA9IHRydWU7Ci0JCQkJfSAvLyBlbmQgb2YgZWxzZQotCi0JCQkJYXR0cmlidXRlU3RyaW5nID0gYXR0cmlidXRlU3RyaW5nICsgKChEVERBdHRyaWJ1dGUpIGkubmV4dCgpKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCXJldHVybiBhdHRyaWJ1dGVTdHJpbmc7Ci0JfQotCi0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBDT01NRU5UX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZHRkQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVsZW1lbnRDb250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250ZW50KERUREVsZW1lbnRDb250ZW50IG5ld0NvbnRlbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFRERWxlbWVudENvbnRlbnQgb2xkQ29udGVudCA9IGNvbnRlbnQ7Ci0JCWNvbnRlbnQgPSBuZXdDb250ZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgb2xkQ29udGVudCwgbmV3Q29udGVudCkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgbmV3Q29udGVudCkgewotCQlpZiAobmV3Q29udGVudCAhPSBjb250ZW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjb250ZW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQsIERUREVsZW1lbnRDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdDb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250ZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQsIERUREVsZW1lbnRDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRlbnQobmV3Q29udGVudCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIG5ld0NvbnRlbnQsIG5ld0NvbnRlbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREVERBdHRyaWJ1dGUoKSB7Ci0JCWlmIChkdGRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJZHRkQXR0cmlidXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRFREQXR0cmlidXRlLmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UKTsKLQkJfQotCQlyZXR1cm4gZHRkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFT3BlcmF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNvbnRlbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBudWxsLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERBdHRyaWJ1dGUoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RVJlZmVyZW5jZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbnRlbnQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RFREQXR0cmlidXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19BQlNUUkFDVCA6Ci0JCQkJcmV0dXJuIGlzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuIGlzSW50ZXJmYWNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBnZXRFU3VwZXJUeXBlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVPcGVyYXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZ2V0RVJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCXJldHVybiBnZXRFQXR0cmlidXRlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxDb250YWlubWVudHMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9PUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUlEX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldERUREF0dHJpYnV0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWdldEVBbm5vdGF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fTkFNRSA6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3NOYW1lICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzc05hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3MpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0FCU1RSQUNUIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMCkgIT0gQUJTVFJBQ1RfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSU5URVJGQUNFX0VGTEFHKSAhPSAwKSAhPSBJTlRFUkZBQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuIGVTdXBlclR5cGVzICE9IG51bGwgJiYgIWdldEVTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVPcGVyYXRpb25zICE9IG51bGwgJiYgIWdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX0FUVFJJQlVURVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCXJldHVybiBlUmVmZXJlbmNlcyAhPSBudWxsICYmICFnZXRFUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCXJldHVybiBlQXR0cmlidXRlcyAhPSBudWxsICYmICFnZXRFQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9DT05UQUlOTUVOVFMgOgotCQkJCXJldHVybiAhZ2V0RUFsbENvbnRhaW5tZW50cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9PUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxPcGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9TVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3VwZXJUeXBlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUlEX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBjb250ZW50ICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCXJldHVybiBkdGRBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhZ2V0RFREQXR0cmlidXRlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IERURENvbnRlbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEU7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBEVERDb250ZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbW1lbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY29tbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX05BTUUgOgotCQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoKENsYXNzKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19BQlNUUkFDVCA6Ci0JCQkJc2V0QWJzdHJhY3QoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5URVJGQUNFIDoKLQkJCQlzZXRJbnRlcmZhY2UoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTIDoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTIDoKLQkJCQlnZXRFQXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQgOgotCQkJCXNldENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQlnZXREVERBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldERUREF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX05BTUUgOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZShJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzKElOU1RBTkNFX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0FCU1RSQUNUIDoKLQkJCQlzZXRBYnN0cmFjdChBQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlRFUkZBQ0UgOgotCQkJCXNldEludGVyZmFjZShJTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTIDoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCWdldEVSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTIDoKLQkJCQlnZXRFQXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KENPTU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJc2V0Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJZ2V0RFREQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERGaWxlKSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSBuZXdEVERGaWxlKSB7Ci0JCWlmIChuZXdEVERGaWxlICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgJiYgbmV3RFRERmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUsIG5ld0RUREZpbGUsIG5ld0RUREZpbGUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkOTkzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVERFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gbnVsbDsKLQotCXB1YmxpYyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJRFRERWxlbWVudCBlID0gZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBnZXRSZWZlcmVuY2VkRWxlbWVudCgpIHsKLQkJaWYgKHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgcmVmZXJlbmNlZEVsZW1lbnQuZUlzUHJveHkoKSkgewotCQkJRFRERWxlbWVudCBvbGRSZWZlcmVuY2VkRWxlbWVudCA9IHJlZmVyZW5jZWRFbGVtZW50OwotCQkJcmVmZXJlbmNlZEVsZW1lbnQgPSAoRFRERWxlbWVudCkgRWNvcmVVdGlsLnJlc29sdmUocmVmZXJlbmNlZEVsZW1lbnQsIHRoaXMpOwotCQkJaWYgKHJlZmVyZW5jZWRFbGVtZW50ICE9IG9sZFJlZmVyZW5jZWRFbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5ULCBvbGRSZWZlcmVuY2VkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50IGJhc2ljR2V0UmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkRWxlbWVudChEVERFbGVtZW50IG5ld1JlZmVyZW5jZWRFbGVtZW50KSB7Ci0JCURUREVsZW1lbnQgb2xkUmVmZXJlbmNlZEVsZW1lbnQgPSByZWZlcmVuY2VkRWxlbWVudDsKLQkJcmVmZXJlbmNlZEVsZW1lbnQgPSBuZXdSZWZlcmVuY2VkRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5ULCBvbGRSZWZlcmVuY2VkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIG9jY3VycmVuY2UgIT0gT0NDVVJSRU5DRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlZEVsZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoKERURE9jY3VycmVuY2VUeXBlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgOgotCQkJCXNldFJlZmVyZW5jZWRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKE9DQ1VSUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UIDoKLQkJCQlzZXRSZWZlcmVuY2VkRWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVtcHR5Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbXB0eUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ODljNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVtcHR5Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVtcHR5Q29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERFbXB0eUNvbnRlbnQgewotCi0JcHVibGljIERUREVtcHR5Q29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW1wdHlDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE3ZDMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERUREVudGl0eUNvbnRlbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEVERFbnRpdHlDb250ZW50IHsKLQotCXB1YmxpYyBEVERFbnRpdHlDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChnZXREVERFbnRpdHkoKS5nZXRQYXRobmFtZSgpLCAiQ29udGVudCIsIG51bGwsIC0xKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVudGl0eSBnZXREVERFbnRpdHkoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERW50aXR5KSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREVudGl0eShEVERFbnRpdHkgbmV3RFRERW50aXR5KSB7Ci0JCWlmIChuZXdEVERFbnRpdHkgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSAmJiBuZXdEVERFbnRpdHkgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdEVERFbnRpdHkpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREVudGl0eSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERFbnRpdHksIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIG5ld0RUREVudGl0eSwgbmV3RFRERW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRFRERW50aXR5Q29udGVudCN1bnBhcnNlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjc5NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2lzUGFyYW1ldGVyRW50aXR5IDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldEVudGl0eVJlZmVyZW5jZSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbnRpdHlJbXBsIGV4dGVuZHMgRFREQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERFbnRpdHksIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQgewotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiRW50IiwgZ2V0TmFtZSgpLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IERURFBhdGhuYW1lVXRpbC5wYXJzZVBhdGhDb21wb25lbnQocmVsYXRpdmVQYXRoKTsKLQotCi0JCVN0cmluZyB0eXBlID0gKFN0cmluZykgcmVzdWx0WzBdOwotCi0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0KLQkJRFRET2JqZWN0IG9iaiA9IG51bGw7Ci0JCWlmICh0eXBlLmVxdWFscygiQ29udGVudCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9iaiA9IGdldENvbnRlbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQotCQlTdHJpbmcgcmVzdFBhdGggPSAoU3RyaW5nKSByZXN1bHRbM107Ci0KLQkJaWYgKChyZXN0UGF0aCA9PSBudWxsKSB8fCAob2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG9iai5maW5kT2JqZWN0KHJlc3RQYXRoKTsKLQkJfQotCX0KLQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBDT01NRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGFyYW1ldGVyRW50aXR5KCkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1BhcmFtZXRlckVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBBUkFNRVRFUl9FTlRJVFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGFyYW1ldGVyRW50aXR5KCkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1BhcmFtZXRlckVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGFyYW1ldGVyRW50aXR5ID0gUEFSQU1FVEVSX0VOVElUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRlbnQoKSA8ZW0+Q29udGVudDwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERFbnRpdHlDb250ZW50IGNvbnRlbnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFybUVudGl0eVJlZigpIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQYXJtRW50aXR5UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5UmVmZXJlbmNlKCkgPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPn0nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEVudGl0eVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVudGl0eVJlZmVyZW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fScKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPn0nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgbmV3Q29tbWVudCkgewotCQlTdHJpbmcgb2xkQ29tbWVudCA9IGNvbW1lbnQ7Ci0JCWNvbW1lbnQgPSBuZXdDb21tZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQsIG9sZENvbW1lbnQsIGNvbW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXJFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckVudGl0eShib29sZWFuIG5ld1BhcmFtZXRlckVudGl0eSkgewotCQlib29sZWFuIG9sZFBhcmFtZXRlckVudGl0eSA9IHBhcmFtZXRlckVudGl0eTsKLQkJcGFyYW1ldGVyRW50aXR5ID0gbmV3UGFyYW1ldGVyRW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFksIG9sZFBhcmFtZXRlckVudGl0eSwgcGFyYW1ldGVyRW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHlDb250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQgbmV3Q29udGVudCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHlDb250ZW50IG9sZENvbnRlbnQgPSBjb250ZW50OwotCQljb250ZW50ID0gbmV3Q29udGVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgb2xkQ29udGVudCwgbmV3Q29udGVudCkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQgbmV3Q29udGVudCkgewotCQlpZiAobmV3Q29udGVudCAhPSBjb250ZW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjb250ZW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgRFRERW50aXR5Q29udGVudC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3Q29udGVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGVudCkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIERUREVudGl0eUNvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udGVudChuZXdDb250ZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBuZXdDb250ZW50LCBuZXdDb250ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZ2V0UGFybUVudGl0eVJlZigpIHsKLQkJaWYgKHBhcm1FbnRpdHlSZWYgIT0gbnVsbCAmJiBwYXJtRW50aXR5UmVmLmVJc1Byb3h5KCkpIHsKLQkJCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBvbGRQYXJtRW50aXR5UmVmID0gcGFybUVudGl0eVJlZjsKLQkJCXBhcm1FbnRpdHlSZWYgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBFY29yZVV0aWwucmVzb2x2ZShwYXJtRW50aXR5UmVmLCB0aGlzKTsKLQkJCWlmIChwYXJtRW50aXR5UmVmICE9IG9sZFBhcm1FbnRpdHlSZWYpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgb2xkUGFybUVudGl0eVJlZiwgcGFybUVudGl0eVJlZikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJtRW50aXR5UmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGJhc2ljR2V0UGFybUVudGl0eVJlZigpIHsKLQkJcmV0dXJuIHBhcm1FbnRpdHlSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG5ld1Bhcm1FbnRpdHlSZWYsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG9sZFBhcm1FbnRpdHlSZWYgPSBwYXJtRW50aXR5UmVmOwotCQlwYXJtRW50aXR5UmVmID0gbmV3UGFybUVudGl0eVJlZjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBvbGRQYXJtRW50aXR5UmVmLCBuZXdQYXJtRW50aXR5UmVmKSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG5ld1Bhcm1FbnRpdHlSZWYpIHsKLQkJaWYgKG5ld1Bhcm1FbnRpdHlSZWYgIT0gcGFybUVudGl0eVJlZikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGFybUVudGl0eVJlZiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcGFybUVudGl0eVJlZikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdQYXJtRW50aXR5UmVmICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQYXJtRW50aXR5UmVmKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFybUVudGl0eVJlZihuZXdQYXJtRW50aXR5UmVmLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIG5ld1Bhcm1FbnRpdHlSZWYsIG5ld1Bhcm1FbnRpdHlSZWYpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVudGl0eVJlZmVyZW5jZSgpIHsKLQkJaWYgKGVudGl0eVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQllbnRpdHlSZWZlcmVuY2UgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkpOwotCQl9Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgewotCQlpZiAoYXR0cmlidXRlTmFtZVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KERUREF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpIHsKLQkJaWYgKGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJYXR0cmlidXRlVHlwZVJlZmVyZW5jZSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChEVERBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlVHlwZVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNvbnRlbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIG51bGwsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb250ZW50KChEVERFbnRpdHlDb250ZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJCWlmIChwYXJtRW50aXR5UmVmICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBhcm1FbnRpdHlSZWYpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFksIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldFBhcm1FbnRpdHlSZWYoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RW50aXR5UmVmZXJlbmNlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb250ZW50KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRQYXJtRW50aXR5UmVmKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RW50aXR5UmVmZXJlbmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQgOgotCQkJCXJldHVybiBnZXRDb21tZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGlzUGFyYW1ldGVyRW50aXR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCXJldHVybiBnZXRDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldFBhcm1FbnRpdHlSZWYoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRQYXJtRW50aXR5UmVmKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldEVudGl0eVJlZmVyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSA6Ci0JCQkJc2V0UGFyYW1ldGVyRW50aXR5KCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJc2V0Q29udGVudCgoRFRERW50aXR5Q29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCXNldFBhcm1FbnRpdHlSZWYoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQlnZXRFbnRpdHlSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEVudGl0eVJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCWdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQlnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KENPTU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZIDoKLQkJCQlzZXRQYXJhbWV0ZXJFbnRpdHkoUEFSQU1FVEVSX0VOVElUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCXNldENvbnRlbnQoKERUREVudGl0eUNvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCXNldFBhcm1FbnRpdHlSZWYoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCWdldEVudGl0eVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIENPTU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbW1lbnQgIT0gbnVsbCA6ICFDT01NRU5UX0VERUZBVUxULmVxdWFscyhjb21tZW50KTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZIDoKLQkJCQlyZXR1cm4gcGFyYW1ldGVyRW50aXR5ICE9IFBBUkFNRVRFUl9FTlRJVFlfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNvbnRlbnQgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCXJldHVybiBwYXJtRW50aXR5UmVmICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGVudGl0eVJlZmVyZW5jZSAhPSBudWxsICYmICFnZXRFbnRpdHlSZWZlcmVuY2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gYXR0cmlidXRlTmFtZVJlZmVyZW5jZSAhPSBudWxsICYmICFnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgIT0gbnVsbCAmJiAhZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbWV0ZXJFbnRpdHk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGFyYW1ldGVyRW50aXR5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIERUREVudGl0eUltcGwKLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8KLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8gLy9wdWJsaWMgY2xhc3MgRFRERW50aXR5SW1wbCBleHRlbmRzIEVOYW1lc3BhY2VJbXBsIGltcGxlbWVudHMgRFRERW50aXR5LAotLy8gRU5hbWVzcGFjZSwgRFREQ29udGVudHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBCb29sZWFuIHBhcmFtZXRlckVudGl0eSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERUREVudGl0eUNvbnRlbnQgY29udGVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgZW50aXR5UmVmZXJlbmNlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgYXR0cmlidXRlTmFtZVJlZmVyZW5jZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldENvbW1lbnQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRQYXJhbWV0ZXJFbnRpdHkgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDb250ZW50ID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UGFybUVudGl0eVJlZiA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByaXZhdGUgRFREQ29udGVudEltcGwgZHRkQ29udGVudERlbGVnYXRlID0gbnVsbDsKLQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFT2JqZWN0IGluaXRJbnN0YW5jZSgpIHsKLS8vIHNldEVNZXRhT2JqKGVDbGFzc0RUREVudGl0eSgpKTsKLS8vIGluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8gcmV0dXJuIHRoaXM7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIHZvaWQgaW5pdEluc3RhbmNlRGVsZWdhdGVzKCkgewotLy8gc3VwZXIuaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLwotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkucmVmU2V0RGVsZWdhdGVPd25lcih0aGlzKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFREUGFja2FnZSBlUGFja2FnZURURCgpIHsKLS8vIHJldHVybgotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RUREVudGl0eSgpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERUREVudGl0eSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotLy8gaWYgKHRoaXMuc2V0Q29tbWVudCkgcmV0dXJuIHRoaXMuY29tbWVudDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db21tZW50KCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpIHsKLS8vIHJlZlNldFZhbHVlRm9yU2ltcGxlU0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSx0aGlzLmNvbW1lbnQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29tbWVudCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db21tZW50KCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldENvbW1lbnQoKSB7Ci0vLyByZXR1cm4gc2V0Q29tbWVudDsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBCb29sZWFuIGdldFBhcmFtZXRlckVudGl0eSgpIHsKLS8vIGlmICh0aGlzLnNldFBhcmFtZXRlckVudGl0eSkgcmV0dXJuIHRoaXMucGFyYW1ldGVyRW50aXR5OwotLy8gZWxzZSByZXR1cm4KLS8vIChCb29sZWFuKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5KCkgewotLy8gQm9vbGVhbiByZXN1bHQgPSBnZXRQYXJhbWV0ZXJFbnRpdHkoKTsKLS8vIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdC5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckVudGl0eShCb29sZWFuIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSx0aGlzLnBhcmFtZXRlckVudGl0eSx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gdmFsdWUpIHsKLS8vIHNldFBhcmFtZXRlckVudGl0eSh2YWx1ZT9Cb29sZWFuLlRSVUU6Qm9vbGVhbi5GQUxTRSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFBhcmFtZXRlckVudGl0eSgpIHsKLS8vIHJldHVybiBzZXRQYXJhbWV0ZXJFbnRpdHk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRFRERW50aXR5Q29udGVudCBnZXRDb250ZW50KCkgewotLy8gdHJ5IHsKLS8vIGlmICh0aGlzLmNvbnRlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyB0aGlzLmNvbnRlbnQgPSAoRFRERW50aXR5Q29udGVudCkKLS8vICgoSW50ZXJuYWxFT2JqZWN0KXRoaXMuY29udGVudCkucmVzb2x2ZSh0aGlzKTsKLS8vIGlmICh0aGlzLmNvbnRlbnQ9PW51bGwpIHRoaXMuc2V0Q29udGVudCA9IGZhbHNlOwotLy8gcmV0dXJuIHRoaXMuY29udGVudDsKLS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gbnVsbDsKLS8vIH0KLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQgbCkgewotLy8gcmVmU2V0VmFsdWVGb3JSZWZPYmplY3RTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29udGVudCgpLHRoaXMuY29udGVudCxsKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldENvbnRlbnQoKSB7Ci0vLyByZWZVbnNldFZhbHVlRm9yUmVmT2JqZWN0U0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSx0aGlzLmNvbnRlbnQpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0Q29udGVudCgpIHsKLS8vIHJldHVybiBzZXRDb250ZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBnZXRQYXJtRW50aXR5UmVmKCkgewotLy8gdHJ5IHsKLS8vIGlmICh0aGlzLnBhcm1FbnRpdHlSZWYgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyB0aGlzLnBhcm1FbnRpdHlSZWYgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKQotLy8gKChJbnRlcm5hbEVPYmplY3QpdGhpcy5wYXJtRW50aXR5UmVmKS5yZXNvbHZlKHRoaXMsCi0vLyBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpKTsKLS8vIGlmICh0aGlzLnBhcm1FbnRpdHlSZWY9PW51bGwpIHRoaXMuc2V0UGFybUVudGl0eVJlZiA9IGZhbHNlOwotLy8gcmV0dXJuIHRoaXMucGFybUVudGl0eVJlZjsKLS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gbnVsbDsKLS8vIH0KLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRQYXJtRW50aXR5UmVmKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBsKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNWUmVmZXJlbmNlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksdGhpcy5wYXJtRW50aXR5UmVmLGwpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0UGFybUVudGl0eVJlZigpIHsKLS8vIHJlZlVuc2V0VmFsdWVGb3JTVlJlZmVyZW5jZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLHRoaXMucGFybUVudGl0eVJlZik7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRQYXJtRW50aXR5UmVmKCkgewotLy8gcmV0dXJuIHNldFBhcm1FbnRpdHlSZWY7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRUxpc3QgZ2V0RW50aXR5UmVmZXJlbmNlKCkgewotLy8gaWYgKHRoaXMuZW50aXR5UmVmZXJlbmNlPT1udWxsKSB7Ci0vLyB0aGlzLmVudGl0eVJlZmVyZW5jZT1uZXdDb2xsZWN0aW9uKHRoaXMsRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHlSZWZlcmVuY2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpIHsKLS8vIGlmICh0aGlzLmF0dHJpYnV0ZU5hbWVSZWZlcmVuY2U9PW51bGwpIHsKLS8vIHRoaXMuYXR0cmlidXRlTmFtZVJlZmVyZW5jZT1uZXdDb2xsZWN0aW9uKHRoaXMsRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSwKLS8vIHRydWUpOwotLy8gfQotLy8gcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZVJlZmVyZW5jZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkgewotLy8gaWYgKHRoaXMuYXR0cmlidXRlVHlwZVJlZmVyZW5jZT09bnVsbCkgewotLy8gdGhpcy5hdHRyaWJ1dGVUeXBlUmVmZXJlbmNlPW5ld0NvbGxlY3Rpb24odGhpcyxEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVUeXBlUmVmZXJlbmNlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHJldHVybiBnZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogcmV0dXJuIGdldFBhcmFtZXRlckVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHJldHVybiBnZXRDb250ZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiByZXR1cm4gZ2V0UGFybUVudGl0eVJlZigpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0U6IHJldHVybiBnZXRFbnRpdHlSZWZlcmVuY2UoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0U6IHJldHVybgotLy8gZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRTogcmV0dXJuCi0vLyBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEU6IHJldHVybiBnZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDoKLS8vIHJldHVybiB0aGlzLnNldENvbW1lbnQ/IHRoaXMuY29tbWVudCA6IG51bGw7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWToKLS8vIHJldHVybiB0aGlzLnNldFBhcmFtZXRlckVudGl0eT8gdGhpcy5wYXJhbWV0ZXJFbnRpdHkgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6Ci0vLyBpZiAoIXRoaXMuc2V0Q29udGVudHx8dGhpcy5jb250ZW50PT1udWxsKSByZXR1cm4gbnVsbDsKLS8vIGlmICgoKEludGVybmFsRU9iamVjdCl0aGlzLmNvbnRlbnQpLnJlZklzRGVsZXRlZCgpKSB7dGhpcy5jb250ZW50PW51bGw7Ci0vLyB0aGlzLnNldENvbnRlbnQ9ZmFsc2U7fQotLy8gcmV0dXJuIHRoaXMuY29udGVudDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6Ci0vLyBpZiAoIXRoaXMuc2V0UGFybUVudGl0eVJlZnx8dGhpcy5wYXJtRW50aXR5UmVmPT1udWxsKSByZXR1cm4gbnVsbDsKLS8vIGlmICgoKEludGVybmFsRU9iamVjdCl0aGlzLnBhcm1FbnRpdHlSZWYpLnJlZklzRGVsZXRlZCgpKQotLy8ge3RoaXMucGFybUVudGl0eVJlZj1udWxsOyB0aGlzLnNldFBhcm1FbnRpdHlSZWY9ZmFsc2U7fQotLy8gcmV0dXJuIHRoaXMucGFybUVudGl0eVJlZjsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFOgotLy8gcmV0dXJuIHRoaXMuZW50aXR5UmVmZXJlbmNlOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRToKLS8vIHJldHVybiB0aGlzLmF0dHJpYnV0ZU5hbWVSZWZlcmVuY2U7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFOgotLy8gcmV0dXJuIHRoaXMuYXR0cmlidXRlVHlwZVJlZmVyZW5jZTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogcmV0dXJuCi0vLyAoKEludGVybmFsRU9iamVjdClnZXREdGRDb250ZW50RGVsZWdhdGUoKSkucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHJldHVybiBpc1NldENvbW1lbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOiByZXR1cm4KLS8vIGlzU2V0UGFyYW1ldGVyRW50aXR5KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogcmV0dXJuIGlzU2V0Q29udGVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogcmV0dXJuIGlzU2V0UGFybUVudGl0eVJlZigpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFOiByZXR1cm4gaXNTZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiB7Ci0vLyBzZXRDb21tZW50KChTdHJpbmcpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHsKLS8vIHNldFBhcmFtZXRlckVudGl0eSgobmV3VmFsdWUgaW5zdGFuY2VvZgotLy8gU3RyaW5nKT9Cb29sZWFuLnZhbHVlT2YoKFN0cmluZyluZXdWYWx1ZSk6KEJvb2xlYW4pbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHsKLS8vIHNldENvbnRlbnQoKERUREVudGl0eUNvbnRlbnQpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogewotLy8gc2V0UGFybUVudGl0eVJlZigoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSAoU3RyaW5nKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRDb21tZW50ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJhbWV0ZXJFbnRpdHk7Ci0vLyB0aGlzLnBhcmFtZXRlckVudGl0eSA9IChCb29sZWFuKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQYXJhbWV0ZXJFbnRpdHkgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29udGVudDsKLS8vIHRoaXMuY29udGVudCA9IChEVERFbnRpdHlDb250ZW50KW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRDb250ZW50ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcm1FbnRpdHlSZWY7Ci0vLyB0aGlzLnBhcm1FbnRpdHlSZWYgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQYXJtRW50aXR5UmVmID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVCYXNpY1NldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHsKLS8vIHVuc2V0Q29tbWVudCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHsKLS8vIHVuc2V0UGFyYW1ldGVyRW50aXR5KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogewotLy8gdW5zZXRDb250ZW50KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiB7Ci0vLyB1bnNldFBhcm1FbnRpdHlSZWYoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogewotLy8gdW5zZXREVERGaWxlKCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gcmVmQmFzaWNVbnNldFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSBudWxsOwotLy8gdGhpcy5zZXRDb21tZW50ID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSxvbGRWYWx1ZSxnZXRDb21tZW50KCkpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFyYW1ldGVyRW50aXR5OwotLy8gdGhpcy5wYXJhbWV0ZXJFbnRpdHkgPSBudWxsOwotLy8gdGhpcy5zZXRQYXJhbWV0ZXJFbnRpdHkgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCksb2xkVmFsdWUsZ2V0UGFyYW1ldGVyRW50aXR5KCkpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29udGVudDsKLS8vIHRoaXMuY29udGVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbnRlbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29udGVudCgpLG9sZFZhbHVlLG51bGwpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJtRW50aXR5UmVmOwotLy8gdGhpcy5wYXJtRW50aXR5UmVmID0gbnVsbDsKLS8vIHRoaXMuc2V0UGFybUVudGl0eVJlZiA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksb2xkVmFsdWUsbnVsbCk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRFREQ29udGVudEltcGwgZ2V0RHRkQ29udGVudERlbGVnYXRlKCkgewotLy8gaWYgKGR0ZENvbnRlbnREZWxlZ2F0ZSA9PSBudWxsKSB7Ci0vLyBEVERQYWNrYWdlIHBrZyA9Ci0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gZHRkQ29udGVudERlbGVnYXRlPShEVERDb250ZW50SW1wbClwa2cuZUNyZWF0ZUluc3RhbmNlKHBrZy5EVERfQ09OVEVOVCk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGUuaW5pdEluc3RhbmNlKCk7Ci0vLyB9Ci0vLyByZXR1cm4gZHRkQ29udGVudERlbGVnYXRlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFREQ29udGVudCgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5lQ2xhc3MoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmdldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXREVERGaWxlKERUREZpbGUgdmFsdWUpIHsKLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnNldERUREZpbGUodmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0RFRERmlsZSgpIHsKLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnVuc2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5pc1NldERUREZpbGUoKTsKLS8vIH0KLS8vIH0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTdmZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uQ2hhaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgewotCi0JcHVibGljIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlEVERFbnRpdHkgZSA9IGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCWlmIChlID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkgewotCQlEVERFbnRpdHkgZW50aXR5UmVmID0gZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJaWYgKGVudGl0eVJlZi5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQlyZXR1cm4gIiUiICsgZ2V0Q29udGVudE5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiYiICsgZ2V0Q29udGVudE5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5IGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkgewotCQlpZiAoZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCAmJiBlbGVtZW50UmVmZXJlbmNlZEVudGl0eS5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbnRpdHkgb2xkRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eTsKLQkJCWVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gKERUREVudGl0eSkgRWNvcmVVdGlsLnJlc29sdmUoZWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIHRoaXMpOwotCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZLCBvbGRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSwgZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgYmFzaWNHZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFRERW50aXR5IG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JCWVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFksIG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkgewotCQlpZiAobmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkobmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFksIG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldE9jY3VycmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBvY2N1cnJlbmNlICE9IE9DQ1VSUkVOQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKChEVERPY2N1cnJlbmNlVHlwZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKE9DQ1VSUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW51bWVyYXRpb25UeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudW1lcmF0aW9uVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzZjY1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW51bWVyYXRpb25UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRW51bUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVudW1lcmF0aW9uVHlwZUltcGwgZXh0ZW5kcyBFRW51bUltcGwgaW1wbGVtZW50cyBEVERFbnVtZXJhdGlvblR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERUREVudW1Hcm91cEtpbmQgS0lORF9FREVGQVVMVCA9IERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgZW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb25zW10gPSB7RFREQ29yZU1lc3NhZ2VzLl9VSV9FTlVNX05BTUVfVE9LRU5TX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfRU5VTV9OT1RBVElPTl9ERVNDfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBlbnVtZXJhdGlvblR5cGVLaW5kc1tdID0ge0RUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUCwgRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUH07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW51bUdyb3VwS2luZCBraW5kID0gS0lORF9FREVGQVVMVDsKLQotCXB1YmxpYyBEVERFbnVtZXJhdGlvblR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudW1lcmF0aW9uVHlwZSgpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFbnVtTGl0ZXJhbHMoKSB7Ci0JCXJldHVybiBnZXRFTGl0ZXJhbHMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0RW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb24oZ2V0S2luZCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uKGludCBraW5kKSB7Ci0JCS8vIGl0IGNhbiBvbmx5IGJlIDEgb3IgMiwgYnV0IG1heWJlIGxhdGVyLi4uCi0JCWlmIChraW5kID49IDEgJiYga2luZCA8PSAyKSB7Ci0JCQkvLyB3ZSBzdWJ0cmFjdCAxIHNpbmNlIHRoZSBraW5kIGlzIDEgLSBiYXNlZCBub3QgemVybyBiYXNlZAotCQkJcmV0dXJuIGVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uc1traW5kIC0gMV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJLy8gVEJECi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVudW1Hcm91cEtpbmQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtpbmQoRFRERW51bUdyb3VwS2luZCBuZXdLaW5kKSB7Ci0JCURUREVudW1Hcm91cEtpbmQgb2xkS2luZCA9IGtpbmQ7Ci0JCWtpbmQgPSBuZXdLaW5kID09IG51bGwgPyBLSU5EX0VERUZBVUxUIDogbmV3S2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCwgb2xkS2luZCwga2luZCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERGaWxlKSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSBuZXdEVERGaWxlKSB7Ci0JCWlmIChuZXdEVERGaWxlICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgJiYgbmV3RFRERmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUsIG5ld0RUREZpbGUsIG5ld0RUREZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVMaXRlcmFscygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFTGl0ZXJhbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19TRVJJQUxJWkFCTEUgOgotCQkJCXJldHVybiBpc1NlcmlhbGl6YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTIDoKLQkJCQlyZXR1cm4gZ2V0RUxpdGVyYWxzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgOgotCQkJCXJldHVybiBnZXRLaW5kKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWdldEVBbm5vdGF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fTkFNRSA6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3NOYW1lICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzc05hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3MpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU0VSSUFMSVpBQkxFX0VGTEFHKSAhPSAwKSAhPSBTRVJJQUxJWkFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJcmV0dXJuIGVMaXRlcmFscyAhPSBudWxsICYmICFnZXRFTGl0ZXJhbHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgOgotCQkJCXJldHVybiBraW5kICE9IEtJTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgOgotCQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoKENsYXNzKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19TRVJJQUxJWkFCTEUgOgotCQkJCXNldFNlcmlhbGl6YWJsZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCWdldEVMaXRlcmFscygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUxpdGVyYWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EIDoKLQkJCQlzZXRLaW5kKChEVERFbnVtR3JvdXBLaW5kKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZShJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzKElOU1RBTkNFX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA6Ci0JCQkJc2V0U2VyaWFsaXphYmxlKFNFUklBTElaQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCWdldEVMaXRlcmFscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EIDoKLQkJCQlzZXRLaW5kKEtJTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGtpbmQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoa2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREV4dGVybmFsRW50aXR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREV4dGVybmFsRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmI1ZDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFeHRlcm5hbEVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERXh0ZXJuYWxFbnRpdHlJbXBsIGV4dGVuZHMgRFRERW50aXR5Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERFeHRlcm5hbEVudGl0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5c3RlbUlEKCkgPGVtPlN5c3RlbSBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFN5c3RlbUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IFNZU1RFTV9JRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVibGljSUQoKSA8ZW0+UHVibGljIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0UHVibGljSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lEID0gUFVCTElDX0lEX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVEROb3RhdGlvbiBub3RhdGlvbiA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREZpbGUgZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IG51bGw7Ci0KLQlwdWJsaWMgRFRERXh0ZXJuYWxFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREV4dGVybmFsRW50aXR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJaWYgKGdldFB1YmxpY0lEKCkgPT0gbnVsbCB8fCBnZXRQdWJsaWNJRCgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGV4dC5hcHBlbmQoIlNZU1RFTSAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJdGV4dC5hcHBlbmQoIlBVQkxJQyBcIiIpLmFwcGVuZChnZXRQdWJsaWNJRCgpKS5hcHBlbmQoIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlTdHJpbmcgc3lzdGVtSWQgPSBnZXRTeXN0ZW1JRCgpOwotCi0JCXRleHQuYXBwZW5kKCJcIiIpLmFwcGVuZChzeXN0ZW1JZCkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlEVEROb3RhdGlvbiBub3RhdGlvbiA9IGdldE5vdGF0aW9uKCk7Ci0JCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJdGV4dC5hcHBlbmQoIiBOREFUQSAiKS5hcHBlbmQobm90YXRpb24uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlEKCkgewotCQlyZXR1cm4gc3lzdGVtSUQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIG5ld1N5c3RlbUlEKSB7Ci0JCVN0cmluZyBvbGRTeXN0ZW1JRCA9IHN5c3RlbUlEOwotCQlzeXN0ZW1JRCA9IG5ld1N5c3RlbUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCwgb2xkU3lzdGVtSUQsIHN5c3RlbUlEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotCQlyZXR1cm4gcHVibGljSUQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIG5ld1B1YmxpY0lEKSB7Ci0JCVN0cmluZyBvbGRQdWJsaWNJRCA9IHB1YmxpY0lEOwotCQlwdWJsaWNJRCA9IG5ld1B1YmxpY0lEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCwgb2xkUHVibGljSUQsIHB1YmxpY0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gZ2V0Tm90YXRpb24oKSB7Ci0JCWlmIChub3RhdGlvbiAhPSBudWxsICYmIG5vdGF0aW9uLmVJc1Byb3h5KCkpIHsKLQkJCURURE5vdGF0aW9uIG9sZE5vdGF0aW9uID0gbm90YXRpb247Ci0JCQlub3RhdGlvbiA9IChEVEROb3RhdGlvbikgRWNvcmVVdGlsLnJlc29sdmUobm90YXRpb24sIHRoaXMpOwotCQkJaWYgKG5vdGF0aW9uICE9IG9sZE5vdGF0aW9uKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgb2xkTm90YXRpb24sIG5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gYmFzaWNHZXROb3RhdGlvbigpIHsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXROb3RhdGlvbihEVEROb3RhdGlvbiBuZXdOb3RhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVEROb3RhdGlvbiBvbGROb3RhdGlvbiA9IG5vdGF0aW9uOwotCQlub3RhdGlvbiA9IG5ld05vdGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgb2xkTm90YXRpb24sIG5ld05vdGF0aW9uKSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb24oRFRETm90YXRpb24gbmV3Tm90YXRpb24pIHsKLQkJaWYgKG5ld05vdGF0aW9uICE9IG5vdGF0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbm90YXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFksIERURE5vdGF0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdOb3RhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Tm90YXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFksIERURE5vdGF0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE5vdGF0aW9uKG5ld05vdGF0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgbmV3Tm90YXRpb24sIG5ld05vdGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkgewotCQlpZiAoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBudWxsICYmIGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUuZUlzUHJveHkoKSkgewotCQkJRFRERmlsZSBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlID0gZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZTsKLQkJCWVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPSAoRFRERmlsZSkgRWNvcmVVdGlsLnJlc29sdmUoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSwgdGhpcyk7Ci0JCQlpZiAoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSwgb2xkRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSwgZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBiYXNpY0dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKSB7Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoRFRERmlsZSBuZXdFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSB7Ci0JCURUREZpbGUgb2xkRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGU7Ci0JCWVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPSBuZXdFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFLCBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlLCBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBub3RhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSwgRFRETm90YXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXROb3RhdGlvbigoRFRETm90YXRpb24pIG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCQlyZXR1cm4gYmFzaWNTZXROb3RhdGlvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQgOgotCQkJCXJldHVybiBnZXRTeXN0ZW1JRCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJcmV0dXJuIGdldFB1YmxpY0lEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0Tm90YXRpb24oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXROb3RhdGlvbigpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIFNZU1RFTV9JRF9FREVGQVVMVCA9PSBudWxsID8gc3lzdGVtSUQgIT0gbnVsbCA6ICFTWVNURU1fSURfRURFRkFVTFQuZXF1YWxzKHN5c3RlbUlEKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBQVUJMSUNfSURfRURFRkFVTFQgPT0gbnVsbCA/IHB1YmxpY0lEICE9IG51bGwgOiAhUFVCTElDX0lEX0VERUZBVUxULmVxdWFscyhwdWJsaWNJRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXJldHVybiBub3RhdGlvbiAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJc2V0U3lzdGVtSUQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQgOgotCQkJCXNldFB1YmxpY0lEKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXNldE5vdGF0aW9uKChEVEROb3RhdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSA6Ci0JCQkJc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQgOgotCQkJCXNldFN5c3RlbUlEKFNZU1RFTV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoUFVCTElDX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXNldE5vdGF0aW9uKChEVEROb3RhdGlvbikgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlzZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzeXN0ZW1JRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzeXN0ZW1JRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVibGljSUQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHVibGljSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGVmYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIERUREZhY3RvcnkgewotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX05PTkU7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfQ0RBVEE7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSUQ7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSURSRUY7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSURSRUZTOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX0VOVElUWTsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9FTlRJVElFUzsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9OTVRPS0VOOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX05NVE9LRU5TOwotCi0KLQotCXB1YmxpYyBzdGF0aWMgRFRERmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIChEVERGYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9OT05FLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk9ORSgpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9OT05FID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfTk9ORSA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuQ0RBVEFfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9OT05FOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9DREFUQS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX0NEQVRBID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfQ0RBVEEgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLkNEQVRBX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0lELgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfSUQoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfSUQgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9JRCA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuSURfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9JRDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfSURSRUYuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9JRFJFRigpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9JRFJFRiA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0lEUkVGID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5JRFJFRl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0lEUkVGOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9JRFJFRlMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9JRFJFRlMoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfSURSRUZTID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfSURSRUZTID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5JRFJFRlNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9JRFJFRlM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0VOVElUWS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9FTlRJVFkgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9FTlRJVFkgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLkVOVElUWV9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0VOVElUWTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfRU5USVRJRVMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9FTlRJVElFUygpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9FTlRJVElFUyA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0VOVElUSUVTID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5FTlRJVElFU19MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0VOVElUSUVTOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9OTVRPS0VOLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk1UT0tFTigpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9OTVRPS0VOID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfTk1UT0tFTiA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX05NVE9LRU47Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX05NVE9LRU5TLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk1UT0tFTlMoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfTk1UT0tFTlMgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9OTVRPS0VOUyA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTlNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9OTVRPS0VOUzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREQW55Q29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREQmFzaWNUeXBlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT04gOgotCQkJCXJldHVybiBjcmVhdGVEVEROb3RhdGlvbigpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFkgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBjcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9PQ0NVUlJFTkNFX1RZUEUgOgotCQkJCXJldHVybiBEVERPY2N1cnJlbmNlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gRFRERGVmYXVsdEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfS0lORCA6Ci0JCQkJcmV0dXJuIERUREJhc2ljVHlwZUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1fR1JPVVBfS0lORCA6Ci0JCQkJcmV0dXJuIERUREVudW1Hcm91cEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBEVERHcm91cEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUgOgotCQkJCXJldHVybiBYTUxTY2hlbWFEZWZpbmVkVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfT0NDVVJSRU5DRV9UWVBFIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTV9HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfS0lORCA6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUgOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRER3JvdXBDb250ZW50IGNyZWF0ZURUREdyb3VwQ29udGVudCgpIHsKLQkJRFRER3JvdXBDb250ZW50SW1wbCBkdGRHcm91cENvbnRlbnQgPSBuZXcgRFRER3JvdXBDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkR3JvdXBDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQXR0cmlidXRlIGNyZWF0ZURUREF0dHJpYnV0ZSgpIHsKLQkJRFREQXR0cmlidXRlSW1wbCBkdGRBdHRyaWJ1dGUgPSBuZXcgRFREQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4gZHRkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBjcmVhdGVEVERFbGVtZW50KCkgewotCQlEVERFbGVtZW50SW1wbCBkdGRFbGVtZW50ID0gbmV3IERUREVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW1wdHlDb250ZW50IGNyZWF0ZURUREVtcHR5Q29udGVudCgpIHsKLQkJRFRERW1wdHlDb250ZW50SW1wbCBkdGRFbXB0eUNvbnRlbnQgPSBuZXcgRFRERW1wdHlDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkRW1wdHlDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQW55Q29udGVudCBjcmVhdGVEVERBbnlDb250ZW50KCkgewotCQlEVERBbnlDb250ZW50SW1wbCBkdGRBbnlDb250ZW50ID0gbmV3IERUREFueUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRBbnlDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUENEYXRhQ29udGVudCBjcmVhdGVEVERQQ0RhdGFDb250ZW50KCkgewotCQlEVERQQ0RhdGFDb250ZW50SW1wbCBkdGRwY0RhdGFDb250ZW50ID0gbmV3IERURFBDRGF0YUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRwY0RhdGFDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudCA9IG5ldyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwoKTsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBjcmVhdGVEVERGaWxlKCkgewotCQlEVERGaWxlSW1wbCBkdGRGaWxlID0gbmV3IERUREZpbGVJbXBsKCk7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQmFzaWNUeXBlIGNyZWF0ZURUREJhc2ljVHlwZSgpIHsKLQkJRFREQmFzaWNUeXBlSW1wbCBkdGRCYXNpY1R5cGUgPSBuZXcgRFREQmFzaWNUeXBlSW1wbCgpOwotCQlyZXR1cm4gZHRkQmFzaWNUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJRFRERW51bWVyYXRpb25UeXBlSW1wbCBkdGRFbnVtZXJhdGlvblR5cGUgPSBuZXcgRFRERW51bWVyYXRpb25UeXBlSW1wbCgpOwotCQlyZXR1cm4gZHRkRW51bWVyYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gY3JlYXRlRFRETm90YXRpb24oKSB7Ci0JCURURE5vdGF0aW9uSW1wbCBkdGROb3RhdGlvbiA9IG5ldyBEVEROb3RhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGR0ZE5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGNyZWF0ZURUREVudGl0eSgpIHsKLQkJRFRERW50aXR5SW1wbCBkdGRFbnRpdHkgPSBuZXcgRFRERW50aXR5SW1wbCgpOwotCQlyZXR1cm4gZHRkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERXh0ZXJuYWxFbnRpdHkgY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKSB7Ci0JCURUREV4dGVybmFsRW50aXR5SW1wbCBkdGRFeHRlcm5hbEVudGl0eSA9IG5ldyBEVERFeHRlcm5hbEVudGl0eUltcGwoKTsKLQkJcmV0dXJuIGR0ZEV4dGVybmFsRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRESW50ZXJuYWxFbnRpdHkgY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKSB7Ci0JCURUREludGVybmFsRW50aXR5SW1wbCBkdGRJbnRlcm5hbEVudGl0eSA9IG5ldyBEVERJbnRlcm5hbEVudGl0eUltcGwoKTsKLQkJcmV0dXJuIGR0ZEludGVybmFsRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpIHsKLQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgPSBuZXcgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCgpOwotCQlyZXR1cm4gZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkgewotCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50ID0gbmV3IERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFja2FnZSBnZXREVERQYWNrYWdlKCkgewotCQlyZXR1cm4gKERURFBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZpbGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4NDZkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5hbWVkRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFByaW50ZXI7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREZpbGVJbXBsI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERmlsZUltcGwjaXNQYXJzZUVycm9yIDxlbT5QYXJzZSBFcnJvcjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbCNnZXREVERDb250ZW50IDxlbT5EVEQgQ29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbCNnZXREVERFbnVtZXJhdGlvblR5cGUgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREZpbGVJbXBsIGV4dGVuZHMgRU5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBEVERGaWxlLCBFTmFtZWRFbGVtZW50IHsKLQotCXB1YmxpYyBFTGlzdCBnZXREVERPYmplY3QoKSB7Ci0JCXJldHVybiBnZXREVERDb250ZW50KCk7Ci0JfQotCi0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRMaXN0T2YoRFRERWxlbWVudC5jbGFzcywgbnVsbCk7Ci0JfQotCi0KLQlwdWJsaWMgTGlzdCBsaXN0RFRETm90YXRpb24oKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERURE5vdGF0aW9uLmNsYXNzLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERW50aXR5KCkgewotCQlyZXR1cm4gZ2V0Q29udGVudExpc3RPZihEVERFbnRpdHkuY2xhc3MsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMaXN0IGxpc3REVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIExpc3QgbGlzdERUREVsZW1lbnRBbmREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERUREVsZW1lbnQuY2xhc3MsIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldENvbnRlbnRMaXN0T2YoQ2xhc3MgY2xhc3MxLCBDbGFzcyBjbGFzczIpIHsKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpID0gZ2V0RFREQ29udGVudCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKGNsYXNzMS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQl2LmFkZChvYmopOwotCQkJfQotCQkJZWxzZSBpZiAoKGNsYXNzMiAhPSBudWxsKSAmJiAoY2xhc3MyLmlzSW5zdGFuY2Uob2JqKSkpIHsKLQkJCQl2LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3REVERFbGVtZW50KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGUgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpZiAoZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERUREVudGl0eSBmaW5kRW50aXR5KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3REVERFbnRpdHkoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURUREVudGl0eSBlID0gKERUREVudGl0eSkgaS5uZXh0KCk7Ci0JCQlpZiAoZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERURE5vdGF0aW9uIGZpbmROb3RhdGlvbihTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0RFRETm90YXRpb24oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURURE5vdGF0aW9uIGUgPSAoRFRETm90YXRpb24pIGkubmV4dCgpOwotCQkJaWYgKGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZmluZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZSA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIGkubmV4dCgpOwotCQkJaWYgKGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZShib29sZWFuIGluY2x1ZGUpIHsKLQkJRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIodHJ1ZSk7Ci0JCXByaW50ZXIudmlzaXREVERGaWxlKHRoaXMpOwotCQlyZXR1cm4gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlPYmplY3RbXSByZXN1bHQgPSBEVERQYXRobmFtZVV0aWwucGFyc2VQYXRoQ29tcG9uZW50KHJlbGF0aXZlUGF0aCk7Ci0KLQotCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHJlc3VsdFswXTsKLQotCi0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCi0JCVN0cmluZyBuYW1lID0gKFN0cmluZykgcmVzdWx0WzFdOwotCi0JCURURE9iamVjdCBvYmogPSBudWxsOwotCQlpZiAodHlwZS5lcXVhbHMoIkVsZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlvYmogPSBmaW5kRWxlbWVudChuYW1lKTsKLQkJfQotCQllbHNlIGlmICh0eXBlLmVxdWFscygiRW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJb2JqID0gZmluZEVudGl0eShuYW1lKTsKLQkJfQotCQllbHNlIGlmICh0eXBlLmVxdWFscygiUEVudCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9iaiA9IGZpbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UobmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoIk5vdGEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlvYmogPSBmaW5kTm90YXRpb24obmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJU3RyaW5nIHJlc3RQYXRoID0gKFN0cmluZykgcmVzdWx0WzNdOwotCi0JCWlmICgocmVzdFBhdGggPT0gbnVsbCkgfHwgKG9iaiA9PSBudWxsKSkgewotCQkJcmV0dXJuIG9iajsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBvYmouZmluZE9iamVjdChyZXN0UGF0aCk7Ci0JCX0KLQl9Ci0KLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gQ09NTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1BhcnNlRXJyb3IoKSA8ZW0+UGFyc2UgRXJyb3I8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1BhcnNlRXJyb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQQVJTRV9FUlJPUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJzZUVycm9yKCkgPGVtPlBhcnNlIEVycm9yPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjaXNQYXJzZUVycm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUVycm9yID0gUEFSU0VfRVJST1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREVERDb250ZW50KCkgPGVtPkRURCBDb250ZW50PC9lbT59JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERURENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkdGRDb250ZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERUREVudW1lcmF0aW9uVHlwZSgpIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkdGRFbnVtZXJhdGlvblR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERGaWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlRXJyb3IoKSB7Ci0JCXJldHVybiBwYXJzZUVycm9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZUVycm9yKGJvb2xlYW4gbmV3UGFyc2VFcnJvcikgewotCQlib29sZWFuIG9sZFBhcnNlRXJyb3IgPSBwYXJzZUVycm9yOwotCQlwYXJzZUVycm9yID0gbmV3UGFyc2VFcnJvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1IsIG9sZFBhcnNlRXJyb3IsIHBhcnNlRXJyb3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERURENvbnRlbnQoKSB7Ci0JCWlmIChkdGRDb250ZW50ID09IG51bGwpIHsKLQkJCWR0ZENvbnRlbnQgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChEVERDb250ZW50LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUpOwotCQl9Ci0JCXJldHVybiBkdGRDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RFRERW51bWVyYXRpb25UeXBlKCkgewotCQlpZiAoZHRkRW51bWVyYXRpb25UeXBlID09IG51bGwpIHsKLQkJCWR0ZEVudW1lcmF0aW9uVHlwZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KERUREVudW1lcmF0aW9uVHlwZS5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFKTsKLQkJfQotCQlyZXR1cm4gZHRkRW51bWVyYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RFREQ29udGVudCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERUREVudW1lcmF0aW9uVHlwZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERURENvbnRlbnQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERFbnVtZXJhdGlvblR5cGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQgOgotCQkJCXJldHVybiBnZXRDb21tZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SIDoKLQkJCQlyZXR1cm4gaXNQYXJzZUVycm9yKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGdldERURENvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCXJldHVybiBnZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SIDoKLQkJCQlzZXRQYXJzZUVycm9yKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQlnZXREVERDb250ZW50KCkuY2xlYXIoKTsKLQkJCQlnZXREVERDb250ZW50KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuY2xlYXIoKTsKLQkJCQlnZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudChDT01NRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SIDoKLQkJCQlzZXRQYXJzZUVycm9yKFBBUlNFX0VSUk9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQlnZXREVERDb250ZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFIDoKLQkJCQlnZXREVERFbnVtZXJhdGlvblR5cGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIENPTU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbW1lbnQgIT0gbnVsbCA6ICFDT01NRU5UX0VERUZBVUxULmVxdWFscyhjb21tZW50KTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1IgOgotCQkJCXJldHVybiBwYXJzZUVycm9yICE9IFBBUlNFX0VSUk9SX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGR0ZENvbnRlbnQgIT0gbnVsbCAmJiAhZ2V0RFREQ29udGVudCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCXJldHVybiBkdGRFbnVtZXJhdGlvblR5cGUgIT0gbnVsbCAmJiAhZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcnNlRXJyb3I6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGFyc2VFcnJvcik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVERGaWxlSW1wbAotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLwotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLyAvL3B1YmxpYyBjbGFzcyBEVERGaWxlSW1wbCBleHRlbmRzIEVOYW1lc3BhY2VJbXBsIGltcGxlbWVudHMgRFRERmlsZSwKLS8vIEVOYW1lc3BhY2V7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbgotLy8gMjAwMi4iOwotLy8KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBCb29sZWFuIHBhcnNlRXJyb3IgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBFTGlzdCBkdGRDb250ZW50ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgZHRkRW51bWVyYXRpb25UeXBlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDb21tZW50ID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UGFyc2VFcnJvciA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFT2JqZWN0IGluaXRJbnN0YW5jZSgpIHsKLS8vIHNldEVNZXRhT2JqKGVDbGFzc0RUREZpbGUoKSk7Ci0vLyBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vIHJldHVybiB0aGlzOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERQYWNrYWdlIGVQYWNrYWdlRFREKCkgewotLy8gcmV0dXJuCi0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFRERmlsZSgpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLS8vIGlmICh0aGlzLnNldENvbW1lbnQpIHJldHVybiB0aGlzLmNvbW1lbnQ7Ci0vLyBlbHNlIHJldHVybgotLy8gKFN0cmluZylEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSkgewotLy8gcmVmU2V0VmFsdWVGb3JTaW1wbGVTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKSx0aGlzLmNvbW1lbnQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29tbWVudCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfQ29tbWVudCgpKSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRDb21tZW50KCkgewotLy8gcmV0dXJuIHNldENvbW1lbnQ7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgQm9vbGVhbiBnZXRQYXJzZUVycm9yKCkgewotLy8gaWYgKHRoaXMuc2V0UGFyc2VFcnJvcikgcmV0dXJuIHRoaXMucGFyc2VFcnJvcjsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoQm9vbGVhbilEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzUGFyc2VFcnJvcigpIHsKLS8vIEJvb2xlYW4gcmVzdWx0ID0gZ2V0UGFyc2VFcnJvcigpOwotLy8gcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyc2VFcnJvcihCb29sZWFuIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfUGFyc2VFcnJvcigpLHRoaXMucGFyc2VFcnJvcix2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyc2VFcnJvcihib29sZWFuIHZhbHVlKSB7Ci0vLyBzZXRQYXJzZUVycm9yKHZhbHVlP0Jvb2xlYW4uVFJVRTpCb29sZWFuLkZBTFNFKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldFBhcnNlRXJyb3IoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0UGFyc2VFcnJvcigpIHsKLS8vIHJldHVybiBzZXRQYXJzZUVycm9yOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldERURENvbnRlbnQoKSB7Ci0vLyBpZiAodGhpcy5kdGRDb250ZW50PT1udWxsKSB7Ci0vLyB0aGlzLmR0ZENvbnRlbnQ9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfRFREQ29udGVudCgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5kdGRDb250ZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldERUREVudW1lcmF0aW9uVHlwZSgpIHsKLS8vIGlmICh0aGlzLmR0ZEVudW1lcmF0aW9uVHlwZT09bnVsbCkgewotLy8gdGhpcy5kdGRFbnVtZXJhdGlvblR5cGU9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCksCi0vLyB0cnVlKTsKLS8vIH0KLS8vIHJldHVybiB0aGlzLmR0ZEVudW1lcmF0aW9uVHlwZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHJldHVybiBnZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiByZXR1cm4gZ2V0UGFyc2VFcnJvcigpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVDogcmV0dXJuIGdldERURENvbnRlbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEU6IHJldHVybgotLy8gZ2V0RFRERW51bWVyYXRpb25UeXBlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOgotLy8gcmV0dXJuIHRoaXMuc2V0Q29tbWVudD8gdGhpcy5jb21tZW50IDogbnVsbDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6Ci0vLyByZXR1cm4gdGhpcy5zZXRQYXJzZUVycm9yPyB0aGlzLnBhcnNlRXJyb3IgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVDoKLS8vIHJldHVybiB0aGlzLmR0ZENvbnRlbnQ7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFOgotLy8gcmV0dXJuIHRoaXMuZHRkRW51bWVyYXRpb25UeXBlOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiByZXR1cm4gaXNTZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiByZXR1cm4gaXNTZXRQYXJzZUVycm9yKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHsKLS8vIHNldENvbW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiB7Ci0vLyBzZXRQYXJzZUVycm9yKChuZXdWYWx1ZSBpbnN0YW5jZW9mCi0vLyBTdHJpbmcpP0Jvb2xlYW4udmFsdWVPZigoU3RyaW5nKW5ld1ZhbHVlKTooQm9vbGVhbiluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IChTdHJpbmcpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcnNlRXJyb3I7Ci0vLyB0aGlzLnBhcnNlRXJyb3IgPSAoQm9vbGVhbiluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0UGFyc2VFcnJvciA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfUGFyc2VFcnJvcigpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiB7Ci0vLyB1bnNldENvbW1lbnQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHsKLS8vIHVuc2V0UGFyc2VFcnJvcigpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSBudWxsOwotLy8gdGhpcy5zZXRDb21tZW50ID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9Db21tZW50KCksb2xkVmFsdWUsZ2V0Q29tbWVudCgpKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFyc2VFcnJvcjsKLS8vIHRoaXMucGFyc2VFcnJvciA9IG51bGw7Ci0vLyB0aGlzLnNldFBhcnNlRXJyb3IgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKSxvbGRWYWx1ZSxnZXRQYXJzZUVycm9yKCkpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLS8vIFN0cmluZyBvdXQ9IigiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gYm9vbGVhbiBmaXJzdD10cnVlOwotLy8gYm9vbGVhbiBlbXB0eUxpc3Q9dHJ1ZTsKLS8vIGlmKGlzU2V0Q29tbWVudCgpKSB7Ci0vLyBpZighZW1wdHlMaXN0KSBvdXQrPSIsICI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyBvdXQrPSJjb21tZW50OiAiK3RoaXMuY29tbWVudDsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIGZpcnN0PWZhbHNlOwotLy8gZW1wdHlMaXN0PWZhbHNlOwotLy8gfQotLy8gaWYoaXNTZXRQYXJzZUVycm9yKCkpIHsKLS8vIGlmKCFlbXB0eUxpc3QpIG91dCs9IiwgIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIG91dCs9InBhcnNlRXJyb3I6ICIrdGhpcy5wYXJzZUVycm9yOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gZmlyc3Q9ZmFsc2U7Ci0vLyBlbXB0eUxpc3Q9ZmFsc2U7Ci0vLyB9Ci0vLyBvdXQrPSIpIjsKLS8vIGlmICghZmlyc3QpIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiAiICtvdXQ7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLS8vIH0KLS8vIH0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERHcm91cENvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRER3JvdXBDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGUwMjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERHcm91cENvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUHJpbnRlcjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREdyb3VwQ29udGVudEltcGwgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERHcm91cENvbnRlbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cEtpbmQoKSA8ZW0+R3JvdXAgS2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEdyb3VwS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERHcm91cEtpbmQgR1JPVVBfS0lORF9FREVGQVVMVCA9IERUREdyb3VwS2luZC5TRVFVRU5DRV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREdyb3VwS2luZCBncm91cEtpbmQgPSBHUk9VUF9LSU5EX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb250ZW50ID0gbnVsbDsKLQotCXB1YmxpYyBEVERHcm91cENvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREdyb3VwQ29udGVudCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFBvc2l0aW9uKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJRUxpc3QgbGlzdCA9IGdldENvbnRlbnQoKTsKLQkJcmV0dXJuIGxpc3QuaW5kZXhPZihjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREZXRhaWwoKSB7Ci0JCURURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKGZhbHNlKTsKLQkJcHJpbnRlci52aXNpdERUREdyb3VwQ29udGVudCh0aGlzKTsKLQotCQlyZXR1cm4gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERHcm91cEtpbmQgZ2V0R3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZ3JvdXBLaW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcm91cEtpbmQoRFRER3JvdXBLaW5kIG5ld0dyb3VwS2luZCkgewotCQlEVERHcm91cEtpbmQgb2xkR3JvdXBLaW5kID0gZ3JvdXBLaW5kOwotCQlncm91cEtpbmQgPSBuZXdHcm91cEtpbmQgPT0gbnVsbCA/IEdST1VQX0tJTkRfRURFRkFVTFQgOiBuZXdHcm91cEtpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQsIG9sZEdyb3VwS2luZCwgZ3JvdXBLaW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotCQkJY29udGVudCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KERUREVsZW1lbnRDb250ZW50LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGVudCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXBLaW5kKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBnZXRDb250ZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gZ3JvdXBLaW5kICE9IEdST1VQX0tJTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBjb250ZW50ICE9IG51bGwgJiYgIWdldENvbnRlbnQoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKChEVERPY2N1cnJlbmNlVHlwZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVBfS0lORCA6Ci0JCQkJc2V0R3JvdXBLaW5kKChEVERHcm91cEtpbmQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCWdldENvbnRlbnQoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoT0NDVVJSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlzZXRHcm91cEtpbmQoR1JPVVBfS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQlnZXRDb250ZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cEtpbmQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3JvdXBLaW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESWRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJZEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGRlZWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJZEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEVERJZEhlbHBlciB7Ci0JcHVibGljIERURElkSGVscGVyKCkgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUNvbnRlbnRJZChEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JCVN0cmluZyBpZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQlpZCA9ICIjRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCWlkID0gIiNQQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJaWQgPSAiI0VNUFRZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJaWQgPSAiIyIgKyAoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KS5nZXRSZWZlcmVuY2VkRWxlbWVudCgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlpZCA9ICIjIiArICgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgY29udGVudCkuZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQlpZCA9IGNvbXB1dGVHcm91cElkKChEVERHcm91cENvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVHcm91cElkKERUREdyb3VwQ29udGVudCBncnApIHsKLQkJU3RyaW5nIGdyb3VwSWQgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGdyb3VwSWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUNvbnRlbnRJZEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0KLQkJU3RyaW5nIGlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCWlkID0gIiNFTVBUWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJaWQgPSAiI1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQlpZCA9ICIjRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlpZCA9ICIjIiArICgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpLmdldFJlZmVyZW5jZWRFbGVtZW50KCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCWlkID0gIiMiICsgKChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KS5nZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCWlkID0gY29tcHV0ZUdyb3VwSWQoKERUREdyb3VwQ29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVHcm91cElkR2VuKERUREdyb3VwQ29udGVudCBncnApIHsKLQotCQlTdHJpbmcgZ3JvdXBJZCA9ICJfIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ3JvdXBJZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESW50ZXJuYWxFbnRpdHlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESW50ZXJuYWxFbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDdlNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREludGVybmFsRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRESW50ZXJuYWxFbnRpdHlJbXBsIGV4dGVuZHMgRFRERW50aXR5Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERJbnRlcm5hbEVudGl0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCXB1YmxpYyBEVERJbnRlcm5hbEVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRESW50ZXJuYWxFbnRpdHkoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoNjQpOwotCQlpZiAoZ2V0VmFsdWUoKSA9PSBudWxsKQotCQkJc2IuYXBwZW5kKCJcIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQoIlwiIikuYXBwZW5kKHJlcGxhY2VEb3VibGVRdW90ZXMoZ2V0VmFsdWUoKSkpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gdGhpcyBtZXRob2QgcmVwbGFjZXMgYW55IG9jY3VycmVuY2Ugb2YgJyAiICcgd2l0aCB0aGUgZXF1aXZhbGVudCB2YWx1ZQotCS8vIG9mICYjMzQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZURvdWJsZVF1b3RlcyhTdHJpbmcgaW5wdXQpIHsKLQkJU3RyaW5nQnVmZmVyIG5ld1ZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGNoYXJhY3RlcnMgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoaW5wdXQpOwotCi0JCXdoaWxlIChjaGFyYWN0ZXJzLmN1cnJlbnQoKSAhPSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBjaGFyYWN0ZXJzLmN1cnJlbnQoKTsKLQotCQkJaWYgKGN1cnJlbnQgPT0gJyInKSB7Ci0JCQkJbmV3VmFsdWUuYXBwZW5kKCImIzM0OyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXdWYWx1ZS5hcHBlbmQoY3VycmVudCk7Ci0JCQl9Ci0JCQljaGFyYWN0ZXJzLm5leHQoKTsKLQkJfQotCi0JCXJldHVybiBuZXdWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUgOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVEROb3RhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVEROb3RhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlYzkyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRETm90YXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRETm90YXRpb25JbXBsIGV4dGVuZHMgRFREQ29udGVudEltcGwgaW1wbGVtZW50cyBEVEROb3RhdGlvbiwgRFREQ29udGVudCB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKG51bGwsICJOb3RhIiwgZ2V0TmFtZSgpLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IENPTU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lzdGVtSUQoKSA8ZW0+U3lzdGVtIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0U3lzdGVtSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeXN0ZW1JRCgpIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRTeXN0ZW1JRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IFNZU1RFTV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaWNJRCgpIDxlbT5QdWJsaWMgSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQdWJsaWNJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1YmxpY0lEKCkgPGVtPlB1YmxpYyBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFB1YmxpY0lEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lEID0gUFVCTElDX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5KCkgPGVtPkVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRETm90YXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQsIG9sZENvbW1lbnQsIGNvbW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JRChTdHJpbmcgbmV3U3lzdGVtSUQpIHsKLQkJU3RyaW5nIG9sZFN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JCXN5c3RlbUlEID0gbmV3U3lzdGVtSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQsIG9sZFN5c3RlbUlELCBzeXN0ZW1JRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotCQlyZXR1cm4gcHVibGljSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lEKFN0cmluZyBuZXdQdWJsaWNJRCkgewotCQlTdHJpbmcgb2xkUHVibGljSUQgPSBwdWJsaWNJRDsKLQkJcHVibGljSUQgPSBuZXdQdWJsaWNJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRCwgb2xkUHVibGljSUQsIHB1YmxpY0lEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbnRpdHkoKSB7Ci0JCWlmIChlbnRpdHkgPT0gbnVsbCkgewotCQkJZW50aXR5ID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KERUREV4dGVybmFsRW50aXR5LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OKTsKLQkJfQotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFbnRpdHkoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVudGl0eSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIGdldFN5c3RlbUlEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBnZXRQdWJsaWNJRCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0RW50aXR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEIDoKLQkJCQlzZXRTeXN0ZW1JRCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEIDoKLQkJCQlzZXRQdWJsaWNJRCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQlnZXRFbnRpdHkoKS5jbGVhcigpOwotCQkJCWdldEVudGl0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEIDoKLQkJCQlzZXRTeXN0ZW1JRChTWVNURU1fSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoUFVCTElDX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCWdldEVudGl0eSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQgOgotCQkJCXJldHVybiBTWVNURU1fSURfRURFRkFVTFQgPT0gbnVsbCA/IHN5c3RlbUlEICE9IG51bGwgOiAhU1lTVEVNX0lEX0VERUZBVUxULmVxdWFscyhzeXN0ZW1JRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBQVUJMSUNfSURfRURFRkFVTFQgPT0gbnVsbCA/IHB1YmxpY0lEICE9IG51bGwgOiAhUFVCTElDX0lEX0VERUZBVUxULmVxdWFscyhwdWJsaWNJRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCXJldHVybiBlbnRpdHkgIT0gbnVsbCAmJiAhZ2V0RW50aXR5KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5c3RlbUlEOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN5c3RlbUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwdWJsaWNJRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdWJsaWNJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVEROb3RhdGlvbkltcGwKLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8KLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8gLy9wdWJsaWMgY2xhc3MgRFRETm90YXRpb25JbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cwotLy8gRFRETm90YXRpb24sIEVOYW1lc3BhY2UsIERURENvbnRlbnR7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbgotLy8gMjAwMi4iOwotLy8KLS8vIHB1YmxpYyBEVEROb3RhdGlvbkltcGwoKQotLy8gewotLy8gc3VwZXIoKTsKLS8vIH0KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKQotLy8gewotLy8gcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiTm90YSIsIGdldE5hbWUoKSwgLTEpOwotLy8gfQotLy8KLS8vIHB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKQotLy8gewotLy8gcmV0dXJuIG51bGw7Ci0vLyB9Ci0vLwotLy8gLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLS8vIC8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLS8vIC8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0vLyBEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJRCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGVudGl0eSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q29tbWVudCA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldFN5c3RlbUlEID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UHVibGljSUQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcml2YXRlIERURENvbnRlbnRJbXBsIGR0ZENvbnRlbnREZWxlZ2F0ZSA9IG51bGw7Ci0vLyAvKioKLS8vICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICovCi0vLyBwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkKLS8vIHsKLS8vIHJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0vLyB9Ci0vLyAgCi0vLyAvKioKLS8vICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICogQHBhcmFtIHYgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KQotLy8gewotLy8gbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLS8vIH0KLS8vICAKLS8vIC8qKgotLy8gKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLS8vICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0vLyAqLwotLy8gcHVibGljIGludCBnZXRFbmRPZmZzZXQoKQotLy8gewotLy8gcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0vLyB9Ci0vLyAgCi0vLyAvKioKLS8vICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0vLyAqIEBwYXJhbSB2IFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KQotLy8gewotLy8gbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFRETm90YXRpb24oKSk7Ci0vLyBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vIHJldHVybiB0aGlzOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCB2b2lkIGluaXRJbnN0YW5jZURlbGVnYXRlcygpIHsKLS8vIHN1cGVyLmluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8KLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnJlZlNldERlbGVnYXRlT3duZXIodGhpcyk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERURFBhY2thZ2UgZVBhY2thZ2VEVEQoKSB7Ci0vLyByZXR1cm4KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVEROb3RhdGlvbigpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERURE5vdGF0aW9uKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0vLyBpZiAodGhpcy5zZXRDb21tZW50KSByZXR1cm4gdGhpcy5jb21tZW50OwotLy8gZWxzZSByZXR1cm4KLS8vIChTdHJpbmcpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fQ29tbWVudCgpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSx0aGlzLmNvbW1lbnQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29tbWVudCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0Q29tbWVudCgpIHsKLS8vIHJldHVybiBzZXRDb21tZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JRCgpIHsKLS8vIGlmICh0aGlzLnNldFN5c3RlbUlEKSByZXR1cm4gdGhpcy5zeXN0ZW1JRDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCksdGhpcy5zeXN0ZW1JRCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRTeXN0ZW1JRCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFN5c3RlbUlEKCkgewotLy8gcmV0dXJuIHNldFN5c3RlbUlEOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRQdWJsaWNJRCgpIHsKLS8vIGlmICh0aGlzLnNldFB1YmxpY0lEKSByZXR1cm4gdGhpcy5wdWJsaWNJRDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksdGhpcy5wdWJsaWNJRCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRQdWJsaWNJRCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFB1YmxpY0lEKCkgewotLy8gcmV0dXJuIHNldFB1YmxpY0lEOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldEVudGl0eSgpIHsKLS8vIGlmICh0aGlzLmVudGl0eT09bnVsbCkgewotLy8gdGhpcy5lbnRpdHk9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0VudGl0eSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHJldHVybiBnZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHJldHVybiBnZXRTeXN0ZW1JRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiByZXR1cm4gZ2V0UHVibGljSUQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWTogcmV0dXJuIGdldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybiBnZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6Ci0vLyByZXR1cm4gdGhpcy5zZXRDb21tZW50PyB0aGlzLmNvbW1lbnQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOgotLy8gcmV0dXJuIHRoaXMuc2V0U3lzdGVtSUQ/IHRoaXMuc3lzdGVtSUQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOgotLy8gcmV0dXJuIHRoaXMuc2V0UHVibGljSUQ/IHRoaXMucHVibGljSUQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZOgotLy8gcmV0dXJuIHRoaXMuZW50aXR5OwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybgotLy8gKChJbnRlcm5hbEVPYmplY3QpZ2V0RHRkQ29udGVudERlbGVnYXRlKCkpLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogcmV0dXJuIGlzU2V0Q29tbWVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiByZXR1cm4gaXNTZXRTeXN0ZW1JRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiByZXR1cm4gaXNTZXRQdWJsaWNJRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybiBpc1NldERUREZpbGUoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVEROb3RhdGlvbigpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UOiB7Ci0vLyBzZXRDb21tZW50KChTdHJpbmcpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiB7Ci0vLyBzZXRTeXN0ZW1JRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gc2V0UHVibGljSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OwotLy8gdGhpcy5jb21tZW50ID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0Q29tbWVudCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuc3lzdGVtSUQ7Ci0vLyB0aGlzLnN5c3RlbUlEID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0U3lzdGVtSUQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wdWJsaWNJRDsKLS8vIHRoaXMucHVibGljSUQgPSAoU3RyaW5nKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQdWJsaWNJRCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogewotLy8gdW5zZXRDb21tZW50KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHsKLS8vIHVuc2V0U3lzdGVtSUQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gdW5zZXRQdWJsaWNJRCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHsKLS8vIHVuc2V0RFRERmlsZSgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9Db21tZW50KCksb2xkVmFsdWUsZ2V0Q29tbWVudCgpKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5zeXN0ZW1JRDsKLS8vIHRoaXMuc3lzdGVtSUQgPSBudWxsOwotLy8gdGhpcy5zZXRTeXN0ZW1JRCA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCksb2xkVmFsdWUsZ2V0U3lzdGVtSUQoKSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucHVibGljSUQ7Ci0vLyB0aGlzLnB1YmxpY0lEID0gbnVsbDsKLS8vIHRoaXMuc2V0UHVibGljSUQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpLG9sZFZhbHVlLGdldFB1YmxpY0lEKCkpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERURENvbnRlbnRJbXBsIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpIHsKLS8vIGlmIChkdGRDb250ZW50RGVsZWdhdGUgPT0gbnVsbCkgewotLy8gRFREUGFja2FnZSBwa2cgPQotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZT0oRFREQ29udGVudEltcGwpcGtnLmVDcmVhdGVJbnN0YW5jZShwa2cuRFREX0NPTlRFTlQpOwotLy8gZHRkQ29udGVudERlbGVnYXRlLmluaXRJbnN0YW5jZSgpOwotLy8gfQotLy8gcmV0dXJuIGR0ZENvbnRlbnREZWxlZ2F0ZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RURENvbnRlbnQoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZUNsYXNzKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5nZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIHZhbHVlKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5zZXREVERGaWxlKHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldERUREZpbGUoKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS51bnNldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuaXNTZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyB9Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQQ0RhdGFDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBDRGF0YUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YzAwZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBDRGF0YUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFREUENEYXRhQ29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERQQ0RhdGFDb250ZW50IHsKLQotCXB1YmxpYyBEVERQQ0RhdGFDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQQ0RhdGFDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiI1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFja2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWIxZDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIERURFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRFREUGFja2FnZSwKLSAqICAgICAgICAgIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIERURFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbGVtZW50Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkR3JvdXBDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRBdHRyaWJ1dGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVtcHR5Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkQW55Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkcGNEYXRhQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRCYXNpY1R5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkTm90YXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRW50aXR5Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEludGVybmFsRW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZENvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkT2NjdXJyZW5jZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkdGREZWZhdWx0S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGR0ZEJhc2ljVHlwZUtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkdGRFbnVtR3JvdXBLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkR3JvdXBLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0geG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkKLQkgKiB0aGUgcGFja2FnZSBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljIGZhY3RvcnkKLQkgKiBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JICogcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLCBpZiBvbmUgYWxyZWFkeSBleGlzdHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFREUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIERUREZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvLyBwdWJsaWMgRFREUGFja2FnZUltcGwoKQotCS8vIHsKLQkvLyBzdXBlcihlTlNfVVJJKTsKLQkvLyBpbml0aWFsaXplUGFja2FnZShudWxsKTsKLQkvLyB9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwKLQkgKiBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiBTaW1wbGUgZGVwZW5kZW5jaWVzIGFyZQotCSAqIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbCBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nCi0JICogYW55dGhpbmcgZWxzZS4gVGhpcyBtZXRob2QgZHJpdmVzIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudAotCSAqIHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbCB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPgotCSAqIE9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2ggaGF2ZSBub3QKLQkgKiB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQgYW5kCi0JICogcmVnaXN0ZXJlZC4gVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczogbWV0YS1tb2RlbAotCSAqIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueSBhcmUgaW5pdGlhbGl6ZWQsCi0JICogc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+Ci0JICogSW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREUGFja2FnZSBpbml0KCkgewotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlIGFuZCBpbnRlcmRlcGVuZGVuY2llcwotCQlEVERQYWNrYWdlSW1wbCB0aGVEVERQYWNrYWdlID0gKERURFBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgRFREUGFja2FnZUltcGwoKSk7Ci0JCUVjb3JlUGFja2FnZUltcGwgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZUltcGwpIChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoRWNvcmVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoRWNvcmVQYWNrYWdlLmVOU19VUkkpIDogRWNvcmVQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gU3RlcCAxOiBjcmVhdGUgbWV0YS1tb2RlbCBvYmplY3RzCi0JCXRoZURURFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjb3JlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBTdGVwIDI6IGNvbXBsZXRlIGluaXRpYWxpemF0aW9uCi0JCXRoZURURFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY29yZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCXJldHVybiB0aGVEVERQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVsZW1lbnRDb250ZW50KCkgewotCQlyZXR1cm4gZHRkRWxlbWVudENvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREdyb3VwQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEdyb3VwQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRER3JvdXBDb250ZW50X0dyb3VwS2luZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRHcm91cENvbnRlbnRFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREdyb3VwQ29udGVudF9Db250ZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEdyb3VwQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBkdGRBdHRyaWJ1dGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9Db21tZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRLaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRWYWx1ZVN0cmluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9EVERFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbGVtZW50KCkgewotCQlyZXR1cm4gZHRkRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERWxlbWVudF9Db21tZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEVsZW1lbnRFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVsZW1lbnRfQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVtcHR5Q29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVtcHR5Q29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERBbnlDb250ZW50KCkgewotCQlyZXR1cm4gZHRkQW55Q29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERQQ0RhdGFDb250ZW50KCkgewotCQlyZXR1cm4gZHRkcGNEYXRhQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERSZXBlYXRhYmxlQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERSZXBlYXRhYmxlQ29udGVudF9PY2N1cnJlbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERGaWxlX0NvbW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRmlsZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERmlsZV9QYXJzZUVycm9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEZpbGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREZpbGVfRFREQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRGaWxlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRGaWxlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREJhc2ljVHlwZSgpIHsKLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREQmFzaWNUeXBlX0tpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkQmFzaWNUeXBlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERW51bWVyYXRpb25UeXBlX0tpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRETm90YXRpb24oKSB7Ci0JCXJldHVybiBkdGROb3RhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGROb3RhdGlvbkVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkTm90YXRpb25FQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZE5vdGF0aW9uRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVEROb3RhdGlvbl9FbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkTm90YXRpb25FQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERW50aXR5KCkgewotCQlyZXR1cm4gZHRkRW50aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFbnRpdHlfQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVudGl0eUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRFbnRpdHlDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREV4dGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREV4dGVybmFsRW50aXR5X1N5c3RlbUlEKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFeHRlcm5hbEVudGl0eV9QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFeHRlcm5hbEVudGl0eUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREV4dGVybmFsRW50aXR5X0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRESW50ZXJuYWxFbnRpdHkoKSB7Ci0JCXJldHVybiBkdGRJbnRlcm5hbEVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRESW50ZXJuYWxFbnRpdHlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkgewotCQlyZXR1cm4gZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudF9FbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERURENvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERDb250ZW50X0RUREZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERURE9jY3VycmVuY2VUeXBlKCkgewotCQlyZXR1cm4gZHRkT2NjdXJyZW5jZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERURERlZmF1bHRLaW5kKCkgewotCQlyZXR1cm4gZHRkRGVmYXVsdEtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERUREJhc2ljVHlwZUtpbmQoKSB7Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREVERFbnVtR3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZHRkRW51bUdyb3VwS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RFRER3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZHRkR3JvdXBLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRYTUxTY2hlbWFEZWZpbmVkVHlwZSgpIHsKLQkJcmV0dXJuIHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERGYWN0b3J5IGdldERUREZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRFRERmFjdG9yeSkgZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiBUaGlzIG1ldGhvZCBpcyBndWFyZGVkCi0JICogdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKQotCQkJcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlkdGRFbGVtZW50Q29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRUxFTUVOVF9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50Q29udGVudEVDbGFzcywgRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLCBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UKTsKLQotCQlkdGRHcm91cENvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0dST1VQX0NPTlRFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEdyb3VwQ29udGVudEVDbGFzcywgRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEdyb3VwQ29udGVudEVDbGFzcywgRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQpOwotCi0JCWR0ZEF0dHJpYnV0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfQVRUUklCVVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0NPTU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEF0dHJpYnV0ZUVDbGFzcywgRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UKTsKLQotCQlkdGRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRFbGVtZW50RUNsYXNzLCBEVERfRUxFTUVOVF9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRWxlbWVudEVDbGFzcywgRFREX0VMRU1FTlRfX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVsZW1lbnRFQ2xhc3MsIERURF9FTEVNRU5UX19EVERfQVRUUklCVVRFKTsKLQotCQlkdGRFbXB0eUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VNUFRZX0NPTlRFTlQpOwotCi0JCWR0ZEFueUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0FOWV9DT05URU5UKTsKLQotCQlkdGRwY0RhdGFDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9QQ19EQVRBX0NPTlRFTlQpOwotCi0JCWR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcywgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCk7Ci0KLQkJZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX1JFUEVBVEFCTEVfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MsIERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UpOwotCi0JCWR0ZEZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEZpbGVFQ2xhc3MsIERURF9GSUxFX19DT01NRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRGaWxlRUNsYXNzLCBEVERfRklMRV9fUEFSU0VfRVJST1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEZpbGVFQ2xhc3MsIERURF9GSUxFX19EVERfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRmlsZUVDbGFzcywgRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFKTsKLQotCQlkdGRCYXNpY1R5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0JBU0lDX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEJhc2ljVHlwZUVDbGFzcywgRFREX0JBU0lDX1RZUEVfX0tJTkQpOwotCi0JCWR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5VTUVSQVRJT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLCBEVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUpOwotCi0JCWR0ZE5vdGF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9OT1RBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkTm90YXRpb25FQ2xhc3MsIERURF9OT1RBVElPTl9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkTm90YXRpb25FQ2xhc3MsIERURF9OT1RBVElPTl9fU1lTVEVNX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGROb3RhdGlvbkVDbGFzcywgRFREX05PVEFUSU9OX19QVUJMSUNfSUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVERfTk9UQVRJT05fX0VOVElUWSk7Ci0KLQkJZHRkRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSk7Ci0KLQkJZHRkRW50aXR5Q29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5USVRZX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MsIERURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSk7Ci0KLQkJZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VYVEVSTkFMX0VOVElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFeHRlcm5hbEVudGl0eUVDbGFzcywgRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUpOwotCi0JCWR0ZEludGVybmFsRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9JTlRFUk5BTF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEludGVybmFsRW50aXR5RUNsYXNzLCBEVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSk7Ci0KLQkJZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzLCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSk7Ci0KLQkJZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzLCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZKTsKLQotCQlkdGRDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRDb250ZW50RUNsYXNzLCBEVERfQ09OVEVOVF9fRFREX0ZJTEUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlkdGRPY2N1cnJlbmNlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oRFREX09DQ1VSUkVOQ0VfVFlQRSk7Ci0JCWR0ZERlZmF1bHRLaW5kRUVudW0gPSBjcmVhdGVFRW51bShEVERfREVGQVVMVF9LSU5EKTsKLQkJZHRkQmFzaWNUeXBlS2luZEVFbnVtID0gY3JlYXRlRUVudW0oRFREX0JBU0lDX1RZUEVfS0lORCk7Ci0JCWR0ZEVudW1Hcm91cEtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9FTlVNX0dST1VQX0tJTkQpOwotCQlkdGRHcm91cEtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9HUk9VUF9LSU5EKTsKLQkJeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9TQ0hFTUFfREVGSU5FRF9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlFY29yZVBhY2thZ2VJbXBsIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2VJbXBsKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlkdGRHcm91cENvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJZHRkQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQXR0cmlidXRlKCkpOwotCQlkdGRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3MoKSk7Ci0JCWR0ZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERDb250ZW50KCkpOwotCQlkdGRFbXB0eUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpKTsKLQkJZHRkQW55Q29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCkpOwotCQlkdGRwY0RhdGFDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSk7Ci0JCWR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0JCWR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSk7Ci0JCWR0ZEJhc2ljVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzKCkpOwotCQlkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVFbnVtKCkpOwotCQlkdGROb3RhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURENvbnRlbnQoKSk7Ci0JCWR0ZEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURENvbnRlbnQoKSk7Ci0JCWR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERW50aXR5Q29udGVudCgpKTsKLQkJZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbnRpdHlDb250ZW50KCkpOwotCQlkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERDb250ZW50KCkpOwotCQlkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhkdGRFbGVtZW50Q29udGVudEVDbGFzcywgRFRERWxlbWVudENvbnRlbnQuY2xhc3MsICJEVERFbGVtZW50Q29udGVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpLCB0aGlzLmdldERUREdyb3VwQ29udGVudCgpLCB0aGlzLmdldERUREdyb3VwQ29udGVudF9Db250ZW50KCksICJncm91cCIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnRfQ29udGVudCgpLCAiZWxlbWVudCIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkR3JvdXBDb250ZW50RUNsYXNzLCBEVERHcm91cENvbnRlbnQuY2xhc3MsICJEVERHcm91cENvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREdyb3VwQ29udGVudF9Hcm91cEtpbmQoKSwgdGhpcy5nZXREVERHcm91cEtpbmQoKSwgImdyb3VwS2luZCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRER3JvdXBDb250ZW50X0NvbnRlbnQoKSwgdGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpLCB0aGlzLmdldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCksICJjb250ZW50IiwgbnVsbCwgMSwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERBdHRyaWJ1dGUuY2xhc3MsICJEVERBdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREF0dHJpYnV0ZV9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERBdHRyaWJ1dGVfRGVmYXVsdEtpbmQoKSwgdGhpcy5nZXREVEREZWZhdWx0S2luZCgpLCAiZGVmYXVsdEtpbmQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREF0dHJpYnV0ZV9EZWZhdWx0VmFsdWVTdHJpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlZmF1bHRWYWx1ZVN0cmluZyIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSwgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCksICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnQoKSwgdGhpcy5nZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpLCAiRFRERWxlbWVudCIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRWxlbWVudEVDbGFzcywgRFRERWxlbWVudC5jbGFzcywgIkRUREVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREVsZW1lbnRfQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERWxlbWVudF9Db250ZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSwgdGhpcy5nZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCksICJjb250ZW50IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVsZW1lbnRfRFREQXR0cmlidXRlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlX0RUREVsZW1lbnQoKSwgIkRUREF0dHJpYnV0ZSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVtcHR5Q29udGVudEVDbGFzcywgRFRERW1wdHlDb250ZW50LmNsYXNzLCAiRFRERW1wdHlDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQW55Q29udGVudEVDbGFzcywgRFREQW55Q29udGVudC5jbGFzcywgIkRUREFueUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRwY0RhdGFDb250ZW50RUNsYXNzLCBEVERQQ0RhdGFDb250ZW50LmNsYXNzLCAiRFREUENEYXRhQ29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzLCBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudC5jbGFzcywgIkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnQoKSwgbnVsbCwgInJlZmVyZW5jZWRFbGVtZW50IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcywgRFREUmVwZWF0YWJsZUNvbnRlbnQuY2xhc3MsICJEVERSZXBlYXRhYmxlQ29udGVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERSZXBlYXRhYmxlQ29udGVudF9PY2N1cnJlbmNlKCksIHRoaXMuZ2V0RFRET2NjdXJyZW5jZVR5cGUoKSwgIm9jY3VycmVuY2UiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRGaWxlRUNsYXNzLCBEVERGaWxlLmNsYXNzLCAiRFRERmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERmlsZV9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERGaWxlX1BhcnNlRXJyb3IoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwYXJzZUVycm9yIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERGaWxlX0RURENvbnRlbnQoKSwgdGhpcy5nZXREVERDb250ZW50KCksIHRoaXMuZ2V0RFREQ29udGVudF9EVERGaWxlKCksICJEVERDb250ZW50IiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpLCB0aGlzLmdldERUREVudW1lcmF0aW9uVHlwZSgpLCB0aGlzLmdldERUREVudW1lcmF0aW9uVHlwZV9EVERGaWxlKCksICJEVERFbnVtZXJhdGlvblR5cGUiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRCYXNpY1R5cGVFQ2xhc3MsIERUREJhc2ljVHlwZS5jbGFzcywgIkRUREJhc2ljVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFREQmFzaWNUeXBlX0tpbmQoKSwgdGhpcy5nZXREVERCYXNpY1R5cGVLaW5kKCksICJraW5kIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLCBEVERFbnVtZXJhdGlvblR5cGUuY2xhc3MsICJEVERFbnVtZXJhdGlvblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREVudW1lcmF0aW9uVHlwZV9LaW5kKCksIHRoaXMuZ2V0RFRERW51bUdyb3VwS2luZCgpLCAia2luZCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW51bWVyYXRpb25UeXBlX0RUREZpbGUoKSwgdGhpcy5nZXREVERGaWxlKCksIHRoaXMuZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKSwgIkRUREZpbGUiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVEROb3RhdGlvbi5jbGFzcywgIkRURE5vdGF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVEROb3RhdGlvbl9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3lzdGVtSUQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwdWJsaWNJRCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRETm90YXRpb25fRW50aXR5KCksIHRoaXMuZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKSwgdGhpcy5nZXREVERFeHRlcm5hbEVudGl0eV9Ob3RhdGlvbigpLCAiZW50aXR5IiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW50aXR5RUNsYXNzLCBEVERFbnRpdHkuY2xhc3MsICJEVERFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREVudGl0eV9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicGFyYW1ldGVyRW50aXR5IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfQ29udGVudCgpLCB0aGlzLmdldERUREVudGl0eUNvbnRlbnQoKSwgdGhpcy5nZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpLCAiY29udGVudCIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLCB0aGlzLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLCB0aGlzLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSwgInBhcm1FbnRpdHlSZWYiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpLCB0aGlzLmdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKSwgdGhpcy5nZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50X0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCksICJlbnRpdHlSZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCksICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpLCAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MsIERUREVudGl0eUNvbnRlbnQuY2xhc3MsICJEVERFbnRpdHlDb250ZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eUNvbnRlbnRfRFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSwgIkRUREVudGl0eSIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERUREV4dGVybmFsRW50aXR5LmNsYXNzLCAiRFRERXh0ZXJuYWxFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREV4dGVybmFsRW50aXR5X1N5c3RlbUlEKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzeXN0ZW1JRCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERXh0ZXJuYWxFbnRpdHlfUHVibGljSUQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInB1YmxpY0lEIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFeHRlcm5hbEVudGl0eV9Ob3RhdGlvbigpLCB0aGlzLmdldERURE5vdGF0aW9uKCksIHRoaXMuZ2V0RFRETm90YXRpb25fRW50aXR5KCksICJub3RhdGlvbiIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFeHRlcm5hbEVudGl0eV9FbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCksIHRoaXMuZ2V0RFRERmlsZSgpLCBudWxsLCAiZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MsIERUREludGVybmFsRW50aXR5LmNsYXNzLCAiRFRESW50ZXJuYWxFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREludGVybmFsRW50aXR5X1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcywgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzLCAiRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSwgImVudGl0eSIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcywgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5jbGFzcywgIkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRfRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCksICJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQ29udGVudEVDbGFzcywgRFREQ29udGVudC5jbGFzcywgIkRURENvbnRlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREQ29udGVudF9EVERGaWxlKCksIHRoaXMuZ2V0RFRERmlsZSgpLCB0aGlzLmdldERUREZpbGVfRFREQ29udGVudCgpLCAiRFRERmlsZSIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5jbGFzcywgIkRURE9jY3VycmVuY2VUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZE9jY3VycmVuY2VUeXBlRUVudW0sIERURE9jY3VycmVuY2VUeXBlLk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZE9jY3VycmVuY2VUeXBlRUVudW0sIERURE9jY3VycmVuY2VUeXBlLk9QVElPTkFMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkT2NjdXJyZW5jZVR5cGVFRW51bSwgRFRET2NjdXJyZW5jZVR5cGUuT05FX09SX01PUkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLmNsYXNzLCAiRFRERGVmYXVsdEtpbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZHRkRGVmYXVsdEtpbmRFRW51bSwgRFRERGVmYXVsdEtpbmQuSU1QTElFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLlJFUVVJUkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkRGVmYXVsdEtpbmRFRW51bSwgRFRERGVmYXVsdEtpbmQuRklYRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGREZWZhdWx0S2luZEVFbnVtLCBEVEREZWZhdWx0S2luZC5OT0ZJWEVEX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuY2xhc3MsICJEVERCYXNpY1R5cGVLaW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5OT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLkNEQVRBX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLklEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLklEUkVGX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLklEUkVGU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5FTlRJVFlfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuRU5USVRJRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU19MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZHRkRW51bUdyb3VwS2luZEVFbnVtLCBEVERFbnVtR3JvdXBLaW5kLmNsYXNzLCAiRFRERW51bUdyb3VwS2luZCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGRFbnVtR3JvdXBLaW5kRUVudW0sIERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEVudW1Hcm91cEtpbmRFRW51bSwgRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZHRkR3JvdXBLaW5kRUVudW0sIERUREdyb3VwS2luZC5jbGFzcywgIkRUREdyb3VwS2luZCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGRHcm91cEtpbmRFRW51bSwgRFRER3JvdXBLaW5kLlNFUVVFTkNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkR3JvdXBLaW5kRUVudW0sIERUREdyb3VwS2luZC5DSE9JQ0VfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLmNsYXNzLCAiWE1MU2NoZW1hRGVmaW5lZFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuTk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlNUUklOR19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkJPT0xFQU5fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5GTE9BVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkRPVUJMRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkRFQ0lNQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5USU1FSU5TVEFOVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlRJTUVEVVJBVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlJFQ1VSUklOR0lOU1RBTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5CSU5BUllfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5VUklfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5JTlRFR0VSX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuREFURV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlRJTUVfTElURVJBTCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotCi19IC8vIERURFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlMjZiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIGV4dGVuZHMgRFREQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UsIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQgewotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlEVERFbnRpdHkgZW50aXR5ID0gZ2V0RW50aXR5KCk7Ci0JCWlmIChlbnRpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVudGl0eSgpLmdldE5hbWUoKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiUEVudCIsIGdldE5hbWUoKSwgLTEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5KCkgPGVtPkVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eSBlbnRpdHkgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldEVudGl0eSgpIHsKLQkJaWYgKGVudGl0eSAhPSBudWxsICYmIGVudGl0eS5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbnRpdHkgb2xkRW50aXR5ID0gZW50aXR5OwotCQkJZW50aXR5ID0gKERUREVudGl0eSkgRWNvcmVVdGlsLnJlc29sdmUoZW50aXR5LCB0aGlzKTsKLQkJCWlmIChlbnRpdHkgIT0gb2xkRW50aXR5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgb2xkRW50aXR5LCBlbnRpdHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGJhc2ljR2V0RW50aXR5KCkgewotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbnRpdHkoRFRERW50aXR5IG5ld0VudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHkgb2xkRW50aXR5ID0gZW50aXR5OwotCQllbnRpdHkgPSBuZXdFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBvbGRFbnRpdHksIG5ld0VudGl0eSkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHkoRFRERW50aXR5IG5ld0VudGl0eSkgewotCQlpZiAobmV3RW50aXR5ICE9IGVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBlbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0VudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVudGl0eShuZXdFbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBuZXdFbnRpdHksIG5ld0VudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCQlpZiAoZW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEVudGl0eSgoRFRERW50aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRFbnRpdHkoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCXNldEVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQlzZXRFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGVudGl0eSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy8gRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbAotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLyAvL3B1YmxpYyBjbGFzcyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwKLS8vIGltcGxlbWVudHMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLCBFTmFtZXNwYWNlLCBEVERDb250ZW50ewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERFbnRpdHkgZW50aXR5ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRFbnRpdHkgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcml2YXRlIERURENvbnRlbnRJbXBsIGR0ZENvbnRlbnREZWxlZ2F0ZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkpOwotLy8gaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLyByZXR1cm4gdGhpczsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgdm9pZCBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKSB7Ci0vLyBzdXBlci5pbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vCi0KLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnJlZlNldERlbGVnYXRlT3duZXIodGhpcyk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERURFBhY2thZ2UgZVBhY2thZ2VEVEQoKSB7Ci0vLyByZXR1cm4KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0vLyByZXR1cm4KLS8vICgoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpKS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBEVERFbnRpdHkgZ2V0RW50aXR5KCkgewotLy8gdHJ5IHsKLS8vIGlmICh0aGlzLmVudGl0eSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vIHRoaXMuZW50aXR5ID0gKERUREVudGl0eSkgKChJbnRlcm5hbEVPYmplY3QpdGhpcy5lbnRpdHkpLnJlc29sdmUodGhpcywKLS8vIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSk7Ci0vLyBpZiAodGhpcy5lbnRpdHk9PW51bGwpIHRoaXMuc2V0RW50aXR5ID0gZmFsc2U7Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHk7Ci0vLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIG51bGw7Ci0vLyB9Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RW50aXR5KERUREVudGl0eSBsKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNWUmVmZXJlbmNlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSx0aGlzLmVudGl0eSxsKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldEVudGl0eSgpIHsKLS8vIHJlZlVuc2V0VmFsdWVGb3JTVlJlZmVyZW5jZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksdGhpcy5lbnRpdHkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0RW50aXR5KCkgewotLy8gcmV0dXJuIHNldEVudGl0eTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogcmV0dXJuIGdldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHJldHVybgotLy8gZ2V0RFRERmlsZSgpOwotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6Ci0vLyBpZiAoIXRoaXMuc2V0RW50aXR5fHx0aGlzLmVudGl0eT09bnVsbCkgcmV0dXJuIG51bGw7Ci0vLyBpZiAoKChJbnRlcm5hbEVPYmplY3QpdGhpcy5lbnRpdHkpLnJlZklzRGVsZXRlZCgpKSB7dGhpcy5lbnRpdHk9bnVsbDsKLS8vIHRoaXMuc2V0RW50aXR5PWZhbHNlO30KLS8vIHJldHVybiB0aGlzLmVudGl0eTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiByZXR1cm4KLS8vICgoSW50ZXJuYWxFT2JqZWN0KWdldER0ZENvbnRlbnREZWxlZ2F0ZSgpKS5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogcmV0dXJuCi0vLyBpc1NldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHJldHVybgotLy8gaXNTZXREVERGaWxlKCk7Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiB7Ci0vLyBzZXRFbnRpdHkoKERUREVudGl0eSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotCi0vLyB9Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIGVCYXNpY1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotLy8gewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmVudGl0eTsKLS8vIHRoaXMuZW50aXR5ID0gKERUREVudGl0eSluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0RW50aXR5ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vCi0KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogewotLy8gdW5zZXRFbnRpdHkoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiB7Ci0vLyB1bnNldERUREZpbGUoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZW50aXR5OwotLy8gdGhpcy5lbnRpdHkgPSBudWxsOwotLy8gdGhpcy5zZXRFbnRpdHkgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksb2xkVmFsdWUsbnVsbCk7Ci0vLyB9Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERDb250ZW50SW1wbCBnZXREdGRDb250ZW50RGVsZWdhdGUoKSB7Ci0vLyBpZiAoZHRkQ29udGVudERlbGVnYXRlID09IG51bGwpIHsKLS8vIERURFBhY2thZ2UgcGtnID0KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGU9KERURENvbnRlbnRJbXBsKXBrZy5lQ3JlYXRlSW5zdGFuY2UocGtnLkRURF9DT05URU5UKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZS5pbml0SW5zdGFuY2UoKTsKLS8vIH0KLS8vIHJldHVybiBkdGRDb250ZW50RGVsZWdhdGU7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERDb250ZW50KCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmVDbGFzcygpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZ2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuc2V0RFRERmlsZSh2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXREVERGaWxlKCkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkudW5zZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmlzU2V0RFRERmlsZSgpOwotLy8gfQotLy8gfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFJlcGVhdGFibGVDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFJlcGVhdGFibGVDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGYyMjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERSZXBlYXRhYmxlQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50SW1wbCBpbXBsZW1lbnRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2NjdXJyZW5jZSgpIDxlbT5PY2N1cnJlbmNlPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0T2NjdXJyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBPQ0NVUlJFTkNFX0VERUZBVUxUID0gRFRET2NjdXJyZW5jZVR5cGUuT05FX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZSA9IE9DQ1VSUkVOQ0VfRURFRkFVTFQ7Ci0KLQlwdWJsaWMgRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFJlcGVhdGFibGVDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDEyOCk7Ci0JCWlmIChnZXRPY2N1cnJlbmNlKCkuZ2V0VmFsdWUoKSAhPSBEVERPY2N1cnJlbmNlVHlwZS5PTkUpIHsKLQkJCWlmICh0aGlzIGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJCXNiLmFwcGVuZCgiKCIpLmFwcGVuZCh1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSkuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJCX0KLQotCQkJLy8gTU9GMkVNRiBQb3J0Ci0JCQkvLyBFRW51bUxpdGVyYWwgbGl0ID0gZ2V0T2NjdXJyZW5jZSgpOwotCQkJRFRET2NjdXJyZW5jZVR5cGUgbGl0ID0gZ2V0T2NjdXJyZW5jZSgpOwotCQkJaWYgKGxpdCAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKSBsaXQuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQodW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiAgICAgICAgICAgIEpVU1RfT05FPSAtMSBPTkVfT1JfTU9SRT00MyBPUFRJT05BTD02MyBaRVJPX09SX01PUkU9NDIKLQkgKi8KLQlwdWJsaWMgRFRET2NjdXJyZW5jZVR5cGUgZ2V0T2NjdXJyZW5jZSgpIHsKLQkJcmV0dXJuIG9jY3VycmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2UoRFRET2NjdXJyZW5jZVR5cGUgbmV3T2NjdXJyZW5jZSkgewotCQlEVERPY2N1cnJlbmNlVHlwZSBvbGRPY2N1cnJlbmNlID0gb2NjdXJyZW5jZTsKLQkJb2NjdXJyZW5jZSA9IG5ld09jY3VycmVuY2UgPT0gbnVsbCA/IE9DQ1VSUkVOQ0VfRURFRkFVTFQgOiBuZXdPY2N1cnJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UsIG9sZE9jY3VycmVuY2UsIG9jY3VycmVuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBnZXRPY2N1cnJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZSgoRFRET2NjdXJyZW5jZVR5cGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoT0NDVVJSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAob2NjdXJyZW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChvY2N1cnJlbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIERURFJlcGVhdGFibGVDb250ZW50I3VucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpCi0JICovCi0JcHVibGljIFN0cmluZyB1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERFbGVtZW50Q29udGVudCNnZXRDb250ZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGFiNmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0KLQotcHVibGljIGNsYXNzIERUREFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRFREUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRFREQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gRFREUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERURFN3aXRjaCBtb2RlbFN3aXRjaCA9IG5ldyBEVERTd2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVsZW1lbnRDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERHcm91cENvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnQoRFRERWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW1wdHlDb250ZW50KERUREVtcHR5Q29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbXB0eUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERBbnlDb250ZW50KERUREFueUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREQW55Q29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURURFBDRGF0YUNvbnRlbnQoRFREUENEYXRhQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERQQ0RhdGFDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERSZXBlYXRhYmxlQ29udGVudChEVERSZXBlYXRhYmxlQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERSZXBlYXRhYmxlQ29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREZpbGUoRFRERmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREQmFzaWNUeXBlKERUREJhc2ljVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERCYXNpY1R5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnVtZXJhdGlvblR5cGUoRFRERW51bWVyYXRpb25UeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURURE5vdGF0aW9uKERURE5vdGF0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURE5vdGF0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5KERUREVudGl0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnRpdHlDb250ZW50KERUREVudGl0eUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5Q29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREV4dGVybmFsRW50aXR5KERUREV4dGVybmFsRW50aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREV4dGVybmFsRW50aXR5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRESW50ZXJuYWxFbnRpdHkoRFRESW50ZXJuYWxFbnRpdHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRESW50ZXJuYWxFbnRpdHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREQ29udGVudChEVERDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURENvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFQXR0cmlidXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUNsYXNzaWZpZXIoRUNsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUNsYXNzaWZpZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3MoRUNsYXNzIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVDbGFzc0FkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVEYXRhVHlwZShFRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRURhdGFUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUVudW0oRUVudW0gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUVudW1BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlCi0JICogY2FzZXMuIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUKLQkgKiBjYXNlcyBhbnl3YXkuCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURE5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVudGl0eUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFeHRlcm5hbEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREludGVybmFsRW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURFJlcGVhdGFibGVDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERWxlbWVudENvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbXB0eUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUKLQkgKiBjYXNlcy4gSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZQotCSAqIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREFueUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERQQ0RhdGFDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRER3JvdXBDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREQXR0cmlidXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERW51bWVyYXRpb25UeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREQmFzaWNUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVFbnVtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFRGF0YVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc2lmaWVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIERUREFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRETWV0cmljcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1ldHJpY3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExODhkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRETWV0cmljcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci0KLQotcHVibGljIGNsYXNzIERURE1ldHJpY3MgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSBlbGVtZW50UmVmZXJlbmNlTWFwOwotCi0JcHVibGljIERURE1ldHJpY3MoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50UmVmZXJlbmNlcygpIHsKLQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VNYXAgPT0gbnVsbCkgewotCQkJZWxlbWVudFJlZmVyZW5jZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJCW5ldyBEVERWaXNpdG9yKCkgewotCi0JCQkJcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBlbGVtZW50UmVmZXJlbmNlQ29udGVudC5nZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQkJCQlPYmplY3QgdmlzaXRhdGlvbiA9IGVsZW1lbnRSZWZlcmVuY2VNYXAuZ2V0KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAodmlzaXRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQllbGVtZW50UmVmZXJlbmNlTWFwLnB1dChkdGRFbGVtZW50LCB2aXNpdGF0aW9uID0gbmV3IFZlY3RvcigpKTsKLQkJCQkJfQotCQkJCQkoKFZlY3RvcikgdmlzaXRhdGlvbikuYWRkRWxlbWVudChlbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJfQotCQkJfS52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZU1hcDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVsZW1lbnRSZWZlcmVuY2VDb3VudChEVERFbGVtZW50IGR0ZEVsZW1lbnQpIHsKLQkJT2JqZWN0IGVsZW1lbnRSZWZlcmVuY2VzID0gZ2V0RWxlbWVudFJlZmVyZW5jZXMoKS5nZXQoZHRkRWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlcyA9PSBudWxsID8gMCA6ICgoVmVjdG9yKSBlbGVtZW50UmVmZXJlbmNlcykuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGdldExlYXN0UmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCURUREVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxvd2VzdFJlZmVyZW5jZUNvdW50ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpbnQgY291bnQgPSBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnQoZWxlbWVudCk7Ci0JCQlpZiAoY291bnQgPCBsb3dlc3RSZWZlcmVuY2VDb3VudCkgewotCQkJCXJlc3VsdCA9IGVsZW1lbnQ7Ci0JCQkJbG93ZXN0UmVmZXJlbmNlQ291bnQgPSBjb3VudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYXNodGFibGUgZ2V0RWxlbWVudFJlZmVyZW5jZXNHZW4oKSB7Ci0KLQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VNYXAgPT0gbnVsbCkgewotCQkJZWxlbWVudFJlZmVyZW5jZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJCW5ldyBEVERWaXNpdG9yKCkgewotCi0JCQkJcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBlbGVtZW50UmVmZXJlbmNlQ29udGVudC5nZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQkJCQlPYmplY3QgdmlzaXRhdGlvbiA9IGVsZW1lbnRSZWZlcmVuY2VNYXAuZ2V0KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAodmlzaXRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQllbGVtZW50UmVmZXJlbmNlTWFwLnB1dChkdGRFbGVtZW50LCB2aXNpdGF0aW9uID0gbmV3IFZlY3RvcigpKTsKLQkJCQkJfQotCQkJCQkoKFZlY3RvcikgdmlzaXRhdGlvbikuYWRkRWxlbWVudChlbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJfQotCQkJfS52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnRHZW4oRFRERWxlbWVudCBkdGRFbGVtZW50KSB7Ci0KLQkJT2JqZWN0IGVsZW1lbnRSZWZlcmVuY2VzID0gZ2V0RWxlbWVudFJlZmVyZW5jZXMoKS5nZXQoZHRkRWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlcyA9PSBudWxsID8gMCA6ICgoVmVjdG9yKSBlbGVtZW50UmVmZXJlbmNlcykuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERWxlbWVudCBnZXRMZWFzdFJlZmVyZW5jZWRFbGVtZW50R2VuKCkgewotCi0JCURUREVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxvd2VzdFJlZmVyZW5jZUNvdW50ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpbnQgY291bnQgPSBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnQoZWxlbWVudCk7Ci0JCQlpZiAoY291bnQgPCBsb3dlc3RSZWZlcmVuY2VDb3VudCkgewotCQkJCXJlc3VsdCA9IGVsZW1lbnQ7Ci0JCQkJbG93ZXN0UmVmZXJlbmNlQ291bnQgPSBjb3VudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1vZGVsQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1vZGVsQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRkMWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERNb2RlbEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFRERmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5BdHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQXR0bGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5DTU5vZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01SZWZlcmVuY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01SZXBlYXRhYmxlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURFNheEFydGlmYWN0VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVsZW1lbnREZWNsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuRW50aXR5RGVjbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVycm9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLk5vdGF0aW9uRGVjbDsKLQotcHVibGljIGNsYXNzIERURE1vZGVsQnVpbGRlciBleHRlbmRzIERURFNheEFydGlmYWN0VmlzaXRvciB7Ci0JRFREIGR0ZDsKLQlEVERVdGlsIGR0ZFV0aWw7Ci0JRFRERmlsZSBkdGRGaWxlOwotCVJlc291cmNlU2V0IHJlc291cmNlczsKLQotCXB1YmxpYyBEVERNb2RlbEJ1aWxkZXIoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBEVERVdGlsIGR0ZFV0aWwsIERURCBkdGQsIERUREZpbGUgZHRkRmlsZSkgewotCQl0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKLQkJdGhpcy5kdGRVdGlsID0gZHRkVXRpbDsKLQkJdGhpcy5kdGQgPSBkdGQ7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIERUREZhY3RvcnlJbXBsIGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRFRERmFjdG9yeUltcGwpIGR0ZFV0aWwuZ2V0RmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREKERURCBkdGQpIHsKLQkJc3VwZXIudmlzaXREVEQoZHRkKTsKLQotCQkvLyAtIDJuZCBwYXNzIC0KLQkJLy8gZG8gZmluYWwgcHJvY2Vzc2luZyBmb3IgQXR0bGlzdHMgYW5kIGFkZGluZyBjb250ZW50TW9kZWwKLQkJYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbChkdGQsIGR0ZEZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2woRWxlbWVudERlY2wgZWxlbWVudCkgewotCQkvLyBFbGVtZW50IG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCQlTdHJpbmcgZGVjbE5hbWUgPSBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJvY2VzcyBFbGVtZW50RGVjbDoiICsgZGVjbE5hbWUgKTsKLQkJRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoZGVjbE5hbWUpOwotCQlpZiAoZHRkZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3MgRWxlbWVudERlY2wgLSBub3QgZm91bmQgLSBjcmVhdGUiCi0JCQkvLyApOwotCQkJZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JCQlkdGRlbGVtZW50LnNldE5hbWUoZGVjbE5hbWUpOwotCQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JCQlkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KGRlY2xOYW1lLCBkdGRlbGVtZW50KTsKLQkJfQotCi0JCXN1cGVyLnZpc2l0RWxlbWVudERlY2woZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2woTm90YXRpb25EZWNsIG5vdGF0aW9uKSB7Ci0JCS8vIE5vdGF0aW9uIG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCQkvLyBieSBhbiBlbnRpdHkKLQkJRFRETm90YXRpb24gZHRkbm90ID0gZHRkRmlsZS5maW5kTm90YXRpb24obm90YXRpb24uZ2V0Tm9kZU5hbWUoKSk7Ci0JCWlmIChkdGRub3QgPT0gbnVsbCkgewotCQkJZHRkbm90ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURE5vdGF0aW9uKCk7Ci0JCQlkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRub3QpOwotCQl9Ci0JCWR0ZG5vdC5zZXROYW1lKG5vdGF0aW9uLmdldE5vZGVOYW1lKCkpOwotCi0JCWlmIChub3RhdGlvbi5nZXRTeXN0ZW1JZCgpICE9IG51bGwpCi0JCQlkdGRub3Quc2V0U3lzdGVtSUQobm90YXRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0JCWlmIChub3RhdGlvbi5nZXRQdWJsaWNJZCgpICE9IG51bGwpCi0JCQlkdGRub3Quc2V0UHVibGljSUQobm90YXRpb24uZ2V0UHVibGljSWQoKSk7Ci0KLQkJaWYgKG5vdGF0aW9uLmdldENvbW1lbnQoKSAhPSBudWxsKQotCQkJZHRkbm90LnNldENvbW1lbnQobm90YXRpb24uZ2V0Q29tbWVudCgpKTsKLQkJaWYgKG5vdGF0aW9uLmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkbm90KTsKLQkJfQotCi0JCXN1cGVyLnZpc2l0Tm90YXRpb25EZWNsKG5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJLy8gVGhpcyBpcyBhIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlLgotCQkvLyBBZGQgdGhlIGxpbmsgdG8gdGhlIHJlYWwgZW50aXR5IHRoYXQgaXQgcmVmZXJlbmNlcwotCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudFJlZiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQocGFybUVudFJlZik7Ci0KLQkJU3RyaW5nIGVudGl0eU5hbWUgPSBlbnRpdHkuZ2V0Tm9kZU5hbWUoKTsKLQotCQkvLyBBZGQgdGhlIHJlZmVyZW5jZSB0byB0aGUgRFRERW50aXR5Ci0JCURUREVudGl0eSBkdGRlbnRpdHkgPSBnZXREVERGaWxlKCkuZmluZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJaWYgKGR0ZGVudGl0eSAhPSBudWxsKSB7Ci0JCQlwYXJtRW50UmVmLnNldEVudGl0eShkdGRlbnRpdHkpOwotCQl9Ci0JCWlmIChlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJYWRkRXJyb3JNZXNzYWdlKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkZW50aXR5KTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBQRSByZWZlcmVuY2U6ICIgKyBkZWNsTmFtZSk7Ci0KLQkJc3VwZXIudmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsKGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbEVudGl0eURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBlbnRpdHk6ICIgKyBkZWNsTmFtZSk7Ci0JCURUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFeHRlcm5hbEVudGl0eSgpOwotCQlkdGRFbnRpdHkuc2V0Q29udGVudChleHRFbnRpdHkpOwotCi0JCWZpbmlzaEV4dGVybmFsRW50aXR5KGV4dEVudGl0eSwgZW50aXR5KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZXh0IGVudGl0eSB0b01vZjogIiApOwotCQlpZiAoZHRkRW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQotCQkJZHRkVXRpbC5nZXRQRVBvb2woKS5wdXQoIiUiICsgZW50aXR5LmdldE5vZGVOYW1lKCkgKyAiOyIsIGR0ZEVudGl0eSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJc3VwZXIudmlzaXRFeHRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEludGVybmFsRW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCQlEVERFbnRpdHkgZHRkRW50aXR5ID0gY3JlYXRlRFRERW50aXR5KGVudGl0eSk7Ci0KLQkJRFRESW50ZXJuYWxFbnRpdHkgaW50RW50aXR5ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREludGVybmFsRW50aXR5KCk7Ci0JCWR0ZEVudGl0eS5zZXRDb250ZW50KGludEVudGl0eSk7Ci0JCWludEVudGl0eS5zZXRWYWx1ZShlbnRpdHkuZ2V0VmFsdWUoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGludCBlbnRpdHkgdG9Nb2Y6ICIgKTsKLQkJaWYgKGR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQlkdGRVdGlsLmdldFBFUG9vbCgpLnB1dCgiJSIgKyBlbnRpdHkuZ2V0Tm9kZU5hbWUoKSArICI7IiwgZHRkRW50aXR5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlzdXBlci52aXNpdEludGVybmFsRW50aXR5RGVjbChlbnRpdHkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBdHRsaXN0QW5kQ29udGVudE1vZGVsKERURCBkdGQsIERUREZpbGUgZEZpbGUpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRBdHRMaXN0QW5kQ290ZW50TW9kZWwgLSBkdGQ6IiArCi0JCS8vIGR0ZC5nZXROYW1lKCkpOwotCQlFbnVtZXJhdGlvbiBlbiA9IGR0ZC5leHRlcm5hbEVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCkgewotCQkJCURUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KCgoRWxlbWVudERlY2wpIGUpLmdldE5vZGVOYW1lKCkpOwotCQkJCWlmIChkdGRlbGVtZW50ID09IG51bGwpIHsKLQkJCQkJZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JCQkJCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCQkJCX0KLQkJCQlmaW5pc2hFbGVtZW50RGVjbChkdGRlbGVtZW50LCAoRWxlbWVudERlY2wpIGUpOwotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEF0dGxpc3QpIHsKLQkJCQlwcm9jZXNzQXR0TGlzdCgoQXR0bGlzdCkgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQXR0TGlzdChBdHRsaXN0IGF0dExpc3QpIHsKLQkJRFRERWxlbWVudCBlID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJLy8gRWxlbWVudCBoYXMgYmVlbiBhZGRlZC4gQWRkIHRoZSBhdHRyaWJ1dGVzCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBwcm9jZXNzQXR0bGlzdCAtIGFkZGluZyBBdHRsaXN0OiIgKwotCQkJLy8gYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkJCWNyZWF0ZUF0dHJpYnV0ZXMoZSwgYXR0TGlzdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISEhISEhISBlbGVtZW50IGlzIG51bGwgIik7Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8KLQkvLyBNZXRob2RzIGZvciBmaW5pc2hpbmcgdGhlIGltcG9ydCBvZiBhIERUREV4dGVybmFsRW50aXR5Ci0JLy8KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0Jdm9pZCBmaW5pc2hFeHRlcm5hbEVudGl0eShEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHksIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCQl1cGRhdGVTeXN0ZW1JRChleHRFbnRpdHksIGVudGl0eURlY2wpOwotCQlleHRFbnRpdHkuc2V0UHVibGljSUQoZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpKTsKLQotCQlTdHJpbmcgbm90YXRpb25OYW1lID0gZW50aXR5RGVjbC5nZXROb3RhdGlvbk5hbWUoKTsKLQkJaWYgKG5vdGF0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQlEVEROb3RhdGlvbiBkdGROb3RhdGlvbiA9IGNyZWF0ZU9yRmluZE5vdGF0aW9uKGV4dEVudGl0eSwgbm90YXRpb25OYW1lLCB0cnVlKTsKLQkJCWV4dEVudGl0eS5zZXROb3RhdGlvbihkdGROb3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRETm90YXRpb24gY3JlYXRlT3JGaW5kTm90YXRpb24oRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJRFRETm90YXRpb24gYU5vdGF0aW9uID0gZXh0RW50aXR5LmdldERUREVudGl0eSgpLmdldERUREZpbGUoKS5maW5kTm90YXRpb24obmFtZSk7Ci0JCWlmIChhTm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGFOb3RhdGlvbjsKLQkJfQotCi0JCS8vCi0JCS8vIENyZWF0ZSBhIG5vdGF0aW9uIGZvciB0aGUgcmVmZXJlbmNlCi0JCS8vCi0JCWlmIChjcmVhdGUpIHsKLQkJCWFOb3RhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoYU5vdGF0aW9uKTsKLQkJCWFOb3RhdGlvbi5zZXROYW1lKG5hbWUpOwotCQl9Ci0JCXJldHVybiBhTm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogVGhlIFN5c3RlbUlEIGF0dHJpYnV0ZSBpcyBzZXQgdG8gd2hhdGV2ZXIgdGhlIHVzZXIgZW50ZXJzIGUuZy4KLQkgKiBjb20vaWJtL2IyYi94bWltb2RlbHMveHh4LmR0ZC54bWkKLQkgKiAKLQkgKiBJbiB0aGUgdW5wYXJzZSgpIG1ldGhvZCwgcGFyc2Ugb3V0IHRoZSBEVEQgZmlsZSBuYW1lIGZyb20gdGhlIGNsYXNzcGF0aAotCSAqIG5hbWUuIGUuZy4gcmV0dXJucyB4eHguZHRkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN5c3RlbUlEKERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSwgRW50aXR5RGVjbCBlbnRpdHlEZWNsKSB7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IGVudGl0eURlY2wuZ2V0U3lzdGVtSWQoKTsKLQkJU3RyaW5nIHB1YmxpY0lkID0gZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpOwotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJVVJJUmVzb2x2ZXIgaWRSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCQlTdHJpbmcgdXJpID0gaWRSZXNvbHZlci5yZXNvbHZlKGR0ZC5nZXROYW1lKCksIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQlFeHRlcm5hbERURE1vZGVsIGVkID0gZHRkVXRpbC5nZXRFeHRlcm5hbERURE1vZGVsKHJlc291cmNlcywgdXJpKTsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJRFRERmlsZSByZWZlcmVuY2VEdGRGaWxlID0gZWQuZ2V0RXh0ZXJuYWxEVERGaWxlKCk7Ci0JCQkJZXh0RW50aXR5LnNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUocmVmZXJlbmNlRHRkRmlsZSk7Ci0JCQkJZXh0RW50aXR5LnNldFN5c3RlbUlEKHN5c3RlbUlkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlbnRpdHlEZWNsLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQkJRXJyb3JNZXNzYWdlIGR0ZEVycm9yID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCQkJCQlkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9JTkNMX0ZJTEVfTE9BRF9GQUlMVVJFICsgIiAnIiArIHN5c3RlbUlkICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yLCBleHRFbnRpdHkuZ2V0RFRERW50aXR5KCkpOwotCQkJCX0KLQotCQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKSB7Ci0JCQkJCWV4dEVudGl0eS5zZXRTeXN0ZW1JRChzeXN0ZW1JZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQllbHNlIHsKLQkJCS8vIHNldCB0aGUgc3lzdGVtIGlkIHRvIGJlICIiCi0JCQlleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRERW50aXR5IGNyZWF0ZURUREVudGl0eShFbnRpdHlEZWNsIGVudGl0eSkgewotCQkvLyBjcmVhdGUgYW5kIGRvIHdoYXQgd2UgY2FuIHRvIGZpbGwgaW4gc29tZSBiYXNpYyB0aGluZ3MKLQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnRpdHkoKTsKLQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkRW50aXR5KTsKLQotCQlkdGRFbnRpdHkuc2V0TmFtZShlbnRpdHkuZ2V0Tm9kZU5hbWUoKSk7Ci0JCWR0ZEVudGl0eS5zZXRQYXJhbWV0ZXJFbnRpdHkoZW50aXR5LmlzUGFyYW1ldGVyKCkpOwotCQlpZiAoZW50aXR5LmdldENvbW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlkdGRFbnRpdHkuc2V0Q29tbWVudChlbnRpdHkuZ2V0Q29tbWVudCgpKTsKLQkJfQotCQlpZiAoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVudGl0eSk7Ci0JCX0KLQotCQlyZXR1cm4gZHRkRW50aXR5OwotCX0KLQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vCi0JLy8gTWV0aG9kcyBmb3IgZmluaXNoaW5nIHRoZSBpbXBvcnQgb2YgYSBEVERFbGVtZW50Ci0JLy8KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JcHVibGljIHZvaWQgZmluaXNoRWxlbWVudERlY2woRFRERWxlbWVudCBkdGRFbGVtZW50LCBFbGVtZW50RGVjbCBlZCkgewotCQlkdGRFbGVtZW50LnNldE5hbWUoZWQuZ2V0Tm9kZU5hbWUoKSk7Ci0KLQkJQ01Ob2RlIGNtTm9kZSA9IGVkLmdldENvbnRlbnRNb2RlbE5vZGUoKTsKLQotCQlpZiAoZWQuZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKLQkJCWR0ZEVsZW1lbnQuc2V0Q29tbWVudChlZC5nZXRDb21tZW50KCkpOwotCQl9Ci0JCWlmIChlZC5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlhZGRFcnJvck1lc3NhZ2UoZWQuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQlDTUJhc2ljTm9kZSBibiA9IChDTUJhc2ljTm9kZSkgY21Ob2RlOwotCQkJc3dpdGNoIChibi5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIENNTm9kZVR5cGUuRU1QVFkgOgotCQkJCQlEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQkJCQlkdGRFbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIENNTm9kZVR5cGUuQU5ZIDoKLQkJCQkJRFREQW55Q29udGVudCBhbnlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREFueUNvbnRlbnQoKTsKLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGFueUNvbnRlbnQpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQ01Ob2RlVHlwZS5QQ0RBVEEgOgotCQkJCQlEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChwY0RhdGEpOwotCQkJfQotCi0JCX0KLQkJZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKSB7Ci0JCQlDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbU5vZGU7Ci0JCQlpZiAocm4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRSkgewotCQkJCVN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQotCQkJCURUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCQkJCWlmIChhbkVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCS8vCi0JCQkJCS8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkvLyBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW5SZWYgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCQkJCQllblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0KLQkJCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQkJZW5SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0KLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVuUmVmKTsKLQkJCQl9Ci0JCQkJZWxzZSB7IC8vIGNyZWF0ZSBkZWZhdWx0IGNvbnRlbnQKLQkJCQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8KLQkJCQkvLyBGaW5kIHRoZSByZWFsIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCByZWZlcmVuY2VzCi0JCQkJLy8gSWYgdGhlIHJlYWwgZWxlbWVudCBkb2VzIG5vdCB5ZXQgZXhpc3QsIGNyZWF0ZSBpdAotCQkJCS8vCi0JCQkJRFRERWxlbWVudCBhbkVsZW1lbnQgPSBjcmVhdGVPckZpbmRFbGVtZW50KHJuLmdldE5hbWUoKSwgZHRkRWxlbWVudCk7Ci0KLQkJCQkvLwotCQkJCS8vIENyZWF0ZSBhbiBEVERFbGVtZW50UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQKLQkJCQkvLyBlbGVtZW50Ci0JCQkJLy8KLQkJCQlEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0JCQkJZWxlbVJlZi5zZXRSZWZlcmVuY2VkRWxlbWVudChhbkVsZW1lbnQpOwotCi0JCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQllbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJLy8gc2V0Q29udGVudCB0byBEVERFbGVtZW50UmVmZXJlbmNlCi0JCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVsZW1SZWYpOwotCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCUNNR3JvdXBOb2RlIGdycE5vZGUgPSAoQ01Hcm91cE5vZGUpIGNtTm9kZTsKLQkJCURUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0JCQlEVERHcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRER3JvdXBLaW5kLmdldChjb21wdXRlTW9mR3JvdXBLaW5kKGdycE5vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkJCWdyb3VwQ29udGVudC5zZXRHcm91cEtpbmQoZ3JvdXBLaW5kKTsKLQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdycE5vZGUpKTsKLQkJCWdyb3VwQ29udGVudC5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQotCQkJLy8ganVzdCB1c2UgdGhlIGxvY2F0b3IgZm9yIHRoZSBlbGVtZW50IGFzIHRoZSBjbG9zZXN0IGd1ZXNzCi0JCQlwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCwgZ3JwTm9kZSk7Ci0JCQlkdGRFbGVtZW50LnNldENvbnRlbnQoZ3JvdXBDb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjbU5vZGUgPT0gbnVsbCkgewotCQkJLy8gYmFkIHRoaW5nIGhhcHBlbmVkIGhlcmUsIGp1c3QgY3JlYXRlIGEgcGNkYXRhCi0JCQlEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JCX0KLQotCi0JfQotCi0KLQkvKioKLQkgKiBBZGQgYSBuZXcgZ3JvdXAgdG8gdGhlIGN1cnJlbnQgZ3JvdXAKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgbm9kZSBmb3IgdGhpcyBncm91cCBlbGVtZW50Ci0JICogQHBhcmFtIG9wMU5vZGUgLQotCSAqICAgICAgICAgICAgdGhlIGdyb3VwIGUuZy4gKGEsYikKLQkgKiBAcGFyYW0gb3AyTm9kZSAtCi0JICogICAgICAgICAgICBzZXQgb25seSBpZiBjYWxsZWQgYnkgcHJvY2Vzc0NNMW9wIGUuZy4gKGEsYikrCi0JICovCi0Jdm9pZCBwcm9jZXNzR3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBwYXJlbnQsIENNR3JvdXBOb2RlIGdycE5vZGUpIHsKLQkJRW51bWVyYXRpb24gY2hpbGRyZW4gPSBncnBOb2RlLmdldENoaWxkcmVuKCkuZWxlbWVudHMoKTsKLQkJRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCQl3aGlsZSAoY2hpbGRyZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUNNTm9kZSBjbm9kZSA9IChDTU5vZGUpIGNoaWxkcmVuLm5leHRFbGVtZW50KCk7Ci0KLQkJCWlmIChjbm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJQ01Hcm91cE5vZGUgZ05vZGUgPSAoQ01Hcm91cE5vZGUpIGNub2RlOwotCQkJCURUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCQkJCURUREdyb3VwS2luZCBncm91cEtpbmQgPSBEVERHcm91cEtpbmQuZ2V0KGNvbXB1dGVNb2ZHcm91cEtpbmQoZ05vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkJCQlncm91cENvbnRlbnQuc2V0R3JvdXBLaW5kKGdyb3VwS2luZCk7Ci0JCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2UoZ05vZGUpKTsKLQkJCQlncm91cENvbnRlbnQuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0KLQkJCQlwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChncm91cENvbnRlbnQpOwotCQkJCXByb2Nlc3NHcm91cENvbnRlbnQoZ3JvdXBDb250ZW50LCBnTm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJQ01CYXNpY05vZGUgbiA9IChDTUJhc2ljTm9kZSkgY25vZGU7Ci0JCQkJaWYgKG4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuUENEQVRBKSB7Ci0JCQkJCS8vIENyZWF0ZSBhIERURFBDRGF0YUNvbnRlbnQgZm9yIGEgbGVhZiBQQ0RhdGEgbm9kZQotCQkJCQkvLwotCQkJCQlEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGZhY3RvcnkuY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCQkJCQkvLyBBZGQgI1BDREFUQSB0byB0aGUgR3JvdXAsIGkuZSBNaXhlZCBjb250ZW50IG1vZGVsCi0JCQkJCXBhcmVudC5nZXRDb250ZW50KCkuYWRkKHBjRGF0YSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoY25vZGUgaW5zdGFuY2VvZiBDTVJlZmVyZW5jZU5vZGUpIHsKLQkJCQlDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbm9kZTsKLQkJCQlpZiAocm4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDTSBFbGVtZW50IFJlZiBuYW1lOiAiICsKLQkJCQkJLy8gcm4uZ2V0TmFtZSgpKTsKLQkJCQkJLy8KLQkJCQkJLy8gQ3JlYXRlIGFuIERUREVsZW1lbnRSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkvLyBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1SZWYgPSBmYWN0b3J5LmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkJCQkJLy8KLQkJCQkJLy8gRmluZCB0aGUgcmVhbCBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlcwotCQkJCQkvLyBJZiB0aGUgcmVhbCBlbGVtZW50IGRvZXMgbm90IHlldCBleGlzdCwgY3JlYXRlIGl0Ci0JCQkJCS8vCi0JCQkJCURUREVsZW1lbnQgYW5FbGVtZW50ID0gY3JlYXRlT3JGaW5kRWxlbWVudChybi5nZXROYW1lKCksIGVsZW1SZWYpOwotCi0JCQkJCWVsZW1SZWYuc2V0UmVmZXJlbmNlZEVsZW1lbnQoYW5FbGVtZW50KTsKLQotCQkJCQlEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9IERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCQkJCQllbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJCS8vIEFkZCBEVERFbGVtZW50UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCQkJCQlwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChlbGVtUmVmKTsKLQkJCQl9Ci0JCQkJZWxzZSAvLyBQRSBSZWZlcmVuY2UKLQkJCQl7Ci0JCQkJCVN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNIFBFIFJlZiBuYW1lOiAiICsgZW50aXR5TmFtZSk7Ci0JCQkJCURUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCQkJCQlpZiAoYW5FbnRpdHkgIT0gbnVsbCkgewotCQkJCQkJLy8KLQkJCQkJCS8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkJLy8gZWxlbWVudAotCQkJCQkJLy8KLQkJCQkJCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW5SZWYgPSBmYWN0b3J5LmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkJCQkJCWVuUmVmLnNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KGFuRW50aXR5KTsKLQotCQkJCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQkJCWVuUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJCQkvLyBBZGQgRFRERW50aXR5UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCQkJCQkJcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZW5SZWYpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSByZWFsIGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50IGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIERUREVsZW1lbnQgY3JlYXRlT3JGaW5kRWxlbWVudChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikgewotCQkvLyBEVERFbGVtZW50IGFFbGVtZW50ID0gZ2V0RFRERmlsZSgpLmZpbmRFbGVtZW50KG5hbWUpOwotCi0JCURUREVsZW1lbnQgYUVsZW1lbnQgPSAoRFRERWxlbWVudCkgZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldChuYW1lKTsKLQotCQlpZiAoYUVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFFbGVtZW50OwotCQl9Ci0KLQkJU3RyaW5nIGVycm9yTXNnID0gRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9VTkRFQ0xBUkVEX0VMRU1FTlRfMTsgLy8kTk9OLU5MUy0xJAotCQllcnJvck1zZyArPSAiXCIiICsgbmFtZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllcnJvck1zZyArPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMjsgLy8kTk9OLU5MUy0xJAotCi0JCUVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCQlhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IsIG9iaik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvck1zZyk7Ci0JCS8vIHNldERUREVycm9yTWVzc2FnZShlcnJvck1zZyk7Ci0JCWdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCi0JCS8vCi0JCS8vIENyZWF0ZSBhbiBlbXB0eSBlbGVtZW50IGZvciB0aGUgcmVmZXJlbmNlIHRvIG1ha2UgaXQgdmFsaWQKLQkJLy8KLQotCQlEVERGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JCURUREVsZW1lbnQgZHRkZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlRFRERWxlbWVudCgpOwotCQlkdGRlbGVtZW50LnNldE5hbWUobmFtZSk7Ci0KLQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGZhY3RvcnkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JCWR0ZGVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCi0JCWdldERUREZpbGUoKS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JCWR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5wdXQobmFtZSwgZHRkZWxlbWVudCk7Ci0JCXJldHVybiBkdGRlbGVtZW50OwotCX0KLQotCi0JLyoqCi0JICogQ29tcHV0ZSB0aGUgTU9GIG9jY3VycmVuY2UgZnJvbSB0aGUgeG1sNGogb2NjdXJyZW5jZQotCSAqLwotCXByaXZhdGUgaW50IGNvbXB1dGVNb2ZPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUgcm5vZGUpIHsKLQkJaW50IG9jY3VycmVuY2UgPSBybm9kZS5nZXRPY2N1cnJlbmNlKCk7Ci0JCWludCBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORTsKLQotCQlpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSkgewotCQkJbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkU7Ci0JCX0KLQkJZWxzZSBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKSB7Ci0JCQltb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFOwotCQl9Ci0JCWVsc2UgaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5PUFRJT05BTCkgewotCQkJbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PUFRJT05BTDsKLQkJfQotCQlyZXR1cm4gbW9mb2NjdXI7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZSB0aGUgTU9GIG1vZGVsIGdyb3VwIGZyb20gdGhlIHhtbDRqIG1vZGVsIGdyb3VwCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZU1vZkdyb3VwS2luZChpbnQgdHlwZSkgewotCQlpZiAodHlwZSA9PSBDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSkgewotCQkJcmV0dXJuIERUREdyb3VwS2luZC5DSE9JQ0U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRFRER3JvdXBLaW5kLlNFUVVFTkNFOwotCQl9Ci0JfQotCi0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8KLQkvLyBNZXRob2RzIGZvciBjcmVhdGluZyB0aGUgYXR0cmlidXRlcyBvZiBhIERUREVsZW1lbnQKLQkvLwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBdHRyaWJ1dGVzKERUREVsZW1lbnQgZWxlbWVudCwgQXR0bGlzdCBhdHRMaXN0KSB7Ci0JCWlmIChhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpLCBlbGVtZW50KTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0TGlzdC5zaXplKCk7IGkrKykgewotCQkJQXR0Tm9kZSBhZCA9IGF0dExpc3QuZWxlbWVudEF0KGkpOwotCQkJLy8gRFREQXR0cmlidXRlRWxlbWVudCBkdGRBdHQ9Ci0JCQkvLyBnZXREVERBdHRyaWJ1dGVFbGVtZW50KGEuZ2V0TmFtZSgpKTsKLQotCQkJLy8gb25seSBhZGQgdGhlIEF0dERlZiBpZiBpdCBpcyBub3QgYWRkZWQgeWV0Ci0JCQkvLyBpZ25vcmUgdGhlIGR1cCBBdHREZWYgYXMgZG9jdW1lbnRlZCBpbiB0aGUgWE1MIDEuMCBzcGVjcwotCQkJLy8gaWYoIGR0ZEF0dD09bnVsbCkKLQkJCWFkZEF0dHJpYnV0ZShlbGVtZW50LCBhZCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIERUREF0dHJpYnV0ZSBmcm9tIHRoZSB4bWw0aiBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoRFRERWxlbWVudCBkdGRlbGVtZW50LCBBdHROb2RlIGFkKSB7Ci0JCURUREF0dHJpYnV0ZSBkdGRhdHRyID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCQlkdGRlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpLmFkZChkdGRhdHRyKTsKLQkJZmluaXNoQXR0cmlidXRlKGR0ZGF0dHIsIGFkKTsKLQl9Ci0KLQkvLyBTdHVmZiBmb3IgcG9wdWxhdGluZyBhdHRyaWJ1dGUKLQlwdWJsaWMgdm9pZCBmaW5pc2hBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGR0ZGF0dHIsIEF0dE5vZGUgYXR0ZGVmKSB7Ci0JCWJvb2xlYW4gcGFyc2VFcnJvciA9IGZhbHNlOwotCi0JCWlmIChhdHRkZWYubmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi5uYW1lLnRyaW0oKTsKLQkJCURUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JCQlpZiAoZW4gIT0gbnVsbCkgewotCQkJCWR0ZGF0dHIuc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCQkJfQotCQl9Ci0KLQkJZHRkYXR0ci5zZXROYW1lKGF0dGRlZi5uYW1lKTsKLQotCQlpbnQgYXR0clR5cGUgPSBhdHRkZWYuZ2V0RGVjbGFyZWRUeXBlKCk7Ci0KLQkJaWYgKGF0dHJUeXBlID09IEF0dE5vZGUuUEVSRUZFUkVOQ0UgJiYgYXR0ZGVmLnR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi50eXBlLnRyaW0oKTsKLQkJCURUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JCQlpZiAoZW4gIT0gbnVsbCkgewotCQkJCWR0ZGF0dHIuc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7IC8vIGhhY2ssCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHdlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBnZXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmFjawotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVmYXVsdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZQotCQkJfQotCQkJZWxzZQotCQkJCS8vIHNldCBkZWZhdWx0IHR5cGUKLQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOwotCi0JCX0KLQkJZWxzZSB7Ci0JCQlzd2l0Y2ggKGF0dHJUeXBlKSB7Ci0JCQkJY2FzZSBBdHROb2RlLkNEQVRBIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuRU5USVRJRVMgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUSUVTKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5FTlRJVFkgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuSUQgOgotCQkJCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlIElEIGF0dHJpYnV0ZQotCQkJCQlpZiAoaGFzSURBdHRyaWJ1dGUoZHRkYXR0cikpIHsKLQkJCQkJCVN0cmluZyBlcnJNc2cgPSBEVERDb3JlTWVzc2FnZXMuX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZXJyTXNnICs9IGF0dGRlZi5uYW1lICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXRJRWxlbWVudCgpLnNldERUREVycm9yTWVzc2FnZShlcnJNc2cpOwotCQkJCQkJLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JCQkJCQlwYXJzZUVycm9yID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5JRFJFRiA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSURSRUYoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLklEUkVGUyA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSURSRUZTKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5FTlVNRVJBVElPTiA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGNyZWF0ZURUREVudW1lcmF0aW9uKGR0ZGF0dHIsIGF0dGRlZiwgRFRERW51bUdyb3VwS2luZC5OQU1FX1RPS0VOX0dST1VQKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLk5PVEFUSU9OIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgY3JlYXRlRFRERW51bWVyYXRpb24oZHRkYXR0ciwgYXR0ZGVmLCBEVERFbnVtR3JvdXBLaW5kLk5PVEFUSU9OX0dST1VQKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLk5NVE9LRU4gOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX05NVE9LRU4oKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLk5NVE9LRU5TIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOUygpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0IDoKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQVRUUiAnIiArYXR0ZGVmLm5hbWUgKyAiJ1Vua25vd24KLQkJCS8vIHR5cGUuLi4iICsgYXR0clR5cGUpOwotCQkJfQotCQl9Ci0KLQkJaW50IGF0dHJEZWZhdWx0ID0gYXR0ZGVmLmdldERlZmF1bHRUeXBlKCk7Ci0JCWludCBkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLklNUExJRUQ7Ci0JCXN3aXRjaCAoYXR0ckRlZmF1bHQpIHsKLQkJCWNhc2UgQXR0Tm9kZS5GSVhFRCA6Ci0JCQkJZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5GSVhFRDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBdHROb2RlLklNUExJRUQgOgotCQkJCWRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuSU1QTElFRDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBdHROb2RlLlJFUVVJUkVEIDoKLQkJCQlkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLlJFUVVJUkVEOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEF0dE5vZGUuTk9GSVhFRCA6Ci0JCQkJZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5OT0ZJWEVEOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBVFRSICciICthdHRkZWYubmFtZSArICInIFVua25vd24gZGVmYXVsdAotCQkvLyB0eXBlLi4uICIgKyBhdHRyRGVmYXVsdCk7Ci0JCX0KLQotCQlEVEREZWZhdWx0S2luZCBkZWZhdWx0S2luZE9iaiA9IERURERlZmF1bHRLaW5kLmdldChkZWZhdWx0S2luZCk7Ci0JCWR0ZGF0dHIuc2V0RGVmYXVsdEtpbmQoZGVmYXVsdEtpbmRPYmopOwotCi0JCWlmIChwYXJzZUVycm9yKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ZGVmLmRlZmF1bHRWYWx1ZTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYXR0clR5cGUgPT0gQXR0Tm9kZS5FTlVNRVJBVElPTiB8fCBhdHRyVHlwZSA9PSBBdHROb2RlLk5PVEFUSU9OKSB7Ci0JCQkJaWYgKCFpc0RlZmF1bHRFbnVtVmFsdWVWYWxpZChhdHRkZWYsIGRlZmF1bHRWYWx1ZSkpIHsKLQkJCQkJU3RyaW5nIHR5cGVTdHJpbmcgPSAoYXR0clR5cGUgPT0gQXR0Tm9kZS5FTlVNRVJBVElPTiA/ICJlbnVtZXJhdGlvbiIgOiAibm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN0cmluZyBlcnJNc2cgPSBEVERDb3JlTWVzc2FnZXMuX0VSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzE7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZXJyTXNnICs9IHR5cGVTdHJpbmcgKyBEVERDb3JlTWVzc2FnZXMuX1VJX0VSUk9SUEFSVF9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yOyAvLyROT04tTkxTLTEkCi0JCQkJCWVyck1zZyArPSBhdHRkZWYubmFtZSArICInIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldElFbGVtZW50KCkuc2V0RFRERXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JCQkJCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZHRkYXR0ci5zZXREZWZhdWx0VmFsdWVTdHJpbmcoZGVmYXVsdFZhbHVlKTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREF0dHIgLSB0b01vZiBnZXREZWZhdWx0VmFsdWVTdHJpbmcgIiArCi0JCS8vIGdldERlZmF1bHRWYWx1ZVN0cmluZygpKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBdHRyIC0gdG9Nb2YgZ2V0RGVmYXVsdFZhbHVlOiAiICsKLQkJLy8gZ2V0RGVmYXVsdFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0lEQXR0cmlidXRlKERUREF0dHJpYnV0ZSBkdGRhdHRyKSB7Ci0JCWJvb2xlYW4gaGFzSUQgPSBmYWxzZTsKLQotCQlEVERFbGVtZW50IGVsZW1lbnQgPSBkdGRhdHRyLmdldERUREVsZW1lbnQoKTsKLQkJRUxpc3QgYXR0cnMgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpOwotCi0JCUl0ZXJhdG9yIGkgPSBhdHRycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCURUREF0dHJpYnV0ZSBhdHRyID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JCQlEVERUeXBlIGRUeXBlID0gYXR0ci5nZXREVERUeXBlKCk7Ci0JCQlpZiAoZFR5cGUgaW5zdGFuY2VvZiBEVERCYXNpY1R5cGUpIHsKLQkJCQlpZiAoKChEVERCYXNpY1R5cGUpIGRUeXBlKS5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERCYXNpY1R5cGVLaW5kLklEKSB7Ci0JCQkJCWhhc0lEID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoYXNJRDsKLQl9Ci0KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBTdHJpbmdbXSBlbnVtVmFsdWVzLCBpbnQgZW51bUtpbmQpIHsKLQkJRFRERW51bWVyYXRpb25UeXBlIGVudW1lcmF0aW9uID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCQlEVERFbnVtR3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREVudW1Hcm91cEtpbmQuZ2V0KGVudW1LaW5kKTsKLQkJZW51bWVyYXRpb24uc2V0S2luZChncm91cEtpbmQpOwotCQkvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkJaWYgKGVudW1WYWx1ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JCQkJLy8gZW51bVZhbC5zZXRYTUlEb2N1bWVudChkdGRhdHRyLmdldFhNSURvY3VtZW50KCkpOwotCQkJCS8vIE1PRjJFTUYgUG9ydAotCQkJCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwoZW51bVZhbHVlc1tpXSk7Ci0JCQkJZW51bUxpdGVyYWwuc2V0TmFtZShlbnVtVmFsdWVzW2ldKTsKLQotCQkJCS8vIGVudW1MaXRlcmFsLnNldE51bWJlcihpKTsKLQkJCQllbnVtZXJhdGlvbi5nZXRFbnVtTGl0ZXJhbHMoKS5hZGQoZW51bUxpdGVyYWwpOwotCQkJfQotCQl9Ci0JCWR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bWVyYXRpb24pOwotCQlyZXR1cm4gZW51bWVyYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBFRW51bUxpdGVyYWwgY3JlYXRlRUVudW1MaXRlcmFsKCkgewotCQlFY29yZVBhY2thZ2UgZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCS8vIE1PRjJFTUYgUG9ydAotCQkvLyByZXR1cm4gKChFY29yZUZhY3RvcnkpZVBhY2thZ2UuZ2V0RmFjdG9yeSgpKS5jcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkJcmV0dXJuIGVQYWNrYWdlLmdldEVjb3JlRmFjdG9yeSgpLmNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCX0KLQotCXByaXZhdGUgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBBdHROb2RlIGF0dGRlZiwgaW50IGVudW1LaW5kKSB7Ci0JCURUREVudW1lcmF0aW9uVHlwZSBlbnVtZXJhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJRFRERW51bUdyb3VwS2luZCBncm91cEtpbmQgPSBEVERFbnVtR3JvdXBLaW5kLmdldChlbnVtS2luZCk7Ci0JCWVudW1lcmF0aW9uLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkJZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLmdldERUREVudW1lcmF0aW9uVHlwZSgpLmFkZChlbnVtZXJhdGlvbik7Ci0KLQkJLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JCUVudW1lcmF0aW9uIHRva2VuSXRlciA9IGF0dGRlZi5lbGVtZW50cygpOwotCQlpZiAodG9rZW5JdGVyICE9IG51bGwpIHsKLQkJCXdoaWxlICh0b2tlbkl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgdmFsID0gKFN0cmluZykgdG9rZW5JdGVyLm5leHRFbGVtZW50KCk7Ci0JCQkJRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JCQkJLy8gZW51bUxpdGVyYWwuc2V0WE1JRG9jdW1lbnQoZHRkYXR0ci5nZXRYTUlEb2N1bWVudCgpKTsKLQkJCQkvLyBNT0YyRU1GIFBvcnQKLQkJCQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKHZhbCk7Ci0JCQkJZW51bUxpdGVyYWwuc2V0TmFtZSh2YWwpOwotCi0KLQkJCQkvLyBlbnVtTGl0ZXJhbC5zZXROdW1iZXIoaSsrKTsKLQkJCQllbnVtZXJhdGlvbi5nZXRFbnVtTGl0ZXJhbHMoKS5hZGQoZW51bUxpdGVyYWwpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVudW1lcmF0aW9uOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRFbnVtVmFsdWVWYWxpZChBdHROb2RlIGF0dGRlZiwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29udGFpbnNQZXJjZW50ID0gZmFsc2U7Ci0KLQkJLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JCUVudW1lcmF0aW9uIGVudW1WYWx1ZXMgPSBhdHRkZWYuZWxlbWVudHMoKTsKLQkJd2hpbGUgKGVudW1WYWx1ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyB2YWwgPSAoU3RyaW5nKSBlbnVtVmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAodmFsLmVxdWFscyhkZWZhdWx0VmFsdWUpKSB7Ci0JCQkJdmFsaWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHZhbC5pbmRleE9mKCclJykgPj0gMCkgewotCQkJCWNvbnRhaW5zUGVyY2VudCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkIHx8IGNvbnRhaW5zUGVyY2VudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyRFREVHlwZShEVERBdHRyaWJ1dGUgZHRkYXR0ciwgRFREVHlwZSB0eXBlKSB7Ci0JCWR0ZGF0dHIuc2V0RFREVHlwZSh0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvck1lc3NhZ2UoRXJyb3JNZXNzYWdlIGVyck1zZywgT2JqZWN0IG9iaikgewotCQllcnJNc2cuc2V0T2JqZWN0KG9iaik7Ci0JCWR0ZFV0aWwuYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERmFjdG9yeUltcGwgZ2V0RmFjdG9yeUdlbigpIHsKLQkvLwotCS8vIHJldHVybiAoRFRERmFjdG9yeUltcGwpZHRkVXRpbC5nZXRGYWN0b3J5KCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREZpbGUgZ2V0RFRERmlsZUdlbigpIHsKLQkvLwotCS8vIHJldHVybiBkdGRGaWxlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRER2VuKERURCBkdGQpIHsKLQkvLwotCS8vIHN1cGVyLnZpc2l0RFREKGR0ZCk7Ci0JLy8KLQkvLwotCS8vIC8vIC0gMm5kIHBhc3MgLQotCS8vIC8vIGRvIGZpbmFsIHByb2Nlc3NpbmcgZm9yIEF0dGxpc3RzIGFuZCBhZGRpbmcgY29udGVudE1vZGVsCi0JLy8gYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbChkdGQsZHRkRmlsZSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXRFbGVtZW50RGVjbEdlbihFbGVtZW50RGVjbCBlbGVtZW50KSB7Ci0JLy8KLQkvLyAvLyBFbGVtZW50IG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCS8vIFN0cmluZyBkZWNsTmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSA7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcm9jZXNzIEVsZW1lbnREZWNsOiIgKyBkZWNsTmFtZSApOwotCS8vIERUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KQotCS8vIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoZGVjbE5hbWUpOwotCS8vIGlmIChkdGRlbGVtZW50ID09IG51bGwpCi0JLy8gewotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJvY2VzcyBFbGVtZW50RGVjbCAtIG5vdCBmb3VuZCAtIGNyZWF0ZSIgKTsKLQkvLyBkdGRlbGVtZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVsZW1lbnQoKTsKLQkvLyBkdGRlbGVtZW50LnNldE5hbWUoZGVjbE5hbWUpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCS8vIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5wdXQoZGVjbE5hbWUsZHRkZWxlbWVudCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdEVsZW1lbnREZWNsKGVsZW1lbnQpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0Tm90YXRpb25EZWNsR2VuKE5vdGF0aW9uRGVjbCBub3RhdGlvbikgewotCS8vCi0JLy8gLy8gTm90YXRpb24gbWlnaHQgaGF2ZSBiZWVuIGFkZGVkIGVhcmxpZXIgYmVjYXVzZSBpdCBpcyByZWZlcmVuY2VkCi0JLy8gLy8gYnkgYW4gZW50aXR5Ci0JLy8gRFRETm90YXRpb24gZHRkbm90ID0gZHRkRmlsZS5maW5kTm90YXRpb24oIG5vdGF0aW9uLmdldE5vZGVOYW1lKCkgKTsKLQkvLyBpZiAoZHRkbm90ID09IG51bGwpCi0JLy8gewotCS8vIGR0ZG5vdCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZG5vdCk7Ci0JLy8gfQotCS8vIGR0ZG5vdC5zZXROYW1lKG5vdGF0aW9uLmdldE5vZGVOYW1lKCkpOwotCS8vCi0JLy8KLQkvLyBpZiAobm90YXRpb24uZ2V0U3lzdGVtSWQoKSE9IG51bGwgKQotCS8vIGR0ZG5vdC5zZXRTeXN0ZW1JRChub3RhdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkvLyBpZiAobm90YXRpb24uZ2V0UHVibGljSWQoKSE9IG51bGwgKQotCS8vIGR0ZG5vdC5zZXRQdWJsaWNJRChub3RhdGlvbi5nZXRQdWJsaWNJZCgpKTsKLQkvLwotCS8vCi0JLy8gaWYgKG5vdGF0aW9uLmdldENvbW1lbnQoKSE9bnVsbCkKLQkvLyBkdGRub3Quc2V0Q29tbWVudChub3RhdGlvbi5nZXRDb21tZW50KCkpOwotCS8vIGlmIChub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKG5vdGF0aW9uLmdldEVycm9yTWVzc2FnZSgpLCBkdGRub3QpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXROb3RhdGlvbkRlY2wobm90YXRpb24pOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0UGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRGVjbEdlbihFbnRpdHlEZWNsIGVudGl0eSkKLQkvLyB7Ci0JLy8KLQkvLyAvLyBUaGlzIGlzIGEgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UuCi0JLy8gLy8gQWRkIHRoZSBsaW5rIHRvIHRoZSByZWFsIGVudGl0eSB0aGF0IGl0IHJlZmVyZW5jZXMKLQkvLyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudFJlZiA9Ci0JLy8gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKHBhcm1FbnRSZWYpOwotCS8vCi0JLy8KLQkvLyBTdHJpbmcgZW50aXR5TmFtZSA9IGVudGl0eS5nZXROb2RlTmFtZSgpOwotCS8vCi0JLy8KLQkvLyAvLyBBZGQgdGhlIHJlZmVyZW5jZSB0byB0aGUgRFRERW50aXR5Ci0JLy8gRFRERW50aXR5IGR0ZGVudGl0eSA9IGdldERUREZpbGUoKS5maW5kRW50aXR5KGVudGl0eU5hbWUpOwotCS8vIGlmIChkdGRlbnRpdHkgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcGFybUVudFJlZi5zZXRFbnRpdHkoZHRkZW50aXR5KTsKLQkvLyB9Ci0JLy8gaWYgKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkZW50aXR5KTsKLQkvLyB9Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgUEUgcmVmZXJlbmNlOiAiICsgZGVjbE5hbWUpOwotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woZW50aXR5KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVybmFsRW50aXR5RGVjbEdlbihFbnRpdHlEZWNsIGVudGl0eSkgewotCS8vCi0JLy8gRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIGVudGl0eTogIiArIGRlY2xOYW1lKTsKLQkvLyBEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQkvLyBkdGRFbnRpdHkuc2V0Q29udGVudChleHRFbnRpdHkpOwotCS8vCi0JLy8KLQkvLyBmaW5pc2hFeHRlcm5hbEVudGl0eShleHRFbnRpdHksIGVudGl0eSk7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZXh0IGVudGl0eSB0b01vZjogIiApOwotCS8vIGlmIChkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkvLyB7Ci0JLy8KLQkvLwotCS8vIGR0ZFV0aWwuZ2V0UEVQb29sKCkucHV0KCIlIitlbnRpdHkuZ2V0Tm9kZU5hbWUoKSsiOyIsIGR0ZEVudGl0eSk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdEV4dGVybmFsRW50aXR5RGVjbChlbnRpdHkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsR2VuKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JLy8KLQkvLyBEVERFbnRpdHkgZHRkRW50aXR5ID0gY3JlYXRlRFRERW50aXR5KGVudGl0eSk7Ci0JLy8KLQkvLwotCS8vIERUREludGVybmFsRW50aXR5IGludEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERJbnRlcm5hbEVudGl0eSgpOwotCS8vIGR0ZEVudGl0eS5zZXRDb250ZW50KGludEVudGl0eSk7Ci0JLy8gaW50RW50aXR5LnNldFZhbHVlKGVudGl0eS5nZXRWYWx1ZSgpKTsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBpbnQgZW50aXR5IHRvTW9mOiAiICk7Ci0JLy8gaWYgKGR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCS8vIHsKLQkvLyBkdGRVdGlsLmdldFBFUG9vbCgpLnB1dCgiJSIrZW50aXR5LmdldE5vZGVOYW1lKCkrIjsiLCBkdGRFbnRpdHkpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXRJbnRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRsaXN0QW5kQ29udGVudE1vZGVsR2VuKERURCBkdGQsIERUREZpbGUgZEZpbGUpIHsKLQkvLwotCS8vIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGRBdHRMaXN0QW5kQ290ZW50TW9kZWwgLSBkdGQ6IiArCi0JLy8gZHRkLmdldE5hbWUoKSk7Ci0JLy8gRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCS8vIHdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCS8vIGlmICggZSBpbnN0YW5jZW9mIEVsZW1lbnREZWNsICkKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoCi0JLy8gKChFbGVtZW50RGVjbCllKS5nZXROb2RlTmFtZSgpICk7Ci0JLy8gaWYgKGR0ZGVsZW1lbnQgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JLy8gfQotCS8vIGZpbmlzaEVsZW1lbnREZWNsKGR0ZGVsZW1lbnQsIChFbGVtZW50RGVjbCkgZSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgQXR0bGlzdCApCi0JLy8gewotCS8vIHByb2Nlc3NBdHRMaXN0KChBdHRsaXN0KSBlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBdHRMaXN0R2VuKEF0dGxpc3QgYXR0TGlzdCkgewotCS8vCi0JLy8gRFRERWxlbWVudCBlID0gKERUREVsZW1lbnQpCi0JLy8gZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldChhdHRMaXN0LmdldE5vZGVOYW1lKCkpOwotCS8vIGlmICggZSAhPSBudWxsICkKLQkvLyB7Ci0JLy8gLy8gRWxlbWVudCBoYXMgYmVlbiBhZGRlZC4gQWRkIHRoZSBhdHRyaWJ1dGVzCi0JLy8gLy9TeXN0ZW0ub3V0LnByaW50bG4oIiBwcm9jZXNzQXR0bGlzdCAtIGFkZGluZyBBdHRsaXN0OiIgKwotCS8vIGF0dExpc3QuZ2V0Tm9kZU5hbWUoKSk7Ci0JLy8gY3JlYXRlQXR0cmlidXRlcyhlLCBhdHRMaXN0KTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiISEhISEhISEhIGVsZW1lbnQgaXMgbnVsbCAiKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluaXNoRXh0ZXJuYWxFbnRpdHlHZW4oRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LAotCS8vIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCS8vCi0JLy8gdXBkYXRlU3lzdGVtSUQoZXh0RW50aXR5LCBlbnRpdHlEZWNsKTsKLQkvLyBleHRFbnRpdHkuc2V0UHVibGljSUQoZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIG5vdGF0aW9uTmFtZSA9IGVudGl0eURlY2wuZ2V0Tm90YXRpb25OYW1lKCk7Ci0JLy8gaWYgKG5vdGF0aW9uTmFtZSAhPSBudWxsKQotCS8vIHsKLQkvLyBEVEROb3RhdGlvbiBkdGROb3RhdGlvbiA9IGNyZWF0ZU9yRmluZE5vdGF0aW9uKGV4dEVudGl0eSwKLQkvLyBub3RhdGlvbk5hbWUsdHJ1ZSk7Ci0JLy8gZXh0RW50aXR5LnNldE5vdGF0aW9uKGR0ZE5vdGF0aW9uKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERURE5vdGF0aW9uIGNyZWF0ZU9yRmluZE5vdGF0aW9uR2VuKERUREV4dGVybmFsRW50aXR5Ci0JLy8gZXh0RW50aXR5LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkvLwotCS8vIERURE5vdGF0aW9uIGFOb3RhdGlvbiA9Ci0JLy8gZXh0RW50aXR5LmdldERUREVudGl0eSgpLmdldERUREZpbGUoKS5maW5kTm90YXRpb24obmFtZSk7Ci0JLy8gaWYgKGFOb3RhdGlvbiAhPSBudWxsKQotCS8vIHsKLQkvLyByZXR1cm4gYU5vdGF0aW9uOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYSBub3RhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZQotCS8vIC8vCi0JLy8gaWYgKGNyZWF0ZSkKLQkvLyB7Ci0JLy8gYU5vdGF0aW9uID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURE5vdGF0aW9uKCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoYU5vdGF0aW9uKTsKLQkvLyBhTm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGFOb3RhdGlvbjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBUaGUgU3lzdGVtSUQgYXR0cmlidXRlIGlzIHNldCB0byB3aGF0ZXZlciB0aGUgdXNlciBlbnRlcnMKLQkvLyAqIGUuZy4gY29tL2libS9iMmIveG1pbW9kZWxzL3h4eC5kdGQueG1pCi0JLy8gKgotCS8vICogSW4gdGhlIHVucGFyc2UoKSBtZXRob2QsIHBhcnNlIG91dCB0aGUgRFREIGZpbGUgbmFtZSBmcm9tCi0JLy8gKiB0aGUgY2xhc3NwYXRoIG5hbWUuCi0JLy8gKiBlLmcuIHJldHVybnMgeHh4LmR0ZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3lzdGVtSURHZW4oRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LAotCS8vIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCS8vCi0JLy8gU3RyaW5nIHN5c3RlbUlkID0gZW50aXR5RGVjbC5nZXRTeXN0ZW1JZCgpOwotCS8vIFN0cmluZyBwdWJsaWNJZCA9IGVudGl0eURlY2wuZ2V0UHVibGljSWQoKTsKLQkvLyBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gSWRSZXNvbHZlciBpZFJlc29sdmVyID0gbmV3IElkUmVzb2x2ZXJJbXBsKGR0ZC5nZXROYW1lKCkpOwotCS8vIFN0cmluZyB1cmkgPSBpZFJlc29sdmVyLnJlc29sdmVJZChwdWJsaWNJZCwgc3lzdGVtSWQpOwotCS8vIEV4dGVybmFsRFRETW9kZWwgZWQgPSBkdGRVdGlsLmdldEV4dGVybmFsRFRETW9kZWwocmVzb3VyY2VzLCB1cmkpOwotCS8vIGlmIChlZCAhPSBudWxsKQotCS8vIHsKLQkvLyBEVERGaWxlIHJlZmVyZW5jZUR0ZEZpbGUgPSBlZC5nZXRFeHRlcm5hbERUREZpbGUoKTsKLQkvLyBleHRFbnRpdHkuc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZShyZWZlcmVuY2VEdGRGaWxlKTsKLQkvLyBleHRFbnRpdHkuc2V0U3lzdGVtSUQoc3lzdGVtSWQpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIGlmIChlbnRpdHlEZWNsLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpCi0JLy8gewotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX0VSUk9SX0lOQ0xfRklMRV9MT0FEX0ZBSUxVUkUiKQotCS8vICsgIiAnIiArIHN5c3RlbUlkICsgIiciKTsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IsIGV4dEVudGl0eS5nZXREVERFbnRpdHkoKSk7Ci0JLy8gfQotCS8vICAgICAgICAKLQkvLyBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gZXh0RW50aXR5LnNldFN5c3RlbUlEKHN5c3RlbUlkKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyBlbHNlCi0JLy8gewotCS8vIC8vIHNldCB0aGUgc3lzdGVtIGlkIHRvIGJlICIiCi0JLy8gZXh0RW50aXR5LnNldFN5c3RlbUlEKCIiKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREVudGl0eSBjcmVhdGVEVERFbnRpdHlHZW4oRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkvLwotCS8vIC8vIGNyZWF0ZSBhbmQgZG8gd2hhdCB3ZSBjYW4gdG8gZmlsbCBpbiBzb21lIGJhc2ljIHRoaW5ncwotCS8vIERUREVudGl0eSBkdGRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5KCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkRW50aXR5KTsKLQkvLwotCS8vCi0JLy8gZHRkRW50aXR5LnNldE5hbWUoZW50aXR5LmdldE5vZGVOYW1lKCkpOwotCS8vIGR0ZEVudGl0eS5zZXRQYXJhbWV0ZXJFbnRpdHkoZW50aXR5LmlzUGFyYW1ldGVyKCkpOwotCS8vIGlmIChlbnRpdHkuZ2V0Q29tbWVudCgpIT1udWxsKQotCS8vIHsKLQkvLyBkdGRFbnRpdHkuc2V0Q29tbWVudChlbnRpdHkuZ2V0Q29tbWVudCgpKTsKLQkvLyB9Ci0JLy8gaWYgKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkRW50aXR5KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHJldHVybiBkdGRFbnRpdHk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluaXNoRWxlbWVudERlY2xHZW4oRFRERWxlbWVudCBkdGRFbGVtZW50LCBFbGVtZW50RGVjbAotCS8vIGVkKSB7Ci0JLy8KLQkvLyBkdGRFbGVtZW50LnNldE5hbWUoZWQuZ2V0Tm9kZU5hbWUoKSk7Ci0JLy8KLQkvLwotCS8vIENNTm9kZSBjbU5vZGUgPSBlZC5nZXRDb250ZW50TW9kZWxOb2RlKCk7Ci0JLy8KLQkvLwotCS8vIGlmIChlZC5nZXRDb21tZW50KCkhPW51bGwpCi0JLy8gewotCS8vIGR0ZEVsZW1lbnQuc2V0Q29tbWVudChlZC5nZXRDb21tZW50KCkpOwotCS8vIH0KLQkvLyBpZiAoZWQuZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlZC5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkRWxlbWVudCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpCi0JLy8gewotCS8vIENNQmFzaWNOb2RlIGJuID0gKENNQmFzaWNOb2RlKWNtTm9kZTsKLQkvLyBzd2l0Y2ggKGJuLmdldFR5cGUoKSkKLQkvLyB7Ci0JLy8gY2FzZSBDTU5vZGVUeXBlLkVNUFRZIDoKLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIENNTm9kZVR5cGUuQU5ZIDoKLQkvLyBEVERBbnlDb250ZW50IGFueUNvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFREQW55Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChhbnlDb250ZW50KTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBDTU5vZGVUeXBlLlBDREFUQToKLQkvLyBEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KHBjRGF0YSk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKQotCS8vIHsKLQkvLyBDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbU5vZGU7Ci0JLy8gaWYgKHJuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0UpCi0JLy8gewotCS8vIFN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQkvLwotCS8vCi0JLy8gRFRERW50aXR5IGFuRW50aXR5ID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQoZW50aXR5TmFtZSk7Ci0JLy8gaWYgKGFuRW50aXR5IT1udWxsKQotCS8vIHsKLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVuUmVmID0KLQkvLyBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCS8vIGVuUmVmLnNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KGFuRW50aXR5KTsKLQkvLwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkvLyBlblJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlblJlZik7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7IC8vIGNyZWF0ZSBkZWZhdWx0IGNvbnRlbnQKLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyAvLwotCS8vIC8vIEZpbmQgdGhlIHJlYWwgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHJlZmVyZW5jZXMKLQkvLyAvLyBJZiB0aGUgcmVhbCBlbGVtZW50IGRvZXMgbm90IHlldCBleGlzdCwgY3JlYXRlIGl0Ci0JLy8gLy8KLQkvLyBEVERFbGVtZW50IGFuRWxlbWVudCA9IGNyZWF0ZU9yRmluZEVsZW1lbnQocm4uZ2V0TmFtZSgpLCBkdGRFbGVtZW50KTsKLQkvLwotCS8vCi0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYW4gRFRERWxlbWVudFJlZmVyZW5jZSBhbmQgc2V0IGl0cyByZWZlcmVuY2VkIGVsZW1lbnQKLQkvLyAvLwotCS8vIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1SZWYgPQotCS8vIGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCS8vIGVsZW1SZWYuc2V0UmVmZXJlbmNlZEVsZW1lbnQoYW5FbGVtZW50KTsKLQkvLwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkvLyBlbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8gLy8gc2V0Q29udGVudCB0byBEVERFbGVtZW50UmVmZXJlbmNlCi0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGVsZW1SZWYpOwotCS8vCi0JLy8KLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKQotCS8vIHsKLQkvLyBDTUdyb3VwTm9kZSBncnBOb2RlID0gKENNR3JvdXBOb2RlKWNtTm9kZTsKLQkvLyBEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCS8vIERUREdyb3VwS2luZCBncm91cEtpbmQgPQotCS8vIERUREdyb3VwS2luZC5nZXQoY29tcHV0ZU1vZkdyb3VwS2luZChncnBOb2RlLmdldEdyb3VwS2luZCgpKSk7Ci0JLy8gZ3JvdXBDb250ZW50LnNldEdyb3VwS2luZChncm91cEtpbmQpOwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2UoZ3JwTm9kZSkpOwotCS8vIGdyb3VwQ29udGVudC5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIC8vIGp1c3QgdXNlIHRoZSBsb2NhdG9yIGZvciB0aGUgZWxlbWVudCBhcyB0aGUgY2xvc2VzdCBndWVzcwotCS8vIHByb2Nlc3NHcm91cENvbnRlbnQoZ3JvdXBDb250ZW50LCBncnBOb2RlKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZ3JvdXBDb250ZW50KTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY21Ob2RlID09IG51bGwpCi0JLy8gewotCS8vIC8vIGJhZCB0aGluZyBoYXBwZW5lZCBoZXJlLCBqdXN0IGNyZWF0ZSBhIHBjZGF0YQotCS8vIERUREVtcHR5Q29udGVudCBlbXB0eUNvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEFkZCBhIG5ldyBncm91cCB0byB0aGUgY3VycmVudCBncm91cAotCS8vICogQHBhcmFtIHBhcmVudCAtIHRoZSBwYXJlbnQgbm9kZSBmb3IgdGhpcyBncm91cCBlbGVtZW50Ci0JLy8gKiBAcGFyYW0gb3AxTm9kZSAtIHRoZSBncm91cAotCS8vICogZS5nLiAoYSxiKQotCS8vICogQHBhcmFtIG9wMk5vZGUgLSBzZXQgb25seSBpZiBjYWxsZWQgYnkgcHJvY2Vzc0NNMW9wCi0JLy8gKiBlLmcuIChhLGIpKwotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0dyb3VwQ29udGVudEdlbihEVERHcm91cENvbnRlbnQgcGFyZW50LAotCS8vIENNR3JvdXBOb2RlIGdycE5vZGUpIHsKLQkvLwotCS8vIEVudW1lcmF0aW9uIGNoaWxkcmVuID0gZ3JwTm9kZS5nZXRDaGlsZHJlbigpLmVsZW1lbnRzKCk7Ci0JLy8gRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCS8vIHdoaWxlIChjaGlsZHJlbi5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gQ01Ob2RlIGNub2RlID0gKENNTm9kZSkgY2hpbGRyZW4ubmV4dEVsZW1lbnQoKTsKLQkvLwotCS8vCi0JLy8gaWYgKGNub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpCi0JLy8gewotCS8vIENNR3JvdXBOb2RlIGdOb2RlID0gKENNR3JvdXBOb2RlKWNub2RlOwotCS8vIERUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCS8vIERUREdyb3VwS2luZCBncm91cEtpbmQgPQotCS8vIERUREdyb3VwS2luZC5nZXQoY29tcHV0ZU1vZkdyb3VwS2luZChnTm9kZS5nZXRHcm91cEtpbmQoKSkpOwotCS8vIGdyb3VwQ29udGVudC5zZXRHcm91cEtpbmQoZ3JvdXBLaW5kKTsKLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdOb2RlKSk7Ci0JLy8gZ3JvdXBDb250ZW50LnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8gcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZ3JvdXBDb250ZW50KTsKLQkvLyBwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCxnTm9kZSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNub2RlIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpCi0JLy8gewotCS8vIENNQmFzaWNOb2RlIG4gPSAoQ01CYXNpY05vZGUpY25vZGU7Ci0JLy8gaWYgKG4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuUENEQVRBKQotCS8vIHsKLQkvLyAvLyBDcmVhdGUgYSBEVERQQ0RhdGFDb250ZW50IGZvciBhIGxlYWYgUENEYXRhIG5vZGUKLQkvLyAvLwotCS8vIERURFBDRGF0YUNvbnRlbnQgcGNEYXRhID0gZmFjdG9yeS5jcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JLy8gLy8gQWRkICNQQ0RBVEEgdG8gdGhlIEdyb3VwLCBpLmUgTWl4ZWQgY29udGVudCBtb2RlbAotCS8vIHBhcmVudC5nZXRDb250ZW50KCkuYWRkKHBjRGF0YSk7Ci0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNUmVmZXJlbmNlTm9kZSkKLQkvLyB7Ci0JLy8gQ01SZWZlcmVuY2VOb2RlIHJuID0gKENNUmVmZXJlbmNlTm9kZSljbm9kZTsKLQkvLyBpZiAocm4uZ2V0VHlwZSgpPT1DTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFKQotCS8vIHsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNIEVsZW1lbnQgUmVmIG5hbWU6ICIgKyBybi5nZXROYW1lKCkpOwotCS8vIC8vCi0JLy8gLy8gQ3JlYXRlIGFuIERUREVsZW1lbnRSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0KLQkvLyBmYWN0b3J5LmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0JLy8KLQkvLwotCS8vIC8vCi0JLy8gLy8gRmluZCB0aGUgcmVhbCBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlcwotCS8vIC8vIElmIHRoZSByZWFsIGVsZW1lbnQgZG9lcyBub3QgeWV0IGV4aXN0LCBjcmVhdGUgaXQKLQkvLyAvLwotCS8vIERUREVsZW1lbnQgYW5FbGVtZW50ID0gY3JlYXRlT3JGaW5kRWxlbWVudChybi5nZXROYW1lKCksIGVsZW1SZWYpOwotCS8vCi0JLy8KLQkvLyBlbGVtUmVmLnNldFJlZmVyZW5jZWRFbGVtZW50KGFuRWxlbWVudCk7Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCS8vIGVsZW1SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0JLy8KLQkvLyAvLyBBZGQgRFRERWxlbWVudFJlZmVyZW5jZSB0byB0aGUgR3JvdXAKLQkvLyBwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChlbGVtUmVmKTsKLQkvLyB9Ci0JLy8gZWxzZSAvLyBQRSBSZWZlcmVuY2UKLQkvLyB7Ci0JLy8gU3RyaW5nIGVudGl0eU5hbWUgPSBybi5nZXROYW1lKCkudHJpbSgpOwotCS8vCi0JLy8KLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNIFBFIFJlZiBuYW1lOiAiICsgZW50aXR5TmFtZSk7Ci0JLy8gRFRERW50aXR5IGFuRW50aXR5ID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQoZW50aXR5TmFtZSk7Ci0JLy8gaWYgKGFuRW50aXR5IT1udWxsKQotCS8vIHsKLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVuUmVmID0KLQkvLyBmYWN0b3J5LmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkvLyBlblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0JLy8gICAgICAgICAgICAgCi0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCS8vIGVuUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8KLQkvLyAvLyBBZGQgRFRERW50aXR5UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCS8vIHBhcmVudC5nZXRDb250ZW50KCkuYWRkKGVuUmVmKTsKLQkvLwotCS8vCi0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEZpbmQgdGhlIHJlYWwgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgdGhlIGN1cnJlbnQgZWxlbWVudAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREVsZW1lbnQgY3JlYXRlT3JGaW5kRWxlbWVudEdlbihTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikgewotCS8vCi0JLy8gLy8gRFRERWxlbWVudCBhRWxlbWVudCA9IGdldERUREZpbGUoKS5maW5kRWxlbWVudChuYW1lKTsKLQkvLwotCS8vCi0JLy8gRFRERWxlbWVudCBhRWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KG5hbWUpOwotCS8vCi0JLy8KLQkvLyBpZiAoYUVsZW1lbnQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcmV0dXJuIGFFbGVtZW50OwotCS8vIH0KLQkvLwotCS8vCi0JLy8gU3RyaW5nIGVycm9yTXNnID0KLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzEiKTsKLQkvLyBlcnJvck1zZyArPSAiXCIiICsgbmFtZSArICJcIiI7Ci0JLy8gZXJyb3JNc2cgKz0KLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfRVJST1JQQVJUX1VOREVDTEFSRURfRUxFTUVOVF8yIik7Ci0JLy8KLQkvLwotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyAgICAgCi0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKGVycm9yTXNnKTsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IsIG9iaik7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKGVycm9yTXNnKTsKLQkvLyAvLyBzZXREVERFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCS8vIGdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vCi0JLy8KLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBlbXB0eSBlbGVtZW50IGZvciB0aGUgcmVmZXJlbmNlIHRvIG1ha2UgaXQgdmFsaWQKLQkvLyAvLwotCS8vCi0JLy8KLQkvLyBEVERGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JLy8gRFRERWxlbWVudCBkdGRlbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JLy8gZHRkZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCS8vCi0JLy8KLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZmFjdG9yeS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkvLyBkdGRlbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkvLwotCS8vCi0JLy8gZ2V0RFRERmlsZSgpLmdldERURE9iamVjdCgpLmFkZChkdGRlbGVtZW50KTsKLQkvLyBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KG5hbWUsZHRkZWxlbWVudCk7Ci0JLy8gcmV0dXJuIGR0ZGVsZW1lbnQ7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQ29tcHV0ZSB0aGUgTU9GIG9jY3VycmVuY2UgZnJvbSB0aGUgeG1sNGogb2NjdXJyZW5jZQotCS8vICovCi0JLy8gcHJvdGVjdGVkIGludCBjb21wdXRlTW9mT2NjdXJyZW5jZUdlbihDTVJlcGVhdGFibGVOb2RlIHJub2RlKSB7Ci0JLy8KLQkvLyBpbnQgb2NjdXJyZW5jZSA9IHJub2RlLmdldE9jY3VycmVuY2UoKTsKLQkvLyBpbnQgbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PTkU7Ci0JLy8KLQkvLwotCS8vIGlmIChvY2N1cnJlbmNlID09IENNTm9kZVR5cGUuWkVST19PUl9NT1JFKQotCS8vIHsKLQkvLyBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLlpFUk9fT1JfTU9SRTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKQotCS8vIHsKLQkvLyBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFOwotCS8vIH0KLQkvLyBlbHNlIGlmIChvY2N1cnJlbmNlID09IENNTm9kZVR5cGUuT1BUSU9OQUwpCi0JLy8gewotCS8vIG1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuT1BUSU9OQUw7Ci0JLy8gfQotCS8vIHJldHVybiBtb2ZvY2N1cjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBDb21wdXRlIHRoZSBNT0YgbW9kZWwgZ3JvdXAgZnJvbSB0aGUgeG1sNGogbW9kZWwgZ3JvdXAKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBpbnQgY29tcHV0ZU1vZkdyb3VwS2luZEdlbihpbnQgdHlwZSkgewotCS8vCi0JLy8gaWYgKHR5cGUgPT0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UpCi0JLy8gewotCS8vIHJldHVybiBEVERHcm91cEtpbmQuQ0hPSUNFOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHJldHVybiBEVERHcm91cEtpbmQuU0VRVUVOQ0U7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZXNHZW4oRFRERWxlbWVudCBlbGVtZW50LCBBdHRsaXN0IGF0dExpc3QpCi0JLy8gewotCS8vCi0JLy8gaWYgKGF0dExpc3QuZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpLCBlbGVtZW50KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGZvciAoaW50IGk9MDtpPGF0dExpc3Quc2l6ZSgpO2krKykKLQkvLyB7Ci0JLy8gQXR0Tm9kZSBhZCA9IChBdHROb2RlKSBhdHRMaXN0LmVsZW1lbnRBdChpKTsKLQkvLyAvLyBEVERBdHRyaWJ1dGVFbGVtZW50IGR0ZEF0dD0gZ2V0RFREQXR0cmlidXRlRWxlbWVudChhLmdldE5hbWUoKSk7Ci0JLy8KLQkvLwotCS8vIC8vIG9ubHkgYWRkIHRoZSBBdHREZWYgaWYgaXQgaXMgbm90IGFkZGVkIHlldAotCS8vIC8vIGlnbm9yZSB0aGUgZHVwIEF0dERlZiBhcyBkb2N1bWVudGVkIGluIHRoZSBYTUwgMS4wIHNwZWNzCi0JLy8gLy9pZiggZHRkQXR0PT1udWxsKQotCS8vIGFkZEF0dHJpYnV0ZShlbGVtZW50LCBhZCk7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIENyZWF0ZSBhIERUREF0dHJpYnV0ZSBmcm9tIHRoZSB4bWw0aiBhdHRyaWJ1dGUKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZUdlbihEVERFbGVtZW50IGR0ZGVsZW1lbnQsIEF0dE5vZGUgYWQpIHsKLQkvLwotCS8vIERUREF0dHJpYnV0ZSBkdGRhdHRyID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCS8vIGR0ZGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCkuYWRkKGR0ZGF0dHIpOwotCS8vIGZpbmlzaEF0dHJpYnV0ZShkdGRhdHRyLCBhZCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluaXNoQXR0cmlidXRlR2VuKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBBdHROb2RlIGF0dGRlZikKLQkvLyB7Ci0JLy8KLQkvLyBib29sZWFuIHBhcnNlRXJyb3IgPSBmYWxzZTsKLQkvLwotCS8vCi0JLy8gaWYgKGF0dGRlZi5uYW1lLnN0YXJ0c1dpdGgoIiUiKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi5uYW1lLnRyaW0oKTsKLQkvLyBEVERFbnRpdHkgZW4gPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChwZU5hbWUpOwotCS8vIGlmIChlbiE9bnVsbCkKLQkvLyB7Ci0JLy8gZHRkYXR0ci5zZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShlbik7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gZHRkYXR0ci5zZXROYW1lKGF0dGRlZi5uYW1lKTsKLQkvLwotCS8vCi0JLy8gaW50IGF0dHJUeXBlID0gYXR0ZGVmLmdldERlY2xhcmVkVHlwZSgpOwotCS8vCi0JLy8KLQkvLyBpZiAoYXR0clR5cGU9PUF0dE5vZGUuUEVSRUZFUkVOQ0UgJiYgYXR0ZGVmLnR5cGUhPW51bGwpCi0JLy8gewotCS8vIFN0cmluZyBwZU5hbWUgPSBhdHRkZWYudHlwZS50cmltKCk7Ci0JLy8gRFRERW50aXR5IGVuID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQocGVOYW1lKTsKLQkvLyBpZiAoZW4hPW51bGwpCi0JLy8gewotCS8vIGR0ZGF0dHIuc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7IC8vIGhhY2ssCi0JLy8gc28gd2UgY2FuIGdldCBiYWNrIHRoZSBkZWZhdWx0IHZhbHVlCi0JLy8gfQotCS8vIGVsc2UgLy9zZXQgZGVmYXVsdCB0eXBlCi0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQkvLwotCS8vCi0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gc3dpdGNoIChhdHRyVHlwZSkKLQkvLyB7Ci0JLy8gY2FzZSBBdHROb2RlLkNEQVRBOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5FTlRJVElFUzoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUSUVTKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuRU5USVRZOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfRU5USVRZKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuSUQ6Ci0JLy8gLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBJRCBhdHRyaWJ1dGUKLQkvLyBpZiAoaGFzSURBdHRyaWJ1dGUoZHRkYXR0cikpCi0JLy8gewotCS8vIFN0cmluZyBlcnJNc2cgPSBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xIik7Ci0JLy8gZXJyTXNnICs9IGF0dGRlZi5uYW1lICsKLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMiIpOwotCS8vIC8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldElFbGVtZW50KCkuc2V0RFRERXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JLy8gcGFyc2VFcnJvciA9IHRydWU7Ci0JLy8gfQotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSUQoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5JRFJFRjoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuSURSRUZTOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSURSRUZTKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuRU5VTUVSQVRJT046Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgY3JlYXRlRFRERW51bWVyYXRpb24oZHRkYXR0ciwgYXR0ZGVmLAotCS8vIERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuTk9UQVRJT046Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgY3JlYXRlRFRERW51bWVyYXRpb24oZHRkYXR0ciwgYXR0ZGVmLAotCS8vIERUREVudW1Hcm91cEtpbmQuTk9UQVRJT05fR1JPVVApKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLk5NVE9LRU46Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuTk1UT0tFTlM6Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOUygpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gZGVmYXVsdDoKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREFUVFIgJyIgK2F0dGRlZi5uYW1lICsgIidVbmtub3duIHR5cGUuLi4iICsKLQkvLyBhdHRyVHlwZSk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gaW50IGF0dHJEZWZhdWx0ID0gYXR0ZGVmLmdldERlZmF1bHRUeXBlKCk7Ci0JLy8gaW50IGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuSU1QTElFRDsKLQkvLyBzd2l0Y2ggKGF0dHJEZWZhdWx0KQotCS8vIHsKLQkvLyBjYXNlIEF0dE5vZGUuRklYRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5GSVhFRDsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLklNUExJRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5JTVBMSUVEOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuUkVRVUlSRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5SRVFVSVJFRDsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLk5PRklYRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5OT0ZJWEVEOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBkZWZhdWx0OgotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQVRUUiAnIiArYXR0ZGVmLm5hbWUgKyAiJyBVbmtub3duIGRlZmF1bHQKLQkvLyB0eXBlLi4uICIgKyBhdHRyRGVmYXVsdCk7Ci0JLy8gfQotCS8vCi0JLy8gRFRERGVmYXVsdEtpbmQgZGVmYXVsdEtpbmRPYmogPSBEVEREZWZhdWx0S2luZC5nZXQoZGVmYXVsdEtpbmQpOwotCS8vIGR0ZGF0dHIuc2V0RGVmYXVsdEtpbmQoZGVmYXVsdEtpbmRPYmopOwotCS8vCi0JLy8gaWYgKHBhcnNlRXJyb3IpCi0JLy8gewotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRkZWYuZGVmYXVsdFZhbHVlOwotCS8vIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gaWYgKGF0dHJUeXBlID09IEF0dE5vZGUuRU5VTUVSQVRJT04gfHwgYXR0clR5cGUgPT0gQXR0Tm9kZS5OT1RBVElPTikKLQkvLyB7Ci0JLy8gaWYgKCEgaXNEZWZhdWx0RW51bVZhbHVlVmFsaWQoYXR0ZGVmLGRlZmF1bHRWYWx1ZSkpCi0JLy8gewotCS8vIFN0cmluZyB0eXBlU3RyaW5nID0KLQkvLyAoYXR0clR5cGU9PUF0dE5vZGUuRU5VTUVSQVRJT04/ImVudW1lcmF0aW9uIjoibm90YXRpb24iKTsKLQkvLyBTdHJpbmcgZXJyTXNnID0KLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMSIpOwotCS8vIGVyck1zZyArPSB0eXBlU3RyaW5nICsKLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfRVJST1JQQVJUX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzIiKTsKLQkvLyBlcnJNc2cgKz0gYXR0ZGVmLm5hbWUgKyAiJyI7Ci0JLy8KLQkvLwotCS8vIC8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldElFbGVtZW50KCkuc2V0RFRERXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JLy8gcmV0dXJuOwotCS8vIH0KLQkvLyB9Ci0JLy8gZHRkYXR0ci5zZXREZWZhdWx0VmFsdWVTdHJpbmcoZGVmYXVsdFZhbHVlKTsKLQkvLyB9Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBdHRyIC0gdG9Nb2YgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nICIgKwotCS8vIGdldERlZmF1bHRWYWx1ZVN0cmluZygpKTsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREF0dHIgLSB0b01vZiBnZXREZWZhdWx0VmFsdWU6ICIgKwotCS8vIGdldERlZmF1bHRWYWx1ZSgpKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNJREF0dHJpYnV0ZUdlbihEVERBdHRyaWJ1dGUgZHRkYXR0cikgewotCS8vCi0JLy8gYm9vbGVhbiBoYXNJRCA9IGZhbHNlOwotCS8vCi0JLy8KLQkvLyBEVERFbGVtZW50IGVsZW1lbnQgPSBkdGRhdHRyLmdldERUREVsZW1lbnQoKTsKLQkvLyBFTGlzdCBhdHRycyA9IGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCk7Ci0JLy8KLQkvLwotCS8vIEl0ZXJhdG9yIGkgPSBhdHRycy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFREQXR0cmlidXRlIGF0dHIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkvLyBEVERUeXBlIGRUeXBlID0gYXR0ci5nZXREVERUeXBlKCk7Ci0JLy8gaWYgKGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKQotCS8vIHsKLQkvLyBpZiAoICgoRFREQmFzaWNUeXBlKWRUeXBlKS5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERCYXNpY1R5cGVLaW5kLklEKQotCS8vIHsKLQkvLyBoYXNJRCA9IHRydWU7Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGhhc0lEOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb25HZW4oRFREQXR0cmlidXRlCi0JLy8gZHRkYXR0ciwgU3RyaW5nW10gZW51bVZhbHVlcywgaW50IGVudW1LaW5kKSB7Ci0JLy8KLQkvLyBEVERFbnVtZXJhdGlvblR5cGUgZW51bSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkvLyAvLyBUaGlzIGlzIGdyb3NzLCBidXQgdGhpcyBpcyB3aGF0IHdhcyBkb25lIGJlZm9yZS4KLQkvLyBEVERBdHRyaWJ1dGVJbXBsIGR0ZGF0dHJpbXBsID0gKERUREF0dHJpYnV0ZUltcGwpIGR0ZGF0dHI7Ci0JLy8gLy8gZW51bS5zZXRJRCgiRW51bV8iICsKLQkvLyAoKERUREVsZW1lbnQpZHRkYXR0cmltcGwuZ2V0TU9GRG9tYWluKCkpLmdldE5hbWUoKSArICJfIiArCi0JLy8gZHRkYXR0ci5nZXROYW1lKCkpOwotCS8vIERUREVudW1Hcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRERW51bUdyb3VwS2luZC5nZXQoZW51bUtpbmQpOwotCS8vIGVudW0uc2V0S2luZChncm91cEtpbmQpOwotCS8vIC8vIEVudW1lcmF0aW9uIHZhbHVlcwotCS8vIGlmIChlbnVtVmFsdWVzIT1udWxsKQotCS8vIHsKLQkvLyBmb3IoaW50IGk9MDtpPGVudW1WYWx1ZXMubGVuZ3RoO2krKykKLQkvLyB7Ci0JLy8gRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JLy8gLy8gZW51bVZhbC5zZXRYTUlEb2N1bWVudChkdGRhdHRyLmdldFhNSURvY3VtZW50KCkpOwotCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwoZW51bVZhbHVlc1tpXSk7Ci0JLy8gLy8gZW51bUxpdGVyYWwuc2V0TnVtYmVyKGkpOwotCS8vIGVudW0uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bSk7Ci0JLy8gcmV0dXJuIGVudW07Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEVFbnVtTGl0ZXJhbCBjcmVhdGVFRW51bUxpdGVyYWxHZW4oKSB7Ci0JLy8KLQkvLyBFY29yZVBhY2thZ2UgZVBhY2thZ2UgPQotCS8vIChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCS8vIHJldHVybiAoKEVjb3JlRmFjdG9yeSllUGFja2FnZS5nZXRGYWN0b3J5KCkpLmNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb25HZW4oRFREQXR0cmlidXRlCi0JLy8gZHRkYXR0ciwgQXR0Tm9kZSBhdHRkZWYsIGludCBlbnVtS2luZCkgewotCS8vCi0JLy8gRFRERW51bWVyYXRpb25UeXBlIGVudW0gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JLy8gLy8gVGhpcyBpcyBncm9zcywgYnV0IHRoaXMgaXMgd2hhdCB3YXMgZG9uZSBiZWZvcmUuCi0JLy8gRFREQXR0cmlidXRlSW1wbCBkdGRhdHRyaW1wbCA9IChEVERBdHRyaWJ1dGVJbXBsKSBkdGRhdHRyOwotCS8vIC8vIGVudW0uc2V0SUQoIkVudW1fIiArCi0JLy8gKChEVERFbGVtZW50KWR0ZGF0dHJpbXBsLmdldE1PRkRvbWFpbigpKS5nZXROYW1lKCkgKyAiXyIgKwotCS8vIGR0ZGF0dHIuZ2V0TmFtZSgpKTsKLQkvLyBEVERFbnVtR3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREVudW1Hcm91cEtpbmQuZ2V0KGVudW1LaW5kKTsKLQkvLyBlbnVtLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuYWRkKGVudW0pOwotCS8vCi0JLy8KLQkvLyAvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkvLyBFbnVtZXJhdGlvbiB0b2tlbkl0ZXIgPSBhdHRkZWYuZWxlbWVudHMoKTsKLQkvLyBpZiAodG9rZW5JdGVyICE9IG51bGwpIHsKLQkvLyBpbnQgaT0wOwotCS8vIHdoaWxlICh0b2tlbkl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIFN0cmluZyB2YWwgPSAoU3RyaW5nKXRva2VuSXRlci5uZXh0RWxlbWVudCgpOwotCS8vIEVFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9IGNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCS8vIC8vIGVudW1MaXRlcmFsLnNldFhNSURvY3VtZW50KGR0ZGF0dHIuZ2V0WE1JRG9jdW1lbnQoKSk7Ci0JLy8gICAgICAgIAotCS8vCi0JLy8gZW51bUxpdGVyYWwucmVmU2V0TGl0ZXJhbCh2YWwpOwotCS8vIC8vIGVudW1MaXRlcmFsLnNldE51bWJlcihpKyspOwotCS8vIGVudW0uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyByZXR1cm4gZW51bTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRFbnVtVmFsdWVWYWxpZEdlbihBdHROb2RlIGF0dGRlZiwgU3RyaW5nCi0JLy8gZGVmYXVsdFZhbHVlKSB7Ci0JLy8KLQkvLyBib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JLy8gYm9vbGVhbiBjb250YWluc1BlcmNlbnQgPSBmYWxzZTsKLQkvLwotCS8vCi0JLy8gLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JLy8gRW51bWVyYXRpb24gZW51bVZhbHVlcyA9IGF0dGRlZi5lbGVtZW50cygpOwotCS8vIHdoaWxlIChlbnVtVmFsdWVzLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBTdHJpbmcgdmFsID0gKFN0cmluZyllbnVtVmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JLy8gaWYgKHZhbC5lcXVhbHMoZGVmYXVsdFZhbHVlKSkKLQkvLyB7Ci0JLy8gdmFsaWQgPSB0cnVlOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyBpZiAodmFsLmluZGV4T2YoJyUnKSA+PSAwKQotCS8vIHsKLQkvLyBjb250YWluc1BlcmNlbnQgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIHZhbGlkIHx8IGNvbnRhaW5zUGVyY2VudDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBzZXRBdHRyRFREVHlwZUdlbihEVERBdHRyaWJ1dGUgZHRkYXR0ciwgRFREVHlwZSB0eXBlKSB7Ci0JLy8KLQkvLyBkdGRhdHRyLnNldERURFR5cGUodHlwZSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3JNZXNzYWdlR2VuKEVycm9yTWVzc2FnZSBlcnJNc2csIE9iamVjdCBvYmopIHsKLQkvLwotCS8vIGVyck1zZy5zZXRPYmplY3Qob2JqKTsKLQkvLyBkdGRVdGlsLmFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERPYmplY3RGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERPYmplY3RGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0YTMxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRET2JqZWN0RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFNvdXJjZU9mZnNldDsKLQotcHVibGljIGNsYXNzIERURE9iamVjdEZpbmRlciBleHRlbmRzIERURFZpc2l0b3IgewotCXB1YmxpYyBjbGFzcyBTb3VyY2VPZmZzZXQgewotCQkvLyBDb252ZW5pZW5jZSBjbGFzcyB0byBmaW5kIGNvbnRhaW5tZW50IG9mIG9iamVjdAotCQlwcml2YXRlIGludCBzdGFydCwgZW5kOwotCi0JCXB1YmxpYyBTb3VyY2VPZmZzZXQoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JCQl0aGlzLmVuZCA9IGVuZDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFNvdXJjZU9mZnNldCBvdGhlcikgewotCQkJaWYgKHRoaXMuc3RhcnQgPD0gb3RoZXIuc3RhcnQgJiYgb3RoZXIuc3RhcnQgPD0gdGhpcy5lbmQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCX0KLQotCVNvdXJjZU9mZnNldCBzZWFyY2hMb2NhdGlvbjsKLQotCXByaXZhdGUgU291cmNlT2Zmc2V0IG9mZnNldE9iamVjdEZvcihEVERTb3VyY2VPZmZzZXQgcykgewotCQlyZXR1cm4gbmV3IFNvdXJjZU9mZnNldChzLmdldFN0YXJ0T2Zmc2V0KCksIHMuZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NvbnRhaW5tZW50KERURE9iamVjdCBvKSB7Ci0JCWlmIChvZmZzZXRPYmplY3RGb3IoKERURFNvdXJjZU9mZnNldCkgbykuY29udGFpbnMoc2VhcmNoTG9jYXRpb24pKSB7Ci0JCQljbG9zZXN0T2JqZWN0ID0gbzsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0RmluZGVyKGludCBzdGFydE9mZnNldCwgaW50IGVuZE9mZnNldCkgewotCQlzZWFyY2hMb2NhdGlvbiA9IG5ldyBTb3VyY2VPZmZzZXQoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVEROb3RhdGlvbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCQljaGVja0NvbnRhaW5tZW50KG5vdGF0aW9uKTsKLQkJc3VwZXIudmlzaXREVEROb3RhdGlvbihub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbnRpdHkoRFRERW50aXR5IGVudGl0eSkgewotCQljaGVja0NvbnRhaW5tZW50KGVudGl0eSk7Ci0JCXN1cGVyLnZpc2l0RFRERW50aXR5KGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50KERUREVsZW1lbnQgZWxlbWVudCkgewotCQljaGVja0NvbnRhaW5tZW50KGVsZW1lbnQpOwotCQlzdXBlci52aXNpdERUREVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQljaGVja0NvbnRhaW5tZW50KGF0dHJpYnV0ZSk7Ci0JCXN1cGVyLnZpc2l0RFREQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHkpIHsKLQkJY2hlY2tDb250YWlubWVudChwYXJtRW50aXR5KTsKLQkJc3VwZXIudmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudChEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQoY29udGVudCk7Ci0JCXN1cGVyLnZpc2l0RFRERWxlbWVudENvbnRlbnQoY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBEVERPYmplY3QgY2xvc2VzdE9iamVjdCA9IG51bGw7Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGdldENsb3Nlc3RPYmplY3QoKSB7Ci0JCXJldHVybiBjbG9zZXN0T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlT2Zmc2V0IG9mZnNldE9iamVjdEZvckdlbihEVERTb3VyY2VPZmZzZXQgcykgewotCi0JCXJldHVybiBuZXcgU291cmNlT2Zmc2V0KHMuZ2V0U3RhcnRPZmZzZXQoKSwgcy5nZXRFbmRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrQ29udGFpbm1lbnRHZW4oRFRET2JqZWN0IG8pIHsKLQotCQlpZiAob2Zmc2V0T2JqZWN0Rm9yKChEVERTb3VyY2VPZmZzZXQpIG8pLmNvbnRhaW5zKHNlYXJjaExvY2F0aW9uKSkgewotCQkJY2xvc2VzdE9iamVjdCA9IG87Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRETm90YXRpb25HZW4oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQotCQljaGVja0NvbnRhaW5tZW50KG5vdGF0aW9uKTsKLQkJc3VwZXIudmlzaXREVEROb3RhdGlvbihub3RhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERW50aXR5R2VuKERUREVudGl0eSBlbnRpdHkpIHsKLQotCQljaGVja0NvbnRhaW5tZW50KGVudGl0eSk7Ci0JCXN1cGVyLnZpc2l0RFRERW50aXR5KGVudGl0eSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudEdlbihEVERFbGVtZW50IGVsZW1lbnQpIHsKLQotCQljaGVja0NvbnRhaW5tZW50KGVsZW1lbnQpOwotCQlzdXBlci52aXNpdERUREVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREQXR0cmlidXRlR2VuKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQotCQljaGVja0NvbnRhaW5tZW50KGF0dHJpYnV0ZSk7Ci0JCXN1cGVyLnZpc2l0RFREQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlR2VuKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChwYXJtRW50aXR5KTsKLQkJc3VwZXIudmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnRHZW4oRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCi0JCWNoZWNrQ29udGFpbm1lbnQoY29udGVudCk7Ci0JCXN1cGVyLnZpc2l0RFRERWxlbWVudENvbnRlbnQoY29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERPYmplY3QgZ2V0Q2xvc2VzdE9iamVjdEdlbigpIHsKLQotCQlyZXR1cm4gY2xvc2VzdE9iamVjdDsKLQl9Ci19Ly8gRFRET2JqZWN0RmluZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUGF0aG5hbWVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUGF0aG5hbWVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMDYzYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFBhdGhuYW1lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERQYXRobmFtZVV0aWwgewotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIG1ha2VQYXRoKFN0cmluZyBwYXJlbnRQYXRoLCBTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUsIGludCBjbnQpIHsKLQkJU3RyaW5nIHBuID0gbnVsbDsKLQkJbmFtZSA9IGVuY29kZShuYW1lKTsKLQkJaWYgKChuYW1lID09IG51bGwpICYmIChjbnQgPD0gMCkpIHsKLQkJCXBuID0gdHlwZTsKLQkJfQotCQllbHNlIGlmIChjbnQgPD0gMCkgewotCQkJcG4gPSB0eXBlICsgIjoiICsgKChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlwbiA9IHR5cGUgKyAiOiIgKyAoKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWUpICsgIjoiICsgY250OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudFBhdGggKyAiLiIgKyBwbjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHBuOwotCQl9Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBPYmplY3RbXSBwYXJzZVBhdGhDb21wb25lbnQoU3RyaW5nIHBhdGgpIHsKLQkJLyoKLQkJICogVGhpcyByb3V0aW5lIHBhcnNlIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHBhdGggYW5kIHJldHVybnMgdGhlCi0JCSAqIHJlc3VsdCBpbiBhbiBhcnJyYXkgb2YgU3RyaW5ncy4gcmVzdWx0WzBdID0gdHlwZSAoU3RyaW5nKSByZXN1bHRbMV0gPQotCQkgKiBuYW1lIChTdHJpbmcpIHJlc3VsdFsyXSA9IGNvdW50IChJbnRlZ2VyKSByZXN1bHRbM10gPSB0aGUgcmVzdCBvZgotCQkgKiB0aGUgcGF0aCAoU3RyaW5nKQotCQkgKiAKLQkJICogRS5nLiBQYXRoQ29tcG9uZW50IHJlc3VsdFswXSByZXN1bHRbMV0gcmVzdWx0WzJdIHJlc3VsdFszXQotCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGUKLQkJICogdHlwZSA8bnVsbD4gPG51bGw+IDxudWxsPiB0eXBlLnJlc3QgdHlwZSA8bnVsbD4gPG51bGw+IHJlc3QKLQkJICogdHlwZTpuYW1lIHR5cGUgbmFtZSA8bnVsbD4gPG51bGw+IHR5cGU6bmFtZS5yZXN0IHR5cGUgbmFtZSA8bnVsbD4KLQkJICogcmVzdCB0eXBlOjpuIHR5cGUgPG51bGw+IG4gPG51bGw+IHR5cGU6Om4ucmVzdCB0eXBlIDxudWxsPiBuIHJlc3QKLQkJICogdHlwZTpuYW1lOm4gdHlwZSBuYW1lIG4gPG51bGw+IHR5cGU6bmFtZTpuLnJlc3QgdHlwZSBuYW1lIG4gcmVzdAotCQkgKi8KLQotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzRdOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlpbnQgaSA9IHBhdGguaW5kZXhPZignLicpOwotCQlpbnQgbGVuZ3RoID0gcGF0aC5sZW5ndGgoKTsKLQotCQlpZiAoaSA8IDApIHsKLQkJCWkgPSBsZW5ndGg7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJSW50ZWdlciBuID0gbnVsbDsKLQkJU3RyaW5nIHJlc3QgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgdHlwZQotCQlpbnQgaiA9IHBhdGguaW5kZXhPZignOicpOwotCQlpZiAoaiA+IGkpCi0JCQlqID0gLTE7Ci0JCWlmIChqIDwgMCkgewotCQkJdHlwZSA9IHBhdGguc3Vic3RyaW5nKDAsIGkpOwotCQl9Ci0JCWVsc2UgewotCQkJdHlwZSA9IHBhdGguc3Vic3RyaW5nKDAsIGopOwotCi0JCQkvLyBnZXQgdGhlIG5hbWUKLQkJCWludCBrID0gcGF0aC5pbmRleE9mKCc6JywgaiArIDEpOwotCQkJaWYgKGsgPiBpKQotCQkJCWsgPSAtMTsKLQkJCWlmIChrIDwgMCkgewotCQkJCW5hbWUgPSBwYXRoLnN1YnN0cmluZyhqICsgMSwgaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluYW1lID0gcGF0aC5zdWJzdHJpbmcoaiArIDEsIGspOwotCi0JCQkJLy8gZ2V0IHRoZSBjb3VudAotCQkJCXRyeSB7Ci0JCQkJCW4gPSBuZXcgSW50ZWdlcihwYXRoLnN1YnN0cmluZyhrICsgMSwgaSkpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCX0KLQkJCQlpZiAoKG4gIT0gbnVsbCkgJiYgKG4uaW50VmFsdWUoKSA8IDApKSB7Ci0JCQkJCW4gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICgobmFtZSAhPSBudWxsKSAmJiAobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJbmFtZSA9IG51bGw7Ci0JCX0KLQotCQlpZiAoaSA8IGxlbmd0aCkgewotCQkJcmVzdCA9IHBhdGguc3Vic3RyaW5nKGkgKyAxKTsKLQkJfQotCi0JCXJlc3VsdFswXSA9IHR5cGU7Ci0JCXJlc3VsdFsxXSA9IGRlY29kZShuYW1lKTsKLQkJcmVzdWx0WzJdID0gbjsKLQkJcmVzdWx0WzNdID0gcmVzdDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSB8fCAoYyA9PSAnLScpKSB7Ci0JCQkJby5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gaWYgKChjID09ICcuJykgfHwgKGMgPT0gJzonKSB8fCAoYyA9PSAnXycpIHx8IC4uLikKLQkJCQkvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gYSA0IGRpZ2l0IGhleCBjb2RlIHByZWZpeGVkIGJ5ICJfIgotCQkJCVN0cmluZyBoZXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpOwotCQkJCWludCBsID0gaGV4Lmxlbmd0aCgpOwotCQkJCWlmIChsID09IDEpIHsKLQkJCQkJby5hcHBlbmQoIl8wMDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChsID09IDIpIHsKLQkJCQkJby5hcHBlbmQoIl8wMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGwgPT0gMykgewotCQkJCQlvLmFwcGVuZCgiXzAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJby5hcHBlbmQoJ18nKTsKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZm9yCi0JCXJldHVybiBvLnRvU3RyaW5nKCk7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgU3RyaW5nIGRlY29kZShTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBvID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQkJaWYgKGMgIT0gJ18nKSB7Ci0JCQkJby5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gbmV4dCA0IGNoYXJhY3RlcnMgYXJlIHRoZSBoZXggY29kZQotCQkJCVN0cmluZyBoZXg7Ci0JCQkJaWYgKGxlbiA+IGkgKyA0KSB7Ci0JCQkJCWhleCA9IHMuc3Vic3RyaW5nKGkgKyAxLCBpICsgNSk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWhleCA9IHMuc3Vic3RyaW5nKGkgKyAxKTsKLQkJCQkJaSA9IGxlbiAtIDE7Ci0JCQkJfQotCQkJCW8uYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KGhleCwgMTYpKTsKLQkJCX0KLQkJfSAvLyBmb3IKLQkJcmV0dXJuIG8udG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbWFrZVBhdGhHZW4oU3RyaW5nIHBhcmVudFBhdGgsIFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSwgaW50IGNudCkgewotCi0JCVN0cmluZyBwbiA9IG51bGw7Ci0JCW5hbWUgPSBlbmNvZGUobmFtZSk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSAmJiAoY250IDw9IDApKSB7Ci0JCQlwbiA9IHR5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoY250IDw9IDApIHsKLQkJCXBuID0gdHlwZSArICI6IiArICgobmFtZSA9PSBudWxsKSA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJcG4gPSB0eXBlICsgIjoiICsgKChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lKSArICI6IiArIGNudDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JCWlmIChwYXJlbnRQYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnRQYXRoICsgIi4iICsgcG47IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBwbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdFtdIHBhcnNlUGF0aENvbXBvbmVudEdlbihTdHJpbmcgcGF0aCkgewotCi0JCS8qCi0JCSAqIFRoaXMgcm91dGluZSBwYXJzZSB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoIGFuZCByZXR1cm5zIHRoZQotCQkgKiByZXN1bHQgaW4gYW4gYXJycmF5IG9mIFN0cmluZ3MuIHJlc3VsdFswXSA9IHR5cGUgKFN0cmluZykgcmVzdWx0WzFdID0KLQkJICogbmFtZSAoU3RyaW5nKSByZXN1bHRbMl0gPSBjb3VudCAoSW50ZWdlcikgcmVzdWx0WzNdID0gdGhlIHJlc3Qgb2YKLQkJICogdGhlIHBhdGggKFN0cmluZykKLQkJICogCi0JCSAqIEUuZy4gUGF0aENvbXBvbmVudCByZXN1bHRbMF0gcmVzdWx0WzFdIHJlc3VsdFsyXSByZXN1bHRbM10KLQkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlCi0JCSAqIHR5cGUgPG51bGw+IDxudWxsPiA8bnVsbD4gdHlwZS5yZXN0IHR5cGUgPG51bGw+IDxudWxsPiByZXN0Ci0JCSAqIHR5cGU6bmFtZSB0eXBlIG5hbWUgPG51bGw+IDxudWxsPiB0eXBlOm5hbWUucmVzdCB0eXBlIG5hbWUgPG51bGw+Ci0JCSAqIHJlc3QgdHlwZTo6biB0eXBlIDxudWxsPiBuIDxudWxsPiB0eXBlOjpuLnJlc3QgdHlwZSA8bnVsbD4gbiByZXN0Ci0JCSAqIHR5cGU6bmFtZTpuIHR5cGUgbmFtZSBuIDxudWxsPiB0eXBlOm5hbWU6bi5yZXN0IHR5cGUgbmFtZSBuIHJlc3QKLQkJICovCi0KLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFs0XTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJaW50IGkgPSBwYXRoLmluZGV4T2YoJy4nKTsKLQkJaW50IGxlbmd0aCA9IHBhdGgubGVuZ3RoKCk7Ci0KLQkJaWYgKGkgPCAwKSB7Ci0JCQlpID0gbGVuZ3RoOwotCQl9Ci0KLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCUludGVnZXIgbiA9IG51bGw7Ci0JCVN0cmluZyByZXN0ID0gbnVsbDsKLQotCQkvLyBnZXQgdGhlIHR5cGUKLQkJaW50IGogPSBwYXRoLmluZGV4T2YoJzonKTsKLQkJaWYgKGogPiBpKQotCQkJaiA9IC0xOwotCQlpZiAoaiA8IDApIHsKLQkJCXR5cGUgPSBwYXRoLnN1YnN0cmluZygwLCBpKTsKLQkJfQotCQllbHNlIHsKLQkJCXR5cGUgPSBwYXRoLnN1YnN0cmluZygwLCBqKTsKLQotCQkJLy8gZ2V0IHRoZSBuYW1lCi0JCQlpbnQgayA9IHBhdGguaW5kZXhPZignOicsIGogKyAxKTsKLQkJCWlmIChrID4gaSkKLQkJCQlrID0gLTE7Ci0JCQlpZiAoayA8IDApIHsKLQkJCQluYW1lID0gcGF0aC5zdWJzdHJpbmcoaiArIDEsIGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmFtZSA9IHBhdGguc3Vic3RyaW5nKGogKyAxLCBrKTsKLQotCQkJCS8vIGdldCB0aGUgY291bnQKLQkJCQl0cnkgewotCQkJCQluID0gbmV3IEludGVnZXIocGF0aC5zdWJzdHJpbmcoayArIDEsIGkpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQl9Ci0JCQkJaWYgKChuICE9IG51bGwpICYmIChuLmludFZhbHVlKCkgPCAwKSkgewotCQkJCQluID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCW5hbWUgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGkgPCBsZW5ndGgpIHsKLQkJCXJlc3QgPSBwYXRoLnN1YnN0cmluZyhpICsgMSk7Ci0JCX0KLQotCQlyZXN1bHRbMF0gPSB0eXBlOwotCQlyZXN1bHRbMV0gPSBkZWNvZGUobmFtZSk7Ci0JCXJlc3VsdFsyXSA9IG47Ci0JCXJlc3VsdFszXSA9IHJlc3Q7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGVuY29kZUdlbihTdHJpbmcgcykgewotCi0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSB8fCAoYyA9PSAnLScpKSB7Ci0JCQkJby5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gaWYgKChjID09ICcuJykgfHwgKGMgPT0gJzonKSB8fCAoYyA9PSAnXycpIHx8IC4uLikKLQkJCQkvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gYSA0IGRpZ2l0IGhleCBjb2RlIHByZWZpeGVkIGJ5ICJfIgotCQkJCVN0cmluZyBoZXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpOwotCQkJCWludCBsID0gaGV4Lmxlbmd0aCgpOwotCQkJCWlmIChsID09IDEpIHsKLQkJCQkJby5hcHBlbmQoIl8wMDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChsID09IDIpIHsKLQkJCQkJby5hcHBlbmQoIl8wMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGwgPT0gMykgewotCQkJCQlvLmFwcGVuZCgiXzAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJby5hcHBlbmQoJ18nKTsKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZm9yCi0JCXJldHVybiBvLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGRlY29kZUdlbihTdHJpbmcgcykgewotCi0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyAhPSAnXycpIHsKLQkJCQlvLmFwcGVuZChjKTsKLQkJCX0KLQkJCWVsc2UgeyAvLyBuZXh0IDQgY2hhcmFjdGVycyBhcmUgdGhlIGhleCBjb2RlCi0JCQkJU3RyaW5nIGhleDsKLQkJCQlpZiAobGVuID4gaSArIDQpIHsKLQkJCQkJaGV4ID0gcy5zdWJzdHJpbmcoaSArIDEsIGkgKyA1KTsKLQkJCQkJaSArPSA0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaGV4ID0gcy5zdWJzdHJpbmcoaSArIDEpOwotCQkJCQlpID0gbGVuIC0gMTsKLQkJCQl9Ci0JCQkJby5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQoaGV4LCAxNikpOwotCQkJfQotCQl9IC8vIGZvcgotCQlyZXR1cm4gby50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQcmludGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDRmODU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFNvdXJjZU9mZnNldDsKLQotCi1wdWJsaWMgY2xhc3MgRFREUHJpbnRlciBleHRlbmRzIERURFZpc2l0b3IgewotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlib29sZWFuIHVwZGF0ZU9mZnNldCA9IHRydWU7Ci0KLQlwdWJsaWMgRFREUHJpbnRlcihib29sZWFuIHVwZGF0ZU9mZnNldCkgewotCQl0aGlzLnVwZGF0ZU9mZnNldCA9IHVwZGF0ZU9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIHNiOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERmlsZShEVERGaWxlIGZpbGUpIHsKLQkJc3VwZXIudmlzaXREVERGaWxlKGZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRETm90YXRpb24oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQkJZ2VuZXJhdGVDb21tZW50KG5vdGF0aW9uKTsKLQkJdXBkYXRlU3RhcnRPZmZzZXQobm90YXRpb24sIHNiLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKCI8IU5PVEFUSU9OICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChub3RhdGlvbi5nZXROYW1lKCkpLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHB1YmxpY0lEID0gbm90YXRpb24uZ2V0UHVibGljSUQoKTsKLQkJU3RyaW5nIHN5c3RlbUlEID0gbm90YXRpb24uZ2V0U3lzdGVtSUQoKTsKLQkJaWYgKHB1YmxpY0lEID09IG51bGwgfHwgcHVibGljSUQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoIlNZU1RFTSAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCJQVUJMSUMgXCIiKS5hcHBlbmQocHVibGljSUQpLmFwcGVuZCgiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKHN5c3RlbUlEID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZCgiXCJcIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQoIlwiIikuYXBwZW5kKHN5c3RlbUlEKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVuZFRhZygpOwotCQl1cGRhdGVFbmRPZmZzZXQobm90YXRpb24sIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JCXN1cGVyLnZpc2l0RFRETm90YXRpb24obm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW50aXR5KERUREVudGl0eSBlbnRpdHkpIHsKLQkJZ2VuZXJhdGVDb21tZW50KGVudGl0eSk7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KGVudGl0eSwgc2IubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoIjwhRU5USVRZICIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJc2IuYXBwZW5kKCIlICIpOyAvLyROT04tTkxTLTEkCi0KLQkJc2IuYXBwZW5kKGVudGl0eS5nZXROYW1lKCkpLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChlbnRpdHkuZ2V0Q29udGVudCgpLnVucGFyc2UoKSk7Ci0KLQkJZW5kVGFnKCk7Ci0JCXVwZGF0ZUVuZE9mZnNldChlbnRpdHksIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JCXN1cGVyLnZpc2l0RFRERW50aXR5KGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50KERUREVsZW1lbnQgZWxlbWVudCkgewotCQlnZW5lcmF0ZUNvbW1lbnQoZWxlbWVudCk7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KGVsZW1lbnQsIHNiLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKCI8IUVMRU1FTlQgIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gZWxlbWVudC5nZXRDb250ZW50KCk7Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCB8fCBjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCXNiLmFwcGVuZCgiICgiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCQkJc2IuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCQl9IC8vIGVuZCBvZiBlbHNlCi0JCWVuZFRhZygpOwotCQl1cGRhdGVFbmRPZmZzZXQoZWxlbWVudCwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkJdmlzaXRBdHRyaWJ1dGVzKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0JCWdlbmVyYXRlQ29tbWVudChwYXJtRW50aXR5KTsKLQkJdXBkYXRlU3RhcnRPZmZzZXQocGFybUVudGl0eSwgc2IubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoIiUiICsgcGFybUVudGl0eS5nZXROYW1lKCkgKyAiO1xuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl1cGRhdGVFbmRPZmZzZXQocGFybUVudGl0eSwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lCi0JCQkJCQkJCQkJCQkJCS8vIGNoYXIKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJdXBkYXRlU3RhcnRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCQlTdHJpbmcgdHJhaWxpbmdDaGFycyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUmVwZWF0YWJsZUNvbnRlbnQpIHsKLQkJCURURFJlcGVhdGFibGVDb250ZW50IHJlcGVhdENvbnRlbnQgPSAoRFREUmVwZWF0YWJsZUNvbnRlbnQpIGNvbnRlbnQ7Ci0JCQlEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9IHJlcGVhdENvbnRlbnQuZ2V0T2NjdXJyZW5jZSgpOwotCQkJLy8gSW50ZWdlciBvY2N1cnJlbmNlID0gcmVwZWF0Q29udGVudC5nZXRPY2N1cnJlbmNlKCk7Ci0JCQlpZiAob2NjdXJyZW5jZVR5cGUgIT0gbnVsbCkgewotCQkJCWludCBvY2N1clR5cGUgPSBvY2N1cnJlbmNlVHlwZS5nZXRWYWx1ZSgpOwotCQkJCWlmIChvY2N1clR5cGUgIT0gRFRET2NjdXJyZW5jZVR5cGUuT05FKSB7Ci0JCQkJCWlmIChyZXBlYXRDb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQkJc2IuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRyYWlsaW5nQ2hhcnMgPSAiKSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl0cmFpbGluZ0NoYXJzICs9IChjaGFyKSBvY2N1clR5cGU7Ci0JCQkJfQotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJc3VwZXIudmlzaXREVERFbGVtZW50Q29udGVudChjb250ZW50KTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IHx8IGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlzYi5hcHBlbmQoKChEVERSZXBlYXRhYmxlQ29udGVudCkgY29udGVudCkudW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkpOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQllbHNlIHsKLQkJCS8vIGhhbmRsZSBEVERQQ0RhdGFDb250ZW50LCBEVERBbnlDb250ZW50IGFuZCBEVERFbXB0eUNvbnRlbnQgaGVyZQotCQkJc2IuYXBwZW5kKGNvbnRlbnQuZ2V0Q29udGVudE5hbWUoKSk7Ci0JCX0gLy8gZW5kIG9mIGVsc2UKLQkJc2IuYXBwZW5kKHRyYWlsaW5nQ2hhcnMpOwotCQl1cGRhdGVFbmRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBncm91cCkgewotCQlzYi5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotCQlEVERHcm91cEtpbmQga2luZCA9IGdyb3VwLmdldEdyb3VwS2luZCgpOwotCQkvLyBNT0YyRU1GIFBvcnQKLQkJLy8gSW50ZWdlciBncm91cEtpbmQgPSBncm91cC5nZXRHcm91cEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gbnVsbCkgewotCQkJZ3JvdXAuc2V0R3JvdXBLaW5kKERUREdyb3VwS2luZC5nZXQoRFRER3JvdXBLaW5kLlNFUVVFTkNFKSk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJU3RyaW5nIGNvbiA9IGdyb3VwLmdldEdyb3VwS2luZCgpLmdldFZhbHVlKCkgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSA/ICIgfCAiIDogIiwgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJLy8gTG9vcCB0aHJ1IHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBncm91cAotCQlDb2xsZWN0aW9uIGNvbnRlbnQgPSBncm91cC5nZXRDb250ZW50KCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZmlyc3RDb250ZW50ID0gdHJ1ZTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGNvbnRlbnQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKCFmaXJzdENvbnRlbnQpIHsKLQkJCQkJc2IuYXBwZW5kKGNvbik7Ci0JCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCQllbHNlIHsKLQkJCQkJZmlyc3RDb250ZW50ID0gZmFsc2U7Ci0JCQkJfSAvLyBlbmQgb2YgZWxzZQotCQkJCXZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlzYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCB2aXNpdEF0dHJpYnV0ZXMoRFRERWxlbWVudCBlbGVtKSB7Ci0JCUNvbGxlY3Rpb24gYXR0cnMgPSBlbGVtLmdldERUREF0dHJpYnV0ZSgpOwotCQlJdGVyYXRvciBpID0gYXR0cnMuaXRlcmF0b3IoKTsKLQkJaWYgKGF0dHJzICE9IG51bGwgJiYgaS5oYXNOZXh0KCkpIHsKLQkJCURUREF0dHJpYnV0ZSBhdHRyaWIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBjb21tZW50ID0gYXR0cmliLmdldENvbW1lbnQoKTsKLQkJCWlmIChjb21tZW50ICE9IG51bGwgJiYgY29tbWVudC5sZW5ndGgoKSA+IDApCi0JCQkJc2IuYXBwZW5kKCI8IS0tXG4gIikuYXBwZW5kKGNvbW1lbnQpLmFwcGVuZCgiXG4tLT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXNiLmFwcGVuZCgiPCFBVFRMSVNUICIgKyBlbGVtLmdldE5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQl1cGRhdGVTdGFydE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkJCXNiLmFwcGVuZChhdHRyaWIudW5wYXJzZSgpKTsKLQkJCXVwZGF0ZUVuZE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkJCXNiLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yICg7IGkuaGFzTmV4dCgpOykgewotCQkJCWF0dHJpYiA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCQkJCWNvbW1lbnQgPSBhdHRyaWIuZ2V0Q29tbWVudCgpOwotCQkJCWlmIChjb21tZW50ICE9IG51bGwgJiYgY29tbWVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJc2IuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQubGVuZ3RoKCkgPiAwKQotCQkJCQkJc2IuYXBwZW5kKCI8IS0tXG4gIikuYXBwZW5kKGNvbW1lbnQpLmFwcGVuZCgiXG4tLT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc2IuYXBwZW5kKCI8IUFUVExJU1QgIiArIGVsZW0uZ2V0TmFtZSgpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXVwZGF0ZVN0YXJ0T2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCQkJCXNiLmFwcGVuZChhdHRyaWIudW5wYXJzZSgpKTsKLQkJCQl1cGRhdGVFbmRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JCQkJc2IuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzYi5hcHBlbmQoIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kVGFnKCkgewotCQlzYi5hcHBlbmQoIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXJ0T2Zmc2V0KERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICh1cGRhdGVPZmZzZXQpIHsKLQkJCW8uc2V0U3RhcnRPZmZzZXQob2Zmc2V0KTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5kT2Zmc2V0KERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICh1cGRhdGVPZmZzZXQpIHsKLQkJCW8uc2V0RW5kT2Zmc2V0KG9mZnNldCk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ29tbWVudChEVERPYmplY3QgZHRkT2JqZWN0KSB7Ci0JCVN0cmluZyBjb21tZW50U3RyaW5nID0gbnVsbDsKLQotCQlpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkKLQkJCWNvbW1lbnRTdHJpbmcgPSAoKERUREVsZW1lbnQpIGR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCQllbHNlIGlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVERFbnRpdHkpCi0JCQljb21tZW50U3RyaW5nID0gKChEVERFbnRpdHkpIGR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCQllbHNlIGlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVEROb3RhdGlvbikKLQkJCWNvbW1lbnRTdHJpbmcgPSAoKERURE5vdGF0aW9uKSBkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQotCQlpZiAoY29tbWVudFN0cmluZyAhPSBudWxsICYmIGNvbW1lbnRTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzYi5hcHBlbmQoIjwhLS0iKS5hcHBlbmQoY29tbWVudFN0cmluZykuYXBwZW5kKCItLT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCi0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGdldEJ1ZmZlckdlbigpIHsKLQkvLwotCS8vIHJldHVybiBzYjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREZpbGVHZW4oRFRERmlsZSBmaWxlKSB7Ci0JLy8KLQkvLyBzdXBlci52aXNpdERUREZpbGUoZmlsZSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVEROb3RhdGlvbkdlbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCS8vCi0JLy8gZ2VuZXJhdGVDb21tZW50KG5vdGF0aW9uKTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChub3RhdGlvbiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiPCFOT1RBVElPTiAiKTsKLQkvLyBzYi5hcHBlbmQobm90YXRpb24uZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIHB1YmxpY0lEID0gbm90YXRpb24uZ2V0UHVibGljSUQoKTsKLQkvLyBTdHJpbmcgc3lzdGVtSUQgPSBub3RhdGlvbi5nZXRTeXN0ZW1JRCgpOwotCS8vIGlmIChwdWJsaWNJRCA9PSBudWxsIHx8IHB1YmxpY0lELmVxdWFscygiIikpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiU1lTVEVNICIpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiUFVCTElDIFwiIikuYXBwZW5kKHB1YmxpY0lEKS5hcHBlbmQoIlwiICIpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gaWYgKHN5c3RlbUlEPT1udWxsKQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIlwiXCIiKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIlwiIikuYXBwZW5kKHN5c3RlbUlEKS5hcHBlbmQoIlwiIik7Ci0JLy8gfQotCS8vIGVuZFRhZygpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChub3RhdGlvbiwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkvLyBzdXBlci52aXNpdERURE5vdGF0aW9uKG5vdGF0aW9uKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVudGl0eUdlbihEVERFbnRpdHkgZW50aXR5KSB7Ci0JLy8KLQkvLyBnZW5lcmF0ZUNvbW1lbnQoZW50aXR5KTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChlbnRpdHksIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoIjwhRU5USVRZICIpOwotCS8vCi0JLy8KLQkvLyBpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JLy8gc2IuYXBwZW5kKCIlICIpOwotCS8vCi0JLy8KLQkvLyBzYi5hcHBlbmQoZW50aXR5LmdldE5hbWUoKSkuYXBwZW5kKCIgIik7Ci0JLy8gc2IuYXBwZW5kKGVudGl0eS5nZXRDb250ZW50KCkudW5wYXJzZSgpKTsKLQkvLwotCS8vCi0JLy8gZW5kVGFnKCk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGVudGl0eSwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkvLyBzdXBlci52aXNpdERUREVudGl0eShlbnRpdHkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudEdlbihEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkvLwotCS8vIGdlbmVyYXRlQ29tbWVudChlbGVtZW50KTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChlbGVtZW50LCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCI8IUVMRU1FTlQgIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkvLyBEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gZWxlbWVudC5nZXRDb250ZW50KCk7Ci0JLy8gaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50IHx8Ci0JLy8gY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIiAoIik7Ci0JLy8gc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCS8vIHNiLmFwcGVuZCgiKSIpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIiAiKTsKLQkvLyBzdXBlci52aXNpdERUREVsZW1lbnQoZWxlbWVudCk7Ci0JLy8gfSAvLyBlbmQgb2YgZWxzZQotCS8vIGVuZFRhZygpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChlbGVtZW50LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUgY2hhcgotCS8vIHZpc2l0QXR0cmlidXRlcyhlbGVtZW50KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZAotCS8vIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlR2VuKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZQotCS8vIHBhcm1FbnRpdHkpIHsKLQkvLwotCS8vIGdlbmVyYXRlQ29tbWVudChwYXJtRW50aXR5KTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChwYXJtRW50aXR5LCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCIlIiArIHBhcm1FbnRpdHkuZ2V0TmFtZSgpICsgIjtcbiIpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChwYXJtRW50aXR5LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUKLQkvLyBjaGFyCi0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JLy8KLQkvLyB1cGRhdGVTdGFydE9mZnNldChjb250ZW50LCBzYi5sZW5ndGgoKSk7Ci0JLy8gU3RyaW5nIHRyYWlsaW5nQ2hhcnMgPSAiIjsKLQkvLyBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFJlcGVhdGFibGVDb250ZW50ICkKLQkvLyB7Ci0JLy8gRFREUmVwZWF0YWJsZUNvbnRlbnQgcmVwZWF0Q29udGVudCA9IChEVERSZXBlYXRhYmxlQ29udGVudCkgY29udGVudDsKLQkvLyBJbnRlZ2VyIG9jY3VycmVuY2UgPSByZXBlYXRDb250ZW50LmdldE9jY3VycmVuY2UoKTsKLQkvLyBpZiAob2NjdXJyZW5jZSAhPSBudWxsKQotCS8vIHsKLQkvLyBpbnQgb2NjdXJUeXBlID0gb2NjdXJyZW5jZS5pbnRWYWx1ZSgpOwotCS8vIGlmIChvY2N1clR5cGUgIT0gRFRET2NjdXJyZW5jZVR5cGUuT05FKQotCS8vIHsKLQkvLyBpZiAocmVwZWF0Q29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiKCIpOwotCS8vIHRyYWlsaW5nQ2hhcnMgPSAiKSI7Ci0JLy8gfQotCS8vIHRyYWlsaW5nQ2hhcnMgKz0gKGNoYXIpIG9jY3VyVHlwZTsKLQkvLyB9Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vICAgIAotCS8vIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KQotCS8vIHsKLQkvLyBzdXBlci52aXNpdERUREVsZW1lbnRDb250ZW50KGNvbnRlbnQpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IHx8Ci0JLy8gY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgoKERURFJlcGVhdGFibGVDb250ZW50KWNvbnRlbnQpLnVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gLy8gaGFuZGxlIERURFBDRGF0YUNvbnRlbnQsIERUREFueUNvbnRlbnQgYW5kIERUREVtcHR5Q29udGVudCBoZXJlCi0JLy8gc2IuYXBwZW5kKGNvbnRlbnQuZ2V0Q29udGVudE5hbWUoKSk7Ci0JLy8gfSAvLyBlbmQgb2YgZWxzZQotCS8vIHNiLmFwcGVuZCh0cmFpbGluZ0NoYXJzKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRER3JvdXBDb250ZW50R2VuKERUREdyb3VwQ29udGVudCBncm91cCkgewotCS8vCi0JLy8gc2IuYXBwZW5kKCIoIik7Ci0JLy8gICAgCi0JLy8gSW50ZWdlciBncm91cEtpbmQgPSBncm91cC5nZXRHcm91cEtpbmQoKTsKLQkvLyBpZiAoZ3JvdXBLaW5kID09IG51bGwpCi0JLy8gewotCS8vIGdyb3VwLnNldEdyb3VwS2luZChEVERHcm91cEtpbmQuU0VRVUVOQ0UpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gICAgCi0JLy8gU3RyaW5nIGNvbiA9IGdyb3VwLmdldEdyb3VwS2luZCgpLmludFZhbHVlKCkgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSA/ICIKLQkvLyB8ICIgOiAiLCAiOwotCS8vCi0JLy8KLQkvLyAvLyBMb29wIHRocnUgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IGdyb3VwCi0JLy8gQ29sbGVjdGlvbiBjb250ZW50ID0gZ3JvdXAuZ2V0Q29udGVudCgpOwotCS8vIGlmIChjb250ZW50ICE9IG51bGwpCi0JLy8gewotCS8vIGJvb2xlYW4gZmlyc3RDb250ZW50ID0gdHJ1ZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSBjb250ZW50Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JLy8gewotCS8vIGlmICghZmlyc3RDb250ZW50KQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoY29uKTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gZmlyc3RDb250ZW50ID0gZmFsc2U7Ci0JLy8gfSAvLyBlbmQgb2YgZWxzZQotCS8vIHZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gc2IuYXBwZW5kKCIpIik7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXRBdHRyaWJ1dGVzR2VuKERUREVsZW1lbnQgZWxlbSkgewotCS8vCi0JLy8gQ29sbGVjdGlvbiBhdHRycyA9IGVsZW0uZ2V0RFREQXR0cmlidXRlKCk7Ci0JLy8gSXRlcmF0b3IgaSA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0JLy8gaWYgKGF0dHJzICE9IG51bGwgJiYgaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERUREF0dHJpYnV0ZSBhdHRyaWIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkvLyBTdHJpbmcgY29tbWVudCA9IGF0dHJpYi5nZXRDb21tZW50KCk7Ci0JLy8gaWYgKGNvbW1lbnQhPW51bGwgJiYgY29tbWVudC5sZW5ndGgoKT4wKQotCS8vIHNiLmFwcGVuZCgiPCEtLVxuICIpLmFwcGVuZChjb21tZW50KS5hcHBlbmQoIlxuLS0+XG4iKTsKLQkvLyBzYi5hcHBlbmQoIjwhQVRUTElTVCAiICsgZWxlbS5nZXROYW1lKCkgKyAiXG4iKTsKLQkvLyBzYi5hcHBlbmQoIiAiKTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoYXR0cmliLnVucGFyc2UoKSk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiXG4iKTsKLQkvLyBmb3IgKDsgaS5oYXNOZXh0KCk7ICkKLQkvLyB7Ci0JLy8gYXR0cmliID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JLy8gY29tbWVudCA9IGF0dHJpYi5nZXRDb21tZW50KCk7Ci0JLy8gaWYgKGNvbW1lbnQhPW51bGwgJiYgY29tbWVudC5sZW5ndGgoKT4wKQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIj5cbiIpOwotCS8vIGlmIChjb21tZW50IT1udWxsICYmIGNvbW1lbnQubGVuZ3RoKCk+MCkKLQkvLyBzYi5hcHBlbmQoIjwhLS1cbiAiKS5hcHBlbmQoY29tbWVudCkuYXBwZW5kKCJcbi0tPlxuIik7Ci0JLy8gc2IuYXBwZW5kKCI8IUFUVExJU1QgIiArIGVsZW0uZ2V0TmFtZSgpICsgIlxuIik7Ci0JLy8gfQotCS8vIHNiLmFwcGVuZCgiICIpOwotCS8vIHVwZGF0ZVN0YXJ0T2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZChhdHRyaWIudW5wYXJzZSgpKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCJcbiIpOwotCS8vIH0KLQkvLyBzYi5hcHBlbmQoIj5cbiIpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBlbmRUYWdHZW4oKSB7Ci0JLy8KLQkvLyBzYi5hcHBlbmQoIj5cbiIpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXJ0T2Zmc2V0R2VuKERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JLy8KLQkvLyBpZiAodXBkYXRlT2Zmc2V0KQotCS8vIHsKLQkvLyBvLnNldFN0YXJ0T2Zmc2V0KG9mZnNldCk7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbmRPZmZzZXRHZW4oRFREU291cmNlT2Zmc2V0IG8sIGludCBvZmZzZXQpIHsKLQkvLwotCS8vIGlmICh1cGRhdGVPZmZzZXQpCi0JLy8gewotCS8vIG8uc2V0RW5kT2Zmc2V0KG9mZnNldCk7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUNvbW1lbnRHZW4oRFRET2JqZWN0IGR0ZE9iamVjdCkgewotCS8vCi0JLy8gU3RyaW5nIGNvbW1lbnRTdHJpbmcgPSBudWxsOwotCS8vCi0JLy8KLQkvLyBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkKLQkvLyBjb21tZW50U3RyaW5nID0gKChEVERFbGVtZW50KWR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCS8vIGVsc2UgaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERUREVudGl0eSkKLQkvLyBjb21tZW50U3RyaW5nID0gKChEVERFbnRpdHkpZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0JLy8gZWxzZSBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRETm90YXRpb24pCi0JLy8gY29tbWVudFN0cmluZyA9ICgoRFRETm90YXRpb24pZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0JLy8KLQkvLwotCS8vIGlmICggY29tbWVudFN0cmluZyE9bnVsbCAmJiBjb21tZW50U3RyaW5nLmxlbmd0aCgpPjApCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiPCEtLSIpLmFwcGVuZChjb21tZW50U3RyaW5nKS5hcHBlbmQoIi0tPlxuIik7Ci0JLy8gfQotCS8vIH0KLX0vLyBEVERQcmludGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4NmMzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBEVERSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JcHVibGljIERURFJlc291cmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFN0cmluZyBmaWxlbmFtZSkgewotCQlyZXR1cm4gbmV3IERURFJlc291cmNlSW1wbChmaWxlbmFtZSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5ldyBEVERSZXNvdXJjZUltcGwodXJpKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbmV3IERURFJlc291cmNlSW1wbCh1cmkpOwotCQlyZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgRFREUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc291cmNlcy5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoU3RyaW5nIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcmVzb3VyY2UubG9hZChuZXcgSGFzaE1hcCgpKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFVSSSB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCXJlc291cmNlLmxvYWQobmV3IEhhc2hNYXAoKSk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbG9hZChyZXNvdXJjZXMsIHVyaSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBVUkkgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGxvYWQocmVzb3VyY2VzLCB1cmksIG5ldyBIYXNoTWFwKCkpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIHVyaSwgTWFwIG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlcywgdXJpKTsKLQkJcmVzb3VyY2UubG9hZChvcHRpb25zKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFJlc291cmNlU2V0IHJlc291cmNlcywgVVJJIHVyaSwgTWFwIG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlcywgdXJpKTsKLQkJcmVzb3VyY2UubG9hZChvcHRpb25zKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLX0gLy8gRFREUmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA4NWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLQotCi1wdWJsaWMgY2xhc3MgRFREUmVzb3VyY2VJbXBsIGV4dGVuZHMgUmVzb3VyY2VJbXBsIHsKLQotCXB1YmxpYyBEVERSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIERURFJlc291cmNlSW1wbChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJc3VwZXIoVVJJLmNyZWF0ZVVSSShmaWxlbmFtZSkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj4+Pj4gRFREUmVzb3VyY2VJbXBsIGN0b3IgMSIpOwotCX0KLQotCXB1YmxpYyBEVERSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj4+Pj4gRFREUmVzb3VyY2VJbXBsIGN0b3IgMiIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIG9iamVjdCBmb3IgdGhlIGdpdmVuIFVSSQotCSAqIHtAbGluayBVUkkjZnJhZ21lbnQgZnJhZ21lbnR9LgotCSAqIDxwPgotCSAqIFRoZSBmcmFnbWVudCBlbmNvZGluZyB3aWxsIHR5cGljYWxseSBiZSB0aGF0IHByb2R1Y2VkIGJ5Ci0JICoge0BsaW5rICNnZXRVUklGcmFnbWVudCBnZXRVUklGcmFnbWVudH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB1cmlGcmFnbWVudAotCSAqICAgICAgICAgICAgdGhlIGZyYWdtZW50IHRvIHJlc29sdmUuCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZnJhZ21lbnQuCi0JICogQHNlZSAjZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNnZXRFT2JqZWN0KFVSSSwgYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCNyZXNvbHZlKEVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QjZU9iamVjdEZvclVSSUZyYWdtZW50U2VnbWVudChTdHJpbmcpCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgbmF2aWdhdGluZyB0aGUgZnJhZ21lbnQuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChqYXZhLmxhbmcuU3RyaW5nIHVyaUZyYWdtZW50KSB7Ci0JCUVMaXN0IGNvbnRlbnRzID0gZ2V0Q29udGVudHMoKTsKLQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSBjb250ZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQkJCS8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBEVERGaWxlIGluIGEgRFREIGV4dGVudAotCQkJCQlFT2JqZWN0IHJlc3VsdCA9ICgoRFRERmlsZSkgb2JqKS5maW5kT2JqZWN0KHVyaUZyYWdtZW50KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCI+Pj4gRFRES2V5IEVycm9yOiBjYW5ub3QgZmluZCBvYmplY3QgIiArIHVyaUZyYWdtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIuZ2V0RU9iamVjdCh1cmlGcmFnbWVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIHtAbGluayBVUkkjZnJhZ21lbnQgZnJhZ21lbnR9IHRoYXQsIHdoZW4gcGFzc2VkIHRvCi0JICoge0BsaW5rICNnZXRFT2JqZWN0IGdldEVPYmplY3R9IHdpbGwgcmV0dXJuIHRoZSBnaXZlbiBvYmplY3QuCi0JICogPHA+Ci0JICogSW4gb3RoZXIgd29yZHMsIHRoZSBmb2xsb3dpbmcgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGFueSBvYmplY3QKLQkgKiBjb250YWluZWQgYnkgYSByZXNvdXJjZToKLQkgKiAKLQkgKiA8cHJlPgotCSAqIAotCSAqICAgIFJlc291cmNlIHJlc291cmNlID0gZU9iamVjdC5lUmVzb3VyY2UoKTsKLQkgKiAgICBlT2JqZWN0ID09IHJlc291cmNlLmdldEVPYmplY3QocmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQoZU9iamVjdCkpCi0JICogCi0JICogPC9wcmU+Ci0JICogCi0JICogQW4gaW1wbGVtZW50YXRpb24gbWF5IGNob29zZSB0byB1c2UgSURzIG9yIHRvIHVzZSBzdHJ1Y3R1cmVkIFVSSQotCSAqIGZyYWdtZW50cywgYXMgc3VwcG9ydGVkIGJ5Ci0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QjZVVSSUZyYWdtZW50U2VnbWVudCBlVVJJRnJhZ21lbnRTZWdtZW50fS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gaWRlbnRpZnkuCi0JICogQHJldHVybiB0aGUgVVJJIHtAbGluayBVUkkjZnJhZ21lbnQgZnJhZ21lbnR9IGZvciB0aGUgb2JqZWN0LgotCSAqIEBzZWUgI2dldEVPYmplY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlVVJJRnJhZ21lbnRTZWdtZW50KG9yZy5lY2xpcHNlLmVtZi5jb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwKLQkgKiAgICAgIEVPYmplY3QpCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgRFRET2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChEVERPYmplY3QpIGVPYmplY3QpLmdldFBhdGhuYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFVSSUZyYWdtZW50KGVPYmplY3QpOwotCX0KLQotCXByaXZhdGUgRFREVXRpbCBkdGRVdGlsOwotCi0JcHVibGljIERURFV0aWwgZ2V0RFREVXRpbCgpIHsKLQkJcmV0dXJuIGR0ZFV0aWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RFREVXRpbChEVERVdGlsIGR0ZFV0aWwpIHsKLQkJdGhpcy5kdGRVdGlsID0gZHRkVXRpbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB7Ci0KLQkJU3RyaW5nIHVyaVN0cmluZyA9IGdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCXRyeSB7Ci0JCQlEVERVdGlsIGR0ZFV0aWwgPSBuZXcgRFREVXRpbCgpOwotCQkJZHRkVXRpbC5wYXJzZShnZXRSZXNvdXJjZVNldCgpLCB1cmlTdHJpbmcpOwotCQkJZHRkVXRpbC5zZXRSZXNvdXJjZSh0aGlzKTsKLQkJCXNldERURFV0aWwoZHRkVXRpbCk7Ci0JCQlnZXRDb250ZW50cygpLmFkZChkdGRVdGlsLmdldERUREZpbGUoKSk7Ci0KLQkJCS8vIFJlc2V0IHRoZSBkaXJ0eSBmbGFnIGFmdGVyIHRoZSByZXNvdXJjZSBpcyBsb2FkZWQKLQkJCXNldE1vZGlmaWVkKGZhbHNlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MsIE9iamVjdCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSBjb250ZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlEVERQcmludGVyIHByaW50ZXIgPSBuZXcgRFREUHJpbnRlcih0cnVlKTsKLQkJCQkJCXByaW50ZXIudmlzaXREVERGaWxlKChEVERGaWxlKSBvYmopOwotCi0JCQkJCQlTdHJpbmcgcyA9IHByaW50ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQkJCQkJCW9zLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCQkvLyBSZXNldCB0aGUgZGlydHkgZmxhZyBhZnRlciB0aGUgcmVzb3VyY2UgaXMgc2F2ZWQKLQkJCQkJCXNldE1vZGlmaWVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKFppcE91dHB1dFN0cmVhbSB6b3MsIFN0cmluZyBlbnRyeSwgU3RyaW5nIG1ldGFNb2RlbE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRXhjZXB0aW9uKERURENvcmVNZXNzYWdlcy5fRVhDX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwM2I2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0KLQotcHVibGljIGNsYXNzIERURFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERURFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIERURFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBEVERQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCUVDbGFzcyB0aGVFQ2xhc3MgPSB0aGVFT2JqZWN0LmVDbGFzcygpOwotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UIDogewotCQkJCQlEVERHcm91cENvbnRlbnQgZHRkR3JvdXBDb250ZW50ID0gKERUREdyb3VwQ29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERHcm91cENvbnRlbnQoZHRkR3JvdXBDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURFJlcGVhdGFibGVDb250ZW50KGR0ZEdyb3VwQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRHcm91cENvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEUgOiB7Ci0JCQkJCURUREF0dHJpYnV0ZSBkdGRBdHRyaWJ1dGUgPSAoRFREQXR0cmlidXRlKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREF0dHJpYnV0ZShkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlQgOiB7Ci0JCQkJCURUREVsZW1lbnQgZHRkRWxlbWVudCA9IChEVERFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVsZW1lbnQoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQ2xhc3MoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERDb250ZW50KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVCA6IHsKLQkJCQkJRFRERW1wdHlDb250ZW50IGR0ZEVtcHR5Q29udGVudCA9IChEVERFbXB0eUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW1wdHlDb250ZW50KGR0ZEVtcHR5Q29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRFbXB0eUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVCA6IHsKLQkJCQkJRFREQW55Q29udGVudCBkdGRBbnlDb250ZW50ID0gKERUREFueUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFREQW55Q29udGVudChkdGRBbnlDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVsZW1lbnRDb250ZW50KGR0ZEFueUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlQgOiB7Ci0JCQkJCURURFBDRGF0YUNvbnRlbnQgZHRkcGNEYXRhQ29udGVudCA9IChEVERQQ0RhdGFDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURURFBDRGF0YUNvbnRlbnQoZHRkcGNEYXRhQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRwY0RhdGFDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVCA6IHsKLQkJCQkJRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgPSAoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFIDogewotCQkJCQlEVERGaWxlIGR0ZEZpbGUgPSAoRFRERmlsZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERGaWxlKGR0ZEZpbGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFIDogewotCQkJCQlEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlID0gKERUREJhc2ljVHlwZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERCYXNpY1R5cGUoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVDbGFzcyhkdGRCYXNpY1R5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRSA6IHsKLQkJCQkJRFRERW51bWVyYXRpb25UeXBlIGR0ZEVudW1lcmF0aW9uVHlwZSA9IChEVERFbnVtZXJhdGlvblR5cGUpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW51bWVyYXRpb25UeXBlKGR0ZEVudW1lcmF0aW9uVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFRW51bShkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRURhdGFUeXBlKGR0ZEVudW1lcmF0aW9uVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQ2xhc3NpZmllcihkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTiA6IHsKLQkJCQkJRFRETm90YXRpb24gZHRkTm90YXRpb24gPSAoRFRETm90YXRpb24pIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRETm90YXRpb24oZHRkTm90YXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREQ29udGVudChkdGROb3RhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWSA6IHsKLQkJCQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IChEVERFbnRpdHkpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW50aXR5KGR0ZEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERDb250ZW50KGR0ZEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWSA6IHsKLQkJCQkJRFRERXh0ZXJuYWxFbnRpdHkgZHRkRXh0ZXJuYWxFbnRpdHkgPSAoRFRERXh0ZXJuYWxFbnRpdHkpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERXh0ZXJuYWxFbnRpdHkoZHRkRXh0ZXJuYWxFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERW50aXR5Q29udGVudChkdGRFeHRlcm5hbEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWSA6IHsKLQkJCQkJRFRESW50ZXJuYWxFbnRpdHkgZHRkSW50ZXJuYWxFbnRpdHkgPSAoRFRESW50ZXJuYWxFbnRpdHkpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRESW50ZXJuYWxFbnRpdHkoZHRkSW50ZXJuYWxFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERW50aXR5Q29udGVudChkdGRJbnRlcm5hbEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFIDogewotCQkJCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlID0gKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURENvbnRlbnQoZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UIDogewotCQkJCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQgPSAoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREZpbGUoRFRERmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRETm90YXRpb24oRFRETm90YXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURENvbnRlbnQoRFREQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5KERUREVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5Q29udGVudChEVERFbnRpdHlDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFeHRlcm5hbEVudGl0eShEVERFeHRlcm5hbEVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRESW50ZXJuYWxFbnRpdHkoRFRESW50ZXJuYWxFbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoRFREUmVwZWF0YWJsZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50KERUREVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbXB0eUNvbnRlbnQoRFRERW1wdHlDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERBbnlDb250ZW50KERUREFueUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURFBDRGF0YUNvbnRlbnQoRFREUENEYXRhQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW51bWVyYXRpb25UeXBlKERUREVudW1lcmF0aW9uVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREQmFzaWNUeXBlKERUREJhc2ljVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vIC8vIHB1YmxpYyBPYmplY3QgY2FzZUVOYW1lc3BhY2UoRU5hbWVzcGFjZSBvYmplY3QpIHsKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3MoRUNsYXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQXR0cmlidXRlKEVBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVFbnVtKEVFbnVtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRURhdGFUeXBlKEVEYXRhVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3NpZmllcihFQ2xhc3NpZmllciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vIC8vIHB1YmxpYyBPYmplY3QgY2FzZUludGVybmFsRUNsYXNzaWZpZXIoSW50ZXJuYWxFQ2xhc3NpZmllciBvYmplY3QpIHsKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvLyBEVERTd2l0Y2gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjhmZjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIERURFVuaXF1ZU5hbWVIZWxwZXIgewotCXB1YmxpYyBEVERVbmlxdWVOYW1lSGVscGVyKCkgewotCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBkdGRGaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVsZW1lbnRzLCAiTmV3RWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRW50aXR5TmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBlbnRpdGllcyA9IGR0ZEZpbGUubGlzdERUREVudGl0eSgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbnRpdGllcywgIk5ld0VudGl0eSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTm90YXRpb25OYW1lKERUREZpbGUgZHRkRmlsZSkgewotCQlMaXN0IG5vdGF0aW9ucyA9IGR0ZEZpbGUubGlzdERURE5vdGF0aW9uKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKG5vdGF0aW9ucywgIk5ld05vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVBdHRyaWJ1dGVOYW1lKERUREVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IGF0dHJzID0gZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoYXR0cnMsICJOZXdBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoTGlzdCBvYmpzLCBTdHJpbmcgdG9rZW4pIHsKLQkJaW50IGNvdW50ZXIgPSAxOwotCi0JCWJvb2xlYW4gdW5pcXVlTmFtZSA9IGZhbHNlOwotCQl3aGlsZSAoIXVuaXF1ZU5hbWUpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gdG9rZW4gKyBuZXcgSW50ZWdlcihjb3VudGVyKyspOwotCQkJdW5pcXVlTmFtZSA9IHRydWU7Ci0JCQlJdGVyYXRvciBpdGVyID0gb2Jqcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBvYmpOYW1lID0gZ2V0TmFtZShvYmopOwotCQkJCWlmIChvYmpOYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQl1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1bmlxdWVOYW1lKSB7Ci0JCQkJcmV0dXJuIG5ld05hbWU7Ci0JCQl9Ci0JCX0KLQkJLy8gd2Ugc2hvdWxkbid0IGdldCBoZXJlCi0JCXJldHVybiAiTm8gTmFtZSBmb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCXJldHVybiAoKERUREVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREVudGl0eSkgewotCQkJcmV0dXJuICgoRFRERW50aXR5KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVEROb3RhdGlvbikgewotCQkJcmV0dXJuICgoRFRETm90YXRpb24pIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREF0dHJpYnV0ZSkgewotCQkJcmV0dXJuICgoRFREQXR0cmlidXRlKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZUdlbihEVERGaWxlIGR0ZEZpbGUpIHsKLQotCQlMaXN0IGVsZW1lbnRzID0gZHRkRmlsZS5saXN0RFRERWxlbWVudCgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbGVtZW50cywgIk5ld0VsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVFbnRpdHlOYW1lR2VuKERUREZpbGUgZHRkRmlsZSkgewotCi0JCUxpc3QgZW50aXRpZXMgPSBkdGRGaWxlLmxpc3REVERFbnRpdHkoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZW50aXRpZXMsICJOZXdFbnRpdHkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVOb3RhdGlvbk5hbWVHZW4oRFRERmlsZSBkdGRGaWxlKSB7Ci0KLQkJTGlzdCBub3RhdGlvbnMgPSBkdGRGaWxlLmxpc3REVEROb3RhdGlvbigpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShub3RhdGlvbnMsICJOZXdOb3RhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUF0dHJpYnV0ZU5hbWVHZW4oRFRERWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJTGlzdCBhdHRycyA9IGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGF0dHJzLCAiTmV3QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZUdlbihMaXN0IG9ianMsIFN0cmluZyB0b2tlbikgewotCi0JCWludCBjb3VudGVyID0gMTsKLQotCQlib29sZWFuIHVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJd2hpbGUgKCF1bmlxdWVOYW1lKSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IHRva2VuICsgbmV3IEludGVnZXIoY291bnRlcisrKTsKLQkJCXVuaXF1ZU5hbWUgPSB0cnVlOwotCQkJSXRlcmF0b3IgaXRlciA9IG9ianMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgb2JqTmFtZSA9IGdldE5hbWUob2JqKTsKLQkJCQlpZiAob2JqTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQkJdW5pcXVlTmFtZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodW5pcXVlTmFtZSkgewotCQkJCXJldHVybiBuZXdOYW1lOwotCQkJfQotCQl9Ci0JCS8vIHdlIHNob3VsZG4ndCBnZXQgaGVyZQotCQlyZXR1cm4gIk5vIE5hbWUgZm91bmQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE5hbWVHZW4oT2JqZWN0IG9iaikgewotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChEVERFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbnRpdHkpIHsKLQkJCXJldHVybiAoKERUREVudGl0eSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRETm90YXRpb24pIHsKLQkJCXJldHVybiAoKERURE5vdGF0aW9uKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiAoKERUREF0dHJpYnV0ZSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotfS8vIERURFVuaXF1ZU5hbWVIZWxwZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhN2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVycm9yTWVzc2FnZTsKLQotLyoqCi0gKiBDcmVhdGUgTU9GIG9iamVjdHMgZnJvbSB0aGUgcGFyc2VkIERURCBJZiBubyBEVEQgZmlsZSBpcyBzcGVjaWZlZCwgY3JlYXRlCi0gKiB0aGUgcm9vdCBNT0Ygb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERVdGlsIHsKLQlEVERGYWN0b3J5IGZhY3Rvcnk7Ci0JRUxpc3QgZXh0ZW50OwotCVJlc291cmNlIHJlc291cmNlOwotCURUREZpbGUgZHRkRmlsZTsKLQlTdHJpbmcgZHRkTW9kZWxGaWxlOwotCWJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQotCXByaXZhdGUgSGFzaHRhYmxlIGV4dGVybmFsRFRETW9kZWxzID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgSGFzaHRhYmxlIHBlUG9vbCA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIEhhc2h0YWJsZSBlbGVtZW50UG9vbCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByaXZhdGUgRFREUGFyc2VyIHBhcnNlcjsKLQotCXByaXZhdGUgVmVjdG9yIGVycm9yTXNncyA9IG5ldyBWZWN0b3IoKTsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSB1dGlsQ2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlzdGF0aWMgcHVibGljIERURFV0aWwgZ2V0RFREVXRpbEZvcihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJRFREVXRpbCB1dGlsID0gKERURFV0aWwpIHV0aWxDYWNoZS5nZXQoZmlsZW5hbWUpOwotCQlpZiAodXRpbCA9PSBudWxsKSB7Ci0JCQl1dGlsID0gbmV3IERURFV0aWwoKTsKLQkJCXV0aWxDYWNoZS5wdXQoZmlsZW5hbWUsIHV0aWwpOwotCQl9Ci0KLQkJcmV0dXJuIHV0aWw7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgdXJpKSB7Ci0JCXBhcnNlKG5ldyBSZXNvdXJjZVNldEltcGwoKSwgdXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgcGFyc2UgdG8gcGFyc2UgYSAuZHRkIGZpbGUgaW50byBhIE1PRiBvYmplY3QgbW9kZWwgVGhpcyBpcwotCSAqIGludm9rZWQgYnkgdGhlIFJlZ2lzdGVyZWREVERQYXJzZXIgdGhhdCByZWdpc3RlcnMgdGhpcyBwYXJzZXIgZm9yIE1PRgotCSAqIHRvIHVzZSBhZ2FpbnN0IHRoZSAuZHRkIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmVkIG5hbWUgb2YgYSAuZHRkIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyBmaWxlbmFtZSkgewotCQkvLyBHZXQgdGhlIGR0ZCBuYW1lIGZyb20gdGhlIGZpbGUgbmFtZQotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlbmFtZSk7Ci0JCUlQYXRoIGlQYXRoID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZyBkdGROYW1lID0gaVBhdGgudG9GaWxlKCkuZ2V0TmFtZSgpOwotCi0JCXRyeSB7Ci0JCQlwYXJzZXIgPSBuZXcgRFREUGFyc2VyKGZhbHNlKTsKLQkJCWlmIChleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JCQkJcGFyc2VyLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci0JCQl9Ci0JCQlwYXJzZXIucGFyc2UoZmlsZW5hbWUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQl9Ci0KLQkJZHRkTW9kZWxGaWxlID0gZmlsZW5hbWU7Ci0KLQkJZmFjdG9yeSA9IERUREZhY3RvcnlJbXBsLmluc3RhbmNlKCk7Ci0KLQkJZXh0ZW50ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQotCQlkdGRGaWxlID0gZmFjdG9yeS5jcmVhdGVEVERGaWxlKCk7Ci0JCWV4dGVudC5hZGQoZHRkRmlsZSk7Ci0KLQkJZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCi0JCXBvcHVsYXRlRFREKHJlc291cmNlcywgZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci0JfQotCi0JcHVibGljIERUREZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRQRVBvb2woKSB7Ci0JCXJldHVybiBwZVBvb2w7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50UG9vbCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRQb29sOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIGV4dGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRleHBhbmRFbnRpdHlSZWZlcmVuY2VzKGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQl0aGlzLmV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBoYXMgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kZWxEaXJ0eSgpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiByZXNvdXJjZS5pc01vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIC5kdGQgZmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmUoKSB7Ci0JCXRyeSB7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTYXZlIG1vZGVsIGV4Y2VwdGlvbiAiICsgZXgpOyAvLyROT04tTkxTLTEkCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhdmVBcyhTdHJpbmcgbmV3RmlsZW5hbWUpIHsKLQkJcmVzb3VyY2Uuc2V0VVJJKFVSSS5jcmVhdGVVUkkobmV3RmlsZW5hbWUpKTsKLQkJYm9vbGVhbiBvayA9IHNhdmUoKTsKLQotCQlpZiAob2spIHsKLQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKG5ld0ZpbGVuYW1lKTsKLQkJCUlQYXRoIGlQYXRoID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlTdHJpbmcgZHRkTmFtZSA9IGlQYXRoLnRvRmlsZSgpLmdldE5hbWUoKTsKLQotCQkJZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYXZlRFRERmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQl0cnkgewotCQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpLCB0cnVlKTsKLQkJCURURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKHRydWUpOwotCQkJcHJpbnRlci52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0KLQkJCVN0cmluZyBzID0gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCQkJcHcucHJpbnRsbihzKTsKLQkJCXB3LmNsb3NlKCk7Ci0JCX0KLQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREVERTb3VyY2UoYm9vbGVhbiBpbmNsdWRlRXJyb3IpIHsKLQkJcmV0dXJuIGR0ZEZpbGUudW5wYXJzZShpbmNsdWRlRXJyb3IpOyAvLyB0cnVlID0gaW5jbHVkZSBlcnJvciBsaW5lcwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIERURAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURURChSZXNvdXJjZVNldCByZXNvdXJjZXMsIGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQlWZWN0b3IgZHRkTGlzdCA9IHBhcnNlci5nZXREVERMaXN0KCk7Ci0KLQkJLy8gY3JlYXRlIFhNSU1vZGVsIGZvciB0aGUgaW5jbHVkZWQgRFREcwotCQlpZiAoZHRkTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoIWV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJCQlmb3IgKGludCBpID0gZHRkTGlzdC5zaXplKCkgLSAxOyBpID4gMDsgaS0tKSB7Ci0JCQkJCURURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdChpKTsKLQkJCQkJbG9hZEluY2x1ZGVkRFREKHJlc291cmNlcywgZHRkKTsKLQkJCQl9Ci0KLQkJCQlEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoMCk7Ci0JCQkJcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBkdGQsIGR0ZEZpbGUpOyAvLyBwb3B1bGF0ZSB0aGUgbWFpbgotCQkJCQkJCQkJCQkJCQkvLyBEVEQKLQkJCQkvLyB2YWxpZGF0ZVdpdGhNb2RlbChkdGQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IGR0ZExpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KGkpOwotCQkJCQlwb3B1bGF0ZURURChyZXNvdXJjZXMsIGR0ZCwgZHRkRmlsZSk7Ci0JCQkJCS8vIHZhbGlkYXRlV2l0aE1vZGVsKGR0ZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBpbnN0YW5jZSB1bmlxdWUgdG8gdGhpcyBEVERVdGlsIGZpbGUgdGhhdCByZXByZXNlbnRzIGFuCi0JLy8gZXh0ZXJuYWxseSBsb2FkZWQgZHRkICh3aWxsIGNyZWF0ZSBpZiBvbmUgZG9lc24ndCBleGlzdCB5ZXQpCi0JcHVibGljIEV4dGVybmFsRFRETW9kZWwgZ2V0RXh0ZXJuYWxEVERNb2RlbChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHsKLQkJaWYgKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gRGVmYXVsdE1zZ0xvZ2dlci53cml0ZSgiRXh0ZXJuYWwgRFREIG5hbWU6ICIgKyB1cmkpOwotCi0JCWlmIChleHRlcm5hbERURE1vZGVscy5jb250YWluc0tleSh1cmkpKSB7Ci0JCQlyZXR1cm4gKEV4dGVybmFsRFRETW9kZWwpIGV4dGVybmFsRFRETW9kZWxzLmdldCh1cmkpOwotCQl9Ci0JCWVsc2UgewotCQkJRXh0ZXJuYWxEVERNb2RlbCBleHRNb2RlbCA9IG5ldyBFeHRlcm5hbERURE1vZGVsKCk7Ci0JCQlpZiAoZXh0TW9kZWwubG9hZE1vZGVsKHJlc291cmNlcywgdXJpKSkgewotCQkJCWV4dGVybmFsRFRETW9kZWxzLnB1dCh1cmksIGV4dE1vZGVsKTsKLQkJCQlyZXR1cm4gZXh0TW9kZWw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gbG9hZCB4bWlNb2RlbHMgZm9yIGluY2x1ZGVkIERURHMKLQlwcml2YXRlIHZvaWQgbG9hZEluY2x1ZGVkRFREKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREIGR0ZCkgewotCQlFeHRlcm5hbERURE1vZGVsIGV4dE1vZGVsID0gZ2V0RXh0ZXJuYWxEVERNb2RlbChyZXNvdXJjZXMsIGR0ZC5nZXROYW1lKCkpOwotCQlpZiAoZXh0TW9kZWwgIT0gbnVsbCkgewotCQkJLy8gbm93IGZpbGwgb3VyIGhhc2ggdGFibGVzIGZvciBlbGVtZW50cyBhbmQgcGFyYW1ldGVyIGVudGl0aWVzCi0JCQkvLyBzbyB0aGF0IHdlIGtub3cgd2hhdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBvdXIgbWFpbiBkdGQKLQkJCURUREZpbGUgZmlsZSA9IGV4dE1vZGVsLmdldEV4dGVybmFsRFRERmlsZSgpOwotCQkJQ29sbGVjdGlvbiBlbGVtZW50TGlzdCA9IGZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJCUNvbGxlY3Rpb24gZW50aXR5TGlzdCA9IGZpbGUubGlzdERUREVudGl0eSgpOwotCi0JCQlJdGVyYXRvciBpID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCURURE9iamVjdCBvYmplY3QgPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkJCQllbGVtZW50UG9vbC5wdXQoZ2V0QmFzZU5hbWUob2JqZWN0KSwgb2JqZWN0KTsKLQkJCX0KLQotCQkJaSA9IGVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCURUREVudGl0eSBlbnRpdHkgPSAoRFRERW50aXR5KSBpLm5leHQoKTsKLQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQkJCQkJcGVQb29sLnB1dChnZXRCYXNlTmFtZShlbnRpdHkpLCBlbnRpdHkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIERURAotCSAqIAotCSAqIDEpIHdpbGwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIERURCBNb2Ygb2JqZWN0IGZvciBFbnRpdHlEZWNsLAotCSAqIE5vdGF0aW9uRGVjbCBhbmQgRWxlbWVudERlY2wgZGVjbGFyYXRpb25zIGR1cmluZyB0aGUgMXN0IHBhc3MgMikgRHVyaW5nCi0JICogdGhlIDJuZCBwYXNzLCBpdCB3aWxsIGFkZCB0aGUgY29udGVudE1vZGVsIGFuZCBBdHRsaXN0IHRvIGFsbAotCSAqIEVsZW1lbnREZWNsLgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURURChSZXNvdXJjZVNldCByZXNvdXJjZXMsIERURCBkdGQsIERUREZpbGUgZEZpbGUpIHsKLQkJRFRETW9kZWxCdWlsZGVyIG1vZGVsQnVpbGRlciA9IG5ldyBEVERNb2RlbEJ1aWxkZXIocmVzb3VyY2VzLCB0aGlzLCBkdGQsIGRGaWxlKTsKLQotCQltb2RlbEJ1aWxkZXIudmlzaXREVEQoZHRkKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGVtcHR5RXJyb3JNZXNzYWdlcygpIHsKLQkJZXJyb3JNc2dzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXJyb3JNZXNzYWdlKEVycm9yTWVzc2FnZSBlcnJvcikgewotCQlpbnQgdmVjdG9yU2l6ZSA9IGVycm9yTXNncy5zaXplKCk7Ci0JCWJvb2xlYW4gYWRkID0gdHJ1ZTsKLQotCQlpZiAodmVjdG9yU2l6ZSAhPSAwKSB7Ci0JCQlpbnQgaW5kZXggPSAwOwotCi0JCQl3aGlsZSAoYWRkID09IHRydWUgJiYgaW5kZXggPCB2ZWN0b3JTaXplKSB7Ci0JCQkJaWYgKCgoRXJyb3JNZXNzYWdlKSBlcnJvck1zZ3MuZWxlbWVudEF0KGluZGV4KSkuZXF1YWxzKGVycm9yKSkgewotCQkJCQlhZGQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGFkZCkgewotCQkJZXJyb3JNc2dzLmFkZEVsZW1lbnQoZXJyb3IpOwotCQl9Ci0JfQotCi0JcHVibGljIFZlY3RvciBnZXRFcnJvcnMoKSB7Ci0JCXJldHVybiBlcnJvck1zZ3M7Ci0JfQotCi0JLy8gVGhpcyBnZXRzIHRoZSBuYW1lIHdpdGhvdXQgYW55IHBzZXVkbyBuYW1lc3BhY2UgcHJlZml4Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoRFRET2JqZWN0IG9iaikgewotCQlyZXR1cm4gZ2V0TmFtZShvYmosIG51bGwpOwotCX0KLQotCS8vIFRoaXMgZ2V0cyB0aGUgbmFtZSB3aXRoIHBzZXVkbyBuYW1lc3BhY2UgcHJlZml4ZXMgaWYgZHRkRmlsZSBpcyBub3QKLQkvLyBudWxsCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShEVERPYmplY3Qgb2JqLCBEVERGaWxlIGR0ZEZpbGUpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob2JqIGluc3RhbmNlb2YgRFRERW50aXR5KSB7Ci0JCQlEVERFbnRpdHkgZW50aXR5ID0gKERUREVudGl0eSkgb2JqOwotCQkJaWYgKGR0ZEZpbGUgIT0gbnVsbCAmJiAhZW50aXR5LmdldERUREZpbGUoKS5lcXVhbHMoZHRkRmlsZSkpIHsKLQkJCQluYW1lID0gbmV3IFBhdGgoZW50aXR5LmdldERUREZpbGUoKS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lICs9ICIlIiArICgoRFRERW50aXR5KSBvYmopLmdldE5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIG9iajsKLQkJCWlmIChkdGRGaWxlICE9IG51bGwgJiYgIWVsZW1lbnQuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkgewotCQkJCW5hbWUgPSBuZXcgUGF0aChlbGVtZW50LmdldERUREZpbGUoKS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lICs9ICgoRFRERWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudENvbnRlbnQpIHsKLQkJCXJldHVybiAoKERUREVsZW1lbnRDb250ZW50KSBvYmopLmdldENvbnRlbnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3JvdXBUeXBlKGludCBncm91cEtpbmQsIGludCBvY2N1cnJlbmNlKSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQotCQlzd2l0Y2ggKGdyb3VwS2luZCkgewotCQkJY2FzZSBEVERHcm91cEtpbmQuU0VRVUVOQ0UgOgotCQkJCXR5cGUgPSAiRFREU2VxdWVuY2UiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIERUREdyb3VwS2luZC5DSE9JQ0UgOgotCQkJCXR5cGUgPSAiRFREQ2hvaWNlIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQkJdHlwZSArPSBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChvY2N1cnJlbmNlKTsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZShpbnQgb2NjdXJyZW5jZSkgewotCQlTdHJpbmcgdHlwZSA9ICJEVERSZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCi0JCXR5cGUgKz0gZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXgob2NjdXJyZW5jZSk7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChpbnQgb2NjdXJyZW5jZSkgewotCQlyZXR1cm4gIigiICsgKGNoYXIpIG9jY3VycmVuY2UgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcblN0YXJ0aW5nIC4uLiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGFyZ3MubGVuZ3RoICE9IDEpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInVzYWdlOiBEdGRVdGlsIGlucHV0ZmlsZS5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWphdmEuaW8uRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShhcmdzWzBdKTsKLQotCQlTdHJpbmcgZHRkRmlsZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZHRkRmlsZU5hbWUgPSBpbnB1dEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0KLQkJU3RyaW5nIGR0ZE1vZGVsTmFtZSA9IGR0ZEZpbGVOYW1lOwotCi0JCWlmIChEVERDb25zdGFudHMuRFREX0VYVEVOU0lPTi5lcXVhbHMobmV3IFBhdGgoZHRkRmlsZU5hbWUpLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLQkJCWR0ZE1vZGVsTmFtZSA9IG5ldyBQYXRoKGR0ZEZpbGVOYW1lKS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQkJfQotCQlEVERVdGlsIGQybSA9IG5ldyBEVERVdGlsKCk7Ci0JCS8vIFRPRE86IGZpeCBwb3J0Ci0JCS8vIGQybS5wYXJzZShkdGRGaWxlTmFtZSk7Ci0JCXRyeSB7Ci0JCQlkMm0uc2F2ZUFzKGR0ZE1vZGVsTmFtZSArICIuIiArIERURENvbnN0YW50cy5EVERfWE1JX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRocm93biBkdXJpbmcgbW9kZWwgc2F2ZTogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJEb25lLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCBnZXRQYXRoKCkgewotCQlQYXRoIGN1cnJlbnREVERQYXRoID0gbmV3IFBhdGgoZHRkTW9kZWxGaWxlKTsKLQkJaWYgKGN1cnJlbnREVERQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJcmV0dXJuIGN1cnJlbnREVERQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBEVERVdGlsIGdldERURFV0aWxGb3JHZW4oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JLy8KLQkvLyBEVERVdGlsIHV0aWwgPSAoRFREVXRpbCkgdXRpbENhY2hlLmdldChmaWxlbmFtZSk7Ci0JLy8gaWYgKHV0aWwgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gdXRpbCA9IG5ldyBEVERVdGlsKCk7Ci0JLy8gdXRpbENhY2hlLnB1dChmaWxlbmFtZSwgdXRpbCk7Ci0JLy8gfQotCS8vICAgIAotCS8vIHJldHVybiB1dGlsOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHBhcnNlR2VuKFN0cmluZyB1cmkpIHsKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCS8vIHBhcnNlKG5ldyBSZXNvdXJjZVNldEltcGwoKSwgdXJpKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBJbnZva2UgcGFyc2UgdG8gcGFyc2UgYSAuZHRkIGZpbGUgaW50byBhIE1PRiBvYmplY3QgbW9kZWwKLQkvLyAqIFRoaXMgaXMgaW52b2tlZCBieSB0aGUgUmVnaXN0ZXJlZERURFBhcnNlciB0aGF0IHJlZ2lzdGVycyB0aGlzIHBhcnNlcgotCS8vIGZvciBNT0YgdG8gdXNlCi0JLy8gKiBhZ2FpbnN0IHRoZSAuZHRkIHR5cGUKLQkvLyAqIEBwYXJhbSBmaWxlbmFtZSAtIHRoZSBmdWxseSBxdWFsaWZlZCBuYW1lIG9mIGEgLmR0ZCBmaWxlCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwYXJzZUdlbihSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyBmaWxlbmFtZSkgewotCS8vCi0JLy8gLy8gR2V0IHRoZSBkdGQgbmFtZSBmcm9tIHRoZSBmaWxlIG5hbWUKLQkvLyBQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlbmFtZSk7Ci0JLy8gSVBhdGggaVBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkvLyBTdHJpbmcgZHRkTmFtZSA9IGlQYXRoLnRvRmlsZSgpLmdldE5hbWUoKTsKLQkvLwotCS8vCi0JLy8gdHJ5Ci0JLy8gewotCS8vIHBhcnNlciA9IG5ldyBEVERQYXJzZXIoZmFsc2UpOwotCS8vIGlmIChleHBhbmRFbnRpdHlSZWZlcmVuY2VzKQotCS8vIHsKLQkvLyBwYXJzZXIuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLQkvLyB9Ci0JLy8gcGFyc2VyLnBhcnNlKGZpbGVuYW1lKTsKLQkvLyB9Ci0JLy8gY2F0Y2goSU9FeGNlcHRpb24gZXgpCi0JLy8gewotCS8vIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGR0ZE1vZGVsRmlsZSA9IGZpbGVuYW1lOwotCS8vCi0JLy8KLQkvLyBmYWN0b3J5ID0gRFRERmFjdG9yeUltcGwuaW5zdGFuY2UoKTsKLQkvLwotCS8vCi0JLy8gZXh0ZW50ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkvLwotCS8vCi0JLy8gZHRkRmlsZSA9IGZhY3RvcnkuY3JlYXRlRFRERmlsZSgpOwotCS8vIGV4dGVudC5hZGQoZHRkRmlsZSk7Ci0JLy8KLQkvLwotCS8vIGR0ZEZpbGUuc2V0TmFtZShkdGROYW1lKTsKLQkvLwotCS8vCi0JLy8gcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERmFjdG9yeSBnZXRGYWN0b3J5R2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGZhY3Rvcnk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREZpbGUgZ2V0RFRERmlsZUdlbigpIHsKLQkvLwotCS8vIHJldHVybiBkdGRGaWxlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0UEVQb29sR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIHBlUG9vbDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldEVsZW1lbnRQb29sR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGVsZW1lbnRQb29sOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBFTGlzdCBnZXRFeHRlbnRHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZXh0ZW50OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHNldFJlc291cmNlR2VuKFJlc291cmNlIHJlc291cmNlKSB7Ci0JLy8KLQkvLyB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlR2VuKFJlc291cmNlIHJlc291cmNlKSB7Ci0JLy8KLQkvLyByZXR1cm4gcmVzb3VyY2U7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgc2V0ZXhwYW5kRW50aXR5UmVmZXJlbmNlc0dlbihib29sZWFuCi0JLy8gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCS8vCi0JLy8gdGhpcy5leHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogUmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGhhcyBiZWVuIG1vZGlmaWVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc01vZGVsRGlydHlHZW4oKSB7Ci0JLy8KLQkvLyBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcmV0dXJuIHJlc291cmNlLmlzTW9kaWZpZWQoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIFNhdmUgdGhlIC5kdGQgZmlsZQotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZUdlbigpIHsKLQkvLwotCS8vIHRyeQotCS8vIHsKLQkvLyByZXNvdXJjZS5zYXZlKCk7Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIGNhdGNoIChFeGNlcHRpb24gZXgpCi0JLy8gewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2F2ZSBtb2RlbCBleGNlcHRpb24gIiArIGV4KTsKLQkvLyBleC5wcmludFN0YWNrVHJhY2UoKTsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIHNhdmVBc0dlbihTdHJpbmcgbmV3RmlsZW5hbWUpIHsKLQkvLwotCS8vIHJlc291cmNlLnNldFVSSShuZXdGaWxlbmFtZSk7Ci0JLy8gYm9vbGVhbiBvayA9IHNhdmUoKTsKLQkvLwotCS8vCi0JLy8gaWYgKG9rKQotCS8vIHsKLQkvLyBQYXRoIHBhdGggPSBuZXcgUGF0aChuZXdGaWxlbmFtZSk7Ci0JLy8gSVBhdGggaVBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkvLyBTdHJpbmcgZHRkTmFtZSA9IGlQYXRoLnRvRmlsZSgpLmdldE5hbWUoKTsKLQkvLwotCS8vCi0JLy8gZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCS8vIH0KLQkvLyByZXR1cm4gb2s7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZURUREZpbGVHZW4oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JLy8KLQkvLyBib29sZWFuIHJlc3VsdD10cnVlOwotCS8vIHRyeQotCS8vIHsKLQkvLyBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSksdHJ1ZSk7Ci0JLy8gRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIodHJ1ZSk7Ci0JLy8gcHJpbnRlci52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBzID0gcHJpbnRlci5nZXRCdWZmZXIoKS5nZXROYW1lKCkudG9TdHJpbmcoKTsKLQkvLyBwdy5wcmludGxuKHMpOwotCS8vIHB3LmNsb3NlKCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JLy8gewotCS8vIHJlc3VsdCA9IGZhbHNlOwotCS8vIH0KLQkvLyByZXR1cm4gcmVzdWx0OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBTdHJpbmcgZ2V0RFREU291cmNlR2VuKGJvb2xlYW4gaW5jbHVkZUVycm9yKSB7Ci0JLy8KLQkvLyByZXR1cm4gZHRkRmlsZS51bnBhcnNlKGluY2x1ZGVFcnJvcik7IC8vIHRydWUgPSBpbmNsdWRlIGVycm9yIGxpbmVzCi0JLy8gfQotCS8vIC8qKgotCS8vICogQ3JlYXRlIE1PRiBvYmplY3RzIGZyb20gRFRECi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURUREdlbihSZXNvdXJjZVNldCByZXNvdXJjZXMsIGJvb2xlYW4KLQkvLyBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JLy8KLQkvLyBWZWN0b3IgZHRkTGlzdCA9IHBhcnNlci5nZXREVERMaXN0KCk7Ci0JLy8KLQkvLwotCS8vIC8vIGNyZWF0ZSBYTUlNb2RlbCBmb3IgdGhlIGluY2x1ZGVkIERURHMKLQkvLyBpZiAoIGR0ZExpc3Quc2l6ZSgpID4gMCkKLQkvLyB7Ci0JLy8gaWYgKCFleHBhbmRFbnRpdHlSZWZlcmVuY2VzKQotCS8vIHsKLQkvLyBmb3IgKGludCBpPWR0ZExpc3Quc2l6ZSgpIC0gMTsgaSA+IDA7IGktLSkKLQkvLyB7Ci0JLy8gRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KGkpOwotCS8vIGxvYWRJbmNsdWRlZERURChyZXNvdXJjZXMsIGR0ZCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoMCk7Ci0JLy8gcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBkdGQsIGR0ZEZpbGUpOyAvLyBwb3B1bGF0ZSB0aGUgbWFpbiBEVEQKLQkvLyAvLyB2YWxpZGF0ZVdpdGhNb2RlbChkdGQpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIGZvciAoaW50IGkgPSBkdGRMaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotCS8vIHsKLQkvLyBEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoaSk7Ci0JLy8gcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBkdGQsIGR0ZEZpbGUpOwotCS8vIC8vIHZhbGlkYXRlV2l0aE1vZGVsKGR0ZCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEV4dGVybmFsRFRETW9kZWwgZ2V0RXh0ZXJuYWxEVERNb2RlbEdlbihSZXNvdXJjZVNldAotCS8vIHJlc291cmNlcywgU3RyaW5nIHVyaSkgewotCS8vCi0JLy8gaWYgKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpCi0JLy8gewotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQkvLyAgICAgICAKLQkvLyBEZWZhdWx0TXNnTG9nZ2VyLndyaXRlKCJFeHRlcm5hbCBEVEQgbmFtZTogIiArIHVyaSk7Ci0JLy8KLQkvLwotCS8vIGlmIChleHRlcm5hbERURE1vZGVscy5jb250YWluc0tleSh1cmkpKQotCS8vIHsKLQkvLyByZXR1cm4gKEV4dGVybmFsRFRETW9kZWwpIGV4dGVybmFsRFRETW9kZWxzLmdldCh1cmkpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIEV4dGVybmFsRFRETW9kZWwgZXh0TW9kZWwgPSBuZXcgRXh0ZXJuYWxEVERNb2RlbCgpOwotCS8vIGlmIChleHRNb2RlbC5sb2FkTW9kZWwocmVzb3VyY2VzLCB1cmkpKQotCS8vIHsKLQkvLyBleHRlcm5hbERURE1vZGVscy5wdXQodXJpLCBleHRNb2RlbCk7Ci0JLy8gcmV0dXJuIGV4dE1vZGVsOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgbG9hZEluY2x1ZGVkRFRER2VuKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREIGR0ZCkgewotCS8vCi0JLy8gRXh0ZXJuYWxEVERNb2RlbCBleHRNb2RlbCA9IGdldEV4dGVybmFsRFRETW9kZWwocmVzb3VyY2VzLAotCS8vIGR0ZC5nZXROYW1lKCkpOwotCS8vIGlmIChleHRNb2RlbCAhPSBudWxsKQotCS8vIHsKLQkvLyAvLyBub3cgZmlsbCBvdXIgaGFzaCB0YWJsZXMgZm9yIGVsZW1lbnRzIGFuZCBwYXJhbWV0ZXIgZW50aXRpZXMKLQkvLyAvLyBzbyB0aGF0IHdlIGtub3cgd2hhdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBvdXIgbWFpbiBkdGQKLQkvLyBEVERGaWxlIGZpbGUgPSBleHRNb2RlbC5nZXRFeHRlcm5hbERUREZpbGUoKTsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRMaXN0ID0gZmlsZS5saXN0RFRERWxlbWVudCgpOwotCS8vIENvbGxlY3Rpb24gZW50aXR5TGlzdCA9IGZpbGUubGlzdERUREVudGl0eSgpOwotCS8vCi0JLy8KLQkvLyBJdGVyYXRvciBpID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERURE9iamVjdCBvYmplY3QgPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkvLyBlbGVtZW50UG9vbC5wdXQoZ2V0QmFzZU5hbWUob2JqZWN0KSwgb2JqZWN0KTsKLQkvLyB9Ci0JLy8gICAgICAKLQkvLyBpID0gZW50aXR5TGlzdC5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFRERW50aXR5IGVudGl0eSA9IChEVERFbnRpdHkpIGkubmV4dCgpOwotCS8vIGlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkvLyB7Ci0JLy8gcGVQb29sLnB1dChnZXRCYXNlTmFtZShlbnRpdHkpLCBlbnRpdHkpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIERURAotCS8vICoKLQkvLyAqIDEpIHdpbGwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIERURCBNb2Ygb2JqZWN0IGZvciBFbnRpdHlEZWNsLAotCS8vIE5vdGF0aW9uRGVjbAotCS8vICogYW5kIEVsZW1lbnREZWNsIGRlY2xhcmF0aW9ucyBkdXJpbmcgdGhlIDFzdCBwYXNzCi0JLy8gKiAyKSBEdXJpbmcgdGhlIDJuZCBwYXNzLCBpdCB3aWxsIGFkZCB0aGUgY29udGVudE1vZGVsIGFuZCBBdHRsaXN0IHRvCi0JLy8gYWxsCi0JLy8gKiBFbGVtZW50RGVjbC4KLQkvLyAqCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURUREdlbihSZXNvdXJjZVNldCByZXNvdXJjZXMsIERURCBkdGQsIERUREZpbGUKLQkvLyBkRmlsZSkgewotCS8vCi0JLy8gRFRETW9kZWxCdWlsZGVyIG1vZGVsQnVpbGRlciA9IG5ldyBEVERNb2RlbEJ1aWxkZXIocmVzb3VyY2VzLCB0aGlzLAotCS8vIGR0ZCwgZEZpbGUpOwotCS8vCi0JLy8KLQkvLyBtb2RlbEJ1aWxkZXIudmlzaXREVEQoZHRkKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBlbXB0eUVycm9yTWVzc2FnZXNHZW4oKSB7Ci0JLy8KLQkvLyBlcnJvck1zZ3MucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvck1lc3NhZ2VHZW4oRXJyb3JNZXNzYWdlIGVycm9yKSB7Ci0JLy8KLQkvLyBpbnQgdmVjdG9yU2l6ZSA9IGVycm9yTXNncy5zaXplKCk7Ci0JLy8gYm9vbGVhbiBhZGQgPSB0cnVlOwotCS8vCi0JLy8KLQkvLyBpZiAodmVjdG9yU2l6ZSAhPSAwKQotCS8vIHsKLQkvLyBpbnQgaW5kZXggPSAwOwotCS8vCi0JLy8KLQkvLyB3aGlsZSAoYWRkID09IHRydWUgJiYgaW5kZXggPCB2ZWN0b3JTaXplKQotCS8vIHsKLQkvLyBpZiAoKChFcnJvck1lc3NhZ2UpIGVycm9yTXNncy5lbGVtZW50QXQoaW5kZXgpKS5lcXVhbHMoZXJyb3IpKQotCS8vIHsKLQkvLyBhZGQgPWZhbHNlOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIGluZGV4Kys7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGlmIChhZGQpCi0JLy8gewotCS8vIGVycm9yTXNncy5hZGRFbGVtZW50KGVycm9yKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIFZlY3RvciBnZXRFcnJvcnNHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZXJyb3JNc2dzOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRFRER2VuKCkgewotCS8vCi0JLy8gU3RyaW5nIHRlbXBEVERGaWxlPWdldFBhdGgoKS50b09TU3RyaW5nKCkrInRlbXBWYWxpZGF0aW5nRmlsZU5hbWUuZHRkIjsKLQkvLyB0cnkKLQkvLyB7Ci0JLy8gc2F2ZURUREZpbGUodGVtcERUREZpbGUpOwotCS8vCi0JLy8KLQkvLyBwYXJzZXIgPSBuZXcgRFREUGFyc2VyKGZhbHNlKTsKLQkvLyBpZiAoRmlsZVV0aWxpdHkuZmlsZUV4aXN0cyh0ZW1wRFRERmlsZSkpCi0JLy8gewotCS8vIHBhcnNlci5wYXJzZSh0ZW1wRFRERmlsZSk7Ci0JLy8gfQotCS8vIFZlY3RvciBkdGRMaXN0ID0gcGFyc2VyLmdldERURExpc3QoKTsKLQkvLyBpZiAoIGR0ZExpc3Quc2l6ZSgpID4gMCkKLQkvLyB7Ci0JLy8gLy8gcmVzZXQgdGhlIGVycm9ycyBhbmQgdXBkYXRlIHdoYXQgd2UgaGF2ZSBpbiB0aGUgZWxlbWVudCBwb29sCi0JLy8gZW1wdHlFcnJvck1lc3NhZ2VzKCk7Ci0JLy8gdXBkYXRlRWxlbWVudEhhc2h0YWJsZSgpOwotCS8vCi0JLy8KLQkvLyAvLyBUT0RPOiBkbyB3ZSBqdXN0IHZhbGlkYXRlIHRoZSBjdXJyZW50IG9uZT8KLQkvLyB2YWxpZGF0ZVdpdGhNb2RlbCgoRFREKWR0ZExpc3QuZWxlbWVudEF0KDApKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGNhdGNoKElPRXhjZXB0aW9uIGV4KQotCS8vIHsKLQkvLyBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JLy8gRmlsZVV0aWxpdHkuZGVsZXRlKHRlbXBEVERGaWxlKTsKLQkvLyB9Ci0JLy8gRmlsZVV0aWxpdHkuZGVsZXRlKHRlbXBEVERGaWxlKTsKLQkvLwotCS8vCi0JLy8gcmV0dXJuIGR0ZEZpbGUuaXNQYXJzZUVycm9yKCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVXaXRoTW9kZWxHZW4oRFREIGR0ZCkgewotCS8vCi0JLy8gRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCS8vIHdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCS8vCi0JLy8KLQkvLyBpZiAoIGUgaW5zdGFuY2VvZiBFbnRpdHlEZWNsICkKLQkvLyB7Ci0JLy8gRW50aXR5RGVjbCBlbnRpdHkgPSAoRW50aXR5RGVjbCkgZTsKLQkvLyBFcnJvck1lc3NhZ2UgZXJyTXNnID0gZW50aXR5LmdldEVycm9yTWVzc2FnZSgpOwotCS8vIGlmICggZXJyTXNnIT0gbnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gLy8gZHRkRmlsZS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCApCi0JLy8gewotCS8vIEVsZW1lbnREZWNsIGVsZW0gPSAoRWxlbWVudERlY2wpIGU7Ci0JLy8gRXJyb3JNZXNzYWdlIGVyck1zZyA9IGVsZW0uZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JLy8gRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpCi0JLy8gZ2V0RWxlbWVudFBvb2woKS5nZXQoZWxlbS5nZXROb2RlTmFtZSgpKTsKLQkvLwotCS8vCi0JLy8gaWYgKCBlcnJNc2chPSBudWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyB9Ci0JLy8gY2hlY2tGb3JNaXNzaW5nRWxlbWVudFJlZmVyZW5jZXMoZHRkZWxlbWVudCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgTm90YXRpb25EZWNsICkKLQkvLyB7Ci0JLy8gTm90YXRpb25EZWNsIG5vdGF0aW9uID0gKE5vdGF0aW9uRGVjbCkgZTsKLQkvLyBFcnJvck1lc3NhZ2UgZXJyTXNnID0gbm90YXRpb24uZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JLy8gaWYgKCBlcnJNc2chPSBudWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgQXR0bGlzdCApCi0JLy8gewotCS8vIEF0dGxpc3QgYXR0TGlzdCA9IChBdHRsaXN0KSBlOwotCS8vIEVycm9yTWVzc2FnZSBlcnJNc2cgPSBhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpOwotCS8vIGlmICggZXJyTXNnIT0gbnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGNoZWNrRm9yRHVwbGljYXRlSURBdHRyaWJ1dGUoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbGVtZW50SGFzaHRhYmxlR2VuKCkgewotCS8vCi0JLy8gZWxlbWVudFBvb2wuY2xlYXIoKTsKLQkvLyBDcmVhdGVMaXN0SXRlbXMgaXRlbXNIZWxwZXIgPSBuZXcgQ3JlYXRlTGlzdEl0ZW1zKGR0ZEZpbGUpOwotCS8vCi0JLy8KLQkvLyBWZWN0b3IgYWxsRWxlbWVudHMgPSBpdGVtc0hlbHBlci5nZXRFbGVtZW50cygpOwotCS8vIC8vIGdvIHRocm91Z2ggYWxsIHRoZSBkdGRGaWxlcyBhbmQgbGlzdCB0aGUgZWxlbWVudHMKLQkvLyBpbnQgbnVtRWxlbWVudHMgPSBhbGxFbGVtZW50cy5zaXplKCk7Ci0JLy8KLQkvLwotCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkrKykKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIGFsbEVsZW1lbnRzLmVsZW1lbnRBdChpKTsKLQkvLyBlbGVtZW50UG9vbC5wdXQoZ2V0QmFzZU5hbWUoZWxlbWVudCksIGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbnRpdHlIYXNodGFibGVHZW4oKSB7Ci0JLy8KLQkvLyB1cGRhdGVIYXNoVGFibGUocGVQb29sLCBkdGRGaWxlLmxpc3REVERFbnRpdHkoKSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGFzaFRhYmxlR2VuKEhhc2h0YWJsZSBoLCBDb2xsZWN0aW9uIGR0ZE9iamVjdHMpIHsKLQkvLwotCS8vIGguY2xlYXIoKTsKLQkvLyBJdGVyYXRvciBpID0gZHRkT2JqZWN0cy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIG5hbWUgPSAiIjsKLQkvLyBEVERPYmplY3QgbyA9IChEVERPYmplY3QpIGkubmV4dCgpOwotCS8vIG5hbWUgPSBnZXRCYXNlTmFtZShvKTsKLQkvLyBoLnB1dChuYW1lLG8pOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRCYXNlTmFtZUdlbihEVERPYmplY3Qgb2JqKSB7Ci0JLy8KLQkvLyByZXR1cm4gZ2V0TmFtZShvYmosIG51bGwpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE5hbWVHZW4oRFRET2JqZWN0IG9iaiwgRFRERmlsZSBkdGRGaWxlKSB7Ci0JLy8KLQkvLyBTdHJpbmcgbmFtZSA9ICIiOwotCS8vIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbnRpdHkpCi0JLy8gewotCS8vIERUREVudGl0eSBlbnRpdHkgPSAoRFRERW50aXR5KSBvYmo7Ci0JLy8gaWYgKGR0ZEZpbGUgIT0gbnVsbCAmJgotCS8vICFlbnRpdHkuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkKLQkvLyB7Ci0JLy8gbmFtZSA9IG5ldyBQYXRoKGVudGl0eS5nZXREVERGaWxlKCkuZ2V0TmFtZSgpKS5sYXN0U2VnbWVudCgpICsgIjogIjsKLQkvLyB9Ci0JLy8gbmFtZSArPSAiJSIgKyAoKERUREVudGl0eSlvYmopLmdldE5hbWUoKSArICI7IjsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudCkKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIG9iajsKLQkvLyBpZiAoZHRkRmlsZSAhPSBudWxsICYmCi0JLy8gIWVsZW1lbnQuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkKLQkvLyB7Ci0JLy8gbmFtZSA9IG5ldyBQYXRoKGVsZW1lbnQuZ2V0RFRERmlsZSgpLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKSArICI6ICI7Ci0JLy8gfQotCS8vIG5hbWUgKz0gKChEVERFbGVtZW50KW9iaikuZ2V0TmFtZSgpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50Q29udGVudCkKLQkvLyB7Ci0JLy8gcmV0dXJuICgoRFRERWxlbWVudENvbnRlbnQpIG9iaikuZ2V0Q29udGVudE5hbWUoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIG5hbWU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JNaXNzaW5nRWxlbWVudFJlZmVyZW5jZXNHZW4oRFRERWxlbWVudCBlbGVtZW50KQotCS8vIHsKLQkvLwotCS8vIFN0cmluZyBkdGRTdHJpbmcgPSBudWxsOwotCS8vIGlmICggZWxlbWVudCA9PSBudWxsICkKLQkvLyByZXR1cm47Ci0JLy8KLQkvLwotCS8vIFZlY3RvciBlbGVtZW50UmVmcyA9IG5ldyBWZWN0b3IoKTsKLQkvLyBmaW5kRWxlbWVudFJlZmVyZW5jZXMoZWxlbWVudC5nZXRDb250ZW50KCksZWxlbWVudFJlZnMpOwotCS8vCi0JLy8KLQkvLyBFbnVtZXJhdGlvbiBlbiA9IGVsZW1lbnRSZWZzLmVsZW1lbnRzKCk7Ci0JLy8gd2hpbGUgKGVuLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBTdHJpbmcgZWxlbWVudFJlZk5hbWUgPSAiIjsKLQkvLyBEVERPYmplY3QgZHRkT2JqZWN0ID0gKERURE9iamVjdCkgZW4ubmV4dEVsZW1lbnQoKTsKLQkvLwotCS8vCi0JLy8gaWYgKCBkdGRPYmplY3QgaW5zdGFuY2VvZiBEVERFbGVtZW50KQotCS8vIHsKLQkvLyBlbGVtZW50UmVmTmFtZSA9ICgoRFRERWxlbWVudClkdGRPYmplY3QpLmdldE5hbWUoKTsKLQkvLyBpZiAoIGdldEVsZW1lbnRQb29sKCkuZ2V0KGVsZW1lbnRSZWZOYW1lKSA9PSBudWxsKQotCS8vIHsKLQkvLyBpZiAoZHRkU3RyaW5nID09IG51bGwpCi0JLy8gewotCS8vIGR0ZFN0cmluZyA9IGdldERURFNvdXJjZShmYWxzZSk7Ci0JLy8gfQotCS8vIFN0cmluZyBlcnJvck1zZyA9ICJFbGVtZW50IFwiIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgIlwiLCByZWZlcnMgdG8KLQkvLyB1bmRlY2xhcmVkIGVsZW1lbnQgIgotCS8vICsgIlwiIiArIGVsZW1lbnRSZWZOYW1lICsgIlwiLCBpbiBjb250ZW50IG1vZGVsLlxuIjsKLQkvLyBFcnJvck1lc3NhZ2UgZHRkRXJyb3IgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKGVycm9yTXNnKTsKLQkvLyBTb3VyY2VMb2NhdGlvbkhlbHBlci5MaW5lQ29sdW1uIGxpbmVDb2x1bW4gPQotCS8vIFNvdXJjZUxvY2F0aW9uSGVscGVyLm9mZnNldFRvTGluZUNvbHVtbihkdGRTdHJpbmcsCi0JLy8gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvckxpbmUobGluZUNvbHVtbi5nZXRMaW5lKCkpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yQ29sdW1uKGxpbmVDb2x1bW4uZ2V0Q29sdW1uKCkpOwotCS8vIGFkZEVycm9yTWVzc2FnZShkdGRFcnJvcik7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluZEVsZW1lbnRSZWZlcmVuY2VzR2VuKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQsCi0JLy8gVmVjdG9yIHJlc3VsdCkgewotCS8vCi0JLy8KLQkvLyBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyByZXN1bHQuYWRkRWxlbWVudCgoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KWNvbnRlbnQpLmdldFJlZmVyZW5jZWRFbGVtZW50KCkpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkKLQkvLyB7Ci0JLy8gcmVzdWx0LmFkZEVsZW1lbnQoKChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KWNvbnRlbnQpLmdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KQotCS8vIHsKLQkvLyBEVERHcm91cENvbnRlbnQgZ3JvdXAgPSAoRFRER3JvdXBDb250ZW50KWNvbnRlbnQ7Ci0JLy8gRUxpc3QgY29udGVudHMgPSBncm91cC5nZXRDb250ZW50KCk7Ci0JLy8gSXRlcmF0b3IgaSA9IGNvbnRlbnRzLml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBmaW5kRWxlbWVudFJlZmVyZW5jZXMoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSwgcmVzdWx0KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGNoZWNrRm9yRHVwbGljYXRlSURBdHRyaWJ1dGVHZW4oKSB7Ci0JLy8KLQkvLyBTdHJpbmcgZHRkU3RyaW5nID0gbnVsbDsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRzID0gZHRkRmlsZS5saXN0RFRERWxlbWVudCgpOwotCS8vIEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIGkubmV4dCgpOwotCS8vIEl0ZXJhdG9yIGsgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpLml0ZXJhdG9yKCk7Ci0JLy8gYm9vbGVhbiBzYXcxc3RJRCA9IGZhbHNlOwotCS8vIHdoaWxlIChrLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFREQXR0cmlidXRlIGF0dHIgPSAoRFREQXR0cmlidXRlKSBrLm5leHQoKTsKLQkvLyBEVERUeXBlIGRUeXBlID0gYXR0ci5nZXREVERUeXBlKCk7Ci0JLy8gaWYgKGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKQotCS8vIHsKLQkvLyBpZiAoICgoRFREQmFzaWNUeXBlKWRUeXBlKS5nZXRLaW5kKCkuaW50VmFsdWUoKSA9PSBEVERCYXNpY1R5cGVLaW5kLklEKQotCS8vIHsKLQkvLyBpZiAoc2F3MXN0SUQpCi0JLy8gewotCS8vIGlmIChkdGRTdHJpbmcgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gZHRkU3RyaW5nID0gZ2V0RFREU291cmNlKGZhbHNlKTsKLQkvLyB9Ci0JLy8gU3RyaW5nIGVyck1zZyA9IERURFBsdWdpbi5nZXREVERTdHJpbmcoIl9FUlJPUl9EVVBfSURfQVRUUklCVVRFXzEiKTsKLQkvLyBlcnJNc2cgKz0gYXR0ci5nZXROYW1lKCkgKwotCS8vIERURFBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yIik7Ci0JLy8gICAgICAgICAgICAgIAotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyBTb3VyY2VMb2NhdGlvbkhlbHBlci5MaW5lQ29sdW1uIGxpbmVDb2x1bW4gPQotCS8vIFNvdXJjZUxvY2F0aW9uSGVscGVyLm9mZnNldFRvTGluZUNvbHVtbihkdGRTdHJpbmcsCi0JLy8gYXR0ci5nZXRTdGFydE9mZnNldCgpKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvckxpbmUobGluZUNvbHVtbi5nZXRMaW5lKCkpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yQ29sdW1uKGxpbmVDb2x1bW4uZ2V0Q29sdW1uKCkpOwotCS8vIGR0ZEVycm9yLnNldE9iamVjdChhdHRyKTsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IpOwotCS8vIC8vIGR0ZEZpbGUuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYXcxc3RJRCA9IHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRHcm91cFR5cGVHZW4oaW50IGdyb3VwS2luZCwgaW50IG9jY3VycmVuY2UpCi0JLy8gewotCS8vCi0JLy8gU3RyaW5nIHR5cGUgPSBudWxsOwotCS8vCi0JLy8KLQkvLyBzd2l0Y2ggKGdyb3VwS2luZCkKLQkvLyB7Ci0JLy8gY2FzZSBEVERHcm91cEtpbmQuU0VRVUVOQ0U6Ci0JLy8gdHlwZSA9ICJEVERTZXF1ZW5jZSI7Ci0JLy8gYnJlYWs7Ci0JLy8gY2FzZSBEVERHcm91cEtpbmQuQ0hPSUNFOgotCS8vIHR5cGUgPSAiRFREQ2hvaWNlIjsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHR5cGUgKz0gZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXgob2NjdXJyZW5jZSk7Ci0JLy8gcmV0dXJuIHR5cGU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZUdlbihpbnQgb2NjdXJyZW5jZSkgewotCS8vCi0JLy8gU3RyaW5nIHR5cGUgPSAiRFREUmVmZXJlbmNlIjsKLQkvLyB0eXBlICs9IGdldFJlcGVhdGFibGVUeXBlU3VmZml4KG9jY3VycmVuY2UpOwotCS8vIHJldHVybiB0eXBlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFJlcGVhdGFibGVUeXBlU3VmZml4R2VuKGludCBvY2N1cnJlbmNlKSB7Ci0JLy8KLQkvLyByZXR1cm4gIigiICsgKGNoYXIpb2NjdXJyZW5jZSArICIpIjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbWFpbkdlbihTdHJpbmdbXSBhcmdzKSB7Ci0JLy8KLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU3RhcnRpbmcgLi4uIik7Ci0JLy8KLQkvLwotCS8vIGlmIChhcmdzLmxlbmd0aCAhPSAxKQotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidXNhZ2U6IER0ZFV0aWwgaW5wdXRmaWxlLmR0ZCIpOwotCS8vCi0JLy8KLQkvLyBqYXZhLmlvLkZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBkdGRGaWxlTmFtZSA9ICIiOwotCS8vIHRyeQotCS8vIHsKLQkvLyBkdGRGaWxlTmFtZSA9IGlucHV0RmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JLy8gfQotCS8vIGNhdGNoKElPRXhjZXB0aW9uIGV4KQotCS8vIHt9Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBkdGRNb2RlbE5hbWUgPSBkdGRGaWxlTmFtZTsKLQkvLwotCS8vCi0JLy8gaWYgKERURENvbnN0YW50cy5EVERfRVhURU5TSU9OLmVxdWFscyhuZXcKLQkvLyBQYXRoKGR0ZEZpbGVOYW1lKS5nZXRGaWxlRXh0ZW5zaW9uKCkpKQotCS8vIHsKLQkvLyBkdGRNb2RlbE5hbWU9IG5ldwotCS8vIFBhdGgoZHRkRmlsZU5hbWUpLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCS8vIH0KLQkvLyBEVERVdGlsIGQybSA9IG5ldyBEVERVdGlsKCk7Ci0JLy8gLy8gVE9ETzogZml4IHBvcnQKLQkvLyAvLyBkMm0ucGFyc2UoZHRkRmlsZU5hbWUpOwotCS8vIHRyeQotCS8vIHsKLQkvLyBkMm0uc2F2ZUFzKGR0ZE1vZGVsTmFtZSArICIuIiArIERURENvbnN0YW50cy5EVERfWE1JX0VYVEVOU0lPTik7Ci0JLy8gfQotCS8vIGNhdGNoIChFeGNlcHRpb24gZSkKLQkvLyB7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gdGhyb3duIGR1cmluZyBtb2RlbCBzYXZlOiAiICsgZSk7Ci0JLy8gfQotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZS4iKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIGdldFBhdGhHZW4oKSB7Ci0JLy8KLQkvLyBQYXRoIGN1cnJlbnREVERQYXRoID0gbmV3IFBhdGgoZHRkTW9kZWxGaWxlKTsKLQkvLyBpZiAoY3VycmVudERURFBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCS8vIHsKLQkvLyByZXR1cm4gY3VycmVudERURFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JLy8gfQotCS8vICAgIAotCS8vIHJldHVybiBuZXcgUGF0aCgiIik7Ci0JLy8gfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTY1N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRFREVmlzaXRvciB7Ci0KLQlwdWJsaWMgRFREVmlzaXRvcigpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREZpbGUoRFRERmlsZSBmaWxlKSB7Ci0JCUNvbGxlY3Rpb24gbm90YXRpb25zID0gZmlsZS5saXN0RFRETm90YXRpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbm90YXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVEROb3RhdGlvbigoRFRETm90YXRpb24pIGkubmV4dCgpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gZW50aXRpZXMgPSBmaWxlLmxpc3REVERFbnRpdHkoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZW50aXRpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERUREVudGl0eSgoRFRERW50aXR5KSBpLm5leHQoKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIG9iamVjdHMgPSBmaWxlLmxpc3REVERFbGVtZW50QW5kRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERPYmplY3Qgb2JqZWN0ID0gKERURE9iamVjdCkgaS5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJCXZpc2l0RFRERWxlbWVudCgoRFRERWxlbWVudCkgb2JqZWN0KTsKLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQllbHNlIHsKLQkJCQl2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBvYmplY3QpOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVEROb3RhdGlvbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW50aXR5KERUREVudGl0eSBlbnRpdHkpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnQoRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JCXZpc2l0RFRERWxlbWVudENvbnRlbnQoZWxlbWVudC5nZXRDb250ZW50KCkpOwotCQl2aXNpdERUREF0dHJpYnV0ZUxpc3QoZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHkpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInZpc2l0RFRERWxlbWVudENvbnRlbnQgOiAiICsgY29udGVudCk7Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQl2aXNpdERUREVtcHR5Q29udGVudCgoRFRERW1wdHlDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREQW55Q29udGVudCkgewotCQkJdmlzaXREVERBbnlDb250ZW50KChEVERBbnlDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJdmlzaXREVERQQ0RhdGFDb250ZW50KChEVERQQ0RhdGFDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFJlcGVhdGFibGVDb250ZW50KSB7Ci0JCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJCXZpc2l0RFRER3JvdXBDb250ZW50KChEVERHcm91cENvbnRlbnQpIGNvbnRlbnQpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmlzaXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KTsKLQkJCX0gLy8gZW5kIG9mIGVsc2UKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJvY2N1cnJlbmNlOiAiICsKLQkJCS8vIChjaGFyKSgoRFREUmVwZWF0YWJsZUNvbnRlbnQpY29udGVudCkuZ2V0T2NjdXJyZW5jZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW1wdHlDb250ZW50KERUREVtcHR5Q29udGVudCBkdGRFbXB0eUNvbnRlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBFTVBUWSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREQW55Q29udGVudChEVERBbnlDb250ZW50IGR0ZEFueUNvbnRlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBBTlkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURFBDRGF0YUNvbnRlbnQoRFREUENEYXRhQ29udGVudCBwY0RhdGFDb250ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogUENEQVRBIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERHcm91cENvbnRlbnQoRFRER3JvdXBDb250ZW50IGdyb3VwQ29udGVudCkgewotCQlpZiAoZ3JvdXBDb250ZW50LmdldEdyb3VwS2luZCgpLmdldFZhbHVlKCkgPT0gRFRER3JvdXBLaW5kLlNFUVVFTkNFKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IFNlcXVlbmNlIik7Ci0JCX0KLQkJZWxzZSAvLyBpZiAoY29udGVudGdldEdyb3VwS2luZCgpID09IERUREdyb3VwS2luZC5DSE9JQ0UpCi0JCXsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogQ2hvaWNlIik7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIGdyb3VwQ29udGVudHMgPSBncm91cENvbnRlbnQuZ2V0Q29udGVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBncm91cENvbnRlbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVERFbGVtZW50Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBlbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERBdHRyaWJ1dGVMaXN0KExpc3QgYXR0cnMpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQl2aXNpdERUREF0dHJpYnV0ZSgoRFREQXR0cmlidXRlKSBpdGVyLm5leHQoKSk7Ci0JCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREZpbGVHZW4oRFRERmlsZSBmaWxlKSB7Ci0KLQkJQ29sbGVjdGlvbiBub3RhdGlvbnMgPSBmaWxlLmxpc3REVEROb3RhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBub3RhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERURE5vdGF0aW9uKChEVEROb3RhdGlvbikgaS5uZXh0KCkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBlbnRpdGllcyA9IGZpbGUubGlzdERUREVudGl0eSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbnRpdGllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRERW50aXR5KChEVERFbnRpdHkpIGkubmV4dCgpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gb2JqZWN0cyA9IGZpbGUubGlzdERUREVsZW1lbnRBbmREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURURE9iamVjdCBvYmplY3QgPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQkJdmlzaXREVERFbGVtZW50KChEVERFbGVtZW50KSBvYmplY3QpOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCWVsc2UgewotCQkJCXZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG9iamVjdCk7Ci0JCQl9IC8vIGVuZCBvZiBpZiAoKQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRETm90YXRpb25HZW4oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVudGl0eUdlbihEVERFbnRpdHkgZW50aXR5KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50R2VuKERUREVsZW1lbnQgZWxlbWVudCkgewotCi0JCXZpc2l0RFRERWxlbWVudENvbnRlbnQoZWxlbWVudC5nZXRDb250ZW50KCkpOwotCQl2aXNpdERUREF0dHJpYnV0ZUxpc3QoZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlR2VuKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ2aXNpdERUREVsZW1lbnRDb250ZW50IDogIiArIGNvbnRlbnQpOwotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJdmlzaXREVERFbXB0eUNvbnRlbnQoKERUREVtcHR5Q29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREFueUNvbnRlbnQpIHsKLQkJCXZpc2l0RFREQW55Q29udGVudCgoRFREQW55Q29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCXZpc2l0RFREUENEYXRhQ29udGVudCgoRFREUENEYXRhQ29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERSZXBlYXRhYmxlQ29udGVudCkgewotCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQl2aXNpdERUREdyb3VwQ29udGVudCgoRFRER3JvdXBDb250ZW50KSBjb250ZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCXZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpc2l0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgY29udGVudCk7Ci0JCQl9IC8vIGVuZCBvZiBlbHNlCi0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigib2NjdXJyZW5jZTogIiArCi0JCQkvLyAoY2hhcikoKERURFJlcGVhdGFibGVDb250ZW50KWNvbnRlbnQpLmdldE9jY3VycmVuY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbXB0eUNvbnRlbnRHZW4oRFRERW1wdHlDb250ZW50IGR0ZEVtcHR5Q29udGVudCkgewotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogRU1QVFkiKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERBbnlDb250ZW50R2VuKERUREFueUNvbnRlbnQgZHRkQW55Q29udGVudCkgewotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogQU5ZIik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREUENEYXRhQ29udGVudEdlbihEVERQQ0RhdGFDb250ZW50IHBjRGF0YUNvbnRlbnQpIHsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IFBDREFUQSIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREdyb3VwQ29udGVudEdlbihEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50KSB7Ci0KLQkJaWYgKGdyb3VwQ29udGVudC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpID09IERUREdyb3VwS2luZC5TRVFVRU5DRSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBTZXF1ZW5jZSIpOwotCQl9Ci0JCWVsc2UgLy8gaWYgKGNvbnRlbnRnZXRHcm91cEtpbmQoKSA9PSBEVERHcm91cEtpbmQuQ0hPSUNFKQotCQl7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IENob2ljZSIpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBncm91cENvbnRlbnRzID0gZ3JvdXBDb250ZW50LmdldENvbnRlbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZ3JvdXBDb250ZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEdlbihEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudEdlbihEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREF0dHJpYnV0ZUxpc3RHZW4oTGlzdCBhdHRycykgewotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJdmlzaXREVERBdHRyaWJ1dGUoKERUREF0dHJpYnV0ZSkgaXRlci5uZXh0KCkpOwotCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREF0dHJpYnV0ZUdlbihEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRXh0ZXJuYWxEVERNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0V4dGVybmFsRFRETW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwNTM2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRXh0ZXJuYWxEVERNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotCi0KLS8qKgotICogTG9hZCBhbm90aGVyIERURCBtb2RlbCAtIHVzZSB3aGVuIHRoZXJlIGlzIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzIGZyb20KLSAqIGFub3RoZXIgbW9kZWwKLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsRFRETW9kZWwgewotCURUREZpbGUgZHRkRmlsZSA9IG51bGw7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxEVERNb2RlbCgpIHsKLQl9Ci0KLQlwdWJsaWMgRFRERmlsZSBnZXRFeHRlcm5hbERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIERURCBtb2RlbCBzcGVjaWZpZWQgYnkgdGhlIHVyaSBlLmcuCi0JICogZmlsZTpDOi9lY2xpcHNlL2V4YW1wbGVzL3B1cmNoYXNlb3JkZXIuZHRkCi0JICovCi0JcHVibGljIGJvb2xlYW4gbG9hZE1vZGVsKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIHVyaSkgewotCQlib29sZWFuIHJjID0gdHJ1ZTsKLQotCQlpZiAodXJpID09IG51bGwgfHwgdXJpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCS8vIHRvZG8uLi4gSW52ZXN0aWdhdGUgd2h5IHdlIGNhbiBub3QgY3JlYXRlIGEgbmV3IERURFV0aWwgdG8gbG9hZAotCQkJLy8gdGhlIGV4dGVybmFsCi0JCQkvLyB3aXRob3V0IGJyZWFraW5nIHRoZSBidnQgdGVzdCBidWNrZXQgb24gdGhlIG9hZ2lzIGNhc2VzLgotCQkJLy8gQXJlIGRlcGVuZGluZyBvbiBtb2YncyBidWlsdCBpbiBjYWNoaW5nIHZpYQotCQkJLy8gcmVzb3VyY2VzLmxvYWQodXJpKT8KLQkJCS8vCi0JCQlVUkkgdXJpT2JqID0gVVJJLmNyZWF0ZVVSSSh1cmkpOwotCQkJUmVzb3VyY2UgciA9IHJlc291cmNlcy5jcmVhdGVSZXNvdXJjZSh1cmlPYmopOwotCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJci5sb2FkKG9wdGlvbnMpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJRFRERmlsZSBjdXJyZW50RmlsZSA9IChEVERGaWxlKSAoKFJlc291cmNlKSBpLm5leHQoKSkuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQkJU3RyaW5nIGN1cnJlbnRVUkkgPSBjdXJyZW50RmlsZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJCS8vIG5vdGUgOiBtb2Ygc3RvcmVzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHVyaSB0aGFuIHRoZSBvbmUgd2UKLQkJCQkvLyBwYXNzZWQgaW4gdG8gcmVzb3VyY2VzLmxvYWQodXJpKQotCQkJCS8vIEluIHRoZSAnZmlsZTonIHByb3RvY29sIGNhc2UsIHRoZSBjYWxsCi0JCQkJLy8gcmVzb3VyY2UubG9hZCgiZmlsZTpEOlx4LmR0ZCIpIHdpbGwgc3RvcmUgYSByZXNvdXJjZSB3aXRoCi0JCQkJLy8gdXJpICJEOlx4LmR0ZCIuCi0JCQkJLy8gVGhpcyBpcyB3aHkgd2UgdXNlICdlbmRzd2l0aCgpJyBpbnN0ZWFkIG9mICdlcXVhbHMoKScgdG8KLQkJCQkvLyBjb21wYXJlLgotCQkJCWlmICh1cmkuZW5kc1dpdGgoY3VycmVudFVSSSkpIHsKLQkJCQkJZHRkRmlsZSA9IGN1cnJlbnRGaWxlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZHRkRmlsZSA9PSBudWxsKSB7Ci0JCQkJcmMgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyYyA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL0RURC5jYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL0RURC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOTcyNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9EVEQuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsMzgxMiArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQ1DQotICAgIF93cml0dGVuICAgCSJSb3NlIDcuNS4wMTAzLjE5MjAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZHRkIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIklETCINCi0JICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVkNTczMC04NTBiLTExZTEtMDAwMC0wMDVjZjQ2OTFjNGM6MSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgImR0ZCIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLndzdC5kdGQiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRFREIikpKQ0KLSAgICBxdWlkICAgICAgIAkiMzg1N0IxQzAwMjkzIg0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJEVERFbGVtZW50Q29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWQ1NzMwLTg1MGItMTFlMS0wMDAxLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0JFQUNGMDIxMyINCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpDQotCShvYmplY3QgQ2xhc3MgIkRUREdyb3VwQ29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDAwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0JFQUVGMDIzMiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDAxLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUQ5MjAzNjMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERSZXBlYXRhYmxlQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFENEMwMUQxIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZ3JvdXBLaW5kIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkM5RUMwMTg5Ig0KLQkJICAgIHR5cGUgICAgICAgCSJEVERHcm91cEtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZDQTU1MDIxNiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERBdHRyaWJ1dGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YxNTkwMURBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTIzODQ3MjAzOUQiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21tZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgzOURDOUEwMTNCIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWZhdWx0S2luZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RTE0NEJGMDI2MSINCi0JCSAgICB0eXBlICAgICAgIAkiRFRERGVmYXVsdEtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0NERDMDNBRCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlZmF1bHRWYWx1ZVN0cmluZyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDctMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5NkI5QkJGMDA2QiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRURE9jY3VycmVuY2VUeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDgtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdDQzE5QUYwMDdEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfE9ORT00OSANCi18T1BUSU9OQUw9NjMgT05FX09SX01PUkU9NDMgWkVST19PUl9NT1JFPTQyDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRUREVsZW1lbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwOS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwYS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YwQUYwMkE4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkI4MzAyOUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21tZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwYi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgzOURDODEwMDYyIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERW1wdHlDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFCNDcwMzdBIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBQkYzMDMyNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREFueUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwZS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUI1MDAzMDQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwZi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFCRUUwMjA3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREUENEYXRhQ29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDEwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQjVDMDEzNSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDExLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUJFOTAyNzgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDEyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQjdEMDAxMCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDEzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUQ4QzAzQUEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERSZXBlYXRhYmxlQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFENEMwMUQxIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERSZXBlYXRhYmxlQ29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBRDRDMDFEMSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QURCNzAzQzAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib2NjdXJyZW5jZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3Q0MxOEE5MDE0OCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSlVTVF9PTkU9IC0xICBPTkVfT1JfTU9SRT00MyBPUFRJT05BTD02MyBaRVJPX09SX01PUkU9NDIiDQotCQkgICAgdHlwZSAgICAgICAJIkRURE9jY3VycmVuY2VUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTlBRjAwN0QiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERmlsZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE3LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlCMDhFMDE4RiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE4LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjA3RjAxMTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE5LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODM5REJFRjAxMkIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcnNlRXJyb3IiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDFhLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODhDOTk1RjAyNUIiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERGVmYXVsdEtpbmQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDREQzAzQUQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiSU1QTElFRD0xIFJFUVVJUkVEPTIgRklYRUQ9MyBOT0ZJWEVEPTQiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVERCYXNpY1R5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDY0RjAwREEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YyODAwMzE1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtpbmQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDAzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0UxNDY4QTAwMTYiDQotCQkgICAgdHlwZSAgICAgICAJIkRUREJhc2ljVHlwZUtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0OTA1MDIyQyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbnVtZXJhdGlvblR5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDY2ODAzMDYiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YyODEwMzAyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFRW51bSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNDczRTkwMUQ0IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2luZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RTE0NkFDMDNCOCINCi0JCSAgICB0eXBlICAgICAgIAkiRFRERW51bUdyb3VwS2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ5QjIwMUFEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREJhc2ljVHlwZUtpbmQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwNy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDkwNTAyMkMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiTk9ORT0wIENEQVRBPTEgSUQ9MiBJRFJFRj0zIElEUkVGUz00IEVOVElUWT01IEVOVElUSUVTPTYgTk1UT0tFTj03IE5NVE9LRU5TPTgiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbnVtR3JvdXBLaW5kIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDgtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ5QjIwMUFEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIk5BTUVfVE9LRU5fR1JPVVA9MSBOT1RBVElPTl9HUk9VUD0yIg0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFRER3JvdXBLaW5kIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDktMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkNBNTUwMjE2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlNFUVVFTkNFPTEgQ0hPSUNFPTIiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVEROb3RhdGlvbiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBhLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMEVGMDBDOSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBiLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjBFMzAyMzQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkI4NTAxMTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21tZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwYy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgzOURDMEEwMjRDIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeXN0ZW1JRCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMTAyMDM5NyINCi0JCSAgICB0eXBlICAgICAgIAkic3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljSUQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBlLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDEwRTAxOEMiDQotCQkgICAgdHlwZSAgICAgICAJInN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbnRpdHkiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwZi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YwRTcwMUVBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCODYwMzA0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MzlEQzM3MDA4RSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1ldGVyRW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQxM0MwMTdFIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVudGl0eUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDE5RDAwODMiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJEVERFeHRlcm5hbEVudGl0eSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDE0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMUY4MDNFMSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDE1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDMyNDAwRjMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDE5RDAwODMiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeXN0ZW1JRCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMkU1MDE2MSINCi0JCSAgICB0eXBlICAgICAgIAkic3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljSUQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDAxLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDJFQzAxRjciDQotCQkgICAgdHlwZSAgICAgICAJInN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERJbnRlcm5hbEVudGl0eSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDAyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMkJBMDI2RSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDAzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDMyQjAzMkUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDE5RDAwODMiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMkNCMDI2OCINCi0JCSAgICB0eXBlICAgICAgIAkic3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4NTI4N0NBMDE2MyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA2LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjBEMTAwNzYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkI4QTAyODciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwNy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODUyOTAwRTAxMjciDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwOC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1MjkwNDQwMTFCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUmVwZWF0YWJsZUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDRDMDFEMSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiWE1MU2NoZW1hRGVmaW5lZFR5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwOS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODlGMEM2RDAxMEUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Tk9ORT0tMQ0KLXxTVFJJTkc9MQ0KLXxCT09MRUFOPTINCi18RkxPQVQ9Mw0KLXxET1VCTEU9NA0KLXxERUNJTUFMPTUNCi18VElNRUlOU1RBTlQ9Ng0KLXxUSU1FRFVSQVRJT049Nw0KLXxSRUNVUlJJTkdJTlNUQU5UPTgNCi18QklOQVJZPTkNCi18VVJJPTEwDQotfElOVEVHRVI9MTENCi18REFURT0xMg0KLXxUSU1FPTEzDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRURENvbnRlbnQiDQotCSAgICBxdWlkICAgICAgIAkiMzlGRTJCNUUwMkRFIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBhLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0JFQjZGMDA1RCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwYi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdDQkVCNzAwMDZEIg0KLQkJICAgIGxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJncm91cCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3Q0JFQjcwMDBBQiINCi0JCSAgICBsYWJlbCAgICAgIAkiZ3JvdXAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERHcm91cENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUVGMDIzMiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwZC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUMwRTAwQ0QiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZWxlbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBQzBGMDM5RiINCi0JCSAgICBsYWJlbCAgICAgIAkiZWxlbWVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwZi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFDMEYwM0E5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDEwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBRjExMDAxQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlbGVtZW50UmVmZXJlbmNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFGMUIwMjA5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlbGVtZW50UmVmZXJlbmNlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQjdEMDAxMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpKQ0KLQkJKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkRWxlbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBRjFCMDIwQSINCi0JCSAgICBsYWJlbCAgICAgIAkicmVmZXJlbmNlZEVsZW1lbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQxQzkwMkRGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDFDQTAzMUQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDFDQTAzMjciDQotCQkgICAgbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDE5RDAwODMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxNi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDM0NDAwRTUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibm90YXRpb24iDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE3LTAwNWNmNDY5MWM0YzoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDM0NTAyMDkiDQotCQkgICAgbGFiZWwgICAgICAJIm5vdGF0aW9uIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRETm90YXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMEVGMDBDOSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE4LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDM0NTAyMTMiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREV4dGVybmFsRW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFGODAzRTEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTktMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg1Mjg5NzkwMDVGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInBhcm1FbnRpdHlSZWYiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFhLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyODk3QzAzNTIiDQotCQkgICAgbGFiZWwgICAgICAJInBhcm1FbnRpdHlSZWYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiDQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI4N0NBMDE2MyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFiLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyODk3QzAzNTMiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFjLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4NTI5NEVCMDI0MyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHlSZWZlcmVuY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFkLTAwNWNmNDY5MWM0YzoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyOTRFRjAzQkIiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eVJlZmVyZW5jZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI5MDBFMDEyNyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI5NEVGMDNCQyINCi0JCSAgICBsYWJlbCAgICAgIAkiZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxZi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODUyOTcyRDAyQ0IiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjAtMDA1Y2Y0NjkxYzRjOjEiKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiZUNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI5NzM2MDI5MSINCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlTmFtZVJlZmVyZW5jZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjk3MzYwMjlCIg0KLQkJICAgIGxhYmVsICAgICAgCSJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDIyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QjY4QTczMDJCOCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QjY4QTc4MDA4NCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREV4dGVybmFsRW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFGODAzRTEiKQ0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhCNjhBNzgwMDhFIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUIwOEUwMThGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEJENDkwODAxM0QiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjYtMDA1Y2Y0NjkxYzRjOjEiKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiZUNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QkQ0OTE0MDEzMCINCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlVHlwZVJlZmVyZW5jZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyNy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhCRDQ5MTQwMTRFIg0KLQkJICAgIGxhYmVsICAgICAgCSJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIiDQotCSAgICBxdWlkICAgICAgIAkiMzlGRTJBOTUwMENDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkE5NTAzMTEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJBOTUwMzFCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5RkUyQkJFMDJEQyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNiINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCQkYwMUIxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUIwOEUwMThGIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTciDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQkJGMDFCQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiDQotCSAgICBxdWlkICAgICAgIAkiMzlGRTMwRDgwMzNFIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMzBEOTAxMDUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QjA4RTAxOEYiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTMwRDkwMTM3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW51bWVyYXRpb25UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDY2ODAzMDYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCSAgICBxdWlkICAgICAgIAkiMzdDQUIwRTYwMTc3Ig0KLQkgICAgdGl0bGUgICAgICAJIk1haW4iDQotCSAgICB6b29tICAgICAgIAk5OA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBOb3RlVmlldyBAMQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMjY0LCAyNDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSgyOTEwLCA2NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAk2NzMNCi0JCQlsYWJlbCAgICAgIAkNCi18RFRERWxlbWVudCdzLCANCi18RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlJ3MsIERUREVudGl0eSdzLCBhbmQgRFRETm90YXRpb24ncyBhcmUgYWRkZWQgdG8gRFRERmlsZSdzIHVzaW5nIHRoZQ0KLXxvd25lZEVsZW1lbnQgcmVsYXRpb25zaGlwDQotfGJldHdlZW4gTU9GTmFtZXNwYWNlDQotfGFuZCBNT0ZPYmplY3QNCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJNzMzDQotCQkgICAgaGVpZ2h0ICAgICAJMzYzKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREludGVybmFsRW50aXR5IiBAMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODI0LCAxODcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTY0NywgMTgxNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREludGVybmFsRW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQyQkEwMjZFIg0KLQkJICAgIHdpZHRoICAgICAgCTM3Mg0KLQkJICAgIGhlaWdodCAgICAgCTEzNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnQiIEAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDU5MiwgMTIwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDQxNywgMTE0NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoNDE3LCAxMjA0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzcxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM2OA0KLQkJICAgIGhlaWdodCAgICAgCTEzNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eUNvbnRlbnQiIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDE0ODgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0DQotCQkJbG9jYXRpb24gICAJKDEzNDEsIDE0MzgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnRpdHlDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxOUQwMDgzIg0KLQkJICAgIHdpZHRoICAgICAgCTM3Ng0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTY0MCkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlANA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNTIwLCAxNjQwKQ0KLQkJCSgxNTIwLCAxNTUwKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDgwLCAxMjE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoMjE4NiwgMTE2NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1ODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI4N0NBMDE2MyINCi0JCSAgICB3aWR0aCAgICAgIAk2MDYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiIEA3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDEyMTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSgxMjcwLCAxMTM3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUwMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJbG9jYXRpb24gICAJKDEyNzAsIDExOTYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1MjUpDQotCQkgICAgd2lkdGggICAgICAJNTE4DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU0NiwgMTM2NikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFDOTAyREYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTQsIDI0NikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFDQTAzMUQiDQotCQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTQ2LCAxMzY2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU0NiwgMTMwNykpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU0LCAyNDYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MywgMTQwNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5MQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJcGN0RGlzdCAgICAJMC42OTkyNDgNCi0JCQkJaGVpZ2h0ICAgICAJMTA0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUNBMDMyNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NDYsIDEzNjYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTQ2LCAxNDI2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAxNDA4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43MjE4MDQNCi0JCQkJaGVpZ2h0ICAgICAJMjINCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDEzDQotCQkgICAgbG9jYXRpb24gICAJKDE5NzgsIDEyNTYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1Mjg5NzkwMDVGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcm1FbnRpdHlSZWYiIEAxNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MDIsIDQ4OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJCWxvY2F0aW9uICAgCSgyMDM4LCAxMjk5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzI4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwYXJtRW50aXR5UmVmIg0KLQkJCQlwY3REaXN0ICAgIAkwLjMwNTQxOQ0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyODk3QzAzNTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMw0KLQkJCSAgICBzdXBwbGllciAgIAlANg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk3OCwgMTI1NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNzcsIDEyNTYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQkJbG9jYXRpb24gICAJKDIxNDEsIDEyMjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyNjQ4NA0KLQkJCQloZWlnaHQgICAgIAkyOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5IiBAMTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjAyLCA0ODgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTg2MiwgMTIxNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjU4OTEwOQ0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyODk3QzAzNTMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMw0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk3OCwgMTI1NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzksIDEyNTYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5DQotCQkJCVBhcmVudF9WaWV3IAlAMTcNCi0JCQkJbG9jYXRpb24gICAJKDE4MjMsIDEzMDkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3NjkyMw0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiIEAyMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0ODgsIDE3NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIwDQotCQkJbG9jYXRpb24gICAJKDEzNTIsIDEzMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJImVOYW1lZEVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0Ig0KLQkJICAgIHdpZHRoICAgICAgCTI5MA0KLQkJICAgIGhlaWdodCAgICAgCTExNQ0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIiBAMjENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDk2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCWxvY2F0aW9uICAgCSg0OTIsIDg2MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiDQotCQkgICAgd2lkdGggICAgICAJMTg2DQotCQkgICAgaGVpZ2h0ICAgICAJMjE4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjBBRjAyQTgiDQotCQkgICAgY2xpZW50ICAgICAJQDMNCi0JCSAgICBzdXBwbGllciAgIAlAMjENCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzEsIDExMzIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU3MSwgMTA2OSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50IiBAMjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNTYwLCA4NjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMw0KLQkJCWxvY2F0aW9uICAgCSgyNDI0LCA4MTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJlTmFtZWRFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCINCi0JCSAgICB3aWR0aCAgICAgIAkyOTANCi0JCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNA0KLQkJICAgIGxvY2F0aW9uICAgCSgyNTYwLCAxMDM2KQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjU2MCwgMTAzNikNCi0JCQkoMjU2MCwgOTIxKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjBFNzAxRUEiDQotCQkgICAgY2xpZW50ICAgICAJQDcNCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY5LCAxMTI1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY5LCAxMDM2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI0KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwRDEwMDc2Ig0KLQkJICAgIGNsaWVudCAgICAgCUA2DQotCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjYxOCwgMTE1MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYxOCwgMTAzNikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVEROb3RhdGlvbiIgQDI3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk5MiwgMTIzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNw0KLQkJCWxvY2F0aW9uICAgCSg4MTcsIDExMjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVEROb3RhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMEVGMDBDOSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQlsb2NhdGlvbiAgIAkoODE3LCAxMTg4KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzcxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM2OA0KLQkJICAgIGhlaWdodCAgICAgCTIzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREV4dGVybmFsRW50aXR5IiBAMjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM0NCwgMTg3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOA0KLQkJCWxvY2F0aW9uICAgCSgxMTU4LCAxNzkzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERXh0ZXJuYWxFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFGODAzRTEiDQotCQkgICAgd2lkdGggICAgICAJMzkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDI5DQotCQkgICAgbG9jYXRpb24gICAJKDk2OSwgMTY3NykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDM0NDAwRTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibm90YXRpb24iIEAzMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjQ3LCAyMDUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAzMA0KLQkJCQlsb2NhdGlvbiAgIAkoODM0LCAxMzkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjAzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitub3RhdGlvbiINCi0JCQkJcGN0RGlzdCAgICAJMC44NzA3MzQNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMzQ1MDIwOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTY5LCAxNjc3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTY5LCAxMzQ3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMg0KLQkJCQlQYXJlbnRfVmlldyAJQDMwDQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxMzg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44Nzc5MzQNCi0JCQkJaGVpZ2h0ICAgICAJNzENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eSIgQDMzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjkNCi0JCQkgICAgbG9jYXRpb24gICAJKC0yNDcsIDIwNSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNA0KLQkJCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJCWxvY2F0aW9uICAgCSgxMDgyLCAxNzg2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMzQ1MDIxMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk2OSwgMTY3NykNCi0JCQkJKDk2OSwgMTgyNykNCi0JCQkJKDExNDksIDE4MjcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTY5LCAxNjc3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0OSwgMTgyNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTEwNCwgMTg1MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODYzNTAxDQotCQkJCWhlaWdodCAgICAgCTI2DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDMyNDAwRjMiDQotCQkgICAgY2xpZW50ICAgICAJQDI4DQotCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc0LCAxNzgxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc0LCAxNjQwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCIgQDM3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ3MiwgODAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzcNCi0JCQlsb2NhdGlvbiAgIAkoMTM0NCwgNzUwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSINCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzOA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDcyLCA5OTApDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE0NzIsIDk5MCkNCi0JCQkoMTQ3MiwgODYyKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjgzMDI5QiINCi0JCSAgICBjbGllbnQgICAgIAlAMw0KLQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTEzMikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzE5LCA5OTApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzgpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjg2MDMwNCINCi0JCSAgICBjbGllbnQgICAgIAlANw0KLQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NTIsIDExMjQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTIsIDk5MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzOCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCOEEwMjg3Ig0KLQkJICAgIGNsaWVudCAgICAgCUA2DQotCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM0NywgMTE1NCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM0NywgOTkwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM4KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREZpbGUiIEA0Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCA0NDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQlsb2NhdGlvbiAgIAkoMTI4MSwgMzY5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQxNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlCMDhFMDE4RiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQlsb2NhdGlvbiAgIAkoMTI4MSwgNDI4KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDI1KQ0KLQkJICAgIHdpZHRoICAgICAgCTQzMg0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEA0Mw0KLQkJICAgIGxvY2F0aW9uICAgCSgzNTQsIDEwNDkpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhCNjhBNzMwMkI4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwIiBANDQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEwOSwgMjA3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QjY4QTc4MDA4NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDQzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM1NCwgMTA0OSkNCi0JCQkJKDM1NCwgMTc4MSkNCi0JCQkJKDExNDksIDE3ODEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzU0LCAxMDQ5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0OSwgMTc4MSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSIgQDQ1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMDksIDIwNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1DQotCQkJCWxvY2F0aW9uICAgCSgyOTYsIDQ1MzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3MzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUiDQotCQkJCXBjdERpc3QgICAgCS0yLjI4MzMzMw0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEI2OEE3ODAwOEUiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANDINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNTQsIDEwNDkpDQotCQkJCSgzNTQsIDQzOSkNCi0JCQkJKDEyNzIsIDQzOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTQsIDEwNDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjcyLCA0MzkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3DQotCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJbG9jYXRpb24gICAJKDEyMDYsIDUwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTU3MTI5DQotCQkJCWhlaWdodCAgICAgCTYxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwN0YwMTE4Ig0KLQkJICAgIGNsaWVudCAgICAgCUA0Mg0KLQkJICAgIHN1cHBsaWVyICAgCUAyMA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0ODgsIDM1NykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4OCwgMjMzKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDQ5DQotCQkgICAgbG9jYXRpb24gICAJKDE0NzIsIDYzOCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkJCRTAyREMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEA1MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5DQotCQkJICAgIGxvY2F0aW9uICAgCSgwLCAtMTYyKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQkJGMDFCMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ5DQotCQkJICAgIHN1cHBsaWVyICAgCUA0Mg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgNjM4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3MiwgNTM5KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDUxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDkNCi0JCQkgICAgbG9jYXRpb24gICAJKDAsIC0xNjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkJCRjAxQkIiDQotCQkJICAgIGNsaWVudCAgICAgCUA0OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDYzOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDczOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTINCi0JCQkJUGFyZW50X1ZpZXcgCUA1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyNiwgNzEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43MzYyNDgNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW51bWVyYXRpb25UeXBlIiBANTMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQ0OCwgNDY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUzDQotCQkJbG9jYXRpb24gICAJKDIxODQsIDM4NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudW1lcmF0aW9uVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0NjY4MDMwNiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANTMNCi0JCQlsb2NhdGlvbiAgIAkoMjE4NCwgNDQ0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTQ2KQ0KLQkJICAgIHdpZHRoICAgICAgCTU0Ng0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4IiBANTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkzOSwgNDQ5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUzMEQ4MDMzRSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDU1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTQNCi0JCQkgICAgbG9jYXRpb24gICAJKC00NjEsIC0zMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMzBEOTAxMDUiDQotCQkJICAgIGNsaWVudCAgICAgCUA1NA0KLQkJCSAgICBzdXBwbGllciAgIAlANDINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MzksIDQ0OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDQsIDQ0OSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAiIEA1Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDYxLCAtMzEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMzBEOTAxMzciDQotCQkJICAgIGNsaWVudCAgICAgCUA1NA0KLQkJCSAgICBzdXBwbGllciAgIAlANTMNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MzksIDQ0OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNzUsIDQ0OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcNCi0JCQkJUGFyZW50X1ZpZXcgCUA1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjEyMCwgNDg2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43Njc4MzcNCi0JCQkJaGVpZ2h0ICAgICAJMzcNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1OA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjBFMzAyMzQiDQotCQkgICAgY2xpZW50ICAgICAJQDI3DQotCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA2NCwgMTExNikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NCwgMTAzNikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCODUwMTE4Ig0KLQkJICAgIGNsaWVudCAgICAgCUAyNw0KLQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk0MSwgMTExNykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTQxLCA5OTApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzgpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMzJCMDMyRSINCi0JCSAgICBjbGllbnQgICAgIAlAMg0KLQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc4MiwgMTgwNSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4MiwgMTY0MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFbGVtZW50RGVmaW5pdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDMzMDAzMkYiDQotCSAgICB0aXRsZSAgICAgIAkiRWxlbWVudERlZmluaXRpb24iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJNDI2DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVtcHR5Q29udGVudCIgQDYxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ2NywgMTQ0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2MQ0KLQkJCWxvY2F0aW9uICAgCSgyODEsIDE0MDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbXB0eUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUI0NzAzN0EiDQotCQkgICAgd2lkdGggICAgICAJMzkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQW55Q29udGVudCIgQDYyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDg4NiwgMTQ0NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Mg0KLQkJCWxvY2F0aW9uICAgCSg3MjgsIDE0MDApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzE2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERBbnlDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCNTAwMzA0Ig0KLQkJICAgIHdpZHRoICAgICAgCTMzNA0KLQkJICAgIGhlaWdodCAgICAgCTExNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFBDRGF0YUNvbnRlbnQiIEA2Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjk4LCAxNDUxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYzDQotCQkJbG9jYXRpb24gICAJKDEwOTksIDE0MDYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzk4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERQQ0RhdGFDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCNUMwMTM1Ig0KLQkJICAgIHdpZHRoICAgICAgCTQxNg0KLQkJICAgIGhlaWdodCAgICAgCTExNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFJlcGVhdGFibGVDb250ZW50IiBANjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg4OCwgMTQ1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJbG9jYXRpb24gICAJKDE1NzIsIDE0MDQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjMyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERSZXBlYXRhYmxlQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDRDMDFEMSINCi0JCSAgICB3aWR0aCAgICAgIAk2NTANCi0JCSAgICBoZWlnaHQgICAgIAkxMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODc4LCAxNjE4KQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxODc4LCAxNjE4KQ0KLQkJCSgxODc4LCAxNTIwKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQXR0cmlidXRlIiBANjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTM2LCA0MDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjYNCi0JCQlsb2NhdGlvbiAgIAkoMTg1NSwgMzI1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTIzODQ3MjAzOUQiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiIEA2Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkyOCwgMzg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY3DQotCQkJbG9jYXRpb24gICAJKDg0NywgMzA5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSINCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERHcm91cENvbnRlbnQiIEA2OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMTkyLCAxNzc2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY4DQotCQkJbG9jYXRpb24gICAJKDE5MzEsIDE3MjcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTIyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERHcm91cENvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFFRjAyMzIiDQotCQkgICAgd2lkdGggICAgICAJNTQwDQotCQkgICAgaGVpZ2h0ICAgICAJMTIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDkyMDM2MyINCi0JCSAgICBjbGllbnQgICAgIAlANjgNCi0JCSAgICBzdXBwbGllciAgIAlANjQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjIxLCAxNzE0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjIxLCAxNjE4KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDY1KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiIEA3MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCAxNzYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcwDQotCQkJbG9jYXRpb24gICAJKDEyMjMsIDE3MTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTMwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1MjkwMEUwMTI3Ig0KLQkJICAgIHdpZHRoICAgICAgCTU0OA0KLQkJICAgIGhlaWdodCAgICAgCTExNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTA0NDAxMUIiDQotCQkgICAgY2xpZW50ICAgICAJQDcwDQotCQkgICAgc3VwcGxpZXIgICAJQDY0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ3NCwgMTcwMikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3NCwgMTYxOCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCIgQDcyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkxMiwgMTA1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcyDQotCQkJbG9jYXRpb24gICAJKDcwNCwgMTAwOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVsZW1lbnRDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIg0KLQkJICAgIHdpZHRoICAgICAgCTQzNA0KLQkJICAgIGhlaWdodCAgICAgCTEyMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEA3Mw0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjg5LCAxMDQ4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQjZGMDA1RCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBANzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDc0DQotCQkJCWxvY2F0aW9uICAgCSgxMjIzLCAxMDAxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjkxOTQyNA0KLQkJCQloZWlnaHQgICAgIAk0OA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUI3MDAwNkQiDQotCQkJICAgIGNsaWVudCAgICAgCUA3Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANzINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyODksIDEwNDgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI5LCAxMDQ4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDc0DQotCQkJCWxvY2F0aW9uICAgCSgxMTg2LCAxMDgzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45NTEzODENCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3DQotCQkJCVBhcmVudF9WaWV3IAlANzQNCi0JCQkJbG9jYXRpb24gICAJKDEyNDYsIDk0MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTEwOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZ3JvdXAiIEA3OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDczDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDI1LCA4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5DQotCQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQkJbG9jYXRpb24gICAJKDI1MzUsIDE3NDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2dyb3VwIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkzNzc0NA0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUI3MDAwQUIiDQotCQkJICAgIGNsaWVudCAgICAgCUA3Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjg5LCAxMDQ4KQ0KLQkJCQkoMjU4NywgMTA0OCkNCi0JCQkJKDI1ODcsIDE3ODUpDQotCQkJCSgyNDYyLCAxNzg1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyODksIDEwNDgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDYyLCAxNzg1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MA0KLQkJCQlQYXJlbnRfVmlldyAJQDc4DQotCQkJCWxvY2F0aW9uICAgCSgyNTI2LCAxODI3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45NDUwODUNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODENCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEwLCAxMjkxKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg5MTAsIDEyOTEpDQotCQkJKDkxMCwgMTExNikpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUJFOTAyNzgiDQotCQkgICAgY2xpZW50ICAgICAJQDYzDQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMTM5NCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTI5MSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgzDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCRjMwMzI3Ig0KLQkJICAgIGNsaWVudCAgICAgCUA2MQ0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ2NiwgMTM5MSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDY2LCAxMjkxKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDgxKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUJFRTAyMDciDQotCQkgICAgY2xpZW50ICAgICAJQDYyDQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODgxLCAxMzg4KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODEsIDEyOTEpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODEpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBREI3MDNDMCINCi0JCSAgICBjbGllbnQgICAgIAlANjQNCi0JCSAgICBzdXBwbGllciAgIAlANzINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTAzLCAxMzkyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTAzLCAxMjkxKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDgxKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IiBAODYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzg0LCAxNzYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDg2DQotCQkJbG9jYXRpb24gICAJKDQ5MiwgMTcxNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1ODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCN0QwMDEwIg0KLQkJICAgIHdpZHRoICAgICAgCTYwMg0KLQkJICAgIGhlaWdodCAgICAgCTExNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ4QzAzQUEiDQotCQkgICAgY2xpZW50ICAgICAJQDg2DQotCQkgICAgc3VwcGxpZXIgICAJQDY0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjUwLCAxNzAzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTAsIDE2MTgpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5IiBAODgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4OCwgMjA2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4OA0KLQkJCWxvY2F0aW9uICAgCSgxMjQ0LCAxOTkyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIHdpZHRoICAgICAgCTUwNg0KLQkJICAgIGhlaWdodCAgICAgCTE2OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEA4OQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDgwLCAxODk4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NEVCMDI0MyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHlSZWZlcmVuY2UiIEA5MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg5DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMTIsIC03MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDkwDQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxODQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzEyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRpdHlSZWZlcmVuY2UiDQotCQkJCXBjdERpc3QgICAgCTAuNjkzNzUwDQotCQkJCWhlaWdodCAgICAgCTIwMQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTRFRjAzQkIiDQotCQkJICAgIGNsaWVudCAgICAgCUA4OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANzANCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0ODAsIDE4OTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDgwLCAxODE3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDkwDQotCQkJCWxvY2F0aW9uICAgCSgxNTM0LCAxODQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC42OTM3NTANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IiBAOTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzEyLCAtNzApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyMCwgMTk1NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuNjg1MzE1DQotCQkJCWhlaWdodCAgICAgCTI2MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTRFRjAzQkMiDQotCQkJICAgIGNsaWVudCAgICAgCUA4OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAODgNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0ODAsIDE4OTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDgwLCAxOTgwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDkzDQotCQkJCWxvY2F0aW9uICAgCSgxNTI0LCAxOTU4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43MzQyMzQNCi0JCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudCIgQDk2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkxMiwgNzUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDk2DQotCQkJbG9jYXRpb24gICAJKDc0NCwgNzAyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JCSAgICB3aWR0aCAgICAgIAkzNTQNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxIiBAOTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCA5MDQpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFDMEUwMENEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVsZW1lbnQiIEA5OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjUsIDk2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5DQotCQkJCVBhcmVudF9WaWV3IAlAOTgNCi0JCQkJbG9jYXRpb24gICAJKDEwMTQsIDg2NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWxlbWVudCINCi0JCQkJcGN0RGlzdCAgICAJMC40Mjg1NzENCi0JCQkJaGVpZ2h0ICAgICAJMTAyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQzBGMDM5RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDk3DQotCQkJICAgIHN1cHBsaWVyICAgCUA5Ng0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMA0KLQkJCQlQYXJlbnRfVmlldyAJQDk4DQotCQkJCWxvY2F0aW9uICAgCSg4NTcsIDg1MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNTk4MjE0DQotCQkJCWhlaWdodCAgICAgCTU2DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTAxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTcNCi0JCQkgICAgbG9jYXRpb24gICAJKC0yNSwgOTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyDQotCQkJCVBhcmVudF9WaWV3IAlAMTAxDQotCQkJCWxvY2F0aW9uICAgCSgxMDE0LCA5NjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNjY0MDYzDQotCQkJCWhlaWdodCAgICAgCTEwMg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUMwRjAzQTkiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Nw0KLQkJCSAgICBzdXBwbGllciAgIAlANzINCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJbG9jYXRpb24gICAJKDg3MSwgOTYyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC42NDA2MjUNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDEwNA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjMsIDExMjIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFGMTEwMDFBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVsZW1lbnRSZWZlcmVuY2UiIEAxMDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkgICAgbG9jYXRpb24gICAJKC05ODEsIDY0MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkJbG9jYXRpb24gICAJKDMyMSwgMTgyNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM0OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWxlbWVudFJlZmVyZW5jZSINCi0JCQkJcGN0RGlzdCAgICAJMC44NDAwMzUNCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdEOUFGMUIwMjA5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA0DQotCQkJICAgIHN1cHBsaWVyICAgCUA4Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMywgMTEyMikNCi0JCQkJKDEyMywgMTc2OSkNCi0JCQkJKDQ4MywgMTc2OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMsIDExMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODMsIDE3NjkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNw0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDIyLCAxNzI2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45NDA1NTkNCi0JCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jZWRFbGVtZW50IiBAMTA4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtOTgxLCA2NDIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5DQotCQkJCVBhcmVudF9WaWV3IAlAMTA4DQotCQkJCWxvY2F0aW9uICAgCSg1MzIsIDY4NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVmZXJlbmNlZEVsZW1lbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNzk5NjUwDQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRjFCMDIwQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNA0KLQkJCSAgICBzdXBwbGllciAgIAlAOTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjMsIDExMjIpDQotCQkJCSgxMjMsIDcyOCkNCi0JCQkJKDczNSwgNzI4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMywgMTEyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDczNSwgNzI4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTANCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQkJbG9jYXRpb24gICAJKDcwMSwgNzczKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45NjY5NjUNCi0JCQkJaGVpZ2h0ICAgICAJNDUNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwQUYwMkE4Ig0KLQkJICAgIGNsaWVudCAgICAgCUA5Ng0KLQkJICAgIHN1cHBsaWVyICAgCUA2Nw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkyMywgNjkwKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjMsIDQ3MCkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQXR0cmlidXRlIiBAMTEyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4ODgsIDc1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMTINCi0JCQlsb2NhdGlvbiAgIAkoMTYxMiwgNjU3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU1Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkJICAgIHdpZHRoICAgICAgCTU3MA0KLQkJICAgIGhlaWdodCAgICAgCTIxNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgiIEAxMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc3NSwgMTYyOCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTcyRDAyQ0IiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZSIgQDExNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MSwgLTU2NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTQNCi0JCQkJbG9jYXRpb24gICAJKDI0MjIsIDgwOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXR0cmlidXRlTmFtZVJlZmVyZW5jZSINCi0JCQkJcGN0RGlzdCAgICAJMC44Mjk2MzANCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk3MzYwMjkxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTEzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNzc1LCAxNjI4KQ0KLQkJCQkoMjc3NSwgNzY4KQ0KLQkJCQkoMjE3MywgNzY4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3NzUsIDE2MjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTczLCA3NjgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNg0KLQkJCQlQYXJlbnRfVmlldyAJQDExNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjIyMiwgODcxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45NjY2NDkNCi0JCQkJaGVpZ2h0ICAgICAJMTAyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSIgQDExNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MSwgLTU2NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTcNCi0JCQkJbG9jYXRpb24gICAJKDIwNzYsIDIwOTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1ODgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjc3MTQ2OQ0KLQkJCQloZWlnaHQgICAgIAkzNQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTczNjAyOUIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjc3NSwgMTYyOCkNCi0JCQkJKDI3NzUsIDIwNTUpDQotCQkJCSgxNzQxLCAyMDU1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3NzUsIDE2MjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQxLCAyMDU1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTcNCi0JCQkJbG9jYXRpb24gICAJKDE4MTMsIDIwMTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk1MTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMSIgQDEyMA0KLQkJICAgIGxvY2F0aW9uICAgCSgyOTQ1LCAxODkxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QkQ0OTA4MDEzRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIiBAMTIxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNDg5LCAtNjc2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQzNSwgNjU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg2NjAyNg0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEJENDkxNDAxMzAiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI5NDUsIDE4OTEpDQotCQkJCSgyOTQ1LCA3MDgpDQotCQkJCSgyMTczLCA3MDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjk0NSwgMTg5MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNzMsIDcwOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzDQotCQkJCVBhcmVudF9WaWV3IAlAMTIxDQotCQkJCWxvY2F0aW9uICAgCSgyMzQ1LCA2MDMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxMjUzOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IiBAMTI0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNDg5LCAtNjc2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTY3OSwgMjI5OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTU3Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuODI4NjAxDQotCQkJCWhlaWdodCAgICAgCTU2DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QkQ0OTE0MDE0RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMA0KLQkJCSAgICBzdXBwbGllciAgIAlAODgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyOTQ1LCAxODkxKQ0KLQkJCQkoMjk0NSwgMjI0MykNCi0JCQkJKDE0MzgsIDIyNDMpDQotCQkJCSgxNDM4LCAyMTQ4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI5NDUsIDE4OTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDM4LCAyMTQ4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjQNCi0JCQkJbG9jYXRpb24gICAJKDEzNjUsIDIxNzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk4NDc3NA0KLQkJCQloZWlnaHQgICAgIAk3NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjE1OTAxREEiDQotCQkgICAgY2xpZW50ICAgICAJQDExMg0KLQkJICAgIHN1cHBsaWVyICAgCUA2Ng0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NTAsIDY0NSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1MCwgNDg2KSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDEyOA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ2LCA3NTIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJBOTUwMENDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzIiBAMTI5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTQyLCAtMTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTJBOTUwMzExIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI4DQotCQkJICAgIHN1cHBsaWVyICAgCUA5Ng0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM0NiwgNzUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4OSwgNzUyKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNCIgQDEzMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU0MiwgLTE2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTJBOTUwMzFCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNDYsIDc1MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDMsIDc1MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxDQotCQkJCVBhcmVudF9WaWV3IAlAMTMwDQotCQkJCWxvY2F0aW9uICAgCSgxNTQ0LCA3OTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3MzM5MA0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQXR0cmlidXRlRGVmaW5pdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDQ1NzAyNTciDQotCSAgICB0aXRsZSAgICAgIAkiQXR0cmlidXRlRGVmaW5pdGlvbiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREF0dHJpYnV0ZSIgQDEzMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTEyLCA2NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTMyDQotCQkJbG9jYXRpb24gICAJKDIzNiwgNTM5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU1Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkJICAgIHdpZHRoICAgICAgCTU3MA0KLQkJICAgIGhlaWdodCAgICAgCTI1OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREJhc2ljVHlwZSIgQDEzMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgNjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzMw0KLQkJCWxvY2F0aW9uICAgCSgxMDE3LCA1ODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDk0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERCYXNpY1R5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDY0RjAwREEiDQotCQkgICAgd2lkdGggICAgICAJNTEyDQotCQkgICAgaGVpZ2h0ICAgICAJMTY4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW51bWVyYXRpb25UeXBlIiBAMTM0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTA0LCA2NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM0DQotCQkJbG9jYXRpb24gICAJKDE2NDYsIDU4NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudW1lcmF0aW9uVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0NjY4MDMwNiINCi0JCSAgICB3aWR0aCAgICAgIAk1MzQNCi0JCSAgICBoZWlnaHQgICAgIAkxNjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDEzNQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDExMjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM1DQotCQkJbG9jYXRpb24gICAJKDQ5MiwgOTI2KQ0KLQkJCW5saW5lcyAgICAgCTkNCi0JCQltYXhfd2lkdGggIAk4MDUNCi0JCQlsYWJlbCAgICAgIAkNCi18QSBEVEQgYXR0cmlidXRlJ3MgdHlwZSBhbmQgaW5pdGlhbA0KLXx2YWx1ZSBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgdGhlIGVUeXBlIGFuZCBkZWZhdWx0IHZhbHVlIHN0b3JlZCBpbiBlQXR0cmlidXRlLiBUaGUgZVR5cGUgd2lsbCBhbHdheXMgYmUgZWl0aGVyIERUREJhc2ljVHlwZSAoc3ViY2xhc3Mgb2YgZUNsYXNzKSBvciBEVERFbnVtZXJhdGlvblR5cGUgKHN1YmNsYXNzIG9mIGVFbnVtKS4NCi0JCQkpDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICB3aWR0aCAgICAgIAk4NjUNCi0JCSAgICBoZWlnaHQgICAgIAk0MDApDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDEzNg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBjbGllbnQgICAgIAlAMTMyDQotCQkgICAgc3VwcGxpZXIgICAJQDEzNQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiIEAxMzcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjY0LCAyNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM3DQotCQkJbG9jYXRpb24gICAJKDExODMsIDE5NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFRW51bSIgQDEzOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDI3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzgNCi0JCQlsb2NhdGlvbiAgIAkoMTgyMywgMTk3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUVudW0iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNDczRTkwMUQ0Ig0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTM5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMjgwMDMxNSINCi0JCSAgICBjbGllbnQgICAgIAlAMTMzDQotCQkgICAgc3VwcGxpZXIgICAJQDEzNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNjAsIDU3MikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MCwgMzU5KSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0MA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjI4MTAzMDIiDQotCQkgICAgY2xpZW50ICAgICAJQDEzNA0KLQkJICAgIHN1cHBsaWVyICAgCUAxMzgNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTAzLCA1NzIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDMsIDM1OSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQXR0cmlidXRlIiBAMTQxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTI4LCAyNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQxDQotCQkJbG9jYXRpb24gICAJKDQ0NywgMTk3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTIzODQ3MjAzOUQiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YxNTkwMURBIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMzINCi0JCSAgICBzdXBwbGllciAgIAlAMTQxDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTIwLCA1MjcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUyMCwgMzU5KSkpKSkpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9kdGRtb2RlbC5tZGwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL2R0ZG1vZGVsLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1NjI3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL2R0ZG1vZGVsLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDc1MjYgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0NQ0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA3LjUuMDEwMy4xOTIwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJJREUiDQotCSAgICB2YWx1ZSAgICAgIAkiSW50ZXJuYWwgRWRpdG9yIikpDQotICAgIHF1aWQgICAgICAgCSIzRTM2QkVCNjAxMzMiDQotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMNCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwDQotCWxlZnRNYXJnaW4gCTAuMjUwMDAwDQotCXRvcE1hcmdpbiAgCTAuMjUwMDAwDQotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDANCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwDQotCWNsaXBJY29uTGFiZWxzIAlUUlVFDQotCWF1dG9SZXNpemUgCVRSVUUNCi0Jc25hcFRvR3JpZCAJVFJVRQ0KLQlncmlkWCAgICAgIAkxNg0KLQlncmlkWSAgICAgIAkxNg0KLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250DQotCSAgICBzaXplICAgICAgIAkxMA0KLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JICAgIGNvbG9yICAgICAgCTANCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCXNob3dNZXNzYWdlTnVtIAkxDQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFDQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikNCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRjciDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQTBDNzVGNDAyMEIiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUY2Ig0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyINCi0JcXVpZHUgICAgICAJIjNBMEM3NUY0MDFGOCINCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImVjb3JlIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkVkFCQVNFX1BMVUdJTlNfUEFUSFxcb3JnLmVjbGlwc2UuZW1mLmVjb3JlXFxzcmNcXG1vZGVsXFxvcmcuZWNsaXBzZS5lbWYuRUNvcmUuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM5QTVFRDA0MDA0RSIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJkdGQiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRWQUJBU0VfUExVR0lOU19QQVRIXFxvcmcuZWNsaXBzZS53c3QuZHRkXFxzcmNcXHJvc2VcXERURC5jYXQiDQotCQlxdWlkICAgICAgIAkiMzg1N0IxQzAwMjkzIikpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUZGIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjplY29yZSIgQDENCi0JCQlsb2NhdGlvbiAgIAkoOTYwLCAzMDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoODE2LCAyMjApDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImVjb3JlIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpkdGQiIEAyDQotCQkJbG9jYXRpb24gICAJKDM2OCwgMjU2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDINCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNCwgMTcyKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJkdGQiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzODU3QjFDMDAyOTMiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkNCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGOCINCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEM3NUY0MDIwQSINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMNCi0JcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGOSINCi0JUHJvY3NORGV2cyAJKGxpc3QNCi0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciDQotCQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUZCIg0KLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzDQotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2UiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhQmFzZVNldCIgODAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIkFOU0kiDQotCQkJCXZhbHVlICAgICAgCTgwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIk9yYWNsZSINCi0JCQkJdmFsdWUgICAgICAJODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiU1FMU2VydmVyIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJTeWJhc2UiDQotCQkJCXZhbHVlICAgICAgCTgwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIldhdGNvbSINCi0JCQkJdmFsdWUgICAgICAJODA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVl8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJJbmhlcml0U3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSJfViIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQmFzZVZpZXdzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiVkFSQ0hBUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJOdWxsc09LIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExFbGVtZW50Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExTcGVjaWZpY2F0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIklETFNwZWNTZXQiIDIyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETFNwZWNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlR5cGVkZWYiDQotCQkJCXZhbHVlICAgICAgCTU0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiRW51bWVyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJFeGNlcHRpb24iDQotCQkJCXZhbHVlICAgICAgCTYxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU3RydWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAk1MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlVuaW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUlETE1vZHVsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlJhaXNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlNDQyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVnZW4gTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkhlYWRlclNvdXJjZUZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5U291cmNlRmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFOU0kgQysrIEV2ZW50IFdhdGNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBTlNJQ29udmVydCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTgzX1NPVVJDRSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQWNjZXNzIg0KLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQb2x5bW9ycGhpY1VuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUFjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJBXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJUaGVfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUVxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkxpbWl0ZWRQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvblJldHVybiINCi0JCQkJdmFsdWUgICAgICAJMjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVXNlQ29sb25Ob3RhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE5NV9TT1VSQ0UiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvbnRyb2xsZWRfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2NsYXNzfV9SZWNvcmRfS2luZHMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0xpbWl0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0NsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIgMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVHlwZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3F1b3RlfT0ke3F1b3RlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZWNvcmQiDQotCQkJCXZhbHVlICAgICAgCTIxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTWl4aW4iDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFzayINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMjA5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aXBsZVR5cGVzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlVuY29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTIxNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTIyOCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiDQotCQkJCXZhbHVlICAgICAgCTIyOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXV0byINCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzUHJpdmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJUcnVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nQXNCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTIxNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTIxNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJInByb2plY3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlZpZXdDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkpvaW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiY09OVEFJTkVSQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGF0YWJhc2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYXJnZXREYXRhYmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZVNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RlYXVsdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkJ1ZmZlclBvb2wiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlbnRTaXplIg0KLQkJCXZhbHVlICAgICAgCTEpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmVmZXRjaFNpemUiDQotCQkJdmFsdWUgICAgICAJMSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhZ2VTaXplIg0KLQkJCXZhbHVlICAgICAgCTQpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJNYW5hZ2VkQnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJMaXN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1Eb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1Jvb3RTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1Jvb3REb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWFQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGF0YWJhc2VJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRCTVMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVmlldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRG9tYWluIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTUFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTeW5vbnltbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb3JyZWxhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJOb25lIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGVyc2lzdFRvU2VydmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0lkZW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOYXRpdmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSZWxhdGlvbnNoaXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSSU1ldGhvZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVHJpZ2dlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDbHVzdGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIktleUxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja1ByZWRpY2F0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmZXJhbE1vZGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ2hlY2tUaW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luc2VydEV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk5ld1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3Um93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb3ciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGFuZ3VhZ2UiDQotCQkJdmFsdWUgICAgICAJIlNRTCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlclN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuZWROdWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNPdXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklEIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm90U2hvd1Jvc2VJRERsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJvc2VJRCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFJldHVybkxpbmUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTSINCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiDQotCQkJdmFsdWUgICAgICAJIi47QzpcXElCTVxcU1FMTElCXFxqYXZhXFxkYjJqYXZhLnppcDtDOlxcSUJNXFxTUUxMSUJcXGphdmFcXGRiMmpjYy5qYXI7QzpcXElCTVxcU1FMTElCXFxqYXZhXFxzcWxqLnppcDtDOlxcSUJNXFxTUUxMSUJcXGJpbjtDOlxcSUJNXFxTUUxMSUJcXGphdmFcXGNvbW1vbi5qYXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlZmVyZW5jZUNsYXNzcGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN1biINCi0JCQkJdmFsdWUgICAgICAJMjAwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVkFKYXZhV29ya2luZ0ZvbGRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJ2b2lkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIg0KLQkJCXZhbHVlICAgICAgCTMpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5TdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVtb3RlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlbW90ZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJIb21lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkhvbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5U3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkRURExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREVERMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U2VydmxldFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiDQotCQkJCXZhbHVlICAgICAgCTY1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMi4wIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMS54Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemVkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm4iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJNzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQm91bmQiDQotCQkJCXZhbHVlICAgICAgCTczKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSINCi0JCQkJdmFsdWUgICAgICAJODEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJNzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQm91bmQiDQotCQkJCXZhbHVlICAgICAgCTczKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSINCi0JCQkJdmFsdWUgICAgICAJODEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc05hdmlnYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiMzYwMDAwMDAyIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiX0lEIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlclR5cGVTZXQiIDE4MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2giDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiTWFwTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMTkwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiDQotCQkJCXZhbHVlICAgICAgCTE5MDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCINCi0JCQkJdmFsdWUgICAgICAJMTkwOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJBRlRFUiINCi0JCQkJdmFsdWUgICAgICAJMTgwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiDQotCQkJCXZhbHVlICAgICAgCTE4MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TVEVBRCBPRiINCi0JCQkJdmFsdWUgICAgICAJMTgwMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJST1ciDQotCQkJCXZhbHVlICAgICAgCTE3MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiU1RBVEVNRU5UIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiDQotCQkJCXZhbHVlICAgICAgCTE2MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiNiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ29tcG9uZW50VGVzdCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiY29tcGlsZXIyLjFfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZSgkbGltaXQpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2UoJGxpbWl0KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiY29tcGlsZXIzLjBfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiDQotCQkJdmFsdWUgICAgICAJImNsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiDQotCQkJCXZhbHVlICAgICAgCTIwNikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQotfC8vICRwYWNrYWdlDQotfCNpbmNsdWRlICIkZmlsZSINCi18DQotCQkJKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBYnN0cmFjdEJvZHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmREZWNsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjaWFsRGVjbFJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0Ig0KLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kZW50Ig0KLQkJCXZhbHVlICAgICAgCTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAk2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIg0KLQkJCQl2YWx1ZSAgICAgIAk3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlRvcExpbmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlS2luZHMiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZW51bSINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkicmVjb3JkIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtb2R1bGUiDQotCQkJCXZhbHVlICAgICAgCTEwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZGlzcGludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiY29jbGFzcyINCi0JCQkJdmFsdWUgICAgICAJMTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJCXZhbHVlICAgICAgCTEwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInVuaW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtYXgiDQotCQkJCXZhbHVlICAgICAgCTEwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkia2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVLaW5kcyIgMTA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInV1aWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImRsbG5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhbGlhcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJmaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxpYnJhcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwZmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkibGNpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiDQotCQkJCXZhbHVlICAgICAgCTIxMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjAiDQotCQkJCXZhbHVlICAgICAgCTIyMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjEiDQotCQkJCXZhbHVlICAgICAgCTIyNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nIg0KLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlRleHQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEJvZHkiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVZhbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJ5UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbUFycmF5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcG9ydFJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlF1aWNrSW1wb3J0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiV2ViIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVudGl0eV9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJJbnRlcm5hbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlckVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9QdWJsaWNJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudFBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJjbGFzc2lmaWVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm9wZXJhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNJRCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJyZWZlcmVuY2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpKQ0KLQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUZBIikpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZWU1MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYW55LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxN2Q5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2FueS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmI3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfbGlzdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9saXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1ZWI1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9saXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyY2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmNDg4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X3JlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5YWNmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW1wdHljb250ZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW1wdHljb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4ZTY2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VtcHR5Y29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTE4ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGIyNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDFjMTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmIyY2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX25vdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfbm90LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwOTY2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfbm90LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl91bnJlYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfdW5yZWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmQ4MmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl91bnJlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9hdHRsaXN0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9hdHRsaXN0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NDljNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfYXR0bGlzdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfY29tbWVudHNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2NvbW1lbnRzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjA5NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfY29tbWVudHNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZ2VuaHRtZm9ybV93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9nZW5odG1mb3JtX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTQ3MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9nZW5odG1mb3JtX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTlkZjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRjMjZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzYmEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZWNob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmIzNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVjaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVjaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjM5OGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVzZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWRiMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVzZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZXNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjk2NThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MjJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxjaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbGNob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNGY5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbGNob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsc2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkNTI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsc2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE3YTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi91bnJlY29nbml6ZWRfY29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODk5N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi91bnJlY29nbml6ZWRfY29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmNTE0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWMxMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkNGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVzZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc0MGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIERURCBDb3JlCi0jCi1TdHJ1Y3R1cmVkX0RURF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPVN0cnVjdHVyZWQgRFREIERvY3VtZW50IEZhY3RvcnkgRXh0ZW5zaW9uCi1EVERfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9RFRECi1fRFREX1ZBTElEQVRPUl9OQU1FICAgICAgICAgICAgICAgPSBEVEQgVmFsaWRhdG9yCi1fdmFsaWRhdGlvbk1hcmtlci5uYW1lPURURCBQcm9ibGVtCi1fdGFza01hcmtlci5uYW1lPURURCBUYXNrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYjQ2MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbEhhbmRsZXIiPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JEVEQiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrcy5EVERGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRhc2tzLkRUREZpbGVUYXNrU2Nhbm5lcjpvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGFza01hcmtlciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2tNYXJrZXIiCi0JCW5hbWU9IiVfdGFza01hcmtlci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50YXNrbWFya2VyIi8+Ci0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgIGlkPSJ2YWxpZGF0aW9uTWFya2VyIgotICAgICAgICBuYW1lPSIlX3ZhbGlkYXRpb25NYXJrZXIubmFtZSIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiLz4KLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX0RURF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJkdGQiIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Im1vZCIgLz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iZW50IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0iZHRkLG1vZCxlbnQiCi0JCQlwcmlvcml0eT0ibm9ybWFsIgotCQkJbmFtZT0iJURURF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJkdGRzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50LkNvbnRlbnREZXNjcmliZXJGb3JEVEQiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotCQk8cGFyc2VyCi0JCQl0eXBlPSJkdGQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFJlc291cmNlRmFjdG9yeUltcGwiPgotCQk8L3BhcnNlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLQkJPHBhcnNlcgotCQkJdHlwZT0iZW50IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERSZXNvdXJjZUZhY3RvcnlJbXBsIj4KLQkJPC9wYXJzZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotCQk8cGFja2FnZQotCQkJdXJpPSJEVEQueG1pIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERQYWNrYWdlSW1wbCI+Ci0JCTwvcGFja2FnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJkdGQsIGVudCwgbW9kLCB4bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50RmFjdG9yeURURCI+Ci0JCTwvZmFjdG9yeT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBkdGQgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFJlZ2lzdGVyIHRoZSBEVEQgdmFsaWRhdG9yIHdpdGggdGhlIChuZXcpIHZhbGlkYXRpb24gICAtLT4KLQk8IS0tIGZyYW1ld29yay4gCQkJCQkJCQkJCSAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24gaWQ9ImR0ZERURFZhbGlkYXRvciIgbmFtZT0iJV9EVERfVkFMSURBVE9SX05BTUUiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0idHJ1ZSIKLSAgICAgICAgICAgIHNvdXJjZWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmR0ZHNvdXJjZXZhbGlkYXRvciIKLSAgICAgICAgICAgIHZlcnNpb249IjEiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9ImR0ZCIvPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0iZW50Ii8+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJtb2QiLz4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEVEQgYXMgeW91IHR5cGUgdmFsaWRhdGlvbgkJCQkJCQkJLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuZHRkc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuREVGQVVMVCI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHROb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzUzNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQXR0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXR0Tm9kZSB7Ci0JLy8KLQkvLyBhdHRUeXBlCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDREFUQSA9IDAsIElEID0gMSwgSURSRUYgPSAyLCBJRFJFRlMgPSAzLCBFTlRJVFkgPSA0LCBFTlRJVElFUyA9IDUsIE5NVE9LRU4gPSA2LCBOTVRPS0VOUyA9IDcsIE5PVEFUSU9OID0gOCwgRU5VTUVSQVRJT04gPSA5LCBQRVJFRkVSRU5DRSA9IDEwOwotCi0JLy8KLQkvLyBLZWVwIHRoaXMgYXJyYXkgaW4tc3luYyB3aXRoIHRoZSBBVFRUWVBFIGRlZmluaXRpb25zCi0JLy8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmZ0F0dFR5cGVTdHJpbmcgPSB7IkNEQVRBIiwgLy8gMCAvLyROT04tTkxTLTEkCi0JCQkJIklEIiwgLy8gMSAvLyROT04tTkxTLTEkCi0JCQkJIklEUkVGIiwgLy8gMiAvLyROT04tTkxTLTEkCi0JCQkJIklEUkVGUyIsIC8vIDMgLy8kTk9OLU5MUy0xJAotCQkJCSJFTlRJVFkiLCAvLyA0IC8vJE5PTi1OTFMtMSQKLQkJCQkiRU5USVRJRVMiLCAvLyA1IC8vJE5PTi1OTFMtMSQKLQkJCQkiTk1UT0tFTiIsIC8vIDYgLy8kTk9OLU5MUy0xJAotCQkJCSJOTVRPS0VOUyIsIC8vIDcgLy8kTk9OLU5MUy0xJAotCQkJCSJOT1RBVElPTiIsIC8vIDggLy8kTk9OLU5MUy0xJAotCQkJCSJFTlVNRVJBVElPTiIsIC8vIDkgKHJlcGxhY2VkIHdpdGggIk5NVE9LRU4iIGJ5IFNBWCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCS8vIEF0dHJpYnV0ZUxpc3QgaGFuZGxlcikKLQkJCQkiJUVOVElUWVJFRkVSRU5DRTsifTsgLy8kTk9OLU5MUy0xJAotCi0JLy8KLQkvLyBhdHREZWZhdWx0VHlwZQotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9GSVhFRCA9IDEsIC8vIEF0dFZhbHVlCi0JCQkJUkVRVUlSRUQgPSAyLCAvLyAjUkVRVUlSRUQKLQkJCQlJTVBMSUVEID0gMywgLy8gI0lNUExJRUQKLQkJCQlGSVhFRCA9IDQ7IC8vICNGSVhFRCBBdHRWYWx1ZQotCi0JcHVibGljIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIHR5cGUgPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFR5cGUgPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFZhbHVlID0gbnVsbDsKLQlwdWJsaWMgVmVjdG9yIGVudW1MaXN0ID0gbnVsbDsgLy8gbGlzdCBvZiBOb3RhdGlvbnMgb3IgRW51bSB2YWx1ZXMKLQotCXB1YmxpYyBpbnQgZ2V0RGVjbGFyZWRUeXBlKCkgewotCQlpbnQgdCA9IC0xOwotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIHQ7Ci0KLQkJaWYgKHR5cGUuc3RhcnRzV2l0aCgiJSIpICYmIHR5cGUuZW5kc1dpdGgoIjsiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gUEVSRUZFUkVOQ0U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZ0F0dFR5cGVTdHJpbmcubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0eXBlLmVxdWFscyhmZ0F0dFR5cGVTdHJpbmdbaV0pKSB7Ci0JCQkJdCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHQ7Ci0JfQotCi0JcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotCQlpZiAoZW51bUxpc3QgPT0gbnVsbCkKLQkJCWVudW1MaXN0ID0gbmV3IFZlY3RvcigpOwotCQlyZXR1cm4gZW51bUxpc3QuZWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRUeXBlKCkgewotCQlpZiAoZGVmYXVsdFR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoZGVmYXVsdFR5cGUuc3RhcnRzV2l0aCgiJSIpICYmIGRlZmF1bHRUeXBlLmVuZHNXaXRoKCI7IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIFBFUkVGRVJFTkNFOwotCQllbHNlIGlmIChkZWZhdWx0VHlwZS5lcXVhbHMoIiNSRVFVSVJFRCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gUkVRVUlSRUQ7Ci0JCWVsc2UgaWYgKGRlZmF1bHRUeXBlLmVxdWFscygiI0lNUExJRUQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIElNUExJRUQ7Ci0JCWVsc2UgaWYgKGRlZmF1bHRUeXBlLmVxdWFscygiI0ZJWEVEIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBGSVhFRDsKLQkJZWxzZQotCQkJcmV0dXJuIE5PRklYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBdHQgTmFtZTogIiArIG5hbWUgKyAiIFR5cGU6ICIgKyB0eXBlICsgIiBkZWZhdWx0VHlwZTogIiArIGRlZmF1bHRUeXBlICsgIiBkZWZhdWx0VmFsdWU6ICIgKyBkZWZhdWx0VmFsdWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHRsaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHRsaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzdhMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQXR0bGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEF0dGxpc3QgZXh0ZW5kcyBCYXNlTm9kZSB7Ci0JVmVjdG9yIGF0dERlZnMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgbGlzdCdzIG5hbWU7IHRoaXMgdmFsdWUgaXMgYWxzbyBrbm93biBhcyB0aGUKLQkgKiAgICAgICAgICAgIEVsZW1lbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQXR0bGlzdChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXRoaXMobmFtZSwgb3duZXJEVEQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBBdHRsaXN0KFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQsIFN0cmluZyBjb21tZW50LCBFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBjb21tZW50LCBlcnJvck1lc3NhZ2UpOwotCX0KLQotCi0JLyoqCi0JICogQWRkcyB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHRvIHRoZSBlbmQgb2YgdGhpcyBhdHRyaWJ1dGUKLQkgKiBsaXN0IC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0RGVmCi0JICogICAgICAgICAgICBBdHRyaWJ1dGUgZGVmaW5pdGlvbiB0byBhZGQgdG8gdGhpcyBhdHJpYnV0ZSBsaXN0LgotCSAqIEByZXR1cm4gPXRydWUgaWYgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4KLQkgKiAgICAgICAgIHRoaXMgYXR0cmlidXRlIGxpc3Q7IG90aGVyd2lzZSwgPWZhbHNlLgotCSAqIEBzZWUgI2VsZW1lbnRBdAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICogQHNlZSAjc2l6ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZEVsZW1lbnQoQXR0Tm9kZSBhdHREZWYpIHsKLQkJaWYgKGNvbnRhaW5zKGF0dERlZi5uYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJdGhpcy5hdHREZWZzLmFkZEVsZW1lbnQoYXR0RGVmKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gYXQgdGhlIHNwZWNpZmllZCA8dmFyPmluZGV4PC92YXI+IGluCi0JICogdGhpcyBhdHRyaWJ1dGUgbGlzdAotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgSW5kZXggaW50byB0aGlzIGxpc3Qgb2YgYXR0cmlidXRlIGRlZmluaXRpb25zLgotCSAqIEByZXR1cm4gQXR0cmlidXRlIGRlZmluaXRpb24gYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IgPHZhcj5udWxsPC92YXI+Ci0JICogICAgICAgICBpZiBhbiBpbnZhbGlkIGluZGV4LgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNnZXRBdHREZWYKLQkgKiBAc2VlICNjb250YWlucwotCSAqIEBzZWUgI3NpemUKLQkgKi8KLQlwdWJsaWMgQXR0Tm9kZSBlbGVtZW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQXR0Tm9kZSkgdGhpcy5hdHREZWZzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogZGVmaW5pdGlvbiBuYW1lIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGF0dERlZk5hbWUKLQkgKiAgICAgICAgICAgIEF0dHJpYnV0ZSBkZWZpbml0aW9uIG5hbWUgdG8gbWF0Y2ggaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAcmV0dXJuIFRoZSBtYXRjaGluZyBhdHRyaWJ1dGUgZGVmaW5pdGlvbiwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZQotCSAqICAgICAgICAgYXR0cmlidXRlIGlzIG5vdCBjdXJyZW50bHkgZGVmaW5lZC4KLQkgKiBAc2VlICNhZGRFbGVtZW50Ci0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjY29udGFpbnMKLQkgKiBAc2VlICNzaXplCi0JICogQHNlZSAjZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgQXR0Tm9kZSBnZXRBdHREZWYoU3RyaW5nIGF0dERlZk5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotCQkJQXR0Tm9kZSBhZCA9IGVsZW1lbnRBdChpKTsKLQkJCWlmIChhdHREZWZOYW1lLmVxdWFscyhhZC5uYW1lKSkKLQkJCQlyZXR1cm4gYWQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGRlZmluaXRpb24gbmFtZSBpcyBjdXJyZW50bHkKLQkgKiBkZWZpbmVkIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGF0dERlZk5hbWUKLQkgKiAgICAgICAgICAgIEF0dHJpYnV0ZSBkZWZpbml0aW9uIG5hbWUgdG8gbWF0Y2ggaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAcmV0dXJuID10cnVlIGlmIDx2YXI+YXR0RGVmTmFtZTwvdmFyPiBpcyBkZWZpbmVkOyBvdGhlcndpc2UsID1mYWxzZS4KLQkgKiBAc2VlICNhZGRFbGVtZW50Ci0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjZ2V0QXR0RGVmCi0JICogQHNlZSAjc2l6ZQotCSAqIEBzZWUgI2VsZW1lbnRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGF0dERlZk5hbWUpIHsKLQkJcmV0dXJuIG51bGwgIT0gZ2V0QXR0RGVmKGF0dERlZk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIE51bWJlciBvZiBhdHRyaWJ1dGUgbGlzdCBkZWZpbml0aW9ucywgb3IgPHZhcj5udWxsPC92YXI+IGlmIG5vCi0JICogICAgICAgICBkZWZpbml0aW9ucyBkZWZpbmVkLgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNlbGVtZW50QXQKLQkgKiBAc2VlICNnZXRBdHREZWYKLQkgKiBAc2VlICNjb250YWlucwotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0RGVmcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgYXR0cmlidXRlIGRlZmluaXRpb25zIGluIHRoaXMgYXR0cmlidXRlCi0JICogbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIGFsbCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMsIG9yIDx2YXI+bnVsbDwvdmFyPgotCSAqICAgICAgICAgaWYgbm9uZSBzcGVjaWZpZWQuCi0JICogQHNlZSAjYWRkRWxlbWVudAotCSAqIEBzZWUgI2VsZW1lbnRBdAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICogQHNlZSAjc2l6ZQotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuYXR0RGVmcy5lbGVtZW50cygpOwotCX0KLQotCXZvaWQgc2V0QXR0RGVmcyhWZWN0b3IgYXR0cnMpIHsKLQkJYXR0RGVmcyA9IGF0dHJzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Jhc2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9CYXNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWIzOWJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Jhc2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTm9kZSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcm90ZWN0ZWQgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBvd25lckRURCA9IG51bGw7Ci0KLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgQmFzZU5vZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCkgewotCQl0aGlzKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQmFzZU5vZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIGNvbW1lbnQsIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5vd25lckRURCA9IG93bmVyRFREOwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlTmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T3duZXJEVEQoKSB7Ci0JCXJldHVybiBvd25lckRURDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRURChTdHJpbmcgb3duZXIpIHsKLQkJb3duZXJEVEQgPSBvd25lcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLQkJdGhpcy5jb21tZW50ID0gY29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgRXJyb3JNZXNzYWdlIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoRXJyb3JNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNQmFzaWNOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTUJhc2ljTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWMwZmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNQmFzaWNOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ01CYXNpY05vZGUgZXh0ZW5kcyBDTU5vZGUgewotCXByaXZhdGUgaW50IHR5cGUgPSBDTU5vZGVUeXBlLkVNUFRZOyAvLyBwb3NzaWJsZSB0eXBlcyA6Ci0KLQkvLyBDTU5vZGVUeXBlLkVNUFRZCi0JLy8gQ01Ob2RlVHlwZS5BTlkKLQkvLyBDTU5vZGVUeXBlLlBDREFUQQotCi0JLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCi0JcHVibGljIENNQmFzaWNOb2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCX0KLQotCXB1YmxpYyBDTUJhc2ljTm9kZShTdHJpbmcgcmVmTmFtZSwgaW50IHR5cGUpIHsKLQkJc3VwZXIocmVmTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIgQmFzaWNOb2RlTmFtZTogIiArIGdldE5hbWUoKSArICIgVHlwZTogIiArIGdldFR5cGUoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Hcm91cE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNR3JvdXBOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTIwMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Hcm91cE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIENNR3JvdXBOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0JcHJpdmF0ZSBpbnQgdHlwZSA9IENNTm9kZVR5cGUuR1JPVVA7Ci0JcHJpdmF0ZSBpbnQgZ3JvdXBLaW5kID0gQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRTsKLQlwcml2YXRlIFZlY3RvciBjaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKLQotCXB1YmxpYyBDTUdyb3VwTm9kZSgpIHsKLQkJc3VwZXIoIkdST1VQIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8vIGltcGxlbWVudCBzdXBlciBjbGFzcwotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJLy8gY2FuJ3QgY2hhbmdlIC0gb25seSBvbmUgdHlwZSBhbGxvd3MKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEdyb3VwS2luZCgpIHsKLQkJcmV0dXJuIGdyb3VwS2luZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHcm91cEtpbmQoaW50IGtpbmQpIHsKLQkJZ3JvdXBLaW5kID0ga2luZDsKLQl9Ci0KLQlwdWJsaWMgVmVjdG9yIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoQ01Ob2RlIGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZEVsZW1lbnQoY2hpbGQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiR3JvdXAgKCAtIGtpbmQ6ICIgKyBnZXRHcm91cEtpbmQoKSArICIgT2NjVHlwZTogIiArIGdldE9jY3VycmVuY2UoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJRW51bWVyYXRpb24gZW4gPSBjaGlsZHJlbi5lbGVtZW50cygpOwotCQl3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCXJlc3VsdCArPSAiICIgKyBlbi5uZXh0RWxlbWVudCgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXN1bHQgKz0gIkdyb3VwICkiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxYmNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGUgewotCXByaXZhdGUgU3RyaW5nIHJlZk5hbWU7Ci0KLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgQ01Ob2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXRoaXMucmVmTmFtZSA9IHJlZk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gcmVmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFR5cGUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFR5cGUoaW50IHR5cGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYThkODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Ob2RlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGludGVyZmFjZSBDTU5vZGVUeXBlIHsKLQlzdGF0aWMgcHVibGljIGludCBFTVBUWSA9IDE7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgQU5ZID0gMjsKLQlzdGF0aWMgcHVibGljIGludCBQQ0RBVEEgPSAzOwotCXN0YXRpYyBwdWJsaWMgaW50IEVMRU1FTlRfUkVGRVJFTkNFID0gNDsKLQlzdGF0aWMgcHVibGljIGludCBFTlRJVFlfUkVGRVJFTkNFID0gNTsKLQlzdGF0aWMgcHVibGljIGludCBHUk9VUCA9IDY7Ci0KLQlzdGF0aWMgcHVibGljIGludCBPTkUgPSA3OwotCXN0YXRpYyBwdWJsaWMgaW50IE9QVElPTkFMID0gODsKLQlzdGF0aWMgcHVibGljIGludCBPTkVfT1JfTU9SRSA9IDk7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgWkVST19PUl9NT1JFID0gMTA7Ci0KLQlzdGF0aWMgcHVibGljIGludCBHUk9VUF9DSE9JQ0UgPSAxMTsKLQlzdGF0aWMgcHVibGljIGludCBHUk9VUF9TRVFVRU5DRSA9IDEyOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlZmVyZW5jZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVmZXJlbmNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjc4OGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVmZXJlbmNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIENNUmVmZXJlbmNlTm9kZSBleHRlbmRzIENNUmVwZWF0YWJsZU5vZGUgewotCXByaXZhdGUgaW50IHR5cGUgPSBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFOwotCi0JcHVibGljIENNUmVmZXJlbmNlTm9kZShTdHJpbmcgcmVmTmFtZSkgewotCQl0aGlzKHJlZk5hbWUsIENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpOwotCX0KLQotCXB1YmxpYyBDTVJlZmVyZW5jZU5vZGUoU3RyaW5nIHJlZk5hbWUsIGludCB0eXBlKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIgUmVmTmFtZTogIiArIGdldE5hbWUoKSArICIgVHlwZTogIiArIGdldFR5cGUoKSArICIgT2NjVHlwZTogIiArIGdldE9jY3VycmVuY2UoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlcGVhdGFibGVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlcGVhdGFibGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NmQ5NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01SZXBlYXRhYmxlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNUmVwZWF0YWJsZU5vZGUgZXh0ZW5kcyBDTU5vZGUgewotCXByaXZhdGUgaW50IG9jY1R5cGUgPSBDTU5vZGVUeXBlLk9ORTsKLQotCXB1YmxpYyBDTVJlcGVhdGFibGVOb2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCX0KLQotCXB1YmxpYyBDTVJlcGVhdGFibGVOb2RlKFN0cmluZyByZWZOYW1lLCBpbnQgb2NjVHlwZSkgewotCQlzdXBlcihyZWZOYW1lKTsKLQkJdGhpcy5vY2NUeXBlID0gb2NjVHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9jY3VycmVuY2UoKSB7Ci0JCXJldHVybiBvY2NUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2UoaW50IG9jY1R5cGUpIHsKLQkJdGhpcy5vY2NUeXBlID0gb2NjVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNTA5YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBEVEQgewotCS8vCi0JLy8gQ29uc3RhbnRzCi0JLy8KLQotCVZlY3RvciBleHRlcm5hbEVsZW1lbnRzID0gbmV3IFZlY3RvcigpOwotCVN0cmluZyBuYW1lID0gbnVsbDsKLQotCWJvb2xlYW4gaXNFeGNlcHRpb25EdXJpbmdQYXJzZSA9IGZhbHNlOwotCi0JLy8KLQkvLyBDb25zdHJ1Y3RvcnMKLQkvLwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICovCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIGZpbGUgbmFtZSBvZiB0aGlzIERURC4KLQkgKiBAc2VlICNnZXROYW1lCi0JICogQHNlZSAjc2V0TmFtZQotCSAqLwotCXB1YmxpYyBEVEQoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgRFREJ3MgZmlsZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gVGhpcyBEVEQncyBmaWxlIG5hbWUsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiBubyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoaXMgRFREJ3MgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGlzIERURCdzIG5hbWUuCi0JICogQHNlZSAjZ2V0TmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIEVudW1lcmF0aW9uIGluc3RhbmNlIG9mIGFsbCBleHRlcm5hbCBzdWJzZXQgY2hpbGRyZW4gb2YgdGhpcwotCSAqIERURC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIGFsbCBleHRlcm5hbCBzdWJzZXQgY2hpbGRyZW4gb2YgdGhpcyBEVEQuCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGV4dGVybmFsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBleHRlcm5hbEVsZW1lbnRzLmVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGVjbChCYXNlTm9kZSBkZWNsKSB7Ci0JCWV4dGVybmFsRWxlbWVudHMuYWRkRWxlbWVudChkZWNsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc0V4Y2VwdGlvbkR1cmluZ1BhcnNlKGJvb2xlYW4gb24pIHsKLQkJaXNFeGNlcHRpb25EdXJpbmdQYXJzZSA9IG9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldElzRXhjZXB0aW9uRHVyaW5nUGFyc2UoKSB7Ci0JCXJldHVybiBpc0V4Y2VwdGlvbkR1cmluZ1BhcnNlOwotCX0KLQotfSAvLyBjbGFzcyBEVEQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTY2YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5MYXp5VVJMSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRFRESGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIERURFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIsIERUREhhbmRsZXIsIEVycm9ySGFuZGxlciwgRGVjbEhhbmRsZXIsIExleGljYWxIYW5kbGVyIHsKLQlwcml2YXRlIFN0cmluZyBjb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBkZWNsU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENhbm9uaWNhbCBvdXRwdXQuICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2Fub25pY2FsOwotCi0JcHJvdGVjdGVkIFhNTFJlYWRlciByZWFkZXI7Ci0JaW50IGVudGl0eURlcHRoOwotCi0JLy8gZG13IDExLzE1IHByaXZhdGUgZmllbGQgbmV2ZXIgcmVhZCBsb2NhbGx5Ci0JLy8gcHJpdmF0ZSBWZWN0b3IgZGVjbEVsZW1lbnRzOwotCXByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotCXByaXZhdGUgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGVycm9yTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBEZWNsTm9kZSBwcmV2aW91c0RlY2xOb2RlID0gbnVsbDsKLQlwcml2YXRlIERlY2xOb2RlIGN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBCYXNlTm9kZSBsYXN0QmFzZU5vZGUgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGVudGl0eUVuZCA9IGZhbHNlOwotCXByaXZhdGUgaW50IGxpbmVOdW1iZXI7Ci0KLQlwcml2YXRlIERURCBjdXJyZW50RFREID0gbnVsbDsKLQlwcml2YXRlIFZlY3RvciBkdGRMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JcHJpdmF0ZSBTdGFjayBkdGRTdGFjayA9IG5ldyBTdGFjaygpOwotCXByaXZhdGUgU3RhY2sgcGVSZWZTdGFjayA9IG5ldyBTdGFjaygpOwotCXByaXZhdGUgU3RhY2sgcGFyc2luZ1BFUmVmU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotCXByaXZhdGUgRW50aXR5UG9vbCBlbnRpdHlQb29sID0gbmV3IEVudGl0eVBvb2woKTsKLQlwcml2YXRlIFN0cmluZyBleHBhbmRlZEVudGl0eVZhbHVlID0gbnVsbDsKLQlwcml2YXRlIEhhc2h0YWJsZSBlbGVtZW50UG9vbCA9IG5ldyBIYXNodGFibGUoKTsKLQotCWJvb2xlYW4gcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdHJ1ZTsKLQotCXByaXZhdGUgTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLQotCXByaXZhdGUgTG9jYXRvciBnZXRMb2NhdG9yKCkgewotCQlyZXR1cm4gbG9jYXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0JCXRoaXMubG9jYXRvciA9IGxvY2F0b3I7Ci0JfQotCi0JcHVibGljIERURFBhcnNlcihib29sZWFuIGNhbm9uaWNhbCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQl0aGlzKG51bGwsIGNhbm9uaWNhbCk7Ci0JfQotCi0JcHJvdGVjdGVkIERURFBhcnNlcihTdHJpbmcgZW5jb2RpbmcsIGJvb2xlYW4gY2Fub25pY2FsKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0KLQkJaWYgKGVuY29kaW5nID09IG51bGwpCi0JCQllbmNvZGluZyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQotCQl0aGlzLmNhbm9uaWNhbCA9IGNhbm9uaWNhbDsKLQkJdHJ5IHsKLQkJCVNBWFBhcnNlciBzcGFyc2VyID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpOwotCQkJcmVhZGVyID0gc3BhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodGhpcyk7Ci0JCQlyZWFkZXIuc2V0RFRESGFuZGxlcih0aGlzKTsKLQkJCXJlYWRlci5zZXRFcnJvckhhbmRsZXIodGhpcyk7Ci0JCQlyZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIodGhpcyk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKiBQcmludHMgdGhlIG91dHB1dCBmcm9tIHRoZSBTQVggY2FsbGJhY2tzLiAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBsb2dpY2FsVVJJKSB7Ci0JCXRyeSB7CQkJCi0JCQkvLyBDUyBlbnN1cmUgdGhhdCB0aGUgcGh5c2ljYWwgVVJJIGlzIGNvbnNpZGVyZWQgd2hlcmUgc3RyZWFtcyBhcmUgcmVxdWlyZWQKLQkJCS8vIGFuZCB0aGUgbG9naWNhbFVSSSBpcyB1c2VkIGFzIHRoZSBEVEQncyBiYXNlTG9jYXRpb24KLQkJCVN0cmluZyBwaHlzaWNhbFVSSSA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oIiIsICIiLCBsb2dpY2FsVVJJKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlib29sZWFuIGlzUmVhZGFibGUgPSBVUklIZWxwZXIuaXNSZWFkYWJsZVVSSShwaHlzaWNhbFVSSSwgdHJ1ZSk7Ci0JCQlpZiAoIWlzUmVhZGFibGUpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJEVEQgcGFyc2UgZXJyb3IuIENhbiBub3QgcmVhZCB0aGUgc3BlY2lmaWVkIFVSSSA6ICIgKyBsb2dpY2FsVVJJKTsgLy8kTk9OLU5MUy0xJAotCQkJfQkJCQotCQkJU3RyaW5nIGRvY3VtZW50ID0gIjwhRE9DVFlQRSByb290IFNZU1RFTSBcIiIgKyBsb2dpY2FsVVJJICsgIlwiPjxyb290Lz4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWVudGl0eURlcHRoID0gMDsKLQkJCWN1cnJlbnREVEQgPSBuZXcgRFREKGxvZ2ljYWxVUkkpOwotCQkJSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihkb2N1bWVudCkpOwotCQkJaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQobG9naWNhbFVSSSArICIueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0JCX0KLQkJY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIHNlKSB7Ci0JCQlpZiAoY3VycmVudERURCAhPSBudWxsKQotCQkJCWN1cnJlbnREVEQuc2V0SXNFeGNlcHRpb25EdXJpbmdQYXJzZSh0cnVlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChjdXJyZW50RFREICE9IG51bGwpCi0JCQkJY3VycmVudERURC5zZXRJc0V4Y2VwdGlvbkR1cmluZ1BhcnNlKHRydWUpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIEVudGl0eSByZWZlcmVuY2VzIGFyZSBhbHdheXMgZXhwYW5kZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJdGhpcy5leHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIEVudGl0eSByZWZlcmVuY2VzIGFyZSBhbHdheXMgZXhwYW5kZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIFZlY3RvciBnZXREVERMaXN0KCkgewotCQlyZXR1cm4gZHRkTGlzdDsKLQl9Ci0KLQlwdWJsaWMgSGFzaHRhYmxlIGdldEVsZW1lbnRQb29sKCkgewotCQlyZXR1cm4gZWxlbWVudFBvb2w7Ci0JfQotCi0JcHVibGljIEVudGl0eVBvb2wgZ2V0RW50aXR5UG9vbCgpIHsKLQkJcmV0dXJuIGVudGl0eVBvb2w7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZXM7Ci0JfQotCi0JLy8KLQkvLyBEb2N1bWVudEhhbmRsZXIgbWV0aG9kcwotCS8vCi0KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgewotCX0KLQotCS8vCi0JLy8gRFRESGFuZGxlciBtZXRob2RzCi0JLy8KLQotCXB1YmxpYyB2b2lkIHVucGFyc2VkRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyBub3RhdGlvbk5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGF0aW9uRGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLk5PVEFUSU9OKTsKLQkJZGVjbFN0cmluZyA9ICI8IU5PVEFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJU3RyaW5nIHhzID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQl4cyArPSBuYW1lOwotCQkJaWYgKHB1YmxpY0lkID09IG51bGwpCi0JCQkJeHMgKz0gIiBTWVNURU0gIiArICJcIiIgKyBzeXN0ZW1JZCArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQllbHNlCi0JCQkJeHMgKz0gIiBQVUJMSUMgIiArICJcIiIgKyBwdWJsaWNJZCArICJcIiAiICsgIlwiIiArIHN5c3RlbUlkICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQljb250ZW50U3RyaW5nICs9IHhzOwotCQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQkJfQotCX0KLQotCS8vCi0JLy8gRGVjbEhhbmRsZXIgbWV0aG9kcwotCS8vCi0KLQlwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FTEVNRU5UKTsKLQkJZGVjbFN0cmluZyA9ICI8IUVMRU1FTlQiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gS0I6IFdpdGggZWFybHkgdmVyc2lvbnMgb2YgWGVyY2VzIDIueCwgc3RhcnRFbnRpdHkoIltkdGRdIikgdXNlZCB0bwotCQkvLyBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kCi0JCS8vIHNvIGVudGl0eURlcHRoIHdhcyAxLiBVc2luZyBKQVhQIGNoYW5nZWQgdGhhdCBhbmQgc3RhcnRFbnRpdHkoKSBpcwotCQkvLyBub3QgY2FsbGVkIGJhY2sgYW55bW9yZS4KLQkJLy8gQmVjYXVzZSBvZiB0aGlzLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBlbnRpdHlEZXB0aCA9PSAwCi0JCS8vIGFzIHdlbGwuCi0JCWlmIChlbnRpdHlEZXB0aCA9PSAwIHx8IGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpCi0JCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbkhlbHBlcihuYW1lICsgIiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgYXR0cmlidXRlRGVjbChTdHJpbmcgZU5hbWUsIFN0cmluZyBhTmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZURlZmF1bHQsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuQVRUTElTVCk7Ci0JCWRlY2xTdHJpbmcgPSAiPCFBVFRMSVNUIjsgLy8kTk9OLU5MUy0xJAotCi0JCWF0dHJpYnV0ZVN0cmluZyArPSAiICIgKyBhTmFtZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodHlwZSAhPSBudWxsKQotCQkJYXR0cmlidXRlU3RyaW5nICs9ICIgIiArIHR5cGU7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZhbHVlRGVmYXVsdCAhPSBudWxsKQotCQkJYXR0cmlidXRlU3RyaW5nICs9ICIgIiArIHZhbHVlRGVmYXVsdDsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZVN0cmluZyArPSAiICciICsgdmFsdWUgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWF0dHJpYnV0ZVN0cmluZyA9IGVOYW1lICsgIiAiICsgYXR0cmlidXRlU3RyaW5nICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb25IZWxwZXIoYXR0cmlidXRlU3RyaW5nKTsKLQkJYXR0cmlidXRlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuSU5URVJOQUxfRU5USVRZKTsKLQkJZGVjbFN0cmluZyA9ICI8IUVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJLy8gYnVpbGQgdXAgYSBzdHJpbmc6IGUuZy4gIiAlIFNUUkRPTSAiKCNQQ0RBVEEpIj4iCi0JCQlTdHJpbmcgeHMgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gIiUgIjsgLy8kTk9OLU5MUy0xJAotCQkJCXhzICs9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJZWxzZQotCQkJCXhzICs9IG5hbWU7Ci0KLQkJCXhzICs9ICIgXCIiICsgdmFsdWUgKyAiXCI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCWNvbnRlbnRTdHJpbmcgKz0geHM7Ci0JCQkvLyBzYXZlIGV4cGFuZGVkIGVudGl0eSB2YWx1ZQotCQkJZXhwYW5kZWRFbnRpdHlWYWx1ZSA9IHZhbHVlOwotCQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXh0ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuRVhURVJOQUxfRU5USVRZKTsKLQkJZGVjbFN0cmluZyA9ICI8IUVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJLy8gYnVpbGQgdXAgYSBzdHJpbmc6Ci0JCQkvLyBleDEpICIgJSBGSUVMRCBTWVNURU0gIm9hZ2lzX2ZpZWxkcy5kdGQiPiIKLQkJCS8vIGV4MikgIiAlIEZJRUxEIFBVQkxJQyAiRk9PIj4iCi0JCQlTdHJpbmcgeHMgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gIiUgIjsgLy8kTk9OLU5MUy0xJAotCQkJCXhzICs9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJZWxzZQotCQkJCXhzICs9IG5hbWU7Ci0KLQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKQotCQkJCXhzICs9ICIgU1lTVEVNIFwiIiArIHN5c3RlbUlkICsgIlwiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZWxzZSBpZiAocHVibGljSWQgIT0gbnVsbCkKLQkJCQl4cyArPSAiIFBVQkxJQyBcIiIgKyBwdWJsaWNJZCArICJcIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJY29udGVudFN0cmluZyArPSB4czsKLQkJCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIExleGljYWxIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJZHRkTGlzdC5yZW1vdmVBbGxFbGVtZW50cygpOwotCQlkdGRMaXN0LmFkZEVsZW1lbnQoY3VycmVudERURCk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBlbmQgb2YgRFREIGRlY2xhcmF0aW9ucy4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotCSAqIEBzZWUgI3N0YXJ0RFRECi0JICovCi0JcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuRU5EX0RURCk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBiZWdpbm5pbmcgb2YgYW4gZW50aXR5LgotCSAqIAotCSAqIFRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBkb2N1bWVudCBlbnRpdHkgYXJlIG5vdCByZXBvcnRlZC4gVGhlIHN0YXJ0Ci0JICogYW5kIGVuZCBvZiB0aGUgZXh0ZXJuYWwgRFREIHN1YnNldCBhcmUgcmVwb3J0ZWQgdXNpbmcgdGhlIHBzZXVkby1uYW1lCi0JICogIltkdGRdIi4gQWxsIG90aGVyIGV2ZW50cyBtdXN0IGJlIHByb3Blcmx5IG5lc3RlZCB3aXRoaW4gc3RhcnQvZW5kCi0JICogZW50aXR5IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gSWYgaXQgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCB0aGUKLQkgKiAgICAgICAgICAgIG5hbWUgd2lsbCBiZWdpbiB3aXRoICclJy4KLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotCSAqIEBzZWUgI2VuZEVudGl0eQotCSAqLwotCi0JcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHMoIltkdGRdIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5TVEFSVF9FTlRJVFlfRFREKTsKLQkJfQotCQllbHNlIGlmIChjdXJyZW50RGVjbE5vZGUgPT0gbnVsbCkgewotCQkJLy8gUEUgcmVmZXJlbmNlIGluIG1hcmt1cGRlY2wgc2VjdGlvbgotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGVOYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQkJRW50aXR5RGVjbCBlbiA9IGVudGl0eVBvb2wucmVmZXJQYXJhKHBlTmFtZSk7Ci0KLQkJCQlwZVJlZlN0YWNrLnB1c2gobmFtZSk7Ci0JCQkJcGFyc2luZ1BFUmVmU3RhY2sucHVzaChuZXcgQm9vbGVhbihwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkpOwotCi0JCQkJU3RyaW5nIHN5c3RlbUlkID0gZW4uZ2V0U3lzdGVtSWQoKTsKLQkJCQlTdHJpbmcgcHVibGljSWQgPSBlbi5nZXRQdWJsaWNJZCgpOwotCQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQkJCXBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlVUklSZXNvbHZlciBpZFJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsKLQkJCQkJU3RyaW5nIHVyaSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShjdXJyZW50RFRELmdldE5hbWUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCQkJaWYgKCFpc0RURExvYWRlZCh1cmkpKSB7Ci0JCQkJCQkvLyBub3QgbG9hZGVkCi0JCQkJCQkvLyBvdXQucHJpbnRsbigiIERURCBub3QgbG9hZGVkIC4uIGNyZWF0ZSBuZXcgRFREOiAiCi0JCQkJCQkvLyApOwotCQkJCQkJZHRkU3RhY2sucHVzaChjdXJyZW50RFREKTsKLQkJCQkJCURURCBuZXdEVEQgPSBuZXcgRFREKHVyaSk7Ci0JCQkJCQlkdGRMaXN0LmFkZEVsZW1lbnQobmV3RFREKTsKLQkJCQkJCWN1cnJlbnREVEQgPSBuZXdEVEQ7Ci0JCQkJCQlwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBvdXQucHJpbnRsbigiIERURCBhbHJlYWR5IGxvYWRlZCAuLiAiICk7Ci0JCQkJCQlwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpIHsKLQkJCVN0cmluZyB4cyA9IChTdHJpbmcpIHJlYWRlci5nZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMveG1sLXN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCQljb250ZW50U3RyaW5nICs9IHhzOwotCQl9Ci0JCWVudGl0eURlcHRoKys7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBlbmQgb2YgYW4gZW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgZW5kaW5nLgotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0JICogQHNlZSAjc3RhcnRFbnRpdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHMoIltkdGRdIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FTkRfRU5USVRZX0RURCk7Ci0JCX0KLQkJZWxzZSBpZiAoIXBlUmVmU3RhY2suZW1wdHkoKSkgewotCQkJcGFyc2VFeHRlcm5hbFBFUmVmZXJlbmNlKG5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpIHsKLQkJCWlmICghY29udGVudFN0cmluZy5lbmRzV2l0aChuYW1lICsgIjsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHhzID0gKFN0cmluZykgcmVhZGVyLmdldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy94bWwtc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250ZW50U3RyaW5nICs9IHhzOwotCQkJfQotCQl9Ci0JCWVudGl0eURlcHRoLS07Ci0JCWVudGl0eUVuZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VFeHRlcm5hbFBFUmVmZXJlbmNlKFN0cmluZyBuYW1lKSB7Ci0JCWlmICghcGVSZWZTdGFjay5lbXB0eSgpKSB7Ci0JCQlpZiAoKChTdHJpbmcpIHBlUmVmU3RhY2sucGVlaygpKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlwZVJlZlN0YWNrLnBvcCgpOwotCQkJCWlmIChwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJCQljdXJyZW50RFREID0gKERURCkgZHRkU3RhY2sucG9wKCk7Ci0JCQkJCWFkZFBFUmVmZXJlbmNlTm9kZShuYW1lKTsKLQkJCQl9Ci0JCQkJcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UgPSAoKEJvb2xlYW4pIHBhcnNpbmdQRVJlZlN0YWNrLnBvcCgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGFuIFhNTCBjb21tZW50IGFueXdoZXJlIGluIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgdXNlZCBmb3IgY29tbWVudHMgaW5zaWRlIG9yIG91dHNpZGUgdGhlIGRvY3VtZW50Ci0JICogZWxlbWVudCwgaW5jbHVkaW5nIGNvbW1lbnRzIGluIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IChpZiByZWFkKS4KLQkgKiAKLQkgKiBAcGFyYW0gY2gKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IGhvbGRpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGNvbW1lbnQuCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBUaGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UgZnJvbSB0aGUgYXJyYXkuCi0JICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21tZW50KGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5DT01NRU5UKTsKLQotCQlpZiAoY29tbWVudCA9PSBudWxsKQotCQkJY29tbWVudCA9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCQllbHNlCi0JCQljb21tZW50ICs9ICJcbiIgKyBuZXcgU3RyaW5nKGNoLCBzdGFydCwgbGVuZ3RoKTsgLy8gYXBwZW5kIGFsbCBjb21tZW50cy4gLy8kTk9OLU5MUy0xJAotCQkvLyBUaGUgY29tbWVudCB3aWxsIGdldCByZXNldCBhZnRlcgotCQkvLyBpdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgZm9sbG93aW5nCi0JCS8vIGRlY2xhcmF0aW9uLgotCX0KLQotCS8vCi0JLy8gRXJyb3JIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JLyogV2FybmluZy4gKi8KLQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBlcnJvciA9ICJbU291cmNlIExpbmVdICIgKyBkZWNsU3RyaW5nICsgY29udGVudFN0cmluZyArICJcbiI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQllcnJvciArPSAiW1dhcm5pbmcgICAgXSAiICsgZ2V0TG9jYXRpb25TdHJpbmcoZXgpICsgIjogIiArIGV4LmdldE1lc3NhZ2UoKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCXNldEVycm9ySW5mb3JtYXRpb24oZXgsICJ3YXJuaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qIEVycm9yLiAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBlcnJvciA9ICJbU291cmNlIExpbmVdICIgKyBkZWNsU3RyaW5nICsgY29udGVudFN0cmluZyArICJcbiI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQllcnJvciArPSAiW0Vycm9yICAgXSAiICsgZ2V0TG9jYXRpb25TdHJpbmcoZXgpICsgIjogIiArIGV4LmdldE1lc3NhZ2UoKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCXNldEVycm9ySW5mb3JtYXRpb24oZXgsICJlcnJvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKiBGYXRhbCBlcnJvci4gKi8KLQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVycm9yID0gIltTb3VyY2UgTGluZV0gIiArIGRlY2xTdHJpbmcgKyBjb250ZW50U3RyaW5nICsgIlxuIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWVycm9yICs9ICJbRmF0YWwgRXJyb3JdICIgKyBnZXRMb2NhdGlvblN0cmluZyhleCkgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJc2V0RXJyb3JJbmZvcm1hdGlvbihleCwgImZhdGFsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qIFJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGxvY2F0aW9uLiAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uU3RyaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJU3RyaW5nIHN5c3RlbUlkID0gZXguZ2V0U3lzdGVtSWQoKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IHN5c3RlbUlkLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpCi0JCQkJc3lzdGVtSWQgPSBzeXN0ZW1JZC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCXN0ci5hcHBlbmQoc3lzdGVtSWQpOwotCQl9Ci0JCXN0ci5hcHBlbmQoJzonKTsKLQkJc3RyLmFwcGVuZChleC5nZXRMaW5lTnVtYmVyKCkpOwotCQlzdHIuYXBwZW5kKCc6Jyk7Ci0JCXN0ci5hcHBlbmQoZXguZ2V0Q29sdW1uTnVtYmVyKCkpOwotCi0JCXJldHVybiBzdHIudG9TdHJpbmcoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydERlY2xhcmF0aW9uKGludCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IERlY2xOb2RlLkVORF9EVEQgfHwgdHlwZSA9PSBEZWNsTm9kZS5FTkRfRU5USVRZX0RURCB8fCB0eXBlID09IERlY2xOb2RlLkNPTU1FTlQgfHwgdHlwZSA9PSBEZWNsTm9kZS5FUlJPUikgewotCQkJcHJldmlvdXNEZWNsTm9kZSA9IGN1cnJlbnREZWNsTm9kZTsKLQkJCWN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljdXJyZW50RGVjbE5vZGUgPSBuZXcgRGVjbE5vZGUodHlwZSk7Ci0JCQljb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWRlY2xTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZXhwYW5kZWRFbnRpdHlWYWx1ZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKSB7Ci0JCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uSGVscGVyKGNvbnRlbnRTdHJpbmcpOwotCQljb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDdXJyZW50RGVjbGFyYXRpb25IZWxwZXIoU3RyaW5nIGRlY2xhcmF0aW9uU3RyaW5nKSB7Ci0JCURURFNjYW5uZXIgc2Nhbm5lcjsKLQkJU3RyaW5nIG5hbWU7Ci0KLQkJaWYgKGN1cnJlbnREZWNsTm9kZSA9PSBudWxsICYmIHByZXZpb3VzRGVjbE5vZGUgIT0gbnVsbCAmJiBlbnRpdHlFbmQpIHsKLQkJCWN1cnJlbnREZWNsTm9kZSA9IHByZXZpb3VzRGVjbE5vZGU7Ci0JCX0KLQotCQkvLyBzYXZlIHRoZSBwcmV2aW91cyBkZWNsTm9kZQotCQlpZiAoY3VycmVudERlY2xOb2RlICE9IG51bGwpIHsKLQkJCUJhc2VOb2RlIGJhc2VOb2RlID0gbnVsbDsKLQkJCS8vIHN0cmlwIG91dCB0aGUgZW5kaW5nIG1hcmt1cCBzeW1ib2wgIj4iCi0JCQlpZiAoZGVjbGFyYXRpb25TdHJpbmcuZW5kc1dpdGgoIj4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWRlY2xhcmF0aW9uU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKDAsIGRlY2xhcmF0aW9uU3RyaW5nLmxlbmd0aCgpIC0gMSk7Ci0KLQkJCWludCBzSW5kZXg7Ci0JCQlTdHJpbmcgY1N0cmluZzsKLQkJCWludCB0eXBlID0gY3VycmVudERlY2xOb2RlLmdldFR5cGUoKTsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgRGVjbE5vZGUuRUxFTUVOVCA6IHsKLQkJCQkJbmFtZSA9IFRTdHJpbmcud29yZChkZWNsYXJhdGlvblN0cmluZywgMSk7Ci0KLQkJCQkJLy8gc3RyaXAgb3V0IHRoZSBuYW1lCi0JCQkJCXNJbmRleCA9IGRlY2xhcmF0aW9uU3RyaW5nLmluZGV4T2YobmFtZSkgKyBuYW1lLmxlbmd0aCgpOwotCQkJCQljU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKHNJbmRleCk7Ci0KLQkJCQkJYmFzZU5vZGUgPSBuZXcgRWxlbWVudERlY2wobmFtZSwgY3VycmVudERURC5nZXROYW1lKCkpOwotCQkJCQlzY2FubmVyID0gbmV3IERURFNjYW5uZXIoY3VycmVudERURC5nZXROYW1lKCksIGNTdHJpbmcpOwotCQkJCQlDTU5vZGUgY29udGVudE1vZGVsID0gc2Nhbm5lci5zY2FuQ29udGVudE1vZGVsKCk7Ci0JCQkJCWlmIChjb250ZW50TW9kZWwgPT0gbnVsbCAmJiBlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCQkJY3JlYXRlRXJyb3JNZXNzYWdlKCJFeHBlY3RpbmcgJygnIGluIGNvbnRlbnQgbW9kZWwiLCAiZXJyb3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCQkoKEVsZW1lbnREZWNsKSBiYXNlTm9kZSkuc2V0Q29udGVudE1vZGVsTm9kZShjb250ZW50TW9kZWwpOwotCQkJCQllbGVtZW50UG9vbC5wdXQobmFtZSwgYmFzZU5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBEZWNsTm9kZS5JTlRFUk5BTF9FTlRJVFkgOgotCQkJCWNhc2UgRGVjbE5vZGUuRVhURVJOQUxfRU5USVRZIDogewotCQkJCQlpZiAoIXBhcnNlRXh0ZXJuYWxQRVJlZmVyZW5jZShkZWNsYXJhdGlvblN0cmluZykpIHsKLQkJCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgZGVjbGFyYXRpb25TdHJpbmcpOwotCQkJCQkJYmFzZU5vZGUgPSBzY2FubmVyLnNjYW5FbnRpdHlEZWNsKCk7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS1iYXNlTm9kZSAoIiArCi0JCQkJCQkvLyBkZWNsYXJhdGlvblN0cmluZyArICIpIiArIGJhc2VOb2RlKTsKLQkJCQkJCWlmICh0eXBlID09IERlY2xOb2RlLklOVEVSTkFMX0VOVElUWSAmJiBleHBhbmRlZEVudGl0eVZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkoKEVudGl0eURlY2wpIGJhc2VOb2RlKS5leHBhbmRlZFZhbHVlID0gZXhwYW5kZWRFbnRpdHlWYWx1ZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJZW50aXR5UG9vbC5hZGQoKEVudGl0eURlY2wpIGJhc2VOb2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIERlY2xOb2RlLk5PVEFUSU9OIDogewotCQkJCQlzY2FubmVyID0gbmV3IERURFNjYW5uZXIoY3VycmVudERURC5nZXROYW1lKCksIGRlY2xhcmF0aW9uU3RyaW5nKTsKLQkJCQkJYmFzZU5vZGUgPSBzY2FubmVyLnNjYW5Ob3RhdGlvbkRlY2woKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgRGVjbE5vZGUuQVRUTElTVCA6IHsKLQkJCQkJbmFtZSA9IFRTdHJpbmcud29yZChkZWNsYXJhdGlvblN0cmluZywgMSk7Ci0KLQkJCQkJLy8gc3RyaXAgb3V0IHRoZSBuYW1lCi0JCQkJCXNJbmRleCA9IGRlY2xhcmF0aW9uU3RyaW5nLmluZGV4T2YobmFtZSkgKyBuYW1lLmxlbmd0aCgpOwotCQkJCQljU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKHNJbmRleCk7Ci0KLQkJCQkJYmFzZU5vZGUgPSBuZXcgQXR0bGlzdChuYW1lLCBjdXJyZW50RFRELmdldE5hbWUoKSk7Ci0JCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgY1N0cmluZy50cmltKCkpOwotCQkJCQlWZWN0b3IgYXR0cnMgPSBzY2FubmVyLnNjYW5BdHRsaXN0RGVjbChlbnRpdHlQb29sKTsKLQkJCQkJU3RyaW5nIGVycm9yU3RyaW5nID0gc2Nhbm5lci5nZXRFcnJvclN0cmluZygpOwotCi0JCQkJCWlmIChhdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkoKEF0dGxpc3QpIGJhc2VOb2RlKS5zZXRBdHREZWZzKGF0dHJzKTsKLQkJCQkJfQotCQkJCQlpZiAoZXJyb3JTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJY3JlYXRlRXJyb3JNZXNzYWdlKGVycm9yU3RyaW5nLCAiZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0IDogewotCQkJCQljdXJyZW50RGVjbE5vZGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKSB7Ci0JCQkJCWJhc2VOb2RlLnNldENvbW1lbnQoY29tbWVudCk7Ci0JCQkJCWNvbW1lbnQgPSBudWxsOwotCQkJCX0KLQotCQkJCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQliYXNlTm9kZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoY3VycmVudERlY2xOb2RlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudERURC5hZGREZWNsKGJhc2VOb2RlKTsKLQkJCQl9Ci0JCQkJbGFzdEJhc2VOb2RlID0gYmFzZU5vZGU7Ci0JCQl9Ci0KLQkJCWN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobGFzdEJhc2VOb2RlICE9IG51bGwgJiYgZXJyb3JNZXNzYWdlICE9IG51bGwgJiYgbGFzdEJhc2VOb2RlLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQlsYXN0QmFzZU5vZGUuc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQRVJlZmVyZW5jZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsgLy8gc3RyaXAgb3V0IHRoZSAlIGZyb20gZW50aXR5IG5hbWUKLQkJfQotCQlFbnRpdHlEZWNsIGUgPSBuZXcgRW50aXR5RGVjbChuYW1lLCBjdXJyZW50RFRELmdldE5hbWUoKSwgbnVsbCwgdHJ1ZSk7Ci0JCWUuc2V0RW50aXR5UmVmZXJlbmNlZCh0cnVlKTsKLQkJZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJY3VycmVudERURC5hZGREZWNsKGUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RURExvYWRlZChTdHJpbmcgdXJpKSB7Ci0JCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JCVN0cmluZyBsaXN0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGR0ZExpc3QgIT0gbnVsbCkgewotCQkJRW51bWVyYXRpb24gZW4gPSBkdGRMaXN0LmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlEVEQgZHRkID0gKERURCkgZW4ubmV4dEVsZW1lbnQoKTsKLQkJCQlsaXN0ICs9IGR0ZC5nZXROYW1lKCk7Ci0JCQkJbGlzdCArPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZHRkLmdldE5hbWUoKS5lcXVhbHModXJpKSkgewotCQkJCQlsb2FkZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvYWRlZDsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCUlucHV0U291cmNlIHJlc3VsdCA9IG51bGw7Ci0JCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQlTdHJpbmcgbG9naWNhbFVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShjdXJyZW50RFRELmdldE5hbWUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgICAgLy8gYnVnIDExMzUzNywgZW5zdXJlIHBoeXNpY2FsIHJlc29sdXRpb24gZ2V0cyBkb25lIGhlcmUKLQkJLy8gcmlnaHQgYmVmb3JlIHdlIGF0dGVtcHQgdG8gb3BlbiBhIHN0cmVhbQotCQlTdHJpbmcgcGh5c2ljYWxVUkkgPSBpZFJlc29sdmVyLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBwdWJsaWNJZCwgbG9naWNhbFVSSSk7Ci0JCXJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZShsb2dpY2FsVVJJKTsKLQkJaWYoIShwaHlzaWNhbFVSSSA9PSBudWxsIHx8IHBoeXNpY2FsVVJJLmVxdWFscygiIikgfHwgVVJJSGVscGVyLmhhc1Byb3RvY29sKHBoeXNpY2FsVVJJKSkpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkgIHBoeXNpY2FsVVJJID0gImZpbGU6Ly8vIiArIHBoeXNpY2FsVVJJOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVzdWx0LnNldEJ5dGVTdHJlYW0obmV3IExhenlVUkxJbnB1dFN0cmVhbShwaHlzaWNhbFVSSSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vCi0JLy8gTWFpbgotCS8vCi0KLQkvKiogTWFpbiBwcm9ncmFtIGVudHJ5IHBvaW50LiAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLQotCQkvLyBpcyB0aGVyZSBhbnl0aGluZyB0byBkbz8KLQkJaWYgKGFyZ3YubGVuZ3RoID09IDApIHsKLQkJCXByaW50VXNhZ2UoKTsKLQkJCVN5c3RlbS5leGl0KDEpOwotCQl9Ci0KLQkJLy8gdmFycwotCQlib29sZWFuIGNhbm9uaWNhbCA9IGZhbHNlOwotCQlib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSBmYWxzZTsKLQkJRFREUGFyc2VyIHBhcnNlcjsKLQotCQkvLyBjaGVjayBwYXJhbWV0ZXJzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3ZbaV07Ci0KLQkJCS8vIG9wdGlvbnMKLQkJCWlmIChhcmcuc3RhcnRzV2l0aCgiLSIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWlmIChhcmcuZXF1YWxzKCItYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY2Fub25pY2FsID0gdHJ1ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGFyZy5lcXVhbHMoIi14IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlleHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdHJ1ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGFyZy5lcXVhbHMoIi1oIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmludFVzYWdlKCk7Ci0JCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcGFyc2VyID0gbmV3IERURFBhcnNlcihjYW5vbmljYWwpOwotCQkJCXBhcnNlci5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotCQkJCXBhcnNlci5wYXJzZShhcmcpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfSAvLyBtYWluKFN0cmluZ1tdKQotCi0JLyoqIFByaW50cyB0aGUgdXNhZ2UuICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotCi0JCVN5c3RlbS5lcnIucHJpbnRsbigidXNhZ2U6IGphdmEgc2F4LkRURFBhcnNlciAob3B0aW9ucykgdXJpIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5lcnIucHJpbnRsbigpOwotCQlTeXN0ZW0uZXJyLnByaW50bG4oIm9wdGlvbnM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCIgIC1jICAgICAgIENhbm9uaWNhbCBYTUwgb3V0cHV0LiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5lcnIucHJpbnRsbigiICAteCAgICAgICBFeHBhbmQgZW50aXR5IHJlZmVyZW5jZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCIgIC1oICAgICAgIFRoaXMgaGVscCBzY3JlZW4uIik7IC8vJE5PTi1OTFMtMSQKLQotCX0gLy8gcHJpbnRVc2FnZSgpCi0KLQlwcml2YXRlIHZvaWQgc2V0RXJyb3JJbmZvcm1hdGlvbihTQVhQYXJzZUV4Y2VwdGlvbiBleCwgU3RyaW5nIHNldmVyaXR5KSB7Ci0JCWVycm9yTWVzc2FnZSA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlpZiAoZXguZ2V0TGluZU51bWJlcigpID09IC0xKSB7Ci0JCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JMaW5lKGxpbmVOdW1iZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShleC5nZXRMaW5lTnVtYmVyKCkpOwotCQl9Ci0KLQotCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JNZXNzYWdlKGV4LmdldE1lc3NhZ2UoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRFcnJvckNvbHVtbihleC5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0JCWVycm9yTWVzc2FnZXMuYWRkKGVycm9yTWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHNldmVyaXR5KSB7Ci0JCWVycm9yTWVzc2FnZSA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlMb2NhdG9yIGxvY2F0b3IgPSBnZXRMb2NhdG9yKCk7Ci0KLQkJZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShsb2NhdG9yLmdldExpbmVOdW1iZXIoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRFcnJvckNvbHVtbihsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKLQotCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQllcnJvck1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCi0JCWVycm9yTWVzc2FnZXMuYWRkKGVycm9yTWVzc2FnZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERTYXhBcnRpZmFjdFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNheEFydGlmYWN0VmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkwNjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNheEFydGlmYWN0VmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERTYXhBcnRpZmFjdFZpc2l0b3IgewotCXB1YmxpYyB2b2lkIHZpc2l0RFREKERURCBkdGQpIHsKLQkJRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCi0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBFbnRpdHlEZWNsKSB7Ci0JCQkJdmlzaXRFbnRpdHlEZWNsKChFbnRpdHlEZWNsKSBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCkgewotCQkJCXZpc2l0RWxlbWVudERlY2woKEVsZW1lbnREZWNsKSBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBOb3RhdGlvbkRlY2wpIHsKLQkJCQl2aXNpdE5vdGF0aW9uRGVjbCgoTm90YXRpb25EZWNsKSBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Tm90YXRpb25EZWNsKE5vdGF0aW9uRGVjbCBub3RhdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2woRWxlbWVudERlY2wgZWxlbWVudCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCQlpZiAoZW50aXR5LmlzRW50aXR5UmVmZXJlbmNlZCgpKSB7Ci0JCQl2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woZW50aXR5KTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChlbnRpdHkuaXNFeHRlcm5hbCgpKSB7Ci0JCQkJdmlzaXRFeHRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsKGVudGl0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsRW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVjZWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogU2Nhbm5pbmcgLyBwYXJzaW5nIHRoZSBjb250ZW50IHN0cmluZyBmcm9tIHRoZSBEZWNsIHN0YXRlbWVudAotICogCi0gKiBAdmVyc2lvbgotICovCi1wdWJsaWMgY2xhc3MgRFREU2Nhbm5lciB7Ci0JLy8gZWxlbWVudCBjb250ZW50IG1vZGVsIHN0cmluZ3MKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gZW1wdHlfc3RyaW5nID0geydFJywgJ00nLCAnUCcsICdUJywgJ1knfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gYW55X3N0cmluZyA9IHsnQScsICdOJywgJ1knfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcGNkYXRhX3N0cmluZyA9IHsnIycsICdQJywgJ0MnLCAnRCcsICdBJywgJ1QnLCAnQSd9OwotCi0JLy8gYXR0cmlidXRlIHR5cGUgYW5kIGRlZmF1bHQgdHlwZSBzdHJpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGNkYXRhX3N0cmluZyA9IHsnQycsICdEJywgJ0EnLCAnVCcsICdBJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGlkX3N0cmluZyA9IHsnSScsICdEJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHJlZl9zdHJpbmcgPSB7J1InLCAnRScsICdGJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGVudGl0X3N0cmluZyA9IHsnRScsICdOJywgJ1QnLCAnSScsICdUJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGllc19zdHJpbmcgPSB7J0knLCAnRScsICdTJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIG5tdG9rZW5fc3RyaW5nID0geydOJywgJ00nLCAnVCcsICdPJywgJ0snLCAnRScsICdOJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIG5vdGF0aW9uX3N0cmluZyA9IHsnTicsICdPJywgJ1QnLCAnQScsICdUJywgJ0knLCAnTycsICdOJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHJlcXVpcmVkX3N0cmluZyA9IHsnIycsICdSJywgJ0UnLCAnUScsICdVJywgJ0knLCAnUicsICdFJywgJ0QnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaW1wbGllZF9zdHJpbmcgPSB7JyMnLCAnSScsICdNJywgJ1AnLCAnTCcsICdJJywgJ0UnLCAnRCd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBmaXhlZF9zdHJpbmcgPSB7JyMnLCAnRicsICdJJywgJ1gnLCAnRScsICdEJ307Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gc3lzdGVtX3N0cmluZyA9IHsnUycsICdZJywgJ1MnLCAnVCcsICdFJywgJ00nfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcHVibGljX3N0cmluZyA9IHsnUCcsICdVJywgJ0InLCAnTCcsICdJJywgJ0MnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gbmRhdGFfc3RyaW5nID0geydOJywgJ0QnLCAnQScsICdUJywgJ0EnfTsKLQotCXByaXZhdGUgaW50W10gZk9wU3RhY2sgPSBudWxsOwotCXByaXZhdGUgQ01Hcm91cE5vZGVbXSBmR3JwU3RhY2sgPSBudWxsOwotCi0JcHJpdmF0ZSBFbnRpdHlQb29sIGVudGl0eVBvb2w7Ci0KLQkvKiBBdHRyaWJ1dGUgRGVmIHNjYW5uZXIgc3RhdGUgKi8KLQlzdGF0aWMgZmluYWwgaW50IEF0dF9TY2FubmVyX1N0YXRlX05hbWUgPSAxLCBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlID0gMiwgQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUgPSAzLCBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWUgPSA0OwotCi0JcHJpdmF0ZSBTdHJpbmdQYXJzZXIgY29udGVudFN0cmluZzsKLQlwcml2YXRlIFN0cmluZyBjRGF0YTsKLQlwcml2YXRlIGludCBwcmV2Tm9kZU9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbm9kZU9mZnNldCA9IDE7Ci0JcHJpdmF0ZSBTdHJpbmcgb3duZXJEVEQ7Ci0KLQlwcml2YXRlIFN0cmluZyBlcnJvclN0cmluZzsKLQotCXB1YmxpYyBEVERTY2FubmVyKFN0cmluZyBvd25lckRURCwgU3RyaW5nIGNtKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ206ICIgKyBjbSk7Ci0JCWNvbnRlbnRTdHJpbmcgPSBuZXcgU3RyaW5nUGFyc2VyKGNtKTsKLQkJY0RhdGEgPSBjbTsKLQkJdGhpcy5vd25lckRURCA9IG93bmVyRFREOwotCX0KLQotCS8vCi0JLy8gWzQ2XSBjb250ZW50c3BlYyA6Oj0gJ0VNUFRZJyB8ICdBTlknIHwgTWl4ZWQgfCBjaGlsZHJlbgotCS8vCi0JLy8gU3BlY2lmaWMgdG8gVmlzdWFsRFREIDogYWxzbyBhbGxvd3MgJVBFUmVmZXJlbmNlOwotCS8vCi0JcHVibGljIENNTm9kZSBzY2FuQ29udGVudE1vZGVsKCkgewotCQlDTU5vZGUgY21Ob2RlID0gbnVsbDsKLQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGVtcHR5X3N0cmluZykpIHsKLQkJCWNtTm9kZSA9IG5ldyBDTUJhc2ljTm9kZSgiRU1QVFkiLCBDTU5vZGVUeXBlLkVNUFRZKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhhbnlfc3RyaW5nKSkgewotCQkJY21Ob2RlID0gbmV3IENNQmFzaWNOb2RlKCJBTlkiLCBDTU5vZGVUeXBlLkFOWSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyUnLCB0cnVlKSkgewotCQkJY21Ob2RlID0gbmV3IENNUmVmZXJlbmNlTm9kZShjb250ZW50U3RyaW5nLmdldERhdGEoKSwgQ01Ob2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJfQotCQllbHNlIGlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCS8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgY29udGVudG1vZGVsIHN0cmluZyBpcyBiYWQuLi4KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiISEhIGV4Y2VwdGlvbiAtIG5vICgiKTsKLQkJCXJldHVybiBjbU5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbWFpbmluZyBTdHJpbmcgPSAiICsKLQkJCS8vIGNvbnRlbnRTdHJpbmcuZ2V0UmVtYWluaW5nU3RyaW5nKCkpOwotCi0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlib29sZWFuIHNraXBwZWRQQ0RBVEEgPSBjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcocGNkYXRhX3N0cmluZyk7Ci0JCQlpZiAoc2tpcHBlZFBDREFUQSkgewotCQkJCWNtTm9kZSA9IHNjYW5NaXhlZCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY21Ob2RlID0gc2NhbkNoaWxkcmVuKCk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gY21Ob2RlOwotCX0KLQotCS8vCi0JLy8gWzUxXSBNaXhlZCA6Oj0gJygnIFM/ICcjUENEQVRBJyAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAnKSonIHwgJygnIFM/Ci0JLy8gJyNQQ0RBVEEnIFM/ICcpJwotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nIHBhc3QgJygnIFM/ICcjUENEQVRBJwotCS8vCi0JcHJpdmF0ZSBDTU5vZGUgc2Nhbk1peGVkKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNjYW5NaXhlZC4uLiIpOwotCQlDTUdyb3VwTm9kZSBjbU5vZGUgPSBuZXcgQ01Hcm91cE5vZGUoKTsKLQkJY21Ob2RlLnNldEdyb3VwS2luZChDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSk7Ci0JCWNtTm9kZS5hZGRDaGlsZChuZXcgQ01CYXNpY05vZGUoIiNQQ0RBVEEiLCBDTU5vZGVUeXBlLlBDREFUQSkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaW50IHByZXZOb2RlSW5kZXggPSAtMTsKLQkJYm9vbGVhbiBzdGFyUmVxdWlyZWQgPSBmYWxzZTsKLQotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCX0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCd8JywgdHJ1ZSkpIHsKLQkJCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKScsIHRydWUpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcqJywgdHJ1ZSkpIHsKLQkJCQkJY21Ob2RlLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChzdGFyUmVxdWlyZWQpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgKiBpcyByZXF1aXJlZCAuLi4gIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCX0KLQotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJaWYgKG5vZGVPZmZzZXQgIT0gLTEpIHsKLQkJCQkvLyBza2lwIHBhc3MgInwiCi0JCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCQkJfQotCi0JCQlzdGFyUmVxdWlyZWQgPSB0cnVlOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZSgnKScpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobm9kZU9mZnNldCA9PSAtMSkKLQkJCQlicmVhazsKLQotCQkJLy8gYWRkIGxlYXZlIG5vZGUKLQkJCWludCBsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCQkJaWYgKHJlZk5hbWUuc3RhcnRzV2l0aCgiJSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY21Ob2RlLmFkZENoaWxkKG5ldyBDTVJlZmVyZW5jZU5vZGUocmVmTmFtZSwgQ01Ob2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFKSk7Ci0JCQllbHNlCi0JCQkJY21Ob2RlLmFkZENoaWxkKG5ldyBDTVJlZmVyZW5jZU5vZGUocmVmTmFtZSwgQ01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSkpOwotCi0JCX0gLy8gZW5kIHdoaWxlCi0KLQotCQlpZiAoY21Ob2RlLmdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEpIHsKLQkJCS8vIHNpbXBsaWZ5IHRoZSBjb250ZW50TW9kZWwgaWYgdGhlIENNR3JvdXBOb2RlIG9ubHkgaGFzIG9uZSBjaGlsZAotCQkJLy8gbm9kZS4KLQkJCXJldHVybiAoQ01CYXNpY05vZGUpIGNtTm9kZS5nZXRDaGlsZHJlbigpLmVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCXJldHVybiBjbU5vZGU7Ci0JfQotCi0JLy8KLQkvLyBbNDddIGNoaWxkcmVuIDo6PSAoY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8KLQkvLyBbNDldIGNob2ljZSA6Oj0gJygnIFM/IGNwICggUz8gJ3wnIFM/IGNwICkqIFM/ICcpJwotCS8vIFs1MF0gc2VxIDo6PSAnKCcgUz8gY3AgKCBTPyAnLCcgUz8gY3AgKSogUz8gJyknCi0JLy8gWzQ4XSBjcCA6Oj0gKE5hbWUgfCBjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPwotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nIHBhc3QgJygnCi0KLQlwcml2YXRlIENNTm9kZSBzY2FuQ2hpbGRyZW4oKSB7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuQ2hpbGRyZW4uLi4iKTsKLQotCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQl9Ci0KLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlpbnQgZGVwdGggPSAxOwotCQlpbml0aWFsaXplQ29udGVudE1vZGVsU3RhY2soZGVwdGgpOwotCQlpbnQgbGVuOwotCi0JCVN0cmluZyBub2RlTmFtZTsKLQkJQ01Hcm91cE5vZGUgY21Ob2RlID0gbmV3IENNR3JvdXBOb2RlKCk7Ci0JCWZHcnBTdGFja1tkZXB0aF0gPSBjbU5vZGU7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgQmVnaW4gb3V0dGVyIHdoaWxlIGxvb3AgLi4uIiApOwotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQkJLy8gc2tpcCBwYXN0IGFueSB3aGl0ZSBzcGFjZXMgYWZ0ZXIgdGhlICcoJwotCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJfQotCi0JCQkJZGVwdGgrKzsKLQkJCQlpbml0aWFsaXplQ29udGVudE1vZGVsU3RhY2soZGVwdGgpOwotCQkJCWZHcnBTdGFja1tkZXB0aF0gPSBuZXcgQ01Hcm91cE5vZGUoKTsKLQkJCQlmR3JwU3RhY2tbZGVwdGggLSAxXS5hZGRDaGlsZChmR3JwU3RhY2tbZGVwdGhdKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lQW5kUEVSZWZlcmVuY2UoJyknKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJLyoKLQkJCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiIHByZXZOb2RlT0Zmc2V0ICIgKyBwcmV2Tm9kZU9mZnNldCk7Ci0JCQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIiBjdXJyZW50Tm9kZU9GZnNldCAiICsgbm9kZU9mZnNldCk7Ci0JCQkgKi8KLQotCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCi0JCQlpZiAobm9kZU9mZnNldCA9PSAtMSB8fCBsZW4gPCAxKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCW5vZGVOYW1lID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0KLQkJCUNNUmVwZWF0YWJsZU5vZGUgcm47Ci0JCQlpZiAobm9kZU5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlybiA9IG5ldyBDTVJlZmVyZW5jZU5vZGUobm9kZU5hbWUsIENNTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlybiA9IG5ldyBDTVJlZmVyZW5jZU5vZGUobm9kZU5hbWUsIENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpOwotCQkJfQotCi0JCQlmR3JwU3RhY2tbZGVwdGhdLmFkZENoaWxkKHJuKTsKLQotCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCi0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCc/JywgdHJ1ZSkpIHsKLQkJCQlybi5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuT1BUSU9OQUwpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcqJywgdHJ1ZSkpIHsKLQkJCQlybi5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuWkVST19PUl9NT1JFKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKycsIHRydWUpKSB7Ci0JCQkJcm4uc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKTsKLQkJCX0KLQotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQl9Ci0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgQmVnaW4gaW5uZXIgd2hpbGUgbG9vcCAuLi4gZGVwdGggIiArCi0JCQkJLy8gZGVwdGggKTsKLQkJCQlpZiAoZk9wU3RhY2tbZGVwdGhdICE9IENNTm9kZVR5cGUuR1JPVVBfU0VRVUVOQ0UgJiYgY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCd8JywgdHJ1ZSkpIHsKLQkJCQkJZk9wU3RhY2tbZGVwdGhdID0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0U7Ci0JCQkJCWZHcnBTdGFja1tkZXB0aF0uc2V0R3JvdXBLaW5kKENNTm9kZVR5cGUuR1JPVVBfQ0hPSUNFKTsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmIChmT3BTdGFja1tkZXB0aF0gIT0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UgJiYgY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcsJywgdHJ1ZSkpIHsKLQkJCQkJZk9wU3RhY2tbZGVwdGhdID0gQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRTsKLQkJCQkJZkdycFN0YWNrW2RlcHRoXS5zZXRHcm91cEtpbmQoQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRSk7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyknLCB0cnVlKSkgewotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZXJyb3IgKSBub3QgZm91bmQiKTsKLQkJCQkJfQotCQkJCQkvLyBlbmQgb2YgdGhlIGN1cmVudCBncm91cCBub2RlCi0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJz8nLCB0cnVlKSkgewotCQkJCQkJZkdycFN0YWNrW2RlcHRoXS5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuT1BUSU9OQUwpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKicsIHRydWUpKSB7Ci0JCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKycsIHRydWUpKSB7Ci0JCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5PTkVfT1JfTU9SRSk7Ci0JCQkJCX0KLQkJCQkJZGVwdGgtLTsKLQkJCQkJaWYgKGRlcHRoID09IDApIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIEVuZCBlbmQgaW5uZXIgd2hpbGUgbG9vcCAuLi4gZGVwdGgKLQkJCQkJLy8gIiArIGRlcHRoICk7Ci0KLQkJCQl9Ci0JCQl9IC8vIGlubmVyIHdoaWxlCi0KLQkJCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gLy8gb3V0ZXIgd2hpbGUKLQotCQlpZiAoY21Ob2RlLmdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEpIHsKLQkJCS8vIHNpbXBsaWZ5IHRoZSBjb250ZW50TW9kZWwgaWYgdGhlIENNR3JvdXBOb2RlIG9ubHkgaGFzIG9uZSBjaGlsZAotCQkJLy8gbm9kZSBhbmQgdGhhdCBub2RlIGlzIGFuIGVsZW1lbnQgcmVmLgotCQkJQ01SZXBlYXRhYmxlTm9kZSBybiA9IChDTVJlcGVhdGFibGVOb2RlKSBjbU5vZGUuZ2V0Q2hpbGRyZW4oKS5lbGVtZW50QXQoMCk7Ci0JCQlpZiAocm4gaW5zdGFuY2VvZiBDTVJlZmVyZW5jZU5vZGUpIHsKLQkJCQlDTVJlZmVyZW5jZU5vZGUgcmVmID0gKENNUmVmZXJlbmNlTm9kZSkgcm47Ci0JCQkJaWYgKHJlZi5nZXRUeXBlKCkgPT0gQ01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSkgewotCQkJCQlpZiAocmVmLmdldE9jY3VycmVuY2UoKSA9PSBDTU5vZGVUeXBlLk9ORSkgewotCQkJCQkJcmVmLnNldE9jY3VycmVuY2UoY21Ob2RlLmdldE9jY3VycmVuY2UoKSk7Ci0JCQkJCQlyZXR1cm4gcmVmOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNtTm9kZS5nZXRPY2N1cnJlbmNlKCkgPT0gQ01Ob2RlVHlwZS5PTkUpIHsKLQkJCQkJCXJldHVybiByZWY7Ci0JCQkJCX0KLQkJCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNtTm9kZTsKLQl9Ci0KLQkvLwotCS8vIFs1Ml0gQXR0bGlzdERlY2wgOjo9ICc8IUFUVExJU1QnIFMgTmFtZSBBdHREZWYqIFM/ICc+JwotCS8vIFs1M10gQXR0RGVmIDo6PSBTIE5hbWUgUyBBdHRUeXBlIFMgRGVmYXVsdERlY2wKLQkvLyBbNjBdIERlZmF1bHREZWNsIDo6PSAnI1JFUVVJUkVEJyB8ICcjSU1QTElFRCcgfCAoKCcjRklYRUQnIFMpPwotCS8vIEF0dFZhbHVlKQotCS8vCi0KLQlwdWJsaWMgVmVjdG9yIHNjYW5BdHRsaXN0RGVjbChFbnRpdHlQb29sIGVudGl0eVBvb2wpIHsKLQkJVmVjdG9yIGF0dExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCXRoaXMuZW50aXR5UG9vbCA9IGVudGl0eVBvb2w7Ci0KLQkJaW50IHNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX05hbWU7Ci0JCQotCQlBdHROb2RlIGF0dE5vZGU7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCWF0dE5vZGUgPSBuZXcgQXR0Tm9kZSgpOwotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBzY2FubmVyIHN0YXRlOiAiICsgc2Nhbm5lclN0YXRlKTsKLQotCQkJLy8gc2Nhbm5pbmcgYXR0IG5hbWUKLQkJCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2NhbiBhdHQgTmFtZS4uLiIpOwotCQkJCXNjYW5uZXJTdGF0ZSA9IGNoZWNrRm9yQXR0cmlidXRlV2l0aFBFUmVmZXJlbmNlKGF0dE5vZGUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSAtMSkgewotCQkJCQlyZXR1cm4gYXR0TGlzdDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNjYW5uaW5nIGF0dCB0eXBlCi0JCQlpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX1R5cGUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW4gYXR0IHR5cGUuLi4iKTsKLQotCQkJCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoY2RhdGFfc3RyaW5nKSkgewotCQkJCQlhdHROb2RlLnR5cGUgPSBuZXcgU3RyaW5nKGNkYXRhX3N0cmluZyk7Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoaWRfc3RyaW5nKSkgewotCQkJCQlpZiAoIWNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhyZWZfc3RyaW5nKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gbmV3IFN0cmluZyhpZF9zdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1MnLCB0cnVlKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIklEUkVGIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIklEUkVGUyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGVudGl0X3N0cmluZykpIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignWScsIHRydWUpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiRU5USVRZIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhpZXNfc3RyaW5nKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIkVOVElUSUVTIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcobm10b2tlbl9zdHJpbmcpKSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1MnLCB0cnVlKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIk5NVE9LRU5TIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIk5NVE9LRU4iOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhub3RhdGlvbl9zdHJpbmcpKSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgbWlzc2luZyAoIGluIG5vdGF0aW9uICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJYXR0Tm9kZS50eXBlID0gIk5PVEFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlhdHROb2RlLmVudW1MaXN0ID0gc2NhbkVudW1lcmF0aW9uKGNvbnRlbnRTdHJpbmcsIHRydWUpOwotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCQkJYXR0Tm9kZS50eXBlID0gIkVOVU1FUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlhdHROb2RlLmVudW1MaXN0ID0gc2NhbkVudW1lcmF0aW9uKGNvbnRlbnRTdHJpbmcsIGZhbHNlKTsKLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzY2FubmVyU3RhdGUgPSBjaGVja0ZvckF0dHJpYnV0ZVdpdGhQRVJlZmVyZW5jZShhdHROb2RlLCBzY2FubmVyU3RhdGUpOwotCQkJCQlpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX1R5cGUpIHsKLQkJCQkJCXNldEVycm9yU3RyaW5nKCJGYWlsZWQgdG8gZmluZCB0eXBlIGZvciBhdHRyaWJ1dGUgJyIgKyBhdHROb2RlLm5hbWUgKyAiJy4gIFBsZWFzZSByZWZlciB0byB0aGUgb3JpZ2luYWwgRFREIGZpbGUuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLy8gd2UgZmFpbGVkIHRvIGZpbmQgYSB0eXBlIGZvciB0aGlzIGF0dHJpYnV0ZQotCQkJCQkJcmV0dXJuIGF0dExpc3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUpIHsKLQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuIGRlZmF1bHQgdHlwZS4uLiIpOwotCQkJCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcocmVxdWlyZWRfc3RyaW5nKSkgewotCQkJCQlhdHROb2RlLmRlZmF1bHRUeXBlID0gbmV3IFN0cmluZyhyZXF1aXJlZF9zdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoaW1wbGllZF9zdHJpbmcpKSB7Ci0JCQkJCWF0dE5vZGUuZGVmYXVsdFR5cGUgPSBuZXcgU3RyaW5nKGltcGxpZWRfc3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoZml4ZWRfc3RyaW5nKSkgewotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9IG5ldyBTdHJpbmcoZml4ZWRfc3RyaW5nKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQkvLyAiZGVmYXVsdCIKLQkJCQkJCWF0dE5vZGUuZGVmYXVsdFR5cGUgPSAiTk9GSVhFRCI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJYXR0Tm9kZS5kZWZhdWx0VmFsdWUgPSBzY2FuRGVmYXVsdEF0dFZhbHVlKGNvbnRlbnRTdHJpbmcpOwotCQkJCX0KLQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lOyAvLyBuZXh0Ci0JCQl9Ci0KLQotCQkJYXR0TGlzdC5hZGRFbGVtZW50KGF0dE5vZGUpOwotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobm9kZU9mZnNldCA+PSBjRGF0YS5sZW5ndGgoKSkKLQkJCQlyZXR1cm4gYXR0TGlzdDsKLQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQl9Ly8gZW5kIHdoaWxlIGxvb3AKLQl9Ci0KLQkvLwotCS8vIGNvbnRlbnQgbW9kZWwgc3RhY2sKLQkvLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udGVudE1vZGVsU3RhY2soaW50IGRlcHRoKSB7Ci0JCWlmIChmT3BTdGFjayA9PSBudWxsKSB7Ci0JCQlmT3BTdGFjayA9IG5ldyBpbnRbOF07Ci0JCQlmR3JwU3RhY2sgPSBuZXcgQ01Hcm91cE5vZGVbOF07Ci0JCX0KLQkJZWxzZSBpZiAoZGVwdGggPT0gZk9wU3RhY2subGVuZ3RoKSB7Ci0JCQlpbnRbXSBuZXdTdGFjayA9IG5ldyBpbnRbZGVwdGggKiAyXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZk9wU3RhY2ssIDAsIG5ld1N0YWNrLCAwLCBkZXB0aCk7Ci0JCQlmT3BTdGFjayA9IG5ld1N0YWNrOwotCi0JCQlDTUdyb3VwTm9kZVtdIG5ld0dycFN0YWNrID0gbmV3IENNR3JvdXBOb2RlW2RlcHRoICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZHcnBTdGFjaywgMCwgbmV3R3JwU3RhY2ssIDAsIGRlcHRoKTsKLQkJCWZHcnBTdGFjayA9IG5ld0dycFN0YWNrOwotCQl9Ci0JCWZPcFN0YWNrW2RlcHRoXSA9IC0xOwotCQlmR3JwU3RhY2tbZGVwdGhdID0gbnVsbDsKLQl9Ci0KLQkvLwotCXByaXZhdGUgaW50IGNoZWNrRm9yQXR0cmlidXRlV2l0aFBFUmVmZXJlbmNlKEF0dE5vZGUgYXR0Tm9kZSwgaW50IHNjYW5uZXJTdGF0ZSkgewotCQlpbnQgc3RhdGUgPSAtMTsKLQkJaW50IGxlbjsKLQkJU3RyaW5nIHJhd1RleHQ7Ci0JCUVudGl0eURlY2wgcEVudGl0eTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjaGVja2ZvckFUVFBFUlJlZmVyZW5jZS0gc3RhcnQgc2Nhbm5lclN0YXRlOiAiCi0JCS8vICsgc2Nhbm5lclN0YXRlKTsKLQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZUFuZFBFUmVmZXJlbmNlKCcgJyk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0KLQkJCXJhd1RleHQgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCWF0dE5vZGUubmFtZSA9IHJhd1RleHQ7Ci0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGVfbmFtZSA6ICIgKyByYXdUZXh0KTsKLQotCQkJaWYgKHJhd1RleHQuc3RhcnRzV2l0aCgiJSIpICYmIHJhd1RleHQuZW5kc1dpdGgoIjsiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgcGUgPSByYXdUZXh0LnN1YnN0cmluZygxLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSk7Ci0KLQkJCQlwRW50aXR5ID0gZW50aXR5UG9vbC5yZWZlclBhcmEocGUpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgbmFtZSA6IiArIHJhd1RleHQgKyIgZXhwYW5kVG86IiArCi0JCQkJCS8vIHBFbnRpdHkuZXhwYW5kZWRWYWx1ZSk7Ci0JCQkJCXN0YXRlID0gd2hhdElzVGhlTmV4dEF0dHJpYnV0ZVNjYW5uaW5nU3RhdGUocEVudGl0eS5leHBhbmRlZFZhbHVlLCBzY2FubmVyU3RhdGUpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNrRm9yQXR0cndpdGhQRVIgLSBuZXh0c3RhdGU6ICIKLQkJCQkJLy8gKyBzdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlOwotCQkJfQotCQkJZWxzZQotCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZTsKLQotCQl9Ci0JCWVsc2UgaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCQlyYXdUZXh0ID0gZ2V0UEVOYW1lKCk7Ci0JCQkJYXR0Tm9kZS50eXBlID0gIiUiICsgcmF3VGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwZU5hbWUgPSByYXdUZXh0LnN1YnN0cmluZygwLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZV90eXBlIDogcGUtICIgKyBwZU5hbWUpOwotCQkJCXBFbnRpdHkgPSBlbnRpdHlQb29sLnJlZmVyUGFyYShwZU5hbWUpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJc3RhdGUgPSB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShwRW50aXR5LmV4cGFuZGVkVmFsdWUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX1R5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCQlyYXdUZXh0ID0gZ2V0UEVOYW1lKCk7Ci0JCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9IHJhd1RleHQ7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZV9kZWZhdWx0VHlwZSA6ICIgKyByYXdUZXh0KTsKLQkJCQlwRW50aXR5ID0gZW50aXR5UG9vbC5yZWZlclBhcmEocmF3VGV4dC5zdWJzdHJpbmcoMSwgcmF3VGV4dC5sZW5ndGgoKSAtIDEpKTsKLQkJCQlpZiAocEVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCXN0YXRlID0gd2hhdElzVGhlTmV4dEF0dHJpYnV0ZVNjYW5uaW5nU3RhdGUocEVudGl0eS5leHBhbmRlZFZhbHVlLCBzY2FubmVyU3RhdGUpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFZhbHVlOwotCQkJfQotCQkJZWxzZQotCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRWYWx1ZSkgewotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQkJcmF3VGV4dCA9IGdldFBFTmFtZSgpOwotCQkJCWF0dE5vZGUuZGVmYXVsdFZhbHVlID0gcmF3VGV4dDsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlX2RlZmF1bHRWYWx1ZSA6ICIgKyByYXdUZXh0KTsKLQotCQkJCXBFbnRpdHkgPSBlbnRpdHlQb29sLnJlZmVyUGFyYShyYXdUZXh0LnN1YnN0cmluZygxLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSkpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJc3RhdGUgPSB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShwRW50aXR5LmV4cGFuZGVkVmFsdWUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWU7Ci0JCX0KLQotCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBFTmFtZSgpIHsKLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKCc7JywgdHJ1ZSk7Ci0JCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJaW50IGxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJcmV0dXJuIGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCX0KLQotCXByaXZhdGUgaW50IHdoYXRJc1RoZU5leHRBdHRyaWJ1dGVTY2FubmluZ1N0YXRlKFN0cmluZyBhdHRyQ29udGVudFN0cmluZywgaW50IGN1cnJlbnRTdGF0ZSkgewotCQlTdHJpbmdQYXJzZXIgc3AgPSBuZXcgU3RyaW5nUGFyc2VyKGF0dHJDb250ZW50U3RyaW5nLnRyaW0oKSk7Ci0KLQotCQlpbnQgbmV4dFN0YXRlID0gY3VycmVudFN0YXRlOwotCQlpbnQgbk9mZnNldCA9IDA7Ci0KLQkJLyoKLQkJICogU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IEF0dENvbnRlbnRTdHJpbmd0IDogIiArCi0JCSAqIGF0dHJDb250ZW50U3RyaW5nKTsgU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0Ci0JCSAqIEF0dENvbnRlbnRTdHJpbmdMIDogIiArIGF0dHJDb250ZW50U3RyaW5nLmxlbmd0aCgpKTsKLQkJICogU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IGN1cnJlbnRzdGF0ZSA6ICIgKyBjdXJyZW50U3RhdGUpOwotCQkgKi8KLQotCQl3aGlsZSAodHJ1ZSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IGluc2lkZSB3aGlsIG5leHRzdGF0ZSA6ICIgKwotCQkJLy8gbmV4dFN0YXRlKTsKLQkJCWlmIChuZXh0U3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZSkgeyAvLyB0aGUgY3VycmVudAotCQkJCQkJCQkJCQkJCQkvLyBzY2FubmluZyBzdGF0ZSBpcwotCQkJCQkJCQkJCQkJCQkvLyBBdHRyIE5hbWUsIGlzIHRoZQotCQkJCQkJCQkJCQkJCQkvLyBuZXh0IHBhcnQgQXR0ciBUeXBlCi0JCQkJCQkJCQkJCQkJCS8vID8KLQkJCQlpZiAoaXNBdHRyTmFtZShzcCkpIHsKLQkJCQkJbmV4dFN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXh0U3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZSkgeyAvLyB0aGUgY3VycmVudAotCQkJCQkJCQkJCQkJCQkJLy8gc2Nhbm5pbmcgc3RhdGUKLQkJCQkJCQkJCQkJCQkJCS8vIGlzIEF0dHIgVHlwZSwKLQkJCQkJCQkJCQkJCQkJCS8vIGlzIHRoZSBuZXh0Ci0JCQkJCQkJCQkJCQkJCQkvLyBwYXJ0IERlZmF1bHQKLQkJCQkJCQkJCQkJCQkJCS8vIEF0dHIgVHlwZSA/Ci0KLQkJCQlpZiAoaXNBdHRyVHlwZShzcCkpIHsKLQkJCQkJbmV4dFN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IEF0dHIgUGFydCAtIGlzIG5vdCBhbiBBdHRyIFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl9Ci0KLQkJCWlmIChuZXh0U3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUpIHsKLQotCQkJCWludCBkVHlwZSA9IGlzQXR0ckRlZmF1bHRUeXBlKHNwKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgaW5zaWRlIGRUeXBlIDogIiArCi0JCQkJLy8gZFR5cGUpOwotCQkJCWlmIChkVHlwZSA9PSAxKSAvLyAjUkVRVUlSRUQgb3IgI0lNUExJRUQKLQkJCQl7Ci0JCQkJCW5leHRTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX05hbWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZFR5cGUgPT0gMikgLy8gI0ZJWEVECi0JCQkJCXsKLQkJCQkJCS8vIG5lZWQgdG8gbG9vayBhdCB0aGlzIGFnYWluCi0JCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQkJfQotCi0JCQkJCWlmIChzY2FuRGVmYXVsdEF0dFZhbHVlKHNwKSAhPSBudWxsKSB7Ci0JCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXNwLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJCWlmIChuT2Zmc2V0ID09IHNwLmdldEN1cnJlbnRPZmZzZXQoKSkKLQkJCQlicmVhazsKLQotCQkJbk9mZnNldCA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJaWYgKG5PZmZzZXQgPj0gYXR0ckNvbnRlbnRTdHJpbmcubGVuZ3RoKCkgfHwgbk9mZnNldCA9PSAtMSkKLQkJCQlicmVhazsKLQotCQl9IC8vIGVuZCB3aGlsZQotCi0JCXJldHVybiBuZXh0U3RhdGU7Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyTmFtZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJOYW1lIC0gc3A6IiArIHNwLmZEYXRhKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJOYW1lIC0gY3VycmVudE9mZnNldDoiICsKLQkJLy8gc3AuZ2V0Q3VycmVudE9mZnNldCgpKTsKLQkJYm9vbGVhbiBpc0F0dHJOYW1lID0gZmFsc2U7Ci0JCWludCBwcmV2ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlzcC5za2lwUGFzdE5hbWUoJyAnKTsKLQkJaWYgKChzcC5nZXRDdXJyZW50T2Zmc2V0KCkgLSBwcmV2KSA+IDApCi0JCQlpc0F0dHJOYW1lID0gdHJ1ZTsKLQkJcmV0dXJuIGlzQXR0ck5hbWU7Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyVHlwZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJUeXBlIC0gc3A6IiArIHNwLmZEYXRhKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJUeXBlIC0gY3VycmVudE9mZnNldDoiICsKLQkJLy8gc3AuZ2V0Q3VycmVudE9mZnNldCgpKTsKLQkJYm9vbGVhbiBpc0F0dHJUeXBlID0gZmFsc2U7Ci0JCWlmIChzcC5za2lwcGVkU3RyaW5nKGNkYXRhX3N0cmluZykpIHsKLQkJCWlzQXR0clR5cGUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoaWRfc3RyaW5nKSkgewotCQkJaWYgKCFzcC5za2lwcGVkU3RyaW5nKHJlZl9zdHJpbmcpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIElECi0JCQl9Ci0JCQllbHNlIGlmICghc3AubG9va2luZ0F0Q2hhcignUycsIHRydWUpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIElEUkVGUwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIElEUkVGCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhlbnRpdF9zdHJpbmcpKSB7Ci0JCQlpZiAoc3AubG9va2luZ0F0Q2hhcignWScsIHRydWUpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIEVOVElUWQotCQkJfQotCQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhpZXNfc3RyaW5nKSkgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBFTlRJVElURVMKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKG5tdG9rZW5fc3RyaW5nKSkgewotCQkJaWYgKHNwLmxvb2tpbmdBdENoYXIoJ1MnLCB0cnVlKSkgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBOTVRPS0VOUwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIE5NVE9LRU4KLQkJCX0KLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKG5vdGF0aW9uX3N0cmluZykpIHsKLQkJCWlmICghc3AubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgbWlzc2luZyAoIGluIG5vdGF0aW9uICIpOwotCQkJfQotCQkJVmVjdG9yIGVudW1MaXN0ID0gc2NhbkVudW1lcmF0aW9uKHNwLCB0cnVlKTsKLQkJCWlmIChlbnVtTGlzdCA9PSBudWxsIHx8IGVudW1MaXN0LnNpemUoKSA9PSAwKQotCQkJCWlzQXR0clR5cGUgPSBmYWxzZTsKLQkJCWVsc2UKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChzcC5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCS8vICJFTlVNRVJBVElPTiI7Ci0JCQlWZWN0b3IgZW51bUxpc3QgPSBzY2FuRW51bWVyYXRpb24oc3AsIGZhbHNlKTsKLQkJCWlmIChlbnVtTGlzdCA9PSBudWxsIHx8IGVudW1MaXN0LnNpemUoKSA9PSAwKQotCQkJCWlzQXR0clR5cGUgPSBmYWxzZTsKLQkJCWVsc2UKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBpc0F0dHJUeXBlOwotCi0JfQotCi0JLyoKLQkgKiByZXR1cm4gMCAtIG5vdCBkZWZhdWx0IHR5cGUgMSAtICNSRVFVSVJFRCBvciAjSU1QTElFRCAyIC0gI0ZJWEVECi0JICovCi0KLQlwcml2YXRlIGludCBpc0F0dHJEZWZhdWx0VHlwZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJEZWZhdWx0VHlwZSAtIHNwOiIgKyBzcC5mRGF0YSk7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpZiAoc3Auc2tpcHBlZFN0cmluZyhyZXF1aXJlZF9zdHJpbmcpKSB7Ci0JCQlyZXN1bHQgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoaW1wbGllZF9zdHJpbmcpKSB7Ci0JCQlyZXN1bHQgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoZml4ZWRfc3RyaW5nKSkgewotCQkJcmVzdWx0ID0gMjsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vCi0JLy8gWzU4XSBOb3RhdGlvblR5cGUgOjo9ICdOT1RBVElPTicgUyAnKCcgUz8gTmFtZSAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAnKScKLQkvLyBbNTldIEVudW1lcmF0aW9uIDo6PSAnKCcgUz8gTm10b2tlbiAoUz8gJ3wnIFM/IE5tdG9rZW4pKiBTPyAnKScKLQkvLwotCS8vIENhbGxlZCBhZnRlciBzY2FubmluZyAnKCcKLQkvLwotCXByaXZhdGUgVmVjdG9yIHNjYW5FbnVtZXJhdGlvbihTdHJpbmdQYXJzZXIgc3AsIGJvb2xlYW4gaXNOb3RhdGlvblR5cGUpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgc2NhbkVudW0gLi4uIik7Ci0JCVZlY3RvciBlbnVtTGlzdCA9IG51bGw7Ci0JCWludCBsZW47Ci0KLQkJaWYgKHNwLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQlpbnQgcHJldk5vZGVPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCWludCBub2RlT2Zmc2V0OwotCi0JCVN0cmluZyBub2RlTmFtZTsKLQotCQl3aGlsZSAodHJ1ZSkgewotCi0JCQlpZiAoaXNOb3RhdGlvblR5cGUpCi0JCQkJc3Auc2tpcFBhc3ROYW1lQW5kUEVSZWZlcmVuY2UoJyknKTsKLQkJCWVsc2UKLQkJCQlzcC5za2lwUGFzdE5tdG9rZW5BbmRQRVJlZmVyZW5jZSgnKScpOwotCi0JCQlub2RlT2Zmc2V0ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobm9kZU9mZnNldCA9PSAtMSkgewotCQkJCXJldHVybiBlbnVtTGlzdDsKLQkJCX0KLQotCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQkJbm9kZU5hbWUgPSBzcC5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0KLQkJCWlmIChlbnVtTGlzdCA9PSBudWxsKQotCQkJCWVudW1MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JCQllbnVtTGlzdC5hZGRFbGVtZW50KG5vZGVOYW1lKTsKLQotCQkJaWYgKHNwLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCXNwLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJCWlmICghc3AubG9va2luZ0F0Q2hhcignfCcsIHRydWUpKSB7Ci0JCQkJaWYgKCFzcC5sb29raW5nQXRDaGFyKCcpJywgdHJ1ZSkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzY2FubmluZyBlbnVtIHZhbHVlcyAtIGVycm9yIG1pc3NpbmcgJyknIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoc3AubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJcHJldk5vZGVPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGVudW1MaXN0OwotCX0KLQotCS8vCi0JLy8gWzEwXSBBdHRWYWx1ZSA6Oj0gJyInIChbXjwmIl0gfCBSZWZlcmVuY2UpKiAnIicKLQkvLyB8ICInIiAoW148JiddIHwgUmVmZXJlbmNlKSogIiciCi0JLy8KLQkvKioKLQkgKiBTY2FuIHRoZSBkZWZhdWx0IHZhbHVlIGluIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50VHlwZQotCSAqICAgICAgICAgICAgaGFuZGxlIHRvIHRoZSBlbGVtZW50IHRoYXQgb3ducyB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBoYW5kbGUgaW4gdGhlIHN0cmluZyBwb29sIGZvciB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKiBAcmV0dXJuIGhhbmRsZSBpbiB0aGUgc3RyaW5nIHBvb2wgZm9yIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2NhbkRlZmF1bHRBdHRWYWx1ZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuIGRlZmF1bHQgQVRUIFZhbHVlLi4uIHNwOiIgKyBzcC5mRGF0YSk7Ci0KLQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQlib29sZWFuIHNpbmdsZTsKLQkJaWYgKCEoc2luZ2xlID0gc3AubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgJiYgIXNwLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCWNoYXIgcWNoYXIgPSBzaW5nbGUgPyAnXCcnIDogJ1wiJzsKLQkJaW50IHNPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCS8vQlVHIDIwMzQ5NCAtIFNraXAgdG8gdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgcWNoYXIgdGhhdCB3YXkKLQkJLy8gYWxsIGNoYXJhY3RlcnMgYmV0d2VlbiBhcmUgb2J0YWluZWQKLQkJc3Auc2tpcFRvTGFzdE9mQ2hhcihxY2hhciwgdHJ1ZSk7Ci0JCWludCBsZW4gPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCkgLSBzT2Zmc2V0IC0gMTsKLQkJaWYgKGxlbiA9PSAwKQotCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQl2YWx1ZSA9IHNwLmdldFN0cmluZyhzT2Zmc2V0LCBsZW4pOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvLwotCS8vIFs3MF0gRW50aXR5RGVjbCA6Oj0gR0VEZWNsIHwgUEVEZWNsCi0JLy8gWzcxXSBHRURlY2wgOjo9ICc8IUVOVElUWScgUyBOYW1lIFMgRW50aXR5RGVmIFM/ICc+JwotCS8vIFs3Ml0gUEVEZWNsIDo6PSAnPCFFTlRJVFknIFMgJyUnIFMgTmFtZSBTIFBFRGVmIFM/ICc+JwotCS8vIFs3M10gRW50aXR5RGVmIDo6PSBFbnRpdHlWYWx1ZSB8IChFeHRlcm5hbElEIE5EYXRhRGVjbD8pCi0JLy8gWzc0XSBQRURlZiA6Oj0gRW50aXR5VmFsdWUgfCBFeHRlcm5hbElECi0JLy8gWzc1XSBFeHRlcm5hbElEIDo6PSAnU1lTVEVNJyBTIFN5c3RlbUxpdGVyYWwKLQkvLyB8ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsIFMgU3lzdGVtTGl0ZXJhbAotCS8vIFs3Nl0gTkRhdGFEZWNsIDo6PSBTICdOREFUQScgUyBOYW1lCi0JLy8gWzldIEVudGl0eVZhbHVlIDo6PSAnIicgKFteJSYiXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogJyInCi0JLy8gfCAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciCi0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgJ0VOVElUWScKLQkvLwotCXB1YmxpYyBFbnRpdHlEZWNsIHNjYW5FbnRpdHlEZWNsKCkgewotCQlwcmV2Tm9kZU9mZnNldCA9IDE7Ci0JCW5vZGVPZmZzZXQgPSAxOwotCQlpbnQgbGVuOwotCQlib29sZWFuIGlzUEVEZWNsID0gZmFsc2U7Ci0JCUVudGl0eURlY2wgZW50aXR5RGVjbCA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlTdHJpbmcgbmRhdGEgPSBudWxsOwotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQkJaXNQRURlY2wgPSBmYWxzZTsgLy8gPCFFTlRJVFkgeCAieCI+Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJaXNQRURlY2wgPSB0cnVlOyAvLyA8IUVOVElUWSAlIHggIngiPgotCQkJfQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lKCcgJyk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlpZiAobGVuID4gMCkgewotCQkJCW5hbWUgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCQlwcmV2Tm9kZU9mZnNldCA9IG5vZGVPZmZzZXQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCWJvb2xlYW4gc2luZ2xlOwotCQlpZiAoKHNpbmdsZSA9IGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgfHwgY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcIicsIHRydWUpKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBzY2FuRW50aXR5VmFsdWUoc2luZ2xlKTsKLQkJCWVudGl0eURlY2wgPSBuZXcgRW50aXR5RGVjbChuYW1lLCBvd25lckRURCwgdmFsdWUsIGlzUEVEZWNsKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGV4dGVybmFsIGVudGl0eQotCQkJRXh0ZXJuYWxJRCB4SUQgPSBzY2FuRXh0ZXJuYWxJRCgpOwotCQkJaWYgKHhJRCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc1BFRGVjbCkgLy8gZ2VuZXJhbCBlbnRpdHkKLQkJCQl7Ci0JCQkJCWJvb2xlYW4gdW5wYXJzZWQgPSBmYWxzZTsKLQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQl1bnBhcnNlZCA9IGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhuZGF0YV9zdHJpbmcpOwotCQkJCQlpZiAodW5wYXJzZWQpIHsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZSgnICcpOwotCQkJCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQkJCQkJbmRhdGEgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbnRpdHlEZWNsID0gbmV3IEVudGl0eURlY2wobmFtZSwgb3duZXJEVEQsIHhJRCwgaXNQRURlY2wsIG5kYXRhKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50aXR5RGVjbDsKLQl9Ci0KLQotCS8vCi0JLy8gWzgyXSBOb3RhdGlvbkRlY2wgOjo9ICc8IU5PVEFUSU9OJyBTIE5hbWUgUyAoRXh0ZXJuYWxJRCB8IFB1YmxpY0lEKSBTPwotCS8vICc+JwotCS8vIFs3NV0gRXh0ZXJuYWxJRCA6Oj0gJ1NZU1RFTScgUyBTeXN0ZW1MaXRlcmFsCi0JLy8gfCAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbCBTIFN5c3RlbUxpdGVyYWwKLQkvLyBbODNdIFB1YmxpY0lEIDo6PSAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbAotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nICdOT1RBVElPTicKLQkvLwotCXB1YmxpYyBOb3RhdGlvbkRlY2wgc2Nhbk5vdGF0aW9uRGVjbCgpIHsKLQkJcHJldk5vZGVPZmZzZXQgPSAxOwotCQlub2RlT2Zmc2V0ID0gMTsKLQkJaW50IGxlbjsKLQkJTm90YXRpb25EZWNsIG5vdGF0aW9uRGVjbCA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWUoJyAnKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJbmFtZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCXByZXZOb2RlT2Zmc2V0ID0gbm9kZU9mZnNldDsKLQkJCX0KLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJbm90YXRpb25EZWNsID0gbmV3IE5vdGF0aW9uRGVjbChuYW1lLCBvd25lckRURCk7Ci0KLQkJRXh0ZXJuYWxJRCB4SUQgPSBzY2FuRXh0ZXJuYWxJRCgpOwotCQlpZiAoeElEICE9IG51bGwpIHsKLQkJCWlmICh4SUQuZ2V0U3lzdGVtTGl0ZXJhbCgpICE9IG51bGwpIHsKLQkJCQlub3RhdGlvbkRlY2wuc2V0U3lzdGVtSWQoeElELmdldFN5c3RlbUxpdGVyYWwoKSk7Ci0JCQl9Ci0JCQlpZiAoeElELmdldFB1YklkTGl0ZXJhbCgpICE9IG51bGwpIHsKLQkJCQlub3RhdGlvbkRlY2wuc2V0UHVibGljSWQoeElELmdldFB1YklkTGl0ZXJhbCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBub3RhdGlvbkRlY2w7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBzY2FuRW50aXR5VmFsdWUoYm9vbGVhbiBzaW5nbGUpIHsKLQkJY2hhciBxY2hhciA9IHNpbmdsZSA/ICdcJycgOiAnXCInOwotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIocWNoYXIsIGZhbHNlKTsKLQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQ7Ci0JCVN0cmluZyB2YWx1ZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLy8KLQkvLyBbNzVdIEV4dGVybmFsSUQgOjo9ICdTWVNURU0nIFMgU3lzdGVtTGl0ZXJhbAotCS8vIHwgJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwgUyBTeXN0ZW1MaXRlcmFsCi0JcHJpdmF0ZSBFeHRlcm5hbElEIHNjYW5FeHRlcm5hbElEKCkgewotCQlFeHRlcm5hbElEIHhJRCA9IG51bGw7Ci0JCWNoYXIgcWNoYXIgPSAnXCInOwotCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHN5c3RlbV9zdHJpbmcpKSB7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcJyc7Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpCi0JCQkJcWNoYXIgPSAnXCInOwotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWludCBsZW4gPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKSAtIHByZXZOb2RlT2Zmc2V0IC0gMTsKLQkJCVN0cmluZyBzeXN0ZW1JZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzeXN0ZW1pZC4uLiIgKyBzeXN0ZW1JZCk7Ci0JCQl4SUQgPSBuZXcgRXh0ZXJuYWxJRChzeXN0ZW1JZCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHB1YmxpY19zdHJpbmcpKSB7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcJyc7Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpCi0JCQkJcWNoYXIgPSAnXCInOwotCi0JCQkvLyBwdWJsaWNMaXRlcmFsCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWludCBsZW4gPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKSAtIHByZXZOb2RlT2Zmc2V0IC0gMTsKLQkJCVN0cmluZyBwdWJsaWNJZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCi0JCQkvLyBzeXN0ZW1MaXRlcmFsCi0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKQotCQkJCXFjaGFyID0gJ1wnJzsKLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcIic7Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQgLSAxOwotCi0JCQlpZiAobGVuID4gMCkgewotCQkJCVN0cmluZyBzeXN0ZW1JZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCXhJRCA9IG5ldyBFeHRlcm5hbElEKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl4SUQgPSBuZXcgRXh0ZXJuYWxJRChwdWJsaWNJZCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhJRDsKLQl9Ci0KLQkvLwotCS8vIFs4M10gUHVibGljSUQgOjo9ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsCi0JLy8KLQotCS8vIGRtdyAxMS8xNSBwcml2YXRlIG1ldGhvZCBuZXZlciByZWFkIGxvY2FsbHkKLQkvLyBUT0RPOiBjaGFuZ2UgdG8gcHJpdmF0ZSBpZiB1c2VkLCBvdGhlcndpc2Ugc2hvdWxkIGJlIHJlbW92ZWQKLQlTdHJpbmcgc2NhblB1YmxpY0lEKCkgewotCQlTdHJpbmcgcElEID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhwdWJsaWNfc3RyaW5nKSkgewotCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJcmV0dXJuIHBJRDsKLQkJCX0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFRvQ2hhcignICcsIHRydWUpOwotCQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlwSUQgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJfQotCi0JCXJldHVybiBwSUQ7Ci0JfQotCi0JLy8KLQkvLyBNYWluCi0JLy8KLQotCS8qKiBNYWluIHByb2dyYW0gZW50cnkgcG9pbnQuICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCi0JCS8vIGlzIHRoZXJlIGFueXRoaW5nIHRvIGRvPwotCQlpZiAoYXJndi5sZW5ndGggPT0gMCkgewotCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCX0KLQotCQkvLyBEVERTY2FubmVyIHNjID0gbmV3IERURFNjYW5uZXIoYXJndlswXSk7Ci0JCURURFNjYW5uZXIgc2MgPSBuZXcgRFREU2Nhbm5lcigiaGVsbG8uZHRkIiwgIiBnaWYgU1lTVEVNIFwiR0lGIEZpbGVcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJTm90YXRpb25EZWNsIG4gPSBzYy5zY2FuTm90YXRpb25EZWNsKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTm9hdGlvbiBOYW1lOiAiICsgbi5nZXROb2RlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN5c3RlbUlkOiAiICsgbi5nZXRTeXN0ZW1JZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJLy8gQXR0cmlidXRlcwotCQkvLyBWZWN0b3IgbGlzdHMgPSBzYy5zY2FuQXR0bGlzdERlY2woKTsKLQkJLy8gc2MucHJpbnRBdHRMaXN0KGxpc3RzKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNOiAiICsgc2Muc2NhbkNvbnRlbnRNb2RlbCgpKTsKLQotCX0gLy8gbWFpbihTdHJpbmdbXSkKLQotCS8qKgotCSAqIEdldHMgdGhlIGVycm9yU3RyaW5nCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvclN0cmluZygpIHsKLQkJcmV0dXJuIGVycm9yU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVycm9yU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGVycm9yU3RyaW5nCi0JICogICAgICAgICAgICBUaGUgZXJyb3JTdHJpbmcgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdHJpbmcoU3RyaW5nIGVycm9yU3RyaW5nKSB7Ci0JCXRoaXMuZXJyb3JTdHJpbmcgPSBlcnJvclN0cmluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RlY2xOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EZWNsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIzMDZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RlY2xOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIERlY2xOb2RlIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBJTlZBTElEID0gLTE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQVRUTElTVCA9IDI7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRU5USVRZID0gMzsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBJTlRFUk5BTF9FTlRJVFkgPSA0OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVYVEVSTkFMX0VOVElUWSA9IDU7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgSU5URVJOQUxfR0VORVJBTF9FTlRJVFkgPSA2OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IElOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkgPSA3OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVYVEVSTkFMX0dFTkVSQUxfRU5USVRZID0gODsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZID0gOTsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBQQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSA9IDEwOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IE5PVEFUSU9OID0gMTE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ09NTUVOVCA9IDEyOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgU1RBUlRfRFREID0gMjE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRU5EX0RURCA9IDIyOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IFNUQVJUX0VOVElUWV9EVEQgPSAyMzsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFTkRfRU5USVRZX0RURCA9IDI0OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVSUk9SID0gMjU7Ci0KLQlwdWJsaWMgaW50IHR5cGUgPSBJTlZBTElEOwotCXByaXZhdGUgU3RyaW5nIGRlY2xOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBjb250ZW50U3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotCi0JLy8KLQkvLyBDb25zdGFudHMKLQkvLwotCi0JLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCi0JcHVibGljIERlY2xOb2RlKGludCB0eXBlKSB7Ci0JCXRoaXMobnVsbCwgdHlwZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIERlY2xOb2RlKFN0cmluZyBuYW1lLCBpbnQgdHlwZSwgU3RyaW5nIGNvbnRlbnRTdHJpbmcpIHsKLQkJdGhpcy5kZWNsTmFtZSA9IG5hbWU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuY29udGVudFN0cmluZyA9IGNvbnRlbnRTdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWNsTmFtZSgpIHsKLQkJcmV0dXJuIGRlY2xOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY2xOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWRlY2xOYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRTdHJpbmcoKSB7Ci0JCXJldHVybiBjb250ZW50U3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRTdHJpbmcoU3RyaW5nIGNvbnRlbnQpIHsKLQkJdGhpcy5jb250ZW50U3RyaW5nID0gY29udGVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLQkJdGhpcy5jb21tZW50ID0gY29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQotCXsKLQkJcmV0dXJuICJOb2RlIE5hbWU6ICIgKyBkZWNsTmFtZSArICIgVHlwZTogIiArIHR5cGUgKyAiIENvbnRlbnRTdHJpbmc6ICIgKyBjb250ZW50U3RyaW5nOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbGVtZW50RGVjbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRWxlbWVudERlY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1Yzc3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbGVtZW50RGVjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEVsZW1lbnREZWNsIGV4dGVuZHMgQmFzZU5vZGUgewotCUNNTm9kZSBjb250ZW50TW9kZWxOb2RlID0gbnVsbDsKLQotCXB1YmxpYyBFbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXRoaXMobmFtZSwgb3duZXJEVEQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBTdHJpbmcgY29tbWVudCwgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSkgewotCQlzdXBlcihuYW1lLCBvd25lckRURCwgY29tbWVudCwgZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldENvbnRlbnRNb2RlbE5vZGUoKSB7Ci0JCXJldHVybiBjb250ZW50TW9kZWxOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRNb2RlbE5vZGUoQ01Ob2RlIGNtbm9kZSkgewotCQljb250ZW50TW9kZWxOb2RlID0gY21ub2RlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5RGVjbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5RGVjbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg4NzdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VudGl0eURlY2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5RGVjbCBleHRlbmRzIEJhc2VOb2RlIHsKLQlib29sZWFuIGlzUGFyYW1ldGVyID0gZmFsc2U7Ci0JU3RyaW5nIGV4cGFuZGVkVmFsdWUgPSBudWxsOyAvLyBBbHdheXMgPHZhcj5udWxsPC92YXI+IGZvciBleHRlcm5hbAotCQkJCQkJCQkJLy8gRW50aXRpZXMKLQlTdHJpbmcgdmFsdWUgPSBudWxsOyAvLyBBbHdheXMgPHZhcj5udWxsPC92YXI+IGZvciBleHRlcm5hbCBFbnRpdGllcwotCUV4dGVybmFsSUQgZXh0ZXJuYWxJRCA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGludGVybmFsCi0JCQkJCQkJCQkvLyBFbnRpdGllcwotCVN0cmluZyBuZGF0YSA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGludGVybmFsIEVudGl0aWVzCi0KLQlib29sZWFuIHBhcnNlZCA9IGZhbHNlOwotCURURFBhcnNlciBkdGQgPSBudWxsOyAvLyBBbHdheXMgbnVsbCwgZXhjZXB0IHdoZW4gaXQgaGFzIGJlZW4gcGFyc2VkLgotCi0JYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgaW50ZXJuYWwgRW50aXRpZXMuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5hbWUgb2YgdGhpcyBFbnRpdHkuCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgWE1MLWVuY29kZWQgdmFsdWUgdGhhdCB3YXMgZGlyZWN0bHkgYXNzaWduZWQgdG8gdGhlCi0JICogICAgICAgICAgICBFbnRpdHkuCi0JICogQHBhcmFtIGlzUGFyYW1ldGVyCi0JICogICAgICAgICAgICA9dHJ1ZSBpZiBhIHBhcmFtZXRlciBFbnRpdHk7IG90aGVyd2lzZSA9ZmFsc2UuCi0JICovCi0JcHVibGljIEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGlzUGFyYW1ldGVyKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmlzUGFyYW1ldGVyID0gaXNQYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIGV4dGVybmFsIEVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBOYW1lIG9mIHRoZSBFbnRpdHkuCi0JICogQHBhcmFtIGV4dGVybmFsSUQKLQkgKiAgICAgICAgICAgIFRoZSByZWZlcmVuY2UocykgdG8gdGhlIGV4dGVybmFsIGVudGl0eSB0byByZXRyaWV2ZS4KLQkgKiBAcGFyYW0gaXNQYXJhbWV0ZXIKLQkgKiAgICAgICAgICAgID10cnVlIGlmIGEgcGFyYW1ldGVyIEVudGl0eTsgb3RoZXJ3aXNlID1mYWxzZS4KLQkgKiBAcGFyYW0gbmRhdGEKLQkgKiAgICAgICAgICAgIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGJpbmFyeSBFbnRpdHksIG9yIDx2YXI+bnVsbDwvdmFyPgotCSAqICAgICAgICAgICAgaWYgdGhlIEVudGl0eSBpcyBhIHRleHQgRW50aXR5LgotCSAqIEBzZWUgc2F4LkV4dGVybmFsSUQKLQkgKi8KLQlwdWJsaWMgRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBFeHRlcm5hbElEIGV4dGVybmFsSUQsIGJvb2xlYW4gaXNQYXJhbWV0ZXIsIFN0cmluZyBuZGF0YSkgewotCQlzdXBlcihuYW1lLCBvd25lckRURCwgbnVsbCwgbnVsbCk7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IGV4dGVybmFsSUQ7Ci0JCXRoaXMuaXNQYXJhbWV0ZXIgPSBpc1BhcmFtZXRlcjsKLQkJdGhpcy5uZGF0YSA9IG5kYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIEVudGl0eSBpcyBhIHBhcmFtZXRlciBFbnRpdHkuCi0JICogCi0JICogQHJldHVybiA9dHJ1ZSBpZiBhbiBpbnRlcm5hbCBwYXJhbWV0ZXIgRW50aXR5OyBvdGhlcndpc2UgPWZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyKCkgewotCQlyZXR1cm4gdGhpcy5pc1BhcmFtZXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBYTUwtZW5jb2RlZCB2YWx1ZSB0aGF0IHdhcyBkaXJlY3RseSBhc3NpZ25lZCB0byB0aGUKLQkgKiAgICAgICAgIGludGVybmFsIEVudGl0eTsgb3RoZXJ3aXNlLCA8dmFyPm51bGw8L3Zhcj4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbnRpdHlSZWZlcmVuY2VkKCkgewotCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHlSZWZlcmVuY2VkKGJvb2xlYW4gcmVmZXJlbmNlKSB7Ci0JCWVudGl0eVJlZmVyZW5jZWQgPSByZWZlcmVuY2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgTm90YXRpb24uIEEgc3lzdGVtIGlkZW50aWZpZXIgaXMgYQotCSAqIFVSSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElEI2dldFN5c3RlbUxpdGVyYWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlpZiAoZXh0ZXJuYWxJRCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UKLQkJCXJldHVybiB0aGlzLmV4dGVybmFsSUQuZ2V0U3lzdGVtTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBOb3RhdGlvbi4gQSBzeXN0ZW0gaWRlbnRpZmllciBpcyBhCi0JICogVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncyBjb250ZW50LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgYnkgRE9NLgotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZGVudGlmaWVyCi0JICogICAgICAgICAgICBUaGUgc3lzdGVtIGlkZW50aWZpZXIuCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZGVudGlmaWVyKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2V0U1lzdGVtSWQgLSBleHRlcm5hbElkOiAiICsgZXh0ZXJuYWxJRCk7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IG5ldyBFeHRlcm5hbElEKHRoaXMuZXh0ZXJuYWxJRC5nZXRQdWJJZExpdGVyYWwoKSwgc3lzdGVtSWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIE5vdGF0aW9uLiBUaGlzIHZhbHVlIGlzIG9ubHkgdmFsaWQKLQkgKiBpZiB0aGUgaWRlbnRpZmllciBpcyBkZWZpbmVkIGFzIDx2YXI+cHVibGljPC92YXI+IChhcyBvcHBvc2VkIHRvCi0JICogPHZhcj5zeXN0ZW08L3Zhcj4pLiBQdWJsaWMgaWRlbnRpZmllcnMgbWF5IGJlIHVzZWQgdG8gdHJ5IHRvIGdlbmVyYXRlCi0JICogYW4gYWx0ZXJuYXRpdmUgVVJJIGluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSBhbiBleHRlcm5hbCBlbnRpdGllcwotCSAqIGNvbnRlbnQuIElmIHJldHJpZXZhbCBmYWlscyB1c2luZyB0aGUgcHVibGljIGlkZW50aWZpZXIsIGFuIGF0dGVtcHQKLQkgKiBtdXN0IGJlIG1hZGUgdG8gcmV0cmlldmUgY29udGVudCB1c2luZyB0aGUgc3lzdGVtIGlkZW50aWZpZXIuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZGVmaW5lZCBieSBET00uCi0JICogCi0JICogQHJldHVybiBUaGUgcHVibGljIGlkZW50aWZpZXIsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiB0aGUgaWRlbnRpZmllciBpcwotCSAqICAgICAgICAgbm90IGRlZmluZWQuCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCWlmIChleHRlcm5hbElEID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRC5nZXRQdWJJZExpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgTm90YXRpb24uIFRoaXMgdmFsdWUgaXMgb25seSB2YWxpZCBpZgotCSAqIHRoZSBpZGVudGlmaWVyIGlzIGRlZmluZWQgYXMgPHZhcj5wdWJsaWM8L3Zhcj4gKGFzIG9wcG9zZWQgdG8KLQkgKiA8dmFyPnN5c3RlbTwvdmFyPikuIFB1YmxpYyBpZGVudGlmaWVycyBtYXkgYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUKLQkgKiBhbiBhbHRlcm5hdGl2ZSBVUkkgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGFuIGV4dGVybmFsIGVudGl0aWVzCi0JICogY29udGVudC4gSWYgcmV0cmlldmFsIGZhaWxzIHVzaW5nIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgYW4gYXR0ZW1wdAotCSAqIG11c3QgYmUgbWFkZSB0byByZXRyaWV2ZSBjb250ZW50IHVzaW5nIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWRlbnRpZmllcgotCSAqICAgICAgICAgICAgVGhlIHB1YmxpYyBpZGVudGlmaWVyLgotCSAqIEBzZWUgI2dldFB1YmxpY0lkCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZGVudGlmaWVyKSB7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IG5ldyBFeHRlcm5hbElEKHB1YmxpY0lkZW50aWZpZXIsIHRoaXMuZXh0ZXJuYWxJRC5nZXRTeXN0ZW1MaXRlcmFsKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4dGVybmFsIElEIG9mIHRoaXMgRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJlZmVyZW5jZShzKSB0byB0aGUgZXh0ZXJuYWwgZW50aXR5IHRvIHJldHJpZXZlOyBvdGhlcndpc2UsCi0JICogICAgICAgICA8dmFyPm51bGw8L3Zhcj4uCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyBFeHRlcm5hbElEIGdldEV4dGVybmFsSUQoKSB7Ci0JCXJldHVybiB0aGlzLmV4dGVybmFsSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZW50aXR5IHZhbHVlIGlzIGV4dGVybmFsLgotCSAqIAotCSAqIEByZXR1cm4gPXRydWUgaWYgZW50aXR5IGlzIGV4dGVybmFsOyBvdGhlcndpc2UsID1mYWxzZS4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbCgpIHsKLQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVybmFsIGJpbmFyeSBFbnRpdHksCi0JICogICAgICAgICBvdGhlcndpc2UsIDx2YXI+bnVsbDwvdmFyPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5uZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbihTdHJpbmcgbmRhdGEpIHsKLQkJdGhpcy5uZGF0YSA9IG5kYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVybmFsIGJpbmFyeSBFbnRpdHksCi0JICogICAgICAgICBvdGhlcndpc2UsIDx2YXI+bnVsbDwvdmFyPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmRhdGE7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZGVmaW5lZCBieSBET00uCi0JICogCi0JICogcHVibGljIHZvaWQgc2V0Tm90YXRpb25OYW1lKFN0cmluZyBhcmcpIHsgdGhpcy5uZGF0YSA9IGFyZzsgfQotCSAqLwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGlzIGEgbm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50aXR5IHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gPXRydWUgaWYgdGhlIGV4dGVybmFsIGJpbmFyeSBlbnRpdHkgY29udGFpbnMgYSBub3RhdGlvbjsKLQkgKiAgICAgICAgIG90aGVyd2lzZSwgPWZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm5kYXRhICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHMpIHsKLQkJdGhpcy52YWx1ZSA9IHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VkKGJvb2xlYW4gcCkgewotCQl0aGlzLnBhcnNlZCA9IHA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0UGFyc2VkKCkgewotCQlyZXR1cm4gdGhpcy5wYXJzZWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlQb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmQxZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5UG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5UG9vbCB7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbV9lbnRpdHkgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbV9wYXJhID0gbmV3IEhhc2h0YWJsZSgpOyAvLyBwYXJhbWV0ZXIgcmVmZXJlbmNlcwotCi0JcHVibGljIEVudGl0eVBvb2woKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JCVN0cmluZyBuYW1lID0gZW50aXR5LmdldE5vZGVOYW1lKCk7Ci0JCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXIoKSkgewotCQkJaWYgKG1fcGFyYS5jb250YWluc0tleShuYW1lKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQltX3BhcmEucHV0KG5hbWUsIGVudGl0eSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobV9lbnRpdHkuY29udGFpbnNLZXkobmFtZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJbV9lbnRpdHkucHV0KG5hbWUsIGVudGl0eSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIEVudGl0eURlY2wgcmVmZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChFbnRpdHlEZWNsKSBtX2VudGl0eS5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIEVudGl0eURlY2wgcmVmZXJQYXJhKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoRW50aXR5RGVjbCkgbV9wYXJhLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gPENPREU+RW51bWVyYXRpb248L0NPREU+IG9mIDxDT0RFPkVudGl0eURlY2w8L0NPREU+LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkVudGl0eURlY2wKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCXJldHVybiBtX2VudGl0eS5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiA8Q09ERT5FbnVtZXJhdGlvbjwvQ09ERT4gb2YgPENPREU+RW50aXR5RGVjbDwvQ09ERT4gZm9yCi0JICogcGFyYW1ldGVyIGVudGl0aWVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkVudGl0eURlY2wKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gcGFyYW1ldGVyRW50aXR5RWxlbWVudHMoKSB7Ci0JCXJldHVybiBtX3BhcmEuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgRFREI2dldEVudGl0aWVzKCk7Ci0JICovCi0JSGFzaHRhYmxlIGdldEVudGl0eUhhc2goKSB7Ci0JCXJldHVybiB0aGlzLm1fZW50aXR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Vycm9yTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXJyb3JNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMTIzNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXJyb3JNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBFcnJvck1lc3NhZ2UgewotCXByaXZhdGUgaW50IGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIHNldmVyaXR5OwotCXByaXZhdGUgU3RyaW5nIGVycm9yU3RyaW5nOwotCi0KLQlwdWJsaWMgRXJyb3JNZXNzYWdlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpIHsKLQkJZXJyb3JTdHJpbmcgPSBlcnJvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpIHsKLQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KFN0cmluZyBzZXZlcml0eSkgewotCQlpZiAoc2V2ZXJpdHkgPT0gIndhcm5pbmciKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuc2V2ZXJpdHkgPSAwOwotCQl9Ci0JCWVsc2UgaWYgKHNldmVyaXR5ID09ICJlcnJvciIpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5zZXZlcml0eSA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoc2V2ZXJpdHkgPT0gImZhdGFsIikgeyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnNldmVyaXR5ID0gMjsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTGluZShpbnQgbGluZSkgewotCQllcnJvckxpbmUgPSBsaW5lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yQ29sdW1uKGludCBjb2x1bW4pIHsKLQkJZXJyb3JDb2x1bW4gPSBjb2x1bW47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBlcnJvclN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvckxpbmUoKSB7Ci0JCXJldHVybiBlcnJvckxpbmU7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvckNvbHVtbigpIHsKLQkJcmV0dXJuIGVycm9yQ29sdW1uOwotCX0KLQotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gLTE7Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclN0YXJ0T2Zmc2V0KGludCBzdGFydCkgewotCQlzdGFydE9mZnNldCA9IHN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXJyb3JTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCX0KLQotCXByaXZhdGUgaW50IGVuZE9mZnNldCA9IC0xOwotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JFbmRPZmZzZXQoaW50IGVuZCkgewotCQllbmRPZmZzZXQgPSBlbmQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvckVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGVuZE9mZnNldDsKLQl9Ci0KLQotCU9iamVjdCBvYmplY3Q7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjbG9zZXN0IG9iamVjdCB0byB0aGUgZXJyb3IuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBvYmplY3QuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBjbG9zZXN0IG9iamVjdCB0byB0aGUgZXJyb3IuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCB2KSB7Ci0JCXRoaXMub2JqZWN0ID0gdjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZE5ld0Vycm9yTWVzc2FnZUxpbmUoU3RyaW5nIG5ld0xpbmUpIHsKLQkJZXJyb3JTdHJpbmcgKz0gIlxuIiArIG5ld0xpbmU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FeHRlcm5hbElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FeHRlcm5hbElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjAwOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXh0ZXJuYWxJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbElEIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVF9TWVNURU0gPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUX1BVQkxJQyA9IDE7Ci0KLQlpbnQgdHlwZSA9IFRfUFVCTElDOwotCVN0cmluZyBwdWJsaWNJRCA9IG51bGw7Ci0JU3RyaW5nIHN5c3RlbUlEID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBzeXN0ZW0gSURzLgotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JRAotCSAqICAgICAgICAgICAgVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncwotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWxJRChTdHJpbmcgc3lzdGVtSUQpIHsKLQkJdGhpcy50eXBlID0gVF9TWVNURU07Ci0JCXRoaXMucHVibGljSUQgPSBudWxsOwotCQl0aGlzLnN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHB1YmxpYyBhbmQgc3lzdGVtIElEcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSUQKLQkgKiAgICAgICAgICAgIElkZW50aWZpZXIgdG8gYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUgYW4gYWx0ZXJuYXRpdmUgVVJJCi0JICogICAgICAgICAgICBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudCwgb3IKLQkgKiAgICAgICAgICAgIDx2YXI+bnVsbDwvdmFyPiBpZiBhIHN5c3RlbSBpZGVudGl0aWVyIGlzIHRvIGJlCi0JICogICAgICAgICAgICBjb25zdHJ1Y3RlZC4KLQkgKiBAcGFyYW0gc3lzdGVtSUQKLQkgKiAgICAgICAgICAgIFVSSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MKLQkgKiAgICAgICAgICAgIGNvbnRlbnQuCi0JICovCi0JcHVibGljIEV4dGVybmFsSUQoU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQpIHsKLQkJdGhpcy50eXBlID0gVF9QVUJMSUM7Ci0JCXRoaXMucHVibGljSUQgPSBwdWJsaWNJRDsKLQkJdGhpcy5zeXN0ZW1JRCA9IHN5c3RlbUlEOwotCQlpZiAobnVsbCA9PSB0aGlzLnB1YmxpY0lEKQotCQkJdGhpcy50eXBlID0gVF9TWVNURU07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpZiB0aGlzIGV4dGVybmFsIElEIGlzIGEgc3lzdGVtIElEIChvciBwdWJsaWMgSUQpLgotCSAqIAotCSAqIEByZXR1cm4gU3lzdGVtIElEPXRydWUsIFB1YmxpYyBJRD1mYWxzZS4KLQkgKiBAc2VlICNpc1B1YmxpYwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3lzdGVtKCkgewotCQlyZXR1cm4gdGhpcy50eXBlID09IFRfU1lTVEVNOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaWYgdGhpcyBleHRlcm5hbCBJRCBpcyBhIHB1YmxpYyBJRCAob3Igc3lzdGVtIElEKS4KLQkgKiAKLQkgKiBAcmV0dXJuIFB1YmxpYyBJRD10cnVlLCBTeXN0ZW0gSUQ9ZmFsc2UuCi0JICogQHNlZSAjaXNTeXN0ZW0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJcmV0dXJuIHRoaXMudHlwZSA9PSBUX1BVQkxJQzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGlzIGV4dGVybmFsIElELiBBIHN5c3RlbSBpZGVudGlmaWVyCi0JICogaXMgYSBVUkksIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzIGNvbnRlbnQuCi0JICogCi0JICogQHJldHVybiBUaGUgc3lzdGVtIGlkZW50aWZpZXIsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiB0aGUgaWRlbnRpZmllciBpcwotCSAqICAgICAgICAgbm90IGRlZmluZWQuCi0JICogQHNlZSAjZ2V0UHViaWRMaXRlcmFsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1MaXRlcmFsKCkgewotCQlyZXR1cm4gdGhpcy5zeXN0ZW1JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGlzIGV4dGVybmFsIElELiBUaGlzIHZhbHVlIGlzIG9ubHkKLQkgKiB2YWxpZCBpZiB0aGUgaWRlbnRpZmllciBpcyBkZWZpbmVkIGFzIDx2YXI+cHVibGljPC92YXI+IChhcyBvcHBvc2VkIHRvCi0JICogPHZhcj5zeXN0ZW08L3Zhcj4pLiBQdWJsaWMgaWRlbnRpZmllcnMgbWF5IGJlIHVzZWQgdG8gdHJ5IHRvIGdlbmVyYXRlCi0JICogYW4gYWx0ZXJuYXRpdmUgVVJJIGluIG9yZGVyIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzIGNvbnRlbnQuCi0JICogSWYgcmV0cmlldmFsIGZhaWxzIHVzaW5nIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgYW4gYXR0ZW1wdCBtdXN0IGJlIG1hZGUKLQkgKiB0byByZXRyaWV2ZSBjb250ZW50IHVzaW5nIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwdWJsaWMgaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlICNnZXRTeXN0ZW1MaXRlcmFsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJJZExpdGVyYWwoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBleHRlcm5hbCBJRCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBkZWNsYXJlZDogPENPREU+U1lTVEVNCi0JICogJnF1b3Q7PFZBUj5zeXN0ZW1JRDwvVkFSPiZxdW90OzwvQ09ERT4gb3IgPENPREU+UFVCTElDICZxdW90OzxWQVI+cHVibGljSUQ8L1ZBUj4mcXVvdDsKLQkgKiAmcXVvdDs8VkFSPnN5c3RlbUlEPC9WQVI+JnF1b3Q7PC9DT0RFPi4KLQkgKiAKLQkgKiBAcmV0dXJuIFhNTCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50IG9mIHRoZSBleHRlcm5hbCBJRCAobmV2ZXIKLQkgKiAgICAgICAgIDx2YXI+bnVsbDwvdmFyPikuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJldDsKLQkJaWYgKGlzU3lzdGVtKCkpIHsKLQkJCXJldCA9ICJTWVNURU0gXCIiICsgZ2V0U3lzdGVtTGl0ZXJhbCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSBpZiAobnVsbCAhPSBnZXRTeXN0ZW1MaXRlcmFsKCkpIHsKLQkJCXJldCA9ICJQVUJMSUMgXCIiICsgZ2V0UHViSWRMaXRlcmFsKCkgKyAiXCIgXCIiICsgZ2V0U3lzdGVtTGl0ZXJhbCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQllbHNlIHsKLQkJCXJldCA9ICJQVUJMSUMgXCIiICsgZ2V0UHViSWRMaXRlcmFsKCkgKyAiXCIiOyAvLyBmb3IgTk9UQVRJT04gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIEV4dGVybmFsSUQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFeHRlcm5hbElEIGVpZCA9IChFeHRlcm5hbElEKSBvYmo7Ci0JCWlmICghKChlaWQucHVibGljSUQgPT0gbnVsbCAmJiB0aGlzLnB1YmxpY0lEID09IG51bGwpIHx8IGVpZC5wdWJsaWNJRCAhPSBudWxsICYmIGVpZC5wdWJsaWNJRC5lcXVhbHModGhpcy5wdWJsaWNJRCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISgoZWlkLnN5c3RlbUlEID09IG51bGwgJiYgdGhpcy5zeXN0ZW1JRCA9PSBudWxsKSB8fCBlaWQuc3lzdGVtSUQgIT0gbnVsbCAmJiBlaWQuc3lzdGVtSUQuZXF1YWxzKHRoaXMuc3lzdGVtSUQpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmV0dmFsID0gMDsKLQkJaWYgKHB1YmxpY0lEICE9IG51bGwpCi0JCQlyZXR2YWwgPSBwdWJsaWNJRC5oYXNoQ29kZSgpOwotCQlpZiAoc3lzdGVtSUQgIT0gbnVsbCkKLQkJCXJldHZhbCArPSBzeXN0ZW1JRC5oYXNoQ29kZSgpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvTm90YXRpb25EZWNsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9Ob3RhdGlvbkRlY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxNTgwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9Ob3RhdGlvbkRlY2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLS8qKgotICogTm90YXRpb25zIGFyZSBob3cgdGhlIERvY3VtZW50IFR5cGUgRGVzY3JpcHRpb24gKERURCkgcmVjb3JkcyBoaW50cyBhYm91dAotICogdGhlIGZvcm1hdCBvZiBhbiBYTUwgInVucGFyc2VkIGVudGl0eSIgLS0gaW4gb3RoZXIgd29yZHMsIG5vbi1YTUwgZGF0YQotICogYm91bmQgdG8gdGhpcyBkb2N1bWVudCB0eXBlLCB3aGljaCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBjb25zdWx0Ci0gKiB3aGVuIG1hbmlwdWxhdGluZyB0aGUgZG9jdW1lbnQuIEEgTm90YXRpb24gcmVwcmVzZW50cyBhIG5hbWUtdmFsdWUgcGFpciwKLSAqIHdpdGggaXRzIG5vZGVOYW1lIGJlaW5nIHNldCB0byB0aGUgZGVjbGFyZWQgbmFtZSBvZiB0aGUgbm90YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RhdGlvbkRlY2wgZXh0ZW5kcyBCYXNlTm9kZSB7Ci0JLyoqIFB1YmxpYyBpZGVudGlmaWVyLiAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCi0JLyoqIFN5c3RlbSBpZGVudGlmaWVyLiAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JLy8KLQkvLyBDb25zdHJ1Y3RvcnMKLQkvLwotCi0JLyoqIEZhY3RvcnkgY29uc3RydWN0b3IuICovCi0JcHVibGljIE5vdGF0aW9uRGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFREKTsKLQl9Ci0KLQkvLwotCS8vIE5vdGF0aW9uIG1ldGhvZHMKLQkvLwotCi0JLyoqCi0JICogVGhlIFB1YmxpYyBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBwdWJsaWMgaWRlbnRpZmllciB3YXMKLQkgKiBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiBwdWJsaWNJZDsKLQl9IC8vIGdldFB1YmxpY0lkKCk6U3RyaW5nCi0KLQkvKioKLQkgKiBUaGUgU3lzdGVtIElkZW50aWZpZXIgZm9yIHRoaXMgTm90YXRpb24uIElmIG5vIHN5c3RlbSBpZGVudGlmaWVyIHdhcwotCSAqIHNwZWNpZmllZCwgdGhpcyB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlkOwotCX0gLy8gZ2V0U3lzdGVtSWQoKTpTdHJpbmcKLQotCS8vCi0JLy8gUHVibGljIG1ldGhvZHMKLQkvLwotCi0JLyoqCi0JICogTk9OLURPTTogVGhlIFB1YmxpYyBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBwdWJsaWMKLQkgKiBpZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBpZCkgewotCQlwdWJsaWNJZCA9IGlkOwotCX0gLy8gc2V0UHVibGljSWQoU3RyaW5nKQotCi0JLyoqCi0JICogTk9OLURPTTogVGhlIFN5c3RlbSBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBzeXN0ZW0KLQkgKiBpZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBpZCkgewotCQlzeXN0ZW1JZCA9IGlkOwotCX0gLy8gc2V0U3lzdGVtSWQoU3RyaW5nKQotCi19IC8vIGNsYXNzIE5vdGF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvU3RyaW5nUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9TdHJpbmdQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5Yjc0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9TdHJpbmdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0vKioKLSAqIFJlYWRlciBmb3IgcHJvY2Vzc2luZy9wYXJzaW5nIHhtbCBzdHJpbmcKLSAqIAotICogQHZlcnNpb24KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1BhcnNlciB7Ci0JU3RyaW5nIGZEYXRhID0gbnVsbDsKLQlpbnQgZkVuZE9mZnNldDsKLQlpbnQgZk1vc3RSZWNlbnRDaGFyOwotCWludCBmQ3VycmVudE9mZnNldDsKLQlib29sZWFuIGZDYWxsZWRDaGFyUHJvcEluaXQgPSBmYWxzZTsKLQotCXB1YmxpYyBTdHJpbmdQYXJzZXIoU3RyaW5nIGRhdGEpIHsKLQkJZkRhdGEgPSBkYXRhOwotCQlmQ3VycmVudE9mZnNldCA9IDA7Ci0JCWZFbmRPZmZzZXQgPSBmRGF0YS5sZW5ndGgoKTsKLQkJZk1vc3RSZWNlbnRDaGFyID0gZkVuZE9mZnNldCA9PSAwID8gLTEgOiBmRGF0YS5jaGFyQXQoMCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZEYXRhLnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlyZXR1cm4gZkRhdGE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZW1haW5pbmdTdHJpbmcoKSB7Ci0JCXJldHVybiBmRGF0YS5zdWJzdHJpbmcoZ2V0Q3VycmVudE9mZnNldCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1cnJlbnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmQ3VycmVudE9mZnNldDsKLQl9Ci0KLQkvLwotCS8vCi0JcHVibGljIGludCBsb2FkTmV4dENoYXIoKSB7Ci0JCWlmICgrK2ZDdXJyZW50T2Zmc2V0ID49IGZFbmRPZmZzZXQpIHsKLQkJCWZNb3N0UmVjZW50Q2hhciA9IC0xOwotCQl9Ci0JCWVsc2UgewotCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gZk1vc3RSZWNlbnRDaGFyOwotCX0KLQkKLQlwdWJsaWMgaW50IGxvYWRQcmV2aW91c0NoYXIoKSB7Ci0JCWlmICgtLWZDdXJyZW50T2Zmc2V0IDwgMCkgCi0JCQlmTW9zdFJlY2VudENoYXIgPSAtMTsKLQkJZWxzZQotCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJcmV0dXJuIGZNb3N0UmVjZW50Q2hhcjsKLQl9Ci0KLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gbG9va2luZ0F0Q2hhcihjaGFyIGNociwgYm9vbGVhbiBza2lwUGFzdENoYXIpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggIT0gY2hyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHNraXBQYXN0Q2hhcikgewotCQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJCWZNb3N0UmVjZW50Q2hhciA9IC0xOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBsb29raW5nQXRWYWxpZENoYXIoYm9vbGVhbiBza2lwUGFzdENoYXIpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggPCAweEQ4MDApIHsKLQkJCWlmIChjaCA8IDB4MjAgJiYgY2ggIT0gMHgwOSAmJiBjaCAhPSAweDBBICYmIGNoICE9IDB4MEQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJCQlmTW9zdFJlY2VudENoYXIgPSAtMTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZNb3N0UmVjZW50Q2hhciA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGNoID4gMHhGRkZEKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNoIDwgMHhEQzAwKSB7Ci0JCQlpZiAoZkN1cnJlbnRPZmZzZXQgKyAxID49IGZFbmRPZmZzZXQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQljaCA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCArIDEpOwotCQkJaWYgKGNoIDwgMHhEQzAwIHx8IGNoID49IDB4RTAwMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFza2lwUGFzdENoYXIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZDdXJyZW50T2Zmc2V0Kys7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY2ggPCAweEUwMDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gLTE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIGxvb2tpbmdBdFNwYWNlKGJvb2xlYW4gc2tpcFBhc3RDaGFyKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoID4gMHgyMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGNoID09IDB4MjAgfHwgY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEIHx8IGNoID09IDB4MDkpIHsKLQkJCWlmIChza2lwUGFzdENoYXIpIHsKLQkJCQlsb2FkTmV4dENoYXIoKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgdm9pZCBza2lwVG9DaGFyKGNoYXIgY2hyLCBib29sZWFuIHNraXBQYXN0Q2hhcikgewotCQkvLwotCQkvLyBSRVZJU0lUIC0gdGhpcyB3aWxsIHNraXAgaW52YWxpZCBjaGFyYWN0ZXJzIHdpdGhvdXQgcmVwb3J0aW5nIHRoZW0uCi0JCS8vCi0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChjaCA9PSBjaHIpIHsKLQkJCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQkJCWxvYWROZXh0Q2hhcigpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIHNraXBzIHRvIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCi0JICogaWYgPGNvZGU+c2tpcFBhc3RDaGFyPC9jb2RlPiBpcyB0cnVlLCB0aGUgcGFyc2VyIGlzCi0JICogaW5jcmVtZW50ZWQgcGFzdCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIuCi0JICogVGhpcyBtZXRob2Qgc3RhcnRzIGF0IHRoZSBlbmQgb2YgdGhlIGNoYXJhY3RlciBkYXRhLCBhbmQKLQkgKiBtb3ZlcyBiYWNrd2FyZHMgdG8gZmluZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBza2lwVG9MYXN0T2ZDaGFyKGNoYXIgY2hyLCBib29sZWFuIHNraXBQYXN0Q2hhcikgewotCQlpbnQgY2ggPSAtMTsKLQkJCi0JCS8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mZnNldCB0byBzY2FuIGJhY2t3YXJkcy4KLQkJZkN1cnJlbnRPZmZzZXQgPSBmRW5kT2Zmc2V0OwotCQkKLQkJZG8gewotCQkJY2ggPSBsb2FkUHJldmlvdXNDaGFyKCk7Ci0JCQkKLQkJCWlmKGNoID09IC0xKQotCQkJCXJldHVybjsKLQkJCQotCQkJaWYgKGNoID09IGNocikgewotCQkJCWlmKHNraXBQYXN0Q2hhcikKLQkJCQkJbG9hZE5leHRDaGFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCX0gd2hpbGUodHJ1ZSk7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIHZvaWQgc2tpcFBhc3RTcGFjZXMoKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoID09IC0xKSB7Ci0JCQkvLyBjaGFuZ2VSZWFkZXJzKCkuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCXJldHVybjsKLQkJfQotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGNoID4gMHgyMCB8fCAoY2ggIT0gMHgyMCAmJiBjaCAhPSAweDBBICYmIGNoICE9IDB4MDkgJiYgY2ggIT0gMHgwRCkpIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSBjaDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2ggPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQl9Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0KLQlwdWJsaWMgdm9pZCBza2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZShjaGFyIGZhc3RjaGVjaykgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0KLQkJaWYgKGNoICE9ICclJykgewotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlJbml0aWFsTmFtZUNoYXJbY2hdID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJCQkJZkNhbGxlZENoYXJQcm9wSW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICgoWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0NoYXJGbGFnc1tjaF0gJiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLkVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPT0gJyUnIHx8IGNoID09ICc7JykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2tpcFBhc3ROYW1lKGNoYXIgZmFzdGNoZWNrKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJza2lwcGFzdE5hbWUgY2g6ICIgK2NoKTsKLQotCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQlpZiAoY2ggPT0gLTEgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpSW5pdGlhbE5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJfQotCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9Jbml0aWFsTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0KLQlwdWJsaWMgdm9pZCBza2lwUGFzdE5tdG9rZW4oY2hhciBmYXN0Y2hlY2spIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJY2ggPSBsb2FkTmV4dENoYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNraXBQYXN0Tm10b2tlbkFuZFBFUmVmZXJlbmNlKGNoYXIgZmFzdGNoZWNrKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChmYXN0Y2hlY2sgPT0gY2gpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGNoID09ICclJyB8fCBjaCA9PSAnOycpIHsKLQkJCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmQ2FsbGVkQ2hhclByb3BJbml0KSB7Ci0JCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCQlmQ2FsbGVkQ2hhclByb3BJbml0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoID0gbG9hZE5leHRDaGFyKCk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBza2lwcGVkU3RyaW5nKGNoYXJbXSBzKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoICE9IHNbMF0pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZkN1cnJlbnRPZmZzZXQgKyBzLmxlbmd0aCA+IGZFbmRPZmZzZXQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCArIGkpICE9IHNbaV0pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZDdXJyZW50T2Zmc2V0ICs9IChzLmxlbmd0aCAtIDEpOwotCQlsb2FkTmV4dENoYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIGludCBzY2FuSW52YWxpZENoYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlsb2FkTmV4dENoYXIoKTsKLQkJcmV0dXJuIGNoOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCS8qCi0JICogcHVibGljIGludCBzY2FuQ2hhclJlZihib29sZWFuIGhleCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGludCBjaCA9Ci0JICogZk1vc3RSZWNlbnRDaGFyOyBpZiAoY2ggPT0gLTEpIC8vIHJldHVybgotCSAqIGNoYW5nZVJlYWRlcnMoKS5zY2FuQ2hhclJlZihoZXgpOyByZXR1cm4gY2g7IGludCBudW0gPSAwOyBpZiAoaGV4KSB7IGlmCi0JICogKGNoID4gJ2YnIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaVhEaWdpdENoYXJbY2hdID09IDApIHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfSU5WQUxJRF9DSEFSOyBudW0gPSBjaCAtIChjaCA8ICdBJyA/Ci0JICogJzAnIDogKGNoIDwgJ2EnID8gJ0EnIDogJ2EnKSAtIDEwKTsgfSBlbHNlIHsgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQotCSAqIHJldHVybiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX0lOVkFMSURfQ0hBUjsgbnVtID0gY2ggLSAnMCc7IH0KLQkgKiBib29sZWFuIHRvb2JpZyA9IGZhbHNlOyB3aGlsZSAodHJ1ZSkgeyBjaCA9IGxvYWROZXh0Q2hhcigpOyBpZiAoY2ggPT0KLQkgKiAtMSkgcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfU0VNSUNPTE9OX1JFUVVJUkVEOyBpZiAoaGV4KSB7Ci0JICogaWYgKGNoID4gJ2YnIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaVhEaWdpdENoYXJbY2hdID09IDApCi0JICogYnJlYWs7IH0gZWxzZSB7IGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7IH0gaWYgKGhleCkgeyBpbnQgZGlnID0KLQkgKiBjaCAtIChjaCA8ICdBJyA/ICcwJyA6IChjaCA8ICdhJyA/ICdBJyA6ICdhJykgLSAxMCk7IG51bSA9IChudW0gPDwgNCkgKwotCSAqIGRpZzsgfSBlbHNlIHsgaW50IGRpZyA9IGNoIC0gJzAnOyBudW0gPSAobnVtICogMTApICsgZGlnOyB9IGlmIChudW0gPgotCSAqIDB4MTBGRkZGKSB7IHRvb2JpZyA9IHRydWU7IG51bSA9IDA7IH0gfSBpZiAoY2ggIT0gJzsnKSByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX1NFTUlDT0xPTl9SRVFVSVJFRDsgbG9hZE5leHRDaGFyKCk7IGlmCi0JICogKHRvb2JpZykgcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfT1VUX09GX1JBTkdFOyByZXR1cm4KLQkgKiBudW07IH0KLQkgKi8KLQkvLwotCS8vCi0JLy8KLQkvKgotCSAqIHB1YmxpYyBpbnQgc2NhblN0cmluZ0xpdGVyYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsgYm9vbGVhbiBzaW5nbGU7IGlmCi0JICogKCEoc2luZ2xlID0gbG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgJiYgIWxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpIHsKLQkgKiByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5TVFJJTkdMSVRfUkVTVUxUX1FVT1RFX1JFUVVJUkVEOyB9IGludCBvZmZzZXQgPQotCSAqIGZDdXJyZW50T2Zmc2V0OyBjaGFyIHFjaGFyID0gc2luZ2xlID8gJ1wnJyA6ICdcIic7IHdoaWxlCi0JICogKCFsb29raW5nQXRDaGFyKHFjaGFyLCBmYWxzZSkpIHsgaWYgKCFsb29raW5nQXRWYWxpZENoYXIodHJ1ZSkpIHsKLQkgKiByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5TVFJJTkdMSVRfUkVTVUxUX0lOVkFMSURfQ0hBUjsgfSB9IC8vIGludAotCSAqIHN0cmluZ0luZGV4ID0gYWRkU3RyaW5nKG9mZnNldCwgZkN1cnJlbnRPZmZzZXQgLSBvZmZzZXQpOyBpbnQKLQkgKiBzdHJpbmdJbmRleCA9IGFkZFN0cmluZyhvZmZzZXQsIGZDdXJyZW50T2Zmc2V0IC0gb2Zmc2V0KTsKLQkgKiBsb29raW5nQXRDaGFyKHFjaGFyLCB0cnVlKTsgLy8gbW92ZSBwYXN0IHFjaGFyIHJldHVybiBzdHJpbmdJbmRleDsgfQotCSAqLwotCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIHNjYW5BdHRWYWx1ZShjaGFyIHFjaGFyKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChsb29raW5nQXRDaGFyKHFjaGFyLCBmYWxzZSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChsb29raW5nQXRDaGFyKCcgJywgdHJ1ZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghbG9va2luZ0F0VmFsaWRDaGFyKHRydWUpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJbG9va2luZ0F0Q2hhcihxY2hhciwgdHJ1ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8KLQkvLyBbOV0gRW50aXR5VmFsdWUgOjo9ICciJyAoW14lJiJdIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAnIicKLQkvLyB8ICInIiAoW14lJiddIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAiJyIKLQkvLwotCS8vIFRoZSB2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBhczoKLQkvLwotCS8vIDAgLSBub3Qgc3BlY2lhbAotCS8vIDEgLSBxdW90ZSBjaGFyYWN0ZXIKLQkvLyAyIC0gcmVmZXJlbmNlCi0JLy8gMyAtIHBlcmVmCi0JLy8gNCAtIGludmFsaWQKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpRW50aXR5VmFsdWVDaGFyW10gPSB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMCwgMCwgNCwgNCwgMCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMCwgMCwgMSwgMCwgMCwgMywgMiwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gJ1wiJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICclJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcmJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdcJycKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLQotCS8qCi0JICogcHVibGljIGludCBzY2FuRW50aXR5VmFsdWUoaW50IHFjaGFyLCBib29sZWFuIGNyZWF0ZVN0cmluZykgdGhyb3dzCi0JICogRXhjZXB0aW9uIHsgaW50IG9mZnNldCA9IGZDdXJyZW50T2Zmc2V0OyBpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JICogd2hpbGUgKHRydWUpIHsgaWYgKGNoID09IC0xKSB7IGNoYW5nZVJlYWRlcnMoKTsgLy8gZG8gbm90IGNhbGwgbmV4dAotCSAqIHJlYWRlciwgb3VyIGNhbGxlciBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlIHBhcmFtZXRlcnMgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfRU5EX09GX0lOUFVUOyB9IGlmIChjaCA8IDB4ODApIHsKLQkgKiBzd2l0Y2ggKGZnQXNjaWlFbnRpdHlWYWx1ZUNoYXJbY2hdKSB7IGNhc2UgMTogLy8gcXVvdGUgY2hhciBpZiAoY2ggPT0KLQkgKiBxY2hhcikgeyBpZiAoIWNyZWF0ZVN0cmluZykgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfRklOSVNIRUQ7IGludCBsZW5ndGggPQotCSAqIGZDdXJyZW50T2Zmc2V0IC0gb2Zmc2V0OyBpbnQgcmVzdWx0ID0gbGVuZ3RoID09IDAgPwotCSAqIFN0cmluZ1Bvb2wuRU1QVFlfU1RSSU5HIDogYWRkU3RyaW5nKG9mZnNldCwgbGVuZ3RoKTsgbG9hZE5leHRDaGFyKCk7Ci0JICogcmV0dXJuIHJlc3VsdDsgfSAvLyB0aGUgb3RoZXIgcXVvdGUgY2hhcmFjdGVyIGlzIG5vdCBzcGVjaWFsIC8vIGZhbGwKLQkgKiB0aHJvdWdoIGNhc2UgMDogLy8gbm9uLXNwZWNpYWwgY2hhciBpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JICogaWYgKG93ZVRyYWlsaW5nU3BhY2UpIHsgb3dlVHJhaWxpbmdTcGFjZSA9IGZhbHNlOyBjaCA9IGZNb3N0UmVjZW50Q2hhciA9ICcgJzsgfQotCSAqIGVsc2UgeyBjaCA9IGZNb3N0UmVjZW50Q2hhciA9IC0xOyB9IH0gZWxzZSB7IGNoID0gZk1vc3RSZWNlbnRDaGFyID0KLQkgKiBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOyB9IGNvbnRpbnVlOyBjYXNlIDI6IC8vIHJlZmVyZW5jZSByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9SRUZFUkVOQ0U7IGNhc2UgMzogLy8gcGVyZWYgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfUEVSRUY7IGNhc2UgNDogLy8gaW52YWxpZCByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9JTlZBTElEX0NIQVI7IH0gfSBlbHNlIGlmIChjaCA8Ci0JICogMHhEODAwKSB7IGNoID0gbG9hZE5leHRDaGFyKCk7IH0gZWxzZSBpZiAoY2ggPj0gMHhFMDAwICYmIChjaCA8PSAweEZGRkQgfHwKLQkgKiAoY2ggPj0gMHgxMDAwMCAmJiBjaCA8PSAweDEwRkZGRikpKSB7IC8vIC8vIFJFVklTSVQgLSBuZWVkcyBtb3JlIGNvZGUKLQkgKiB0byBjaGVjayBzdXJyb2dhdGVzLiAvLyBjaCA9IGxvYWROZXh0Q2hhcigpOyB9IGVsc2UgeyByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9JTlZBTElEX0NIQVI7IH0gfSB9Ci0JICovCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvVFN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvVFN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjEyZTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1RTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3Igc29tZSBvZiB0aGUgdmVyeSB1c2VkIElTdHJpbmcKLSAqIG9wZXJhdGlvbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgVFN0cmluZyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBQkVUID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBTlVNRVJJQyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNRVJJQyA9ICIwMTIzNDU2Nzg5IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gY2hhbmdlIGFsbCBvY2N1cnJlbmNlcyBvZiBvbGRQYXQgdG8gbmV3UGF0Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlKFN0cmluZyBpbiwgU3RyaW5nIG9sZFBhdCwgU3RyaW5nIG5ld1BhdCkgewotCQlpZiAob2xkUGF0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gaW47Ci0JCWlmIChvbGRQYXQubGVuZ3RoKCkgPT0gMSAmJiBuZXdQYXQubGVuZ3RoKCkgPT0gMSkKLQkJCXJldHVybiBpbi5yZXBsYWNlKG9sZFBhdC5jaGFyQXQoMCksIG5ld1BhdC5jaGFyQXQoMCkpOwotCi0JCWludCBsYXN0SW5kZXggPSAwOwotCQlpbnQgbmV3SW5kZXggPSAwOwotCQlTdHJpbmdCdWZmZXIgbmV3U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDs7KSB7Ci0JCQluZXdJbmRleCA9IGluLmluZGV4T2Yob2xkUGF0LCBsYXN0SW5kZXgpOwotCQkJaWYgKG5ld0luZGV4ICE9IC0xKSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4LCBuZXdJbmRleCkgKyBuZXdQYXQpOwotCQkJCWxhc3RJbmRleCA9IG5ld0luZGV4ICsgb2xkUGF0Lmxlbmd0aCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4KSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1N0cmluZy50b1N0cmluZygpOwotCX0KLQotCS8vIGNoYW5nZSB0aGUgb2NjdXJyZW5jZXMgb2Ygb2xkUGF0IHRvIG5ld1BhdCBzdGFydGluZyBhdCBzdGFydFBvc2l0aW9uCi0JLy8gZm9yIG51bWJlciBvZiBudW1DaGFuZ2VzCi0JLy8gTm90ZTogdGhlIDFzdCBjaGFyIGluIHRoZSBzdHJpbmcgaGFzIHBvc2l0aW9uIG9mIDAKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZShTdHJpbmcgaW4sIFN0cmluZyBvbGRQYXQsIFN0cmluZyBuZXdQYXQsIGludCBzdGFydFBvcywgaW50IG51bUNoYW5nZXMpIHsKLQkJaWYgKG9sZFBhdC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGluOwotCQlpZiAob2xkUGF0Lmxlbmd0aCgpID09IDEgJiYgbmV3UGF0Lmxlbmd0aCgpID09IDEpCi0JCQlyZXR1cm4gaW4ucmVwbGFjZShvbGRQYXQuY2hhckF0KDApLCBuZXdQYXQuY2hhckF0KDApKTsKLQotCQlpbnQgaW5MZW4gPSBpbi5sZW5ndGgoKTsKLQotCQlpZiAoc3RhcnRQb3MgPj0gaW5MZW4pCi0JCQlyZXR1cm4gaW47Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0YXJ0UG9zOwotCQlpbnQgbmV3SW5kZXggPSAwOwotCQlpbnQgY291bnRDaGFuZ2VzID0gMDsKLQotCi0JCVN0cmluZ0J1ZmZlciBuZXdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZm9yICg7OykgewotCQkJbmV3SW5kZXggPSBpbi5pbmRleE9mKG9sZFBhdCwgbGFzdEluZGV4KTsKLQkJCWlmIChuZXdJbmRleCAhPSAtMSkgewotCQkJCW5ld1N0cmluZy5hcHBlbmQoaW4uc3Vic3RyaW5nKGxhc3RJbmRleCwgbmV3SW5kZXgpICsgbmV3UGF0KTsKLQkJCQlsYXN0SW5kZXggPSBuZXdJbmRleCArIG9sZFBhdC5sZW5ndGgoKTsKLQkJCQljb3VudENoYW5nZXMrKzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1N0cmluZy5hcHBlbmQoaW4uc3Vic3RyaW5nKGxhc3RJbmRleCkpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY291bnRDaGFuZ2VzID09IG51bUNoYW5nZXMpIHsKLQkJCQluZXdTdHJpbmcuYXBwZW5kKGluLnN1YnN0cmluZyhsYXN0SW5kZXgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JkKFN0cmluZyBpbiwgaW50IGkpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbik7Ci0JCWlmIChpIDw9IDAgfHwgaSA+IHN0LmNvdW50VG9rZW5zKCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSB7Ci0JCQlTdHJpbmcgcmV0ID0gbmV3IFN0cmluZygpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXJldCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWlmICgtLWkgPT0gMCkKLQkJCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JkcyhTdHJpbmcgaW4sIGludCBpKSB7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW4pOwotCQlpZiAoaSA8PSAwIHx8IGkgPiBzdC5jb3VudFRva2VucygpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCWlmICgtLWkgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJc3QubmV4dFRva2VuKCk7Ci0JCQl9Ci0JCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJCXJldHVybiBzdC5uZXh0VG9rZW4oIiIpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRTcGFjZXMoU3RyaW5nIGluLCBpbnQgbGVuKSB7Ci0JCWlmIChsZW4gPCAxKQotCQkJcmV0dXJuIGluOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoaW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IG51bVdvcmRzKFN0cmluZyBpbikgewotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluKTsKLQkJcmV0dXJuIHN0LmNvdW50VG9rZW5zKCk7Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBmaXJzdCBpbmRleCB3aXRoaW4gc3JjU3RyaW5nIHRoYXQgaXMgbm90IGluIHRoZSB2YWxpZFN0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gImFiY2RlZmciCi0JLy8gdmFsaWRTdHJpbmcgPSAiYmNmZyIKLQkvLyByZXR1cm4gPSAwIChpLmUuIGNoYXIgYSBpcyBub3QgaW4gImJjZmciKSAtIDFzdCBpbmRleCA9IDAKLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZBbnlCdXQoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHZhbGlkU3RyaW5nKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHNyY0xlbiA9IHNyY1N0cmluZy5sZW5ndGgoKTsKLQotCQkvLyB3YWxrIGJhY2t3YXJkIHRvIGZpbmQgaWYgYSBjaGFyIHdpdGhpbiBzcmNTdHJpbmcgaXMgaW4gdmFsaWRTdHJpbmcKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNMZW47IGkrKykgewotCQkJLy8gbm90IGZvdW5kLCBzdG9wIGl0Ci0JCQlpZiAodmFsaWRTdHJpbmcuaW5kZXhPZihzcmNTdHJpbmcuY2hhckF0KGkpKSA9PSAtMSkgewotCQkJCXJlc3VsdCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBsYXN0IGluZGV4IHdpdGhpbiBzcmNTdHJpbmcgdGhhdCBpcyBub3QgaW4gdGhlIHZhbGlkU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiYWJjZGVmZyIKLQkvLyB2YWxpZFN0cmluZyA9ICJiY2ZnIgotCS8vIHJldHVybiA9IDQgKGkuZS4gY2hhciBlIGlzIG5vdCBpbiAiYmNmZyIpIC0gMXN0IGluZGV4ID0gMAotCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2ZBbnlCdXQoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHZhbGlkU3RyaW5nKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHNyY0xlbiA9IHNyY1N0cmluZy5sZW5ndGgoKTsKLQotCQkvLyB3YWxrIGJhY2t3YXJkIHRvIGZpbmQgaWYgYSBjaGFyIHdpdGhpbiBzcmNTdHJpbmcgaXMgaW4gdmFsaWRTdHJpbmcKLQkJZm9yIChpbnQgaSA9IHNyY0xlbiAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkvLyBub3QgZm91bmQsIHN0b3AgaXQKLQkJCWlmICh2YWxpZFN0cmluZy5pbmRleE9mKHNyY1N0cmluZy5jaGFyQXQoaSkpID09IC0xKSB7Ci0JCQkJcmVzdWx0ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyByZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHNlYXJjaENoYXIgd2l0aGluIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gIjo6Zjo6Zjo6ZyIKLQkvLyBzZWFjaHJDaGFyID0gJzonCi0JLy8gcmV0dXJuID0gNgotCi0JcHVibGljIHN0YXRpYyBpbnQgb2NjdXJyZW5jZU9mKFN0cmluZyBzcmNTdHJpbmcsIGNoYXIgc2VhcmNoQ2hhcikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJLy8gd2FsayBiYWNrd2FyZCB0byBmaW5kIGlmIGEgY2hhciB3aXRoaW4gc3JjU3RyaW5nIGlzIGluIHZhbGlkU3RyaW5nCi0JCWlmIChzcmNTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjU3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkvLyBmb3VuZCwgaW5jcmVtZW50IHRoZSBjb3VudAotCQkJCWlmIChzZWFyY2hDaGFyID09IHNyY1N0cmluZy5jaGFyQXQoaSkpCi0JCQkJCXJlc3VsdCsrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBzdHJpcCB0aGUgbGVhZGluZyBwU3RyaW5nIGluIHRoZSBzcmNTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICI6OmY6OmY6OmciCi0JLy8gcFN0cmluZyAiOjoiCi0JLy8gcmV0dXJuID0gImY6OmY6OmciCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcExlYWRpbmcoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHBTdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdDsKLQotCQlpZiAoc3JjU3RyaW5nLnN0YXJ0c1dpdGgocFN0cmluZykpIC8vIGxlYWRpbmcgcGF0U3RyaW5nIGZvdW5kCi0JCQlyZXN1bHQgPSBzcmNTdHJpbmcuc3Vic3RyaW5nKHBTdHJpbmcubGVuZ3RoKCksIHNyY1N0cmluZy5sZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCS8vIG5vdCBmb3VuZAotCQkJcmVzdWx0ID0gc3JjU3RyaW5nOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gc3RyaXAgdGhlIHRyYWlsaW5nIHBTdHJpbmcgaW4gdGhlIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gImY6OmY6Omc6OiIKLQkvLyBwU3RyaW5nICI6OiIKLQkvLyByZXR1cm4gPSAiZjo6Zjo6ZyIKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwVHJhaWxpbmcoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHBTdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdDsKLQotCQlpZiAoc3JjU3RyaW5nLmVuZHNXaXRoKHBTdHJpbmcpKSAvLyBsZWFkaW5nIHBhdFN0cmluZyBmb3VuZAotCQkJcmVzdWx0ID0gc3JjU3RyaW5nLnN1YnN0cmluZygwLCBzcmNTdHJpbmcubGFzdEluZGV4T2YocFN0cmluZykpOwotCQllbHNlCi0JCQkvLyBub3QgZm91bmQKLQkJCXJlc3VsdCA9IHNyY1N0cmluZzsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHN0cmlwIHRoZSB0cmFpbGluZyBibGFua3MgaW4gdGhlIHNyYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwVHJhaWxpbmdCbGFua3MoU3RyaW5nIHNyYykgewotCi0JCWlmIChzcmMgIT0gbnVsbCkgewotCQkJd2hpbGUgKHNyYy5sZW5ndGgoKSA+IDApIHsKLQkJCQlpZiAoc3JjLmVuZHNXaXRoKCIgIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJc3JjID0gc3JjLnN1YnN0cmluZygwLCBzcmMubGVuZ3RoKCkgLSAxKTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNyYzsKLQl9Ci0KLQotCi0JLy8gcmV0dXJuIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgbnVtYmVyIG9mIGNvcGllcyBvZiBzcmNTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICJhYmMiCi0JLy8gbnVtYmVyT2ZDb3BpZXMgPSAyCi0JLy8gcmV0dXJuIHN0cmluZyA9ICJhYmNhYmMiCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5KFN0cmluZyBzcmNTdHJpbmcsIGludCBudW1iZXJPZkNvcGllcykgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChudW1iZXJPZkNvcGllcyA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IG51bWJlck9mQ29waWVzOyBpKyspCi0JCQkJcmVzdWx0LmFwcGVuZChzcmNTdHJpbmcpOwotCQl9Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3JjU3RyaW5nKTsKLQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8KLQkvLyByZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcnMgaW4gc3JjU3RyaW5nIGFyZSBpbiB7YS4uLnp9IG9yIHtBLi4uWn0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FscGhhYmV0aWMoU3RyaW5nIHNyY1N0cmluZykgewotCQlyZXR1cm4gKGxhc3RJbmRleE9mQW55QnV0KHNyY1N0cmluZywgQUxQSEFCRVQpID09IC0xKTsKLQl9Ci0KLQkvLwotCS8vIHJldHVybiB0cnVlIGlmIGFsbCBjaGFycyBpbiBzcmNTdHJpbmcgYXJlIGluIHthLi4ueix9IG9yIHtBLi4uWn0KLQkvLyB7MC4uLjl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbHBoYW51bWVyaWMoU3RyaW5nIHNyY1N0cmluZykgewotCQlyZXR1cm4gKGxhc3RJbmRleE9mQW55QnV0KHNyY1N0cmluZywgQUxQSEFOVU1FUklDKSA9PSAtMSk7Ci0JfQotCi0KLQkvLwotCS8vIHJldHVybiB0cnVlIGlmIGFsbCBjaGFycyBhcmUgaW4gJzAnIC0gJzknCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEaWdpdHMoU3RyaW5nIHNyY1N0cmluZykgewotCQlyZXR1cm4gKGxhc3RJbmRleE9mQW55QnV0KHNyY1N0cmluZywgTlVNRVJJQykgPT0gLTEpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHlPck51bGwoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nID09IG51bGwgfHwgc3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0KLQkvLwotCS8vIHJldHVybiB0aGUgc3RyaW5nIGFmdGVyIHRoZSBtYXRjaGluZyB0b2tlbiBpcyByZW1vdmVkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWF0Y2goU3RyaW5nIGluLCBTdHJpbmcgdG9rZW4pIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoaW4gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWluID0gaW4udHJpbSgpOwotCQlpZiAoaW4uc3RhcnRzV2l0aCh0b2tlbikpCi0JCQlyZXR1cm4gaW4uc3Vic3RyaW5nKHRva2VuLmxlbmd0aCgpLCBpbi5sZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkV4cGVjdGVkOiAiICsgdG9rZW4gKyAiIGJ1dCBnb3Q6IiArIHdvcmQoaW4sIDEpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGdldExvbmcoU3RyaW5nIHN0cikgewotCQl0cnkgewotCQkJcmV0dXJuIExvbmcucGFyc2VMb25nKHN0cik7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBtKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8vIHJldHVybiB0cnVlIGlmIHRoZSAiICIgYXBwZWFycyB3aXRoaW4gc3JjU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiYSBtIgotCS8vIHJldHVybiA9IHRydWUKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0RvdWJsZUJsYW5rcyhTdHJpbmcgc3JjU3RyaW5nKSB7Ci0JCVN0cmluZyBiYiA9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJY2hhciBiID0gYmIuY2hhckF0KDApOwotCi0JCWlmIChzcmNTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IChzcmNTdHJpbmcubGVuZ3RoKCkgLSAxKTsgaSsrKSB7Ci0JCQkJaWYgKChiID09IHNyY1N0cmluZy5jaGFyQXQoaSkpICYgKGIgPT0gc3JjU3RyaW5nLmNoYXJBdChpICsgMSkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM4MDM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1hNTENoYXJhY3RlclByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotLyoqCi0gKiBBIGNsYXNzIHJlcHJlc2VudGluZyBwcm9wZXJ0aWVzIG9mIGNoYXJhY3RlcnMgYWNjb3JkaW5nIHRvIHZhcmlvdXMgVzNDCi0gKiByZWNvbW1lbmRhdGlvbnMKLSAqIAotICogWE1MQ2hhcmFjdGVyUHJvcGVydGllcyBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBjb21tb25seSB1c2VkCi0gKiBjaGFyYWN0ZXIgdGVzdHMuCi0gKiAKLSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgdGFibGVzIHVzZWQgYnkgdGhlIGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlCi0gKiBhbHNvIHB1YmxpYywgYW5kIGFyZSBkaXJlY3RseSBhY2Nlc3NlZCBieSBwZXJmb3JtYW5jZSBjcml0aWNhbCByb3V0aW5lcy4KLSAqIAotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzIHsKLQkvKgotCSAqIFsyNl0gVmVyc2lvbk51bSA6Oj0gKFthLXpBLVowLTlfLjpdIHwgJy0nKSsKLQkgKiAKLQkgKiBOb3RlOiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBhc2NpaSBwb3J0aW9uIG9mIHRoZSBOYW1lQ2hhciBkZWZpbml0aW9uLgotCSAqLwotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIHZlcnNpb24gc3RyaW5nIGFjY29yZGluZyB0byBbMjZdIGluCi0JICogdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNrCi0JICogQHJldHVybiB0cnVlIGlmIHZlcnNpb24gaXMgYSB2YWxpZCB2ZXJzaW9uIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFZlcnNpb25OdW0oU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9uLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB2ZXJzaW9uLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JyB8fCBmZ0FzY2lpTmFtZUNoYXJbY2hdID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogWzgxXSBFbmNOYW1lIDo6PSBbQS1aYS16XSAoW0EtWmEtejAtOS5fXSB8ICctJykqCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgZW5jb2RpbmcgbmFtZSBhY2NvcmRpbmcgdG8gWzgxXSBpbgotCSAqIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0JICogCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgZW5jb2RpbmcgaXMgYSB2YWxpZCBlbmNvZGluZyBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkRW5jTmFtZShTdHJpbmcgZW5jb2RpbmcpIHsKLQkJaWYgKGVuY29kaW5nLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgY2ggPSBlbmNvZGluZy5jaGFyQXQoMCk7Ci0JCWlmIChjaCA+ICd6JyB8fCBmZ0FzY2lpQWxwaGFDaGFyW2NoXSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGVuY29kaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoID0gZW5jb2RpbmcuY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onIHx8IGZnQXNjaWlFbmNOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBbMTNdIFB1YmlkQ2hhciA6Oj0gI3gyMCB8ICN4RCB8ICN4QSB8IFthLXpBLVowLTldIHwKLQkgKiBbLScoKSssLi86PT87ISojQCRfJV0KLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBwdWJsaWMgaWRlbnRpZmllciBhY2NvcmRpbmcgdG8gWzEzXQotCSAqIGluIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgcHVibGljSWQgaXMgYSB2YWxpZCBwdWJsaWMgaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHZhbGlkUHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChwdWJsaWNJZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHB1YmxpY0lkLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBwdWJsaWNJZC5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPiAneicgfHwgZmdBc2NpaVB1YmlkQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOYW1lIGFjY29yZGluZyB0byBbNV0gaW4gdGhlIFhNTAotCSAqIDEuMCBSZWNvbW1lbmRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIE5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQljaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7Ci0JCWlmIChjaCA+ICd6JykgewotCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX0luaXRpYWxOYW1lQ2hhckZsYWcpID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYgKGZnQXNjaWlJbml0aWFsTmFtZUNoYXJbY2hdID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaCA9IG5hbWUuY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onKSB7Ci0JCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIGZyb20gdGhlIG5hbWVzcGFjZSByZWMgWzVdIE5DTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykKLQkgKiAoTmFtZU5DQ2hhcikqCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTkNOYW1lIGFjY29yZGluZyB0byBbNV0gZnJvbSB0aGUKLQkgKiBYTUwgTmFtZXNwYWNlcyAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNrCi0JICogQHJldHVybiB0cnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBOQ05hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWROQ05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgY2ggPSBuYW1lLmNoYXJBdCgwKTsKLQkJaWYgKGNoID4gJ3onKSB7Ci0JCQlpZiAoKGZnQ2hhckZsYWdzW2NoXSAmIEVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZmdBc2NpaUluaXRpYWxOQ05hbWVDaGFyW2NoXSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgewotCQkJY2ggPSBuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JykgewotCQkJCWlmICgoZmdDaGFyRmxhZ3NbY2hdICYgRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZnQXNjaWlOQ05hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qCi0JICogWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTm10b2tlbiBhY2NvcmRpbmcgdG8gWzddIGluIHRoZSBYTUwKLQkgKiAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbm10b2tlbgotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNqCi0JICogQHJldHVybiB0cnVlIGlmIG5tdG9rZW4gaXMgYSB2YWxpZCBObXRva2VuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkTm10b2tlbihTdHJpbmcgbm10b2tlbikgewotCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJaWYgKG5tdG9rZW4ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubXRva2VuLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBubXRva2VuLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JykgewotCQkJCWlmICgoZmdDaGFyRmxhZ3NbY2hdICYgRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEhlcmUgYXJlIHRhYmxlcyB1c2VkIHRvIGJ1aWxkIGNoYXJhY3RlciBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpWERpZ2l0Q2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcwJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnOScKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnQScgLSAnRicKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnYScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAtCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2YnCi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlBbHBoYUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAtCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgLy8gJ1AnIC0gJ1onCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpRW5jTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAvLyAnLScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJy4nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkUKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnMCcgLSAnOScKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaVB1YmlkQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICcgJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnIScsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJyMnLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICckJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnJScsCi0JCQkJLy8gJ1wnJywgJygnLCAnKScsICcqJywgJysnLCAnLCcsICctJywgJy4nLCAnLycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAxLCAvLyAnMCcgLSAnOScsCi0JCQkJCQkJCQkJCQkJCQkJLy8gJzonLCAnOycsCi0JCQkJCQkJCQkJCQkJCQkJLy8gJz0nLCAnPycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQCcsICdBJyAtCi0JCQkJCQkJCQkJCQkJCQkJLy8gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlJbml0aWFsTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAvLyAnOicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDNBCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ0EnIC0gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIC8vICctJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcuJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRQotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIC8vICcwJyAtICc5JwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnOicgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDNBCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ0EnIC0gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlJbml0aWFsTkNOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICc6JwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4M0EKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaU5DTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAvLyAnLScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnLicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkUKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnMCcgLSAnOScKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJzonIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHgzQQotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdBJyAtICdPJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC8vICdQJyAtICdaJwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnXycgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDVGCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpQ2hhckRhdGFbXSA9IHs0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCA0LCA0LCA0LCA0LCA0LCA0LCAvLyB0YWIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MDkKLQkJCQk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnJicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MjYKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAvLyAnPCcgaXMgMHgzQwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIC8vICddJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHg1RAotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpV1NDaGFyRGF0YVtdID0gezQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDQsIDUsIDQsIDQsIC8vIHRhYgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwOSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBMRgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwQSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBDUgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwRAotCQkJCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcgJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyMCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnJicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MjYKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAvLyAnPCcgaXMgMHgzQwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIC8vICddJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHg1RAotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFX0NoYXJEYXRhRmxhZyA9IDEgPDwgMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRV9Jbml0aWFsTmFtZUNoYXJGbGFnID0gMSA8PCAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFX05hbWVDaGFyRmxhZyA9IDEgPDwgMjsKLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBmZ0NoYXJGbGFncyA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRDaGFyRmxhZ3MoKSB7Ci0JCWlmIChmZ0NoYXJGbGFncyA9PSBudWxsKSB7Ci0JCQlmZ0NoYXJGbGFncyA9IG5ldyBieXRlWzB4MTAwMDBdOwotCQkJc2V0RmxhZ0ZvclJhbmdlKGZnQ2hhckRhdGFSYW5nZXMsIEVfQ2hhckRhdGFGbGFnKTsKLQkJCXNldEZsYWdGb3JSYW5nZShmZ0luaXRpYWxOYW1lQ2hhclJhbmdlcywgKGJ5dGUpIChFX0luaXRpYWxOYW1lQ2hhckZsYWcgfCBFX05hbWVDaGFyRmxhZykpOwotCQkJc2V0RmxhZ0ZvclJhbmdlKGZnTmFtZUNoYXJSYW5nZXMsIEVfTmFtZUNoYXJGbGFnKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RmxhZ0ZvclJhbmdlKGNoYXJbXSByYW5nZXMsIGJ5dGUgZmxhZykgewotCQlpbnQgaTsKLQkJaW50IGNoOwotCQlmb3IgKGkgPSAwOyAoY2ggPSByYW5nZXNbaV0pICE9IDA7IGkgKz0gMikgewotCQkJaW50IGVuZGNoID0gcmFuZ2VzW2kgKyAxXTsKLQkJCXdoaWxlIChjaCA8PSBlbmRjaCkKLQkJCQlmZ0NoYXJGbGFnc1tjaCsrXSB8PSBmbGFnOwotCQl9Ci0JCWZvciAoaSsrOyAoY2ggPSByYW5nZXNbaV0pICE9IDA7IGkrKykKLQkJCWZnQ2hhckZsYWdzW2NoXSB8PSBmbGFnOwotCX0KLQotCS8qCi0JICogWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gLy8gYW55IFVuaWNvZGUgY2hhcmFjdGVyLAotCSAqIGV4Y2x1ZGluZyB0aGUgfCBbI3hFMDAwLSN4RkZGRF0gfCBbI3gxMDAwMC0jeDEwRkZGRl0gLy8gc3Vycm9nYXRlCi0JICogYmxvY2tzLCBGRkZFLCBhbmQgRkZGRi4gWzE0XSBDaGFyRGF0YSA6Oj0gW148Jl0qIC0gKFtePCZdKiAnXV0+JyBbXjwmXSopCi0JICogCi0JICogV2Ugd2lsbCB1c2UgQ2hhciAtICggW148Jl0gfCAnXScgfCAjeEEgfCAjeEQgKSBhbmQgaGFuZGxlIHRoZSBzcGVjaWFsCi0JICogY2FzZXMgaW5saW5lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgZmdDaGFyRGF0YVJhbmdlc1tdID0gezB4MDAyMCwgMHgwMDI1LCAvLyAnJicgaXMKLQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwMDI2Ci0JCQkJMHgwMDI3LCAweDAwM0IsIC8vICc8JyBpcyAweDAwM0MKLQkJCQkweDAwM0QsIDB4MDA1QywgLy8gJ10nIGlzIDB4MDA1RAotCQkJCTB4MDA1RSwgMHhEN0ZGLCAweEUwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDksIC8vIHRhYgotCQkJCTB4MDAwMH07Ci0JLyoKLQkgKiBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSogWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfAotCSAqIERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwgQ29tYmluaW5nQ2hhciB8IEV4dGVuZGVyIFs4NF0gTGV0dGVyCi0JICogOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMgWzg1XSBCYXNlQ2hhciA6Oj0gPHNlZSBzdGFuZGFyZD4gWzg2XQotCSAqIElkZW9ncmFwaGljIDo6PSA8c2VlIHN0YW5kYXJkPiBbODddIENvbWJpbmluZ0NoYXIgOjo9IDxzZWUgc3RhbmRhcmQ+Ci0JICogWzg4XSBEaWdpdCA6Oj0gPHNlZSBzdGFuZGFyZD4gWzg5XSBFeHRlbmRlciA6Oj0gPHNlZSBzdGFuZGFyZD4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGZnSW5pdGlhbE5hbWVDaGFyUmFuZ2VzW10gPSB7Ci0JLy8KLQkJCQkvLyBSYW5nZXM6Ci0JCQkJLy8KLQkJCQkvLyBCYXNlQ2hhciByYW5nZXMKLQkJCQkvLwotCQkJCTB4MDA0MSwgMHgwMDVBLCAweDAwNjEsIDB4MDA3QSwgMHgwMEMwLCAweDAwRDYsIDB4MDBEOCwgMHgwMEY2LCAweDAwRjgsIDB4MDEzMSwgMHgwMTM0LCAweDAxM0UsIDB4MDE0MSwgMHgwMTQ4LCAweDAxNEEsIDB4MDE3RSwgMHgwMTgwLCAweDAxQzMsIDB4MDFDRCwgMHgwMUYwLCAweDAxRjQsIDB4MDFGNSwgMHgwMUZBLCAweDAyMTcsIDB4MDI1MCwgMHgwMkE4LCAweDAyQkIsIDB4MDJDMSwgMHgwMzg4LCAweDAzOEEsIDB4MDM4RSwgMHgwM0ExLCAweDAzQTMsIDB4MDNDRSwgMHgwM0QwLCAweDAzRDYsIDB4MDNFMiwgMHgwM0YzLCAweDA0MDEsIDB4MDQwQywgMHgwNDBFLCAweDA0NEYsIDB4MDQ1MSwgMHgwNDVDLCAweDA0NUUsIDB4MDQ4MSwgMHgwNDkwLCAweDA0QzQsIDB4MDRDNywgMHgwNEM4LCAweDA0Q0IsIDB4MDRDQywgMHgwNEQwLCAweDA0RUIsIDB4MDRFRSwgMHgwNEY1LCAweDA0RjgsIDB4MDRGOSwgMHgwNTMxLCAweDA1NTYsIDB4MDU2MSwgMHgwNTg2LCAweDA1RDAsIDB4MDVFQSwgMHgwNUYwLCAweDA1RjIsIDB4MDYyMSwgMHgwNjNBLCAweDA2NDEsIDB4MDY0QSwgMHgwNjcxLCAweDA2QjcsIDB4MDZCQSwgMHgwNkJFLCAweDA2QzAsIDB4MDZDRSwgMHgwNkQwLCAweDA2RDMsIDB4MDZFNSwgMHgwNkU2LCAweDA5MDUsIDB4MDkzOSwgMHgwOTU4LCAweDA5NjEsIDB4MDk4NSwgMHgwOThDLCAweDA5OEYsIDB4MDk5MCwgMHgwOTkzLCAweDA5QTgsIDB4MDlBQSwgMHgwOUIwLCAweDA5QjYsIDB4MDlCOSwgMHgwOURDLCAweDA5REQsIDB4MDlERiwgMHgwOUUxLCAweDA5RjAsIDB4MDlGMSwgMHgwQTA1LCAweDBBMEEsIDB4MEEwRiwgMHgwQTEwLCAweDBBMTMsIDB4MEEyOCwgMHgwQTJBLCAweDBBMzAsIDB4MEEzMiwgMHgwQTMzLCAweDBBMzUsIDB4MEEzNiwgMHgwQTM4LCAweDBBMzksIDB4MEE1OSwgMHgwQTVDLCAweDBBNzIsIDB4MEE3NCwgMHgwQTg1LCAweDBBOEIsIDB4MEE4RiwgMHgwQTkxLAotCQkJCTB4MEE5MywgMHgwQUE4LCAweDBBQUEsIDB4MEFCMCwgMHgwQUIyLCAweDBBQjMsIDB4MEFCNSwgMHgwQUI5LCAweDBCMDUsIDB4MEIwQywgMHgwQjBGLCAweDBCMTAsIDB4MEIxMywgMHgwQjI4LCAweDBCMkEsIDB4MEIzMCwgMHgwQjMyLCAweDBCMzMsIDB4MEIzNiwgMHgwQjM5LCAweDBCNUMsIDB4MEI1RCwgMHgwQjVGLCAweDBCNjEsIDB4MEI4NSwgMHgwQjhBLCAweDBCOEUsIDB4MEI5MCwgMHgwQjkyLCAweDBCOTUsIDB4MEI5OSwgMHgwQjlBLCAweDBCOUUsIDB4MEI5RiwgMHgwQkEzLCAweDBCQTQsIDB4MEJBOCwgMHgwQkFBLCAweDBCQUUsIDB4MEJCNSwgMHgwQkI3LCAweDBCQjksIDB4MEMwNSwgMHgwQzBDLCAweDBDMEUsIDB4MEMxMCwgMHgwQzEyLCAweDBDMjgsIDB4MEMyQSwgMHgwQzMzLCAweDBDMzUsIDB4MEMzOSwgMHgwQzYwLCAweDBDNjEsIDB4MEM4NSwgMHgwQzhDLCAweDBDOEUsIDB4MEM5MCwgMHgwQzkyLCAweDBDQTgsIDB4MENBQSwgMHgwQ0IzLCAweDBDQjUsIDB4MENCOSwgMHgwQ0UwLCAweDBDRTEsIDB4MEQwNSwgMHgwRDBDLCAweDBEMEUsIDB4MEQxMCwgMHgwRDEyLCAweDBEMjgsIDB4MEQyQSwgMHgwRDM5LCAweDBENjAsIDB4MEQ2MSwgMHgwRTAxLCAweDBFMkUsIDB4MEUzMiwgMHgwRTMzLCAweDBFNDAsIDB4MEU0NSwgMHgwRTgxLCAweDBFODIsIDB4MEU4NywgMHgwRTg4LCAweDBFOTQsIDB4MEU5NywgMHgwRTk5LCAweDBFOUYsIDB4MEVBMSwgMHgwRUEzLCAweDBFQUEsIDB4MEVBQiwgMHgwRUFELCAweDBFQUUsIDB4MEVCMiwgMHgwRUIzLCAweDBFQzAsIDB4MEVDNCwgMHgwRjQwLCAweDBGNDcsIDB4MEY0OSwgMHgwRjY5LCAweDEwQTAsIDB4MTBDNSwgMHgxMEQwLCAweDEwRjYsIDB4MTEwMiwgMHgxMTAzLCAweDExMDUsIDB4MTEwNywgMHgxMTBCLCAweDExMEMsIDB4MTEwRSwgMHgxMTEyLCAweDExNTQsIDB4MTE1NSwgMHgxMTVGLCAweDExNjEsIDB4MTE2RCwgMHgxMTZFLAotCQkJCTB4MTE3MiwgMHgxMTczLCAweDExQUUsIDB4MTFBRiwgMHgxMUI3LCAweDExQjgsIDB4MTFCQywgMHgxMUMyLCAweDFFMDAsIDB4MUU5QiwgMHgxRUEwLCAweDFFRjksIDB4MUYwMCwgMHgxRjE1LCAweDFGMTgsIDB4MUYxRCwgMHgxRjIwLCAweDFGNDUsIDB4MUY0OCwgMHgxRjRELCAweDFGNTAsIDB4MUY1NywgMHgxRjVGLCAweDFGN0QsIDB4MUY4MCwgMHgxRkI0LCAweDFGQjYsIDB4MUZCQywgMHgxRkMyLCAweDFGQzQsIDB4MUZDNiwgMHgxRkNDLCAweDFGRDAsIDB4MUZEMywgMHgxRkQ2LCAweDFGREIsIDB4MUZFMCwgMHgxRkVDLCAweDFGRjIsIDB4MUZGNCwgMHgxRkY2LCAweDFGRkMsIDB4MjEyQSwgMHgyMTJCLCAweDIxODAsIDB4MjE4MiwgMHgzMDQxLCAweDMwOTQsIDB4MzBBMSwgMHgzMEZBLCAweDMxMDUsIDB4MzEyQywgMHhBQzAwLCAweEQ3QTMsCi0JCQkJLy8KLQkJCQkvLyBJZGVvZ3JhcGhpYyByYW5nZXMKLQkJCQkvLwotCQkJCTB4MzAyMSwgMHgzMDI5LCAweDRFMDAsIDB4OUZBNSwKLQkJCQkvLwotCQkJCS8vIFJhbmdlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDAsCi0JCQkJLy8KLQkJCQkvLyBTaW5nbGUgY2hhciB2YWx1ZXMKLQkJCQkvLwotCQkJCTB4MDAzQSwgLy8gJzonCi0JCQkJMHgwMDVGLCAvLyAnXycKLQkJCQkvLwotCQkJCS8vIEJhc2VDaGFyIHNpbmdsZXMKLQkJCQkvLwotCQkJCTB4MDM4NiwgMHgwMzhDLCAweDAzREEsIDB4MDNEQywgMHgwM0RFLCAweDAzRTAsIDB4MDU1OSwgMHgwNkQ1LCAweDA5M0QsIDB4MDlCMiwgMHgwQTVFLCAweDBBOEQsIDB4MEFCRCwgMHgwQUUwLCAweDBCM0QsIDB4MEI5QywgMHgwQ0RFLCAweDBFMzAsIDB4MEU4NCwgMHgwRThBLCAweDBFOEQsIDB4MEVBNSwgMHgwRUE3LCAweDBFQjAsIDB4MEVCRCwgMHgxMTAwLCAweDExMDksIDB4MTEzQywgMHgxMTNFLCAweDExNDAsIDB4MTE0QywgMHgxMTRFLCAweDExNTAsIDB4MTE1OSwgMHgxMTYzLCAweDExNjUsIDB4MTE2NywgMHgxMTY5LCAweDExNzUsIDB4MTE5RSwgMHgxMUE4LCAweDExQUIsIDB4MTFCQSwgMHgxMUVCLCAweDExRjAsIDB4MTFGOSwgMHgxRjU5LCAweDFGNUIsIDB4MUY1RCwgMHgxRkJFLCAweDIxMjYsIDB4MjEyRSwKLQkJCQkvLwotCQkJCS8vIElkZW9ncmFwaGljIHNpbmdsZXMKLQkJCQkvLwotCQkJCTB4MzAwNywKLQkJCQkvLwotCQkJCS8vIFNpbmdsZXMgZW5kIG1hcmtlcgotCQkJCS8vCi0JCQkJMHgwMDAwfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGZnTmFtZUNoYXJSYW5nZXNbXSA9IHsKLQkvLwotCQkJCS8vIFJhbmdlczoKLQkJCQkvLwotCQkJCTB4MDAyRCwgMHgwMDJFLCAvLyAnLScgYW5kICcuJwotCQkJCS8vCi0JCQkJLy8gQ29tYmluaW5nQ2hhciByYW5nZXMKLQkJCQkvLwotCQkJCTB4MDMwMCwgMHgwMzQ1LCAweDAzNjAsIDB4MDM2MSwgMHgwNDgzLCAweDA0ODYsIDB4MDU5MSwgMHgwNUExLCAweDA1QTMsIDB4MDVCOSwgMHgwNUJCLCAweDA1QkQsIDB4MDVDMSwgMHgwNUMyLCAweDA2NEIsIDB4MDY1MiwgMHgwNkQ2LCAweDA2REMsIDB4MDZERCwgMHgwNkRGLCAweDA2RTAsIDB4MDZFNCwgMHgwNkU3LCAweDA2RTgsIDB4MDZFQSwgMHgwNkVELCAweDA5MDEsIDB4MDkwMywgMHgwOTNFLCAweDA5NEMsIDB4MDk1MSwgMHgwOTU0LCAweDA5NjIsIDB4MDk2MywgMHgwOTgxLCAweDA5ODMsIDB4MDlDMCwgMHgwOUM0LCAweDA5QzcsIDB4MDlDOCwgMHgwOUNCLCAweDA5Q0QsIDB4MDlFMiwgMHgwOUUzLCAweDBBNDAsIDB4MEE0MiwgMHgwQTQ3LCAweDBBNDgsIDB4MEE0QiwgMHgwQTRELCAweDBBNzAsIDB4MEE3MSwgMHgwQTgxLCAweDBBODMsIDB4MEFCRSwgMHgwQUM1LCAweDBBQzcsIDB4MEFDOSwgMHgwQUNCLCAweDBBQ0QsIDB4MEIwMSwgMHgwQjAzLCAweDBCM0UsIDB4MEI0MywgMHgwQjQ3LCAweDBCNDgsIDB4MEI0QiwgMHgwQjRELCAweDBCNTYsIDB4MEI1NywgMHgwQjgyLCAweDBCODMsIDB4MEJCRSwgMHgwQkMyLCAweDBCQzYsIDB4MEJDOCwgMHgwQkNBLCAweDBCQ0QsIDB4MEMwMSwgMHgwQzAzLCAweDBDM0UsIDB4MEM0NCwgMHgwQzQ2LCAweDBDNDgsIDB4MEM0QSwgMHgwQzRELCAweDBDNTUsIDB4MEM1NiwgMHgwQzgyLCAweDBDODMsIDB4MENCRSwgMHgwQ0M0LCAweDBDQzYsIDB4MENDOCwgMHgwQ0NBLCAweDBDQ0QsIDB4MENENSwgMHgwQ0Q2LCAweDBEMDIsIDB4MEQwMywgMHgwRDNFLCAweDBENDMsIDB4MEQ0NiwgMHgwRDQ4LCAweDBENEEsIDB4MEQ0RCwgMHgwRTM0LCAweDBFM0EsIDB4MEU0NywgMHgwRTRFLCAweDBFQjQsIDB4MEVCOSwgMHgwRUJCLCAweDBFQkMsIDB4MEVDOCwgMHgwRUNELCAweDBGMTgsIDB4MEYxOSwgMHgwRjcxLCAweDBGODQsIDB4MEY4NiwgMHgwRjhCLAotCQkJCTB4MEY5MCwgMHgwRjk1LCAweDBGOTksIDB4MEZBRCwgMHgwRkIxLCAweDBGQjcsIDB4MjBEMCwgMHgyMERDLCAweDMwMkEsIDB4MzAyRiwKLQkJCQkvLwotCQkJCS8vIERpZ2l0IHJhbmdlcwotCQkJCS8vCi0JCQkJMHgwMDMwLCAweDAwMzksIDB4MDY2MCwgMHgwNjY5LCAweDA2RjAsIDB4MDZGOSwgMHgwOTY2LCAweDA5NkYsIDB4MDlFNiwgMHgwOUVGLCAweDBBNjYsIDB4MEE2RiwgMHgwQUU2LCAweDBBRUYsIDB4MEI2NiwgMHgwQjZGLCAweDBCRTcsIDB4MEJFRiwgMHgwQzY2LCAweDBDNkYsIDB4MENFNiwgMHgwQ0VGLCAweDBENjYsIDB4MEQ2RiwgMHgwRTUwLCAweDBFNTksIDB4MEVEMCwgMHgwRUQ5LCAweDBGMjAsIDB4MEYyOSwKLQkJCQkvLwotCQkJCS8vIEV4dGVuZGVyIHJhbmdlcwotCQkJCS8vCi0JCQkJMHgzMDMxLCAweDMwMzUsIDB4MzA5RCwgMHgzMDlFLCAweDMwRkMsIDB4MzBGRSwKLQkJCQkvLwotCQkJCS8vIFJhbmdlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDAsCi0JCQkJLy8KLQkJCQkvLyBTaW5nbGUgY2hhciB2YWx1ZXMKLQkJCQkvLwotCQkJCS8vIENvbWJpbmluZ0NoYXIgc2luZ2xlcwotCQkJCS8vCi0JCQkJMHgwNUJGLCAweDA1QzQsIDB4MDY3MCwgMHgwOTNDLCAweDA5NEQsIDB4MDlCQywgMHgwOUJFLCAweDA5QkYsIDB4MDlENywgMHgwQTAyLCAweDBBM0MsIDB4MEEzRSwgMHgwQTNGLCAweDBBQkMsIDB4MEIzQywgMHgwQkQ3LCAweDBENTcsIDB4MEUzMSwgMHgwRUIxLCAweDBGMzUsIDB4MEYzNywgMHgwRjM5LCAweDBGM0UsIDB4MEYzRiwgMHgwRjk3LCAweDBGQjksIDB4MjBFMSwgMHgzMDk5LCAweDMwOUEsCi0JCQkJLy8KLQkJCQkvLyBFeHRlbmRlciBzaW5nbGVzCi0JCQkJLy8KLQkJCQkweDAwQjcsIDB4MDJEMCwgMHgwMkQxLCAweDAzODcsIDB4MDY0MCwgMHgwRTQ2LCAweDBFQzYsIDB4MzAwNSwKLQkJCQkvLwotCQkJCS8vIFNpbmdsZXMgZW5kIG1hcmtlcgotCQkJCS8vCi0JCQkJMHgwMDAwfTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOWYyYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IERURCBWYWxpZGF0aW9uCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRFREVmFsaWRhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfUkVGX0VMRU1FTlRfVU5ERUZJTkVEOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19EVERfSU5WQUxJRF9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ESUFMT0dfRFREX0lOVkFMSURfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19EVERfVkFMSURfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX0RURF9WQUxJRF9USVRMRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRFREVmFsaWRhdGlvblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19yZXF1aXJlZF9maWxlc18zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfNDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERWYWxpZGF0aW9uTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhMmQ2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0aW9uUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSEKLSEgVmFsaWRhdGUgRFRECi0hCi1fVUlfRElBTE9HX0RURF9JTlZBTElEX1RJVExFICA9IFZhbGlkYXRpb24gRmFpbGVkCi1fVUlfRElBTE9HX0RURF9WQUxJRF9USVRMRSAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1fVUlfRElBTE9HX0RURF9WQUxJRF9URVhUICAgICA9IFRoZSBEVEQgZmlsZSBpcyB2YWxpZC4KLV9VSV9ESUFMT0dfRFREX0lOVkFMSURfVEVYVCAgID0gVGhlIERURCBmaWxlIGlzIG5vdCB2YWxpZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciBlcnJvciBtZXNzYWdlcy4KLQotIQotISBSZWZlcmVuY2VkIEVsZW1lbnQgVmFsaWRhdGlvbgotIQotX0VSUk9SX1JFRl9FTEVNRU5UX1VOREVGSU5FRCA9IFRoZSBlbGVtZW50IHswfSBoYXMgbm90IGJlZW4gZGVjbGFyZWQuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzE9UmVxdWlyZWQgZmlsZXMgeGVyY2VzSW1wbC5qYXIgYW5kIHhtbFBhcnNlckFQSXMuamFyIGNhbm5vdCBiZSBmb3VuZC5cblxuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzI9RG93bmxvYWQgWGVyY2VzIDIuNi4yIGFuZCBwbGFjZSB4ZXJjZXNJbXBsLmphciBhbmQgeG1sUGFyc2VyQVBJcy5qYXIgaW4gYSBmb2xkZXIgZW50aXRsZWQgamFycyBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uIHBsdWdpbi5cblxuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzM9Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHd3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy94bWwveGVyY2VzSW5mby54bWwuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzQ9TWlzc2luZyBYZXJjZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWIwYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5MYXp5VVJMSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogRFREIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERWYWxpZGF0b3IgewotCS8qKgotCSAqIEFuIGVudGl0eSByZXNvbHZlciB0aGF0IHdyYXBzIGEgVVJJIHJlc29sdmVyLgotCSAqLwotCWNsYXNzIERUREVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgewotCQlwcml2YXRlIFN0cmluZyBmQmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJcHJpdmF0ZSBVUklSZXNvbHZlciBmVVJJUmVzb2x2ZXIgPSBudWxsOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3Rvci4KLQkJICogCi0JCSAqIEBwYXJhbSBpZHJlc29sdmVyCi0JCSAqICAgICAgICAgICAgVGhlIGlkcmVzb2x2ZXIgdGhpcyBlbnRpdHkgcmVzb2x2ZXIgd3JhcHMuCi0JCSAqIEBwYXJhbSBiYXNlbG9jYXRpb24KLQkJICogICAgICAgICAgICBUaGUgYmFzZSBsb2NhdGlvbiB0byByZXNvbHZlIHdpdGguCi0JCSAqLwotCQlwdWJsaWMgRFRERW50aXR5UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIsIFN0cmluZyBiYXNlbG9jYXRpb24pIHsKLQkJCXRoaXMuZlVSSVJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRPRE8gY3M6IHdlIG5ldmVyIHNlZW0gdG8gc2V0IGEgVVJJUmVzb2x2ZXIKLSAgICAgICAgICAgIC8vIEkgY3JlYXRlIG9uZSBoZXJlIHVwIGZyb250IGp1c3QgaW5jYXNlCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGZVUklSZXNvbHZlciA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmVVJJUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAKLQkJCXRoaXMuZkJhc2VMb2NhdGlvbiA9IGJhc2Vsb2NhdGlvbjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0JCQlpZiAoZkJhc2VMb2NhdGlvbi5lcXVhbHMoc3lzdGVtSWQpKSB7Ci0JCQkJbG9jYXRpb24gPSBzeXN0ZW1JZDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxvY2F0aW9uID0gZlVSSVJlc29sdmVyLnJlc29sdmUoZkJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCUlucHV0U291cmNlIGlzID0gbnVsbDsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsICYmICFsb2NhdGlvbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkgIC8vIENTIDogd2hpbGUgd29ya2luZyBvbiBidWcgMTEzNTM3IEkgbm90aWNlZCB3ZSdyZSBub3QgdXNpbmcgdGhlIExhenlVUkxJbnB1dFN0cmVhbQotCQkgICAgICAvLyBzbyBmaXhlZCB0aGlzIHRvIGF2b2lkIGxlYWtpbmcgZmlsZSBoYW5kbGVzCi0JCQkgIC8vCi0gICAgICAgICAgICAgIFN0cmluZyBwaHlzaWNhbCA9IGZVUklSZXNvbHZlci5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihmQmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgbG9jYXRpb24pOyAKLQkJCSAgaXMgPSBuZXcgSW5wdXRTb3VyY2UobG9jYXRpb24pOwotCQkJICBpcy5zZXRCeXRlU3RyZWFtKG5ldyBMYXp5VVJMSW5wdXRTdHJlYW0ocGh5c2ljYWwpKTsKLQkJCX0KLQkJCXJldHVybiBpczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFuIGVycm9yIGhhbmRsZXIgZm9yIERURCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLQkgKi8KLQljbGFzcyBEVERFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIgewotCi0JCXByaXZhdGUgZmluYWwgaW50IEVSUk9SID0gMDsKLQkJcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uSW5mbyBmVmFsaWRhdGlvbkluZm87Ci0KLQkJcHJpdmF0ZSBmaW5hbCBpbnQgV0FSTklORyA9IDE7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIHZhbGluZm8KLQkJICogICAgICAgICAgICBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byB1c2UgdG8gcmVnaXN0ZXIgdmFsaWRhdGlvbgotCQkgKiAgICAgICAgICAgIG1lc3NhZ2VzLgotCQkgKi8KLQkJcHVibGljIERUREVycm9ySGFuZGxlcihWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKSB7Ci0JCQl0aGlzLmZWYWxpZGF0aW9uSW5mbyA9IHZhbGluZm87Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotCQkgKiAKLQkJICogQHBhcmFtIGV4Y2VwdGlvbgotCQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JCSAqICAgICAgICAgICAgbWVzc2FnZS4KLQkJICogQHBhcmFtIHNldmVyaXR5Ci0JCSAqICAgICAgICAgICAgVGhlIHNldmVyaXR5IG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24sIGludCBzZXZlcml0eSkgewotCQkJaWYgKGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpICE9IG51bGwpIHsKLQkJCQlpZiAoc2V2ZXJpdHkgPT0gV0FSTklORykgewotCQkJCQlmVmFsaWRhdGlvbkluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZWYWxpZGF0aW9uSW5mby5hZGRFcnJvcihleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIFdBUk5JTkcpOwotCQl9Ci0JfQotCi0JY2xhc3MgTXVsdGlIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5EVERIYW5kbGVyLCBDb250ZW50SGFuZGxlciwgTGV4aWNhbEhhbmRsZXIsIERlY2xIYW5kbGVyIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTU9ESUZJRVJTID0gIiorPyI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfREVMSU1JVEVSUyA9ICIsKCl8ICI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIExpc3QgZkVsZW1EZWNscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIEhhc2h0YWJsZSBmRWxlbVJlZnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJcHJpdmF0ZSBMaXN0IGZJZ25vcmVFbGVtTW9kZWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHJpdmF0ZSBMaXN0IGZJZ25vcmVFbGVtUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIExvY2F0b3IgZkxvY2F0b3IgPSBudWxsOwotCi0JCXB1YmxpYyBNdWx0aUhhbmRsZXIoKSB7Ci0JCQlmSWdub3JlRWxlbVJlZnMuYWRkKCIjUENEQVRBIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZJZ25vcmVFbGVtTW9kZWwuYWRkKCJBTlkiKTsgLy8kTk9OLU5MUy0xJAotCQkJZklnbm9yZUVsZW1Nb2RlbC5hZGQoIkVNUFRZIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2F0dHJpYnV0ZURlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGVEZWNsKFN0cmluZyBlTmFtZSwgU3RyaW5nIGFOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlRGVmYXVsdCwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjY29tbWVudChjaGFyW10sIGludCwgaW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgY29tbWVudChjaGFyW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZWxlbWVudERlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBtb2RlbCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBBZGQgdGhpcyBlbGVtZW50IHRvIHRoZSBsaXN0IG9mIGRlY2xhcmVkIGVsZW1lbnRzLgotCQkJZkVsZW1EZWNscy5hZGQobmFtZSk7Ci0KLQkJCS8vIFJldHVybiBpZiB0aGUgZWxlbWVudCBtb2RlbCBzaG91bGQgYmUgaWdub3JlZC4gVGhlIG1vZGVsIHNob3VsZAotCQkJLy8gYmUKLQkJCS8vIGlnbm9yZWQgaW4gc3VjaCBjYXNlcyBhcyB3aGVuIGl0IGlzIGVxdWFsIHRvIEVNUFRZIG9yIEFOWS4KLQkJCWlmIChmSWdub3JlRWxlbU1vZGVsLmNvbnRhaW5zKG1vZGVsKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIEFkZCBlYWNoIHJlZmVyZW5jZWQgZWxlbWVudCB0byB0aGUgbGlzdCBvZiByZWZlcmVuY2VkIGVsZW1lbnRzCi0JCQlpbnQgbGluZSA9IGZMb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLQkJCWludCBjb2x1bW4gPSBmTG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKTsKLQkJCVN0cmluZyB1cmkgPSBmTG9jYXRvci5nZXRTeXN0ZW1JZCgpOwotCi0JCQlTdHJpbmdUb2tlbml6ZXIgc3RydG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2RlbCwgTU9ERUxfREVMSU1JVEVSUyk7Ci0JCQl3aGlsZSAoc3RydG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0cnRvay5uZXh0VG9rZW4oKTsKLQkJCQlpbnQgdG9rZW5sZW5ndGggPSB0b2tlbi5sZW5ndGgoKTsKLQkJCQlpZiAoRUxFTUVOVF9NT0RJRklFUlMuaW5kZXhPZih0b2tlbi5jaGFyQXQodG9rZW5sZW5ndGggLSAxKSkgIT0gLTEpIHsKLQkJCQkJdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgdG9rZW5sZW5ndGggLSAxKTsKLQkJCQkJLy8gSWYgdGhlIHRva2VuIGlzIG5vdyBlbXB0eSAoaXQgd2FzIG9ubHkgPywqIG9yICspIHRoZW4KLQkJCQkJLy8gY29udGludWUuCi0JCQkJCWlmICh0b2tlbi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZklnbm9yZUVsZW1SZWZzLmNvbnRhaW5zKHRva2VuKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRWxlbWVudFJlZkxvY2F0aW9uIGVsZW1Mb2MgPSAoRWxlbWVudFJlZkxvY2F0aW9uKSBmRWxlbVJlZnMuZ2V0KHRva2VuKTsKLQkJCQlFbGVtZW50UmVmTG9jYXRpb24gdG9rZW5Mb2MgPSBuZXcgRWxlbWVudFJlZkxvY2F0aW9uKGxpbmUsIGNvbHVtbiwgdXJpLCBlbGVtTG9jKTsKLQkJCQlmRWxlbVJlZnMucHV0KHRva2VuLCB0b2tlbkxvYyk7Ci0JCQl9Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZENEQVRBKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZERURCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmREVEQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjZW5kRW50aXR5KGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNleHRlcm5hbEVudGl0eURlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZXh0ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qKgotCQkgKiBHZXQgdGhlIGxpc3Qgb2YgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0JCSAqIAotCQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpIHsKLQkJCXJldHVybiBmRWxlbURlY2xzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCB0aGUgZWxlbWVudCByZWZlcmVuY2VzIGhhc2h0YWJsZS4KLQkJICogCi0JCSAqIEByZXR1cm4gVGhlIGVsZW1lbnQgcmVmZXJlbmNlcyBoYXNodGFibGUuCi0JCSAqLwotCQlwdWJsaWMgSGFzaHRhYmxlIGdldEVsZW1lbnRSZWZlcmVuY2VzKCkgewotCQkJcmV0dXJuIGZFbGVtUmVmczsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2ludGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc2V0RG9jdW1lbnRMb2NhdG9yKG9yZy54bWwuc2F4LkxvY2F0b3IpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0JCQlzdXBlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7Ci0JCQl0aGlzLmZMb2NhdG9yID0gbG9jYXRvcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0Q0RBVEEoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydERURChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGFydERURChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQl9Ci0KLQkKLQotCXByaXZhdGUgVVJJUmVzb2x2ZXIgZlJlc29sdmVyID0gbnVsbDsKLQotCXB1YmxpYyBEVERWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlIHdpdGggWFNEIHZhbGlkYXRpb24uCi0JICogCi0JICogQHBhcmFtIHVyaXJlc29sdmVyCi0JICogICAgICAgICAgICBUaGUgVVJJIHJlc29sdmVyIHRvIHVzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlyZXNvbHZlcikgewotCQl0aGlzLmZSZXNvbHZlciA9IHVyaXJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBEVEQgZmlsZSBsb2NhdGVkIGF0IHRoZSBVUkkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLQkgKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiByZXBvcnQgZm9yIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmkpIHsKLQkJVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG5ldyBWYWxpZGF0aW9uSW5mbyh1cmkpOwotCQl0cnkgewotCQkJU0FYUGFyc2VyIHBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKLQkJCVhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JCQlNdWx0aUhhbmRsZXIgZHRkSGFuZGxlciA9IG5ldyBNdWx0aUhhbmRsZXIoKTsKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIGR0ZEhhbmRsZXIpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGR0ZEhhbmRsZXIpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoZHRkSGFuZGxlcik7Ci0JCQlyZWFkZXIuc2V0RFRESGFuZGxlcihkdGRIYW5kbGVyKTsKLQkJCXJlYWRlci5zZXRFcnJvckhhbmRsZXIobmV3IERUREVycm9ySGFuZGxlcih2YWxpbmZvKSk7Ci0JCQlyZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IERUREVudGl0eVJlc29sdmVyKGZSZXNvbHZlciwgdXJpKSk7Ci0JCQlTdHJpbmcgZG9jdW1lbnQgPSAiPCFET0NUWVBFIHJvb3QgU1lTVEVNIFwiIiArIHVyaSArICJcIj48cm9vdC8+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihkb2N1bWVudCkpKTsKLQotCQkJTGlzdCBlbGVtRGVjbHMgPSBkdGRIYW5kbGVyLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLQkJCUhhc2h0YWJsZSBlbGVtUmVmcyA9IGR0ZEhhbmRsZXIuZ2V0RWxlbWVudFJlZmVyZW5jZXMoKTsKLQkJCXZhbGlkYXRlRWxlbWVudFJlZmVyZW5jZXMoZWxlbURlY2xzLCBlbGVtUmVmcywgdmFsaW5mbyk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCi0JCX0KLQkJcmV0dXJuIHZhbGluZm87Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiB0aGUgRFRELiBBbiBlbGVtZW50IHJlZmVyZW5jZSBpcwotCSAqIDwhRUxFTUVOVCBlbGVtIChlbGVtZW50UmVmZXJlbmNlKT4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbURlY2xzCi0JICogICAgICAgICAgICBBIGxpc3Qgb2YgdmFsaWQgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0JICogQHBhcmFtIGVsZW1SZWZzCi0JICogICAgICAgICAgICBBIGhhc2h0YWJsZSBjb250YWluaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyBhcyBrZXlzIGFuZAotCSAqICAgICAgICAgICAgbG9jYXRpb25zIGluIHRoZSBkb2N1bWVudCBhcyB2YWx1ZXMuCi0JICogQHBhcmFtIHZhbGluZm8KLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRvIHN0b3JlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRWxlbWVudFJlZmVyZW5jZXMoTGlzdCBlbGVtRGVjbHMsIEhhc2h0YWJsZSBlbGVtUmVmcywgVmFsaWRhdGlvbkluZm8gdmFsaW5mbykgewotCQlFbnVtZXJhdGlvbiBrZXlzID0gZWxlbVJlZnMua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIGVsZW1SZWYgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQkvLyBJZiB0aGUgZWxlbWVudCBoYXNuJ3QgYmVlbiBkZWNsYXJlZCBjcmVhdGUgYW4gZXJyb3IuCi0JCQlpZiAoIWVsZW1EZWNscy5jb250YWlucyhlbGVtUmVmKSkgewotCQkJCUVsZW1lbnRSZWZMb2NhdGlvbiBlbGVtTG9jID0gKEVsZW1lbnRSZWZMb2NhdGlvbikgZWxlbVJlZnMuZ2V0KGVsZW1SZWYpOwotCQkJCWRvIHsKLQkJCQkJdmFsaW5mby5hZGRFcnJvcihOTFMuYmluZChEVERWYWxpZGF0aW9uTWVzc2FnZXMuX0VSUk9SX1JFRl9FTEVNRU5UX1VOREVGSU5FRCwgIiciICsgZWxlbVJlZiArICInIiksIGVsZW1Mb2MuZ2V0TGluZSgpLCBlbGVtTG9jLmdldENvbHVtbigpLCBlbGVtTG9jLmdldFVSSSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWVsZW1Mb2MgPSBlbGVtTG9jLmdldE5leHQoKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKGVsZW1Mb2MgIT0gbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbGVtZW50UmVmTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VsZW1lbnRSZWZMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZmMDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VsZW1lbnRSZWZMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogQW4gZWxlbWVudCByZWZlcmVuY2VzIGxvY2F0aW9uIGhvbGRzIHRoZSBsb2NhdGlvbiBvZiBhbiBlbGVtZW50IHJlZmVyZW5jZS4KLSAqIEFuIGVsZW1lbnQgcmVmZXJlbmNlIGlzIGRlY2xhcmVkIGluIGEgRFREIGVsZW1lbnQgZGVjbGFyYXRpb24gc3VjaCBhcwotICogPCFFTEVNRU5UIG15ZWxlbSAoZWxlbWVudHJlZik+IEFuIGVsZW1lbnQgcmVmZXJlbmNlIG1heSBiZSBwYXJ0IG9mIGEgbGlua2VkCi0gKiBsaXN0IGFuZCBjYW4gY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IHJlZmVyZW5jZSBpbiB0aGUgbGlzdC4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1jbGFzcyBFbGVtZW50UmVmTG9jYXRpb24gewotCXByaXZhdGUgaW50IGNvbHVtbiA9IC0xOwotCi0JcHJpdmF0ZSBpbnQgbGluZSA9IC0xOwotCi0JcHJpdmF0ZSBFbGVtZW50UmVmTG9jYXRpb24gbmV4dCA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB1cmk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGluZQotCSAqICAgICAgICAgICAgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSBVUkkgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogQHBhcmFtIG5leHQKLQkgKiAgICAgICAgICAgIFRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVmTG9jYXRpb24oaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIEVsZW1lbnRSZWZMb2NhdGlvbiBuZXh0KSB7Ci0JCXRoaXMubGluZSA9IGxpbmU7Ci0JCXRoaXMuY29sdW1uID0gY29sdW1uOwotCQl0aGlzLnVyaSA9IHVyaTsKLQkJdGhpcy5uZXh0ID0gbmV4dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLQkJcmV0dXJuIGNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKLQkJcmV0dXJuIGxpbmU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaW5rZWQgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaW5rZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZkxvY2F0aW9uIGdldE5leHQoKSB7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRFREVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL0RURFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQ0YTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRFREVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotCi0vKioKLSAqIEFuIERURCB2YWxpZGF0b3Igc3BlY2lmaWMgdG8gRWNsaXBzZS4gVGhpcyB2YWxpZGF0b3Igd2lsbCB3cmFwIHRoZSBpbnRlcm5hbAotICogRFREIHZhbGlkYXRvciB0byBwcm92aWRlIGF1dG9tYXRpYyBVUkkgcmVzb2x1dGlvbiBzdXBwb3J0LgotICogVXNpbmcgdGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBpbnRlcm5hbCBEVEQgdmFsaWRhdG9yIGFuZCByZWdpc3RlcmluZwotICogdGhlIFVSSSByZXNvbHZlciBmcm9tIHRoZSBVUkkgcmVzb2x1dGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERWYWxpZGF0b3IgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EVERWYWxpZGF0b3IgCi17Ci0gIHByaXZhdGUgc3RhdGljIERURFZhbGlkYXRvciBfaW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBSZWdpc3RlcnMgVVJJIHJlc29sdXRpb24gZnJhbWV3b3JrIHdpdGggdGhlIERURCB2YWxpZGF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgRFREVmFsaWRhdG9yKCkKLSAgewotCXN1cGVyKCk7Ci0Jc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2Ugc3BlY2lmaWMgRFREIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHNwZWNpZmljIERURCB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIERURFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpIAotICB7Ci0JaWYgKF9pbnN0YW5jZSA9PSBudWxsKSAKLQl7Ci0JICBfaW5zdGFuY2UgPSBuZXcgRFREVmFsaWRhdG9yKCk7Ci0JfQotCXJldHVybiBfaW5zdGFuY2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzk0MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci0KLS8qKgotICogRFREIHZhbGlkYXRvciB0aGF0IGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0TmVzdGVkVmFsaWRhdG9yIAotewotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIAotICB7Ci0JRFREVmFsaWRhdG9yIHZhbGlkYXRvciA9IERURFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOwotCi0JVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBudWxsOwotCXZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmkpOwotCQotCXJldHVybiB2YWxyZXBvcnQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzI0NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gYmFzZSBjbGFzcyBmb3IgYW4gRWxlbWVudCdzIGNvbnRlbnRtb2RlbAotcHVibGljIGNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIERURE5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEEgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVElFUyA9IERURENvcmVNZXNzYWdlcy5fVUlfRU5USVRZX05BTUVTX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVElUWV9OQU1FX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNRVJBVEVEX05BTUUgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTkFNRV9UT0tFTlNfREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1FUkFURURfTk9UQVRJT04gPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTk9UQVRJT05fREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJWEVEID0gIiNGSVhFRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IERURENvcmVNZXNzYWdlcy5fVUlfSURFTlRJRklFUl9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUYgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRV9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9JRF9SRUZFUkVOQ0VTX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJRUQgPSAiI0lNUExJRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9IERURENvcmVNZXNzYWdlcy5fVUlfTkFNRV9UT0tFTl9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlMgPSBEVERDb3JlTWVzc2FnZXMuX1VJX05BTUVfVE9LRU5TX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9ICIjUkVRVUlSRUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIEhhc2h0YWJsZSB0eXBlSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdHlwZXMgPSB7Q0RBVEEsIElELCBJRFJFRiwgSURSRUZTLCBFTlRJVFksIEVOVElUSUVTLCBOTVRPS0VOLCBOTVRPS0VOUywgRU5VTUVSQVRFRF9OQU1FLCBFTlVNRVJBVEVEX05PVEFUSU9OfTsKLQotCXsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQsIENEQVRBKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQsIElEKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQsIElEUkVGKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JELCBJRFJFRlMpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQsIEVOVElUWSk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JELCBFTlRJVElFUyk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQsIE5NVE9LRU4pOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCwgTk1UT0tFTlMpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCwgRU5VTUVSQVRFRF9OT1RBVElPTik7Ci0JCS8vIHRoaXMgb25lJ3MgYSBzcGVjaWFsIGNhc2Ugc2luY2UgdGhlcmUgaXMgbm8ga2V5d29yZCBmb3IKLQkJLy8gZW51bWVyYXRlZCBuYW1lIHRva2VucwotCQl0eXBlSGFzaC5wdXQoIigpIiwgRU5VTUVSQVRFRF9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIG5vdyBwdXQgdGhlIHJldmVyc2UgaW4gcGxhY2UuIFRoaXMgZ2l2ZXMgdXMgYSAyIHdheSBsb29rdXAKLQkJLy8gZm9yIHdoZW4gd2Ugd2FudCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYW5kIHdoZW4gd2Ugd2FudCB0byBzZXQgaXQKLQkJdHlwZUhhc2gucHV0KENEQVRBLCAiQ0RBVEEiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoSUQsICJJRCIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChJRFJFRiwgIklEUkVGIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KElEUkVGUywgIklEUkVGUyIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlRJVFksICJFTlRJVFkiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoRU5USVRJRVMsICJFTlRJVElFUyIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChOTVRPS0VOLCAiTk1UT0tFTiIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChOTVRPS0VOUywgIk5NVE9LRU5TIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KEVOVU1FUkFURURfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlVNRVJBVEVEX05PVEFUSU9OLCAiTk9UQVRJT04iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBudWxsOwotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElFRCA9ICJJTVBMSUVEIjsKLQotCXB1YmxpYyBBdHRyaWJ1dGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLaW5kKCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChkZWZhdWx0S2luZFJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RGVmYXVsdEtpbmRSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0VmFsdWUgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUVudW1MaXN0IGdldEVudW1MaXN0KCkgewotCQlyZXR1cm4gZW51bUxpc3Q7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkFUVFJJQlVURUlDT04pOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRRdW90ZWRMaXRlcmFsKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldE9mZnNldEFmdGVyVHlwZSgpIHsKLQkJSVRleHRSZWdpb24gdHlwZVJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQotCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUoKTsKLQkJYm9vbGVhbiBpc0VudW1lcmF0aW9uID0gdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSB8fCB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJaWYgKGlzRW51bWVyYXRpb24pIHsKLQkJCS8vIG5vdyBjaGVjayBpZiBtYXliZSB0aGlzIGlzIGFuIGVudW1lcmF0aW9uCi0JCQlpZiAoZ2V0RW51bUxpc3QoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldEVudW1MaXN0KCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHR5cGVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCh0eXBlUmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJLy8gLy8gY3JlYXRlIG9uZQotCQkJLy8gdHlwZVJlZ2lvbiA9Ci0JCQkvLyBmaW5kT3JDcmVhdGVUeXBlUmVnaW9uKChTdHJpbmcpdHlwZUhhc2guZ2V0KENEQVRBKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHR5cGVIYXNoLmdldChyZWdpb24uZ2V0VHlwZSgpKTsKLQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkvLyBqdXN0IHJldHVybiB0aGUgdGV4dCBvZiB0aGUgdHlwZSByZWdpb24gc2luY2UgdGhpcyBtYXkgYmUKLQkJCQkvLyBhbiBlbnRpdHkgcmVwcmVzZW50aW5nIHRoZSB0eXBlOwotCQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCQllbHNlIGlmIChnZXRFbnVtTGlzdCgpICE9IG51bGwpIHsKLQkJCS8vIGVudW1lcmF0ZWQgbmFtZSB0b2tlbnMgZG9uJ3QgaGF2ZSBhIHR5cGUga2V5d29yZC4ganVzdAotCQkJLy8gdGhlIGV4aXN0ZW5jZSBvZiB0aGUgbGVmdCBwYXJlbiBpcyBlbm91Z2gKLQkJCXJldHVybiAoU3RyaW5nKSB0eXBlSGFzaC5nZXQoIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRUeXBlUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLlBBUk1fRU5USVRZX1RZUEUpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgdHlwZS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JCXJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJZW51bUxpc3QgPSBuZXcgQXR0cmlidXRlRW51bUxpc3QoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQl9Ci0JCQlpZiAoZW51bUxpc3QgIT0gbnVsbCkgewotCQkJCWVudW1MaXN0LmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEtpbmQoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIGtpbmQpIHsKLQotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCVN0cmluZyBvbGREZWZhdWx0S2luZCA9IGRlZmF1bHRLaW5kUmVnaW9uID09IG51bGwgPyAiIiA6IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoZGVmYXVsdEtpbmRSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCWlmICgha2luZC5lcXVhbHMob2xkRGVmYXVsdEtpbmQpKSB7Ci0JCQlTdHJpbmcgbmV3VGV4dCA9IGtpbmQ7Ci0JCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlpZiAoZGVmYXVsdEtpbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZGVmYXVsdEtpbmRSZWdpb24pOwotCQkJCWxlbmd0aCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChkZWZhdWx0S2luZFJlZ2lvbikgLSBzdGFydE9mZnNldDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0T2Zmc2V0QWZ0ZXJUeXBlKCk7Ci0JCQkJbmV3VGV4dCA9ICIgIiArIG5ld1RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJSVRleHRSZWdpb24gZGVmYXVsdFZhbHVlID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0KLQkJCWlmIChraW5kLmVxdWFscyhBdHRyaWJ1dGUuRklYRUQpIHx8IGtpbmQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHdlIGFyZSBjaGFuZ2luZyB0byBmaXhlZCBhbmQgd2VoYXZlIG5vIHF1b3RlZCByZWdpb24uCi0JCQkJCS8vIHB1dCBpbiBhbiBlbXB0eSB2YWx1ZQotCQkJCQluZXdUZXh0ICs9ICIgXCJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRWYWx1ZSkgLSBzdGFydE9mZnNldDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsIG5ld1RleHQpOwotCQkJLy8gZG8gc29tZXRoaW5nIGlmIHRoZXJlIGlzIG5vICJraW5kIiByZWdpb24KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRLaW5kKFN0cmluZyBraW5kKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQpOyAvLyROT04tTkxTLTEkCi0JCXNldERlZmF1bHRLaW5kKHRoaXMsIGtpbmQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBmaXhlZCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0VmFsdWUgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJU3RyaW5nIHF1b3RlQ2hhciA9IHZhbHVlLmluZGV4T2YoIlwiIikgPT0gLTEgPyAiXCIiIDogIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBvbGRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZSgpOwotCQlib29sZWFuIG9sZEtpbmRJc0ZpeGVkID0gZ2V0RGVmYXVsdEtpbmQoKS5lcXVhbHMoQXR0cmlidXRlLkZJWEVEKTsKLQkJaWYgKG9sZFZhbHVlLmVxdWFscyh2YWx1ZSkgJiYgZml4ZWQgPT0gb2xkS2luZElzRml4ZWQpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChkZWZhdWx0VmFsdWUpOwotCQkJZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKTsKLQkJCWVuZE9mZnNldCA9IGVuZE9mZnNldCA9PSAwID8gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKSA6IGVuZE9mZnNldDsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgPSBnZXRPZmZzZXRBZnRlclR5cGUoKTsKLQkJCQluZXdUZXh0ICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJSVRleHRSZWdpb24gdHlwZVJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQkJCWlmICh0eXBlUmVnaW9uID09IG51bGwgJiYgZ2V0RW51bUxpc3QoKSA9PSBudWxsKSB7Ci0JCQkJLy8gdGFjayBvbiBhIGRlZmF1bHQgdHlwZQotCQkJCS8vIG5ld1RleHQgKz0gIkNEQVRBICI7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpeGVkKSB7Ci0JCQluZXdUZXh0ICs9ICIjRklYRUQgIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldERlZmF1bHRLaW5kKCkuZXF1YWxzKCIiKSAmJiB2YWx1ZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIGlmIG5vdCBmaXhlZCBhbmQgdmFsdWUgaXMgIiIgdGhlbiByZXNldCB0aGUgZGVmYXVsdCBraW5kIHRvCi0JCQkJLy8gaW1wbGllZAotCQkJCW5ld1RleHQgKz0gIiNJTVBMSUVEIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKCFnZXRUeXBlKCkuZXF1YWxzKCIiKSAmJiAhdmFsdWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW5ld1RleHQgKz0gcXVvdGVDaGFyICsgdmFsdWUgKyBxdW90ZUNoYXI7Ci0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZml4ZWQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfVkFMKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZWZhdWx0VmFsdWUodGhpcywgdmFsdWUsIGZpeGVkKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSBnZXRUeXBlKCk7Ci0JCWlmICghdHlwZS5lcXVhbHMob2xkVHlwZSkpIHsKLQkJCWJvb2xlYW4gd2FzRW51bWVyYXRpb24gPSBvbGRUeXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpIHx8IG9sZFR5cGUuZXF1YWxzKEVOVU1FUkFURURfTk9UQVRJT04pOwotCQkJYm9vbGVhbiBpc0VudW1lcmF0aW9uID0gdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSB8fCB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQotCQkJaWYgKHdhc0VudW1lcmF0aW9uICYmICFpc0VudW1lcmF0aW9uKSB7Ci0JCQkJLy8gZ2V0IHJpZCBvZiB0aGUgb2xkIGVudW1saXN0Ci0JCQkJQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBnZXRFbnVtTGlzdCgpOwotCQkJCWlmIChlbnVtTGlzdCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZW51bUxpc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJZW5kT2Zmc2V0ID0gZW51bUxpc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCi0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRUeXBlUmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJaWYgKGVuZE9mZnNldCA9PSAwKSB7Ci0JCQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXJ0T2Zmc2V0ID09IDApIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJCW5ld1RleHQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbik7Ci0JCQl9Ci0KLQkJCVN0cmluZyBuZXdUeXBlV29yZCA9IChTdHJpbmcpIHR5cGVIYXNoLmdldCh0eXBlKTsKLQkJCWlmIChuZXdUeXBlV29yZCA9PSBudWxsKSB7Ci0JCQkJLy8gdGhlbiB0aGlzIG11c3QgYmUgYSBwYXJtIGVudGl0eSBiZWluZyB1c2VkIGluIHRoZSB0eXBlCi0JCQkJLy8gdXNlIHRoZSB0eXBlIHRleHQgZGlyZWN0bHkKLQkJCQluZXdUeXBlV29yZCA9IHR5cGU7Ci0JCQl9Ci0KLQkJCW5ld1RleHQgKz0gbmV3VHlwZVdvcmQ7Ci0KLQkJCWlmIChpc0VudW1lcmF0aW9uICYmICF3YXNFbnVtZXJhdGlvbikgewotCQkJCS8vIHB1dCBpbiBhIG5ldyBudW1saXN0Ci0JCQkJYm9vbGVhbiBpc1NwYWNlTmVlZGVkID0gIXR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSk7Ci0JCQkJbmV3VGV4dCArPSBpc1NwYWNlTmVlZGVkID8gIiAiIDogIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW5ld1RleHQgKz0gIigpIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQkJaWYgKG5ld1R5cGVXb3JkLmVxdWFscygiIikgJiYgIXR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHRoZSBzZXQgdGhlIGRlZmF1bHRraW5kIHRvICIiCi0JCQkJLy8gc2V0RGVmYXVsdEtpbmQocmVxdWVzdG9yLCAiIik7Ci0JCQkJc2V0RGVmYXVsdFZhbHVlKHJlcXVlc3RvciwgIiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUeXBlKHRoaXMsIHR5cGUpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVFbnVtTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVFbnVtTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDIwNTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlRW51bUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRW51bUxpc3QgZXh0ZW5kcyBEVEROb2RlIHsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQXR0cmlidXRlRW51bUxpc3QoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIG5ldmVyIGV4cG9zZWQgaW4gdHJlZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIGluIHRoaXMgZW51bWVyYXRlZCBsaXN0Ci0JcHVibGljIExpc3QgZ2V0SXRlbXMoKSB7Ci0JCWxpc3QuY2xlYXIoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gbmFtZSA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuTkFNRSk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJbGlzdC5hZGQoZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChuYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbXMoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nW10gaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZXh0ID0gIigiOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCXRleHQgKz0gIiB8ICIgKyBpdGVtc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGV4dCArPSBpdGVtc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXh0ICs9ICIpIjsgLy8kTk9OLU5MUy0xJAotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksIHRleHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSX0VOVU1fSVRFTVMpOyAvLyROT04tTkxTLTEkCi0JCXNldEl0ZW1zKHRoaXMsIGl0ZW1zKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjI0NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVMaXN0IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCXB1YmxpYyBBdHRyaWJ1dGVMaXN0KERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJfTElTVF9BREQpOyAvLyROT04tTkxTLTEkCi0KLQkJRFRETm9kZSBsYXN0QXR0cmlidXRlID0gKERURE5vZGUpIGdldExhc3RDaGlsZCgpOwotCQlpZiAobGFzdEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBsYXN0QXR0cmlidXRlLmdldEVuZE9mZnNldCgpLCAwLCAiXG5cdCIgKyBuYW1lICsgIiBDREFUQSAjSU1QTElFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pLCAwLCAiXG5cdCIgKyBuYW1lICsgIiBDREFUQSAjSU1QTElFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQl9Ci0KLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5BVFRSSUJVVEVMSVNUSUNPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0SW50b01vZGVsKE9iamVjdCByZXF1ZXN0b3IsIEF0dHJpYnV0ZSByZWZlcmVuY2UsIEF0dHJpYnV0ZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5vZGVUZXh0ID0gbm9kZS5nZXRGdWxsTm9kZVRleHQoKTsKLQkJaWYgKCFpc0FmdGVyKSB7Ci0JCQlvZmZzZXQgPSByZWZlcmVuY2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRyeSBhbmQgZ2V0IG5leHQgY2hpbGQKLQkJCUF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgcmVmZXJlbmNlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJb2Zmc2V0ID0gYXR0ci5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCB1c2UgdGhlIGVuZCBvZmZzZXQKLQkJCQlvZmZzZXQgPSByZWZlcmVuY2UuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCW5ld1RleHQgKz0gbm9kZVRleHQ7Ly8gKyAoaXNMYXN0Q2hpbGQgPyAiXG4iIDogIlxuXHQiKTsKLQkJaWYgKCFub2RlLmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKSB7Ci0JCQluZXdUZXh0ICs9ICJcblx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgb2Zmc2V0LCAwLCBuZXdUZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVnaW9ucygpIHsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlpZiAoZ2V0TmFtZVJlZ2lvbigpICE9IG51bGwpIHsKLQkJCS8vIHdlIHNraXAgcGFzdCB0aGUgbmFtZSB0b2tlbiBpcyBvdXIgbmFtZQotCQkJc2tpcFBhc3ROYW1lKGl0ZXIpOwotCQl9Ci0KLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gbnVsbDsKLQkJYm9vbGVhbiB0cmFpbGluZ1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVFJJQlVURV9OQU1FKSkgewotCQkJCWF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJY2hpbGRyZW4uYWRkKGF0dHJpYnV0ZSk7Ci0JCQkJYXBwZW5kQ2hpbGQoYXR0cmlidXRlKTsKLQkJCQl0cmFpbGluZ1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCAmJiBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSAhPSBEVERSZWdpb25UeXBlcy5FTkRfVEFHKSB7Ci0JCQkJaWYgKCF0cmFpbGluZ1doaXRlc3BhY2UpIHsKLQkJCQkJYXR0cmlidXRlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSB7Ci0JCQkJCQlhdHRyaWJ1dGUuYWRkV2hpdGVzcGFjZVJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHRoZSBmb2xsb3dpbmcgcHJldmVudHMgZXh0cmEgd2hpdGVzcGFjZSBmcm9tIGJlaW5nIHBpY2tlZAotCQkJCS8vIHVwIGJ5IHRoZSBhdHRyaWJ1dGUKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpIHsKLQkJCQkJdHJhaWxpbmdXaGl0ZXNwYWNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IG51bUtpZHMgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2lkczsgaSsrKSB7Ci0JCQkoKEF0dHJpYnV0ZSkgY2hpbGRyZW4uZ2V0KGkpKS5yZXNvbHZlUmVnaW9ucygpOwotCQl9IC8vIGVuZCBvZiBmb3IgKCkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNQmFzaWNOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNQmFzaWNOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWFhM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUJhc2ljTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qCi0gKiBDTUJhc2ljTm9kZSBjb21iaW5lcyBhbGwgdGhlIGRpZmZlcmVudCBjb250ZW50IHR5cGVzIGludG8gb25lLiBUaGUgaWRlYQotICogYmVoaW5kIHRoaXMgaXMgdG8gYWxsb3cgYXJiaXRyYXJ5IG5hbWUgY2hhbmdlcyB0byBub3QgcmVxdWlyZSBhIHRyZWUKLSAqIHVwZGF0ZS4KLSAqLwotcHVibGljIGNsYXNzIENNQmFzaWNOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0KLQkvLyBzdGF0aWMgZmluYWwgaW50IEVNUFRZID0gMDsKLQkvLyBzdGF0aWMgZmluYWwgaW50IEFOWSA9IDE7Ci0JLy8gc3RhdGljIGZpbmFsIGludCBQQ0RBVEEgPSAyOwotCi0JcHVibGljIENNQmFzaWNOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5QQ0RBVEFJQ09OKTsKLQkJfQotCi0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoRU1QVFkpKSB7Ci0JCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTVBUWUlDT04pOwotCQkJfQotCQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoQU5ZKSkgewotCQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuQU5ZSUNPTik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPdGhlcndpc2UgdGhpcyBpcyBqdXN0IGFuIGVsZW1lbnQgcmVmZXJlbmNlIG5vZGUuIEp1c3QgcmV0dXJuCi0JCS8vIHdoYXQgQ01SZXBlYXRhYmxlTm9kZSB3b3VsZCBnaXZlIHVzCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZSgpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5BTUUgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcmV0dXJucyB0aGUgb2NjdXJyZW5jZXRva2VuLCBvciB0aGUgdG9rZW4gd2hlcmUgdGhlIG9jY3VycmVuY2UgdG9rZW4KLQkvLyBzaG91bGQgYXBwZWFyIGFmdGVyCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE9jY3VycmVuY2VSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlza2lwUGFzdE5hbWUoaXRlcik7Ci0JCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0TmFtZVJlZ2lvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIFBDREFUQTsKLQkJfQotCi0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKEVNUFRZKSkgewotCQkJCQlyZXR1cm4gRU1QVFk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5hbWUuZXF1YWxzKEFOWSkpIHsKLQkJCQkJcmV0dXJuIEFOWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG90aGVyd2lzZSBqdXN0IHJldHVybiBpdCdzIG5hbWUgYXMgdGhlIHR5cGUKLQkJCQkJcmV0dXJuIG5hbWU7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eUFueU9yUENEYXRhKCkgewotCQlpZiAoaXNQQ0RhdGEoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCi0JCWZpbmFsIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKG5hbWUuZXF1YWxzKEVNUFRZKSB8fCBuYW1lLmVxdWFscyhBTlkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUENEYXRhKCkgewotCQlJVGV4dFJlZ2lvbiBwY2RhdGEgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsKLQkJaWYgKHBjZGF0YSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gcHVibGljIE5vZGUgaW5zZXJ0UmVnaW9uKFJlZ2lvbiB0b2tlbikKLQkvLyB7Ci0JLy8gaWYgKCF0b2tlblN0cmVhbS5jb250YWluc1Rva2VuKHRva2VuKSAmJiB0b2tlbi5nZXRUeXBlKCkgPT0KLQkvLyBUb2tlbi5PQ0NVUl9UWVBFKQotCS8vIHsKLQkvLyAvLyB0aGVuIGFkZCBpdCBzbyB0aGF0IG91ciByYW5nZSBjb250YWlucyBpdAotCS8vIGluc2VydEludG9Ub2tlblN0cmVhbSh0b2tlbik7Ci0JLy8gfQotCS8vIHJldHVybiB0aGlzOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gIWlzRW1wdHlBbnlPclBDRGF0YSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gYmVnaW5SZWNvcmRpbmcocmVxdWVzdG9yLCAiTmFtZSBDaGFuZ2UiKTsKLQotCQlzdXBlci5zZXROYW1lKHJlcXVlc3RvciwgbmFtZSk7Ci0JCWlmICghaXNSZWZlcmVuY2UoKSkgewotCQkJLy8gaWYgaXQgaXMgbm8gbG9uZ2VyIGEgcmVmZXJlbmNlIG5vZGUsIHJlbW92ZSB0aGUgb2NjdXJyZW5jZQotCQkJLy8gdG9rZW4KLQkJCXNldE9jY3VycmVuY2UocmVxdWVzdG9yLCBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpOwotCQl9Ci0KLQkJLy8gZW5kUmVjb3JkaW5nKHJlcXVlc3Rvcik7Ci0JfQotCi0JLyoKLQkgKiBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKGludCB0eXBlKSB7IHN3aXRjaCAodHlwZSkgeyBjYXNlIEVNUFRZOgotCSAqIHJldHVybiBlbXB0eVN0cmluZzsgY2FzZSBBTlk6IHJldHVybiBhbnlTdHJpbmc7IGNhc2UgUENEQVRBOiByZXR1cm4KLQkgKiBwY2RhdGFTdHJpbmc7IGRlZmF1bHQ6IGJyZWFrOyB9IC8vIGVuZCBvZiBzd2l0Y2ggKCkgcmV0dXJuICIiOyB9Ci0JICovCi0KLX0vLyBDTUJhc2ljTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUdyb3VwTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUdyb3VwTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQ1Mzg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Hcm91cE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERVbmlxdWVOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIENNR3JvdXBOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hPSUNFID0gJ3wnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTRVFVRU5DRSA9ICcsJzsKLQotCXByb3RlY3RlZCBjaGFyIGNvbm5lY3RvciA9IFNFUVVFTkNFOwotCi0JLy8gcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBDTUdyb3VwTm9kZShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENoaWxkKCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9DSElMRCk7IC8vJE5PTi1OTFMtMSQKLQkJRFRETm9kZSBsYXN0Tm9kZSA9IChEVEROb2RlKSBnZXRMYXN0Q2hpbGQoKTsKLQkJU3RyaW5nIGVsZW1lbnROYW1lID0gRFREVW5pcXVlTmFtZUhlbHBlci5nZXRVbmlxdWVOYW1lKGdldENoaWxkcmVuTGlzdCgpLCAiQ2hpbGROb2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGxhc3ROb2RlLmdldEVuZE9mZnNldCgpLCAwLCBTdHJpbmcudmFsdWVPZihnZXRDb25uZWN0b3IoKSkgKyBlbGVtZW50TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCkgKyAxLCAwLCBlbGVtZW50TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRHcm91cCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfR1JQKTsgLy8kTk9OLU5MUy0xJAotCQlEVEROb2RlIGxhc3ROb2RlID0gKERURE5vZGUpIGdldExhc3RDaGlsZCgpOwotCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJcmVwbGFjZVRleHQodGhpcywgbGFzdE5vZGUuZ2V0RW5kT2Zmc2V0KCksIDAsIFN0cmluZy52YWx1ZU9mKGdldENvbm5lY3RvcigpKSArICIgKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSArIDEsIDAsICIoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgY2hpbGQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCi0JCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMSAmJiBnZXRGaXJzdENoaWxkKCkgPT0gY2hpbGQpIHsKLQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgY2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSwgY2hpbGQuZ2V0Tm9kZUxlbmd0aCgpLCBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlEVEROb2RlIGNoaWxkQSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCURURE5vZGUgY2hpbGRCID0gKERURE5vZGUpIGNoaWxkcmVuW2kgKyAxXTsKLQotCQkJYm9vbGVhbiBjaGlsZEFEZWxldGVkID0gY2hpbGRBID09IGNoaWxkOwotCQkJYm9vbGVhbiBjaGlsZEJEZWxldGVkID0gY2hpbGRCID09IGNoaWxkOwotCQkJaWYgKGNoaWxkQURlbGV0ZWQgfHwgY2hpbGRCRGVsZXRlZCkgewotCQkJCS8vIHdlIGZvdW5kIHRoZSBjaGlsZAotCQkJCWludCBzdGFydE9mZnNldCA9IGNoaWxkQURlbGV0ZWQgPyBjaGlsZEEuZ2V0U3RhcnRPZmZzZXQoKSA6IGNoaWxkQS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0ID0gY2hpbGRBRGVsZXRlZCA/IGNoaWxkQi5nZXRTdGFydE9mZnNldCgpIDogY2hpbGRCLmdldEVuZE9mZnNldCgpOwotCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGNvbm5lY3Rvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGNvbm5lY3Rvci4KLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDb25uZWN0b3IoKSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxOyBpKyspIHsKLQkJCURURE5vZGUgY2hpbGRBID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJRFRETm9kZSBjaGlsZEIgPSAoRFRETm9kZSkgY2hpbGRyZW5baSArIDFdOwotCi0JCQkvLyBjcmVhdGUgYSBzdHJlYW0gYmV0d2VlbiB0aGUgdHdvIHNpYmxpbmdzIGFuZCB3YWxrIGl0Ci0JCQkvLyBub3RlIHRoYXQgdGhpcyBzdHJlYW0gaW5jbHVkZXMgdGhlIGxhc3QgcmVnaW9uIG9mIHRoZSBmaXJzdAotCQkJLy8gc2libGluZyBhbmQgdGhlIGZpcnN0IHJlZ2lvbiBvZiB0aGUgbmV4dCBzaWJsaW5nLgotCQkJLy8gYm90aCB0aGVzZSBzaG91bGQgYmUgaWdub3JlZAotCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IG5ldyBSZWdpb25JdGVyYXRvcihnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSwgY2hpbGRBLmdldEVuZE9mZnNldCgpLCBjaGlsZEIuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkvLyBzdHJlYW0uc2V0Rmlyc3RSZWdpb24oY2hpbGRBLmdldExhc3RSZWdpb24oKSk7Ci0JCQkvLyBzdHJlYW0uc2V0TGFzdFJlZ2lvbihjaGlsZEIuZ2V0Rmlyc3RSZWdpb24oKSk7Ci0JCQkvLyBJdGVyYXRvciBpdGVyID0gc3RyZWFtLml0ZXJhdG9yKCk7Ci0JCQkvLyBza2lwIHRoZSBmaXJzdCByZWdpb24gd2hpY2ggaXMgdGhlIGxhc3QgcmVnaW9uIG9mIGNoaWxkQQotCQkJLy8gZG8gd2UgbmVlZCB0aGlzIG5vdyA/Ci0JCQkvLyBpdGVyLm5leHQoKTsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBudWxsOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIGN1cnJlbnRSZWdpb24gIT0gY2hpbGRCLmdldFN0YXJ0UmVnaW9uKCkpIHsKLQkJCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUikgewotCQkJCQljb25uZWN0b3IgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KGN1cnJlbnRSZWdpb24pLmNoYXJBdCgwKTsKLQkJCQkJcmV0dXJuIGNvbm5lY3RvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbm5lY3RvcjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCURURENvcmVQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JCXN3aXRjaCAoZ2V0Q29ubmVjdG9yKCkpIHsKLQkJCWNhc2UgU0VRVUVOQ0UgOgotCQkJCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVTRVFVRU5DRUlDT04pOwotCQkJLyoKLQkJCSAqIHN3aXRjaCAoZ2V0T2NjdXJyZW5jZSgpKSB7IGNhc2UgT05DRSA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FU0VRVUVOQ0VJQ09OKTsgY2FzZQotCQkJICogT1BUSU9OQUwgOiByZXR1cm4KLQkJCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9QVElPTkFMU0VRVUVOQ0VJQ09OKTsgY2FzZQotCQkJICogT05FX09SX01PUkUgOiByZXR1cm4KLQkJCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORU9STU9SRVNFUVVFTkNFSUNPTik7Ci0JCQkgKiBjYXNlIFpFUk9fT1JfTU9SRSA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuWkVST09STU9SRVNFUVVFTkNFSUNPTik7IH0KLQkJCSAqLwotCQkJY2FzZSBDSE9JQ0UgOgotCQkJCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVDSE9JQ0VJQ09OKTsKLQkJLyoKLQkJICogc3dpdGNoIChnZXRPY2N1cnJlbmNlKCkpIHsgY2FzZSBPTkNFIDogcmV0dXJuCi0JCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORUNIT0lDRUlDT04pOyBjYXNlIE9QVElPTkFMIDoKLQkJICogcmV0dXJuIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9QVElPTkFMQ0hPSUNFSUNPTik7Ci0JCSAqIGNhc2UgT05FX09SX01PUkUgOiByZXR1cm4KLQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FT1JNT1JFQ0hPSUNFSUNPTik7IGNhc2UKLQkJICogWkVST19PUl9NT1JFIDogcmV0dXJuCi0JCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLlpFUk9PUk1PUkVDSE9JQ0VJQ09OKTsgfQotCQkgKi8KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHJldHVybnMgdGhlIG9jY3VycmVuY2VyZWdpb24sIG9yIHRoZSBsYXN0IHJlZ2lvbiB3aGVyZSB0aGUgb2NjdXJyZW5jZQotCS8vIHJlZ2lvbiBzaG91bGQgYXBwZWFyIGFmdGVyCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE9jY3VycmVuY2VSZWdpb24oKSB7Ci0JCWludCBuZXN0aW5nID0gMDsKLQotCQkvLyB3ZSBza2lwIHBhc3QgdGhlIGZpcnN0IGxlZnQgcGFyZW4gd2Ugc2VlIHNpbmNlIHRoYXQgaXMgdGhlCi0JCS8vIGJlZ2lubmluZyBvZiBvdXIgb3duIG5vZGUKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCS8vIHdlIGFzc3VtZSB0aGUgZmlyc3QgcmVnaW9uIGlzIHRoZSAnKCcKLQkJaXRlci5uZXh0KCk7Ci0JCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgbmVzdGluZyA+PSAwKSB7Ci0JCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikgewotCQkJCW5lc3RpbmcrKzsKLQkJCX0KLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTikgewotCQkJCW5lc3RpbmctLTsKLQkJCX0KLQkJfQotCQlpZiAobmVzdGluZyA8IDApIHsKLQkJCS8vIFRoaXMgbWVhbnMgd2UgaGF2ZSBwYXNzZWQgb3ZlciB0aGUgcmlnaHQgcGFyZW4gdGhhdCBtYXJrcyB0aGUKLQkJCS8vIGVuZCBvZiBvdXIgZ3JvdXBpbmcuCi0JCQkvLyBMb29rIGZvciBhbiBvY2N1cnJlbmNlIHJlZ2lvbgotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQkJCXJldHVybiBjdXJyZW50UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSdyZSBoZXJlLCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gb2NjdXIgcmVnaW9uLiByZXR1cm4gdGhlCi0JCS8vIGxhc3QgcmVnaW9uCi0JCXJldHVybiBpdGVyLnByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKGdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSB7Ci0JCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBnZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKG5vZGUuZ2V0VHlwZSgpLmVxdWFscyhQQ0RBVEEpKSB7Ci0JCQkJCXJldHVybiBNSVhFRDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBDSElMRFJFTjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0Q2hpbGROb2RlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBub2RlVGV4dCwgaW50IHBvc2l0aW9uKSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlTdHJpbmcgbmV3VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChwb3NpdGlvbiA8IGNoaWxkcmVuLmxlbmd0aCkgewotCQkJRFRETm9kZSByZWZlcmVuY2UgPSAoRFRETm9kZSkgY2hpbGRyZW5bcG9zaXRpb25dOwotCQkJc3RhcnRPZmZzZXQgPSByZWZlcmVuY2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCW5ld1RleHQgPSBub2RlVGV4dCArICIgIiArIFN0cmluZy52YWx1ZU9mKGdldENvbm5lY3RvcigpKSArICIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSBpZiAocG9zaXRpb24gPT0gY2hpbGRyZW4ubGVuZ3RoKSB7Ci0JCQkvLyBhZGQgdG8gZW5kCi0JCQlEVEROb2RlIHJlZmVyZW5jZSA9IChEVEROb2RlKSBjaGlsZHJlbltwb3NpdGlvbiAtIDFdOwotCQkJc3RhcnRPZmZzZXQgPSByZWZlcmVuY2UuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQluZXdUZXh0ID0gIiAiICsgU3RyaW5nLnZhbHVlT2YoZ2V0Q29ubmVjdG9yKCkpICsgIiAiICsgbm9kZVRleHQ7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIDAsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydENoaWxkTm9kZShTdHJpbmcgbm9kZVRleHQsIGludCBwb3NpdGlvbikgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0lOU0VSVF9FTEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlpbnNlcnRDaGlsZE5vZGUodGhpcywgbm9kZVRleHQsIHBvc2l0aW9uKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydEludG9Nb2RlbChPYmplY3QgcmVxdWVzdG9yLCBDTU5vZGUgcmVmZXJlbmNlLCBDTU5vZGUgbm9kZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCVN0cmluZyBub2RlVGV4dCA9IG5vZGUuZ2V0Tm9kZVRleHQoKTsKLQkJTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuTGlzdCgpOwotCi0JCWludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YocmVmZXJlbmNlKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBubyByZWZlcmVuY2Ugbm9kZSwgYWRkIGl0IHRvIHRoZSBlbmQ/PwotCQkJaW5kZXggPSBjaGlsZHJlbi5zaXplKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBnb3QgYW4gaW5kZXguIGlmIHdlIHdhbnQgdG8gYWRkIGFmdGVyLCBpbmNyZWFzZSBieSAxCi0JCQlpbmRleCA9IGlzQWZ0ZXIgPyBpbmRleCArIDEgOiBpbmRleDsKLQkJfQotCQlpbnNlcnRDaGlsZE5vZGUocmVxdWVzdG9yLCBub2RlVGV4dCwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQlpbnQgbmVzdGluZyA9IDA7Ci0JCS8vIGNoaWxkcmVuLmNsZWFyKCk7Ci0JCXJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJRFRETm9kZSBjdXJyZW50R3JvdXBOb2RlID0gbnVsbDsKLQkJQ01CYXNpY05vZGUgY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJLy8gd2UgYXNzdW1lIHRoZSBmaXJzdCByZWdpb24gaXMgdGhlICcoJwotCQlpdGVyLm5leHQoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIG5lc3RpbmcgPj0gMCkgewotCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG5lc3RpbmcgPT0gMCkgewotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpKSB7Ci0JCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBjdXJyZW50UmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCQkJCURURE5vZGUgcGNEYXRhID0gbmV3IENNQmFzaWNOb2RlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCQlwY0RhdGEuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQlhcHBlbmRDaGlsZChwY0RhdGEpOwotCQkJCQkvLyBjaGlsZHJlbi5hZGQocGNEYXRhKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQkJCS8vIHdlIGhhdmUgaGl0IGEgbmV3IHJlZmVyZW5jZSBub2RlLiBNYWtlIHN1cmUgd2UgcmVzZXQKLQkJCQkJLy8gdGhlIGdyb3Vwbm9kZSB2YXIgc28gaXQgZG9lc24ndCBjb2xsZWN0IG1vcmUgcmVnaW9ucwotCQkJCQljdXJyZW50R3JvdXBOb2RlID0gbnVsbDsKLQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUgPSBuZXcgQ01CYXNpY05vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJCWN1cnJlbnRSZWZlcmVuY2VOb2RlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJYXBwZW5kQ2hpbGQoY3VycmVudFJlZmVyZW5jZU5vZGUpOwotCQkJCQkvLyBjaGlsZHJlbi5hZGQoY3VycmVudFJlZmVyZW5jZU5vZGUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkpIHsKLQkJCQkJLy8gd2UgY291bGQgcG90ZW50aWFsbHkgZmxhZyBhbiBlcnJvciBoZXJlIGlmIHdlIGhpdCBhbgotCQkJCQkvLyBvY2N1cnJlbmNlIHR5cGUgYW5kIGN1cnJlbnRSZWZOb2RlIGFuZCBjdXJyZW50R3JvdXBOb2RlCi0JCQkJCS8vIGFyZSBudWxsCi0JCQkJCWlmIChjdXJyZW50UmVmZXJlbmNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBjdXJyZW50UmVmZXJlbmNlTm9kZS5zZXRPY2N1cnJlbmNlKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpKSB7Ci0JCQkJCS8vIG5vdGUgdGhhdCBpZiBjb25uZWN0b3IgaXMgYWxyZWFkeSBzZXQgYW5kIGl0IGlzCi0JCQkJCS8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IGNvbm5lY3RvciByZWdpb24sIHRoZW4gd2UKLQkJCQkJLy8gaGF2ZSBhbiBlcnJvciEKLQkJCQkJLy8gc2V0Q29ubmVjdG9yKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikpIHsKLQkJCQkJaWYgKGN1cnJlbnRHcm91cE5vZGUgPT0gbnVsbCkgewotCQkJCQkJLy8gd2UgaGF2ZSBoaXQgYSBuZXcgZ3JvdXAuIE1ha2Ugc3VyZSB3ZSByZXNldCB0aGUKLQkJCQkJCS8vIHJlZmVyZW5jZW5vZGUgdmFyIHNvIGl0IGRvZXNuJ3QgY29sbGVjdCBhbnkgbW9yZQotCQkJCQkJLy8gcmVnaW9ucwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQkJCQkJY3VycmVudEdyb3VwTm9kZSA9IG5ldyBDTUdyb3VwTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQkJCWFwcGVuZENoaWxkKGN1cnJlbnRHcm91cE5vZGUpOwotCQkJCQkJLy8gY2hpbGRyZW4uYWRkKGN1cnJlbnRHcm91cE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJbmVzdGluZysrOwotCQkJfQotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTikpIHsKLQkJCQluZXN0aW5nLS07Ci0JCQkJaWYgKG5lc3RpbmcgPT0gMCAmJiBjdXJyZW50R3JvdXBOb2RlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudEdyb3VwTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJCS8vIHBlZWsgYXQgbmV4dCByZWdpb24gdG8gc2VlIGlmIGl0IGlzIGFuIG9jY3VyIHJlZ2lvbi4gaWYKLQkJCQkJLy8gc28sIGFkZCBpdCB0byB0aGUgZ3JvdXBub2RlCi0JCQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKG5leHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQkJCWN1cnJlbnRHcm91cE5vZGUuYWRkUmVnaW9uKG5leHRSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gT3RoZXJ3aXNlLCBwdXNoIGl0IGJhY2sgYXMgdGhlIG5leHQgaXRlbSB0byBiZQotCQkJCQkJCS8vIHJldHJpZXZlZCBieSBhIGZ1dHVyZSBuZXh0KCkgY2FsbAotCQkJCQkJCWl0ZXIucHJldmlvdXMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50R3JvdXBOb2RlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY3VycmVudEdyb3VwTm9kZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudEdyb3VwTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmVzdGluZyA8IDApIHsKLQkJCS8vIFRoaXMgbWVhbnMgd2UgaGF2ZSBwYXNzZWQgb3ZlciB0aGUgcmlnaHQgcGFyZW4gdGhhdCBtYXJrcyB0aGUKLQkJCS8vIGVuZCBvZiBvdXIgZ3JvdXBpbmcuCi0JCQkvLyBMb29rIGZvciBhbiBvY2N1cnJlbmNlIHJlZ2lvbgotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkpIHsKLQkJCQkJLy8gc2V0T2NjdXJyZW5jZShjdXJyZW50UmVnaW9uLmdldFRleHQoKS50b0NoYXJBcnJheSgpWzBdKTsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCQl9Ci0KLQkJLy8gZm9yIChvcmcudzNjLmRvbS5Ob2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZAotCQkvLyA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0JCS8vIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjaGlsZCBmb3VuZCA9ICIgKyBjaGlsZCk7Ci0JCS8vIH0KLQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2hpbGRyZW4gbGVnbnRoID0gIiArIGNoaWxkcmVuLmxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCWN1cnJlbnROb2RlLnJlc29sdmVSZWdpb25zKCk7Ci0JCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGNvbm5lY3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGNvbm5lY3Rvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3IoY2hhciB2KSB7Ci0JCWlmIChjb25uZWN0b3IgIT0gdikgewotCQkJY29ubmVjdG9yID0gdjsKLQkJCS8vIHdhbGsgdGhyb3VnaCBvdXIga2lkcyBhbmQgc2VlIGlmIHRoZXJlIGlzIGEgY29ubmVjdG9yIGJldHdlZW4KLQkJCS8vIGVhY2ggc2libGluZy4gaWYgbm90LCBjcmVhdGUgb25lIGFuZCBzZXQgdGhlIGNvbm5lY3Rvci4gaWYKLQkJCS8vIHRoZXJlIGlzCi0JCQkvLyB0aGVuIGp1c3QgY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjb25uZWN0b3IKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChjaGlsZHJlbi5sZW5ndGggPD0gMSkgewotCQkJCS8vIHRoZXJlIHdvbid0IGJlIGFueSBjb25uZWN0b3IgZXhpc3RpbmcgYmV0d2VlbiB0aGUgY2hpbGRyZW4KLQkJCQkvLyBqdXN0IG5vdGlmeSBhIGNoYW5nZSBpbiB0aGUgbm9kZSBhbmQgcmV0dXJuOwotCQkJCWdldERUREZpbGUoKS5ub3RpZnlOb2RlQ2hhbmdlZCh0aGlzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0NPTk5FQ1RPUik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQkJRFRETm9kZSBjaGlsZEEgPSAoRFRETm9kZSkgY2hpbGRyZW5baV07Ci0JCQkJRFRETm9kZSBjaGlsZEIgPSAoRFRETm9kZSkgY2hpbGRyZW5baSArIDFdOwotCi0JCQkJLy8gY3JlYXRlIGEgc3RyZWFtIGJldHdlZW4gdGhlIHR3byBzaWJsaW5ncyBhbmQgd2FsayBpdAotCQkJCS8vIG5vdGUgdGhhdCB0aGlzIHN0cmVhbSBpbmNsdWRlcyB0aGUgbGFzdCByZWdpb24gb2YgdGhlIGZpcnN0Ci0JCQkJLy8gc2libGluZyBhbmQgdGhlIGZpcnN0IHJlZ2lvbiBvZiB0aGUgbmV4dCBzaWJsaW5nLgotCQkJCS8vIGJvdGggdGhlc2Ugc2hvdWxkIGJlIGlnbm9yZWQKLQkJCQlSZWdpb25JdGVyYXRvciBpdGVyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLCBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIGNoaWxkQi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkvLyBza2lwIHRoZSBmaXJzdCByZWdpb24gd2hpY2ggaXMgdGhlIGxhc3QgcmVnaW9uIG9mIGNoaWxkQQotCi0JCQkJLy8gZG8gd2Ugc3RpbGwgbmVlZCB0aGlzCi0JCQkJLy8gaXRlci5uZXh0KCk7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IG51bGw7Ci0JCQkJYm9vbGVhbiBmb3VuZENvbm5lY3RvciA9IGZhbHNlOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBjdXJyZW50UmVnaW9uICE9IGNoaWxkQi5nZXRTdGFydFJlZ2lvbigpKSB7Ci0JCQkJCWN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUikgewotCQkJCQkJZm91bmRDb25uZWN0b3IgPSB0cnVlOwotCQkJCQkJLy8gUmVnaW9uIG9sZFJlZ2lvbiA9IGN1cnJlbnRSZWdpb24uY3JlYXRlQ29weSgpOwotCQkJCQkJLy8gZm91bmQgYSBjb25uZWN0b3IhIG9uIHRvIHRoZSBuZXh0IHNpYmxpbmcgcGFpcgotCQkJCQkJLy8gY3VycmVudFJlZ2lvbi51cGRhdGVUZXh0KFN0cmluZy52YWx1ZU9mKHYpKTsKLQkJCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGN1cnJlbnRSZWdpb24pLCAxLCBTdHJpbmcudmFsdWVPZihjb25uZWN0b3IpKTsKLQkJCQkJCS8vIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudChvbGRSZWdpb24sIGN1cnJlbnRSZWdpb24pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoIWZvdW5kQ29ubmVjdG9yKSB7Ci0JCQkJCS8vIGlmIHdlJ3JlIGhlcmUsIHRoYXQgbWVhbnMgd2UgbmVlZCB0byBpbnNlcnQgYSBuZXcKLQkJCQkJLy8gY29ubmVjdG9yIHJlZ2lvbiBhZnRlciBjaGlsZEEKLQkJCQkJcmVwbGFjZVRleHQodGhpcywgY2hpbGRBLmdldEVuZE9mZnNldCgpLCAwLCBTdHJpbmcudmFsdWVPZihjb25uZWN0b3IpKTsKLQkJCQkJLy8gRFREUmVnaW9uIGNvbm5lY3RvclJlZ2lvbiA9IG5ldwotCQkJCQkvLyBEVERSZWdpb24oRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SLAotCQkJCQkvLyBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIDEpOwotCQkJCQkvLyBpbnNlcnRJbnRvU3RydWN0dXJlZERvY3VtZW50KGNvbm5lY3RvclJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLy8gcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkKLQkvLyB7Ci0JLy8gcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkvLyB9Ci19Ly8gQ01Hcm91cE5vZGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzYzNzQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8vIGJhc2UgY2xhc3MgZm9yIGFuIEVsZW1lbnQncyBjb250ZW50bW9kZWwKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGUgZXh0ZW5kcyBEVEROb2RlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfQU5ZOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hJTERSRU4gPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfQ0hJTERfQ09OVEVOVDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfRU1QVFk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVhFRCA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9NSVhfQ09OVEVOVDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBDREFUQSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9QQ0RBVEE7IC8vJE5PTi1OTFMtMSQKLQotCi0JYm9vbGVhbiByb290RWxlbWVudENvbnRlbnQ7Ci0KLQlwdWJsaWMgQ01Ob2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JLy8gdGhpcyBpcyBvbmx5IHZhbGlkIHRvIGFzayBpZiB0aGUgY29udGVudCBpcyBhIHJvb3QgZWxlbWVudCBjb250ZW50Ci0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4gVGhpcyB0ZWxscyB1cyB3aGV0aGVyIHRoaXMgZWxlbWVudAotCSAqIGNvbnRlbnQncyBwYXJlbnQgaXMgYSBkaXJlY3QgZGVjZW5kZW50IG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3RFbGVtZW50Q29udGVudCgpIHsKLQkJcmV0dXJuIHJvb3RFbGVtZW50Q29udGVudDsKLQl9Ci0KLQkvLyBpZiB0aGlzIGlzIGEgcm9vdCBlbGVtZW50LCBjaGFuZ2UgdGhlIGNvbnRlbnQgdG8gY2hpbGRyZW4KLQkvLyBpZSAuIChjaGlsZDEpCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW5Db250ZW50KFN0cmluZyBuZXdDaGlsZCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKCFuZXdDaGlsZC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0Tm9kZUxlbmd0aCgpLCAiKCIgKyBuZXdDaGlsZCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmICghZ2V0VHlwZSgpLmVxdWFscyhDSElMRFJFTikpIHsKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksICIobmV3Q2hpbGQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdyBtdXN0IGNvbnZlcnQgZnJvbSBtaXhlZCBjb250ZW50IHRvIHRoaXMgb25lLiBtdXN0Ci0JCQkJCS8vIHByZXNlcnZlIHRoZSByZW1haW5pbmcgY2hpbGRyZW4KLQkJCQkJQ01Hcm91cE5vZGUgZ3JvdXAgPSAoQ01Hcm91cE5vZGUpIHRoaXM7Ci0JCQkJCUNNTm9kZSBmaXJzdENoaWxkID0gKENNTm9kZSkgZ3JvdXAuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQlpZiAoZmlyc3RDaGlsZC5nZXRUeXBlKCkuZXF1YWxzKFBDREFUQSkpIHsKLQkJCQkJCWdyb3VwLmRlbGV0ZShmaXJzdENoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9TRVQgKyAiICIgKyBjb250ZW50ICsgIiAiICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksIGNvbnRlbnQpOwotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLy8gaWYgdGhpcyBpcyBhIHJvb3QgZWxlbWVudCwgY2hhbmdlIHRoZSBjb250ZW50IHRvIG1peGVkCi0JLy8gaWUgLiAoI1BDREFUQSwgY2hpbGQxKQotCXB1YmxpYyB2b2lkIHNldE1peGVkQ29udGVudCgpIHsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWlmICghZ2V0VHlwZSgpLmVxdWFscyhNSVhFRCkpIHsKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX01JWF9DT05URU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh0aGlzIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0Tm9kZUxlbmd0aCgpLCAiKCNQQ0RBVEEgfCBuZXdDaGlsZCkqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdyBtdXN0IGNvbnZlcnQgZnJvbSBjaGlsZHJlbiBjb250ZW50IHRvIHRoaXMgb25lLgotCQkJCQkvLyBtdXN0Ci0JCQkJCS8vIHByZXNlcnZlIHRoZSBjaGlsZHJlbgotCQkJCQlDTUdyb3VwTm9kZSBncm91cCA9IChDTUdyb3VwTm9kZSkgdGhpczsKLQkJCQkJZ3JvdXAuc2V0Q29ubmVjdG9yKENNR3JvdXBOb2RlLkNIT0lDRSk7Ci0JCQkJCWdyb3VwLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUpOwotCQkJCQlDTU5vZGUgZmlyc3RDaGlsZCA9IChDTU5vZGUpIGdyb3VwLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJaWYgKCFmaXJzdENoaWxkLmdldFR5cGUoKS5lcXVhbHMoUENEQVRBKSkgewotCQkJCQkJZ3JvdXAuaW5zZXJ0Q2hpbGROb2RlKCIjUENEQVRBIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb290RWxlbWVudENvbnRlbnQoYm9vbGVhbiB2KSB7Ci0JCXRoaXMucm9vdEVsZW1lbnRDb250ZW50ID0gdjsKLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCBkZWxldGUoKQotCS8vIHsKLQkvLyBpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkKLQkvLyB7Ci0JLy8gLy8gdGhlbiB0aGUgc3VwZXJjbGFzc2VzIGRlbGV0ZSB3aWxsIGJlIGZpbmUKLQkvLyBzdXBlci5kZWxldGUoKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCi0JLy8gQ01Hcm91cE5vZGUgcGFyZW50ID0gKENNR3JvdXBOb2RlKSBnZXRQYXJlbnROb2RlKCk7Ci0JLy8gcGFyZW50LnJlbW92ZUNoaWxkTm9kZSh0aGlzKTsKLQkvLyB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTVJlcGVhdGFibGVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNUmVwZWF0YWJsZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhOGJmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNUmVwZWF0YWJsZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTVJlcGVhdGFibGVOb2RlIGV4dGVuZHMgQ01Ob2RlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPTkNFID0gJzEnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPTkVfT1JfTU9SRSA9ICcrJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT1BUSU9OQUwgPSAnPyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFpFUk9fT1JfTU9SRSA9ICcqJzsKLQotCi0JcHVibGljIENNUmVwZWF0YWJsZU5vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCURURENvcmVQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5FTEVNRU5UUkVGSUNPTik7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0T2NjdXJyZW5jZSgpIHsKLQkJSVRleHRSZWdpb24gb2NjdXJSZWdpb24gPSBnZXRPY2N1cnJlbmNlUmVnaW9uKCk7Ci0JCWlmIChvY2N1clJlZ2lvbiAhPSBudWxsICYmIG9jY3VyUmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChvY2N1clJlZ2lvbikuY2hhckF0KDApOwotCQl9Ci0JCXJldHVybiBDTVJlcGVhdGFibGVOb2RlLk9OQ0U7Ci0JfQotCi0JLy8gcmV0dXJucyB0aGUgb2NjdXJyZW5jZXJlZ2lvbiwgb3IgdGhlIGxhc3QgcmVnaW9uIHdoZXJlIHRoZSBvY2N1cnJlbmNlCi0JLy8gcmVnaW9uIHNob3VsZCBhcHBlYXIgYWZ0ZXIKLQlhYnN0cmFjdCBwdWJsaWMgSVRleHRSZWdpb24gZ2V0T2NjdXJyZW5jZVJlZ2lvbigpOwotCi0JcHVibGljIHZvaWQgc2V0T2NjdXJyZW5jZShjaGFyIG9jY3VycmVuY2UpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9SRVBfTk9ERV9DSEdfT0NDVVIpOyAvLyROT04tTkxTLTEkCi0JCXNldE9jY3VycmVuY2UodGhpcywgb2NjdXJyZW5jZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPY2N1cnJlbmNlKE9iamVjdCByZXF1ZXN0b3IsIGNoYXIgb2NjdXJyZW5jZSkgewotCQlpZiAoZ2V0T2NjdXJyZW5jZSgpICE9IG9jY3VycmVuY2UpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE9jY3VycmVuY2VSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQlpZiAob2NjdXJyZW5jZSA9PSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpIHsKLQkJCQkJCS8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvY2N1ciByZWdpb24gZnJvbSB0aGUgZmxhdAotCQkJCQkJLy8gbW9kZWw7Ci0JCQkJCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pLCAxLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIFJlZ2lvbiBvbGRPY2N1ciA9IHJlZ2lvbi5jcmVhdGVDb3B5KCk7Ci0JCQkJCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pLCAxLCBTdHJpbmcudmFsdWVPZihvY2N1cnJlbmNlKSk7Ci0JCQkJCQkvLyBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnQob2xkT2NjdXIsIHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2NjdXJyZW5jZSAhPSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldFN0cmluZygpKTsKLQkJCQkJLy8gd2UgbmVlZCB0byBjcmVhdGUgYW4gb2NjdXJyZW5jZVJlZ2lvbgotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pLCAwLCBTdHJpbmcudmFsdWVPZihvY2N1cnJlbmNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19Ly8gQ01SZXBlYXRhYmxlTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Db21tZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlODI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NvbW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tZW50IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCi0JcHVibGljIGNsYXNzIFN0YXJ0RW5kUGFpciB7Ci0JCXB1YmxpYyBpbnQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWVudChEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5DT01NRU5USUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoKTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPD0gMzApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIDI5KSArICIuLi4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KFN0YXJ0RW5kUGFpciBwYWlyKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50U3RhcnRUYWcgPSBnZXRTdGFydFRhZyhpdGVyKTsKLQkJSVRleHRSZWdpb24gZW5kQ29tbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoY29tbWVudFN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoY29tbWVudFN0YXJ0VGFnKTsKLQkJfQotCQlpZiAoZW5kQ29tbWVudFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGVuZENvbW1lbnRUYWcpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQkJaW50IGZsYXROb2RlU3RhcnQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpOwotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcocGFpci5zdGFydE9mZnNldCAtIGZsYXROb2RlU3RhcnQsIHBhaXIuZW5kT2Zmc2V0IC0gZmxhdE5vZGVTdGFydCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NPTU1FTlRfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXBsYWNlVGV4dCh0aGlzLCBwYWlyLnN0YXJ0T2Zmc2V0LCBwYWlyLmVuZE9mZnNldCAtIHBhaXIuc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxMmY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgRFREIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05PTkVfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0hBUkFDVEVSX0RBVEFfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSURFTlRJRklFUl9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JRF9SRUZFUkVOQ0VfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSURfUkVGRVJFTkNFU19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlRJVFlfTkFNRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlRJVFlfTkFNRVNfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTkFNRV9UT0tFTl9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OQU1FX1RPS0VOU19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlVNX05BTUVfVE9LRU5TX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VOVU1fTk9UQVRJT05fREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9ERUZBVUxUX1ZBTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9FTlVNX0lURU1TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSX0xJU1RfQUREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9HUlBfTk9ERV9DT05ORUNUT1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0lOU0VSVF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfR1JQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfQ0hJTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfTUlYX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfQ0hJTERfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9TRVRfTUlYX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfU0VUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfUENEQVRBOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX0FOWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fUkVQX05PREVfQ0hHX09DQ1VSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT01NRU5UX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfUEFSTV9FTlRJVFlfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfTk9UQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9BVFRSX0xJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX05PREVfTkFNRV9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9OT0RFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVF9BRERfQVRUUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5UX0FERF9DSElMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1NFVF9HRU5FUkFMX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfU0VUX0lOVF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9WQUxVRV9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9OREFUQV9DSEFOR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVF9OT0RFX1BVQkxJQ19JRF9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVF9OT0RFX1NZU1RFTV9JRF9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9FTEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX0VOVElUSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfTk9UQVRJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9PVEhFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BBUk1fRU5USVRZX1JFRl9DSEdfRU5USVRZX1JFRjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UT1BfTEVWRUxfTk9ERV9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0lOQ0xfRklMRV9MT0FEX0ZBSUxVUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUlBBUlRfVU5ERUNMQVJFRF9FTEVNRU5UXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JQQVJUX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VYQ19PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTU2MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRFREQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIERURENvcmVQbHVnaW4gaW5zdGFuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldERUREltYWdlKFN0cmluZyBpY29uTmFtZSkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpY29uTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RFRESW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpY29uTmFtZSkgewotCQlTdHJpbmcgdGhpc0lEID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbih0aGlzSUQsIGljb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBEVERDb3JlUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEVERDb3JlUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBEVERDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uTmFtZSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCi0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdGhpc0lEID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHRoaXNJRCwgaWNvbk5hbWUpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YWMzZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBTdHJpbmdzIGZvciBEVERCYXNpY1R5cGVJbXBsIHR5cGUgZGVzY3JpcHRpb25zCi1fVUlfTk9ORV9ERVNDPU5vbmUKLQotISEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIGZvbGxvd2luZyB0ZXh0IGluIHBhcmVudGhlc2VzIG9uIGZvbGxvd2luZyAxMCBsaW5lcyBpLmUuKENEQVRBKQotX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0M9Q2hhcmFjdGVyIERhdGEgKENEQVRBKQotX1VJX0lERU5USUZJRVJfREVTQz1JZGVudGlmaWVyIChJRCkKLV9VSV9JRF9SRUZFUkVOQ0VfREVTQz1JRCBSZWZlcmVuY2UgKElEUkVGKQotX1VJX0lEX1JFRkVSRU5DRVNfREVTQz1JRCBSZWZlcmVuY2VzIChJRFJFRlMpCi1fVUlfRU5USVRZX05BTUVfREVTQz1FbnRpdHkgTmFtZSAoRU5USVRZKQotX1VJX0VOVElUWV9OQU1FU19ERVNDPUVudGl0eSBOYW1lcyAoRU5USVRJRVMpCi1fVUlfTkFNRV9UT0tFTl9ERVNDPU5hbWUgVG9rZW4gKE5NVE9LRU4pCi1fVUlfTkFNRV9UT0tFTlNfREVTQz1OYW1lIFRva2VucyAoTk1UT0tFTlMpCi1fVUlfRU5VTV9OQU1FX1RPS0VOU19ERVNDPUVudW1lcmF0ZWQgTmFtZSBUb2tlbnMKLV9VSV9FTlVNX05PVEFUSU9OX0RFU0M9RW51bWVyYXRlZCBOT1RBVElPTgotCi0hIFN0cmluZ3MgZnJvbSBzZWQvbW9kZWwKLQotISBBdHRyaWJ1dGUuamF2YQotX1VJX0xBQkVMX0FUVFJfREVGQVVMVF9WQUw9QXR0cmlidXRlIERlZmF1bHQgQ2hhbmdlIFZhbHVlCi1fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQ9Q2hhbmdlIEF0dHJpYnV0ZSBEZWZhdWx0IFZhbHVlCi1fVUlfTEFCRUxfQVRUUl9UWVBFPUNoYW5nZSBBdHRyaWJ1dGUgVHlwZQotCi0hIEF0dHJpYnV0ZUVudW1MaXN0Ci1fVUlfTEFCRUxfQVRUUl9FTlVNX0lURU1TPUNoYW5nZSBBdHRyaWJ1dGUgRW51bWVyYXRpb24gVmFsdWUKLQotISBBdHRyaWJ1dGVMaXN0Ci1fVUlfTEFCRUxfQVRUUl9MSVNUX0FERD1BZGQgQXR0cmlidXRlCi0KLSEgQ01Hcm91cE5vZGUKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9DT05ORUNUT1I9Q2hhbmdlIENvbm5lY3RvcgotX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0lOU0VSVF9FTEVNRU5UPUluc2VydCBFbGVtZW50Ci1fVUlfTEFCRUxfQ01fR1JQX05PREVfQUREX0dSUD1BZGQgR3JvdXAKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfQ0hJTEQ9QWRkIENoaWxkIEVsZW1lbnQKLQotISBDTU5vZGUKLV9VSV9MQUJFTF9DTV9OT0RFX01JWF9DT05URU5UPU1peGVkIENvbnRlbnQKLV9VSV9MQUJFTF9DTV9OT0RFX0NISUxEX0NPTlRFTlQ9Q2hpbGRyZW4gQ29udGVudAotX1VJX0xBQkVMX0NNX05PREVfU0VUX01JWF9DT05URU5UPVNldCBNaXhlZCBDb250ZW50Ci1fVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVD1TZXQgQ2hpbGRyZW4gQ29udGVudAotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBVU0FHRTogIlNldCA8dmFyaWFibGUgY29udGVudD4gQ29udGVudCIKLV9VSV9MQUJFTF9DTV9OT0RFX1NFVD1TZXQKLV9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQ9Q29udGVudAotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBETyBOT1QgVFJBTlNMQVRFIEZPTExPV0lORyAzIExJTkVTCi1fVUlfTEFCRUxfQ01fTk9ERV9QQ0RBVEE9KCNQQ0RBVEEpCi1fVUlfTEFCRUxfQ01fTk9ERV9BTlk9QU5ZCi1fVUlfTEFCRUxfQ01fTk9ERV9FTVBUWT1FTVBUWQotCi0hIENNUmVwZWF0YWJsZU5vZGUKLV9VSV9MQUJFTF9DTV9SRVBfTk9ERV9DSEdfT0NDVVI9Q2hhbmdlIE9jY3VycmVuY2UKLQotISBDb21tZW50Ci1fVUlfTEFCRUxfQ09NTUVOVF9DSEc9Q29tbWVudCBDaGFuZ2UKLQotISBEVERGaWxlCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VMRU1FTlQ9QWRkIEVsZW1lbnQKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfRU5USVRZPUFkZCBFbnRpdHkKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfQ09NTUVOVD1BZGQgQ29tbWVudAotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUY9QWRkIFBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX05PVEFUSU9OPUFkZCBOb3RhdGlvbgotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9BVFRSX0xJU1Q9QWRkIEF0dHJpYnV0ZSBMaXN0Ci1fVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFPURlbGV0ZQotCi0hIERURE5vZGUKLV9VSV9MQUJFTF9EVERfTk9ERV9OQU1FX0NIRz1OYW1lIENoYW5nZQotX1VJX0xBQkVMX0RURF9OT0RFX0RFTEVURT1EZWxldGUKLQotISBFbGVtZW50Ci1fVUlfTEFCRUxfRUxFTUVOVF9BRERfQVRUUj1BZGQgQXR0cmlidXRlCi1fVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQPUFkZCBHcm91cAotX1VJX0xBQkVMX0VMRU1FTlRfQUREX0NISUxEPUFkZCBDaGlsZCBFbGVtZW50Ci0KLSEgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWT1TZXQgUGFyYW1ldGVyIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9TRVRfR0VORVJBTF9FTlRJVFk9U2V0IEdlbmVyYWwgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZPVNldCBFeHRlcm5hbCBFbnRpdHkKLV9VSV9MQUJFTF9FTlRJVFlfU0VUX0lOVF9FTlRJVFk9U2V0IEludGVybmFsIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9WQUxVRV9DSEc9RW50aXR5IFZhbHVlIENoYW5nZQotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBVU0FHRTogIk5EQVRBIENoYW5nZSIKLV9VSV9MQUJFTF9FTlRJVFlfTkRBVEFfQ0hBTkdFPUNoYW5nZQotCi0hIEV4dGVybmFsTm9kZQotX1VJX0xBQkVMX0VYVF9OT0RFX1BVQkxJQ19JRF9DSEc9UHVibGljIElEIENoYW5nZQotX1VJX0xBQkVMX0VYVF9OT0RFX1NZU1RFTV9JRF9DSEc9U3lzdGVtIElEIENoYW5nZQotCi0hIE5vZGVMaXN0Ci1fVUlfTEFCRUxfTk9ERV9MSVNUX0VMRU1FTlRTPUVsZW1lbnRzCi1fVUlfTEFCRUxfTk9ERV9MSVNUX0VOVElUSUVTPUVudGl0aWVzCi1fVUlfTEFCRUxfTk9ERV9MSVNUX05PVEFUSU9OUz1Ob3RhdGlvbnMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFM9Q29tbWVudHMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfT1RIRVI9T3RoZXIKLV9VSV9MQUJFTF9OT0RFX0xJU1RfQVRUUklCVVRFUz1BdHRyaWJ1dGVzCi0KLSEgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlCi1fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NIR19FTlRJVFlfUkVGPUNoYW5nZSBFbnRpdHkgUmVmZXJlbmNlCi1fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHPUNvbW1lbnQgQ2hhbmdlCi0KLSEgVG9wTGV2ZWxOb2RlCi1fVUlfTEFCRUxfVE9QX0xFVkVMX05PREVfREVMRVRFPURlbGV0ZQotCi1fRVJST1JfSU5DTF9GSUxFX0xPQURfRkFJTFVSRSAgICAgICA9IEZhaWxlZCB0byBsb2FkIGluY2x1ZGVkIGZpbGUKLQotISB1c2FnZTogX0VSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8xICArIDxlbGVtZW50TmFtZT4gKyBfUEFSVEVSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8yCi1fRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzEgICAgICAgICA9IFJlZmVyZW5jZSB0byB1bmRlY2xhcmVkIGVsZW1lbnQgJwotX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMiAgPScgaW4gY29udGVudCBtb2RlbC4KLQotISB1c2FnZTogX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSAgKyA8YXR0cmlidXRlTmFtZT4gKyBfUEFSVEVSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMgotX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSAgICAgICAgID0gRHVwbGljYXRlIElEIGF0dHJpYnV0ZSAnCi1fVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMiAgPSAnLiBPbmx5IG9uZSBJRCBhdHRyaWJ1dGUgY2FuIGJlIHNwZWNpZmllZCBwZXIgRUxFTUVOVCB0eXBlLgotCi0hIHVzYWdlOl9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xICsgPHR5cGVTdHJpbmc+ICsgX1BBUlRFUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yICsgPGF0dHJpYnV0ZU5hbWU+Ci1fRVJST1JfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMSAgICAgICAgID0gSW52YWxpZCBkZWZhdWx0Ci1fVUlfRVJST1JQQVJUX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzIgID0gIHZhbHVlIGZvciBhdHRyaWJ1dGUgJwotCi1fRVhDX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEICA9IE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RUREZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRERmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmNmMDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRERmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuTm9kZXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERNb2RlbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotcHVibGljIGNsYXNzIERUREZpbGUgaW1wbGVtZW50cyBJbmRleGVkUmVnaW9uIHsKLQlwcml2YXRlIE5vZGVMaXN0IGF0dGxpc3RMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsKLQlwcml2YXRlIE5vZGVMaXN0IGNvbW1lbnRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOwotCi0JYm9vbGVhbiBjcmVhdGluZ05ld01vZGVsID0gZmFsc2U7Ci0JcHJpdmF0ZSBEVERNb2RlbEltcGwgZkRURE1vZGVsOwotCi0JcHJpdmF0ZSBOb2RlTGlzdCBlbGVtZW50TGlzdCA9IG5ldyBOb2RlTGlzdCh0aGlzLCBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7Ci0JcHJpdmF0ZSBOb2RlTGlzdCBlbnRpdHlMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOwotCi0JcHJpdmF0ZSBMaXN0IGZvbGRlckxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTW92aW5nTm9kZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBMaXN0IG1vZGVsTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBMaXN0IG5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTm9kZUxpc3Qgbm90YXRpb25MaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7Ci0JcHJpdmF0ZSBOb2RlTGlzdCB1bnJlY29nbml6ZWRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7Ci0KLQlwdWJsaWMgRFRERmlsZShEVERNb2RlbEltcGwgZHRkTW9kZWwpIHsKLQkJdGhpcy5mRFRETW9kZWwgPSBkdGRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREVERGaWxlTGlzdGVuZXIoSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQltb2RlbExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCWFkZE5vZGUobm9kZUxpc3Quc2l6ZSgpLCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlKGludCBpbmRleCwgRFRETm9kZSBub2RlKSB7Ci0JCW5vZGVMaXN0LmFkZChpbmRleCwgbm9kZSk7Ci0JCS8qCi0JCSAqIGlmIChpbmRleCA8IG5vZGVMaXN0LnNpemUoKSkgeyBpbnNlcnRCZWZvcmUobm9kZSwgKERURE5vZGUpCi0JCSAqIG5vZGVMaXN0LmdldChpbmRleCkpOyB9IGVsc2UgeyBhcHBlbmRDaGlsZChub2RlKTsgfQotCQkgKi8KLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBidWlsZE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQkvLyBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJRFRETm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGlzRWxlbWVudChmbGF0Tm9kZSkpIHsKLQkJCS8vIHRoZW4gdGhpcyBpcyBhbiBlbGVtZW50Ci0JCQlub2RlID0gbmV3IEVsZW1lbnQodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzRW50aXR5KGZsYXROb2RlKSkgewotCQkJbm9kZSA9IG5ldyBFbnRpdHkodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzTm90YXRpb24oZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IE5vdGF0aW9uKHRoaXMsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChpc0F0dHJpYnV0ZUxpc3QoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IEF0dHJpYnV0ZUxpc3QodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzQ29tbWVudChmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgQ29tbWVudCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoIWZsYXROb2RlLmdldFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlub2RlID0gbmV3IFVucmVjb2duaXplZCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaW5zZXJ0Tm9kZShub2RlKTsKLQkJCW5vZGUucmVzb2x2ZVJlZ2lvbnMoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBidWlsZE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGxpc3QpIHsKLQkJTm9kZXNFdmVudCBhZGRlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQotCQlUb3BMZXZlbE5vZGUgcHJldmlvdXNOb2RlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQlUb3BMZXZlbE5vZGUgbm9kZSA9IChUb3BMZXZlbE5vZGUpIGJ1aWxkTm9kZShmbGF0Tm9kZSk7Ci0JCQkvLyBpZiB3ZSBkb24ndCBjcmVhdGUgYSBub2RlLCB0aGVuIHdlIGFzc3VtZSB0aGF0IHRoZSBmbGF0Ci0JCQkvLyBub2RlIHdhcyB3aGl0ZXNwYWNlLiBUYWNrIGl0IG9uIHRvIGEgcHJldmlvdXMgdG9wbGV2ZWwKLQkJCS8vIG5vZGUKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlwcmV2aW91c05vZGUgPSBub2RlOwotCQkJCWFkZGVkRFRETm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHByZXZpb3VzTm9kZSAhPSBudWxsKSB7Ci0JCQkJCXByZXZpb3VzTm9kZS5hZGRXaGl0ZXNwYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApLy8gJiYKLQkJLy8gY3JlYXRpbmdOZXdNb2RlbCA9PSBmYWxzZSkKLQkJewotCQkJLy8gbm93IHRlbGwgcGVvcGxlIGFib3V0IHRoZSBhZGRpdGlvbnMKLQkJCW5vdGlmeU5vZGVzQWRkZWQoYWRkZWREVEROb2Rlcyk7Ci0JCX0KLQl9Ci0KLQkvLyBJbXBsZW1lbnRzIEluZGV4ZWRSZWdpb24KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXN0UG9zaXRpb24pIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gdGVzdFBvc2l0aW9uICYmIHRlc3RQb3NpdGlvbiA8PSBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVBdHRyaWJ1dGVMaXN0KERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0FUVFJfTElTVCk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9ICI8IUFUVExJU1QgIiArIG5hbWUgKyAiPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29tbWVudChEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9DT01NRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhLS0gIiArIG5hbWUgKyAiIC0tPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRWxlbWVudChEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhRUxFTUVOVCAiICsgbmFtZSArICIgRU1QVFk+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFbnRpdHkoRFRETm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9BRERfRU5USVRZKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhRU5USVRZICIgKyBuYW1lICsgIiBcIlwiPlxuIjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVOb3RhdGlvbihEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9OT1RBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9ICI8IU5PVEFUSU9OICIgKyBuYW1lICsgIiBTWVNURU0gXCJcIj5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSBuYW1lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZU5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZU5vZGUodGhpcywgbm9kZSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZU5vZGUoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSBub2RlKSB7Ci0JCURURE5vZGUgcGFyZW50ID0gKERURE5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kZWxldGUocmVxdWVzdG9yLCBub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghaXNNb3ZpbmdOb2RlKSB7Ci0JCQkJRFRETW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBuZXcgRFRETW9kZWxVcGRhdGVyKCk7Ci0JCQkJdXBkYXRlci5vYmplY3RBYm91dFRvQmVEZWxldGVkKHJlcXVlc3Rvciwgbm9kZSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHsKLQkJCQkJRW50aXR5IHJlZmVyZW5jZWRFbnRpdHkgPSAoKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgbm9kZSkuZ2V0RW50aXR5T2JqZWN0KCk7Ci0JCQkJCWlmIChyZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJCS8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGFsbCBlbGVtZW50cyBhbmQgcGFybSBlbnRpdGllcwotCQkJCQkJLy8gY29udGFpbmVkIGluIG91ciBjdXJyZW50IG1vZGVsCi0JCQkJCQlEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIgcmVtb3ZlciA9IG5ldyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIoKTsKLQkJCQkJCXJlbW92ZXIuZXh0ZXJuYWxSZWZlcmVuY2VBYm91dFRvQ2hhbmdlKHJlcXVlc3RvciwgcmVmZXJlbmNlZEVudGl0eSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJCU5vdGF0aW9uIG5vdGF0aW9uID0gKChOb3RhdGlvbikgbm9kZSk7Ci0JCQkJCURURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlciByZW1vdmVyID0gbmV3IERURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlcigpOwotCQkJCQlyZW1vdmVyLm5vdGF0aW9uQWJvdXRUb0JlRGVsZXRlZChyZXF1ZXN0b3IsIG5vdGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG5vIHBhcmVudD8gdGhlbiBkZWxldGUgdXAgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG5vZGUKLQkJCS8vIGlmIGl0IGlzIGEgdG9wIGxldmVsIG5vZGUKLQkJCWludCBzdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBlbmRPZmZzZXQgPSBub2RlLmdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIHRydWUpOwotCQkJfQotCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldENvbW1lbnRzKCkgewotCQlyZXR1cm4gY29tbWVudExpc3Q7Ci0JfQotCi0JcHVibGljIERURE1vZGVsSW1wbCBnZXREVERNb2RlbCgpIHsKLQkJcmV0dXJuIGZEVERNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZWxlbWVudExpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHN0YXJ0ID0gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHN0YXJ0ID49IDApIHsKLQkJCWludCBlbmQgPSBnZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChlbmQgPj0gMCkgewotCQkJCXJlc3VsdCA9IGVuZCAtIHN0YXJ0OwotCQkJCWlmIChyZXN1bHQgPCAtMSkgewotCQkJCQlyZXN1bHQgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBlbnRpdHlMaXN0OwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5EVERGSUxFSUNPTik7Ci0JfQotCi0KLQotCXB1YmxpYyBpbnQgZ2V0SW5zZXJ0T2Zmc2V0KERURE5vZGUgbm9kZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNBZnRlcikgewotCQkJCS8vIHRoZW4gZ2V0IHRoZSBuZXh0IG5vZGUgYW5kIHVzZSBpdCdzIHN0YXJ0IG9mZnNldAotCQkJCWludCBpbmRleCA9IGdldE5vZGVzKCkuaW5kZXhPZihnZXROb2RlKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpKTsKLQotCQkJCURURE5vZGUgYWZ0ZXJOb2RlID0gbnVsbDsKLQkJCQlpZiAoaW5kZXggKyAxIDwgZ2V0Tm9kZXMoKS5zaXplKCkpIHsKLQkJCQkJYWZ0ZXJOb2RlID0gKERURE5vZGUpIGdldE5vZGVzKCkuZ2V0KGluZGV4ICsgMSk7Ci0JCQkJfQotCQkJCWlmIChhZnRlck5vZGUgIT0gbnVsbCkgewotCQkJCQlvZmZzZXQgPSBhZnRlck5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFkZCB0byBlbmQKLQkJCQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlvZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvZmZzZXQgPSBub2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBhZGQgdG8gZW5kCi0JCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCQlvZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoIHBhdGggPSBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGgoZ2V0RFRETW9kZWwoKS5nZXRJZCgpLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgbm9kZUxpc3QuZ2V0KGkpOwotCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgPT0gZmxhdE5vZGUpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRUb3BMZXZlbE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXREZWVwZXN0Tm9kZShvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldE5vZGVBdChpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQkJRFRETm9kZSBub2RlID0gZ2V0VG9wTGV2ZWxOb2RlQXQoc3RhcnRPZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXREZWVwZXN0Tm9kZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb2RlTGlzdHMoKSB7Ci0JCWlmIChmb2xkZXJMaXN0ID09IG51bGwpIHsKLQkJCWZvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChub3RhdGlvbkxpc3QpOwotCQkJZm9sZGVyTGlzdC5hZGQoZW50aXR5TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChlbGVtZW50TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChhdHRsaXN0TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChjb21tZW50TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZCh1bnJlY29nbml6ZWRMaXN0KTsKLQkJfQotCQlyZXR1cm4gZm9sZGVyTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb2RlcygpIHsKLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXROb3RhdGlvbnMoKSB7Ci0JCXJldHVybiBub3RhdGlvbkxpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRFRETW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JcHVibGljIERURE5vZGUgZ2V0VG9wTGV2ZWxOb2RlQXQoaW50IG9mZnNldCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgbm9kZUxpc3QuZ2V0KGkpOwotCQkJaWYgKG5vZGUuY29udGFpbnMob2Zmc2V0KSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRVbnJlY29nbml6ZWQoKSB7Ci0JCXJldHVybiB1bnJlY29nbml6ZWRMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydEludG9Nb2RlbChPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZSwgRFRETm9kZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJU3RyaW5nIG5vZGVUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCW5vZGVUZXh0ID0gKChUb3BMZXZlbE5vZGUpIG5vZGUpLmdldEZ1bGxUZXh0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlVGV4dCA9IG5vZGUuZ2V0Tm9kZVRleHQoKTsKLQkJfQotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KHJlZmVyZW5jZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgb2Zmc2V0LCAwLCBub2RlVGV4dCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2RlKERURE5vZGUgbm9kZSkgewotCQlpbnQgc3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBpbnNlcnRJbmRleCA9IC0xOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0b2Zmc2V0ID0gIiArIHN0YXJ0T2Zmc2V0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXROb2RlcygpLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50Tm9kZSBlbmRPZmZzZXQgPSAiCi0JCQkvLyArY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkpOwotCi0JCQlpZiAoY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZW5kb2Zmc2V0ICIgKwotCQkJCS8vIGN1cnJlbnROb2RlLmdldEVuZE9mZnNldCgpICsgIiA+ICIgKyBzdGFydE9mZnNldCk7Ci0JCQkJaW5zZXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpbnNlcnRJbmRleCA9PSAtMSkgewotCQkJaW5zZXJ0SW5kZXggPSBnZXROb2RlcygpLnNpemUoKTsKLQkJfQotCi0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpbnNlcnQgaW5kZXggPSAiICsgaW5zZXJ0SW5kZXgpOwotCi0JCWFkZE5vZGUoaW5zZXJ0SW5kZXgsIG5vZGUpOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZUxpc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzZWNvbmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gdGhpcmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDIpOwotCQkJaWYgKHNlY29uZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSAmJiB0aGlyZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNDb21tZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMikgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gaXQgaXMgYXNzdW1lZCB0aGF0IGZsYXRub2RlIGNvbnRhaW5zIGF0IGxlYXN0IDMgcmVnaW9ucwotCXB1YmxpYyBib29sZWFuIGlzRW50aXR5KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNOb3RhdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCUlUZXh0UmVnaW9uIHNlY29uZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiB0aGlyZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMik7Ci0JCQlpZiAoc2Vjb25kLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pICYmIHRoaXJkLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlib29sZWFuIGlzU2FtZVRvcExldmVsVHlwZShEVEROb2RlIGFmZmVjdGVkTm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gYWZmZWN0ZWROb2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpOwotCQkvLyByZXR1cm4gdHJ1ZSBpZiB0aGUgZmxhdG5vZGUgc3RpbGwgbWF0Y2hlcyB3aGF0IHRoZSBhZmZlY3RlZE5vZGUKLQkJLy8gaXMgcmVwcmVzZW50aW5nCi0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGlzRWxlbWVudChmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgaXNFbnRpdHkoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgQ29tbWVudCAmJiBpc0NvbW1lbnQoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCAmJiBpc0F0dHJpYnV0ZUxpc3QoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgTm90YXRpb24gJiYgaXNOb3RhdGlvbihmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBVbnJlY29nbml6ZWQgJiYgaXNVbnJlY29nbml6ZWQoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbnJlY29nbml6ZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlyZXR1cm4gIWlzRWxlbWVudChmbGF0Tm9kZSkgJiYgIWlzRW50aXR5KGZsYXROb2RlKSAmJiAhaXNOb3RhdGlvbihmbGF0Tm9kZSkgJiYgIWlzUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKGZsYXROb2RlKSAmJiAhaXNBdHRyaWJ1dGVMaXN0KGZsYXROb2RlKSAmJiAhaXNDb21tZW50KGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlTm9kZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZU5vZGUsIERURE5vZGUgbm9kZVRvTW92ZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWlzTW92aW5nTm9kZSA9IHRydWU7Ci0KLQkJZGVsZXRlTm9kZShyZXF1ZXN0b3IsIG5vZGVUb01vdmUpOwotCQlpbnNlcnRJbnRvTW9kZWwocmVxdWVzdG9yLCByZWZlcmVuY2VOb2RlLCBub2RlVG9Nb3ZlLCBpc0FmdGVyKTsKLQkJaXNNb3ZpbmdOb2RlID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQljcmVhdGluZ05ld01vZGVsID0gdHJ1ZTsKLQkJbm9kZUxpc3QuY2xlYXIoKTsKLQkJTm9kZXNFdmVudCByZW1vdmVFdmVudCA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCXJlbW92ZUV2ZW50LmdldE5vZGVzKCkuYWRkQWxsKG5vZGVMaXN0KTsKLQkJbm90aWZ5Tm9kZXNSZW1vdmVkKHJlbW92ZUV2ZW50KTsKLQkJLyogcmVtb3ZlQ2hpbGROb2RlcygpOyAqLwotCi0JCWlmIChldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsICYmIGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSAhPSBudWxsKSB7Ci0JCQlidWlsZE5vZGVzKGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSk7Ci0JCX0KLQkJY3JlYXRpbmdOZXdNb2RlbCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkTm9kZXMgPSBldmVudC5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCU5vZGVzRXZlbnQgcmVtb3ZlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gb2xkTm9kZXMuaXRlbShpKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgPT0gZmxhdE5vZGUpIHsKLQkJCQkJcmVtb3ZlZERURE5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlidWlsZE5vZGVzKGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSk7Ci0KLQkJaWYgKHJlbW92ZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCW5vdGlmeU5vZGVzUmVtb3ZlZChyZW1vdmVkRFRETm9kZXMpOwotCQkJcmVtb3ZlTm9kZXMocmVtb3ZlZERURE5vZGVzLmdldE5vZGVzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Tm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBtb2RlbExpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURUREZpbGVMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub2RlQ2hhbmdlZChub2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeU5vZGVzQWRkZWQoTm9kZXNFdmVudCBhZGRlZE5vZGVzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBtb2RlbExpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURUREZpbGVMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub2Rlc0FkZGVkKGFkZGVkTm9kZXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Tm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG1vZGVsTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJRFRERmlsZUxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vZGVzUmVtb3ZlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWJ1aWxkTm9kZXMoTGlzdCBub2RlcykgewotCQkvLyByZW1vdmUgdGhlIG9sZCBub2RlcwotCQlyZW1vdmVOb2Rlcyhub2Rlcyk7Ci0KLQkJLy8gbm93IHJlYnVpbGQgdGhlbQotCQlOb2Rlc0V2ZW50IGFkZGVkRFRETm9kZXMgPSBuZXcgTm9kZXNFdmVudCgpOwotCQlJdGVyYXRvciBkdGROb2RlcyA9IG5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChkdGROb2Rlcy5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgZHRkTm9kZSA9IChEVEROb2RlKSBkdGROb2Rlcy5uZXh0KCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlYnVpbGRpbmcgIiArCi0JCQkvLyBkdGROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKSk7Ci0KLQkJCURURE5vZGUgbm9kZSA9IGJ1aWxkTm9kZShkdGROb2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlhZGRlZERURE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCS8vIG5vdyB0ZWxsIHBlb3BsZSBhYm91dCB0aGUgYWRkaXRpb25zCi0JCQlub3RpZnlOb2Rlc0FkZGVkKGFkZGVkRFRETm9kZXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVRleHRSZWdpb24gY2hhbmdlZFJlZ2lvbiA9IGV2ZW50LmdldFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCURURE5vZGUgYWZmZWN0ZWROb2RlID0gKERURE5vZGUpIGdldE5vZGVBdChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChjaGFuZ2VkUmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KGNoYW5nZWRSZWdpb24pKTsKLQkJaWYgKGFmZmVjdGVkTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBubyBuZWVkIHRvIHJlc29sdmUgcmVnaW9ucyBhcyBpdCBpcyBqdXN0IGEgY2hhbmdlCi0JCQkvLyBhZmZlY3RlZE5vZGUucmVzb2x2ZVJlZ2lvbnMoKTsKLQkJCW5vdGlmeU5vZGVDaGFuZ2VkKGFmZmVjdGVkTm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCBub2Rlc1RvUmVidWlsZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlEVEROb2RlIGFmZmVjdGVkTm9kZSA9IGdldE5vZGUoZmxhdE5vZGUpOwotCi0JCWlmICghaXNTYW1lVG9wTGV2ZWxUeXBlKGFmZmVjdGVkTm9kZSkpIHsKLQkJCS8vIEJ1ZyAxMTExMDAgLSBGaXJlIG9mZiBhIG5vZGUgcmVtb3ZhbCBldmVudAotCQkJLy8gdG8gcmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIHRyZWUgdmlld2VyCi0JCQlOb2Rlc0V2ZW50IHJlbW92ZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCQlyZW1vdmVkRFRETm9kZXMuYWRkKGFmZmVjdGVkTm9kZSk7Ci0JCQlub3RpZnlOb2Rlc1JlbW92ZWQocmVtb3ZlZERURE5vZGVzKTsKLQkJCW5vZGVzVG9SZWJ1aWxkLmFkZChhZmZlY3RlZE5vZGUpOwotCQkJcmVidWlsZE5vZGVzKG5vZGVzVG9SZWJ1aWxkKTsKLQkJfQotCQllbHNlIHsKLQkJCWFmZmVjdGVkTm9kZS5yZXNvbHZlUmVnaW9ucygpOwotCQkJbm90aWZ5Tm9kZUNoYW5nZWQoYWZmZWN0ZWROb2RlKTsKLQkJCS8vIG5vdyB0cnkgYW5kIGRldGVybWluZSB3aGljaCBvbmVzIHdlcmUgYWRkZWQKLQkJCU5vZGVzRXZlbnQgYWRkZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IGV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJCWludCBzaXplID0gbmV3UmVnaW9ucy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KGkpOwotCQkJCURURE5vZGUgZGVlcGVzdE5vZGUgPSBhZmZlY3RlZE5vZGUuZ2V0RGVlcGVzdE5vZGUoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikpOwotCQkJCS8vIEJ1ZyAxMTExMDAgLSBXZSBkbyBub3QgbmVlZCB0byBmaXJlIGEgbm9kZSBhZGRlZCBldmVudAotCQkJCS8vIGZvciB0aGUgYWZmZWN0ZWROb2RlIGJlY2F1c2UgdGhhdCBpcyBhbHJlYWR5IGhhbmRsZWQgYnkKLQkJCQkvLyB0aGUgbm9kZSBjaGFuZ2VkIGV2ZW50IGFib3ZlCi0JCQkJaWYgKGRlZXBlc3ROb2RlICE9IGFmZmVjdGVkTm9kZSAmJiAhYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLmNvbnRhaW5zKGRlZXBlc3ROb2RlKSkgewotCQkJCQlhZGRlZERURE5vZGVzLmFkZChkZWVwZXN0Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZGVkRFRETm9kZXMuZ2V0Tm9kZXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJbm90aWZ5Tm9kZXNBZGRlZChhZGRlZERURE5vZGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURUREZpbGVMaXN0ZW5lcihJRFRERmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW1vZGVsTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm9kZXMoTGlzdCBub2RlcykgewotCQlnZXROb2RlcygpLnJlbW92ZUFsbChub2Rlcyk7Ci0JCS8qCi0JCSAqIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJICogcmVtb3ZlQ2hpbGQoKERURE5vZGUpbm9kZXMuZ2V0KGkpKTsgfSAvLyBlbmQgb2YgZm9yICgpCi0JCSAqLwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRETm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVEROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTVjN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVEROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERURE5vZGUgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIGltcGxlbWVudHMgSW5kZXhlZFJlZ2lvbiB7Ci0KLQkvLyB0aGVzZSBhcmUgY2hhcmFjdGVyb2Zmc2V0cwotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQkvLyBmbGF0IG5vZGUgdGhhdCBjb250YWlucyB0aGlzIG5vZGUKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQotCXByb3RlY3RlZCBUZXh0UmVnaW9uTGlzdEltcGwgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCXByb3RlY3RlZCBUZXh0UmVnaW9uTGlzdEltcGwgd2hpdGVzcGFjZSA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCXB1YmxpYyBEVEROb2RlKERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQl0aGlzLmR0ZEZpbGUgPSBkdGRGaWxlOwotCQl0aGlzLmZsYXROb2RlID0gZmxhdE5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKgotCQkgKiBpZiAoc3RhcnRSZWdpb24gPT0gbnVsbCkgeyBzdGFydFJlZ2lvbiA9IHJlZ2lvbjsgfSBlbmRSZWdpb24gPQotCQkgKiByZWdpb247Ci0JCSAqLwotCQlyZWdpb25zLmFkZChyZWdpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFdoaXRlc3BhY2VSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXdoaXRlc3BhY2UuYWRkKHJlZ2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIGxhYmVsKSB7Ci0JCWdldERUREZpbGUoKS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RvciwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXBlc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRlc3RQb3NpdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNSYW5nZSh0ZXN0UG9zaXRpb24sIHRlc3RQb3NpdGlvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gc3RhcnQgJiYgZW5kIDw9IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZShEVEROb2RlIGNoaWxkKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX05PREVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGUodGhpcywgY2hpbGQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgY2hpbGQpIHsKLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBjaGlsZC5nZXRTdGFydE9mZnNldCgpLCBjaGlsZC5nZXRGdWxsTm9kZUxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RvcikgewotCQlnZXREVERGaWxlKCkuZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbkxpc3QoKS50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KCkgewotCQlOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBnZXREZWVwZXN0Tm9kZShpbnQgb2Zmc2V0KSB7Ci0JCWlmIChjb250YWlucyhvZmZzZXQpKSB7Ci0JCQkvLyBub3cgc2VlIGlmIGEgY2hpbGQgY29udGFpbnMgdGhpcyBvZmZzZXQKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlEVEROb2RlIGNoaWxkID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJCURURE5vZGUgZGVlcGVzdCA9IGNoaWxkLmdldERlZXBlc3ROb2RlKG9mZnNldCk7Ci0JCQkJaWYgKGRlZXBlc3QgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVlcGVzdDsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBvZiBmb3IgKCkKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldERlZXBlc3ROb2RlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAoY29udGFpbnNSYW5nZShzdGFydCwgZW5kKSkgewotCQkJLy8gbm93IHNlZSBpZiBhIGNoaWxkIGNvbnRhaW5zIHRoaXMgb2Zmc2V0Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRFRETm9kZSBjaGlsZCA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCQlEVEROb2RlIGRlZXBlc3QgPSBjaGlsZC5nZXREZWVwZXN0Tm9kZShzdGFydCwgZW5kKTsKLQkJCQlpZiAoZGVlcGVzdCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZWVwZXN0OwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIGZvciAoKQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZ2V0RW5kUmVnaW9uKCkpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFbmRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOy8vIGVuZFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJRFRETW9kZWxJbXBsIG1vZGVsID0gZHRkRmlsZS5nZXREVERNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZyA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQkJaWYgKHJlZyAhPSBudWxsKQotCQkJCXJldHVybiByZWc7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRGdWxsTm9kZUxlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKSAtIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTm9kZVRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0Tm9kZVRleHQoKTsKLQkJaWYgKHdoaXRlc3BhY2Uuc2l6ZSgpID4gMCkgewotCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IG5ldyBSZWdpb25JdGVyYXRvcih3aGl0ZXNwYWNlKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCXRleHQgKz0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OQU1FKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGZpcnN0IHRva2VuIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCB0b2tlbiB0eXBlCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb24oUmVnaW9uSXRlcmF0b3IgaXRlciwgU3RyaW5nIHR5cGUpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXROb2RlTGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0RW5kT2Zmc2V0KCkgLSBnZXRTdGFydE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlVGV4dCgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJc2IuYXBwZW5kKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGdldFN0YXJ0UmVnaW9uKCkpOwotCX0KLQotCS8vIHByaXZhdGUgUmVnaW9uIHN0YXJ0UmVnaW9uLGVuZFJlZ2lvbjsKLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3RhcnRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb25zLmdldCgwKTsKLQkJLy8gcmV0dXJuIHN0YXJ0UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZmxhdE5vZGUuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBmbGF0Tm9kZS4KLQkgKiAKLQkgKiBJU1NVRTpuYW1lZCBjaGFuZ2VkIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZAotCSAqIHN1cGVyIGNsYXNzIG1ldGhvZCwgYnV0IHNob3VsZCByZS10aGluayBpZiB0aGlzIGlzIGNvcnJlY3QgdGVjaG5pcXVlLgotCSAqIFBlcmhhcHMgZ2V0Rmlyc3RSZWdpb24/Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JLy8gcmV0dXJuIGVuZCBvZmZzZXQgaW5jbHVkaW5nIHdoaXRlc3BhY2UKLQkvLyBvciBqdXN0IHRoZSBlbmQgb2Zmc2V0IGlmIHRoZXJlIGlzIG5vIHdoaXRlc3BhY2UKLQlwdWJsaWMgaW50IGdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKSB7Ci0JCWlmICh3aGl0ZXNwYWNlLnNpemUoKSA+IDApIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHdoaXRlc3BhY2UuZ2V0KHdoaXRlc3BhY2Uuc2l6ZSgpIC0gMSk7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkgewotCQlyZXR1cm4gd2hpdGVzcGFjZS5zaXplKCkgPiAwOwotCX0KLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUgcmVnaW9uIGl0ZXIgIiArIHRoaXMuZ2V0Q2xhc3MoKSArICIgd2l0aAotCQkvLyBzdGFydCAsIGVuZCA9ICIgKyBnZXRTdGFydE9mZnNldCgpICsgIiwgIiArZ2V0RW5kT2Zmc2V0KCkpOwotCQlyZXR1cm4gbmV3IFJlZ2lvbkl0ZXJhdG9yKHJlZ2lvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0KE9iamVjdCByZXF1ZXN0b3IsIGludCBzdGFydCwgaW50IGxlbmd0aCwgU3RyaW5nIG5ld1RleHQpIHsKLQkJZ2V0RFRERmlsZSgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnQsIGxlbmd0aCwgbmV3VGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoIWdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZVRva2VuLnVwZGF0ZVRleHQobmFtZSk7Ci0JCQkJZ2V0RFRERmlsZSgpLmdldERURE1vZGVsKCkuZ2V0UmVmZXJlbmNlVXBkYXRlcigpLm5hbWVBYm91dFRvQ2hhbmdlKHJlcXVlc3RvciwgdGhpcywgbmFtZSk7Ci0JCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRMZW5ndGgoKSwgbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX05PREVfTkFNRV9DSEcpOyAvLyROT04tTkxTLTEkCi0JCXNldE5hbWUodGhpcywgbmFtZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGZsYXROb2RlLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZmxhdE5vZGUuIElTU1VFOm5hbWVkIGNoYW5nZWQgbm90IHRvIGJlCi0JICogICAgICAgICAgICBjb25mdXNlZCB3aXRoIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBzdXBlciBjbGFzcyBtZXRob2QsCi0JICogICAgICAgICAgICBidXQgc2hvdWxkIHJlLXRoaW5rIGlmIHRoaXMgaXMgY29ycmVjdCB0ZWNobmlxdWUKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHYpIHsKLQkJdGhpcy5mbGF0Tm9kZSA9IHY7Ci0JfQotCi0JLy8gc2tpcHMgcGFzdCBuZXh0IG5hbWUgdG9rZW4gaW4gdGhlIGl0ZXJhdG9yCi0JcHJvdGVjdGVkIHZvaWQgc2tpcFBhc3ROYW1lKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoamF2YS5sYW5nLlN0cmluZyBmZWF0dXJlLCBqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERSZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZkYjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBEVERSZXNvdXJjZSB7Ci0JLy8gRW51bWVyYXRpb24gQ29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2FueS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFTElTVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfbGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUREZJTEVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UUkVGSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWVJFRkVSRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTERSX0FUVExJU1QgPSAiaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfYXR0bGlzdF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfQ09NTSA9ICJpY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9FTCA9ICJpY29ucy9mdWxsL29iajE2L2ZsZHJfZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfRU5UID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfTk9UID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfVU5SRUMgPSAiaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0hUTUxGT1JNID0gImljb25zL2Z1bGwvb2JqMTYvZ2VuaHRtZm9ybV93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORUNIT0lDRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZW9ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29wdGlvbmFsY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxTRVFVRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0RBVEFJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlJFQ09HTklaRURJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVDSE9JQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTAzMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFbGVtZW50IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCi0JTGlzdCBhdHRMaXN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBDTU5vZGUgZkNvbnRlbnRNb2RlbDsKLQotCXB1YmxpYyBFbGVtZW50KERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VMRU1FTlRfQUREX0FUVFIpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgYXR0TGlzdHMgPSBnZXRBdHRyaWJ1dGVMaXN0cygpOwotCQlpZiAoYXR0TGlzdHMuc2l6ZSgpID09IDApIHsKLQkJCWdldERUREZpbGUoKS5jcmVhdGVBdHRyaWJ1dGVMaXN0KHRoaXMsIGdldE5hbWUoKSwgdHJ1ZSk7Ci0JCQlhdHRMaXN0cyA9IGdldEF0dHJpYnV0ZUxpc3RzKCk7Ci0JCX0KLQkJaWYgKGF0dExpc3RzLnNpemUoKSA+IDApIHsKLQkJCUF0dHJpYnV0ZUxpc3QgYXR0TGlzdCA9IChBdHRyaWJ1dGVMaXN0KSBhdHRMaXN0cy5nZXQoYXR0TGlzdHMuc2l6ZSgpIC0gMSk7Ci0JCQlhdHRMaXN0LmFkZEF0dHJpYnV0ZShuYW1lKTsKLQkJfQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9BRERfQ0hJTEQpOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbnRlbnQodGhpcywgIiBFTVBUWSIpOyAvLyROT04tTkxTLTEkCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50KE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBjb250ZW50KSB7Ci0JCUlUZXh0UmVnaW9uIHdoaXRlc3BhY2UgPSBnZXRXaGl0ZXNwYWNlQWZ0ZXJOYW1lKCk7Ci0JCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCQlpZiAod2hpdGVzcGFjZSAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHdoaXRlc3BhY2UpOwotCQkJbGVuZ3RoID0gd2hpdGVzcGFjZS5nZXRMZW5ndGgoKSA+PSAyID8gMSA6IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVRleHRSZWdpb24gZWxlbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGVsZW1lbnRUYWcpOwotCQkJfQotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGxlbmd0aCwgY29udGVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkR3JvdXAoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRDb250ZW50KHRoaXMsICIgKCkiKTsgLy8kTk9OLU5MUy0xJAotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnQoZHRkRmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUxpc3RzKCkgewotCQlhdHRMaXN0TGlzdC5jbGVhcigpOwotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBnZXROYW1lKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBkdGRGaWxlLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QgJiYgbm9kZS5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCWF0dExpc3RMaXN0LmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0TGlzdExpc3Q7Ci0JfQotCi0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0Q29udGVudE1vZGVsKCkgewotCQkvLyBPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCkKLQkJcmV0dXJuIChDTU5vZGUpIGdldEZpcnN0Q2hpbGQoKTsvLyBjb250ZW50TW9kZWw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKSB7Ci0JCWF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJSXRlcmF0b3IgYXR0TGlzdHMgPSBnZXRBdHRyaWJ1dGVMaXN0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhdHRMaXN0cy5oYXNOZXh0KCkpIHsKLQkJCUF0dHJpYnV0ZUxpc3QgYXR0TGlzdCA9IChBdHRyaWJ1dGVMaXN0KSBhdHRMaXN0cy5uZXh0KCk7Ci0KLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gYXR0TGlzdC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWF0dHJpYnV0ZXMuYWRkKGNoaWxkcmVuW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRUxFTUVOVElDT04pOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE5vZGUuRUxFTUVOVF9OT0RFOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VDb250ZW50TW9kZWwoT2JqZWN0IHJlcXVlc3RvciwgQ01Ob2RlIG5vZGUpIHsKLQkJcmVwbGFjZUNvbnRlbnRNb2RlbChyZXF1ZXN0b3IsIG5vZGUuZ2V0Tm9kZVRleHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZUNvbnRlbnRNb2RlbChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbm9kZVRleHQpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCQlDTU5vZGUgY29udGVudE1vZGVsID0gZ2V0Q29udGVudE1vZGVsKCk7Ci0JCWlmIChjb250ZW50TW9kZWwgIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gY29udGVudE1vZGVsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBjb250ZW50TW9kZWwuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBvZmZzZXQsIGxlbmd0aCwgbm9kZVRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJYWRkQ29udGVudChyZXF1ZXN0b3IsIG5vZGVUZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImVsZW1lbnQgbm9kZSBzdHJlYW0gPSAiICsKLQkJLy8gdG9rZW5TdHJlYW0uZ2V0U3RyaW5nKCkpOwotCQlmQ29udGVudE1vZGVsID0gbnVsbDsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlpZiAoZ2V0TmFtZVJlZ2lvbigpICE9IG51bGwpIHsKLQkJCS8vIHdlIHNraXAgcGFzdCB0aGUgbmFtZSB0b2tlbiBpcyBvdXIgbmFtZQotCQkJc2tpcFBhc3ROYW1lKGl0ZXIpOwotCQl9Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0KLQkJCWlmIChmQ29udGVudE1vZGVsID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQkJCWZDb250ZW50TW9kZWwgPSBuZXcgQ01CYXNpY05vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkpIHsKLQkJCQkJZkNvbnRlbnRNb2RlbCA9IG5ldyBDTUJhc2ljTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJCWZDb250ZW50TW9kZWwgPSBuZXcgQ01Hcm91cE5vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZkNvbnRlbnRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRU5EX1RBRykpIHsKLQkJCQkJLy8gY29udGVudCBtb2RlbCBnZXRzIGFsbCByZWdpb25zIGV4Y2VwdCBmb3IgdGhlICc+JwotCQkJCQlmQ29udGVudE1vZGVsLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGlmIGl0IGlzIGVxdWFsIHRvIHRoZSBlbmQgdGFnLCB0aGVuIGRvbid0IGFkZCBhbnltb3JlCi0JCQkJCS8vIHJlZ2lvbnMKLQkJCQkJLy8gZm9yIHRoZSBjb250ZW50IG1vZGVsCi0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJfQotCi0JCX0KLQkJaWYgKGZDb250ZW50TW9kZWwgIT0gbnVsbCkgewotCQkJYXBwZW5kQ2hpbGQoZkNvbnRlbnRNb2RlbCk7Ci0JCQkvLyB0aGlzIGlzIHRoZSByb290IGVsZW1lbnQgY29udGVudCBzbyBzZXQgaXQgdHJ1ZQotCQkJZkNvbnRlbnRNb2RlbC5zZXRSb290RWxlbWVudENvbnRlbnQodHJ1ZSk7Ci0JCQkvLyBub3cgdGVsbCB0aGUgY29udGVudCBtb2RlbCB0byByZXNvbHZlIGl0J3MgcmVnaW9ucwotCQkJZkNvbnRlbnRNb2RlbC5yZXNvbHZlUmVnaW9ucygpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50TW9kZWwoQ01Ob2RlIGNvbnRlbnRNb2RlbCkgewotCQl0aGlzLmZDb250ZW50TW9kZWwgPSBjb250ZW50TW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZjdjM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBleHRlcm5hbCBub2RlIGNvbnRhaW5zIGNvZGUgdG8gaGVscCBzZXQgYW5kIGdldCBwdWJsaWMgaWRzCi1wdWJsaWMgY2xhc3MgRW50aXR5IGV4dGVuZHMgRXh0ZXJuYWxOb2RlIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXRFeHRlcm5hbEVudGl0eSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldEdlbmVyYWxFbnRpdHkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9TRVRfR0VORVJBTF9FTlRJVFk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2V0SW50ZXJuYWxFbnRpdHkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9TRVRfSU5UX0VOVElUWTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldFBhcmFtZXRlckVudGl0eSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEVudGl0eShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTlRJVFlJQ09OKTsKLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb25OYW1lKCkgewotCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOwotCQlpZiAobmRhdGFSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQobmRhdGFSZWdpb24pOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQZXJjZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJaWYgKCFpc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0JCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24odmFsdWVSZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZXh0ZXJuYWxFbnRpdHkuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBleHRlcm5hbEVudGl0eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSAhPSBudWxsIHx8IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiBnZXRQZXJjZW50UmVnaW9uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTkRhdGEoT2JqZWN0IHJlcXVlc3RvcikgewotCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IG51bGw7Ci0KLQkJLy8gc2VlIGlmIHdlIGhhdmUgYW4gTkRBVEEga2V5d29yZAotCQluZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7Ci0JCWludCBzdGFydE9mZnNldCA9IDAsIGVuZE9mZnNldCA9IDA7Ci0JCWlmIChuZGF0YVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KG5kYXRhUmVnaW9uKTsKLQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZGF0YVJlZ2lvbik7Ci0JCX0KLQkJSVRleHRSZWdpb24gdmFsdWUgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCh2YWx1ZSk7Ci0JCQl9Ci0JCQllbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQodmFsdWUpOwotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGV4dGVybmFsRW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZXh0ZXJuYWxFbnRpdHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxFbnRpdHkoYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KSB7Ci0JCWlmIChpc0V4dGVybmFsRW50aXR5KCkgIT0gaXNFeHRlcm5hbEVudGl0eSkgewotCQkJLy8gZXh0ZXJuYWxFbnRpdHkgPSB2OwotCQkJYmVnaW5SZWNvcmRpbmcodGhpcywgaXNFeHRlcm5hbEVudGl0eSA/IHNldEV4dGVybmFsRW50aXR5IDogc2V0SW50ZXJuYWxFbnRpdHkpOwotCQkJaWYgKGlzRXh0ZXJuYWxFbnRpdHkpIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIGdldCByaWQgb2YgdGhlIHZhbHVlIGxpdGVyYWwKLQkJCQlJVGV4dFJlZ2lvbiBxdW90ZSA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOwotCQkJCWlmIChxdW90ZSA9PSBudWxsKSB7Ci0JCQkJCXF1b3RlID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7Ci0JCQkJfQotCQkJCWlmIChxdW90ZSAhPSBudWxsKSB7Ci0JCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHF1b3RlKSwgcXVvdGUuZ2V0TGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzZXRTeXN0ZW1JRCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZiB0ZXh0IGJldHdlZW4gZW5kIG9mIG5hbWUgcmVnaW9uIGFuZAotCQkJCS8vIHRoZSBsYXN0IGRvdWJsZSBxdW90ZWQgbGl0ZXJhbAotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIGtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQkJaWYgKGtleXdvcmQgPT0gbnVsbCkgewotCQkJCQkvLyByZXNldCB0aGUgaXRlcmF0b3IKLQkJCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCWtleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQkJCX0KLQkJCQlpZiAoa2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoa2V5d29yZCk7Ci0JCQkJCS8vIHN0YXJ0IHdpdGggYSBsZW5ndGgganVzdCBlcXVhbCB0byB0aGUga2V5d29yZCBmb3Igbm93Ci0JCQkJCWxlbmd0aCA9IGtleXdvcmQuZ2V0TGVuZ3RoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyByZXNldCB0aGUgaXRlcmF0b3Igc2luY2Ugd2UgZGlkbid0IGZpbmQgdGhlIGtleXdvcmQKLQkJCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCS8vIGp1c3QgZ28gZnJvbSBhZnRlciB0aGUgbmFtZQotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChnZXROYW1lUmVnaW9uKCkpOwotCQkJCX0KLQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIHN0YXJ0LCBsb29rIGZvciB0aGUgZW5kCi0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IG51bGw7Ci0KLQkJCQlpZiAobGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIHRoZW4gbG9vayBmb3IgbGFzdCBxdW90ZWQgbGl0ZXJhbAotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCUlUZXh0UmVnaW9uIGxpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJCWlmIChsaXRlcmFsICE9IG51bGwpIHsKLQkJCQkJCQlsYXN0UmVnaW9uID0gbGl0ZXJhbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGxhc3RSZWdpb24pIC0gc3RhcnRPZmZzZXQ7Ci0JCQkJfQotCQkJCXJlcGxhY2VUZXh0KHRoaXMsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsICJcIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmVORGF0YSh0aGlzKTsKLQkJCX0KLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uTmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmV3Tm90YXRpb24pIHsKLQkJaWYgKCFnZXROb3RhdGlvbk5hbWUoKS5lcXVhbHMobmV3Tm90YXRpb24pKSB7Ci0JCQlpZiAoIW5ld05vdGF0aW9uLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIAotCQkJCUlUZXh0UmVnaW9uIG5kYXRhUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSk7Ci0JCQkJaWYgKG5kYXRhUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChuZGF0YVJlZ2lvbiksIG5kYXRhUmVnaW9uLmdldExlbmd0aCgpLCBuZXdOb3RhdGlvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0aW1lIHRvIGNyZWF0ZSBvbmUKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQlJVGV4dFJlZ2lvbiBuZGF0YUtleXdvcmQgPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOwotCQkJCQlpZiAobmRhdGFLZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCS8vIHdlJ2xsIG5lZWQgdG8gY3JlYXRlIG9uZSBhZnRlciB0aGUgbGFzdCBxdW90ZWQKLQkJCQkJCS8vIGxpdGVyYWwKLQkJCQkJCS8vIFJlc2V0IGl0ZXJhdG9yCi0JCQkJCQlzdHJpbmcgKz0gIiBOREFUQSAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQkJCUlUZXh0UmVnaW9uIGxhc3RRdW90ZWRMaXRlcmFsID0gbnVsbDsKLQkJCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJCUlUZXh0UmVnaW9uIGxpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJCQlpZiAobGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJCQkJCWxhc3RRdW90ZWRMaXRlcmFsID0gbGl0ZXJhbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobGFzdFF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGxhc3RRdW90ZWRMaXRlcmFsKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNyZWF0ZWQgYWZ0ZXIgdGhlIHN5c3RlbSBvciBwdWJsaWMga2V5d29yZAotCQkJCQkJCUlUZXh0UmVnaW9uIGtleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJCQkJCWlmIChrZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCQkJa2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIHdlIHNob3VsZG4ndCBiZSBudWxsIGhlcmUgc2luY2Ugd2UgY2hlY2sgaWYgd2UKLQkJCQkJCQkvLyB3ZXJlIGV4dGVybmFsIGFscmVhZHkKLQkJCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChrZXl3b3JkKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmRhdGFLZXl3b3JkKTsKLQkJCQkJfQotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCAwLCBzdHJpbmcgKyBuZXdOb3RhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbmVlZCB0byByZW1vdmUgdGhlIG5kYXRhIHN0dWZmCi0JCQkJcmVtb3ZlTkRhdGEocmVxdWVzdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb3RhdGlvbgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIG5vdGF0aW9uTmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbk5hbWUoU3RyaW5nIG5ld05vdGF0aW9uKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsICJOREFUQSAiICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfTkRBVEFfQ0hBTkdFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNldE5vdGF0aW9uTmFtZSh0aGlzLCBuZXdOb3RhdGlvbik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gdikgewotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHkoKSAhPSB2KSB7Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCB2ID8gc2V0UGFyYW1ldGVyRW50aXR5IDogc2V0R2VuZXJhbEVudGl0eSk7Ci0JCQlpZiAodikgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKTsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwLCBsZW5ndGggPSAwOwotCi0JCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UgJiYgcmVnaW9uLmdldExlbmd0aCgpID4gMSkgewotCQkJCQkJbGVuZ3RoID0gMTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoc3RhcnRUYWcpOwotCQkJCX0KLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBzdGFydE9mZnNldCwgbGVuZ3RoLCAiICUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIG5vdyBnZXQgcmlkIG9mIGFueSBORGF0YSBzaW5jZSBpdCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlCi0JCQkJLy8gZW50aXR5IGlzIGEgZ2VuZXJhbCBlbnRpdHkgYW5kIG5vdCBhIHBhcmFtZXRlciBlbnRpdHkKLQkJCQlyZW1vdmVORGF0YSh0aGlzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGdldCByaWQgb2YgcGVyY2VudCByZWdpb24KLQkJCQlJVGV4dFJlZ2lvbiBwZXJjZW50UmVnaW9uID0gZ2V0UGVyY2VudFJlZ2lvbigpOwotCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHBlcmNlbnRSZWdpb24pLCBwZXJjZW50UmVnaW9uLmdldExlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQlpZiAoIWdldFZhbHVlKCkuZXF1YWxzKHYpKSB7Ci0JCQkJLy8gdGhlbiBpdCBtYWtlcyBzZW5zZSB0byBjaGFuZ2UgdGhlIHZhbHVlCi0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJCQlTdHJpbmcgcXVvdGVDaGFyID0gdi5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSwgdmFsdWVSZWdpb24uZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuTkFNRSk7Ci0JCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gY3JlYXRlIGl0IGFmdGVyIHRoZSBwZXJjZW50IGlmIHRoZXJlIGlzIG9uZQotCQkJCQkJcmVnaW9uID0gZ2V0UGVyY2VudFJlZ2lvbigpOwotCQkJCQl9Ci0JCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gaWYgc3RpbGwgbnVsbCwgdGhlbiBjcmVhdGUgaXQgYWZ0ZXIgdGhlIGVsZW1lbnQgdGFnCi0JCQkJCQlyZWdpb24gPSBnZXRTdGFydFRhZyhpdGVyYXRvcigpKTsKLQkJCQkJfQotCi0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIDAsIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1ZBTFVFX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VmFsdWUodGhpcywgdik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0V4dGVybmFsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNjZWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBiYXNlIGNsYXNzIGZvciBub2RlcyB0aGF0IGNhbiBjb250YWluIGV4dGVybmFsIGNvbnRlbnQKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlcm5hbE5vZGUgZXh0ZW5kcyBOYW1lZFRvcExldmVsTm9kZSB7Ci0KLQlTdHJpbmcgcHVibGljSUQ7Ci0KLQlTdHJpbmcgc3lzdGVtSUQ7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgU3RyaW5nIHRhZ1R5cGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIHRhZ1R5cGUpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROZXh0UXVvdGVkTGl0ZXJhbChSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpIHx8IHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBwdWJsaWNJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSUQoKSB7Ci0JCUlUZXh0UmVnaW9uIHB1YmxpY1ZhbHVlID0gZ2V0UHVibGljVmFsdWVSZWdpb24oKTsKLQkJaWYgKHB1YmxpY1ZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24ocHVibGljVmFsdWUpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuUFVCTElDX0tFWVdPUkQpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQdWJsaWNWYWx1ZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJSVRleHRSZWdpb24gcHVibGljS2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcik7Ci0KLQkJaWYgKHB1YmxpY0tleXdvcmQgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcXVvdGVkTGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJaWYgKHF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCXJldHVybiBxdW90ZWRMaXRlcmFsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3lzdGVtSUQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlEKCkgewotCQlJVGV4dFJlZ2lvbiBzeXN0ZW1WYWx1ZSA9IGdldFN5c3RlbVZhbHVlUmVnaW9uKCk7Ci0JCWlmIChzeXN0ZW1WYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKHN5c3RlbVZhbHVlKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXJldHVybiBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JEKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3lzdGVtVmFsdWVSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCUlUZXh0UmVnaW9uIHN5c3RlbUtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQlpZiAoc3lzdGVtS2V5d29yZCAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBxdW90ZWRMaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQlpZiAocXVvdGVkTGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHF1b3RlZExpdGVyYWw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0cnkgYW5kIHNlZSBpZiB0aGVyZSBpcyBhIHNlY29uZCBxdW90ZWQgbGl0ZXJhbCBhZnRlciBhIHB1YmxpYwotCQkJLy8ga2V5d29yZAotCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyKTsKLQotCQkJaWYgKHB1YmxpY0tleXdvcmQgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHF1b3RlZExpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQlpZiAocXVvdGVkTGl0ZXJhbCAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCS8vIG5vdyBnZXQgdGhlIHNlY29uZCBxdW90ZWQgbGl0ZXJhbAotCQkJCQlxdW90ZWRMaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQkJCWlmIChxdW90ZWRMaXRlcmFsICE9IG51bGwpIHsKLQkJCQkJCS8vIGdvdCBpdCEKLQkJCQkJCXJldHVybiBxdW90ZWRMaXRlcmFsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgdHlwZS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBwdWJsaWNJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHB1YmxpY0lELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lEKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghdi5lcXVhbHMocHVibGljSUQpKSB7Ci0JCQlwdWJsaWNJRCA9IHY7Ci0JCQlJVGV4dFJlZ2lvbiBwdWJsaWNWYWx1ZSA9IGdldFB1YmxpY1ZhbHVlUmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCUlUZXh0UmVnaW9uIHN5c3RlbUtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJSVRleHRSZWdpb24gc3lzdGVtVmFsdWUgPSBnZXRTeXN0ZW1WYWx1ZVJlZ2lvbigpOwotCi0JCQlpZiAodi5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocHVibGljS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCS8vIHRpbWUgdG8gZ2V0IHJpZCBvZiB0aGUgcHVibGljIGtleXdvcmQgYW5kIHZhbHVlCi0JCQkJCS8vIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHN5c3RlbSBvbmUKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHVibGljS2V5d29yZCk7Ci0JCQkJCVN0cmluZyBuZXdTdHJpbmcgPSAiU1lTVEVNIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoc3lzdGVtVmFsdWUgPT0gbnVsbCkgewotCQkJCQkJbmV3U3RyaW5nICs9ICIgXCJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocHVibGljVmFsdWUpIC0gc3RhcnRPZmZzZXQsIG5ld1N0cmluZyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaGVyZSB3ZXJlIHNldHRpbmcgYSBub24gZW1wdHkgdmFsdWUKLQkJCQlTdHJpbmcgcXVvdGVDaGFyID0gdi5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpZiAocHVibGljVmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHB1YmxpY1ZhbHVlKSwgcHVibGljVmFsdWUuZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHB1YmxpY0lEICsgcXVvdGVDaGFyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRpbWUgdG8gY3JlYXRlIHN0dWZmCi0JCQkJCWlmIChwdWJsaWNLZXl3b3JkICE9IG51bGwpIHsKLQkJCQkJCS8vIHRoZW4ganVzdCBwdXQgb3VyIG5ldyB2YWx1ZSBhZnRlciB0aGUga2V5d29yZAotCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocHVibGljS2V5d29yZCksIDAsICIgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyB3ZSBuZWVkIHRoZSBwdWJsaWMga2V5d29yZCBhcyB3ZWxsCi0JCQkJCQlpZiAoc3lzdGVtS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChzeXN0ZW1LZXl3b3JkKSwgc3lzdGVtS2V5d29yZC5nZXRMZW5ndGgoKSwgIlBVQkxJQyAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbiksIDAsICIgUFVCTElDICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gcHVibGljSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHYpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FWFRfTk9ERV9QVUJMSUNfSURfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRQdWJsaWNJRCh0aGlzLCB2KTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3lzdGVtSUQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzeXN0ZW1JRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JRChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgdikgewotCQlpZiAoIXYuZXF1YWxzKHN5c3RlbUlEKSB8fCAoZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSA9PSBudWxsICYmIGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSkgPT0gbnVsbCkpIHsKLQkJCXN5c3RlbUlEID0gdjsKLQkJCVN0cmluZyBxdW90ZUNoYXIgPSB2LmluZGV4T2YoIlwiIikgPT0gLTEgPyAiXCIiIDogIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJSVRleHRSZWdpb24gc3lzdGVtVmFsdWUgPSBnZXRTeXN0ZW1WYWx1ZVJlZ2lvbigpOwotCQkJaWYgKHN5c3RlbVZhbHVlICE9IG51bGwpIHsKLQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHN5c3RlbVZhbHVlKSwgc3lzdGVtVmFsdWUuZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHN5c3RlbUlEICsgcXVvdGVDaGFyKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlUZXh0UmVnaW9uIHN5c3RlbUtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCi0JCQkJLy8gdGltZSB0byBjcmVhdGUgc3R1ZmYKLQkJCQlpZiAoc3lzdGVtS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoZW4ganVzdCBwdXQgb3VyIG5ldyB2YWx1ZSBhZnRlciB0aGUga2V5d29yZAotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChzeXN0ZW1LZXl3b3JkKSwgMCwgIiAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHNlZSBpZiB3ZSBoYXZlIGEgcHVibGljIGtleXdvcmQKLQkJCQkJSVRleHRSZWdpb24gcHVibGljS2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQkJCWlmIChwdWJsaWNLZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0KLQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pLCAwLCAiIFNZU1RFTSAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHB1dCBpdCBhZnRlciB0aGUgcHVibGljIHZhbHVlIHJlZ2lvbgotCQkJCQkJSVRleHRSZWdpb24gcHVibGljVmFsdWVSZWdpb24gPSBnZXRQdWJsaWNWYWx1ZVJlZ2lvbigpOwotCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocHVibGljVmFsdWVSZWdpb24pLCAwLCAiICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN5c3RlbUlELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlEKFN0cmluZyB2KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRVhUX05PREVfU1lTVEVNX0lEX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0U3lzdGVtSUQodGhpcywgdik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4ZjQ4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05hbWVkVG9wTGV2ZWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05hbWVkVG9wTGV2ZWxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmN2Y1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9OYW1lZFRvcExldmVsTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gaW50ZXJmYWNlIGZvciBub2RlcyB0aGF0IGNhbiBleGlzdCBhdCB0aGUgdG9wIGxldmVsIGluIGEgZHRkZmlsZQotLy8gZWcuIGVudGl0eSwgbm90YXRpb24sIGVsZW1lbnQsIGNvbW1lbnQsIGF0dGxpc3QsIG9yIHVucmVjb2duaXplZCBzdHVmZiAoaWUKLS8vIDxqdW5rIGRrZmpkbD4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lZFRvcExldmVsTm9kZSBleHRlbmRzIFRvcExldmVsTm9kZSB7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWdTdGFydFR5cGU7Ci0KLQlwdWJsaWMgTmFtZWRUb3BMZXZlbE5vZGUoRFRERmlsZSBkdGRGaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSk7Ci0JCXRhZ1N0YXJ0VHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCS8vIG5hbWUgcmVnaW9uIGlzIGxvY2F0ZWQgYWZ0ZXIgdGhlIHdoaXRlc3BhY2UgKHdoaWNoIGlzIGFmdGVyCi0JCS8vIHRoZSBlbGVtZW50dGFnCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlnZXROZXh0UmVnaW9uKGl0ZXIsIHRhZ1N0YXJ0VHlwZSk7Ci0KLQkJaWYgKCFpdGVyLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJaWYgKCFyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQotCQkvLyB3ZSBub3JtYWxseSBzdG9wIGhlcmUsIGJ1dCBmb3IgZW50aXRpZXMsIHdlIGhhdmUgdG8gc2VlIGlmIHdlIGFyZQotCQkvLyBhdCBhICclJy4gaWYgc28sIHdlIHNraXAgdGhhdCBhbmQgZmluZCB0aGUgbmFtZSBhZnRlciB0aGUKLQkJLy8gd2hpdGVzcGFjZSBhZ2FpbgotCQlpZiAodGFnU3RhcnRUeXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcgJiYgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCkgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCi0JCQlpZiAoIXJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmICghaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN0YXJ0VGFnKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0V2hpdGVzcGFjZUFmdGVyTmFtZSgpIHsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCS8vIHNraXAgcGFzdCB0aGUgZWxlbWVudCB0YWcgcmVnaW9uCi0JCWdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQkJYm9vbGVhbiBmb3VuZE5hbWUgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmICghZm91bmROYW1lICYmIG5hbWVSZWdpb24gIT0gbnVsbCAmJiByZWdpb24gPT0gbmFtZVJlZ2lvbikgewotCQkJCWZvdW5kTmFtZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJCS8vIHRoZXJlIGlzIG5vIG5hbWUgcmVnaW9uIG9yIHdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgaXQKLQkJCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsIHx8IGZvdW5kTmFtZSkgewotCQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBuYW1lKSB7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCXN1cGVyLnNldE5hbWUocmVxdWVzdG9yLCBuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gZWxlbWVudFRhZ1JlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQkJCWludCByZXBsYWNlTGVuZ3RoID0gMDsKLQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJCQlpZiAocmVnaW9uLmdldExlbmd0aCgpID49IDIpIHsKLQkJCQkJCS8vIHRoZXJlIGFyZSAyIHNwYWNlcyBiZXR3ZWVuICdFTEVNRU5UJyBhbmQgdGhlCi0JCQkJCQkvLyBjb250ZW50Ci0JCQkJCQkvLyBDaGFuZ2UgcmVwbGFjZSBsZW5ndGggdG8gMSBzbyB0aGF0IHRoZSBuZXcgbmFtZSBhbmQKLQkJCQkJCS8vIHRoZSBjb250ZW50IGFyZSBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgc3BhY2UKLQkJCQkJCXJlcGxhY2VMZW5ndGggPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBiZWdpblJlY29yZGluZyhyZXF1ZXN0b3IsICJOYW1lIENoYW5nZSIpOwotCQkJU3RyaW5nIG5ld1RleHQgPSAiICIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChlbGVtZW50VGFnUmVnaW9uKSwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JCQkvLyBlbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ1YTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLQotCi1wdWJsaWMgY2xhc3MgTm9kZUxpc3QgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQlBcnJheUxpc3QgbGlzdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsaXN0VHlwZTsKLQotCXB1YmxpYyBOb2RlTGlzdChEVERGaWxlIGR0ZEZpbGUsIFN0cmluZyB0b2tlblR5cGUpIHsKLQkJbGlzdFR5cGUgPSB0b2tlblR5cGU7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9FTCk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRykgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX0VOVCk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfTk9UKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfQ09NTSk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9BVFRMSVNUKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9VTlJFQyk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaXN0VHlwZSgpIHsKLQkJcmV0dXJuIGxpc3RUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfRUxFTUVOVFM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfRU5USVRJRVM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9OT1RBVElPTlM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRykgewotCQkJcmV0dXJuIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfTk9ERV9MSVNUX0FUVFJJQlVURVM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9PVEhFUjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0Tm9kZXMoKSB7Ci0JCWxpc3ROb2Rlcy5jbGVhcigpOwotCQlJdGVyYXRvciBpdGVyID0gZHRkRmlsZS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHICYmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyAmJiBub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHICYmIG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHICYmIG5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUICYmIG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCAmJiBub2RlIGluc3RhbmNlb2YgVW5yZWNvZ25pemVkKSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdE5vZGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhYmQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgTm90YXRpb24gZXh0ZW5kcyBFeHRlcm5hbE5vZGUgewotCi0JcHVibGljIE5vdGF0aW9uKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuTk9UQVRJT05JQ09OKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMDUzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBleHRlbmRzIE5hbWVkVG9wTGV2ZWxOb2RlIHsKLQotCi0KLQlwdWJsaWMgY2xhc3MgU3RhcnRFbmRQYWlyIHsKLQkJcHVibGljIGludCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0OwotCX0KLQotCXByaXZhdGUgRW50aXR5IGNhY2hlZEVudGl0eSA9IG51bGw7Ci0KLQlwdWJsaWMgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHlPYmplY3QoKSB7Ci0JCWlmIChjYWNoZWRFbnRpdHkgIT0gbnVsbCAmJiAhY2FjaGVkRW50aXR5LmdldE5hbWUoKS5lcXVhbHMoZ2V0UmVmZXJlbmNlZEVudGl0eSgpKSkgewotCQkJLy8gaWYgd2UgaGF2ZSBhIGNhY2hlZCBlbnRpdHksIGJ1dCB0aGUgbmFtZSBkb2VzbnQgbWF0Y2gsCi0JCQkvLyBudWxsIGl0IG5vdywgc28gd2UgcGVyZm9ybSBhIGxvb2t1cAotCQkJY2FjaGVkRW50aXR5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChjYWNoZWRFbnRpdHkgPT0gbnVsbCkgewotCQkJTGlzdCBub2RlcyA9IGdldERUREZpbGUoKS5nZXROb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG5vZGU7Ci0JCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhnZXRSZWZlcmVuY2VkRW50aXR5KCkpKSB7Ci0JCQkJCQljYWNoZWRFbnRpdHkgPSBlbnRpdHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZEVudGl0eTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRU5USVRZUkVGRVJFTkNFSUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXROYW1lKCk7Ci0JCXJldHVybiBnZXROYW1lKCkuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KFN0YXJ0RW5kUGFpciBwYWlyKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50U3RhcnRUYWcgPSBnZXRTdGFydFRhZyhpdGVyKTsKLQkJSVRleHRSZWdpb24gZW5kQ29tbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoY29tbWVudFN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoY29tbWVudFN0YXJ0VGFnKTsKLQkJfQotCQlpZiAoZW5kQ29tbWVudFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChlbmRDb21tZW50VGFnKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0JCWludCBmbGF0Tm9kZVN0YXJ0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJU3RhcnRFbmRQYWlyIHBhaXIgPSBuZXcgU3RhcnRFbmRQYWlyKCk7Ci0JCWdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChwYWlyKTsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHBhaXIuc3RhcnRPZmZzZXQgLSBmbGF0Tm9kZVN0YXJ0LCBwYWlyLmVuZE9mZnNldCAtIGZsYXROb2RlU3RhcnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbnRpdHkoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRMZW5ndGgoKSwgIiUiICsgbmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ0hHX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCXNldFJlZmVyZW5jZWRFbnRpdHkodGhpcywgbmFtZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXBsYWNlVGV4dCh0aGlzLCBwYWlyLnN0YXJ0T2Zmc2V0LCBwYWlyLmVuZE9mZnNldCAtIHBhaXIuc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1RvcExldmVsTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ub3BMZXZlbE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjMjdjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1RvcExldmVsTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBpbnRlcmZhY2UgZm9yIG5vZGVzIHRoYXQgY2FuIGV4aXN0IGF0IHRoZSB0b3AgbGV2ZWwgaW4gYSBkdGRmaWxlCi0vLyBlZy4gZW50aXR5LCBub3RhdGlvbiwgZWxlbWVudCwgY29tbWVudCwgYXR0bGlzdCwgb3IgdW5yZWNvZ25pemVkIHN0dWZmIChpZQotLy8gPGp1bmsgZGtmamRsPgotcHVibGljIGFic3RyYWN0IGNsYXNzIFRvcExldmVsTm9kZSBleHRlbmRzIERURE5vZGUgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZmxhdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFRvcExldmVsTm9kZShEVERGaWxlIGR0ZEZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZHRkRmlsZSwgZmxhdE5vZGUpOwotCQlmbGF0Tm9kZXMuYWRkKGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRXaGl0ZXNwYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlmbGF0Tm9kZXMuYWRkKG5vZGUpOwotCX0KLQotCS8vIHNwZWNpYWxpemUgdGhpcyBzbyB3ZSBkZWxldGUgdGhlIG9iamVjdHMgZmxhdCBub2RlIHJhbmdlCi0JLy8gQU5EIGFueSB3aGl0ZXNwYWNlCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgewotCQliZWdpblJlY29yZGluZyhnZXREVERGaWxlKCksIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfVE9QX0xFVkVMX05PREVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGZsYXROb2Rlcy5nZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBmbGF0Tm9kZXMuZ2V0KGZsYXROb2Rlcy5zaXplKCkgLSAxKTsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZE9mZnNldCA9IGxhc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJcmVwbGFjZVRleHQoZ2V0RFRERmlsZSgpLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQllbmRSZWNvcmRpbmcoZ2V0RFRERmlsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RW5kUmVnaW9uKCkgewotCQlpbnQgc2l6ZSA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWlmIChzaXplID4gMCkgewotCQkJcmV0dXJuIGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoc2l6ZSAtIDEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIGluY2x1ZGVzIHdoYXQgZ2V0dGV4dCBnaXZlcyB1cyBwbHVzIGFueSB3aGl0ZXNwYWNlCi0JLy8gdHJhaWxpbmcgaXQKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBmbGF0Tm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZOb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGl0ZXIubmV4dCgpOwotCQkJc2IuYXBwZW5kKGZOb2RlLmdldFRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN0YXJ0UmVnaW9uKCkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+IDApIHsKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUgcmVnaW9uIGl0ZXIgIiArIHRoaXMuZ2V0Q2xhc3MoKSArICIgd2l0aAotCQkvLyBzdGFydCAsIGVuZCA9ICIgKyBnZXRTdGFydE9mZnNldCgpICsgIiwgIiArZ2V0RW5kT2Zmc2V0KCkpOwotCQlyZXR1cm4gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBnZXRTdGFydE9mZnNldCgpLCBnZXRFbmRPZmZzZXQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9VbnJlY29nbml6ZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvVW5yZWNvZ25pemVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzQ4YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9VbnJlY29nbml6ZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgVW5yZWNvZ25pemVkIGV4dGVuZHMgVG9wTGV2ZWxOb2RlIHsKLQotCXB1YmxpYyBVbnJlY29nbml6ZWQoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuVU5SRUNPR05JWkVESUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPD0gMzApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIDI5KSArICIuLi4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnQvQ29udGVudERlc2NyaWJlckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGYxMTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9yRFREIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkvLyBjdXJyZW50bHkgbm8gc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkaWx0eQotCQkvLyBiYXNlZCBvbiBjb250ZW50cy4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KFJlYWRlciByZWFkZXIpIHsKLQkJLy8gY3VycmVudGx5IG5vIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZGlsdHkKLQkJLy8gYmFzZWQgb24gY29udGVudHMuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCS8vIHNhbWUgcnVsZXMgYXMgZm9yIFhNTAotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQkJcmV0dXJuIG5ldyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGU6IGlmIHdlJ3JlIGFza2VkIGZvciBvbmUsIHdlIHNldCB0aGVtIGFsbC4gSSBuZWVkIHRvIGJlIHN1cmUgaWYKLQkJLy8gY2FsbGVkCi0JCS8vIG11bGl0aXBsZSB0aW1lcyAob25lIGZvciBlYWNoLCBzYXkpIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQotCQkvLyBwcm9jZXNzaW5nIHNhbWUKLQkJLy8gY29udGVudCBhZ2Fpbi4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZgotCQkJLy8gaW52YWxpZAotCQkJLy8gaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkvLyAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gZGVmYXVsdC50aGUKLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBnZXREZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCS8vIHNpbmNlIGVxdWFsLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCwgYnV0IGlmIG91ciBkZXRlY3RlZCB2ZXJzaW9uIGlzCi0JCS8vIGRpZmZlcmVudCB0aGFuCi0JCS8vIGphdmFDaGFyc2V0LCB0aGVuIHdlIHNob3VsZCBhZGQgaXQuIFRoaXMgd2lsbCBoYXBwZW4sIGZvciBleGFtcGxlLAotCQkvLyBpZiB0aGVyZSdzCi0JCS8vIGRpZmZlcmVuY2VzIGluIGNhc2UsIG9yIGRpZmZlcmVuY2VzIGR1ZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzCi0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gaWYgKCFkZXRlY3RlZENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJLy8gZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsCi0JCQkvLyBkZXRlY3RlZENoYXJzZXQpOwotCQkJLy8gfQotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9EVERNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRFRETW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzMyOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9EVERNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50LklEVERGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50Lk5vZGVzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LkRURE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURFJlZmVyZW5jZVVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuTGFiZWxWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0U3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERNb2RlbEltcGwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciwgRFRETW9kZWwgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJLy8gY3JlYXRlIHRoZSB0ZW1wIEZpbGUgb2JqZWN0Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQlyZXN1bHQgPSBmaWxlLmRlbGV0ZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgRFRERmlsZSBkb2N1bWVudDsKLQotCS8vIHByaXZhdGUgTGlzdCBlcnJvck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gZW50aXR5IHJlZmVyZW5jZSBuYW1lcyBmb3VuZCBpbiB0aGUgY29uZGl0aW9uYWwgSUdOT1JFIHNlY3Rpb25zCi0JcHJpdmF0ZSBWZWN0b3IgaWdub3JlZEVudGl0eVJlZnM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgRFREUmVmZXJlbmNlVXBkYXRlciByZWZVcGRhdGVyID0gbmV3IERURFJlZmVyZW5jZVVwZGF0ZXIoKTsKLQotCXB1YmxpYyBEVERNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWRvY3VtZW50ID0gbmV3IERUREZpbGUodGhpcyk7Ci0JCWRvY3VtZW50LmFkZERUREZpbGVMaXN0ZW5lcihuZXcgSURUREZpbGVMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKSB7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG5vZGU7Ci0JCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCQkvLyBqdXN0IHNheSB0aGV5IGhhdmUgY2hhbmdlZCBmb3Igbm93Ci0JCQkJCQlzZXRSZWZlcmVuY2VkTW9kZWxzQ2hhbmdlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJCQljaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCQkJY2hlY2tJZkV4dGVybmFsUmVmZXJlbmNlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCk7Ci0JCS8vIGNsZWFyIHJlZmVyZW5jZSB1cGRhdGVyIGNhY2hlCi0JCWdldFJlZmVyZW5jZVVwZGF0ZXIoKS5jbGVhckNhY2hlKCk7Ci0JfQotCi0Jdm9pZCBjaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBldmVudC5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbm9kZTsKLQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgZW50aXR5LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCQkvLyBqdXN0IHNheSB0aGV5IGhhdmUgY2hhbmdlZCBmb3Igbm93Ci0JCQkJCXNldFJlZmVyZW5jZWRNb2RlbHNDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8KLQkvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGhlbHBzIGRldGVybWluZSB0aGUgbGlzdCBvZiB0aGluZ3MgdGhhdAotCS8vIGNhbiBiZSB1c2VkIGluIGEgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UgY29udGVudAotCS8vIE9wdGlvbmFsIHBhcmFtZXRlciBpcyB0byBhbGxvdyB0aGUgY3VycmVudGx5IHVzZWQgRFRERW50aXR5IHRvCi0JLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbWJvYm94LgotCS8vCi0JcHVibGljIExhYmVsVmFsdWVQYWlyW10gY3JlYXRlUGFybUVudGl0eUNvbnRlbnRJdGVtcyhFbnRpdHkgZW50aXR5KSB7Ci0JCU5vZGVMaXN0IGVudGl0aWVzID0gZ2V0RFRERmlsZSgpLmdldEVudGl0aWVzKCk7Ci0KLQkJVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotCi0JCWlmIChlbnRpdHkgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSAiJSIgKyBlbnRpdHkuZ2V0TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWl0ZW1zLmFkZEVsZW1lbnQobmV3IExhYmVsVmFsdWVQYWlyKG5hbWUsIG5hbWUpKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IGVudGl0aWVzLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlFbnRpdHkgZW50aXR5QXQgPSAoRW50aXR5KSBpLm5leHQoKTsKLQkJCWlmIChlbnRpdHlBdC5pc1BhcmFtZXRlckVudGl0eSgpICYmIGVudGl0eUF0LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCVN0cmluZyBuYW1lID0gIiUiICsgZW50aXR5QXQuZ2V0TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpdGVtcy5hZGRFbGVtZW50KG5ldyBMYWJlbFZhbHVlUGFpcihuYW1lLCBuYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJTGFiZWxWYWx1ZVBhaXJbXSBjb21ib0FycmF5ID0gbmV3IExhYmVsVmFsdWVQYWlyW2l0ZW1zLnNpemUoKV07Ci0JCWl0ZW1zLmNvcHlJbnRvKGNvbWJvQXJyYXkpOwotCQlyZXR1cm4gY29tYm9BcnJheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQlzdXBlci5lbmRSZWNvcmRpbmcocmVxdWVzdGVyKTsKLQkJLy8gY2xlYXIgcmVmZXJlbmNlIHVwZGF0ZXIgY2FjaGUKLQkJZ2V0UmVmZXJlbmNlVXBkYXRlcigpLmNsZWFyQ2FjaGUoKTsKLQl9Ci0KLQotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvLyBSZXR1cm5zIGVudGl0eSByZWZlcmVuY2UgbmFtZXMgdGhhdCBhcmUgaW4KLQkvLyB0aGUgY29uZGl0aW9uYWwgSUdOT1JFIHNlY3Rpb25zLgotCXB1YmxpYyBWZWN0b3IgZ2V0SWdub3JlZEVudGl0eVJlZnMoKSB7Ci0JCWlmIChpZ25vcmVkRW50aXR5UmVmcyA9PSBudWxsKQotCQkJaWdub3JlZEVudGl0eVJlZnMgPSBuZXcgVmVjdG9yKCk7Ci0JCXJldHVybiBpZ25vcmVkRW50aXR5UmVmczsKLQl9Ci0KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGUgYXQgIiArIG9mZnNldCArICIgcmV0dXJuaW5nID0gIiArCi0JCS8vIHRoaXMuZG9jdW1lbnQuZ2V0Tm9kZUF0KG9mZnNldCkpOwotCi0JCXJldHVybiB0aGlzLmRvY3VtZW50LmdldE5vZGVBdChvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBEVERSZWZlcmVuY2VVcGRhdGVyIGdldFJlZmVyZW5jZVVwZGF0ZXIoKSB7Ci0JCXJldHVybiByZWZVcGRhdGVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlZE1vZGVsc0NoYW5nZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBmbGF0TW9kZWxFdmVudCkgewotCQlkb2N1bWVudC5uZXdNb2RlbChmbGF0TW9kZWxFdmVudCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5uZXdtb2RlbCIpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbm5vY2hhbmdlIik7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5ub2Rlc3JlcGxhY2VkIik7Ci0JCWRvY3VtZW50Lm5vZGVzUmVwbGFjZWQoZmxhdE1vZGVsRXZlbnQpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCi0JfQotCi0JcHVibGljIHZvaWQgb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50IHNvdXJjZSA9ICciICsKLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0VGV4dCgpICsgIiciKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJuZXcgU3RyaW5nID0gJyIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRPcmlnaW5hbENoYW5nZXMoKSArIiciKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGVkIFN0cmluZyA9ICciICsKLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0RGVsZXRlZFRleHQoKSArIiciKTsKLQkJLy8gRW51bWVyYXRpb24gZSA9Ci0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldE5vZGVzKCkuZWxlbWVudHMoKTsKLQkJLy8gaW50IGkgPSAwOwotCQkvLyBmb3IgKDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotCQkvLyB7Ci0JCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPQotCQkvLyAoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJLy8gb3V0cHV0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5vZGUpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiAiICsgaSArIi4gIiArIG5vZGUuaGFzaENvZGUoKSArICIgJyIKLQkJLy8gK25vZGUuZ2V0VGV4dCgpICsgIiciKTsKLQkJLy8gfQotCX0KLQotCXB1YmxpYyB2b2lkIG91dHB1dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCS8vIGludCBzaXplID0gZmxhdE5vZGUuZ2V0TnVtYmVyT2ZSZWdpb25zKCk7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkvLyB7Ci0JCS8vIFJlZ2lvbiByZWdpb24gPSAoUmVnaW9uKSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oaSArICIuICIgKyByZWdpb24uZ2V0VHlwZSgpKTsKLQotCQkvLyB9IC8vIGVuZCBvZiBmb3IgKCkKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5yZWdpb24gY2hhbmdlZCIpOwotCQlkb2N1bWVudC5yZWdpb25DaGFuZ2VkKGZsYXRNb2RlbEV2ZW50KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI9ICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlZ2lvbiBjaGFuZ2VkICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRSZWdpb24oKS5oYXNoQ29kZSgpICsgIiA9ICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRSZWdpb24oKSk7Ci0KLQkJb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KGZsYXRNb2RlbEV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbnJlZ2lvbiByZXBsYWNlZCIpOwotCQlkb2N1bWVudC5yZWdpb25zUmVwbGFjZWQoZmxhdE1vZGVsRXZlbnQpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRNb2RlbHNDaGFuZ2VkKCkgewotCQlyZWZyZXNoUmVxdWlyZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hSZXF1aXJlZChib29sZWFuIHZhbHVlKSB7Ci0JCXJlZnJlc2hSZXF1aXJlZCA9IHZhbHVlOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1N0cnVjdHVyZWREb2N1bWVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IHN1cGVyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXJldHVybjsgLy8gbm90aW5nIHRvIGRvCi0KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJb2xkU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQluZXdNb2RlbChuZXcgTmV3RG9jdW1lbnRFdmVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoaXMpKTsKLQkJCX0KLQkJCW5ld1N0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzQ5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCi0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQkvLyB0byBlbnN1cmUgY29uc2lzdCBvdmVyYWxsIHJ1bGVzIHVzZWQsIHdlJ2xsIG1hcmsgYXMKLQkvLyBmaW5hbCwKLQkvLyBhbmQgcmVxdWlyZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgY2VydGFpbiBwaWVjZXMgb2YKLQkvLyB0aGUKLQkvLyBpbXBsZW1lbnRhdGlvbgotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdG8gcmV0dXJuIGEgZGVmYXVsdCBlbmNvZGluZyAtLSBhcyBzcGVjaWZpZWQgYnkgYW4gaW5kdXN0cnkKLQkgKiBjb250ZW50IHR5cGUgc3BlYyAtLSB3aGVuIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIGZvciBleGFtcGxlLCBYTUwKLQkgKiBzcGVjaWZpZXMgVVRGLTgsIEpTUCBzcGVjaWZpZXMgSVNPLTg4NTktMS4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgotCSAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCAic3BlYyBkZWZhdWx0Ii4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YzliZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBub3QgbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTJiNWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gMjgtQXVnLTAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLQotCi0vKioKLSAqIEBhdXRob3Iga2JvbwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQkJZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yLnNldChmUmVhZGVyKTsKLQkJZkVuY29kaW5nTWVtZW50byA9ICgoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKWRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OGYwOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIERURERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgRFRERG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IERURFJlZ2lvblBhcnNlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZGVsaW1pdGVyID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCk7Ci0JCWlmIChkZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWRlbGltaXRlciA9IHN1cGVyLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoZmlsZSk7Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQlEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciByZVBhcnNlciA9IG5ldyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCQlyZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnNldFJlUGFyc2VyKHJlUGFyc2VyKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNjAzNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gRW5jb2RpbmdNZW1lbnRvIChpdHMgc3VwZXIgY2xhc3MpLAotICogd2hlbiB0aGVyZSBpcyBub3QgaW4gZmFjdCBBTlkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB3aGVuIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBTdHJpbmcKLSAqLwotcHVibGljIGNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2V2ZW50L0lEVERGaWxlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvSURUREZpbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDkwOTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvSURUREZpbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEVERGaWxlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKTsKLQotCXB1YmxpYyB2b2lkIG5vZGVzQWRkZWQoTm9kZXNFdmVudCBldmVudCk7Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlbW92ZWQoTm9kZXNFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2V2ZW50L05vZGVzRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvTm9kZXNFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzk3MmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvTm9kZXNFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgTm9kZXNFdmVudCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgY2hhbmdlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHZvaWQgYWRkKERURE5vZGUgY2hhbmdlZE5vZGUpIHsKLQkJY2hhbmdlZE5vZGVzLmFkZChjaGFuZ2VkTm9kZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBjaGFuZ2VkTm9kZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9EVERNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRFRETW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1MWFjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9EVERNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5EVEREb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRETW9kZWxMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsTG9hZGVyIHsKLQlwdWJsaWMgRFRETW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBEVEREb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRFRETW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ldyBEVERNb2RlbEltcGwoKTsKLQkJLy8gbm93IGRvbmUgaW4gY3JlYXRlCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCS8vIG1vZGVsLnNldEZhY3RvcnlSZWdpc3RyeShkZWZhdWx0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwZTEwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nLkRURERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5EVEREb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNb2RlbEhhbmRsZXJGb3JEVEQgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJZCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJZCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBEVEREb2N1bWVudExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgRFRETW9kZWxMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5Y2I4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIERURFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSVRleHRSZWdpb24gY3JlYXRlUmVnaW9uKFN0cmluZyB0b2tlbktpbmQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpZiAodG9rZW5LaW5kICE9IG51bGwpIHsKLQkJCS8vIElTU1VFOiBEVEQgcmVnaW9ucyBkb24ndCBkaXN0aW5ndWlzaCB0ZXh0IGZyb20gd2hpdGUgc3BhY2UKLQkJCXJlZ2lvbiA9IG5ldyBDb250ZXh0UmVnaW9uKHRva2VuS2luZCwgc3RhcnQsIGxlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlNmYxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXIuRFREVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXIuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIERURFJlZ2lvblBhcnNlciBpbXBsZW1lbnRzIFJlZ2lvblBhcnNlciB7Ci0JcHJpdmF0ZSBWZWN0b3IgY2FjaGVkUmVnaW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBEVERUb2tlbml6ZXIgdG9rZW5pemVyID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY2FjaGVkTm9kZSA9IG51bGw7IC8vIHRvcCBvZiBub2RlCi0JCQkJCQkJCQkJCQkJCQkvLyBjaGFpbgotCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBEVERSZWdpb25QYXJzZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWRkTmV3Tm9kZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSwgVmVjdG9yIHJlZ2lvbnMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsZWFkaW5nU3BhY2VOb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50Tm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdHJhaWxpbmdTcGFjZU5vZGUgPSBudWxsOwotCQlMaW5rZWRMaXN0IG5vZGVTZWVkcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWludCBuUmVnaW9ucyA9IHJlZ2lvbnMuc2l6ZSgpOwotCQlpbnQgbGVhZGluZ1NwYWNlRW5kID0gLTE7Ci0JCWludCB0cmFpbGluZ1NwYWNlQmVnaW4gPSBuUmVnaW9uczsKLQotCQkvLyBmaW5kIGxlYWRpbmcgc3BhY2UKLQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgblJlZ2lvbnM7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc0JsYW5rUmVnaW9uKHR5cGUpKSB7Ci0JCQkJbGVhZGluZ1NwYWNlRW5kID0gaTsKLQkJCQlub2RlU2VlZHMuYWRkTGFzdChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpKSB7Ci0JCQlsZWFkaW5nU3BhY2VOb2RlID0gY3JlYXRlTm9kZShub2RlU2VlZHMpOwotCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQlsYXN0Tm9kZS5zZXROZXh0KGxlYWRpbmdTcGFjZU5vZGUpOwotCQkJCWxlYWRpbmdTcGFjZU5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJfQotCQkJbGFzdE5vZGUgPSBsZWFkaW5nU3BhY2VOb2RlOwotCQl9Ci0KLQkJLy8gZmluZCB0cmFpbGluZyBzcGFjZQotCQlpZiAobGVhZGluZ1NwYWNlRW5kIDwgblJlZ2lvbnMgLSAxKSB7Ci0JCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJCWZvciAoaW50IGkgPSBuUmVnaW9ucyAtIDE7IDAgPD0gaTsgaS0tKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKTsKLQkJCQlTdHJpbmcgdHlwZSA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0KGkpKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKGlzQmxhbmtSZWdpb24odHlwZSkpIHsKLQkJCQkJdHJhaWxpbmdTcGFjZUJlZ2luID0gaTsKLQkJCQkJbm9kZVNlZWRzLmFkZEZpcnN0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCQl0cmFpbGluZ1NwYWNlTm9kZSA9IGNyZWF0ZU5vZGUobm9kZVNlZWRzKTsKLQkJCX0KLQotCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQlmb3IgKGludCBpID0gbGVhZGluZ1NwYWNlRW5kICsgMTsgaSA8IHRyYWlsaW5nU3BhY2VCZWdpbjsgaSsrKSB7Ci0JCQkJbm9kZVNlZWRzLmFkZExhc3QocmVnaW9ucy5nZXQoaSkpOwotCQkJfQotCQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpKSB7Ci0JCQkJY29udGVudE5vZGUgPSBjcmVhdGVOb2RlKG5vZGVTZWVkcyk7Ci0JCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjb250ZW50Tm9kZSk7Ci0JCQkJCWNvbnRlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQl9Ci0JCQkJbGFzdE5vZGUgPSBjb250ZW50Tm9kZTsKLQkJCX0KLQkJCWlmICh0cmFpbGluZ1NwYWNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJbGFzdE5vZGUuc2V0TmV4dCh0cmFpbGluZ1NwYWNlTm9kZSk7Ci0JCQkJdHJhaWxpbmdTcGFjZU5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCWxhc3ROb2RlID0gdHJhaWxpbmdTcGFjZU5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGFzdE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZU5vZGUoTGlua2VkTGlzdCByZWdpb25zKSB7Ci0JCWlmIChyZWdpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IERURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKERURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuRFREX0dFTkVSSUMpOwotCQlpbnQgc3RhcnQgPSAoKElUZXh0UmVnaW9uKSByZWdpb25zLmdldEZpcnN0KCkpLmdldFN0YXJ0KCk7Ci0JCWludCBsZW5ndGggPSAoKElUZXh0UmVnaW9uKSByZWdpb25zLmdldExhc3QoKSkuZ2V0RW5kKCkgLSBzdGFydDsKLQkJbm9kZS5zZXRTdGFydChzdGFydCk7Ci0JCW5vZGUuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yIGkgPSByZWdpb25zLmxpc3RJdGVyYXRvcigwKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJbm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtc3RhcnQpOwotCQl9Ci0JCW5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZU5vZGVDaGFpbihMaXN0IHJlZ2lvbnMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBudWxsOwotCQlWZWN0b3Igbm9kZVNlZWRzID0gbmV3IFZlY3RvcigpOwotCi0JCWZvciAoSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsgZS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gSWYgdGhlIGZvbGxvd2luZyByZWdpb25zIGFwcGVhciwKLQkJCS8vIGEgcHJldmlvdXMgbm9kZSBpcyBjbG9zZWQgaW4gZnJvbnQgb2YgaXQuCi0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkgJiYgaXNCZWdpbm5pbmdSZWdpb24odHlwZSkpIHsKLQkJCQlsYXN0Tm9kZSA9IGFkZE5ld05vZGVzKGxhc3ROb2RlLCBub2RlU2VlZHMpOwotCQkJCW5vZGVTZWVkcy5jbGVhcigpOwotCQkJfQotCQkJbm9kZVNlZWRzLmFkZEVsZW1lbnQocmVnaW9uKTsKLQotCQkJLy8gVGhlIGZvbGxvd2luZyByZWdpb25zIGNsb3NlIHRoZSBjdXJyZW50IG5vZGUuCi0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkgJiYgaXNFbmRpbmdSZWdpb24odHlwZSkpIHsKLQkJCQlsYXN0Tm9kZSA9IGFkZE5ld05vZGVzKGxhc3ROb2RlLCBub2RlU2VlZHMpOwotCQkJCW5vZGVTZWVkcy5jbGVhcigpOwotCQkJfQotCi0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBmaW5kRmlyc3ROb2RlKGxhc3ROb2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNsb3NlIGN1cnJlbnQgbm9kZSBmb3JjaWJseS4KLQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpKSB7Ci0JCQlsYXN0Tm9kZSA9IGFkZE5ld05vZGVzKGxhc3ROb2RlLCBub2RlU2VlZHMpOwotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgbGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gZmluZEZpcnN0Tm9kZShsYXN0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kRmlyc3ROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IG5vZGU7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBudWxsOwotCQl3aGlsZSAoKHByZXZOb2RlID0gZmlyc3ROb2RlLmdldFByZXZpb3VzKCkpICE9IG51bGwpIHsKLQkJCWZpcnN0Tm9kZSA9IHByZXZOb2RlOwotCQl9Ci0JCXJldHVybiBmaXJzdE5vZGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb25zKCkgewotCQlpZiAoY2FjaGVkTm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2FjaGVkTm9kZTsKLQkJfQotCi0JCUxpc3QgcmVnaW9ucyA9IGdldFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IGNyZWF0ZU5vZGVDaGFpbihyZWdpb25zKTsKLQkJY2FjaGVkTm9kZSA9IGhlYWROb2RlOwotCi0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRSZWdpb25zKCkgewotCQlpZiAoY2FjaGVkUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2FjaGVkUmVnaW9uczsKLQkJfQotCi0JCVZlY3RvciByZWdpb25zID0gbmV3IFZlY3RvcigpOwotCQlUb2tlbiBjdXJyZW50VG9rZW4gPSBudWxsOwotCQlkbyB7Ci0JCQl0cnkgewotCQkJCWN1cnJlbnRUb2tlbiA9IChUb2tlbikgdG9rZW5pemVyLnl5bGV4KCk7Ci0JCQkJaWYgKGN1cnJlbnRUb2tlbiAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IERURFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGN1cnJlbnRUb2tlbi5nZXRUeXBlKCksIGN1cnJlbnRUb2tlbi5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50VG9rZW4uZ2V0TGVuZ3RoKCkpOwotCQkJCQlyZWdpb25zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXdoaWxlIChjdXJyZW50VG9rZW4gIT0gbnVsbCk7Ci0KLQkJY2FjaGVkUmVnaW9ucyA9IHJlZ2lvbnM7Ci0JCXJldHVybiByZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJaWYgKHRva2VuaXplciA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRva2VuaXplciA9IG5ldyBEVERUb2tlbml6ZXIocmVhZGVyKTsKLQkJCX0KLQkJCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIERURFRva2VuaXplciA8aW5wdXRmaWxlPiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCXRva2VuaXplci55eXJlc2V0KHJlYWRlcik7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJY2FjaGVkTm9kZSA9IG51bGw7Ci0JCWNhY2hlZFJlZ2lvbnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgb2Zmc2V0IGZvciB1c2Ugd2l0aCBhbnkgcG9zaXRpb24tZGVwZW5kYW50IHBhcnNpbmcgcnVsZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJlc2V0KHJlYWRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0KSB7Ci0JCXJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQsIGludCBvZmZzZXQpIHsKLQkJcmVzZXQoaW5wdXQpOwotCX0KLQotCS8vIG5ldmVyIHVzZWQKLQlEVERUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlyZXR1cm4gdG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0JlZ2lubmluZ1JlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHKSB8fCAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQmxhbmtSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VuZGluZ1JlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5EX1RBRykgfHwgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pIHx8ICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0YjY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVnaW9uVHlwZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJlZ2lvblByZWZpeCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5wYXJzZXIuRFREUmVnaW9uVHlwZXMuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9IHJlZ2lvblByZWZpeCArICJOQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBRyA9IHJlZ2lvblByZWZpeCArICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTkRfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfUEFSRU4gPSByZWdpb25QcmVmaXggKyAiTEVGVF9QQVJFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSUdIVF9QQVJFTiA9IHJlZ2lvblByZWZpeCArICJSSUdIVF9QQVJFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVNQQUNFID0gcmVnaW9uUHJlZml4ICsgIldISVRFU1BBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SID0gcmVnaW9uUHJlZml4ICsgIkNPTk5FQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9DQ1VSX1RZUEUgPSByZWdpb25QcmVmaXggKyAiT0NDVVJfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMQU1BVElPTiA9IHJlZ2lvblByZWZpeCArICJFWENMQU1BVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJDRU5UID0gcmVnaW9uUHJlZml4ICsgIlBFUkNFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VNSUNPTE9OID0gcmVnaW9uUHJlZml4ICsgIlNFTUlDT0xPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX1NUQVJUID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlRfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VORCA9IHJlZ2lvblByZWZpeCArICJDT01NRU5UX0VORCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1RBRyA9IHJlZ2lvblByZWZpeCArICJOT1RBVElPTl9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fQ09OVEVOVCA9IHJlZ2lvblByZWZpeCArICJOT1RBVElPTl9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTlRJVFlfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9QQVJNID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9QQVJNIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVRBX1ZBTFVFID0gcmVnaW9uUHJlZml4ICsgIk5EQVRBX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUcgPSByZWdpb25QcmVmaXggKyAiRUxFTUVOVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkVMRU1FTlRfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0VNUFRZID0gcmVnaW9uUHJlZml4ICsgIkNPTlRFTlRfRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BTlkgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9BTlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQ0RBVEEgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9QQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRMSVNUX1RBRyA9IHJlZ2lvblByZWZpeCArICJBVFRMSVNUX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlNZU1RFTV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlBVQkxJQ19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVRBX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTkRBVEFfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVRVU9URURfTElURVJBTCA9IHJlZ2lvblByZWZpeCArICJTSU5HTEVRVU9URURfTElURVJBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVRVU9URURfTElURVJBTCA9IHJlZ2lvblByZWZpeCArICJET1VCTEVRVU9URURfTElURVJBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiVU5LTk9XTl9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSByZWdpb25QcmVmaXggKyAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBhdHRyaWJ1dGUgdHlwZSBrZXl3b3JkcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiQ0RBVEFfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJJRFJFRl9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGU19LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEUkVGU19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiRU5USVRJRVNfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk1UT0tFTl9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk1UT0tFTlNfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIk5PVEFUSU9OX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTV9DSE9JQ0UgPSByZWdpb25QcmVmaXggKyAiRU5VTV9DSE9JQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9FTlRJVFlfVFlQRSA9IHJlZ2lvblByZWZpeCArICJQQVJNX0VOVElUWV9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gYXR0cmlidXRlIGRlZmF1bHRzIGtleXdvcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJSRVFVSVJFRF9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJJTVBMSUVEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklYRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJGSVhFRF9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotfS8vIERURFJlZ2lvblR5cGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ZiNjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBEVEQgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gdGhpcyBjb3VsZCBiZSBtYWRlIHNtYXJ0ZXIgYnkgYWN0dWFsbHkgbG9va2luZyB1cCB0aGUgY29udGVudAotCQkvLyB0eXBlJ3MgdmFsaWQgZXh0ZW5zaW9ucwotCQlub2RlLnB1dChEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiZHRkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ4ZTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgRFREIGNvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIERURENvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBOZXcgRmlsZQotCSAqIFdpemFyZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gImRlZmF1bHRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc1OGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZlbmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcnJpbmcgdG8gdGhlIERURCBjb250ZW50VHlwZSBJRC4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudFR5cGVJZEZvckRURCB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBDb250ZW50VHlwZUlEX0RURCBpZCBmaWVsZCB3aWxsIG1hdGNoIHdoYXQgaXMKLQkgKiBzcGVjaWZpZWQgaW4gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwgZm9yIHRoZSBEVEQgY29udGVudAotCSAqIHR5cGUuCi0JICogCi0JICogVGhpcyB2YWx1ZSBpcyBpbnRlbnRpb25hbGx5IHNldCB0aHJvdWdoIGEgZGVmYXVsdCBwcm90ZWN0ZWQgbWV0aG9kIHNvCi0JICogdGhhdCBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfRFREID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCXByaXZhdGUgQ29udGVudFR5cGVJZEZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBEVEQgQ29udGVudCBUeXBlIElkZW50aWZpZXIgSUQgYXMgYSBTdHJpbmcKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9EVERNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9EVERNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWM3MDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvRFRETW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgU1NFLWJhc2VkIERURCBtb2RlbC4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBEVERNb2RlbCBleHRlbmRzIElTdHJ1Y3R1cmVkTW9kZWx7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSURURFBhcnRpdGlvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSURURFBhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzVmNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lEVERQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBEVEQuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQuSURURFBhcnRpdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJRFREUGFydGl0aW9uVHlwZXMgewotCQotCVN0cmluZyBEVERfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLkRFRkFVTFQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rhc2tzL0RUREZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90YXNrcy9EVERGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ZTI3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rhc2tzL0RUREZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lcjsKLQotcHVibGljIGNsYXNzIERUREZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgewotCXB1YmxpYyBEVERGaWxlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiB0ZXh0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2UxYTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZlN0YXJ0KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JCXJldHVybiByZXBhcnNlKHN0YXJ0Tm9kZS5nZXRTdGFydCgpLCBlbmROb2RlLmdldEVuZCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJcmV0dXJuIHN1cGVyLnJlcGFyc2UoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2QyYzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVERfR0VORVJJQyA9IDU7Ci0KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgRFREX0dFTkVSSUMgOgotCQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1JlZ2lvbkl0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvUmVnaW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5MWIyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvUmVnaW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFJlZ2lvbkl0ZXJhdG9yIHsKLQotCXByaXZhdGUgaW50IGN1cnJlbnRJbmRleDsKLQotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCByZWdpb25zOwotCS8vIHByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBzdGFydFJlZ2lvbiwgZW5kUmVnaW9uOwotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQl0aGlzKG5vZGUsIG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0JCXJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJc3RhcnRSZWdpb24gPSBub2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJZW5kUmVnaW9uID0gbm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmRPZmZzZXQgLSAxKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHN0YXJ0UmVnaW9uID09IHJlZ2lvbikgewotCQkJCWN1cnJlbnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJdGhpcy5yZWdpb25zID0gcmVnaW9uczsKLQkJc3RhcnRSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJZW5kUmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJY3VycmVudEluZGV4ID0gMDsKLQkJLy8gdGhpcyhub2RlLCBub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCWlmIChjdXJyZW50SW5kZXggPCByZWdpb25zLnNpemUoKSkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCA8PSByZWdpb25zLmluZGV4T2YoZW5kUmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCWlmIChjdXJyZW50SW5kZXggPj0gMCkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCA+PSByZWdpb25zLmluZGV4T2Yoc3RhcnRSZWdpb24pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gbmV4dCgpIHsKLQkJaWYgKGhhc05leHQoKSkgewotCQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KGN1cnJlbnRJbmRleCsrKTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBwcmV2aW91cygpIHsKLQkJaWYgKGhhc1ByZXZpb3VzKCkpIHsKLQkJCXJldHVybiByZWdpb25zLmdldCgtLWN1cnJlbnRJbmRleCk7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkYTA2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQuSURURFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFREIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjZ2V0RGVmYXVsdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIElEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNpbml0TGVnYWxDb250ZW50VHlwZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IFN0cmluZ1tde0lEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxULCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT059OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL0RURFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvRFREVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YmI0OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvRFREVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4zLjUgb24gMy8xNC8wNSA5OjM3IFBNICovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotCi0vKiogCi0gKiBHZW5lcmF0ZSB3aXRoICJkdGRza2VsZXRvbiIuCi0gKgotICogSXQgcmVtb3ZlcyBzb21lIHVudXNlZCBmaWVsZHMgYW5kIGF2b2lkcyBzb21lIGNvbXBpbGVyIHdhcm5pbmdzIAotICovCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuMy41Ci0gKiBvbiAzLzE0LzA1IDk6MzcgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovZWNsaXBzZS53dHAvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0JVRkZFUlNJWkUgPSAxNjM4NDsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0VOVU1FUkFUSU9OID0gMTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE5PVEFUSU9OX05BTUUgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX0NISUxEID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRU5USVRZX0NPTlRFTlQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBDT01NRU5UX0NPTlRFTlQgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBBVFRMSVNUX05BTUUgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFWFRFUk5BTElEX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX0NPTlRFTlQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX01JWEVEID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9NSVhFRF9PUl9DSElMRCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEFUVFJJQlVURV9DT05URU5UID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVOVElUWV9OQU1FID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0RFRkFVTFQgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9OQU1FID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTkRBVEFfQ09OVEVOVCA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEFUVExJU1RfQ09OVEVOVCA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBOT0RFID0gMTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDEwXDBcMVwwXDFcNVwxXDNcMVwwXDFcMFwxXDJcMjJcMFwxXDVcMVw2IisKLSAgICAiXDFcMVwxXDM3XDFcMFwxXDIzXDFcMFwxXDQ2XDFcNDJcMVw0M1wxXDRcMVw3IisKLSAgICAiXDFcNDVcMVwxMlwxXDBcMVwwXDEyXDBcMVwwXDFcMTBcMVwxMVwxXDBcMVwxMyIrCi0gICAgIlwxXDRcMVwwXDFcMjVcMVwzMVwxXDMyXDFcMzNcMVwxNFwxXDM1XDJcMFwxXDIxIisKLSAgICAiXDFcMFwxXDM2XDFcMTVcMVwxNlwxXDE3XDFcMjRcMVwyN1wxXDQwXDFcMzRcMVwyNiIrCi0gICAgIlwxXDIwXDFcMzBcMlwwXDFcNDFcMVwyMlwxXDBcMVwwXDFcMFwyXDBcMVwwIisKLSAgICAiXDFcMFwzMlwwXDFcMFwxXDQ0XHVmZjgzXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgMzksICAgIDc4LCAgIDExNywgICAxNTYsICAgMTk1LCAgIDIzNCwgICAyNzMsICAgMzEyLCAgIDM1MSwgCi0gICAgICAzOTAsICAgNDI5LCAgIDQ2OCwgICA1MDcsICAgNTQ2LCAgIDU4NSwgICA2MjQsICAgIDM5LCAgICAzOSwgICAgMzksIAotICAgICAgNjYzLCAgIDcwMiwgICA3NDEsICAgNzgwLCAgIDgxOSwgICAgMzksICAgIDM5LCAgIDg1OCwgICA4OTcsICAgIDM5LCAKLSAgICAgICAzOSwgICA5MzYsICAgOTM2LCAgIDk3NSwgIDEwMTQsICAxMDUzLCAgMTA5MiwgIDExMzEsICAxMTcwLCAgMTIwOSwgCi0gICAgIDEyNDgsICAxMjg3LCAgMTMyNiwgIDEzNjUsICAxNDA0LCAgMTQ0MywgICAgMzksICAxNDgyLCAgMTUyMSwgIDE1NjAsIAotICAgICAxNTk5LCAgMTYzOCwgICAgMzksICAxNjc3LCAgMTcxNiwgIDE3NTUsICAxNzk0LCAgMTgzMywgIDE4NzIsICAgIDM5LCAKLSAgICAgICAzOSwgIDE5MTEsICAxOTUwLCAgMTk4OSwgIDIwMjgsICAyMDY3LCAgMjEwNiwgICAgMzksICAgIDM5LCAgICAzOSwgCi0gICAgIDIxNDUsICAyMTg0LCAgMjIyMywgIDIyNjIsICAyMzAxLCAgMjM0MCwgIDIzNzksICAgODk3LCAgMjQxOCwgICA5NzUsIAotICAgICAyNDU3LCAgMjQ5NiwgIDI1MzUsICAyNTc0LCAgIDk3NSwgIDI2MTMsICAyNjUyLCAgMjY5MSwgIDI3MzAsICAxNTYwLCAKLSAgICAgMjc2OSwgIDI4MDgsICAyODQ3LCAgMjg4NiwgIDI5MjUsICAyOTY0LCAgMzAwMywgIDMwNDIsICAzMDgxLCAgMzEyMCwgCi0gICAgIDE5NTAsICAzMTU5LCAgMzE5OCwgIDMyMzcsICAzMjc2LCAgMzMxNSwgIDE5NTAsICAgIDM5LCAgMzM1NCwgIDMzOTMsIAotICAgICAzNDMyLCAgICAzOSwgIDM0NzEsICAzNTEwLCAgMzU0OSwgICAgMzksICAzNTg4LCAgMzYyNywgICAgMzksICAzNjY2LCAKLSAgICAgMzcwNSwgIDM3NDQsICAgIDM5LCAgICAzOSwgIDM3ODMsICAzODIyLCAgMzg2MSwgIDM5MDAsICAzOTM5LCAgMzk3OCwgCi0gICAgIDQwMTcsICA0MDU2LCAgICAzOSwgIDQwOTUsICA0MTM0LCAgNDE3MywgICAgMzksICA0MjEyLCAgNDI1MSwgIDQyOTAsIAotICAgICA0MzI5LCAgNDM2OCwgIDQ0MDcsICA0NDQ2LCAgNDQ4NSwgIDQ1MjQsICA0NTYzLCAgNDYwMiwgIDQ2NDEsICA0NjgwLCAKLSAgICAgNDcxOSwgIDQ3NTgsICA0Nzk3LCAgNDgzNiwgIDQ4NzUsICA0OTE0LCAgNDk1MywgIDQ5OTIsICA1MDMxLCAgNTA3MCwgCi0gICAgIDUxMDksICA1MTQ4LCAgNTE4NywgIDUyMjYsICA1MjY1LCAgNTMwNCwgIDUzNDMsICAgOTc1LCAgNTM4MiwgIDU0MjEsIAotICAgICA1NDYwLCAgNTQ5OSwgIDU1MzgsICA1NTc3LCAgMTU2MCwgIDU2MTYsICA1NjU1LCAgNTY5NCwgIDU3MzMsICA1NzcyLCAKLSAgICAgNTgxMSwgIDU4NTAsICAgNTQ2LCAgNTg4OSwgIDU5MjgsICA1OTY3LCAgNjAwNiwgICA5NzUsICAgOTc1LCAgIDk3NSwgCi0gICAgIDYwNDUsICAxNTYwLCAgNjA4NCwgIDYxMjMsICAxNTYwLCAgNjE2MiwgIDYyMDEsICA2MjQwLCAgMTk1MCwgICA1NDYsIAotICAgICA2Mjc5LCAgIDU0NiwgICA4MTksICA2MzE4LCAgNjM1NywgIDYzOTYsICA2NDM1LCAgNjQ3NCwgIDY1MTMsICAgNTQ2LCAKLSAgICAgNjU1MiwgIDE1NjAsICAxNTYwLCAgMTU2MCwgIDE5NTAsICA2NTkxLCAgICAzOSwgIDE5NTAKLSAgfTsKLQotICAvKiogCi0gICAqIFRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBIChwYXJ0IDApCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXlfcGFja2VkMCA9IAotICAgICJcMlwxN1wyXDIwXDFcMTdcMVwyMFwxXDIxXDFcMTdcMVwyMlwxXDIzIisKLSAgICAiXDFcMTdcMVwyNFwxXDI1XDJcMTdcMVwyNlwzXDE3XDFcMjdcMVwxNyIrCi0gICAgIlwxXDMwXDIxXDE3XDQ3XDBcMlwzMVwyXDIwXDFcMzJcMVwyMFwxXDAiKwotICAgICJcMVwzMlwxXDMxXDFcMzNcMVwzMVwxXDMzXDIzXDMxXDFcMzRcMlwzMSIrCi0gICAgIlwxXDM1XDFcMzZcMlwzN1wxXDMxXDJcNDBcMlwyMFwxXDBcMVwyMCIrCi0gICAgIlwzXDQwXDFcMzNcMVw0MFwxXDMzXDdcNDBcMVw0MVwxNlw0MFw0XDAiKwotICAgICJcMVw0MFwxXDQyXDFcNDNcMlwyMFwxXDQyXDFcMjBcM1w0MlwxXDMzIisKLSAgICAiXDFcNDJcMVwzM1wxMlw0MlwxXDQ0XDFcNDVcMTZcNDJcMVw0NlwyXDQ3IisKLSAgICAiXDJcMjBcMVw0N1wxXDIwXDNcNDdcMVwzM1wxXDQ3XDFcMzNcMzNcNDciKwotICAgICJcMlw1MFwyXDIwXDFcMFwxXDIwXDJcMFwxXDUwXDFcMzNcMVw1MCIrCi0gICAgIlwxXDMzXDI2XDUwXDRcMFwxXDUwXDFcNDJcMVw0M1wyXDIwXDFcNDIiKwotICAgICJcMVwyMFwzXDQyXDFcMzNcMVw0MlwxXDMzXDNcNDJcMVw1MVw2XDQyIisKLSAgICAiXDFcNTJcMVw1M1wxNlw0MlwxXDQ2XDJcNTRcMlw1NVwxXDU0XDFcNTUiKwotICAgICJcNFw1NFwxXDU2XDFcNTdcMzNcNTRcMlw2MFwyXDIwXDFcNDJcMVwyMCIrCi0gICAgIlwyXDQyXDFcNjBcMVwzM1wxXDYwXDFcMzNcMjZcNjBcNFw0MlwxXDYwIisKLSAgICAiXDJcNjFcMlwyMFwxXDQyXDFcMjBcMlw0MlwxXDYxXDFcMzNcMVw2MSIrCi0gICAgIlwxXDMzXDI2XDYxXDRcNDJcMVw2MVwxXDYyXDFcNjNcMVw2NFwxXDY1IisKLSAgICAiXDFcNjJcMVw2NlwzXDYyXDFcMzNcMVw2MlwxXDMzXDFcNjdcMlw2MiIrCi0gICAgIlwxXDcwXDFcNjJcMVw3MVwxMFw2MlwxXDcyXDRcNjJcMVw3M1wyXDYyIisKLSAgICAiXDFcNzRcMlw3NVwxXDYyXDFcNzZcMVw3N1wxXDEwMFwyXDIwXDFcNzciKwotICAgICJcMVwyMFwzXDc3XDFcMzNcMVw3N1wxXDMzXDIzXDc3XDFcMTAxXDZcNzciKwotICAgICJcMVwxMDJcMlwxMDNcMlwyMFwxXDEwM1wxXDIwXDNcMTAzXDFcMzNcMVwxMDMiKwotICAgICJcMVwzM1wyNlwxMDNcMVwxMDRcMVwxMDVcMVwxMDZcMlwxMDNcMlwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiKwotICAgICJcMjNcMTdcMlwwXDJcMjBcMVwwXDFcMjBcNTNcMFwxXDEwN1wzNFwwIisKLSAgICAiXDJcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwIisKLSAgICAiXDFcMTdcMVwxMTBcMVwxN1wxXDExMVwzXDE3XDFcMFwyNVwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiKwotICAgICJcMVwxMTJcMjJcMTdcMlwxMTNcMlwwXDFcMTEzXDJcMFwxXDExM1wyXDAiKwotICAgICJcMVwxMTNcMVwwXDdcMTEzXDFcMFwyM1wxMTNcMlwxN1wyXDBcMVwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDExNFwyXDE3IisKLSAgICAiXDFcMFwyM1wxN1wyXDMxXDZcMFwxXDMxXDFcMFwxXDMxXDFcMCIrCi0gICAgIlwyNlwzMVw0XDBcM1wzMVw2XDBcMVwzMVwxXDBcMVwzMVwxXDAiKwotICAgICJcMTNcMzFcMVwxMTVcMTJcMzFcNFwwXDFcMzFcMlwwXDJcMTE2XDFcMCIrCi0gICAgIlwxXDExNlwzMVwwXDFcMTE3XDdcMFwyXDQwXDRcMFwzXDQwXDFcMCIrCi0gICAgIlwxXDQwXDFcMFwyNlw0MFw0XDBcMVw0MFwyXDQyXDJcMFwxXDQyIisKLSAgICAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwzM1w0MlwxXDQzXDFcMTIwIisKLSAgICAiXDJcMTIxXDFcNDNcMVwxMjFcM1w0M1wxXDEyMVwxXDQzXDFcMTIxXDMzXDQzIisKLSAgICAiXDJcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwIisKLSAgICAiXDZcNDJcMVwxMjJcMjZcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwIisKLSAgICAiXDFcNDJcMVwwXDE0XDQyXDFcMTIzXDE2XDQyXDJcNDZcMlwxMjRcMVw0NiIrCi0gICAgIlwxXDEyNFwzXDQ2XDFcMTI0XDFcNDZcMVwxMjRcMzJcNDZcMVwxMjVcMlw0NyIrCi0gICAgIlwyXDBcMVw0N1wxXDBcM1w0N1wxXDBcMVw0N1wxXDBcMzNcNDciKwotICAgICJcMlw1MFw2XDBcMVw1MFwxXDBcMVw1MFwxXDBcMjZcNTBcNFwwIisKLSAgICAiXDFcNTBcMlw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MiIrCi0gICAgIlwxXDBcMTdcNDJcMVwxMjZcMTVcNDJcMlwwXDFcNDJcMVwwXDNcNDIiKwotICAgICJcMVwwXDFcNDJcMVwwXDZcNDJcMVwxMjdcMjZcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDE0XDQyXDFcMTMwXDE2XDQyIisKLSAgICAiXDEyXDU0XDJcMFwzNVw1NFwyXDU1XDFcNTRcMVw1NVw0XDU0XDJcMCIrCi0gICAgIlwzM1w1NFwxMlwwXDFcMTMxXDM0XDBcMlw2MFwyXDBcMVw0MlwxXDAiKwotICAgICJcMlw0MlwxXDYwXDFcMFwxXDYwXDFcMFwyNlw2MFw0XDQyXDFcNjAiKwotICAgICJcMlw2MVwyXDBcMVw0MlwxXDBcMlw0MlwxXDYxXDFcMFwxXDYxIisKLSAgICAiXDFcMFwyNlw2MVw0XDQyXDFcNjFcMlw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMjZcNjJcM1wwXDJcNjJcMVw2MyIrCi0gICAgIlwxXDEzMlwyXDEzM1wxXDYzXDFcMTMzXDNcNjNcMVwxMzNcMVw2M1wxXDEzMyIrCi0gICAgIlwyNlw2M1wzXDEzM1wyXDYzXDNcMFwxXDY1XDUwXDBcMVw2Nlw0MVwwIisKLSAgICAiXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwxMzRcMjJcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDJcNjJcMVwxMzVcNVw2MlwxXDEzNiIrCi0gICAgIlwxNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcMTdcNjJcMVwxMzdcNlw2MlwzXDBcNFw2MlwyXDAiKwotICAgICJcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTdcNjJcMVwxNDAiKwotICAgICJcNlw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcNVw2MlwxXDE0MVwxMlw2MlwxXDE0MlwxXDE0M1w0XDYyIisKLSAgICAiXDNcMFwyXDYyXDJcNzZcMlwxNDRcMVw3NlwxXDE0NFwzXDc2XDFcMTQ0IisKLSAgICAiXDFcNzZcMVwxNDRcMjZcNzZcM1wxNDRcMVw3NlwxXDEzMlwyXDc3XDJcMCIrCi0gICAgIlwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMFwzM1w3N1wxXDEwMCIrCi0gICAgIlwxXDE0NVwyXDE0NlwxXDEwMFwxXDE0NlwzXDEwMFwxXDE0NlwxXDEwMFwxXDE0NiIrCi0gICAgIlwzM1wxMDBcMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcNVw3N1wxXDE0N1wxMlw3N1wxXDE1MFwxXDE1MVwxMVw3N1wyXDEwMiIrCi0gICAgIlwyXDE1MlwxXDEwMlwxXDE1MlwzXDEwMlwxXDE1MlwxXDEwMlwxXDE1MlwzMlwxMDIiKwotICAgICJcMVwxNTNcMlwxMDNcMlwwXDFcMTAzXDFcMFwzXDEwM1wxXDBcMVwxMDMiKwotICAgICJcMVwwXDI2XDEwM1wzXDBcMlwxMDNcMTJcMFwxXDE1NFwzNFwwXDJcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDFcMTU1IisKLSAgICAiXDZcMTdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFw0XDE3XDFcMTU2XDJcMTdcMVwwXDI1XDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMTU3IisKLSAgICAiXDJcMTdcMVwwXDIzXDE3XDJcMTEzXDJcMFwxXDExM1wyXDBcMVwxMTMiKwotICAgICJcMVwxNjBcMVwwXDFcMTEzXDFcMFw3XDExM1wxXDBcMjNcMTEzXDJcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTciKwotICAgICJcMVwxNjFcMlwxN1wxXDBcMjNcMTdcMlwzMVw2XDBcMVwzMVwxXDAiKwotICAgICJcMVwzMVwxXDBcMTZcMzFcMVwxNjJcN1wzMVw0XDBcMVwzMVwyN1wwIisKLSAgICAiXDFcMTYzXDE3XDBcMVwxMjFcMVwxNjRcNDVcMTIxXDJcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDEyXDQyXDFcMTY1XDIyXDQyIisKLSAgICAiXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxNVw0MiIrCi0gICAgIlwxXDE2NlwxNVw0Mlw0NlwxMjRcMVwxNjdcMlw0MlwyXDBcMVw0MlwxXDAiKwotICAgICJcM1w0MlwxXDBcMVw0MlwxXDBcMTFcNDJcMVwxNzBcMjNcNDJcMlwwIisKLSAgICAiXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDEyXDQyXDFcMTcxIisKLSAgICAiXDIyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMCIrCi0gICAgIlwxNVw0MlwxXDE3MlwxNVw0MlwxM1wwXDFcMTczXDMzXDBcMVwxMzNcMVwxNzQiKwotICAgICJcNDVcMTMzXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDRcNjJcMVwxNzVcMjFcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDRcNjJcMVwxNzZcMjFcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDRcNjJcMVwxNzdcMjFcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDIwXDYyXDFcMjAwXDVcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDExXDYyXDFcMjAxXDE0XDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwyXDYyXDFcMjAyXDIzXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwxXDIwM1wyNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcNVw2MlwxXDIwNFwyMFw2MlwzXDAiKwotICAgICJcMlw2Mlw0NlwxNDRcMVwxNzRcMVwxNDZcMVwyMDVcNDVcMTQ2XDJcNzdcMlwwIisKLSAgICAiXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDJcNzdcMVwyMDYiKwotICAgICJcMzJcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwIisKLSAgICAiXDFcMjA3XDM0XDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFw1XDc3XDFcMjEwXDI1XDc3XDQ2XDE1MlwxXDIxMVwyXDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFwyXDE3XDFcMjEyIisKLSAgICAiXDRcMTdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFw1XDE3XDFcMjEzXDFcMTdcMVwwXDI1XDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw3XDE3XDFcMCIrCi0gICAgIlwxXDE3XDFcMjE0XDIzXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFwxXDE3XDFcMjE1XDVcMTdcMVwwXDIzXDE3XDJcMzEiKwotICAgICJcNlwwXDFcMzFcMVwwXDFcMzFcMVwwXDE3XDMxXDFcMjE2XDZcMzEiKwotICAgICJcNFwwXDFcMzFcMzJcMFwxXDIxN1wxNFwwXDJcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDRcNDJcMVwyMjBcMzBcNDIiKwotICAgICJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDFcNDIiKwotICAgICJcMVwyMjFcMzNcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDIiKwotICAgICJcMVwwXDRcNDJcMVwyMjJcMzBcNDJcMlwwXDFcNDJcMVwwXDNcNDIiKwotICAgICJcMVwwXDFcNDJcMVwwXDRcNDJcMVwyMjNcMzBcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDFcNDJcMVwyMjRcMzFcNDIiKwotICAgICJcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcNVw2MlwxXDIyNVwyMFw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMTBcNjJcMVwyMjZcMTVcNjJcM1wwIisKLSAgICAiXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDExXDYyXDFcMjI3XDE0XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwxXDIzMFwyNVw2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcNFw2MiIrCi0gICAgIlwxXDIzMVwyMVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMTNcNjJcMVwyMzJcMTJcNjJcM1wwXDRcNjIiKwotICAgICJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDI0XDYyIisKLSAgICAiXDFcMjMzXDFcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMVwwXDI1XDYyXDFcMjM0XDNcMFwyXDYyXDJcNzciKwotICAgICJcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDEzXDc3IisKLSAgICAiXDFcMjM1XDIxXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwyNFw3N1wxXDIzNlwxMFw3N1wyXDBcMVw3N1wxXDBcM1w3NyIrCi0gICAgIlwxXDBcMVw3N1wxXDBcMjVcNzdcMVwyMzdcNVw3N1wyXDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFwxXDI0MFw2XDE3IisKLSAgICAiXDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxNyIrCi0gICAgIlwxXDBcNFwxN1wxXDI0MVwyXDE3XDFcMFwyNVwxN1wyXDBcMVwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDI0MlwyXDE3IisKLSAgICAiXDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxNyIrCi0gICAgIlwxXDBcNVwxN1wxXDI0M1wxXDE3XDFcMFwyM1wxN1wyXDMxXDZcMCIrCi0gICAgIlwxXDMxXDFcMFwxXDMxXDFcMFwxMVwzMVwxXDI0NFwxNFwzMVw0XDAiKwotICAgICJcMVwzMVwzM1wwXDFcMjQ1XDEzXDBcMlw0MlwyXDBcMVw0MlwxXDAiKwotICAgICJcM1w0MlwxXDBcMVw0MlwxXDBcMVwyNDZcMzRcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDVcNDJcMVwyNDdcMjdcNDIiKwotICAgICJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDExXDQyIisKLSAgICAiXDFcMjUwXDIzXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyIisKLSAgICAiXDFcMFwxXDI1MVwzNFw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDAiKwotICAgICJcMVw0MlwxXDBcNVw0MlwxXDI1MlwyNVw0MlwyXDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyXDFcMjUzXDIxXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwyMlw2MlwxXDI1NFwzXDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyXDFcMjU1XDIxXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwyMVw2MlwxXDI1Nlw0XDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxMVw2MlwxXDI1N1wxNFw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDI2MFwyNFw2MlwzXDBcNFw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTRcNjJcMVwyNjFcMTFcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDFcMjYyXDI1XDYyXDNcMFwyXDYyXDJcNzdcMlwwXDFcNzciKwotICAgICJcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDFcNzdcMVwyNjNcMzNcNzciKwotICAgICJcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDE0XDc3IisKLSAgICAiXDFcMjY0XDIwXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwxXDI2NVwzMlw3N1wyXDE3XDJcMFwxXDE3XDJcMFwxXDE3IisKLSAgICAiXDJcMFwxXDE3XDFcMFwzXDE3XDFcMjY2XDNcMTdcMVwwXDI1XDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw2XDE3IisKLSAgICAiXDFcMjY3XDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDAiKwotICAgICJcMVwxN1wxXDBcNVwxN1wxXDI3MFwxXDE3XDFcMFwyNVwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiKwotICAgICJcMlwxN1wxXDI3MVwyMFwxN1wyXDMxXDZcMFwxXDMxXDFcMFwxXDMxIisKLSAgICAiXDFcMFw0XDMxXDFcMjcyXDIxXDMxXDRcMFwxXDMxXDI1XDBcMVwyNzMiKwotICAgICJcMjFcMFwyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyIisKLSAgICAiXDFcMFwyXDQyXDFcMjc0XDMyXDQyXDJcMFwxXDQyXDFcMFwzXDQyIisKLSAgICAiXDFcMFwxXDQyXDFcMFwxNlw0MlwxXDI3NFwxNlw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMlw0MlwxXDI3NVwzMlw0MiIrCi0gICAgIlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTZcNDIiKwotICAgICJcMVwyNzZcMTRcNDJcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcNVw2MlwxXDI3N1wxXDMwMFwxN1w2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMVwzMDEiKwotICAgICJcMjVcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDVcNjJcMVwzMDJcMjBcNjJcM1wwXDRcNjJcMlwwIisKLSAgICAiXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDEyXDYyXDFcMzAzIisKLSAgICAiXDEzXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFw1XDYyXDFcMjM0XDIwXDYyXDNcMFw0XDYyXDJcMCIrCi0gICAgIlwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw1XDYyXDFcMzA0IisKLSAgICAiXDIwXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFwxN1w2MlwxXDEzMlw2XDYyXDNcMFwyXDYyXDJcNzciKwotICAgICJcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDVcNzciKwotICAgICJcMVwzMDVcMjdcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDVcNzdcMVwzMDZcMjdcNzdcMlwwXDFcNzdcMVwwXDNcNzciKwotICAgICJcMVwwXDFcNzdcMVwwXDE3XDc3XDFcMzA3XDEzXDc3XDJcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTdcMVwzMTAiKwotICAgICJcMlwxN1wxXDBcMjVcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMVwwXDdcMTdcMVwwXDFcMzExXDI0XDE3XDJcMFwxXDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMzEyXDJcMTciKwotICAgICJcMVwwXDIzXDE3XDJcMzFcNlwwXDFcMzFcMVwwXDFcMzFcMVwwIisKLSAgICAiXDExXDMxXDFcMzEzXDE0XDMxXDRcMFwxXDMxXDIwXDBcMVwzMTRcMjZcMCIrCi0gICAgIlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwxXDMxNVwyNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcM1w2MlwxXDMxNlwyMlw2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTBcNjIiKwotICAgICJcMVwzMTdcMTVcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMVwwXDIwXDYyXDFcMjM0XDVcNjJcM1wwXDJcNjIiKwotICAgICJcMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDAiKwotICAgICJcMVwzMjBcMzRcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDIwXDc3XDFcMzIxXDEyXDc3XDJcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMVwwXDNcMTdcMVwzMjJcM1wxN1wxXDAiKwotICAgICJcMjNcMTdcMjVcMFwxXDMyM1wyMVwwXDJcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDEyXDYyXDFcMzI0XDEzXDYyXDNcMCIrCi0gICAgIlw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwxMlw2MlwxXDMyNVwxM1w2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcM1w2MlwxXDMyNlwyMlw2MlwzXDAiKwotICAgICJcMlw2MlwyXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwxN1w3N1wxXDMyN1wxNVw3N1wyXDBcMVw3N1wxXDBcM1w3NyIrCi0gICAgIlwxXDBcMVw3N1wxXDBcMVwzMzBcMzJcNzdcMlwwXDJcMzIzXDFcMCIrCi0gICAgIlwxXDMyM1wzNVwwXDFcMzMxXDNcMFwyXDc3XDJcMFwxXDc3XDFcMCIrCi0gICAgIlwzXDc3XDFcMFwxXDc3XDFcMFwxN1w3N1wxXDMzMlwxM1w3NyI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjaygpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDAsICA4LCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgOSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgOSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgOSwgIDksICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksIAotICAgICAxLCAgMSwgIDAsICA5LCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyW1lZX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBpbnQgeXljb2x1bW47IAotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JaW50IG5vZGVfY291bnQgPSAwOwotCVN0cmluZyBjdXJyZW50U3RyaW5nOwotCi0JcHJpdmF0ZSBUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbmV3IFRva2VuKHR5cGUsIHl5dGV4dCgpLCB5eWxpbmUsIHl5Y2hhciArIHN0YXJ0T2Zmc2V0LCB5eWxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBzdGFydE9mZnNldCA9IDA7Ci0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpbmUoaW50IGxpbmUpIHsKLQkJdGhpcy55eWxpbmUgPSBsaW5lOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBEVERUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgRFREVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIHNwbGl0LCBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbNjYzMF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0geXlfdW5wYWNrKHl5X3BhY2tlZDAsIG9mZnNldCwgdHJhbnMpOwotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGVudHJ5Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgeXlfdW5wYWNrKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSB0cmFucykgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzApIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9yZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOyAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh5eV9yZWFkZXIgIT0gbnVsbCkKLSAgICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBjdXJyZW50IHN0cmVhbSwgYW5kIHJlc2V0cyB0aGUKLSAgICogc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PllZX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eWNsb3NlKCk7Ci0gICAgeXlfcmVhZGVyID0gcmVhZGVyOwotICAgIHl5X2F0RU9GICA9IGZhbHNlOwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQgPSAwOwotICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvcyA9IDA7Ci0gICAgeXlsaW5lID0geXljaGFyID0geXljb2x1bW4gPSAwOwotICAgIHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgZmluYWwgcHVibGljIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWVlfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFl5dG9rZW4geXlsZXgoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB5eV9jdXJyZW50UG9zX2w7Ci0gICAgaW50IHl5X21hcmtlZFBvc19sOwotICAgIGludCB5eV9lbmRSZWFkX2wgPSB5eV9lbmRSZWFkOwotICAgIGNoYXIgW10geXlfYnVmZmVyX2wgPSB5eV9idWZmZXI7Ci0gICAgY2hhciBbXSB5eWNtYXBfbCA9IHl5Y21hcDsKLQotICAgIGludCBbXSB5eXRyYW5zX2wgPSB5eXRyYW5zOwotICAgIGludCBbXSB5eV9yb3dNYXBfbCA9IHl5X3Jvd01hcDsKLSAgICBieXRlIFtdIHl5X2F0dHJfbCA9IFlZX0FUVFJJQlVURTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0geXlfbWFya2VkUG9zX2wteXlfc3RhcnRSZWFkOwotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvc19sID0geXlfY3VycmVudFBvcyA9IAotICAgICAgICAgICAgICAgICAgICAgICB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3NfbDsKLSAgCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHl5X2N1cnJlbnRQb3NfbCA8IHl5X2VuZFJlYWRfbCkKLSAgICAgICAgICAgIHl5X2lucHV0ID0geXlfYnVmZmVyX2xbeXlfY3VycmVudFBvc19sKytdOwotICAgICAgICAgIGVsc2UgaWYgKHl5X2F0RU9GKSB7Ci0gICAgICAgICAgICB5eV9pbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgeXlfY3VycmVudFBvcyAgPSB5eV9jdXJyZW50UG9zX2w7Ci0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgICA9IHl5X21hcmtlZFBvc19sOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB5eV9yZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgeXlfY3VycmVudFBvc19sICA9IHl5X2N1cnJlbnRQb3M7Ci0gICAgICAgICAgICB5eV9tYXJrZWRQb3NfbCAgID0geXlfbWFya2VkUG9zOwotICAgICAgICAgICAgeXlfYnVmZmVyX2wgICAgICA9IHl5X2J1ZmZlcjsKLSAgICAgICAgICAgIHl5X2VuZFJlYWRfbCAgICAgPSB5eV9lbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB5eV9pbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgeXlfaW5wdXQgPSB5eV9idWZmZXJfbFt5eV9jdXJyZW50UG9zX2wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCB5eV9uZXh0ID0geXl0cmFuc19sWyB5eV9yb3dNYXBfbFt5eV9zdGF0ZV0gKyB5eWNtYXBfbFt5eV9pbnB1dF0gXTsKLSAgICAgICAgICBpZiAoeXlfbmV4dCA9PSAtMSkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIHl5X3N0YXRlID0geXlfbmV4dDsKLQotICAgICAgICAgIGludCB5eV9hdHRyaWJ1dGVzID0geXlfYXR0cl9sW3l5X3N0YXRlXTsKLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPT0gMSApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvc19sID0geXlfY3VycmVudFBvc19sOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA9PSA4ICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB5eV9tYXJrZWRQb3MgPSB5eV9tYXJrZWRQb3NfbDsKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsKLQotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7ICB9Ci0gICAgICAgIGNhc2UgMjE5OiBicmVhazsKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgMTIzOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgIH0KLSAgICAgICAgY2FzZSAyMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgIGNhc2UgMTMzOiAKLSAgICAgICAgY2FzZSAxMzQ6IAotICAgICAgICBjYXNlIDEzNTogCi0gICAgICAgIGNhc2UgMTU2OiAKLSAgICAgICAgY2FzZSAxNTc6IAotICAgICAgICBjYXNlIDE1ODogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgY2FzZSAxNzk6IAotICAgICAgICBjYXNlIDE4MDogCi0gICAgICAgIGNhc2UgMTk2OiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgY2FzZSAyMTU6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA1OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5NVE9LRU5fS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjIzOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgICAgeyAgeXliZWdpbihDT01NRU5UX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7ICB9Ci0gICAgICAgIGNhc2UgMjI2OiBicmVhazsKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjI3OiBicmVhazsKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgICAgeyAgeXliZWdpbihFWFRFUk5BTElEX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjI4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICBjYXNlIDEzNjogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOyAgfQotICAgICAgICBjYXNlIDIyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgY2FzZSAxMzI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgIH0KLSAgICAgICAgY2FzZSAyMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpOyAgfQotICAgICAgICBjYXNlIDIzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUFVCTElDX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU1lTVEVNX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICBjYXNlIDEzNzogCi0gICAgICAgIGNhc2UgMTM4OiAKLSAgICAgICAgY2FzZSAxMzk6IAotICAgICAgICBjYXNlIDE0MDogCi0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDE2MTogCi0gICAgICAgIGNhc2UgMTYyOiAKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICBjYXNlIDE4MzogCi0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgY2FzZSAyMDA6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogCi0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgODI6IAotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICBjYXNlIDE0NDogCi0gICAgICAgIGNhc2UgMTY1OiAKLSAgICAgICAgY2FzZSAxNjY6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogCi0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgIGNhc2UgMTQ1OiAKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICBjYXNlIDE0NzogCi0gICAgICAgIGNhc2UgMTY4OiAKLSAgICAgICAgY2FzZSAxNjk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM3OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM4OiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzk6IGJyZWFrOwotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyNDA6IGJyZWFrOwotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKE5PVEFUSU9OX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyNDU6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMTogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOyAgfQotICAgICAgICBjYXNlIDI0NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEVMRU1FTlRfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjQ3OiBicmVhazsKLSAgICAgICAgY2FzZSAxODI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRU5USVRZX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjQ4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oTkRBVEFfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDk6IGJyZWFrOwotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKTsgIH0KLSAgICAgICAgY2FzZSAyNTA6IGJyZWFrOwotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKTsgIH0KLSAgICAgICAgY2FzZSAyNTI6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pOyAgfQotICAgICAgICBjYXNlIDI1MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgIH0KLSAgICAgICAgY2FzZSAyNTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICBjYXNlIDU0OiAKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSAxMjQ6IAotICAgICAgICBjYXNlIDEyNTogCi0gICAgICAgIGNhc2UgMTI2OiAKLSAgICAgICAgY2FzZSAxMjc6IAotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMTQ4OiAKLSAgICAgICAgY2FzZSAxNDk6IAotICAgICAgICBjYXNlIDE1MDogCi0gICAgICAgIGNhc2UgMTUxOiAKLSAgICAgICAgY2FzZSAxNTI6IAotICAgICAgICBjYXNlIDE1MzogCi0gICAgICAgIGNhc2UgMTU0OiAKLSAgICAgICAgY2FzZSAxNTU6IAotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgIGNhc2UgMTcxOiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE3NTogCi0gICAgICAgIGNhc2UgMTc2OiAKLSAgICAgICAgY2FzZSAxNzc6IAotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgIGNhc2UgMTkyOiAKLSAgICAgICAgY2FzZSAxOTM6IAotICAgICAgICBjYXNlIDE5NTogCi0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEFSTV9FTlRJVFlfVFlQRSk7ICB9Ci0gICAgICAgIGNhc2UgMjU1OiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTik7ICB9Ci0gICAgICAgIGNhc2UgMjU3OiBicmVhazsKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyAgfQotICAgICAgICBjYXNlIDI1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgIH0KLSAgICAgICAgY2FzZSAyNTk6IGJyZWFrOwotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7ICB9Ci0gICAgICAgIGNhc2UgMjYwOiBicmVhazsKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlVNX0NIT0lDRSk7ICB9Ci0gICAgICAgIGNhc2UgMjYzOiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgeyAgeXliZWdpbihFTlRJVFlfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgIH0KLSAgICAgICAgY2FzZSAyNjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgIH0KLSAgICAgICAgY2FzZSAyNjU6IGJyZWFrOwotICAgICAgICBjYXNlIDE4NzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihFWFRFUk5BTElEX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDI2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDE3NDogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNjg6IGJyZWFrOwotICAgICAgICBjYXNlIDE3MzogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNjk6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNzogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjcwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKTsgIH0KLSAgICAgICAgY2FzZSAyNzE6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7ICB9Ci0gICAgICAgIGNhc2UgMjcyOiBicmVhazsKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgMTE1OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyAgfQotICAgICAgICBjYXNlIDI3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSA3NjogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAxNDE6IAotICAgICAgICBjYXNlIDE2MzogCi0gICAgICAgIGNhc2UgMTg1OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjc0OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOyAgfQotICAgICAgICBjYXNlIDI3NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjc2OiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjc3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNFTUlDT0xPTik7ICB9Ci0gICAgICAgIGNhc2UgMjc4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUik7ICB9Ci0gICAgICAgIGNhc2UgMjc5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOyAgfQotICAgICAgICBjYXNlIDI4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTkRfVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyODE6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjgyOiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvVG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYWZlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgVG9rZW4gZXh0ZW5kcyBZeXRva2VuIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UX1NUQVJUID0gOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUT1IgPSA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQU5ZID0gNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9FTVBUWSA9IDQyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfUENEQVRBID0gNDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9DT05URU5UID0gNDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX1RBRyA9IDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9UQUcgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9DT05URU5UID0gMzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1BBUk0gPSAzMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9UQUcgPSAzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWENMQU1BVElPTiA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9QQVJFTiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UQVRJT05fQ09OVEVOVCA9IDIxOwotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTl9UQUcgPSAyMDsKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfQ0hPSUNFID0gNTsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1NFUVVFTkNFID0gNjsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQ0NVUl9PUFRJT05BTCA9IDc7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NDVVJfT05FX09SX01PUkUgPSA4OwotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX1pFUk9fT1JfTU9SRSA9IDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NDVVJfVFlQRSA9IDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfUEFSRU4gPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RBRyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hJVEVTUEFDRSA9IDU7Ci0KLQotCXB1YmxpYyBUb2tlbihTdHJpbmcgdHlwZSkgewotCQlzdXBlcih0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgVG9rZW4oU3RyaW5nIHR5cGUsIFN0cmluZyB0ZXh0LCBpbnQgbGluZSwgaW50IGNoYXJCZWdpbiwgaW50IGxlbmd0aCkgewotCQlzdXBlcih0eXBlLCB0ZXh0LCBsaW5lLCBjaGFyQmVnaW4sIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIFRva2VuIGNyZWF0ZUNvcHkoKSB7Ci0JCVRva2VuIGNvcHkgPSBuZXcgVG9rZW4oZ2V0VHlwZSgpLCBnZXRUZXh0KCksIGdldFN0YXJ0TGluZSgpLCBnZXRTdGFydE9mZnNldCgpLCBnZXRMZW5ndGgoKSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvWXl0b2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvWXl0b2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQ3OTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1l5dG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyOwotCi1jbGFzcyBZeXRva2VuIHsKLQlwdWJsaWMgaW50IG1fY2hhckJlZ2luOwotCXB1YmxpYyBpbnQgbV9sZW5ndGg7Ci0JcHVibGljIGludCBtX2xpbmU7Ci0JcHVibGljIFN0cmluZyBtX3RleHQ7Ci0JcHVibGljIFN0cmluZyBtX3R5cGU7Ci0KLQlZeXRva2VuKFN0cmluZyB0eXBlKSB7Ci0JCW1fdHlwZSA9IHR5cGU7Ci0JfQotCi0JWXl0b2tlbihTdHJpbmcgdHlwZSwgU3RyaW5nIHRleHQsIGludCBsaW5lLCBpbnQgY2hhckJlZ2luLCBpbnQgbGVuZ3RoKSB7Ci0JCW1fdHlwZSA9IHR5cGU7Ci0JCW1fdGV4dCA9IG5ldyBTdHJpbmcodGV4dCk7Ci0JCW1fbGluZSA9IGxpbmU7Ci0JCW1fY2hhckJlZ2luID0gY2hhckJlZ2luOwotCQltX2xlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBzdHJpbmdTdGFydCA9IHN0YXJ0IC0gbV9jaGFyQmVnaW47Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSBtX3RleHQ7Ci0JCW1fdGV4dCA9IG9sZFN0cmluZy5zdWJzdHJpbmcoMCwgc3RyaW5nU3RhcnQpOwotCQltX3RleHQgKz0gb2xkU3RyaW5nLnN1YnN0cmluZyhzdHJpbmdTdGFydCArIGxlbmd0aCk7Ci0KLQkJbV9sZW5ndGggPSBtX3RleHQubGVuZ3RoKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibmV3IHN0cmluZyA9ICIgKyBtX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWXl0b2tlbiBvdGhlcikgewotCQlyZXR1cm4gbV90eXBlID09IG90aGVyLmdldFR5cGUoKSAmJiBtX3RleHQuZXF1YWxzKG90aGVyLmdldFRleHQoKSkgJiYgbV9saW5lID09IG90aGVyLmdldFN0YXJ0TGluZSgpICYmIG1fY2hhckJlZ2luID09IG90aGVyLmdldFN0YXJ0T2Zmc2V0KCkgJiYgbV9sZW5ndGggPT0gb3RoZXIuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBtX2NoYXJCZWdpbiArIG1fbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbV9sZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydExpbmUoKSB7Ci0JCXJldHVybiBtX2xpbmU7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIG1fY2hhckJlZ2luOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIG1fdGV4dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBtX3R5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHN0YXJ0T2Zmc2V0KSB7Ci0JCW1fY2hhckJlZ2luID0gc3RhcnRPZmZzZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJUZXh0ICAgOiAiICsgbV90ZXh0ICsgIlxudHlwZSA6ICIgKyBtX3R5cGUgKyAiXG5saW5lICA6ICIgKyBtX2xpbmUgKyAiXG5jQmVnLiA6ICIgKyBtX2NoYXJCZWdpbiArICJcbmNFbmQuIDogIiArIGdldEVuZE9mZnNldCgpICsgIlxuY0xlbmd0aC4gOiAiICsgbV9sZW5ndGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlT2Zmc2V0KGludCBkZWx0YSkgewotCQltX2NoYXJCZWdpbiArPSBkZWx0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCW1fdGV4dCA9IG5ld1RleHQ7Ci0JCW1fbGVuZ3RoID0gbmV3VGV4dC5sZW5ndGgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZC5mbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ExNGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZC5mbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLQotLyoqIAotICogR2VuZXJhdGUgd2l0aCAiZHRkc2tlbGV0b24iLgotICoKLSAqIEl0IHJlbW92ZXMgc29tZSB1bnVzZWQgZmllbGRzIGFuZCBhdm9pZHMgc29tZSBjb21waWxlciB3YXJuaW5ncyAKLSAqLwotCi0lJQotCi0lewotCWludCBub2RlX2NvdW50ID0gMDsKLQlTdHJpbmcgY3VycmVudFN0cmluZzsKLQotCXByaXZhdGUgVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBUb2tlbih0eXBlLCB5eXRleHQoKSwgeXlsaW5lLCB5eWNoYXIgKyBzdGFydE9mZnNldCwgeXlsZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAwOwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhpcy5zdGFydE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5lKGludCBsaW5lKSB7Ci0JCXRoaXMueXlsaW5lID0gbGluZTsKLQl9Ci0lfQotCi0lY2xhc3MgRFREVG9rZW5pemVyCi0lcHVibGljCi0ldW5pY29kZQotJWNoYXIKLQotJXN0YXRlIE5PREUKLSVzdGF0ZSBFTEVNRU5UX05BTUUKLSVzdGF0ZSBFTEVNRU5UX0NPTlRFTlQKLSVzdGF0ZSBFTEVNRU5UX01JWEVEX09SX0NISUxECi0lc3RhdGUgRUxFTUVOVF9NSVhFRAotJXN0YXRlIEVMRU1FTlRfQ0hJTEQKLSVzdGF0ZSBFTlRJVFlfTkFNRQotJXN0YXRlIEVOVElUWV9DT05URU5UCi0lc3RhdGUgTkRBVEFfQ09OVEVOVAotCi0lc3RhdGUgTk9UQVRJT05fTkFNRQotJXN0YXRlIEVYVEVSTkFMSURfQ09OVEVOVAotCi0lc3RhdGUgQ09NTUVOVF9DT05URU5UCi0lc3RhdGUgQVRUTElTVF9OQU1FCi0lc3RhdGUgQVRUTElTVF9DT05URU5UCi0lc3RhdGUgQVRUUklCVVRFX0NPTlRFTlQKLSVzdGF0ZSBBVFRSSUJVVEVfREVGQVVMVAotJXN0YXRlIEFUVFJJQlVURV9FTlVNRVJBVElPTgotCi0KLUFMUEhBPVtBLVphLXpdCi1ESUdJVD1bMC05XQotTk9OTkVXTElORV9XSElURV9TUEFDRV9DSEFSPVtcIFx0XGJcMDEyXQotU1RSSU5HX1RFWFQ9KFxcXCJ8W15cblxyXCJdfFxce1dISVRFX1NQQUNFX0NIQVJ9K1xcKSoKLUNPTU1FTlRfVEVYVD0oW14qL1xuXXxbXipcbl0iLyJbXipcbl18W14vXG5dIioiW14vXG5dfCIqIlteL1xuXXwiLyJbXipcbl0pKgotSWRlbnQgPSB7QUxQSEF9KHtBTFBIQX18e0RJR0lUfXxfKSoKLUlucHV0Q2hhcmFjdGVyID0gW15cclxuXQotCi1MaW5lVGVybWluYXRvciA9IFxyfFxufFxyXG4KLQotLyogMyAtIFdoaXRlIFNwYWNlICovCi1TICAgICAgICAgICAgICA9ICAgIChceDIwIHwgXHgwOSB8IFx4MEQgfCBceDBBKSsKLU5vbkxpbmVUZXJtaW5hdG9yV2hpdGVzcGFjZSA9IChceDIwIHwgXHgwOSkrCi0KLVdoaXRlU3BhY2UgICAgID0ge0xpbmVUZXJtaW5hdG9yfSB8IFsgXHRcZl0KLQotLyogODQgKi8KLS8qTGV0dGVyICAgICAgICAgPSAgICB7QmFzZUNoYXJ9IHwge0lkZW9ncmFwaGljfQotCi0vKiA4NSAqLwotQmFzZUNoYXIgICAgICAgPSAgICBbXHUwMDQxLVx1MDA1QV0gfCBbXHUwMDYxLVx1MDA3QV0gfCBbXHUwMEMwLVx1MDBENl0gfCBbXHUwMEQ4LVx1MDBGNl0gfCBbXHUwMEY4LVx1MDBGRl0gfCBbXHUwMTAwLVx1MDEzMV0gfCBbXHUwMTM0LVx1MDEzRV0gfCBbXHUwMTQxLVx1MDE0OF0gfCBbXHUwMTRBLVx1MDE3RV0gfCBbXHUwMTgwLVx1MDFDM10gfCBbXHUwMUNELVx1MDFGMF0gfCBbXHUwMUY0LVx1MDFGNV0gfCBbXHUwMUZBLVx1MDIxN10gfCBbXHUwMjUwLVx1MDJBOF0gfCBbXHUwMkJCLVx1MDJDMV0gfCBcdTAzODYgfCBbXHUwMzg4LVx1MDM4QV0gfCBcdTAzOEMgfCBbXHUwMzhFLVx1MDNBMV0gfCBbXHUwM0EzLVx1MDNDRV0gfCBbXHUwM0QwLVx1MDNENl0gfCBcdTAzREEgfCBcdTAzREMgfCBcdTAzREUgfCBcdTAzRTAgfCBbXHUwM0UyLVx1MDNGM10gfCBbXHUwNDAxLVx1MDQwQ10gfCBbXHUwNDBFLVx1MDQ0Rl0gfCBbXHUwNDUxLVx1MDQ1Q10gfCBbXHUwNDVFLVx1MDQ4MV0gfCBbXHUwNDkwLVx1MDRDNF0gfCBbXHUwNEM3LVx1MDRDOF0gfCBbXHUwNENCLVx1MDRDQ10gfCBbXHUwNEQwLVx1MDRFQl0gfCBbXHUwNEVFLVx1MDRGNV0gfCBbXHUwNEY4LVx1MDRGOV0gfCBbXHUwNTMxLVx1MDU1Nl0gfCBcdTA1NTkgfCBbXHUwNTYxLVx1MDU4Nl0gfCBbXHUwNUQwLVx1MDVFQV0gfCBbXHUwNUYwLVx1MDVGMl0gfCBbXHUwNjIxLVx1MDYzQV0gfCBbXHUwNjQxLVx1MDY0QV0gfCBbXHUwNjcxLVx1MDZCN10gfCBbXHUwNkJBLVx1MDZCRV0gfCBbXHUwNkMwLVx1MDZDRV0gfCBbXHUwNkQwLVx1MDZEM10gfCBcdTA2RDUgfCBbXHUwNkU1LVx1MDZFNl0gfCBbXHUwOTA1LVx1MDkzOV0gfCBcdTA5M0QgfCBbXHUwOTU4LVx1MDk2MV0gfCBbXHUwOTg1LVx1MDk4Q10gfCBbXHUwOThGLVx1MDk5MF0gfCBbXHUwOTkzLVx1MDlBOF0gfCBbXHUwOUFBLVx1MDlCMF0gfCBcdTA5QjIgfCBbXHUwOUI2LVx1MDlCOV0gfCBbXHUwOURDLVx1MDlERF0gfCBbXHUwOURGLVx1MDlFMV0gfCBbXHUwOUYwLVx1MDlGMV0gfCBbXHUwQTA1LVx1MEEwQV0gfCBbXHUwQTBGLVx1MEExMF0gfCBbXHUwQTEzLVx1MEEyOF0gfCBbXHUwQTJBLVx1MEEzMF0gfCBbXHUwQTMyLVx1MEEzM10gfCBbXHUwQTM1LVx1MEEzNl0gfCBbXHUwQTM4LVx1MEEzOV0gfCBbXHUwQTU5LVx1MEE1Q10gfCBcdTBBNUUgfCBbXHUwQTcyLVx1MEE3NF0gfCBbXHUwQTg1LVx1MEE4Ql0gfCBcdTBBOEQgfCBbXHUwQThGLVx1MEE5MV0gfCBbXHUwQTkzLVx1MEFBOF0gfCBbXHUwQUFBLVx1MEFCMF0gfCBbXHUwQUIyLVx1MEFCM10gfCBbXHUwQUI1LVx1MEFCOV0gfCBcdTBBQkQgfCBcdTBBRTAgfCBbXHUwQjA1LVx1MEIwQ10gfCBbXHUwQjBGLVx1MEIxMF0gfCBbXHUwQjEzLVx1MEIyOF0gfCBbXHUwQjJBLVx1MEIzMF0gfCBbXHUwQjMyLVx1MEIzM10gfCBbXHUwQjM2LVx1MEIzOV0gfCBcdTBCM0QgfCBbXHUwQjVDLVx1MEI1RF0gfCBbXHUwQjVGLVx1MEI2MV0gfCBbXHUwQjg1LVx1MEI4QV0gfCBbXHUwQjhFLVx1MEI5MF0gfCBbXHUwQjkyLVx1MEI5NV0gfCBbXHUwQjk5LVx1MEI5QV0gfCBcdTBCOUMgfCBbXHUwQjlFLVx1MEI5Rl0gfCBbXHUwQkEzLVx1MEJBNF0gfCBbXHUwQkE4LVx1MEJBQV0gfCBbXHUwQkFFLVx1MEJCNV0gfCBbXHUwQkI3LVx1MEJCOV0gfCBbXHUwQzA1LVx1MEMwQ10gfCBbXHUwQzBFLVx1MEMxMF0gfCBbXHUwQzEyLVx1MEMyOF0gfCBbXHUwQzJBLVx1MEMzM10gfCBbXHUwQzM1LVx1MEMzOV0gfCBbXHUwQzYwLVx1MEM2MV0gfCBbXHUwQzg1LVx1MEM4Q10gfCBbXHUwQzhFLVx1MEM5MF0gfCBbXHUwQzkyLVx1MENBOF0gfCBbXHUwQ0FBLVx1MENCM10gfCBbXHUwQ0I1LVx1MENCOV0gfCBcdTBDREUgfCBbXHUwQ0UwLVx1MENFMV0gfCBbXHUwRDA1LVx1MEQwQ10gfCBbXHUwRDBFLVx1MEQxMF0gfCBbXHUwRDEyLVx1MEQyOF0gfCBbXHUwRDJBLVx1MEQzOV0gfCBbXHUwRDYwLVx1MEQ2MV0gfCBbXHUwRTAxLVx1MEUyRV0gfCBcdTBFMzAgfCBbXHUwRTMyLVx1MEUzM10gfCBbXHUwRTQwLVx1MEU0NV0gfCBbXHUwRTgxLVx1MEU4Ml0gfCBcdTBFODQgfCBbXHUwRTg3LVx1MEU4OF0gfCBcdTBFOEEgfCBcdTBFOEQgfCBbXHUwRTk0LVx1MEU5N10gfCBbXHUwRTk5LVx1MEU5Rl0gfCBbXHUwRUExLVx1MEVBM10gfCBcdTBFQTUgfCBcdTBFQTcgfCBbXHUwRUFBLVx1MEVBQl0gfCBbXHUwRUFELVx1MEVBRV0gfCBcdTBFQjAgfCBbXHUwRUIyLVx1MEVCM10gfCBcdTBFQkQgfCBbXHUwRUMwLVx1MEVDNF0gfCBbXHUwRjQwLVx1MEY0N10gfCBbXHUwRjQ5LVx1MEY2OV0gfCBbXHUxMEEwLVx1MTBDNV0gfCBbXHUxMEQwLVx1MTBGNl0gfCBcdTExMDAgfCBbXHUxMTAyLVx1MTEwM10gfCBbXHUxMTA1LVx1MTEwN10gfCBcdTExMDkgfCBbXHUxMTBCLVx1MTEwQ10gfCBbXHUxMTBFLVx1MTExMl0gfCBcdTExM0MgfCBcdTExM0UgfCBcdTExNDAgfCBcdTExNEMgfCBcdTExNEUgfCBcdTExNTAgfCBbXHUxMTU0LVx1MTE1NV0gfCBcdTExNTkgfCBbXHUxMTVGLVx1MTE2MV0gfCBcdTExNjMgfCBcdTExNjUgfCBcdTExNjcgfCBcdTExNjkgfCBbXHUxMTZELVx1MTE2RV0gfCBbXHUxMTcyLVx1MTE3M10gfCBcdTExNzUgfCBcdTExOUUgfCBcdTExQTggfCBcdTExQUIgfCBbXHUxMUFFLVx1MTFBRl0gfCBbXHUxMUI3LVx1MTFCOF0gfCBcdTExQkEgfCBbXHUxMUJDLVx1MTFDMl0gfCBcdTExRUIgfCBcdTExRjAgfCBcdTExRjkgfCBbXHUxRTAwLVx1MUU5Ql0gfCBbXHUxRUEwLVx1MUVGOV0gfCBbXHUxRjAwLVx1MUYxNV0gfCBbXHUxRjE4LVx1MUYxRF0gfCBbXHUxRjIwLVx1MUY0NV0gfCBbXHUxRjQ4LVx1MUY0RF0gfCBbXHUxRjUwLVx1MUY1N10gfCBcdTFGNTkgfCBcdTFGNUIgfCBcdTFGNUQgfCBbXHUxRjVGLVx1MUY3RF0gfCBbXHUxRjgwLVx1MUZCNF0gfCBbXHUxRkI2LVx1MUZCQ10gfCBcdTFGQkUgfCBbXHUxRkMyLVx1MUZDNF0gfCBbXHUxRkM2LVx1MUZDQ10gfCBbXHUxRkQwLVx1MUZEM10gfCBbXHUxRkQ2LVx1MUZEQl0gfCBbXHUxRkUwLVx1MUZFQ10gfCBbXHUxRkYyLVx1MUZGNF0gfCBbXHUxRkY2LVx1MUZGQ10gfCBcdTIxMjYgfCBbXHUyMTJBLVx1MjEyQl0gfCBcdTIxMkUgfCBbXHUyMTgwLVx1MjE4Ml0gfCBbXHUzMDQxLVx1MzA5NF0gfCBbXHUzMEExLVx1MzBGQV0gfCBbXHUzMTA1LVx1MzEyQ10gfCBbXHVBQzAwLVx1RDdBM10gIAotCi0vKiA4NiAqLwotSWRlb2dyYXBoaWMgICAgPSAgICBbXHU0RTAwLVx1OUZBNV0gfCBcdTMwMDcgfCBbXHUzMDIxLVx1MzAyOV0gIAotCi0vKiA0ICovICAvKiBpcyAnLicgdG8gYmUgZXNjYXBlZD8/ICovCi1OYW1lQ2hhciAgICAgICA9ICAgIHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IC4gfCAtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9Ci0KLS8qIDUgKi8KLU5hbWUgICAgICAgICAgID0gKHtMZXR0ZXJ9IHwgXyB8IDopIHtOYW1lQ2hhcn0qIAotCi0vKiA4NyAqLwotQ29tYmluaW5nQ2hhciAgPSAgICBbXHUwMzAwLVx1MDM0NV0gfCBbXHUwMzYwLVx1MDM2MV0gfCBbXHUwNDgzLVx1MDQ4Nl0gfCBbXHUwNTkxLVx1MDVBMV0gfCBbXHUwNUEzLVx1MDVCOV0gfCBbXHUwNUJCLVx1MDVCRF0gfCBcdTA1QkYgfCBbXHUwNUMxLVx1MDVDMl0gfCBcdTA1QzQgfCBbXHUwNjRCLVx1MDY1Ml0gfCBcdTA2NzAgfCBbXHUwNkQ2LVx1MDZEQ10gfCBbXHUwNkRELVx1MDZERl0gfCBbXHUwNkUwLVx1MDZFNF0gfCBbXHUwNkU3LVx1MDZFOF0gfCBbXHUwNkVBLVx1MDZFRF0gfCBbXHUwOTAxLVx1MDkwM10gfCBcdTA5M0MgfCBbXHUwOTNFLVx1MDk0Q10gfCBcdTA5NEQgfCBbXHUwOTUxLVx1MDk1NF0gfCBbXHUwOTYyLVx1MDk2M10gfCBbXHUwOTgxLVx1MDk4M10gfCBcdTA5QkMgfCBcdTA5QkUgfCBcdTA5QkYgfCBbXHUwOUMwLVx1MDlDNF0gfCBbXHUwOUM3LVx1MDlDOF0gfCBbXHUwOUNCLVx1MDlDRF0gfCBcdTA5RDcgfCBbXHUwOUUyLVx1MDlFM10gfCBcdTBBMDIgfCBcdTBBM0MgfCBcdTBBM0UgfCBcdTBBM0YgfCBbXHUwQTQwLVx1MEE0Ml0gfCBbXHUwQTQ3LVx1MEE0OF0gfCBbXHUwQTRCLVx1MEE0RF0gfCBbXHUwQTcwLVx1MEE3MV0gfCBbXHUwQTgxLVx1MEE4M10gfCBcdTBBQkMgfCBbXHUwQUJFLVx1MEFDNV0gfCBbXHUwQUM3LVx1MEFDOV0gfCBbXHUwQUNCLVx1MEFDRF0gfCBbXHUwQjAxLVx1MEIwM10gfCBcdTBCM0MgfCBbXHUwQjNFLVx1MEI0M10gfCBbXHUwQjQ3LVx1MEI0OF0gfCBbXHUwQjRCLVx1MEI0RF0gfCBbXHUwQjU2LVx1MEI1N10gfCBbXHUwQjgyLVx1MEI4M10gfCBbXHUwQkJFLVx1MEJDMl0gfCBbXHUwQkM2LVx1MEJDOF0gfCBbXHUwQkNBLVx1MEJDRF0gfCBcdTBCRDcgfCBbXHUwQzAxLVx1MEMwM10gfCBbXHUwQzNFLVx1MEM0NF0gfCBbXHUwQzQ2LVx1MEM0OF0gfCBbXHUwQzRBLVx1MEM0RF0gfCBbXHUwQzU1LVx1MEM1Nl0gfCBbXHUwQzgyLVx1MEM4M10gfCBbXHUwQ0JFLVx1MENDNF0gfCBbXHUwQ0M2LVx1MENDOF0gfCBbXHUwQ0NBLVx1MENDRF0gfCBbXHUwQ0Q1LVx1MENENl0gfCBbXHUwRDAyLVx1MEQwM10gfCBbXHUwRDNFLVx1MEQ0M10gfCBbXHUwRDQ2LVx1MEQ0OF0gfCBbXHUwRDRBLVx1MEQ0RF0gfCBcdTBENTcgfCBcdTBFMzEgfCBbXHUwRTM0LVx1MEUzQV0gfCBbXHUwRTQ3LVx1MEU0RV0gfCBcdTBFQjEgfCBbXHUwRUI0LVx1MEVCOV0gfCBbXHUwRUJCLVx1MEVCQ10gfCBbXHUwRUM4LVx1MEVDRF0gfCBbXHUwRjE4LVx1MEYxOV0gfCBcdTBGMzUgfCBcdTBGMzcgfCBcdTBGMzkgfCBcdTBGM0UgfCBcdTBGM0YgfCBbXHUwRjcxLVx1MEY4NF0gfCBbXHUwRjg2LVx1MEY4Ql0gfCBbXHUwRjkwLVx1MEY5NV0gfCBcdTBGOTcgfCBbXHUwRjk5LVx1MEZBRF0gfCBbXHUwRkIxLVx1MEZCN10gfCBcdTBGQjkgfCBbXHUyMEQwLVx1MjBEQ10gfCBcdTIwRTEgfCBbXHUzMDJBLVx1MzAyRl0gfCBcdTMwOTkgfCBcdTMwOUEgIAotCi0vKiA4OCAqLwotRGlnaXQgICAgICAgICAgPSAgICBbXHUwMDMwLVx1MDAzOV0gfCBbXHUwNjYwLVx1MDY2OV0gfCBbXHUwNkYwLVx1MDZGOV0gfCBbXHUwOTY2LVx1MDk2Rl0gfCBbXHUwOUU2LVx1MDlFRl0gfCBbXHUwQTY2LVx1MEE2Rl0gfCBbXHUwQUU2LVx1MEFFRl0gfCBbXHUwQjY2LVx1MEI2Rl0gfCBbXHUwQkU3LVx1MEJFRl0gfCBbXHUwQzY2LVx1MEM2Rl0gfCBbXHUwQ0U2LVx1MENFRl0gfCBbXHUwRDY2LVx1MEQ2Rl0gfCBbXHUwRTUwLVx1MEU1OV0gfCBbXHUwRUQwLVx1MEVEOV0gfCBbXHUwRjIwLVx1MEYyOV0gIAotCi0vKiA4OSAqLwotRXh0ZW5kZXIgICAgICAgPSAgICBcdTAwQjcgfCBcdTAyRDAgfCBcdTAyRDEgfCBcdTAzODcgfCBcdTA2NDAgfCBcdTBFNDYgfCBcdTBFQzYgfCBcdTMwMDUgfCBbXHUzMDMxLVx1MzAzNV0gfCBbXHUzMDlELVx1MzA5RV0gfCBbXHUzMEZDLVx1MzBGRV0gIAotKi8KLQotTGV0dGVyICAgICAgICAgPSBbYS16QS1aXQotTmFtZUNoYXIgICAgICAgPSB7TGV0dGVyfSB8IFswLTldCi0vL05hbWUgICAgICAgICAgID0gKHtMZXR0ZXJ9IHwgXyB8IDopIHtOYW1lQ2hhcn0qIAotLy9OYW1lICAgICAgICAgICA9IFteXHgyMFx4MDlceDBEXHgwQV0rCi1OYW1lICAgICAgICAgICA9IFteXHgyMFx4MDlceDBEXHgwQVx8LFwhXD9cK1wqXChcKTw+XSsKLUVsZW1lbnRSZWZOYW1lID0gW15ceDIwXHgwOVx4MERceDBBXHwsXD9cK1wqXChcKTw+XSsKLUVudGl0eU5hbWUgICAgID0gW15ceDIwXHgwOVx4MERceDBBXHwsXD9cKlwoXCk8Pl0rCi1QYXJtRW50aXR5TmFtZSA9IFteXHgyMFx4MDlceDBEXHgwQVwhJTs8Pl0rCi0KLUNvbW1lbnRTdGFydCAgID0gXCEtLQotQ29tbWVudENvbnRlbnQgPSBbXi0+XSsKLUNvbW1lbnRFbmQgICAgID0gLS0+Ci1FbGVtZW50U3RhcnQgICA9IEVMRU1FTlQKLUVsZW1lbnRDb250ZW50ID0gW148Pl0qCi0KLUVudGl0eVN0YXJ0ICAgID0gRU5USVRZCi1FbnRpdHlfUGFybSAgICA9ICV7U30KLUVudGl0eUNvbnRlbnQgID0ge1N9W148Pl0qCi0KLU5vdGF0aW9uU3RhcnQgID0gTk9UQVRJT04KLU5vdGF0aW9uQ29udGVudCA9IHtTfVtePD5dKgotQXR0TGlzdCAgICAgICAgPSBBVFRMSVNUCi1FeHRlcm5hbFBhcm1FbnRpdHlSZWYgPSAle1Bhcm1FbnRpdHlOYW1lfTsKLUVuZFRhZyAgICAgICAgID0gPgotU3RhcnRUYWcgICAgICAgPSA8Ci1TeXN0ZW0gICAgICAgICA9IFNZU1RFTQotUHVibGljICAgICAgICAgPSBQVUJMSUMKLU5EYXRhICAgICAgICAgID0gTkRBVEEKLQotLy8gdGhlc2UgYXJlIGF0dHJpYnV0ZSB0eXBlIGtleXdvcmRzCi0vLyAgIHdlIHJldXNlIE5PVEFUSU9OIGZyb20gTm90YXRpb25TdGFydAotLy8gICB3ZSByZXVzZSBFTlRJVFkgZnJvbSBFbnRpdHlTdGFydAotQ0RhdGEgICAgICAgICAgPSBDREFUQQotSUQgICAgICAgICAgICAgPSBJRAotSURSZWYgICAgICAgICAgPSBJRFJFRgotSURSZWZzICAgICAgICAgPSBJRFJFRlMKLUVudGl0aWVzICAgICAgID0gRU5USVRJRVMKLU5NVG9rZW4gICAgICAgID0gTk1UT0tFTgotTk1Ub2tlbnMgICAgICAgPSBOTVRPS0VOUwotCi0vLyB0aGVzZSBhcmUgYXR0cmlidXRlIGRlZmF1bHRzIGtleXdvcmRzCi1SZXF1aXJlZCAgICAgICA9ICNSRVFVSVJFRAotSW1wbGllZCAgICAgICAgPSAjSU1QTElFRAotRml4ZWQgICAgICAgICAgPSAjRklYRUQKLQotCi1FbXB0eSAgICAgICAgICA9IEVNUFRZCi1BbnkgICAgICAgICAgICA9IEFOWQotUGNEYXRhICAgICAgICAgPSAjUENEQVRBCi1MZWZ0UGFyZW4gICAgICA9IFwoCi1SaWdodFBhcmVuICAgICA9IFwpCi0KLVBlcmNlbnQgICAgICAgID0gJQotU2VtaWNvbG9uICAgICAgPSA7Ci1QbHVzICAgICAgICAgICA9IFwrCi1DaG9pY2UgID0gXHwKLVNlcXVlbmNlID0gLAotQ29ubmVjdG9yICAgICAgPSB7Q2hvaWNlfXx7U2VxdWVuY2V9Ci1PY2N1ck9wdGlvbmFsICA9IFw/Ci1PY2N1ck9uZU9yTW9yZSA9IFwrCi1PY2N1clplcm9Pck1vcmUgPSBcKgotT2NjdXJUeXBlICAgICAgPSB7T2NjdXJPcHRpb25hbH18e09jY3VyT25lT3JNb3JlfXx7T2NjdXJaZXJvT3JNb3JlfQotRXhjbGFtYXRpb24gICA9IFwhCi1TaW5nbGVRdW90ZWRMaXRlcmFsID0gJ1teJ10qJwotRG91YmxlUXVvdGVkTGl0ZXJhbCA9IFwiW15cIl0qXCIKLU5vblRhZ0NvbnRlbnQgPSBbXlx4MjBceDA5XHgwRFx4MEE8Pl0qCi1Ob25FbnVtQ29udGVudCA9IFteXHgyMFx4MDlceDBEXHgwQTw+XChcKVx8XSoKLQotJSUKLQotPFlZSU5JVElBTD4gewotICB7U3RhcnRUYWd9ICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRyk7IH0KLSAge0VuZFRhZ30gICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTkRfVEFHKTsgfQotICB7RXhjbGFtYXRpb259ICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKTsgfQotICB7UGVyY2VudH0gICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOyB9Ci0gIHtTZW1pY29sb259ICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0VNSUNPTE9OKTsgfQotCi0gIHtFbGVtZW50U3RhcnR9ICAgeyB5eWJlZ2luKEVMRU1FTlRfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7IH0KLSAge0NvbW1lbnRTdGFydH0gICB7IHl5YmVnaW4oQ09NTUVOVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOyB9Ci0gIHtFbnRpdHlTdGFydH0gICAgeyB5eWJlZ2luKEVOVElUWV9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOyB9Ci0gIHtOb3RhdGlvblN0YXJ0fSAgeyB5eWJlZ2luKE5PVEFUSU9OX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsgfQotICB7QXR0TGlzdH0gICAgICAgIHsgeXliZWdpbihBVFRMSVNUX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOyB9Ci0KLSAge0V4dGVybmFsUGFybUVudGl0eVJlZn0gICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSk7IH0KLS8vIGp1c3QgYSBwYXJtZW50aXR5bmFtZSBieSBpdHNlbGYgaXMgbm8gZ29vZC4gIHdlIHVzZSB0aGlzCi0vLyB0byBjYXB0dXJlIGdhcmJhZ2UgY29udGVudCBhdCB0aGUgdG9wIGxldmVsCi0gIHtQYXJtRW50aXR5TmFtZX0gICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotCi0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLX0KLQotPEVMRU1FTlRfTkFNRT4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtQY0RhdGF9fFwoe1N9KntQY0RhdGF9e1N9KlwpIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsgfQotICB7TmFtZX0gICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Ci0KLSAge0xlZnRQYXJlbn0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgfQotICB7Q29ubmVjdG9yfSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUik7IH0gICAgCi0gIHtPY2N1clR5cGV9ICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSk7IH0KLSAge1JpZ2h0UGFyZW59ICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTik7IH0KLQotICB7U3RhcnRUYWd9ICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci0gIHtFbmRUYWd9ICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotLy8gKioqKioqKiogPCFBVFRMSVNULi4uPgotPEFUVExJU1RfTkFNRT4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtOYW1lfSAgICAgICAgICAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotICB7Tm9uVGFnQ29udGVudH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxBVFRMSVNUX0NPTlRFTlQ+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7TmFtZX0gICAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08QVRUUklCVVRFX0NPTlRFTlQ+IHsKLSAge0xpbmVUZXJtaW5hdG9yfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgfQotICB7Tm9uTGluZVRlcm1pbmF0b3JXaGl0ZXNwYWNlfQotICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtDRGF0YX0gICAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQpOyB9ICAKLQotICB7SUR9ICAgICAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEKTsgfSAgICAgICAKLSAge0lEUmVmfSAgICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCk7IH0gIAotICB7SURSZWZzfSAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRFJFRlNfS0VZV09SRCk7IH0gIAotICB7RW50aXR5U3RhcnR9ICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCk7IH0gIAotICB7RW50aXRpZXN9ICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JEKTsgfSAgCi0gIHtOTVRva2VufSAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5NVE9LRU5fS0VZV09SRCk7IH0gIAotICB7Tk1Ub2tlbnN9ICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEKTsgfSAgCi0gIHtOb3RhdGlvblN0YXJ0fSAgeyB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JEKTsgfSAgCi0KLSAge1JlcXVpcmVkfSB8IHtJbXBsaWVkfSB8IHtGaXhlZH0gfCB7U2luZ2xlUXVvdGVkTGl0ZXJhbH0gfCB7IERvdWJsZVF1b3RlZExpdGVyYWx9Ci0gICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgfQotCi0gIHtMZWZ0UGFyZW59ICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7IH0gIAotICB7Tm9uRW51bUNvbnRlbnR9IHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QQVJNX0VOVElUWV9UWVBFKTsgfQotICB7Tm9uRW51bUNvbnRlbnR9fHtSaWdodFBhcmVufXx7Q2hvaWNlfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEFUVFJJQlVURV9ERUZBVUxUPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1JlcXVpcmVkfSAgICAgICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQpOyB9Ci0gIHtJbXBsaWVkfSAgICAgICAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQpOyB9Ci0gIHtGaXhlZH0gICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRklYRURfS0VZV09SRCk7IH0KLSAge1NpbmdsZVF1b3RlZExpdGVyYWx9ICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7RG91YmxlUXVvdGVkTGl0ZXJhbH0gIHsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyB9IC8vcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxBVFRSSUJVVEVfRU5VTUVSQVRJT04+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7TGVmdFBhcmVufSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyB9Ci0gIHtDaG9pY2V9ICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5VTV9DSE9JQ0UpOyB9Ci0gIHtSaWdodFBhcmVufSAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKTsgfQotICB7Tm9uRW51bUNvbnRlbnR9ICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLQotLy8gKioqKioqKiogPCFFTlRJVFkuLi4+Ci08RU5USVRZX05BTUU+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7UGVyY2VudH0gICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOyB9Ci0gIHtFbnRpdHlOYW1lfSAgICAgeyB5eWJlZ2luKEVOVElUWV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08RU5USVRZX0NPTlRFTlQ+IHsKLS8vICB7RW50aXR5Q29udGVudH0geyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfQ09OVEVOVCk7IH0KLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7U3lzdGVtfSB8IHtQdWJsaWN9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihFWFRFUk5BTElEX0NPTlRFTlQpOyB9Ci0gIHtTaW5nbGVRdW90ZWRMaXRlcmFsfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtEb3VibGVRdW90ZWRMaXRlcmFsfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLQotLy8gKioqKioqKiogPCFOT1RBVElPTi4uLj4KLTxOT1RBVElPTl9OQU1FPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge05hbWV9ICAgICAgICAgICB7IHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08RVhURVJOQUxJRF9DT05URU5UPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1N5c3RlbX0gICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCk7IH0gIAotICB7UHVibGljfSAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JEKTsgfSAgCi0gIHtTaW5nbGVRdW90ZWRMaXRlcmFsfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtEb3VibGVRdW90ZWRMaXRlcmFsfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtORGF0YX0gICAgICAgICAgeyB5eWJlZ2luKE5EQVRBX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPE5EQVRBX0NPTlRFTlQ+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7Tm9uVGFnQ29udGVudH0gIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotICAKLQotLy8gKioqKioqKiogPCEtLSAuLi4+Ci08Q09NTUVOVF9DT05URU5UPiB7Ci0gIHtDb21tZW50RW5kfSAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCk7IH0KLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7Q29tbWVudENvbnRlbnR9IHwgIi0iIHwgIj4iICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQpOyB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkc2tlbGV0b24gYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGRza2VsZXRvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiZTA4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGRza2VsZXRvbgorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotLS0tIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9CVUZGRVJTSVpFID0gLi4uOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotLS0tICBsZXhpY2FsIHN0YXRlcywgY2hhcm1hcAotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0tLS0gaXNGaW5hbCBsaXN0Ci0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhcltZWV9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgaW50IHl5Y29sdW1uOyAKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLS0tLSB1c2VyIGNsYXNzIGNvZGUKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotLS0tIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uCi0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X3JlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7ICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHl5X3JlYWRlciAhPSBudWxsKQotICAgICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgc3RyZWFtLCBhbmQgcmVzZXRzIHRoZQotICAgKiBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WVlfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5Y2xvc2UoKTsKLSAgICB5eV9yZWFkZXIgPSByZWFkZXI7Ci0gICAgeXlfYXRFT0YgID0gZmFsc2U7Ci0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zID0gMDsKLSAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBmaW5hbCBwdWJsaWMgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLS0tLSB5eV9TY2FuRXJyb3IgZGVjbGFyYXRpb24gIAotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWVlfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLS0tLSB0aHJvd3MgY2xhdXNlCi0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLS0tLSB5eXB1c2hiYWNrIGRlY2wgKGNvbnRhaW5zIHl5X1NjYW5FcnJvciBleGNlcHRpb24pCi0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0tLS0geXlfZG9Fb2YKLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLS0tLSB5eWxleCBkZWNsYXJhdGlvbgotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgeXlfY3VycmVudFBvc19sOwotICAgIGludCB5eV9tYXJrZWRQb3NfbDsKLSAgICBpbnQgeXlfZW5kUmVhZF9sID0geXlfZW5kUmVhZDsKLSAgICBjaGFyIFtdIHl5X2J1ZmZlcl9sID0geXlfYnVmZmVyOwotICAgIGNoYXIgW10geXljbWFwX2wgPSB5eWNtYXA7Ci0KLS0tLSBsb2NhbCBkZWNsYXJhdGlvbnMKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X21hcmtlZFBvczsKLQotLS0tIHN0YXJ0IGFkbWluIChsaW5lLCBjaGFyLCBjb2wgY291bnQpCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvc19sID0geXlfY3VycmVudFBvcyA9IAotICAgICAgICAgICAgICAgICAgICAgICB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3NfbDsKLSAgCi0tLS0gc3RhcnQgYWRtaW4gKGxleHN0YXRlIGV0YykKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0tLS0gbmV4dCBpbnB1dCwgbGluZSwgY29sLCBjaGFyIGNvdW50LCBuZXh0IHRyYW5zaXRpb24sIGlzRmluYWwgYWN0aW9uCi0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X2N1cnJlbnRQb3NfbDsgCi0tLS0gbGluZSBjb3VudCB1cGRhdGUKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgeXlfbWFya2VkUG9zID0geXlfbWFya2VkUG9zX2w7Ci0tLS0gY2hhciBjb3VudCB1cGRhdGUKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsKLQotLS0tIGFjdGlvbnMKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0tLS0gZW9mdmFsdWUKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotLS0tIG5vIG1hdGNoCi0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0tLS0gbWFpbgotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREQmF0Y2hOb2RlRGVsZXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREQmF0Y2hOb2RlRGVsZXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTE0ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RUREJhdGNoTm9kZURlbGV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERCYXRjaE5vZGVEZWxldGUgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBEVERCYXRjaE5vZGVEZWxldGUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJLy8gZmlyc3QgY2hlY2sgaWYgdGhlIG5vZGUgaXMgY29udGFpbmVkIGJ5IGFueW9uZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQotCQkJaWYgKGN1cnJlbnROb2RlLmNvbnRhaW5zUmFuZ2Uobm9kZS5nZXRTdGFydE9mZnNldCgpLCBub2RlLmdldEVuZE9mZnNldCgpKSkgewotCQkJCS8vIHRoZW4gbm8gbmVlZCB0byBhZGQgdGhlIG5vZGUgdG8gdGhlIGxpc3QgdG8gYmUgZGVsZXRlZAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgJiYgbm9kZS5nZXRFbmRPZmZzZXQoKSA8PSBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJbm9kZXMuYWRkKGksIG5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBnZXQgaGVyZSwgdGhlbiBhZGQgaXQgdG8gdGhlIGVuZAotCQlub2Rlcy5hZGQobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlTm9kZXMoT2JqZWN0IHJlcXVlc3RvcikgewotCQlmb3IgKGludCBpID0gbm9kZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQlkdGRGaWxlLmRlbGV0ZU5vZGUocmVxdWVzdG9yLCBub2RlKTsKLQkJfQotCQlub2Rlcy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4NTNiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci0KLQotLyoKLSAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIHRoZSBtb2RlbCB3aGVuIGl0ZW1zIGFyZSBkZWxldGVkIG9yCi0gKiBzbyB0aGF0IGl0ZW1zIHJlZmVyZW5jZWQgYnkgaXQgYXJlIGNsZWFuZWQgdXAgbm90ZSB0aGF0IHRvcCBsZXZlbCBub2RlcyBhcmUKLSAqIHF1ZXVlZCB1cCBmb3IgZGVsZXRpb24gc28gdGhhdCBpdGVyYXRpb24gb3ZlciB0aGUgbGlzdCBvZiBub2RlcyBmcm9tIHRoZQotICogZHRkZmlsZSBpcyBub3QgbWVzc2VkIHVwLiBOb3RlIHRoYXQgd2hlbiBhbiBleHRlcm5hbCBwYXJtZXRlciBlbnRpdHkKLSAqIGNoYW5nZXMsIHRoZSBjbGllbnQgb2YgdGhlIG1vZGVsIChlLmcuIGVkaXRvcikgbXVzdCBiZSBhIERUREZpbGVMaXN0ZW5lcgotICogaW1wbGVtZW50aW5nIHRoZSBsaXN0ZW5lcidzIGludGVyZmFjZSB0byBrZWVwIHRoZSBtb2RlbCdzIHJlZmVyZW50aWFsCi0gKiBpbnRlZ3JpdHkgKFNlZSBEVERNb2RlbEltcGwgZm9yIGV4YW1wbGUpLgotICovCi0KLXB1YmxpYyBjbGFzcyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQotCXByb3RlY3RlZCBEVERCYXRjaE5vZGVEZWxldGUgYmF0Y2hEZWxldGU7Ci0JcHJvdGVjdGVkIExpc3QgZXh0ZXJuYWxFbGVtZW50c0FuZFBhcm1FbnRpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFybUVudGl0eSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBEVEROb2RlIG5vZGVUb0RlbGV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFJlZk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcigpIHsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBleHRlcm5hbFJlZmVyZW5jZUFib3V0VG9DaGFuZ2UoT2JqZWN0IHJlcXVlc3RvciwgRW50aXR5IGVudGl0eSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgfHwgIWVudGl0eS5pc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCS8vIGlmIGl0IGlzIG5vdCBhbiBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCi0JCURUREZpbGUgZHRkRmlsZSA9IGVudGl0eS5nZXREVERGaWxlKCk7Ci0JCWlmIChiYXRjaERlbGV0ZSA9PSBudWxsKSB7Ci0JCQliYXRjaERlbGV0ZSA9IG5ldyBEVERCYXRjaE5vZGVEZWxldGUoZHRkRmlsZSk7Ci0JCX0KLQotCQkvLyBTZWUgdGhlIGNvbW1lbnQgYXQgdGhlIGhlYWQgb2YgdGhpcyBmaWxlIHJlZ2FyZGluZwotCQkvLyBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMuCi0JCS8vIGV4dGVybmFsRWxlbWVudHNBbmRQYXJtRW50aXRpZXMgPQotCQkvLyBkdGRGaWxlLmdldERURE1vZGVsKCkuZ2V0RXh0ZXJuYWxNb2RlbHMoKS5nZXRFbGVtZW50Q29udGVudE5hbWVzKGVudGl0eS5nZXRQdWJsaWNJRCgpLAotCQkvLyBkdGRGaWxlLmdldERURE1vZGVsKCkucmVzb2x2ZUlEKGVudGl0eS5nZXRQdWJsaWNJRCgpLAotCQkvLyBlbnRpdHkuZ2V0U3lzdGVtSUQoKSkpOwotCi0JCXZpc2l0KGR0ZEZpbGUpOwotCi0JCWJhdGNoRGVsZXRlLmRlbGV0ZU5vZGVzKHJlcXVlc3Rvcik7Ci0KLQkJaXNVcGRhdGluZyA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBleHRlcm5hbEVsZW1lbnRzQW5kUGFybUVudGl0aWVzLmNvbnRhaW5zKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJU3RyaW5nIGF0dHJUeXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0KLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGF0dHJOYW1lKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGF0dHJOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGF0dHJUeXBlKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGF0dHJUeXBlKSkgewotCQkJCWF0dHIuc2V0VHlwZShyZXF1ZXN0b3IsIEF0dHJpYnV0ZS5DREFUQSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlTGlzdChhdHRMaXN0KTsKLQkJU3RyaW5nIGF0dExpc3ROYW1lID0gYXR0TGlzdC5nZXROYW1lKCk7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihhdHRMaXN0TmFtZSkpIHsKLQkJCWlmIChpc01hdGNoaW5nTmFtZShhdHRMaXN0TmFtZSkpIHsKLQkJCQlhdHRMaXN0LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGVsZW1lbnROYW1lKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGVsZW1lbnROYW1lKSkgewotCQkJCWVsZW1lbnQuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0JCVN0cmluZyByZWZOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCWlmIChpc01hdGNoaW5nTmFtZShyZWZOYW1lKSkgewotCQkJYmF0Y2hEZWxldGUuYWRkTm9kZShub2RlKTsKLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETW9kZWxVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETW9kZWxVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOWNkZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE1vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci0KLQotLy8gdGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgdGhlIG1vZGVsIHdoZW4gaXRlbXMKLS8vIGFyZSBkZWxldGVkIG9yIGEgZXh0ZXJuYWwgcGFybSBlbnRpdHkgY2hhbmdlcyBzbyB0aGF0Ci0vLyBpdGVtcyByZWZlcmVuY2VkIGJ5IGl0IGFyZSBjbGVhbmVkIHVwCi0vLyBub3RlIHRoYXQgdG9wIGxldmVsIG5vZGVzIGFyZSBxdWV1ZWQgdXAgZm9yIGRlbGV0aW9uIHNvIHRoYXQKLS8vIGl0ZXJhdGlvbiBvdmVyIHRoZSBsaXN0IG9mIG5vZGVzIGZyb20gdGhlIGR0ZGZpbGUgaXMgbm90IG1lc3NlZCB1cAotcHVibGljIGNsYXNzIERURE1vZGVsVXBkYXRlciBleHRlbmRzIERURFZpc2l0b3IgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0aW5nID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBub2Rlc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBEVEROb2RlIG5vZGVUb0RlbGV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFJlZk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERURE1vZGVsVXBkYXRlcigpIHsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvYmplY3RBYm91dFRvQmVEZWxldGVkKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgbm9kZSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7Ci0JCQkvLyBqdXN0IGlnbm9yZSBpZiBpdCBpcyBub3Qgb25lIG9mIHRoZXNlCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgISgoRW50aXR5KSBub2RlKS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBub3QgYSBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQotCQlpc1VwZGF0aW5nID0gdHJ1ZTsKLQkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0JCXRoaXMubm9kZVRvRGVsZXRlID0gbm9kZTsKLQkJb2xkUmVmTmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQlpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQkJbm9kZXNUb0RlbGV0ZS5jbGVhcigpOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlpc1Bhcm1FbnRpdHkgPSB0cnVlOwotCQkJb2xkUmVmTmFtZSA9ICIlIiArIG9sZFJlZk5hbWUgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJRFRERmlsZSBkdGRGaWxlID0gbm9kZS5nZXREVERGaWxlKCk7Ci0JCXZpc2l0KGR0ZEZpbGUpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXNUb0RlbGV0ZS5zaXplKCk7IGkrKykgewotCQkJZHRkRmlsZS5kZWxldGVOb2RlKHJlcXVlc3RvciwgKERURE5vZGUpIG5vZGVzVG9EZWxldGUuZ2V0KGkpKTsKLQkJfQotCi0JCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgewotCQlzdXBlci52aXNpdEF0dHJpYnV0ZShhdHRyKTsKLQkJaWYgKGlzUGFybUVudGl0eSkgewotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoYXR0ci5nZXRUeXBlKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJYXR0ci5zZXRUeXBlKHJlcXVlc3RvciwgQXR0cmlidXRlLkNEQVRBKTsKLQkJCX0KLQkJfQotCQkvLyBjaGVjayB0aGUgYXR0ciBuYW1lIGFuZCB0aGUgYXR0ciB0eXBlIHRvIHNlZSBpZiBpdAotCQkvLyBuZWVkcyB1cGRhdGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGVMaXN0KGF0dExpc3QpOwotCQlpZiAoYXR0TGlzdC5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQkJYXR0TGlzdC5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHNhdmUgdXAgZm9yIGxhdGVyIGRlbGV0aW9uCi0JCQkJbm9kZXNUb0RlbGV0ZS5hZGQoYXR0TGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQllbGVtZW50LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmKSB7Ci0JCXN1cGVyLnZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eVJlZik7Ci0JCWlmIChpc1Bhcm1FbnRpdHkgJiYgcGFybUVudGl0eVJlZi5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlub2Rlc1RvRGVsZXRlLmFkZChwYXJtRW50aXR5UmVmKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0KLQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJRFRETm9kZSBwYXJlbnQgPSAoRFRETm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlwYXJlbnQuZGVsZXRlKHJlcXVlc3Rvciwgbm9kZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjllNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlRW51bUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIERURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlciB7Ci0JcHJvdGVjdGVkIE5vdGF0aW9uIG5vdGF0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgbm90YXRpb25OYW1lOwotCi0JcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0b3I7Ci0KLQlwdWJsaWMgRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgbm90YXRpb25BYm91dFRvQmVEZWxldGVkKE9iamVjdCByZXF1ZXN0b3IsIE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCQl0aGlzLm5vdGF0aW9uID0gbm90YXRpb247Ci0JCW5vdGF0aW9uTmFtZSA9IG5vdGF0aW9uLmdldE5hbWUoKTsKLQotCQl2aXNpdChub3RhdGlvbi5nZXREVERGaWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0KERUREZpbGUgZmlsZSkgewotCQlMaXN0IG5vZGVzID0gZmlsZS5nZXROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXZpc2l0RW50aXR5KChFbnRpdHkpIGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCXZpc2l0QXR0cmlidXRlTGlzdCgoQXR0cmlidXRlTGlzdCkgY3VycmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJaWYgKGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OT1RBVElPTikpIHsKLQkJCUF0dHJpYnV0ZUVudW1MaXN0IGVudW1MaXN0ID0gYXR0ci5nZXRFbnVtTGlzdCgpOwotCQkJTGlzdCBub3RhdGlvbk5hbWVzID0gZW51bUxpc3QuZ2V0SXRlbXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBub3RhdGlvbk5hbWVzLml0ZXJhdG9yKCk7Ci0JCQlib29sZWFuIHVwZGF0ZVJlcXVpcmVkID0gZmFsc2U7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgbm90YXRpb24gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm90YXRpb24uZXF1YWxzKG5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJdXBkYXRlUmVxdWlyZWQgPSB0cnVlOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1cGRhdGVSZXF1aXJlZCkgewotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tub3RhdGlvbk5hbWVzLnNpemUoKV07Ci0JCQkJbm90YXRpb25OYW1lcy50b0FycmF5KG5ld0l0ZW1zKTsKLQkJCQllbnVtTGlzdC5zZXRJdGVtcyhyZXF1ZXN0b3IsIG5ld0l0ZW1zKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJQXR0cmlidXRlIGF0dHIgPSAoQXR0cmlidXRlKSBhdHRMaXN0LmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGF0dHIgIT0gbnVsbCkgewotCQkJdmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCQlhdHRyID0gKEF0dHJpYnV0ZSkgYXR0ci5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbnRpdHkoRW50aXR5IGVudGl0eSkgewotCQlpZiAoZW50aXR5LmdldE5vdGF0aW9uTmFtZSgpLmVxdWFscyhub3RhdGlvbk5hbWUpKSB7Ci0JCQllbnRpdHkuc2V0Tm90YXRpb25OYW1lKHJlcXVlc3RvciwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0vLyBEVEROb3RhdGlvblJlbW92ZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERSZWZlcmVuY2VVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREUmVmZXJlbmNlVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTkyOTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERSZWZlcmVuY2VVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUVudW1MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCi0KLS8vIHRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIGFueSBkdGQgbm9kZSBpbgotLy8gcmVzcG9uc2UgdG8gYSBjaGFuZ2UgaW4gdGhlIG5vZGUgdGhhdCB0aGV5IHJlZmVyZW5jZQotcHVibGljIGNsYXNzIERURFJlZmVyZW5jZVVwZGF0ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGF0aW9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5ld05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgb2xkUmVmTmFtZSA9ICIiLCBuZXdSZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByb3RlY3RlZCBEVEROb2RlIHJlZmVyZW5jZWROb2RlID0gbnVsbDsKLQotCS8vIHRoZSByZWZlcmVuY2VzIExpc3QgaXMgYSBjYWNoZSBvZiB0aGUgRFRETm9kZXMgdGhhdCBhcmUgY2hhbmdlZAotCS8vIGFzIGEgcmVzdWx0IG9mIGEgY2FsbCB0byBuYW1lQWJvdXRUb0NoYW5nZSgpLiBUaGUgaWRlYSBpcyB0aGF0Ci0JLy8gaWYgYSBzdWJzZXF1ZW50IGNhbGwgY29tZXMgaW4gdGhhdCBjaGFuZ2VzIHRoZSBuYW1lIG9mIHRoZSBzYW1lCi0JLy8gb2JqZWN0IGZvciB3aGljaCB0aGlzIGNhY2hlIGV4aXN0cyBmb3IsIHRoZW4gd2Ugb3B0aW1pemUgdGhlCi0JLy8gcGF0aCBieSBqdXN0IHdhbGtpbmcgdGhlIGNhY2hlCi0JcHJpdmF0ZSBMaXN0IHJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0b3I7Ci0KLQlwdWJsaWMgRFREUmVmZXJlbmNlVXBkYXRlcigpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0JCXJlZmVyZW5jZWROb2RlID0gbnVsbDsKLQkJcmVmZXJlbmNlcy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBuYW1lQWJvdXRUb0NoYW5nZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZWROb2RlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgRW50aXR5IHx8IHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCByZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKSkgewotCQkJLy8ganVzdCBpZ25vcmUgaWYgaXQgaXMgbm90IG9uZSBvZiB0aGVzZQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChyZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAhKChFbnRpdHkpIHJlZmVyZW5jZWROb2RlKS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBub3QgYSBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCQlvbGRSZWZOYW1lID0gcmVmZXJlbmNlZE5vZGUuZ2V0TmFtZSgpOwotCQl0aGlzLm5ld05hbWUgPSBuZXdSZWZOYW1lID0gbmV3TmFtZTsKLQkJaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0JCWlzTm90YXRpb24gPSByZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uOwotCi0JCWlmIChyZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJaXNQYXJtRW50aXR5ID0gdHJ1ZTsKLQkJCW9sZFJlZk5hbWUgPSAiJSIgKyBvbGRSZWZOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW5ld1JlZk5hbWUgPSAiJSIgKyBuZXdSZWZOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmICh0aGlzLnJlZmVyZW5jZWROb2RlICE9IG51bGwpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcmV2aW91cyByZWZlcmVuY2VkIG5vZGUgdGhhdCB3YXMgY2hhbmdlZAotCQkJLy8gaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB0aGF0IGlzIGNvbWluZyBpbi4gaWYgc28sIGp1c3QKLQkJCS8vIGNoYW5nZSB0aGUgcHJldmlvdXMgcmVnaW9ucwotCQkJaWYgKHRoaXMucmVmZXJlbmNlZE5vZGUgPT0gcmVmZXJlbmNlZE5vZGUpIHsKLQkJCQlxdWlja1VwZGF0ZSgpOwotCQkJCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbGVhciB0aGUgY2FjaGUgaWYgd2UgZ2V0IGhlcmUKLQkJdGhpcy5yZWZlcmVuY2VkTm9kZSA9IHJlZmVyZW5jZWROb2RlOwotCQlyZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IHJlZmVyZW5jZWROb2RlLmdldERUREZpbGUoKTsKLQkJdmlzaXQoZHRkRmlsZSk7Ci0JCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBxdWlja1VwZGF0ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQl2aXNpdEVsZW1lbnQoKEVsZW1lbnQpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQl2aXNpdEF0dHJpYnV0ZUxpc3QoKEF0dHJpYnV0ZUxpc3QpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCXZpc2l0QXR0cmlidXRlKChBdHRyaWJ1dGUpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJdmlzaXRSZWZlcmVuY2UoKENNQmFzaWNOb2RlKSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHsKLQkJCQl2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKChQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCS8vIGNoZWNrIHRoZSBhdHRyIG5hbWUgYW5kIHRoZSBhdHRyIHR5cGUgdG8gc2VlIGlmIGl0Ci0JCQkvLyBuZWVkcyB1cGRhdGluZwotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGF0dHIpOwotCQkJfQotCQkJaWYgKGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0VHlwZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGF0dHIpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzTm90YXRpb24gJiYgYXR0ci5nZXRUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZS5FTlVNRVJBVEVEX05PVEFUSU9OKSkgewotCQkJQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBhdHRyLmdldEVudW1MaXN0KCk7Ci0JCQlMaXN0IGl0ZW1zID0gZW51bUxpc3QuZ2V0SXRlbXMoKTsKLQkJCWJvb2xlYW4gdXBkYXRlTmVlZGVkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5vdGF0aW9uTmFtZSA9IChTdHJpbmcpIGl0ZW1zLmdldChpKTsKLQkJCQlpZiAobm90YXRpb25OYW1lLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCQl1cGRhdGVOZWVkZWQgPSB0cnVlOwotCQkJCQlpdGVtcy5zZXQoaSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVwZGF0ZU5lZWRlZCkgewotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tpdGVtcy5zaXplKCldOwotCi0JCQkJZW51bUxpc3Quc2V0SXRlbXMoKFN0cmluZ1tdKSBpdGVtcy50b0FycmF5KG5ld0l0ZW1zKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJaWYgKCFpc05vdGF0aW9uICYmIGF0dExpc3QuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJYXR0TGlzdC5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChhdHRMaXN0KTsKLQkJfQotCQlzdXBlci52aXNpdEF0dHJpYnV0ZUxpc3QoYXR0TGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQkJcmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYpIHsKLQkJc3VwZXIudmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShwYXJtRW50aXR5UmVmKTsKLQkJaWYgKHBhcm1FbnRpdHlSZWYuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJcGFybUVudGl0eVJlZi5zZXRSZWZlcmVuY2VkRW50aXR5KHJlcXVlc3RvciwgbmV3TmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChwYXJtRW50aXR5UmVmKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihvbGRSZWZOYW1lKSAmJiAhaXNQYXJtRW50aXR5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlub2RlLnNldE5hbWUocmVxdWVzdG9yLCBuZXdSZWZOYW1lKTsKLQkJCXJlZmVyZW5jZXMuYWRkKG5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDIxNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEVERVbmlxdWVOYW1lSGVscGVyIHsKLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlyZXR1cm4gKChFbnRpdHkpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gKChOb3RhdGlvbikgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gKChBdHRyaWJ1dGUpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSAvLyBNb2RlbCBHcm91cCBDb250ZW50Ci0JCXsKLQkJCXJldHVybiAoKENNQmFzaWNOb2RlKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVBdHRyaWJ1dGVOYW1lKEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IGF0dHJzID0gZWxlbWVudC5nZXRFbGVtZW50QXR0cmlidXRlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShhdHRycywgIk5ld0F0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBkdGRGaWxlLmdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpLmdldE5vZGVzKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVsZW1lbnRzLCAiTmV3RWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRW50aXR5TmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBlbnRpdGllcyA9IGR0ZEZpbGUuZ2V0RW50aXRpZXMoKS5nZXROb2RlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbnRpdGllcywgIk5ld0VudGl0eSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZShMaXN0IG9ianMsIFN0cmluZyB0b2tlbikgewotCQlpbnQgY291bnRlciA9IDE7Ci0KLQkJYm9vbGVhbiB1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCXdoaWxlICghdW5pcXVlTmFtZSkgewotCQkJU3RyaW5nIG5ld05hbWUgPSB0b2tlbiArIG5ldyBJbnRlZ2VyKGNvdW50ZXIrKyk7Ci0JCQl1bmlxdWVOYW1lID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBvYmpzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9iak5hbWUgPSBnZXROYW1lKG9iaik7Ci0JCQkJaWYgKG9iak5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCXVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVuaXF1ZU5hbWUpIHsKLQkJCQlyZXR1cm4gbmV3TmFtZTsKLQkJCX0KLQkJfQotCQkvLyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJcmV0dXJuICJObyBOYW1lIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5vdGF0aW9uTmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBub3RhdGlvbnMgPSBkdGRGaWxlLmdldE5vdGF0aW9ucygpLmdldE5vZGVzKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKG5vdGF0aW9ucywgIk5ld05vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFREVW5pcXVlTmFtZUhlbHBlcigpIHsKLQl9Ci0KLX0gLy8gRFREVW5pcXVlTmFtZUhlbHBlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiN2I3YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci0KLQotcHVibGljIGNsYXNzIERURFZpc2l0b3IgewotCi0JcHVibGljIERURFZpc2l0b3IoKSB7Ci0KLQl9Ci0KLQkvLyB1dGlsaXR5IG1ldGhvZAotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5UmVmKFN0cmluZyByZWZlcmVuY2UpIHsKLQkJaWYgKHJlZmVyZW5jZS5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiByZWZlcmVuY2UuY2hhckF0KDApID09ICclJyAmJiByZWZlcmVuY2UuY2hhckF0KHJlZmVyZW5jZS5sZW5ndGgoKSAtIDEpID09ICc7JzsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXQoRFRERmlsZSBmaWxlKSB7Ci0JCUxpc3Qgbm9kZXMgPSBmaWxlLmdldE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgbm9kZXMuZ2V0KGkpOwotCQkJaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCXZpc2l0RWxlbWVudCgoRWxlbWVudCkgY3VycmVudE5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJdmlzaXRBdHRyaWJ1dGVMaXN0KChBdHRyaWJ1dGVMaXN0KSBjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgewotCQkJCXZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgY3VycmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCS8vIG5vdGUgdGhhdCB3ZSBkb24ndCB2aXNpdCBhdHRyaWJ1dGVzIGhlcmUgYmVjYXVzZSB3ZQotCQkvLyB3YW50IHRoZSBlbGVtZW50IHRvIHZpc2l0IHRoZW0gd2l0aCBpdCdzIGNvbnNvbGlkYXRlZCBsaXN0Ci0JCS8vIHRoYXQgaXQgY3JlYXRlcyBieSBnYXRoZXJpbmcgYWxsIGF0dHJpYnV0ZSBsaXN0cyB0b2dldGhlcgotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlcyhMaXN0IGF0dHJpYnV0ZXMpIHsKLQkJaW50IHNpemUgPSBhdHRyaWJ1dGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQl2aXNpdEF0dHJpYnV0ZShhdHRyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q29udGVudE5vZGUoQ01Ob2RlIGNvbnRlbnQpIHsKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJQ01CYXNpY05vZGUgYmFzaWNOb2RlID0gKENNQmFzaWNOb2RlKSBjb250ZW50OwotCQkJaWYgKGJhc2ljTm9kZS5pc1JlZmVyZW5jZSgpKSB7Ci0JCQkJdmlzaXRSZWZlcmVuY2UoYmFzaWNOb2RlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCXZpc2l0R3JvdXBOb2RlKChDTUdyb3VwTm9kZSkgY29udGVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNTm9kZSBjb250ZW50ID0gZWxlbWVudC5nZXRDb250ZW50TW9kZWwoKTsKLQkJdmlzaXRDb250ZW50Tm9kZShjb250ZW50KTsKLQkJdmlzaXRBdHRyaWJ1dGVzKGVsZW1lbnQuZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eVJlZikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0R3JvdXBOb2RlKENNR3JvdXBOb2RlIGdyb3VwKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBncm91cC5nZXRDaGlsZHJlbkxpc3QoKTsKLQkJaW50IHNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl2aXNpdENvbnRlbnROb2RlKChDTU5vZGUpIGNoaWxkcmVuLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9MYWJlbFZhbHVlUGFpci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0xhYmVsVmFsdWVQYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0xhYmVsVmFsdWVQYWlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotcHVibGljIGNsYXNzIExhYmVsVmFsdWVQYWlyIHsKLQotCXB1YmxpYyBTdHJpbmcgZkxhYmVsOwotCXB1YmxpYyBPYmplY3QgZlZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBuYW1lL3ZhbHVlIGl0ZW0KLQkgKi8KLQlwdWJsaWMgTGFiZWxWYWx1ZVBhaXIoU3RyaW5nIGxhYmVsLCBPYmplY3QgdmFsdWUpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsYWJlbCAhPSBudWxsKTsKLQkJZkxhYmVsID0gbGFiZWw7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdGV4dC9JRFREUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90ZXh0L0lEVERQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjYyOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90ZXh0L0lEVERQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIERURC4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJRFREUGFydGl0aW9ucyB7Ci0JCi0JU3RyaW5nIERURF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTVmNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtcHJvcGVydGllcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ1NjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXJ1bnRpbWUKLWR0ZHVpLmphcgotKi56aXAKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNzNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjIwOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzkyMTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jU2F0IE1hciAyNCAwMjo1NzozNSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhMThmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmR0ZC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjQwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5kdGQudWksCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjQwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTc5ZTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICBEYXZpZCBDYXJ2ZXIsIFNUQVIgLSBhZGQgbmV3IGR0ZCBmaWxlIHRlbXBsYXRlcywgYnVnIDE2MjMyMQotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtcHJvcGVydGllcy8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9EVERGaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9EVERGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlZTUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RhZTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmI3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODIzNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjhmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2ZiNzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU1ZTVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTU4ZTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI1YTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2R0ZF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdkdGRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmNjM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmI3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODIzNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjhmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfeG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkNWRkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2dlbmVyYXRlX3htbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdkdGRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiMWE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0NvbW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0NvbW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTYxMWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Db21tZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDE1MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmE5YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Ob3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWQwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWM0MzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9uZXdkdGRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzExNWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzYzZiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzVkMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjE5NmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZHRkZmlsZV93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzZkNzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNWI1MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTURURCAtIFhNTCBUb29scyBEVEQgRWRpdG9yCi0hIFBhY2thZ2VkIGZvciB0cmFuc2xhdGlvbiBpbjogIHhtbC56aXAKLQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVNTRSBEVEQgU291cmNlIEVkaXRvcgotCi1EVERfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9RFREIEVkaXRvcgotX1VJX0xBQkVMX0RURF9GSUxFUz1EVEQgRmlsZXMKLURURF9UZW1wbGF0ZXMubmFtZT1UZW1wbGF0ZXMKLV9VSV9MQUJFTF9EVERfU1RZTEVTPVN0eWxlcwotRFREX1N5bnRheF9Db2xvcmluZz1TeW50YXggQ29sb3JpbmcKLV9VSV9XSVpBUkRfTkVXX0RURD1EVEQKLV9VSV9DUkVBVEVfTkVXX0RURF9GSUxFPUNyZWF0ZSBhIG5ldyBEVEQgZmlsZQotIyMKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLSMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIwotX1VJX01FTlVfVkFMSURBVEVfRFREICAgICAgICAgICAgICAgPSAmVmFsaWRhdGUgRFREIEZpbGUKLQotRFREX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgRFRECi1fVUlfTEFCRUxfR0VORVJBTD1HZW5lcmFsCi1fVUlfTEFCRUxfT1RIRVI9T3RoZXIKLV9VSV9MQUJFTF9BVFRSSUJVVEVTPUF0dHJpYnV0ZXMKLV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OPURvY3VtZW50YXRpb24KLSMjCi1wcmVmZXJlbmNlS2V5d29yZHMuZmlsZXM9ZWRpdG9yIGR0ZCBjcmVhdGluZyBmaWxlcyBzdWZmaXggc3BlY2lmaWVkCi1wcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzPWVkaXRvciBkdGQgdGVtcGxhdGVzIHNuaXBwZXQgbWFjcm9zCi1wcmVmZXJlbmNlS2V5d29yZHMuc3R5bGVzPWVkaXRvciBkdGQgc3R5bGUgY3VzdG9taXplIHN5bnRheCBoaWdobGlnaHRpbmcgdHlwZSB0ZXh0IGNvbnRlbnQgZm9yZWdyb3VuZCBiYWNrZ3JvdW5kIGJvbGQgY29sb3IKLQotQ29sb3JzLmR0ZERlZmF1bHQ9RFREIERlZmF1bHQKLUNvbG9ycy5kdGRUYWc9RFREIFRhZwotQ29sb3JzLmR0ZFRhZ05hbWU9RFREIFRhZyBOYW1lCi1Db2xvcnMuZHRkQ29tbWVudD1EVEQgQ29tbWVudAotQ29sb3JzLmR0ZEtleXdvcmQ9RFREIEtleXdvcmQKLUNvbG9ycy5kdGRTdHJpbmc9RFREIFN0cmluZwotQ29sb3JzLmR0ZERhdGE9RFREIERhdGEKLUNvbG9ycy5kdGRTeW1ib2w9RFREIFN5bWJvbAotCQkJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1YzI1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8IS0tIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIiAtLT4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJURURF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkFjdGlvbkNvbnRyaWJ1dG9yRFREIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFRERWRpdG9yIgotCQkJc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZS5EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGV4dC5EVEREb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQk8IS0tIGNvbW1lbnQgb3V0IHRpbGwgYWJsZSB0byBpbXByb3ZlIGR0ZCBmb2xkaW5nCi0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InN0cnVjdHVyZWR0ZXh0Zm9sZGluZ3Byb3ZpZGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvamVjdGlvbi5TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckRURCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJLS0+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnByZWZlcmVuY2VzLmR0ZCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5kdGQudGVtcGxhdGVzLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC5zdHlsZXMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTwhLS0gcHJvdmlkZSBzeW50YXggaGlnaGxpZ2h0aW5nIGZvciBEVEQgc3Vic2V0IHdpdGhpbiBYTUwgLS0+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImxpbmVzdHlsZXByb3ZpZGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54bWwuZHRkLmludGVybmFsX3N1YnNldCIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0ic3BlbGxpbmdyZWdpb25zIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLnBhcnNlci5EVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLQkJPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIHVzZSBhIHNwZWNpZmljIGFubm90YXRpb24gbW9kZWwgd2l0aCBGaWxlQnVmZmVycyAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmFubm90YXRpb25Nb2RlbENyZWF0aW9uIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBSZWdpc3RlciB0aGUgVUkgYWRhcHRlciBmYWN0b3J5IHByb3ZpZGVyIC0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFREIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSIgLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8cGFnZQotCQkJbmFtZT0iJV9VSV9MQUJFTF9EVERfRklMRVMiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERGaWxlc1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkucHJlZmVyZW5jZXMuZHRkIj4KLSAgICAgICAgIAk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5maWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlRFREX1RlbXBsYXRlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkucHJlZmVyZW5jZXMuZHRkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC50ZW1wbGF0ZXMiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnRlbXBsYXRlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlRFREX1N5bnRheF9Db2xvcmluZyIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnByZWZlcmVuY2VzLmR0ZCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkRURFN5bnRheENvbG9yaW5nUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC5zdHlsZXMiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnN0eWxlcyIvPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBLZXl3b3JkcyBmb3IgcHJlZmVyZW5jZSBhbmQgcHJvcGVydGllcyBwYWdlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmZpbGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy50ZW1wbGF0ZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS50ZW1wbGF0ZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnN0eWxlcyIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSBOZXcgRFREIHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCIKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05FV19EVEQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQuTmV3RFREV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX0NSRUFURV9ORVdfRFREX0ZJTEU8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBEVEQgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gVGVtcGxhdGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlRFREX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlRFREIgotCQkJaWQ9ImR0ZF9uZXciPgotCQk8L2NvbnRleHRUeXBlPgotICA8aW5jbHVkZQotICAgICAgICBmaWxlPSJ0ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMueG1sIgotICAgICAgICB0cmFuc2xhdGlvbnM9IiRubCQvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMiPgotICA8L2luY2x1ZGU+Ci0JPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnByb3BlcnR5Q29udHJpYnV0b3IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlDb250cmlidXRvciI+Ci0gICAgICA8cHJvcGVydHlDb250cmlidXRvcgotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5EVERTZWN0aW9uTGFiZWxQcm92aWRlciIKLSAgICAgICAgICAgIHR5cGVNYXBwZXI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRURFR5cGVNYXBwZXIiPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuZ2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkub3RoZXIiLz4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmF0dHJpYnV0ZXMiLz4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmRvY3VtZW50YXRpb24iLz4KLSAgICAgIDwvcHJvcGVydHlDb250cmlidXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlUYWJzIj4KLSAgICAgIDxwcm9wZXJ0eVRhYnMKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfR0VORVJBTCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuZ2VuZXJhbCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9BVFRSSUJVVEVTIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLm90aGVyIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkub3RoZXIiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9PVEhFUiIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5kb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04iLz4KLSAgICAgIDwvcHJvcGVydHlUYWJzPgotICAgPC9leHRlbnNpb24+ICAgCi0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5U2VjdGlvbnMiPgotICAgPHByb3BlcnR5U2VjdGlvbnMgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotCSA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OYW1lU2VjdGlvbiIKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5hbWVTZWN0aW9uIgotICAgICAgICB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlIi8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3QiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb24iLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkF0dHJpYnV0ZURlZmF1bHRTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db21tZW50U2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbW1lbnRTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ29tbWVudCIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbiI+Ci0JICAgIAk8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVTZWN0aW9uIgotICAgICAgICBmaWx0ZXI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVGaWx0ZXIiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxOYW1lU2VjdGlvbiIKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5vdGhlciIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxUeXBlU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbFR5cGVTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGUiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZG9jdW1lbnRhdGlvbiIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Eb2N1bWVudFNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Eb2N1bWVudFNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50Ii8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eSIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0Ii8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW1wdHlTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW1wdHlTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIi8+Ci0JCSAJPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDwhLS0JCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLm90aGVyIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVR5cGVTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VHlwZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHkiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlWYWx1ZVNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlWYWx1ZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHkiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIC0tPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmV3RW50aXR5U2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5ld0VudGl0eVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlIi8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5vdGF0aW9uU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5vdGF0aW9uU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZVNlY3Rpb24iICAKLSAgICAgICAgZmlsdGVyPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5PY2N1cnJlbmNlRmlsdGVyIgotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk9jY3VycmVuY2VTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGUiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01SZXBlYXRhYmxlTm9kZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLlR5cGVTZWN0aW9uIiAgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uVHlwZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gIDwvcHJvcGVydHlTZWN0aW9ucz4KLTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBEZWZpbmUgdGhlbWUgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLQkJPHRoZW1lCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnN5c3RlbURlZmF1bHQiPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkRGVmYXVsdCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZFRhZyIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZFRhZ05hbWUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkdGRDb21tZW50IgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX1NFTEVDVElPTiI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkdGRLZXl3b3JkIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkU3RyaW5nIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkRGF0YSIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZFN5bWJvbCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJPC90aGVtZT4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZERlZmF1bHQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZERlZmF1bHQiCi0JCQl2YWx1ZT0iMCwgMCwgMCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZHRkVGFnIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kdGRUYWciCi0JCQl2YWx1ZT0iNjMsIDYzLCAxOTEiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZFRhZ05hbWUiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZFRhZ05hbWUiCi0JCQl2YWx1ZT0iNjMsIDYzLCAxOTEiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZENvbW1lbnQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZENvbW1lbnQiCi0JCQl2YWx1ZT0iMTI3LCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZHRkS2V5d29yZCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZHRkS2V5d29yZCIKLQkJCXZhbHVlPSIxMjgsIDAsIDAiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZFN0cmluZyIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZHRkU3RyaW5nIgotCQkJdmFsdWU9IjYzLCAxNTksIDk1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkdGREYXRhIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kdGREYXRhIgotCQkJdmFsdWU9IjE5MSwgOTUsIDk1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkdGRTeW1ib2wiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZFN5bWJvbCIKLQkJCXZhbHVlPSIxMjgsIDAsIDAiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFRERWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhZDdmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLQotLyoqCi0gKiBBIERURCBFZGl0b3Igc3ViY2xhc3MgU3RydWN0dXJlZFRleHRFZGl0b3IsIHJlcXVpcmVkIHRvIHN1cHBseSBhIGNvbXBsZXRlCi0gKiByZXBsYWNlbWVudCBmb3IgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuIFdoZW4gYSBiZXR0ZXIgc29sdXRpb24gaXMgZm91bmQsCi0gKiB0aGlzIGNsYXNzIHdpbGwgYmUgcmVtb3ZlZC4KLSAqLwotcHVibGljIGNsYXNzIERUREVkaXRvciBleHRlbmRzIFN0cnVjdHVyZWRUZXh0RWRpdG9yIHsKLQljbGFzcyBEVERQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgewotCQlEVERQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IjZ2V0Q29udHJpYnV0b3JJZCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKSB7Ci0JCQlyZXR1cm4gZ2V0RWRpdG9yU2l0ZSgpLmdldElkKCk7Ci0JCX0KLQl9Ci0KLQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwdWJsaWMgRFRERWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBJQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHJlcXVpcmVkKSB7Ci0JCWlmIChJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JCQkJZlByb3BlcnR5U2hlZXRQYWdlID0gbmV3IERURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKG5ldyBEVERQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKCkpOwotCQkJCS8qCi0JCQkJICogQWRkIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlIGFzIGEgZGlyZWN0IHBvc3Qgc2VsZWN0aW9uCi0JCQkJICogbGlzdGVuZXIgc28gc3RhbmRhcmQgY3Vyc29yIG5hdmlnYXRpb24gdHJpZ2dlcnMgYSBzZWxlY3Rpb24KLQkJCQkgKiBub3RpZmljYXRpb24uIFRoZSBkZWZhdWx0IHRhYmJlZCBwcm9wZXJ0eSBzaGVldCBkb2VzIG5vdAotCQkJCSAqIGxpc3RlbiB0byBwb3N0IHNlbGVjdGlvbi4KLQkJCQkgKi8KLQkJCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpZiAoZlByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwgJiYgIWZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJZlByb3BlcnR5U2hlZXRQYWdlLnNlbGVjdGlvbkNoYW5nZWQoRFRERWRpdG9yLnRoaXMsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZlByb3BlcnR5U2hlZXRQYWdlOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKHJlcXVpcmVkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBlZGl0b3JJbnB1dCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyBkdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBkdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9QUk9QX1NIRUVUKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjhmOTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIERURFByb3BlcnRpZXNNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5PY2N1cnJlbmNlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09OQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09ORV9PUl9NT1JFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PUFRJT05BTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWkVST19PUl9NT1JFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9PQ0NVUlJFTkNFOwotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkF0dHJpYnVlRGVmYXVsdFNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ERUZBVUxUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9VU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfREVGQVVMVF9WQUxVRTsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NFUVVFTkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DSE9JQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01PREVMX0dST1VQOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05URU5UX01PREVMOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsVHlwZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05URU5UX1RZUEU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OYW1lU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5UeXBlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RZUEU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FWFRFUk5BTF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0dFTkVSQUxfRU5USVRZOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VmFsdWVTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVF9SRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9DSE9JQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9TRVFVRU5DRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVExJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfTk9UQVRJT047Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OZXdFbnRpdHlTZWN0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRURJQUxPR19TRUxFQ1RfRFREX0RFU0M7Ci0KLQkvLyBOZXcgcHJvcGVydHkgdGFicwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9HRU5FUkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9PVEhFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRE9DVU1FTlRBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfOTsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQlwcml2YXRlIERURFByb3BlcnRpZXNNZXNzYWdlcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTliYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTUwgdG9vbHMgRFREIEVkaXRvcgotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZVNlY3Rpb24uamF2YQotX1VJX09OQ0UgICAgICAgICAgICAgPSBKdXN0IG9uY2UgKDEpCi1fVUlfT05FX09SX01PUkUgICAgICA9IE9uZSBvciBtb3JlICgrKQotX1VJX09QVElPTkFMICAgICAgICAgPSBPcHRpb25hbCAoPykKLV9VSV9aRVJPX09SX01PUkUgICAgID0gWmVybyBvciBtb3JlICgqKQotX1VJX0xBQkVMX09DQ1VSUkVOQ0UgPSBPY2N1cnJlbmNlCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24uamF2YQotX1VJX0RFRkFVTFQgICAgICAgICAgICAgPSBEZWZhdWx0Ci1fVUlfTEFCRUxfVVNBR0UgICAgICAgICA9IFVzYWdlCi1fVUlfTEFCRUxfREVGQVVMVF9WQUxVRSA9IERlZmF1bHQgVmFsdWUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YQotX1VJX1NFUVVFTkNFICAgICAgICAgID0gU2VxdWVuY2UgKCwpCi1fVUlfQ0hPSUNFICAgICAgICAgICAgPSBDaG9pY2UgKHwpCi1fVUlfTEFCRUxfTU9ERUxfR1JPVVAgPSBNb2RlbCBHcm91cAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9DT05URU5UX01PREVMID0gQ29udGVudCBNb2RlbAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9DT05URU5UX1RZUEUgPSBDb250ZW50IFR5cGUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OYW1lU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfTkFNRSA9IE5hbWUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5UeXBlU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfVFlQRSA9IFR5cGUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfRU5USVRZX1RZUEUgICAgICA9IEVudGl0eSBUeXBlCi1fVUlfTEFCRUxfRVhURVJOQUxfRU5USVRZICA9IEV4dGVybmFsCi1fVUlfTEFCRUxfUEFSQU1FVEVSX0VOVElUWSA9IFBhcmFtZXRlcgotX1VJX0xBQkVMX0dFTkVSQUxfRU5USVRZICAgPSBHZW5lcmFsCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VmFsdWVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9FTlRJVFlfVkFMVUUgPSBFbnRpdHkgVmFsdWUKLV9VSV9MQUJFTF9QVUJMSUNfSUQgICAgPSBQdWJsaWMgSUQKLV9VSV9MQUJFTF9TWVNURU1fSUQgICAgPSBTeXN0ZW0gSUQKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5EVERTZWN0aW9uTGFiZWxQcm92aWRlcgotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UICAgICA9IGVsZW1lbnQKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVF9SRUYgPSBlbGVtZW50IHJlZmVyZW5jZQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9DSE9JQ0UgICAgICA9IGNob2ljZQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9TRVFVRU5DRSAgICA9IHNlcXVlbmNlCi1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVFJJQlVURSAgID0gYXR0cmlidXRlCi1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVExJU1QgICAgID0gYXR0cmlidXRlIGxpc3QKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQ09NTUVOVCAgICAgPSBjb21tZW50Ci1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VOVElUWSAgICAgID0gZW50aXR5Ci1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX05PVEFUSU9OICAgID0gbm90YXRpb24KLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OZXdFbnRpdHlTZWN0aW9uCi1fVUlfRklMRURJQUxPR19TRUxFQ1RfRFREID0gU2VsZWN0IERURCBmaWxlCi1fVUlfRklMRURJQUxPR19TRUxFQ1RfRFREX0RFU0MgICA9IFNlbGVjdCBhIERURCBmaWxlIGZyb20gdGhlIFdvcmtiZW5jaCBwcm9qZWN0cwotCi0hIE5ldyBwcm9wZXJ0eSB0YWJzCi1fVUlfTEFCRUxfR0VORVJBTCAgICAgICA9IEdlbmVyYWwKLV9VSV9MQUJFTF9PVEhFUiAgICAgICAgID0gT3RoZXIKLV9VSV9MQUJFTF9BVFRSSUJVVEVTICAgID0gQXR0cmlidXRlcwotX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04gPSBEb2N1bWVudGF0aW9uCi0hIGVuZAotRFRERWRpdG9yXzA9Z2VuZXJhbAotRFRERWRpdG9yXzE9b3RoZXIKLURUREVkaXRvcl8yPWF0dHJpYnV0ZXMKLURUREVkaXRvcl8zPWRvY3VtZW50YXRpb24KLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzA9Y2hvaWNlCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xPXNlcXVlbmNlCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl82PWVsZW1lbnQKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzc9YXR0cmlidXRlCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl84PWF0dHJpYnV0ZSBsaXN0Ci1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl85PWNvbW1lbnQKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzEwPWVudGl0eQotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTE9bm90YXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGNhODVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotY2xhc3MgRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gb2xkU2VsZWN0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBEVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZShJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKSB7Ci0JCXN1cGVyKHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCQkJLy8gbWFrZSBzdXJlIHRoZSBjb3JyZWN0IGVkaXRvciBpcyBhY3RpdmUKLQkJCQkJaWYgKGFjdGl2ZUVkaXRvci5nZXRBZGFwdGVyKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykgPT0gRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UudGhpcykgewotCQkJCQkJaWYgKG9sZFNlbGVjdGlvbiA9PSBudWxsIHx8ICFvbGRTZWxlY3Rpb24uZXF1YWxzKHNlbGVjdGlvbikpIHsKLQkJCQkJCQlvbGRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQkJCQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjc0NzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZWN0aW9uIGltcGxlbWVudHMgSVNlY3Rpb24sIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIgewotCXByaXZhdGUgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeTsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgZldvcmtiZW5jaFBhcnQ7Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgT2JqZWN0IGZJbnB1dDsKLQlwcm90ZWN0ZWQgaW50IHJpZ2h0TWFyZ2luU3BhY2U7Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQljcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGFGYWN0b3J5KSB7Ci0JCXRoaXMuZmFjdG9yeSA9IGFGYWN0b3J5OwotCQlHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KCIgIC4uLiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJcmlnaHRNYXJnaW5TcGFjZSA9IGV4dGVudC54OwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWwpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiwgInNlbGVjdGlvbiAiICsgc2VsLmdldENsYXNzKCkgKyAiaXMgbm90IHN0cnVjdHVyZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRoaXMuZldvcmtiZW5jaFBhcnQgPSBwYXJ0OwotCQl0aGlzLmZTZWxlY3Rpb24gPSBzZWw7Ci0JCXRoaXMuZklucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCS8qCi0JCSAqIGlmIChmSW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgeyB4c2RTY2hlbWEgPQotCQkgKiAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWZJbnB1dCkuZ2V0U2NoZW1hKCk7IH0KLQkJICovCi0KLQkJLy8gcmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Fib3V0VG9CZVNob3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQmVTaG93bigpIHsKLQkJcmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Fib3V0VG9CZUhpZGRlbigpCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0JlSGlkZGVuKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jZ2V0TWluaW11bUhlaWdodCgpCi0JICovCi0JcHVibGljIGludCBnZXRNaW5pbXVtSGVpZ2h0KCkgewotCQlyZXR1cm4gU1dULkRFRkFVTFQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotCQlpZiAoZklucHV0IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJLy8gZklucHV0ID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoKEVsZW1lbnQpZklucHV0KTsKLQkJfQotCQlyZXR1cm4gZklucHV0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICovCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmIGdldElucHV0KCkgIT0gbnVsbCAmJiAhaXNJbkRvSGFuZGxlKSB7Ci0JCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0JCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgZ2V0SW5wdXQoKSAhPSBudWxsICYmICFpc0luRG9IYW5kbGUpIHsKLQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQlkb1dpZGdldFNlbGVjdGVkKGUpOwotCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCX0KLQotCX0KLQotCWJvb2xlYW4gbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJFbmFibGVkKCkgewotCQlyZXR1cm4gbGlzdGVuZXJFbmFibGVkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gbGlzdGVuZXJFbmFibGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyRW5hYmxlZChib29sZWFuIHYpIHsKLQkJdGhpcy5saXN0ZW5lckVuYWJsZWQgPSB2OwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmICFpc0luRG9IYW5kbGUpIHsKLQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQlzdGFydERlbGF5ZWRFdmVudChldmVudCk7Ci0JCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGVsYXllZEV2ZW50IGRlbGF5ZWRUYXNrOwotCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnREZWxheWVkRXZlbnQoRXZlbnQgZSkgewotCQlpZiAoZGVsYXllZFRhc2sgPT0gbnVsbCB8fCBkZWxheWVkVGFzay5nZXRFdmVudCgpID09IG51bGwpIHsKLQkJCWRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotCQkJZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLCBkZWxheWVkVGFzayk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFdmVudCBkZWxheWVkRXZlbnQgPSBkZWxheWVkVGFzay5nZXRFdmVudCgpOwotCi0JCQlpZiAoZS53aWRnZXQgPT0gZGVsYXllZEV2ZW50LndpZGdldCAmJiBlLnR5cGUgPT0gZGVsYXllZEV2ZW50LnR5cGUpIHsKLQkJCQkvLyBzYW1lIGV2ZW50LCBqdXN0IGRpZmZlcmVudCBkYXRhLCBkZWxheSBuZXcgZXZlbnQKLQkJCQlkZWxheWVkVGFzay5zZXRFdmVudChudWxsKTsKLQkJCX0KLQkJCWRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotCQkJZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLCBkZWxheWVkVGFzayk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBEZWxheWVkRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByb3RlY3RlZCBFdmVudCBldmVudDsKLQotCQkvKgotCQkgKiBAc2VlIFJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQkJZG9IYW5kbGVFdmVudChldmVudCk7Ci0JCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCQkJZXZlbnQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgdGhlIGV2ZW50LgotCQkgKiAKLQkJICogQHJldHVybiBSZXR1cm5zIGEgRXZlbnQKLQkJICovCi0JCXB1YmxpYyBFdmVudCBnZXRFdmVudCgpIHsKLQkJCXJldHVybiBldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBldmVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiAgICAgICAgICAgIFRoZSBldmVudCB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEV2ZW50KEV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnQgPSBlOwotCQl9Ci0KLQl9Ci0KLQlib29sZWFuIGlzSW5Eb0hhbmRsZTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5Eb0hhbmRsZSgpIHsKLQkJcmV0dXJuIGlzSW5Eb0hhbmRsZTsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQotCQlyZXR1cm4gZWRpdG9yUGFydDsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KSB7Ci0JCUlTdGF0dXNMaW5lTWFuYWdlciByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIGVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCQlyZXN1bHQgPSBjb250cmlidXRvci5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCURvY3VtZW50SW1wbCBnZXREb2N1bWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChEb2N1bWVudEltcGwpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKFN0cmluZyBkZXNjcmlwdGlvbiwgRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50SW1wbCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50KTsKLQkJZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJRG9jdW1lbnRJbXBsIGRvYyA9IGdldERvY3VtZW50KGVsZW1lbnQpOwotCi0JCWRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVMYW5ndWFnZShTdHJpbmcgbGFuZykgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0F0dHJpYnV0ZURlZmF1bHRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGIxODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0F0dHJpYnV0ZURlZmF1bHRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU1QTElFRCA9IEF0dHJpYnV0ZS5JTVBMSUVEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFJFUVVJUkVEID0gQXR0cmlidXRlLlJFUVVJUkVEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEZJWEVEID0gQXR0cmlidXRlLkZJWEVEOwotCi0JcHJpdmF0ZSBDQ29tYm8gdXNhZ2VDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHVzYWdlQ29tYm9WYWx1ZXMgPSB7SU1QTElFRCwgUkVRVUlSRUQsIEZJWEVELCBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFR9OwotCXByaXZhdGUgVGV4dCBkZWZhdWx0VmFsdWVUZXh0OwotCXByaXZhdGUgQ0xhYmVsIGRlZmF1bHRWYWx1ZUxhYmVsOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIHVzYWdlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9VU0FHRSk7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IHVzYWdlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQl1c2FnZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdXNhZ2VDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh1c2FnZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdXNhZ2VDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl1c2FnZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl1c2FnZUNvbWJvLnNldEl0ZW1zKHVzYWdlQ29tYm9WYWx1ZXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCWRlZmF1bHRWYWx1ZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfREVGQVVMVF9WQUxVRSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlwID0gZGVmYXVsdFZhbHVlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNhZ2VMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWRlZmF1bHRWYWx1ZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChkZWZhdWx0VmFsdWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRlZmF1bHRWYWx1ZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWZhdWx0VmFsdWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQlTdHJpbmcga2luZCA9ICgoQXR0cmlidXRlKSBpbnB1dCkuZ2V0RGVmYXVsdEtpbmQoKTsKLQkJCQlpZiAoIiIuZXF1YWxzKGtpbmQpKSAvLyROT04tTkxTLTEkCi0JCQkJCXVzYWdlQ29tYm8uc2V0VGV4dChEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFQpOwotCQkJCWVsc2UKLQkJCQkJdXNhZ2VDb21iby5zZXRUZXh0KGtpbmQpOwotCi0JCQkJaWYgKCIiLmVxdWFscyhraW5kKSB8fCBGSVhFRC5lcXVhbHMoa2luZCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRUZXh0KCgoQXR0cmlidXRlKSBpbnB1dCkuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHVzYWdlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQlTdHJpbmcgdXNhZ2UgPSB1c2FnZUNvbWJvLmdldFRleHQoKTsKLQkJCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgaW5wdXQ7Ci0JCQkJaWYgKHVzYWdlLmVxdWFscyhEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFQpKQotCQkJCQlhdHRyaWJ1dGUuc2V0RGVmYXVsdEtpbmQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZQotCQkJCQlhdHRyaWJ1dGUuc2V0RGVmYXVsdEtpbmQodXNhZ2UpOwotCi0JCQkJaWYgKERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfREVGQVVMVC5lcXVhbHModXNhZ2UpIHx8IEZJWEVELmVxdWFscyh1c2FnZSkpIHsKLQkJCQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJaWYgKGV2ZW50LndpZGdldCA9PSBkZWZhdWx0VmFsdWVUZXh0KSB7Ci0JCQkJU3RyaW5nIG5ld1ZhbHVlID0gZGVmYXVsdFZhbHVlVGV4dC5nZXRUZXh0KCk7Ci0JCQkJKChBdHRyaWJ1dGUpIGlucHV0KS5zZXREZWZhdWx0VmFsdWUobmV3VmFsdWUsIHVzYWdlQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhGSVhFRCkpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db21tZW50U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWYyZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21tZW50U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBUZXh0IGNvbW1lbnRUZXh0OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJY29tbWVudFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTVVMVEkgfCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJY29tbWVudFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgQ29tbWVudFNlY3Rpb24udGhpcyk7Ci0KLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWNvbW1lbnRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJY29tbWVudFRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJY29tbWVudFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENvbW1lbnQpCi0JCQkJY29tbWVudFRleHQuc2V0VGV4dCgoKENvbW1lbnQpIGlucHV0KS5nZXRUZXh0KCkpOwotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IGNvbW1lbnRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDAgJiYgaW5wdXQgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQkJQ29tbWVudCBjb21tZW50ID0gKENvbW1lbnQpIGlucHV0OwotCQkJCWNvbW1lbnQuc2V0VGV4dChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1MTg1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxHcm91cFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNFUVVFTkNFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9TRVFVRU5DRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBDSE9JQ0UgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0NIT0lDRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBNT0RFTF9HUk9VUCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfTU9ERUxfR1JPVVA7Ci0KLQlwcml2YXRlIENDb21ibyBtb2RlbEdyb3VwQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSBtb2RlbEdyb3VwQ29tYm9WYWx1ZXMgPSB7U0VRVUVOQ0UsIENIT0lDRX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1PREVMX0dST1VQKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBjTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQltb2RlbEdyb3VwQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQltb2RlbEdyb3VwQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbW9kZWxHcm91cENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQltb2RlbEdyb3VwQ29tYm8uc2V0SXRlbXMobW9kZWxHcm91cENvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCQlDTUdyb3VwTm9kZSBub2RlID0gKENNR3JvdXBOb2RlKSBpbnB1dDsKLQkJCQljaGFyIG1vZGVsVHlwZSA9IG5vZGUuZ2V0Q29ubmVjdG9yKCk7Ci0JCQkJaWYgKENNR3JvdXBOb2RlLkNIT0lDRSA9PSBtb2RlbFR5cGUpCi0JCQkJCW1vZGVsR3JvdXBDb21iby5zZXRUZXh0KENIT0lDRSk7Ci0JCQkJZWxzZSBpZiAoQ01Hcm91cE5vZGUuU0VRVUVOQ0UgPT0gbW9kZWxUeXBlKQotCQkJCQltb2RlbEdyb3VwQ29tYm8uc2V0VGV4dChTRVFVRU5DRSk7Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IG1vZGVsR3JvdXBDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJQ01Hcm91cE5vZGUgbm9kZSA9IChDTUdyb3VwTm9kZSkgaW5wdXQ7Ci0JCQkJaWYgKENIT0lDRS5lcXVhbHMobW9kZWxHcm91cENvbWJvLmdldFRleHQoKSkpCi0JCQkJCW5vZGUuc2V0Q29ubmVjdG9yKENNR3JvdXBOb2RlLkNIT0lDRSk7Ci0JCQkJZWxzZSBpZiAoU0VRVUVOQ0UuZXF1YWxzKG1vZGVsR3JvdXBDb21iby5nZXRUZXh0KCkpKQotCQkJCQlub2RlLnNldENvbm5lY3RvcihDTUdyb3VwTm9kZS5TRVFVRU5DRSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbE5hbWVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1MGJmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxOYW1lRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpIHsKLQkJcmV0dXJuIHRvVGVzdCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlICYmICEoKENNQmFzaWNOb2RlKSB0b1Rlc3QpLmlzUm9vdEVsZW1lbnRDb250ZW50KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbE5hbWVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiMWVjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsTmFtZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIENPTlRFTlRfTU9ERUwgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0NPTlRFTlRfTU9ERUw7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7Q01Ob2RlLlBDREFUQX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIENPTlRFTlRfTU9ERUwpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IGNMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCXR5cGVDb21iby5yZW1vdmVBbGwoKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5QQ0RBVEEpOwotCQkJCS8vIE5vZGVMaXN0IGxpc3QgPQotCQkJCS8vICgoQ01CYXNpY05vZGUpZklucHV0KS5nZXREVERGaWxlKCkuZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENNQmFzaWNOb2RlKSBpbnB1dCkuZ2V0RFRERmlsZSgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCQlib29sZWFuIGlzRm9yUm9vdENvbnRlbnQgPSAoKENNQmFzaWNOb2RlKSBpbnB1dCkuaXNSb290RWxlbWVudENvbnRlbnQoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICghaXNGb3JSb290Q29udGVudCAmJiBub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQkJCXR5cGVDb21iby5hZGQobm9kZS5nZXROYW1lKCkpOwotCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAoKEVudGl0eSkgbm9kZSkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkJCQkJCXR5cGVDb21iby5hZGQoIiUiICsgbm9kZS5nZXROYW1lKCkgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0KLQkJCQl0eXBlQ29tYm8uc2V0VGV4dCgoKENNQmFzaWNOb2RlKSBpbnB1dCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJQ01CYXNpY05vZGUgbm9kZSA9IChDTUJhc2ljTm9kZSkgaW5wdXQ7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLQkJCQkvLyBpZiAoQ01Ob2RlLlBDREFUQS5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCW5vZGUuc2V0TmFtZShzZWxlY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmRhYzgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxUeXBlRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpIHsKLQkJaWYgKHRvVGVzdCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlICYmICEoKENNQmFzaWNOb2RlKSB0b1Rlc3QpLmlzUm9vdEVsZW1lbnRDb250ZW50KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRvVGVzdCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlICYmICgoQ01Hcm91cE5vZGUpIHRvVGVzdCkuaXNSb290RWxlbWVudENvbnRlbnQoKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0YTg5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbFR5cGVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0NPTlRFTlRfVFlQRTsKLQotCXByaXZhdGUgQ0NvbWJvIHR5cGVDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVDb21ib1ZhbHVlcyA9IHtDTU5vZGUuQU5ZLCBDTU5vZGUuRU1QVFksIENNTm9kZS5QQ0RBVEEsIENNTm9kZS5DSElMRFJFTiwgQ01Ob2RlLk1JWEVEfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgQ09OVEVOVF9UWVBFKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBjTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQl0eXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuQU5ZKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5FTVBUWSk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuUENEQVRBKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5DSElMRFJFTik7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuTUlYRUQpOwotCi0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENNTm9kZSkgaW5wdXQpLmdldERUREZpbGUoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gbnVsbDsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCW5vZGVOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiB0eXBlQ29tYm8uaW5kZXhPZihub2RlTmFtZSkgPT0gLTEpCi0JCQkJCQl0eXBlQ29tYm8uYWRkKG5vZGVOYW1lKTsKLQkJCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAoKEVudGl0eSkgbm9kZSkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiB0eXBlQ29tYm8uaW5kZXhPZihub2RlTmFtZSkgPT0gLTEpCi0JCQkJCQl0eXBlQ29tYm8uYWRkKCIlIiArIG5vZGVOYW1lICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dCgoKENNR3JvdXBOb2RlKSBpbnB1dCkuZ2V0VHlwZSgpKTsKLQkJCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dCgoKENNQmFzaWNOb2RlKSBpbnB1dCkuZ2V0VHlwZSgpKTsKLQkJCX0KLQkJfSAvLyBlbmQgaWYgKGZJbnB1dCAhPSBudWxsKQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlIHx8IGlucHV0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQlDTU5vZGUgbm9kZSA9IChDTU5vZGUpIGlucHV0OwotCQkJCVN0cmluZyBzZWxlY3RlZCA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKENNTm9kZS5NSVhFRC5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldE1peGVkQ29udGVudCgpOwotCQkJCWVsc2UgaWYgKENNTm9kZS5DSElMRFJFTi5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldENoaWxkcmVuQ29udGVudCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmIChDTU5vZGUuRU1QVFkuZXF1YWxzKHNlbGVjdGVkKSB8fCBDTU5vZGUuQU5ZLmVxdWFscyhzZWxlY3RlZCkgfHwgQ01Ob2RlLlBDREFUQS5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldENvbnRlbnQoc2VsZWN0ZWQpOwotCQkJCWVsc2UKLQkJCQkJbm9kZS5zZXRDaGlsZHJlbkNvbnRlbnQoc2VsZWN0ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQzN2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTVJlcGVhdGFibGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEVERTZWN0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQotCQlPYmplY3Qgc2VsZWN0ZWQgPSBvYmplY3Q7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJc2VsZWN0ZWQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3QpLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCXJldHVybiBudWxsOyAvLyAoKERUREZpbGUpIHNlbGVjdGVkKS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuICgoRFRETm9kZSkgc2VsZWN0ZWQpLmdldEltYWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJT2JqZWN0IHNlbGVjdGVkID0gb2JqZWN0OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCi0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCXJldHVybiAoKERUREZpbGUpIHNlbGVjdGVkKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJaWYgKCgoQ01CYXNpY05vZGUpIHNlbGVjdGVkKS5pc1JlZmVyZW5jZSgpKQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UX1JFRjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKChDTUJhc2ljTm9kZSkgc2VsZWN0ZWQpLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIENNUmVwZWF0YWJsZU5vZGUpIHsKLQkJCUNNUmVwZWF0YWJsZU5vZGUgbm9kZSA9IChDTVJlcGVhdGFibGVOb2RlKSBzZWxlY3RlZDsKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJaWYgKCgoQ01Hcm91cE5vZGUpIG5vZGUpLmdldENvbm5lY3RvcigpID09IENNR3JvdXBOb2RlLkNIT0lDRSkKLQkJCQkJbmFtZSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8wOwotCQkJCWVsc2UKLQkJCQkJbmFtZSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xOwotCQkJfQotCQkJY2hhciBvY2N1cnJlbmNlID0gbm9kZS5nZXRPY2N1cnJlbmNlKCk7Ci0JCQlzd2l0Y2ggKG9jY3VycmVuY2UpIHsKLQkJCQljYXNlIENNUmVwZWF0YWJsZU5vZGUuT05DRSA6Ci0JCQkJCW5hbWUgKz0gIiBbMS4uMV0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01SZXBlYXRhYmxlTm9kZS5PUFRJT05BTCA6Ci0JCQkJCW5hbWUgKz0gIiBbMC4uMV0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01SZXBlYXRhYmxlTm9kZS5PTkVfT1JfTU9SRSA6Ci0JCQkJCW5hbWUgKz0gIiBbMS4uKl0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUgOgotCQkJCQluYW1lICs9ICIgWzAuLipdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzY7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzc7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl84OwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBDb21tZW50KQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfOTsKLQkJCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRW50aXR5KQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTA7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIE5vdGF0aW9uKQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTE7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkKLQkJCQkvLyByZXR1cm4gInBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlIjsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKChEVEROb2RlKSBzZWxlY3RlZCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCkgewotCQkJcmV0dXJuICgob3JnLnczYy5kb20uRWxlbWVudCkgc2VsZWN0ZWQpLmdldExvY2FsTmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTUzMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci0KLS8qKgotICogRXh0ZW5kIHRoZSBiYXNlIHdpemFyZCB0byBzZWxlY3QgYSBmaWxlIGZyb20gdGhlIHByb2plY3Qgb3Igb3V0c2lkZSB0aGUKLSAqIHdvcmtiZW5jaCBhbmQgYWRkIGVycm9yIGhhbmRsaW5nCi0gKi8KLWNsYXNzIERURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UgZmlsZVBhZ2U7Ci0KLQlJRmlsZSByZXN1bHRGaWxlOwotCi0JcHVibGljIERURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIFZpZXdlckZpbHRlciBmaWx0ZXIsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIERURFJlc291cmNlLk5FV0RURCkpOwotCi0JCS8vIFNlbGVjdCBGaWxlIFBhZ2UKLQkJZmlsZVBhZ2UgPSBuZXcgRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uLCB0cnVlKTsKLQkJZmlsZVBhZ2Uuc2V0VGl0bGUodGl0bGUpOwotCQlmaWxlUGFnZS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQkJZmlsZVBhZ2UuYWRkRmlsdGVyKGZpbHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGFnZShmaWxlUGFnZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gZmlsZVBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXN1bHRGaWxlID0gZmlsZVBhZ2UuZ2V0RmlsZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0UmVzdWx0RmlsZSgpIHsKLQkJcmV0dXJuIHJlc3VsdEZpbGU7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IERURCBGaWxlCi0JICovCi0JY2xhc3MgRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlUGFnZSB7Ci0JCXB1YmxpYyBEVERTZWxlY3RTaW5nbGVGaWxlUGFnZShJV29ya2JlbmNoIHcsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpIHsKLQkJCXN1cGVyKHcsIHNlbGVjdGlvbiwgaXNGaWxlTWFuZGF0b3J5KTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQkJcmV0dXJuIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREVHlwZU1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFR5cGVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMzVkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREVHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUeXBlTWFwcGVyOwotCi1wdWJsaWMgY2xhc3MgRFREVHlwZU1hcHBlciBpbXBsZW1lbnRzIElUeXBlTWFwcGVyIHsKLQlwdWJsaWMgRFREVHlwZU1hcHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgbWFwVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QuZ2V0Q2xhc3MoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzIwZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLQotcHVibGljIGNsYXNzIERvY3VtZW50U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBUZXh0IGNvbW1lbnRUZXh0OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJY29tbWVudFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTVVMVEkgfCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJY29tbWVudFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWNvbW1lbnRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJY29tbWVudFRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJY29tbWVudFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlDb21tZW50IGNvbW1lbnQgPSBnZXRDb21tZW50Tm9kZSgoRFRETm9kZSkgaW5wdXQpOwotCQkJCWlmIChjb21tZW50ICE9IG51bGwpCi0JCQkJCWNvbW1lbnRUZXh0LnNldFRleHQoY29tbWVudC5nZXRUZXh0KCkpOwotCQkJfQotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBjb21tZW50VGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQkJQ29tbWVudCBjb21tZW50ID0gZ2V0Q29tbWVudE5vZGUoKERURE5vZGUpIGlucHV0KTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKQotCQkJCQljb21tZW50LnNldFRleHQobmV3VmFsdWUpOwotCQkJCWVsc2UgewotCQkJCQkvLyBDcmVhdGUgYSBuZXcgY29tbWVudCBub2RlLgotCQkJCQkoKERURE5vZGUpIGlucHV0KS5nZXREVERGaWxlKCkuY3JlYXRlQ29tbWVudCgoRFRETm9kZSkgaW5wdXQsIG5ld1ZhbHVlLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIENvbW1lbnQgZ2V0Q29tbWVudE5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQlEVEROb2RlIGN1cnJlbnROb2RlID0gbnVsbDsKLQkJRFRETm9kZSBwcmV2Tm9kZSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChub2RlID09IGN1cnJlbnROb2RlICYmIHByZXZOb2RlICE9IG51bGwgJiYgcHJldk5vZGUgaW5zdGFuY2VvZiBDb21tZW50KQotCQkJCXJldHVybiAoQ29tbWVudCkgcHJldk5vZGU7Ci0JCQllbHNlCi0JCQkJcHJldk5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbXB0eVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbXB0eVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmNDI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW1wdHlTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1wdHlTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE1pbmltdW1IZWlnaHQoKSB7Ci0JCXJldHVybiAwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjYzNGJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5VHlwZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVOVElUWV9UWVBFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfVFlQRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9FTlRJVFkgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVSTkFMX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQQVJBTUVURVIgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VORVJBTCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfR0VORVJBTF9FTlRJVFk7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7UEFSQU1FVEVSLCBHRU5FUkFMfTsKLQlwcml2YXRlIEJ1dHRvbiBjaGVja0JveDsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIEVOVElUWV9UWVBFKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBjTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQotCQljaGVja0JveCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBFWFRFUk5BTF9FTlRJVFksIFNXVC5DSEVDSyk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlwID0gY2hlY2tCb3guY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg5NSwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQljaGVja0JveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dChQQVJBTUVURVIpOwotCQkJCWVsc2UKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoR0VORVJBTCk7Ci0KLQkJCQlpZiAoZW50aXR5LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCQljaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCWlzRXh0ZXJuYWxFbnRpdHkgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJaXNFeHRlcm5hbEVudGl0eSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IG5vZGUgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQlTdHJpbmcgc2VsZWN0ZWQgPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotCQkJCWlmIChQQVJBTUVURVIuZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQkJbm9kZS5zZXRQYXJhbWV0ZXJFbnRpdHkodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQlub2RlLnNldFBhcmFtZXRlckVudGl0eShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gY2hlY2tCb3gpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgbm9kZSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBjaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQkJbm9kZS5zZXRFeHRlcm5hbEVudGl0eSh0cnVlKTsKLQkJCQkJaXNFeHRlcm5hbEVudGl0eSA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlub2RlLnNldEV4dGVybmFsRW50aXR5KGZhbHNlKTsKLQkJCQkJaXNFeHRlcm5hbEVudGl0eSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVZhbHVlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVZhbHVlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmYzNTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlWYWx1ZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5VmFsdWVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBWQUxVRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1ZBTFVFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBVQkxJQ19JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfUFVCTElDX0lEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNZU1RFTV9JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfU1lTVEVNX0lEOwotCi0JcHJpdmF0ZSBUZXh0IHZhbHVlVGV4dDsKLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0KLQlwcml2YXRlIENMYWJlbCB2YWx1ZUxhYmVsOwotCXByaXZhdGUgQ0xhYmVsIHB1YmxpY0lkTGFiZWw7Ci0JcHJpdmF0ZSBDTGFiZWwgc3lzdGVtSWRMYWJlbDsKLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSB2YWx1ZVRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSB2YWx1ZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHB1YmxpY0lkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHB1YmxpY0lkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFB1YmxpY0lEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gc3lzdGVtSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0U3lzdGVtSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJdmFsdWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBWQUxVRSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gdmFsdWVMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBFbnRpdHkgVmFsdWUKLQkJdmFsdWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodmFsdWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHZhbHVlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl2YWx1ZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdmFsdWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXB1YmxpY0lkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgUFVCTElDX0lEKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCXAgPSBwdWJsaWNJZExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHZhbHVlTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJcHVibGljSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFB1YmxpYyBJRAotCQlwdWJsaWNJZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXB1YmxpY0lkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaWNJZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJc3lzdGVtSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBTWVNURU1fSUQpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJcCA9IHN5c3RlbUlkTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlzeXN0ZW1JZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gU3lzdGVtIElECi0JCXN5c3RlbUlkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJc3lzdGVtSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5c3RlbUlkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQl2YWx1ZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJdmFsdWVUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJcHVibGljSWRMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJcHVibGljSWRUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlzeXN0ZW1JZExhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlzeXN0ZW1JZFRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQotCQkJcHVibGljSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlzeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCXB1YmxpY0lkVGV4dC5zZXRUZXh0KChlbnRpdHkpLmdldFB1YmxpY0lEKCkpOwotCQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KChlbnRpdHkpLmdldFN5c3RlbUlEKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJdmFsdWVUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlwdWJsaWNJZExhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJcHVibGljSWRUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJc3lzdGVtSWRMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXN5c3RlbUlkVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJdmFsdWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkKLQkJCQl2YWx1ZVRleHQuc2V0VGV4dCgoKEVudGl0eSkgaW5wdXQpLmdldFZhbHVlKCkpOwotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXh0ZXJuYWxFbnRpdHkoKSB7Ci0JCXJldHVybiBFbnRpdHlUeXBlU2VjdGlvbi5pc0V4dGVybmFsRW50aXR5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDE0YzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTkFNRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRTsKLQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwICYmIGlucHV0IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCURURE5vZGUgZHRkTm9kZSA9IChEVEROb2RlKSBpbnB1dDsKLQkJCQlkdGROb2RlLnNldE5hbWUobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBOQU1FKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBuYW1lTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQluYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIGxpc3RlbmVyLnN0YXJ0TGlzdGVuaW5nRm9yRW50ZXIobmFtZVRleHQpOwotCQkvLyBsaXN0ZW5lci5zdGFydExpc3RlbmluZ1RvKG5hbWVUZXh0KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQluYW1lVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQluYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRFRETm9kZSkKLQkJCQluYW1lVGV4dC5zZXRUZXh0KCgoRFRETm9kZSkgaW5wdXQpLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05ld0VudGl0eVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OZXdFbnRpdHlTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NDkyMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05ld0VudGl0eVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBOZXdFbnRpdHlTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOQU1FID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVOVElUWV9UWVBFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfVFlQRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9FTlRJVFkgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVSTkFMX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQQVJBTUVURVIgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VORVJBTCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfR0VORVJBTF9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVkFMVUUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9WQUxVRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQVUJMSUNfSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BVQkxJQ19JRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTWVNURU1fSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gd2l6YXJkQnV0dG9uOwotCi0JcHJpdmF0ZSBUZXh0IGVudGl0eVZhbHVlVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBjaGVja0JveDsKLQotCXByaXZhdGUgQ0NvbWJvIHR5cGVDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVDb21ib1ZhbHVlcyA9IHtQQVJBTUVURVIsIEdFTkVSQUx9OwotCXByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQljcmVhdGVFbnRpdHlDb21tb25Db21wb3NpdGUoY29tcG9zaXRlKTsKLQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljcmVhdGVFeHRlcm5hbEVudGl0eUNvbXBvc2l0ZShwYWdlQm9vayk7Ci0JCWNyZWF0ZUludGVybmFsRW50aXR5Q29tcG9zaXRlKHBhZ2VCb29rKTsKLQotCQlwYWdlQm9vay5zaG93UGFnZShleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZW50aXR5Q29tbW9uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlRW50aXR5Q29tbW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZW50aXR5Q29tbW9uQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQllbnRpdHlDb21tb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChlbnRpdHlDb21tb25Db21wb3NpdGUsIE5BTUUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gbmFtZUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChlbnRpdHlDb21tb25Db21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQgICAgCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgRU5USVRZX1RZUEUpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJcCA9IGNMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gQ3JlYXRlIENoZWNrYm94Ci0JCWNoZWNrQm94ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihlbnRpdHlDb21tb25Db21wb3NpdGUsIEVYVEVSTkFMX0VOVElUWSwgU1dULkNIRUNLKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIENDb21ibwotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSAtIDIpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXR5cGVDb21iby5zZXRJdGVtcyh0eXBlQ29tYm9WYWx1ZXMpOwotCQl0eXBlQ29tYm8uc2V0VGV4dChQQVJBTUVURVIpOwotCi0JCXJldHVybiBlbnRpdHlDb21tb25Db21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgaW50ZXJuYWxFbnRpdHlDb21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVJbnRlcm5hbEVudGl0eUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWludGVybmFsRW50aXR5Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBlbnRpdHlWYWx1ZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgVkFMVUUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gZW50aXR5VmFsdWVMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWVudGl0eVZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQllbnRpdHlWYWx1ZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChlbnRpdHlWYWx1ZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5VmFsdWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCWVudGl0eVZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQllbnRpdHlWYWx1ZVRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCWVudGl0eVZhbHVlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQlyZXR1cm4gaW50ZXJuYWxFbnRpdHlDb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVFeHRlcm5hbEVudGl0eUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWV4dGVybmFsRW50aXR5Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlleHRlcm5hbEVudGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBwdWJsaWNJZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgUFVCTElDX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IHB1YmxpY0lkTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlwdWJsaWNJZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcHVibGljSWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljSWRUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXB1YmxpY0lkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaWNJZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJLy8gQ3JlYXRlIFN5c3RlbSBJRCBMYWJlbAotCQlDTGFiZWwgc3lzdGVtSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUsIFNZU1RFTV9JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCXAgPSBzeXN0ZW1JZExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJc3lzdGVtSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBXaXphcmQgQnV0dG9uCi0JCXdpemFyZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJd2l6YXJkQnV0dG9uLnNldEltYWdlKEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksICJpY29ucy9icm93c2VidXR0b24uZ2lmIikuY3JlYXRlSW1hZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl3aXphcmRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJd2l6YXJkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIENyZWF0ZSBTeXN0ZW0gSUQgVGV4dAotCQlzeXN0ZW1JZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzeXN0ZW1JZFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQod2l6YXJkQnV0dG9uLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlzeXN0ZW1JZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCXJldHVybiBleHRlcm5hbEVudGl0eUNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgbm9kZSA9IChFbnRpdHkpIGlucHV0OwotCQkJCVN0cmluZyBzZWxlY3RlZCA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKFBBUkFNRVRFUi5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldFBhcmFtZXRlckVudGl0eSh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCW5vZGUuc2V0UGFyYW1ldGVyRW50aXR5KGZhbHNlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChlLndpZGdldCA9PSBjaGVja0JveCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBub2RlID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJYm9vbGVhbiBzZWxlY3RlZCA9IGNoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3RlZCkgewotCQkJCQlub2RlLnNldEV4dGVybmFsRW50aXR5KHRydWUpOwotCQkJCQlwYWdlQm9vay5zaG93UGFnZShleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlub2RlLnNldEV4dGVybmFsRW50aXR5KGZhbHNlKTsKLQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoaW50ZXJuYWxFbnRpdHlDb21wb3NpdGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlLndpZGdldCA9PSB3aXphcmRCdXR0b24pIHsKLQkJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCUlGaWxlIGN1cnJlbnRJRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotCQkJVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihuZXcgU3RyaW5nW117Ii5kdGQifSwgbmV3IElGaWxlW117Y3VycmVudElGaWxlfSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJRFREU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZmlsZVNlbGVjdFdpemFyZCA9IG5ldyBEVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZChEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURCwgRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9GSUxFRElBTE9HX1NFTEVDVF9EVERfREVTQywgZmlsdGVyLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTZWxlY3Rpb24pOwotCi0JCQlXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgZmlsZVNlbGVjdFdpemFyZCk7Ci0JCQl3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0JCQl3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCQlJRmlsZSBzZWxlY3RlZElGaWxlID0gZmlsZVNlbGVjdFdpemFyZC5nZXRSZXN1bHRGaWxlKCk7Ci0JCQkJU3RyaW5nIGR0ZEZpbGVTdHJpbmcgPSB2YWx1ZTsKLQkJCQlpZiAoc2VsZWN0ZWRJRmlsZSAhPSBudWxsKSB7Ci0JCQkJCWR0ZEZpbGVTdHJpbmcgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoc2VsZWN0ZWRJRmlsZS5nZXRGdWxsUGF0aCgpLCBjdXJyZW50SUZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJfQotCQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KGR0ZEZpbGVTdHJpbmcpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQluYW1lVGV4dC5zZXRUZXh0KGVudGl0eS5nZXROYW1lKCkpOwotCi0JCQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dChQQVJBTUVURVIpOwotCQkJCWVsc2UKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoR0VORVJBTCk7Ci0KLQkJCQlpZiAoZW50aXR5LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCQljaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCXBhZ2VCb29rLnNob3dQYWdlKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlKTsKLQkJCQkJcHVibGljSWRUZXh0LnNldFRleHQoZW50aXR5LmdldFB1YmxpY0lEKCkpOwotCQkJCQlzeXN0ZW1JZFRleHQuc2V0VGV4dChlbnRpdHkuZ2V0U3lzdGVtSUQoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQlwYWdlQm9vay5zaG93UGFnZShpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JCQkJCWVudGl0eVZhbHVlVGV4dC5zZXRUZXh0KGVudGl0eS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKTsKLQkJCWlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDAgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldE5hbWUobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBlbnRpdHlWYWx1ZVRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBlbnRpdHlWYWx1ZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHB1YmxpY0lkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHB1YmxpY0lkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFB1YmxpY0lEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gc3lzdGVtSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0U3lzdGVtSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTm90YXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTm90YXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOTYwZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05vdGF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE5vdGF0aW9uU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFVCTElDX0lEID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTVEVNX0lEID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9TWVNURU1fSUQ7Ci0KLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0KLQlwcml2YXRlIENMYWJlbCBwdWJsaWNJZExhYmVsOwotCXByaXZhdGUgQ0xhYmVsIHN5c3RlbUlkTGFiZWw7Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gcHVibGljSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gcHVibGljSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJTm90YXRpb24gbm90YXRpb24gPSAoTm90YXRpb24pIGlucHV0OwotCQkJCW5vdGF0aW9uLnNldFB1YmxpY0lEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gc3lzdGVtSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJTm90YXRpb24gbm90YXRpb24gPSAoTm90YXRpb24pIGlucHV0OwotCQkJCW5vdGF0aW9uLnNldFN5c3RlbUlEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXB1YmxpY0lkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgUFVCTElDX0lEKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBwdWJsaWNJZExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJcHVibGljSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFB1YmxpYyBJRAotCQlwdWJsaWNJZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXB1YmxpY0lkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaWNJZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJc3lzdGVtSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBTWVNURU1fSUQpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJcCA9IHN5c3RlbUlkTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlzeXN0ZW1JZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gU3lzdGVtIElECi0JCXN5c3RlbUlkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJc3lzdGVtSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5c3RlbUlkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlwdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJTm90YXRpb24gbm90YXRpb24gPSAoTm90YXRpb24pIGlucHV0OwotCQkJcHVibGljSWRUZXh0LnNldFRleHQoKG5vdGF0aW9uKS5nZXRQdWJsaWNJRCgpKTsKLQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KChub3RhdGlvbikuZ2V0U3lzdGVtSUQoKSk7Ci0JCX0KLQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1N2UwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNUmVwZWF0YWJsZU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpIHsKLQkJaWYgKHRvVGVzdCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlICYmICgoQ01CYXNpY05vZGUpIHRvVGVzdCkuaXNFbXB0eUFueU9yUENEYXRhKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgaWYgKHRvVGVzdCBpbnN0YW5jZW9mIENNUmVwZWF0YWJsZU5vZGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjVmZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNUmVwZWF0YWJsZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT05DRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfT05DRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPTkVfT1JfTU9SRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfT05FX09SX01PUkU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1BUSU9OQUwgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX09QVElPTkFMOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFpFUk9fT1JfTU9SRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfWkVST19PUl9NT1JFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9DQ1VSRU5DRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfT0NDVVJSRU5DRTsKLQotCXByaXZhdGUgQ0NvbWJvIG9jY3VycmVuY2VDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIG9jY3VycmVuY2VDb21ib1ZhbHVlcyA9IHtPTkNFLCBPTkVfT1JfTU9SRSwgT1BUSU9OQUwsIFpFUk9fT1JfTU9SRX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgdXNhZ2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBPQ0NVUkVOQ0UpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IHVzYWdlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQl1c2FnZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJb2NjdXJyZW5jZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNhZ2VMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlvY2N1cnJlbmNlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJb2NjdXJyZW5jZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlvY2N1cnJlbmNlQ29tYm8uc2V0SXRlbXMob2NjdXJyZW5jZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTVJlcGVhdGFibGVOb2RlKSB7Ci0JCQljaGFyIG9jY3VyZW5jZSA9ICgoQ01SZXBlYXRhYmxlTm9kZSkgaW5wdXQpLmdldE9jY3VycmVuY2UoKTsKLQkJCWlmIChDTVJlcGVhdGFibGVOb2RlLk9OQ0UgPT0gb2NjdXJlbmNlKQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KE9OQ0UpOwotCQkJZWxzZSBpZiAoQ01SZXBlYXRhYmxlTm9kZS5PTkVfT1JfTU9SRSA9PSBvY2N1cmVuY2UpCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoT05FX09SX01PUkUpOwotCQkJZWxzZSBpZiAoQ01SZXBlYXRhYmxlTm9kZS5PUFRJT05BTCA9PSBvY2N1cmVuY2UpCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoT1BUSU9OQUwpOwotCQkJZWxzZSBpZiAoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUgPT0gb2NjdXJlbmNlKQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KFpFUk9fT1JfTU9SRSk7Ci0JCQllbHNlCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoT05DRSk7Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01SZXBlYXRhYmxlTm9kZSkgewotCQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJCUNNUmVwZWF0YWJsZU5vZGUgbm9kZSA9IChDTVJlcGVhdGFibGVOb2RlKSBpbnB1dDsKLQkJCVN0cmluZyBvY2N1cnJlbmNlID0gb2NjdXJyZW5jZUNvbWJvLmdldFRleHQoKTsKLQkJCWlmIChPTkNFLmVxdWFscyhvY2N1cnJlbmNlKSkKLQkJCQlub2RlLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5PTkNFKTsKLQkJCWVsc2UgaWYgKE9ORV9PUl9NT1JFLmVxdWFscyhvY2N1cnJlbmNlKSkKLQkJCQlub2RlLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5PTkVfT1JfTU9SRSk7Ci0JCQllbHNlIGlmIChPUFRJT05BTC5lcXVhbHMob2NjdXJyZW5jZSkpCi0JCQkJbm9kZS5zZXRPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUuT1BUSU9OQUwpOwotCQkJZWxzZSBpZiAoWkVST19PUl9NT1JFLmVxdWFscyhvY2N1cnJlbmNlKSkKLQkJCQlub2RlLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUpOwotCQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODc5NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgVHlwZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFRZUEUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1RZUEU7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7QXR0cmlidXRlLkNEQVRBLCBBdHRyaWJ1dGUuSUQsIEF0dHJpYnV0ZS5JRFJFRiwgQXR0cmlidXRlLklEUkVGUywgQXR0cmlidXRlLkVOVElUWSwgQXR0cmlidXRlLkVOVElUSUVTLCBBdHRyaWJ1dGUuTk1UT0tFTiwgQXR0cmlidXRlLk5NVE9LRU5TLCBBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OQU1FLCBBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OT1RBVElPTn07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFRZUEUpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IGNMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpCi0JCQkJdHlwZUNvbWJvLnNldFRleHQoKChBdHRyaWJ1dGUpIGlucHV0KS5nZXRUeXBlKCkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGUpIGlucHV0OwotCQkJCWF0dHJpYnV0ZS5zZXRUeXBlKHR5cGVDb21iby5nZXRUZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYTVkZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0LklEVERQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgRFREIGNvbnRlbnQuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlcltdIGZMaW5lU3R5bGVQcm92aWRlcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQoKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxULCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04sIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTn07Ci0JCX0KLQkJcmV0dXJuIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2NyZWF0ZUxpbmVTdHlsZVByb3ZpZGVyRm9yRFREKCl9OwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgY3JlYXRlTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQoKSB7Ci0JCXJldHVybiBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc3NTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgRFREIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRFREVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURUxJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX05PVEFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0RURF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX0NPTU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9EVERfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0dST1VQX0FERF9HUk9VUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fR1JPVVBfSVRFTVNfTE9HSUNBTExZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fU09SVF9JVEVNUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9QQVJBTV9FTlRJVFlfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NT1ZFX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTU9WRV9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NT1ZFX05PREU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01PVkVfTk9ERVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0RURDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ1JFQVRFX05FV19EVERfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19EVERfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfRFREX0VYUEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRFREVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2ZTZkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIERURFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBEVERVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgZHRkIHVpLgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIGR0ZCB1aS4KLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRFREVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgZHRkIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBkdGQgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLCBEVERVSVByZWZlcmVuY2VOYW1lcy5URU1QTEFURVNfS0VZKTsKLQotCQkJdHJ5IHsKLQkJCQlmVGVtcGxhdGVTdG9yZS5sb2FkKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgZHRkIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBkdGQgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJfQotCi0JCXJldHVybiBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGFlOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVMSVNUPUFkZCBBdHRyaWJ1dGUgJkxpc3QKLQotIURURE91dGxpbmVyCi1fVUlfQUNUSU9OX0FERF9EVERfTk9UQVRJT049QWRkICZOb3RhdGlvbgotX1VJX0FDVElPTl9BRERfRFREX0VOVElUWT1BZGQgJkVudGl0eQotX1VJX0FDVElPTl9BRERfRFREX0VMRU1FTlQ9QWRkIEVsZSZtZW50Ci1fVUlfQUNUSU9OX0FERF9EVERfQ09NTUVOVD1BZGQgJkNvbW1lbnQKLV9VSV9BQ1RJT05fRFREX0RFTEVURT0mRGVsZXRlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEU9QWRkICZBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fR1JPVVBfQUREX0dST1VQPUFkZCBHcm91cCB0byBDb24mdGVudCBNb2RlbAotX1VJX0FDVElPTl9BRERfRUxFTUVOVD1BZGQgRWxlbWVudCB0byBDJm9udGVudCBNb2RlbAotCi0hRFREQ29udGVudE91dGxpbmVQYWdlCi1fVUlfQlVUVE9OX0dST1VQX0lURU1TX0xPR0lDQUxMWT1Hcm91cCBpdGVtcyBsb2dpY2FsbHkuCi1fVUlfQlVUVE9OX1NPUlRfSVRFTVM9U29ydCBpdGVtcyBhbHBoYWJldGljYWxseS4KLQotIURURENvbnRleHRDb250cmlidXRlcgotX1VJX0FDVElPTl9BRERfUEFSQU1fRU5USVRZX1JFRj1BZGQgJlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlCi0KLSFEcmFnQXR0cmlidXRlQ29tbWFuZAotX1VJX01PVkVfQVRUUklCVVRFPU1vdmUgQXR0cmlidXRlCi0KLSFEcmFnQ29udGVudE1vZGVsQ29tbWFuZAotX1VJX01PVkVfQ09OVEVOVD1Nb3ZlIENvbnRlbnQKLQotIURyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZAotX1VJX01PVkVfTk9ERT1Nb3ZlIE5vZGUKLV9VSV9NT1ZFX05PREVTPU1vdmUgTm9kZXMKLQotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0RURD1UaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgezB9LgotCi0jRFREIEZpbGUgcGFnZQotQ3JlYXRpbmdfZmlsZXM9Q3JlYXRpbmcgZmlsZXMKLURUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWw9QWRkIHRoaXMgc3VmZml4IChpZiBub3Qgc3BlY2lmaWVkKToKLURUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I9U3VmZml4IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgezB9LgotCi0jRFREIFN0eWxlIHBhZ2UKLURURENvbG9yUGFnZV8wPTwhRUxFTUVOVCBNYWluIChPbmUsVHdvKyk+XHJcbjwhRUxFTUVOVCBPbmUgKFRocmVlLEZvdXIpPlxyXG48IUFUVExJU1QgT25lXHJcbiBvbmVvbmUgQ0RBVEEgI1JFUVVJUkVEXHJcbj5cclxuPCEtLSBZb3UgbmVlZCB0aGlzIC0tPlxyXG48IUVMRU1FTlQgVHdvIChtb3JlbW9yZSopPlxyXG48IUFUVExJU1QgVHdvXHJcbiB0d290d28gQ0RBVEEgI1JFUVVJUkVEXHJcbiB0d290aHJlZSAoYWFhIHwgYmJiKSAiYWFhIlxyXG4+XHJcbgotRFREQ29sb3JQYWdlXzE9Q29tbWVudHMKLURURENvbG9yUGFnZV8yPURhdGEKLURURENvbG9yUGFnZV8zPURlZmF1bHQKLURURENvbG9yUGFnZV80PUtleXdvcmRzCi1EVERDb2xvclBhZ2VfNT1TdHJpbmdzCi1EVERDb2xvclBhZ2VfNj1TeW1ib2xzCi1EVERDb2xvclBhZ2VfNz1UYWcgRGVsaW1pdGVycwotRFREQ29sb3JQYWdlXzg9VGFnIE5hbWVzCi1EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMD1OYW1lCi1EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMT1Db250ZW50cwotRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzI9QXR0cmlidXRlcwotCi0hIE5ld0RURFdpemFyZC5qYXZhCi1fVUlfQ1JFQVRFX05FV19EVERfRklMRSAgICAgID0gQ3JlYXRlIGEgbmV3IERURCBmaWxlLgotX1VJX1dJWkFSRF9ORVdfRFREX1RJVExFICAgICA9IENyZWF0ZSBEVEQKLV9VSV9XSVpBUkRfTkVXX0RURF9FWFBMICAgICAgPSBDcmVhdGUgYSBuZXcgRFREIGZpbGUuIFNwZWNpZnkgdGhlIGZvbGRlciBhbmQgbmFtZSBmb3IgdGhlIGZpbGUuCi0KLSMgY29waWVkIGZyb20gZHRkIGNvcmUKLV9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEU9RGVsZXRlCi0jIwotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgRFREIFRlbXBsYXRlCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBEVEQgcGFnZS4KLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgRFREIFRlbXBsYXRlCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzU9UHJldmlldzoKLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgRFREJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkRURCBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KLQotU291cmNlTWVudV9sYWJlbD1Tb3VyY2UKLQotU3ludGF4Q29sb3JpbmdQYWdlXzA9U3ludGF4IEVsZW1lbnQ6Ci1TeW50YXhDb2xvcmluZ1BhZ2VfMj1FbmFibGUKLVN5bnRheENvbG9yaW5nUGFnZV8zPSZCb2xkCi1TeW50YXhDb2xvcmluZ1BhZ2VfND0mSXRhbGljCi1TeW50YXhDb2xvcmluZ1BhZ2VfNT0mU3RyaWtldGhyb3VnaAotU3ludGF4Q29sb3JpbmdQYWdlXzY9JlVuZGVybGluZQotCi1fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LPURURCBwcmVmZXJlbmNlcy4gIE5vdGUgdGhhdCBzb21lIHByZWZlcmVuY2VzIG1heSBiZSBzZXQgb24gdGhlIDxhPnswfTwvYT4gcHJlZmVyZW5jZSBwYWdlLgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjRlZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRFRERHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RURERyYWdBbmREcm9wTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTUwNTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRFRERHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRHJhZ0FuZERyb3BNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuVG9wTGV2ZWxOb2RlOwotCi1wdWJsaWMgY2xhc3MgRFRERHJhZ0FuZERyb3BNYW5hZ2VyIGltcGxlbWVudHMgRHJhZ0FuZERyb3BNYW5hZ2VyIHsKLQotCXB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlKSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCi0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRvcExldmVsTm9kZSkgewotCQkJCXJldHVybiBuZXcgRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLQkJCX0KLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIG5ldyBEcmFnQXR0cmlidXRlQ29tbWFuZCh0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJCXJldHVybiBuZXcgRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdBdHRyaWJ1dGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdBdHRyaWJ1dGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NTExYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnQXR0cmlidXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLQotCi0KLXB1YmxpYyBjbGFzcyBEcmFnQXR0cmlidXRlQ29tbWFuZCBleHRlbmRzIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQgewotCi0JcHVibGljIERyYWdBdHRyaWJ1dGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKSB7Ci0JCXN1cGVyKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0JCURUREZpbGUgZHRkRmlsZSA9IHJlZmVyZW5jZU5vZGUuZ2V0RFRERmlsZSgpOwotCQlpZiAocmVmZXJlbmNlTm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURFVJTWVzc2FnZXMuX1VJX01PVkVfQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAotCQkJQXR0cmlidXRlTGlzdCBhdHRMaXN0ID0gKEF0dHJpYnV0ZUxpc3QpIHJlZmVyZW5jZU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCQlhdHRMaXN0Lmluc2VydEludG9Nb2RlbCh0aGlzLCAoQXR0cmlidXRlKSByZWZlcmVuY2VOb2RlLCAoQXR0cmlidXRlKSBub2RlLCBpc0FmdGVyKCkpOwotCQkJCQlkdGRGaWxlLmRlbGV0ZU5vZGUodGhpcywgbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjZGI4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdDb250ZW50TW9kZWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCXB1YmxpYyBEcmFnQ29udGVudE1vZGVsQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcykgewotCQlzdXBlcih0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIENNTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQ01Ob2RlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEVEROb2RlIHJlZmVyZW5jZU5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCi0JCWlmIChyZWZlcmVuY2VOb2RlIGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQlEVERGaWxlIGR0ZEZpbGUgPSByZWZlcmVuY2VOb2RlLmdldERUREZpbGUoKTsKLQotCQkJRFRETm9kZSBwYXJlbnQgPSAoRFRETm9kZSkgcmVmZXJlbmNlTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlkdGRGaWxlLmdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREVUlNZXNzYWdlcy5fVUlfTU9WRV9DT05URU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJYm9vbGVhbiBwYXJlbnRJc0VsZW1lbnQgPSBmYWxzZTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQlDTUdyb3VwTm9kZSBncm91cCA9IG51bGw7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCXBhcmVudElzRWxlbWVudCA9IHRydWU7Ci0JCQkJZWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlncm91cCA9IChDTUdyb3VwTm9kZSkgcGFyZW50OwotCQkJfQotCi0JCQlpZiAoZWxlbWVudCA9PSBudWxsICYmIGdyb3VwID09IG51bGwpIHsKLQkJCQkvLyBubyBwYXJlbnQgdG8gYWRkIHRvCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJdGVyYXRvciBpdGVyID0gc291cmNlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQkJCWlmIChwYXJlbnRJc0VsZW1lbnQpIHsKLQkJCQkJCWlmIChlbGVtZW50LmdldENvbnRlbnRNb2RlbCgpID09IG5vZGUpIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWVsZW1lbnQucmVwbGFjZUNvbnRlbnRNb2RlbCh0aGlzLCAoQ01Ob2RlKSBub2RlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChyZWZlcmVuY2VOb2RlID09IG5vZGUgfHwgKGlzQWZ0ZXIoKSAmJiByZWZlcmVuY2VOb2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbm9kZSkgfHwgKCFpc0FmdGVyKCkgJiYgbm9kZS5nZXROZXh0U2libGluZygpID09IHJlZmVyZW5jZU5vZGUpKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCWdyb3VwLmluc2VydEludG9Nb2RlbCh0aGlzLCAoQ01Ob2RlKSByZWZlcmVuY2VOb2RlLCAoQ01Ob2RlKSBub2RlLCBpc0FmdGVyKCkpOwotCi0JCQkJCX0KLQkJCQkJRFRETm9kZSBub2RlUGFyZW50ID0gKERURE5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlub2RlUGFyZW50LmRlbGV0ZSh0aGlzLCBub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkdGRGaWxlLmdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRGZWVkYmFjaygpIHsKLQkJRFRETm9kZSByZWZlcmVuY2VOb2RlID0gKERURE5vZGUpIHRhcmdldDsKLQkJaWYgKHJlZmVyZW5jZU5vZGUgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCUNNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKSByZWZlcmVuY2VOb2RlOwotCQkJaWYgKGNtTm9kZS5pc1Jvb3RFbGVtZW50Q29udGVudCgpICYmIGNtTm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJcmV0dXJuIERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0RmVlZGJhY2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliODcyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlRvcExldmVsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBtb3ZlTm9kZSA9IERURFVJTWVzc2FnZXMuX1VJX01PVkVfTk9ERTsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBtb3ZlTm9kZXMgPSBEVERVSU1lc3NhZ2VzLl9VSV9NT1ZFX05PREVTOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKSB7Ci0JCXN1cGVyKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0KLQkJRFRERmlsZSBkdGRGaWxlID0gcmVmZXJlbmNlTm9kZS5nZXREVERGaWxlKCk7Ci0JCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBzb3VyY2VzLnNpemUoKSA+IDEgPyBtb3ZlTm9kZXMgOiBtb3ZlTm9kZSk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCQlkdGRGaWxlLm1vdmVOb2RlKHRoaXMsIHJlZmVyZW5jZU5vZGUsIG5vZGUsIGlzQWZ0ZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjQ5MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIFhNTEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yCi0gKiAKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSBtdWx0aSBwYWdlIGVkaXRvcidzCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciwgc2luY2UgY2FzY2FkZWQgaW5pdCgpIGNhbGwgZnJvbSB0aGUKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yIHdpbGwgY2F1c2VzIGV4Y2VwdGlvbiBhbmQgaXQgbGVhZHMgdG8gbG9zZSB3aG9sZQotICogdG9vbGJhcnMuCi0gKiAKLSAqIEluc3RlYWQsIHVzZSBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yIG9mCi0gKiBtdWx0aSBwYWdlIGVkaXRvci4KLSAqIAotICogTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3RpbGwgdmFsaWQgZm9yIHNpbmdsZSBwYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnRyaWJ1dG9yRFREIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3IgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRURJVE9SX0lEUyA9IHsib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnV0aWwuQWN0aW9uQ29udHJpYnV0b3IjZ2V0RXh0ZW5zaW9uSURzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gZWRpdCBjb21tYW5kcwotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZk1lbnVBZGRpdGlvbnNHcm91cE1hcmtlcik7Ci0JCX0KLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJU3RyaW5nIHNvdXJjZU1lbnVMYWJlbCA9IERURFVJTWVzc2FnZXMuU291cmNlTWVudV9sYWJlbDsKLQkJU3RyaW5nIHNvdXJjZU1lbnVJZCA9ICJzb3VyY2VNZW51SWQiOyAvLyROT04tTkxTLTEkCi0JCUlNZW51TWFuYWdlciBzb3VyY2VNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHNvdXJjZU1lbnVMYWJlbCwgc291cmNlTWVudUlkKTsKLQkJbWVudS5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCwgc291cmNlTWVudSk7Ci0JCWlmIChzb3VyY2VNZW51ICE9IG51bGwpIHsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRSaWdodCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRMZWZ0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCX0KLQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudSA9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKLQkJaWYgKG5hdmlnYXRlTWVudSAhPSBudWxsKSB7Ci0JCQlJTWVudU1hbmFnZXIgZ290b0dyb3VwID0gbmF2aWdhdGVNZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR09fVE8pOwotCQkJaWYgKGdvdG9Hcm91cCAhPSBudWxsKSB7Ci0JCQkJZ290b0dyb3VwLmFkZChmR290b01hdGNoaW5nQnJhY2tldEFjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZDk0OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8gc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQTFVHSU5JRCA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5IC0gaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvRFRERWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmJlZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIERURCBTb3VyY2UgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFZGl0b3JQbHVnaW5JbWFnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfQVRUUklCVVRFID0gImljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfRUxFTUVOVCA9ICJpY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMID0gImljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQUREX0FUVFJJQlVURSA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0FERF9FTEVNRU5UID0gImljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQUREX0dST1VQVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0FERF9BVFRSSUJVVEUgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9BRERfRUxFTUVOVCA9ICJpY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BRERfQ09NTUVOVCA9ICJpY29ucy9mdWxsL29iajE2L0FERF9Db21tZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9FTlRJVFkgPSAiaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9FTlRJVFlfUkVGRVJFTkNFID0gImljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQUREX05PVEFUSU9OID0gImljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX09SR0FOSVpFX0RURF9MT0dJQ0FMTFkgPSAiaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NPUlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1ZBTElEQVRFID0gImljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fTkVXRFRERklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjZTIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgRFREIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgIi4iOyAvLyROT04tTkxTLTEkCi0JLy8gRFREIEZpbGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9QUkVGV0VCWF9GSUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMjAiOyAvLyROT04tTkxTLTEkCi0JLy8gRFREIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAyMSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBEVEQgVGVtcGxhdGUgUHJlZmVyZW5jZSBwYWdlIChubyBpZCBmb3IgdGhpcyB5ZXQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMjIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyAvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gRFREIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCArICJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERURCBOZXcgRmlsZSBXaXphcmQgLSBUZW1wbGF0ZSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQgPSBQUkVGSVggKyAiZHRkdzAwMTAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMTg1NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb2xvclBhZ2UgZXh0ZW5kcyBBYnN0cmFjdENvbG9yUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCSgoR3JpZERhdGEpIHBhZ2VDb21wb25lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCi0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhZ2VDb21wb25lbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsIElIZWxwQ29udGV4dElkcy5EVERfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0KLQkJcmV0dXJuIHBhZ2VDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCQlJdGVyYXRvciBpID0gc3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpIGkubmV4dCgpKSk7Ci0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfRU1QVFksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9BTlksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkFNRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5EX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJULCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwsIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzIpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxULCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8zKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNCk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORywgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNik7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRywgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNyk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFN0eWxlTGlzdChBcnJheUxpc3QgbGlzdCkgewotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldHVwUGlja2VyKFN0eWxlZFRleHRDb2xvclBpY2tlciBwaWNrZXIpIHsKLQkJSU1vZGVsTWFuYWdlciBtbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXBpY2tlci5zZXRQYXJzZXIobW1hbmFnZXIuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpLmdldFBhcnNlcigpKTsKLQotCQlEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCi0JCURpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCXBpY2tlci5zZXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJcGlja2VyLnNldERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlwaWNrZXIuc2V0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RUREZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZmYxNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RUREZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VMaW5rQXJlYTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERGaWxlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBDb21ibyBmRGVmYXVsdFN1ZmZpeCA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0KLQkJbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiLCBEVERVSU1lc3NhZ2VzLl9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTkssLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotCi0JCUdyb3VwIGNyZWF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChjb21wb3NpdGUsIDIpOwotCQljcmVhdGluZ0dyb3VwLnNldFRleHQoRFREVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlcyk7Ci0KLQkJLy8gRGVmYXVsdCBleHRlbnNpb24gZm9yIE5ldyBmaWxlIFdpemFyZAotCQljcmVhdGVMYWJlbChjcmVhdGluZ0dyb3VwLCBEVERVSU1lc3NhZ2VzLkRUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWwpOwotCQlmRGVmYXVsdFN1ZmZpeCA9IGNyZWF0ZURyb3BEb3duQm94KGNyZWF0aW5nR3JvdXApOwotCQlTdHJpbmdbXSB2YWxpZEV4dGVuc2lvbnMgPSAoU3RyaW5nW10pIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCUFycmF5cy5zb3J0KHZhbGlkRXh0ZW5zaW9ucyk7Ci0JCWZEZWZhdWx0U3VmZml4LnNldEl0ZW1zKHZhbGlkRXh0ZW5zaW9ucyk7Ci0JCWZEZWZhdWx0U3VmZml4LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmRGVmYXVsdFN1ZmZpeC5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI2dldE1vZGVsUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJU3RyaW5nIHN1ZmZpeCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoRFREQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0JCWZEZWZhdWx0U3VmZml4LnNldFRleHQoc3VmZml4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0VGV4dChzdWZmaXgpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlTdHJpbmcgc3VmZml4ID0gZkRlZmF1bHRTdWZmaXguZ2V0VGV4dCgpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoRFREQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTiwgc3VmZml4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRWYWxpZEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkgJiYgIWlzVmFsaWQpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlzVmFsaWQgPSBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoRFREVUlNZXNzYWdlcy5EVERGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRWYWxpZCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERTeW50YXhDb2xvcmluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3NWNiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29sb3JTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEEgcHJlZmVyZW5jZSBwYWdlIHRvIGNvbmZpZ3VyZSBvdXIgWE1MIHN5bnRheCBjb2xvci4gSXQgcmVzZW1ibGVzIHRoZSBKRFQKLSAqIGFuZCBDRFQgcGFnZXMgZmFyIG1vcmUgdGhhbiBvdXIgb3JpZ2luYWwgY29sb3IgcGFnZSB3aGlsZSByZXRhaW5pbmcgdGhlCi0gKiBleHRyYSAiY2xpY2stdG8tZmluZCIgZnVuY3Rpb25hbGl0eS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERURFN5bnRheENvbG9yaW5nUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGZCb2xkOwotCXByaXZhdGUgTGFiZWwgZkZvcmVncm91bmRMYWJlbDsKLQlwcml2YXRlIExhYmVsIGZCYWNrZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsZWFyU3R5bGU7Ci0JcHJpdmF0ZSBNYXAgZkNvbnRleHRUb1N0eWxlTWFwOwotCXByaXZhdGUgQ29sb3IgZkRlZmF1bHRGb3JlZ3JvdW5kID0gbnVsbDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0QmFja2dyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkZvcmVncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkJhY2tncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIEJ1dHRvbiBmSXRhbGljOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCXByaXZhdGUgQnV0dG9uIGZTdHJpa2U7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciBmU3R5bGVzVmlld2VyID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwOwotCXByaXZhdGUgU3R5bGVkVGV4dCBmVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmVW5kZXJsaW5lOwotCi0JLy8gYWN0aXZhdGUgY29udHJvbHMgYmFzZWQgb24gdGhlIGdpdmVuIGxvY2FsIGNvbG9yIHR5cGUKLQlwcml2YXRlIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJQ29sb3IgZm9yZWdyb3VuZCA9IGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQkJQ29sb3IgYmFja2dyb3VuZCA9IGZEZWZhdWx0QmFja2dyb3VuZDsKLQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkgewotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJvbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZTdHJpa2Uuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7Ci0JCQlmSXRhbGljLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSCkgIT0gMCk7Ci0JCQlmVW5kZXJsaW5lLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlVOREVSTElORSkgIT0gMCk7Ci0JCQlpZiAoYXR0cmlidXRlLmdldEZvcmVncm91bmQoKSAhPSBudWxsKSB7Ci0JCQkJZm9yZWdyb3VuZCA9IGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQl9Ci0JCQlpZiAoYXR0cmlidXRlLmdldEJhY2tncm91bmQoKSAhPSBudWxsKSB7Ci0JCQkJYmFja2dyb3VuZCA9IGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQl9Ci0JCX0KLQotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoZm9yZWdyb3VuZC5nZXRSR0IoKSk7Ci0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0Q29sb3JWYWx1ZShiYWNrZ3JvdW5kLmdldFJHQigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xvciB0aGUgdGV4dCBpbiB0aGUgc2FtcGxlIGFyZWEgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzCi0JICovCi0Jdm9pZCBhcHBseVN0eWxlcygpIHsKLQkJaWYgKGZUZXh0ID09IG51bGwgfHwgZlRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZkRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXdoaWxlIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkvLyBsb29rdXAgdGhlIGxvY2FsIGNvbG9yaW5nIHR5cGUgYW5kIGFwcGx5IGl0Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpKTsKLQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlUZXh0QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZUZvcihuYW1lZFN0eWxlKTsKLQkJCQlpZiAoYXR0cmlidXRlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChjdXJyZW50UmVnaW9uKSwgY3VycmVudFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRTdHlsZSgpKTsKLQkJCQlzdHlsZS5zdHJpa2VvdXQgPSAoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDA7Ci0JCQkJc3R5bGUudW5kZXJsaW5lID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDA7Ci0JCQkJZlRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JCQl9Ci0JCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJfQotCX0KLQotCUJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21wb3NpdGUgY29udHJvbCBhbmQgc2V0cyB0aGUgZGVmYXVsdCBsYXlvdXQgZGF0YS4KLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJZkRlZmF1bHRGb3JlZ3JvdW5kID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLQkJZkRlZmF1bHRCYWNrZ3JvdW5kID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQkJQ29tcG9zaXRlIHBhZ2VDb21wb25lbnQgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAyKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKHBhZ2VDb21wb25lbnQsIFNXVC5XUkFQKTsKLQkJbGluay5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfTGluayk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihwYXJlbnQuZ2V0U2hlbGwoKSwgZS50ZXh0LCBudWxsLCBudWxsKTsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JpZERhdGEgbGlua0RhdGE9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rRGF0YS53aWR0aEhpbnQ9IDE1MDsgLy8gb25seSBleHBhbmQgZnVydGhlciBpZiBhbnlvbmUgZWxzZSByZXF1aXJlcyBpdAotCQlsaW5rLnNldExheW91dERhdGEobGlua0RhdGEpOwotCi0JCW5ldyBMYWJlbChwYWdlQ29tcG9uZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCW5ldyBMYWJlbChwYWdlQ29tcG9uZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJU2FzaEZvcm0gZWRpdG9yID0gbmV3IFNhc2hGb3JtKHBhZ2VDb21wb25lbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMiA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YTIuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShncmlkRGF0YTIpOwotCQlTYXNoRm9ybSB0b3AgPSBuZXcgU2FzaEZvcm0oZWRpdG9yLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUNvbXBvc2l0ZSBzdHlsZUVkaXRvciA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5SaWdodCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAwOwotCQljcmVhdGVMYWJlbChzdHlsZUVkaXRvciwgRFREVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMCk7Ci0JCWZTdHlsZXNWaWV3ZXIgPSBjcmVhdGVTdHlsZXNWaWV3ZXIoc3R5bGVFZGl0b3IpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IE1hdGgubWF4KGdyaWREYXRhLndpZHRoSGludCwgY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpLmxlbmd0aCgpKSk7Ci0JCX0KLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWZTdHlsZXNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbXBvc2l0ZSBlZGl0aW5nQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvcCwgMSk7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSA1OwotCQljcmVhdGVMYWJlbChlZGl0aW5nQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnV0dG9uIGVuYWJsZXIgPSBjcmVhdGVDaGVja2JveChlZGl0aW5nQ29tcG9zaXRlLCBEVERVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8yKTsKLQkJZW5hYmxlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZW5hYmxlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCUNvbXBvc2l0ZSBlZGl0Q29udHJvbHMgPSBjcmVhdGVDb21wb3NpdGUoZWRpdGluZ0NvbXBvc2l0ZSwgMik7Ci0JCSgoR3JpZExheW91dCkgZWRpdENvbnRyb2xzLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMjA7Ci0KLQkJZkZvcmVncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKGVkaXRDb250cm9scywgU1NFVUlNZXNzYWdlcy5Gb3JlZ3JvdW5kX1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZGb3JlZ3JvdW5kTGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvciA9IG5ldyBDb2xvclNlbGVjdG9yKGVkaXRDb250cm9scyk7Ci0JCUJ1dHRvbiBmRm9yZWdyb3VuZENvbG9yID0gZkZvcmVncm91bmRDb2xvckVkaXRvci5nZXRCdXR0b24oKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWZGb3JlZ3JvdW5kQ29sb3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkJhY2tncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKGVkaXRDb250cm9scywgU1NFVUlNZXNzYWdlcy5CYWNrZ3JvdW5kX1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZCYWNrZ3JvdW5kTGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvciA9IG5ldyBDb2xvclNlbGVjdG9yKGVkaXRDb250cm9scyk7Ci0JCUJ1dHRvbiBmQmFja2dyb3VuZENvbG9yID0gZkJhY2tncm91bmRDb2xvckVkaXRvci5nZXRCdXR0b24oKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWZCYWNrZ3JvdW5kQ29sb3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkJvbGQgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIERURFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzMpOwotCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZkJvbGQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZJdGFsaWMgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIERURFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzQpOwotCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmSXRhbGljLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmU3RyaWtlID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBEVERVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV81KTsKLQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZlN0cmlrZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlVuZGVybGluZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgRFREVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNik7Ci0JCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZVbmRlcmxpbmUuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZDbGVhclN0eWxlID0gbmV3IEJ1dHRvbihlZGl0aW5nQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWZDbGVhclN0eWxlLnNldFRleHQoU1NFVUlNZXNzYWdlcy5SZXN0b3JlX0RlZmF1bHRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJSZXN0b3JlIERlZmF1bHQiCi0JCWZDbGVhclN0eWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcpKTsKLQkJKChHcmlkRGF0YSlmQ2xlYXJTdHlsZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIHNhbXBsZUFyZWEgPSBjcmVhdGVDb21wb3NpdGUoZWRpdG9yLCAxKTsKLQotCQkoKEdyaWRMYXlvdXQpIHNhbXBsZUFyZWEuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHNhbXBsZUFyZWEuZ2V0TGF5b3V0KCkpLm1hcmdpblRvcCA9IDU7Ci0JCWNyZWF0ZUxhYmVsKHNhbXBsZUFyZWEsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiJlNhbXBsZSB0ZXh0OiIKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBTb3VyY2VWaWV3ZXIoc2FtcGxlQXJlYSwgbnVsbCwgU1dULkJPUkRFUiB8IFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0JCWZUZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEzID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhMy53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMjApOwotCQlncmlkRGF0YTMuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWdyaWREYXRhMy5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEzKTsKLQkJZlRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlmVGV4dC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7Ly8kTk9OLU5MUy0xJAotCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihnZXRUZXh0S2V5TGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkTW91c2VMaXN0ZW5lcihnZXRUZXh0TW91c2VMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihnZXRUcmF2ZXJzZUxpc3RlbmVyKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZUZXh0LCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOwotCQlmRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJZkRvY3VtZW50LnNldChnZXRFeGFtcGxlVGV4dCgpKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGZEb2N1bWVudCk7Ci0KLQkJdG9wLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJZWRpdG9yLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCWZTdHlsZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpKTsKLQotCQlhcHBseVN0eWxlcygpOwotCi0JCWZTdHlsZXNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1swXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1swXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1sxXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1syXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkl0YWxpYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZTdHJpa2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1s0XTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZlN0cmlrZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s0XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmVW5kZXJsaW5lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNV07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZVbmRlcmxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlmQ2xlYXJTdHlsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybjsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VG9EZWZhdWx0KG5hbWVkU3R5bGUpOwotCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsYWJlbC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIExhYmVsIGNyZWF0ZURlc2NyaXB0aW9uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByaXZhdGUgT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSXRlcmF0b3IgaSA9IGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgTGlzdCB2aWV3ZXIgd2hlcmUgd2Ugc2VlIHRoZSB2YXJpb3VzIHN5bnRheCBlbGVtZW50IGRpc3BsYXkKLQkgKiBuYW1lcy0td291bGQgaXQgZXZlciBiZSBhIFRyZWUgbGlrZSBKRFQncz8KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciBjcmVhdGVTdHlsZXNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJ1Y3R1cmVkVmlld2VyIHN0eWxlc1ZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZXNWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcihDb2xsYXRvci5nZXRJbnN0YW5jZSgpKSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJT2JqZWN0IGRlc2NyaXB0aW9uID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkJCXJldHVybiBkZXNjcmlwdGlvbi50b1N0cmluZygpOwotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9KTsKLQkJc3R5bGVzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpLnRvQXJyYXkoKTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gc3R5bGVzVmlld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCWZPdmVybGF5U3RvcmUuc3RvcCgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZShmRGVmYXVsdEZvcmVncm91bmQsIGZEZWZhdWx0QmFja2dyb3VuZCwgU1dULk5PUk1BTCk7Ci0KLQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCAmJiBmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCS8vIG5vdGU6ICJuYW1lZFN0eWxlIiAqaXMqIHRoZSBwcmVmZXJlbmNlIGtleQotCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMF0pOwotCQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0KLQkJCQlpbnQgZm9udE1vZGlmaWVyID0gU1dULk5PUk1BTDsKLQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDIpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzJdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDMpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzNdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0eWxlUHJlZnMubGVuZ3RoID4gNCkgewotCQkJCQlib29sZWFuIG9uID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbNF0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAob24pCi0JCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDUpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzVdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZSgoZm9yZWdyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoZm9yZWdyb3VuZCkgOiBudWxsLCAoYmFja2dyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoYmFja2dyb3VuZCkgOiBudWxsLCBmb250TW9kaWZpZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRFeGFtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwotCQllbHNlIGlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldCgwKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiAhZG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgdGhlIElUZXh0UmVnaW9uJ3MgQ29udGV4dCBhdCB0aGlzIG9mZnNldAotCQkJSVRleHRSZWdpb24gaW50ZXJlc3QgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGludGVyZXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAob2Zmc2V0ID4gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChpbnRlcmVzdCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgcmVnaW9uQ29udGV4dCA9IGludGVyZXN0LmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25Db250ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyBmaW5kIHRoZSBuYW1lZCBzdHlsZSAoaW50ZXJuYWwvc2VsZWN0YWJsZSBuYW1lKSBmb3IgdGhhdAotCQkJLy8gY29udGV4dAotCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBnZXRPdmVybGF5U3RvcmUoKSB7Ci0JCXJldHVybiBmT3ZlcmxheVN0b3JlOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkgewotCQlpZiAoZlN0eWxlUHJlZmVyZW5jZUtleXMgPT0gbnVsbCkgewotCQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsgLy8kTk9OLU5MUy0xJAotCQkJZlN0eWxlUHJlZmVyZW5jZUtleXMgPSBzdHlsZXM7Ci0JCX0KLQkJcmV0dXJuIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCX0KLQotCXByaXZhdGUgS2V5TGlzdGVuZXIgZ2V0VGV4dEtleUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBnZXRUZXh0TW91c2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciBnZXRUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyI2tleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpZiAoKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgfHwgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpKQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQlzZXREZXNjcmlwdGlvbihTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0Rlc2NyaXB0aW9uKTsKLQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCk7Ci0JCWluaXRSZWdpb25Db250ZXh0VG9TdHlsZU1hcCgpOwotCi0JCWZPdmVybGF5U3RvcmUgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpKTsKLQkJZk92ZXJsYXlTdG9yZS5sb2FkKCk7Ci0JCWZPdmVybGF5U3RvcmUuc3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCkgewotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfRU1QVFksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9BTlksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkFNRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5EX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJULCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwsIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKSB7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMSk7IC8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8yKTsgLy8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzMpOyAvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNCk7IC8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzUpOyAvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV82KTsgLy8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRywgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNyk7IC8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV84KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLmxvYWREZWZhdWx0cygpOwotCQlhcHBseVN0eWxlcygpOwotCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJYWN0aXZhdGUobnVsbCk7Ci0JCWZUZXh0LnJlZHJhdygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkucHJvcGFnYXRlKCk7Ci0KLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RDb2xvckF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBnZXROYW1lZFN0eWxlQXRPZmZzZXQob2Zmc2V0KTsKLQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZWRTdHlsZSkpOwotCQkJZlN0eWxlc1ZpZXdlci5yZXZlYWwobmFtZWRTdHlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJfQotCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWZpY2FsbHkgc2V0IHRoZSByZXBvcnRpbmcgbmFtZSBvZiBhIGNvbnRyb2wgZm9yIGFjY2Vzc2liaWxpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWNjZXNzaWJsZShDb250cm9sIGNvbnRyb2wsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIFN0cmluZyBuID0gbmFtZTsKLQkJY29udHJvbC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpCi0JCQkJCWUucmVzdWx0ID0gbjsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjY2EzODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBEVEQgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0KLQljbGFzcyBEVERFZGl0VGVtcGxhdGVEaWFsb2cgZXh0ZW5kcyBFZGl0VGVtcGxhdGVEaWFsb2cgewotCQlwdWJsaWMgRFRERWRpdFRlbXBsYXRlRGlhbG9nKFNoZWxsIHBhcmVudCwgVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlLCBDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCByZWdpc3RyeSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQoKTsKLQotCQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSBuZXcgQ29udGVudEFzc2lzdGFudCgpOwotCQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0FjdGl2YXRpb24odHJ1ZSk7Ci0JCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvSW5zZXJ0KHRydWUpOwotCQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihnZXRUZW1wbGF0ZVByb2Nlc3NvcigpLCBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQkJCQlyZXR1cm4gYXNzaXN0YW50OwotCQkJCX0KLQkJCX07Ci0JCQlyZXR1cm4gZG9DcmVhdGVWaWV3ZXIocGFyZW50LCBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlEVERVSVBsdWdpbiBkdGRVSVBsdWdpbiA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoZHRkVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlzZXRUZW1wbGF0ZVN0b3JlKGR0ZFVJUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoZHRkVUlQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBvazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpIHsKLQkJLy8gdGVtcGxhdGUgZm9ybWF0dGluZyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKGFuY2VzdG9yKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gdmlld2VyQ29uZmlndXJhdGlvbikgewotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREOwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUodmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdCBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLQkgKiBhIGN1c3RvbSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIGVkaXQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgZWRpdGFibGUKLQkgKiBAcGFyYW0gaXNOYW1lTW9kaWZpYWJsZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9yIG1vZGlmaWVkIHRlbXBsYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGVkaXRpb24gZmFpbGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZSBlZGl0VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlKSB7Ci0JCUVkaXRUZW1wbGF0ZURpYWxvZyBkaWFsb2cgPSBuZXcgRFRERWRpdFRlbXBsYXRlRGlhbG9nKGdldFNoZWxsKCksIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCBnZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KCkpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiBkaWFsb2cuZ2V0VGVtcGxhdGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQ1NThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIERURCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBEVEQgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgSlVTVElUQUxJQyA9ICIgfCBudWxsIHwgZmFsc2UgfCB0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgMCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgc3R5bGVWYWx1ZSk7IC8vIGJsYWNrCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHLCA2MywgNjMsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHLCBzdHlsZVZhbHVlKTsgLy8gYmx1ZQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FLCA2MywgNjMsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSwgc3R5bGVWYWx1ZSk7IC8vIGJsdWUKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5ULCAxMjcsIDEyNywgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5ULCBzdHlsZVZhbHVlKTsgLy8gZ3JleQotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQsIDEyOCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCwgc3R5bGVWYWx1ZSk7IC8vIGRhcmsKLQkJLy8gcmVkCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCA2MywgMTU5LCA5NSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCBzdHlsZVZhbHVlKTsgLy8gZ3JlZW4KLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBLCAxOTEsIDk1LCA5NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSwgc3R5bGVWYWx1ZSk7IC8vIGxpZ2h0Ci0JCS8vIHJlZAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCwgMTI4LCAwLCAwKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wsIHN0eWxlVmFsdWUpOyAvLyBkYXJrCi0JCS8vIHJlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZjJmNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBrZXlzIGZvciBEVEQgVUkKLSAqLwotcHVibGljIGNsYXNzIERURFVJUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIERURFVJUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIGluc3RhbmNlCi0JfQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgRFREIGZpbGUgd2l6YXJkLgotCSAqIFRlbXBsYXRlIG5hbWUgaXMgc3RvcmVkIGluc3RlYWQgb2YgdGVtcGxhdGUgaWQgYmVjYXVzZSB1c2VyLWNyZWF0ZWQKLQkgKiB0ZW1wbGF0ZXMgZG8gbm90IGhhdmUgdGVtcGxhdGUgaWRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJuZXdGaWxlVGVtcGxhdGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZGQxM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlRvcExldmVsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudC5JRFRERmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudC5Ob2Rlc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHRoZSBwcm9qZWN0aW9uIG1vZGVsIG9mIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgRFRELgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIsIElQcm9qZWN0aW9uTGlzdGVuZXIsIElEVERGaWxlTGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5kdGQudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBjbGFzcyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleHRlbmRzIFByb2plY3Rpb25Bbm5vdGF0aW9uIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc1Zpc2libGUgPSBmYWxzZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJcHJpdmF0ZSBOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihOb2RlIG5vZGUsIGJvb2xlYW4gaXNDb2xsYXBzZWQpIHsKLQkJCXN1cGVyKGlzQ29sbGFwc2VkKTsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKQotCQkJCXN1cGVyLm1hcmtDb2xsYXBzZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbnMgdG8gZG9jdW1lbnQgdG8gYmUgYXdhcmUgb2Ygd2hlbiB0byB1cGRhdGUgdGhlIHByb2plY3Rpb24KLQkgKiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqLwotCWNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZkRvY3VtZW50ID09IGV2ZW50LmdldERvY3VtZW50KCkpCi0JCQkJZklzRG9jdW1lbnRDaGFuZ2luZyA9IHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJLy8gcmVnaXN0ZXIgYSBwb3N0IG5vdGlmaWNhdGlvbiByZXBsYWNlIHNvIHRoYXQgcHJvamVjdGlvbgotCQkJLy8gYW5ub3RhdGlvbiBtb2RlbCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgYWxsIGRvY3VtZW50Q2hhbmdlZAotCQkJLy8gbGlzdGVuZXJzIGhhdmUgYmVlbiBub3RpZmllZAotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbiAmJiBmRG9jdW1lbnQgPT0gZG9jdW1lbnQpIHsKLQkJCQlpZiAoZlZpZXdlciAhPSBudWxsICYmIGZRdWV1ZWROb2RlQ2hhbmdlcyAhPSBudWxsICYmICFmUXVldWVkTm9kZUNoYW5nZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uKSBkb2N1bWVudCkucmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZSh0aGlzLCBuZXcgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVzc2VudGlhbGx5IGEgcG9zdCBkb2N1bWVudCBjaGFuZ2VkIGxpc3RlbmVyIGJlY2F1c2UgaXQgaXMgY2FsbGVkIGFmdGVyCi0JICogZG9jdW1lbnRjaGFuZ2VkIGhhcyBiZWVuIGZpcmVkLgotCSAqLwotCWNsYXNzIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSB7Ci0JCXB1YmxpYyB2b2lkIHBlcmZvcm0oSURvY3VtZW50IGRvY3VtZW50LCBJRG9jdW1lbnRMaXN0ZW5lciBvd25lcikgewotCQkJYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCQlmSXNEb2N1bWVudENoYW5naW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb250YWlucyBub2RlIGFuZCBhbiBpbmRpY2F0aW9uIG9uIGhvdyBpdCBjaGFuZ2VkCi0JICovCi0JY2xhc3MgTm9kZUNoYW5nZSB7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgQUREID0gMTsKLQkJc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAyOwotCi0JCXByaXZhdGUgTm9kZSBmTm9kZTsKLQkJcHJpdmF0ZSBpbnQgZkNoYW5nZVR5cGU7Ci0KLQkJcHVibGljIE5vZGVDaGFuZ2UoTm9kZSBub2RlLCBpbnQgY2hhbmdlVHlwZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQkJZkNoYW5nZVR5cGUgPSBjaGFuZ2VUeXBlOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBmTm9kZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q2hhbmdlVHlwZSgpIHsKLQkJCXJldHVybiBmQ2hhbmdlVHlwZTsKLQkJfQotCX0KLQotCUlEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkvKioKLQkgKiBMaXN0ZW5lciB0byBmUHJvamVjdGlvblZpZXdlcidzIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBmRG9jdW1lbnRMaXN0ZW5lcjsKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZG9jdW1lbnQgaXMgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZwotCSAqLwotCWJvb2xlYW4gZklzRG9jdW1lbnRDaGFuZ2luZyA9IGZhbHNlOwotCS8qKgotCSAqIExpc3Qgb2YgY2hhbmdlZCBub2RlcyB0aGF0IG5lZWQgdG8gYmUgcmVjYWxjdWxhdGVkCi0JICovCi0JTGlzdCBmUXVldWVkTm9kZUNoYW5nZXMgPSBudWxsOwotCi0JLyoqCi0JICogUHJvY2Vzc2VzIGFsbCB0aGUgcXVldWVkIG5vZGUgY2hhbmdlcyBhbmQgdXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24KLQkgKiBtb2RlbC4KLQkgKi8KLQl2b2lkIGFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpIHsKLQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCAmJiBmUXVldWVkTm9kZUNoYW5nZXMgIT0gbnVsbCAmJiAhZlF1ZXVlZE5vZGVDaGFuZ2VzLmlzRW1wdHkoKSkgewotCQkJUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKTsKLQotCQkJLy8gZ28gdGhyb3VnaCBhbGwgdGhlIHBlbmRpbmcgYW5ub3RhdGlvbiBjaGFuZ2VzIGFuZCBhcHBseSB0aGVtIHRvCi0JCQkvLyB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JCQl3aGlsZSAoIWZRdWV1ZWROb2RlQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCQlOb2RlQ2hhbmdlIGNoYW5nZXMgPSAoTm9kZUNoYW5nZSkgZlF1ZXVlZE5vZGVDaGFuZ2VzLnJlbW92ZSgwKTsKLQkJCQlpZiAoY2hhbmdlcy5nZXRDaGFuZ2VUeXBlKCkgPT0gTm9kZUNoYW5nZS5BREQpIHsKLQkJCQkJLy8gYWRkCi0JCQkJCU5vZGUgbm9kZSA9IGNoYW5nZXMuZ2V0Tm9kZSgpOwotCQkJCQlQb3NpdGlvbiBuZXdQb3MgPSBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24obm9kZSk7Ci0JCQkJCWlmIChuZXdQb3MgIT0gbnVsbCkgewotCQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IG5ldyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihub2RlLCBmYWxzZSk7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCQkJCQl0cnkgewotCQkJCQkJCWFubm90YXRpb25Nb2RlbC5hZGRBbm5vdGF0aW9uKG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYW5kIGNvbnRpbnVlCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoYW5nZXMuZ2V0Q2hhbmdlVHlwZSgpID09IE5vZGVDaGFuZ2UuUkVNT1ZFKSB7Ci0JCQkJCS8vIHJlbW92ZQotCQkJCQlOb2RlIG5vZGUgPSBjaGFuZ2VzLmdldE5vZGUoKTsKLQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gYW5ubyA9IGZpbmRFeGlzdGluZ0Fubm90YXRpb24obm9kZSk7Ci0JCQkJCWlmIChhbm5vICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJYW5ub3RhdGlvbk1vZGVsLnJlbW92ZUFubm90YXRpb24oYW5ubyk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYW5kIGNvbnRpbnVlCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZlF1ZXVlZE5vZGVDaGFuZ2VzID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdvZXMgdGhyb3VnaCBldmVyeSBub2RlIGNyZWF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIGlmIG5lZWRlZAotCSAqIAotCSAqIEBwYXJhbSBEVERGaWxlCi0JICogICAgICAgICAgICBhc3N1bWVzIGZpbGUgaXMgbm90IG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQW5ub3RhdGlvbnMoRFRERmlsZSBmaWxlKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlMaXN0IG5vZGVzID0gZmlsZS5nZXROb2RlcygpOwotCQlJdGVyYXRvciBpdCA9IG5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdC5uZXh0KCk7Ci0JCQlQb3NpdGlvbiBuZXdQb3MgPSBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24obm9kZSk7Ci0JCQlpZiAobmV3UG9zICE9IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gbmV3IFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKG5vZGUsIGZhbHNlKTsKLQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCQkJZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkuYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELmFkZEFsbEFubm90YXRpb25zOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3Rpb24gcG9zaXRpb24gZnJvbSB0aGUgZ2l2ZW4gbm9kZS4gQWJsZSB0byBnZXQKLQkgKiBwcm9qZWN0aW9uIHBvc2l0aW9uIGlmIG5vZGUgaXNOb2RlUHJvamVjdGFibGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gcHJvamVjdGlvbiBwb3NpdGlvbiBwb3NzaWJsZSwgYSBQb3NpdGlvbiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFBvc2l0aW9uIGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihOb2RlIG5vZGUpIHsKLQkJUG9zaXRpb24gcG9zID0gbnVsbDsKLQkJaWYgKGlzTm9kZVByb2plY3RhYmxlKG5vZGUpICYmIG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCUluZGV4ZWRSZWdpb24gaW5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBpbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlpZiAoc3RhcnQgPj0gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJCQlwb3MgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aHJvdWdoIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBhbmQgcmV0cmlldmVzCi0JICogVGFnUHJvamVjdGlvbkFubm90YXRpb24gZm9yIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gVGFnUHJvamVjdGlvbkFubm90YXRpb24gZm9yIG5vZGUgb3IgbnVsbCBpZiBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGZpbmRFeGlzdGluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7Ci0JCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBudWxsOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpICYmIGFubm8gPT0gbnVsbCkgewotCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGEgPSAoVGFnUHJvamVjdGlvbkFubm90YXRpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAobm9kZS5lcXVhbHMoYS5nZXROb2RlKCkpKQotCQkJCQlhbm5vID0gYTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYW5ubzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGR0ZCBmaWxlIGZvciB0aGUgZkRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiBEVERGaWxlIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJRFRERmlsZSBkdGRGaWxlID0gbnVsbDsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCQkJZHRkRmlsZSA9ICgoRFRETW9kZWxJbXBsKSBzTW9kZWwpLmdldERUREZpbGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZHRkRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gcmVtb3ZlIG9sZCBpbmZvCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCWZEb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJRFRERmlsZSBmaWxlID0gZ2V0RFRERmlsZSgpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwgJiYgZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJaWYgKGZEb2N1bWVudExpc3RlbmVyID09IG51bGwpCi0JCQkJZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcigpOwotCi0JCQlmRG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0KLQkJCS8vIGFkZCBkdGQgZmlsZSBsaXN0ZW5lciB0byBuZXcgZHRkIGZpbGUKLQkJCWZpbGUuYWRkRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCi0JCQl0cnkgewotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgzMDQKLQkJCQkvLyBkaXNhYmxlIHJlZHJhdyB3aGlsZSBhZGRpbmcgYWxsIGFkYXB0ZXJzCi0JCQkJZlZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCWFkZEFsbEFubm90YXRpb25zKGZpbGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZlZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELmluaXRpYWxpemU6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlIGEgUHJvamVjdGlvblZpZXdlciB3aXRoIHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gdW5pbnN0YWxsIGJlZm9yZSB0cnlpbmcgdG8gaW5zdGFsbCBuZXcgdmlld2VyCi0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQl1bmluc3RhbGwoKTsKLQkJfQotCQlmVmlld2VyID0gdmlld2VyOwotCQlmVmlld2VyLmFkZFByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnN0YWxsZWQoKSB7Ci0JCXJldHVybiBmVmlld2VyICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIG5vZGUgaXMgYSBub2RlIHR5cGUgYWJsZSB0byBmb2xkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBub2RlIGlzIHByb2plY3RhYmxlLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOb2RlUHJvamVjdGFibGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQ2hhbmdlZChEVEROb2RlIG5vZGUpIHsKLQkJLyoKLQkJICogRG9uJ3QgYmVsaWV2ZSB0aGlzIGlzIG5lY2Vzc2FyeSAodXNlZCB0byBuZWVkIGl0IHRvIG9ubHkgYWRkCi0JCSAqIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgdG8gZWxlbWVudHMgdGhhdCBzcGFuIG1vcmUgdGhhbiBvbmUgbGluZSwKLQkJICogYnV0IG5vdyBqdXN0IGFsd2F5cyBhZGQgcHJvamVjdGlvbiBhbm5vdGF0aW9uKQotCQkgKi8KLQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkvLyAvLyByZWNhbGN1bGF0ZSBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciBub2RlCi0JCS8vIC8vIGNoZWNrIGlmIHRoaXMgd2FzIGV2ZW4gYSBwcm9qZWN0YWJsZSBub2RlIHRvIHN0YXJ0IHdpdGgKLQkJLy8gaWYgKGlzTm9kZVByb2plY3RhYmxlKG5vZGUpKSB7Ci0JCS8vIC8vIGZpbmQgdGhlIGV4aXN0aW5nIGFubm90YXRpb24KLQkJLy8gVGFnUHJvamVjdGlvbkFubm90YXRpb24gYW5ubyA9IGZpbmRFeGlzdGluZ0Fubm90YXRpb24obm9kZSk7Ci0JCS8vIC8vIGlmIGFibGUgdG8gcHJvamVjdCBub2RlIHNlZSBpZiBwcm9qZWN0aW9uIGFubm90YXRpb24gd2FzCi0JCS8vIC8vIGFscmVhZHkgY3JlYXRlZCBhbmQgY3JlYXRlIG5ldyBpZiBuZWVkZWQKLQkJLy8gUG9zaXRpb24gbmV3UG9zID0gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKG5vZGUpOwotCQkvLyBpZiAobmV3UG9zICE9IG51bGwgJiYgYW5ubyA9PSBudWxsKSB7Ci0JCS8vIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSBuZXcKLQkJLy8gVGFnUHJvamVjdGlvbkFubm90YXRpb24obm9kZSwgZmFsc2UpOwotCQkvLyAvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCS8vIGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpLmFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvbiwKLQkJLy8gbmV3UG9zKTsKLQkJLy8gfQotCQkvLyAvLyBpZiBub3QgYWJsZSB0byBwcm9qZWN0IG5vZGUgc2VlIGlmIHByb2plY3Rpb24gYW5ub3RhdGlvbiB3YXMKLQkJLy8gLy8gYWxyZWFkeSBjcmVhdGVkIGFuZCByZW1vdmUgaXQKLQkJLy8gaWYgKG5ld1BvcyA9PSBudWxsICYmIGFubm8gIT0gbnVsbCkgewotCQkvLyBmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKS5yZW1vdmVBbm5vdGF0aW9uKGFubm8pOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8KLQkJLy8gbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJLy8gU3RyaW5nIG5vZGVOYW1lID0gbm9kZSAhPSBudWxsID8gbm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQubm9kZUNoYW5nZWQgKCIKLQkJLy8gKyBub2RlTmFtZSArICIpOiIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIH0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCXByb2Nlc3NOb2Rlc0V2ZW50KGV2ZW50LCBOb2RlQ2hhbmdlLkFERCk7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELm5vZGVzQWRkZWQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IGNoYW5nZWQgbm9kZSBpbiBldmVudCBhbmQgYWRkIHRvIHF1ZXVlIG9mIG5vZGUKLQkgKiBjaGFuZ2VzIHRoYXQgd2lsbCBiZSByZWNhbGN1bGF0ZWQgZm9yIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiBAcGFyYW0gY2hhbmdlVHlwZQotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzTm9kZXNFdmVudChOb2Rlc0V2ZW50IGV2ZW50LCBpbnQgY2hhbmdlVHlwZSkgewotCQlMaXN0IG5vZGVzID0gZXZlbnQuZ2V0Tm9kZXMoKTsKLQkJSXRlcmF0b3IgaXQgPSBub2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXQubmV4dCgpOwotCQkJaWYgKGlzTm9kZVByb2plY3RhYmxlKG5vZGUpKSB7Ci0JCQkJaWYgKGZRdWV1ZWROb2RlQ2hhbmdlcyA9PSBudWxsKSB7Ci0JCQkJCWZRdWV1ZWROb2RlQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl9Ci0KLQkJCQlpbnQgZXhpc3RpbmdJbmRleCA9IGZRdWV1ZWROb2RlQ2hhbmdlcy5pbmRleE9mKG5vZGUpOwotCQkJCWlmIChleGlzdGluZ0luZGV4ID4gLTEpIHsKLQkJCQkJLy8gbm9kZSBpcyBhbHJlYWR5IHF1ZXVlZCB1cAotCQkJCQlOb2RlQ2hhbmdlIGV4aXN0aW5nQ2hhbmdlID0gKE5vZGVDaGFuZ2UpIGZRdWV1ZWROb2RlQ2hhbmdlcy5yZW1vdmUoZXhpc3RpbmdJbmRleCk7Ci0JCQkJCS8vIGRvbid0IGFkZCBpZiBhZGRlZCB0aGVuIHJlbW92ZWQgbm9kZSBvciB2aWNlIHZlcnNhCi0JCQkJCWlmIChleGlzdGluZ0NoYW5nZS5nZXRDaGFuZ2VUeXBlKCkgPT0gY2hhbmdlVHlwZSkgewotCQkJCQkJTm9kZUNoYW5nZSBuZXdDaGFuZ2UgPSBuZXcgTm9kZUNoYW5nZShub2RlLCBjaGFuZ2VUeXBlKTsKLQkJCQkJCWZRdWV1ZWROb2RlQ2hhbmdlcy5hZGQobmV3Q2hhbmdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IHF1ZXVlZCB1cCB5ZXQsIHNvIHF1ZXVlIG5vZGUKLQkJCQkJTm9kZUNoYW5nZSBuZXdDaGFuZ2UgPSBuZXcgTm9kZUNoYW5nZShub2RlLCBjaGFuZ2VUeXBlKTsKLQkJCQkJZlF1ZXVlZE5vZGVDaGFuZ2VzLmFkZChuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBpZiBkb2N1bWVudCBpc24ndCBjaGFuZ2luZywgZ28gYWhlYWQgYW5kIGFwcGx5IGl0Ci0JCWlmICghZklzRG9jdW1lbnRDaGFuZ2luZykgewotCQkJYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlbW92ZWQoTm9kZXNFdmVudCBldmVudCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJcHJvY2Vzc05vZGVzRXZlbnQoZXZlbnQsIE5vZGVDaGFuZ2UuUkVNT1ZFKTsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQubm9kZXNSZW1vdmVkOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKLQkJRFRERmlsZSBmaWxlID0gZ2V0RFRERmlsZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlmaWxlLnJlbW92ZURUREZpbGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCS8vIHJlbW92ZSBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCAmJiBmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZkRvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCQkJZkRvY3VtZW50ID0gbnVsbDsKLQotCQkJLy8gY2xlYXIgb3V0IGxpc3Qgb2YgcXVldWVkIGNoYW5nZXMgc2luY2UgaXQgbWF5IG5vIGxvbmdlciBiZQotCQkJLy8gYWNjdXJhdGUKLQkJCWlmIChmUXVldWVkTm9kZUNoYW5nZXMgIT0gbnVsbCkgewotCQkJCWZRdWV1ZWROb2RlQ2hhbmdlcy5jbGVhcigpOwotCQkJCWZRdWV1ZWROb2RlQ2hhbmdlcyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRW5hYmxlZCgpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgZkRvY3VtZW50ICE9IG5ld0lucHV0KSB7Ci0JCQkvLyBkaXNhYmxlIHByb2plY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZXZlcnl0aGluZwotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgcHJvamVjdGlvbiB3YXMgcHJldmlvdXNseSBlbmFibGVkIGJlZm9yZSBpbnB1dCBkb2N1bWVudCBjaGFuZ2VkCi0JCS8vIGFuZCBuZXcgZG9jdW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gb2xkIGRvY3VtZW50Ci0JCWlmIChmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgJiYgZkRvY3VtZW50ID09IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotCQkJcHJvamVjdGlvbkVuYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciBmcm9tIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTIyZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEBhdXRob3Igbml0aW4KLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFREKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCAiUHJvZ3JhbSBFcnJvcjogY2xpZW50IGNhbGxlciBtdXN0IGVuc3VyZSBtb2RlbCBoYXMgZmFjdG9yeSByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JEVEQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaW5jZSBubyBlbWJlZGRlZCB0eXBlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJkYjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHN0eWxlcyB1c2VkIGJ5IExpbmVTdHlsZVByb3ZpZGVyLAotICogQ29sb3JNYW5hZ2VyLCBhbmQgYW55IG90aGVycyB3aG8gbWF5IGJlIGludGVyZXN0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNEVEQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0NPTU1FTlQgPSAiZHRkQ29tbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERhdGEgYXJlIHZhcmlhYmxlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9EQVRBID0gImR0ZERhdGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0RFRkFVTFQgPSAiZHRkRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGtleXdvcmRzIGFyZSBjb25zdGFudHMgbGlrZSBJTVBMSUVEIG9yIFBDREFUQQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9LRVlXT1JEID0gImR0ZEtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBzdHJpbmdzIGFyZSBhbnl0aGluZyBpbiBxdW90ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU1RSSU5HID0gImR0ZFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEFsbCB0aGUgcmVtYWluaW5nIHN5bWJvbHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU1lNQk9MID0gImR0ZFN5bWJvbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRhZ3MgYXJlICc8JywgJyEnLCBvciAnPicKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfVEFHID0gImR0ZFRhZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRhZ25hbWVzIGFyZSBsaWtlIEVMRU1FTlQsIEFUVExJU1QsIGV0Yy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfVEFHTkFNRSA9ICJkdGRUYWdOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzYTk0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKioKLQkJICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJmb3JtYXQgcnVsZXMiIGZvciByZWdpb25zCi0JCSAqIHNwZWNpZmljYWxseSBhc3NvY2lhdGVkIGZvciBob3cgdG8gIm9wZW4iIHRoZSByZWdpb24uCi0JCSAqLwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBjb21pbmcgdGhyb3VnaCBudWxsLCBidXQganVzdCB0byBjYXRjaCBpdAotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfRU1QVFkgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT05URU5UX0FOWSB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRykgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5EX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRklYRURfS0VZV09SRCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKSB7Ci0JCQkvLyBpZiAocmVnaW9uIGluc3RhbmNlb2YgRFREUmVnaW9uKSB7Ci0JCQkvLyBEVERSZWdpb24gZHRkUmVnaW9uID0gKERURFJlZ2lvbikgcmVnaW9uOwotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGR0ZFJlZ2lvbi5nZXRQYXJlbnQoKTsKLQkJCS8vIFN0cmluZyByZWdpb25UZXh0ID0gZmxhdE5vZGUuZ2V0VGV4dChkdGRSZWdpb24pOwotCQkJLy8gaWYgKHJlZ2lvblRleHQuZXF1YWxzKCJBTlkiKSB8fCByZWdpb25UZXh0LmVxdWFscygiRU1QVFkiKSkgewotCQkJLy8gcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKERURENvbG9ycy5EVERfS0VZV09SRCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCX0KLQotCQkvLyBkZWZhdWx0LCByZXR1cm4gbnVsbCB0byBzaWduYWwgIm5vdCBoYW5kbGVkIgotCQkvLyBpbiB3aGljaCBjYXNlLCBvdGhlciBmYWN0b3JpZXMgc2hvdWxkIGJlIHRyaWVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkc7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEE7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckRURFN1YlNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMjViN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGV4dC5JRFREUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmSW50ZXJuYWxNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlckZvckRURCBmSW50ZXJuYWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHlsZVJhbmdlW10gZkludGVybmFsUmFuZ2VzOwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmcgPSBudWxsOwotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0KCkgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxQcm92aWRlciA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckRURCgpOwotCQlmSW50ZXJuYWxSYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVswXTsKLQkJZlBhcnRpdGlvbmluZyA9IElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkc7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbGluZVJlcXVlc3RTdGFydAotCSAqIEBwYXJhbSBsaW5lUmVxdWVzdExlbmd0aAotCSAqIEBwYXJhbSBob2xkUmVzdWx0cwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdHlsZVJhbmdlcyhpbnQgbGluZVJlcXVlc3RTdGFydCwgaW50IGxpbmVSZXF1ZXN0TGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzLCBpbnQgYWRqdXN0bWVudCkgewotCQlpbnQgbGluZVJlcXVlc3RFbmQgPSBsaW5lUmVxdWVzdFN0YXJ0ICsgbGluZVJlcXVlc3RMZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkludGVybmFsUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQgPSBhZGp1c3RtZW50ICsgZkludGVybmFsUmFuZ2VzW2ldLnN0YXJ0OwotCQkJaW50IGFkanVzdGVkU3R5bGVSYW5nZUVuZCA9IGFkanVzdGVkU3R5bGVSYW5nZVN0YXJ0ICsgZkludGVybmFsUmFuZ2VzW2ldLmxlbmd0aDsKLQkJCWlmIChhZGp1c3RlZFN0eWxlUmFuZ2VFbmQgPCBsaW5lUmVxdWVzdFN0YXJ0IHx8IGxpbmVSZXF1ZXN0RW5kIDwgYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQpCi0JCQkJY29udGludWU7Ci0JCQlpbnQgZW5kID0gTWF0aC5taW4oYWRqdXN0ZWRTdHlsZVJhbmdlRW5kLCBsaW5lUmVxdWVzdEVuZCk7Ci0JCQlTdHlsZVJhbmdlIHJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJCXJhbmdlLnN0YXJ0ID0gTWF0aC5tYXgoYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQsIGxpbmVSZXF1ZXN0U3RhcnQpOwotCQkJcmFuZ2UubGVuZ3RoID0gZW5kIC0gcmFuZ2Uuc3RhcnQ7Ci0JCQlyYW5nZS5mb250U3R5bGUgPSBmSW50ZXJuYWxSYW5nZXNbaV0uZm9udFN0eWxlOwotCQkJcmFuZ2UuZm9yZWdyb3VuZCA9IGZJbnRlcm5hbFJhbmdlc1tpXS5mb3JlZ3JvdW5kOwotCQkJcmFuZ2UuYmFja2dyb3VuZCA9IGZJbnRlcm5hbFJhbmdlc1tpXS5iYWNrZ3JvdW5kOwotCQkJaG9sZFJlc3VsdHMuYWRkKHJhbmdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCi0JCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0Q29sb3JQcmVmZXJlbmNlcygpLmdldFN0cmluZyhJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0JCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgYm9sZCk7Ci0JCX0KLQkJcmV0dXJuIHRhOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRJbnRlcm5hbERvY3VtZW50KCkgewotCQlpZiAoZkludGVybmFsTW9kZWwgPT0gbnVsbCkgewotCQkJZkludGVybmFsTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWQuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciNwcmVwYXJlUmVnaW9ucyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbiwKLQkgKiAgICAgIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gdHlwZWRSZWdpb24sIGludCBsaW5lUmVxdWVzdFN0YXJ0LCBpbnQgbGluZVJlcXVlc3RMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJaWYgKCFJRFREUGFydGl0aW9ucy5EVERfREVGQVVMVC5lcXVhbHModHlwZWRSZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJLy8gY29tcHV0ZSBhbiBpbnRlcm5hbCBEVEQgbW9kZWwgYW5kIHJldHVybiBsaW5lc3R5bGVzIGZvciBpdAotCQkJSVRleHRSZWdpb24gZHRkQ29udGVudFJlZ2lvbiA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3R5cGUgPSBmRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQodHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkKLQkJCQlkdGRDb250ZW50UmVnaW9uID0gZG9jdHlwZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlTdHJpbmcgY29udGVudHMgPSBkdGRDb250ZW50UmVnaW9uICE9IG51bGwgPyBkb2N0eXBlLmdldEZ1bGxUZXh0KGR0ZENvbnRlbnRSZWdpb24pIDogbnVsbDsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRJbnRlcm5hbERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCXVwZGF0ZVN0eWxlUmFuZ2VzKGRvY3VtZW50LCBjb250ZW50cyk7Ci0KLQkJCWFkZFN0eWxlUmFuZ2VzKGxpbmVSZXF1ZXN0U3RhcnQsIGxpbmVSZXF1ZXN0TGVuZ3RoLCBob2xkUmVzdWx0cywgZG9jdHlwZS5nZXRTdGFydE9mZnNldChkdGRDb250ZW50UmVnaW9uKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAoZkludGVybmFsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZkludGVybmFsUHJvdmlkZXIucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0eWxlUmFuZ2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBjb250ZW50cykgewotCQlpZiAoIWRvY3VtZW50LmdldCgpLmVxdWFscyhjb250ZW50cykpIHsKLQkJCWRvY3VtZW50LnNldChjb250ZW50cyk7Ci0JCQl0cnkgewotCQkJCUlUeXBlZFJlZ2lvbiByZWdpb25zW10gPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZ2V0SW50ZXJuYWxEb2N1bWVudCgpLCBmUGFydGl0aW9uaW5nLCAwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJCUxpc3QgcmFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZJbnRlcm5hbFByb3ZpZGVyLmluaXQoZ2V0SW50ZXJuYWxEb2N1bWVudCgpLCBmUmVjSGlnaGxpZ2h0ZXIpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlmSW50ZXJuYWxQcm92aWRlci5wcmVwYXJlUmVnaW9ucyhyZWdpb25zW2ldLCByZWdpb25zW2ldLmdldE9mZnNldCgpLCByZWdpb25zW2ldLmdldExlbmd0aCgpLCByYW5nZXMpOwotCQkJCX0KLQkJCQlmSW50ZXJuYWxSYW5nZXMgPSAoU3R5bGVSYW5nZVtdKSByYW5nZXMudG9BcnJheShuZXcgU3R5bGVSYW5nZVswXSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWZJbnRlcm5hbFJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlmSW50ZXJuYWxQcm92aWRlci5sb2FkQ29sb3JzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzZDU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTVEFSIC0gYWRkZWQgRW5jb2RpbmcgQ29udGVudCBSZXNvbHZlciwgYnVnIDE2MjMyMQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBEVEQgdGVtcGxhdGUgY29udGV4dCB0eXBlcy4gVGVtcGxhdGVzIG9mIHRoaXMgY29udGV4dCB0eXBlCi0gKiBhcHBseSB0byBhbnkgcGxhY2Ugd2l0aGluIERURCBjb250ZW50IHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlRFREIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZSB7Ci0KLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZURURCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkN1cnNvcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5MaW5lU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTRlZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFREIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSAiZHRkX25ldyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmOWE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGV4dC9EVEREb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLQotCi1wdWJsaWMgY2xhc3MgRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciBleHRlbmRzIERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RURFJlZ2lvblR5cGVzLlNUQVJUX1RBRywgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVH0sIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTRiYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQWRkQXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkQXR0cmlidXRlQWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gIk5ld0F0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCSgoQXR0cmlidXRlTGlzdCkgc2VsZWN0ZWROb2RlKS5hZGRBdHRyaWJ1dGUobmV3TmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJKChFbGVtZW50KSBzZWxlY3RlZE5vZGUpLmFkZEF0dHJpYnV0ZShuZXdOYW1lKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByYyA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYXR0cmlidXRlIHNldCB0byB0cnVlIik7Ci0JCQlzZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlIik7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiByYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjYzVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRBdHRyaWJ1dGVMaXN0QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAiTmV3QXR0TGlzdCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGVjdGVkTm9kZSAhPSBudWxsKSB7Ci0JCQlEVEROb2RlIHRvcExldmVsTm9kZSA9IGR0ZEZpbGUuZ2V0VG9wTGV2ZWxOb2RlQXQoc2VsZWN0ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaWYgKHRvcExldmVsTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlhdHRMaXN0TmFtZSA9ICgoRWxlbWVudCkgdG9wTGV2ZWxOb2RlKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVBdHRyaWJ1dGVMaXN0KHNlbGVjdGVkTm9kZSwgYXR0TGlzdE5hbWUsIHRydWUpOwotCQkvLyBuZXdFbGVtZW50LnNldE5hbWUoRFREVW5pcXVlTmFtZUhlbHBlci5nZXRVbmlxdWVFbGVtZW50TmFtZShkdGRGaWxlKSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDk2MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQ29tbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZENvbW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRDb21tZW50QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCWdldE1vZGVsKCkuZ2V0RFRERmlsZSgpLmNyZWF0ZUNvbW1lbnQoc2VsZWN0ZWROb2RlLCAiTmV3Q29tbWVudCIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjAwYTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURFVuaXF1ZU5hbWVIZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIEFkZEVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbGVtZW50QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZUVsZW1lbnROYW1lKGR0ZEZpbGUpOwotCQlkdGRGaWxlLmNyZWF0ZUVsZW1lbnQoc2VsZWN0ZWROb2RlLCBlbGVtZW50TmFtZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzk4Y2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJKChDTUdyb3VwTm9kZSkgbm9kZSkuYWRkQ2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJKChFbGVtZW50KSBub2RlKS5hZGRDaGlsZCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHJjID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRW50aXR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxNjY5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbnRpdHlBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbnRpdHlBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVFbnRpdHkoc2VsZWN0ZWROb2RlLCAiTmV3RW50aXR5IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbmV3RWxlbWVudC5zZXROYW1lKERURFVuaXF1ZU5hbWVIZWxwZXIuZ2V0VW5pcXVlRWxlbWVudE5hbWUoZHRkRmlsZSkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZlMWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCSgoQ01Hcm91cE5vZGUpIG5vZGUpLmFkZEdyb3VwKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCSgoRWxlbWVudCkgbm9kZSkuYWRkR3JvdXAoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZE5vdGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGROb3RhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTFmODJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZE5vdGF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZE5vdGF0aW9uQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkTm90YXRpb25BY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVOb3RhdGlvbihzZWxlY3RlZE5vZGUsICJOZXdOb3RhdGlvbiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbmV3Tm90YXRpb24uc2V0TmFtZShEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZU5vdGF0aW9uTmFtZShkdGRGaWxlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYmNlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0JcHVibGljIEFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RFeHRlcm5hbFBhcmFtZXRlckVudGl0eShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGFiZWxWYWx1ZVBhaXJbXSBmcmVlRXh0ZXJuYWxFbnRpdGllcyA9IGR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5jcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKG51bGwpOwotCi0JCWlmIChmcmVlRXh0ZXJuYWxFbnRpdGllcy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZnJlZUV4dGVybmFsRW50aXRpZXNbMF0uZlZhbHVlOwotCQkJLy8gcmV0dXJuIChFbnRpdHkpIGZyZWVFeHRlcm5hbEVudGl0aWVzWzBdLmZWYWx1ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgZXh0RW50aXR5ID0gZ2V0Rmlyc3RFeHRlcm5hbFBhcmFtZXRlckVudGl0eShkdGRGaWxlKTsKLQkJRFRETm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCQlpZiAoZXh0RW50aXR5ICE9IG51bGwpIHsKLQkJCWR0ZEZpbGUuY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHNlbGVjdGVkTm9kZSwgZXh0RW50aXR5LCB0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWR0ZEZpbGUuY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHNlbGVjdGVkTm9kZSwgIiVOZXdFbnRpdHlSZWZlcmVuY2U7IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExZTljMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRleHRDb250cmlidXRvcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsOwotCi0JcHVibGljIEJhc2VBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcyhtb2RlbCwgdGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEJhc2VBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2MpIHsKLQkJc3VwZXIodGV4dCk7Ci0JCWZNb2RlbCA9IG1vZGVsOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFRETm9kZSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIGdldEZpcnN0Tm9kZVNlbGVjdGVkKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIERURE5vZGUgZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJLy8gRFRETm9kZSByZWZlcmVuY2VQb2ludCA9IG51bGw7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCXJldHVybiAoRFRETm9kZSkgZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFRETW9kZWxJbXBsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKERURE1vZGVsSW1wbCkgZk1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRleHRDb250cmlidXRvcihJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJY29udGV4dENvbnRyaWJ1dG9yID0gY29udHJpYnV0b3I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzljMWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERCYXRjaE5vZGVEZWxldGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQlwdWJsaWMgRGVsZXRlQWN0aW9uKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQlEVERCYXRjaE5vZGVEZWxldGUgYmF0Y2hEZWxldGUgPSBudWxsOwotCQlEVERGaWxlIGR0ZEZpbGUgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgZWxlbWVudDsKLQkJCQlkdGRGaWxlID0gbm9kZS5nZXREVERGaWxlKCk7Ci0JCQkJaWYgKGJhdGNoRGVsZXRlID09IG51bGwpIHsKLQkJCQkJYmF0Y2hEZWxldGUgPSBuZXcgRFREQmF0Y2hOb2RlRGVsZXRlKGR0ZEZpbGUpOwotCQkJCX0KLQkJCQliYXRjaERlbGV0ZS5hZGROb2RlKChEVEROb2RlKSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlkdGRGaWxlLmdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREVUlNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQliYXRjaERlbGV0ZS5kZWxldGVOb2Rlcyh0aGlzKTsKLQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsKSB7Ci0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBEVEROb2RlICYmICEoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBDTU5vZGUgJiYgKChDTU5vZGUpIHNlbGVjdGVkT2JqZWN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKSkgewotCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXJldHVybiB0cnVlOyAvLyBlbmFibGUgZGVsZXRlIG1lbnUgaXRlbQotCQl9Ci0JCWVsc2UgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7IC8vIGRpc2FibGUgaXQgLSBncmV5IG91dAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyMzk2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJQ01Ob2RlIGNvbnRlbnRNb2RlbCA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlpZiAoQ01Ob2RlLkVNUFRZLmVxdWFscyhjb250ZW50TW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJCWdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VGV4dCgpKTsKLQkJCQkoKEVsZW1lbnQpIG5vZGUpLnJlcGxhY2VDb250ZW50TW9kZWwodGhpcywgIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByYyA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQlzZXRFbmFibGVkKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KTsKLQkJcmV0dXJuIHJjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTAyODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQW4gSVByb3BlcnR5U291cmNlIGltcGxlbWVudGF0aW9uIGZvciBhIEpGYWNlIHZpZXdlciB1c2VkIHRvIGRpc3BsYXkKLSAqIHByb3BlcnRpZXMgb2YgRE9NIG5vZGVzLiBSZXF1aXJlcyBhbiBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIEpGYWNlCi0gKiBhZGFwdGVycyBmb3IgdGhlIG5vZGVzIGluIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyLCBJUHJvcGVydHlTb3VyY2UgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0FUVFJJQlVURVMgPSAiQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9OQU1FID0gRFREVUlNZXNzYWdlcy5EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMDsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9URVhUID0gRFREVUlNZXNzYWdlcy5EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBmRGVzY3JpcHRvcnMgPSBudWxsOwotCXByb3RlY3RlZCBJTm9kZU5vdGlmaWVyIGZOb2RlID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdGFjayBmVmFsdWVzQmVpbmdTZXQgPSBuZXcgU3RhY2soKTsKLQotCXB1YmxpYyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvcltdIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCUN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBuYW1lRGVzY3JpcHRvciA9IG5ldyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoSURfTkFNRSwgSURfTkFNRSwgbnVsbCk7Ci0JCW5hbWVEZXNjcmlwdG9yLnNldENhdGVnb3J5KERURFVJTWVzc2FnZXMuRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzIpOyAvLyROT04tTkxTLTEkCi0JCS8vIEN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBjb250ZW50RGVzY3JpcHRvciA9IG5ldwotCQkvLyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoSURfVEVYVCwgSURfVEVYVCwgbnVsbCk7Ci0JCS8vIGNvbnRlbnREZXNjcmlwdG9yLnNldENhdGVnb3J5KCJBdHRyaWJ1dGVzIik7Ci0JCXJldHVybiBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltde25hbWVEZXNjcmlwdG9yfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsdWUgZm9yIHRoaXMgTm9kZSB0aGF0IGNhbiBiZSBlZGl0dGVkIGluIGEgcHJvcGVydHkgc2hlZXQuCi0JICogCi0JICogQHJldHVybiBhIHZhbHVlIHRoYXQgY2FuIGJlIGVkaXR0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB2YWxpZCBkZXNjcmlwdG9ycy4KLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChmRGVzY3JpcHRvcnMgPT0gbnVsbCB8fCBmRGVzY3JpcHRvcnMubGVuZ3RoID09IDApIHsKLQkJCWZEZXNjcmlwdG9ycyA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQlyZXR1cm4gZkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJaWYgKGlkLmVxdWFscyhJRF9OQU1FKSAmJiBmTm9kZSBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCXZhbHVlID0gKChEVEROb2RlKSBmTm9kZSkuZ2V0TmFtZSgpOwotCQl9Ci0JCWlmIChpZC5lcXVhbHMoSURfVEVYVCkgJiYgZk5vZGUgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQl2YWx1ZSA9ICgoRFRETm9kZSkgZk5vZGUpLmdldEZ1bGxOb2RlVGV4dCgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gSVByb3BlcnR5U291cmNlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2MDZiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoSVByb3BlcnR5U291cmNlLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeShnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQkvLyBhdCB0aGUgbW9tZW50LCBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBleGlzdHMKLQkJcmV0dXJuIG5ldyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIodGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2E1MmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogVGVtcGxhdGVzIHBhZ2UgaW4gbmV3IGZpbGUgd2l6YXJkLiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGEgbmV3IGZpbGUKLSAqIHRlbXBsYXRlIHRvIGJlIGFwcGxpZWQgaW4gbmV3IGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcwotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCS8qKiBUaGUgdGVtcGxhdGUgc3RvcmUuICovCi0JCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmU3RvcmU7Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZTdG9yZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCXJldHVybiBmU3RvcmUuZ2V0VGVtcGxhdGVzKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJZlN0b3JlID0gKFRlbXBsYXRlU3RvcmUpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIGVsZW1lbnQ7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBMYXN0IHNlbGVjdGVkIHRlbXBsYXRlIG5hbWUgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lOwotCS8qKiBUaGUgdmlld2VyIGRpc3BsYXlzIHRoZSBwYXR0ZXJuIG9mIHNlbGVjdGVkIHRlbXBsYXRlLiAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGZQYXR0ZXJuVmlld2VyOwotCS8qKiBUaGUgdGFibGUgcHJlc2VudGluZyB0aGUgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCS8qKiBUZW1wbGF0ZSBzdG9yZSB1c2VkIGJ5IHRoaXMgd2l6YXJkIHBhZ2UgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JLyoqIENoZWNrYm94IGZvciB1c2luZyB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBCdXR0b24gZlVzZVRlbXBsYXRlQnV0dG9uOwotCi0JcHVibGljIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlIiwgRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgRFREIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIFRlbXBsYXRlcyB0YWJsZQotCQlDb21wb3NpdGUgaW5uZXJQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGlubmVyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW5uZXJMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0KGlubmVyTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhpbm5lclBhcmVudCwgU1dULk5PTkUpOwotCQlsaW5rLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzYpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbGlua0NsaWNrZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIHRoYXQgZGlzcGxheXMgdGVtcGxhdGVzCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGlubmVyUGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEwKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzMpOwotCi0JCWZUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlbXBsYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKLQkJCQlpZiAoKG9iamVjdDEgaW5zdGFuY2VvZiBUZW1wbGF0ZSkgJiYgKG9iamVjdDIgaW5zdGFuY2VvZiBUZW1wbGF0ZSkpIHsKLQkJCQkJVGVtcGxhdGUgbGVmdCA9IChUZW1wbGF0ZSkgb2JqZWN0MTsKLQkJCQkJVGVtcGxhdGUgcmlnaHQgPSAoVGVtcGxhdGUpIG9iamVjdDI7Ci0JCQkJCWludCByZXN1bHQgPSBsZWZ0LmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkRURF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSBjb250cm9scyBpbiBwYWdlIGJhc2VkIG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbidzIGN1cnJlbnQKLQkgKiBzdGF0ZS4KLQkgKi8KLQl2b2lkIGVuYWJsZVRlbXBsYXRlcygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZlVzZVRlbXBsYXRlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCWlmICghZW5hYmxlZCkgewotCQkJLy8gc2F2ZSBsYXN0IHNlbGVjdGVkIHRlbXBsYXRlCi0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQllbHNlCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGR0ZCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBEVEQgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoRFREVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IERURCBGaWxlIHdpemFyZC4KLQkgKi8KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoRFREVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3dpemFyZC9OZXdEVERXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3YTM1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkRURENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmV3RFREV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JcHJpdmF0ZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGZOZXdGaWxlUGFnZTsKLQlwcml2YXRlIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UgZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JLyoqCi0JICogQWRkcyBkZWZhdWx0IGV4dGVuc2lvbiB0byB0aGUgZmlsZW5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGFkZERlZmF1bHRFeHRlbnNpb24oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBuZXdGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZW5hbWUpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGV4dCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKERURENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZChleHQpOwotCi0JCXJldHVybiBuZXdGaWxlTmFtZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChmQ29udGVudFR5cGUgPT0gbnVsbCkKLQkJCWZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpOwotCQlyZXR1cm4gZkNvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIERURCBDb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChmVmFsaWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYXBwbHlMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSwgbmV3IElTY29wZUNvbnRleHRbXSB7bmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSksIG5ldyBJbnN0YW5jZVNjb3BlKCkgfSk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UodGV4dCwgIlxyXG4iLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxyIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcbiIsIGxpbmVEZWxpbWl0ZXIpOwotCQlyZXR1cm4gY29udmVydGVkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyBpZiBmaWxlTmFtZSBpcyB2YWxpZCBuYW1lIGZvciBjb250ZW50IHR5cGUuIFRha2VzIGJhc2UgY29udGVudAotCSAqIHR5cGUgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRlbnNpb24gaXMgdmFsaWQgZm9yIHRoaXMgY29udGVudCB0eXBlCi0JICovCi0JYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWZOZXdGaWxlUGFnZSA9IG5ldyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKCJEVERXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhmU2VsZWN0aW9uKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQkJCWlmICgoZnVsbFBhdGggIT0gbnVsbCkgJiYgKGZ1bGxQYXRoLmlzRW1wdHkoKSA9PSBmYWxzZSkgJiYgKGZpbGVOYW1lICE9IG51bGwpKSB7Ci0JCQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoRFREVUlNZXNzYWdlcy5fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfRFRELCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGNoZWNrIGFkZGluZyBkZWZhdWx0Ci0JCQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQkJCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBhZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCQkJSVN0YXR1cyByZXN1bHQgPSB3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHJlc291cmNlUGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkJCS8vIHBhdGggaW52YWxpZAotCQkJCQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICgod29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocmVzb3VyY2VQYXRoKS5leGlzdHMoKSB8fCB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKS5leGlzdHMoKSkpIHsKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoRFREVUlNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotCQkJfQotCQl9OwotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoRFREVUlNZXNzYWdlcy5fVUlfQ1JFQVRFX05FV19EVERfRklMRSk7Ci0JCWZOZXdGaWxlUGFnZS5zZXREZXNjcmlwdGlvbihEVERVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0RURF9FWFBMKTsKLQotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShmTmV3RmlsZVRlbXBsYXRlc1BhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShEVERVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0RURF9USVRMRSk7IC8vJE5PTi1OTFMtMSQKLQotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX05FV0RUREZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJZk5ld0ZpbGVQYWdlLnNldEZpbGVOYW1lKG5ld0ZpbGVOYW1lKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIG5ldyBlbXB0eSBmaWxlCi0JCUlGaWxlIGZpbGUgPSBmTmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCi0JCS8vIGlmIHRoZXJlIHdhcyBwcm9ibGVtIHdpdGggY3JlYXRpbmcgZmlsZSwgaXQgd2lsbCBiZSBudWxsLCBzbyBtYWtlCi0JCS8vIHN1cmUgdG8gY2hlY2sKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJLy8gcHV0IHRlbXBsYXRlIGNvbnRlbnRzIGludG8gZmlsZQotCQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLmdldFRlbXBsYXRlU3RyaW5nKCk7Ci0JCQlpZiAodGVtcGxhdGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCXRlbXBsYXRlU3RyaW5nID0gYXBwbHlMaW5lRGVsaW1pdGVyKGZpbGUsIHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkvLyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGZvciB0aGUgbmV3IGZpbGUKLQkJCQlTdHJpbmcgY2hhclNldCA9IGdldEFwcHJvcHJpYXRlQ2hhcnNldCgpOwotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRTdHJlYW1Xcml0ZXIgPSBudWxsOwotCQkJCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8ganVzdCB1c2UgZGVmYXVsdCBlbmNvZGluZwotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJTZXQpOwotCQkJCQl9Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci53cml0ZSh0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKLQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCQlmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSBjb250ZW50cyBmb3IgbmV3IERURCBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9wZW4gdGhlIGZpbGUgaW4gZWRpdG9yCi0JCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCQkvLyBldmVyeXRoaW5nJ3MgZmluZQotCQkJcGVyZm9ybWVkT0sgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRPSzsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIERURCBwcmVmZXJlbmNlIGlkZW50aWZpZXMgYSBjaGFyc2V0LCB1c2UgdGhhdC4gSWYgbm90LCByZXZlcnQgdG8gdGhlIFhNTAotCSAqIGNoYXJzZXQgcHJlZmVyZW5jZQotCSAqIAotCSAqIEByZXR1cm4gY2hhcnNldCBiYXNlZCBvbiBEVEQgcHJlZmVyZW5jZXMgaWYgZGVmaW5lZCwgaWYgbm90LCBmcm9tIHRoZSBYTUwgcHJlZmVyZW5jZXMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUNoYXJzZXQoKSB7Ci0JCVN0cmluZyBjaGFyc2V0ID0gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJaWYoY2hhcnNldCA9PSBudWxsIHx8IGNoYXJzZXQudHJpbSgpLmVxdWFscygiIikpCi0JCQljaGFyc2V0ID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCQlyZXR1cm4gY2hhcnNldDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Mjg2OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kLkRURERyYWdBbmREcm9wTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIG91dGxpbmUgdmlldyBwYWdlIHdoaWNoIHNob3dzIERURCBjb250ZW50LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBmQ29udGVudFByb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRFREQ29udGV4dE1lbnVIZWxwZXIgZk1lbnVIZWxwZXI7Ci0JcHJpdmF0ZSBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltdIGZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBNYXAgZlZpZXdlckNvbnRyaWJ1dGlvbnM7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9PUkRFUl9QUkVGID0gIm91dGxpbmUtb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9TT1JUX1BSRUYgPSAib3V0bGluZS1zb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyBEVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JCWZWaWV3ZXJDb250cmlidXRpb25zID0gbmV3IEhhc2hNYXAoMik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNjcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElDb250cmlidXRpb25JdGVtW10gY3JlYXRlVG9vbGJhckNvbnRyaWJ1dGlvbnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShnZXRDb250ZW50UHJvdmlkZXIodmlld2VyKSBpbnN0YW5jZW9mIERURFRyZWVDb250ZW50UHJvdmlkZXIsICJpbnZhbGlkIGNvbnRlbnQgcHJvdmlkZXIgb24gdmlld2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IHN1cGVyLmNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKHZpZXdlcik7Ci0KLQkJU29ydEFjdGlvbiBzb3J0QWN0aW9uID0gbmV3IFNvcnRBY3Rpb24odmlld2VyLCBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9VVExJTkVfU09SVF9QUkVGKTsKLQkJT3JkZXJBY3Rpb24gb3JkZXJBY3Rpb24gPSBuZXcgT3JkZXJBY3Rpb24odmlld2VyLCAoRFREVHJlZUNvbnRlbnRQcm92aWRlcikgZ2V0Q29udGVudFByb3ZpZGVyKHZpZXdlciksIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgT1VUTElORV9PUkRFUl9QUkVGKTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc29ydEl0ZW0gPSBuZXcgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtKHNvcnRBY3Rpb24pOwotCQlJQ29udHJpYnV0aW9uSXRlbSBvcmRlckl0ZW0gPSBuZXcgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtKG9yZGVyQWN0aW9uKTsKLQotCQlpZiAoaXRlbXMgPT0gbnVsbCkgewotCQkJaXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bMl07Ci0JCQlpdGVtc1swXSA9IHNvcnRJdGVtOwotCQkJaXRlbXNbMV0gPSBvcmRlckl0ZW07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGNvbWJpbmVkSXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1baXRlbXMubGVuZ3RoICsgMl07Ci0JCQljb21iaW5lZEl0ZW1zWzBdID0gc29ydEl0ZW07Ci0JCQljb21iaW5lZEl0ZW1zWzFdID0gb3JkZXJJdGVtOwotCQkJU3lzdGVtLmFycmF5Y29weShpdGVtcywgMCwgY29tYmluZWRJdGVtcywgMiwgaXRlbXMubGVuZ3RoKTsKLQkJCWl0ZW1zID0gY29tYmluZWRJdGVtczsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRDb250ZW50UHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkNvbnRlbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmQ29udGVudFByb3ZpZGVyID0gbmV3IERURFRyZWVDb250ZW50UHJvdmlkZXIoKTsKLQkJfQotCQkvLyByZXR1cm4gc3VwZXIuZ2V0Q29udGVudFByb3ZpZGVyKHZpZXdlcik7Ci0JCXJldHVybiBmQ29udGVudFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0TGFiZWxQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IERURExhYmVsUHJvdmlkZXIoKTsKLQkJfQotCQkvLyByZXR1cm4gc3VwZXIuZ2V0TGFiZWxQcm92aWRlcih2aWV3ZXIpOwotCQlyZXR1cm4gZkxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRNZW51TGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJTWVudUxpc3RlbmVyIGdldE1lbnVMaXN0ZW5lcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlJTWVudUxpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKLQkJaWYgKGZNZW51SGVscGVyID09IG51bGwgJiYgdmlld2VyLmdldElucHV0KCkgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCWZNZW51SGVscGVyID0gbmV3IERURENvbnRleHRNZW51SGVscGVyKChEVERNb2RlbEltcGwpIHZpZXdlci5nZXRJbnB1dCgpKTsKLQkJCWZNZW51SGVscGVyLmNyZWF0ZU1lbnVMaXN0ZW5lcnNGb3Iodmlld2VyKTsKLQkJfQotCQlpZiAoZk1lbnVIZWxwZXIgIT0gbnVsbCkgewotCQkJbGlzdGVuZXIgPSBmTWVudUhlbHBlci5nZXRNZW51TGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gbGlzdGVuZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKGZpbmFsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlpZiAoZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzID0gbmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW117bmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRyYWdGaW5pc2hlZChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLnNldFNlbGVjdGlvbihudWxsKTsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLnNldFNlbGVjdGlvbih0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIFRyYW5zZmVyIGdldFRyYW5zZmVyKCkgewotCQkJCQlyZXR1cm4gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpOwotCQkJCX0KLQkJCX19OwotCQl9Ci0JCi0JCXJldHVybiBmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzOwotCX0KLQotCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkJICovCi0JcHVibGljIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzKGZpbmFsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlpZiAoZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzID0gbmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW117bmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLQkJCQkJZmxvYXQgZmVlZGJhY2tGbG9hdCA9IGdldEhlaWdodEluSXRlbShldmVudCk7Ci0JCQkJCWlmIChmZWVkYmFja0Zsb2F0ID4gMC43NSkgewotCQkJCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGZlZWRiYWNrRmxvYXQgPCAwLjI1KSB7Ci0JCQkJCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotCQkJCQl9Ci0JCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19FWFBBTkQgfCBETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQub3BlcmF0aW9ucyAhPSBETkQuRFJPUF9OT05FICYmIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBldmVudC5pdGVtICE9IG51bGwgJiYgZXZlbnQuaXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgewotCQkJCQkJCS8qCi0JCQkJCQkJICogdGhlIGNvbW1hbmQgdXNlcyB0aGVzZSBudW1iZXJzIGluc3RlYWQgb2YgdGhlCi0JCQkJCQkJICogZmVlZGJhY2sgY29uc3RhbnRzIChldmVuIHRob3VnaCBpdCBjb252ZXJ0cyBpbgotCQkJCQkJCSAqIHRoZSBvdGhlciBkaXJlY3Rpb24gYXMgd2VsbCkKLQkJCQkJCQkgKi8KLQkJCQkJCQlmbG9hdCBmZWVkYmFja0Zsb2F0ID0gZ2V0SGVpZ2h0SW5JdGVtKGV2ZW50KTsKLQkKLQkJCQkJCQlmaW5hbCBEcmFnQW5kRHJvcENvbW1hbmQgY29tbWFuZCA9IG5ldyBEVEREcmFnQW5kRHJvcE1hbmFnZXIoKS5jcmVhdGVDb21tYW5kKGV2ZW50Lml0ZW0uZ2V0RGF0YSgpLCBmZWVkYmFja0Zsb2F0LCBldmVudC5vcGVyYXRpb25zLCBldmVudC5kZXRhaWwsIHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBjb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCQlTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIGRyb3BBY2NlcHQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCQotCQkJCXByaXZhdGUgZmxvYXQgZ2V0SGVpZ2h0SW5JdGVtKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlpZihldmVudC5pdGVtID09IG51bGwpIHJldHVybiAuNWY7Ci0JCQkJCWlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCQkJQ29udHJvbCBjb250cm9sID0gdHJlZUl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCQlQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJCQlyZXR1cm4gKGZsb2F0KSAocG9pbnQueSAtIGJvdW5kcy55KSAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQkJCUNvbnRyb2wgY29udHJvbCA9IHRhYmxlSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQkJCVBvaW50IHBvaW50ID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCQkJCQkJcmV0dXJuIChmbG9hdCkgKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gMC4wRjsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0JCQkJCXJldHVybiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCk7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJcmV0dXJuIGdldFRyYW5zZmVyKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSk7Ci0JCQkJfQotCQkJfX07Ci0JCX0KLQkJcmV0dXJuIGZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiN1bmNvbmZpZ3VyZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIudW5jb25maWd1cmUodmlld2VyKTsKLQkJZlZpZXdlckNvbnRyaWJ1dGlvbnMucmVtb3ZlKHZpZXdlcik7Ci0JCWlmIChmTWVudUhlbHBlciAhPSBudWxsKSB7Ci0JCQlmTWVudUhlbHBlci5yZW1vdmVNZW51TGlzdGVuZXJzRm9yKHZpZXdlcik7Ci0JCQlmTWVudUhlbHBlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGV4dE1lbnVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZXh0TWVudUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzJhOWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZXh0TWVudUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRBdHRyaWJ1dGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEF0dHJpYnV0ZUxpc3RBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZENvbW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkRW50aXR5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGROb3RhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLlJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbjsKLQotLyoqCi0gKiBNZW51IGhlbHBlciBmb3IgQ29udGVudCBPdXRsaW5lIHBhZ2UuIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIGVsc2V3aGVyZS4KLSAqLwotY2xhc3MgRFREQ29udGV4dE1lbnVIZWxwZXIgewotCWNsYXNzIERURE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCS8vIHVwZGF0ZSB0aGUgYWN0aW9uIHNlbGVjdGlvbiBub3cKLQkJCWFkZE5vdGF0aW9uQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRFbnRpdHlBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZENvbW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJZGVsZXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRBdHRyaWJ1dGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0KLQotCQkJaWYgKCFmVmlld2VyU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCWFkZEFjdGlvbkl0ZW1zRm9yU2VsZWN0aW9uKGZWaWV3ZXJTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCksIG1hbmFnZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgVmlld2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCV9zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCUFkZEF0dHJpYnV0ZUFjdGlvbiBhZGRBdHRyaWJ1dGVBY3Rpb247Ci0KLQlBZGRBdHRyaWJ1dGVMaXN0QWN0aW9uIGFkZEF0dHJpYnV0ZUxpc3RBY3Rpb247Ci0JQWRkQ29tbWVudEFjdGlvbiBhZGRDb21tZW50QWN0aW9uOwotCUFkZEVsZW1lbnRBY3Rpb24gYWRkRWxlbWVudEFjdGlvbjsKLQlBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24gYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uOwotCUFkZEVudGl0eUFjdGlvbiBhZGRFbnRpdHlBY3Rpb247Ci0JQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbiBhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uOwotCUFkZE5vdGF0aW9uQWN0aW9uIGFkZE5vdGF0aW9uQWN0aW9uOwotCUFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbiBhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb247Ci0JRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbjsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZkludGVybmFsU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IFZpZXdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0KLQlwcml2YXRlIElNZW51TGlzdGVuZXIgZk1lbnVMaXN0ZW5lcjsKLQlwcml2YXRlIERURE1vZGVsSW1wbCBmTW9kZWw7Ci0JcHJpdmF0ZSBMaXN0IGZWaWV3ZXJMaXN0OwotCi0JSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlZpZXdlclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQlSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uOwotCi0JcHVibGljIERURENvbnRleHRNZW51SGVscGVyKERURE1vZGVsSW1wbCBtb2RlbCkgewotCQlmTW9kZWwgPSBtb2RlbDsKLQkJZlZpZXdlckxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlmTWVudUxpc3RlbmVyID0gbmV3IERURE1lbnVMaXN0ZW5lcigpOwotCi0JCWFkZE5vdGF0aW9uQWN0aW9uID0gbmV3IEFkZE5vdGF0aW9uQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0RURF9OT1RBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRW50aXR5QWN0aW9uID0gbmV3IEFkZEVudGl0eUFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9EVERfRU5USVRZKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFbGVtZW50QWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRFREX0VMRU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbW1lbnRBY3Rpb24gPSBuZXcgQWRkQ29tbWVudEFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9EVERfQ09NTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24gPSBuZXcgQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1BBUkFNX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0RURF9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWFkZEF0dHJpYnV0ZUFjdGlvbiA9IG5ldyBBZGRBdHRyaWJ1dGVBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uID0gbmV3IEFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFTElTVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uID0gbmV3IEFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9HUk9VUF9BRERfR1JPVVApOyAvLyROT04tTkxTLTEkCi0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbiA9IG5ldyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gPSBuZXcgUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fR1JPVVBfQUREX0dST1VQKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFkZE5vdGF0aW9uQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfTk9UQVRJT04pKTsKLQkJYWRkRW50aXR5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfRU5USVRZKSk7Ci0JCWFkZENvbW1lbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FERF9DT01NRU5UKSk7Ci0JCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQUREX0VOVElUWV9SRUZFUkVOQ0UpKTsKLQotCQkvLyBUcmktc3RhdGUgaW1hZ2VzCi0JCWFkZEVsZW1lbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0VMRU1FTlQpKTsKLQkJYWRkRWxlbWVudEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9FTEVNRU5UKSk7Ci0JCWFkZEVsZW1lbnRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9BRERfRUxFTUVOVCkpOwotCi0JCWFkZEF0dHJpYnV0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfQVRUUklCVVRFKSk7Ci0JCWFkZEF0dHJpYnV0ZUFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9BVFRSSUJVVEUpKTsKLQkJYWRkQXR0cmlidXRlQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0FUVFJJQlVURSkpOwotCi0JCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0FUVFJJQlVURSkpOwotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0FUVFJJQlVURSkpOwotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0FUVFJJQlVURSkpOwotCi0JCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCi0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwpKTsKLQkJYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0VMRU1FTlRUT0NPTk1PREVMKSk7Ci0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCkpOwotCi0JCS8vIHVzZSB0aGUgc2FtZSBpbWFnZXMgYXMgYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbgotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19DVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMKSk7Ci0JCXJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwpKTsKLQl9Ci0KLQl2b2lkIF9zZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvKgotCQkgKiBTYXZlIHRoZSBzZWxlY3Rpb24gc28gd2Ugb25seSBub3RpZnkgdGhlIGFjdGlvbnMgd2hlbiB0aGUgbWVudSBpcwotCQkgKiBzaG93bgotCQkgKi8KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCX0KLQotCXZvaWQgYWRkQWN0aW9uSXRlbXNGb3JTZWxlY3Rpb24oT2JqZWN0IHNlbGVjdGVkT2JqZWN0LCBJTWVudU1hbmFnZXIgbWVudSkgewotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlTGlzdCkgewotCQkJLy8gYWRkIGFwcHJvcHJpYXRlIG1lbnUgdG8gbG9naWNhbCB2aWV3Ci0JCQlOb2RlTGlzdCBmb2xkZXIgPSAoTm9kZUxpc3QpIHNlbGVjdGVkT2JqZWN0OwotCQkJaWYgKGZvbGRlci5nZXRMaXN0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpKSB7Ci0JCQkJbWVudS5hZGQoYWRkTm90YXRpb25BY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoZm9sZGVyLmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpKSB7Ci0JCQkJbWVudS5hZGQoYWRkRW50aXR5QWN0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZvbGRlci5nZXRMaXN0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykpIHsKLQkJCQlMYWJlbFZhbHVlUGFpcltdIGF2YWlsYWJsZUVudGl0aWVzID0gZk1vZGVsLmNyZWF0ZVBhcm1FbnRpdHlDb250ZW50SXRlbXMobnVsbCk7Ci0JCQkJYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLnNldEVuYWJsZWQoYXZhaWxhYmxlRW50aXRpZXMubGVuZ3RoID4gMCk7Ci0KLQkJCQltZW51LmFkZChhZGRFbGVtZW50QWN0aW9uKTsKLQkJCQltZW51LmFkZChhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoZm9sZGVyLmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSkgewotCQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUFjdGlvbik7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgRFRERmlsZSB8fCBzZWxlY3RlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQlMYWJlbFZhbHVlUGFpcltdIGF2YWlsYWJsZUVudGl0aWVzID0gZk1vZGVsLmNyZWF0ZVBhcm1FbnRpdHlDb250ZW50SXRlbXMobnVsbCk7Ci0JCQlhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uc2V0RW5hYmxlZChhdmFpbGFibGVFbnRpdGllcy5sZW5ndGggPiAwKTsKLQotCQkJbWVudS5hZGQoYWRkRWxlbWVudEFjdGlvbik7Ci0JCQltZW51LmFkZChhZGRFbnRpdHlBY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkTm90YXRpb25BY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZENvbW1lbnRBY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkQXR0cmlidXRlTGlzdEFjdGlvbik7Ci0JCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJRWxlbWVudCBkdGRFbGVtZW50ID0gKEVsZW1lbnQpIHNlbGVjdGVkT2JqZWN0OwotCi0JCQlDTU5vZGUgY29udGVudE1vZGVsID0gZHRkRWxlbWVudC5nZXRDb250ZW50TW9kZWwoKTsKLQkJCWlmIChjb250ZW50TW9kZWwgPT0gbnVsbCkgewotCQkJCW1lbnUuYWRkKGFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24pOwotCQkJCW1lbnUuYWRkKGFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50TW9kZWwgIT0gbnVsbCAmJiBDTU5vZGUuRU1QVFkuZXF1YWxzKGNvbnRlbnRNb2RlbC5nZXRUeXBlKCkpKSB7Ci0JCQkJbWVudS5hZGQocmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uKTsKLQkJCX0KLQkJCS8vIGlmICghKCgoRWxlbWVudClzZWxlY3RlZE9iamVjdCkuZ2V0Q29udGVudE1vZGVsKCkgaW5zdGFuY2VvZgotCQkJLy8gQ01Hcm91cE5vZGUpKQotCQkJLy8gewotCQkJLy8gbWVudS5hZGQoYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbik7Ci0JCQkvLyB9Ci0JCQkvLyBhZGRBdHRyaWJ1dGVBY3Rpb24uc2V0RWxlbWVudChzZWxlY3RlZE9iamVjdCk7Ci0JCQltZW51LmFkZChhZGRBdHRyaWJ1dGVBY3Rpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCS8vIGFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXRFbGVtZW50KHNlbGVjdGVkT2JqZWN0KTsKLQkJCS8vIGFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2V0RWxlbWVudChzZWxlY3RlZE9iamVjdCk7Ci0JCQltZW51LmFkZChhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQltZW51LmFkZChhZGRBdHRyaWJ1dGVBY3Rpb24pOwotCQl9Ci0KLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJYWRkRWRpdEFjdGlvbnMobWVudSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgRFRETm9kZSAmJiAhKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQ01Ob2RlICYmICgoQ01Ob2RlKSBzZWxlY3RlZE9iamVjdCkuaXNSb290RWxlbWVudENvbnRlbnQoKSkpIHsKLQkJCW1lbnUuYWRkKGRlbGV0ZUFjdGlvbik7Ci0JCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCS8vIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnRDb250ZW50KQotCQkJLy8gewotCQkJLy8gRFRERWxlbWVudENvbnRlbnQgY29udGVudCA9IChEVERFbGVtZW50Q29udGVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQkvLyBpZiAoY29udGVudC5nZXRFbGVtZW50KCkgIT0gbnVsbCAmJiAoY29udGVudCBpbnN0YW5jZW9mCi0JCQkvLyBEVERQQ0RhdGFDb250ZW50IHx8IGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpKQotCQkJLy8gewotCQkJLy8gZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkJCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JCX0KLQl9Ci0KLQl2b2lkIGFkZEVkaXRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIG1lbnUuYWRkKHVuZG9BY3Rpb24pOwotCQkvLyBtZW51LmFkZChyZWRvQWN0aW9uKTsKLQkJLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJLy8gbWVudS5hZGQoY3V0QWN0aW9uKTsKLQkJLy8gbWVudS5hZGQoY29weUFjdGlvbik7Ci0JCS8vIG1lbnUuYWRkKHBhc3RlQWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVNZW51TGlzdGVuZXJzRm9yKFZpZXdlciB2aWV3ZXIpIHsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCi0JCWZWaWV3ZXJMaXN0LmFkZCh2aWV3ZXIpOwotCX0KLQotCXB1YmxpYyBJTWVudUxpc3RlbmVyIGdldE1lbnVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGZNZW51TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVudUxpc3RlbmVyc0ZvcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJZlZpZXdlckxpc3QucmVtb3ZlKHZpZXdlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjN2ZiMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm9kZUxpc3Q7Ci0KLWNsYXNzIERURExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBEVERMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCBpbWFnZQotCSAqIEByZXR1cm4gdGhlIGltYWdlIHVzZWQgdG8gbGFiZWwgdGhlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICB0aGVzZSBpcyBubyBpbWFnZSBmb3IgdGhlIGdpdmVuIG9iamVjdAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJaW1hZ2UgPSAoKERURE5vZGUpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQlpbWFnZSA9ICgoTm9kZUxpc3QpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCWltYWdlID0gKChEVERGaWxlKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2UgPSBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgdGV4dAotCSAqIEByZXR1cm4gdGhlIHRleHQgc3RyaW5nIHVzZWQgdG8gbGFiZWwgdGhlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiB0aGVzZSBpcyBubyB0ZXh0IGxhYmVsIGZvciB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJU3RyaW5nIG5hbWUgPSAoKERURE5vZGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQotCQkJLy8gc3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlICh1c2VmdWwgZm9yIG11bHRpLWxpbmUgY29tbWVudHMpCi0JCQlpbnQgZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA9IDA7Ci0JCQlpbnQgbGFzdFZpc2libGVDaGFyYWN0ZXIgPSBuYW1lLmxlbmd0aCgpIC0gMTsKLQkJCWZvciAoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA9IDA7IGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPCBuYW1lLmxlbmd0aCgpOyBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyKyspIHsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UobmFtZS5jaGFyQXQoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlcikpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCS8vIGtlZXAgb25seSB0aGUgZmlyc3QgbGluZSBvZiB0ZXh0IGluIGEgbXVsdGktbGluZSBuYW1lCi0JCQlpZiAoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA8IGxhc3RWaXNpYmxlQ2hhcmFjdGVyKSB7Ci0JCQkJZm9yIChsYXN0VmlzaWJsZUNoYXJhY3RlciA9IGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgKyAxOyBsYXN0VmlzaWJsZUNoYXJhY3RlciA8IG5hbWUubGVuZ3RoKCk7IGxhc3RWaXNpYmxlQ2hhcmFjdGVyKyspIHsKLQkJCQkJY2hhciBjaGFyYWN0ZXIgPSBuYW1lLmNoYXJBdChsYXN0VmlzaWJsZUNoYXJhY3Rlcik7Ci0JCQkJCWlmIChjaGFyYWN0ZXIgPT0gJ1xyJyB8fCBjaGFyYWN0ZXIgPT0gJ1xuJykKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyID4gMCAmJiBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyIDwgbmFtZS5sZW5ndGgoKSAtIDEpIHsKLQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciwgbGFzdFZpc2libGVDaGFyYWN0ZXIpOwotCQkJfQotCi0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKLQkJCS8vIHJldHVybiAoKE5vZGVMaXN0KSBlbGVtZW50KS5nZXRMaXN0VHlwZSgpOwotCQkJcmV0dXJuICgoTm9kZUxpc3QpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJcmV0dXJuICgoRFRERmlsZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JmNTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuTm9kZXNFdmVudDsKLQotY2xhc3MgRFREVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJRFRERmlsZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgT2JqZWN0IGZJbnB1dE9iamVjdDsKLQlwcm90ZWN0ZWQgVmlld2VyIGZWaWV3ZXI7Ci0KLQkvLyBBIGNhY2hlZCBzZXQgb2YgSW5kZXhlZE5vZGVMaXN0cywgcmVxdWlyZWQgZm9yIGdldFBhcmVudCB0byByZXR1cm4gdGhlCi0JLy8gY29ycmVjdCBpbnN0YW5jZXMgbWFwcGluZyB0byBUcmVlSXRlbXMKLQlwcm90ZWN0ZWQgT2JqZWN0W10gbG9naWNhbE5vZGVMaXN0cyA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd0xvZ2ljYWxPcmRlciA9IGZhbHNlOwotCi0JcHVibGljIERURFRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZlZpZXdlciA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFRvTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJRFRERmlsZSBkdGRGaWxlID0gbm9kZS5nZXREVERGaWxlKCk7Ci0JCS8vIGZpcnN0IGV4cGFuZCB0aGUgcm9vdAotCQlBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyID0gKEFic3RyYWN0VHJlZVZpZXdlcikgZlZpZXdlcjsKLQkJdmlld2VyLmV4cGFuZFRvTGV2ZWwoZHRkRmlsZSwgMSk7Ci0JCU5vZGVMaXN0IGxpc3RUb0V4cGFuZCA9IG51bGw7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSB7Ci0JCQlsaXN0VG9FeHBhbmQgPSBkdGRGaWxlLmdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJbGlzdFRvRXhwYW5kID0gZHRkRmlsZS5nZXROb3RhdGlvbnMoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlsaXN0VG9FeHBhbmQgPSBkdGRGaWxlLmdldEVudGl0aWVzKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLQkJCWxpc3RUb0V4cGFuZCA9IGR0ZEZpbGUuZ2V0Q29tbWVudHMoKTsKLQkJfQotCQlpZiAobGlzdFRvRXhwYW5kICE9IG51bGwpIHsKLQkJCXZpZXdlci5leHBhbmRUb0xldmVsKGxpc3RUb0V4cGFuZCwgMSk7Ci0JCX0KLQkJdmlld2VyLmV4cGFuZFRvTGV2ZWwobm9kZSwgMCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCS8vIHJldHVybiB0aGUgbGlzdHMgb2Ygbm9kZXMgd2hlbiBpbiBsb2dpY2FsIG9yZGVyIG1vZGUsIGFsbCB0aGUgTm9kZXMKLQkJLy8gb3RoZXJ3aXNlCi0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJaWYgKGlzU2hvd0xvZ2ljYWxPcmRlcigpKSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSB2aXNpYmxlIG5vZGUgbGlzdHMKLQkJCQlpZiAobG9naWNhbE5vZGVMaXN0cyA9PSBudWxsKSB7Ci0JCQkJCUl0ZXJhdG9yIG5vZGVMaXN0cyA9ICgoRFRERmlsZSkgcGFyZW50RWxlbWVudCkuZ2V0Tm9kZUxpc3RzKCkuaXRlcmF0b3IoKTsKLQkJCQkJTGlzdCB2aXNpYmxlTGlzdHMgPSBuZXcgQXJyYXlMaXN0KDcpOwotCQkJCQl3aGlsZSAobm9kZUxpc3RzLmhhc05leHQoKSkgewotCQkJCQkJTm9kZUxpc3QgbGlzdCA9IChOb2RlTGlzdCkgbm9kZUxpc3RzLm5leHQoKTsKLQkJCQkJCWlmIChpc1Zpc2libGVOb2RlTGlzdChsaXN0KSkgewotCQkJCQkJCXZpc2libGVMaXN0cy5hZGQobGlzdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbG9naWNhbE5vZGVMaXN0cyA9IHZpc2libGVMaXN0cy50b0FycmF5KCk7Ci0JCQkJfQotCQkJCXJldHVybiBsb2dpY2FsTm9kZUxpc3RzOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSB2aXNpYmxlIG5vZGVzCi0JCQkJTGlzdCBhbGxOb2RlcyA9ICgoRFRERmlsZSkgcGFyZW50RWxlbWVudCkuZ2V0Tm9kZXMoKTsKLQkJCQlMaXN0IHZpc2libGVOb2RlcyA9IG5ldyBBcnJheUxpc3QoYWxsTm9kZXMuc2l6ZSgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBvID0gYWxsTm9kZXMuZ2V0KGkpOwotCQkJCQlpZiAoaXNWaXNpYmxlTm9kZShvKSkgewotCQkJCQkJdmlzaWJsZU5vZGVzLmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdmlzaWJsZU5vZGVzLnRvQXJyYXkoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKLQkJCXJldHVybiAoKE5vZGVMaXN0KSBwYXJlbnRFbGVtZW50KS5nZXROb2RlcygpLnRvQXJyYXkoKTsKLQkJfQotCQllbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJLy8gYWx3YXlzIGdyb3VwIHRoZSBhdHRyaWJ1dGVzIGRpcmVjdGx5IHVuZGVyIHRoZSBlbGVtZW50Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9ICgoRFRETm9kZSkgcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCUxpc3QgYXR0cmlidXRlcyA9ICgoRWxlbWVudCkgcGFyZW50RWxlbWVudCkuZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKTsKLQkJCU9iamVjdFtdIGxvZ2ljYWxDaGlsZHJlbiA9IG5ldyBPYmplY3RbY2hpbGRyZW4ubGVuZ3RoICsgYXR0cmlidXRlcy5zaXplKCldOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCWxvZ2ljYWxDaGlsZHJlbltpbmRleF0gPSBjaGlsZHJlbltpbmRleF07Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWxvZ2ljYWxDaGlsZHJlbltpbmRleCsrXSA9IGl0ZXIubmV4dCgpOwotCQkJfQotCQkJcmV0dXJuIGxvZ2ljYWxDaGlsZHJlbjsKLQkJfQotCQllbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJcmV0dXJuICgoRFRETm9kZSkgcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gbnVsbDsKLQkJLy8gQWx3YXlzIHNob3cgdGhlIERUREZpbGUgIm5vZGUiCi0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IE9iamVjdFtdeygoRFRETW9kZWxJbXBsKSBpbnB1dEVsZW1lbnQpLmdldERUREZpbGUoKX07Ci0JCX0KLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IE9iamVjdFswXTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGVsZW1lbnQ7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCS8vIHRoZW4gd2UgbXVzdCBzYXkgdGhhdCB0aGUgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUKLQkJCQkvLyBhcyBvdXIgYXR0cmlidXRlJ3MgcGFyZW50IGF0dHJpYnV0ZWxpc3QgaXMgb3VyIHBhcmVudAotCQkJCXBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJCXJldHVybiBnZXRQYXJlbnQocGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQkvLyB0aGVuIHdlIG11c3Qgc2F5IHRoYXQgdGhlIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lCi0JCQkJLy8gYXMgb3VyIGF0dHJpYnV0ZWxpc3QgaXMgb3VyIHBhcmVudAotCQkJCVN0cmluZyBhdHRMaXN0TmFtZSA9ICgoQXR0cmlidXRlTGlzdCkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldERUREZpbGUoKS5nZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgY3VycmVudE5vZGUuZ2V0TmFtZSgpLmVxdWFscyhhdHRMaXN0TmFtZSkpIHsKLQkJCQkJCXBhcmVudCA9IGN1cnJlbnROb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQlwYXJlbnQgPSAoKERURE5vZGUpIGVsZW1lbnQpLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQotCQkJLy8gaWYgc2hvd2luZyBpbiB0aGUgbG9naWNhbCBvcmRlciwgcmV0dXJuIHRoZSBJbmRleGVkTm9kZUxpc3QKLQkJCS8vIGFjdGluZyBhcyB0aGUgcGFyZW50IGluIHRoZSB0cmVlCi0JCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQlpZiAoaXNTaG93TG9naWNhbE9yZGVyKCkpIHsKLQkJCQkJT2JqZWN0W10gaW5kZXhlZE5vZGVMaXN0cyA9IGdldENoaWxkcmVuKCgoRFRETW9kZWxJbXBsKSBmSW5wdXRPYmplY3QpLmdldERUREZpbGUoKSk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhlZE5vZGVMaXN0cy5sZW5ndGggJiYgcGFyZW50ID09IG51bGw7IGkrKykgewotCQkJCQkJaWYgKGluZGV4ZWROb2RlTGlzdHNbaV0gaW5zdGFuY2VvZiBOb2RlTGlzdCkgewotCQkJCQkJCWlmICgoKE5vZGVMaXN0KSBpbmRleGVkTm9kZUxpc3RzW2ldKS5nZXROb2RlcygpLmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJCQkJCQlwYXJlbnQgPSBpbmRleGVkTm9kZUxpc3RzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYXJlbnQgPSAoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCAmJiBmSW5wdXRPYmplY3QgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCXBhcmVudCA9ICgoRFRETW9kZWxJbXBsKSBmSW5wdXRPYmplY3QpLmdldERUREZpbGUoKTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiBjaGlsZHJlbi5sZW5ndGggPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlmVmlld2VyID0gdmlld2VyOwotCi0JCWlmIChmSW5wdXRPYmplY3QgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCSgoRFRETW9kZWxJbXBsKSBmSW5wdXRPYmplY3QpLmdldERUREZpbGUoKS5yZW1vdmVEVERGaWxlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJZklucHV0T2JqZWN0ID0gbmV3SW5wdXQ7Ci0JCWlmIChmSW5wdXRPYmplY3QgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCSgoRFRETW9kZWxJbXBsKSBmSW5wdXRPYmplY3QpLmdldERUREZpbGUoKS5hZGREVERGaWxlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHNob3dMb2dpY2FsT3JkZXIuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzaG93TG9naWNhbE9yZGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hvd0xvZ2ljYWxPcmRlcigpIHsKLQkJcmV0dXJuIHNob3dMb2dpY2FsT3JkZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlzaWJsZU5vZGUoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlzaWJsZU5vZGVMaXN0KE5vZGVMaXN0IG5vZGVMaXN0KSB7Ci0JCS8qCi0JCSAqIEFsbCBOb2Rlc0xpc3RzIHNob3VsZCBiZSB2aXNpYmxlIGJlY2F1c2UgeW91IGNhbiBtb21lbnRhcmlseSBoYXZlCi0JCSAqIGFuIEFUVExJU1QgKGZvciBleGFtcGxlKSB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBFTEVNRU5UCi0JCSAqIGRlY2xhcmF0aW9uCi0JCSAqLwotCQlyZXR1cm4gdHJ1ZTsvLyAhbm9kZUxpc3QuZ2V0TGlzdFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVDaGFuZ2VkKERURE5vZGUgbm9kZSkgewotCQlpZiAoZlZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibm9kZSBjaGFuZ2VkIG5vdGlmaWVkIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiBiZWZvcmUgPSAiICsKLQkJCS8vICgoU3RydWN0dXJlZFZpZXdlcil2aWV3KS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QgJiYgaXNTaG93TG9naWNhbE9yZGVyKCkpIHsKLQkJCQkvLyBpbiB0aGlzIGNhc2UsIHdlIGFyZSBzaG93aW5nIGF0dHJpYnV0ZXMgdW5kZXIgdGhlIGVsZW1lbnQuCi0JCQkJLy8gcmVmcmVzaCB0aGUgZWxlbWVudCBvYmplY3QgaW5zdGVhZAotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldERUREZpbGUoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjdXJyZW50Tm9kZS5nZXROYW1lKCkuZXF1YWxzKG5vZGUuZ2V0TmFtZSgpKSAmJiBjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJCSgoU3RydWN0dXJlZFZpZXdlcikgZlZpZXdlcikucmVmcmVzaChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZG8gc3RhbmRhcmQgc3R1ZmYKLQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXIpLnJlZnJlc2gobm9kZSk7Ci0JCQl9Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiBhZnRlciA9ICIgKwotCQkJLy8gKChTdHJ1Y3R1cmVkVmlld2VyKXZpZXcpLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzQWRkZWQoTm9kZXNFdmVudCBldmVudCkgewotCQlpZiAoZlZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotCQkJU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgZlZpZXdlcjsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCQlPYmplY3QgZmlyc3RPYmogPSAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0JCQlEVEROb2RlIG9sZFNlbGVjdGVkTm9kZSA9IG51bGw7Ci0JCQlpZiAoZmlyc3RPYmogaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQkJb2xkU2VsZWN0ZWROb2RlID0gKERURE5vZGUpIGZpcnN0T2JqOwotCQkJfQotCi0JCQlBYnN0cmFjdFRyZWVWaWV3ZXIgYWJzdHJhY3RUcmVlVmlld2VyID0gKEFic3RyYWN0VHJlZVZpZXdlcikgZlZpZXdlcjsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBldmVudC5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgbm9kZSA9IGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG5vZGUpOwotCQkJCS8vIEJ1ZyAxMTExMDAgLSBJZiBpdCBpcyBhIHRvcCBsZXZlbCBub2RlIChpZS4gcGFyZW50IGlzIGEKLQkJCQkvLyBEVERGaWxlKSwKLQkJCQkvLyBpbnNlcnQgdGhlIG5vZGUgZGlyZWN0bHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQkJCU9iamVjdFtdIG9ianMgPSBnZXRDaGlsZHJlbihwYXJlbnQpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChvYmpzW2ldID09IG5vZGUpIHsKLQkJCQkJCQlhYnN0cmFjdFRyZWVWaWV3ZXIuaW5zZXJ0KHBhcmVudCwgbm9kZSwgaSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSWYgdGhlIHBhcmVudCBub2RlIGlzIG5vdCBhIERUREZpbGUsIGp1c3QgcmVmcmVzaCB0aGUKLQkJCQkvLyBwYXJlbnQgZm9yIG5vdwotCQkJCWVsc2UgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCWFic3RyYWN0VHJlZVZpZXdlci5yZWZyZXNoKHBhcmVudCk7Ci0JCQkJfQotCQkJCS8vIFlvdSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaywgaWYgeW91IGRvLCBqdXN0IHJlZnJlc2gKLQkJCQkvLyB0aGUgd2hvbGUgdHJlZQotCQkJCWVsc2UgewotCQkJCQlhYnN0cmFjdFRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQotCQkJSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCUxpc3QgbmV3U2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChvbGRTZWxlY3RlZE5vZGUgPT0gbnVsbCB8fCBub2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpICE9IG9sZFNlbGVjdGVkTm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSB8fCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgIT0gb2xkU2VsZWN0ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgfHwgbm9kZS5nZXRFbmRPZmZzZXQoKSAhPSBvbGRTZWxlY3RlZE5vZGUuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJLy8gYWRkIHRvIHNlbGVjdGlvbgotCQkJCQluZXdTZWxlY3Rpb24uYWRkKG5vZGUpOwotCQkJCQlleHBhbmRUb05vZGUobm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld1NlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLQkJCUFic3RyYWN0VHJlZVZpZXdlciBhYnN0cmFjdFRyZWVWaWV3ZXIgPSAoQWJzdHJhY3RUcmVlVmlld2VyKSBmVmlld2VyOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXZlbnQuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhYnN0cmFjdFRyZWVWaWV3ZXIucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzaG93TG9naWNhbE9yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHNob3dMb2dpY2FsT3JkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd0xvZ2ljYWxPcmRlcihib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuc2hvd0xvZ2ljYWxPcmRlciA9IHZhbHVlOwotCQlpZiAoIXZhbHVlKSB7Ci0JCQkvLyBpZiBub3QgdXNpbmcgbG9naWNhbCBvcmRlciwgbG9zZSB0aGUgY2FjaGVkIGxpc3RzCi0JCQlsb2dpY2FsTm9kZUxpc3RzID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9PcmRlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL09yZGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyN2JjNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL09yZGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLQotY2xhc3MgT3JkZXJBY3Rpb24gZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiB7Ci0JcHJpdmF0ZSBEVERUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXB1YmxpYyBPcmRlckFjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgRFREVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJc3VwZXIoRFREVUlNZXNzYWdlcy5fVUlfQlVUVE9OX0dST1VQX0lURU1TX0xPR0lDQUxMWSwgc3RvcmUsIHByZWZlcmVuY2VLZXksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfT1JHQU5JWkVfRFREX0xPR0lDQUxMWSkpOwotCQl0cmVlVmlld2VyID0gdmlld2VyOwotCQljb250ZW50UHJvdmlkZXIgPSBwcm92aWRlcjsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJY29udGVudFByb3ZpZGVyLnNldFNob3dMb2dpY2FsT3JkZXIoaXNDaGVja2VkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCXNldENoZWNrZWQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihnZXRQcmVmZXJlbmNlS2V5KCkpKTsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWNvbnRlbnRQcm92aWRlci5zZXRTaG93TG9naWNhbE9yZGVyKGlzQ2hlY2tlZCgpKTsKLQotCQkvLyB0cmVlVmlld2VyLnNldElucHV0KHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCXRyZWVWaWV3ZXIucmVmcmVzaCh0cmVlVmlld2VyLmdldElucHV0KCkpOwotCi0JCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhleHBhbmRlZEVsZW1lbnRzKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9Tb3J0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODJhMWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9Tb3J0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLQotY2xhc3MgU29ydEFjdGlvbiBleHRlbmRzIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uIHsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXB1YmxpYyBTb3J0QWN0aW9uKFRyZWVWaWV3ZXIgdmlld2VyLCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZUtleSkgewotCQlzdXBlcihEVERVSU1lc3NhZ2VzLl9VSV9CVVRUT05fU09SVF9JVEVNUywgc3RvcmUsIHByZWZlcmVuY2VLZXksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU09SVCkpOwotCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCQl0cmVlVmlld2VyID0gdmlld2VyOwotCQlpZiAoaXNDaGVja2VkKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlpZiAoaXNDaGVja2VkKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihudWxsKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldElucHV0KHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhleHBhbmRlZEVsZW1lbnRzKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS90ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS90ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2ODJiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBTVEFSIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbAotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBEYXZpZCBDYXJ2ZXIsIFNUQVIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAxNjIzMjEKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLm5hbWU9eG1sIGRlY2xhcmF0aW9uCi1UZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24uZGVzYz14bWwgZGVjbGFyYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS90ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3RlbXBsYXRlcy9kdGRkZWZhdWx0LXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzY0MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3RlbXBsYXRlcy9kdGRkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gaW5pdGlhbCBjb250cmlidXRpb24sIGJ1ZyAxNjIzMjEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLSAgPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24ubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24uZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uIiBjb250ZXh0PSJkdGRfbmV3IiBlbmFibGVkPSJ0cnVlIj4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSI/Jmd0OzwvdGVtcGxhdGU+Ci08L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNmY4YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS9jc3MvKiovKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyY2E2Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotaHRtbG1vZGVsLmphcgotdGVtcC5mb2xkZXIKLWRldi5wcm9wZXJ0aWVzCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2YTU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kZWJ1Zy90cmFjZWZpbHRlcj0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTlmYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY3ZTM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jV2VkIE1hciAyOCAwMzoyMzowNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MWNkNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNg0KLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MA0KLWNvbXBpbGVycy5wLmJ1aWxkPTANCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MA0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTANCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTQ1NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5oYW5kbGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5zc2k7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5O2V4Y2x1ZGU6PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWEyYjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBkYXRhLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjVhZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuaHRtbCI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuc3RhbmRhcmQuZHRkcyIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL2h0bWwvb3ZlcnZpZXcuaHRtbCIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJIVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkNDYwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1BVGFnSW5mbz1BIGxpbmsgaWYgdGhlIGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnQsIGFuZCB0aGUgdGFyZ2V0IGZvciBhIGxpbmsgaWYgdGhlIG5hbWUgYXR0cmlidXRlIGlzIHByZXNlbnQKLUFCQlJUYWdJbmZvPUFuIGFiYnJldmlhdGlvbiAoZm9yIGV4YW1wbGUsIFdXVywgSFRUUCkKLUFDUk9OWU1UYWdJbmZvPUFuIGFjcm9ueW0gKGZvciBleGFtcGxlLCBTQ1VCQSkKLUFERFJFU1NUYWdJbmZvPUFkZHJlc3MgaW5mb3JtYXRpb24gZm9yIHRoZSBhdXRob3Igb2YgdGhlIHBhZ2UKLUFQUExFVFRhZ0luZm89QSBKYXZhIGFwcGxldAotQVJFQVRhZ0luZm89RGVmaW5lcyBhIGNsaWVudC1zaWRlIGltYWdlIG1hcCBhcmVhCi1CVGFnSW5mbz1EaXNwbGF5cyBjb250YWluZWQgdGV4dCBhcyBib2xkCi1CQVNFVGFnSW5mbz1UaGUgYmFzZSBVUkkgZm9yIHRoZSBwYWdlLCB0byBiZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgcmVsYXRpdmUgcGF0aHMKLUJBU0VGT05UVGFnSW5mbz1UaGUgYmFzZSBmb250IHNpemUgZm9yIHRoZSBwYWdlCi1CRE9UYWdJbmZvPU92ZXJyaWRlcyBkZWZhdWx0IGJpZGlyZWN0aW9uYWwgZGlzcGxheS4gRm9yIHVzZSB3aXRoIGJpZGlyZWN0aW9uYWwgbGFuZ3VhZ2VzLgotQklHVGFnSW5mbz1EaXNwbGF5cyBjb250YWluZWQgdGV4dCBhcyBsYXJnZQotQkdTT1VORFRhZ0luZm89RGVmaW5lcyBhIHNvdW5kIGZpbGUgZm9yIHRoZSBwYWdlLiBOb3Qgc3VwcG9ydGVkIGJ5IFczQyBIVE1MIDQuMDEuCi1CTElOS1RhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBibGlua2luZy4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgotQkxPQ0tRVU9URVRhZ0luZm89QSBsb25nIHF1b3RhdGlvbgotQk9EWVRhZ0luZm89VGhlIGRvY3VtZW50IGJvZHkuIENvbnRhaW5zIGFsbCB0aGUgY29udGVudCBmb3IgdGhlIHBhZ2UuCi1CUlRhZ0luZm89Rm9yY2VzIGEgbGluZSBicmVhawotQlVUVE9OVGFnSW5mbz1EZWZpbmVzIGEgcHVzaCBidXR0b24KLUNBUFRJT05UYWdJbmZvPURlZmluZXMgYSB0YWJsZSBjYXB0aW9uCi1DRU5URVJUYWdJbmZvPURpc3BsYXlzIGNvbnRhaW5lZCB0ZXh0IGNlbnRlcmVkLiBFcXVpdmFsZW50IHRvIERJViB3aXRoIGFsaWduPWNlbnRlci4KLUNJVEVUYWdJbmZvPUEgY2l0YXRpb24KLUNPREVUYWdJbmZvPUEgY29tcHV0ZXIgY29kZSBmcmFnbWVudAotQ09MVGFnSW5mbz1BIHRhYmxlIGNvbHVtbgotQ09MR1JPVVBUYWdJbmZvPUEgZ3JvdXAgb2YgdGFibGUgY29sdW1ucwotRERUYWdJbmZvPUEgZGVmaW5pdGlvbiBvciBkZXNjcmlwdGlvbiBpbiBhIGRlZmluaXRpb24gb3IgZGVzY3JpcHRpb24gbGlzdAotREVMVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIGRlbGV0ZWQKLURGTlRhZ0luZm89QSBkZWZpbml0aW9uCi1ESVJUYWdJbmZvPUEgZGlyZWN0b3J5IGxpc3RpbmcKLURJVlRhZ0luZm89QSBnZW5lcmljIGNvbnRhaW5lciwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRlZmluaW5nIGxhbmd1YWdlIG9yIHN0eWxlIGZvciB0aGUgY29udGVudHMKLURMVGFnSW5mbz1BIGRlZmluaXRpb24gb3IgZGVzY3JpcHRpb24gbGlzdAotRFRUYWdJbmZvPUEgdGVybSBvciBzdWJqZWN0IGluIGEgZGVmaW5pdGlvbiBvciBkZXNjcmlwdGlvbiBsaXN0Ci1FTVRhZ0luZm89RGlzcGxheXMgdGV4dCBlbXBoYXNpemVkIChnZW5lcmFsbHkgaXRhbGljaXplZCkKLUVNQkVEVGFnSW5mbz1EZWZpbmVzIGFuIGVtYmVkZGVkIHBsdWctaW4uIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLUZJRUxEU0VUVGFnSW5mbz1EZWZpbmVzIGEgZm9ybSBjb250cm9sIGdyb3VwCi1GT05UVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGluIHRoZSBnaXZlbiBmb250Ci1GT1JNVGFnSW5mbz1EZWZpbmVzIGFuIGludGVyYWN0aXZlIGZvcm0KLUZSQU1FVGFnSW5mbz1EZWZpbmVzIGEgZnJhbWUgd2l0aGluIHRoZSBjdXJyZW50IHdpbmRvdwotRlJBTUVTRVRUYWdJbmZvPURlZmluZXMgYSBmcmFtZXNldCB0aGF0IGRpdmlkZXMgdGhlIHdpbmRvdyBpbnRvIGZyYW1lcwotSDFUYWdJbmZvPUEgdG9wLWxldmVsIGhlYWRpbmcKLUgyVGFnSW5mbz1BIHNlY29uZC1sZXZlbCBoZWFkaW5nCi1IM1RhZ0luZm89QSB0aGlyZC1sZXZlbCBoZWFkaW5nCi1INFRhZ0luZm89QSBmb3VydGgtbGV2ZWwgaGVhZGluZwotSDVUYWdJbmZvPUEgZmlmdGgtbGV2ZWwgaGVhZGluZwotSDZUYWdJbmZvPUEgc2l4dGgtbGV2ZWwgaGVhZGluZwotSEVBRFRhZ0luZm89Q29udGFpbnMgbWV0YWRhdGEgYW5kIHdpbmRvdyB0aXRsZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGRvY3VtZW50Ci1IUlRhZ0luZm89QSBob3Jpem9udGFsIHJ1bGUKLUhUTUxUYWdJbmZvPVRoZSByb290IGVsZW1lbnQgZm9yIHRoZSBkb2N1bWVudC4KLUlUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgaXRhbGljCi1JRlJBTUVUYWdJbmZvPURlZmluZXMgYW4gaW5saW5lIHN1YndpbmRvdwotSU1HVGFnSW5mbz1EaXNwbGF5cyB0aGUgcmVmZXJlbmNlZCBpbWFnZSBhcyBlbWJlZGRlZCBjb250ZW50Ci1JTlBVVFRhZ0luZm89RGVmaW5lcyBhIGZvcm0gY29udHJvbCBmb3IgdXNlciBpbnB1dAotSU5TVGFnSW5mbz1EZWZpbmVzIGluc2VydGVkIHRleHQKLUlTSU5ERVhUYWdJbmZvPURlZmluZXMgYSBzaW5nbGUgbGluZSBwcm9tcHQKLUtCRFRhZ0luZm89RGVmaW5lcyB0ZXh0IHRvIGJlIGVudGVyZWQgYnkgdGhlIHVzZXIKLUxBQkVMVGFnSW5mbz1EZWZpbmVzIHRoZSBsYWJlbCBmb3IgYSBmb3JtIGZpZWxkCi1MRUdFTkRUYWdJbmZvPURlZmluZXMgdGhlIGxhYmVsIGZvciBhIHNldCBvZiBmb3JtIGZpZWxkcwotTElUYWdJbmZvPURlZmluZXMgYSBsaXN0IGl0ZW0gd2l0aGluIGEgbGlzdAotTElOS1RhZ0luZm89QSBtZWRpYS1pbmRlcGVuZGVudCBsaW5rCi1NQVBUYWdJbmZvPURlZmluZXMgYSBjbGllbnQtc2lkZSBpbWFnZSBtYXAKLU1BUlFVRUVUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgc2Nyb2xsaW5nLiBOb3Qgc3VwcG9ydGVkIGJ5IFczQyBIVE1MIDQuMDEuCi1NRU5VVGFnSW5mbz1EZWZpbmVzIGEgbWVudSBsaXN0Ci1NRVRBVGFnSW5mbz1EZWZpbmVzIG1ldGFkYXRhIGluZm9ybWF0aW9uIGZvciB0aGUgZG9jdW1lbnQKLU5PQlJUYWdJbmZvPU92ZXJyaWRlcyBhbmQgcHJldmVudHMgbGluZSBicmVha3MuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLU5PRlJBTUVTVGFnSW5mbz1Qcm92aWRlcyBpbmZvcm1hdGlvbiB0byBkaXNwbGF5IGlmIHRoZSBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBmcmFtZXMKLU5PU0NSSVBUVGFnSW5mbz1Qcm92aWRlcyBpbmZvcm1hdGlvbiB0byBkaXNwbGF5IGlmIHRoZSBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBzY3JpcHRpbmcKLU9CSkVDVFRhZ0luZm89RGVmaW5lcyBhIGdlbmVyaWMgZW1iZWRkZWQgb2JqZWN0Ci1PTFRhZ0luZm89QW4gb3JkZXJlZCBsaXN0Ci1PUFRHUk9VUFRhZ0luZm89QW4gb3B0aW9uIGdyb3VwCi1PUFRJT05UYWdJbmZvPUEgc2VsZWN0YWJsZSBjaG9pY2UKLVBUYWdJbmZvPUEgcGFyYWdyYXBoCi1QQVJBTVRhZ0luZm89QSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZQotUFJFVGFnSW5mbz1QcmVmb3JtYXR0ZWQgdGV4dAotUVRhZ0luZm89QSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uCi1TVGFnSW5mbz1EaXNwbGF5IHRleHQgaW4gc3RyaWtlLXRocm91Z2ggc3R5bGUKLVNBTVBUYWdJbmZvPVNhbXBsZSBwcm9ncmFtIG91dHB1dCwgc2NyaXB0cywgZXRjLiBEaXNwbGF5cyBpbiBtb25vc3BhY2UgZm9udC4KLVNDUklQVFRhZ0luZm89U2NyaXB0IHN0YXRlbWVudHMKLVNFTEVDVFRhZ0luZm89QW4gb3B0aW9uIHNlbGVjdG9yCi1TTUFMTFRhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBzbWFsbAotU1BBTlRhZ0luZm89QSBnZW5lcmljIGNvbnRhaW5lciwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRlZmluaW5nIGxhbmd1YWdlIG9yIHN0eWxlIGZvciB0aGUgY29udGVudHMKLVNUUklLRVRhZ0luZm89RGlzcGxheSB0ZXh0IGluIHN0cmlrZS10aHJvdWdoIHN0eWxlCi1TVFJPTkdUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgc3Ryb25nbHkgZW1waGFzaXplZCAoZ2VuZXJhbGx5IGJvbGQpCi1TVFlMRVRhZ0luZm89RGVmaW5lcyBhIHN0eWxlIGZvciB0aGUgY29udGFpbmVkIGluZm9ybWF0aW9uCi1TVUJUYWdJbmZvPURpc3BsYXkgYXMgc3Vic2NyaXB0Ci1TVVBUYWdJbmZvPURpc3BsYXkgYXMgc3VwZXJzY3JpcHQKLVRBQkxFVGFnSW5mbz1EZWZpbmVzIGEgdGFibGUKLVRCT0RZVGFnSW5mbz1UaGUgYm9keSBvZiB0aGUgdGFibGUKLVREVGFnSW5mbz1BIGNlbGwgd2l0aGluIGEgdGFibGUKLVRFWFRBUkVBVGFnSW5mbz1BIG11bHRpLWxpbmUgdGV4dCBmaWVsZAotVEZPT1RUYWdJbmZvPUEgdGFibGUgZm9vdGVyCi1USFRhZ0luZm89QSB0YWJsZSBoZWFkZXIgY2VsbAotVEhFQURUYWdJbmZvPUEgdGFibGUgaGVhZGVyCi1USVRMRVRhZ0luZm89VGhlIGRvY3VtZW50IHRpdGxlLCBkaXNwbGF5ZWQgaW4gdGhlIGJyb3dzZXIncyB0aXRsZSBiYXIKLVRSVGFnSW5mbz1BIHRhYmxlIHJvdwotVFRUYWdJbmZvPURpc3BsYXlzIHRleHQgaW4gdGVsZXR5cGUgb3IgbW9ub3NwYWNlZCB0ZXh0IHN0eWxlCi1VVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIHVuZGVybGluZWQKLVVMVGFnSW5mbz1BbiB1bm9yZGVyZWQgbGlzdAotVkFSVGFnSW5mbz1BbiBpbnN0YW5jZSBvZiBhIHZhcmlhYmxlIG9yIHByb2dyYW0gYXJndW1lbnQKLVdCUlRhZ0luZm89QWxsb3dzIGEgbGluZSBicmVhayB3aXRoaW4gPEI+Jmx0O05PQlImZ3Q7PC9CPiB0YWcuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2JjZDY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTxhYnN0cmFjdEdyYW1tYXJBbm5vdGF0aW9ucyBwcm9wZXJ0aWVzTG9jYXRpb249Imh0bXJlZiIgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQUJCUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQUJCUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBQ1JPTllNIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBQ1JPTllNVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkFERFJFU1MiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFERFJFU1NUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQVBQTEVUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBUFBMRVRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQVJFQSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQVJFQVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJBU0UiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJBU0VUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkFTRUZPTlQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJBU0VGT05UVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJETyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkRPVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJHU09VTkQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJHU09VTkRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQklHIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCSUdUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkxJTksiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJMSU5LVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJMT0NLUVVPVEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJMT0NLUVVPVEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQk9EWSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQk9EWVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQlJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQlVUVE9OIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCVVRUT05UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ0FQVElPTiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ0FQVElPTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDRU5URVIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNFTlRFUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDSVRFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVDSVRFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNPREUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNPREVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ09MIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVDT0xUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ09MR1JPVVAiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNPTEdST1VQVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkREIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVERFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJERUwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURFTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJERk4iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURGTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJESVIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURJUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJESVYiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURJVlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJETCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRExUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRFQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkVNIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVFTVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJFTUJFRCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRU1CRURUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRklFTERTRVQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUZJRUxEU0VUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkZPTlQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUZPTlRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRk9STSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRk9STVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGUkFNRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRlJBTUVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRlJBTUVTRVQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUZSQU1FU0VUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkgxIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVIMVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIMiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDMiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUgzVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ikg0Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVINFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJINSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDYiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUg2VGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkhFQUQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUhFQURUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSFIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUhSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkhUTUwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUhUTUxUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJRlJBTUUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUlGUkFNRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJTUciPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUlNR1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJTlBVVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSU5QVVRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSU5TIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJTlNUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSVNJTkRFWCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSVNJTkRFWFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJLQkQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUtCRFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJMQUJFTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTEFCRUxUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTEVHRU5EIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVMRUdFTkRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTEkiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUxJVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkxJTksiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUxJTktUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTUFQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVNQVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTUFSUVVFRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTUFSUVVFRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJNRU5VIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVNRU5VVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik1FVEEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU1FVEFUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTk9CUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTk9CUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJOT0ZSQU1FUyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTk9GUkFNRVNUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTk9TQ1JJUFQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU5PU0NSSVBUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik9CSkVDVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lT0JKRUNUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik9MIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVPTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJPUFRHUk9VUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lT1BUR1JPVVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iT1BUSU9OIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVPUFRJT05UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJQQVJBTSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lUEFSQU1UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iUFJFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVQUkVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iUSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lUVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNBTVAiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNBTVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU0NSSVBUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTQ1JJUFRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU0VMRUNUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTRUxFQ1RUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU01BTEwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNNQUxMVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNQQU4iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNQQU5UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1RSSUtFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVFJJS0VUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1RST05HIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVFJPTkdUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1RZTEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUWUxFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNVQiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1VCVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNVUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1VQVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRBQkxFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUQUJMRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUQk9EWSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVEJPRFlUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVREVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRFWFRBUkVBIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVURVhUQVJFQVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJURk9PVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVEZPT1RUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEgiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRIVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRIRUFEIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUSEVBRFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUSVRMRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVElUTEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVFIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJVIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVVVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlVMIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVVTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJWQVIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVZBUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJXQlIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVdCUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLTwvYWJzdHJhY3RHcmFtbWFyQW5ub3RhdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmEyNDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBIVE1MIE1vZGVsCi1TdHJ1Y3R1cmVkX0hUTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIEhUTUwgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLUhUTUxfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SFRNTAotX3Rhc2tNYXJrZXIubmFtZT1IVE1MIFRhc2sKLV92YWxpZGF0aW9uTWFya2VyLm5hbWU9SFRNTCBQcm9ibGVtCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQ1NjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWRlZmF1bHQ9Im5vIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckhUTUwiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZW1iZWRkZWRUeXBlSGFuZGxlciI+Ci0JCTxlbWJlZGRlZFR5cGVIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRIVE1MIj4KLQkJPC9lbWJlZGRlZFR5cGVIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIj4KLQkJPHNjYW5uZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRhc2tzLkhUTUxGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzLlhNTEZpbGVUYXNrU2Nhbm5lcjpvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRhc2tNYXJrZXIiCi0JCQljb250ZW50VHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2tNYXJrZXIiCi0JCW5hbWU9IiVfdGFza01hcmtlci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50YXNrbWFya2VyIi8+Ci0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgIGlkPSJ2YWxpZGF0aW9uTWFya2VyIgotICAgICAgICBuYW1lPSIlX3ZhbGlkYXRpb25NYXJrZXIubmFtZSIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiLz4KLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzIgotCQluYW1lPSIlU3RydWN0dXJlZF9IVE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29tbWVudEVsZW1lbnRIYW5kbGVyIj4KLQkJPGhhbmRsZXItY3VzdG9tCi0JCQljb21tZW50dHlwZT0ieG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaGFuZGxlcnMuQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJIj4KLQkJCTxzdGFydHdpdGggcHJlZml4PSIjIj48L3N0YXJ0d2l0aD4KLQkJPC9oYW5kbGVyLWN1c3RvbT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJodG1sIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Imh0bSI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4aHRtbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJodHBsIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249IndtbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJzaHRtbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJzaHRtIj4KLQkJPC9maWxlVHlwZXM+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0UHJvY2Vzc29ycyI+Ci0JCTxwcm9jZXNzb3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCIKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCTwvcHJvY2Vzc29yPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFeHRlbnNpb24gcG9pbnQgZm9yIHRhZ2hlbHAgZG9jdW1lbnRhdGlvbiAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuYW5ub3RhdGlvbkZpbGVzIj4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iPgotCQk8L2Fubm90YXRpb25GaWxlPgotCQk8YW5ub3RhdGlvbkZpbGUKLQkJCWxvY2F0aW9uPSJkYXRhL2h0bXJlZi54bWwiCi0JCQlwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiI+Ci0JCTwvYW5ub3RhdGlvbkZpbGU+Ci0JCTxhbm5vdGF0aW9uRmlsZQotCQkJbG9jYXRpb249ImRhdGEvaHRtcmVmLnhtbCIKLQkJCXB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iPgotCQk8L2Fubm90YXRpb25GaWxlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0iaHRtbCxodG0seGh0bWwsaHRwbCx3bWwsc2h0bWwsc2h0bSIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUhUTUxfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0iaHRtbHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiPgotCQkJPCEtLSBub3RlOiBubyBkZWZhdWx0LWNoYXJzZXQgZm9yIEhUTUwsIHNob3VsZCB1c2UgJ3BsYXRmb3JtJyAtLT4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySFRNTCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLTwhLS0gbW92ZWQgdG8gd2hlcmUgdGhlIGR0ZCdzIGFyZSBjb250cmlidXRlZAotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50VHlwZXMiPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0iaHRtbCIKLQkJCWRpc3BsYXlOYW1lPSJYSFRNTCAxLjAgU3RyaWN0IgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJodG1sIgotCQkJZGlzcGxheU5hbWU9IlhIVE1MIDEuMCBUcmFuc2l0aW9uYWwiCi0JCQluYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JCQlpc1hIVE1MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9ImZhbHNlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotCQkJZGVmYXVsdFhIVE1MPSJ0cnVlIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9Imh0bWwiCi0JCQlkaXNwbGF5TmFtZT0iWEhUTUwgMS4wIEZyYW1lc2V0IgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJ0cnVlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJodG1sIgotCQkJZGlzcGxheU5hbWU9IlhIVE1MIEJhc2ljIDEuMCIKLQkJCW5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQkJCWlzWEhUTUw9InRydWUiCi0JCQloYXNGcmFtZXNldD0iZmFsc2UiCi0JCQlwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCI+Ci0JCTwvZG9jdW1lbnRUeXBlPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0iaHRtbCIKLQkJCWRpc3BsYXlOYW1lPSJYSFRNTCAxLjEiCi0JCQluYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JCQlpc1hIVE1MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9ImZhbHNlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9Imh0bWwiCi0JCQlkaXNwbGF5TmFtZT0iWEhUTUwgTVAgMS4wIgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9IndtbCIKLQkJCWRpc3BsYXlOYW1lPSJXTUwgMS4zIgotCQkJbmFtZXNwYWNlVVJJPSIiCi0JCQlpc1dNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XQVBGT1JVTS8vRFREIFdNTCAxLjMvL0VOIgotCQkJZGVmYXVsdFdNTD0idHJ1ZSIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sMTMuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JPC9leHRlbnNpb24+Ci0tLT4KLQk8IS0tIGluaXRpYWxpemUgaHRtbCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb250ZW50QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb250ZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMzZjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXJJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQ29udGVudEJ1aWxkZXIgZXh0ZW5kcyBET01Db250ZW50QnVpbGRlckltcGwgewotCi0JcHJpdmF0ZSBpbnQgZlRhZ0Nhc2U7Ci0JcHJpdmF0ZSBpbnQgZkF0dHJDYXNlOwotCi0JLyoqCi0JICogRE9NQ29udGVudEJ1aWxkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gZG9jdW1lbnQgb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSFRNTENvbnRlbnRCdWlsZGVyKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXN1cGVyKGRvY3VtZW50KTsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJZlRhZ0Nhc2UgPSBwcmVmcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSk7Ci0JCWZBdHRyQ2FzZSA9IHByZWZzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSk7Ci0JCS8vCUVsZW1lbnQgY2FzZVNldHRpbmdzID0gSFRNTFByZWZlcmVuY2VNYW5hZ2VyLmdldEhUTUxJbnN0YW5jZSgpLmdldEVsZW1lbnQoUHJlZmVyZW5jZU5hbWVzLlBSRUZFUlJFRF9DQVNFKTsKLQkJLy8JZlRhZ0Nhc2UgPSBjYXNlU2V0dGluZ3MuZ2V0QXR0cmlidXRlKFByZWZlcmVuY2VOYW1lcy5UQUdOQU1FKTsKLQkJLy8JZkF0dHJDYXNlID0gY2FzZVNldHRpbmdzLmdldEF0dHJpYnV0ZShQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFTkFNRSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjb21wdXRlTmFtZShDTU5vZGUgY21ub2RlLCBOb2RlIHBhcmVudCkgewotCQlTdHJpbmcgbmFtZSA9IHN1cGVyLmNvbXB1dGVOYW1lKGNtbm9kZSwgcGFyZW50KTsKLQkJLy8gZG9uJ3QgY2hhbmdlIHRoZSBjYXNlIHVubGVzcyB3ZSdyZSBjZXJ0YWluIGl0IGlzIG1lYW5pbmdsZXNzCi0JCS8vCWlmIChjbW5vZGUgaW5zdGFuY2VvZiBIVE1MQ01Ob2RlICYmICgoSFRNTENNTm9kZSkgY21ub2RlKS5zaG91bGRJZ25vcmVDYXNlKCkpIHsKLQkJaWYgKHNob3VsZElnbm9yZUNhc2UoY21ub2RlKSkgewotCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaWYgKGZUYWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCWVsc2UgaWYgKGZUYWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQluYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vIGVsc2UgZG8gbm90aGluZwotCQkJfQotCQkJZWxzZSBpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCWlmIChmQXR0ckNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJZWxzZSBpZiAoZkF0dHJDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQluYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vIGVsc2UgZG8gbm90aGluZwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZElnbm9yZUNhc2UoQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoIWNtbm9kZS5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGNtbm9kZS5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjczYTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgSFRNTCBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX2Vycm9yX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kZWZpbmVkX2F0dHJpYnV0ZV9uYW1lX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZGVmaW5lZF9hdHRyaWJ1dGVfdmFsdWVfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aXBsZV92YWx1ZXNfc3BlY2lmaWVkX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfX18wX19fdXNlc19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfYXR0cmlidXRlX25hbWVfX18wX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2F0dHJpYnV0ZV9fXzBfX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfbG9jYXRpb25fb2ZfdGFnX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEdXBsaWNhdGVfdGFnX19fMF9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fc3RhcnRfdGFnX19fXzBfX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19lbmRfdGFnX19fX18wX19fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3RhZ19fX19fMF9fX19ub3RfbmVlZGVfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25fdGFnX19fMF9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfX18wX19fdXNlc193cm9uZ19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfdGFnX25hbWVfX18wX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX0pTUF9kaXJlY3RpdmVfX18wX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF90ZXh0X3N0cmluZ19fXzBfX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfY2hhcmFjdGVyX3VzZWRfaW5fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmtub3duX2Vycm9yX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhcnRfdGFnX19fXzBfX19fbm90X2Nsb3NfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF90YWdfX19fXzBfX19fbm90X2Nsb3NlX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfdmFsdWVfX18wX19fdXNlc19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF9ub3RfY2xvc2VkX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DVFlQRV9kZWNsYXJhdGlvbl9ub3RfY2xfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25fbm90X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDREFUQV9zZWN0aW9uX25vdF9jbG9zZWRfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfVGFnX19fMF9fX3Nob3VsZF9iZV9hbl9lbXB0eV9lbGVtZW50X3RhZ18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9BdHRyaWJ1dGVfdmFsdWVfX18wX19fbm90X2Nsb3NlZF9fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1Jlc291cmNlX25vdF9mb3VuZF8wOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEhUTUxDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIEhUTUxDb3JlTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhNDg2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBIVE1MQ29yZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEhUTUxDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUTUxDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJLy8gbGlzdGVuIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMga2V5cwotCQlIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLnN0YXJ0dXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHN0b3AgbGlzdGVubmluZyBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzCi0JCS8vIGtleXMKLQkJSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zaHV0ZG93bigpOwotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2ZjE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU5vX2Vycm9yX19VSV89Tm8gZXJyb3IuCi1VbmRlZmluZWRfYXR0cmlidXRlX25hbWVfX19FUlJPUl89VW5kZWZpbmVkIGF0dHJpYnV0ZSBuYW1lICh7MH0pLgotVW5kZWZpbmVkX2F0dHJpYnV0ZV92YWx1ZV9fRVJST1JfPVVuZGVmaW5lZCBhdHRyaWJ1dGUgdmFsdWUgKHswfSkuCi1NdWx0aXBsZV92YWx1ZXNfc3BlY2lmaWVkX19FUlJPUl89TXVsdGlwbGUgdmFsdWVzIHNwZWNpZmllZCBmb3IgYW4gYXR0cmlidXRlICh7MH0pLgotQXR0cmlidXRlX25hbWVfX18wX19fdXNlc19fRVJST1JfPUF0dHJpYnV0ZSBuYW1lICh7MH0pIHVzZXMgd3JvbmcgY2FzZSBjaGFyYWN0ZXIuCi1JbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX19fMF9FUlJPUl89SW52YWxpZCBhdHRyaWJ1dGUgbmFtZSAoezB9KS4KLUludmFsaWRfYXR0cmlidXRlX19fMF9fX19FUlJPUl89SW52YWxpZCBhdHRyaWJ1dGUgKHswfSkuCi1JbnZhbGlkX2xvY2F0aW9uX29mX3RhZ19fX19FUlJPUl89SW52YWxpZCBsb2NhdGlvbiBvZiB0YWcgKHswfSkuCi1EdXBsaWNhdGVfdGFnX19fMF9fX19FUlJPUl89RHVwbGljYXRlIHRhZyAoezB9KS4KLU5vX3N0YXJ0X3RhZ19fX18wX19fX19FUlJPUl89Tm8gc3RhcnQgdGFnICg8ezB9PikuCi1Ob19lbmRfdGFnX19fX18wX19fX19FUlJPUl89Tm8gZW5kIHRhZyAoPC97MH0+KS4KLUVuZF90YWdfX19fXzBfX19fbm90X25lZWRlX0VSUk9SXz1FbmQgdGFnICg8L3swfT4pIG5vdCBuZWVkZWQuCi1Vbmtub3duX3RhZ19fXzBfX19fRVJST1JfPVVua25vd24gdGFnICh7MH0pLgotVGFnX25hbWVfX18wX19fdXNlc193cm9uZ19fRVJST1JfPVRhZyBuYW1lICh7MH0pIHVzZXMgd3JvbmcgY2FzZSBjaGFyYWN0ZXIuCi1JbnZhbGlkX3RhZ19uYW1lX19fMF9fX19FUlJPUl89SW52YWxpZCB0YWcgbmFtZSAoezB9KS4KLUludmFsaWRfSlNQX2RpcmVjdGl2ZV9fXzBfX0VSUk9SXz1JbnZhbGlkIEpTUCBkaXJlY3RpdmUgKHswfSkuCi1JbnZhbGlkX3RleHRfc3RyaW5nX19fMF9fX19FUlJPUl89SW52YWxpZCB0ZXh0IHN0cmluZyAoezB9KS4KLUludmFsaWRfY2hhcmFjdGVyX3VzZWRfaW5fX0VSUk9SXz1JbnZhbGlkIGNoYXJhY3RlciB1c2VkIGluIHRleHQgc3RyaW5nICh7MH0pLgotVW5rbm93bl9lcnJvcl9fRVJST1JfPVVua25vd24gZXJyb3IuCi1TdGFydF90YWdfX19fMF9fX19ub3RfY2xvc19FUlJPUl89U3RhcnQgdGFnICg8ezB9Pikgbm90IGNsb3NlZC4KLUVuZF90YWdfX19fXzBfX19fbm90X2Nsb3NlX0VSUk9SXz1FbmQgdGFnICg8L3swfT4pIG5vdCBjbG9zZWQuCi1BdHRyaWJ1dGVfdmFsdWVfX18wX19fdXNlc19FUlJPUl89QXR0cmlidXRlIHZhbHVlICh7MH0pIHVzZXMgd3JvbmcgY2FzZSBjaGFyYWN0ZXIuCi1Db21tZW50X25vdF9jbG9zZWRfX0VSUk9SXz1Db21tZW50IG5vdCBjbG9zZWQuCi1ET0NUWVBFX2RlY2xhcmF0aW9uX25vdF9jbF9FUlJPUl89RE9DVFlQRSBkZWNsYXJhdGlvbiBub3QgY2xvc2VkLgotUHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9ub3RfRVJST1JfPVByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm90IGNsb3NlZC4KLUNEQVRBX3NlY3Rpb25fbm90X2Nsb3NlZF9fRVJST1JfPUNEQVRBIHNlY3Rpb24gbm90IGNsb3NlZC4KLSMgRnJvbSBoZXJlLCB0aGUgbmV3IG1lc3NhZ2VzIGFyZSBhZGRlZCBmb3IgVjUKLV9FUlJPUl9UYWdfX18wX19fc2hvdWxkX2JlX2FuX2VtcHR5X2VsZW1lbnRfdGFnXzE9VGFnICh7MH0pIHNob3VsZCBiZSBhbiBlbXB0eS1lbGVtZW50IHRhZy4KLV9FUlJPUl9BdHRyaWJ1dGVfdmFsdWVfX18wX19fbm90X2Nsb3NlZF9fMT1BdHRyaWJ1dGUgdmFsdWUgKHswfSkgbm90IGNsb3NlZC4KLSMKLUhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc9VXBkYXRpbmcgV2ViIENvbnRlbnQgU2V0dGluZ3MKLUhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc9UHJvYmxlbSBzYXZpbmcgV2ViIENvbnRlbnQgU2V0dGluZ3MgZm9yIHswfQotX0VSUk9SX1Jlc291cmNlX25vdF9mb3VuZF8wPVJlc291cmNlIG5vdCBmb3VuZDogezB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTQ3OTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmIGRlc2lyZWQsCi0gKiB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcyBwbHVnaW4uIE90aGVyCi0gKiBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogQHBhcmFtIGxldmVsIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbiBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aCAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9BYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDM1NjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGVhbnVwUHJlZmVyZW5jZXMoSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgY2xlYW51cFByZWZlcmVuY2VzKSB7Ci0KLQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci0KLQotCXB1YmxpYyBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmQ2xlYW51cFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcygpOwotCQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0VGFnTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0QXR0ck5hbWVDYXNlKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydFJlcXVpcmVkQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0UXVvdGVBdHRyVmFsdWVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEZvcm1hdFNvdXJjZShwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRFT0xDb2RlKHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCi0JCWZQcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JfQotCi0Jc3RhdGljIHByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlU291cmNlKElET01Nb2RlbCBtb2RlbCwgT2JqZWN0IHJlcXVlc3RlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHNvdXJjZSkgewotCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJc291cmNlID0gbmV3IFN0cmluZygpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgpKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJaWYgKHJlcXVlc3RlciA9PSBudWxsKSB7Ci0JCQlyZXF1ZXN0ZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTVGV4dE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTVGV4dE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTY3NWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU1RleHROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlCi0KLXB1YmxpYyBjbGFzcyBDU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIgewotCi0JcHVibGljIE5vZGUgY2xlYW51cChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQotCQlTdHJpbmcgY29udGVudCA9IGdldENTU0NvbnRlbnQobm9kZSk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQotCQlpbnQgb2Zmc2V0ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQlyZXBsYWNlU291cmNlKG1vZGVsLCB0aGlzLCBvZmZzZXQsIGxlbmd0aCwgY29udGVudCk7Ci0JCXJldHVybiAoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDU1NDb250ZW50KE5vZGUgdGV4dCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRDU1NNb2RlbCh0ZXh0KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU05vZGUgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkvLyB0cnkgYW5vdGhlciB3YXkgdG8gZ2V0IGZvcm1hdHRlcgotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpCi0JCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vdGlmaWVyKTsKLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBmb3JtYXR0ZXIuY2xlYW51cChkb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQ1NTTW9kZWwgZ2V0Q1NTTW9kZWwoTm9kZSB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZVNoZWV0QWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0eWxlU2hlZXRBZGFwdGVyIHN0eWxlQWRhcHRlciA9IChJU3R5bGVTaGVldEFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCXJldHVybiBzdHlsZUFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWFmNzRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlIENTUyBmb3JtYXR0aW5nCi0KLXB1YmxpYyBjbGFzcyBFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIgewotCi0JLyoqIE5vbi1OTFMgc3RyaW5ncyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBR19PUEVOID0gIjwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1RBR19PUEVOID0gIjwvIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DTE9TRSA9ICI+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1RBR19DTE9TRSA9ICIvPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVTID0gIicnIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URVMgPSAiXCJcIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEUgPSAnXCInOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSByZW5hbWVkTm9kZSA9IChJRE9NTm9kZSkgY2xlYW51cENoaWxkcmVuKG5vZGUpOwotCi0JCS8vIGNhbGwgcXVvdGVBdHRyVmFsdWUoKSBmaXJzdCBzbyBpdCB3aWxsIGNsb3NlIGFueSB1bmNsb3NlZCBhdHRyCi0JCS8vIHF1b3RlQXR0clZhbHVlKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBzdGFydCB0YWcgaWYgdGhlcmUgaXMgYQotCQkvLyBzdHJ1Y3R1cmUgY2hhbmdlCi0JCXJlbmFtZWROb2RlID0gcXVvdGVBdHRyVmFsdWUocmVuYW1lZE5vZGUpOwotCi0JCS8vIGluc2VydCB0YWcgY2xvc2UgaWYgbWlzc2luZwotCQkvLyBpZiBub2RlIGlzIG5vdCBjb21tZW50IHRhZwotCQkvLyBhbmQgbm90IGltcGxpY2l0IHRhZwotCQlpZiAoISgoSURPTUVsZW1lbnQpIHJlbmFtZWROb2RlKS5pc0NvbW1lbnRUYWcoKSAmJiAocmVuYW1lZE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSkgewotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IHJlbmFtZWROb2RlLmdldE1vZGVsKCk7Ci0KLQkJCS8vIHNhdmUgc3RhcnQgb2Zmc2V0IGJlZm9yZSBpbnNlcnRUYWdDbG9zZSgpCi0JCQkvLyBvciBlbHNlIHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgd2lsbCBiZSB6ZXJvIGlmCi0JCQkvLyByZW5hbWVkTm9kZSByZXBsYWNlZCBieSBpbnNlcnRUYWdDbG9zZSgpCi0JCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCS8vIGZvciBzdGFydCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCS8vIHVwZGF0ZSByZW5hbWVkTm9kZSBhbmQgc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWZ0ZXIKLQkJCS8vIGluc2VydFRhZ0Nsb3NlKCkKLQkJCXJlbmFtZWROb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsKLQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJLy8gZm9yIGVuZCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCWluc2VydFRhZ0Nsb3NlKHN0cnVjdHVyZWRNb2RlbCwgZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCi0JCS8vIGNhbGwgaW5zZXJ0TWlzc2luZ1RhZ3MoKSBuZXh0LCBpdCB3aWxsIGdlbmVyYXRlIGltcGxpY2l0IHRhZ3MgaWYKLQkJLy8gdGhlcmUgYXJlIGFueQotCQkvLyBpbnNlcnRNaXNzaW5nVGFncygpIHdpbGwgcmV0dXJuIHRoZSBuZXcgbWlzc2luZyBzdGFydCB0YWcgaWYgb25lIGlzCi0JCS8vIG1pc3NpbmcKLQkJLy8gYXBwbHlUYWdOYW1lQ2FzZSgpIHdpbGwgcmV0dXJuIHRoZSByZW5hbWVkIG5vZGUuCi0JCS8vIFRoZSByZW5hbWVkL25ldyBub2RlIHdpbGwgYmUgc2F2ZWQgYW5kIHJldHVybmVkIHRvIGNhbGxlciB3aGVuIGFsbAotCQkvLyBjbGVhbnVwIGlzIGRvbmUuCi0JCXJlbmFtZWROb2RlID0gaW5zZXJ0TWlzc2luZ1RhZ3MocmVuYW1lZE5vZGUpOwotCQlyZW5hbWVkTm9kZSA9IGluc2VydFJlcXVpcmVkQXR0cnMocmVuYW1lZE5vZGUpOwotCQlyZW5hbWVkTm9kZSA9IGFwcGx5VGFnTmFtZUNhc2UocmVuYW1lZE5vZGUpOwotCQlhcHBseUF0dHJOYW1lQ2FzZShyZW5hbWVkTm9kZSk7Ci0JCWNsZWFudXBDU1NBdHRyVmFsdWUocmVuYW1lZE5vZGUpOwotCi0JCXJldHVybiByZW5hbWVkTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgY2xlYW51cCBzaG91bGQgbW9kaWZ5IGNhc2UuIFJldHVybnMgdHJ1ZSBjYXNlIHNob3VsZCBiZQotCSAqIHByZXNlcnZlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgaXMgY2FzZSBzZW5zaXRpdmUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRQcmVzZXJ2ZUNhc2UoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBjYXNlIG9wdGlvbiBjYW4gYmUgYXBwbGllZCB0byBubyBuYW1lc3BhY2UgdGFncwotCQlyZXR1cm4gIWVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQkJLyoKLQkJICogTW9kZWxRdWVyeUFkYXB0ZXIgbXFhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKQotCQkgKiBlbGVtZW50LmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOyBNb2RlbFF1ZXJ5IG1xID0KLQkJICogbnVsbDsgQ01Ob2RlIG5vZGVkZWNsID0gbnVsbDsgaWYgKG1xYWRhcHRlciAhPSBudWxsKSBtcSA9Ci0JCSAqIG1xYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCk7IGlmIChtcSAhPSBudWxsKSBub2RlZGVjbCA9Ci0JCSAqIG1xLmdldENNTm9kZShub2RlKTsgLy8gaWYgYSBOb2RlIGlzbid0IHJlY29nbml6ZWQgYXMgSFRNTCBvciBpcyBhbmQKLQkJICogY2FyZXMgYWJvdXQgY2FzZSwgZG8gbm90IGFsdGVyIGl0IC8vIGlmIChub2RlZGVjbCA9PSBudWxsIHx8Ci0JCSAqIChub2RlZGVjbCBpbnN0YW5jZW9mIEhUTUxDTU5vZGUgJiYgKChIVE1MQ01Ob2RlKQotCQkgKiBub2RlZGVjbCkuc2hvdWxkSWdub3JlQ2FzZSgpKSkgaWYgKCEKLQkJICogbm9kZWRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSByZXR1cm4KLQkJICogZmFsc2U7IHJldHVybgotCQkgKiAoKEJvb2xlYW4pY21ub2RlLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBjbGVhbnVwIHNob3VsZCBmb3JjZSBtb2RpZnlpbmcgZWxlbWVudCBuYW1lIHRvIGFsbCBsb3dlcmNhc2UuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRydWUgaWYgY2xlYW51cCBzaG91bGQgbG93ZXJjYXNlIGVsZW1lbnQgbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQuaXNYTUxUYWcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhcHBseUF0dHJOYW1lQ2FzZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuOyAvLyBkbyBub3RoaW5nCi0KLQkJaW50IGF0dHJOYW1lQ2FzZSA9IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVM7Ci0JCWlmICghc2hvdWxkUHJlc2VydmVDYXNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoaXNYTUxUYWcoZWxlbWVudCkpCi0JCQkJYXR0ck5hbWVDYXNlID0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCQllbHNlCi0JCQkJYXR0ck5hbWVDYXNlID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0QXR0ck5hbWVDYXNlKCk7Ci0JCX0KLQotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzTGVuZ3RoOyBpKyspIHsKLQkJCUlET01Ob2RlIGVhY2hBdHRyID0gKElET01Ob2RlKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgb2xkQXR0ck5hbWUgPSBlYWNoQXR0ci5nZXROb2RlTmFtZSgpOwotCQkJU3RyaW5nIG5ld0F0dHJOYW1lID0gb2xkQXR0ck5hbWU7Ci0JCQkvKgotCQkJICogMjU0OTYxIC0gYWxsIEhUTUwgdGFnIG5hbWVzIGFuZCBhdHRyaWJ1dGUgbmFtZXMgc2hvdWxkIGJlIGluCi0JCQkgKiBFbmdsaXNoIGV2ZW4gZm9yIEhUTUwgZmlsZXMgaW4gb3RoZXIgbGFuZ3VhZ2VzIGxpa2UgSmFwYW5lc2Ugb3IKLQkJCSAqIFR1cmtpc2guIEVuZ2xpc2ggbG9jYWxlIHNob3VsZCBiZSB1c2VkIHRvIGNvbnZlcnQgYmV0d2VlbgotCQkJICogdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgKG90aGVyd2lzZSAibGluayIgd291bGQgYmUgY29udmVydGVkIHRvCi0JCQkgKiBUdXJraXNoICJJIE92ZXJkb3QgQ2FwaXRhbCIpLgotCQkJICovCi0JCQlpZiAoYXR0ck5hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJCW5ld0F0dHJOYW1lID0gb2xkQXR0ck5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKLQkJCWVsc2UgaWYgKGF0dHJOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQluZXdBdHRyTmFtZSA9IG9sZEF0dHJOYW1lLnRvVXBwZXJDYXNlKExvY2FsZS5VUyk7Ci0KLQkJCWlmIChuZXdBdHRyTmFtZS5jb21wYXJlVG8ob2xkQXR0ck5hbWUpICE9IDApIHsKLQkJCQlpbnQgYXR0ck5hbWVTdGFydE9mZnNldCA9IGVhY2hBdHRyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGF0dHJOYW1lTGVuZ3RoID0gb2xkQXR0ck5hbWUubGVuZ3RoKCk7Ci0KLQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGF0dHJOYW1lU3RhcnRPZmZzZXQsIGF0dHJOYW1lTGVuZ3RoLCBuZXdBdHRyTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgYXBwbHlUYWdOYW1lQ2FzZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlpbnQgdGFnTmFtZUNhc2UgPSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTOwotCi0JCWlmICghc2hvdWxkUHJlc2VydmVDYXNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAoaXNYTUxUYWcoZWxlbWVudCkpCi0JCQkJdGFnTmFtZUNhc2UgPSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJCWVsc2UKLQkJCQl0YWdOYW1lQ2FzZSA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldFRhZ05hbWVDYXNlKCk7Ci0JCX0KLQotCQlTdHJpbmcgb2xkVGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIG5ld1RhZ05hbWUgPSBvbGRUYWdOYW1lOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQkvKgotCQkgKiAyNTQ5NjEgLSBhbGwgSFRNTCB0YWcgbmFtZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgYmUgaW4KLQkJICogRW5nbGlzaCBldmVuIGZvciBIVE1MIGZpbGVzIGluIG90aGVyIGxhbmd1YWdlcyBsaWtlIEphcGFuZXNlIG9yCi0JCSAqIFR1cmtpc2guIEVuZ2xpc2ggbG9jYWxlIHNob3VsZCBiZSB1c2VkIHRvIGNvbnZlcnQgYmV0d2VlbiB1cHBlcmNhc2UKLQkJICogYW5kIGxvd2VyY2FzZSAob3RoZXJ3aXNlICJsaW5rIiB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8gVHVya2lzaCAiSQotCQkgKiBPdmVyZG90IENhcGl0YWwiKS4KLQkJICovCi0JCWlmICh0YWdOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCW5ld1RhZ05hbWUgPSBvbGRUYWdOYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7Ci0JCWVsc2UgaWYgKHRhZ05hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJbmV3VGFnTmFtZSA9IG9sZFRhZ05hbWUudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlpZiAocmVnaW9ucyAhPSBudWxsICYmIHJlZ2lvbnMuc2l6ZSgpID4gMCkgewotCQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnTmFtZVJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCWludCBzdGFydFRhZ05hbWVTdGFydE9mZnNldCA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHN0YXJ0VGFnTmFtZVJlZ2lvbik7Ci0JCQkJaW50IHN0YXJ0VGFnTmFtZUxlbmd0aCA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoc3RhcnRUYWdOYW1lUmVnaW9uKSAtIHN0YXJ0VGFnTmFtZVN0YXJ0T2Zmc2V0OwotCi0JCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRUYWdOYW1lU3RhcnRPZmZzZXQsIHN0YXJ0VGFnTmFtZUxlbmd0aCwgbmV3VGFnTmFtZSk7Ci0JCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdOYW1lU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJLy8gbmV3Ci0JCQkJLy8gbm9kZQotCQkJfQotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQkJSVRleHRSZWdpb24gZW5kVGFnTmFtZVJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCWludCBlbmRUYWdOYW1lU3RhcnRPZmZzZXQgPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZW5kVGFnTmFtZVJlZ2lvbik7Ci0JCQkJaW50IGVuZFRhZ05hbWVMZW5ndGggPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChlbmRUYWdOYW1lUmVnaW9uKSAtIGVuZFRhZ05hbWVTdGFydE9mZnNldDsKLQotCQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVuZFRhZ05hbWVTdGFydE9mZnNldCwgZW5kVGFnTmFtZUxlbmd0aCwgbmV3VGFnTmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBjbGVhbnVwQ2hpbGRyZW4oTm9kZSBub2RlKSB7Ci0JCU5vZGUgcGFyZW50Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCUhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkgZmFjdG9yeSA9IEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIGNsZWFudXAgdGhpcyBjaGlsZCBub2RlCi0JCQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGZhY3RvcnkuY3JlYXRlSGFuZGxlcihjaGlsZE5vZGUsIGdldENsZWFudXBQcmVmZXJlbmNlcygpKTsKLQkJCQljaGlsZE5vZGUgPSBjbGVhbnVwSGFuZGxlci5jbGVhbnVwKGNoaWxkTm9kZSk7Ci0KLQkJCQkvLyBnZXQgbmV3IHBhcmVudCBub2RlCi0JCQkJcGFyZW50Tm9kZSA9IGNoaWxkTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkvLyBnZXQgbmV4dCBjaGlsZCBub2RlCi0JCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwQ1NTQXR0clZhbHVlKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm47Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCWlmICghZWxlbWVudC5pc0dsb2JhbFRhZygpKQotCQkJcmV0dXJuOwotCi0JCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgic3R5bGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdmFsdWUgPSBnZXRDU1NWYWx1ZShhdHRyKTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBvbGRWYWx1ZSA9ICgoSURPTU5vZGUpIGF0dHIpLmdldFZhbHVlU291cmNlKCk7Ci0JCWlmIChvbGRWYWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpCi0JCQlyZXR1cm47Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSUNTU01vZGVsIGdldENTU01vZGVsKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyIHN0eWxlQWRhcHRlciA9IChJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCXJldHVybiBzdHlsZUFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDU1NWYWx1ZShBdHRyIGF0dHIpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0Q1NTTW9kZWwoYXR0cik7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDU1NOb2RlIGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudDsKLQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IChDU1NTb3VyY2VGb3JtYXR0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJLy8gdHJ5IGFub3RoZXIgd2F5IHRvIGdldCBmb3JtYXR0ZXIKLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKQotCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub3RpZmllcik7Ci0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gZm9ybWF0dGVyLmNsZWFudXAoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgaW5zZXJ0RW5kVGFnKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQotCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQllbHNlIGlmIChpc0VtcHR5RWxlbWVudChlbGVtZW50KSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCBsYXN0UmVnaW9uLmdldExlbmd0aCgpLCBFTVBUWV9UQUdfQ0xPU0UpOwotCi0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uQmVmb3JlVGFnQ2xvc2UgPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEgLSAxKTsKLQotCQkJCS8vIGluc2VydCBhIHNwYWNlIHNlcGFyYXRvciBiZWZvcmUgdGFnIGNsb3NlIGlmIHRoZSBwcmV2aW91cwotCQkJCS8vIHJlZ2lvbiBkb2VzIG5vdCBoYXZlIGV4dHJhIHNwYWNlcwotCQkJCWlmIChyZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRUZXh0TGVuZ3RoKCkgPT0gcmVnaW9uQmVmb3JlVGFnQ2xvc2UuZ2V0TGVuZ3RoKCkpCi0JCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZyBlbmRUYWcgPSBFTkRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCi0JCQlJRE9NTm9kZSBsYXN0Q2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpbnQgZW5kVGFnU3RhcnRPZmZzZXQgPSAwOwotCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKQotCQkJCS8vIGlmIHRoaXMgbm9kZSBoYXMgY2hpbGRyZW4sIGluc2VydCB0aGUgZW5kIHRhZyBhZnRlciB0aGUKLQkJCQkvLyBsYXN0IGNoaWxkCi0JCQkJZW5kVGFnU3RhcnRPZmZzZXQgPSBsYXN0Q2hpbGQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQllbHNlCi0JCQkJLy8gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhcyBjaGlsZHJlbiwgaW5zZXJ0IHRoZSBlbmQgdGFnCi0JCQkJLy8gYWZ0ZXIgdGhlIHN0YXJ0IHRhZwotCQkJCWVuZFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBlbmRUYWdTdGFydE9mZnNldCwgMCwgZW5kVGFnKTsKLQkJfQotCi0JCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCS8vIG5ldwotCQkvLyBub2RlCi0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIGluc2VydE1pc3NpbmdUYWdzKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpbnNlcnRNaXNzaW5nVGFncykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJLy8gaW1wbGljaXQgc3RhcnQgdGFnOyBnZW5lcmF0ZSB0YWcgZm9yIGl0Ci0JCQkJbmV3Tm9kZSA9IGluc2VydFN0YXJ0VGFnKG5vZGUpOwotCQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgcmVnaW9uTGlzdCAhPSBudWxsICYmIHJlZ2lvbkxpc3QuZ2V0KHJlZ2lvbkxpc3Quc2l6ZSgpIC0gMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQkvLyBzdGFydCB0YWcgbWlzc2luZwotCQkJCQlpZiAoaXNTdGFydFRhZ1JlcXVpcmVkKG5ld05vZGUpKQotCQkJCQkJbmV3Tm9kZSA9IGluc2VydFN0YXJ0VGFnKG5ld05vZGUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQkvLyBlbmQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzRW5kVGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0RW5kVGFnKG5ld05vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBpbnNlcnRTdGFydFRhZyhJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlJRE9NTm9kZSBuZXdOb2RlID0gbnVsbDsKLQotCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnID0gU1RBUlRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRUYWdTdGFydE9mZnNldCwgMCwgc3RhcnRUYWcpOwotCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkvLyBuZXcKLQkJLy8gbm9kZQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydFRhZ0Nsb3NlKElET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKChmbGF0Tm9kZSAhPSBudWxsKSAmJiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpICE9IG51bGwpKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25MaXN0LmdldChyZWdpb25MaXN0LnNpemUoKSAtIDEpOwotCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyByZWdpb25UeXBlID0gbGFzdFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKChyZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgJiYgKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQkvLyBpbnNlcnQgIj4iIGFmdGVyIGxhc3RSZWdpb24gb2YgZmxhdE5vZGUKLQkJCQkJLy8gYXMgaW4gIjxhPC9hPiIgaWYgZmxhdE5vZGUgaXMgZm9yIHN0YXJ0IHRhZywgb3IgaW4KLQkJCQkJLy8gIjxhPjwvYSIgaWYgZmxhdE5vZGUgaXMgZm9yIGVuZCB0YWcKLQkJCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChsYXN0UmVnaW9uKSwgMCwgIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5kVGFnUmVxdWlyZWQoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbm9kZS5pc0NvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBlbmQgdGFncyBvZiBIVE1MIEVNUFRZIGNvbnRlbnQgdHlwZSwgc3VjaCBhcyBJTUcsIGFuZCBIVE1MCi0JICogdW5kZWZpbmVkIHRhZ3MgYXJlIHBhcnNlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHN0YXJ0IHRhZ3MuIFNvIGluc2VydGluZwotCSAqIHRoZSBtaXNzaW5nIHN0YXJ0IHRhZyBpcyB1c2VsZXNzIGFuZCBldmVuIGhhcm1mdWwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdGFydFRhZ1JlcXVpcmVkKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG5vZGUuaXNDb250YWluZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hNTFR5cGUoSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCAmJiBzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldERvY3VtZW50KCk7Ci0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGRvY3VtZW50LmlzWE1MVHlwZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgcXVvdGVBdHRyVmFsdWUoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBub2RlOyAvLyBkbyBub3RoaW5nCi0KLQkJYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRRdW90ZUF0dHJWYWx1ZXMoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKHF1b3RlQXR0clZhbHVlcykgewotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBuZXdOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWludCBhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbm9kZS5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJCWF0dHJpYnV0ZXMgPSBuZXdOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCQlJRE9NQXR0ciBlYWNoQXR0ciA9IChJRE9NQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCS8vIElUZXh0UmVnaW9uIG9sZEF0dHJWYWx1ZVJlZ2lvbiA9IGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJU3RyaW5nIG9sZEF0dHJWYWx1ZSA9IGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCWlmIChvbGRBdHRyVmFsdWUgPT0gbnVsbCkgewotCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQlpZiAoaXNYTUxUeXBlKHN0cnVjdHVyZWRNb2RlbCkpIHsKLQkJCQkJCS8vIFRPRE86IEtpdCwgcGxlYXNlIGNoZWNrLiBJcyB0aGVyZSBhbnkgd2F5IHRvIG5vdAotCQkJCQkJLy8gcmVseSBvbiBnZXR0aW5nIHJlZ2lvbnMgZnJvbSBhdHRyaWJ1dGVzPwotCQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9ICI9XCIiICsgZWFjaEF0dHIuZ2V0TmFtZVJlZ2lvblRleHQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVhY2hBdHRyLmdldE5hbWVSZWdpb25FbmRPZmZzZXQoKSwgMCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7IC8vIHNhdmUKLQkJCQkJCS8vIG5ldwotCQkJCQkJLy8gbm9kZQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCi0JCQkJCWNoYXIgcXVvdGUgPSBTdHJpbmdVdGlscy5pc1F1b3RlZChvbGRBdHRyVmFsdWUpID8gb2xkQXR0clZhbHVlLmNoYXJBdCgwKSA6IERPVUJMRV9RVU9URTsKLQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShlYWNoQXR0ciwgcXVvdGUpOwotCi0JCQkJCS8vIFRoZXJlIGlzIGEgcHJvYmxlbSBpbgotCQkJCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShJVGV4dFJlZ2lvbikKLQkJCQkJLy8gd2hlbiB0aGUgcmVnaW9uIGlzIGluc3RhbmNlb2YgQ29udGV4dFJlZ2lvbi4KLQkJCQkJLy8gV29ya2Fyb3VuZCBmb3Igbm93Li4uCi0JCQkJCWlmIChvbGRBdHRyVmFsdWUubGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJY2hhciBmaXJzdENoYXIgPSBvbGRBdHRyVmFsdWUuY2hhckF0KDApOwotCQkJCQkJaWYgKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEUpCi0JCQkJCQkJbmV3QXR0clZhbHVlID0gU0lOR0xFX1FVT1RFUzsKLQkJCQkJCWVsc2UgaWYgKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEUpCi0JCQkJCQkJbmV3QXR0clZhbHVlID0gRE9VQkxFX1FVT1RFUzsKLQkJCQkJfQotCi0JCQkJCWlmIChuZXdBdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZS5jb21wYXJlVG8ob2xkQXR0clZhbHVlKSAhPSAwKSB7Ci0JCQkJCQkJaW50IGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0ID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQkJCWludCBhdHRyVmFsdWVMZW5ndGggPSBvbGRBdHRyVmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0LCBhdHRyVmFsdWVMZW5ndGgsIG5ld0F0dHJWYWx1ZSk7Ci0JCQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJCQkJCQkvLyBuZXcKLQkJCQkJCQkvLyBub2RlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGluc2VydFJlcXVpcmVkQXR0cnMoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIGluc2VydFJlcXVpcmVkQXR0cnMgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRJbnNlcnRSZXF1aXJlZEF0dHJzKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpbnNlcnRSZXF1aXJlZEF0dHJzKSB7Ci0JCQlMaXN0IHJlcXVpcmVkQXR0cnMgPSBnZXRSZXF1aXJlZEF0dHJzKG5ld05vZGUpOwotCQkJaWYgKHJlcXVpcmVkQXR0cnMuc2l6ZSgpID4gMCkgewotCQkJCU5hbWVkTm9kZU1hcCBjdXJyZW50QXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlMaXN0IGluc2VydEF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCkgPT0gMCkKLQkJCQkJaW5zZXJ0QXR0cnMuYWRkQWxsKHJlcXVpcmVkQXR0cnMpOwotCQkJCWVsc2UgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVkQXR0cnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJOYW1lID0gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSByZXF1aXJlZEF0dHJzLmdldChpKSkuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3VycmVudEF0dHJzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQlTdHJpbmcgY3VycmVudEF0dHJOYW1lID0gY3VycmVudEF0dHJzLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQlpZiAocmVxdWlyZWRBdHRyTmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKGN1cnJlbnRBdHRyTmFtZSkgPT0gMCkgewotCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICghZm91bmQpCi0JCQkJCQkJaW5zZXJ0QXR0cnMuYWRkKHJlcXVpcmVkQXR0cnMuZ2V0KGkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaW5zZXJ0QXR0cnMuc2l6ZSgpID4gMCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpbnQgaW5kZXggPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExhc3RSZWdpb24oKTsKLQkJCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJCQkJaW5kZXgtLTsKLQkJCQkJCWxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCAtIDEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkJaW5kZXggPSBpbmRleCAtIDI7Ci0JCQkJCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJCQkJfQotCQkJCQlNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJCQl0cnkgewotCQkJCQkJZm9yIChpbnQgaSA9IGluc2VydEF0dHJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnNlcnRBdHRycy5nZXQoaSk7Ci0JCQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0cmlidXRlTmFtZSA9IGF0dHJEZWNsLmdldEF0dHJOYW1lKCk7Ci0JCQkJCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dHJEZWNsLmdldERlZmF1bHRWYWx1ZSgpOwotCQkJCQkJCWlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkKLQkJCQkJCQkJZGVmYXVsdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChpID09IDAgJiYgbGFzdFJlZ2lvbi5nZXRMZW5ndGgoKSA+IGxhc3RSZWdpb24uZ2V0VGV4dExlbmd0aCgpKQotCQkJCQkJCQluYW1lQW5kRGVmYXVsdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQluYW1lQW5kRGVmYXVsdFZhbHVlICs9IHJlcXVpcmVkQXR0cmlidXRlTmFtZSArICI9XCIiICsgZGVmYXVsdFZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgSW5zZXJ0RWRpdChpbmRleCwgbmFtZUFuZERlZmF1bHRWYWx1ZSkpOwotCQkJCQkJCS8vIEJVRzMzODE6IE11bHRpVGV4dEVkaXQgYXBwbGllcyBhbGwgY2hpbGQKLQkJCQkJCQkvLyBUZXh0RWRpdCdzIGJhc2luZyBvbiBvZmZzZXRzCi0JCQkJCQkJLy8gaW4gdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgZmlyc3QgVGV4dEVkaXQsIG5vdAotCQkJCQkJCS8vIGFmdGVyIGVhY2gKLQkJCQkJCQkvLyBjaGlsZCBUZXh0RWRpdC4gVGhlcmVmb3JlLCBkbyBub3QgbmVlZCB0bwotCQkJCQkJCS8vIGFkdmFuY2UgdGhlIGluZGV4LgotCQkJCQkJCS8vIGluZGV4ICs9IG5hbWVBbmREZWZhdWx0VmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQltdWx0aVRleHRFZGl0LmFwcGx5KG5ld05vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCU1vZGVsUXVlcnkgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXJlc3VsdCA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoKERvY3VtZW50KSBub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWRBdHRycyhOb2RlIG5vZGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gZ2V0TW9kZWxRdWVyeShub2RlKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmYzc3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9IVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZSBDU1MgZm9ybWF0dGluZwotCi1jbGFzcyBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5IHsKLQotCi0KLQlwcml2YXRlIHN0YXRpYyBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5IGZJbnN0YW5jZSA9IG51bGw7Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNyZWF0ZUhhbmRsZXIoTm9kZSBub2RlLCBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpIHsKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJaWYgKGlzWE1MVGFnKG5vZGUpKQotCQkJCQloYW5kbGVyID0gbmV3IEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQllbHNlCi0JCQkJCWhhbmRsZXIgPSBuZXcgSlNQRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQlpZiAoaXNQYXJlbnRTdHlsZVRhZyhub2RlKSkKLQkJCQkJaGFuZGxlciA9IG5ldyBDU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJZWxzZQotCQkJCQloYW5kbGVyID0gbmV3IE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQloYW5kbGVyID0gbmV3IE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJfQotCQl9Ci0KLQkJaGFuZGxlci5zZXRDbGVhbnVwUHJlZmVyZW5jZXMoY2xlYW51cFByZWZlcmVuY2VzKTsKLQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MVGFnKE5vZGUgbm9kZSkgewotCQlpZihub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXJldHVybiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgPT0gcmVnaW9uLmdldFR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcmVudFN0eWxlVGFnKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIShub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChmbGF0Tm9kZS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGNoZWNrIGlmIHRoZSBwYXJlbnQgaXMgU1RZTEUgZWxlbWVudAotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG5hbWUgPSBwYXJlbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlNUWUxFIikpLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YjI5MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBnZXRDbGVhbnVwSGFuZGxlcihOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVIYW5kbGVyKG5vZGUsIGdldENsZWFudXBQcmVmZXJlbmNlcygpKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkNsZWFudXBQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0VGFnTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0QXR0ck5hbWVDYXNlKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydFJlcXVpcmVkQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0UXVvdGVBdHRyVmFsdWVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEZvcm1hdFNvdXJjZShwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRFT0xDb2RlKHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG5ldyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCgpOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0pTUEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0pTUEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4OTE0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9KU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBKU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyIGV4dGVuZHMgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQkvKiA8anNwOnJvb3Q+IHNob3VsZCBjbGVhbnVwIGl0cyBkZXNjZW5kYW50IG5vZGVzICovCi0JCWlmKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSAoKElET01Ob2RlKSBub2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYoIkpTUF9ST09UX1RBR19OQU1FIi5lcXVhbHMocmVnaW9uLmdldFR5cGUoKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gc3VwZXIuY2xlYW51cChub2RlKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzFmMzRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgTm9kZUNsZWFudXBIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIgewotCi0JcHVibGljIE5vZGUgY2xlYW51cChOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2hhbmRsZXJzL0NvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2hhbmRsZXJzL0NvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTUyOGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9oYW5kbGVycy9Db21tZW50RWxlbWVudEhhbmRsZXJGb3JTU0kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5oYW5kbGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsLkNvbW1lbnRFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbC5UYWdTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJIGltcGxlbWVudHMgQ29tbWVudEVsZW1lbnRIYW5kbGVyIHsKLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDTURvY3VtZW50IGNtID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCWlmIChjbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbS5nZXRFbGVtZW50cygpOwotCQlpZiAobWFwID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoZGF0YSwgMSk7Ci0JCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lLmxlbmd0aCgpICsgNCk7Ci0JCWJ1ZmZlci5hcHBlbmQoU1NJX1BSRUZJWCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJzonKTsKLQkJYnVmZmVyLmFwcGVuZChuYW1lKTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJLy8gY2hlY2sgaWYgdmFsaWQgKGRlZmluZWQpIFNTSSB0YWcgb3Igbm90Ci0JCWlmIChtYXAuZ2V0TmFtZWRJdGVtKHRhZ05hbWUpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ29tbWVudEVsZW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQ29tbWVudEVsZW1lbnRGYWN0b3J5KGRvY3VtZW50LCBpc0pTUFRhZywgdGhpcyk7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlKHRhZ05hbWUsIENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19TVEFSVCk7Ci0KLQkJLy8gc2V0IGF0dHJpYnV0ZXMKLQkJU3RyaW5nIGF0dHJOYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQl3aGlsZSAoYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IHNjYW5uZXIubmV4dFZhbHVlKCk7Ci0JCQlBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoYXR0ck5hbWUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkKLQkJCQkJYXR0ci5zZXRWYWx1ZShhdHRyVmFsdWUpOwotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCX0KLQkJCWF0dHJOYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTdGFydFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGVsZW1lbnQuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKCcjJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHIgYXR0ciA9IChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyTmFtZShhdHRyKTsKLQkJCWlmIChhdHRyTmFtZSAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyTmFtZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGF0dHIpOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJLy8gYXR0ciBuYW1lIG9ubHkgZm9yIEhUTUwgYm9vbGVhbiBhbmQgSlNQCi0JCQkJYnVmZmVyLmFwcGVuZCgnPScpOwotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRW5kVGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOyAvLyBhbHdheXMgZW1wdHkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ01Eb2N1bWVudCBjbSA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoY20gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUNNTmFtZWROb2RlTWFwIG1hcCA9IGNtLmdldEVsZW1lbnRzKCk7Ci0JCWlmIChtYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotCQlpZiAocHJlZml4ID09IG51bGwgfHwgIXByZWZpeC5lcXVhbHMoU1NJX1BSRUZJWCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA8PSA0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1hcC5nZXROYW1lZEl0ZW0odGFnTmFtZSkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1BSRUZJWCA9ICJzc2kiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMmE3MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgQXR0cmlidXRlQ29sbGVjdGlvbiBleHRlbmRzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIEhUTUw0ME5hbWVzcGFjZSB7Ci0KLQkvKiogYm9keWNvbG9ycy4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCT0RZQ09MT1JTID0ge0FUVFJfTkFNRV9CR0NPTE9SLCBBVFRSX05BTUVfVEVYVCwgQVRUUl9OQU1FX0xJTkssIEFUVFJfTkFNRV9WTElOSywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElOS307Ci0JLyoqIGNvcmVhdHRycy4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT1JFID0ge0FUVFJfTkFNRV9JRCwgQVRUUl9OQU1FX0NMQVNTLCBBVFRSX05BTUVfU1RZTEUsIEFUVFJfTkFNRV9USVRMRX07Ci0JLyoqIGV2ZW50cy4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFVkVOVFMgPSB7QVRUUl9OQU1FX09OQ0xJQ0ssIEFUVFJfTkFNRV9PTkRCTENMSUNLLCBBVFRSX05BTUVfT05NT1VTRURPV04sIEFUVFJfTkFNRV9PTk1PVVNFVVAsIEFUVFJfTkFNRV9PTk1PVVNFT1ZFUiwgQVRUUl9OQU1FX09OTU9VU0VNT1ZFLCBBVFRSX05BTUVfT05NT1VTRU9VVCwgQVRUUl9OQU1FX09OS0VZUFJFU1MsIEFUVFJfTkFNRV9PTktFWURPV04sIEFUVFJfTkFNRV9PTktFWVVQLCBBVFRSX05BTUVfT05IRUxQfTsKLQkvKiogaTE4bi4gbGFuZywgZGlyICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSTE4TiA9IHtBVFRSX05BTUVfTEFORywgQVRUUl9OQU1FX0RJUn07Ci0JLyoqIGNlbGxoYWxpZ2guICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ0VMTEhBTElHTiA9IHtBVFRSX05BTUVfQ0hBUiwgQVRUUl9OQU1FX0NIQVJPRkZ9OwotCi0JLyoqCi0JICogY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUNvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlKFN0cmluZyBhdHRyTmFtZSkgewotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCi0JCWlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQkJSKSkgewotCQkJLy8gKGFiYnIgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQkJSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ0NFUFQpKSB7Ci0JCQkvLyAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDQ0VQVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUNDRVBUX0NIQVJTRVQpKSB7Ci0JCQkvLyAoYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOzsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUlNFVFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQ0NFUFRfQ0hBUlNFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUNUSU9OKSkgewotCQkJLy8gKGFjdGlvbiAlVVJJICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDVElPTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVJDSElWRSkpIHsKLQkJCS8vIChhcmNoaXZlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BUkNISVZFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ0NFU1NLRVkpKSB7Ci0JCQkvLyAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNIQVJBQ1RFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDQ0VTU0tFWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUxJTkspKSB7Ci0JCQkvLyAoYWxpbmsgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSU5LLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BTFQpKSB7Ci0JCQkvLyAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVVUT1NUQVJUKSkgewotCQkJLy8gKGF1dG9zdGFydCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BVVRPU1RBUlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FVVE9QTEFZKSkgewotCQkJLy8gKGF1dG9wbGF5ICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FVVE9QTEFZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BVVRPU0laRSkpIHsKLQkJCS8vIChhdXRvc2l6ZSAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BVVRPU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVhJUykpIHsKLQkJCS8vIChheGlzIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BWElTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CQUNLR1JPVU5EKSkgewotCQkJLy8gKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CQUNLR1JPVU5ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CRUhBVklPUikpIHsKLQkJCS8vIChiZWhhdmlvciAoc2Nyb2xsfHNsaWRlfGFsdGVybmF0ZSkgc2Nyb2xsKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9TQ1JPTEwsIEFUVFJfVkFMVUVfU0xJREUsIEFUVFJfVkFMVUVfQUxURVJOQVRFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9TQ1JPTEwpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CRUhBVklPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQkdDT0xPUikpIHsKLQkJCS8vIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CR0NPTE9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CT1JERVIpKSB7Ci0JCQkvLyAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0VMTFNQQUNJTkcpKSB7Ci0JCQkvLyAoY2VsbHNwYWNpbmcgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0VMTFNQQUNJTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NFTExQQURESU5HKSkgewotCQkJLy8gKGNlbGxwYWRkaW5nICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NFTExQQURESU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DR0kpKSB7Ci0JCQkvLyAoY2dpICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0dJLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DSEFSKSkgewotCQkJLy8gKGNoYXIgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUkFDVEVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hBUk9GRikpIHsKLQkJCS8vIChjaGFyb2ZmICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIQVJPRkYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIQVJTRVQpKSB7Ci0JCQkvLyAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUlNFVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIQVJTRVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NJVEUpKSB7Ci0JCQkvLyAoY2l0ZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NJVEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NMQVNTKSkgewotCQkJLy8gKGNsYXNzIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEFTUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xBU1NJRCkpIHsKLQkJCS8vIChjbGFzc2lkICVVUkkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEFTU0lELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DTUQpKSB7Ci0JCQkvLyAoY21kIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIRUNLRUQpKSB7Ci0JCQkvLyAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfQ0hFQ0tFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIRUNLRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NMRUFSKSkgewotCQkJLy8gKGNsZWFyIChsZWZ0IHwgYWxsIHwgcmlnaHQgfCBub25lKSBub25lKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0FMTCwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9OT05FfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9OT05FKTsKLQotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEVBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09ERSkpIHsKLQkJCS8vIChjb2RlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0RFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0RFQkFTRSkpIHsKLQkJCS8vIChjb2RlYmFzZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPREVCQVNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0RFVFlQRSkpIHsKLQkJCS8vIChjb2RldHlwZSAlQ290ZW50VHlwZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09ERVRZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTE9SKSkgewotCQkJLy8gKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09NUEFDVCkpIHsKLQkJCS8vIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9DT01QQUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09NUEFDVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09MUykpIHsKLQkJCS8vIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0xTUEFOKSkgewotCQkJLy8gKGNvbHNwYW4gTlVNQkVSIDEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xTUEFOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT05URU5UKSkgewotCQkJLy8gKGNvbnRlbnQgQ0RBVEEgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT05URU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT05UUk9MTEVSKSkgewotCQkJLy8gKGNvbnRyb2xsZXIgKHRydWV8ZmFsc2UpIHRydWUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT05UUk9MTEVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT09SRFMpKSB7Ci0JCQkvLyAoY29vcmRzICVDb29yZHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPT1JEUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPT1JEUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREFUQSkpIHsKLQkJCS8vIChkYXRhICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfREFUQSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREFURVRJTUUpKSB7Ci0JCQkvLyAoZGF0ZXRpbWUgJURhdGV0aW1lOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5EQVRFVElNRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RBVEVUSU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9EQVRBUEFHRVNJWkUpKSB7Ci0JCQkvLyAoZGF0YXBhZ2VzaXplIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9EQVRBUEFHRVNJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RFQ0xBUkUpKSB7Ci0JCQkvLyAoZGVjbGFyZSAoZGVjbGFyZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfREVDTEFSRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RFQ0xBUkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RFRkVSKSkgewotCQkJLy8gKGRlZmVyIChkZWZlcikgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfREVGRVJ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ERUZFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRElSKSkgewotCQkJLy8gKGRpciAobHRyfHJ0bCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xUUiwgQVRUUl9WQUxVRV9SVEx9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ESVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RJUkVDVElPTikpIHsKLQkJCS8vIChkaXJlY3Rpb24gKGxlZnR8cmlnaHR8dXB8ZG93bikgbGVmdCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9VUCwgQVRUUl9WQUxVRV9ET1dOfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRElSRUNUSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ESVJFQ1RLRVkpKSB7Ci0JCQkvLyAoZGlyZWN0a2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNIQVJBQ1RFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RJUkVDVEtFWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRElTQUJMRUQpKSB7Ci0JCQkvLyAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJLy8gYm9vbGVhbiBhdHRyaWJ1dGUgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGl0cyBuYW1lLgotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9ESVNBQkxFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RJU0FCTEVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9FTkNUWVBFKSkgewotCQkJLy8gKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1dXV19GT1JNX1VSTEVOQ09ERUQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FTkNUWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9FUlJNU0cpKSB7Ci0JCQkvLyAoZXJybXNnIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FUlJNU0csIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VWRU5UKSkgewotCQkJLy8gKGV2ZW50IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FVkVOVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRkFDRSkpIHsKLQkJCS8vIChmYWNlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GSUxFKSkgewotCQkJLy8gKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GT1IpKSB7Ci0JCQkvLyAoZm9yICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRk9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GUkFNRSkpIHsKLQkJCS8vIChmcmFtZSAlVEZyYW1lOyAjSU1QTElFRCkKLQkJCS8vICVURnJhbWU7IGlzCi0JCQkvLyAodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1ZPSUQsIEFUVFJfVkFMVUVfQUJPVkUsIEFUVFJfVkFMVUVfQkVMT1csIEFUVFJfVkFMVUVfSFNJREVTLCBBVFRSX1ZBTFVFX0xIUywgQVRUUl9WQUxVRV9SSFMsIEFUVFJfVkFMVUVfVlNJREVTLCBBVFRSX1ZBTFVFX0JPWCwgQVRUUl9WQUxVRV9CT1JERVJ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GUkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRlJBTUVCT1JERVIpKSB7Ci0JCQkvLyAoZnJhbWVib3JkZXIgKDF8MCkgMSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfMSwgQVRUUl9WQUxVRV8wfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV8xKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRlJBTUVCT1JERVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQkJLy8gPDxEMjE1Njg0Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRlJBTUVTUEFDSU5HKSkgewotCQkJLy8gKGZyYW1lc3BhY2luZyBDREFUQTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZSQU1FU1BBQ0lORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJLy8gRDIxNTY4NAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFQURFUlMpKSB7Ci0JCQkvLyAoSEVBREVSUyBJRFJFRlM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLklEUkVGUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hFQURFUlMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFSUdIVCkpIHsKLQkJCS8vIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSEVJR0hULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ISURERU4pKSB7Ci0JCQkvLyAoaGlkZGVuIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ISURERU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hSRUYpKSB7Ci0JCQkvLyAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hSRUYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hSRUZMQU5HKSkgewotCQkJLy8gKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxBTkdVQUdFX0NPREUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IUkVGTEFORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFNQQUNFKSkgewotCQkJLy8gKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hUVFBfRVFVSVYpKSB7Ci0JCQkvLyAoaHR0cC1lcXVpdiBOQU1FICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IVFRQX0VRVUlWLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9JRCkpIHsKLQkJCS8vIChpZCBJRCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0lTTUFQKSkgewotCQkJLy8gKGlzbWFwIChpc21hcCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfSVNNQVB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9JU01BUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSVNUWUxFKSkgewotCQkJLy8gKGlzdHlsZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSVNUWUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MQUJFTCkpIHsKLQkJCS8vIChsYWJlbCAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBQkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MQU5HKSkgewotCQkJLy8gKGxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEFOR1VBR0VfQ09ERSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xBTkdVQUdFKSkgewotCQkJLy8gKGxhbmd1YWdlICVDREFUQTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBTkdVQUdFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MSU5LKSkgewotCQkJLy8gKGxpbmsgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xJTkssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xPTkdERVNDKSkgewotCQkJLy8gKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTE9OR0RFU0MsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xPT1ApKSB7Ci0JCQkvLyAobG9vcCBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTE9PUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFDUk8pKSB7Ci0JCQkvLyAobWFjcm8gQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BQ1JPLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVBGSUxFKSkgewotCQkJLy8gKG1hcGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVBGSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVJHSU5XSURUSCkpIHsKLQkJCS8vIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVJHSU5XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFSR0lOSEVJR0hUKSkgewotCQkJLy8gKG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVJHSU5IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BWExFTkdUSCkpIHsKLQkJCS8vIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFYTEVOR1RILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVlTQ1JJUFQpKSB7Ci0JCQkvLyAobWF5c2NyaXB0IChtYXlzY3JpcHQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01BWVNDUklQVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BWVNDUklQVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUVESUEpKSB7Ci0JCQkvLyAobWVkaWEgJU1lZGlhRGVzYzsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTUVESUFfREVTQyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01FRElBLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NRVRIT0QpKSB7Ci0JCQkvLyAobWV0aG9kIChHRVR8UE9TVCkgR0VUKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9HRVQsIEFUVFJfVkFMVUVfUE9TVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUVUSE9ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NVUxUSVBMRSkpIHsKLQkJCS8vIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01VTFRJUExFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTVVMVElQTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05BTUUpKSB7Ci0JCQkvLyAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9IUkVGKSkgewotCQkJLy8gKG5vaHJlZiAobm9ocmVmKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT0hSRUZ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT0hSRUYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05PUkVTSVpFKSkgewotCQkJLy8gKG5vcmVzaXplIChub3Jlc2l6ZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTk9SRVNJWkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1JFU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9TSEFERSkpIHsKLQkJCS8vIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1NIQURFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTk9TSEFERSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9XUkFQKSkgewotCQkJLy8gKG5vd3JhcCAobm93cmFwKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1dSQVB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1dSQVAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09CSkVDVCkpIHsKLQkJCS8vIChvYmplY3QgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfT0JKRUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT0JKRUNULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkJMVVIpKSB7Ci0JCQkvLyAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQkxVUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05DTElDSykpIHsKLQkJCS8vIChvbmNsaWNrICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ0xJQ0ssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OQ0hBTkdFKSkgewotCQkJLy8gKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ0hBTkdFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkRCTENMSUNLKSkgewotCQkJLy8gKG9uZGJsY2xpY2sgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05EQkxDTElDSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05GT0NVUykpIHsKLQkJCS8vIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09ORk9DVVMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OSEVMUCkpIHsKLQkJCS8vIChvbmhlbHAgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05IRUxQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTktFWVBSRVNTKSkgewotCQkJLy8gKG9ua2V5cHJlc3MgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05LRVlQUkVTUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05LRVlET1dOKSkgewotCQkJLy8gKG9ua2V5ZG93biAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTktFWURPV04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OS0VZVVApKSB7Ci0JCQkvLyAob25reWV1cCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTktFWVVQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkxPQUQpKSB7Ci0JCQkvLyAob25sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OTE9BRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRURPV04pKSB7Ci0JCQkvLyAob25tb3VzZWRvd24gJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRURPV04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTU9VU0VVUCkpIHsKLQkJCS8vIChvbm1vdXNldXAgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRVVQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTk1PVVNFT1ZFUikpIHsKLQkJCS8vIChvbm1vdXNlb3ZlciAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFT1ZFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRU1PVkUpKSB7Ci0JCQkvLyAob25tb3VzZW1vdmUgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRU1PVkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTU9VU0VPVVQpKSB7Ci0JCQkvLyAob25tb3VzZW91dCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFT1VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlJFU0VUKSkgewotCQkJLy8gKG9ucmVzZXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05SRVNFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05TRUxFQ1QpKSB7Ci0JCQkvLyAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TRUxFQ1QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OU1VCTUlUKSkgewotCQkJLy8gKG9uc3VibWl0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OU1VCTUlULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlVOTE9BRCkpIHsKLQkJCS8vIChvbnVubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlVOTE9BRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUEFMRVRURSkpIHsKLQkJCS8vIChwYWxldHRlIENEQVRBOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUEFMRVRURSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUEFORUwpKSB7Ci0JCQkvLyAocGFuZWwgQ0RBVEE7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QQU5FTCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUExBWUNPVU5UKSkgewotCQkJLy8gKHBsYXljb3VudCBOVU1CRVI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUExBWUNPVU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QUk9GSUxFKSkgewotCQkJLy8gKHByb2ZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QUk9GSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QUk9NUFQpKSB7Ci0JCQkvLyAocHJvbXB0ICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUFJPTVBULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SRUFET05MWSkpIHsKLQkJCS8vIChyZWFkb25seSAocmVhZG9ubHkpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1JFQURPTkxZfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVBRE9OTFksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JFUEVBVCkpIHsKLQkJCS8vIChyZXBlYXQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JFUEVBVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUkVMKSkgewotCQkJLy8gKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MSU5LX1RZUEVTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SRVYpKSB7Ci0JCQkvLyAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxJTktfVFlQRVMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SRVYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JPV1MpKSB7Ci0JCQkvLyAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUk9XUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUk9XU1BBTikpIHsKLQkJCS8vIChyb3dzcGFuIE5VTUJFUiAxKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV8xKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUk9XU1BBTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUlVMRVMpKSB7Ci0JCQkvLyAocnVsZXMgJVRSdWxlczsgI0lNUExJRUQpCi0JCQkvLyAlVFJ1bGVzOyBpcyAobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTk9ORSwgQVRUUl9WQUxVRV9HUk9VUFMsIEFUVFJfVkFMVUVfUk9XUywgQVRUUl9WQUxVRV9DT0xTLCBBVFRSX1ZBTFVFX0FMTH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JVTEVTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ0FMRSkpIHsKLQkJCS8vIChzY2FsZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NBTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDSEVNRSkpIHsKLQkJCS8vIChzY2hlbWUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDSEVNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0VMRUNURUQpKSB7Ci0JCQkvLyAoc2VsZWN0ZWQgKHNlbGVjdGVkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9TRUxFQ1RFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NFTEVDVEVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ09QRSkpIHsKLQkJCS8vIChTQ09QRSAlU2NvcGU7ICNJTVBMSUVEKQotCQkJLy8gJVNjb3BlOyBpcyAocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUk9XLCBBVFRSX1ZBTFVFX0NPTCwgQVRUUl9WQUxVRV9ST1dHUk9VUCwgQVRUUl9WQUxVRV9DT0xHUk9VUH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDT1BFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ1JPTExBTU9VTlQpKSB7Ci0JCQkvLyAoc2Nyb2xsYW1vdW50IE5VTUJFUiAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDUk9MTEFNT1VOVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0NST0xMREVMQVkpKSB7Ci0JCQkvLyAoc2Nyb2xsZGVsYXkgTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NST0xMREVMQVksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDUk9MTElORykpIHsKLQkJCS8vIChzY3JvbGxpbmcgKHllc3xub3xhdXRvKSBhdXRvKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9ZRVMsIEFUVFJfVkFMVUVfTk8sIEFUVFJfVkFMVUVfQVVUT307Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQVVUTyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDUk9MTElORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0hBUEUpKSB7Ci0JCQkvLyAoc2hhcGUgJVNoYXBlOyByZWN0KTogJVNoYXBlOyBpcyAocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUkVDVCwgQVRUUl9WQUxVRV9DSVJDTEUsIEFUVFJfVkFMVUVfUE9MWSwgQVRUUl9WQUxVRV9ERUZBVUxUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9SRUNUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0hBUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NIT1dDT05UUk9MUykpIHsKLQkJCS8vIChzaG93Y29udHJvbHMgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0hPV0NPTlRST0xTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TSVpFKSkgewotCQkJLy8gKHNpemUgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0laRUZNVCkpIHsKLQkJCS8vIChzaXplZm10IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSVpFRk1ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUEFOKSkgewotCQkJLy8gKHNwYW4gTlVNQkVSIDEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TUEFOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUkMpKSB7Ci0JCQkvLyAoc3JjICVVUkk7ICNJTVBMSUVEKQotCQkJLy8gTk9URTogInNyYyIgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiBzZXZlcmFsIGVsZW1lbnRzLgotCQkJLy8gVGhlIGRlZmluaXRpb24gb2YgSU1HIGlzIGRpZmZlcmVudCBmcm9tIG90aGVycy4KLQkJCS8vIFNvLCBpdCBzaG91bGQgYmUgbG9jYWxseSBkZWZpbmVkLgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TVEFSVCkpIHsKLQkJCS8vIChzdGFydCBOVU1CRVIgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TVEFSVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU1RBTkRCWSkpIHsKLQkJCS8vIChzdGFuZGJ5ICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1RBTkRCWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU1RZTEUpKSB7Ci0JCQkvLyAoc3R5bGUgJVN0eWxlU2hlZXQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNUWUxFX1NIRUVUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1RZTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NVTU1BUlkpKSB7Ci0JCQkvLyAoc3VtbWFyeSAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NVTU1BUlksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RBQklOREVYKSkgewotCQkJLy8gKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RBQklOREVYLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UQVJHRVQpKSB7Ci0JCQkvLyAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuRlJBTUVfVEFSR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVEFSR0VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9URVhUKSkgewotCQkJLy8gKHRleHQgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RFWFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RFWFRGT0NVUykpIHsKLQkJCS8vICh0ZXh0Zm9jdXMgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RFWFRGT0NVUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVElUTEUpKSB7Ci0JCQkvLyAodGl0bGUgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9USVRMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVElNRUZNVCkpIHsKLQkJCS8vICh0aW1lZm10IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9USU1FRk1ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UUlVFU1BFRUQpKSB7Ci0JCQkvLyAodHJ1ZXNwZWVkICh0cnVlc3BlZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1RSVUVTUEVFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RSVUVTUEVFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVFlQRSkpIHsKLQkJCS8vICh0eXBlICVDb3RlbnRUeXBlOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9VU0VNQVApKSB7Ci0JCQkvLyAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVVNFTUFQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQUxJR04pKSB7Ci0JCQkvLyAodmFsaWduICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9NSURETEUsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0JBU0VMSU5FfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQUxVRSkpIHsKLQkJCS8vICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBTFVFVFlQRSkpIHsKLQkJCS8vICh2YWx1ZXR5cGUgKERBVEF8UkVGfE9CSkVDVCkgREFUQSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfREFUQSwgQVRUUl9WQUxVRV9SRUYsIEFUVFJfVkFMVUVfT0JKRUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9EQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUVUWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQVIpKSB7Ci0JCQkvLyAodmFyIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZFUlNJT04pKSB7Ci0JCQkvLyAodmVyc2lvbiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247KQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCwgQVRUUl9WQUxVRV9WRVJTSU9OX1RSQU5TSVRJT05BTCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZFUlNJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLkZJWEVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZJUlRVQUwpKSB7Ci0JCQkvLyAodmlydHVhbCAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZJUlRVQUwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZMSU5LKSkgewotCQkJLy8gKHZsaW5rICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WTElOSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVk9MVU1FKSkgewotCQkJLy8gKHZvbHVtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVk9MVU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9XSURUSCkpIHsKLQkJCS8vICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVlNQQUNFKSkgewotCQkJLy8gKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQkJLy8gPDxEMjA1NTE0Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVE9QTUFSR0lOKSkgewotCQkJLy8gKHRvcG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UT1BNQVJHSU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JPVFRPTU1BUkdJTikpIHsKLQkJCS8vIChib3R0b21tYXJnaW4sIENEQVRBLCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9UVE9NTUFSR0lOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MRUZUTUFSR0lOKSkgewotCQkJLy8gKGxlZnRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTEVGVE1BUkdJTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUklHSFRNQVJHSU4pKSB7Ci0JCQkvLyAocmlnaHRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUklHSFRNQVJHSU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JPUkRFUkNPTE9SKSkgewotCQkJLy8gKGJvcmRlcmNvbG9yLCAlQ29sb3I7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTE9SKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9SREVSQ09MT1IsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCS8vIEQyMDU1MTQKLQotCQl9Ci0JCWVsc2UgewotCQkJLy8gdW5rbm93biBhdHRyaWJ1dGU7IG1heWJlIGVycm9yLgotCQkJLy8gc2hvdWxkIHdhcm4uCi0JCQlhdHRyID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGlnbiBhdHRyaWJ1dGUgd2hpY2ggaGFzICVDQWxpZ247IGFzIHZhbHVlcy4uIEF0IHRoaXMgdGltZQotCSAqICg0LzE5LzIwMDEpLCBpdCBpcyBpZGVudGljYWwgdG8gJUxBbGlnbjsuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9yQ2FwdGlvbigpIHsKLQkJLy8gYWxpZ24gKGxvY2FsKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGlnbiBhdHRyaWJ1dGUgd2hpY2ggaGFzICVJQWxpZ247IGFzIHZhbHVlcy4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9ySW1hZ2UoKSB7Ci0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXMKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX01JRERMRSwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsaWduIGF0dHJpYnV0ZSB3aGljaCBoYXMgJUxBbGlnbjsgYXMgdmFsdWVzLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JMZWdlbmQoKSB7Ci0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXMKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uIGZvciA8Y29kZT5hbGlnbjwvY29kZT4gaW4gc2V2ZXJhbAotCSAqIGVsZW1lbnRzLCBsaWtlIDxjb2RlPlA8L2NvZGU+LCA8Y29kZT5ESVY8L2NvZGU+LiBUaGUgdmFsdWVzIGFyZQotCSAqIGRpZmZlcmVudCBmcm9tIGF0dHJpYnV0ZXMgdGhvc2UgaGF2ZSB0aGUgc2FtZSBuYW1lIGluIG90aGVyIGVsZW1lbnRzICg8Y29kZT5JTUc8L2NvZGU+Ci0JICogYW5kIDxjb2RlPlRBQkxFPC9jb2RlPikuIFNvLCBpdCBjYW4ndCB0cmVhdCBhcyBnbG9iYWwgYXR0cmlidXRlcy4KLQkgKiA8c3Ryb25nPk5PVEU6IFRoZXNlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBoYXMgbm8gb3duZXIgQ01Eb2N1bWVudAotCSAqIGluc3RhbmNlLjwvc3Ryb25nPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpIHsKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXM6IGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9DRU5URVIsIEFUVFJfVkFMVUVfUklHSFQsIEFUVFJfVkFMVUVfSlVTVElGWX07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVhdHRyczsgZGVjbGFyYXRpb25zLiAlYXR0cnM7IGNvbnNpc3RzIG9mICVjb3JlYXR0cnM7LCAlaTE4biwgYW5kCi0JICogJWV2ZW50czsuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0QXR0cnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQkvLyAlY29yZWF0dHJzOwotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQ09SRSkuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCQkvLyAlaTE4bjsKLQkJbmFtZXMgPSBBcnJheXMuYXNMaXN0KEkxOE4pLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQkJLy8gJWV2ZW50czsKLQkJbmFtZXMgPSBBcnJheXMuYXNMaXN0KEVWRU5UUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlYm9keWNvbG9yczsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEJvZHljb2xvcnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQk9EWUNPTE9SUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlY2VsbGhhbGlnbjsgZGVjbGFyYXRpb25zLiAlY2VsbGhhbGlnaDsgY29uc2lzdHMgb2Y6IC0gKGFsaWduCi0JICogKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQpIC0gKGNoYXIgJUNoYXJhY3RlcjsKLQkgKiAjSU1QTElFRCkgLSAoY2hhcm9mZiAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDZWxsaGFsaWduKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQkJLy8gKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5fGNoYXIpICNJTVBMSUVEKSBzaG91bGQgYmUgZGVmaW5lZAotCQkvLyBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0NFTlRFUiwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9KVVNUSUZZLCBBVFRSX1ZBTFVFX0NIQVJ9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChDRUxMSEFMSUdOKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVjZWxsdmFsaWduOyBkZWNsYXJhdGlvbnMuICVjZWxsaGFsaWdoOyBpczogLSAodmFsaWduCi0JICogKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDZWxsdmFsaWduKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGRlYyA9IGdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMSUdOKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTElHTiwgZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWNvcmVhdHRyczsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldENvcmUoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQ09SRSkuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIGdsb2JhbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJQ01Ob2RlIGNtbm9kZSA9IGdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCWlmIChjbW5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCi0JCUhUTUxBdHRyRGVjbEltcGwgZGVjID0gY3JlYXRlKGF0dHJOYW1lKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJcHV0TmFtZWRJdGVtKGF0dHJOYW1lLCBkZWMpOwotCi0JCXJldHVybiBkZWM7Ci0JfQotCi0JLyoqCi0JICogR2V0IGRlY2xhcmF0aW9ucyB3aGljaCBhcmUgc3BlY2lmaWVkIGJ5IG5hbWVzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lcwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RGVjbGFyYXRpb25zKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQkJCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBkZWMgPSBnZXREZWNsYXJhdGlvbihhdHRyTmFtZSk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShhdHRyTmFtZSwgZGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCAlZXZlbnRzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RXZlbnRzKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQkJSXRlcmF0b3IgbmFtZXMgPSBBcnJheXMuYXNMaXN0KEVWRU5UUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlaTE4bjsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEkxOG4oQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoSTE4TikuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTczYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLQotCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgQ01Db250ZW50IGZvciBIVE1MIENNLgotICovCi1hYnN0cmFjdCBjbGFzcyBDTUNvbnRlbnRJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNQ29udGVudCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJPVU5ERUQgPSAtMTsKLQkvKiogIC0xOiBpdCdzIFVOQk9VTkRFRC4gKi8KLQlwcml2YXRlIGludCBtYXhPY2N1ciA9IFVOQk9VTkRFRDsKLQkvKiogIDA6IGl0J3MgT1BUSU9OQUwsIDEsIGl0J3MgUkVRVUlSRUQuICovCi0JcHJpdmF0ZSBpbnQgbWluT2NjdXIgPSAwOwotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgY29uc3R1cmN0b3IuCi0JICogVXNlIHRoaXMgb25lIGZvciB1c3VhbCBjYXNlcy48YnI+Ci0JICovCi0JcHVibGljIENNQ29udGVudEltcGwoU3RyaW5nIG5hbWUsIGludCBtaW4sIGludCBtYXgpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCW1pbk9jY3VyID0gbWluOwotCQltYXhPY2N1ciA9IG1heDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBtYXhPY2N1cjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNaW5PY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgMCwgaXQncyBPUFRJT05BTC4KLQkgKiBJZiAxLCBpdCdzIFJFUVVJUkVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCXJldHVybiBtaW5PY2N1cjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMDhjNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLS8qKgotICovCi1jbGFzcyBDTUdyb3VwSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUdyb3VwIHsKLQotCXByaXZhdGUgaW50IG9wZXJhdG9yID0gQ01Hcm91cC5TRVFVRU5DRTsKLQlwcml2YXRlIENNTm9kZUxpc3RJbXBsIGNoaWxkcmVuID0gbnVsbDsKLQotCS8qKgotCSAqIENNR3JvdXBJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNR3JvdXBJbXBsKGludCBvcCwgaW50IG1pbk9jY3VyLCBpbnQgbWF4T2NjdXIpIHsKLQkJc3VwZXIobnVsbCwgbWluT2NjdXIsIG1heE9jY3VyKTsKLQkJc3dpdGNoIChvcCkgewotCQkJY2FzZSBDTUdyb3VwLkFMTCA6Ci0JCQljYXNlIENNR3JvdXAuQ0hPSUNFIDoKLQkJCWNhc2UgQ01Hcm91cC5TRVFVRU5DRSA6Ci0JCQkJb3BlcmF0b3IgPSBvcDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCB3YXJuLgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgYXBwZW5kQ2hpbGQoQ01Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJY2hpbGRyZW4gPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQkJcmV0dXJuIGNoaWxkcmVuLmFwcGVuZE5vZGUoY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0Ci0JICovCi0JcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogRUxFTUVOVF9ERUNMQVJBVElPTiwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBHUk9VUCwgRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuR1JPVVA7Ci0JfQotCi0JLyoqCi0JICogZ2V0T3BlcmF0aW9uIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0JICovCi0JcHVibGljIGludCBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIG9wZXJhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGE1ZTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDTU5hbWVkTm9kZU1hcCBpbnRlcmZhY2UuIFRoaXMgY2xhc3MgaXMgaW50ZW50ZWQKLSAqIHRvIGJlIHVzZWQgYXMgYSBjb250YWluZXIgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4gSWYgc29tZW9uZSB3YW50cyB0bwotICogdXNlIHRoaXMgY2xhc3MgZm9yIG90aGVyIHB1cnBvc2UsIGhlIG11c3QgcGF5IGF0dGVudGlvbiB0byB0aGUgZmFjdCB0aGF0Ci0gKiB0aGlzIGNsYXNzIGlzIHRvbGVyYW50IG9mIHRoZSBrZXkgbmFtZSBjYXNlLiBUaGF0IGlzLCB0aGlzIGNsYXNzIGRvZXMgbm90Ci0gKiBkaXN0aW5ndWlzaCAibmFtZSIsICJOQU1FIiwgYW5kICJOYW1lIiBhcyBhIGtleSBuYW1lLgotICovCi1jbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSBpdGVtcyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKCkgewotCQlzdXBlcigpOwotCQlpdGVtcyA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGl0ZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHVua25vd24ga2V5cy4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBjb29rZWROYW1lID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZSk7Ci0JCWlmICghaXRlbXMuY29udGFpbnNLZXkoY29va2VkTmFtZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTU5vZGUpIGl0ZW1zLmdldChjb29rZWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNNTm9kZSBub2RlID0gKENNTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoLS1pbmRleCA8IDApCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBpdGVtcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByYXdGb3JtCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZUNhbm9uaWNhbEZvcm0oU3RyaW5nIHJhdykgewotCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE1MgotCQkvLyB3ZSBhcmUgYWJsZSB0byAiY2hlYXQiIGhlcmUgYSBsaXR0bGUgYW5kIHVzZSBVUyBMb2NhbGUKLQkJLy8gdG8gZ2V0IGEgZ29vZCBjb25vbmljYWwgZm9ybSwgc2luY2Ugd2UgYXJlIHVzaW5nIHRoaXMgb25seQotCQkvLyBmb3IgSFRNTCBhbmQgSlNQIHN0YW5kYXJkIHRhZ3MuCi0JCS8vIExvbmcgdGVybSwgZm9yIHNpbWlsYXIgbmVlZHMgd2l0aCBYTUwgMS4xIChmb3IgZXhhbXBsZSkKLQkJLy8gd2Ugc2hvdWxkIHVzZSBhIGNsYXNzIHN1Y2ggYXMgY29tLmlibS5pY3UudGV4dC5Ob3JtYWxpemVyCi0JCXJldHVybiByYXcudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGl0ZW0KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHB1dE5hbWVkSXRlbShTdHJpbmcgbmFtZSwgQ01Ob2RlIGl0ZW0pIHsKLQkJU3RyaW5nIGNvb2tlZE5hbWUgPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lKTsKLQkJaWYgKGl0ZW1zLmNvbnRhaW5zS2V5KGNvb2tlZE5hbWUpKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JCWl0ZW1zLnB1dChjb29rZWROYW1lLCBpdGVtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVzcGFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmNzM3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ01OYW1lc3BhY2UgaW1wbGVtZW50YXRpb24uCi0gKi8KLWNsYXNzIENNTmFtZXNwYWNlSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTU5hbWVzcGFjZSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotCS8qKgotCSAqIENNTmFtZXNwYWNlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZUltcGwoU3RyaW5nIHVyaSwgU3RyaW5nIHBmeCkgewotCQlzdXBlcih1cmkpOwotCQlwcmVmaXggPSBwZng7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuTkFNRV9TUEFDRTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcmVmaXggbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0VVJJIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjZlYjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTU5vZGUgewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5vZGVJbXBsKFN0cmluZyBubSkgewotCQlzdXBlcigpOwotCQluYW1lID0gbm07Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogQHJldHVybiBib29sZWFuCi0JICoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNTm9kZSBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGJmMjFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLS8qKgotICogQW5hbG9nIG9mIGRvbS5Ob2RlTGlzdCBmb3IgQ00uCi0gKiBTbywgdGhlIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgc2ltaWxhciB0bwotICogTm9kZUxpc3RJbXBsPGJyPgotICovCi1jbGFzcyBDTU5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIENNTm9kZUxpc3QgewotCi0JcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIG5vZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIENNTm9kZUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCQlub2RlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBhcHBlbmROb2RlKENNTm9kZSBub2RlKSB7Ci0JCW5vZGVzLmFkZEVsZW1lbnQobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTm9kZSkgbm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db21wbGV4VHlwZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkYmE3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0gKiBpbiBYTUwgU2NoZW1hLjxicj4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCXByb3RlY3RlZCBDTUdyb3VwSW1wbCBjb250ZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb21wbGV4VHlwZURlZmluaXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29tcGxleFR5cGVEZWZpbml0aW9uKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbGxlY3Rpb24gPSBlbGVtZW50Q29sbGVjdGlvbjsKLQkJY3JlYXRlQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhY3R1YWwgY29udGVudCBtb2RlbC4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYW5kIG9ubHkgb25jZSBpbiB0aGUgY29uc3RydWN0b3IuPGJyPgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwCi0JICovCi0JcHVibGljIENNR3JvdXAgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JLyogTk9URTogRG8gd2UgbmVlZCBMT0dJQ0FMIHR5cGU/Ci0JICogLS0gMy83LzIwMDEKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldENvbnRlbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCBoaW50LgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldFByaW1hcnlDYW5kaWRhdGUoKSB7Ci0JCWlmIChwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0ocHJpbWFyeUNhbmRpZGF0ZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlTmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzOGQ1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEZhY3Rvcnkgb2YgQ29tcGxleFR5cGVEZWZpbml0aW9uLgotICovCi1maW5hbCBjbGFzcyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBkZWZpbml0aW9ucyA9IG51bGw7Ci0JLy8gY29uc3RhbnRzIGZvciBjb21wbGV4IHR5cGUgbmFtZQotCS8qKiBmb3IgQUREUkVTUy4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9BRERSRVNTID0gIkNUWVBFX0FERFJFU1MiOy8vJE5PTi1OTFMtMSQKLQkvKiogQ0RBVEEgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNodWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfQ0RBVEEgPSAiQ1RZUEVfQ0RBVEEiOy8vJE5PTi1OTFMtMSQKLQkvKiogY29sIGdyb3VwIGNvbnRlbnQuIENPTCogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9DT0xVTU5fR1JPVVAgPSAiQ1RZUEVfQ09MVU1OX0dST1VQIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBETC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9ERUZJTklUSU9OX0xJU1QgPSAiQ1RZUEVfREVGSU5JVElPTl9MSVNUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBFTUJFRC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9FTUJFRCA9ICJDVFlQRV9FTUJFRCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBlbXB0eSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2hvdWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRU1QVFkgPSAiQ1RZUEVfRU1QVFkiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEZJRUxEU0VULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZJRUxEU0VUID0gIkNUWVBFX0ZJRUxEU0VUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBGUkFNRVNFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GUkFNRVNFVCA9ICJDVFlQRV9GUkFNRVNFVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmbG93IGNvbnRlbnQuICglZmxvdzspKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZMT1dfQ09OVEFJTkVSID0gIkNUWVBFX0ZMT1dfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGh0bWwgY29udGVudC4gSEVBRCwgKEZSQU1FU0VUfEJPRFkpICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSFRNTCA9ICJDVFlQRV9IVE1MIjsvLyROT04tTkxTLTEkCi0JLyoqIGhlYWQgY29udGVudC4gVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/ICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSEVBRCA9ICJDVFlQRV9IRUFEIjsvLyROT04tTkxTLTEkCi0JLyoqIGlubGluZSBjb250ZW50LiAoJWlubGluZTspKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0lOTElORV9DT05UQUlORVIgPSAiQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBsaXN0IGl0ZW0gY29udGFpbmVyLiAoTEkpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0xJX0NPTlRBSU5FUiA9ICJDVFlQRV9MSV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIE1BUC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9NQVAgPSAiQ1RZUEVfTUFQIjsvLyROT04tTkxTLTEkCi0JLyoqIG5vZnJhbWVzIGNvbnRlbnQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCA9ICJDVFlQRV9OT0ZSQU1FU19DT05URU5UIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBPUFRHUk9VUC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9PUFRJT05fQ09OVEFJTkVSID0gIkNUWVBFX09QVElPTl9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogcGFyYW0gY29udGFpbmVyLiBGb3IgT0JKRUNUL0FQUExFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9QQVJBTV9DT05UQUlORVIgPSAiQ1RZUEVfUEFSQU1fQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIFBDREFUQSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2h1bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9QQ0RBVEEgPSAiQ1RZUEVfUENEQVRBIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBTRUxFQ1QuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfU0VMRUNUID0gIkNUWVBFX1NFTEVDVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSBjb250ZW50LiBDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RBQkxFID0gIkNUWVBFX1RBQkxFIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIGNlbGwgY29udGFpZXIuIChUSHxURCkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVENFTExfQ09OVEFJTkVSID0gIkNUWVBFX1RDRUxMX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSByZWNvcmQgY29udGFpbmVyLiAoVFIpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RSX0NPTlRBSU5FUiA9ICJDVFlQRV9UUl9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCWRlZmluaXRpb25zID0gbmV3IGphdmEudXRpbC5IYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCBmb3IgQ29tcGxleFR5cGVEZWZpbml0aW9uLgotCSAqIEVhY2ggaW5zdGFuY2UgY3JlYXRlZCBpbiB0aGlzIG1ldGhvZCBtdXN0IGJlIHJlZ2lzdGVyZWQgaW50bwotCSAqIHRoZSBtYXAgd2l0aCBpdHMgbmFtZS4KLQkgKiBAcGFyYW0gZGVmaW5pdGlvbk5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlVHlwZURlZmluaXRpb24oU3RyaW5nIGRlZmluaXRpb25OYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlpZiAoZGVmaW5pdGlvbnMuY29udGFpbnNLZXkoZGVmaW5pdGlvbk5hbWUpKSB7Ci0JCQlyZXR1cm4gKENvbXBsZXhUeXBlRGVmaW5pdGlvbikgZGVmaW5pdGlvbnMuZ2V0KGRlZmluaXRpb25OYW1lKTsKLQkJfQotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBudWxsOwotCQlpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfQUREUkVTUykgewotCQkJZGVmID0gbmV3IEN0ZEFkZHJlc3MoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfQ09MVU1OX0dST1VQKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkQ29sdW1uR3JvdXAoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfREVGSU5JVElPTl9MSVNUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRGwoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfRU1CRUQpIHsKLQkJCWRlZiA9IG5ldyBDdGRFbWJlZChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9GSUVMRFNFVCkgewotCQkJZGVmID0gbmV3IEN0ZEZpZWxkc2V0KGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZMT1dfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRmxvd0NvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9GUkFNRVNFVCkgewotCQkJZGVmID0gbmV3IEN0ZEZyYW1lc2V0KGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0hFQUQpIHsKLQkJCWRlZiA9IG5ldyBDdGRIZWFkKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0hUTUwpIHsKLQkJCWRlZiA9IG5ldyBDdGRIdG1sKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0lOTElORV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRJbmxpbmVDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfTElfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkTGlDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfTUFQKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkTWFwKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX05PRlJBTUVTX0NPTlRFTlQpIHsKLQkJCWRlZiA9IG5ldyBDdGROb2ZyYW1lc0NvbnRlbnQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZE9wdGlvbkNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9QQVJBTV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRQYXJhbUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9TRUxFQ1QpIHsKLQkJCWRlZiA9IG5ldyBDdGRTZWxlY3QoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfVEFCTEUpIHsKLQkJCWRlZiA9IG5ldyBDdGRUYWJsZShlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9UQ0VMTF9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRUYWJsZUNlbGxDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfVFJfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkVHJDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSB7Ci0JCQlkZWYgPSBudWxsOwotCQl9Ci0JCWlmIChkZWYgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZS4KLQkJZGVmaW5pdGlvbnMucHV0KGRlZmluaXRpb25OYW1lLCBkZWYpOwotCQlyZXR1cm4gZGVmOwotCX0KLQotCS8qKgotCSAqIEZvciBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQWRkcmVzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODQ3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRBZGRyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIEFERFJFU1MuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEFkZHJlc3MgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZEFkZHJlc3MoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICgoJWlubGluZSkgfCBQKSouCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKgotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vICglaW5saW5lKQotCQlDTUdyb3VwSW1wbCBpbmxpbmVzID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJaWYgKGlubGluZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29sbGVjdGlvbi5nZXRJbmxpbmUoaW5saW5lcyk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoaW5saW5lcyk7Ci0JCS8vIFAKLQkJQ01Ob2RlIHAgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCk7Ci0JCWlmIChwICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKHApOwotCX0KLQotCS8qKgotCSAqICgoJWlubGluZSkgfCBQKSouCi0JICogQmVjYXVzZSAlaW5saW5lOyBjb250YWlucyAjUENEQVRBLCB0aGUgdHlwZSBpcyBNSVhFRC4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQUREUkVTUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZENvbHVtbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZENvbHVtbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMzM5OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRDb2x1bW5Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENPTCBncm91cC4KLSAqIChDT0wpKgotICovCi1maW5hbCBjbGFzcyBDdGRDb2x1bW5Hcm91cCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkQ29sdW1uR3JvdXAoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIChDT0wpKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkqCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBDT0wKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0wpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKENPTCkqCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9DT0xVTU5fR1JPVVA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGREbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGREbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjZlYjhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgREwuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZERsIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGREbChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gRFQKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gREQKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfREVGSU5JVElPTl9MSVNUOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRW1iZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRW1iZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1ZTcyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEVtYmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIEVNQkVELgotICovCi1maW5hbCBjbGFzcyBDdGRFbWJlZCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkRW1iZWQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0VNQkVEOwotCX0KLQotCS8qKgotCSAqIChOT0VNQkVEKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCS8vIE5PRU1CRUQKLQkJQ01Ob2RlIG5vZW1iZWQgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9FTUJFRCk7Ci0JCWlmIChub2VtYmVkICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKG5vZW1iZWQpOwotCX0KLQotCS8qKgotCSAqIChOT0VNQkVEKS4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTUJFRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZpZWxkc2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZpZWxkc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjJkZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGaWVsZHNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBGSUVMRFNFVC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRmllbGRzZXQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZEZpZWxkc2V0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEVHRU5EOwotCX0KLQotCS8qKgotCSAqICgjUENEQVRBLCBMRUdFTkQsICglZmxvdzspKikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCAsICwgKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkvLyAjUENEQVRBCi0JCS8vIC4uLj8/Ci0KLQkJLy8gTEVHRU5ECi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEVHRU5EKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyAoJWZsb3c7KSoKLQkJQ01Hcm91cEltcGwgZmxvd3MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKGZsb3dzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0RmxvdyhmbG93cyk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZmxvd3MpOwotCX0KLQotCS8qKgotCSAqICgjUENEQVRBLCBMRUdFTkQsICglZmxvdzspKikKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRklFTERTRVQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGbG93Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZsb3dDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3YTA4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZsb3dDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgY29udGFpbmVycyBvZiA8Y29kZT4lZmxvdzs8L2NvZGU+LgotICovCi1maW5hbCBjbGFzcyBDdGRGbG93Q29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRGbG93Q29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoJWZsb3c7KSoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldEZsb3coY29udGVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZMT1dfQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRnJhbWVzZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRnJhbWVzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkYTRiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZyYW1lc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIEZSQU1FU0VULgotICogKChGUkFNRVNFVCB8IEZSQU1FKSsgJiBOT0ZSQU1FUz8pCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEZyYW1lc2V0IGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRGcmFtZXNldChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FOwotCX0KLQotCS8qKgotCSAqICgoRlJBTUVTRVQgfCBGUkFNRSkrICYgTk9GUkFNRVM/KS4KLQkgKiAtLT4gKChGUkFNRVNFVCB8IEZSQU1FKSsgJiAoTk9GUkFNRVMpPykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCAmICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkFMTCwgMSwgMSk7Ci0KLQkJLy8gKCB8ICkrCi0JCUNNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBGUkFNRVNFVAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VUKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gRlJBTUUKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQotCQkvLyAoICk/Ci0JCWdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIDEpOwotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZChncm91cCk7Ci0KLQkJLy8gTk9GUkFNRVMKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRlJBTUVTKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoKEZSQU1FU0VUIHwgRlJBTUUpKyAmIE5PRlJBTUVTPykKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZSQU1FU0VUOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSGVhZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YmMyNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIGhlYWQgY29udGVudC4KLSAqIENvbnRlbnQgTW9kZWw6IChUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8pCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEhlYWQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEhlYWQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRTsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgSEVBRC4KLQkgKiBUbyBhdm9pZCB1c2luZyBpbmNsdXNpb24sIHRoZSBjb250ZW50IG1vZGVsIGNvbWVzIGZyb20gdGhlIFhIVE1MIDEuMC4KLQkgKgotCSAqICglaGVhZC5taXNjOywgKCh0aXRsZSwgJWhlYWQubWlzYzssIChiYXNlLCAlaGVhZC5taXNjOyk/KSB8IChiYXNlLCAlaGVhZC5taXNjOywgKHRpdGxlLCAlaGVhZC5taXNjOykpKSkKLQkgKiBBbmQgJWhlYWQubWlzYzsgaXM6Ci0JICogKHNjcmlwdHxzdHlsZXxtZXRhfGxpbmt8b2JqZWN0fGlzaW5kZXgpKgotCSAqCi0JICogMDogKCVoZWFkLm1pc2MsIEEpCi0JICogQTogKEIgfCBDKQotCSAqIEI6ICh0aXRsZSwgJWhlYWQubWlzYzssIEQpCi0JICogQzogKGJhc2UsICVoZWFkLm1pc2M7LCBFKQotCSAqIEQ6IChiYXNlLCAlaGVhZC5taXNjOyk/Ci0JICogRTogKHRpdGxlLCAlaGVhZC5taXNjOykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gQXQgMXN0LCBjcmVhdGUgJWhlYWQubWlzYzsgY29udGVudC4KLQkJLy8gJWhlYWQubWlzYzsKLQkJLy8gICAoIHwgKSoKLQkJQ01Hcm91cEltcGwgbWlzYyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAobWlzYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9CSkVDVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVh9OwotCQljb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhtaXNjLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJLy8gMm5kLCBnZXQgYSB0aXRsZQotCQlDTU5vZGUgdGl0bGUgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUpOwotCQkvLyAzcmQsIGdldCBhIGJhc2UKLQkJQ01Ob2RlIGJhc2UgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSk7Ci0JCWlmICh0aXRsZSA9PSBudWxsIHx8IGJhc2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUb3AgbGV2ZWwgY29udGVudCBpcyBhIHNlcXVlbmNlIG9mICVoZWFkLm1pc2M7IGFuZCBBLgotCQkvLyAwOiAoJWhlYWQubWlzYzssIEEpCi0JCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsKLQkJY29udGVudC5hcHBlbmRDaGlsZChtaXNjKTsKLQkJLy8gICBjcmVhdGUgQSBhbmQgYXBwZW5kIGl0IHRvIHRoZSB0b3AgbGV2ZWwuCi0JCXsKLQkJCS8vIEEgaXMgYSBjaG9pY2Ugb2YgQiBhbmQgQy4KLQkJCS8vIEE6IChCIHwgQykKLQkJCS8vICAgY3JlYXRlIGEgY2hvaWNlCi0JCQlDTUdyb3VwSW1wbCBnQSA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCQlpZiAoZ0EgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkvLyAgIGFwcGVuZCBBIHRvIHRoZSB0b3AgbGV2ZWwuCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGdBKTsKLQotCQkJLy8gY3JlYXRlIEIgYW5kIGFwcGVuZCBpdCB0byBBCi0JCQl7Ci0JCQkJLy8gQiBpcyBhIHNlcXVlbmNlIG9mIHRpdGxlLCAlaGVhZC5taXNjOywgYW5kIEQuCi0JCQkJLy8gQjogKHRpdGxlLCAlaGVhZC5taXNjOywgRCkKLQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJQ01Hcm91cEltcGwgZ0IgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJaWYgKGdCID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkvLyAgIGFwcGVuZCBCIHRvIEEuCi0JCQkJZ0EuYXBwZW5kQ2hpbGQoZ0IpOwotCi0JCQkJLy8gICBhcHBlbmQgdGl0bGUgdG8gQgotCQkJCWdCLmFwcGVuZENoaWxkKHRpdGxlKTsKLQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBCCi0JCQkJZ0IuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJLy8gICBjcmVhdGUgRCBhbmQgYXBwZW5kIGl0IHRvIEIuCi0JCQkJewotCQkJCQkvLyBEIGlzIGEgc2VxdWVuY2Ugb2YgYmFzZSwgJWhlYWQubWlzYzsuCi0JCQkJCS8vIEQ6IChiYXNlLCAlaGVhZC5taXNjOyk/Ci0JCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQkJQ01Hcm91cEltcGwgZ0QgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCQkJCWlmIChnRCA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQkvLyAgIGFwcGVuZCBEIHRvIEIuCi0JCQkJCWdCLmFwcGVuZENoaWxkKGdEKTsKLQotCQkJCQkvLyAgIGFwcGVuZCBiYXNlIHRvIEQKLQkJCQkJZ0QuYXBwZW5kQ2hpbGQoYmFzZSk7Ci0JCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEQuCi0JCQkJCWdELmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNyZWF0ZSBDIGFuZCBhcHBlbmQgaXQgdG8gQQotCQkJewotCQkJCS8vIEMgaXMgYSBzZXF1ZW5jZSBvZiBiYXNlLCAlaGVhZC5taXNjOywgYW5kIEUKLQkJCQkvLyBDOiAoYmFzZSwgJWhlYWQubWlzYzssIEUpCi0JCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCUNNR3JvdXBJbXBsIGdDID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCWlmIChnQyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gICBhcHBlbmQgQyB0byBBLgotCQkJCWdBLmFwcGVuZENoaWxkKGdDKTsKLQotCQkJCS8vICAgYXBwZW5kIGJhc2UgdG8gQwotCQkJCWdDLmFwcGVuZENoaWxkKGJhc2UpOwotCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEMKLQkJCQlnQy5hcHBlbmRDaGlsZChtaXNjKTsKLQotCQkJCS8vICAgY3JlYXRlIEUgYW5kIGFwcGVuZCBpdCB0byBDLgotCQkJCXsKLQkJCQkJLy8gRSBpcyBhIHNlcXVlbmNlIG9mIHRpdGxlIGFuZCAlaGVhZC5taXNjOy4KLQkJCQkJLy8gRTogKHRpdGxlLCAlaGVhZC5taXNjOykKLQkJCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCQlDTUdyb3VwSW1wbCBnRSA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQkJaWYgKGdFID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vICAgYXBwZW5kIEUgdG8gQy4KLQkJCQkJZ0MuYXBwZW5kQ2hpbGQoZ0UpOwotCi0JCQkJCS8vICAgYXBwZW5kIHRpdGxlIHRvIEUKLQkJCQkJZ0UuYXBwZW5kQ2hpbGQodGl0bGUpOwotCQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBFLgotCQkJCQlnRS5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50IGNvbnRlbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IRUFEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSHRtbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIdG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMzk2ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIdG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgPGNvZGU+SFRNTDwvY29kZT4uPGJyPgotICogQ29udGVudCBNb2RlbDoKLSAqIEhFQUQsIChGUkFNRVNFVHxCT0RZKTxicj4KLSAqLwotZmluYWwgY2xhc3MgQ3RkSHRtbCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ3RkSHRtbChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQ7Ci0JfQotCi0JLyoqCi0JICogKCVodG1sLmNvbnRlbnQ7KS4KLQkgKiAlaHRtbC5jb250ZW50OyBpcyBIRUFELCAoRlJBTUVTRVQgfCBCT0RZKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gSEVBRAotCQlDTU5vZGUgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkJLy8gKCB8ICkKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBGUkFNRVNFVCwgQk9EWQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIHNpbmNlIEJPRFkgc3RhcnQgYW5kIGVuZCBhcmUgb21pc3NhYmxlCi0JCS8vIGFkZGluZyB2YWxpZCBjaGlsZHJlbiBvZiBCT0RZIGhlcmUgdW5kZXIgSFRNTAotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTczNDIKLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NQVApOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkRPKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlBVVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkkpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEFCRUwpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg2KTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0VGT05UKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFTEVDVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RSSUtFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFCQlIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJJRyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDEpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUNST05ZTSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVMKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FUyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUEpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT05UKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1QpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLktCRCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSUZSQU1FKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0FNUCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5TKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1VQKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERk4pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5WQVIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZJRUxEU0VUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkJZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUFBMRVQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TTUFMTCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0lURSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0RFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TUEFOKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVUIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVNKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BRERSRVNTKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFJPTkcpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50IGNvbnRlbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSFRNTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZElubGluZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRJbmxpbmVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiZmVhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZElubGluZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciAoJWlubGluZTspKi4KLSAqLwotZmluYWwgY2xhc3MgQ3RkSW5saW5lQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRJbmxpbmVDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICglaW5saW5lKSouCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJY29sbGVjdGlvbi5nZXRJbmxpbmUoY29udGVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRMaUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRMaUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2NiMDc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTGlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBMaXN0IGl0ZW0gY29udGFpbmVyLgotICogKExJKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkTGlDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbkNvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTGlDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSTsKLQl9Ci0KLQkvKioKLQkgKiAoTEkpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKExJKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCUNNTm9kZSBsaSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSk7Ci0JCWlmIChsaSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChsaSk7Ci0JfQotCi0JLyoqCi0JICogRUxFTUVOVCBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE1hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmMmExNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBNQVAuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZE1hcCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTWFwKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVJFQTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVibG9jazspIHwgQVJFQSkrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyAoJWJsb2NrOykKLQkJQ01Hcm91cEltcGwgYmxvY2tzID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJaWYgKGJsb2NrcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldEJsb2NrKGJsb2Nrcyk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoYmxvY2tzKTsKLQkJLy8gQVJFQQotCQlDTU5vZGUgYXJlYSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUkVBKTsKLQkJaWYgKGFyZWEgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoYXJlYSk7Ci0JfQotCi0JLyoqCi0JICogKCglYmxvY2s7KSB8IEFSRUEpKy4KLQkgKiBCZWNhdXNlICVibG9jazsgY29uc2lzdHMgb2YgZWxlbWVudHMgb25seSwgdGhlIHR5cGUgaXMgRUxFTUVOVC4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9NQVA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGROb2ZyYW1lc0NvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTm9mcmFtZXNDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTNhNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGROb2ZyYW1lc0NvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgTk9GUkFNRVMuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZE5vZnJhbWVzQ29udGVudCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTm9mcmFtZXNDb250ZW50KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWTsKLQl9Ci0KLQkvKioKLQkgKiAoQk9EWSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkvLyBCT0RZCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoQk9EWSkKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9OT0ZSQU1FU19DT05URU5UOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTM0ODBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogT1BUSU9OIGNvbnRhaW5lci4KLSAqIChPUFRJT04pKwotICovCi1maW5hbCBjbGFzcyBDdGRPcHRpb25Db250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZE9wdGlvbkNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX09QVElPTl9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRQYXJhbUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRQYXJhbUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzMyMTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkUGFyYW1Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBQQVJBTSBjb250YWluZXIuICBGb3IgT0JKRUNUIGFuZCBBUFBMRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFBhcmFtQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRQYXJhbUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKFBBUkFNIHwgJWZsb3c7KSouCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKgotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIFBBUkFNCi0JCUNNTm9kZSBwYXJhbSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSk7Ci0JCWlmIChwYXJhbSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChwYXJhbSk7Ci0JCS8vICVmbG93OwotCQlDTUdyb3VwSW1wbCBmbG93cyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChmbG93cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldElubGluZShmbG93cyk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZmxvd3MpOwotCX0KLQotCS8qKgotCSAqIChQQVJBTSB8ICVmbG93OykqLgotCSAqIEJlY2F1c2UgJWZsb3c7IGNvbnRhaW5zICNQQ0RBVEEsIHRoZSB0eXBlIGlzIE1JWEVELgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQVJBTV9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRTZWxlY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkU2VsZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDEyODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRTZWxlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBDdGRTZWxlY3QgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFNlbGVjdChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUR1JPVVAgfCBPUFRJT04pKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gT1BUR1JPVVAKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRHUk9VUCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gT1BUSU9OCi0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT04pOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKE9QVEdST1VQIHwgT1BUSU9OKSsuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfU0VMRUNUOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkNzNkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBUQUJMRS4KLSAqIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKywgVFIrKQotICovCi1maW5hbCBjbGFzcyBDdGRUYWJsZSBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkVGFibGUoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWTsKLQl9Ci0KLQkvKioKLQkgKiAoQ0FQVElPTj8sIChDT0wqfENPTEdST1VQKiksIFRIRUFEPywgVEZPT1Q/LCBUQk9EWSspCi0JICogLS0+ICgoQ0FQVElPTik/LCAoKENPTCkqIHwgKENPTEdST1VQKSopLCAoVEhFQUQpPywgKFRGT09UKT8sIChUQk9EWSkrLCAoVFIpKykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCAsICwgLCAsKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCi0JCS8vIChDQVBUSU9OKT8KLQkJLy8gICAgICggKT8KLQkJQ01Hcm91cEltcGwgd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJLy8gICAgIENBUFRJT04KLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DQVBUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vICgoQ09MKSogfCAoQ09MR1JPVVApKikKLQkJLy8gICAgICggfCApCi0JCUNNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCQkvLyAgICAgICAgIChDT0wpKgotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ3JvdXAuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0wpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0JCS8vICAgICAgICAgKENPTEdST1VQKSoKLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdyb3VwLmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MR1JPVVApOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gKFRIRUFEKT8KLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFEKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vIChURk9PVCk/Ci0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQotCQkvLyAoVEJPRFkpKwotCQkvLyBUQk9EWSBoYXMgb3B0aW9uYWwgc3RhcnQgYW5kIGVuZCB0YWdzCi0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFkpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk2MTAxCi0JCS8vIFRCT0RZIHN0YXJ0IGFuZCBlbmQgdGFnIGFyZSBvcHRpb25hbCwgc28gVFIgc2hvdWxkIGJlIGFsbG93ZWQgaGVyZQotCQkvLyAoVFIpKwotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqICgoRlJBTUVTRVQgfCBGUkFNRSkrICYgTk9GUkFNRVM/KQotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVEFCTEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZUNlbGxDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGVDZWxsQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDc4NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZUNlbGxDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBUYWJsZSBjZWxsIGNvbnRhaW5lci4KLSAqIChUSCB8IFREKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkVGFibGVDZWxsQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRUYWJsZUNlbGxDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URDsKLQl9Ci0KLQkvKioKLQkgKiAoVEggfCBURCkrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gVEgKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gVEQKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlREKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChUSCB8IFREKSsKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RDRUxMX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRyQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRyQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNGMyMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUckNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIFRhYmxlIHJlY29yZCBjb250YWluZXIuCi0gKiAoVFIpKwotICovCi1maW5hbCBjbGFzcyBDdGRUckNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkVHJDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUjsKLQl9Ci0KLQkvKioKLQkgKiAoVFIpKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKFRSKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCUNNTm9kZSB0ciA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUik7Ci0JCWlmICh0ciAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZCh0cik7Ci0JfQotCi0JLyoqCi0JICogRUxFTUVOVCBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RSX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RlY2xDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RlY2xDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWFiNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EZWNsQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICovCi1hYnN0cmFjdCBjbGFzcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCi0JcHJvdGVjdGVkIGNsYXNzIER1YWxNYXAgewotCQlwdWJsaWMgRHVhbE1hcCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRHVhbE1hcChPYmplY3RbXSBvYmplY3RzKSB7Ci0JCQlzdXBlcigpOwotCQkJaW5pdGlhbGl6ZShvYmplY3RzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCXJldHVybiB0YWJsZS5sZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKGludCBrZXkpIHsKLQkJCWlmICghaXNWYWxpZEluZGV4KGtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gdGFibGVba2V5XTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotCQkJSW50ZWdlciBrZXlPYmogPSAoSW50ZWdlcikgbWFwLmdldCh2YWx1ZSk7Ci0JCQlpZiAoa2V5T2JqID09IG51bGwpCi0JCQkJcmV0dXJuIElEX1VOS05PV047Ci0JCQlyZXR1cm4ga2V5T2JqLmludFZhbHVlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJCWlmIChvYmplY3RzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJdGFibGUgPSBvYmplY3RzOwotCQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGtleSA9IDA7IGtleSA8IG9iamVjdHMubGVuZ3RoOyBrZXkrKykgewotCQkJCU9iamVjdCB2YWx1ZSA9IHRhYmxlW2tleV07Ci0JCQkJbWFwLnB1dCh2YWx1ZSwgbmV3IEludGVnZXIoa2V5KSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIE9iamVjdFtdIHRhYmxlID0gbnVsbDsKLQkJcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRJbmRleChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgdGFibGUubGVuZ3RoOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRvbGVyYW50U3RyaW5nRHVhbE1hcCBleHRlbmRzIER1YWxNYXAgewotCQlwdWJsaWMgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKFN0cmluZ1tdIG5hbWVzKSB7Ci0JCQlzdXBlcigpOwotCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbbmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvYmplY3RzW2ldID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZXNbaV0pOwotCQkJfQotCQkJaW5pdGlhbGl6ZShvYmplY3RzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHZhbHVlOwotCQkJCXJldHVybiBzdXBlci5nZXRLZXkobWFrZUNhbm9uaWNhbEZvcm0obmFtZSkpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIElEX1VOS05PV047Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBtYWtlQ2Fub25pY2FsRm9ybShTdHJpbmcgcmF3KSB7Ci0JCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE1MgotCQkJLy8gd2UgYXJlIGFibGUgdG8gImNoZWF0IiBoZXJlIGEgbGl0dGxlIGFuZCB1c2UgVVMgTG9jYWxlIAotCQkJLy8gdG8gZ2V0IGEgZ29vZCBjb25vbmljYWwgZm9ybSwgc2luY2Ugd2UgYXJlIHVzaW5nIHRoaXMgb25seSAKLQkJCS8vIGZvciBIVE1MIGFuZCBKU1Agc3RhbmRhcmQgdGFncy4gCi0JCQkvLyBMb25nIHRlcm0sIGZvciBzaW1pbGFyIG5lZWRzIHdpdGggWE1MIDEuMSAoZm9yIGV4YW1wbGUpCi0JCQkvLyB3ZSBzaG91bGQgdXNlIGEgY2xhc3Mgc3VjaCBhcyBjb20uaWJtLmljdS50ZXh0Lk5vcm1hbGl6ZXIKLQkJCXJldHVybiByYXcudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRGVjbEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwdWJsaWMgRGVjbEl0ZXJhdG9yKCkgewotCQkJbWF4aWQgPSBmRGVjbHMubGVuZ3RoIC0gMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gaWQgPCBtYXhpZDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCWlmICghaGFzTmV4dCgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGl0ZW0oKytpZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7IC8qIG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUuICovCi0JCX0KLQotCQlwcml2YXRlIGludCBpZCA9IC0xOwotCQlwcml2YXRlIGludCBtYXhpZCA9IC0xOwotCX0KLQotCUNNTm9kZVtdIGZEZWNscyA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFNUUklDVF9DQVNFID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFRPTEVSQU5UX0NBU0UgPSB0cnVlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IElEX1VOS05PV04gPSAtMTsKLQlwcml2YXRlIER1YWxNYXAgZk1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRGVjbENvbGxlY3Rpb24oU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gdG9sZXJhbnQpIHsKLQkJc3VwZXIoKTsKLQkJZkRlY2xzID0gbmV3IENNTm9kZVtuYW1lcy5sZW5ndGhdOwotCQlpZiAodG9sZXJhbnQpIHsKLQkJCWZNYXAgPSBuZXcgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKG5hbWVzKTsKLQkJfQotCQllbHNlIHsKLQkJCWZNYXAgPSBuZXcgRHVhbE1hcChuYW1lcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIGlkIGludAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDTU5vZGUgY3JlYXRlKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXREZWNsYXJhdGlvbnMoU3RyaW5nW10gbmFtZXMpIHsKLQkJQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLQkJCUNNTm9kZSBub2RlID0gZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCW1hcC5wdXROYW1lZEl0ZW0obmFtZSwgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZXMgamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RGVjbGFyYXRpb25zKENNR3JvdXBJbXBsIGdyb3VwLCBJdGVyYXRvciBuYW1lcykgewotCQl3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgZW50aXR5TmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQkJCUNNTm9kZSBkZWMgPSBnZXROYW1lZEl0ZW0oZW50aXR5TmFtZSk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcCBuYW1lIHRvIGlkLgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0SUQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZNYXAuZ2V0S2V5KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkRlY2xzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaWQgaW50Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lKGludCBpZCkgewotCQlyZXR1cm4gKFN0cmluZykgZk1hcC5nZXRWYWx1ZShpZCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCWludCBpZCA9IGdldElEKG5hbWUpOwotCQlpZiAoIWlzVmFsaWRJRChpZCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGl0ZW0oaWQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBpZCBpbnQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZElEKGludCBpZCkgewotCQlyZXR1cm4gaWQgPj0gMCAmJiBpZCA8IGZEZWNscy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmICghaXNWYWxpZElEKGluZGV4KSkKLQkJCXJldHVybiBudWxsOwotCQlDTU5vZGUgZGVjbCA9IGZEZWNsc1tpbmRleF07Ci0JCWlmIChkZWNsICE9IG51bGwpCi0JCQlyZXR1cm4gZGVjbDsgLy8gYWxyZWFkeSBleGlzdC4KLQotCQlkZWNsID0gY3JlYXRlKGdldE5hbWUoaW5kZXgpKTsKLQkJZkRlY2xzW2luZGV4XSA9IGRlY2w7Ci0JCXJldHVybiBkZWNsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBEZWNsSXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNDk5NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9FbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCi0JLy8gRWxlbWVudCBJRHMKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUJCUiA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDUk9OWU0gPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRERSRVNTID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVBQTEVUID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJFQSA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0IgPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CQVNFID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkFTRUZPTlQgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRE8gPSA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CSUcgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkxJTksgPSAxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkxPQ0tRVU9URSA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CT0RZID0gMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JSID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JVVFRPTiA9IDE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQVBUSU9OID0gMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFTlRFUiA9IDE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSVRFID0gMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPREUgPSAxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09MID0gMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPTEdST1VQID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0REID0gMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERk4gPSAyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJViA9IDI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ETCA9IDI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EVCA9IDI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTSA9IDI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTUJFRCA9IDMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GSUVMRFNFVCA9IDMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT05UID0gMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUk0gPSAzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBTUUgPSAzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBTUVTRVQgPSAzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDEgPSAzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDIgPSAzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDMgPSAzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDQgPSAzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDUgPSA0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDYgPSA0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBRCA9IDQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IUiA9IDQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IVE1MID0gNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0kgPSA0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUZSQU1FID0gNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lNRyA9IDQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlBVVCA9IDQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlMgPSA0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVNJTkRFWCA9IDUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQkQgPSA1MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFCRUwgPSA1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEVHRU5EID0gNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xJID0gNTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xJTksgPSA1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUFQID0gNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01FTlUgPSA1NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUVUQSA9IDU4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT0VNQkVEID0gNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PRlJBTUVTID0gNjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PU0NSSVBUID0gNjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09CSkVDVCA9IDYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTCA9IDYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUFRHUk9VUCA9IDY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUFRJT04gPSA2NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUCA9IDY2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBTSA9IDY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUkUgPSA2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUSA9IDY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TID0gNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NBTVAgPSA3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NSSVBUID0gNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NFTEVDVCA9IDczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TTUFMTCA9IDc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TUEFOID0gNzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NUUklLRSA9IDc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVFJPTkcgPSA3NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1RZTEUgPSA3ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCID0gNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUCA9IDgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQUJMRSA9IDgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQk9EWSA9IDgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9URCA9IDgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9URVhUQVJFQSA9IDg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9URk9PVCA9IDg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USCA9IDg2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVBRCA9IDg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USVRMRSA9IDg4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UUiA9IDg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UVCA9IDkwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VID0gOTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VMID0gOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1ZBUiA9IDkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NQVJRVUVFID0gOTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9DT05GSUcgPSA5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0VDSE8gPSA5NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0VYRUMgPSA5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0ZTSVpFID0gOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9GTEFTVE1PRCA9IDk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfSU5DTFVERSA9IDEwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX1BSSU5URU5WID0gMTAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfU0VUID0gMTAyOwotCQkvLyA8PEQyMDU1MTMKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkdTT1VORCA9IDEwMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9CUiA9IDEwNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfV0JSID0gMTA1OwotCi0JCS8vIEQyMDU1MTMKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8qKiAlZm9udHN0eWxlOy4gVFQgfCBJIHwgQiB8IFUgfCBTIHwgU1RSSUtFIHwgQklHIHwgU01BTEwgfCBCTElOSyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZPTlRTVFlMRSA9IHtUVCwgSSwgQiwgVSwgUywgU1RSSUtFLCBCSUcsIFNNQUxMLCBCTElOS307Ci0JLyoqICVmb3JtY3RsOy4gSU5QVVQgfCBTRUxFQ1QgfCBURVhUQVJFQSB8IExBQkVMIHwgQlVUVE9OICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRk9STUNUTCA9IHtJTlBVVCwgU0VMRUNULCBURVhUQVJFQSwgTEFCRUwsIEJVVFRPTn07Ci0JLyoqICVwaHJhc2U7LgotCSAqIEVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8IFNBTVAgfCBLQkQgfCBWQVIgfCBDSVRFIHwgQUJCUiB8IEFDUk9OWU0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQSFJBU0UgPSB7RU0sIFNUUk9ORywgREZOLCBDT0RFLCBTQU1QLCBLQkQsIFZBUiwgQ0lURSwgQUJCUiwgQUNST05ZTX07Ci0JLyoqICVzcGVjaWFsOy4KLQkgKiBBIHwgSU1HIHwgQVBQTEVUIHwgT0JKRUNUIHwgRk9OVCB8IEJBU0VGT05UIHwgQlIgfCBTQ1JJUFQgfAotCSAqIE1BUCB8IFEgfCBTVUIgfCBTVVAgfCBTUEFOIHwgQkRPIHwgSUZSQU1FIHwgRU1CRUQgfCBNQVJRVUVFIHwKLQkgKiBEMlcgfCBTVUJNSVQKLQkgKiBXQlIgfCBOT0JSIHwgQkdTT1VORAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNQRUNJQUwgPSB7QSwgSU1HLCBBUFBMRVQsIE9CSkVDVCwgRk9OVCwgQkFTRUZPTlQsIEJSLCBXQlIsIC8vIEQyMDU1MTMKLQkJCQlTQ1JJUFQsIE1BUCwgUSwgU1VCLCBTVVAsIFNQQU4sIEJETywgSUZSQU1FLCBFTUJFRCwgQkdTT1VORCwgLy8gRDIwNTUxMwotCQkJCU1BUlFVRUUsIE5PQlIgLy8gRDIwNTUxMwotCX07Ci0JLyoqICVoZWFkaW5nOy4gSFsxLTZdICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSEVBRElORyA9IHtIMSwgSDIsIEgzLCBINCwgSDUsIEg2fTsKLQkvKiogJWxpc3Q7LiBVTCB8IE9MIHwgRElSIHwgTUVOVSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExJU1QgPSB7VUwsIE9MLCBESVIsIE1FTlV9OwotCS8qKiAlcHJlZm9ybWF0dGVkOy4gUFJFICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJFRk9STUFUVEVEID0ge1BSRX07Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb2xsZWN0aW9uIGF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZOYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQlmTmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJZk5hbWVzW0lkcy5JRF9BXSA9IEE7Ci0JCWZOYW1lc1tJZHMuSURfQUJCUl0gPSBBQkJSOwotCQlmTmFtZXNbSWRzLklEX0FDUk9OWU1dID0gQUNST05ZTTsKLQkJZk5hbWVzW0lkcy5JRF9BRERSRVNTXSA9IEFERFJFU1M7Ci0JCWZOYW1lc1tJZHMuSURfQVBQTEVUXSA9IEFQUExFVDsKLQkJZk5hbWVzW0lkcy5JRF9BUkVBXSA9IEFSRUE7Ci0JCWZOYW1lc1tJZHMuSURfQl0gPSBCOwotCQlmTmFtZXNbSWRzLklEX0JBU0VdID0gQkFTRTsKLQkJZk5hbWVzW0lkcy5JRF9CQVNFRk9OVF0gPSBCQVNFRk9OVDsKLQkJZk5hbWVzW0lkcy5JRF9CRE9dID0gQkRPOwotCQlmTmFtZXNbSWRzLklEX0JJR10gPSBCSUc7Ci0JCWZOYW1lc1tJZHMuSURfQkxJTktdID0gQkxJTks7Ci0JCWZOYW1lc1tJZHMuSURfQkxPQ0tRVU9URV0gPSBCTE9DS1FVT1RFOwotCQlmTmFtZXNbSWRzLklEX0JPRFldID0gQk9EWTsKLQkJZk5hbWVzW0lkcy5JRF9CUl0gPSBCUjsKLQkJZk5hbWVzW0lkcy5JRF9CVVRUT05dID0gQlVUVE9OOwotCQlmTmFtZXNbSWRzLklEX0NBUFRJT05dID0gQ0FQVElPTjsKLQkJZk5hbWVzW0lkcy5JRF9DRU5URVJdID0gQ0VOVEVSOwotCQlmTmFtZXNbSWRzLklEX0NJVEVdID0gQ0lURTsKLQkJZk5hbWVzW0lkcy5JRF9DT0RFXSA9IENPREU7Ci0JCWZOYW1lc1tJZHMuSURfQ09MXSA9IENPTDsKLQkJZk5hbWVzW0lkcy5JRF9DT0xHUk9VUF0gPSBDT0xHUk9VUDsKLQkJZk5hbWVzW0lkcy5JRF9ERF0gPSBERDsKLQkJZk5hbWVzW0lkcy5JRF9ERUxdID0gREVMOwotCQlmTmFtZXNbSWRzLklEX0RGTl0gPSBERk47Ci0JCWZOYW1lc1tJZHMuSURfRElSXSA9IERJUjsKLQkJZk5hbWVzW0lkcy5JRF9ESVZdID0gRElWOwotCQlmTmFtZXNbSWRzLklEX0RMXSA9IERMOwotCQlmTmFtZXNbSWRzLklEX0RUXSA9IERUOwotCQlmTmFtZXNbSWRzLklEX0VNXSA9IEVNOwotCQlmTmFtZXNbSWRzLklEX0VNQkVEXSA9IEVNQkVEOwotCQlmTmFtZXNbSWRzLklEX0ZJRUxEU0VUXSA9IEZJRUxEU0VUOwotCQlmTmFtZXNbSWRzLklEX0ZPTlRdID0gRk9OVDsKLQkJZk5hbWVzW0lkcy5JRF9GT1JNXSA9IEZPUk07Ci0JCWZOYW1lc1tJZHMuSURfRlJBTUVdID0gRlJBTUU7Ci0JCWZOYW1lc1tJZHMuSURfRlJBTUVTRVRdID0gRlJBTUVTRVQ7Ci0JCWZOYW1lc1tJZHMuSURfSDFdID0gSDE7Ci0JCWZOYW1lc1tJZHMuSURfSDJdID0gSDI7Ci0JCWZOYW1lc1tJZHMuSURfSDNdID0gSDM7Ci0JCWZOYW1lc1tJZHMuSURfSDRdID0gSDQ7Ci0JCWZOYW1lc1tJZHMuSURfSDVdID0gSDU7Ci0JCWZOYW1lc1tJZHMuSURfSDZdID0gSDY7Ci0JCWZOYW1lc1tJZHMuSURfSEVBRF0gPSBIRUFEOwotCQlmTmFtZXNbSWRzLklEX0hSXSA9IEhSOwotCQlmTmFtZXNbSWRzLklEX0hUTUxdID0gSFRNTDsKLQkJZk5hbWVzW0lkcy5JRF9JXSA9IEk7Ci0JCWZOYW1lc1tJZHMuSURfSUZSQU1FXSA9IElGUkFNRTsKLQkJZk5hbWVzW0lkcy5JRF9JTUddID0gSU1HOwotCQlmTmFtZXNbSWRzLklEX0lOUFVUXSA9IElOUFVUOwotCQlmTmFtZXNbSWRzLklEX0lOU10gPSBJTlM7Ci0JCWZOYW1lc1tJZHMuSURfSVNJTkRFWF0gPSBJU0lOREVYOwotCQlmTmFtZXNbSWRzLklEX0tCRF0gPSBLQkQ7Ci0JCWZOYW1lc1tJZHMuSURfTEFCRUxdID0gTEFCRUw7Ci0JCWZOYW1lc1tJZHMuSURfTEVHRU5EXSA9IExFR0VORDsKLQkJZk5hbWVzW0lkcy5JRF9MSV0gPSBMSTsKLQkJZk5hbWVzW0lkcy5JRF9MSU5LXSA9IExJTks7Ci0JCWZOYW1lc1tJZHMuSURfTUFQXSA9IE1BUDsKLQkJZk5hbWVzW0lkcy5JRF9NRU5VXSA9IE1FTlU7Ci0JCWZOYW1lc1tJZHMuSURfTUVUQV0gPSBNRVRBOwotCQlmTmFtZXNbSWRzLklEX05PRU1CRURdID0gTk9FTUJFRDsKLQkJZk5hbWVzW0lkcy5JRF9OT0ZSQU1FU10gPSBOT0ZSQU1FUzsKLQkJZk5hbWVzW0lkcy5JRF9OT1NDUklQVF0gPSBOT1NDUklQVDsKLQkJZk5hbWVzW0lkcy5JRF9PQkpFQ1RdID0gT0JKRUNUOwotCQlmTmFtZXNbSWRzLklEX09MXSA9IE9MOwotCQlmTmFtZXNbSWRzLklEX09QVEdST1VQXSA9IE9QVEdST1VQOwotCQlmTmFtZXNbSWRzLklEX09QVElPTl0gPSBPUFRJT047Ci0JCWZOYW1lc1tJZHMuSURfUF0gPSBQOwotCQlmTmFtZXNbSWRzLklEX1BBUkFNXSA9IFBBUkFNOwotCQlmTmFtZXNbSWRzLklEX1BSRV0gPSBQUkU7Ci0JCWZOYW1lc1tJZHMuSURfUV0gPSBROwotCQlmTmFtZXNbSWRzLklEX1NdID0gUzsKLQkJZk5hbWVzW0lkcy5JRF9TQU1QXSA9IFNBTVA7Ci0JCWZOYW1lc1tJZHMuSURfU0NSSVBUXSA9IFNDUklQVDsKLQkJZk5hbWVzW0lkcy5JRF9TRUxFQ1RdID0gU0VMRUNUOwotCQlmTmFtZXNbSWRzLklEX1NNQUxMXSA9IFNNQUxMOwotCQlmTmFtZXNbSWRzLklEX1NQQU5dID0gU1BBTjsKLQkJZk5hbWVzW0lkcy5JRF9TVFJJS0VdID0gU1RSSUtFOwotCQlmTmFtZXNbSWRzLklEX1NUUk9OR10gPSBTVFJPTkc7Ci0JCWZOYW1lc1tJZHMuSURfU1RZTEVdID0gU1RZTEU7Ci0JCWZOYW1lc1tJZHMuSURfU1VCXSA9IFNVQjsKLQkJZk5hbWVzW0lkcy5JRF9TVVBdID0gU1VQOwotCQlmTmFtZXNbSWRzLklEX1RBQkxFXSA9IFRBQkxFOwotCQlmTmFtZXNbSWRzLklEX1RCT0RZXSA9IFRCT0RZOwotCQlmTmFtZXNbSWRzLklEX1REXSA9IFREOwotCQlmTmFtZXNbSWRzLklEX1RFWFRBUkVBXSA9IFRFWFRBUkVBOwotCQlmTmFtZXNbSWRzLklEX1RGT09UXSA9IFRGT09UOwotCQlmTmFtZXNbSWRzLklEX1RIXSA9IFRIOwotCQlmTmFtZXNbSWRzLklEX1RIRUFEXSA9IFRIRUFEOwotCQlmTmFtZXNbSWRzLklEX1RJVExFXSA9IFRJVExFOwotCQlmTmFtZXNbSWRzLklEX1RSXSA9IFRSOwotCQlmTmFtZXNbSWRzLklEX1RUXSA9IFRUOwotCQlmTmFtZXNbSWRzLklEX1VdID0gVTsKLQkJZk5hbWVzW0lkcy5JRF9VTF0gPSBVTDsKLQkJZk5hbWVzW0lkcy5JRF9WQVJdID0gVkFSOwotCQlmTmFtZXNbSWRzLklEX01BUlFVRUVdID0gTUFSUVVFRTsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfQ09ORklHXSA9IFNTSV9DT05GSUc7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX0VDSE9dID0gU1NJX0VDSE87Ci0JCWZOYW1lc1tJZHMuSURfU1NJX0VYRUNdID0gU1NJX0VYRUM7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX0ZTSVpFXSA9IFNTSV9GU0laRTsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfRkxBU1RNT0RdID0gU1NJX0ZMQVNUTU9EOwotCQlmTmFtZXNbSWRzLklEX1NTSV9JTkNMVURFXSA9IFNTSV9JTkNMVURFOwotCQlmTmFtZXNbSWRzLklEX1NTSV9QUklOVEVOVl0gPSBTU0lfUFJJTlRFTlY7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX1NFVF0gPSBTU0lfU0VUOwotCQlmTmFtZXNbSWRzLklEX0JHU09VTkRdID0gQkdTT1VORDsKLQkJZk5hbWVzW0lkcy5JRF9OT0JSXSA9IE5PQlI7Ci0JCWZOYW1lc1tJZHMuSURfV0JSXSA9IFdCUjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudENvbGxlY3Rpb24oQXR0cmlidXRlQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGZOYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEFjdHVhbGx5IGNyZWF0ZXMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJSFRNTEVsZW1EZWNsSW1wbCBlZGVjID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBKHRoaXMpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQUJCUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKEFCQlIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBQ1JPTllNKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoQUNST05ZTSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFERFJFU1MpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEFERFJFU1ModGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFQUExFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQVBQTEVUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBUkVBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBUkVBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoQiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJBU0UpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJBU0UodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJBU0VGT05UKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCQVNFRk9OVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkRPKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCRE8odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJJRykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKEJJRywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJMSU5LKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoQkxJTkssIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCTE9DS1FVT1RFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCTE9DS1FVT1RFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCT0RZKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCT0RZKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQlIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJVVFRPTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQlVUVE9OKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDQVBUSU9OKSkgewotCQkJZWRlYyA9IG5ldyBIZWRDQVBUSU9OKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDRU5URVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZENFTlRFUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ0lURSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKENJVEUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0RFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoQ09ERSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENPTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ09MKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xHUk9VUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ09MR1JPVVAodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEREKSkgewotCQkJZWRlYyA9IG5ldyBIZWRERCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREVMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNYXJrQ2hhbmdlcyhERUwsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERk4pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShERk4sIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShESVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FTlUoRElSLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRElWKSkgewotCQkJZWRlYyA9IG5ldyBIZWRESVYodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRETCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRFQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShFTSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKEVNLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRU1CRUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEVNQkVEKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGSUVMRFNFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRklFTERTRVQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZPTlQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZPTlQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZPUk0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZPUk0odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZSQU1FKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGUkFNRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRlJBTUVTRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZSQU1FU0VUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgyKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgyLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDMsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg1KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg1LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDYsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIRUFEKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIRUFEKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSFIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhUTUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShJLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSUZSQU1FKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJRlJBTUUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElNRykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSU1HKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTlBVVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSU5QVVQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElOUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTWFya0NoYW5nZXMoSU5TLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSVNJTkRFWCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSVNJTkRFWCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoS0JEKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoS0JELCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEFCRUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZExBQkVMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShMRUdFTkQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZExFR0VORCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZExJKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShMSU5LKSkgewotCQkJZWRlYyA9IG5ldyBIZWRMSU5LKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNQVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1BUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUFSUVVFRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUFSUVVFRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVOVSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVOVShNRU5VLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVUQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVUQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTk9FTUJFRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTk9FTUJFRCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTk9GUkFNRVMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE5PRlJBTUVTKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShOT1NDUklQVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTk9TQ1JJUFQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9CSkVDVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT0JKRUNUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT0wodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9QVEdST1VQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRPUFRHUk9VUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT1BUSU9OKSkgewotCQkJZWRlYyA9IG5ldyBIZWRPUFRJT04odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFApKSB7Ci0JCQllZGVjID0gbmV3IEhlZFAodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFBBUkFNKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQQVJBTSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUFJFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQUkUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShTLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0FNUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKFNBTVAsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTQ1JJUFQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNDUklQVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTRUxFQ1QodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNNQUxMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoU01BTEwsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTUEFOKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTUEFOKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFJJS0UpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShTVFJJS0UsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFJPTkcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShTVFJPTkcsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFlMRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1RZTEUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNVQikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU2NyaXB0cyhTVUIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNjcmlwdHMoU1VQLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEFCTEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRBQkxFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUQk9EWSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVGFibGVCb2R5KFRCT0RZLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRhYmxlQ2VsbChURCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRFWFRBUkVBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRURVhUQVJFQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEZPT1QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRhYmxlQm9keShURk9PVCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRIKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUYWJsZUNlbGwoVEgsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUSEVBRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVGFibGVCb2R5KFRIRUFELCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVElUTEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRJVExFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVFIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoVFQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShVKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoVSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFVMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRVTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVkFSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoVkFSLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0NPTkZJRykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJQ29uZmlnKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRUNITykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRWNobyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0VYRUMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUV4ZWModGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9GU0laRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRnNpemUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9GTEFTVE1PRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRmxhc3Rtb2QodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9JTkNMVURFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lJbmNsdWRlKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfUFJJTlRFTlYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSVByaW50ZW52KHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfU0VUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lTZXQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJHU09VTkQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJHU09VTkQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5PQlIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE5PQlIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFdCUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkV0JSKHRoaXMpOwotCi0JCX0gLy8gdW5rbm93bgotCQllbHNlIHsKLQkJCS8vIE5PVEU6IFdlIGRvbid0IGRlZmluZSB0aGUgVU5LTk9XTiBlbGVtZW50IGRlY2xhcmF0aW9uLgotCQkJLy8gPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgZGVjbGFyYXRpb24gaXMgYSBzaWduIG9mCi0JCQkvLyB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgdW5rbm93bi4KLQkJCS8vIC0tIDMvOS8yMDAxCi0JCQllZGVjID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZWRlYzsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gYXR0cmlidXRlQ29sbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgQ29sbGVjdGlvbiBnZXROYW1lc09mQmxvY2soKSB7Ci0JCS8vIFAsIERMLCBESVYsIENFTlRFUiwgTk9TQ1JJUFQsIE5PRlJBTUVTLCBCTE9DS1FVT1RFLCBGT1JNLCBJU0lOREVYLCBIUiwKLQkJLy8gVEFCTEUsIEZJRUxEU0VULCBBRERSRVNTCi0JCVN0cmluZ1tdIGJsb2NrTWlzYyA9IHtQLCBETCwgRElWLCBDRU5URVIsIE5PU0NSSVBULCBOT0ZSQU1FUywgQkxPQ0tRVU9URSwgRk9STSwgSVNJTkRFWCwgSFIsIFRBQkxFLCBGSUVMRFNFVCwgQUREUkVTU307Ci0JCVZlY3RvciBuYW1lcyA9IG5ldyBWZWN0b3IoQXJyYXlzLmFzTGlzdChibG9ja01pc2MpKTsKLQkJLy8gJWhlYWRpbmc7Ci0JCW5hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KEhFQURJTkcpKTsKLQkJLy8gJWxpc3Q7Ci0JCW5hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KExJU1QpKTsKLQkJLy8gJXByZWZvcm1hdHRlZDsKLQkJbmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoUFJFRk9STUFUVEVEKSk7Ci0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8qKgotCSAqICVibG9jazsuCi0JICogJWJsb2NrOyBpczoKLQkgKiBQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0JICogTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLQkgKiBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUy48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0QmxvY2soQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgZ2V0TmFtZXNPZkJsb2NrKCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtCi0JICogaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGbG93KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRCbG9jayhncm91cCk7Ci0JCWdldElubGluZShncm91cCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0Rm9udHN0eWxlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoRk9OVFNUWUxFKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGb3JtY3RybChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEZPUk1DVEwpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqICVoZWFkaW5nOy4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRIZWFkaW5nKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChIRUFESU5HKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0KLQkgKiBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+IGluc3RhbmNlLgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldElubGluZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0Rm9udHN0eWxlKGdyb3VwKTsKLQkJZ2V0UGhyYXNlKGdyb3VwKTsKLQkJZ2V0U3BlY2lhbChncm91cCk7Ci0JCWdldEZvcm1jdHJsKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiAlbGlzdDsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0TGlzdChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoTElTVCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0UGhyYXNlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUEhSQVNFKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlcHJlZm9ybWF0dGVkOwotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFByZWZvcm1hdHRlZChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUFJFRk9STUFUVEVEKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRTcGVjaWFsKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoU1BFQ0lBTCkuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VudGl0eUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhNzA0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VudGl0eUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbnRpdHkgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbnRpdHlDb2xsZWN0aW9uIGV4dGVuZHMgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5FbnRpdHlOYW1lIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUFDVVRFX0wgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQUNVVEVfVSA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDSVJDX0wgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ0lSQ19VID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNVVEUgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRUxJR19MID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUVMSUdfVSA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FHUkFWRV9MID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUdSQVZFX1UgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTEVGU1lNID0gOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxQSEFfTCA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTFBIQV9VID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FNUCA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTkQgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU5HID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FSSU5HX0wgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJJTkdfVSA9IDE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BU1lNUCA9IDE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfTCA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfVSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVU1MX0wgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVNTF9VID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JEUVVPID0gMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JFVEFfTCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRVRBX1UgPSAyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlJWQkFSID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JVTEwgPSAyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0FQID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9MID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9VID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFRElMID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFTlQgPSAzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX0wgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX1UgPSAzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0lSQyA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DTFVCUyA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT05HID0gMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPUFkgPSAzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1JBUlIgPSAzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VQID0gMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NVUlJFTiA9IDQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfTCA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfVSA9IDQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQVJSX0wgPSA0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFSUl9VID0gNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFRyA9IDQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUxUQV9MID0gNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTFRBX1UgPSA0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElBTVMgPSA0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElWSURFID0gNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9MID0gNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9VID0gNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VDSVJDX0wgPSA1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUNJUkNfVSA9IDUzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfTCA9IDU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfVSA9IDU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVBUWSA9IDU2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVNQID0gNTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VOU1AgPSA1ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVBTSUxPTl9MID0gNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VQU0lMT05fVSA9IDYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUVVJViA9IDYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfTCA9IDYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfVSA9IDYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfTCA9IDY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfVSA9IDY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVU1MX0wgPSA2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVNTF9VID0gNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVUk8gPSA2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVhJU1QgPSA2OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk5PRiA9IDcwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT1JBTEwgPSA3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzEyID0gNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMxNCA9IDczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMzQgPSA3NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBU0wgPSA3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0FNTUFfTCA9IDc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HQU1NQV9VID0gNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFID0gNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dUID0gNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hBUlJfTCA9IDgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IQVJSX1UgPSA4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBUlRTID0gODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFTExJUCA9IDgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfTCA9IDg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfVSA9IDg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQ0lSQ19MID0gODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lDSVJDX1UgPSA4NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUVYQ0wgPSA4ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX0wgPSA4OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX1UgPSA5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1BR0UgPSA5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5GSU4gPSA5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5UID0gOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lPVEFfTCA9IDk0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JT1RBX1UgPSA5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVFVRVNUID0gOTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lTSU4gPSA5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVVNTF9MID0gOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lVTUxfVSA9IDk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9MID0gMTAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9VID0gMTAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU1CREFfTCA9IDEwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFNQkRBX1UgPSAxMDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTkcgPSAxMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUVVPID0gMTA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVJSX0wgPSAxMDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUlJfVSA9IDEwNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTENFSUwgPSAxMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xEUVVPID0gMTA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRSA9IDExMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEZMT09SID0gMTExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MT1dBU1QgPSAxMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xPWiA9IDExMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFJNID0gMTE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MU0FRVU8gPSAxMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xTUVVPID0gMTE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MVCA9IDExNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUFDUiA9IDExODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTURBU0ggPSAxMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JQ1JPID0gMTIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSURET1QgPSAxMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JTlVTID0gMTIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9MID0gMTIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9VID0gMTI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OQUJMQSA9IDEyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkJTUCA9IDEyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkRBU0ggPSAxMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05FID0gMTI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OSSA9IDEyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9UID0gMTMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT1RJTiA9IDEzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlNVQiA9IDEzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlRJTERFX0wgPSAxMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05USUxERV9VID0gMTM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9MID0gMTM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9VID0gMTM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQUNVVEVfTCA9IDEzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0FDVVRFX1UgPSAxMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX0wgPSAxMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX1UgPSAxNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX0wgPSAxNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX1UgPSAxNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09HUkFWRV9MID0gMTQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PR1JBVkVfVSA9IDE0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0xJTkUgPSAxNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX0wgPSAxNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX1UgPSAxNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NSUNST05fTCA9IDE0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01JQ1JPTl9VID0gMTQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUExVUyA9IDE1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1IgPSAxNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SREYgPSAxNTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SRE0gPSAxNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09TTEFTSF9MID0gMTU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PU0xBU0hfVSA9IDE1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTERFX0wgPSAxNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USUxERV9VID0gMTU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElNRVMgPSAxNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VTUxfTCA9IDE1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VNTF9VID0gMTYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBID0gMTYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJUID0gMTYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QRVJNSUwgPSAxNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BFUlAgPSAxNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BISV9MID0gMTY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSElfVSA9IDE2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElWID0gMTY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9MID0gMTY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9VID0gMTY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QTFVTTU4gPSAxNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BPVU5EID0gMTcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9MID0gMTcyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9VID0gMTczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9EID0gMTc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9QID0gMTc1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QU0lfTCA9IDE3NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFNJX1UgPSAxNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1FVT1QgPSAxNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBRElDID0gMTc5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQU5HID0gMTgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVFVTyA9IDE4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFSUl9MID0gMTgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVJSX1UgPSAxODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JDRUlMID0gMTg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRFFVTyA9IDE4NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVBTCA9IDE4NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVHID0gMTg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRkxPT1IgPSAxODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JIT19MID0gMTg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SSE9fVSA9IDE5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkxNID0gMTkxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SU0FRVU8gPSAxOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JTUVVPID0gMTkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQlFVTyA9IDE5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NBUk9OX0wgPSAxOTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDQVJPTl9VID0gMTk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRE9UID0gMTk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRUNUID0gMTk4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSFkgPSAxOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BRiA9IDIwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfTCA9IDIwMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfVSA9IDIwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lNID0gMjAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TUEFERVMgPSAyMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVQiA9IDIwNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCRSA9IDIwNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VNID0gMjA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAgPSAyMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDEgPSAyMDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDIgPSAyMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDMgPSAyMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUEUgPSAyMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NaTElHID0gMjEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQVVfTCA9IDIxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEFVX1UgPSAyMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVJFNCA9IDIxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFTWU0gPSAyMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX0wgPSAyMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX1UgPSAyMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RISU5TUCA9IDIyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fTCA9IDIyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fVSA9IDIyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElMREUgPSAyMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJTUVTID0gMjI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UUkFERSA9IDIyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFDVVRFX0wgPSAyMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBQ1VURV9VID0gMjI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQVJSX0wgPSAyMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBUlJfVSA9IDIyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfTCA9IDIzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfVSA9IDIzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUdSQVZFX0wgPSAyMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VHUkFWRV9VID0gMjMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTUwgPSAyMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lIID0gMjM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJTE9OX0wgPSAyMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lMT05fVSA9IDIzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVVNTF9MID0gMjM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VVU1MX1UgPSAyMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1dFSUVSUCA9IDI0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfTCA9IDI0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfVSA9IDI0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUFDVVRFX0wgPSAyNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lBQ1VURV9VID0gMjQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZRU4gPSAyNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lVTUxfTCA9IDI0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWVVNTF9VID0gMjQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aRVRBX0wgPSAyNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pFVEFfVSA9IDI0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWldKID0gMjUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aV05KID0gMjUxOwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMjUyLgotCQkJLy8gLS0gNS8yNC8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX0FBQ1VURV9MXSA9IEFBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfQUFDVVRFX1VdID0gQUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19MXSA9IEFDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19VXSA9IEFDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ1VURV0gPSBBQ1VURTsKLQkJbmFtZXNbSWRzLklEX0FFTElHX0xdID0gQUVMSUdfTDsKLQkJbmFtZXNbSWRzLklEX0FFTElHX1VdID0gQUVMSUdfVTsKLQkJbmFtZXNbSWRzLklEX0FHUkFWRV9MXSA9IEFHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfQUdSQVZFX1VdID0gQUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTEVGU1lNXSA9IEFMRUZTWU07Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9MXSA9IEFMUEhBX0w7Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9VXSA9IEFMUEhBX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTVBdID0gQU1QOwotCQluYW1lc1tJZHMuSURfQU5EXSA9IEFORDsKLQkJbmFtZXNbSWRzLklEX0FOR10gPSBBTkc7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19MXSA9IEFSSU5HX0w7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19VXSA9IEFSSU5HX1U7Ci0JCW5hbWVzW0lkcy5JRF9BU1lNUF0gPSBBU1lNUDsKLQkJbmFtZXNbSWRzLklEX0FUSUxERV9MXSA9IEFUSUxERV9MOwotCQluYW1lc1tJZHMuSURfQVRJTERFX1VdID0gQVRJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BVU1MX0xdID0gQVVNTF9MOwotCQluYW1lc1tJZHMuSURfQVVNTF9VXSA9IEFVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0JEUVVPXSA9IEJEUVVPOwotCQluYW1lc1tJZHMuSURfQkVUQV9MXSA9IEJFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0JFVEFfVV0gPSBCRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9CUlZCQVJdID0gQlJWQkFSOwotCQluYW1lc1tJZHMuSURfQlVMTF0gPSBCVUxMOwotCQluYW1lc1tJZHMuSURfQ0FQXSA9IENBUDsKLQkJbmFtZXNbSWRzLklEX0NDRURJTF9MXSA9IENDRURJTF9MOwotCQluYW1lc1tJZHMuSURfQ0NFRElMX1VdID0gQ0NFRElMX1U7Ci0JCW5hbWVzW0lkcy5JRF9DRURJTF0gPSBDRURJTDsKLQkJbmFtZXNbSWRzLklEX0NFTlRdID0gQ0VOVDsKLQkJbmFtZXNbSWRzLklEX0NISV9MXSA9IENISV9MOwotCQluYW1lc1tJZHMuSURfQ0hJX1VdID0gQ0hJX1U7Ci0JCW5hbWVzW0lkcy5JRF9DSVJDXSA9IENJUkM7Ci0JCW5hbWVzW0lkcy5JRF9DTFVCU10gPSBDTFVCUzsKLQkJbmFtZXNbSWRzLklEX0NPTkddID0gQ09ORzsKLQkJbmFtZXNbSWRzLklEX0NPUFldID0gQ09QWTsKLQkJbmFtZXNbSWRzLklEX0NSQVJSXSA9IENSQVJSOwotCQluYW1lc1tJZHMuSURfQ1VQXSA9IENVUDsKLQkJbmFtZXNbSWRzLklEX0NVUlJFTl0gPSBDVVJSRU47Ci0JCW5hbWVzW0lkcy5JRF9EQUdHRVJfTF0gPSBEQUdHRVJfTDsKLQkJbmFtZXNbSWRzLklEX0RBR0dFUl9VXSA9IERBR0dFUl9VOwotCQluYW1lc1tJZHMuSURfREFSUl9MXSA9IERBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0RBUlJfVV0gPSBEQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9ERUddID0gREVHOwotCQluYW1lc1tJZHMuSURfREVMVEFfTF0gPSBERUxUQV9MOwotCQluYW1lc1tJZHMuSURfREVMVEFfVV0gPSBERUxUQV9VOwotCQluYW1lc1tJZHMuSURfRElBTVNdID0gRElBTVM7Ci0JCW5hbWVzW0lkcy5JRF9ESVZJREVdID0gRElWSURFOwotCQluYW1lc1tJZHMuSURfRUFDVVRFX0xdID0gRUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9FQUNVVEVfVV0gPSBFQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX0xdID0gRUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX1VdID0gRUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0VHUkFWRV9MXSA9IEVHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfRUdSQVZFX1VdID0gRUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9FTVBUWV0gPSBFTVBUWTsKLQkJbmFtZXNbSWRzLklEX0VNU1BdID0gRU1TUDsKLQkJbmFtZXNbSWRzLklEX0VOU1BdID0gRU5TUDsKLQkJbmFtZXNbSWRzLklEX0VQU0lMT05fTF0gPSBFUFNJTE9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9FUFNJTE9OX1VdID0gRVBTSUxPTl9VOwotCQluYW1lc1tJZHMuSURfRVFVSVZdID0gRVFVSVY7Ci0JCW5hbWVzW0lkcy5JRF9FVEFfTF0gPSBFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0VUQV9VXSA9IEVUQV9VOwotCQluYW1lc1tJZHMuSURfRVRIX0xdID0gRVRIX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVEhfVV0gPSBFVEhfVTsKLQkJbmFtZXNbSWRzLklEX0VVTUxfTF0gPSBFVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVU1MX1VdID0gRVVNTF9VOwotCQluYW1lc1tJZHMuSURfRVVST10gPSBFVVJPOwotCQluYW1lc1tJZHMuSURfRVhJU1RdID0gRVhJU1Q7Ci0JCW5hbWVzW0lkcy5JRF9GTk9GXSA9IEZOT0Y7Ci0JCW5hbWVzW0lkcy5JRF9GT1JBTExdID0gRk9SQUxMOwotCQluYW1lc1tJZHMuSURfRlJBQzEyXSA9IEZSQUMxMjsKLQkJbmFtZXNbSWRzLklEX0ZSQUMxNF0gPSBGUkFDMTQ7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMzRdID0gRlJBQzM0OwotCQluYW1lc1tJZHMuSURfRlJBU0xdID0gRlJBU0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9MXSA9IEdBTU1BX0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9VXSA9IEdBTU1BX1U7Ci0JCW5hbWVzW0lkcy5JRF9HRV0gPSBHRTsKLQkJbmFtZXNbSWRzLklEX0dUXSA9IEdUOwotCQluYW1lc1tJZHMuSURfSEFSUl9MXSA9IEhBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0hBUlJfVV0gPSBIQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9IRUFSVFNdID0gSEVBUlRTOwotCQluYW1lc1tJZHMuSURfSEVMTElQXSA9IEhFTExJUDsKLQkJbmFtZXNbSWRzLklEX0lBQ1VURV9MXSA9IElBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfSUFDVVRFX1VdID0gSUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19MXSA9IElDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19VXSA9IElDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9JRVhDTF0gPSBJRVhDTDsKLQkJbmFtZXNbSWRzLklEX0lHUkFWRV9MXSA9IElHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfSUdSQVZFX1VdID0gSUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JTUFHRV0gPSBJTUFHRTsKLQkJbmFtZXNbSWRzLklEX0lORklOXSA9IElORklOOwotCQluYW1lc1tJZHMuSURfSU5UXSA9IElOVDsKLQkJbmFtZXNbSWRzLklEX0lPVEFfTF0gPSBJT1RBX0w7Ci0JCW5hbWVzW0lkcy5JRF9JT1RBX1VdID0gSU9UQV9VOwotCQluYW1lc1tJZHMuSURfSVFVRVNUXSA9IElRVUVTVDsKLQkJbmFtZXNbSWRzLklEX0lTSU5dID0gSVNJTjsKLQkJbmFtZXNbSWRzLklEX0lVTUxfTF0gPSBJVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9JVU1MX1VdID0gSVVNTF9VOwotCQluYW1lc1tJZHMuSURfS0FQUEFfTF0gPSBLQVBQQV9MOwotCQluYW1lc1tJZHMuSURfS0FQUEFfVV0gPSBLQVBQQV9VOwotCQluYW1lc1tJZHMuSURfTEFNQkRBX0xdID0gTEFNQkRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9MQU1CREFfVV0gPSBMQU1CREFfVTsKLQkJbmFtZXNbSWRzLklEX0xBTkddID0gTEFORzsKLQkJbmFtZXNbSWRzLklEX0xBUVVPXSA9IExBUVVPOwotCQluYW1lc1tJZHMuSURfTEFSUl9MXSA9IExBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0xBUlJfVV0gPSBMQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQ0VJTF0gPSBMQ0VJTDsKLQkJbmFtZXNbSWRzLklEX0xEUVVPXSA9IExEUVVPOwotCQluYW1lc1tJZHMuSURfTEVdID0gTEU7Ci0JCW5hbWVzW0lkcy5JRF9MRkxPT1JdID0gTEZMT09SOwotCQluYW1lc1tJZHMuSURfTE9XQVNUXSA9IExPV0FTVDsKLQkJbmFtZXNbSWRzLklEX0xPWl0gPSBMT1o7Ci0JCW5hbWVzW0lkcy5JRF9MUk1dID0gTFJNOwotCQluYW1lc1tJZHMuSURfTFNBUVVPXSA9IExTQVFVTzsKLQkJbmFtZXNbSWRzLklEX0xTUVVPXSA9IExTUVVPOwotCQluYW1lc1tJZHMuSURfTFRdID0gTFQ7Ci0JCW5hbWVzW0lkcy5JRF9NQUNSXSA9IE1BQ1I7Ci0JCW5hbWVzW0lkcy5JRF9NREFTSF0gPSBNREFTSDsKLQkJbmFtZXNbSWRzLklEX01JQ1JPXSA9IE1JQ1JPOwotCQluYW1lc1tJZHMuSURfTUlERE9UXSA9IE1JRERPVDsKLQkJbmFtZXNbSWRzLklEX01JTlVTXSA9IE1JTlVTOwotCQluYW1lc1tJZHMuSURfTVVfTF0gPSBNVV9MOwotCQluYW1lc1tJZHMuSURfTVVfVV0gPSBNVV9VOwotCQluYW1lc1tJZHMuSURfTkFCTEFdID0gTkFCTEE7Ci0JCW5hbWVzW0lkcy5JRF9OQlNQXSA9IE5CU1A7Ci0JCW5hbWVzW0lkcy5JRF9OREFTSF0gPSBOREFTSDsKLQkJbmFtZXNbSWRzLklEX05FXSA9IE5FOwotCQluYW1lc1tJZHMuSURfTkldID0gTkk7Ci0JCW5hbWVzW0lkcy5JRF9OT1RdID0gTk9UOwotCQluYW1lc1tJZHMuSURfTk9USU5dID0gTk9USU47Ci0JCW5hbWVzW0lkcy5JRF9OU1VCXSA9IE5TVUI7Ci0JCW5hbWVzW0lkcy5JRF9OVElMREVfTF0gPSBOVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX05USUxERV9VXSA9IE5USUxERV9VOwotCQluYW1lc1tJZHMuSURfTlVfTF0gPSBOVV9MOwotCQluYW1lc1tJZHMuSURfTlVfVV0gPSBOVV9VOwotCQluYW1lc1tJZHMuSURfT0FDVVRFX0xdID0gT0FDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PQUNVVEVfVV0gPSBPQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX09DSVJDX0xdID0gT0NJUkNfTDsKLQkJbmFtZXNbSWRzLklEX09DSVJDX1VdID0gT0NJUkNfVTsKLQkJbmFtZXNbSWRzLklEX09FTElHX0xdID0gT0VMSUdfTDsKLQkJbmFtZXNbSWRzLklEX09FTElHX1VdID0gT0VMSUdfVTsKLQkJbmFtZXNbSWRzLklEX09HUkFWRV9MXSA9IE9HUkFWRV9MOwotCQluYW1lc1tJZHMuSURfT0dSQVZFX1VdID0gT0dSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PTElORV0gPSBPTElORTsKLQkJbmFtZXNbSWRzLklEX09NRUdBX0xdID0gT01FR0FfTDsKLQkJbmFtZXNbSWRzLklEX09NRUdBX1VdID0gT01FR0FfVTsKLQkJbmFtZXNbSWRzLklEX09NSUNST05fTF0gPSBPTUlDUk9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9PTUlDUk9OX1VdID0gT01JQ1JPTl9VOwotCQluYW1lc1tJZHMuSURfT1BMVVNdID0gT1BMVVM7Ci0JCW5hbWVzW0lkcy5JRF9PUl0gPSBPUjsKLQkJbmFtZXNbSWRzLklEX09SREZdID0gT1JERjsKLQkJbmFtZXNbSWRzLklEX09SRE1dID0gT1JETTsKLQkJbmFtZXNbSWRzLklEX09TTEFTSF9MXSA9IE9TTEFTSF9MOwotCQluYW1lc1tJZHMuSURfT1NMQVNIX1VdID0gT1NMQVNIX1U7Ci0JCW5hbWVzW0lkcy5JRF9PVElMREVfTF0gPSBPVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX09USUxERV9VXSA9IE9USUxERV9VOwotCQluYW1lc1tJZHMuSURfT1RJTUVTXSA9IE9USU1FUzsKLQkJbmFtZXNbSWRzLklEX09VTUxfTF0gPSBPVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9PVU1MX1VdID0gT1VNTF9VOwotCQluYW1lc1tJZHMuSURfUEFSQV0gPSBQQVJBOwotCQluYW1lc1tJZHMuSURfUEFSVF0gPSBQQVJUOwotCQluYW1lc1tJZHMuSURfUEVSTUlMXSA9IFBFUk1JTDsKLQkJbmFtZXNbSWRzLklEX1BFUlBdID0gUEVSUDsKLQkJbmFtZXNbSWRzLklEX1BISV9MXSA9IFBISV9MOwotCQluYW1lc1tJZHMuSURfUEhJX1VdID0gUEhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9QSVZdID0gUElWOwotCQluYW1lc1tJZHMuSURfUElfTF0gPSBQSV9MOwotCQluYW1lc1tJZHMuSURfUElfVV0gPSBQSV9VOwotCQluYW1lc1tJZHMuSURfUExVU01OXSA9IFBMVVNNTjsKLQkJbmFtZXNbSWRzLklEX1BPVU5EXSA9IFBPVU5EOwotCQluYW1lc1tJZHMuSURfUFJJTUVfTF0gPSBQUklNRV9MOwotCQluYW1lc1tJZHMuSURfUFJJTUVfVV0gPSBQUklNRV9VOwotCQluYW1lc1tJZHMuSURfUFJPRF0gPSBQUk9EOwotCQluYW1lc1tJZHMuSURfUFJPUF0gPSBQUk9QOwotCQluYW1lc1tJZHMuSURfUFNJX0xdID0gUFNJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QU0lfVV0gPSBQU0lfVTsKLQkJbmFtZXNbSWRzLklEX1FVT1RdID0gUVVPVDsKLQkJbmFtZXNbSWRzLklEX1JBRElDXSA9IFJBRElDOwotCQluYW1lc1tJZHMuSURfUkFOR10gPSBSQU5HOwotCQluYW1lc1tJZHMuSURfUkFRVU9dID0gUkFRVU87Ci0JCW5hbWVzW0lkcy5JRF9SQVJSX0xdID0gUkFSUl9MOwotCQluYW1lc1tJZHMuSURfUkFSUl9VXSA9IFJBUlJfVTsKLQkJbmFtZXNbSWRzLklEX1JDRUlMXSA9IFJDRUlMOwotCQluYW1lc1tJZHMuSURfUkRRVU9dID0gUkRRVU87Ci0JCW5hbWVzW0lkcy5JRF9SRUFMXSA9IFJFQUw7Ci0JCW5hbWVzW0lkcy5JRF9SRUddID0gUkVHOwotCQluYW1lc1tJZHMuSURfUkZMT09SXSA9IFJGTE9PUjsKLQkJbmFtZXNbSWRzLklEX1JIT19MXSA9IFJIT19MOwotCQluYW1lc1tJZHMuSURfUkhPX1VdID0gUkhPX1U7Ci0JCW5hbWVzW0lkcy5JRF9STE1dID0gUkxNOwotCQluYW1lc1tJZHMuSURfUlNBUVVPXSA9IFJTQVFVTzsKLQkJbmFtZXNbSWRzLklEX1JTUVVPXSA9IFJTUVVPOwotCQluYW1lc1tJZHMuSURfU0JRVU9dID0gU0JRVU87Ci0JCW5hbWVzW0lkcy5JRF9TQ0FST05fTF0gPSBTQ0FST05fTDsKLQkJbmFtZXNbSWRzLklEX1NDQVJPTl9VXSA9IFNDQVJPTl9VOwotCQluYW1lc1tJZHMuSURfU0RPVF0gPSBTRE9UOwotCQluYW1lc1tJZHMuSURfU0VDVF0gPSBTRUNUOwotCQluYW1lc1tJZHMuSURfU0hZXSA9IFNIWTsKLQkJbmFtZXNbSWRzLklEX1NJR01BRl0gPSBTSUdNQUY7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9MXSA9IFNJR01BX0w7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9VXSA9IFNJR01BX1U7Ci0JCW5hbWVzW0lkcy5JRF9TSU1dID0gU0lNOwotCQluYW1lc1tJZHMuSURfU1BBREVTXSA9IFNQQURFUzsKLQkJbmFtZXNbSWRzLklEX1NVQl0gPSBTVUI7Ci0JCW5hbWVzW0lkcy5JRF9TVUJFXSA9IFNVQkU7Ci0JCW5hbWVzW0lkcy5JRF9TVU1dID0gU1VNOwotCQluYW1lc1tJZHMuSURfU1VQXSA9IFNVUDsKLQkJbmFtZXNbSWRzLklEX1NVUDFdID0gU1VQMTsKLQkJbmFtZXNbSWRzLklEX1NVUDJdID0gU1VQMjsKLQkJbmFtZXNbSWRzLklEX1NVUDNdID0gU1VQMzsKLQkJbmFtZXNbSWRzLklEX1NVUEVdID0gU1VQRTsKLQkJbmFtZXNbSWRzLklEX1NaTElHXSA9IFNaTElHOwotCQluYW1lc1tJZHMuSURfVEFVX0xdID0gVEFVX0w7Ci0JCW5hbWVzW0lkcy5JRF9UQVVfVV0gPSBUQVVfVTsKLQkJbmFtZXNbSWRzLklEX1RIRVJFNF0gPSBUSEVSRTQ7Ci0JCW5hbWVzW0lkcy5JRF9USEVUQVNZTV0gPSBUSEVUQVNZTTsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX0xdID0gVEhFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX1VdID0gVEhFVEFfVTsKLQkJbmFtZXNbSWRzLklEX1RISU5TUF0gPSBUSElOU1A7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9MXSA9IFRIT1JOX0w7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9VXSA9IFRIT1JOX1U7Ci0JCW5hbWVzW0lkcy5JRF9USUxERV0gPSBUSUxERTsKLQkJbmFtZXNbSWRzLklEX1RJTUVTXSA9IFRJTUVTOwotCQluYW1lc1tJZHMuSURfVFJBREVdID0gVFJBREU7Ci0JCW5hbWVzW0lkcy5JRF9VQUNVVEVfTF0gPSBVQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1VBQ1VURV9VXSA9IFVBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfVUFSUl9MXSA9IFVBUlJfTDsKLQkJbmFtZXNbSWRzLklEX1VBUlJfVV0gPSBVQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19MXSA9IFVDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19VXSA9IFVDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9VR1JBVkVfTF0gPSBVR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX1VHUkFWRV9VXSA9IFVHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfVU1MXSA9IFVNTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lIXSA9IFVQU0lIOwotCQluYW1lc1tJZHMuSURfVVBTSUxPTl9MXSA9IFVQU0lMT05fTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lMT05fVV0gPSBVUFNJTE9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9VVU1MX0xdID0gVVVNTF9MOwotCQluYW1lc1tJZHMuSURfVVVNTF9VXSA9IFVVTUxfVTsKLQkJbmFtZXNbSWRzLklEX1dFSUVSUF0gPSBXRUlFUlA7Ci0JCW5hbWVzW0lkcy5JRF9YSV9MXSA9IFhJX0w7Ci0JCW5hbWVzW0lkcy5JRF9YSV9VXSA9IFhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9ZQUNVVEVfTF0gPSBZQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1lBQ1VURV9VXSA9IFlBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfWUVOXSA9IFlFTjsKLQkJbmFtZXNbSWRzLklEX1lVTUxfTF0gPSBZVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9ZVU1MX1VdID0gWVVNTF9VOwotCQluYW1lc1tJZHMuSURfWkVUQV9MXSA9IFpFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1pFVEFfVV0gPSBaRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9aV0pdID0gWldKOwotCQluYW1lc1tJZHMuSURfWldOSl0gPSBaV05KOwotCX0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdmFsdWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCXZhbHVlcyA9IG5ldyBjaGFyW0lkcy5nZXROdW1PZklkcygpXTsKLQkJdmFsdWVzW0lkcy5JRF9BQUNVVEVfTF0gPSAyMjU7Ci0JCXZhbHVlc1tJZHMuSURfQUFDVVRFX1VdID0gMTkzOwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX0xdID0gMjI2OwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX1VdID0gMTk0OwotCQl2YWx1ZXNbSWRzLklEX0FDVVRFXSA9IDE4MDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19MXSA9IDIzMDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19VXSA9IDE5ODsKLQkJdmFsdWVzW0lkcy5JRF9BR1JBVkVfTF0gPSAyMjQ7Ci0JCXZhbHVlc1tJZHMuSURfQUdSQVZFX1VdID0gMTkyOwotCQl2YWx1ZXNbSWRzLklEX0FMRUZTWU1dID0gODUwMTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9MXSA9IDk0NTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9VXSA9IDkxMzsKLQkJdmFsdWVzW0lkcy5JRF9BTVBdID0gMzg7Ci0JCXZhbHVlc1tJZHMuSURfQU5EXSA9IDg3NDM7Ci0JCXZhbHVlc1tJZHMuSURfQU5HXSA9IDg3MzY7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfTF0gPSAyMjk7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfVV0gPSAxOTc7Ci0JCXZhbHVlc1tJZHMuSURfQVNZTVBdID0gODc3NjsKLQkJdmFsdWVzW0lkcy5JRF9BVElMREVfTF0gPSAyMjc7Ci0JCXZhbHVlc1tJZHMuSURfQVRJTERFX1VdID0gMTk1OwotCQl2YWx1ZXNbSWRzLklEX0FVTUxfTF0gPSAyMjg7Ci0JCXZhbHVlc1tJZHMuSURfQVVNTF9VXSA9IDE5NjsKLQkJdmFsdWVzW0lkcy5JRF9CRFFVT10gPSA4MjIyOwotCQl2YWx1ZXNbSWRzLklEX0JFVEFfTF0gPSA5NDY7Ci0JCXZhbHVlc1tJZHMuSURfQkVUQV9VXSA9IDkxNDsKLQkJdmFsdWVzW0lkcy5JRF9CUlZCQVJdID0gMTY2OwotCQl2YWx1ZXNbSWRzLklEX0JVTExdID0gODIyNjsKLQkJdmFsdWVzW0lkcy5JRF9DQVBdID0gODc0NTsKLQkJdmFsdWVzW0lkcy5JRF9DQ0VESUxfTF0gPSAyMzE7Ci0JCXZhbHVlc1tJZHMuSURfQ0NFRElMX1VdID0gMTk5OwotCQl2YWx1ZXNbSWRzLklEX0NFRElMXSA9IDE4NDsKLQkJdmFsdWVzW0lkcy5JRF9DRU5UXSA9IDE2MjsKLQkJdmFsdWVzW0lkcy5JRF9DSElfTF0gPSA5Njc7Ci0JCXZhbHVlc1tJZHMuSURfQ0hJX1VdID0gOTM1OwotCQl2YWx1ZXNbSWRzLklEX0NJUkNdID0gNzEwOwotCQl2YWx1ZXNbSWRzLklEX0NMVUJTXSA9IDk4Mjc7Ci0JCXZhbHVlc1tJZHMuSURfQ09OR10gPSA4NzczOwotCQl2YWx1ZXNbSWRzLklEX0NPUFldID0gMTY5OwotCQl2YWx1ZXNbSWRzLklEX0NSQVJSXSA9IDg2Mjk7Ci0JCXZhbHVlc1tJZHMuSURfQ1VQXSA9IDg3NDY7Ci0JCXZhbHVlc1tJZHMuSURfQ1VSUkVOXSA9IDE2NDsKLQkJdmFsdWVzW0lkcy5JRF9EQUdHRVJfTF0gPSA4MjI0OwotCQl2YWx1ZXNbSWRzLklEX0RBR0dFUl9VXSA9IDgyMjU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9MXSA9IDg1OTU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9VXSA9IDg2NTk7Ci0JCXZhbHVlc1tJZHMuSURfREVHXSA9IDE3NjsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9MXSA9IDk0ODsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9VXSA9IDkxNjsKLQkJdmFsdWVzW0lkcy5JRF9ESUFNU10gPSA5ODMwOwotCQl2YWx1ZXNbSWRzLklEX0RJVklERV0gPSAyNDc7Ci0JCXZhbHVlc1tJZHMuSURfRUFDVVRFX0xdID0gMjMzOwotCQl2YWx1ZXNbSWRzLklEX0VBQ1VURV9VXSA9IDIwMTsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19MXSA9IDIzNDsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19VXSA9IDIwMjsKLQkJdmFsdWVzW0lkcy5JRF9FR1JBVkVfTF0gPSAyMzI7Ci0JCXZhbHVlc1tJZHMuSURfRUdSQVZFX1VdID0gMjAwOwotCQl2YWx1ZXNbSWRzLklEX0VNUFRZXSA9IDg3MDk7Ci0JCXZhbHVlc1tJZHMuSURfRU1TUF0gPSA4MTk1OwotCQl2YWx1ZXNbSWRzLklEX0VOU1BdID0gODE5NDsKLQkJdmFsdWVzW0lkcy5JRF9FUFNJTE9OX0xdID0gOTQ5OwotCQl2YWx1ZXNbSWRzLklEX0VQU0lMT05fVV0gPSA5MTc7Ci0JCXZhbHVlc1tJZHMuSURfRVFVSVZdID0gODgwMTsKLQkJdmFsdWVzW0lkcy5JRF9FVEFfTF0gPSA5NTE7Ci0JCXZhbHVlc1tJZHMuSURfRVRBX1VdID0gOTE5OwotCQl2YWx1ZXNbSWRzLklEX0VUSF9MXSA9IDI0MDsKLQkJdmFsdWVzW0lkcy5JRF9FVEhfVV0gPSAyMDg7Ci0JCXZhbHVlc1tJZHMuSURfRVVNTF9MXSA9IDIzNTsKLQkJdmFsdWVzW0lkcy5JRF9FVU1MX1VdID0gMjAzOwotCQl2YWx1ZXNbSWRzLklEX0VVUk9dID0gODM2NDsKLQkJdmFsdWVzW0lkcy5JRF9FWElTVF0gPSA4NzA3OwotCQl2YWx1ZXNbSWRzLklEX0ZOT0ZdID0gNDAyOwotCQl2YWx1ZXNbSWRzLklEX0ZPUkFMTF0gPSA4NzA0OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMxMl0gPSAxODk7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzE0XSA9IDE4ODsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMzRdID0gMTkwOwotCQl2YWx1ZXNbSWRzLklEX0ZSQVNMXSA9IDgyNjA7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfTF0gPSA5NDc7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfVV0gPSA5MTU7Ci0JCXZhbHVlc1tJZHMuSURfR0VdID0gODgwNTsKLQkJdmFsdWVzW0lkcy5JRF9HVF0gPSA2MjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX0xdID0gODU5NjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX1VdID0gODY2MDsKLQkJdmFsdWVzW0lkcy5JRF9IRUFSVFNdID0gOTgyOTsKLQkJdmFsdWVzW0lkcy5JRF9IRUxMSVBdID0gODIzMDsKLQkJdmFsdWVzW0lkcy5JRF9JQUNVVEVfTF0gPSAyMzc7Ci0JCXZhbHVlc1tJZHMuSURfSUFDVVRFX1VdID0gMjA1OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX0xdID0gMjM4OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX1VdID0gMjA2OwotCQl2YWx1ZXNbSWRzLklEX0lFWENMXSA9IDE2MTsKLQkJdmFsdWVzW0lkcy5JRF9JR1JBVkVfTF0gPSAyMzY7Ci0JCXZhbHVlc1tJZHMuSURfSUdSQVZFX1VdID0gMjA0OwotCQl2YWx1ZXNbSWRzLklEX0lNQUdFXSA9IDg0NjU7Ci0JCXZhbHVlc1tJZHMuSURfSU5GSU5dID0gODczNDsKLQkJdmFsdWVzW0lkcy5JRF9JTlRdID0gODc0NzsKLQkJdmFsdWVzW0lkcy5JRF9JT1RBX0xdID0gOTUzOwotCQl2YWx1ZXNbSWRzLklEX0lPVEFfVV0gPSA5MjE7Ci0JCXZhbHVlc1tJZHMuSURfSVFVRVNUXSA9IDE5MTsKLQkJdmFsdWVzW0lkcy5JRF9JU0lOXSA9IDg3MTI7Ci0JCXZhbHVlc1tJZHMuSURfSVVNTF9MXSA9IDIzOTsKLQkJdmFsdWVzW0lkcy5JRF9JVU1MX1VdID0gMjA3OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX0xdID0gOTU0OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX1VdID0gOTIyOwotCQl2YWx1ZXNbSWRzLklEX0xBTUJEQV9MXSA9IDk1NTsKLQkJdmFsdWVzW0lkcy5JRF9MQU1CREFfVV0gPSA5MjM7Ci0JCXZhbHVlc1tJZHMuSURfTEFOR10gPSA5MDAxOwotCQl2YWx1ZXNbSWRzLklEX0xBUVVPXSA9IDE3MTsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX0xdID0gODU5MjsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX1VdID0gODY1NjsKLQkJdmFsdWVzW0lkcy5JRF9MQ0VJTF0gPSA4OTY4OwotCQl2YWx1ZXNbSWRzLklEX0xEUVVPXSA9IDgyMjA7Ci0JCXZhbHVlc1tJZHMuSURfTEVdID0gODgwNDsKLQkJdmFsdWVzW0lkcy5JRF9MRkxPT1JdID0gODk3MDsKLQkJdmFsdWVzW0lkcy5JRF9MT1dBU1RdID0gODcyNzsKLQkJdmFsdWVzW0lkcy5JRF9MT1pdID0gOTY3NDsKLQkJdmFsdWVzW0lkcy5JRF9MUk1dID0gODIwNjsKLQkJdmFsdWVzW0lkcy5JRF9MU0FRVU9dID0gODI0OTsKLQkJdmFsdWVzW0lkcy5JRF9MU1FVT10gPSA4MjE2OwotCQl2YWx1ZXNbSWRzLklEX0xUXSA9IDYwOwotCQl2YWx1ZXNbSWRzLklEX01BQ1JdID0gMTc1OwotCQl2YWx1ZXNbSWRzLklEX01EQVNIXSA9IDgyMTI7Ci0JCXZhbHVlc1tJZHMuSURfTUlDUk9dID0gMTgxOwotCQl2YWx1ZXNbSWRzLklEX01JRERPVF0gPSAxODM7Ci0JCXZhbHVlc1tJZHMuSURfTUlOVVNdID0gODcyMjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9MXSA9IDk1NjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9VXSA9IDkyNDsKLQkJdmFsdWVzW0lkcy5JRF9OQUJMQV0gPSA4NzExOwotCQl2YWx1ZXNbSWRzLklEX05CU1BdID0gMTYwOwotCQl2YWx1ZXNbSWRzLklEX05EQVNIXSA9IDgyMTE7Ci0JCXZhbHVlc1tJZHMuSURfTkVdID0gODgwMDsKLQkJdmFsdWVzW0lkcy5JRF9OSV0gPSA4NzE1OwotCQl2YWx1ZXNbSWRzLklEX05PVF0gPSAxNzI7Ci0JCXZhbHVlc1tJZHMuSURfTk9USU5dID0gODcxMzsKLQkJdmFsdWVzW0lkcy5JRF9OU1VCXSA9IDg4MzY7Ci0JCXZhbHVlc1tJZHMuSURfTlRJTERFX0xdID0gMjQxOwotCQl2YWx1ZXNbSWRzLklEX05USUxERV9VXSA9IDIwOTsKLQkJdmFsdWVzW0lkcy5JRF9OVV9MXSA9IDk1NzsKLQkJdmFsdWVzW0lkcy5JRF9OVV9VXSA9IDkyNTsKLQkJdmFsdWVzW0lkcy5JRF9PQUNVVEVfTF0gPSAyNDM7Ci0JCXZhbHVlc1tJZHMuSURfT0FDVVRFX1VdID0gMjExOwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX0xdID0gMjQ0OwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX1VdID0gMjEyOwotCQl2YWx1ZXNbSWRzLklEX09FTElHX0xdID0gMzM5OwotCQl2YWx1ZXNbSWRzLklEX09FTElHX1VdID0gMzM4OwotCQl2YWx1ZXNbSWRzLklEX09HUkFWRV9MXSA9IDI0MjsKLQkJdmFsdWVzW0lkcy5JRF9PR1JBVkVfVV0gPSAyMTA7Ci0JCXZhbHVlc1tJZHMuSURfT0xJTkVdID0gODI1NDsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9MXSA9IDk2OTsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9VXSA9IDkzNzsKLQkJdmFsdWVzW0lkcy5JRF9PTUlDUk9OX0xdID0gOTU5OwotCQl2YWx1ZXNbSWRzLklEX09NSUNST05fVV0gPSA5Mjc7Ci0JCXZhbHVlc1tJZHMuSURfT1BMVVNdID0gODg1MzsKLQkJdmFsdWVzW0lkcy5JRF9PUl0gPSA4NzQ0OwotCQl2YWx1ZXNbSWRzLklEX09SREZdID0gMTcwOwotCQl2YWx1ZXNbSWRzLklEX09SRE1dID0gMTg2OwotCQl2YWx1ZXNbSWRzLklEX09TTEFTSF9MXSA9IDI0ODsKLQkJdmFsdWVzW0lkcy5JRF9PU0xBU0hfVV0gPSAyMTY7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTERFX0xdID0gMjQ1OwotCQl2YWx1ZXNbSWRzLklEX09USUxERV9VXSA9IDIxMzsKLQkJdmFsdWVzW0lkcy5JRF9PVElNRVNdID0gODg1NTsKLQkJdmFsdWVzW0lkcy5JRF9PVU1MX0xdID0gMjQ2OwotCQl2YWx1ZXNbSWRzLklEX09VTUxfVV0gPSAyMTQ7Ci0JCXZhbHVlc1tJZHMuSURfUEFSQV0gPSAxODI7Ci0JCXZhbHVlc1tJZHMuSURfUEFSVF0gPSA4NzA2OwotCQl2YWx1ZXNbSWRzLklEX1BFUk1JTF0gPSA4MjQwOwotCQl2YWx1ZXNbSWRzLklEX1BFUlBdID0gODg2OTsKLQkJdmFsdWVzW0lkcy5JRF9QSElfTF0gPSA5NjY7Ci0JCXZhbHVlc1tJZHMuSURfUEhJX1VdID0gOTM0OwotCQl2YWx1ZXNbSWRzLklEX1BJVl0gPSA5ODI7Ci0JCXZhbHVlc1tJZHMuSURfUElfTF0gPSA5NjA7Ci0JCXZhbHVlc1tJZHMuSURfUElfVV0gPSA5Mjg7Ci0JCXZhbHVlc1tJZHMuSURfUExVU01OXSA9IDE3NzsKLQkJdmFsdWVzW0lkcy5JRF9QT1VORF0gPSAxNjM7Ci0JCXZhbHVlc1tJZHMuSURfUFJJTUVfTF0gPSA4MjQyOwotCQl2YWx1ZXNbSWRzLklEX1BSSU1FX1VdID0gODI0MzsKLQkJdmFsdWVzW0lkcy5JRF9QUk9EXSA9IDg3MTk7Ci0JCXZhbHVlc1tJZHMuSURfUFJPUF0gPSA4NzMzOwotCQl2YWx1ZXNbSWRzLklEX1BTSV9MXSA9IDk2ODsKLQkJdmFsdWVzW0lkcy5JRF9QU0lfVV0gPSA5MzY7Ci0JCXZhbHVlc1tJZHMuSURfUVVPVF0gPSAzNDsKLQkJdmFsdWVzW0lkcy5JRF9SQURJQ10gPSA4NzMwOwotCQl2YWx1ZXNbSWRzLklEX1JBTkddID0gOTAwMjsKLQkJdmFsdWVzW0lkcy5JRF9SQVFVT10gPSAxODc7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9MXSA9IDg1OTQ7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9VXSA9IDg2NTg7Ci0JCXZhbHVlc1tJZHMuSURfUkNFSUxdID0gODk2OTsKLQkJdmFsdWVzW0lkcy5JRF9SRFFVT10gPSA4MjIxOwotCQl2YWx1ZXNbSWRzLklEX1JFQUxdID0gODQ3NjsKLQkJdmFsdWVzW0lkcy5JRF9SRUddID0gMTc0OwotCQl2YWx1ZXNbSWRzLklEX1JGTE9PUl0gPSA4OTcxOwotCQl2YWx1ZXNbSWRzLklEX1JIT19MXSA9IDk2MTsKLQkJdmFsdWVzW0lkcy5JRF9SSE9fVV0gPSA5Mjk7Ci0JCXZhbHVlc1tJZHMuSURfUkxNXSA9IDgyMDc7Ci0JCXZhbHVlc1tJZHMuSURfUlNBUVVPXSA9IDgyNTA7Ci0JCXZhbHVlc1tJZHMuSURfUlNRVU9dID0gODIxNzsKLQkJdmFsdWVzW0lkcy5JRF9TQlFVT10gPSA4MjE4OwotCQl2YWx1ZXNbSWRzLklEX1NDQVJPTl9MXSA9IDM1MzsKLQkJdmFsdWVzW0lkcy5JRF9TQ0FST05fVV0gPSAzNTI7Ci0JCXZhbHVlc1tJZHMuSURfU0RPVF0gPSA4OTAxOwotCQl2YWx1ZXNbSWRzLklEX1NFQ1RdID0gMTY3OwotCQl2YWx1ZXNbSWRzLklEX1NIWV0gPSAxNzM7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFGXSA9IDk2MjsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9MXSA9IDk2MzsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9VXSA9IDkzMTsKLQkJdmFsdWVzW0lkcy5JRF9TSU1dID0gODc2NDsKLQkJdmFsdWVzW0lkcy5JRF9TUEFERVNdID0gOTgyNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJdID0gODgzNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJFXSA9IDg4Mzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VNXSA9IDg3MjE7Ci0JCXZhbHVlc1tJZHMuSURfU1VQXSA9IDg4MzU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMV0gPSAxODU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMl0gPSAxNzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VQM10gPSAxNzk7Ci0JCXZhbHVlc1tJZHMuSURfU1VQRV0gPSA4ODM5OwotCQl2YWx1ZXNbSWRzLklEX1NaTElHXSA9IDIyMzsKLQkJdmFsdWVzW0lkcy5JRF9UQVVfTF0gPSA5NjQ7Ci0JCXZhbHVlc1tJZHMuSURfVEFVX1VdID0gOTMyOwotCQl2YWx1ZXNbSWRzLklEX1RIRVJFNF0gPSA4NzU2OwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBU1lNXSA9IDk3NzsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9MXSA9IDk1MjsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9VXSA9IDkyMDsKLQkJdmFsdWVzW0lkcy5JRF9USElOU1BdID0gODIwMTsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9MXSA9IDI1NDsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9VXSA9IDIyMjsKLQkJdmFsdWVzW0lkcy5JRF9USUxERV0gPSA3MzI7Ci0JCXZhbHVlc1tJZHMuSURfVElNRVNdID0gMjE1OwotCQl2YWx1ZXNbSWRzLklEX1RSQURFXSA9IDg0ODI7Ci0JCXZhbHVlc1tJZHMuSURfVUFDVVRFX0xdID0gMjUwOwotCQl2YWx1ZXNbSWRzLklEX1VBQ1VURV9VXSA9IDIxODsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX0xdID0gODU5MzsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX1VdID0gODY1NzsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19MXSA9IDI1MTsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19VXSA9IDIxOTsKLQkJdmFsdWVzW0lkcy5JRF9VR1JBVkVfTF0gPSAyNDk7Ci0JCXZhbHVlc1tJZHMuSURfVUdSQVZFX1VdID0gMjE3OwotCQl2YWx1ZXNbSWRzLklEX1VNTF0gPSAxNjg7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUhdID0gOTc4OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lMT05fTF0gPSA5NjU7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUxPTl9VXSA9IDkzMzsKLQkJdmFsdWVzW0lkcy5JRF9VVU1MX0xdID0gMjUyOwotCQl2YWx1ZXNbSWRzLklEX1VVTUxfVV0gPSAyMjA7Ci0JCXZhbHVlc1tJZHMuSURfV0VJRVJQXSA9IDg0NzI7Ci0JCXZhbHVlc1tJZHMuSURfWElfTF0gPSA5NTg7Ci0JCXZhbHVlc1tJZHMuSURfWElfVV0gPSA5MjY7Ci0JCXZhbHVlc1tJZHMuSURfWUFDVVRFX0xdID0gMjUzOwotCQl2YWx1ZXNbSWRzLklEX1lBQ1VURV9VXSA9IDIyMTsKLQkJdmFsdWVzW0lkcy5JRF9ZRU5dID0gMTY1OwotCQl2YWx1ZXNbSWRzLklEX1lVTUxfTF0gPSAyNTU7Ci0JCXZhbHVlc1tJZHMuSURfWVVNTF9VXSA9IDM3NjsKLQkJdmFsdWVzW0lkcy5JRF9aRVRBX0xdID0gOTUwOwotCQl2YWx1ZXNbSWRzLklEX1pFVEFfVV0gPSA5MTg7Ci0JCXZhbHVlc1tJZHMuSURfWldKXSA9IDgyMDU7Ci0JCXZhbHVlc1tJZHMuSURfWldOSl0gPSA4MjA0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbnRpdHlDb2xsZWN0aW9uKCkgewotCQlzdXBlcihuYW1lcywgU1RSSUNUX0NBU0UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBlbnRpdHkgZGVjbGFyYXRpb24uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQoZW50aXR5TmFtZSk7Ci0JCWlmIChpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHZhbHVlID0gU3RyaW5nLnZhbHVlT2YodmFsdWVzW2lkXSk7Ci0JCUhUTUxFbnRpdHlEZWNsSW1wbCBkZWMgPSBuZXcgSFRNTEVudGl0eURlY2xJbXBsKGVudGl0eU5hbWUsIHZhbHVlKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSENNRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IQ01Eb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYTIzM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IQ01Eb2NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENNRG9jdW1lbnQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBIVE1MLgotICovCi1jbGFzcyBIQ01Eb2NJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxDTURvY3VtZW50IHsKLQotCS8qKiBOYW1lc3BhY2UgZm9yIGFsbCBuYW1lcyBvZiBlbGVtZW50cywgZW50aXRpZXMgYW5kIGF0dHJpYnV0ZXMuICovCi0JcHJpdmF0ZSBDTU5hbWVzcGFjZUltcGwgbmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRzID0gbnVsbDsKLQlwcml2YXRlIEVudGl0eUNvbGxlY3Rpb24gZW50aXRpZXMgPSBudWxsOwotCXByaXZhdGUgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIQ01Eb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2VJbXBsIHRhcmdldE5hbWVzcGFjZSkgewotCQlzdXBlcihkb2NUeXBlTmFtZSk7Ci0JCW5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVDb2xsZWN0aW9uKCk7Ci0JCWVsZW1lbnRzID0gbmV3IEVsZW1lbnRDb2xsZWN0aW9uKGF0dHJpYnV0ZXMpOwotCQllbnRpdGllcyA9IG5ldyBFbnRpdHlDb2xsZWN0aW9uKCk7Ci0JfQotCi0JQXR0cmlidXRlQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gZW50aXRpZXM7Ci0JfQotCi0JcHVibGljIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiBnZXRFbnRpdHlEZWNsYXJhdGlvbihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlpZiAoZW50aXRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbnRpdHlEZWNsYXJhdGlvbikgZW50aXRpZXMuZ2V0TmFtZWRJdGVtKGVudGl0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQXR0ckRlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyRGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5MzhlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyRGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gY2xhc3Mgb2Yge0BsaW5rIDxjb2RlPkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjwvY29kZT59IGludGVyZmFjZS48YnI+Ci0gKi8KLWNsYXNzIEhUTUxBdHRyRGVjbEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgSFRNTENNRGF0YVR5cGVJbXBsIHR5cGUgPSBudWxsOwotCXByaXZhdGUgaW50IHVzYWdlID0gMDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MQXR0ckRlY2xJbXBsKFN0cmluZyBhdHRyTmFtZSwgSFRNTENNRGF0YVR5cGVJbXBsIHZhbHVlVHlwZSwgaW50IHZhbHVlVXNhZ2UpIHsKLQkJc3VwZXIoYXR0ck5hbWUpOwotCQl0aGlzLnR5cGUgPSB2YWx1ZVR5cGU7Ci0KLQkJc3dpdGNoICh2YWx1ZVVzYWdlKSB7Ci0JCQljYXNlIE9QVElPTkFMIDoKLQkJCWNhc2UgUkVRVUlSRUQgOgotCQkJY2FzZSBGSVhFRCA6Ci0JCQljYXNlIFBST0hJQklURUQgOgotCQkJCXRoaXMudXNhZ2UgPSB2YWx1ZVVzYWdlOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gc2hvdWxkIHdhcm4uLi4KLQkJCQl0aGlzLnVzYWdlID0gT1BUSU9OQUw7IC8vIGZhbGwgYmFjawotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0ck5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0clR5cGUgbWV0aG9kCi0JICogQHJldHVybiBDTURhdGFUeXBlCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGJ5IHN1cGVyaW50ZXJmYWNlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCWlmICh0eXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSAhPSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBieSBzdXBlcmludGVyZmFjZQotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QodHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkpKTsKLQkJcmV0dXJuIHYuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgR1JPVVAsIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiB1c2FnZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU0NSSVBUQUJMRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NDUklQVEFCTEUpKSB7Ci0JCQlyZXR1cm4gZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSA9PSBIVE1MQ01EYXRhVHlwZS5TQ1JJUFQgPyBuZXcgQm9vbGVhbih0cnVlKSA6IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ZGM1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBiZSBhIHB1YmxpYyBpbnRlcmZhY2Ugd2hpY2ggaGFzCi0gKiBpbnRlcmZhY2VzIGRlZmluZWQgaW4gYm90aCBvZiB7QGxpbmsgPGNvZGU+Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbjwvY29kZT59Ci0gKiBhbmQge0BsaW5rIDxjb2RlPkhUTUxDTU5vZGU8L2NvZGU+fS48YnI+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGV4dGVuZHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhMGI4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEhUTUwgZXh0ZW5zaW9uIGZvciBkYXRhIHR5cGVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxDTURhdGFUeXBlIGV4dGVuZHMgQ01EYXRhVHlwZSB7Ci0KLQkvKiogQm9vbGVhbjsgaXQgc2hvdWxkIGJlIGRlZmluZWQgaW4gQ01EYXRhVHlwZS4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOID0gIkJPT0xFQU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1IgPSAiQ09MT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlQgPSAiRVZFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTID0gIklEUkVGUyI7IC8vJE5PTi1OTFMtMSQKLQkvKiogTmFtZTsgaXQgc2hvdWxkIGJlIGRlZmluZWQgaW4gQ01EYXRhVHlwZS4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIk5BTUUiOyAvLyROT04tTkxTLTEkCi0JLy8gRm9sbG93aW5nIHR5cGVzIGFyZSBqdXN0IGFsaWFzZXMuCi0JLyoqICVDaGFyYWN0ZXI7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUkFDVEVSID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUNoYXJzZXQ7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUlNFVCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVDaGFyc2V0czsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUUyA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVDb250ZW50VHlwZTsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlQ29vcmRzOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPT1JEUyA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVEYXRldGltZTsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFVElNRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVGcmFtZVRhcmdldDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFNRV9UQVJHRVQgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTGFuZ3VhZ2VDb2RlOyA9PSBOQU1FICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR1VBR0VfQ09ERSA9IE5BTUU7Ci0JLyoqICVMZW5ndGg7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVOR1RIID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUxpbmtUeXBlczsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX1RZUEVTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUxJU3R5bGU7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElfU1RZTEUgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTWVkaWFEZXNjOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX0RFU0MgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTXVsdGlMZW5ndGg7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElfTEVOR1RIID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJU9MU3R5bGU7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xfU1RZTEUgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlUGl4bGVzOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJWEVMUyA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVTY3JpcHQ7ID09IEVWRU5UICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUID0gRVZFTlQ7Ci0JLyoqICVTdHlsZVNoZWV0OyA9PSBFVkVOVCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFX1NIRUVUID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJVRleHQ7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1MGM3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIEhUTUxDTURhdGFUeXBlSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQ01EYXRhVHlwZSB7Ci0KLQlwcml2YXRlIGludCBpbXBsaWVkVmFsdWVLaW5kID0gSU1QTElFRF9WQUxVRV9OT05FOwotCXByaXZhdGUgU3RyaW5nIGltcGxpZWRWYWx1ZSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gZW1wdHlBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0JcHJpdmF0ZSBTdHJpbmdbXSBlbnVtVmFsdWVzID0gZW1wdHlBcnJheTsKLQlwcml2YXRlIFN0cmluZyBpbnN0YW5jZVZhbHVlID0gbnVsbDsKLQotCS8qKgotCSAqIEhUTUxDTURhdGFUeXBlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBubSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxDTURhdGFUeXBlSW1wbChTdHJpbmcgdHlwZU5hbWUpIHsKLQkJc3VwZXIodHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEhUTUxDTURhdGFUeXBlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBubSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxDTURhdGFUeXBlSW1wbChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN1cGVyKHR5cGVOYW1lKTsKLQkJdGhpcy5pbnN0YW5jZVZhbHVlID0gaW5zdGFuY2VWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YSB0eXBlIGlzIGNyZWF0ZWQuCi0JICogVGhpcyByZXR1cm5zIG51bGwgb2YgYSBzdWl0YWJsZSBkZWZhdWx0IGlzIG5vdCBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpIHsKLQkJcmV0dXJuIGVudW1WYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nICAKLQkgKgotCSAqIFJldHVybnMgdGhlIGltcGxpZWQgdmFsdWUgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGltcGxpZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0JICovCi0JcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQlyZXR1cm4gaW1wbGllZFZhbHVlS2luZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRFbnVtVmFsdWVzKFN0cmluZ1tdIHZhbHVlcykgewotCQllbnVtVmFsdWVzID0gbmV3IFN0cmluZ1t2YWx1ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWVudW1WYWx1ZXNbaV0gPSB2YWx1ZXNbaV07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwYWNrYWdlIHNjb3BlLgotCSAqLwotCXZvaWQgc2V0SW1wbGllZFZhbHVlKGludCBraW5kLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElNUExJRURfVkFMVUVfRklYRUQgOgotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQgOgotCQkJCWltcGxpZWRWYWx1ZUtpbmQgPSBraW5kOwotCQkJCWltcGxpZWRWYWx1ZSA9IHZhbHVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX05PTkUgOgotCQkJZGVmYXVsdCA6Ci0JCQkJaW1wbGllZFZhbHVlS2luZCA9IElNUExJRURfVkFMVUVfTk9ORTsKLQkJCQlpbXBsaWVkVmFsdWUgPSBudWxsOyAvLyBtYXliZSBhIG51bGwgc3RyaW5nPwotCQkJCWJyZWFrOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjZjN2Q5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotCi0KLS8qKgotICogSFRNTCBleHRlbnNpb24gZm9yIENNRG9jdW1lbnQuCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBzb21lIHNob3J0IGhhbmQgbWV0aG9kcyB0byBnZXQgZGVjbGFyYXRpb25zCi0gKiBieSBhIG5hbWUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTENNRG9jdW1lbnQgZXh0ZW5kcyBDTURvY3VtZW50IHsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGEgZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgYSBIVE1MIGVsZW1lbnQuPGJyPgotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKTsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGEgZW50aXR5IGRlY2xhcmF0aW9uIG9mIEhUTUwgZG9jdW1lbnRzLjxicj4KLQkgKiBAcGFyYW0gZW50aXR5TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODMxNmVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWwuQ0hDTURvY0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotCi0vKioKLSAqIElOb2RlQWRhcHRlciBmYWN0b3J5IGZvciBIVE1MIGFuZCBKU1AgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSFRNTENNRG9jdW1lbnRGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBjbWRvY3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBzdXBwb3J0ZWRDTXR5cGVzID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117Q01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUsIENNRG9jVHlwZS5DSFRNTF9ET0NfVFlQRSwgQ01Eb2NUeXBlLkpTUDExX0RPQ19UWVBFLCBDTURvY1R5cGUuSlNQMTJfRE9DX1RZUEUsIENNRG9jVHlwZS5KU1AyMF9ET0NfVFlQRSwgQ01Eb2NUeXBlLlRBRzIwX0RPQ19UWVBFfSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBKQ01Eb2NJbXBsIGpzcDExZG9jID0gbnVsbDsKLQotCS8qKgotCSAqIEhUTUxDTUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgSFRNTENNRG9jdW1lbnRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICogQHBhcmFtIGNtdHlwZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBjbXR5cGUpIHsKLQkJT2JqZWN0IG9iaiA9IGNtZG9jcy5nZXQoY210eXBlKTsKLQkJaWYgKG9iaiA9PSBudWxsICYmIGNtdHlwZSAhPSBudWxsKSB7Ci0JCQlpZiAoc3VwcG9ydGVkQ010eXBlcy5jb250YWlucyhjbXR5cGUpKSB7Ci0JCQkJb2JqID0gZG9DcmVhdGVDTURvY3VtZW50KGNtdHlwZSk7Ci0JCQkJY21kb2NzLnB1dChjbXR5cGUsIG9iaik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKENNRG9jdW1lbnQpIG9iajsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZG9DcmVhdGVDTURvY3VtZW50KFN0cmluZyBjbXR5cGUpIHsKLQkJaWYgKENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFLmVxdWFscyhjbXR5cGUpKSB7Ci0JCQlDTU5hbWVzcGFjZUltcGwgaDQwbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKEhUTUw0ME5hbWVzcGFjZS5IVE1MNDBfVVJJLCBIVE1MNDBOYW1lc3BhY2UuSFRNTDQwX1RBR19QUkVGSVgpOwotCQkJSENNRG9jSW1wbCBodG1sNDBkb2MgPSBuZXcgSENNRG9jSW1wbChDTURvY1R5cGUuSFRNTF9ET0NfVFlQRSwgaDQwbnMpOwotCQkJcmV0dXJuIGh0bWw0MGRvYzsKLQkJfQotCi0JCWVsc2UgaWYgKENNRG9jVHlwZS5KU1AyMF9ET0NfVFlQRS5lcXVhbHMoY210eXBlKSkgewotCQkJQ01OYW1lc3BhY2VJbXBsIGoyMG5zID0gbmV3IENNTmFtZXNwYWNlSW1wbChKU1AyME5hbWVzcGFjZS5KU1AyMF9VUkksIEpTUDExTmFtZXNwYWNlLkpTUF9UQUdfUFJFRklYKTsKLQkJCUpDTTIwRG9jSW1wbCBqc3AyMGRvYyA9IG5ldyBKQ00yMERvY0ltcGwoQ01Eb2NUeXBlLkpTUDIwX0RPQ19UWVBFLCBqMjBucyk7Ci0JCQlyZXR1cm4ganNwMjBkb2M7Ci0JCX0KLQotCQllbHNlIGlmIChDTURvY1R5cGUuVEFHMjBfRE9DX1RZUEUuZXF1YWxzKGNtdHlwZSkpIHsKLQkJCUNNTmFtZXNwYWNlSW1wbCBqMjBucyA9IG5ldyBDTU5hbWVzcGFjZUltcGwoSlNQMjBOYW1lc3BhY2UuSlNQMjBfVVJJLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0JCQlUYWdDTURvY0ltcGwgdGFnMjBkb2MgPSBuZXcgVGFnQ01Eb2NJbXBsKENNRG9jVHlwZS5UQUcyMF9ET0NfVFlQRSwgajIwbnMpOwotCQkJcmV0dXJuIHRhZzIwZG9jOwotCQl9Ci0KLQkJZWxzZSBpZiAoQ01Eb2NUeXBlLkpTUDExX0RPQ19UWVBFLmVxdWFscyhjbXR5cGUpIHx8IENNRG9jVHlwZS5KU1AxMl9ET0NfVFlQRS5lcXVhbHMoY210eXBlKSkgewotCQkJaWYgKGpzcDExZG9jID09IG51bGwpIHsKLQkJCQlDTU5hbWVzcGFjZUltcGwgajExbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKEpTUDExTmFtZXNwYWNlLkpTUDExX1VSSSwgSlNQMTFOYW1lc3BhY2UuSlNQX1RBR19QUkVGSVgpOwotCQkJCWpzcDExZG9jID0gbmV3IEpDTURvY0ltcGwoQ01Eb2NUeXBlLkpTUDExX0RPQ19UWVBFLCBqMTFucyk7Ci0JCQl9Ci0JCQlyZXR1cm4ganNwMTFkb2M7Ci0JCX0KLQotCQllbHNlIGlmIChDTURvY1R5cGUuQ0hUTUxfRE9DX1RZUEUuZXF1YWxzKGNtdHlwZSkpIHsKLQkJCUNNTmFtZXNwYWNlSW1wbCBjSDQwbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKEhUTUw0ME5hbWVzcGFjZS5IVE1MNDBfVVJJLCBIVE1MNDBOYW1lc3BhY2UuSFRNTDQwX1RBR19QUkVGSVgpOwotCQkJQ0hDTURvY0ltcGwgY2h0bWxkb2MgPSBuZXcgQ0hDTURvY0ltcGwoQ01Eb2NUeXBlLkNIVE1MX0RPQ19UWVBFLCBjSDQwbnMpOwotCQkJcmV0dXJuIGNodG1sZG9jOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2MjNlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0vKioKLSAqIEluIEhUTUwgRG9jdW1lbnRzLCBuYW1lIGFuZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkKLSAqIHNob3VsZCBiZSB0cmVhdGVkIGlnbm9yaW5nIHRoZWlycyBjYXNlLiAgSG93ZXZlciwgaW4gWE1MIGRvY3VtZW50cywKLSAqIHRoZXkgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQgd2l0aCBzZW5zaXRpdmVuZXNzIG9mIHRoZWlyIGNhc2UuCi0gKiBDTU5vZGUgaXMgYmFzaWNhbGx5IGRlc2lnbmVkIHRvIHJlcHJlc2VudCBEVERzIG9yIFNjaGVtYXMgZm9yIFhNTAotICogZG9jdW1lbnRzLiAgU28sIGl0IGRvZXNuJ3QgaGF2ZSBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBIb3dldmVyLCBkZWNsYXJhdGlvbnMgaW4gdGhlIEhUTUwgQ00gc2hvdWxkIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbi4KLSAqIFRoaXMgaW50ZXJtZWRpYXRlIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHdoZXRoZXIgaWdub3JlIGNhc2VzCi0gKiBvciBub3QuPGJyPgotICovCi1pbnRlcmZhY2UgSFRNTENNTm9kZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlIHsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmIGRlY2xhcmF0aW9uIGlzIGZvciBIVE1MIGF0dHJpYnV0ZS9lbGVtZW50L2VudGl0eS4KLQkgKiBPdGhlcndpc2UsIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbURlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbGVtRGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiMTQ3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbGVtRGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIEhlZD8/Pz8gY2xhc3Nlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSFRNTEVsZW1EZWNsSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uLCBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiB7Ci0KLQkvLyBEVEQKLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWTsKLQkvKiogTmV2ZXIgYWNjZXNzIHRoaXMgZmllbGQgZGlyZWN0bHkuICBJbnN0ZWFkLCB1c2UgZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uIG1ldGhvZC4gKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGluY2x1c2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGV4Y2x1c2lvbiA9IG51bGw7Ci0JLy8gYWR2YW5jZWQgaW5mb3JtYXRpb24KLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZEFuY2VzdG9ycyA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBjb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IGZvcm1hdFR5cGUgPSBGT1JNQVRfSFRNTDsKLQlwcm90ZWN0ZWQgaW50IGxheW91dFR5cGUgPSBMQVlPVVRfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IG9taXRUeXBlID0gT01JVF9OT05FOwotCXByb3RlY3RlZCBib29sZWFuIGtlZXBTcGFjZXMgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmRlbnRDaGlsZCA9IGZhbHNlOwotCXByb3RlY3RlZCBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlQ29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBDTU5hbWVkTm9kZU1hcCBFTVBUWV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXAoKSB7Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCX0KLQkJCX07Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogSFRNTEVsZW1EZWNsSW1wbCBjb25zdHJ1Y3Rvci4KLQkgKiBJbiB0aGUgSFRNTCBEVEQsIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaGFzIG5vIHNwZWNpZmljYXRpb24KLQkgKiBmb3IgaXRzIG9jY3VycmVuY2UuICBPY2N1cnJlbmNlIGlzIHNwZWNpZmVkIGluIGNvbnRlbnQgbW9kZWwsIGxpa2UKLQkgKiA8Y29kZT4oTEkpKzwvY29kZT4uICBUbyBhdm9pZCBjb25mdXNpb24gKGFuZCBjb21wbGV4aXR5KSwKLQkgKiBvY2N1cnJlbmNlIG9mIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgYWx3YXlzIDEgKGl0IG1lYW5zLCBtaW4gPSAxIGFuZAotCSAqIG1heCA9IDEpLiAgSW5zdGVhZCwgb2NjdXJyZW5jZSBvZiBDTUdyb3VwIHJlcHJlc2VudHMgYWN0dWFsIG9jY3VycmVuY2UKLQkgKiBvZiB0aGUgY29udGVudC4KLQkgKiA8YnI+Ci0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MRWxlbURlY2xJbXBsKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgMSwgMSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb24uZ2V0QXR0cmlidXRlQ29sbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBKSB8fCB0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFkpIHx8IHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEEpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsIGVycm9yLgotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBmYWN0b3J5LmNyZWF0ZVR5cGVEZWZpbml0aW9uKHR5cGVEZWZpbml0aW9uTmFtZSwgZWxlbWVudENvbGxlY3Rpb24pOwotCQlyZXR1cm4gZGVmOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZQotCQl9Ci0KLQkJQ01Ob2RlIGNtbm9kZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJaWYgKGNtbm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb24gPT0gbnVsbCkKLQkJCXR5cGVEZWZpbml0aW9uID0gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCXJldHVybiB0eXBlRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbHdheXMgcmV0dXJuIG51bGwuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyB0cmllcyB0byBjcmVhdGUgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotCSAqIGluc3RhbmNlIGFuZCBhY2Nlc3MgdG8gaXQuCi0JICogPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnQoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnRUeXBlKCkgOiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24jZ2V0Q29ycmVjdGlvblR5cGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvcnJlY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gY29ycmVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogSFRNTCBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZGF0YSB0eXBlLiAgU28sIHRoaXMgbWV0aG9kIGFsd2F5cwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBleGNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgZXhjbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBmb3JtYXQgdHlwZSBpcyA8Y29kZT5GT1JNQVRfSFRNTDwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIGZvcm1hdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogSW5jbHVzaW9uLgotCSAqIEFsbW9zdCBlbGVtZW50cyBkb24ndCBoYXZlIGEgaW5jbHVzaW9uLgotCSAqIE9ubHkgY2xhc3NlcyB0aG9zZSBoYXZlIGluY2x1c2lvbiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRJbmNsdXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGF5b3V0VHlwZSgpIHsKLQkJcmV0dXJuIGxheW91dFR5cGU7Ci0JfQotCi0JLyoqCi0JICogTGluZSBicmVhayBoaW50IGlzIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbGF5b3V0IHR5cGUuCi0JICogSW5kZWVkLCBpbiB0aGUgQysrRE9NLCBpdCBpcyBkZXRlcm1pbmVkIGZyb20gbGF5b3V0IHR5cGUgb25seS4KLQkgKiBTbywgdGhpcyBpbXBsZW1lbnRhdGlvbiwgYXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBkZWNsYXJhdGlvbnMsCi0JICogYWxzbyBkZXRlcm1pbmVzIGZyb20gbGF5b3V0IHR5cGUgb25seS48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVCcmVha0hpbnQoKSB7Ci0JCXN3aXRjaCAoZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JMT0NLIDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORDsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vIEhUTUwgZWxlbWVudCBoYXMgbG9jYWwgZWxlbWVudHMuICBTbywgdGhpcyBtZXRob2QgYWx3YXlzCi0JICogcmV0dXJucyBhbiBlbXB0eSBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9taXRUeXBlKCkgewotCQlyZXR1cm4gb21pdFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKGRlZiAhPSBudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHBwID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHBwLnN1cHBvcnRzKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldFByaW1hcnlDYW5kaWRhdGUoKSA6IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHBwLmdldCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBlbGVtZW50IG5hbWVzIHdoaWNoIHRlcm1pbmF0ZXMgdGhpcyBlbGVtZW50Ljxicj4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRydWUgd2hlbiB0aGUgZWxlbWVudCBpcyBhIEpTUCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW4gc29tZSBlbGVtZW50cywgc3VjaCBhcyBBUFBMRVQsIGEgc291cmNlIGdlbmVyYXRvciBzaG91bGQgaW5kZW50IGNoaWxkCi0JICogZWxlbWVudHMgdGhhdCB0aGVpciBwYXJlbnRzLiAgVGhhdCBpcywgYSBzb3VyY2UgZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZQotCSAqIHNvdXJjZSAgb2YgQVBQTEVUIGFuZCBQQVJBTVMgbGlrZSB0aGlzOgotCSAqIDxQUkU+Ci0JICogICAmbHQ7QVBQTEVUIC4uLiZndDsKLQkgKiAgICAgJmx0O1BBUkFNIC4uLiAmZ3Q7Ci0JICogICAgICZsdDtQQVJBTSAuLi4gJmd0OwotCSAqICAgJmx0Oy9BUFBMRVQmZ3Q7Ci0JICogPFBSRT4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJcmV0dXJuIGluZGVudENoaWxkOwotCX0KLQotCS8qKgotCSAqIE1vc3Qgb2YgZWxlbWVudHMgY2FuIGNvbXBhY3Qgc3BhY2VzIGluIHRoZWlyIGNoaWxkIHRleHQgbm9kZXMuCi0JICogU29tZSBzcGVjaWFsIGVsZW1lbnRzIHNob3VsZCBrZWVwIHRoZW0gaW4gdGhlaXIgc291cmNlLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEtlZXBTcGFjZXMoKSB7Ci0JCXJldHVybiBrZWVwU3BhY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gbmV4dEVsZW1lbnQpIHsKLQkJSXRlcmF0b3IgaSA9IGdldFRlcm1pbmF0b3JzKCk7Ci0JCWlmIChpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuZXh0TmFtZSA9IG5leHRFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKG5leHROYW1lLmVxdWFscyhpLm5leHQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbWVudERlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYmYwYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbWVudERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBiZSBhIHB1YmxpYyBpbnRlcmZhY2Ugd2hpY2ggaGFzCi0gKiBpbnRlcmZhY2VzIGRlZmluZWQgaW4gYm90aCBvZiB7QGxpbmsgPGNvZGU+Q01FbGVtZW50RGVjbGFyYXRpb248L2NvZGU+fQotICogYW5kIHtAbGluayA8Y29kZT5IVE1MQ01Ob2RlPC9jb2RlPn0uPGJyPgotICogSW4gYWRkaXRpb24gdG8gdGhpcywgc29tZSBpbnRlcmZhY2VzIGFyZSBhZGRlZCB0byB0aGlzIGludGVyZmFjZSwKLSAqIHRob3NlIGFyZSBzcGVjaWFsbHkgdG8gSFRNTCBlbGVtZW50cy48YnI+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBleHRlbmRzIENNRWxlbWVudERlY2xhcmF0aW9uIHsKLQotCS8qKiBUYWcgb21taXNzaW9uOyBOb3Qgb21taXNpYmxlLiAqLwotCWludCBPTUlUX05PTkUgPSAwOwotCS8qKiBUYWcgb21taXNzaW9uOyBCb3RoIHRhZ3MgYXJlIG9tbWlzaWJsZS4gKi8KLQlpbnQgT01JVF9CT1RIID0gMTsKLQkvKiogVGFnIG9tbWlzc2lvbjsgVGhlIGVuZCB0YWcgaXMgb21taXNpYmxlLiAqLwotCWludCBPTUlUX0VORCA9IDI7Ci0JLyoqIFRhZyBvbW1pc3Npb247IFRoZSBlbmQgdGFnIGlzIG9tbWl0dGVkIHdoZW4gY3JlYXRlZC4gKi8KLQlpbnQgT01JVF9FTkRfREVGQVVMVCA9IDM7Ci0JLyoqIFRhZyBvbW1pc3Npb247IFRoZSBlbmQgdGFnIG11c3QgYmUgb21pdHRlZC4gKi8KLQlpbnQgT01JVF9FTkRfTVVTVCA9IDQ7Ci0JLyoqIExpbmUgQnJlYWs7IE5vIGJyZWFrLiAqLwotCWludCBCUkVBS19OT05FID0gMTA7Ci0JLyoqIExpbmUgQnJlYWs7IEJyZWFrIGFmdGVyIHRoZSBzdGFydCB0YWcuICovCi0JaW50IEJSRUFLX0FGVEVSX1NUQVJUID0gMTE7Ci0JLyoqIExpbmUgQnJlYWs7IEJyZWFrIGJvdGggYmVmb3JlIHRoZSBzdGFydCB0YWduIGFuZCBhZnRlciB0aGUgZW5kIHRhZy4gKi8KLQlpbnQgQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgPSAxMjsKLQkvKiBMYXlvdXQgKi8KLQkvKiogaW5pdGlhbCB2YWx1ZTsgdGhlIHZhbHVlIHNob3VsZCBuZXZlciByZXR1cm5zIHRvIGNsaWVudCBwcm9ncmFtcy4gKi8KLQlpbnQgTEFZT1VUX05PTkUgPSAxMDA7Ci0JaW50IExBWU9VVF9CTE9DSyA9IDEwMTsKLQlpbnQgTEFZT1VUX1dSQVAgPSAxMDI7Ci0JLyoqIE5vIHdyYXAgb2JqZWN0OyBsaWtlIElNRywgQVBQTEVULC4uLiAqLwotCWludCBMQVlPVVRfT0JKRUNUID0gMTAzOwotCS8qKiBCUiAqLwotCWludCBMQVlPVVRfQlJFQUsgPSAxMDQ7Ci0JLyoqIEhpZGRlbiBvYmplY3Q7IGxpa2UgSFRNTCBvciBIRUFEICovCi0JaW50IExBWU9VVF9ISURERU4gPSAxMDU7Ci0JLyogQ29ycmVjdGlvbiAqLwotCS8qKiBDb3JyZWN0OyBObyBjb3JyZWN0LiAqLwotCWludCBDT1JSRUNUX05PTkUgPSAxMDAwOwotCS8qKiBDb3JyZWN0OyBNZWFuaW5nbGVzcyB3aGVuIHRoZSBjb250ZW50IGlzIGVtcHR5LiAqLwotCWludCBDT1JSRUNUX0VNUFRZID0gMTAwMTsKLQkvKiogQ29ycmVjdDsgTWVhbmluZ2xlc3Mgd2hlbiBubyBhdHRyaWJ1dCBpcyBzZXQuICovCi0JaW50IENPUlJFQ1RfTkVVVFJBTCA9IDEwMDI7Ci0JLyoqIENvcnJlY3Q7IE1lYW5pbmdsZXNzIHdoZW4gc2FtZSBlbGVtZW50IGlzIG5lc3RlZC4gKi8KLQlpbnQgQ09SUkVDVF9EVVBMSUNBVEVEID0gMTAwMzsKLQkvKiogRm9ybWF0OyBIVE1MICovCi0JaW50IEZPUk1BVF9IVE1MID0gMTAwMDA7Ci0JLyoqIEZvcm1hdDsgU1NJICovCi0JaW50IEZPUk1BVF9TU0kgPSAxMDAwMTsKLQkvKiogRm9ybWF0OyBKU1Agc2NyaXB0ICovCi0JaW50IEZPUk1BVF9KU1BfU0NSSVBUID0gMTAwMDI7Ci0JLyoqIEZvcm1hdDsgSlNQIGRpcmVjdGl2ZSAqLwotCWludCBGT1JNQVRfSlNQX0RJUkVDVElWRSA9IDEwMDAzOwotCS8qKiBGb3JtYXQ7IFhNTCAqLwotCWludCBGT1JNQVRfWE1MID0gMTAwMDQ7Ci0JLyoqIEZvcm1hdDsgTVcgKi8KLQlpbnQgRk9STUFUX01XID0gMTAwMDU7Ci0KLQkvKioKLQkgKiBBIHNob3J0IGhhbmQgbWV0aG9kIHRvIGdldCBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gb2YgYSBIVE1MIGVsZW1lbnQuCi0JICogQHBhcmFtIGF0dHJOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oU3RyaW5nIGF0dHJOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNkYjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgSFRNTEVudGl0eURlY2xJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogQ01FbnRpdHlEZWNsSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBlbnRpdHlOYW1lIGphdmEubGFuZy5TdHJpbmc7IEVudGl0eSBuYW1lLgotCSAqIEBwYXJhbSBlbnRpdHlWYWx1ZSBqYXZhLmxhbmcuU3RyaW5nOyBWYWx1ZSBzdHJpbmcuCi0JICovCi0JcHVibGljIEhUTUxFbnRpdHlEZWNsSW1wbChTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIGVudGl0eVZhbHVlKSB7Ci0JCXN1cGVyKGVudGl0eU5hbWUpOwotCQl2YWx1ZSA9IGVudGl0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQ01Ob2RlIHR5cGUuPGJyPgotCSAqIEByZXR1cm4gaW50OyBBbHdheXMgcmV0dXJuIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkVOVElUWV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRW50aXRpZXMgaW4gSFRNTCBkb2N1bWVudHMgYXJlIGFsd2F5cyB0cmVhdGVkIHdpdGggaWdub3JpbmcgY2FzZXMuCi0JICogQmVjYXVzZSBubyBzcGVjaWFsIGVudGl0aWVzIGFyZSBkZWZpbmVkIGluIEpTUCAxLjAsIHRoaXMgbWV0aG9kCi0JICogY2FuIGFsd2F5cyByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjdiMmQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGEgcHVibGljIGludGVyZmFjZSB3aGljaCBoYXMKLSAqIGludGVyZmFjZXMgZGVmaW5lZCBpbiBib3RoIG9mIHtAbGluayA8Y29kZT5DTUVudGl0eURlY2xhcmF0aW9uPC9jb2RlPn0KLSAqIGFuZCB7QGxpbmsgPGNvZGU+SFRNTENNTm9kZTwvY29kZT59Ljxicj4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MRW50aXR5RGVjbGFyYXRpb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxQcm9wZXJ0eURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxQcm9wZXJ0eURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OGJmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MUHJvcGVydHlEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgY29tbW9ubHkgdXNlZCBpbiBkZWNsYXJhdGlvbiBpbXBsZW1lbnRhdGlvbiwgYW5kIGludGVybmFsIHVzZS4KLSAqIFVzZSBnZXRQcm9wZXJ0eSgpIG1ldGhvZCBmb3IgcHVibGljIHVzZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiB7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW4gdGhlIHR5cGUsIGxvb2sgdXAgdGhlIGZvbGxvd2luZyBrZXl3b3JkcyBpbiBDKytET00vRFREUGFyc2VyLmNwcDoKLQkgKiA8dWw+Ci0JICogICA8bGk+Q09SUkVDVF9EVVBMSUNBVEVEIC0gPGNvZGU+R1JPVVBfTk9EVVA8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5DT1JSRUNUX0VNUFRZIC0gPGNvZGU+R1JPVVBfQ09NUEFDVDwvY29kZT48L2xpPgotCSAqICAgPGxpPkNPUlJFQ1RfTkVVVFJBTCAtIDxjb2RlPkdST1VQX05FVVRSQUw8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5DT1JSRUNUX05PTkUgLSA8Y29kZT4oTi9BKTwvY29kZT48L2xpPgotCSAqIDwvdWw+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0Q29ycmVjdGlvblR5cGUoKTsKLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgZGVjbGFyYXRpb25zIHRob3NlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JQ01Db250ZW50IGdldEV4Y2x1c2lvbigpOwotCS8qKgotCSAqIFRvIGRldGVybWluIHRoZSB0eXBlLCBzZWUgdGhlIGZvbGxvd2luZyBmaWxlcyBpbiB0aGUgQysrRE9NOgotCSAqICAgRWxlbWVudFR5cGUuY3BwIC0gRWxlbWVudFR5cGUjc2V0R3JvdXAoKS4KLQkgKiAgIEVsZW1lbnQuY3BwIC0gRWxlbWVudCNnZXRTdGFydFRhZygpLgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldEZvcm1hdFR5cGUoKTsKLQkvKioKLQkgKiBHZXQgdGhlIGxpc3Qgb2YgZGVjbGFyYXRpb25zIHRob3NlIHNob3VsZCBiZSBpbmNsdWRlZCBpbnRvIHRoZSBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JQ01Db250ZW50IGdldEluY2x1c2lvbigpOwotCS8qKgotCSAqIFRvIGRldGVybWluIHRoZSB0eXBlLCBsb29rIHVwIHRoZSBmb2xsb3dpbmcga2V5d29yZHMgaW4gQysrRE9NL0RURFBhcnNlci5jcHA6Ci0JICogPHVsPgotCSAqICAgPGxpPkxBWU9VVF9CTE9DSyAtIDxjb2RlPkdST1VQX0JMT0NLPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+TEFZT1VUX0JSRUFLIC0gPGNvZGU+R1JPVVBfQlJFQUs8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfSElEREVOIC0gPGNvZGU+R1JPVVBfSElEREVOPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+TEFZT1VUX05PTkUgLSA8Y29kZT4oTi9BKTwvY29kZT48L2xpPgotCSAqICAgPGxpPkxBWU9VVF9PQkpFQ1QgLSA8Y29kZT5HUk9VUF9OT1dSQVA8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfV1JBUCAtIDxjb2RlPihOL0EpPC9jb2RlPjwvbGk+Ci0JICogPC91bD4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMYXlvdXRUeXBlKCk7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW5lIHRoZSB0eXBlLCBzZWUgPGNvZGU+RWxlbWVudDo6aXNCcmVha2luZ0JlZm9yZUVsZW1lbnQoKTwvY29kZT4KLQkgKiBhbmQgPGNvZGU+RWxlbWVudDo6aXNCcmVha2luZ0FmdGVyRWxlbWVudCgpPC9jb2RlPiBkZWZpbmVkIGluIEMrK0RPTS9FbGVtZW50LmNwcC48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGluZUJyZWFrSGludCgpOwotCS8qKgotCSAqIFRvIGRldGVybWluZSB0aGUgdHlwZSwgQ2hlY2sgdGhlIEhUTUwgRFRELgotCSAqIEFuZCBsb29rIHVwIDxjb2RlPkdST1VQX05PRU5EPC9jb2RlPiBpbiBDKytET00vRFREUGFyc2VyLmNwcC48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0T21pdFR5cGUoKTsKLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAKLQkgKi8KLQlDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCk7Ci0JLyoqCi0JICogcmV0dXJuIHRydWUgd2hlbiB0aGUgZWxlbWVudCBpcyBhIEpTUCBlbGVtZW50LgotCSAqLwotCWJvb2xlYW4gaXNKU1AoKTsKLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHNob3VsZEluZGVudENoaWxkU291cmNlKCk7Ci0JLyoqCi0JICogU29tZSBlbGVtZW50cyBzaG91bGQga2VlcCBzcGFjZXMgaW4gaXRzIGNoaWxkIHRleHQgbm9kZXMuCi0JICogRm9yIGV4YW1wbGUsIFBSRSBhbmQgVEVYVEFSRUEuICBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUsCi0JICogaWYgYSB0YXJnZXQgZWxlbWVudCBpcyBvbmUgb2Ygc3VjaCBlbGVtZW50cy4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHNob3VsZEtlZXBTcGFjZXMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCBpZiA8Y29kZT5uZXh0RWxlbWVudDwvY29kZT4gdGVybWluYXRlcwotCSAqIHRoZSBjdXJyZW50IGVsZW1lbnQuCi0JICogU29tZSBlbGVtZW50cyBsaWtlIDxjb2RlPlA8L2NvZGU+IHRlcm1pbmF0ZXMgb3RoZXIgPGNvZGU+UDwvY29kZT4uCi0JICogVGhhdCBpcywgd2hlbiA8Y29kZT4mbHQ7UCZndDs8L2NvZGU+IGFwcGVhcnMgYXQgdGhlIG5leHQgdG8gPGNvZGU+UDwvY29kZT4sCi0JICogd2hpY2ggZW5kIHRhZ3MgaXMgb21pdHRlZCwgaXQgcmVwcmVzZW50cyBub3Qgb25seSB0aGUgYmVnaW5uaW5nIG9mIHRoZQotCSAqIG5ldyA8Y29kZT5QPC9jb2RlPiBlbGVtZW50IGJ1dCBhbHNvIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIDxjb2RlPlA8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gc2hvdWxkVGVybWluYXRlQXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBuZXh0RWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmViMjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBBLgotICovCi1maW5hbCBjbGFzcyBIZWRBIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqIChocmVmbGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkgKiAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKGRpcmVjdGtleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoc2hhcGUgJVNoYXBlOyByZWN0KQotCSAqIChjb29yZHMgJUNvb3JkczsgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NIQVJTRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRkxBTkcsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFSR0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFTCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRVYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJUkVDVEtFWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSEFQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT09SRFMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVJ9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+QTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+QTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGEgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEpOwotCQlpZiAoYSAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGEpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQUREUkVTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBRERSRVNTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTEzZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBRERSRVNTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBBRERSRVNTLgotICovCi1maW5hbCBjbGFzcyBIZWRBRERSRVNTIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQUREUkVTUyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BRERSRVNTLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9BRERSRVNTOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFQUExFVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBUFBMRVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1NDZmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFQUExFVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEFQUExFVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQVBQTEVUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQVBQTEVUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFQUExFVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUEFSQU1fQ09OVEFJTkVSOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGNvZGViYXNlICVVUkk7ICNJTVBMSUVEKQotCSAqIChhcmNoaXZlIENEQVRBICNJTVBMSUVEKQotCSAqIChjb2RlIENEQVRBICNJTVBMSUVEKQotCSAqIChvYmplY3QgQ0RBVEEgI0lNUExJRUQpCi0JICogKGFsdCAlVGV4dDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjUkVRVUlSRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjUkVRVUlSRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKQotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWF5c2NyaXB0IChtYXlzY3JpcHQpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09ERUJBU0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVJDSElWRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0RFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09CSkVDVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVlTQ1JJUFR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAlYWxpZ247IC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQVJFQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBUkVBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmFkMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBUkVBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogQVJFQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQVJFQSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBUkVBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFSRUEsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfSElEREVOLgotCQkvLyBCZWNhdXNlLCBBUkVBIGlzIEdST1VQX0hJRERFTiBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIEFSRUEuCi0JICogJWF0dHJzOwotCSAqIChzaGFwZSAlU2hhcGU7IHJlY3QpCi0JICogKGNvb3JkcyAlQ29vcmRzOyAjSU1QTElFRCkKLQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKG5vaHJlZiAobm9ocmVmKSAjSU1QTElFRCkKLQkgKiAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0hBUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09PUkRTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFSR0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PSFJFRiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09ORk9DVVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05CTFVSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyODgxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBCQVNFLgotICovCi1maW5hbCBjbGFzcyBIZWRCQVNFIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJBU0UoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9ISURERU4uCi0JCS8vIEJlY2F1c2UsIEJBU0UgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogQkFTRS4KLQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFSR0VUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFRk9OVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFRk9OVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzkxMDliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkFTRUZPTlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBCQVNFRk9OVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkFTRUZPTlQgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkFTRUZPTlQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRUZPTlQsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfT0JKRUNUIC0gR1JPVVBfTk9XUkFQLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBCQVNFRk9OVC4KLQkgKiAoaWQgSUQgI0lNUExJRUQpCi0JICogKHNpemUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGxvY2FseSBkZWZpbmVkLgotCSAqIChjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqIChmYWNlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GQUNFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHNpemUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGxvY2FseSBkZWZpbmVkLgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJETy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCRE8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlZTUxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJETy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEJETy4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkRPIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCRE8oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkRPLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JICogKGRpciAobHRyfHJ0bCkgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBTkd9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAgKGRpciAobHRyfHJ0bCkgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTFRSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SVEx9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVIsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkdTT1VORC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCR1NPVU5ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNzMxZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCR1NPVU5ELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0KLQotZmluYWwgY2xhc3MgSGVkQkdTT1VORCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCXB1YmxpYyBIZWRCR1NPVU5EKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJHU09VTkQsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiAoc3JjLCBDREFUQSwgI0lNUExJRUQpCi0JICogKGxvb3AsIENEQVRBLCAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCS8vIHNyYwotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0dHIpOwotCQkvLyBsb29wCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSU5GSU5JVEUpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT09QLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPT1AsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkxPQ0tRVU9URS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCTE9DS1FVT1RFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxY2I2MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCTE9DS1FVT1RFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQkxPQ0tRVU9URS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkxPQ0tRVU9URSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJMT0NLUVVPVEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkxPQ0tRVU9URSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNpdGUgJVVSSTsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0lURX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJPRFkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQk9EWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzI0YTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQk9EWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIEJPRFkuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJPRFkgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQk9EWShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVib2R5Y29sb3JzOwotCSAqIChvbmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9udW5sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChiYWNrZ3JvdW5kICVVUkk7ICNJTVBMSUVEKQotCSAqIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKSAuLiBEMjA1NTE0Ci0JICogKHRvcG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4uLi4gRDIwNTUxNAotCSAqIChib3R0b21tYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAobGVmdG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4uLiBEMjA1NTE0Ci0JICogKHJpZ2h0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlYm9keWNvbG9yczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRCb2R5Y29sb3JzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05MT0FELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OVU5MT0FELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JBQ0tHUk9VTkQsCi0JCS8vIDw8RDIwNTUxNAotCQkJCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTldJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTkhFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UT1BNQVJHSU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9UVE9NTUFSR0lOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xFRlRNQVJHSU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUklHSFRNQVJHSU4KLQkJLy8gRDIwNTUxNAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmNsdXNpb24uCi0JICogIkxhenkgZXZhbC4iPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJaWYgKGluY2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGluY2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIChJTlN8REVMKQotCQlpbmNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5TLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVMfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGluY2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBpbmNsdXNpb247Ci0JfQotCi0JLyoqCi0JICogQk9EWSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVmYTZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogQlIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJSLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0JSRUFLLgotCQkvLyBCZWNhdXNlLCBCUiBpcyBHUk9VUF9CUkVBSyBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQlJFQUs7Ci0JfQotCi0JLyoqCi0JICogQlIuCi0JICogJWNvcmVhdHRyczsKLQkgKiAoY2xlYXIgKGxlZnQgfCBhbGwgfCByaWdodCB8IG5vbmUpIG5vbmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vIGNsZWFyCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NMRUFSKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVIsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlVUVE9OLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJVVFRPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzU0OTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlVUVE9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEJVVFRPTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQlVUVE9OIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQlVUVE9OKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodHlwZSAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0KSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09ORk9DVVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05CTFVSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHR5cGUgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0JVVFRPTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU1VCTUlULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SRVNFVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+Rk9STTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+Rk9STTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsCi0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSVNJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZJRUxEU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSUZSQU1FfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldEZvcm1jdHJsKGV4Y2x1c2lvbik7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENBUFRJT04uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0FQVElPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmIwN2RjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0FQVElPTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotCi0vKioKLSAqIENBUFRJT04uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZENBUFRJT04gZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENBUFRJT04oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0FQVElPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhbGlnbiAlQ0FsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckNhcHRpb24oKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0VOVEVSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENFTlRFUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDUxODRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0VOVEVSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBDRU5URVIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZENFTlRFUiBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENFTlRFUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVIsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ09MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZjMyMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIENPTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ09MIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENPTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0wsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQkxPQ0suCi0JCS8vIEJlY2F1c2UsIENPTCBpcyBHUk9VUF9CTE9DSyBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogQ09MLgotCSAqICVhdHRyczsKLQkgKiAoc3BhbiBOVU1CRVIgMSkKLQkgKiAod2lkdGggJU11bHRpTGVuZ3RoOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNwYW4gTlVNQkVSIDEpCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1BBTn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vICh3aWR0aCAlTXVsdGlMZW5ndGg7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5NVUxUSV9MRU5HVEgpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0dHIpOwotCi0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0xHUk9VUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0xHUk9VUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDJlNzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ09MR1JPVVAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBDT0xHUk9VUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ09MR1JPVVAgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0xHUk9VUCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNBUFRJT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEZPT1QsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUn07Ci0KLQlwdWJsaWMgSGVkQ09MR1JPVVAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MR1JPVVAsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NPTFVNTl9HUk9VUDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoc3BhbiBOVU1CRVIgMSkKLQkgKiAod2lkdGggJU11bHRpTGVuZ3RoOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUEFOfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHdpZHRoICVNdWx0aUxlbmd0aDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk1VTFRJX0xFTkdUSCk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogTEkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMDRmODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRERC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBERC4KLSAqLwotZmluYWwgY2xhc3MgSGVkREQgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRERChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBERCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRElWLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERJVi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmNkMmJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRElWLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBESVYuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERJViBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERJVihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVYsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlYWxpZ247Ci0JICogJXJlc2VydmVkOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlYWxpZ247Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCQkvLyAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NWYyZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIERMLgotICovCi1maW5hbCBjbGFzcyBIZWRETCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERMKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhcnJheXM7Ci0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTVBBQ1R9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWREVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWREVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDc5N2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogRFQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERUIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWREVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEVCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRU1CRUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRU1CRUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlMzAxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEVNQkVELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogRU1CRUQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEVNQkVEIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRU1CRUQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRU1CRUQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNQkVEOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogJWV2ZW50czsKLQkgKiAoc3JjICVVUkk7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGxvb3AgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhpZGRlbiBDREFUQSAjSU1QTElFRCkKLQkgKiAodm9sdW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChhdXRvc3RhcnQgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCSAqIChhdXRvcGxheSAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JICogKGF1dG9zaXplICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkgKiAoY29udHJvbGxlciAodHJ1ZXxmYWxzZSkgdHJ1ZSkKLQkgKiAoc2NhbGUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNob3djb250cm9scyAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JICogKHBsYXljb3VudCBOVU1CRVIgI0lNUExJRUQpCi0JICogKHJlcGVhdCBDREFUQSAjSU1QTElFRCkKLQkgKiAocGFuZWwgQ0RBVEEgI0lNUExJRUQpCi0JICogKHRleHQgQ0RBVEEgI0lNUExJRUQpCi0JICogKHBhbGV0dGUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHRleHRmb2N1cyBDREFUQSAjSU1QTElFRCkKLQkgKiAodHlwZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vICVldmVudHM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RXZlbnRzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9PUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ISURERU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVk9MVU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FVVE9TVEFSVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BVVRPUExBWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BVVRPU0laRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05UUk9MTEVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDQUxFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NIT1dDT05UUk9MUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QTEFZQ09VTlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUkVQRUFULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1BBTkVMLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RFWFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUEFMRVRURSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9URVhURk9DVVN9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQkvLyAoc3JjICVVUkk7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR0cik7Ci0KLQkJLy8gKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0KLQkJLy8gKHR5cGUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEVtcHR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEVtcHR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjRiODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRFbXB0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgRU1QVFkgdHlwZSBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkRW1wdHkgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRFbXB0eShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZOwotCQkvLyBFTVBUWSB0eXBlIGhhcyBubyBlbmQgdGFnLgotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX01VU1Q7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogRU1QVFkgdHlwZSBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGSUVMRFNFVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGSUVMRFNFVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDdmYmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRklFTERTRVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEZJRUxEU0VULgotICovCi1maW5hbCBjbGFzcyBIZWRGSUVMRFNFVCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZJRUxEU0VUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZJRUxEU0VULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GSUVMRFNFVDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRk9OVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT05ULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZGQ0NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT05ULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogRk9OVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRk9OVCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRk9OVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT05ULCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogJWkxOG47Ci0JICogKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqIChmYWNlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRkFDRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT1JNLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZPUk0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4NmZhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZPUk0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRk9STS4KLSAqLwotZmluYWwgY2xhc3MgSGVkRk9STSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZPUk0oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhY3Rpb24gJVVSSTsgI1JFUVVJUkVEKQotCSAqIChtZXRob2QgKEdFVHxQT1NUKSBHRVQpCi0JICogKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkgKiAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChvbnN1Ym1pdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25yZXNldCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ1RJT04sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUVUSE9ELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0VOQ1RZUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVBULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05TVUJNSVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05SRVNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVBUX0NIQVJTRVR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+Rk9STTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+Rk9STTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsCi0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGZvcm0gPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0pOwotCQlpZiAoZm9ybSAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGZvcm0pOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZSQU1FLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZSQU1FLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OGZlMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEZSQU1FLgotICovCi1maW5hbCBjbGFzcyBIZWRGUkFNRSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGUkFNRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GUkFNRSwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9ISURERU4uCi0JCS8vIEJlY2F1c2UsIEZSQU1FIGlzIEdST1VQX0hJRERFTiBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIEZSQU1FLgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JICogKGZyYW1lYm9yZGVyICgxfDApIDEpCi0JICogKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChtYXJnaW5oZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKG5vcmVzaXplIChub3Jlc2l6ZSkgI0lNUExJRUQpCi0JICogKHNjcm9sbGluZyAoeWVzfG5vfGF1dG8pIGF1dG8pCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPTkdERVNDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQU1FQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTldJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTkhFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OT1JFU0laRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ1JPTExJTkcsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSQ09MT1IgLy8gRDIwNTU0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRlJBTUVTRVQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRlJBTUVTRVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwMDBkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZSQU1FU0VULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogRlJBTUVTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZSQU1FU0VUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRlJBTUVTRVQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZSQU1FU0VUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKHJvd3MgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb2xzICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAob25sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnVubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoZnJhbWVib3JkZXIgKHllc3xubykgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAoZnJhbWVzcGFjaW5nIENEQVRBICNJTVBMSUVEKSAuLi4gRDIxNTY4NAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05VTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SLCAvLyBEMjA1NTE0Ci0JCQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVTUEFDSU5HIC8vIEQyMTU2ODQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJLy8gKHJvd3MgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTVVMVElfTEVOR1RIKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIGF0dHIpOwotCi0JCS8vIChjb2xzICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFMsIGF0dHIpOwotCi0JCS8vIChmcmFtZWJvcmRlciAoeWVzfG5vKSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfWUVTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9OT307Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVCT1JERVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGbG93Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZsb3dDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyMTFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZsb3dDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgKCVmbG93OykqIGNvbnRhaW5lcnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZEZsb3dDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGbG93Q29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRkxPV19DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGb250U3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRm9udFN0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmIxNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGb250U3R5bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqICVmb250c3R5bGU7Ci0gKi8KLWZpbmFsIGNsYXNzIEhlZEZvbnRTdHlsZSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRm9udFN0eWxlKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CSUcpIHx8IGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNNQUxMKSkgewotCQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQl9Ci0JCWVsc2UgeyAvLyBCLCBJLCBVLCAuLi4KLQkJCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9EVVBMSUNBVEVEOwotCQl9Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlTdHJpbmcgbXlOYW1lID0gZ2V0RWxlbWVudE5hbWUoKTsKLQkJaWYgKCFteU5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQklHKSAmJiAhbXlOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNNQUxMKSkKLQkJCXJldHVybiBFTVBUWV9NQVA7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIRUFELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhFQUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxYTA2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhFQUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogSFRNTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSEVBRCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIRUFEKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hFQUQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SEVBRDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVpMThuOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPnByb2ZpbGU8L3RkPjx0ZD5VUkk8L3RkPjx0ZD4jSU1QTElFRDwvdGQ+PHRkPk4vQTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCQkvLyBwcm9maWxlCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1BST0ZJTEUpOwotCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9GSUxFLCBhZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBIRUFEIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjhiNWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEhSLgotICovCi1maW5hbCBjbGFzcyBIZWRIUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzCi0JICogKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkgKiAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9MRUZULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DRU5URVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PU0hBREUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xPUiAvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWI2MzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBIVE1MLgotICovCi1maW5hbCBjbGFzcyBIZWRIVE1MIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSFRNTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IVE1MOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkhUTUw8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD48Y29kZT4laTE4bjs8L2NvZGU+PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgICAgPHRkPntAbGluayBQRENNRG9jSW1wbCNnZXRBdHRyRGVjbGFyYXRpb25zSTE4bn08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPnZlcnNpb248L3RkPjx0ZD5DREFUQTwvdGQ+PHRkPiNGSVhFRDwvdGQ+Ci0JICogICAgIDx0ZD57QGxpbmsgSFRNTF9WRVJTSU9OX1RSQU5TSVRJT05BTH08L3RkPjx0ZD5kZXBsZWNhdGVkIGluIEhUTUw0LjAxPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQkJLy8gdmVyc2lvbgotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WRVJTSU9OKTsKLQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkVSU0lPTiwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICogSFRNTCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSGVhZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIZWFkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTdjMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIZWFkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBIWzEtNl0uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhlYWRpbmcgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhlYWRpbmcoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5IMTwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhdHRyczs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYWxpZ247PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKiA8cD48Yj4lYWxpZ247PC9iPiBtZWFucyA8Y29kZT5hbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeSkgI0lNUExJRUQ8L2NvZGU+LgotCSAqIFVuZm9ydHVuYXRlbHksIHRoaXMgPGNvZGU+YWxpZ248L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tIG9uZSBpbgotCSAqIDxjb2RlPklNRzwvY29kZT4gb3IgPGNvZGU+VEFCTEU8L2NvZGU+LiAgU28sIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkgKiBvZiA8Y29kZT5hbGlnbjwvY29kZT4gc2hvdWxkIGJlIGxvY2FseSBjcmVhdGVkIGFuZCBpdCBzaG91bGRuJ3QgYmUgcmVnaXN0ZXJlZAotCSAqIGluIGEgPGNvZGU+SENNRG9jSW1wbDwvY29kZT4gaW5zdGFuY2UuPC9wPgotCSAqIDxwPkhvd2V2ZXIsICVhbGlnbiBpcyB1c2VkIGluIHNldmFyYWwgdGltZXMuICBJIHdvdWxkbid0IHdyaXRlIHNhbWUgY29kZQotCSAqIGluIG1hbnkgdGltZXMuICBTbywgSSBhZGQgYSBuZXcgdXRpbGl0eSBtZXRob2QgaW50byA8Y29kZT5DTVV0aWw8L2NvZGU+Ci0JICogdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJRlJBTUUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSUZSQU1FLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MTYxNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJRlJBTUUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBJRlJBTUUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElGUkFNRSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElGUkFNRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JRlJBTUUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqIChsb25nZGVzYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCSAqIChmcmFtZWJvcmRlciAoMXwwKSAxKQotCSAqIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChzY3JvbGxpbmcgKHllc3xub3xhdXRvKSBhdXRvKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT05HREVTQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVJHSU5XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVJHSU5IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NST0xMSU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTUcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU1HLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTgwNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTUcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIElNRy4KLSAqLwotZmluYWwgY2xhc3MgSGVkSU1HIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElNRyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTUcsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBJTUcuCi0JICogJWF0dHJzOwotCSAqIChzcmMgJVVSSTsgI1JFUVVJUkVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JICogKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh1c2VtYXAgJVVSSTsgI0lNUExJRUQpCi0JICogKGlzbWFwIChpc21hcCkgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWFwZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoc3JjICVVUkk7ICNSRVFVSVJFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR0cik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9OR0RFU0MsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVVNFTUFQLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTTUFQLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUEZJTEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyBhbGlnbiAobG9jYWwpOyBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU5QVVQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU5QVVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiMzA0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElOUFVULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSU5QVVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElOUFVUIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElOUFVUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOUFVULCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU5QVVQuCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JICogKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqIDw8RDIxNTY4NAotCSAqICh3aWR0aCBDREFUQTsgI0lNUExJRUQpCi0JICogKGhlaWdodCBDREFUQTsgI0lNUExJRUQpCi0JICogKGJvcmRlciBDREFUQTsgI0lNUExJRUQpCi0JICogRDIxNTY4NAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkvLyBOT1RFOiAlSW5wdXRUeXBlIGlzIEVOVU07Ci0JCS8vICh0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotCQkvLyAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BBU1NXT1JELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DSEVDS0JPWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkFESU8sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NVQk1JVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkVTRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0ZJTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0hJRERFTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSU1BR0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0JVVFRPTn07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9URVhUKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCS8vIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR0cik7Ci0KLQkJLy8gKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBhdHRyKTsKLQotCQkvLyAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hFQ0tFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRUFET05MWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BWExFTkdUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1VTRU1BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU01BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05TRUxFQ1QsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DSEFOR0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVBULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTVFlMRSwKLQkJLy88PEQyMTU2ODQKLQkJCQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSCi0JCS8vPEQyMTU2ODQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJU0lOREVYLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElTSU5ERVguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3NDRkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElTSU5ERVguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIElTSU5ERVguCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElTSU5ERVggZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSVNJTkRFWChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JU0lOREVYLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiBJU0lOREVYLgotCSAqICVjb3JlYXR0cnM7Ci0JICogJWkxOG47Ci0JICogKHByb21wdCAlVGV4dDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0KLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJPTVBUKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJPTVBULCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJbmxpbmVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMDgyMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJbmxpbmVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgKCVpbmxpbmU7KSogY29udGFpbmVycy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkSW5saW5lQ29udGFpbmVyIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKiBIZWRJbmxpbmVDb250YWluZXIuCi0JICogQHBhcmFtIGVsZW1lbnROYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBIZWRJbmxpbmVDb250YWluZXIoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9JTkxJTkVfQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEFCRUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEFCRUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwMTAzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExBQkVMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogTEFCRUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZExBQkVMIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMQUJFTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MQUJFTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChmb3IgSURSRUYgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoZm9yIElEUkVGICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEUkVGKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GT1IsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GT1IsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09ORk9DVVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05CTFVSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPkxBQkVMPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5MQUJFTDwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGxhYmVsID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MQUJFTCk7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGxhYmVsKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxBQkVMfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMRUdFTkQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEVHRU5ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMzkyOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMRUdFTkQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBMRUdFTkQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZExFR0VORCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTEVHRU5EKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxFR0VORCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUxBbGlnbjsgI0lNUExJRUQpIC4uLiBzaHVsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yTGVnZW5kKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Mzc4NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBMSS4KLSAqLwotZmluYWwgY2xhc3MgSGVkTEkgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSX07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTEkoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVMSVN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHZhbHVlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHR5cGUgJUxJU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MSV9TVFlMRSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCS8vICh2YWx1ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBMSSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTElOSy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSU5LLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTEzMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSU5LLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBMSU5LLgotICovCi1maW5hbCBjbGFzcyBIZWRMSU5LIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExJTksoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSywgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIExJTksuCi0JICogJWF0dHJzOwotCSAqIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaHJlZmxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkgKiAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChtZWRpYSAlTWVkaWFEZXNjOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSEFSU0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRkxBTkcsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUkVMLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFViwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NRURJQSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjY2Y2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGxpc3QgaXRlbSBjb250YWluZXIgZGVjbGFyYXRpb25zLgotICogLSBPTCwgVUwsIE1FTlUsIERJUi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkTGlzdEl0ZW1Db250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMaXN0SXRlbUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhM2MyYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLQotCi0vKioKLSAqIE1BUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUFQIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUFQKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1BUCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTUFQOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAobmFtZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKG5hbWUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1BUlFVRUUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFSUVVFRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODY1M2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFSUVVFRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIE1BUlFVRUUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1BUlFVRUUgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNQVJRVUVFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1BUlFVRUUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGJlaGF2aW9yIChzY3JvbGx8c2xpZGV8YWx0ZXJuYXRlKSBzY3JvbGwpCi0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoZGlyZWN0aW9uIChsZWZ0fHJpZ2h0fHVwfGRvd24pIGxlZnQpCi0JICogKGhlaWdodCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGhzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChsb29wIENEQVRBICNJTVBMSUVEKQotCSAqIChzY3JvbGxhbW91bnQgTlVNQkVSICNJTVBMSUVEKQotCSAqIChzY3JvbGxkZWxheSBOVU1CRVIgI0lNUExJRUQpCi0JICogKHZzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh3aWR0aCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHRydWVzcGVlZCAodHJ1ZXNwZWVkKSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JFSEFWSU9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JHQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElSRUNUSU9OLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPT1AsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NST0xMQU1PVU5ULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDUk9MTERFTEFZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RSVUVTUEVFRH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vIChoZWlnaHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgYXR0cik7Ci0KLQkJLy8gKHdpZHRoIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0KLQkJLy8gKGhzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIGF0dHIpOwotCi0JCS8vICh2c3BhY2UgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1FTlUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVOVS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQyNTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVOVS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBNRU5VL0RJUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUVOVSBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNRU5VKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogTUVOVS9ESVIuCi0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5NRU5VL0RJUjwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JWJsb2NrOzwvY29kZT4uCi0JICogJWJsb2NrOyBpczoKLQkgKiBQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0JICogTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLQkgKiBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUy4KLQkgKiAlaGVhZGluZzsgaXM6IEgxIHwgSDIgfCBIMyB8IEg0IHwgSDUgfCBINi4KLQkgKiAlbGlzdDsgaXMgOiBVTCB8IE9MIHwgRElSIHwgTUVOVS4KLQkgKiAlcHJlZm9ybWF0dGVkOyBpcyBQUkUuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyAlYmxvY2s7Ci0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDEsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgzLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg2LCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BRERSRVNTfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVUQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRVRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YjIzMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRVRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBNRVRBLgotICovCi1maW5hbCBjbGFzcyBIZWRNRVRBIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1FVEEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIE1FVEEuCi0JICogJWkxOG47Ci0JICogKGh0dHAtZXF1aXYgTkFNRSAjSU1QTElFRCkKLQkgKiAobmFtZSBOQU1FICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29udGVudCBDREFUQSAjUkVRVUlSRUQpCi0JICogKHNjaGVtZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0KLQkJLy8gKG5hbWUgTkFNRSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTkFNRSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFRUUF9FUVVJViwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05URU5ULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDSEVNRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTWFya0NoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTWFya0NoYW5nZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJjM2QwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1hcmtDaGFuZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogKElOU3xERUwpCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1hcmtDaGFuZ2VzIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTWFya0NoYW5nZXMoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNpdGUgJVVSSTsgI0lNUExJRUQpCi0JICogKGRhdGV0aW1lICVEYXRldGltZTsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0lURSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9EQVRFVElNRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9CUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0JSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWRiZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0JSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIE5PQlIgLS0gbm90IHN0YW5kYXJkIHRhZyBidXQgaXQgaXMgY29tbW9ubHkgdXNlZC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTk9CUiBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQotCXB1YmxpYyBIZWROT0JSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PQlIsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQ09SUkVDVF9EVVBMSUNBVEVEOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJLy8gTm8gYXR0cmlidXRlcyBpcyBkZWZpbmVkLgotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9FTUJFRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0VNQkVELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzExNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0VNQkVELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogTk9FTUJFRC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTk9FTUJFRCBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE5PRU1CRUQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9FTUJFRCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogJWNvcmVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PRlJBTUVTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PRlJBTUVTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDkzMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0ZSQU1FUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIE5PRlJBTUVTLgotICovCi1maW5hbCBjbGFzcyBIZWROT0ZSQU1FUyBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE5PRlJBTUVTKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRlJBTUVTLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9OT0ZSQU1FU19DT05URU5UOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPk5PRlJBTUVTPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5OT0ZSQU1FUzwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGxhYmVsID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FUyk7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGxhYmVsKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FU307Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9TQ1JJUFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9TQ1JJUFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0N2MyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PU0NSSVBULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBOT1NDUklQVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTk9TQ1JJUFQgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWROT1NDUklQVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT1NDUklQVCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9CSkVDVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPQkpFQ1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ0OGUyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9CSkVDVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE9CSkVDVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkT0JKRUNUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT0JKRUNUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9CSkVDVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUEFSQU1fQ09OVEFJTkVSOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eS4KLQkgKiAoZGVjbGFyZSAoZGVjbGFyZSkgI0lNUExJRUQpCi0JICogKGNsYXNzaWQgJVVSSTsgI0lNUExJRUQpCi0JICogKGNvZGViYXNlICVVUkk7ICNJTVBMSUVEKQotCSAqIChkYXRhICVVUkk7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JICogKGNvZGV0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JICogKGFyY2hpdmUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHN0YW5kYnkgJVRleHQ7ICNJTVBMSUVEKQotCSAqIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh1c2VtYXAgJVVSSTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eS4KLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFQ0xBUkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0xBU1NJRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0RFQkFTRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9EQVRBLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09ERVRZUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVJDSElWRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVEFOREJZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9VU0VNQVAsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQkvLyAlYWxpZ247IC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2OGI5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE9MLgotICovCi1maW5hbCBjbGFzcyBIZWRPTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogT0wuCi0JICogKHR5cGUgJU9MU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICogKHN0YXJ0IE5VTUJFUiAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAodHlwZSAlT0xTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk9MX1NUWUxFKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVEFSVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9QVEdST1VQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9QVEdST1VQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTNmYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPUFRHUk9VUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLS8qKgotICogT1BUR1JPVVAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9QVEdST1VQIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT1BUR1JPVVAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUR1JPVVAsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX09QVElPTl9DT05UQUlORVI7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChsYWJlbCAlVGV4dDsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU0FCTEVEfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKGxhYmVsICVUZXh0OyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBQkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEFCRUwsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUSU9OLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9QVElPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjI1ZWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUSU9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIE9QVElPTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkT1BUSU9OIGV4dGVuZHMgSGVkUGNkYXRhIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT059OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE9QVElPTihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT04sIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQl9Ci0KLQkvKioKLQkgKiBPUFRJT04uCi0JICogJWF0dHJzOwotCSAqIChzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChsYWJlbCAlVGV4dDsgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0VMRUNURUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEFCRUwsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBPUFRJT04gaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGZlZWQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkUCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIHRlcm1pbmF0b3JzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlAsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPlA8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYXR0cnM7PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWFsaWduOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICogPHA+PGI+JWFsaWduOzwvYj4gbWVhbnMgPGNvZGU+YWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkpICNJTVBMSUVEPC9jb2RlPi4KLQkgKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIDxjb2RlPmFsaWduPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSBvbmUgaW4KLQkgKiA8Y29kZT5JTUc8L2NvZGU+IG9yIDxjb2RlPlRBQkxFPC9jb2RlPi4gIFNvLCB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0JICogb2YgPGNvZGU+YWxpZ248L2NvZGU+IHNob3VsZCBiZSBsb2NhbHkgY3JlYXRlZCBhbmQgaXQgc2hvdWxkbid0IGJlIHJlZ2lzdGVyZWQKLQkgKiBpbiBhIDxjb2RlPkhDTURvY0ltcGw8L2NvZGU+IGluc3RhbmNlLjwvcD4KLQkgKiA8cD5Ib3dldmVyLCAlYWxpZ24gaXMgdXNlZCBpbiBzZXZhcmFsIHRpbWVzLiAgSSB3b3VsZG4ndCB3cml0ZSBzYW1lIGNvZGUKLQkgKiBpbiBtYW55IHRpbWVzLiAgU28sIEkgYWRkIGEgbmV3IHV0aWxpdHkgbWV0aG9kIGludG8gPGNvZGU+Q01VdGlsPC9jb2RlPgotCSAqIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uLjwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGFkZWMgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBuYW1lcyBvZiB0ZXJtaW5hdG9ycy4KLQkgKiA8Y29kZT5QPC9jb2RlPiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCWlmICh0ZXJtaW5hdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JCS8vPDxEMjE3OTgyCi0JCXRlcm1pbmF0b3JzID0gbmV3IFZlY3RvcigpOwotCQl0ZXJtaW5hdG9ycy5hZGRBbGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZXNPZkJsb2NrKCkpOwotCQl0ZXJtaW5hdG9ycy5hZGQoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJKTsKLQkJdGVybWluYXRvcnMuYWRkKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCk7Ci0JCXRlcm1pbmF0b3JzLmFkZChIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQkvL0QyMTc5ODIKLQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQQVJBTS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQQVJBTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTQxYTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUEFSQU0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBQQVJBTS4KLSAqLwotZmluYWwgY2xhc3MgSGVkUEFSQU0gZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUEFSQU0oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU0sIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBQQVJBTS4KLQkgKiAoaWQgSUQgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHZhbHVldHlwZSAoREFUQXxSRUZ8T0JKRUNUKSBEQVRBKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKG5hbWUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQUkUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUFJFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYTM0NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQUkUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBQUkUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFBSRSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBQUkUgZWxlbWVudCBzaG91bGQga2VlcCBzcGFjZXMgaW4gaXRzIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgSGVkUFJFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQotCQlrZWVwU3BhY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKHdpZHRoIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICh3aWR0aCBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+UFJFPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4lcHJlLmV4Y2x1c2lvbjs8L2NvZGU+LgotCSAqICVwcmUuZXhjbHVzaW9uIGlzOgotCSAqIElNRyB8IE9CSkVDVCB8IEFQUExFVCB8IEJJRyB8IFNNQUxMIHwgU1VCIHwgU1VQIHwgRk9OVCB8IEJBU0VGT05UCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0JKRUNULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVBQTEVULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQklHLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU01BTEwsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVUIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVVAsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT05ULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRUZPTlR9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBjZGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQY2RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2MTQ5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBjZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgUENEQVRBIHR5cGUgZWxlbWVudCBkZWNsYXJhdGlvbnMuPGJyPgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRQY2RhdGEgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQY2RhdGEoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogUENEQVRBIHR5cGUgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgdHlwZS48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBocmFzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQaHJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2ODBkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBocmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiAlcGhyYXNlOwotICovCi1maW5hbCBjbGFzcyBIZWRQaHJhc2UgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFBocmFzZShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQ09SUkVDVF9EVVBMSUNBVEVEOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODViNzU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFEgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9EVVBMSUNBVEVEOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoY2l0ZSAlVVJJOyAjSU1QTElFRCkgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0lURX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU0NSSVBULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNDUklQVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTkxMGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU0NSSVBULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBTQ1JJUFQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNDUklQVCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNDUklQVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBTQ1JJUFQuCi0JICogKGNoYXJzZXQgJUNoYXJzZXQ7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobGFuZ3VhZ2UgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAoZGVmZXIgKGRlZmVyKSAjSU1QTElFRCkKLQkgKiAoZXZlbnQgQ0RBVEEgI0lNUExJRUQpCi0JICogKGZvciAlVVJJOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hBUlNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREVGRVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRVZFTlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9SfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHR5cGUgJUNvbnRlbnRUeXBlOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgInRleHQvamF2YXNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPlNDUklQVDwvY29kZT4gaXMgQ0RBVEEgdHlwZS4KLQkgKiBTbywgdGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ0RBVEEgY29udGVudC48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTRUxFQ1QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU0VMRUNULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzNhMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTRUxFQ1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFNFTEVDVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU0VMRUNUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU0VMRUNUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFTEVDVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfU0VMRUNUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNpemUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobXVsdGlwbGUgKG11bHRpcGxlKSAjSU1QTElFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChzaXplIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTVVMVElQTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DSEFOR0V9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNQQU4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1BBTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjkzMmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1BBTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotCi0vKioKLSAqIFNQQU4uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNQQU4gZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICogU1BBTi4KLQkgKi8KLQlwdWJsaWMgSGVkU1BBTihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TUEFOLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lCYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjN2E4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgU1NJIGRlY2xhcmF0aW9ucy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkU1NJQmFzZSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lCYXNlKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX1NTSTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcE5hbWUpIHsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BOYW1lKTsKLQl9Ci0KLQkvKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcE5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJQ29uZmlnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODQwNmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkNPTkZJRy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJQ29uZmlnIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQ29uZmlnKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUcsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpDT05GSUcuCi0JICogKGVycm1zZyBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKiAodGltZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRVJSTVNHLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkVGTVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVElNRUZNVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRWNoby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Mzg4MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkVDSE8uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUVjaG8gZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lFY2hvKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FQ0hPLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RUNITwotCSAqICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRXhlYy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFeGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MjRkNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFeGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkVYRUMuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUV4ZWMgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lFeGVjKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FWEVDLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RVhFQwotCSAqIChjZ2kgJVVSSTsgI0lNUExJRUQpCi0JICogKGNtZCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0dJLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NNRH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRmxhc3Rtb2QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRmxhc3Rtb2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlYmRmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUZsYXN0bW9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkZMQVNUTU9ELgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lGbGFzdG1vZCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUZsYXN0bW9kKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZMQVNUTU9ECi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGc2l6ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGc2l6ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmJkYmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRnNpemUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6RlNJWkUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUZzaXplIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRnNpemUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZTSVpFLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RlNJWkUKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUluY2x1ZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJSW5jbHVkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIyNGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJSW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpJTkNMVURFLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lJbmNsdWRlIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJSW5jbHVkZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfSU5DTFVERSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOklOQ0xVREUKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSVByaW50ZW52LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSVByaW50ZW52LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMTBiNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lQcmludGVudi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogU1NJOlBSSU5URU5WLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lQcmludGVudiBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSVByaW50ZW52KEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9QUklOVEVOViwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6UFJJTlRFTlYgaGFzIG5vIGF0dHJpYnV0ZXMuICBTbywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JICogYWx3YXlzIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBOb3RlOiBTaW5jZSBzb21lYm9keSBkb2Vzbid0IGV4cGVjdCBudWxsIGlzIHJldHVybmVkLCByZXR1cm4gdGhlIGVtcHR5IGF0dHJpYnV0ZQotCSAqIGxpa2UgYSBjdXN0b20gdGFnIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MmI4NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6U0VULgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lTZXQgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lTZXQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1NFVCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOlNFVAotCSAqICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNUWUxFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNUWUxFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NWI3ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTVFlMRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogU1RZTEUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNUWUxFIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1RZTEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBTVFlMRQotCSAqICVpMThuOwotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobWVkaWEgJU1lZGlhRGVzYzsgI0lNUExJRUQpCi0JICogKHRpdGxlICVUZXh0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NRURJQSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9USVRMRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQkvLyAodHlwZSAlQ29udGVudFR5cGU7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCAidGV4dC9jc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiA8Y29kZT5TVFlMRTwvY29kZT4gaXMgQ0RBVEEgY29udGVudCB0eXBlLiAgU28sIGl0IGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENEQVRBIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU2NyaXB0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTY3JpcHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmY3MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTY3JpcHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBTVUIgYW5kIFNVUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU2NyaXB0cyBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU2NyaXB0cyhTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEFCTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEFCTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkMjY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRBQkxFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBUQUJMRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVEFCTEUgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUQUJMRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVEFCTEU7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUQUJMRS4KLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOwotCSAqIChzdW1tYXJ5ICVUZXh0OyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAoZnJhbWUgJVRGcmFtZTsgI0lNUExJRUQpCi0JICogKHJ1bGVzICVUUnVsZXM7ICNJTVBMSUVEKQotCSAqIChjZWxsc3BhY2luZyAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoY2VsbHBhZGRpbmcgJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGFsaWduICVUQWxpZ247ICNJTVBMSUVEKQotCSAqIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JICogKGRhdGFwYWdlc2l6ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChiYWNrZ3JvdW5kICVVUkk7ICNJTVBMSUVEKQotCSAqIChib3JkZXJjb2xvciAlQ29sb3IgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVyZXNlcnZlZDsKLQkJLy8gLi4uICVyZXNlcnZlZDsgaXMgZW1wdHkgaW4gdGhlIGN1cnJlbnQgRFRELgotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1VNTUFSWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUlVMRVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0VMTFNQQUNJTkcsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0VMTFBBRERJTkcsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkdDT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9EQVRBUEFHRVNJWkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JBQ0tHUk9VTkQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSQ09MT1IgLy8gRDIwNTUxNAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyBhbGlnbiAobG9jYWwpCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gYWxpZ25WYWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTEVGVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQ0VOVEVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXMoYWxpZ25WYWx1ZXMpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGFkZWMgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRFWFRBUkVBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRFWFRBUkVBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTYxYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRURVhUQVJFQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFRFWFRBUkVBLgotICovCi1maW5hbCBjbGFzcyBIZWRURVhUQVJFQSBleHRlbmRzIEhlZFBjZGF0YSB7Ci0KLQkvKioKLQkgKiBURVhUQVJFQSBzaG91bGQga2VlcCBzcGFjZXMgaW4gaXRzIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgSGVkVEVYVEFSRUEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQotCQlrZWVwU3BhY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBURVhUQVJFQS4KLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCSAqIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uc2VsZWN0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU0FCTEVELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFQURPTkxZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBQklOREVYLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VTU0tFWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTlNFTEVDVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkNIQU5HRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU1RZTEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRJVExFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRJVExFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTkwMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUSVRMRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogVElUTEUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRJVExFIGV4dGVuZHMgSGVkUGNkYXRhIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUSVRMRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIFRJVExFLgotCSAqICVpMThuOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+VElUTEU8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVoZWFkLm1pc2M7PC9jb2RlPi4KLQkgKiAlaGVhZC5taXNjOyBpcyA8Y29kZT5TQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVDwvY29kZT4uCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyAoU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QpCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkssIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1R9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OGE1NGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBUUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkVFIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUn07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVFIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFIsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RDRUxMX0NPTlRBSU5FUjsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlY2VsbGhhbGlnbjsKLQkgKiAlY2VsbHZhbGlnbjsKLQkgKiAoYmdjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqIChiYWNrZ3JvdW5kICVVUkk7ICNJTVBMSUVEKQotCSAqIChib3JkZXJjb2xvciAlQ29sb3IgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICogKGhlaWdodCAlTGVuZ3RoICNJTVBMSUVEKSBidWcyMjQ2Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CR0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JBQ0tHUk9VTkQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hUIC8vIEQyMDU1MTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogVFIgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQm9keS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUYWJsZUJvZHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2ZWVlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQm9keS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBUSEVBRC9URk9PVC9UQk9EWQotICovCi1maW5hbCBjbGFzcyBIZWRUYWJsZUJvZHkgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DQVBUSU9OLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MR1JPVVAsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEZPT1R9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRhYmxlQm9keShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RSX0NPTlRBSU5FUjsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpZiAoZWxlbWVudE5hbWUgPT0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKSB7Ci0JCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQkJfQotCQllbHNlIHsKLQkJCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JCX0KLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRCT0RZL1RGT09UL1RIRUFECi0JICogJWF0dHJzOwotCSAqICVjZWxsaGFsaWduOwotCSAqICVjZWxsdmFsaWduOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbGhhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsaGFsaWduKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbHZhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsdmFsaWduKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIFRIRUFELCBURk9PVCBhbmQgVEJPRFkgaGF2ZSB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUYWJsZUNlbGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVGFibGVDZWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmNiNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUYWJsZUNlbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogKFRIIHwgVEQpLgotICovCi1maW5hbCBjbGFzcyBIZWRUYWJsZUNlbGwgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRILCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRhYmxlQ2VsbChTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoYWJiciAlVGV4dDsgI0lNUExJRUQpCi0JICogKGF4aXMgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhlYWRlcnMgSURSRUZTICNJTVBMSUVEKQotCSAqIChzY29wZSAlU2NvcGU7ICNJTVBMSUVEKQotCSAqIChyb3dzcGFuIE5VTUJFUiAxKQotCSAqIChjb2xzcGFuIE5VTUJFUiAxKQotCSAqICVjZWxsaGFsaWduOwotCSAqICVjZWxsdmFsaWduOwotCSAqIChub3dyYXAgKG5vd3JhcCkgI0lNUExJRUQpCi0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYmFja2dyb3VuZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyY29sb3IgJUNvbG9yICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbGhhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsaGFsaWduKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbHZhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsdmFsaWduKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUJCUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BWElTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFQURFUlMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XU1BBTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTUEFOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PV1JBUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CR0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CQUNLR1JPVU5ELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SIC8vIEQyMDU1MTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogVEggYW5kIFREIGhhdmUgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxYzVhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFVMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBVTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkVUwgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVUwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFVMLgotCSAqICh0eXBlICVVTFN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vICh0eXBlICVVTFN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCS8vICVVTFN0eWxlOyBpcyAoZGlzY3xzcXVhcmV8Y2lyY2xlKS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRElTQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU1FVQVJFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DSVJDTEV9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTVBBQ1R9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRXQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkV0JSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NThmZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRXQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotZmluYWwgY2xhc3MgSGVkV0JSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JcHVibGljIEhlZFdCUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5XQlIsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQlJFQUsuCi0JCS8vIHNhbWUgYXMgQlIuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQlJFQUs7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQkvLyBObyBhdHRyaWJ1dGVzIGlzIGRlZmluZWQuCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KQ00yMERvY0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSkNNMjBEb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2N2I1OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KQ00yMERvY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDTURvY3VtZW50IGZvciBKU1AgMi4wLgotICovCi1jbGFzcyBKQ00yMERvY0ltcGwgZXh0ZW5kcyBKQ01Eb2NJbXBsIHsKLQkvKioKLQkgKiBKQ00yMERvY0ltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkNNMjBEb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2VJbXBsIHRhcmdldE5hbWVzcGFjZSkgewotCQlzdXBlcihkb2NUeXBlTmFtZSwgdGFyZ2V0TmFtZXNwYWNlLCBuZXcgSlNQMjBFbGVtZW50Q29sbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pDTURvY0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSkNNRG9jSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWZlNGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSkNNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgQ01Eb2N1bWVudCBmb3IgSlNQIDEuMSBhbmQgSlNQIDEuMi4KLSAqLwotY2xhc3MgSkNNRG9jSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBKU1BDTURvY3VtZW50IHsKLQotCS8qKiBOYW1lc3BhY2UgZm9yIGFsbCBuYW1lcyBvZiBlbGVtZW50cywgZW50aXRpZXMgYW5kIGF0dHJpYnV0ZXMuICovCi0JcHJpdmF0ZSBDTU5hbWVzcGFjZUltcGwgbmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIEpTUEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIEhDTURvY0ltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkNNRG9jSW1wbChTdHJpbmcgZG9jVHlwZU5hbWUsIENNTmFtZXNwYWNlSW1wbCB0YXJnZXROYW1lc3BhY2UpIHsKLQkJdGhpcyhkb2NUeXBlTmFtZSwgdGFyZ2V0TmFtZXNwYWNlLCBuZXcgSlNQRWxlbWVudENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JSkNNRG9jSW1wbChTdHJpbmcgZG9jVHlwZU5hbWUsIENNTmFtZXNwYWNlSW1wbCB0YXJnZXROYW1lc3BhY2UsIEpTUEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9jVHlwZU5hbWUpOwotCQluYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JCWVsZW1lbnRzID0gY29sbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMTFOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMTFOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxYTliOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDExTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLS8qKgotICogSlNQIDEuMSBOYW1lc3BhY2UuIE5vdGUsIHRoaXMgaW50ZXJmYWNlIHdhcyAKLSAqIGNvcGllZCBmb3JtIEpTUCBjb3JlIHBhY2thZ2VzLiBPbmUgaW1wbGljYXRpb24gCi0gKiBpcyB0aGF0IGV4dHJhIGNhcmUgaXMgbmVlZGVkIGluIHVzaW5nICc9PScgaW5zdGVhZCAKLSAqIG9mICcuZXF1YWxzJy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKU1AxMU5hbWVzcGFjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbGVtZW50TmFtZSB7Ci0JCS8vIEVsZW1lbnQgbmFtZXMKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUTEVUID0gImpzcDpzY3JpcHRsZXQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT04gPSAianNwOmV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xBUkFUSU9OID0gImpzcDpkZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1BBR0UgPSAianNwOmRpcmVjdGl2ZS5wYWdlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfSU5DTFVERSA9ICJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9UQUdMSUIgPSAianNwOmRpcmVjdGl2ZS50YWdsaWIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRUJFQU4gPSAianNwOnVzZUJlYW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFBST1BFUlRZID0gImpzcDpzZXRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUUFJPUEVSVFkgPSAianNwOmdldFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFID0gImpzcDppbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEID0gImpzcDpmb3J3YXJkIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU4gPSAianNwOnBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1TID0gImpzcDpwYXJhbXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTExCQUNLID0gImpzcDpmYWxsYmFjayI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU0gPSAianNwOnBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gImpzcDpyb290IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gImpzcDp0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUDExX1VSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1RBR19QUkVGSVggPSAianNwIjsgLy8kTk9OLU5MUy0xJAotCS8vIGF0dHJpYnV0ZSBuYW1lcwotCS8vICAgZGlyZWN0aXZlLnBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VYVEVORFMgPSAiZXh0ZW5kcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRVNTSU9OID0gInNlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JVRkZFUiA9ICJidWZmZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FVVE9GTFVTSCA9ICJhdXRvRmx1c2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lTX1RIUkVBRF9TQUZFID0gImlzVGhyZWFkU2FmZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSU5GTyA9ICJpbmZvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FUlJPUl9QQUdFID0gImVycm9yUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNfRVJST1JfUEFHRSA9ICJpc0Vycm9yUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFHRV9FTkNPRElORyA9ICJwYWdlRW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JLy8gICBkaXJlY3RpdmUuaW5jbHVkZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JLy8gICBkaXJlY3RpdmUudGFnbGliCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JLy8gICB1c2VCZWFuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TQ09QRSA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JFQU5fTkFNRSA9ICJiZWFuTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgc2V0UHJvcGVydHkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBUkFNID0gInBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgaW5jbHVkZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQUdFID0gInBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZMVVNIID0gImZsdXNoIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgcGx1Z2luCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREUgPSAiY29kZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERUJBU0UgPSAiY29kZWJhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gImFsaWduIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BUkNISVZFID0gImFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hTUEFDRSA9ICJoc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0pSRVZFUlNJT04gPSAianJldmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVlNQQUNFID0gInZzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05TUExVR0lOVVJMID0gIm5zcGx1Z2ludXJsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JRVBMVUdJTlVSTCA9ICJpZXBsdWdpbnVybCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHJvb3QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfWE1MTlNfSlNQID0gInhtbG5zOmpzcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCS8vIGF0dHJpYnV0ZSB2YWx1ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSkFWQSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ1RfREVGQVVMVCA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI7Ly9EMTk1MzY2IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JVRlNJWl9ERUZBVUxUID0gIjhrYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NFU1NJT04gPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFUVVFU1QgPSAicmVxdWVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQkVBTiA9ICJiZWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQVBQTEVUID0gImFwcGxldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9NSURETEUgPSAibWlkZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xFRlQgPSAibGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gInJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSlZFUjExID0gIjEuMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1hNTE5TX0pTUCA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1AyMEVsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDIwRWxlbWVudENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhMWRhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDIwRWxlbWVudENvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zIG9mIEpTUCAxLjEgYW5kIEpTUCAxLjIuCi0gKi8KLWZpbmFsIGNsYXNzIEpTUDIwRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBKU1BFbGVtZW50Q29sbGVjdGlvbiBpbXBsZW1lbnRzIEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCS8vIGVsZW1lbnQgSURzCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzMjAgZXh0ZW5kcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CT0RZID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FUVFJJQlVURSA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTEVNRU5UID0gMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VVFBVVCA9IDIwOwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMTA1LgotCQkJLy8gLS0gNS8yNS8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkczIwLmNsYXNzOwotCQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJCW51bW9maWRzID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIklEXyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJbnVtb2ZpZHMrKzsKLQkJCX0KLQkJCXJldHVybiBudW1vZmlkczsKLQkJfQotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQl9Ci0KLQkvLyBhdHRyaWJ1dGUgY3JlYXRlcgotCXByaXZhdGUgY2xhc3MgSkFDcmVhdGVyMjAgZXh0ZW5kcyBKQUNyZWF0ZXIgewotCQlwdWJsaWMgSkFDcmVhdGVyMjAoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCBnZXREZWNsYXJhdGlvbnMoaW50IGVpZCkgewotCQkJc3dpdGNoIChlaWQpIHsKLQkJCQljYXNlIElkczIwLklEX0FUVFJJQlVURSA6Ci0JCQkJCWNyZWF0ZUZvckF0dHJpYnV0ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkczIwLklEX0VMRU1FTlQgOgotCQkJCQljcmVhdGVGb3JFbGVtZW50KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzMjAuSURfQk9EWSA6Ci0JCQkJCWNyZWF0ZUZvckJvZHkoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMyMC5JRF9PVVRQVVQgOgotCQkJCQljcmVhdGVGb3JPdXRwdXQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX1RBR0xJQiA6Ci0JCQkJCWNyZWF0ZUZvckRpclRhZ2xpYigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfUEFHRSA6Ci0JCQkJCWNyZWF0ZUZvckRpclBhZ2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfUk9PVCA6Ci0JCQkJCWNyZWF0ZUZvclJvb3QoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfUExVR0lOIDoKLQkJCQkJY3JlYXRlRm9yUGx1Z2luKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlzdXBlci5nZXREZWNsYXJhdGlvbnMoZWlkKTsKLQkJCX0KLQkJCXJldHVybiBkZWNsYXJhdGlvbnM7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yQm9keSgpIHsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JPdXRwdXQoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTUlUX1hNTF9ERUNMKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0UsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfWUVTLCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX05PfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX05PKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfT01JVF9YTUxfREVDTCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfUk9PVF9FTEVNRU5UKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfUk9PVF9FTEVNRU5ULCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9TWVNURU0pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9TWVNURU0sIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1BVQkxJQyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1BVQkxJQywgYWRlYyk7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hhbmdlZCBpbiAyLjAKLQkJICovCi0JCXZvaWQgY3JlYXRlRm9yRGlyVGFnbGliKCkgewotCQkJLy8gKCJ1cmkiIFVSSSBPUFRJT05BTCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1VSSSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVVJJLCBhZGVjKTsKLQotCQkJLy8gKCJ0YWdkaXIiIFVSSSBPUFRJT05BTCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSLCBhZGVjKTsKLQotCQkJLy8gKCJwcmVmaXgiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUFJFRklYKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BSRUZJWCwgYWRlYyk7Ci0JCX0KLQkJCi0JCXZvaWQgY3JlYXRlRm9yRGlyUGFnZSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBudWxsOwotCQkJLy8gKCJsYW5ndWFnZSIgQ0RBVEEgREVDTEFSRUQgImphdmEiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTEFOR1VBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfSkFWQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9MQU5HVUFHRSwgYWRlYyk7Ci0KLQkJCS8vICgiZXh0ZW5kcyIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0VYVEVORFMpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0VYVEVORFMsIGFkZWMpOwotCi0JCQkvLyAoImltcG9ydCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lNUE9SVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSU1QT1JULCBhZGVjKTsKLQotCQkJLy8gKCJzZXNzaW9uIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAidHJ1ZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX1NFU1NJT04sIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1NFU1NJT04sIGFkZWMpOwotCi0JCQkvLyAoImJ1ZmZlciIgQ0RBVEEgREVDTEFSRUQgIjhrYiIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9CVUZGRVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQlVGU0laX0RFRkFVTFQpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQlVGRkVSLCBhZGVjKTsKLQotCQkJLy8gKCJhdXRvRmx1c2giIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJ0cnVlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShBVFRSX05BTUVfQVVUT0ZMVVNILCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BVVRPRkxVU0gsIGFkZWMpOwotCi0JCQkvLyAoImlzVGhyZWFkU2FmZSIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgInRydWUiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9JU19USFJFQURfU0FGRSwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSVNfVEhSRUFEX1NBRkUsIGFkZWMpOwotCi0JCQkvLyAoImluZm8iIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JTkZPKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JTkZPLCBhZGVjKTsKLQotCQkJLy8gKCJlcnJvclBhZ2UiIFVSSSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRVJST1JfUEFHRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0VSUk9SX1BBR0UsIGFkZWMpOwotCi0JCQkvLyAoImlzRXJyb3JQYWdlIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAiZmFsc2UiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFLCBBVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSVNfRVJST1JfUEFHRSwgYWRlYyk7Ci0KLQkJCS8vICgiY29udGVudFR5cGUiIENEQVRBIERFQ0xBUkVEICJ0ZXh0L2h0bWw7IElTTy04ODU5LTEiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09OVEVOVF9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0NUX0RFRkFVTFQpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09OVEVOVF9UWVBFLCBhZGVjKTsKLQotCQkJLy8gKCJwYWdlRW5jb2RpbmciIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0VOQ09ESU5HX0RFRkFVTFQpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFHRV9FTkNPRElORywgYWRlYyk7Ci0KLQkJCS8vICgiaXNFTElnbm9yZWQiIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJmYWxzZSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU0VMSUdOT1JFRCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW117QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfSVNFTElHTk9SRUQsIGFkZWMpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRWxlbWVudCgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yQXR0cmlidXRlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVFJJTSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UUklNLCBhZGVjKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvclJvb3QoKSB7Ci0JCQkvLyAoInhtbG5zOmpzcCIgQ0RBVEEgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfWE1MTlNfSlNQKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1hNTE5TX0pTUCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9YTUxOU19KU1AsIGFkZWMpOwotCQkJLy8gKCJ2ZXJzaW9uIiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1ZFUlNJT04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSlNQX1ZFUl8yMCk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUGx1Z2luKCkgewotCQkJLy8gKCJ0eXBlIiBFTlVNIFJFUVVJUkVEIChiZWFufGFwcGxldCkpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfQkVBTiwgQVRUUl9WQUxVRV9BUFBMRVR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoImNvZGUiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09ERSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09ERSwgYWRlYyk7Ci0KLQkJCS8vICgiY29kZWJhc2UiIFVSSSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPREVCQVNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT0RFQkFTRSwgYWRlYyk7Ci0KLQkJCS8vICgiYWxpZ24iIEVOVU0gSU1QTElFRCAodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9BTElHTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBhbGlnbnMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKGFsaWducyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0JPVFRPTSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0KLQkJCS8vICgiYXJjaGl2ZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0FSQ0hJVkUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FSQ0hJVkUsIGFkZWMpOwotCi0JCQkvLyAoImhlaWdodCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0hFSUdIVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSEVJR0hULCBhZGVjKTsKLQotCQkJLy8gKCJoc3BhY2UiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9IU1BBQ0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0hTUEFDRSwgYWRlYyk7Ci0KLQkJCS8vICgianJldmVyc2lvbiIgQ0RBVEEgREVDTEFSRUQgIjEuMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9KUkVWRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0pWRVIxMik7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9KUkVWRVJTSU9OLCBhZGVjKTsKLQotCQkJLy8gKCJuYW1lIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgidnNwYWNlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVlNQQUNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WU1BBQ0UsIGFkZWMpOwotCi0JCQkvLyAoIndpZHRoIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfV0lEVEgpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1dJRFRILCBhZGVjKTsKLQotCQkJLy8gKCJuc3BsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OU1BMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05TUExVR0lOVVJMLCBhZGVjKTsKLQotCQkJLy8gKCJpZXBsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JRVBMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lFUExVR0lOVVJMLCBhZGVjKTsKLQkJCQotCQkJLy8gKCJtYXlzY3JpcHQiIEVOVU0gSU1QTElFRCAodHJ1ZSB8IGZhbHNlKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTUFZU0NSSVBUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKG5ldyBTdHJpbmdbXSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVlTQ1JJUFQsIGFkZWMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkczIwLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfU0NSSVBUTEVUXSA9IFNDUklQVExFVDsKLQkJbmFtZXNbSWRzLklEX0VYUFJFU1NJT05dID0gRVhQUkVTU0lPTjsKLQkJbmFtZXNbSWRzLklEX0RFQ0xBUkFUSU9OXSA9IERFQ0xBUkFUSU9OOwotCQluYW1lc1tJZHMuSURfRElSRUNUSVZFX1BBR0VdID0gRElSRUNUSVZFX1BBR0U7Ci0JCW5hbWVzW0lkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERV0gPSBESVJFQ1RJVkVfSU5DTFVERTsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9UQUdMSUJdID0gRElSRUNUSVZFX1RBR0xJQjsKLQkJbmFtZXNbSWRzLklEX1VTRUJFQU5dID0gVVNFQkVBTjsKLQkJbmFtZXNbSWRzLklEX1NFVFBST1BFUlRZXSA9IFNFVFBST1BFUlRZOwotCQluYW1lc1tJZHMuSURfR0VUUFJPUEVSVFldID0gR0VUUFJPUEVSVFk7Ci0JCW5hbWVzW0lkcy5JRF9JTkNMVURFXSA9IElOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9GT1JXQVJEXSA9IEZPUldBUkQ7Ci0JCW5hbWVzW0lkcy5JRF9QTFVHSU5dID0gUExVR0lOOwotCQluYW1lc1tJZHMuSURfUEFSQU1TXSA9IFBBUkFNUzsKLQkJbmFtZXNbSWRzLklEX0ZBTExCQUNLXSA9IEZBTExCQUNLOwotCQluYW1lc1tJZHMuSURfUEFSQU1dID0gUEFSQU07Ci0JCW5hbWVzW0lkcy5JRF9ST09UXSA9IFJPT1Q7Ci0JCW5hbWVzW0lkcy5JRF9URVhUXSA9IFRFWFQ7Ci0JCW5hbWVzW0lkczIwLklEX0JPRFldID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWTsKLQkJbmFtZXNbSWRzMjAuSURfQVRUUklCVVRFXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFUVFJJQlVURTsKLQkJbmFtZXNbSWRzMjAuSURfRUxFTUVOVF0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5FTEVNRU5UOwotCQluYW1lc1tJZHMyMC5JRF9PVVRQVVRdID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1VUUFVUOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBKU1AyMEVsZW1lbnRDb2xsZWN0aW9uKCkgewotCQlzdXBlcihKU1AyMEVsZW1lbnRDb2xsZWN0aW9uLm5hbWVzLCBUT0xFUkFOVF9DQVNFKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWlkCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlDTUdyb3VwSW1wbCBjcmVhdGVDb250ZW50KGludCBlaWQpIHsKLQkJaWYgKGVpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JCUNNTm9kZSBjaGlsZCA9IG51bGw7Ci0KLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJCQlpbnQgdmFsaWRDaGlsZHJlbltdID0gewotCQkJCS8vICVEaXJlY3RpdmVzOwotCQkJCQkJCUlkcy5JRF9URVhULCBJZHMuSURfRElSRUNUSVZFX1BBR0UsIElkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERSwgSWRzMjAuSURfQk9EWSwgSWRzMjAuSURfQVRUUklCVVRFLAotCQkJCQkJCS8vICVTY3JpcHRzOwotCQkJCQkJCUlkcy5JRF9TQ1JJUFRMRVQsIElkcy5JRF9ERUNMQVJBVElPTiwgSWRzLklEX0VYUFJFU1NJT04sCi0JCQkJCQkJLy8gJUFjdGlvbnM7Ci0JCQkJCQkJSWRzLklEX1VTRUJFQU4sIElkcy5JRF9TRVRQUk9QRVJUWSwgSWRzLklEX0dFVFBST1BFUlRZLCBJZHMuSURfSU5DTFVERSwgSWRzLklEX0ZPUldBUkQsIElkcy5JRF9QTFVHSU59OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQljaGlsZCA9IGl0ZW0odmFsaWRDaGlsZHJlbltpXSk7Ci0JCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQkJY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJY29udGVudCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnQoZWlkKTsKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlaWQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCUhUTUxFbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlRWxlbURlY2woaW50IGVpZCkgewotCQlpZiAoZWlkID09IElEX1VOS05PV04pCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlUeXBlUGFja2V0IHBhY2tldCA9IG5ldyBUeXBlUGFja2V0KCk7Ci0JCXN3aXRjaCAoZWlkKSB7Ci0JCQljYXNlIElkczIwLklEX0JPRFkgOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMyMC5JRF9FTEVNRU5UIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRUxFTUVOVDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzMjAuSURfQVRUUklCVVRFIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVRUUklCVVRFOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMyMC5JRF9PVVRQVVQgOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PVVRQVVQ7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfVEFHTElCIDoKLQkJCQkvLyBkaXJlY3RpdmUudGFnbGliCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfVEFHTElCOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX1BBR0UgOgotCQkJCS8vIGRpcmVjdGl2ZS5wYWdlCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfUEFHRTsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX0RJUkVDVElWRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCXBhY2tldC5uYW1lID0gUk9PVDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsgLy8gc2FtZSBhcyBIVE1MCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9QTFVHSU4gOgotCQkJCS8vIHBsdWdpbgotCQkJCXBhY2tldC5uYW1lID0gUExVR0lOOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlRWxlbURlY2woZWlkKTsKLQkJfQotCQlFbGVtRGVjbCBkZWNsID0gbmV3IEVsZW1EZWNsKHBhY2tldCk7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IGNyZWF0ZUNvbnRlbnQoZWlkKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCWRlY2wuc2V0Q29udGVudChjb250ZW50KTsKLQotCQlKQUNyZWF0ZXIyMCBjcmVhdGVyID0gbmV3IEpBQ3JlYXRlcjIwKCk7Ci0JCWRlY2wuc2V0QXR0cmlidXRlcyhjcmVhdGVyLmdldERlY2xhcmF0aW9ucyhlaWQpKTsKLQotCQlyZXR1cm4gZGVjbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDIwTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDIwTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTM4YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1AyME5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIE5ldyBuYW1lcyBmb3IgSlNQIDIuMCBzcGVjLgotICogCi0gKiBAZGVwcmVjYXRlZCAtIHVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDIwTmFtZXNwYWNlCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBKU1AyME5hbWVzcGFjZSBleHRlbmRzIEpTUDExTmFtZXNwYWNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1AyMF9VUkkgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBOZXcgZWxlbWVudHMgZm9yIEpTUCAyLjAgc3BlYy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbGVtZW50TmFtZSBleHRlbmRzIEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQkJU3RyaW5nIERJUkVDVElWRV9UQUcgPSAianNwOmRpcmVjdGl2ZS50YWciOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBESVJFQ1RJVkVfQVRUUklCVVRFID0gImpzcDpkaXJlY3RpdmUuYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgRElSRUNUSVZFX1ZBUklBQkxFID0gImpzcDpkaXJlY3RpdmUudmFyaWFibGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBCT0RZID0gImpzcDpib2R5IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQVRUUklCVVRFID0gImpzcDphdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBFTEVNRU5UID0gImpzcDplbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgRE9CT0RZID0gImpzcDpkb0JvZHkiOwotCQlTdHJpbmcgSU5WT0tFID0gImpzcDppbnZva2UiOwotCQlTdHJpbmcgT1VUUFVUID0gImpzcDpvdXRwdXQiOwotCX0KLQotCVN0cmluZyBBVFRSX05BTUVfVEFHRElSID0gInRhZ2RpciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRSX05BTUVfRElTUExBWV9OQU1FID0gImRpc3BsYXktbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0JPRFlfQ09OVEVOVCA9ICJib2R5LWNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9TTUFMTF9JQ09OID0gInNtYWxsLWljb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9MQVJHRV9JQ09OID0gImxhcmdlLWljb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0VYQU1QTEUgPSAiZXhhbXBsZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0xBTkdVQUdFID0gImxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfSVNFTElHTk9SRUQgPSAiaXNFTElnbm9yZWQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUUl9OQU1FX1JFUVVJUkVEID0gInJlcXVpcmVkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfRlJBR01FTlQgPSAiZnJhZ21lbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9SVEVYUFJWQUxVRSA9ICJydGV4cHJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRSX05BTUVfTkFNRV9HSVZFTiA9ICJuYW1lLWdpdmVuIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfTkFNRV9GUk9NX0FUVFJJQlVURSA9ICJuYW1lLWZyb20tYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfQUxJQVMgPSAiYWxpYXMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9WQVJJQUJMRV9DTEFTUyA9ICJ2YXJpYWJsZS1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0RFQ0xBUkUgPSAiZGVjbGFyZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRSX1ZBTFVFX1NDUklQVExFU1MgPSAic2NyaXB0bGVzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9UQUdERVBFTkRFTlQgPSAidGFnZGVwZW5kZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX1ZBTFVFX0VNUFRZID0gImVtcHR5IjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfTkFNRV9UUklNID0gInRyaW0iOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUUl9OQU1FX1ZBUiA9ICJ2YXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9WQVJSRUFERVIgPSAidmFyUmVhZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfTkFNRV9PTUlUX1hNTF9ERUNMID0gIm9taXQteG1sLWRlY2xhcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfRE9DVFlQRV9ST09UX0VMRU1FTlQgPSAiZG9jdHlwZS1yb290LWVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9ET0NUWVBFX1NZU1RFTSA9ICJkb2N0eXBlLXN5c3RlbSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0RPQ1RZUEVfUFVCTElDID0gImRvY3R5cGUtcHVibGljIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfVkFMVUVfTk8gPSAibm8iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfWUVTID0gInllcyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRSX1ZBTFVFX1NDT1BFX0FUX0VORCA9ICJBVF9FTkQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfU0NPUEVfQVRfQkVHSU4gPSAiQVRfQkVHSU4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfU0NPUEVfTkVTVEVEID0gIk5FU1RFRCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRSX05BTUVfRFlOQU1JQ19BVFRSSUJVVEVTID0gImR5bmFtaWMtYXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQVRUUl9WQUxVRV9FTkNPRElOR19ERUZBVUxUID0gIklTTy04ODU5LTEiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEFUVFJfVkFMVUVfVkFSSUFCTEVfQ0xBU1NfREVGQVVMVCA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRSX05BTUVfTUFZU0NSSVBUID0gIm1heXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQVRUUl9WQUxVRV9KVkVSMTIgPSAiMS4yIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRSX1ZBTFVFX0pTUF9WRVJfMjAgPSAiMi4wIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEpTUCAyLjEgYXR0cmlidXRlcwotLy8JU3RyaW5nIEFUVFJfTkFNRV9ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMID0gImRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCI7IC8vJE5PTi1OTFMtMSQKLS8vCVN0cmluZyBBVFRSX05BTUVfVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVMgPSAidHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyYmZiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogSlNQIGV4dGVuc2lvbiBmb3IgQ01Eb2N1bWVudC4KLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHNvbWUgc2hvcnQgaGFuZCBtZXRob2RzIHRvIGdldCBkZWNsYXJhdGlvbnMKLSAqIGJ5IGEgbmFtZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBKU1BDTURvY3VtZW50IGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50IHsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGEgZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgYSBKU1AgZWxlbWVudC4KLQkgKiBKU1AgZGVjbGFyYXRpb24gY2xhc3MgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGludGVyZmFjZS4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUhUTUxFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50TmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUEVsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MTdmOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BFbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgdGhlIEpTUCAxLjEgYW5kIDEuMi4KLSAqLwotY2xhc3MgSlNQRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCi0JY2xhc3MgVHlwZVBhY2tldCB7Ci0JCXB1YmxpYyBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCXB1YmxpYyBpbnQgY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZOwotCQlwdWJsaWMgaW50IG9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfTk9ORTsKLQkJcHVibGljIGludCBsaW5lQnJlYWsgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX05PTkU7Ci0JCXB1YmxpYyBpbnQgbGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfTk9ORTsKLQkJcHVibGljIGludCBjb3JyZWN0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5DT1JSRUNUX05PTkU7Ci0JCXB1YmxpYyBpbnQgZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfWE1MOwotCQlwdWJsaWMgYm9vbGVhbiBpbmRlbnRDaGlsZCA9IGZhbHNlOwotCi0JCXB1YmxpYyBUeXBlUGFja2V0KCkgewotCQl9Ci0JfQotCi0JLyoqIEpTUCBlbGVtZW50IGRlY2xhcmF0aW9uLiAqLwotCWNsYXNzIEVsZW1EZWNsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24sIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIHsKLQkJcHJpdmF0ZSBUeXBlUGFja2V0IHR5cGUgPSBudWxsOwotCQlwcml2YXRlIENNR3JvdXBJbXBsIGNvbnRlbnQgPSBudWxsOwotCQlwcml2YXRlIENNTmFtZWROb2RlTWFwSW1wbCBhdHRyaWJ1dGVzID0gbnVsbDsKLQotCQlwdWJsaWMgRWxlbURlY2woVHlwZVBhY2tldCB0KSB7Ci0JCQlzdXBlcih0Lm5hbWUsIDEsIDEpOwotCQkJdHlwZSA9IHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCQljb250ZW50ID0gZ3JvdXA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKENNTmFtZWROb2RlTWFwSW1wbCBhdHRycykgewotCQkJYXR0cmlidXRlcyA9IGF0dHJzOwotCQl9Ci0KLQkJLy8gaW1wbGVtZW50cyBDTU5vZGUKLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChwcCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJcmV0dXJuIHBwLnN1cHBvcnRzKHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsgLy9EMjA4ODM5Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJCVN0cmluZyBteU5hbWUgPSBnZXRFbGVtZW50TmFtZSgpOwotCQkJCWlmIChteU5hbWUgPT0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUExVR0lOKSB7Ci0JCQkJCXJldHVybiBnZXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKTsgLy8gb3V0ZXIgY2xhc3MgbWV0aG9kLgotCQkJCX0KLQkJCQllbHNlIGlmIChteU5hbWUgPT0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKSB7Ci0JCQkJCXJldHVybiBnZXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU0pOyAvLyBvdXRlciBjbGFzcyBtZXRob2QuCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCQlpZiAocHAgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJcmV0dXJuIHBwLmdldCh0aGlzKTsKLQkJCX0KLQkJfQotCi0JCS8vIGltcGxlbWVudGVzIENNRWxlbWVudERlY2xhcmF0aW9uCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JCX0KLQotCQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCQlyZXR1cm4gY29udGVudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZS5jb250ZW50OwotCQl9Ci0KLQkJcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBpbXBsZW1lbnRlcyBIVE1MRWxlbWVudERlY2xhcmF0aW9uCi0JCXB1YmxpYyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q29ycmVjdGlvblR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZS5jb3JyZWN0OwotCQl9Ci0KLQkJcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTUNvbnRlbnQgZ2V0SW5jbHVzaW9uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJCXJldHVybiBFTVBUWV9NQVA7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEZvcm1hdFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZS5mb3JtYXQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExheW91dFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZS5sYXlvdXQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExpbmVCcmVha0hpbnQoKSB7Ci0JCQlyZXR1cm4gdHlwZS5saW5lQnJlYWs7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE9taXRUeXBlKCkgewotCQkJcmV0dXJuIHR5cGUub21pdDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZGVjKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRLZWVwU3BhY2VzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gdHlwZS5pbmRlbnRDaGlsZDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzSlNQKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvLyBlbGVtZW50IElEcwotCXN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ1JJUFRMRVQgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FWFBSRVNTSU9OID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVDTEFSQVRJT04gPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVJFQ1RJVkVfUEFHRSA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUkVDVElWRV9JTkNMVURFID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1RBR0xJQiA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VTRUJFQU4gPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRVRQUk9QRVJUWSA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFVFBST1BFUlRZID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5DTFVERSA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUldBUkQgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUExVR0lOID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNUyA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GQUxMQkFDSyA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBTSA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ST09UID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RFWFQgPSAxNjsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8vIGF0dHJpYnV0ZSBjcmVhdGVyCi0JY2xhc3MgSkFDcmVhdGVyIGltcGxlbWVudHMgSlNQMTFOYW1lc3BhY2UgewotCQkvLyBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkJY2xhc3MgQXR0ckRlY2wgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQkJCUhUTUxDTURhdGFUeXBlSW1wbCB0eXBlID0gbnVsbDsKLQkJCWludCB1c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0KLQkJCS8vIG1ldGhvZHMKLQkJCXB1YmxpYyBBdHRyRGVjbChTdHJpbmcgYXR0ck5hbWUpIHsKLQkJCQlzdXBlcihhdHRyTmFtZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkgewotCQkJCXJldHVybiB0eXBlOwotCQkJfQotCi0JCQkvKiogQGRlcHJlY2F0ZWQgYnkgc3VwZXJjbGFzcyAqLwotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJaWYgKHR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxUKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlyZXR1cm4gdHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCX0KLQotCQkJLyoqIEBkZXByZWNhdGVkICBieSBzdXBlcmNsYXNzICovCi0JCQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QodHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkpKTsKLQkJCQlyZXR1cm4gdi5lbGVtZW50cygpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJCXJldHVybiBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQkJCXJldHVybiB1c2FnZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zID0gbnVsbDsKLQotCQlwdWJsaWMgSkFDcmVhdGVyKCkgewotCQkJZGVjbGFyYXRpb25zID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCBnZXREZWNsYXJhdGlvbnMoaW50IGVpZCkgewotCQkJc3dpdGNoIChlaWQpIHsKLQkJCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfUEFHRSA6Ci0JCQkJCWNyZWF0ZUZvckRpclBhZ2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX0lOQ0xVREUgOgotCQkJCQljcmVhdGVGb3JEaXJJbmNsdWRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCQljcmVhdGVGb3JEaXJUYWdsaWIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfVVNFQkVBTiA6Ci0JCQkJCWNyZWF0ZUZvclVzZUJlYW4oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfU0VUUFJPUEVSVFkgOgotCQkJCQljcmVhdGVGb3JTZXRQcm9wZXJ0eSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9HRVRQUk9QRVJUWSA6Ci0JCQkJCWNyZWF0ZUZvckdldFByb3BlcnR5KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0lOQ0xVREUgOgotCQkJCQljcmVhdGVGb3JJbmNsdWRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0ZPUldBUkQgOgotCQkJCQljcmVhdGVGb3JGb3J3YXJkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJCWNyZWF0ZUZvclBsdWdpbigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9QQVJBTSA6Ci0JCQkJCWNyZWF0ZUZvclBhcmFtKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCQljcmVhdGVGb3JSb290KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQkvLyBzaG91bGQgd2Fybi4KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVjbGFyYXRpb25zOwotCQl9Ci0KLQkJQXR0ckRlY2wgY3JlYXRlQm9vbFR5cGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZWYWx1ZSkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChuYW1lKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIGRlZlZhbHVlKTsKLQkJCXJldHVybiBhZGVjOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpclBhZ2UoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbnVsbDsKLQkJCS8vICgibGFuZ3VhZ2UiIENEQVRBIERFQ0xBUkVEICJqYXZhIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0xBTkdVQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0pBVkEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTEFOR1VBR0UsIGFkZWMpOwotCi0JCQkvLyAoImV4dGVuZHMiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9FWFRFTkRTKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9FWFRFTkRTLCBhZGVjKTsKLQotCQkJLy8gKCJjb250ZW50VHlwZSIgQ0RBVEEgREVDTEFSRUQgInRleHQvaHRtbDsgSVNPLTg4NTktMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DT05URU5UX1RZUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQ1RfREVGQVVMVCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT05URU5UX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoImltcG9ydCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lNUE9SVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSU1QT1JULCBhZGVjKTsKLQotCQkJLy8gKCJzZXNzaW9uIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAidHJ1ZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX1NFU1NJT04sIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1NFU1NJT04sIGFkZWMpOwotCi0JCQkvLyAoImJ1ZmZlciIgQ0RBVEEgREVDTEFSRUQgIjhrYiIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9CVUZGRVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQlVGU0laX0RFRkFVTFQpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQlVGRkVSLCBhZGVjKTsKLQotCQkJLy8gKCJhdXRvRmx1c2giIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJ0cnVlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShBVFRSX05BTUVfQVVUT0ZMVVNILCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BVVRPRkxVU0gsIGFkZWMpOwotCi0JCQkvLyAoImlzVGhyZWFkU2FmZSIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgInRydWUiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9JU19USFJFQURfU0FGRSwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSVNfVEhSRUFEX1NBRkUsIGFkZWMpOwotCi0JCQkvLyAoImluZm8iIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JTkZPKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JTkZPLCBhZGVjKTsKLQotCQkJLy8gKCJlcnJvclBhZ2UiIFVSSSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRVJST1JfUEFHRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0VSUk9SX1BBR0UsIGFkZWMpOwotCi0JCQkvLyAoImlzRXJyb3JQYWdlIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAiZmFsc2UiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFLCBBVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSVNfRVJST1JfUEFHRSwgYWRlYyk7Ci0KLQkJCS8vICgicGFnZUVuY29kaW5nIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFHRV9FTkNPRElORyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFHRV9FTkNPRElORywgYWRlYyk7Ci0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JEaXJJbmNsdWRlKCkgewotCQkJLy8gKCJmaWxlIiBVUkkgUkVRVUlSRUQpOyBEZWZlY3QgVE9STzoxODUyNDEKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0ZJTEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0ZJTEUsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpclRhZ2xpYigpIHsKLQkJCS8vICgidXJpIiBVUkkgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9VUkkpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1VSSSwgYWRlYyk7Ci0KLQkJCS8vICgicHJlZml4IiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BSRUZJWCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUkVGSVgsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvclVzZUJlYW4oKSB7Ci0JCQkvLyAoImlkIiBJRCBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lEKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRCk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lELCBhZGVjKTsKLQotCQkJLy8gKCJzY29wZSIgRU5VTSBERUNMQVJFRCAocGFnZXxzZXNzaW9ufHJlcXVlc3R8YXBwbGljYXRpb24pICJwYWdlIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1NDT1BFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1BBR0UsIEFUVFJfVkFMVUVfU0VTU0lPTiwgQVRUUl9WQUxVRV9SRVFVRVNULCBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1BBR0UpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU0NPUEUsIGFkZWMpOwotCi0JCQkvLyAoImNsYXNzIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ0xBU1MpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NMQVNTLCBhZGVjKTsKLQotCQkJLy8gKCJiZWFuTmFtZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0JFQU5fTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQkVBTl9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJ0eXBlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yU2V0UHJvcGVydHkoKSB7Ci0JCQkvLyAoIm5hbWUiIElEUkVGIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSURSRUYpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJwcm9wZXJ0eSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QUk9QRVJUWSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUk9QRVJUWSwgYWRlYyk7Ci0KLQkJCS8vICgidmFsdWUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WQUxVRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVkFMVUUsIGFkZWMpOwotCi0JCQkvLyAoInBhcmFtIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFSQU0pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BBUkFNLCBhZGVjKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckdldFByb3BlcnR5KCkgewotCQkJLy8gKCJuYW1lIiBJRFJFRiBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEUkVGKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgicHJvcGVydHkiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUFJPUEVSVFkpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUFJPUEVSVFksIGFkZWMpOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ySW5jbHVkZSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBudWxsOwotCQkJLy8gKCJwYWdlIiBVUkkgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QQUdFLCBhZGVjKTsKLQotCQkJLy8gKCJmbHVzaCIgRU5VTSBPUFRJT05BTCAodHJ1ZXxmYWxzZSkpOyBEZWZlY3QgVE9STzoxODUyNDEKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0ZMVVNIKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9GQUxTRSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9GTFVTSCwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRm9yd2FyZCgpIHsKLQkJCS8vICgicGFnZSIgVVJJIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFHRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFHRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUGx1Z2luKCkgewotCQkJLy8gKCJ0eXBlIiBFTlVNIFJFUVVJUkVEIChiZWFufGFwcGxldCkpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfQkVBTiwgQVRUUl9WQUxVRV9BUFBMRVR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoImNvZGUiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09ERSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09ERSwgYWRlYyk7Ci0KLQkJCS8vICgiY29kZWJhc2UiIFVSSSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPREVCQVNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT0RFQkFTRSwgYWRlYyk7Ci0KLQkJCS8vICgiYWxpZ24iIEVOVU0gSU1QTElFRCAodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9BTElHTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBhbGlnbnMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKGFsaWducyk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0KLQkJCS8vICgiYXJjaGl2ZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0FSQ0hJVkUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FSQ0hJVkUsIGFkZWMpOwotCi0JCQkvLyAoImhlaWdodCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0hFSUdIVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSEVJR0hULCBhZGVjKTsKLQotCQkJLy8gKCJoc3BhY2UiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9IU1BBQ0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0hTUEFDRSwgYWRlYyk7Ci0KLQkJCS8vICgianJldmVyc2lvbiIgQ0RBVEEgREVDTEFSRUQgIjEuMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9KUkVWRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0pWRVIxMSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9KUkVWRVJTSU9OLCBhZGVjKTsKLQotCQkJLy8gKCJuYW1lIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgidnNwYWNlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVlNQQUNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WU1BBQ0UsIGFkZWMpOwotCi0JCQkvLyAoIndpZHRoIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfV0lEVEgpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1dJRFRILCBhZGVjKTsKLQotCQkJLy8gKCJuc3BsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OU1BMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05TUExVR0lOVVJMLCBhZGVjKTsKLQotCQkJLy8gKCJpZXBsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JRVBMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lFUExVR0lOVVJMLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JQYXJhbSgpIHsKLQkJCS8vICgibmFtZSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInZhbHVlIiBDREFUQSBSRVFVSVJFRCk7IERlZmVjdCBUT1JPOjE4NTI0MQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVkFMVUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVkFMVUUsIGFkZWMpOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUm9vdCgpIHsKLQkJCS8vICgieG1sbnM6anNwIiBDREFUQSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9YTUxOU19KU1ApOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfWE1MTlNfSlNQKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1hNTE5TX0pTUCwgYWRlYyk7Ci0JCQkvLyAoInZlcnNpb24iIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVkVSU0lPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WRVJTSU9OLCBhZGVjKTsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIENNTmFtZWROb2RlTWFwIEVNUFRZX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcCgpIHsKLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX1NDUklQVExFVF0gPSBTQ1JJUFRMRVQ7Ci0JCW5hbWVzW0lkcy5JRF9FWFBSRVNTSU9OXSA9IEVYUFJFU1NJT047Ci0JCW5hbWVzW0lkcy5JRF9ERUNMQVJBVElPTl0gPSBERUNMQVJBVElPTjsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9QQUdFXSA9IERJUkVDVElWRV9QQUdFOwotCQluYW1lc1tJZHMuSURfRElSRUNUSVZFX0lOQ0xVREVdID0gRElSRUNUSVZFX0lOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9ESVJFQ1RJVkVfVEFHTElCXSA9IERJUkVDVElWRV9UQUdMSUI7Ci0JCW5hbWVzW0lkcy5JRF9VU0VCRUFOXSA9IFVTRUJFQU47Ci0JCW5hbWVzW0lkcy5JRF9TRVRQUk9QRVJUWV0gPSBTRVRQUk9QRVJUWTsKLQkJbmFtZXNbSWRzLklEX0dFVFBST1BFUlRZXSA9IEdFVFBST1BFUlRZOwotCQluYW1lc1tJZHMuSURfSU5DTFVERV0gPSBJTkNMVURFOwotCQluYW1lc1tJZHMuSURfRk9SV0FSRF0gPSBGT1JXQVJEOwotCQluYW1lc1tJZHMuSURfUExVR0lOXSA9IFBMVUdJTjsKLQkJbmFtZXNbSWRzLklEX1BBUkFNU10gPSBQQVJBTVM7Ci0JCW5hbWVzW0lkcy5JRF9GQUxMQkFDS10gPSBGQUxMQkFDSzsKLQkJbmFtZXNbSWRzLklEX1BBUkFNXSA9IFBBUkFNOwotCQluYW1lc1tJZHMuSURfUk9PVF0gPSBST09UOwotCQluYW1lc1tJZHMuSURfVEVYVF0gPSBURVhUOwotCX0KLQotCUpTUEVsZW1lbnRDb2xsZWN0aW9uKFN0cmluZ1tdIG5hbWVzLCBib29sZWFuIHRvbGVyYW50KSB7Ci0JCXN1cGVyKG5hbWVzLCB0b2xlcmFudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEpTUEVsZW1lbnRDb2xsZWN0aW9uKCkgewotCQlzdXBlcihuYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBjcmVhdGVFbGVtRGVjbChnZXRJRChlbGVtZW50TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlaWQgaW50Ci0JICovCi0JQ01Hcm91cEltcGwgY3JlYXRlQ29udGVudChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCUNNR3JvdXBJbXBsIGNvbnRlbnQgPSBudWxsOwotCQlDTU5vZGUgY2hpbGQgPSBudWxsOwotCi0JCXN3aXRjaCAoZWlkKSB7Ci0JCQljYXNlIElkcy5JRF9JTkNMVURFIDoKLQkJCWNhc2UgSWRzLklEX0ZPUldBUkQgOgotCQkJCS8vIChqc3A6cGFyYW0pKgotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkJCWNoaWxkID0gaXRlbShJZHMuSURfUEFSQU0pOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJLy8gKGpzcDpwYXJhbXMgfCBqc3A6ZmFsbGJhY2spPwotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIDEpOwotCQkJCS8vIGpzcDpwYXJhbXMKLQkJCQljaGlsZCA9IGl0ZW0oSWRzLklEX1BBUkFNUyk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCS8vIGpzcDpmYWxsYmFjawotCQkJCWNoaWxkID0gaXRlbShJZHMuSURfRkFMTEJBQ0spOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BBUkFNUyA6Ci0JCQkJLy8gKGpzcDpwYXJhbSkrCi0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCQkJY2hpbGQgPSBpdGVtKElkcy5JRF9QQVJBTSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUk9PVCA6Ci0JCQkJLy8gJUJvZHk7Ci0JCQkJLy8gLS0+IChqc3A6dGV4dHwlRGlyZWN0aXZlczt8JVNjcmlwdHM7fCVBY3Rpb25zOykqCi0JCQkJLy8gICAgICVEaXJlY3RpdmVzIC0tPiBqc3A6ZGlyZWN0aXZlLnBhZ2V8anNwOmRpcmVjdGl2ZS5pbmNsdWRlCi0JCQkJLy8gICAgICVTY3JpcHRzOyAtLT4ganNwOnNjcmlwdGxldHxqc3A6ZGVjbGFyYXRpb258anNwOmV4cHJlc3Npb24KLQkJCQkvLyAgICAgJUFjdGlvbnMgLS0+IGpzcDp1c2VCZWFufGpzcC5zZXRQcm9wZXJ0eXxqc3A6Z2V0UHJvcGVydHkKLQkJCQkvLyAgICAgICAgICAgICAgICAgIHxqc3A6aW5jbHVkZXxqc3A6Zm9yd2FyZHxqc3A6cGx1Z2luCi0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkJCWludCB2YWxpZENoaWxkcmVuW10gPSB7SWRzLklEX1RFWFQsCi0JCQkJLy8gJURpcmVjdHZlczsKLQkJCQkJCQlJZHMuSURfRElSRUNUSVZFX1BBR0UsIElkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERSwKLQkJCQkJCQkvLyAlU2NyaXB0czsKLQkJCQkJCQlJZHMuSURfU0NSSVBUTEVULCBJZHMuSURfREVDTEFSQVRJT04sIElkcy5JRF9FWFBSRVNTSU9OLAotCQkJCQkJCS8vICVBY3Rpb25zOwotCQkJCQkJCUlkcy5JRF9VU0VCRUFOLCBJZHMuSURfU0VUUFJPUEVSVFksIElkcy5JRF9HRVRQUk9QRVJUWSwgSWRzLklEX0lOQ0xVREUsIElkcy5JRF9GT1JXQVJELCBJZHMuSURfUExVR0lOfTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJY2hpbGQgPSBpdGVtKHZhbGlkQ2hpbGRyZW5baV0pOwotCQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlaWQgaW50Ci0JICovCi0JSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtRGVjbChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCVR5cGVQYWNrZXQgcGFja2V0ID0gbmV3IFR5cGVQYWNrZXQoKTsKLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgSWRzLklEX1NDUklQVExFVCA6Ci0JCQkJLy8gY29udGVudCwgb21pdCwgbGluZUJyZWFrLCBsYXlvdXQsIGNvcnJlY3QsIGZvcm1hdAotCQkJCS8vIHNjcmlwdGxldAotCQkJCXBhY2tldC5uYW1lID0gU0NSSVBUTEVUOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0VYUFJFU1NJT04gOgotCQkJCS8vIGV4cHJlc3Npb24KLQkJCQlwYWNrZXQubmFtZSA9IEVYUFJFU1NJT047Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfREVDTEFSQVRJT04gOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBERUNMQVJBVElPTjsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfUEFHRSA6Ci0JCQkJLy8gZGlyZWN0aXZlLnBhZ2UKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9QQUdFOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX0lOQ0xVREUgOgotCQkJCS8vIGRpcmVjdGl2ZS5pbmxjdWRlCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfSU5DTFVERTsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX0RJUkVDVElWRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCS8vIGRpcmVjdGl2ZS50YWdsaWIKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9UQUdMSUI7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9VU0VCRUFOIDoKLQkJCQkvLyB1c2VCZWFuCi0JCQkJcGFja2V0Lm5hbWUgPSBVU0VCRUFOOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1NFVFBST1BFUlRZIDoKLQkJCQkvLyBzZXRQcm9wZXJ0eQotCQkJCXBhY2tldC5uYW1lID0gU0VUUFJPUEVSVFk7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9HRVRQUk9QRVJUWSA6Ci0JCQkJLy8gZ2V0UHJvcGVydHkKLQkJCQlwYWNrZXQubmFtZSA9IEdFVFBST1BFUlRZOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfSU5DTFVERSA6Ci0JCQkJLy8gaW5jbHVkZQotCQkJCXBhY2tldC5uYW1lID0gSU5DTFVERTsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0ZPUldBUkQgOgotCQkJCS8vIGZvcndhcmQKLQkJCQlwYWNrZXQubmFtZSA9IEZPUldBUkQ7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9QTFVHSU4gOgotCQkJCS8vIHBsdWdpbgotCQkJCXBhY2tldC5uYW1lID0gUExVR0lOOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9QQVJBTVMgOgotCQkJCS8vIHBhcmFtcwotCQkJCXBhY2tldC5uYW1lID0gUEFSQU1TOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9GQUxMQkFDSyA6Ci0JCQkJLy8gZmFsbGJhY2sKLQkJCQlwYWNrZXQubmFtZSA9IEZBTExCQUNLOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BBUkFNIDoKLQkJCQkvLyBwYXJhbQotCQkJCXBhY2tldC5uYW1lID0gUEFSQU07Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ST09UIDoKLQkJCQlwYWNrZXQubmFtZSA9IFJPT1Q7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47IC8vIHNhbWUgYXMgSFRNTAotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfVEVYVCA6Ci0JCQkJcGFja2V0Lm5hbWUgPSBURVhUOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gdW5rbm93biBJRAotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRWxlbURlY2wgZGVjID0gbmV3IEVsZW1EZWNsKHBhY2tldCk7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IGNyZWF0ZUNvbnRlbnQoZWlkKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCWRlYy5zZXRDb250ZW50KGNvbnRlbnQpOwotCi0JCUpBQ3JlYXRlciBjcmVhdGVyID0gbmV3IEpBQ3JlYXRlcigpOwotCQlkZWMuc2V0QXR0cmlidXRlcyhjcmVhdGVyLmdldERlY2xhcmF0aW9ucyhlaWQpKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTcyZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotLyoqCi0gKiBQcm9wZXJ0eVByb3ZpZGVyIGNsYXNzLgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaW5zdGFuY2VzLgotICovCi1pbnRlcmZhY2UgUHJvcGVydHlQcm92aWRlciB7Ci0KLQlib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpOwotCi0JT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViMWFiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotCi0vKioKLSAqIFRoZSBmYWN0b3J5IG9iamVjdCBvZiBQcm9wZXJ0eVByb3ZpZGVyLgotICovCi1maW5hbCBjbGFzcyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSB7Ci0KLQotCS8qKgotCSAqIERlZmF1bHRQcm92aWRlciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciB1bmtub3duIHByb3BlcnRpZXMuCi0JICogSXQgYWx3YXlzIHJldHVybnMgbnVsbCB2YWx1ZSBmb3IgYW55IHByb3BlcnRpZXMuCi0JICovCi0JY2xhc3MgRGVmYXVsdFByb3ZpZGVyIGltcGxlbWVudHMgUHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBEZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIGltcGxlbWVudHMgUHJvcGVydHlQcm92aWRlciB7Ci0JCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCXJldHVybiAoZWRlY2wgIT0gbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlpZiAoIShlZGVjbCBpbnN0YW5jZW9mIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBnZXRFbGVtZW50UHJvcGVydHkoKEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKWVkZWNsKTsKLQkJfQotCi0JCWFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpOwotCX0KLQotCS8qCi0JICogInRhZ0luZm8iCi0JICogZ2V0cyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZWxlbWVudAotCSAqLwotCWNsYXNzIFBQVGFnSW5mbyBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgaHRtbEFubm90YXRpb25Mb2MgPSAiZGF0YS9odG1yZWYueG1sIjsgLy8kTk9OLU5MUy0xJAotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBmQW5ub3RhdGlvbk1hcCA9IG51bGw7Ci0KLQkJcHVibGljIFBQVGFnSW5mbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogR2V0cyB0aGUgYW5ub3RhdGlvbk1hcC4KLQkJICogQHJldHVybiBSZXR1cm5zIGEgQW5ub3RhdGlvbk1hcAotCQkgKi8KLQkJcHJvdGVjdGVkIEFubm90YXRpb25NYXAgZ2V0QW5ub3RhdGlvbk1hcCgpIHsKLQkJCWlmIChmQW5ub3RhdGlvbk1hcCA9PSBudWxsKSB7Ci0JCQkJZkFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotCQkJCXRyeSB7Ci0JCQkJCWZBbm5vdGF0aW9uTWFwLmxvYWQoaHRtbEFubm90YXRpb25Mb2MsIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBubyBhbm5vdGF0aW9uIGF2YWlsYWJsZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmQW5ub3RhdGlvbk1hcDsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCWlmIChkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCXJldHVybiBnZXRBbm5vdGF0aW9uTWFwKCkuZ2V0UHJvcGVydHkoKChIVE1MRWxlbWVudERlY2xhcmF0aW9uKWRlY2wpLmdldEVsZW1lbnROYW1lKCksICJ0YWdJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJzaG91bGRLZWVwU3BhY2UiCi0JICovCi0JY2xhc3MgUFBTaG91bGRLZWVwU3BhY2UgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQU2hvdWxkS2VlcFNwYWNlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLnNob3VsZEtlZXBTcGFjZXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSIKLQkgKi8KLQljbGFzcyBQUFNob3VsZEluZGVudENoaWxkU291cmNlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFNob3VsZEluZGVudENoaWxkU291cmNlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLnNob3VsZEluZGVudENoaWxkU291cmNlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAidGVybWluYXRvcnMiCi0JICovCi0JY2xhc3MgUFBUZXJtaW5hdG9ycyBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBUZXJtaW5hdG9ycygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlpZiAoISAoZGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtRGVjbEltcGwpKSByZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoKEhUTUxFbGVtRGVjbEltcGwpZGVjbCkuZ2V0VGVybWluYXRvcnMoKTsKLQkJfQotCX0KLQotCS8qCi0JICogInByb2hpYml0ZWRBbmNlc3RvcnMiCi0JICovCi0JY2xhc3MgUFBQcm9oaWJpdGVkQW5jZXN0b3JzIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIGRlY2wuZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNKU1AiCi0JICovCi0JY2xhc3MgUFBJc0pTUCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc0pTUCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5pc0pTUCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzWEhUTUwiCi0JICogSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpdHNlbGYgbmV2ZXIgcmVwcmVzZW50IGFueSBYSFRNTCBlbGVtZW50IGRlY2xhcmF0aW9uLgotCSAqIFNvLCB0aGlzIHByb3BlcnR5IG11c3QgYmUgYWx3YXlzIGZhbHNlLgotCSAqLwotCWNsYXNzIFBQSXNYSFRNTCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1hIVE1MKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc1NTSSIKLQkgKiBFYWNoIGRlY2xhcmF0aW9uIGNsYXNzIGZvciBTU0kgZWxlbWVudHMgbXVzdCBwcm92aWRlIHRoaXMgcHJvcGVydHkgaXRzZWxmLAotCSAqIGFuZCB0aGVuIHJldHVybiB0cnVlLiAgT3RoZXIgZGVjbGFyYXRpb24gbXVzdCBhbHdheXMgcmV0dXJuIGZhbHNlLgotCSAqLwotCWNsYXNzIFBQSXNTU0kgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSXNTU0koKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImxpbmVCcmVha0hpbnQiCi0JICovCi0JY2xhc3MgUFBMaW5lQnJlYWtIaW50IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUExpbmVCcmVha0hpbnQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIGhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldExpbmVCcmVha0hpbnQoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19BRlRFUl9TVEFSVCA6Ci0JCQkJCWhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19BRlRFUl9TVEFSVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBoaW50OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGF5b3V0VHlwZSIKLQkgKi8KLQljbGFzcyBQUExheW91dFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGF5b3V0VHlwZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldExheW91dFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQkxPQ0sgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JMT0NLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JSRUFLIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9CUkVBSzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0hJRERFTjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1QgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX09CSkVDVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9XUkFQIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9XUkFQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJvbWl0VHlwZSIKLQkgKi8KLQljbGFzcyBQUE9taXRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUE9taXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldE9taXRUeXBlKCkpIHsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9CT1RIIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfQk9USDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkRfREVGQVVMVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9ERUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkRfTVVTVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvLgotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiB0eXBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaW5jbHVzaW9uIgotCSAqLwotCWNsYXNzIFBQSW5jbHVzaW9uIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUEluY2x1c2lvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRJbmNsdXNpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlQcm92aWRlciBnZXRQcm92aWRlcihTdHJpbmcgcHJvcE5hbWUpIHsKLQkJUHJvcGVydHlQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSAoUHJvcGVydHlQcm92aWRlcikgZmFjdG9yeS5yZWdpc3RyeS5nZXQocHJvcE5hbWUpOwotCQlpZiAocHAgIT0gbnVsbCkKLQkJCXJldHVybiBwcDsKLQotCQlwcCA9IGZhY3RvcnkuY3JlYXRlKHByb3BOYW1lKTsKLQkJaWYgKHBwID09IG51bGwpCi0JCQlyZXR1cm4gZmFjdG9yeS5kZWZhdWx0UHJvdmlkZXI7Ci0KLQkJZmFjdG9yeS5yZWdpc3RyeS5wdXQocHJvcE5hbWUsIHBwKTsKLQkJcmV0dXJuIHBwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSByZWdpc3RyeSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXIgZGVmYXVsdFByb3ZpZGVyID0gbmV3IERlZmF1bHRQcm92aWRlcigpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXIgY3JlYXRlKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gbnVsbDsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpCi0JCQlwcCA9IG5ldyBQUElzSlNQKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXBwID0gbmV3IFBQSXNYSFRNTCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcHAgPSBuZXcgUFBJc1NTSSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MQVlPVVRfVFlQRSkpCi0JCQlwcCA9IG5ldyBQUExheW91dFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkKLQkJCXBwID0gbmV3IFBQTGluZUJyZWFrSGludCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUykpCi0JCQlwcCA9IG5ldyBQUFByb2hpYml0ZWRBbmNlc3RvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKQotCQkJcHAgPSBuZXcgUFBTaG91bGRLZWVwU3BhY2UoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UpKQotCQkJcHAgPSBuZXcgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5URVJNSU5BVE9SUykpCi0JCQlwcCA9IG5ldyBQUFRlcm1pbmF0b3JzKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRBR0lORk8pKQotCQkJcHAgPSBuZXcgUFBUYWdJbmZvKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpCi0JCQlwcCA9IG5ldyBQUE9taXRUeXBlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklOQ0xVU0lPTikpCi0JCQlwcCA9IG5ldyBQUEluY2x1c2lvbigpOwotCi0JCXJldHVybiBwcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZzIwRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnMjBFbGVtZW50Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWU0MGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnMjBFbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgSlNQIDIuMCBUYWcgZmlsZXMuCi0gKi8KLWZpbmFsIGNsYXNzIFRhZzIwRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBKU1BFbGVtZW50Q29sbGVjdGlvbiBpbXBsZW1lbnRzIEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQkvLyBlbGVtZW50IElEcwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRhZ0lkczIwIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NSSVBUTEVUID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVhQUkVTU0lPTiA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFQ0xBUkFUSU9OID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1RBRyA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUkVDVElWRV9JTkNMVURFID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1RBR0xJQiA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VTRUJFQU4gPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRVRQUk9QRVJUWSA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFVFBST1BFUlRZID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5DTFVERSA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUldBUkQgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUExVR0lOID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNUyA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GQUxMQkFDSyA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBTSA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ST09UID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RFWFQgPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1ZBUklBQkxFID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUkVDVElWRV9BVFRSSUJVVEUgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQk9EWSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVFRSSUJVVEUgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUxFTUVOVCA9IDIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ET0JPRFkgPSAyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5WT0tFID0gMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VVFBVVCA9IDI0OwotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBUYWdJZHMyMC5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQl9Ci0KLQkvLyBhdHRyaWJ1dGUgY3JlYXRlcgotCXByaXZhdGUgY2xhc3MgVEFDcmVhdGVyMjAgZXh0ZW5kcyBKQUNyZWF0ZXIgewotCi0JCXB1YmxpYyBUQUNyZWF0ZXIyMCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yQXR0cmlidXRlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVFJJTSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UUklNLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JCb2R5KCkgewotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpckF0dHJpYnV0ZSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFUVVJUkVEKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXXtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRVFVSVJFRCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQUdNRU5UKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCXZhbHVlcyA9IG5ldyBTdHJpbmdbXXtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFHTUVOVCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1JURVhQUlZBTFVFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCXZhbHVlcyA9IG5ldyBTdHJpbmdbXXtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1JURVhQUlZBTFVFLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfREVTQ1JJUFRJT04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfREVTQ1JJUFRJT04sIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpclRhZygpIHsKLQkJCS8vICgiaW1wb3J0IiBVUkkgb3B0aW9uYWwpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JTVBPUlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lNUE9SVCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU1BMQVlfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSUQpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNQTEFZX05BTUUsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT0RZX0NPTlRFTlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0pTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRU1QVFksIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEFHREVQRU5ERU5ULCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NDUklQVExFU1N9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TQ1JJUFRMRVNTKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPRFlfQ09OVEVOVCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RZTkFNSUNfQVRUUklCVVRFUyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9EWU5BTUlDX0FUVFJJQlVURVMsIGFkZWMpOwotCQkJCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9TTUFMTF9JQ09OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9TTUFMTF9JQ09OLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTEFSR0VfSUNPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTEFSR0VfSUNPTiwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFU0NSSVBUSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFU0NSSVBUSU9OLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRVhBTVBMRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9FWEFNUExFLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTEFOR1VBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfSkFWQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBTkdVQUdFLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfSU1QT1JUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0lNUE9SVCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BBR0VfRU5DT0RJTkcpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRU5DT0RJTkdfREVGQVVMVCk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BBR0VfRU5DT0RJTkcsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU0VMSUdOT1JFRCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQl2YWx1ZXMgPSBuZXcgU3RyaW5nW117QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfSVNFTElHTk9SRUQsIGFkZWMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZWQgaW4gMi4wICh0YWdkaXIgYWRkZWQpCi0JCSAqLwotCQl2b2lkIGNyZWF0ZUZvckRpclRhZ2xpYigpIHsKLQkJCS8vICgidXJpIiBVUkkgT1BUSU9OQUwpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9VUkkpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1VSSSwgYWRlYyk7Ci0KLQkJCS8vICgidGFnZGlyIiBVUkkgT1BUSU9OQUwpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUdESVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUiwgYWRlYyk7Ci0KLQkJCS8vICgicHJlZml4IiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BSRUZJWCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUkVGSVgsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpclZhcmlhYmxlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRV9HSVZFTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FX0dJVkVOLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRV9GUk9NX0FUVFJJQlVURSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FX0ZST01fQVRUUklCVVRFLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJQVMpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJQVMsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVJJQUJMRV9DTEFTUyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9WQVJJQUJMRV9DTEFTU19ERUZBVUxUKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSSUFCTEVfQ0xBU1MsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERUNMQVJFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXXtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFQ0xBUkUsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERVNDUklQVElPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERVNDUklQVElPTiwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1NDT1BFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCXZhbHVlcyA9IG5ldyBTdHJpbmdbXXtKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NDT1BFX05FU1RFRCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TQ09QRV9BVF9CRUdJTiwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TQ09QRV9BVF9FTkR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU0NPUEVfTkVTVEVEKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1NDT1BFLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JEb0JvZHkoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSUkVBREVSKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUlJFQURFUiwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1NDT1BFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1BBR0UsIEFUVFJfVkFMVUVfUkVRVUVTVCwgQVRUUl9WQUxVRV9TRVNTSU9OLCBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1BBR0UpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRWxlbWVudCgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ySW52b2tlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBR01FTlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQUdNRU5ULCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUiwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUlJFQURFUik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVJSRUFERVIsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9QQUdFLCBBVFRSX1ZBTFVFX1JFUVVFU1QsIEFUVFJfVkFMVUVfU0VTU0lPTiwgQVRUUl9WQUxVRV9BUFBMSUNBVElPTn07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9QQUdFKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvck91dHB1dCgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX09NSVRfWE1MX0RFQ0wpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRSwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ZRVMsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTk99OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTk8pOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTUlUX1hNTF9ERUNMLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9ST09UX0VMRU1FTlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9ST09UX0VMRU1FTlQsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1NZU1RFTSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1NZU1RFTSwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfUFVCTElDKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfUFVCTElDLCBhZGVjKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvclJvb3QoKSB7Ci0JCQkvLyAoInhtbG5zOmpzcCIgQ0RBVEEgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfWE1MTlNfSlNQKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1hNTE5TX0pTUCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9YTUxOU19KU1AsIGFkZWMpOwotCQkJLy8gKCJ2ZXJzaW9uIiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1ZFUlNJT04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSlNQX1ZFUl8yMCk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUGx1Z2luKCkgewotCQkJLy8gKCJ0eXBlIiBFTlVNIFJFUVVJUkVEIChiZWFufGFwcGxldCkpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfQkVBTiwgQVRUUl9WQUxVRV9BUFBMRVR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoImNvZGUiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09ERSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09ERSwgYWRlYyk7Ci0KLQkJCS8vICgiY29kZWJhc2UiIFVSSSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPREVCQVNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT0RFQkFTRSwgYWRlYyk7Ci0KLQkJCS8vICgiYWxpZ24iIEVOVU0gSU1QTElFRCAodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9BTElHTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSBhbGlnbnMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKGFsaWducyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0JPVFRPTSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0KLQkJCS8vICgiYXJjaGl2ZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0FSQ0hJVkUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FSQ0hJVkUsIGFkZWMpOwotCi0JCQkvLyAoImhlaWdodCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0hFSUdIVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSEVJR0hULCBhZGVjKTsKLQotCQkJLy8gKCJoc3BhY2UiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9IU1BBQ0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0hTUEFDRSwgYWRlYyk7Ci0KLQkJCS8vICgianJldmVyc2lvbiIgQ0RBVEEgREVDTEFSRUQgIjEuMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9KUkVWRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0pWRVIxMik7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9KUkVWRVJTSU9OLCBhZGVjKTsKLQotCQkJLy8gKCJuYW1lIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgidnNwYWNlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVlNQQUNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WU1BBQ0UsIGFkZWMpOwotCi0JCQkvLyAoIndpZHRoIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfV0lEVEgpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1dJRFRILCBhZGVjKTsKLQotCQkJLy8gKCJuc3BsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OU1BMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05TUExVR0lOVVJMLCBhZGVjKTsKLQotCQkJLy8gKCJpZXBsdWdpbnVybCIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JRVBMVUdJTlVSTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lFUExVR0lOVVJMLCBhZGVjKTsKLQkJCQotCQkJLy8gKCJtYXlzY3JpcHQiIEVOVU0gSU1QTElFRCAodHJ1ZSB8IGZhbHNlKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTUFZU0NSSVBUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKG5ldyBTdHJpbmdbXSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVlTQ1JJUFQsIGFkZWMpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCBnZXREZWNsYXJhdGlvbnMoaW50IGVpZCkgewotCQkJc3dpdGNoIChlaWQpIHsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9UQUcgOgotCQkJCQljcmVhdGVGb3JEaXJUYWcoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfVkFSSUFCTEUgOgotCQkJCQljcmVhdGVGb3JEaXJWYXJpYWJsZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9BVFRSSUJVVEUgOgotCQkJCQljcmVhdGVGb3JEaXJBdHRyaWJ1dGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfVEFHTElCIDoKLQkJCQkJY3JlYXRlRm9yRGlyVGFnbGliKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfQVRUUklCVVRFIDoKLQkJCQkJY3JlYXRlRm9yQXR0cmlidXRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfRUxFTUVOVCA6Ci0JCQkJCWNyZWF0ZUZvckVsZW1lbnQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdJZHMyMC5JRF9CT0RZIDoKLQkJCQkJY3JlYXRlRm9yQm9keSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0RPQk9EWSA6Ci0JCQkJCWNyZWF0ZUZvckRvQm9keSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0lOVk9LRSA6Ci0JCQkJCWNyZWF0ZUZvckludm9rZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX09VVFBVVCA6Ci0JCQkJCWNyZWF0ZUZvck91dHB1dCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX1JPT1QgOgotCQkJCQljcmVhdGVGb3JSb290KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfUExVR0lOIDoKLQkJCQkJY3JlYXRlRm9yUGx1Z2luKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlzdXBlci5nZXREZWNsYXJhdGlvbnMoZWlkKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVjbGFyYXRpb25zOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW1RhZ0lkczIwLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfU0NSSVBUTEVUXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVDsKLQkJbmFtZXNbSWRzLklEX0VYUFJFU1NJT05dID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTjsKLQkJbmFtZXNbSWRzLklEX0RFQ0xBUkFUSU9OXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRFQ0xBUkFUSU9OOwotCQluYW1lc1tUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfVEFHXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUc7Ci0JCW5hbWVzW0lkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERV0gPSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERTsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9UQUdMSUJdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQjsKLQkJbmFtZXNbSWRzLklEX1VTRUJFQU5dID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTjsKLQkJbmFtZXNbSWRzLklEX1NFVFBST1BFUlRZXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZOwotCQluYW1lc1tJZHMuSURfR0VUUFJPUEVSVFldID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuR0VUUFJPUEVSVFk7Ci0JCW5hbWVzW0lkcy5JRF9JTkNMVURFXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9GT1JXQVJEXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUldBUkQ7Ci0JCW5hbWVzW0lkcy5JRF9QTFVHSU5dID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUExVR0lOOwotCQluYW1lc1tJZHMuSURfUEFSQU1TXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUzsKLQkJbmFtZXNbSWRzLklEX0ZBTExCQUNLXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLOwotCQluYW1lc1tJZHMuSURfUEFSQU1dID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU07Ci0JCW5hbWVzW0lkcy5JRF9ST09UXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1Q7Ci0JCW5hbWVzW0lkcy5JRF9URVhUXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFQ7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0RJUkVDVElWRV9WQVJJQUJMRV0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVkFSSUFCTEU7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0RJUkVDVElWRV9BVFRSSUJVVEVdID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX0FUVFJJQlVURTsKLQkJbmFtZXNbVGFnSWRzMjAuSURfQk9EWV0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZOwotCQluYW1lc1tUYWdJZHMyMC5JRF9BVFRSSUJVVEVdID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVRUUklCVVRFOwotCQluYW1lc1tUYWdJZHMyMC5JRF9FTEVNRU5UXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVMRU1FTlQ7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0RPQk9EWV0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ET0JPRFk7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0lOVk9LRV0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlZPS0U7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX09VVFBVVF0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PVVRQVVQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFRhZzIwRWxlbWVudENvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKFRhZzIwRWxlbWVudENvbGxlY3Rpb24ubmFtZXMsIFRPTEVSQU5UX0NBU0UpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGNyZWF0ZUVsZW1EZWNsKGdldElEKGVsZW1lbnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVpZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JQ01Hcm91cEltcGwgY3JlYXRlQ29udGVudChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCUNNR3JvdXBJbXBsIGNvbnRlbnQgPSBudWxsOwotCQlDTU5vZGUgY2hpbGQgPSBudWxsOwotCi0JCXN3aXRjaCAoZWlkKSB7Ci0JCQljYXNlIElkcy5JRF9ST09UIDoKLQkJCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCQkJaW50IHZhbGlkQ2hpbGRyZW5bXSA9IHsKLQkJCQkvLyAlRGlyZWN0aXZlczsKLQkJCQkJCQlJZHMuSURfVEVYVCwgSWRzLklEX0RJUkVDVElWRV9QQUdFLCBJZHMuSURfRElSRUNUSVZFX0lOQ0xVREUsIFRhZ0lkczIwLklEX0RJUkVDVElWRV9UQUcsIFRhZ0lkczIwLklEX0RJUkVDVElWRV9WQVJJQUJMRSwgVGFnSWRzMjAuSURfRElSRUNUSVZFX0FUVFJJQlVURSwgVGFnSWRzMjAuSURfQk9EWSwgVGFnSWRzMjAuSURfQVRUUklCVVRFLAotCQkJCQkJCS8vICVTY3JpcHRzOwotCQkJCQkJCUlkcy5JRF9TQ1JJUFRMRVQsIElkcy5JRF9ERUNMQVJBVElPTiwgSWRzLklEX0VYUFJFU1NJT04sCi0JCQkJCQkJLy8gJUFjdGlvbnM7Ci0JCQkJCQkJSWRzLklEX1VTRUJFQU4sIElkcy5JRF9TRVRQUk9QRVJUWSwgSWRzLklEX0dFVFBST1BFUlRZLCBJZHMuSURfSU5DTFVERSwgSWRzLklEX0ZPUldBUkQsIElkcy5JRF9QTFVHSU59OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQljaGlsZCA9IGl0ZW0odmFsaWRDaGlsZHJlbltpXSk7Ci0JCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQkJY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJY29udGVudCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnQoZWlkKTsKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlaWQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCUhUTUxFbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlRWxlbURlY2woaW50IGVpZCkgewotCQlpZiAoZWlkID09IElEX1VOS05PV04pCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlUeXBlUGFja2V0IHBhY2tldCA9IG5ldyBUeXBlUGFja2V0KCk7Ci0JCXN3aXRjaCAoZWlkKSB7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9UQUcgOgotCQkJCS8vIGRpcmVjdGl2ZS50YWdsaWIKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9UQUc7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9WQVJJQUJMRSA6Ci0JCQkJLy8gZGlyZWN0aXZlLnRhZ2xpYgotCQkJCXBhY2tldC5uYW1lID0gRElSRUNUSVZFX1ZBUklBQkxFOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfQVRUUklCVVRFIDoKLQkJCQkvLyBkaXJlY3RpdmUudGFnbGliCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfQVRUUklCVVRFOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfVEFHTElCIDoKLQkJCQkvLyBkaXJlY3RpdmUudGFnbGliCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfVEFHTElCOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9CT0RZIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gQk9EWTsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFnSWRzMjAuSURfRUxFTUVOVCA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVMRU1FTlQ7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0FUVFJJQlVURSA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFUVFJJQlVURTsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFnSWRzMjAuSURfRE9CT0RZIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRE9CT0RZOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9JTlZPS0UgOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlZPS0U7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX09VVFBVVCA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9VVFBVVDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFnSWRzMjAuSURfUk9PVCA6Ci0JCQkJcGFja2V0Lm5hbWUgPSBST09UOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOyAvLyBzYW1lIGFzIEhUTUwKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFnSWRzMjAuSURfUExVR0lOIDoKLQkJCQkvLyBwbHVnaW4KLQkJCQlwYWNrZXQubmFtZSA9IFBMVUdJTjsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUVsZW1EZWNsKGVpZCk7Ci0JCX0KLQkJRWxlbURlY2wgZGVjbCA9IG5ldyBFbGVtRGVjbChwYWNrZXQpOwotCi0JCUNNR3JvdXBJbXBsIGNvbnRlbnQgPSBjcmVhdGVDb250ZW50KGVpZCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlkZWNsLnNldENvbnRlbnQoY29udGVudCk7Ci0KLQkJVEFDcmVhdGVyMjAgY3JlYXRlciA9IG5ldyBUQUNyZWF0ZXIyMCgpOwotCQlkZWNsLnNldEF0dHJpYnV0ZXMoY3JlYXRlci5nZXREZWNsYXJhdGlvbnMoZWlkKSk7Ci0KLQkJcmV0dXJuIGRlY2w7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdDTURvY0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnQ01Eb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjk4ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdDTURvY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDTURvY3VtZW50IGZvciB0aGUgSlNQIDIuMCB0YWcgZmlsZXMuCi0gKi8KLWNsYXNzIFRhZ0NNRG9jSW1wbCBleHRlbmRzIEpDTURvY0ltcGwgewotCS8qKgotCSAqIEhDTURvY0ltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVGFnQ01Eb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2VJbXBsIHRhcmdldE5hbWVzcGFjZSkgewotCQlzdXBlcihkb2NUeXBlTmFtZSwgdGFyZ2V0TmFtZXNwYWNlLCBuZXcgVGFnMjBFbGVtZW50Q29sbGVjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTYzMjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBBdHRyaWJ1dGVDb2xsZWN0aW9uIGV4dGVuZHMgQ01OYW1lZE5vZGVNYXBJbXBsIGltcGxlbWVudHMgQ0hUTUxOYW1lc3BhY2UgewotCS8qKgotCSAqIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVDb2xsZWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICogQHBhcmFtIGF0dHJOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlKFN0cmluZyBhdHRyTmFtZSkgewotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCi0JCWlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ1RJT04pKSB7Ci0JCQkvLyAoYWN0aW9uICVVUkkgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUNUSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BTFQpKSB7Ci0JCQkvLyAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQk9SREVSKSkgewotCQkJLy8gKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CT1JERVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIRUNLRUQpKSB7Ci0JCQkvLyAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfQ0hFQ0tFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIRUNLRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NMRUFSKSkgewotCQkJLy8gKGNsZWFyIChsZWZ0IHwgYWxsIHwgcmlnaHQgfCBub25lKSBub25lKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0FMTCwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9OT05FfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9OT05FKTsKLQotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEVBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09MUykpIHsKLQkJCS8vIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9FTkNUWVBFKSkgewotCQkJLy8gKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1dXV19GT1JNX1VSTEVOQ09ERUQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FTkNUWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IRUlHSFQpKSB7Ci0JCQkvLyAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hFSUdIVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFJFRikpIHsKLQkJCS8vIChocmVmICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSFJFRiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFNQQUNFKSkgewotCQkJLy8gKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hUVFBfRVFVSVYpKSB7Ci0JCQkvLyAoaHR0cC1lcXVpdiBOQU1FICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IVFRQX0VRVUlWLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVhMRU5HVEgpKSB7Ci0JCQkvLyAobWF4bGVuZ3RoIE5VTUJFUiAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BWExFTkdUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUVUSE9EKSkgewotCQkJLy8gKG1ldGhvZCAoR0VUfFBPU1QpIEdFVCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfR0VULCBBVFRSX1ZBTFVFX1BPU1R9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0dFVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01FVEhPRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTVVMVElQTEUpKSB7Ci0JCQkvLyAobXVsdGlwbGUgKG11bHRpcGxlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9NVUxUSVBMRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01VTFRJUExFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9OQU1FKSkgewotCQkJLy8gKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05PU0hBREUpKSB7Ci0JCQkvLyAobm9zaGFkZSAobm9zaGFkZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTk9TSEFERX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05PU0hBREUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JPV1MpKSB7Ci0JCQkvLyAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUk9XUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0VMRUNURUQpKSB7Ci0JCQkvLyAoc2VsZWN0ZWQgKHNlbGVjdGVkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9TRUxFQ1RFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NFTEVDVEVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TSVpFKSkgewotCQkJLy8gKHNpemUgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU1JDKSkgewotCQkJLy8gKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkJCS8vIE5PVEU6ICJzcmMiIGF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgaW4gc2V2ZXJhbCBlbGVtZW50cy4KLQkJCS8vCQkgVGhlIGRlZmluaXRpb24gb2YgSU1HIGlzIGRpZmZlcmVudCBmcm9tIG90aGVycy4KLQkJCS8vCQkgU28sIGl0IHNob3VsZCBiZSBsb2NhbGx5IGRlZmluZWQuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TUkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RZUEUpKSB7Ci0JCQkvLyAodHlwZSAlQ290ZW50VHlwZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkFMVUUpKSB7Ci0JCQkvLyAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZBTFVFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WRVJTSU9OKSkgewotCQkJLy8gKHZlcnNpb24gQ0RBVEEgI0ZJWEVEICclSFRNTC5WZXJzaW9uOykKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQsIEFUVFJfVkFMVUVfVkVSU0lPTl9UUkFOU0lUSU9OQUwpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WRVJTSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5GSVhFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9XSURUSCkpIHsKLQkJCS8vICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVlNQQUNFKSkgewotCQkJLy8gKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQkJLy8gPDxEMjA1NTE0Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB1bmtub3duIGF0dHJpYnV0ZTsgbWF5YmUgZXJyb3IuCi0JCQkvLyBzaG91bGQgd2Fybi4KLQkJCWF0dHIgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVib2R5Y29sb3JzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Qm9keWNvbG9ycyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsaWduIGF0dHJpYnV0ZSB3aGljaCBoYXMgJUlBbGlnbjsgYXMgdmFsdWVzLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JJbWFnZSgpIHsKLQkJLy8gYWxpZ24gKGxvY2FsKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uIGZvciA8Y29kZT5hbGlnbjwvY29kZT4KLQkgKiBpbiBzZXZlcmFsIGVsZW1lbnRzLCBsaWtlIDxjb2RlPlA8L2NvZGU+LCA8Y29kZT5ESVY8L2NvZGU+LgotCSAqIFRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCBmcm9tIGF0dHJpYnV0ZXMgdGhvc2UgaGF2ZSB0aGUgc2FtZSBuYW1lCi0JICogaW4gb3RoZXIgZWxlbWVudHMgKDxjb2RlPklNRzwvY29kZT4gYW5kIDxjb2RlPlRBQkxFPC9jb2RlPikuCi0JICogU28sIGl0IGNhbid0IHRyZWF0IGFzIGdsb2JhbCBhdHRyaWJ1dGVzLgotCSAqIDxzdHJvbmc+Tk9URTogVGhlc2UgYXR0cmlidXRlIGRlY2xhcmF0aW9uIGhhcwotCSAqIG5vIG93bmVyIENNRG9jdW1lbnQgaW5zdGFuY2UuPC9zdHJvbmc+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCkgewotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlczogbGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeQotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0NFTlRFUiwgQVRUUl9WQUxVRV9SSUdIVCx9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEdldCAlYXR0cnM7IGRlY2xhcmF0aW9ucy4KLQkgKiAlYXR0cnM7IGNvbnNpc3RzIG9mICVjb3JlYXR0cnM7LCAlaTE4biwgYW5kICVldmVudHM7LgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEF0dHJzKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWNvcmVhdHRyczsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldENvcmUoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCX0KLQotCS8qKgotCSAqIEdldCBhIGdsb2JhbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICogQHBhcmFtIGF0dHJOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSkgewotCQlDTU5vZGUgY21ub2RlID0gZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJaWYgKGNtbm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsgLy8gYWxyZWFkeSBleGlzdHMuCi0KLQkJSFRNTEF0dHJEZWNsSW1wbCBkZWMgPSBjcmVhdGUoYXR0ck5hbWUpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlwdXROYW1lZEl0ZW0oYXR0ck5hbWUsIGRlYyk7Ci0KLQkJcmV0dXJuIGRlYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVjbGFyYXRpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQgYnkgbmFtZXMuCi0JICogQHBhcmFtIG5hbWVzIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGdldERlY2xhcmF0aW9ucyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zLCBJdGVyYXRvciBuYW1lcykgewotCQl3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0KCk7Ci0JCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZGVjID0gZ2V0RGVjbGFyYXRpb24oYXR0ck5hbWUpOwotCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oYXR0ck5hbWUsIGRlYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWV2ZW50czsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEV2ZW50cyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVpMThuOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0STE4bihDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSENNRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSENNRG9jSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGIzNTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ0hDTURvY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbnRpdHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEhUTUwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDSENNRG9jSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQ01Eb2N1bWVudCB7Ci0KLQkvKiogTmFtZXNwYWNlIGZvciBhbGwgbmFtZXMgb2YgZWxlbWVudHMsIGVudGl0aWVzIGFuZCBhdHRyaWJ1dGVzLiAqLwotCXByaXZhdGUgQ01OYW1lc3BhY2UgbmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRzID0gbnVsbDsKLQlwcml2YXRlIEVudGl0eUNvbGxlY3Rpb24gZW50aXRpZXMgPSBudWxsOwotCXByaXZhdGUgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDSENNRG9jSW1wbChTdHJpbmcgZG9jVHlwZU5hbWUsIENNTmFtZXNwYWNlIHRhcmdldE5hbWVzcGFjZSkgewotCQlzdXBlcihkb2NUeXBlTmFtZSk7Ci0JCW5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVDb2xsZWN0aW9uKCk7Ci0JCWVsZW1lbnRzID0gbmV3IEVsZW1lbnRDb2xsZWN0aW9uKGF0dHJpYnV0ZXMpOwotCQllbnRpdGllcyA9IG5ldyBFbnRpdHlDb2xsZWN0aW9uKCk7Ci0JfQotCi0JQXR0cmlidXRlQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBlbnRpdGllczsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWlmIChlbnRpdGllcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVudGl0eURlY2xhcmF0aW9uKSBlbnRpdGllcy5nZXROYW1lZEl0ZW0oZW50aXR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSFRNTE5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSFRNTE5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTY1MDNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ0hUTUxOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogUHJvdmlkZSBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGUgSFRNTCA0LjA/IHNwZWNpZmljYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ0hUTUxOYW1lc3BhY2UgewotCi0JLy8gRWxlbWVudCBuYW1lcwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1M7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0UgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tRVU9URSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJSOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRU5URVIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElWID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJVjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREwgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREw7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk07Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgxID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDMgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg0ID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDYgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQUQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUwgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5QVVQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEEgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0wgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0w7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFAgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFTEVDVDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVEFSRUEgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0NPTkZJRyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfQ09ORklHOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRUNITyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRUNITzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0VYRUMgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VYRUM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GU0laRSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRlNJWkU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GTEFTVE1PRCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRkxBU1RNT0Q7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9JTkNMVURFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9JTkNMVURFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfUFJJTlRFTlYgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1BSSU5URU5WOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfU0VUID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9TRVQ7Ci0JfQotCi0JLy8gQ2hhcmFjdGVyIEVudGl0aWVzCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRW50aXR5TmFtZSB7Ci0JfQotCi0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSBuYW1lcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WRVJTSU9OID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WRVJTSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TUkMgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9XSURUSCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQk9SREVSID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hTUEFDRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTkFNRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0xFQVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NMRUFSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OT1NIQURFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OT1NIQURFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DSEVDS0VEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSEVDS0VEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVhMRU5HVEggPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BWExFTkdUSDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNUWUxFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU1RZTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hUVFBfRVFVSVYgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hUVFBfRVFVSVY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTlRFTlQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRFTlQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFJFRiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTVVMVElQTEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01VTFRJUExFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRUxFQ1RFRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0VMRUNURUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JPV1MgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1M7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTFMgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDVElPTiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NRVRIT0QgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01FVEhPRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRU5DVFlQRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRU5DVFlQRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0laRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMVUUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFOwotCi0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FUlJNU0cgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0VSUk1TRzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0laRUZNVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRUZNVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVElNRUZNVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVElNRUZNVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFSID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NHSSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0dJOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTUQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NNRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRklMRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRklMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVklSVFVBTCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTDsKLQotCS8vIGdsb2JhbCBhdHRyaWJ1dGUgdmFsdWVzOyBtYWlubHkgdXNlZCBpbiBlbnVtZXJhdGlvbi4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1ZFUlNJT05fVFJBTlNJVElPTkFMID0gIi0vL1czQy8vRFREIENvbXBhY3QgSFRNTCAxLjAgRHJhZnQvL0VOIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIGFsaWduICh0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVE9QID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVE9QOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTUlERExFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTUlERExFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQk9UVE9NOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0xFRlQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DRU5URVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DRU5URVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SSUdIVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUOwotCS8vICAgZm9yIGNsZWFyIChsZWZ0fGFsbHxyaWdodHxub25lKTogbGVmdCBhbmQgcmlnaHQgYXJlIGFscmVhZHkgZGVmaW5lZCBhYm92ZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FMTCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0FMTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX05PTkUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9OT05FOwotCS8vICAgZm9yIHR5cGUgb2YgSU5QVVQKLQkvLyAgICAgICAodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLQkvLyAgICAgICAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVEVYVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9QQVNTV09SRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ0hFQ0tCT1ggPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DSEVDS0JPWDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JBRElPID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkFESU87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TVUJNSVQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TVUJNSVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRVNFVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JFU0VUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSElEREVOID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSElEREVOOwotCS8vICAgZm9yIHNwYW4sIGNvbHNwYW4sIHJvd3NwYW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzEgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV8xOwotCS8vICAgZm9yIGZyYW1lYm9yZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV8wID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfMDsKLQkvLyAgIGZvciBtZXRob2Qgb2YgRk9STQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfR0VUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfR0VUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUE9TVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BPU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9XV1dfRk9STV9VUkxFTkNPREVEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRDsKLQkvLyAgIGZvciBiZWhhdmlybyBvZiBNQVJRVUVFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TQ1JPTEwgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TQ1JPTEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TTElERSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NMSURFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUxURVJOQVRFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQUxURVJOQVRFOwotCS8vICAgZm9yIGRpcmVjdGlvbiBvZiBNQVJRVUVFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9VUCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1VQOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRE9XTiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0RPV047Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Db250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjMzY2Y1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Db250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDTUNvbnRlbnQgZm9yIEhUTUwgQ00uCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNQ29udGVudEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5CT1VOREVEID0gLTE7Ci0JLyoqICAtMTogaXQncyBVTkJPVU5ERUQuICovCi0JcHJpdmF0ZSBpbnQgbWF4T2NjdXIgPSBVTkJPVU5ERUQ7Ci0JLyoqICAwOiBpdCdzIE9QVElPTkFMLCAxLCBpdCdzIFJFUVVJUkVELiAqLwotCXByaXZhdGUgaW50IG1pbk9jY3VyID0gMDsKLQotCS8qKgotCSAqIFRoZSBwcmltYXJ5IGNvbnN0dXJjdG9yLgotCSAqIFVzZSB0aGlzIG9uZSBmb3IgdXN1YWwgY2FzZXMuPGJyPgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnRJbXBsKFN0cmluZyBuYW1lLCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0JCXN1cGVyKG5hbWUpOwotCQltaW5PY2N1ciA9IG1pbjsKLQkJbWF4T2NjdXIgPSBtYXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQlyZXR1cm4gbWF4T2NjdXI7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0JICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gbWluT2NjdXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUdyb3VwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUdyb3VwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzU0NmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Hcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi0vKioKLSAqLwotY2xhc3MgQ01Hcm91cEltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01Hcm91cCB7Ci0KLQlwcml2YXRlIGludCBvcGVyYXRvciA9IENNR3JvdXAuU0VRVUVOQ0U7Ci0JcHJpdmF0ZSBDTU5vZGVMaXN0SW1wbCBjaGlsZHJlbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUdyb3VwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTUdyb3VwSW1wbChpbnQgb3AsIGludCBtaW5PY2N1ciwgaW50IG1heE9jY3VyKSB7Ci0JCXN1cGVyKG51bGwsIG1pbk9jY3VyLCBtYXhPY2N1cik7Ci0JCXN3aXRjaCAob3ApIHsKLQkJCWNhc2UgQ01Hcm91cC5BTEwgOgotCQkJY2FzZSBDTUdyb3VwLkNIT0lDRSA6Ci0JCQljYXNlIENNR3JvdXAuU0VRVUVOQ0UgOgotCQkJCW9wZXJhdG9yID0gb3A7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgd2Fybi4KLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGFwcGVuZENoaWxkKENNTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCWNoaWxkcmVuID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCXJldHVybiBjaGlsZHJlbi5hcHBlbmROb2RlKGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgR1JPVVAsIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkdST1VQOwotCX0KLQotCS8qKgotCSAqIGdldE9wZXJhdGlvbiBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEFMT05FIChhKSwgU0VRVUVOQ0UgKGEsYiksIENIT0lDRSAoYXxiKSwgQUxMIChhJmIpLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBvcGVyYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiYWUxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDTU5hbWVkTm9kZU1hcCBpbnRlcmZhY2UuIFRoaXMgY2xhc3MgaXMgaW50ZW50ZWQKLSAqIHRvIGJlIHVzZWQgYXMgYSBjb250YWluZXIgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4gSWYgc29tZW9uZSB3YW50cyB0bwotICogdXNlIHRoaXMgY2xhc3MgZm9yIG90aGVyIHB1cnBvc2UsIGhlIG11c3QgcGF5IGF0dGVudGlvbiB0byB0aGUgZmFjdCB0aGF0Ci0gKiB0aGlzIGNsYXNzIGlzIHRvbGVyYW50IG9mIHRoZSBrZXkgbmFtZSBjYXNlLiBUaGF0IGlzLCB0aGlzIGNsYXNzIGRvZXMgbm90Ci0gKiBkaXN0aW5ndWlzaCAibmFtZSIsICJOQU1FIiwgYW5kICJOYW1lIiBhcyBhIGtleSBuYW1lLgotICovCi1jbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwIHsKLQotCXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBpdGVtcyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKCkgewotCQlzdXBlcigpOwotCQlpdGVtcyA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBpdGVtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Ob2RlIDxjb2RlPm51bGw8L2NvZGU+IGZvciB1bmtub3duIGtleXMuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgY29va2VkTmFtZSA9IG1ha2VDYW5vbmljYWxGb3JtKG5hbWUpOwotCQlpZiAoIWl0ZW1zLmNvbnRhaW5zS2V5KGNvb2tlZE5hbWUpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBpdGVtcy5nZXQoY29va2VkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDTU5vZGUgbm9kZSA9IChDTU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKC0taW5kZXggPCAwKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gaXRlbXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmF3Rm9ybQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIG1ha2VDYW5vbmljYWxGb3JtKFN0cmluZyByYXcpIHsKLQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDAxNTIKLQkJLy8gd2UgYXJlIGFibGUgdG8gImNoZWF0IiBoZXJlIGEgbGl0dGxlIGFuZCB1c2UgVVMgTG9jYWxlCi0JCS8vIHRvIGdldCBhIGdvb2QgY29ub25pY2FsIGZvcm0sIHNpbmNlIHdlIGFyZSB1c2luZyB0aGlzIG9ubHkKLQkJLy8gZm9yIEhUTUwgYW5kIEpTUCBzdGFuZGFyZCB0YWdzLgotCQkvLyBMb25nIHRlcm0sIGZvciBzaW1pbGFyIG5lZWRzIHdpdGggWE1MIDEuMSAoZm9yIGV4YW1wbGUpCi0JCS8vIHdlIHNob3VsZCB1c2UgYSBjbGFzcyBzdWNoIGFzIGNvbS5pYm0uaWN1LnRleHQuTm9ybWFsaXplcgotCQlyZXR1cm4gcmF3LnRvVXBwZXJDYXNlKExvY2FsZS5VUyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpdGVtCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBwdXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUsIENNTm9kZSBpdGVtKSB7Ci0JCVN0cmluZyBjb29rZWROYW1lID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZSk7Ci0JCWlmIChpdGVtcy5jb250YWluc0tleShjb29rZWROYW1lKSkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSByZWdpc3RlcmVkLgotCQlpdGVtcy5wdXQoY29va2VkTmFtZSwgaXRlbSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmN2EwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLQotCi0KLS8qKgotICovCi1hYnN0cmFjdCBjbGFzcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5vZGVJbXBsKFN0cmluZyBubSkgewotCQlzdXBlcigpOwotCQluYW1lID0gbm07Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogQHJldHVybiBib29sZWFuCi0JICoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNTm9kZSBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWIxY2RhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBBbmFsb2cgb2YgZG9tLk5vZGVMaXN0IGZvciBDTS4KLSAqLwotY2xhc3MgQ01Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3QgewotCi0JcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIG5vZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIENNTm9kZUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCQlub2RlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBhcHBlbmROb2RlKENNTm9kZSBub2RlKSB7Ci0JCW5vZGVzLmFkZEVsZW1lbnQobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTm9kZSkgbm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Db21wbGV4VHlwZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0N2M3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gcmVwcmVzZW50IGEgY29tcGxleCB0eXBlIGRlZmluaXRpb24KLSAqIGluIFhNTCBTY2hlbWEuPGJyPgotICovCi1hYnN0cmFjdCBjbGFzcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGNvbnRlbnQgPSBudWxsOwotCXByb3RlY3RlZCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1hcnlDYW5kaWRhdGVOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb21wbGV4VHlwZURlZmluaXRpb24oRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJY29sbGVjdGlvbiA9IGVsZW1lbnRDb2xsZWN0aW9uOwotCQljcmVhdGVDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFjdHVhbCBjb250ZW50IG1vZGVsLgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25jZSBhbmQgb25seSBvbmNlIGluIHRoZSBjb25zdHJ1Y3Rvci48YnI+Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udGVudCgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXAKLQkgKi8KLQlwdWJsaWMgQ01Hcm91cCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQkvKiBOT1RFOiBEbyB3ZSBuZWVkIExPR0lDQUwgdHlwZT8KLQkgKiAtLSAzLzcvMjAwMQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29udGVudFR5cGUoKTsKLQotCS8qKgotCSAqIEdldCBjb250ZW50IGhpbnQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZ2V0UHJpbWFyeUNhbmRpZGF0ZSgpIHsKLQkJaWYgKHByaW1hcnlDYW5kaWRhdGVOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShwcmltYXJ5Q2FuZGlkYXRlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGVOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTY4MmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLS8qKgotICogRmFjdG9yeSBvZiBDb21wbGV4VHlwZURlZmluaXRpb24uCi0gKi8KLWZpbmFsIGNsYXNzIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGRlZmluaXRpb25zID0gbnVsbDsKLQkvLyBjb25zdGFudHMgZm9yIGNvbXBsZXggdHlwZSBuYW1lCi0JLyoqIGZvciBBRERSRVNTLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0FERFJFU1MgPSAiQ1RZUEVfQUREUkVTUyI7Ly8kTk9OLU5MUy0xJAotCS8qKiBDREFUQSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2h1bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9DREFUQSA9ICJDVFlQRV9DREFUQSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBjb2wgZ3JvdXAgY29udGVudC4gQ09MKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0NPTFVNTl9HUk9VUCA9ICJDVFlQRV9DT0xVTU5fR1JPVVAiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIERMLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0RFRklOSVRJT05fTElTVCA9ICJDVFlQRV9ERUZJTklUSU9OX0xJU1QiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEVNQkVELiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0VNQkVEID0gIkNUWVBFX0VNQkVEIjsvLyROT04tTkxTLTEkCi0JLyoqIGVtcHR5IGNvbnRlbnQuIE5vIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZSBzaG91bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9FTVBUWSA9ICJDVFlQRV9FTVBUWSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRklFTERTRVQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRklFTERTRVQgPSAiQ1RZUEVfRklFTERTRVQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEZSQU1FU0VULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZSQU1FU0VUID0gIkNUWVBFX0ZSQU1FU0VUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZsb3cgY29udGVudC4gKCVmbG93OykqICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRkxPV19DT05UQUlORVIgPSAiQ1RZUEVfRkxPV19DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogaHRtbCBjb250ZW50LiBIRUFELCAoRlJBTUVTRVR8Qk9EWSkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9IVE1MID0gIkNUWVBFX0hUTUwiOy8vJE5PTi1OTFMtMSQKLQkvKiogaGVhZCBjb250ZW50LiBUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9IRUFEID0gIkNUWVBFX0hFQUQiOy8vJE5PTi1OTFMtMSQKLQkvKiogaW5saW5lIGNvbnRlbnQuICglaW5saW5lOykqICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUiA9ICJDVFlQRV9JTkxJTkVfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGxpc3QgaXRlbSBjb250YWluZXIuIChMSSkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTElfQ09OVEFJTkVSID0gIkNUWVBFX0xJX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgTUFQLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX01BUCA9ICJDVFlQRV9NQVAiOy8vJE5PTi1OTFMtMSQKLQkvKiogbm9mcmFtZXMgY29udGVudC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9OT0ZSQU1FU19DT05URU5UID0gIkNUWVBFX05PRlJBTUVTX0NPTlRFTlQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIE9QVEdST1VQLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX09QVElPTl9DT05UQUlORVIgPSAiQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBwYXJhbSBjb250YWluZXIuIEZvciBPQkpFQ1QvQVBQTEVULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1BBUkFNX0NPTlRBSU5FUiA9ICJDVFlQRV9QQVJBTV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogUENEQVRBIGNvbnRlbnQuIE5vIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZSBzaHVsZCBiZSBjcmVhdGVkLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1BDREFUQSA9ICJDVFlQRV9QQ0RBVEEiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIFNFTEVDVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9TRUxFQ1QgPSAiQ1RZUEVfU0VMRUNUIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIGNvbnRlbnQuIENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVEFCTEUgPSAiQ1RZUEVfVEFCTEUiOy8vJE5PTi1OTFMtMSQKLQkvKiogdGFibGUgY2VsbCBjb250YWllci4gKFRIfFREKSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9UQ0VMTF9DT05UQUlORVIgPSAiQ1RZUEVfVENFTExfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIHJlY29yZCBjb250YWluZXIuIChUUikrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVFJfQ09OVEFJTkVSID0gIkNUWVBFX1RSX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJZGVmaW5pdGlvbnMgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwotCX0KLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kIGZvciBDb21wbGV4VHlwZURlZmluaXRpb24uCi0JICogRWFjaCBpbnN0YW5jZSBjcmVhdGVkIGluIHRoaXMgbWV0aG9kIG11c3QgYmUgcmVnaXN0ZXJlZCBpbnRvCi0JICogdGhlIG1hcCB3aXRoIGl0cyBuYW1lLgotCSAqIEBwYXJhbSBkZWZpbml0aW9uTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlRGVmaW5pdGlvbihTdHJpbmcgZGVmaW5pdGlvbk5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCWlmIChkZWZpbml0aW9ucy5jb250YWluc0tleShkZWZpbml0aW9uTmFtZSkpIHsKLQkJCXJldHVybiAoQ29tcGxleFR5cGVEZWZpbml0aW9uKSBkZWZpbml0aW9ucy5nZXQoZGVmaW5pdGlvbk5hbWUpOwotCQl9Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0JCWlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9BRERSRVNTKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkQWRkcmVzcyhlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9ERUZJTklUSU9OX0xJU1QpIHsKLQkJCWRlZiA9IG5ldyBDdGREbChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9GTE9XX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZEZsb3dDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSEVBRCkgewotCQkJZGVmID0gbmV3IEN0ZEhlYWQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSFRNTCkgewotCQkJZGVmID0gbmV3IEN0ZEh0bWwoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZElubGluZUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9MSV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRMaUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX09QVElPTl9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRPcHRpb25Db250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfU0VMRUNUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkU2VsZWN0KGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgewotCQkJZGVmID0gbnVsbDsKLQkJfQotCQlpZiAoZGVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmFpbCB0byBjcmVhdGUuCi0JCWRlZmluaXRpb25zLnB1dChkZWZpbml0aW9uTmFtZSwgZGVmKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0KLQkvKioKLQkgKiBGb3Igc2luZ2xldG9uLjxicj4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRBZGRyZXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkMTNjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEFkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgQUREUkVTUy4KLSAqLwotZmluYWwgY2xhc3MgQ3RkQWRkcmVzcyBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkQWRkcmVzcyhFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCglaW5saW5lKSB8IFApKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkqCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gKCVpbmxpbmUpCi0JCUNNR3JvdXBJbXBsIGlubGluZXMgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlpZiAoaW5saW5lcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldElubGluZShpbmxpbmVzKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChpbmxpbmVzKTsKLQkJLy8gUAotCQlDTU5vZGUgcCA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlApOwotCQlpZiAocCAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChwKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVpbmxpbmUpIHwgUCkqLgotCSAqIEJlY2F1c2UgJWlubGluZTsgY29udGFpbnMgI1BDREFUQSwgdGhlIHR5cGUgaXMgTUlYRUQuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0FERFJFU1M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGREbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGREbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFiZjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkRGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgREwuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZERsIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGREbChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQ7Ci0JfQotCi0JLyoqCi0JICogKERUIHwgREQpKwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBEVAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JCS8vIERECi0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfREVGSU5JVElPTl9MSVNUOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkRmxvd0NvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRGbG93Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOThkNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRGbG93Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yIGNvbnRhaW5lcnMgb2YgPGNvZGU+JWZsb3c7PC9jb2RlPi4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRmxvd0NvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ3RkRmxvd0NvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCVmbG93OykqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJY29sbGVjdGlvbi5nZXRGbG93KGNvbnRlbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GTE9XX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEhlYWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSGVhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWY3OGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSGVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBoZWFkIGNvbnRlbnQuCi0gKiBDb250ZW50IE1vZGVsOiAoVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/KQotICovCi1maW5hbCBjbGFzcyBDdGRIZWFkIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRIZWFkKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRTsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgSEVBRC4KLQkgKiBUbyBhdm9pZCB1c2luZyBpbmNsdXNpb24sIHRoZSBjb250ZW50IG1vZGVsIGNvbWVzIGZyb20gdGhlIFhIVE1MIDEuMC4KLQkgKgotCSAqICglaGVhZC5taXNjOywgKCh0aXRsZSwgJWhlYWQubWlzYzssIChiYXNlLCAlaGVhZC5taXNjOyk/KSB8IChiYXNlLCAlaGVhZC5taXNjOywgKHRpdGxlLCAlaGVhZC5taXNjOykpKSkKLQkgKiBBbmQgJWhlYWQubWlzYzsgaXM6Ci0JICogKHNjcmlwdHxzdHlsZXxtZXRhfGxpbmt8b2JqZWN0fGlzaW5kZXgpKgotCSAqCi0JICogMDogKCVoZWFkLm1pc2MsIEEpCi0JICogQTogKEIgfCBDKQotCSAqIEI6ICh0aXRsZSwgJWhlYWQubWlzYzssIEQpCi0JICogQzogKGJhc2UsICVoZWFkLm1pc2M7LCBFKQotCSAqIEQ6IChiYXNlLCAlaGVhZC5taXNjOyk/Ci0JICogRTogKHRpdGxlLCAlaGVhZC5taXNjOykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gQXQgMXN0LCBjcmVhdGUgJWhlYWQubWlzYzsgY29udGVudC4KLQkJLy8gJWhlYWQubWlzYzsKLQkJLy8gICAoIHwgKSoKLQkJQ01Hcm91cEltcGwgbWlzYyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAobWlzYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLH07Ci0JCWNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG1pc2MsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQkvLyAybmQsIGdldCBhIHRpdGxlCi0JCUNNTm9kZSB0aXRsZSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFKTsKLQkJLy8gM3JkLCBnZXQgYSBiYXNlCi0JCUNNTm9kZSBiYXNlID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSk7Ci0JCWlmICh0aXRsZSA9PSBudWxsIHx8IGJhc2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUb3AgbGV2ZWwgY29udGVudCBpcyBhIHNlcXVlbmNlIG9mICVoZWFkLm1pc2M7IGFuZCBBLgotCQkvLyAwOiAoJWhlYWQubWlzYzssIEEpCi0JCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsKLQkJY29udGVudC5hcHBlbmRDaGlsZChtaXNjKTsKLQkJLy8gICBjcmVhdGUgQSBhbmQgYXBwZW5kIGl0IHRvIHRoZSB0b3AgbGV2ZWwuCi0JCXsKLQkJCS8vIEEgaXMgYSBjaG9pY2Ugb2YgQiBhbmQgQy4KLQkJCS8vIEE6IChCIHwgQykKLQkJCS8vICAgY3JlYXRlIGEgY2hvaWNlCi0JCQlDTUdyb3VwSW1wbCBnQSA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCQlpZiAoZ0EgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkvLyAgIGFwcGVuZCBBIHRvIHRoZSB0b3AgbGV2ZWwuCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGdBKTsKLQotCQkJLy8gY3JlYXRlIEIgYW5kIGFwcGVuZCBpdCB0byBBCi0JCQl7Ci0JCQkJLy8gQiBpcyBhIHNlcXVlbmNlIG9mIHRpdGxlLCAlaGVhZC5taXNjOywgYW5kIEQuCi0JCQkJLy8gQjogKHRpdGxlLCAlaGVhZC5taXNjOywgRCkKLQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJQ01Hcm91cEltcGwgZ0IgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJaWYgKGdCID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkvLyAgIGFwcGVuZCBCIHRvIEEuCi0JCQkJZ0EuYXBwZW5kQ2hpbGQoZ0IpOwotCi0JCQkJLy8gICBhcHBlbmQgdGl0bGUgdG8gQgotCQkJCWdCLmFwcGVuZENoaWxkKHRpdGxlKTsKLQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBCCi0JCQkJZ0IuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJLy8gICBjcmVhdGUgRCBhbmQgYXBwZW5kIGl0IHRvIEIuCi0JCQkJewotCQkJCQkvLyBEIGlzIGEgc2VxdWVuY2Ugb2YgYmFzZSwgJWhlYWQubWlzYzsuCi0JCQkJCS8vIEQ6IChiYXNlLCAlaGVhZC5taXNjOyk/Ci0JCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQkJQ01Hcm91cEltcGwgZ0QgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCQkJCWlmIChnRCA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQkvLyAgIGFwcGVuZCBEIHRvIEIuCi0JCQkJCWdCLmFwcGVuZENoaWxkKGdEKTsKLQotCQkJCQkvLyAgIGFwcGVuZCBiYXNlIHRvIEQKLQkJCQkJZ0QuYXBwZW5kQ2hpbGQoYmFzZSk7Ci0JCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEQuCi0JCQkJCWdELmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNyZWF0ZSBDIGFuZCBhcHBlbmQgaXQgdG8gQQotCQkJewotCQkJCS8vIEMgaXMgYSBzZXF1ZW5jZSBvZiBiYXNlLCAlaGVhZC5taXNjOywgYW5kIEUKLQkJCQkvLyBDOiAoYmFzZSwgJWhlYWQubWlzYzssIEUpCi0JCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCUNNR3JvdXBJbXBsIGdDID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCWlmIChnQyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gICBhcHBlbmQgQyB0byBBLgotCQkJCWdBLmFwcGVuZENoaWxkKGdDKTsKLQotCQkJCS8vICAgYXBwZW5kIGJhc2UgdG8gQwotCQkJCWdDLmFwcGVuZENoaWxkKGJhc2UpOwotCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEMKLQkJCQlnQy5hcHBlbmRDaGlsZChtaXNjKTsKLQotCQkJCS8vICAgY3JlYXRlIEUgYW5kIGFwcGVuZCBpdCB0byBDLgotCQkJCXsKLQkJCQkJLy8gRSBpcyBhIHNlcXVlbmNlIG9mIHRpdGxlIGFuZCAlaGVhZC5taXNjOy4KLQkJCQkJLy8gRTogKHRpdGxlLCAlaGVhZC5taXNjOykKLQkJCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCQlDTUdyb3VwSW1wbCBnRSA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQkJaWYgKGdFID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vICAgYXBwZW5kIEUgdG8gQy4KLQkJCQkJZ0MuYXBwZW5kQ2hpbGQoZ0UpOwotCi0JCQkJCS8vICAgYXBwZW5kIHRpdGxlIHRvIEUKLQkJCQkJZ0UuYXBwZW5kQ2hpbGQodGl0bGUpOwotCQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBFLgotCQkJCQlnRS5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50IGNvbnRlbnQuPGJyPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSEVBRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEh0bWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSHRtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRmZTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSHRtbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgPGNvZGU+SFRNTDwvY29kZT4uPGJyPgotICogQ29udGVudCBNb2RlbDoKLSAqIEhFQUQsIChGUkFNRVNFVHxCT0RZKTxicj4KLSAqLwotZmluYWwgY2xhc3MgQ3RkSHRtbCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ3RkSHRtbChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRDsKLQl9Ci0KLQkvKioKLQkgKiAoJWh0bWwuY29udGVudDspLgotCSAqICVodG1sLmNvbnRlbnQ7IGlzIEhFQUQsIChGUkFNRVNFVCB8IEJPRFkpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBIRUFECi0JCUNNTm9kZSBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JCS8vICggfCApCi0JCUNNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChncm91cCk7Ci0KLQkJLy8gRlJBTUVTRVQsIEJPRFkKLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWX07Ci0JCWNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50IGNvbnRlbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSFRNTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZElubGluZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRJbmxpbmVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyMzRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZElubGluZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciAoJWlubGluZTspKi4KLSAqLwotZmluYWwgY2xhc3MgQ3RkSW5saW5lQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRJbmxpbmVDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICglaW5saW5lKSouCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJY29sbGVjdGlvbi5nZXRJbmxpbmUoY29udGVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRMaUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRMaUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjg5NTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkTGlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBMaXN0IGl0ZW0gY29udGFpbmVyLgotICogKExJKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkTGlDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbkNvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTGlDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJOwotCX0KLQotCS8qKgotCSAqIChMSSkrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoTEkpKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJQ01Ob2RlIGxpID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEkpOwotCQlpZiAobGkgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQobGkpOwotCX0KLQotCS8qKgotCSAqIEVMRU1FTlQgY29udGVudC48YnI+Ci0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9MSV9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRPcHRpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZWM2YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRPcHRpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBPUFRJT04gY29udGFpbmVyLgotICogKE9QVElPTikrCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZE9wdGlvbkNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkT3B0aW9uQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JfQotCi0JLyoqCi0JICogKE9QVElPTikrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBPUFRJT04KLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX09QVElPTl9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRTZWxlY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkU2VsZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMGM5NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRTZWxlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBDdGRTZWxlY3QgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFNlbGVjdChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OOwotCX0KLQotCS8qKgotCSAqIChPUFRHUk9VUCB8IE9QVElPTikrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBPUFRJT04KLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUR1JPVVAgfCBPUFRJT04pKy4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9TRUxFQ1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9EZWNsQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9EZWNsQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjkwYjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRGVjbENvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqLwotYWJzdHJhY3QgY2xhc3MgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQotCXByb3RlY3RlZCBjbGFzcyBEdWFsTWFwIHsKLQkJcHVibGljIER1YWxNYXAoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIER1YWxNYXAoT2JqZWN0W10gb2JqZWN0cykgewotCQkJc3VwZXIoKTsKLQkJCWluaXRpYWxpemUob2JqZWN0cyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQlyZXR1cm4gdGFibGUubGVuZ3RoOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShpbnQga2V5KSB7Ci0JCQlpZiAoIWlzVmFsaWRJbmRleChrZXkpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHRhYmxlW2tleV07Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEtleShPYmplY3QgdmFsdWUpIHsKLQkJCUludGVnZXIga2V5T2JqID0gKEludGVnZXIpIG1hcC5nZXQodmFsdWUpOwotCQkJaWYgKGtleU9iaiA9PSBudWxsKQotCQkJCXJldHVybiBJRF9VTktOT1dOOwotCQkJcmV0dXJuIGtleU9iai5pbnRWYWx1ZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShPYmplY3RbXSBvYmplY3RzKSB7Ci0JCQlpZiAob2JqZWN0cyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXRhYmxlID0gb2JqZWN0czsKLQkJCW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBrZXkgPSAwOyBrZXkgPCBvYmplY3RzLmxlbmd0aDsga2V5KyspIHsKLQkJCQlPYmplY3QgdmFsdWUgPSB0YWJsZVtrZXldOwotCQkJCW1hcC5wdXQodmFsdWUsIG5ldyBJbnRlZ2VyKGtleSkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBPYmplY3RbXSB0YWJsZSA9IG51bGw7Ci0JCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBudWxsOwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSW5kZXgoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gaW5kZXggPj0gMCAmJiBpbmRleCA8IHRhYmxlLmxlbmd0aDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUb2xlcmFudFN0cmluZ0R1YWxNYXAgZXh0ZW5kcyBEdWFsTWFwIHsKLQkJcHVibGljIFRvbGVyYW50U3RyaW5nRHVhbE1hcChTdHJpbmdbXSBuYW1lcykgewotCQkJc3VwZXIoKTsKLQkJCU9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0W25hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb2JqZWN0c1tpXSA9IG1ha2VDYW5vbmljYWxGb3JtKG5hbWVzW2ldKTsKLQkJCX0KLQkJCWluaXRpYWxpemUob2JqZWN0cyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEtleShPYmplY3QgdmFsdWUpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0S2V5KG1ha2VDYW5vbmljYWxGb3JtKG5hbWUpKTsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBJRF9VTktOT1dOOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbWFrZUNhbm9uaWNhbEZvcm0oU3RyaW5nIHJhdykgewotCQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDAxNTIKLQkJCS8vIHdlIGFyZSBhYmxlIHRvICJjaGVhdCIgaGVyZSBhIGxpdHRsZSBhbmQgdXNlIFVTIExvY2FsZQotCQkJLy8gdG8gZ2V0IGEgZ29vZCBjb25vbmljYWwgZm9ybSwgc2luY2Ugd2UgYXJlIHVzaW5nIHRoaXMgb25seQotCQkJLy8gZm9yIEhUTUwgYW5kIEpTUCBzdGFuZGFyZCB0YWdzLgotCQkJLy8gTG9uZyB0ZXJtLCBmb3Igc2ltaWxhciBuZWVkcyB3aXRoIFhNTCAxLjEgKGZvciBleGFtcGxlKQotCQkJLy8gd2Ugc2hvdWxkIHVzZSBhIGNsYXNzIHN1Y2ggYXMgY29tLmlibS5pY3UudGV4dC5Ob3JtYWxpemVyCi0JCQlyZXR1cm4gcmF3LnRvVXBwZXJDYXNlKExvY2FsZS5VUyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIERlY2xJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJcHVibGljIERlY2xJdGVyYXRvcigpIHsKLQkJCW1heGlkID0gZkRlY2xzLmxlbmd0aCAtIDE7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGlkIDwgbWF4aWQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlpZiAoIWhhc05leHQoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpdGVtKCsraWQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgeyAvKiBub3RoaW5nIHNob3VsZCBiZSBkb25lLiAqLwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgaWQgPSAtMTsKLQkJcHJpdmF0ZSBpbnQgbWF4aWQgPSAtMTsKLQl9Ci0KLQlDTU5vZGVbXSBmRGVjbHMgPSBudWxsOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBTVFJJQ1RfQ0FTRSA9IGZhbHNlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBUT0xFUkFOVF9DQVNFID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBJRF9VTktOT1dOID0gLTE7Ci0JcHJpdmF0ZSBEdWFsTWFwIGZNYXAgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIERlY2xDb2xsZWN0aW9uKFN0cmluZ1tdIG5hbWVzLCBib29sZWFuIHRvbGVyYW50KSB7Ci0JCXN1cGVyKCk7Ci0JCWZEZWNscyA9IG5ldyBDTU5vZGVbbmFtZXMubGVuZ3RoXTsKLQkJaWYgKHRvbGVyYW50KSB7Ci0JCQlmTWFwID0gbmV3IFRvbGVyYW50U3RyaW5nRHVhbE1hcChuYW1lcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTWFwID0gbmV3IER1YWxNYXAobmFtZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENNTm9kZSBjcmVhdGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldERlY2xhcmF0aW9ucyhTdHJpbmdbXSBuYW1lcykgewotCQlDTU5hbWVkTm9kZU1hcEltcGwgbWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCQkJQ01Ob2RlIG5vZGUgPSBnZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJbWFwLnB1dE5hbWVkSXRlbShuYW1lLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldERlY2xhcmF0aW9ucyhDTUdyb3VwSW1wbCBncm91cCwgSXRlcmF0b3IgbmFtZXMpIHsKLQkJd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0KCk7Ci0JCQlDTU5vZGUgZGVjID0gZ2V0TmFtZWRJdGVtKGVudGl0eU5hbWUpOwotCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCWdyb3VwLmFwcGVuZENoaWxkKGRlYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNYXAgbmFtZSB0byBpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRJRChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZk1hcC5nZXRLZXkobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmRGVjbHMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lKGludCBpZCkgewotCQlyZXR1cm4gKFN0cmluZykgZk1hcC5nZXRWYWx1ZShpZCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlpbnQgaWQgPSBnZXRJRChuYW1lKTsKLQkJaWYgKCFpc1ZhbGlkSUQoaWQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBpdGVtKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSUQoaW50IGlkKSB7Ci0JCXJldHVybiBpZCA+PSAwICYmIGlkIDwgZkRlY2xzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmICghaXNWYWxpZElEKGluZGV4KSkKLQkJCXJldHVybiBudWxsOwotCQlDTU5vZGUgZGVjbCA9IGZEZWNsc1tpbmRleF07Ci0JCWlmIChkZWNsICE9IG51bGwpCi0JCQlyZXR1cm4gZGVjbDsgLy8gYWxyZWFkeSBleGlzdC4KLQotCQlkZWNsID0gY3JlYXRlKGdldE5hbWUoaW5kZXgpKTsKLQkJZkRlY2xzW2luZGV4XSA9IGRlY2w7Ci0JCXJldHVybiBkZWNsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBEZWNsSXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODAxMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9FbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgRWxlbWVudENvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lIHsKLQotCi0JLy8gRWxlbWVudCBJRHMKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUREUkVTUyA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JBU0UgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CTE9DS1FVT1RFID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQk9EWSA9IDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JSID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VOVEVSID0gNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREQgPSA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVIgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVYgPSA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ETCA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EVCA9IDExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT1JNID0gMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0gxID0gMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0gyID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0gzID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0g0ID0gMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0g1ID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0g2ID0gMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFQUQgPSAxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSFIgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSFRNTCA9IDIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTUcgPSAyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5QVVQgPSAyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEkgPSAyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUVOVSA9IDI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NRVRBID0gMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09MID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QVElPTiA9IDI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSRSA9IDMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRUxFQ1QgPSAzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEVYVEFSRUEgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElUTEUgPSAzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUwgPSAzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0NPTkZJRyA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRUNITyA9IDM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRVhFQyA9IDM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRlNJWkUgPSAzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0ZMQVNUTU9EID0gMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9JTkNMVURFID0gNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9QUklOVEVOViA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfU0VUID0gNDI7Ci0KLQkJcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtT2ZJZHMoKSB7Ci0JCQlpZiAobnVtb2ZpZHMgIT0gLTEpCi0JCQkJcmV0dXJuIG51bW9maWRzOwotCi0JCQkvLyBOT1RFOiBJZiB0aGUgcmVmbGVjdGlvbiBpcyB0b28gc2xvdywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JCQkvLyBqdXN0IHJldHVybiB0aGUgbGl0ZXJhbCB2YWx1ZSwgbGlrZSAxMDUuCi0JCQkvLyAtLSA1LzI1LzIwMDEKLQkJCUNsYXNzIGNsYXp6ID0gSWRzLmNsYXNzOwotCQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJCW51bW9maWRzID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIklEXyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJbnVtb2ZpZHMrKzsKLQkJCX0KLQkJCXJldHVybiBudW1vZmlkczsKLQkJfQotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQl9Ci0KLQkvKiogJWZvcm1jdGw7LiBJTlBVVCB8IFNFTEVDVCB8IFRFWFRBUkVBICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRk9STUNUTCA9IHtJTlBVVCwgU0VMRUNULCBURVhUQVJFQX07Ci0JLyoqICVwaHJhc2U7LgotCSAqIERGTgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIUkFTRSA9IHtERk59OwotCS8qKiAlc3BlY2lhbDsuCi0JICogQSB8IElNRyB8IEJSCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1BFQ0lBTCA9IHtBLCBJTUcsIEJSfTsKLQkvKiogJWhlYWRpbmc7LiBIWzEtNl0gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBIRUFESU5HID0ge0gxLCBIMiwgSDMsIEg0LCBINSwgSDZ9OwotCS8qKiAlbGlzdDsuIFVMIHwgT0wgfCBESVIgfCBNRU5VICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTElTVCA9IHtVTCwgT0wsIERJUiwgTUVOVX07Ci0JLyoqICVwcmVmb3JtYXR0ZWQ7LiBQUkUgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUkVGT1JNQVRURUQgPSB7UFJFfTsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlQ29sbGVjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX0FdID0gQTsKLQkJbmFtZXNbSWRzLklEX0FERFJFU1NdID0gQUREUkVTUzsKLQkJbmFtZXNbSWRzLklEX0JBU0VdID0gQkFTRTsKLQkJbmFtZXNbSWRzLklEX0JMT0NLUVVPVEVdID0gQkxPQ0tRVU9URTsKLQkJbmFtZXNbSWRzLklEX0JPRFldID0gQk9EWTsKLQkJbmFtZXNbSWRzLklEX0JSXSA9IEJSOwotCQluYW1lc1tJZHMuSURfQ0VOVEVSXSA9IENFTlRFUjsKLQkJbmFtZXNbSWRzLklEX0REXSA9IEREOwotCQluYW1lc1tJZHMuSURfRElSXSA9IERJUjsKLQkJbmFtZXNbSWRzLklEX0RJVl0gPSBESVY7Ci0JCW5hbWVzW0lkcy5JRF9ETF0gPSBETDsKLQkJbmFtZXNbSWRzLklEX0RUXSA9IERUOwotCQluYW1lc1tJZHMuSURfRk9STV0gPSBGT1JNOwotCQluYW1lc1tJZHMuSURfSDFdID0gSDE7Ci0JCW5hbWVzW0lkcy5JRF9IMl0gPSBIMjsKLQkJbmFtZXNbSWRzLklEX0gzXSA9IEgzOwotCQluYW1lc1tJZHMuSURfSDRdID0gSDQ7Ci0JCW5hbWVzW0lkcy5JRF9INV0gPSBINTsKLQkJbmFtZXNbSWRzLklEX0g2XSA9IEg2OwotCQluYW1lc1tJZHMuSURfSEVBRF0gPSBIRUFEOwotCQluYW1lc1tJZHMuSURfSFJdID0gSFI7Ci0JCW5hbWVzW0lkcy5JRF9IVE1MXSA9IEhUTUw7Ci0JCW5hbWVzW0lkcy5JRF9JTUddID0gSU1HOwotCQluYW1lc1tJZHMuSURfSU5QVVRdID0gSU5QVVQ7Ci0JCW5hbWVzW0lkcy5JRF9MSV0gPSBMSTsKLQkJbmFtZXNbSWRzLklEX01FTlVdID0gTUVOVTsKLQkJbmFtZXNbSWRzLklEX01FVEFdID0gTUVUQTsKLQkJbmFtZXNbSWRzLklEX09MXSA9IE9MOwotCQluYW1lc1tJZHMuSURfT1BUSU9OXSA9IE9QVElPTjsKLQkJbmFtZXNbSWRzLklEX1BdID0gUDsKLQkJbmFtZXNbSWRzLklEX1BSRV0gPSBQUkU7Ci0JCW5hbWVzW0lkcy5JRF9TRUxFQ1RdID0gU0VMRUNUOwotCQluYW1lc1tJZHMuSURfVEVYVEFSRUFdID0gVEVYVEFSRUE7Ci0JCW5hbWVzW0lkcy5JRF9USVRMRV0gPSBUSVRMRTsKLQkJbmFtZXNbSWRzLklEX1VMXSA9IFVMOwotCQluYW1lc1tJZHMuSURfU1NJX0NPTkZJR10gPSBTU0lfQ09ORklHOwotCQluYW1lc1tJZHMuSURfU1NJX0VDSE9dID0gU1NJX0VDSE87Ci0JCW5hbWVzW0lkcy5JRF9TU0lfRVhFQ10gPSBTU0lfRVhFQzsKLQkJbmFtZXNbSWRzLklEX1NTSV9GU0laRV0gPSBTU0lfRlNJWkU7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfRkxBU1RNT0RdID0gU1NJX0ZMQVNUTU9EOwotCQluYW1lc1tJZHMuSURfU1NJX0lOQ0xVREVdID0gU1NJX0lOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfUFJJTlRFTlZdID0gU1NJX1BSSU5URU5WOwotCQluYW1lc1tJZHMuSURfU1NJX1NFVF0gPSBTU0lfU0VUOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50Q29sbGVjdGlvbihBdHRyaWJ1dGVDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIobmFtZXMsIFRPTEVSQU5UX0NBU0UpOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBY3R1YWxseSBjcmVhdGVzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaW5zdGFuY2UuCi0JICogQHJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCUhUTUxFbGVtRGVjbEltcGwgZWRlYyA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQUREUkVTUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQUREUkVTUyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkFTRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkFTRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkxPQ0tRVU9URSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkxPQ0tRVU9URSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQk9EWSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQk9EWSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQlIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDRU5URVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZENFTlRFUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEREKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShESVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FTlUoRElSLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRElWKSkgewotCQkJZWRlYyA9IG5ldyBIZWRESVYodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRETCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRFQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGT1JNKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGT1JNKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgyKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgyLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDMsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg1KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg1LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDYsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIRUFEKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIRUFEKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSFIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhUTUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElNRykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSU1HKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTlBVVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSU5QVVQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKExJKSkgewotCQkJZWRlYyA9IG5ldyBIZWRMSSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVOVSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVOVShNRU5VLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUVUQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVUQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT0wpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9MKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPUFRJT04pKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9QVElPTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUFJFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQUkUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNFTEVDVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU0VMRUNUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShURVhUQVJFQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVEVYVEFSRUEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRJVExFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUSVRMRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFVMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfQ09ORklHKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lDb25maWcodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9FQ0hPKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lFY2hvKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRVhFQykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRXhlYyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0ZTSVpFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lGc2l6ZSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0ZMQVNUTU9EKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lGbGFzdG1vZCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0lOQ0xVREUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUluY2x1ZGUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9QUklOVEVOVikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJUHJpbnRlbnYodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9TRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSVNldCh0aGlzKTsKLQotCQl9IC8vIHVua25vd24KLQkJZWxzZSB7Ci0JCQkvLyBOT1RFOiBXZSBkb24ndCBkZWZpbmUgdGhlIFVOS05PV04gZWxlbWVudCBkZWNsYXJhdGlvbi4KLQkJCS8vIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhIGRlY2xhcmF0aW9uIGlzIGEgc2lnbiBvZgotCQkJLy8gdGhlIHRhcmdldCBlbGVtZW50IGlzIHVua25vd24uCi0JCQkvLyAtLSAzLzkvMjAwMQotCQkJZWRlYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVkZWM7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUNvbGxlY3Rpb24gZ2V0QXR0cmlidXRlQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZUNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIENvbGxlY3Rpb24gZ2V0TmFtZXNPZkJsb2NrKCkgewotCQkvLyBQIHwgJWxpc3QgfCAlcHJlZm9ybWF0dGVkIHwgREwgfCBESVYgfCBDRU5URVIgfCBCTE9DS1FVT1RFIHwgRk9STSB8IEhSCi0JCVN0cmluZ1tdIGJsb2NrTWlzYyA9IHtQLCBETCwgRElWLCBDRU5URVIsIEJMT0NLUVVPVEUsIEZPUk0sIEhSLH07Ci0JCVZlY3RvciBibG9ja05hbWVzID0gbmV3IFZlY3RvcihBcnJheXMuYXNMaXN0KGJsb2NrTWlzYykpOwotCQkvLyAlaGVhZGluZzsKLQkJYmxvY2tOYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChIRUFESU5HKSk7Ci0JCS8vICVsaXN0OwotCQlibG9ja05hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KExJU1QpKTsKLQkJLy8gJXByZWZvcm1hdHRlZDsKLQkJYmxvY2tOYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChQUkVGT1JNQVRURUQpKTsKLQotCQlyZXR1cm4gYmxvY2tOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiAlYmxvY2s7LgotCSAqICVibG9jazsgaXM6Ci0JICogUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotCSAqIE5PU0NSSVBUIHwgTk9GUkFNRVMgfCBCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVggfCBIUiB8Ci0JICogVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEJsb2NrKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIGdldE5hbWVzT2ZCbG9jaygpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbQotCSAqIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4gaW5zdGFuY2UuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0RmxvdyhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0QmxvY2soZ3JvdXApOwotCQlnZXRJbmxpbmUoZ3JvdXApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEZvbnRzdHlsZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0Rm9ybWN0cmwoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChGT1JNQ1RMKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlaGVhZGluZzsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0SGVhZGluZyhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoSEVBRElORykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtCi0JICogaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRJbmxpbmUoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldEZvbnRzdHlsZShncm91cCk7Ci0JCWdldFBocmFzZShncm91cCk7Ci0JCWdldFNwZWNpYWwoZ3JvdXApOwotCQlnZXRGb3JtY3RybChncm91cCk7Ci0JfQotCi0JLyoqCi0JICogJWxpc3Q7LgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldExpc3QoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KExJU1QpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFBocmFzZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFBIUkFTRSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogJXByZWZvcm1hdHRlZDsKLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRQcmVmb3JtYXR0ZWQoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFBSRUZPUk1BVFRFRCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0U3BlY2lhbChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFNQRUNJQUwpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRW50aXR5Q29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzcxZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZW50aXR5IGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgRW50aXR5Q29sbGVjdGlvbiBleHRlbmRzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2UuRW50aXR5TmFtZSB7Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FBQ1VURV9MID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUFDVVRFX1UgPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ0lSQ19MID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNJUkNfVSA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDVVRFID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUVMSUdfTCA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FFTElHX1UgPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BR1JBVkVfTCA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FHUkFWRV9VID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxFRlNZTSA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FMUEhBX0wgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxQSEFfVSA9IDExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTVAgPSAxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU5EID0gMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FORyA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUklOR19MID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FSSU5HX1UgPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVNZTVAgPSAxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVRJTERFX0wgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVRJTERFX1UgPSAxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVNTF9MID0gMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FVTUxfVSA9IDIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRFFVTyA9IDIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRVRBX0wgPSAyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkVUQV9VID0gMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JSVkJBUiA9IDI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CVUxMID0gMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NBUCA9IDI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQ0VESUxfTCA9IDI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQ0VESUxfVSA9IDI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DRURJTCA9IDMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DRU5UID0gMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NISV9MID0gMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NISV9VID0gMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NJUkMgPSAzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0xVQlMgPSAzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09ORyA9IDM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT1BZID0gMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NSQVJSID0gMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NVUCA9IDM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DVVJSRU4gPSA0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFHR0VSX0wgPSA0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFHR0VSX1UgPSA0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFSUl9MID0gNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBUlJfVSA9IDQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUcgPSA0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVMVEFfTCA9IDQ2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUxUQV9VID0gNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJQU1TID0gNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJVklERSA9IDQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQUNVVEVfTCA9IDUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQUNVVEVfVSA9IDUxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQ0lSQ19MID0gNTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VDSVJDX1UgPSA1MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUdSQVZFX0wgPSA1NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUdSQVZFX1UgPSA1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU1QVFkgPSA1NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU1TUCA9IDU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTlNQID0gNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VQU0lMT05fTCA9IDU5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUFNJTE9OX1UgPSA2MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVFVSVYgPSA2MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRBX0wgPSA2MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRBX1UgPSA2MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRIX0wgPSA2NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRIX1UgPSA2NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVNTF9MID0gNjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVTUxfVSA9IDY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVVJPID0gNjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VYSVNUID0gNjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZOT0YgPSA3MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk9SQUxMID0gNzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMxMiA9IDcyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMTQgPSA3MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzM0ID0gNzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQVNMID0gNzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dBTU1BX0wgPSA3NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0FNTUFfVSA9IDc3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HRSA9IDc4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HVCA9IDc5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IQVJSX0wgPSA4MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEFSUl9VID0gODE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFQVJUUyA9IDgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IRUxMSVAgPSA4MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUFDVVRFX0wgPSA4NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUFDVVRFX1UgPSA4NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUNJUkNfTCA9IDg2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQ0lSQ19VID0gODc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lFWENMID0gODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lHUkFWRV9MID0gODk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lHUkFWRV9VID0gOTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lNQUdFID0gOTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lORklOID0gOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOVCA9IDkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JT1RBX0wgPSA5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU9UQV9VID0gOTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lRVUVTVCA9IDk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JU0lOID0gOTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lVTUxfTCA9IDk4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JVU1MX1UgPSA5OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfS0FQUEFfTCA9IDEwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfS0FQUEFfVSA9IDEwMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFNQkRBX0wgPSAxMDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTUJEQV9VID0gMTAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU5HID0gMTA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVFVTyA9IDEwNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFSUl9MID0gMTA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVJSX1UgPSAxMDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xDRUlMID0gMTA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRFFVTyA9IDEwOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEUgPSAxMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xGTE9PUiA9IDExMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTE9XQVNUID0gMTEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MT1ogPSAxMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xSTSA9IDExNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFNBUVVPID0gMTE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MU1FVTyA9IDExNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFQgPSAxMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01BQ1IgPSAxMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01EQVNIID0gMTE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSUNSTyA9IDEyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUlERE9UID0gMTIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSU5VUyA9IDEyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTVVfTCA9IDEyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTVVfVSA9IDEyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkFCTEEgPSAxMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05CU1AgPSAxMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05EQVNIID0gMTI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ORSA9IDEyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkkgPSAxMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PVCA9IDEzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9USU4gPSAxMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05TVUIgPSAxMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05USUxERV9MID0gMTMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVElMREVfVSA9IDEzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlVfTCA9IDEzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlVfVSA9IDEzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0FDVVRFX0wgPSAxMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09BQ1VURV9VID0gMTM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQ0lSQ19MID0gMTM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQ0lSQ19VID0gMTQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PRUxJR19MID0gMTQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PRUxJR19VID0gMTQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PR1JBVkVfTCA9IDE0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0dSQVZFX1UgPSAxNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09MSU5FID0gMTQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUVHQV9MID0gMTQ2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUVHQV9VID0gMTQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUlDUk9OX0wgPSAxNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NSUNST05fVSA9IDE0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1BMVVMgPSAxNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SID0gMTUxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUkRGID0gMTUyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUkRNID0gMTUzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PU0xBU0hfTCA9IDE1NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1NMQVNIX1UgPSAxNTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USUxERV9MID0gMTU2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElMREVfVSA9IDE1NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTUVTID0gMTU4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVU1MX0wgPSAxNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VTUxfVSA9IDE2MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFSQSA9IDE2MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFSVCA9IDE2MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEVSTUlMID0gMTYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QRVJQID0gMTY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSElfTCA9IDE2NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEhJX1UgPSAxNjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BJViA9IDE2NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElfTCA9IDE2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElfVSA9IDE2OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUExVU01OID0gMTcwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QT1VORCA9IDE3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJJTUVfTCA9IDE3MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJJTUVfVSA9IDE3MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJPRCA9IDE3NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJPUCA9IDE3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFNJX0wgPSAxNzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BTSV9VID0gMTc3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9RVU9UID0gMTc4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQURJQyA9IDE3OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFORyA9IDE4MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFRVU8gPSAxODE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBUlJfTCA9IDE4MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFSUl9VID0gMTgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQ0VJTCA9IDE4NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkRRVU8gPSAxODU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JFQUwgPSAxODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JFRyA9IDE4NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkZMT09SID0gMTg4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SSE9fTCA9IDE4OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkhPX1UgPSAxOTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JMTSA9IDE5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUlNBUVVPID0gMTkyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SU1FVTyA9IDE5MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0JRVU8gPSAxOTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDQVJPTl9MID0gMTk1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ0FST05fVSA9IDE5NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0RPVCA9IDE5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VDVCA9IDE5ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0hZID0gMTk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSUdNQUYgPSAyMDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BX0wgPSAyMDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BX1UgPSAyMDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJTSA9IDIwMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1BBREVTID0gMjA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVUIgPSAyMDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVQkUgPSAyMDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVTSA9IDIwNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQID0gMjA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAxID0gMjA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAyID0gMjEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAzID0gMjExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVBFID0gMjEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TWkxJRyA9IDIxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEFVX0wgPSAyMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RBVV9VID0gMjE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVSRTQgPSAyMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBU1lNID0gMjE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVUQV9MID0gMjE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVUQV9VID0gMjE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USElOU1AgPSAyMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIT1JOX0wgPSAyMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIT1JOX1UgPSAyMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJTERFID0gMjIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USU1FUyA9IDIyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVFJBREUgPSAyMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBQ1VURV9MID0gMjI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQUNVVEVfVSA9IDIyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFSUl9MID0gMjI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQVJSX1UgPSAyMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VDSVJDX0wgPSAyMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VDSVJDX1UgPSAyMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VHUkFWRV9MID0gMjMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VR1JBVkVfVSA9IDIzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVU1MID0gMjM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJSCA9IDIzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVBTSUxPTl9MID0gMjM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJTE9OX1UgPSAyMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VVTUxfTCA9IDIzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVVNTF9VID0gMjM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9XRUlFUlAgPSAyNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1hJX0wgPSAyNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1hJX1UgPSAyNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lBQ1VURV9MID0gMjQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZQUNVVEVfVSA9IDI0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUVOID0gMjQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZVU1MX0wgPSAyNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lVTUxfVSA9IDI0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWkVUQV9MID0gMjQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aRVRBX1UgPSAyNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pXSiA9IDI1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWldOSiA9IDI1MTsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDI1Mi4KLQkJCS8vIC0tIDUvMjQvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG5hbWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCW5hbWVzID0gbmV3IFN0cmluZ1tJZHMuZ2V0TnVtT2ZJZHMoKV07Ci0JCW5hbWVzW0lkcy5JRF9BQUNVVEVfTF0gPSBBQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX0FBQ1VURV9VXSA9IEFBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfQUNJUkNfTF0gPSBBQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfQUNJUkNfVV0gPSBBQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfQUNVVEVdID0gQUNVVEU7Ci0JCW5hbWVzW0lkcy5JRF9BRUxJR19MXSA9IEFFTElHX0w7Ci0JCW5hbWVzW0lkcy5JRF9BRUxJR19VXSA9IEFFTElHX1U7Ci0JCW5hbWVzW0lkcy5JRF9BR1JBVkVfTF0gPSBBR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX0FHUkFWRV9VXSA9IEFHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfQUxFRlNZTV0gPSBBTEVGU1lNOwotCQluYW1lc1tJZHMuSURfQUxQSEFfTF0gPSBBTFBIQV9MOwotCQluYW1lc1tJZHMuSURfQUxQSEFfVV0gPSBBTFBIQV9VOwotCQluYW1lc1tJZHMuSURfQU1QXSA9IEFNUDsKLQkJbmFtZXNbSWRzLklEX0FORF0gPSBBTkQ7Ci0JCW5hbWVzW0lkcy5JRF9BTkddID0gQU5HOwotCQluYW1lc1tJZHMuSURfQVJJTkdfTF0gPSBBUklOR19MOwotCQluYW1lc1tJZHMuSURfQVJJTkdfVV0gPSBBUklOR19VOwotCQluYW1lc1tJZHMuSURfQVNZTVBdID0gQVNZTVA7Ci0JCW5hbWVzW0lkcy5JRF9BVElMREVfTF0gPSBBVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX0FUSUxERV9VXSA9IEFUSUxERV9VOwotCQluYW1lc1tJZHMuSURfQVVNTF9MXSA9IEFVTUxfTDsKLQkJbmFtZXNbSWRzLklEX0FVTUxfVV0gPSBBVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9CRFFVT10gPSBCRFFVTzsKLQkJbmFtZXNbSWRzLklEX0JFVEFfTF0gPSBCRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9CRVRBX1VdID0gQkVUQV9VOwotCQluYW1lc1tJZHMuSURfQlJWQkFSXSA9IEJSVkJBUjsKLQkJbmFtZXNbSWRzLklEX0JVTExdID0gQlVMTDsKLQkJbmFtZXNbSWRzLklEX0NBUF0gPSBDQVA7Ci0JCW5hbWVzW0lkcy5JRF9DQ0VESUxfTF0gPSBDQ0VESUxfTDsKLQkJbmFtZXNbSWRzLklEX0NDRURJTF9VXSA9IENDRURJTF9VOwotCQluYW1lc1tJZHMuSURfQ0VESUxdID0gQ0VESUw7Ci0JCW5hbWVzW0lkcy5JRF9DRU5UXSA9IENFTlQ7Ci0JCW5hbWVzW0lkcy5JRF9DSElfTF0gPSBDSElfTDsKLQkJbmFtZXNbSWRzLklEX0NISV9VXSA9IENISV9VOwotCQluYW1lc1tJZHMuSURfQ0lSQ10gPSBDSVJDOwotCQluYW1lc1tJZHMuSURfQ0xVQlNdID0gQ0xVQlM7Ci0JCW5hbWVzW0lkcy5JRF9DT05HXSA9IENPTkc7Ci0JCW5hbWVzW0lkcy5JRF9DT1BZXSA9IENPUFk7Ci0JCW5hbWVzW0lkcy5JRF9DUkFSUl0gPSBDUkFSUjsKLQkJbmFtZXNbSWRzLklEX0NVUF0gPSBDVVA7Ci0JCW5hbWVzW0lkcy5JRF9DVVJSRU5dID0gQ1VSUkVOOwotCQluYW1lc1tJZHMuSURfREFHR0VSX0xdID0gREFHR0VSX0w7Ci0JCW5hbWVzW0lkcy5JRF9EQUdHRVJfVV0gPSBEQUdHRVJfVTsKLQkJbmFtZXNbSWRzLklEX0RBUlJfTF0gPSBEQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9EQVJSX1VdID0gREFSUl9VOwotCQluYW1lc1tJZHMuSURfREVHXSA9IERFRzsKLQkJbmFtZXNbSWRzLklEX0RFTFRBX0xdID0gREVMVEFfTDsKLQkJbmFtZXNbSWRzLklEX0RFTFRBX1VdID0gREVMVEFfVTsKLQkJbmFtZXNbSWRzLklEX0RJQU1TXSA9IERJQU1TOwotCQluYW1lc1tJZHMuSURfRElWSURFXSA9IERJVklERTsKLQkJbmFtZXNbSWRzLklEX0VBQ1VURV9MXSA9IEVBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfRUFDVVRFX1VdID0gRUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9FQ0lSQ19MXSA9IEVDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9FQ0lSQ19VXSA9IEVDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9FR1JBVkVfTF0gPSBFR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX0VHUkFWRV9VXSA9IEVHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfRU1QVFldID0gRU1QVFk7Ci0JCW5hbWVzW0lkcy5JRF9FTVNQXSA9IEVNU1A7Ci0JCW5hbWVzW0lkcy5JRF9FTlNQXSA9IEVOU1A7Ci0JCW5hbWVzW0lkcy5JRF9FUFNJTE9OX0xdID0gRVBTSUxPTl9MOwotCQluYW1lc1tJZHMuSURfRVBTSUxPTl9VXSA9IEVQU0lMT05fVTsKLQkJbmFtZXNbSWRzLklEX0VRVUlWXSA9IEVRVUlWOwotCQluYW1lc1tJZHMuSURfRVRBX0xdID0gRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVEFfVV0gPSBFVEFfVTsKLQkJbmFtZXNbSWRzLklEX0VUSF9MXSA9IEVUSF9MOwotCQluYW1lc1tJZHMuSURfRVRIX1VdID0gRVRIX1U7Ci0JCW5hbWVzW0lkcy5JRF9FVU1MX0xdID0gRVVNTF9MOwotCQluYW1lc1tJZHMuSURfRVVNTF9VXSA9IEVVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0VVUk9dID0gRVVSTzsKLQkJbmFtZXNbSWRzLklEX0VYSVNUXSA9IEVYSVNUOwotCQluYW1lc1tJZHMuSURfRk5PRl0gPSBGTk9GOwotCQluYW1lc1tJZHMuSURfRk9SQUxMXSA9IEZPUkFMTDsKLQkJbmFtZXNbSWRzLklEX0ZSQUMxMl0gPSBGUkFDMTI7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMTRdID0gRlJBQzE0OwotCQluYW1lc1tJZHMuSURfRlJBQzM0XSA9IEZSQUMzNDsKLQkJbmFtZXNbSWRzLklEX0ZSQVNMXSA9IEZSQVNMOwotCQluYW1lc1tJZHMuSURfR0FNTUFfTF0gPSBHQU1NQV9MOwotCQluYW1lc1tJZHMuSURfR0FNTUFfVV0gPSBHQU1NQV9VOwotCQluYW1lc1tJZHMuSURfR0VdID0gR0U7Ci0JCW5hbWVzW0lkcy5JRF9HVF0gPSBHVDsKLQkJbmFtZXNbSWRzLklEX0hBUlJfTF0gPSBIQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9IQVJSX1VdID0gSEFSUl9VOwotCQluYW1lc1tJZHMuSURfSEVBUlRTXSA9IEhFQVJUUzsKLQkJbmFtZXNbSWRzLklEX0hFTExJUF0gPSBIRUxMSVA7Ci0JCW5hbWVzW0lkcy5JRF9JQUNVVEVfTF0gPSBJQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX0lBQ1VURV9VXSA9IElBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfSUNJUkNfTF0gPSBJQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfSUNJUkNfVV0gPSBJQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfSUVYQ0xdID0gSUVYQ0w7Ci0JCW5hbWVzW0lkcy5JRF9JR1JBVkVfTF0gPSBJR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX0lHUkFWRV9VXSA9IElHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfSU1BR0VdID0gSU1BR0U7Ci0JCW5hbWVzW0lkcy5JRF9JTkZJTl0gPSBJTkZJTjsKLQkJbmFtZXNbSWRzLklEX0lOVF0gPSBJTlQ7Ci0JCW5hbWVzW0lkcy5JRF9JT1RBX0xdID0gSU9UQV9MOwotCQluYW1lc1tJZHMuSURfSU9UQV9VXSA9IElPVEFfVTsKLQkJbmFtZXNbSWRzLklEX0lRVUVTVF0gPSBJUVVFU1Q7Ci0JCW5hbWVzW0lkcy5JRF9JU0lOXSA9IElTSU47Ci0JCW5hbWVzW0lkcy5JRF9JVU1MX0xdID0gSVVNTF9MOwotCQluYW1lc1tJZHMuSURfSVVNTF9VXSA9IElVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0tBUFBBX0xdID0gS0FQUEFfTDsKLQkJbmFtZXNbSWRzLklEX0tBUFBBX1VdID0gS0FQUEFfVTsKLQkJbmFtZXNbSWRzLklEX0xBTUJEQV9MXSA9IExBTUJEQV9MOwotCQluYW1lc1tJZHMuSURfTEFNQkRBX1VdID0gTEFNQkRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQU5HXSA9IExBTkc7Ci0JCW5hbWVzW0lkcy5JRF9MQVFVT10gPSBMQVFVTzsKLQkJbmFtZXNbSWRzLklEX0xBUlJfTF0gPSBMQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9MQVJSX1VdID0gTEFSUl9VOwotCQluYW1lc1tJZHMuSURfTENFSUxdID0gTENFSUw7Ci0JCW5hbWVzW0lkcy5JRF9MRFFVT10gPSBMRFFVTzsKLQkJbmFtZXNbSWRzLklEX0xFXSA9IExFOwotCQluYW1lc1tJZHMuSURfTEZMT09SXSA9IExGTE9PUjsKLQkJbmFtZXNbSWRzLklEX0xPV0FTVF0gPSBMT1dBU1Q7Ci0JCW5hbWVzW0lkcy5JRF9MT1pdID0gTE9aOwotCQluYW1lc1tJZHMuSURfTFJNXSA9IExSTTsKLQkJbmFtZXNbSWRzLklEX0xTQVFVT10gPSBMU0FRVU87Ci0JCW5hbWVzW0lkcy5JRF9MU1FVT10gPSBMU1FVTzsKLQkJbmFtZXNbSWRzLklEX0xUXSA9IExUOwotCQluYW1lc1tJZHMuSURfTUFDUl0gPSBNQUNSOwotCQluYW1lc1tJZHMuSURfTURBU0hdID0gTURBU0g7Ci0JCW5hbWVzW0lkcy5JRF9NSUNST10gPSBNSUNSTzsKLQkJbmFtZXNbSWRzLklEX01JRERPVF0gPSBNSURET1Q7Ci0JCW5hbWVzW0lkcy5JRF9NSU5VU10gPSBNSU5VUzsKLQkJbmFtZXNbSWRzLklEX01VX0xdID0gTVVfTDsKLQkJbmFtZXNbSWRzLklEX01VX1VdID0gTVVfVTsKLQkJbmFtZXNbSWRzLklEX05BQkxBXSA9IE5BQkxBOwotCQluYW1lc1tJZHMuSURfTkJTUF0gPSBOQlNQOwotCQluYW1lc1tJZHMuSURfTkRBU0hdID0gTkRBU0g7Ci0JCW5hbWVzW0lkcy5JRF9ORV0gPSBORTsKLQkJbmFtZXNbSWRzLklEX05JXSA9IE5JOwotCQluYW1lc1tJZHMuSURfTk9UXSA9IE5PVDsKLQkJbmFtZXNbSWRzLklEX05PVElOXSA9IE5PVElOOwotCQluYW1lc1tJZHMuSURfTlNVQl0gPSBOU1VCOwotCQluYW1lc1tJZHMuSURfTlRJTERFX0xdID0gTlRJTERFX0w7Ci0JCW5hbWVzW0lkcy5JRF9OVElMREVfVV0gPSBOVElMREVfVTsKLQkJbmFtZXNbSWRzLklEX05VX0xdID0gTlVfTDsKLQkJbmFtZXNbSWRzLklEX05VX1VdID0gTlVfVTsKLQkJbmFtZXNbSWRzLklEX09BQ1VURV9MXSA9IE9BQ1VURV9MOwotCQluYW1lc1tJZHMuSURfT0FDVVRFX1VdID0gT0FDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PQ0lSQ19MXSA9IE9DSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9PQ0lSQ19VXSA9IE9DSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9PRUxJR19MXSA9IE9FTElHX0w7Ci0JCW5hbWVzW0lkcy5JRF9PRUxJR19VXSA9IE9FTElHX1U7Ci0JCW5hbWVzW0lkcy5JRF9PR1JBVkVfTF0gPSBPR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX09HUkFWRV9VXSA9IE9HUkFWRV9VOwotCQluYW1lc1tJZHMuSURfT0xJTkVdID0gT0xJTkU7Ci0JCW5hbWVzW0lkcy5JRF9PTUVHQV9MXSA9IE9NRUdBX0w7Ci0JCW5hbWVzW0lkcy5JRF9PTUVHQV9VXSA9IE9NRUdBX1U7Ci0JCW5hbWVzW0lkcy5JRF9PTUlDUk9OX0xdID0gT01JQ1JPTl9MOwotCQluYW1lc1tJZHMuSURfT01JQ1JPTl9VXSA9IE9NSUNST05fVTsKLQkJbmFtZXNbSWRzLklEX09QTFVTXSA9IE9QTFVTOwotCQluYW1lc1tJZHMuSURfT1JdID0gT1I7Ci0JCW5hbWVzW0lkcy5JRF9PUkRGXSA9IE9SREY7Ci0JCW5hbWVzW0lkcy5JRF9PUkRNXSA9IE9SRE07Ci0JCW5hbWVzW0lkcy5JRF9PU0xBU0hfTF0gPSBPU0xBU0hfTDsKLQkJbmFtZXNbSWRzLklEX09TTEFTSF9VXSA9IE9TTEFTSF9VOwotCQluYW1lc1tJZHMuSURfT1RJTERFX0xdID0gT1RJTERFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PVElMREVfVV0gPSBPVElMREVfVTsKLQkJbmFtZXNbSWRzLklEX09USU1FU10gPSBPVElNRVM7Ci0JCW5hbWVzW0lkcy5JRF9PVU1MX0xdID0gT1VNTF9MOwotCQluYW1lc1tJZHMuSURfT1VNTF9VXSA9IE9VTUxfVTsKLQkJbmFtZXNbSWRzLklEX1BBUkFdID0gUEFSQTsKLQkJbmFtZXNbSWRzLklEX1BBUlRdID0gUEFSVDsKLQkJbmFtZXNbSWRzLklEX1BFUk1JTF0gPSBQRVJNSUw7Ci0JCW5hbWVzW0lkcy5JRF9QRVJQXSA9IFBFUlA7Ci0JCW5hbWVzW0lkcy5JRF9QSElfTF0gPSBQSElfTDsKLQkJbmFtZXNbSWRzLklEX1BISV9VXSA9IFBISV9VOwotCQluYW1lc1tJZHMuSURfUElWXSA9IFBJVjsKLQkJbmFtZXNbSWRzLklEX1BJX0xdID0gUElfTDsKLQkJbmFtZXNbSWRzLklEX1BJX1VdID0gUElfVTsKLQkJbmFtZXNbSWRzLklEX1BMVVNNTl0gPSBQTFVTTU47Ci0JCW5hbWVzW0lkcy5JRF9QT1VORF0gPSBQT1VORDsKLQkJbmFtZXNbSWRzLklEX1BSSU1FX0xdID0gUFJJTUVfTDsKLQkJbmFtZXNbSWRzLklEX1BSSU1FX1VdID0gUFJJTUVfVTsKLQkJbmFtZXNbSWRzLklEX1BST0RdID0gUFJPRDsKLQkJbmFtZXNbSWRzLklEX1BST1BdID0gUFJPUDsKLQkJbmFtZXNbSWRzLklEX1BTSV9MXSA9IFBTSV9MOwotCQluYW1lc1tJZHMuSURfUFNJX1VdID0gUFNJX1U7Ci0JCW5hbWVzW0lkcy5JRF9RVU9UXSA9IFFVT1Q7Ci0JCW5hbWVzW0lkcy5JRF9SQURJQ10gPSBSQURJQzsKLQkJbmFtZXNbSWRzLklEX1JBTkddID0gUkFORzsKLQkJbmFtZXNbSWRzLklEX1JBUVVPXSA9IFJBUVVPOwotCQluYW1lc1tJZHMuSURfUkFSUl9MXSA9IFJBUlJfTDsKLQkJbmFtZXNbSWRzLklEX1JBUlJfVV0gPSBSQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9SQ0VJTF0gPSBSQ0VJTDsKLQkJbmFtZXNbSWRzLklEX1JEUVVPXSA9IFJEUVVPOwotCQluYW1lc1tJZHMuSURfUkVBTF0gPSBSRUFMOwotCQluYW1lc1tJZHMuSURfUkVHXSA9IFJFRzsKLQkJbmFtZXNbSWRzLklEX1JGTE9PUl0gPSBSRkxPT1I7Ci0JCW5hbWVzW0lkcy5JRF9SSE9fTF0gPSBSSE9fTDsKLQkJbmFtZXNbSWRzLklEX1JIT19VXSA9IFJIT19VOwotCQluYW1lc1tJZHMuSURfUkxNXSA9IFJMTTsKLQkJbmFtZXNbSWRzLklEX1JTQVFVT10gPSBSU0FRVU87Ci0JCW5hbWVzW0lkcy5JRF9SU1FVT10gPSBSU1FVTzsKLQkJbmFtZXNbSWRzLklEX1NCUVVPXSA9IFNCUVVPOwotCQluYW1lc1tJZHMuSURfU0NBUk9OX0xdID0gU0NBUk9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9TQ0FST05fVV0gPSBTQ0FST05fVTsKLQkJbmFtZXNbSWRzLklEX1NET1RdID0gU0RPVDsKLQkJbmFtZXNbSWRzLklEX1NFQ1RdID0gU0VDVDsKLQkJbmFtZXNbSWRzLklEX1NIWV0gPSBTSFk7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQUZdID0gU0lHTUFGOwotCQluYW1lc1tJZHMuSURfU0lHTUFfTF0gPSBTSUdNQV9MOwotCQluYW1lc1tJZHMuSURfU0lHTUFfVV0gPSBTSUdNQV9VOwotCQluYW1lc1tJZHMuSURfU0lNXSA9IFNJTTsKLQkJbmFtZXNbSWRzLklEX1NQQURFU10gPSBTUEFERVM7Ci0JCW5hbWVzW0lkcy5JRF9TVUJdID0gU1VCOwotCQluYW1lc1tJZHMuSURfU1VCRV0gPSBTVUJFOwotCQluYW1lc1tJZHMuSURfU1VNXSA9IFNVTTsKLQkJbmFtZXNbSWRzLklEX1NVUF0gPSBTVVA7Ci0JCW5hbWVzW0lkcy5JRF9TVVAxXSA9IFNVUDE7Ci0JCW5hbWVzW0lkcy5JRF9TVVAyXSA9IFNVUDI7Ci0JCW5hbWVzW0lkcy5JRF9TVVAzXSA9IFNVUDM7Ci0JCW5hbWVzW0lkcy5JRF9TVVBFXSA9IFNVUEU7Ci0JCW5hbWVzW0lkcy5JRF9TWkxJR10gPSBTWkxJRzsKLQkJbmFtZXNbSWRzLklEX1RBVV9MXSA9IFRBVV9MOwotCQluYW1lc1tJZHMuSURfVEFVX1VdID0gVEFVX1U7Ci0JCW5hbWVzW0lkcy5JRF9USEVSRTRdID0gVEhFUkU0OwotCQluYW1lc1tJZHMuSURfVEhFVEFTWU1dID0gVEhFVEFTWU07Ci0JCW5hbWVzW0lkcy5JRF9USEVUQV9MXSA9IFRIRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9USEVUQV9VXSA9IFRIRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9USElOU1BdID0gVEhJTlNQOwotCQluYW1lc1tJZHMuSURfVEhPUk5fTF0gPSBUSE9STl9MOwotCQluYW1lc1tJZHMuSURfVEhPUk5fVV0gPSBUSE9STl9VOwotCQluYW1lc1tJZHMuSURfVElMREVdID0gVElMREU7Ci0JCW5hbWVzW0lkcy5JRF9USU1FU10gPSBUSU1FUzsKLQkJbmFtZXNbSWRzLklEX1RSQURFXSA9IFRSQURFOwotCQluYW1lc1tJZHMuSURfVUFDVVRFX0xdID0gVUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQUNVVEVfVV0gPSBVQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX1VBUlJfTF0gPSBVQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQVJSX1VdID0gVUFSUl9VOwotCQluYW1lc1tJZHMuSURfVUNJUkNfTF0gPSBVQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfVUNJUkNfVV0gPSBVQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfVUdSQVZFX0xdID0gVUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9VR1JBVkVfVV0gPSBVR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX1VNTF0gPSBVTUw7Ci0JCW5hbWVzW0lkcy5JRF9VUFNJSF0gPSBVUFNJSDsKLQkJbmFtZXNbSWRzLklEX1VQU0lMT05fTF0gPSBVUFNJTE9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9VUFNJTE9OX1VdID0gVVBTSUxPTl9VOwotCQluYW1lc1tJZHMuSURfVVVNTF9MXSA9IFVVTUxfTDsKLQkJbmFtZXNbSWRzLklEX1VVTUxfVV0gPSBVVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9XRUlFUlBdID0gV0VJRVJQOwotCQluYW1lc1tJZHMuSURfWElfTF0gPSBYSV9MOwotCQluYW1lc1tJZHMuSURfWElfVV0gPSBYSV9VOwotCQluYW1lc1tJZHMuSURfWUFDVVRFX0xdID0gWUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9ZQUNVVEVfVV0gPSBZQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX1lFTl0gPSBZRU47Ci0JCW5hbWVzW0lkcy5JRF9ZVU1MX0xdID0gWVVNTF9MOwotCQluYW1lc1tJZHMuSURfWVVNTF9VXSA9IFlVTUxfVTsKLQkJbmFtZXNbSWRzLklEX1pFVEFfTF0gPSBaRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9aRVRBX1VdID0gWkVUQV9VOwotCQluYW1lc1tJZHMuSURfWldKXSA9IFpXSjsKLQkJbmFtZXNbSWRzLklEX1pXTkpdID0gWldOSjsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHZhbHVlcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQl2YWx1ZXMgPSBuZXcgY2hhcltJZHMuZ2V0TnVtT2ZJZHMoKV07Ci0JCXZhbHVlc1tJZHMuSURfQUFDVVRFX0xdID0gMjI1OwotCQl2YWx1ZXNbSWRzLklEX0FBQ1VURV9VXSA9IDE5MzsKLQkJdmFsdWVzW0lkcy5JRF9BQ0lSQ19MXSA9IDIyNjsKLQkJdmFsdWVzW0lkcy5JRF9BQ0lSQ19VXSA9IDE5NDsKLQkJdmFsdWVzW0lkcy5JRF9BQ1VURV0gPSAxODA7Ci0JCXZhbHVlc1tJZHMuSURfQUVMSUdfTF0gPSAyMzA7Ci0JCXZhbHVlc1tJZHMuSURfQUVMSUdfVV0gPSAxOTg7Ci0JCXZhbHVlc1tJZHMuSURfQUdSQVZFX0xdID0gMjI0OwotCQl2YWx1ZXNbSWRzLklEX0FHUkFWRV9VXSA9IDE5MjsKLQkJdmFsdWVzW0lkcy5JRF9BTEVGU1lNXSA9IDg1MDE7Ci0JCXZhbHVlc1tJZHMuSURfQUxQSEFfTF0gPSA5NDU7Ci0JCXZhbHVlc1tJZHMuSURfQUxQSEFfVV0gPSA5MTM7Ci0JCXZhbHVlc1tJZHMuSURfQU1QXSA9IDM4OwotCQl2YWx1ZXNbSWRzLklEX0FORF0gPSA4NzQzOwotCQl2YWx1ZXNbSWRzLklEX0FOR10gPSA4NzM2OwotCQl2YWx1ZXNbSWRzLklEX0FSSU5HX0xdID0gMjI5OwotCQl2YWx1ZXNbSWRzLklEX0FSSU5HX1VdID0gMTk3OwotCQl2YWx1ZXNbSWRzLklEX0FTWU1QXSA9IDg3NzY7Ci0JCXZhbHVlc1tJZHMuSURfQVRJTERFX0xdID0gMjI3OwotCQl2YWx1ZXNbSWRzLklEX0FUSUxERV9VXSA9IDE5NTsKLQkJdmFsdWVzW0lkcy5JRF9BVU1MX0xdID0gMjI4OwotCQl2YWx1ZXNbSWRzLklEX0FVTUxfVV0gPSAxOTY7Ci0JCXZhbHVlc1tJZHMuSURfQkRRVU9dID0gODIyMjsKLQkJdmFsdWVzW0lkcy5JRF9CRVRBX0xdID0gOTQ2OwotCQl2YWx1ZXNbSWRzLklEX0JFVEFfVV0gPSA5MTQ7Ci0JCXZhbHVlc1tJZHMuSURfQlJWQkFSXSA9IDE2NjsKLQkJdmFsdWVzW0lkcy5JRF9CVUxMXSA9IDgyMjY7Ci0JCXZhbHVlc1tJZHMuSURfQ0FQXSA9IDg3NDU7Ci0JCXZhbHVlc1tJZHMuSURfQ0NFRElMX0xdID0gMjMxOwotCQl2YWx1ZXNbSWRzLklEX0NDRURJTF9VXSA9IDE5OTsKLQkJdmFsdWVzW0lkcy5JRF9DRURJTF0gPSAxODQ7Ci0JCXZhbHVlc1tJZHMuSURfQ0VOVF0gPSAxNjI7Ci0JCXZhbHVlc1tJZHMuSURfQ0hJX0xdID0gOTY3OwotCQl2YWx1ZXNbSWRzLklEX0NISV9VXSA9IDkzNTsKLQkJdmFsdWVzW0lkcy5JRF9DSVJDXSA9IDcxMDsKLQkJdmFsdWVzW0lkcy5JRF9DTFVCU10gPSA5ODI3OwotCQl2YWx1ZXNbSWRzLklEX0NPTkddID0gODc3MzsKLQkJdmFsdWVzW0lkcy5JRF9DT1BZXSA9IDE2OTsKLQkJdmFsdWVzW0lkcy5JRF9DUkFSUl0gPSA4NjI5OwotCQl2YWx1ZXNbSWRzLklEX0NVUF0gPSA4NzQ2OwotCQl2YWx1ZXNbSWRzLklEX0NVUlJFTl0gPSAxNjQ7Ci0JCXZhbHVlc1tJZHMuSURfREFHR0VSX0xdID0gODIyNDsKLQkJdmFsdWVzW0lkcy5JRF9EQUdHRVJfVV0gPSA4MjI1OwotCQl2YWx1ZXNbSWRzLklEX0RBUlJfTF0gPSA4NTk1OwotCQl2YWx1ZXNbSWRzLklEX0RBUlJfVV0gPSA4NjU5OwotCQl2YWx1ZXNbSWRzLklEX0RFR10gPSAxNzY7Ci0JCXZhbHVlc1tJZHMuSURfREVMVEFfTF0gPSA5NDg7Ci0JCXZhbHVlc1tJZHMuSURfREVMVEFfVV0gPSA5MTY7Ci0JCXZhbHVlc1tJZHMuSURfRElBTVNdID0gOTgzMDsKLQkJdmFsdWVzW0lkcy5JRF9ESVZJREVdID0gMjQ3OwotCQl2YWx1ZXNbSWRzLklEX0VBQ1VURV9MXSA9IDIzMzsKLQkJdmFsdWVzW0lkcy5JRF9FQUNVVEVfVV0gPSAyMDE7Ci0JCXZhbHVlc1tJZHMuSURfRUNJUkNfTF0gPSAyMzQ7Ci0JCXZhbHVlc1tJZHMuSURfRUNJUkNfVV0gPSAyMDI7Ci0JCXZhbHVlc1tJZHMuSURfRUdSQVZFX0xdID0gMjMyOwotCQl2YWx1ZXNbSWRzLklEX0VHUkFWRV9VXSA9IDIwMDsKLQkJdmFsdWVzW0lkcy5JRF9FTVBUWV0gPSA4NzA5OwotCQl2YWx1ZXNbSWRzLklEX0VNU1BdID0gODE5NTsKLQkJdmFsdWVzW0lkcy5JRF9FTlNQXSA9IDgxOTQ7Ci0JCXZhbHVlc1tJZHMuSURfRVBTSUxPTl9MXSA9IDk0OTsKLQkJdmFsdWVzW0lkcy5JRF9FUFNJTE9OX1VdID0gOTE3OwotCQl2YWx1ZXNbSWRzLklEX0VRVUlWXSA9IDg4MDE7Ci0JCXZhbHVlc1tJZHMuSURfRVRBX0xdID0gOTUxOwotCQl2YWx1ZXNbSWRzLklEX0VUQV9VXSA9IDkxOTsKLQkJdmFsdWVzW0lkcy5JRF9FVEhfTF0gPSAyNDA7Ci0JCXZhbHVlc1tJZHMuSURfRVRIX1VdID0gMjA4OwotCQl2YWx1ZXNbSWRzLklEX0VVTUxfTF0gPSAyMzU7Ci0JCXZhbHVlc1tJZHMuSURfRVVNTF9VXSA9IDIwMzsKLQkJdmFsdWVzW0lkcy5JRF9FVVJPXSA9IDgzNjQ7Ci0JCXZhbHVlc1tJZHMuSURfRVhJU1RdID0gODcwNzsKLQkJdmFsdWVzW0lkcy5JRF9GTk9GXSA9IDQwMjsKLQkJdmFsdWVzW0lkcy5JRF9GT1JBTExdID0gODcwNDsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMTJdID0gMTg5OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMxNF0gPSAxODg7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzM0XSA9IDE5MDsKLQkJdmFsdWVzW0lkcy5JRF9GUkFTTF0gPSA4MjYwOwotCQl2YWx1ZXNbSWRzLklEX0dBTU1BX0xdID0gOTQ3OwotCQl2YWx1ZXNbSWRzLklEX0dBTU1BX1VdID0gOTE1OwotCQl2YWx1ZXNbSWRzLklEX0dFXSA9IDg4MDU7Ci0JCXZhbHVlc1tJZHMuSURfR1RdID0gNjI7Ci0JCXZhbHVlc1tJZHMuSURfSEFSUl9MXSA9IDg1OTY7Ci0JCXZhbHVlc1tJZHMuSURfSEFSUl9VXSA9IDg2NjA7Ci0JCXZhbHVlc1tJZHMuSURfSEVBUlRTXSA9IDk4Mjk7Ci0JCXZhbHVlc1tJZHMuSURfSEVMTElQXSA9IDgyMzA7Ci0JCXZhbHVlc1tJZHMuSURfSUFDVVRFX0xdID0gMjM3OwotCQl2YWx1ZXNbSWRzLklEX0lBQ1VURV9VXSA9IDIwNTsKLQkJdmFsdWVzW0lkcy5JRF9JQ0lSQ19MXSA9IDIzODsKLQkJdmFsdWVzW0lkcy5JRF9JQ0lSQ19VXSA9IDIwNjsKLQkJdmFsdWVzW0lkcy5JRF9JRVhDTF0gPSAxNjE7Ci0JCXZhbHVlc1tJZHMuSURfSUdSQVZFX0xdID0gMjM2OwotCQl2YWx1ZXNbSWRzLklEX0lHUkFWRV9VXSA9IDIwNDsKLQkJdmFsdWVzW0lkcy5JRF9JTUFHRV0gPSA4NDY1OwotCQl2YWx1ZXNbSWRzLklEX0lORklOXSA9IDg3MzQ7Ci0JCXZhbHVlc1tJZHMuSURfSU5UXSA9IDg3NDc7Ci0JCXZhbHVlc1tJZHMuSURfSU9UQV9MXSA9IDk1MzsKLQkJdmFsdWVzW0lkcy5JRF9JT1RBX1VdID0gOTIxOwotCQl2YWx1ZXNbSWRzLklEX0lRVUVTVF0gPSAxOTE7Ci0JCXZhbHVlc1tJZHMuSURfSVNJTl0gPSA4NzEyOwotCQl2YWx1ZXNbSWRzLklEX0lVTUxfTF0gPSAyMzk7Ci0JCXZhbHVlc1tJZHMuSURfSVVNTF9VXSA9IDIwNzsKLQkJdmFsdWVzW0lkcy5JRF9LQVBQQV9MXSA9IDk1NDsKLQkJdmFsdWVzW0lkcy5JRF9LQVBQQV9VXSA9IDkyMjsKLQkJdmFsdWVzW0lkcy5JRF9MQU1CREFfTF0gPSA5NTU7Ci0JCXZhbHVlc1tJZHMuSURfTEFNQkRBX1VdID0gOTIzOwotCQl2YWx1ZXNbSWRzLklEX0xBTkddID0gOTAwMTsKLQkJdmFsdWVzW0lkcy5JRF9MQVFVT10gPSAxNzE7Ci0JCXZhbHVlc1tJZHMuSURfTEFSUl9MXSA9IDg1OTI7Ci0JCXZhbHVlc1tJZHMuSURfTEFSUl9VXSA9IDg2NTY7Ci0JCXZhbHVlc1tJZHMuSURfTENFSUxdID0gODk2ODsKLQkJdmFsdWVzW0lkcy5JRF9MRFFVT10gPSA4MjIwOwotCQl2YWx1ZXNbSWRzLklEX0xFXSA9IDg4MDQ7Ci0JCXZhbHVlc1tJZHMuSURfTEZMT09SXSA9IDg5NzA7Ci0JCXZhbHVlc1tJZHMuSURfTE9XQVNUXSA9IDg3Mjc7Ci0JCXZhbHVlc1tJZHMuSURfTE9aXSA9IDk2NzQ7Ci0JCXZhbHVlc1tJZHMuSURfTFJNXSA9IDgyMDY7Ci0JCXZhbHVlc1tJZHMuSURfTFNBUVVPXSA9IDgyNDk7Ci0JCXZhbHVlc1tJZHMuSURfTFNRVU9dID0gODIxNjsKLQkJdmFsdWVzW0lkcy5JRF9MVF0gPSA2MDsKLQkJdmFsdWVzW0lkcy5JRF9NQUNSXSA9IDE3NTsKLQkJdmFsdWVzW0lkcy5JRF9NREFTSF0gPSA4MjEyOwotCQl2YWx1ZXNbSWRzLklEX01JQ1JPXSA9IDE4MTsKLQkJdmFsdWVzW0lkcy5JRF9NSURET1RdID0gMTgzOwotCQl2YWx1ZXNbSWRzLklEX01JTlVTXSA9IDg3MjI7Ci0JCXZhbHVlc1tJZHMuSURfTVVfTF0gPSA5NTY7Ci0JCXZhbHVlc1tJZHMuSURfTVVfVV0gPSA5MjQ7Ci0JCXZhbHVlc1tJZHMuSURfTkFCTEFdID0gODcxMTsKLQkJdmFsdWVzW0lkcy5JRF9OQlNQXSA9IDE2MDsKLQkJdmFsdWVzW0lkcy5JRF9OREFTSF0gPSA4MjExOwotCQl2YWx1ZXNbSWRzLklEX05FXSA9IDg4MDA7Ci0JCXZhbHVlc1tJZHMuSURfTkldID0gODcxNTsKLQkJdmFsdWVzW0lkcy5JRF9OT1RdID0gMTcyOwotCQl2YWx1ZXNbSWRzLklEX05PVElOXSA9IDg3MTM7Ci0JCXZhbHVlc1tJZHMuSURfTlNVQl0gPSA4ODM2OwotCQl2YWx1ZXNbSWRzLklEX05USUxERV9MXSA9IDI0MTsKLQkJdmFsdWVzW0lkcy5JRF9OVElMREVfVV0gPSAyMDk7Ci0JCXZhbHVlc1tJZHMuSURfTlVfTF0gPSA5NTc7Ci0JCXZhbHVlc1tJZHMuSURfTlVfVV0gPSA5MjU7Ci0JCXZhbHVlc1tJZHMuSURfT0FDVVRFX0xdID0gMjQzOwotCQl2YWx1ZXNbSWRzLklEX09BQ1VURV9VXSA9IDIxMTsKLQkJdmFsdWVzW0lkcy5JRF9PQ0lSQ19MXSA9IDI0NDsKLQkJdmFsdWVzW0lkcy5JRF9PQ0lSQ19VXSA9IDIxMjsKLQkJdmFsdWVzW0lkcy5JRF9PRUxJR19MXSA9IDMzOTsKLQkJdmFsdWVzW0lkcy5JRF9PRUxJR19VXSA9IDMzODsKLQkJdmFsdWVzW0lkcy5JRF9PR1JBVkVfTF0gPSAyNDI7Ci0JCXZhbHVlc1tJZHMuSURfT0dSQVZFX1VdID0gMjEwOwotCQl2YWx1ZXNbSWRzLklEX09MSU5FXSA9IDgyNTQ7Ci0JCXZhbHVlc1tJZHMuSURfT01FR0FfTF0gPSA5Njk7Ci0JCXZhbHVlc1tJZHMuSURfT01FR0FfVV0gPSA5Mzc7Ci0JCXZhbHVlc1tJZHMuSURfT01JQ1JPTl9MXSA9IDk1OTsKLQkJdmFsdWVzW0lkcy5JRF9PTUlDUk9OX1VdID0gOTI3OwotCQl2YWx1ZXNbSWRzLklEX09QTFVTXSA9IDg4NTM7Ci0JCXZhbHVlc1tJZHMuSURfT1JdID0gODc0NDsKLQkJdmFsdWVzW0lkcy5JRF9PUkRGXSA9IDE3MDsKLQkJdmFsdWVzW0lkcy5JRF9PUkRNXSA9IDE4NjsKLQkJdmFsdWVzW0lkcy5JRF9PU0xBU0hfTF0gPSAyNDg7Ci0JCXZhbHVlc1tJZHMuSURfT1NMQVNIX1VdID0gMjE2OwotCQl2YWx1ZXNbSWRzLklEX09USUxERV9MXSA9IDI0NTsKLQkJdmFsdWVzW0lkcy5JRF9PVElMREVfVV0gPSAyMTM7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTUVTXSA9IDg4NTU7Ci0JCXZhbHVlc1tJZHMuSURfT1VNTF9MXSA9IDI0NjsKLQkJdmFsdWVzW0lkcy5JRF9PVU1MX1VdID0gMjE0OwotCQl2YWx1ZXNbSWRzLklEX1BBUkFdID0gMTgyOwotCQl2YWx1ZXNbSWRzLklEX1BBUlRdID0gODcwNjsKLQkJdmFsdWVzW0lkcy5JRF9QRVJNSUxdID0gODI0MDsKLQkJdmFsdWVzW0lkcy5JRF9QRVJQXSA9IDg4Njk7Ci0JCXZhbHVlc1tJZHMuSURfUEhJX0xdID0gOTY2OwotCQl2YWx1ZXNbSWRzLklEX1BISV9VXSA9IDkzNDsKLQkJdmFsdWVzW0lkcy5JRF9QSVZdID0gOTgyOwotCQl2YWx1ZXNbSWRzLklEX1BJX0xdID0gOTYwOwotCQl2YWx1ZXNbSWRzLklEX1BJX1VdID0gOTI4OwotCQl2YWx1ZXNbSWRzLklEX1BMVVNNTl0gPSAxNzc7Ci0JCXZhbHVlc1tJZHMuSURfUE9VTkRdID0gMTYzOwotCQl2YWx1ZXNbSWRzLklEX1BSSU1FX0xdID0gODI0MjsKLQkJdmFsdWVzW0lkcy5JRF9QUklNRV9VXSA9IDgyNDM7Ci0JCXZhbHVlc1tJZHMuSURfUFJPRF0gPSA4NzE5OwotCQl2YWx1ZXNbSWRzLklEX1BST1BdID0gODczMzsKLQkJdmFsdWVzW0lkcy5JRF9QU0lfTF0gPSA5Njg7Ci0JCXZhbHVlc1tJZHMuSURfUFNJX1VdID0gOTM2OwotCQl2YWx1ZXNbSWRzLklEX1FVT1RdID0gMzQ7Ci0JCXZhbHVlc1tJZHMuSURfUkFESUNdID0gODczMDsKLQkJdmFsdWVzW0lkcy5JRF9SQU5HXSA9IDkwMDI7Ci0JCXZhbHVlc1tJZHMuSURfUkFRVU9dID0gMTg3OwotCQl2YWx1ZXNbSWRzLklEX1JBUlJfTF0gPSA4NTk0OwotCQl2YWx1ZXNbSWRzLklEX1JBUlJfVV0gPSA4NjU4OwotCQl2YWx1ZXNbSWRzLklEX1JDRUlMXSA9IDg5Njk7Ci0JCXZhbHVlc1tJZHMuSURfUkRRVU9dID0gODIyMTsKLQkJdmFsdWVzW0lkcy5JRF9SRUFMXSA9IDg0NzY7Ci0JCXZhbHVlc1tJZHMuSURfUkVHXSA9IDE3NDsKLQkJdmFsdWVzW0lkcy5JRF9SRkxPT1JdID0gODk3MTsKLQkJdmFsdWVzW0lkcy5JRF9SSE9fTF0gPSA5NjE7Ci0JCXZhbHVlc1tJZHMuSURfUkhPX1VdID0gOTI5OwotCQl2YWx1ZXNbSWRzLklEX1JMTV0gPSA4MjA3OwotCQl2YWx1ZXNbSWRzLklEX1JTQVFVT10gPSA4MjUwOwotCQl2YWx1ZXNbSWRzLklEX1JTUVVPXSA9IDgyMTc7Ci0JCXZhbHVlc1tJZHMuSURfU0JRVU9dID0gODIxODsKLQkJdmFsdWVzW0lkcy5JRF9TQ0FST05fTF0gPSAzNTM7Ci0JCXZhbHVlc1tJZHMuSURfU0NBUk9OX1VdID0gMzUyOwotCQl2YWx1ZXNbSWRzLklEX1NET1RdID0gODkwMTsKLQkJdmFsdWVzW0lkcy5JRF9TRUNUXSA9IDE2NzsKLQkJdmFsdWVzW0lkcy5JRF9TSFldID0gMTczOwotCQl2YWx1ZXNbSWRzLklEX1NJR01BRl0gPSA5NjI7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFfTF0gPSA5NjM7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFfVV0gPSA5MzE7Ci0JCXZhbHVlc1tJZHMuSURfU0lNXSA9IDg3NjQ7Ci0JCXZhbHVlc1tJZHMuSURfU1BBREVTXSA9IDk4MjQ7Ci0JCXZhbHVlc1tJZHMuSURfU1VCXSA9IDg4MzQ7Ci0JCXZhbHVlc1tJZHMuSURfU1VCRV0gPSA4ODM4OwotCQl2YWx1ZXNbSWRzLklEX1NVTV0gPSA4NzIxOwotCQl2YWx1ZXNbSWRzLklEX1NVUF0gPSA4ODM1OwotCQl2YWx1ZXNbSWRzLklEX1NVUDFdID0gMTg1OwotCQl2YWx1ZXNbSWRzLklEX1NVUDJdID0gMTc4OwotCQl2YWx1ZXNbSWRzLklEX1NVUDNdID0gMTc5OwotCQl2YWx1ZXNbSWRzLklEX1NVUEVdID0gODgzOTsKLQkJdmFsdWVzW0lkcy5JRF9TWkxJR10gPSAyMjM7Ci0JCXZhbHVlc1tJZHMuSURfVEFVX0xdID0gOTY0OwotCQl2YWx1ZXNbSWRzLklEX1RBVV9VXSA9IDkzMjsKLQkJdmFsdWVzW0lkcy5JRF9USEVSRTRdID0gODc1NjsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQVNZTV0gPSA5Nzc7Ci0JCXZhbHVlc1tJZHMuSURfVEhFVEFfTF0gPSA5NTI7Ci0JCXZhbHVlc1tJZHMuSURfVEhFVEFfVV0gPSA5MjA7Ci0JCXZhbHVlc1tJZHMuSURfVEhJTlNQXSA9IDgyMDE7Ci0JCXZhbHVlc1tJZHMuSURfVEhPUk5fTF0gPSAyNTQ7Ci0JCXZhbHVlc1tJZHMuSURfVEhPUk5fVV0gPSAyMjI7Ci0JCXZhbHVlc1tJZHMuSURfVElMREVdID0gNzMyOwotCQl2YWx1ZXNbSWRzLklEX1RJTUVTXSA9IDIxNTsKLQkJdmFsdWVzW0lkcy5JRF9UUkFERV0gPSA4NDgyOwotCQl2YWx1ZXNbSWRzLklEX1VBQ1VURV9MXSA9IDI1MDsKLQkJdmFsdWVzW0lkcy5JRF9VQUNVVEVfVV0gPSAyMTg7Ci0JCXZhbHVlc1tJZHMuSURfVUFSUl9MXSA9IDg1OTM7Ci0JCXZhbHVlc1tJZHMuSURfVUFSUl9VXSA9IDg2NTc7Ci0JCXZhbHVlc1tJZHMuSURfVUNJUkNfTF0gPSAyNTE7Ci0JCXZhbHVlc1tJZHMuSURfVUNJUkNfVV0gPSAyMTk7Ci0JCXZhbHVlc1tJZHMuSURfVUdSQVZFX0xdID0gMjQ5OwotCQl2YWx1ZXNbSWRzLklEX1VHUkFWRV9VXSA9IDIxNzsKLQkJdmFsdWVzW0lkcy5JRF9VTUxdID0gMTY4OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lIXSA9IDk3ODsKLQkJdmFsdWVzW0lkcy5JRF9VUFNJTE9OX0xdID0gOTY1OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lMT05fVV0gPSA5MzM7Ci0JCXZhbHVlc1tJZHMuSURfVVVNTF9MXSA9IDI1MjsKLQkJdmFsdWVzW0lkcy5JRF9VVU1MX1VdID0gMjIwOwotCQl2YWx1ZXNbSWRzLklEX1dFSUVSUF0gPSA4NDcyOwotCQl2YWx1ZXNbSWRzLklEX1hJX0xdID0gOTU4OwotCQl2YWx1ZXNbSWRzLklEX1hJX1VdID0gOTI2OwotCQl2YWx1ZXNbSWRzLklEX1lBQ1VURV9MXSA9IDI1MzsKLQkJdmFsdWVzW0lkcy5JRF9ZQUNVVEVfVV0gPSAyMjE7Ci0JCXZhbHVlc1tJZHMuSURfWUVOXSA9IDE2NTsKLQkJdmFsdWVzW0lkcy5JRF9ZVU1MX0xdID0gMjU1OwotCQl2YWx1ZXNbSWRzLklEX1lVTUxfVV0gPSAzNzY7Ci0JCXZhbHVlc1tJZHMuSURfWkVUQV9MXSA9IDk1MDsKLQkJdmFsdWVzW0lkcy5JRF9aRVRBX1VdID0gOTE4OwotCQl2YWx1ZXNbSWRzLklEX1pXSl0gPSA4MjA1OwotCQl2YWx1ZXNbSWRzLklEX1pXTkpdID0gODIwNDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRW50aXR5Q29sbGVjdGlvbigpIHsKLQkJc3VwZXIobmFtZXMsIFNUUklDVF9DQVNFKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gZW50aXR5IGRlY2xhcmF0aW9uLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWludCBpZCA9IGdldElEKGVudGl0eU5hbWUpOwotCQlpZiAoaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHZhbHVlc1tpZF0pOwotCQlIVE1MRW50aXR5RGVjbEltcGwgZGVjID0gbmV3IEhUTUxFbnRpdHlEZWNsSW1wbChlbnRpdHlOYW1lLCB2YWx1ZSk7Ci0KLQkJcmV0dXJuIGRlYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxBdHRyRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGFiMmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gY2xhc3Mgb2Yge0BsaW5rIDxjb2RlPkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjwvY29kZT59IGludGVyZmFjZS48YnI+Ci0gKi8KLWNsYXNzIEhUTUxBdHRyRGVjbEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgSFRNTENNRGF0YVR5cGVJbXBsIHR5cGUgPSBudWxsOwotCXByaXZhdGUgaW50IHVzYWdlID0gMDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MQXR0ckRlY2xJbXBsKFN0cmluZyBhdHRyTmFtZSwgSFRNTENNRGF0YVR5cGVJbXBsIHZhbHVlVHlwZSwgaW50IHZhbHVlVXNhZ2UpIHsKLQkJc3VwZXIoYXR0ck5hbWUpOwotCQl0aGlzLnR5cGUgPSB2YWx1ZVR5cGU7Ci0KLQkJc3dpdGNoICh2YWx1ZVVzYWdlKSB7Ci0JCQljYXNlIE9QVElPTkFMIDoKLQkJCWNhc2UgUkVRVUlSRUQgOgotCQkJY2FzZSBGSVhFRCA6Ci0JCQljYXNlIFBST0hJQklURUQgOgotCQkJCXRoaXMudXNhZ2UgPSB2YWx1ZVVzYWdlOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gc2hvdWxkIHdhcm4uLi4KLQkJCQl0aGlzLnVzYWdlID0gT1BUSU9OQUw7IC8vIGZhbGwgYmFjawotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0ck5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0clR5cGUgbWV0aG9kCi0JICogQHJldHVybiBDTURhdGFUeXBlCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJaWYgKHR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxUKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0eXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCVZlY3RvciB2ID0gbmV3IFZlY3RvcihBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpKSk7Ci0JCXJldHVybiB2LmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIEdST1VQLCBFTlRJVFlfREVDTEFSQVRJT04uCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT047Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQlyZXR1cm4gdXNhZ2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTENNRGF0YVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzY2ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0KLS8qKgotICovCi1jbGFzcyBIVE1MQ01EYXRhVHlwZUltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTENNRGF0YVR5cGUgewotCi0JcHJpdmF0ZSBpbnQgaW1wbGllZFZhbHVlS2luZCA9IElNUExJRURfVkFMVUVfTk9ORTsKLQlwcml2YXRlIFN0cmluZyBpbXBsaWVkVmFsdWUgPSBudWxsOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGVtcHR5QXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotCXByaXZhdGUgU3RyaW5nW10gZW51bVZhbHVlcyA9IGVtcHR5QXJyYXk7Ci0JcHJpdmF0ZSBTdHJpbmcgaW5zdGFuY2VWYWx1ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBIVE1MQ01EYXRhVHlwZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbm0gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MQ01EYXRhVHlwZUltcGwoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXN1cGVyKHR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MQ01EYXRhVHlwZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbm0gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MQ01EYXRhVHlwZUltcGwoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgaW5zdGFuY2VWYWx1ZSkgewotCQlzdXBlcih0eXBlTmFtZSk7Ci0JCXRoaXMuaW5zdGFuY2VWYWx1ZSA9IGluc3RhbmNlVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICoKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGRhdGEgdHlwZSBpcyBjcmVhdGVkLgotCSAqIFRoaXMgcmV0dXJucyBudWxsIG9mIGEgc3VpdGFibGUgZGVmYXVsdCBpcyBub3QgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKSB7Ci0JCXJldHVybiBlbnVtVmFsdWVzOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyAgCi0JICoKLQkgKiBSZXR1cm5zIHRoZSBpbXBsaWVkIHZhbHVlIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKSB7Ci0JCXJldHVybiBpbXBsaWVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0SW1wbGllZFZhbHVlS2luZCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCwgSU1QTElFRF9WQUxVRV9ERUZBVUxULgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpIHsKLQkJcmV0dXJuIGltcGxpZWRWYWx1ZUtpbmQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RW51bVZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJZW51bVZhbHVlcyA9IG5ldyBTdHJpbmdbdmFsdWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQllbnVtVmFsdWVzW2ldID0gdmFsdWVzW2ldOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcGFja2FnZSBzY29wZS4KLQkgKi8KLQl2b2lkIHNldEltcGxpZWRWYWx1ZShpbnQga2luZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX0ZJWEVEIDoKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9ERUZBVUxUIDoKLQkJCQlpbXBsaWVkVmFsdWVLaW5kID0ga2luZDsKLQkJCQlpbXBsaWVkVmFsdWUgPSB2YWx1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9OT05FIDoKLQkJCWRlZmF1bHQgOgotCQkJCWltcGxpZWRWYWx1ZUtpbmQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JCQkJaW1wbGllZFZhbHVlID0gbnVsbDsgLy8gbWF5YmUgYSBudWxsIHN0cmluZz8KLQkJCQlicmVhazsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTENNTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTRiMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotLyoqCi0gKiBJbiBIVE1MIERvY3VtZW50cywgbmFtZSBhbmQgdmFsdWUgb2YgYW4gYXR0cmlidXRlL2VsZW1lbnQvZW50aXR5Ci0gKiBzaG91bGQgYmUgdHJlYXRlZCBpZ25vcmluZyB0aGVpcnMgY2FzZS4gIEhvd2V2ZXIsIGluIFhNTCBkb2N1bWVudHMsCi0gKiB0aGV5IHNob3VsZCBiZSBkaXN0aW5ndWlzaGVkIHdpdGggc2Vuc2l0aXZlbmVzcyBvZiB0aGVpciBjYXNlLgotICogQ01Ob2RlIGlzIGJhc2ljYWxseSBkZXNpZ25lZCB0byByZXByZXNlbnQgRFREcyBvciBTY2hlbWFzIGZvciBYTUwKLSAqIGRvY3VtZW50cy4gIFNvLCBpdCBkb2Vzbid0IGhhdmUgaW50ZXJmYWNlcyB0byByZXRyaWV2ZSBzdWNoIGluZm9ybWF0aW9uLgotICogSG93ZXZlciwgZGVjbGFyYXRpb25zIGluIHRoZSBIVE1MIENNIHNob3VsZCBwcm92aWRlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBUaGlzIGludGVybWVkaWF0ZSBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSB3aGV0aGVyIGlnbm9yZSBjYXNlcwotICogb3Igbm90Ljxicj4KLSAqLwotaW50ZXJmYWNlIEhUTUxDTU5vZGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCBpZiBkZWNsYXJhdGlvbiBpcyBmb3IgSFRNTCBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkuCi0JICogT3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHNob3VsZElnbm9yZUNhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MRWxlbURlY2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMDM1MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MRWxlbURlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCBIZWQ/Pz8/IGNsYXNzZXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhUTUxFbGVtRGVjbEltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiwgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gewotCi0JLy8gRFRECi0JcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBhdHRyaWJ1dGVzID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFk7Ci0JLyoqIE5ldmVyIGFjY2VzcyB0aGlzIGZpZWxkIGRpcmVjdGx5LiAgSW5zdGVhZCwgdXNlIGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbiBtZXRob2QuICovCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSBudWxsOwotCXByb3RlY3RlZCBDTUdyb3VwSW1wbCBpbmNsdXNpb24gPSBudWxsOwotCXByb3RlY3RlZCBDTUdyb3VwSW1wbCBleGNsdXNpb24gPSBudWxsOwotCS8vIGFkdmFuY2VkIGluZm9ybWF0aW9uCi0JcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwIHByb2hpYml0ZWRBbmNlc3RvcnMgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX05PTkU7Ci0JcHJvdGVjdGVkIGludCBmb3JtYXRUeXBlID0gRk9STUFUX0hUTUw7Ci0JcHJvdGVjdGVkIGludCBsYXlvdXRUeXBlID0gTEFZT1VUX05PTkU7Ci0JcHJvdGVjdGVkIGludCBvbWl0VHlwZSA9IE9NSVRfTk9ORTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBrZWVwU3BhY2VzID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5kZW50Q2hpbGQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBBdHRyaWJ1dGVDb2xsZWN0aW9uIGF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgQ01OYW1lZE5vZGVNYXAgRU1QVFlfTUFQID0gbmV3IENNTmFtZWROb2RlTWFwKCkgewotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEhUTUxFbGVtRGVjbEltcGwgY29uc3RydWN0b3IuCi0JICogSW4gdGhlIEhUTUwgRFRELCBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIGhhcyBubyBzcGVjaWZpY2F0aW9uCi0JICogZm9yIGl0cyBvY2N1cnJlbmNlLiAgT2NjdXJyZW5jZSBpcyBzcGVjaWZlZCBpbiBjb250ZW50IG1vZGVsLCBsaWtlCi0JICogPGNvZGU+KExJKSs8L2NvZGU+LiAgVG8gYXZvaWQgY29uZnVzaW9uIChhbmQgY29tcGxleGl0eSksCi0JICogb2NjdXJyZW5jZSBvZiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGFsd2F5cyAxIChpdCBtZWFucywgbWluID0gMSBhbmQKLQkgKiBtYXggPSAxKS4gIEluc3RlYWQsIG9jY3VycmVuY2Ugb2YgQ01Hcm91cCByZXByZXNlbnRzIGFjdHVhbCBvY2N1cnJlbmNlCi0JICogb2YgdGhlIGNvbnRlbnQuCi0JICogPGJyPgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1EZWNsSW1wbChTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIDEsIDEpOwotCQllbGVtZW50Q29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uLmdldEF0dHJpYnV0ZUNvbGxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsKLQotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uIGNyZWF0ZUNvbXBsZXhUeXBlRGVmaW5pdGlvbigpIHsKLQkJaWYgKHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9DREFUQSkgfHwgdHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZKSB8fCB0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUENEQVRBKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgZmFjdG9yeSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYXRhbCBlcnJvci4KLQotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZmFjdG9yeS5jcmVhdGVUeXBlRGVmaW5pdGlvbih0eXBlRGVmaW5pdGlvbk5hbWUsIGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcmV0dXJuIGRlZjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotCQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsgLy8gZmFpbCB0byBjcmVhdGUKLQkJfQotCi0JCUNNTm9kZSBjbW5vZGUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCWlmIChjbW5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gKEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21ub2RlOyAvLyBhbHJlYWR5IGV4aXN0cy4KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7IC8vIGxhenkgZXZhbC4KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFuIGluc3RhbmNlIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uIGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpIHsKLQkJaWYgKHR5cGVEZWZpbml0aW9uID09IG51bGwpCi0JCQl0eXBlRGVmaW5pdGlvbiA9IGNyZWF0ZUNvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotCQlyZXR1cm4gdHlwZURlZmluaXRpb247Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogRWxlbWVudCBkZWNsYXJhdGlvbnMgd2hpY2ggdHlwZSBpcyBFTVBUWSBvciBDREFUQSAobWF5YmUgUENEQVRBKQotCSAqIDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgYWx3YXlzIHJldHVybiBudWxsLgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdHJpZXMgdG8gY3JlYXRlIGEgY29tcGxleCB0eXBlIGRlZmluaXRpb24KLQkgKiBpbnN0YW5jZSBhbmQgYWNjZXNzIHRvIGl0LgotCSAqIDxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gKGRlZiAhPSBudWxsKSA/IGRlZi5nZXRDb250ZW50KCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgdHlwZS48YnI+Ci0JICogRWxlbWVudCBkZWNsYXJhdGlvbnMgd2hpY2ggdHlwZSBpcyBFTVBUWSBvciBDREFUQSAobWF5YmUgUENEQVRBKQotCSAqIDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIHR5cGUuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyB0cmllcyB0byBjcmVhdGUgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotCSAqIGluc3RhbmNlIGFuZCBhY2Nlc3MgdG8gaXQuCi0JICogPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gKGRlZiAhPSBudWxsKSA/IGRlZi5nZXRDb250ZW50VHlwZSgpIDogQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uI2dldENvcnJlY3Rpb25UeXBlCi0JICovCi0JcHVibGljIGludCBnZXRDb3JyZWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGNvcnJlY3Rpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIEhUTUwgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGRhdGEgdHlwZS4gIFNvLCB0aGlzIG1ldGhvZCBhbHdheXMKLQkgKiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+Ljxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIEFsbW9zdCBlbGVtZW50cyBkb24ndCBoYXZlIGEgZXhjbHVzaW9uLgotCSAqIE9ubHkgY2xhc3NlcyB0aG9zZSBoYXZlIGV4Y2x1c2lvbiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgZm9ybWF0IHR5cGUgaXMgPGNvZGU+Rk9STUFUX0hUTUw8L2NvZGU+Ljxicj4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEZvcm1hdFR5cGUoKSB7Ci0JCXJldHVybiBmb3JtYXRUeXBlOwotCX0KLQotCS8qKgotCSAqIEluY2x1c2lvbi4KLQkgKiBBbG1vc3QgZWxlbWVudHMgZG9uJ3QgaGF2ZSBhIGluY2x1c2lvbi4KLQkgKiBPbmx5IGNsYXNzZXMgdGhvc2UgaGF2ZSBpbmNsdXNpb24gc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0SW5jbHVzaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldExheW91dFR5cGUoKSB7Ci0JCXJldHVybiBsYXlvdXRUeXBlOwotCX0KLQotCS8qKgotCSAqIExpbmUgYnJlYWsgaGludCBpcyBzdHJvbmdseSByZWxhdGVkIHRvIGxheW91dCB0eXBlLgotCSAqIEluZGVlZCwgaW4gdGhlIEMrK0RPTSwgaXQgaXMgZGV0ZXJtaW5lZCBmcm9tIGxheW91dCB0eXBlIG9ubHkuCi0JICogU28sIHRoaXMgaW1wbGVtZW50YXRpb24sIGFzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBhbGwgZGVjbGFyYXRpb25zLAotCSAqIGFsc28gZGV0ZXJtaW5lcyBmcm9tIGxheW91dCB0eXBlIG9ubHkuPGJyPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMaW5lQnJlYWtIaW50KCkgewotCQlzd2l0Y2ggKGdldExheW91dFR5cGUoKSkgewotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CTE9DSyA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JSRUFLIDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19BRlRFUl9TVEFSVDsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOIDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORDsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX05PTkU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBObyBIVE1MIGVsZW1lbnQgaGFzIGxvY2FsIGVsZW1lbnRzLiAgU28sIHRoaXMgbWV0aG9kIGFsd2F5cwotCSAqIHJldHVybnMgYW4gZW1wdHkgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQlyZXR1cm4gRU1QVFlfTUFQOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT047Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPbWl0VHlwZSgpIHsKLQkJcmV0dXJuIG9taXRUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlyZXR1cm4gRU1QVFlfTUFQOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotCQkJcmV0dXJuIChkZWYgIT0gbnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBwcC5zdXBwb3J0cyh0aGlzKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKGRlZiAhPSBudWxsKSA/IGRlZi5nZXRQcmltYXJ5Q2FuZGlkYXRlKCkgOiBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAocHAgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBwcC5nZXQodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZWxlbWVudCBuYW1lcyB3aGljaCB0ZXJtaW5hdGVzIHRoaXMgZWxlbWVudC48YnI+Ci0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0cnVlIHdoZW4gdGhlIGVsZW1lbnQgaXMgYSBKU1AgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0pTUCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluIHNvbWUgZWxlbWVudHMsIHN1Y2ggYXMgQVBQTEVULCBhIHNvdXJjZSBnZW5lcmF0b3Igc2hvdWxkIGluZGVudCBjaGlsZAotCSAqIGVsZW1lbnRzIHRoYXQgdGhlaXIgcGFyZW50cy4gIFRoYXQgaXMsIGEgc291cmNlIGdlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUKLQkgKiBzb3VyY2UgIG9mIEFQUExFVCBhbmQgUEFSQU1TIGxpa2UgdGhpczoKLQkgKiA8UFJFPgotCSAqICAgJmx0O0FQUExFVCAuLi4mZ3Q7Ci0JICogICAgICZsdDtQQVJBTSAuLi4gJmd0OwotCSAqICAgICAmbHQ7UEFSQU0gLi4uICZndDsKLQkgKiAgICZsdDsvQVBQTEVUJmd0OwotCSAqIDxQUkU+Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSB7Ci0JCXJldHVybiBpbmRlbnRDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBNb3N0IG9mIGVsZW1lbnRzIGNhbiBjb21wYWN0IHNwYWNlcyBpbiB0aGVpciBjaGlsZCB0ZXh0IG5vZGVzLgotCSAqIFNvbWUgc3BlY2lhbCBlbGVtZW50cyBzaG91bGQga2VlcCB0aGVtIGluIHRoZWlyIHNvdXJjZS4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRLZWVwU3BhY2VzKCkgewotCQlyZXR1cm4ga2VlcFNwYWNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRUZXJtaW5hdGVBdChIVE1MRWxlbWVudERlY2xhcmF0aW9uIG5leHRFbGVtZW50KSB7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRUZXJtaW5hdG9ycygpOwotCQlpZiAoaSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbmV4dE5hbWUgPSBuZXh0RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWlmIChuZXh0TmFtZS5lcXVhbHMoaS5uZXh0KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MRW50aXR5RGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0N2IwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVudGl0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0KLS8qKgotICovCi1jbGFzcyBIVE1MRW50aXR5RGVjbEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTEVudGl0eURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUVudGl0eURlY2xJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIGVudGl0eU5hbWUgamF2YS5sYW5nLlN0cmluZzsgRW50aXR5IG5hbWUuCi0JICogQHBhcmFtIGVudGl0eVZhbHVlIGphdmEubGFuZy5TdHJpbmc7IFZhbHVlIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xJbXBsKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgZW50aXR5VmFsdWUpIHsKLQkJc3VwZXIoZW50aXR5TmFtZSk7Ci0JCXZhbHVlID0gZW50aXR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCBDTU5vZGUgdHlwZS48YnI+Ci0JICogQHJldHVybiBpbnQ7IEFsd2F5cyByZXR1cm4gRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRU5USVRZX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRpdGllcyBpbiBIVE1MIGRvY3VtZW50cyBhcmUgYWx3YXlzIHRyZWF0ZWQgd2l0aCBpZ25vcmluZyBjYXNlcy4KLQkgKiBCZWNhdXNlIG5vIHNwZWNpYWwgZW50aXRpZXMgYXJlIGRlZmluZWQgaW4gSlNQIDEuMCwgdGhpcyBtZXRob2QKLQkgKiBjYW4gYWx3YXlzIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi48YnI+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwM2MzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqIChocmVmbGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkgKiAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKGRpcmVjdGtleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoc2hhcGUgJVNoYXBlOyByZWN0KQotCSAqIChjb29yZHMgJUNvb3JkczsgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPkE8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPkE8L2NvZGU+IGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBhID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEpOwotCQlpZiAoYSAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGEpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5BLH07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQUREUkVTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBRERSRVNTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTcyZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBRERSRVNTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBBRERSRVNTLgotICovCi1maW5hbCBjbGFzcyBIZWRBRERSRVNTIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQUREUkVTUyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1MsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0FERFJFU1M7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJBU0UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkFTRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzNhYmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkFTRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogQkFTRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkFTRSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCQVNFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9ISURERU4uCi0JCS8vIEJlY2F1c2UsIEJBU0UgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogQkFTRS4KLQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRix9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJMT0NLUVVPVEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkxPQ0tRVU9URS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWVmOTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkxPQ0tRVU9URS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQkxPQ0tRVU9URS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkxPQ0tRVU9URSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJMT0NLUVVPVEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoY2l0ZSAlVVJJOyAjSU1QTElFRCkgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJPRFkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQk9EWS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDgzYzU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQk9EWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEJPRFkuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJPRFkgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFksIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUx9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJPRFkoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVib2R5Y29sb3JzOwotCSAqIChvbmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9udW5sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChiYWNrZ3JvdW5kICVVUkk7ICNJTVBMSUVEKQotCSAqIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKSAuLiBEMjA1NTE0Ci0JICogKHRvcG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4uLi4gRDIwNTUxNAotCSAqIChib3R0b21tYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAobGVmdG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4uLiBEMjA1NTE0Ci0JICogKHJpZ2h0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlYm9keWNvbG9yczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRCb2R5Y29sb3JzKGF0dHJpYnV0ZXMpOwotCi0JfQotCi0JLyoqCi0JICogQk9EWSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQlIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjMTZmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIEJSLgotICovCi1maW5hbCBjbGFzcyBIZWRCUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJSLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0JSRUFLLgotCQkvLyBCZWNhdXNlLCBCUiBpcyBHUk9VUF9CUkVBSyBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfQlJFQUs7Ci0JfQotCi0JLyoqCi0JICogQlIuCi0JICogJWNvcmVhdHRyczsKLQkgKiAoY2xlYXIgKGxlZnQgfCBhbGwgfCByaWdodCB8IG5vbmUpIG5vbmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vIGNsZWFyCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVIpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NMRUFSLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZENFTlRFUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRDRU5URVIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5MzkzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZENFTlRFUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQ0VOVEVSLgotICovCi1maW5hbCBjbGFzcyBIZWRDRU5URVIgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRDRU5URVIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVIsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3MGUyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogREQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEREIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEREKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogREQgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERJVi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRESVYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyZDc5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERJVi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogRElWLgotICovCi1maW5hbCBjbGFzcyBIZWRESVYgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRESVYoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVYsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlYWxpZ247Ci0JICogJXJlc2VydmVkOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlYWxpZ247Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JCS8vICVyZXNlcnZlZDsgLi4uIGVtcHR5Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDZiYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogREwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERMIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfREVGSU5JVElPTl9MSVNUOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXJyYXlzOwotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzZDg3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogRFQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERUIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRFQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEVCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRW1wdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRW1wdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkZTZlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEVtcHR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBFTVBUWSB0eXBlIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRFbXB0eSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEVtcHR5KFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFk7Ci0JCS8vIEVNUFRZIHR5cGUgaGFzIG5vIGVuZCB0YWcuCi0JCW9taXRUeXBlID0gT01JVF9FTkRfTVVTVDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFTVBUWSB0eXBlIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEZPUk0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRk9STS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTBkNjFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRk9STS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGT1JNLgotICovCi1maW5hbCBjbGFzcyBIZWRGT1JNIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRk9STShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0sIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoYWN0aW9uICVVUkk7ICNSRVFVSVJFRCkKLQkgKiAobWV0aG9kIChHRVR8UE9TVCkgR0VUKQotCSAqIChlbmN0eXBlICVDb250ZW50VHlwZTsgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCi0JICogKGFjY2VwdCAlQ29udGVudFR5cGVzOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAob25zdWJtaXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9ucmVzZXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCSAqIChhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ1RJT04sIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9NRVRIT0QsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9FTkNUWVBFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+Rk9STTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+Rk9STTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsCi0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGZvcm0gPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSk7Ci0JCWlmIChmb3JtICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQoZm9ybSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGbG93Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDg0MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGbG93Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yICglZmxvdzspKiBjb250YWluZXJzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRGbG93Q29udGFpbmVyIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRmxvd0NvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZMT1dfQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSEVBRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIRUFELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZWY2ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIRUFELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogSFRNTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSEVBRCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSEVBRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hFQUQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SEVBRDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVpMThuOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPnByb2ZpbGU8L3RkPjx0ZD5VUkk8L3RkPjx0ZD4jSU1QTElFRDwvdGQ+PHRkPk4vQTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEhFQUQgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMmQwOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSFIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFIsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRycwotCSAqIChhbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobm9zaGFkZSAobm9zaGFkZSkgI0lNUExJRUQpCi0JICogKHNpemUgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChjb2xvciAlQ29sb3I7ICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChhbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9MRUZULCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NFTlRFUiwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OT1NIQURFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjMmU0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqIEhUTUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhUTUwgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUx9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhUTUwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IVE1MOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkhUTUw8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD48Y29kZT4laTE4bjs8L2NvZGU+PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgICAgPHRkPntAbGluayBQRENNRG9jSW1wbCNnZXRBdHRyRGVjbGFyYXRpb25zSTE4bn08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPnZlcnNpb248L3RkPjx0ZD5DREFUQTwvdGQ+PHRkPiNGSVhFRDwvdGQ+Ci0JICogICAgIDx0ZD57QGxpbmsgSFRNTF9WRVJTSU9OX1RSQU5TSVRJT05BTH08L3RkPjx0ZD5kZXBsZWNhdGVkIGluIEhUTUw0LjAxPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPjxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0JCS8vIHZlcnNpb24KLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkZWMgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WRVJTSU9OKTsKLQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WRVJTSU9OLCBhZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIZWFkaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhlYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzYmUzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhlYWRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEhbMS02XS4KLSAqLwotZmluYWwgY2xhc3MgSGVkSGVhZGluZyBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSGVhZGluZyhTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkgxPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWF0dHJzOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhbGlnbjs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqIDxwPjxiPiVhbGlnbjs8L2I+IG1lYW5zIDxjb2RlPmFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAjSU1QTElFRDwvY29kZT4uCi0JICogVW5mb3J0dW5hdGVseSwgdGhpcyA8Y29kZT5hbGlnbjwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gb25lIGluCi0JICogPGNvZGU+SU1HPC9jb2RlPiBvciA8Y29kZT5UQUJMRTwvY29kZT4uICBTbywgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCSAqIG9mIDxjb2RlPmFsaWduPC9jb2RlPiBzaG91bGQgYmUgbG9jYWx5IGNyZWF0ZWQgYW5kIGl0IHNob3VsZG4ndCBiZSByZWdpc3RlcmVkCi0JICogaW4gYSA8Y29kZT5IQ01Eb2NJbXBsPC9jb2RlPiBpbnN0YW5jZS48L3A+Ci0JICogPHA+SG93ZXZlciwgJWFsaWduIGlzIHVzZWQgaW4gc2V2YXJhbCB0aW1lcy4gIEkgd291bGRuJ3Qgd3JpdGUgc2FtZSBjb2RlCi0JICogaW4gbWFueSB0aW1lcy4gIFNvLCBJIGFkZCBhIG5ldyB1dGlsaXR5IG1ldGhvZCBpbnRvIDxjb2RlPkNNVXRpbDwvY29kZT4KLQkgKiB0byBjcmVhdGUgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi48L3A+Ci0JICogPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTUcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSU1HLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDU0ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTUcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIElNRy4KLSAqLwotZmluYWwgY2xhc3MgSGVkSU1HIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElNRyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRywgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIElNRy4KLQkgKiAlYXR0cnM7Ci0JICogKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkgKiAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChtYXBmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChzcmMgJVVSSTsgI1JFUVVJUkVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR0cik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyBhbGlnbiAobG9jYWwpOyBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElOUFVULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElOUFVULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YWNiM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTlBVVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBJTlBVVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSU5QVVQgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSU5QVVQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlBVVCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIElOUFVULgotCSAqICVhdHRyczsKLQkgKiAodHlwZSAlSW5wdXRUeXBlOyBURVhUKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGNoZWNrZWQgKGNoZWNrZWQpICNJTVBMSUVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChyZWFkb25seSAocmVhZG9ubHkpICNJTVBMSUVEKQotCSAqIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobWF4bGVuZ3RoIE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCSAqIChhbHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh1c2VtYXAgJVVSSTsgI0lNUExJRUQpCi0JICogKGlzbWFwIChpc21hcCkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uc2VsZWN0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGlzdHlsZSBDREFUQSAjSU1QTElFRCkKLQkgKiA8PEQyMTU2ODQKLQkgKiAod2lkdGggQ0RBVEE7ICNJTVBMSUVEKQotCSAqIChoZWlnaHQgQ0RBVEE7ICNJTVBMSUVEKQotCSAqIChib3JkZXIgQ0RBVEE7ICNJTVBMSUVEKQotCSAqIEQyMTU2ODQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQkvLyAodHlwZSAlSW5wdXRUeXBlOyBURVhUKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJLy8gTk9URTogJUlucHV0VHlwZSBpcyBFTlVNOwotCQkvLyAodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLQkJLy8gIGZpbGUgfCBoaWRkZW4gfCBpbWFnZSB8IGJ1dHRvbikKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfUEFTU1dPUkQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfQ0hFQ0tCT1gsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkFESU8sIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfU1VCTUlULCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JFU0VULCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX0hJRERFTix9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9URVhUKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQotCQkvLyAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQotCQkvLyAoYWx0IENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBhdHRyKTsKLQotCQkvLyAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DSEVDS0VELCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX01BWExFTkdUSCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSVNUWUxFLAotCQkvLzw8RDIxNTY4NAotCQkJCQlDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVIKLQkJLy88RDIxNTY4NAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElubGluZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJbmxpbmVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkNGJjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElubGluZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWlubGluZTspKiBjb250YWluZXJzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqIEhlZElubGluZUNvbnRhaW5lci4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEhlZElubGluZUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRMSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRMSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTFmNGE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBMSS4KLSAqLwotZmluYWwgY2xhc3MgSGVkTEkgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMSShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAodHlwZSAlTElTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh2YWx1ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JfQotCi0JLyoqCi0JICogTEkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzVlOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBsaXN0IGl0ZW0gY29udGFpbmVyIGRlY2xhcmF0aW9ucy4KLSAqIC0gT0wsIFVMLCBNRU5VLCBESVIuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZExpc3RJdGVtQ29udGFpbmVyIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTGlzdEl0ZW1Db250YWluZXIoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9MSV9DT05UQUlORVI7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTUVOVS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRU5VLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjBlODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRU5VLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE1FTlUvRElSLgotICovCi1maW5hbCBjbGFzcyBIZWRNRU5VIGV4dGVuZHMgSGVkTGlzdEl0ZW1Db250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1FTlUoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBNRU5VL0RJUi4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+TUVOVS9ESVI8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVibG9jazs8L2NvZGU+LgotCSAqICVibG9jazsgaXM6Ci0JICogUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotCSAqIE5PU0NSSVBUIHwgTk9GUkFNRVMgfCBCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVggfCBIUiB8Ci0JICogVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MuCi0JICogJWhlYWRpbmc7IGlzOiBIMSB8IEgyIHwgSDMgfCBINCB8IEg1IHwgSDYuCi0JICogJWxpc3Q7IGlzIDogVUwgfCBPTCB8IERJUiB8IE1FTlUuCi0JICogJXByZWZvcm1hdHRlZDsgaXMgUFJFLgotCSAqIDxicj4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vICVibG9jazsKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDEsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMywgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1LCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5INiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuREwsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTU307Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRVRBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FVEEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyYTZmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FVEEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBNRVRBLgotICovCi1maW5hbCBjbGFzcyBIZWRNRVRBIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1FVEEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogTUVUQS4KLQkgKiAlaTE4bjsKLQkgKiAoaHR0cC1lcXVpdiBOQU1FICNJTVBMSUVEKQotCSAqIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb250ZW50IENEQVRBICNSRVFVSVJFRCkKLQkgKiAoc2NoZW1lIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQkvLyAobmFtZSBOQU1FICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5OQU1FKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0dHIpOwotCi0JCS8vIDI0OTQ5MwotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVEVOVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVEVOVCwgYXR0cik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hUVFBfRVFVSVYsCi0JCS8vCQlDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVEVOVAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE9MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE9MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODAxZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogT0wuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9MIGV4dGVuZHMgSGVkTGlzdEl0ZW1Db250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE9MKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0wsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIE9MLgotCSAqICh0eXBlICVPTFN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqIChzdGFydCBOVU1CRVIgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT1BUSU9OLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE9QVElPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGYyMDJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT1BUSU9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogT1BUSU9OLgotICovCi1maW5hbCBjbGFzcyBIZWRPUFRJT04gZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPUFRJT04oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT04sIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQl9Ci0KLQkvKioKLQkgKiBPUFRJT04uCi0JICogJWF0dHJzOwotCSAqIChzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChsYWJlbCAlVGV4dDsgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TRUxFQ1RFRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogT1BUSU9OIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyZTA5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFAgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiB0ZXJtaW5hdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlAsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPlA8L2NvZGU+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+UDwvY29kZT4gaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlpZiAodGVybWluYXRvcnMgIT0gbnVsbCkKLQkJCXJldHVybiB0ZXJtaW5hdG9ycy5pdGVyYXRvcigpOwotCQkvLzw8RDIxNzk4MgotCQl0ZXJtaW5hdG9ycyA9IG5ldyBWZWN0b3IoKTsKLQkJdGVybWluYXRvcnMuYWRkQWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVzT2ZCbG9jaygpKTsKLQkJdGVybWluYXRvcnMuYWRkKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJKTsKLQkJdGVybWluYXRvcnMuYWRkKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUKTsKLQkJdGVybWluYXRvcnMuYWRkKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREKTsKLQkJLy9EMjE3OTgyCi0JCXJldHVybiB0ZXJtaW5hdG9ycy5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUFJFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBSRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmY1MzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUFJFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogUFJFLgotICovCi1maW5hbCBjbGFzcyBIZWRQUkUgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICogUFJFIGVsZW1lbnQgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBzb3VyY2UuCi0JICovCi0JcHVibGljIEhlZFBSRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQotCQlrZWVwU3BhY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKHdpZHRoIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICh3aWR0aCBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPlBSRTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JXByZS5leGNsdXNpb247PC9jb2RlPi4KLQkgKiAlcHJlLmV4Y2x1c2lvbiBpczoKLQkgKiBJTUcgfCBPQkpFQ1QgfCBBUFBMRVQgfCBCSUcgfCBTTUFMTCB8IFNVQiB8IFNVUCB8IEZPTlQgfCBCQVNFRk9OVAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HLH07Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBjZGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQY2RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5MGRmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBjZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgUENEQVRBIHR5cGUgZWxlbWVudCBkZWNsYXJhdGlvbnMuPGJyPgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRQY2RhdGEgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQY2RhdGEoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogUENEQVRBIHR5cGUgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgdHlwZS48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNFTEVDVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTRUxFQ1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwMzZmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNFTEVDVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIFNFTEVDVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU0VMRUNUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU0VMRUNUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9TRUxFQ1Q7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNpemUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX01VTFRJUExFLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJQmFzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZGIwNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLQotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBTU0kgZGVjbGFyYXRpb25zLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRTU0lCYXNlIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUJhc2UoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRGb3JtYXRUeXBlKCkgewotCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfU1NJOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wTmFtZSkgewotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU1NJKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcE5hbWUpOwotCX0KLQotCS8qCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUpIHsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lDb25maWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTJiMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpDT05GSUcuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUNvbmZpZyBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUNvbmZpZyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUcsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpDT05GSUcuCi0JICogKGVycm1zZyBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKiAodGltZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9FUlJNU0csIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFRk1ULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVElNRUZNVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRWNoby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMWIyMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6RUNITy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRWNobyBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUVjaG8oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRUNITywgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkVDSE8KLQkgKiAodmFyIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRXhlYy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFeGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YWQ1OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFeGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6RVhFQy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRXhlYyBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUV4ZWMoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRVhFQywgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkVYRUMKLQkgKiAoY2dpICVVUkk7ICNJTVBMSUVEKQotCSAqIChjbWQgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ0dJLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ01EfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGbGFzdG1vZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGbGFzdG1vZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTBjYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRmxhc3Rtb2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpGTEFTVE1PRC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRmxhc3Rtb2QgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lGbGFzdG1vZChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZMQVNUTU9ECi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRnNpemUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRnNpemUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2ZjI4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZzaXplLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6RlNJWkUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUZzaXplIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRnNpemUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRlNJWkUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpGU0laRQotCSAqIChmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqICh2aXJ0dWFsICVVUkkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUluY2x1ZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJSW5jbHVkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjBmNzI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJSW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogU1NJOklOQ0xVREUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUluY2x1ZGUgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lJbmNsdWRlKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0lOQ0xVREUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpJTkNMVURFCi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJUHJpbnRlbnYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJUHJpbnRlbnYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2MDk5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSVByaW50ZW52LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBTU0k6UFJJTlRFTlYuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSVByaW50ZW52IGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJUHJpbnRlbnYoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfUFJJTlRFTlYsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogU1NJOlBSSU5URU5WIGhhcyBubyBhdHRyaWJ1dGVzLiAgU28sIHRoaXMgbWV0aG9kIHNob3VsZAotCSAqIGFsd2F5cyByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogTm90ZTogU2luY2Ugc29tZWJvZHkgZG9lc24ndCBleHBlY3QgbnVsbCBpcyByZXR1cm5lZCwgcmV0dXJuIHRoZSBlbXB0eSBhdHRyaWJ1dGUKLQkgKiBsaWtlIGEgY3VzdG9tIHRhZyB3aGljaCBkb2Vzbid0IGhhdmUgYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJU2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ3NDg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6U0VULgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lTZXQgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lTZXQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfU0VULCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6U0VUCi0JICogKHZhciBDREFUQSAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFSLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFRFWFRBUkVBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFRFWFRBUkVBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MTk4ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRURVhUQVJFQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVEVYVEFSRUEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRFWFRBUkVBIGV4dGVuZHMgSGVkUGNkYXRhIHsKLQotCS8qKgotCSAqIFRFWFRBUkVBIHNob3VsZCBrZWVwIHNwYWNlcyBpbiBpdHMgc291cmNlLgotCSAqLwotCXB1YmxpYyBIZWRURVhUQVJFQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFRBUkVBLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0KLQkJa2VlcFNwYWNlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogVEVYVEFSRUEuCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5Ci0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHJvd3MgTlVNQkVSICNSRVFVSVJFRCkKLQkgKiAoY29scyBOVU1CRVIgI1JFUVVJUkVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChyZWFkb25seSAocmVhZG9ubHkpICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnNlbGVjdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGlzdHlsZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9ST1dTLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ09MUywgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0lTVFlMRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVElUTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVElUTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyZTBhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFRJVExFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBUSVRMRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVElUTEUgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRJVExFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBUSVRMRS4KLQkgKiAlaTE4bjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPlRJVExFPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4laGVhZC5taXNjOzwvY29kZT4uCi0JICogJWhlYWQubWlzYzsgaXMgPGNvZGU+U0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1Q8L2NvZGU+LgotCSAqIDxicj4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIChTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCkKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLH07Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyNDlhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFVMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBVTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkVUwgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVUwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVUwuCi0JICogKHR5cGUgJVVMU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDBhM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotCi0KLQotLyoqCi0gKiBQcm9wZXJ0eVByb3ZpZGVyIGNsYXNzLgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaW5zdGFuY2VzLgotICovCi1pbnRlcmZhY2UgUHJvcGVydHlQcm92aWRlciB7Ci0KLQlib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpOwotCi0JT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0YTJjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL1Byb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MUHJvcGVydHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci0KLS8qKgotICogVGhlIGZhY3Rvcnkgb2JqZWN0IG9mIFByb3BlcnR5UHJvdmlkZXIuCi0gKi8KLWZpbmFsIGNsYXNzIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IHsKLQotCi0JLyoqCi0JICogRGVmYXVsdFByb3ZpZGVyIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIHVua25vd24gcHJvcGVydGllcy4KLQkgKiBJdCBhbHdheXMgcmV0dXJucyBudWxsIHZhbHVlIGZvciBhbnkgcHJvcGVydGllcy4KLQkgKi8KLQljbGFzcyBEZWZhdWx0UHJvdmlkZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIERlZmF1bHRQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCWFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIChlZGVjbCAhPSBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCWlmICghKGVkZWNsIGluc3RhbmNlb2YgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGdldEVsZW1lbnRQcm9wZXJ0eSgoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pZWRlY2wpOwotCQl9Ci0KLQkJYWJzdHJhY3QgcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCk7Ci0JfQotCi0JLyoKLQkgKiAidGFnSW5mbyIKLQkgKiBnZXRzIGRvY3VtZW50YXRpb24gZm9yIHRoZSBlbGVtZW50Ci0JICovCi0JY2xhc3MgUFBUYWdJbmZvIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBodG1sQW5ub3RhdGlvbkxvYyA9ICJkYXRhL2h0bXJlZi54bWwiOyAvLyROT04tTkxTLTEkCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGZBbm5vdGF0aW9uTWFwID0gbnVsbDsKLQotCQlwdWJsaWMgUFBUYWdJbmZvKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBHZXRzIHRoZSBhbm5vdGF0aW9uTWFwLgotCQkgKiBAcmV0dXJuIFJldHVybnMgYSBBbm5vdGF0aW9uTWFwCi0JCSAqLwotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBnZXRBbm5vdGF0aW9uTWFwKCkgewotCQkJaWYgKGZBbm5vdGF0aW9uTWFwID09IG51bGwpIHsKLQkJCQlmQW5ub3RhdGlvbk1hcCA9IG5ldyBBbm5vdGF0aW9uTWFwKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZkFubm90YXRpb25NYXAubG9hZChodG1sQW5ub3RhdGlvbkxvYywgSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vIGFubm90YXRpb24gYXZhaWxhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZBbm5vdGF0aW9uTWFwOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJaWYgKGRlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJcmV0dXJuIGdldEFubm90YXRpb25NYXAoKS5nZXRQcm9wZXJ0eSgoKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pZGVjbCkuZ2V0RWxlbWVudE5hbWUoKSwgInRhZ0luZm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogInNob3VsZEtlZXBTcGFjZSIKLQkgKi8KLQljbGFzcyBQUFNob3VsZEtlZXBTcGFjZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBTaG91bGRLZWVwU3BhY2UoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuc2hvdWxkS2VlcFNwYWNlcygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogInNob3VsZEluZGVudENoaWxkU291cmNlIgotCSAqLwotCWNsYXNzIFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJ0ZXJtaW5hdG9ycyIKLQkgKi8KLQljbGFzcyBQUFRlcm1pbmF0b3JzIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFRlcm1pbmF0b3JzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCWlmIChkZWNsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoISAoZGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtRGVjbEltcGwpKSByZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoKEhUTUxFbGVtRGVjbEltcGwpZGVjbCkuZ2V0VGVybWluYXRvcnMoKTsKLQkJfQotCX0KLQotCS8qCi0JICogInByb2hpYml0ZWRBbmNlc3RvcnMiCi0JICovCi0JY2xhc3MgUFBQcm9oaWJpdGVkQW5jZXN0b3JzIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIGRlY2wuZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNKU1AiCi0JICovCi0JY2xhc3MgUFBJc0pTUCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc0pTUCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5pc0pTUCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzWEhUTUwiCi0JICogSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpdHNlbGYgbmV2ZXIgcmVwcmVzZW50IGFueSBYSFRNTCBlbGVtZW50IGRlY2xhcmF0aW9uLgotCSAqIFNvLCB0aGlzIHByb3BlcnR5IG11c3QgYmUgYWx3YXlzIGZhbHNlLgotCSAqLwotCWNsYXNzIFBQSXNYSFRNTCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1hIVE1MKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc1NTSSIKLQkgKiBFYWNoIGRlY2xhcmF0aW9uIGNsYXNzIGZvciBTU0kgZWxlbWVudHMgbXVzdCBwcm92aWRlIHRoaXMgcHJvcGVydHkgaXRzZWxmLAotCSAqIGFuZCB0aGVuIHJldHVybiB0cnVlLiAgT3RoZXIgZGVjbGFyYXRpb24gbXVzdCBhbHdheXMgcmV0dXJuIGZhbHNlLgotCSAqLwotCWNsYXNzIFBQSXNTU0kgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSXNTU0koKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImxpbmVCcmVha0hpbnQiCi0JICovCi0JY2xhc3MgUFBMaW5lQnJlYWtIaW50IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUExpbmVCcmVha0hpbnQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIGhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldExpbmVCcmVha0hpbnQoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19BRlRFUl9TVEFSVCA6Ci0JCQkJCWhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19BRlRFUl9TVEFSVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBoaW50OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGF5b3V0VHlwZSIKLQkgKi8KLQljbGFzcyBQUExheW91dFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGF5b3V0VHlwZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldExheW91dFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQkxPQ0sgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JMT0NLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JSRUFLIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9CUkVBSzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0hJRERFTjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1QgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX09CSkVDVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9XUkFQIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9XUkFQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJvbWl0VHlwZSIKLQkgKi8KLQljbGFzcyBQUE9taXRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUE9taXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldE9taXRUeXBlKCkpIHsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9CT1RIIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfQk9USDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkRfREVGQVVMVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9ERUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkRfTVVTVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvLgotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiB0eXBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaW5jbHVzaW9uIgotCSAqLwotCWNsYXNzIFBQSW5jbHVzaW9uIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUEluY2x1c2lvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRJbmNsdXNpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlQcm92aWRlciBnZXRQcm92aWRlcihTdHJpbmcgcHJvcE5hbWUpIHsKLQkJUHJvcGVydHlQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSAoUHJvcGVydHlQcm92aWRlcikgZmFjdG9yeS5yZWdpc3RyeS5nZXQocHJvcE5hbWUpOwotCQlpZiAocHAgIT0gbnVsbCkKLQkJCXJldHVybiBwcDsKLQotCQlwcCA9IGZhY3RvcnkuY3JlYXRlKHByb3BOYW1lKTsKLQkJaWYgKHBwID09IG51bGwpCi0JCQlyZXR1cm4gZmFjdG9yeS5kZWZhdWx0UHJvdmlkZXI7Ci0KLQkJZmFjdG9yeS5yZWdpc3RyeS5wdXQocHJvcE5hbWUsIHBwKTsKLQkJcmV0dXJuIHBwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSByZWdpc3RyeSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXIgZGVmYXVsdFByb3ZpZGVyID0gbmV3IERlZmF1bHRQcm92aWRlcigpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXIgY3JlYXRlKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gbnVsbDsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpCi0JCQlwcCA9IG5ldyBQUElzSlNQKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXBwID0gbmV3IFBQSXNYSFRNTCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcHAgPSBuZXcgUFBJc1NTSSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MQVlPVVRfVFlQRSkpCi0JCQlwcCA9IG5ldyBQUExheW91dFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkKLQkJCXBwID0gbmV3IFBQTGluZUJyZWFrSGludCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUykpCi0JCQlwcCA9IG5ldyBQUFByb2hpYml0ZWRBbmNlc3RvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKQotCQkJcHAgPSBuZXcgUFBTaG91bGRLZWVwU3BhY2UoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UpKQotCQkJcHAgPSBuZXcgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5URVJNSU5BVE9SUykpCi0JCQlwcCA9IG5ldyBQUFRlcm1pbmF0b3JzKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRBR0lORk8pKQotCQkJcHAgPSBuZXcgUFBUYWdJbmZvKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpCi0JCQlwcCA9IG5ldyBQUE9taXRUeXBlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklOQ0xVU0lPTikpCi0JCQlwcCA9IG5ldyBQUEluY2x1c2lvbigpOwotCi0JCXJldHVybiBwcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3NzaS9TU0lDTURvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9zc2kvU1NJQ01Eb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZGZkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3NzaS9TU0lDTURvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5zc2k7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBmYWN0b3J5IGZvciBTU0kgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU1NJQ01Eb2N1bWVudEZhY3RvcnkgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZJWCA9ICJTU0kiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9DX1RZUEVfTkFNRSA9ICJTU0kiOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBjbGFzcyBDTU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cyBDTU5hbWVzcGFjZSB7Ci0JCXB1YmxpYyBDTU5hbWVzcGFjZUltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCQlyZXR1cm4gUFJFRklYOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gRE9DX1RZUEVfTkFNRTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQ01Ob2RlLk5BTUVfU1BBQ0U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgQ01Eb2NJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudCB7Ci0JCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgaGNtID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCi0JCXN0YXRpYyBjbGFzcyBFbGVtZW50cyBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQkJCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfQ09ORklHLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VDSE8sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRVhFQywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9JTkNMVURFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1BSSU5URU5WLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1NFVH07Ci0JCQlwcml2YXRlIEhhc2h0YWJsZSBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJCXB1YmxpYyBFbGVtZW50cygpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBlbGVtcyA9IGhjbS5nZXRFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtcy5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQkJCW1hcC5wdXQobmFtZSwgZGVjKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCXJldHVybiBtYXAuc2l6ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJCVN0cmluZyBjb29rZWQgPSBnZXRDYW5vbmljYWxOYW1lKG5hbWUpOwotCQkJCWlmICghbWFwLmNvbnRhaW5zS2V5KGNvb2tlZCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJldHVybiAoQ01Ob2RlKSBtYXAuZ2V0KGNvb2tlZCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKC0taW5kZXggPCAwKQotCQkJCQkJcmV0dXJuIChDTU5vZGUpIG5vZGU7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQkJcmV0dXJuIG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJfQotCi0JCQlwcml2YXRlIFN0cmluZyBnZXRDYW5vbmljYWxOYW1lKFN0cmluZyByYXdOYW1lKSB7Ci0JCQkJcmV0dXJuIHJhd05hbWUudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXN0YXRpYyBwcml2YXRlIEVsZW1lbnRzIGVsZW1lbnRzID0gbmV3IEVsZW1lbnRzKCk7Ci0KLQotCQlwdWJsaWMgQ01Eb2NJbXBsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQkJcmV0dXJuIHNzaW5zOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIENNTmFtZXNwYWNlIHNzaW5zID0gbmV3IENNTmFtZXNwYWNlSW1wbCgpOwotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgbXljbSA9IG5ldyBDTURvY0ltcGwoKTsKLQotCXByaXZhdGUgU1NJQ01Eb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBteWNtOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzdhNDFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9IVE1MQ29udGVudFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJvcGVydGllcyBjb25zdGFudHMgdXNlZCBieSBIVE1MLiBDbGllbnRzIHNob3VsZCBvbmx5IHJlYWQgYW5kIG1vZGlmeSB0aGUKLSAqIEhUTUwgcHJvcGVydGllcyBwcm9ncmFtbWF0aWNhbGx5IHVzaW5nIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb250ZW50UHJvcGVydGllcyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MQ09SRV9JRCA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9LRVkgPSAiPHByb2plY3Q+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZG9jdW1lbnQgdHlwZSB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1RZUEUgPSAiZG9jdW1lbnQtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aAotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRoZSBrZXkgd2lsbCBiZSBiYXNlZCBvZmYgb2YKLQkgKiBAcmV0dXJuIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aCAoYmFzaWNhbGx5IHRoZQotCSAqICAgICAgICAgcmVzb3VyY2VQYXRoIHdpdGhvdXQgdGhlIGZpbGVuYW1lKTsgUFJPSkVDVF9LRVkgaWYgcmVzb3VyY2VQYXRoCi0JICogICAgICAgICBpcyBudWxsCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRLZXlGb3IoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCVN0cmluZyBrZXkgPSBQUk9KRUNUX0tFWTsKLQkJaWYgKHJlc291cmNlUGF0aCAhPSBudWxsICYmIHJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWtleSA9IHJlc291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByZWZlcmVuY2VzIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqIHByZWZlcmVuY2Uga2V5IChzdWJOb2RlKSBJZiBjcmVhdGUgaXMgdHJ1ZSwgdGhlIHByZWZlcmVuY2Ugbm9kZSB3aWxsIGJlCi0JICogY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGUgcHJlZmVyZW5jZSBub2RlIGlzIHVuZGVyCi0JICogQHBhcmFtIHByZWZlcmVuY2VLZXkKLQkgKiAgICAgICAgICAgIHRoZSBzdWJub2RlL2NhdGVnb3J5IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgbG9jYXRlZCBpbgotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGEgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QKLQkgKiAgICAgICAgICAgIGFscmVhZHkgZXhpc3QKLQkgKiBAcmV0dXJuIFByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdCBzY29wZSBhbmQKLQkgKiAgICAgICAgIHByZWZlcmVuY2Uga2V5LiBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgZm91bmQgYW5kIGNyZWF0ZSBpcwotCSAqICAgICAgICAgZmFsc2UKLQkgKi8KLQlzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZlcmVuY2VLZXksIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmIChjcmVhdGUpCi0JCQkvLyBjcmVhdGUgYWxsIG5vZGVzIGRvd24gdG8gdGhlIG9uZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotCQkJcmV0dXJuIG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCkuZ2V0Tm9kZShIVE1MQ09SRV9JRCkubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJLy8gYmUgY2FyZWZ1bCBsb29raW5nIHVwIGZvciBvdXIgbm9kZSBzbyBub3QgdG8gY3JlYXRlIGFueSBub2RlcyBhcwotCQkvLyBzaWRlIGVmZmVjdAotCQlQcmVmZXJlbmNlcyBub2RlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0Um9vdE5vZGUoKS5ub2RlKFByb2plY3RTY29wZS5TQ09QRSk7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPIG9uY2UgYnVnIDkwNTAwIGlzIGZpeGVkLCBzaG91bGQgYmUgYXMgc2ltcGxlIGFzIHRoaXM6Ci0JCQkvLyBTdHJpbmcgcGF0aCA9IHByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsKLQkJCS8vIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gRU5DT0RJTkdfUFJFRl9OT0RFOwotCQkJLy8gcmV0dXJuIG5vZGUubm9kZUV4aXN0cyhwYXRoKSA/IG5vZGUubm9kZShwYXRoKSA6IG51bGw7Ci0JCQkvLyBmb3Igbm93LCB0YWtlIHRoZSBsb25nIHdheQotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMocHJvamVjdC5nZXROYW1lKCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUubm9kZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhIVE1MQ09SRV9JRCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKEhUTUxDT1JFX0lEKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByZWZlcmVuY2VLZXkpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5vZGUubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vZGVFeGlzdHMgZmFpbGVkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IHJldHJpZXZlIHByZWZlcmVuY2Ugbm9kZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb250ZXh0IGlzCi0JICogICAgICAgICAgICBhdmFpbGFibGUgYW5kIHRoZSB3b3Jrc3BhY2Ugc2V0dGluZyBzaG91bGQgYmUgdGFrZW4uIE5vdGUKLQkgKiAgICAgICAgICAgIHRoYXQgcGFzc2luZyA8Y29kZT5udWxsPC9jb2RlPiBzaG91bGQgYmUgYXZvaWRlZC4KLQkgKiBAcGFyYW0gcmVjdXJzZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgcGFyZW50IHNob3VsZCBiZSBxdWVyaWVkIHRpbGwgcHJvcGVydHkgaXMgZm91bmQKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBrZXkuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlKSB7Ci0JCVN0cmluZyB2YWwgPSBudWxsOwotCQkvLyBib29sZWFuIHByZWZlcmVuY2VGb3VuZCA9IGZhbHNlOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJCXZhbCA9IGludGVybmFsR2V0UHJvcGVydHkocmVzb3VyY2UsIHJlY3Vyc2UsIHByZWZlcmVuY2VzKTsKLQkJCQkJLy8gcHJlZmVyZW5jZUZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gV29ya2JlbmNoIHByZWZlcmVuY2UgbWF5IG5vdCBiZSBuZWVkZWQgc28gbGVhdmUgb3V0IGZvciBub3cKLQkJLy8gLy8gbm8gcHJlZmVyZW5jZXMgZm91bmQgLSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKLQkJLy8gLy8gc2hvcnQtY2lyY3VpdAotCQkvLyAvLyBsb29rdXAgYnkgZmFsbGluZyBiYWNrIHRvIHdvcmtzcGFjZSdzIGRlZmF1bHQKLQkJLy8gLy8gc2V0dGluZwotCQkvLyBpZiAoIXByZWZlcmVuY2VGb3VuZCkKLQkJLy8gdmFsID0gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpOwotCQlyZXR1cm4gdmFsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBpbnRlcm5hbEdldFByb3BlcnR5KElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlLCBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQlTdHJpbmcgdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpLCBudWxsKTsKLQkJaWYgKHZhbHVlID09IG51bGwgJiYgcmVzb3VyY2UgIT0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpICYmIHJlY3Vyc2UpIHsKLQkJCXZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihudWxsKSwgbnVsbCk7Ci0JCX0KLQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyAvLyBlbnN1cmUgd2UgZGVmYXVsdCB0byB0aGUgd29ya3NwYWNlIHByZWZlcmVuY2UgaWYgbm9uZSBpcyBmb3VuZAotCQkvLyByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IGdldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KSA6IHZhbHVlOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dC4gTm90ZSBjb250ZXh0IGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUga2V5LiBJZiB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgdGhlIGtleSBpcyByZW1vdmVkIGZyb20gcHJvcGVydGllcy4KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwga2V5LCB0cnVlKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJcHJlZmVyZW5jZXMucmVtb3ZlKGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJZWxzZQotCQkJCQlwcmVmZXJlbmNlcy5wdXQoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpLCB2YWx1ZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gc2F2ZSBjaGFuZ2VzCi0JCQkJCXByZWZlcmVuY2VzLmZsdXNoKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEhUTUxDT1JFX0lELCBJU3RhdHVzLkVSUk9SLCAiVW5hYmxlIHRvIHNldCBwcm9wZXJ0eSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyBqdXN0IHNldCBhIHByZWZlcmVuY2UgaW4gdGhlIGluc3RhbmNlIHNjb3BlCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKSB7Ci0JCS8vIHNldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJLy8gfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWYwM2M4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyIHsKLQlwdWJsaWMgSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQlmSm9iID0gbmV3IENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIgX2luc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCUNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBmSm9iOwotCi0JLyoqCi0JICogVGhpcyBqb2IgaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0byBhbGxvdyB0aGUgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyCi0JICogdG8gc2NoZWR1bGUgb3BlcmF0aW9ucyB0aGF0IG5lZWQgdG8gbW9kaWZ5IHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVElFU19VUERBVEVfREVMQVkgPSA1MDA7Ci0JCXByaXZhdGUgTGlzdCBhc3luY0NoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYigpIHsKLQkJCXN1cGVyKEhUTUxDb3JlTWVzc2FnZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZyk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQ2hhbmdlcyhTZXQgbmV3Q2hhbmdlcykgewotCQkJaWYgKG5ld0NoYW5nZXMuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJYXN5bmNDaGFuZ2VzLmFkZEFsbChuZXdDaGFuZ2VzKTsKLQkJCQlhc3luY0NoYW5nZXMubm90aWZ5KCk7Ci0JCQl9Ci0JCQlzY2hlZHVsZShQUk9QRVJUSUVTX1VQREFURV9ERUxBWSk7Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0TmV4dENoYW5nZSgpIHsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJcmV0dXJuIGFzeW5jQ2hhbmdlcy5pc0VtcHR5KCkgPyBudWxsIDogKElQcm9qZWN0KSBhc3luY0NoYW5nZXMucmVtb3ZlKGFzeW5jQ2hhbmdlcy5zaXplKCkgLSAxKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhIVE1MQ29udGVudFByb3BlcnRpZXMuSFRNTENPUkVfSUQsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBIVE1MQ29yZU1lc3NhZ2VzLkhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcsIG51bGwpOwotCQkJbW9uaXRvciA9IG1vbml0b3IgPT0gbnVsbCA/IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgOiBtb25pdG9yOwotCQkJdHJ5IHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhIVE1MQ29yZU1lc3NhZ2VzLkhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcsIGFzeW5jQ2hhbmdlcy5zaXplKCkpOwotCQkJCXRyeSB7Ci0JCQkJCUlQcm9qZWN0IG5leHQ7Ci0JCQkJCXdoaWxlICgobmV4dCA9IGdldE5leHRDaGFuZ2UoKSkgIT0gbnVsbCkgewotCQkJCQkJLy8ganVzdCBleGl0IGlmIHRoZSBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biBvciBoYXMKLQkJCQkJCS8vIGJlZW4gc2h1dCBkb3duCi0JCQkJCQkvLyBpdCBpcyB0b28gbGF0ZSB0byBjaGFuZ2UgdGhlIHdvcmtzcGFjZSBhdCB0aGlzCi0JCQkJCQkvLyBwb2ludCBhbnl3YXkKLQkJCQkJCWlmIChQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLm9zZ2kiKS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gc2F2ZSB0aGUgcHJlZmVyZW5jZXMgbm9kZXMKLQkJCQkJCQlpZiAobmV4dC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQkvLyBzYXZlIGRvY3VtZW50IHR5cGUgcHJlZmVyZW5jZXMKLQkJCQkJCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKG5leHQsIEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBmYWxzZSk7Ci0JCQkJCQkJCWlmIChwcm9qZWN0UHJlZnMgIT0gbnVsbCkKLQkJCQkJCQkJCXByb2plY3RQcmVmcy5mbHVzaCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIHdlIGdvdCBhbiBlcnJvciBzYXZpbmcKLQkJCQkJCQlTdHJpbmcgZGV0YWlsTWVzc2FnZSA9IE5MUy5iaW5kKEhUTUxDb3JlTWVzc2FnZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZywgbmV4dC5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJCQlyZXN1bHQuYWRkKG5ldyBTdGF0dXMoMSA8PCAoSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQgJSAxMDAgLyAzMyksIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBkZXRhaWxNZXNzYWdlLCBlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2Ijc2hvdWxkUnVuKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFJ1bigpIHsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJcmV0dXJuICFhc3luY0NoYW5nZXMuaXNFbXB0eSgpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbnRyeUNoYW5nZXMoSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCS8vIGNoZWNrIGVhY2ggcmVzb3VyY2Ugd2l0aCB3ZWIgY29udGVudCBzZXR0aW5nIHRvIHNlZSBpZiBpdCBoYXMKLQkJCS8vIGJlZW4gbW92ZWQvZGVsZXRlZAotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMgPSBmYWxzZTsKLQotCQkJLy8gcHJvamVjdCBhZmZlY3RlZAotCQkJSVByb2plY3QgY3VycmVudFByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3REZWx0YS5nZXRSZXNvdXJjZSgpOwotCi0JCQlyZXNvdXJjZUNoYW5nZXMgPSBwcm9jZXNzUHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBwcm9qZWN0RGVsdGEsIHByb2plY3RzVG9TYXZlKTsKLQotCQkJLy8gaWYgdGhlcmUgd2FzIGEgcHJlZmVyZW5jZSBrZXkgY2hhbmdlLCBuZWVkIHRvIHNhdmUgcHJlZmVyZW5jZXMKLQkJCWlmIChyZXNvdXJjZUNoYW5nZXMpCi0JCQkJcHJvamVjdHNUb1NhdmUuYWRkKGN1cnJlbnRQcm9qZWN0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBHb2VzIHRocm91Z2ggYWxsIHRoZSByZXNvdXJjZS1kZXBlbmRlbnQgcHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoCi0JCSAqIGN1cnJlbnRQcm9qZWN0ICYga2V5IGFuZCB1cGRhdGVzIHRoZSBwcmVmZXJlbmNlIGtleXMgaWYgbmVlZGVkCi0JCSAqIGJhc2VkIG9uIHByb2plY3REZWx0YQotCQkgKiAKLQkJICogQHBhcmFtIGN1cnJlbnRQcm9qZWN0Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBwcm9qZWN0IG9mIHRoZSBwcmVmZXJlbmNlcyB0byBiZSBsb29rZWQgYXQKLQkJICogQHBhcmFtIGtleQotCQkgKiAgICAgICAgICAgIGN1cnJlbnQga2V5L3N1YmNhdGVnb3J5IG9mIHRoZSBwcmVmZXJlbmNlcyB0byBiZSBsb29rZWQKLQkJICogICAgICAgICAgICBhdAotCQkgKiBAcGFyYW0gcHJvamVjdERlbHRhCi0JCSAqICAgICAgICAgICAgdGhlIGNoYW5nZXMgdG8gcHJvY2VzcyB0aGUgcHJlZmVyZW5jZSBrZXlzIGFnYWluc3QKLQkJICogQHBhcmFtIHByb2plY3RzVG9TYXZlCi0JCSAqICAgICAgICAgICAgdGhlIHByb2plY3RzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkL3NhdmVkCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiBjdXJyZW50UHJvamVjdCdzIHByZWZlcmVuY2VzIHdlcmUgbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUHJlZmVyZW5jZXMoSVByb2plY3QgY3VycmVudFByb2plY3QsIFN0cmluZyBrZXksIElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCi0JCQkvLyBnZXQgdGhlIHByb2plY3Qta2V5IHByZWZlcmVuY2Ugbm9kZQotCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBrZXksIGZhbHNlKTsKLQkJCWlmIChwcm9qZWN0UHJlZnMgPT0gbnVsbCkKLQkJCQkvLyBubyBwcmVmZXJlbmNlcyBmb3IgdGhpcyBwcm9qZWN0LWtleSwganVzdCBiYWlsCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nW10gYWZmZWN0ZWRSZXNvdXJjZXM7Ci0JCQl0cnkgewotCQkJCWFmZmVjdGVkUmVzb3VyY2VzID0gcHJvamVjdFByZWZzLmtleXMoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIHByb2JsZW1zIHdpdGggdGhlIHByb2plY3Qgc2NvcGUuLi4gd2UgZ29ubmEgbWlzcyB0aGUKLQkJCQkvLyBjaGFuZ2VzIChidXQgd2lsbCBsb2cpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIlByb2JsZW0gcmV0cmVpdmluZyBKU1AgRnJhZ21lbnQgcHJlZmVyZW5jZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gZ28gdGhyb3VnaCBlYWNoIHByZWZlcmVuY2Uga2V5ICh3aGljaCBpcyByZWFsbHkgYSBmaWxlIG5hbWUpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFmZmVjdGVkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gc2VlIGlmIHByZWZlcmVuY2Uga2V5L2ZpbGUgbmFtZSB3YXMgZmlsZSB0aGF0IHdhcyBjaGFuZ2VkCi0JCQkJSVJlc291cmNlRGVsdGEgbWVtYmVyRGVsdGEgPSBwcm9qZWN0RGVsdGEuZmluZE1lbWJlcihuZXcgUGF0aChhZmZlY3RlZFJlc291cmNlc1tpXSkpOwotCQkJCS8vIG5vIGNoYW5nZXMgZm9yIHRoZSBnaXZlbiByZXNvdXJjZQotCQkJCWlmIChtZW1iZXJEZWx0YSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobWVtYmVyRGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJcmVzb3VyY2VDaGFuZ2VzID0gdHJ1ZTsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBzZXR0aW5nIGZvciB0aGUgb3JpZ2luYWwgbG9jYXRpb24KLQkJCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHByb2plY3RQcmVmcy5nZXQoYWZmZWN0ZWRSZXNvdXJjZXNbaV0sIG51bGwpOwotCQkJCQlwcm9qZWN0UHJlZnMucmVtb3ZlKGFmZmVjdGVkUmVzb3VyY2VzW2ldKTsKLQkJCQkJaWYgKChtZW1iZXJEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKLQkJCQkJCS8vIGlmIG1vdmluZywgY29weSB0aGUgc2V0dGluZyBmb3IgdGhlIG5ldyBsb2NhdGlvbgotCQkJCQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChtZW1iZXJEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpLnNlZ21lbnQoMCkpOwotCQkJCQkJUHJlZmVyZW5jZXMgdGFyZ2V0UHJlZnMgPSBIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXModGFyZ2V0UHJvamVjdCwga2V5LCB0cnVlKTsKLQkJCQkJCXRhcmdldFByZWZzLnB1dChIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0S2V5Rm9yKG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkpLCBjdXJyZW50VmFsdWUpOwotCQkJCQkJaWYgKHRhcmdldFByb2plY3QgIT0gY3VycmVudFByb2plY3QpCi0JCQkJCQkJcHJvamVjdHNUb1NhdmUuYWRkKHRhcmdldFByb2plY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc291cmNlQ2hhbmdlczsKLQkJfQotCi0JCS8qKgotCQkgKiBGb3IgYW55IGNoYW5nZSB0byB0aGUgZW5jb2RpbmcgZmlsZSBvciBhbnkgcmVzb3VyY2Ugd2l0aCBlbmNvZGluZwotCQkgKiBzZXQsIGp1c3QgZGlzY2FyZCB0aGUgY2FjaGUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUlSZXNvdXJjZURlbHRhW10gcHJvamVjdERlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCS8vIHByb2Nlc3MgZWFjaCBwcm9qZWN0IGluIHRoZSBkZWx0YQotCQkJU2V0IHByb2plY3RzVG9TYXZlID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdERlbHRhcy5sZW5ndGg7IGkrKykKLQkJCQkvLyBub3RoaW5nIHRvIGRvIGlmIGEgcHJvamVjdCBoYXMgYmVlbiBhZGRlZC9yZW1vdmVkL21vdmVkCi0JCQkJaWYgKHByb2plY3REZWx0YXNbaV0uZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgKHByb2plY3REZWx0YXNbaV0uZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pID09IDApCi0JCQkJCXByb2Nlc3NFbnRyeUNoYW5nZXMocHJvamVjdERlbHRhc1tpXSwgcHJvamVjdHNUb1NhdmUpOwotCQkJZkpvYi5hZGRDaGFuZ2VzKHByb2plY3RzVG9TYXZlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc3RhcnR1cCgpIHsKLQkJX2luc3RhbmNlID0gbmV3IEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoX2luc3RhbmNlLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoX2luc3RhbmNlLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJX2luc3RhbmNlID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjM1OWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJvdGVjdGVkIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQotCXByb3RlY3RlZCBSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gVE9ETzogaWYgZGV0ZWN0ZWRDaGFyc2V0IGFuZCBzcGVjIGRlZmF1bHQgaXMKLQkJLy8gbnVsbCwgbmVlZCB0byB1c2UgIndvcmsKLQkJLy8gYmVuY2ggYmFzZWQiIGRlZmF1bHRzLgotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEBwYXJhbSByZWFzb24KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24pIHsKLQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBlbnN1cmVJbnB1dFNldCgpIHsKLQkJaWYgKGZSZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZSAtLSBpdHMgaGVyZSB3ZSBwaWNrIHVwICJydWxlcyIgZm9yIGNhc2VzCi0JCS8vIHRoYXQgYXJlIG5vdCBldmVuIGluIEphdmEKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2l2ZSBwcmlvcml0eSB0byBqYXZhIGNvbm9uaWNhbCBuYW1lLCBpZiBwcmVzZW50Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCQkvLyBidXQgc3RpbGwgYWxsb3cgb3ZlcnJpZGVzCi0JCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JLy8gdG8gZW5zdXJlIGNvbnNpc3Qgb3ZlcmFsbCBydWxlcyB1c2VkLCB3ZSdsbCBtYXJrIGFzCi0JLy8gZmluYWwsCi0JLy8gYW5kIHJlcXVpcmUgc3ViY2xhc3NlcyB0byBwcm92aWRlIGNlcnRhaW4gcGllY2VzIG9mCi0JLy8gdGhlCi0JLy8gaW1wbGVtZW50YXRpb24KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZQotCQkJLy8gdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcwotCQkJLy8gbm90IHByZXNlbnQuCi0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJaGFuZGxlU3BlY0RlZmF1bHQoKTsKLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkvLyBzYWZ0eSBuZXQKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgTnVsbE1lbWVudG8oKTsKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRvIHJldHVybiBhIGRlZmF1bHQgZW5jb2RpbmcgLS0gYXMgc3BlY2lmaWVkIGJ5IGFuIGluZHVzdHJ5Ci0JICogY29udGVudCB0eXBlIHNwZWMgLS0gd2hlbiBub3QgcHJlc2VudCBpbiB0aGUgc3RyZWFtLCBmb3IgZXhhbXBsZSwgWE1MCi0JICogc3BlY2lmaWVzIFVURi04LCBKU1Agc3BlY2lmaWVzIElTTy04ODU5LTEuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4KLQkgKiBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggInNwZWMgZGVmYXVsdCIuCi0JICovCi0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldFNwZWNEZWZhdWx0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlyZXNldEFsbCgpOwotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGVuYyA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jKTsKLQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3BlY0RlZmF1bHQoKSB7Ci0JCVN0cmluZyBlbmNvZGluZ05hbWU7Ci0JCWVuY29kaW5nTmFtZSA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuY29kaW5nTmFtZSAhPSBudWxsKSB7Ci0JCQkvLyBjcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXZlcnkgc3ViY2xhc3MgbXVzdCBwcm92aWRlIGEgd2F5IHRvIHBhcnNlIHRoZSBpbnB1dC4gVGhpcyBtZXRob2QgaGFzCi0JICogc2V2ZXJhbCBjcml0aWNhbCByZXNwb25zaWJpbGl0aWVzOgotCSAqIDxsaT5zZXQgdGhlIGZFbmNvZGluZ01lbWVudG8gZmllbGQgYXBwcm9wcmlhdGVseSwgYWNjb3JkaW5nIHRvIHRoZQotCSAqIHJlc3VsdHMgb2YgdGhlIHBhcnNlIG9mIGZSZWFkZXIuPC9saT4KLQkgKiA8bGk+c2V0IGZIYXJkZXJQYXJzZWQgdG8gdHJ1ZSwgdG8gYXZvaWQgd2FzdGVkIHJlLXBhcnNpbmcuPC9saT4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSBrbm93IEJ5dGVSZWFkZXIKLQkJCS8vIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXNldEFsbCgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGlTdG9yYWdlLmdldENvbnRlbnRzKCk7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJc2V0KHJlc2V0dGFibGVTdHJlYW0pOwotCQkvLyBUT0RPIHdlJ2xsIG5lZWQgdG8gInJlbWVtYmVyIiBJRmlsZSwgb3IKLQkJLy8gZ2V0IGl0cyAob3IgaXRzIHByb2plY3Qncykgc2V0dGluZ3MsIGluIGNhc2UKLQkJLy8gdGhvc2UgYXJlIG5lZWRlZCB0byBoYW5kbGUgY2FzZXMgd2hlbiB0aGUKLQkJLy8gZW5jb2RpbmcgaXMgbm90IGluIHRoZSBmaWxlIHN0cmVhbS4KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBwYXJ0IG9mIGludGVyZmFjZSB0byBoZWxwIGF2b2lkIGNvbmZ1c2lvbiAuLi4gaXQKLQkgKiBleHBlY3RlZCB0aGlzIFJlYWRlciBpcyBhIHdlbGwgZm9ybWVkIGNoYXJhY3RlciByZWFkZXIgLi4uIHRoYXQgaXMsIGl0cwotCSAqIGFsbCByZWFkeSBiZWVuIGRldGVybWluZWQgdG8gbm90IGJlIGEgdW5pY29kZSBtYXJrZWQgaW5wdXQgc3RyZWFtLiBBbmQsCi0JICogaXRzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24sIGF0IHBvc2l0aW9uIHplcm8sIHJlYWR5IHRvCi0JICogcmVhZCBmaXJzdCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJaWYgKCFmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJfQotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2JsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmIG1hcmthYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxOTliMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci0KLS8qKgotICogVGhpcyBpcyBhbiAiYWRhcHRlciIgY2xhc3MsIHNpbXBseSB0byBnZXQgaW4gaW5wdXQgc3RyZWFtIHRvIGFjdCBsaWtlIGEKLSAqIHJlYWRlci4gV2UgY291bGQgbm90IHVzZSBJbnB1dFN0cmVhbVJlYWRlciBkaXJlY3RseSBiZWNhdXNlIGl0cyBpbnRlcm5hbAotICogYnVmZmVycyBhcmUgbm90IGNvbnRyb2xsYWJsZSwgYW5kIGl0IHNvbWV0aW1lcyBwdWxscyB0b28gbXVjaCBvdXQgb2YgaW5wdXQKLSAqIHN0cmVhbSAoZXZlbiB3aGVuIGl0IHdhc24ndCBuZWVkZWQgZm9yIG91ciBwdXJwb3NlcykuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBoaWdobHkgc3BlY2lhbGl6ZWQgYW5kIGJ5IG5vdCBtZWFucyBtZWFudCB0byBiZQotICogZ2VuZXJhbCBwdXJwb3NlLiBJdHMgdXNlIGlzIHJlc3RyaWN0ZWQgdG8gdGhvc2UgY2FzZXMgd2hlcmUgdGhlIGlucHV0Ci0gKiBzdHJlYW0gY2FuIGJlIHJlZ2FyZGVkIGFzIGFzY2lpIGp1c3QgbG9uZyBlbm91Z2ggdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHJlYWwKLSAqIGVuY29kaW5nIHNob3VsZCBiZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQnl0ZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gQ29kZWRJTy5NQVhfQlVGX1NJWkU7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHJvdGVjdGVkIEJ5dGVSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmZCdWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgewotCQl0aGlzLmZJbnB1dFN0cmVhbS5tYXJrKHJlYWRBaGVhZExpbWl0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYjAgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCXJldHVybiAoYjAgJiAweDAwRkYpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsZW5ndGggPiB0aGlzLmZCdWZmZXIubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSB0aGlzLmZCdWZmZXIubGVuZ3RoOwotCQl9Ci0KLQkJaW50IGNvdW50ID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCh0aGlzLmZCdWZmZXIsIDAsIGxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbnQgYjAgPSB0aGlzLmZCdWZmZXJbaV07Ci0JCQkvLyB0aGUgMHgwMEZGIGlzIHRvICJsb3NlIiB0aGUgbmVnYXRpdmUgYml0cyBmaWxsZWQgaW4gdGhlIGJ5dGUgdG8KLQkJCS8vIGludCBjb252ZXJzaW9uCi0JCQkvLyAoYW5kIHdoaWNoIHdvdWxkIGJlIHRoZXJlIGlmIGNhc3QgZGlyZWN0bHkgZnJvbSBieXRlIHRvIGNoYXIpLgotCQkJY2hhciBjMCA9IChjaGFyKSAoYjAgJiAweDAwRkYpOwotCQkJY2hbb2Zmc2V0ICsgaV0gPSBjMDsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ucmVzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLnNraXAobik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTcwOTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLS8qKgotICogCi0gKiBDb250ZW50RGVzY3JpYmVyRm9ySFRNTAotICogCi0gKiBBIGZldyBkZXNpZ24gcHJpbmNpcGxlcyB0byByZW1lbWJlciB3aXRoIGNvbnRlbnQgZGVzY3JpYmVyczoKLSAqIDx1bD4gCi0gKiA8bGk+UmVtZW1iZXIgbm90IHRvIHN0b3JlIHZhbHVlcy9kYXRhIGluIHRoZSBkZXNjcmlwdGlvbnMgYXJyYXkgb2YgcHJvcGVydGllcywgCi0gKiBlc3BlY2lhbGx5IG5vdCBsYXJnZSBvYmplY3RzISBhbmQgZXZlbiBubyB2YWx1ZSB0aGF0IGlzIGFscmVhZHkgdGhlIGRlZmF1bHQgdmFsdWUsIAotICogc2luY2UgdGhvc2UgZGVzY3JpcHRpb24gcHJvcGVydGllcyBhcmUgY2FjaGVkIHBlciBzZXNzaW9uLCBzbyBjYW4gYWRkIHVwIGluIG1lbW9yeS4gCi0gKiA8bGk+UmVtZW1iZXIgdGhhdCBhIENvbnRlbnREZXNjcmliZXIgaW5zdGFuY2UgYmVjb21lcyBhICJyb290IG9iamVjdCIgaW4gdGhlIAotICogQ29udGVudERlc2NyaWJlck1hbmFnZXIgKHRoYXQgaXMsIGFsd2F5cyBpbiBtZW1vcnksIG5ldmVyIEdDJ2QpLCBzbyBpdCBzaG91bGQgCi0gKiBub3QgaGF2ZSBhbnkgaW5zdGFuY2Ugb3Igc3RhdGUgZGF0YSBzaW5jZSBpdCB3b3VsZCBhbHdheXMgYmVjb21lIHN0YWxlIGFuZCAKLSAqICJob2xkIG9uIiB0byBvYmplY3RzIHVubmVjY2Vzc2FyaWx5LiAKLSAqIDwvdWw+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JIVE1MIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQotCWZpbmFsIHByaXZhdGUgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUfTsKLQotCXB1YmxpYyBpbnQgZGVzY3JpYmUoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJLy8gYXNzdW1tbWluZyB3ZSBzaG91bGQgcmV0dXJuIHNhbWUgJ3ZhbGlkaXR5JyB2YWx1ZSB3ZSBkaWQKLQkJCS8vIHdoZW4gY2FsbGVkIGJlZm9yZS4gKHRlY2huaWNhbGx5LCBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGlzc3VlCi0JCQkvLyBpbiBmdXR1cmUsIHNvIG1pZ2h0IHdhbnQgdG8gY2hlY2sgaWYgYW55ICdvbCB2YWx1ZSB3b3VsZAotCQkJLy8gYmUgb2sgaGVyZS4KLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZGVzY3JpYmUoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJCS8vIGFzc3VtbW1pbmcgd2Ugc2hvdWxkIHJldHVybiBzYW1lICd2YWxpZGl0eScgdmFsdWUgd2UgZGlkCi0JCQkvLyB3aGVuIGNhbGxlZCBiZWZvcmUuICh0ZWNobmljYWxseSwgY291bGQgYmUgYSBwZXJmb3JtYW5jZSBpc3N1ZQotCQkJLy8gaW4gZnV0dXJlLCBzbyBtaWdodCB3YW50IHRvIGNoZWNrIGlmIGhhcmQgY29kZWQgJ3ZhbGlkJyB3b3VsZAotCQkJLy8gYmUgb2sgaGVyZS4KLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkvLyBjdXJyZW50bHkgbm8gY29udGVudHMgc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkIEhUTUwgY29udGVudHMKLQkJLy8gKHRoaXMgbWF5IGNoYW5nZSBvbmNlIHdlIGFkZCBYSFRNTCBjb250ZW50IHR5cGUpCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShSZWFkZXIgcmVhZGVyKSB7Ci0JCS8vIGN1cnJlbnRseSBubyBjb250ZW50cyBzcGVjaWZpYyBjaGVjayBmb3IgdmFsaWQgSFRNTCBjb250ZW50cwotCQkvLyAodGhpcyBtYXkgY2hhbmdlIG9uY2Ugd2UgYWRkIFhIVE1MIGNvbnRlbnQgdHlwZSkKLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0KLQkJcmV0dXJuIG5ldyBIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3IpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCS8vIGJ5IHRleHQgdHlwZS4KLQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQnl0ZU9yZGVyTWFyayA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LCBtYXkKLQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBkZXRlY3RlZEJ5dGVPcmRlck1hcmspOwotCQl9Ci0KLQotCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCS8qCi0JCQkgKiBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJICogSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQgaW4gdGhlCi0JCQkgKiByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGludmFsaWQKLQkJCSAqIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucyBhbgotCQkJICogImFwcHJvcHJpYXRlIGRlZmF1bHQiIHRvIHVzZS4KLQkJCSAqLwotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gZGVmYXVsdC50aGUKLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBkZXRlY3Rvci5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMgbmVlZCB0bwotCQkJCQkvLyBhZGQsIEknbSBhc3N1bWluZwotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIE9iamVjdCBkZXRlY3RlZENoYXJzZXQsIE9iamVjdCBqYXZhQ2hhcnNldCkgewotCQkvLyBzaW5jZSBlcXVhbCwgd2UgZG9uJ3QgbmVlZCB0byBhZGQsIGJ1dCBpZiBvdXIgZGV0ZWN0ZWQgdmVyc2lvbiBpcwotCQkvLyBkaWZmZXJlbnQgdGhhbgotCQkvLyBqYXZhQ2hhcnNldCwgdGhlbiB3ZSBzaG91bGQgYWRkIGl0LiBUaGlzIHdpbGwgaGFwcGVuLCBmb3IgZXhhbXBsZSwKLQkJLy8gaWYgdGhlcmUncwotCQkvLyBkaWZmZXJlbmNlcyBpbiBjYXNlLCBvciBkaWZmZXJlbmNlcyBkdWUgdG8gb3ZlcnJpZGUgcHJvcGVydGllcwotCQlpZiAoZGV0ZWN0ZWRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCS8vIGlmICghZGV0ZWN0ZWRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCS8vIGRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULAotCQkJLy8gZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJCS8vIH0KLQotCQkJLy8gT25jZSB3ZSBkZXRlY3RlZCBhIGNoYXJzZXQsIHdlIHNob3VsZCBzZXQgdGhlIHByb3BlcnR5IGV2ZW4KLQkJCS8vIHRob3VnaCBpdCdzIHRoZSBzYW1lIGFzIGphdmFDaGFyc2V0Ci0JCQkvLyBiZWNhdXNlIHRoZXJlIGFyZSBjbGllbnRzIHRoYXQgcmVseSBvbiB0aGlzIHByb3BlcnR5IHRvCi0JCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGNoYXJzZXQgaXMgYWN0dWFsbHkgZGV0ZWN0ZWQgaW4gZmlsZSBvciBub3QuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmVudChJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQkvLyBlbHNlIGlmCi0JCS8vIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuRU5DT0RJTkdfTUVNRU5UTykpCi0JCS8vIHJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNDY0MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIAotICogVGhpcyBpcyBwb3J0ZWQgZnJvbSBQYWdlRGVzaWduZXIncyBocGJjb20vS2FuamkuY3BwJ3MKLSAqIEthbmppOjpndWVzc19rYW5qaV9jb2RlKCksCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ0d1ZXNzZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSSA9IDA7IC8vIEFTQ0lJCi0JLy8gSVNPLTIwMjItSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUlfSU4gPSA4OyAvLyBUaGlzIGlzIGFmdGVyIElTTzIwMjIncyBjaGFuZ2UKLQkvLyBTaGlmdC1KSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVVDX0hBTEZLQU5BID0gNjsgLy8gVGhpcyBpcyBIYWxmIEthbmEgaW4gRVVDLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVVQ19KUCA9IDM7IC8vIFRoaXMgaXMgRVVDLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTTzIwMjJfSlAgPSA0OyAvLyBUaGlzIGlzIElTTy0yMDIyLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpJU19IQUxGS0FOQSA9IDc7IC8vIFRIaXMgaXMgSGFsZiBLYW5hIGluCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FVUMxID0gMHg0MDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VVQzIgPSAoYnl0ZSkgMHg4MDsKLQkvLyBBU0NJSQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSklOID0gMHgwMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pPVVQgPSAweDAyOwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVNDID0gMHgwNDsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pJUyA9IDB4MDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9TRlQxID0gMHgxMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX1NGVDIgPSAweDIwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga3R5cGVbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAwMCAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDEwICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgLyogISIjJCUmJyAqLy8qICIgKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiAoKSorLC0uLyAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qIDAxMjM0NTY3ICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogODk6OyA8PT4/ICovCi0JMHgyOSwgMHgyOCwgMHgyYiwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogQEFCQ0RFRkcgKi8KLQkweDJhLCAweDI4LCAweDJhLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBISUpLTE1OTyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIFBRUlNUVVZXICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogWFlaW1xdXl8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBhYmNkZWZnICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogaGlqa2xtbm8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBwcXJzdHV2dyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MDAsIC8qIHh5ent8fX4gKi8KLQkweDIwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAvKiA4MCAqLwotCTB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIC8qIDkwICovCi0JMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgyMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEEwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEIwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEMwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEQwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIC8qIEUwICovCi0JKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIC8qIEYwICovCi0JKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4YzAsIDB4MDAsfTsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNPODg1OV8xID0gMTsgLy8gSVNPLTEKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hJRlRfSklTID0gMjsgLy8gVGhpcyBpcyBTaGlmdC1KSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0pJU19IQUxGS0FOQSA9IDU7IC8vIFRoaXMgaXMgSGFsZiBLYW5hIGluCi0KLQkvKioKLQkgKiBDdXJyZW50bHksIG9ubHkgSmFwYW5lc2UgZW5jb2RpbmdzIGFyZSBzdXBwb3J0ZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAtMTsgLy8gVW5rbm93bgotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIGludAotCSAqIAotCSAqIENvbnZlcnQgcHJpdmF0ZSBpbnQgdG8gSUFOQSBFbmNvZGluZyBuYW1lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9JQU5BRW5jb2RpbmdOYW1lKGludCBjb2RlKSB7Ci0JCVN0cmluZyBlbmNvZGluZyA9IG51bGw7Ci0KLQkJc3dpdGNoIChjb2RlKSB7Ci0JCQljYXNlIFNISUZUX0pJUyA6Ci0JCQljYXNlIFNKSVNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIlNoaWZ0X0pJUyI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBFVUNfSlAgOgotCQkJY2FzZSBFVUNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIkVVQy1KUCI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBJU08yMDIyX0pQIDoKLQkJCWNhc2UgSklTX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJJU08tMjAyMi1KUCI7Ly8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGd1ZXNzZWQgSmF2YSBFbmNvZGluZyBuYW1lIHRhcmdldDogYnl0ZXMgdG8gYmUgaW5zcGVjdGVkIGxlbmd0aDoKLQkgKiBsZW5ndGggb2YgdGFyZ2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3Vlc3NFbmNvZGluZyhieXRlW10gdGFyZ2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBjb2RlID0gVU5LTk9XTjsKLQotCQkvLyBDdXJyZW50bHksIG9ubHkgSmFwYW5lc2UgaXMgc3VwcG9ydGVkLgotCQlTdHJpbmcgc3lzdGVtX2N0eXBlID0gamF2YS51dGlsLkxvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGpwX2N0eXBlID0gamF2YS51dGlsLkxvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpOwotCQlpZiAoc3lzdGVtX2N0eXBlLmNvbXBhcmVUbyhqcF9jdHlwZSkgPT0gMCkgewotCQkJLy8gT2ssIEknbSB1bmRlciBqYV9KUC4KLQkJCWNvZGUgPSBBU0NJSTsKLQkJCWludCBwb3MgPSAwOwotCQkJd2hpbGUgKChjb2RlID09IEFTQ0lJKSAmJiAobGVuZ3RoID4gMCkpIHsKLQkJCQlpbnQgY2gxID0gdGFyZ2V0W3Bvc107Ci0JCQkJY2gxID0gY2gxICYgMHgwMDAwMDBGRjsKLQkJCQlpbnQgY2gyID0gKGxlbmd0aCA+PSAyKSA/IHRhcmdldFtwb3MgKyAxXSA6IDA7Ci0JCQkJY2gyID0gY2gyICYgMHgwMDAwMDBGRjsKLQkJCQlpbnQgY2gzID0gKGxlbmd0aCA+PSAzKSA/IHRhcmdldFtwb3MgKyAyXSA6IDA7Ci0JCQkJY2gzID0gY2gzICYgMHgwMDAwMDBGRjsKLQkJCQljb2RlID0gZ3Vlc3NKYXBhbmVzZUthbmppQ29kZShjaDEsIGNoMiwgY2gzLCAwKTsKLQkJCQlwb3MrKzsKLQkJCQlsZW5ndGgtLTsKLQkJCX0KLQkJCXN3aXRjaCAoY29kZSkgewotCQkJCWNhc2UgSVNPMjAyMl9KUCA6Ci0JCQkJY2FzZSBKSVNfSEFMRktBTkEgOgotCQkJCQljb2RlID0gSVNPMjAyMl9KUDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBFVUNfSlAgOgotCQkJCQljb2RlID0gRVVDX0pQOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJY29kZSA9IFNISUZUX0pJUzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKGNvbnZlcnRUb0lBTkFFbmNvZGluZ05hbWUoY29kZSkpOwotCX0KLQotCS8qKgotCSAqIEd1ZXNzIHRoZSBlbmNvZGluZy4gaGFsZmthbmFfZmxhZyA9IDB4MDEgKCBkZXRlY3QgU0pJUyBoYWxmIGthbmEgKQotCSAqIGhhbGZrYW5hX2ZsYWcgPSAweDAyICggZGV0ZWN0IEVVQyBoYWxmIGthbmEgKQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBndWVzc0phcGFuZXNlS2FuamlDb2RlKGludCBjaDEsIGludCBjaDIsIGludCBjaDMsIGludCBoYWxma2FuYV9mbGFnKSB7Ci0JCWJvb2xlYW4gc2ppc19oYW5rYWt1X2ZsYWcgPSAoKGhhbGZrYW5hX2ZsYWcgJiAweDAxKSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQkJYm9vbGVhbiBldWNfaGFua2FrdV9mbGFnID0gKChoYWxma2FuYV9mbGFnICYgMHgwMikgIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0KLQkJaWYgKGNoMSA9PSAwKQotCQkJcmV0dXJuIFVOS05PV047Ci0JCWlmIChzamlzX2hhbmtha3VfZmxhZyAmJiBjaDEgPj0gMHhhMSAmJiBjaDEgPD0gMHhkZikKLQkJCXJldHVybiBTSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChldWNfaGFua2FrdV9mbGFnICYmIGNoMSA9PSAweDhlICYmIGNoMiA+PSAweGExICYmIGNoMiA8PSAweGRmKQotCQkJcmV0dXJuIEVVQ19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoKChrdHlwZVtjaDFdICYgS1RfU0ZUMSkgIT0gMCkgJiYgKChrdHlwZVtjaDJdICYgS1RfU0ZUMikgIT0gMCkpCi0JCQlyZXR1cm4gU0hJRlRfSklTOwotCQllbHNlIGlmICgoKGt0eXBlW2NoMV0gJiBLVF9FVUMxKSAhPSAwKSAmJiAoKGt0eXBlW2NoMl0gJiBLVF9FVUMyKSAhPSAwKSkKLQkJCXJldHVybiBFVUNfSlA7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmICgoa3R5cGVbY2gyXSAmIEtUX0pJTikgIT0gMCkpCi0JCQlyZXR1cm4gSVNPMjAyMl9KUDsKLQkJZWxzZSBpZiAoY2gxID49IDB4YTEgJiYgY2gxIDw9IDB4ZGYpCi0JCQlyZXR1cm4gU0pJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgY2gyID09IDB4MjgvKiAnKCcgKi8mJiBjaDMgPT0gMHg0OS8qICdJJyAqLykKLQkJCXJldHVybiBKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmIGNoMiA9PSAweDI4LyogJygnICovJiYgKChrdHlwZVtjaDNdICYgS1RfSk9VVCkgIT0gMCkpCi0JCQlyZXR1cm4gQVNDSUlfSU47Ci0KLQkJcmV0dXJuIEFTQ0lJOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ0d1ZXNzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwMDY5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ODEgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gNy8yOC8wOCA1OjE5IFBNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiA3LzI4LzA4IDU6MTkgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovd29ya3NwYWNlcy93dHAzMDEvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qRmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MSGVhZFRva2VuaXplciB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX01FVEFfVEFHID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRDaGFyc2V0ID0gMTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxEZWNsID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotCi0gIC8qKgotICAgKiBZWV9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBZWV9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBZWV9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA4LCA4Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxXDExXDEwXDBcMVw2XDFcN1wyXDBcMVwxMFwyMlwwXDFcNlwxXDBcMVw0MCIrCi0gICAgIlwyXDBcMVw0NFwxXDBcMVw0M1w1XDBcMVwzNFwxXDBcMVw0MlwxM1wwXDFcNDUiKwotICAgICJcMVwxM1wxXDEyXDFcMzFcMVwxNFwxXDBcMVwyMlwxXDBcMVwyNFwxXDI2XDFcMjAiKwotICAgICJcMVwwXDFcMzBcMVwzMlwxXDI3XDJcMFwxXDE3XDFcMTZcMVwyM1wxXDI1XDFcMzMiKwotICAgICJcMVwzNVwyXDBcMVwyMVwxXDM2XDFcMzdcMVwwXDFcMTVcMVw0MVw3XDBcMVwyMiIrCi0gICAgIlwxXDBcMVwyNFwxXDI2XDFcMjBcMVwwXDFcMzBcMVwzMlwxXDI3XDJcMFwxXDE3IisKLSAgICAiXDFcMTZcMVwyM1wxXDI1XDFcMzNcMVwzNVwyXDBcMVwyMVwxXDM2XDFcMzdcMVwwIisKLSAgICAiXDFcMTVcMVw0MVwxMDFcMFwxXDRcM1wwXDFcNVwxN1wwXDFcM1wxNlwwXDFcMSIrCi0gICAgIlwyMFwwXDFcM1wxNlwwXDFcMVwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotLy8gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0vLyAgcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0JYm9vbGVhbiBmb3VuZENvbnRlbnRUeXBlVmFsdWUgPSBmYWxzZTsKLQotCi0KLQlwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLwotCSAgCXl5X3JlYWRlciA9IGluOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAJCXl5X3N0YXRlID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIAkJeXlfbWFya2VkUG9zID0gMDsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqIAotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAJCSAqIGZyb20gaW5wdXQgCi0gIAkJICovCi0gIAkJeXlfZW5kUmVhZCA9IDA7Ci0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0vLyAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLSAgCQkKLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxNzYpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0KLS8vICAgIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIHl5X3B1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0gICAgICB5eV93YXNfcHVzaGJhY2sgPSBmYWxzZTsKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5Y21hcFt5eV9pbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHl5X3B1c2hiYWNrID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgeXlfZm9yTmV4dDogeyBzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgICAgICAgY2FzZSAzNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3B1c2hiYWNrUG9zID0geXlfY3VycmVudFBvczsgeXlfcHVzaGJhY2sgPSB0cnVlOyB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA1NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA1NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9zdGF0ZSA9IDYyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDYzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDY0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDY4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA2ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDY5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfc3RhdGUgPSA3MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA3NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9zdGF0ZSA9IDczOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzY6IHl5X3N0YXRlID0gNzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9zdGF0ZSA9IDczOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfcHVzaGJhY2sgPSB0cnVlOyB5eV9zdGF0ZSA9IDgxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDU0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gOTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gOTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA2NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA5NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDY3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDk1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA2ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDY5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA3NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3B1c2hiYWNrID0gdHJ1ZTsgeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9wdXNoYmFjayA9IHRydWU7IHl5X3N0YXRlID0gOTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfcHVzaGJhY2sgPSB0cnVlOyB5eV9zdGF0ZSA9IDgxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA4NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDEwMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDg5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDEwMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gOTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTAzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gMTA0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA5NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSAxMDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDY4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3B1c2hiYWNrID0gdHJ1ZTsgeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gODI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDEwMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTA3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDEwMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gMTEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gMTA0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfc3RhdGUgPSAxMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSAxMDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDExMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDExNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDExMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDExNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9zdGF0ZSA9IDExMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTE4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X3N0YXRlID0gMTE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X3N0YXRlID0gMTE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSAxMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X3N0YXRlID0gMTE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSAxMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSAxMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9zdGF0ZSA9IDEyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSAxMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDEyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9zdGF0ZSA9IDEyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X3N0YXRlID0gMTMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gMTI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X3N0YXRlID0gMTMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfc3RhdGUgPSAxMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfc3RhdGUgPSAxMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9zdGF0ZSA9IDE0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDEyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHl5X3N0YXRlID0gMTQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAxNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAxNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDE0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gMTQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X3N0YXRlID0gMTQ3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSAxNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSAxNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSAxNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSAxNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gMTUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gMTQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSAxNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE1MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDE1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gMTUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gMTQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gMTUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSAxNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSAxNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE1NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDE1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDE1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTU4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gMTU5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gMTU5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSAxNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSAxNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTYxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE2MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDE2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDE2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTY0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfc3RhdGUgPSAxNjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfc3RhdGUgPSAxNjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE2ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDE2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDE2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTcwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gMTcxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gMTcxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSAxNzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE3NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDE3NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDE3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9zdGF0ZSA9IDE3NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTc3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxNzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSAxNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTc5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gMTgwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxODE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSAxNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSAxODA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE4MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDE4MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDE3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDE4MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTg0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxODY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSAxODc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSAxODc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDE4ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDE4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDE4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTkwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gMTkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxOTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTk0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gMTkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHl5X2lzRmluYWwgKSB7Ci0gICAgICAgICAgICB5eV93YXNfcHVzaGJhY2sgPSB5eV9wdXNoYmFjazsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCB5eV9ub0xvb2tBaGVhZCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfd2FzX3B1c2hiYWNrKQotICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvczsKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTk4OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSA2OTogCi0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0gICAgICAgIGNhc2UgMTk5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgIGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7IH0KLSAgICAgICAgY2FzZSAyMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAyMDE6IGJyZWFrOwotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSA5NTogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyBpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKSBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kOyB9Ci0gICAgICAgIGNhc2UgMjAyOiBicmVhazsKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDIwMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9IH0KLSAgICAgICAgY2FzZSAyMDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICAgIHsgaWYoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fSB9Ci0gICAgICAgIGNhc2UgMjA1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX01FVEFfVEFHKTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdTdGFydDsgfQotICAgICAgICBjYXNlIDIwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDkwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7IH0KLSAgICAgICAgY2FzZSAyMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IGZvdW5kQ29udGVudFR5cGVWYWx1ZT10cnVlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0NvbnRlbnRUeXBlOyB9Ci0gICAgICAgIGNhc2UgMjA4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzM6IAotICAgICAgICBjYXNlIDEzNzogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsgfQotICAgICAgICBjYXNlIDIwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NOyB9Ci0gICAgICAgIGNhc2UgMjEwOiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOyB9Ci0gICAgICAgIGNhc2UgMjExOiBicmVhazsKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFOyB9Ci0gICAgICAgIGNhc2UgMjEyOiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMjEzOiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgICB7ICBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyAgfQotICAgICAgICBjYXNlIDIxNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMjE1OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgNzA6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSAyMTY6IGJyZWFrOwotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMjE3OiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgICB7ICBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRDaGFyc2V0KTsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSAyMTg6IGJyZWFrOwotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHBvcFN0YXRlKCk7ICB9Ci0gICAgICAgIGNhc2UgMjE5OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOGJjZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cyB7Ci0KLQlTdHJpbmcgTWV0YVRhZ0VuZCA9ICJNZXRhVGFnRW5kIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNZXRhVGFnU3RhcnQgPSAiTWV0YVRhZ1N0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBNZXRhVGFnQ29udGVudFR5cGUgPSAiTWV0YVRhZ0NvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNjdlNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJpdmF0ZSBIVE1MSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCi0JLyoqCi0JICogVGhlcmUgaXMgbm8gc3BlYyBkZWZpbmVkIGVuY29kaW5nIGZvciBIVE1MIChoaXN0b3JpY2FsbHkpLCBzbyBudWxsIGlzCi0JICogcmV0dXJuZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFIHx8IHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCQlieXRlW10gYm9tID0gKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSA/IElDb250ZW50RGVzY3JpcHRpb24uQk9NX1VURl8xNkJFIDogSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzE2TEU7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVuaWNvZGVTdHJlYW0odHJ1ZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldFVuaWNvZGVCT00oYm9tKTsKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9rZW5pemVyLgotCSAqLwotCXByaXZhdGUgSFRNTEhlYWRUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQkvLyBUT0RPOiBuZWVkIHRvIHdvcmsgb24gJ3Jlc2V0JyBpbiB0b2tlbml6ZXIsIHNvIG5ldyBpbnN0YW5jZSBpc24ndAotCQkvLyBhbHdheXMgbmVlZGVkCi0JCS8vaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQlmVG9rZW5pemVyID0gbmV3IEhUTUxIZWFkVG9rZW5pemVyKCk7Ci0JCS8vCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlZ2FsU3RyaW5nKFN0cmluZyB2YWx1ZVRva2VuVHlwZSkgewotCQlpZiAodmFsdWVUb2tlblR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoZWNrSW5Db250ZW50KCk7Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWNoZWNrSGV1cmlzdGljcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0hldXJpc3RpY3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlib29sZWFuIG5vSGV1cmlzdGljID0gZmFsc2U7Ci0JCVN0cmluZyBoZXVyaXN0aWNFbmNvZGluZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW0NvZGVkSU8uTUFYX01BUktfU0laRV07Ci0JCQlpbnQgblJlYWQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmUmVhZGVyLnJlYWR5KCkpIHsKLQkJCQkJaW50IG9uZUJ5dGUgPSBmUmVhZGVyLnJlYWQoKTsKLQkJCQkJblJlYWQrKzsKLQkJCQkJaWYgKG9uZUJ5dGUgPD0gMHhGRikgewotCQkJCQkJYnl0ZXNbaV0gPSAoYnl0ZSkgb25lQnl0ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW5vSGV1cmlzdGljID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW5vSGV1cmlzdGljKSB7Ci0JCQkJaGV1cmlzdGljRW5jb2RpbmcgPSBFbmNvZGluZ0d1ZXNzZXIuZ3Vlc3NFbmNvZGluZyhieXRlcywgblJlYWQpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBhbnkgSU8gZXhjZXB0aW9uLCB0aGVuIG5vdCBhIGhldXJpc3RpYyBjYXNlCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCX0KLQkJaWYgKGhldXJpc3RpY0VuY29kaW5nICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhoZXVyaXN0aWNFbmNvZGluZywgRW5jb2RpbmdNZW1lbnRvLkdVRVNTRURfRU5DT0RJTkdfRlJPTV9TVFJFQU0pOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tJbkNvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlIVE1MSGVhZFRva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tlbml6ZXIoKTsKLQkJdG9rZW5pemVyLnJlc2V0KGZSZWFkZXIpOwotCQlIZWFkUGFyc2VyVG9rZW4gdG9rZW4gPSBudWxsOwotCQlTdHJpbmcgdG9rZW5UeXBlID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlVmFsdWUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkgewotCQkJCS8vIHNpZGUgZWZmZWN0IG9mIGNhbkhhbmRsZSBpcyB0byBjcmVhdGUgYXBwcm9wcmlhdGUKLQkJCQkvLyBtZW1lbnRvCi0JCQl9Ci0JCQllbHNlIGlmICh0b2tlblR5cGUgPT0gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0NvbnRlbnRUeXBlKSB7Ci0JCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJSGVhZFBhcnNlclRva2VuIHZhbHVlVG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCWNvbnRlbnRUeXBlVmFsdWUgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpOwotCQlpZiAoY29udGVudFR5cGVWYWx1ZSAhPSBudWxsKSB7Ci0JCQlwYXJzZUNvbnRlbnRUeXBlVmFsdWUoY29udGVudFR5cGVWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDb250ZW50VHlwZVZhbHVlKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlTdHJpbmcgY2hhcnNldCA9IG51bGw7Ci0JCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiO1xccypjaGFyc2V0XFxzKj1cXHMqIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gcGFydHMgPSBwYXR0ZXJuLnNwbGl0KGNvbnRlbnRUeXBlKTsKLQkJaWYgKHBhcnRzLmxlbmd0aCA+IDApIHsKLQkJCS8vIGlmIG9ubHkgb25lIGl0ZW0sIGl0IGNhbiBzdGlsbCBiZSBjaGFyc2V0IGluc3RlYWQgb2YKLQkJCS8vIGNvbnRlbnRUeXBlCi0JCQlpZiAocGFydHMubGVuZ3RoID09IDEpIHsKLQkJCQlpZiAocGFydHNbMF0ubGVuZ3RoKCkgPiA2KSB7Ci0JCQkJCVN0cmluZyBjaGVja0ZvckNoYXJzZXQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoMCwgNyk7Ci0JCQkJCWlmIChjaGVja0ZvckNoYXJzZXQuZXF1YWxzSWdub3JlQ2FzZSgiY2hhcnNldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWludCBlcXBvcyA9IHBhcnRzWzBdLmluZGV4T2YoJz0nKTsKLQkJCQkJCWVxcG9zID0gZXFwb3MgKyAxOwotCQkJCQkJaWYgKGVxcG9zIDwgcGFydHNbMF0ubGVuZ3RoKCkpIHsKLQkJCQkJCQljaGFyc2V0ID0gcGFydHNbMF0uc3Vic3RyaW5nKGVxcG9zKTsKLQkJCQkJCQljaGFyc2V0ID0gY2hhcnNldC50cmltKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvL2ZDb250ZW50VHlwZSA9IHBhcnRzWzBdOwotCQkJfQotCQl9Ci0JCWlmIChwYXJ0cy5sZW5ndGggPiAxKSB7Ci0JCQljaGFyc2V0ID0gcGFydHNbMV0udHJpbSgpOwotCQl9Ci0JCQotCQlpZiAoY2hhcnNldCAhPSBudWxsICYmIGNoYXJzZXQubGVuZ3RoKCkgPiAwKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCwgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTkwYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiOGJhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKgotICogCi0gKiBBIG5vbi1yZXNpemFibGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciBvZiBqYXZhLnV0aWwuU3RhY2ssIGJ1dAotICogZGlyZWN0bHkgZm9yIHRoZSA8Y29kZT4gaW50ZWdlciA8L2NvZGU+IHByaW1pdGl2ZS4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW50U3RhY2sgewotCXByaXZhdGUgaW50W10gbGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBJbnRTdGFjaygpIHsKLQkJdGhpcygxMDApOwotCX0KLQotCXB1YmxpYyBJbnRTdGFjayhpbnQgbWF4ZGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbGlzdCA9IG5ldyBpbnRbbWF4ZGVwdGhdOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldChpbnQgc2xvdCkgewotCQlyZXR1cm4gbGlzdFtzbG90XTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QubGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL051bGxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMjRjMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL051bGxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gRW5jb2RpbmdNZW1lbnRvIChpdHMgc3VwZXIgY2xhc3MpLAotICogd2hlbiB0aGVyZSBpcyBub3QgaW4gZmFjdCBBTlkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB3aGVuIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBTdHJpbmcKLSAqLwotcHVibGljIGNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIE51bGxNZW1lbnRvKCkgewotCQlzdXBlcigpOwotCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldEFwcHJvcHJpYXRlRGVmYXVsdChkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NU3R5bGVNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01TdHlsZU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzJkZTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01TdHlsZU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NTW9kZWxJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIEBhdXRob3IgZGF2aWR3Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERPTVN0eWxlTW9kZWxJbXBsIGV4dGVuZHMgRE9NTW9kZWxJbXBsIHsKLQlwdWJsaWMgRE9NU3R5bGVNb2RlbEltcGwoKSB7Ci0JCS8vIHJlbWVtYmVyLCB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBzdXBlciBjb25zdHJ1Y3RvciwgCi0JCS8vIHZpYSBpbnRlcm5hbENyZWF0ZURvY3VtZW50Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21FZGl0KCkgewotCQlyZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJc3VwZXIucmVsZWFzZUZyb21FZGl0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21SZWFkKCkgewotCQlyZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJc3VwZXIucmVsZWFzZUZyb21SZWFkKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbGVhc2VTdHlsZVNoZWV0cygpIHsKLQkJaWYgKCFpc1NoYXJlZCgpKSB7Ci0JCQlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIERvY3VtZW50U3R5bGVJbXBsKSB7Ci0JCQkJKChEb2N1bWVudFN0eWxlSW1wbCkgZG9jKS5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZURvY3VtZW50IG1ldGhvZAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgaW50ZXJuYWxDcmVhdGVEb2N1bWVudCgpIHsKLQkJRG9jdW1lbnRTdHlsZUltcGwgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnRTdHlsZUltcGwoKTsKLQkJZG9jdW1lbnQuc2V0TW9kZWwodGhpcyk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50U3R5bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRTdHlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhOTM4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRTdHlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5Eb2N1bWVudENTUzsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGRhdmlkdwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFN0eWxlSW1wbCBleHRlbmRzIERvY3VtZW50SW1wbCBpbXBsZW1lbnRzIElET01Eb2N1bWVudCwgRG9jdW1lbnRDU1MgewotCXB1YmxpYyBEb2N1bWVudFN0eWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnRTdHlsZUltcGwoRG9jdW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChJU3R5bGVTaGVldExpc3RBZGFwdGVyKSBhZGFwdGVyKS5nZXRPdmVycmlkZVN0eWxlKGVsZW1lbnQsIHBzZXVkb05hbWUpOwotCX0KLQotCXB1YmxpYyBTdHlsZVNoZWV0TGlzdCBnZXRTdHlsZVNoZWV0cygpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIpIGFkYXB0ZXIpLmdldFN0eWxlU2hlZXRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVN0eWxlU2hlZXRzKCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChJU3R5bGVTaGVldExpc3RBZGFwdGVyKSBhZGFwdGVyKS5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVFbGVtZW50IG1ldGhvZAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hlY2tUYWdOYW1lVmFsaWRpdHkodGFnTmFtZSk7Ci0KLQkJRWxlbWVudFN0eWxlSW1wbCBlbGVtZW50ID0gbmV3IEVsZW1lbnRTdHlsZUltcGwoKTsKLQkJZWxlbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQllbGVtZW50LnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcCBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlEb2N1bWVudFN0eWxlSW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRTdHlsZUltcGwodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVkLmltcG9ydENoaWxkTm9kZXModGhpcywgdHJ1ZSk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSURPTU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyLnNldE1vZGVsKG1vZGVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudFN0eWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRTdHlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlMDNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudFN0eWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkVsZW1lbnRDU1NJbmxpbmVTdHlsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5MaW5rU3R5bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLQotcHVibGljIGNsYXNzIEVsZW1lbnRTdHlsZUltcGwgZXh0ZW5kcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElET01FbGVtZW50LCBFbGVtZW50Q1NTSW5saW5lU3R5bGUsIExpbmtTdHlsZSB7Ci0JcHVibGljIEVsZW1lbnRTdHlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnRTdHlsZUltcGwoRWxlbWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgU3R5bGVTaGVldCBnZXRTaGVldCgpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZVNoZWV0QWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoSVN0eWxlU2hlZXRBZGFwdGVyKSBhZGFwdGVyKS5nZXRTaGVldCgpOwotCX0KLQotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXJGb3IoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpIGFkYXB0ZXIpLmdldFN0eWxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXN1cGVyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlzdXBlci5zZXRUYWdOYW1lKHRhZ05hbWUpOwotCX0KLQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRWxlbWVudEltcGwgY2xvbmVkID0gbmV3IEVsZW1lbnRTdHlsZUltcGwodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTENvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjZmNjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29udmVydGVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElET01Nb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlIVE1MQ2xlYW51cFByb2Nlc3NvckltcGwgcHJvY2Vzc29yID0gbmV3IEhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbCgpOwotCQlJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBwcmVmID0gcHJvY2Vzc29yLmdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCi0JCS8vIGJhY2t1cCBvcHRpb25zCi0JCWJvb2xlYW4gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzID0gcHJlZi5nZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoKTsKLQkJYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzID0gcHJlZi5nZXRJbnNlcnRSZXF1aXJlZEF0dHJzKCk7Ci0JCWJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MgPSBwcmVmLmdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0JCWJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzID0gcHJlZi5nZXRRdW90ZUF0dHJWYWx1ZXMoKTsKLQkJYm9vbGVhbiBmb3JtYXRTb3VyY2UgPSBwcmVmLmdldEZvcm1hdFNvdXJjZSgpOwotCQlpbnQgdGFnTmFtZUNhc2UgPSBwcmVmLmdldFRhZ05hbWVDYXNlKCk7Ci0JCWludCBhdHRyTmFtZUNhc2UgPSBwcmVmLmdldEF0dHJOYW1lQ2FzZSgpOwotCi0JCS8vIHNldHVwIG9wdGlvbnMKLQkJcHJlZi5zZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3ModHJ1ZSk7Ci0JCXByZWYuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyh0cnVlKTsKLQkJcHJlZi5zZXRJbnNlcnRNaXNzaW5nVGFncyh0cnVlKTsKLQkJcHJlZi5zZXRRdW90ZUF0dHJWYWx1ZXModHJ1ZSk7Ci0JCXByZWYuc2V0Rm9ybWF0U291cmNlKGZhbHNlKTsKLQkJaWYgKG1vZGVsLmdldERvY3VtZW50KCkuaXNYTUxUeXBlKCkpIHsgLy8gWEhUTUwKLQkJCXByZWYuc2V0VGFnTmFtZUNhc2UoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQkJcHJlZi5zZXRBdHRyTmFtZUNhc2UoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQl9Ci0JCWVsc2UgewotCQkJcHJlZi5zZXRUYWdOYW1lQ2FzZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJCXByZWYuc2V0QXR0ck5hbWVDYXNlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQl9Ci0KLQkJcHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0KLQkJLy8gc2V0IGJhY2sgb3B0aW9ucwotCQlwcmVmLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MpOwotCQlwcmVmLnNldEluc2VydFJlcXVpcmVkQXR0cnMoaW5zZXJ0UmVxdWlyZWRBdHRycyk7Ci0JCXByZWYuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MoaW5zZXJ0TWlzc2luZ1RhZ3MpOwotCQlwcmVmLnNldFF1b3RlQXR0clZhbHVlcyhxdW90ZUF0dHJWYWx1ZXMpOwotCQlwcmVmLnNldEZvcm1hdFNvdXJjZShmb3JtYXRTb3VyY2UpOwotCQlwcmVmLnNldFRhZ05hbWVDYXNlKHRhZ05hbWVDYXNlKTsKLQkJcHJlZi5zZXRBdHRyTmFtZUNhc2UoYXR0ck5hbWVDYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWNsYXJhdG9pbjogImRhdGEiIGZvciBYTUwgZGVjbGFyYXRpb24sIHN1Y2ggYXMgInZlcnNpb249XCIxLjBcIiIKLQkgKiBwdWJsaWNJZDogcHVibGljSWQgZm9yIERPQ1RZUEUgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb252ZXJ0KElET01Nb2RlbCBtb2RlbCwgU3RyaW5nIGRlY2xhcmF0aW9uLCBTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXNldERlY2xhcmF0aW9uKG1vZGVsLCBkZWNsYXJhdGlvbiwgcHVibGljSWQpOwotCQljbGVhbnVwTW9kZWwobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIGRlY2xhcmF0b2luOiAiZGF0YSIgZm9yIFhNTCBkZWNsYXJhdGlvbiwgc3VjaCBhcyAidmVyc2lvbj1cIjEuMFwiIgotCSAqIHB1YmxpY0lkOiBwdWJsaWNJZCBmb3IgRE9DVFlQRSBkZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnZlcnQoSW5wdXRTdHJlYW0gaW5wdXQsIE91dHB1dFN0cmVhbSBvdXRwdXQsIFN0cmluZyBkZWNsYXJhdGlvbiwgU3RyaW5nIHB1YmxpY0lkKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRE9NTW9kZWwgbW9kZWwgPSByZWFkTW9kZWwoaW5wdXQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWNvbnZlcnQobW9kZWwsIGRlY2xhcmF0aW9uLCBwdWJsaWNJZCk7Ci0JCQl3cml0ZU1vZGVsKG1vZGVsLCBvdXRwdXQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBkZWNsYXJhdG9pbjogImRhdGEiIGZvciBYTUwgZGVjbGFyYXRpb24sIHN1Y2ggYXMgInZlcnNpb249XCIxLjBcIiIKLQkgKiBwdWJsaWNJZDogcHVibGljSWQgZm9yIERPQ1RZUEUgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb252ZXJ0KElGaWxlIGZpbGUsIFN0cmluZyBkZWNsYXJhdGlvbiwgU3RyaW5nIHB1YmxpY0lkKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRE9NTW9kZWwgbW9kZWwgPSByZWFkTW9kZWwoZmlsZSk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJY29udmVydChtb2RlbCwgZGVjbGFyYXRpb24sIHB1YmxpY0lkKTsKLQkJCXdyaXRlTW9kZWwobW9kZWwsIGZpbGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluc2VydEJyZWFrKElET01Nb2RlbCBtb2RlbCwgTm9kZSBub2RlKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybjsKLQotCQkvLyBnZXQgZGVsaW1pdGVyIHN0cmluZwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBkZWxpbSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCWlmIChkZWxpbSA9PSBudWxsIHx8IGRlbGltLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlEb2N1bWVudCBkb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVGV4dCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGVsaW0pOwotCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRleHQsIG5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSURPTU1vZGVsIHJlYWRNb2RlbChJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gY3JlYXRlIHRlbXBvcmFyeSBtb2RlbAotCQlTdHJpbmcgaWQgPSBpbnB1dC50b1N0cmluZygpICsgIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoaWQsIGlucHV0LCBudWxsKTsKLQkJaWYgKCEobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSURPTU1vZGVsKSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElET01Nb2RlbCByZWFkTW9kZWwoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCWlmICghKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElET01Nb2RlbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVjbGFyYXRpb24oSURPTU1vZGVsIG1vZGVsLCBTdHJpbmcgZGVjbGFyYXRpb24sIFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkgPSBudWxsOwotCQkJTm9kZSBjaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCQlTdHJpbmcgdGFyZ2V0ID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmVxdWFscygieG1sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIGNoaWxkOwotCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJSURPTURvY3VtZW50VHlwZSBkb2NUeXBlID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQotCQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAocGkgIT0gbnVsbCkgewotCQkJCQlwaS5zZXREYXRhKGRlY2xhcmF0aW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXBpID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ4bWwiLCBkZWNsYXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKHBpLCBjaGlsZCk7Ci0JCQkJCWluc2VydEJyZWFrKG1vZGVsLCBjaGlsZCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocHVibGljSWQgIT0gbnVsbCkgewotCQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVudHJ5KHB1YmxpY0lkKTsKLQkJCQlTdHJpbmcgbmFtZSA9IChlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0TmFtZSgpIDogbnVsbCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApCi0JCQkJCW5hbWUgPSAiSFRNTCI7IC8vIGRlZmF1bHQgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKCFuYW1lLmVxdWFscyhkb2NUeXBlLmdldE5hbWUoKSkpIHsgLy8gcmVwbGFjZQotCQkJCQkJTm9kZSBwYXJlbnQgPSBkb2NUeXBlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWNoaWxkID0gZG9jVHlwZTsKLQkJCQkJCWRvY1R5cGUgPSAoSURPTURvY3VtZW50VHlwZSkgZG9jdW1lbnQuY3JlYXRlRG9jdHlwZShuYW1lKTsKLQkJCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoZG9jVHlwZSwgY2hpbGQpOwotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZG9jVHlwZSA9IChJRE9NRG9jdW1lbnRUeXBlKSBkb2N1bWVudC5jcmVhdGVEb2N0eXBlKG5hbWUpOwotCQkJCQlkb2N1bWVudC5pbnNlcnRCZWZvcmUoZG9jVHlwZSwgY2hpbGQpOwotCQkJCQlpbnNlcnRCcmVhayhtb2RlbCwgY2hpbGQpOwotCQkJCX0KLQkJCQlkb2NUeXBlLnNldFB1YmxpY0lkKHB1YmxpY0lkKTsKLQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBlbnRyeS5nZXRTeXN0ZW1JZCgpOwotCQkJCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLQkJCQkJCWRvY1R5cGUuc2V0U3lzdGVtSWQoc3lzdGVtSWQpOwotCQkJCQlTdHJpbmcgbmFtZXNwYWNlVVJJID0gZW50cnkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJCWlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotCQkJCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zIiwgbmFtZXNwYWNlVVJJKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGVNb2RlbChJRE9NTW9kZWwgbW9kZWwsIE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8IG91dHB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5zYXZlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTW9kZWwoSURPTU1vZGVsIG1vZGVsLCBJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9kZWwgPT0gbnVsbCB8fCBmaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy9CeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJLy9vdXRwdXQgPSBuZXcKLQkJCS8vIEJ5dGVBcnJheU91dHB1dFN0cmVhbShzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCQkJbW9kZWwuc2F2ZSgpOwotCQkJLy9pbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0JCQkvL2ZpbGUuc2V0Q29udGVudHMoaW5wdXQsIHRydWUsIHRydWUsIG51bGwpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8JCQlpZiAob3V0cHV0ICE9IG51bGwpCi0JCQkvLwkJCQlvdXRwdXQuY2xvc2UoKTsKLQkJCWlmIChpbnB1dCAhPSBudWxsKQotCQkJCWlucHV0LmNsb3NlKCk7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmODA2ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyIGV4dGVuZHMgRG9jdW1lbnRUeXBlQWRhcHRlckltcGwgaW1wbGVtZW50cyBIVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzIHsKLQotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5IGZGYWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzWE1MVHlwZSA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBYTUwgPSAieG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBYSFRNTCA9ICJ4aHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV01MID0gIndtbCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlcihJRE9NRG9jdW1lbnQgZG9jdW1lbnQsIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyKGRvY3VtZW50KTsKLQotCQl0aGlzLmZGYWN0b3J5ID0gZmFjdG9yeTsKLQotCQkvLyBpbml0aWFsaXplCi0JCWRvY3VtZW50VHlwZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9jdW1lbnRUeXBlQ2hhbmdlZCgpIHsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCUlET01Nb2RlbCBtb2RlbCA9IGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKG1vZGVsKTsKLQotCQkvLyBmaW5kIERPQ1RZUEUgZGVsY2FyYXRpb24gYW5kIFB1YmxpYyBJRAotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCQlEb2N1bWVudFR5cGUgbmV3RG9jdW1lbnRUeXBlID0gZmluZERvY3VtZW50VHlwZShkb2N1bWVudCk7Ci0JCWlmIChuZXdEb2N1bWVudFR5cGUgIT0gbnVsbCkgewotCQkJcHVibGljSWQgPSBuZXdEb2N1bWVudFR5cGUuZ2V0UHVibGljSWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGxvb2t1cCBkZWZhdWx0IHNldCBieSBjb250ZW50c2V0dGluZ3MKLQkJCXB1YmxpY0lkID0gSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBmaWxlLCB0cnVlKTsKLQkJfQotCi0JCS8vIGxvb2t1cCBET0NUWVBFIHJlZ2lzdHJ5Ci0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBuZXdFbnRyeSA9IG51bGw7Ci0JCWlmIChwdWJsaWNJZCAhPSBudWxsKSB7Ci0JCQluZXdFbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVudHJ5KHB1YmxpY0lkKTsKLQkJfQotCi0JCWJvb2xlYW4gbmV3WE1MVHlwZSA9IChuZXdFbnRyeSAhPSBudWxsID8gbmV3RW50cnkuaXNYTUxUeXBlKCkgOiBmYWxzZSk7Ci0JCWJvb2xlYW4gbmV3V01MVHlwZSA9IChuZXdFbnRyeSAhPSBudWxsID8gbmV3RW50cnkuaXNXTUxUeXBlKCkgOiBmYWxzZSk7Ci0KLQkJaWYgKCFuZXdYTUxUeXBlKSB7Ci0JCQkvLyBmaW5kIFhNTCBkZWNsYXJhdGlvbgotCQkJaWYgKGZpbmRYTUxOb2RlKGRvY3VtZW50KSAhPSBudWxsKSB7Ci0JCQkJbmV3WE1MVHlwZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGZpbGUgZXh0ZW5zaW9uCi0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGV4dCA9IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCWlmIChleHQgIT0gbnVsbCAmJiBleHQuZXF1YWxzSWdub3JlQ2FzZShYSFRNTCkpIHsKLQkJCQkJbmV3WE1MVHlwZSA9IHRydWU7Ci0JCQkJfQotCi0JCQkJaWYgKGV4dCAhPSBudWxsICYmIGV4dC5lcXVhbHNJZ25vcmVDYXNlKFdNTCkpIHsKLQkJCQkJbmV3WE1MVHlwZSA9IHRydWU7Ci0JCQkJCW5ld1dNTFR5cGUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJaWYgKG5ld0VudHJ5ID09IG51bGwpIHsKLQkJCS8vIGxvb2t1cCBzeXN0ZW0gZGVmYXVsdAotCQkJaWYgKG5ld1hNTFR5cGUgJiYgbmV3RG9jdW1lbnRUeXBlID09IG51bGwpIHsKLQkJCQkvLyB1c2UgZGVmYXVsdCBYSFRNTCwgaWYgaXQncyBYTUwgYW5kIG5vIGRvY3VtZW50IHR5cGUKLQkJCQkvLyBkZWNsYXJlZAotCQkJCWlmIChuZXdXTUxUeXBlKQotCQkJCQluZXdFbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRFbnRyeShIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuREVGQVVMVF9XTUwpOwotCQkJCWVsc2UKLQkJCQkJbmV3RW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RW50cnkoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkRFRkFVTFRfWEhUTUwpOwotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXdFbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRFbnRyeShIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuREVGQVVMVF9IVE1MKTsKLQkJCX0KLQkJCWlmIChuZXdFbnRyeSA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJfQotCi0JCWlmIChuZXdEb2N1bWVudFR5cGUgPT0gbnVsbCkgewotCQkJRG9jdW1lbnRUeXBlIG9sZERvY3VtZW50VHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQkJaWYgKG9sZERvY3VtZW50VHlwZSA9PSBudWxsIHx8IG9sZERvY3VtZW50VHlwZS5nZXROYW1lKCkgIT0gbmV3RW50cnkuZ2V0TmFtZSgpKSB7Ci0JCQkJLy8gY3JlYXRlIGltcGxpY2l0IERvY3VtZW50VHlwZQotCQkJCURPTUltcGxlbWVudGF0aW9uIGltcGwgPSBkb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQkJCWlmIChpbXBsICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBuZXdFbnRyeS5nZXROYW1lKCk7Ci0JCQkJCXB1YmxpY0lkID0gbmV3RW50cnkuZ2V0UHVibGljSWQoKTsKLQkJCQkJU3RyaW5nIHN5c3RlbUlkID0gbmV3RW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJCQkJbmV3RG9jdW1lbnRUeXBlID0gaW1wbC5jcmVhdGVEb2N1bWVudFR5cGUobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQlpZiAodGhpcy5lbnRyeSAhPSBudWxsKSB7IC8vIGRvIG5vdCBub3RpZnkgb24gaW5pdGlhbGl6YXRpb24KLQkJCW5vdGlmeSA9IChuZXdFbnRyeSAhPSB0aGlzLmVudHJ5IHx8IG5ld1hNTFR5cGUgIT0gdGhpcy5pc1hNTFR5cGUpOwotCQl9Ci0KLQkJaWYgKG5ld0RvY3VtZW50VHlwZSAhPSBudWxsKQotCQkJc2V0RG9jdW1lbnRUeXBlKG5ld0RvY3VtZW50VHlwZSk7Ci0JCXRoaXMuZW50cnkgPSBuZXdFbnRyeTsKLQkJdGhpcy5pc1hNTFR5cGUgPSBuZXdYTUxUeXBlOwotCi0JCWlmIChub3RpZnkpCi0JCQlub3RpZnlEb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJRE9NRG9jdW1lbnRUeXBlIGZpbmREb2N1bWVudFR5cGUoSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlET01Eb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQkJaWYgKGRvY3VtZW50VHlwZSAhPSBudWxsICYmIGRvY3VtZW50VHlwZS5nZXRFeGlzdGluZ0FkYXB0ZXIoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcykgPT0gbnVsbCkgewotCQkJLy8gd2F0Y2ggZnV0dXJlIGNoYW5nZXMKLQkJCWRvY3VtZW50VHlwZS5hZGRBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBOb2RlIGZpbmRYTUxOb2RlKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyB0YXJnZXQgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5lcXVhbHMoWE1MKSkgewotCQkJCXJldHVybiBjaGlsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJaWYgKGlzWE1MVHlwZSgpKQotCQkJcmV0dXJuIExPV0VSX0NBU0U7IC8vIFhIVE1MCi0JCXJldHVybiB0aGlzLmZGYWN0b3J5LmdldEF0dHJOYW1lQ2FzZSgpOwotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUlGaWxlIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCXJlc3VsdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0JCWlmIChpc1hNTFR5cGUoKSkKLQkJCXJldHVybiBMT1dFUl9DQVNFOyAvLyBYSFRNTAotCQlyZXR1cm4gdGhpcy5mRmFjdG9yeS5nZXRUYWdOYW1lQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGZlYXR1cmUuZXF1YWxzKEhUTUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmZWF0dXJlLmVxdWFscyhTU0kpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmZWF0dXJlLmVxdWFscyhGUkFNRVNFVCkpIHsKLQkJCWlmICh0aGlzLmVudHJ5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRoaXMuZW50cnkuaGFzRnJhbWVzZXQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNYTUxUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5pc1hNTFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuQ0hBTkdFKQotCQkJCXJldHVybjsKLQkJfQotCQlkb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxNWUxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5LCBQcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIGludCB0YWdOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRTsKLQlwcml2YXRlIGludCBhdHRyTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG51bGw7Ci0KLQkvLyBmb3IgcmVtb3ZhbCBsYXRlciBvbiByZWxlYXNlKCkKLQlwcml2YXRlIEhhc2hNYXAgZkRvYzJBZGFwdGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQl0aGlzLnByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJdXBkYXRlQ2FzZXMoKTsgLy8gaW5pdGlhbGl6ZQotCQkJdGhpcy5wcmVmZXJlbmNlcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4gSXQKLQkgKiBtYXkgYmUgYSBzaW5nbGV0b24gb3Igbm90IC4uLiBkZXBlbmRpbmcgb24gdGhlIG5lZWRzIG9mIHRoZQotCSAqIElOb2RlQWRhcHRlciAuLi4gYnV0IGluIGdlbmVyYWwgaXQgaXMgcmVjb21tZW5kZWQgZm9yIGFuIGFkYXB0ZXIgdG8gYmUKLQkgKiBzdGF0ZWxlc3MsIHNvIHRoZSBlZmZpY2llbmNpZXMgb2YgYSBzaW5nbGV0b24gY2FuIGJlIGdhaW5lZC4KLQkgKiAKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgYWRkQWRhcHRlciBvbiB0aGUgYWRhcHRlZAotCSAqIG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlJTm9kZUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQkJLy8gb25seSBhZGFwdCBJRE9NRG9jdW1lbnQKLQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSB7Ci0KLQkJCS8vIGlmIGFscmVhZHkgaGFzIGFuIGFkYXB0ZXIsIG5vIG5lZWQgdG8gcmVjcmVhdGUvaW5pdGlhbGl6ZS4KLQkJCS8vIE5vdGU6IHRoaXMgbWVhbnMgaWYgImRvY3R5cGUiIGZvciBET00gY2hhbmdlcywKLQkJCS8vIHRoZURvY3VtZW50VHlwZUFkYXRwZXIgZm9yIHRoYXQgRE9NCi0JCQkvLyBzaG91bGQgYmUgcmVtb3ZlZCAoYW5kIHJlbGVhc2VkKSBhbmQgaXQgd2lsbCBiZSByZS1jcmVhdGVkIG5leHQKLQkJCS8vIHRpbWUgcmVxdWlyZWQuCi0JCQlEb2N1bWVudFR5cGVBZGFwdGVyIG9sZEFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKG9sZEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IG9sZEFkYXB0ZXI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkKLQkJCQkvLyBpZiB0aGVyZSBhbHJlYWR5IHdhcyBhbiBhZGFwdGVyCi0JCQkJLy9pZihmQWRhcHRlciAhPSBudWxsKSAKLQkJCQkvLwlmQWRhcHRlci5yZWxlYXNlKCk7Ci0JCQkJCi0JCQkJLy8gbm90ZSwgdGhlIGZhY3RvcnkgaXMgaW5jbHVkZWQgaW4gdGhpcyBjYXNlIHRvIGhhdmUgYSBjZW50cmFsIHBsYWNlCi0JCQkJLy8gdG8gY29tZSBiYWNrIHRvIGZvciBjYXNlIHByZWZlcmVuY2VzLgotCQkJCXJlc3VsdCA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlcigoSURPTURvY3VtZW50KSBub3RpZmllciwgdGhpcyk7Ci0JCQkJbm90aWZpZXIuYWRkQWRhcHRlcihyZXN1bHQpOwotCQkJCQotCQkJCWZEb2MyQWRhcHRlck1hcC5wdXQobm90aWZpZXIsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0ck5hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0JCXJldHVybiB0aGlzLnRhZ05hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCWlmIChwcm9wZXJ0eSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChwcm9wZXJ0eS5lcXVhbHMoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSkgfHwgcHJvcGVydHkuZXF1YWxzKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKSkgewotCQkJdXBkYXRlQ2FzZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDYXNlcygpIHsKLQkJdGhpcy50YWdOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRTsKLQkJdGhpcy5hdHRyTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0KLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgdGFnQ2FzZSA9IHRoaXMucHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpOwotCQlpZiAodGFnQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCXRoaXMudGFnTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JCWVsc2UgaWYgKHRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQl0aGlzLnRhZ05hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5VUFBFUl9DQVNFOwotCQkKLQkJaW50IGF0dENhc2UgPSB0aGlzLnByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSk7Ci0JCWlmIChhdHRDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJdGhpcy5hdHRyTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JCWVsc2UgaWYgKGF0dENhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQl0aGlzLnRhZ05hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5VUFBFUl9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCQotCQlpZighZkRvYzJBZGFwdGVyTWFwLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gZG9jcyA9IGZEb2MyQWRhcHRlck1hcC5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKWZEb2MyQWRhcHRlck1hcC5nZXQoZG9jc1tpXSk7Ci0JCQkJYWRhcHRlci5yZWxlYXNlKCk7Ci0JCQkJKChJRE9NRG9jdW1lbnQpZG9jc1tpXSkucmVtb3ZlQWRhcHRlcihhZGFwdGVyKTsKLQkJCX0KLQkJCWZEb2MyQWRhcHRlck1hcC5jbGVhcigpOwotCQl9Ci0JCQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTU5NjAKLQkJaWYgKHRoaXMucHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJdGhpcy5wcmVmZXJlbmNlcy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBjb3B5IG1ldGhvZAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMjZjMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFRNTCA9ICJIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZSQU1FU0VUID0gIkZSQU1FU0VUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNTSSA9ICJTU0kiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxNThlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudFR5cGVFbnRyeSB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUeXBlOwotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MVHlwZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNXTUxUeXBlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNGcmFtZXNldDsKLQlwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0WEhUTUw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFdNTDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgWEhUTUxfTkFNRSA9ICJodG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBIVE1MX05BTUUgPSAiSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gdXNlSW50ZXJuYWxNb2RlbCA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlRW50cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeShTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyBuYW1lc3BhY2VVUkksIGJvb2xlYW4gaXNYSFRNTFR5cGUsIGJvb2xlYW4gaGFzRnJhbWVzZXQsIFN0cmluZyBkaXNwbGF5TmFtZSwgYm9vbGVhbiBpc0RlZmF1bHRYSFRNTCwgYm9vbGVhbiBpc0RlZmF1bHRXTUwsIGJvb2xlYW4gaXNXTUxUeXBlKSB7Ci0JCXRoaXMoKTsKLQotCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGlzWE1MVHlwZSkKLQkJCQl0aGlzLm5hbWUgPSBYSFRNTF9OQU1FOy8vIG5lZWQgY29kZSBmb3Igd21sPwotCQkJZWxzZQotCQkJCXRoaXMubmFtZSA9IEhUTUxfTkFNRTsKLQkJfQotCQl0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQkJdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0JCXRoaXMuaXNYTUxUeXBlID0gaXNYSFRNTFR5cGUgfCBpc1dNTFR5cGU7Ci0JCXRoaXMuaGFzRnJhbWVzZXQgPSBoYXNGcmFtZXNldDsKLQkJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCQl0aGlzLmlzRGVmYXVsdFhIVE1MID0gaXNEZWZhdWx0WEhUTUw7Ci0JCXRoaXMuaXNEZWZhdWx0V01MID0gaXNEZWZhdWx0V01MOwotCQl0aGlzLmlzWEhUTUxUeXBlID0gaXNYSFRNTFR5cGU7Ci0JCXRoaXMuaXNXTUxUeXBlID0gaXNXTUxUeXBlOwotCX0KLQkKLQlIVE1MRG9jdW1lbnRUeXBlRW50cnkoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBib29sZWFuIGlzWEhUTUxUeXBlLCBib29sZWFuIGhhc0ZyYW1lc2V0LCBTdHJpbmcgZGlzcGxheU5hbWUsIGJvb2xlYW4gaXNEZWZhdWx0WEhUTUwsIGJvb2xlYW4gaXNEZWZhdWx0V01MLCBib29sZWFuIGlzV01MVHlwZSwgYm9vbGVhbiB1c2VJbnRlcm5hbE1vZGVsKSB7Ci0JCXRoaXMobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBuYW1lc3BhY2VVUkksIGlzWEhUTUxUeXBlLCBoYXNGcmFtZXNldCwgZGlzcGxheU5hbWUsIGlzRGVmYXVsdFhIVE1MLCBpc0RlZmF1bHRXTUwsIGlzV01MVHlwZSk7Ci0JCXRoaXMudXNlSW50ZXJuYWxNb2RlbCA9IHVzZUludGVybmFsTW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUkk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNYTUxUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5pc1hNTFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzRnJhbWVzZXQoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0ZyYW1lc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGVmYXVsdFhIVE1MKCkgewotCQlyZXR1cm4gdGhpcy5pc0RlZmF1bHRYSFRNTDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHRXTUwoKSB7Ci0JCXJldHVybiB0aGlzLmlzRGVmYXVsdFdNTDsKLQl9Ci0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWEhUTUxUeXBlKCkgewotCQlyZXR1cm4gaXNYSFRNTFR5cGU7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNXTUxUeXBlKCkgewotCQlyZXR1cm4gaXNXTUxUeXBlOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB1c2VJbnRlcm5hbE1vZGVsKCkgewotCQlyZXR1cm4gdXNlSW50ZXJuYWxNb2RlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkNzFmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgSGFzaHRhYmxlIGVudHJpZXMgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRlZmF1bHRFbnRyeSA9IG51bGw7Ci0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZGVmYXVsdFhIVE1MRW50cnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRlZmF1bHRXTUxFbnRyeSA9IG51bGw7Ci0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZGVmYXVsdENIVE1MRW50cnkgPSBudWxsOwotCi0JZmluYWwgc3RhdGljIGludCBERUZBVUxUX0hUTUwgPSAwOwotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9YSFRNTCA9IDE7Ci0JZmluYWwgc3RhdGljIGludCBERUZBVUxUX1dNTCA9IDI7Ci0JZmluYWwgc3RhdGljIGludCBERUZBVUxUX0NIVE1MID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIVE1MX1BVQkxJQ19JRCA9ICItLy9XM0MvL0RURCBDb21wYWN0IEhUTUwgMS4wIERyYWZ0Ly9FTiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5lbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkvLyBIVE1MIDQuMDEKLQkJU3RyaW5nIG5hbWUgPSAiSFRNTCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcHVibGljSWQgPSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN5c3RlbUlkID0gImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGlzcGxheU5hbWUgPSAiSFRNTCA0LjAxIFRyYW5zaXRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kZWZhdWx0RW50cnkgPSBuZXcgSFRNTERvY3VtZW50VHlwZUVudHJ5KG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBkaXNwbGF5TmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXRoaXMuZW50cmllcy5wdXQocHVibGljSWQsIHRoaXMuZGVmYXVsdEVudHJ5KTsKLQkJcHVibGljSWQgPSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiI7Ly8kTk9OLU5MUy0xJAotCQlzeXN0ZW1JZCA9ICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIjsvLyROT04tTkxTLTEkCi0JCWRpc3BsYXlOYW1lID0gIkhUTUwgNC4wMSBTdHJpY3QiOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZW50cmllcy5wdXQocHVibGljSWQsIG5ldyBIVE1MRG9jdW1lbnRUeXBlRW50cnkobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBudWxsLCBmYWxzZSwgZmFsc2UsIGRpc3BsYXlOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCXB1YmxpY0lkID0gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iOy8vJE5PTi1OTFMtMSQKLQkJc3lzdGVtSWQgPSAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvZnJhbWVzZXQuZHRkIjsvLyROT04tTkxTLTEkCi0JCWRpc3BsYXlOYW1lID0gIkhUTUwgNC4wMSBGcmFtZXNldCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5lbnRyaWVzLnB1dChwdWJsaWNJZCwgbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG51bGwsIGZhbHNlLCB0cnVlLCBkaXNwbGF5TmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQkvLyBDSFRNTAotCQluYW1lID0gIkhUTUwiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljSWQgPSBDSFRNTF9QVUJMSUNfSUQ7Ci0JCWRpc3BsYXlOYW1lID0gIkNvbXBhY3QgSFRNTCAxLjAgRHJhZnQiOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGVmYXVsdENIVE1MRW50cnkgPSBuZXcgSFRNTERvY3VtZW50VHlwZUVudHJ5KG5hbWUsIHB1YmxpY0lkLCBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UsIGRpc3BsYXlOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJdGhpcy5lbnRyaWVzLnB1dChwdWJsaWNJZCwgdGhpcy5kZWZhdWx0Q0hUTUxFbnRyeSk7Ci0KLQkJSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIoKTsKLQkJaWYgKHJlYWRlciAhPSBudWxsKQotCQkJcmVhZGVyLnJlYWRSZWdpc3RyeSh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlZ2lzdChTdHJpbmcgcGlkLCBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZG9jdHlwZSkgewotCQlpZiAocGlkID09IG51bGwgfHwgZG9jdHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLmVudHJpZXMucHV0KHBpZCwgZG9jdHlwZSk7Ci0JCWlmICh0aGlzLmRlZmF1bHRYSFRNTEVudHJ5ID09IG51bGwpIHsKLQkJCWlmIChkb2N0eXBlLmlzRGVmYXVsdFhIVE1MKCkpCi0JCQkJdGhpcy5kZWZhdWx0WEhUTUxFbnRyeSA9IGRvY3R5cGU7Ci0JCX0KLQkJaWYgKHRoaXMuZGVmYXVsdFdNTEVudHJ5ID09IG51bGwpIHsKLQkJCWlmIChkb2N0eXBlLmlzRGVmYXVsdFdNTCgpKQotCQkJCXRoaXMuZGVmYXVsdFdNTEVudHJ5ID0gZG9jdHlwZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZ2V0RGVmYXVsdEVudHJ5KGludCB0eXBlKSB7Ci0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBERUZBVUxUX1hIVE1MIDoKLQkJCQllbnRyeSA9IHRoaXMuZGVmYXVsdFhIVE1MRW50cnk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERFRkFVTFRfV01MIDoKLQkJCQllbnRyeSA9IHRoaXMuZGVmYXVsdFdNTEVudHJ5OwotCQkJCWJyZWFrOwotCQkJY2FzZSBERUZBVUxUX0NIVE1MIDoKLQkJCQllbnRyeSA9IHRoaXMuZGVmYXVsdENIVE1MRW50cnk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERFRkFVTFRfSFRNTCA6Ci0JCQlkZWZhdWx0IDoKLQkJCQllbnRyeSA9IHRoaXMuZGVmYXVsdEVudHJ5OwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUVudHJ5IGdldERlZmF1bHRFbnRyeSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEVudHJ5OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZ2V0WEhUTUxEZWZhdWx0RW50cnkoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRYSFRNTEVudHJ5OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnRyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5lbnRyaWVzLmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBnZXRFbnRyeShTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKHB1YmxpY0lkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIHRoaXMuZW50cmllcy5nZXQocHVibGljSWQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MTk5NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqLwotY2xhc3MgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyIHsKLQotCS8vCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJkb2N1bWVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfTkFNRSA9ICJkb2N1bWVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9QSUQgPSAicHVibGljSUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9TSUQgPSAic3lzdGVtSUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9JU19YSFRNTCA9ICJpc1hIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSVNfV01MID0gImlzV01MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSEFTX0ZSQU1FU0VUID0gImhhc0ZyYW1lc2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfTlNVUkkgPSAibmFtZXNwYWNlVVJJIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfRU5BTUUgPSAiZWxlbWVudE5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9ETkFNRSA9ICJkaXNwbGF5TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lTX0RFRkFVTFRfWEhUTUwgPSAiZGVmYXVsdFhIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSVNfREVGQVVMVF9XTUwgPSAiZGVmYXVsdFdNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRWX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRWX05VTExfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlYWRSZWdpc3RyeShIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgcmVnKSB7Ci0JCWlmIChyZWcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZG9jdHlwZSA9IHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCQkvLyBudWxsIGNhbiBiZSByZXR1cm5lZCBpZiB0aGVyZSdzIGFuIGVycm9yIHJlYWRpbmcgdGhlIGVsZW1lbnQKLQkJCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJlZy5yZWdpc3QoZG9jdHlwZS5nZXRQdWJsaWNJZCgpLCBkb2N0eXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZG9jdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBwaWQgPSBudWxsOwotCQlTdHJpbmcgc2lkID0gbnVsbDsKLQkJU3RyaW5nIG5zdXJpID0gbnVsbDsKLQkJU3RyaW5nIHJvb3QgPSBudWxsOwotCQlib29sZWFuIHhodG1sID0gdHJ1ZTsKLQkJYm9vbGVhbiBmcmFtZXNldCA9IGZhbHNlOwotCQlTdHJpbmcgZG5hbWUgPSBudWxsOwotCQlib29sZWFuIGRlZmF1bHRYaHRtbCA9IGZhbHNlOwotCQlib29sZWFuIGRlZmF1bHRXTUwgPSBmYWxzZTsKLQkJYm9vbGVhbiBpc1dNTCA9IGZhbHNlOwotCi0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlwaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUElEKTsKLQkJCS8vIHB1YmxpY0lEIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuCi0JCQlpZiAocGlkID09IG51bGwgfHwgcGlkLmVxdWFscyhBVFZfTlVMTF9TVFJJTkcpKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlzaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU0lEKTsKLQkJCW5zdXJpID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05TVVJJKTsKLQkJCXJvb3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRU5BTUUpOwotCQkJeGh0bWwgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9JU19YSFRNTCk7Ci0JCQlmcmFtZXNldCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0hBU19GUkFNRVNFVCk7Ci0JCQlkbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ETkFNRSk7Ci0JCQlkZWZhdWx0WGh0bWwgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9JU19ERUZBVUxUX1hIVE1MKTsKLQkJCWRlZmF1bHRXTUwgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9JU19ERUZBVUxUX1dNTCk7Ci0JCQlpc1dNTCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0lTX1dNTCk7Ci0JCQlkb2N0eXBlID0gbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShyb290LCBwaWQsIHNpZCwgbnN1cmksIHhodG1sLCBmcmFtZXNldCwgZG5hbWUsIGRlZmF1bHRYaHRtbCwgZGVmYXVsdFdNTCwgaXNXTUwpOwotCQl9Ci0JCXJldHVybiBkb2N0eXBlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhBVFZfVFJVRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTMwNTU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DTU5vZGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Nb2RlbFBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlRhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogSFRNTERvY3VtZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsUGFyc2VyQWRhcHRlciBpbXBsZW1lbnRzIE1vZGVsUGFyc2VyQWRhcHRlciB7Ci0JLyoqCi0JICogbm90ZTogSSBtYWRlIHB1YmxpYywgdGVtcGFyaWx5LCBzbyBjb3VsZCBiZSB1c2VkIGJ5IEpTUExvYWRlcgotCSAqLwotCXByb3RlY3RlZCBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRUZXJtaW5hdGVBdChDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGNoaWxkKSB7Ci0JCWlmICghcGFyZW50LnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuVEVSTUlOQVRPUlMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlqYXZhLnV0aWwuSXRlcmF0b3IgaSA9IChqYXZhLnV0aWwuSXRlcmF0b3IpIHBhcmVudC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlRFUk1JTkFUT1JTKTsKLQkJaWYgKGkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG5leHROYW1lID0gY2hpbGQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkvLyBOT1RFOiBDTUVsZW1lbnREZWNsYXJhdGlvbiBvZiBjaGlsZCBpcyBub3QgYWx3YXlzIEhUTUxDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkJCS8vIEl0IG1pZ2h0IGJlIG9uZSBvZiBiYXNlZCBvbiBEVEQgKGZvciBYSFRNTCBlbGVtZW50KS4gIFNvLCBjb21wYXJpc29uIG11c3QKLQkJCS8vIGJlIHBlcmZvcm1lZCBpZ25vcmluZyBjYXNlLgotCQkJLy8gLS0gMy8yMC8yMDAyCi0JCQlTdHJpbmcgdGVybWluYXRvciA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJaWYgKHRlcm1pbmF0b3IgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChuZXh0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRlcm1pbmF0b3IpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Db250YWluKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlET01FbGVtZW50IGltcGwgPSAoSURPTUVsZW1lbnQpIGVsZW1lbnQ7Ci0KLQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWlmICghaW1wbC5pc0dsb2JhbFRhZygpKQotCQkJCXJldHVybiB0cnVlOyAvLyBub24gSFRNTCB0YWcKLQkJCUlET01FbGVtZW50IGNoaWxkRWxlbWVudCA9IChJRE9NRWxlbWVudCkgY2hpbGQ7Ci0KLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIG15RGVjID0gQ01Ob2RlVXRpbC5nZXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAobXlEZWMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vaWYgKCEobXlEZWMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAobXlEZWMuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCWlmICghY2hpbGRFbGVtZW50LmlzR2xvYmFsVGFnKCkpCi0JCQkJcmV0dXJuIHRydWU7IC8vIG5vbiBIVE1MIHRhZwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGREZWMgPSBDTU5vZGVVdGlsLmdldEVsZW1lbnREZWNsYXJhdGlvbihjaGlsZEVsZW1lbnQpOwotCQkJaWYgKGNoaWxkRGVjID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvL2lmICghKGNoaWxkRGVjIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikpIHJldHVybiB0cnVlOwotCi0JCQlpZiAobXlEZWMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJaWYgKCgoQm9vbGVhbikgKChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBteURlYykuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19KU1ApKS5ib29sZWFuVmFsdWUoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAoc2hvdWxkVGVybWluYXRlQXQobXlEZWMsIGNoaWxkRGVjKSAmJiAhaXNWYWxpZENoaWxkKG15RGVjLCBjaGlsZERlYykpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCVN0cmluZyB0YWdOYW1lID0gaW1wbC5nZXRUYWdOYW1lKCk7Ci0JCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkRWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQlpZiAoY2hpbGROYW1lID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoIWltcGwuaGFzU3RhcnRUYWcoKSAmJiAhaW1wbC5oYXNFbmRUYWcoKSkgewotCQkJCS8vIGltcGxpY2l0IGVsZW1lbnQKLQkJCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkRWxlbWVudC5nZXRUYWdOYW1lKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCkpIHsKLQkJCQkJaWYgKCFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSkgJiYgIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRSkgJiYgIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LKSAmJiAhY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSAmJiAhY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UpICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSVNJTkRFWCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCU5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUlET01FbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHBhcmVudDsKLQkJCQkJaWYgKCFwYXJlbnRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgIXBhcmVudEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJCWlmICghY2FuQ29udGFpbihwYXJlbnRFbGVtZW50LCBjaGlsZCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvLyBjb250ZXh1YWwgdGVybWluYXRpb24gZm9yIFRBQkxFIGNvbnRlbnQgdGFncwotCQkJYm9vbGVhbiBpc1RhYmxlQ29udGVudCA9IGZhbHNlOwotCQkJaWYgKGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSkgfHwgY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFEKSB8fCBjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEZPT1QpKSB7Ci0JCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpc1RhYmxlQ29udGVudCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFIpKSB7Ci0JCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFkpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEZPT1QpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpc1RhYmxlQ29udGVudCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEQpIHx8IGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USCkpIHsKLQkJCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUikgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlzVGFibGVDb250ZW50ID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChpc1RhYmxlQ29udGVudCkgewotCQkJCS8vIFRBQkxFIGNvbnRlbnQgdGFncyBzaG91bGQgdGVybWluYXRlIG5vbiBUQUJMRSBjb250ZW50IHRhZ3MsCi0JCQkJLy8gaWYgaW4gVEFCTEUKLQkJCQlmb3IgKE5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCWJyZWFrOwotCQkJCQlJRE9NRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKElET01FbGVtZW50KSBwYXJlbnQ7Ci0JCQkJCVN0cmluZyBwYXJlbnROYW1lID0gcGFyZW50RWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJCWlmIChwYXJlbnROYW1lID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKHBhcmVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVNQkVEKSkgewotCQkJCWlmICghY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRU1CRUQpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBpbXBsLmdldFRhZ05hbWUoKTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5FTUJFRCkpIHsKLQkJCQlJRE9NVGV4dCB0ZXh0ID0gKElET01UZXh0KSBjaGlsZDsKLQkJCQlpZiAoIXRleHQuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCWlmIChpbXBsLmlzSW1wbGljaXRUYWcoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUNvbW1lbnRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCBkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIGNyZWF0ZU1ldGFFbGVtZW50KGRvY3VtZW50LCBkYXRhLCBpc0pTUFRhZyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByb3V0aW5lIGNyZWF0ZSBhbiBpbXBsaWNpdCBFbGVtZW50IGZvciBnaXZlbiBwYXJlbnQgYW5kIGNoaWxkLAotCSAqIHN1Y2ggYXMgSFRNTCwgQk9EWSwgSEVBRCwgYW5kIFRCT0RZIGZvciBIVE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUltcGxpY2l0RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZU1ldGFFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCVRhZ1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBUYWdTY2FubmVyKGRhdGEsIDAsIHRydWUpOyAvLyBvbmUgbGluZQotCQlTdHJpbmcgbmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLk1FVEFEQVRBKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJYm9vbGVhbiBpc1N0YXJ0U3BhbiA9IGZhbHNlOwotCQlib29sZWFuIGlzRW5kU3BhbiA9IGZhbHNlOwotCQluYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQl3aGlsZSAobmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBzY2FubmVyLm5leHRWYWx1ZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5UWVBFKSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5ERVNJR05FUl9DT05UUk9MKSkgewotCQkJCQl0eXBlID0gTWV0YURhdGEuREVTSUdORVJfQ09OVFJPTDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5EWU5BTUlDX0RBVEEpKSB7Ci0JCQkJCXR5cGUgPSBNZXRhRGF0YS5EWU5BTUlDX0RBVEE7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuQVVUSE9SX1RJTUVfVklTVUFMKSkgewotCQkJCQl0eXBlID0gTWV0YURhdGEuQVVUSE9SX1RJTUVfVklTVUFMOwotCQkJCX0KLQkJCQllbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkFOTk9UQVRJT04pKSB7Ci0JCQkJCXR5cGUgPSBNZXRhRGF0YS5BTk5PVEFUSU9OOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLlNUQVJUU1BBTikpIHsKLQkJCQlpc1N0YXJ0U3BhbiA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuRU5EU1BBTikpIHsKLQkJCQlpZiAoIWlzU3RhcnRTcGFuKQotCQkJCQlpc0VuZFNwYW4gPSB0cnVlOwotCQkJfQotCQkJbmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJfQotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghaXNTdGFydFNwYW4gJiYgIWlzRW5kU3BhbikKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbWV0YURhdGEgPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gc2Nhbm5lci5nZXROZXh0T2Zmc2V0KCk7IC8vIHNraXAgbmV3IGxpbmUKLQkJaWYgKG9mZnNldCA8IGRhdGEubGVuZ3RoKCkpCi0JCQltZXRhRGF0YSA9IGRhdGEuc3Vic3RyaW5nKG9mZnNldCk7Ci0JCWlmIChtZXRhRGF0YSA9PSBudWxsKQotCQkJbWV0YURhdGEgPSBuZXcgU3RyaW5nKCk7Ci0KLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChNZXRhRGF0YS5QUkVGSVggKyB0eXBlKTsKLQotCQlNZXRhRGF0YUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNZXRhRGF0YUFkYXB0ZXIodHlwZSk7Ci0JCWlmIChpc1N0YXJ0U3BhbikgewotCQkJaWYgKG1ldGFEYXRhICE9IG51bGwpCi0JCQkJYWRhcHRlci5zZXREYXRhKG1ldGFEYXRhKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChtZXRhRGF0YSAhPSBudWxsKQotCQkJCWFkYXB0ZXIuc2V0RW5kRGF0YShtZXRhRGF0YSk7Ci0JCX0KLQkJZWxlbWVudC5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCQlhZGFwdGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCWVsZW1lbnQuc2V0SlNQVGFnKGlzSlNQVGFnKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbmRSb290TmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIHRhZyBtYXRjaGluZyBzaG91bGQgbm90IGJleW9uZCBUQUJMRSB0YWcgZXhjZXB0IEJPRFkgdGFnCi0JCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCVRhZ0FkYXB0ZXIgYWRhcHRlciA9IChUYWdBZGFwdGVyKSBlbGVtZW50LmdldEV4aXN0aW5nQWRhcHRlcihUYWdBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmlzRW5kVGFnKCk7Ci0JCXJldHVybiBlbGVtZW50LmlzRW5kVGFnKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGRvIG5vdGhpbmcgb24gbm90aWZpeSBjaGFuZ2UKLQkJLy8gVE9ETzogdGhpcyBtZWFucyBnb29kIGNhbmRpZGF0ZSBmb3IgcmVndWxhciBwbGF0Zm9ybSBhZGFwdGVyCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2hpbGQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ01Db250ZW50IGNvbnRlbnQgPSBwYXJlbnQuZ2V0Q29udGVudCgpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNDaGlsZChjb250ZW50LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NoaWxkKENNQ29udGVudCBjb250ZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiB0YXJnZXQpIHsKLQkJc3dpdGNoIChjb250ZW50LmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOgotCQkJCXJldHVybiBpc1NhbWVEZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNvbnRlbnQsIHRhcmdldCk7Ci0JCQljYXNlIENNTm9kZS5HUk9VUCA6Ci0JCQkJQ01Ob2RlTGlzdCBjaGlsZHJlbiA9ICgoQ01Hcm91cCkgY29udGVudCkuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlDTU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCQlzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpIHsKLQkJCQkJCWNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOgotCQkJCQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQkJCQlpZiAoaXNDaGlsZCgoQ01Db250ZW50KSBjaGlsZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJfQotCQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NhbWVEZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBhRGVjLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBvdGhlckRlYykgewotCQlyZXR1cm4gYURlYy5nZXRFbGVtZW50TmFtZSgpID09IG90aGVyRGVjLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc2NWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTW9kZWxQYXJzZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4gSXQKLQkgKiBtYXkgYmUgYSBzaW5nbGV0b24gb3Igbm90IC4uLiBkZXBlbmRpbmcgb24gdGhlIG5lZWRzIG9mIHRoZQotCSAqIElOb2RlQWRhcHRlciAuLi4gYnV0IGluIGdlbmVyYWwgaXQgaXMgcmVjb21tZW5kZWQgZm9yIGFuIGFkYXB0ZXIgdG8gYmUKLQkgKiBzdGF0ZWxlc3MsIHNvIHRoZSBlZmZpY2llbmNpZXMgb2YgYSBzaW5nbGV0b24gY2FuIGJlIGdhaW5lZC4KLQkgKiAKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgYWRkQWRhcHRlciBvbiB0aGUgYWRhcHRlZAotCSAqIG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmIChub3RpZmllciAhPSBudWxsKSB7Ci0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCQlhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQlhZGFwdGVyID0gbmV3IEhUTUxNb2RlbFBhcnNlckFkYXB0ZXIoKTsKLQkJCQkJbm90aWZpZXIuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBubyBzdGF0ZSB0byBjbGVhbnVwCi0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBjb3B5IG1ldGhvZAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZXRhRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNTc1OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEEgPSAiTUVUQURBVEEiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRTUEFOID0gInN0YXJ0c3BhbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EU1BBTiA9ICJlbmRzcGFuIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERVNJR05FUl9DT05UUk9MID0gIkRlc2lnbmVyQ29udHJvbCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOQU1JQ19EQVRBID0gIkR5bmFtaWNEYXRhIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JfVElNRV9WSVNVQUwgPSAiQXV0aG9yVGltZVZpc3VhbCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTiA9ICJBbm5vdGF0aW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiTUVUQURBVEE6IjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGFBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGFBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliODU5NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01ldGFEYXRhQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlRhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhRGF0YUFkYXB0ZXIgaW1wbGVtZW50cyBUYWdBZGFwdGVyLCBNZXRhRGF0YSB7Ci0KLQlwcml2YXRlIElET01FbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHR5cGUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGVuZERhdGEgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIE1ldGFEYXRhQWRhcHRlcihTdHJpbmcgdHlwZSkgewotCQlzdXBlcigpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWlmICh0eXBlLmVxdWFscyhBTk5PVEFUSU9OKSkgewotCQkJCXRoaXMudHlwZSA9IEFOTk9UQVRJT047Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlLmVxdWFscyhBVVRIT1JfVElNRV9WSVNVQUwpKSB7Ci0JCQkJdGhpcy50eXBlID0gQVVUSE9SX1RJTUVfVklTVUFMOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBkYXRhID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzQ29tbWVudFRleHQocmVnaW9uVHlwZSkpIHsKLQkJCQlkYXRhID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlmb3IgKDsgb2Zmc2V0IDwgbGVuZ3RoOyBvZmZzZXQrKykgewotCQkJY2hhciBjID0gZGF0YS5jaGFyQXQob2Zmc2V0KTsKLQkJCWlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSB7Ci0JCQkJb2Zmc2V0Kys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZm9yICg7IG9mZnNldCA8IGxlbmd0aDsgb2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IGRhdGEuY2hhckF0KG9mZnNldCk7Ci0JCQlpZiAoYyAhPSAnXHInICYmIGMgIT0gJ1xuJykgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBkYXRhLnN1YnN0cmluZyhvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRUZXh0KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJlc3VsdCA9IGlzRE9NQ29tbWVudChyZWdpb25UeXBlKSB8fCBpc05lc3RlZENvbnRlbnRDb21tZW50KHJlZ2lvblR5cGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RlZENvbnRlbnRDb21tZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9URVhUID0gIkpTUF9DT01NRU5UX1RFWFQiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZWdpb25UeXBlLmVxdWFscyhKU1BfQ09NTUVOVF9URVhUKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNET01Db21tZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCXJldHVybiByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5lbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLmRhdGEgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmRhdGE7Ci0JCXJldHVybiBnZXREYXRhKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWxpbWl0ZXIoSURPTU1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyBkZWxpbSA9IG51bGw7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJCWRlbGltID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJfQotCQlpZiAoZGVsaW0gPT0gbnVsbCkKLQkJCWRlbGltID0gIlxyXG4iOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlbGltOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kRGF0YSgpIHsKLQkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLmVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLmVuZERhdGEgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmVuZERhdGE7Ci0JCXJldHVybiBnZXREYXRhKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCI8JS0tIik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCI8IS0tIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKE1FVEFEQVRBKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlidWZmZXIuYXBwZW5kKFRZUEUpOwotCQlidWZmZXIuYXBwZW5kKCI9XCIiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQodGhpcy50eXBlKTsKLQkJYnVmZmVyLmFwcGVuZCgiXCIgIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKE1ldGFEYXRhLkVORFNQQU4pOwotCQlTdHJpbmcgZGF0YSA9IGdldEVuZERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIGRlbGltID0gZ2V0RGVsaW1pdGVyKGVsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRlbGltKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRlbGltKTsKLQkJfQotCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCgiLS0lPiIpOy8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZCgiLS0+Iik7Ly8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoIjwlLS0iKTsvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIjwhLS0iKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoTUVUQURBVEEpOwotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoVFlQRSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIj1cIiIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCh0aGlzLnR5cGUpOwotCQlidWZmZXIuYXBwZW5kKCJcIiAiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoTWV0YURhdGEuU1RBUlRTUEFOKTsKLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyBkZWxpbSA9IGdldERlbGltaXRlcihlbGVtZW50LmdldE1vZGVsKCkpOwotCQkJYnVmZmVyLmFwcGVuZChkZWxpbSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRhdGEpOwotCQkJYnVmZmVyLmFwcGVuZChkZWxpbSk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoIi0tJT4iKTsvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIi0tPiIpOy8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IFRhZ0FkYXB0ZXIuY2xhc3MgfHwgdHlwZSA9PSBNZXRhRGF0YUFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKCkgewotCQlpZiAodGhpcy5lbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLmVsZW1lbnQuaGFzU3RhcnRUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMuZWxlbWVudC5oYXNFbmRUYWcoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAodGhpcy5kYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAodGhpcy5lbmREYXRhICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUnVudGltZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuICh0aGlzLnR5cGUgPT0gQU5OT1RBVElPTiB8fCB0aGlzLnR5cGUgPT0gQVVUSE9SX1RJTUVfVklTVUFMKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0KLQkJaWYgKHRoaXMuZWxlbWVudCAhPSBudWxsKQotCQkJdGhpcy5lbGVtZW50Lm5vdGlmeVN0YXJ0VGFnQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZERhdGEoU3RyaW5nIGRhdGEpIHsKLQkJdGhpcy5lbmREYXRhID0gZGF0YTsKLQotCQlpZiAodGhpcy5lbGVtZW50ICE9IG51bGwpCi0JCQl0aGlzLmVsZW1lbnQubm90aWZ5RW5kVGFnQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCi0JCWlmICh0aGlzLmVsZW1lbnQgIT0gbnVsbCkgewotCQkJdGhpcy5lbGVtZW50LnNldENvbW1lbnRUYWcodHJ1ZSk7Ci0JCQlpZiAodGhpcy50eXBlICE9IE1ldGFEYXRhLkFOTk9UQVRJT04pIHsKLQkJCQl0aGlzLmVsZW1lbnQuc2V0SlNQVGFnKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnVudGltZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNSdW50aW1lQ29udGFpbmVyKCkpCi0JCQlyZXR1cm47Ci0KLQkJSURPTU1vZGVsIG1vZGVsID0gdGhpcy5lbGVtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBvZmZzZXQgPSB0aGlzLmVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHRoaXMuZWxlbWVudC5nZXRFbmRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gZW5kIC0gb2Zmc2V0OwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQobW9kZWwsIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UYWdTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2JkNTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UYWdTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgVGFnU2Nhbm5lciB7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWcgPSBudWxsOwotCXByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQlwcml2YXRlIGJvb2xlYW4gb25lTGluZSA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JVGFnU2Nhbm5lcihTdHJpbmcgdGFnLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy50YWcgPSB0YWc7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAodGFnICE9IG51bGwpCi0JCQl0aGlzLmxlbmd0aCA9IHRhZy5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQsIGJvb2xlYW4gb25lTGluZSkgewotCQl0aGlzKHRhZywgb2Zmc2V0KTsKLQotCQl0aGlzLm9uZUxpbmUgPSBvbmVMaW5lOwotCX0KLQotCS8qKgotCSAqLwotCWludCBnZXROZXh0T2Zmc2V0KCkgewotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmICghaXNFbmQoYykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHRoaXMub2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCWludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFbmQoY2hhciBjKSB7Ci0JCXJldHVybiAodGhpcy5vbmVMaW5lICYmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VxdWFsKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJz0nKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUXVvdGUoY2hhciBjKSB7Ci0JCXJldHVybiAoYyA9PSAnIicgfHwgYyA9PSAnXCcnKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3BhY2UoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgY2hhciBuZXh0Q2hhcigpIHsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoaXNFbmQoYykpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIWlzU3BhY2UoYykpCi0JCQkJcmV0dXJuIGM7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICovCi0JU3RyaW5nIG5leHROYW1lKCkgewotCQlpZiAodGhpcy50YWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5sZW5ndGgpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAobmV4dENoYXIoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IG5hbWVPZmZzZXQgPSB0aGlzLm9mZnNldDsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoaXNFbmQoYykgfHwgaXNTcGFjZShjKSkKLQkJCQlicmVhazsKLQkJCWlmIChpc0VxdWFsKGMpICYmIHRoaXMub2Zmc2V0ID4gbmFtZU9mZnNldCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAodGhpcy5vZmZzZXQgPT0gbmFtZU9mZnNldCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiB0aGlzLnRhZy5zdWJzdHJpbmcobmFtZU9mZnNldCwgdGhpcy5vZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCVN0cmluZyBuZXh0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLnRhZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCi0JCWNoYXIgc2VwZXJhdG9yID0gbmV4dENoYXIoKTsKLQkJaWYgKCFpc0VxdWFsKHNlcGVyYXRvcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdGhpcy5vZmZzZXQrKzsgLy8gc2tpcCAnPScKLQkJY2hhciBxdW90ZSA9IG5leHRDaGFyKCk7Ci0JCWlmIChxdW90ZSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpc1F1b3RlKHF1b3RlKSkKLQkJCXRoaXMub2Zmc2V0Kys7Ci0JCWVsc2UKLQkJCXF1b3RlID0gMDsKLQotCQlpbnQgdmFsdWVPZmZzZXQgPSB0aGlzLm9mZnNldDsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoaXNFbmQoYykpIHsKLQkJCQlxdW90ZSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocXVvdGUgPT0gMCkgewotCQkJCWlmIChpc1NwYWNlKGMpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChjID09IHF1b3RlKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpbnQgdmFsdWVFbmQgPSB0aGlzLm9mZnNldDsKLQkJaWYgKHF1b3RlICE9IDAgJiYgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aCkKLQkJCXRoaXMub2Zmc2V0Kys7Ci0JCWlmICh2YWx1ZUVuZCA9PSB2YWx1ZU9mZnNldCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiB0aGlzLnRhZy5zdWJzdHJpbmcodmFsdWVPZmZzZXQsIHZhbHVlRW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVW5rbm93blRhZ0FkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Vbmtub3duVGFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzYwNTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Vbmtub3duVGFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlRhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFVua25vd25UYWdBZGFwdGVyIGltcGxlbWVudHMgVGFnQWRhcHRlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBzdGFydFRhZyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZW5kVGFnID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBVbmtub3duVGFnQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0YWcgPSBudWxsOwotCQlpZiAodGhpcy5lbmRUYWcgIT0gbnVsbCkgewotCQkJdGFnID0gdGhpcy5lbmRUYWc7Ci0JCQl0aGlzLmVuZFRhZyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRhZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IG51bGw7Ci0JCWlmICh0aGlzLnN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXRhZyA9IHRoaXMuc3RhcnRUYWc7Ci0JCQl0aGlzLnN0YXJ0VGFnID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IFRhZ0FkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kVGFnKFN0cmluZyBlbmRUYWcpIHsKLQkJdGhpcy5lbmRUYWcgPSBlbmRUYWc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRUYWcoU3RyaW5nIHN0YXJ0VGFnKSB7Ci0JCXRoaXMuc3RhcnRUYWcgPSBzdGFydFRhZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZDM2OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkhUTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwYXJzZXMgYmVnaW5uaW5nIHBvcnRpb24gb2YgSFRNTCBmaWxlIHRvIGdldCB0aGUgZW5jb2RpbmcgdmFsdWUKLSAqIGluIGEgTUVUQSB0YWcuIEV4YW1wbGU6Ci0gKiA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLSAqIAotICogTm90ZTogZXZlbiB0aG91Z2gsIHRlY2huaWNhbGx5LCBhIE1FVEEgdGFnIG11c3QgY29tZSBpbiBhIDxIRUFEPnRhZywgd2UKLSAqIGRvbid0IGNoZWNrIGZvciB0aGF0LCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHdoYXRldmVyLCBvciB3aGVyZWV2ZXIsIHRoZQotICogdGhlIGZpcnN0IDxNRVRBPnRhZyBpcywgaXQgaXMgdGhlIG9uZSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSB1c2VyLCBhbmQKLSAqIHRoZXkgbWF5IGp1c3QgYmUgdHJ5aW5nIHRvIHJlcGFpciB0aGUgZXJyb3IuIFRoZSBIVE1MIHZhbGlkYXRvciB3aWxsIHRlbGwKLSAqIHRoZW0gaWYgaXRzIGluIHRoZSB3cm9uZyBsb2NhdGlvbi4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudENoYXJzZXREZXRlY3RvciBleHRlbmRzIEhUTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgewotCi0KLQlwdWJsaWMgSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMjdlM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ0d1ZXNzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3MuSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3MuU3R5bGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIHsKLQotCXB1YmxpYyBIVE1MRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCB0YWcgbmFtZXMgdXNpbmcgQmxvY2tNYXJrZXIgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSFRNTGlzaFRhZyhYTUxTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnbmFtZSkgewotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIGZhbHNlKTsKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKGJtKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGVuY29kaW5nLiBGb3IgSFRNTCwgdGhlcmUgaXMgbm8gc3BlYy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKiAgICAgICAgICAgIGJ5dGVbXQotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIGludAotCSAqIAotCSAqIERvIGF1dG9tYXRpYyBlbmNvZGluZyBkZXRlY3Rpb24gYnkgZ3Vlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVuY29kaW5nTmFtZUJ5R3Vlc3MoYnl0ZVtdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlmaW5hbCBTdHJpbmcgaWFuYUVuYyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKHN0cmluZywgbGVuZ3RoKTsKLQkJcmV0dXJuIGlhbmFFbmM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0TG9hZGVyI2NyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpCi0JICovCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpKTsKLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qCi0JICogQHNlZSBJTW9kZWxMb2FkZXIjZ2V0UGFyc2VyKCkKLQkgKi8KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJWE1MU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBYTUxTb3VyY2VQYXJzZXIoKTsKLQkJLy8gZm9yIHRoZSAic3RhdGljIEhUTUwiIGNhc2UsIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZQotCQkvLyBCbG9ja3RhZ3MgaGVyZS4KLQkJYWRkSFRNTGlzaFRhZyhwYXJzZXIsICJzY3JpcHQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRIVE1MaXNoVGFnKHBhcnNlciwgInN0eWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aG9zZSBmYWN0b3JpZXMgd2hpY2ggbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUKLQkgKiBzdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCS8vCi0JCWZhY3RvcnkgPSBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCi0JCWZhY3RvcnkgPSBuZXcgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGRlbGltaXRlciA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCk7Ci0JCWlmIChkZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWRlbGltaXRlciA9IHN1cGVyLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoZmlsZSk7Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCWlmIChmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID09IG51bGwpIHsKLQkJCWZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIERNVzoganVzdCBhZGRlZCB0aGlzIHByZWxvYWQgb24gOC8xNi8yMDAyCi0JCS8vIEkgbm90aWNlZCB0aGUgUHJvYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHdhcyBiZWluZyBhZGRlZCwKLQkJLy8gdGhhdCB0aGF0IHRoZSBQcm9hZ2F0aW5nQWRhcHRlckFkYXB0ZXIgd2FzIG5vdCBiZWluZwotCQkvLyBwcmVsb2FkIGFkYXB0ZWQgLS0gSSdtIGFzc3VpbmcgaXQgQUxXQVlTIGhhcyB0byBiZS4KLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsOwotCQkvLyBpZiB0aGVyZSBpcyBhIG1vZGVsIGluIHRoZSBhZGFwdGVyLCB0aGlzIHdpbGwgYWRhcHQgaXQgdG8KLQkJLy8gZmlyc3Qgbm9kZS4gQWZ0ZXIgdGhhdCB0aGUgUHJvcGFnYXRpbmdBZGF0ZXIgc3ByZWFkcyBvdmVyIHRoZQotCQkvLyBjaGlsZHJlbiBiZWluZwotCQkvLyBjcmVhdGVkLiBFYWNoIHRpbWUgdGhhdCBoYXBwZW5kcywgYSBzaWRlIGVmZmVjdCBpcyB0bwotCQkvLyBhbHNvICJzcHJlYWQiIHNwcmVjaWZpYyByZWdpc3RlcmVkIGFkYXB0ZXJzLAotCQkvLyB0aGV5IHR3byBjYW4gcHJvcGlnYXRlIGlzIG5lZWRlZC4KLQkJKChJTm9kZU5vdGlmaWVyKSBkb21Nb2RlbC5nZXREb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBIVE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTE1vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTE1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGIxNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NU3R5bGVNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3MuSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3MuU3R5bGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuRGVidWdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlLlByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCi0KLQlwdWJsaWMgSFRNTE1vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgdGFnIG5hbWVzIHVzaW5nIEJsb2NrTWFya2VyIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhUTUxpc2hUYWcoWE1MU291cmNlUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ25hbWUpIHsKLQkJQmxvY2tNYXJrZXIgYm0gPSBuZXcgQmxvY2tNYXJrZXIodGFnbmFtZSwgbnVsbCwgRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCBmYWxzZSk7Ci0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihibSk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCURPTVN0eWxlTW9kZWxJbXBsIG1vZGVsID0gbmV3IERPTVN0eWxlTW9kZWxJbXBsKCk7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aG9zZSBmYWN0b3JpZXMgd2hpY2ggbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUKLQkgKiBzdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCS8vCi0JCWZhY3RvcnkgPSBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCi0JCWZhY3RvcnkgPSBuZXcgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJCi0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJc3VwZXIucHJlTG9hZEFkYXB0KHN0cnVjdHVyZWRNb2RlbCk7Ci0JCS8vIERNVzoganVzdCBhZGRlZCB0aGlzIHByZWxvYWQgb24gOC8xNi8yMDAyCi0JCS8vIEkgbm90aWNlZCB0aGUgUHJvYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHdhcyBiZWluZyBhZGRlZCwKLQkJLy8gdGhhdCB0aGF0IHRoZSBQcm9hZ2F0aW5nQWRhcHRlckFkYXB0ZXIgd2FzIG5vdCBiZWluZwotCQkvLyBwcmVsb2FkIGFkYXB0ZWQgLS0gSSdtIGFzc3VpbmcgaXQgQUxXQVlTIGhhcyB0byBiZS4KLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsOwotCQkvLyBpZiB0aGVyZSBpcyBhIG1vZGVsIGluIHRoZSBhZGFwdGVyLCB0aGlzIHdpbGwgYWRhcHQgaXQgdG8KLQkJLy8gZmlyc3Qgbm9kZS4gQWZ0ZXIgdGhhdCB0aGUgUHJvcGFnYXRpbmdBZGF0ZXIgc3ByZWFkcyBvdmVyIHRoZQotCQkvLyBjaGlsZHJlbiBiZWluZwotCQkvLyBjcmVhdGVkLiBFYWNoIHRpbWUgdGhhdCBoYXBwZW5kcywgYSBzaWRlIGVmZmVjdCBpcyB0bwotCQkvLyBhbHNvICJzcHJlYWQiIHNwcmVjaWZpYyByZWdpc3RlcmVkIGFkYXB0ZXJzLAotCQkvLyB0aGV5IHR3byBjYW4gcHJvcGlnYXRlIGlzIG5lZWRlZC4KLQkJKChJTm9kZU5vdGlmaWVyKSBkb21Nb2RlbC5nZXREb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cykgewotCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ldyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkpOwotCQl9CX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSFRNTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBIVE1MRG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0VtYmVkZGVkQ1NTRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0VtYmVkZGVkQ1NTRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZWM2NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9FbWJlZGRlZENTU0Zvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRDU1NGb3JtYXR0ZXIgZXh0ZW5kcyBIVE1MRm9ybWF0dGVyIHsKLQotCS8vIHByaXZhdGUgSUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcKLQkvLyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5KENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcywgdHJ1ZSk7Ci0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEVtYmVkZGVkQ1NTRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NVGV4dCB0ZXh0ID0gKElET01UZXh0KSBub2RlOwotCi0JCVN0cmluZyBzb3VyY2UgPSBnZXRDU1NDb250ZW50KG5vZGUpOwotCQlpZiAoc291cmNlID09IG51bGwpIHsgLy8gZmFsbGJhY2sKLQkJCXNvdXJjZSA9IHRleHQuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gdGV4dC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gdGV4dC5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQkJcmVwbGFjZVNvdXJjZSh0ZXh0LmdldE1vZGVsKCksIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCQlzZXRXaWR0aChjb250cmFpbnRzLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENTU0NvbnRlbnQoSURPTU5vZGUgdGV4dCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRDU1NNb2RlbCh0ZXh0KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU05vZGUgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkvLyB0cnkgYW5vdGhlciB3YXkgdG8gZ2V0IGZvcm1hdHRlcgotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpCi0JCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vdGlmaWVyKTsKLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBmb3JtYXR0ZXIuZm9ybWF0KGRvY3VtZW50KTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCBnZXRDU1NNb2RlbChJRE9NTm9kZSB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZVNoZWV0QWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0eWxlU2hlZXRBZGFwdGVyIHN0eWxlQWRhcHRlciA9IChJU3R5bGVTaGVldEFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCXJldHVybiBzdHlsZUFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRWxlbWVudEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRWxlbWVudEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTE0ZGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEVsZW1lbnRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlIENTUyBmb3JtYXR0aW5nCi0KLXB1YmxpYyBjbGFzcyBIVE1MRWxlbWVudEZvcm1hdHRlciBleHRlbmRzIEhUTUxGb3JtYXR0ZXIgewotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxFbGVtZW50Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjb21wcmVzc1RhaWxpbmdTcGFjZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSByZWdpb24uZ2V0VGV4dEVuZCgpOwotCQlpbnQgY291bnQgPSByZWdpb24uZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCWlmIChjb3VudCA9PSAxKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZmxhdE5vZGUuZ2V0RnVsbFRleHQocmVnaW9uKTsKLQkJCWludCBzdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5jaGFyQXQob2Zmc2V0IC0gc3RhcnQpID09ICcgJykgewotCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJcmVwbGFjZVNvdXJjZShmbGF0Tm9kZSwgb2Zmc2V0LCBjb3VudCwgIiAiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdEVuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50LCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCU5vZGUgbGFzdENoaWxkID0gZWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLQotCQlpZiAobGFzdENoaWxkICE9IG51bGwgJiYgbGFzdENoaWxkIGluc3RhbmNlb2YgSURPTUVsZW1lbnQgJiYgbGFzdENoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJqc3A6c2NyaXB0bGV0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW5zZXJ0QnJlYWtBZnRlcigoSURPTUVsZW1lbnQpIGxhc3RDaGlsZCwgY29udHJhaW50cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkgfHwgZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJU3RyaW5nIGVuZFRhZyA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQlpZiAoZW5kVGFnICE9IG51bGwgJiYgZW5kVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIGVuZFRhZyk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZyhyZWdpb25UeXBlKSkgewotCQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkUm9vdFRhZyhwcmV2UmVnaW9uLmdldFR5cGUoKSkpKSB7Ci0JCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwcmV2UmVnaW9uID0gcmVnaW9uOwotCQl9Ci0JCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkUm9vdFRhZyhwcmV2UmVnaW9uLmdldFR5cGUoKSkpKSB7Ci0JCQlyZW1vdmVUYWlsaW5nU3BhY2VzKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCX0KLQotCQkvLyBCVUcxMjM4OTAgKGVuZCB0YWcgbGVuZ3RoIHdhcyBhbHJlYWR5IHByZWZhY3RvcmVkIGludG8KLQkJLy8gZm9ybWF0U3RhcnRUYWcgc28gbm8gbmVlZCB0byBkbyBpdCBoZXJlKQotCQkvLyBTdHJpbmcgbmV3RW5kVGFnID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJLy8gaWYgKG5ld0VuZFRhZyAhPSBudWxsICYmIG5ld0VuZFRhZy5sZW5ndGgoKSA+IDApIHsKLQkJLy8gc2V0V2lkdGgoY29udHJhaW50cywgbmV3RW5kVGFnKTsKLQkJLy8gfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCi0JCWZvcm1hdFN0YXJ0VGFnKGVsZW1lbnQsIGNvbnRyYWludHMpOwotCi0JCWZvcm1hdENoaWxkTm9kZXMoZWxlbWVudCwgY29udHJhaW50cyk7Ci0KLQkJZm9ybWF0RW5kVGFnKGVsZW1lbnQsIGNvbnRyYWludHMpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRTdGFydFRhZyhJRE9NRWxlbWVudCBlbGVtZW50LCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0KLQkJaWYgKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImpzcDpzY3JpcHRsZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpbnNlcnRCcmVha0JlZm9yZShlbGVtZW50LCBjb250cmFpbnRzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFdlIHNob3VsZCBmb3JtYXQgYXR0cmlidXRlcyBpbiBKU1BUYWc/Ci0JCS8vIGlmIChlbGVtZW50LmlzSlNQVGFnKCkgfHwgZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJU3RyaW5nIHN0YXJ0VGFnID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQkJaWYgKHN0YXJ0VGFnICE9IG51bGwgJiYgc3RhcnRUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgc3RhcnRUYWcpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmlyc3QgcHJvY2VzcyBzdHlsZSBhdHRyaWJ1dGUKLQkJaWYgKGVsZW1lbnQuaXNHbG9iYWxUYWcoKSkgewotCQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCJzdHlsZSIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJZm9ybWF0U3R5bGVBdHRyKGF0dHIpOwotCQl9Ci0JCWJvb2xlYW4gaW5zZXJ0QnJlYWsgPSBmYWxzZTsKLQkJaW5zZXJ0QnJlYWsgPSAoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSkuZ2V0U3BsaXRNdWx0aUF0dHJzKCk7Ci0JCWJvb2xlYW4gYWxpZ25FbmRCcmFja2V0ID0gKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGdldEZvcm1hdFByZWZlcmVuY2VzKCkpLmlzQWxpZ25FbmRCcmFja2V0KCk7Ci0JCWJvb2xlYW4gYXR0cmlidXRlc1NwbGl0dGVkID0gZmFsc2U7Ci0KLQkJaWYgKGluc2VydEJyZWFrKSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCB8fCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpIDwgMikKLQkJCQlpbnNlcnRCcmVhayA9IGZhbHNlOwotCQl9Ci0JCVN0cmluZyBicmVha1NwYWNlcyA9IGdldEJyZWFrU3BhY2VzKGVsZW1lbnQpOwotCQlTdHJpbmcgb3JpZ2luYWxCcmVha1NwYWNlcyA9IGJyZWFrU3BhY2VzOwotCQlTdHJpbmcgaW5kZW50ID0gZ2V0SW5kZW50KCk7Ci0JCWlmIChpbmRlbnQgIT0gbnVsbCAmJiBpbmRlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlicmVha1NwYWNlcyArPSBpbmRlbnQ7Ci0JCX0KLQkJSVRleHRSZWdpb24gbGFzdEJyZWFrUmVnaW9uID0gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQotCQkJSVRleHRSZWdpb24gYnJlYWtSZWdpb24gPSBudWxsOwotCi0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZyhyZWdpb25UeXBlKSkgewotCQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCQkJfQotCQkJCWJyZWFrUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUgfHwgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpKSB7Ci0JCQkJCS8vIGF0dHJpYnV0ZSBuYW1lIHdpdGhvdXQgdmFsdWUKLQkJCQkJYnJlYWtSZWdpb24gPSBwcmV2UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQkJCX0KLQkJCQlicmVha1JlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSkgewotCQkJCQkvLyBhdHRyaWJ1dGUgbmFtZSB3aXRob3V0IHZhbHVlCi0JCQkJCWJyZWFrUmVnaW9uID0gcHJldlJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChicmVha1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IGVuZCA9IGJyZWFrUmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCQlpZiAobGFzdEJyZWFrUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IG9mZnNldCA9IGxhc3RCcmVha1JlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJaW50IGNvdW50ID0gZW5kIC0gb2Zmc2V0OwotCQkJCQlpZiAoaW5zZXJ0QnJlYWsgfHwgIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgY291bnQgKyAxKSkgewotCQkJCQkJcmVwbGFjZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbiwgYnJlYWtTcGFjZXMpOwotCQkJCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJCQkJYXR0cmlidXRlc1NwbGl0dGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWNvbXByZXNzVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uKTsKLQkJCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJCQl9Ci0JCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvdW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGVuZCk7Ci0JCQkJfQotCQkJCWxhc3RCcmVha1JlZ2lvbiA9IGJyZWFrUmVnaW9uOwotCQkJfQotCi0JCQlwcmV2UmVnaW9uID0gcmVnaW9uOwotCQl9Ci0JCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykpIHsKLQkJCS8vIGF0dHJpYnV0ZSBuYW1lIHdpdGhvdXQgdmFsdWUKLQkJCWludCBlbmQgPSBwcmV2UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCWlmIChsYXN0QnJlYWtSZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBsYXN0QnJlYWtSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJaW50IGNvdW50ID0gZW5kIC0gb2Zmc2V0OwotCQkJCWlmIChpbnNlcnRCcmVhayB8fCAhaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCBjb3VudCArIDEpKSB7Ci0JCQkJCXJlcGxhY2VUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24sIGJyZWFrU3BhY2VzKTsKLQkJCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJCQlhdHRyaWJ1dGVzU3BsaXR0ZWQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29tcHJlc3NUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQl9Ci0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgY291bnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgZW5kKTsKLQkJCX0KLQkJCWxhc3RCcmVha1JlZ2lvbiA9IHByZXZSZWdpb247Ci0JCX0KLQotCQlpZiAobGFzdEJyZWFrUmVnaW9uICE9IG51bGwpIHsKLQkJCWludCBvZmZzZXQgPSBsYXN0QnJlYWtSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJaW50IGNvdW50ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkgLSBvZmZzZXQ7Ci0JCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCWNvbXByZXNzVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uKTsKLQkJCQljb3VudCsrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uKTsKLQkJCQkvLyBCVUcxMjM4OTAgKHByZS1mYWN0b3IgaW4gZW5kIHRhZykKLQkJCQljb3VudCArPSBlbGVtZW50LmdldFRhZ05hbWUoKS5sZW5ndGgoKSArIDM7Ci0JCQl9Ci0JCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb3VudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRXaWR0aChjb250cmFpbnRzLCBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCX0KLQkJLy8gQlVHMTEzNTg0IC0gYWxpZ24gbGFzdCBicmFja2V0Ci0JCWlmIChhbGlnbkVuZEJyYWNrZXQgJiYgYXR0cmlidXRlc1NwbGl0dGVkKSB7Ci0JCQlyZW1vdmVUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJcmVwbGFjZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbiwgb3JpZ2luYWxCcmVha1NwYWNlcyk7Ci0JCQljb250cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChnZXRMaW5lV2lkdGgoKSAtIG9yaWdpbmFsQnJlYWtTcGFjZXMubGVuZ3RoKCkgLSAxKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0ZWRUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJZmluYWwgU3RyaW5nIEpTUF9ST09UX1RBR19OQU1FID0gIkpTUF9ST09UX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlLmVxdWFscyhKU1BfUk9PVF9UQUdfTkFNRSkgfHwgcmVnaW9uVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkUm9vdFRhZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZS5lcXVhbHMoSlNQX1JPT1RfVEFHX05BTUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFN0eWxlQXR0cihBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gaWYgc29tZW9uZSdzIG1hZGUgaXQgYSBjb250YWluZXIgc29tZWhvdywgQ1NTIGNhbid0IGZvcm1hdCBpdAotCQlpZiAoKChJRE9NTm9kZSkgYXR0cikuZ2V0VmFsdWVSZWdpb24oKSBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdmFsdWUgPSBnZXRDU1NWYWx1ZShhdHRyKTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBvbGRWYWx1ZSA9ICgoSURPTU5vZGUpIGF0dHIpLmdldFZhbHVlU291cmNlKCk7Ci0JCWlmIChvbGRWYWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpCi0JCQlyZXR1cm47Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSUNTU01vZGVsIGdldENTU01vZGVsKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyIHN0eWxlQWRhcHRlciA9IChJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCXJldHVybiBzdHlsZUFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDU1NWYWx1ZShBdHRyIGF0dHIpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0Q1NTTW9kZWwoYXR0cik7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDU1NOb2RlIGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudDsKLQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IChDU1NTb3VyY2VGb3JtYXR0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJLy8gdHJ5IGFub3RoZXIgd2F5IHRvIGdldCBmb3JtYXR0ZXIKLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKQotCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub3RpZmllcik7Ci0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gZm9ybWF0dGVyLmZvcm1hdChkb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVRhaWxpbmdTcGFjZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSByZWdpb24uZ2V0VGV4dEVuZCgpOwotCQlpbnQgY291bnQgPSByZWdpb24uZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCWlmIChjb3VudCA8PSAwKQotCQkJcmV0dXJuOwotCQlyZXBsYWNlU291cmNlKGZsYXROb2RlLCBvZmZzZXQsIGNvdW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwbGFjZVRhaWxpbmdTcGFjZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uLCBTdHJpbmcgc3BhY2VzKSB7Ci0JCWludCBvZmZzZXQgPSByZWdpb24uZ2V0VGV4dEVuZCgpOwotCQlpbnQgY291bnQgPSByZWdpb24uZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCWlmIChjb3VudCA9PSBzcGFjZXMubGVuZ3RoKCkpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBmbGF0Tm9kZS5nZXRGdWxsVGV4dChyZWdpb24pOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5lbmRzV2l0aChzcGFjZXMpKSB7Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlyZXBsYWNlU291cmNlKGZsYXROb2RlLCBvZmZzZXQsIGNvdW50LCBzcGFjZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXRDb250cmFpbnRzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0Q29udHJhaW50c0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4MTUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXRDb250cmFpbnRzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKiBQbGVhc2UgdW4tZGVwcmVjYXRlIHRoaXMgaWYgUGFnZSBEZXNpZ25lciB0aGlua3MgdGhleSBhcmUgbmVlZGVkLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTEZvcm1hdENvbnRyYWludHNJbXBsIGV4dGVuZHMgU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgaW1wbGVtZW50cyBIVE1MRm9ybWF0Q29udHJhaW50cyB7Ci0JcHJvdGVjdGVkIGludCBmQXZhaWxhYmxlTGluZVdpZHRoOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAJSXQncyB2ZXJ5IGhhcmQgdG8ga2VlcCB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggYWNjdXJhdGUuCi0JICogCVNvbWV0aW1lcyBhIG5vZGUgd2FudHMgdG8gc3RhcnQgb24gYSBuZXcgbGluZSwgc29tZXRpbWVzIGl0IGRvZXNuJ3QuCi0JICogCUl0J3MgYmVzdCBmb3IgdGhlIG5vZGUgdG8gZmlndXJlIG91dCB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggb24gdGhlIGZseS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEF2YWlsYWJsZUxpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGZBdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAJSXQncyB2ZXJ5IGhhcmQgdG8ga2VlcCB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggYWNjdXJhdGUuCi0JICogCVNvbWV0aW1lcyBhIG5vZGUgd2FudHMgdG8gc3RhcnQgb24gYSBuZXcgbGluZSwgc29tZXRpbWVzIGl0IGRvZXNuJ3QuCi0JICogCUl0J3MgYmVzdCBmb3IgdGhlIG5vZGUgdG8gZmlndXJlIG91dCB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggb24gdGhlIGZseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVMaW5lV2lkdGgoaW50IGF2YWlsYWJsZUxpbmVXaWR0aCkgewotCQlmQXZhaWxhYmxlTGluZVdpZHRoID0gYXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdFByb2Nlc3NvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdFByb2Nlc3NvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmJjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXRQcm9jZXNzb3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTEZvcm1hdFByb2Nlc3NvckltcGwgZXh0ZW5kcyBGb3JtYXRQcm9jZXNzb3JYTUwgewotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICJodG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IEhUTUxGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRm9ybWF0dGVyKG5vZGUsIGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRBbGlnbkVuZEJyYWNrZXQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCQl9Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEluZGVudChpbmRlbnQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdFByZWZlcmVuY2VzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQyODgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgSFRNTEZvcm1hdHRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX05BTUUgPSAiaHRtbCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX05BTUUgPSAiQk9EWSI7Ly8kTk9OLU5MUy0xJAotCS8vIGhpZGRlbiBqc3AgbG9naWMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIGpzcCBmb3JtYXR0ZXIgaXMgY3JlYXRlZAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1AgPSAianNwIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXaWR0aChIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzLCBpbnQgd2lkdGgpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFzcGxpdExpbmVzKCkgfHwgZ2V0TGluZVdpZHRoKCkgPCAwKQotCQkJcmV0dXJuOwotCi0JCWludCBhdmFpbGFibGVXaWR0aCA9IGNvbnRyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgLSB3aWR0aDsKLQkJaWYgKGF2YWlsYWJsZVdpZHRoIDwgMCkKLQkJCWF2YWlsYWJsZVdpZHRoID0gMDsKLQkJY29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlV2lkdGgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkZvcm1hdENoaWxkKE5vZGUgbm9kZSkgewotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybiB0cnVlOwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKSB7Ci0JCQkJCWJvb2xlYW4gc2hvdWxkS2VlcFNwYWNlID0gKChCb29sZWFuKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKHNob3VsZEtlZXBTcGFjZSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydEJyZWFrQWZ0ZXIoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlpZiAoaGludCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGhpbnQuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EKSB8fCBoaW50LmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19BRlRFUl9TVEFSVCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydEJyZWFrQWZ0ZXIoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCS8vIHNwZWNpYWwgZXhjZXB0aW9uIGlmIHRoaXMgbm9kZSBpcyBhIG5vbi1IVE1MIHRhZyAobGlrZSBKU1AKLQkJLy8gZWxlbWVudHMpCi0JCS8vIEJVRzE4ODA5MyAtIG9ubHkgcHJlc2VydmUgd2hpdGVzcGFjZSBmb3IganNwIChub3QgY3VzdG9tKSB0YWdzCi0JCVN0cmluZyBwcmVmaXggPSBub2RlLmdldFByZWZpeCgpOwotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgSlNQLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQlib29sZWFuIGNhbkluc2VydEJyZWFrQWZ0ZXIgPSBmYWxzZTsKLQkJCS8vIGlmIGEgd2hpdGVzcGFjZSBkb2VzIG5vdCBleGlzdCBhZnRlciBpdCwgZG8gbm90IGFkZCBvbmUKLQkJCWlmIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIHRoZVRleHQgPSAoKFRleHQpIG5leHQpLmdldERhdGEoKTsKLQkJCQlpZiAodGhlVGV4dCAhPSBudWxsICYmIHRoZVRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWNoYXIgdGhlQ2hhciA9IHRoZVRleHQuY2hhckF0KDApOwotCQkJCQljYW5JbnNlcnRCcmVha0FmdGVyID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0aGVDaGFyKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiBjYW5ub3QgaW5zZXJ0IGJyZWFrLCBnbyBhaGVhZCBhbmQgcmV0dXJuIGZhbHNlIChvdGhlcndpc2UsCi0JCQkvLyBjb250aW51ZSBwcm9jZXNzaW5nKQotCQkJaWYgKCFjYW5JbnNlcnRCcmVha0FmdGVyKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIHNwZWNpYWwgZXhjZXB0aW9uIGlmIG5leHQgbm9kZSBpcyBhIG5vbi1IVE1MIHRhZyAobGlrZSBKU1AKLQkJLy8gZWxlbWVudHMpCi0JCS8vIEJVRzE4ODA5MyAtIG9ubHkgcHJlc2VydmUgd2hpdGVzcGFjZSBmb3IganNwIChub3QgY3VzdG9tKSB0YWdzCi0JCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCXByZWZpeCA9IG5leHQuZ2V0UHJlZml4KCk7Ci0JCQlpZiAocHJlZml4ICE9IG51bGwgJiYgSlNQLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQkJYm9vbGVhbiBjYW5JbnNlcnRCcmVha0FmdGVyUHJldmlvdXMgPSBmYWxzZTsKLQkJCQkvLyBpZiBhIHdoaXRlc3BhY2UgZG9lcyBub3QgZXhpc3QgYmVmb3JlIGl0LCBkbyBub3QgYWRkIG9uZQotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJU3RyaW5nIHRoZVRleHQgPSAoKFRleHQpIG5vZGUpLmdldERhdGEoKTsKLQkJCQkJaWYgKHRoZVRleHQgIT0gbnVsbCAmJiB0aGVUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJY2hhciB0aGVDaGFyID0gdGhlVGV4dC5jaGFyQXQodGhlVGV4dC5sZW5ndGgoKSAtIDEpOwotCQkJCQkJY2FuSW5zZXJ0QnJlYWtBZnRlclByZXZpb3VzID0gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0aGVDaGFyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBpZiBjYW5ub3QgaW5zZXJ0IGJyZWFrLCBnbyBhaGVhZCBhbmQgcmV0dXJuIGZhbHNlCi0JCQkJLy8gKG90aGVyd2lzZSwKLQkJCQkvLyBjb250aW51ZSBwcm9jZXNzaW5nKQotCQkJCWlmICghY2FuSW5zZXJ0QnJlYWtBZnRlclByZXZpb3VzKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIGRvIG5vdCBpbnNlcnQgYnJlYWsgYWZ0ZXIgdW5jbG9zZWQgdGFnCi0JCQkJaWYgKCEoKElET01FbGVtZW50KSBub2RlKS5pc0Nsb3NlZCgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJLy8gZG8gbm90IGluc2VydCBicmVhayBiZWZvcmUgbWlzc2luZyBlbmQgdGFnCi0JCQlpZiAobmV4dCA9PSBudWxsICYmIGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGluc2VydCBsaW5lIGJyZWFrIHVuZGVyIG5vbi1IVE1MIGVsZW1lbnRzIGluY2x1ZGluZyBKU1AKLQkJCS8vIGVsZW1lbnRzCi0JCQlpZiAoZWxlbWVudC5nZXRQcmVmaXgoKSAhPSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCWlmIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkvLyBzcGVjaWFsIGZvciBkaXJlY3QgY2hpbGRyZW4gdW5kZXIgQk9EWQotCQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJPRFlfTkFNRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihkZWNsKSkgewotCQkJCS8vIHNwY2lhbCBmb3IgQlIKLQkJCQlyZXR1cm4gY2FuRm9ybWF0Q2hpbGQocGFyZW50KTsKLQkJCX0KLQkJfQotCQlpZiAobmV4dCAhPSBudWxsICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbmV4dCk7Ci0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtCZWZvcmUoZGVjbCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydEJyZWFrQmVmb3JlKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGhpbnQgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKTsKLQkJaWYgKGhpbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGhpbnQuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5JbnNlcnRCcmVha0JlZm9yZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCi0JCS8vIHNwZWNpYWwgZXhjZXB0aW9uIGlmIHRoaXMgbm9kZSBpcyBhIG5vbi1IVE1MIHRhZyAobGlrZSBKU1AKLQkJLy8gZWxlbWVudHMpCi0JCS8vIEJVRzE4ODA5MyAtIG9ubHkgcHJlc2VydmUgd2hpdGVzcGFjZSBmb3IganNwIChub3QgY3VzdG9tKSB0YWdzCi0JCVN0cmluZyBwcmVmaXggPSBub2RlLmdldFByZWZpeCgpOwotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgSlNQLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQlib29sZWFuIGNhbkluc2VydEJyZWFrQmVmb3JlID0gZmFsc2U7Ci0JCQkvLyBpZiBhIHdoaXRlc3BhY2UgZG9lcyBub3QgZXhpc3QgYmVmb3JlIGl0LCBkbyBub3QgYWRkIG9uZQotCQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlTdHJpbmcgdGhlVGV4dCA9ICgoVGV4dCkgcHJldikuZ2V0RGF0YSgpOwotCQkJCWlmICh0aGVUZXh0ICE9IG51bGwgJiYgdGhlVGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJY2hhciB0aGVDaGFyID0gdGhlVGV4dC5jaGFyQXQodGhlVGV4dC5sZW5ndGgoKSAtIDEpOwotCQkJCQljYW5JbnNlcnRCcmVha0JlZm9yZSA9IENoYXJhY3Rlci5pc1doaXRlc3BhY2UodGhlQ2hhcik7Ci0JCQkJfQotCQkJfQotCQkJLy8gaWYgY2Fubm90IGluc2VydCBicmVhaywgZ28gYWhlYWQgYW5kIHJldHVybiBmYWxzZSAob3RoZXJ3aXNlLAotCQkJLy8gY29udGludWUgcHJvY2Vzc2luZykKLQkJCWlmICghY2FuSW5zZXJ0QnJlYWtCZWZvcmUpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gc3BlY2lhbCBleGNlcHRpb24gaWYgcHJldmlvdXMgbm9kZSBpcyBhIG5vbi1IVE1MIHRhZyAobGlrZSBKU1AKLQkJLy8gZWxlbWVudHMpCi0JCS8vIEJVRzE4ODA5MyAtIG9ubHkgcHJlc2VydmUgd2hpdGVzcGFjZSBmb3IganNwIChub3QgY3VzdG9tKSB0YWdzCi0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXByZWZpeCA9IHByZXYuZ2V0UHJlZml4KCk7Ci0JCQlpZiAocHJlZml4ICE9IG51bGwgJiYgSlNQLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQkJYm9vbGVhbiBjYW5JbnNlcnRCcmVha0JlZm9yZU5leHQgPSBmYWxzZTsKLQkJCQkvLyBpZiBhIHdoaXRlc3BhY2UgZG9lcyBub3QgZXhpc3QgYWZ0ZXIgaXQsIGRvIG5vdCBhZGQgb25lCi0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQlTdHJpbmcgdGhlVGV4dCA9ICgoVGV4dCkgbm9kZSkuZ2V0RGF0YSgpOwotCQkJCQlpZiAodGhlVGV4dCAhPSBudWxsICYmIHRoZVRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQljaGFyIHRoZUNoYXIgPSB0aGVUZXh0LmNoYXJBdCgwKTsKLQkJCQkJCWNhbkluc2VydEJyZWFrQmVmb3JlTmV4dCA9IENoYXJhY3Rlci5pc1doaXRlc3BhY2UodGhlQ2hhcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gaWYgY2Fubm90IGluc2VydCBicmVhaywgZ28gYWhlYWQgYW5kIHJldHVybiBmYWxzZQotCQkJCS8vIChvdGhlcndpc2UsCi0JCQkJLy8gY29udGludWUgcHJvY2Vzc2luZykKLQkJCQlpZiAoIWNhbkluc2VydEJyZWFrQmVmb3JlTmV4dCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJLy8gZG8gbm90IGluc2VydCBicmVhayBhZnRlciBtaXNzaW5nIHN0YXJ0IHRhZwotCQkJaWYgKHByZXYgPT0gbnVsbCAmJiBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCS8vIGluc2VydCBsaW5lIGJyZWFrIHVuZGVyIG5vbi1IVE1MIGVsZW1lbnRzIGluY2x1ZGluZyBKU1AKLQkJCS8vIGVsZW1lbnRzCi0JCQlpZiAoZWxlbWVudC5nZXRQcmVmaXgoKSAhPSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCWlmIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkvLyBzcGVjaWFsIGZvciBkaXJlY3QgY2hpbGRyZW4gdW5kZXIgQk9EWQotCQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJPRFlfTkFNRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtCZWZvcmUoZGVjbCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIHByZXYpOwotCQkJaWYgKGNhbkluc2VydEJyZWFrQWZ0ZXIoZGVjbCkpIHsKLQkJCQkvLyBzcGNpYWwgZm9yIEJSCi0JCQkJcmV0dXJuIGNhbkZvcm1hdENoaWxkKHBhcmVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUpIHsKLQkJZm9ybWF0KG5vZGUsIGdldEZvcm1hdENvbnRyYWludHMoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSAmJiBjb250cmFpbnRzIGluc3RhbmNlb2YgSFRNTEZvcm1hdENvbnRyYWludHMpCi0JCQlmb3JtYXQoKElET01Ob2RlKSBub2RlLCAoSFRNTEZvcm1hdENvbnRyYWludHMpIGNvbnRyYWludHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBkbyBub3QgZm9ybWF0IHJlbW92ZWQgbm9kZQotCi0JCXNldFdpZHRoKGNvbnRyYWludHMsIG5vZGUpOwotCi0JCWlmIChjYW5JbnNlcnRCcmVha0JlZm9yZShub2RlKSkKLQkJCWluc2VydEJyZWFrQmVmb3JlKG5vZGUsIGNvbnRyYWludHMpOwotCi0JCWZvcm1hdE5vZGUobm9kZSwgY29udHJhaW50cyk7Ci0KLQkJaWYgKGNhbkluc2VydEJyZWFrQWZ0ZXIobm9kZSkpCi0JCQlpbnNlcnRCcmVha0FmdGVyKG5vZGUsIGNvbnRyYWludHMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdENoaWxkTm9kZXMoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIW5vZGUuaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuOwotCi0JCS8vIGNvbmNhdCBhZGphY2VudCB0ZXh0cwotCQlub2RlLm5vcm1hbGl6ZSgpOwotCi0JCS8vIGRpc2FibGUgc2libGluZyBpbmRlbnQgZHVyaW5nIGZvcm1hdHRpbmcgYWxsIHRoZSBjaGlsZHJlbgotCQlib29sZWFuIGluZGVudCA9IGZhbHNlOwotCQlpZiAoY29udHJhaW50cyAhPSBudWxsKSB7Ci0JCQlpbmRlbnQgPSBjb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCk7Ci0JCQljb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGZhbHNlKTsKLQkJfQotCi0JCWJvb2xlYW4gaW5zZXJ0QnJlYWsgPSB0cnVlOwotCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0UGFyZW50Tm9kZSgpICE9IG5vZGUpCi0JCQkJYnJlYWs7Ci0JCQlJRE9NTm9kZSBuZXh0ID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCQlpZiAoaW5zZXJ0QnJlYWsgJiYgY2FuSW5zZXJ0QnJlYWtCZWZvcmUoY2hpbGQpKSB7Ci0JCQkJaW5zZXJ0QnJlYWtCZWZvcmUoY2hpbGQsIGNvbnRyYWludHMpOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBIVE1MRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUZvcm1hdHRlcihjaGlsZCwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCQlpZiAoZm9ybWF0dGVyIGluc3RhbmNlb2YgSFRNTEZvcm1hdHRlcikgewotCQkJCQlIVE1MRm9ybWF0dGVyIGh0bWxGb3JtYXR0ZXIgPSAoSFRNTEZvcm1hdHRlcikgZm9ybWF0dGVyOwotCQkJCQlodG1sRm9ybWF0dGVyLmZvcm1hdE5vZGUoY2hpbGQsIGNvbnRyYWludHMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZm9ybWF0dGVyLmZvcm1hdChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihjaGlsZCkpIHsKLQkJCQlpbnNlcnRCcmVha0FmdGVyKGNoaWxkLCBjb250cmFpbnRzKTsKLQkJCQlpbnNlcnRCcmVhayA9IGZhbHNlOyAvLyBub3QgdG8gaW5zZXJ0IHR3aWNlCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnNlcnRCcmVhayA9IHRydWU7Ci0JCQl9Ci0KLQkJCWNoaWxkID0gbmV4dDsKLQkJfQotCi0JCWlmIChjb250cmFpbnRzICE9IG51bGwpCi0JCQljb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGluZGVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7IC8vIGNvbnRhaW5lcgotCQkJZm9ybWF0Q2hpbGROb2Rlcyhub2RlLCBjb250cmFpbnRzKTsKLQkJfQotCQllbHNlIHsgLy8gbGVhZgotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHNvdXJjZSA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCkgewotCQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QnJlYWtTcGFjZXMoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlTdHJpbmcgZGVsaW0gPSAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJaWYgKGRlbGltICE9IG51bGwgJiYgZGVsaW0ubGVuZ3RoKCkgPiAwKQotCQkJYnVmZmVyLmFwcGVuZChkZWxpbSk7Ci0KLQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudCgpOwotCQlpZiAoaW5kZW50ICE9IG51bGwgJiYgaW5kZW50Lmxlbmd0aCgpID4gMCkgewotCQkJZm9yIChOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gaWdub3JlIG9taXR0ZWQgdGFnCi0JCQkJaWYgKCgoSURPTU5vZGUpIHBhcmVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQotCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHBhcmVudDsKLQkJCQlpZiAoZWxlbWVudC5nZXRQcmVmaXgoKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJCQkvLyBzcGVjaWFsIGZvciBodG1sOmh0bWwKLQkJCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmICFsb2NhbE5hbWUuZXF1YWxzKEhUTUxfTkFNRSkpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoaW5kZW50KTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJCWlmIChkZWNsICE9IG51bGwgJiYgZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JTkRFTlRfQ0hJTERfU09VUkNFKSkgewotCQkJCQlib29sZWFuIHNob3VsZEluZGVudCA9ICgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JTkRFTlRfQ0hJTERfU09VUkNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChzaG91bGRJbmRlbnQpCi0JCQkJCQlidWZmZXIuYXBwZW5kKGluZGVudCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmRlbnQoKSB7Ci0JCXJldHVybiBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldEluZGVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TGluZVdpZHRoKCkgewotCQlyZXR1cm4gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydEJyZWFrQWZ0ZXIoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuOwotCQkvLyBkb24ndCBpbnNlcnQgYnJlYWsgaWYgbm9kZSBpcyBvbiB0aGUgbGFzdCBsaW5lCi0JCWludCBkb2N1bWVudExlbmd0aCA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChkb2N1bWVudExlbmd0aCA8IDEgfHwgKG5vZGUuZ2V0RW5kT2Zmc2V0KCkgPj0gKGRvY3VtZW50TGVuZ3RoIC0gMSkpKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQlTdHJpbmcgc3BhY2VzID0gbnVsbDsKLQkJaWYgKG5leHQgPT0gbnVsbCkgeyAvLyBsYXN0IHNwYWNlcwotCQkJLy8gdXNlIHBhcmVudCBpbmRlbnQgZm9yIHRoZSBlbmQgdGFnCi0JCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhwYXJlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJaWYgKGNvbnRyYWludHMgIT0gbnVsbCAmJiBjb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpIHsKLQkJCQlJRE9NTm9kZSB0ZXh0ID0gKElET01Ob2RlKSBuZXh0OwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IEhUTUxGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRm9ybWF0dGVyKHRleHQsIGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQkJCWlmIChmb3JtYXR0ZXIgaW5zdGFuY2VvZiBIVE1MVGV4dEZvcm1hdHRlcikgewotCQkJCQlIVE1MVGV4dEZvcm1hdHRlciB0ZXh0Rm9ybWF0dGVyID0gKEhUTUxUZXh0Rm9ybWF0dGVyKSBmb3JtYXR0ZXI7Ci0JCQkJCXRleHRGb3JtYXR0ZXIuZm9ybWF0VGV4dCh0ZXh0LCBjb250cmFpbnRzLCBIVE1MVGV4dEZvcm1hdHRlci5GT1JNQVRfSEVBRCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UgewotCQkJc3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCX0KLQkJaWYgKHNwYWNlcyA9PSBudWxsIHx8IHNwYWNlcy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCXJlcGxhY2VTb3VyY2Uobm9kZS5nZXRNb2RlbCgpLCBub2RlLmdldEVuZE9mZnNldCgpLCAwLCBzcGFjZXMpOwotCQlzZXRXaWR0aChjb250cmFpbnRzLCBzcGFjZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydEJyZWFrQmVmb3JlKElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCi0JCVN0cmluZyBzcGFjZXMgPSBudWxsOwotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJaWYgKGNvbnRyYWludHMgIT0gbnVsbCAmJiBjb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpIHsKLQkJCQlJRE9NTm9kZSB0ZXh0ID0gKElET01Ob2RlKSBwcmV2OwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IEhUTUxGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRm9ybWF0dGVyKHRleHQsIGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQkJCWlmIChmb3JtYXR0ZXIgaW5zdGFuY2VvZiBIVE1MVGV4dEZvcm1hdHRlcikgewotCQkJCQlIVE1MVGV4dEZvcm1hdHRlciB0ZXh0Rm9ybWF0dGVyID0gKEhUTUxUZXh0Rm9ybWF0dGVyKSBmb3JtYXR0ZXI7Ci0JCQkJCXRleHRGb3JtYXR0ZXIuZm9ybWF0VGV4dCh0ZXh0LCBjb250cmFpbnRzLCBIVE1MVGV4dEZvcm1hdHRlci5GT1JNQVRfVEFJTCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UgewotCQkJc3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCX0KLQkJaWYgKHNwYWNlcyA9PSBudWxsIHx8IHNwYWNlcy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCXJlcGxhY2VTb3VyY2Uobm9kZS5nZXRNb2RlbCgpLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCksIDAsIHNwYWNlcyk7Ci0JCXNldFdpZHRoKGNvbnRyYWludHMsIHNwYWNlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXaWR0aEF2YWlsYWJsZShIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzLCBpbnQgd2lkdGgpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIXNwbGl0TGluZXMoKSB8fCBnZXRMaW5lV2lkdGgoKSA8IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIChjb250cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpID49IHdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBrZWVwQmxhbmtMaW5lcyhIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChjb250cmFpbnRzID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuICghY29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVNvdXJjZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZsYXROb2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJc291cmNlID0gbmV3IFN0cmluZygpOwotCQlpbnQgc3RhcnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkoc3RhcnRPZmZzZXQgKyBvZmZzZXQsIGxlbmd0aCkpCi0JCQlyZXR1cm47Ci0JCS8vIFdlIHVzZSAnc3RydWN0dXJlZERvY3VtZW50JyBhcyB0aGUgcmVxdWVzdGVyIG9iamVjdCBqdXN0IHNvIHRoaXMKLQkJLy8gYW5kIHRoZSBvdGhlcgotCQkvLyBmb3JtYXQtcmVsYXRlZCAncmVwYWxjZVRleHQnIChpbiByZXBsYWNlU291cmNlKSBjYW4gdXNlIHRoZSBzYW1lCi0JCS8vIHJlcXVlc3Rlci4KLQkJLy8gT3RoZXJ3aXNlLCBpZiByZXF1ZXN0ZXIgaXMgbm90IGlkZW50aWNhbCwKLQkJLy8gdGhlIHVuZG8gZ3JvdXAgZ2V0cyAiYnJva2VuIiBpbnRvIG11bHRpcGxlIHBpZWNlcyBiYXNlZAotCQkvLyBvbiB0aGUgcmVxdWVzdGVycyBiZWluZyBkaWZmZXJlbnQuIFRlY2huaWNhbGx5LCBhbnkgdW5pcXVlLCBjb21tb24KLQkJLy8gcmVxdWVzdGVyIG9iamVjdCB3b3VsZCB3b3JrLgotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBzdGFydE9mZnNldCArIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VTb3VyY2UoSURPTU1vZGVsIG1vZGVsLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKSkKLQkJCXJldHVybjsKLQkJLy8gV2UgdXNlICdzdHJ1Y3R1cmVkRG9jdW1lbnQnIGFzIHRoZSByZXF1ZXN0ZXIgb2JqZWN0IGp1c3Qgc28gdGhpcwotCQkvLyBhbmQgdGhlIG90aGVyCi0JCS8vIGZvcm1hdC1yZWxhdGVkICdyZXBhbGNlVGV4dCcgKGluIHJlcGxhY2VTb3VyY2UpIGNhbiB1c2UgdGhlIHNhbWUKLQkJLy8gcmVxdWVzdGVyLgotCQkvLyBPdGhlcndpc2UsIGlmIHJlcXVlc3RlciBpcyBub3QgaWRlbnRpY2FsLAotCQkvLyB0aGUgdW5kbyBncm91cCBnZXRzICJicm9rZW4iIGludG8gbXVsdGlwbGUgcGllY2VzIGJhc2VkCi0JCS8vIG9uIHRoZSByZXF1ZXN0ZXJzIGJlaW5nIGRpZmZlcmVudC4gVGVjaG5pY2FsbHksIGFueSB1bmlxdWUsIGNvbW1vbgotCQkvLyByZXF1ZXN0ZXIgb2JqZWN0IHdvdWxkIHdvcmsuCi0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFdpZHRoKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFzcGxpdExpbmVzKCkpCi0JCQlyZXR1cm47Ci0JCWludCBsaW5lV2lkdGggPSBnZXRMaW5lV2lkdGgoKTsKLQkJaWYgKGxpbmVXaWR0aCA8IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9IHNvdXJjZS5sYXN0SW5kZXhPZignXG4nKTsKLQkJaW50IG9mZnNldDIgPSBzb3VyY2UubGFzdEluZGV4T2YoJ1xyJyk7Ci0JCWlmIChvZmZzZXQyID4gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gb2Zmc2V0MjsKLQkJaWYgKG9mZnNldCA+PSAwKQotCQkJb2Zmc2V0Kys7Ci0KLQkJaW50IGF2YWlsYWJsZVdpZHRoID0gMDsKLQkJaWYgKG9mZnNldCA+PSAwKSB7Ci0JCQlhdmFpbGFibGVXaWR0aCA9IGxpbmVXaWR0aCAtIChsZW5ndGggLSBvZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJYXZhaWxhYmxlV2lkdGggPSBjb250cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpIC0gbGVuZ3RoOwotCQl9Ci0JCWlmIChhdmFpbGFibGVXaWR0aCA8IDApCi0JCQlhdmFpbGFibGVXaWR0aCA9IDA7Ci0JCWNvbnRyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWR0aChIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzLCBOb2RlIG5vZGUpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoKElET01Ob2RlKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmICghc3BsaXRMaW5lcygpKQotCQkJcmV0dXJuOwotCQlpbnQgbGluZVdpZHRoID0gZ2V0TGluZVdpZHRoKCk7Ci0JCWlmIChsaW5lV2lkdGggPCAwKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSAoKElET01Ob2RlKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGluZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQob2Zmc2V0KTsKLQkJaW50IGxpbmVPZmZzZXQgPSAwOwotCQl0cnkgewotCQkJbGluZU9mZnNldCA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQl9Ci0JCWlmIChsaW5lT2Zmc2V0ID4gb2Zmc2V0KQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBhdmFpbGFibGVXaWR0aCA9IGxpbmVXaWR0aCAtIChvZmZzZXQgLSBsaW5lT2Zmc2V0KTsKLQkJaWYgKGF2YWlsYWJsZVdpZHRoIDwgMCkKLQkJCWF2YWlsYWJsZVdpZHRoID0gMDsKLQotCQljb250cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BsaXRMaW5lcygpIHsKLQkJcmV0dXJuIHRydWU7Ly8gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRTcGxpdExpbmVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSFRNTEZvcm1hdENvbnRyYWludHMgZkZvcm1hdENvbnRyYWludHMgPSBudWxsOwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCi0JLy8gcHVibGljIHZvaWQgZm9ybWF0KFhNTE5vZGUgbm9kZSwgRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JLy8gaWYgKGZvcm1hdENvbnRyYWludHMuZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSkKLQkvLyBmb3JtYXRDb250cmFpbnRzLnNldEN1cnJlbnRJbmRlbnQoZ2V0U2libGluZ0luZGVudChub2RlKSk7Ci0JLy8KLQkvLyBmb3JtYXROb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZm9ybWF0UHJlZmVyZW5jZXMpIHsKLQkJZkZvcm1hdFByZWZlcmVuY2VzID0gZm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRBbGlnbkVuZEJyYWNrZXQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCQl9Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEluZGVudChpbmRlbnQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdFByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZ2V0Rm9ybWF0Q29udHJhaW50cygpIHsKLQkJaWYgKGZGb3JtYXRDb250cmFpbnRzID09IG51bGwpIHsKLQkJCWZGb3JtYXRDb250cmFpbnRzID0gbmV3IEhUTUxGb3JtYXRDb250cmFpbnRzSW1wbCgpOwotCi0JCQlmRm9ybWF0Q29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKSk7Ci0JCQlmRm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0NzAxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXR0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZSBDU1MgZm9ybWF0dGluZwotCi1jbGFzcyBIVE1MRm9ybWF0dGVyRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgSFRNTEZvcm1hdHRlckZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MIGZGb3JtYXRQcmVmZXJlbmNlcyA9IG51bGw7Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIEhUTUxGb3JtYXR0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBIVE1MRm9ybWF0dGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGNyZWF0ZUZvcm1hdHRlcihOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZm9ybWF0UHJlZmVyZW5jZXMpIHsKLQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbnVsbDsKLQotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJZm9ybWF0dGVyID0gbmV3IEhUTUxFbGVtZW50Rm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlpZiAoaXNFbWJlZGRlZENTUyhub2RlKSkgewotCQkJCQlmb3JtYXR0ZXIgPSBuZXcgRW1iZWRkZWRDU1NGb3JtYXR0ZXIoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvcm1hdHRlciA9IG5ldyBIVE1MVGV4dEZvcm1hdHRlcigpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWZvcm1hdHRlciA9IG5ldyBIVE1MRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBpbml0IEZvcm1hdFByZWZlcmVuY2VzCi0JCWZvcm1hdHRlci5zZXRGb3JtYXRQcmVmZXJlbmNlcyhmb3JtYXRQcmVmZXJlbmNlcyk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbWJlZGRlZENTUyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuYW1lID0gcGFyZW50LmdldE5vZGVOYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlNUWUxFIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHJpdmF0ZSBIVE1MRm9ybWF0dGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkZvcm1hdFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRBbGlnbkVuZEJyYWNrZXQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCQl9Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEluZGVudChpbmRlbnQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdFByZWZlcmVuY2VzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxUZXh0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxUZXh0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYWVmZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MVGV4dEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVGV4dEZvcm1hdHRlciBleHRlbmRzIEhUTUxGb3JtYXR0ZXIgewotCi0JcHVibGljIHN0YXRpYyBpbnQgRk9STUFUX0FMTCA9IDA7Ci0JcHVibGljIHN0YXRpYyBpbnQgRk9STUFUX0hFQUQgPSAxOwotCXB1YmxpYyBzdGF0aWMgaW50IEZPUk1BVF9UQUlMID0gMjsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBIVE1MVGV4dEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuRm9ybWF0VGV4dChJRE9NVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRleHQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQkJaWYgKGlzVW5wYXJzZWRSZWdpb24odHlwZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBwYXJlbnQ7Ci0JCQlpZiAoIWVsZW1lbnQuaXNHbG9iYWxUYWcoKSAmJiAhdGV4dC5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBjYW5Gb3JtYXRDaGlsZChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1VucGFyc2VkUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gaXNOZXN0ZWRTY2FubmVkUmVnaW9uKHR5cGUpIHx8IGlzQmxvY2tTY2FubmVkUmVnaW9uKHR5cGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Jsb2NrU2Nhbm5lZFJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQ7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RlZFNjYW5uZWRSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJZmluYWwgU3RyaW5nIEpTUF9DT05URU5UID0gIkpTUF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdHlwZS5lcXVhbHMoSlNQX0NPTlRFTlQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5SZW1vdmVIZWFkaW5nU3BhY2VzKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIHBhcmVudCk7Ci0JCWlmIChkZWNsID09IG51bGwgfHwgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBoaW50ID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCk7Ci0JCXJldHVybiBoaW50LmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlbW92ZVRhaWxpbmdTcGFjZXMoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBwYXJlbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlyZXR1cm4gaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlmb3JtYXRUZXh0KG5vZGUsIGNvbnRyYWludHMsIEZPUk1BVF9BTEwpOyAvLyBmdWxsIGZvcm1hdAotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFRleHQoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cywgaW50IG1vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlET01UZXh0IHRleHQgPSAoSURPTVRleHQpIG5vZGU7Ci0JCVN0cmluZyBzb3VyY2UgPSB0ZXh0LmdldFNvdXJjZSgpOwotCi0JCWlmICghY2FuRm9ybWF0VGV4dCh0ZXh0KSkgewotCQkJc2V0V2lkdGgoY29udHJhaW50cywgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSB0ZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSB0ZXh0LmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCi0JCS8vIGZvcm1hdCBhZGphY2VudCB0ZXh0IGF0IG9uY2UKLQkJaWYgKG1vZGUgPT0gRk9STUFUX0hFQUQpIHsKLQkJCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXdoaWxlIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJSURPTVRleHQgbmV4dFRleHQgPSAoSURPTVRleHQpIG5leHQ7Ci0JCQkJbGVuZ3RoICs9IChuZXh0VGV4dC5nZXRFbmRPZmZzZXQoKSAtIG5leHRUZXh0LmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVN0cmluZyBuZXh0U291cmNlID0gbmV4dFRleHQuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKG5leHRTb3VyY2UgIT0gbnVsbCAmJiBuZXh0U291cmNlLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoc291cmNlID09IG51bGwpCi0JCQkJCQlzb3VyY2UgPSBuZXh0U291cmNlOwotCQkJCQllbHNlCi0JCQkJCQlzb3VyY2UgKz0gbmV4dFNvdXJjZTsKLQkJCQl9Ci0JCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtb2RlID09IEZPUk1BVF9UQUlMKSB7Ci0JCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJd2hpbGUgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlJRE9NVGV4dCBwcmV2VGV4dCA9IChJRE9NVGV4dCkgcHJldjsKLQkJCQlvZmZzZXQgPSBwcmV2VGV4dC5nZXRTdGFydE9mZnNldCgpOwotCQkJCWxlbmd0aCArPSAocHJldlRleHQuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQpOwotCQkJCVN0cmluZyBwcmV2U291cmNlID0gcHJldlRleHQuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKHByZXZTb3VyY2UgIT0gbnVsbCAmJiBwcmV2U291cmNlLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoc291cmNlID09IG51bGwpCi0JCQkJCQlzb3VyY2UgPSBwcmV2U291cmNlOwotCQkJCQllbHNlCi0JCQkJCQlzb3VyY2UgPSBwcmV2U291cmNlICsgc291cmNlOwotCQkJCX0KLQkJCQlwcmV2ID0gcHJldi5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCX0KLQkJfQotCi0JCVNwYWNlQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBTcGFjZUNvbnZlcnRlcihzb3VyY2UsIGtlZXBCbGFua0xpbmVzKGNvbnRyYWludHMpKTsKLQotCQlpbnQgd29yZExlbmd0aCA9IGNvbnZlcnRlci5uZXh0V29yZCgpOwotCQlpZiAod29yZExlbmd0aCA9PSAwKSB7IC8vIG9ubHkgc3BhY2VzCi0JCQlpZiAoIWNvbnZlcnRlci5oYXNTcGFjZXMoKSkKLQkJCQlyZXR1cm47IC8vIGVtcHR5Ci0JCQlib29sZWFuIHJlbW92ZVNwYWNlcyA9IGZhbHNlOwotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJLy8gY2hlY2sgaWYgdGFncyBhcmUgb21pdHRlZAotCQkJCUlET01Ob2RlIGVsZW1lbnQgPSAoSURPTU5vZGUpIHBhcmVudDsKLQkJCQlpZiAobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsICYmIGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCXJlbW92ZVNwYWNlcyA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsICYmIGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQlyZW1vdmVTcGFjZXMgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZW1vdmVTcGFjZXMpIHsKLQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhudWxsKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIDIpIHx8IGNhbkluc2VydEJyZWFrQWZ0ZXIobm9kZSkgfHwgY2FuSW5zZXJ0QnJlYWtCZWZvcmUobm9kZSkpIHsKLQkJCQlTdHJpbmcgc3BhY2VzID0gbnVsbDsKLQkJCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpIHsgLy8gbGFzdCBzcGFjZXMKLQkJCQkJLy8gdXNlIHBhcmVudCBpbmRlbnQgZm9yIHRoZSBlbmQgdGFnCi0JCQkJCXNwYWNlcyA9IGdldEJyZWFrU3BhY2VzKHBhcmVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJCQl9Ci0JCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMoc3BhY2VzKTsKLQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBzcGFjZXMpOwotCQkJfQotCQkJZWxzZSBpZiAoY2FuUmVtb3ZlSGVhZGluZ1NwYWNlcyhub2RlKSB8fCBjYW5SZW1vdmVUYWlsaW5nU3BhY2VzKG5vZGUpKSB7Ci0JCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMobnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljb252ZXJ0ZXIuY29tcHJlc3NTcGFjZXMoKTsKLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBicmVha1NwYWNlcyA9IG51bGw7Ci0KLQkJCS8vIGZvcm1hdCBoZWFkaW5nIHNwYWNlcwotCQkJYm9vbGVhbiBoYXNTcGFjZXMgPSBjb252ZXJ0ZXIuaGFzU3BhY2VzKCk7Ci0JCQlpZiAobW9kZSA9PSBGT1JNQVRfVEFJTCkgewotCQkJCS8vIGtlZXAgc3BhY2VzIGFzIGlzCi0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgY29udmVydGVyLmdldFNwYWNlQ291bnQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgoaGFzU3BhY2VzICYmICFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIHdvcmRMZW5ndGggKyAxKSkgfHwgY2FuSW5zZXJ0QnJlYWtCZWZvcmUobm9kZSkpIHsKLQkJCQlicmVha1NwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKGJyZWFrU3BhY2VzKTsKLQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBicmVha1NwYWNlcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoaGFzU3BhY2VzKSB7Ci0JCQkJCWlmIChjYW5SZW1vdmVIZWFkaW5nU3BhY2VzKG5vZGUpKSB7Ci0JCQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhudWxsKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWNvbnZlcnRlci5jb21wcmVzc1NwYWNlcygpOwotCQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlhZGRXaWR0aChjb250cmFpbnRzLCB3b3JkTGVuZ3RoKTsKLQotCQkJLy8gZm9ybWF0IG1pZGRsZQotCQkJd29yZExlbmd0aCA9IGNvbnZlcnRlci5uZXh0V29yZCgpOwotCQkJd2hpbGUgKHdvcmRMZW5ndGggPiAwKSB7Ci0JCQkJaWYgKG1vZGUgIT0gRk9STUFUX0FMTCkgewotCQkJCQkvLyBrZWVwIHNwYWNlcyBhcyBpcwotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb252ZXJ0ZXIuZ2V0U3BhY2VDb3VudCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgd29yZExlbmd0aCArIDEpKSB7Ci0JCQkJCWlmIChicmVha1NwYWNlcyA9PSBudWxsKQotCQkJCQkJYnJlYWtTcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMoYnJlYWtTcGFjZXMpOwotCQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBicmVha1NwYWNlcyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljb252ZXJ0ZXIuY29tcHJlc3NTcGFjZXMoKTsKLQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQkJfQotCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIHdvcmRMZW5ndGgpOwotCQkJCXdvcmRMZW5ndGggPSBjb252ZXJ0ZXIubmV4dFdvcmQoKTsKLQkJCX0KLQotCQkJLy8gZm9ybWF0IHRhaWxpbmcgc3BhY2VzCi0JCQloYXNTcGFjZXMgPSBjb252ZXJ0ZXIuaGFzU3BhY2VzKCk7Ci0JCQlpZiAobW9kZSA9PSBGT1JNQVRfSEVBRCkgewotCQkJCS8vIGtlZXAgc3BhY2VzIGFzIGlzCi0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgY29udmVydGVyLmdldFNwYWNlQ291bnQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgoaGFzU3BhY2VzICYmICFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIDIpKSB8fCBjYW5JbnNlcnRCcmVha0FmdGVyKG5vZGUpKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7IC8vIGxhc3QgdGVzdAotCQkJCQkvLyB1c2UgcGFyZW50IGluZGVudCBmb3IgdGhlIGVuZCB0YWcKLQkJCQkJYnJlYWtTcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhwYXJlbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGJyZWFrU3BhY2VzID09IG51bGwpCi0JCQkJCQlicmVha1NwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQkJCX0KLQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhicmVha1NwYWNlcyk7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGhhc1NwYWNlcykgewotCQkJCQlpZiAoY2FuUmVtb3ZlVGFpbGluZ1NwYWNlcyhub2RlKSkgewotCQkJCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMobnVsbCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljb252ZXJ0ZXIuY29tcHJlc3NTcGFjZXMoKTsKLQkJCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnZlcnRlci5pc01vZGlmaWVkKCkpIHsKLQkJCXNvdXJjZSA9IGNvbnZlcnRlci5nZXRTb3VyY2UoKTsKLQkJCXJlcGxhY2VTb3VyY2UodGV4dC5nZXRNb2RlbCgpLCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3BhY2VDb252ZXJ0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3BhY2VDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmOTIwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1NwYWNlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotCi0KLWZpbmFsIGNsYXNzIFNwYWNlQ29udmVydGVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHNvdXJjZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBzdGFydE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZW5kT2Zmc2V0ID0gMDsKLQlwcml2YXRlIGludCBzcGFjZUNvdW50ID0gMDsKLQlwcml2YXRlIGludCB3b3JkQ291bnQgPSAwOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgbGFzdE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBib29sZWFuIGtlZXBCbGFua0xpbmVzID0gZmFsc2U7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3BhY2VDb252ZXJ0ZXIoU3RyaW5nIHNvdXJjZSkgewotCQlzdXBlcigpOwotCi0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhpcy5zb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMubGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFNwYWNlQ29udmVydGVyKFN0cmluZyBzb3VyY2UsIGJvb2xlYW4ga2VlcEJsYW5rTGluZXMpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXRoaXMuc291cmNlID0gbmV3IFN0cmluZygpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLmxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJfQotCQl0aGlzLmtlZXBCbGFua0xpbmVzID0ga2VlcEJsYW5rTGluZXM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY29tcHJlc3NTcGFjZXMoKSB7Ci0JCWlmICh0aGlzLnNwYWNlQ291bnQgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuc3BhY2VDb3VudCA9PSAxICYmIHRoaXMuc291cmNlLmNoYXJBdCh0aGlzLnN0YXJ0T2Zmc2V0KSA9PSAnICcpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuYnVmZmVyID09IG51bGwpCi0JCQl0aGlzLmJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHRoaXMuc3RhcnRPZmZzZXQgPiB0aGlzLmxhc3RPZmZzZXQpIHsKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZCh0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5sYXN0T2Zmc2V0LCB0aGlzLnN0YXJ0T2Zmc2V0KSk7Ci0JCX0KLQotCQl0aGlzLmJ1ZmZlci5hcHBlbmQoJyAnKTsKLQotCQl0aGlzLmxhc3RPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgdGhpcy5zcGFjZUNvdW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlpZiAodGhpcy5idWZmZXIgPT0gbnVsbCkKLQkJCXRoaXMuYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAodGhpcy5sZW5ndGggPiB0aGlzLmxhc3RPZmZzZXQpIHsKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZCh0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5sYXN0T2Zmc2V0LCB0aGlzLmxlbmd0aCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLmJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3BhY2VDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BhY2VDb3VudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTcGFjZXMoKSB7Ci0JCXJldHVybiAodGhpcy5zcGFjZUNvdW50ID4gMCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZCgpIHsKLQkJcmV0dXJuICh0aGlzLmJ1ZmZlciAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbnVtYmVyIG9mIHRoZSBvbGQgYmxhbmsgbGluZXMgdG8gbmV3IHNwYWNlIHN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXJnZUJsYW5rTGluZXMoU3RyaW5nIG5ld1NwYWNlcywgU3RyaW5nIG9sZFNwYWNlcykgewotCQlpZiAobmV3U3BhY2VzID09IG51bGwgfHwgbmV3U3BhY2VzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbmV3U3BhY2VzOwotCQlpZiAob2xkU3BhY2VzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3U3BhY2VzOwotCi0JCS8vIGNvdW50IG9sZCBuZXcgbGluZXMKLQkJaW50IG5ld0xpbmVDb3VudCA9IDA7Ci0JCWludCBvbGRMZW5ndGggPSBvbGRTcGFjZXMubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkTGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYyA9IG9sZFNwYWNlcy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA9PSAnXHInKSB7Ci0JCQkJbmV3TGluZUNvdW50Kys7Ci0JCQkJaWYgKGkgKyAxIDwgb2xkTGVuZ3RoKSB7Ci0JCQkJCWMgPSBvbGRTcGFjZXMuY2hhckF0KGkgKyAxKTsKLQkJCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoYyA9PSAnXG4nKQotCQkJCQluZXdMaW5lQ291bnQrKzsKLQkJCX0KLQkJfQotCQlpZiAobmV3TGluZUNvdW50IDwgMikKLQkJCXJldHVybiBuZXdTcGFjZXM7IC8vIG5vIGJsYW5rIGxpbmUKLQotCQkvLyBoZXJlIGFzc3VtaW5nIG5ld1NwYWNlcyBzdGFydHMgd2l0aCBhIG5ldyBsaW5lIGlmIGFueQotCQlTdHJpbmcgZGVsaW0gPSBudWxsOwotCQljaGFyIGQgPSBuZXdTcGFjZXMuY2hhckF0KDApOwotCQlpZiAoZCA9PSAnXHInKSB7Ci0JCQlpZiAobmV3U3BhY2VzLmxlbmd0aCgpID4gMSAmJiBuZXdTcGFjZXMuY2hhckF0KDEpID09ICdcbicpCi0JCQkJZGVsaW0gPSAiXHJcbiI7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWRlbGltID0gIlxyIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZCA9PSAnXG4nKQotCQkJCWRlbGltID0gIlxuIjsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcmV0dXJuIG5ld1NwYWNlczsgLy8gbm8gbmV3IGxpbmUKLQkJfQotCi0JCW5ld0xpbmVDb3VudC0tOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihuZXdTcGFjZXMubGVuZ3RoKCkgKyBuZXdMaW5lQ291bnQgKiAyKTsKLQkJd2hpbGUgKG5ld0xpbmVDb3VudCA+IDApIHsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQkJbmV3TGluZUNvdW50LS07Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChuZXdTcGFjZXMpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBuZXh0V29yZCgpIHsKLQkJaWYgKHRoaXMuZW5kT2Zmc2V0ID09IHRoaXMubGVuZ3RoKSB7Ci0JCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCQl0aGlzLnNwYWNlQ291bnQgPSAwOwotCQkJdGhpcy53b3JkQ291bnQgPSAwOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCWludCBpID0gdGhpcy5zdGFydE9mZnNldDsKLQkJZm9yICg7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UodGhpcy5zb3VyY2UuY2hhckF0KGkpKSkKLQkJCQlicmVhazsKLQkJfQotCQl0aGlzLnNwYWNlQ291bnQgPSBpIC0gdGhpcy5zdGFydE9mZnNldDsKLQotCQlpbnQgd29yZE9mZnNldCA9IGk7Ci0JCWZvciAoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UodGhpcy5zb3VyY2UuY2hhckF0KGkpKSkKLQkJCQlicmVhazsKLQkJfQotCQl0aGlzLndvcmRDb3VudCA9IGkgLSB3b3JkT2Zmc2V0OwotCQl0aGlzLmVuZE9mZnNldCA9IGk7Ci0KLQkJcmV0dXJuIHRoaXMud29yZENvdW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VTcGFjZXMoU3RyaW5nIHNwYWNlcykgewotCQlpbnQgc3BhY2VMZW5ndGggPSAoc3BhY2VzICE9IG51bGwgPyBzcGFjZXMubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nIG9sZFNwYWNlcyA9IG51bGw7Ci0JCWlmIChzcGFjZUxlbmd0aCA9PSB0aGlzLnNwYWNlQ291bnQpIHsKLQkJCWlmIChzcGFjZUxlbmd0aCA9PSAwKQotCQkJCXJldHVybjsKLQkJCWlmICh0aGlzLnN0YXJ0T2Zmc2V0ID09IDApIHsKLQkJCQlpZiAodGhpcy5zb3VyY2Uuc3RhcnRzV2l0aChzcGFjZXMpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmVuZE9mZnNldCA9PSB0aGlzLmxlbmd0aCkgewotCQkJCWlmICh0aGlzLnNvdXJjZS5lbmRzV2l0aChzcGFjZXMpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgdGV4dE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQgKyB0aGlzLnNwYWNlQ291bnQ7Ci0JCQkJb2xkU3BhY2VzID0gdGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMuc3RhcnRPZmZzZXQsIHRleHRPZmZzZXQpOwotCQkJCWlmIChvbGRTcGFjZXMuZXF1YWxzKHNwYWNlcykpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAodGhpcy5rZWVwQmxhbmtMaW5lcyAmJiB0aGlzLnNwYWNlQ291bnQgPiAwKSB7Ci0JCQlpZiAob2xkU3BhY2VzID09IG51bGwpIHsKLQkJCQlpbnQgdGV4dE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQgKyB0aGlzLnNwYWNlQ291bnQ7Ci0JCQkJb2xkU3BhY2VzID0gdGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMuc3RhcnRPZmZzZXQsIHRleHRPZmZzZXQpOwotCQkJfQotCQkJaWYgKG9sZFNwYWNlcyAhPSBudWxsKSB7Ci0JCQkJc3BhY2VzID0gbWVyZ2VCbGFua0xpbmVzKHNwYWNlcywgb2xkU3BhY2VzKTsKLQkJCQlpZiAob2xkU3BhY2VzLmVxdWFscyhzcGFjZXMpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGhpcy5idWZmZXIgPT0gbnVsbCkKLQkJCXRoaXMuYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAodGhpcy5zdGFydE9mZnNldCA+IHRoaXMubGFzdE9mZnNldCkgewotCQkJdGhpcy5idWZmZXIuYXBwZW5kKHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLmxhc3RPZmZzZXQsIHRoaXMuc3RhcnRPZmZzZXQpKTsKLQkJfQotCi0JCWlmIChzcGFjZUxlbmd0aCA+IDApCi0JCQl0aGlzLmJ1ZmZlci5hcHBlbmQoc3BhY2VzKTsKLQotCQl0aGlzLmxhc3RPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgdGhpcy5zcGFjZUNvdW50OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9BYnN0cmFjdENTU01vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxODY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9BYnN0cmFjdENTU01vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JQ1NTTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENTU01vZGVsQWRhcHRlciBpbXBsZW1lbnRzIElDU1NNb2RlbEFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDU1NfSUQgPSBDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTOwotCi0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgSUNTU01vZGVsIG1vZGVsID0gbnVsbDsKLQotCS8qKgotCSAqLwotCUFic3RyYWN0Q1NTTW9kZWxBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJQ1NTTW9kZWwgY3JlYXRlTW9kZWwoKSB7Ci0JCS8vIGNyZWF0ZSBlbWJlZGRlZCBDU1MgbW9kZWwgKG5vdCBmb3IgZXh0ZXJuYWwgQ1NTKQotCQlpZiAoZ2V0RWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwgPSAoKElET01Ob2RlKSBnZXRFbGVtZW50KCkpLmdldE1vZGVsKCk7Ci0JCUlDU1NNb2RlbCBuZXdNb2RlbCA9IChJQ1NTTW9kZWwpIGJhc2VNb2RlbC5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoQ1NTX0lEKTsKLQkJKChDU1NNb2RlbEltcGwpIG5ld01vZGVsKS5zZXRPd25lckRPTU5vZGUoZ2V0RWxlbWVudCgpKTsKLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBnZXRFeGlzdGluZ01vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5tb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlTdHlsZUNoYW5nZWQoRWxlbWVudCB0YXJnZXQpIHsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSB0YXJnZXQ7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gbm90aWZpZXIuZ2V0QWRhcHRlcnMoKTsKLQkJaWYgKGFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcikgaXQubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBTdHlsZUxpc3RlbmVyKSB7Ci0JCQkJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciA9IChTdHlsZUxpc3RlbmVyKSBhZGFwdGVyOwotCQkJCWxpc3RlbmVyLnN0eWxlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGNoZWNrIAotCSAqIDEuIElmIGF0dHJpYnV0ZXMgb2YgZWxlbWVudCBpcyB2YWxpZCAodHlwZSxyZWwgLi4uKQotCSAqIDIuIElmIGNvbnRlbnQgbW9kZWwgc3VwcG9ydHMgdGhpcyBlbGVtZW50IC8gYXR0cmlidXRlIChmdXR1cmUgPykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gKGdldEVsZW1lbnQoKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0Fic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0Fic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1MTQ4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9BYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogCQlNYXNha2kgU2FpdG9oIChNU0FJVE9IQGpwLmlibS5jb20pCi0gKgkJU2VlIEJ1ZyAxNTMwMDAgIFN0eWxlIEFkYXB0ZXJzIHNob3VsZCBiZSBsYXppZXIKLSAqCQlodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUzMDAwCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklNb2RlbFByb3ZpZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRlZENvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbE5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5Eb2N1bWVudFN0eWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLkRvY3VtZW50VHJhdmVyc2FsOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci0KLS8qKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlciBleHRlbmRzIEFic3RyYWN0Q1NTTW9kZWxBZGFwdGVyIGltcGxlbWVudHMgSUNTU1N0eWxlTGlzdGVuZXIsIElTdHlsZVNoZWV0QWRhcHRlciB7Ci0KLQkvLyB0aGlzIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGNsYXNzIGlzIGp1c3QgYSBWQUphdmEgdHJpY2suCi0JLy8gaXQgaW1wcm92ZXMgcGVyZm9ybWFuY2UgaW4gVkFKYXZhIGJ5IG1pbmltaXppbmcgY2xhc3MgbG9hZGluZy4KLQlwcml2YXRlIGZpbmFsIENsYXNzIFN0eWxlU2hlZXRBZGFwdGVyQ2xhc3MgPSBJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3M7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIHN0eWxlQ2hhbmdlZE5vZGVzOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vZGVsKHRydWUpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJQ1NTTW9kZWwgY3JlYXRlTW9kZWwoYm9vbGVhbiBub3RpZnkpIHsKLQkJSUNTU01vZGVsIG5ld01vZGVsID0gc3VwZXIuY3JlYXRlTW9kZWwoKTsKLQkJaWYgKG5vdGlmeSAmJiBuZXdNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJLy8gbm90aWZ5IGFkYXB0ZXIKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5tb2RlbFByb3ZpZGVkKG5ld01vZGVsKTsKLQkJfQotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0U2hlZXQoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoU3R5bGVTaGVldCkgbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IFN0eWxlU2hlZXRBZGFwdGVyQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VkKCkgewotCQlJQ1NTTW9kZWwgY3VycmVudE1vZGVsID0gZ2V0TW9kZWwoKTsKLQotCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0KLQkJc2V0RWxlbWVudChudWxsKTsKLQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIubW9kZWxSZWxlYXNlZChjdXJyZW50TW9kZWwpOwotCi0JCWlmIChjdXJyZW50TW9kZWwgIT0gbnVsbCkKLQkJCWN1cnJlbnRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVkKCkgewotCQlJQ1NTTW9kZWwgY3VycmVudE1vZGVsID0gZ2V0TW9kZWwoKTsKLQotCQlzZXRNb2RlbChudWxsKTsKLQotCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChjdXJyZW50TW9kZWwpOwotCi0JCWlmIChjdXJyZW50TW9kZWwgIT0gbnVsbCkKLQkJCWN1cnJlbnRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3JjTW9kZWwgY29tLmlibS5zZWQuY3NzLm1vZGVsLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICogQHBhcmFtIHJlbW92ZWQgY29tLmlibS5zZWQuY3NzLm1vZGVsLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yW10KLQkgKiBAcGFyYW0gYWRkZWQgY29tLmlibS5zZWQuY3NzLm1vZGVsLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yW10KLQkgKiBAcGFyYW0gbWVkaWEgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBtaWdodCByZWxlYXNlZAotCQlEb2N1bWVudCBkb2MgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCS8vIHRvIG5vdGlmeSBHRUYgdHJlZSAKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUNvbGxlY3Rpb24gYWRhcHRlcnMgPSAoKElOb2RlTm90aWZpZXIpIGRvYykuZ2V0QWRhcHRlcnMoKTsKLQkJCWlmIChhZGFwdGVycyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUl0ZXJhdG9yIGl0ID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJCWlmIChpdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkJCSgoSUNTU1N0eWxlTGlzdGVuZXIpIGFkYXB0ZXIpLnN0eWxlQ2hhbmdlZChzcmNNb2RlbCwgcmVtb3ZlZCwgYWRkZWQsIG1lZGlhKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8KLQotCQlpZiAoc3R5bGVDaGFuZ2VkTm9kZXMgPT0gbnVsbCkgewotCQkJc3R5bGVDaGFuZ2VkTm9kZXMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWludCByZW1vdmVkU2VsTnVtID0gcmVtb3ZlZCAhPSBudWxsID8gcmVtb3ZlZC5sZW5ndGggOiAwOwotCQkJaW50IGFkZGVkU2VsTnVtID0gYWRkZWQgIT0gbnVsbCA/IGFkZGVkLmxlbmd0aCA6IDA7Ci0KLQkJCU5vZGVJdGVyYXRvciBpdGVyID0gKChEb2N1bWVudFRyYXZlcnNhbCkgZG9jKS5jcmVhdGVOb2RlSXRlcmF0b3IoZG9jLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCwgbnVsbCwgdHJ1ZSk7Ci0JCQlOb2RlIG5vZGU7Ci0JCQl3aGlsZSAoKG5vZGUgPSBpdGVyLm5leHROb2RlKCkpICE9IG51bGwpIHsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnQgZWxtID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCQkJaW50IGk7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCByZW1vdmVkU2VsTnVtICYmICFtYXRjaDsgaSsrKSB7Ci0JCQkJCQltYXRjaCA9IHJlbW92ZWRbaV0ubWF0Y2goZWxtLCBudWxsKTsKLQkJCQkJfQotCQkJCQlmb3IgKGkgPSAwOyBpIDwgYWRkZWRTZWxOdW0gJiYgIW1hdGNoOyBpKyspIHsKLQkJCQkJCW1hdGNoID0gYWRkZWRbaV0ubWF0Y2goZWxtLCBudWxsKTsKLQkJCQkJfQotCQkJCQlpZiAobWF0Y2gpIHsKLQkJCQkJCWlmICghc3R5bGVDaGFuZ2VkTm9kZXMuY29udGFpbnMoZWxtKSkKLQkJCQkJCQlzdHlsZUNoYW5nZWROb2Rlcy5hZGQoZWxtKTsKLQkJCQkJCS8vIG5vdGlmeVN0eWxlQ2hhbmdlZChlbG0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIERvY3VtZW50IGRvZXNuJ3QgaW1wbGVtZW50IERvY3VtZW50VHJhdmVyc2FsLi4uCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzcmNNb2RlbCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTW9kZWwgbW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gbW9kZWwuZ2V0TW9kZWxOb3RpZmllcigpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBiZWZvcmUgdXBkYXRpbmcsIGFsbCBzdWItbW9kZWxzIHNob3VsZCBiZSBsb2FkZWQhCi0JCURvY3VtZW50U3R5bGUgZG9jdW1lbnQgPSAoRG9jdW1lbnRTdHlsZSkgbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJU3R5bGVTaGVldExpc3Qgc3R5bGVzID0gZG9jdW1lbnQuZ2V0U3R5bGVTaGVldHMoKTsKLQkJaWYgKHN0eWxlcyAhPSBudWxsKSB7Ci0JCQlpbnQgbiA9IHN0eWxlcy5nZXRMZW5ndGgoKTsKLQkJCUltcG9ydGVkQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0ZWRDb2xsZWN0b3IoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldCBzaGVldCA9IHN0eWxlcy5pdGVtKGkpOwotCQkJCWlmIChzaGVldCBpbnN0YW5jZW9mIElDU1NOb2RlKQotCQkJCQl0cmF2LmFwcGx5KChJQ1NTTm9kZSkgc2hlZXQpOwotCQkJfQotCQl9Ci0KLQkJLy8gZmxhc2ggc3R5bGUgY2hhbmdlZCBldmVudHMKLQkJaWYgKHN0eWxlQ2hhbmdlZE5vZGVzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gc3R5bGVDaGFuZ2VkTm9kZXMudG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGVsZW1lbnRzICE9IG51bGwgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJCW5vdGlmeVN0eWxlQ2hhbmdlZCgoRWxlbWVudCkgZWxlbWVudHNbaV0pOwotCQkJc3R5bGVDaGFuZ2VkTm9kZXMuY2xlYXIoKTsKLQkJfQotCi0JCS8vIHRvIG5vdGlmeSBHRUYgdHJlZSAKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9ICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJzKCk7Ci0JCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJdGVyYXRvciBpdCA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCQlpZiAoaXQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVMaXN0ZW5lcikgewotCQkJCQkoKElDU1NTdHlsZUxpc3RlbmVyKSBhZGFwdGVyKS5zdHlsZVVwZGF0ZShzcmNNb2RlbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJbm90aWZpZXIucHJvcGVydHlDaGFuZ2VkKG5vZGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTk4ZjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbi5DU1NQcm9wZXJ0eUNvbnRleHQ7Ci0KLS8qKgotICovCi1jbGFzcyBDU1NRdWVyeUNvbnRleHQgZXh0ZW5kcyBDU1NQcm9wZXJ0eUNvbnRleHQgewotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5Q29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlDb250ZXh0KElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJc3VwZXIoZGVjbCk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseUZ1bGwoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlFbnVtZXJhdGlvbiBrZXlzID0gZlByb3BlcnRpZXMua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCU9iamVjdCB2YWwgPSBmUHJvcGVydGllcy5nZXQoa2V5KTsKLQotCQkJaWYgKHZhbCBpbnN0YW5jZW9mIENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhKSB7Ci0JCQkJSUNTU1N0eWxlRGVjbEl0ZW0gZGVjbEl0ZW0gPSAoKENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhKSB2YWwpLmdldERlY2xJdGVtKCk7Ci0JCQkJaWYgKGRlY2xJdGVtLmdldExlbmd0aCgpIDw9IDApIHsKLQkJCQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbVRvUmVtb3ZlID0gZGVjbC5nZXREZWNsSXRlbU5vZGUoa2V5LnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoaXRlbVRvUmVtb3ZlICE9IG51bGwpIHsKLQkJCQkJCWRlY2wucmVtb3ZlRGVjbEl0ZW1Ob2RlKGl0ZW1Ub1JlbW92ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlY2wuc2V0RGVjbEl0ZW1Ob2RlKGRlY2xJdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSAodmFsIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSA/ICgoSUNTU1ZhbHVlKSB2YWwpLmdldENTU1ZhbHVlVGV4dCgpIDogdmFsLnRvU3RyaW5nKCk7Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW1Ub1JlbW92ZSA9IGRlY2wuZ2V0RGVjbEl0ZW1Ob2RlKGtleS50b1N0cmluZygpKTsKLQkJCQkJaWYgKGl0ZW1Ub1JlbW92ZSAhPSBudWxsKSB7Ci0JCQkJCQlkZWNsLnJlbW92ZURlY2xJdGVtTm9kZShpdGVtVG9SZW1vdmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWNsLnNldFByb3BlcnR5KGtleS50b1N0cmluZygpLCB2YWx1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrKFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiBpbXBvcnRhbnQsIGludCBzcGVjaWZpY2l0eSkgewotCQlPYmplY3QgY3VycmVudCA9IGZQcm9wZXJ0aWVzLmdldChwcm9wTmFtZSk7Ci0JCWlmIChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudCBpbnN0YW5jZW9mIENTU1F1ZXJ5VmFsdWVEYXRhKSB7Ci0JCQlDU1NRdWVyeVZhbHVlRGF0YSBjdXJyZW50VmFsdWUgPSAoQ1NTUXVlcnlWYWx1ZURhdGEpIGN1cnJlbnQ7Ci0JCQlpZiAoKCFpbXBvcnRhbnQgJiYgY3VycmVudFZhbHVlLmltcG9ydGFudCkgfHwgKGN1cnJlbnRWYWx1ZS5nZXRTcGVjaWZpY2l0eSgpID4gc3BlY2lmaWNpdHkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG92ZXJyaWRlV2l0aEV4cGFuZChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsLCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDU1NMaW5rQ29udmVydGVyIGNvbnYgPSBuZXcgQ1NTTGlua0NvbnZlcnRlcihkZWNsLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpKTsKLQotCQlpbnQgblByb3BlcnRpZXMgPSBkZWNsLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5Qcm9wZXJ0aWVzOyBpKyspIHsKLQkJCVN0cmluZyBwcm9wTmFtZSA9IGRlY2wuaXRlbShpKTsKLQkJCWlmIChwcm9wTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb3BOID0gcHJvcE5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKHByb3BOLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YocHJvcE4pOwotCQkJCQlTdHJpbmcgcHJpb3JpdHkgPSBkZWNsLmdldFByb3BlcnR5UHJpb3JpdHkocHJvcE5hbWUpOwotCQkJCQlib29sZWFuIGltcG9ydGFudCA9IHByaW9yaXR5ICE9IG51bGwgJiYgcHJpb3JpdHkubGVuZ3RoKCkgPiAwOwotCQkJCQlpZiAocHJvcCAhPSBudWxsICYmIHByb3AuaXNTaG9ydGhhbmQoKSkgewotCQkJCQkJLy8gZXhwYW5kIHNob3J0aGFuZCBwcm9wZXJ0eQotCQkJCQkJQ1NTUXVlcnlDb250ZXh0IGNvbnRleHQgPSBuZXcgQ1NTUXVlcnlDb250ZXh0KCk7Ci0JCQkJCQlleHBhbmRUb0xlYWYocHJvcCwgZGVjbC5nZXRQcm9wZXJ0eVZhbHVlKHByb3BOYW1lKSwgY29udGV4dCk7Ci0KLQkJCQkJCUVudW1lcmF0aW9uIHByb3BlcnRpZXMgPSBjb250ZXh0LnByb3BlcnRpZXMoKTsKLQkJCQkJCXdoaWxlIChwcm9wZXJ0aWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCQkJcHJvcE4gPSBwcm9wZXJ0aWVzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQkJCQlpZiAoY2hlY2socHJvcE4sIGltcG9ydGFudCwgc3BlY2lmaWNpdHkpKSB7Ci0JCQkJCQkJCWZQcm9wZXJ0aWVzLnB1dChwcm9wTiwgbmV3IENTU1F1ZXJ5VmFsdWVEYXRhKGNvbnYudG9BYnNvbHV0ZShjb250ZXh0LmdldChwcm9wTikpLCBpbXBvcnRhbnQsIHNwZWNpZmljaXR5KSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGNoZWNrKHByb3BOLCBpbXBvcnRhbnQsIHNwZWNpZmljaXR5KSkgewotCQkJCQkJCUlDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtID0gKElDU1NTdHlsZURlY2xJdGVtKSBkZWNsLmdldERlY2xJdGVtTm9kZShwcm9wTmFtZSkuY2xvbmVOb2RlKHRydWUpOwotCQkJCQkJCWludCBuVmFsdWVzID0gZGVjbEl0ZW0uZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuVmFsdWVzOyBqKyspIHsKLQkJCQkJCQkJY29udi50b0Fic29sdXRlKGRlY2xJdGVtLml0ZW0oaikpOwotCQkJCQkJCX0KLQkJCQkJCQlkZWNsSXRlbS5zZXRQcmlvcml0eShudWxsKTsKLQkJCQkJCQlmUHJvcGVydGllcy5wdXQocHJvcE4sIG5ldyBDU1NRdWVyeURlY2xhcmF0aW9uRGF0YShkZWNsSXRlbSwgaW1wb3J0YW50LCBzcGVjaWZpY2l0eSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjEyNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhIGV4dGVuZHMgQ1NTUXVlcnlWYWx1ZURhdGEgewotCi0KLQlJQ1NTU3R5bGVEZWNsSXRlbSBkZWNsSXRlbTsKLQotCXB1YmxpYyBDU1NRdWVyeURlY2xhcmF0aW9uRGF0YShJQ1NTU3R5bGVEZWNsSXRlbSBkZWNsSXRlbSwgYm9vbGVhbiBpbXAsIGludCBzcGVjaWZpY2l0eSkgewotCQlzdXBlcihudWxsLCBpbXAsIHNwZWNpZmljaXR5KTsKLQkJdGhpcy5kZWNsSXRlbSA9IGRlY2xJdGVtOwotCX0KLQotCS8qKgotCSAqLwotCUlDU1NTdHlsZURlY2xJdGVtIGdldERlY2xJdGVtKCkgewotCQlyZXR1cm4gZGVjbEl0ZW07Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKHZhbHVlID09IG51bGwgJiYgZGVjbEl0ZW0gIT0gbnVsbCkgewotCQkJdmFsdWUgPSBkZWNsSXRlbS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeVRyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwNjEwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeVRyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkVsZW1lbnRDU1NJbmxpbmVTdHlsZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NRdWVyeVRyYXZlcnNlciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCXByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgU3RyaW5nIHBzZXVkb05hbWU7Ci0JcHJpdmF0ZSBDU1NRdWVyeUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0JSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCXRyeSB7Ci0JCQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBpbmxpbmVTdHlsZSA9IChJQ1NTU3R5bGVEZWNsYXJhdGlvbikgKChFbGVtZW50Q1NTSW5saW5lU3R5bGUpIGVsZW1lbnQpLmdldFN0eWxlKCk7Ci0JCQlpZiAoaW5saW5lU3R5bGUgIT0gbnVsbCkgewotCQkJCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJCQkJY29udGV4dCA9IG5ldyBDU1NRdWVyeUNvbnRleHQoKTsKLQkJCQl9Ci0JCQkJY29udGV4dC5vdmVycmlkZVdpdGhFeHBhbmQoaW5saW5lU3R5bGUsIDEwMDAwKTsKLQkJCQkvLyBzdHlsZSBhdHRyaWJ1dGUncyBzcGVjaWZpY2l0eSBpcyAxMDAgKGluIENTUzIgc3BlYy4pIGFuZAotCQkJCS8vIG91ciBpbXBsZW1lbnQgdXNlIDEwMCBhcyBiYXNlIG51bWJlciAoc2VlIENTU1NlbGVjdG9yLmphdmEpCi0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZWxlbWVudCBpcyBub3QgRWxlbWVudENTU0lubGluZVN0eWxlID8/PwotCQl9Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJZGVjbCA9IENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlU3R5bGVEZWNsYXJhdGlvbigpOwotCQljb250ZXh0LmFwcGx5RnVsbChkZWNsKTsKLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG92ZXJ3cml0ZURlY2xhcmF0aW9uKElDU1NTdHlsZURlY2xhcmF0aW9uIGQsIGludCBzcGVjaWZpY2l0eSkgewotCQlpZiAoZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJY29udGV4dCA9IG5ldyBDU1NRdWVyeUNvbnRleHQoKTsKLQkJY29udGV4dC5vdmVycmlkZVdpdGhFeHBhbmQoZCwgc3BlY2lmaWNpdHkpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwb3N0Tm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCS8vIHN0eWxlIHJ1bGUKLQkJCUlDU1NTdHlsZVJ1bGUgc3R5bGUgPSAoSUNTU1N0eWxlUnVsZSkgbm9kZTsKLQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IHN0eWxlLmdldFNlbGVjdG9ycygpOwotCQkJaW50IG5TZWxlY3RvcnMgPSBsaXN0LmdldExlbmd0aCgpOwotCQkJaW50IG1heFNwZWNpZmljaXR5ID0gLTE7Ci0JCQlmb3IgKGludCBpU2VsZWN0b3IgPSAwOyBpU2VsZWN0b3IgPCBuU2VsZWN0b3JzOyBpU2VsZWN0b3IrKykgewotCQkJCS8vIENoZWNrIGVhY2ggU2VsZWN0b3IgTGlzdHMKLQkJCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSBsaXN0LmdldFNlbGVjdG9yKGlTZWxlY3Rvcik7Ci0JCQkJaW50IHNwZWNpZmljaXR5ID0gc2VsZWN0b3IuZ2V0U3BlY2lmaWNpdHkoKTsKLQkJCQlpZiAobWF4U3BlY2lmaWNpdHkgPCBzcGVjaWZpY2l0eSAmJiBzZWxlY3Rvci5tYXRjaChlbGVtZW50LCBwc2V1ZG9OYW1lKSkgewotCQkJCQltYXhTcGVjaWZpY2l0eSA9IHNwZWNpZmljaXR5OwotCQkJCX0KLQkJCX0KLQkJCWlmIChtYXhTcGVjaWZpY2l0eSA+PSAwKSB7Ci0JCQkJLy8gYXBwbHkgdGhpcyBzdHlsZSB0byB0aGUgZWxlbWVudAotCQkJCW92ZXJ3cml0ZURlY2xhcmF0aW9uKChJQ1NTU3R5bGVEZWNsYXJhdGlvbikgc3R5bGUuZ2V0U3R5bGUoKSwgbWF4U3BlY2lmaWNpdHkpOwotCQkJfQotCQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JCX0KLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRDb250ZXh0KCkgewotCQljb250ZXh0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5wc2V1ZG9OYW1lID0gcHNldWRvTmFtZTsKLQkJcmVzZXRDb250ZXh0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlWYWx1ZURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5VmFsdWVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTgxNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlWYWx1ZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbi5WYWx1ZURhdGE7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgQ1NTUXVlcnlWYWx1ZURhdGEgZXh0ZW5kcyBWYWx1ZURhdGEgewotCi0JcHJpdmF0ZSBpbnQgc3BlY2lmaWNpdHk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlWYWx1ZURhdGEoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5VmFsdWVEYXRhKFN0cmluZyB2YWwsIGJvb2xlYW4gaW1wKSB7Ci0JCXN1cGVyKHZhbCwgaW1wKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTUXVlcnlWYWx1ZURhdGEoU3RyaW5nIHZhbCwgYm9vbGVhbiBpbXAsIGludCBzcGVjaWZpY2l0eSkgewotCQlzdXBlcih2YWwsIGltcCk7Ci0JCXRoaXMuc3BlY2lmaWNpdHkgPSBzcGVjaWZpY2l0eTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0U3BlY2lmaWNpdHkoKSB7Ci0JCXJldHVybiBzcGVjaWZpY2l0eTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MRG9jdW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MRG9jdW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODgzMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTERvY3VtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldExpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NDbGFzc1RyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRSdWxlQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRBZGFwdGVyIGltcGxlbWVudHMgSVN0eWxlU2hlZXRMaXN0QWRhcHRlciwgU3R5bGVTaGVldExpc3QgewotCi0JcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBWZWN0b3Igc3R5bGVBZGFwdGVycyA9IG51bGw7Ci0JcHJpdmF0ZSBWZWN0b3Igb2xkU3R5bGVBZGFwdGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlIVE1MRG9jdW1lbnRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdHlsZVNoZWV0KEVsZW1lbnQgbm9kZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlib29sZWFuIGlzQ29udGFpbmVyID0gZmFsc2U7Ci0JCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT1NDUklQVCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCkgfHwgKCFlbGVtZW50LmlzR2xvYmFsVGFnKCkgJiYgZWxlbWVudC5pc0NvbnRhaW5lcigpKSkgewotCQkJaXNDb250YWluZXIgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCU5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ID09IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKSB7Ci0JCQkJLy8gVGhpcyBjb25kaXRpb24gaXMgdG9vIHNldmVyZSwgYWN0dWFsbHkgZG8gbm90IHdvcmsgZm9yIEpTRiB0ZW1wbGF0ZS4KLQkJCQkvLyBCdXQgYWJvdmUgKCEgZ2xvYmFsVGFnKCkgJiYgaXNDb250YWluZXIoKSkgY292ZXIgSlNGIHRlbXBsYXRlICsgdHBsIHRlbXBsYXRlCi0JCQkJaXNDb250YWluZXIgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQl0YWdOYW1lID0gKChFbGVtZW50KSBwYXJlbnQpLmdldFRhZ05hbWUoKTsKLQkJCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCkpIHsKLQkJCQkJaXNDb250YWluZXIgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWVsc2UgewotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lICE9IG51bGwgJiYgbG9jYWxOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwpKSB7Ci0JCQkJLy8gdGFnbGliIGh0bWwgdGFnCi0JCQkJaXNDb250YWluZXIgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IGVsZW1lbnQ7Ci0JCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSB7Ci0JCQkJCXRoaXMuc3R5bGVBZGFwdGVycy5hZGRFbGVtZW50KGFkYXB0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaXNDb250YWluZXIpIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSBlbGVtZW50OwotCQkJaWYgKG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKSA9PSBudWxsKSB7Ci0JCQkJbm90aWZpZXIuYWRkQWRhcHRlcih0aGlzKTsKLQkJCX0KLQkJCWZvciAoTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJY29udGludWU7Ci0JCQkJYWRkU3R5bGVTaGVldCgoRWxlbWVudCkgY2hpbGQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBjaGlsZFJlcGxhY2VkKCkgewotCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYmFja3VwIG9sZCBhZGFwdGVycyB0byBiZSByZWxlYXNlZCBvbiB1cGRhdGluZyBpbiBnZXRTdHlsZVNoZWV0cygpCi0JCXRoaXMub2xkU3R5bGVBZGFwdGVycyA9IHRoaXMuc3R5bGVBZGFwdGVyczsKLQkJLy8gaW52YWxpZGF0ZSB0aGUgbGlzdAotCQl0aGlzLnN0eWxlQWRhcHRlcnMgPSBudWxsOwotCi0JCW5vdGlmeVN0eWxlU2hlZXRzQ2hhbmdlZCh0aGlzLmRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0Q2xhc3NlcygpIHsKLQkJU3R5bGVTaGVldExpc3Qgc2hlZXRMaXN0ID0gZ2V0U3R5bGVTaGVldHMoKTsKLQkJaW50IG5TaGVldHMgPSBzaGVldExpc3QuZ2V0TGVuZ3RoKCk7Ci0KLQkJZmluYWwgQXJyYXlMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQ1NTQ2xhc3NUcmF2ZXJzZXIgdHJhdmVyc2VyID0gbmV3IENTU0NsYXNzVHJhdmVyc2VyKCk7Ci0JCXRyYXZlcnNlci5zZXRUcmF2ZXJzZUltcG9ydGVkKHRydWUpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgblNoZWV0czsgaSsrKSB7Ci0JCQlvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0IHNoZWV0ID0gc2hlZXRMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoc2hlZXQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCXRyYXZlcnNlci5hcHBseSgoSUNTU05vZGUpIHNoZWV0KTsKLQkJCX0KLQkJfQotCQljbGFzc2VzLmFkZEFsbCh0cmF2ZXJzZXIuZ2V0Q2xhc3NOYW1lcygpKTsKLQotCQlyZXR1cm4gbmV3IEVudW1lcmF0aW9uKCkgewotCQkJaW50IGkgPSAwOwotCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCQkJcmV0dXJuIGkgPCBjbGFzc2VzLnNpemUoKTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJCQlyZXR1cm4gY2xhc3Nlcy5nZXQoaSsrKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRBZGFwdGVycygpIHsKLQkJVmVjdG9yIHZhbGlkQWRhcHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaSA9IHRoaXMuc3R5bGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyICYmICgoQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlcikgb2JqKS5pc1ZhbGlkQXR0cmlidXRlKCkpIHsKLQkJCQkJdmFsaWRBZGFwdGVycy5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkQWRhcHRlcnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRWYWxpZEFkYXB0ZXJzKCkuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldE92ZXJyaWRlU3R5bGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQlTdHlsZVNoZWV0TGlzdCBzc2wgPSBnZXRTdHlsZVNoZWV0cygpOwotCQlpbnQgbnVtU3R5bGVzID0gc3NsLmdldExlbmd0aCgpOwotCi0JCUNTU1F1ZXJ5VHJhdmVyc2VyIHF1ZXJ5ID0gbmV3IENTU1F1ZXJ5VHJhdmVyc2VyKCk7Ci0JCXF1ZXJ5LnNldFRyYXZlcnNlSW1wb3J0ZWQodHJ1ZSk7Ci0JCXF1ZXJ5LnNldFRyYXZlcnNlSW1wb3J0Rmlyc3QodHJ1ZSk7Ci0JCXF1ZXJ5LnNldEVsZW1lbnQoZWxlbWVudCwgcHNldWRvTmFtZSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TdHlsZXM7IGkrKykgewotCQkJLy8gbG9vcCBmb3Igc3R5bGVzICg8c3R5bGU+IGFuZCA8bGluaz4pCi0JCQlvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0IHNzID0gc3NsLml0ZW0oaSk7Ci0KLQkJCXRyeSB7Ci0JCQkJcXVlcnkuYXBwbHkoKElDU1NOb2RlKSBzcyk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gSSBjYW4gaGFuZGxlIG9ubHkgQ1NTIHN0eWxlCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcXVlcnkuZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldExpc3QgZ2V0U3R5bGVTaGVldHMoKSB7Ci0JCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJdGhpcy5zdHlsZUFkYXB0ZXJzID0gbmV3IFZlY3RvcigpOwotCQkJZm9yIChOb2RlIGNoaWxkID0gdGhpcy5kb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQljb250aW51ZTsKLQkJCQlhZGRTdHlsZVNoZWV0KChFbGVtZW50KSBjaGlsZCk7Ci0JCQl9Ci0KLQkJCXJlbW92ZU9sZFN0eWxlU2hlZXRzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldCBpdGVtKGludCBpbmRleCkgewotCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlMaXN0IHZhbGlkQWRhcHRlcnMgPSBnZXRWYWxpZEFkYXB0ZXJzKCk7Ci0KLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB2YWxpZEFkYXB0ZXJzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHlsZVNoZWV0IHNoZWV0ID0gKChJU3R5bGVTaGVldEFkYXB0ZXIpIHZhbGlkQWRhcHRlcnMuZ2V0KGluZGV4KSkuZ2V0U2hlZXQoKTsKLQkJaWYgKHNoZWV0ID09IG51bGwpIHsvLyBmb3IgTElOSyBlbGVtZW50IHdob3NlIGxpbmsgaXMgYnJva2VuCi0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoKEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIpIHZhbGlkQWRhcHRlcnMuZ2V0KGluZGV4KSkuY3JlYXRlTW9kZWwoKTsKLQkJCXNoZWV0ID0gKChtb2RlbCAhPSBudWxsKSA/IChTdHlsZVNoZWV0KSBtb2RlbC5nZXREb2N1bWVudCgpIDogbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHNoZWV0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkFERCA6Ci0JCQkJbm9kZSA9IChOb2RlKSBuZXdWYWx1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU5vZGVOb3RpZmllci5SRU1PVkUgOgotCQkJCW5vZGUgPSAoTm9kZSkgb2xkVmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQlub2RlID0gKE5vZGUpIG5vdGlmaWVyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm47Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSkpIHsKLQkJCQlyZWZyZXNoQWRhcHRlcnMoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBUKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCkgfHwgZWxlbWVudC5pc0NvbW1lbnRUYWcoKSB8fCAoIWVsZW1lbnQuaXNHbG9iYWxUYWcoKSAmJiBlbGVtZW50LmlzQ29udGFpbmVyKCkpKSB7Ci0JCQkJY2hpbGRSZXBsYWNlZCgpOwotCQkJfQotCQkJZWxzZSBpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKSkgewotCQkJCXJlZnJlc2hBZGFwdGVycygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmIGxvY2FsTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MKSkgewotCQkJCQkvLyB0YWdsaWIgaHRtbCB0YWcKLQkJCQkJY2hpbGRSZXBsYWNlZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbG9hZCBMSU5LIC8gQGltcG9ydCBpZiBCQVNFIGNoYW5nZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaEFkYXB0ZXJzKCkgewotCQlJdGVyYXRvciBpQWRhcHRlciA9IHRoaXMuc3R5bGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaUFkYXB0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGlBZGFwdGVyLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgTGlua0VsZW1lbnRBZGFwdGVyKSB7Ci0JCQkJKChMaW5rRWxlbWVudEFkYXB0ZXIpIGFkYXB0ZXIpLnJlZnJlc2hTaGVldCgpOwotCQkJfQotCQkJZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFN0eWxlRWxlbWVudEFkYXB0ZXIpIHsKLQkJCQlJQ1NTTW9kZWwgbW9kZWwgPSAoKFN0eWxlRWxlbWVudEFkYXB0ZXIpIGFkYXB0ZXIpLmdldE1vZGVsKCk7Ci0JCQkJSW1wb3J0UnVsZUNvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydFJ1bGVDb2xsZWN0b3IoKTsKLQkJCQl0cmF2LmFwcGx5KG1vZGVsKTsKLQkJCQlJdGVyYXRvciBpUnVsZSA9IHRyYXYuZ2V0UnVsZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpUnVsZS5oYXNOZXh0KCkpIHsKLQkJCQkJSUNTU0ltcG9ydFJ1bGUgcnVsZSA9IChJQ1NTSW1wb3J0UnVsZSkgaVJ1bGUubmV4dCgpOwotCQkJCQlydWxlLnJlZnJlc2hTdHlsZVNoZWV0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVN0eWxlU2hlZXRzQ2hhbmdlZChEb2N1bWVudCB0YXJnZXQpIHsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSB0YXJnZXQ7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gbm90aWZpZXIuZ2V0QWRhcHRlcnMoKTsKLQkJaWYgKGFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcikgaXQubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBTdHlsZUxpc3RlbmVyKSB7Ci0JCQkJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciA9IChTdHlsZUxpc3RlbmVyKSBhZGFwdGVyOwotCQkJCWxpc3RlbmVyLnN0eWxlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbGVhc2VPbGRTdHlsZVNoZWV0cygpIHsKLQkJaWYgKHRoaXMub2xkU3R5bGVBZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IHRoaXMub2xkU3R5bGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJU3R5bGVTaGVldEFkYXB0ZXIgYWRhcHRlciA9IChJU3R5bGVTaGVldEFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkvLyBpZiB0aGUgc2FtZSBhZGFwdGVyIGlzIGluIHRoZSBjdXJyZW50IGxpc3QsCi0JCQkvLyBkbyBub3QgcmVsZWFzZQotCQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyAhPSBudWxsICYmIHRoaXMuc3R5bGVBZGFwdGVycy5jb250YWlucyhhZGFwdGVyKSkKLQkJCQljb250aW51ZTsKLQkJCWFkYXB0ZXIucmVsZWFzZWQoKTsKLQkJfQotCQl0aGlzLm9sZFN0eWxlQWRhcHRlcnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VTdHlsZVNoZWV0cygpIHsKLQkJcmVsZWFzZU9sZFN0eWxlU2hlZXRzKCk7Ci0KLQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IHRoaXMuc3R5bGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJU3R5bGVTaGVldEFkYXB0ZXIgYWRhcHRlciA9IChJU3R5bGVTaGVldEFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5yZWxlYXNlZCgpOwotCQl9Ci0JCXRoaXMuc3R5bGVBZGFwdGVycyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU9sZFN0eWxlU2hlZXRzKCkgewotCQlpZiAodGhpcy5vbGRTdHlsZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gdGhpcy5vbGRTdHlsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlTdHlsZVNoZWV0QWRhcHRlciBhZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgaXQubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCS8vIGlmIHRoZSBzYW1lIGFkYXB0ZXIgaXMgaW4gdGhlIGN1cnJlbnQgbGlzdCwKLQkJCS8vIGRvIG5vdCByZWxlYXNlCi0JCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzICE9IG51bGwgJiYgdGhpcy5zdHlsZUFkYXB0ZXJzLmNvbnRhaW5zKGFkYXB0ZXIpKQotCQkJCWNvbnRpbnVlOwotCQkJYWRhcHRlci5yZW1vdmVkKCk7Ci0JCX0KLQkJdGhpcy5vbGRTdHlsZUFkYXB0ZXJzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjU4YWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2VsZWN0b3JBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyIGltcGxlbWVudHMgSVN0eWxlU2VsZWN0b3JBZGFwdGVyIHsKLQotCXN0YXRpYyBwcml2YXRlIEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlciBpbnN0YW5jZTsKLQlwcml2YXRlIE9iamVjdCB0b01hdGNoID0gSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gdG9NYXRjaDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsZWN0b3IsIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGk7Ci0JCVN0cmluZyBrZXk7Ci0KLQkJLy8gUHNldWRvTmFtZQotCQlpID0gc2VsZWN0b3IuZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpOwotCQlpZiAoaSA+IDApIHsKLQkJCWlmIChwc2V1ZG9OYW1lID09IG51bGwgfHwgcHNldWRvTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCWlmIChwc2V1ZG9OYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc2VsZWN0b3IuZ2V0UHNldWRvTmFtZShpKSkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGkgPCAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIHRhZyBuYW1lCi0JCWlmICghc2VsZWN0b3IuaXNVbml2ZXJzYWwoKSAmJiAhZWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2Uoc2VsZWN0b3IuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZAotCQlpID0gc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlpZiAoaSA+IDEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJa2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGtleSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghc2VsZWN0b3IuZ2V0SUQoMCkuZXF1YWxzKGtleSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgY2xhc3MKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpOwotCQlpZiAoaSA+IDApIHsKLQkJCWtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihrZXkpOwotCQkJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCWlmIChzZWxlY3Rvci5nZXRDbGFzcyhpKS5lcXVhbHModG9rZW5pemVyLm5leHRUb2tlbigpKSkgewotCQkJCQkJb2sgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFvaykKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgYXR0cmlidXRlcwotCQlmb3IgKGkgPSBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWxlY3Rvci5nZXRBdHRyaWJ1dGUoaSksICI9fnwgXHRcclxuXGYiKTsvLyROT04tTkxTLTEkCi0JCQlpbnQgY291bnRUb2tlbnMgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJCWlmIChjb3VudFRva2VucyA+IDApIHsKLQkJCQlTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCQlpZiAoYXR0clZhbHVlID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoY291bnRUb2tlbnMgPiAxKSB7Ci0JCQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oIj0gXHRcclxuXGYiKTsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1Rva2VuaXplciBhdHRyVmFsdWVUb2tlbml6ZXIgPSBudWxsOwotCQkJCQlpZiAodG9rZW4uZXF1YWxzKCJ+IikpIHsvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyVmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJ8IikpIHsvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyVmFsdWVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSwgIi0iKTsvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGF0dHJWYWx1ZVRva2VuaXplciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQkJCQl3aGlsZSAoYXR0clZhbHVlVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJCQlpZiAodG9rZW4uZXF1YWxzKGF0dHJWYWx1ZVRva2VuaXplci5uZXh0VG9rZW4oKSkpIHsKLQkJCQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghb2spCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmICghYXR0clZhbHVlLmVxdWFscyh0b2tlbikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NkNjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlOwotCXByaXZhdGUgT2JqZWN0IHRvTWF0Y2ggPSBJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbFByb3ZpZGVBZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuCi0JICogSXQgbWF5IGJlIGEgc2luZ2xldG9uIG9yIG5vdCAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUgSU5vZGVBZGFwdGVyICAuLi4KLQkgKiBidXQgaW4gZ2VuZXJhbCBpdCBpcyByZWNvbW1lbmRlZCBmb3IgYW4gYWRhcHRlciB0byBiZSBzdGF0ZWxlc3MsIAotCSAqIHNvIHRoZSBlZmZpY2llbmNpZXMgb2YgYSBzaW5nbGV0b24gY2FuIGJlIGdhaW5lZC4KLQkgKgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCBhZGRBZGFwdGVyIG9uIHRoZSBhZGFwdGVkCi0JICogb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJYWRhcHRlciA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlci5nZXRJbnN0YW5jZSgpOwotCQlub3RpZmllci5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIGlzRmFjdG9yeUZvclR5cGUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSB0b01hdGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgY29weSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0xpbmtFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvTGlua0VsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzNhYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvTGlua0VsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSU1vZGVsUHJvdmlkZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgTGlua0VsZW1lbnRBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1NTX0lEID0gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQlwcml2YXRlIGJvb2xlYW4gcmVwbGFjZU1vZGVsID0gdHJ1ZTsKLQkvLyB0aGlzIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGNsYXNzIGlzIGp1c3QgYSBWQUphdmEgdHJpY2suCi0JLy8gaXQgaW1wcm92ZXMgcGVyZm9ybWFuY2UgaW4gVkFKYXZhIGJ5IG1pbmltaXppbmcgY2xhc3MgbG9hZGluZy4KLQlwcml2YXRlIGZpbmFsIENsYXNzIE1vZGVsUHJvdmlkZUFkYXB0ZXJDbGFzcyA9IElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIExpbmtFbGVtZW50QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXR0clJlcGxhY2VkKCkgewotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IHRydWU7Ci0KLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudDsKLQkJSFRNTERvY3VtZW50QWRhcHRlciBhZGFwdGVyID0gKEhUTUxEb2N1bWVudEFkYXB0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWFkYXB0ZXIuY2hpbGRSZXBsYWNlZCgpOwotCX0KLQotCXByb3RlY3RlZCBJQ1NTTW9kZWwgY3JlYXRlTW9kZWwoKSB7Ci0JCS8vIGNyZWF0ZSBwaGFudG9tKGJyb2tlbiBsaW5rKSBleHRlcm5hbCBDU1MgbW9kZWwKLQkJaWYgKGdldEVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsID0gKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpOwotCQlJQ1NTTW9kZWwgbmV3TW9kZWwgPSAoSUNTU01vZGVsKSBiYXNlTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENTU19JRCk7Ci0KLQkJLy8gY2FsY3VsYXRlIGJhc2UgbG9jYXRpb24gYW5kIHNldAotCQkvLyBnZXQgcmVzb2x2ZXIgaW4gTW9kZWwKLQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBiYXNlTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQotCQkvLyByZXNvbHZlIHRvIGFic29sdXRlIHVybCA6IHRoaXMgbmVlZCBub3QgZXhhY3QgbG9jYXRpb24gb2YgY3NzIGZpbGUuIEl0IGlzIGltcG9ydGFudCB0aGF0IGFic3VybCBpcyBub3QgbnVsbC4gCi0JCVN0cmluZyByZWYgPSBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGKTsKLQkJU3RyaW5nIGFic3VybCA9IChyZXNvbHZlciAhPSBudWxsICYmIHJlZiAhPSBudWxsKSA/IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkocmVmLCB0cnVlKSA6IG51bGw7Ci0JCWlmICgoYWJzdXJsID09IG51bGwpIHx8IChhYnN1cmwubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCVVSTEhlbHBlciBoZWxwZXIgPSBuZXcgVVJMSGVscGVyKGJhc2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpKTsKLQkJCWFic3VybCA9IGhlbHBlci50b0Fic29sdXRlKHJlZiA9PSBudWxsID8gIiIgOiByZWYpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFic3VybCA9PSBudWxsKSB8fCAoYWJzdXJsLmxlbmd0aCgpID09IDApKSB7Ci0JCQlhYnN1cmwgPSByZWY7Ci0JCX0KLQkJaWYgKGFic3VybCA9PSBudWxsKSB7Ci0JCQlhYnN1cmwgPSAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJbmV3TW9kZWwuc2V0QmFzZUxvY2F0aW9uKGFic3VybCk7Ci0KLQkJLy8gc2V0IHN0eWxlIGxpc3RlbmVyCi0JCW5ld01vZGVsLmFkZFN0eWxlTGlzdGVuZXIodGhpcyk7Ci0KLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKHRoaXMucmVwbGFjZU1vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgb2xkTW9kZWwgPSBtb2RlbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSByZXRyaWV2ZU1vZGVsKCk7Ci0JCQkJc2V0TW9kZWwobW9kZWwpOwotCi0JCQkJLy8gcmVsZWFzZSBvbGQgbW9kZWwKLQkJCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChvbGRNb2RlbCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG9sZE1vZGVsICE9IG51bGwpCi0JCQkJCW9sZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQkJdGhpcy5yZXBsYWNlTW9kZWwgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5DSEFOR0UpCi0JCQlyZXR1cm47Ci0JCUF0dHIgYXR0ciA9IChBdHRyKSBjaGFuZ2VkRmVhdHVyZTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgicmVsIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQluYW1lLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSB8fCAvLyROT04tTkxTLTEkCQotCQkJCQluYW1lLmVxdWFsc0lnbm9yZUNhc2UoImhyZWYiKSkgey8vJE5PTi1OTFMtMSQKLQkJCWF0dHJSZXBsYWNlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaFNoZWV0KCkgewotCQlpZiAoIXJlcGxhY2VNb2RlbCkgewotCQkJcmVtb3ZlZCgpOwotCQkJcmVwbGFjZU1vZGVsID0gdHJ1ZTsKLQotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCW5vZGUubm90aWZ5KElOb2RlTm90aWZpZXIuQ0hBTkdFLCBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlTm9kZShvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiksIG51bGwsIG51bGwsIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlZCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQotCQkJCS8vIHNldCBlbGVtZW50IHRvIG51bGwgZmlyc3QsIHNvIHRoYXQgbm8gZG9jdW1lbnQgd2lkZSB1cGRhdGVzCi0JCQkJc2V0RWxlbWVudChudWxsKTsKLQkJCQlzZXRNb2RlbChudWxsKTsKLQotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCWFkYXB0ZXIubW9kZWxSZWxlYXNlZChtb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZWQoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChtb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdHRyaWJ1dGUoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyZWwiKTsvLyROT04tTkxTLTEkCi0JCWlmIChyZWwgPT0gbnVsbCB8fCAhcmVsLmVxdWFsc0lnbm9yZUNhc2UoInN0eWxlc2hlZXQiKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlICE9IG51bGwgJiYgIXR5cGUuZXF1YWxzSWdub3JlQ2FzZSgidGV4dC9jc3MiKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBocmVmID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsvLyROT04tTkxTLTEkCi0JCWlmIChocmVmID09IG51bGwgfHwgaHJlZi5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCByZXRyaWV2ZU1vZGVsKCkgewotCQlpZiAoIWlzVmFsaWRBdHRyaWJ1dGUoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBudWxsLGF0dHIgY2hlY2sgaXMgZG9uZSBpbiBpc1ZhbGlkQXR0cmlidXRlKCkKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlTdHJpbmcgaHJlZiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJocmVmIik7Ly8kTk9OLU5MUy0xJAotCi0JCUlET01Nb2RlbCBiYXNlTW9kZWwgPSAoKElET01Ob2RlKSBlbGVtZW50KS5nZXRNb2RlbCgpOwotCQlpZiAoYmFzZU1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IGlkID0gYmFzZU1vZGVsLmdldElkKCk7Ci0JCWlmICghKGlkIGluc3RhbmNlb2YgU3RyaW5nKSkKLQkJCXJldHVybiBudWxsOwotCQkvL1N0cmluZyBiYXNlID0gKFN0cmluZylpZDsKLQotCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFByb3ZpZGVBZGFwdGVyQ2xhc3MpOwotCi0JCVVSTE1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgVVJMTW9kZWxQcm92aWRlcigpOwotCQl0cnkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IHByb3ZpZGVyLmdldE1vZGVsRm9yUmVhZChiYXNlTW9kZWwsIGhyZWYpOwotCQkJaWYgKG5ld01vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoIShuZXdNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkpIHsKLQkJCQluZXdNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gbm90aWZ5IGFkYXB0ZXIKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5tb2RlbFByb3ZpZGVkKG5ld01vZGVsKTsKLQotCQkJcmV0dXJuIChJQ1NTTW9kZWwpIG5ld01vZGVsOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCUlDU1NNb2RlbCBvbGRNb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG9sZE1vZGVsKQotCQkJcmV0dXJuOwotCQlzdXBlci5zZXRNb2RlbChtb2RlbCk7Ci0JCWlmICh0aGlzLnJlcGxhY2VNb2RlbCkKLQkJCXRoaXMucmVwbGFjZU1vZGVsID0gZmFsc2U7Ci0JCWlmIChvbGRNb2RlbCAhPSBudWxsKQotCQkJb2xkTW9kZWwucmVtb3ZlU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQltb2RlbC5hZGRTdHlsZUxpc3RlbmVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyZWU2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ1NTX0NPTlRFTlRfVFlQRSA9ICJ0ZXh0L2NzcyI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqLwotCXByaXZhdGUgU3R5bGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgbm90aWZpZXI7Ci0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQlIVE1MRG9jdW1lbnRBZGFwdGVyIG5ld0FkYXB0ZXIgPSBuZXcgSFRNTERvY3VtZW50QWRhcHRlcigpOwotCQkJbmV3QWRhcHRlci5zZXREb2N1bWVudCgoRG9jdW1lbnQpIG5vZGUpOwotCQkJbm90aWZpZXIuYWRkQWRhcHRlcihuZXdBZGFwdGVyKTsKLQkJCXJldHVybiBuZXdBZGFwdGVyOwotCQl9Ci0JCWlmIChub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBudWxsOwotCi0JCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpIHsKLQkJCWlmICghaXNUYWdBdmFpbGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCksIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCS8vCQlTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSk7Ci0JCQkvLwkJaWYgKHR5cGUgIT0gbnVsbCAmJiAhIHR5cGUuZXF1YWxzSWdub3JlQ2FzZShDU1NfQ09OVEVOVF9UWVBFKSkgewotCQkJLy8JCQlyZXR1cm4gbnVsbDsKLQkJCS8vCQl9Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCVN0eWxlRWxlbWVudEFkYXB0ZXIgbmV3QWRhcHRlciA9IG5ldyBTdHlsZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQluZXdBZGFwdGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQlub3RpZmllci5hZGRBZGFwdGVyKG5ld0FkYXB0ZXIpOwotCQkJcmV0dXJuIG5ld0FkYXB0ZXI7Ci0JCX0KLQkJZWxzZSBpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LKSkgewotCQkJaWYgKCFpc1RhZ0F2YWlsYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkspKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCUxpbmtFbGVtZW50QWRhcHRlciBuZXdBZGFwdGVyID0gbmV3IExpbmtFbGVtZW50QWRhcHRlcigpOwotCQkJbmV3QWRhcHRlci5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJbm90aWZpZXIuYWRkQWRhcHRlcihuZXdBZGFwdGVyKTsKLQkJCXJldHVybiBuZXdBZGFwdGVyOwotCQl9Ci0KLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyOwotCi0JCWlmICghaXNBdHRyaWJ1dGVBdmFpbGFibGUoZWxlbWVudCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0eWxlQXR0ckFkYXB0ZXIgbmV3QWRhcHRlciA9IG5ldyBTdHlsZUF0dHJBZGFwdGVyKCk7Ci0JCW5ld0FkYXB0ZXIuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJbm90aWZpZXIuYWRkQWRhcHRlcihuZXdBZGFwdGVyKTsKLQkJcmV0dXJuIG5ld0FkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgU3R5bGVBZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBTdHlsZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MgfHwgdHlwZSA9PSBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MgfHwgdHlwZSA9PSBJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFnQXZhaWxhYmxlKERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUNNRG9jdW1lbnQgY21kb2MgPSBtb2RlbFF1ZXJ5LmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGRvY3VtZW50KTsKLQkJCUNNTmFtZWROb2RlTWFwIG1hcCA9IGNtZG9jLmdldEVsZW1lbnRzKCk7Ci0JCQlpZiAoKENNRWxlbWVudERlY2xhcmF0aW9uKSBtYXAuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0F0dHJpYnV0ZUF2YWlsYWJsZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyTmFtZSkgewotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgbWFwID0gZGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJaWYgKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBtYXAuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIE9iamVjdCdzIGNsb25lKCkgbWV0aG9kCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUF0dHJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUF0dHJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDhjNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVBdHRyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZUF0dHJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIsIElTdHlsZURlY2xhcmF0aW9uQWRhcHRlciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaWdub3JlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFID0gInN0eWxlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKi8KLQlTdHlsZUF0dHJBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwgJiYgaXNNb2RlbE5lY2Vzc2FyeSgpKSB7Ci0JCQltb2RlbCA9IGNyZWF0ZU1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJUmVnaW9uUGFyc2VyIHBhcnNlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJCWlmIChwYXJzZXIgaW5zdGFuY2VvZiBDU1NTb3VyY2VQYXJzZXIpIHsKLQkJCQkoKENTU1NvdXJjZVBhcnNlcilwYXJzZXIpLnNldFBhcnNlck1vZGUoQ1NTU291cmNlUGFyc2VyLk1PREVfREVDTEFSQVRJT04pOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCQlzZXRNb2RlbChtb2RlbCk7IC8vIG5lZWQgdG8gc2V0IGJlZm9yZSB2YWx1ZUNoYW5nZWQoKQotCQkJdmFsdWVDaGFuZ2VkKCk7Ci0JCX0KLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgIWlzTW9kZWxOZWNlc3NhcnkoKSkgewotCQkJbW9kZWwgPSBudWxsOwotCQkJdmFsdWVDaGFuZ2VkKCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENTU1N0eWxlRGVjbGFyYXRpb24pIG1vZGVsLmdldERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlzZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAodGhpcy5pZ25vcmVOb3RpZmljYXRpb24pCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGV2ZW50VHlwZSAhPSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkKLQkJCXJldHVybjsKLQkJQXR0ciBhdHRyID0gKEF0dHIpIGNoYW5nZWRGZWF0dXJlOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNUWUxFKSkgewotCQkJdmFsdWVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlzZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlzZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZSgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgY291bnQgPSBmbGF0Tm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZsYXROb2Rlcy5pdGVtKGkpOwotCQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQoKSk7Ci0JCQkJfQotCQkJCXZhbHVlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmlnbm9yZU5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFNUWUxFKTsKLQkJfQotCQllbHNlIHsKLQkJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShTVFlMRSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJKChJRE9NTm9kZSkgYXR0cikuc2V0VmFsdWVTb3VyY2UodmFsdWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQlhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKFNUWUxFKTsKLQkJCQkoKElET01Ob2RlKSBhdHRyKS5zZXRWYWx1ZVNvdXJjZSh2YWx1ZSk7Ci0JCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJfQotCQl9Ci0JCXRoaXMuaWdub3JlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0KLQkJbm90aWZ5U3R5bGVDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWx1ZUNoYW5nZWQoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc01vZGVsTmVjZXNzYXJ5KCkpIHsgLy8gcmVtb3ZlZAotCQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJCW5vdGlmeVN0eWxlQ2hhbmdlZChlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGRlZmVyCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUob3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCXZhbHVlID0gKChJRE9NTm9kZSkgYXR0cikuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnNldFRleHQodGhpcywgdmFsdWUpOwotCi0JCW5vdGlmeVN0eWxlQ2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNNb2RlbE5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsICYmIGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGVOb2RlKG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSkgIT0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUVsZW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZjk3YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVFbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIAkgICAgTWFzYWtpIFNhaXRvaCAoTVNBSVRPSEBqcC5pYm0uY29tKQotICoJCVNlZSBCdWcgMTUzMDAwICBTdHlsZSBBZGFwdGVycyBzaG91bGQgYmUgbGF6aWVyCi0gKgkJaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzAwMAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JTW9kZWxQcm92aWRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZUVsZW1lbnRBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVwbGFjZU1vZGVsID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gaWdub3JlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3R5bGVFbGVtZW50QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmVwYXJhdGlvbiBvZiBhcHBseWluZyBjaGFuZ2VzIGZyb20gQ1NTIHN1Yi1tb2RlbCB0byBIVE1MIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBnZXQgb2xkIGNvbnRlbnQgbGVuZ3RoCi0JCU5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkID09IG51bGwgfHwgY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybjsKLQkJSURPTU5vZGUgY29udGVudCA9IChJRE9NTm9kZSkgY2hpbGQ7Ci0JCWludCBvbGRMZW5ndGggPSBjb250ZW50LmdldEVuZE9mZnNldCgpIC0gY29udGVudC5nZXRTdGFydE9mZnNldCgpOwotCi0JCS8vIGdldCBuZXcgY29udGVudCBsZW5ndGgKLQkJaW50IG5ld0xlbmd0aCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmIChmbGF0Tm9kZXMgIT0gbnVsbCkgewotCQkJaW50IGNvdW50ID0gZmxhdE5vZGVzLmdldExlbmd0aCgpOwotCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9IGZsYXROb2Rlcy5pdGVtKGNvdW50IC0gMSk7Ci0JCQkJaWYgKGxhc3QgIT0gbnVsbCkKLQkJCQkJbmV3TGVuZ3RoID0gbGFzdC5nZXRFbmQoKTsKLQkJCX0KLQkJfQotCi0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpbnQgZW5kID0gZmxhdE5vZGUuZ2V0RW5kKCk7Ci0JCWludCBkaWZmID0gb2xkTGVuZ3RoIC0gbmV3TGVuZ3RoOwotCQlpbnQgbGVuZ3RoID0gZW5kIC0gb2Zmc2V0ICsgZGlmZjsKLQkJU3RyaW5nIGRhdGEgPSBmbGF0Tm9kZS5nZXRUZXh0KCk7Ci0KLQkJcmVwbGFjZURhdGEob2Zmc2V0LCBsZW5ndGgsIGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEFwcGx5IGNoYW5nZXMgZnJvbSBIVE1MIG1vZGVsIHRvIENTUyBzdWItbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29udGVudENoYW5nZWQoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBkYXRhID0gbnVsbDsKLQkJTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkgewotCQkJZGF0YSA9IGNoaWxkLmdldE5vZGVWYWx1ZSgpOwotCQl9Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlkYXRhID0gIiI7Ly8kTk9OLU5MUy0xJAotCi0JCS8vIG1pbmltaXplIHJlcGxhY2UgcmFuZ2UKLQkJaW50IHN0YXJ0ID0gMCwgZW5kID0gMDsKLQkJU3RyaW5nIG9sZERhdGEgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KCk7Ci0JCWlmIChvbGREYXRhID09IG51bGwpCi0JCQlvbGREYXRhID0gIiI7Ly8kTk9OLU5MUy0xJAotCi0JCS8vIHNlYXJjaCBkaWZmZXJlbmN0IGNoYXJhY3RlciBwb3NpdGlvbiBmcm9tIGZpcnN0Ci0JCWZvciAoOyBzdGFydCA8IG9sZERhdGEubGVuZ3RoKCkgJiYgc3RhcnQgPCBkYXRhLmxlbmd0aCgpOyBzdGFydCsrKQotCQkJaWYgKG9sZERhdGEuY2hhckF0KHN0YXJ0KSAhPSBkYXRhLmNoYXJBdChzdGFydCkpCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKHN0YXJ0ID09IG9sZERhdGEubGVuZ3RoKCkgJiYgc3RhcnQgPT0gZGF0YS5sZW5ndGgoKSkKLQkJCXJldHVybjsgLy8gbm8gY2hhbmdlCi0JCWVsc2UgaWYgKHN0YXJ0ID09IG9sZERhdGEubGVuZ3RoKCkpIHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChnZXRSZXF1ZXN0ZXJIMkMoKSwgc3RhcnQsIDAsIGRhdGEuc3Vic3RyaW5nKHN0YXJ0KSk7IC8vIGFwcGVuZCB0ZXh0IHRvIGxhc3QKLQkJfQotCQllbHNlIGlmIChzdGFydCA9PSBkYXRhLmxlbmd0aCgpKSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZ2V0UmVxdWVzdGVySDJDKCksIHN0YXJ0LCBvbGREYXRhLmxlbmd0aCgpIC0gc3RhcnQsICIiKTsgLy8gcmVtb3ZlIHRleHQgb2YgbGFzdCAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWFyY2ggZGlmZmVyZW5jdCBjaGFyYWN0ZXIgcG9zaXRpb24gZnJvbSBsYXN0Ci0JCQlmb3IgKDsgc3RhcnQgPCBvbGREYXRhLmxlbmd0aCgpIC0gZW5kICYmIHN0YXJ0IDwgZGF0YS5sZW5ndGgoKSAtIGVuZDsgZW5kKyspIHsKLQkJCQlpZiAob2xkRGF0YS5jaGFyQXQob2xkRGF0YS5sZW5ndGgoKSAtIGVuZCAtIDEpICE9IGRhdGEuY2hhckF0KGRhdGEubGVuZ3RoKCkgLSBlbmQgLSAxKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZ2V0UmVxdWVzdGVySDJDKCksIHN0YXJ0LCBvbGREYXRhLmxlbmd0aCgpIC0gZW5kIC0gc3RhcnQsIGRhdGEuc3Vic3RyaW5nKHN0YXJ0LCBkYXRhLmxlbmd0aCgpIC0gZW5kKSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKHRoaXMucmVwbGFjZU1vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgb2xkTW9kZWwgPSBtb2RlbDsKLQkJCW1vZGVsID0gY3JlYXRlTW9kZWwoZmFsc2UpOwotCi0JCQlzZXRNb2RlbChtb2RlbCwgZmFsc2UpOyAvLyBuZWVkIHRvIHNldCBiZWZvcmUgY29udGVudENoYW5nZWQoKQotCQkJY29udGVudENoYW5nZWQoKTsKLQotCQkJLy8gZnJvbSBzdXBlci5jcmVhdGVNb2RlbCgpCi0JCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgbW9kZWxQcm92aWRlQWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJLy8gbm90aWZ5IGFkYXB0ZXIKLQkJCWlmIChtb2RlbFByb3ZpZGVBZGFwdGVyICE9IG51bGwpCi0JCQkJbW9kZWxQcm92aWRlQWRhcHRlci5tb2RlbFByb3ZpZGVkKG1vZGVsKTsKLQotCQkJLy8gZnJvbSBjcmVhdGVNb2RlbCgpCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCQkvLyBmcm9tIHNldE1vZGVsKCkKLQkJCWlmIChvbGRNb2RlbCAhPSBudWxsKQotCQkJCW9sZE1vZGVsLnJlbW92ZVN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5hZGRTdHlsZUxpc3RlbmVyKHRoaXMpOwotCi0JCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlci5tb2RlbFJlbW92ZWQob2xkTW9kZWwpOwotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5yZXBsYWNlTW9kZWwgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEF0dHJpYnV0ZSgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUubGVuZ3RoKCkgPiAwICYmICF0eXBlLmVxdWFsc0lnbm9yZUNhc2UoInRleHQvY3NzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJQ1NTTW9kZWwgY3JlYXRlTW9kZWwoKSB7Ci0JCXJldHVybiBjcmVhdGVNb2RlbCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKGJvb2xlYW4gYWRkTGlzdGVuZXIpIHsKLQkJaWYgKCFpc1ZhbGlkQXR0cmlidXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFhZGRMaXN0ZW5lcikKLQkJCXJldHVybiBzdXBlci5jcmVhdGVNb2RlbChmYWxzZSk7Ci0KLQkJSUNTU01vZGVsIG1vZGVsID0gc3VwZXIuY3JlYXRlTW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JLy8gIHB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JLy8gIAlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JLy8gIAlpZiAobW9kZWwgPT0gbnVsbCkgewotCS8vICAJCW1vZGVsID0gY3JlYXRlTW9kZWwoKTsKLQkvLyAgCQlpZiAobW9kZWwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JLy8gIAkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkvLyAgCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHJldHVybiBudWxsOwotCS8vICAJCXN0cnVjdHVyZWREb2N1bWVudC5hZGRNb2RlbENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkvLyAgCQlzZXRNb2RlbChtb2RlbCk7IC8vIG5lZWQgdG8gc2V0IGJlZm9yZSBjb250ZW50Q2hhbmdlZCgpCi0JLy8gIAkJY29udGVudENoYW5nZWQoKTsKLQkvLyAgCX0KLQkvLyAgCXJldHVybiBtb2RlbDsKLQkvLyAgfQotCS8qKgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFJlcXVlc3RlckgyQygpIHsKLQkJcmV0dXJuIChnZXRFbGVtZW50KCkgIT0gbnVsbCAmJiAoKElET01Ob2RlKSBnZXRFbGVtZW50KCkpLmdldE1vZGVsKCkgIT0gbnVsbCkgPyAoT2JqZWN0KSAoKElET01Ob2RlKSBnZXRFbGVtZW50KCkpLmdldE1vZGVsKCkgOiB0aGlzOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFJlcXVlc3RlckMySCgpIHsKLQkJcmV0dXJuIChnZXRNb2RlbCgpICE9IG51bGwpID8gKE9iamVjdCkgZ2V0TW9kZWwoKSA6IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSA9PSBnZXRSZXF1ZXN0ZXJIMkMoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAoZmxhdE5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZmxhdE5vZGVzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRpbmcgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyJ3MgbWV0aG9kCi0JICogRXZlbnQgZnJvbSBDU1MgRmxhdCBNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRpbmcgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyJ3MgbWV0aG9kCi0JICogRXZlbnQgZnJvbSBDU1MgRmxhdCBNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IGdldFJlcXVlc3RlckgyQygpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gZXZlbnQuZ2V0T2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gZXZlbnQuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9PSBudWxsICYmIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlyZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIElOb2RlQWRhcHRlcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gPFNUWUxFPiBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmICh0aGlzLmlnbm9yZU5vdGlmaWNhdGlvbikKLQkJCXJldHVybjsKLQotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQpIHsKLQkJCWNvbnRlbnRDaGFuZ2VkKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cikgY2hhbmdlZEZlYXR1cmU7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCVN0cmluZyBuYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ0eXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucmVwbGFjZU1vZGVsID0gdHJ1ZTsKLQotCQkJCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUhUTUxEb2N1bWVudEFkYXB0ZXIgYWRhcHRlciA9IChIVE1MRG9jdW1lbnRBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlci5jaGlsZFJlcGxhY2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gZ2V0UmVxdWVzdGVySDJDKCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRpbmcgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyJ3MgbWV0aG9kCi0JICogRXZlbnQgZnJvbSBDU1MgRmxhdCBNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gZ2V0UmVxdWVzdGVySDJDKCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBseSBjaGFuZ2VzIGZyb20gQ1NTIHN1Yi1tb2RlbCB0byBIVE1MIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBkYXRhKSB7Ci0JCUlET01Ob2RlIGVsZW1lbnQgPSAoSURPTU5vZGUpIGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU1vZGVsIG93bmVyTW9kZWwgPSBlbGVtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChvd25lck1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gb3duZXJNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgY29udGVudE9mZnNldCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJZGF0YSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotCQl0aGlzLmlnbm9yZU5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChnZXRSZXF1ZXN0ZXJDMkgoKSwgY29udGVudE9mZnNldCArIG9mZnNldCwgbGVuZ3RoLCBkYXRhKTsKLQkJdGhpcy5pZ25vcmVOb3RpZmljYXRpb24gPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBQcmVwYXJhdGlvbiBvZiBhcHBseWluZyBjaGFuZ2VzIGZyb20gQ1NTIHN1Yi1tb2RlbCB0byBIVE1MIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlpbnQgY291bnQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpOwotCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCk7Ci0JCQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQkJCW9mZnNldCA9IGZpcnN0LmdldFN0YXJ0KCk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKGNvdW50IC0gMSk7Ci0JCQkJaWYgKGxhc3QgIT0gbnVsbCkKLQkJCQkJbGVuZ3RoID0gbGFzdC5nZXRFbmQoKSAtIG9mZnNldDsKLQkJCX0KLQkJfQotCQlTdHJpbmcgZGF0YSA9IG51bGw7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwpIHsKLQkJCWludCBjb3VudCA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbShpKTsKLQkJCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KCkpOwotCQkJCQlpZiAoaSA9PSAwKQotCQkJCQkJb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCQl9Ci0JCQkJZGF0YSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJcmVwbGFjZURhdGEob2Zmc2V0LCBsZW5ndGgsIGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElDU1NNb2RlbCBtb2RlbCkgewotCQlzZXRNb2RlbChtb2RlbCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSUNTU01vZGVsIG1vZGVsLCBib29sZWFuIHNldHVwTGlzdGVuZXIpIHsKLQkJSUNTU01vZGVsIG9sZE1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gb2xkTW9kZWwpCi0JCQlyZXR1cm47Ci0JCXN1cGVyLnNldE1vZGVsKG1vZGVsKTsKLQkJaWYgKCFzZXR1cExpc3RlbmVyKQotCQkJcmV0dXJuOwotCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkKLQkJCW9sZE1vZGVsLnJlbW92ZVN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKQotCQkJbW9kZWwuYWRkU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGM2ZDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBTdHlsZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqLwotCXZvaWQgc3R5bGVDaGFuZ2VkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODU1OWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAKLSAqLwotcHVibGljIGNsYXNzIFVSTEhlbHBlciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlVSTEhlbHBlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZVVybAotCSAqLwotCXB1YmxpYyBVUkxIZWxwZXIoU3RyaW5nIGJhc2VVcmwpIHsKLQkJc3VwZXIoYmFzZVVybCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VVcmwKLQkgKiBAcGFyYW0gZG9jUm9vdAotCSAqLwotCXB1YmxpYyBVUkxIZWxwZXIoU3RyaW5nIGJhc2VVcmwsIFN0cmluZyBkb2NSb290KSB7Ci0JCXN1cGVyKGJhc2VVcmwsIGRvY1Jvb3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvVVJMTW9kZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvVVJMTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjFiMTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTE1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlBhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuUHJvamVjdFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLy8gVE9ETyB3aGVuIHRoaXMgY2xhc3MgaXMgcmVtb3ZlZCBmcm9tIC5jb3JlLCBQYXRoSGVscGVyIGFuZCBVUkxIZWxwZXIgY2xhc3MKLS8vIGFsc28gY2FuIGJlIHJlbW92ZWQuCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVVJMTW9kZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX01PREVMX0ZPUl9SRUFEID0gMTsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX05FV19NT0RFTF9GT1JfUkVBRCA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9NT0RFTF9GT1JfRURJVCA9IDM7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9ORVdfTU9ERUxfRk9SX0VESVQgPSA0OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEX0JVRkZFUl9TSVpFID0gNDA5NjsKLQkvLyBJTW9kZWxNYW5hZ2VyCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVVJMTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBvYnRhaW4gbW9kZWwgbWFuYWdlcgotCQltb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBJRCBmcm9tIGEgZmlsZW5hbWUuIFRoaXMgbXVzdCBiZSBzYW1lIGFzCi0JICogRmlsZU1vZGVsUHJvdmlkZXIuY2FsY3VsYXRlSWQoSUZpbGUpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElQYXRoIGZ1bGxJUGF0aCkgewotCQlyZXR1cm4gZnVsbElQYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldENvbW1vbk1vZGVsRm9yKGZpbmFsIElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBmaW5hbCBTdHJpbmcgcmVmLCBmaW5hbCBpbnQgd2hpY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZpcnN0LCBjcmVhdGUgYWJzb2x1dGUgdXJsCi0JCVN0cmluZyBhYnNVUkwgPSByZXNvbHZlVVJJKGJhc2VNb2RlbCwgcmVmLCB0cnVlKTsKLQkJaWYgKChhYnNVUkwgPT0gbnVsbCkgfHwgKGFic1VSTC5sZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBuZWVkIHRvIHJlbW92ZSBmaWxlOi8vIHNjaGVtZSBpZiBuZWNlc3NhcnkKLQkJdHJ5IHsKLQkJCWZpbmFsIGphdmEubmV0LlVSTCBhVVJMID0gbmV3IGphdmEubmV0LlVSTChhYnNVUkwpOwotCQkJLy8gQW4gYWN0dWFsIFVSTCB3YXMgZ2l2ZW4sIG9ubHkgZmlsZTovLy8gaXMgc3VwcG9ydGVkCi0JCQkvLyByZXNvbHZlIGl0IGJ5IGZpbmRpbmcgdGhlIGZpbGUgaXQgcG9pbnRzIHRvCi0JCQlpZiAoIWFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoInBsYXRmb3JtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikgJiYgKGFVUkwuZ2V0SG9zdCgpLmVxdWFscygibG9jYWxob3N0IikgfHwgYVVSTC5nZXRIb3N0KCkubGVuZ3RoKCkgPT0gMCkpIHsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQlhYnNVUkwgPSBhVVJMLmdldEZpbGUoKTsKLQkJCQkJZmluYWwgSVBhdGggaXBhdGggPSBuZXcgUGF0aChhYnNVUkwpOwotCQkJCQkvLyAgaWYgcGF0aCBoYXMgYSBkZXZpY2UsIGFuZCBpZiBpdCBiZWdpbnMgd2l0aAotCQkJCQkvLyBJUGF0aC5TRVBBUkFUT1IsIHJlbW92ZSBpdAotCQkJCQlmaW5hbCBTdHJpbmcgZGV2aWNlID0gaXBhdGguZ2V0RGV2aWNlKCk7Ci0JCQkJCWlmICgoZGV2aWNlICE9IG51bGwpICYmIChkZXZpY2UubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJaWYgKGRldmljZS5jaGFyQXQoMCkgPT0gSVBhdGguU0VQQVJBVE9SKSB7Ci0JCQkJCQkJZmluYWwgU3RyaW5nIG5ld0RldmljZSA9IGRldmljZS5zdWJzdHJpbmcoMSk7Ci0JCQkJCQkJYWJzVVJMID0gaXBhdGguc2V0RGV2aWNlKG5ld0RldmljZSkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gbWZ1RXhjKSB7Ci0JCX0KLQotCi0JCS8vIG5leHQsIGRlY2lkZSBwcm9qZWN0Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlmaW5hbCBJUGF0aCBmdWxsSVBhdGggPSBuZXcgUGF0aChhYnNVUkwpOwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IHdvcmtzcGFjZS5nZXRDb250YWluZXJGb3JMb2NhdGlvbihmdWxsSVBhdGgpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCS8vIGZ1bGxJUGF0aCBkb2Vzbid0IGV4aXN0IGluIHdvcmtzcGFjZQotCQkJcHJvamVjdCA9IGNvbnRhaW5lci5nZXRQcm9qZWN0KCk7Ci0JCX0KLQotCQkvLyBJZiBIVE1MIGRvY3VtZW50IGhhcyBhIGxpbmsgdG8gYW4gZXh0ZXJuIENTUyB3aGljaCBpcyBub3QgaW4KLQkJLy8gSVByb2plY3QKLQkJLy8gd29ya3NwYWNlLmdldENvbnRhaW5lckZvckxvYXRpb24oKSBtYXkgcmV0dXJuIG51bGwuIFdlIG5lZWQgdG8gdGFrZQotCQkvLyBjYXJlCi0JCS8vIG9mIHRoaXMgY2FzZQotCi0JCS8vIG5vdywgZ2V0IGFic1VSTCdzIElGaWxlCi0JCWlmICgocHJvamVjdCAhPSBudWxsKSAmJiAocHJvamVjdC5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YoZnVsbElQYXRoKSA9PSBmYWxzZSkpIHsKLQkJCS8vIGl0J3MgYXQgb3V0c2lkZSBvZiBQcm9qZWN0Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IGZ1bGxJUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHByb2plY3QuZ2V0TG9jYXRpb24oKS5zZWdtZW50Q291bnQoKSk7Ci0JCQlJRmlsZSBmaWxlID0gKGZpbGVQYXRoICE9IG51bGwgJiYgIWZpbGVQYXRoLmlzRW1wdHkoKSkgPyBwcm9qZWN0LmdldEZpbGUoZmlsZVBhdGgpIDogbnVsbDsKLQkJCWlmIChmaWxlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gb2J0YWluIG1vZGVsCi0JCQlpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9FRElUKSB7Ci0JCQkJbW9kZWwgPSBnZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX1JFQUQpIHsKLQkJCQltb2RlbCA9IGdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCX0KLQotCQkJLy8gc2V0dGluZyBzeW5jaHJvbml6YXRpb24gc3RhbXAgaXMgSU1vZGVsTWFuYWdlcidzIGNsaWVudCdzCi0JCQkvLyByZXNwb25zaWJpbGl0eQotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKSA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkKLQkJCQltb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKGZpbGUpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJCS8vIG9idGFpbiByZXNvbHZlcgotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAocHJvamVjdCAhPSBudWxsKSA/IChVUklSZXNvbHZlcikgcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKSA6IG51bGw7Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCS8vIFByb2plY3RSZXNvbHZlciBjYW4gdGFrZSBjYXJlIG9mIHRoZSBjYXNlIGlmIHByb2plY3QgaXMKLQkJCQkvLyBudWxsLgotCQkJCXJlc29sdmVyID0gbmV3IFByb2plY3RSZXNvbHZlcihwcm9qZWN0KTsKLQkJCX0KLQkJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIHRoZXJlIGlzIG5vIHByb2plY3QuIHdlIGNhbid0IGV4cGVjdCBJUHJvamVjdCBoZWxwIHRvIGNyZWF0ZQotCQkJLy8gaWQvaW5wdXRTdHJlYW0KLQkJCWphdmEuaW8uRmlsZSBmaWxlID0gZnVsbElQYXRoLnRvRmlsZSgpOwotCi0JCQkvLyBvYmF0aW4gaWQKLQkJCWlkID0gY2FsY3VsYXRlSWQoZnVsbElQYXRoKTsKLQotCQkJLy8gb2J0YWluIElucHV0U3RyZWFtCi0JCQl0cnkgewotCQkJCWluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotCQkJCS8vIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciB3ZSBkb24ndCBoYXZlIHJlYWQgcGVybWlzc2lvbgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBvYnRhaW4gbW9kZWwKLQkJCXRyeSB7Ci0JCQkJaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfRURJVCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChpZCwgaW5TdHJlYW0sIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9SRUFEKSB7Ci0JCQkJCW1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpblN0cmVhbSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlKSB7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBjbG9zZSBub3cgIQotCQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQotCQkvLyBzZXQgbG9jYXRpb25pZAotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSA9PSBudWxsKSB7Ci0JCQltb2RlbC5zZXRCYXNlTG9jYXRpb24oZnVsbElQYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbW1vbk1vZGVsRm9yKGJhc2VNb2RlbCwgcmVmLCBHRVRfTU9ERUxfRk9SX0VESVQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCQkvLyBjcmVhdGUgYSBmYWtlIElucHV0U3RyZWFtCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSwgRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25Nb2RlbEZvcihiYXNlTW9kZWwsIHJlZiwgR0VUX01PREVMX0ZPUl9SRUFEKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJLy8gY3JlYXRlIGEgZmFrZSBJbnB1dFN0cmVhbQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXROZXdNb2RlbEZvckVkaXQoaUZpbGUsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSByaXUpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VBbHJlYWR5RXhpc3RzIHJhZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE5ld01vZGVsRm9yRWRpdChpRmlsZSwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIHJpdSkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUFscmVhZHlFeGlzdHMgcmFlKSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjaGVjayB0aGUgbW9kZWwgaXMgSFRNTCBmYW1pbHkgb3Igbm90Ci0JICovCi0Jc3RhdGljIHByaXZhdGUgYm9vbGVhbiBpc0hUTUxGYW1pbHkoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYWRhcHRlci5oYXNGZWF0dXJlKEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuSFRNTCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqIDxjb2RlPnJlc29sdmVDcm9zc1Byb2plY3RMaW5rczwvY29kZT46IElmIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcwotCSAqIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcHJvcGVybHkgcmVzb2x2ZSB0aGUgVVJJIGlmIGl0IGlzCi0JICogYSB2YWxpZCBVUkkgcG9pbnRpbmcgdG8gYW5vdGhlciAoYXBwcm9wcmlhdGUpIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVSSShJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZiwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGZvciBIVE1MLCAnaHJlZicgYXR0cmlidXRlIHZhbHVlIG9mIEJBU0UgZWxlbWVudAotCQkvLyBzaG91bGQgYmUgdXNlZCwgaWYgZXhpc3RzIGFueQotCQlTdHJpbmcgYmFzZUhyZWYgPSBudWxsOwotCQkvLyBkbXdfVE9ETyBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIGhhbmRsZSBhIGNvbnRlbnQgbW9kZWwKLQkJLy8gb2YgSFRNTCBvciBYSFRNTAotCQlpZiAoaXNIVE1MRmFtaWx5KGJhc2VNb2RlbCkpIHsKLQkJCWZpbmFsIElET01Nb2RlbCB4bWxtb2RlbCA9IChJRE9NTW9kZWwpIGJhc2VNb2RlbDsKLQkJCWZpbmFsIElET01Eb2N1bWVudCBkb2MgPSB4bWxtb2RlbC5nZXREb2N1bWVudCgpOwotCQkJLy8gbG9vayBmb3IgPEJBU0U+IHcvIGhyZWYKLQkJCWZpbmFsIE5vZGVMaXN0IG5sID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJCQVNFIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJCS8vIHBlciBlYWNoIDxCQVNFPgotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlmaW5hbCBOb2RlIGJhc2VOb2RlID0gbmwuaXRlbShpKTsKLQkJCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vIGdldCBhbGwgYXR0cnMKLQkJCQkJCWZpbmFsIE5hbWVkTm9kZU1hcCBhdHRyTm9kZXMgPSBiYXNlTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlpZiAoYXR0ck5vZGVzICE9IG51bGwpIHsKLQkJCQkJCQlmaW5hbCBOb2RlIGF0dHJOb2RlID0gYXR0ck5vZGVzLmdldE5hbWVkSXRlbSgiSFJFRiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoYXR0ck5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBmb3VuZCBocmVmPSIiCi0JCQkJCQkJCWZpbmFsIFN0cmluZyBhdHRyVmFsdWUgPSBhdHRyTm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQliYXNlSHJlZiA9IGF0dHJWYWx1ZS50cmltKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gd2hhdCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgPEJBU0U+IHRhZ3MgPz8KLQkJCQkJaWYgKGJhc2VIcmVmICE9IG51bGwpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0IHJlc29sdmVyIGluIE1vZGVsCi0JCWZpbmFsIFVSSVJlc29sdmVyIHJlc29sdmVyID0gYmFzZU1vZGVsLmdldFJlc29sdmVyKCk7Ci0KLQkJLy8gcmVzb2x2ZSB0byBhYnNvbHV0ZSB1cmwKLQkJZmluYWwgU3RyaW5nIGFic3VybCA9IChyZXNvbHZlciAhPSBudWxsKSA/ICgoYmFzZUhyZWYgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRMb2NhdGlvbkJ5VVJJKHJlZiwgYmFzZUhyZWYsIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgOiByZXNvbHZlci5nZXRMb2NhdGlvbkJ5VVJJKHJlZiwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSkgOiBudWxsOwotCQlpZiAoKHJlc29sdmVyICE9IG51bGwpICYmIChhYnN1cmwgPT0gbnVsbCkgJiYgKHJlZiAhPSBudWxsKSAmJiAocmVmLnRyaW0oKS5sZW5ndGgoKSA+IDApICYmIChyZWYudHJpbSgpLmNoYXJBdCgwKSA9PSAnLycpKSB7Ci0JCQkvLyB0byByZWFjaCBoZXJlIG1lYW5zIDoKLQkJCS8vICAgIHJlZiBpcyBhIERvY3Jvb3QgcmVsYXRpdmUKLQkJCS8vICAgIHJlc29sdmVyIGNhbid0IHJlc29sdmUgcmVmCi0JCQkvLyBzbyB0aGF0IGhyZWYgaXMgYSBicm9rZW4gYW5kIHNob3VsZCBub3QgY3JlYXRlIG1vZGVsCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoKGFic3VybCAhPSBudWxsKSAmJiAoYWJzdXJsLmxlbmd0aCgpID4gMCkpIHsKLQkJCXJldHVybiBhYnN1cmw7Ci0JCX0KLQotCQkvLyBtYXliZSByZWYgaXMgYXQgb3V0c2lkZSBvZiB0aGUgUHJvamVjdAotCQkvLyBvYnRhaW4gZG9jcm9vdDsKLQkJZmluYWwgSUNvbnRhaW5lciBjb250YWluZXIgPSAocmVzb2x2ZXIgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRSb290TG9jYXRpb24oKSA6IG51bGw7Ci0JCVN0cmluZyBkb2Nyb290ID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlJUGF0aCBjb250YWluZXJMb2NhdGlvbiA9IGNvbnRhaW5lci5nZXRMb2NhdGlvbigpOwotCQkJaWYgKGNvbnRhaW5lckxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlkb2Nyb290ID0gY29udGFpbmVyTG9jYXRpb24udG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRhaW5lci5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwpIHsKLQkJCQlkb2Nyb290ID0gY29udGFpbmVyLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlpZiAoZG9jcm9vdCA9PSBudWxsKSB7Ci0JCQlkb2Nyb290ID0gYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChkb2Nyb290ID09IG51bGwpIHsKLQkJCS8vIHNob3VsZCBub3QgYmUKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gb2J0YWluIGRvY3VtZW50IHVybAotCQlTdHJpbmcgbW9kZWxCYXNlTG9jYXRpb24gPSBiYXNlTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmICgobW9kZWxCYXNlTG9jYXRpb24gPT0gbnVsbCkgfHwgKG1vZGVsQmFzZUxvY2F0aW9uLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBmYWxsYmFjay4uLgotCQkJbW9kZWxCYXNlTG9jYXRpb24gPSBiYXNlTW9kZWwuZ2V0SWQoKTsKLQkJfQotCQlpZiAoKG1vZGVsQmFzZUxvY2F0aW9uID09IG51bGwpIHx8IChtb2RlbEJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gaSBjYW4ndCByZXNvbHZlIHVyaSAhCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHJlc29sdmUgdXJsCi0JCVVSTEhlbHBlciBoZWxwZXIgPSBuZXcgVVJMSGVscGVyKFBhdGhIZWxwZXIuZ2V0Q29udGFpbmluZ0ZvbGRlclBhdGgobW9kZWxCYXNlTG9jYXRpb24pLCBQYXRoSGVscGVyLmdldENvbnRhaW5pbmdGb2xkZXJQYXRoKFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChkb2Nyb290KSkpOwotCQlyZXR1cm4gaGVscGVyLnRvQWJzb2x1dGUocmVmKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwY2RkMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZEhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLkhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLlN0eWxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk1vZGVsUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRIVE1MIGltcGxlbWVudHMgRW1iZWRkZWRUeXBlSGFuZGxlciB7Ci0KLQlwdWJsaWMgU3RyaW5nIENvbnRlbnRUeXBlSURfRW1iZWRkZWRIVE1MID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW1iZWRkZWRIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTGlzdCBzdXBwb3J0ZWRNaW1lVHlwZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW1iZWRkZWRIVE1MLgotCSAqLwotCXB1YmxpYyBFbWJlZGRlZEhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFkZCB0YWcgbmFtZXMgdXNpbmcgQmxvY2tNYXJrZXIgb2JqZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEhUTUxpc2hUYWcoQmxvY2tUYWdQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnbmFtZSkgewotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIGZhbHNlKTsKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKGJtKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjZ2V0RmFtaWx5SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5SWQoKSB7Ci0JCXJldHVybiBNb2RlbEhhbmRsZXJGb3JIVE1MLkFzc29jaWF0ZWRDb250ZW50VHlwZUlEOwotCX0KLQotCS8qCi0JICogT25seSAibW9kZWwgc2lkZSIgZW1iZWRkZWQgZmFjdG9yaWVzIGNhbiBiZSBhZGRlZCBoZXJlLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwoKSk7Ci0JCS8vIGZhY3Rvcmllcy5hZGRBbGwoUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yaWVzKHRoaXMpKTsKLQkJcmV0dXJuIGZhY3RvcmllczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNpbml0aWFsaXplUGFyc2VyKFJlZ2lvblBhcnNlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKSB7Ci0JCWFkZEhUTUxpc2hUYWcocGFyc2VyLCAic2NyaXB0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSFRNTGlzaFRhZyhwYXJzZXIsICJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIExpc3QgZ2V0U3VwcG9ydGVkTWltZVR5cGVzKCkgewotCQlpZiAoc3VwcG9ydGVkTWltZVR5cGVzID09IG51bGwpIHsKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoInRleHQvaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJ0ZXh0L3hodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoImFwcGxpY2F0aW9uL3hodG1sK3htbCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJ0ZXh0L3ZuZC53YXAud21sIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGVkTWltZVR5cGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnkpOwotCi0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnMoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcykpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlyZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnMoTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKSkgewotCQkJZmFjdG9yeSA9IEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQlyZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnMoSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzKSkgewotCi0JCQlmYWN0b3J5ID0gSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcykpIHsKLQotCQkJZmFjdG9yeSA9IFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChyZWdpc3RyeSk7Ci0KLQkJLy8gSVNTVUU6IHNob3VsZCB0aGVzZSBmYWN0b3JpZXMgYmUgcmVsZWFzZWQ/IE9yIGp1c3QgCi0JCS8vIHJlbW92ZWQgZnJvbSB0aGlzIHJlZ2lzdHJ5LCBiZWNhdXNlIHdlIGFyZSBnZXR0aW5nIHJlYWR5IHRvCi0JCS8vIHJlLWFkZCB0aGVtPwotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlmYWN0b3J5ID0gcmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJCWZhY3RvcnkucmVsZWFzZSgpOwotCQkJcmVnaXN0cnkucmVtb3ZlRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcykpIHsKLQkJCWZhY3RvcnkgPSByZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcyk7Ci0JCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlmYWN0b3J5ID0gcmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3MpOwotCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQlyZWdpc3RyeS5yZW1vdmVGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnMoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKSkgewotCQkJZmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCWZhY3RvcnkucmVsZWFzZSgpOwotCQkJcmVnaXN0cnkucmVtb3ZlRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdW5pbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKSB7Ci0JCS8vIEknbSBhc3N1bWluZyBibG9jayBtYXJrZXJzIGFyZSB1bmlxdWUgYmFzZWQgb24gbmFtZSBvbmx5Ci0JCS8vIHdlIGFkZCB0aGVzZSBhcyBmdWxsIEJsb2NrTWFya2VycywgYnV0IHJlbW92ZSBiYXNlZCBvbiBuYW1lIGFsb25lLgotCQlwYXJzZXIucmVtb3ZlQmxvY2tNYXJrZXIoInNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlci5yZW1vdmVCbG9ja01hcmtlcigic2NyaXB0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZEhUTUwoKTsKLQl9Ci0KLQkvKioKLQkgKiB3aWxsIHNvbWVkYXkgYmUgY29udHJvbGxlZCB2aWEgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKLQkJcmV0dXJuIGdldFN1cHBvcnRlZE1pbWVUeXBlcygpLmNvbnRhaW5zKG1pbWVUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjliYWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5IVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5IVE1MRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5IVE1MTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkFic3RyYWN0TW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvckhUTUwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCS8qKiAKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiAKLQkgKiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4gYXQgcnVuIHRpbWUgd2l0aCAKLQkgKiB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiAKLQkgKiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4gYXQgcnVuIHRpbWUgd2l0aCAKLQkgKiB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySURfSFRNTCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEX0hUTUwpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBIVE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBIVE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YjYwMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKi8KLWNsYXNzIENNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbSBleHRlbmRzIENNTm9kZUJ1ZGR5U3lzdGVtIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0KLQotCXB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uQnVkZHlTeXN0ZW0oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBzZWxmLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGJ1ZGR5LCBib29sZWFuIGlzWEhUTUwpIHsKLQkJc3VwZXIoc2VsZiwgYnVkZHksIGlzWEhUTUwpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldEF0dHJOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQlyZXR1cm4gZ2V0U2VsZigpLmdldEF0dHJOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQXR0cmlidXRlRGVjbGFyYXRpb24jZ2V0QXR0clR5cGUoKQotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkgewotCQlyZXR1cm4gZ2V0U2VsZigpLmdldEF0dHJUeXBlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQXR0cmlidXRlRGVjbGFyYXRpb24jZ2V0RGVmYXVsdFZhbHVlKCkKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRTZWxmKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQXR0cmlidXRlRGVjbGFyYXRpb24jZ2V0RW51bUF0dHIoKQotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCXJldHVybiBnZXRTZWxmKCkuZ2V0RW51bUF0dHIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRVc2FnZSgpCi0JICovCi0JcHVibGljIGludCBnZXRVc2FnZSgpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXRVc2FnZSgpOwotCX0KLQotCXByaXZhdGUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRTZWxmKCkgewotCQlyZXR1cm4gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHNlbGY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxMGVhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnNzaS5TU0lDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICovCi1jbGFzcyBDTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0gZXh0ZW5kcyBDTU5vZGVCdWRkeVN5c3RlbSBpbXBsZW1lbnRzIENNRG9jdW1lbnQgewotCi0KLQlwcml2YXRlIHN0YXRpYyBDTURvY3VtZW50IGdldEhUTUxDTURvY3VtZW50KCkgewotCQlyZXR1cm4gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCX0KLQotCWNsYXNzIEVsZW1lbnRzIGV4dGVuZHMgQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbSB7Ci0JCXB1YmxpYyBFbGVtZW50cyhDTU5hbWVkTm9kZU1hcCBlbGVtZW50cywgYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCQlzdXBlcihpc1hIVE1MKTsKLQkJCW1ha2VCdWRkeVN5c3RlbShlbGVtZW50cyk7Ci0JCQlhZGRTU0lEZWNscygpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRLZXlOYW1lKENNTm9kZSBvcmlnaW5hbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXREZWNsKG9yaWdpbmFsKTsKLQkJCWlmIChlZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGVkZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZUJ1ZGR5U3lzdGVtKENNTm9kZSBvcmlnaW5hbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXREZWNsKG9yaWdpbmFsKTsKLQkJCXJldHVybiBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbShlZGVjbCwgaXNYSFRNTCgpKTsKLQkJfQotCi0JCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbChDTU5vZGUgY21ub2RlKSB7Ci0JCQlpZiAoY21ub2RlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbW5vZGU7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkU1NJRGVjbHMoKSB7Ci0JCQlDTURvY3VtZW50IHNzaSA9IFNTSUNNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoKTsKLQkJCWlmIChzc2kgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IHNzaS5nZXRFbGVtZW50cygpOwotCQkJSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlwdXQoZGVjbC5nZXRFbGVtZW50TmFtZSgpLCBkZWNsKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgRWxlbWVudHMgZWxlbWVudHMgPSBudWxsOwotCi0JcHVibGljIENNRG9jdW1lbnRGb3JCdWRkeVN5c3RlbShDTURvY3VtZW50IHNlbGYsIGJvb2xlYW4gaXNYSFRNTCkgewotCQlzdXBlcihzZWxmLCBnZXRIVE1MQ01Eb2N1bWVudCgpLCBpc1hIVE1MKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Eb2N1bWVudCNnZXRFbGVtZW50cygpCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkKLQkJCXJldHVybiBlbGVtZW50czsKLQkJQ01Eb2N1bWVudCBjbWRvYyA9IGdldFNlbGYoKTsKLQkJaWYgKGNtZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxlbWVudHMgPSBuZXcgRWxlbWVudHMoY21kb2MuZ2V0RWxlbWVudHMoKSwgaXNYSFRNTCk7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Eb2N1bWVudCNnZXRFbnRpdGllcygpCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlDTURvY3VtZW50IGNtZG9jID0gZ2V0U2VsZigpOwotCQlpZiAoY21kb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY21kb2MuZ2V0RW50aXRpZXMoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Eb2N1bWVudCNnZXROYW1lc3BhY2UoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCUNNRG9jdW1lbnQgY21kb2MgPSBnZXRTZWxmKCk7Ci0JCWlmIChjbWRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBjbWRvYy5nZXROYW1lc3BhY2UoKTsKLQl9Ci0KLQlwcml2YXRlIENNRG9jdW1lbnQgZ2V0U2VsZigpIHsKLQkJaWYgKHNlbGYuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuRE9DVU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTURvY3VtZW50KSBzZWxmOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzNGRiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICovCi1jbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0KLQotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgaHRtbGNtID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0SFRNTENNRWxlbURlY2woQ01FbGVtZW50RGVjbGFyYXRpb24gb3JpZ2luYWwpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gYnVkZHkgPSBudWxsOwotCQlpZiAoaHRtbGNtICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1zID0gaHRtbGNtLmdldEVsZW1lbnRzKCk7Ci0JCQlpZiAoZWxlbXMgIT0gbnVsbCkgewotCQkJCWJ1ZGR5ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtcy5nZXROYW1lZEl0ZW0ob3JpZ2luYWwuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZGR5OwotCX0KLQotCXByaXZhdGUgY2xhc3MgQXR0cnMgZXh0ZW5kcyBDTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtIHsKLQkJcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcCBidWRkeUF0dHJzID0gbnVsbDsKLQotCQlwdWJsaWMgQXR0cnMoQ01OYW1lZE5vZGVNYXAgYXR0cnMsIENNTmFtZWROb2RlTWFwIGJ1ZGR5QXR0cnMsIGJvb2xlYW4gaXNYSFRNTCkgewotCQkJc3VwZXIoaXNYSFRNTCk7Ci0JCQl0aGlzLmJ1ZGR5QXR0cnMgPSBidWRkeUF0dHJzOwotCQkJbWFrZUJ1ZGR5U3lzdGVtKGF0dHJzKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlY2wgPSBnZXREZWNsKG9yaWdpbmFsKTsKLQkJCWlmIChhZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGFkZWNsLmdldEF0dHJOYW1lKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZUJ1ZGR5U3lzdGVtKENNTm9kZSBvcmlnaW5hbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjbCA9IGdldERlY2wob3JpZ2luYWwpOwotCQkJaWYgKGFkZWNsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGJ1ZGR5ID0gbnVsbDsKLQkJCWlmIChidWRkeUF0dHJzICE9IG51bGwpIHsKLQkJCQlidWRkeSA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBidWRkeUF0dHJzLmdldE5hbWVkSXRlbShhZGVjbC5nZXRBdHRyTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtKGFkZWNsLCBidWRkeSwgaXNYSFRNTCgpKTsKLQkJfQotCi0JCXByaXZhdGUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsKENNTm9kZSBjbW5vZGUpIHsKLQkJCWlmIChjbW5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEF0dHJzIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0oQ01FbGVtZW50RGVjbGFyYXRpb24gc2VsZiwgYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKHNlbGYsIGdldEhUTUxDTUVsZW1EZWNsKHNlbGYpLCBpc1hIVE1MKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01FbGVtZW50RGVjbGFyYXRpb24jZ2V0QXR0cmlidXRlcygpCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm4gYXR0cmlidXRlczsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGh0bWxEZWNsID0gZ2V0QnVkZHkoKTsKLQkJQ01OYW1lZE5vZGVNYXAgaHRtbEF0dHJzID0gKGh0bWxEZWNsID09IG51bGwpID8gbnVsbCA6IGh0bWxEZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJYXR0cmlidXRlcyA9IG5ldyBBdHRycyhlZGVjbC5nZXRBdHRyaWJ1dGVzKCksIGh0bWxBdHRycywgaXNYSFRNTCk7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb250ZW50KCkKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWRlY2wuZ2V0Q29udGVudCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb250ZW50VHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkFOWTsKLQkJcmV0dXJuIGVkZWNsLmdldENvbnRlbnRUeXBlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRWxlbWVudERlY2xhcmF0aW9uI2dldEVsZW1lbnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCA9IGdldFNlbGYoKTsKLQkJaWYgKGVkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVkZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRWxlbWVudERlY2xhcmF0aW9uI2dldERhdGFUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlZGVjbC5nZXREYXRhVHlwZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRMb2NhbEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlZGVjbC5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQ29udGVudCNnZXRNYXhPY2N1cigpCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gZWRlY2wuZ2V0TWF4T2NjdXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Db250ZW50I2dldE1pbk9jY3VyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCA9IGdldFNlbGYoKTsKLQkJaWYgKGVkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiBlZGVjbC5nZXRNaW5PY2N1cigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjc3VwcG9ydHMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKGlzWEhUTUwgJiYgcHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChpc1hIVE1MICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKQotCQkJcmV0dXJuIEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfTk9ORTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRTZWxmKCkgewotCQlpZiAoc2VsZi5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHNlbGY7Ci0JfQotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRCdWRkeSgpIHsKLQkJaWYgKGJ1ZGR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGJ1ZGR5LmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTUVsZW1lbnREZWNsYXJhdGlvbikgYnVkZHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjU4NGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbS4KLQkgKiBDQVVUSU9OOiBFYWNoIGRlcml2ZWQgY2xhc3MgbXVzdCBjYWxsICdtYWtlQnVkZHlTeXN0ZW0nIG1ldGhvZCBpbiBpdHMKLQkgKiBjb25zdHJ1Y3RvciB0byBidWlsZCB1cCBpdHMgY29udGVudHMuCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0oYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXNYSFRNTCA9IGlzWEhUTUw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTmFtZWROb2RlTWFwI2dldExlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBtYXAuc2l6ZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5hbWVkTm9kZU1hcCNnZXROYW1lZEl0ZW0oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBrZXkgPSBjYW5vbmljYWxOYW1lKG5hbWUpOwotCQlpZiAoIW1hcC5jb250YWluc0tleShrZXkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBtYXAuZ2V0KGtleSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTmFtZWROb2RlTWFwI2l0ZW0oaW50KQotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmICgtLWluZGV4IDwgMCkKLQkJCQlyZXR1cm4gKENNTm9kZSkgbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01OYW1lZE5vZGVNYXAjaXRlcmF0b3IoKQotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qIHBhY2thZ2Ugc2NvcGUuICovCi0Jdm9pZCBwdXQoU3RyaW5nIG5hbWUsIENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBjbW5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbWFwLnB1dChjYW5vbmljYWxOYW1lKG5hbWUpLCBjbW5vZGUpOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIENNTm9kZSBjcmVhdGVCdWRkeVN5c3RlbShDTU5vZGUgb3JpZ2luYWwpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYSFRNTCgpIHsKLQkJcmV0dXJuIGlzWEhUTUw7Ci0JfQotCi0JLyoqCi0JICogRWFjaCBkZXJpdmVkIGNsYXNzIG11c3QgY2FsbCB0aGlzIG1ldGhvZCBpbiBpdHMgY29uc3RydWN0b3IKLQkgKiB0byBidWlsZCB1cCBpdHMgY29udGVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUJ1ZGR5U3lzdGVtKENNTmFtZWROb2RlTWFwIG9yaWdpbmFsKSB7Ci0JCUl0ZXJhdG9yIGkgPSBvcmlnaW5hbC5pdGVyYXRvcigpOwotCQlpZiAoaSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNNTm9kZSBvcmcgPSAoQ01Ob2RlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSBnZXRLZXlOYW1lKG9yZyk7Ci0JCQlDTU5vZGUgbmV3Tm9kZSA9IGNyZWF0ZUJ1ZGR5U3lzdGVtKG9yZyk7Ci0JCQlwdXQoa2V5LCBuZXdOb2RlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNhbm9uaWNhbE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJLy8gc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzE5MTgKLQkJLy8gd2UgYXJlIGFibGUgdG8gImNoZWF0IiBoZXJlIGEgbGl0dGxlIGFuZCB1c2UgVVMgTG9jYWxlCi0JCS8vIHRvIGdldCBhIGdvb2QgY2Fub25pY2FsIGZvcm0sIHNpbmNlIHdlIGFyZSB1c2luZyB0aGlzIG9ubHkKLQkJLy8gZm9yIEhUTUwgYW5kIEpTUCBzdGFuZGFyZCB0YWdzLgotCQkvLyBMb25nIHRlcm0sIGZvciBzaW1pbGFyIG5lZWRzIHdpdGggWE1MIDEuMSAoZm9yIGV4YW1wbGUpCi0JCS8vIHdlIHNob3VsZCB1c2UgYSBjbGFzcyBzdWNoIGFzIGNvbS5pYm0uaWN1LnRleHQuTm9ybWFsaXplcgotCQlyZXR1cm4gbmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTm9kZUJ1ZGR5U3lzdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTU5vZGVCdWRkeVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjgyZjlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTm9kZUJ1ZGR5U3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqLwotY2xhc3MgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTU5vZGUgewotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JcHJvdGVjdGVkIENNTm9kZSBzZWxmID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Ob2RlIGJ1ZGR5ID0gbnVsbDsKLQotCXB1YmxpYyBDTU5vZGVCdWRkeVN5c3RlbShDTU5vZGUgc2VsZiwgQ01Ob2RlIGJ1ZGR5LCBib29sZWFuIGlzWEhUTUwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZWxmID0gc2VsZjsKLQkJdGhpcy5idWRkeSA9IGJ1ZGR5OwotCQl0aGlzLmlzWEhUTUwgPSBpc1hIVE1MOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjZ2V0Tm9kZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBzZWxmLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXROb2RlVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIHNlbGYuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Ob2RlI3N1cHBvcnRzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYnVkZHkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGJ1ZGR5LnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKCFpc1hIVE1MKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGlzWEhUTUwpOwotCQl9Ci0KLQkJaWYgKGJ1ZGR5ID09IG51bGwgfHwgKCFidWRkeS5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVkZHkuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Eb2N1bWVudFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Eb2N1bWVudFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkODAyZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5SYW5nZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRRdWVyeSB7Ci0KLQkvKioKLQkgKiBpc1JlbmRlclJvb3QoKSByZXR1cm5zIHRydWUgaWYgLSBub2RlIGlzIEJPRFkgZWxlbWVudCAoYm90aCBleHBsaWNpdAotCSAqIGFuZCBpbXBsaWNpdCkgLSBub2RlIGlzIHBvcnRhbGh0bWw6Ym9keSBlbGVtZW50IC0gbm9kZSBpcyBEb2N1bWVudCBub2RlCi0JICogYW5kIHRoZSBkb2N1bWVudCBpcyB0cmVhdGVkIGFzIGZyYWdtZW50ICh3aXRoIEJPRFkgY29udGV4dCkgTm90ZSB0aGF0Ci0JICogaW4gZWRpdGluZyBhIGZyYWdtZW50IGZpbGUsIERvY3VtZW50IG5vZGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYQotCSAqIHN1YnN0aXR1dGUgb2YgQk9EWSBlbGVtZW50LgotCSAqLwotCWJvb2xlYW4gaXNSZW5kZXJSb290KE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBpc0hlYWRDb3JyZXNwb25kZW50KCkgcmV0dXJucyB0cnVlIGlmIC0gbm9kZSBpcyBIRUFEIGVsZW1lbnQgKGJvdGgKLQkgKiBleHBsaWNpdCBhbmQgaW1wbGljaXQpIC0gbm9kZSBpcyBwb3J0YWxodG1sOmhlYWQgZWxlbWVudCAtIG5vZGUgaXMKLQkgKiBEb2N1bWVudCBub2RlIGFuZCB0aGUgZG9jdW1lbnQgaXMgdHJlYXRlZCBhcyBmcmFnbWVudCAod2l0aCBIRUFECi0JICogY29udGV4dCkgTm90ZSB0aGF0IGluIGVkaXRpbmcgYSBmcmFnbWVudCBmaWxlICh3aXRoIEhFQUQgY29udGV4dCksCi0JICogRG9jdW1lbnQgbm9kZSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHN1YnN0aXR1dGUgb2YgSEVBRCBlbGVtZW50LgotCSAqLwotCWJvb2xlYW4gaXNIZWFkQ29ycmVzcG9uZGVudChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSW1wbGljaXQgQk9EWSBlbGVtZW50IHdpbGwgYmUgZ29uZSBpbiBWNiBTRUQgbW9kZWwuIFNvIHBhZ2UgZGVzaWduZXIKLQkgKiBwcm92aWRlcyBhbiBBUEkgdG8gZ2V0IGEgcmFuZ2Ugd2hvc2UgY29udGVudCBub2RlcyBhcmUgcmVuZGVyZWQgaW4KLQkgKiBkZXNpZ24gdmlldy4gZ2V0UmVuZGVyUm9vdFJhbmdlKCkgcmV0dXJucyAtIGEgcmFuZ2UgZnJvbSBCT0RZJ3MgZmlyc3QKLQkgKiB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGhhcyBCT0RZIGVsZW1lbnQpIC0gYSByYW5nZSBmb3JtCi0JICogRG9jdW1lbnQncyBmaXJzdCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWQotCSAqIGNvbnRleHQpIC0gbnVsbCAoaWYgdGhlIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggSEVBRCBjb250ZXh0KSBbVGhlCi0JICogZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkIHNpbmNlIFY2XSAtIGEgcmFuZ2UgZnJvbSBhIGN1c3RvbQotCSAqIHRhZydzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaGFzIGEgY3VzdG9tIHRhZyB3aGljaAotCSAqIGdlbmVyYXRlcyBCT0RZIGVsZW1lbnQgYXQgcnVudGltZSkgLSBhIHJhbmdlIGZyb20gRG9jdW1lbnQncwotCSAqIGFwcHJvcGlyYXRlIG9mZnNldCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgZXhwbGljaXQKLQkgKiBCT0RZL0hUTUwpIC0gYSByYW5nZSBmcm9tIEhUTUwgZWxlbWVudCdzIGFwcHJvcHJpYXRlIG9mZnNldCB0byBpdHMgbGFzdAotCSAqIChpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdCBCT0RZIGJ1dCBoYXZlIGV4cGxpY2l0IEhUTUwpCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlSYW5nZSBnZXRSZW5kZXJSb290UmFuZ2UoRG9jdW1lbnQgZG9jKTsKLQotCS8qKgotCSAqIEltcGxpY2l0IEhFQUQgZWxlbWVudCB3aWxsIGJlIGdvbmUgaW4gVjYgU0VEIG1vZGVsLiBTbyBwYWdlIGRlc2lnbmVyCi0JICogcHJvdmlkZXMgYW4gQVBJIHRvIGdldCBhIHJhbmdlIHdob3NlIGNvbnRlbnQgbm9kZXMgYXJlIHRyZWF0ZWQgYXMgSEVBRAotCSAqIGVsZW1lbnQncyBjaGlsZC4gZ2V0SGVhZENvcnJlc3BvbmRlbnRSYW5nZSgpIHJldHVybnMgLSBhIHJhbmdlIGZyb20KLQkgKiBIRUFEJ3MgZmlyc3QgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBoYXMgSEVBRCBlbGVtZW50KSAtIGEgcmFuZ2UKLQkgKiBmb3JtIERvY3VtZW50J3MgZmlyc3QgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoCi0JICogSEVBRCBjb250ZXh0KSAtIG51bGwgKGlmIHRoZSBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEJPRFkgY29udGV4dCkKLQkgKiBbVGhlIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBzaW5jZSBWNl0gLSBhIHJhbmdlIGZyb20gYQotCSAqIGN1c3RvbSB0YWcncyBmaXJzdCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGhhcyBhIGN1c3RvbSB0YWcgd2hpY2gKLQkgKiBnZW5lcmF0ZXMgSEVBRCBlbGVtZW50IGF0IHJ1bnRpbWUpIC0gYSByYW5nZSBmcm9tIERvY3VtZW50J3MgZmlyc3QgdG8KLQkgKiBhcHByb3BpcmF0ZSBvZmZzZXQgKGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0IEhFQUQvSFRNTCkgLQotCSAqIGEgcmFuZ2UgZnJvbSBIVE1MIGVsZW1lbnQncyBmaXJzdCB0byBhcHByb3ByaWF0ZSBvZmZzZXQgKGlmIHRoZQotCSAqIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgZXhwbGljaXQgSEVBRCBidXQgaGF2ZSBleHBsaWNpdCBIVE1MKQotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JUmFuZ2UgZ2V0SGVhZENvcnJlc3BvbmRlbnRSYW5nZShEb2N1bWVudCBkb2MpOwotCi0JLyoqCi0JICogZ2V0UmVuZGVyUm9vdE5vZGUoKSB3aXRoIFtjcmVhdGU9ZmFsc2VdIHJldHVybnMgLSBCT0RZIGVsZW1lbnQgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgaGFzIEJPRFkgZWxlbWVudCAtIG51bGwgaWYgdGhpcyBkb2N1bWVudAotCSAqIGlzIG5vdCBmcmFnbWVudCBhbmQgZG9lcyBub3QgaGF2ZSBCT0RZIGVsZW1lbnQgLSBEb2N1bWVudCBub2RlIGlmIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEJPRFkgY29udGV4dCAtIG51bGwgaWYgdGhpcyBkb2N1bWVudCBpcwotCSAqIGZyYWdtZW50IHdpdGggSEVBRCBjb250ZXh0IFtUaGUgZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkIHNpbmNlCi0JICogVjZdIC0gYSBjdXN0b20gdGFnIHdoaWNoIGdlbmVyYXRlcyBCT0RZIHRhZyBhdCBydW50aW1lIC0gRG9jdW1lbnQgbm9kZQotCSAqIG9yIEhUTUwgZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZQotCSAqIGV4cGxpY2l0IEJPRFkgZWxlbWVudCBnZXRSZW5kZXJSb290Tm9kZSgpIHdpdGggW2NyZWF0ZT10cnVlXSByZXR1cm5zIC0KLQkgKiBCT0RZIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYW5kIGhhcyBCT0RZIGVsZW1lbnQgKG5vCi0JICogbW9kaWZpY3RhdGlvbikgLSBuZXdseSBjcmVhdGVkIEJPRFkgZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdAotCSAqIGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlIEJPRFkgZWxlbWVudCAtIERvY3VtZW50IG5vZGUgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0IChubyBtb2RpZmljdGF0aW9uKSBbVGhlCi0JICogZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkIHNpbmNlIFY2XSAtIGEgY3VzdG9tIHRhZyB3aGljaAotCSAqIGdlbmVyYXRlcyBCT0RZIHRhZyBhdCBydW50aW1lIChubyBtb2RpZmljdGF0aW9uKSAtIG5ld2x5IGNyZWF0ZWQgQk9EWQotCSAqIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYnV0IGRvZXMgbm90IGhhdmUgZXhwbGljaXQKLQkgKiBCT0RZIGVsZW1lbnQgZ2V0UmVuZGVyUm9vdE5vZGUoKSB0aHJvd3MgSFRNTENvbW1hbmRFeGNlcHRpb24gKHNpbmNlIFY2KQotCSAqIGlmIC0gdGhpcyBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCBhbmQgLSAiY3JlYXRlIgotCSAqIHBhcmFtZXRlciBpcyB0cnVlIE5vdGUgdGhhdCBpbiBlZGl0aW5nIGEgZnJhZ21lbnQgZmlsZSwgRG9jdW1lbnQgbm9kZQotCSAqIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3Vic3RpdHV0ZSBvZiBCT0RZIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNoaWxkT3JEb2N1bWVudAotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiBAcmV0dXJuCi0JICovCi0JTm9kZSBnZXRSZW5kZXJSb290Tm9kZShOb2RlIGNoaWxkT3JEb2N1bWVudCwgYm9vbGVhbiBjcmVhdGUpOwotCi0JLyoqCi0JICogZ2V0SGVhZENvcnJlc3BvbmRlbnROb2RlKCkgd2l0aCBbY3JlYXRlPWZhbHNlXSByZXR1cm5zIC0gSEVBRCBlbGVtZW50Ci0JICogaWYgdGhpcyBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYW5kIGhhcyBIRUFEIGVsZW1lbnQgLSBudWxsIGlmIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYW5kIGRvZXMgbm90IGhhdmUgSEVBRCBlbGVtZW50IC0gRG9jdW1lbnQgbm9kZQotCSAqIGlmIHRoaXMgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBIRUFEIGNvbnRleHQgLSBudWxsIGlmIHRoaXMgZG9jdW1lbnQKLQkgKiBpcyBmcmFnbWVudCB3aXRoIEJPRFkgY29udGV4dCBbVGhlIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZAotCSAqIHNpbmNlIFY2XSAtIGEgY3VzdG9tIHRhZyB3aGljaCBnZW5lcmF0ZXMgSEVBRCB0YWcgYXQgcnVudGltZSAtIERvY3VtZW50Ci0JICogbm9kZSBvciBIVE1MIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYnV0IGRvZXMgbm90IGhhdmUKLQkgKiBleHBsaWNpdCBIRUFEIGVsZW1lbnQgZ2V0SGVhZENvcnJlc3BvbmRlbnROb2RlKCkgd2l0aCBbY3JlYXRlPXRydWVdCi0JICogcmV0dXJucyAtIEhFQUQgZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgaGFzIEhFQUQKLQkgKiBlbGVtZW50IChubyBtb2RpZmljdGF0aW9uKSAtIG5ld2x5IGNyZWF0ZWQgSEVBRCBlbGVtZW50IGlmIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYnV0IGRvZXMgbm90IGhhdmUgSEVBRCBlbGVtZW50IC0gRG9jdW1lbnQgbm9kZQotCSAqIGlmIHRoaXMgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBIRUFEIGNvbnRleHQgKG5vIG1vZGlmaWN0YXRpb24pIFtUaGUKLQkgKiBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UgVjZdIC0gYSBjdXN0b20gdGFnIHdoaWNoCi0JICogZ2VuZXJhdGVzIEhFQUQgdGFnIGF0IHJ1bnRpbWUgKG5vIG1vZGlmaWN0YXRpb24pIC0gbmV3bHkgY3JlYXRlZCBIRUFECi0JICogZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdAotCSAqIEhFQUQgZWxlbWVudCBnZXRIZWFkQ29ycmVzcG9uZGVudE5vZGUoKSB0aHJvd3MgSFRNTENvbW1hbmRFeGNlcHRpb24KLQkgKiAoc2luY2UgVjYpIGlmIC0gdGhpcyBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEJPRFkgY29udGV4dCBhbmQgLQotCSAqICJjcmVhdGUiIHBhcmFtZXRlciBpcyB0cnVlIE5vdGUgdGhhdCBpbiBlZGl0aW5nIGEgZnJhZ21lbnQgZmlsZSwKLQkgKiBEb2N1bWVudCBub2RlIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3Vic3RpdHV0ZSBvZiBIRUFEIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNoaWxkT3JEb2N1bWVudAotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiBAcmV0dXJuCi0JICovCi0JTm9kZSBnZXRIZWFkQ29ycmVzcG9uZGVudE5vZGUoTm9kZSBjaGlsZE9yRG9jdW1lbnQsIGJvb2xlYW4gY3JlYXRlKTsKLQotCS8qKgotCSAqIGdldEh0bWxDb3JyZXNwb25kZW50Tm9kZSgpIHRocm93cyBIVE1MQ29tbWFuZEV4Y2VwdGlvbiAoc2luY2UgVjYpIGlmIC0KLQkgKiB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IGFuZCAiY3JlYXRlIiBwYXJhbWV0ZXIgaXMgdHJ1ZQotCSAqIAotCSAqIEBwYXJhbSBjaGlsZE9yRG9jdW1lbnQKLQkgKiBAcGFyYW0gY3JlYXRlCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgZ2V0SHRtbENvcnJlc3BvbmRlbnROb2RlKE5vZGUgY2hpbGRPckRvY3VtZW50LCBib29sZWFuIGNyZWF0ZSk7Ci0KLQkvKioKLQkgKiBUaGlzIGlubmVyIGNsYXNzIGlzIGludGVuZGVkIGZvciBpbnNlcnRpb24gdGFyZ2V0LiBwbGVhc2UgdXNlIHRoaXMgbGlrZQotCSAqIHRoZSBmb2xsb3dpbmcgOiBEb2N1bWVudFF1ZXJ5Lkluc2VydGlvblRhcmdldCBpbnM7Ci0JICogaW5zLmdldFBhcmVudCgpLmluc2VydEJlZm9yZSh5b3VJbnNlcnRpb25Ob2RlLCBpbnMuZ2V0UmVmKCkpOwotCSAqLwotCXB1YmxpYyBjbGFzcyBJbnNlcnRpb25UYXJnZXQgewotCQlwcml2YXRlIGZpbmFsIE5vZGUgcGFyZW50OwotCQlwcml2YXRlIGZpbmFsIE5vZGUgcmVmOwotCi0JCXB1YmxpYyBJbnNlcnRpb25UYXJnZXQoTm9kZSBwYXJlbnQsIE5vZGUgcmVmKSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMucmVmID0gcmVmOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldFJlZigpIHsKLQkJCXJldHVybiByZWY7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRIZWFkSW5zZXJ0aW9uVGFyZ2V0KCkgcmV0dXJucyBhcHByb3ByaWF0ZSBpbnNldGlvbiB0YXJnZXQgbG9jYXRpb24KLQkgKiBmb3IgSEVBRCBjaGlsZCB0YWdzIHN1Y2ggYXMgPHNjcmlwdD4sIDxzdHlsZT4sIDxtZXRhPmV0Yy4gQmFzaWNhbGx5Ci0JICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIDxIRUFEPnRhZydzIHRoZSBsYXN0IHBvc2l0aW9uLiBOb3RlIHRoYXQgdGhpcwotCSAqIHdvdWxkIG5vdCBjcmVhdGUgYWN0dWFsIDxIRUFEPnRhZyB3aGVuIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGl0LgotCSAqIDxIRUFEPmlzIG9taXR0YWJsZSB0YWcgc28gdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFwcHJvcHJpYXRlIHBvc2l0aW9uCi0JICogdG8gd2hpY2ggaW1wbGljaXQgPEhFQUQ+Y2FuIGJlIGluc2VydGVkLCBpZiB0aGUgZG9jdW1lbnQgaGFzIG5vCi0JICogPEhFQUQ+LgotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JSW5zZXJ0aW9uVGFyZ2V0IGdldEhlYWRJbnNlcnRpb25UYXJnZXQoRG9jdW1lbnQgZG9jKTsKLQotCS8qKgotCSAqIGdldFBhZ2VJbnNlcnRpb25UYXJnZXQoKSByZXR1cm5zIGFwcHJvcHJpYXRlIGluc2V0aW9uIHRhcmdldCBsb2NhdGlvbgotCSAqIGZvciBwYWdlLWxldmVsIG1hcmt1cHMsIHN1Y2ggYXMgSlNQIGRpcmVjdGl2ZXMsIHVzZWJlYW4gdGFncyBvciA8aHRtbD4KLQkgKiB0YWcuIEJhc2ljYWxseSB0aGlzIGZ1bmN0aW9uIHJldHVybnMganVzdCBiZWZvcmUgPEhUTUw+dGFnLiBOb3RlIHRoYXQKLQkgKiB0aGlzIHdvdWxkIG5vdCBjcmVhdGUgYWN0dWFsIDxIVE1MPnRhZyB3aGVuIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBoYXZlCi0JICogaXQuIEluIHN1Y2ggY2FzZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9zaXRpb24ganVzdCBiZWZvcmUgdGhlCi0JICogbWVhbmluZ2Z1bCB0YWdzIHN1Y2ggYXMgSFRNTC9KU1AgZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlJbnNlcnRpb25UYXJnZXQgZ2V0UGFnZUluc2VydGlvblRhcmdldChEb2N1bWVudCBkb2MpOwotCi0JLyoqCi0JICogaXNGcmFnbWVudCgpIHJldHVybnMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgb3IgY29tcGxldGUKLQkgKiBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc0ZyYWdtZW50KERvY3VtZW50IGRvYyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlZTI5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1OGZiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyOwotCQlhZGFwdGVyID0gbmV3IEhUTUxFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCW5vdGlmaWVyLmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIGNvcHkgbWV0aG9kCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSE1RVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSE1RVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzdhZDA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hNUVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSE1RVXRpbCB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBWZWN0b3IgbnVsbFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQotCS8qIEhNUVV0aWwgY2xhc3MgbXVzdCBub3QgaW5zdGFudGlhdGUuICovCi0JcHJpdmF0ZSBITVFVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIGdhdGhlciBhbGwgZWxlbWVudCBkZWNsYXJhdGlvbnMgaW4gaW5jbHVzaW9uIG9mIGVhY2ggcGFyZW50IG9mIHRoZSB0YXJnZXQuIAotCSAqIHRoZSBpbmNsdXNpb24gb2YgdGhlIHRhcmdldCBpcyBhbHNvIGdhdGhlcmVkLiAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRJbmNsdXNpb25zKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsVmVjdG9yOwotCQlDb2xsZWN0aW9uIGluY2x1c2lvbnMgPSBnYXRoZXJJbmNsdXNpb25zKGdldEFuY2VzdG9yRGVjbGFyYXRpb25zKHRhcmdldCkpOwotCi0JCUhhc2h0YWJsZSBhdmFpbGFibGVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlJdGVyYXRvciBpdGVyID0gaW5jbHVzaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNNQ29udGVudCBpbmNsdXNpb24gPSAoQ01Db250ZW50KSBpdGVyLm5leHQoKTsKLQkJCXN3aXRjaCAoaW5jbHVzaW9uLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIENNTm9kZS5HUk9VUCA6Ci0JCQkJCWV4dHJhY3REZWNsYXJhdGlvbnMoYXZhaWxhYmxlcywgKENNR3JvdXApIGluY2x1c2lvbik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOgotCQkJCQlhZGRJbmNsdXNpb24oYXZhaWxhYmxlcywgKENNRWxlbWVudERlY2xhcmF0aW9uKSBpbmNsdXNpb24pOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhdmFpbGFibGVzLnZhbHVlcygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0QW5jZXN0b3JEZWNsYXJhdGlvbnMoRWxlbWVudCB0YXJnZXQpIHsKLQkJVmVjdG9yIGFuY2VzdG9ycyA9IG5ldyBWZWN0b3IoKTsKLQotCQlEb2N1bWVudCBkb2MgPSB0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2MpOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gcXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJYW5jZXN0b3JzLmFkZChkZWNsKTsKLQotCQlFbGVtZW50IHBhcmVudCA9IGdldFBhcmVudCh0YXJnZXQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWRlY2wgPSBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkKLQkJCQlhbmNlc3RvcnMuYWRkKGRlY2wpOwotCQkJcGFyZW50ID0gZ2V0UGFyZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIGFuY2VzdG9yczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEluY2x1c2lvbihIYXNodGFibGUgYXZhaWxhYmxlcywgQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlTdHJpbmcgbmFtZSA9IGRlY2wuZ2V0RWxlbWVudE5hbWUoKTsKLQkJaWYgKGF2YWlsYWJsZXMuY29udGFpbnNLZXkobmFtZSkpCi0JCQlyZXR1cm47Ci0JCWF2YWlsYWJsZXMucHV0KG5hbWUsIGRlY2wpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2F0aGVySW5jbHVzaW9ucyhDb2xsZWN0aW9uIGFuY2VzdG9ycykgewotCQlWZWN0b3IgaW5jbHVzaW9ucyA9IG5ldyBWZWN0b3IoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGFuY2VzdG9ycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5JTkNMVVNJT04pKSB7Ci0JCQkJQ01Db250ZW50IGluY2x1c2lvbiA9IChDTUNvbnRlbnQpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JTkNMVVNJT04pOwotCQkJCWlmIChpbmNsdXNpb24gIT0gbnVsbCkKLQkJCQkJaW5jbHVzaW9ucy5hZGQoaW5jbHVzaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5jbHVzaW9uczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50IGdldFBhcmVudChOb2RlIHRhcmdldCkgewotCQlOb2RlIHBhcmVudCA9IHRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybiAoRWxlbWVudCkgcGFyZW50OwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGV4dHJhY3REZWNsYXJhdGlvbnMoSGFzaHRhYmxlIGF2YWlsYWJsZXMsIENNR3JvdXAgZ3JvdXApIHsKLQkJQ01Ob2RlTGlzdCBjb250ZW50ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnQuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJQ01Ob2RlIGNtbiA9IGNvbnRlbnQuaXRlbShpKTsKLQkJCWlmIChjbW4gPT0gbnVsbCB8fCBjbW4uZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLQkJCQljb250aW51ZTsKLQkJCWFkZEluY2x1c2lvbihhdmFpbGFibGVzLCAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNtbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmMDI4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGltcGxlbWVudHMgRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciB7Ci0KLQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkN2ZiYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWxRdWVyeUNNUHJvdmlkZXIgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyCi0JICovCi0JcHVibGljIEhUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIobmV3IEhUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlcihjYWNoZSwgaWRSZXNvbHZlcikpOwotCX0KLQotCS8vIE1JV0E6IFdlIGNhbm5vdCBjYWNoZSBhIENNRWxlbWVudERlY2xhcmF0aW9uIGFueSBtb3JlLiAgQmVjYXVzZSwgd2hlbiB0aGUgRE9DVFlQRQotCS8vIHdhcyBjaGFuZ2VkLCBDTURvY3VtZW50IHdvdWxkIGJlIGNoYW5nZWQuICBUaGVuLCBhIGNhY2hlZCBDTUVsZW1lbnREZWNsYXJhdGlvbgotCS8vIHdvdWxkIGJlIGludmFsaWQuICBJZiBzb21lIHBlcmZvcm1hbmNlIHByb2JsZW1zIG9jY3Vycywgd2UgY29uc2lkZXIgYSBzbWFydGVyCi0JLy8gY2FjaGUgbWVjaGFuaXNtLgotCS8vCi0JLy8JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCS8vCQkvLyBjaGVjayBpZiBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGNhY2hlZAotCS8vCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGVsZW1lbnQ7Ci0JLy8JCUVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JLy8JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JLy8JCQlyZXR1cm4gYWRhcHRlci5nZXREZWNsYXJhdGlvbigpOwotCS8vCi0JLy8JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBzdXBlci5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkvLwotCS8vCQkvLyBjYWNoZSBIVE1MIGVsZW1lbnQgZGVjbGFyYXRpb24gb25seQotCS8vCQlpZiAoZGVjbCAhPSBudWxsICYmIGRlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JLy8JCQlJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JLy8JCQlhZGFwdGVyID0gKEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQobm90aWZpZXIpOwotCS8vCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkvLwkJCQlhZGFwdGVyLnNldERlY2xhcmF0aW9uKGRlY2wpOwotCS8vCQl9Ci0JLy8KLQkvLwkJcmV0dXJuIGRlY2w7Ci0JLy8JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlNmQzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUNNUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIENNRG9jdW1lbnQgcHJvdmlkZXIgZm9yIEhUTUwgYW5kIFhIVE1MIGRvY3VtZW50cy4KLSAqIAotICogVGhpcyBhZGRlZCBhbmQvb3IgbWFkZSBwdWJsaWMgc3BlY2lmaWNhbGx5IGZvciBleHBlcmltZW50YXRpb24uIEl0IHdpbGwKLSAqIGNoYW5nZSBhcyB0aGlzIGZ1bmN0aW9uYWxpdHkgYmVjb21lcyBBUEkuIFNlZQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTA4NAotICovCi0KLQotcHVibGljIGNsYXNzIEhUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlciBpbXBsZW1lbnRzIE1vZGVsUXVlcnlDTVByb3ZpZGVyIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBzdGF0aWNIVE1MID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgc3RhdGljQ0hUTUwgPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuQ0hUTUxfRE9DX1RZUEUpOwotCXByaXZhdGUgc3RhdGljIEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSBkb2N0eXBlUmVnaXN0cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgYnVkZHlDYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByaXZhdGUgWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyIHhodG1sYXNzb2MgPSBudWxsOwotCi0JcHVibGljIEhUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIoKTsKLQkJeGh0bWxhc3NvYyA9IG5ldyBYSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIoY2FjaGUsIGlkUmVzb2x2ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIENNRG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgRE9NIE5vZGUuIG9yIG51bGwgaWYgbm8KLQkgKiBDTURvY3VtZW50IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKSB7Ci0JCUlET01Eb2N1bWVudCBvd25lciA9IGdldE93bmVyWE1MRG9jdW1lbnQobm9kZSk7Ci0JCWlmIChvd25lciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHBpZCA9IGdldFB1YmxpY0lkKG93bmVyKTsKLQkJaWYgKHBpZCA9PSBudWxsKQotCQkJcmV0dXJuIHN0YXRpY0hUTUw7Ci0KLQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gZG9jdHlwZVJlZ2lzdHJ5LmdldEVudHJ5KHBpZCk7Ci0JCWlmIChlbnRyeSA9PSBudWxsKQotCQkJcmV0dXJuIHN0YXRpY0hUTUw7Ci0JCQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUxMDAwIC0gdXNlIGludGVybmFsIGNvbnRlbnQgbW9kZWwKLQkJaWYgKGVudHJ5LnVzZUludGVybmFsTW9kZWwoKSkgewotCQkJaWYgKHBpZCAhPSBudWxsICYmIHBpZC5lcXVhbHMoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkNIVE1MX1BVQkxJQ19JRCkpIHsKLQkJCQlyZXR1cm4gc3RhdGljQ0hUTUw7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdGljSFRNTDsKLQkJfQotCi0JCXBpZCA9IGVudHJ5LmdldFB1YmxpY0lkKCk7Ci0JCVN0cmluZyBzaWQgPSBlbnRyeS5nZXRTeXN0ZW1JZCgpOwotCi0JCUNNRG9jdW1lbnQgZHRkY20gPSB4aHRtbGFzc29jLmdldFhIVE1MQ01Eb2N1bWVudChwaWQsIHNpZCk7Ci0JCWlmIChkdGRjbSA9PSBudWxsKSB7Ci0JCQlpZiAocGlkICE9IG51bGwgJiYgcGlkLmVxdWFscyhIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuQ0hUTUxfUFVCTElDX0lEKSkgewotCQkJCXJldHVybiBzdGF0aWNDSFRNTDsKLQkJCX0KLQkJCXJldHVybiBzdGF0aWNIVE1MOwotCQl9Ci0KLQkJU3RyaW5nIGdyYW1tYXJVUkkgPSB4aHRtbGFzc29jLmdldENhY2hlZEdyYW1tZXJVUkkoKTsKLQkJQ01Eb2N1bWVudCBidWRkeWNtID0gKENNRG9jdW1lbnQpIGJ1ZGR5Q2FjaGUuZ2V0KGdyYW1tYXJVUkkpOwotCQlpZiAoYnVkZHljbSAhPSBudWxsKQotCQkJcmV0dXJuIGJ1ZGR5Y207Ci0KLQkJYnVkZHljbSA9IG5ldyBDTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0oZHRkY20sIGVudHJ5LmlzWE1MVHlwZSgpKTsKLQkJYnVkZHlDYWNoZS5wdXQoZ3JhbW1hclVSSSwgYnVkZHljbSk7Ci0JCXJldHVybiBidWRkeWNtOwotCX0KLQotCS8vIHByaXZhdGUgbWV0aG9kcwotCXByaXZhdGUgSURPTURvY3VtZW50IGdldE93bmVyWE1MRG9jdW1lbnQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnQgb3duZXIgPSAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyAoRG9jdW1lbnQpIG5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKG93bmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEob3duZXIgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSURPTURvY3VtZW50KSBvd25lcjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQdWJsaWNJZChJRE9NRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGRvYy5nZXREb2N0eXBlKCk7Ci0JCXJldHVybiAoZG9jdHlwZSAhPSBudWxsKSA/IGRvY3R5cGUuZ2V0UHVibGljSWQoKSA6IGRvYy5nZXREb2N1bWVudFR5cGVJZCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWUxNDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5LlhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb3ZhYmxlTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBhZGRlZCBhbmQvb3IgbWFkZSBwdWJsaWMgc3BlY2lmaWNhbGx5IGZvciBleHBlcmltZW50YXRpb24uIEl0Ci0gKiB3aWxsIGNoYW5nZSBhcyB0aGlzIGZ1bmN0aW9uYWxpdHkgYmVjb21lcyBBUEkuIFNlZQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTA4NAotICovCi0gCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgaW1wbGVtZW50cyBNb3ZhYmxlTW9kZWxRdWVyeSB7Ci0KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGZDYWNoZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIHhtbEFzc29jUHJvdiA9IG51bGw7Ci0KLQlwdWJsaWMgSFRNTE1vZGVsUXVlcnlJbXBsKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlzdXBlcihuZXcgSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKSk7Ci0JCWZDYWNoZSA9IGNhY2hlOwotCQl4bWxBc3NvY1Byb3YgPSBuZXcgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoY2FjaGUsIGlkUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKSB7Ci0JCUxpc3Qgb3JpZ2luYWxDYW5kaWRhdGVzID0gc3VwZXIuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCQlpZiAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9DSElMRF9OT0RFUykgPT0gMCkKLQkJCXJldHVybiBvcmlnaW5hbENhbmRpZGF0ZXM7Ci0JCS8vIFdoZW4gdGhlIHRhcmdldCBkb2N1bWVudCBpcyBYSFRNTCwgaXQgaXMgd2FzdGUgdG8gZmluZCBpbmNsdXNpb25zLAotCQkvLyBzaW5jZSBpbmNsdXNpb24gaXMgYXZhaWxhYmxlIGluIEhUTUwgb25seS4KLQkJaWYgKCFlZC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiBvcmlnaW5hbENhbmRpZGF0ZXM7Ci0JCQotCQlCb29sZWFuIGlzWGh0bWwgPSBCb29sZWFuLkZBTFNFOwotCQlpc1hodG1sID0gKEJvb2xlYW4pIGVkLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpOwotCQlpZiAoaXNYaHRtbCAhPSBudWxsICYmIGlzWGh0bWwuYm9vbGVhblZhbHVlKCkpCi0JCQlyZXR1cm4gb3JpZ2luYWxDYW5kaWRhdGVzOwotCi0JCS8vIE9LLCB0aGUgdGFyZ2V0IGlzIHN1cmVseSBhIEhUTUwgZWxlbWVudCwgc28gaXQgbWF5IGhhdmUgaW5jbHVzaW9uLgotCQkvLyBUcnkgdG8gZmluZCBpdC4KLQkJVmVjdG9yIGNhbmRpZGF0ZXMgPSBuZXcgVmVjdG9yKG9yaWdpbmFsQ2FuZGlkYXRlcyk7Ci0KLQkJc3dpdGNoIChlZC5nZXRDb250ZW50VHlwZSgpKSB7Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSA6Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQgOgotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCA6Ci0JCQkJLy8gZG8gZW51bWVyYXRlIGluY2x1c2lvbnMuCi0JCQkJY2FuZGlkYXRlcy5hZGRBbGwoSE1RVXRpbC5nZXRJbmNsdXNpb25zKGVsZW1lbnQpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkgOgotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgOgotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSA6Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgbm90IGFkZCBhbnkgaW5jbHVzaW9ucy4KLQkJCQkvLyBzbywgbm90aGluZyB0byBkbyBoZXJlLgotCQkJCWJyZWFrOwotCQl9Ci0JCS8vIElmIHRoZSBjdXJyZW50IGVsZW1lbnQgZG9lcyBub3QgYXZhaWxhYmxlLCBpdCBpcyBpbXBvc3NpYmxlCi0JCS8vIHRvIGZpbHRlciBvdXQgZXhjbHVzaW9uLgotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGNhbmRpZGF0ZXM7Ci0KLQkJLy8gTm93LCB0aGUgdGltZSB0byBjaGVjayBleGNsdXNpb24uCi0JCVZlY3RvciBjb250ZW50ID0gbmV3IFZlY3RvcihjYW5kaWRhdGVzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5zaXplKCk7IGkrKykgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gY2FuZGlkYXRlID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjYW5kaWRhdGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChjYW5kaWRhdGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChpc0V4Y2x1ZGVkKGNhbmRpZGF0ZSwgZWxlbWVudCkpCi0JCQkJY29udGludWU7Ci0JCQljb250ZW50LmFkZChjYW5kaWRhdGUpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb3ZhYmxlTW9kZWxRdWVyeSNzZXRJZFJlc29sdmVyKElkUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdJZFJlc29sdmVyKSB7Ci0JCW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyID0gbmV3IEhUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihmQ2FjaGUsIG5ld0lkUmVzb2x2ZXIpOwotCX0KLQotCS8vIHV0aWxpdGllcwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlZChDTUVsZW1lbnREZWNsYXJhdGlvbiBjYW5kaWRhdGUsIEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUNNTmFtZWROb2RlTWFwIHByb2hpYml0ZWQgPSBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKGNhbmRpZGF0ZSk7Ci0JCWlmIChwcm9oaWJpdGVkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVsZW1lbnQgcGFyZW50ID0gdGFyZ2V0OwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCUNNTm9kZSBwZGVjID0gcHJvaGliaXRlZC5nZXROYW1lZEl0ZW0ocGFyZW50LmdldE5vZGVOYW1lKCkpOwotCQkJaWYgKHBkZWMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXBhcmVudCA9IGdldEV4cGxpY2l0UGFyZW50RWxlbWVudChwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKENNRWxlbWVudERlY2xhcmF0aW9uIGRlYykgewotCQlpZiAoIWRlYy5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTmFtZWROb2RlTWFwKSBkZWMuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUyk7Ci0JfQotCi0JLyogZ2V0IGFuIGFuY2VzdG9yIGVsZW1lbnQgaWdub3JpbmcgaW1wbGljaXQgb25lcy4gKi8KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50IGdldEV4cGxpY2l0UGFyZW50RWxlbWVudChOb2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBwID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocCAhPSBudWxsKSB7Ci0JCQlpZiAocC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJaWYgKHAgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgewotCQkJCQlpZiAoKChJRE9NRWxlbWVudCkgcCkuaXNJbXBsaWNpdFRhZygpKSB7Ci0JCQkJCQlwID0gcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gKEVsZW1lbnQpIHA7Ci0JCQl9Ci0JCQlwID0gcC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBzdXBlci5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJaWYgKG51bGwgIT0gcmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJCi0JCXJldHVybiB4bWxBc3NvY1Byb3YuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdjMjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTCBleHRlbmRzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MLgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwoKSB7Ci0JCXN1cGVyKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCBmYWxzZSk7Ci0JfQotCi0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCi0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MKCk7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgImZvcmNlcyIgYSBuZXcgb25lIHRvIGFsd2F5cyBiZSBjcmVhdGVkL3JldHVybmVkLCBub3QKLQkgKiAiY2FjaGVkIiBvbiB0aGUgbm9kZS4gVGhhdCBzZWVtcyBpbmNvcnJlY3QuIFNpbXBseSB1c2luZwotCSAqIHNob3VsZFJlZ2lzdGVyRmFsc2Ugc2hvdWxkIHdvcmssIGV4Y2VwdCwgdGhlcmUgbWlnaHQgaGF2ZSBiZWVuIG9uZQotCSAqIHRoZXJlIHRoYXQgc29tZW9uZSBlbHNlIGFscmVhZHkgZXhwbGljaXRseSBwdXQgdGhlcmUsIHNvIHRoaXMgaXMgb25seQotCSAqIHdheSBJIGtub3cgdG8gb3ZlcnJpZGUgdGhhdC4gRXNwZWNpYWxseSBjb21wbGljYXRlZCBoZXJlIHNpbmNlIGEgbnVtYmVyCi0JICogb2YgYWRhcHRlcnMgYXJlIGZvciBNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcy4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBhZGFwdE5ldyhvYmplY3QpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzJmMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5LlhNTENhdGFsb2dJZFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0KLS8qKgotICogQ3JlYXRlcyBhIE1vZGVsUXVlcnlBZGFwdGVyIGZvciBIVE1MIG1vZGVscwotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JTW9kZWxRdWVyeUFkYXB0ZXJJbXBsIG1vZGVsUXVlcnlBZGFwdGVyOwotCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWxTdGF0ZU5vdGlmaWVyOwotCXByaXZhdGUgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0KLQljbGFzcyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJLy8gSVNTVUU6IHNob3VsZCB3ZSAiZnJlZXplIiBzdGF0ZSwgb3IgYW55dGhpbmc/Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCS8vIElTU1VFOiBzaG91bGQgd2UgImZyZWV6ZSIgc3RhdGUsIG9yIGFueXRoaW5nPwotCi0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8/Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJdXBkYXRlUmVzb2x2ZXIoc3RydWN0dXJlZE1vZGVsKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8/Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIElTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkJbW9kZWxTdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCW1vZGVsU3RhdGVOb3RpZmllciA9IG5ld01vZGVsOwotCQkJdXBkYXRlUmVzb2x2ZXIobW9kZWxTdGF0ZU5vdGlmaWVyKTsKLQkJCW1vZGVsU3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdXBkYXRlUmVzb2x2ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJSUZpbGUgYmFzZUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJCWlmIChiYXNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGJhc2VGaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCAmJiBiYXNlRmlsZS5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwpIHsKLQkJCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlpZiAoYmFzZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJfQotCQkJbW9kZWxRdWVyeUFkYXB0ZXIuc2V0SWRSZXNvbHZlcihuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKSk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCBjb25zdHJ1Y3RvciBjb21tZW50LiBOb3RlOiB0aGlzIGlzIGEKLQkgKiBjYXNlIHRoZXJlIHRoZSBrZXkgaXMgbm90IGV4YWN0bHkgc2FtZSBhcyB0aGUgY2xhc3Mgd2UgYXJlIGFmdGVyLgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKCkgewotCQlzdXBlcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogV2UgbmVlZCB0aGlzIHByb3RlY3RlZCB2ZXJzaW9uIHRvIGFsbG93IHN1YmNsYXNzZXMgdG8gcGFzcyB1cCBzdGFuZGFyZAotCSAqIGJlaGF2aW91ci4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICovCi0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCi0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCi0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJaWYgKG1vZGVsU3RhdGVOb3RpZmllciAhPSBudWxsKSB7Ci0JCQltb2RlbFN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKTsKLQkJfQotCi0JCW1vZGVsU3RhdGVOb3RpZmllciA9IG51bGw7Ci0KLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVyICE9IG51bGwpIHsKLQkJCW1vZGVsUXVlcnlBZGFwdGVyLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUFkYXB0ZXIgbWV0aG9kIGNvbW1lbnQuCi0JICogCi0JICogWFhYOiB3ZSBtdXN0IG1ha2UgdGhpcyBtZXRob2QgbW9yZSBpbmRlcGVuZGVudCBvZiAnbG9jYXRpb24nIChhdCBsZWFzdAotCSAqIHByb3ZpZGUgc29tZSBmYWxsLWJhY2sgbWV0aG9kKS4KLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQotCQlpZiAoRGVidWcuZGlzcGxheUluZm8pIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwuY3JlYXRlQWRhcHRlciIgKyB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVyID09IG51bGwpIHsKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIHRhcmdldDsKLQkJCQltb2RlbFN0YXRlTm90aWZpZXIgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJbW9kZWxTdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpKTsKLQotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC4uLiBiYXNlTG9jYXRpb24gOiAiICsgcmVzb2x2ZXIuZ2V0RmlsZUJhc2VMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJLyoqCi0JCQkJICogWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIgY3VycmVudGx5IHJlcXVpcmVzIGEgZmlsZXN5c3RlbQotCQkJCSAqIGxvY2F0aW9uIHN0cmluZy4gQ3VzdG9tYXJpbHkgdGhpcyB3aWxsIGJlIHdoYXQgaXMgaW4gdGhlCi0JCQkJICogZGVwcmVjYXRlZCBTU0UgVVJJUmVzb2x2ZXIgYW5kIHJlcXVpcmVkIGJ5IHRoZSBDb21tb24gVVJJCi0JCQkJICogUmVzb2x2ZXIuCi0JCQkJICovCi0JCQkJVVJJUmVzb2x2ZXIgaWRSZXNvbHZlciA9IG51bGw7Ci0JCQkJaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLQkJCQkJaWRSZXNvbHZlciA9IG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihyZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCksIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIDIwMzY0OSAtIHRoaXMgYmxvY2sgbWF5IGJlIG5lY2Vzc2FyeSBkdWUgdG8gb3JkZXJpbmcgb2YKLQkJCQkJICogc2V0dGluZyB0aGUgcmVzb2x2ZXIgaW50byB0aGUgbW9kZWwKLQkJCQkJICovCi0JCQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBudWxsOwotCQkJCQlTdHJpbmcgbW9kZWxzQmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJCWlmIChtb2RlbHNCYXNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJRmlsZSBmaWxlID0gbmV3IFBhdGgobW9kZWxzQmFzZUxvY2F0aW9uKS50b0ZpbGUoKTsKLQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJYmFzZUxvY2F0aW9uID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCQkJCUlSZXNvdXJjZSBkZXJpdmVkUmVzb3VyY2UgPSBudWxsOwotCQkJCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQkJCQkJCWRlcml2ZWRSZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlkZXJpdmVkUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoYmFzZVBhdGguc2VnbWVudCgwKSk7Ci0JCQkJCQkJSVBhdGggZGVyaXZlZFBhdGggPSBkZXJpdmVkUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQlpZiAoZGVyaXZlZFBhdGggIT0gbnVsbCkgewotCQkJCQkJCQliYXNlTG9jYXRpb24gPSBkZXJpdmVkUGF0aC50b1N0cmluZygpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJVVJJIHVyaSA9IGRlcml2ZWRSZXNvdXJjZS5nZXRMb2NhdGlvblVSSSgpOwotCQkJCQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJCQkJCWJhc2VMb2NhdGlvbiA9IHVyaS50b1N0cmluZygpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoYmFzZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbHNCYXNlTG9jYXRpb247Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWRSZXNvbHZlciA9IG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihiYXNlTG9jYXRpb24sIG51bGwpOwotCQkJCX0KLQkJCQlDTURvY3VtZW50Q2FjaGUgZG9jdW1lbnRDYWNoZSA9IG5ldyBDTURvY3VtZW50Q2FjaGUoKTsKLQkJCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBuZXcgSFRNTE1vZGVsUXVlcnlJbXBsKGRvY3VtZW50Q2FjaGUsIGlkUmVzb2x2ZXIpOwotCQkJCW1vZGVsUXVlcnkuc2V0RWRpdE1vZGUoTW9kZWxRdWVyeS5FRElUX01PREVfVU5DT05TVFJBSU5FRCk7Ci0JCQkJbW9kZWxRdWVyeUFkYXB0ZXIgPSBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKGRvY3VtZW50Q2FjaGUsIG1vZGVsUXVlcnksIGlkUmVzb2x2ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlcjsKLQl9Ci0KLQotCi0JcHJpdmF0ZSBmaW5hbCBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpIHsKLQkJaWYgKGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID0gbmV3IEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hIVE1MQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNDQyOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5YTUxBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogQSBDbGFzcyB0byBwcm92aWRlIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gWEhUTUwgZG9jdW1lbnRzIGFuZCBEVERzIGZvcgotICogWEhUTUwuIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGluIEhUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlci4KLSAqLwotLyoKLSAqIFRoaXMgY2xhc3MgY2xvc2VseSByZXNlbWJsZSBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci4KLSAqLwotY2xhc3MgWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB7Ci0JCi0JLyoqCi0JICogc2V0IENBQ0hFX0ZJWEVEX0RPQ1VNRU5UUyB0byBmYWxzZSB0byB0ZXN0IGVmZmVjdHMgb2Ygbm90IGNhY2hpbmcgY2VydGFpbiBjYXRhbG9nLWNvbnRyaWJ1dGVkIHNjaGVtYXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDQUNIRV9GSVhFRF9ET0NVTUVOVFMgPSB0cnVlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNUQU5EQVJEX1NDSEVNQV9CVU5ETEVTID0gbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMiLCJvcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcyJ9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0FUQUxPR19FWFRfUE9JTlQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIjsgCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBmRml4ZWRQdWJsaWNJRHMgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIE1hcCBmRml4ZWRDTURvY3VtZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBzZXQgVVNFX1FVSUNLX0NBQ0hFIHRvIGZhbHNlIHRvIHRlc3QgZWZmZWN0cyBvZiBub3QgY2FjaGluZyBhdCBhbGwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfUVVJQ0tfQ0FDSEUgPSB0cnVlOwotCXByb3RlY3RlZCBVUklSZXNvbHZlciBpZFJlc29sdmVyOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRHcmFtbWVyVVJJOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRQdWJsaWNJRDsKLQlwcml2YXRlIFN0cmluZyBmQ2FjaGVkU3lzdGVtSUQ7Ci0JcHJpdmF0ZSBib29sZWFuIGNhY2hlZDsKLQotCXB1YmxpYyBYSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKGNhY2hlKTsKLQkJdGhpcy5pZFJlc29sdmVyID0gaWRSZXNvbHZlcjsKLQkJICAgCi0JCS8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM2Mzk5LiBJZiB0aGUgQ00gZG9jdW1lbnQgVVJJCi0JCS8vIGlzIHJlc29sdmVkIGFuZCBjYWNoZWQgYXQgdGhpcyBsZXZlbCBpbnN0cnVjdCB0aGUgQ00gbW9kZWwgbWFuYWdlciB0byBhdm9pZCAKLQkJLy8gcmUtcmVzb2x2aW5nIHRoZSBVUkkuCi0KLQkJaWYgKFVTRV9RVUlDS19DQUNIRSkgewotCQkgIGRvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfUEVSRk9STV9VUklfUkVTT0xVVElPTiwgZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldFhIVE1MQ01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoaWRSZXNvbHZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmcgZ3JhbW1lclVSSSA9IG51bGw7Ci0JCWlmIChVU0VfUVVJQ0tfQ0FDSEUpIHsKLQkJCS8qCi0JCQkgKiBJbiBwYXJzaW5nIGEgZG9jdW1lbnQsIHdlIGdldCBtYW55IGlkZW50aWNhbCByZXF1ZXN0cyB0byB0aGlzCi0JCQkgKiBtZXRob2QsIHNvIGluc3RlYWQgb2YgbG9va2luZyB1cCAocmVzb2x2aW5nKSBncmFtbWVyVVJJIGVhY2gKLQkJCSAqIHRpbWUsIHdlJ2xsIGp1c3QgcmV0dXJuIHByZXZpb3VzbHkgY2FjaGVkIG9uZS4gUHJvYmFibHkgbm90Ci0JCQkgKiB3b3J0aCBoYXZlIGEgbW9yZSBjb21wbGV4IGNhY2hlIHRoYW4gdGhhdC4KLQkJCSAqLwotCQkJaWYgKGNhY2hlZCAmJiBzYW1lQXMoZkNhY2hlZFB1YmxpY0lELCBwdWJsaWNJZCkgJiYgc2FtZUFzKGZDYWNoZWRTeXN0ZW1JRCwgc3lzdGVtSWQpKSB7Ci0JCQkJZ3JhbW1lclVSSSA9IGZDYWNoZWRHcmFtbWVyVVJJOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ3JhbW1lclVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJCWZDYWNoZWRHcmFtbWVyVVJJID0gZ3JhbW1lclVSSTsKLQkJCQlmQ2FjaGVkUHVibGljSUQgPSBwdWJsaWNJZDsKLQkJCQlmQ2FjaGVkU3lzdGVtSUQgPSBzeXN0ZW1JZDsKLQkJCQljYWNoZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZ3JhbW1lclVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQl9Ci0KLQkJaWYgKGdyYW1tZXJVUkkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gbnVsbDsKLQkJaWYgKENBQ0hFX0ZJWEVEX0RPQ1VNRU5UUykgewotCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIGZGaXhlZENNRG9jdW1lbnRzLmdldChwdWJsaWNJZCk7Ci0JCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQljbURvY3VtZW50ID0gKENNRG9jdW1lbnQpIHJlZi5nZXQoKTsKLQkJCQlpZiAoY21Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBjbURvY3VtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4ODk2Ci0JCSAqIAotCQkgKiBXZSBvbmNlIGNhbGxlZCB0aGUgZGVwcmVjYXRlZCAyIGFyZ3VtZW50IGZvcm0gb2YgZ2V0Q01Eb2N1bWVudC4KLQkJICogCi0JCSAqIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGRvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50KHB1YmxpY0lkLAotCQkgKiBncmFtbWVyVVJJKTsKLQkJICogCi0JCSAqIHdoaWNoIGV2ZW50dWFsbHkgcmVzdWx0ZWQgaW4gZW1wdHkgc3RyaW5nIGZvciB0eXBlLCB3aGljaCBJIGRvbid0Ci0JCSAqIHRoaW5rIHRoZSBpbmZyYXN0cnVjdHVyZSBoYW5kbGVzIGFueSBsb25nZXIuIFNvLCBJIGRlbGV0ZWQKLQkJICogZGVwcmVjYXRlZCBtZXRob2RzLCBhbmQgc3dpdGNoZWQgdG8gbnVsbCBmb3IgdHlwZSBhcmd1bWVudC4KLQkJICogCi0JCSAqICdudWxsJyBtZWFucyB0byAiY3JlYXRlIGJhc2VkIG9uIHVyaSIuCi0JCSAqIAotCQkgKiBGWUksICdkdGQnIHdvdWxkIG1lYW4gbG9hZCBvbmx5IHRob3NlIHJlZ2lzdGVyZWQgYXMgZHRkJ3MKLQkJICogCi0JCSAqIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGRvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50KHB1YmxpY0lkLAotCQkgKiBncmFtbWVyVVJJKTsgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0KLQkJICogZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnQocHVibGljSWQsIGdyYW1tZXJVUkksICJkdGQiKTsKLQkJICovCi0JCXN5bmNocm9uaXplZCAoZ3JhbW1lclVSSSkgewotCQkJY21Eb2N1bWVudCA9IGRvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50KHB1YmxpY0lkLCBncmFtbWVyVVJJLCBudWxsKTsKLQkJfQotCQkKLQkJaWYgKENBQ0hFX0ZJWEVEX0RPQ1VNRU5UUyAmJiBnZXRGaXhlZFB1YmxpY0lEcygpLmNvbnRhaW5zKHB1YmxpY0lkKSkgewotCQkJZkZpeGVkQ01Eb2N1bWVudHMucHV0KHB1YmxpY0lkLCBuZXcgU29mdFJlZmVyZW5jZShjbURvY3VtZW50KSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjbURvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCXJldHVybiBpZFJlc29sdmVyLnJlc29sdmUobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2FtZUFzKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoYSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBiID09IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBhLmVxdWFscyhiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdAotCSAqIHdpbGwgY2hhbmdlIGFzIHRoaXMgZnVuY3Rpb25hbGl0eSBiZWNvbWVzIEFQSS4gU2VlCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTA4NAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVkR3JhbW1lclVSSSgpIHsKLQkJcmV0dXJuIGZDYWNoZWRHcmFtbWVyVVJJOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGZGaXhlZFB1YmxpY0lEcywgYSBjb2xsZWN0aW9uIG9mIGNvbnRyaWJ1dGVkIFB1YmxpYwotCSAqICAgICAgICAgSWRlbnRpZmllcnMgZnJvbSB0aGUga25vd24gc2NoZW1hIHBsdWctaW5zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0Rml4ZWRQdWJsaWNJRHMoKSB7Ci0JCS8qKgotCQkgKiBwdWJsaWM6cHVibGljSWQKLQkJICogVE9ETzogc3lzdGVtOnN5c3RlbUlkIGFuZCB1cmk6bmFtZSBpbiB0aGVpciBvd24gbWV0aG9kcyBhbmQgbWFwcz8KLQkJICovCi0JCXN5bmNocm9uaXplZCAoU1RBTkRBUkRfU0NIRU1BX0JVTkRMRVMpIHsKLQkJCWlmIChmRml4ZWRQdWJsaWNJRHMgPT0gbnVsbCkgewotCQkJCWZGaXhlZFB1YmxpY0lEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTVEFOREFSRF9TQ0hFTUFfQlVORExFUy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9ucyhTVEFOREFSRF9TQ0hFTUFfQlVORExFU1tpXSk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKFhNTF9DQVRBTE9HX0VYVF9QT0lOVC5lcXVhbHMoZXh0ZW5zaW9uc1tqXS5nZXRFeHRlbnNpb25Qb2ludFVuaXF1ZUlkZW50aWZpZXIoKSkpIHsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWd1cmF0aW9uRWxlbWVudHMgPSBleHRlbnNpb25zW2pdLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY29uZmlndXJhdGlvbkVsZW1lbnRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHB1YmxpY3MgPSBjb25maWd1cmF0aW9uRWxlbWVudHNba10uZ2V0Q2hpbGRyZW4oInB1YmxpYyIpOwotCQkJCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IHB1YmxpY3MubGVuZ3RoOyBsKyspIHsKLQkJCQkJCQkJCVN0cmluZyBwdWJsaWNJZCA9IHB1YmxpY3NbbF0uZ2V0QXR0cmlidXRlKCJwdWJsaWNJZCIpOwotCQkJCQkJCQkJaWYgKHB1YmxpY0lkICE9IG51bGwgJiYgcHVibGljSWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCQkJZkZpeGVkUHVibGljSURzLmFkZChwdWJsaWNJZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZGaXhlZFB1YmxpY0lEczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWZkNzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkNoYXJzZXROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIEhUTUwgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCi0JCS8vIGZvcm1hdHRpbmcgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgNzIpOwotCQlub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmYWxzZSk7Ci0JCW5vZGUucHV0KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQik7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIDEpOwotCQlub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VULCBmYWxzZSk7Ci0KLQkJLy8gY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJLy8gbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUywKLQkJLy8gdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTLCBmYWxzZSk7Ci0KLQkJLy8gY29kZSBnZW5lcmF0aW9uIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGVmYXVsdEVuYyA9ICJVVEYtOCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3lzdGVtRW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN5c3RlbUVuYyAhPSBudWxsKSB7Ci0JCQlkZWZhdWx0RW5jID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldFByZWZlcnJlZERlZmF1bHRJYW5hTmFtZShzeXN0ZW1FbmMsICJVVEYtOCIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZGVmYXVsdEVuYyk7Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpbml0aWFsaXplVmFsaWRhdGlvblByZWZlcmVuY2VzKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgZGVmYXVsdCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzCi0JICogQHBhcmFtIG5vZGUgdGhlIEVjbGlwc2UgcHJlZmVyZW5jZSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uUHJlZmVyZW5jZXMoSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlKSB7Ci0JCS8vIEF0dHJpYnV0ZXMKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1VOREVGSU5FRF9OQU1FLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1VOREVGSU5FRF9WQUxVRSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9OQU1FX01JU01BVENILCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0lOVkFMSURfTkFNRSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9JTlZBTElEX1ZBTFVFLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0RVUExJQ0FURSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9WQUxVRV9NSVNNQVRDSCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVkFMVUVfVU5DTE9TRUQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVkFMVUVfUkVTT1VSQ0VfTk9UX0ZPVU5ELCBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpOwotCQkKLQkJLy8gRWxlbWVudHMKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTktOT1dOX05BTUUsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfTkFNRSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1NUQVJUX0lOVkFMSURfQ0FTRSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fRU5EX0lOVkFMSURfQ0FTRSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX01JU1NJTkdfU1RBUlQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9NSVNTSU5HX0VORCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5ORUNFU1NBUllfRU5ELCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX0RJUkVDVElWRSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfQ09OVEVOVCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fRFVQTElDQVRFLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9DT0VYSVNURU5DRSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5DTE9TRURfU1RBUlRfVEFHLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5DTE9TRURfRU5EX1RBRywgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfRU1QVFlfVEFHLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJCi0JCS8vIERPQ1RZUEUKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRE9DX0RVUExJQ0FURSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfSU5WQUxJRF9DT05URU5ULCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRE9DX0RPQ1RZUEVfVU5DTE9TRUQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJCi0JCS8vIFRleHQKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEVYVF9JTlZBTElEX0NPTlRFTlQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5URVhUX0lOVkFMSURfQ0hBUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCQotCQkvLyBDb21tZW50Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTU1FTlRfSU5WQUxJRF9DT05URU5ULCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NTUVOVF9VTkNMT1NFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQkKLQkJLy8gQ0RBVEEKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0RBVEFfSU5WQUxJRF9DT05URU5ULCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0RBVEFfVU5DTE9TRUQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJCi0JCS8vIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBJX0lOVkFMSURfQ09OVEVOVCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBJX1VOQ0xPU0VELCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCQotCQkvLyBFbnRpdHkgUmVmZXJlbmNlCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlJFRl9VTkRFRklORUQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5SRUZfSU5WQUxJRF9DT05URU5ULCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTIyYmM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgSFRNTCBjb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBOZXcgSFRNTAotCSAqIEZpbGUgV2l6YXJkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiZGVmYXVsdEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgbGluZSBiZWZvcmUgYSBsaW5lIHNwbGl0IGlzIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1dJRFRIID0gImxpbmVXaWR0aCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFsbCBibGFua3MgbGluZXMgc2hvdWxkIGJlIGNsZWFyZWQgZHVyaW5nIGZvcm1hdHRpbmcuCi0JICogQmxhbmsgbGluZXMgd2lsbCBiZSBrZXB0IHdoZW4gZmFsc2UuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTID0gImNsZWFyQWxsQmxhbmtMaW5lcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiAjSU5ERU5UQVRJT05fQ0hBUiBmb3IgMSBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRBVElPTl9TSVpFID0gImluZGVudGF0aW9uU2l6ZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciB1c2VkIGZvciBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VEFCLCBTUEFDRX0KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fQ0hBUiA9ICJpbmRlbnRhdGlvbkNoYXIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjSU5ERU5UQVRJT05fQ0hBUi4gSW5kaWNhdGVzIHRvIHVzZQotCSAqIHRhYiBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1NQQUNFCi0JICogQHNlZSAjSU5ERU5UQVRJT05fQ0hBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICJ0YWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiBzcGFjZSBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1RBQgotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICJzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0YWdzIHdpdGggbXVsdGlwbGUgYXR0cmlidXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkCi0JICogKHNwbGl0dGluZyBlYWNoIGF0dHIgb24gYSBuZXcgbGluZSkuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BMSVRfTVVMVElfQVRUUlMgPSAic3BsaXRNdWx0aUF0dHJzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgZW5kIGJyYWNrZXRzIG9mIHN0YXJ0IHRhZ3Mgc2hvdWxkIGJlIHBsYWNlZCBvbiBhIG5ldyBsaW5lCi0JICogaWYgdGhlIHN0YXJ0IHRhZyBzcGFucyBtb3JlIHRoYW4gb25lIGxpbmUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fRU5EX0JSQUNLRVQgPSAiYWxpZ25FbmRCcmFja2V0IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgY2xlYW51cCBwcm9jZXNzb3Igc2hvdWxkIGZvcm1hdCBzb3VyY2UuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1NPVVJDRSA9ICJmb3JtYXRTb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBlbXB0eSBlbGVtZW50cyBzaG91bGQgYmUgY29tcHJlc3NlZCBkdXJpbmcKLQkgKiBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUyA9ICJjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfUkVRVUlSRURfQVRUUlMgPSAiaW5zZXJ0UmVxdWlyZWRBdHRycyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluc2VydCBtaXNzaW5nIHRhZ3MgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX01JU1NJTkdfVEFHUyA9ICJpbnNlcnRNaXNzaW5nVGFncyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHF1b3RlIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbnZlcnQgYWxsIGxpbmUgZGVsaW1pdGVycyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX0VPTF9DT0RFUyA9ICJjb252ZXJ0RU9MQ29kZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgbGluZSBkZWxpbWl0ZXIgdG8gdXNlIGR1cmluZyBjbGVhbnVwIGlmIGNvbnZlcnRpbmcgbGluZQotCSAqIGRlbGltaXRlcnMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge0NSLCBDUkxGLCBMRiwgTk9fVFJBTlNMQVRJT059Ci0JICogPC9wPgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfRU9MX0NPREUgPSAiY2xlYW51cEVPTENvZGUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBjYXNlIHRvIHVzZSBvbiBhbGwgdGFnIG5hbWVzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7TE9XRVIsIFVQUEVSLCBBU0lTfQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX1RBR19OQU1FX0NBU0UgPSAiY2xlYW51cFRhZ05hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgY2FzZSB0byB1c2Ugb24gYWxsIGF0dHJpYnV0ZSBuYW1lcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge0xPV0VSLCBVUFBFUiwgQVNJU30KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSA9ICJjbGVhbnVwQXR0ck5hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJyZWQgbWFya3VwIGNhc2UgZm9yIHRhZyBuYW1lcyBpbiBjb2RlIGdlbmVyYXRpb24KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge0xPV0VSLCBVUFBFUn0KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUVfQ0FTRSA9ICJ0YWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVycmVkIG1hcmt1cCBjYXNlIGZvciBhdHRyaWJ1dGUgbmFtZXMgaW4gY29kZSBnZW5lcmF0aW9uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtMT1dFUiwgVVBQRVJ9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DQVNFID0gImF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNUQUdfTkFNRV9DQVNFIG9yICNBVFRSX05BTUVfQ0FTRS4KLQkgKiBJbmRpY2F0ZXMgdG8gbGVhdmUgY2FzZSBhcyBpcy4KLQkgKiAKLQkgKiBAc2VlICNMT1dFUgotCSAqIEBzZWUgI1VQUEVSCi0JICogQHNlZSAjVEFHX05BTUVfQ0FTRQotCSAqIEBzZWUgI0FUVFJfTkFNRV9DQVNFCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNJUyA9IDA7Ci0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI1RBR19OQU1FX0NBU0Ugb3IgI0FUVFJfTkFNRV9DQVNFLgotCSAqIEluZGljYXRlcyB0byBtYWtlIG5hbWUgbG93ZXJjYXNlLgotCSAqIAotCSAqIEBzZWUgI0FTSVMKLQkgKiBAc2VlICNVUFBFUgotCSAqIEBzZWUgI1RBR19OQU1FX0NBU0UKLQkgKiBAc2VlICNBVFRSX05BTUVfQ0FTRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV0VSID0gMTsKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjVEFHX05BTUVfQ0FTRSBvciAjQVRUUl9OQU1FX0NBU0UuCi0JICogSW5kaWNhdGVzIHRvIG1ha2UgbmFtZSB1cHBlcmNhc2UuCi0JICogCi0JICogQHNlZSAjTE9XRVIKLQkgKiBAc2VlICNBU0lTCi0JICogQHNlZSAjVEFHX05BTUVfQ0FTRQotCSAqIEBzZWUgI0FUVFJfTkFNRV9DQVNFCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBQRVIgPSAyOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9QUk9KRUNUX1NFVFRJTkdTID0gInVzZS1wcm9qZWN0LXNldHRpbmdzIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1VOREVGSU5FRF9OQU1FID0gImF0dHJVbmRlZk5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVU5ERUZJTkVEX1ZBTFVFID0gImF0dHJVbmRlZlZhbHVlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUVfTUlTTUFUQ0ggPSAiYXR0ck5hbWVNaXNtYXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JTlZBTElEX05BTUUgPSAiYXR0ckludmFsaWROYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lOVkFMSURfVkFMVUUgPSAiYXR0ckludmFsaWRWYWx1ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9EVVBMSUNBVEUgPSAiYXR0ckR1cGxpY2F0ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRV9NSVNNQVRDSCA9ICJhdHRyVmFsdWVNaXNtYXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRV9VTkNMT1NFRCA9ICJhdHRyVmFsdWVVbmNsb3NlZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRV9SRVNPVVJDRV9OT1RfRk9VTkQgPSAicmVzb3VyY2VOb3RGb3VuZCI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVU5LTk9XTl9OQU1FID0gImVsZW1Vbmtub3duTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fSU5WQUxJRF9OQU1FID0gImVsZW1JbnZhbGlkTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fU1RBUlRfSU5WQUxJRF9DQVNFID0gImVsZW1TdGFydEludmFsaWRDYXNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9FTkRfSU5WQUxJRF9DQVNFID0gImVsZW1FbmRJbnZhbGlkQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTUlTU0lOR19TVEFSVCA9ICJlbGVtTWlzc2luZ1N0YXJ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9NSVNTSU5HX0VORCA9ICJlbGVtTWlzc2luZ0VuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVU5ORUNFU1NBUllfRU5EID0gImVsZW1Vbm5lY2Vzc2FyeUVuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fSU5WQUxJRF9ESVJFQ1RJVkUgPSAiZWxlbUludmFsaWREaXJlY3RpdmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0lOVkFMSURfQ09OVEVOVCA9ICJlbGVtSW52YWxpZENvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0RVUExJQ0FURSA9ICJlbGVtRHVwbGljYXRlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9DT0VYSVNURU5DRSA9ICJlbGVtQ29leGlzdGVuY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1VOQ0xPU0VEX1NUQVJUX1RBRyA9ICJlbGVtVW5jbG9zZWRTdGFydFRhZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVU5DTE9TRURfRU5EX1RBRyA9ICJlbGVtVW5jbG9zZWRFbmRUYWciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0lOVkFMSURfRU1QVFlfVEFHID0gImVsZW1JbnZhbGlkRW1wdHlUYWciOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfRFVQTElDQVRFID0gImRvY0R1cGxpY2F0ZVRhZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19JTlZBTElEX0NPTlRFTlQgPSAiZG9jSW52YWxpZENvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfRE9DVFlQRV9VTkNMT1NFRCA9ICJkb2NEb2N0eXBlVW5jbG9zZWQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0lOVkFMSURfQ09OVEVOVCA9ICJkb2NJbnZhbGlkQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfSU5WQUxJRF9DSEFSID0gImRvY0ludmFsaWRDaGFyIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9JTlZBTElEX0NPTlRFTlQgPSAiY29tbWVudEludmFsaWRDb250ZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9VTkNMT1NFRCA9ICJjb21tZW50VW5jbG9zZWQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9JTlZBTElEX0NPTlRFTlQgPSAiY2RhdGFJbnZhbGlkQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1VOQ0xPU0VEID0gImNkYXRhVW5jbG9zZWQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9JTlZBTElEX0NPTlRFTlQgPSAicGlJbnZhbGlkQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1VOQ0xPU0VEID0gInBpVW5jbG9zZWQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfSU5WQUxJRF9DT05URU5UID0gInJlZkludmFsaWRDb250ZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGX1VOREVGSU5FRCA9ICJwaVVuZGVmaW5lZCI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUw0ME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUw0ME5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFhNTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MNDBOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MQ01Qcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTENNUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDdhNzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MQ01Qcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotLyoqCi0gKiBIVE1MQ01Qcm9wZXJ0aWVzIGRlZmluZXMgYWxsIHByb3BlcnR5IG5hbWVzIGFuZCBwcmUtZGVmaW5lZCB2YWx1ZXMgaW4gSFRNTCBDTS4KLSAqIEFsbCBvZiB0aG9zZSBwcm9wZXJ0aWVzIGNhbiBiZSByZXRyZWl2ZWQgZnJvbSBlbGVtZW50IGRlY2xhcmF0aW9ucyBvZiBIVE1MIENNCi0gKiB2aWEgQ01Ob2RlI2dldFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTENNUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiAic2hvdWxkSWdub3JlQ2FzZSIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPVUxEX0lHTk9SRV9DQVNFID0gInNob3VsZElnbm9yZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAic2hvdWxkS2VlcFNwYWNlIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9VTERfS0VFUF9TUEFDRSA9ICJzaG91bGRLZWVwU3BhY2UiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaW5kZW50Q2hpbGRTb3VyY2UiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9JTkRFTlRfQ0hJTERfU09VUkNFID0gInNob3VsZEluZGVudENoaWxkU291cmNlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogInRlcm1pbmF0b3JzIiByZXR1cm5zIGphdmEudXRpbC5JdGVyYXRvciAoYW4gYXJyYXkgb2YgU3RyaW5nIG9iamVjdHMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1JTkFUT1JTID0gInRlcm1pbmF0b3JzIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImNvbnRlbnRIaW50IiByZXR1cm5zIENNRWxlbWVudERlY2xhcmF0aW9uIGluc3RuYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSElOVCA9ICJjb250ZW50SGludCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJwcm9oaWJpdGVkQW5jZXN0b3JzIiByZXR1cm5zIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSElCSVRFRF9BTkNFU1RPUlMgPSAicHJvaGliaXRlZEFuY2VzdG9ycyI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpc0pTUCIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfSlNQID0gImlzSlNQIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImlzWEhUTUwiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1hIVE1MID0gImlzWEhUTUwiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaXNTU0kiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1NTSSA9ICJpc1NTSSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJsaW5lQnJlYWtIaW50IiByZXR1cm5zIFN0cmluZyAob25lIG9mIHByZS1kZWZpbmVkIHZhbHVlcyBpbiBWYWx1ZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfQlJFQUtfSElOVCA9ICJsaW5lQnJlYWtIaW50IjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImxheW91dFR5cGUiIHJldHVybnMgU3RyaW5nIChvbmUgb2YgcHJlLWRlZmluZWQgdmFsdWVzIGluIFZhbHVlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1RZUEUgPSAibGF5b3V0VHlwZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJ0YWdJbmZvIiByZXR1cm5zIFN0cmluZyAoZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBlbGVtZW50KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdJTkZPID0gInRhZ0luZm8iOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAib21pdFR5cGUiIHJldHVybnMgU3RyaW5nIChvbmUgb2YgcHJlLWRlZmluZWQgdmFsdWVzIGluIFZhbHVlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9UWVBFID0gIm9taXRUeXBlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImluY2x1c2lvbiIgcmV0dXJucyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVVNJT04gPSAiaW5jbHVzaW9uIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImlzU2NyaXB0YWJsZSIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfU0NSSVBUQUJMRSA9ICJpc1NjcmlwdGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWx1ZXMgewotCQkvKgotCQkgKiBmb3IgTElORV9CUkVBS19ISU5UID0gImxpbmVCcmVha0hpbnQiLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUtfTk9ORSA9ICJicmVha05vbmUiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUtfQUZURVJfU1RBUlQgPSAiYnJlYWtBZnRlclN0YXJ0IjsvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EID0gImJyZWFrQmVmb3JlU3RhcnRBbmRBZnRlckVuZCI7Ly8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiBmb3IgTEFZT1VUX1RZUEUgPSAibGF5b3V0VHlwZSIKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9CTE9DSyA9ICJsYXlvdXRCbG9jayI7Ly8kTk9OLU5MUy0xJAotCQkvKiogQlIgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX0JSRUFLID0gImxheW91dEJyZWFrIjsvLyROT04tTkxTLTEkCi0JCS8qKiBIaWRkZW4gb2JqZWN0OyBsaWtlIEhUTUwgb3IgSEVBRCAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfSElEREVOID0gImxheW91dEhpZGRlbiI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfTk9ORSA9ICJsYXlvdXROb25lIjsvLyROT04tTkxTLTEkCi0JCS8qKiBObyB3cmFwIG9iamVjdDsgbGlrZSBJTUcsIEFQUExFVCwuLi4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX09CSkVDVCA9ICJsYXlvdXRPYmplY3QiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1dSQVAgPSAibGF5b3V0V3JhcCI7Ly8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiBmb3IgT01JVF9UWVBFID0gIm9taXRUeXBlIgotCQkgKi8KLQkJLyoqIE5vdCBvbW1pc2libGUuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfTk9ORSA9ICJvbWl0Tm9uZSI7Ly8kTk9OLU5MUy0xJAotCQkvKiogQm90aCB0YWdzIGFyZSBvbW1pc2libGUuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfQk9USCA9ICJvbWl0Qm90aCI7Ly8kTk9OLU5MUy0xJAotCQkvKiogVGhlIGVuZCB0YWcgaXMgb21taXNpYmxlLiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlUX0VORCA9ICJvbWl0RW5kIjsvLyROT04tTkxTLTEkCi0JCS8qKiBUaGUgZW5kIHRhZyBpcyBvbW1pdHRlZCB3aGVuIGNyZWF0ZWQuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfRU5EX0RFRkFVTFQgPSAib21pdEVuZERlZmF1bHQiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIFRoZSBlbmQgdGFnIG11c3QgYmUgb21pdHRlZC4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9FTkRfTVVTVCA9ICJvbWl0RW5kTXVzdCI7Ly8kTk9OLU5MUy0xJAotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGJiMmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBub3QgdXNlZCBpbiBXVFAKLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVRkZJWCA9ICJkZWZhdWx0U3VmZml4IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1NVRkZJWCA9ICJodG1sIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9ET0NVTUVOVF9UWVBFID0gImdlbmVyYXRlRG9jdW1lbnRUeXBlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9HRU5FUkFUT1IgPSAiZ2VuZXJhdGVHZW5lcmF0b3IiOy8vJE5PTi1OTFMtMSQKLQkvLyBhZGRlZCB0aGlzIGFzIGEgcG90ZW50aWFsIHdheSB0byBoYW5kbGUgY2hhbmdpbmcKLQkvLyBwcm9kdWN0IG5hbWVzICJ1cCIgdGhlIHN0YWNrLiBOb3RlLCBub3QgZGVjbGFyZWQgZmluYWwgCi0JLy8gdG8gYXZvaWQgZ2V0dGluZyAnaW5saW5lZCcgYnkgY29tcGlsZXIuCi0Jc3RhdGljIElQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0JLy8gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpIGlzIHNwZWMnZCBzbyBpdCBtaWdodCByZXR1cm4gbnVsbC4KLQkvLyBJdHMgZXhwZWN0ZWQgZm9yIGFueSBmaW5hbCBwcm9kdWN0IGl0IHdvdWxkIG5vdCBiZSwgc28gd2UnbGwgcmV0dXJuIAotCS8vICJXVFAiIGZvciBkZXZlbG9wbWVudC9pbnRlcmltIGJ1aWxkcy4gTm8gbmVlZCB0byB0cmFuc2xhdGUuIAotCXN0YXRpYyBTdHJpbmcgR0VORVJBVE9SID0gKHByb2R1Y3QgPT0gbnVsbCkgPyAiV1RQIjogcHJvZHVjdC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MRm9ybWF0Q29udHJhaW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGb3JtYXRDb250cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzIxN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGb3JtYXRDb250cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKiBQbGVhc2UgdW4tZGVwcmVjYXRlIHRoaXMgaWYgUGFnZSBEZXNpZ25lciB0aGlua3MgdGhleSBhcmUgbmVlZGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxGb3JtYXRDb250cmFpbnRzIGV4dGVuZHMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIHsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAlJdCdzIHZlcnkgaGFyZCB0byBrZWVwIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBhY2N1cmF0ZS4KLQkgKiAJU29tZXRpbWVzIGEgbm9kZSB3YW50cyB0byBzdGFydCBvbiBhIG5ldyBsaW5lLCBzb21ldGltZXMgaXQgZG9lc24ndC4KLQkgKiAJSXQncyBiZXN0IGZvciB0aGUgbm9kZSB0byBmaWd1cmUgb3V0IHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBvbiB0aGUgZmx5LgotCSAqLwotCWludCBnZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogCUl0J3MgdmVyeSBoYXJkIHRvIGtlZXAgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGFjY3VyYXRlLgotCSAqIAlTb21ldGltZXMgYSBub2RlIHdhbnRzIHRvIHN0YXJ0IG9uIGEgbmV3IGxpbmUsIHNvbWV0aW1lcyBpdCBkb2Vzbid0LgotCSAqIAlJdCdzIGJlc3QgZm9yIHRoZSBub2RlIHRvIGZpZ3VyZSBvdXQgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9uIHRoZSBmbHkuCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVMaW5lV2lkdGgoaW50IGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTAxOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBQcmVmZXJlbmNlTmFtZXMgewotCi0JU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFlFUyA9ICJ5ZXMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5PID0gIm5vIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlTdHJpbmcgU0VUVElOR1MgPSAic2V0dGluZ3MiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVFJFRVZJRVcgPSAidHJlZXZpZXciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFRkFVTFRfREVQVEggPSAiZGVmYXVsdGRlcHRoIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFTSVMgPSAiYXMtaXMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIExPV0VSID0gImxvd2VyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUFBFUiA9ICJ1cHBlciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBQUkVGRVJSRURfQ0FTRSA9ICJwcmVmZXJyZWQtY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHTkFNRSA9ICJ0YWduYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSSUJVVEVOQU1FID0gImF0dHJpYnV0ZW5hbWUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUZhbWlseUZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUZhbWlseUZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmMTdmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0IHByb3RlY3RlZAotICogbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTCB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IG5vdCBkZWNsYXJlZCBhcyBmaW5hbCwKLQkgKiBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUxfRkFNSUxZID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUZhbWlseUZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRmYW1pbHkuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDkxMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQgcHJvdGVjdGVkCi0gKiBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29udGVudFR5cGVJZEZvckhUTUwgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBub3QgZGVjbGFyZWQgYXMgZmluYWwsCi0JICogc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0hUTUwgPSBnZXRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JIVE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUhUTUxQYXJ0aXRpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUhUTUxQYXJ0aXRpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGY2MWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lIVE1MUGFydGl0aW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbgotICogdHlwZXMgZm9yIEhUTUwuIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkCi0gKiBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIVE1MUGFydGl0aW9uVHlwZXMgewotCi0JU3RyaW5nIEhUTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhUTUxfREVDTEFSQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSFRNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBTQ1JJUFQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTVFlMRSA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5TVFlMRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIElTU1VFOiBJIHRoaW5rIG1ldGEgdGFnIGFyZWFzIGFyZSBoZXJlIHRvbz8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGRlNWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLklTdHJ1Y3R1cmVkVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU2NyaXB0TGFuZ3VhZ2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci0KLS8qKgotICogRG9jdW1lbnQgcGFydGl0aW9uZXIgZm9yIEhUTUwuIENsaWVudC1zaWRlIHNjcmlwdHMgb2YgdHlwZSBKYXZhU2NyaXB0IGFyZQotICogcmVwb3J0ZWQgYXMgU1RfU0NSSVBULCBhbGwgb3RoZXJzIGZvciA8c2NyaXB0IGxhbmd1YWdlPSJmb28iIHR5cGU9ImZvbzIiPgotICogYXMgU0NSSVBULmxhbmd1YWdlOkZPTyBhbmQgU0NSSVBULnR5cGU6Rk9PMi4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117SUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04sIElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQsIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIElDU1NQYXJ0aXRpb25zLlNUWUxFLElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFTQ1JJUFQgPSAiamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBU0NSSVBUX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFVkVOVF9BVFRSSUJVVEVfTkFNRVMgPSAKLQkJe0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DTElDSywgCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05EQkxDTElDSywKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFRE9XTiwKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFVVAsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU9WRVIsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU1PVkUsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU9VVCwKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTktFWVBSRVNTLAotCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OS0VZRE9XTiwKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTktFWVVQLAotCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OSEVMUH07Ci0JCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIGNyZWF0ZVBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHN0eXBlID0gZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShub2RlKTsKLQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCBzdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIGxvY2FsVHlwZSA9IHR5cGU7Ci0JCWlmICh0eXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlsb2NhbFR5cGUgPSBnZXRTY3JpcHRpbmdQYXJ0aXRpb25UeXBlKG5vZGUpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCBsb2NhbFR5cGUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFNjcmlwdGluZ1BhcnRpdGlvblR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3JlTm9kZSkgewotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBjb3JlTm9kZTsKLQkJSVRleHRSZWdpb24gYXR0ck5hbWVSZWdpb24gPSBudWxsOwotCQl3aGlsZSAobm9kZSAhPSBudWxsICYmIGlzVmFsaWRTY3JpcHRpbmdSZWdpb25UeXBlKG5vZGUuZ2V0VHlwZSgpKSkgewotCQkJbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zLnNpemUoKSA+IDQgJiYgcmVnaW9ucy5nZXQoMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQlJVGV4dFJlZ2lvbiBwb3RlbnRpYWxMYW5ndWFnZVJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJU3RyaW5nIHBvdGVudGlhbExhbmd1YWdlU3RyaW5nID0gbm9kZS5nZXRUZXh0KHBvdGVudGlhbExhbmd1YWdlUmVnaW9uKTsKLQkJCWlmIChwb3RlbnRpYWxMYW5ndWFnZVN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkKLQkJCQkJCWF0dHJOYW1lUmVnaW9uID0gcmVnaW9uOwotCQkJCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IG5vZGUuZ2V0VGV4dChhdHRyTmFtZVJlZ2lvbik7Ci0JCQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBTkdVQUdFKSkKLQkJCQkJCQlsYW5ndWFnZSA9IFN0cmluZ1V0aWxzLnN0cmlwKG5vZGUuZ2V0VGV4dChyZWdpb24pKTsKLQkJCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKSkgewotCQkJCQkJCXR5cGUgPSBTdHJpbmdVdGlscy5zdHJpcChub2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlhdHRyTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGxvb2t1cFNjcmlwdFR5cGUodHlwZSk7Ci0JCWVsc2UgaWYgKGxhbmd1YWdlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBsb29rdXBTY3JpcHRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRTY3JpcHRpbmdSZWdpb25UeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbG9va3VwU2NyaXB0VHlwZShTdHJpbmcgdHlwZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX01JTUVfVFlQRV9LRVlTLmxlbmd0aDsgaSsrKQotCQkJaWYgKFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX01JTUVfVFlQRV9LRVlTW2ldLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpCi0JCQkJcmV0dXJuIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQ7Ci0JCXJldHVybiBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUICsgIi50eXBlLiIgKyB0eXBlLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGxvb2t1cFNjcmlwdExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMubGVuZ3RoOyBpKyspCi0JCQlpZiAoU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZU1tpXS5lcXVhbHNJZ25vcmVDYXNlKGxhbmd1YWdlKSkKLQkJCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJcmV0dXJuIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQgKyAiLmxhbmd1YWdlLiIgKyBsYW5ndWFnZS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pCi0JCQlyZXN1bHQgPSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5UOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT047Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSAmJiBpc1NjcmlwdEF0dHJpYnV0ZVZhbHVlKHJlZ2lvbiwgb2Zmc2V0KSkKLQkJCXJlc3VsdCA9IElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSOwotCQllbHNlCi0JCQlyZXN1bHQgPSBzdXBlci5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKSB7Ci0JCQotCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIG5leHRFbmRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCi0JCUlUZXh0UmVnaW9uW10gcmVnaW9ucyA9IHByZXZpb3VzTm9kZS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJcHJldmlvdXNTdGFydFRhZ05hbWVSZWdpb24gPSByZWdpb25zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJlZ2lvbnMgPSBuZXh0Tm9kZS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmV4dEVuZFRhZ05hbWVSZWdpb24gPSByZWdpb25zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlpZihwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiA9PSBudWxsIHx8IG5leHRFbmRUYWdOYW1lUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVDsKLQkJCi0JCVN0cmluZyBuYW1lMSA9IHByZXZpb3VzTm9kZS5nZXRUZXh0KHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uKTsKLQkJU3RyaW5nIG5hbWUyID0gbmV4dE5vZGUuZ2V0VGV4dChuZXh0RW5kVGFnTmFtZVJlZ2lvbik7Ci0JCWlmIChuYW1lMS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCkpCi0JCQkvLwkJCXJldHVybiBTVF9TQ1JJUFQ7Ci0JCQlyZXR1cm4gZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZpb3VzTm9kZS5nZXRTdGFydE9mZnNldChwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbikpKTsKLQkJZWxzZSBpZiAobmFtZTEuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkKLQkJCXJldHVybiBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0YWduYW1lID0gcmVnaW9uLmdldFN1cnJvdW5kaW5nVGFnKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyB0YWduYW1lIHNob3VsZCBub3QgYmUgbnVsbCwKLQkJLy8gYnV0IHNlZSBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkxMQotCQlpZiAodGFnbmFtZSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRVbmtub3duKCk7Ci0JCX0KLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpCi0JCQlyZXN1bHQgPSBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFICYmIGlzU2NyaXB0QXR0cmlidXRlVmFsdWUocmVnaW9uLCBvZmZzZXQpKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVF9FVkVOVEhBTkRMRVI7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1NjcmlwdEF0dHJpYnV0ZVZhbHVlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBpc0F0dHJpYnV0ZU5hbWVGb3JWYWx1ZUFuRXZlbnRTY3JpcHQocmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZU5hbWVGb3JWYWx1ZUFuRXZlbnRTY3JpcHQoSVRleHRSZWdpb24gYXR0clZhbHVlUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJaW50IGN1cnJlbnRJbmRleCA9IHJlZ2lvbkxpc3QuaW5kZXhPZihhdHRyVmFsdWVSZWdpb24pOwotCi0JCS8qCi0JCSAqIDQgaXMgdGhlIG1pbmltdW0gaW5kZXggYWxsb3dpbmcgZm9yIHRoZSB0YWcncyBvcGVuLCBuYW1lLCBhdHRyaWJ1dGUKLQkJICogbmFtZSBhbmQgZXF1YWxzIGNoYXJhY3RlciB0byBhcHBlYXIgZmlyc3QKLQkJICovCi0JCWlmIChjdXJyZW50SW5kZXggPCA0KQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dFJlZ2lvbiB0YWdBdHRyTmFtZVJlZ2lvbiA9IHJlZ2lvbkxpc3QuZ2V0KGN1cnJlbnRJbmRleCAtIDIpOwotCQkKLQkJYm9vbGVhbiBpc0V2ZW50ID0gZmFsc2U7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCWludCBzdGFydCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQodGFnQXR0ck5hbWVSZWdpb24pOwotCQkJZm9yIChpbnQgaSA9IDA7ICFpc0V2ZW50ICYmIGkgPCBFVkVOVF9BVFRSSUJVVEVfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlpc0V2ZW50ID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZlN0cnVjdHVyZWREb2N1bWVudCkucmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uoc3RhcnQsIHRhZ0F0dHJOYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgRVZFTlRfQVRUUklCVVRFX05BTUVTW2ldKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyB0YWdBdHRyTmFtZSA9IG5vZGUuZ2V0VGV4dCh0YWdBdHRyTmFtZVJlZ2lvbik7Ci0JCQlpc0V2ZW50ID0gU3RyaW5nVXRpbHMuY29udGFpbnMoRVZFTlRfQVRUUklCVVRFX05BTUVTLCB0YWdBdHRyTmFtZSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBpc0V2ZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdEVycm9ySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Fic3RyYWN0RXJyb3JJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOWQ4NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Fic3RyYWN0RXJyb3JJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5FcnJvckluZm87Ci0KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXJyb3JJbmZvIGltcGxlbWVudHMgRXJyb3JJbmZvLCBFcnJvclN0YXRlIHsKLQotCi0JcHJpdmF0ZSBpbnQgc3RhdGUgPSBOT05FX0VSUk9SOwotCXByaXZhdGUgU2VnbWVudCBzZWcgPSBudWxsOwotCi0JcHVibGljIEFic3RyYWN0RXJyb3JJbmZvKGludCBzdGF0ZSwgU2VnbWVudCBzZWcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGF0ZSA9IHN0YXRlOwotCQl0aGlzLnNlZyA9IHNlZzsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldEhpbnQoKTsKLQotCWFic3RyYWN0IHB1YmxpYyBzaG9ydCBnZXRUYXJnZXRUeXBlKCk7Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIChzZWcgPT0gbnVsbCkgPyAwIDogc2VnLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gKHNlZyA9PSBudWxsKSA/IDAgOiBzZWcuZ2V0T2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RhdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODA5YWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9DTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5LkhNUVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1maW5hbCBjbGFzcyBDTVV0aWwgewotCi0JLyoqCi0JICogTmV2ZXIgaW5zdGFudGlhdGUhCi0JICovCi0JcHJpdmF0ZSBDTVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogWW91IGNhbm5vdCBhbHdheXMgcmV0cmlldmUgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiB2aWEgYW4gRWxlbWVudCBpbnN0YW5jZS4KLQkgKiBCZWNhdXNlLCBpdCBvY2Nhc2lvbmFsbHkgYSBKU1AgY3VzdG9tIHRhZy4gLS0gOS83LzIwMDEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCU1vZGVsUXVlcnkgcXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvYyk7Ci0JCXJldHVybiBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gISgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZChDTUNvbnRlbnQgY29udGVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gdGFyZ2V0KSB7Ci0JCXN3aXRjaCAoY29udGVudC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQlpZiAoaXNXaG9sZVRhZ09taXNzaWJsZSgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNvbnRlbnQpKQotCQkJCQlpZiAoaXNDaGlsZCgoKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50KS5nZXRDb250ZW50KCksIHRhcmdldCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gaXNTYW1lRGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50LCB0YXJnZXQpOwotCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSAoKENNR3JvdXApIGNvbnRlbnQpLmdldENoaWxkTm9kZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJQ01Ob2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQkJCQlpZiAoaXNXaG9sZVRhZ09taXNzaWJsZSgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkKSkKLQkJCQkJCQkJaWYgKGlzQ2hpbGQoKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQpLmdldENvbnRlbnQoKSwgdGFyZ2V0KSkKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQkJCQlpZiAoaXNDaGlsZCgoQ01Db250ZW50KSBjaGlsZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJfQotCQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5kVGFnT21pc3NpYmxlKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCEoZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgb21pdFR5cGUgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJcmV0dXJuICFvbWl0VHlwZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9OT05FKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaG9sZVRhZ09taXNzaWJsZShDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmICghKGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG9taXRUeXBlID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCXJldHVybiBvbWl0VHlwZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIKTsKLQl9Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hIVE1MKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWV0aG9kIHRvIGRpc3Rpbmd1aXNoIEhUTUwgYW5kIFhIVE1MIGZyb20gb3RoZXIgbWFyayB1cC4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBpcywKLQkgKiAoMSkgbm90IEpTUCwKLQkgKiAoMikgbm90IFNTSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIVE1MKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJcmV0dXJuICghaXNKU1AoZGVjbCkpICYmICghaXNTU0koZGVjbCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYW1lRGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gYURlYywgQ01FbGVtZW50RGVjbGFyYXRpb24gb3RoZXJEZWMpIHsKLQkJcmV0dXJuIGFEZWMuZ2V0RWxlbWVudE5hbWUoKSA9PSBvdGhlckRlYy5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NTSShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjKSB7Ci0JCWlmIChlZGVjID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZWRlYy5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGVkZWMuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsIHRoaXMgbWV0aG9kIG9ubHkgd2hlbiB0aGUgcGFyZW50IGNvbnRlbnQgdHlwZSBpcyBvbmUgb2YKLQkgKiB0aGUgZm9sbG93aW5nOiBBTlksIEVMRU1FTlQsIG9yIE1JWEVELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2hpbGQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzSFRNTChwYXJlbnQpICYmICghaXNIVE1MKGNoaWxkKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJQ01Db250ZW50IGNvbnRlbnQgPSBwYXJlbnQuZ2V0Q29udGVudCgpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNDaGlsZChjb250ZW50LCBjaGlsZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRm9yZWlnbihFbGVtZW50IHRhcmdldCkgewotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgdGFyZ2V0OwotCQlyZXR1cm4gIWVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCSAqICgxKSB2YWx1ZSB0eXBlIGlzIEVOVU0sCi0JICogKDIpIG9ubHkgb25lIHZhbHVlIGlzIGRlZmluZWQgaW4gdGhlIGVudW1lcmF0aW9uLAotCSAqICgzKSB0aGUgdmFsdWUgaGFzIHNhbWUgbmFtZSB0byB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm9vbGVhbkF0dHIoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjKSB7Ci0JCUNNRGF0YVR5cGUgYXR0cnR5cGUgPSBhZGVjLmdldEF0dHJUeXBlKCk7Ci0JCWlmIChhdHRydHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXR0cnR5cGUuZ2V0RGF0YVR5cGVOYW1lKCkgIT0gQ01EYXRhVHlwZS5FTlVNKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSBhdHRydHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2YWx1ZXNbMF0uZXF1YWxzKGFkZWMuZ2V0QXR0ck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJbmNsdXNpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgRWxlbWVudCBwYXJlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IEhNUVV0aWwuZ2V0SW5jbHVzaW9ucyhwYXJlbnQpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gaW5jbHVzaW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbihkZWNsLCBpbmNsdXNpb24pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQ29tcG9zaXRlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQ29tcG9zaXRlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTc1MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NvbXBvc2l0ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1hYnN0cmFjdCBjbGFzcyBDb21wb3NpdGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uQ29tcG9uZW50IHsKLQotCXByb3RlY3RlZCBWZWN0b3IgY29tcG9uZW50cyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIENvbXBvc2l0ZVZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQotCQlJdGVyYXRvciBpID0gY29tcG9uZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRpb25BZGFwdGVyIGNvbXBvbmVudCA9IChWYWxpZGF0aW9uQWRhcHRlcikgaS5uZXh0KCk7Ci0JCQlpZiAoY29tcG9uZW50ID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQljb21wb25lbnQuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCUl0ZXJhdG9yIGkgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJVmFsaWRhdGlvbkNvbXBvbmVudCBjb21wb25lbnQgPSAoVmFsaWRhdGlvbkNvbXBvbmVudCkgaS5uZXh0KCk7Ci0JCQlpZiAoY29tcG9uZW50ID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQljb21wb25lbnQudmFsaWRhdGUobm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGFkZChWYWxpZGF0aW9uQ29tcG9uZW50IHZhbGlkYXRvcikgewotCQljb21wb25lbnRzLmFkZCh2YWxpZGF0b3IpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlZ2lzdGVycyBhbGwgY29tcG9uZW50cyBpbiAndmFsaWRhdG9ycycuCi0JICogRWFjaCBkZXJpdmF0aXZlIG11c3QgY2FsbCB0aGlzIG1ldGhpZCBpbiBpdHMgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXIoVmFsaWRhdGlvbkNvbXBvbmVudFtdIHZhbGlkYXRvcnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodmFsaWRhdG9yc1tpXSAhPSBudWxsKQotCQkJCWFkZCh2YWxpZGF0b3JzW2ldKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjI5MTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLkFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWNsYXNzIERvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yIHsKLQotCi0JcHJpdmF0ZSBWYWxpZGF0aW9uQ29tcG9uZW50IHZhbGlkYXRvciA9IG5ldyBIVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IoKTsKLQlwcml2YXRlIEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvciBwcm9wYWdhdGVlID0gbmV3IEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvcigpOwotCi0JcHVibGljIERvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCWdldFByb3BhZ2F0ZWUoKS5zZXRSZXBvcnRlcih0aGlzLnJlcG9ydGVyKTsKLQkJc3VwZXIudmFsaWRhdGUobm9kZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5jbGFzcyB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCQl2YWxpZGF0b3Iuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCQlwcm9wYWdhdGVlLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdGlvbkNvbXBvbmVudCBnZXRQcm9wYWdhdGVlKCkgewotCQlyZXR1cm4gcHJvcGFnYXRlZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdGlvbkFkYXB0ZXIgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5MGI2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLkFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWNsYXNzIEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IgewotCi0KLQlwcml2YXRlIFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yID0gbmV3IEhUTUxTaW1wbGVWYWxpZGF0b3IoKTsKLQotCXB1YmxpYyBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmNsYXNzIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JCXZhbGlkYXRvci5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25Db21wb25lbnQgZ2V0UHJvcGFnYXRlZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25BZGFwdGVyIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRXJyb3JJbmZvSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mb0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxMGExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRXJyb3JJbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLWZpbmFsIGNsYXNzIEVycm9ySW5mb0ltcGwgZXh0ZW5kcyBBYnN0cmFjdEVycm9ySW5mbyB7Ci0KLQlwcml2YXRlIE5vZGUgdGFyZ2V0ID0gbnVsbDsKLQotCS8vCXByaXZhdGUgU2VnbWVudCBzZWcgPSBudWxsOwotCS8qKgotCSAqLwotCXB1YmxpYyBFcnJvckluZm9JbXBsKGludCBzdGF0ZSwgU2VnbWVudCBlcnJvclNlZywgTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIoc3RhdGUsIGVycm9yU2VnKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIaW50KCkgewotCQlzd2l0Y2ggKHRhcmdldC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotCQkJCXN3aXRjaCAoZ2V0U3RhdGUoKSkgewotCQkJCQljYXNlIFVOREVGSU5FRF9WQUxVRV9FUlJPUiA6Ci0JCQkJCWNhc2UgTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUiA6Ci0JCQkJCWNhc2UgVU5DTE9TRURfQVRUUl9WQUxVRSA6Ci0JCQkJCWNhc2UgUkVTT1VSQ0VfTk9UX0ZPVU5EIDoKLQkJCQkJCS8vRDIxMDQyMgotCQkJCQkJcmV0dXJuICgoQXR0cikgdGFyZ2V0KS5nZXRWYWx1ZSgpOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXJldHVybiB0YXJnZXQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlyZXR1cm4gKChUZXh0KSB0YXJnZXQpLmdldERhdGEoKTsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHRhcmdldC5nZXROb2RlTmFtZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHNob3J0IGdldFRhcmdldFR5cGUoKSB7Ci0JCXJldHVybiB0YXJnZXQuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRXJyb3JTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9yU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxODNlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRXJyb3JTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbnRlcmZhY2UgRXJyb3JTdGF0ZSB7Ci0Jc3RhdGljIGZpbmFsIGludCBOT05FX0VSUk9SID0gMDsKLQkvLyBnZW5lcmljIGVycm9yCi0Jc3RhdGljIGZpbmFsIGludCBVTkRFRklORURfTkFNRV9FUlJPUiA9IDExOwotCXN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEX1ZBTFVFX0VSUk9SID0gMTI7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNNQVRDSEVEX1ZBTFVFX0VSUk9SID0gMTM7Ci0JLy8gZm9ybWF0IGVycm9yCi0Jc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRVJST1JfTEVWRUwgPSAxMDA7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX05BTUVfRVJST1IgPSAxMDE7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0NIQVJfRVJST1IgPSAxMDI7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNNQVRDSEVEX0VSUk9SID0gMTAzOwotCXN0YXRpYyBmaW5hbCBpbnQgTUlTTUFUQ0hFRF9FTkRfVEFHX0VSUk9SID0gMTA0OwotCXN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19TVEFSVF9UQUdfRVJST1IgPSAxMDU7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNTSU5HX0VORF9UQUdfRVJST1IgPSAxMDY7Ci0Jc3RhdGljIGZpbmFsIGludCBVTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SID0gMTA3OwotCXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9BVFRSX0VSUk9SID0gMTA4OwotCXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9ESVJFQ1RJVkVfRVJST1IgPSAxMDk7Ci0Jc3RhdGljIGZpbmFsIGludCBVTkNMT1NFRF9UQUdfRVJST1IgPSAxMTA7Ci0Jc3RhdGljIGZpbmFsIGludCBVTkNMT1NFRF9FTkRfVEFHX0VSUk9SID0gMTExOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRyA9IDExMjsKLQlzdGF0aWMgZmluYWwgaW50IFVOQ0xPU0VEX0FUVFJfVkFMVUUgPSAxMTM7IC8vRDIxMDQyMgotCXN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfTk9UX0ZPVU5EID0gMTE0OyAvL0QyMTA0MjIKLQkvLyBsYXlvdXQgZXJyb3IKLQlzdGF0aWMgZmluYWwgaW50IExBWU9VVF9FUlJPUl9MRVZFTCA9IDEwMDA7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0NPTlRFTlRfRVJST1IgPSAxMDAxOwotCXN0YXRpYyBmaW5hbCBpbnQgRFVQTElDQVRFX0VSUk9SID0gMTAwMjsKLQlzdGF0aWMgZmluYWwgaW50IENPRVhJU1RFTkNFX0VSUk9SID0gMTAwMzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9GTVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9GTVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlZTAyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRk1VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1maW5hbCBjbGFzcyBGTVV0aWwgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VHX05PTkUgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19XSE9MRV9UQUcgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19TVEFSVF9UQUcgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19FTkRfVEFHID0gMzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfU1RBUlRfVEFHX05BTUUgPSA0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19FTkRfVEFHX05BTUUgPSA1OwotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBGTVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTZWdtZW50IGdldFNlZ21lbnQoSURPTU5vZGUgdGFyZ2V0LCBpbnQgc2VnVHlwZSkgewotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFNlZ21lbnQoMCwgMCk7Ci0JCVNlZ21lbnQgc2VnID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnID0gbnVsbDsKLQkJc3dpdGNoIChzZWdUeXBlKSB7Ci0JCQljYXNlIFNFR19XSE9MRV9UQUcgOgotCQkJCXN0YXJ0VGFnID0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCQkJZW5kVGFnID0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQoc3RhcnRUYWcsIGVuZFRhZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSB0YXJnZXQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJaW50IGVuZE9mZnNldCA9IHRhcmdldC5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNFR19TVEFSVF9UQUcgOgotCQkJCXN0YXJ0VGFnID0gdGFyZ2V0LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQoc3RhcnRUYWcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQodGFyZ2V0LmdldFN0YXJ0T2Zmc2V0KCksIDEpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU0VHX0VORF9UQUcgOgotCQkJCWVuZFRhZyA9IHRhcmdldC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kVGFnICE9IG51bGwpIHsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQoZW5kVGFnKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNlZyA9IG5ldyBTZWdtZW50KHRhcmdldC5nZXRFbmRPZmZzZXQoKSwgMSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTRUdfU1RBUlRfVEFHX05BTUUgOgotCQkJCXN0YXJ0VGFnID0gdGFyZ2V0LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oc3RhcnRUYWcpOwotCQkJCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydFRhZy5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChzZWcgPT0gbnVsbCkgewotCQkJCQlzZWcgPSBnZXRTZWdtZW50KHRhcmdldCwgU0VHX1NUQVJUX1RBRyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTRUdfRU5EX1RBR19OQU1FIDoKLQkJCQllbmRUYWcgPSB0YXJnZXQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKGVuZFRhZyk7Ci0JCQkJCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCXNlZyA9IG5ldyBTZWdtZW50KGVuZFRhZy5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChzZWcgPT0gbnVsbCkgewotCQkJCQlzZWcgPSBnZXRTZWdtZW50KHRhcmdldCwgU0VHX0VORF9UQUcpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU0VHX05PTkUgOgotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG5ldyBTZWdtZW50KDAsIDApOwotCQl9Ci0JCXJldHVybiBzZWc7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmFtZVJlZ2lvbiA9IHI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWVSZWdpb24gOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MQXR0cmlidXRlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMmZlZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotcHVibGljIGNsYXNzIEhUTUxBdHRyaWJ1dGVWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVHSU9OX05BTUUgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUdJT05fVkFMVUUgPSAyOwotCS8vIDw8RDIxMDQyMgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7Ci0KLQkvLyBEMjEwNDIyCi0JLyoqCi0JICogSFRNTEF0dHJpYnV0ZVZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MQXR0cmlidXRlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU2VnbWVudCBnZXRFcnJvclNlZ21lbnQoSURPTU5vZGUgZXJyb3JOb2RlLCBpbnQgcmVnaW9uVHlwZSkgewotCQlJVGV4dFJlZ2lvbiByZ24gPSBudWxsOwotCQlzd2l0Y2ggKHJlZ2lvblR5cGUpIHsKLQkJCWNhc2UgUkVHSU9OX05BTUUgOgotCQkJCXJnbiA9IGVycm9yTm9kZS5nZXROYW1lUmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl9WQUxVRSA6Ci0JCQkJcmduID0gZXJyb3JOb2RlLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvLgotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChyZ24gIT0gbnVsbCkgewotCQkJaWYgKGVycm9yTm9kZSBpbnN0YW5jZW9mIElET01BdHRyKSB7Ci0JCQkJSURPTUVsZW1lbnQgb3duZXJFbGVtZW50ID0gKElET01FbGVtZW50KSAoKElET01BdHRyKSBlcnJvck5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJCWlmIChvd25lckVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBvd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZ24pOwotCQkJCQlpbnQgcmVnaW9uTGVuZ3RoID0gcmduLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJcmV0dXJuIG5ldyBTZWdtZW50KHJlZ2lvblN0YXJ0T2Zmc2V0LCByZWdpb25MZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFNlZ21lbnQoZXJyb3JOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIDEpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlFbGVtZW50IHRhcmdldCA9IChFbGVtZW50KSBub2RlOwotCQlpZiAoQ01VdGlsLmlzRm9yZWlnbih0YXJnZXQpKQotCQkJcmV0dXJuOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCWlmIChlZGVjID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNNTmFtZWROb2RlTWFwIGRlY2xhcmF0aW9ucyA9IGVkZWMuZ2V0QXR0cmlidXRlcygpOwotCi0JCUxpc3QgbW9kZWxRdWVyeU5vZGVzID0gbnVsbDsKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gdGFyZ2V0LmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpbnQgcmduVHlwZSA9IFJFR0lPTl9OQU1FOwotCQkJaW50IHN0YXRlID0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SOwotCQkJQXR0ciBhID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkvLyBEMjAzNjM3OyBJZiB0aGUgdGFyZ2V0IGF0dHIgaGFzIHByZWZpeCwgdGhlIHZhbGlkYXRvciBzaG91bGQKLQkJCS8vIG5vdAotCQkJLy8gd2FybiBhYm91dCBpdC4gVGhhdCBpcywganVzdCBpZ25vcmUuIEl0IGlzIGFibGUgdG8gY2hlY2sKLQkJCS8vIHdoZXRoZXIKLQkJCS8vIGFuIGF0dHIgaGFzIHByZWZpeCBvciBub3QgYnkgY2FsbGluZyBYTUxBdHRyI2lzR2xvYmFsQXR0cigpLgotCQkJLy8gV2hlbiBhIGF0dHIgaGFzIHByZWZpeCAobm90IGdsb2JhbCksIGl0IHJldHVybnMgZmFsc2UuCi0JCQlib29sZWFuIGlzWE1MQXR0ciA9IGEgaW5zdGFuY2VvZiBJRE9NQXR0cjsKLQkJCWlmIChpc1hNTEF0dHIpIHsKLQkJCQlJRE9NQXR0ciB4bWxhdHRyID0gKElET01BdHRyKSBhOwotCQkJCWlmICgheG1sYXR0ci5pc0dsb2JhbEF0dHIoKSkKLQkJCQkJY29udGludWU7IC8vIHNraXAgZnV0aGVyIHZhbGlkYXRpb24gYW5kIGJlZ2luIG5leHQgbG9vcC4KLQkJCX0KLQotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9ucy5nZXROYW1lZEl0ZW0oYS5nZXROYW1lKCkpOwotCQkJCi0JCQkvKiBDaGVjayB0aGUgbW9kZWxxdWVyeSBpZiBub3RoaW5nIGlzIGRlY2xhcmVkIGJ5IHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uICovCi0JCQlpZiAoYWRlYyA9PSBudWxsKSB7Ci0JCQkJaWYgKG1vZGVsUXVlcnlOb2RlcyA9PSBudWxsKQotCQkJCQltb2RlbFF1ZXJ5Tm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHRhcmdldC5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVkZWMsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQkKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBhLmdldE5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbW9kZWxRdWVyeU5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBtb2RlbFF1ZXJ5Tm9kZXMuZ2V0KGspOwotCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiAmJiBjbW5vZGUuZ2V0Tm9kZU5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCWFkZWMgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21ub2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChhZGVjID09IG51bGwpIHsKLQkJCQkvLyBObyBhdHRyIGRlY2xhcmF0aW9uIHdhcyBmb3VuZC4gVGhhdCBpcywgdGhlIGF0dHIgbmFtZSBpcwotCQkJCS8vIHVuZGVmaW5lZC4KLQkJCQkvLyBidXQgbm90IHJlZ2FyZCBpdCBhcyB1bmRlZmluZWQgbmFtZSBpZiBpdCBpbmNsdWRlcyBuZXN0ZWQKLQkJCQkvLyByZWdpb24KLQkJCQlpZiAoIWhhc05lc3RlZFJlZ2lvbigoKElET01Ob2RlKSBhKS5nZXROYW1lUmVnaW9uKCkpKSB7Ci0JCQkJCXJnblR5cGUgPSBSRUdJT05fTkFNRTsKLQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLlVOREVGSU5FRF9OQU1FX0VSUk9SOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVGhlIGF0dHIgZGVjbGFyYXRpb24gd2FzIGZvdW5kLgotCQkJCS8vIEF0IDFzdCwgdGhlIG5hbWUgc2hvdWxkIGJlIGNoZWNrZWQuCi0JCQkJaWYgKENNVXRpbC5pc0hUTUwoZWRlYykgJiYgKCFDTVV0aWwuaXNYSFRNTChlZGVjKSkpIHsKLQkJCQkJLy8gSWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIHB1cmUgSFRNTCAobm90IFhIVE1MKSwgc29tZQotCQkJCQkvLyBhdHRyaWJ1dGVzCi0JCQkJCS8vIG1pZ2h0IGJlIHdyaXR0ZW4gaW4gYm9vbGVhbiBmb3JtYXQuIEl0IHNob3VsZCBiZSBjaGVjawotCQkJCQkvLyBzcGVjaWZpY2FsbHkuCi0JCQkJCWlmIChDTVV0aWwuaXNCb29sZWFuQXR0cihhZGVjKSAmJiAoKElET01BdHRyKSBhKS5oYXNOYW1lT25seSgpKQotCQkJCQkJY29udGludWU7IC8vIE9LLCBrZWVwIGdvaW5nLiBObyBtb3JlIGNoZWNrIGlzIG5lZWRlZAotCQkJCQkvLyBhZ2FpbnN0IHRoaXMgYXR0ci4KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBJZiB0aGUgdGFyZ2V0IGlzIG90aGVyIHRoYW4gcHVyZSBIVE1MIChKU1Agb3IgWEhUTUwpLAotCQkJCQkvLyB0aGUgbmFtZQotCQkJCQkvLyBtdXN0IGJlIGNoZWNrZWQgZXhhY3RseSAoaWUgaW4gY2FzZSBzZW5zaXRpdmUgd2F5KS4KLQkJCQkJU3RyaW5nIGFjdHVhbCA9IGEuZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgZGVzaXJlZCA9IGFkZWMuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJaWYgKCFhY3R1YWwuZXF1YWxzKGRlc2lyZWQpKSB7IC8vIGNhc2UgbWlzbWF0Y2gKLQkJCQkJCXJnblR5cGUgPSBSRUdJT05fTkFNRTsKLQkJCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5NSVNNQVRDSEVEX0VSUk9SOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIFRoZW4sIHRoZSB2YWx1ZSBtdXN0IGJlIGNoZWNrZWQuCi0JCQkJaWYgKHN0YXRlID09IEVycm9yU3RhdGUuTk9ORV9FUlJPUikgeyAvLyBOZWVkIG1vcmUgY2hlY2suCi0JCQkJCS8vIE5vdywgdGhlIHZhbHVlIHNob3VsZCBiZSBjaGVja2VkLCBpZiB0aGUgdHlwZSBpcyBFTlVNLgotCQkJCQlDTURhdGFUeXBlIGF0dHJUeXBlID0gYWRlYy5nZXRBdHRyVHlwZSgpOwotCQkJCQlTdHJpbmcgYWN0dWFsVmFsdWUgPSBhLmdldFZhbHVlKCk7Ci0JCQkJCWlmIChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgPT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0ZJWEVEKSB7Ci0JCQkJCQkvLyBDaGVjayBGSVhFRCB2YWx1ZS4KLQkJCQkJCVN0cmluZyB2YWxpZFZhbHVlID0gYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCQkJCQlpZiAoIWFjdHVhbFZhbHVlLmVxdWFscyh2YWxpZFZhbHVlKSkgewotCQkJCQkJCXJnblR5cGUgPSBSRUdJT05fVkFMVUU7Ci0JCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLlVOREVGSU5FRF9WQUxVRV9FUlJPUjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChDTURhdGFUeXBlLlVSSS5lcXVhbHMoYXR0clR5cGUuZ2V0RGF0YVR5cGVOYW1lKCkpKSB7Ci0JCQkJCQkvLyBUT0RPOiBVUkkgdmFsaWRhdGlvbj8KLQkJCQkJCWlmIChmYWxzZSAmJiBhY3R1YWxWYWx1ZS5pbmRleE9mKCcjJykgPCAwICYmIGFjdHVhbFZhbHVlLmluZGV4T2YoIjovIikgPT0gLTEgJiYgQ01VdGlsLmlzSFRNTChlZGVjKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQlpZiAoc3RhcnQgIT0gbnVsbCAmJiBzdGFydC5nZXRGaXJzdFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKSA9PSAxKSB7Ci0JCQkJCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJCQkJCUlQYXRoIHBhdGggPSBNb2R1bGVDb3JlU3VwcG9ydC5yZXNvbHZlKGJhc2VQYXRoLCBhY3R1YWxWYWx1ZSk7Ci0JCQkJCQkJCQlJUmVzb3VyY2UgZm91bmQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7Ci0JCQkJCQkJCQlpZiAoZm91bmQgPT0gbnVsbCB8fCAhZm91bmQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5SRVNPVVJDRV9OT1RfRk9VTkQ7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBDaGVjayBjdXJyZW50IHZhbHVlIGlzIHZhbGlkIGFtb25nIGEga25vd24gbGlzdAotCQkJCQkJU3RyaW5nW10gY2FuZGlkYXRlcyA9IGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQkJCQkJCWlmIChjYW5kaWRhdGVzICE9IG51bGwgJiYgY2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJLy8gc2V2ZXJhbCBjYW5kaWRhdGVzIGFyZSBmb3VuZC4KLQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJCQkJCVN0cmluZyBjYW5kaWRhdGUgPSBjYW5kaWRhdGVzW2luZGV4XTsKLQkJCQkJCQkJLy8gQXQgMXN0LCBjb21wYXJlIGlnbm9yaW5nIGNhc2UuCi0JCQkJCQkJCWlmIChhY3R1YWxWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKGNhbmRpZGF0ZSkpIHsKLQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCWlmIChDTVV0aWwuaXNDYXNlU2Vuc2l0aXZlKGVkZWMpICYmICghYWN0dWFsVmFsdWUuZXF1YWxzKGNhbmRpZGF0ZSkpKSB7Ci0JCQkJCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9WQUxVRTsKLQkJCQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrOyAvLyBleGl0IHRoZSBsb29wLgotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCQkJLy8gTm8gY2FuZGlkYXRlIHdhcyBmb3VuZC4gVGhhdCBpcywKLQkJCQkJCQkJLy8gYWN0dWFsVmFsdWUgaXMgaW52YWxpZC4KLQkJCQkJCQkJLy8gYnV0IG5vdCByZWdhcmQgaXQgYXMgdW5kZWZpbmVkIHZhbHVlIGlmIGl0Ci0JCQkJCQkJCS8vIGluY2x1ZGVzIG5lc3RlZCByZWdpb24uCi0JCQkJCQkJCWlmICghaGFzTmVzdGVkUmVnaW9uKCgoSURPTU5vZGUpIGEpLmdldFZhbHVlUmVnaW9uKCkpKSB7Ci0JCQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLlVOREVGSU5FRF9WQUxVRV9FUlJPUjsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGF0dHJUeXBlLmdldERhdGFUeXBlTmFtZSgpID09IENNRGF0YVR5cGUuVVJJKSB7Ci0JCQkJCQkJLy8gVE9ETzogVVJJIHZhbGlkYXRpb24/Ci0JCQkJCQkJaWYgKGZhbHNlICYmIGFjdHVhbFZhbHVlLmluZGV4T2YoJyMnKSA8IDAgJiYgYWN0dWFsVmFsdWUuaW5kZXhPZigiOi8iKSA9PSAtMSAmJiBDTVV0aWwuaXNIVE1MKGVkZWMpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQkJaWYgKHN0YXJ0ICE9IG51bGwgJiYgc3RhcnQuZ2V0Rmlyc3RSZWdpb24oKS5nZXRUZXh0TGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aCgoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCQkJCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJCQkJCQlJUGF0aCBwYXRoID0gTW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShiYXNlUGF0aCwgYWN0dWFsVmFsdWUpOwotCQkJCQkJCQkJCUlSZXNvdXJjZSBmb3VuZCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsKLQkJCQkJCQkJCQlpZiAoZm91bmQgPT0gbnVsbCB8fCAhZm91bmQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9WQUxVRTsKLQkJCQkJCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLlJFU09VUkNFX05PVF9GT1VORDsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gPDxEMjEwNDIyCi0JCQkJaWYgKHN0YXRlID09IEVycm9yU3RhdGUuTk9ORV9FUlJPUikgeyAvLyBOZWVkIG1vcmUgY2hlY2suCi0JCQkJCWlmIChpc1hNTEF0dHIpIHsKLQkJCQkJCVN0cmluZyBzb3VyY2UgPSAoKElET01BdHRyKSBhKS5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gc291cmNlLmNoYXJBdCgwKTsKLQkJCQkJCQljaGFyIGxhc3RDaGFyID0gc291cmNlLmNoYXJBdChzb3VyY2UubGVuZ3RoKCkgLSAxKTsKLQkJCQkJCQlpZiAoaXNRdW90ZShmaXJzdENoYXIpIHx8IGlzUXVvdGUobGFzdENoYXIpKSB7Ci0JCQkJCQkJCWlmIChsYXN0Q2hhciAhPSBmaXJzdENoYXIpIHsKLQkJCQkJCQkJCXJnblR5cGUgPSBSRUdJT05fVkFMVUU7Ci0JCQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuVU5DTE9TRURfQVRUUl9WQUxVRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBEMjEwNDIyCi0JCQl9Ci0JCQlpZiAoc3RhdGUgIT0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SKSB7Ci0JCQkJU2VnbWVudCBzZWcgPSBnZXRFcnJvclNlZ21lbnQoKElET01Ob2RlKSBhLCByZ25UeXBlKTsKLQkJCQlpZiAoc2VnICE9IG51bGwpCi0JCQkJCXJlcG9ydGVyLnJlcG9ydChuZXcgRXJyb3JJbmZvSW1wbChzdGF0ZSwgc2VnLCBhKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUcnVlIGlmIGNvbnRhaW5lciBoYXMgbmVzdGVkIHJlZ2lvbnMsIG1lYW5pbmcgY29udGFpbmVyIGlzIHByb2JhYmx5IHRvbwotCSAqIGNvbXBsaWNhdGVkIChsaWtlIEpTUCByZWdpb25zKSB0byB2YWxpZGF0ZSB3aXRoIHRoaXMgdmFsaWRhdG9yLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNOZXN0ZWRSZWdpb24oSVRleHRSZWdpb24gY29udGFpbmVyKSB7Ci0JCWlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb250YWluZXIpLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gQlVHMjA3MTk0OiByZXR1cm4gdHJ1ZSBieSBkZWZhdWx0IGFzIGxvbmcgYXMgY29udGFpbmVyIGlzIGFuCi0JCS8vIElUZXh0UmVnaW9uQ29udGFpbmVyIHdpdGggYXQgbGVhc3QgMSByZWdpb24KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gPDxEMjE0MDIyCi0JcHJpdmF0ZSBib29sZWFuIGlzUXVvdGUoY2hhciBjKSB7Ci0JCXJldHVybiAoYyA9PSBTSU5HTEVfUVVPVEUpIHx8IChjID09IERPVUJMRV9RVU9URSk7Ci0JfQotCS8vIEQyMTA0MjIKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjZjYWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciB7Ci0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIERpdmlzaW9uIHsKLQkJcHJpdmF0ZSBWZWN0b3IgZXhwbGljaXRIdG1scyA9IG5ldyBWZWN0b3IoKTsKLQkJcHJpdmF0ZSBWZWN0b3IgcmVzdCA9IG5ldyBWZWN0b3IoKTsKLQotCQlwdWJsaWMgRGl2aXNpb24oRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGVMaXN0IGNoaWxkcmVuKSB7Ci0JCQlTdHJpbmcgcm9vdFRhZ05hbWUgPSBnZXRSb290VGFnTmFtZShkb2N1bWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQlpZiAoaXNIdG1sVGFnKGNoaWxkLCByb290VGFnTmFtZSkpIHsKLQkJCQkJZXhwbGljaXRIdG1scy5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdC5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0V4cGxpY2l0SHRtbHMoKSB7Ci0JCQlyZXR1cm4gZXhwbGljaXRIdG1scy5zaXplKCkgPiAwOwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0RXhwbGljaXRIdG1scygpIHsKLQkJCXJldHVybiBleHBsaWNpdEh0bWxzOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGdldFJlc3ROb2RlcygpIHsKLQkJCXJldHVybiByZXN0Lml0ZXJhdG9yKCk7Ci0JCX0KLQotCQkvKiB1dGlsaXRpZXMgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0h0bWxUYWcoTm9kZSBub2RlLCBTdHJpbmcgdGFnTmFtZSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBub2RlKS5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKTsKLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSb290VGFnTmFtZShEb2N1bWVudCBkb2N1bWVudCkgewotCQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpICgoSURPTURvY3VtZW50KSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGFkYXB0ZXIuZ2V0RG9jdW1lbnRUeXBlKCk7Ci0JCQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZG9jVHlwZS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCS8vIGlzRnJhZ21lbnQgY2hlY2sgc2hvdWxkIGJlIG1vcmUgaW50ZWxsaWdlbnQuCi0JCWJvb2xlYW4gaXNGcmFnbWVudCA9IHRydWU7Ci0KLQkJRG9jdW1lbnQgdGFyZ2V0ID0gKERvY3VtZW50KSBub2RlOwotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHRhcmdldC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCURpdmlzaW9uIGRpdmlzaW9uID0gbmV3IERpdmlzaW9uKHRhcmdldCwgY2hpbGRyZW4pOwotCQlpZiAoZGl2aXNpb24uaGFzRXhwbGljaXRIdG1scygpKSB7Ci0JCQlpc0ZyYWdtZW50ID0gZmFsc2U7Ci0KLQkJCUxpc3QgZXhwbGljaXRzID0gZGl2aXNpb24uZ2V0RXhwbGljaXRIdG1scygpOwotCQkJaWYgKGV4cGxpY2l0cy5zaXplKCkgPiAxKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBleHBsaWNpdHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJRWxlbWVudCBodG1sID0gKEVsZW1lbnQpIGV4cGxpY2l0cy5nZXQoaSk7Ci0JCQkJCS8vIHJlcG9ydCBlcnJvciAoZHVwbGljYXRlKQotCQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoKElET01Ob2RlKSBodG1sLCBGTVV0aWwuU0VHX1NUQVJUX1RBRyk7Ci0JCQkJCWlmIChlcnJvclNlZyAhPSBudWxsKQotCQkJCQkJcmVwb3J0ZXIucmVwb3J0KG5ldyBFcnJvckluZm9JbXBsKEVycm9yU3RhdGUuRFVQTElDQVRFX0VSUk9SLCBlcnJvclNlZywgaHRtbCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl2YWxpZGF0ZUNvbnRlbnQoZGl2aXNpb24uZ2V0UmVzdE5vZGVzKCksIGlzRnJhZ21lbnQpOwotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2RzIHZhbGlkYXRlIG5vZGVzIG90aGVyIHRoYW4gSFRNTCBlbGVtZW50cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVDb250ZW50KEl0ZXJhdG9yIGNoaWxkcmVuLCBib29sZWFuIGlzRnJhZ21lbnQpIHsKLQkJYm9vbGVhbiBmb3VuZERvY3R5cGUgPSBmYWxzZTsKLQkJd2hpbGUgKGNoaWxkcmVuLmhhc05leHQoKSkgewotCQkJSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIGNoaWxkcmVuLm5leHQoKTsKLQotCQkJaW50IGVycm9yID0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SOwotCQkJaW50IHNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQotCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJCWlmICghaXNGcmFnbWVudCkgewotCQkJCQkJRWxlbWVudCBjaGlsZEVsZW0gPSAoRWxlbWVudCkgY2hpbGQ7Ci0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjZWQgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24oY2hpbGRFbGVtKTsKLQkJCQkJCS8vIFVuZGVmaW5lZCBlbGVtZW50IGlzIHZhbGlkLgotCQkJCQkJaWYgKGNlZCA9PSBudWxsKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJLy8gSlNQIChpbmNsdWRlcyBjdXN0b20gdGFncykgYW5kIFNTSSBhcmUgdmFsaWQuCi0JCQkJCQlpZiAoQ01VdGlsLmlzRm9yZWlnbihjaGlsZEVsZW0pIHx8IENNVXRpbC5pc1NTSShjZWQpKQotCQkJCQkJCWNvbnRpbnVlOyAvLyBEZWZlY3QgMTg2Nzc0Ci0KLQkJCQkJCS8vIHJlcG9ydCBlcnJvciAoaW52YWxpZCBjb250ZW50KQotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCS8vIG1hcmsgdGhlIHdob2xlIHN0YXJ0IHRhZyBhcyBlcnJvci4KLQkJCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1NUQVJUX1RBRzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQkJaWYgKCFpc0ZyYWdtZW50KSB7Ci0JCQkJCQkvLyBURVhUIG5vZGUgaXMgdmFsaWQgd2hlbiBpdCBjb250YWlucyB3aGl0ZSBzcGFjZQotCQkJCQkJLy8gY2hhcmFjdGVycyBvbmx5LgotCQkJCQkJLy8gT3RoZXJ3aXNlLCBpdCBpcyBpbnZhbGlkIGNvbnRlbnQuCi0JCQkJCQlpZiAoKChJRE9NVGV4dCkgY2hpbGQpLmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCQkvLyBET0NUWVBFIGlzIGFsc28gdmFsaWQgd2hlbiBpdCBhcHBlYXJzIG9uY2UgYW5kIG9ubHkKLQkJCQkJLy8gb25jZS4KLQkJCQkJaWYgKCFmb3VuZERvY3R5cGUpIHsKLQkJCQkJCWZvdW5kRG9jdHlwZSA9IHRydWU7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQllcnJvciA9IEVycm9yU3RhdGUuRFVQTElDQVRFX0VSUk9SOwotCQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCS8vIGFsd2F5cyB2YWxpZC4KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQkJY29udGludWU7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWlmICghaXNGcmFnbWVudCkgewotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChlcnJvciAhPSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsKLQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoY2hpbGQsIHNlZ1R5cGUpOwotCQkJCWlmIChlcnJvclNlZyAhPSBudWxsKQotCQkJCQlyZXBvcnRlci5yZXBvcnQobmV3IEVycm9ySW5mb0ltcGwoZXJyb3IsIGVycm9yU2VnLCBjaGlsZCkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2MWVkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBIVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgZXhjbHVzaW9uIHdoaWNoIGlzIGRlZmluZWQgaW4gb25seSBIVE1MIERURCAoU0dNTCkuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCUVsZW1lbnQgdGFyZ2V0ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChDTVV0aWwuaXNGb3JlaWduKHRhcmdldCkpCi0JCQlyZXR1cm47Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlYyA9IENNVXRpbC5nZXREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlpZiAoZGVjID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGNhbm5vdCB2YWxpZGF0ZS4KLQkJaWYgKCFDTVV0aWwuaXNIVE1MKGRlYykpCi0JCQlyZXR1cm47IC8vIG5vIG5lZWQgdG8gdmFsaWRhdGUKLQkJaWYgKCFkZWMuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUykpCi0JCQlyZXR1cm47IC8vIGNhbm5vdCB2YWxpZGF0ZS4KLQkJQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZCA9IChDTU5hbWVkTm9kZU1hcCkgZGVjLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuUFJPSElCSVRFRF9BTkNFU1RPUlMpOwotCQlpZiAocHJvaGliaXRlZC5nZXRMZW5ndGgoKSA8PSAwKQotCQkJcmV0dXJuOyAvLyBubyBwcm9oaWJpdGVkIGFuY2VzdG9ycy4KLQotCQlFbGVtZW50IHBhcmVudCA9IFNNVXRpbC5nZXRQYXJlbnRFbGVtZW50KHRhcmdldCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQ01Ob2RlIHBkZWMgPSBwcm9oaWJpdGVkLmdldE5hbWVkSXRlbShwYXJlbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlpZiAocGRlYyAhPSBudWxsKSB7IC8vIHByb2hpYml0ZWQgZWxlbWVudCBpcyBmb3VuZCBpbiBhbmNlc3RvcnMuCi0JCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KChJRE9NTm9kZSkgbm9kZSwgRk1VdGlsLlNFR19TVEFSVF9UQUcpOwotCQkJCWlmIChlcnJvclNlZyAhPSBudWxsKQotCQkJCQlyZXBvcnRlci5yZXBvcnQobmV3IEVycm9ySW5mb0ltcGwoRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1IsIGVycm9yU2VnLCB0YXJnZXQpKTsKLQkJCQlicmVhazsgLy8gSWYgb25lIHByb2hpYml0ZWQgYW5jZXN0b3IgaXMgZm91bmQsIGl0J3MgZW5vdWdoLgotCQkJfQotCQkJcGFyZW50ID0gU01VdGlsLmdldFBhcmVudEVsZW1lbnQocGFyZW50KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhZDEyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKENNVXRpbC5pc0ZvcmVpZ24odGFyZ2V0KSkKLQkJCXJldHVybjsKLQotCQl2YWxpZGF0ZUNvbnRlbnQodGFyZ2V0LCB0YXJnZXQuZ2V0Rmlyc3RDaGlsZCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29udGVudChFbGVtZW50IHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IENNVXRpbC5nZXREZWNsYXJhdGlvbihwYXJlbnQpOwotCQlpZihlZCA9PSBudWxsIHx8IGVkLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKQotCQkJcmV0dXJuOwotCQkKLQkJTGlzdFtdIGV4dGVuZGVkQ29udGVudCA9IG5ldyBMaXN0WzFdOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJLy8gcGVyZm9ybSBhY3R1YWwgdmFsaWRhdGlvbgotCQkJdmFsaWRhdGVOb2RlKHBhcmVudCwgY2hpbGQsIGVkLCBleHRlbmRlZENvbnRlbnQpOwotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBpbnQgY291bnRFeHBsaWNpdFNpYmxpbmdzKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgdGFnTmFtZSkgewotCS8vIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkvLyBpbnQgY291bnQgPSAwOwotCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCS8vIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCS8vIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCS8vIGNvbnRpbnVlOwotCS8vIGlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoKChFbGVtZW50KSBjaGlsZCkuZ2V0VGFnTmFtZSgpKSkgewotCS8vIGNvdW50Kys7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gY291bnQ7Ci0JLy8gfQotCi0JLyoKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgcHJhY3RpY2FsIGJ1dCBhY2N1cmF0ZS4KLQkgKiBUaGUgYWNjdXJhdGUgbWF4aW11bSBvY2N1cnJlbmNlIHNob3VsZCBiZSByZXRyaWV2ZSBmcm9tIHRoZSBjb250ZW50Ci0JICogbW9kZWwuIEhvd2V2ZXIsIGl0IGlzIHVzZWZ1bCBlbm91Z2gsIHNpbmNlIGFsbW9zdCBpbXBsaWNpdCBlbGVtZW50cyBhcmUKLQkgKiBIVE1MLCBIRUFELCBvciBCT0RZLgotCSAqLwotCS8vIHByaXZhdGUgaW50IGdldE1heE9jY3VyKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgY2hpbGRUYWcpIHsKLQkvLyByZXR1cm4gMTsKLQkvLyB9Ci0KLS8vCXByaXZhdGUgYm9vbGVhbiBjb250YWluc05hbWUoU3RyaW5nIG5hbWUsIE9iamVjdFtdIHBvc3NpYmxlKSB7Ci0vLwkJaWYgKG5hbWUgIT0gbnVsbCAmJiBwb3NzaWJsZSAhPSBudWxsKSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGUubGVuZ3RoOyBpKyspIHsKLS8vCQkJCWlmKG5hbWUuZXF1YWxzKHBvc3NpYmxlW2ldKSkKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU5vZGUoRWxlbWVudCB0YXJnZXQsIE5vZGUgY2hpbGQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkZWMsIExpc3RbXSBleHRlbmRlZENvbnRlbnQpIHsKLQkJLy8gTk9URTogSWYgdGhlIHRhcmdldCBlbGVtZW50IGlzICdVTktOT1dOJywgdGhhdCBpcywgaXQgaGFzIG5vCi0JCS8vIGVsZW1lbnQgZGVjbGFyYXRpb24sIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGVsZW1lbnQgc2hvdWxkIGJlCi0JCS8vIHJlZ2FyZGVkIGFzICdBTlknLiAtLSA5LzEwLzIwMDEKLQkJaW50IGNvbnRlbnRUeXBlID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudFR5cGUgPSBlZGVjLmdldENvbnRlbnRUeXBlKCk7Ci0KLQkJaW50IGVycm9yID0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SOwotCQlpbnQgc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkKLQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQlFbGVtZW50IGNoaWxkRWxlbSA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQkvLyBEZWZlY3QgMjAwMzIxOgotCQkJCS8vIFRoaXMgdmFsaWRhdG9yIGNhcmVzIG9ubHkgSFRNTC9YSFRNTCBlbGVtZW50cy4gSWYgYSBjaGlsZAotCQkJCS8vIGlzCi0JCQkJLy8gYW4gZWxlbWVudCBvZiBmb3JlaWduIG1hcmt1cCBsYW5ndWFnZXMsIGp1c3QgaWdub3JlIGl0LgotCQkJCWlmIChDTVV0aWwuaXNGb3JlaWduKGNoaWxkRWxlbSkpCi0JCQkJCXJldHVybjsKLQotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNlZCA9IENNVXRpbC5nZXREZWNsYXJhdGlvbigoRWxlbWVudCkgY2hpbGQpOwotCQkJCS8vIERlZmVjdCAxODY3NzQ6IElmIGEgY2hpbGQgaXMgbm90IG9uZSBvZiBIVE1MIGVsZW1lbnRzLAotCQkJCS8vIGl0IHNob3VsZCBiZSByZWdhcmRlZCBhcyBhIHZhbGlkIGNoaWxkIHJlZ2FyZGxlc3MgdGhlCi0JCQkJLy8gdHlwZSBvZiB0aGUgcGFyZW50IGNvbnRlbnQgbW9kZWwuIC0tIDEwLzEyLzIwMDEKLQkJCQlpZiAoY2VkID09IG51bGwgfHwgQ01VdGlsLmlzU1NJKGNlZCkgfHwgKCFDTVV0aWwuaXNIVE1MKGNlZCkpKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZIDoKLQkJCQkJCS8vIEtlZXAgZ29pbmcuCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgOgotCQkJCQkJaWYgKGNlZCA9PSBudWxsKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCWlmIChDTVV0aWwuaXNWYWxpZENoaWxkKGVkZWMsIGNlZCkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJLy8gTm93LCBpdCBpcyB0aGUgdGltZSB0byBjaGVjayBpbmNsdXNpb24sIHVubGVzcyB0aGUKLQkJCQkJCS8vIHRhcmdldAotCQkJCQkJLy8gZG9jdW1lbnQgaXMgbm90IGEgWEhUTUwuCi0JCQkJCQlpZiAoIUNNVXRpbC5pc1hIVE1MKGVkZWMpKSB7Ci0JCQkJCQkJLy8gcHVyZSBIVE1MCi0JCQkJCQkJaWYgKENNVXRpbC5pc1ZhbGlkSW5jbHVzaW9uKGNlZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkvKgotCQkJCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxODE0MyAtIAotCQkJCQkJICogTW9kZWxRdWVyeSB1c2Ugbm90IHBlcnZhc2l2ZSBlbm91Z2gKLQkJCQkJCSAqLwotCQkJCQkJaWYgKGV4dGVuZGVkQ29udGVudFswXSA9PSBudWxsKSB7Ci0JCQkJCQkJZXh0ZW5kZWRDb250ZW50WzBdID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSh0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KHRhcmdldCwgZWRlYywgTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTKTsKLQkJCQkJCX0KLQotCQkJCQkJTGlzdCBhdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMgPSBleHRlbmRlZENvbnRlbnRbMF07Ci0JCQkJCQkvKgotCQkJCQkJICogUmV0cmlldmUgYW5kIHNldCBhc2lkZSBqdXN0IHRoZSBlbGVtZW50IG5hbWVzIGZvciBmYXN0ZXIgY2hlY2tpbmcKLQkJCQkJCSAqIGxhdGVyLgotCQkJCQkJICovCi0JCQkJCQlpbnQgYXZhaWxhYmxlQ2hpbGRDb3VudCA9IGF2YWlsYWJsZUNoaWxkRWxlbWVudERlY2xhcmF0aW9ucy5zaXplKCk7Ci0JCQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBjZWQuZ2V0RWxlbWVudE5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVDaGlsZENvdW50OyBpKyspIHsKLQkJCQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgYXZhaWxhYmxlQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zLmdldChpKTsKLQkJCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gJiYgY21ub2RlLmdldE5vZGVOYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIE1hcmsgdGhlIHdob2xlIFNUQVJUIHRhZyBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1NUQVJUX1RBRzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXN3aXRjaCAoY29udGVudFR5cGUpIHsKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkgOgotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIDoKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgOgotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBIDoKLQkJCQkJCS8vIEQxODQzMzkKLQkJCQkJCS8vIEtlZXAgZ29pbmcuCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkgOgotCQkJCQkJaWYgKCgoSURPTVRleHQpIGNoaWxkKS5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIE1hcmsgdGhlIHdob2xlIG5vZGUgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCWlmIChjb250ZW50VHlwZSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCQkJcmV0dXJuOwotCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJLy8gTWFyayB0aGUgd2hvbGUgbm9kZSBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJLy8gTWFyayB0aGUgd2hvbGUgbm9kZSBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoZXJyb3IgIT0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SKSB7Ci0JCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoKElET01Ob2RlKSBjaGlsZCwgc2VnVHlwZSk7Ci0JCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQlyZXBvcnRlci5yZXBvcnQobmV3IEVycm9ySW5mb0ltcGwoZXJyb3IsIGVycm9yU2VnLCBjaGlsZCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTc5NWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkNvbXBvbmVudDsKLQotY2xhc3MgSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yIGV4dGVuZHMgQ29tcG9zaXRlVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEhUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJVmFsaWRhdGlvbkNvbXBvbmVudFtdIHZhbGlkYXRvcnMgPSBuZXcgVmFsaWRhdGlvbkNvbXBvbmVudFsyXTsKLQotCQl2YWxpZGF0b3JzWzBdID0gbmV3IEhUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IoKTsKLQkJdmFsaWRhdG9yc1sxXSA9IG5ldyBTeW50YXhWYWxpZGF0b3IoKTsKLQotCQlyZWdpc3Rlcih2YWxpZGF0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFNpbXBsZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjc2ZmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWNsYXNzIEhUTUxTaW1wbGVWYWxpZGF0b3IgZXh0ZW5kcyBDb21wb3NpdGVWYWxpZGF0b3IgewotCi0JLyoqCi0JICogSFRNTFNpbXBsZVZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MU2ltcGxlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCi0JCVZhbGlkYXRpb25Db21wb25lbnRbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRpb25Db21wb25lbnRbNV07Ci0KLQkJdmFsaWRhdG9yc1swXSA9IG5ldyBIVE1MQXR0cmlidXRlVmFsaWRhdG9yKCk7Ci0JCXZhbGlkYXRvcnNbMV0gPSBuZXcgSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yKCk7Ci0JCXZhbGlkYXRvcnNbMl0gPSBuZXcgU3ludGF4VmFsaWRhdG9yKCk7Ci0JCXZhbGlkYXRvcnNbM10gPSBuZXcgSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzRdID0gbmV3IE5hbWVzcGFjZVZhbGlkYXRvcigpOwotCi0JCXJlZ2lzdGVyKHZhbGlkYXRvcnMpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxTaW1wbGVWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDEwZTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKFZhbGlkYXRpb25BZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkgamF2YS5sYW5nLk9iamVjdAotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlOb2RlIG5vZGUgPSAoTm9kZSkgdGFyZ2V0OwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOgotCQkJCXJldHVybiBuZXcgRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvcigpOwotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIG5ldyBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBuZXcgTnVsbFZhbGlkYXRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgT2JqZWN0J3MgY2xvbmUoKSBtZXRob2QKLQkgKiBUaGlzIGlzIHVzZWQgaW4gSU1vZGVsTWFuYWdlcidzIElTdHJ1Y3R1cmVkTW9kZWwgY29weWluZy4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTWVzc2FnZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9NZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjc3MWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9NZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5FcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRmFjdG9yeSBpbXBsZW1lbnRzIEVycm9yU3RhdGUgewotCi0KLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OwotCXByaXZhdGUgSVNjb3BlQ29udGV4dFtdIGZMb29rdXBPcmRlcjsKLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VTZXJ2aWNlOwotCQotCXB1YmxpYyBNZXNzYWdlRmFjdG9yeSgpIHsKLQkJaW5pdCgpOwotCX0KLQkKLQlwdWJsaWMgTWVzc2FnZUZhY3RvcnkoSVByb2plY3QgcHJvamVjdCkgewotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JCWluaXQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHBhY2tldCBmb3IgdGhlIGVycm9yIHRhYmxlIGJhc2VkIG9uIHRoZSBzdGF0ZSwgbWVzc2FnZSwgYW5kIHRoZQotCSAqIHNldmVyaXR5IGRlZmluZWQgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuIFRoaXMgcGFja2V0LCBpbiBhZGRpdGlvbiB0bwotCSAqIGJlaW5nIGFkZGVkIHRvIHRoZSBlcnJvciB0YWJsZSwgaXMgYWxzbyBwbGFjZWQgaW4gYSBtYXAgYmFzZWQgb24gdGhlCi0JICogc3VwcGxpZWQgcHJlZmVyZW5jZSBrZXkKLQkgKiAKLQkgKiBAcGFyYW0ga2V5IHRoZSBwcmVmZXJlbmNlIGtleSBmb3IgdGhlIGVycm9yIHNldmVyaXR5Ci0JICogQHBhcmFtIGVycm9yVGFibGUgdGhlIGVycm9yIHRhYmxlIHRvIHN0b3JlIHRoZSBwYWNrZXQgaW5mb3JtYXRpb24gaW4KLQkgKiBAcGFyYW0gc3RhdGUgdGhlIGVycm9yIHN0YXRlCi0JICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSBmb3IgdGhlIGVycm9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1hcFRvS2V5KFN0cmluZyBrZXksIEVycm9yVGFibGUgZXJyb3JUYWJsZSwgaW50IHN0YXRlLCBTdHJpbmcgbXNnKSB7Ci0JCWludCBzZXZlcml0eSA9IFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkc7Ci0JCXNldmVyaXR5ID0gZlByZWZlcmVuY2VTZXJ2aWNlLmdldEludChIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIGtleSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORywgZkxvb2t1cE9yZGVyKTsKLQkJZXJyb3JUYWJsZS5wdXQoc3RhdGUsIG1zZywgc2V2ZXJpdHkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJZlByZWZlcmVuY2VTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCWZMb29rdXBPcmRlciA9IG5ldyBJU2NvcGVDb250ZXh0W10ge25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JCQotCQlpZiAoZlByb2plY3QgIT0gbnVsbCkgewotCQkJUHJvamVjdFNjb3BlIHByb2plY3RTY29wZSA9IG5ldyBQcm9qZWN0U2NvcGUoZlByb2plY3QpOwotCQkJaWYocHJvamVjdFNjb3BlLmdldE5vZGUoSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVTRV9QUk9KRUNUX1NFVFRJTkdTLCBmYWxzZSkpCi0JCQkJZkxvb2t1cE9yZGVyID0gbmV3IElTY29wZUNvbnRleHRbXSB7cHJvamVjdFNjb3BlLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQl9Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IE5vZGVUeXBlLk1BWF9UWVBFOyBpKyspIHsKLQkJCWVyclRhYmxlc1tpXSA9IG5ldyBFcnJvclRhYmxlKCk7Ci0JCX0KLQkJLy8gTk9URTogVGhlIHNldmVyaXRpZXMgYXJlIGp1c3Qgc3R1Yi4gIFRoZXkgbXVzdCBiZSByZXZpZXdlZC4KLQkJLy8gLS0gOC8zMC8yMDAxCi0KLQkJLy8gYXR0cmlidXRlIGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGF0dHJUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5BVFRSSUJVVEVdOy8vIHNob3J0IGhhbmQKLQkJYXR0clRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVU5ERUZJTkVEX05BTUUsIGF0dHJUYWJsZSwgVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfQVRUUl9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9VTkRFRklORURfVkFMVUUsIGF0dHJUYWJsZSwgVU5ERUZJTkVEX1ZBTFVFX0VSUk9SLCBNU0dfVU5ERUZJTkVEX1ZBTFVFX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX05BTUVfTUlTTUFUQ0gsIGF0dHJUYWJsZSwgTUlTTUFUQ0hFRF9FUlJPUiwgTVNHX01JU01BVENIRURfQVRUUl9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9JTlZBTElEX05BTUUsIGF0dHJUYWJsZSwgSU5WQUxJRF9OQU1FX0VSUk9SLCBNU0dfSU5WQUxJRF9BVFRSX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0lOVkFMSURfVkFMVUUsIGF0dHJUYWJsZSwgSU5WQUxJRF9BVFRSX0VSUk9SLCBNU0dfQVRUUl9OT19WQUxVRV9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9EVVBMSUNBVEUsIGF0dHJUYWJsZSwgRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX0FUVFJfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVkFMVUVfTUlTTUFUQ0gsIGF0dHJUYWJsZSwgTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUiwgTVNHX01JU01BVENIRURfQVRUUl9WQUxVRV9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9WQUxVRV9VTkNMT1NFRCwgYXR0clRhYmxlLCBVTkNMT1NFRF9BVFRSX1ZBTFVFLCBNU0dfVU5DTE9TRURfQVRUUl9WQUxVRV9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9WQUxVRV9SRVNPVVJDRV9OT1RfRk9VTkQsIGF0dHJUYWJsZSwgUkVTT1VSQ0VfTk9UX0ZPVU5ELCBNU0dfUkVTT1VSQ0VfTk9UX0ZPVU5EKTsKLQotCQkvLyBlbGVtZW50IGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGVsZW1UYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsvLyBzaG9ydCBoYW5kCi0JCWVsZW1UYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTktOT1dOX05BTUUsIGVsZW1UYWJsZSwgVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX05BTUUsIGVsZW1UYWJsZSwgSU5WQUxJRF9OQU1FX0VSUk9SLCBNU0dfSU5WQUxJRF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1NUQVJUX0lOVkFMSURfQ0FTRSwgZWxlbVRhYmxlLCBNSVNNQVRDSEVEX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0VORF9JTlZBTElEX0NBU0UsIGVsZW1UYWJsZSwgTUlTTUFUQ0hFRF9FTkRfVEFHX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX01JU1NJTkdfU1RBUlQsIGVsZW1UYWJsZSwgTUlTU0lOR19TVEFSVF9UQUdfRVJST1IsIE1TR19NSVNTSU5HX1NUQVJUX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fTUlTU0lOR19FTkQsIGVsZW1UYWJsZSwgTUlTU0lOR19FTkRfVEFHX0VSUk9SLCBNU0dfTUlTU0lOR19FTkRfVEFHX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTk5FQ0VTU0FSWV9FTkQsIGVsZW1UYWJsZSwgVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiwgTVNHX1VOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfRElSRUNUSVZFLCBlbGVtVGFibGUsIElOVkFMSURfRElSRUNUSVZFX0VSUk9SLCBNU0dfSU5WQUxJRF9ESVJFQ1RJVkVfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfQ09OVEVOVCwgZWxlbVRhYmxlLCBJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0RVUExJQ0FURSwgZWxlbVRhYmxlLCBEVVBMSUNBVEVfRVJST1IsIE1TR19EVVBMSUNBVEVfVEFHX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9DT0VYSVNURU5DRSwgZWxlbVRhYmxlLCBDT0VYSVNURU5DRV9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5DTE9TRURfU1RBUlRfVEFHLCBlbGVtVGFibGUsIFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX1NUQVJUX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5DTE9TRURfRU5EX1RBRywgZWxlbVRhYmxlLCBVTkNMT1NFRF9FTkRfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfRU5EX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fSU5WQUxJRF9FTVBUWV9UQUcsIGVsZW1UYWJsZSwgSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgTVNHX0lOVkFMSURfRU1QVFlfRUxFTUVOVF9UQUcpOwotCi0JCS8vIGRvY3VtZW50IHR5cGUgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgZG9jVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuRE9DVU1FTlRfVFlQRV07Ly8gc2hvcnQgaGFuZAotCQlkb2NUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRE9DX0RVUExJQ0FURSwgZG9jVGFibGUsIERVUExJQ0FURV9FUlJPUiwgTVNHX0RVUExJQ0FURV9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfSU5WQUxJRF9DT05URU5ULCBkb2NUYWJsZSwgSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRE9DX0RPQ1RZUEVfVU5DTE9TRUQsIGRvY1RhYmxlLCBVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9ET0NUWVBFX0VSUk9SKTsKLQotCQkvLyB0ZXh0IGVycm9yIG1hcAotCQlFcnJvclRhYmxlIHRleHRUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5URVhUXTsKLQkJdGV4dFRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5URVhUX0lOVkFMSURfQ09OVEVOVCwgdGV4dFRhYmxlLCBJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX1RFWFRfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5URVhUX0lOVkFMSURfQ0hBUiwgdGV4dFRhYmxlLCBJTlZBTElEX0NIQVJfRVJST1IsIE1TR19JTlZBTElEX0NIQVJfRVJST1IpOwotCi0JCS8vIGNvbW1lbnQgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgY29tbVRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkNPTU1FTlRdOwotCQljb21tVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTU1FTlRfSU5WQUxJRF9DT05URU5ULCBjb21tVGFibGUsIElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTU1FTlRfVU5DTE9TRUQsIGNvbW1UYWJsZSwgVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfQ09NTUVOVF9FUlJPUik7Ci0KLQkJLy8gY2RhdGEgc2VjdGlvbiBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBjZGF0VGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQ0RBVEFfU0VDVElPTl07Ci0JCWNkYXRUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0RBVEFfSU5WQUxJRF9DT05URU5ULCBjZGF0VGFibGUsIElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNEQVRBX1VOQ0xPU0VELCBjZGF0VGFibGUsIFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT05fRVJST1IpOwotCi0JCS8vIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgcGlUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OXTsKLQkJcGlUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUElfSU5WQUxJRF9DT05URU5ULCBwaVRhYmxlLCBJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QSV9VTkNMT1NFRCwgcGlUYWJsZSwgVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfUElfRVJST1IpOwotCi0JCS8vIGVudGl0eSByZWZlcmVuY2UgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgZXJUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFXTsKLQkJZXJUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUkVGX1VOREVGSU5FRCwgZXJUYWJsZSwgVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUkVGX0lOVkFMSURfQ09OVEVOVCwgZXJUYWJsZSwgSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXJyb3JUYWJsZSB7Ci0JCXByaXZhdGUgY2xhc3MgUGFja2V0IHsKLQkJCXB1YmxpYyBQYWNrZXQoU3RyaW5nIG1zZywgaW50IHNldmVyaXR5KSB7Ci0JCQkJdGhpcy5tc2cgPSBtc2c7Ci0JCQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCQkJcmV0dXJuIG1zZzsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQlwcml2YXRlIGludCBzZXZlcml0eSA9IC0xOwotCQl9Ci0KLQkJcHVibGljIEVycm9yVGFibGUoKSB7Ci0JCX0KLQotCQlwdWJsaWMgUGFja2V0IHB1dChpbnQgc3RhdGUsIFN0cmluZyBtc2csIGludCBzZXZlcml0eSkgewotCQkJUGFja2V0IHBhY2tldCA9IG5ldyBQYWNrZXQobXNnLCBzZXZlcml0eSk7Ci0JCQltYXAucHV0KG5ldyBJbnRlZ2VyKHN0YXRlKSwgcGFja2V0KTsKLQkJCXJldHVybiBwYWNrZXQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoaW50IHN0YXRlKSB7Ci0JCQlyZXR1cm4gZ2V0UGFja2V0KHN0YXRlKS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFNldmVyaXR5KGludCBzdGF0ZSkgewotCQkJcmV0dXJuIGdldFBhY2tldChzdGF0ZSkuZ2V0U2V2ZXJpdHkoKTsKLQkJfQotCi0JCXByaXZhdGUgUGFja2V0IGdldFBhY2tldChpbnQgc3RhdGUpIHsKLQkJCXJldHVybiAoUGFja2V0KSBtYXAuZ2V0KG5ldyBJbnRlZ2VyKHN0YXRlKSk7Ci0JCX0KLQotCQlwcml2YXRlIEhhc2h0YWJsZSBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIE5vZGVUeXBlIHsKLQkJc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEUgPSAwOwotCQlzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSAxOwotCQlzdGF0aWMgZmluYWwgaW50IERPQ1VNRU5UX1RZUEUgPSAyOwotCQlzdGF0aWMgZmluYWwgaW50IFRFWFQgPSAzOwotCQlzdGF0aWMgZmluYWwgaW50IENPTU1FTlQgPSA0OwotCQlzdGF0aWMgZmluYWwgaW50IENEQVRBX1NFQ1RJT04gPSA1OwotCQlzdGF0aWMgZmluYWwgaW50IFBST0NFU1NJTkdfSU5TVFJVQ1RJT04gPSA2OwotCQlzdGF0aWMgZmluYWwgaW50IEVOVElUWV9SRUZFUkVOQ0UgPSA3OwotCi0JCXN0YXRpYyBmaW5hbCBpbnQgTUFYX1RZUEUgPSA4OwotCX0KLQotCS8vIGVycm9yIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19OT19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuTm9fZXJyb3JfX1VJXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOREVGSU5FRF9BVFRSX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5VbmRlZmluZWRfYXR0cmlidXRlX25hbWVfX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkRFRklORURfVkFMVUVfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlVuZGVmaW5lZF9hdHRyaWJ1dGVfdmFsdWVfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0RVUExJQ0FURV9BVFRSX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5NdWx0aXBsZV92YWx1ZXNfc3BlY2lmaWVkX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNNQVRDSEVEX0FUVFJfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX19fMF9fX3VzZXNfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfQVRUUl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9fXzBfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfQVRUUl9OT19WQUxVRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9hdHRyaWJ1dGVfX18wX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9sb2NhdGlvbl9vZl90YWdfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfRFVQTElDQVRFX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuRHVwbGljYXRlX3RhZ19fXzBfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfTUlTU0lOR19TVEFSVF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLk5vX3N0YXJ0X3RhZ19fX18wX19fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNTSU5HX0VORF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLk5vX2VuZF90YWdfX19fXzBfX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkVuZF90YWdfX19fXzBfX19fbm90X25lZWRlX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOREVGSU5FRF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlVua25vd25fdGFnX19fMF9fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNNQVRDSEVEX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuVGFnX25hbWVfX18wX19fdXNlc193cm9uZ19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfdGFnX25hbWVfX18wX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfRElSRUNUSVZFX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX0pTUF9kaXJlY3RpdmVfX18wX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX1RFWFRfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfdGV4dF9zdHJpbmdfX18wX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfQ0hBUl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfdXNlZF9pbl9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5LTk9XTl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuVW5rbm93bl9lcnJvcl9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfU1RBUlRfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5TdGFydF90YWdfX19fMF9fX19ub3RfY2xvc19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9FTkRfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5FbmRfdGFnX19fX18wX19fX25vdF9jbG9zZV9FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNNQVRDSEVEX0FUVFJfVkFMVUVfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkF0dHJpYnV0ZV92YWx1ZV9fXzBfX191c2VzX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX0NPTU1FTlRfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkNvbW1lbnRfbm90X2Nsb3NlZF9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfRE9DVFlQRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuRE9DVFlQRV9kZWNsYXJhdGlvbl9ub3RfY2xfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfUElfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlByb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25fbm90X0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT05fRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkNEQVRBX3NlY3Rpb25fbm90X2Nsb3NlZF9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRyA9IEhUTUxDb3JlTWVzc2FnZXMuX0VSUk9SX1RhZ19fXzBfX19zaG91bGRfYmVfYW5fZW1wdHlfZWxlbWVudF90YWdfMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX0FUVFJfVkFMVUVfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLl9FUlJPUl9BdHRyaWJ1dGVfdmFsdWVfX18wX19fbm90X2Nsb3NlZF9fMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1JFU09VUkNFX05PVF9GT1VORCA9IEhUTUxDb3JlTWVzc2FnZXMuX0VSUk9SX1Jlc291cmNlX25vdF9mb3VuZF8wOwotCQotCXByaXZhdGUgRXJyb3JUYWJsZVtdIGVyclRhYmxlcyA9IG5ldyBFcnJvclRhYmxlW05vZGVUeXBlLk1BWF9UWVBFXTsKLQotLy8Jc3RhdGljIHsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IE5vZGVUeXBlLk1BWF9UWVBFOyBpKyspIHsKLS8vCQkJZXJyVGFibGVzW2ldID0gbmV3IEVycm9yVGFibGUoKTsKLS8vCQl9Ci0vLwkJLy8gTk9URTogVGhlIHNldmVyaXRpZXMgYXJlIGp1c3Qgc3R1Yi4gIFRoZXkgbXVzdCBiZSByZXZpZXdlZC4KLS8vCQkvLyAtLSA4LzMwLzIwMDEKLS8vCi0vLwkJLy8gYXR0cmlidXRlIGVycm9yIG1hcAotLy8JCUVycm9yVGFibGUgYXR0clRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkFUVFJJQlVURV07Ly8gc2hvcnQgaGFuZAotLy8JCWF0dHJUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQlhdHRyVGFibGUucHV0KFVOREVGSU5FRF9OQU1FX0VSUk9SLCBNU0dfVU5ERUZJTkVEX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoVU5ERUZJTkVEX1ZBTFVFX0VSUk9SLCBNU0dfVU5ERUZJTkVEX1ZBTFVFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQlhdHRyVGFibGUucHV0KE1JU01BVENIRURfRVJST1IsIE1TR19NSVNNQVRDSEVEX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoSU5WQUxJRF9OQU1FX0VSUk9SLCBNU0dfSU5WQUxJRF9BVFRSX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQlhdHRyVGFibGUucHV0KElOVkFMSURfQVRUUl9FUlJPUiwgTVNHX0FUVFJfTk9fVkFMVUVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUiwgTVNHX01JU01BVENIRURfQVRUUl9WQUxVRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotLy8JCS8vPDxEMjEwNDIyCi0vLwkJYXR0clRhYmxlLnB1dChVTkNMT1NFRF9BVFRSX1ZBTFVFLCBNU0dfVU5DTE9TRURfQVRUUl9WQUxVRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJLy9EMjEwNDIyCi0vLwkJLy8gZWxlbWVudCBlcnJvciBtYXAKLS8vCQlFcnJvclRhYmxlIGVsZW1UYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsvLyBzaG9ydCBoYW5kCi0vLwkJZWxlbVRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotLy8JCWVsZW1UYWJsZS5wdXQoVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQllbGVtVGFibGUucHV0KElOVkFMSURfTkFNRV9FUlJPUiwgTVNHX0lOVkFMSURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwkJZWxlbVRhYmxlLnB1dChNSVNNQVRDSEVEX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWVsZW1UYWJsZS5wdXQoTUlTTUFUQ0hFRF9FTkRfVEFHX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQllbGVtVGFibGUucHV0KE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBNU0dfTUlTU0lOR19TVEFSVF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQllbGVtVGFibGUucHV0KE1JU1NJTkdfRU5EX1RBR19FUlJPUiwgTVNHX01JU1NJTkdfRU5EX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChVTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SLCBNU0dfVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0RJUkVDVElWRV9FUlJPUiwgTVNHX0lOVkFMSURfRElSRUNUSVZFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWVsZW1UYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChDT0VYSVNURU5DRV9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9TVEFSVF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQllbGVtVGFibGUucHV0KFVOQ0xPU0VEX0VORF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9FTkRfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHLCBNU0dfSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwotLy8JCS8vIGRvY3VtZW50IHR5cGUgZXJyb3IgbWFwCi0vLwkJRXJyb3JUYWJsZSBkb2NUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsvLyBzaG9ydCBoYW5kCi0vLwkJZG9jVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0vLwkJZG9jVGFibGUucHV0KERVUExJQ0FURV9FUlJPUiwgTVNHX0RVUExJQ0FURV9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQlkb2NUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQlkb2NUYWJsZS5wdXQoVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfRE9DVFlQRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotLy8KLS8vCQkvLyB0ZXh0IGVycm9yIG1hcAotLy8JCUVycm9yVGFibGUgdGV4dFRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLlRFWFRdOwotLy8JCXRleHRUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQl0ZXh0VGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfVEVYVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJdGV4dFRhYmxlLnB1dChJTlZBTElEX0NIQVJfRVJST1IsIE1TR19JTlZBTElEX0NIQVJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8KLS8vCQkvLyBjb21tZW50IGVycm9yIG1hcAotLy8JCUVycm9yVGFibGUgY29tbVRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkNPTU1FTlRdOwotLy8JCWNvbW1UYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQljb21tVGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJY29tbVRhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9DT01NRU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwotLy8JCS8vIGNkYXRhIHNlY3Rpb24gZXJyb3IgbWFwCi0vLwkJRXJyb3JUYWJsZSBjZGF0VGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQ0RBVEFfU0VDVElPTl07Ci0vLwkJY2RhdFRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotLy8JCWNkYXRUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQljZGF0VGFibGUucHV0KFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT05fRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCi0vLwkJLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlcnJvciBtYXAKLS8vCQlFcnJvclRhYmxlIHBpVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl07Ci0vLwkJcGlUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQlwaVRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCXBpVGFibGUucHV0KFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX1BJX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwotLy8JCS8vIGVudGl0eSByZWZlcmVuY2UgZXJyb3IgbWFwCi0vLwkJRXJyb3JUYWJsZSBlclRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0VdOwotLy8JCWVyVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0vLwkJZXJUYWJsZS5wdXQoVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQllclRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoRXJyb3JJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGVycm9yTXNnID0gZ2V0RXJyb3JNZXNzYWdlKGluZm8pOwotCQlpbnQgZXJyb3JTZXZlcml0eSA9IGdldEVycm9yU2V2ZXJpdHkoaW5mbyk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3JNc2csIGluZm8uZ2V0T2Zmc2V0KCksIGluZm8uZ2V0TGVuZ3RoKCksIGVycm9yU2V2ZXJpdHkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVycm9yTWVzc2FnZShFcnJvckluZm8gaW5mbykgewotCQlFcnJvclRhYmxlIHRhYiA9IGdldEVycm9yVGFibGUoaW5mby5nZXRUYXJnZXRUeXBlKCkpOwotCQlpZiAodGFiID09IG51bGwpCi0JCQlyZXR1cm4gTVNHX1VOS05PV05fRVJST1I7Ci0KLQkJU3RyaW5nIHRlbXBsYXRlID0gdGFiLmdldE1lc3NhZ2UoaW5mby5nZXRTdGF0ZSgpKTsKLQkJT2JqZWN0W10gYXJndW1lbnRzID0ge2luZm8uZ2V0SGludCgpfTsKLQkJU3RyaW5nIHMgPSBudWxsOwotCQl0cnkgewotCQkJcyA9IE5MUy5iaW5kKHRlbXBsYXRlLCBhcmd1bWVudHMpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXMgPSB0ZW1wbGF0ZSArICI6IiArIGFyZ3VtZW50cy50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0RXJyb3JTZXZlcml0eShFcnJvckluZm8gaW5mbykgewotCQlFcnJvclRhYmxlIHRhYiA9IGdldEVycm9yVGFibGUoaW5mby5nZXRUYXJnZXRUeXBlKCkpOwotCQlpZiAodGFiID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHRhYi5nZXRTZXZlcml0eShpbmZvLmdldFN0YXRlKCkpOwotCX0KLQotCXByaXZhdGUgRXJyb3JUYWJsZSBnZXRFcnJvclRhYmxlKHNob3J0IG5vZGV0eXBlKSB7Ci0JCUVycm9yVGFibGUgdGFiID0gbnVsbDsKLQkJc3dpdGNoIChub2RldHlwZSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQVRUUklCVVRFXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5URVhUXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5DT01NRU5UXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5DREFUQV9TRUNUSU9OXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFXTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0YWI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL01vZHVsZUNvcmVTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTW9kdWxlQ29yZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjZTU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTW9kdWxlQ29yZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbnkgdXNlZCBNb2R1bGUgQ29yZSBBUElzIGFsb25nIHdpdGggZmFsbGJhY2tzIGZvcg0KLSAqIHVzZSBvbiBub24tY29tcGxpYW50IHByb2plY3RzIGFuZCB3aGVuIHRob3NlIHNlcnZpY2VzIGFyZSBub3QgYXZhaWxhYmxlIGF0DQotICogcnVudGltZS4NCi0gKiANCi0gKiBCZWNhdXNlIE1vZHVsZUNvcmUgQVBJIGNhbGxzIGNhbiByZXN1bHQgaW4gbG9ja3MgbmVlZGluZyB0byBiZSBhY3F1aXJlZCwNCi0gKiBub25lIG9mIHRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCB3aGlsZSBvdGhlciB0aHJlYWQgbG9ja3MgaGF2ZQ0KLSAqIGFscmVhZHkgYmVlbiBhY3F1aXJlZC4NCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgTW9kdWxlQ29yZVN1cHBvcnQgew0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZHVtcF9OQ0RGRSA9IGZhbHNlOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBXRUJfSU5GX1BBVEggPSBuZXcgUGF0aChXRUJfSU5GKTsNCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBwcm9qZWN0DQotCSAqIEByZXR1cm4gdGhlIGNvbXB1dGVkIElQYXRoIHRvIHRoZSAicm9vdCIgb2YgdGhlIHdlYiBjb250ZW50cywgZWl0aGVyDQotCSAqICAgICAgICAgZnJvbSBmYWNldCBrbm93bGVkZ2Ugb3IgaHVlcmlzdGljcywgb3IgbnVsbCBpZiBvbmUgY2FuIG5vdCBiZQ0KLQkgKiAgICAgICAgIGRldGVybWluZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVBhdGggY29tcHV0ZVdlYkNvbnRlbnRSb290UGF0aChJUGF0aCBwYXRoKSB7DQotCQlJUGF0aCByb290ID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcm9vdCA9IE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0V2ViQ29udGVudFJvb3RQYXRoKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpKTsNCi0JCX0NCi0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7DQotCQkJaWYgKF9kdW1wX05DREZFKQ0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQkJaWYgKHJvb3QgPT0gbnVsbCkgew0KLQkJCS8qDQotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMzI0NQ0KLQkJCSAqIA0KLQkJCSAqIE5QRSBpbiBKU1BUYWdsaWJEaXJlY3RpdmVDb250ZW50QXNzaXN0UHJvY2Vzc29yIHdpdGgNCi0JCQkgKiBub24tZmFjZXRlZCBwcm9qZWN0DQotCQkJICovDQotCQkJcm9vdCA9IGdldExvY2FsUm9vdChwYXRoKTsNCi0JCX0NCi0JCXJldHVybiByb290Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gcHJvamVjdA0KLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGVudFJvb3RQYXRoKElQcm9qZWN0IHByb2plY3QpIHsNCi0JCWlmIChwcm9qZWN0ID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQlJUGF0aCBwYXRoID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcGF0aCA9IE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOw0KLQkJfQ0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsNCi0JCQlpZiAoX2R1bXBfTkNERkUpDQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotCQlyZXR1cm4gcGF0aDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHBhdGgNCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQ0KLQkgKiBAcmV0dXJuIC0gdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgaWYgb25lIGV4aXN0cywgbnVsbA0KLQkgKiAgICAgICAgIG90aGVyd2lzZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSdW50aW1lUGF0aChJUGF0aCBwYXRoKSB7DQotCQlJUGF0aCByZXN1bHQgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZXN1bHQgPSBNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmdldFJ1bnRpbWVQYXRoKHBhdGgpOw0KLQkJfQ0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsNCi0JCQlpZiAoX2R1bXBfTkNERkUpDQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCi0JCQlJUGF0aCByb290ID0gZ2V0TG9jYWxSb290KHBhdGgpOw0KLQkJCXJlc3VsdCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290LnNlZ21lbnRDb3VudCgpKS5tYWtlQWJzb2x1dGUoKTsNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBiYXNlUGF0aA0KLQkgKiAgICAgICAgICAgIC0gdGhlIGZ1bGwgcGF0aCB0byBhIHJlc291cmNlIHdpdGhpbiB0aGUgd29ya3NwYWNlDQotCSAqIEBwYXJhbSByZWZlcmVuY2UNCi0JICogICAgICAgICAgICAtIHRoZSByZWZlcmVuY2Ugc3RyaW5nIHRvIHJlc29sdmUNCi0JICogQHJldHVybiAtIHRoZSBmdWxsIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUNCi0JICogICAgICAgICBnaXZlbiByZWZlcmVuY2UgYWNjb3JkaW5nIHRvIHRoZSB2aXJ0dWFsIHBhdGhpbmcgc3VwcG9ydA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUGF0aCByZXNvbHZlKElQYXRoIGJhc2VQYXRoLCBTdHJpbmcgcmVmZXJlbmNlKSB7DQotCQlJUGF0aCByZXNvbHZlZFBhdGggPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZXNvbHZlZFBhdGggPSBNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLnJlc29sdmUoYmFzZVBhdGgsIHJlZmVyZW5jZSk7DQotCQl9DQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgew0KLQkJCWlmIChfZHVtcF9OQ0RGRSkNCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCX0NCi0NCi0JCWlmIChyZXNvbHZlZFBhdGggPT0gbnVsbCkgew0KLQkJCUlQYXRoIHJvb3RQYXRoID0gZ2V0TG9jYWxSb290KGJhc2VQYXRoKTsNCi0JCQlpZiAocmVmZXJlbmNlLnN0YXJ0c1dpdGgoUGF0aC5ST09ULnRvU3RyaW5nKCkpKSB7DQotCQkJCXJlc29sdmVkUGF0aCA9IHJvb3RQYXRoLmFwcGVuZChyZWZlcmVuY2UpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJcmVzb2x2ZWRQYXRoID0gYmFzZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChyZWZlcmVuY2UpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiByZXNvbHZlZFBhdGg7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBiYXNlUGF0aA0KLQkgKiBAcmV0dXJuIHRoZSBhcHBsaWNhYmxlIFdlYiBjb250ZXh0IHJvb3QgcGF0aCwgaWYgb25lIGV4aXN0cw0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0TG9jYWxSb290KElQYXRoIGJhc2VQYXRoKSB7DQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsNCi0NCi0JCS8vIGV4aXN0aW5nIHdvcmtzcGFjZSByZXNvdXJjZXMgLSB0aGlzIGlzIHRoZSA5MyUgY2FzZQ0KLQkJSVJlc291cmNlIGZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihiYXNlUGF0aCk7DQotDQotCQkvLyBUcnkgdGhlIGJhc2UgcGF0aCBhcyBhIGZvbGRlciBmaXJzdA0KLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsNCi0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGb2xkZXIoYmFzZVBhdGgpOw0KLQkJfQ0KLQkJLy8gSWYgbm90IGEgZm9sZGVyLCB0aGVuIHRyeSBiYXNlIHBhdGggYXMgYSBmaWxlDQotCQlpZiAoZmlsZSAhPSBudWxsICYmICFmaWxlLmV4aXN0cygpICYmIGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgew0KLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoYmFzZVBhdGgpOw0KLQkJfQ0KLQ0KLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7DQotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsNCi0JCX0NCi0NCi0JCWlmIChmaWxlID09IG51bGwpIHsNCi0JCQkvKg0KLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1MjkNCi0JCQkgKiANCi0JCQkgKiBUaGlzIG1ldGhvZCBwcm9kdWNlcyBhIGxlc3MgYWNjdXJhdGUgcmVzdWx0LCBidXQgZG9lc24ndA0KLQkJCSAqIHJlcXVpcmUgdGhhdCB0aGUgZmlsZSBleGlzdCB5ZXQuDQotCQkJICovDQotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24oYmFzZVBhdGgpOw0KLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKQ0KLQkJCQlmaWxlID0gZmlsZXNbMF07DQotCQl9DQotDQotCQl3aGlsZSAoZmlsZSAhPSBudWxsKSB7DQotCQkJLyoqDQotCQkJICogVHJlYXQgYW55IHBhcmVudCBmb2xkZXIgd2l0aCBhIFdFQi1JTkYgc3ViZm9sZGVyIGFzIGEgd2ViLWFwcA0KLQkJCSAqIHJvb3QNCi0JCQkgKi8NCi0JCQlJQ29udGFpbmVyIGZvbGRlciA9IG51bGw7DQotCQkJaWYgKChmaWxlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApIHsNCi0JCQkJZm9sZGVyID0gKElDb250YWluZXIpIGZpbGU7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlmb2xkZXIgPSBmaWxlLmdldFBhcmVudCgpOw0KLQkJCX0NCi0JCQkvLyBnZXRGb2xkZXIgb24gYSB3b3Jrc3BhY2Ugcm9vdCBtdXN0IHVzZSBhIGZ1bGwgcGF0aCwgc2tpcA0KLQkJCWlmIChmb2xkZXIgIT0gbnVsbCAmJiAoZm9sZGVyLmdldFR5cGUoKSAmIElSZXNvdXJjZS5ST09UKSA9PSAwKSB7DQotCQkJCUlGb2xkZXIgd2ViaW5mID0gZm9sZGVyLmdldEZvbGRlcihXRUJfSU5GX1BBVEgpOw0KLQkJCQlpZiAod2ViaW5mICE9IG51bGwgJiYgd2ViaW5mLmV4aXN0cygpKSB7DQotCQkJCQlyZXR1cm4gZm9sZGVyLmdldEZ1bGxQYXRoKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50KCk7DQotCQl9DQotDQotCQlyZXR1cm4gYmFzZVBhdGgudXB0b1NlZ21lbnQoMSk7DQotCX0NCi0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL01vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Nb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOGQzNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL01vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotLyoqCi0gKiBXcmFwcGVyIGNsYXNzIGZvciBhbGwgRmFjZXQtcmVsYXRlZCBjYWxscy4gSWYgdGhlIEZhY2V0IG9yIE1vZHVsZUNvcmUKLSAqIGJ1bmRsZXMgYXJlIG5vdCBhdmFpbGFibGUsIHRoaXMgY2xhc3Mgd2lsbCBub3QgbG9hZCwgb3IgaWYgaXQgZG9lcywgaXRzCi0gKiBtZXRob2RzIHdpbGwgY2F1c2UgTm9DbGFzc0RlZkZvdW5kRXJyb3JzLiBUaGlzIGFsbG93cyB1cyB0bwotICogY29tcGFydG1lbnRhbGl6ZSB0aGUgZGVwZW5kZW5jaWVzLgotICogCi0gKi8KLWZpbmFsIGNsYXNzIE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFTSCA9ICIvIjsKLQlwcml2YXRlIHN0YXRpYyBNYXAgZlJlc29sdmVkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gLSB0aGUgcnVudGltZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBpZiBvbmUgZXhpc3RzLCBudWxsCi0JICogICAgICAgICBvdGhlcndpc2UKLQkgKi8KLQlzdGF0aWMgSVBhdGggZ2V0UnVudGltZVBhdGgoSVBhdGggcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlWaXJ0dWFsUmVzb3VyY2VbXSB2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpKTsKLQkJaWYgKHZpcnR1YWxSZXNvdXJjZXMgIT0gbnVsbCAmJiB2aXJ0dWFsUmVzb3VyY2VzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiB2aXJ0dWFsUmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGVudFJvb3RQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIGNvbXBvbmVudC5leGlzdHMoKSkgewotCQkJcGF0aCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICAtIHRoZSBmdWxsIHBhdGggdG8gYSByZXNvdXJjZSB3aXRoaW4gdGhlIHdvcmtzcGFjZQotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiAgICAgICAgICAgIC0gdGhlIHJlZmVyZW5jZSBzdHJpbmcgdG8gcmVzb2x2ZQotCSAqIEByZXR1cm4gLSB0aGUgZnVsbCBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlCi0JICogICAgICAgICBnaXZlbiByZWZlcmVuY2UgYWNjb3JkaW5nIHRvIHRoZSB2aXJ0dWFsIHBhdGhpbmcgc3VwcG9ydAotCSAqLwotCXN0YXRpYyBJUGF0aCByZXNvbHZlKElQYXRoIGJhc2VQYXRoLCBTdHJpbmcgcmVmZXJlbmNlKSB7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCB8fCBiYXNlUGF0aCA9PSBudWxsIHx8IGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCi0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCS8qCi0JCQkgKiBJdCBjYW4gdGFrZSB0aGUgYmV0dGVyIHBhcnQgb2YgYSBmdWxsIHNlY29uZCB0byBkbyB0aGlzLCBzbwotCQkJICogY2FjaGUgdGhlIHJlc3VsdC4KLQkJCSAqLwotCQkJSVBhdGggcmVzb2x2ZWQgPSBudWxsOwotCQkJTWFwIG1hcEZvckJhc2VSZXNvdXJjZSA9IG51bGw7Ci0JCQltYXBGb3JCYXNlUmVzb3VyY2UgPSAoTWFwKSBmUmVzb2x2ZWRNYXAuZ2V0KGJhc2VQYXRoKTsKLQkJCWlmIChtYXBGb3JCYXNlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVJlZmVyZW5jZSByZXNvbHZlZFJlZmVyZW5jZSA9IChSZWZlcmVuY2UpIG1hcEZvckJhc2VSZXNvdXJjZS5nZXQocmVmZXJlbmNlKTsKLQkJCQlpZiAocmVzb2x2ZWRSZWZlcmVuY2UgIT0gbnVsbCkKLQkJCQkJcmVzb2x2ZWQgPSAoSVBhdGgpIHJlc29sdmVkUmVmZXJlbmNlLmdldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWFwRm9yQmFzZVJlc291cmNlID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmUmVzb2x2ZWRNYXAucHV0KGJhc2VQYXRoLCBtYXBGb3JCYXNlUmVzb3VyY2UpOwotCQkJfQotCi0JCQlpZiAocmVzb2x2ZWQgPT0gbnVsbCkgewotCQkJCUlGaWxlIGJhc2VGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGJhc2VGaWxlKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZpcnR1YWxSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVBhdGggYmFzZVJ1bnRpbWVQYXRoID0gdmlydHVhbFJlc291cmNlc1tpXS5nZXRSdW50aW1lUGF0aCgpOwotCQkJCQlJUGF0aCByZWZlcmVuY2VSdW50aW1lUGF0aCA9IG51bGw7Ci0JCQkJCWlmIChyZWZlcmVuY2Uuc3RhcnRzV2l0aChTTEFTSCkpIHsKLQkJCQkJCXJlZmVyZW5jZVJ1bnRpbWVQYXRoID0gbmV3IFBhdGgocmVmZXJlbmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlZmVyZW5jZVJ1bnRpbWVQYXRoID0gYmFzZVJ1bnRpbWVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQocmVmZXJlbmNlKTsKLQkJCQkJfQotCQkJCQlJVmlydHVhbEZpbGUgdmlydHVhbEZpbGUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUZpbGUocHJvamVjdCwgcmVmZXJlbmNlUnVudGltZVBhdGgpOwotCQkJCQlpZiAodmlydHVhbEZpbGUgIT0gbnVsbCAmJiB2aXJ0dWFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkJSUZpbGVbXSB1bmRlcmx5aW5nRmlsZXMgPSB2aXJ0dWFsRmlsZS5nZXRVbmRlcmx5aW5nRmlsZXMoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdW5kZXJseWluZ0ZpbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJaWYgKHVuZGVybHlpbmdGaWxlc1tqXS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpICYmIHVuZGVybHlpbmdGaWxlc1tqXS5leGlzdHMoKSkgewotCQkJCQkJCQltYXBGb3JCYXNlUmVzb3VyY2UucHV0KHJlZmVyZW5jZSwgbmV3IFNvZnRSZWZlcmVuY2UodW5kZXJseWluZ0ZpbGVzW2pdLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQkJCQkJcmVzb2x2ZWQgPSB1bmRlcmx5aW5nRmlsZXNbal0uZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvbHZlZDsKLQkJfQotCQllbHNlIHsKLQkJCUlWaXJ0dWFsRmlsZSB2aXJ0dWFsRmlsZSA9IENvbXBvbmVudENvcmUuY3JlYXRlRmlsZShwcm9qZWN0LCBuZXcgUGF0aChyZWZlcmVuY2UpKTsKLQkJCWlmICh2aXJ0dWFsRmlsZSAhPSBudWxsICYmIHZpcnR1YWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHZpcnR1YWxGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTmFtZXNwYWNlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTmFtZXNwYWNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjkxYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL05hbWVzcGFjZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZVZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIGltcGxlbWVudHMgRXJyb3JTdGF0ZSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MTlNfUFJFRklYID0gInhtbG5zIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1NFUEFSQVRPUiA9ICI6IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTmFtZXNwYWNlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBOYW1lc3BhY2VWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlFbGVtZW50IHRhcmdldCA9IChFbGVtZW50KSBub2RlOwotCQlpZiAoaXNYTUxFbGVtZW50KHRhcmdldCkgJiYgaGFzVW5rbm93blByZWZpeCh0YXJnZXQpKSB7Ci0JCQlJRE9NRWxlbWVudCBlID0gKElET01FbGVtZW50KSB0YXJnZXQ7Ci0JCQlpZiAoIWlzVmFsaWRQcmVmaXgoZS5nZXRQcmVmaXgoKSwgdGFyZ2V0KSAmJiAhZS5pc0NvbW1lbnRUYWcoKSkgewotCQkJCS8vIHJlcG9ydCB1bmtub3duIHRhZyBlcnJvci4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gbnVsbDsKLQkJCQlpZiAoZS5oYXNTdGFydFRhZygpKQotCQkJCQllcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGUsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQllbHNlIGlmIChlLmhhc0VuZFRhZygpKQotCQkJCQllcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGUsIEZNVXRpbC5TRUdfRU5EX1RBRyk7Ci0KLQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KG5ldyBFcnJvckluZm9JbXBsKFVOREVGSU5FRF9OQU1FX0VSUk9SLCBlcnJvclNlZywgZSkpOwotCQkJfQotCQl9Ci0JCS8vICgyKSBjaGVjayBwcmVmaXggb2YgZWFjaCBhdHRyIAotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSB0YXJnZXQuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoIShuIGluc3RhbmNlb2YgSURPTUF0dHIpKQotCQkJCWNvbnRpbnVlOwotCQkJSURPTUF0dHIgYSA9IChJRE9NQXR0cikgbjsKLQkJCVN0cmluZyBwcmVmaXggPSBhLmdldFByZWZpeCgpOwotCQkJaWYgKChwcmVmaXggIT0gbnVsbCkgJiYgaXNVbmtub3duQXR0cihhLCB0YXJnZXQpKSB7Ci0JCQkJLy8gVGhlIGF0dHIgaGFzIHVua25vd24gcHJlZml4LiAgU28sIGNoZWNrIGl0LgotCQkJCWlmICghaXNWYWxpZFByZWZpeChwcmVmaXgsIHRhcmdldCkpIHsKLQkJCQkJLy8gcmVwb3J0IHVua25vd24gYXR0ciBlcnJvci4KLQkJCQkJSVRleHRSZWdpb24gciA9IGEuZ2V0TmFtZVJlZ2lvbigpOwotCQkJCQlpZiAociA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWludCBhX29mZnNldCA9IGEuZ2V0TmFtZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWludCBhX2xlbmd0aCA9IGEuZ2V0TmFtZVJlZ2lvbigpLmdldExlbmd0aCgpOwotCQkJCQlyZXBvcnRlci5yZXBvcnQobmV3IEVycm9ySW5mb0ltcGwoVU5ERUZJTkVEX05BTUVfRVJST1IsIG5ldyBTZWdtZW50KGFfb2Zmc2V0LCBhX2xlbmd0aCksIGEpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIG1ldGhvZHMJCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MRWxlbWVudChFbGVtZW50IHRhcmdldCkgewotCQlyZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgSURPTUVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1Vua25vd25QcmVmaXgoRWxlbWVudCB0YXJnZXQpIHsKLQkJcmV0dXJuIGlzVW5rbm93bkVsZW1lbnQodGFyZ2V0KSAmJiBDTVV0aWwuaXNGb3JlaWduKHRhcmdldCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5rbm93bkVsZW1lbnQoRWxlbWVudCB0YXJnZXQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCXJldHVybiBkZWMgPT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmtub3duQXR0cihJRE9NQXR0ciBhdHRyLCBFbGVtZW50IHRhcmdldCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJaWYgKGRlYyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHVua25vd24uCi0JCUNNTmFtZWROb2RlTWFwIGFkZWNscyA9IGRlYy5nZXRBdHRyaWJ1dGVzKCk7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhZGVjbHMuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGFkZWMgPT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFByZWZpeChTdHJpbmcgcHJlZml4LCBFbGVtZW50IGUpIHsKLQkJaWYgKHByZWZpeC5lcXVhbHMoWE1MTlNfUFJFRklYKSkKLQkJCXJldHVybiB0cnVlOyAvLyAieG1sbnM6Zm9vIiBhdHRyIGlzIGFsd2F5cyB2YWxpZC4KLQotCQkvLyAoMSkgY2hlY2sgdGhlIGVsZW1lbnQgaGFzIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciBub3QuCi0JCWlmIChpc1ZhbGlkUHJlZml4V2l0aGluRWxlbWVudChwcmVmaXgsIGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy8gKDIpIGNoZWNrIGFuY2VzdG9ycyBvZiB0aGUgZWxlbWVudCBoYXZlIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciBub3QuCi0JCUVsZW1lbnQgcGFyZW50ID0gU01VdGlsLmdldFBhcmVudEVsZW1lbnQoZSk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKGlzVmFsaWRQcmVmaXhXaXRoaW5FbGVtZW50KHByZWZpeCwgcGFyZW50KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXBhcmVudCA9IFNNVXRpbC5nZXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUHJlZml4V2l0aGluRWxlbWVudChTdHJpbmcgcHJlZml4LCBFbGVtZW50IGUpIHsKLQkJU3RyaW5nIG5zID0gWE1MTlNfUFJFRklYICsgTlNfU0VQQVJBVE9SICsgcHJlZml4OwotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG4gPSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKG4gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChucy5lcXVhbHMoKChBdHRyKSBuKS5nZXROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTnVsbFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL051bGxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1YzRhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTnVsbFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi0vKioKLSAqIE51bGxWYWxpZGF0b3IgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBvZiBudWxsCi0gKiBmb3IgVmFsaWRhdGlvbkNvbXBvbmVudCB0eXBlLgotICovCi1maW5hbCBjbGFzcyBOdWxsVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdGlvbkNvbXBvbmVudCB7Ci0KLQlwdWJsaWMgTnVsbFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ByaW1lVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJpbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhYTBlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJpbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1hYnN0cmFjdCBjbGFzcyBQcmltZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JLyoqCi0JICogUHJpbWVWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUHJpbWVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1NNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1NNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNiOWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1maW5hbCBjbGFzcyBTTVV0aWwgewotCi0JcHJpdmF0ZSBTTVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogZ2V0IGFuIGFuY2VzdG9yIGVsZW1lbnQgaWdub3JpbmcgaW1wbGljaXQgb25lcy4gKi8KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudChOb2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBwID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocCAhPSBudWxsKSB7Ci0JCQlpZiAocC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcmV0dXJuIChFbGVtZW50KSBwOwotCQkJfQotCQkJcCA9IHAuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TZWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGJhZjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgU2VnbWVudCB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU2VnbWVudChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU2VnbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQl0aGlzLmxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1RFOiAnc3RhcnQnIGFuZCAnZW5kJyBtdXN0IGJlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBjb250aWd1b3VzIHJlZ2lvbnMuCi0JICogT3RoZXJ3aXNlLCB0aGlzIGNsYXNzIGNhbm5vdCB3b3JrIGNvcnJlY3RseS4KLQkgKi8KLQlwdWJsaWMgU2VnbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IHN0YXJ0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmRPZmZzZXQgPSAoZW5kID09IG51bGwpID8gc3RhcnQuZ2V0RW5kT2Zmc2V0KCkgOiBlbmQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCXRoaXMubGVuZ3RoID0gZW5kT2Zmc2V0IC0gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLy9wdWJsaWMgU2VnbWVudChJVGV4dFJlZ2lvbiBzdGFydCwgSVRleHRSZWdpb24gZW5kKSB7Ci0JLy8Jc3VwZXIoKTsKLQkvLwl0aGlzLm9mZnNldCA9IHN0YXJ0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JLy8JaW50IGVuZE9mZnNldCA9IChlbmQgPT0gbnVsbCkgPyBzdGFydC5nZXRFbmRPZmZzZXQoKSA6IGVuZC5nZXRFbmRPZmZzZXQoKTsKLQkvLwl0aGlzLmxlbmd0aCA9IGVuZE9mZnNldCAtIHRoaXMub2Zmc2V0OwotCS8vfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU3ludGF4VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU3ludGF4VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MzlhMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1N5bnRheFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLkVycm9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Tb3VyY2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1jbGFzcyBTeW50YXhWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciBpbXBsZW1lbnRzIEVycm9yU3RhdGUgewotCi0KLQlzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRSZWdpb24oSVRleHRSZWdpb24gcmduKSB7Ci0JCVN0cmluZyB0eXBlID0gcmduLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gbm8gdHlwZSBpcyBpbnZhbGlkLgotCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXRUYWdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGFnLmdldFJlZ2lvbnMoKTsKLQkJSXRlcmF0b3IgaXRlciA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZ24gPSAoSVRleHRSZWdpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJnbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpCi0JCQkJcmV0dXJuIHRhZy5nZXRUZXh0KHJnbik7Ci0JCX0KLQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlDb250ZW50KENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJcmV0dXJuIChkZWNsICE9IG51bGwpICYmIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpOwotCX0KLQotCXB1YmxpYyBTeW50YXhWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IFN5bnRheFZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JY2xhc3MgRWxlbWVudEluZm8gewotCQlwdWJsaWMgRWxlbWVudEluZm8oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIElET01FbGVtZW50IHRhcmdldCA9IG51bGw7Ci0JCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbnVsbDsKLQkJcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWcgPSBudWxsOwotCQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWcgPSBudWxsOwotCQlwdWJsaWMgYm9vbGVhbiBoYXNTdGFydFRhZygpIHtyZXR1cm4gc3RhcnRUYWcgIT0gbnVsbDt9Ci0JCXB1YmxpYyBib29sZWFuIGhhc0VuZFRhZygpIHtyZXR1cm4gZW5kVGFnICE9IG51bGw7fQotCQlwdWJsaWMgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSkgewotCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5kZXhlZE5vZGU7Ci0JCXZhbGlkYXRlQ2hpbGRyZW4obm9kZSk7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybjsKLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50KSkKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW5mbyBpbmZvID0gbmV3IEVsZW1lbnRJbmZvKCk7Ci0JCWluZm8udGFyZ2V0ID0gKElET01FbGVtZW50KSBub2RlOwotCi0JCS8vIGdhdGhlciBpbmZvcm1hdGlvbiB0byB2YWxpZGF0ZSBmcm9tIHRhcmdldCBhdCBvbmNlLgotCQlnZXRJbmZvKGluZm8pOwotCi0JCXZhbGlkYXRlVGFncyhpbmZvKTsKLQkJaWYgKGluZm8udGFyZ2V0LmlzR2xvYmFsVGFnKCkpIHsKLQkJCXZhbGlkYXRlTmFtZXMoaW5mbyk7Ci0JCQlpZiAoaW5mby5kZWNsICE9IG51bGwgJiYgaW5mby5pc1hIVE1MKSB7Ci0JCQkJdmFsaWRhdGVUYWdDYXNlKGluZm8pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEluZm8oRWxlbWVudEluZm8gaW5mbykgewotCQlpbmZvLmRlY2wgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24oaW5mby50YXJnZXQpOwotCQlpbmZvLnN0YXJ0VGFnID0gaW5mby50YXJnZXQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaW5mby5lbmRUYWcgPSBpbmZvLnRhcmdldC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQlEb2N1bWVudCBkb2MgPSBpbmZvLnRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmICghKGRvYyBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB0eXBlaWQgPSAoKElET01Eb2N1bWVudCkgZG9jKS5nZXREb2N1bWVudFR5cGVJZCgpOwotCQlpZiAodHlwZWlkICE9IG51bGwpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVudHJ5KHR5cGVpZCk7Ci0JCQlpbmZvLmlzWEhUTUwgPSAoZW50cnkgIT0gbnVsbCAmJiBlbnRyeS5pc1hNTFR5cGUoKSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYWdFcnJvckluZm9JbXBsIGV4dGVuZHMgQWJzdHJhY3RFcnJvckluZm8gewotCQlwcml2YXRlIFN0cmluZyBoaW50ID0gbnVsbDsKLQotCQlwdWJsaWMgVGFnRXJyb3JJbmZvSW1wbChpbnQgc3RhdGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnLCBTdHJpbmcgaGludCkgewotCQkJc3VwZXIoc3RhdGUsIG5ldyBTZWdtZW50KHRhZykpOwotCQkJdGhpcy5oaW50ID0gaGludDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SGludCgpIHsKLQkJCXJldHVybiBoaW50OwotCQl9Ci0KLQkJcHVibGljIHNob3J0IGdldFRhcmdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gTm9kZS5FTEVNRU5UX05PREU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWdDb3JydXB0ZWQoRWxlbWVudEluZm8gaW5mbykgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGluZm8uZW5kVGFnLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSXRlcmF0b3IgaXRlciA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZ24gPSAoSVRleHRSZWdpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFpc1ZhbGlkUmVnaW9uKHJnbikpCi0JCQkJcmV0dXJuIHRydWU7IC8vIGZvdW5kIGludmFsaWQgcmVnaW9uIHR5cGUuCi0JCX0KLQkJcmV0dXJuIGZhbHNlOyAvLyBhbGwgcmVnaW9ucyBhcmUgdmFsaWQuCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RW5kVGFnRnVsbFRleHQoRWxlbWVudEluZm8gaW5mbykgewotCQlTdHJpbmcgaGludCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBpbmZvLmVuZFRhZy5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmduID0gKElUZXh0UmVnaW9uKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmduLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpCi0JCQkJY29udGludWU7Ci0JCQloaW50ICs9IGluZm8uZW5kVGFnLmdldEZ1bGxUZXh0KHJnbik7Ci0JCX0KLQkJcmV0dXJuIGhpbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydENvcnJ1cHRlZEVuZFRhZ0Vycm9yKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGhpbnQgPSBnZXRFbmRUYWdGdWxsVGV4dChpbmZvKTsKLQkJVGFnRXJyb3JJbmZvSW1wbCBlcnJvciA9IG5ldyBUYWdFcnJvckluZm9JbXBsKFVOREVGSU5FRF9OQU1FX0VSUk9SLCBpbmZvLmVuZFRhZywgaGludCk7Ci0JCXRoaXMucmVwb3J0ZXIucmVwb3J0KGVycm9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVUYWdzKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJaWYgKGluZm8uaGFzU3RhcnRUYWcoKSkgewotCQkJaWYgKCFpbmZvLnRhcmdldC5pc1N0YXJ0VGFnQ2xvc2VkKCkpIHsKLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBTVEFSVCB0YWcgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby5zdGFydFRhZyk7Ci0JCQkJcmVwb3J0KFVOQ0xPU0VEX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChpbmZvLmhhc0VuZFRhZygpKSB7Ci0JCQkJaWYgKGluZm8uZGVjbCAhPSBudWxsKSB7Ci0JCQkJCWlmICgvKkNNVXRpbC5pc0hUTUwoaW5mby5kZWNsKSAmJiovICFpbmZvLnRhcmdldC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJCWlmIChpbmZvLnRhcmdldC5pc0NvbnRhaW5lcigpKSB7Ci0JCQkJCQkJLy8gU2V0IHRoZSBlcnJvciBtYXJrIHRvIHRoZSBzdGFydCBvZiB0aGUgZWxlbWVudC4KLQkJCQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoaW5mby50YXJnZXQsIEZNVXRpbC5TRUdfRU5EX1RBRyk7Ci0JCQkJCQkJcmVwb3J0KE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gTWFyayB0aGUgd2hvbGUgRU5EIHRhZyBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChpbmZvLmVuZFRhZyk7Ci0JCQkJCQkJcmVwb3J0KFVOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaW5mby5pc1hIVE1MKSB7Ci0JCQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoaW5mby50YXJnZXQsIEZNVXRpbC5TRUdfRU5EX1RBR19OQU1FKTsKLQkJCQkJCXJlcG9ydChNSVNTSU5HX1NUQVJUX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChpbmZvLmhhc0VuZFRhZygpKSB7Ci0JCQlpZiAoIWluZm8udGFyZ2V0LmlzQ2xvc2VkKCkpIHsKLQkJCQkvLyBTZXQgdGhlIHdob2xlIEVORCB0YWcgYXMgZXJyb3Igc2VnbWVudC4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby5lbmRUYWcpOwotCQkJCXJlcG9ydChVTkNMT1NFRF9FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGluZm8uaXNYSFRNTCkgeyAvLyBYSFRNTAotCQkJCWlmICghaW5mby50YXJnZXQuaXNFbXB0eVRhZygpICYmIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOLmVxdWFscyhpbmZvLnRhcmdldC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpKSkgewotCQkJCQkvKgotCQkJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ4OTYzIDoKLQkJCQkJICogcmVwb3J0IGVtcHR5IHRhZ3Mgbm90IHdyaXR0ZW4gYXMgc3VjaCwgYnV0IG9ubHkgd2hlbgotCQkJCQkgKiB0aGV5IGZvbGxvdyBhY3R1YWwgWE1ML0hUTUwgc3ludGF4Ci0JCQkJCSAqLwotCQkJCQlpZiAoaXNFbXB0eUNvbnRlbnQoaW5mby5kZWNsKSkgewotCQkJCQkJLy8gRU1QVFkgZWxlbWVudCBzaG91bGQgYmUgd3JpdHRlbiBpbiA8Li4uLz4gZm9ybQotCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGluZm8udGFyZ2V0LCBGTVV0aWwuU0VHX1NUQVJUX1RBRyk7Ci0JCQkJCQlyZXBvcnQoSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGVuZCB0YWcgaXMgcmVxdWlyZWQuCi0JCQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoaW5mby50YXJnZXQsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQkJCXJlcG9ydChNSVNTSU5HX0VORF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsgLy8gSFRNTAotCQkJCWlmIChpbmZvLmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJaWYgKGluZm8uZGVjbCAhPSBudWxsICYmIENNVXRpbC5pc0hUTUwoaW5mby5kZWNsKSAmJiAhaW5mby50YXJnZXQuaXNFbXB0eVRhZygpICYmICFDTVV0aWwuaXNFbmRUYWdPbWlzc2libGUoaW5mby5kZWNsKSAmJiBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTi5lcXVhbHMoaW5mby5zdGFydFRhZy5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSkpIHsKLQkJCQkJCS8vIFNldCB0aGUgZXJyb3IgbWFyayB0byB0aGUgZW5kIG9mIHRoZSBlbGVtZW50LgotCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGluZm8udGFyZ2V0LCBGTVV0aWwuU0VHX1NUQVJUX1RBRyk7Ci0JCQkJCQlyZXBvcnQoTUlTU0lOR19FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogcGVyZm9ybSB2YWxpZGF0aW9uIGFib3V0IHRhZyBuYW1lIGRlZmluaXRpb24uICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTmFtZXMoRWxlbWVudEluZm8gaW5mbykgewotCQlib29sZWFuIGNvcnJ1cHRlZCA9IGluZm8uaGFzRW5kVGFnKCkgJiYgaXNFbmRUYWdDb3JydXB0ZWQoaW5mbyk7Ci0JCWlmIChpbmZvLmRlY2wgPT0gbnVsbCkgewotCQkJLy8gSWYgbm8gZGVjbGFyYXRpb24gaXMgcmV0cmlldmVkLCB0aGUgdGFyZ2V0IGlzIHJlYWxseQotCQkJLy8gdW5rbm93biBlbGVtZW50LgotCQkJaWYgKCFpbmZvLmhhc1N0YXJ0VGFnKCkgJiYgY29ycnVwdGVkKSB7Ci0JCQkJcmVwb3J0Q29ycnVwdGVkRW5kVGFnRXJyb3IoaW5mbyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoaW5mby50YXJnZXQsIEZNVXRpbC5TRUdfU1RBUlRfVEFHX05BTUUpOwotCQkJCXJlcG9ydChVTkRFRklORURfTkFNRV9FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIEV2ZW4gaWYgYSBkZWNsYXJhdGlvbiBjb3VsZCBiZSByZXRyaWV2ZWQsIGlmIHRoZSBlbmQKLQkJCS8vIHRhZyBpcyBjb3JydXB0ZWQsIGl0IHNob3VsZCBiZSByZXBvcnRlZCBhcyB1bmRlZmluZWQKLQkJCS8vIG5hbWUuIChEMjAyNDkzKQotCQkJaWYgKGNvcnJ1cHRlZCkgewotCQkJCXJlcG9ydENvcnJ1cHRlZEVuZFRhZ0Vycm9yKGluZm8pOwotCQkJfQotCQl9Ci0JfQotCi0JLyogcGVyZm9ybSB2YWxpZGF0aW9uIHRhZyBjYXNlIG9ubHkgZm9yIFhIVE1MIGRvY3VtZW50ICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVGFnQ2FzZShFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCVN0cmluZyBkZWNsYXJlZCA9IGluZm8uZGVjbC5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgc3RhcnRUYWdOYW1lID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZW5kVGFnTmFtZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlY2xhcmVkID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gc3RhcnQgdGFnCi0JCWlmIChpbmZvLmhhc1N0YXJ0VGFnKCkpIHsKLQkJCXN0YXJ0VGFnTmFtZSA9IGdldFRhZ05hbWUoaW5mby5zdGFydFRhZyk7Ci0JCQlpZiAoIWRlY2xhcmVkLmVxdWFscyhzdGFydFRhZ05hbWUpKSB7Ci0JCQkJVGFnRXJyb3JJbmZvSW1wbCBlcnJvciA9IG5ldyBUYWdFcnJvckluZm9JbXBsKE1JU01BVENIRURfRVJST1IsIGluZm8uc3RhcnRUYWcsIHN0YXJ0VGFnTmFtZSk7Ci0JCQkJdGhpcy5yZXBvcnRlci5yZXBvcnQoZXJyb3IpOwotCQkJfQotCQl9Ci0JCS8vIGVuZCB0YWcKLQkJaWYgKGluZm8uaGFzRW5kVGFnKCkpIHsKLQkJCWVuZFRhZ05hbWUgPSBnZXRUYWdOYW1lKGluZm8uZW5kVGFnKTsKLQkJCWlmICghaW5mby5oYXNTdGFydFRhZygpIHx8ICghZW5kVGFnTmFtZS5lcXVhbHMoc3RhcnRUYWdOYW1lKSkpIHsKLQkJCQlpZiAoIWRlY2xhcmVkLmVxdWFscyhlbmRUYWdOYW1lKSkgewotCQkJCQlUYWdFcnJvckluZm9JbXBsIGVycm9yID0gbmV3IFRhZ0Vycm9ySW5mb0ltcGwoTUlTTUFUQ0hFRF9FUlJPUiwgaW5mby5lbmRUYWcsIGVuZFRhZ05hbWUpOwotCQkJCQl0aGlzLnJlcG9ydGVyLnJlcG9ydChlcnJvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ2hpbGRyZW4oTm9kZSB0YXJnZXQpIHsKLQkJaWYgKCh0YXJnZXQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgQ01VdGlsLmlzRm9yZWlnbigoRWxlbWVudCkgdGFyZ2V0KSkKLQkJCXJldHVybjsKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSB0YXJnZXQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCQl7Ci0JCQkJCQlJRE9NTm9kZSB0ZXh0ID0gKElET01Ob2RlKSBjaGlsZDsKLQkJCQkJCWludCBjaGFyT2Zmc2V0ID0gdmFsaWRhdGVUZXh0U291cmNlKHRleHQpOwotCQkJCQkJaWYgKGNoYXJPZmZzZXQgPj0gMCkgewotCQkJCQkJCWNoYXJPZmZzZXQgKz0gdGV4dC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChjaGFyT2Zmc2V0LCAxKTsKLQkJCQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJCQkJcmVwb3J0KElOVkFMSURfQ0hBUl9FUlJPUiwgZXJyb3JTZWcsIHRleHQpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCQkJewotCQkJCQkJSURPTU5vZGUgdGFnID0gKElET01Ob2RlKSBjaGlsZDsKLQkJCQkJCWlmICghdGFnLmlzQ2xvc2VkKCkpIHsKLQkJCQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQodGFnLCBGTVV0aWwuU0VHX1dIT0xFX1RBRyk7Ci0JCQkJCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCQkJCXJlcG9ydChVTkNMT1NFRF9UQUdfRVJST1IsIGVycm9yU2VnLCB0YWcpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCB2YWxpZGF0ZVRleHRTb3VyY2UoSURPTU5vZGUgdGV4dCkgewotCQl0cnkgewotCQkJU291cmNlVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTb3VyY2VWYWxpZGF0b3IodGV4dCk7Ci0JCQl2YWxpZGF0b3IudmFsaWRhdGVTb3VyY2UodGV4dC5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBleC5nZXRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydChpbnQgc3RhdGUsIFNlZ21lbnQgZXJyb3JTZWcsIE5vZGUgbm9kZSkgewotCQlFcnJvckluZm8gaW5mbyA9IG5ldyBFcnJvckluZm9JbXBsKHN0YXRlLCBlcnJvclNlZywgbm9kZSk7Ci0JCXJlcG9ydGVyLnJlcG9ydChpbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdGV4dC9JSFRNTFBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS90ZXh0L0lIVE1MUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2RkNWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS90ZXh0L0lIVE1MUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4gSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uCi0gKiB0eXBlcyBmb3IgSFRNTC4gQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQKLSAqIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJSFRNTFBhcnRpdGlvbnMgewotCi0JU3RyaW5nIEhUTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhUTUxfREVDTEFSQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSFRNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBTQ1JJUFQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTQ1JJUFRfRVZFTlRIQU5ETEVSID0gU0NSSVBUICsgIi5FVkVOVEhBTkRMRVIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNUWUxFID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSVNTVUU6IEkgdGhpbmsgbWV0YSB0YWcgYXJlYXMgYXJlIGhlcmUgdG9vPwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTU1ODc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1odG1sLXZhbGlkYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDIzOWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1odG1sZWRpdG9yLmphcgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDE1ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5odG1sLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiZWU3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0Lmh0bWwudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2MxMGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1dlZCBNYXIgMjggMDM6MjY6NDAgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzODc5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWksCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmRlcml2ZWQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc2VhcmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50YWdpbmZvO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuNDAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjIuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy44LjEsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjdlYmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHNyYy1odG1sLXZhbGlkYXRpb24vCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdodG1sX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdodG1sX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzVhYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3aHRtbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3aHRtbF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3aHRtbF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZlMThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2h0bWxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhYmxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5YjQ1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1hbmNob3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1hbmNob3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTg5OTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYW5jaG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYm9keS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWJvZHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDVmYTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYm9keS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWJ1dHRvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNDNmY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1idXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb250LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZm9udC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjQwY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb250LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZm9ybS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWZvcm0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjEzOTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZm9ybS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmNTE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1odG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaHRtbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzliYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1odG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UtbWFwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UtbWFwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzMjM1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWltYWdlLW1hcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWltYWdlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTg4YzFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg0NjAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWY4MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRpdGxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGl0bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTI5MDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGl0bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3ZmIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3aGZpbGVfd2l6LnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3aGZpbGVfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmYTQ0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2hmaWxlX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhNWIyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1IVE1MIFVJIFNvdXJjZSBFZGl0b3IKLUhUTUxfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9SFRNTCBFZGl0b3IKLVdFQi5uYW1lPVdlYgotSFRNTF9GaWxlcy5uYW1lPUhUTUwgRmlsZXMKLUhUTUxfU291cmNlLm5hbWU9RWRpdG9yCi1IVE1MX1RlbXBsYXRlcy5uYW1lPVRlbXBsYXRlcwotSFRNTF9TdHlsZXMubmFtZT1TdHlsZXMKLUhUTUxfU3ludGF4X0NvbG9yaW5nPVN5bnRheCBDb2xvcmluZwotSFRNTF9UeXBpbmc9VHlwaW5nCi1IVE1MX1ZhbGlkYXRpb249VmFsaWRhdGlvbgotSFRNTF9Qcm9wZXJ0eV92YWxpZGF0aW9uPUhUTUwgU3ludGF4Ci1XZWJDb250ZW50U2V0dGluZ3MubmFtZT1XZWIgQ29udGVudCBTZXR0aW5ncwotRGV2aWNlX1Byb2ZpbGVfRW50cnlfUHJvdmlkZXJfRXh0ZW5zaW9uLm5hbWU9RGV2aWNlIFByb2ZpbGUgRW50cnkgUHJvdmlkZXIgRXh0ZW5zaW9uCi1BbGxfSFRNTF9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1BbGwgSFRNTAotSFRNTF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9TmV3IEhUTUwKLUhUTUxfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUhUTUwgVGFnCi1IVE1MX0F0dHJpYnV0ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1IVE1MIEF0dHJpYnV0ZQotSFRNTF9BdHRyaWJ1dGVfdmFsdWVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SFRNTCBBdHRyaWJ1dGUgdmFsdWUKLUhUTUxfU3ludGF4X1ZhbGlkYXRvci5uYW1lPUhUTUwgU3ludGF4IFZhbGlkYXRvcgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI29yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMgZXh0ZW5zaW9uIHBvaW50Ci1fVUlfV0laQVJEX05BTUUgPSBIVE1MCi1fVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBIVE1MIHBhZ2UKLSMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIwotQ2xlYW51cERvY3VtZW50X2xhYmVsPUNsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLSMjCi1wcmVmZXJlbmNlS2V5d29yZHMuZmlsZXM9ZWRpdG9yIGh0bWwgY3JlYXRpbmcgc2F2aW5nIGZpbGVzIHN1ZmZpeCBzcGVjaWZpZWQgZW5jb2RpbmcgaWFuYSBsb2FkaW5nCi1wcmVmZXJlbmNlS2V5d29yZHMuc291cmNlPWVkaXRvciBodG1sIHNvdXJjZSBmb3JtYXR0aW5nIGxpbmUgd2lkdGggc3BsaXQgbXVsdGlwbGUgYXR0cmlidXRlcyBuZXcgY2xlYXIgYmxhbmsgaW5kZW50IHRhYnMgc3BhY2VzIHNpemUgY29udGVudCBhc3Npc3QgYXV0b21hdGljYWxseSBzdWdnZXN0aW9ucyBwcm9tcHQgY2hhcmFjdGVycyBpbnNlcnRlZCBzdHJhdGVneSBsYXggc3RyaWN0IG1hcmt1cCBjYXNlIGNvZGUgZ2VuZXJhdGlvbiB0YWcgbmFtZXMgY2FwaXRhbGl6YXRpb24gdXBwZXJjYXNlIGxvd2VyY2FzZQotcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcz1lZGl0b3IgaHRtbCB0ZW1wbGF0ZXMgc25pcHBldCBtYWNyb3MKLXByZWZlcmVuY2VLZXl3b3Jkcy5zdHlsZXM9ZWRpdG9yIGh0bWwgc3R5bGUgY3VzdG9taXplIHN5bnRheCBoaWdobGlnaHRpbmcgdHlwZSB0ZXh0IGNvbnRlbnQgZm9yZWdyb3VuZCBiYWNrZ3JvdW5kIGJvbGQgY29sb3IKLXByZWZlcmVuY2VLZXl3b3Jkcy53ZWJjb250ZW50PWVkaXRvciBodG1sIHdlYiBjb250ZW50IHNldHRpbmdzIHByb2ZpbGUgc3R5bGUgZG9jdW1lbnQgdHlwZSBkb2N0eXBlIHB1YmxpYyBzeXN0ZW0gY3NzCi1wcmVmZXJlbmNlS2V5d29yZHMuc2V2ZXJpdGllcz1odG1sIGVycm9ycyB3YXJuaW5ncyBpZ25vcmUgb3B0aW9ucyBzZXZlcml0eSBzZXZlcml0aWVzIHN1cHByZXNzIHByb2plY3Qgc3BlY2lmaWMgcHJvamVjdHNwZWNpZmljCi0jIwotSFRNTF9Tb3VyY2VfdGFyZ2V0X25hbWU9SFRNTCBTb3VyY2UKLQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5odG1sLm5hbWU9RWRpdGluZyBIVE1MIFNvdXJjZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5odG1sLmRlc2NyaXB0aW9uPUVkaXRpbmcgSFRNTCBTb3VyY2UKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuaHRtbC5vY2N1cnJlbmNlcy5uYW1lPUhUTUwgU291cmNlIE9jY3VycmVuY2VzCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmh0bWwub2NjdXJyZW5jZXMuZGVzY3JpcHRpb249SFRNTCBTb3VyY2UgT2NjdXJyZW5jZXMKLQotQ29sb3JzLnNjcmlwdEFyZWFCb3JkZXI9U2NyaXB0IEFyZWEgQm9yZGVyCi1oeXBlcmxpbmtEZXRlY3Rvci5hbmNob3IubmFtZT1BbmNob3JzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzE4NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0iZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIiIG5hbWU9IiVEZXZpY2VfUHJvZmlsZV9FbnRyeV9Qcm92aWRlcl9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuZXhzZCIvPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVIVE1MX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkFjdGlvbkNvbnRyaWJ1dG9ySFRNTCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotCQkJc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIj4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUuSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLSAgCQk8ZG9jdW1lbnRhdGlvblRleHRIb3ZlcgotICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRhZ2luZm8uSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUZBVUxUIj4KLSAgCQk8L2RvY3VtZW50YXRpb25UZXh0SG92ZXI+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InNvdXJjZWVkaXRpbmd0ZXh0dG9vbHMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQuSFRNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic3RydWN0dXJlZHRleHRmb2xkaW5ncHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbi5TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckhUTUwiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLlhNTFF1aWNrQXNzaXN0UHJvY2Vzc29yIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImF1dG9lZGl0c3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQuU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQsIG9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVDTEFSQVRJT04iIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5odG1sLCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zb3VyY2UsIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuc3R5bGVzLG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnZhbGlkYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0ic3BlbGxpbmdyZWdpb25zIgotCQkJdmFsdWU9IlhNTF9DT01NRU5UX1RFWFQsIFhNTF9DT05URU5UIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9ImFjdGl2ZWNvbnRleHRzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0Lmh0bWwub2NjdXJyZW5jZXMsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwubmF2aWdhdGlvbiwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb21tZW50cywgb3JnLmVjbGlwc2Uud3N0LnhtbC5zZWxlY3Rpb24iCi0gICAgICAgIAl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmFubm90YXRpb25Nb2RlbENyZWF0aW9uIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySFRNTCI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTxwYWdlCi0JCQluYW1lPSIlV0VCLm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMud2ViIj4KLQkJPC9wYWdlPgotCQk8IS0tIEhUTUwgUFJFRkVSRU5DRSBQQUdFUy0tPgotCQk8cGFnZQotCQkJbmFtZT0iJUhUTUxfRmlsZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy53ZWIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuaHRtbCI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuZmlsZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUhUTUxfU291cmNlLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuaHRtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MU291cmNlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuc291cmNlIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5zb3VyY2UiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUhUTUxfVGVtcGxhdGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkhUTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVIVE1MX1N5bnRheF9Db2xvcmluZyIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTFN5bnRheENvbG9yaW5nUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zdHlsZXMiPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnN0eWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9WYWxpZGF0aW9uIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLmh0bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy52YWxpZGF0aW9uIj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUhUTUxfVHlwaW5nIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudHlwaW5nIj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gV2ViIGNvbnRlbnQgc2V0dGluZ3MgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0JCTwhLS0gZm9yIGoyZWUgd2ViIHByb2plY3QgLS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlV2ViQ29udGVudFNldHRpbmdzLm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5keW5hbWljcHJvamVjdHByb3BlcnR5cGFnZSI+Ci0gICAgICAgICAJPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICAgCTxhbmQ+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8b3I+IAotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJ3c3Qud2ViIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS53ZWJjb250ZW50Ii8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVXZWJDb250ZW50U2V0dGluZ3MubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5XZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIj4KLSAgICAgICAgIAk8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCTxvcj4gCi0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlIiAvPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcGZyYWdtZW50c291cmNlIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS53ZWJjb250ZW50Ii8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVIVE1MX1Byb3BlcnR5X3ZhbGlkYXRpb24iCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcm9wZXJ0eVBhZ2UucHJvamVjdC52YWxpZGF0aW9uIgotCQkJY2F0ZWdvcnk9IlZhbGlkYXRpb25Qcm9wZXJ0aWVzUGFnZSI+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCi0JCQkJPC9hZGFwdD4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEtleXdvcmRzIGZvciBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmZpbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmZpbGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuc291cmNlIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy50ZW1wbGF0ZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zdHlsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuc3R5bGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy53ZWJjb250ZW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLndlYmNvbnRlbnQiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnNldmVyaXRpZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuc2V2ZXJpdGllcyIvPgotICAgIDwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRWRpdG9yIGFjdGlvbnNldHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIj4KLQkJCTwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZSI+Ci0JCQk8L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBUZW1wbGF0ZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZW1wbGF0ZXMiPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVBbGxfSFRNTF9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwiCi0JCQlpZD0iaHRtbF9hbGwiPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVIVE1MX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwiCi0JCQlpZD0iaHRtbF9uZXciPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVIVE1MX1RhZ19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwiCi0JCQlpZD0iaHRtbF90YWciPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVIVE1MX0F0dHJpYnV0ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwiCi0JCQlpZD0iaHRtbF9hdHRyaWJ1dGUiPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVIVE1MX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwiCi0JCQlpZD0iaHRtbF9hdHRyaWJ1dGVfdmFsdWUiPgotCQk8L2NvbnRleHRUeXBlPgotCQk8aW5jbHVkZQotCQkJZmlsZT0idGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy54bWwiCi0JCQl0cmFuc2xhdGlvbnM9IiRubCQvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIj4KLQkJPC9pbmNsdWRlPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRGVmaW5lIHRoZSBIVE1MIENvbnRleHRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmh0bWwubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuaHRtbC5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5odG1sLm9jY3VycmVuY2VzLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmh0bWwub2NjdXJyZW5jZXMuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwub2NjdXJyZW5jZXMiPgotCQk8L2NvbnRleHQ+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBpbml0aWFsaXplIGh0bWwgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBEb2N1bWVudCBwcm92aWRlciBmb3IgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyI+Ci0JCTxwcm92aWRlcgotCQkJaW5wdXRUeXBlcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkV4dGVybmFsRmlsZUVkaXRvcklucHV0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RmlsZURvY3VtZW50UHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuRXh0ZXJuYWxGaWxlRG9jdW1lbnRQcm92aWRlciI+Ci0JCTwvcHJvdmlkZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIFdvcmtiZW5jaCB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24gaWQ9IkhUTUxWYWxpZGF0b3IiIG5hbWU9IiVIVE1MX1N5bnRheF9WYWxpZGF0b3IubmFtZSIgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb24uSFRNTFZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0idHJ1ZSIKLSAgICAgICAgICAgIHNvdXJjZWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmh0bWxzeW50YXh2YWxpZGF0b3IiCi0gICAgICAgICAgICB2ZXJzaW9uPSIxIgotICAgICAgICAgICAgbWFya2VySWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudmFsaWRhdGlvbk1hcmtlciI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj48L2NvbnRlbnRUeXBlPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0iaHRtbCIvPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0ieGh0bWwiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9Imh0bSIvPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0iaHRwbCIvPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0id21sIi8+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICAgPGdyb3VwIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuc3RydWN0dXJlZE1vZGVsR3JvdXAiLz4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEFzIHlvdSB0eXBlIHZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbi5IVE1MVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uaHRtbHN5bnRheHZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCIvPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uTWFya3VwVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24ubWFya3VwdmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCi0JPCEtLSBOZXcgSFRNTCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQuTmV3SFRNTFdpemFyZCIKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05BTUUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2h0bWxfd2l6LmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9XSVpBUkRfQ1JFQVRFX05FV19GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEFkZCBuZXcgSFRNTCB3aXphcmQgdG8gSjJFRSBQcm9qZWN0IE5hdmlnYXRvciAtLT4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb21tb25XaXphcmQubmV3SFRNTCIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8dGVzdAotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0id3N0LndlYiIvPgotCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3Qud2ViIi8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+Ci0JPCEtLQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZS5lZGl0b3JBY3Rpb25zIgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkJbGFiZWw9IiVDbGVhbnVwRG9jdW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiCi0JCQkJdG9vbHRpcD0iJUNsZWFudXBEb2N1bWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkNsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iVG9nZ2xlQ29tbWVudCIKLQkJCQlsYWJlbD0iJVRvZ2dsZUNvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVUb2dnbGVDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlRvZ2dsZUNvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJUFkZEJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJUFkZEJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkFkZEJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iUmVtb3ZlQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVtb3ZlQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJGaW5kT2NjdXJyZW5jZXMiCi0JCQkJbGFiZWw9IiVGaW5kT2NjdXJyZW5jZXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2guSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJGaW5kT2NjdXJyZW5jZXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+LS0+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdC51aS5DbGVhbnVwRG9jdW1lbnRIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50Ij4KLSAgICAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmh0bWxTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaHRtbFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmhhbmRsZXJzLkhUTUxGaW5kT2NjdXJyZW5jZXNIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guZmluZC5vY2N1cnJlbmNlcyI+Ci0gICAgICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5vY2N1cnJlbmNlcyI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5vY2N1cnJlbmNlcyI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIAotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9yVGFyZ2V0cyI+Ci0JCTx0YXJnZXQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiCi0JCQluYW1lPSIlSFRNTF9Tb3VyY2VfdGFyZ2V0X25hbWUiPgotCQk8L3RhcmdldD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5oeXBlcmxpbmtEZXRlY3RvcnMiPgotCQk8aHlwZXJsaW5rRGV0ZWN0b3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuQW5jaG9ySHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkFuY2hvckh5cGVybGlua0RldGVjdG9yIgotCQkJbmFtZT0iJWh5cGVybGlua0RldGVjdG9yLmFuY2hvci5uYW1lIgotCQkJdGFyZ2V0SWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPgotCQk8L2h5cGVybGlua0RldGVjdG9yPgotCQkKLSAgIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5odG1sU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JICAgICAgICAgICA8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCSAgICAgICAgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIi8+Ci0JICAgICAgICAgICA8L2l0ZXJhdGU+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLm9jY3VycmVuY2VzIj4KLSAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JICAgICAgICAgICA8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCSAgICAgICAgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwub2NjdXJyZW5jZXMiLz4KLQkgICAgICAgICAgIDwvaXRlcmF0ZT4KLSAgICAgICAgICAgIDwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRGVmaW5lIHRoZW1lIC0gTWFueSBvZiB0aGUgY29sb3Igb3ZlcnJpZGVzIGFuZCBkZWZpbml0aW9ucyBjb21lIGZyb20gCi0JICAgICB0aGUgWE1MIHBsdWdpbiAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotCQk8dGhlbWUKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS5pZGUuc3lzdGVtRGVmYXVsdCI+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJTQ1JJUFRfQVJFQV9CT1JERVIiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCTwvdGhlbWU+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJTQ1JJUFRfQVJFQV9CT1JERVIiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLnNjcmlwdEFyZWFCb3JkZXIiCi0JCQl2YWx1ZT0iMTkxLCA5NSwgNjMiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEVuYWJsZSB0aGUgRm9ybWF0SGFuZGxlciBmb3IgSFRNTCBDb250ZW50IFR5cGUgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotCQk8aGFuZGxlciAKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkZvcm1hdEhhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0Ij4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5odG1sQ29udGVudFR5cGUuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmh0bWxDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIFNldCB1cCBhIGRlZmluaXRpb24gZm9yIEhUTUwgQ29udGVudCBUeXBlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmh0bWxDb250ZW50VHlwZS5kZWZpbml0aW9uIj4KLQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L2l0ZXJhdGU+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zY2hlbWEvZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc2NoZW1hL2RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MmY4MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zY2hlbWEvZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/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+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxMDY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5FcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblJlcG9ydGVyIHsKLQotCXByaXZhdGUgSVZhbGlkYXRvciBvd25lciA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotCXByaXZhdGUgSUZpbGUgZmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIEhUTUxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG51bGw7Ci0JcHJpdmF0ZSBNZXNzYWdlRmFjdG9yeSBmRmFjdG9yeSA9IG51bGw7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIoSVZhbGlkYXRvciBvd25lciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCWZGYWN0b3J5ID0gbmV3IE1lc3NhZ2VGYWN0b3J5KGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLmZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLnJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKHRoaXMucmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5yZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLm93bmVyLCB0aGlzLmZpbGUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gcmVtb3ZlIGJ5IG15c2VsZj8KLQkJCVN0cmluZyBpZCA9IEhUTUxWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCQkJdHJ5IHsKLQkJCQkvLyBUYXNrTGlzdEhlbHBlciBBUEkgY2hhbmdlZAotCQkJCS8vIFRhc2tMaXN0SGVscGVyLmdldFRhc2tMaXN0KCkucmVtb3ZlQWxsVGFza3MoaWQsIHRoaXMuZmlsZSwKLQkJCQkvLyBudWxsKTsKLQkJCQlUYXNrTGlzdEhlbHBlci5nZXRUYXNrTGlzdCgpLnJlbW92ZUFsbFRhc2tzKHRoaXMuZmlsZSwgaWQsIG51bGwpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uUmVzdWx0IGdldFJlc3VsdCgpIHsKLQkJaWYgKHRoaXMucmVzdWx0ID09IG51bGwpCi0JCQl0aGlzLnJlc3VsdCA9IG5ldyBIVE1MVmFsaWRhdGlvblJlc3VsdCgpOwotCQlyZXR1cm4gdGhpcy5yZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKQotCQkJcmV0dXJuOwotCQlJTWVzc2FnZSBtZXMgPSB0cmFuc2xhdGVNZXNzYWdlKG1lc3NhZ2UpOwotCi0JCWlmICh0aGlzLnJlcG9ydGVyICE9IG51bGwpIHsKLQkJCXRoaXMucmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLm93bmVyLCBtZXMpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHRoaXMuZmlsZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJLy8gYWRkIGJ5IG15c2VsZj8KLQkJCVN0cmluZyBpZCA9IEhUTUxWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gSW50ZWdlci50b1N0cmluZyhtZXMuZ2V0TGluZU51bWJlcigpKTsKLQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCUlQYXRoIGZpbGVQYXRoID0gdGhpcy5maWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJCW5hbWUgPSBmaWxlUGF0aC50b1N0cmluZygpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlUYXNrTGlzdEhlbHBlci5nZXRUYXNrTGlzdCgpLmFkZFRhc2soaWQsIHRoaXMuZmlsZSwgbG9jYXRpb24sIG1lcy5nZXRJZCgpLCBtZXMuZ2V0VGV4dCgpLCBtZXMuZ2V0U2V2ZXJpdHkoKSwgbmFtZSwgbWVzLmdldEdyb3VwTmFtZSgpLCBtZXMuZ2V0T2Zmc2V0KCksIG1lcy5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVHJhbnNsYXRlIFZhbGlkYXRpb25NZXNzYWdlIHRvIElNZXNzYWdlIGFuZCBnZW5lcmF0ZSByZXN1bHQgbG9nCi0JICovCi0JcHJpdmF0ZSBJTWVzc2FnZSB0cmFuc2xhdGVNZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaW50IHNldmVyaXR5ID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQlIVE1MVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBnZXRSZXN1bHQoKTsKLQkJc3dpdGNoIChtZXNzYWdlLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCQlyZXN1bHQuYWRkRXJyb3IoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQkJcmVzdWx0LmFkZFdhcm5pbmcoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSU5GT1JNQVRJT04gOgotCQkJCXJlc3VsdC5hZGRJbmZvcm1hdGlvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0vLwkJCQlyZXN1bHQuYWRkSW5mb3JtYXRpb24oKTsKLQkJCQlicmVhazsKLQkJfQotCi0JCUlNZXNzYWdlIG1lcyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlLmdldE1lc3NhZ2UoKSwgdGhpcy5maWxlKTsKLQkJbWVzLnNldE9mZnNldChtZXNzYWdlLmdldE9mZnNldCgpKTsKLQkJbWVzLnNldExlbmd0aChtZXNzYWdlLmdldExlbmd0aCgpKTsKLQkJaWYgKHRoaXMubW9kZWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBmbGF0TW9kZWwgPSB0aGlzLm1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGZsYXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaW50IGxpbmUgPSBmbGF0TW9kZWwuZ2V0TGluZU9mT2Zmc2V0KG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQkJCW1lcy5zZXRMaW5lTm8obGluZSArIDEpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBvcnQoRXJyb3JJbmZvIGluZm8pIHsKLQkJcmVwb3J0KGZGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoaW5mbykpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjNWYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0aW9uUmVzdWx0IHsKLQlwcml2YXRlIGludCBlcnJvcnMgPSAwOwotCXByaXZhdGUgaW50IHdhcm5pbmdzID0gMDsKLQlwcml2YXRlIGludCBpbmZvcm1hdGlvbnMgPSAwOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uUmVzdWx0KCkgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVycm9yKCkgewotCQl0aGlzLmVycm9ycysrOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEluZm9ybWF0aW9uKCkgewotCQl0aGlzLmluZm9ybWF0aW9ucysrOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoKSB7Ci0JCXRoaXMud2FybmluZ3MrKzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVycm9ycygpIHsKLQkJcmV0dXJuIHRoaXMuZXJyb3JzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5mb3JtYXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5pbmZvcm1hdGlvbnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRXYXJuaW5ncygpIHsKLQkJcmV0dXJuIHRoaXMud2FybmluZ3M7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJcmV0dXJuICh0aGlzLmVycm9ycyA9PSAwICYmIHRoaXMud2FybmluZ3MgPT0gMCAmJiB0aGlzLmluZm9ybWF0aW9ucyA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25Xb3JrYmVuY2hIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiZmRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlciBleHRlbmRzIFdvcmtiZW5jaENvbnRleHQgewotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIGFuIElWYWxpZGF0b3IgYXNzb2NpYXRlcyBhIHRhcmdldCBvYmplY3Qgd2l0aCBhbiBJTWVzc2FnZSwgdGhlCi0JICogV29ya2JlbmNoUmVwb3J0ZXIgZXZlbnR1YWxseSByZXNvbHZlcyB0aGF0IHRhcmdldCBvYmplY3Qgd2l0aCBhbgotCSAqIElSZXNvdXJjZS4gU29tZXRpbWVzIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZQotCSAqIElSZXNvdXJjZSAodXN1YWxseSB0aGUgSVByb2plY3QsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IElSZXNvdXJjZSB3aGVuIGFuCi0JICogSUZpbGUgY2Fubm90IGJlIGZvdW5kKS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkLCBieSB0aGUKLQkgKiBXb3JrYmVuY2hSZXBvcnRlciwgc28gdGhhdCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgY2FuIGRpc3Rpbmd1aXNoCi0JICogYmV0d2VlbiB0aGUgSU1lc3NhZ2VzIHdoaWNoIGFyZSBvbiB0aGUgc2FtZSBJUmVzb3VyY2UsIGJ1dCByZWZlciB0bwotCSAqIGRpZmZlcmVudCB0YXJnZXQgb2JqZWN0cy4gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZQotCSAqIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCkgbWV0aG9kLCBzbyB0aGF0IHdoZW4gb25lIHRhcmdldAotCSAqIG9iamVjdCByZW1vdmVzIGFsbCBvZiBpdHMgbWVzc2FnZXMsIHRoYXQgaXQgZG9lc24ndCByZW1vdmUgYW5vdGhlcgotCSAqIHRhcmdldCBvYmplY3QncyBtZXNzYWdlcy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgb25seSBpZiBvYmplY3QgaXMgbnVsbC4gT3RoZXJ3aXNlLCBhbiBpZAotCSAqIHdoaWNoIGNhbiB1bmlxdWVseSBpZGVudGlmeSBhIHBhcnRpY3VsYXIgb2JqZWN0IG11c3QgYmUgcmV0dXJuZWQuIFRoZQotCSAqIGlkIG5lZWRzIHRvIGJlIHVuaXF1ZSBvbmx5IHdpdGhpbiBvbmUgcGFydGljdWxhciBJVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpCi0JCQlyZXR1cm4gZ2V0UG9ydGFibGVOYW1lKChJRmlsZSkgb2JqZWN0KTsKLQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllN2M2ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5IVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JKb2IsIElTb3VyY2VWYWxpZGF0b3IsIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfV1NUX0hUTUxfQ09SRV9IVE1MU09VUkNFID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlKElGaWxlIGZpbGUpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZmlsZTsKLQkJZG8gewotCQkJaWYgKHJlc291cmNlLmlzRGVyaXZlZCgpIHx8IHJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSB8fCAhcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgfHwgKHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nICYmIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJd2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIElDb250ZW50VHlwZU1hbmFnZXIgZkNvbnRlbnRUeXBlTWFuYWdlcjsKLQlwcml2YXRlIElDb250ZW50VHlwZVtdIGZPdGhlclN1cHBvcnRlZENvbnRlbnRUeXBlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmQWRkaXRpb25hbENvbnRlbnRUeXBlc0lEcyA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkhUTUxDb250ZW50VHlwZTsKLQotCXB1YmxpYyBIVE1MVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCQlmQ29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCWZIVE1MQ29udGVudFR5cGUgPSBmQ29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKE9SR19FQ0xJUFNFX1dTVF9IVE1MX0NPUkVfSFRNTFNPVVJDRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qKgotCSAqIEdldHMgbGlzdCBvZiBjb250ZW50IHR5cGVzIHRoaXMgdmFsaWRhdG9yIGlzIGludGVyZXN0ZWQgaW4KLQkgKiAKLQkgKiBAcmV0dXJuIEFsbCBIVE1MLXJlbGF0ZWQgY29udGVudCB0eXBlcwotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZ2V0T3RoZXJTdXBwb3J0ZWRDb250ZW50VHlwZXMoKSB7Ci0JCWlmIChmT3RoZXJTdXBwb3J0ZWRDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJTGlzdCBjb250ZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQkJaWYgKGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDb250ZW50VHlwZSB0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHNbaV0pOwotCQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCQljb250ZW50VHlwZXMuYWRkKHR5cGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZk90aGVyU3VwcG9ydGVkQ29udGVudFR5cGVzID0gKElDb250ZW50VHlwZVtdKSBjb250ZW50VHlwZXMudG9BcnJheShuZXcgSUNvbnRlbnRUeXBlW2NvbnRlbnRUeXBlcy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gZk90aGVyU3VwcG9ydGVkQ29udGVudFR5cGVzOwotCX0KLQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElET01Nb2RlbCBnZXRNb2RlbChJUHJvamVjdCBwcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWNhbkhhbmRsZShmaWxlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQl0cnkgewotCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gcmV0cnkgaWdub3JpbmcgTUVUQSBjaGFyc2V0IGZvciBpbnZhbGlkIE1FVEEgY2hhcnNldAotCQkJCS8vIHNwZWNpZmljYXRpb24KLQkJCQkvLyByZWNyZWF0ZSBpbnB1dCBzdHJlYW0sIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBwYXJ0aWFsbHkgcmVhZAotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSwgbmV3IFN0cmluZygpLCBudWxsKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHsKLQkJCXJlbGVhc2VNb2RlbChtb2RlbCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElET01Nb2RlbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJRE9NTW9kZWwgbW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyKHRoaXMsIHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgZmlsZSBleHRlbnNpb24gdG8gdmFsaWRhdGUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlKElGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUlDb250ZW50VHlwZSBmaWxlQ29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJaWYgKGZpbGVDb250ZW50VHlwZS5pc0tpbmRPZihmSFRNTENvbnRlbnRUeXBlKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlDb250ZW50VHlwZVtdIG90aGVyVHlwZXMgPSBnZXRPdGhlclN1cHBvcnRlZENvbnRlbnRUeXBlcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJcmVzdWx0ID0gcmVzdWx0IHx8IGZpbGVDb250ZW50VHlwZS5pc0tpbmRPZihvdGhlclR5cGVzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChmSFRNTENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gZkhUTUxDb250ZW50VHlwZS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2hvdWxkIGJlIHJhcmUsIGJ1dCB3aWxsIGlnbm9yZSB0byBhdm9pZCBsb2dnaW5nICJlbmNvZGluZwotCQkJCS8vIGV4Y2VwdGlvbnMiIGFuZCB0aGUgbGlrZSBoZXJlLgotCQkJCS8vIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzSFRNTEZlYXR1cmUoSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWRhcHRlci5oYXNGZWF0dXJlKEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuSFRNTCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGhlbHBlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoKHJlcG9ydGVyICE9IG51bGwpICYmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpID09IHRydWUpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlTdHJpbmdbXSBkZWx0YUFycmF5ID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKGRlbHRhQXJyYXkgIT0gbnVsbCAmJiBkZWx0YUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCXZhbGlkYXRlRGVsdGEoaGVscGVyLCByZXBvcnRlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZGF0ZUZ1bGwoaGVscGVyLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHZhbGlkYXRlIGNhbGwgaXMgZm9yIHRoZSBJU291cmNlVmFsaWRhdG9yIHBhcnRpYWwgZG9jdW1lbnQKLQkgKiB2YWxpZGF0aW9uIGFwcHJvYWNoCi0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICogQHBhcmFtIGhlbHBlcgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUmVnaW9uIGRpcnR5UmVnaW9uLCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoaGVscGVyID09IG51bGwgfHwgZkRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKChyZXBvcnRlciAhPSBudWxsKSAmJiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSA9PSB0cnVlKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQl0cnkgewotCi0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQl9Ci0KLQkJCWlmIChkb2N1bWVudCA9PSBudWxsIHx8ICFoYXNIVE1MRmVhdHVyZShkb2N1bWVudCkpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQlyZXR1cm47IC8vaWdub3JlCi0JCQl9Ci0JCQkKLQkJCUlQYXRoIGZpbGVQYXRoID0gbnVsbDsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCQlJVGV4dEZpbGVCdWZmZXIgZmIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKGZEb2N1bWVudCk7Ci0JCQlpZiAoZmIgIT0gbnVsbCkgewotCQkJCWZpbGVQYXRoID0gZmIuZ2V0TG9jYXRpb24oKTsKLQotCQkJCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQkJCWlmICghZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJZmlsZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmaWxlUGF0aCA9IG5ldyBQYXRoKG1vZGVsLmdldElkKCkpOwotCQkJfQotCi0JCQkvLyB0aGlzIHdpbGwgYmUgdGhlIHdyb25nIHJlZ2lvbiBpZiBpdCdzIFRleHQgKGluc3RlYWQgb2YgRWxlbWVudCkKLQkJCS8vIHdlIGRvbid0IGtub3cgaG93IHRvIHZhbGlkYXRlIFRleHQKLQkJCUluZGV4ZWRSZWdpb24gaXIgPSBnZXRDb3ZlcmluZ05vZGUoZGlydHlSZWdpb24pOyAvLyAgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAoaXIgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJd2hpbGUgKGlyICE9IG51bGwgJiYgaXIgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCS8vIGl0J3MgYXNzdW1lZCB0aGF0IHRoaXMgZ2V0cyB0aGUgSW5kZXhlZFJlZ2lvbiB0bwotCQkJCQkvLyB0aGUgcmlnaHQgb2YgdGhlIGVuZCBvZmZzZXQKLQkJCQkJaXIgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGlyLmdldEVuZE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChpciBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCQlWYWxpZGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFZhbGlkYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KChJTm9kZU5vdGlmaWVyKSBpcik7Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCQkJaWYgKHJlcG9ydGVyICE9IG51bGwpIHsKLQkJCQkJSFRNTFZhbGlkYXRpb25SZXBvcnRlciByZXAgPSBudWxsOwotCQkJCQlyZXAgPSBnZXRSZXBvcnRlcihyZXBvcnRlciwgZmlsZSwgKElET01Nb2RlbCkgbW9kZWwpOwotCQkJCQlyZXAuY2xlYXIoKTsKLQkJCQkJYWRhcHRlci5zZXRSZXBvcnRlcihyZXApOwotCi0JCQkJCU1lc3NhZ2UgbWVzcyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgZmlsZVBhdGgudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSkpOwotCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzKTsKLQkJCQl9Ci0JCQkJYWRhcHRlci52YWxpZGF0ZShpcik7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSW5kZXhlZFJlZ2lvbiBnZXRDb3ZlcmluZ05vZGUoSVJlZ2lvbiBkaXJ0eVJlZ2lvbikgewotCQkKLQkJSW5kZXhlZFJlZ2lvbiBsYXJnZXN0UmVnaW9uID0gbnVsbDsKLQkJaWYoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSwgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJbGFyZ2VzdFJlZ2lvbiA9IGdldExhcmdlc3QocmVnaW9ucyk7Ci0JCX0KLQkJcmV0dXJuIGxhcmdlc3RSZWdpb247Ci0JfQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldExhcmdlc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHNkUmVnaW9ucykgewotCQkKLQkJaWYoc2RSZWdpb25zID09IG51bGwgfHwgc2RSZWdpb25zLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCSAKLQkJSW5kZXhlZFJlZ2lvbiBjdXJyZW50TGFyZ2VzdCA9IGdldENvcnJlc3BvbmRpbmdOb2RlKHNkUmVnaW9uc1swXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2RSZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBpZighc2RSZWdpb25zW2ldLmlzRGVsZXRlZCgpKSB7Ci0gICAgCQkJSW5kZXhlZFJlZ2lvbiBjb3JyZXNwb25kaW5nID0gZ2V0Q29ycmVzcG9uZGluZ05vZGUoc2RSZWdpb25zW2ldKTsKLSAgICAJCQkKLSAgICAJCQlpZihjdXJyZW50TGFyZ2VzdCBpbnN0YW5jZW9mIFRleHQpCi0gICAgCQkJCWN1cnJlbnRMYXJnZXN0ID0gY29ycmVzcG9uZGluZzsKLSAgICAJCQkKLSAgICAgICAgICAgICAgICBpZihjb3JyZXNwb25kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAJaWYoIShjb3JyZXNwb25kaW5nIGluc3RhbmNlb2YgVGV4dCkpIHsKLQkgICAgICAgIAkJCWlmIChjb3JyZXNwb25kaW5nLmdldFN0YXJ0T2Zmc2V0KCkgPD0gY3VycmVudExhcmdlc3QuZ2V0U3RhcnRPZmZzZXQoKSAgCi0JICAgICAgICAJCQkJCQkmJiAgY29ycmVzcG9uZGluZy5nZXRFbmRPZmZzZXQoKSA+PSBjdXJyZW50TGFyZ2VzdC5nZXRFbmRPZmZzZXQoKSApCi0JICAgICAgICAJCQkJY3VycmVudExhcmdlc3QgPSBjb3JyZXNwb25kaW5nOwotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCQl9Ci0JCXJldHVybiBjdXJyZW50TGFyZ2VzdDsKLQl9Ci0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q29ycmVzcG9uZGluZ05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLSAgICAgICAgSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzTW9kZWwgIT0gbnVsbCkgCi0gICAgICAgICAgICAgICAgaW5kZXhlZFJlZ2lvbiA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0KCkpOyAgICAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzTW9kZWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0gICAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBIVE1MVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJRE9NTW9kZWwgbW9kZWwsIElGaWxlIGZpbGUpIHsKLQkJSVByb2plY3QgcHJqID0gbnVsbDsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJcHJqID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJaWYgKChwcmogPT0gbnVsbCkgJiYgKG1vZGVsICE9IG51bGwpKSB7Ci0JCQlVUklSZXNvbHZlciByZXMgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJcHJqID0gcmVzLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlmaW5hbCBXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlciA9IG5ldyBXb3JrYmVuY2hSZXBvcnRlcihwcmosIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlyZXR1cm4gdmFsaWRhdGUocmVwb3J0ZXIsIGZpbGUsIG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEhUTUxWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSURPTU1vZGVsIG1vZGVsKSB7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgbW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlpZiAoIWhhc0hUTUxGZWF0dXJlKGRvY3VtZW50KSkKLQkJCXJldHVybiBudWxsOyAvLyBpZ25vcmUKLQotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCVZhbGlkYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoVmFsaWRhdGlvbkFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQoZG9jdW1lbnQpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJSFRNTFZhbGlkYXRpb25SZXBvcnRlciByZXAgPSBnZXRSZXBvcnRlcihyZXBvcnRlciwgZmlsZSwgbW9kZWwpOwotCQlyZXAuY2xlYXIoKTsKLQkJYWRhcHRlci5zZXRSZXBvcnRlcihyZXApOwotCQlhZGFwdGVyLnZhbGlkYXRlKGRvY3VtZW50KTsKLQkJcmV0dXJuIHJlcC5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVDb250YWluZXIoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQl0cnkgewotCQkJSVJlc291cmNlW10gcmVzb3VyY2VBcnJheSA9IGNvbnRhaW5lci5tZW1iZXJzKGZhbHNlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlQXJyYXlbaV07Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsKLQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0JCQkJCXZhbGlkYXRlRmlsZShoZWxwZXIsIHJlcG9ydGVyLCAoSUZpbGUpIHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCXZhbGlkYXRlQ29udGFpbmVyKGhlbHBlciwgcmVwb3J0ZXIsIChJQ29udGFpbmVyKSByZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVEZWx0YShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJU3RyaW5nW10gZGVsdGFBcnJheSA9IGhlbHBlci5nZXRVUklzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFBcnJheS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGRlbHRhID0gZGVsdGFBcnJheVtpXTsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAocmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgZGVsdGEuc3Vic3RyaW5nKDEpKTsKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQkJCX0KLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoZGVsdGEpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSkKLQkJCQljb250aW51ZTsKLQkJCXZhbGlkYXRlRmlsZShoZWxwZXIsIHJlcG9ydGVyLCAoSUZpbGUpIHJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUZpbGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlKSB7Ci0JCWlmICgocmVwb3J0ZXIgIT0gbnVsbCkgJiYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgPT0gdHJ1ZSkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmICghc2hvdWxkVmFsaWRhdGUoZmlsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJRE9NTW9kZWwgbW9kZWwgPSBnZXRNb2RlbChmaWxlLmdldFByb2plY3QoKSwgZmlsZSk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQl2YWxpZGF0ZShyZXBvcnRlciwgZmlsZSwgbW9kZWwpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJcmVsZWFzZU1vZGVsKG1vZGVsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUZ1bGwoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlTdHJpbmdbXSBmaWxlRGVsdGEgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgSVdvcmtiZW5jaENvbnRleHQpIHsKLQkJCUlXb3JrYmVuY2hDb250ZXh0IHdiSGVscGVyID0gKElXb3JrYmVuY2hDb250ZXh0KSBoZWxwZXI7Ci0JCQlwcm9qZWN0ID0gd2JIZWxwZXIuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCWVsc2UgaWYoZmlsZURlbHRhLmxlbmd0aCA+IDApewotCQkJLy8gd29uJ3Qgd29yayBmb3IgcHJvamVjdCB2YWxpZGF0aW9uIChiL2Mgbm90aGluZyBpbiBmaWxlIGRlbHRhKQotCQkJcHJvamVjdCA9IGdldFJlc291cmNlKGZpbGVEZWx0YVswXSkuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXZhbGlkYXRlQ29udGFpbmVyKGhlbHBlciwgcmVwb3J0ZXIsIHByb2plY3QpOwotCX0KLQotCS8qCi0JICogYWRkZWQgdG8gZ2V0IHJpZCBvciBkZXBlbmRlbmN5IG9uIElXb3JrYmVuY2hIZWxwZXIKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKFN0cmluZyBkZWx0YSkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGRlbHRhKSk7Ci0JfQotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIEV4Y2VwdGlvbiBjYXRjaGluZyB3YXMgcmVtb3ZlZCwgc2VlCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM2MDAKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl2YWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmQWRkaXRpb25hbENvbnRlbnRUeXBlc0lEcyA9IG5ldyBTdHJpbmdbMF07Ci0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCWlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nICYmIGRhdGEudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlmQWRkaXRpb25hbENvbnRlbnRUeXBlc0lEcyA9IFN0cmluZ1V0aWxzLnVucGFjayhkYXRhLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybiBudWxsOwotCQlWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCUlSZXBvcnRlciByZXBvcnRlciA9IHJlc3VsdC5nZXRSZXBvcnRlcihtb25pdG9yKTsKLQkJdmFsaWRhdGVGaWxlKG51bGwsIHJlcG9ydGVyLCAoSUZpbGUpIHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTM4NzI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLQotLyoqCi0gKiBjb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkxvY2FsaXplZE1lc3NhZ2UKLSAqIAotICogVGhpcyBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdmFsaWRhdG9ycyB3aGljaCBydW4gb25seSBpbiBFY2xpcHNlIGFuZCB3aG9zZSBtZXNzYWdlcywgYmVjYXVzZSB0aGV5Ci0gKiBjb21lIGZyb20gYW5vdGhlciB0b29sLCBhcmUgYWxyZWFkeSBsb2NhbGl6ZWQuIExvY2FsaXplZE1lc3NhZ2UgY2Fubm90IGJlIHVzZWQgYnkgYW55IHZhbGlkYXRvcgotICogd2hpY2ggbmVlZHMgdG8gcnVuIGluIGJvdGggV2ViU3BoZXJlIGFuZCBFY2xpcHNlLgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxpemVkTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgewotCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlID0gbnVsbDsKLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0KSB7Ci0JCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgewotCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlzdXBlcihudWxsLCBzZXZlcml0eSwgbnVsbCk7Ci0JCXNldExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVRleHQpOwotCQlzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsLCBDbGFzc0xvYWRlciBjbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9UYXNrTGlzdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWVkZTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiAKLSAqIENsYXNzIHRvIGhlbHAgdGhpcyBQcm9ibGVtJ3MgbGlzdC4KLSAqIAotICovCi1jbGFzcyBUYXNrTGlzdEhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgVGFza0xpc3RIZWxwZXIgX3Rhc2tMaXN0SGVscGVyID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgVGFza0xpc3RIZWxwZXIgZ2V0VGFza0xpc3QoKSB7Ci0JCWlmIChfdGFza0xpc3RIZWxwZXIgPT0gbnVsbCkgewotCQkJX3Rhc2tMaXN0SGVscGVyID0gbmV3IFRhc2tMaXN0SGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF90YXNrTGlzdEhlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhZGRzIGEgbWVzc2FnZSB0byBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGFzayhTdHJpbmcgcGx1Z2luSWQsIElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgbWVzc2FnZSwgaW50IG1hcmtlclR5cGUsIFN0cmluZyB0YXJnZXRPYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRhc2tMaXN0VXRpbGl0eS5hZGRUYXNrKHBsdWdpbklkLCByZXNvdXJjZSwgbG9jYXRpb24sIG1lc3NhZ2VJZCwgbWVzc2FnZSwgbWFya2VyVHlwZSwgdGFyZ2V0T2JqZWN0TmFtZSwgZ3JvdXBOYW1lLCBvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgbWVzc2FnZXMgZnJvbSBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgb3duZXIsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRhc2tMaXN0VXRpbGl0eS5yZW1vdmVBbGxUYXNrcyhyZXNvdXJjZSwgb3duZXIsIG9iamVjdE5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9UYXNrTGlzdFV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGUwYTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtdXN0IGJlIGNhbGxlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIAotICogVGhpcyBzaW5nbGV0b24gaW50ZXJhY3RzIHdpdGggdGhlIGVjbGlwc2Ugd29ya2JlbmNoJ3MgVGFzayBsaXN0LgotICogVGFza0xpc3RVdGlsaXR5IGFkZHMgYW5kIHJlbW92ZXMgdGFza3MgZnJvbSB0aGUgbGlzdC4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhbiBJV29ya3NwYWNlUnVubmFibGUgb3IKLSAqIElSdW5uYWJsZVdpdGhQcm9ncmVzcy4gTWFueSByZXNvdXJjZSBkZWx0YXMgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUgbWV0aG9kcwotICogaW4gdGhpcyBjbGFzcy4KLSAqIAotICogVGhpcyBjYW1lIGZyb20gVGFza0xpc3RVdGlsaXR5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTGlzdFV0aWxpdHkgewotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gSFRNTFVJUGx1Z2luLklEOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUiA9IFBMVUdJTl9JRCArICIucHJvYmxlbW1hcmtlciI7IC8vJE5PTi1OTFMtMSQgLy8gVGhlIGV4dGVuc2lvbiB3aGljaCBpcyB1c2VkIHRvIGFkZCB2YWxpZGF0aW9uIG1hcmtlcnMgdG8gdGhlIHRhc2sgbGlzdAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9PV05FUiA9ICJvd25lciI7IC8vJE5PTi1OTFMtMSQgLy8gVGhlIElWYWxpZGF0b3Igd2hvIG93bnMgdGhlIElNYXJrZXIgb24gdGhlIHRhc2sgbGlzdAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9TRVZFUklUWSA9ICJ2YWxpZGF0aW9uU2V2ZXJpdHkiOyAvLyROT04tTkxTLTEkIC8vIG9uZSBvZiB0aGUgSU1lc3NhZ2UgdmFsdWVzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSX1RBUkdFVE9CSkVDVCA9ICJ0YXJnZXRPYmplY3QiOyAvLyROT04tTkxTLTEkIC8vIFdoZW4gbW9yZSB0aGFuIG9uZSB0YXJnZXQgb2JqZWN0IHJlc29sdmVzIHRvIHRoZSBzYW1lIElSZXNvdXJjZSwgdGhpcyBmaWVsZCBpZGVudGlmaWVzIHdoaWNoIHRhcmdldE9iamVjdCBvd25zIGEgcGFydGljdWxhciBtZXNzYWdlLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9HUk9VUCA9ICJncm91cE5hbWUiOyAvLyROT04tTkxTLTEkIC8vIEZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCB0aGlzIGZpZWxkIGFzc29jaWF0ZXMgYSBtZXNzYWdlIHdpdGggYSBncm91cCwgc28gdGhhdCBhIHN1YnNldCBvZiBtZXNzYWdlcyBtYXkgYmUgcmVtb3ZlZCBmcm9tIGEgZmlsZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfTUVTU0FHRUlEID0gIm1lc3NhZ2VJZCI7IC8vJE5PTi1OTFMtMSQgLy8gUGVyc2lzdCB0aGUgbWVzc2FnZSBpZCBvZiB0aGUgbWVzc2FnZSwgbm90IGp1c3QgdGhlIHRyYW5zbGF0ZWQgdGV4dC4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVQVEhfSU5GSU5JVEUgPSBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFUFRIX1pFUk8gPSBJUmVzb3VyY2UuREVQVEhfWkVSTzsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJTWFya2VyW10gTk9fTUFSS0VSUyA9IG5ldyBJTWFya2VyWzBdOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWRkcyBhIG1lc3NhZ2UgdG8gYSByZXNvdXJjZSBpbiB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1hcmtlciBhZGRUYXNrKFN0cmluZyBwbHVnaW5JZCwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgbWFya2VyVHlwZSwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKChtZXNzYWdlID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBnZXRTZXZlcml0eShtYXJrZXJUeXBlKTsKLQotCQkvLyBBbGxvdyBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgdGFzayBsaXN0LgotCQkvLyBQcmlvciB0byBhIGZ1bGwgdmFsaWRhdGlvbiwgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHdpbGwgcmVtb3ZlCi0JCS8vIGFsbCBtZXNzYWdlcyBvd25lZAotCQkvLyBieSBhIHZhbGlkYXRvciBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuCi0JCS8vIFByaW9yIHRvIGFuIGluY3JlbWVudGFsIHZhbGlkYXRpb24sIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayB3aWxsCi0JCS8vIHJlbW92ZSBhbGwgbWVzc2FnZXMsCi0JCS8vIG9uIGVhY2ggb2YgdGhlIGNoYW5nZWQgcmVzb3VyY2VzLCBvd25lZCBieSBhIHZhbGlkYXRvciBiZWZvcmUgaXQgaXMKLQkJLy8gaW52b2tlZC4KLQkJLy8gCi0JCS8vIEl0IGlzIHVwIHRvIHRoZSB2YWxpZGF0b3IgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IGFkZGluZyB0aGUKLQkJLy8gc2FtZSBtZXNzYWdlCi0JCS8vIGluIG1vcmUgdGhhbiBvbmUgcGxhY2UsIGFuZCBhbHNvIHRvIGNsZWFyIG91dCBhbnkgb2xkIG1lc3NhZ2VzCi0JCS8vIHdoaWNoIGFyZSBub3QgY2xlYXJlZAotCQkvLyBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0JCUlNYXJrZXIgaXRlbSA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihWQUxJREFUSU9OX01BUktFUik7IC8vIGFkZCBhCi0JCQkJCQkJCQkJCQkJCQkJCS8vIHZhbGlkYXRpb24KLQkJCQkJCQkJCQkJCQkJCQkJLy8gbWFya2VyCi0KLQkJLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHJlcGxhY2UgdGhlIG11bHRpcGxlIHNldEF0dHJpYnV0ZQotCQkvLyBjYWxscyBhYm92ZSB3aXRoIGEgc2luZ2xlIHNldEF0dHJpYnV0ZXMgY2FsbC4KLQkJYm9vbGVhbiBvZmZzZXRTZXQgPSAoKG9mZnNldCAhPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQpICYmIChsZW5ndGggIT0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKSk7Ci0JCWludCBzaXplID0gKG9mZnNldFNldCkgPyAxMCA6IDg7IC8vIGFkZCBDSEFSX1NUQVJULCBDSEFSX0VORCBvbmx5Ci0JCQkJCQkJCQkJCS8vIGlmIHRoZSBvZmZzZXQgaXMgc2V0LiBJZiB0aGUKLQkJCQkJCQkJCQkJLy8gb2Zmc2V0IGlzIHNldCwgaXQgdGFrZXMKLQkJCQkJCQkJCQkJLy8gcHJlY2VuZGVuY2Ugb3ZlciB0aGUgbGluZQotCQkJCQkJCQkJCQkvLyBudW1iZXIuIChlY2xpcHNlJ3MgcnVsZSwgbm90Ci0JCQkJCQkJCQkJCS8vIG1pbmUuKQotCQlTdHJpbmdbXSBhdHRyaWJOYW1lcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCU9iamVjdFtdIGF0dHJpYlZhbHVlcyA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0KLQkJLy8gVmVyeSBmaXJzdCB0aGluZywgYWRkIHRoZSBvd25lci4gVGhhdCB3YXksIGlmIHRoZSBjb2RlIGRpZXMKLQkJLy8gYmVmb3JlIHRoaW5ncyBhcmUgcGVyc2lzdGVkLCBob3BlZnVsbHkgdGhpcyBtYXJrZXIgd2lsbCBiZQotCQkvLyBwZXJzaXN0ZWQuCi0JCS8vIEhvcGVmdWxseSwgZWNsaXBzZSBXSUxMIHBlcnNpc3QgdGhpcyBmaWVsZCwgYXMgcmVxdWVzdGVkLgotCQlhdHRyaWJOYW1lc1swXSA9IFZBTElEQVRJT05fTUFSS0VSX09XTkVSOwotCQlhdHRyaWJWYWx1ZXNbMF0gPSBwbHVnaW5JZDsKLQkJYXR0cmliTmFtZXNbMV0gPSBWQUxJREFUSU9OX01BUktFUl9TRVZFUklUWTsgLy8gdGhpcyB2YWxpZGF0aW9uCi0JCQkJCQkJCQkJCQkJCS8vIHNldmVyaXR5IGlzIHN0b3JlZCwKLQkJCQkJCQkJCQkJCQkJLy8gaW4gYWRkaXRpb24gdG8gdGhlCi0JCQkJCQkJCQkJCQkJCS8vIG1hcmtlciBzZXZlcml0eSwgdG8KLQkJCQkJCQkJCQkJCQkJLy8gZW5hYmxlIG1vcmUgdGhhbgotCQkJCQkJCQkJCQkJCQkvLyBvbmUgc2V2ZXJpdHkgb2YKLQkJCQkJCQkJCQkJCQkJLy8gbWVzc2FnZSB0byBiZQotCQkJCQkJCQkJCQkJCQkvLyBkaXNwbGF5ZWQuIGUuZy4KLQkJCQkJCQkJCQkJCQkJLy8gRVJST1IgfCBXQVJOSU5HCi0JCQkJCQkJCQkJCQkJCS8vICh1c2luZyBiaW5hcnkgT1IpLgotCQkJCQkJCQkJCQkJCQkvLyBUaGUgSU1hcmtlcgotCQkJCQkJCQkJCQkJCQkvLyBjb25zdGFudHMgYXJlCi0JCQkJCQkJCQkJCQkJCS8vIHJlZ3VsYXIgZGVjaW1hbAotCQkJCQkJCQkJCQkJCQkvLyBjb25zdGFudHMuCi0JCWF0dHJpYlZhbHVlc1sxXSA9IG5ldyBJbnRlZ2VyKG1hcmtlclR5cGUpOwotCQlhdHRyaWJOYW1lc1syXSA9IFZBTElEQVRJT05fTUFSS0VSX1RBUkdFVE9CSkVDVDsgLy8gdG8gZGlzdGluZ3Vpc2gKLQkJCQkJCQkJCQkJCQkJCS8vIGJldHdlZW4KLQkJCQkJCQkJCQkJCQkJCS8vIG1lc3NhZ2VzIHdoaWNoCi0JCQkJCQkJCQkJCQkJCQkvLyBhcmUgcmVnaXN0ZXJlZAotCQkJCQkJCQkJCQkJCQkJLy8gb24gYW4KLQkJCQkJCQkJCQkJCQkJCS8vIElSZXNvdXJjZSwgYnV0Ci0JCQkJCQkJCQkJCQkJCQkvLyBhZ2FpbnN0Ci0JCQkJCQkJCQkJCQkJCQkvLyBkaWZmZXJlbnQKLQkJCQkJCQkJCQkJCQkJCS8vIHRhcmdldCBvYmplY3RzCi0JCWF0dHJpYlZhbHVlc1syXSA9ICgodGFyZ2V0T2JqZWN0TmFtZSA9PSBudWxsKSA/ICIiIDogdGFyZ2V0T2JqZWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXR0cmliTmFtZXNbM10gPSBWQUxJREFUSU9OX01BUktFUl9HUk9VUDsKLQkJYXR0cmliVmFsdWVzWzNdID0gKChncm91cE5hbWUgPT0gbnVsbCkgPyAiIiA6IGdyb3VwTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXR0cmliTmFtZXNbNF0gPSBJTWFya2VyLk1FU1NBR0U7Ci0JCWF0dHJpYlZhbHVlc1s0XSA9IG1lc3NhZ2U7Ci0JCWF0dHJpYk5hbWVzWzVdID0gVkFMSURBVElPTl9NQVJLRVJfTUVTU0FHRUlEOwotCQlhdHRyaWJWYWx1ZXNbNV0gPSBtZXNzYWdlSWQ7Ci0KLQkJYXR0cmliTmFtZXNbNl0gPSBJTWFya2VyLlNFVkVSSVRZOyAvLyBJTWFya2VyLlNFVkVSSVRZX0VSUk9SLAotCQkJCQkJCQkJCQkvLyBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsCi0JCQkJCQkJCQkJCS8vIElNYXJrZXIuU0VWRVJJVFlfSU5GTwotCQlhdHRyaWJWYWx1ZXNbNl0gPSBuZXcgSW50ZWdlcihzZXZlcml0eSk7Ci0JCXRyeSB7Ci0JCQkvLyBJZiB0aGUgbG9jYXRpb24gaXMgYSBsaW5lIG51bWJlciwgc3RvcmUgaXQgYXMgYSBsaW5lIG51bWJlcgotCQkJSW50ZWdlciBsaW5lTnVtYmVyID0gSW50ZWdlci52YWx1ZU9mKGxvY2F0aW9uKTsKLQkJCWF0dHJpYk5hbWVzWzddID0gSU1hcmtlci5MSU5FX05VTUJFUjsKLQkJCWF0dHJpYlZhbHVlc1s3XSA9IGxpbmVOdW1iZXI7Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIE90aGVyd2lzZSwgc3RvcmUgaXQgYXMgYSB0ZXh0IGxvY2F0aW9uCi0JCQlhdHRyaWJOYW1lc1s3XSA9IElNYXJrZXIuTE9DQVRJT047Ci0JCQlhdHRyaWJWYWx1ZXNbN10gPSBsb2NhdGlvbjsKLQkJfQotCi0JCWlmIChvZmZzZXRTZXQpIHsKLQkJCWF0dHJpYk5hbWVzWzhdID0gSU1hcmtlci5DSEFSX1NUQVJUOwotCQkJYXR0cmliVmFsdWVzWzhdID0gbmV3IEludGVnZXIob2Zmc2V0KTsKLQkJCWF0dHJpYk5hbWVzWzldID0gSU1hcmtlci5DSEFSX0VORDsKLQkJCWF0dHJpYlZhbHVlc1s5XSA9IG5ldyBJbnRlZ2VyKG9mZnNldCArIGxlbmd0aCk7Ci0JCX0KLQotCQlpdGVtLnNldEF0dHJpYnV0ZXMoYXR0cmliTmFtZXMsIGF0dHJpYlZhbHVlcyk7Ci0KLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gb25lIG9mIHRoZSBTZXZlcml0eUVudW0gc2V2ZXJpdGllcywgcmV0dXJuIHRoZSBJTWFya2VyIHNldmVyaXR5Ci0JICogaW50IHRoYXQgaXMgaXRzIGVxdWl2YWxlbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFNldmVyaXR5KGludCBzZXZlcml0eUVudW1WYWx1ZSkgewotCQlzd2l0Y2ggKHNldmVyaXR5RW51bVZhbHVlKSB7Ci0JCQljYXNlIChJTWVzc2FnZS5ISUdIX1NFVkVSSVRZKSA6IHsKLQkJCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9FUlJPUjsKLQkJCX0KLQotCQkJY2FzZSAoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZKSA6IHsKLQkJCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9JTkZPOwotCQkJfQotCi0JCQljYXNlIChJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpIDogewotCQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLkFMTF9NRVNTQUdFUykgOgotCQkJY2FzZSAoSU1lc3NhZ2UuRVJST1JfQU5EX1dBUk5JTkcpIDoKLQkJCWRlZmF1bHQgOiB7Ci0JCQkJLy8gYXNzdW1lIGl0J3MgYSB3YXJuaW5nLgotCQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGVwdGgoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gREVQVEhfSU5GSU5JVEU7IC8vIERFUFRIX0lORklOSVRFIG1lYW5zIGdldCB0aGlzIHByb2plY3QncwotCQkJCQkJCQkJLy8gbWFya2VycywgYW5kIHRoZSBtYXJrZXJzIGJlbG9uZ2luZyB0bwotCQkJCQkJCQkJLy8gdGhlIHByb2plY3QncyBjaGlsZHJlbi4KLQkJfQotCQllbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSB7Ci0JCQkvLyBOZWVkZWQgZm9yIHRoZSBWYWxpZGF0aW9uTWlncmF0b3Igd2hlbiBpdCBjaGVja3MgZm9yIG9ycGhhbgotCQkJLy8gdGFza3MuCi0JCQlyZXR1cm4gREVQVEhfSU5GSU5JVEU7IC8vIERFUFRIX0lORklOSVRFIG1lYW5zIGdldCBhbGwgb2YgdGhlCi0JCQkJCQkJCQkvLyBtYXJrZXJzIGluIHRoZSB3b3Jrc3BhY2UKLQkJfQotCi0JCXJldHVybiBERVBUSF9aRVJPOyAvLyBERVBUSF9aRVJPIG1lYW5zIGp1c3QgdGhpcyByZXNvdXJjZSwgbm90IGl0cwotCQkJCQkJCS8vIGNoaWxkcmVuCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBzZXZlcml0eSwgaW50IGRlcHRoKSB7Ci0JCUlNYXJrZXJbXSB0ZW1wTWFya2VycyA9IG51bGw7Ci0JCWludCB2YWxpZENvdW50ID0gMDsKLQkJdHJ5IHsKLQkJCUlNYXJrZXJbXSBhbGxNYXJrZXJzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYWxsTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKFZBTElEQVRJT05fTUFSS0VSLCBmYWxzZSwgZGVwdGgpOyAvLyBmYWxzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbWVhbnMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9ubHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbnNpZGVyCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBQUk9CTEVNX01BUktFUiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5vdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdmFyaWFudHMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBQUk9CTEVNX01BUktFUi4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFNpbmNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhZGRUYXNrCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvbmx5Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhZGRzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBQUk9CTEVNX01BUktFUiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHdlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkb24ndAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbmVlZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdG8KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbnNpZGVyCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpdHMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHN1YnR5cGVzLgotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gTG9nZ2VyIGxvZ2dlciA9Ci0JCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkvLyBpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkvLyBMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkvLyBlbnRyeS5zZXRTb3VyY2VJRCgiVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UsCi0JCQkJLy8gaW50KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJLy8gbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCS8vIH0KLQkJCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJCX0KLQotCQkJLy8gTm93IGZpbHRlciBpbiB0aGUgbWFya2VycywgYmFzZWQgb24gc2V2ZXJpdHkgdHlwZS4KLQkJCWlmIChhbGxNYXJrZXJzLmxlbmd0aCAhPSAwKSB7Ci0JCQkJdGVtcE1hcmtlcnMgPSBuZXcgSU1hcmtlclthbGxNYXJrZXJzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gYWxsTWFya2Vyc1tpXTsKLQkJCQkJSW50ZWdlciBmaWx0ZXJTZXZlcml0eSA9IChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZBTElEQVRJT05fTUFSS0VSX1NFVkVSSVRZKTsKLQkJCQkJaWYgKGZpbHRlclNldmVyaXR5ID09IG51bGwpIHsKLQkJCQkJCS8vIG9kZC4uLm1hcmtlciB3YXNuJ3QgY3JlYXRlZCBjb3JyZWN0bHkuIEhvdyBjb3VsZAotCQkJCQkJLy8gdGhpcyBoYXBwZW4/Ci0JCQkJCQkvLyBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IHNldmVyaXR5IGFuZCBhZGQgaXQgdG8gdGhlCi0JCQkJCQkvLyBsaXN0LgotCQkJCQkJdHJ5IHsKLQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIGdldFNldmVyaXR5KHNldmVyaXR5KSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCQkvLyBMb2dnZXIgbG9nZ2VyID0KLQkJCQkJCQkvLyBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJCS8vIGlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJCS8vIExvZ0VudHJ5IGVudHJ5ID0KLQkJCQkJCQkvLyBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQkJLy8gZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MoaW50LAotCQkJCQkJCS8vIElSZXNvdXJjZSwgaW50KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQkJLy8gbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCQkJCS8vIH0KLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkJLy8gTG9nZ2VyIGxvZ2dlciA9Ci0JCQkJCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCQkvLyBpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQkvLyBMb2dFbnRyeSBlbnRyeSA9Ci0JCQkJCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJCS8vIGVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKGludCwKLQkJCQkJCQkvLyBJUmVzb3VyY2UsIGludCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQkJCS8vIGxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKHNldmVyaXR5ICYgZmlsdGVyU2V2ZXJpdHkuaW50VmFsdWUoKSkgPT0gMCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJdGVtcE1hcmtlcnNbdmFsaWRDb3VudCsrXSA9IG1hcmtlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCS8vIGlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJLy8gTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkvLyBlbnRyeS5zZXRTb3VyY2VJRCgiVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhpbnQsCi0JCQkvLyBJUmVzb3VyY2UsIGludCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkvLyBsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkvLyB9Ci0JCX0KLQotCQlpZiAodmFsaWRDb3VudCA9PSAwKSB7Ci0JCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJfQotCi0JCUlNYXJrZXJbXSB2YWxpZE1hcmtlcnMgPSBuZXcgSU1hcmtlclt2YWxpZENvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTWFya2VycywgMCwgdmFsaWRNYXJrZXJzLCAwLCB2YWxpZENvdW50KTsKLQkJcmV0dXJuIHZhbGlkTWFya2VyczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gbWVzc2FnZU93bmVycywgaW50IGRlcHRoKSB7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBJTWVzc2FnZS5BTExfTUVTU0FHRVMsIGRlcHRoKTsKLQkJaWYgKG1hcmtlcnMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJSU1hcmtlcltdIHRlbXAgPSBuZXcgSU1hcmtlclttYXJrZXJzLmxlbmd0aF07Ci0JCWludCB2YWxpZENvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0KLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IG93bmVyID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9PV05FUik7Ci0JCQkJaWYgKChvd25lciA9PSBudWxsKSB8fCAhKG93bmVyIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQkvLyBUaGUgVmFsaWRhdGlvbk1pZ3JhdG9yIHdpbGwgcmVtb3ZlIGFueSAidW5vd25lZCIKLQkJCQkJLy8gdmFsaWRhdGlvbiBtYXJrZXJzLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1lc3NhZ2VPd25lcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2VPd25lciA9IG1lc3NhZ2VPd25lcnNbal07Ci0JCQkJCWlmICgoKFN0cmluZykgb3duZXIpLmVxdWFscyhtZXNzYWdlT3duZXIpKSB7Ci0JCQkJCQl0ZW1wW3ZhbGlkQ291bnQrK10gPSBtYXJrZXI7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIExvZ2dlciBsb2dnZXIgPQotCQkJCS8vIFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJLy8gaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJLy8gTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJLy8gZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwKLQkJCQkvLyBTdHJpbmdbXSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCS8vIGxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkvLyB9Ci0JCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCQl9Ci0JCX0KLQotCQlJTWFya2VyW10gcmVzdWx0ID0gbmV3IElNYXJrZXJbdmFsaWRDb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCB2YWxpZENvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgYWxsIHZhbGlkYXRpb24gdGFza3MgZnJvbSB0aGUgcmVzb3VyY2UuIElmIGRlcHRoCi0JICogaXMgSU5GSU5JVEUsIGNoaWxkIHRhc2tzIGFyZSByZXR1cm5lZCBhcyB3ZWxsLiBPbmx5IHRoZSB0YXNrcyB3aGljaCBhcmUKLQkgKiBvd25lZCBieSB0aGUgc3BlY2lmaWVkIG1lc3NhZ2VPd25lciwgYW5kIGFwcGx5IHRvIHRoZSBuYW1lZCBJTWVzc2FnZSdzCi0JICogdGFyZ2V0IG9iamVjdCAob2JqZWN0TmFtZSkgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gbWVzc2FnZU93bmVyLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgobWVzc2FnZU93bmVyID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCUlNYXJrZXJbXSB2YWxpZExpc3QgPSBudWxsOwotCQlJTWFya2VyW10gbWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgbWVzc2FnZU93bmVyLCBkZXB0aCk7Ci0JCWlmIChtYXJrZXJzICE9IG51bGwpIHsKLQkJCXZhbGlkTGlzdCA9IG5ldyBJTWFya2VyW21hcmtlcnMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQotCQkJCS8vIElmIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZQotCQkJCS8vIHJlc291cmNlLCByZW1vdmluZyBvbmUgdGFyZ2V0J3MKLQkJCQkvLyBtZXNzYWdlcyBzaG91bGQgbm90IHJlbW92ZSB0aGUgb3RoZXIgdGFyZ2V0IG9iamVjdCdzCi0JCQkJLy8gbWVzc2FnZXMuCi0JCQkJaWYgKG9iamVjdE5hbWUgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgdGFyZ2V0T2JqZWN0ID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1QpOwotCQkJCQlpZiAoKHRhcmdldE9iamVjdCA9PSBudWxsKSB8fCAhKHRhcmdldE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgfHwgISgoKFN0cmluZykgdGFyZ2V0T2JqZWN0KS5lcXVhbHMob2JqZWN0TmFtZSkpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChncm91cE5hbWUgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgZ3JvdXAgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZBTElEQVRJT05fTUFSS0VSX0dST1VQKTsKLQkJCQkJaWYgKChncm91cCA9PSBudWxsKSB8fCAhKGdyb3VwIGluc3RhbmNlb2YgU3RyaW5nKSB8fCAhKCgoU3RyaW5nKSBncm91cCkuZXF1YWxzKGdyb3VwTmFtZSkpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXZhbGlkTGlzdFt2YWxpZENvdW50KytdID0gbWFya2VyOwotCQkJfQotCQl9Ci0KLQkJaWYgKHZhbGlkQ291bnQgPT0gMCkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlJTWFya2VyW10gcmVzdWx0ID0gbmV3IElNYXJrZXJbdmFsaWRDb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodmFsaWRMaXN0LCAwLCByZXN1bHQsIDAsIHZhbGlkQ291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYWxsIG1lc3NhZ2VzIGZyb20gYSByZXNvdXJjZSBpbiB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBvd25lciwgU3RyaW5nIG9iamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG5ldyBTdHJpbmdbXXtvd25lcn0sIG9iamVjdE5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycywgU3RyaW5nIG9iamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgZ2V0RGVwdGgocmVzb3VyY2UpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lLCBpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlVGFza1N1YnNldChyZXNvdXJjZSwgb3duZXJzLCBvYmplY3ROYW1lLCBudWxsLCBkZXB0aCk7IC8vIG51bGwKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1lYW5zCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBubwotCQkJCQkJCQkJCQkJCQkJCQkJLy8gZ3JvdXAKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5hbWUKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGEgc3Vic2V0IG9mIHRhc2tzIGZyb20gdGhlIHByb2plY3QsIGluY2x1ZGluZyBjaGlsZAotCSAqIHRhc2tzLiBFdmVyeSB0YXNrIHdoaWNoIGJlbG9uZ3MgdG8gdGhlIGdyb3VwLCBpZGVudGlmaWVkIGJ5IGdyb3VwTmFtZSwKLQkgKiB3aWxsIGJlIHJlbW92ZWQuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlbW92ZVRhc2tTdWJzZXQoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKChvd25lcnMgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJTWFya2VyW10gYWxsVGFza3MgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgZ3JvdXBOYW1lLCBkZXB0aCk7Ci0JCWlmIChhbGxUYXNrcy5sZW5ndGggPiAwKSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhhbGxUYXNrcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjA2YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0RG91YmxlQ2xpY2tTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3IgYSBzb3VyY2Ugdmlld2VyIHdoaWNoIHNob3dzIEhUTUwgY29udGVudC4KLSAqIDxwPgotICogQ2xpZW50cyBjYW4gc3ViY2xhc3MgYW5kIG92ZXJyaWRlIGp1c3QgdGhvc2UgbWV0aG9kcyB3aGljaCBtdXN0IGJlIHNwZWNpZmljCi0gKiB0byB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUzsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTDsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwoKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElBdXRvRWRpdFN0cmF0ZWd5W10gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJTGlzdCBhbGxTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN1cGVyU3RyYXRlZ2llcyA9IHN1cGVyLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlclN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKHN1cGVyU3RyYXRlZ2llc1tpXSk7Ci0JCX0KLQotCQkvLyBiZSBzdXJlIHRoaXMgaXMgYWRkZWQgbGFzdCBpbiBsaXN0LCBzbyBpdCBoYXMgYSBjaGFuZ2UgdG8gbW9kaWZ5Ci0JCS8vIHByZXZpb3VzIHJlc3VsdHMuCi0JCS8vIGFkZCBhdXRvIGVkaXQgc3RyYXRlZ3kgdGhhdCBoYW5kbGVzIHdoZW4gdGFiIGtleSBpcyBwcmVzc2VkCi0JCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicygpKTsKLQotCQlyZXR1cm4gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJU3RyaW5nW10geG1sVHlwZXMgPSBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJCVN0cmluZ1tdIGh0bWxUeXBlcyA9IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1syICsgeG1sVHlwZXMubGVuZ3RoICsgaHRtbFR5cGVzLmxlbmd0aF07Ci0KLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzWzBdID0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXNbMV0gPSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT047Ci0KLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHhtbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXggKz0gMiwgeG1sVHlwZXMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaHRtbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXggKz0geG1sVHlwZXMubGVuZ3RoLCBodG1sVHlwZXMubGVuZ3RoKTsKLQkJfQotCi0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gbnVsbDsKLQotCQlpZiAoKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCkpIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJQ1NTUGFydGl0aW9ucy5TVFlMRSkgewotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OKSB7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUwoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRGb3JtYXR0ZXIgZ2V0Q29udGVudEZvcm1hdHRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlJQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBzdXBlci5nZXRDb250ZW50Rm9ybWF0dGVyKHNvdXJjZVZpZXdlcik7Ci0JCS8vIHN1cGVyIHdhcyB1bmFibGUgdG8gY3JlYXRlIGEgZm9ybWF0dGVyLCBwcm9iYWJseSBiZWNhdXNlCi0JCS8vIHNvdXJjZVZpZXdlciBkb2VzIG5vdCBoYXZlIGRvY3VtZW50IHNldCB5ZXQsIHNvIGp1c3QgY3JlYXRlIGEKLQkJLy8gZ2VuZXJpYyBvbmUKLQkJaWYgKCEoZm9ybWF0dGVyIGluc3RhbmNlb2YgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikpCi0JCQlmb3JtYXR0ZXIgPSBuZXcgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcihnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0JCSgoTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikgZm9ybWF0dGVyKS5zZXRNYXN0ZXJTdHJhdGVneShuZXcgU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneShuZXcgSFRNTEZvcm1hdFByb2Nlc3NvckltcGwoKSkpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHVibGljIElUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSBnZXREb3VibGVDbGlja1N0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpIHsKLQkJCS8vIHVzZSB4bWwncyBkb3VibGVjbGljayBzdHJhdGVneQotCQkJcmV0dXJuIGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEluZGVudFByZWZpeGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJVmVjdG9yIHZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQotCQkvLyBwcmVmaXhbMF0gaXMgZWl0aGVyICdcdCcgb3IgJyAnIHggdGFiV2lkdGgsIGRlcGVuZGluZyBvbiBwcmVmZXJlbmNlCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCWJvb2xlYW4gdXNlU3BhY2VzID0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UuZXF1YWxzKGluZGVudENoYXJQcmVmKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCVN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlib29sZWFuIGFwcGVuZFRhYiA9IGZhbHNlOwotCi0JCQlpZiAodXNlU3BhY2VzKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogKyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaisrKQotCQkJCQlwcmVmaXguYXBwZW5kKCcgJyk7Ci0KLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRUYWIgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJCXByZWZpeC5hcHBlbmQoJyAnKTsKLQotCQkJCWlmIChpICE9IGluZGVudGF0aW9uV2lkdGgpCi0JCQkJCWFwcGVuZFRhYiA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChhcHBlbmRUYWIpIHsKLQkJCQlwcmVmaXguYXBwZW5kKCdcdCcpOwotCQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQkJCS8vIHJlbW92ZSB0aGUgdGFiIHNvIHRoYXQgaW5kZW50YXRpb24gLSB0YWIgaXMgYWxzbyBhbiBpbmRlbnQKLQkJCQkvLyBwcmVmaXgKLQkJCQlwcmVmaXguZGVsZXRlQ2hhckF0KHByZWZpeC5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQkJdmVjdG9yLmFkZChwcmVmaXgudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQl2ZWN0b3IuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAoU3RyaW5nW10pIHZlY3Rvci50b0FycmF5KG5ldyBTdHJpbmdbdmVjdG9yLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCS8vIHdvcmthcm91bmQgSVhNTFBhcnRpdGlvbnMuWE1MX1BJCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5UIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04gfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfUEkpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTCgpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTKCl9OwotCQl9Ci0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUyA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTCA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTCgpOwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MOwotCX0KLQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZTdGF0dXNMaW5lTGFiZWxQcm92aWRlciA9IG5ldyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCi0JCQkJCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIGVsZW1lbnQ7Ci0JCQkJCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQkJcy5pbnNlcnQoMCwgc3VwZXIuZ2V0VGV4dChub2RlKSk7Ci0JCQkJCQl9Ci0JCQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJCQlzLmluc2VydCgwLCBJUGF0aC5TRVBBUkFUT1IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCXJldHVybiBmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZ2V0WE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCgpOwotCQl9Ci0JCXJldHVybiBmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldEh5cGVybGlua0RldGVjdG9yVGFyZ2V0cyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlNYXAgdGFyZ2V0cyA9IHN1cGVyLmdldEh5cGVybGlua0RldGVjdG9yVGFyZ2V0cyhzb3VyY2VWaWV3ZXIpOwotCQl0YXJnZXRzLnB1dChDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwsIG51bGwpOwotCi0JCS8vIGFsc28gYWRkIHhtbCBzaW5jZSB0aGVyZSBjb3VsZCBiZSB4bWwgY29udGVudCBpbiBodG1sCi0JCS8vIChqdXN0IGhvcGUgdGhlIGh5cGVybGluayBkZXRlY3RvcnMgd2lsbCBkbyBhZGRpdGlvbmFsIGNoZWNraW5nKQotCQl0YXJnZXRzLnB1dChDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MLCBudWxsKTsKLQkJcmV0dXJuIHRhcmdldHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTY5Y2QzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IEhUTUwgVUkKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBIVE1MVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgSFRNTFVJTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChmUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlmUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYW1wbGVfSFRNTF9kb2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9IVE1MOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlc19lbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRPY2N1cnJlbmNlc19sYWJlbDsJLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9EZXNjcmlwdGlvbl9vZl9yb2xlX29mX2ZvbGxvd2luZ19ET0NUWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9QdWJsaWNfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfU3lzdGVtX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQ1NTX3Byb2ZpbGVfX18yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X2Fzc2lzdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljYWxseV9tYWtlX3N1Z2dlc3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb21wdF93aGVuX3RoZXNlX2NoYXJhY3RlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXR0aW5nX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaW5lX3dpZHRoX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3BsaXRfbXVsdGlwbGVfYXR0cmlidXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbGlnbl9maW5hbF9icmFja2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ190YWJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ19zcGFjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50YXRpb25fc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplX3RpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhcl9hbGxfYmxhbmtfbGluZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZlcnJlZF9tYXJrdXBfY2FzZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVzX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVzX1VwcGVyX2Nhc2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19uYW1lc19Mb3dlcl9jYXNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZXNfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZXNfVXBwZXJfY2FzZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVzX0xvd2VyX2Nhc2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19uYW1lX2Nhc2VfZm9yX0hUTUxfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19uYW1lX2Nhc2VfQXNfaXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19uYW1lX2Nhc2VfTG93ZXJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19uYW1lX2Nhc2VfVXBwZXJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9uYW1lX2Nhc2VfZm9yX0hUTUxfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9uYW1lX2Nhc2VfQXNfaXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9uYW1lX2Nhc2VfTG93ZXJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9uYW1lX2Nhc2VfVXBwZXJfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc2VydF9yZXF1aXJlZF9hdHRyaWJ1dGVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnNlcnRfbWlzc2luZ190YWdzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdW90ZV9hdHRyaWJ1dGVfdmFsdWVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRfc291cmNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb252ZXJ0X0VPTF9jb2Rlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX1dpbmRvd3NfVUk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX1VuaXhfVUk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX01hY19VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNjsKLQkKLQkvLyBiZWxvdyBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgZGVsZXRlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8zOwotCS8vIGFib3ZlIGFyZSBwb3NzaWJseSB1bnVzZWQgc3RyaW5ncyB0aGF0IG1heSBiZSBkZWxldGVkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LOwotCQotCS8vIEhUTUwgVHlwaW5nIFByZWZlcmVuY2VzCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFR5cGluZ19BdXRvX0NvbXBsZXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxUeXBpbmdfQXV0b19SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFR5cGluZ19Db21wbGV0ZV9Db21tZW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVHlwaW5nX0NvbXBsZXRlX0VuZF9UYWdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxUeXBpbmdfUmVtb3ZlX0VuZF9UYWdzOwotCQotCS8vIGJlbG93IGFyZSB0aGUgc3RyaW5ncyBmb3IgdGhlIHZhbGlkYXRpb24gcGFnZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbl9XYXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbl9JZ25vcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwYW5kYWJsZV9sYWJlbF9hdHRyaWJ1dGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZGFibGVfbGFiZWxfZWxlbWVudHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwYW5kYWJsZV9sYWJlbF9kb2N1bWVudF90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZGFibGVfbGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBhbmRhYmxlX2xhYmVsX2NvbW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwYW5kYWJsZV9sYWJlbF9jZGF0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBhbmRhYmxlX2xhYmVsX3BpOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZGFibGVfbGFiZWxfZW50aXR5X3JlZjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzIyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzM1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV85OwotCQotCS8vIFZhbGlkYXRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fV29ya3NwYWNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX2pvYk5hbWU7Ci0JCi0JLy8gSHlwZXJsaW5rcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEh5cGVybGlua19saW5lOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwNDkzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIEhUTUxVSVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7CQotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgaHRtbCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGh0bWwgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQotCXB1YmxpYyBIVE1MVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEhUTUxVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTFVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgZ2V0QWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGh0bWwgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGh0bWwgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0KLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGh0bWwgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGh0bWwgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFMTCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuVEFHKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFUVFJJQlVURSk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BVFRSSUJVVEVfVkFMVUUpOwotCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMWYzYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlICAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgYSBzYW1wbGUgSFRNTCBkb2N1bWVudC4gIFBsZWFzZSB0cmFuc2xhdGUgb25seSB0aGUgZm9sbG93aW5nIHBhcnRzOgotIyMgSFRNTCBIaWdobGlnaHRpbmcgUHJlZmVyZW5jZXMKLSMjIHdlIG5lZWQgYSBmbGFtaW5nIGxvZ28KLVNhbXBsZV9IVE1MX2RvYz08IURPQ1RZUEUgaHRtbFxuXHRQVUJMSUMgXCItLy9XM0MvRFRELyBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTlwiXG5cdFwiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkXCI+XG48aHRtbD5cblx0PGhlYWQ+XG5cdFx0PG1ldGEgY29udGVudD1cInRleHQvaHRtbFwiPlxuXHRcdDx0aXRsZT5IVE1MIEhpZ2hsaWdodGluZyBQcmVmZXJlbmNlczwvdGl0bGU+XG5cdDwvaGVhZD5cbjxib2R5PlxuXHQ8IS0tXG5cdFx0d2UgbmVlZCBhIGZsYW1pbmcgbG9nbyFcblx0LS0+XG5cdDxwPnRocmVlJm5ic3A7Jm5ic3A7Jm5ic3A7c3BhY2VzPC9wPlxuPC9ib2R5PlxuPC9odG1sPgotCi1IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8wPUxvYWRpbmcgZmlsZXMKLSMKLV9VSV9XSVpBUkRfTkVXX1RJVExFID0gTmV3IEhUTUwgUGFnZQotX1VJX1dJWkFSRF9ORVdfSEVBRElORyA9IEhUTUwgUGFnZQotX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04gPSBDcmVhdGUgYSBuZXcgSFRNTCBQYWdlLgotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0hUTUwgPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgezB9LgotX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5UID0gRmlsZXMgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4geW91ciBkZXBsb3llZCBXZWIgYXBwbGljYXRpb24uIAotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IEhUTUwgVGVtcGxhdGUKLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBIVE1MIHBhZ2UuCi1OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8yPU5hbWUKLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzQ9VXNlIEhUTUwgVGVtcGxhdGUKLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzU9UHJldmlldwotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgSFRNTCcgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5IVE1MIFRlbXBsYXRlczwvYT4gcHJlZmVyZW5jZSBwYWdlLgotIwotQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc9Q3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgcHJlZmVyZW5jZQotIyBDb3BpZWQgZnJvbSBzc2UudWkKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb249Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249QWRkIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1SZW1vdmUgQmxvY2sgQ29tbWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLUNyZWF0aW5nX2ZpbGVzPUNyZWF0aW5nIGZpbGVzCi1FbmNvZGluZ19kZXNjPVRoZSBmb2xsb3dpbmcgZW5jb2Rpbmcgd2lsbCBhcHBseToKLSMjIEhUTUwgU291cmNlIHByZWZlcmVuY2UgcGFnZQotQ29udGVudF9hc3Npc3RfVUlfPUNvbnRlbnQgYXNzaXN0Ci1BdXRvbWF0aWNhbGx5X21ha2Vfc3VnZ2VzdF9VSV89QXV0b21hdGljYWxseSBtYSZrZSBzdWdnZXN0aW9ucwotUHJvbXB0X3doZW5fdGhlc2VfY2hhcmFjdGVfVUlfPVAmcm9tcHQgd2hlbiB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDoKLUZvcm1hdHRpbmdfVUlfPUZvcm1hdHRpbmcKLUxpbmVfd2lkdGhfX1VJXz1MaW5lICZ3aWR0aDoKLVNwbGl0X211bHRpcGxlX2F0dHJpYnV0ZXM9U3BsaXQgJm11bHRpcGxlIGF0dHJpYnV0ZXMgZWFjaCBvbiBhIG5ldyBsaW5lCi1BbGlnbl9maW5hbF9icmFja2V0PSZBbGlnbiBmaW5hbCBicmFja2V0IGluIG11bHRpLWxpbmUgZWxlbWVudCB0YWdzCi1JbmRlbnRfdXNpbmdfdGFicz0mSW5kZW50IHVzaW5nIHRhYnMKLUluZGVudF91c2luZ19zcGFjZXM9SSZuZGVudCB1c2luZyBzcGFjZXMKLUluZGVudGF0aW9uX3NpemU9SW4mZGVudGF0aW9uIHNpemU6Ci1JbmRlbnRhdGlvbl9zaXplX3RpcD1JbmRlbnRhdGlvbiBzaXplCi1DbGVhcl9hbGxfYmxhbmtfbGluZXNfVUlfPUNsZWFyIGFsbCAmYmxhbmsgbGluZXMKLVByZWZlcnJlZF9tYXJrdXBfY2FzZV9VSV89UHJlZmVycmVkIG1hcmt1cCBjYXNlIGZvciBjb250ZW50IGFzc2lzdCwgYW5kIGNvZGUgZ2VuZXJhdGlvbgotVGFnX25hbWVzX19VSV89VGFnIG5hbWVzOgotVGFnX25hbWVzX1VwcGVyX2Nhc2VfVUlfPSZVcHBlcmNhc2UKLVRhZ19uYW1lc19Mb3dlcl9jYXNlX1VJXz0mTG93ZXJjYXNlCi1BdHRyaWJ1dGVfbmFtZXNfX1VJXz1BdHRyaWJ1dGUgbmFtZXM6Ci1BdHRyaWJ1dGVfbmFtZXNfVXBwZXJfY2FzZV9VSV89VSZwcGVyY2FzZQotQXR0cmlidXRlX25hbWVzX0xvd2VyX2Nhc2VfVUlfPUwmb3dlcmNhc2UKLUNsZWFudXBfVUlfPUNsZWFudXAKLVRhZ19uYW1lX2Nhc2VfZm9yX0hUTUxfVUlfPVRhZyBuYW1lIGNhc2UgZm9yIEhUTUw6Ci1UYWdfbmFtZV9jYXNlX0FzX2lzX1VJXz0mQXMtaXMKLVRhZ19uYW1lX2Nhc2VfTG93ZXJfVUlfPSZMb3dlcgotVGFnX25hbWVfY2FzZV9VcHBlcl9VSV89JlVwcGVyCi1BdHRyaWJ1dGVfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXz1BdHRyaWJ1dGUgbmFtZSBjYXNlIGZvciBIVE1MOgotQXR0cmlidXRlX25hbWVfY2FzZV9Bc19pc19VSV89QSZzLWlzCi1BdHRyaWJ1dGVfbmFtZV9jYXNlX0xvd2VyX1VJXz1MJm93ZXIKLUF0dHJpYnV0ZV9uYW1lX2Nhc2VfVXBwZXJfVUlfPVUmcHBlcgotSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfPUluc2VydCAmcmVxdWlyZWQgYXR0cmlidXRlcwotSW5zZXJ0X21pc3NpbmdfdGFnc19VSV89Jkluc2VydCBtaXNzaW5nIHRhZ3MKLVF1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfVUlfPSZRdW90ZSBhdHRyaWJ1dGUgdmFsdWVzCi1Gb3JtYXRfc291cmNlX1VJXz0mRm9ybWF0IHNvdXJjZQotQ29udmVydF9FT0xfY29kZXNfVUlfPUNvbnZlcnQgbGluZSAmZGVsaW1pdGVycyB0bwotRU9MX1dpbmRvd3NfVUk9JldpbmRvd3MKLUVPTF9Vbml4X1VJPVUmTklYCi1FT0xfTWFjX1VJPSZNYWMKLQotIyB3ZWIgY29udGVudCBzZXR0aW5ncwotVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRT1Vc2UgdGhlIGZvbGxvd2luZyBkZWZhdWx0IGRvY3VtZW50IHR5cGUgd2hlbiBubyBET0NUWVBFIGlzIGRlY2xhcmVkIGluIGEgZmlsZToKLVVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMT1Eb2N1bWVudCB0eXBlOgotVUlfUHVibGljX0lEPVB1YmxpYyBJRDoKLVVJX1N5c3RlbV9JRD1TeXN0ZW0gSUQ6Ci1VSV9ub25lPW5vbmUKLVVJX0NTU19wcm9maWxlX19fMj1DU1MgcHJvZmlsZToKLVdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPVRoZSBwcm9wZXJ0aWVzIHVzZWQgdGhhdCBjYW5ub3Qgb3IgYXJlIG5vdCBzcGVjaWZpZWQgaW4gd2ViIGZpbGVzLiAgVGhlIHByb2plY3Qgc2V0dGluZyBpcyB1c2VkIGlmIHlvdSBzcGVjaWZ5ICJub25lLiIKLVByb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1UaGUgcHJvcGVydGllcyBmb3IgSjJFRSBXZWIgcHJvamVjdHMgYWN0IGFzICJwcm9qZWN0IiBkZWZhdWx0IHRvIGJlIGxvb2tlZCB1cCB3aGVuIG5vIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHdlYiBmaWxlLgotU3ludGF4Q29sb3JpbmdQYWdlXzA9U3ludGF4IEVsZW1lbnQ6Ci1TeW50YXhDb2xvcmluZ1BhZ2VfMj1FbmFibGUKLVN5bnRheENvbG9yaW5nUGFnZV8zPUImb2xkCi1TeW50YXhDb2xvcmluZ1BhZ2VfND0mSXRhbGljCi1TeW50YXhDb2xvcmluZ1BhZ2VfNT0mU3RyaWtldGhyb3VnaAotU3ludGF4Q29sb3JpbmdQYWdlXzY9JlVuZGVybGluZQotIyBiZWxvdyBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgZGVsZXRlZAotSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMT1BZGQgdGhpcyBzdWZmaXggKGlmIG5vdCBzcGVjaWZpZWQpOgotSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMj1JbnNlcnQgRE9DVFlQRSBkZWNsYXJhdGlvbgotSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMz1JbnNlcnQgR0VORVJBVE9SIHdpdGggTUVUQSB0YWcKLUVtcHR5RmlsZVByZWZlcmVuY2VQYWdlXzA9RXhwYW5kIHRoZSB0cmVlIHRvIGVkaXQgcHJlZmVyZW5jZXMgZm9yIGEgc3BlY2lmaWMgZmVhdHVyZS4KLV9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks9SFRNTCBlZGl0aW5nIHByZWZlcmVuY2VzLiAgTm90ZSB0aGF0IHNvbWUgcHJlZmVyZW5jZXMgbWF5IGJlIHNldCBvbiB0aGUgPGE+ezB9PC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi0jIGFib3ZlIGFyZSBwb3NzaWJseSB1bnVzZWQgc3RyaW5ncyB0aGF0IG1heSBiZSBkZWxldGVkCi0KLSMgSFRNTCBUeXBpbmcgUHJlZmVyZW5jZSBQYWdlCi1IVE1MVHlwaW5nX0F1dG9fQ29tcGxldGU9QXV0b21hdGljYWxseSBjbG9zZQotSFRNTFR5cGluZ19BdXRvX1JlbW92ZT1BdXRvbWF0aWNhbGx5IHJlbW92ZQotSFRNTFR5cGluZ19Db21wbGV0ZV9Db21tZW50cz0mQ29tbWVudHMKLUhUTUxUeXBpbmdfQ29tcGxldGVfRW5kX1RhZ3M9JkVuZCB0YWdzCi1IVE1MVHlwaW5nX1JlbW92ZV9FbmRfVGFncz1FJm5kIHRhZ3Mgd2hlbiBjcmVhdGluZyBlbXB0eSBzZWxmLWNsb3NpbmcgdGFncwotCi0KLSMgVmFsaWRhdGlvbiBzdHJpbmdzCi1WYWxpZGF0aW9uX2Rlc2NyaXB0aW9uPVNlbGVjdCB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBwcm9ibGVtczoKLVZhbGlkYXRpb25fV2FybmluZz1XYXJuaW5nCi1WYWxpZGF0aW9uX0Vycm9yPUVycm9yCi1WYWxpZGF0aW9uX0lnbm9yZT1JZ25vcmUKLUV4cGFuZGFibGVfbGFiZWxfYXR0cmlidXRlcz1BdHRyaWJ1dGVzCi1FeHBhbmRhYmxlX2xhYmVsX2VsZW1lbnRzPUVsZW1lbnRzCi1FeHBhbmRhYmxlX2xhYmVsX2RvY3VtZW50X3R5cGU9RG9jdW1lbnQgVHlwZQotRXhwYW5kYWJsZV9sYWJlbF90ZXh0PVRleHQgUmVnaW9ucwotRXhwYW5kYWJsZV9sYWJlbF9jb21tZW50PUNvbW1lbnRzCi1FeHBhbmRhYmxlX2xhYmVsX2NkYXRhPUNEQVRBIFNlY3Rpb25zCi1FeHBhbmRhYmxlX2xhYmVsX3BpPVByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zCi1FeHBhbmRhYmxlX2xhYmVsX2VudGl0eV9yZWY9RW50aXR5IFJlZmVyZW5jZXMKLQotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8wPVVuZGVmaW5lZCBhdHRyaWJ1dGUgbmFtZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMT1VbmRlZmluZWQgYXR0cmlidXRlIHZhbHVlOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMD1TdGFydC10YWcgdXNlcyBpbnZhbGlkIGNhc2U6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzExPUVuZCB0YWcgdXNlcyBpbnZhbGlkIGNhc2U6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzEyPU1pc3Npbmcgc3RhcnQgdGFnOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMz1NaXNzaW5nIGVuZCB0YWc6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE0PVVubmVjZXNzYXJ5IGVuZCB0YWc6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE1PUludmFsaWQgZGlyZWN0aXZlOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNj1JbnZhbGlkIHRhZyBsb2NhdGlvbjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTc9RHVwbGljYXRlIHRhZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTg9Q29leGlzdGVuY2U6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE5PVVuY2xvc2VkIHN0YXJ0IHRhZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMj1BdHRyaWJ1dGUgbmFtZSB1c2luZyB3cm9uZyBjYXNlIGNoYXJhY3RlcjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjA9VW5jbG9zZWQgZW5kIHRhZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjE9SW52YWxpZCBlbXB0eSBlbGVtZW50IHRhZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjI9RHVwbGljYXRlIERPQ1RZUEUgZGVjbGFyYXRpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzIzPUludmFsaWQgbG9jYXRpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI0PURPQ1RZUEUgZGVjbGFyYXRpb24gdW5jbG9zZWQ6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI1PUludmFsaWQgdGV4dCBzdHJpbmc6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI2PUludmFsaWQgY2hhcmFjdGVycyB1c2VkIGluIHRleHQgc3RyaW5nOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yNz1JbnZhbGlkIGxvY2F0aW9uOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yOD1VbmNsb3NlZCBjb21tZW50OgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yOT1JbnZhbGlkIGxvY2F0aW9uOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zPUludmFsaWQgYXR0cmlidXRlIG5hbWU6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMwPVVuY2xvc2VkIENEQVRBIHNlY3Rpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMxPUludmFsaWQgbG9jYXRpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMyPVVuY2xvc2VkIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMzPUludmFsaWQgbG9jYXRpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzM0PVVua25vd24gZW50aXR5OgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV80PUludmFsaWQgYXR0cmlidXRlOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV81PU11bHRpcGxlIHZhbHVlcyBzcGVjaWZpZWQgZm9yIGFuIGF0dHJpYnV0ZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNj1BdHRyaWJ1dGUgdmFsdWUgdXNpbmcgd3JvbmcgY2FzZSBjaGFyYWN0ZXI6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzc9VW5jbG9zZWQgYXR0cmlidXRlIHZhbHVlOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV84PVVua25vd24gdGFnIG5hbWU6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzk9SW52YWxpZCB0YWcgbmFtZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzU9QXR0cmlidXRlIHZhbHVlIHJlZmVycyB0byBtaXNzaW5nIHJlc291cmNlOgotCi1WYWxpZGF0aW9uX1RpdGxlPVZhbGlkYXRpb24gU2V0dGluZ3MgQ2hhbmdlZAotVmFsaWRhdGlvbl9Xb3Jrc3BhY2U9VGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLiBBIGZ1bGwgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBmb3IgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4gVmFsaWRhdGUgbm93PwotVmFsaWRhdGlvbl9Qcm9qZWN0PVRoZSB2YWxpZGF0aW9uIHNldHRpbmdzIGhhdmUgY2hhbmdlZC4gQSB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IGlzIHJlcXVpcmVkIGZvciBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LiBWYWxpZGF0ZSB0aGUgcHJvamVjdCBub3c/Ci1WYWxpZGF0aW9uX2pvYk5hbWU9VmFsaWRhdGluZy4uLgotCi1IeXBlcmxpbmtfbGluZT17MH09ezF9IDogbGluZSB7Mn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODBmM2ZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjODllZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEF1dG9FZGl0U3RyYXRlZ3kgdG8gaGFuZGxlIGNoYXJhY3RlcnMgaW5zZXJ0ZWQgd2hlbiBUYWIga2V5IGlzIHByZXNzZWQKLSAqLwotcHVibGljIGNsYXNzIEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFRBQl9DSEFSQUNURVIgPSAiXHQiOwkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gaWYgbm90IGluIHNtYXJ0IGluc2VydCBtb2RlIGp1c3QgaWdub3JlCi0JCWlmICghaXNTbWFydEluc2VydE1vZGUoKSkKLQkJCXJldHVybjsKLQkJCi0JCS8vIHNwYWNlcyBmb3IgdGFiIGNoYXJhY3RlcgotCQlpZiAoY29tbWFuZC5sZW5ndGggPT0gMCAmJiBjb21tYW5kLnRleHQgIT0gbnVsbCAmJiBjb21tYW5kLnRleHQubGVuZ3RoKCkgPiAwICYmIGNvbW1hbmQudGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpICE9IC0xKQotCQkJc21hcnRJbnNlcnRGb3JUYWIoY29tbWFuZCwgZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBzcGFjZXMgZm9yIHRhYnMKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvclRhYihEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIHRhYiBrZXkgd2FzIHByZXNzZWQuIG5vdyBjaGVjayBwcmVmZXJlbmNlcyB0byBzZWUgaWYgbmVlZCB0byBpbnNlcnQKLQkJLy8gc3BhY2VzIGluc3RlYWQgb2YgdGFiCi0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gZ2V0SW5kZW50YXRpb25XaWR0aCgpOwotCQlpZiAoaW5kZW50YXRpb25XaWR0aCA+IC0xKSB7Ci0JCQlTdHJpbmcgb3JpZ2luYWxUZXh0ID0gY29tbWFuZC50ZXh0OwotCQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKG9yaWdpbmFsVGV4dCk7Ci0KLQkJCS8vIGRldGVybWluZSB3aGVyZSBpbiBsaW5lIHRoaXMgY29tbWFuZCBiZWdpbnMKLQkJCWludCBsaW5lT2Zmc2V0ID0gLTE7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChjb21tYW5kLm9mZnNldCk7Ci0JCQkJbGluZU9mZnNldCA9IGNvbW1hbmQub2Zmc2V0IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCi0JCQlJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBnZXRMaW5lVHJhY2tlcihkb2N1bWVudCwgb3JpZ2luYWxUZXh0KTsKLQotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJaW50IGluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudFN0cmluZyhpbmRlbnRhdGlvbldpZHRoLCBsaW5lT2Zmc2V0LCBsaW5lVHJhY2tlciwgaW5kZXgpOwotCi0JCQkJLy8gcmVwbGFjZSBcdCBjaGFyYWN0ZXIgd2l0aCBzcGFjZXMKLQkJCQluZXdUZXh0LnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSwgaW5kZW50KTsKLQkJCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZVRyYWNrZXIucmVwbGFjZShpbmRleCwgMSwgaW5kZW50KTsKLQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCByZXBsYWNpbmcgdGV4dCwganVzdAotCQkJCQkJLy8gcmVzZXQgdG8gY3VycmVudCBzdHJpbmcKLQkJCQkJCWxpbmVUcmFja2VyLnNldChuZXdUZXh0LnRvU3RyaW5nKCkpOwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3RhcnRJbmRleCA9IGluZGV4ICsgaW5kZW50Lmxlbmd0aCgpOwotCQkJCWluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIsIHN0YXJ0SW5kZXgpOwotCQkJfQotCQkJY29tbWFuZC50ZXh0ID0gbmV3VGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIG51bWJlciBvZiBzcGFjZXMgZm9yIG5leHQgdGFiIHN0b3AKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudGF0aW9uV2lkdGgsIGludCBsaW5lT2Zmc2V0LCBJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIsIGludCBpbmRleCkgewotCQlpbnQgaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGg7Ci0JCWludCBvZmZzZXRJbkxpbmUgPSAtMTsKLQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGxpbmVUcmFja2VyLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGluZGV4KTsKLQkJCQlpZiAobGluZUluZm8uZ2V0T2Zmc2V0KCkgPT0gMCAmJiBsaW5lT2Zmc2V0ID4gLTEpCi0JCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCQllbHNlCi0JCQkJCW9mZnNldEluTGluZSA9IGluZGV4IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGxpbmVPZmZzZXQgPiAtMSkgewotCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCX0KLQkJfQotCQlpZiAob2Zmc2V0SW5MaW5lID4gLTEgJiYgaW5kZW50YXRpb25XaWR0aCA+IDApIHsKLQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCQkJaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGggLSByZW1haW5kZXI7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudFNpemU7IGkrKykKLQkJCWluZGVudC5hcHBlbmQoJyAnKTsKLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhIGxpbmUgdHJhY2tlciBmb3IgdGV4dCB3aXRoaW4gY29tbWFuZCBpZiB0ZXh0IGlzIG11bHRpLWxpbmUKLQkgKi8KLQlwcml2YXRlIElMaW5lVHJhY2tlciBnZXRMaW5lVHJhY2tlcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBvcmlnaW5hbFRleHQpIHsKLQkJQ29uZmlndXJhYmxlTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBudWxsOwotCQlpbnRbXSBkZWxpbXMgPSBUZXh0VXRpbGl0aWVzLmluZGV4T2YoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBvcmlnaW5hbFRleHQsIDApOwotCQlpZiAoZGVsaW1zWzBdICE9IC0xIHx8IGRlbGltc1sxXSAhPSAtMSkgewotCQkJbGluZVRyYWNrZXIgPSBuZXcgQ29uZmlndXJhYmxlTGluZVRyYWNrZXIoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpKTsKLQkJCWxpbmVUcmFja2VyLnNldChvcmlnaW5hbFRleHQpOwotCQl9Ci0JCXJldHVybiBsaW5lVHJhY2tlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWN0aXZlIGVkaXRvciBpcyBpbiBzbWFydCBpbnNlcnQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSgpIHsKLQkJYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSA9IGZhbHNlOwotCQkKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKWVkaXRvcjsKLQkJCQkJZWxzZQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcillZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBjaGVjayBpZiBzbWFydCBpbnNlcnQgbW9kZQotCQlpZiAodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpCi0JCQlpc1NtYXJ0SW5zZXJ0TW9kZSA9IHRydWU7Ci0JCXJldHVybiBpc1NtYXJ0SW5zZXJ0TW9kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBpbmRlbnRhdGlvbiB3aWR0aCBpZiB1c2luZyBzcGFjZXMgZm9yIGluZGVudGF0aW9uLCAtMSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SW5kZW50YXRpb25XaWR0aCgpIHsKLQkJaW50IHdpZHRoID0gLTE7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKQotCQkJd2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJcmV0dXJuIHdpZHRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDkxMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQXV0b21hdGljYWxseSBpbnNlcnRzIGNsb3NpbmcgY29tbWVudCB0YWcgb3IgZW5kIHRhZyB3aGVuIGFwcHJvcHJpYXRlLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCS8qCi0JICogTk9URTogY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3RzIGluCi0JICogb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdAotCSAqIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0Ci0JICovCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJT2JqZWN0IHRleHRFZGl0b3IgPSBnZXRBY3RpdmVUZXh0RWRpdG9yKCk7Ci0JCWlmICghKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKSkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWlmIChjb21tYW5kLnRleHQgIT0gbnVsbCkgewotCQkJCQlzbWFydEluc2VydEZvckNvbW1lbnQoY29tbWFuZCwgZG9jdW1lbnQsIG1vZGVsKTsKLQkJCQkJc21hcnRJbnNlcnRGb3JFbmRUYWcoY29tbWFuZCwgZG9jdW1lbnQsIG1vZGVsKTsKLQkJCQkJc21hcnRSZW1vdmVFbmRUYWcoY29tbWFuZCwgZG9jdW1lbnQsIG1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ByZWZlcmVuY2VFbmFibGVkKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIChrZXkgIT0gbnVsbCAmJiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnROb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50ICYmICgoSURPTUVsZW1lbnQpIG5vZGUpLmlzQ29tbWVudFRhZygpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gY2xlYW4gdXAgYW4gZW5kLXRhZyBpZiBhIHN0YXJ0LXRhZyBpcyBjb252ZXJ0ZWQgaW50byBhbiBlbXB0eS1lbGVtZW50Ci0JICogdGFnIChlLmcuLCA8bm9kZSAvPikgYW5kIHRoZSBvcmlnaW5hbCBlbGVtZW50IHdhcyBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZCB0aGUgZG9jdW1lbnQgY29tbWFuZCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRoYXQgd2lsbCBiZSBjaGFuZ2VkCi0JICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCBiYXNlZCBvbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRSZW1vdmVFbmRUYWcoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJLy8gQW4gb3BlbmluZyB0YWcgaXMgbm93IGEgc2VsZi10ZXJtaW5hdGVkIGVuZC10YWcKLQkJCWlmICgiLyIuZXF1YWxzKGNvbW1hbmQudGV4dCkgJiYgIj4iLmVxdWFscyhkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQsIDEpKSAmJiBpc1ByZWZlcmVuY2VFbmFibGVkKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfUkVNT1ZFX0VORF9UQUdTKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGNvbW1hbmQub2Zmc2V0KTsKLQkJCQlpZiAobm9kZSAhPSBudWxsICYmICFub2RlLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5pc0VuZGVkKCkpCi0JCQkJCQlkb2N1bWVudC5yZXBsYWNlKHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvckNvbW1lbnQoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIi0iKSAmJiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSAzICYmIGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCAtIDMsIDMpLmVxdWFscygiPCEtIikgJiYgaXNQcmVmZXJlbmNlRW5hYmxlZChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQljb21tYW5kLnRleHQgKz0gIiAgLS0+IjsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbW1hbmQuc2hpZnRzQ2FyZXQgPSBmYWxzZTsKLQkJCQljb21tYW5kLmNhcmV0T2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgKyAyOwotCQkJCWNvbW1hbmQuZG9pdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JFbmRUYWcoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIi8iKSAmJiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSAxICYmIGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCAtIDEsIDEpLmVxdWFscygiPCIpICYmIGlzUHJlZmVyZW5jZUVuYWJsZWQoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTkRfVEFHUykpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSURPTU5vZGUgcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgKChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCAtIDEpKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCBub2RlIHBhcmVudAotCQkJCQl3aGlsZSAocGFyZW50Tm9kZSAhPSBudWxsICYmIGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFpc0RvY3VtZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkvLyBvbmx5IGFkZCBlbmQgdGFnIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9yIGlmCi0JCQkJCS8vIGFkZCAnLycgZG9lcyBub3QgY3JlYXRlIG9uZSBhbHJlYWR5Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcGFyZW50Tm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgdG9BZGQgPSBuZXcgU3RyaW5nQnVmZmVyKHBhcmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQlpZiAodG9BZGQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdG9BZGQuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgc3VmZml4ID0gdG9BZGQudG9TdHJpbmcoKTsKLQkJCQkJCQlpZiAoKGRvY3VtZW50LmdldExlbmd0aCgpIDwgY29tbWFuZC5vZmZzZXQgKyBzdWZmaXgubGVuZ3RoKCkpIHx8ICghc3VmZml4LmVxdWFscyhkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQsIHN1ZmZpeC5sZW5ndGgoKSkpKSkgewotCQkJCQkJCQljb21tYW5kLnRleHQgKz0gc3VmZml4OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWN0aXZlVGV4dEVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB0ZXh0RWRpdG9yOwotCQkJCQlyZXR1cm4gZWRpdG9yOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmIwZjIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotLyoqCi0gKiBQdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gbWFrZSB0aGUgYWRkaXRpb25hbCBwcm9wb3NhbCBpbmZvIGludG8gY29udGVudAotICogZml0IGZvciBhbiBIVE1MIHZpZXdlciAoYnkgZXNjYXBpbmcgY2hhcmFjdGVycykKLSAqLwotY2xhc3MgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCBleHRlbmRzIFRlbXBsYXRlUHJvcG9zYWwgaW1wbGVtZW50cyBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0KLQlwdWJsaWMgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBJbWFnZSBpbWFnZSwgaW50IHJlbGV2YW5jZSkgewotCQlzdXBlcih0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBpbWFnZSwgcmVsZXZhbmNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJcmV0dXJuIFN0cmluZ1V0aWxzLmNvbnZlcnRUb0hUTUxDb250ZW50KGFkZGl0aW9uYWxJbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNTE3ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50TW9kZWxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTFJlbGV2YW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnlGb3JDU1MgPSBudWxsOwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIGlzWEhUTUwgPSBmYWxzZTsKLQlwcml2YXRlIEhUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQlwcml2YXRlIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGZKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVGVtcGxhdGVDb250ZXh0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BVFRSSUJVVEUpOwotCQlzdXBlci5hZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFUVFJJQlVURV9WQUxVRSk7Ci0JCXN1cGVyLmFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHByb3Bvc2FscyBmb3IgYSBjb21wbGV0ZWx5IGVtcHR5IGRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLk5FVyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUENEQVRBUHJvcG9zYWwoU3RyaW5nIG5vZGVOYW1lLCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlpZiAoaXNYSFRNTCkKLQkJCXN1cGVyLmFkZFBDREFUQVByb3Bvc2FsKG5vZGVOYW1lLCBjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnREb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlpZiAoaXNYSFRNTCkKLQkJCWFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5UQUcpOwotCQlzdXBlci5hZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNoaWxkUG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydE9mZnNldCkgewotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGlmIGFscmVhZHkgYWRkaW5nIHRlbXBsYXRlIHByb3Bvc2FscyBmb3IgYSBjZXJ0YWluIGNvbnRleHQgdHlwZSwgZG8KLQkJLy8gbm90IGFkZCBhZ2FpbgotCQlpZiAoIWZUZW1wbGF0ZUNvbnRleHRzLmNvbnRhaW5zKGNvbnRleHQpKSB7Ci0JCQlmVGVtcGxhdGVDb250ZXh0cy5hZGQoY29udGV4dCk7Ci0JCQlib29sZWFuIHVzZVByb3Bvc2FsTGlzdCA9ICFjb250ZW50QXNzaXN0UmVxdWVzdC5zaG91bGRTZXBhcmF0ZSgpOwotCi0JCQlpZiAoZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgIT0gbnVsbCkgewotCQkJCWdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLnNldENvbnRleHRUeXBlKGNvbnRleHQpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhmVGV4dFZpZXdlciwgc3RhcnRPZmZzZXQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCWlmICh1c2VQcm9wb3NhbExpc3QpCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbHNbaV0pOwotCQkJCQllbHNlCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRNYWNybyhwcm9wb3NhbHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJlZ2luc1dpdGgoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCB8fCBwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQlpbnQgbWluaW11bUxlbmd0aCA9IE1hdGgubWluKHByZWZpeC5sZW5ndGgoKSwgYVN0cmluZy5sZW5ndGgoKSk7Ci0JCVN0cmluZyBiZWdpbm5pbmcgPSBhU3RyaW5nLnN1YnN0cmluZygwLCBtaW5pbXVtTGVuZ3RoKTsKLQkJcmV0dXJuIGJlZ2lubmluZy5lcXVhbHNJZ25vcmVDYXNlKHByZWZpeCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlLCBJRE9NTm9kZSB4bWxub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QgPSBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkvLyBidWcxMTU5MjcgdXNlIG9yaWdpbmFsIGRvY3VtZW50IHBvc2l0aW9uIGZvciBhbGwvYW55IHJlZ2lvbiB0ZW1wbGF0ZXMKLQkJYWRkVGVtcGxhdGVzKHJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFMTCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCXJldHVybiByZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYSBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb2RlLWFzc2lzdCBpdGVtcwotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJZlRlbXBsYXRlQ29udGV4dHMuY2xlYXIoKTsKLQotCQlJbmRleGVkUmVnaW9uIHRyZWVOb2RlID0gQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgdHJlZU5vZGU7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQotCQkvLyBjaGVjayBpZiBpdCdzIGluIGEgY29tbWVudCBub2RlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGZuICE9IG51bGwgJiYgZm4uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCAmJiBkb2N1bWVudFBvc2l0aW9uICE9IGZuLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJfQotCi0JCS8vIENNVkMgMjQyNjk1Ci0JCS8vIGlmIGl0J3MgYSA8L3NjcmlwdD4gdGFnLCBib3VuY2UgYmFjayB0byBKUyBjYSBwcm9jZXNzb3IuLi4KLQkJaWYgKGZuICE9IG51bGwgJiYgZm4uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FICYmIGRvY3VtZW50UG9zaXRpb24gPT0gZm4uZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJSVRleHRSZWdpb25MaXN0IHYgPSBmbi5nZXRSZWdpb25zKCk7Ci0JCQlpZiAodi5zaXplKCkgPiAxKSB7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoYXQgaXQncyBhIGNsb3NlIHRhZwotCQkJCWlmICgodi5nZXQoMCkpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJSXRlcmF0b3IgaXQgPSB2Lml0ZXJhdG9yKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQkJCS8vIHNlYXJjaCBmb3Igc2NyaXB0IHRhZyBuYW1lCi0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCQkJaWYgKGZuLmdldFRleHQocmVnaW9uKS5lcXVhbHNJZ25vcmVDYXNlKCJzY3JpcHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNQcm9jZXNzb3IgPSBnZXRKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQkJCQlpZiAoanNQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQkJCQlyZXR1cm4ganNQcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlzWEhUTUwgPSBnZXRYSFRNTChub2RlKTsKLQotCQlmR2VuZXJhdG9yID0gbnVsbDsgLy8gZm9yY2UgcmVsb2FkIG9mIGNvbnRlbnQgZ2VuZXJhdG9yCi0KLQkJLy8gaGFuZGxlIGJsYW5rIEhUTUwgZG9jdW1lbnQgY2FzZQotCQlpZiAodHJlZU5vZGUgPT0gbnVsbCB8fCBpc1ZpZXdlckVtcHR5KHRleHRWaWV3ZXIpKSB7Ci0JCQkvLyBjdXJzb3IgaXMgYXQgdGhlIEVPRgotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBodG1sVGFnUHJvcG9zYWwgPSBnZXRIVE1MVGFnUHJvcG9zYWwoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBzdXBlclJlc3VsdHMgPSBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWlmIChzdXBlclJlc3VsdHMgIT0gbnVsbCAmJiBzdXBlclJlc3VsdHMubGVuZ3RoID4gMCAmJiBodG1sVGFnUHJvcG9zYWwgIT0gbnVsbCkgewotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBibGFua0hUTUxEb2NSZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbc3VwZXJSZXN1bHRzLmxlbmd0aCArIDFdOwotCQkJCWJsYW5rSFRNTERvY1Jlc3VsdHNbMF0gPSBodG1sVGFnUHJvcG9zYWw7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShzdXBlclJlc3VsdHMsIDAsIGJsYW5rSFRNTERvY1Jlc3VsdHMsIDEsIHN1cGVyUmVzdWx0cy5sZW5ndGgpOwotCQkJCXJldHVybiBibGFua0hUTUxEb2NSZXN1bHRzOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQotCQkJLy8gY2hlY2sgZW1iZWRkZWQgQ1NTIHByb3Bvc2FscyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBTVFlMRSBlbmQKLQkJCS8vIHRhZwotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSkpIHsvLyROT04tTkxTLTEkCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA9PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQlpbnQgcG9zID0gZG9jdW1lbnRQb3NpdGlvbiAtIG9mZnNldDsKLQkJCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRDU1NQcm9wb3NhbHModGV4dFZpZXdlciwgcG9zLCBub2RlLCBvZmZzZXQsIChjaGFyKSAwKTsKLQkJCQkJCWlmIChwcm9wb3NhbHMgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gcHJvcG9zYWxzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBpbmxpbmUgQ1NTIHByb3Bvc2FscwotCQkJLy8gbmVlZCB0byBmaW5kIGF0dHIgcmVnaW9uIGZyb20gc2QgcmVnaW9uCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHN0eWxlTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQlJVGV4dFJlZ2lvbiBzdHlsZVZhbHVlUmVnaW9uID0gbnVsbDsKLQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCXN0eWxlTmFtZVJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJaWYgKHN0eWxlTmFtZVJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgJiYgc2RSZWdpb24uZ2V0VGV4dChzdHlsZU5hbWVSZWdpb24pLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyB0aGUgbmV4dCByZWdpb24gc2hvdWxkIGJlICI9IgotCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCXJlZ2lvbnMubmV4dCgpOyAvLyBza2lwIHRoZSAiPSIKLQkJCQkJCS8vIG5leHQgcmVnaW9uIHNob3VsZCBiZSBhdHRyIHZhbHVlIHJlZ2lvbgotCQkJCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJc3R5bGVWYWx1ZVJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzdHlsZVZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoc3R5bGVWYWx1ZVJlZ2lvbik7Ci0JCQkJaW50IGVuZCA9IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoc3R5bGVWYWx1ZVJlZ2lvbik7Ci0JCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gb2Zmc2V0ICYmIGRvY3VtZW50UG9zaXRpb24gPD0gZW5kKSB7Ci0JCQkJCWJvb2xlYW4gYXNrQ1NTID0gdHJ1ZTsKLQkJCQkJY2hhciBxdW90ZSA9IChjaGFyKSAwOwotCQkJCQlTdHJpbmcgdGV4dCA9IHNkUmVnaW9uLmdldFRleHQoc3R5bGVWYWx1ZVJlZ2lvbik7Ci0JCQkJCWludCBsZW5ndGggPSAodGV4dCAhPSBudWxsID8gdGV4dC5sZW5ndGgoKSA6IDApOwotCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJY2hhciBmaXJzdENoYXIgPSB0ZXh0LmNoYXJBdCgwKTsKLQkJCQkJCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gb2Zmc2V0KSB7Ci0JCQkJCQkJCS8vIGJlZm9yZSBxdW90ZQotCQkJCQkJCQlhc2tDU1MgPSBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCW9mZnNldCsrOwotCQkJCQkJCQlxdW90ZSA9IGZpcnN0Q2hhcjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBlbmQpIHsKLQkJCQkJCQlpZiAobGVuZ3RoID4gMSAmJiB0ZXh0LmNoYXJBdChsZW5ndGggLSAxKSA9PSBxdW90ZSkgewotCQkJCQkJCQkvLyBhZnRlciBxdW90ZQotCQkJCQkJCQlhc2tDU1MgPSBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGFza0NTUykgewotCQkJCQkJaW50IHBvcyA9IGRvY3VtZW50UG9zaXRpb24gLSBvZmZzZXQ7Ci0JCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0Q1NTUHJvcG9zYWxzKHRleHRWaWV3ZXIsIHBvcywgbm9kZSwgb2Zmc2V0LCBxdW90ZSk7Ci0JCQkJCQlpZiAocHJvcG9zYWxzICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIHByb3Bvc2FsczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbm8gdGV4dCBvciBpdCdzIGFsbCB3aGl0ZSBzcGFjZSwgb3RoZXJ3aXNlCi0JICogcmV0dXJucyBmYWxzZQotCSAqIAotCSAqIEBwYXJhbSB0cmVlTm9kZQotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlld2VyRW1wdHkoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlib29sZWFuIGlzRW1wdHkgPSBmYWxzZTsKLQkJU3RyaW5nIHRleHQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5lcXVhbHMoIiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJaXNFbXB0eSA9IHRydWU7Ci0JCXJldHVybiBpc0VtcHR5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gSUNvbXBsZXRpb25Qcm9wb3NhbAotCSAqLwotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbCBnZXRIVE1MVGFnUHJvcG9zYWwoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlJTW9kZWxNYW5hZ2VyIG1tID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChtbSAhPSBudWxsKSB7Ci0JCQkJbW9kZWwgPSBtbS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQlJRE9NRG9jdW1lbnQgZG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCi0JCQkJCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvYyk7Ci0JCQkJCWlmIChtcSAhPSBudWxsKSB7Ci0KLQkJCQkJCS8vIFhIVE1MIHJlcXVpcmVzIGxvd2VyY2FzZSB0YWduYW1lIGZvciBsb29rdXAKLQkJCQkJCUNNRG9jdW1lbnQgY29ycmVzcG9uZGluZ0NNRG9jdW1lbnQgPSBtcS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2MpOwotCQkJCQkJaWYgKGNvcnJlc3BvbmRpbmdDTURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBodG1sRGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgY29ycmVzcG9uZGluZ0NNRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwudG9Mb3dlckNhc2UoKSk7Ci0JCQkJCQkJaWYgKGh0bWxEZWNsICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nQnVmZmVyIHByb3Bvc2VkVGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKGRvYywgaHRtbERlY2wsIHByb3Bvc2VkVGV4dEJ1ZmZlcik7Ci0KLQkJCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IHByb3Bvc2VkVGV4dEJ1ZmZlci50b1N0cmluZygpOwotCQkJCQkJCQlTdHJpbmcgcmVxdWlyZWROYW1lID0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFJlcXVpcmVkTmFtZShkb2MsIGh0bWxEZWNsKTsKLQotCQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgZG9jdW1lbnRQb3NpdGlvbiwKLQkJCQkJCQkJLyogc3RhcnQgcG9zICovCi0JCQkJCQkJCTAsIC8qIHJlcGxhY2UgbGVuZ3RoICovCi0JCQkJCQkJCXJlcXVpcmVkTmFtZS5sZW5ndGgoKSArIDIsIC8qCi0JCQkJCQkJCQkJCQkJCQkgKiBjdXJzb3IgcG9zaXRpb24KLQkJCQkJCQkJCQkJCQkJCSAqIGFmdGVyCi0JCQkJCQkJCQkJCQkJCQkgKiAocmVsYXZ0aXZlIHRvCi0JCQkJCQkJCQkJCQkJCQkgKiBzdGFydCkKLQkJCQkJCQkJCQkJCQkJCSAqLwotCQkJCQkJCQlIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCByZXF1aXJlZE5hbWUsIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19OQU1FKTsKLQkJCQkJCQkJcmVzdWx0ID0gcHJvcG9zYWw7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZW50R2VuZXJhdG9yKCkKLQkgKi8KLQlwdWJsaWMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIGdldENvbnRlbnRHZW5lcmF0b3IoKSB7Ci0JCWlmIChmR2VuZXJhdG9yID09IG51bGwpIHsKLQkJCWlmIChpc1hIVE1MKQotCQkJCWZHZW5lcmF0b3IgPSBYSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJCWVsc2UKLQkJCQlmR2VuZXJhdG9yID0gSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gZkdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldENTU1Byb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBwb3MsIElET01Ob2RlIGVsZW1lbnQsIGludCBvZmZzZXQsIGNoYXIgcXVvdGUpIHsKLQotCQlDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNzc1Byb2Nlc3NvciA9IG5ldyBDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWNzc1Byb2Nlc3Nvci5zZXREb2N1bWVudE9mZnNldChvZmZzZXQpOwotCQljc3NQcm9jZXNzb3Iuc2V0UXVvdGVDaGFyT2ZTdHlsZUF0dHJpYnV0ZShxdW90ZSk7Ci0KLQkJcmV0dXJuIGNzc1Byb2Nlc3Nvci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIHBvcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbXB0eVRhZ0Nsb3NlU3RyaW5nKCkgewotCQlpZiAoaXNYSFRNTCkKLQkJCXJldHVybiAiIC8+IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0SlNDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlpZiAoZkpTQ29udGVudEFzc2lzdFByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwoKS5nZXRDb250ZW50QXNzaXN0YW50KG51bGwpLmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLlNDUklQVCk7Ci0JCX0KLQkJcmV0dXJuIGZKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0JfQotCi0JcHJpdmF0ZSBIVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGZUZW1wbGF0ZVByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVQcm9jZXNzb3IgPSBuZXcgSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIHRoaXMgRG9jdW1lbnQgaXMgYW4gWEhUTUwgRG9jdW1lbnQuIE9wcmF0ZXMgc29sZWx5IG9mZiBvZgotCSAqIHRoZSBEb2N1bWVudCBUeXBlIGRlY2xhcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0WEhUTUwoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQlkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJZWxzZQotCQkJZG9jID0gKChEb2N1bWVudCkgbm9kZSk7Ci0KLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkKLQkJCXJldHVybiAoKElET01Eb2N1bWVudCkgZG9jKS5pc1hNTFR5cGUoKTsKLQotCi0JCWlmIChkb2MgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlNb2RlbFF1ZXJ5QWRhcHRlciBhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvYykuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCQlDTURvY3VtZW50IGNtZG9jID0gbnVsbDsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkgIT0gbnVsbCkKLQkJCQljbWRvYyA9IGFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGRvYyk7Ci0JCQlpZiAoY21kb2MgIT0gbnVsbCkgewotCQkJCS8vIHRyZWF0IGFzIFhIVE1MIHVubGVzcyB3ZSd2ZSBnb3QgdGhlIGluLWNvZGUgSFRNTCBjb250ZW50Ci0JCQkJLy8gbW9kZWwKLQkJCQlpZiAoY21kb2MgaW5zdGFuY2VvZiBIVE1MQ01Eb2N1bWVudCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChjbWRvYy5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCQkJcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoY21kb2MuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpOwotCQkJfQotCQl9Ci0JCS8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBkb2MuZ2V0RG9jdHlwZSgpOwotCQlyZXR1cm4gZG9jVHlwZSAhPSBudWxsICYmIGRvY1R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsICYmIGRvY1R5cGUuZ2V0UHVibGljSWQoKS5pbmRleE9mKCItLy9XM0MvL0RURCBYSFRNTCAiKSA9PSAwOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJcmVpbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVpbml0KCkgewotCQlTdHJpbmcga2V5ID0gSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRTsKLQkJYm9vbGVhbiBkb0F1dG8gPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGtleSk7Ci0JCWlmIChkb0F1dG8pIHsKLQkJCWtleSA9IEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERTsKLQkJCWNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhrZXkpLnRvQ2hhckFycmF5KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZhY3RvcnlGb3JDU1MgIT0gbnVsbCkgewotCQkJZmFjdG9yeUZvckNTUy5yZWxlYXNlKCk7Ci0JCX0KLQkJaWYgKGZKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkgewotCQkJKChJUmVsZWFzYWJsZSlmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yKS5yZWxlYXNlKCk7Ci0JCX0KLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN0cmluZ3NFcXVhbChTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJcmV0dXJuIGEuZXF1YWxzSWdub3JlQ2FzZShiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0KLQkJaWYgKHByb3BlcnR5LmNvbXBhcmVUbyhIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFKSA9PSAwIHx8IHByb3BlcnR5LmNvbXBhcmVUbyhIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpID09IDApIHsKLQkJCXJlaW5pdCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlpZiAoZlByZWZlcmVuY2VTdG9yZSA9PSBudWxsKQotCQkJZlByZWZlcmVuY2VTdG9yZSA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIGZQcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwMzVmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgZXh0ZW5kcyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgaW5zdGFuY2UgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRhZ0Nhc2U7Ci0JcHJvdGVjdGVkIGludCBmQXR0ckNhc2U7Ci0KLQkvKioKLQkgKiBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vSVByZWZlcmVuY2VTdG9yZSBwcmVmcyA9IENvbW1vblByZWZlcmVuY2VzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoQ29udGVudFR5cGUuQ29udGVudFR5cGVJRF9IVE1MKTsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJZlRhZ0Nhc2UgPSBwcmVmcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSk7Ci0JCWZBdHRyQ2FzZSA9IHByZWZzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVFbmRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChlbGVtZW50RGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCWlmICgoKEJvb2xlYW4pIGVsZW1lbnREZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIG9tbWlzc2lvbiA9IChTdHJpbmcpIGVsZW1lbnREZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJCQlpZiAob21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9ERUZBVUxUKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX01VU1QpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCXJldHVybjsKLQkJYnVmZmVyLmFwcGVuZCgiPC8iICsgdGFnTmFtZSArICI+Iik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZShDTU5vZGUgY21ub2RlKSB7Ci0JCWlmICghY21ub2RlLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgY21ub2RlLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZE5hbWUoTm9kZSBvd25lck5vZGUsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBzdXBlci5nZXRSZXF1aXJlZE5hbWUob3duZXJOb2RlLCBjbW5vZGUpOwotCQkvLyBkb24ndCBjaGFuZ2UgdGhlIGNhc2UgdW5sZXNzIHdlJ3JlIGNlcnRhaW4gaXQgaXMgbWVhbmluZ2xlc3MKLQkJaWYgKHNob3VsZElnbm9yZUNhc2UoY21ub2RlKSkgewotCQkJaW50IGNhc2VWYWwgPSAtMTsKLQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLQkJCQljYXNlVmFsID0gZlRhZ0Nhc2U7Ci0JCQllbHNlIGlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotCQkJCWNhc2VWYWwgPSBmQXR0ckNhc2U7Ci0JCQlzd2l0Y2ggKGNhc2VWYWwpIHsKLQkJCQljYXNlIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSIDoKLQkJCQkJewotCQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDoKLQkJCQkJewotCQkJCQkJbmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnQ2xvc2UoTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlTdHJpbmcgb3RoZXIgPSBnZXRPdGhlckNsb3NlKHBhcmVudE5vZGUpOwotCQlpZiAob3RoZXIgIT0gbnVsbCkKLQkJCXJldHVybiBvdGhlcjsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpCi0JCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbGVtZW50RGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCWlmICgoKEJvb2xlYW4pIGVsZW1lbnREZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCQkJcmV0dXJuICIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBvbW1pc3Npb24gPSAoU3RyaW5nKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCQkJaWYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUKSkgewotCQkJCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IoKTsKLQkJaW5zdGFuY2UuaW5pdCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOWQ2ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotLyoqCi0gKiBDb21wbGV0aW9uIHByb2Nlc3NvciBmb3IgSFRNTCBUZW1wbGF0ZXMuIE1vc3Qgb2YgdGhlIHdvcmsgaXMgYWxyZWFkeSBkb25lCi0gKiBieSB0aGUgSFRNTCBDb250ZW50IEFzc2lzdCBwcm9jZXNzb3IsIHNvIGJ5IHRoZSB0aW1lIHRoZQotICogSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBpcyBhc2tlZCBmb3IgY29udGVudCBhc3Npc3QgcHJvcG9zYWxzLCB0aGUKLSAqIEhUTUwgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGhhcyBhbHJlYWR5IHNldCB0aGUgY29udGV4dCB0eXBlIGZvcgotICogdGVtcGxhdGVzLgotICovCi1jbGFzcyBIVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGV4dGVuZHMgVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9wb3NhbENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlyZXR1cm4gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMikuZ2V0UmVsZXZhbmNlKCkgLSAoKFRlbXBsYXRlUHJvcG9zYWwpIG8xKS5nZXRSZWxldmFuY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgZmdQcm9wb3NhbENvbXBhcmF0b3IgPSBuZXcgUHJvcG9zYWxDb21wYXJhdG9yKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRleHRUeXBlSWQgPSBudWxsOwotCi0JLyoKLQkgKiBDb3BpZWQgZnJvbSBzdXBlciBjbGFzcyBleGNlcHQgaW5zdGVhZCBvZiBjYWxsaW5nIGNyZWF0ZUNvbnRleHQodmlld2VyLAotCSAqIHJlZ2lvbikgY2FsbCBjcmVhdGVDb250ZXh0KHZpZXdlciwgcmVnaW9uLCBvZmZzZXQpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCi0JCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgdmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJLy8gYWRqdXN0IG9mZnNldCB0byBlbmQgb2Ygbm9ybWFsaXplZCBzZWxlY3Rpb24KLQkJaWYgKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSA9PSBvZmZzZXQpCi0JCQlvZmZzZXQgPSBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJU3RyaW5nIHByZWZpeCA9IGV4dHJhY3RQcmVmaXgodmlld2VyLCBvZmZzZXQpOwotCQlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbihvZmZzZXQgLSBwcmVmaXgubGVuZ3RoKCksIHByZWZpeC5sZW5ndGgoKSk7Ci0JCVRlbXBsYXRlQ29udGV4dCBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJLy8gbmFtZSBvZiB0aGUgc2VsZWN0aW9uIHZhcmlhYmxlcyB7bGluZSwgd29yZH1fc2VsZWN0aW9uCi0JCWNvbnRleHQuc2V0VmFyaWFibGUoInNlbGVjdGlvbiIsIHNlbGVjdGlvbi5nZXRUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGVbXSB0ZW1wbGF0ZXMgPSBnZXRUZW1wbGF0ZXMoY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLmdldElkKCkpOwotCi0JCUxpc3QgbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gdGVtcGxhdGVzW2ldOwotCQkJdHJ5IHsKLQkJCQljb250ZXh0LmdldENvbnRleHRUeXBlKCkudmFsaWRhdGUodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJCX0KLQkJCWNhdGNoIChUZW1wbGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodGVtcGxhdGUubWF0Y2hlcyhwcmVmaXgsIGNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS5nZXRJZCgpKSkKLQkJCQltYXRjaGVzLmFkZChjcmVhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgKElSZWdpb24pIHJlZ2lvbiwgZ2V0UmVsZXZhbmNlKHRlbXBsYXRlLCBwcmVmaXgpKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KG1hdGNoZXMsIGZnUHJvcG9zYWxDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgbWF0Y2hlcy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW21hdGNoZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbmNyZXRlIHRlbXBsYXRlIGNvbnRleHQgZm9yIHRoZSBnaXZlbiByZWdpb24gaW4gdGhlCi0JICogZG9jdW1lbnQuIFRoaXMgaW52b2x2ZXMgZmluZGluZyBvdXQgd2hpY2ggY29udGV4dCB0eXBlIGlzIHZhbGlkIGF0IHRoZQotCSAqIGdpdmVuIGxvY2F0aW9uLCBhbmQgdGhlbiBjcmVhdGluZyBhIGNvbnRleHQgb2YgdGhpcyB0eXBlLiBUaGUgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSA8Y29kZT5TbWFydFJlcGxhY2VUZW1wbGF0ZUNvbnRleHQ8L2NvZGU+IGZvcgotCSAqIHRoZSBjb250ZXh0IHR5cGUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiBUaGlzIHRha2VzIHRoZSBvZmZzZXQgYXQgd2hpY2gKLQkgKiBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZCBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciBmb3Igd2hpY2ggdGhlIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24gaW50byA8Y29kZT5kb2N1bWVudDwvY29kZT4gZm9yIHdoaWNoIHRoZQotCSAqICAgICAgICAgICAgY29udGV4dCBpcyBjcmVhdGVkCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG9mZnNldCB3aGVyZSBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZAotCSAqIEByZXR1cm4gYSB0ZW1wbGF0ZSBjb250ZXh0IHRoYXQgY2FuIGhhbmRsZSB0ZW1wbGF0ZSBpbnNlcnRpb24gYXQgdGhlCi0JICogICAgICAgICBnaXZlbiBsb2NhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlQ29udGV4dCBjcmVhdGVDb250ZXh0KElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJLy8gcHJldHR5IG11Y2ggc2FtZSBjb2RlIGFzIHN1cGVyLmNyZWF0ZUNvbnRleHQgZXhjZXB0IGNyZWF0ZQotCQkvLyBTbWFydFJlcGxhY2VUZW1wbGF0ZUNvbnRleHQKLQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IGdldENvbnRleHRUeXBlKHZpZXdlciwgcmVnaW9uKTsKLQkJaWYgKGNvbnRleHRUeXBlICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJcmV0dXJuIG5ldyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpLCBvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZVByb3Bvc2FsKFRlbXBsYXRlIHRlbXBsYXRlLCBUZW1wbGF0ZUNvbnRleHQgY29udGV4dCwgSVJlZ2lvbiByZWdpb24sIGludCByZWxldmFuY2UpIHsKLQkJcmV0dXJuIG5ldyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsKHRlbXBsYXRlLCBjb250ZXh0LCByZWdpb24sIGdldEltYWdlKHRlbXBsYXRlKSwgcmVsZXZhbmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVDb250ZXh0VHlwZSBnZXRDb250ZXh0VHlwZShJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uKSB7Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSA9IG51bGw7Ci0KLQkJQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JCWlmIChyZWdpc3RyeSAhPSBudWxsKQotCQkJdHlwZSA9IHJlZ2lzdHJ5LmdldENvbnRleHRUeXBlKGZDb250ZXh0VHlwZUlkKTsKLQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoVGVtcGxhdGUgdGVtcGxhdGUpIHsKLQkJLy8ganVzdCByZXR1cm4gdGhlIHNhbWUgaW1hZ2UgZm9yIG5vdwotCQlyZXR1cm4gSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19URU1QTEFURSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCX0KLQotCXByb3RlY3RlZCBUZW1wbGF0ZVtdIGdldFRlbXBsYXRlcyhTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZXNbXSA9IG51bGw7Ci0KLQkJVGVtcGxhdGVTdG9yZSBzdG9yZSA9IGdldFRlbXBsYXRlU3RvcmUoKTsKLQkJaWYgKHN0b3JlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZXMgPSBzdG9yZS5nZXRUZW1wbGF0ZXMoY29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCX0KLQotCXZvaWQgc2V0Q29udGV4dFR5cGUoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJZkNvbnRleHRUeXBlSWQgPSBjb250ZXh0VHlwZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OGE1NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MIGV4dGVuZHMgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgdm9pZCBpbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCQotCQlzdXBlci5pbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKTsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgaHRtbFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5ULCBodG1sUHJvY2Vzc29yKTsKLQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBqc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpLmdldENvbnRlbnRBc3Npc3RhbnQobnVsbCkuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIGpzQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY3NzQ29udGVudEFzc2lzdFByb2Nlc3NvciA9IG5ldyBDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJQ1NTUGFydGl0aW9ucy5TVFlMRSwgY3NzQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWY4OTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBKdXN0IGxpa2UgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgZXhjZXB0IGlmIGFuIGluc2VydCBvZmZzZXQgaXMgcGFzc2VkIGluLAotICogZHVyaW5nIGV2YWx1YXRpb24sIHRoZSAicHJlZml4IiBiZWZvcmUgdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2hlY2tlZCB0byBzZWUKLSAqIGlmIGl0IG1hdGNoZXMgdGhlIHRlbXBsYXRlIG5hbWUuIElmIHNvLCBvdmVyd3JpdGUgdGhlIHRlbXBsYXRlIG5hbWUuCi0gKiBPdGhlcndpc2UsIGp1c3QgaW5zZXJ0IHRoZSB0ZW1wbGF0ZSBhdCB0aGUgaW5zZXJ0IG9mZnNldCBsb2NhdGlvbiAoYnkgbm90Ci0gKiBvdmVyd3JpdGluZyB0aGUgcHJlZml4IHRleHQpCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dCBleHRlbmRzIERvY3VtZW50VGVtcGxhdGVDb250ZXh0IHsKLQlwcml2YXRlIGludCBmSW5zZXJ0T2Zmc2V0ID0gLTE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXModHlwZSwgZG9jdW1lbnQsIG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LiBUaGUgc3VwcGxpZWQgPGNvZGU+UG9zaXRpb248L2NvZGU+Ci0JICogd2lsbCBiZSBxdWVyaWVkIHRvIGNvbXB1dGUgdGhlIDxjb2RlPmdldFN0YXJ0PC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5nZXRFbmQ8L2NvZGU+IG1ldGhvZHMsIHdoaWNoIHdpbGwgdGhlcmVmb3JlIGFuc3dlciB1cGRhdGVkCi0JICogcG9zaXRpb24gZGF0YSBpZiBpdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBkZXNjcmliaW5nIHRoZSBhcmVhIG9mIHRoZSBkb2N1bWVudCB3aGljaCBmb3JtcwotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGNvbnRleHQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBQb3NpdGlvbiBwb3NpdGlvbikgewotCQlzdXBlcih0eXBlLCBkb2N1bWVudCwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gaW5zZXJ0T2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24gd2hlcmUgaW5zZXJ0IHdhcwotCSAqICAgICAgICAgICAgb3JpZ2luYWxseSByZXF1ZXN0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbnNlcnRPZmZzZXQpIHsKLQkJdGhpcyh0eXBlLCBkb2N1bWVudCwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JCWZJbnNlcnRPZmZzZXQgPSBpbnNlcnRPZmZzZXQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dCNldmFsdWF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZSkKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVCdWZmZXIgZXZhbHVhdGUoVGVtcGxhdGUgdGVtcGxhdGUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgVGVtcGxhdGVFeGNlcHRpb24gewotCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBzdXBlci5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWYgKGZJbnNlcnRPZmZzZXQgPiAtMSAmJiBmSW5zZXJ0T2Zmc2V0ID4gZ2V0U3RhcnQoKSkgewotCQkJCVN0cmluZyBwcmVmaXggPSBnZXREb2N1bWVudCgpLmdldChnZXRTdGFydCgpLCBmSW5zZXJ0T2Zmc2V0IC0gZ2V0U3RhcnQoKSk7Ci0JCQkJaWYgKCF0ZW1wbGF0ZS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0JCQkJCS8vIGdlbmVyYXRlIGEgbmV3IGJ1ZmZlciB0aGF0IGFjdHVhbGx5IGNvbnRhaW5zIHRoZQotCQkJCQkvLyB0ZXh0IHRoYXQgd2FzIGdvaW5nIHRvIGJlIG92ZXJ3cml0dGVuCi0JCQkJCWJ1ZmZlciA9IG5ldyBUZW1wbGF0ZUJ1ZmZlcihwcmVmaXggKyBidWZmZXIuZ2V0U3RyaW5nKCksIGJ1ZmZlci5nZXRWYXJpYWJsZXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTYwN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGV4dGVuZHMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwcml2YXRlIFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUVuZFRhZyhTdHJpbmcgdGFnTmFtZSwgTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGVsZW1lbnREZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJaWYgKCgoQm9vbGVhbikgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19KU1ApKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgb21taXNzaW9uID0gKFN0cmluZykgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpOwotCQkJCWlmIChvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfTVVTVCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJcmV0dXJuOwotCQlidWZmZXIuYXBwZW5kKCI8LyIgKyB0YWdOYW1lICsgIj4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJU3RyaW5nIG90aGVyID0gZ2V0T3RoZXJDbG9zZShwYXJlbnROb2RlKTsKLQkJaWYgKG90aGVyICE9IG51bGwpCi0JCQlyZXR1cm4gb3RoZXI7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFTVBUWSB0YWcsIGRvIGEgc2VsZi1jbG9zZQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJLy8gaWYgaXQncyBhIEpTUCBlbGVtZW50LCBkb24ndCBhZGQgdGhlIHNwYWNlIHNpbmNlIHRoZSBKU1AgY29udGFpbmVyIGRvZXNuJ3Qvc2hvdWxkbid0IGNhcmUKLQkJCWlmIChlbGVtZW50RGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gJiYgKCgoQm9vbGVhbikgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19KU1ApKS5ib29sZWFuVmFsdWUoKSkpCi0JCQkJLy8gaWYgaXQncyBub3QgSlNQLCBjb25mb3JtIHRvIFhIVE1MIGd1aWRlbGluZXMgYW5kIGFkZCB0aGUgc3BhY2UKLQkJCQlyZXR1cm4gIi8+IjsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCXJldHVybiAiIC8+IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIG5vdCBkZWZpbmVkIGFzIEVNUFRZLCBidXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgc3VjaCBhbnl3YXkKLQkJZWxzZSBpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlTdHJpbmcgb21taXNzaW9uID0gKFN0cmluZykgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpOwotCQkJaWYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUKSkgewotCQkJCXJldHVybiAiIC8+IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBYSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0hUTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSFRNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OWM5NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSFRNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MTm9kZUFjdGlvbk1hbmFnZXIgZXh0ZW5kcyBYTUxOb2RlQWN0aW9uTWFuYWdlciB7Ci0JcHJvdGVjdGVkIGludCBmVGFnQ2FzZTsKLQlwcm90ZWN0ZWQgaW50IGZBdHRyQ2FzZTsKLQotCXB1YmxpYyBIVE1MTm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihtb2RlbCwgdmlld2VyKTsKLQkJdXBkYXRlQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIElmIG5lY2Nlc3NhcnksIGVtcGxveSBhIERPTUNvbnRlbnRCdWlsZGVyIHRoYXQgdW5kZXJzdGFuZHMgaG93IHRvCi0JICogY2hhbmdlIHRoZSBjYXNlIG9mIEhUTUwgdGFncyAoYnV0IE5PVCB0YWdsaWIgZGVyaXZlZCB0YWdzKS4KLQkgKi8KLQlwdWJsaWMgRE9NQ29udGVudEJ1aWxkZXIgY3JlYXRlRE9NQ29udGVudEJ1aWxkZXIoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRE9NQ29udGVudEJ1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0JCVN0cmluZyBvbmUgPSBmTW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCkuZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKTsKLQkJU3RyaW5nIG1vZGVsQ29udGVudFR5cGVJZCA9IGZNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJaWYgKG9uZSAhPSBtb2RlbENvbnRlbnRUeXBlSWQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm90IGVxdWFsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobW9kZWxDb250ZW50VHlwZUlkLmVxdWFscyhDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpKQotCQkJYnVpbGRlciA9IG5ldyBIVE1MQ29udGVudEJ1aWxkZXIoZG9jdW1lbnQpOwotCQllbHNlCi0JCQlidWlsZGVyID0gc3VwZXIuY3JlYXRlRE9NQ29udGVudEJ1aWxkZXIoZG9jdW1lbnQpOwotCi0JCXJldHVybiBidWlsZGVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRJZ25vcmVDYXNlKENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKCFjbW5vZGUuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBjbW5vZGUuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgdGhlIGRpc3BsYXllZCBtZW51aXRlbSBsYWJlbCB0byBjaGFuZ2UgdGhlIGNhc2Ugb2YgSFRNTCBjaGlsZHJlbgotCSAqIGJ1dCBuZWl0aGVyIFhNTCBub3IgdGFnbGliLWRlcml2ZWQgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gQ01Ob2RlIGNtbm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLQkJLy8gZG9uJ3QgY2hhbmdlIHRoZSBjYXNlIHVubGVzcyB3ZSdyZSBjZXJ0YWluIGl0IGlzIG1lYW5pbmdsZXNzCi0JCWlmIChzaG91bGRJZ25vcmVDYXNlKGNtbm9kZSkpIHsKLQkJCVN0cmluZyBuYW1lID0gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQlpZiAoZlRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJZWxzZSBpZiAoZlRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJLy8gZWxzZSBkbyBub3RoaW5nCi0JCQl9Ci0JCQllbHNlIGlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaWYgKGZBdHRyQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQllbHNlIGlmIChmQXR0ckNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJLy8gZWxzZSBkbyBub3RoaW5nCi0JCQl9Ci0JCQlyZXN1bHQgPSBuYW1lOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gc3VwZXIuZ2V0TGFiZWwocGFyZW50LCBjbW5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBbm90aGVyIEhUTUwgc3BlY2lmaWMgZGV0YWlsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhc2UoKSB7Ci0JCWlmIChmTW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1vZGVsQ29udGVudFR5cGVJZCA9IGZNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJCWlmIChtb2RlbENvbnRlbnRUeXBlSWQgIT0gbnVsbCkgewotCQkJCWlmIChtb2RlbENvbnRlbnRUeXBlSWQuZXF1YWxzKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCkpIHsKLQkJCQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmVGFnQ2FzZSA9IHByZWZzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKTsKLQkJCQkJZkF0dHJDYXNlID0gcHJlZnMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZvcm1hdChOb2RlIG5ld0VsZW1lbnQsIGJvb2xlYW4gZGVlcCkgewotCQl0cnkgewotCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZyBtb2RlbCBjaGFuZ2UKLQkJCWZNb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUKLQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCgpOwotCQkJZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUobmV3RWxlbWVudCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLQkJCWZNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMWRkZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQW4gYWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZSBKRmFjZU5vZGVBZGFwdGVycy4gIFVzZSB0aGlzCi0gKiBhZGFwdGVyIGZhY3Rvcnkgd2l0aCBhIEpGYWNlQWRhcHRlckNvbnRlbnRQcm92aWRlciB0byBkaXNwbGF5Ci0gKiBET00gbm9kZXMgaW4gYSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MIGV4dGVuZHMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgewotCi0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MKCkgewotCQl0aGlzKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgbm9kZSkgewotCQlpZiAoc2luZ2xldG9uQWRhcHRlciA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgdGhlIEpGYWNlTm9kZUFkYXB0ZXIKLQkJCXNpbmdsZXRvbkFkYXB0ZXIgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZvckhUTUwodGhpcyk7Ci0JCQlpbml0QWRhcHRlcihzaW5nbGV0b25BZGFwdGVyLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTChnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOGJjZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBBZGFwdHMgYSBET00gbm9kZSB0byBhIEpGYWNlIHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MIGV4dGVuZHMgSkZhY2VOb2RlQWRhcHRlciB7Ci0KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUhUTUxJbWFnZShTdHJpbmcgaW1hZ2VSZXNvdXJjZU5hbWUpIHsKLQkJcmV0dXJuIEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlUmVzb3VyY2VOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSkZhY2VOb2RlQWRhcHRlckZvckhUTUwuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgY3JlYXRlSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJ0YWJsZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBQkxFKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJhIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0FOQ0hPUik7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYm9keSIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19CT0RZKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJidXR0b24iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfQlVUVE9OKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmb250IikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0ZPTlQpOwotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImZvcm0iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfRk9STSk7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHRtbCIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19IVE1MKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJpbWciKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSU1BR0UpOwotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoIm1hcCIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19JTUFHRV9NQVApOwotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInRpdGxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX1RJVExFKTsKLQkJCWVsc2UKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHKTsKLQkJfQotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBzdXBlci5jcmVhdGVJbWFnZShub2RlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0Fic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTIzZGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0Fic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgTm90IG5lZWRlZC4gU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnkgaW1wbGVtZW50cyBEZXZpY2VQcm9maWxlRW50cnkgewotCi0JcHVibGljIEFic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW50cnlJZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbnRyeU5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDA4NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIE5vdCBuZWVkZWQuICBTZWUgQlVHMTE4MzU5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIGltcGxlbWVudHMKLQkJRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIgewotCi0JcHVibGljIEFic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldERldmljZVByb2ZpbGVFbnRyaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjI3MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3Q7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBvbmx5IGNvbnRhaW5zIGhlbHBlciBtZXRob2RzIHRoYXQgeW91IHNob3VsZAotICogICAgICAgICAgICAgYWN0dWFsbHkgaW1wbGVtZW50IHlvdXJzZWxmLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudFNldHRpbmdzUmVnaXN0cnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSBIVE1MVUlNZXNzYWdlcy5VSV9ub25lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1heExlbmd0aFN0cmluZ0luQ2hhcmFjdGVyQ29kZVJlZ2lzdHJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ29udGVudFNldHRpbmdzUmVnaXN0cnkoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCWNvbWJvLmFkZChOT05FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlFbnVtZXJhdGlvbiBlID0gcmVnLmdldEVudHJpZXMoKTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLQkJCVN0cmluZyBwdWJsaWNJZCA9IGVudHJ5LmdldFB1YmxpY0lkKCk7Ci0JCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBlbnRyeS5nZXREaXNwbGF5TmFtZSgpOwotCQkJaWYgKGRpc3BsYXlOYW1lICE9IG51bGwpIHsKLQkJCQljb21iby5hZGQoZGlzcGxheU5hbWUsIHB1YmxpY0lkKTsKLQkJCQlpZiAoZGlzcGxheU5hbWUubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkKLQkJCQkJbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgPSBkaXNwbGF5TmFtZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljb21iby5hZGQocHVibGljSWQsIHB1YmxpY0lkKTsKLQkJCWlmIChwdWJsaWNJZC5sZW5ndGgoKSA+IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5Lmxlbmd0aCgpKQotCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gcHVibGljSWQ7Ci0JCQlpZiAoZW50cnkuZ2V0U3lzdGVtSWQoKSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOyAvLyBpZiBIVE1MIGVudHJ5Ci0JCQlpZiAoZW50cnkuZ2V0U3lzdGVtSWQoKS5sZW5ndGgoKSA+IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5Lmxlbmd0aCgpKQotCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCi0JCWNvbWJvLnNvcnRCeUtleSgxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q1NTTWV0YU1vZGVsUmVnaXN0cnlJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQljb21iby5hZGQoTk9ORSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJSXRlcmF0b3IgaSA9IHJlZy5nZXRQcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IChDU1NQcm9maWxlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IHByb2ZpbGUuZ2V0UHJvZmlsZUlEKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb2ZpbGUuZ2V0UHJvZmlsZU5hbWUoKTsKLQkJCWNvbWJvLmFkZChuYW1lLCBpZCk7Ci0JCX0KLQkJY29tYm8uc29ydEJ5S2V5KDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZXZpY2VQcm9maWxlUmVnaXN0cnlJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQljb21iby5hZGQoTk9ORSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCURldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIHJlZyA9IERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlci5nZXRFbnRyeVByb3ZpZGVyKCk7Ci0JCWlmIChyZWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZXJhdG9yIHByb2ZpbGVzID0gcmVnLmdldERldmljZVByb2ZpbGVFbnRyaWVzKCk7Ci0JCWlmIChwcm9maWxlcyA9PSBudWxsKSB7Ci0JCQlyZWcucmVsZWFzZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCURldmljZVByb2ZpbGVFbnRyeSBlbnRyeTsKLQkJd2hpbGUgKHByb2ZpbGVzLmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoRGV2aWNlUHJvZmlsZUVudHJ5KSBwcm9maWxlcy5uZXh0KCk7Ci0JCQljb21iby5hZGQoZW50cnkuZ2V0RW50cnlOYW1lKCksIGVudHJ5LmdldEVudHJ5SWQoKSk7Ci0JCQllbnRyeS5yZWxlYXNlKCk7Ci0JCX0KLQkJcmVnLnJlbGVhc2UoKTsKLQkJY29tYm8uc29ydEJ5S2V5KDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbUlkRnJvbShTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKHB1YmxpY0lkID09IG51bGwgfHwgcHVibGljSWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgcmVnID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUVudW1lcmF0aW9uIGUgPSByZWcuZ2V0RW50cmllcygpOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gKEhUTUxEb2N1bWVudFR5cGVFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGVudHJ5LmdldFB1YmxpY0lkKCkuZXF1YWxzKHB1YmxpY0lkKSkKLQkJCQlyZXR1cm4gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29udGVudFR5cGVJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQlTdHJpbmdbXSB0eXBlID0geyIiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJhcHBsaWNhdGlvbi94bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L2h0bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L3htbCIsfTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBkaXNwbGF5TmFtZSA9IHtOT05FLCAiYXBwbGljYXRpb24veGh0bWwreG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCSJhcHBsaWNhdGlvbi94bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L2h0bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L3htbCIsfTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkaXNwbGF5TmFtZVtpXSAhPSBudWxsICYmIGRpc3BsYXlOYW1lW2ldLmxlbmd0aCgpICE9IDApCi0JCQkJY29tYm8uYWRkKGRpc3BsYXlOYW1lW2ldLCB0eXBlW2ldKTsKLQkJCWVsc2UKLQkJCQljb21iby5hZGQodHlwZVtpXSwgdHlwZVtpXSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyYWN0ZXJDb2RlSW50byhDb21ib0xpc3QgY29tYm8pIHsKLQkJY29tYm8uYWRkKE5PTkUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWF4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQ29tbW9uQ2hhcnNldE5hbWVzIGVuY29kaW5nID0gbmV3IENvbW1vbkNoYXJzZXROYW1lcygpOwotCQlTdHJpbmdbXSBjaGFyQ29kZSA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRDb21tb25DaGFyc2V0TmFtZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyQ29kZS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldERpc3BsYXlTdHJpbmcoY2hhckNvZGVbaV0pOwotCQkJaWYgKGRpc3BsYXlOYW1lICE9IG51bGwgJiYgZGlzcGxheU5hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJCWNvbWJvLmFkZChkaXNwbGF5TmFtZSwgY2hhckNvZGVbaV0pOwotCQkJCWludCBuX2J5dGUgPSBkaXNwbGF5TmFtZS5nZXRCeXRlcygpLmxlbmd0aDsKLQkJCQlpZiAobWF4LmdldEJ5dGVzKCkubGVuZ3RoIDwgbl9ieXRlKQotCQkJCQltYXggPSBkaXNwbGF5TmFtZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljb21iby5hZGQoY2hhckNvZGVbaV0sIGNoYXJDb2RlW2ldKTsKLQkJfQotCQkvKgotCQkgKiBjaGFyQ29kZSA9IGVuY29kaW5nLmdldFN1cHBvcnRlZEphdmFFbmNvZGluZ3MoKTsgZm9yKGludCBpPTA7aTxjaGFyQ29kZS5sZW5ndGg7aSsrKXsKLQkJICogU3RyaW5nIGRpc3BsYXlOYW1lID0gZW5jb2RpbmcuZ2V0RGlzcGxheVN0cmluZyhjaGFyQ29kZVtpXSk7IGlmCi0JCSAqIChkaXNwbGF5TmFtZSE9bnVsbCAmJiBkaXNwbGF5TmFtZS5sZW5ndGgoKSE9MCkKLQkJICogY29tYm8uYWRkKGRpc3BsYXlOYW1lLGNoYXJDb2RlW2ldKTsgZWxzZQotCQkgKiBjb21iby5hZGQoY2hhckNvZGVbaV0sY2hhckNvZGVbaV0pOyB9Ci0JCSAqLwotCQkvLyBjb21iby5zb3J0QnlLZXkoMSk7Ci0JCW1heExlbmd0aFN0cmluZ0luQ2hhcmFjdGVyQ29kZVJlZ2lzdHJ5ID0gbWF4OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYW5ndWFnZUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCVN0cmluZ1tdIGxhbmcgPSB7IiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmEiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZhc2NyaXB0Iix9OyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1tdIGRpc3BsYXlOYW1lID0ge05PTkUsICJqYXZhIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZhc2NyaXB0Iix9OyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGFuZy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRpc3BsYXlOYW1lW2ldICE9IG51bGwgJiYgZGlzcGxheU5hbWVbaV0ubGVuZ3RoKCkgIT0gMCkKLQkJCQljb21iby5hZGQoZGlzcGxheU5hbWVbaV0sIGxhbmdbaV0pOwotCQkJZWxzZQotCQkJCWNvbWJvLmFkZChsYW5nW2ldLCBsYW5nW2ldKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9EZXZpY2VQcm9maWxlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyY2IxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9EZXZpY2VQcm9maWxlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIGRpcmVjdGx5LgotICogSW5zdGVhZCwgcGxlYXNlIHVzZSBhYnN0cmFjdCBjbGFzcyhBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeSkgaW5zdGVhZC4KLSAqIDwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQgTm90IG5lZWRlZC4gU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgaW50ZXJmYWNlIERldmljZVByb2ZpbGVFbnRyeSB7Ci0JcHVibGljIFN0cmluZyBnZXRFbnRyeUlkKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5TmFtZSgpOwotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjA3NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIGRpcmVjdGx5LgotICogSW5zdGVhZCwgcGxlYXNlIHVzZSBhYnN0cmFjdCBjbGFzcyhBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyKQotICogaW5zdGVhZC4KLSAqIDwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQgTm90IG5lZWRlZC4gU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgaW50ZXJmYWNlIERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIHsKLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RGV2aWNlUHJvZmlsZUVudHJpZXMoKTsKLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXJCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNjNlYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIE5vdCBuZWVkZWQuICBTZWUgQlVHMTE4MzU5Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlckJ1aWxkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfUExVR0lOSUQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiOyAgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlckJ1aWxkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXN0YXRpYyBwdWJsaWMgRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIgZ2V0RW50cnlQcm92aWRlcigpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChFWFRFTlNJT05fUE9JTlRfUExVR0lOSUQsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uc1tdID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJaWYgKChleHRlbnNpb25zICE9IG51bGwpICYmIChleHRlbnNpb25zLmxlbmd0aCA+IDApKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50c1tdID0gZXh0ZW5zaW9uc1tpXS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJaWYgKChlbGVtZW50cyAhPSBudWxsKSAmJiAoZWxlbWVudHMubGVuZ3RoID4gMCkpIHsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnID0gZWxlbWVudHNbal07Ci0JCQkJCQkJaWYgKChjb25maWcgIT0gbnVsbCkgJiYgKGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKEVYVEVOU0lPTl9QT0lOVF9OQU1FKSA9PSB0cnVlKSkgewotCQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnLmdldEF0dHJpYnV0ZShBVFRSX0NMQVNTKTsKLQkJCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCURldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIHByb3ZpZGVyID0gKERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyKWNvbmZpZy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfQ0xBU1MpOwotCQkJCQkJCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGlnbm9yZWQpIHsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9IVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9IVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NWZkZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5JQ29udGVudFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2U7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQotCXByaXZhdGUgZmluYWwgaW50IE5fRE9DVU1FTlRfVFlQRSA9IDA7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTl9DU1NfUFJPRklMRSA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTl9UQVJHRVRfREVWSUNFID0gMjsKLQotCXByaXZhdGUgVGV4dCBwdWJsaWNJZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHN5c3RlbUlkVGV4dDsKLQotCXB1YmxpYyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQludW1iZXJPZkNvbWJvID0gMzsKLQkJbnVtQ29scyA9IDI7Ci0JCW51bVJvd3MgPSA4OwotCQljb21ibyA9IG5ldyBDb21ib0xpc3RPblByb3BlcnR5UGFnZVtzdXBlci5udW1iZXJPZkNvbWJvXTsKLQotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFR5cGVDb21ib0JveCgpIHsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb24gb2YgaW1wbGVjaXQgRE9DVFlQRQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydHlQYWdlLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gY3JlYXRlIGNvbWJvYm94Ci0JCXN1cGVyLmNvbWJvW05fRE9DVU1FTlRfVFlQRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKERPQ1VNRU5UX0xBQkVMKTsKLQkJc3VwZXIuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkvLyBzZXQgZW50cnkgbGlzdCBpbnRvIENvbWJvCi0JCUNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LnNldEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeUludG8oY29tYm9bTl9ET0NVTUVOVF9UWVBFXSk7Ci0JCS8vCWNyZWF0ZSBUZXh0RmllbGQKLQkJY3JlYXRlSURUZXh0RmllbGQoKTsKLQkJaWYgKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5IVE1MX0RPQ1VNRU5UX1RZUEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0sIGluaXRWYWx1ZSk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoaW5pdFZhbHVlKTsKLQkJaWYgKCFpbml0VmFsdWUuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8vIHRvcm8gRDIxMDI2MAotCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShpbml0VmFsdWUpICE9IG51bGwpCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oaW5pdFZhbHVlKSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBjcmVhdGUgc2VwYXJhdG9yCi0JCWxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gbnVtQ29sczsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSA4OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNTU0NvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX0NTU19QUk9GSUxFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoQ1NTX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oY29tYm9bTl9DU1NfUFJPRklMRV0pOwotCQlpZiAoY29tYm9bTl9DU1NfUFJPRklMRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fQ1NTX1BST0ZJTEVdLCBpbml0VmFsdWUpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXZpY2VDb21ib0JveCgpIHsKLQkJc3VwZXIuY29tYm9bTl9UQVJHRVRfREVWSUNFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoREVWSUNFX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXREZXZpY2VQcm9maWxlUmVnaXN0cnlJbnRvKGNvbWJvW05fVEFSR0VUX0RFVklDRV0pOwotCQlpZiAoY29tYm9bTl9UQVJHRVRfREVWSUNFXS5nZXRJdGVtQ291bnQoKSA8PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSk7Ci0JCS8vIHdoZW4gZWl0aGVyIC5jb250ZW50c2V0dGluZ3Mgb3IgZWxlbWVudCBkb2Vzbid0IGV4aXN0Ci0JCS8vIHdoZW4gYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3RzLGdldFByb3BlcnR5IHJldHVybnMgZW1wdHkgc3RyaW5nLgotCQlpZiAoaW5pdFZhbHVlID09IG51bGwpCi0JCQlpbml0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBzZXQgaW5pdCBzZWxlY3Rpb25JdGVtIGluIENvbWJvCi0JCXN1cGVyLnNldFNlbGVjdGlvbkl0ZW0oY29tYm9bTl9UQVJHRVRfREVWSUNFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNldHRpbmdzUGFnZUdVSSgpIHsKLQkJaW50IHR5cGUgPSAoKElSZXNvdXJjZSkgZ2V0RWxlbWVudCgpKS5nZXRUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJLy8JY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHByb3BlcnR5UGFnZSxudW1Db2xzLG51bVJvd3MpOwotCQkJCWNyZWF0ZURvY3VtZW50VHlwZUNvbWJvQm94KCk7Ci0JCQkJY3JlYXRlQ1NTQ29tYm9Cb3goKTsKLQkJCQljcmVhdGVEZXZpY2VDb21ib0JveCgpOwotCQkJCWNvbXB1dGVNYXhXaWR0aEhpbnQoKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3BlcnR5UGFnZSwgSUhlbHBDb250ZXh0SWRzLldFQl9DT05URU5UX1NFVFRJTkdTX0hFTFBJRCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzIGluc3RhbnRpYXRlZCBieSByZXNvdXJjZSBleGNlcHQgRklMRSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKE1hcCBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWVJbkNvbWJvLCBpbnQgaW5kZXgpIHsKLQotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fRE9DVU1FTlRfVFlQRSA6Ci0JCQkJLy8gZG9jIHR5cGUKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9UQVJHRVRfREVWSUNFIDoKLQkJCQkvLyBkZXZpY2UKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkRFVklDRV9QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oKSBpbiBjbGFzcyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVOb25lUHJvcGVydHkoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgTl9ET0NVTUVOVF9UWVBFIDoKLQkJCQkvLyBkb2MgdHlwZQotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJY29udGVudFNldHRpbmdzLmRlbGV0ZVByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5fVEFSR0VUX0RFVklDRSA6Ci0JCQkJLy8gZGV2aWNlCi0JCQkJY29udGVudFNldHRpbmdzLmRlbGV0ZVByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkluZGV4IGlzIG91dCBvZiByYW5nZSBpbiBkZWxldGVOb25lUHJvcGVydHkoKSBpbiBjbGFzcyBIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlEVGV4dEZpZWxkKCkgewotCQkvLyBwdWJsaWMgSUQgJiBTeXN0ZW0gSUQKLQkJTGFiZWwgcHVibGljTGFiZWwgPSBuZXcgTGFiZWwoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXB1YmxpY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0xhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfUHVibGljX0lEKTsKLQkJcHVibGljSWRUZXh0ID0gbmV3IFRleHQoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlMYWJlbCBzeXN0ZW1MYWJlbCA9IG5ldyBMYWJlbChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJc3lzdGVtTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9TeXN0ZW1fSUQpOwotCQlzeXN0ZW1JZFRleHQgPSBuZXcgVGV4dChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZU1heFdpZHRoSGludCgpIHsKLQkJLy8gbWF4TGVuZ3RoU3RyaW5nIHdhcyBzZXQgd2hlbiBIVE1MRG9jdW1lbnRUeXBlRW50cnkgd2FzIHNldCBpbiBjbGFzcyBDb250ZW50U2V0dGluZ3NSZWdpc3RyeS4KLQkJU3RyaW5nIG1heExlbmd0aFN0cmluZyA9IENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5Lm1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotCQlTdHJpbmcgYmFja3VwID0gdGhpcy5zeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KG1heExlbmd0aFN0cmluZyk7Ci0JCWludCBtYXhXaWR0aEhpbnQgPSB0aGlzLnN5c3RlbUlkVGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoYmFja3VwKTsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMucHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5wdWJsaWNJZFRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLnN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuc3lzdGVtSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fVEFSR0VUX0RFVklDRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9UQVJHRVRfREVWSUNFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJV2lkZ2V0IHNvdXJjZSA9IGV2ZW50LndpZGdldDsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZXF1YWxzKHNvdXJjZSkpIHsKLQkJCUNvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGNvbWJvID0gdGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV07Ci0JCQlpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKCFjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSk7Ci0JCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpICE9IG51bGwpCi0JCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSkpOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzYzYxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3RPblByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgUHJvamVjdEhUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgaW5zdGVhZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIgewotCi0KLQlwcml2YXRlIGZpbmFsIGludCBOX0RPQ1VNRU5UX1RZUEUgPSAwOwotCXByaXZhdGUgZmluYWwgaW50IE5fQ1NTX1BST0ZJTEUgPSAxOwotCXByaXZhdGUgZmluYWwgaW50IE5fVEFSR0VUX0RFVklDRSA9IDI7Ci0KLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0KLQlwdWJsaWMgUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJbnVtYmVyT2ZDb21ibyA9IDM7Ci0JCW51bUNvbHMgPSAyOwotCQludW1Sb3dzID0gODsKLQkJY29tYm8gPSBuZXcgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2Vbc3VwZXIubnVtYmVyT2ZDb21ib107Ci0KLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnRUeXBlQ29tYm9Cb3goKSB7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9uIG9mIGltcGxlY2l0IERPQ1RZUEUKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydHlQYWdlLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gY3JlYXRlIGNvbWJvYm94Ci0JCXN1cGVyLmNvbWJvW05fRE9DVU1FTlRfVFlQRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKERPQ1VNRU5UX0xBQkVMKTsKLQkJc3VwZXIuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkvLyBzZXQgZW50cnkgbGlzdCBpbnRvIENvbWJvCi0JCUNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LnNldEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeUludG8oY29tYm9bTl9ET0NVTUVOVF9UWVBFXSk7Ci0JCS8vIGNyZWF0ZSBUZXh0RmllbGQKLQkJY3JlYXRlSURUZXh0RmllbGQoKTsKLQkJaWYgKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5IVE1MX0RPQ1VNRU5UX1RZUEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0sIGluaXRWYWx1ZSk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoaW5pdFZhbHVlKTsKLQkJaWYgKCFpbml0VmFsdWUuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8vIHRvcm8gRDIxMDI2MAotCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShpbml0VmFsdWUpICE9IG51bGwpCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oaW5pdFZhbHVlKSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBjcmVhdGUgc2VwYXJhdG9yCi0JCWxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gbnVtQ29sczsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSA4OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNTU0NvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX0NTU19QUk9GSUxFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoQ1NTX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oY29tYm9bTl9DU1NfUFJPRklMRV0pOwotCQlpZiAoY29tYm9bTl9DU1NfUFJPRklMRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fQ1NTX1BST0ZJTEVdLCBpbml0VmFsdWUpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXZpY2VDb21ib0JveCgpIHsKLQkJc3VwZXIuY29tYm9bTl9UQVJHRVRfREVWSUNFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoREVWSUNFX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXREZXZpY2VQcm9maWxlUmVnaXN0cnlJbnRvKGNvbWJvW05fVEFSR0VUX0RFVklDRV0pOwotCQlpZiAoY29tYm9bTl9UQVJHRVRfREVWSUNFXS5nZXRJdGVtQ291bnQoKSA8PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSk7Ci0JCS8vIHdoZW4gZWl0aGVyIC5jb250ZW50c2V0dGluZ3Mgb3IgZWxlbWVudCBkb2Vzbid0IGV4aXN0Ci0JCS8vIHdoZW4gYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3RzLGdldFByb3BlcnR5IHJldHVybnMgZW1wdHkgc3RyaW5nLgotCQlpZiAoaW5pdFZhbHVlID09IG51bGwpCi0JCQlpbml0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBzZXQgaW5pdCBzZWxlY3Rpb25JdGVtIGluIENvbWJvCi0JCXN1cGVyLnNldFNlbGVjdGlvbkl0ZW0oY29tYm9bTl9UQVJHRVRfREVWSUNFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNldHRpbmdzUGFnZUdVSSgpIHsKLQkJaW50IHR5cGUgPSAoKElSZXNvdXJjZSkgZ2V0RWxlbWVudCgpKS5nZXRUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJLy8gY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHByb3BlcnR5UGFnZSxudW1Db2xzLG51bVJvd3MpOwotCQkJCWNyZWF0ZURvY3VtZW50VHlwZUNvbWJvQm94KCk7Ci0JCQkJY3JlYXRlQ1NTQ29tYm9Cb3goKTsKLQkJCQljcmVhdGVEZXZpY2VDb21ib0JveCgpOwotCQkJCWNvbXB1dGVNYXhXaWR0aEhpbnQoKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3BlcnR5UGFnZSwgSUhlbHBDb250ZXh0SWRzLldFQl9DT05URU5UX1NFVFRJTkdTX0hFTFBJRCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJQcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzIGluc3RhbnRpYXRlZCBieSByZXNvdXJjZSBleGNlcHQgUFJPSkVDVCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKE1hcCBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWVJbkNvbWJvLCBpbnQgaW5kZXgpIHsKLQotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fRE9DVU1FTlRfVFlQRSA6Ci0JCQkJLy8gZG9jIHR5cGUKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9UQVJHRVRfREVWSUNFIDoKLQkJCQkvLyBkZXZpY2UKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkRFVklDRV9QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oKSBpbiBjbGFzcyBQcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVOb25lUHJvcGVydHkoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgTl9ET0NVTUVOVF9UWVBFIDoKLQkJCQkvLyBkb2MgdHlwZQotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBOX1RBUkdFVF9ERVZJQ0UgOgotCQkJCS8vIGRldmljZQotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuREVWSUNFX1BST0ZJTEUpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkluZGV4IGlzIG91dCBvZiByYW5nZSBpbiBkZWxldGVOb25lUHJvcGVydHkoKSBpbiBjbGFzcyBQcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlEVGV4dEZpZWxkKCkgewotCQkvLyBwdWJsaWMgSUQgJiBTeXN0ZW0gSUQKLQkJTGFiZWwgcHVibGljTGFiZWwgPSBuZXcgTGFiZWwoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXB1YmxpY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0xhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfUHVibGljX0lEKTsKLQkJcHVibGljSWRUZXh0ID0gbmV3IFRleHQoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlMYWJlbCBzeXN0ZW1MYWJlbCA9IG5ldyBMYWJlbChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJc3lzdGVtTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9TeXN0ZW1fSUQpOwotCQlzeXN0ZW1JZFRleHQgPSBuZXcgVGV4dChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZU1heFdpZHRoSGludCgpIHsKLQkJLy8gbWF4TGVuZ3RoU3RyaW5nIHdhcyBzZXQgd2hlbiBIVE1MRG9jdW1lbnRUeXBlRW50cnkgd2FzIHNldCBpbiBjbGFzcwotCQkvLyBDb250ZW50U2V0dGluZ3NSZWdpc3RyeS4KLQkJU3RyaW5nIG1heExlbmd0aFN0cmluZyA9IENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5Lm1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotCQlTdHJpbmcgYmFja3VwID0gdGhpcy5zeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KG1heExlbmd0aFN0cmluZyk7Ci0JCWludCBtYXhXaWR0aEhpbnQgPSB0aGlzLnN5c3RlbUlkVGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoYmFja3VwKTsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMucHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5wdWJsaWNJZFRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLnN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuc3lzdGVtSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fVEFSR0VUX0RFVklDRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9UQVJHRVRfREVWSUNFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJV2lkZ2V0IHNvdXJjZSA9IGV2ZW50LndpZGdldDsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZXF1YWxzKHNvdXJjZSkpIHsKLQkJCUNvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGNvbWJvID0gdGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV07Ci0JCQlpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKCFjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSk7Ci0JCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpICE9IG51bGwpCi0JCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSkpOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2NiZTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFByb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgewotCXB1YmxpYyBQcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzZXREZXNjcmlwdGlvbihIVE1MVUlNZXNzYWdlcy5Qcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjg4ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9OT05FID0gSFRNTFVJTWVzc2FnZXMuVUlfbm9uZTsKLQlwcml2YXRlIFN0cmluZyBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGNsYXNzIENvbWJvU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgaW5kZXggPSBmRG9jdW1lbnRUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCVN0cmluZyBkb2N0eXBlID0gKFN0cmluZykgZkRvY3VtZW50VHlwZUlkcy5nZXQoaW5kZXgpOwotCQkJdXBkYXRlRG9jdHlwZVRleHQoaW5kZXgsIGRvY3R5cGUpOwotCQl9Ci0JfQotCi0JQ29tYm8gZkRvY3VtZW50VHlwZUNvbWJvOwotCUxpc3QgZkRvY3VtZW50VHlwZUlkczsKLQlwcml2YXRlIFRleHQgZlB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgZlN5c3RlbUlkVGV4dDsKLQlwcml2YXRlIENvbWJvIGZQcm9maWxlQ29tYm87Ci0JcHJpdmF0ZSBMaXN0IGZQcm9maWxlSWRzOwotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZkxpc3RlbmVyOwotCi0JcHVibGljIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzApOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcHJvcGVydHlQYWdlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0KLQkJY3JlYXRlRG9jdHlwZUNvbnRlbnRzKHByb3BlcnR5UGFnZSk7Ci0JCWNyZWF0ZUNTU1Byb2ZpbGVDb250ZW50cyhwcm9wZXJ0eVBhZ2UpOwotCi0JCXBvcHVsYXRlVmFsdWVzKCk7Ci0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQkJY29tcHV0ZU1heFdpZHRoSGludCgpOwotCi0JCWZMaXN0ZW5lciA9IG5ldyBDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCWZEb2N1bWVudFR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihmTGlzdGVuZXIpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJvcGVydHlQYWdlLCBJSGVscENvbnRleHRJZHMuV0VCX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDU1NQcm9maWxlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDU1MgUHJvZmlsZQotCQlUZXh0IGxhbmd1YWdlTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlsYW5ndWFnZUxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfQ1NTX3Byb2ZpbGVfX18yKTsKLQkJZlByb2ZpbGVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZlByb2ZpbGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEb2N0eXBlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb24gb2YgaW1wbGljaXQgRE9DVFlQRQotCQlUZXh0IGRvY3R5cGVMYWJlbCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWRvY3R5cGVMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX0Rlc2NyaXB0aW9uX29mX3JvbGVfb2ZfZm9sbG93aW5nX0RPQ1RZUEUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRvY3R5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGRvY3VtZW50IHR5cGUKLQkJVGV4dCBsYW5ndWFnZUxhYmVsID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJbGFuZ3VhZ2VMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMSk7Ci0JCWZEb2N1bWVudFR5cGVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZkRvY3VtZW50VHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gcHVibGljIElECi0JCVRleHQgcHVibGljSWRMYWJlbCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCXB1YmxpY0lkTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9QdWJsaWNfSUQpOwotCQlmUHVibGljSWRUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmUHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gc3lzdGVtIElECi0JCVRleHQgc3lzdGVtSWRMYWJlbCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCXN5c3RlbUlkTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9TeXN0ZW1fSUQpOwotCQlmU3lzdGVtSWRUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmU3lzdGVtSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gY3JlYXRlIHNlcGFyYXRvcgotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gODsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIHRoaXMgcHJvcGVydGllcyBwYWdlIGlzIGZvcgotCSAqIAotCSAqIEByZXR1cm4gSVJlc291cmNlIGZvciB0aGlzIHByb3BlcnRpZXMgcGFnZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICBJUmVzb3VyY2UKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJSUFkYXB0YWJsZSBhZGFwdGFibGUgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChhZGFwdGFibGUgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgYWRhcHRhYmxlOwotCQl9IGVsc2UgaWYgKGFkYXB0YWJsZSAhPSBudWxsKSB7Ci0JCQlPYmplY3QgbyA9IGFkYXB0YWJsZS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCXJlc291cmNlID0gKElSZXNvdXJjZSlvOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTeXN0ZW1JZEZyb20oU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChwdWJsaWNJZCA9PSBudWxsIHx8IHB1YmxpY0lkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlFbnVtZXJhdGlvbiBlID0gcmVnLmdldEVudHJpZXMoKTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChlbnRyeS5nZXRQdWJsaWNJZCgpLmVxdWFscyhwdWJsaWNJZCkpCi0JCQkJcmV0dXJuIGVudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVEb2N0eXBlVmFsdWVzKCk7Ci0JCWluaXRpYWxpemVDU1NQcm9maWxlVmFsdWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDU1NQcm9maWxlVmFsdWVzKCkgewotCQlpbnQgaW5kZXggPSAwOwotCQlTdHJpbmcgcHJvZmlsZSA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBnZXRSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JCWlmIChwcm9maWxlICE9IG51bGwgJiYgcHJvZmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8qCi0JCQkgKiBJZiBpdGVtIGlzIGFscmVhZHkgcGFydCBvZiBjb21ibywgc2VsZWN0IGl0LiBPdGhlcndpc2UsIHNlbGVjdAotCQkJICogbm9uZS4KLQkJCSAqLwotCQkJaW5kZXggPSBmUHJvZmlsZUlkcy5pbmRleE9mKHByb2ZpbGUpOwotCQl9Ci0JCWluZGV4ID0gaW5kZXggPj0gMCA/IGluZGV4IDogMDsKLQkJZlByb2ZpbGVDb21iby5zZWxlY3QoaW5kZXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRG9jdHlwZVZhbHVlcygpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJU3RyaW5nIGRvY3R5cGUgPSBIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSFRNTENvbnRlbnRQcm9wZXJ0aWVzLkRPQ1VNRU5UX1RZUEUsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKGRvY3R5cGUgIT0gbnVsbCAmJiBkb2N0eXBlLmxlbmd0aCgpID4gMCkgewotCQkJLyoKLQkJCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgc2VsZWN0Ci0JCQkgKiBub25lLgotCQkJICovCi0JCQlpbmRleCA9IGZEb2N1bWVudFR5cGVJZHMuaW5kZXhPZihkb2N0eXBlKTsKLQkJfQotCi0JCS8vIHNldCBjb21ib2JveAotCQlpbmRleCA9IGluZGV4ID49IDAgPyBpbmRleCA6IDA7Ci0JCWZEb2N1bWVudFR5cGVDb21iby5zZWxlY3QoaW5kZXgpOwotCi0JCXVwZGF0ZURvY3R5cGVUZXh0KGluZGV4LCBkb2N0eXBlKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZURvY3R5cGVUZXh0KGludCBpbmRleCwgU3RyaW5nIGRvY3R5cGUpIHsKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJLy8gc2V0IHB1YmxpYy9zeXN0ZW0gaWQgdGV4dAotCQkJZlB1YmxpY0lkVGV4dC5zZXRUZXh0KGRvY3R5cGUpOwotCQkJU3RyaW5nIHN5c3RlbUlkID0gZ2V0U3lzdGVtSWRGcm9tKGRvY3R5cGUpOwotCQkJaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JCQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KHN5c3RlbUlkKTsKLQkJCWVsc2UKLQkJCQlmU3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZXQgcHVibGljL3N5c3RlbSBpZCB0ZXh0Ci0JCQlmUHVibGljSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlmU3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVWYWx1ZXMoKSB7Ci0JCXBvcHVsYXRlRG9jdHlwZVZhbHVlcygpOwotCQlwb3B1bGF0ZUNTU1Byb2ZpbGVWYWx1ZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDU1NQcm9maWxlVmFsdWVzKCkgewotCQlmUHJvZmlsZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gYWRkIG5vbmUgZmlyc3QKLQkJZlByb2ZpbGVDb21iby5hZGQoU0VMRUNUX05PTkUpOwotCQlmUHJvZmlsZUlkcy5hZGQobnVsbCk7Ci0KLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSUQoKTsKLQkJCVN0cmluZyBuYW1lID0gcHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwotCQkJZlByb2ZpbGVDb21iby5hZGQobmFtZSk7Ci0JCQlmUHJvZmlsZUlkcy5hZGQoaWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRG9jdHlwZVZhbHVlcygpIHsKLQkJZkRvY3VtZW50VHlwZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gYWRkIG5vbmUgZmlyc3QKLQkJZkRvY3VtZW50VHlwZUNvbWJvLmFkZChTRUxFQ1RfTk9ORSk7Ci0JCWZEb2N1bWVudFR5cGVJZHMuYWRkKG51bGwpOwotCi0JCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSByZWcgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJRW51bWVyYXRpb24gZSA9IHJlZy5nZXRFbnRyaWVzKCk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSAoSFRNTERvY3VtZW50VHlwZUVudHJ5KSBlLm5leHRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgcHVibGljSWQgPSBlbnRyeS5nZXRQdWJsaWNJZCgpOwotCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gZW50cnkuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWUgIT0gbnVsbCA/IGRpc3BsYXlOYW1lIDogcHVibGljSWQ7Ci0KLQkJCWZEb2N1bWVudFR5cGVDb21iby5hZGQoZGlzcGxheU5hbWUpOwotCQkJZkRvY3VtZW50VHlwZUlkcy5hZGQocHVibGljSWQpOwotCi0JCQlpZiAoZGlzcGxheU5hbWUubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkgewotCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gZGlzcGxheU5hbWU7Ci0JCQl9Ci0KLQkJCWlmIChlbnRyeS5nZXRTeXN0ZW1JZCgpID09IG51bGwpCi0JCQkJY29udGludWU7IC8vIGlmIEhUTUwgZW50cnkKLQotCi0JCQlpZiAoZW50cnkuZ2V0U3lzdGVtSWQoKS5sZW5ndGgoKSA+IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5Lmxlbmd0aCgpKQotCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wdXRlTWF4V2lkdGhIaW50KCkgewotCQkvLyBtYXhMZW5ndGhTdHJpbmcgd2FzIHNldCBwb3B1bGF0ZURvY3R5cGVWYWx1ZXMgd2FzIGNhbGxlZAotCQlTdHJpbmcgbWF4TGVuZ3RoU3RyaW5nID0gbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnk7Ci0JCVN0cmluZyBiYWNrdXAgPSBmU3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KG1heExlbmd0aFN0cmluZyk7Ci0JCWludCBtYXhXaWR0aEhpbnQgPSBmU3lzdGVtSWRUZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KGJhY2t1cCk7Ci0KLQkJaWYgKGZEb2N1bWVudFR5cGVDb21iby5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIGZEb2N1bWVudFR5cGVDb21iby5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKGZQdWJsaWNJZFRleHQuZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSBmUHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAoZlN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIGZTeXN0ZW1JZFRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmIChmUHJvZmlsZUNvbWJvLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgZlByb2ZpbGVDb21iby5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybUNTU1Byb2ZpbGVEZWZhdWx0cygpIHsKLQkJaW50IGluZGV4ID0gZlByb2ZpbGVDb21iby5pbmRleE9mKFNFTEVDVF9OT05FKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmUHJvZmlsZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1DU1NQcm9maWxlT2soKSB7Ci0JCWludCBpbmRleCA9IGZQcm9maWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGZQcm9maWxlSWRzLmdldChpbmRleCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwIHx8IGlkLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlpZCA9IG51bGw7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCUNTU0NvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBnZXRSZXNvdXJjZSgpLCBpZCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nCi0JCQkJLy8gZmlsZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCi0JCXBlcmZvcm1Eb2N0eXBlRGVmYXVsdHMoKTsKLQkJcGVyZm9ybUNTU1Byb2ZpbGVEZWZhdWx0cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRG9jdHlwZURlZmF1bHRzKCkgewotCQlmUHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwZXJmb3JtRG9jdHlwZU9rKCkgewotCQlpbnQgaW5kZXggPSBmRG9jdW1lbnRUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGZEb2N1bWVudFR5cGVJZHMuZ2V0KGluZGV4KTsKLQkJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDAgfHwgaWQuZXF1YWxzSWdub3JlQ2FzZShTRUxFQ1RfTk9ORSkpIHsKLQkJCQkvLyBpZiBub25lLCB1c2UgbnVsbAotCQkJCWlkID0gbnVsbDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJSFRNTENvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBnZXRSZXNvdXJjZSgpLCBpZCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nCi0JCQkJLy8gZmlsZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXBlcmZvcm1Eb2N0eXBlT2soKTsKLQkJcGVyZm9ybUNTU1Byb2ZpbGVPaygpOwotCi0JCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGRiMDI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Db3JyZWN0aW9uUHJvY2Vzc29yWE1MOwotCi0vKioKLSAqIENvcnJlY3Rpb24gYXNzaXN0YW50IGZvciBIVE1MCi0gKiAKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDIuMCBSQzAgVXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLSAqLwotcHVibGljIGNsYXNzIENvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlckhUTUwgZXh0ZW5kcyBDb3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIgewotCi0JcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvcnJlY3Rpb25Bc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJSUNvbnRlbnRBc3Npc3RhbnQgY2EgPSBudWxsOwotCi0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSBuZXcgQ29udGVudEFzc2lzdGFudCgpOwotCi0JCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBjb3JyZWN0aW9uUHJvY2Vzc29yID0gbmV3IENvcnJlY3Rpb25Qcm9jZXNzb3JYTUwoc291cmNlVmlld2VyKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5UKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04pOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9QSSk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVCk7Ci0JCQl9Ci0JCQljYSA9IGFzc2lzdGFudDsKLQkJfQotCi0JCXJldHVybiBjYTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjBiYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmphdmFkb2MuU2luZ2xlQ2hhclJlYWRlci4KLSAqIE1vZGlmaWNhdGlvbiB3YXMgbWFkZSB0byBmaXggc3RhdGVtZW50IHVubmVjZXNzYXJpbHkgbmVzdGVkIHdpdGhpbiBlbHNlCi0gKiBjbGF1c2Ugd2FybmluZyBpbiByZWFkKC4uKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbmdsZUNoYXJSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZChjaGFyW10saW50LGludCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjYnVmW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBlbmQgPSBvZmYgKyBsZW47Ci0JCWZvciAoaW50IGkgPSBvZmY7IGkgPCBlbmQ7IGkrKykgewotCQkJaW50IGNoID0gcmVhZCgpOwotCQkJaWYgKGNoID09IC0xKSB7Ci0JCQkJaWYgKGkgPT0gb2ZmKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGkgLSBvZmY7Ci0JCQl9Ci0JCQljYnVmW2ldID0gKGNoYXIpIGNoOwotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBhcyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNoOwotCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAtMSkgewotCQkJYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0FjdGlvbkNvbnRyaWJ1dG9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9BY3Rpb25Db250cmlidXRvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3MWQwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0FjdGlvbkNvbnRyaWJ1dG9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3JYTUw7Ci0KLS8qKgotICoKLSAqIEluc3RlYWQsIHVzZSBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yCi0gKiBvZiBtdWx0aSBwYWdlIGVkaXRvci4KLSAqIAotICogTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3RpbGwgdmFsaWQgZm9yIHNpbmdsZSBwYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnRyaWJ1dG9ySFRNTCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yWE1MIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeHRlbnNpb25JRHMoKSB7Ci0JCXJldHVybiBFRElUT1JfSURTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uSFRNTERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGZkNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uSFRNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0gKiBDbGVhbnVwIGFjdGlvbiBkZWxlZ2F0ZSBmb3IgSFRNTCBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIENsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBmQ2xlYW51cFByb2Nlc3NvcjsKLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZFZGl0b3IgPSBudWxsOwotCQlmQ2xlYW51cFByb2Nlc3NvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoSFRNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKEhUTUxVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlmaW5hbCBJVGV4dEVkaXRvciBlZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0JCQlDbGVhbnVwRGlhbG9nSFRNTCBjbGVhbnVwRGlhbG9nID0gbmV3IENsZWFudXBEaWFsb2dIVE1MKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQljbGVhbnVwRGlhbG9nLnNldGlzWEhUTUxUeXBlKGlzWEhUTUwoKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0KLQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZkVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIHJ1bm5hYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnCi0JCQkJCQkvLyBtb2RlbAotCQkJCQkJLy8gY2hhbmdlCi0JCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQotCQkJCQkJLy8gZW5kIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29yID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvciA9IG5ldyBIVE1MQ2xlYW51cFByb2Nlc3NvckltcGwoKTsKLQotCQlyZXR1cm4gZkNsZWFudXBQcm9jZXNzb3I7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzWEhUTUwoKSB7Ci0JCWJvb2xlYW4gaXN4aHRtbCA9IGZhbHNlOwotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBmRWRpdG9yOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlJRE9NRG9jdW1lbnQgZG9tRG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCWlmIChkb21Eb2N1bWVudCAhPSBudWxsKQotCQkJCQkJaXN4aHRtbCA9IGRvbURvY3VtZW50LmlzWE1MVHlwZSgpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXN4aHRtbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmZlMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRGlhbG9nSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cERpYWxvZ0hUTUwgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hGb3JtYXRTb3VyY2U7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93czsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4OwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYzsKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZklzWEhUTUwgPSBmYWxzZTsKLQlwcml2YXRlIEdyb3VwIGZUYWdOYW1lQ2FzZTsKLQlwcml2YXRlIEdyb3VwIGZBdHRyTmFtZUNhc2U7Ci0KLQlwdWJsaWMgQ2xlYW51cERpYWxvZ0hUTUwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIoc2hlbGwpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlnZXRTaGVsbCgpLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQ2xlYW51cF9VSV8pOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQljcmVhdGVEaWFsb2dBcmVhSW5Db21wb3NpdGUoY29tcG9zaXRlKTsKLQkJaW5pdGlhbGl6ZU9wdGlvbnMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOwotCQlva0J1dHRvbkVuYWJsZW1lbnQoKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlRm9ySFRNTChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCS8vIENvbnZlcnQgdGFnIG5hbWUgY2FzZQotCQkvLyBkMjU3MDY0IG5lZWQgdG8gYXNzb2NpYXRlIGdyb3VwIHcvIHJhZGlvIGJ1dHRvbnMgc28gcmFkaW8gYnV0dG9ucwotCQkvLyBoZWFkZXIgY2FuIGJlIHJlYWQKLQkJZlRhZ05hbWVDYXNlID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmVGFnTmFtZUNhc2Uuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXyk7Ci0JCUdyaWRMYXlvdXQgaExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWhMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWZUYWdOYW1lQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcyA9IG5ldyBCdXR0b24oZlRhZ05hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUFzaXMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9jYXNlX0FzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlciA9IG5ldyBCdXR0b24oZlRhZ05hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVfY2FzZV9Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihmVGFnTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9jYXNlX1VwcGVyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ29udmVydCBhdHRyIG5hbWUgY2FzZQotCQkvLyBkMjU3MDY0IG5lZWQgdG8gYXNzb2NpYXRlIGdyb3VwIHcvIHJhZGlvIGJ1dHRvbnMgc28gcmFkaW8gYnV0dG9ucwotCQkvLyBoZWFkZXIgY2FuIGJlIHJlYWQKLQkJZkF0dHJOYW1lQ2FzZSA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZkF0dHJOYW1lQ2FzZS5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX2Nhc2VfZm9yX0hUTUxfVUlfKTsKLQkJZkF0dHJOYW1lQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMgPSBuZXcgQnV0dG9uKGZBdHRyTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZV9jYXNlX0FzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyID0gbmV3IEJ1dHRvbihmQXR0ck5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX2Nhc2VfTG93ZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihmQXR0ck5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX2Nhc2VfVXBwZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlRm9ySFRNTChjb21wb3NpdGUpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLkNMRUFOVVBfSFRNTF9IRUxQSUQpOyAvLyB1c2UKLQkJLy8gSFRNTAotCQkvLyBzcGVjaWZpYwotCQkvLyBoZWxwCi0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gSW5zZXJ0IG1pc3NpbmcgcmVxdWlyZWQgYXR0cnMKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBJbnNlcnQgbWlzc2luZyBiZWdpbi9lbmQgdGFncwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkluc2VydF9taXNzaW5nX3RhZ3NfVUlfKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV8pOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gRm9ybWF0IHNvdXJjZQotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2UgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuRm9ybWF0X3NvdXJjZV9VSV8pOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ29udmVydCBFT0wgY29kZQotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQ29udmVydF9FT0xfY29kZXNfVUlfKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlDb21wb3NpdGUgRU9MQ29kZXMgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlFT0xDb2Rlcy5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5FT0xfV2luZG93c19VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peCA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldFRleHQoSFRNTFVJTWVzc2FnZXMuRU9MX1VuaXhfVUkpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYyA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5FT0xfTWFjX1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXN0b3JlT3B0aW9ucygpOwotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcHRpb25zRm9ySFRNTCgpIHsKLQkJYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gaXNYSFRNTFR5cGUoKTsKLQotCQlpZiAoY2FzZVNlbnNpdGl2ZSkgewotCQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgdGFnTmFtZUNhc2UgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSk7Ci0JCQlpZiAodGFnTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCX0gZWxzZSBpZiAodGFnTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VBc2lzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWlmIChjYXNlU2Vuc2l0aXZlKSB7Ci0JCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgYXR0ck5hbWVDYXNlID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFKTsKLQkJCWlmIChhdHRyTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKGF0dHJOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQllbmFibGVDYXNlQ29udHJvbHMoIWNhc2VTZW5zaXRpdmUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcHRpb25zKCkgewotCQlpbml0aWFsaXplT3B0aW9uc0ZvckhUTUwoKTsKLQotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3Muc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpKTsKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2Uuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUykpOwotCQlpZiAoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlTdHJpbmcgRU9MQ29kZSA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSk7Ci0JCQlpZiAoRU9MQ29kZSA9PSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRikKLQkJCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChFT0xDb2RlID09IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSKQotCQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVFT0xDb2RlUmFkaW9zKGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVPcHRpb25zRm9ySFRNTCgpIHsKLQkJaWYgKCFpc1hIVE1MVHlwZSgpICYmIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWVsc2UgaWYgKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWVsc2UKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCi0JCWlmICghaXNYSFRNTFR5cGUoKSAmJiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWVsc2UgaWYgKGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZWxzZQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCi0JCS8vIGV4cGxpY2l0bHkgc2F2ZSBwbHVnaW4gcHJlZmVyZW5jZXMgc28gdmFsdWVzIGFyZSBzdG9yZWQKLQkJSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlT3B0aW9ucygpIHsKLQkJc3RvcmVPcHRpb25zRm9ySFRNTCgpOwotCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIGZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUywgZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIGZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCBmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMsIGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSkgewotCQkJaWYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKTsKLQkJCX0gZWxzZSBpZiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUik7Ci0JCQl9IGVsc2UgewotCQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKTsKLQkJCX0KLQkJfQotCi0JCS8vIGV4cGxpY2l0bHkgc2F2ZSBwbHVnaW4gcHJlZmVyZW5jZXMgc28gdmFsdWVzIGFyZSBzdG9yZWQKLQkJSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCXdpZGdldFNlbGVjdGVkKGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IGZDaGVja0JveENvbnZlcnRFT0xDb2RlcykKLQkJCWVuYWJsZUVPTENvZGVSYWRpb3MoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKTsKLQotCQlva0J1dHRvbkVuYWJsZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MVHlwZSgpIHsKLQkJcmV0dXJuIGZJc1hIVE1MOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUVPTENvZGVSYWRpb3MoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYgKChmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cyAhPSBudWxsKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXggIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMgIT0gbnVsbCkpIHsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0RW5hYmxlZChlbmFibGUpOwotCi0JCQlpZiAoIWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmdldFNlbGVjdGlvbigpICYmICFmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5nZXRTZWxlY3Rpb24oKSAmJiAhZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSkKLQkJCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSB0YWcvYXR0ciBjYXNlIHJhZGlvIGJ1dHRvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlQ2FzZUNvbnRyb2xzKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWZUYWdOYW1lQ2FzZS5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuc2V0RW5hYmxlZChlbmFibGUpOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyLnNldEVuYWJsZWQoZW5hYmxlKTsKLQotCQlmQXR0ck5hbWVDYXNlLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpcy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuc2V0RW5hYmxlZChlbmFibGUpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMvZGlzYWJsZXMgT0sgYnV0dG9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9rQnV0dG9uRW5hYmxlbWVudCgpIHsKLQkJYm9vbGVhbiB0YWdOYW1lQ2FzZUNoZWNrID0gKChmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkgfHwgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCWJvb2xlYW4gYXR0ck5hbWVDYXNlQ2hlY2sgPSAoKGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyICE9IG51bGwgJiYgZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpIHx8IGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKTsKLQkJYm9vbGVhbiBlb2xDaGVjayA9IGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSB8fCBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWJvb2xlYW4gYnV0dG9uRW5hYmxlZCA9IHRhZ05hbWVDYXNlQ2hlY2sgfHwgYXR0ck5hbWVDYXNlQ2hlY2sgfHwgZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuZ2V0U2VsZWN0aW9uKCkgfHwgZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLmdldFNlbGVjdGlvbigpIHx8IGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSB8fCBlb2xDaGVjazsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoYnV0dG9uRW5hYmxlZCk7Ci0JfQotCi0Jdm9pZCBzZXRpc1hIVE1MVHlwZShib29sZWFuIGlzWEhUTUwpIHsKLQkJZklzWEhUTUwgPSBpc1hIVE1MOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERvY3VtZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRG9jdW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YzUyNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRG9jdW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXAuSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cERvY3VtZW50SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIElIYW5kbGVyIHsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBmQ2xlYW51cFByb2Nlc3NvcjsKLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmQ2xlYW51cFByb2Nlc3NvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yUGFydDsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgbyA9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJZmluYWwgSVRleHRFZGl0b3IgZWRpdG9yID0gdGV4dEVkaXRvcjsKLQkJCUNsZWFudXBEaWFsb2dIVE1MIGNsZWFudXBEaWFsb2cgPSBuZXcgQ2xlYW51cERpYWxvZ0hUTUwoZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCWNsZWFudXBEaWFsb2cuc2V0aXNYSFRNTFR5cGUoaXNYSFRNTChlZGl0b3IpKTsKLQkJCWlmIChjbGVhbnVwRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkvLyBzZXR1cCBydW5uYWJsZQotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciA9IGdldENsZWFudXBQcm9jZXNzb3IoKTsKLQkJCQkJCWlmIChjbGVhbnVwUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCWNsZWFudXBQcm9jZXNzb3IuY2xlYW51cE1vZGVsKG1vZGVsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCS8vIFRPRE86IG1ha2UgaW5kZXBlbmRlbnQgb2YgJ21vZGVsJy4KLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZwotCQkJCQkJLy8gbW9kZWwgY2hhbmdlCi0JCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCQkJLy8gcnVuCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBydW5uYWJsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZwotCQkJCQkJLy8gbW9kZWwKLQkJCQkJCS8vIGNoYW5nZQotCQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0KLQkJCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGdldENsZWFudXBQcm9jZXNzb3IoKSB7Ci0JCWlmIChmQ2xlYW51cFByb2Nlc3NvciA9PSBudWxsKQotCQkJZkNsZWFudXBQcm9jZXNzb3IgPSBuZXcgSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsKCk7Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJvY2Vzc29yOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNYSFRNTChJVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJYm9vbGVhbiBpc3hodG1sID0gZmFsc2U7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJSURPTURvY3VtZW50IGRvbURvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQlpZiAoZG9tRG9jdW1lbnQgIT0gbnVsbCkKLQkJCQkJCWlzeGh0bWwgPSBkb21Eb2N1bWVudC5pc1hNTFR5cGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzeGh0bWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0hUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0hUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDY2MTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQTFVHSU5JRCA9IEhUTUxVSVBsdWdpbi5JRDsKLQlwcml2YXRlIHN0YXRpYyBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8JIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiBJZiB0aGUgaW1hZ2UgY2Fubm90IGJlIHJldHJpZXZlZCwgYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBhdAotCSAqIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2Ugb3IgbnVsbCBpZiBvbmUgY291bGQKLQkgKiAgICAgICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhbiBpbWFnZQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV0cmlldmVkLAotCSAqIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCi0JICogaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jYXRlZCB3aXRoIHJlc291cmNlIG9yCi0JICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5IC0gaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgYWRkcyB0aGUgaW1hZ2UgdG8gdGhlCi0JICogaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkKLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZSByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmEwZjI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgSFRNTCBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMgeyAJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUJMRSA9ICJpY29ucy9mdWxsL29iajE2L3RhYmxlLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0FOQ0hPUiA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1hbmNob3IuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfQk9EWSA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1ib2R5LmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0JVVFRPTiA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1idXR0b24uZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfRk9OVCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1mb250LmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0ZPUk0gPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctZm9ybS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfSFRNTCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1odG1sLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0lNQUdFX01BUCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS1tYXAuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfSU1BR0UgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfSlNQID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19URU1QTEFURSA9ICJpY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19USVRMRSA9ICJpY29ucy9mdWxsL29iajE2L3RhZy10aXRsZS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBRyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX05FV0hUTUxGSUxFID0gImljb25zL2Z1bGwvd2l6YmFuL25ld2hmaWxlX3dpei5wbmciOwkJCS8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5YjcyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBIVE1MIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSGVscENvbnRleHRJZHMgewotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IEhUTUxVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIEhUTUwgU291cmNlIHBhZ2UgZWRpdG9yCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MICsiX3NvdXJjZV9IZWxwSWQiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBIVE1MIEZpbGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfUFJFRldFQlhfRklMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDMwIjsgLy8kTk9OLU5MUy0xJAotCS8vIEhUTUwgU291cmNlIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfUFJFRldFQlhfU09VUkNFX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAzMSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBIVE1MIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMzIiOyAvLyROT04tTkxTLTEkCi0JLy8gSFRNTCBUZW1wbGF0ZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDMzIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkvLyBIVE1MIENsZWFudXAgZGlhbG9nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9IVE1MX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMTEwMCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBIVE1MIENvbnRlbnQgU2V0dGluZ3MKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQ09OVEVOVF9TRVRUSU5HU19IRUxQSUQgPSBQUkVGSVggKyAibWlzYzAxNzAiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gSFRNTCBOZXcgRmlsZSBXaXphcmQgLSBUZW1wbGF0ZSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gUFJFRklYICsgImh0bWx3MDAxMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0hUTUxGaW5kT2NjdXJyZW5jZXNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oYW5kbGVycy9IVE1MRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBjODQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0hUTUxGaW5kT2NjdXJyZW5jZXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaC5IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsOwotCi1wdWJsaWMgY2xhc3MgSFRNTEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yKGV2ZW50KTsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCWJvb2xlYW4gb2theSA9IGZhbHNlOwotCQkKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCQotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0VGV4dFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQlpZiAoZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQlpZiAodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQkJCQlva2F5ID0gZmluZE9jY3VycmVuY2VQcm9jZXNzb3IuZmluZE9jY3VycmVuY2VzKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLCBmaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2theSkgewotCQkJLy8gY2xlYXIgc3RhdHVzIG1lc3NhZ2UKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhcHByb3ByaWF0ZSBmaW5kIG9jY3VycmVuY2VzIHByb2Nlc3NvcgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICogQHBhcmFtIHRleHRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gdGhhdCdzIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb24gPSB0ciAhPSBudWxsID8gdHIuZ2V0VHlwZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpdCA9IGdldFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgcHJvY2Vzc29yID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcHJvY2Vzc29yID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJLy8gd2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IGFjdGlvbiB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJaWYgKHByb2Nlc3Nvci5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCXJldHVybiBwcm9jZXNzb3I7Ci0JCX0KLQotCQlMaXN0IGV4dGVuZGVkRmluZE9jY3VycmVuY2VzUHJvY2Vzc29ycyA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9ucyhGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBwYXJ0aXRpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVkRmluZE9jY3VycmVuY2VzUHJvY2Vzc29ycy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG8gPSBleHRlbmRlZEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcnMuZ2V0KGkpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IpIHsKLQkJCQkvKgotCQkJCSAqIFdlIGp1c3QgY2hvb3NlIHRoZSBmaXJzdCByZWdpc3RlcmVkIHByb2Nlc3NvciB0aGF0Ci0JCQkJICogZXhwbGljaXRseSBzYXlzIGl0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJCSAqLwotCQkJCXByb2Nlc3NvciA9IChGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IpIGl0Lm5leHQoKTsKLQkJCQlpZiAocHJvY2Vzc29yLmVuYWJsZWRGb3JQYXJpdGl0aW9uKHBhcnRpdGlvbikpCi0JCQkJCXJldHVybiBwcm9jZXNzb3I7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSVR5cGVkUmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWlmICh0ZXh0U2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gZG9jdW1lbnQuZ2V0UGFydGl0aW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZWdpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotCQotCXByaXZhdGUgSVRleHRTZWxlY3Rpb24gZ2V0VGV4dFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQl0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCX0KLQkJcmV0dXJuIHRleHRTZWxlY3Rpb247Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0FuY2hvckh5cGVybGlua0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvQW5jaG9ySHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5YjY2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvQW5jaG9ySHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLk1vZHVsZUNvcmVTdXBwb3J0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50Ow0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOw0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsNCi0NCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7DQotDQotcHVibGljIGNsYXNzIEFuY2hvckh5cGVybGlua0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvciB7DQotCXN0YXRpYyBjbGFzcyBFeHRlcm5hbEVsZW1lbnRIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsNCi0JCXByaXZhdGUgU3RyaW5nIGZBbmNob3JOYW1lID0gbnVsbDsNCi0JCXByaXZhdGUgRWxlbWVudCBmQmFzZUVsZW1lbnQgPSBudWxsOw0KLQkJcHJpdmF0ZSBEaXNwbGF5IGZEaXNwbGF5ID0gbnVsbDsNCi0JCXByaXZhdGUgSVJlZ2lvbiBmSHlwZXJsaW5rUmVnaW9uID0gbnVsbDsNCi0NCi0JCS8qKg0KLQkJICogQHBhcmFtIGh5cGVybGlua1JlZ2lvbg0KLQkJICogQHBhcmFtIGFuY2hvck5hbWUNCi0JCSAqLw0KLQkJcHVibGljIEV4dGVybmFsRWxlbWVudEh5cGVybGluayhEaXNwbGF5IGRpc3BsYXksIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBTdHJpbmcgYW5jaG9yTmFtZSwgRWxlbWVudCBiYXNlRWxlbWVudCkgew0KLQkJCXN1cGVyKCk7DQotCQkJZkRpc3BsYXkgPSBkaXNwbGF5Ow0KLQkJCWZIeXBlcmxpbmtSZWdpb24gPSBoeXBlcmxpbmtSZWdpb247DQotCQkJZkFuY2hvck5hbWUgPSBhbmNob3JOYW1lOw0KLQkJCWZCYXNlRWxlbWVudCA9IGJhc2VFbGVtZW50Ow0KLQkJfQ0KLQ0KLQkJLyoNCi0JCSAqIChub24tSmF2YWRvYykNCi0JCSAqIA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI29wZW4oKQ0KLQkJICovDQotCQlJU3RhdHVzIF9vcGVuKCkgew0KLQkJCWlmIChmQmFzZUVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgew0KLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihmQW5jaG9yTmFtZSwgIiMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOw0KLQkJCQlTdHJpbmcgYW5jaG9yTmFtZSA9IG51bGw7DQotCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7DQotCQkJCQl0cnkgew0KLQkJCQkJCWZpbGVuYW1lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOw0KLQkJCQkJCWFuY2hvck5hbWUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQotCQkJCQl9DQotCQkJCQljYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJLy8gcG9vcmx5IGZvcm1lZCB2YWx1ZQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWlmIChmaWxlbmFtZSAhPSBudWxsICYmIGFuY2hvck5hbWUgIT0gbnVsbCkgew0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGZpbGVuYW1lICsgIjoiICsgYW5jaG9yTmFtZSArICItIiArDQotCQkJCQkvLyBmQmFzZUVsZW1lbnQpOw0KLQ0KLQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aCgoKElET01Ob2RlKSBmQmFzZUVsZW1lbnQpLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCkpOw0KLQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgew0KLQkJCQkJCUlQYXRoIHJlc29sdmVkID0gTW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShiYXNlUGF0aCwgZmlsZW5hbWUpOw0KLQkJCQkJCUlGaWxlIHRhcmdldEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocmVzb2x2ZWQpOw0KLQkJCQkJCWlmICh0YXJnZXRGaWxlLmlzQWNjZXNzaWJsZSgpKSB7DQotCQkJCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOw0KLQkJCQkJCQlpbnQgc3RhcnQgPSAtMTsNCi0JCQkJCQkJaW50IGVuZCA9IC0xOw0KLQkJCQkJCQl0cnkgew0KLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZCh0YXJnZXRGaWxlKTsNCi0JCQkJCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgew0KLQkJCQkJCQkJCU5vZGVMaXN0IGFuY2hvcnMgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiKiIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5jaG9ycy5nZXRMZW5ndGgoKSAmJiBzdGFydCA8IDA7IGkrKykgew0KLQkJCQkJCQkJCQlOb2RlIGl0ZW0gPSBhbmNob3JzLml0ZW0oaSk7DQotCQkJCQkJCQkJCU5vZGUgbmFtZU5vZGUgPSBpdGVtLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKTsNCi0JCQkJCQkJCQkJaWYgKG5hbWVOb2RlICE9IG51bGwpIHsNCi0JCQkJCQkJCQkJCVN0cmluZyBuYW1lID0gbmFtZU5vZGUuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJCQkJCQkJCQlpZiAoYW5jaG9yTmFtZS5lcXVhbHMobmFtZSkgJiYgbmFtZU5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7DQotCQkJCQkJCQkJCQkJc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5hbWVOb2RlKS5nZXRTdGFydE9mZnNldCgpOw0KLQkJCQkJCQkJCQkJCWVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbmFtZU5vZGUpLmdldEVuZE9mZnNldCgpOw0KLQkJCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCQl9DQotCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCWFuY2hvcnMgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEpOw0KLQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5jaG9ycy5nZXRMZW5ndGgoKSAmJiBzdGFydCA8IDA7IGkrKykgew0KLQkJCQkJCQkJCQlOb2RlIGl0ZW0gPSBhbmNob3JzLml0ZW0oaSk7DQotCQkJCQkJCQkJCU5vZGUgbmFtZU5vZGUgPSBpdGVtLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKTsNCi0JCQkJCQkJCQkJaWYgKG5hbWVOb2RlICE9IG51bGwpIHsNCi0JCQkJCQkJCQkJCVN0cmluZyBuYW1lID0gbmFtZU5vZGUuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJCQkJCQkJCQlpZiAoYW5jaG9yTmFtZS5lcXVhbHMobmFtZSkgJiYgbmFtZU5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7DQotCQkJCQkJCQkJCQkJc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5hbWVOb2RlKS5nZXRTdGFydE9mZnNldCgpOw0KLQkJCQkJCQkJCQkJCWVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbmFtZU5vZGUpLmdldEVuZE9mZnNldCgpOw0KLQkJCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCQl9DQotCQkJCQkJCQkJfQ0KLQ0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJcmV0dXJuIG9wZW4oYmFzZVBhdGgudG9TdHJpbmcoKSwgdGFyZ2V0RmlsZSwgc3RhcnQsIGVuZCk7DQotCQkJCQkJCX0NCi0JCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOw0KLQkJCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSFRNTFVJUGx1Z2luLklELCBlLmdldE1lc3NhZ2UoKSk7DQotDQotCQkJCQkJCX0NCi0JCQkJCQkJZmluYWxseSB7DQotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkNCi0JCQkJCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsNCi0JCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCX0NCi0NCi0JCS8qDQotCQkgKiAobm9uLUphdmFkb2MpDQotCQkgKiANCi0JCSAqIEBzZWUNCi0JCSAqIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rUmVnaW9uKCkNCi0JCSAqLw0KLQkJcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgew0KLQkJCXJldHVybiBmSHlwZXJsaW5rUmVnaW9uOw0KLQkJfQ0KLQ0KLQkJLyoNCi0JCSAqIChub24tSmF2YWRvYykNCi0JCSAqIA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQ0KLQkJICovDQotCQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQkvKg0KLQkJICogKG5vbi1KYXZhZG9jKQ0KLQkJICogDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkNCi0JCSAqLw0KLQkJcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBvcGVuKCkgew0KLQkJCXNjaGVkdWxlT3BlbigpOw0KLQkJfQ0KLQ0KLQkJLyoqDQotCQkgKiBAcGFyYW0gdGFyZ2V0RmlsZQ0KLQkJICogQHBhcmFtIHN0YXJ0DQotCQkgKiBAcGFyYW0gZW5kDQotCQkgKi8NCi0JCXByaXZhdGUgSVN0YXR1cyBvcGVuKFN0cmluZyBiYXNlLCBJRmlsZSB0YXJnZXRGaWxlLCBpbnQgc3RhcnQsIGludCBlbmQpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBQYXJ0SW5pdEV4Y2VwdGlvbiB7DQotCQkJSU1hcmtlciB0ZW1wb3JhcnlNYXJrZXIgPSBudWxsOw0KLQkJCXRyeSB7DQotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsNCi0NCi0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IocGFnZSwgdGFyZ2V0RmlsZSk7DQotDQotCQkJCWlmICgwIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IGVuZCkgew0KLQkJCQkJdGVtcG9yYXJ5TWFya2VyID0gdGFyZ2V0RmlsZS5jcmVhdGVNYXJrZXIoSU1hcmtlci5CT09LTUFSSyk7DQotCQkJCQl0ZW1wb3JhcnlNYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgYmFzZSk7DQotCQkJCQl0ZW1wb3JhcnlNYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgc3RhcnQpOw0KLQkJCQkJdGVtcG9yYXJ5TWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCBlbmQpOw0KLQkJCQkJSURFLmdvdG9NYXJrZXIoZWRpdG9yLCB0ZW1wb3JhcnlNYXJrZXIpOw0KLQkJCQl9DQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOw0KLQkJCX0NCi0JCQlmaW5hbGx5IHsNCi0JCQkJaWYgKHRlbXBvcmFyeU1hcmtlciAhPSBudWxsKQ0KLQkJCQkJdHJ5IHsNCi0JCQkJCQl0ZW1wb3JhcnlNYXJrZXIuZGVsZXRlKCk7DQotCQkJCQl9DQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQl2b2lkIHNjaGVkdWxlT3BlbigpIHsNCi0JCQlKb2Igb3BlbmVyID0gbmV3IFVJSm9iKGZEaXNwbGF5LCBmQW5jaG9yTmFtZSkgew0KLQkJCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJCQkJcmV0dXJuIF9vcGVuKCk7DQotCQkJCX0NCi0NCi0JCQl9Ow0KLQkJCW9wZW5lci5zZXRTeXN0ZW0odHJ1ZSk7DQotCQkJb3BlbmVyLnNldFVzZXIoZmFsc2UpOw0KLQkJCW9wZW5lci5zY2hlZHVsZSgpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBMaW5rcyB0byB0aGUgZ2l2ZW4gdGFyZ2V0IG5vZGUgd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4gVGhlIHRhcmdldCBub2RlDQotCSAqIGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCBJbmRleGVkTm9kZSBhbmQgYXBwZWFyIGluIHRoYXQgdGV4dCB2aWV3ZXINCi0JICogKGkuZS4gc2FtZSBlZGl0b3IpLg0KLQkgKiANCi0JICovDQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbEVsZW1lbnRIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsNCi0JCXByaXZhdGUgSVJlZ2lvbiBmSHlwZXJsaW5rUmVnaW9uOw0KLQkJcHJpdmF0ZSBOb2RlIGZUYXJnZXQgPSBudWxsOw0KLQkJcHJpdmF0ZSBJVGV4dFZpZXdlciBmVmlld2VyID0gbnVsbDsNCi0NCi0JCS8qKg0KLQkJICogDQotCQkgKi8NCi0JCXB1YmxpYyBJbnRlcm5hbEVsZW1lbnRIeXBlcmxpbmsoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIE5vZGUgdGFyZ2V0Tm9kZSkgew0KLQkJCWZIeXBlcmxpbmtSZWdpb24gPSBoeXBlcmxpbmtSZWdpb247DQotCQkJZlRhcmdldCA9IHRhcmdldE5vZGU7DQotCQkJZlZpZXdlciA9IHRleHRWaWV3ZXI7DQotCQl9DQotDQotCQkvKg0KLQkJICogKG5vbi1KYXZhZG9jKQ0KLQkJICogDQotCQkgKiBAc2VlDQotCQkgKiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1JlZ2lvbigpDQotCQkgKi8NCi0JCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsNCi0JCQlyZXR1cm4gZkh5cGVybGlua1JlZ2lvbjsNCi0JCX0NCi0NCi0JCS8qDQotCQkgKiAobm9uLUphdmFkb2MpDQotCQkgKiANCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkNCi0JCSAqLw0KLQkJcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgew0KLQkJCWlmIChmVGFyZ2V0IGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgew0KLQkJCQl0cnkgew0KLQkJCQkJaW50IGxpbmUgPSBmVmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgZlRhcmdldCkuZ2V0U3RhcnRPZmZzZXQoKSkgKyAxOw0KLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEhUTUxVSU1lc3NhZ2VzLkh5cGVybGlua19saW5lLCBuZXcgU3RyaW5nW117ZlRhcmdldC5nZXROb2RlTmFtZSgpLCBmVGFyZ2V0LmdldE5vZGVWYWx1ZSgpLCBTdHJpbmcudmFsdWVPZihsaW5lKX0pOw0KLQkJCQl9DQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiBmVGFyZ2V0LmdldE5vZGVOYW1lKCk7DQotCQl9DQotDQotCQkvKg0KLQkJICogKG5vbi1KYXZhZG9jKQ0KLQkJICogDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkNCi0JCSAqLw0KLQkJcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQkvKg0KLQkJICogKG5vbi1KYXZhZG9jKQ0KLQkJICogDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpDQotCQkgKi8NCi0JCXB1YmxpYyB2b2lkIG9wZW4oKSB7DQotCQkJaWYgKGZUYXJnZXQgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7DQotCQkJCWZWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZSgoKEluZGV4ZWRSZWdpb24pIGZUYXJnZXQpLmdldFN0YXJ0T2Zmc2V0KCksIDApOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgQW5jaG9ySHlwZXJsaW5rRGV0ZWN0b3IoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhZGRIeXBlckxpbmtGb3JIcmVmKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gbGlua1JlZ2lvbiwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgaHJlZlZhbHVlLCBMaXN0IGxpbmtzLCBOb2RlIGFuY2hvcikgew0KLQkJTm9kZSBuYW1lTm9kZSA9IGFuY2hvci5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRik7DQotCQlpZiAobmFtZU5vZGUgIT0gbnVsbCkgew0KLQkJCVN0cmluZyBuYW1lID0gbmFtZU5vZGUuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJaWYgKGhyZWZWYWx1ZS5lcXVhbHMobmFtZSkgJiYgbmFtZU5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7DQotCQkJCWxpbmtzLmFkZChuZXcgSW50ZXJuYWxFbGVtZW50SHlwZXJsaW5rKHRleHRWaWV3ZXIsIGxpbmtSZWdpb24sIG5hbWVOb2RlKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhZGRIeXBlckxpbmtGb3JOYW1lKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gbGlua1JlZ2lvbiwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYW5jaG9yTmFtZSwgTGlzdCBsaW5rcywgTm9kZSBhbmNob3IpIHsNCi0JCU5vZGUgbmFtZU5vZGUgPSBhbmNob3IuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUpOw0KLQkJaWYgKG5hbWVOb2RlICE9IG51bGwpIHsNCi0JCQlTdHJpbmcgbmFtZSA9IG5hbWVOb2RlLmdldE5vZGVWYWx1ZSgpOw0KLQkJCWlmIChhbmNob3JOYW1lLmVxdWFscyhuYW1lKSAmJiBuYW1lTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsNCi0JCQkJbGlua3MuYWRkKG5ldyBJbnRlcm5hbEVsZW1lbnRIeXBlcmxpbmsodGV4dFZpZXdlciwgbGlua1JlZ2lvbiwgbmFtZU5vZGUpKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbg0KLQkgKiBAcGFyYW0gdmFsdWVSZWdpb24NCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHJpdmF0ZSBJUmVnaW9uIGNyZWF0ZUh5cGVybGlua1JlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbikgew0KLQkJcmV0dXJuIG5ldyBSZWdpb24oZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pLCB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOw0KLQl9DQotDQotCS8vIGxpbmsgdG8gYW5jaG9ycyB3aXRoIHRoZSBnaXZlbiBuYW1lICh2YWx1ZSBpbmNsdWRlcyB0aGUgJyMnKQ0KLQlJSHlwZXJsaW5rW10gY3JlYXRlSHlwZXJsaW5rc1RvQW5jaG9yTmFtZWQoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGFuY2hvck5hbWUsIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgew0KLQkJTGlzdCBsaW5rcyA9IG5ldyBBcnJheUxpc3QoMSk7DQotCQkvLyA+MSBndWFyZHMgdGhlIHN1YnN0cmluZy1pbmcNCi0JCWlmIChhbmNob3JOYW1lLmxlbmd0aCgpID4gMSAmJiBhbmNob3JOYW1lLnN0YXJ0c1dpdGgoIiMiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJLy8gYW4gYW5jaG9yIGluIHRoaXMgZG9jdW1lbnQNCi0JCQlOb2RlTGlzdCBhbmNob3JzID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiKiIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKTsgLy8kTk9OLU5MUy0xJA0KLQkJCVN0cmluZyBpbnRlcm5hbEFuY2hvck5hbWUgPSBhbmNob3JOYW1lLnN1YnN0cmluZygxKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFuY2hvcnMuZ2V0TGVuZ3RoKCk7IGkrKykgew0KLQkJCQlhZGRIeXBlckxpbmtGb3JOYW1lKHRleHRWaWV3ZXIsIGh5cGVybGlua1JlZ2lvbiwgZWxlbWVudCwgaW50ZXJuYWxBbmNob3JOYW1lLCBsaW5rcywgYW5jaG9ycy5pdGVtKGkpKTsNCi0JCQl9DQotCQkJYW5jaG9ycyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFuY2hvcnMuZ2V0TGVuZ3RoKCk7IGkrKykgew0KLQkJCQlhZGRIeXBlckxpbmtGb3JOYW1lKHRleHRWaWV3ZXIsIGh5cGVybGlua1JlZ2lvbiwgZWxlbWVudCwgaW50ZXJuYWxBbmNob3JOYW1lLCBsaW5rcywgYW5jaG9ycy5pdGVtKGkpKTsNCi0JCQl9DQotCQl9DQotCQllbHNlIHsNCi0JCQkvLyBhbm90aGVyIGZpbGUsIHBvc3NpYmx5IHZlcnkgc2xvdyB0byBjb21wdXRlIGFoZWFkIG9mIHRpbWUNCi0JCQlsaW5rcy5hZGQobmV3IEV4dGVybmFsRWxlbWVudEh5cGVybGluayh0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXREaXNwbGF5KCksIGh5cGVybGlua1JlZ2lvbiwgYW5jaG9yTmFtZSwgZWxlbWVudCkpOw0KLQkJfQ0KLQkJaWYgKCFsaW5rcy5pc0VtcHR5KCkpIHsNCi0JCQlyZXR1cm4gKElIeXBlcmxpbmtbXSkgbGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1tsaW5rcy5zaXplKCldKTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8vIGxpbmsgdG8gYW5jaG9ycyB0aGF0IGxpbmsgdG8gdGhpcyB0YXJnZXQNCi0JSUh5cGVybGlua1tdIGNyZWF0ZVJlZmVycmVySHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZVZhbHVlLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsNCi0JCUxpc3QgbGlua3MgPSBuZXcgQXJyYXlMaXN0KDEpOw0KLQkJaWYgKG5hbWVWYWx1ZS5sZW5ndGgoKSA+IDApIHsNCi0JCQlTdHJpbmcgdGFyZ2V0ID0gIiMiICsgbmFtZVZhbHVlOyAvLyROT04tTkxTLTEkDQotCQkJTm9kZUxpc3QgYW5jaG9ycyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSk7IC8vJE5PTi1OTFMtMSQNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFuY2hvcnMuZ2V0TGVuZ3RoKCk7IGkrKykgew0KLQkJCQlhZGRIeXBlckxpbmtGb3JIcmVmKHRleHRWaWV3ZXIsIGh5cGVybGlua1JlZ2lvbiwgZWxlbWVudCwgdGFyZ2V0LCBsaW5rcywgYW5jaG9ycy5pdGVtKGkpKTsNCi0JCQl9DQotCQkJYW5jaG9ycyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFuY2hvcnMuZ2V0TGVuZ3RoKCk7IGkrKykgew0KLQkJCQlhZGRIeXBlckxpbmtGb3JIcmVmKHRleHRWaWV3ZXIsIGh5cGVybGlua1JlZ2lvbiwgZWxlbWVudCwgdGFyZ2V0LCBsaW5rcywgYW5jaG9ycy5pdGVtKGkpKTsNCi0JCQl9DQotCQl9DQotCQlpZiAoIWxpbmtzLmlzRW1wdHkoKSkgew0KLQkJCXJldHVybiAoSUh5cGVybGlua1tdKSBsaW5rcy50b0FycmF5KG5ldyBJSHlwZXJsaW5rW2xpbmtzLnNpemUoKV0pOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsNCi0JCWlmICh0ZXh0Vmlld2VyICE9IG51bGwgJiYgcmVnaW9uICE9IG51bGwpIHsNCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7DQotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsNCi0JCQkJTm9kZSBjdXJyZW50Tm9kZSA9IGdldEN1cnJlbnROb2RlKGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCkpOw0KLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7DQotCQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgY3VycmVudE5vZGU7DQotCQkJCQlpZiAoZWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSkgfHwgZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKSkgew0KLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZWdpb24uZ2V0T2Zmc2V0KCkpOw0KLQkJCQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZWdpb24uZ2V0T2Zmc2V0KCkpOw0KLQkJCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOw0KLQkJCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gbnVsbDsNCi0JCQkJCQlTdHJpbmcgbmFtZSA9IG51bGw7DQotCQkJCQkJU3RyaW5nIHZhbHVlID0gbnVsbDsNCi0JCQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHModGV4dFJlZ2lvbi5nZXRUeXBlKCkpKSB7DQotCQkJCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOw0KLQkJCQkJCQkvKg0KLQkJCQkJCQkgKiBDb3VsZCB1c2UgMiwgYnV0IHRoZXJlIG5lZWRzIHRvIGJlIHRoZSB0YWcgb3Blbg0KLQkJCQkJCQkgKiBhbmQgbmFtZSByZWdpb25zDQotCQkJCQkJCSAqLw0KLQkJCQkJCQlpbnQgaW5kZXggPSByZWdpb25zLmluZGV4T2YodGV4dFJlZ2lvbik7DQotCQkJCQkJCWlmIChpbmRleCA+PSA0KSB7DQotCQkJCQkJCQluYW1lUmVnaW9uID0gcmVnaW9ucy5nZXQoaW5kZXggLSAyKTsNCi0JCQkJCQkJCXZhbHVlUmVnaW9uID0gdGV4dFJlZ2lvbjsNCi0JCQkJCQkJCW5hbWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pOw0KLQkJCQkJCQkJdmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHZhbHVlUmVnaW9uKSk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQkJZWxzZSBpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyh0ZXh0UmVnaW9uLmdldFR5cGUoKSkpIHsNCi0JCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7DQotCQkJCQkJCWludCBpbmRleCA9IHJlZ2lvbnMuaW5kZXhPZih0ZXh0UmVnaW9uKTsNCi0JCQkJCQkJLy8gbWludXMgMyB0byBsZWF2ZSBlcXVhbCBhbmQgdmFsdWUgcmVnaW9ucw0KLQkJCQkJCQlpZiAoaW5kZXggPD0gcmVnaW9ucy5zaXplKCkgLSAzKSB7DQotCQkJCQkJCQluYW1lUmVnaW9uID0gdGV4dFJlZ2lvbjsNCi0JCQkJCQkJCXZhbHVlUmVnaW9uID0gcmVnaW9ucy5nZXQoaW5kZXggKyAyKTsNCi0JCQkJCQkJCW5hbWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pOw0KLQkJCQkJCQkJdmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHZhbHVlUmVnaW9uKSk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7DQotCQkJCQkJCWlmIChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSAmJiB2YWx1ZS5pbmRleE9mKCIjIikgPj0gMCkgeyAvLyROT04tTkxTLTEkDQotCQkJCQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rc1RvQW5jaG9yTmFtZWQodGV4dFZpZXdlciwgY3JlYXRlSHlwZXJsaW5rUmVnaW9uKGRvY3VtZW50UmVnaW9uLCB2YWx1ZVJlZ2lvbiksIGVsZW1lbnQsIHZhbHVlLCBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKTsNCi0JCQkJCQkJfQ0KLQkJCQkJCQlpZiAoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsNCi0JCQkJCQkJCXJldHVybiBjcmVhdGVSZWZlcnJlckh5cGVybGlua3ModGV4dFZpZXdlciwgY3JlYXRlSHlwZXJsaW5rUmVnaW9uKGRvY3VtZW50UmVnaW9uLCB2YWx1ZVJlZ2lvbiksIGVsZW1lbnQsIHZhbHVlLCBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKTsNCi0JCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBub2RlIHRoZSBjdXJzb3IgaXMgY3VycmVudGx5IG9uIGluIHRoZSBkb2N1bWVudC4gbnVsbCBpZiBubw0KLQkgKiBub2RlIGlzIHNlbGVjdGVkDQotCSAqIA0KLQkgKiBAcGFyYW0gb2Zmc2V0DQotCSAqIEByZXR1cm4gTm9kZSBlaXRoZXIgZWxlbWVudCwgZG9jdHlwZSwgdGV4dCwgb3IgbnVsbA0KLQkgKi8NCi0JcHJpdmF0ZSBOb2RlIGdldEN1cnJlbnROb2RlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgew0KLQkJLy8gZ2V0IHRoZSBjdXJyZW50IG5vZGUgYXQgdGhlIG9mZnNldCAocmV0dXJucyBlaXRoZXI6IGVsZW1lbnQsDQotCQkvLyBkb2N0eXBlLCB0ZXh0KQ0KLQkJSW5kZXhlZFJlZ2lvbiBpbm9kZSA9IG51bGw7DQotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7DQotCQl0cnkgew0KLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOw0KLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgew0KLQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7DQotCQkJCWlmIChpbm9kZSA9PSBudWxsKSB7DQotCQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCAtIDEpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJZmluYWxseSB7DQotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQ0KLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7DQotCQl9DQotDQotCQlpZiAoaW5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7DQotCQkJcmV0dXJuIChOb2RlKSBpbm9kZTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTIxNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBCZW5qYW1pbiBNdXNrYWxsYSwgYi5tdXNrYWxsYUBnbXgubmV0IC0gWzE1ODY2MF0gY2hhcmFjdGVyIGVudGl0aWVzIHNob3VsZCBoYXZlIHRoZWlyIG93biBzeW50YXggaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2UgICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgSFRNTCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgSFRNTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUNvbG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFRoZW1lTWFuYWdlcigpLmdldEN1cnJlbnRUaGVtZSgpLmdldENvbG9yUmVnaXN0cnkoKTsKLQkJCi0JCXN0b3JlLnNldERlZmF1bHQoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCAiPD0iKTsvLyROT04tTkxTLTEkCi0KLQkJLy8gSFRNTCBTdHlsZSBQcmVmZXJlbmNlcwotCQlTdHJpbmcgTk9CQUNLR1JPVU5EQk9MRCA9ICIgfCBudWxsIHwgZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBKVVNUSVRBTElDID0gIiB8IG51bGwgfCBmYWxzZSB8IHRydWUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgMTI3LCAwLCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUsIDQyLCAwLCAyNTUpICsgSlVTVElUQUxJQzsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMsIHN0eWxlVmFsdWUpOyAvLyBzcGVjaWZpZWQgdmFsdWUgaXMgYmxhY2s7IGxlYXZpbmcgYXMgd2lkZ2V0IGRlZmF1bHQKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCA2MywgOTUsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCA2MywgOTUsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIsIDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgMCwgMCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYsIDAsIDAsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELCAxMjgsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIDYzLCAxMjcsIDk1KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCwgc3R5bGVWYWx1ZSk7CS8vIHNwZWNpZmllZCB2YWx1ZSBpcyBibGFjazsgbGVhdmluZyBhcyB3aWRnZXQgZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUiwgMCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgNjMsIDEyNywgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgMCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5ULCBzdHlsZVZhbHVlKTsJLy8gc3BlY2lmaWVkIHZhbHVlIGlzIGJsYWNrOyBsZWF2aW5nIGFzIHdpZGdldCBkZWZhdWx0Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIsIDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhULCAwLCAwLCAwKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUiwgMTkxLCA5NSwgNjMpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFLCA0MiwgMCwgMjU1KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UsIHN0eWxlVmFsdWUpOwotCi0JCS8vIHNldCBkZWZhdWx0IG5ldyBodG1sIGZpbGUgdGVtcGxhdGUgdG8gdXNlIGluIG5ldyBmaWxlIHdpemFyZAotCQkvKgotCQkgKiBOZWVkIHRvIGZpbmQgdGVtcGxhdGUgbmFtZSB0aGF0IGdvZXMgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGlkIChuYW1lCi0JCSAqIG1heSBjaGFuZ2UgZm9yIGRpZmZlcm50IGxhbmd1YWdlKQotCQkgKi8KLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCkuZmluZFRlbXBsYXRlQnlJZCgib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJCi0JCS8vIERlZmF1bHRzIGZvciB0aGUgVHlwaW5nIHByZWZlcmVuY2UgcGFnZQotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfUkVNT1ZFX0VORF9UQUdTLCB0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxVSVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTljN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByZWZlcmVuY2Uga2V5cyBmb3IgSFRNTCBVSQotICovCi1wdWJsaWMgY2xhc3MgSFRNTFVJUHJlZmVyZW5jZU5hbWVzIHsKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiBjb2RlIGFzc2lzdCBnZXRzIGF1dG8gYWN0aXZhdGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRSA9IGdldEF1dG9Qcm9wb3NlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2UiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY2hhcmFjdGVycyB0aGF0IGF1dG8gYWN0aXZhdGUgY29kZQotCSAqIGFzc2lzdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEFsbCBjaGFyYWN0ZXJzIHRoYXQgdHJpZ2dlcgotCSAqIGF1dG8gY29kZSBhc3Npc3QuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRV9DT0RFID0gZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCkgewotCQlyZXR1cm4gImF1dG9Qcm9wb3NlQ29kZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gZ2V0VGVtcGxhdGVzS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcGxhdGVzS2V5KCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gbmV3IEhUTUwgZmlsZSB3aXphcmQuCi0JICogVGVtcGxhdGUgbmFtZSBpcyBzdG9yZWQgaW5zdGVhZCBvZiB0ZW1wbGF0ZSBpZCBiZWNhdXNlIHVzZXItY3JlYXRlZAotCSAqIHRlbXBsYXRlcyBkbyBub3QgaGF2ZSB0ZW1wbGF0ZSBpZHMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9URU1QTEFURV9OQU1FID0gIm5ld0ZpbGVUZW1wbGF0ZU5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvLWNvbXBsZXRpbmcgY29tbWVudHMgd2hpbGUKLQkgKiB0eXBpbmcuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTID0gImNvbXBsZXRlQ29tbWVudHMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvLWNvbXBsZXRpbmcgZW5kLXRhZ3MgYWZ0ZXIgZW50ZXJpbmcKLQkgKiA8Y29kZT4mbHQ7LzwvY29kZT4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MgPSAiY29tcGxldGVFbmRUYWdzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgcmVtb3ZpbmcgYW4gZW5kLXRhZyBpZiB0aGUgc3RhcnQgdGFnIGlzCi0JICogY29udmVydGVkIHRvIGFuIGVtcHR5LXRhZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfUkVNT1ZFX0VORF9UQUdTID0gInJlbW92ZUVuZFRhZ3MiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTdlYzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlNjcm9sbGVkUGFnZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuT3B0aW9uc0NvbmZpZ3VyYXRpb25CbG9jawotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgTGlzdCBmQ29tYm9zOwotCXByaXZhdGUgTGlzdCBmRXhwYW5kYWJsZXM7Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmU2VsZWN0aW9uTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZXNTZXJ2aWNlIGZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HU19FWFBBTkRFRCA9ICJleHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFZhbGlkYXRpb25GcmFtZXdvcmsgZlZhbGlkYXRpb247Ci0JCi0JcHJpdmF0ZSBjbGFzcyBDb21ib0RhdGEgewotCQlwcml2YXRlIFN0cmluZyBmS2V5OwotCQlwcml2YXRlIGludFtdIGZTZXZlcml0aWVzOwotCQlwcml2YXRlIGludCBmSW5kZXg7Ci0JCWludCBvcmlnaW5hbFNldmVyaXR5ID0gLTI7Ci0JCQotCQlwdWJsaWMgQ29tYm9EYXRhKFN0cmluZyBrZXksIGludFtdIHNldmVyaXRpZXMsIGludCBpbmRleCkgewotCQkJZktleSA9IGtleTsKLQkJCWZTZXZlcml0aWVzID0gc2V2ZXJpdGllczsKLQkJCWZJbmRleCA9IGluZGV4OwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJCXJldHVybiBmS2V5OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKLQkJCWZJbmRleCA9IGluZGV4OwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQkJcmV0dXJuIGZJbmRleDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFNldHMgdGhlIHNldmVyaXR5IGluZGV4IGJhc2VkIG9uIDxjb2RlPnNldmVyaXR5PC9jb2RlPi4KLQkJICogSWYgdGhlIHNldmVyaXR5IGRvZXNuJ3QgZXhpc3QsIHRoZSBpbmRleCBpcyBzZXQgdG8gLTEuCi0JCSAqIAotCQkgKiBAcGFyYW0gc2V2ZXJpdHkgdGhlIHNldmVyaXR5IGxldmVsCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpIHsKLQkJCWZvcihpbnQgaSA9IDA7IGZTZXZlcml0aWVzICE9IG51bGwgJiYgaSA8IGZTZXZlcml0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYoZlNldmVyaXRpZXNbaV0gPT0gc2V2ZXJpdHkpIHsKLQkJCQkJZkluZGV4ID0gaTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJZkluZGV4ID0gLTE7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCQlyZXR1cm4gKGZJbmRleCA+PSAwICYmIGZTZXZlcml0aWVzICE9IG51bGwgJiYgZkluZGV4IDwgZlNldmVyaXRpZXMubGVuZ3RoKSA/IGZTZXZlcml0aWVzW2ZJbmRleF0gOiAtMTsKLQkJfQotCQkKLQkJYm9vbGVhbiBpc0NoYW5nZWQoKSB7Ci0JCQlyZXR1cm4gZlNldmVyaXRpZXNbZkluZGV4XSAhPSBvcmlnaW5hbFNldmVyaXR5OwotCQl9Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDb21ib3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZFeHBhbmRhYmxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlmVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgQ29tYm8gd2lkZ2V0IGluIHRoZSBjb21wb3NpdGUgPGNvZGU+cGFyZW50PC9jb2RlPi4gVGhlIGRhdGEKLQkgKiBpbiB0aGUgQ29tYm8gaXMgYXNzb2NpYXRlZCB3aXRoIDxjb2RlPmtleTwvY29kZT4uIFRoZSBDb21ibyBkYXRhIGlzCi0JICogZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBpbnRlZ2VyIDxjb2RlPnZhbHVlczwvY29kZT4gd2hlcmUgdGhlIGluZGV4Ci0JICogb2YgPGNvZGU+dmFsdWVzPC9jb2RlPiBjb3JyZXNwb25kcyB0byB0aGUgaW5kZXggb2YgPGNvZGU+dmFsdWVMYWJlbHM8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29tcG9zaXRlIHRvIGNyZWF0ZSB0aGUgY29tYm8gYm94IGluCi0JICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCB0byBnaXZlIHRoZSBjb21ibyBib3gKLQkgKiBAcGFyYW0ga2V5IHRoZSB1bmlxdWUga2V5IHRvIGlkZW50aWZ5IHRoZSBjb21ibyBib3gKLQkgKiBAcGFyYW0gdmFsdWVzIHRoZSB2YWx1ZXMgcmVwcmVzZW50ZWQgYnkgdGhlIGNvbWJvIG9wdGlvbnMKLQkgKiBAcGFyYW0gdmFsdWVMYWJlbHMgdGhlIGNhbHVlcyBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSBpbmRlbnQgaG93IGZhciB0byBpbmRlbnQgdGhlIGNvbWJvIGJveCBsYWJlbAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCBjb21ibyBib3gKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gYWRkQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcga2V5LCBpbnRbXSB2YWx1ZXMsIFN0cmluZ1tdIHZhbHVlTGFiZWxzLCBpbnQgaW5kZW50KSB7Ci0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQ9IGluZGVudDsKLQkJCQkKLQkJTGFiZWwgbGFiZWxDb250cm9sPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsQ29udHJvbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWxhYmVsQ29udHJvbC5zZXRUZXh0KGxhYmVsKTsKLQkJbGFiZWxDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCQkJCQotCQlDb21ibyBjb21ib0JveD0gbmV3Q29tYm9Db250cm9sKHBhcmVudCwga2V5LCB2YWx1ZXMsIHZhbHVlTGFiZWxzKTsKLQkJY29tYm9Cb3guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJcmV0dXJuIGNvbWJvQm94OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm8gYm94IGFuZCBhc3NvY2lhdGVzIHRoZSBjb21ibyBkYXRhIHdpdGggdGhlCi0JICogY29tYm8gYm94LgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIGNvbXBvc2l0ZSB0byBjcmVhdGUgdGhlIGNvbWJvIGJveCBpbgotCSAqIEBwYXJhbSBrZXkgdGhlIHVuaXF1ZSBrZXkgdG8gaWRlbnRpZnkgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyByZXByZXNlbnRlZCBieSB0aGUgY29tYm8gb3B0aW9ucwotCSAqIEBwYXJhbSB2YWx1ZUxhYmVscyB0aGUgdmFsdWVzIGRpc3BsYXllZCBpbiB0aGUgY29tYm8gYm94Ci0JICogCi0JICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGNvbWJvIGJveAotCSAqLwotCXByb3RlY3RlZCBDb21ibyBuZXdDb21ib0NvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSwgU3RyaW5nIGtleSwgaW50W10gdmFsdWVzLCBTdHJpbmdbXSB2YWx1ZUxhYmVscykgewotCQlDb21ib0RhdGEgZGF0YSA9IG5ldyBDb21ib0RhdGEoa2V5LCB2YWx1ZXMsIC0xKTsKLQkJCi0JCUNvbWJvIGNvbWJvQm94PSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm9Cb3guc2V0SXRlbXModmFsdWVMYWJlbHMpOwotCQljb21ib0JveC5zZXREYXRhKGRhdGEpOwotCQljb21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJY29tYm9Cb3guc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQkJCi0JCW1ha2VTY3JvbGxhYmxlQ29tcG9zaXRlQXdhcmUoY29tYm9Cb3gpOwotCQkKLQkJaW50IHNldmVyaXR5ID0gLTE7Ci0JCWlmKGtleSAhPSBudWxsKQotCQkJc2V2ZXJpdHkgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldEludChnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpLCBrZXksIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcsIGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKSk7Ci0KLQkJaWYgKHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SIHx8IHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgfHwgc2V2ZXJpdHkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQlkYXRhLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQkJCWRhdGEub3JpZ2luYWxTZXZlcml0eSA9IHNldmVyaXR5OwotCQl9Ci0JCQotCQlpZihkYXRhLmdldEluZGV4KCkgPj0gMCkKLQkJCWNvbWJvQm94LnNlbGVjdChkYXRhLmdldEluZGV4KCkpOwotCQkKLQkJZkNvbWJvcy5hZGQoY29tYm9Cb3gpOwotCQlyZXR1cm4gY29tYm9Cb3g7Ci0JfQotCQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBnZXRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJaWYgKGZTZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmU2VsZWN0aW9uTGlzdGVuZXI9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWNvbnRyb2xDaGFuZ2VkKGUud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBmU2VsZWN0aW9uTGlzdGVuZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbnRyb2xDaGFuZ2VkKFdpZGdldCB3aWRnZXQpIHsKLQkJQ29tYm9EYXRhIGRhdGE9IChDb21ib0RhdGEpIHdpZGdldC5nZXREYXRhKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb21ibykgewotCQkJZGF0YS5zZXRJbmRleCgoKENvbWJvKXdpZGdldCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RTZXR0aW5nc1BhZ2Ujc3RvcmVWYWx1ZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlpZihmQ29tYm9zID09IG51bGwgfHwgZkNvbWJvcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJCi0JCUl0ZXJhdG9yIGl0ID0gZkNvbWJvcy5pdGVyYXRvcigpOwotCQkKLQkJSVNjb3BlQ29udGV4dFtdIGNvbnRleHRzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJQ29tYm9EYXRhIGRhdGEgPSAoQ29tYm9EYXRhKSAoKENvbWJvKWl0Lm5leHQoKSkuZ2V0RGF0YSgpOwotCQkJaWYoZGF0YS5nZXRLZXkoKSAhPSBudWxsKSB7Ci0JCQkJY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRJbnQoZGF0YS5nZXRLZXkoKSwgZGF0YS5nZXRTZXZlcml0eSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRleHRzW2ldLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZmx1c2goKTsKLQkJCX0KLQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBFeHBhbmRhYmxlQ29tcG9zaXRlIGdldFBhcmVudEV4cGFuZGFibGVDb21wb3NpdGUoQ29udHJvbCBjb250cm9sKSB7Ci0JCUNvbnRyb2wgcGFyZW50PSBjb250cm9sLmdldFBhcmVudCgpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBFeHBhbmRhYmxlQ29tcG9zaXRlKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50PSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEV4cGFuZGFibGVDb21wb3NpdGUpIHsKLQkJCXJldHVybiAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgRXhwYW5kYWJsZUNvbXBvc2l0ZSBjcmVhdGVTdHlsZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBpbnQgbkNvbHVtbnMpIHsKLQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleGNvbXBvc2l0ZT0gbmV3IEV4cGFuZGFibGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5DTElFTlRfSU5ERU5UKTsKLQkJZXhjb21wb3NpdGUuc2V0VGV4dChsYWJlbCk7Ci0JCWV4Y29tcG9zaXRlLnNldEV4cGFuZGVkKGZhbHNlKTsKLQkJZXhjb21wb3NpdGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKEpGYWNlUmVzb3VyY2VzLkRJQUxPR19GT05UKSk7Ci0JCWV4Y29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlLCBuQ29sdW1ucywgMSkpOwotCQlleGNvbXBvc2l0ZS5hZGRFeHBhbnNpb25MaXN0ZW5lcihuZXcgRXhwYW5zaW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKSB7Ci0JCQkJZXhwYW5kZWRTdGF0ZUNoYW5nZWQoKEV4cGFuZGFibGVDb21wb3NpdGUpIGUuZ2V0U291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJZkV4cGFuZGFibGVzLmFkZChleGNvbXBvc2l0ZSk7Ci0JCW1ha2VTY3JvbGxhYmxlQ29tcG9zaXRlQXdhcmUoZXhjb21wb3NpdGUpOwotCQlyZXR1cm4gZXhjb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGV4cGFuZGVkU3RhdGVDaGFuZ2VkKEV4cGFuZGFibGVDb21wb3NpdGUgZXhwYW5kYWJsZSkgewotCQlTY3JvbGxlZFBhZ2VDb250ZW50IHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlPSBnZXRQYXJlbnRTY3JvbGxlZENvbXBvc2l0ZShleHBhbmRhYmxlKTsKLQkJaWYgKHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXBhcmVudFNjcm9sbGVkQ29tcG9zaXRlLnJlZmxvdyh0cnVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbWFrZVNjcm9sbGFibGVDb21wb3NpdGVBd2FyZShDb250cm9sIGNvbnRyb2wpIHsKLQkJU2Nyb2xsZWRQYWdlQ29udGVudCBwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZT0gZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoY29udHJvbCk7Ci0JCWlmIChwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZS5hZGFwdENoaWxkKGNvbnRyb2wpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTY3JvbGxlZFBhZ2VDb250ZW50IGdldFBhcmVudFNjcm9sbGVkQ29tcG9zaXRlKENvbnRyb2wgY29udHJvbCkgewotCQlDb250cm9sIHBhcmVudD0gY29udHJvbC5nZXRQYXJlbnQoKTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQ29udGVudCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudD0gcGFyZW50LmdldFBhcmVudCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZFBhZ2VDb250ZW50KSB7Ci0JCQlyZXR1cm4gKFNjcm9sbGVkUGFnZUNvbnRlbnQpIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uKSB7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBmRXhwYW5kYWJsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUgY29tcCA9IChFeHBhbmRhYmxlQ29tcG9zaXRlKSBmRXhwYW5kYWJsZXMuZ2V0KGkpOwotCQkJc2VjdGlvbi5wdXQoU0VUVElOR1NfRVhQQU5ERUQgKyBTdHJpbmcudmFsdWVPZihpKSwgY29tcC5pc0V4cGFuZGVkKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgewotCQlmb3IgKGludCBpPSAwOyBpIDwgZkV4cGFuZGFibGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4Y29tcG9zaXRlPSAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZkV4cGFuZGFibGVzLmdldChpKTsKLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJZXhjb21wb3NpdGUuc2V0RXhwYW5kZWQoaSA9PSAwKTsgLy8gb25seSBleHBhbmQgdGhlIGZpcnN0IG5vZGUgYnkgZGVmYXVsdAotCQkJfSBlbHNlIHsKLQkJCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChzZXR0aW5ncy5nZXRCb29sZWFuKFNFVFRJTkdTX0VYUEFOREVEICsgU3RyaW5nLnZhbHVlT2YoaSkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXNldFNldmVyaXRpZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZGVmYXVsdENvbnRleHQgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKTsKLQkJZm9yKGludCBpID0gMDsgaSA8IGZDb21ib3Muc2l6ZSgpOyBpKyspIHsKLQkJCUNvbWJvRGF0YSBkYXRhID0gKENvbWJvRGF0YSkoKENvbWJvKWZDb21ib3MuZ2V0KGkpKS5nZXREYXRhKCk7Ci0JCQlpbnQgc2V2ZXJpdHkgPSBkZWZhdWx0Q29udGV4dC5nZXRJbnQoZGF0YS5nZXRLZXkoKSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCQlkYXRhLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQkJCSgoQ29tYm8pZkNvbWJvcy5nZXQoaSkpLnNlbGVjdChkYXRhLmdldEluZGV4KCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFJldmFsaWRhdGVPblNldHRpbmdzQ2hhbmdlKCkgewotCQlJdGVyYXRvciBpdCA9IGZDb21ib3MuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlDb21ib0RhdGEgZGF0YSA9IChDb21ib0RhdGEpICgoQ29tYm8pIGl0Lm5leHQoKSkuZ2V0RGF0YSgpOwotCQkJaWYgKGRhdGEuaXNDaGFuZ2VkKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWlmKHN1cGVyLnBlcmZvcm1PaygpICYmIHNob3VsZFJldmFsaWRhdGVPblNldHRpbmdzQ2hhbmdlKCkpIHsKLQkJCU1lc3NhZ2VCb3ggbWIgPSBuZXcgTWVzc2FnZUJveCh0aGlzLmdldFNoZWxsKCksIFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5ZRVMgfCBTV1QuTk8gfCBTV1QuQ0FOQ0VMIHwgU1dULklDT05fSU5GT1JNQVRJT04gfCBTV1QuUklHSFQpOwotCQkJbWIuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX1RpdGxlKTsKLQkJCS8qIENob29zZSB3aGljaCBtZXNzYWdlIHRvIHVzZSBiYXNlZCBvbiBpZiBpdHMgcHJvamVjdCBvciB3b3Jrc3BhY2Ugc2V0dGluZ3MgKi8KLQkJCVN0cmluZyBtc2cgPSAoZ2V0UHJvamVjdCgpID09IG51bGwpID8gSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9Xb3Jrc3BhY2UgOiBIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX1Byb2plY3Q7Ci0JCQltYi5zZXRNZXNzYWdlKG1zZyk7Ci0JCQlzd2l0Y2gobWIub3BlbigpKSB7Ci0JCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJY2FzZSBTV1QuWUVTOgotCQkJCQlWYWxpZGF0ZUpvYiBqb2IgPSBuZXcgVmFsaWRhdGVKb2IoSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9qb2JOYW1lKTsKLQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJY2FzZSBTV1QuTk86Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1zIHZhbGlkYXRpb24gYWZ0ZXIgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBoYXZlIGJlZW4gbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBWYWxpZGF0ZUpvYiBleHRlbmRzIEpvYiB7Ci0JCQotCQlwdWJsaWMgVmFsaWRhdGVKb2IoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gbnVsbDsKLQkJCQkvKiBDaGFuZ2VkIHByZWZlcmVuY2VzIGZvciBhIHNpbmdsZSBwcm9qZWN0LCBvbmx5IHZhbGlkYXRlIGl0ICovCi0JCQkJaWYoZ2V0UHJvamVjdCgpICE9IG51bGwpCi0JCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0W10ge2dldFByb2plY3QoKX07Ci0JCQkJLyogV29ya3NwYWNlLXdpZGUgcHJlZmVyZW5jZXMgY2hhbmdlZCAqLwotCQkJCWVsc2UgewotCQkJCQkvKiBHZXQgYWxsIG9mIHRoZSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlICovCi0JCQkJCXByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gbnVsbDsKLQkJCQkJTGlzdCBwcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCi0JCQkJCS8qIEZpbHRlciBvdXQgcHJvamVjdHMgdGhhdCB1c2UgcHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyBvciBoYXZlIGJlZW4gY2xvc2VkICovCi0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJcHJlZnMgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3RzW2ldKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQkJCQkJaWYocHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkgJiYgIXByZWZzLmdldEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZhbHNlKSkKLQkJCQkJCQlwcm9qZWN0TGlzdC5hZGQocHJvamVjdHNbaV0pOwotCQkJCQl9Ci0JCQkJCXByb2plY3RzID0gKElQcm9qZWN0W10pIHByb2plY3RMaXN0LnRvQXJyYXkobmV3IElQcm9qZWN0W3Byb2plY3RMaXN0LnNpemUoKV0pOwotCQkJCX0KLQkJCQlmVmFsaWRhdGlvbi52YWxpZGF0ZShwcm9qZWN0cywgdHJ1ZSwgZmFsc2UsIG1vbml0b3IpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzY2ExYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVtcHR5RmlsZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gSFRNTFVJTWVzc2FnZXMuRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2VfMDsgCi0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCS8vIHNvbWUgdGhlbWVzIG9uIEdUSyBoYXZlIGRpZmZlcmVudCBiYWNrZ3JvdW5kIGNvbG9ycyBmb3IgVGV4dCBhbmQgTGFiZWxzCi0JCXRleHQuc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLQkJdGV4dC5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgc2Nyb2xsYmFycyBmb3IgdGhpcyBwYXJlbnQgd2hlbiBuZWVkZWQKLQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHNjMSwgMSk7Ci0JCXNjMS5zZXRDb250ZW50KGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbm90IGNhbGxpbmcgc2V0U2l6ZSBmb3IgY29tcG9zaXRlIHdpbGwgcmVzdWx0IGluIGEgYmxhbmsgY29tcG9zaXRlLAotCQkvLyBzbyBjYWxsaW5nIGl0IGhlcmUgaW5pdGlhbGx5Ci0JCS8vIHNldFNpemUgYWN0dWFsbHkgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIGFsbCBjb250cm9scyBhcmUgY3JlYXRlZCwKLQkJLy8gc28gc2Nyb2xsZWRDb21wb3NpdGUKLQkJLy8gaGFzIGNvcnJlY3QgbWluU2l6ZQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBOb3RlOiBUaGUgZm9udCBpcyBzZXQgaGVyZSBpbiBhbnRpY2lwYXRpb24gdGhhdCB0aGUgY2xhc3MgaW5oZXJpdGluZwotCQkJLy8gICAgICAgdGhpcyBiYXNlIGNsYXNzIG1heSBhZGQgd2lkZ2V0cyB0byB0aGUgZGlhbG9nLiAgIHNldFNpemUKLQkJCS8vICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIGp1c3QgYmVmb3JlIHdlIGdvIGxpdmUuCi0JCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCVBvaW50IG1pblNpemUgPSBjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKG1pblNpemUpOwotCQkJLy8gc2V0IHNjcm9sbGJhciBjb21wb3NpdGUncyBtaW4gc2l6ZSBzbyBwYWdlIGlzIGV4cGFuZGFibGUgYnV0Ci0JCQkvLyBoYXMgc2Nyb2xsYmFycyB3aGVuIG5lZWRlZAotCQkJaWYgKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0JCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0JCQkJc2MxLnNldE1pblNpemUobWluU2l6ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTENvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTENvbG9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk5ZGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHlsZWRUZXh0Q29sb3JQaWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb2xvclBhZ2U7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb2xvclBhZ2UgZXh0ZW5kcyBYTUxDb2xvclBhZ2UgewotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JCUl0ZXJhdG9yIGkgPSBzdHlsZUxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZylpLm5leHQoKSkpOwkKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIEhUTUxVSU1lc3NhZ2VzLlNhbXBsZV9IVE1MX2RvYzsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXApIHsKLQotCQlpbml0Q29tbW9uQ29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCWluaXREb2NUeXBlQ29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCS8vIEZJWE1FOiB0aGVzZSB3ZXJlICJicnV0ZSBmb3JjZWQiIGNvbW1lbnRlZCBvdXQgd2hlbiBtb3ZpbmcgWE1MSlNQUmVnaW9uQ29udGV4dHMKLQkJLy8gZWZmZWN0IGlzIHVua25vd24sIGJ1dCB0aG91Z2h0IGp1c3QgdG8gZWZmZWN0IHByZWZlcmVuY2UgcGFnZQotCQkvL2NvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQkvL2NvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJLy9jb250ZXh0U3R5bGVNYXAucHV0KFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQkvL2NvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCi0JCWluaXRDb21tb25EZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJaW5pdERvY1R5cGVEZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0JCWluaXRDb21tb25TdHlsZUxpc3QobGlzdCk7Ci0JCWluaXREb2NUeXBlU3R5bGVMaXN0KGxpc3QpOwotCQkvLwlsaXN0LmFkZChIVE1MQ29sb3JNYW5hZ2VyLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlwaWNrZXIuc2V0UGFyc2VyKG1tYW5hZ2VyLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpLmdldFBhcnNlcigpKTsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb25zIGZvciBoaWxpZ2h0aW5nIHR5cGVzCi0JCURpY3Rpb25hcnkgZGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0KLQkJLy8gbWFwIHJlZ2lvbiB0eXBlcyB0byBoaWxpZ2h0aW5nIHR5cGVzCi0JCURpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCXBpY2tlci5zZXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJcGlja2VyLnNldERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlwaWNrZXIuc2V0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJLy8JdXBkYXRlUGlja2VyRm9udChwaWNrZXIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkhUTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RDb2xvclBhZ2Ujc2F2ZVByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDI2YWU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLldvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZTsKLQotcHVibGljIGNsYXNzIEhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBXb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5ncyBmSW5wdXRFbmNvZGluZ1NldHRpbmdzID0gbnVsbDsKLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBzY3JvbGxlZENvbXBvc2l0ZSA9IGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yQ3JlYXRpbmdHcm91cChzY3JvbGxlZENvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yTG9hZGluZ0dyb3VwKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNjcm9sbGVkQ29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuSFRNTF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCi0JCXNldFNpemUoc2Nyb2xsZWRDb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gc2Nyb2xsZWRDb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JMb2FkaW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMSk7Ci0JCWdyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMCk7Ci0KLQkJZklucHV0RW5jb2RpbmdTZXR0aW5ncyA9IG5ldyBXb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5ncyhncm91cCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZVZhbHVlcygpOwotCQlpbml0aWFsaXplVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VUKTsKLQotCQlmSW5wdXRFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoZW5jb2RpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckxvYWRpbmdHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCk7Ci0KLQkJZklucHV0RW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKGVuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJc3VwZXIuc3RvcmVWYWx1ZXMoKTsKLQkJc3RvcmVWYWx1ZXNGb3JMb2FkaW5nR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQsIGZJbnB1dEVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAocGFyZW50KTsKLQkJLy8gR3JvdXAgY3JlYXRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCS8vIGNyZWF0aW5nR3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlcyk7Ci0JCS8vCQkKLQkJLy8gLy8gRW5jb2RpbmcuLgotCQkvLyBMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKGNyZWF0aW5nR3JvdXAsCi0JCS8vIEhUTUxVSU1lc3NhZ2VzLkVuY29kaW5nX2Rlc2MpOwotCQkvLyAoKEdyaWREYXRhKWxhYmVsLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkvLyBmRW5jb2RpbmdTZXR0aW5ncyA9IG5ldyBFbmNvZGluZ1NldHRpbmdzKGNyZWF0aW5nR3JvdXApOwotCQkvLyAoKEdyaWREYXRhKWZFbmNvZGluZ1NldHRpbmdzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzEyMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgSFRNTFNvdXJjZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBCdXR0b24gZlRhZ05hbWVVcHBlciA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZlRhZ05hbWVMb3dlciA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZkF0dHJOYW1lVXBwZXIgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGZBdHRyTmFtZUxvd2VyID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgaW50IE1JTl9JTkRFTlRBVElPTl9TSVpFID0gMDsKLQlwcml2YXRlIGZpbmFsIGludCBNQVhfSU5ERU5UQVRJT05fU0laRSA9IDE2OwotCi0JLy8gQ29udGVudCBBc3Npc3QKLQlwcml2YXRlIEJ1dHRvbiBmQXV0b1Byb3Bvc2U7Ci0JcHJpdmF0ZSBMYWJlbCBmQXV0b1Byb3Bvc2VMYWJlbDsKLQlwcml2YXRlIFRleHQgZkF1dG9Qcm9wb3NlVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmQ2xlYXJBbGxCbGFua0xpbmVzOwotCi0JLy8gRm9ybWF0dGluZwotCXByaXZhdGUgVGV4dCBmTGluZVdpZHRoVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmU3BsaXRNdWx0aUF0dHJzOwotCXByaXZhdGUgQnV0dG9uIGZBbGlnbkVuZEJyYWNrZXQ7Ci0JcHJpdmF0ZSBCdXR0b24gZkluZGVudFVzaW5nVGFiczsKLQlwcml2YXRlIEJ1dHRvbiBmSW5kZW50VXNpbmdTcGFjZXM7Ci0JcHJpdmF0ZSBTcGlubmVyIGZJbmRlbnRhdGlvblNpemU7Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHNGb3JDb250ZW50QXNzaXN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBjb250ZW50QXNzaXN0R3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQljb250ZW50QXNzaXN0R3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5Db250ZW50X2Fzc2lzdF9VSV8pOwotCi0JCWZBdXRvUHJvcG9zZSA9IGNyZWF0ZUNoZWNrQm94KGNvbnRlbnRBc3Npc3RHcm91cCwgSFRNTFVJTWVzc2FnZXMuQXV0b21hdGljYWxseV9tYWtlX3N1Z2dlc3RfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkF1dG9Qcm9wb3NlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQXV0b1Byb3Bvc2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZkF1dG9Qcm9wb3NlTGFiZWwgPSBjcmVhdGVMYWJlbChjb250ZW50QXNzaXN0R3JvdXAsIEhUTUxVSU1lc3NhZ2VzLlByb21wdF93aGVuX3RoZXNlX2NoYXJhY3RlX1VJXyk7Ci0JCWZBdXRvUHJvcG9zZVRleHQgPSBjcmVhdGVUZXh0RmllbGQoY29udGVudEFzc2lzdEdyb3VwKTsKLQotCQkvLyBhZGQgb25lIG1vcmUgZ3JvdXAgb2YgcHJlZmVyZW5jZXMKLQkJY3JlYXRlQ29udGVudHNGb3JQcmVmZXJyZWRDYXNlR3JvdXAocGFyZW50LCAyKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb250ZW50c0ZvclByZWZlcnJlZENhc2VHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uU3BhbikgewotCQlHcm91cCBjYXNlR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIGNvbHVtblNwYW4pOwotCQljYXNlR3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5QcmVmZXJyZWRfbWFya3VwX2Nhc2VfVUlfKTsKLQotCQkvLyBkMjU3MDY0IG5lZWQgdG8gYXNzb2NpYXRlIGdyb3VwIHcvIHJhZGlvIGJ1dHRvbnMgc28gcmFkaW8gYnV0dG9ucwotCQkvLyBoZWFkZXIgY2FuIGJlIHJlYWQKLQkJR3JvdXAgdGFnTmFtZUdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJdGFnTmFtZUdyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVzX19VSV8pOwotCQlmVGFnTmFtZVVwcGVyID0gY3JlYXRlUmFkaW9CdXR0b24odGFnTmFtZUdyb3VwLCBIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZXNfVXBwZXJfY2FzZV9VSV8pOwotCQlmVGFnTmFtZUxvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24odGFnTmFtZUdyb3VwLCBIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZXNfTG93ZXJfY2FzZV9VSV8pOwotCi0JCS8vIGQyNTcwNjQgbmVlZCB0byBhc3NvY2lhdGUgZ3JvdXAgdy8gcmFkaW8gYnV0dG9ucyBzbyByYWRpbyBidXR0b25zCi0JCS8vIGhlYWRlciBjYW4gYmUgcmVhZAotCQlHcm91cCBhdHRyTmFtZUdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJYXR0ck5hbWVHcm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lc19fVUlfKTsKLQkJZkF0dHJOYW1lVXBwZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihhdHRyTmFtZUdyb3VwLCBIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZXNfVXBwZXJfY2FzZV9VSV8pOwotCQlmQXR0ck5hbWVMb3dlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKGF0dHJOYW1lR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lc19Mb3dlcl9jYXNlX1VJXyk7Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGZvcm1hdHRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWZvcm1hdHRpbmdHcm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkZvcm1hdHRpbmdfVUlfKTsKLQotCQljcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkxpbmVfd2lkdGhfX1VJXyk7Ci0JCWZMaW5lV2lkdGhUZXh0ID0gbmV3IFRleHQoZm9ybWF0dGluZ0dyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJZ0RhdGEud2lkdGhIaW50ID0gMjU7Ci0JCWZMaW5lV2lkdGhUZXh0LnNldExheW91dERhdGEoZ0RhdGEpOwotCQlmTGluZVdpZHRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCQlmU3BsaXRNdWx0aUF0dHJzID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBIVE1MVUlNZXNzYWdlcy5TcGxpdF9tdWx0aXBsZV9hdHRyaWJ1dGVzKTsKLQkJKChHcmlkRGF0YSkgZlNwbGl0TXVsdGlBdHRycy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkFsaWduRW5kQnJhY2tldCA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgSFRNTFVJTWVzc2FnZXMuQWxpZ25fZmluYWxfYnJhY2tldCk7Ci0JCSgoR3JpZERhdGEpIGZBbGlnbkVuZEJyYWNrZXQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkNsZWFyX2FsbF9ibGFua19saW5lc19VSV8pOwotCQkoKEdyaWREYXRhKSBmQ2xlYXJBbGxCbGFua0xpbmVzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCWZJbmRlbnRVc2luZ1RhYnMgPSBjcmVhdGVSYWRpb0J1dHRvbihmb3JtYXR0aW5nR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkluZGVudF91c2luZ190YWJzKTsKLQkJKChHcmlkRGF0YSkgZkluZGVudFVzaW5nVGFicy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlmSW5kZW50VXNpbmdTcGFjZXMgPSBjcmVhdGVSYWRpb0J1dHRvbihmb3JtYXR0aW5nR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkluZGVudF91c2luZ19zcGFjZXMpOwotCQkoKEdyaWREYXRhKSBmSW5kZW50VXNpbmdTcGFjZXMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJY3JlYXRlTGFiZWwoZm9ybWF0dGluZ0dyb3VwLCBIVE1MVUlNZXNzYWdlcy5JbmRlbnRhdGlvbl9zaXplKTsKLQkJZkluZGVudGF0aW9uU2l6ZSA9IG5ldyBTcGlubmVyKGZvcm1hdHRpbmdHcm91cCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0VG9vbFRpcFRleHQoSFRNTFVJTWVzc2FnZXMuSW5kZW50YXRpb25fc2l6ZV90aXApOwotCQlmSW5kZW50YXRpb25TaXplLnNldE1pbmltdW0oTUlOX0lOREVOVEFUSU9OX1NJWkUpOwotCQlmSW5kZW50YXRpb25TaXplLnNldE1heGltdW0oTUFYX0lOREVOVEFUSU9OX1NJWkUpOwotCQlmSW5kZW50YXRpb25TaXplLnNldEluY3JlbWVudCgxKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRQYWdlSW5jcmVtZW50KDQpOwotCQlmSW5kZW50YXRpb25TaXplLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJZlRhZ05hbWVVcHBlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmVGFnTmFtZUxvd2VyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWZBdHRyTmFtZVVwcGVyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmQXR0ck5hbWVMb3dlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQlwZXJmb3JtRGVmYXVsdHNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJcGVyZm9ybURlZmF1bHRzRm9yQ29udGVudEFzc2lzdEdyb3VwKCk7Ci0KLQkJdmFsaWRhdGVWYWx1ZXMoKTsKLQkJZW5hYmxlVmFsdWVzKCk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gQ29udGVudCBBc3Npc3QKLQkJZkF1dG9Qcm9wb3NlLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFKSk7Ci0JCWZBdXRvUHJvcG9zZVRleHQuc2V0VGV4dChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0U3RyaW5nKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJZkxpbmVXaWR0aFRleHQuc2V0VGV4dChnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCWZTcGxpdE11bHRpQXR0cnMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQlmQWxpZ25FbmRCcmFja2V0LnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWZUYWdOYW1lVXBwZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmVGFnTmFtZUxvd2VyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZkF0dHJOYW1lVXBwZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZkF0dHJOYW1lTG93ZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQlpbml0aWFsaXplVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JDb250ZW50QXNzaXN0R3JvdXAoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gQ29udGVudCBBc3Npc3QKLQkJZkF1dG9Qcm9wb3NlLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UpKTsKLQkJZkF1dG9Qcm9wb3NlVGV4dC5zZXRUZXh0KGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQlmU3BsaXRNdWx0aUF0dHJzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQlmQWxpZ25FbmRCcmFja2V0LnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQlmQ2xlYXJBbGxCbGFua0xpbmVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQlpZiAoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQotCQlmSW5kZW50YXRpb25TaXplLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJaWYgKGZUYWdOYW1lVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQllbHNlCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlpZiAoZkF0dHJOYW1lVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZWxzZQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0KLQkJc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJc3RvcmVWYWx1ZXNGb3JDb250ZW50QXNzaXN0R3JvdXAoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXNGb3JDb250ZW50QXNzaXN0R3JvdXAoKSB7Ci0JCS8vIENvbnRlbnQgQXNzaXN0Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIGZBdXRvUHJvcG9zZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSwgZkF1dG9Qcm9wb3NlVGV4dC5nZXRUZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgZkxpbmVXaWR0aFRleHQuZ2V0VGV4dCgpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTLCBmU3BsaXRNdWx0aUF0dHJzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VULCBmQWxpZ25FbmRCcmFja2V0LmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUywgZkNsZWFyQWxsQmxhbmtMaW5lcy5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGZJbmRlbnRVc2luZ1RhYnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQl9Ci0JCWVsc2UgewotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFKTsKLQkJfQotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSwgZkluZGVudGF0aW9uU2l6ZS5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCi0JCWRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gVUkKLQkJSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLkhUTUxfUFJFRldFQlhfU09VUkNFX0hFTFBJRCk7Ci0KLQkJbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiLCBIVE1MVUlNZXNzYWdlcy5fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCkuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmhpbnQoMTUwLCBTV1QuREVGQVVMVCkuY3JlYXRlKCkpOwotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3Rvcnkuc3d0RGVmYXVsdHMoKS5jcmVhdGUoKSk7Ci0KLQkJY3JlYXRlQ29udGVudHNGb3JGb3JtYXR0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JDb250ZW50QXNzaXN0R3JvdXAoY29tcG9zaXRlKTsKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVZhbHVlcygpIHsKLQkJaWYgKGZBdXRvUHJvcG9zZSAhPSBudWxsKSB7Ci0JCQlpZiAoZkF1dG9Qcm9wb3NlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZkF1dG9Qcm9wb3NlTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQXV0b1Byb3Bvc2VMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gaXNFcnJvciA9IGZhbHNlOwotCQlTdHJpbmcgd2lkdGhUZXh0ID0gbnVsbDsKLQotCQlpZiAoZkxpbmVXaWR0aFRleHQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl3aWR0aFRleHQgPSBmTGluZVdpZHRoVGV4dC5nZXRUZXh0KCk7Ci0JCQkJaW50IGZvcm1hdHRpbmdMaW5lV2lkdGggPSBJbnRlZ2VyLnBhcnNlSW50KHdpZHRoVGV4dCk7Ci0JCQkJaWYgKChmb3JtYXR0aW5nTGluZVdpZHRoIDwgV0lEVEhfVkFMSURBVElPTl9MT1dFUl9MSU1JVCkgfHwgKGZvcm1hdHRpbmdMaW5lV2lkdGggPiBXSURUSF9WQUxJREFUSU9OX1VQUEVSX0xJTUlUKSkgewotCQkJCQl0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmV4YykgewotCQkJCXNldEludmFsaWRJbnB1dE1lc3NhZ2Uod2lkdGhUZXh0KTsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJaXNFcnJvciA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpbnQgaW5kZW50U2l6ZSA9IDA7Ci0JCWlmIChmSW5kZW50YXRpb25TaXplICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaW5kZW50U2l6ZSA9IGZJbmRlbnRhdGlvblNpemUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChpbmRlbnRTaXplIDwgTUlOX0lOREVOVEFUSU9OX1NJWkUpIHx8IChpbmRlbnRTaXplID4gTUFYX0lOREVOVEFUSU9OX1NJWkUpKSB7Ci0JCQkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZXhjKSB7Ci0JCQkJc2V0SW52YWxpZElucHV0TWVzc2FnZShJbnRlZ2VyLnRvU3RyaW5nKGluZGVudFNpemUpKTsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJaXNFcnJvciA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWlzRXJyb3IpIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXNldFZhbGlkKHRydWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxTeW50YXhDb2xvcmluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2ODJjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEEgcHJlZmVyZW5jZSBwYWdlIHRvIGNvbmZpZ3VyZSBvdXIgWE1MIHN5bnRheCBjb2xvci4gSXQgcmVzZW1ibGVzIHRoZSBKRFQKLSAqIGFuZCBDRFQgcGFnZXMgZmFyIG1vcmUgdGhhbiBvdXIgb3JpZ2luYWwgY29sb3IgcGFnZSB3aGlsZSByZXRhaW5pbmcgdGhlCi0gKiBleHRyYSAiY2xpY2stdG8tZmluZCIgZnVuY3Rpb25hbGl0eS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEhUTUxTeW50YXhDb2xvcmluZ1BhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQm9sZDsKLQlwcml2YXRlIExhYmVsIGZGb3JlZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBmQmFja2dyb3VuZExhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZDbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGZDb250ZXh0VG9TdHlsZU1hcDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gZkl0YWxpYzsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmU3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlN0eWxlVG9EZXNjcmlwdGlvbk1hcDsKLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVuZGVybGluZTsKLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBmRGVmYXVsdEZvcmVncm91bmQ7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSBmRGVmYXVsdEJhY2tncm91bmQ7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkhUTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0KLQkJTGluayBsaW5rID0gbmV3IExpbmsocGFnZUNvbXBvbmVudCwgU1dULldSQVApOwotCQlsaW5rLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ19MaW5rKTsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKHBhcmVudC5nZXRTaGVsbCgpLCBlLnRleHQsIG51bGwsIG51bGwpOwotCQkJfQotCQl9KTsKLQotCQlHcmlkRGF0YSBsaW5rRGF0YT0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxpbmtEYXRhLndpZHRoSGludD0gMTUwOyAvLyBvbmx5IGV4cGFuZCBmdXJ0aGVyIGlmIGFueW9uZSBlbHNlIHJlcXVpcmVzIGl0Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShsaW5rRGF0YSk7Ci0KLQkJbmV3IExhYmVsKHBhZ2VDb21wb25lbnQsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJbmV3IExhYmVsKHBhZ2VDb21wb25lbnQsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlTYXNoRm9ybSBlZGl0b3IgPSBuZXcgU2FzaEZvcm0ocGFnZUNvbXBvbmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWVkaXRvci5zZXRMYXlvdXREYXRhKGdyaWREYXRhMik7Ci0JCVNhc2hGb3JtIHRvcCA9IG5ldyBTYXNoRm9ybShlZGl0b3IsIFNXVC5IT1JJWk9OVEFMKTsKLQkJQ29tcG9zaXRlIHN0eWxlRWRpdG9yID0gY3JlYXRlQ29tcG9zaXRlKHRvcCwgMSk7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpblJpZ2h0ID0gNTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDA7Ci0JCWNyZWF0ZUxhYmVsKHN0eWxlRWRpdG9yLCBIVE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMCk7Ci0JCWZTdHlsZXNWaWV3ZXIgPSBjcmVhdGVTdHlsZXNWaWV3ZXIoc3R5bGVFZGl0b3IpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IE1hdGgubWF4KGdyaWREYXRhLndpZHRoSGludCwgY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpLmxlbmd0aCgpKSk7Ci0JCX0KLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWZTdHlsZXNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbXBvc2l0ZSBlZGl0aW5nQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvcCwgMSk7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSA1OwotCQljcmVhdGVMYWJlbChlZGl0aW5nQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnV0dG9uIGVuYWJsZXIgPSBjcmVhdGVDaGVja2JveChlZGl0aW5nQ29tcG9zaXRlLCBIVE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMik7Ci0JCWVuYWJsZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVuYWJsZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlDb21wb3NpdGUgZWRpdENvbnRyb2xzID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRpbmdDb21wb3NpdGUsIDIpOwotCQkoKEdyaWRMYXlvdXQpIGVkaXRDb250cm9scy5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDIwOwotCi0JCWZGb3JlZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuRm9yZWdyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmRm9yZWdyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkZvcmVncm91bmRDb2xvciA9IGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmRm9yZWdyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuQmFja2dyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQmFja2dyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkJhY2tncm91bmRDb2xvciA9IGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmQmFja2dyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBIVE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMyk7Ci0JCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmQm9sZC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkl0YWxpYyA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgSFRNTFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzQpOwotCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmSXRhbGljLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmU3RyaWtlID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBIVE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNSk7Ci0JCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZTdHJpa2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZVbmRlcmxpbmUgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIEhUTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV82KTsKLQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZlVuZGVybGluZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkNsZWFyU3R5bGUgPSBuZXcgQnV0dG9uKGVkaXRpbmdDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZkNsZWFyU3R5bGUuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlJlc3RvcmVfRGVmYXVsdF9VSV8pOyAvLyROT04tTkxTLTEkID0gIlJlc3RvcmUgRGVmYXVsdCIKLQkJZkNsZWFyU3R5bGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORykpOwotCQkoKEdyaWREYXRhKWZDbGVhclN0eWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgc2FtcGxlQXJlYSA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0b3IsIDEpOwotCi0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gNTsKLQkJY3JlYXRlTGFiZWwoc2FtcGxlQXJlYSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihzYW1wbGVBcmVhLCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YTMgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEzLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWdyaWREYXRhMy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZ3JpZERhdGEzLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTMpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihnZXRUZXh0S2V5TGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkTW91c2VMaXN0ZW5lcihnZXRUZXh0TW91c2VMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihnZXRUcmF2ZXJzZUxpc3RlbmVyKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZUZXh0LCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOwotCQlmRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpOwotCQlmRG9jdW1lbnQuc2V0KGdldEV4YW1wbGVUZXh0KCkpOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZkRvY3VtZW50KTsKLQotCQl0b3Auc2V0V2VpZ2h0cyhuZXcgaW50W117MSwgMX0pOwotCQllZGl0b3Iuc2V0V2VpZ2h0cyhuZXcgaW50W117MSwgMX0pOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsIElIZWxwQ29udGV4dElkcy5IVE1MX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCWZTdHlsZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpKTsKLQotCQlhcHBseVN0eWxlcygpOwotCi0JCWZTdHlsZXNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1swXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1swXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1sxXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1syXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkl0YWxpYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZTdHJpa2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1s0XTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZlN0cmlrZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s0XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmVW5kZXJsaW5lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNV07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZVbmRlcmxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlmQ2xlYXJTdHlsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybjsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VG9EZWZhdWx0KG5hbWVkU3R5bGUpOwotCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsYWJlbC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIExhYmVsIGNyZWF0ZURlc2NyaXB0aW9uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByaXZhdGUgT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSXRlcmF0b3IgaSA9IGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgTGlzdCB2aWV3ZXIgd2hlcmUgd2Ugc2VlIHRoZSB2YXJpb3VzIHN5bnRheCBlbGVtZW50IGRpc3BsYXkKLQkgKiBuYW1lcy0td291bGQgaXQgZXZlciBiZSBhIFRyZWUgbGlrZSBKRFQncz8KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciBjcmVhdGVTdHlsZXNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJ1Y3R1cmVkVmlld2VyIHN0eWxlc1ZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZXNWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcihDb2xsYXRvci5nZXRJbnN0YW5jZSgpKSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJT2JqZWN0IGRlc2NyaXB0aW9uID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkJCXJldHVybiBkZXNjcmlwdGlvbi50b1N0cmluZygpOwotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9KTsKLQkJc3R5bGVzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpLnRvQXJyYXkoKTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gc3R5bGVzVmlld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCWZPdmVybGF5U3RvcmUuc3RvcCgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBIVE1MVUlNZXNzYWdlcy5TYW1wbGVfSFRNTF9kb2M7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwotCQllbHNlIGlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldCgwKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiAhZG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgdGhlIElUZXh0UmVnaW9uJ3MgQ29udGV4dCBhdCB0aGlzIG9mZnNldAotCQkJSVRleHRSZWdpb24gaW50ZXJlc3QgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGludGVyZXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAob2Zmc2V0ID4gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChpbnRlcmVzdCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgcmVnaW9uQ29udGV4dCA9IGludGVyZXN0LmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25Db250ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyBmaW5kIHRoZSBuYW1lZCBzdHlsZSAoaW50ZXJuYWwvc2VsZWN0YWJsZSBuYW1lKSBmb3IgdGhhdAotCQkJLy8gY29udGV4dAotCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBnZXRPdmVybGF5U3RvcmUoKSB7Ci0JCXJldHVybiBmT3ZlcmxheVN0b3JlOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkgewotCQlpZiAoZlN0eWxlUHJlZmVyZW5jZUtleXMgPT0gbnVsbCkgewotCQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLS8vCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLS8vCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0vLwkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0vLwkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQkJZlN0eWxlUHJlZmVyZW5jZUtleXMgPSBzdHlsZXM7Ci0JCX0KLQkJcmV0dXJuIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCX0KLQotCXByaXZhdGUgS2V5TGlzdGVuZXIgZ2V0VGV4dEtleUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBnZXRUZXh0TW91c2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciBnZXRUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyI2tleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpZiAoKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgfHwgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpKQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQlzZXREZXNjcmlwdGlvbihTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0Rlc2NyaXB0aW9uKTsKLQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCk7Ci0JCWluaXRSZWdpb25Db250ZXh0VG9TdHlsZU1hcCgpOwotCi0JCWZPdmVybGF5U3RvcmUgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpKTsKLQkJZk92ZXJsYXlTdG9yZS5sb2FkKCk7Ci0JCWZPdmVybGF5U3RvcmUuc3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCkgewotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFLCBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BFX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTF9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU0sIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQotLy8JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0vLwkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5ULCBJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0vLwkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLS8vCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLS8vCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFN0eWxlVG9EZXNjcmlwdGlvbk1hcCgpIHsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfRGVsaW1pdGVyc19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQsIFhNTFVJTWVzc2FnZXMuQ29tbWVudF9Db250ZW50X1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIFhNTFVJTWVzc2FnZXMuVGFnX0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIFhNTFVJTWVzc2FnZXMuVGFnX05hbWVzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfTmFtZXNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfVmFsdWVzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkRlY2xhcmF0aW9uX0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQsIFhNTFVJTWVzc2FnZXMuQ29udGVudF9VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFLCBYTUxVSU1lc3NhZ2VzLkVudGl0eV9SZWZlcmVuY2VfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJFbnRpdHkgUmVmZXJlbmNlcyIKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX05hbWVfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1NZU1RFTV9QVUJMSUNfS2V5d19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1B1YmxpY19SZWZlcmVuY2VfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9TeXN0ZW1fUmVmZXJlbmNlX1VJXyk7IC8vID0KLS8vCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLlByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fRGVsX1VJXyk7Ci0vLwkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQsIFhNTFVJTWVzc2FnZXMuUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9Db25fVUlfX1VJXyk7Ci0vLwkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5DREFUQV9EZWxpbWl0ZXJzX1VJXyk7Ci0vLwkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQsIFhNTFVJTWVzc2FnZXMuQ0RBVEFfQ29udGVudF9VSV8pOwotfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkubG9hZERlZmF1bHRzKCk7Ci0JCWFwcGx5U3R5bGVzKCk7Ci0JCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQlhY3RpdmF0ZShudWxsKTsKLQkJZlRleHQucmVkcmF3KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlnZXRPdmVybGF5U3RvcmUoKS5wcm9wYWdhdGUoKTsKLQotCQlIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RDb2xvckF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBnZXROYW1lZFN0eWxlQXRPZmZzZXQob2Zmc2V0KTsKLQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZWRTdHlsZSkpOwotCQkJZlN0eWxlc1ZpZXdlci5yZXZlYWwobmFtZWRTdHlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJfQotCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWZpY2FsbHkgc2V0IHRoZSByZXBvcnRpbmcgbmFtZSBvZiBhIGNvbnRyb2wgZm9yIGFjY2Vzc2liaWxpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWNjZXNzaWJsZShDb250cm9sIGNvbnRyb2wsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIFN0cmluZyBuID0gbmFtZTsKLQkJY29udHJvbC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpCi0JCQkJCWUucmVzdWx0ID0gbjsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZDBjODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgSFRNTCB0ZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEhUTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0JCWNsYXNzIEhUTUxFZGl0VGVtcGxhdGVEaWFsb2cgZXh0ZW5kcyBFZGl0VGVtcGxhdGVEaWFsb2cgewotCQlwdWJsaWMgSFRNTEVkaXRUZW1wbGF0ZURpYWxvZyhTaGVsbCBwYXJlbnQsIFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSwgQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSkgewotCQkJc3VwZXIocGFyZW50LCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgcmVnaXN0cnkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpOwotCi0JCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29udGVudEFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0JCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvQWN0aXZhdGlvbih0cnVlKTsKLQkJCQkJYXNzaXN0YW50LmVuYWJsZUF1dG9JbnNlcnQodHJ1ZSk7Ci0JCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGdldFRlbXBsYXRlUHJvY2Vzc29yKCksIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7Ci0JCQkJCXJldHVybiBhc3Npc3RhbnQ7Ci0JCQkJfQotCQkJfTsKLQkJCXJldHVybiBkb0NyZWF0ZVZpZXdlcihwYXJlbnQsIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIEhUTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlIVE1MVUlQbHVnaW4gaHRtbEVkaXRvclBsdWdpbiA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoaHRtbEVkaXRvclBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldFRlbXBsYXRlU3RvcmUoaHRtbEVkaXRvclBsdWdpbi5nZXRUZW1wbGF0ZVN0b3JlKCkpOwotCQlzZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KGh0bWxFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAJICBib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0gIAkgIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JICByZXR1cm4gb2s7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpIHsKLQkJLy8gdGVtcGxhdGUgZm9ybWF0dGluZyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQ29udGVudHMoYW5jZXN0b3IpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5IVE1MX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2NyZWF0ZVZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gZG9DcmVhdGVWaWV3ZXIocGFyZW50LCBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQl9Ci0KLQlTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiB2aWV3ZXJDb25maWd1cmF0aW9uKSB7Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTDsKLQkJdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlEKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXQgZGlhbG9nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCi0JICogYSBjdXN0b20gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZQotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGJlaW5nIGVkaXRlZAotCSAqIEBwYXJhbSBlZGl0Ci0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBkaWFsb2cgc2hvdWxkIGJlIGVkaXRhYmxlCi0JICogQHBhcmFtIGlzTmFtZU1vZGlmaWFibGUKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRlbXBsYXRlIG5hbWUgbWF5IGJlIG1vZGlmaWVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBvciBtb2RpZmllZCB0ZW1wbGF0ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBlZGl0aW9uIGZhaWxlZAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcGxhdGUgZWRpdFRlbXBsYXRlKFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSkgewotCQlFZGl0VGVtcGxhdGVEaWFsb2cgZGlhbG9nID0gbmV3IEhUTUxFZGl0VGVtcGxhdGVEaWFsb2coZ2V0U2hlbGwoKSwgdGVtcGxhdGUsIGVkaXQsIGlzTmFtZU1vZGlmaWFibGUsIGdldENvbnRleHRUeXBlUmVnaXN0cnkoKSk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIGRpYWxvZy5nZXRUZW1wbGF0ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxUeXBpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFR5cGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTA2NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFR5cGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgSFRNTFR5cGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQ2xvc2VDb21tZW50OwotCXByaXZhdGUgQnV0dG9uIGZDbG9zZUVuZFRhZzsKLQlwcml2YXRlIEJ1dHRvbiBmUmVtb3ZlRW5kVGFnOwotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQkKLQkJY3JlYXRlQXV0b0NvbXBsZXRlKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUF1dG9SZW1vdmUoY29tcG9zaXRlKTsKLQkJCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXV0b0NvbXBsZXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQkKLQkJZ3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5IVE1MVHlwaW5nX0F1dG9fQ29tcGxldGUpOwotCQkKLQkJZkNsb3NlQ29tbWVudCA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBIVE1MVUlNZXNzYWdlcy5IVE1MVHlwaW5nX0NvbXBsZXRlX0NvbW1lbnRzKTsKLQkJKChHcmlkRGF0YSkgZkNsb3NlQ29tbWVudC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCWZDbG9zZUVuZFRhZyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBIVE1MVUlNZXNzYWdlcy5IVE1MVHlwaW5nX0NvbXBsZXRlX0VuZF9UYWdzKTsKLQkJKChHcmlkRGF0YSkgZkNsb3NlRW5kVGFnLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUF1dG9SZW1vdmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCQotCQlncm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkhUTUxUeXBpbmdfQXV0b19SZW1vdmUpOwotCQkKLQkJZlJlbW92ZUVuZFRhZyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBIVE1MVUlNZXNzYWdlcy5IVE1MVHlwaW5nX1JlbW92ZV9FbmRfVGFncyk7Ci0JCSgoR3JpZERhdGEpIGZSZW1vdmVFbmRUYWcuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJCi0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0Q2hlY2tib3goZkNsb3NlQ29tbWVudCwgSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9DT01NRU5UUyk7Ci0JCWluaXRDaGVja2JveChmQ2xvc2VFbmRUYWcsIEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MpOwotCQlpbml0Q2hlY2tib3goZlJlbW92ZUVuZFRhZywgSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWRlZmF1bHRDaGVja2JveChmQ2xvc2VDb21tZW50LCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTKTsKLQkJZGVmYXVsdENoZWNrYm94KGZDbG9zZUVuZFRhZywgSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTkRfVEFHUyk7Ci0JCWRlZmF1bHRDaGVja2JveChmUmVtb3ZlRW5kVGFnLCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX1JFTU9WRV9FTkRfVEFHUyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0Q2hlY2tib3goQnV0dG9uIGJveCwgU3RyaW5nIGtleSkgewotCQlpZihib3ggIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCkKLQkJCWJveC5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihrZXkpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlZmF1bHRDaGVja2JveChCdXR0b24gYm94LCBTdHJpbmcga2V5KSB7Ci0JCWlmKGJveCAhPSBudWxsICYmIGtleSAhPSBudWxsKQotCQkJYm94LnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihrZXkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMsIChmQ2xvc2VDb21tZW50ICE9IG51bGwpID8gZkNsb3NlQ29tbWVudC5nZXRTZWxlY3Rpb24oKSA6IGZhbHNlKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTkRfVEFHUywgKGZDbG9zZUVuZFRhZyAhPSBudWxsKSA/IGZDbG9zZUVuZFRhZy5nZXRTZWxlY3Rpb24oKSA6IGZhbHNlKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MsIChmUmVtb3ZlRW5kVGFnICE9IG51bGwpID8gZlJlbW92ZUVuZFRhZy5nZXRTZWxlY3Rpb24oKSA6IGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2EyZDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlNjcm9sbGVkUGFnZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBpeGVsQ29udmVydGVyOwotCi1wdWJsaWMgY2xhc3MgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gU0VWRVJJVElFUyA9IHtWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORywgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVElOR1NfU0VDVElPTl9OQU1FID0gIkhUTUxWYWxpZGF0aW9uU2V2ZXJpdGllcyI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwcml2YXRlIFBpeGVsQ29udmVydGVyIGZQaXhlbENvbnZlcnRlcjsKLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBwYWdlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJcGFnZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWZQaXhlbENvbnZlcnRlciA9IG5ldyBQaXhlbENvbnZlcnRlcihwYXJlbnQpOwotCQkKLQkJZmluYWwgQ29tcG9zaXRlIGNvbnRlbnQgPSBjcmVhdGVWYWxpZGF0aW9uU2VjdGlvbihwYWdlKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YT0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gZlBpeGVsQ29udmVydGVyLmNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMjApOwotCQljb250ZW50LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVZhbGlkYXRpb25TZWN0aW9uKENvbXBvc2l0ZSBwYWdlKSB7Ci0JCWludCBuQ29sdW1ucyA9IDM7Ci0JCQotCQlmaW5hbCBTY3JvbGxlZFBhZ2VDb250ZW50IHNwQ29udGVudCA9IG5ldyBTY3JvbGxlZFBhZ2VDb250ZW50KHBhZ2UpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHNwQ29udGVudC5nZXRCb2R5KCk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQobkNvbHVtbnMsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodD0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlMYWJlbCBkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX2Rlc2NyaXB0aW9uKTsKLQkJZGVzY3JpcHRpb24uc2V0Rm9udChwYWdlLmdldEZvbnQoKSk7Ci0KLQkJCi0JCUV4cGFuZGFibGVDb21wb3NpdGUgZWM7Ci0JCUNvbXBvc2l0ZSBpbm5lcjsKLQkJU3RyaW5nIGxhYmVsOwotCQkKLQkJU3RyaW5nW10gZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwgPSBuZXcgU3RyaW5nW10geyBIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX0Vycm9yLCBIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX1dhcm5pbmcsIEhUTUxVSU1lc3NhZ2VzLlZhbGlkYXRpb25fSWdub3JlIH07Ci0JCQotCQkvLyBFbGVtZW50IHNlY3Rpb24KLQkJCi0JCWVjID0gY3JlYXRlU3R5bGVTZWN0aW9uKGNvbXBvc2l0ZSwgSFRNTFVJTWVzc2FnZXMuRXhwYW5kYWJsZV9sYWJlbF9lbGVtZW50cywgbkNvbHVtbnMpOwotCQkKLQkJaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGVjLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCWlubmVyLnNldExheW91dChuZXcgR3JpZExheW91dChuQ29sdW1ucywgZmFsc2UpKTsKLQkJZWMuc2V0Q2xpZW50KGlubmVyKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV84OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5LTk9XTl9OQU1FLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfOTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfTkFNRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzEwOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fU1RBUlRfSU5WQUxJRF9DQVNFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTE7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9FTkRfSU5WQUxJRF9DQVNFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTI7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9NSVNTSU5HX1NUQVJULCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTM7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9NSVNTSU5HX0VORCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE0OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5ORUNFU1NBUllfRU5ELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTU7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX0RJUkVDVElWRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE2OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fSU5WQUxJRF9DT05URU5ULCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTc7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9EVVBMSUNBVEUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xODsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0NPRVhJU1RFTkNFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTk7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTkNMT1NFRF9TVEFSVF9UQUcsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yMDsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1VOQ0xPU0VEX0VORF9UQUcsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yMTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfRU1QVFlfVEFHLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCS8vIEVuZCBFbGVtZW50IFNlY3Rpb24KLQkJCi0JCS8vIFRoZSBBdHRyaWJ1dGUgdmFsaWRhdGlvbiBzZWN0aW9uCi0JCQotCQllYyA9IGNyZWF0ZVN0eWxlU2VjdGlvbihjb21wb3NpdGUsIEhUTUxVSU1lc3NhZ2VzLkV4cGFuZGFibGVfbGFiZWxfYXR0cmlidXRlcywgbkNvbHVtbnMpOwotCQlpbm5lciA9IG5ldyBDb21wb3NpdGUoZWMsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQllYy5zZXRDbGllbnQoaW5uZXIpOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzA7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1VOREVGSU5FRF9OQU1FLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVU5ERUZJTkVEX1ZBTFVFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfTkFNRV9NSVNNQVRDSCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzM7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0lOVkFMSURfTkFNRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzQ7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0lOVkFMSURfVkFMVUUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV81OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9EVVBMSUNBVEUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV82OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9WQUxVRV9NSVNNQVRDSCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzc7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1ZBTFVFX1VOQ0xPU0VELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzU7Ci0JCS8vIFRPRE86IHZhbGlkYXRlIHJlc291cmNlcz8KLQkJLy8gYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVkFMVUVfUkVTT1VSQ0VfTk9UX0ZPVU5ELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0KLQkJLy8gRW5kIEF0dHJpYnV0ZSBzZWN0aW9uCi0JCQotCQkKLQkJLy8gRG9jdW1lbnQgVHlwZQotCQllYyA9IGNyZWF0ZVN0eWxlU2VjdGlvbihjb21wb3NpdGUsIEhUTUxVSU1lc3NhZ2VzLkV4cGFuZGFibGVfbGFiZWxfZG9jdW1lbnRfdHlwZSwgbkNvbHVtbnMpOwotCQkKLQkJaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGVjLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCWlubmVyLnNldExheW91dChuZXcgR3JpZExheW91dChuQ29sdW1ucywgZmFsc2UpKTsKLQkJZWMuc2V0Q2xpZW50KGlubmVyKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yMjsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfRFVQTElDQVRFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjM7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRE9DX0lOVkFMSURfQ09OVEVOVCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI0OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRPQ19ET0NUWVBFX1VOQ0xPU0VELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQkvLyBFbmQgRG9jdW1lbnQgVHlwZQotCQkKLQkJLy8gQ29tbWVudHMKLQkJZWMgPSBjcmVhdGVTdHlsZVNlY3Rpb24oY29tcG9zaXRlLCBIVE1MVUlNZXNzYWdlcy5FeHBhbmRhYmxlX2xhYmVsX2NvbW1lbnQsIG5Db2x1bW5zKTsKLQkJCi0JCWlubmVyID0gbmV3IENvbXBvc2l0ZShlYywgU1dULk5PTkUpOwotCQlpbm5lci5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQlpbm5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobkNvbHVtbnMsIGZhbHNlKSk7Ci0JCWVjLnNldENsaWVudChpbm5lcik7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjc7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NTUVOVF9JTlZBTElEX0NPTlRFTlQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yODsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01NRU5UX1VOQ0xPU0VELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQkvLyBFbmQgQ29tbWVudHMKLQkJCi0JCQotCQkvLyBDREFUQSBTZWN0aW9ucwotCQllYyA9IGNyZWF0ZVN0eWxlU2VjdGlvbihjb21wb3NpdGUsIEhUTUxVSU1lc3NhZ2VzLkV4cGFuZGFibGVfbGFiZWxfY2RhdGEsIG5Db2x1bW5zKTsKLQkJCi0JCWlubmVyID0gbmV3IENvbXBvc2l0ZShlYywgU1dULk5PTkUpOwotCQlpbm5lci5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQlpbm5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobkNvbHVtbnMsIGZhbHNlKSk7Ci0JCWVjLnNldENsaWVudChpbm5lcik7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjk7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0RBVEFfSU5WQUxJRF9DT05URU5ULCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzA7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0RBVEFfVU5DTE9TRUQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCS8vIEVuZCBDREFUQSBTZWN0aW9ucwotCQkKLQkJLy8gUHJvY2Vzc2luZyBJbnN0cnVjdGlvbnMKLQkJZWMgPSBjcmVhdGVTdHlsZVNlY3Rpb24oY29tcG9zaXRlLCBIVE1MVUlNZXNzYWdlcy5FeHBhbmRhYmxlX2xhYmVsX3BpLCBuQ29sdW1ucyk7Ci0JCQotCQlpbm5lciA9IG5ldyBDb21wb3NpdGUoZWMsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQllYy5zZXRDbGllbnQoaW5uZXIpOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMxOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBJX0lOVkFMSURfQ09OVEVOVCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMyOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBJX1VOQ0xPU0VELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQkvLyBFbmQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbnMKLQkJCi0JCS8vIEVudGl0eSBSZWZlcmVuY2VzCi0JCWVjID0gY3JlYXRlU3R5bGVTZWN0aW9uKGNvbXBvc2l0ZSwgSFRNTFVJTWVzc2FnZXMuRXhwYW5kYWJsZV9sYWJlbF9lbnRpdHlfcmVmLCBuQ29sdW1ucyk7Ci0JCQotCQlpbm5lciA9IG5ldyBDb21wb3NpdGUoZWMsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQllYy5zZXRDbGllbnQoaW5uZXIpOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMzOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlJFRl9JTlZBTElEX0NPTlRFTlQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zNDsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5SRUZfVU5ERUZJTkVELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQkKLQkJLy8gRW5kIEVudGl0eSBSZWZlcmVuY2VzCi0JCQotCQkKLQkJLy8gVGV4dCBDb250ZW50Ci0JCWVjID0gY3JlYXRlU3R5bGVTZWN0aW9uKGNvbXBvc2l0ZSwgSFRNTFVJTWVzc2FnZXMuRXhwYW5kYWJsZV9sYWJlbF90ZXh0LCBuQ29sdW1ucyk7Ci0JCQotCQlpbm5lciA9IG5ldyBDb21wb3NpdGUoZWMsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQllYy5zZXRDbGllbnQoaW5uZXIpOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI1OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRFWFRfSU5WQUxJRF9DT05URU5ULCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjY7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEVYVF9JTlZBTElEX0NIQVIsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCS8vIEVuZCBUZXh0IENvbnRlbnQKLQkJCi0JCXJlc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKGdldERpYWxvZ1NldHRpbmdzKCkuZ2V0U2VjdGlvbihTRVRUSU5HU19TRUNUSU9OX05BTUUpKTsKLQkJCi0JCXJldHVybiBzcENvbnRlbnQ7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFNldHRpbmdzUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3RvcmVWYWx1ZXMoKTsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXJlc2V0U2V2ZXJpdGllcygpOwotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKGdldERpYWxvZ1NldHRpbmdzKCkuYWRkTmV3U2VjdGlvbihTRVRUSU5HU19TRUNUSU9OX05BTUUpKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFF1YWxpZmllcigpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudmFsaWRhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkgewotCQlyZXR1cm4gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVNFX1BST0pFQ1RfU0VUVElOR1M7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eVBhZ2VJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcm9wZXJ0eVBhZ2UucHJvamVjdC52YWxpZGF0aW9uIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Byb3BlcnR5UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Byb3BlcnR5UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NWM4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBCYXNlZCBsb29zZWx5IG9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlCi0gKi8KLWFic3RyYWN0IGNsYXNzIFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUHJlZmVyZW5jZXMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcmVmZXJlbmNlcy1wcm9wZXJ0aWVzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKgotCSAqIERpc2FibGUgbGluayBkYXRhLCBwcmV2ZW50cyB0aGUgZGlzcGxheSBvZiBhICJ3b3Jrc3BhY2UiIG9yICJwcm9qZWN0IgotCSAqIHNldHRpbmdzIGxpbmsgdG8gcHJldmVudCByZWN1cnNpdmUgZGlhbG9nIGxhdW5jaGluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBESVNBQkxFX0xJTksgPSAiRElTQUJMRV9MSU5LIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgZkRhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gZkVuYWJsZVByb2plY3RTZXR0aW5nczsKLQotCXByaXZhdGUgTGluayBmUHJvamVjdFNldHRpbmdzTGluazsKLQkKLQlwcml2YXRlIENvbnRyb2wgZkNvbW1vbjsKLQkKLQlwcml2YXRlIENvbnRyb2xFbmFibGVTdGF0ZSBmRW5hYmxlbWVudHM7Ci0KLQlwdWJsaWMgUHJvcGVydHlQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBhcHBseURhdGEoT2JqZWN0IGRhdGEpIHsKLQkJc3VwZXIuYXBwbHlEYXRhKGRhdGEpOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIE1hcCkgewotCQkJZkRhdGEgPSAoTWFwKSBkYXRhOwotCQkJdXBkYXRlTGlua0VuYWJsZW1lbnQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbW1vbkNvbnRlbnRzKENvbXBvc2l0ZSBjb21wb3NpdGUpOwotCi0JcHVibGljIGZpbmFsIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDb21wb3NpdGUgY2hlY2tMaW5rQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY2hlY2tMaW5rQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQljaGVja0xpbmtDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzID0gbmV3IEJ1dHRvbihjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldFRleHQoU1NFVUlNZXNzYWdlcy5FbmFibGVQcm9qZWN0U2V0dGluZ3MpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCWJvb2xlYW4gZW5hYmxlZEZvclByb2plY3QgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKClbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5nZXRCb29sZWFuKGdldFByb2plY3RTZXR0aW5nc0tleSgpLCBmYWxzZSk7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldFNlbGVjdGlvbihlbmFibGVkRm9yUHJvamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMYWJlbCBzcGFjZXIgPSBuZXcgTGFiZWwoY2hlY2tMaW5rQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQkJc3BhY2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQl9Ci0KLQkJZlByb2plY3RTZXR0aW5nc0xpbmsgPSBuZXcgTGluayhjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UpKTsKLQotCQkvKgotCQkgKiAiZWxlbWVudCIgc2hvdWxkIGJlIGEgcHJvamVjdCwgaWYgbnVsbCwgbGluayB0byBwZXItcHJvamVjdAotCQkgKiBwcm9wZXJ0aWVzCi0JCSAqLwotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWZQcm9qZWN0U2V0dGluZ3NMaW5rLnNldFRleHQoIjxhPiIgKyBTU0VVSU1lc3NhZ2VzLkNvbmZpZ3VyZVdvcmtzcGFjZVNldHRpbmdzICsgIjwvYT4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCWZQcm9qZWN0U2V0dGluZ3NMaW5rLnNldFRleHQoIjxhPiIgKyBTU0VVSU1lc3NhZ2VzLkNvbmZpZ3VyZVByb2plY3RTZXR0aW5ncyArICI8L2E+Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KLQotCQl1cGRhdGVMaW5rRW5hYmxlbWVudCgpOwotCi0JCWZQcm9qZWN0U2V0dGluZ3NMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpIHsKLQkJCQkJb3BlblByb2plY3RTZXR0aW5ncygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJb3BlbldvcmtzcGFjZVNldHRpbmdzKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCQlsaW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQl9Ci0KLS8vCQlmaW5hbCBDb250cm9sIGNvbW1vbiA9IGNyZWF0ZUNvbW1vbkNvbnRlbnRzKGNvbXBvc2l0ZSk7Ci0JCWZDb21tb24gPSBjcmVhdGVDb21tb25Db250ZW50cyhjb21wb3NpdGUpOwotCQkKLQkJZkNvbW1vbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpZiAoZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTZWxlY3Rpb25BZGFwdGVyIHNlbGVjdGlvbkFkYXB0ZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCQllbmFibGVQcmVmZXJlbmNlQ29udGVudChmRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQkJc2VsZWN0aW9uQWRhcHRlci53aWRnZXRTZWxlY3RlZChudWxsKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uQWRhcHRlcik7Ci0JCX0KLQkJCi0JCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBJU2NvcGVDb250ZXh0W10gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJU2NvcGVDb250ZXh0W117bmV3IFByb2plY3RTY29wZShwcm9qZWN0KSwgbmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQkJfQotCQlyZXR1cm4gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpOwotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCWlmIChnZXRFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJT2JqZWN0IGFkYXB0ZXIgPSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgYWRhcHRlcjsKLQkJCX0KLQkJCWFkYXB0ZXIgPSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCXJldHVybiAoSVByb2plY3QpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydHlQYWdlSUQoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MgIT0gbnVsbCAmJiBmRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpOwotCX0KLQotCXZvaWQgb3BlblByb2plY3RTZXR0aW5ncygpIHsKLQkJTGlzdERpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdERpYWxvZyhnZXRTaGVsbCgpKSB7Ci0KLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJCUNvbnRyb2wgYXJlYSA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoY29udGFpbmVyKTsKLQkJCQlnZXRUYWJsZVZpZXdlcigpLnNldFNvcnRlcihuZXcgUmVzb3VyY2VTb3J0ZXIoUmVzb3VyY2VTb3J0ZXIuTkFNRSkpOwotCQkJCXJldHVybiBhcmVhOwotCQkJfQotCQl9OwotCQlkaWFsb2cuc2V0TWVzc2FnZShTU0VVSU1lc3NhZ2VzLlByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDIpOwotCQlkaWFsb2cuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSVdvcmtzcGFjZSkgaW5wdXRFbGVtZW50KS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0pOwotCQlkaWFsb2cuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOwotCQlkaWFsb2cuc2V0VGl0bGUoU1NFVUlNZXNzYWdlcy5Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlXzAxKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBkaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCQkJTWFwIGRhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWRhdGEucHV0KERJU0FCTEVfTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihnZXRTaGVsbCgpLCBwcm9qZWN0LCBnZXRQcm9wZXJ0eVBhZ2VJRCgpLCBuZXcgU3RyaW5nW117Z2V0UHJvcGVydHlQYWdlSUQoKX0sIGRhdGEpLm9wZW4oKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgb3BlbldvcmtzcGFjZVNldHRpbmdzKCkgewotCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCWRhdGEucHV0KERJU0FCTEVfTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBnZXRQcmVmZXJlbmNlUGFnZUlEKCksIG5ldyBTdHJpbmdbXXtnZXRQcmVmZXJlbmNlUGFnZUlEKCl9LCBkYXRhKS5vcGVuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCUlTY29wZUNvbnRleHRbXSBwcmVmZXJlbmNlU2NvcGVzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWlmIChpc0VsZW1lbnRTZXR0aW5nc0VuYWJsZWQoKSkgewotCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQkJfQotCQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRCb29sZWFuKGdldFByb2plY3RTZXR0aW5nc0tleSgpLCBmRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QgKyAiIGZyb20gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCX0KLQkJCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKGdldFByb2plY3RTZXR0aW5nc0tleSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaWYoZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQllbmFibGVQcmVmZXJlbmNlQ29udGVudChmYWxzZSk7Ci0JCX0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpbmtFbmFibGVtZW50KCkgewotCQlpZiAoZkRhdGEgIT0gbnVsbCAmJiBmUHJvamVjdFNldHRpbmdzTGluayAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRFbmFibGVkKCFCb29sZWFuLlRSVUUuZXF1YWxzKGZEYXRhLmdldChESVNBQkxFX0xJTkspKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udHJvbHMgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIGNvbW1vbiBjb250ZW50IHJlZ2lvbgotCSAqIG9mIGEgcHJvcGVydHkgb3IgcHJlZmVyZW5jZSBwYWdlCi0JICogCi0JICogQHBhcmFtIGVuYWJsZSB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgY29tbW9uIGNvbnRlbnQKLQkgKiBhcmVhCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlUHJlZmVyZW5jZUNvbnRlbnQoYm9vbGVhbiBlbmFibGUpIHsKLQkJaWYoZW5hYmxlKSB7Ci0JCQlpZihmRW5hYmxlbWVudHMgIT0gbnVsbCkgewotCQkJCWZFbmFibGVtZW50cy5yZXN0b3JlKCk7Ci0JCQkJZkVuYWJsZW1lbnRzID0gbnVsbDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmKGZFbmFibGVtZW50cyA9PSBudWxsKQotCQkJCWZFbmFibGVtZW50cyA9IENvbnRyb2xFbmFibGVTdGF0ZS5kaXNhYmxlKGZDb21tb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjczYmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ29udGFpbnMgYSBzZXQgb2YgcHJvamVjdGlvbiBtb2RlbCBhZGRpdGlvbnMvZGVsZXRpb25zL21vZGlmaWNhdGlvbnMKLSAqLwotY2xhc3MgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCXByaXZhdGUgTm9kZSBmTm9kZTsKLQlwcml2YXRlIEFubm90YXRpb25bXSBmRGVsZXRpb25zOwotCXByaXZhdGUgTWFwIGZBZGRpdGlvbnM7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uW10gZk1vZGlmaWNhdGlvbnM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMoTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucykgewotCQlmTm9kZSA9IG5vZGU7Ci0JCWZEZWxldGlvbnMgPSBkZWxldGlvbnM7Ci0JCWZBZGRpdGlvbnMgPSBhZGRpdGlvbnM7Ci0JCWZNb2RpZmljYXRpb25zID0gbW9kaWZpY2F0aW9uczsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldEFkZGl0aW9ucygpIHsKLQkJcmV0dXJuIGZBZGRpdGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXREZWxldGlvbnMoKSB7Ci0JCXJldHVybiBmRGVsZXRpb25zOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0TW9kaWZpY2F0aW9ucygpIHsKLQkJcmV0dXJuIGZNb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBmTm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njc1MmIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUb20gVHVycmVsbC1Dcm9mdCwgbGVmdEB1bHRyYXNpcy5jb20gLSBbMTc0MzA3XSBFbmFibGUgZm9sZGluZyBmb3IgZGl2IHRhZ3MgaW4gSlNQIGFuZCBIVE1MIGZpbGVzICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQkvKioKLQkgKiBMaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIG1vZGVsIG5vZGUgYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmUHJvamVjdGlvblZpZXdlcnM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKE9iamVjdCBhZGFwdGVyS2V5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXkpOwotCX0KLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKCkgewotCQl0aGlzKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQWN0dWFsbHkgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgcGFyZW50IG9mIHRhcmdldCBpZiB0YXJnZXQgaXMgdGhlCi0JICogImFkYXB0LWFibGUiIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJaWYgKChpc0FjdGl2ZSgpKSAmJiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgJiYgKChOb2RlKSB0YXJnZXQpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0JCQlpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkpIHsKLQotCQkJCS8vIGFjdHVhbGx5IHdvcmsgd2l0aCB0aGUgcGFyZW50IG5vZGUgdG8gbGlzdGVuIGZvciBhZGQsCi0JCQkJLy8gZGVsZXRlIGV2ZW50cwotCQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJSU5vZGVOb3RpZmllciBwYXJlbnROb3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBwYXJlbnQ7Ci0JCQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCBwYXJlbnRBZGFwdGVyID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCkgcGFyZW50Tm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQkJCWlmIChwYXJlbnRBZGFwdGVyID09IG51bGwpIHsKLQkJCQkJCS8vIGNyZWF0ZSBhIG5ldyBhZGFwdGVyIGZvciBwYXJlbnQKLQkJCQkJCXBhcmVudEFkYXB0ZXIgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKHRoaXMpOwotCQkJCQkJcGFyZW50Tm90aWZpZXIuYWRkQWRhcHRlcihwYXJlbnRBZGFwdGVyKTsKLQkJCQkJfQotCQkJCQkvLyBjYWxsIHVwZGF0ZSBvbiBwYXJlbnQgYmVjYXVzZSBhIG5ldyBub2RlIGhhcyBqdXN0IGJlZW4KLQkJCQkJLy8gYWRkZWQKLQkJCQkJcGFyZW50QWRhcHRlci51cGRhdGVBZGFwdGVyKHBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIG5vZGUgaXMgYSBub2RlIHR5cGUgYWJsZSB0byBmb2xkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBub2RlIGlzIHByb2plY3RhYmxlLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlib29sZWFuIGlzTm9kZVByb2plY3RhYmxlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCS8vIG5vZGUgaXMgb25seSBwcm9qZWN0YWJsZSBpZiBpdCBpcyBoZWFkLCBib2R5LCBzY3JpcHQsIHN0eWxlLAotCQkJLy8gdGFibGUsIHVsLCBvbCwgYW5kIGRpdiB0YWdzCi0JCQlpZiAoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0wuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgZmFjdG9yeSBpcyBjdXJyZW50bHkgYWN0aXZlbHkgbWFuYWdpbmcgcHJvamVjdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsICYmICFmUHJvamVjdGlvblZpZXdlcnMuaXNFbXB0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBpZiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4KLQkgKiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGVsZXRpb25zCi0JICogQHBhcmFtIGFkZGl0aW9ucwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25zCi0JICovCi0Jdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucykgewotCQlxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGZvciBhIHNwZWNpZmljIHByb2plY3Rpb24gdmlld2VyIGlmCi0JICogZG9jdW1lbnQgaXMgbm90IGluIGZsdXguIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQKLQkgKiB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRlbGV0aW9ucwotCSAqIEBwYXJhbSBhZGRpdGlvbnMKLQkgKiBAcGFyYW0gbW9kaWZpY2F0aW9ucwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyBjcmVhdGUgYSBjaGFuZ2Ugb2JqZWN0IGZvciBsYXRlc3QgY2hhbmdlIGFuZCBhZGQgdG8gcXVldWUKLQkJUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgbmV3Q2hhbmdlID0gbmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIGRlbGV0aW9ucywgYWRkaXRpb25zLCBtb2RpZmljYXRpb25zKTsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGZQcm9qZWN0aW9uVmlld2Vycy5nZXQodmlld2VyKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCWluZm8ucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSXRlcmF0b3IgaW5mb3MgPSBmUHJvamVjdGlvblZpZXdlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaW5mb3MuaGFzTmV4dCgpKSB7Ci0JCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgaW5mb3MubmV4dCgpOwotCQkJCQlpbmZvLnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGdvIHRocm91Z2ggZXZlcnkgcHJvamVjdGlvbnZpZXdlciBhbmQgY2FsbAotCQkvLyByZW1vdmVQcm9qZWN0aW9uVmlld2VyKHZpZXdlcik7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaW5mb3MgPSBmUHJvamVjdGlvblZpZXdlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpbmZvcy5oYXNOZXh0KCkpIHsKLQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGluZm9zLm5leHQoKTsKLQkJCQlpbmZvLmRpc3Bvc2UoKTsKLQkJCQlpbmZvcy5yZW1vdmUoKTsKLQkJCX0KLQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG51bGw7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdmlld2VyIHRvIGxpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIHRoaXMgZmFjdG9yeSBpcyBhc3NvY2lhdGVkCi0JICogd2l0aAotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyB2aWV3ZXIncyBkb2N1bWVudCBhbmQgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JICogICAgICAgICAgICBhcmUgbm90IG51bGwKLQkgKi8KLQl2b2lkIGFkZFByb2plY3Rpb25WaWV3ZXIoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gcmVtb3ZlIG9sZCBlbnRyeSBpZiBpdCBleGlzdHMKLQkJcmVtb3ZlUHJvamVjdGlvblZpZXdlcih2aWV3ZXIpOwotCi0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgPT0gbnVsbCkgewotCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBuZXcgb2JqZWN0IGNvbnRhaW5pbmcgcHJvamVjdGlvbiB2aWV3ZXIgYW5kIGl0cyBpbmZvCi0JCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbih2aWV3ZXIpOwotCQlmUHJvamVjdGlvblZpZXdlcnMucHV0KHZpZXdlciwgaW5mbyk7Ci0JCWluZm8uaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHZpZXdlciBmcm9tIHRoZSBsaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyB0aGlzCi0JICogZmFjdG9yIGlzIGFzc29jaWF0ZWQgd2l0aAotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHJlbW92ZVByb2plY3Rpb25WaWV3ZXIoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQkvLyByZW1vdmUgZW50cnkgZnJvbSBsaXN0IG9mIHZpZXdlcnMKLQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgZlByb2plY3Rpb25WaWV3ZXJzLnJlbW92ZSh2aWV3ZXIpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8uZGlzcG9zZSgpOwotCQkJfQotCQkJLy8gaWYgcmVtb3ZpbmcgbGFzdCBwcm9qZWN0aW9uIHZpZXdlciwgY2xlYXIgb3V0IGV2ZXJ5dGhpbmcKLQkJCWlmIChmUHJvamVjdGlvblZpZXdlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNjZDJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIHdpdGggcHJvamVjdGlvbiBhbm5vdGF0aW9ucyBmb3IgdGhpcwotICogYWRhcHRlciBub2RlJ3MgY2hpbGRyZW4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgY2xhc3MgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZXh0ZW5kcyBQcm9qZWN0aW9uQW5ub3RhdGlvbiB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmSXNWaXNpYmxlID0gZmFsc2U7IC8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCXByaXZhdGUgTm9kZSBmTm9kZTsKLQotCQlwdWJsaWMgVGFnUHJvamVjdGlvbkFubm90YXRpb24oTm9kZSBub2RlLCBib29sZWFuIGlzQ29sbGFwc2VkKSB7Ci0JCQlzdXBlcihpc0NvbGxhcHNlZCk7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIGZOb2RlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBEb2VzIG5vdCBwYWludCBoaWRkZW4gYW5ub3RhdGlvbnMuIEFubm90YXRpb25zIGFyZSBoaWRkZW4gd2hlbiB0aGV5Ci0JCSAqIG9ubHkgc3BhbiBvbmUgbGluZS4KLQkJICogCi0JCSAqIEBzZWUgUHJvamVjdGlvbkFubm90YXRpb24jcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhcywKLQkJICogICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIENhbnZhcyBjYW52YXMsIFJlY3RhbmdsZSByZWN0YW5nbGUpIHsKLQkJCS8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCQkvKgotCQkJICogb25seSBuZWVkIHRvIGNoZWNrIGFubm90YXRpb25zIHRoYXQgYXJlIGV4cGFuZGVkIGJlY2F1c2UgaGlkZGVuCi0JCQkgKiBhbm5vdGF0aW9ucyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGdpdmVuIHRoZSBjaGFuY2UgdG8KLQkJCSAqIGNvbGxhcHNlLgotCQkJICovCi0JCQlpZiAoIWlzQ29sbGFwc2VkKCkpIHsKLQkJCQkvLyB3b3JraW5nIHdpdGggcmVjdGFuZ2xlLCBzbyBsaW5lIGhlaWdodAotCQkJCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJCWlmIChtZXRyaWNzICE9IG51bGwpIHsKLQkJCQkJLy8gZG8gbm90IGRyYXcgYW5ub3RhdGlvbnMgdGhhdCBvbmx5IHNwYW4gb25lIGxpbmUgYW5kCi0JCQkJCS8vIG1hcmsgdGhlbSBhcyBub3QgdmlzaWJsZQotCQkJCQlpZiAoKHJlY3RhbmdsZS5oZWlnaHQgLyBtZXRyaWNzLmdldEhlaWdodCgpKSA8PSAxKSB7Ci0JCQkJCQlmSXNWaXNpYmxlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmSXNWaXNpYmxlID0gdHJ1ZTsKLQkJCXN1cGVyLnBhaW50KGdjLCBjYW52YXMsIHJlY3RhbmdsZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb24jbWFya0NvbGxhcHNlZCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtYXJrQ29sbGFwc2VkKCkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8vIGRvIG5vdCBtYXJrIGNvbGxhcHNlZCBpZiBhbm5vdGF0aW9uIGlzIG5vdCB2aXNpYmxlCi0JCQlpZiAoZklzVmlzaWJsZSkKLQkJCQlzdXBlci5tYXJrQ29sbGFwc2VkKCk7Ci0JCX0KLQl9Ci0KLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQotCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZkFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgTWFwIGZUYWdBbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZmFjdG9yeSkgewotCQlmQWRhcHRlckZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3Rpb24gcG9zaXRpb24gZnJvbSB0aGUgZ2l2ZW4gbm9kZS4gQWJsZSB0byBnZXQKLQkgKiBwcm9qZWN0aW9uIHBvc2l0aW9uIGlmIG5vZGUgaXNOb2RlUHJvamVjdGFibGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gcHJvamVjdGlvbiBwb3NpdGlvbiBwb3NzaWJsZSwgYSBQb3NpdGlvbiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFBvc2l0aW9uIGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihOb2RlIG5vZGUpIHsKLQkJUG9zaXRpb24gcG9zID0gbnVsbDsKLQkJaWYgKGZBZGFwdGVyRmFjdG9yeS5pc05vZGVQcm9qZWN0YWJsZShub2RlKSAmJiBub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJLy8gSURvY3VtZW50IGRvY3VtZW50ID0KLQkJCS8vIGZBZGFwdGVyRmFjdG9yeS5nZXRQcm9qZWN0aW9uVmlld2VyKCkuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGlub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKHN0YXJ0ID49IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCQkvLyByZWdpb24tYmFzZWQKLQkJCQkvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uCi0JCQkJLy8gaW5jcmVhc2Ugd2hlbiBhZGQgbmV3bGluZQotCQkJCXBvcyA9IG5ldyBQb3NpdGlvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCS8vIHRyeSB7Ci0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24KLQkJCQkvLyAvLyBpbmNyZWFzZSB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gSVJlZ2lvbiBzdGFydExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBJUmVnaW9uIGVuZExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGVuZCk7Ci0JCQkJLy8gaW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnRMaW5lUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBlbmRMaW5lUmVnaW9uLmdldE9mZnNldCgpICsKLQkJCQkvLyBlbmRMaW5lUmVnaW9uLmdldExlbmd0aCgpOwotCQkJCS8vIGlmIChlbmRPZmZzZXQgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0KLQkJCQkvLyBzdGFydE9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vCi0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIG5vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCByZWdpb24gaW5jcmVhc2UKLQkJCQkvLyAvLyB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gaW50IHN0YXJ0TGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gaW50IGVuZExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpZiAoZW5kTGluZSArIDEgPCBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCkpIHsKLQkJCQkvLyBpbnQgb2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzdGFydExpbmUpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGVuZExpbmUgKyAxKTsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24ob2Zmc2V0LCBlbmRPZmZzZXQgLSBvZmZzZXQpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBudWxsLCB4KTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQkJLy8gfQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qKgotCSAqIEZpbmQgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZm9yIG5vZGUgaW4gdGhlIGN1cnJlbnQgbGlzdCBvZiBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbnMgZm9yIHRoaXMgYWRhcHRlcgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbgotCSAqLwotCXByaXZhdGUgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKE5vZGUgbm9kZSkgewotCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vID0gbnVsbDsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSkgewotCQkJSXRlcmF0b3IgaXQgPSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkgJiYgYW5ubyA9PSBudWxsKSB7Ci0JCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gYSA9IChUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbikgaXQubmV4dCgpOwotCQkJCU5vZGUgbiA9IGEuZ2V0Tm9kZSgpOwotCQkJCWlmIChub2RlLmVxdWFscyhuKSkgewotCQkJCQlhbm5vID0gYTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFubm87Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGNoZWNrIGlmIGZvbGRpbmcgaXMgZXZlbiBlbmFibGVkLCBpZiBub3QsIGp1c3QgaWdub3JlIG5vdGlmeUNoYW5nZWQKLQkJLy8gZXZlbnRzCi0JCWlmICghZkFkYXB0ZXJGYWN0b3J5LmlzQWN0aXZlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQpICYmIChub3RpZmllciBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQl1cGRhdGVBZGFwdGVyKChOb2RlKSBub3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBvZiBhbGwgdGhlIG5vZGVzIHRoYXQgYXJlIGNoaWxkcmVuIG9mCi0JICogbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0Jdm9pZCB1cGRhdGVBZGFwdGVyKE5vZGUgbm9kZSkgewotCQl1cGRhdGVBZGFwdGVyKG5vZGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlIGFuZCBhZGRzIGFsbCBwcm9qZWN0aW9uIGFubm90YXRpb25zIHRvIHZpZXdlciAoZm9yIG5ld2x5IGFkZGVkCi0JICogdmlld2VycykKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJTWFwIGFkZGl0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGdvIHRocm91Z2ggaW1tZWRpYXRlIGNoaWxkIG5vZGVzIGFuZCBmaWd1cmUgb3V0IHByb2plY3Rpb24KLQkJLy8gbW9kZWwgYW5ub3RhdGlvbnMKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCVBvc2l0aW9uIG5ld1BvcyA9IGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihjaGlsZE5vZGUpOwotCQkJCWlmIChuZXdQb3MgIT0gbnVsbCkgewotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gbmV3IFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKGNoaWxkTm9kZSwgZmFsc2UpOwotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleGlzdGluZyA9IGdldEV4aXN0aW5nQW5ub3RhdGlvbihjaGlsZE5vZGUpOwotCQkJCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGFkZAotCQkJCQkJYWRkaXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChleGlzdGluZywgbmV3UG9zKTsKLQkJCQkJCS8vIHJlbW92ZSBmcm9tIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGRlbGV0ZQotCQkJCQkJZlRhZ0Fubm90YXRpb25zLnJlbW92ZShleGlzdGluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIGluIHRoZSBlbmQsIHdhbnQgdG8gZGVsZXRlIGFueXRoaW5nIGxlZnRvdmVyIGluIG9sZCBsaXN0LCBhZGQKLQkJCS8vIGV2ZXJ5dGhpbmcgaW4gYWRkaXRpb25zLCBhbmQgdXBkYXRlIGV2ZXJ5dGhpbmcgaW4KLQkJCS8vIHByb2plY3Rpb25Bbm5vdGF0aW9ucwotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBvbGRMaXN0ID0gbnVsbDsKLQkJCWlmICghZlRhZ0Fubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW9sZExpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgZlRhZ0Fubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uW10gbW9kaWZ5TGlzdCA9IG51bGw7Ci0JCQlpZiAoIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQltb2RpZnlMaXN0ID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uW10pIHByb2plY3Rpb25Bbm5vdGF0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvblswXSk7Ci0JCQl9Ci0KLQkJCS8vIHNwZWNpZmljYWxseSBhZGQgYWxsIGFubm90YXRpb25zIHRvIHZpZXdlcgotCQkJaWYgKHZpZXdlciAhPSBudWxsICYmICFwcm9qZWN0aW9uQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJZkFkYXB0ZXJGYWN0b3J5LnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBudWxsLCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMsIG51bGwsIHZpZXdlcik7Ci0JCQl9Ci0KLQkJCS8vIG9ubHkgdXBkYXRlIHdoZW4gdGhlcmUgaXMgc29tZXRoaW5nIHRvIHVwZGF0ZQotCQkJaWYgKChvbGRMaXN0ICE9IG51bGwgJiYgb2xkTGlzdC5sZW5ndGggPiAwKSB8fCAoIWFkZGl0aW9ucy5pc0VtcHR5KCkpIHx8IChtb2RpZnlMaXN0ICE9IG51bGwgJiYgbW9kaWZ5TGlzdC5sZW5ndGggPiAwKSkKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG9sZExpc3QsIGFkZGl0aW9ucywgbW9kaWZ5TGlzdCk7Ci0JCX0KLQotCQkvLyBzYXZlIG5ldyBsaXN0IG9mIGFubm90YXRpb25zCi0JCWZUYWdBbm5vdGF0aW9ucyA9IHByb2plY3Rpb25Bbm5vdGF0aW9uczsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN0cmluZyBub2RlTmFtZSA9IG5vZGUgIT0gbnVsbCA/IG5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwudXBkYXRlQWRhcHRlciAoIiArIG5vZGVOYW1lICsgIik6IiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVlZmE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdGlvbiB2aWV3ZXIgYW5kIGFsc28gbWFuYWdlcyB1cGRhdGluZwotICogdGhlIHZpZXdlcidzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotICovCi1jbGFzcyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JLyoqCi0JICogTGlzdGVucyB0byBkb2N1bWVudCB0byBiZSBhd2FyZSBvZiB3aGVuIHRvIHVwZGF0ZSB0aGUgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyByZWdpc3RlciBhIHBvc3Qgbm90aWZpY2F0aW9uIHJlcGxhY2Ugc28gdGhhdCBwcm9qZWN0aW9uCi0JCQkvLyBhbm5vdGF0aW9uIG1vZGVsIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBhbGwgZG9jdW1lbnRDaGFuZ2VkCi0JCQkvLyBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uICYmIGZJbmZvLmdldERvY3VtZW50KCkgPT0gZG9jdW1lbnQpIHsKLQkJCQlpZiAoZkluZm8uaGFzQ2hhbmdlc1F1ZXVlZCgpKQotCQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbikgZG9jdW1lbnQpLnJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UodGhpcywgbmV3IFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW5mbykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXNzZW50aWFsbHkgYSBwb3N0IGRvY3VtZW50IGNoYW5nZWQgbGlzdGVuZXIgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYWZ0ZXIKLQkgKiBkb2N1bWVudGNoYW5nZWQgaGFzIGJlZW4gZmlyZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtKElEb2N1bWVudCBkb2N1bWVudCwgSURvY3VtZW50TGlzdGVuZXIgb3duZXIpIHsKLQkJCWZJbmZvLmFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjdXJyZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24KLQkgKiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci0JLyoqCi0JICogRG9jdW1lbnQgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCS8qKgotCSAqIExpc3RlbmVyIHRvIGZQcm9qZWN0aW9uVmlld2VyJ3MgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyIGZEb2N1bWVudExpc3RlbmVyOwotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBkb2N1bWVudCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0RvY3VtZW50Q2hhbmdpbmcgPSBmYWxzZTsKLQkvKioKLQkgKiBMaXN0IG9mIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjaGFuZ2VzIHRoYXQgbmVlZCB0byBiZSBhcHBsaWVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24oUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJZkRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsID0gdmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKTsKLQl9Ci0KLQlJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkgewotCQlpZiAoZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID09IG51bGwpIHsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCX0KLQotCXZvaWQgc2V0SXNEb2N1bWVudENoYW5naW5nKGJvb2xlYW4gY2hhbmdpbmcpIHsKLQkJZklzRG9jdW1lbnRDaGFuZ2luZyA9IGNoYW5naW5nOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RvY3VtZW50Q2hhbmdpbmcoKSB7Ci0JCXJldHVybiBmSXNEb2N1bWVudENoYW5naW5nOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIHBlbmRpbmcgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdG8gdGhlCi0JICogcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqLwotCXZvaWQgYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCkgewotCQlMaXN0IHF1ZXVlZENoYW5nZXMgPSBnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpOwotCQkvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcGVuZGluZyBhbm5vdGF0aW9uIGNoYW5nZXMgYW5kIGFwcGx5Ci0JCS8vIHRoZW0gdG8KLQkJLy8gdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCQl3aGlsZSAoIXF1ZXVlZENoYW5nZXMuaXNFbXB0eSgpKSB7Ci0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBjaGFuZ2VzID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKSBxdWV1ZWRDaGFuZ2VzLnJlbW92ZSgwKTsKLQkJCXRyeSB7Ci0JCQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwubW9kaWZ5QW5ub3RhdGlvbnMoY2hhbmdlcy5nZXREZWxldGlvbnMoKSwgY2hhbmdlcy5nZXRBZGRpdGlvbnMoKSwgY2hhbmdlcy5nZXRNb2RpZmljYXRpb25zKCkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgbG9nIGl0IGFuZCBjb250aW51ZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW5ub3RhdGlvbiBjaGFuZ2VzIHF1ZXVlZCB1cCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNDaGFuZ2VzUXVldWVkKCkgewotCQlyZXR1cm4gIWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgbmV3Q2hhbmdlKSB7Ci0JCS8qCi0JCSAqIGZ1dHVyZV9UT0RPOiBtYXliZSBpbXByb3ZlIGJ5IGNoZWNraW5nIGlmIGFubm90YXRpb24gcHJvamVjdGlvbgotCQkgKiBtb2RlbCBjaGFuZ2UgYWxyZWFkeSBleGlzdHMgZm9yIG5vZGUuIGlmIHNvLCB0aHJvdyBvdXQgb2xkIGNoYW5nZS4KLQkJICovCi0JCWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuYWRkKG5ld0NoYW5nZSk7Ci0KLQkJLy8gaWYgZG9jdW1lbnQgaXNuJ3QgY2hhbmdpbmcsIGdvIGFoZWFkIGFuZCBhcHBseSBpdAotCQlpZiAoIWlzRG9jdW1lbnRDaGFuZ2luZygpKSB7Ci0JCQlhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGFkZCBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlnZXREb2N1bWVudCgpLmFkZERvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIHJlbW92ZSBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZ2V0RG9jdW1lbnQoKS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBsaXN0IG9mIHF1ZXVlZCBjaGFuZ2VzIHNpbmNlIGl0IG1heSBubyBsb25nZXIKLQkJLy8gYmUgYWNjdXJhdGUKLQkJaWYgKGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyAhPSBudWxsKSB7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMuY2xlYXIoKTsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxODU1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLklTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVXBkYXRlcyB0aGUgcHJvamVjdGlvbiBtb2RlbCBvZiBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIEhUTUwuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckhUTUwgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIsIElQcm9qZWN0aW9uTGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXIgZlZpZXdlcjsKLQlwcml2YXRlIGJvb2xlYW4gZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JLyoqCi0JICogTWF4aW11bSBudW1iZXIgb2YgY2hpbGQgbm9kZXMgdG8gYWRkIGFkYXB0ZXJzIHRvIChsaW1pdCBmb3IgcGVyZm9ybWFuY2UKLQkgKiBzYWtlKQotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9DSElMRFJFTiA9IDEwOwotCS8qKgotCSAqIE1heGltdW0gbnVtYmVyIG9mIHNpYmxpbmcgbm9kZXMgdG8gYWRkIGFkYXB0ZXJzIHRvIChsaW1pdCBmb3IKLQkgKiBwZXJmb3JtYW5jZSBzYWtlKQotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9TSUJMSU5HUyA9IDEwMDA7Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGFkYXB0ZXIgdG8gbm9kZSBhbmQgaXRzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gY2hpbGRMZXZlbAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyVG9Ob2RlQW5kQ2hpbGRyZW4oTm9kZSBub2RlLCBpbnQgY2hpbGRMZXZlbCkgewotCQkvLyBzdG9wIGFkZGluZyBpbml0aWFsIGFkYXB0ZXJzIE1BWF9DSElMRFJFTiBsZXZlbHMgZGVlcCBmb3IKLQkJLy8gcGVyZm9ybWFuY2Ugc2FrZQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIgJiYgY2hpbGRMZXZlbCA8IE1BWF9DSElMRFJFTikgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBub2RlOwotCi0JCQkvLyB0cnkgYW5kIGdldCB0aGUgYWRhcHRlciBmb3IgdGhlIGN1cnJlbnQgbm9kZSBhbmQgdXBkYXRlIHRoZQotCQkJLy8gYWRhcHRlciB3aXRoIHByb2plY3Rpb24gaW5mb3JtYXRpb24KLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCBhZGFwdGVyID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCkgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci51cGRhdGVBZGFwdGVyKG5vZGUsIGZWaWV3ZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCBjYWxsIGdldGFkYXB0ZXIgc28gdGhlIGFkYXB0ZXIgaXMgY3JlYXRlZCBhbmQKLQkJCQkvLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkCi0JCQkJbm90aWZpZXIuZ2V0QWRhcHRlckZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJfQotCQkJaW50IHNpYmxpbmdMZXZlbCA9IDA7Ci0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsICYmIHNpYmxpbmdMZXZlbCA8IE1BWF9TSUJMSU5HUykgewotCQkJCU5vZGUgY2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGNoaWxkTm9kZSwgY2hpbGRMZXZlbCArIDEpOwotCQkJCSsrc2libGluZ0xldmVsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIGFkZHMgYW4gYWRhcHRlciBvbnRvIGVhY2ggZm9yIHRyYWNraW5nCi0JICogcHVycG9zZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCWludCBzaWJsaW5nTGV2ZWwgPSAwOwotCQkJCQkJTm9kZSBuZXh0U2libGluZyA9IChOb2RlKSBzdGFydE5vZGU7Ci0JCQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nTGV2ZWwgPCBNQVhfU0lCTElOR1MpIHsKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCQkJbmV4dFNpYmxpbmcgPSBjdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCQkrK3NpYmxpbmdMZXZlbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckhUTUwuYWRkQWxsQWRhcHRlcnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIHRvIHVzZSB3aXRoIHRoaXMKLQkgKiBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwKLQkgKi8KLQlwcml2YXRlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZ2V0QWRhcHRlckZhY3RvcnkoYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHNNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCQkJCQkvLyBnZXR0aW5nIHRoZSBwcm9qZWN0aW9ubW9kZWxub2RlYWRhcHRlciBmb3IgdGhlIGZpcnN0Ci0JCQkJCS8vIHRpbWUKLQkJCQkJLy8gc28gZG8gc29tZSBpbml0aWFsaXppbmcKLQkJCQkJaWYgKCFmYWN0b3J5UmVnaXN0cnkuY29udGFpbnMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKSAmJiBjcmVhdGVJZk5lZWRlZCkgewotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBuZXdGYWN0b3J5ID0gbmV3IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoKTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gZmFjdG9yeSByZWdpc3RyeQotCQkJCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkobmV3RmFjdG9yeSk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIHByb3BvZ2F0aW5nIGFkYXB0ZXIKLQkJCQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHNNb2RlbDsKLQkJCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAocHJvcGFnYXRpbmdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3RmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyB0cnkgYW5kIGdldCB0aGUgZmFjdG9yeQotCQkJCQlmYWN0b3J5ID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwpIGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MLmdldEFkYXB0ZXJGYWN0b3J5OiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIGNsZWFyIG91dCBvbGQgaW5mbwotCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQlmRG9jdW1lbnQgPSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0KLQkJLy8gc2V0IHByb2plY3Rpb24gdmlld2VyIG9uIG5ldyBkb2N1bWVudCdzIGFkYXB0ZXIgZmFjdG9yeQotCQlpZiAoZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkodHJ1ZSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRQcm9qZWN0aW9uVmlld2VyKGZWaWV3ZXIpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MzA0Ci0JCQkJLy8gZGlzYWJsZSByZWRyYXcgd2hpbGUgYWRkaW5nIGFsbCBhZGFwdGVycwotCQkJCWZWaWV3ZXIuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQlhZGRBbGxBZGFwdGVycygpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZlZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5pbml0aWFsaXplOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc29jaWF0ZSBhIFByb2plY3Rpb25WaWV3ZXIgd2l0aCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gdW5pbnN0YWxsIGJlZm9yZSB0cnlpbmcgdG8gaW5zdGFsbCBuZXcgdmlld2VyCi0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQl1bmluc3RhbGwoKTsKLQkJfQotCQlmVmlld2VyID0gdmlld2VyOwotCQlmVmlld2VyLmFkZFByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnN0YWxsZWQoKSB7Ci0JCXJldHVybiBmVmlld2VyICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkRpc2FibGVkKCkgewotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeShmYWxzZSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCWZhY3RvcnkucmVtb3ZlUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBhbGwgYW5ub3RhdGlvbnMKLQkJaWYgKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpCi0JCQlmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKS5yZW1vdmVBbGxBbm5vdGF0aW9ucygpOwotCi0JCXJlbW92ZUFsbEFkYXB0ZXJzKCk7Ci0KLQkJZkRvY3VtZW50ID0gbnVsbDsKLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkVuYWJsZWQoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuIGFkYXB0ZXIgZnJvbSBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBsZXZlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihOb2RlIG5vZGUsIGludCBsZXZlbCkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQotCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGFkYXB0ZXIgZm9yIHRoZSBjdXJyZW50IG5vZGUgYW5kIHJlbW92ZSBpdAotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlub3RpZmllci5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJfQotCi0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJTm9kZSBjaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQlyZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihjaGlsZE5vZGUsIGxldmVsICsgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgcmVtb3ZlcyBhZGFwdGVyIGZyb20gZWFjaCBmb3IgY2xlYW51cAotCSAqIHB1cnBvc2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG5leHRTaWJsaW5nID0gKE5vZGUpIHN0YXJ0Tm9kZTsKLQkJCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCXJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5yZW1vdmVBbGxBZGFwdGVyczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBpZiBmb2xkaW5nIGlzIGVuYWJsZWQgYW5kIG5ldyBkb2N1bWVudCBpcyBnb2luZyB0byBiZSBhIHRvdGFsbHkKLQkJLy8gZGlmZmVyZW50IGRvY3VtZW50LCBkaXNhYmxlIHByb2plY3Rpb24KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsICYmIGZEb2N1bWVudCAhPSBuZXdJbnB1dCkgewotCQkJLy8gZGlzYWJsZSBwcm9qZWN0aW9uIGFuZCBkaXNjb25uZWN0IGV2ZXJ5dGhpbmcKLQkJCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIHByb2plY3Rpb24gd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBiZWZvcmUgaW5wdXQgZG9jdW1lbnQgY2hhbmdlZAotCQkvLyBhbmQgbmV3IGRvY3VtZW50IGlzIGRpZmZlcmVudCB0aGFuIG9sZCBkb2N1bWVudAotCQlpZiAoZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkICYmIGZEb2N1bWVudCA9PSBudWxsICYmIG5ld0lucHV0ICE9IG51bGwpIHsKLQkJCXByb2plY3Rpb25FbmFibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3QgdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIgZnJvbSBwcm9qZWN0aW9uIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCQlmVmlld2VyLnJlbW92ZVByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIucmVtb3ZlVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDVhYjlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckhUTUwgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCS8vIHRoZXNlIGFyZSB0aGUgbm9ybWFsIGVkaXQgc2lkZSBjb250ZW50IGJhc2VkIGZhY3RvcmllcwotCQlhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQkJLy8gTXVzdCB1cGRhdGUvYWRkIHRvIHByb3BhZ2F0aW5nIGFkYXB0ZXIgaGVyZSB0b28KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJYWRkUHJvcGFnYXRpbmdBZGFwdGVycyhzdHJ1Y3R1cmVkTW9kZWwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHN0cnVjdHVyZWRNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5UmVnaXN0cnksICJQcm9ncmFtIEVycm9yOiBjbGllbnQgY2FsbGVyIG11c3QgZW5zdXJlIG1vZGVsIGhhcyBmYWN0b3J5IHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotCQlmYWN0b3J5ID0gZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCgpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wYWdhdGluZ0FkYXB0ZXJzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIG5vIHByb3BhZ2F0aW5nIHRvIGFkZAotCX0KLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2lzRm9yKENvbnRlbnRUeXBlRGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JIVE1MKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gbm90aGluZyB0byBkbywgc2luY2Ugbm8gZW1iZWRkZWQgdHlwZQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc2VhcmNoL0hUTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc2VhcmNoL0hUTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2MyYzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3NlYXJjaC9IVE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2V0cyB1cCBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBmb3IgaHRtbCBmaW5kIG9jY3VycmVuY2VzIHByb2Nlc3NvcnMKLSAqLwotcHVibGljIGNsYXNzIEhUTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIExpc3QgZlByb2Nlc3NvcnM7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotCQkJZlByb2Nlc3NvcnMuYWRkKGh0bWxQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc2VhcmNoL0hUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwZWZhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLQotLyoqCi0gKiBDb25maWd1cmVzIGEgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIHdpdGggSFRNTCBwYXJ0aXRpb25zIGFuZCByZWdpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxULCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVH07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJlZ2lvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUV9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0hUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0hUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmNzY1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgc3ltYm9saWMgbmFtZSBvZiBzdHlsZXMgdXNlZCBieSBMaW5lU3R5bGVQcm92aWRlciwgQ29sb3JNYW5hZ2VyLCBhbmQKLSAqIGFueSBvdGhlcnMgd2hvIG1heSBiZSBpbnRlcmVzdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzSFRNTCBleHRlbmRzIElTdHlsZUNvbnN0YW50c1hNTCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX0FSRUFfQk9SREVSID0gIlNDUklQVF9BUkVBX0JPUkRFUiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVF9BUkVBID0gIlNDUklQVF9BUkVBIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGI2ZjY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MIGV4dGVuZHMgTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGEgbWV0aG9kIHRvIGNlbnRyYWxpemUgYWxsIHRoZSAiZm9ybWF0IHJ1bGVzIiBmb3IgcmVnaW9ucyAKLQkgKiBzcGVjaWZpY2FsbHkgYXNzb2NpYXRlZCBmb3IgaG93IHRvICJvcGVuIiB0aGUgcmVnaW9uLgotCSAqLwotCS8vIE5PVEU6IHRoaXMgbWV0aG9kIHdhcyBqdXN0IGNvcGllZCBkb3duIGZvcm0gTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwKLQlwdWJsaWMgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIG5vdCBzdXJlIHdoeSB0aGlzIGlzIGNvbWluZyB0aHJvdWdoIG51bGwsIGJ1dCBqdXN0IHRvIGNhdGNoIGl0Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKWdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSlnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQl9Ci0JCS8vIHdvcmthcm91bmQ6IG1ha2UgUEkgZWRnZXMgdGhlIHNhbWUgY29sb3IgYXMgdGFnIGVkZ2VzCi0JCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCX0KLQkJLy8gZmlyc3QgdHJ5ICJzdGFuZGFyZCIgdGFnIGF0dHJpYnV0ZXMgZnJvbSBzdXBlciBjbGFzcwotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlRm9yKHJlZ2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJc3VwZXIubG9hZENvbG9ycygpOwotCi0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0KLQkJCQkvLyB0aGlzIGlzIHdoYXQgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlci5wcm9wZXJ0eUNoYW5nZSgpIGRvZXMKLQkJCQlnZXRIaWdobGlnaHRlcigpLnJlZnJlc2hEaXNwbGF5KCk7Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIjZ2V0Q29sb3JQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg1OWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBQcm92aWRlcyBjb250ZXh0IGluZm9ybWF0aW9uIGZvciBIVE1MIHRhZ3MgKFNob3dzIHRvb2x0aXAgZGVzY3JpcHRpb24pCi0gKiAKLSAqIEBkZXByZWNhdGVkIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZQotICogICAgICAgICAgICAgaW5mb3JtYXRpb24gcHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEhUTUxJbmZvcm1hdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSUluZm9ybWF0aW9uUHJvdmlkZXIsIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uIHsKLQotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQotCXB1YmxpYyBIVE1MSW5mb3JtYXRpb25Qcm92aWRlcigpIHsKLQkJZlRleHRIb3ZlciA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXh0SG92ZXJNYW5hZ2VyKCkuY3JlYXRlQmVzdE1hdGNoSG92ZXIobmV3IEhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyI2dldFN1YmplY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRTdWJqZWN0KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXIjZ2V0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SW5mb3JtYXRpb24yKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbiNnZXRJbmZvcm1hdGlvbjIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uMihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJJbmZvKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTE4NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm8uWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yOwotCi0vKioKLSAqIFByb3ZpZGVzIGhvdmVyIGhlbHAgZG9jdW1lbnRhdGlvbiBmb3IgSFRNTCB0YWdzCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIEhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IgZXh0ZW5kcyBYTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IgewotCS8vCWN1cnJlbnRseSBlbXB0eSBiZWNhdXNlIFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciBoYW5kbGVzIGFsbCBjYXNlcyByZWxldmFudCB0byBIVE1MCi0JcHVibGljIEhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTdkMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5TaW1wbGVUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwgZXh0ZW5kcyBTaW1wbGVUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19UWVBFID0gZ2V0RW5jb2RpbmdUeXBlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RpbmdUeXBlKCkgewotCQlyZXR1cm4gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZW5jb2RpbmcgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJIVE1MKCkgewotCQlzdXBlcihFTkNPRElOR19UWVBFLCBIVE1MVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlc19lbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMTgwNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBIVE1MIHRlbXBsYXRlIGNvbnRleHQgdHlwZXMuIFRlbXBsYXRlcyBvZiB0aGlzIGNvbnRleHQgdHlwZQotICogYXBwbHkgdG8gYW55IHBsYWNlIHdpdGhpbiBIVE1MIGNvbnRlbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZSB7Ci0KLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRG9sbGFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlllYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0YjEzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEwgPSBnZXRBbGwoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURSA9IGdldEF0dHJpYnV0ZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFID0gZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVyA9IGdldE5ldygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gZ2V0VGFnKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWxsKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2FsbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYXR0cmlidXRlX3ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXcoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfbmV3IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUYWcoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfdGFnIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiAiaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0hUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0hUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNzVjZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9IVE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyd7JywgJ30nLCAnKCcsICcpJywgJ1snLCAnXScsJyInLCciJywnXCcnLCdcJyd9OwotCS8qKgotCSAqIEBwYXJhbSB2YWxpZENvbnRleHRzCi0JICogQHBhcmFtIG5leHRNYXRjaGVyCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyKCkgewotCQlzdXBlcihuZXcgU3RyaW5nW117RE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCwgRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwgRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVH0sIG5ldyBKYXZhUGFpck1hdGNoZXIoQlJBQ0tFVFMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0lKYXZhUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9JSmF2YVBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkODU2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0lKYXZhUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotLyoqCi0gKiBEZWZpbml0aW9uIG9mIEphdmEgcGFydGl0aW9uaW5nIGFuZCBpdHMgcGFydGl0aW9ucy4KLSAqIAotICogQHNlZSBFY2xpcHNlIDMuMQotICovCi1pbnRlcmZhY2UgSUphdmFQYXJ0aXRpb25zIHsKLQotCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBKYXZhIHBhcnRpdGlvbmluZy4KLQkgKi8KLQlTdHJpbmcgSkFWQV9QQVJUSVRJT05JTkcgPSAiX19famF2YV9wYXJ0aXRpb25pbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2luZ2xlLWxpbmUgKEpMUzI6IEVuZE9mTGluZUNvbW1lbnQpIGVuZCBjb21tZW50Ci0JICogcGFydGl0aW9uIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9TSU5HTEVfTElORV9DT01NRU5UID0gIl9famF2YV9zaW5nbGVsaW5lX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBtdWx0aS1saW5lIChKTFMyOiBUcmFkaXRpb25hbENvbW1lbnQpIGNvbW1lbnQgcGFydGl0aW9uCi0JICogY29udGVudCB0eXBlLgotCSAqLwotCVN0cmluZyBKQVZBX01VTFRJX0xJTkVfQ09NTUVOVCA9ICJfX2phdmFfbXVsdGlsaW5lX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgSmF2YWRvYyAoSkxTMjogRG9jdW1lbnRhdGlvbkNvbW1lbnQpIHBhcnRpdGlvbgotCSAqIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9ET0MgPSAiX19qYXZhX2phdmFkb2MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgSmF2YSBzdHJpbmcgcGFydGl0aW9uIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9TVFJJTkcgPSAiX19qYXZhX3N0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBKYXZhIGNoYXJhY3RlciBwYXJ0aXRpb24gY29udGVudCB0eXBlLgotCSAqLwotCVN0cmluZyBKQVZBX0NIQVJBQ1RFUiA9ICJfX2phdmFfY2hhcmFjdGVyIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhQ29kZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhQ29kZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2NhY2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmRlcml2ZWQuU2luZ2xlQ2hhclJlYWRlcjsKLQotLyoqCi0gKiBSZWFkcyBmcm9tIGEgZG9jdW1lbnQgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcy4gTWF5IGJlIGNvbmZpZ3VyZWQgdG8KLSAqIHNraXAgY29tbWVudHMgYW5kIHN0cmluZ3MuCi0gKi8KLWNsYXNzIEphdmFDb2RlUmVhZGVyIGV4dGVuZHMgU2luZ2xlQ2hhclJlYWRlciB7Ci0KLQkvKiogVGhlIEVPRiBjaGFyYWN0ZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0YgPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiBmU2tpcENvbW1lbnRzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZTa2lwU3RyaW5ncyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmRm9yd2FyZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0KLQlwcml2YXRlIGludCBmRW5kID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVOdW1iZXIgPSAtMTsKLQlwcml2YXRlIGludCBmQ2FjaGVkTGluZU9mZnNldCA9IC0xOwotCi0KLQlwdWJsaWMgSmF2YUNvZGVSZWFkZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IHJlYWQgY2hhcmFjdGVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQKLQkgKiBhZnRlciByZWFkIGhhcyBiZWVuIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZGb3J3YXJkID8gZk9mZnNldCAtIDEgOiBmT2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIHNraXBDb21tZW50cywgYm9vbGVhbiBza2lwU3RyaW5ncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZTa2lwQ29tbWVudHMgPSBza2lwQ29tbWVudHM7Ci0JCWZTa2lwU3RyaW5ncyA9IHNraXBTdHJpbmdzOwotCi0JCWZGb3J3YXJkID0gdHJ1ZTsKLQkJZkVuZCA9IE1hdGgubWluKGZEb2N1bWVudC5nZXRMZW5ndGgoKSwgZk9mZnNldCArIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29uZmlndXJlQmFja3dhcmRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBib29sZWFuIHNraXBDb21tZW50cywgYm9vbGVhbiBza2lwU3RyaW5ncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZTa2lwQ29tbWVudHMgPSBza2lwQ29tbWVudHM7Ci0JCWZTa2lwU3RyaW5ncyA9IHNraXBTdHJpbmdzOwotCi0JCWZGb3J3YXJkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlmQ2FjaGVkTGluZU51bWJlciA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgUmVhZGVyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFNpbmdsZUNoYXJSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmRm9yd2FyZCA/IHJlYWRGb3J3YXJkcygpIDogcmVhZEJhY2t3YXJkcygpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oeC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9Db21tZW50RW5kKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCQkJaWYgKGN1cnJlbnQgPT0gJyonKSB7Ci0JCQkJaWYgKGZPZmZzZXQgPCBmRW5kICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpID09ICcvJykgewotCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ0VuZChjaGFyIGRlbGltaXRlcikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCQkJaWYgKGN1cnJlbnQgPT0gJ1xcJykgewotCQkJCS8vIGlnbm9yZSBlc2NhcGVkIGNoYXJhY3RlcnMKLQkJCQkrK2ZPZmZzZXQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvTGluZUVuZCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJZk9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUgKyAxKTsKLQl9Ci0KLQlwcml2YXRlIGludCByZWFkRm9yd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0KLQkJCXN3aXRjaCAoY3VycmVudCkgewotCQkJCWNhc2UgJy8nIDoKLQotCQkJCQlpZiAoZlNraXBDb21tZW50cyAmJiBmT2Zmc2V0IDwgZkVuZCkgewotCQkJCQkJY2hhciBuZXh0ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBjb21tZW50IGVuZAotCQkJCQkJCSsrZk9mZnNldDsKLQkJCQkJCQlnb3RvQ29tbWVudEVuZCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobmV4dCA9PSAnLycpIHsKLQkJCQkJCQkvLyAnLy8nLWNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBsaW5lIGVuZAotCQkJCQkJCWdvdG9MaW5lRW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQotCQkJCWNhc2UgJyInIDoKLQkJCQljYXNlICdcJycgOgotCi0JCQkJCWlmIChmU2tpcFN0cmluZ3MpIHsKLQkJCQkJCWdvdG9TdHJpbmdFbmQoY3VycmVudCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCQkJfQotCi0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCi0JCXJldHVybiBFT0Y7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNpbmdsZUxpbmVDb21tZW50KCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaW50IGxpbmUgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQlpZiAobGluZSA8IGZDYWNoZWRMaW5lTnVtYmVyKSB7Ci0JCQlmQ2FjaGVkTGluZU51bWJlciA9IGxpbmU7Ci0JCQlmQ2FjaGVkTGluZU9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQkJaW50IG9mZnNldCA9IGZPZmZzZXQ7Ci0JCQl3aGlsZSAoZkNhY2hlZExpbmVPZmZzZXQgPCBvZmZzZXQpIHsKLQkJCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQtLSk7Ci0JCQkJaWYgKGN1cnJlbnQgPT0gJy8nICYmIGZDYWNoZWRMaW5lT2Zmc2V0IDw9IG9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpID09ICcvJykgewotCQkJCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9Db21tZW50U3RhcnQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQtLSk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicgJiYgMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpID09ICcvJykKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ1N0YXJ0KGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJaWYgKGN1cnJlbnQgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKCEoMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQgLSAxKSA9PSAnXFwnKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJLS1mT2Zmc2V0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVhZEJhY2t3YXJkcygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0KLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQktLWZPZmZzZXQ7Ci0KLQkJCWhhbmRsZVNpbmdsZUxpbmVDb21tZW50KCk7Ci0KLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLycgOgotCi0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPiAxKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgZW5kcywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBzdGFydAotCQkJCQkJCWZPZmZzZXQgLT0gMjsKLQkJCQkJCQlnb3RvQ29tbWVudFN0YXJ0KCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQotCQkJCWNhc2UgJyInIDoKLQkJCQljYXNlICdcJycgOgotCi0JCQkJCWlmIChmU2tpcFN0cmluZ3MpIHsKLQkJCQkJCS0tZk9mZnNldDsKLQkJCQkJCWdvdG9TdHJpbmdTdGFydChjdXJyZW50KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0KLQkJcmV0dXJuIEVPRjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFIZXVyaXN0aWNTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFIZXVyaXN0aWNTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjAyYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhSGV1cmlzdGljU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi0vLyB0YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRSZWdpb247Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIGZvciBoZXVyaXN0aWMgYmFzZWQgSmF2YSBtYW5pcHVsYXRpb25zIGluIGFuIGluY29tcGxldGUKLSAqIEphdmEgc291cmNlIGZpbGUuCi0gKiAKLSAqIDxwPgotICogQW4gaW5zdGFuY2UgaG9sZHMgc29tZSBpbnRlcm5hbCBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgYW5kIGlzIHRoZXJlZm9yZQotICogbm90IHRocmVhZHNhZmUuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgRWNsaXBzZSAzLjAKLSAqLwotZmluYWwgY2xhc3MgSmF2YUhldXJpc3RpY1NjYW5uZXIgaW1wbGVtZW50cyBTeW1ib2xzIHsKLQkvKioKLQkgKiBSZXR1cm5lZCBieSBhbGwgbWV0aG9kcyB3aGVuIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gY291bGQgbm90IGJlIGZvdW5kLAotCSAqIG9yIGlmIGEge0BsaW5rIEJhZExvY2F0aW9uRXhjZXB0aW9ufSB3YXMgdGhyb3duIHdoaWxlIHNjYW5uaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9GT1VORCA9IC0xOwotCi0JLyoqCi0JICogU3BlY2lhbCBib3VuZCBwYXJhbWV0ZXIgdGhhdCBtZWFucyBlaXRoZXIgLTEgKGJhY2t3YXJkIHNjYW5uaW5nKSBvcgotCSAqIDxjb2RlPmZEb2N1bWVudC5nZXRMZW5ndGgoKTwvY29kZT4gKGZvcndhcmQgc2Nhbm5pbmcpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQk9VTkQgPSAtMjsKLQotCi0JLyogY2hhcmFjdGVyIGNvbnN0YW50cyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTEJSQUNFID0gJ3snOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUkJSQUNFID0gJ30nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgTFBBUkVOID0gJygnOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUlBBUkVOID0gJyknOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0VNSUNPTE9OID0gJzsnOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ09MT04gPSAnOic7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBDT01NQSA9ICcsJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExCUkFDS0VUID0gJ1snOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUkJSQUNLRVQgPSAnXSc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBRVUVTVElPTk1BUksgPSAnPyc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBFUVVBTCA9ICc9JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExBTkdMRSA9ICc8JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJBTkdMRSA9ICc+JzsKLQotCS8qKgotCSAqIFNwZWNpZmllcyB0aGUgc3RvcCBjb25kaXRpb24sIHVwb24gd2hpY2ggdGhlIDxjb2RlPnNjYW5YWFg8L2NvZGU+Ci0JICogbWV0aG9kcyB3aWxsIGRlY2lkZSB3aGV0aGVyIHRvIGtlZXAgc2Nhbm5pbmcgb3Igbm90LiBUaGlzIGludGVyZmFjZSBtYXkKLQkgKiBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0b3BDb25kaXRpb24gewotCQkvKioKLQkJICogSW5zdHJ1Y3RzIHRoZSBzY2FubmVyIHRvIHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEBwYXJhbSBjaAotCQkgKiAgICAgICAgICAgIHRoZSBjaGFyIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uCi0JCSAqIEBwYXJhbSBwb3NpdGlvbgotCQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBvc2l0aW9uCi0JCSAqIEBwYXJhbSBmb3J3YXJkCi0JCSAqICAgICAgICAgICAgdGhlIGl0ZXJhdGlvbiBkaXJlY3Rpb24KLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RvcCBjb25kaXRpb24gaXMgbWV0LgotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCk7Ci0KLQkJLyoqCi0JCSAqIEFza3MgdGhlIGNvbmRpdGlvbiB0byByZXR1cm4gdGhlIG5leHQgcG9zaXRpb24gdG8gcXVlcnkuIFRoZQotCQkgKiBkZWZhdWx0IGlzIHRvIHJldHVybiB0aGUgbmV4dC9wcmV2aW91cyBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEByZXR1cm4gdGhlIG5leHQgcG9zaXRpb24gdG8gc2NhbgotCQkgKi8KLQkJcHVibGljIGludCBuZXh0UG9zaXRpb24oaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiBmb3J3YXJkID8gcG9zaXRpb24gKyAxIDogcG9zaXRpb24gLSAxOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdXBvbiBhIG5vbi13aGl0ZXNwYWNlIChhcyBkZWZpbmVkIGJ5Ci0JICoge0BsaW5rIENoYXJhY3RlciNpc1doaXRlc3BhY2UoY2hhcil9KSBjaGFyYWN0ZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uV2hpdGVzcGFjZSBleHRlbmRzIFN0b3BDb25kaXRpb24gewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jc3RvcChjaGFyKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJcmV0dXJuICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBzZWUgTm9uV2hpdGVzcGFjZQotCSAqLwotCXByaXZhdGUgZmluYWwgY2xhc3MgTm9uV2hpdGVzcGFjZURlZmF1bHRQYXJ0aXRpb24gZXh0ZW5kcyBOb25XaGl0ZXNwYWNlIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiBzdXBlci5zdG9wKGNoLCBwb3NpdGlvbiwgdHJ1ZSkgJiYgaXNEZWZhdWx0UGFydGl0aW9uKHBvc2l0aW9uKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNuZXh0UG9zaXRpb24oaW50LAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgaW50IG5leHRQb3NpdGlvbihpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IGdldFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCQlpZiAoZlBhcnRpdGlvbi5lcXVhbHMocGFydGl0aW9uLmdldFR5cGUoKSkpCi0JCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0KLQkJCWlmIChmb3J3YXJkKSB7Ci0JCQkJaW50IGVuZCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKSArIHBhcnRpdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQlpZiAocG9zaXRpb24gPCBlbmQpCi0JCQkJCXJldHVybiBlbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFydGl0aW9uLmdldE9mZnNldCgpOwotCQkJCWlmIChwb3NpdGlvbiA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIG9mZnNldCAtIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24tamF2YSBpZGVudGlmaWVyIChhcyBkZWZpbmVkIGJ5Ci0JICoge0BsaW5rIENoYXJhY3RlciNpc0phdmFJZGVudGlmaWVyUGFydChjaGFyKX0pIGNoYXJhY3Rlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb25KYXZhSWRlbnRpZmllclBhcnQgZXh0ZW5kcyBTdG9wQ29uZGl0aW9uIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGNoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24tamF2YSBpZGVudGlmaWVyIGNoYXJhY3RlciBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHNlZSBOb25KYXZhSWRlbnRpZmllclBhcnQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIE5vbkphdmFJZGVudGlmaWVyUGFydERlZmF1bHRQYXJ0aXRpb24gZXh0ZW5kcyBOb25KYXZhSWRlbnRpZmllclBhcnQgewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jc3RvcChjaGFyKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJcmV0dXJuIHN1cGVyLnN0b3AoY2gsIHBvc2l0aW9uLCB0cnVlKSB8fCAhaXNEZWZhdWx0UGFydGl0aW9uKHBvc2l0aW9uKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNuZXh0UG9zaXRpb24oaW50LAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgaW50IG5leHRQb3NpdGlvbihpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IGdldFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCQlpZiAoZlBhcnRpdGlvbi5lcXVhbHMocGFydGl0aW9uLmdldFR5cGUoKSkpCi0JCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0KLQkJCWlmIChmb3J3YXJkKSB7Ci0JCQkJaW50IGVuZCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKSArIHBhcnRpdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQlpZiAocG9zaXRpb24gPCBlbmQpCi0JCQkJCXJldHVybiBlbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFydGl0aW9uLmdldE9mZnNldCgpOwotCQkJCWlmIChwb3NpdGlvbiA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIG9mZnNldCAtIDE7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBjaGFyYWN0ZXIgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4KLQkgKiBjaGFyYWN0ZXIgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIENoYXJhY3Rlck1hdGNoIGV4dGVuZHMgU3RvcENvbmRpdGlvbiB7Ci0JCXByaXZhdGUgZmluYWwgY2hhcltdIGZDaGFyczsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICogCi0JCSAqIEBwYXJhbSBjaAotCQkgKiAgICAgICAgICAgIHRoZSBzaW5nbGUgY2hhcmFjdGVyIHRvIG1hdGNoCi0JCSAqLwotCQlwdWJsaWMgQ2hhcmFjdGVyTWF0Y2goY2hhciBjaCkgewotCQkJdGhpcyhuZXcgY2hhcltde2NofSk7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICogCi0JCSAqIEBwYXJhbSBjaGFycwotCQkgKiAgICAgICAgICAgIHRoZSBjaGFycyB0byBtYXRjaC4KLQkJICovCi0JCXB1YmxpYyBDaGFyYWN0ZXJNYXRjaChjaGFyW10gY2hhcnMpIHsKLQkJCUFzc2VydC5pc05vdE51bGwoY2hhcnMpOwotCQkJQXNzZXJ0LmlzVHJ1ZShjaGFycy5sZW5ndGggPiAwKTsKLQkJCWZDaGFycyA9IGNoYXJzOwotCQkJQXJyYXlzLnNvcnQoY2hhcnMpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhciwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdG9wKGNoYXIgY2gsIGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlyZXR1cm4gQXJyYXlzLmJpbmFyeVNlYXJjaChmQ2hhcnMsIGNoKSA+PSAwICYmIGlzRGVmYXVsdFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jbmV4dFBvc2l0aW9uKGludCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIGludCBuZXh0UG9zaXRpb24oaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBnZXRQYXJ0aXRpb24ocG9zaXRpb24pOwotCQkJaWYgKGZQYXJ0aXRpb24uZXF1YWxzKHBhcnRpdGlvbi5nZXRUeXBlKCkpKQotCQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOwotCi0JCQlpZiAoZm9yd2FyZCkgewotCQkJCWludCBlbmQgPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkgKyBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKHBvc2l0aW9uIDwgZW5kKQotCQkJCQlyZXR1cm4gZW5kOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQlpZiAocG9zaXRpb24gPiBvZmZzZXQpCi0JCQkJCXJldHVybiBvZmZzZXQgLSAxOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0JCX0KLQl9Ci0KLQkvKiogVGhlIGRvY3VtZW50IGJlaW5nIHNjYW5uZWQuICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCS8qKiBUaGUgcGFydGl0aW9uaW5nIGJlaW5nIHVzZWQgZm9yIHNjYW5uaW5nLiAqLwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmc7Ci0JLyoqIFRoZSBwYXJ0aXRpb24gdG8gc2NhbiBpbi4gKi8KLQlwcml2YXRlIFN0cmluZyBmUGFydGl0aW9uOwotCi0JLyogaW50ZXJuYWwgc2NhbiBzdGF0ZSAqLwotCi0JLyoqIHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgY2hhcmFjdGVyLiAqLwotCXByaXZhdGUgY2hhciBmQ2hhcjsKLQkvKiogdGhlIG1vc3QgcmVjZW50bHkgcmVhZCBwb3NpdGlvbi4gKi8KLQlwcml2YXRlIGludCBmUG9zOwotCi0JLyogcHJlc2V0IHN0b3AgY29uZGl0aW9ucyAqLwotCXByaXZhdGUgZmluYWwgU3RvcENvbmRpdGlvbiBmTm9uV1NEZWZhdWx0UGFydCA9IG5ldyBOb25XaGl0ZXNwYWNlRGVmYXVsdFBhcnRpdGlvbigpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0b3BDb25kaXRpb24gZk5vbldTID0gbmV3IE5vbldoaXRlc3BhY2UoKTsKLQlwcml2YXRlIGZpbmFsIFN0b3BDb25kaXRpb24gZk5vbklkZW50ID0gbmV3IE5vbkphdmFJZGVudGlmaWVyUGFydERlZmF1bHRQYXJ0aXRpb24oKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdG8gc2NhbgotCSAqIEBwYXJhbSBwYXJ0aXRpb25pbmcKLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb25pbmcgdG8gdXNlIGZvciBzY2FubmluZwotCSAqIEBwYXJhbSBwYXJ0aXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gdG8gc2NhbiBpbgotCSAqLwotCXB1YmxpYyBKYXZhSGV1cmlzdGljU2Nhbm5lcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwYXJ0aXRpb25pbmcsIFN0cmluZyBwYXJ0aXRpb24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCk7Ci0JCUFzc2VydC5pc05vdE51bGwocGFydGl0aW9uaW5nKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChwYXJ0aXRpb24pOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZlBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJZlBhcnRpdGlvbiA9IHBhcnRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscwotCSAqIDxjb2RlPnRoaXMoZG9jdW1lbnQsIElKYXZhUGFydGl0aW9ucy5KQVZBX1BBUlRJVElPTklORywgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdG8gc2Nhbi4KLQkgKi8KLQlwdWJsaWMgSmF2YUhldXJpc3RpY1NjYW5uZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoZG9jdW1lbnQsIElKYXZhUGFydGl0aW9ucy5KQVZBX1BBUlRJVElPTklORywgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBpbnRlcm5hbCBzY2FuIHBvc2l0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vc3QgcmVjZW50IGludGVybmFsIHNjYW4gcG9zaXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZQb3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiBpbiBmb3J3YXJkIGRpcmVjdGlvbiwgc3RhcnRpbmcgYXQKLQkgKiA8Y29kZT5zdGFydDwvY29kZT4sIGFuZCBub3QgZXh0ZW5kaW5nIGZ1cnRoZXIgdGhhbgotCSAqIDxjb2RlPmJvdW5kPC9jb2RlPi4gVGhlIHJldHVybiB2YWx1ZSBpcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkCi0JICogaW4ge0BsaW5rIFN5bWJvbHN9LiBBZnRlciBhIGNhbGwsIHtAbGluayAjZ2V0UG9zaXRpb24oKX0gd2lsbCByZXR1cm4KLQkgKiB0aGUgcG9zaXRpb24ganVzdCBhZnRlciB0aGUgc2Nhbm5lZCB0b2tlbiAoaS5lLiB0aGUgbmV4dCBwb3NpdGlvbiB0aGF0Ci0JICogd2lsbCBiZSBzY2FubmVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IHRvIGNvbnNpZGVyCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gbm90IHRvIGNvbnNpZGVyIGFueSBtb3JlCi0JICogQHJldHVybiBhIGNvbnN0YW50IGZyb20ge0BsaW5rIFN5bWJvbHN9IGRlc2NyaWJpbmcgdGhlIG5leHQgdG9rZW4KLQkgKi8KLQlwdWJsaWMgaW50IG5leHRUb2tlbihpbnQgc3RhcnQsIGludCBib3VuZCkgewotCQlpbnQgcG9zID0gc2NhbkZvcndhcmQoc3RhcnQsIGJvdW5kLCBmTm9uV1NEZWZhdWx0UGFydCk7Ci0JCWlmIChwb3MgPT0gTk9UX0ZPVU5EKQotCQkJcmV0dXJuIFRva2VuRU9GOwotCi0JCWZQb3MrKzsKLQotCQlzd2l0Y2ggKGZDaGFyKSB7Ci0JCQljYXNlIExCUkFDRSA6Ci0JCQkJcmV0dXJuIFRva2VuTEJSQUNFOwotCQkJY2FzZSBSQlJBQ0UgOgotCQkJCXJldHVybiBUb2tlblJCUkFDRTsKLQkJCWNhc2UgTEJSQUNLRVQgOgotCQkJCXJldHVybiBUb2tlbkxCUkFDS0VUOwotCQkJY2FzZSBSQlJBQ0tFVCA6Ci0JCQkJcmV0dXJuIFRva2VuUkJSQUNLRVQ7Ci0JCQljYXNlIExQQVJFTiA6Ci0JCQkJcmV0dXJuIFRva2VuTFBBUkVOOwotCQkJY2FzZSBSUEFSRU4gOgotCQkJCXJldHVybiBUb2tlblJQQVJFTjsKLQkJCWNhc2UgU0VNSUNPTE9OIDoKLQkJCQlyZXR1cm4gVG9rZW5TRU1JQ09MT047Ci0JCQljYXNlIENPTU1BIDoKLQkJCQlyZXR1cm4gVG9rZW5DT01NQTsKLQkJCWNhc2UgUVVFU1RJT05NQVJLIDoKLQkJCQlyZXR1cm4gVG9rZW5RVUVTVElPTk1BUks7Ci0JCQljYXNlIEVRVUFMIDoKLQkJCQlyZXR1cm4gVG9rZW5FUVVBTDsKLQkJCWNhc2UgTEFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5MRVNTVEhBTjsKLQkJCWNhc2UgUkFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5HUkVBVEVSVEhBTjsKLQkJfQotCi0JCS8vIGVsc2UKLQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChmQ2hhcikpIHsKLQkJCS8vIGFzc3VtZSBhbiBpZGVudCBvciBrZXl3b3JkCi0JCQlpbnQgZnJvbSA9IHBvcywgdG87Ci0JCQlwb3MgPSBzY2FuRm9yd2FyZChwb3MgKyAxLCBib3VuZCwgZk5vbklkZW50KTsKLQkJCWlmIChwb3MgPT0gTk9UX0ZPVU5EKQotCQkJCXRvID0gYm91bmQgPT0gVU5CT1VORCA/IGZEb2N1bWVudC5nZXRMZW5ndGgoKSA6IGJvdW5kOwotCQkJZWxzZQotCQkJCXRvID0gcG9zOwotCi0JCQlTdHJpbmcgaWRlbnRPcktleXdvcmQ7Ci0JCQl0cnkgewotCQkJCWlkZW50T3JLZXl3b3JkID0gZkRvY3VtZW50LmdldChmcm9tLCB0byAtIGZyb20pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gVG9rZW5FT0Y7Ci0JCQl9Ci0KLQkJCXJldHVybiBnZXRUb2tlbihpZGVudE9yS2V5d29yZCk7Ci0KLQotCQl9Ci0JCWVsc2UgewotCQkJLy8gb3BlcmF0b3JzLCBudW1iZXIgbGl0ZXJhbHMgZXRjCi0JCQlyZXR1cm4gVG9rZW5PVEhFUjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gaW4gYmFja3dhcmQgZGlyZWN0aW9uLCBzdGFydGluZyBhdAotCSAqIDxjb2RlPnN0YXJ0PC9jb2RlPiwgYW5kIG5vdCBleHRlbmRpbmcgZnVydGhlciB0aGFuCi0JICogPGNvZGU+Ym91bmQ8L2NvZGU+LiBUaGUgcmV0dXJuIHZhbHVlIGlzIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQKLQkgKiBpbiB7QGxpbmsgU3ltYm9sc30uIEFmdGVyIGEgY2FsbCwge0BsaW5rICNnZXRQb3NpdGlvbigpfSB3aWxsIHJldHVybgotCSAqIHRoZSBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUgc2Nhbm5lZCB0b2tlbiBzdGFydHMgKGkuZS4gdGhlIG5leHQKLQkgKiBwb3NpdGlvbiB0aGF0IHdpbGwgYmUgc2Nhbm5lZCkuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCB0byBjb25zaWRlcgotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIG5vdCB0byBjb25zaWRlciBhbnkgbW9yZQotCSAqIEByZXR1cm4gYSBjb25zdGFudCBmcm9tIHtAbGluayBTeW1ib2xzfSBkZXNjcmliaW5nIHRoZSBwcmV2aW91cyB0b2tlbgotCSAqLwotCXB1YmxpYyBpbnQgcHJldmlvdXNUb2tlbihpbnQgc3RhcnQsIGludCBib3VuZCkgewotCQlpbnQgcG9zID0gc2NhbkJhY2t3YXJkKHN0YXJ0LCBib3VuZCwgZk5vbldTRGVmYXVsdFBhcnQpOwotCQlpZiAocG9zID09IE5PVF9GT1VORCkKLQkJCXJldHVybiBUb2tlbkVPRjsKLQotCQlmUG9zLS07Ci0KLQkJc3dpdGNoIChmQ2hhcikgewotCQkJY2FzZSBMQlJBQ0UgOgotCQkJCXJldHVybiBUb2tlbkxCUkFDRTsKLQkJCWNhc2UgUkJSQUNFIDoKLQkJCQlyZXR1cm4gVG9rZW5SQlJBQ0U7Ci0JCQljYXNlIExCUkFDS0VUIDoKLQkJCQlyZXR1cm4gVG9rZW5MQlJBQ0tFVDsKLQkJCWNhc2UgUkJSQUNLRVQgOgotCQkJCXJldHVybiBUb2tlblJCUkFDS0VUOwotCQkJY2FzZSBMUEFSRU4gOgotCQkJCXJldHVybiBUb2tlbkxQQVJFTjsKLQkJCWNhc2UgUlBBUkVOIDoKLQkJCQlyZXR1cm4gVG9rZW5SUEFSRU47Ci0JCQljYXNlIFNFTUlDT0xPTiA6Ci0JCQkJcmV0dXJuIFRva2VuU0VNSUNPTE9OOwotCQkJY2FzZSBDT0xPTiA6Ci0JCQkJcmV0dXJuIFRva2VuQ09MT047Ci0JCQljYXNlIENPTU1BIDoKLQkJCQlyZXR1cm4gVG9rZW5DT01NQTsKLQkJCWNhc2UgUVVFU1RJT05NQVJLIDoKLQkJCQlyZXR1cm4gVG9rZW5RVUVTVElPTk1BUks7Ci0JCQljYXNlIEVRVUFMIDoKLQkJCQlyZXR1cm4gVG9rZW5FUVVBTDsKLQkJCWNhc2UgTEFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5MRVNTVEhBTjsKLQkJCWNhc2UgUkFOR0xFIDoKLQkJCQlyZXR1cm4gVG9rZW5HUkVBVEVSVEhBTjsKLQkJfQotCi0JCS8vIGVsc2UKLQkJaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChmQ2hhcikpIHsKLQkJCS8vIGFzc3VtZSBhbiBpZGVudCBvciBrZXl3b3JkCi0JCQlpbnQgZnJvbSwgdG8gPSBwb3MgKyAxOwotCQkJcG9zID0gc2NhbkJhY2t3YXJkKHBvcyAtIDEsIGJvdW5kLCBmTm9uSWRlbnQpOwotCQkJaWYgKHBvcyA9PSBOT1RfRk9VTkQpCi0JCQkJZnJvbSA9IGJvdW5kID09IFVOQk9VTkQgPyAwIDogYm91bmQgKyAxOwotCQkJZWxzZQotCQkJCWZyb20gPSBwb3MgKyAxOwotCi0JCQlTdHJpbmcgaWRlbnRPcktleXdvcmQ7Ci0JCQl0cnkgewotCQkJCWlkZW50T3JLZXl3b3JkID0gZkRvY3VtZW50LmdldChmcm9tLCB0byAtIGZyb20pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gVG9rZW5FT0Y7Ci0JCQl9Ci0KLQkJCXJldHVybiBnZXRUb2tlbihpZGVudE9yS2V5d29yZCk7Ci0KLQotCQl9Ci0JCWVsc2UgewotCQkJLy8gb3BlcmF0b3JzLCBudW1iZXIgbGl0ZXJhbHMgZXRjCi0JCQlyZXR1cm4gVG9rZW5PVEhFUjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBvbmUgb2YgdGhlIGtleXdvcmQgY29uc3RhbnRzIG9yIDxjb2RlPlRva2VuSURFTlQ8L2NvZGU+IGZvciBhCi0JICogc2Nhbm5lZCBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBhIHNjYW5uZWQgaWRlbnRpZmllcgotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB7QGxpbmsgU3ltYm9sc30KLQkgKi8KLQlwcml2YXRlIGludCBnZXRUb2tlbihTdHJpbmcgcykgewotCQlBc3NlcnQuaXNOb3ROdWxsKHMpOwotCi0JCXN3aXRjaCAocy5sZW5ndGgoKSkgewotCQkJY2FzZSAyIDoKLQkJCQlpZiAoImlmIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuSUY7Ci0JCQkJaWYgKCJkbyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkRPOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzIDoKLQkJCQlpZiAoImZvciIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkZPUjsKLQkJCQlpZiAoInRyeSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblRSWTsKLQkJCQlpZiAoIm5ldyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbk5FVzsKLQkJCQlicmVhazsKLQkJCWNhc2UgNCA6Ci0JCQkJaWYgKCJjYXNlIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuQ0FTRTsKLQkJCQlpZiAoImVsc2UiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5FTFNFOwotCQkJCWlmICgiZW51bSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkVOVU07Ci0JCQkJaWYgKCJnb3RvIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuR09UTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgNSA6Ci0JCQkJaWYgKCJicmVhayIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkJSRUFLOwotCQkJCWlmICgiY2F0Y2giLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5DQVRDSDsKLQkJCQlpZiAoImNsYXNzIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuQ0xBU1M7Ci0JCQkJaWYgKCJ3aGlsZSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbldISUxFOwotCQkJCWJyZWFrOwotCQkJY2FzZSA2IDoKLQkJCQlpZiAoInJldHVybiIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblJFVFVSTjsKLQkJCQlpZiAoInN0YXRpYyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblNUQVRJQzsKLQkJCQlpZiAoInN3aXRjaCIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblNXSVRDSDsKLQkJCQlicmVhazsKLQkJCWNhc2UgNyA6Ci0JCQkJaWYgKCJkZWZhdWx0Ii5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuREVGQVVMVDsKLQkJCQlpZiAoImZpbmFsbHkiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5GSU5BTExZOwotCQkJCWJyZWFrOwotCQkJY2FzZSA5IDoKLQkJCQlpZiAoImludGVyZmFjZSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbklOVEVSRkFDRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTIgOgotCQkJCWlmICgic3luY2hyb25pemVkIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuU1lOQ0hST05JWkVEOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBUb2tlbklERU5UOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChmb3J3YXJkIHNlYXJjaCkuCi0JICogQW55IHNjb3BlcyBpbnRyb2R1Y2VkIGJ5IG9wZW5pbmcgcGVlcnMgYXJlIHNraXBwZWQuIEFsbCBwZWVycyBhY2NvdW50ZWQKLQkgKiBmb3IgbXVzdCByZXNpZGUgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCA8Y29kZT5zdGFydDwvY29kZT4gbXVzdCBub3QgcG9pbnQgdG8gdGhlIG9wZW5pbmcgcGVlciwgYnV0Ci0JICogdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBiZWluZyBzZWFyY2hlZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgc3RhcnQgcG9zaXRpb24KLQkgKiBAcGFyYW0gb3BlbmluZ1BlZXIKLQkgKiAgICAgICAgICAgIHRoZSBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd7JykKLQkgKiBAcGFyYW0gY2xvc2luZ1BlZXIKLQkgKiAgICAgICAgICAgIHRoZSBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIChlLmcuICd9JykKLQkgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBwZWVyIGNoYXJhY3RlciBwb3NpdGlvbiwgb3IgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQgZmluZENsb3NpbmdQZWVyKGludCBzdGFydCwgZmluYWwgY2hhciBvcGVuaW5nUGVlciwgZmluYWwgY2hhciBjbG9zaW5nUGVlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGZEb2N1bWVudCk7Ci0JCUFzc2VydC5pc1RydWUoc3RhcnQgPj0gMCk7Ci0KLQkJdHJ5IHsKLQkJCWludCBkZXB0aCA9IDE7Ci0JCQlzdGFydCAtPSAxOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlzdGFydCA9IHNjYW5Gb3J3YXJkKHN0YXJ0ICsgMSwgVU5CT1VORCwgbmV3IENoYXJhY3Rlck1hdGNoKG5ldyBjaGFyW117b3BlbmluZ1BlZXIsIGNsb3NpbmdQZWVyfSkpOwotCQkJCWlmIChzdGFydCA9PSBOT1RfRk9VTkQpCi0JCQkJCXJldHVybiBOT1RfRk9VTkQ7Ci0KLQkJCQlpZiAoZkRvY3VtZW50LmdldENoYXIoc3RhcnQpID09IG9wZW5pbmdQZWVyKQotCQkJCQlkZXB0aCsrOwotCQkJCWVsc2UKLQkJCQkJZGVwdGgtLTsKLQotCQkJCWlmIChkZXB0aCA9PSAwKQotCQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIE5PVF9GT1VORDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIChiYWNrd2FyZCBzZWFyY2gpLgotCSAqIEFueSBzY29wZXMgaW50cm9kdWNlZCBieSBjbG9zaW5nIHBlZXJzIGFyZSBza2lwcGVkLiBBbGwgcGVlcnMgYWNjb3VudGVkCi0JICogZm9yIG11c3QgcmVzaWRlIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgPGNvZGU+c3RhcnQ8L2NvZGU+IG11c3Qgbm90IHBvaW50IHRvIHRoZSBjbG9zaW5nIHBlZXIsIGJ1dAotCSAqIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYmVpbmcgc2VhcmNoZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JICogQHBhcmFtIG9wZW5pbmdQZWVyCi0JICogICAgICAgICAgICB0aGUgb3BlbmluZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAneycpCi0JICogQHBhcmFtIGNsb3NpbmdQZWVyCi0JICogICAgICAgICAgICB0aGUgY2xvc2luZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAnfScpCi0JICogQHJldHVybiB0aGUgbWF0Y2hpbmcgcGVlciBjaGFyYWN0ZXIgcG9zaXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgaW50IGZpbmRPcGVuaW5nUGVlcihpbnQgc3RhcnQsIGNoYXIgb3BlbmluZ1BlZXIsIGNoYXIgY2xvc2luZ1BlZXIpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzdGFydCA8IGZEb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0KLQkJdHJ5IHsKLQkJCWludCBkZXB0aCA9IDE7Ci0JCQlzdGFydCArPSAxOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlzdGFydCA9IHNjYW5CYWNrd2FyZChzdGFydCAtIDEsIFVOQk9VTkQsIG5ldyBDaGFyYWN0ZXJNYXRjaChuZXcgY2hhcltde29wZW5pbmdQZWVyLCBjbG9zaW5nUGVlcn0pKTsKLQkJCQlpZiAoc3RhcnQgPT0gTk9UX0ZPVU5EKQotCQkJCQlyZXR1cm4gTk9UX0ZPVU5EOwotCi0JCQkJaWYgKGZEb2N1bWVudC5nZXRDaGFyKHN0YXJ0KSA9PSBjbG9zaW5nUGVlcikKLQkJCQkJZGVwdGgrKzsKLQkJCQllbHNlCi0JCQkJCWRlcHRoLS07Ci0KLQkJCQlpZiAoZGVwdGggPT0gMCkKLQkJCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBOT1RfRk9VTkQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgc3Vycm91bmRpbmcgYmxvY2sgYXJvdW5kIDxjb2RlPm9mZnNldDwvY29kZT4uIFRoZQotCSAqIHNlYXJjaCBpcyBzdGFydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgPGNvZGU+b2Zmc2V0PC9jb2RlPiwgaS5lLiBhbgotCSAqIG9wZW5pbmcgYnJhY2UgYXQgPGNvZGU+b2Zmc2V0PC9jb2RlPiB3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZQotCSAqIHN1cnJvdW5kaW5nIGJsb2NrLCBidXQgYSBjbG9zaW5nIGJyYWNlIHdpbGwuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBmb3Igd2hpY2ggdGhlIHN1cnJvdW5kaW5nIGJsb2NrIGlzIGNvbXB1dGVkCi0JICogQHJldHVybiBhIHJlZ2lvbiBkZXNjcmliaW5nIHRoZSBzdXJyb3VuZGluZyBibG9jaywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIElSZWdpb24gZmluZFN1cnJvdW5kaW5nQmxvY2soaW50IG9mZnNldCkgewotCQlpZiAob2Zmc2V0IDwgMSB8fCBvZmZzZXQgPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGJlZ2luID0gZmluZE9wZW5pbmdQZWVyKG9mZnNldCAtIDEsIExCUkFDRSwgUkJSQUNFKTsKLQkJaW50IGVuZCA9IGZpbmRDbG9zaW5nUGVlcihvZmZzZXQsIExCUkFDRSwgUkJSQUNFKTsKLQkJaWYgKGJlZ2luID09IE5PVF9GT1VORCB8fCBlbmQgPT0gTk9UX0ZPVU5EKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgUmVnaW9uKGJlZ2luLCBlbmQgKyAxIC0gYmVnaW4pOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkRvY3VtZW50LmdldENoYXIocG9zKSk8L2NvZGU+Ci0JICogZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0Ci0JICogcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmZ3Q7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgc21hbGxlc3QgcG9zaXRpb24gb2YgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gWzxjb2RlPnBvc2l0aW9uPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPmJvdW5kPC9jb2RlPikgdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBmaW5kTm9uV2hpdGVzcGFjZUZvcndhcmQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJcmV0dXJuIHNjYW5Gb3J3YXJkKHBvc2l0aW9uLCBib3VuZCwgZk5vbldTRGVmYXVsdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkRvY3VtZW50LmdldENoYXIocG9zKSk8L2NvZGU+Ci0JICogZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmd0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIHNtYWxsZXN0IHBvc2l0aW9uIG9mIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIFs8Y29kZT5wb3NpdGlvbjwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5ib3VuZDwvY29kZT4pLCBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuCi0JICogICAgICAgICBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgZmluZE5vbldoaXRlc3BhY2VGb3J3YXJkSW5BbnlQYXJ0aXRpb24oaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJcmV0dXJuIHNjYW5Gb3J3YXJkKHBvc2l0aW9uLCBib3VuZCwgZk5vbldTKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmbHQ7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZndDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkRvY3VtZW50LmdldENoYXIocG9zKSk8L2NvZGU+Ci0JICogZXZhbHVhdGVzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0Ci0JICogcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmbHQ7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgaGlnaGVzdCBwb3NpdGlvbiBvZiBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IGZpbmROb25XaGl0ZXNwYWNlQmFja3dhcmQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJcmV0dXJuIHNjYW5CYWNrd2FyZChwb3NpdGlvbiwgYm91bmQsIGZOb25XU0RlZmF1bHRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgbG93ZXN0IHBvc2l0aW9uIDxjb2RlPnA8L2NvZGU+IGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4KLQkgKiBzdWNoIHRoYXQgPGNvZGU+c3RhcnQ8L2NvZGU+ICZsdDs9IHAgJmx0OyA8Y29kZT5ib3VuZDwvY29kZT4gYW5kCi0JICogPGNvZGU+Y29uZGl0aW9uLnN0b3AoZkRvY3VtZW50LmdldENoYXIocCksIHApPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmd0OwotCSAqICAgICAgICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjb25kaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5TdG9wQ29uZGl0aW9uPC9jb2RlPiB0byBjaGVjawotCSAqIEByZXR1cm4gdGhlIGxvd2VzdCBwb3NpdGlvbiBpbiBbPGNvZGU+c3RhcnQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+Ym91bmQ8L2NvZGU+KSBmb3Igd2hpY2ggPGNvZGU+Y29uZGl0aW9uPC9jb2RlPgotCSAqICAgICAgICAgaG9sZHMsIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5Gb3J3YXJkKGludCBzdGFydCwgaW50IGJvdW5kLCBTdG9wQ29uZGl0aW9uIGNvbmRpdGlvbikgewotCQlBc3NlcnQuaXNUcnVlKHN0YXJ0ID49IDApOwotCi0JCWlmIChib3VuZCA9PSBVTkJPVU5EKQotCQkJYm91bmQgPSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJQXNzZXJ0LmlzVHJ1ZShib3VuZCA8PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCi0JCXRyeSB7Ci0JCQlmUG9zID0gc3RhcnQ7Ci0JCQl3aGlsZSAoZlBvcyA8IGJvdW5kKSB7Ci0KLQkJCQlmQ2hhciA9IGZEb2N1bWVudC5nZXRDaGFyKGZQb3MpOwotCQkJCWlmIChjb25kaXRpb24uc3RvcChmQ2hhciwgZlBvcywgdHJ1ZSkpCi0JCQkJCXJldHVybiBmUG9zOwotCi0JCQkJZlBvcyA9IGNvbmRpdGlvbi5uZXh0UG9zaXRpb24oZlBvcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gTk9UX0ZPVU5EOwotCX0KLQotCi0JLyoqCi0JICogRmluZHMgdGhlIGxvd2VzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmZ3Q7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPmZEb2N1bWVudC5nZXRDaGFyKHBvc2l0aW9uKSA9PSBjaDwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gYW5kIHRoZSBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY2gKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5jaGFyPC9jb2RlPiB0byBzZWFyY2ggZm9yCi0JICogQHJldHVybiB0aGUgbG93ZXN0IHBvc2l0aW9uIG9mIDxjb2RlPmNoPC9jb2RlPiBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5Gb3J3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kLCBjaGFyIGNoKSB7Ci0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaCkpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBsb3dlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmd0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmbHQ7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5mRG9jdW1lbnQuZ2V0Q2hhcihwb3NpdGlvbikgPT0gY2g8L2NvZGU+IGV2YWx1YXRlcyB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhdCBsZWFzdCBvbmUgY2ggaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGFuZCB0aGUKLQkgKiBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY2hhcnMKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIDxjb2RlPmNoYXI8L2NvZGU+IHRvIHNlYXJjaCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBsb3dlc3QgcG9zaXRpb24gb2YgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gWzxjb2RlPnBvc2l0aW9uPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPmJvdW5kPC9jb2RlPikgdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBzY2FuRm9yd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhcltdIGNoYXJzKSB7Ci0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaGFycykpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBoaWdoZXN0IHBvc2l0aW9uIDxjb2RlPnA8L2NvZGU+IGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4KLQkgKiBzdWNoIHRoYXQgPGNvZGU+Ym91bmQ8L2NvZGU+ICZsdDsgPGNvZGU+cDwvY29kZT4gJmx0Oz0KLQkgKiA8Y29kZT5zdGFydDwvY29kZT4gYW5kCi0JICogPGNvZGU+Y29uZGl0aW9uLnN0b3AoZkRvY3VtZW50LmdldENoYXIocCksIHApPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OwotCSAqICAgICAgICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjb25kaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5TdG9wQ29uZGl0aW9uPC9jb2RlPiB0byBjaGVjawotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gaW4gKDxjb2RlPmJvdW5kPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiBmb3Igd2hpY2ggPGNvZGU+Y29uZGl0aW9uPC9jb2RlPiBob2xkcywKLQkgKiAgICAgICAgIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5CYWNrd2FyZChpbnQgc3RhcnQsIGludCBib3VuZCwgU3RvcENvbmRpdGlvbiBjb25kaXRpb24pIHsKLQkJaWYgKGJvdW5kID09IFVOQk9VTkQpCi0JCQlib3VuZCA9IC0xOwotCi0JCUFzc2VydC5pc1RydWUoYm91bmQgPj0gLTEpOwotCQlBc3NlcnQuaXNUcnVlKHN0YXJ0IDwgZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQotCQl0cnkgewotCQkJZlBvcyA9IHN0YXJ0OwotCQkJd2hpbGUgKGZQb3MgPiBib3VuZCkgewotCi0JCQkJZkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmUG9zKTsKLQkJCQlpZiAoY29uZGl0aW9uLnN0b3AoZkNoYXIsIGZQb3MsIGZhbHNlKSkKLQkJCQkJcmV0dXJuIGZQb3M7Ci0KLQkJCQlmUG9zID0gY29uZGl0aW9uLm5leHRQb3NpdGlvbihmUG9zLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gTk9UX0ZPVU5EOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBoaWdoZXN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gc3VjaCB0aGF0IHRoZQotCSAqIHBvc2l0aW9uIGlzICZsdDs9IDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBhbmQgJmd0OyA8Y29kZT5ib3VuZDwvY29kZT4KLQkgKiBhbmQgPGNvZGU+ZkRvY3VtZW50LmdldENoYXIocG9zaXRpb24pID09IGNoPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYXQgbGVhc3Qgb25lIGNoIGluIDxjb2RlPmNoYXJzPC9jb2RlPiBhbmQgdGhlCi0JICogcG9zaXRpb24gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmbHQ7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHBhcmFtIGNoCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gb2Ygb25lIGVsZW1lbnQgaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGluICg8Y29kZT5ib3VuZDwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT5dIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvcgotCSAqICAgICAgICAgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgc2NhbkJhY2t3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kLCBjaGFyIGNoKSB7Ci0JCXJldHVybiBzY2FuQmFja3dhcmQocG9zaXRpb24sIGJvdW5kLCBuZXcgQ2hhcmFjdGVyTWF0Y2goY2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmbHQ7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZndDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPmZEb2N1bWVudC5nZXRDaGFyKHBvc2l0aW9uKSA9PSBjaDwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGF0IGxlYXN0IG9uZSBjaCBpbiA8Y29kZT5jaGFyczwvY29kZT4gYW5kIHRoZQotCSAqIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjaGFycwotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gb2Ygb25lIGVsZW1lbnQgaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGluICg8Y29kZT5ib3VuZDwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT5dIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvcgotCSAqICAgICAgICAgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgc2NhbkJhY2t3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kLCBjaGFyW10gY2hhcnMpIHsKLQkJcmV0dXJuIHNjYW5CYWNrd2FyZChwb3NpdGlvbiwgYm91bmQsIG5ldyBDaGFyYWN0ZXJNYXRjaChjaGFycykpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiByZXNpZGVzIGluIGEgZGVmYXVsdCAoSmF2YSkKLQkgKiBwYXJ0aXRpb24gb2YgPGNvZGU+ZkRvY3VtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5wb3NpdGlvbjwvY29kZT4gaXMgaW4gdGhlCi0JICogICAgICAgICBkZWZhdWx0IHBhcnRpdGlvbiBvZiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFBhcnRpdGlvbihpbnQgcG9zaXRpb24pIHsKLQkJQXNzZXJ0LmlzVHJ1ZShwb3NpdGlvbiA+PSAwKTsKLQkJQXNzZXJ0LmlzVHJ1ZShwb3NpdGlvbiA8PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZlBhcnRpdGlvbi5lcXVhbHMoVGV4dFV0aWxpdGllcy5nZXRDb250ZW50VHlwZShmRG9jdW1lbnQsIGZQYXJ0aXRpb25pbmcsIHBvc2l0aW9uLCBmYWxzZSkpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gYXQgPGNvZGU+cG9zaXRpb248L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHRvIGdldCB0aGUgcGFydGl0aW9uIGZvcgotCSAqIEByZXR1cm4gdGhlIHBhcnRpdGlvbiBhdCA8Y29kZT5wb3NpdGlvbjwvY29kZT4gb3IgYSBkdW1teSB6ZXJvLWxlbmd0aAotCSAqICAgICAgICAgcGFydGl0aW9uIGlmIGFjY2Vzc2luZyB0aGUgZG9jdW1lbnQgZmFpbHMKLQkgKi8KLQlwcml2YXRlIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oaW50IHBvc2l0aW9uKSB7Ci0JCUFzc2VydC5pc1RydWUocG9zaXRpb24gPj0gMCk7Ci0JCUFzc2VydC5pc1RydWUocG9zaXRpb24gPD0gZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQotCQl0cnkgewotCQkJcmV0dXJuIFRleHRVdGlsaXRpZXMuZ2V0UGFydGl0aW9uKGZEb2N1bWVudCwgZlBhcnRpdGlvbmluZywgcG9zaXRpb24sIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBUeXBlZFJlZ2lvbihwb3NpdGlvbiwgMCwgIl9fbm9fcGFydGl0aW9uX2F0X2FsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgbGluZSBzZWVtcyB0byBiZSBhbiBvcGVuIGNvbmRpdGlvbiBub3QgZm9sbG93ZWQgYnkgYQotCSAqIGJsb2NrIChpLmUuIGFuIGlmLCB3aGlsZSwgb3IgZm9yIHN0YXRlbWVudCB3aXRoIGp1c3Qgb25lIGZvbGxvd2luZwotCSAqIHN0YXRlbWVudCwgc2VlIGV4YW1wbGUgYmVsb3cpLgotCSAqIAotCSAqIDxwcmU+Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJZG9TdHVmZigpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIDxwPgotCSAqIEFsZ29yaXRobTogaWYgdGhlIGxhc3Qgbm9uLVdTLCBub24tQ29tbWVudCBjb2RlIG9uIHRoZSBsaW5lIGlzIGFuIGlmCi0JICogKGNvbmRpdGlvbiksIHdoaWxlIChjb25kaXRpb24pLCBmb3IoIGV4cHJlc3Npb24pLCBkbywgZWxzZSwgYW5kIHRoZXJlCi0JICogaXMgbm8gc3RhdGVtZW50IGFmdGVyIHRoYXQKLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgaW5zZXJ0IHBvc2l0aW9uIG9mIHRoZSBuZXcgY2hhcmFjdGVyCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgbG93ZXN0IHBvc2l0aW9uIHRvIGNvbnNpZGVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29kZSBpcyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBvcgotCSAqICAgICAgICAgbG9vcCB3aXRob3V0IGEgYmxvY2ssIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JyYWNlbGVzc0Jsb2NrU3RhcnQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQpIHsKLQkJaWYgKHBvc2l0aW9uIDwgMSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlzd2l0Y2ggKHByZXZpb3VzVG9rZW4ocG9zaXRpb24sIGJvdW5kKSkgewotCQkJY2FzZSBUb2tlbkRPIDoKLQkJCWNhc2UgVG9rZW5FTFNFIDoKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWNhc2UgVG9rZW5SUEFSRU4gOgotCQkJCXBvc2l0aW9uID0gZmluZE9wZW5pbmdQZWVyKGZQb3MsIExQQVJFTiwgUlBBUkVOKTsKLQkJCQlpZiAocG9zaXRpb24gPiAwKSB7Ci0JCQkJCXN3aXRjaCAocHJldmlvdXNUb2tlbihwb3NpdGlvbiAtIDEsIGJvdW5kKSkgewotCQkJCQkJY2FzZSBUb2tlbklGIDoKLQkJCQkJCWNhc2UgVG9rZW5GT1IgOgotCQkJCQkJY2FzZSBUb2tlbldISUxFIDoKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFQYWlyTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNzY5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFQYWlyTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dDsKLQotLy8gdGFrZW4gZnJvbSBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLQotY2xhc3MgSmF2YVBhaXJNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBjaGFyW10gZlBhaXJzOwotCXByb3RlY3RlZCBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBpbnQgZk9mZnNldDsKLQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0UG9zOwotCXByb3RlY3RlZCBpbnQgZkVuZFBvczsKLQlwcm90ZWN0ZWQgaW50IGZBbmNob3I7Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvZGVSZWFkZXIgZlJlYWRlciA9IG5ldyBKYXZhQ29kZVJlYWRlcigpOwotCS8qKgotCSAqIFN0b3JlcyB0aGUgc291cmNlIHZlcnNpb24gc3RhdGUuCi0JICogCi0JICogQHNlZSBFY2xpcHNlICAzLjEKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZkhpZ2hsaWdodEFuZ3VsYXJCcmFja2V0cyA9IGZhbHNlOwotCi0KLQlwdWJsaWMgSmF2YVBhaXJNYXRjaGVyKGNoYXJbXSBwYWlycykgewotCQlmUGFpcnMgPSBwYWlyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNtYXRjaChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBtYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQotCQlpZihvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBkb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBtYXRjaFBhaXJzQXQoKSAmJiBmU3RhcnRQb3MgIT0gZkVuZFBvcykKLQkJCXJldHVybiBuZXcgUmVnaW9uKGZTdGFydFBvcywgZkVuZFBvcyAtIGZTdGFydFBvcyArIDEpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2dldEFuY2hvcigpCi0JICovCi0JcHVibGljIGludCBnZXRBbmNob3IoKSB7Ci0JCXJldHVybiBmQW5jaG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNsZWFyKCk7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZSZWFkZXIgPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAoZlJlYWRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaFBhaXJzQXQoKSB7Ci0KLQkJaW50IGk7Ci0JCWludCBwYWlySW5kZXgxID0gZlBhaXJzLmxlbmd0aDsKLQkJaW50IHBhaXJJbmRleDIgPSBmUGFpcnMubGVuZ3RoOwotCi0JCWZTdGFydFBvcyA9IC0xOwotCQlmRW5kUG9zID0gLTE7Ci0KLQkJLy8gZ2V0IHRoZSBjaGFycyBwcmVjZWRpbmcgYW5kIGZvbGxvd2luZyB0aGUgc3RhcnQgcG9zaXRpb24KLQkJdHJ5IHsKLQotCQkJY2hhciBwcmV2Q2hhciA9IGZEb2N1bWVudC5nZXRDaGFyKE1hdGgubWF4KGZPZmZzZXQgLSAxLCAwKSk7Ci0JCQkvLyBtb2RpZmllZCBiZWhhdmlvciBmb3IKLQkJCS8vIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4NzkKLQkJCS8vIGNoYXIgbmV4dENoYXI9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCi0JCQkvLyBzZWFyY2ggZm9yIG9wZW5pbmcgcGVlciBjaGFyYWN0ZXIgbmV4dCB0byB0aGUgYWN0aXZhdGlvbiBwb2ludAotCQkJZm9yIChpID0gMDsgaSA8IGZQYWlycy5sZW5ndGg7IGkgPSBpICsgMikgewotCQkJCS8vIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLyBmU3RhcnRQb3M9IGZPZmZzZXQ7Ci0JCQkJLy8gcGFpckluZGV4MT0gaTsKLQkJCQkvLyB9IGVsc2UKLQkJCQlpZiAocHJldkNoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJCWZTdGFydFBvcyA9IGZPZmZzZXQgLSAxOwotCQkJCQlwYWlySW5kZXgxID0gaTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNlYXJjaCBmb3IgY2xvc2luZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmRW5kUG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDIgPSBpOwotCQkJCX0KLQkJCQkvLyBlbHNlIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLyBmRW5kUG9zPSBmT2Zmc2V0OwotCQkJCS8vIHBhaXJJbmRleDI9IGk7Ci0JCQkJLy8gfQotCQkJfQotCi0JCQlpZiAoZkVuZFBvcyA+IC0xKSB7Ci0JCQkJZkFuY2hvciA9IFJJR0hUOwotCQkJCWZTdGFydFBvcyA9IHNlYXJjaEZvck9wZW5pbmdQZWVyKGZFbmRQb3MsIGZQYWlyc1twYWlySW5kZXgyIC0gMV0sIGZQYWlyc1twYWlySW5kZXgyXSwgZkRvY3VtZW50KTsKLQkJCQlpZiAoZlN0YXJ0UG9zID4gLTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZkVuZFBvcyA9IC0xOwotCQkJfQotCQkJZWxzZSBpZiAoZlN0YXJ0UG9zID4gLTEpIHsKLQkJCQlmQW5jaG9yID0gTEVGVDsKLQkJCQlmRW5kUG9zID0gc2VhcmNoRm9yQ2xvc2luZ1BlZXIoZlN0YXJ0UG9zLCBmUGFpcnNbcGFpckluZGV4MV0sIGZQYWlyc1twYWlySW5kZXgxICsgMV0sIGZEb2N1bWVudCk7Ci0JCQkJaWYgKGZFbmRQb3MgPiAtMSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlmU3RhcnRQb3MgPSAtMTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHNlYXJjaEZvckNsb3NpbmdQZWVyKGludCBvZmZzZXQsIGludCBvcGVuaW5nUGVlciwgaW50IGNsb3NpbmdQZWVyLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChvcGVuaW5nUGVlciA9PSAnPCcgJiYgIShmSGlnaGxpZ2h0QW5ndWxhckJyYWNrZXRzICYmIGlzVHlwZVBhcmFtZXRlckJyYWNrZXQob2Zmc2V0LCBkb2N1bWVudCkpKQotCQkJcmV0dXJuIC0xOwotCi0JCWZSZWFkZXIuY29uZmlndXJlRm9yd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0ICsgMSwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCksIHRydWUsIHRydWUpOwotCi0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEphdmFDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gb3BlbmluZ1BlZXIgJiYgYyAhPSBjbG9zaW5nUGVlcikKLQkJCQlzdGFjaysrOwotCQkJZWxzZSBpZiAoYyA9PSBjbG9zaW5nUGVlcikKLQkJCQlzdGFjay0tOwotCi0JCQlpZiAoc3RhY2sgPT0gMCkKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQotCQkJYyA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JcHJvdGVjdGVkIGludCBzZWFyY2hGb3JPcGVuaW5nUGVlcihpbnQgb2Zmc2V0LCBpbnQgb3BlbmluZ1BlZXIsIGludCBjbG9zaW5nUGVlciwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAob3BlbmluZ1BlZXIgPT0gJzwnICYmICFmSGlnaGxpZ2h0QW5ndWxhckJyYWNrZXRzKQotCQkJcmV0dXJuIC0xOwotCi0JCWZSZWFkZXIuY29uZmlndXJlQmFja3dhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJaW50IHN0YWNrID0gMTsKLQkJaW50IGMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gSmF2YUNvZGVSZWFkZXIuRU9GKSB7Ci0JCQlpZiAoYyA9PSBjbG9zaW5nUGVlciAmJiBjICE9IG9wZW5pbmdQZWVyKQotCQkJCXN0YWNrKys7Ci0JCQllbHNlIGlmIChjID09IG9wZW5pbmdQZWVyKQotCQkJCXN0YWNrLS07Ci0KLQkJCWlmIChzdGFjayA9PSAwKSB7Ci0JCQkJaWYgKGNsb3NpbmdQZWVyID09ICc+JyAmJiAhaXNUeXBlUGFyYW1ldGVyQnJhY2tldChmUmVhZGVyLmdldE9mZnNldCgpLCBkb2N1bWVudCkpCi0JCQkJCXJldHVybiAtMTsKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQkJCX0KLQotCQkJYyA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgYW5ndWxhciBicmFja2V0IGF0IDxjb2RlPm9mZnNldDwvY29kZT4gaXMgYSB0eXBlCi0JICogcGFyYW1ldGVyIGJyYWNrZXQuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgb3BlbmluZyBicmFja2V0Ci0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBicmFja2V0IGlzIHBhcnQgb2YgYSB0eXBlIHBhcmFtZXRlciwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2VlIEVjbGlwc2UgIDMuMQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1R5cGVQYXJhbWV0ZXJCcmFja2V0KGludCBvZmZzZXQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvKgotCQkgKiB0eXBlIHBhcmFtZXRlciBjb21lIGFmdGVyIGJyYWNlcyAoY2xvc2luZyBvciBvcGVuaW5nKSwgc2VtaWNvbG9ucywKLQkJICogb3IgYWZ0ZXIgYSBUeXBlIG5hbWUgKGhldXJpc3RpYzogc3RhcnRzIHdpdGggY2FwaXRhbCBjaGFyYWN0ZXIsIG9yCi0JCSAqIGFmdGVyIGEgbW9kaWZpZXIga2V5d29yZCBpbiBhIG1ldGhvZCBkZWNsYXJhdGlvbiAodmlzaWJpbGl0eSwKLQkJICogc3RhdGljLCBzeW5jaHJvbml6ZWQsIGZpbmFsKQotCQkgKi8KLQotCQl0cnkgewotCQkJSVJlZ2lvbiBsaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQob2Zmc2V0KTsKLQotCQkJSmF2YUhldXJpc3RpY1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBKYXZhSGV1cmlzdGljU2Nhbm5lcihkb2N1bWVudCk7Ci0JCQlpbnQgcHJldlRva2VuID0gc2Nhbm5lci5wcmV2aW91c1Rva2VuKG9mZnNldCAtIDEsIGxpbmUuZ2V0T2Zmc2V0KCkpOwotCQkJaW50IHByZXZUb2tlbk9mZnNldCA9IHNjYW5uZXIuZ2V0UG9zaXRpb24oKSArIDE7Ci0JCQlTdHJpbmcgcHJldmlvdXMgPSBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkVPRiA/IG51bGwgOiBkb2N1bWVudC5nZXQocHJldlRva2VuT2Zmc2V0LCBvZmZzZXQgLSBwcmV2VG9rZW5PZmZzZXQpLnRyaW0oKTsKLQotCQkJaWYgKHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuTEJSQUNFIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuUkJSQUNFIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuU0VNSUNPTE9OIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuU1lOQ0hST05JWkVEIHx8IHByZXZUb2tlbiA9PSBTeW1ib2xzLlRva2VuU1RBVElDIHx8IChwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbklERU5UICYmIGlzVHlwZVBhcmFtZXRlckludHJvZHVjZXIocHJldmlvdXMpKSB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkVPRikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+aWRlbnRpZmllcjwvY29kZT4gaXMgYW4KLQkgKiBpZGVudGlmaWVyIHRoYXQgY291bGQgY29tZSByaWdodCBiZWZvcmUgYSB0eXBlIHBhcmFtZXRlciBsaXN0LiBJdCB1c2VzCi0JICogYSBoZXVyaXN0aWM6IGlmIHRoZSBpZGVudGlmaWVyIHN0YXJ0cyB3aXRoIGFuIHVwcGVyIGNhc2UsIGl0IGlzIGFzc3VtZWQKLQkgKiBhIHR5cGUgbmFtZS4gQWxzbywgaWYgPGNvZGU+aWRlbnRpZmllcjwvY29kZT4gaXMgYSBtZXRob2QgbW9kaWZpZXIsCi0JICogaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBhbmd1bGFyIGJyYWNrZXQgaXMgcGFydCBvZiB0aGUgZ2VuZXJpYyB0eXBlCi0JICogcGFyYW1ldGVyIG9mIGEgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciB0byBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGlkZW50aWZpZXIgY291bGQgaW50cm9kdWNlIGEgdHlwZQotCSAqICAgICAgICAgcGFyYW1ldGVyIGxpc3QKLQkgKiBAc2VlIEVjbGlwc2UgIDMuMQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1R5cGVQYXJhbWV0ZXJJbnRyb2R1Y2VyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyLmxlbmd0aCgpID4gMCAmJiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGlkZW50aWZpZXIuY2hhckF0KDApKSB8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoImZpbmFsIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoInB1YmxpYyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJwdWJsaWMiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHJvdGVjdGVkIikgLy8kTk9OLU5MUy0xJAotCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoInByaXZhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L1N5bWJvbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvU3ltYm9scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjIwM2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvU3ltYm9scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotLyoqCi0gKiBTeW1ib2xzIGZvciB0aGUgaGV1cmlzdGljIGphdmEgc2Nhbm5lci4KLSAqIAotICogQHNlZSBFY2xpcHNlIDMuMAotICovCi1pbnRlcmZhY2UgU3ltYm9scyB7Ci0JaW50IFRva2VuRU9GID0gLTE7Ci0JaW50IFRva2VuTEJSQUNFID0gMTsKLQlpbnQgVG9rZW5SQlJBQ0UgPSAyOwotCWludCBUb2tlbkxCUkFDS0VUID0gMzsKLQlpbnQgVG9rZW5SQlJBQ0tFVCA9IDQ7Ci0JaW50IFRva2VuTFBBUkVOID0gNTsKLQlpbnQgVG9rZW5SUEFSRU4gPSA2OwotCWludCBUb2tlblNFTUlDT0xPTiA9IDc7Ci0JaW50IFRva2VuT1RIRVIgPSA4OwotCWludCBUb2tlbkNPTE9OID0gOTsKLQlpbnQgVG9rZW5RVUVTVElPTk1BUksgPSAxMDsKLQlpbnQgVG9rZW5DT01NQSA9IDExOwotCWludCBUb2tlbkVRVUFMID0gMTI7Ci0JaW50IFRva2VuTEVTU1RIQU4gPSAxMzsKLQlpbnQgVG9rZW5HUkVBVEVSVEhBTiA9IDE0OwotCWludCBUb2tlbklGID0gMTA5OwotCWludCBUb2tlbkRPID0gMTAxMDsKLQlpbnQgVG9rZW5GT1IgPSAxMDExOwotCWludCBUb2tlblRSWSA9IDEwMTI7Ci0JaW50IFRva2VuQ0FTRSA9IDEwMTM7Ci0JaW50IFRva2VuRUxTRSA9IDEwMTQ7Ci0JaW50IFRva2VuQlJFQUsgPSAxMDE1OwotCWludCBUb2tlbkNBVENIID0gMTAxNjsKLQlpbnQgVG9rZW5XSElMRSA9IDEwMTc7Ci0JaW50IFRva2VuUkVUVVJOID0gMTAxODsKLQlpbnQgVG9rZW5TVEFUSUMgPSAxMDE5OwotCWludCBUb2tlblNXSVRDSCA9IDEwMjA7Ci0JaW50IFRva2VuRklOQUxMWSA9IDEwMjE7Ci0JaW50IFRva2VuU1lOQ0hST05JWkVEID0gMTAyMjsKLQlpbnQgVG9rZW5HT1RPID0gMTAyMzsKLQlpbnQgVG9rZW5ERUZBVUxUID0gMTAyNDsKLQlpbnQgVG9rZW5ORVcgPSAxMDI1OwotCWludCBUb2tlbkNMQVNTID0gMTAyNjsKLQlpbnQgVG9rZW5JTlRFUkZBQ0UgPSAxMDI3OwotCWludCBUb2tlbkVOVU0gPSAxMDI4OwotCWludCBUb2tlbklERU5UID0gMjAwMDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTFhYjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbnkgdXNlZCBNb2R1bGUgQ29yZSBhbmQgRmFjZXRzIEFQSXMgYWxvbmcgd2l0aAotICogZmFsbGJhY2tzIGZvciB1c2Ugb24gbm9uLWNvbXBsaWFudCBwcm9qZWN0cyBhbmQgd2hlbiB0aG9zZSBzZXJ2aWNlcyBhcmUgbm90Ci0gKiBhdmFpbGFibGUgYXQgcnVudGltZS4KLSAqIAotICogQmVjYXVzZSBNb2R1bGVDb3JlIEFQSSBjYWxscyBjYW4gcmVzdWx0IGluIGxvY2tzIG5lZWRpbmcgdG8gYmUgYWNxdWlyZWQsCi0gKiBub25lIG9mIHRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCB3aGlsZSBvdGhlciB0aHJlYWQgbG9ja3MgaGF2ZQotICogYWxyZWFkeSBiZWVuIGFjcXVpcmVkLgotICovCi1maW5hbCBjbGFzcyBGYWNldE1vZHVsZUNvcmVTdXBwb3J0IHsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZHVtcF9OQ0RGRSA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYXRoID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmdldFdlYkNvbnRlbnRSb290UGF0aChwcm9qZWN0KTsKLQkJfQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotCQkJaWYgKF9kdW1wX05DREZFKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJcmV0dXJuIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5pc1dlYlByb2plY3QocHJvamVjdCk7Ci0JCX0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCWlmIChfZHVtcF9OQ0RGRSkKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNTQ4NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBXcmFwcGVyIGNsYXNzIGZvciBhbGwgRmFjZXQtcmVsYXRlZCBjYWxscy4gSWYgdGhlIEZhY2V0IG9yIE1vZHVsZUNvcmUKLSAqIGJ1bmRsZXMgYXJlIG5vdCBhdmFpbGFibGUsIHRoaXMgY2xhc3Mgd2lsbCBub3QgbG9hZCwgb3IgaWYgaXQgZG9lcywgaXRzCi0gKiBtZXRob2RzIHdpbGwgY2F1c2UgTm9DbGFzc0RlZkZvdW5kRXJyb3JzLiBUaGlzIGFsbG93cyB1cyB0bwotICogY29tcGFydG1lbnRhbGl6ZSB0aGUgZGVwZW5kZW5jaWVzLgotICogCi0gKi8KLWZpbmFsIGNsYXNzIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZSB7Ci0JLyoqCi0JICogQ29waWVkIHRvIGF2b2lkIHVubmVlZGVkIGV4dHJhIGRlcGVuZGVuY3kgKHBsdXMgaXQncyB1bmNsZWFyIHdoeSB0aGUKLQkgKiB2YWx1ZSBpcyBpbiB0aGF0IHBsdWctaW4pLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRQotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBKU1RfV0VCX01PRFVMRSA9ICJqc3Qud2ViIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTVF9XRUJfTU9EVUxFID0gIndzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIElQYXRoIHRvIHRoZSAicm9vdCIgb2YgdGhlIHdlYiBjb250ZW50cwotCSAqLwotCXN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50Um9vdFBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoIU1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIGNvbXBvbmVudC5leGlzdHMoKSkgewotCQkJcGF0aCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXMgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZChKU1RfV0VCX01PRFVMRSkpIHsKLQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEpTVF9XRUJfTU9EVUxFKTsKLQkJCQlpcyA9IGlzIHx8IChmYWNldGVkICE9IG51bGwgJiYgZmFjZXRlZC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKTsKLQkJCX0KLQkJCWlmIChQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoV1NUX1dFQl9NT0RVTEUpKSB7Ci0JCQkJSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChXU1RfV0VCX01PRFVMRSk7Ci0JCQkJaXMgPSBpcyB8fCAoZmFjZXRlZCAhPSBudWxsICYmIGZhY2V0ZWQuaGFzUHJvamVjdEZhY2V0KGZhY2V0KSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gaXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxGaWxlV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxGaWxlV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTBkODAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MRmlsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLQotY2xhc3MgTmV3SFRNTEZpbGVXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCQotCXB1YmxpYyBOZXdIVE1MRmlsZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0gICAgfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgdGhlIHNlbGVjdGVkIGZvbGRlciB0byB3ZWIgY29udGVudHMgCi0JICogZm9sZGVyIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBvdXRzaWRlIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyLiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKSB7Ci0JCXN1cGVyLmluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpOwotCQkKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQkJCi0JCWlmICh3ZWJDb250ZW50UGF0aCAhPSBudWxsICYmICF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJc2V0Q29udGFpbmVyRnVsbFBhdGgod2ViQ29udGVudFBhdGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgYWRkaXRpb25hbCB2YWxpZGF0aW9uIHNwZWNpZmljIHRvIAotCSAqIGh0bWwgZmlsZXMuIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkKLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCWlmICgoZnVsbFBhdGggIT0gbnVsbCkgJiYgKGZ1bGxQYXRoLmlzRW1wdHkoKSA9PSBmYWxzZSkgJiYgKGZpbGVOYW1lICE9IG51bGwpKSB7Ci0JCQkvLyBjaGVjayB0aGF0IGZpbGVuYW1lIGRvZXMgbm90IGNvbnRhaW4gaW52YWxpZCBleHRlbnNpb24KLQkJCWlmICghZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShmaWxlTmFtZSkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoSFRNTFVJTWVzc2FnZXMuX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0hUTUwsIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gY2hlY2sgYWRkaW5nIGRlZmF1bHQKLQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5GT0xERVIpOwotCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkvLyBwYXRoIGludmFsaWQKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKCh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihyZXNvdXJjZVBhdGgpLmV4aXN0cygpIHx8IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoSFRNTFVJTWVzc2FnZXMuUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZ2V0IHRoZSBJUHJvamVjdCBmb3IgdGhlIHNlbGVjdGlvbiBwYXRoCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJCS8vIGlmIGluc2lkZSB3ZWIgcHJvamVjdCwgY2hlY2sgaWYgaW5zaWRlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIGlzV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJCS8vIGNoZWNrIHRoYXQgdGhlIHBhdGggaXMgaW5zaWRlIHRoZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQkJaWYgKCF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJCQlzZXRNZXNzYWdlKEhUTUxVSU1lc3NhZ2VzLl9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCwgV0FSTklORyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZDb250ZW50VHlwZSA9PSBudWxsKQotCQkJZkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zIGZvciBIVE1MIENvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBpZiBmaWxlTmFtZSBpcyB2YWxpZCBuYW1lIGZvciBjb250ZW50IHR5cGUuIFRha2VzIGJhc2UgY29udGVudAotCSAqIHR5cGUgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRlbnNpb24gaXMgdmFsaWQgZm9yIHRoaXMgY29udGVudCB0eXBlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhbiBleHRlbnNpb24KLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCS8vIGNoZWNrIHdoYXQgY29udGVudCB0eXBlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgZXh0ZW5zaW9uCi0JCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IoZmlsZU5hbWUpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKSB7Ci0JCQkJdmFsaWQgPSB0eXBlc1tpXS5pc0tpbmRPZih0eXBlKTsKLQkJCQkrK2k7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJdmFsaWQgPSB0cnVlOyAvLyBubyBleHRlbnNpb24gc28gdmFsaWQKLQkJcmV0dXJuIHZhbGlkOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZGVmYXVsdCBleHRlbnNpb24gdG8gdGhlIGZpbGVuYW1lCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBhZGREZWZhdWx0RXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgbmV3RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbGVuYW1lKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0KLQkJbmV3RmlsZU5hbWUuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZU5hbWUuYXBwZW5kKGV4dCk7Ci0KLQkJcmV0dXJuIG5ld0ZpbGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB3aGljaCBwcm9qZWN0IGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVByb2plY3Qgb2JqZWN0LiBJZiBwYXRoIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSByZXR1cm4gdmFsdWUgCi0JICogCQkgICBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+LiAKLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tUGF0aChJUGF0aCBwYXRoKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCi0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWlmICh3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLlBST0pFQ1QpLmlzT0soKSkgewotCQkJCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC50b1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIGEgd2ViIHByb2plY3QuIAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHByb2plY3QgdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyB3ZWIgcHJvamVjdCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmlzV2ViUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlciBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB3aGljaCB3ZWIgY29udGVudHMgcGF0aCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQYXRoIG9mIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmdldFdlYkNvbnRlbnRSb290UGF0aChwcm9qZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTVhYWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogVGVtcGxhdGVzIHBhZ2UgaW4gbmV3IGZpbGUgd2l6YXJkLiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGEgbmV3IGZpbGUKLSAqIHRlbXBsYXRlIHRvIGJlIGFwcGxpZWQgaW4gbmV3IGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGVtcGxhdGVzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgZWxlbWVudDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqIExhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUgbmFtZSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWU7Ci0JLyoqIFRoZSB2aWV3ZXIgZGlzcGxheXMgdGhlIHBhdHRlcm4gb2Ygc2VsZWN0ZWQgdGVtcGxhdGUuICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlBhdHRlcm5WaWV3ZXI7Ci0JLyoqIFRoZSB0YWJsZSBwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JLyoqIFRlbXBsYXRlIHN0b3JlIHVzZWQgYnkgdGhpcyB3aXphcmQgcGFnZSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkvKiogQ2hlY2tib3ggZm9yIHVzaW5nIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZSIsIEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzEpOwotCX0KLQotCS8qKgotCSAqIENvcnJlY3RseSByZXNpemVzIHRoZSB0YWJsZSBzbyBubyBwaGFudG9tIGNvbHVtbnMgYXBwZWFyCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIGJ1dHRvbnMKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b25zCi0JICogQHBhcmFtIHRhYmxlCi0JICogICAgICAgICAgICB0aGUgdGFibGUKLQkgKiBAcGFyYW0gY29sdW1uMQotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4yCi0JICogICAgICAgICAgICB0aGUgc2Vjb25kIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4zCi0JICogICAgICAgICAgICB0aGUgdGhpcmQgY29sdW1uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgVGFibGUgdGFibGUsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIpIHsKLQkJcGFyZW50LmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSBhcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJCQlQb2ludCBwcmVmZXJyZWRTaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0JCQkJaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0JCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uCi0JCQkJCS8vIHdpZHRoCi0JCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCQl9Ci0KLQkJCQlQb2ludCBvbGRTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJCWlmIChvbGRTaXplLnggPiB3aWR0aCkgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucwotCQkJCQkvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLQkJCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkJCQkvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGFuY2VzdG9yLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gY3JlYXRlIGNoZWNrYm94IGZvciB1c2VyIHRvIHVzZSBIVE1MIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbmFibGVUZW1wbGF0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgVGVtcGxhdGVzIHRhYmxlCi0JCUNvbXBvc2l0ZSBpbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgaW5uZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbm5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaW5uZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJaW5uZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXQoaW5uZXJMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBDcmVhdGUgbGlua2VkIHRleHQgdG8ganVzdCB0byB0ZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMyk7Ci0KLQkJZlRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlbXBsYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZlRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkgewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJcmV0dXJuIGxlZnQuZ2V0RGVzY3JpcHRpb24oKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iamVjdDEsIG9iamVjdDIpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQl1cGRhdGVWaWV3ZXJJbnB1dCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdmlld2VyIHRoYXQgZGlzcGxheXMgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlJ3MgY29udGVudHMKLQkJZlBhdHRlcm5WaWV3ZXIgPSBkb0NyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCWZUZW1wbGF0ZVN0b3JlID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkhUTUxfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMgYSBzb3VyY2Ugdmlld2VyIHRvIHByZXNlbnQgdGhlIHRlbXBsYXRlCi0JICogcGF0dGVybiBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBDbGllbnRzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEKLQkgKiBjdXN0b20gc291cmNlIHZpZXdlciBmZWF0dXJpbmcgZS5nLiBzeW50YXggY29sb3JpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgc291cmNlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSBjb250cm9scyBpbiBwYWdlIGJhc2VkIG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbidzIGN1cnJlbnQKLQkgKiBzdGF0ZS4KLQkgKi8KLQl2b2lkIGVuYWJsZVRlbXBsYXRlcygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZlVzZVRlbXBsYXRlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCWlmICghZW5hYmxlZCkgewotCQkJLy8gc2F2ZSBsYXN0IHNlbGVjdGVkIHRlbXBsYXRlCi0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQllbHNlCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKS5nZXRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IG5ldyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIDAsIDApOwotCQkJdHJ5IHsKLQkJCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBjb250ZXh0LmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGJ1ZmZlci5nZXRTdHJpbmcoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIHRlbXBsYXRlIGZvciBuZXcgaHRtbCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBIVE1MIEZpbGUgd2l6YXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhIVE1MVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IEhUTUwgRmlsZSB3aXphcmQuCi0JICovCi0Jdm9pZCBzYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShIVE1MVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSB0ZW1wbGF0ZSBpbiB0aGUgdGFibGUgdmlld2VyIGdpdmVuIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZgotCSAqIHRlbXBsYXRlIG5hbWUgY2Fubm90IGJlIGZvdW5kIG9yIHRlbXBsYXRlTmFtZSBpcyBudWxsLCBqdXN0IHNlbGVjdAotCSAqIGZpcnN0IGl0ZW0gaW4gdGFibGUuIElmIG5vIGl0ZW1zIGluIHRhYmxlIHNlbGVjdCBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCU9iamVjdCB0ZW1wbGF0ZSA9IG51bGw7Ci0KLQkJaWYgKHRlbXBsYXRlTmFtZSAhPSBudWxsICYmIHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIHBpY2sgdGhlIGxhc3QgdXNlZCB0ZW1wbGF0ZQotCQkJdGVtcGxhdGUgPSBmVGVtcGxhdGVTdG9yZS5maW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lLCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCQl9Ci0KLQkJLy8gbm8gcmVjb3JkIG9mIGxhc3QgdXNlZCB0ZW1wbGF0ZSBzbyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQlpZiAodGVtcGxhdGUgPT0gbnVsbCkgewotCQkJLy8ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJCXRlbXBsYXRlID0gZlRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZW1wbGF0ZSk7Ci0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwYXR0ZXJuIHZpZXdlci4KLQkgKi8KLQl2b2lkIHVwZGF0ZVZpZXdlcklucHV0KCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2M1MmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBOZXdIVE1MV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JCi0JcHJpdmF0ZSBOZXdIVE1MRmlsZVdpemFyZFBhZ2UgZk5ld0ZpbGVQYWdlOwotCXByaXZhdGUgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UgZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlmTmV3RmlsZVBhZ2UgPSBuZXcgTmV3SFRNTEZpbGVXaXphcmRQYWdlKCJIVE1MV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKElERS5jb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoZlNlbGVjdGlvbikpKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoSFRNTFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfSEVBRElORyk7Ci0JCWZOZXdGaWxlUGFnZS5zZXREZXNjcmlwdGlvbihIVE1MVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19ERVNDUklQVElPTik7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVQYWdlKTsKLQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2UgPSBuZXcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShmTmV3RmlsZVRlbXBsYXRlc1BhZ2UpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBhcHBseUxpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSwgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLCBuZXcgSVNjb3BlQ29udGV4dFtdIHtuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKSwgbmV3IEluc3RhbmNlU2NvcGUoKSB9KTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZSh0ZXh0LCAiXHJcbiIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXHIiLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxuIiwgbGluZURlbGltaXRlcik7Ci0JCXJldHVybiBjb252ZXJ0ZWRUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShIVE1MVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19USVRMRSk7Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX05FV0hUTUxGSUxFKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcGVyZm9ybWVkT0sgPSBmYWxzZTsKLQkJLy8gc2F2ZSB1c2VyIG9wdGlvbnMgZm9yIG5leHQgdXNlCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZS5zYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gYWRkIGRlZmF1bHQgZXh0ZW5zaW9uCi0JCVN0cmluZyBmaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gZk5ld0ZpbGVQYWdlLmFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJZk5ld0ZpbGVQYWdlLnNldEZpbGVOYW1lKG5ld0ZpbGVOYW1lKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIG5ldyBlbXB0eSBmaWxlCi0JCUlGaWxlIGZpbGUgPSBmTmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCi0JCS8vIGlmIHRoZXJlIHdhcyBwcm9ibGVtIHdpdGggY3JlYXRpbmcgZmlsZSwgaXQgd2lsbCBiZSBudWxsLCBzbyBtYWtlCi0JCS8vIHN1cmUgdG8gY2hlY2sKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJLy8gcHV0IHRlbXBsYXRlIGNvbnRlbnRzIGludG8gZmlsZQotCQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLmdldFRlbXBsYXRlU3RyaW5nKCk7Ci0JCQlpZiAodGVtcGxhdGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCXRlbXBsYXRlU3RyaW5nID0gYXBwbHlMaW5lRGVsaW1pdGVyKGZpbGUsIHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkvLyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGZvciB0aGUgbmV3IGZpbGUKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBIVE1MIGZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTQyMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkhUTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MuY29udGVudG91dGxpbmUuWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIG91dGxpbmUgdmlldyBwYWdlIHdoaWNoIHNob3dzIEhUTUwgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIEhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTm9kZUFjdGlvbk1hbmFnZXIgY3JlYXRlTm9kZUFjdGlvbk1hbmFnZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgSFRNTE5vZGVBY3Rpb25NYW5hZ2VyKChJU3RydWN0dXJlZE1vZGVsKSB0cmVlVmlld2VyLmdldElucHV0KCksIHRyZWVWaWV3ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5Yjc5MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTYwNDBdIG5vIG5ldyBodG1sIHRlbXBsYXRlIGZvciB4aHRtbCAxLjAgc3RyaWN0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UZW1wbGF0ZXMuY29tbWVudC5uYW1lPWNvbW1lbnQKLVRlbXBsYXRlcy5jb21tZW50LmRlc2M9Y29tbWVudAotVGVtcGxhdGVzLnVsLm5hbWU9dWwKLVRlbXBsYXRlcy51bC5kZXNjPXVub3JkZXJlZCBsaXN0Ci1UZW1wbGF0ZXMudWwuY29udGVudD08dWw+XG4gIDxsaT4gSXRlbSBvbmUgPC9saT5cbiAgPGxpPiBJdGVtIHR3byA8L2xpPlxuPC91bD5cbgotVGVtcGxhdGVzLmRsLm5hbWU9ZGwKLVRlbXBsYXRlcy5kbC5kZXNjPWRlZmluaXRpb24gbGlzdAotVGVtcGxhdGVzLmRsLmNvbnRlbnQ9PGRsPlxuICA8ZHQ+IEZpcnN0IGRlZmluaXRpb248L2R0PiAgPGRkPiAgRmlyc3QgZXhwbGFuYXRpb248L2RkPlxuICA8ZHQ+IFNlY29uZCBkZWZpbml0aW9uPC9kdD4gPGRkPiBTZWNvbmQgZXhwbGFuYXRpb248L2RkPlxuPC9kbD5cbgotVGVtcGxhdGVzLnRhYmxlLm5hbWU9dGFibGUKLVRlbXBsYXRlcy50YWJsZS5kZXNjPXRhYmxlCi1UZW1wbGF0ZXMudGFibGUuY29udGVudD08dGFibGU+XG4gIDx0cj5cbiAgICA8dGg+Q29sdW1uIDEgSGVhZGluZzwvdGg+XG4gICAgPHRoPkNvbHVtbiAyIEhlYWRpbmc8L3RoPlxuICA8L3RyPlxuICA8dHI+XG4gICAgPHRkPlJvdyAxOiBDb2wgMTwvdGQ+XG4gICAgPHRkPlJvdyAxOiBDb2wgMjwvdGQ+XG4gIDwvdHI+XG48L3RhYmxlPlxuCi1UZW1wbGF0ZXMub2wubmFtZT1vbAotVGVtcGxhdGVzLm9sLmRlc2M9b3JkZXJlZCBsaXN0Ci1UZW1wbGF0ZXMub2wuY29udGVudD08b2w+XG4gIDxsaT4gSXRlbSBvbmUgPC9saT5cbiAgPGxpPiBJdGVtIHR3byA8L2xpPlxuPC9vbD5cbgotVGVtcGxhdGVzLmh0bWwubmFtZT1OZXcgSFRNTCBGaWxlICg0LjAxIHRyYW5zaXRpb25hbCkKLVRlbXBsYXRlcy5odG1sLmRlc2M9aHRtbCA0LjAxIHRyYW5zaXRpb25hbAotVGVtcGxhdGVzLmh0bWwuY29udGVudD08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj5cbjxodG1sPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSI+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD4KLVRlbXBsYXRlcy5odG1sZnJhbWVzZXQubmFtZT1OZXcgSFRNTCBGaWxlICg0LjAxIGZyYW1lc2V0KQotVGVtcGxhdGVzLmh0bWxmcmFtZXNldC5kZXNjPWh0bWwgNC4wMSBmcmFtZXNldAotVGVtcGxhdGVzLmh0bWxmcmFtZXNldC5jb250ZW50PTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ZyYW1lc2V0LmR0ZCI+XG48aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxmcmFtZXNldD5cbiAgICA8ZnJhbWU+XG4gICAgPGZyYW1lPlxuICAgIDxub2ZyYW1lcz5cbiAgICA8Ym9keT5cbiAgICA8cD5UaGlzIHBhZ2UgdXNlcyBmcmFtZXMuIFRoZSBjdXJyZW50IGJyb3dzZXIgeW91IGFyZSB1c2luZyBkb2VzIG5vdCBzdXBwb3J0IGZyYW1lcy48L3A+XG4gICAgPC9ib2R5PlxuICAgIDwvbm9mcmFtZXM+XG48L2ZyYW1lc2V0PlxuPC9odG1sPgotVGVtcGxhdGVzLmh0bWxzdHJpY3QubmFtZT1OZXcgSFRNTCBGaWxlICg0LjAxIHN0cmljdCkKLVRlbXBsYXRlcy5odG1sc3RyaWN0LmRlc2M9aHRtbCA0LjAxIHN0cmljdAotVGVtcGxhdGVzLmh0bWxzdHJpY3QuY29udGVudD08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+XG48aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+Ci1UZW1wbGF0ZXMueGh0bWwubmFtZT1OZXcgWEhUTUwgRmlsZSAoMS4wIHRyYW5zaXRpb25hbCkKLVRlbXBsYXRlcy54aHRtbC5kZXNjPXhodG1sIDEuMCB0cmFuc2l0aW9uYWwKLVRlbXBsYXRlcy54aHRtbC5jb250ZW50PTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiA/PlxuPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPlxuPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgLz5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbiR7Y3Vyc29yfVxuPC9ib2R5PlxuPC9odG1sPgotVGVtcGxhdGVzLnhodG1sZnJhbWVzZXQubmFtZT1OZXcgWEhUTUwgRmlsZSAoMS4wIGZyYW1lc2V0KQotVGVtcGxhdGVzLnhodG1sZnJhbWVzZXQuZGVzYz14aHRtbCAxLjAgZnJhbWVzZXQKLVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0LmNvbnRlbnQ9PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iID8+XG48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQiPlxuPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgLz5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48ZnJhbWVzZXQ+XG4gICAgPGZyYW1lIC8+XG4gICAgPGZyYW1lIC8+XG4gICAgPG5vZnJhbWVzPlxuICAgIDxib2R5PlxuICAgIDxwPlRoaXMgcGFnZSB1c2VzIGZyYW1lcy4gVGhlIGN1cnJlbnQgYnJvd3NlciB5b3UgYXJlIHVzaW5nIGRvZXMgbm90IHN1cHBvcnQgZnJhbWVzLjwvcD5cbiAgICA8L2JvZHk+XG4gICAgPC9ub2ZyYW1lcz5cbjwvZnJhbWVzZXQ+XG48L2h0bWw+Ci1UZW1wbGF0ZXMueGh0bWxzdHJpY3QubmFtZT1OZXcgWEhUTUwgRmlsZSAoMS4wIHN0cmljdCkKLVRlbXBsYXRlcy54aHRtbHN0cmljdC5kZXNjPXhodG1sIDEuMCBzdHJpY3QKLVRlbXBsYXRlcy54aHRtbHN0cmljdC5jb250ZW50PTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiA/PlxuPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPlxuPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgLz5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbiR7Y3Vyc29yfVxuPC9ib2R5PlxuPC9odG1sPgotVGVtcGxhdGVzLnNjcmlwdC5uYW1lPXNjcmlwdAotVGVtcGxhdGVzLnNjcmlwdC5kZXNjPXNjcmlwdCAgICAgKGNvbW1lbnRlZCkKLVRlbXBsYXRlcy5zY3JpcHQuY29udGVudD08c2NyaXB0IHR5cGU9XCIke2N1cnNvcn10ZXh0L2phdmFzY3JpcHRcIj5cbjwhLS1cblxuLy8tLT5cbjwvc2NyaXB0PgotVGVtcGxhdGVzLnN0eWxlLm5hbWU9c3R5bGUKLVRlbXBsYXRlcy5zdHlsZS5kZXNjPXN0eWxlICAgICAoY29tbWVudGVkKQotVGVtcGxhdGVzLnN0eWxlLmNvbnRlbnQ9PHN0eWxlPlxuPCEtLVxuJHtjdXJzb3J9XG4tLT5cbjwvc3R5bGU+Ci1UZW1wbGF0ZXMuaW1nbWFwLm5hbWU9aW1nCi1UZW1wbGF0ZXMuaW1nbWFwLmRlc2M9aW1nICAgICAobWFwKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTFmZmI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBCZW5qYW1pbiBNdXNrYWxsYSwgYi5tdXNrYWxsYUBnbXgubmV0IC0gWzE1NjA0MF0gbm8gbmV3IGh0bWwgdGVtcGxhdGUgZm9yIHhodG1sIDEuMCBzdHJpY3QKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuY29tbWVudC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5jb21tZW50LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuY29tbWVudCIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiZsdDshLS0gJHtjdXJzb3J9IC0tJmd0OzwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmltZ21hcC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5pbWdtYXAuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5pbWdtYXAiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4mbHQ7aW1nIGlzbWFwJmd0OzwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnVsLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnVsLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMudWwiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLnVsLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5kbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5kbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmRsIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5kbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMudGFibGUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMudGFibGUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy50YWJsZSIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMudGFibGUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLm9sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLm9sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMub2wiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLm9sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5odG1sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmh0bWwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5odG1sIiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5odG1sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5odG1sZnJhbWVzZXQubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuaHRtbGZyYW1lc2V0LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuaHRtbGZyYW1lc2V0IiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5odG1sZnJhbWVzZXQuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmh0bWxzdHJpY3QubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuaHRtbHN0cmljdC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmh0bWxzdHJpY3QiIGNvbnRleHQ9Imh0bWxfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmh0bWxzdHJpY3QuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnhodG1sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhodG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMueGh0bWwiIGNvbnRleHQ9Imh0bWxfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLnhodG1sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhodG1sZnJhbWVzZXQuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy54aHRtbGZyYW1lc2V0IiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy54aHRtbHN0cmljdC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy54aHRtbHN0cmljdC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnhodG1sc3RyaWN0IiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy54aHRtbHN0cmljdC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuc2NyaXB0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnNjcmlwdC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnNjcmlwdCIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuc2NyaXB0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5zdHlsZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5zdHlsZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnN0eWxlIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5zdHlsZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTY1ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjNTA3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9Ci1vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc2luZGV4bWFuYWdlcj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN0cmFuc2xhdGlvbj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN0cmFuc2xhdGlvbnN0b2Rpc2s9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzc2VhcmNoPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3RhZ2xpYi9yZXNvbHZlPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzamF2YW1hcHBpbmc9ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN2YWxpZGF0b3I9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjYjg3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTA3MjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotI1dlZCBPY3QgMjQgMTk6NDk6NDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWQwOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotI1dlZCBPY3QgMjQgMTk6NDE6MzEgRURUIDIwMDcKLWNsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPWZhbHNlCi1jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLWNsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9ZmFsc2UKLWNsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCi1jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLWNsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9ZmFsc2UKLWNsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLWNsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLWNsZWFudXAudXNlX2Jsb2Nrcz10cnVlCi1jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLWNsZWFudXBfcHJvZmlsZT1fU1NFIFRlYW0gU3R5bGVzCi1jbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQotb3JnLmVjbGlwc2UuamR0LnVpLmdldHRlcnNldHRlci51c2UuaXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmtleXdvcmR0aGlzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkub3ZlcnJpZGVhbm5vdGF0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwMjViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Kc0NvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0OwotICB1c2VzOj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsCi0gICBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLAotICAgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnRhc2tzLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdCwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaCwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS50ZXh0Ci1SZXF1aXJlLUJ1bmRsZTogY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0MjY5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbAotICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjZhYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUudGFnbGliIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iSUphclJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnRGlyUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPiAtLT4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnbGliSW5kZXhMaXN0ZW5lciIgaW1wbGVtZW50PSJ0cnVlIiAvPiAtLT4KLQkJPHR5cGUgbmFtZT0iSVRhZ2xpYkRlc2NyaXB0b3IiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTx0eXBlIG5hbWU9IklUYWdsaWJSZWNvcmQiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTwhLS0gPHR5cGUgbmFtZT0iSVRhZ2xpYlJlY29yZEV2ZW50IiBpbXBsZW1lbnQ9ImZhbHNlIiAvPiAtLT4KLQkJPHR5cGUgbmFtZT0iSVRMRFJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVVSTFJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iVGFnbGliSW5kZXgiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbmZvcG9wIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL2pzdC9jb21wb25lbnRzL2pzcC9vdmVydmlldy5odG1sIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzUyOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT0gSmF2YVNjcmlwdCBTdXBwb3J0Ci1wcm92aWRlck5hbWU9IEVjbGlwc2Uub3JnCi1CdW5kbGUtTmFtZS4wID0gSlNEVCBXZWIgU3VwcG9ydCBDb3JlIAotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLWV4dGVuc2lvbi5uYW1lLjAgPSBKYXZhU2NyaXB0IEVtYmVkZWQKLWV4dGVuc2lvbi5uYW1lLjEgPSBFbWJlZGVkIEphdmFTY3JpcHQgQnVpbGRlcgotZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMCA9IEphdmFTY3JpcHQgUHJlIFByb2Nlc3NpbmcKLWphdmFzY3JpcHQudmFsaWRhdG9yPSBKYXZhU2NyaXB0IFN5bnRheCBWYWxpZGF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDY0NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iamF2YXNjcmlwdFByZVByb2Nlc3NvciIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5uYW1lLjAiIHNjaGVtYT0ic2NoZW1hL2phdmFzY3JpcHRQcmVQcm9jZXNzb3IuZXhzZCIvPgotICAgCi0gICAKLSAgIAotICAgCi0gICAKLSAgIDwhLS0gRnVsbCBibG93biBKU0RUIEZBQ0VUIC0tPgotICA8IS0tCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotCSAgICA8Y2F0ZWdvcnkgaWQ9ImpzZHQuY2F0ZWdvcnkiPgotCSAgICA8bGFiZWw+SmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29sa2l0PC9sYWJlbD4KLQkgICAgPGRlc2NyaXB0aW9uPkVuYWJsZXMgYWR2YW5jZWQgSmF2YVNjcmlwdCBzdXBwb3J0LjwvZGVzY3JpcHRpb24+Ci0JICA8L2NhdGVnb3J5PgotICAgCi0gICAJCTxwcm9qZWN0LWZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiPgotCQkJPGxhYmVsPkphdmFTY3JpcHQgVG9vbGtpdDwvbGFiZWw+Ci0JICAJIAk8ZGVzY3JpcHRpb24+QWRkcyBhZHZhbmNlZCBKYXZhU2NyaXB0IGVkaXRpbmcgc3VwcG9ydC48L2Rlc2NyaXB0aW9uPgotCSAgCSAgCTxkZWZhdWx0LXZlcnNpb24gdmVyc2lvbj0iMS4wIi8+Ci0JCTwvcHJvamVjdC1mYWNldD4KLQkKLQkJPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0id3N0LmpzZHQud2ViIiB2ZXJzaW9uPSIxLjAiPgotCQkKLQkJPGNvbnN0cmFpbnQ+Ci0JCQkgIDxvcj4KLQkJCSAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC53ZWIiLz4KLQkJCSAgICA8cmVxdWlyZXMgZmFjZXQ9IndzdC53ZWIiLz4KLQkJCSAgPC9vcj4KLQkJPC9jb25zdHJhaW50PgotCQkKLQkJPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0JCi0JCTxhY3Rpb24gZmFjZXQ9IndzdC5qc2R0LndlYiIgdHlwZT0iaW5zdGFsbCIgaWQ9IndzdC5qc2R0LndlYi5pbnN0YWxsIiB2ZXJzaW9uPSIxLjAiPgotCSAgIAkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzTmF0dXJlSW5zdGFsbGVyIi8+Ci0JCTwvYWN0aW9uPgotCQotCQk8YWN0aW9uIGZhY2V0PSJ3c3QuanNkdC53ZWIiIHR5cGU9InVuaW5zdGFsbCIgaWQ9IndzdC5qc2R0LndlYi51bmluc3RhbGwiIHZlcnNpb249IjEuMCI+Ci0JCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuSnNOYXR1cmVVbmluc3RhbGxlciIvPgotCQk8L2FjdGlvbj4KLQkKLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0JICA8c3VwcG9ydGVkPgotCSAgICA8ZmFjZXQgaWQ9IndzdC5qc2R0LndlYiIvPgotCSAgICA8cnVudGltZS1jb21wb25lbnQgYW55PSJ0cnVlIi8+Ci0JICA8L3N1cHBvcnRlZD4KLQotCTwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gICAKLSAgIAotICAgCi0gICAKLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdFByZVByb2Nlc3NvciI+Ci0gICAJCTxqYXZhc2NyaXB0UHJlUHJvY2Vzc29yCi0gICAJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uIgotICAgCQkJcHJpb3JpdHk9IjEiIC8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSBJbnN0YWxsIEhhbmRsZXIgZm9yIHdlYiBKU0RULi4gUGlneWJhY2tzIG9uIHdzdC53ZWIgZmFjZXQtLT4KLSAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAgCi0JCTxldmVudC1oYW5kbGVyIGZhY2V0PSJ3c3Qud2ViIiB0eXBlPSJQT1NUX0lOU1RBTEwiIHZlcnNpb249IlsxLjAiPgotCSAgIAkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzTmF0dXJlSW5zdGFsbGVyIi8+Ci0JCTwvZXZlbnQtaGFuZGxlcj4KLQkKLQkJPGV2ZW50LWhhbmRsZXIgZmFjZXQ9IndzdC53ZWIiIHR5cGU9IlBPU1RfVU5JTlNUQUxMIiB2ZXJzaW9uPSJbMS4wIj4KLQkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc05hdHVyZVVuaW5zdGFsbGVyIi8+Ci0JCTwvZXZlbnQtaGFuZGxlcj4KLQotCQk8ZXZlbnQtaGFuZGxlciBmYWNldD0ianN0LndlYiIgdHlwZT0iUE9TVF9JTlNUQUxMIiAgdmVyc2lvbj0iWzIuMCI+Ci0JICAgCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuSnNOYXR1cmVJbnN0YWxsZXIiLz4KLQkJPC9ldmVudC1oYW5kbGVyPgotCQotCQk8ZXZlbnQtaGFuZGxlciBmYWNldD0ianN0LndlYiIgdHlwZT0iUE9TVF9VTklOU1RBTEwiIHZlcnNpb249IlsyLjAiPgotCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzTmF0dXJlVW5pbnN0YWxsZXIiLz4KLQkJPC9ldmVudC1oYW5kbGVyPgotCi0JCi0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSByZW1vdmVkIGR1ZSB0byBKVW5pdCBmYWlsdXJlcyBkdXJpbmcgaW5pdGlhbCBXVFAgYnVpbGQKLQkgICA8ZXh0ZW5zaW9uIGlkPSJlbWJlZGVkLmpzTmF0dXJlIiBuYW1lPSIlZXh0ZW5zaW9uLm5hbWUuMCIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hdHVyZXMiPiAKLQkJICAgPHJ1bnRpbWU+ICAgICAgICAgIAotCQkgICAJPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc1dlYk5hdHVyZSIvPiAgICAgICAKLQkJICAgPC9ydW50aW1lPiAgICAgICAKLQkgCSAgIDxidWlsZGVyIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5lbWJlZGVkLmphdmFzY3JpcHQiLz4gICAgCi0JICAgPC9leHRlbnNpb24+IAotCS0tPiAgIAotCi0JICAgCTwhLS0gCi0JICAgCU5vdCB1c2luZyB0aGlzIGF0IHRoZSBtb21lbnQsIGJ1dCBldmVyeXRoaW5ncyBpbiBwbGFjZSBpZiB3ZSBuZWVkIGluIHRoZSBmdXR1cmUuIAotCSAgICAtLT4gIAotCSAgIAotCSAgIDxleHRlbnNpb24gaWQ9ImVtYmVkZWQuamF2YXNjcmlwdCIgbmFtZT0iJWV4dGVuc2lvbi5uYW1lLjEiIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5idWlsZGVycyI+ICAgICAgIAotCQkgICAJPGJ1aWxkZXIgaGFzTmF0dXJlPSJ0cnVlIiBjYWxsT25FbXB0eURlbHRhPSJ0cnVlIj4KLQkJICAgCSAgICAgIAotCQkgICAJPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSW5jcmVtZW50YWxCdWlsZGVyIi8+ICAgICAgCi0JCSAgIDwvYnVpbGRlcj4gICAgCi0JICAgPC9leHRlbnNpb24+Ci0JCi0JCi0JCi0JCi0JPCEtLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciI+Ci0JCTxzY2FubmVyCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudGFza3MuSnNGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudGFza3MuSnNGaWxlVGFza1NjYW5uZXIiCi0JCQljb250ZW50VHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCS0tPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXRQcm9jZXNzb3JzIj4KLQkJPHByb2Nlc3NvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsIgotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTUCBiYXRjaCB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJKc0JhdGNoVmFsaWRhdG9yIgotCQluYW1lPSIlamF2YXNjcmlwdC52YWxpZGF0b3IiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotCQk8dmFsaWRhdG9yPgotCQkJPHByb2plY3ROYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuanNOYXR1cmUiIC8+Ci0KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5odG1sIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmh0bSI+Ci0JCQk8L2ZpbHRlcj4KLQkJCQotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzcCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCSAKLQotCQkJPGhlbHBlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQiPgotCQkJPC9oZWxwZXI+Ci0KLQkJCTxydW4KLQkJCQllbmFibGVkPSJmYWxzZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Kc0JhdGNoVmFsaWRhdG9yIj4KLQkJCTwvcnVuPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Kc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIiPgotCSAgICAgIDxKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIKLQkgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyIgotCSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5sYXVuY2hpbmcuV2ViUHJvamVjdCI+Ci0JICAgICAgPC9Kc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXI+Ci0gIAkgPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc2NoZW1hL2phdmFzY3JpcHRQcmVQcm9jZXNzb3IuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc2NoZW1hL2phdmFzY3JpcHRQcmVQcm9jZXNzb3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmNmYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NjaGVtYS9qYXZhc2NyaXB0UHJlUHJvY2Vzc29yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUiIGlkPSJqYXZhc2NyaXB0UHJlUHJvY2Vzc29yIiBuYW1lPSJKYXZhU2NyaXB0IFByZSBQcm9jZXNzaW5nIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImphdmFzY3JpcHRQcmVQcm9jZXNzb3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iamF2YXNjcmlwdFByZVByb2Nlc3NvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb24iLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBsb2FkaW5nIHByaW9yaXR5LiB0aGUgaGlnaGVzdCBudW1iZXIgd2lucy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0luY3JlbWVudGFsQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSW5jcmVtZW50YWxCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0M2JkYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSW5jcmVtZW50YWxCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEluY3JlbWVudGFsQnVpbGRlciBleHRlbmRzIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIgewotCXB1YmxpYyBJbmNyZW1lbnRhbEJ1aWxkZXIoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5pbXBsZW1lbnRlZCBtZXRob2Q6SW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcigpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyI2J1aWxkKGludCwKLQkgKiAgICAgIGphdmEudXRpbC5NYXAsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCQotCXByb3RlY3RlZCBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXAgYXJncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmltcGxlbWVudGVkIG1ldGhvZDpJbmNyZW1lbnRhbEJ1aWxkZXIuYnVpbGQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTE4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUpTUEluZGV4TWFuYWdlcl8wPVVwZGF0aW5nIEphdmFTY3JpcHQgSW5kZXgKLUpTUEluZGV4TWFuYWdlcl8yPUphdmFTY3JpcHQgSW5kZXhlciBpbmRleGluZyB7MH0gZmlsZXMKLUpTUF9TZWFyY2g9SmF2YVNjcmlwdCBTZWFyY2ggLSAKLUpTUERvY3VtZW50TG9hZGVyXzE9UHJvZ3JhbSBFcnJvcjogc3RydWN0dXJlZCBtb2RlbCBoYWQgbm8gc3RydWN0dXJlZERvY3VtZW50Ci1KU1BFTF9TeW50YXg9RUwgU3ludGF4IEVycm9yIAotSlNQRUxfVG9rZW49VW5hYmxlIHRvIGFuYWx5c2UgRUwgZXhwcmVzc2lvbiBkdWUgdG8gbGV4aWNhbCBhbmFseXNpcyBlcnJvcgotTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXz1KYXZhU2NyaXB0IFZhbGlkYXRvciB2YWxpZGF0aW5nIHswfQotSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZz1VcGRhdGluZyBKYXZhU2NyaXB0IEZyYWdtZW50IENvbnRlbnQgU2V0dGluZ3MKLUpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc9UHJvYmxlbSBzYXZpbmcgSmF2YVNjcmlwdCBGcmFnbWVudCBDb250ZW50IFNldHRpbmdzIGZvciB7MH0KLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8wPXswfSBpcyBhIHJlc2VydmVkIHByZWZpeC4gIFRyeSBhbm90aGVyCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMT1DYW5ub3QgZmluZCB0aGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmb3IgezB9Ci1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMj1UaGUgcHJlZml4IHswfSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMz1BIHswfSB2YWx1ZSBpcyByZXF1aXJlZCBpbiB0aGlzIGRpcmVjdGl2ZQotSlNQQmF0Y2hWYWxpZGF0b3JfMD1HYXRoZXJpbmcgZmlsZXMgaW4gezB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Kc0NvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSnNDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3ZmMxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Kc0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0NvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQX1NlYXJjaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BCYXRjaFZhbGlkYXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUERvY3VtZW50TG9hZGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRUxfU3ludGF4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEVMX1Rva2VuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BJbmRleE1hbmFnZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BJbmRleE1hbmFnZXJfMjsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXzsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEpzQ29yZU1lc3NhZ2VzLkJVTkRMRV9OQU1FLCBKc0NvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgSnNDb3JlTWVzc2FnZXMoKSB7fQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSnNDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Kc0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2ODAxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Kc0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzSW5kZXhNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSnNDb3JlUGx1Z2luIHBsdWdpbjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gd2lsbCBiZSByZW1vdmVkLiBDdXJyZW50bHkgdXNlZCB0byBnZXQgIm1vZGVsIHByZWZlcmVuY2VzIiwKLQkgKiAgICAgICAgICAgICBidXQgdGhlcmUgYXJlIG90aGVyLCBiZXR0ZXIgd2F5cy4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgSnNDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBKc0NvcmVQbHVnaW4ucGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEpzQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJSnNDb3JlUGx1Z2luLnBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJLy8gSlNQSW5kZXhNYW5hZ2VyIGRlcGVuZHMgb24gVGFnbGliQ29udHJvbGxlciwgc28gVGFnbGliQ29udHJvbGxlcgotCQkvLyBzaG91bGQgYmUgc3RhcnRlZCBmaXJzdAotCQkvLyBsaXN0ZW4gZm9yIGNsYXNzcGF0aCBjaGFuZ2VzCi0JCUpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuaW5pdGlhbGl6ZSgpOwotCQkvLyBsaXN0ZW4gZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcyBrZXlzCi0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gc3RvcCBsaXN0ZW5uaW5nIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMKLQkJLy8ga2V5cwotCQkvLyBzdG9wIGFueSBpbmRleGluZwotCQlKc0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNodXRkb3duKCk7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhYzQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgTG9nZ2VyLkVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgTG9nZ2VyLklORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBMb2dnZXIuT0s7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgTG9nZ2VyLldBUk5JTkc7Ci0JCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gTG9nZ2VyLk9LX0RFQlVHIHx8IGxldmVsID09IExvZ2dlci5JTkZPX0RFQlVHIHx8IGxldmVsID09IExvZ2dlci5XQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IExvZ2dlci5FUlJPUl9ERUJVRykgewotCQkJaWYgKCFMb2dnZXIuaXNEZWJ1Z2dpbmcoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUc6Ci0JCQljYXNlIElORk86Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRzoKLQkJCWNhc2UgV0FSTklORzoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRzoKLQkJCWNhc2UgRVJST1I6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIExvZ2dlci5QTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKExvZ2dlci5QTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKExvZ2dlci5pc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBMb2dnZXIuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShMb2dnZXIuUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghTG9nZ2VyLmlzRGVidWdnaW5nKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihMb2dnZXIuUExVR0lOX0lEICsgTG9nZ2VyLlRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTG9nZ2VyLl9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl9sb2coTG9nZ2VyLkVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl9sb2coTG9nZ2VyLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlMb2dnZXIuX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9JV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0lXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGVkZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0lXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyIGV4dGVuZHMgSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1JJTkcgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUlRZX0RPQyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSVFlfTU9ERUwgPSAyOwotCQotCXB1YmxpYyBpbnQgZ2V0SW50cmVzdExldmVsQXRPZmZzZXQoaW50IGRvY3VtZW50T2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9JV2ViUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9JV2ViUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4NGU4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lciB7Ci0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODk0MzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1dlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1dlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGQ4ZThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9XZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElEb2N1bWVudExpc3RlbmVyLCBJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciB7Ci0JLyoKLQkgKiBDaGVjayB0aGUgbGV2ZWwgb2YgZGlydHkgcmVnaW9ucyB3aGVuIHNpZ25hbGluZyBmb3IgZG9jdW1lbnQgZXZlbnRzLgotCSAqIAotCSAqIHNvbWV0aW1lcyB0aGUgU1NFIGVkaXRvciBkb2Vzbid0IHJlLXZhbGlkYXRlIHJlZ2lvbnMgd2hlbiB0ZXh0IGlzCi0JICogaW5zZXJ0ZWQsIHNvIHNldHRpbmcgdGhpcyB0byBmYWxzZSBjYXVzZXMgZXZlcnkgZG9jdW1lbnQgY2hhbmdlIGV2ZW50IHRvCi0JICogdHJpZ2dlciBhIHJldmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBzZXR0aW5nIHRvIHRydWUgbWF5IHNwZWVkIHRoaW5ncyB1cC4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENIRUNLX0lOVFJFU1RfTEVWRUwgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0lHTkFMX01PREVMID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIgZ2V0SW5zdGFuY2UoSVN0cnVjdHVyZWRNb2RlbCB4bWxNb2RlbCwgSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyIGNoYW5nZUxpc3RlbmVyKSB7Ci0JCVdlYlJlc291cmNlQ2hhbmdlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzKSB7Ci0JCQlFbnVtZXJhdGlvbiB2YWx1ZXMgPSBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAodmFsdWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJT2JqZWN0IG1vZGVsID0gdmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKG1vZGVsID09IHhtbE1vZGVsKSB7Ci0JCQkJCWhhbmRsZXIgPSAoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyKSBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzLmdldChtb2RlbCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotCQkJCWhhbmRsZXIgPSBuZXcgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyKCk7Ci0JCQkJV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5wdXQoaGFuZGxlciwgeG1sTW9kZWwpOwotCQkJfQotCQl9Ci0JCWhhbmRsZXIuaW5pdGlhbGl6ZSgpOwotCQloYW5kbGVyLmZjaGFuZ2VMaXN0ZW5lci5hZGQoY2hhbmdlTGlzdGVuZXIpOwotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0JcHJpdmF0ZSBjbGFzcyBNb2RlbElycml0YW50VGhyZWFkIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlzaWduYWxBbGxEaXJ0eU1vZGVsKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNpZ25hbEFsbERpcnR5TW9kZWwoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZjaGFuZ2VMaXN0ZW5lci5zaXplKCk7IGkrKykgewotCQkJCSgoSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyKSBmY2hhbmdlTGlzdGVuZXIuZ2V0KGkpKS5yZXNvdXJjZUNoYW5nZWQoKTsKLQkJCX0KLQkJCWlmICghV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLlNJR05BTF9NT0RFTCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCQlPYmplY3QgbW9kZWxSZWYgPSBnZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsUmVmID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0cnkgewotLy8gZm9yKGludCBpID0wO2k8ZmNoYW5nZUxpc3RlbmVyLnNpemUoKTtpKyspIHsKLS8vICgoSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyKWZjaGFuZ2VMaXN0ZW5lci5nZXQoaSkpLnJlc291cmNlQ2hhbmdlZCgpOwotLy8gfQotCQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdCgoKElTdHJ1Y3R1cmVkTW9kZWwpIG1vZGVsUmVmKS5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSB4bWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJeG1sTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJCS8vIHhtbE1vZGVsLnNldFJlaW5pdGlhbGl6ZU5lZWRlZCh0cnVlKTsKLQkJCQkJLy8gKGRvYykucmVwbGFjZSgwLCBkb2MuZ2V0TGVuZ3RoKCksZG9jLmdldCgpKTsKLQkJCQkJeG1sTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuZ2V0U3RyaW5nKCJXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuMCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZmNoYW5nZUxpc3RlbmVyID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTW9kZWxJcnJpdGFudFRocmVhZCBpcnJpdGF0b3I7Ci0JCi0JcHJpdmF0ZSBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIoKSB7fQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7fQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0vLwkJaWYgKFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5DSEVDS19JTlRSRVNUX0xFVkVMKSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmNoYW5nZUxpc3RlbmVyLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQlPYmplY3QgbyA9IGZjaGFuZ2VMaXN0ZW5lci5nZXQoaSk7Ci0vLwkJCQlpZiAobyBpbnN0YW5jZW9mIElXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyKSB7Ci0vLwkJCQkJaW50IGludHJlc3QgPSAoKElXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyKSBvKS5nZXRJbnRyZXN0TGV2ZWxBdE9mZnNldChldmVudC5mT2Zmc2V0KTsKLS8vCQkJCQlzd2l0Y2ggKGludHJlc3QpIHsKLS8vCQkJCQkJY2FzZSBJV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lci5ESVJUWV9NT0RFTDoKLS8vCQkJCQkJCWlycml0YXRvci5zaWduYWxBbGxEaXJ0eU1vZGVsKCk7Ci0vLwkJCQkJCQlyZXR1cm47Ci0vLwkJCQkJCWNhc2UgSVdlYkRvY3VtZW50Q2hhbmdlTGlzdGVuZXIuRElSVFlfRE9DOgotLy8JCQkJCQkJKChJV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lcikgbykucmVzb3VyY2VDaGFuZ2VkKCk7Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCX0KLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9IGVsc2UgewotCQkJaXJyaXRhdG9yLnNpZ25hbEFsbERpcnR5TW9kZWwoKTsKLQkJLy99Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKG8gaW5zdGFuY2VvZiBXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIgJiYgKChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIpIG8pLmZjaGFuZ2VMaXN0ZW5lciA9PSB0aGlzLmZjaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGZpbmFsaXplKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9iamVjdCBvID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzKSB7Ci0JCQlvID0gV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5nZXQodGhpcyk7Ci0JCQlXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzLnJlbW92ZSh0aGlzKTsKLQkJfQotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIGZYTUxNb2RlbCA9IChJU3RydWN0dXJlZE1vZGVsKSBvOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBmSnNwRG9jdW1lbnQgPSBmWE1MTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZkpzcERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmSnNwRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCWlmIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSVN0cnVjdHVyZWRNb2RlbCkgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5nZXQodGhpcyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHhtbE1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQl4bWxNb2RlbC5hZGRNb2RlbExpZmVjeWNsZUxpc3RlbmVyKHRoaXMpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGZKc3BEb2N1bWVudCA9IHhtbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoZkpzcERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZKc3BEb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWlycml0YXRvciA9IG5ldyBNb2RlbElycml0YW50VGhyZWFkKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb2Nlc3NQb3N0TW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChpcnJpdGF0b3IgIT0gbnVsbCkgewotCQkJaXJyaXRhdG9yLnNpZ25hbEFsbERpcnR5TW9kZWwoKTsKLQkJfQotCQlpZiAoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1JFTEVBU0VEKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMpIHsKLQkJCQlXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzLnJlbW92ZSh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9jZXNzUHJlTW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7fQotCQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoaXJyaXRhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDZiZjVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci4wPUVycm9yIHdoZW4gdXBkYXRpbmcgdGhlIG1vZGVsLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc05hdHVyZUluc3RhbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc05hdHVyZUluc3RhbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmU1Y2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNOYXR1cmVJbnN0YWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlUGx1Z2luOwotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNOYXR1cmVJbnN0YWxsZXIgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIE9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQltb25pdG9yLmJlZ2luVGFzaygiSW5zdGFsbGluZyBGYWNldCBmb3IgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29scyIgKyAiLiIsIDEwMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0cnkgewotCQkJaW5zdGFsbE5hdHVyZShwcm9qZWN0LCBtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluc3RhbGxOYXR1cmUoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiSnNOYXR1cmVJbnN0YWxsZXIuMSIpLCAxMDApOyAvLyROT04tTkxTLTEkCi0JCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIkpzTmF0dXJlSW5zdGFsbGVyLjIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1YiA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMjUpOwotCQl0cnkgewotCQkJbW9uaXRvci53b3JrZWQoMjApOwotCQkJSnNXZWJOYXR1cmUganNOYXR1cmUgPSBuZXcgSnNXZWJOYXR1cmUocHJvamVjdCwgbW9uaXRvcik7Ci0JCQltb25pdG9yLndvcmtlZCgyMCk7Ci0JCQlqc05hdHVyZS5jb25maWd1cmUoKTsKLQkJCW1vbml0b3Iud29ya2VkKDQwKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc05hdHVyZUluc3RhbGxlci4zIiksIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc05hdHVyZVVuaW5zdGFsbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0pzTmF0dXJlVW5pbnN0YWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYxMTFjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0pzTmF0dXJlVW5pbnN0YWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlUGx1Z2luOwotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNOYXR1cmVVbmluc3RhbGxlciBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCJVbmluc3RhbGxpbmcgRmFjZXQgZm9yIEphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbHMiICsgIi4iLCAxMDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHJ5IHsKLQkJCXVuaW5zdGFsbE5hdHVyZShwcm9qZWN0LCBtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbE5hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc05hdHVyZVVuaW5zdGFsbGVyLjEiKSwgMTAwKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBieSB1c2luZyBuYXR1cmVzIHdlIGNhbiBsZXZlcmFnZSB0aGUgcHJlY29uZGl0aW9uIHN1cHBvcnQKLQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiSnNOYXR1cmVVbmluc3RhbGxlci4yIikpOyAvLyROT04tTkxTLTEkCi0JCVN1YlByb2dyZXNzTW9uaXRvciBzdWIgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDI1KTsKLQkJaWYgKCFKc1dlYk5hdHVyZS5oYXNOYXR1cmUocHJvamVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJSVByb2plY3ROYXR1cmUganNOYXR1cmUgPSBuZXcgSnNXZWJOYXR1cmUocHJvamVjdCwgbW9uaXRvcik7Ci0JCQltb25pdG9yLndvcmtlZCgyMCk7Ci0JCQltb25pdG9yLndvcmtlZCg1MCk7Ci0JCQlqc05hdHVyZS5kZWNvbmZpZ3VyZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMjApOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc05hdHVyZVVuaW5zdGFsbGVyLjMiKSwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0pzV2ViTmF0dXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0pzV2ViTmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NzhjYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc1dlYk5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbmNsdWRlUGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbmNsdWRlUGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5MaWJyYXJ5U3VwZXJUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc1dlYk5hdHVyZSBpbXBsZW1lbnRzIElQcm9qZWN0TmF0dXJlIHsKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRV9DTEFTU1BBVEggPSAiLmNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEU1tdID0KLQkvLyB7Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmVtYmVkZWQuanNOYXR1cmUiLEphdmFTY3JpcHRDb3JlLk5BVFVSRV9JRH07Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRVUkVfSURTW10gPSB7IEphdmFTY3JpcHRDb3JlLk5BVFVSRV9JRCB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBWSVJUVUFMX0JST1dTRVJfQ0xBU1NQQVRIID0gbmV3IFBhdGgoIm9yZy5lY2xpcHNlLndzdC5qc2R0LmxhdW5jaGluZy5iYXNlQnJvd3NlckxpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQ09OVEFJTkVSID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LmxhdW5jaGluZy5XZWJQcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUluY2x1ZGVQYXRoRW50cnkgVklSVFVBTF9TQ09QRV9FTlRSWSA9IEphdmFTY3JpcHRDb3JlLm5ld0NvbnRhaW5lckVudHJ5KG5ldyBQYXRoKFZJUlRVQUxfQ09OVEFJTkVSKSwgIG5ldyBJQWNjZXNzUnVsZVswXSwgbmV3IElJbmNsdWRlUGF0aEF0dHJpYnV0ZVtdIHtJSW5jbHVkZVBhdGhBdHRyaWJ1dGUuSElERX0sIGZhbHNlKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfVFlQRV9OQU1FID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfVFlQRV9MSUJSQVJZID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LmxhdW5jaGluZy5iYXNlQnJvd3NlckxpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyogRGVmYXVsdCBKUkUgZW50cnkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KUkVfUEFUSCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSnNOYXR1cmUoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmICghSnNXZWJOYXR1cmUuaGFzTmF0dXJlKHByb2plY3QpKSB7Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nW10gcHJldk5hdHVyZXMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJCVN0cmluZ1tdIG5ld05hdHVyZXMgPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIEpzV2ViTmF0dXJlLk5BVFVSRV9JRFMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCQkvLyBuZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aF0gPSBKYXZhU2NyaXB0Q29yZS5OQVRVUkVfSUQ7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IEpzV2ViTmF0dXJlLk5BVFVSRV9JRFMubGVuZ3RoOyBpKyspIHsKLQkJCQluZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aCArIGldID0gSnNXZWJOYXR1cmUuTkFUVVJFX0lEU1tpXTsKLQkJCX0KLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNOYXR1cmUoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBKc1dlYk5hdHVyZS5OQVRVUkVfSURTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShKc1dlYk5hdHVyZS5OQVRVUkVfSURTW2ldKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVKc05hdHVyZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKEpzV2ViTmF0dXJlLmhhc05hdHVyZShwcm9qZWN0KSkgewotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggLSBKc1dlYk5hdHVyZS5OQVRVUkVfSURTLmxlbmd0aF07Ci0JCQlpbnQgayA9IDA7Ci0JCQloZWFkOiBmb3IgKGludCBpID0gMDsgaSA8IHByZXZOYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBKc1dlYk5hdHVyZS5OQVRVUkVfSURTLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChwcmV2TmF0dXJlc1tpXSA9PSBKc1dlYk5hdHVyZS5OQVRVUkVfSURTW2pdKSB7Ci0JCQkJCQljb250aW51ZSBoZWFkOwotCQkJCQl9Ci0JCQkJfQotCQkJCW5ld05hdHVyZXNbaysrXSA9IHByZXZOYXR1cmVzW2ldOwotCQkJfQotCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBWZWN0b3IgY2xhc3NQYXRoRW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLQlwcml2YXRlIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwcml2YXRlIElQcm9qZWN0IGZDdXJyUHJvamVjdDsKLQlwcml2YXRlIEphdmFQcm9qZWN0IGZKYXZhUHJvamVjdDsKLQlwcml2YXRlIElQYXRoIGZPdXRwdXRMb2NhdGlvbjsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQkKLQlwdWJsaWMgSnNXZWJOYXR1cmUoKSB7Ci0JCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCX0KLQkKLQlwdWJsaWMgSnNXZWJOYXR1cmUoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZDdXJyUHJvamVjdCA9IHByb2plY3Q7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCX0gZWxzZSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaW5pdE91dHB1dFBhdGgoKTsKLQkJY3JlYXRlU291cmNlQ2xhc3NQYXRoKCk7Ci0JCWluaXRKUkVFbnRyeSgpOwotCQlpbml0TG9jYWxDbGFzc1BhdGgoKTsKLQkJCi0JCWlmIChoYXNQcm9qZWN0Q2xhc3NQYXRoRmlsZSgpKSB7Ci0JCQlJSW5jbHVkZVBhdGhFbnRyeVtdIGVudHJpZXMgPSBnZXRSYXdDbGFzc1BhdGgoKTsKLQkJCWlmIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggPiAwKSB7Ci0JCQkJY2xhc3NQYXRoRW50cmllcy5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChlbnRyaWVzKSk7Ci0JCQkJY2xhc3NQYXRoRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChlbnRyaWVzKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUpzV2ViTmF0dXJlLmFkZEpzTmF0dXJlKGZDdXJyUHJvamVjdCwgbW9uaXRvcik7Ci0JCWZKYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgSmF2YVNjcmlwdENvcmUuY3JlYXRlKGZDdXJyUHJvamVjdCk7Ci0JCWZKYXZhUHJvamVjdC5zZXRQcm9qZWN0KGZDdXJyUHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQkvLyAsIGZPdXRwdXRMb2NhdGlvbgotCQkJaWYgKCFoYXNQcm9qZWN0Q2xhc3NQYXRoRmlsZSgpKSB7Ci0JCQkJZkphdmFQcm9qZWN0LnNldFJhd0luY2x1ZGVwYXRoKChJSW5jbHVkZVBhdGhFbnRyeVtdKSBjbGFzc1BhdGhFbnRyaWVzLnRvQXJyYXkobmV3IElJbmNsdWRlUGF0aEVudHJ5W10ge30pLCBmT3V0cHV0TG9jYXRpb24sIG1vbml0b3IpOwotCQkJfWVsc2V7Ci0JCQkJZkphdmFQcm9qZWN0LnNldFJhd0luY2x1ZGVwYXRoKChJSW5jbHVkZVBhdGhFbnRyeVtdKSBjbGFzc1BhdGhFbnRyaWVzLnRvQXJyYXkobmV3IElJbmNsdWRlUGF0aEVudHJ5W10ge30pLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJfQotCQlMaWJyYXJ5U3VwZXJUeXBlIHN1cGVyVHlwZSA9IG5ldyBMaWJyYXJ5U3VwZXJUeXBlKG5ldyBQYXRoKCBTVVBFUl9UWVBFX0xJQlJBUlkpLCAgZ2V0SmF2YVByb2plY3QoKSwgU1VQRVJfVFlQRV9OQU1FKTsKLQkJZ2V0SmF2YVByb2plY3QoKS5zZXRDb21tb25TdXBlclR5cGUoc3VwZXJUeXBlKTsKLQkJLy8gZ2V0SmF2YVByb2plY3QoKS5hZGRUb0J1aWxkU3BlYyhCVUlMREVSX0lEKTsKLQkJZkN1cnJQcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlU291cmNlQ2xhc3NQYXRoKCkgewotCQlpZiAoaGFzQVZhbGlkU291cmNlUGF0aCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gSVBhdGggcHJvamVjdFBhdGggPSBmQ3VyclByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkJLy8gY2xhc3NQYXRoRW50cmllcy5hZGQoSmF2YVNjcmlwdENvcmUubmV3U291cmNlRW50cnkocHJvamVjdFBhdGgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVZlY3RvciBiYWRFbnRyaWVzID0gbmV3IFZlY3RvcigpOwotCQlJSW5jbHVkZVBhdGhFbnRyeSBkZWZhdWx0SlJFTGlicmFyeSA9ICBnZXRKcmVFbnRyeSgpOwotCQlJSW5jbHVkZVBhdGhFbnRyeVtdIGxvY2FsRW50cmllcyA9IGluaXRMb2NhbENsYXNzUGF0aCgpOwotCQliYWRFbnRyaWVzLmFkZChkZWZhdWx0SlJFTGlicmFyeSk7Ci0JCWJhZEVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobG9jYWxFbnRyaWVzKSk7Ci0JCUlJbmNsdWRlUGF0aEVudHJ5W10gZW50cmllcyA9IGdldFJhd0NsYXNzUGF0aCgpOwotCQlWZWN0b3IgZ29vZEVudHJpZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFiYWRFbnRyaWVzLmNvbnRhaW5zKGVudHJpZXNbaV0pKSB7Ci0JCQkJZ29vZEVudHJpZXMuYWRkKGVudHJpZXNbaV0pOwotCQkJfQotCQl9Ci0JCS8vIGdldEphdmFQcm9qZWN0KCkucmVtb3ZlRnJvbUJ1aWxkU3BlYyhCVUlMREVSX0lEKTsKLQkJSVBhdGggb3V0cHV0TG9jYXRpb24gPSBnZXRKYXZhUHJvamVjdCgpLmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCWdldEphdmFQcm9qZWN0KCkuc2V0UmF3SW5jbHVkZXBhdGgoKElJbmNsdWRlUGF0aEVudHJ5W10pIGdvb2RFbnRyaWVzLnRvQXJyYXkobmV3IElJbmNsdWRlUGF0aEVudHJ5W10ge30pLCBvdXRwdXRMb2NhdGlvbiwgbW9uaXRvcik7Ci0JCWdldEphdmFQcm9qZWN0KCkuZGVjb25maWd1cmUoKTsKLQkJSnNXZWJOYXR1cmUucmVtb3ZlSnNOYXR1cmUoZkN1cnJQcm9qZWN0LCBtb25pdG9yKTsKLQkJZkN1cnJQcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCWlmIChmSmF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJZkphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBKYXZhU2NyaXB0Q29yZS5jcmVhdGUoZkN1cnJQcm9qZWN0KTsKLQkJCWZKYXZhUHJvamVjdC5zZXRQcm9qZWN0KGZDdXJyUHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGZKYXZhUHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmZDdXJyUHJvamVjdDsKLQl9Ci0JCi0JcHJpdmF0ZSBJSW5jbHVkZVBhdGhFbnRyeVtdIGdldFJhd0NsYXNzUGF0aCgpIHsKLQkJSmF2YVByb2plY3QgcHJvaiA9IG5ldyBKYXZhUHJvamVjdCgpOwotCQlwcm9qLnNldFByb2plY3QoZkN1cnJQcm9qZWN0KTsKLQkJcmV0dXJuIHByb2oucmVhZFJhd0luY2x1ZGVwYXRoKCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBoYXNBVmFsaWRTb3VyY2VQYXRoKCkgewotCQlpZiAoaGFzUHJvamVjdENsYXNzUGF0aEZpbGUoKSkgewotCQkJdHJ5IHsKLQkJCQlJSW5jbHVkZVBhdGhFbnRyeVtdIGVudHJpZXMgPSBnZXRSYXdDbGFzc1BhdGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGVudHJpZXNbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUluY2x1ZGVQYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc1dlYk5hdHVyZS41IikgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBoYXNQcm9qZWN0Q2xhc3NQYXRoRmlsZSgpIHsKLQkJaWYgKGZDdXJyUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZDdXJyUHJvamVjdC5nZXRGb2xkZXIoSmF2YVByb2plY3QuREVGQVVMVF9QUkVGRVJFTkNFU19ESVJOQU1FKS5nZXRGaWxlKEphdmFQcm9qZWN0LkNMQVNTUEFUSF9GSUxFTkFNRSkuZXhpc3RzKCk7Ci0JfQotCQotCXByaXZhdGUgSUluY2x1ZGVQYXRoRW50cnkgZ2V0SnJlRW50cnkoKSB7Ci0JCXJldHVybiBKYXZhU2NyaXB0Q29yZS5uZXdDb250YWluZXJFbnRyeShuZXcgUGF0aChERUZBVUxUX0pSRV9QQVRIKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0SlJFRW50cnkoKSB7Ci0JCUlJbmNsdWRlUGF0aEVudHJ5IGRlZmF1bHRKUkVMaWJyYXJ5ID0gIGdldEpyZUVudHJ5KCk7Ci0JCXRyeSB7Ci0JCQlJSW5jbHVkZVBhdGhFbnRyeVtdIGVudHJpZXMgPSBnZXRSYXdDbGFzc1BhdGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbnRyaWVzW2ldID09IGRlZmF1bHRKUkVMaWJyYXJ5KSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQljbGFzc1BhdGhFbnRyaWVzLmFkZChkZWZhdWx0SlJFTGlicmFyeSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc1dlYk5hdHVyZS42IikgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSUluY2x1ZGVQYXRoRW50cnlbXSBpbml0TG9jYWxDbGFzc1BhdGgoKSB7Ci0JCQotCQljbGFzc1BhdGhFbnRyaWVzLmFkZChKc1dlYk5hdHVyZS5WSVJUVUFMX1NDT1BFX0VOVFJZKTsKLQkJSUluY2x1ZGVQYXRoRW50cnkgYnJvd3NlckxpYnJhcnkgPSBKYXZhU2NyaXB0Q29yZS5uZXdDb250YWluZXJFbnRyeSggVklSVFVBTF9CUk9XU0VSX0NMQVNTUEFUSCk7Ci0JCWNsYXNzUGF0aEVudHJpZXMuYWRkKGJyb3dzZXJMaWJyYXJ5KTsKLQkJLy9JUGF0aCB3ZWJSb290ID0gV2ViUm9vdEZpbmRlci5nZXRXZWJDb250ZW50Rm9sZGVyKGZDdXJyUHJvamVjdCk7Ci0JLy8JSUluY2x1ZGVQYXRoRW50cnkgc291cmNlID0gSmF2YVNjcmlwdENvcmUubmV3U291cmNlRW50cnkoZkN1cnJQcm9qZWN0LmdldEZ1bGxQYXRoKCkuYXBwZW5kKHdlYlJvb3QpLmFwcGVuZCgiLyIpKTsKLQkvLwljbGFzc1BhdGhFbnRyaWVzLmFkZChzb3VyY2UpOwotCQlyZXR1cm4gbmV3IElJbmNsdWRlUGF0aEVudHJ5W10geyBKc1dlYk5hdHVyZS5WSVJUVUFMX1NDT1BFX0VOVFJZICwgYnJvd3NlckxpYnJhcnkvKixzb3VyY2UqL307Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0T3V0cHV0UGF0aCgpIHsKLQkJaWYgKGZPdXRwdXRMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlmT3V0cHV0TG9jYXRpb24gPSBmQ3VyclByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5mQ3VyclByb2plY3QgPSBwcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyNjk3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0Lm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L1dlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjNDk2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L1dlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSW5jbHVkZVBhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKc0dsb2JhbFNjb3BlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuY29tcGlsZXIubGlicmFyaWVzLkxpYnJhcnlMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzTmFtZU1hbmdsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuV2ViUm9vdEZpbmRlcjsKLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplciBleHRlbmRzIEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplciAgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUlORVJfREVTQ1JJUFRJT04gPSBNZXNzYWdlcy5nZXRTdHJpbmcoIldlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuMCIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gTElCX05BTUUgPSB7J2InLCdyJywnbycsJ3cnLCdzJywnZScsJ3InLCdXJywnaScsJ24nLCdkJywnbycsJ3cnLCcuJywnaicsJ3MnfTsKLQkvKiBTb21lIHRva2VucyBmb3IgdXMgdG8gaWRlbnRpZnkgbWFuZ2xlZCBwYXRocyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5HTEVEX0JVVFQxID0gImh0bSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOR0xFRF9CVVRUMiA9ICIuanMiOyAvLyROT04tTkxTLTEkCi0JCi0JLy9wcml2YXRlIElKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvamVjdDsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VW5tYW5nZWRIdG1sUGF0aChTdHJpbmcgY29udGFpbmVyUGF0aFN0cmluZykgewotCQlpZiAoY29udGFpbmVyUGF0aFN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoY29udGFpbmVyUGF0aFN0cmluZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5NQU5HTEVEX0JVVFQxKSAhPSAtMSAmJiBjb250YWluZXJQYXRoU3RyaW5nLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihXZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLk1BTkdMRURfQlVUVDIpICE9IC0xKSB7Ci0JCQlyZXR1cm4gSnNOYW1lTWFuZ2xlclV0aWwudW5tYW5nbGUoY29udGFpbmVyUGF0aFN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBMaWJyYXJ5TG9jYXRpb24gZ2V0TGlicmFyeUxvY2F0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplciNjYW5VcGRhdGVKc0dsb2JhbFNjb3BlQ29udGFpbmVyKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0KQotCSAqLwotCQotCXB1YmxpYyBib29sZWFuIGNhblVwZGF0ZUpzR2xvYmFsU2NvcGVDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFTY3JpcHRQcm9qZWN0IHByb2plY3QpIHsKLQkJLyogZG9udCByZW1vdmUgZnJvbSB0aGlzIHByb2plY3QgKi8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSUpzR2xvYmFsU2NvcGVDb250YWluZXIgZ2V0Q29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhU2NyaXB0UHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5DT05UQUlORVJfREVTQ1JJUFRJT047Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Kc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIjZ2V0RGVzY3JpcHRpb24ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3QpCi0JICovCi0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGNvbnRhaW5lclBhdGguZXF1YWxzKG5ldyBQYXRoKEpzV2ViTmF0dXJlLlZJUlRVQUxfQ09OVEFJTkVSKSkpIHsKLQkJCXJldHVybiBXZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLkNPTlRBSU5FUl9ERVNDUklQVElPTjsKLQkJfQotCQkKLQkJU3RyaW5nIGNvbnRhaW5lclBhdGhTdHJpbmcgPSBjb250YWluZXJQYXRoLnRvU3RyaW5nKCk7Ci0JCUlQYXRoIHdlYkNvbnRleHQgPSBnZXRXZWJDb250ZXh0Um9vdChqYXZhUHJvamVjdCk7Ci0JCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gY29udGFpbmVyUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWlmKGNvbnRhaW5lclBhdGguZXF1YWxzKGdldFdlYkNvbnRleHRSb290KGphdmFQcm9qZWN0KSkgfHwgKGZpbGVFeHRlbnNpb24hPW51bGwgJiYgZmlsZUV4dGVuc2lvbi5lcXVhbHMoImpzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB3ZWJDb250ZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQkJU3RyaW5nIHVubWFuZ2xlZCA9IFdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuZ2V0VW5tYW5nZWRIdG1sUGF0aChjb250YWluZXJQYXRoU3RyaW5nKTsKLQkJaWYgKHVubWFuZ2xlZCAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwcm9qZWN0UGF0aCA9IGphdmFQcm9qZWN0LmdldFBhdGgoKTsKLQkJCS8qIFJlcGxhY2UgdGhlIHByb2plY3QgcGF0aCB3aXRoIHRoZSBwcm9qZWN0IG5hbWUgKi8KLQkJCWlmICh1bm1hbmdsZWQuaW5kZXhPZihwcm9qZWN0UGF0aC50b1N0cmluZygpKSA+PSAwKSB7Ci0JCQkJdW5tYW5nbGVkID0gamF2YVByb2plY3QuZ2V0RGlzcGxheU5hbWUoKSArICI6IiArIHVubWFuZ2xlZC5zdWJzdHJpbmcocHJvamVjdFBhdGgudG9TdHJpbmcoKS5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB1bm1hbmdsZWQ7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lclBhdGhTdHJpbmc7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Kc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIjZ2V0SG9zdFBhdGgob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCQotCXB1YmxpYyBVUkkgZ2V0SG9zdFBhdGgoSVBhdGggcGF0aCwgSUphdmFTY3JpcHRQcm9qZWN0IHByb2plY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTdHJpbmcgaHRtbFBhdGggPSBXZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLmdldFVubWFuZ2VkSHRtbFBhdGgocGF0aC50b1N0cmluZygpKTsKLQkJaWYgKGh0bWxQYXRoICE9IG51bGwpIHsKLQkJCVVSSSBmaWxlVXJpID0gIG5ldyBQYXRoKGh0bWxQYXRoKS50b0ZpbGUoKS50b1VSSSgpOwotCQkJcmV0dXJuIGZpbGVVcmk7Ci0JCQkvLwkJCXRyeSB7Ci0vLwkJCQlyZXR1cm4gbmV3IFVSSShodG1sUGF0aCk7Ci0vLwkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgewotLy8JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCX0KLQkJfQotLy8JCWVsc2UgewotLy8JCQl0cnkgewotLy8JCQkJcmV0dXJuIG5ldyBVUkkocGF0aC50b1N0cmluZygpKTsKLS8vCQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0vLwkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJfQotLy8JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIElKc0dsb2JhbFNjb3BlQ29udGFpbmVyLktfU1lTVEVNOwotCX0KLQkKLQkKLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKEpzV2ViTmF0dXJlLlZJUlRVQUxfQ09OVEFJTkVSKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRJbmNsdWRlcGF0aEVudHJpZXMoKX0gaW5zdGVhZAotCSAqLwotCXB1YmxpYyBJSW5jbHVkZVBhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSB7Ci0JCXJldHVybiBnZXRJbmNsdWRlcGF0aEVudHJpZXMoKTsKLQl9Ci0JcHVibGljIElJbmNsdWRlUGF0aEVudHJ5W10gZ2V0SW5jbHVkZXBhdGhFbnRyaWVzKCkgewotCQkKLQkJLy9JSW5jbHVkZVBhdGhFbnRyeSBlbnRyeT1udWxsOwotCQkKLQlyZXR1cm4gbmV3IElJbmNsdWRlUGF0aEVudHJ5WzBdOwotLy8JCXRyeSB7Ci0vLwkJCi0vLwkJCQotLy8JCQkKLS8vCQkJSVBhdGggY29udGV4dFBhdGggPSBnZXRXZWJDb250ZXh0Um9vdChqYXZhUHJvamVjdCk7Ci0vLwkJCS8vZW50cnkgPUphdmFTY3JpcHRDb3JlLm5ld0xpYnJhcnlFbnRyeShjb250ZXh0UGF0aC5tYWtlQWJzb2x1dGUoKSwgbnVsbCxudWxsLCBuZXcgSUFjY2Vzc1J1bGVbMF0sIG5ldyBJSW5jbHVkZVBhdGhBdHRyaWJ1dGVbMF0sIHRydWUpOwotLy8JCQkvL2VudHJ5ID1KYXZhU2NyaXB0Q29yZS5uZXdMaWJyYXJ5RW50cnkoY29udGV4dFBhdGgubWFrZUFic29sdXRlKCksIG51bGwsIG51bGwsIG5ldyBJQWNjZXNzUnVsZVswXSwgbmV3IElJbmNsdWRlUGF0aEF0dHJpYnV0ZVswXSwgdHJ1ZSk7Ci0vLwkJCS8vZW50cnkgPUphdmFTY3JpcHRDb3JlLm5ld1NvdXJjZUVudHJ5KGNvbnRleHRQYXRoLm1ha2VBYnNvbHV0ZSgpKTsKLS8vCQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoRW50cnkoCi0vLwkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UsCi0vLwkJCQkJSUluY2x1ZGVQYXRoRW50cnkuQ1BFX1NPVVJDRSwKLS8vCQkJCQljb250ZXh0UGF0aC5tYWtlQWJzb2x1dGUoKSwKLS8vCQkJCQlDbGFzc3BhdGhFbnRyeS5JTkNMVURFX0FMTCwgQ2xhc3NwYXRoRW50cnkuRVhDTFVERV9OT05FLAotLy8JCQkJCW51bGwsIC8vIHNvdXJjZSBhdHRhY2htZW50Ci0vLwkJCQkJbnVsbCwgLy8gc291cmNlIGF0dGFjaG1lbnQgcm9vdAotLy8JCQkJCW51bGwsIC8vIGN1c3RvbSBvdXRwdXQgbG9jYXRpb24KLS8vCQkJCQlmYWxzZSwKLS8vCQkJCQludWxsLAotLy8JCQkJCWZhbHNlLCAvLyBubyBhY2Nlc3MgcnVsZXMgdG8gY29tYmluZQotLy8JCQkJCW5ldyBJSW5jbHVkZVBhdGhBdHRyaWJ1dGVbXSB7Q2xhc3NwYXRoRW50cnkuRVhDTFVERV9WQUxJREFURX0pOyAKLS8vCQkJCi0vLwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotLy8JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0vLwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCX0KLS8vCQkKLS8vCQlpZihlbnRyeSE9bnVsbCkgcmV0dXJuIG5ldyBJSW5jbHVkZVBhdGhFbnRyeVtdIHtlbnRyeX07Ci0vLwkJcmV0dXJuIG5ldyBJSW5jbHVkZVBhdGhFbnRyeVswXTsKLQl9Ci0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVNjcmlwdFByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvL3RoaXMuamF2YVByb2plY3QgPSBwcm9qZWN0OwotCQlzdXBlci5pbml0aWFsaXplKGNvbnRhaW5lclBhdGgsIHByb2plY3QpOwotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZXh0Um9vdChJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2plY3QpIHsKLQkJU3RyaW5nIHdlYlJvb3QgPSBXZWJSb290RmluZGVyLmdldFdlYkNvbnRlbnRGb2xkZXIoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKS50b1N0cmluZygpOwkKLQkJSVBhdGggd2ViUm9vdFBhdGggPSBqYXZhUHJvamVjdC5nZXRQYXRoKCkuYXBwZW5kKHdlYlJvb3QpOwotCQlyZXR1cm4gd2ViUm9vdFBhdGg7Ci0JfQotCQotLy8JcHVibGljIElQYXRoW10gZ2V0QWxsSHRtbEluUHJvamVjdCgpIHsKLS8vCQlmaW5hbCBBcnJheUxpc3QgZm91bmQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJU3RyaW5nIHdlYlJvb3QgPSBnZXRXZWJDb250ZXh0Um9vdChqYXZhUHJvamVjdCkudG9TdHJpbmcoKTsJCi0vLwkJCUlSZXNvdXJjZVByb3h5VmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpCi0vLwkJCXsKLS8vCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KCBJUmVzb3VyY2VQcm94eSBwcm94eSApIHRocm93cyBDb3JlRXhjZXB0aW9uCi0vLwkJCQl7Ci0vLwkJCQkJaWYgKCBwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoICIuaHRtIiApICkKLS8vCQkJCQl7Ci0vLwkJCQkJCUlQYXRoIHBhdGggPSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpOwotLy8JCQkJCQlmb3VuZC5hZGQocGF0aCk7Ci0vLwkJCQkJCS8vSUluY2x1ZGVQYXRoRW50cnkgbmV3TGlicmFyeUVudHJ5ID0gSmF2YVNjcmlwdENvcmUubmV3TGlicmFyeUVudHJ5KCBwYXRoLG51bGwsIG51bGwsIG5ldyBJQWNjZXNzUnVsZVsgMCBdLCBuZXcgSUluY2x1ZGVQYXRoQXR0cmlidXRlWyAwIF0sIHRydWUgKTsKLS8vCQkJCQkJLy9lbnRyaWVzLmFkZCggbmV3TGlicmFyeUVudHJ5ICk7Ci0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQl9Ci0vLwkJCQkJCi0vLwkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQl9Ci0vLwkJCX07Ci0vLwkJCXRyeQotLy8JCQl7Ci0vLwkJCQlqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZmluZE1lbWJlciggbmV3IFBhdGgod2ViUm9vdCkgKS5hY2NlcHQoIHZpc2l0b3IsIDAgKTsKLS8vCQkJfQotLy8JCQljYXRjaCAoIENvcmVFeGNlcHRpb24gZSApCi0vLwkJCXsKLS8vCQkJfQotLy8JCQotLy8JCQotLy8JCXJldHVybiAoSVBhdGhbXSlmb3VuZC50b0FycmF5KG5ldyBJUGF0aFtmb3VuZC5zaXplKCldKTsKLS8vCQotLy8JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmJjNDA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Kc05hdHVyZVVuaW5zdGFsbGVyLjE9VW5pbnN0YWxsaW5nIEphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbHMuLi4KLUpzTmF0dXJlVW5pbnN0YWxsZXIuMj1SZW1vdmluZyBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xraW5nIE5hdHVyZS4uLgotSnNOYXR1cmVVbmluc3RhbGxlci4zPUVycm9yIGluc3RhbGxpbmcgcnVudGltZVwhIEphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbHMgY291bGQgbm90IGJlIHJlbW92ZWQsIG9yIGlzIG5vdCBwcmVzZW50IGluIHRhcmdldCBwcm9qZWN0Li4KLUpzTmF0dXJlSW5zdGFsbGVyLjE9SW5zdGFsbGluZyBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xzLi4uCi1Kc05hdHVyZUluc3RhbGxlci4yPUFkZGluZyBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xraXQgTmF0dXJlLi4uCi1Kc05hdHVyZUluc3RhbGxlci4zPUVycm9yIGluc3RhbGxpbmcgcnVudGltZVwhIEphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbHMgY291bGQgbm90IGJlIGFkZGVkLi4KLUpzV2ViTmF0dXJlLjU9RXJyb3IgY2hlY2tpbmcgc291cmNlcGF0aDoKLUpzV2ViTmF0dXJlLjY9RXJyb3IgY2hlY2tpbmcgc291cmNlcGF0aDoKLVdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuMD1XZWIgUHJvamVjdCBzdXBwb3J0IGZvciBKU0RUCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yRW1iZWRlZEpzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yRW1iZWRlZEpzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Zjg3MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckVtYmVkZWRKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JFbWJlZGVkSnMgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gQ29udGVudFR5cGVJZHMgPSBDb250ZW50VHlwZUlkRm9yRW1iZWRlZEpzLiBnZXRKc0NvbnN0YW50U3RyaW5nKCk7Ci0KLQlzdGF0aWMgU3RyaW5nW10gZ2V0SnNDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIsIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXByaXZhdGUgQ29udGVudFR5cGVJZEZvckVtYmVkZWRKcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDhmODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29kZWRSZXNvdXJjZVBsdWdpbjsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgQ09OVEVOVF9GQU1JTFlfQVRUUklCVVRFID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJjb250ZW50RmFtaWx5QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQ7Ci0JLyoqCi0JICogRXh0cmEgcHJvcGVydGllcyBhcyBwYXJ0IG9mIENvbnRlbnREZXNjcmlwdGlvbiwgaWYgdGhlIGNvbnRlbnQgaXMgSlNQLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBDT05URU5UX1RZUEVfQVRUUklCVVRFID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJjb250ZW50VHlwZUF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIExBTkdVQUdFX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAibGFuZ3VhZ2VBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JSlNQUGFydGl0aW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUpTUFBhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDlmOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JSlNQUGFydGl0aW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElKU1BQYXJ0aXRpb25UeXBlcyB7Ci0JU3RyaW5nIEpTUF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5KU1BfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfREVMSU1JVEVSID0gSUpTUFBhcnRpdGlvblR5cGVzLkpTUF9TQ1JJUFRfUFJFRklYICsgIkRFTElNSVRFUiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfSkFWQSA9IElKU1BQYXJ0aXRpb25UeXBlcy5KU1BfU0NSSVBUX1BSRUZJWCArICJKQVZBIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09OVEVOVF9KQVZBU0NSSVBUID0gSUpTUFBhcnRpdGlvblR5cGVzLkpTUF9TQ1JJUFRfUFJFRklYICsgIkpBVkFTQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5ERUZBVUxUX0pTUCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0RFRkFVTFRfRUwgPSBJSlNQUGFydGl0aW9uVHlwZXMuSlNQX1NDUklQVF9QUkVGSVggKyAiSlNQX0VMIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfREVGQVVMVF9FTDIgPSBJSlNQUGFydGl0aW9uVHlwZXMuSlNQX1NDUklQVF9QUkVGSVggKyAiSlNQX0VMMiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0RJUkVDVElWRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuSlNQX0RJUkVDVElWRSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX1NDUklQVF9QUkVGSVggPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLlNDUklQVC4iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC90YXNrcy9Kc0ZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdGFza3MvSnNGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlYWEwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC90YXNrcy9Kc0ZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzLlhNTEZpbGVUYXNrU2Nhbm5lcjsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzRmlsZVRhc2tTY2FubmVyIGV4dGVuZHMgWE1MRmlsZVRhc2tTY2FubmVyIHsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmlzQ29tbWVudFJlZ2lvbihyZWdpb24sIHRleHRSZWdpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnNCYXRjaFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Kc0JhdGNoVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMDZlNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Kc0JhdGNoVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUluY2x1ZGVQYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUluY2x1ZGVQYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Kc0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaFJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0vKioKLSAqIFBlcmZvcm1zIEpTUCB2YWxpZGF0aW9uIHRhc2tzIGZvciBiYXRjaCB2YWxpZGF0aW9uLiBUaGUgaW5kaXZpZHVhbCB2YWxpZGF0b3IKLSAqIGNsYXNzZXMgd2lsbCBzdGlsbCBiZSB1c2VkIGZvciBzb3VyY2UgdmFsaWRhdGlvbi4KLQotICoKLSAqIDxicj48YnI+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKc0JhdGNoVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYiwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCS8vIGZvciBkZWJ1Z2dpbmcKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN2YWxpZGF0b3IiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEX0pTUF9DT1JFID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVBhdGhbXSBleGNsdWRlTGliUGF0aHM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFtdIHJoaW5vVmFsaWRhdG9yID0geyJvcmcuZWNsaXBzZS5hdGYuamF2YXNjcmlwdC5pbnRlcm5hbC52YWxpZGF0aW9uLkpTU3ludGF4VmFsaWRhdG9yIn07IC8vJE5PTi1OTFMtMSQKLSAgICAgIHN0YXRpYyB7IAotICAgICAgICAgICAgICAvLyBUZW1wIGNvZGUgdG8gY2xlYXIgUmhpbm8gU3ludGF4IHZhbGlkYXRpb24gbWFya2Vycy4KLSAgICAgICAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvamVjdHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbal07Ci0gICAgICAgICAgICAgICAgICAgICAgLy90cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3QuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YVNjcmlwdENvcmUuTkFUVVJFX0lEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtiZW5jaFJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHByb2plY3QsIHJoaW5vVmFsaWRhdG9yLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgfSAKLSAgICAgIAotCS8qKgotCSAqIEdldHMgY3VycmVudCB2YWxpZGF0aW9uIHByb2plY3QgY29uZmlndXJhdGlvbiBiYXNlZCBvbiBjdXJyZW50IHByb2plY3QKLQkgKiAod2hpY2ggaXMgYmFzZWQgb24gY3VycmVudCBkb2N1bWVudCkKLQkgKiAKLQkgKiBAcmV0dXJuIFByb2plY3RDb25maWd1cmF0aW9uCi0JICovCi0Jc3RhdGljIHByaXZhdGUgUHJvamVjdENvbmZpZ3VyYXRpb24gZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24oSUZpbGUgZmlsZSkgewotCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcm9qZWN0Q29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlwcm9qZWN0Q29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdENvbmZpZ3VyYXRpb247Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB2YWxpZGF0b3IgaXMgZW5hYmxlZCBhY2NvcmRpbmcgaW4gVmFsaWRhdGlvbiBwcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSB2bWQKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNCYXRjaFZhbGlkYXRvclByZWZlcmVuY2VFbmFibGVkKElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQkJUHJvamVjdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IEpzQmF0Y2hWYWxpZGF0b3IuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24oZmlsZSk7Ci0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhIG1ldGFkYXRhID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKEpzQmF0Y2hWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwgJiYgbWV0YWRhdGEgIT0gbnVsbCkgewotCQkJCWlmICghY29uZmlndXJhdGlvbi5pc0J1aWxkRW5hYmxlZChtZXRhZGF0YSkgJiYgIWNvbmZpZ3VyYXRpb24uaXNNYW51YWxFbmFibGVkKG1ldGFkYXRhKSkgewotCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQljbGFzcyBKU1BGaWxlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JCXByaXZhdGUgTGlzdCBmRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByaXZhdGUgSVJlcG9ydGVyIGZSZXBvcnRlciA9IG51bGw7Ci0JCQotCQlwdWJsaWMgSlNQRmlsZVZpc2l0b3IoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCQlmUmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJfQotCQkKLQkJZmluYWwgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSkgZkZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZGaWxlcy5zaXplKCldKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCS8vIGNoZWNrIHZhbGlkYXRpb24KLQkJCWlmIChmUmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAoVXRpbC5pc0pzVHlwZShwcm94eS5nZXROYW1lKCkpICYmIHByb3h5LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQlpZiAoSnNCYXRjaFZhbGlkYXRvci5ERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSlNQVmFsaWRhdG9yIGFkZGluZyBmaWxlOiAiICsgZmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZkZpbGVzLmFkZChmaWxlKTsKLQkJCQkJLy8gZG9uJ3Qgc2VhcmNoIGRlZXBlciBmb3IgZmlsZXMKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCWNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOwotCQkKLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQkJfQotCQkKLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCAoT2JqZWN0KSB0YXJnZXRPYmplY3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQkJc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCQkJc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JCQlzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYWxpemVkVGV4dCgpIHsKLQkJCXJldHVybiBfbWVzc2FnZTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRUZXh0KCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoQ2xhc3NMb2FkZXIgY2wpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRUZXh0KCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRUZXh0KCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwsIENsYXNzTG9hZGVyIGNsKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkVGV4dCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCX0KLQl9Ci0JLy9TdHJpbmcgZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHNbXSA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBmQ29udGVudFR5cGVzID0gbnVsbDsKLQlwcml2YXRlIElDb250ZW50VHlwZSBmSlNQRkNvbnRlbnRUeXBlID0gbnVsbDsKLQlwcml2YXRlIEpzVmFsaWRhdG9yIGZKU1BKYXZhVmFsaWRhdG9yID0gbmV3IEpzVmFsaWRhdG9yKHRoaXMpOwotCQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWZKU1BKYXZhVmFsaWRhdG9yLmNsZWFudXAocmVwb3J0ZXIpOwotCX0KLQlwcml2YXRlIElQYXRoW10gZ2V0TGlicmFyeVBhdGhzKElGaWxlIGZpbGUpIHsKLQkJCi0JCWlmKGV4Y2x1ZGVMaWJQYXRocyE9bnVsbCkgcmV0dXJuIGV4Y2x1ZGVMaWJQYXRoczsKLQkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qZWN0PSBKYXZhU2NyaXB0Q29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQotCQlpZihqYXZhUHJvamVjdD09bnVsbCkgcmV0dXJuIG5ldyBJUGF0aFswXTsKLQkJCi0JCUlJbmNsdWRlUGF0aEVudHJ5W10gZW50cmllcyA9IG5ldyBJSW5jbHVkZVBhdGhFbnRyeVswXTsKLQkJdHJ5IHsKLQkJCWVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZEluY2x1ZGVwYXRoKHRydWUpOwotCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCS8vIE1heSBydW4gaW50byBhbiBleGNlcHRpb24gaWYgdGhlIHByb2plY3QgaXNuJ3QganNkdC4KLQkJfQotCQlBcnJheUxpc3QgaWdub3JlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW5leHRFbnRyeTogZm9yKGludCBpID0gMDtpPGVudHJpZXMubGVuZ3RoO2krKykgewotCQkJaWYoZW50cmllc1tpXS5nZXRFbnRyeUtpbmQoKSA9PSBJSW5jbHVkZVBhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJCUlJbmNsdWRlUGF0aEF0dHJpYnV0ZVtdIGF0dHJpYnMgPSBlbnRyaWVzW2ldLmdldEV4dHJhQXR0cmlidXRlcygpOwotCQkJCWZvcihpbnQgaz0wOyBhdHRyaWJzIT1udWxsICYmIGs8YXR0cmlicy5sZW5ndGg7aysrKSB7Ci0JCQkJCWlmKGF0dHJpYnNba10uZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInZhbGlkYXRlIikgJiYgYXR0cmlic1trXS5nZXRWYWx1ZSgpLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlpZ25vcmVQYXRocy5hZGQoZW50cmllc1tpXS5nZXRQYXRoKCkpOwotCQkJCQkJY29udGludWUgbmV4dEVudHJ5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlleGNsdWRlTGliUGF0aHMgPSAgKFBhdGhbXSlpZ25vcmVQYXRocy50b0FycmF5KG5ldyBQYXRoW2lnbm9yZVBhdGhzLnNpemUoKV0pOwotCQlyZXR1cm4gZXhjbHVkZUxpYlBhdGhzOwotCX0KLQkKLQkKLQl2b2lkIGRvVmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKHVyaXMubGVuZ3RoID4gMCkgewotCQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlGaWxlIGN1cnJlbnRGaWxlID0gbnVsbDsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJY3VycmVudEZpbGUgPSB3c1Jvb3QuZ2V0RmlsZShuZXcgUGF0aCh1cmlzW2ldKSk7Ci0JCQkJaWYgKGN1cnJlbnRGaWxlICE9IG51bGwgJiYgY3VycmVudEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJaWYgKHNob3VsZFZhbGlkYXRlKGN1cnJlbnRGaWxlKSApIHsKLQkJCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgIiIgKyAoaSArIDEpICsgIi8iICsgdXJpcy5sZW5ndGggKyAiIC0gIiArIGN1cnJlbnRGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0JCQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCBjdXJyZW50RmlsZSk7Ci0JCQkJCQl2YWxpZGF0ZUZpbGUoY3VycmVudEZpbGUsIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlpZiAoSnNCYXRjaFZhbGlkYXRvci5ERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIHVyaXNbaV0gKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHVyaXNbXSBsZW5ndGggMCAtPiB2YWxpZGF0ZSgpIGdldHMgY2FsbGVkIGZvciBlYWNoIHByb2plY3QKLQkJCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKElXb3JrYmVuY2hDb250ZXh0KSBoZWxwZXIpLmdldFByb2plY3QoKTsKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIE5MUy5iaW5kKEpzQ29yZU1lc3NhZ2VzLkpTUEJhdGNoVmFsaWRhdG9yXzAsIHByb2plY3QuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCQkJCUpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IocmVwb3J0ZXIpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIGNvbGxlY3QgYWxsIGpzcCBmaWxlcyBmb3IgdGhlIHByb2plY3QKLQkJCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKEpzQmF0Y2hWYWxpZGF0b3IuREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSUZpbGVbXSBmaWxlcyA9IHZpc2l0b3IuZ2V0RmlsZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJCWlmIChzaG91bGRWYWxpZGF0ZShmaWxlc1tpXSkgKSB7Ci0JCQkJCQltZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCAiIiArIChpICsgMSkgKyAiLyIgKyBmaWxlcy5sZW5ndGggKyAiIC0gIiArIGZpbGVzW2ldLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0JCQkJCQl2YWxpZGF0ZUZpbGUoZmlsZXNbaV0sIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlpZiAoSnNCYXRjaFZhbGlkYXRvci5ERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIGZpbGVzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0vLwkvKioKLS8vCSAqIENoZWNrcyBpZiBmaWxlIGlzIGEganNwIGZyYWdtZW50IG9yIG5vdC4gSWYgc28sIGNoZWNrIGlmIHRoZSBmcmFnbWVudAotLy8JICogc2hvdWxkIGJlIHZhbGlkYXRlZCBvciBub3QuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBmaWxlCi0vLwkgKiAgICAgICAgICAgIEFzc3VtZXMgc2hvdWxkVmFsaWRhdGUgd2FzIGFscmVhZHkgY2FsbGVkIG9uIGZpbGUgc28gaXQgc2hvdWxkCi0vLwkgKiAgICAgICAgICAgIG5vdCBiZSBudWxsIGFuZCBkb2VzIGV4aXN0Ci0vLwkgKiBAcmV0dXJuIGZhbHNlIGlmIGZpbGUgaXMgYSBmcmFnbWVudCBhbmQgaXQgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsIHRydWUKLS8vCSAqICAgICAgICAgb3RoZXJ3aXNlCi0vLwkgKi8KLS8vCXByaXZhdGUgYm9vbGVhbiBmcmFnbWVudENoZWNrKElGaWxlIGZpbGUpIHsKLS8vCQlyZXR1cm4gaXNGcmFnbWVudChmaWxlKTsKLS8vCX0KLQkKLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpIHsKLQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIElXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQkvKgotCQkJICogVXNlIGEgc2luZ2xlIGJ1aWxkIHJ1bGUgd2hlbiBydW5uaW5nIGJhdGNoIHZhbGlkYXRpb24uCi0JCQkgKi8KLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5idWlsZFJ1bGUoKTsKLQkJfQotCQkvKgotCQkgKiBGb3Igb3RoZXIga2luZHMgb2YgdmFsaWRhdGlvbiwgdXNlIG5vIHNwZWNpZmljIHJ1bGUKLQkJICovCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQotCi0KLQkKLQlwcml2YXRlIHZvaWQgcGVyZm9ybVZhbGlkYXRpb24oSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJZkpTUEphdmFWYWxpZGF0b3IucGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsLHRydWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJRmlsZSBmaWxlKSB7Ci0JCS8vaWYodHJ1ZSkgcmV0dXJuIHRydWU7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGU7Ci0JCUlQYXRoW10gbGliUGF0aHMgPSBnZXRMaWJyYXJ5UGF0aHMoZmlsZSk7Ci0JCUlQYXRoIGZpbGVQYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJZm9yKGludCBpID0gMDtpPGxpYlBhdGhzLmxlbmd0aDtpKyspIHsKLQkJCWlmKGxpYlBhdGhzW2ldLmlzUHJlZml4T2YoZmlsZVBhdGgpKXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCWRvIHsKLQkJCWlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfSB3aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlkb1ZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBWYWxpZGF0ZSBvbmUgZmlsZS4gSXQncyBhc3N1bWVkIHRoYXQgdGhlIGZpbGUgaGFzIEpTUCBjb250ZW50IHR5cGUuCi0JICogCi0JICogQHBhcmFtIGYKLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKi8KLQl2b2lkIHZhbGlkYXRlRmlsZShJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgSlNQIG1vZGVsIG9uIGJlaGFsZiBvZiBhbGwgSlNQIHZhbGlkYXRvcnMKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmKTsKLQkJCWlmKG1vZGVsPT1udWxsKSB7Ci0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmKTsKLQkJCX0KLQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSAmJiBtb2RlbCAhPSBudWxsKSB7Ci0JCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcywgZik7Ci0JCQkJcGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIGZpbmFsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlKb2IgY3VycmVudEpvYiA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5jdXJyZW50Sm9iKCk7Ci0JCUlTY2hlZHVsaW5nUnVsZSBydWxlID0gbnVsbDsKLQkJaWYgKGN1cnJlbnRKb2IgIT0gbnVsbCkgewotCQkJcnVsZSA9IGN1cnJlbnRKb2IuZ2V0UnVsZSgpOwotCQl9Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSB2YWxpZGF0aW9uUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCWRvVmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0JCQkJfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnNCYXRjaFZhbGlkYXRvci5QTFVHSU5fSURfSlNQX0NPUkUsIDAsIEpzQmF0Y2hWYWxpZGF0b3IuUExVR0lOX0lEX0pTUF9DT1JFLCBlKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJSmF2YVNjcmlwdENvcmUucnVuKHZhbGlkYXRpb25SdW5uYWJsZSwgcnVsZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoVmFsaWRhdGlvbkV4Y2VwdGlvbikgZS5nZXRDYXVzZSgpOwotCQkJfQotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24obmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuRVJST1JfQU5EX1dBUk5JTkcsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Kc1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Kc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmEyOWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotLyoqCi0gKgotCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKc1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3J7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN2YWxpZGF0b3IiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElWYWxpZGF0b3IgZk1lc3NhZ2VPcmlnaW5hdG9yOwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBbXSBqc2R0VmFsaWRhdG9yID0geyJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpzQmF0Y2hWYWxpZGF0b3IifTsgLy8kTk9OLU5MUy0xJAotCi0JCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOwotCQkKLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQkJfQotCQkKLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCAoT2JqZWN0KSB0YXJnZXRPYmplY3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQkJc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCQkJc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JCQlzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIF9tZXNzYWdlOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldExvY2FsaXplZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCV9tZXNzYWdlID0gbWVzc2FnZTsKLQkJfQotCX0KLQlwdWJsaWMgSnNWYWxpZGF0b3IoKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdGhpczsKLQl9Ci0JCi0JcHVibGljIEpzVmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdmFsaWRhdG9yOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIElNZXNzYWdlIGZyb20gYW4gSVByb2JsZW0KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmxlbQotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHRyYW5zbGF0aW9uCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2MKLQkgKiBAcmV0dXJuIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb2JsZW0sIG9yIG51bGwgaWYgaXQgY291bGQgbm90Ci0JICogICAgICAgICBjcmVhdGUgb25lCi0JICovCi0JcHJpdmF0ZSBJTWVzc2FnZSBjcmVhdGVNZXNzYWdlRnJvbVByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSwgSUZpbGUgZiwgSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvYykgewotCQlpbnQgc291cmNlU3RhcnQgPSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCk7Ci0JCWludCBzb3VyY2VFbmQgPSBwcm9ibGVtLmdldFNvdXJjZUVuZCgpOwotCQlpZiAoc291cmNlU3RhcnQgPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIGxpbmUgbnVtYmVyIGZvciBtYXJrZXIgc3RhcnRzIEAgMQotCQkvLyBsaW5lIG51bWJlciBmcm9tIGRvY3VtZW50IHN0YXJ0cyBAIDAKLQkJaW50IGxpbmVObyA9IHN0cnVjdHVyZWREb2MuZ2V0TGluZU9mT2Zmc2V0KHNvdXJjZVN0YXJ0KSArIDE7Ci0JCWludCBzZXYgPSBwcm9ibGVtLmlzRXJyb3IoKSA/IElNZXNzYWdlLkhJR0hfU0VWRVJJVFkgOiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCUlNZXNzYWdlIG0gPSBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIHByb2JsZW0uZ2V0TWVzc2FnZSgpLCBmKTsKLQkJbS5zZXRMaW5lTm8obGluZU5vKTsKLQkJbS5zZXRPZmZzZXQoc291cmNlU3RhcnQpOwotCQltLnNldExlbmd0aChzb3VyY2VFbmQgLSBzb3VyY2VTdGFydCArIDEpOwotCQlyZXR1cm4gbTsKLQl9Ci0JCi0Jdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaW5CYXRjaCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQkJc2V0dXBBZGFwdGVyRmFjdG9yeShkb21Nb2RlbCk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIHRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJLy90cmFuc2xhdGlvbkFkYXB0ZXIucmVzb3VyY2VDaGFuZ2VkKCk7Ci0JCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbihmYWxzZSk7Ci0JCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQl0cmFuc2xhdGlvbi5zZXRQcm9ibGVtQ29sbGVjdGluZ0FjdGl2ZSh0cnVlKTsKLQkJCQl0cmFuc2xhdGlvbi5yZWNvbmNpbGVDb21waWxhdGlvblVuaXQoKTsKLQkJCQlMaXN0IHByb2JsZW1zID0gdHJhbnNsYXRpb24uZ2V0UHJvYmxlbXMoKTsKLQkJCQkvLyBhZGQgbmV3IG1lc3NhZ2VzCi0JCQkJaWYoIWluQmF0Y2gpIHJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsIGYpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbXMuc2l6ZSgpICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkJSU1lc3NhZ2UgbSA9IGNyZWF0ZU1lc3NhZ2VGcm9tUHJvYmxlbSgoSVByb2JsZW0pIHByb2JsZW1zLmdldChpKSwgZiwgdHJhbnNsYXRpb24sIGRvbU1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJaWYgKG0gIT0gbnVsbCkgewotCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFdoZW4gbG9hZGluZyBtb2RlbCBmcm9tIGEgZmlsZSwgeW91IG5lZWQgdG8gZXhwbGljaXRseSBhZGQgYWRhcHRlcgotCSAqIGZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIHNtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwQWRhcHRlckZhY3RvcnkoSVN0cnVjdHVyZWRNb2RlbCBzbSkgewotCQlpZiAoc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcykgPT0gbnVsbCkgewotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlzbS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJRmlsZSBmaWxlKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGU7Ci0JCWRvIHsKLQkJCWlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfSB3aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvKiBBZGRlZCBieSBCQyAtLS0tICovCi0JCS8vIGlmKHRydWUpIHJldHVybjsKLQkJLyogZW5kIEFkZGVkIGJ5IEJDIC0tLS0gKi8KLQkJCi0JCVN0cmluZ1tdIHVyaXMgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlJV29ya3NwYWNlUm9vdCB3c1Jvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlpZiAodXJpcy5sZW5ndGggPiAwKSB7Ci0JCQlJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQljdXJyZW50RmlsZSA9IHdzUm9vdC5nZXRGaWxlKG5ldyBQYXRoKHVyaXNbaV0pKTsKLQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCBjdXJyZW50RmlsZSk7Ci0JCQkJaWYgKGN1cnJlbnRGaWxlICE9IG51bGwgJiYgY3VycmVudEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJaWYgKHNob3VsZFZhbGlkYXRlKGN1cnJlbnRGaWxlKSApeyAvLyYmIGZyYWdtZW50Q2hlY2soY3VycmVudEZpbGUpKSB7Ci0JCQkJCQlpbnQgcGVyY2VudCA9IChpICogMTAwKSAvIHVyaXMubGVuZ3RoICsgMTsKLQkJCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgcGVyY2VudCArICIlICIgKyB1cmlzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0JCQkJCQl2YWxpZGF0ZUZpbGUoY3VycmVudEZpbGUsIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmFsaWRhdGluZzogWyIgKyB1cmlzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB1cmlzW10gbGVuZ3RoIDAgLT4gdmFsaWRhdGUoKSBnZXRzIGNhbGxlZCBmb3IgZWFjaCBwcm9qZWN0Ci0JCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgSVdvcmtiZW5jaENvbnRleHQpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKChJV29ya2JlbmNoQ29udGV4dCkgaGVscGVyKS5nZXRQcm9qZWN0KCk7Ci0JCQkJSlNQRmlsZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBKU1BGaWxlVmlzaXRvcihyZXBvcnRlcik7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gY29sbGVjdCBhbGwganNwIGZpbGVzIGZvciB0aGUgcHJvamVjdAotCQkJCQlwcm9qZWN0LmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSUZpbGVbXSBmaWxlcyA9IHZpc2l0b3IuZ2V0RmlsZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJCWlmIChzaG91bGRWYWxpZGF0ZShmaWxlc1tpXSkpIHsKLQkJCQkJCWludCBwZXJjZW50ID0gKGkgKiAxMDApIC8gZmlsZXMubGVuZ3RoICsgMTsKLQkJCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgcGVyY2VudCArICIlICIgKyBmaWxlc1tpXS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJCXZhbGlkYXRlRmlsZShmaWxlc1tpXSwgcmVwb3J0ZXIpOwotCQkJCQl9Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIGZpbGVzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQlwcml2YXRlIElDb250ZW50VHlwZVtdIGZDb250ZW50VHlwZXMgPSBudWxsOwotCQlwcml2YXRlIExpc3QgZkZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcml2YXRlIElSZXBvcnRlciBmUmVwb3J0ZXIgPSBudWxsOwotCQkKLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKElSZXBvcnRlciByZXBvcnRlcikgewotCQkJZlJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCX0KLQkJCi0JCXB1YmxpYyBmaW5hbCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSBmRmlsZXMudG9BcnJheShuZXcgSUZpbGVbZkZpbGVzLnNpemUoKV0pOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCS8vIGNoZWNrIHZhbGlkYXRpb24KLQkJCWlmIChmUmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAoVXRpbC5pc0pzVHlwZShwcm94eS5nZXROYW1lKCkpKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSlNQVmFsaWRhdG9yIGFkZGluZyBmaWxlOiAiICsgZmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlmRmlsZXMuYWRkKGZpbGUpOwotCQkJCQkJLy8gZG9uJ3Qgc2VhcmNoIGRlZXBlciBmb3IgZmlsZXMKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoSnNWYWxpZGF0b3IuREVCVUcpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2YWxpZGF0aW5nOiAiICsgZik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGdldCBqc3AgbW9kZWwsIGdldCB0cmFubHNhdGlvbgotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGYpOwotCQkJaWYobW9kZWw9PW51bGwpIHsKLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGYpOwotCQkJfQotCQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpICYmIG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBnZXQganNwIG1vZGVsLCBnZXQgdHJhbnNsYXRpb24KLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJLy9Xb3JrYmVuY2hSZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhmLmdldFByb2plY3QoKSwganNkdFZhbGlkYXRvciwgZi50b1N0cmluZygpKTsKLQkJCQkJLy9yZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhmTWVzc2FnZU9yaWdpbmF0b3IsIGYpOwotCQkJCQlwZXJmb3JtVmFsaWRhdGlvbihmLCByZXBvcnRlciwgbW9kZWwsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTg0YTcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckVtYmVkZWRKczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgVXRpbCB7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSnNUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlpZihmaWxlTmFtZT09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID1nZXRKYXZhc2NyaXB0Q29udGVudFR5cGVzKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHR5cGVzIT1udWxsICYmIGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKSB7Ci0JCQl2YWxpZCA9IHR5cGVzW2ldIT1udWxsICYmIHR5cGVzW2ldLmlzQXNzb2NpYXRlZFdpdGgoZmlsZU5hbWUpOwotCQkJKytpOwotCQl9Ci0JCXJldHVybiB2YWxpZDsKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUNvbnRlbnRUeXBlW10gZ2V0SmF2YXNjcmlwdENvbnRlbnRUeXBlcygpIHsKLQotCQlTdHJpbmdbXSBjb250ZW50VHlwZUlkcyA9IENvbnRlbnRUeXBlSWRGb3JFbWJlZGVkSnMuQ29udGVudFR5cGVJZHM7Ci0JCUFycmF5TGlzdCBmQ29udGVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJCi0JCWZvcihpbnQgaSA9IDA7aTxjb250ZW50VHlwZUlkcy5sZW5ndGg7aSsrKSB7Ci0JCQlJQ29udGVudFR5cGUgY3QgPSAgUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZHNbaV0pOwotCQkJaWYoY3QhPW51bGwpIGZDb250ZW50VHlwZXMuYWRkKGN0KTsKLQkJfQotCQkKLQkJcmV0dXJuIChJQ29udGVudFR5cGVbXSlmQ29udGVudFR5cGVzLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVtmQ29udGVudFR5cGVzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvQ29tcGlsYXRpb25Vbml0SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQwMDExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvQ29tcGlsYXRpb25Vbml0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci0KLS8qKgotCi0KLQotCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIDxicj48YnI+IHRoaXMgY29kZSB3YXMgdGFrZW4gZnJvbSB0aGUgSlNQIHBsdWdpbi4gIFRoaXMgY2xhc3MgaXMgdG8gZW5zdXJlIG9ubHkgb25lIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZXhpdHMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21waWxhdGlvblVuaXRIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIENvbXBpbGF0aW9uVW5pdEhlbHBlciBpbnN0YW5jZTsKLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBmaW5hbCBDb21waWxhdGlvblVuaXRIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChDb21waWxhdGlvblVuaXRIZWxwZXIuaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJQ29tcGlsYXRpb25Vbml0SGVscGVyLmluc3RhbmNlID0gbmV3IENvbXBpbGF0aW9uVW5pdEhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuaW5zdGFuY2U7Ci0JfQotCXByaXZhdGUgSnNQcm9ibGVtUmVxdWVzdG9yIGZQcm9ibGVtUmVxdWVzdG9yID0gbnVsbDsKLQlwcml2YXRlIFdvcmtpbmdDb3B5T3duZXIgZldvcmtpbmdDb3B5T3duZXIgPSBudWxsOwotCQotCXByaXZhdGUgQ29tcGlsYXRpb25Vbml0SGVscGVyKCkgewotCS8vIGZvcmNlIHVzZSBvZiBpbnN0YW5jZQotCX0KLQkKLQlwdWJsaWMgSnNQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoKSB7Ci0JCWlmIChmUHJvYmxlbVJlcXVlc3RvciA9PSBudWxsKSB7Ci0JCQlmUHJvYmxlbVJlcXVlc3RvciA9IG5ldyBKc1Byb2JsZW1SZXF1ZXN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZlByb2JsZW1SZXF1ZXN0b3I7Ci0JfQotCQotCXB1YmxpYyBXb3JraW5nQ29weU93bmVyIGdldFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0JCWlmIChmV29ya2luZ0NvcHlPd25lciA9PSBudWxsKSB7Ci0JCQlmV29ya2luZ0NvcHlPd25lciA9IG5ldyBXb3JraW5nQ29weU93bmVyKCkgewotCQkJCQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiSlNQIFdvcmtpbmcgY29weSBvd25lciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBmV29ya2luZ0NvcHlPd25lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0RvY3VtZW50Q2hhbmdlTGlzdGVuZXJUb1RleHRFZGl0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0RvY3VtZW50Q2hhbmdlTGlzdGVuZXJUb1RleHRFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjBiYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Eb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKiA8YnI+PGJyPgotKiAKLSogdGhpcyBjbGFzcyBhdHRhY2hlcyB0byBhICJjbG9uZWQiIGRvY3VtZW50LCBsaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoYXQgZG9jdW1lbnQgdGhlbiB0cmFuc2xhdGVzCi0qIHRoZSBjaGFuZ2VzIHRvIHRleHQgZWRpdHMuICB0aGVzZSBjaGFuZ2VzIGNhbiB0aGVuIGJlIGFwcGxpZWQgYmFjayB0byB0aGUgb3JpZ2luYWwgZG9jdW1lbnQuCi0qIAotKgotKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdCBpbXBsZW1lbnRzIElEb2N1bWVudExpc3RlbmVyIHsKLQlwcml2YXRlIE11bHRpVGV4dEVkaXQgdGV4dEVkaXQ7Ci0JCi0JcHVibGljIERvY3VtZW50Q2hhbmdlTGlzdGVuZXJUb1RleHRFZGl0KCkgewotCQl0ZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJVbmltcGxlbWVudGVkCi0JLy8gbWV0aG9kOkRvY3VtZW50Q2hhbmdlTGlzdGVuZXJUb1RleHRFZGl0LmRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpbnQgbGVuZ3RoID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBvZmZzZXQgPSBldmVudC5nZXRPZmZzZXQoKTsKLQkJU3RyaW5nIHRleHQgPSBldmVudC5nZXRUZXh0KCk7Ci0JCWlmIChsZW5ndGggPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQkvKiBpbnNlcnRpbmcgdGV4dCBvcGVyYXRpb24gKi8KLQkJCUluc2VydEVkaXQgZWRpdCA9IG5ldyBJbnNlcnRFZGl0KG9mZnNldCwgdGV4dCk7Ci0JCQl0ZXh0RWRpdC5hZGRDaGlsZChlZGl0KTsKLQkJCQotCQl9IGVsc2UgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLyogZGVsZXRlIG9wZXJhdGlvbiAqLwotCQkJRGVsZXRlRWRpdCBlZGl0ID0gbmV3IERlbGV0ZUVkaXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZWRpdCk7Ci0JCQkKLQkJfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7Ci0JCQkvKiByZXBsYWNlIHRleHQgb3BlcmF0aW9uICovCi0JCQlSZXBsYWNlRWRpdCBlZGl0ID0gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgbGVuZ3RoLCB0ZXh0KTsKLQkJCXRleHRFZGl0LmFkZENoaWxkKGVkaXQpOwotCQkKLQkJfQotCX0KLQkKLQlwdWJsaWMgTXVsdGlUZXh0RWRpdCBnZXRUZXh0RWRpdHMoKSB7Ci0JCXJldHVybiB0ZXh0RWRpdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0hUTUw0ME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9IVE1MNDBOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0ZDIyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0hUTUw0ME5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9JSnNUcmFuc2xhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9JSnNUcmFuc2xhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTZkZDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSUpzVHJhbnNsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuPGJyPgotKiAKLSovCi1wdWJsaWMgaW50ZXJmYWNlIElKc1RyYW5zbGF0aW9uIHsKLQotCS8qKgotCSAqIEByZXR1cm4gSUphdmFTY3JpcHRQcm9qZWN0IHRoYXQgdGhpcyB0cmFuc2xhdGlvbiBiZWxvbmdzIHRvCi0JICovCi0JcHVibGljIElKYXZhU2NyaXB0UHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCi0JLyoqCi0JICogQHJldHVybiBPcmlnaW5hbCBIVE1MIGRvY3VtZW50IGZyb20gdGhlIHRyYW5zbGF0aW9uLgotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0SHRtbERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludGVnZXIgcG9zaXRpb24gb2YgYSBtaXNzaW5nIDwvc2NyaXB0PiB0YWcgKHRoZSBkb2N1bWVudCBpc24ndCB3ZWxsIGZvcm1lZCBhbmQgcmVzdWx0ZWQgaW4gdHJhbnNsYXRpb24gZXJyb3IuKS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pc3NpbmdUYWdTdGFydCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGphdmFQb3NpdGlvblN0YXJ0Ci0JICogQHBhcmFtIGphdmFQb3NpdGlvbkVuZAotCSAqIEByZXR1cm4gYWxsIGphdmFzY3JpcHQgZWxlbWVudHMgd2l0aGluIHRoZSBnaXZlbiByYW5nZQotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRBbGxFbGVtZW50c0luSnNSYW5nZShpbnQgamF2YVBvc2l0aW9uU3RhcnQsIGludCBqYXZhUG9zaXRpb25FbmQpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgamF2YXNjcmlwdCB1bml0IGZyb20gdGhlIGpzZHQuY29yZQotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdFVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gamF2YVBvc2l0aW9uU3RhcnQKLQkgKiBAcGFyYW0gamF2YVBvc2l0aW9uRW5kCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRFbGVtZW50c0Zyb21Kc1JhbmdlKGludCBqYXZhUG9zaXRpb25TdGFydCwgaW50IGphdmFQb3NpdGlvbkVuZCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHN0cmluZyBvZiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIdG1sVGV4dCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGpzT2Zmc2V0Ci0JICogQHJldHVybiBhIHNpbmdsZSBqYXZhc2NyaXB0IGVsZW1lbnQgYXQgdGhlIGdpdmVuIG9mZnNldC4KLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50IGdldEpzRWxlbWVudEF0T2Zmc2V0KGludCBqc09mZnNldCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9ubHkgdGhlIHRyYW5zbGF0ZWQgamF2YXNjcmlwdCB0ZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc1RleHQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBzY3JpcHQgcmVnaW9ucyB3aXRoaW4gdGhlIHRyYW5zbGF0aW9uLgotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldFNjcmlwdFBvc2l0aW9ucygpOwotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRJbkZpcnN0U2NyaXB0UmVnaW9uKFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIGluc2VydCBqYXZhc2NyaXB0IGF0IHRoZSBnaXZlbiBvZmZzZXQuICBtZXRob2Qgc2hvdWxkIGVuc3VyZSB0aGUgZG9jdW1lbnRzIHdlbGwtZm9ybWVkbmVzcyBhbmQgcHJvcGVyIHNjcmlwdCByZWdpb24uCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0U2NyaXB0KGludCBvZmZzZXQsIFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGphdmFzY3JpcHQgZXJyb3JzCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvYmxlbXMoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIGlmIHRoZSBvZmZzZXQgaXMgd2l0aGluIGEgc2NyaXB0IGltcG9ydCBub2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlmT2Zmc2V0SW5JbXBvcnROb2RlKGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogY2hlY2tzIHRoZSBDVSBmb3IgZXJyb3JzL2NvbnNpc3RhbmN5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpOwotCi0JLyoqCi0JICogcmVsZWFzZSB0aGUgdHJhbnNsYXRpb24uICBhbHdheXMgYSBnb29kIGlkZWEgdG8gZG8gd2hlbiB5b3UncmUgZG9uZS4gIHlvdSBtYXkgbm90aWNlIGRvY3VtZW50IGFuZCBtb2RlbCBsb2NrcyBpZiBub3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpOwotCQotCS8qKgotCSAqIGZpeGVzIGEgbWFuZ2xlZCBodG1sLS0+IHB1cmUganMgbmFtZS4KLQkgKiBAcGFyYW0gZGlzcGxheVN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZpeHVwTWFuZ2xlZE5hbWUoU3RyaW5nIGRpc3BsYXlTdHJpbmcpOyAKLQkKLQkvKioKLQkgKiBzdGFydC9zdG9wIGNvbGxlY3RpbmcgcHJvYmxlbXMgd2l0aGluIHRoZSBqYXZhc2NyaXB0IHVuaXQuCi0JICogQHBhcmFtIGNvbGxlY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtQ29sbGVjdGluZ0FjdGl2ZShib29sZWFuIGNvbGxlY3QpOwotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFQYXRoKCk7Ci0JCi0JLyoqCi0JICogCi0JICogCi0JICogQHBhcmFtIGh0bWxEb2N1bWVudAotCSAqIEBwYXJhbSBqYXZhUHJvagotCSAqIEBwYXJhbSBsaXN0ZW5Gb3JDaGFuZ2VzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJSnNUcmFuc2xhdGlvbiBnZXRJbnN0YW5jZShJU3RydWN0dXJlZERvY3VtZW50IGh0bWxEb2N1bWVudCwgSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qLCBib29sZWFuIGxpc3RlbkZvckNoYW5nZXMpIDsKLQotCS8qKgotCSAqIG5vdGlmeSB0aGUgdHJhbnNsYXRpb24gdG8gdXBkYXRlIGFueSBleHRlcm5hbCBkZXBlbmRhbmNpZXMgdGhhdCBhcmUgY3JlYXRlZCBkdXJpbmcgdHJhbnNsYXRpb24KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGFzc3BhdGhDaGFuZ2UoKSA7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9JSnNUcmFuc2xhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0lKc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyNmNhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0lKc1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpzVHJhbnNsYXRvciBleHRlbmRzIElEb2N1bWVudExpc3RlbmVyewotCi0JLyoqCi0JICogQHJldHVybiBzdHJpbmcgb2YgamF2YXNjcmlwdCBmcm9tIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNUZXh0KCk7Ci0KLQkvKioKLQkgKiBzZXRzIHRoZSBqYXZhc2NyaXB0IHVuaXQgYnVmZmVyCi0JICogQHBhcmFtIGJ1ZmZlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGJ1ZmZlcik7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBodG1sIGxvY2F0aW9ucyB3aXRoaW4gdGhlIGRvY3VlbW50LgotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldEh0bWxMb2NhdGlvbnMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJlZ2lvbiBvZiBhIG1pc3NpbmcgPC9zY3JpcHQ+IHRhZwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWlzc2luZ0VuZFRhZ1JlZ2lvblN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHBvc2l0aW9uIGFycmF5IG9mIDxzY3JpcHQgc3JjPSIuLiI+IHdpdGhpbiB0aGUgZG9jLgotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldEltcG9ydEh0bWxSYW5nZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gcmF3L3VucmVzb2x2ZWQgPHNjcmlwdCBpbXBvcnRzPgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSYXdJbXBvcnRzKCk7Ci0KLQkvKioKLQkgKiAgYmVnaW4gdHJhbnNsYXRpbmcgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZSgpOwotCi0JLyoqCi0JICogdHJhbnNsYXRlcyBhbiBpbmxpbmUgKGV2ZW50PSIuLiIpIGpzIGNvbnRhaW5lciByZWdpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGRvY3VtZW50IHRleHQuICBtdXN0IGJlIGNhbGxlZCBpbiBvcmRlcgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGVJbmxpbmVKU05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIpOwotCi0JLyoqCi0JICogdHJhbnNsYXRlcyBhIHNjcmlwdCBibG9jay4gIG11c3QgYmUgY2FsbGVkIGluIHRoZSBvcmRlciBpdCBhcHBlYXJzIHdpdGhpbiB0aGUgZG9jdW1lbnQuCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZUpTTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiB0cmFuc2xhdGVzIGEgPHNjcmlwdCBzcmM9Ii4uIj4gZWxlbWVudCwgcGFyc2luZyBvdXQgYW4gaW1wb3J0LgotCSAqIEBwYXJhbSByZWdpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGVTY3JpcHRJbXBvcnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKTsKLQotCS8qKgotCSAqIHJlbGVhc2UgYW55IHJlc291cmNlcyB0aGUgdHJhbnNsYXRpb24gaXMgaG9sZGluZyBvbnRvLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNEYXRhVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNEYXRhVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkMmFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzRGF0YVR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBKc0RhdGFUeXBlcyBleHRlbmRzIEhUTUw0ME5hbWVzcGFjZSB7Ci0JLyoKLQkgKiByZW1vdmUgd2hlbiB3aGVuIHdlIHJlZmFjdG9yIChuZWVkIHRvIGFkZCB0aGlzIGNvbnRlbnQgdHlwZSB0byBtYW55Ci0JICogcHJvamVjdCB0eXBlcyBpbiB3c3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9GSUxFX0VYVEVOU0lPTiA9ICIuanMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBDT05TVEFOVFMgPSB7ICJmYWxzZSIsICJudWxsIiwgInRydWUiIH07IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVZFTlRTID0geyBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQ0xJQ0ssIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05EQkxDTElDSywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFRE9XTiwKLQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRVVQLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OTU9VU0VPVkVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OTU9VU0VNT1ZFLAotCQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFT1VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OS0VZUFJFU1MsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05LRVlET1dOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OS0VZVVAsCi0JCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OSEVMUCB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSFRNTEFUUkVWRU5UUyA9IHsgIm9ubG9hZCAiLCAib251bmxvYWQiLCAib25jbGljayIsICJvbm1vdXNlZG93biIsICJvbm1vdXNldXAiLCAib25tb3VzZW92ZXIiLCAib25tb3VzZW1vdmUiLCAib25tb3VzZW91dCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIm9uZm9jdXMiLCAib25ibHVyIiwgIm9ua2V5cHJlc3MiLCAib25rZXlkb3duIiwgIm9ua2V5dXAiLCAib25zdWJtaXQiLCAib25yZXNldCIsICJvbnNlbGVjdCIsICJvbmNoYW5nZSIsIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKU1ZBTElEREFUQVRZUEVTID0geyAiSkFWQVNDUklQVCIsICJURVhUL0pBVkFTQ1JJUFQiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gS0VZV09SRFMgPSB7ICJhYnN0cmFjdCIsICJicmVhayIsICJjYXNlIiwgImNhdGNoIiwgImNsYXNzIiwgImNvbnN0IiwgImNvbnRpbnVlIiwgImRlYnVnZ2VyIiwgImRlZmF1bHQiLCAiZGVsZXRlIiwgImRvIiwgImVsc2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJCAvLyROT04tTkxTLTExJCAvLyROT04tTkxTLTEyJAotCQkJImVudW0iLCAiZXhwb3J0IiwgImV4dGVuZHMiLCAiZmluYWwiLCAiZmluYWxseSIsICJmb3IiLCAiZnVuY3Rpb24iLCAiZ290byIsICJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICJpbiIsICJpbnN0YW5jZW9mIiwgImludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkIC8vJE5PTi1OTFMtMTEkIC8vJE5PTi1OTFMtMTIkIC8vJE5PTi1OTFMtMTMkIC8vJE5PTi1OTFMtMTQkCi0JCQkibmF0aXZlIiwgIm5ldyIsICJwYWNrYWdlIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsICJyZXR1cm4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckCi0JCQkic3RhdGljIiwgInN1cGVyIiwgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLCAidGhpcyIsICJ0aHJvdyIsICJ0aHJvd3MiLCAidHJhbnNpZW50IiwgInRyeSIsICJ0eXBlb2YiLCAidm9sYXRpbGUiLCAid2hpbGUiLCAid2l0aCIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy0xMCQgLy8kTk9OLU5MUy0xMSQgLy8kTk9OLU5MUy0xMiQgLy8kTk9OLU5MUy0xMyQKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwotCS8vIE5FV19QQVJUSVRJT05fVFlQRT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuU3RydWN0dXJlZEpzIjsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUEFSVElUSU9OX1RZUEU9SUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUEFSVElUSU9OX1RZUEUgPSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEFLRU9WRVJfUEFSVElUSU9OX1RZUEVTID0geyAibm9uZSIgfTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gVFlQRVMgPSB7ICJib29sZWFuIiwgImJ5dGUiLCAiY2hhciIsICJkb3VibGUiLCAiaW50IiwgImxvbmciLCAic2hvcnQiLCAiZmxvYXQiLCAidmFyIiwgInZvaWQiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzTmFtZU1hbmdsZXJVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzTmFtZU1hbmdsZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwY2VlOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc05hbWVNYW5nbGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc05hbWVNYW5nbGVyVXRpbCB7Ci0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIEhleCByZXByZXNlbnRhdGlvbiBvZiBhbiBBU0NJSQotCSAqIGNoYXJhY3RlciAoZWcuIDJGIC0+IC8pCi0JICogCi0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgcG9zc2libGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHBvc3NpYmxlLmxlbmd0aCgpID09IDIpIHsKLQkJCWNoYXIgYzEgPSBwb3NzaWJsZS5jaGFyQXQoMCk7Ci0JCQljaGFyIGMyID0gcG9zc2libGUuY2hhckF0KDEpOwotCQkJLy8gMXN0IGNoYXJhY3RlciBtdXN0IGJlIGEgZGlnaXQKLQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjMSkpIHsKLQkJCQkvLyAybmQgY2hhcmFjdGVyIG11c3QgYmUgZGlnaXQgb3IgdXBwZXIgY2FzZSBsZXR0ZXIgQS1GCi0JCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGMyKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMyKSAmJiAoYzIgPT0gJ0EnIHx8IGMyID09ICdCJyB8fCBjMiA9PSAnQycgfHwgYzIgPT0gJ0QnIHx8IGMyID09ICdFJyB8fCBjMiA9PSAnRicpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIE1hbmdsZSBzdHJpbmcgdG8gV0FTLWxpa2Ugc3BlY2lmaWNhdGlvbnMKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBtYW5nbGUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIG1vZGlmaWVkTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gZXh0ZW5zaW9uICguanNwLCAuanNwZiwgLmpzcHgsIGV0Yy4uLikgc2hvdWxkIGFscmVhZHkgYmUgZW5jb2RlZCBpbgotCQkvLyBuYW1lCi0JCWludCBsZW5ndGggPSBuYW1lLmxlbmd0aCgpOwotCQkvLyBpbiBjYXNlIG5hbWUgaXMgZm9yYmlkZGVuIChhIG51bWJlciwgY2xhc3MsIGZvciwgZXRjLi4uKQotCQltb2RpZmllZE5hbWUuYXBwZW5kKCdfJyk7Ci0JCS8vIGVuc3VyZSByZXN0IG9mIGNoYXJhY3RlcnMgYXJlIHZhbGlkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY3VycmVudENoYXIgPSBuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3VycmVudENoYXIpID09IHRydWUpIHsKLQkJCQltb2RpZmllZE5hbWUuYXBwZW5kKGN1cnJlbnRDaGFyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kaWZpZWROYW1lLmFwcGVuZChKc05hbWVNYW5nbGVyVXRpbC5tYW5nbGVDaGFyKGN1cnJlbnRDaGFyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkTmFtZS50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiB0YWtlIGEgY2hhcmFjdGVyIGFuZCByZXR1cm4gaXRzIGhleCBlcXVpdmFsZW50Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIG1hbmdsZUNoYXIoY2hhciBjaCkgewotCQlpZiAoY2ggPT0gRmlsZS5zZXBhcmF0b3JDaGFyKSB7Ci0JCQljaCA9ICcvJzsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaCkgPT0gdHJ1ZSkgewotCQkJcmV0dXJuICIiICsgY2g7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gIl8iICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkudG9VcHBlckNhc2UoKSArICJfIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIFdBUyBtYW5nbGVzIFRvbSZKZXJyeSBhczogX1RvbV8yNl9KZXJyeTsgdGhpcyB0YWtlcyBpbiB0aGUgbWFuZ2xlZCBuYW1lCi0JICogYW5kIHJldHVybnMgdGhlIG9yaWdpbmFsIG5hbWUuCi0JICogCi0JICogVW5tYW5nbGVzIHRoZSBxdWFsaWZpZWQgdHlwZSBuYW1lLiBJZiBhbiB1bmRlcnNjb3JlIGlzIGZvdW5kIGl0IGlzCi0JICogYXNzdW1lZCB0byBiZSBhIG1hbmdsZWQgcmVwcmVzZW50YXRpb24gb2YgYSBub24tYWxwaGEsIG5vbi1kaWdpdAotCSAqIGNoYXJhY3RlciBvZiB0aGUgZm9ybSBfTk5fLCB3aGVyZSBOTiBhcmUgaGV4IGRpZ2l0cyByZXByZXNlbnRpbmcgdGhlCi0JICogZW5jb2RlZCBjaGFyYWN0ZXIuIFRoaXMgcm91dGluZSBjb252ZXJ0cyBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbAotCSAqIGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyB1bm1hbmdsZShTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJaWYgKHF1YWxpZmllZFR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnXycpIHsKLQkJCXJldHVybiBxdWFsaWZpZWRUeXBlTmFtZTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgcG9zc2libGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyByZW1vdmUgdGhlIC5qYXZhIGV4dGVuc2lvbiBpZiB0aGVyZSBpcyBvbmUKLQkJaWYgKHF1YWxpZmllZFR5cGVOYW1lLmVuZHNXaXRoKCIuanMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlxdWFsaWZpZWRUeXBlTmFtZSA9IHF1YWxpZmllZFR5cGVOYW1lLnN1YnN0cmluZygwLCBxdWFsaWZpZWRUeXBlTmFtZS5sZW5ndGgoKSAtIDMpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCk7IGkrKykgeyAvLyBzdGFydCBhdAotCQkJLy8gaW5kZXggMSBiL2MKLQkJCS8vIDFzdCBjaGFyIGlzCi0JCQkvLyBhbHdheXMgJ18nCi0JCQljaGFyIGMgPSBxdWFsaWZpZWRUeXBlTmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQlpbnQgZW5kSW5kZXggPSBxdWFsaWZpZWRUeXBlTmFtZS5pbmRleE9mKCdfJywgaSArIDEpOwotCQkJCWlmIChlbmRJbmRleCA9PSAtMSkgewotCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNoYXIgdW5tYW5nbGVkOwotCQkJCQl0cnkgewotCQkJCQkJcG9zc2libGUgPSBxdWFsaWZpZWRUeXBlTmFtZS5zdWJzdHJpbmcoaSArIDEsIGVuZEluZGV4KTsKLQkJCQkJCWlmIChKc05hbWVNYW5nbGVyVXRpbC5pc1ZhbGlkKHBvc3NpYmxlKSkgewotCQkJCQkJCXVubWFuZ2xlZCA9IChjaGFyKSBJbnRlZ2VyLmRlY29kZSgiMHgiICsgcG9zc2libGUpLmludFZhbHVlKCk7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCWkgPSBlbmRJbmRleDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdW5tYW5nbGVkID0gYzsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCXVubWFuZ2xlZCA9IGM7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh1bm1hbmdsZWQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1Byb2JsZW1SZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNQcm9ibGVtUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTA5ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1Byb2JsZW1SZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUHJvYmxlbVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotCi1jbGFzcyBKc1Byb2JsZW1SZXF1ZXN0b3IgaW1wbGVtZW50cyBJUHJvYmxlbVJlcXVlc3RvciB7Ci0JcHJpdmF0ZSBMaXN0IGZDb2xsZWN0ZWRQcm9ibGVtczsKLQlwcml2YXRlIGJvb2xlYW4gZklzQWN0aXZlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc1J1bm5pbmcgPSBmYWxzZTsKLQkKLQlwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsKLQkJaWYgKGlzQWN0aXZlKCkpIHsKLQkJCWZDb2xsZWN0ZWRQcm9ibGVtcy5hZGQocHJvYmxlbSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYmVnaW5SZXBvcnRpbmcoKSB7Ci0JCWZJc1J1bm5pbmcgPSB0cnVlOwotCQlmQ29sbGVjdGVkUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGVuZFJlcG9ydGluZygpIHsKLQkJZklzUnVubmluZyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNvbGxlY3RlZCBwcm9ibGVtcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbGxlY3RlZFByb2JsZW1zKCkgewotCQlyZXR1cm4gZkNvbGxlY3RlZFByb2JsZW1zOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIGZJc0FjdGl2ZSAmJiBmQ29sbGVjdGVkUHJvYmxlbXMgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgewotCQlyZXR1cm4gZklzUnVubmluZzsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoaXMgcHJvYmxlbSByZXF1ZXN0b3IuCi0JICogCi0JICogQHBhcmFtIGlzQWN0aXZlCi0JICogICAgICAgICAgICB0aGUgc3RhdGUgb2YgdGhpcyBwcm9ibGVtIHJlcXVlc3RvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzQWN0aXZlKGJvb2xlYW4gaXNBY3RpdmUpIHsKLQkJaWYgKGZJc0FjdGl2ZSAhPSBpc0FjdGl2ZSkgewotCQkJZklzQWN0aXZlID0gaXNBY3RpdmU7Ci0JCQlpZiAoZklzQWN0aXZlKSB7Ci0JCQkJc3RhcnRDb2xsZWN0aW5nUHJvYmxlbXMoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RvcENvbGxlY3RpbmdQcm9ibGVtcygpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRlbGxzIHRoaXMgYW5ub3RhdGlvbiBtb2RlbCB0byBjb2xsZWN0IHRlbXBvcmFyeSBwcm9ibGVtcyBmcm9tIG5vdyBvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RhcnRDb2xsZWN0aW5nUHJvYmxlbXMoKSB7Ci0JCWZDb2xsZWN0ZWRQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVsbHMgdGhpcyBhbm5vdGF0aW9uIG1vZGVsIHRvIG5vIGxvbmdlciBjb2xsZWN0IHRlbXBvcmFyeSBwcm9ibGVtcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcENvbGxlY3RpbmdQcm9ibGVtcygpIHsKLQkvLyBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4MmI0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsgLy8gaW1wb3J0Ci0JCQkJCQkJCQkJCQkJLy8gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsgLy8gaW1wb3J0Ci0JCQkJCQkJCQkJCS8vIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotLy8gaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklTb3VyY2VSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbjsgLy8gaW1wb3J0Ci0JCQkJCQkJCQkJCQkJCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuTGlicmFyeVN1cGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5Eb2N1bWVudENvbnRleHRGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VSZWZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzV2ViTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc1RyYW5zbGF0aW9uIGltcGxlbWVudHMgSUpzVHJhbnNsYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN0cmFuc2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdFVuaXQgZkNvbXBpbGF0aW9uVW5pdCA9IG51bGw7Ci0JcHJpdmF0ZSBEb2N1bWVudENvbnRleHRGcmFnbWVudFJvb3QgZkRvY3VtZW50U2NvcGU7Ci0JcHJpdmF0ZSBJSmF2YVNjcmlwdFByb2plY3QgZkphdmFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIGJ5dGVbXSBmTG9jayA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGZIdG1sRG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBmTW9kZWxCYXNlTG9jYXRpb247Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9UWVBFX05BTUUgPSAiV2luZG93IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUl9UWVBFX0xJQlJBUlkgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQubGF1bmNoaW5nLmJhc2VCcm93c2VyTGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJSnNUcmFuc2xhdG9yIGZUcmFuc2xhdG9yOwotCi0JcHJpdmF0ZSBTdHJpbmcgbWFuZ2xlZE5hbWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbGlzdGVuRm9yQ2hhbmdlczsKLQotCXB1YmxpYyBKc1RyYW5zbGF0aW9uKCkgewotCQkvKiBkbyBub3RoaW5nICovCi0JfQotCQotCXB1YmxpYyBJSnNUcmFuc2xhdG9yIGdldFRyYW5zbGF0b3IoKSB7Ci0JCWlmKGZUcmFuc2xhdG9yIT1udWxsKSB7Ci0JCQlyZXR1cm4gZlRyYW5zbGF0b3I7Ci0JCX0KLQkJCi0JCWZUcmFuc2xhdG9yID0gbmV3IEpzVHJhbnNsYXRvcihmSHRtbERvY3VtZW50LCBmTW9kZWxCYXNlTG9jYXRpb24sIGxpc3RlbkZvckNoYW5nZXMpOwotCQlyZXR1cm4gdGhpcy5mVHJhbnNsYXRvcjsKLQl9Ci0JCi0KLQkKLQlwcm90ZWN0ZWQgSnNUcmFuc2xhdGlvbihJU3RydWN0dXJlZERvY3VtZW50IGh0bWxEb2N1bWVudCwgSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qLCBib29sZWFuIGxpc3RlbkZvckNoYW5nZXMpIHsKLQkJZkxvY2sgPSBuZXcgYnl0ZVswXTsKLQkJZkphdmFQcm9qZWN0ID0gamF2YVByb2o7Ci0JCWZIdG1sRG9jdW1lbnQgPSBodG1sRG9jdW1lbnQ7Ci0JCXNldEJhc2VMb2NhdGlvbigpOwotCQltYW5nbGVkTmFtZSA9IGNyZWF0ZU1hbmdsZWROYW1lKCk7Ci0JCXRoaXMubGlzdGVuRm9yQ2hhbmdlcz1saXN0ZW5Gb3JDaGFuZ2VzOwotCX0KLQotCXB1YmxpYyBJSnNUcmFuc2xhdGlvbiBnZXRJbnN0YW5jZShJU3RydWN0dXJlZERvY3VtZW50IGh0bWxEb2N1bWVudCwgSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qLCBib29sZWFuIGxpc3RlbkZvckNoYW5nZXMpIHsKLQkJcmV0dXJuIG5ldyBKc1RyYW5zbGF0aW9uKGh0bWxEb2N1bWVudCxqYXZhUHJvaiwgbGlzdGVuRm9yQ2hhbmdlcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0SmF2YVByb2plY3QoKQotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdFByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBmSmF2YVByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXREb2NTY29wZShib29sZWFuIHJlc2V0KSB7Ci0JCWlmIChmRG9jdW1lbnRTY29wZSA9PSBudWxsKSB7Ci0JCQkvLyBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCQkvLyBJUmVzb3VyY2UgYWJzb2x1dGVSb290ID0KLQkJCS8vICgoSUNvbnRhaW5lcilnZXRKYXZhUHJvamVjdCgpLmdldFJlc291cmNlKCkpLmZpbmRNZW1iZXIoCi0JCQkvLyBXZWJSb290RmluZGVyLmdldFdlYkNvbnRlbnRGb2xkZXIoZkphdmFQcm9qZWN0LmdldFByb2plY3QoKSkpOwotCQkJZkRvY3VtZW50U2NvcGUgPSBuZXcgRG9jdW1lbnRDb250ZXh0RnJhZ21lbnRSb290KGZKYXZhUHJvamVjdCwgZ2V0RmlsZSgpLCBXZWJSb290RmluZGVyLmdldFdlYkNvbnRlbnRGb2xkZXIoZkphdmFQcm9qZWN0LmdldFByb2plY3QoKSksIFdlYlJvb3RGaW5kZXIuZ2V0U2VydmVyQ29udGV4dFJvb3QoZkphdmFQcm9qZWN0LmdldFByb2plY3QoKSksIEpzV2ViTmF0dXJlLlZJUlRVQUxfU0NPUEVfRU5UUlkpOwotCQkJZkRvY3VtZW50U2NvcGUuc2V0SW5jbHVkZWRGaWxlcyhnZXRUcmFuc2xhdG9yKCkuZ2V0UmF3SW1wb3J0cygpKTsKLQkJCXJldHVybiBmRG9jdW1lbnRTY29wZTsKLQkJfQotCi0JCWlmIChyZXNldCkKLQkJCWZEb2N1bWVudFNjb3BlLnNldEluY2x1ZGVkRmlsZXMoZ2V0VHJhbnNsYXRvcigpLmdldFJhd0ltcG9ydHMoKSk7Ci0JCXJldHVybiBmRG9jdW1lbnRTY29wZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0QmFzZUxvY2F0aW9uKCkgewotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZIdG1sRG9jdW1lbnQpOwotCQkJaWYgKHhtbE1vZGVsID09IG51bGwpIHsKLQkJCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZIdG1sRG9jdW1lbnQpOwotCQkJfQotCQkJZk1vZGVsQmFzZUxvY2F0aW9uID0geG1sTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQkvLyByZXR1cm4geG1sTW9kZWw7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihuZXcgUGF0aChmTW9kZWxCYXNlTG9jYXRpb24pKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0SHRtbERvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldEh0bWxEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZIdG1sRG9jdW1lbnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRNaXNzaW5nVGFnU3RhcnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWlzc2luZ1RhZ1N0YXJ0KCkgewotCQlyZXR1cm4gZ2V0VHJhbnNsYXRvcigpLmdldE1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFdlYlJvb3QoKSB7Ci0JCXJldHVybiBXZWJSb290RmluZGVyLmdldFdlYkNvbnRlbnRGb2xkZXIoZkphdmFQcm9qZWN0LmdldFByb2plY3QoKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5VW5kZXJSb290KCkgewotCQlTdHJpbmcgd2ViUm9vdCA9IGdldFdlYlJvb3QoKTsKLQkJSVBhdGggcHJvamVjdFdlYlJvb3RQYXRoID0gZ2V0SmF2YVByb2plY3QoKS5nZXRQYXRoKCkuYXBwZW5kKHdlYlJvb3QpOwotCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZNb2RlbEJhc2VMb2NhdGlvbikucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlyZXR1cm4gZmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhwcm9qZWN0V2ViUm9vdFBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKGZpbGVQYXRoKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBPcmlnaW5hbGx5IGZyb20gUmVjb25jaWxlU3RlcEZvckphdmEuIENyZWF0ZXMgYW4gSUphdmFTY3JpcHRVbml0IGZyb20KLQkgKiB0aGUgY29udGVudHMgb2YgdGhlIEpTUCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIElKYXZhU2NyaXB0VW5pdCBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgSlNQIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdFVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KCkgdGhyb3dzIEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXREb2NTY29wZSh0cnVlKTsKLQkJSUphdmFTY3JpcHRVbml0IGN1ID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpLmdldEphdmFTY3JpcHRVbml0KGdldE1hbmdsZWROYW1lKCkgKyBKc0RhdGFUeXBlcy5CQVNFX0ZJTEVfRVhURU5TSU9OKS5nZXRXb3JraW5nQ29weShnZXRXb3JraW5nQ29weU93bmVyKCksIGdldFByb2JsZW1SZXF1ZXN0b3IoKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCUlCdWZmZXIgYnVmZmVyOwotCQl0cnkgewotCQkJYnVmZmVyID0gY3UuZ2V0QnVmZmVyKCk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJYnVmZmVyID0gbnVsbDsKLQkJfQotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWdldFRyYW5zbGF0b3IoKS5zZXRCdWZmZXIoYnVmZmVyKTsKLQkJfQotCQlyZXR1cm4gY3U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBmaXh1cE1hbmdsZWROYW1lKFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0JCWlmIChkaXNwbGF5U3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5U3RyaW5nLnJlcGxhY2VBbGwoZ2V0TWFuZ2xlZE5hbWUoKSArICIuanMiLCBnZXRIdG1sUGFnZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldEFsbEVsZW1lbnRzSW5Kc1JhbmdlKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRBbGxFbGVtZW50c0luSnNSYW5nZShpbnQgamF2YVBvc2l0aW9uU3RhcnQsIGludCBqYXZhUG9zaXRpb25FbmQpIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gRU1UUFlfUkVTVUxUX1NFVCA9IG5ldyBJSmF2YVNjcmlwdEVsZW1lbnRbMF07Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIHJlc3VsdCA9IEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGFsbENoaWxkcmVuID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFsbENoaWxkcmVuID0gZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0Q2hpbGRyZW4oKTsKLQkJfQotCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlWZWN0b3IgdmFsaWRDaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFsbENoaWxkcmVuW2ldLmdldEVsZW1lbnRUeXBlKCkgIT0gSUphdmFTY3JpcHRFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04pIHsKLQkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBnZXRKU1NvdXJjZVJhbmdlT2YoYWxsQ2hpbGRyZW5baV0pOwotCQkJCWlmIChqYXZhUG9zaXRpb25TdGFydCA8PSByYW5nZS5nZXRPZmZzZXQoKSAmJiByYW5nZS5nZXRMZW5ndGgoKSArIHJhbmdlLmdldE9mZnNldCgpIDw9IChqYXZhUG9zaXRpb25FbmQpKSB7Ci0JCQkJCXZhbGlkQ2hpbGRyZW4uYWRkKGFsbENoaWxkcmVuW2ldKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYWxsQ2hpbGRyZW5baV0uZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YVNjcmlwdEVsZW1lbnQuVFlQRSkgewotCQkJCQl2YWxpZENoaWxkcmVuLmFkZChhbGxDaGlsZHJlbltpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh2YWxpZENoaWxkcmVuLnNpemUoKSA+IDApIHsKLQkJCXJlc3VsdCA9IChJSmF2YVNjcmlwdEVsZW1lbnRbXSkgdmFsaWRDaGlsZHJlbi50b0FycmF5KG5ldyBJSmF2YVNjcmlwdEVsZW1lbnRbXXt9KTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1UUFlfUkVTVUxUX1NFVDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0Q29tcGlsYXRpb25Vbml0KCkKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRVbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJdHJ5IHsKLQkJCQlpZiAoZkNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7Ci0JCQkJCWZDb21waWxhdGlvblVuaXQgPSBjcmVhdGVDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJcmV0dXJuIGZDb21waWxhdGlvblVuaXQ7Ci0JCQkJfQotCi0JCQl9Ci0JCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCWlmIChKc1RyYW5zbGF0aW9uLkRFQlVHKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImVycm9yIGNyZWF0aW5nIEpTUCB3b3JraW5nIGNvcHkuLi4gIiwgam1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWdldERvY1Njb3BlKHRydWUpOwotCQl0cnkgewotCQkJZkNvbXBpbGF0aW9uVW5pdCA9IGZDb21waWxhdGlvblVuaXQuZ2V0V29ya2luZ0NvcHkoZ2V0V29ya2luZ0NvcHlPd25lcigpLCBnZXRQcm9ibGVtUmVxdWVzdG9yKCksIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCS8vIGZDb21waWxhdGlvblVuaXQubWFrZUNvbnNpc3RlbnQoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBmQ29tcGlsYXRpb25Vbml0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50W10gZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShpbnQgamF2YVBvc2l0aW9uU3RhcnQsIGludCBqYXZhUG9zaXRpb25FbmQpIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gRU1UUFlfUkVTVUxUX1NFVCA9IG5ldyBJSmF2YVNjcmlwdEVsZW1lbnRbMF07Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIHJlc3VsdCA9IEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCXRyeSB7Ci0JCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCWlmIChjdSAhPSBudWxsKSB7Ci0JCQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJCQlpbnQgY3VEb2NMZW5ndGggPSBjdS5nZXRCdWZmZXIoKS5nZXRMZW5ndGgoKTsKLQkJCQkJaW50IGphdmFMZW5ndGggPSBqYXZhUG9zaXRpb25FbmQgLSBqYXZhUG9zaXRpb25TdGFydDsKLQkJCQkJaWYgKGN1RG9jTGVuZ3RoID4gMCAmJiBqYXZhUG9zaXRpb25TdGFydCA+PSAwICYmIGphdmFMZW5ndGggPj0gMCAmJiBqYXZhUG9zaXRpb25FbmQgPD0gY3VEb2NMZW5ndGgpIHsKLQkJCQkJCXJlc3VsdCA9IGN1LmNvZGVTZWxlY3QoamF2YVBvc2l0aW9uU3RhcnQsIGphdmFMZW5ndGgsIGdldFdvcmtpbmdDb3B5T3duZXIoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuIEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiB4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKHgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SHRtbFBhZ2VOYW1lKCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZk1vZGVsQmFzZUxvY2F0aW9uKTsKLQkJcmV0dXJuIHBhdGgubGFzdFNlZ21lbnQoKTsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0SHRtbFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHRtbFRleHQoKSB7Ci0JCXJldHVybiBmSHRtbERvY3VtZW50LmdldCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVBhdGgoKSB7Ci0JCUlQYXRoIHJvb3RQYXRoID0gbmV3IFBhdGgoZk1vZGVsQmFzZUxvY2F0aW9uKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCVN0cmluZyBjdVBhdGggPSByb290UGF0aC5hcHBlbmQoIi8iICsgZ2V0TWFuZ2xlZE5hbWUoKSArIEpzRGF0YVR5cGVzLkJBU0VfRklMRV9FWFRFTlNJT04pLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGN1UGF0aDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldEpzRWxlbWVudEF0T2Zmc2V0KGludCkKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50IGdldEpzRWxlbWVudEF0T2Zmc2V0KGludCBqc09mZnNldCkgewotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHMgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudHMgPSBnZXRDb21waWxhdGlvblVuaXQoKS5nZXRFbGVtZW50QXQoanNPZmZzZXQpOwotCQl9Ci0JCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJaWYgKEpzVHJhbnNsYXRpb24uREVCVUcpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJlcnJvciByZXRyaWV2aW5nIGphdmEgZWxlbXRudCBmcm9tIGNvbXBpbGF0aW9uIHVuaXQuLi4gIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIH0KLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHJpdmF0ZSBJU291cmNlUmFuZ2UgZ2V0SlNTb3VyY2VSYW5nZU9mKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIHJldHVybnMgdGhlIG9mZnNldCBpbiBodG1sIG9mIGdpdmVuIGVsZW1lbnQKLQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZW1iZXIpIHsKLQkJCXRyeSB7Ci0JCQkJcmFuZ2UgPSAoKE1lbWJlcikgZWxlbWVudCkuZ2V0TmFtZVJhbmdlKCk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9ZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNvdXJjZVJlZkVsZW1lbnQpIHsKLQkJCXRyeSB7Ci0JCQkJcmFuZ2UgPSAoKFNvdXJjZVJlZkVsZW1lbnQpIGVsZW1lbnQpLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByYW5nZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldEpzVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc1RleHQoKSB7Ci0JCXJldHVybiBnZXRUcmFuc2xhdG9yKCkuZ2V0SnNUZXh0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRTY3JpcHRQb3NpdGlvbnMoKQotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldFNjcmlwdFBvc2l0aW9ucygpIHsKLQkJcmV0dXJuIGdldFRyYW5zbGF0b3IoKS5nZXRIdG1sTG9jYXRpb25zKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNpbnNlcnRJbkZpcnN0U2NyaXB0UmVnaW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0SW5GaXJzdFNjcmlwdFJlZ2lvbihTdHJpbmcgdGV4dCkgewotCQlQb3NpdGlvbiBwb3NbXSA9IGdldFNjcmlwdFBvc2l0aW9ucygpOwotCQlpbnQgc2NyaXB0U3RhcnRPZmZzZXQgPSAwOwotCQlpZihwb3MhPW51bGwgJiYgcG9zLmxlbmd0aD4wKSB7Ci0JCQlzY3JpcHRTdGFydE9mZnNldCA9IHBvc1swXS5nZXRPZmZzZXQoKTsKLQkJCQotCQl9Ci0JCVN0cmluZyBpbnNlcnRUZXh0ID0gKHNjcmlwdFN0YXJ0T2Zmc2V0PT0wPyIiOiJcbiIpICsgdGV4dDsKLQkJaW5zZXJ0U2NyaXB0KHNjcmlwdFN0YXJ0T2Zmc2V0LGluc2VydFRleHQpOwotCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNpbnNlcnRTY3JpcHQoaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFNjcmlwdChpbnQgb2Zmc2V0LCBTdHJpbmcgdGV4dCkgewotCi0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCVBvc2l0aW9uW10gaW5IdG1sID0gZ2V0U2NyaXB0UG9zaXRpb25zKCk7Ci0JCWJvb2xlYW4gaXNJbnNpZGVFeGlzdGluZ1NjcmlwdFJlZ2lvbiA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluSHRtbC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGluSHRtbFtpXS5vdmVybGFwc1dpdGgob2Zmc2V0LCAxKSkgewotCQkJCS8vICogaW5zZXJ0aW5nIGludG8gYSBzY3JpcHQgcmVnaW9uCi0JCQkJaXNJbnNpZGVFeGlzdGluZ1NjcmlwdFJlZ2lvbiA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgaW5zZXJ0VGV4dCA9IG51bGw7Ci0KLQkJaWYgKGlzSW5zaWRlRXhpc3RpbmdTY3JpcHRSZWdpb24pIHsKLQkJCWluc2VydFRleHQgPSB0ZXh0OwotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0VGV4dCA9IG9mZnNldCAhPSAwID8gIlxuIiA6ICIiICsgIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPlxuIiArIHRleHQgKyAiXG48L3NjcmlwdD5cbiI7Ci0JCX0KLQkvLwl0cmFuc2xhdG9yLmRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChudWxsKTsKLQotCQlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7Ci0JCQl0cnkgewotCQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChmSHRtbERvY3VtZW50KTsKLQkJCQlpZiAoeG1sTW9kZWwgPT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZIdG1sRG9jdW1lbnQpOwotCQkJCX0KLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCi0KLQkJCQkJeG1sTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJCXhtbE1vZGVsLmdldERvY3VtZW50KCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBpbnNlcnRUZXh0KTsKLQkJCQkJeG1sTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl4bWxNb2RlbC5zYXZlKCk7Ci0JCQkJCX0KLQotCQkJCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7fQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkge30KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQkJeG1sTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQotCS8vCXRyYW5zbGF0b3IuZG9jdW1lbnRDaGFuZ2VkKG51bGwpOwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYW5nbGVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFuZ2xlZE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTWFuZ2xlZE5hbWUoKSB7Ci0JCXJldHVybiBKc05hbWVNYW5nbGVyVXRpbC5tYW5nbGUoZk1vZGVsQmFzZUxvY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9ibGVtIHJlcXVlc3RvciBmb3IgdGhlIEphdmFTY3JpcHRVbml0IGluIHRoaXMKLQkgKiAgICAgICAgIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSBKc1Byb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcigpIHsKLQkJcmV0dXJuIENvbXBpbGF0aW9uVW5pdEhlbHBlci5nZXRJbnN0YW5jZSgpLmdldFByb2JsZW1SZXF1ZXN0b3IoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldFByb2JsZW1zKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9ibGVtcygpIHsKLQkJTGlzdCBwcm9ibGVtcyA9IGdldFByb2JsZW1SZXF1ZXN0b3IoKS5nZXRDb2xsZWN0ZWRQcm9ibGVtcygpOwotCQlnZXRQcm9ibGVtUmVxdWVzdG9yKCkuZW5kUmVwb3J0aW5nKCk7Ci0JCXJldHVybiBwcm9ibGVtcyAhPSBudWxsID8gcHJvYmxlbXMgOiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgewotCQkJZlByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9ncmVzc01vbml0b3I7Ci0JfQotCi0JcHVibGljIFdvcmtpbmdDb3B5T3duZXIgZ2V0V29ya2luZ0NvcHlPd25lcigpIHsKLQkJcmV0dXJuIENvbXBpbGF0aW9uVW5pdEhlbHBlci5nZXRJbnN0YW5jZSgpLmdldFdvcmtpbmdDb3B5T3duZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2lmT2Zmc2V0SW5JbXBvcnROb2RlKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpZk9mZnNldEluSW1wb3J0Tm9kZShpbnQgb2Zmc2V0KSB7Ci0JCVBvc2l0aW9uW10gaW1wb3J0UmFuZ2VzID0gZ2V0VHJhbnNsYXRvcigpLmdldEltcG9ydEh0bWxSYW5nZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRSYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpbXBvcnRSYW5nZXNbaV0uaW5jbHVkZXMob2Zmc2V0KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI3JlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCkgewotCQkvLyBpZih0cnVlKSByZXR1cm47Ci0JCUlKYXZhU2NyaXB0VW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZiAoZkNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJCQkvLyBpZihmYWxzZSkKLQkJCQkJLy8gY3UubWFrZUNvbnNpc3RlbnQoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQljdS5yZWNvbmNpbGUoSUphdmFTY3JpcHRVbml0Lk5PX0FTVCwgdHJ1ZSwgZ2V0V29ya2luZ0NvcHlPd25lcigpLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZ2V0VHJhbnNsYXRvcigpICE9IG51bGwpCi0JCQlnZXRUcmFuc2xhdG9yKCkucmVsZWFzZSgpOwotCQlzeW5jaHJvbml6ZWQgKGZMb2NrKSB7Ci0JCQlpZiAoZkNvbXBpbGF0aW9uVW5pdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKEpzVHJhbnNsYXRpb24uREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKC0pIEpTUFRyYW5zbGF0aW9uIFsiICsgdGhpcyArICJdIGRpc2NhcmRpbmcgSmF2YVNjcmlwdFVuaXQ6ICIgKyBmQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZkNvbXBpbGF0aW9uVW5pdC5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHdlJ3JlIGRvbmUgdy8gaXQgYW55d2F5Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNzZXRQcm9ibGVtQ29sbGVjdGluZ0FjdGl2ZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKGJvb2xlYW4gY29sbGVjdCkgewotCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCWdldFByb2JsZW1SZXF1ZXN0b3IoKS5zZXRJc0FjdGl2ZShjb2xsZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsYXNzcGF0aENoYW5nZSgpIHsKLQotCQlpZiAoZkRvY3VtZW50U2NvcGUgIT0gbnVsbCkgewotCQkJZkRvY3VtZW50U2NvcGUuY2xhc3NwYXRoQ2hhbmdlKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGUzYWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQotICogPGJyPjxicj4gdGhpcyBhZGFwdGVyIGxvYWRzIHRyYW5zbGF0aW9uIGluZm9ybWF0aW9uIGZyb20gZXh0ZW5zaW9uIHBvaW50cy4gIHRoaXMgaXMgdG8gYWxsb3cgbW9yZSBjb21wbGljYXRlZCBodG1sL2pzIHRyYW5zbGF0aW9ucyB0aHJvdWdoIGV4dGVuc2lvbnMuCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNUcmFuc2xhdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN0cmFuc2xhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmSHRtbERvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElKc1RyYW5zbGF0aW9uIGZKU1BUcmFuc2xhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBOdWxsUHJvZ3Jlc3NNb25pdG9yIGZUcmFuc2xhdGlvbk1vbml0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGJhc2VMb2NhdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gbGlzdGVuRm9yQ2hhbmdlcz1mYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfQVRUUklCID0gInByaW9yaXR5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCID0gImNsYXNzIjsKLQlwcml2YXRlIElKc1RyYW5zbGF0aW9uIGZUcmFuc2xhdGlvbkVsZW1lbnQ7Ci0JCi0JcHVibGljIEpzVHJhbnNsYXRpb25BZGFwdGVyKElET01Nb2RlbCB4bWxNb2RlbCkgewotCQlmSHRtbERvY3VtZW50ID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWJhc2VMb2NhdGlvbiA9IHhtbE1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpbml0aWFsaXplSmF2YVBsdWdpbnMoKTsKLQkJCi0JCQotCX0KLQlwdWJsaWMgdm9pZCBzaG91bGRMaXN0ZW5Gb3JDaGFuZ2VzKGJvb2xlYW4gbGlzdGVuRm9yUHJvamVjdENoYW5nZXMpIHsKLQkJaWYobGlzdGVuRm9yUHJvamVjdENoYW5nZXMpIHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJSmF2YVNjcmlwdFByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCUlKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQlwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGZpbGVQYXRoLnNlZ21lbnQoMCkpOwotCQl9Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWphdmFQcm9qZWN0ID0gSmF2YVNjcmlwdENvcmUuY3JlYXRlKHByb2plY3QpOwotCQl9Ci0JCQotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpTUFRyYW5zbGF0aW9uIGZvciB0aGlzIGFkYXB0ZXIuCi0JICogCi0JICogQHJldHVybiBhIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uCi0JICovCi0JcHVibGljIElKc1RyYW5zbGF0aW9uIGdldEpTUFRyYW5zbGF0aW9uKGJvb2xlYW4gbGlzdGVuRm9yQ2hhbmdlcykgewotCQlpZiAoZkpTUFRyYW5zbGF0aW9uID09IG51bGwgfHwgKCF0aGlzLmxpc3RlbkZvckNoYW5nZXMgJiYgbGlzdGVuRm9yQ2hhbmdlcykpIHsKLQkJCWlmKGZKU1BUcmFuc2xhdGlvbiE9bnVsbCkgZkpTUFRyYW5zbGF0aW9uLnJlbGVhc2UoKTsKLQkJCWlmKGZUcmFuc2xhdGlvbkVsZW1lbnQ9PW51bGwpIHsKLQkJCQkvKiBsb2FkIHRoZSB0cmFuc2xhdGlvbiBmYWN0b3J5IGZyb20gdGhlIGV4dGVuc2lvbiBwb2ludCAqLwotCQkJCXRyeSB7Ci0JCQkJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQkJICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9ICByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdFByZVByb2Nlc3NvciIpOwotCQkJCSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgcG9pbnRzW10gPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkgLy8gICBpbnRbXSBwcmlvcml0aWVzID0gbmV3IGludFtwb2ludHMubGVuZ3RoXTsKLQkJCQkgICAKLQkJCQkgICAgaW50IGhpZ2hlc3RQcmlvcml0eVZhbHVlID0gLTE7Ci0JCQkJICAgIGludCBoaWdoZXN0UHJpb3JpdHlJbmRleCA9IC0xOwotCQkJCSAgICAKLQkJCQkgICAgZm9yKGludCBpID0gMDtpIDwgcG9pbnRzLmxlbmd0aDtpKyspewotCQkJCSAgICAJU3RyaW5nIHByaW9yaXR5ID0gcG9pbnRzW2ldLmdldEF0dHJpYnV0ZShQUklPUklUWV9BVFRSSUIpOwotCQkJCSAgICAJaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChwcmlvcml0eSk7Ci0JCQkJICAgIAlpZih2YWx1ZT5oaWdoZXN0UHJpb3JpdHlWYWx1ZSkgewotCQkJCSAgICAJCWhpZ2hlc3RQcmlvcml0eUluZGV4ID0gaTsKLQkJCQkgICAgCQloaWdoZXN0UHJpb3JpdHlWYWx1ZSA9IHZhbHVlOwotCQkJCSAgICAJfQotCQkJCSAgICAgICAKLQkJCQkgICAgfQotCQkJCSAgICBmVHJhbnNsYXRpb25FbGVtZW50ID0gKElKc1RyYW5zbGF0aW9uKXBvaW50c1toaWdoZXN0UHJpb3JpdHlJbmRleF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQkJCX0KLQkJCX0KLQkJCS8vZkpTUFRyYW5zbGF0aW9uID0gbmV3IEpzVHJhbnNsYXRpb24oZkh0bWxEb2N1bWVudCwgZ2V0SmF2YVByb2plY3QoKSxsaXN0ZW5Gb3JDaGFuZ2VzKTsKLQkJCWZKU1BUcmFuc2xhdGlvbiA9IGZUcmFuc2xhdGlvbkVsZW1lbnQuZ2V0SW5zdGFuY2UoZkh0bWxEb2N1bWVudCwgZ2V0SmF2YVByb2plY3QoKSwgbGlzdGVuRm9yQ2hhbmdlcyk7Ci0JCQl0aGlzLmxpc3RlbkZvckNoYW5nZXM9bGlzdGVuRm9yQ2hhbmdlczsKLQkJfQotCQlzaG91bGRMaXN0ZW5Gb3JDaGFuZ2VzKGxpc3RlbkZvckNoYW5nZXMpOwotCQlyZXR1cm4gZkpTUFRyYW5zbGF0aW9uOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCkgewotCQlKYXZhU2NyaXB0Q29yZS5nZXRQbHVnaW4oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHt9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZUcmFuc2xhdGlvbk1vbml0b3IgIT0gbnVsbCkgewotCQkJZlRyYW5zbGF0aW9uTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJfQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKGZKU1BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUFRyYW5zbGF0aW9uQWRhcHRlciByZWxlYXNpbmc6IiArIGZKU1BUcmFuc2xhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZKU1BUcmFuc2xhdGlvbi5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUlQcm9qZWN0IGNoYW5nZWRQcm9qZWN0ID0gKGV2ZW50PT1udWxsIHx8IGV2ZW50LmdldFJlc291cmNlKCk9PW51bGwpP251bGw6ZXZlbnQuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7Ci0JCWlmKGNoYW5nZWRQcm9qZWN0IT1udWxsICYmIGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmVxdWFscyhjaGFuZ2VkUHJvamVjdCkgJiYgZkpTUFRyYW5zbGF0aW9uIT1udWxsKXsKLQkJCWZKU1BUcmFuc2xhdGlvbi5jbGFzc3BhdGhDaGFuZ2UoKTsKLQkJfQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjgwOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQotICogQGF1dGhvciBwYXZlcnkKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0JcHJpdmF0ZSBib29sZWFuIGxpc3RlbkZvclByb2plY3RDaGFuZ2VzOwotCQotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3RyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAJCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBKc1RyYW5zbGF0aW9uQWRhcHRlciBmQWRhcHRlciA9IG51bGw7Ci0JCi0JcHVibGljIEpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoSUpzVHJhbnNsYXRpb24uY2xhc3MsIHRydWUpOwotCQlsaXN0ZW5Gb3JQcm9qZWN0Q2hhbmdlcyA9IHRydWU7Ci0JfQotCQotCQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUgJiYgZkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZkFkYXB0ZXIgPSBuZXcgSnNUcmFuc2xhdGlvbkFkYXB0ZXIoKChJRE9NTm9kZSkgdGFyZ2V0KS5nZXRNb2RlbCgpKTsKLQkJCWlmIChKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIGNyZWF0ZWQgYWRhcHRlcjogIiArIGZBZGFwdGVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZBZGFwdGVyOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaWYgKEpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKC0pIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgWyIgKyB0aGlzICsgIl0gcmVsZWFzaW5nIGFkYXB0ZXI6ICIgKyBmQWRhcHRlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZkFkYXB0ZXIucmVsZWFzZSgpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQWRhcHRlckZhY3RvcnkoSVN0cnVjdHVyZWRNb2RlbCBzbSkgewotCQlpZiAoc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcykgPT0gbnVsbCkgewotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlzbS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGEyOTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCi0gKiBUcmFuc2xhdGVzIGEgSlNQL0hUTUwgZG9jdW1lbnQgaW50byBpdHMgSmF2YVNjcmlwdCBwaWVjZXMuIAotICogCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqLwotcHVibGljIGNsYXNzIEpzVHJhbnNsYXRvciBleHRlbmRzIEpvYiBpbXBsZW1lbnRzIElKc1RyYW5zbGF0b3J7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfU0FWRV9PVVRQVVQgPSBmYWxzZTsgIC8vInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb25zdG9kaXNrIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOREwgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRU1PVkVfWE1MX0NPTU1FTlQgPSB0cnVlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9TVEFSVCA9ICI8IS0tIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9FTkQgPSAiLS0+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVQTEFDRV9JTk5FUl9CTE9DS19TRUNUSU9OU19XSVRIX1NQQUNFID0gZmFsc2U7Ci0JCi0JCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzamF2YW1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotIAkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGU7Ci0JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBmU2NyaXB0VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGltcG9ydExvY2F0aW9uc0luSHRtbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvKiB1c2UgamF2YSBzY3JpcHQgYnkgZGVmYXVsdCAqLwotCXByb3RlY3RlZCBib29sZWFuIGZJc0dsb2JhbEpzID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IHJhd0ltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIHRyYXNsYXRlZAotCXByb3RlY3RlZCBBcnJheUxpc3Qgc2NyaXB0TG9jYXRpb25Jbkh0bWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIGludCBzY3JpcHRPZmZzZXQgPSAwOwotCQotCXByb3RlY3RlZCBieXRlW10gZkxvY2sgPSBuZXcgYnl0ZVswXTsKLQlwcm90ZWN0ZWQgYnl0ZVtdIGZpbmlzaGVkID0gbmV3IGJ5dGVbMF07Ci0JCi0JcHJvdGVjdGVkIElCdWZmZXIgZkNvbXBVbml0QnVmZjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5jZWxQYXJzZSA9IGZhbHNlOwotCXByb3RlY3RlZCBpbnQgbWlzc2luZ0VuZFRhZ1JlZ2lvblN0YXJ0ID0gLTE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFERF9TRU1JQ09MT05fQVRfSU5MSU5FPXRydWU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNHbG9iYWxKcygpIHsKLQkJcmV0dXJuIGZJc0dsb2JhbEpzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUJ1ZmZlciBnZXRDb21wVW5pdEJ1ZmZlcigpIHsKLQkJcmV0dXJuIGZDb21wVW5pdEJ1ZmY7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmdCdWZmZXIgZ2V0U2NyaXB0VGV4dEJ1ZmZlcigpIHsKLQkJcmV0dXJuIGZTY3JpcHRUZXh0OwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJc0dsb2JhbEpzKGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5mSXNHbG9iYWxKcyA9IHZhbHVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZHZhbmNlTmV4dE5vZGUoKSB7Ci0JCXNldEN1cnJlbnROb2RlKGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW51cFhtbFF1b3RlcygpIHsKLQkJaWYoUkVNT1ZFX1hNTF9DT01NRU5UKSB7Ci0JCQlpbnQgaW5kZXggPSAtMTsKLQkJCWludCByZXBsYWNlTGVuZ3RoICA9IFhNTF9DT01NRU5UX1NUQVJULmxlbmd0aCgpOwotCQkJd2hpbGUoKGluZGV4ID0gZlNjcmlwdFRleHQuaW5kZXhPZihYTUxfQ09NTUVOVF9TVEFSVCwgaW5kZXgpKSA+IC0xKSB7Ci0JCQkJZlNjcmlwdFRleHQucmVwbGFjZShpbmRleCwgaW5kZXggKyByZXBsYWNlTGVuZ3RoLCBuZXcgU3RyaW5nKFV0aWwuZ2V0UGFkKHJlcGxhY2VMZW5ndGgpKSk7Ci0JCQl9Ci0JCQkKLQkJCWluZGV4ID0gLTE7Ci0JCQlyZXBsYWNlTGVuZ3RoICA9IFhNTF9DT01NRU5UX0VORC5sZW5ndGgoKTsKLQkJCXdoaWxlKChpbmRleCA9IGZTY3JpcHRUZXh0LmluZGV4T2YoWE1MX0NPTU1FTlRfRU5ELCBpbmRleCkpID4gLTEpIHsKLQkJCQlmU2NyaXB0VGV4dC5yZXBsYWNlKGluZGV4LCBpbmRleCArIHJlcGxhY2VMZW5ndGgsIG5ldyBTdHJpbmcoVXRpbC5nZXRQYWQocmVwbGFjZUxlbmd0aCkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkKLQkKLQlwdWJsaWMgSnNUcmFuc2xhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIAlTdHJpbmcgZmlsZU5hbWUpIHsKLQkJc3VwZXIoIkphdmFTY3JpcHQgdHJhbnNsYXRpb24gZm9yIDogIiAgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IGRvY3VtZW50OwotCQkKLQkJZlN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQkJc2NoZWR1bGUoKTsKLQkJcmVzZXQoKTsKLQl9Ci0JCi0JcHVibGljIEpzVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoIkphdmFTY3JpcHQgVHJhbnNsYXRpb24iKTsKLQl9Ci0JCi0JcHVibGljIEpzVHJhbnNsYXRvcihJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCAJU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIGxpc3RlbkZvckNoYW5nZXMpIHsKLQkJc3VwZXIoIkphdmFTY3JpcHQgdHJhbnNsYXRpb24gZm9yIDogIiAgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IGRvY3VtZW50OwotCQlpZihsaXN0ZW5Gb3JDaGFuZ2VzKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzY2hlZHVsZSgpOwotCQl9Ci0JCXJlc2V0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNnZXRKc1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNUZXh0KCkgewotCQlzeW5jaHJvbml6ZWQoZmluaXNoZWQpIHsKLQkJCXJldHVybiBmU2NyaXB0VGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNnZXRDdXJyZW50Tm9kZSgpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Q3VycmVudE5vZGUoKSB7Ci0JCQotCQlyZXR1cm4gZkN1cnJlbnROb2RlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3Ijc2V0QnVmZmVyKG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUJ1ZmZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBidWZmZXIpIHsKLQkJZkNvbXBVbml0QnVmZiA9IGJ1ZmZlcjsKLQkJc3luY2hyb25pemVkKGZpbmlzaGVkKSB7Ci0JCQlmQ29tcFVuaXRCdWZmLnNldENvbnRlbnRzKGZTY3JpcHRUZXh0LnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI2dldEh0bWxMb2NhdGlvbnMoKQotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldEh0bWxMb2NhdGlvbnMoKSB7Ci0JCXN5bmNocm9uaXplZChmaW5pc2hlZCkgewotCQkJcmV0dXJuIChQb3NpdGlvbltdKSBzY3JpcHRMb2NhdGlvbkluSHRtbC50b0FycmF5KG5ldyBQb3NpdGlvbltzY3JpcHRMb2NhdGlvbkluSHRtbC5zaXplKCldKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNnZXRNaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWlzc2luZ0VuZFRhZ1JlZ2lvblN0YXJ0KCkgewotCQlyZXR1cm4gbWlzc2luZ0VuZFRhZ1JlZ2lvblN0YXJ0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjZ2V0SW1wb3J0SHRtbFJhbmdlcygpCi0JICovCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0SW1wb3J0SHRtbFJhbmdlcygpIHsKLQkJc3luY2hyb25pemVkKGZpbmlzaGVkKSB7Ci0JCQlyZXR1cm4gKFBvc2l0aW9uW10pIGltcG9ydExvY2F0aW9uc0luSHRtbC50b0FycmF5KG5ldyBQb3NpdGlvbltpbXBvcnRMb2NhdGlvbnNJbkh0bWwuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0JCi0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjZ2V0UmF3SW1wb3J0cygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJhd0ltcG9ydHMoKSB7Ci0JCXN5bmNocm9uaXplZChmaW5pc2hlZCkgewotCQkJcmV0dXJuIChTdHJpbmdbXSkgdGhpcy5yYXdJbXBvcnRzLnRvQXJyYXkobmV3IFN0cmluZ1tyYXdJbXBvcnRzLnNpemUoKV0pOwotCQl9Ci0JfQotCi0JCQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNsYXRvcidzIHByb2dyc3MgbW9uaXRvciwgZmFsc2UgaWYgdGhlCi0JICogICAgICAgICBtb25pdG9yIGlzIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQlyZXR1cm4gY2FuY2VsUGFyc2U7Ci0JfQotCQotCS8qKgotCSAqIFJlaW5pdGlhbGl6ZSBzb21lIGZpZWxkcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0KCkgewotCQlzeW5jaHJvbml6ZWQoZkxvY2spIHsKLQkJCXNjcmlwdE9mZnNldCA9IDA7Ci0JCQkvLyByZXNldCBwcm9ncmVzcyBtb25pdG9yCi0JCQljYW5jZWxQYXJzZSA9IGZhbHNlOwotCQkJZlNjcmlwdFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmQ3VycmVudE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlyYXdJbXBvcnRzLmNsZWFyKCk7Ci0JCQlpbXBvcnRMb2NhdGlvbnNJbkh0bWwuY2xlYXIoKTsKLQkJCXNjcmlwdExvY2F0aW9uSW5IdG1sLmNsZWFyKCk7Ci0JCQltaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQgPSAtMTsKLQkJfQotCQl0cmFuc2xhdGUoKTsKLQl9Ci0KLQotCQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldEN1cnJlbnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUpIHsKLQkJc3luY2hyb25pemVkKGZMb2NrKSB7Ci0JCQlyZXR1cm4gdGhpcy5mQ3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjdHJhbnNsYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGUoKSB7Ci0JCS8vc2V0Q3VycmVudE5vZGUoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJCi0JCXN5bmNocm9uaXplZChmaW5pc2hlZCkgewotCQkJd2hpbGUgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCAmJiAhaXNDYW5jZWxlZCgpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJUcmFuc2xhdG9yIExvb2tpbmcgYXQgTm9kZQotCQkJCS8vIHR5cGU6IitnZXRDdXJyZW50Tm9kZSgpLmdldFR5cGUoKSsiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOiIpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgTm9kZUhlbHBlcihnZXRDdXJyZW50Tm9kZSgpKSk7Ci0JCQkJLy8gaS5wcmludGxuKCIvLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0JCQkJaWYgKGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCU5vZGVIZWxwZXIgbmggPSBuZXcgTm9kZUhlbHBlcihnZXRDdXJyZW50Tm9kZSgpKTsKLQkJCQkJaWYgKCghbmguaXNFbmRUYWcoKSB8fCBuaC5pc1NlbGZDbG9zaW5nVGFnKCkpICYmIG5oLm5hbWVFcXVhbHMoInNjcmlwdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8qCi0JCQkJCQkgKiBIYW5kbGVzIHRoZSBmb2xsb3dpbmcgY2FzZXM6IDxzY3JpcHQKLQkJCQkJCSAqIHR5cGU9ImphdmFzY3JpcHR5cGUiPiA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0eXBlPgotCQkJCQkJICogPHNjcmlwdCBzcmM9JycgdHlwZT1qYXZhc2NyaXB0eXBlPiA8c2NyaXB0IHNyYz0nJwotCQkJCQkJICogbGFuZ3VhZ2U9amF2YXNjcmlwdHR5cGUgPHNjcmlwdCBzcmM9Jyc+IGdsb2JhbCBqcyB0eXBlLgotCQkJCQkJICogPHNjcmlwdD4gKGdsb2JhbCBqcyB0eXBlKQotCQkJCQkJICovCi0JCQkJCQlpZiAoTm9kZUhlbHBlci5pc0luQXJyYXkoSnNEYXRhVHlwZXMuSlNWQUxJRERBVEFUWVBFUywgbmguZ2V0QXR0cmlidXRlVmFsdWUoInR5cGUiKSkgfHwgTm9kZUhlbHBlci5pc0luQXJyYXkoSnNEYXRhVHlwZXMuSlNWQUxJRERBVEFUWVBFUywgbmguZ2V0QXR0cmlidXRlVmFsdWUoImxhbmd1YWdlIikpIHx8IGlzR2xvYmFsSnMoKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlpZiAobmguY29udGFpbnNBdHRyaWJ1dGUobmV3IFN0cmluZ1tdIHsgInNyYyIgfSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkvLyBIYW5kbGUgaW1wb3J0Ci0JCQkJCQkJCXRyYW5zbGF0ZVNjcmlwdEltcG9ydE5vZGUoZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIH0gZWxzZSB7Ci0JCQkJCQkJLy8gaGFuZGxlIHNjcmlwdCBzZWN0aW9uCi0JCQkJCQkJCi0JCQkJCQkJaWYgKGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpICE9IG51bGwgLyomJiBnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKi8pIHsKLQkJCQkJCQkJdHJhbnNsYXRlSlNOb2RlKGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IC8vIEVuZCBzZWFyY2ggZm9yIDxzY3JpcHQ+IHNlY3Rpb25zCi0JCQkJCX0gZWxzZSBpZiAobmguY29udGFpbnNBdHRyaWJ1dGUoSnNEYXRhVHlwZXMuSFRNTEFUUkVWRU5UUykpIHsKLQkJCQkJCS8qIENoZWNrIGZvciBlbWJlZGVkIEpTIGV2ZW50cyBpbiBhbnkgdGFncyAqLwotCQkJCQkJdHJhbnNsYXRlSW5saW5lSlNOb2RlKGdldEN1cnJlbnROb2RlKCkpOwotCQkJCQl9IGVsc2UgaWYgKG5oLm5hbWVFcXVhbHMoIk1FVEEiKSAmJiBuaC5hdHRyRXF1YWxzKCJodHRwLWVxdWl2IiwgIkNvbnRlbnQtU2NyaXB0LVR5cGUiKSAmJiBuaC5jb250YWluc0F0dHJpYnV0ZShuZXcgU3RyaW5nW10geyAiY29udGVudCIgfSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJLy8gPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idHlwZSI+Ci0JCQkJCQlzZXRJc0dsb2JhbEpzKCBOb2RlSGVscGVyLmlzSW5BcnJheShKc0RhdGFUeXBlcy5KU1ZBTElEREFUQVRZUEVTLCBuaC5nZXRBdHRyaWJ1dGVWYWx1ZSgiY29udGVudCIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSAvLyBFbmQgYmlnIGlmIG9mIEpTIHR5cGVzCi0JCQkJfQotCQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJYWR2YW5jZU5leHROb2RlKCk7Ci0JCQkJfQotCQkJfSAvLyBlbmQgd2hpbGUgbG9vcAotCQkJaWYoZ2V0Q29tcFVuaXRCdWZmZXIoKSE9bnVsbCkgZ2V0Q29tcFVuaXRCdWZmZXIoKS5zZXRDb250ZW50cyhmU2NyaXB0VGV4dC50b1N0cmluZygpKTsKLQkJfQotCQlmaW5pc2hlZFRyYW5zbGF0aW9uKCk7Ci0JCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkVHJhbnNsYXRpb24oKSB7Ci0JCWlmKERFQlVHX1NBVkVfT1VUUFVUKXsKLQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG51bGw7Ci0JCQlQcmludFN0cmVhbSBvdXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQkJaWYgKHhtbE1vZGVsID09IG51bGwpIHsKLQkJCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCQl9Ci0JCQkJYmFzZUxvY2F0aW9uID0geG1sTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKGJhc2VMb2NhdGlvbiE9bnVsbCl7Ci0JCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IHdvcmtzcGFjZS5nZXRSb290KCk7Ci0JCQkJSUZpbGUgdEZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoYmFzZUxvY2F0aW9uICsgIi5qcyIpKTsKLQkJCQlGaWxlIHRlbXBGaWxlID0gdEZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJCQkKLQkJCQkgIGlmKHRlbXBGaWxlLmV4aXN0cygpKXsKLQkJCQkJICB0ZW1wRmlsZS5kZWxldGUoKTsKLQkJCQkgIH0KLQkJCQkgCi0JCQkJICB0cnkgewotCQkJCQkgIHRlbXBGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQkJICBmb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOwotCQkJCQkgIG91dCA9IG5ldyBQcmludFN0cmVhbShmb3V0KTsKLQkJCQkJICBvdXQucHJpbnRsbihmU2NyaXB0VGV4dCk7Ci0JCQkJCSAgb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQotCQkJCX1maW5hbGx5ewotCQkJCQlpZihvdXQhPW51bGwpIG91dC5jbG9zZSgpOwotCQkJCQotCQkJCQkKLQkJCQl9Ci0JCQkJIHRyeSB7Ci0JCQkJCXJvb3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JCQotCQljbGVhbnVwWG1sUXVvdGVzKCk7Ci0JCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciN0cmFuc2xhdGVJbmxpbmVKU05vZGUob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGVJbmxpbmVKU05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIpIHsKLQkJLy8gU3lzdGVtLm91dAotCQkvLyAucHJpbnRsbigiSlNQVHJhbnNsYXRvci50cmFuc2xhdGVJbmxpbmVKU05vZGUgRW50ZXJlZAotCQkvLyB3L1NjcmlwdE9mZnNldDoiCi0JCS8vICsgc2NyaXB0T2Zmc2V0KTsKLQkJCi0JCQlOb2RlSGVscGVyIG5oID0gbmV3IE5vZGVIZWxwZXIoY29udGFpbmVyKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaW5saW5lIGpzIG5vZGUgbG9va2luZyBhdDpcbiIgKyBuaCk7Ci0JCQkvKiBzdGFydCBhIGZ1bmN0aW9uIGhlYWRlci4uIHdpbGwgYW1lbmQgbGF0ZXIgKi8KLQkJCUlUZXh0UmVnaW9uTGlzdCB0ID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIHI7Ci0JCQlJdGVyYXRvciByZWdpb25JdGVyYXRvciA9IHQuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkgJiYgIWlzQ2FuY2VsZWQoKSApIHsKLQkJCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQlpbnQgc3RhcnQgPSByLmdldFN0YXJ0KCk7Ci0JCQkJCWludCBvZmZzZXQgPSByLmdldFRleHRFbmQoKTsKLQkJCQkJU3RyaW5nIHRhZ0F0dHJuYW1lID0gY29udGFpbmVyLmdldFRleHQoKS5zdWJzdHJpbmcoc3RhcnQsIG9mZnNldCkudHJpbSgpOwotCQkJCQkvKgotCQkJCQkgKiBBdHRyaWJ1dGUgdmFsdWVzIGFyZW4ndCBjYXNlIHNlbnNhdGl2ZSwgYWxzbyBtYWtlIHN1cmUgbmV4dAotCQkJCQkgKiByZWdpb24gaXMgYXR0cmliIHZhbHVlCi0JCQkJCSAqLwotCQkJCQlpZiAoTm9kZUhlbHBlci5pc0luQXJyYXkoSnNEYXRhVHlwZXMuSFRNTEFUUkVWRU5UUywgdGFnQXR0cm5hbWUpKSB7Ci0JCQkJCQlpZiAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJcmVnaW9uSXRlcmF0b3IubmV4dCgpOwotCQkJCQkJfQotCQkJCQkJaWYgKHJlZ2lvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJCXIgPSAoKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCkpOwotCQkJCQkJfQotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQlpbnQgdmFsU3RhcnRPZmZzZXQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQocik7Ci0JCQkJCQkJLy8gaW50IHZhbEVuZE9mZnNldCA9IHIuZ2V0VGV4dEVuZCgpOwotCQkJCQkJCVN0cmluZyByYXdUZXh0ID0gY29udGFpbmVyLmdldFRleHQoKS5zdWJzdHJpbmcoci5nZXRTdGFydCgpLCByLmdldFRleHRFbmQoKSk7Ci0JCQkJCQkJaWYgKHJhd1RleHQgPT0gbnVsbCB8fCByYXdUZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQkvKiBTdHJpcCBxdW90ZXMgKi8KLQkJCQkJCQlzd2l0Y2ggKHJhd1RleHQuY2hhckF0KDApKSB7Ci0JCQkJCQkJCWNhc2UgJ1wnJzoKLQkJCQkJCQkJY2FzZSAnIic6Ci0JCQkJCQkJCQlyYXdUZXh0ID0gcmF3VGV4dC5zdWJzdHJpbmcoMSk7Ci0JCQkJCQkJCQl2YWxTdGFydE9mZnNldCsrOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAocmF3VGV4dCA9PSBudWxsIHx8IHJhd1RleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCXN3aXRjaCAocmF3VGV4dC5jaGFyQXQocmF3VGV4dC5sZW5ndGgoKSAtIDEpKSB7Ci0JCQkJCQkJCWNhc2UgJ1wnJzoKLQkJCQkJCQkJY2FzZSAnIic6Ci0JCQkJCQkJCQlyYXdUZXh0ID0gcmF3VGV4dC5zdWJzdHJpbmcoMCwgcmF3VGV4dC5sZW5ndGgoKSAtIDEpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBQb3NpdGlvbiBpblNjcmlwdCA9IG5ldyBQb3NpdGlvbihzY3JpcHRPZmZzZXQsCi0JCQkJCQkJLy8gcmF3VGV4dC5sZW5ndGgoKSk7Ci0JCQkJCQkJLyogUXVvdGVkIHRleHQgc3RhcnRzICsxIGFuZCBlbmRzIC0xIGNoYXIgKi8KLQkJCQkJCQlpZihBRERfU0VNSUNPTE9OX0FUX0lOTElORSkgcmF3VGV4dCA9IHJhd1RleHQgKyAiOyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlQb3NpdGlvbiBpbkh0bWwgPSBuZXcgUG9zaXRpb24odmFsU3RhcnRPZmZzZXQsIHJhd1RleHQubGVuZ3RoKCkpOwotCQkJCQkJCXNjcmlwdExvY2F0aW9uSW5IdG1sLmFkZChpbkh0bWwpOwotCQkJCQkJCS8qIG5lZWQgdG8gcGFkIHRoZSBzY3JpcHQgdGV4dCB3aXRoIHNwYWNlcyAqLwotCQkJCQkJCWNoYXJbXSBzcGFjZXMgPSBVdGlsLmdldFBhZCh2YWxTdGFydE9mZnNldCAtIHNjcmlwdE9mZnNldCk7Ci0JCQkJCQkJZlNjcmlwdFRleHQuYXBwZW5kKHNwYWNlcyk7Ci0JCQkJCQkJZlNjcmlwdFRleHQuYXBwZW5kKHJhd1RleHQpOwotCQkJCQkJCXNjcmlwdE9mZnNldCA9IGZTY3JpcHRUZXh0Lmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI3RyYW5zbGF0ZUpTTm9kZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZUpTTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRhaW5lcikgewotCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uID0gY29udGFpbmVyOwotCQlJdGVyYXRvciByZWdpb25zID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkKLQkJaWYoY29udGFpbmVyPT1udWxsKSByZXR1cm47Ci0JCQotCQljaGFyW10gc3BhY2VzID0gVXRpbC5nZXRQYWQoY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KCkgLSBzY3JpcHRPZmZzZXQpOwotCQlmU2NyaXB0VGV4dC5hcHBlbmQoc3BhY2VzKTsKLQkJc2NyaXB0T2Zmc2V0ID0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCi0JCWlmKGNvbnRhaW5lci5nZXRUeXBlKCkhPURPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCAmJiBjb250YWluZXIuZ2V0VHlwZSgpIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgIWlzQ2FuY2VsZWQoKSkgewotCQkJcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIGNvbnRlbnQgYXNzaXN0IHdhcyBub3Qgc2hvd2luZyB1cCBpbiBKU1AgaW5zaWRlIGEgamF2YXNjcmlwdAotCQkJLy8gcmVnaW9uCi0JCQkKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJSZWdpb24gdGV4dDogIiArIGNvbnRhaW5lci5nZXRUZXh0KCkuc3Vic3RyaW5nKHJlZ2lvbi5nZXRTdGFydCgpLCByZWdpb24uZ2V0RW5kKCkpKTsKLQkJCWJvb2xlYW4gaXNCbG9ja1JlZ2lvbiA9IHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyOwotCQkJLyogbWFrZSBzdXJlIGl0cyBub3QgYSBzdWIgY29udGFpbmVyIHJlZ2lvbiwgcHJvYmFibHkgSlNQICovCi0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgKSB7Ci0JCQkJaW50IHNjcmlwdFN0YXJ0ID0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IHNjcmlwdFRleHRFbmQgPSBjb250YWluZXIuZ2V0RW5kT2Zmc2V0KCkgLSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVGV4dCA9IGNvbnRhaW5lci5nZXRUZXh0KCkuc3Vic3RyaW5nKHJlZ2lvbi5nZXRTdGFydCgpLCByZWdpb24uZ2V0RW5kKCkpOwotCQkJCWludCByZWdpb25MZW5ndGggPSByZWdpb25UZXh0Lmxlbmd0aCgpOwotCQkJCS8vIC9Qb3NpdGlvbiBpblNjcmlwdCA9IG5ldyBQb3NpdGlvbihzY3JpcHRPZmZzZXQsCi0JCQkJLy8gcmVnaW9uTGVuZ3RoKTsKLQkJCQkKLQkJCQkKLQkJCQlzcGFjZXMgPSBVdGlsLmdldFBhZChzY3JpcHRTdGFydCAtIHNjcmlwdE9mZnNldCk7Ci0JCQkJZlNjcmlwdFRleHQuYXBwZW5kKHNwYWNlcyk7IAkKLQkJCQkvLyBmSnNUb0hUTUxSYW5nZXMucHV0KGluU2NyaXB0LCBpbkh0bWwpOwotCQkJCWlmKGlzQmxvY2tSZWdpb24gJiYgUkVQTEFDRV9JTk5FUl9CTE9DS19TRUNUSU9OU19XSVRIX1NQQUNFKSB7Ci0JCQkJCXNwYWNlcyA9IFV0aWwuZ2V0UGFkKHJlZ2lvbkxlbmd0aCk7Ci0JCQkJCWZTY3JpcHRUZXh0LmFwcGVuZChzcGFjZXMpOyAJCi0JCQkJfWVsc2UgaWYoaXNCbG9ja1JlZ2lvbil7Ci0JCQkJCWZTY3JpcHRUZXh0LmFwcGVuZChyZWdpb25UZXh0KTsKLQkJCQl9ZWxzZSB7Ci0JCQkJCWZTY3JpcHRUZXh0LmFwcGVuZChyZWdpb25UZXh0KTsKLQkJCQkJUG9zaXRpb24gaW5IdG1sID0gbmV3IFBvc2l0aW9uKHNjcmlwdFN0YXJ0LCBzY3JpcHRUZXh0RW5kKTsKLQkJCQkJc2NyaXB0TG9jYXRpb25Jbkh0bWwuYWRkKGluSHRtbCk7Ci0JCQkJfQotCQkJCQotCQkJCQotCQkJCXNjcmlwdE9mZnNldCA9IGZTY3JpcHRUZXh0Lmxlbmd0aCgpOwotCQkJfQotCQl9Ci0JCQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZyA9IGNvbnRhaW5lci5nZXROZXh0KCk7Ci0JCQotCQlpZihlbmRUYWc9PW51bGwpIHsKLQkJCW1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCA9IGNvbnRhaW5lci5nZXRTdGFydE9mZnNldCgpOwotCQl9ZWxzZSBpZihlbmRUYWchPW51bGwpIHsKLQkJCU5vZGVIZWxwZXIgbmggPSBuZXcgTm9kZUhlbHBlcihlbmRUYWcpOwotCQkJU3RyaW5nIG5hbWUgPSBuaC5nZXRUYWdOYW1lKCk7Ci0JCQkKLQkJCWlmKG5hbWU9PW51bGwgfHwgIW5hbWUudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoInNjcmlwdCIpIHx8ICFuaC5pc0VuZFRhZygpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQltaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjdHJhbnNsYXRlU2NyaXB0SW1wb3J0Tm9kZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZVNjcmlwdEltcG9ydE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJTm9kZUhlbHBlciBuaCA9IG5ldyBOb2RlSGVscGVyKHJlZ2lvbik7Ci0JCVN0cmluZyBpbXBvcnROYW1lID0gbmguZ2V0QXR0cmlidXRlVmFsdWUoInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbXBvcnROYW1lICE9IG51bGwgJiYgIWltcG9ydE5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyYXdJbXBvcnRzLmFkZChpbXBvcnROYW1lKTsKLQkJCVBvc2l0aW9uIGluSHRtbCA9IG5ldyBQb3NpdGlvbihyZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgcmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQkJCWltcG9ydExvY2F0aW9uc0luSHRtbC5hZGQoaW5IdG1sKTsKLQkJfQotCX0KLQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWNhbmNlbFBhcnNlID0gdHJ1ZTsKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCXJlc2V0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjVkMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvTm9kZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Ob2RlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZTMwMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Ob2RlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIE5vZGVIZWxwZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEVfQ0hBUiA9ICdcIic7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFX0VOVElUWSA9ICImcXVvdDsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URV9DSEFSID0gJ1wnJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVfRU5USVRZID0gIiYjMDM5OyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbkFycmF5KFN0cmluZyBTdHJpbmdBcnJheVtdLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoU3RyaW5nQXJyYXkgPT0gbnVsbCB8fCB0ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IFN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoU3RyaW5nQXJyYXlbaV0uZXF1YWxzSWdub3JlQ2FzZSh0ZXh0LnRyaW0oKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nID09IG51bGwpIHx8IChzdHJpbmcubGVuZ3RoKCkgPCAyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsYXN0SW5kZXggPSBzdHJpbmcubGVuZ3RoKCkgLSAxOwotCQljaGFyIGZpcnN0Q2hhciA9IHN0cmluZy5jaGFyQXQoMCk7Ci0JCWNoYXIgbGFzdENoYXIgPSBzdHJpbmcuY2hhckF0KGxhc3RJbmRleCk7Ci0JCXJldHVybiAoKChmaXJzdENoYXIgPT0gTm9kZUhlbHBlci5TSU5HTEVfUVVPVEVfQ0hBUikgJiYgKGxhc3RDaGFyID09IE5vZGVIZWxwZXIuU0lOR0xFX1FVT1RFX0NIQVIpKSB8fCAoKGZpcnN0Q2hhciA9PSBOb2RlSGVscGVyLkRPVUJMRV9RVU9URV9DSEFSKSAmJiAobGFzdENoYXIgPT0gTm9kZUhlbHBlci5ET1VCTEVfUVVPVEVfQ0hBUikpKTsKLQl9Ci0JcHJvdGVjdGVkIGZpbmFsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uOwotCQotCXB1YmxpYyBOb2RlSGVscGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCXRoaXMucmVnaW9uID0gcmVnaW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhdHRyRXF1YWxzKFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgYXR0VmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGUpOwotCQlpZihhdHRWYWx1ZT09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYXR0VmFsdWUuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgQXR0clRvU3RyaW5nKCkgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIEZvciBkZWJ1Z2luZwotCQlJVGV4dFJlZ2lvbkxpc3QgdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQlTdHJpbmcgU3RydWN0dXJlZFZhbHVlID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJOb2RlSGVscGVyLjAiKSArIGdldFRhZ05hbWUoKSArIE1lc3NhZ2VzLmdldFN0cmluZygiTm9kZUhlbHBlci4xIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaW50IHN0YXJ0ID0gci5nZXRTdGFydCgpOwotCQkJCWludCBvZmZzZXQgPSByLmdldFRleHRFbmQoKTsKLQkJCQlTdHJ1Y3R1cmVkVmFsdWUgKz0gIlx0XHQiICsgcmVnaW9uLmdldFRleHQoKS5zdWJzdHJpbmcoc3RhcnQsIG9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkvKgotCQkJCSAqIFRoZXJlcyBhIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyBhZnRlciB0aGUKLQkJCQkgKiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FIHdlIGhhdmUgdG8gZ2V0IHJpZCBvZgotCQkJCSAqLwotCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJcmVnaW9uSXRlcmF0b3IubmV4dCgpOwotCQkJCX0KLQkJCQlpZiAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCXIgPSAoKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCkpOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuZ2V0U3RyaW5nKCJOb2RlSGVscGVyLjMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQlpbnQgdmFsU3RhcnQgPSByLmdldFN0YXJ0KCk7Ci0JCQkJCWludCB2YWxPZmZzZXQgPSByLmdldFRleHRFbmQoKTsKLQkJCQkJU3RydWN0dXJlZFZhbHVlICs9ICJcdFx0IiArIHN0cmlwRW5kUXVvdGVzKHJlZ2lvbi5nZXRUZXh0KCkuc3Vic3RyaW5nKHZhbFN0YXJ0LCB2YWxPZmZzZXQpKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RydWN0dXJlZFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0F0dHJpYnV0ZShTdHJpbmcgbmFtZVtdKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaW50IHN0YXJ0ID0gci5nZXRTdGFydCgpOwotCQkJCWludCBvZmZzZXQgPSByLmdldFRleHRFbmQoKTsKLQkJCQlTdHJpbmcgdGFnbmFtZSA9IHJlZ2lvbi5nZXRUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0LCBvZmZzZXQpLnRyaW0oKTsKLQkJCQkvKiBBdHRyaWJ1dGUgdmFsdWVzIGFyZW4ndCBjYXNlIHNlbnNhdGl2ZSAqLwotCQkJCWlmIChOb2RlSGVscGVyLmlzSW5BcnJheShuYW1lLCB0YWduYW1lKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb25MaXN0IHQgPSByZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByOwotCQlJdGVyYXRvciByZWdpb25JdGVyYXRvciA9IHQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJlZ2lvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9uSXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWludCBzdGFydCA9IHIuZ2V0U3RhcnQoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gci5nZXRUZXh0RW5kKCk7Ci0JCQkJU3RyaW5nIHRhZ25hbWUgPSByZWdpb24uZ2V0VGV4dCgpLnN1YnN0cmluZyhzdGFydCwgb2Zmc2V0KS50cmltKCk7Ci0JCQkJLyoKLQkJCQkgKiBBdHRyaWJ1dGUgdmFsdWVzIGFyZW4ndCBjYXNlIHNlbnNhdGl2ZSwgYWxzbyBtYWtlIHN1cmUgbmV4dAotCQkJCSAqIHJlZ2lvbiBpcyBhdHRyaWIgdmFsdWUKLQkJCQkgKi8KLQkJCQlpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0JCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCXJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJfQotCQkJCQlpZiAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlyID0gKChJVGV4dFJlZ2lvbikgcmVnaW9uSXRlcmF0b3IubmV4dCgpKTsKLQkJCQkJfQotCQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJaW50IHZhbFN0YXJ0ID0gci5nZXRTdGFydCgpOwotCQkJCQkJaW50IHZhbE9mZnNldCA9IHIuZ2V0VGV4dEVuZCgpOwotCQkJCQkJcmV0dXJuIHN0cmlwRW5kUXVvdGVzKHJlZ2lvbi5nZXRUZXh0KCkuc3Vic3RyaW5nKHZhbFN0YXJ0LCB2YWxPZmZzZXQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50QXNGbGF0U3RyaW5nKCkgewotCQkvKgotCQkgKiBSZXR1cm5zIGEgZnVsbCBzdHJpbmcgb2YgdGhpcyBlbGVtZW50IG1pbnVzIGFuZCAnaWxsZWdhbCcgY2hhcmFjdGVycwotCQkgKiAodXNlZnVsbCBmb3IgaWRlbnRpZnlpbmcgdGhlIEhUTUwgZWxlbWVudCBpbiBhIGdlbmVyaWMgSlMgZnVuY3Rpb24pCi0JCSAqLwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBmdWxsUmVnaW9uVGV4dCA9IHJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQlpZiAoZnVsbFJlZ2lvblRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZ1bGxSZWdpb25UZXh0LnJlcGxhY2VBbGwoIlteYS16QS1aMC05XSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQlpbnQgc3RhcnQgPSByLmdldFN0YXJ0KCk7Ci0JCQkJaW50IG9mZnNldCA9IHIuZ2V0VGV4dEVuZCgpOwotCQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpLnN1YnN0cmluZyhzdGFydCwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCB0ID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gcjsKLQkJSXRlcmF0b3IgcmVnaW9uSXRlcmF0b3IgPSB0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2VsZkNsb3NpbmdUYWcoKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCXJldHVybiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVFcXVhbHMoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHRhZ05hbWU7Ci0JCXJldHVybiAoKHRhZ05hbWUgPSBnZXRUYWdOYW1lKCkpICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBzdHJpcEVuZFF1b3RlcyhTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoTm9kZUhlbHBlci5pc1F1b3RlZCh0ZXh0KSkgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJSVRleHRSZWdpb25MaXN0IHQgPSByZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJdGVyYXRvciByZWdpb25JdGVyYXRvciA9IHQuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIG5vZGVUZXh0ID0gbmV3IFN0cmluZygpOwotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgbm9kZVR5cGUgPSByLmdldFR5cGUoKTsKLQkJCW5vZGVUZXh0ICs9IChNZXNzYWdlcy5nZXRTdHJpbmcoIk5vZGVIZWxwZXIuMTEiKSArIG5vZGVUeXBlICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJOb2RlSGVscGVyLjEyIikgKyByZWdpb24uZ2V0VGV4dCgpLnN1YnN0cmluZyhyLmdldFN0YXJ0KCksIHIuZ2V0VGV4dEVuZCgpKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXJldHVybiBub2RlVGV4dDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyYWVhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRQYWQoaW50IG51bWJlck9mQ2hhcnMpIHsKLQkJaWYobnVtYmVyT2ZDaGFycyA8IDApIHJldHVybiBuZXcgY2hhclswXTsKLQkJZmluYWwgY2hhcltdIHNwYWNlQXJyYXkgPSBuZXcgY2hhcltudW1iZXJPZkNoYXJzXTsKLQkJQXJyYXlzLmZpbGwoc3BhY2VBcnJheSwgJyAnKTsKLQkJcmV0dXJuIHNwYWNlQXJyYXk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbChTdHJpbmcgc291cmNlLCBjaGFyIHJlbW92ZSkgewotCQkKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICIiOwotCQkKLQkJY2hhcltdIG9sZFN0cmluZ0FycmF5ID0gc291cmNlLnRvQ2hhckFycmF5KCk7Ci0JCQotCQlmb3IoaW50IGkgPSAwO2k8b2xkU3RyaW5nQXJyYXkubGVuZ3RoO2krKykgewotCQkJaWYob2xkU3RyaW5nQXJyYXlbaV0hPXJlbW92ZSkgbmV3U3RyaW5nKz1vbGRTdHJpbmdBcnJheVtpXTsKLQkJfQotCQlyZXR1cm4gbmV3U3RyaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvV2ViUm9vdEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9XZWJSb290RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYTc2YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9XZWJSb290RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViUm9vdEZpbmRlciB7Ci0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRTZXJ2ZXJDb250ZXh0Um9vdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBjb250ZXh0Um9vdCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRTZXJ2ZXJDb250ZXh0Um9vdChwcm9qZWN0KTsKLQkJaWYoY29udGV4dFJvb3Q9PW51bGwpIHsKLQkJCWNvbnRleHRSb290ID0gcHJvamVjdC5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKGNvbnRleHRSb290KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb2plY3RSb290KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHByb2plY3QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wLmdldFJvb3RGb2xkZXIoKTsKLQkJCXJldHVybiByb290Rm9sZGVyLmdldFVuZGVybHlpbmdGb2xkZXIoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJDb250ZXh0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNjZGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Ob2RlSGVscGVyLjA9VGFnIG5hbWU6Ci1Ob2RlSGVscGVyLjE9XHRBdHRyaWJ1dGVcdFZhbHVlXG4KLU5vZGVIZWxwZXIuMz1hdHRyaWIgdHlwZQotTm9kZUhlbHBlci4xMT1cdE5vZGUgVHlwZToKLU5vZGVIZWxwZXIuMTI9XCBcdFx0VmFsdWU6CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSW5kZXhXb3Jrc3BhY2VKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1OTI4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5VdGlsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qIChjb3BpZWQgZnJvbSBKU1ApCi0gKiBSZS1pbmRleGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLgotICogRW5zdXJlcyB0aGUgSlNQIEluZGV4IGlzIGluIGEgc3RhYmxlIHN0YXRlIGJlZm9yZSBwZXJmb3JtaW5nIGEgc2VhcmNoLgotICogKGxpa2UgYWZ0ZXIgYSBjcmFzaCBvciBpZiBwcmV2aW91cyBpbmRleGluZyB3YXMgY2FuY2VsZWQpCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleFdvcmtzcGFjZUpvYiBleHRlbmRzIEpvYiB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzaW5kZXhtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAJCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLAotCSAqIGFuZCBhZGRzIHRoZSBmaWxlcyB0byBiZSBpbmRleGVkIGFzIHRoZXkgYXJlIGVuY291bnRlcmVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKU1BGaWxlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JICAgIHByaXZhdGUgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQotCQkvLyBtb25pdG9yIGZyb20gdGhlIEpvYgotCQlJUHJvZ3Jlc3NNb25pdG9yIGZJbm5lck1vbml0b3IgPSBudWxsOwotCQlwdWJsaWMgSlNQRmlsZVZpc2l0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl0aGlzLmZJbm5lck1vbml0b3IgPSBtb25pdG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCi0JCQkvLyBjaGVjayBqb2IgY2FuY2VsZWQKLQkJCWlmICgodGhpcy5mSW5uZXJNb25pdG9yICE9IG51bGwpICYmIHRoaXMuZklubmVyTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQkvLyBjaGVjayBzZWFyY2ggc3VwcG9ydCBjYW5jZWxlZAotCQkJaWYoSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQotCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNTUzCi0JCQkJLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24KLQkJCQkvLyBjaGVjayBuYW1lIGJlZm9yZSBhY3R1YWxseSBnZXR0aW5nIHRoZSBmaWxlIChsZXNzIHdvcmspCi0JCQkJaWYoVXRpbC5pc0pzVHlwZShwcm94eS5nZXROYW1lKCkpKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQlpZihmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkKLQkJCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSW5kZXhXb3Jrc3BhY2VKb2IgYWRkaW5nIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCS8vIHRoaXMgY2FsbCB3aWxsIGNoZWNrIHRoZSBDb250ZW50VHlwZURlc2NyaXB0aW9uLCBzbyBkb24ndCBuZWVkIHRvIGRvIGl0IGhlcmUuCi0JCQkJCQkvL0pTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5hZGRKc3BGaWxlKGZpbGUpOwotCQkJCQkJdGhpcy5maWxlcy5hZGQoZmlsZSk7Ci0JCQkJCQl0aGlzLmZJbm5lck1vbml0b3Iuc3ViVGFzayhwcm94eS5nZXROYW1lKCkpOwotCQkJCQkJCi0JCQkJCQkvLyBkb24ndCBzZWFyY2ggZGVlcGVyIGZvciBmaWxlcwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBmaW5hbCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkgICAgcmV0dXJuIChJRmlsZVtdKXRoaXMuZmlsZXMudG9BcnJheShuZXcgSUZpbGVbdGhpcy5maWxlcy5zaXplKCldKTsKLQkJfQotCX0KLQkKLQkvL3ByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZUpTUCA9IG51bGw7Ci0JCi0JcHVibGljIEluZGV4V29ya3NwYWNlSm9iKCkgewotCQkvLyBwYV9UT0RPIG1heSB3YW50IHRvIHNheSBzb21ldGhpbmcgbGlrZSAiUmVidWlsZGluZyBKU1AgSW5kZXgiIHRvIGJlIG1vcmUKLQkJLy8gZGVzY3JpcHRpdmUgaW5zdGVhZCBvZiAiVXBkYXRpbmcgSlNQIEluZGV4IiBzaW5jZSB0aGV5IGFyZSAyIGRpZmZlcmVudCB0aGluZ3MKLQkJc3VwZXIoSnNDb3JlTWVzc2FnZXMuSlNQSW5kZXhNYW5hZ2VyXzApOwotCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQl9Ci0KLS8vCUlDb250ZW50VHlwZSBnZXRKc3BDb250ZW50VHlwZSgpIHsKLS8vCQlpZih0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotLy8JCQl0aGlzLmZDb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotLy8JCXJldHVybiB0aGlzLmZDb250ZW50VHlwZUpTUDsKLS8vCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZyBlY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5JbnRlcm5hbEpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIAotCSAqIGZvciBzaW1pbGFyIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCWlmKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0KLQkJCi0JCWlmKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBeIEluZGV4V29ya3NwYWNlSm9iIHN0YXJ0ZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCi0JCXRyeSB7Ci0JCSAgICBKU1BGaWxlVmlzaXRvciB2aXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKG1vbml0b3IpOwotCQkgICAgLy8gY29sbGVjdCBhbGwganNwIGZpbGVzCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJLy8gcmVxdWVzdCBpbmRleGluZwotCQkJLy8gdGhpcyBpcyBwcmV0dHkgbXVjaCBsaWtlIGZha2luZyBhbiBlbnRpcmUgd29ya3NwYWNlIHJlc291cmNlIGRlbHRhCi0JCQlKc0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLmluZGV4RmlsZXModmlzaXRvci5nZXRGaWxlcygpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpZihERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXiBJbmRleFdvcmtzcGFjZUpvYiBmaW5pc2hlZFxuICAgdG90YWwgdGltZSBydW5uaW5nOiAiICsgKGZpbmlzaCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0Jdm9pZCBzZXRDYW5jZWxlZFN0YXRlKCkgewotCQlKc0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldEluZGV4U3RhdGUoSnNJbmRleE1hbmFnZXIuU19DQU5DRUxFRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzA4NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuc2VhcmNoLkphdmFTZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIFdyYXBwZXIgbWV0aG9kIHRvIHNldCBnZXRQYXRoKCkgcGF0aCB0byBiZSB0aGUgcGF0aCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCAKLSAqIGZvciB0aGUganNwIGZpbGUuIChzaW5jZSBpdCdzIGEgZmluYWwgbWV0aG9kLCBpdCBuZWVkcyB0byBiZSBzZXQgdmlhIGNvbnN0cnVjdG9yKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgZXh0ZW5kcyBKYXZhU2VhcmNoRG9jdW1lbnQgewotCQotCXByaXZhdGUgSnNTZWFyY2hEb2N1bWVudCBmSlNQU2VhcmNoRG9jID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUoSnNTZWFyY2hEb2N1bWVudCBqc3BTZWFyY2hEb2MpIHsKLQkJCi0JCXN1cGVyKGpzcFNlYXJjaERvYy5nZXRQYXRoKCksIGpzcFNlYXJjaERvYy5nZXRQYXJ0aWNpcGFudCgpKTsKLQkJdGhpcy5mSlNQU2VhcmNoRG9jID0ganNwU2VhcmNoRG9jOwotCX0KLQotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRCeXRlQ29udGVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50cygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0Q2hhckNvbnRlbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0SmF2YVRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRFbmNvZGluZygpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0RmlsZSgpOwotCX0KLQkKLQlwdWJsaWMgSUpzVHJhbnNsYXRpb24gZ2V0SnNwVHJhbnNsYXRpb24oKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JfQotCQotLy8JcHVibGljIGludCBnZXRKc3BPZmZzZXQoaW50IGphdmFPZmZzZXQpIHsKLS8vCQkKLS8vCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpzcE9mZnNldChqYXZhT2Zmc2V0KTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQl0aGlzLmZKU1BTZWFyY2hEb2MucmVsZWFzZSgpOwotCX0KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50IGdldEphdmFFbGVtZW50KCkgewotCQlyZXR1cm4gZ2V0SnNwVHJhbnNsYXRpb24oKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc0luZGV4TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNJbmRleE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiMTE0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc0luZGV4TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzV2ViTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIFJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHRoZSBKU1AgaW5kZXggdXAgdG8gZGF0ZS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzSW5kZXhNYW5hZ2VyIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQkvLyBUT0RPIG1vdmUgdGhpcyB0byBMb2dnZXIsIGFzIHdlIGhhdmUgaW4gU1NFCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzaW5kZXhtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAJCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtFWV9JTkRFWF9TVEFURSA9ICJqc3BJbmRleFN0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbmRleFdvcmtzcGFjZUpvYiBpbmRleGluZ0pvYiA9IG5ldyBJbmRleFdvcmtzcGFjZUpvYigpOwotCi0KLQotCS8vIFRPRE86IGNvbnNpZGVyIGVudW1lcmF0aW9uIGZvciB0aGVzZSBpbnQgY29uc3RhbnRzCi0JLy8gc2V0IHRvIFNfVVBEQVRJTkcgb25jZSBhIHJlc291cmNlIGNoYW5nZSBjb21lcyBpbgotCS8vIHNldCB0byBTX1NUQUJMRSBpZjoKLQkvLyAtIHdlIGtub3cgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhlIHJlc291cmNlIGNoYW5nZQotCS8vIC0gb3IgdGhlIFByb2Nlc3NGaWxlc0pvYiBjb21wbGV0ZXMKLQkvLyBzZXQgdG8gU19DQU5DRUxFRCBpZiBhbiBpbmRleGluZyBqb2IgaXMgY2FuY2VsZWQKLQkvLyBzZXQgdG8gU19SRUJVSUxESU5HIGlmIHJlLWluZGV4aW5nIHRoZSBlbnRpcmUgd29ya3NwYWNlCi0KLQkvLyB0aGUgaW50ICcwJyBpcyByZXNlcnZlZCBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgYSBwcmVmZXJlbmNlIGlzIG5vdAotCS8vIHRoZXJlCi0JLyoqIGluZGV4IGlzIHJlbGlhYmxlIHRvIHVzZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfU1RBQkxFID0gMTsKLQkvKiogaW5kZXggaXMgYmVpbmcgdXBkYXRlZCAoZnJvbSBhIHJlc291cmNlIGRlbHRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfVVBEQVRJTkcgPSAyOwotCS8qKiBlbnRpcmUgaW5kZXggaXMgYmVpbmcgcmVidWlsdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfUkVCVUlMRElORyA9IDM7Ci0JLyoqCi0JICogaW5kZXhpbmcgam9iIHdhcyBjYW5jZWxlZCBpbiB0aGUgbWlkZGxlIG9mIGl0LCBpbmRleCBuZWVkcyB0byBiZQotCSAqIHJlYnVpbHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0NBTkNFTEVEID0gNDsKLQotCS8qKiBzeW1ib2xpYyBuYW1lIGZvciBPU0dJIGZyYW1ld29yayAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb2xsZWN0cyBKU1AgZmlsZXMgZnJvbSBhIHJlc291cmNlIGRlbHRhLgotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy8gdXNpbmcgaGFzaCBtYXAgZW5zdXJlcyBvbmx5IG9uZSBvZiBlYWNoIGZpbGUKLQkJLy8gbXVzdCBiZSByZXNldCBiZWZvcmUgZXZlcnkgdXNlCi0JCXByaXZhdGUgSGFzaE1hcCBqc3BGaWxlcyA9IG51bGw7Ci0KLQkJcHVibGljIEpTUFJlc291cmNlVmlzaXRvcigpIHsKLQkJCXRoaXMuanNwRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJLy8gaW4gY2FzZSBKU1Agc2VhcmNoIHdhcyBjYW5jZWxlZCAoZWcuIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yKQotCQkJaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlpZiAoIWlzSGlkZGVuUmVzb3VyY2UoZGVsdGEuZ2V0RnVsbFBhdGgoKSkpIHsKLQotCQkJCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCQkJYm9vbGVhbiBhZGRlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQURERUQpID09IElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJCQlib29sZWFuIGlzSW50ZXJlc3RpbmdDaGFuZ2UgPSBmYWxzZTsKLQkJCQkJaWYgKChraW5kICYgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCQkJCS8vIGlnbm9yZSB0aGluZ3MgbGlrZSBtYXJrZXIgY2hhbmdlcwotCQkJCQkJaXNJbnRlcmVzdGluZ0NoYW5nZSA9ICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSB8fCAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKTsKLQkJCQkJfQotCQkJCQlib29sZWFuIHJlbW92ZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci0JCQkJCWlmIChhZGRlZCB8fCBpc0ludGVyZXN0aW5nQ2hhbmdlKSB7Ci0KLQkJCQkJCXZpc2l0QWRkZWQoZGVsdGEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlbW92ZWQpIHsKLQkJCQkJCXZpc2l0UmVtb3ZlZChkZWx0YSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCWlmIChERUJVRykgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJEZWx0YSBhbmFseXNpcyBtYXkgbm90IGJlIGNvbXBsZXRlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgZGVsdGEgaGFzIGNoaWxkcmVuLCBjb250aW51ZSB0byBhZGQvcmVtb3ZlIGZpbGVzCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdFJlbW92ZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCS8vIGhhbmRsZSBjbGVhbnVwCi0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmICgoci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgJiYgci5leGlzdHMoKSkgewotCQkJCQlkZWxldGVJbmRleCgoSUZpbGUpIHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdEFkZGVkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJLy8gcXVpY2sgY2hlY2sgaWYgaXQncyBldmVuIEpTUCByZWxhdGVkIHRvIGltcHJvdmUKLQkJCS8vIHBlcmZvcm1hbmNlCi0JCQkvLyBjaGVja2luZyBuYW1lIGZyb20gdGhlIGRlbHRhIGJlZm9yZSBnZXR0aW5nCi0JCQkvLyByZXNvdXJjZSBiZWNhdXNlIGl0J3MgbGlnaHRlcgotCQkJU3RyaW5nIGZpbGVuYW1lID0gZGVsdGEuZ2V0RnVsbFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJaWYgKChmaWxlbmFtZSAhPSBudWxsKSAmJiBVdGlsLmlzSnNUeXBlKGZpbGVuYW1lKSkgewotCQkJCUlSZXNvdXJjZSByID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAoKHIgIT0gbnVsbCkgJiYgci5leGlzdHMoKSAmJiAoci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKSB7Ci0JCQkJCXRoaXMuanNwRmlsZXMucHV0KHIuZ2V0RnVsbFBhdGgoKSwgcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzNDYzCi0JCXByaXZhdGUgYm9vbGVhbiBpc0hpZGRlblJlc291cmNlKElQYXRoIHApIHsKLQkJCVN0cmluZ1tdIHNlZ21lbnRzID0gcC5zZWdtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWdtZW50c1tpXS5zdGFydHNXaXRoKCIuIikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlbGV0ZUluZGV4KElGaWxlIGZvbGRlcikgewotCQkJLy8gY2xlYW51cCBpbmRleAotCQkJSW5kZXhNYW5hZ2VyIGltID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCQlJUGF0aCBmb2xkZXJQYXRoID0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCQlJUGF0aCBpbmRleExvY2F0aW9uID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuY29tcHV0ZUluZGV4TG9jYXRpb24oZm9sZGVyUGF0aCk7Ci0JCQlpbS5yZW1vdmVJbmRleChpbmRleExvY2F0aW9uKTsKLQkJCS8vIGltLmluZGV4TG9jYXRpb25zLnJlbW92ZUtleShmb2xkZXJQYXRoKTsKLQkJCS8vIGltLmluZGV4TG9jYXRpb25zLnJlbW92ZVZhbHVlKGluZGV4TG9jYXRpb24pOwotCQkJRmlsZSBmID0gaW5kZXhMb2NhdGlvbi50b0ZpbGUoKTsKLQkJCWYuZGVsZXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSkgdGhpcy5qc3BGaWxlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBJRmlsZVt0aGlzLmpzcEZpbGVzLnNpemUoKV0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCQl0aGlzLmpzcEZpbGVzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvLyBlbmQgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yCi0KLQkvKioKLQkgKiBzY2hlZHVsZXMgSlNQIGZpbGVzIGZvciBpbmRleGluZyBieSBKYXZhIGNvcmUKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NGaWxlc0pvYiBleHRlbmRzIEpvYiB7Ci0JCUxpc3QgZmlsZUxpc3QgPSBudWxsOwotCQkvLyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGZpbGVzIHdlJ3ZlIGluZGV4ZWQKLQkJaW50IGxhc3RGaWxlQ3Vyc29yID0gMDsKLQotCQlQcm9jZXNzRmlsZXNKb2IoU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlzdXBlcih0YXNrTmFtZSk7Ci0JCQlmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCB2b2lkIHByb2Nlc3MoSUZpbGVbXSBmaWxlcykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWZpbGVMaXN0LmFkZChmaWxlc1tpXSk7Ci0JCQl9Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBxdWV1aW5nICIgKyBmaWxlcy5sZW5ndGggKyAiIGZpbGVzIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJc3luY2hyb25pemVkIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCQlyZXR1cm4gKElGaWxlW10pIGZpbGVMaXN0LnRvQXJyYXkobmV3IElGaWxlW2ZpbGVMaXN0LnNpemUoKV0pOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIHZvaWQgY2xlYXJGaWxlcygpIHsKLQkJCWZpbGVMaXN0LmNsZWFyKCk7Ci0JCQlsYXN0RmlsZUN1cnNvciA9IDA7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY2xlYXJlZCBmaWxlcyIpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpbmRleGVyIG1vbml0b3IiICsgbW9uaXRvcik7Ci0JCQlpZiAoaXNDYW5jZWxlZChtb25pdG9yKSB8fCBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQotCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCQl0cnkgewotCQkJCUlGaWxlW10gZmlsZXNUb0JlUHJvY2Vzc2VkID0gZ2V0RmlsZXMoKTsKLQotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBpbmRleGluZyAiICsgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aCArICIgZmlsZXMiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCS8vIEFQSSBpbmRpY2F0ZXMgdGhhdCBtb25pdG9yIGlzIG5ldmVyIG51bGwKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlKc1NlYXJjaFN1cHBvcnQgc3MgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCQlTdHJpbmcgcHJvY2Vzc2luZ05GaWxlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQotCQkJCWZvciAoO2xhc3RGaWxlQ3Vyc29yIDwgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aDsgbGFzdEZpbGVDdXJzb3IrKykgewotCi0JCQkJCWlmIChpc0NhbmNlbGVkKG1vbml0b3IpIHx8IGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJfQotCQkJCQlJRmlsZSBmaWxlID0gZmlsZXNUb0JlUHJvY2Vzc2VkW2xhc3RGaWxlQ3Vyc29yXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlKYXZhU2NyaXB0UHJvamVjdCBwcm9qZWN0ID0gSmF2YVNjcmlwdENvcmUuY3JlYXRlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQkJc3MuYWRkSnNwRmlsZShmaWxlKTsKLQkJCQkJCQkvLyBKU1AgSW5kZXhlciBwcm9jZXNzaW5nIG4gZmlsZXMKLQkJCQkJCQlwcm9jZXNzaW5nTkZpbGVzID0gTkxTLmJpbmQoSnNDb3JlTWVzc2FnZXMuSlNQSW5kZXhNYW5hZ2VyXzIsIG5ldyBTdHJpbmdbXXtJbnRlZ2VyLnRvU3RyaW5nKChmaWxlc1RvQmVQcm9jZXNzZWQubGVuZ3RoIC0gbGFzdEZpbGVDdXJzb3IpKX0pOwotCQkJCQkJCW1vbml0b3Iuc3ViVGFzayhwcm9jZXNzaW5nTkZpbGVzICsgIiAtICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBKb2IgYWRkZWQgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFJBVExDMDAyODQ3NzYKLQkJCQkJCS8vIElTU1VFOiB3ZSBwcm9iYWJseSBzaG91bGRuJ3QgYmUgY2F0Y2hpbmcgRVZFUlkKLQkJCQkJCS8vIGV4Y2VwdGlvbiwgYnV0Ci0JCQkJCQkvLyB0aGUgZnJhbWV3b3JrIG9ubHkgYWxsb3dzIHRvIHJldHVybiBJU3RhdHVzIGluCi0JCQkJCQkvLyBvcmRlciB0byBjb21tdW5pY2F0ZQotCQkJCQkJLy8gdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZywgd2hpY2ggbWVhbnMgdGhlIGxvb3AKLQkJCQkJCS8vIHdvbid0IGNvbXBsZXRlLCBhbmQgd2Ugd291bGQgaGl0IHRoZSBzYW1lIHByb2JsZW0KLQkJCQkJCS8vIHRoZSBuZXh0IHRpbWUuCi0JCQkJCQkvLyAKLQkJCQkJCS8vIGEgcG9zc2libGUgc29sdXRpb24gaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUKLQkJCQkJCS8vIGV4Y2VwdGlvbnMgbG9nZ2VkCi0JCQkJCQkvLyBhbmQgb25seSBsb2cgYSBjZXJ0YWluIGFtdCBvZiB0aGUgc2FtZSBvbmUsCi0JCQkJCQkvLyBvdGhlcndpc2Ugc2tpcCBpdC4KLQkJCQkJCWlmICghZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKU1BJbmRleGVyIHByb2JsZW0gaW5kZXhpbmc6IiArIGZpbGVuYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgZm9yCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGRpZG4ndCBmb2xsb3cgQVBJIChtb25pdG9yIGlzIG51bGwpCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwgY2xlYXIgZmlsZXMgbGlzdAotCQkJY2xlYXJGaWxlcygpOwotCQkJCi0JCQlsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJbG9uZyBkaWZmID0gZmluaXNoIC0gc3RhcnQ7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlmVG90YWxUaW1lICs9IGRpZmY7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInRoaXMgdGltZTogIiArIGRpZmYgKyAiIGN1bXVsYXRpdmUgdGltZSBmb3IgcmVzb3VyY2UgY2hhbmdlZDogIiArIGZUb3RhbFRpbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIHJ1bk1vbml0b3IpIHsKLQotCQkJYm9vbGVhbiBjYW5jZWxlZCA9IGZhbHNlOwotCQkJLy8gY2hlY2sgc3BlY2lmaWMgbW9uaXRvciBwYXNzZWQgaW50byBydW4gbWV0aG9kICh0aGUgcHJvZ3Jlc3MKLQkJCS8vIGdyb3VwIGluIHRoaXMgY2FzZSkKLQkJCS8vIGNoZWNrIG1haW4gc2VhcmNoIHN1cHBvcnQgY2FuY2VsZWQKLQkJCWlmICgocnVuTW9uaXRvciAhPSBudWxsKSAmJiBydW5Nb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCWNhbmNlbGVkID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJY2FuY2VsZWQgPSB0cnVlOwotCQkJCWlmIChydW5Nb25pdG9yICE9IG51bGwpIHsKLQkJCQkJcnVuTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2FuY2VsZWQ7Ci0JCX0KLQkJCi0JfQotCi0JLy8gZW5kIGNsYXNzIFByb2Nlc3NGaWxlc0pvYgotCi0JcHJpdmF0ZSBzdGF0aWMgSnNJbmRleE1hbmFnZXIgZlNpbmdsZXRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOwotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXppbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBJbmRleEpvYkNvb3JkaW5hdG9yIGluZGV4Sm9iQ29vcmRpbmF0b3I7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBKU1BSZXNvdXJjZVZpc2l0b3IgZlZpc2l0b3IgPSBudWxsOwotCXN0YXRpYyBsb25nIGZUb3RhbFRpbWUgPSAwOwotCi0JLy8gSm9iIGZvciBwcm9jZXNzaW5nIHJlc291cmNlIGRlbHRhCi0JcHJpdmF0ZSBQcm9jZXNzRmlsZXNKb2IgcHJvY2Vzc0ZpbGVzSm9iID0gbnVsbDsKLQotCXByaXZhdGUgSnNJbmRleE1hbmFnZXIoKSB7Ci0JCXByb2Nlc3NGaWxlc0pvYiA9IG5ldyBQcm9jZXNzRmlsZXNKb2IoSnNDb3JlTWVzc2FnZXMuSlNQSW5kZXhNYW5hZ2VyXzApOwotCQkvLyBvbmx5IHNob3cgaW4gdmVyYm9zZSBtb2RlCi0JCXByb2Nlc3NGaWxlc0pvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5zZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIuZG9uZShldmVudCk7Ci0JCQkJc2V0U3RhYmxlU3RhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSnNJbmRleE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLQkJaWYgKGZTaW5nbGV0b24gPT0gbnVsbCkgewotCQkJZlNpbmdsZXRvbiA9IG5ldyBKc0luZGV4TWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBmU2luZ2xldG9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJSnNJbmRleE1hbmFnZXIgc2luZ2xlSW5zdGFuY2UgPSBnZXRJbnN0YW5jZSgpOwotCi0KLQkJaWYgKCFzaW5nbGVJbnN0YW5jZS5pbml0aWFsaXplZCkgewotCQkJc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCQlzaW5nbGVJbnN0YW5jZS5pbmRleEpvYkNvb3JkaW5hdG9yID0gbmV3IEluZGV4Sm9iQ29vcmRpbmF0b3IoKTsKLQkJCXNpbmdsZUluc3RhbmNlLmpzcFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSlNQUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCQkvLyBhZGRlZCBhcyBKb2JDaGFuZ2UgbGlzdGVuZXIgc28gSlNQSW5kZXhNYW5hZ2VyIGNhbiBiZSBzbWFydGVyCi0JCQkvLyBhYm91dCB3aGVuIGl0IHJ1bnMKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihzaW5nbGVJbnN0YW5jZS5pbmRleEpvYkNvb3JkaW5hdG9yKTsKLQotCQkJLy8gYWRkIEpTUEluZGV4TWFuYWdlciB0byBrZWVwIEpTUCBJbmRleCB1cCB0byBkYXRlCi0JCQkvLyBsaXN0ZW5pbmcgZm9yIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgYW5kCi0JCQkvLyBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRQotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoanNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTA5MQotCQkJLy8gbWFrZXMgc3VyZSBJbmRleE1hbmFnZXIgaXMgYXdhcmUgb2Ygb3VyIGluZGV4ZXMKLQkJCXNhdmVJbmRleGVzKCk7Ci0JCQkvL3JlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0JCQlzaW5nbGVJbnN0YW5jZS5pbml0aWFsaXppbmcgPSBmYWxzZTsKLQotCQl9Ci0KLQl9Ci0JCi0Jc3luY2hyb25pemVkIHZvaWQgc2V0SW5kZXhTdGF0ZShpbnQgc3RhdGUpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBzZXR0aW5nIGluZGV4IHN0YXRlIHRvOiAiICsgc3RhdGUyU3RyaW5nKHN0YXRlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlQbHVnaW4ganNwTW9kZWxQbHVnaW4gPSBKc0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlqc3BNb2RlbFBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFBLRVlfSU5ERVhfU1RBVEUsIHN0YXRlKTsKLQkJanNwTW9kZWxQbHVnaW4uc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBzdGF0ZTJTdHJpbmcoaW50IHN0YXRlKSB7Ci0JCVN0cmluZyBzID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJCWNhc2UgKFNfU1RBQkxFKSA6Ci0JCQkJcyA9ICJTX1NUQUJMRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgKFNfVVBEQVRJTkcpIDoKLQkJCQlzID0gIlNfVVBEQVRJTkciOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIChTX0NBTkNFTEVEKSA6Ci0JCQkJcyA9ICJTX0NBTkNFTEVEIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAoU19SRUJVSUxESU5HKSA6Ci0JCQkJcyA9ICJTX1JFQlVJTERJTkciOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JaW50IGdldEluZGV4U3RhdGUoKSB7Ci0JCXJldHVybiBKc0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KFBLRVlfSU5ERVhfU1RBVEUpOwotCX0KLQotCXZvaWQgc2V0VXBkYXRpbmdTdGF0ZSgpIHsKLQkJLy9pZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfQ0FOQ0VMRUQpCi0JCXNldEluZGV4U3RhdGUoU19VUERBVElORyk7Ci0JfQotCi0Jdm9pZCBzZXRDYW5jZWxlZFN0YXRlKCkgewotCQlzZXRJbmRleFN0YXRlKEpzSW5kZXhNYW5hZ2VyLlNfQ0FOQ0VMRUQpOwotCX0KLQotCXZvaWQgc2V0U3RhYmxlU3RhdGUoKSB7Ci0JCS8vaWYgKGdldEluZGV4U3RhdGUoKSAhPSBTX0NBTkNFTEVEKQotCQlzZXRJbmRleFN0YXRlKFNfU1RBQkxFKTsKLQl9Ci0KLQl2b2lkIHNldFJlYnVpbGRpbmdTdGF0ZSgpIHsKLQkJc2V0SW5kZXhTdGF0ZShTX1JFQlVJTERJTkcpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRJbmRleElmTmVlZGVkKCkgewotCQlpZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfU1RBQkxFKSB7Ci0JCQlyZWJ1aWxkSW5kZXgoKTsKLQkJfQotCX0KLQotCXZvaWQgcmVidWlsZEluZGV4KCkgewotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogSlNQIEluZGV4IHVuc3RhYmxlLCByZXF1ZXN0aW5nIHJlLWluZGV4aW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWdldEluZGV4aW5nSm9iKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhYm91dFRvUnVuKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmFib3V0VG9SdW4oZXZlbnQpOwotCQkJCXNldFJlYnVpbGRpbmdTdGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmRvbmUoZXZlbnQpOwotCQkJCXNldFN0YWJsZVN0YXRlKCk7Ci0JCQkJZ2V0SW5kZXhpbmdKb2IoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCS8vIHdlJ3JlIGFib3V0IHRvIHJlaW5kZXggZXZlcnl0aGluZyBhbnl3YXkKLQkJZ2V0UHJvY2Vzc0ZpbGVzSm9iKCkuY2xlYXJGaWxlcygpOwotCQlnZXRJbmRleGluZ0pvYigpLnNjaGVkdWxlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBzY2hlZHVsZXMgYSBKb2IgdG8gcHJvY2VzcyBjb2xsZWN0ZWQgZmlsZXMuIEFsbCBKU1AKLQkgKiBpbmRleGluZyBzaG91bGQgYmUgZG9uZSB0aHJvdWdoIHRoaXMgbWV0aG9kIG9yIHByb2Nlc3NGaWxlcyhJRmlsZSBmaWxlKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlcwotCSAqLwotCWZpbmFsIHZvaWQgaW5kZXhGaWxlcyhJRmlsZVtdIGZpbGVzKSB7Ci0JCS8vIGRvbid0IHVzZSB0aGlzIHJ1bGUKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MzEKLQkJLy8gcHJvY2Vzc0ZpbGVzLnNldFJ1bGUobmV3IEluZGV4RmlsZVJ1bGUoKSk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5wcm9jZXNzKGZpbGVzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFBhY2thZ2UgcHJvdGVjdGVkIGZvciBhY2Nlc3MgYnkgaW5uZXIgSm9iIGNsYXNzIGluIHJlc291cmNlQ2hhbmdlZCguLi4pCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUpTUFJlc291cmNlVmlzaXRvciBnZXRWaXNpdG9yKCkgewotCi0JCWlmICh0aGlzLmZWaXNpdG9yID09IG51bGwpIHsKLQkJCXRoaXMuZlZpc2l0b3IgPSBuZXcgSlNQUmVzb3VyY2VWaXNpdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZlZpc2l0b3I7Ci0JfQotCXZvaWQgc2F2ZUluZGV4ZXMoKSB7Ci0JCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmRleE1hbmFnZXIoKTsKLQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbGxQcm9qZWN0cy5sZW5ndGg7IGorKykgewotCQkJaWYgKCFKc1dlYk5hdHVyZS5oYXNOYXR1cmUoYWxsUHJvamVjdHNbal0pIHx8ICFhbGxQcm9qZWN0c1tqXS5pc09wZW4oKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJSVBhdGgganNwTW9kZWxXb3JraW5nTG9jYXRpb24gPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbihhbGxQcm9qZWN0c1tqXSk7Ci0JCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCQlTdHJpbmdbXSBmaWxlcyA9IGZvbGRlci5saXN0KCk7Ci0JCQlTdHJpbmcgbG9jYXkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2NheSA9IGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBmaWxlc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gcmV1c2UgaW5kZXggZmlsZQotLy8gaW5kZXggPSBuZXcgSW5kZXgobG9jYXksIGFsbFByb2plY3RzW2pdLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpLCB0cnVlKTsKLS8vIC8vJE5PTi1OTFMtMSQKLS8vIGluZGV4LnNhdmUoKTsKLQkJCQkJCWluZGV4TWFuYWdlci5nZXRJbmRleChhbGxQcm9qZWN0c1tqXS5nZXRGdWxsUGF0aCgpLCBuZXcgUGF0aChsb2NheSksIHRydWUsIGZhbHNlKTsKLQkJCQkJCS8vIGluZGV4TWFuYWdlci5zYXZlSW5kZXgoaW5kZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3ZSBzaG91bGQgYmUgc2h1dHRpbmcgZG93biwgd2FudCB0byBzaHV0IGRvd24gcXVpZXRseQotCQkJCWlmIChKc0luZGV4TWFuYWdlci5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTA5MQotCS8vIG1ha2VzIHN1cmUgSW5kZXhNYW5hZ2VyIGlzIGF3YXJlIG9mIG91ciBpbmRleGVzCi0Jdm9pZCBzYXZlSW5kZXhlc09SSUdJTkFMKCkgewotCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCUlQYXRoIGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKTsKLQotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCVN0cmluZ1tdIGZpbGVzID0gZm9sZGVyLmxpc3QoKTsKLQkJU3RyaW5nIGxvY2F5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSW5kZXggaW5kZXggPSBudWxsOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2F5ID0ganNwTW9kZWxXb3JraW5nTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIGZpbGVzW2ldOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJldXNlIGluZGV4IGZpbGUKLQkJCQkJaW5kZXggPSBuZXcgSW5kZXgobG9jYXksICJJbmRleCBmb3IgIiArIGxvY2F5LCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbmRleE1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3ZSBzaG91bGQgYmUgc2h1dHRpbmcgZG93biwgd2FudCB0byBzaHV0IGRvd24gcXVpZXRseQotCQkJaWYgKERFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotLy8JSUNvbnRlbnRUeXBlIGdldEpzcENvbnRlbnRUeXBlKCkgewotLy8JCWlmICh0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotLy8JCQl0aGlzLmZDb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotLy8JCXJldHVybiB0aGlzLmZDb250ZW50VHlwZUpTUDsKLS8vCX0KLQotCS8qKgotCSAqIEEgY2hlY2sgdG8gc2VlIGlmIHRoZSBPU0dJIGZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU3lzdGVtIEJ1bmRsZSBpcyBzdG9wcGVkIChpZS4gdGhlIGZyYW1ld29yayBpcwotCSAqICAgICAgICAgc2h1dHRpbmcgZG93bikKLQkgKi8KLQlib29sZWFuIGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkgewotCQkvLyBpbiB0aGUgRnJhbWV3b3JrIGNsYXNzIHRoZXJlJ3MgYSBub3RlOgotCQkvLyBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTeXN0ZW0gQnVuZGxlIHRvIFNUT1BQSU5HLgotCQkvLyB0aGlzIG11c3QgYmUgZG9uZSBmaXJzdCBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjE5LjIgZnJvbSB0aGUgT1NHaQotCQkvLyBSMyBzcGVjLgotCQlib29sZWFuIHNodXR0aW5nRG93biA9IFBsYXRmb3JtLmdldEJ1bmRsZShPU0dJX0ZSQU1FV09SS19JRCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RPUFBJTkc7Ci0JCWlmIChERUJVRyAmJiBzaHV0dGluZ0Rvd24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyOiBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzaHV0dGluZ0Rvd247Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQotCQkvLyBzdG9wIGxpc3RlbmluZwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCi0JCS8vIHN0b3AgYW55IHNlYXJjaGluZwotCQlKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5zZXRDYW5jZWxlZCh0cnVlKTsKLQotCQkvLyBzdG9wIGxpc3RlbmluZyB0byBqb2JzCi0JCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcihpbmRleEpvYkNvb3JkaW5hdG9yKTsKLQotCi0JCWludCBtYXh3YWl0ID0gNTAwMDsKLQkJaWYgKHByb2Nlc3NGaWxlc0pvYiAhPSBudWxsKSB7Ci0JCQlwcm9jZXNzRmlsZXNKb2IuY2FuY2VsKCk7Ci0JCX0KLQkJLy8gYXR0ZW1wdCB0byBtYWtlIHN1cmUgdGhpcyBpbmRleGluZyBqb2IgaXMgbGl0dGVyYWxseQotCQkvLyBkb25lIGJlZm9yZSBjb250aW51aW5nLCBzaW5jZSB3ZSBhcmUgc2h1dHRpbmcgZG93bgotCQl3YWl0VGlsbE5vdFJ1bm5pbmcobWF4d2FpdCwgcHJvY2Vzc0ZpbGVzSm9iKTsKLQotCQlpZiAoaW5kZXhpbmdKb2IgIT0gbnVsbCkgewotCQkJaW5kZXhpbmdKb2IuY2FuY2VsKCk7Ci0JCX0KLQkJd2FpdFRpbGxOb3RSdW5uaW5nKG1heHdhaXQsIHByb2Nlc3NGaWxlc0pvYik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdhaXRUaWxsTm90UnVubmluZyhpbnQgbWF4U2Vjb25kcywgSm9iIGpvYikgewotCQlpbnQgcGF1c2VUaW1lID0gMTA7Ci0JCWludCBtYXh0cmllcyA9IG1heFNlY29uZHMgLyBwYXVzZVRpbWU7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlICgoY291bnQrKyA8IG1heHRyaWVzKSAmJiAoam9iLmdldFN0YXRlKCkgPT0gSm9iLlJVTk5JTkcpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChwYXVzZVRpbWUpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY291bnQ6ICIgKyBjb3VudCArICIgbWF4OiAiICsKLQkJCQkvLyBtYXh0cmllcyk7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEluZGV4Sm9iQ29vcmRpbmF0b3IgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIHsKLQkJCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9SdW4oSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlKb2Igam9iVG9Db29yZGluYXRlID0gZXZlbnQuZ2V0Sm9iKCk7Ci0JCQlpZiAoaXNKb2JUb0F2b2lkKGpvYlRvQ29vcmRpbmF0ZSkpIHsKLQkJCQkvLyBqb2Igd2lsbCBiZSByZXNjaGVkdWxlZCB3aGVuIHRoZSBqb2Igd2UKLQkJCQkvLyBhcmUgYXZvaWRpbmcgKGVnLiBidWlsZCkgaXMgZG9uZQotCQkJCWdldFByb2Nlc3NGaWxlc0pvYigpLmNhbmNlbCgpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjYW5jZWw6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJSm9iIGpvYlRvQ29vcmRpbmF0ZSA9IGV2ZW50LmdldEpvYigpOwotCQkJaWYgKGlzSm9iVG9Bdm9pZChqb2JUb0Nvb3JkaW5hdGUpKSB7Ci0JCQkJaWYgKGdldFByb2Nlc3NGaWxlc0pvYigpLmdldEZpbGVzKCkubGVuZ3RoID4gMCkgewotCQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGU6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQkJCi0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc0pvYlRvQXZvaWQoSm9iIGpvYlRvQ29vcmRpbmF0ZSkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChqb2JUb0Nvb3JkaW5hdGUuYmVsb25nc1RvKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fUkVGUkVTSCkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpTUFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJaWYgKGlzSW5pdGlhbGl6aW5nKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGlnbm9yZSByZXNvdXJjZSBjaGFuZ2VzIGlmIGFscmVhZHkgcmVidWlsZGluZwotCQkJaWYgKGdldEluZGV4U3RhdGUoKSA9PSBTX1JFQlVJTERJTkcpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBwcmV2aW91c2x5IGNhbmNlbGVkLCBuZWVkcyBlbnRpcmUgaW5kZXggcmVidWlsZAotCQkJaWYgKGdldEluZGV4U3RhdGUoKSA9PSBTX0NBTkNFTEVEKSB7Ci0JCQkJLy8gcmVidWlsZEluZGV4KCk7Ci0JCQkJLy8ganVzdCByZXN1bWUgaW5kZXhpbmcKLQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzY2hlZHVsZTogcmVzb3VyY2UgY2hhbmdlZCwgcHJldmlvdXNseSBjYW5jZWxlZCIpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCQkvLyBvbmx5IGNhcmUgYWJvdXQgYWRkcyBvciBjaGFuZ2VzIHJpZ2h0IG5vdy4uLgotCQkJCWludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotCQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCQlib29sZWFuIGNoYW5nZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0JCQkJaWYgKGFkZGVkIHx8IGNoYW5nZWQpIHsKLQotCQkJCQkvLyBvbmx5IGFuYWx5emUgdGhlIGZ1bGwgKHN0YXJ0aW5nIGF0IHJvb3QpIGRlbHRhCi0JCQkJCS8vIGhpZXJhcmNoeQotCQkJCQlpZiAoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSlNQUmVzb3VyY2VWaXNpdG9yIHYgPSBnZXRWaXNpdG9yKCk7Ci0JCQkJCQkJLy8gY2xlYXIgZnJvbSBsYXN0IHJ1bgotCQkJCQkJCXYucmVzZXQoKTsKLQkJCQkJCQkvLyBjb3VudCBmaWxlcywgcG9zc2libHkgZG8gdGhpcyBpbiBhIGpvYiB0b28uLi4KLQkJCQkJCQkvLyBkb24ndCBpbmNsdWRlIFBIQU5UT00gcmVzb3VyY2VzCi0JCQkJCQkJZGVsdGEuYWNjZXB0KHYsIGZhbHNlKTsKLQotCQkJCQkJCS8vIHByb2Nlc3MgZmlsZXMgZnJvbSB0aGlzIGRlbHRhCi0JCQkJCQkJSUZpbGVbXSBmaWxlcyA9IHYuZ2V0RmlsZXMoKTsKLQkJCQkJCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCQkvKgotCQkJCQkJCQkgKiBKb2IgY2hhbmdlIGxpc3RlbmVyIHNob3VsZCBzZXQgYmFjayB0bwotCQkJCQkJCQkgKiBzdGFibGUgd2hlbiBmaW5pc2hlZAotCQkJCQkJCQkgKi8KLQkJCQkJCQkJc2V0VXBkYXRpbmdTdGF0ZSgpOwotCQkJCQkJCQkvLyBwcm9jZXNzRmlsZXMoZmlsZXMpOwotCQkJCQkJCQlpbmRleEZpbGVzKGZpbGVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gbmVlZCB0byBzZXQgc3RhdGUgaGVyZSBzb21laG93LCBhbmQgcmVpbmRleAotCQkJCQkJCS8vIG90aGVyd2lzZSBpbmRleCB3aWxsIGJlIHVucmVsaWFibGUKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlJbmRleFdvcmtzcGFjZUpvYiBnZXRJbmRleGluZ0pvYigpIHsKLQkJcmV0dXJuIGluZGV4aW5nSm9iOwotCX0KLQotCVByb2Nlc3NGaWxlc0pvYiBnZXRQcm9jZXNzRmlsZXNKb2IoKSB7Ci0JCXJldHVybiBwcm9jZXNzRmlsZXNKb2I7Ci0JfQotCi0JYm9vbGVhbiBpc0luaXRpYWxpemluZygpIHsKLQkJcmV0dXJuIGluaXRpYWxpemluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzUGF0aEluZGV4ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzUGF0aEluZGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyZjI0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1BhdGhJbmRleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLklKYXZhU2NyaXB0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlV0aWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogcGFfVE9ETyBTdGlsbCBuZWVkIHRvIHRha2UgaW50byBjb25zaWRlcmF0aW9uOgotICogCS0gZm9jdXMgaW4gd29ya3NwYWNlCi0gKiAgLSBzZWFyY2ggcGF0dGVybgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNQYXRoSW5kZXhlciB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJCi0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3NlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0JCi0JLy8gdmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlCi0JY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQkvLyBoYXNoIG1hcCBmb3JjZXMgb25seSBvbmUgb2YgZWFjaCBmaWxlCi0JCXByaXZhdGUgSGFzaE1hcCBmUGF0aHMgPSBuZXcgSGFzaE1hcCgpOwotCQlJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0JCVNlYXJjaFBhdHRlcm4gZlBhdHRlcm4gPSBudWxsOwotCi0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuZlBhdHRlcm4gPSBwYXR0ZXJuOwotCQkJdGhpcy5mU2NvcGUgPSBzY29wZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkKLQkJCWlmKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCi0JCQkJLy9JQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJCS8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uCi0JCQkJLy8gY2hlY2sgbmFtZSBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyB0aGUgZmlsZSAobGVzcyB3b3JrKQotCQkJCS8vaWYoY29udGVudFR5cGVKU1AuaXNBc3NvY2lhdGVkV2l0aChwcm94eS5nZXROYW1lKCkpKSB7Ci0JCQkJaWYoVXRpbC5pc0pzVHlwZShwcm94eS5nZXROYW1lKCkpKXsJCi0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCS8vSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlTdHJpbmcgY3RJZCA9IG51bGw7Ci0vLwkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0vLwkJCQkJCWN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotLy8JCQkJCX0KLQkJCQkJLy9pZiAoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUC5lcXVhbHMoY3RJZCkpIHsKLQkJCQkJLy9pZihVdGlsLmlzSnNUeXBlKGZpbGUuZ2V0TmFtZSgpKSl7Ci0JCQkJCQlpZiAodGhpcy5mU2NvcGUuZW5jbG9zZXMocHJveHkucmVxdWVzdEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpIHsKLQkKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgc2VsZWN0ZWQgaW5kZXggcGF0aDoiICsgZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQotCQkJCQkJCWZQYXRocy5wdXQoZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLCBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5jb21wdXRlSW5kZXhMb2NhdGlvbihmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQkJCX0KLQkJCQkJLy99Ci0JCQkJfQotCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGhbXSBnZXRQYXRocygpIHsKLQkJCXJldHVybiAoSVBhdGhbXSkgZlBhdGhzLnZhbHVlcygpLnRvQXJyYXkobmV3IElQYXRoW2ZQYXRocy5zaXplKCldKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJUGF0aFtdIGdldFZpc2libGVKc3BQYXRocyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUpIHsKLQotCQlKU1BGaWxlVmlzaXRvciBqc3BGaWxlVmlzaXRvciA9IG5ldyBKU1BGaWxlVmlzaXRvcihwYXR0ZXJuLCBzY29wZSk7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmFjY2VwdChqc3BGaWxlVmlzaXRvciwgMCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4ganNwRmlsZVZpc2l0b3IuZ2V0UGF0aHMoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhOTg5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogQ3JlYXRlZCB3aXRoIGEgLmpzcCBmaWxlLCBidXQgc2hvdWxkIGFwcGVhciB0byBiZSBhIC5qYXZhIGZpbGUgZm9yIGluZGV4aW5nCi0gKiBhbmQgc2VhcmNoaW5nIHB1cnBvc2VzLiBUaGVyZSBhcmUgcHVycG9zZWx5IGZldyBmaWVsZHMgaW4gdGhpcyBjbGFzcywgYW5kCi0gKiB0aG9zZSBmaWVsZHMgYXJlIGxpZ2h0d2VpZ2h0IHNpbmNlIGl0J3MgcG9zc2libGUgZm9yIG1hbnkgSlNQIHNlYXJjaAotICogZG9jdW1lbnRzIHRvIGV4aXN0IGluIG1lbW9yeSBhdCBvbmUgdGltZSAoZWcuIGFmdGVyIGltcG9ydGluZyBhIHByb2plY3QKLSAqIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgSlNQIGZpbGVzKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNTZWFyY2hEb2N1bWVudCB7Ci0KLQlwcml2YXRlIFN0cmluZyBVTktOT1dOX1BBVEggPSAiKipwYXRoIHVua25vd24qKiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBmSlNQUGF0aFN0cmluZyA9IFVOS05PV05fUEFUSDsKLQlwcml2YXRlIFN0cmluZyBmQ1VQYXRoID0gVU5LTk9XTl9QQVRIOwotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnQgZlBhcnRpY2lwYW50ID0gbnVsbDsKLQlwcml2YXRlIGxvbmcgZkxhc3RNb2RpZmllZFN0YW1wOwotCXByaXZhdGUgY2hhcltdIGZDYWNoZWRDaGFyQ29udGVudHM7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gcGFydGljaXBhbnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSnNTZWFyY2hEb2N1bWVudChTdHJpbmcgZmlsZVBhdGgsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0KLQkJdGhpcy5mSlNQUGF0aFN0cmluZyA9IGZpbGVQYXRoOwotCQl0aGlzLmZQYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50OwotCX0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudCBnZXRQYXJ0aWNpcGFudCgpIHsKLQkJcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldENoYXJDb250ZW50cygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCQotCQlpZigoZkNhY2hlZENoYXJDb250ZW50cyA9PSBudWxsKSB8fCBpc0RpcnR5KCkpIHsKLQkJICAgIElKc1RyYW5zbGF0aW9uIHRyYW5zID0gZ2V0SlNQVHJhbnNsYXRpb24oKTsgICAgCi0JCSAgICBmQ2FjaGVkQ2hhckNvbnRlbnRzID0gdHJhbnMgIT0gbnVsbCA/IHRyYW5zLmdldEpzVGV4dCgpLnRvQ2hhckFycmF5KCkgOiBuZXcgY2hhclswXTsKLQkJICAgIGZDVVBhdGggPSB0cmFucy5nZXRKYXZhUGF0aCgpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGVkQ2hhckNvbnRlbnRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGdldENoYXJDb250ZW50cygpKTsKLQl9Ci0KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdCdzIG5vdCByZWNvbW1lbmRlZCBmb3IgY2xpZW50cyB0byBob2xkIG9uIHRvIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKiBzaW5jZSBpdCdzIGtpbmQgb2YgbGFyZ2UuIElmIHBvc3NpYmxlLCBob2xkIG9uIHRvIHRoZQotCSAqIEpTUFNlYXJjaERvY3VtZW50LCB3aGljaCBpcyBtb3JlIG9mIGEgbGlnaHR3ZWlnaHQgcHJveHkuCi0JICogCi0JICogQHJldHVybiB0aGUgSlNQVHJhbnNsYXRpb24gZm9yIHRoZSBqc3AgZmlsZSwgb3IgbnVsbCBpZiBpdCdzIGFuCi0JICogICAgICAgICB1bnN1cHBvcnRlZCBmaWxlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJSnNUcmFuc2xhdGlvbiBnZXRKU1BUcmFuc2xhdGlvbigpIHsKLQkJSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCQlJRmlsZSBqc3BGaWxlID0gZ2V0RmlsZSgpOwotCQlpZiAoIUpzU2VhcmNoU3VwcG9ydC5pc0pzcChqc3BGaWxlKSkgewotCQkJcmV0dXJuIHRyYW5zbGF0aW9uOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgZXhpc3RpbmcgbW9kZWwgZm9yIHJlYWQsIHRoZW4gZ2V0IGRvY3VtZW50IGZyb20gaXQKLQkJCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlqc3BGaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGpzcEZpbGUpOwotCQkJfQotCQkJLy8gaGFuZGxlIHVuc3VwcG9ydGVkCi0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKW1vZGVsOwotCQkJCXNldHVwQWRhcHRlckZhY3RvcnkoeG1sTW9kZWwpOwotCQkJCUlET01Eb2N1bWVudCBkb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIGRvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQl0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oZmFsc2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwgZSkgewotCQkJLy8gbm8gbmVlZCB0byBsb2cgdGhpcy4gSnVzdCBjb25zaWRlciBpdCBhbiBpbnZhbGlkIGZpbGUgZm9yIG91cgotCQkJLy8gcHVycG9zZXMuCi0JCQkvLyBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0JfQotCi0JLyoqCi0JICogYWRkIHRoZSBmYWN0b3J5IGZvciBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgaGVyZQotCSAqIAotCSAqIEBwYXJhbSBzbQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEFkYXB0ZXJGYWN0b3J5KElTdHJ1Y3R1cmVkTW9kZWwgc20pIHsKLQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LnNldHVwQWRhcHRlckZhY3Rvcnkoc20pOwotCX0KLQotCS8qKgotCSAqIHRoZSBwYXRoIHRvIHRoZSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JICAgIC8vIGNhY2hpbmcgdGhlIHBhdGggc2luY2UgaXQncyBleHBlbnNpdmUgdG8gZ2V0IHRyYW5zbGF0aW9uCi0JCS8vIGltcG9ydGFudCB0aGF0IGlzRGlydHkoKSBjaGVjayBpcyBzZWNvbmQgdG8gY2FjaGUgbW9kaWZpY2F0aW9uIHN0YW1wCi0JICAgIGlmKCh0aGlzLmZDVVBhdGggPT0gbnVsbCkgfHwgaXNEaXJ0eSgpIHx8ICh0aGlzLmZDVVBhdGggPT0gVU5LTk9XTl9QQVRIKSkgewotCSAgICAgICAgSUpzVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotCSAgICAgICAgaWYodHJhbnMgIT0gbnVsbCkgewotCSAgICAgICAgICAgIHRoaXMuZkNVUGF0aCA9IHRyYW5zLmdldEphdmFQYXRoKCk7Ci0JICAgICAgICAgICAgLy8gc2F2ZSBzaW5jZSBpdCdzIGV4cGVuc2l2ZSB0byBjYWxjdWxhdGUgYWdhaW4gbGF0ZXIKLQkgICAgICAgICAgICBmQ2FjaGVkQ2hhckNvbnRlbnRzID0gdHJhbnMuZ2V0SnNUZXh0KCkudG9DaGFyQXJyYXkoKTsKLQkgICAgICAgIH0KLQkgICAgfQotCQlyZXR1cm4gZkNVUGF0aCAhPSBudWxsID8gZkNVUGF0aCA6IFVOS05PV05fUEFUSDsKLQl9Ci0KLS8vCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KSB7Ci0vLwkJLy8gY29waWVkIGZyb20gSlNQVHJhbnNsYXRpb24KLS8vCQlpbnQgcmVzdWx0ID0gLTE7Ci0vLwkJaW50IG9mZnNldEluUmFuZ2UgPSAwOwotLy8JCVBvc2l0aW9uIGpzcFBvcywgamF2YVBvcyA9IG51bGw7Ci0vLwkJSUpzVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotLy8JCWlmICh0cmFucyAhPSBudWxsKSB7Ci0vLwkJCUhhc2hNYXAgamF2YTJqc3BNYXAgPSB0cmFucy5nZXRKYXZhMkpzcE1hcCgpOwotLy8KLS8vCQkJLy8gaXRlcmF0ZSBhbGwgbWFwcGVkIGphdmEgcmFuZ2VzCi0vLwkJCUl0ZXJhdG9yIGl0ID0gamF2YTJqc3BNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLS8vCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotLy8JCQkJamF2YVBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotLy8JCQkJLy8gbmVlZCB0byBjb3VudCB0aGUgbGFzdCBwb3NpdGlvbiBhcyBpbmNsdWRlZAotLy8JCQkJaWYgKCFqYXZhUG9zLmluY2x1ZGVzKGphdmFPZmZzZXQpICYmICEoamF2YVBvcy5vZmZzZXQgKyBqYXZhUG9zLmxlbmd0aCA9PSBqYXZhT2Zmc2V0KSkKLS8vCQkJCQljb250aW51ZTsKLS8vCi0vLwkJCQlvZmZzZXRJblJhbmdlID0gamF2YU9mZnNldCAtIGphdmFQb3Mub2Zmc2V0OwotLy8JCQkJanNwUG9zID0gKFBvc2l0aW9uKSBqYXZhMmpzcE1hcC5nZXQoamF2YVBvcyk7Ci0vLwotLy8JCQkJaWYgKGpzcFBvcyAhPSBudWxsKQotLy8JCQkJCXJlc3VsdCA9IGpzcFBvcy5vZmZzZXQgKyBvZmZzZXRJblJhbmdlOwotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJqc3BQb3NpdGlvbiB3YXMgbnVsbCEiICsgamF2YU9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIGpzcFBhdGggPSBuZXcgUGF0aCh0aGlzLmZKU1BQYXRoU3RyaW5nKTsKLQkJSUZpbGUganNwRmlsZSA9IHJvb3QuZ2V0RmlsZShqc3BQYXRoKTsKLQkJaWYgKCFqc3BGaWxlLmV4aXN0cygpKSB7Ci0JCQkvLyBwb3NzaWJseSBvdXRzaWRlIHdvcmtzcGFjZQotCQkJanNwRmlsZSA9IHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKGpzcFBhdGgpOwotCQl9Ci0JCXJldHVybiBqc3BGaWxlOwotCX0KLQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCUlGaWxlIGYgPSBnZXRGaWxlKCk7Ci0JCWlmKGYgIT0gbnVsbCkgewotCQkJbG9uZyBjdXJyZW50U3RhbXAgPSBmLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQlpZihjdXJyZW50U3RhbXAgIT0gZkxhc3RNb2RpZmllZFN0YW1wKSB7Ci0JCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZkxhc3RNb2RpZmllZFN0YW1wID0gY3VycmVudFN0YW1wOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbyBub3cgc2luY2UgSlNQVHJhbnNsYXRpb24gaXMgY3JlYXRlZCBvbiB0aGUgZmx5Ci0JfQotCi0JLyoqCi0JICogZm9yIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiW0pTUFNlYXJjaERvY3VtZW50OiIgKyB0aGlzLmZKU1BQYXRoU3RyaW5nICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQjZ2V0RW5jb2RpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQjZ2V0Qnl0ZUNvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50cygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YWMzYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLklKYXZhU2NyaXB0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIEludGVncmF0aW9uIG9mIEpTUCB3LyBqYXZhIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBTZWFyY2hQYXJ0aWNpcGFudCB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGNhbGN1bGF0ZVZhbHVlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbGN1bGF0ZVZhbHVlKCkgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gZGVidWcgPSAodmFsdWUgIT0gbnVsbCkgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZWJ1ZzsKLQl9Ci0KLQkvKioKLQkgKiBJbXBvcnRhbnQgdG8gbmV2ZXIgcmV0dXJuIG51bGwgaGVyZSBvciBlbHNlIEphdmEgc2VhcmNoIHBhcnRpY2lwYXRpb24KLQkgKiB3aWxsIGJyZWFrLgotCSAqLwotCXB1YmxpYyBTZWFyY2hEb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKSB7Ci0JCVNlYXJjaERvY3VtZW50IHNEb2MgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRTZWFyY2hEb2N1bWVudChkb2N1bWVudFBhdGgpOwotCi0JCWlmIChzRG9jID09IG51bGwpIHsKLQkJCS8vIHJldHVybiBhIGR1bW15IGRvYyBoZXJlIHNvIHNlYXJjaCBwYXJ0aWNpcGF0aW9uIGRvZXNuJ3QgYnJlYWsKLQkJCXJldHVybiBuZXcgTnVsbFNlYXJjaERvY3VtZW50KGRvY3VtZW50UGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHNEb2M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJFbWJlZGVkIEphdmFTY3JpcHQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElQYXRoW10gc2VsZWN0SW5kZXhlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJSnNQYXRoSW5kZXhlciBpbmRleGVyID0gbmV3IEpzUGF0aEluZGV4ZXIoKTsKLQkJcmV0dXJuIGluZGV4ZXIuZ2V0VmlzaWJsZUpzcFBhdGhzKHBhdHRlcm4sIHNjb3BlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbmRleERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBJUGF0aCBpbmRleFBhdGgpIHsKLQkJaWYgKCEoZG9jdW1lbnQgaW5zdGFuY2VvZiBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHVzZSBKYXZhIHNlYXJjaCBpbmRleGluZwotCQlTZWFyY2hFbmdpbmUuZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCkuaW5kZXhEb2N1bWVudChkb2N1bWVudCwgaW5kZXhQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaERvY3VtZW50W10gaW5kZXhNYXRjaGVzLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmICgobW9uaXRvciAhPSBudWxsKSAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmlsdGVyIG91dCBudWxsIG1hdGNoZXMKLQkJTGlzdCBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU2VhcmNoRG9jdW1lbnQgbWF0Y2ggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4TWF0Y2hlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBwb3NzaWJsZSBtYXRjaGluZyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTogIiArIGluZGV4TWF0Y2hlc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW1hdGNoID0gaW5kZXhNYXRjaGVzW2ldOwotCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKLQkJCQkvLyBzb21lIG1hdGNoZXMgbWF5IGJlIG51bGwsIG9yIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgZGF0ZSwKLQkJCQkvLyB0aGUgZmlsZSBtYXkgbm90IGV2ZW4gZXhpc3QKLQkJCQlpZiAoKG1hdGNoIGluc3RhbmNlb2YgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpICYmICgoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpIG1hdGNoKS5nZXRGaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJZmlsdGVyZWQuYWRkKG1hdGNoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpbmRleE1hdGNoZXMgPSAoU2VhcmNoRG9jdW1lbnRbXSkgZmlsdGVyZWQudG9BcnJheShuZXcgU2VhcmNoRG9jdW1lbnRbZmlsdGVyZWQuc2l6ZSgpXSk7Ci0JCVNlYXJjaEVuZ2luZS5nZXREZWZhdWx0U2VhcmNoUGFydGljaXBhbnQoKS5sb2NhdGVNYXRjaGVzKGluZGV4TWF0Y2hlcywgcGF0dGVybiwgc2NvcGUsIHJlcXVlc3RvciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQjZ2V0RG9jdW1lbnQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIFNlYXJjaERvY3VtZW50IGdldERvY3VtZW50KElGaWxlIGZpbGUpIHsKLQkJLy8gbmV2ZXIgZ2V0cyBjYWxsZWQ/Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoU2NvcGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1ZTdmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLklKYXZhU2NyaXB0U2VhcmNoU2NvcGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIFVzZWQgdG8gY29uc3RyYWluIEpTUC9qYXZhIHNlYXJjaCB0byBjZXJ0YWluIHBhdGhzIGFuZCBlbGVtZW50cy4KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc1NlYXJjaFNjb3BlIGltcGxlbWVudHMgSUphdmFTY3JpcHRTZWFyY2hTY29wZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkVuY2xvc2VzQWxsID0gZmFsc2U7Ci0JcHJpdmF0ZSBMaXN0IGZSZXNvdXJjZVBhdGhzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkphdmFFbGVtZW50cyA9IG51bGw7Ci0KLQlwdWJsaWMgSnNTZWFyY2hTY29wZSgpIHsKLQkJLy8gZW1wdHkgY29uc3RydWN0b3IganVzdCByZXR1cm5zIHRydWUgZm9yIGV2ZXJ5dGhpbmcKLQkJLy8gZXZlcnl0aGluZyBpcyBpbiBzY29wZQotCQl0aGlzLmZFbmNsb3Nlc0FsbCA9IHRydWU7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgSnNTZWFyY2hTY29wZShTdHJpbmdbXSByZXNvdXJjZVN0cmluZ1BhdGgpIHsKLQkJaW5pdCgpOwotCQlmUmVzb3VyY2VQYXRocy5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZXNvdXJjZVN0cmluZ1BhdGgpKTsKLQl9Ci0KLQlwdWJsaWMgSnNTZWFyY2hTY29wZShJSmF2YVNjcmlwdEVsZW1lbnRbXSBqYXZhRWxlbWVudCkgewotCQlpbml0KCk7Ci0JCWZKYXZhRWxlbWVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoamF2YUVsZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJdGhpcy5mUmVzb3VyY2VQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGhpcy5mSmF2YUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKFN0cmluZyByZXNvdXJjZVBhdGhTdHJpbmcpIHsKLQotCQlpZiAodGhpcy5mRW5jbG9zZXNBbGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVuY2xvc2VzUGF0aChyZXNvdXJjZVBhdGhTdHJpbmcpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCkgewotCi0JCS8vIHBhX1RPRCBpbXBsZW1lbnQKLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKElSZXNvdXJjZVByb3h5IGVsZW1lbnQpIHsKLQotCQlpZiAodGhpcy5mRW5jbG9zZXNBbGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVuY2xvc2VzUGF0aChlbGVtZW50LnJlcXVlc3RGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewotCQl0aGlzLmZSZXNvdXJjZVBhdGhzLmFkZChwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50KElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZkphdmFFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVuY2xvc2VzUGF0aChTdHJpbmcgcG9zc2libGUpIHsKLQotCQlTdHJpbmdbXSBwYXRocyA9IChTdHJpbmdbXSkgZlJlc291cmNlUGF0aHMudG9BcnJheShuZXcgU3RyaW5nW2ZSZXNvdXJjZVBhdGhzLnNpemUoKV0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocG9zc2libGUuZXF1YWxzKHBhdGhzW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCi0JCXJldHVybiAiSmF2YVNjcmlwdCBTZWFyY2ggU2NvcGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCkgewotCQlyZXR1cm4gKElQYXRoW10pIGZSZXNvdXJjZVBhdGhzLnRvQXJyYXkobmV3IElQYXRoW2ZSZXNvdXJjZVBhdGhzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEV4Y2x1ZGUoU3RyaW5nIGNvbnRhaW5lciwgU3RyaW5nIHJlc291cmNlTmFtZSkgewotCQkvKiBhdXRvIGdlbiAqLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1MTIxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5JSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5JSmF2YVNjcmlwdFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc05hbWVNYW5nbGVyVXRpbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogQ2VudHJhbCBhY2Nlc3MgdG8gamF2YSBpbmRleGluZyBhbmQgc2VhcmNoLiBBbGwgY29udGFjdCBiZXR3ZWVuIEpEVCBpbmRleGluZwotICogYW5kIFNlYXJjaGluZyBzaG91bGQgYmUgZG9uZSB0aHJvdWdoIGhlcmUuCi0gKiAKLSAqIENsaWVudHMgc2hvdWxkIGFjY2VzcyB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIHZpYSB0aGUgc2luZ2xlIGluc3RhbmNlIHZpYQotICogPGNvZGU+Z2V0SW5zdGFuY2UoKTwvY29kZT4uCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc1NlYXJjaFN1cHBvcnQgewotCi0gICAgLy8gZm9yIGRlYnVnZ2luZwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotICAgIHN0YXRpYyB7Ci0gICAgCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3NlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSnNTZWFyY2hTdXBwb3J0IHNpbmdsZXRvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEpzU2VhcmNoUGFydGljaXBhbnQgZlBhcnRpY2lwYW50ID0gbnVsbDsKLQotICAgIHByaXZhdGUgSVBhdGggZkpzcFBsdWdpbkxvY2F0aW9uID0gbnVsbDsKLQotICAgIC8vIHBhX1RPRE8gbWF5IGJlIHNsb3cgKGVzcCBmb3IgaW5kZXhpbmcgZW50aXJlIHdvcmtzcGFjZSkKLSAgICBwcml2YXRlIGZpbmFsIENSQzMyIGZDaGVja3N1bUNhbGN1bGF0b3IgPSBuZXcgQ1JDMzIoKTsKLQotICAgIC8qKiBtYWluIGNhbmNlbCBtb250aW9yIGZvciBhbGwgc2VhcmNoIHN1cHBvcnQgKi8KLSAgICBwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgZk1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgcHJpdmF0ZSBKc1NlYXJjaFN1cHBvcnQoKSB7Ci0gICAgICAgIC8vIGZvcmNlIHVzZSBvZiBzaW5nbGUgaW5zdGFuY2UKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wZXJhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGxpdmUgcmVzb3VyY2UncyBzZWFyY2ggbWFya2VycyBzaG93IHVwIGluCi0gICAgICogdGhlIG9wZW4gZWRpdG9yLiBJdCBhbHNvIGFsbG93cyB0aGUgYWJpbGl0eSB0byBwYXNzIGluIGEgUHJvZ3Jlc3NNb25pdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTZWFyY2hKb2IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cyB7Ci0KLSAgICAgICAgU3RyaW5nIGZTZWFyY2hUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGZTZWFyY2hGb3IgPSBGSUVMRDsKLQotICAgICAgICBpbnQgZkxpbWl0VG8gPSBBTExfT0NDVVJSRU5DRVM7Ci0KLSAgICAgICAgaW50IGZNYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDsKLQotICAgICAgICBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotICAgICAgICBTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvciA9IG51bGw7Ci0KLSAgICAgICAgSUphdmFTY3JpcHRFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBqYXZhIGVsZW1lbnQKLSAgICAgICAgcHVibGljIFNlYXJjaEpvYihJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgICAgICBzdXBlcihKc0NvcmVNZXNzYWdlcy5KU1BfU2VhcmNoICsgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgIHRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIHNlYXJjaCB0ZXh0Ci0gICAgICAgIHB1YmxpYyBTZWFyY2hKb2IoU3RyaW5nIHNlYXJjaFRleHQsIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUsIGludCBzZWFyY2hGb3IsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgICAgICBzdXBlcihKc0NvcmVNZXNzYWdlcy5KU1BfU2VhcmNoICsgc2VhcmNoVGV4dCk7Ci0gICAgICAgICAgICB0aGlzLmZTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDsKLSAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0gICAgICAgICAgICB0aGlzLmZTZWFyY2hGb3IgPSBzZWFyY2hGb3I7Ci0gICAgICAgICAgICB0aGlzLmZMaW1pdFRvID0gbGltaXRUbzsKLSAgICAgICAgICAgIHRoaXMuZk1hdGNoTW9kZSA9IG1hdGNoTW9kZTsKLSAgICAgICAgICAgIHRoaXMuZklzQ2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTsKLSAgICAgICAgICAgIHRoaXMuZlJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGpvYk1vbml0b3IpIHsKLQotICAgICAgICAgICAgaWYgKChqb2JNb25pdG9yICE9IG51bGwpICYmIGpvYk1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotICAgICAgICAgICAgaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQotICAgICAgICAgICAgU2VhcmNoUGF0dGVybiBqYXZhU2VhcmNoUGF0dGVybiA9IG51bGw7Ci0gICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgICAgICAvLyAoZWcuIExvY2FsVmFyaWFibGUpCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSB0ZXh0IGFuZCBvdGhlciBwYXJhbXRlcnMKLSAgICAgICAgICAgIGlmICh0aGlzLmZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlqYXZhU2VhcmNoUGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybih0aGlzLmZFbGVtZW50LCB0aGlzLmZMaW1pdFRvKTsKLQkJCX0gZWxzZSB7Ci0JCQkJamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mU2VhcmNoVGV4dCwgdGhpcy5mU2VhcmNoRm9yLCB0aGlzLmZMaW1pdFRvLCB0aGlzLmZNYXRjaE1vZGUpOwotCQkJfQotCi0gICAgICAgICAgICBpZiAoamF2YVNlYXJjaFBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpzU2VhcmNoUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSB7IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgfTsKLSAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUgZW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqb2JNb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCWpvYk1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlYXJjaChqYXZhU2VhcmNoUGF0dGVybiwgcGFydGljaXBhbnRzLCB0aGlzLmZTY29wZSwgdGhpcy5mUmVxdWVzdG9yLCBqb2JNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG5vbi1Db3JlRXhjZXB0aW9ucyB3aWxsIHBlcm1hbmVudGx5IHN0YWxsIHRoZSBXb3JrZXIgdGhyZWFkCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqb2JNb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCWpvYk1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBlbmQgU2VhcmNoSm9iCi0gICAgLyoqCi0gICAgICogUnVubmFibGUgZm9yY2VzIGNhbGxlciB0byB3YWl0IHVudGlsIGZpbmlzaGVkIChhcyBvcHBvc2VkIHRvIHVzaW5nIGEgSm9iKQotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU2VhcmNoUnVubmFibGUgaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUsIElKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzIHsKLQotICAgICAgICBTdHJpbmcgZlNlYXJjaFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgZlNjb3BlID0gbnVsbDsKLQotICAgICAgICBpbnQgZlNlYXJjaEZvciA9IEZJRUxEOwotCi0gICAgICAgIGludCBmTGltaXRUbyA9IEFMTF9PQ0NVUlJFTkNFUzsKLQotICAgICAgICBpbnQgZk1hdGNoTW9kZSA9IFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIOwotCi0gICAgICAgIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCi0gICAgICAgIFNlYXJjaFJlcXVlc3RvciBmUmVxdWVzdG9yID0gbnVsbDsKLQotICAgICAgICBJSmF2YVNjcmlwdEVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIGphdmEgZWxlbWVudAotICAgICAgICBwdWJsaWMgU2VhcmNoUnVubmFibGUoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQsIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3Igdy8gc2VhcmNoIHRleHQKLSAgICAgICAgcHVibGljIFNlYXJjaFJ1bm5hYmxlKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mU2VhcmNoVGV4dCA9IHNlYXJjaFRleHQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mU2VhcmNoRm9yID0gc2VhcmNoRm9yOwotICAgICAgICAgICAgdGhpcy5mTGltaXRUbyA9IGxpbWl0VG87Ci0gICAgICAgICAgICB0aGlzLmZNYXRjaE1vZGUgPSBtYXRjaE1vZGU7Ci0gICAgICAgICAgICB0aGlzLmZJc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmICgobW9uaXRvciAhPSBudWxsKSAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLSAgICAgICAgICAgIGlmIChKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLSAgICAgICAgICAgIFNlYXJjaFBhdHRlcm4gamF2YVNlYXJjaFBhdHRlcm4gPSBudWxsOwotICAgICAgICAgICAgLy8gaWYgYW4gZWxlbWVudCBpcyBhdmFpbGFibGUsIHVzZSB0aGF0IHRvIGNyZWF0ZSBzZWFyY2ggcGF0dGVybgotICAgICAgICAgICAgLy8gKGVnLiBMb2NhbFZhcmlhYmxlKQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgdGV4dCBhbmQgb3RoZXIgcGFyYW10ZXJzCi0gICAgICAgICAgICBpZiAodGhpcy5mRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgZkxpbWl0VG8pOwotCQkJfSBlbHNlIHsKLQkJCQlqYXZhU2VhcmNoUGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybihmU2VhcmNoVGV4dCwgZlNlYXJjaEZvciwgZkxpbWl0VG8sIGZNYXRjaE1vZGUpOwotCQkJfQotCi0gICAgICAgICAgICBpZiAoamF2YVNlYXJjaFBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpzU2VhcmNoUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSB7IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgfTsKLSAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUgZW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAwKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIGVuZ2luZS5zZWFyY2goamF2YVNlYXJjaFBhdHRlcm4sIHBhcnRpY2lwYW50cywgZlNjb3BlLCBmUmVxdWVzdG9yLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBub24tQ29yZUV4Y2VwdGlvbnMgd2lsbCBwZXJtYW5lbnRseSBzdGFsbCB0aGUgV29ya2VyIHRocmVhZAotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZW5kIFNlYXJjaFJ1bm5hYmxlCi0KLSAgICAvKioKLSAgICAgKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZQotICAgICAqIHZpYSBnZXRJbnN0YW5jZSgpCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpzU2VhcmNoU3VwcG9ydCBnZXRJbnN0YW5jZSgpIHsKLQotICAgICAgICBpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCXNpbmdsZXRvbiA9IG5ldyBKc1NlYXJjaFN1cHBvcnQoKTsKLQkJfQotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGNoZWNrIGlmIGEgZmlsZSBpcyBhIGpzcCBmaWxlIChzaW5jZSB0aGlzIGlzIGRvbmUKLSAgICAgKiBmcmVxdWVudGx5KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pzcChJRmlsZSBmaWxlKSB7Ci0gICAgCXJldHVybiBVdGlsLmlzSnNUeXBlKGZpbGUuZ2V0TmFtZSgpKTsKLSAgICAJLy8gKHBhKSAyMDA1MTAyNSByZW1vdmluZyBkZWVwIGNvbnRlbnQgdHlwZSBjaGVjawotICAgIAkvLyBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcmVxdWVudGx5Ci0gICAgCS8vIGFuZCBJTyBpcyBleHBlbnNpdmUKLS8vICAgICAgICBib29sZWFuIGlzSnNwID0gZmFsc2U7Ci0vLwotLy8gICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotLy8gICAgICAgIAkKLS8vICAgICAgICAgICAgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0vLyAgICAgICAgICAgIC8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uLCBpdCdzIGxlc3MgZXhwZW5zaXZlCi0vLyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZUpTUC5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotLy8gICAgICAgICAgICAJaXNKc3AgPSB0cnVlOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgICByZXR1cm4gaXNKc3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2NoZWR1bGVzIGEgc2VhcmNoIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGlzIEpTUCBmaWxlIGZvciBpbmRleGluZyAoYnkKLSAgICAgKiB0aGUgamF2YSBpbmRleGVyKQotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgSlNQIGZpbGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW5kZXhpbmcgd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTZWFyY2hEb2N1bWVudCBhZGRKc3BGaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCAhZmlsZS5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIEpTUCBmaWxlOiIgKyBmaWxlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotICAgICAgICAvLyBjcmVhdGUKLSAgICAgICAgU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChmaWxlKTsKLSAgICAgICAgLy8gbnVsbCBpZiBub3QgYSBqc3AgZmlsZQotICAgICAgICBpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpLnNjaGVkdWxlRG9jdW1lbnRJbmRleGluZyhkZWxlZ2F0ZSwgY29tcHV0ZUluZGV4TG9jYXRpb24oZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGZhaWx1cmUgaGVyZSBkb2Vzbid0IGtlZXAgb3RoZXIgZG9jdW1lbnRzIGZyb20KLSAgICAgICAgICAgICAgICAvLyBiZWluZyBpbmRleGVkCi0gICAgICAgICAgICAgICAgLy8gaWYgcGVmb3JtZWQgaW4gYSBiYXRjaCBjYWxsIChsaWtlIEpTUEluZGV4TWFuYWdlcikKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGVkIiArIGRlbGVnYXRlICsgImZvciBpbmRleGluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSBhIGphdmEgc2VhcmNoIHcvIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluIGEgYmFja2dyb3VuZCBKb2IKLSAgICAgKiAocmVzdWx0cyBtYXkgc3RpbGwgY29tZSBpbiBhZnRlciB0aGlzIG1ldGhvZCBjYWxsKQotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hUZXh0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIG9mIHRleHQgdG8gc2VhcmNoIG9uCi0gICAgICogQHBhcmFtIHNlYXJjaEZvcgotICAgICAqICAgICAgICAgICAgSUphdmFTY3JpcHRTZWFyY2hDb25zdGFudHMuVFlQRSwgTUVUSE9ELCBGSUVMRCwgUEFDS0FHRSwgZXRjLi4uCi0gICAgICogQHBhcmFtIGxpbWl0VG8KLSAgICAgKiAgICAgICAgICAgIElKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUywKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMsCi0gICAgICogICAgICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlMsIG9yCi0gICAgICogICAgICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cy5BTExfT0NDVVJSRU5DRVMKLSAgICAgKiBAcGFyYW0gbWF0Y2hNb2RlCi0gICAgICogICAgICAgICAgICBhbGxvdyAqIHdpbGRjYXJkcyBvciBub3QKLSAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlCi0gICAgICogQHBhcmFtIHJlcXVlc3RvcgotICAgICAqICAgICAgICAgICAgcGFzc2VkIGluIHRvIGFjY2VwdCBzZWFyY2ggbWF0Y2hlcyAoYW5kIGRvICJzb21ldGhpbmciIHdpdGgKLSAgICAgKiAgICAgICAgICAgIHRoZW0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICBKc0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoSm9iIGpvYiA9IG5ldyBTZWFyY2hKb2Ioc2VhcmNoVGV4dCwgc2NvcGUsIHNlYXJjaEZvciwgbGltaXRUbywgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgam9iLnNldFVzZXIodHJ1ZSk7Ci0gICAgICAgIC8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDMyCi0gICAgICAgIC8vIHBvcHMgdXAgdXNlciBvcGVyYXRpb24gYmxvY2tlZCBkaWFsb2cgaWYgeW91IHBlcmZvcm0gYSBsb25nIHNlYXJjaCwKLSAgICAgICAgLy8gdGhlbiBvcGVuIGEgZmlsZSBiZWNhdXNlIGl0IGxvY2tzIHRoZSB3b3Jrc3BhY2UKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YVNjcmlwdEVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYSBiYWNrZ3JvdW5kIEpvYiAocmVzdWx0cyBtYXkgc3RpbGwgY29tZSBpbiBhZnRlciB0aGlzIG1ldGhvZCBjYWxsKQotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHNjb3BlCi0gICAgICogQHBhcmFtIHJlcXVlc3RvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihlbGVtZW50LCBzY29wZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YVNjcmlwdEVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYW4gSVdvcmtzcGFjZSBydW5uYWJsZSAocmVzdWx0cyB3aWxsIGJlIHJlcG9ydGVkIGJ5IHRoZSBlbmQgb2YgdGhpcwotICAgICAqIG1ldGhvZCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEBwYXJhbSBzY29wZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hSdW5uYWJsZShJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hSdW5uYWJsZSBzZWFyY2hSdW5uYWJsZSA9IG5ldyBTZWFyY2hSdW5uYWJsZShlbGVtZW50LCBzY29wZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oc2VhcmNoUnVubmFibGUsIEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGpzcEZpbGUKLSAgICAgKiBAcmV0dXJuIFNlYXJjaERvY3VtZW50IGlmIHRoZSBmaWxlIGlzIG5vdCBudWxsLCBleGlzdHMsIGFuZCBpcyBhIEpTUAotICAgICAqICAgICAgICAgZmlsZSwgb3RoZXJ3aXNlIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChJRmlsZSBqc3BGaWxlKSB7Ci0KLSAgICAgICAgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgZGVsZWdhdGUgPSBudWxsOwotICAgICAgICBpZiAoKGpzcEZpbGUgIT0gbnVsbCkgJiYganNwRmlsZS5leGlzdHMoKSAmJiBpc0pzcChqc3BGaWxlKSkgewotCi0gICAgICAgICAgICBkZWxlZ2F0ZSA9IG5ldyBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShuZXcgSnNTZWFyY2hEb2N1bWVudChqc3BGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENlbnRyYWxpemVkIHBsYWNlIHRvIGFjY2VzcyBKU1BTZWFyY2hEb2N1bWVudHMgKHVzZWQgYnkKLSAgICAgKiBKU1BTZWFyY2hQYXJ0aWNpcGFudCBhbmQgSlNQU2VhcmNoUmVxdWVzdG9yKQotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hEb2NQYXRoCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEByZXR1cm4gdGhlIEpTUFNlYXJjaERvY3VtZW50IG9yIG51bGwgaWYgb25lIGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTZWFyY2hEb2N1bWVudCBnZXRTZWFyY2hEb2N1bWVudChTdHJpbmcgc2VhcmNoRG9jUGF0aCkgewotICAgICAgICAgCi0gICAgICAgIFNlYXJjaERvY3VtZW50IGRlbGVnYXRlID0gbnVsbDsKLSAgICAgICAgSUZpbGUgZiA9IGZpbGVGb3JDVVBhdGgoc2VhcmNoRG9jUGF0aCk7Ci0gICAgICAgIGlmIChmICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRlbGVnYXRlID0gY3JlYXRlU2VhcmNoRG9jdW1lbnQoZik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBoYW5kbGUgZmFpbHVyZSBjYXNlLi4uIChmaWxlIGRlbGV0ZWQgbWF5YmU/KQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbm1hbmdsZXMgdGhlIHNlYXJjaERvY1BhdGggYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgSlNQIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlYXJjaERvY1BhdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIElGaWxlIGZpbGVGb3JDVVBhdGgoU3RyaW5nIHNlYXJjaERvY1BhdGgpIHsKLSAgICAKLSAgICAgICAgU3RyaW5nW10gc3BsaXQgPSBzZWFyY2hEb2NQYXRoLnNwbGl0KCIvIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IHNwbGl0W3NwbGl0Lmxlbmd0aCAtIDFdOwotCi0gICAgICAgIC8vIGlnbm9yZSBhbnl0aGluZyBidXQgLmphdmEgbWF0Y2hlcyAobGlrZSAuY2xhc3MgYmluYXJ5IG1hdGNoZXMpCi0gICAgICAgIGlmKCFzZWFyY2hEb2NQYXRoLmVuZHNXaXRoKCIuanMiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IEpzTmFtZU1hbmdsZXJVdGlsLnVubWFuZ2xlKGNsYXNzbmFtZSk7Ci0gICAgICAgCi0gICAgICAgIC8vIHRyeSBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIElGaWxlIGYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlUGF0aCkpOwotICAgICAgICAvLyB3b3Jrc3BhY2UgcmVsYXRpdmUgdGhlbgotICAgICAgICBpZihmID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjAwOQotICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgcHJvamVjdCBuYW1lIGFzIHdlbGwKLSAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIG1lYW4gPj0gMiBwYXRoIHNlZ21lbnRzCi0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgpOwotICAgICAgICAgICAgaWYocGF0aC5zZWdtZW50Q291bnQoKSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICBKc1NlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgewotCi0gICAgICAgIGlmICh0aGlzLmZQYXJ0aWNpcGFudCA9PSBudWxsKSB7Ci0JCQl0aGlzLmZQYXJ0aWNpcGFudCA9IG5ldyBKc1NlYXJjaFBhcnRpY2lwYW50KCk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgY2FsbGVkIGZyb20gSlNQUGF0aEluZGV4ZXIKLSAgICAvLyBwYV9UT0RPCi0gICAgLy9ob3cgY2FuIHdlIG1ha2Ugc3VyZSBwYXJ0aWNpcGFudCBpbmRleExvY2F0aW9ucyBhcmUgdXBkYXRlZCBhdCBzdGFydHVwPwotICAgIHB1YmxpYyBmaW5hbCBJUGF0aCBjb21wdXRlSW5kZXhMb2NhdGlvbihJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0KLSAgICAgICAgSVBhdGggaW5kZXhMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gaW5hZHZlcnRlbnRseSB1c2UgYSBKRFQgSW5kZXgKLSAgICAgICAgLy8gd2Ugd2FudCB0byBiZSBzdXJlIHRvIHVzZSB0aGUgSW5kZXggZnJvbSB0aGUgSlNQIGxvY2F0aW9uCi0gICAgICAgIC8vT2JqZWN0IG9iaiA9IGluZGV4TG9jYXRpb25zLmdldChjb250YWluZXJQYXRoKTsKLSAgICAgICAgLy9pZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgLy8gICAgaW5kZXhMb2NhdGlvbiA9IChTdHJpbmcpIG9iajsKLSAgICAgICAgLy99IGVsc2UgewotICAgICAgICAgICAgLy8gY3JlYXRlIGluZGV4IGVudHJ5Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aFN0cmluZyA9IGNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpOwotICAgICAgICAgICAgdGhpcy5mQ2hlY2tzdW1DYWxjdWxhdG9yLnJlc2V0KCk7Ci0gICAgICAgICAgICB0aGlzLmZDaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKHBhdGhTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBMb25nLnRvU3RyaW5nKHRoaXMuZkNoZWNrc3VtQ2FsY3VsYXRvci5nZXRWYWx1ZSgpKSArICIuaW5kZXgiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbQotICAgICAgICAgICAgLy8gSW5kZXhNYW5hZ2VyI2NvbXB1dGVJbmRleExvY2F0aW9uKC4uLikKLSAgICAgICAgICAgIGluZGV4TG9jYXRpb24gPSBnZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIHBhX1RPRE8gbmVlZCB0byBhZGQgdG8gamF2YSBwYXRoIHRvbywgc28gSkRUIHNlYXJjaCBzdXBwb3J0IGtub3dzCi0gICAgICAgICAgICAvLyB0aGVyZSBzaG91bGQgYmUgYSBub24gaW50ZXJuYWwgd2F5IHRvIGRvIHRoaXMuCi0gICAgICAgICAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NjQKLSAgICAgICAgICAgIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpLmluZGV4TG9jYXRpb25zLnB1dChjb250YWluZXJQYXRoLCBpbmRleExvY2F0aW9uKTsKLSAgICAgICAgLy99Ci0gICAgICAgIHJldHVybiBpbmRleExvY2F0aW9uOwotICAgIH0KLQlwdWJsaWMgSVBhdGggZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bGwgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVBhdGggd29ya2luZ0xvY2F0aW9uRmlsZSA9IHByb2plY3QuZ2V0V29ya2luZ0xvY2F0aW9uKEpzQ29yZVBsdWdpbi5QTFVHSU5fSUQpLmFwcGVuZCgianNzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBlbnN1cmUgdGhhdCBpdCBleGlzdHMgb24gZGlzawotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKHdvcmtpbmdMb2NhdGlvbkZpbGUudG9PU1N0cmluZygpKTsKLQkJaWYgKCFmb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotCQkJdHJ5IHsKLQkJCQlmb2xkZXIubWtkaXIoKTsKLQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gd29ya2luZ0xvY2F0aW9uRmlsZTsKLQl9Ci0gICAgLy8gY29waWVkIGZyb20gSkRUIEluZGV4TWFuYWdlcgotICAgIHB1YmxpYyBJUGF0aCBnZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbigpIHsKLQotICAgICAgICBpZiAodGhpcy5mSnNwUGx1Z2luTG9jYXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZkpzcFBsdWdpbkxvY2F0aW9uOwotCQl9Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBmb2xkZXIgbmFtZSAianNwc2VhcmNoIiB0byBrZWVwIHRoZSBzdGF0ZSBsb2NhdGlvbiBhcmVhIGNsZWFuZXIKLSAgICAgICAgSVBhdGggc3RhdGVMb2NhdGlvbiA9IEpzQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgianNwc2VhcmNoIik7Ci0KLSAgICAgICAgLy8gcGFfVE9ETyB3b3JrYXJvdW5kIGZvcgotICAgICAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIyNjcKLSAgICAgICAgLy8gY29waWVkIGZyb20gSW5kZXhNYW5hZ2VyCi0gICAgICAgIFN0cmluZyBkZXZpY2UgPSBzdGF0ZUxvY2F0aW9uLmdldERldmljZSgpOwotICAgICAgICBpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmNoYXJBdCgwKSA9PSAnLycpKSB7Ci0JCQlzdGF0ZUxvY2F0aW9uID0gc3RhdGVMb2NhdGlvbi5zZXREZXZpY2UoZGV2aWNlLnN1YnN0cmluZygxKSk7Ci0JCX0KLQotICAgICAgICAvLyBlbnN1cmUgdGhhdCBpdCBleGlzdHMgb24gZGlzawotICAgICAgICBGaWxlIGZvbGRlciA9IG5ldyBGaWxlKHN0YXRlTG9jYXRpb24udG9PU1N0cmluZygpKTsKLQkJaWYgKCFmb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotCQkJdHJ5IHsKLQkJCQlmb2xkZXIubWtkaXIoKTsKLQkJCX0KLQkJCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotICAgICAgICByZXR1cm4gdGhpcy5mSnNwUGx1Z2luTG9jYXRpb24gPSBzdGF0ZUxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEpTUCBJbmRleGluZyBhbmQgU2VhcmNoIGpvYnMgY2hlY2sgdGhpcwotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGZpbmFsIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiBjYW5jZWwpIHsKLSAgICAJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNlYXJjaCBzdXBwb3J0IG1vbml0b3IiICsgZk1vbml0b3IpOwotICAgICAgICBmTW9uaXRvci5zZXRDYW5jZWxlZChjYW5jZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEpTUCBJbmRleGluZyBhbmQgU2VhcmNoIGpvYnMgY2hlY2sgdGhpcwotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGZpbmFsIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQotICAgICAgICByZXR1cm4gZk1vbml0b3IuaXNDYW5jZWxlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEpTUCBJbmRleGluZyBhbmQgU2VhcmNoIGpvYnMgY2hlY2sgdGhpcwotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuZk1vbml0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvTnVsbFNlYXJjaERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxY2U3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLQotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBBbiBlbXB0eSBzZXJ2bGV0LCBzYWZlIGZvciBKYXZhIHNlYXJjaCBwYXJ0aWNpcGF0aW9uCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsU2VhcmNoRG9jdW1lbnQgZXh0ZW5kcyBTZWFyY2hEb2N1bWVudCB7Ci0JCi0JU3RyaW5nQnVmZmVyIGZFbXB0eVNlcnZsZXRCdWZmZXIgPSBudWxsOwotCQotCXB1YmxpYyBOdWxsU2VhcmNoRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCkgewotCQlzdXBlcihkb2N1bWVudFBhdGgsIG5ldyBKc1NlYXJjaFBhcnRpY2lwYW50KCkpOyAKLQkJdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCX0KLQkKLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZkVtcHR5U2VydmxldEJ1ZmZlci50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0JfQotCQotCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnRzKCkgewotCQlyZXR1cm4gdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS90ZXh0L0lKc1BhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL3RleHQvSUpzUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFiMTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL3RleHQvSUpzUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpzUGFydGl0aW9ucyB7Ci0JU3RyaW5nIEh0bWxKc1BhcnRpdGlvbiA9IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQ7Ci0JLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlOGJhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1AZG90Ci1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcF8xLjAuMC4yMDA4MDYwMzEzMDQuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWUwNzk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTUzNzM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTYXQgTWFyIDI0IDExOjIzOjU0IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZjc4YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AuQWN0aXZhdG9yCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjEwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzYjBmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ2NWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jUHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3ANCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZw0KLUJ1bmRsZS1OYW1lLjAgPSBKU0RUIHN1cHBvcnQgZm9yIEpTUCBQbHVnLWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMWRkMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AuSlNEVFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC5KU0RUQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTUCI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTwvYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Kc1ZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AuanNzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCI+PC9wYXJ0aXRpb25UeXBlPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlQiPjwvcGFydGl0aW9uVHlwZT4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3Avc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9zdXBwb3J0L2pzcC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTc5YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3Avc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9zdXBwb3J0L2pzcC9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcCI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdG9yKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvSlNEVEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvSlNEVEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiOTBhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3N1cHBvcnQvanNwL0pTRFRBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNEVDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTRFRBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQIGV4dGVuZHMKLQkJQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQgewotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JKU1ApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvSlNEVFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3Avc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9zdXBwb3J0L2pzcC9KU0RUU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTE2NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3Avc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9zdXBwb3J0L2pzcC9KU0RUU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5NdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5mb3JtYXQuRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUHsKLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGdldEpTRFRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVCgpOwotCQl9Ci0JCXJldHVybiBmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JfQotCQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMgPSBudWxsOwotCi0JCWlmIChJSFRNTFBhcnRpdGlvbnMuU0NSSVBULmVxdWFscyhwYXJ0aXRpb25UeXBlKSB8fCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULmVxdWFscyhwYXJ0aXRpb25UeXBlKSB8fCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUi5lcXVhbHMocGFydGl0aW9uVHlwZSkpIHsKLQkJCS8vIEhUTUwgSmF2YVNjcmlwdAotCQkJSUNvbnRlbnRBc3Npc3RhbnQgaHRtbENvbnRlbnRBc3Npc3RhbnQgPSBnZXRKU0RUSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRDb250ZW50QXNzaXN0YW50KHNvdXJjZVZpZXdlcik7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBodG1sQ29udGVudEFzc2lzdGFudC5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpOwotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde3Byb2Nlc3Nvcn07Ci0JCX0KLQkJZWxzZXsKLQkJCXByb2Nlc3NvcnMgPSBzdXBlci5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NvcnM7Ci0JfQotCQotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWZpbmFsIElDb250ZW50Rm9ybWF0dGVyIGZvcm1hdHRlciA9IHN1cGVyLmdldENvbnRlbnRGb3JtYXR0ZXIoc291cmNlVmlld2VyKTsKLQkJaWYoZm9ybWF0dGVyIGluc3RhbmNlb2YgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikgewotCQkvKgotCQkgKiBDaGVjayBmb3IgYW55IGV4dGVybmFsbHkgc3VwcG9ydGVkIGF1dG8gZWRpdCBzdHJhdGVnaWVzIGZyb20gRVAuCi0JCSAqIFtCcmFkbGV5IENoaWxkcyAtIGNoaWxkc2JAdXMuaWJtLmNvbV0KLQkJICovCi0JCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoSUhUTUxQYXJ0aXRpb25zLlNDUklQVC5lcXVhbHMoY29udGVudFR5cGVzW2ldKSB8fCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULmVxdWFscyhjb250ZW50VHlwZXNbaV0pIHx8IElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSLmVxdWFscyhjb250ZW50VHlwZXNbaV0pKSB7Ci0JCQkJCSgoTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikgZm9ybWF0dGVyKS5zZXRTbGF2ZVN0cmF0ZWd5KG5ldyBGb3JtYXR0aW5nU3RyYXRlZ3lKU0RUKCksIGNvbnRlbnRUeXBlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRJbmRlbnRQcmVmaXhlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVN0cmluZ1tdIGluZGVudGF0aW9ucyA9IG51bGw7Ci0JCWlmIChJSFRNTFBhcnRpdGlvbnMuU0NSSVBULmVxdWFscyhjb250ZW50VHlwZSkgfHwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVC5lcXVhbHMoY29udGVudFR5cGUpIHx8IElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSLmVxdWFscyhjb250ZW50VHlwZSkpCi0JCQlpbmRlbnRhdGlvbnMgPSBnZXRKU0RUSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRJbmRlbnRQcmVmaXhlcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZWxzZQotCQkJaW5kZW50YXRpb25zID0gc3VwZXIuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCXJldHVybiBpbmRlbnRhdGlvbnM7Ci0JfQotCQotCXByb3RlY3RlZCBJSW5mb3JtYXRpb25Qcm92aWRlciBnZXRJbmZvcm1hdGlvblByb3ZpZGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlJSW5mb3JtYXRpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCWlmIChJSFRNTFBhcnRpdGlvbnMuU0NSSVBULmVxdWFscyhwYXJ0aXRpb25UeXBlKSB8fCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULmVxdWFscyhwYXJ0aXRpb25UeXBlKSB8fCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUi5lcXVhbHMocGFydGl0aW9uVHlwZSkpIHsKLQkJCS8vIEphdmFTY3JpcHQKLQkJCUlJbmZvcm1hdGlvblByZXNlbnRlciBodG1sUHJlc2VudGVyID0gZ2V0SlNEVEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXIoc291cmNlVmlld2VyKTsKLQkJCXByb3ZpZGVyID0gaHRtbFByZXNlbnRlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpOwotCQl9Ci0JCWlmKHByb3ZpZGVyID09IG51bGwpewotCQkJcHJvdmlkZXIgPSBzdXBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQkKLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gbnVsbDsKLQkJaWYgKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQuZXF1YWxzKHBhcnRpdGlvblR5cGUpIHx8IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQuZXF1YWxzKHBhcnRpdGlvblR5cGUpIHx8IElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSLmVxdWFscyhwYXJ0aXRpb25UeXBlKSkgewotCQkJcHJvdmlkZXJzID0gZ2V0SlNEVEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgSUhUTUxQYXJ0aXRpb25zLlNDUklQVCk7Ci0JCX0KLQkJZWxzZXsKLQkJCXByb3ZpZGVycyA9IHN1cGVyLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQl9Ci0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0JCi0JcHVibGljIElUZXh0SG92ZXIgZ2V0VGV4dEhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUsIGludCBzdGF0ZU1hc2spIHsKLQkJSVRleHRIb3ZlciBob3ZlciA9IG51bGw7Ci0KLQkJaWYgKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQuZXF1YWxzKGNvbnRlbnRUeXBlKSB8fCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULmVxdWFscyhjb250ZW50VHlwZSkgfHwgSUhUTUxQYXJ0aXRpb25zLlNDUklQVF9FVkVOVEhBTkRMRVIuZXF1YWxzKGNvbnRlbnRUeXBlKSkgewotCQkJLy8gaHRtbCBhbmQgamF2YXNjcmlwdCByZWdpb25zCi0JCQlob3ZlciA9IGdldEpTRFRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldFRleHRIb3Zlcihzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlLCBzdGF0ZU1hc2spOwotCQl9Ci0JCWVsc2UgewotCQkJaG92ZXIgPSBzdXBlci5nZXRUZXh0SG92ZXIoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCX0KLQkKLQkJcmV0dXJuIGhvdmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjE2NWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTc4NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMDcyMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotI1dlZCBPY3QgMjQgMTk6NDk6NDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxZDA5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotI1dlZCBPY3QgMjQgMTk6NDE6MzEgRURUIDIwMDcKLWNsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPWZhbHNlCi1jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLWNsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9ZmFsc2UKLWNsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCi1jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLWNsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9ZmFsc2UKLWNsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLWNsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLWNsZWFudXAudXNlX2Jsb2Nrcz10cnVlCi1jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLWNsZWFudXBfcHJvZmlsZT1fU1NFIFRlYW0gU3R5bGVzCi1jbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQotb3JnLmVjbGlwc2UuamR0LnVpLmdldHRlcnNldHRlci51c2UuaXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmtleXdvcmR0aGlzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkub3ZlcnJpZGVhbm5vdGF0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjg0ZWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWksCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmF1dG9lZGl0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZGVyaXZlZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZm9ybWF0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluazt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnN0eWxlLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGFnaW5mbzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuNDAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQubWFuaXB1bGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk2NzViZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9pY29ucy9leWVfaWNvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9pY29ucy9leWVfaWNvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ODM5OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvaWNvbnMvZXllX2ljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwZGJiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBKU0RUIFdlYiBTdXBwb3J0IFVJCi10YXJnZXQubmFtZS4wID0gSmF2YVNjaXJwdCBTb3VyY2UKLXRhcmdldC5uYW1lLjEgPSBKYXZhU2NpcnB0IEV2ZW50IFNvdXJjZQotaHlwZXJsaW5rRGV0ZWN0b3IubmFtZS4wID0gSmF2YSBFbGVtZW50IEh5cGVyTGluayBEZXRlY3RvcgotaHlwZXJsaW5rRGV0ZWN0b3IubmFtZS4xID0gSmF2YSBFbGVtZW50IEh5cGVyTGluayBEZXRlY3RvcgotbWVudS5sYWJlbC4wID0gRGVjbGVyYXRpb25zCi1hY3Rpb24udG9vbHRpcC4wID0gV29ya2luZyBTZXQKLWFjdGlvbi5sYWJlbC4wID0gV29ya2luZyBTZXQKLWFjdGlvbi5sYWJlbC4xID0gSGllcmFyY2h5Ci1hY3Rpb24udG9vbHRpcC4xID0gSGllcmFyY2h5Ci1hY3Rpb24ubGFiZWwuMiA9IFByb2plY3QKLWFjdGlvbi50b29sdGlwLjIgPSBQcm9qZWN0Ci1hY3Rpb24ubGFiZWwuMyA9IFdvcmtzcGFjZQotYWN0aW9uLnRvb2x0aXAuMyA9IAotbWVudS5sYWJlbC4xID0gUmVmZXJlbmNlcwotYWN0aW9uLmxhYmVsLjQgPSBXb3JraW5nIFNldAotYWN0aW9uLnRvb2x0aXAuNCA9IFdvcmtpbmcgU2V0Ci1hY3Rpb24ubGFiZWwuNSA9IEhpZXJhcmNoeQotYWN0aW9uLnRvb2x0aXAuNSA9IEhpZXJhcmNoeQotYWN0aW9uLmxhYmVsLjYgPSBQcm9qZWN0Ci1hY3Rpb24udG9vbHRpcC42ID0gUHJvamVjdAotYWN0aW9uLmxhYmVsLjcgPSBXb3Jrc3BhY2UKLWFjdGlvbi50b29sdGlwLjcgPSAKLW1lbnUubGFiZWwuMiA9IFJlZmFjdG9yCi1tZW51LmxhYmVsLjMgPSBTb3VyY2UKLWFjdGlvbi5sYWJlbC44ID0gR2VuZXJhdGUgRWxlbWVudCBDb21tZW50Ci1hY3Rpb24udG9vbHRpcC44ID0gR2VuZXJhdGUgRWxlbWVudCBDb21tZW50Ci1hY3Rpb24ubGFiZWwuOSA9IENoYW5nZSBGdW5jdGlvbiBTaWduYXR1cmUKLWFjdGlvbi50b29sdGlwLjkgPSBDaGFuZ2UgRnVuY3Rpb24gU2lnbmF0dXJlCi1hY3Rpb24ubGFiZWwuMTAgPSBNb3ZlCi1hY3Rpb24udG9vbHRpcC4xMCA9IE1vdmUKLWFjdGlvbi5sYWJlbC4xMSA9IFJlbmFtZQotYWN0aW9uLnRvb2x0aXAuMTEgPSBSZW5hbWUKLWFjdGlvbi5sYWJlbC4xMiA9IERlbGV0ZQotYWN0aW9uLnRvb2x0aXAuMTIgPSBEZWxldGUKLWFjdGlvbi5sYWJlbC4xMyA9IFBhc3RlIEFmdGVyCi1hY3Rpb24udG9vbHRpcC4xMyA9IFBhc3RlCi1hY3Rpb24ubGFiZWwuMTQgPSBQYXN0ZSBCZWZvcmUKLWFjdGlvbi50b29sdGlwLjE0ID0gUGFzdGUKLWFjdGlvbi5sYWJlbC4xNSA9IENvcHkKLWFjdGlvbi50b29sdGlwLjE1ID0gQ29weQotYWN0aW9uLmxhYmVsLjE2ID0gQ3V0Ci1hY3Rpb24udG9vbHRpcC4xNiA9IEN1dAotbWVudS5sYWJlbC40ID0gU2hvdyBJbgotYWN0aW9uLmxhYmVsLjE3ID0gTmF2aWdhdG9yCi1hY3Rpb24udG9vbHRpcC4xNyA9IFNob3cgSW4gTmF2aWdhdG9yCi1hY3Rpb24ubGFiZWwuMTggPSBTY3JpcHQgRXhwbG9yZXIKLWFjdGlvbi50b29sdGlwLjE4ID0gU2hvdyBJbiBTY3JpcHQgRXhwbG9yZXIKLWFjdGlvbi5sYWJlbC4xOSA9IE9wZW4gQ2FsbCBIaWVyYXJjaHkKLWFjdGlvbi50b29sdGlwLjE5ID0gT3BlbiBDYWxsIEhpZXJhcmNoeQotYWN0aW9uLmxhYmVsLjIwID0gT3BlbiBUeXBlIEhpZXJhcmNoeQotYWN0aW9uLnRvb2x0aXAuMjAgPSBPcGVuIFR5cGUgSGllcmFyY2h5Ci1yZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjAgPSBKU0RUIFdlYiBSZW5hbWUgUGFydGljaXBhbnQKLXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMSA9IEpTRFQgV2ViIFJlbmFtZSBQYXJ0aWNpcGFudAotcmVuYW1lUGFydGljaXBhbnQubmFtZS4yID0gSlNEVCBXZWIgUmVuYW1lIFBhcnRpY2lwYW50Ci1yZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjMgPSBKU0RUIFdlYiBSZW5hbWUgUGFydGljaXBhbnQKLW1lbnUubGFiZWwuNSA9IFdlYiBEZXZlbG9wbWVudCBUb29scwotYWN0aW9uLmxhYmVsLjIxID0gQWRkIEphdmFTY3JpcHQgU3VwcG9ydAotcXVlcnlQYXJ0aWNpcGFudC5uYW1lLjAgPSBKYXZhU2NyaXB0IFF1ZXJ5IFBhcnRpY2lwYW50Ci1oeXBlcmxpbmtEZXRlY3Rvci5uYW1lLjIgPSBKU0RUIEh5cGVyTGluayBEZXRlY3RvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjY5ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotIAk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotIAkKLSAJCTwhLS0KLSAJCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTRFQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiIC8+Ci0JCQkKLQkJLS0+Ci0JCQotIAkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZS5Kc0NvbnRlbnRPdXRsaW5lQ29uZmlnIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIiAvPgkJCi0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNvbnRlbnRhc3Npc3Rwcm9jZXNzb3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSlNEVENvbnRlbnRBc3Npc3RhbnQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCxvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCQotCQkKLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ibGluZXN0eWxlcHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnN0eWxlLmphdmEuTGluZVN0eWxlUHJvdmlkZXJGb3JKU0RUIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQsb3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULkVWRU5USEFORExFUiIgLz4KLQkJPGRvY3VtZW50YXRpb25UZXh0SG92ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGFnaW5mby5KU0RUSG92ZXJQcm9jZXNzb3IiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCxvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGV4dC5Kc0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCxvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJhdXRvZWRpdHN0cmF0ZWd5IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5hdXRvZWRpdC5BdXRvRWRpdFN0cmF0ZWd5Rm9ySnMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCxvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycyI+Ci0JCTxoeXBlcmxpbmtEZXRlY3RvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsuSlNEVEh5cGVybGlua0RldGVjdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsuSlNEVEh5cGVybGlua0RldGVjdG9yIgotCQkJbmFtZT0iJWh5cGVybGlua0RldGVjdG9yLm5hbWUuMiIKLQkJCXRhcmdldElkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotCQk8L2h5cGVybGlua0RldGVjdG9yPgotCQkKLSAgIDwvZXh0ZW5zaW9uPgotCQotCQotCQotCTxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbmRlZEVkaXRvckFjdGlvbnMiPgotCQk8ZWRpdG9yQ29udHJpYnV0aW9uIAotICAgICAgICAgICAgdGFyZ2V0SUQ9ImNvbS5pYm0uc3NlLmVkaXRvci5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIgCi0gICAgICAgICAgICBpZD0iY29tLmlibS5zc2UuZWRpdG9yLmV4dGVuZGVkQWN0aW9uczIiPiAKLSAgICAgICAgIDxhY3Rpb24gCi0gICAgICAgICAgICAgICBwb3B1cG1lbnVQYXRoPSJncm91cC5hZGQiIAotICAgICAgICAgICAgICAgbGFiZWw9IlByZWZlcmVuY2VzMiIgCi0gICAgICAgICAgICAgICBjbGFzcz0iY29tLmlibS5zc2UuZWRpdG9yLnByZWZlcmVuY2VzLnVpLkVkaXRTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VzQWN0aW9uIiAKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnNzZS5lZGl0b3IucHJlZmVyZW5jZXMudWkuRWRpdFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZXNBY3Rpb24yIj4gCi0gICAgICAgICA8L2FjdGlvbj4gCi0gICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4gCi0JCQotCQotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9yVGFyZ2V0cyI+Ci0JCTx0YXJnZXQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQiCi0JCQluYW1lPSIldGFyZ2V0Lm5hbWUuMCI+Ci0JCTwvdGFyZ2V0PgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9yVGFyZ2V0cyI+Ci0JCTx0YXJnZXQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIgotCQkJbmFtZT0iJXRhcmdldC5uYW1lLjEiPgotCQk8L3RhcmdldD4KLQk8L2V4dGVuc2lvbj4KLQkKLQkgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycyI+Ci0gICAgICA8aHlwZXJsaW5rRGV0ZWN0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkpTRFRIeXBlcmxpbmtEZXRlY3RvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rLnNjcmlwdC5KU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IiCi0gICAgICAgICAgICBuYW1lPSIlaHlwZXJsaW5rRGV0ZWN0b3IubmFtZS4wIgotICAgICAgICAgICAgdGFyZ2V0SWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCI+Ci0gICAgICA8L2h5cGVybGlua0RldGVjdG9yPgotICAgICAgPGh5cGVybGlua0RldGVjdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluay5KU0RUSHlwZXJsaW5rRGV0ZWN0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluay5zY3JpcHQuZXZlbnQuSlNQSmF2YUh5cGVybGlua0RldGVjdG9yIgotICAgICAgICAgICAgbmFtZT0iJWh5cGVybGlua0RldGVjdG9yLm5hbWUuMSIKLSAgICAgICAgICAgIHRhcmdldElkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIj4KLSAgICAgIDwvaHlwZXJsaW5rRGV0ZWN0b3I+ICAKLSAgIDwvZXh0ZW5zaW9uPgotICAKLSAgCi0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCTwhLS0gY29udGVudCBvdXRsaW5lIGNvbnRyaWJ1dGlvbnMgZm9yIE9wZW4gVHlwZSBhbmQgT3BlbiBIaWVyYXJjaHkgbWVudS4gIE1lbnVzIHNob3cgdXAgaW4gcmV2ZXJzZSBvcmRlciBvZiBkZWNsaXJhdGlvbiAoZ29vZ2xlIGl0KS4gLS0+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuSmF2YUFjdGlvbnMiPgotICAgICAgICAgICAgPCEtLSBEZWNsZXJhdGlvbnMgU2VhcmNoIE1lbnUgLS0+Ci0gICAgICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuZGVjbGVyYXRpb25zIgotICAgICAgICAgCQlsYWJlbD0iJW1lbnUubGFiZWwuMCIKLSAgICAgICAgIAkJcGF0aD0iZ3JvdXAuc2VhcmNoIj4KLSAgICAgCQkgCTxzZXBhcmF0b3IgbmFtZT0iZGVjbGVyYXRpb25zIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4wIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4wIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5kZWNsZXJhdGlvbnMvZGVjbGVyYXRpb25zIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmREZWNsYXJhdGlvbnNJbldvcmtpbmdTZXRBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+ICAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjEiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjEiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmRlY2xlcmF0aW9ucy9kZWNsZXJhdGlvbnMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuRmluZERlY2xhcmF0aW9uc0luSGllcmFyY2h5QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPiAKLSAgICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4yIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4yIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5kZWNsZXJhdGlvbnMvZGVjbGVyYXRpb25zIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjMiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMyIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuZGVjbGVyYXRpb25zL2RlY2xlcmF0aW9ucyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kRGVjbGFyYXRpb25zQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPiAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICA8IS0tIFJlZnJlbmNlcyBTZWFyY2ggbWVudSAtLT4KLSAgICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmZXJlbmNlcyIKLSAgICAgICAgIAkJbGFiZWw9IiVtZW51LmxhYmVsLjEiCi0gICAgICAgICAJCXBhdGg9Imdyb3VwLnNlYXJjaCI+Ci0gICAgIAkJIAk8c2VwYXJhdG9yIG5hbWU9InJlZmVyZW5jZXMiLz4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjQiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmVyZW5jZXMvcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuNSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuNSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmZXJlbmNlcy9yZWZlcmVuY2VzIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+IAotICAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjYiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjYiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmVyZW5jZXMvcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuNyIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC43IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZlcmVuY2VzL3JlZmVyZW5jZXMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+ICAgCi0gICAgICAgICA8IS0tIFNvdXJjZSBhbmQgUmVmYWN0b3JpbmcgTWVudSdzIC0tPgotICAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZhY3RvciIKLSAgICAgICAgIAkJbGFiZWw9IiVtZW51LmxhYmVsLjIiCi0gICAgICAgICAJCXBhdGg9Imdyb3VwLmdlbmVyYXRlIj4KLSAgICAgCQkgCTxzZXBhcmF0b3IgbmFtZT0icmVmYWN0b3IiLz4KLSAgICAgICAgIDwvbWVudT4KLQotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnNvdXJjZSIKLSAgICAgICAgIAkJbGFiZWw9IiVtZW51LmxhYmVsLjMiCi0gICAgICAgICAJCXBhdGg9Imdyb3VwLmdlbmVyYXRlIj4KLSAgICAgCQkgCTxzZXBhcmF0b3IgbmFtZT0ic291cmNlIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8IS0tIFNvdXJjZSBBY3Rpb25zIC0tPgotCQkgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuOCIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuOCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc291cmNlL3NvdXJjZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkFkZEphdmFEb2NTdHViQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuZ2VuZXJhdGUuZWxlbWVudC5jb21tZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPCEtLSBSZWZhY3RvciBBY3Rpb25zIC0tPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuOSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuOSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmYWN0b3IvcmVmYWN0b3IiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Tb3VyY2VBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuY2hhbmdlLmZ1bmN0aW9uLnNpZ25hdHVyZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjEwIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xMCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmYWN0b3IvcmVmYWN0b3IiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Tb3VyY2VBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuTW92ZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjExIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xMSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmYWN0b3IvcmVmYWN0b3IiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Tb3VyY2VBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucmVuYW1lIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIDwhLS0gRWRpdCAgKGN1dCBjb3B5IHBhc3RlIGV0Yy4uIC0tPgotICAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjEyIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xMiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJncm91cC5lZGl0IgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuZGVsZXRlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAKLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjEzIiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xMyIKLSAgICAgICAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJncm91cC5lZGl0IgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucGFzdGUuYWZ0ZXIiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTQiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjE0IgotICAgICAgICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Imdyb3VwLmVkaXQiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5wYXN0ZS5iZWZvcmUiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xNSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTUiCi0gICAgICAgICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZ3JvdXAuZWRpdCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IioiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmNvcHkiPgotICAgICAgICAgPC9hY3Rpb24+Ci0KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjE2IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xNiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJncm91cC5lZGl0IgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuY3V0Ij4KLSAgICAgICAgIDwvYWN0aW9uPiAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNob3cgaW4gU2NyaXB0IEV4cGxvcmVyLCBIaXN0b3J5IGFuZCBOYXZpZ2F0b3IgLS0+ICAgICAgIAotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnNob3dpbiIKLSAgICAgICAgIAkJbGFiZWw9IiVtZW51LmxhYmVsLjQiCi0gICAgICAgICAJCXBhdGg9Imdyb3VwLnNob3ciPgotICAgICAJCSAJPHNlcGFyYXRvciBuYW1lPSJzaG93aW4iLz4KLSAgICAgICAgIDwvbWVudT4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTciICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjE3IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zaG93aW4vc2hvd2luIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU2hvd0luTmF2aWdhdG9yQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLlNob3dJbk5hdmlnYXRvclZpZXdBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8IS0tIEhpc3Rvcnkgbm90IHdvcmtpbmcgd2VsbCAtLT4KLSAgICAgICAgIDwhLS0KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJIaXN0b3J5IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IlNob3cgSW4gSGlzdG9yeSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc2hvd2luL3Nob3dpbiIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlNob3dIaXN0b3J5QWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5jYWxsaGllcmFyY2h5Lk9wZW5DYWxsSGllcmFyY2h5QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPiAKLSAgICAgICAgIC0tPgotICAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjE4IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xOCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc2hvd2luL3Nob3dpbiIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlNob3dJblNjcmlwdEV4cGxvcmVyQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLlNob3dJblNjcmlwdEV4cGxvcmVyIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIE9wZW4gQ2FsbCBhbmQgVHlwZSBIaWVyYXJjaGllcyAtLT4KLSAgICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xOSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTkiCi0gICAgICAgICAgICAgbWVudWJhclBhdGg9Imdyb3VwLnNob3ciCi0gICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLmNhbGxoaWVyYXJjaHkuT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4yMCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4yMCIKLSAgIAkJCW1lbnViYXJQYXRoPSJncm91cC5zaG93IgotICAgCQkJc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuT3BlblR5cGVIaWVyYXJjaHkiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuT3BlblR5cGVIaWVyYXJjaHlBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgPC9vYmplY3RDb250cmlidXRpb24+IAotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLSAgCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIHNvdXJjZSB2YWxpZGF0aW9uIGZvciBKU1AJCQkJCQkJCQkJCQkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpzVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5qc3Bzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIj48L3BhcnRpdGlvblR5cGU+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiPjwvcGFydGl0aW9uVHlwZT4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTUCBVSSBBZGFwdGVyIGZhY3RvcmllcwkJCQkJICAgCQkJCQkJICAJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNEVCI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JCi0KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gZm9yIGJyZWFrcG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gcmVtb3ZlZCBmb3Igbm93IC0tPgotCTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnQiPgotCQk8YnJlYWtwb2ludENvbnRyaWJ1dGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnByb3ZpZGVycyI+Ci0JCQk8cHJvdmlkZXIKLQkJCQljb250ZW50VHlwZXM9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnMuSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXI6Kmh0bWwsanMsaHRtKiIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnMuSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIiIC8+Ci0JCTwvYnJlYWtwb2ludENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQkKLQkKLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCS0tPgotCi0JCi0JCi0JCi0JPCEtLSBLZXliaW5kaW5ncyBmb3IganNwIHNvdXJjZSBlZGl0b3IgLS0+Ci0JPCEtLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIj4gLS0+Ci0JICAgIDwhLS0gIHdpbjMyOiAgTTE9Q1RSTCwgTTI9U0hJRlQsIE0zPUFMVCAtLT4KLQkJPCEtLSByZW5hbWUgcmVmYWN0b3IgLS0+Ci0JCTwhLS0KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK1IiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuZWRpdC50ZXh0LmphdmEucmVuYW1lLmVsZW1lbnQiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQktLT4KLQkJPCEtLSBtb3ZlIHJlZmFjdG9yIC0tPgotCQk8IS0tCi0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytWIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3Auc2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5yZWZhY3Rvci5tb3ZlIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQkKLQkKLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIHF1ZXJ5UGFydGljaXBhbnQgdG8gcGFydGljaXBhdGUgaW4gamF2YSBzZXJhY2hlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5xdWVyeVBhcnRpY2lwYW50cyI+Ci0JCTxxdWVyeVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlcXVlcnlQYXJ0aWNpcGFudC5uYW1lLjAiCi0JCQluYXR1cmU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuanNOYXR1cmUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpLkpzUXVlcnlQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuamF2YS5zZWFyY2gudWkuSnNRdWVyeVBhcnRpY2lwYW50IiAvPgotCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBEb2N1bWVudCBwcm92aWRlciBmb3IgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgotCQk8cHJvdmlkZXIKLQkJCWlucHV0VHlwZXM9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsuRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRGaWxlRG9jdW1lbnRQcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuRXh0ZXJuYWxGaWxlRG9jdW1lbnRQcm92aWRlciIgLz4KLQotCTwvZXh0ZW5zaW9uPgotCS0tPgotCTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmpzcHNvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIgLz4KLQotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0tLT4KLQotCi08IS0tCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+Ci0JCTxlZGl0b3JDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qc3Bzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLkNvbXBpbGF0aW9uVW5pdEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQ2xlYW51cERvY3VtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJUb2dnbGVDb21tZW50IgotCQkJCWxhYmVsPSIlVG9nZ2xlQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJVRvZ2dsZUNvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlRvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iVG9nZ2xlQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iQWRkQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlQWRkQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlQWRkQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQWRkQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJSZW1vdmVCbG9ja0NvbW1lbnQiCi0JCQkJbGFiZWw9IiVSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlJlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW1vdmVCbG9ja0NvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlJlbmFtZUVsZW1lbnQiCi0JCQkJbGFiZWw9IiVSZW5hbWVFbGVtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnJlZmFjdG9yLnJlbmFtZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW5hbWVFbGVtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJNb3ZlRWxlbWVudCIKLQkJCQlsYWJlbD0iJU1vdmVFbGVtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnJlZmFjdG9yLm1vdmUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9Ik1vdmVFbGVtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJGaW5kT2NjdXJyZW5jZXMiCi0JCQkJbGFiZWw9IiVGaW5kT2NjdXJyZW5jZXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2guSnNGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iRmluZE9jY3VycmVuY2VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmpzcHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JLS0+Ci0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRk9SIEpTUC9KQVZBIFJFTkFNRSBQQVJUSUNJUEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnJlbmFtZVBhcnRpY2lwYW50cyI+Ci0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5qc05hdHVyZSIgLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVyZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjEiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuanNOYXR1cmUiIC8+Ci0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQkJPHJlbmFtZVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlcmVuYW1lUGFydGljaXBhbnQubmFtZS4yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5qc05hdHVyZSIgLz4KLQotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUZ1bmN0aW9uIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVyZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmpzTmF0dXJlIiAvPgotCi0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQotCSAgPC9leHRlbnNpb24+Ci0JICA8IS0tCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyIj4KLSAgICAgPEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyCi0gICAgIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQubGF1bmNoaW5nLldlYlByb2plY3QiCi0gICAgIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLldlYlByb2plY3RKc0dsb2JhbFNjb3BlVUlJbml0aWFsaXplciI+Ci0gICAgIDwvSnNHbG9iYWxTY29wZVVJSW5pdGlhbGl6ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLS0tPgotCi0KLSAgCSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gIAkJPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5qc2R0U2V0dXAiPgotICAgICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSIlbWVudS5sYWJlbC41IgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5wcm9qZWN0LnRvb2xzIj4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgIG5hbWU9Imdyb3VwMCI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuU2V0dXBQcm9qZWN0c1dpenphcmQiCi0gICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4yMSIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucHJvamVjdC50b29scy9ncm91cDAiCi0gICAgICAgICAgICBlbmFibGVzRm9yPSIrIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLndlYi51aS5jb252ZXJ0UHJvamVjdHMiPgotICAgICAgCTwvYWN0aW9uPgotICAgCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPiAKLSAgCSA8IS0tIFVuY29tbWVudCBmb3IgU3RhbmRhbG9uZSArIEhUTUwgYXMgc2VwZXJhdGUgb3B0aW9ucyAtLT4KLSAgCSA8IS0tCi0gIAkgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotIAkJPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5qc2R0U2V0dXAiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgbGFiZWw9IkFkZCBTdXBwb3J0IGZvciBKYXZhU2NyaXB0IGluIEhUTUwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLlNldHVwUHJvamVjdHNXaXp6YXJkIgotICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnByb2plY3QudG9vbHMvZ3JvdXAwIgotICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuaW50ZXJuYWwudWkuY29udmVydFByb2plY3RzIj4KLSAgICAgIAk8L2FjdGlvbj4KLSAgIAkJPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4gIAotICAgLS0+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3NjU1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvU2V0dXBQcm9qZWN0c1dpenphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvU2V0dXBQcm9qZWN0c1dpenphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5MDNiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL1NldHVwUHJvamVjdHNXaXp6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSW5jbHVkZVBhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc1dlYk5hdHVyZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2V0dXBQcm9qZWN0c1dpenphcmQgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZSB7Ci0JCi0JT2JqZWN0W10gZlRhcmdldDsKLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy90aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEV4Y2VwdGlvbigic2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYoZlRhcmdldD09bnVsbCkgcmV0dXJuOwotCQkKLQkJZm9yKGludCBpPTA7aTxmVGFyZ2V0Lmxlbmd0aDtpKyspIHsKLQkJCWlmKGZUYXJnZXRbaV0gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpZlRhcmdldFtpXTsKLQkJCQkKLQkJCQkJaWYoIUpzV2ViTmF0dXJlLmhhc05hdHVyZShwcm9qZWN0KSkgewotCQkJCQkJSnNXZWJOYXR1cmUgbmF0dXJlID0gbmV3IEpzV2ViTmF0dXJlKHByb2plY3QsbnVsbCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW5hdHVyZS5jb25maWd1cmUoKTsKLQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlIHsKLQkJCQkJCUphdmFQcm9qZWN0IGpwID0gKEphdmFQcm9qZWN0KUphdmFTY3JpcHRDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJCUlJbmNsdWRlUGF0aEVudHJ5W10gcmF3Q2xhc3NwYXRoID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmF3Q2xhc3NwYXRoID0ganAuZ2V0UmF3SW5jbHVkZXBhdGgoKTsKLQkJCQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBleDEpIHsKLQkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQkJZXgxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkKLQkJCQkJCS8qIHNlZSBpZiBwcm9qZWN0IGhhcyB3ZWIgY3AgZW50cnkgYW5kIGlmIGl0IGRvZXMgbGVhdmUgKi8KLQkJCQkJCWZvcihpbnQgayA9IDA7cmF3Q2xhc3NwYXRoIT1udWxsICYmIGs8cmF3Q2xhc3NwYXRoLmxlbmd0aDtrKyspIHsKLQkJCQkJCQlpZihyYXdDbGFzc3BhdGhba10uZ2V0UGF0aCgpLmVxdWFscyhKc1dlYk5hdHVyZS5WSVJUVUFMX0JST1dTRVJfQ0xBU1NQQVRIKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJSnNXZWJOYXR1cmUgbmF0dXJlID0gbmV3IEpzV2ViTmF0dXJlKHByb2plY3QsbnVsbCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW5hdHVyZS5jb25maWd1cmUoKTsKLQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCi0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCi0JCWlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZUYXJnZXQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCX1lbHNlIHsKLQkJCWZUYXJnZXQgPSBudWxsOwotCQl9Ci0JfQotCQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxM2RhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLk11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU0RUQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZm9ybWF0LkZvcm1hdHRpbmdTdHJhdGVneUpTRFQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRhZ2luZm8uSlNEVEluZm9ybWF0aW9uUHJvdmlkZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSogCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgSHRtbCBhbmQgc3VwcG9ydHMgSlNEVC4KLSAqIDxwPgotICogQ2xpZW50cyBjYW4gc3ViY2xhc3MgYW5kIG92ZXJyaWRlIGp1c3QgdGhvc2UgbWV0aG9kcyB3aGljaCBtdXN0IGJlIHNwZWNpZmljCi0gKiB0byB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwgewotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RUKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQkKLQkvKiBDb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzIGFyZSBjb250cmlidXRlZCBieSBleHRlbnNpb24gZm9yIFNTRSBub3cgKi8KLQkKLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gcHJvY2Vzc29ycyA9IG51bGw7Ci0KLQkJaWYgKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQuZXF1YWxzKHBhcnRpdGlvblR5cGUpIHx8IElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSLmVxdWFscyhwYXJ0aXRpb25UeXBlKSkgewotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBKU0RUQ29udGVudEFzc2lzdGFudCgpfTsKLQkJfQotCQllbHNlewotCQkJcHJvY2Vzc29ycyA9IHN1cGVyLmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQkKLQlwdWJsaWMgSUNvbnRlbnRGb3JtYXR0ZXIgZ2V0Q29udGVudEZvcm1hdHRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlmaW5hbCBJQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBzdXBlci5nZXRDb250ZW50Rm9ybWF0dGVyKHNvdXJjZVZpZXdlcik7Ci0JCWlmKGZvcm1hdHRlciBpbnN0YW5jZW9mIE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpIHsKLQkJLyoKLQkJICogQ2hlY2sgZm9yIGFueSBleHRlcm5hbGx5IHN1cHBvcnRlZCBhdXRvIGVkaXQgc3RyYXRlZ2llcyBmcm9tIEVQLgotCQkgKiBbQnJhZGxleSBDaGlsZHMgLSBjaGlsZHNiQHVzLmlibS5jb21dCi0JCSAqLwotCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQuZXF1YWxzKGNvbnRlbnRUeXBlc1tpXSkgfHwgSUhUTUxQYXJ0aXRpb25zLlNDUklQVF9FVkVOVEhBTkRMRVIuZXF1YWxzKGNvbnRlbnRUeXBlc1tpXSkpIHsKLQkJCQkJKChNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSBmb3JtYXR0ZXIpLnNldFNsYXZlU3RyYXRlZ3kobmV3IEZvcm1hdHRpbmdTdHJhdGVneUpTRFQoKSwgY29udGVudFR5cGVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIElJbmZvcm1hdGlvblByb3ZpZGVyIGdldEluZm9ybWF0aW9uUHJvdmlkZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmIChJSFRNTFBhcnRpdGlvbnMuU0NSSVBULmVxdWFscyhwYXJ0aXRpb25UeXBlKSB8fCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUi5lcXVhbHMocGFydGl0aW9uVHlwZSkpIHsKLQkJCXJldHVybiBuZXcgSlNEVEluZm9ybWF0aW9uUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL1dlYlByb2plY3RKc0dsb2JhbFNjb3BlVUlJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2FlY2NlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkuSUpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplckV4dGVuc2lvbjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICoKLSAqLwotcHVibGljIGNsYXNzIFdlYlByb2plY3RKc0dsb2JhbFNjb3BlVUlJbml0aWFsaXplciBpbXBsZW1lbnRzIElKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXJFeHRlbnNpb257Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkuSUpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsemVyRXh0ZW5zaW9uI2dldEltYWdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3QpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZShJUGF0aCBjb250YWluZXJQYXRoLCBTdHJpbmcgZWxlbWVudCwgSUphdmFTY3JpcHRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZSh0aGlzLmdldENsYXNzKCksIndlYjEuSlBHIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvQWRkSmF2YURvY1N0dWJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1YkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjA0NDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1YkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5hY3Rpb25zLldvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS51dGlsLkV4Y2VwdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkpzSmZhY2VOb2RlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFkZEphdmFEb2NTdHViQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERpYWxvZ1RpdGxlKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuZ2V0U3RyaW5nKCJBZGRKYXZhRG9jU3R1YkFjdGlvbi4wIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCQotCXB1YmxpYyBJV29ya2JlbmNoUGFydFNpdGUgZ2V0U2l0ZSgpIHsKLQkJcmV0dXJuIHRhcmdldFBhcnQuZ2V0U2l0ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50W10gZWxlbWVudHMgPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPCAxKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUphdmFTY3JpcHRFbGVtZW50IHBhcmVudCA9IGVsZW1lbnRzWzBdLmdldFBhcmVudCgpOwotCQkvKiBmaW5kIHRoZSBjdSAqLwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdFVuaXQpKSB7Ci0JCQkKLQkJfQotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCUFycmF5TGlzdCBtZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElNZW1iZXIpIHsKLQkJCQkJbWVtYmVycy5hZGQoZWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCUpzSmZhY2VOb2RlIG5vZGVbXSA9IFNpbXBsZUpTRFRBY3Rpb25Qcm94eS5nZXRKc0pmYWNlTm9kZXNGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkvKiBvbmx5IHNob3VsZCBiZSBvbmUgbm9kZSAqLwotCQkJcnVuKChJSmF2YVNjcmlwdFVuaXQpIHBhcmVudCwgKElNZW1iZXJbXSkgbWVtYmVycy50b0FycmF5KG5ldyBJTWVtYmVyW21lbWJlcnMuc2l6ZSgpXSksIG5vZGVbMF0pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJSmF2YVNjcmlwdFVuaXQgY3UsIElNZW1iZXJbXSBtZW1iZXJzLCBKc0pmYWNlTm9kZSBub2RlKSB7Ci0JCXRyeSB7Ci0JCQlBZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbiBvcCA9IG5ldyBBZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbihtZW1iZXJzLCBub2RlKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLCBuZXcgV29ya2JlbmNoUnVubmFibGVBZGFwdGVyKG9wLCBvcC5nZXRTY2hlZHVsZVJ1bGUoKSksIG9wLmdldFNjaGVkdWxlUnVsZSgpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeGNlcHRpb25IYW5kbGVyLmhhbmRsZShlLCBnZXRTaGVsbCgpLCBnZXREaWFsb2dUaXRsZSgpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkFkZEphdmFEb2NTdHViQWN0aW9uLjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gb3BlcmF0aW9uIGNhbmNlbGVkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvQWRkSmF2YURvY1N0dWJPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGRlNjA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lclRvVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5Kc0pmYWNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFkZEphdmFEb2NTdHViT3BlcmF0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZXh0LmNvZGVtYW5pcHVsYXRpb24uQWRkSmF2YURvY1N0dWJPcGVyYXRpb24gewotCXByaXZhdGUgSURvY3VtZW50IGNvcHk7Ci0JLyoqCi0JICogQHBhcmFtIG1lbWJlcnMKLQkgKi8KLQlwcml2YXRlIEpzSmZhY2VOb2RlIG5vZGU7Ci0JcHJpdmF0ZSBEb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdCB0ZXh0RWRpdExpc3RlbmVyOwotCQotCXB1YmxpYyBBZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbihJTWVtYmVyW10gbWVtYmVycywgSnNKZmFjZU5vZGUgbm9kZSkgewotCQlzdXBlcihtZW1iZXJzKTsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYXBwbHlDaGFuZ2VzKCkgewotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXRyeSB7Ci0JCQlNdWx0aVRleHRFZGl0IGVkaXRzID0gdGV4dEVkaXRMaXN0ZW5lci5nZXRUZXh0RWRpdHMoKTsKLQkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvYyk7Ci0JCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIE1lc3NhZ2VzLmdldFN0cmluZygiQWRkSmF2YURvY1N0dWJPcGVyYXRpb24uMCIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIkFkZEphdmFEb2NTdHViT3BlcmF0aW9uLjEiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZWRpdHMuYXBwbHkoZG9jKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZXh0LmNvZGVtYW5pcHVsYXRpb24uQWRkSmF2YURvY1N0dWJPcGVyYXRpb24jZ2V0RG9jdW1lbnQob3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KElKYXZhU2NyaXB0VW5pdCBjdSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRKYXZhRG9jdW1lbnRGcm9tTm9kZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldEphdmFEb2N1bWVudEZyb21Ob2RlKCkgewotCQlpZiAoY29weSA9PSBudWxsKSB7Ci0JCQlJSnNUcmFuc2xhdGlvbiB0cmFuID0gbm9kZS5nZXRUcmFuc2xhdGlvbigpOwotCQkJY29weSA9IG5ldyBEb2N1bWVudCh0cmFuLmdldEpzVGV4dCgpKTsKLQkJCXRleHRFZGl0TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lclRvVGV4dEVkaXQoKTsKLQkJCWNvcHkuYWRkRG9jdW1lbnRMaXN0ZW5lcih0ZXh0RWRpdExpc3RlbmVyKTsKLQkJfQotCQlyZXR1cm4gY29weTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJc3VwZXIucnVuKG1vbml0b3IpOwotCQlhcHBseUNoYW5nZXMoKTsKLQkJLyogbmVlZCB0byBhcHBseSB0aGUgdGV4dCBlZGl0cyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBkb2MgKi8KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGE0YzcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZpbmRSZWZlcmVuY2VzQWN0aW9uIGV4dGVuZHMgSnNFbGVtZW50QWN0aW9uUHJveHkgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuSnNFbGVtZW50QWN0aW9uUHJveHkjZ2V0UnVuQXJncyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0UnVuQXJncyhJQWN0aW9uIGFjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBlbGVtZW50c1swXSB9OwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkpzRWxlbWVudEFjdGlvblByb3h5I2dldFJ1bkFyZ1R5cGVzKCkKLQkgKi8KLQkKLQlwdWJsaWMgQ2xhc3NbXSBnZXRSdW5BcmdUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSUphdmFTY3JpcHRFbGVtZW50LmNsYXNzIH07Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOGY0MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uIGV4dGVuZHMgRmluZFJlZmVyZW5jZXNBY3Rpb24gewotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJT2JqZWN0IGhhbmRsZXIgPSBnZXRBY3Rpb25IYW5kbGVyKGFjdGlvbik7Ci0JCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVNpbXBsZUpTRFRBY3Rpb25Qcm94eS5leGVjdXRlTWV0aG9kKGhhbmRsZXIsICJydW4iLCBuZXcgQ2xhc3NbXSB7IElKYXZhU2NyaXB0RWxlbWVudC5jbGFzcyB9LCBuZXcgT2JqZWN0W10geyBlbGVtZW50c1swXSB9KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJLy8gSWYgdXNlciBkb2Vzbid0IHNlbGVjdCBhIHdvcmtpbmcgc2V0IGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gc28gd2UKLQkJCS8vIHdvbnQgcHJpbnQgc3RhY2sgdHJhY2UgaGVyZQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0pzRWxlbWVudEFjdGlvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvSnNFbGVtZW50QWN0aW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NzFmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvSnNFbGVtZW50QWN0aW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKc0VsZW1lbnRBY3Rpb25Qcm94eSBleHRlbmRzIFNpbXBsZUpTRFRBY3Rpb25Qcm94eSB7Ci0JLyogVXRpbCBtZXRob2QgdG8gZ2V0IGFsbCB0aGUgamF2YSBlbGVtZW50cyBpbiBhIHNlbGVjdGlvbiAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFTY3JpcHRFbGVtZW50W10gZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJfQotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSXRlcmF0b3IgaXR0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0dC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0dC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSkgewotCQkJCQllbGVtZW50cy5hZGQoKChJSmF2YVdlYk5vZGUpIGVsZW1lbnQpLmdldEphdmFFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAoSUphdmFTY3JpcHRFbGVtZW50W10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IElKYXZhU2NyaXB0RWxlbWVudFtlbGVtZW50cy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdFtdIGdldFJ1bkFyZ3MoSUFjdGlvbiBhY3Rpb24pIHsKLQkJLyoKLQkJICogTmVlZHMgdG8gcmV0dXJuIGFuIGFycmF5IG9mIElKYXZhRWxlbWVudHMuIFNpbmNlIGl0cyBvbmUgYXJnIG9mIHR5cGUKLQkJICogSUphdmFTY3JpcHRFbGVtZW50W10gbmVlZCB0byBwdXQgaW50byBhbiBvYmplY3QgYXJyYXkKLQkJICovCi0JCXJldHVybiBuZXcgT2JqZWN0W10geyBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpIH07Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU2ltcGxlSlNEVEFjdGlvblByb3h5I2dldFJ1bkFyZ1R5cGVzKCkKLQkgKi8KLQkKLQlwdWJsaWMgQ2xhc3NbXSBnZXRSdW5BcmdUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgKG5ldyBJSmF2YVNjcmlwdEVsZW1lbnRbMF0pLmdldENsYXNzKCkgfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmZhMTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9PcGVuQ2FsbEhpZXJhcmNoeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL09wZW5DYWxsSGllcmFyY2h5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MDgzYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL09wZW5DYWxsSGllcmFyY2h5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24gZXh0ZW5kcyBKc0VsZW1lbnRBY3Rpb25Qcm94eSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TaW1wbGVKU0RUQWN0aW9uUHJveHkjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCS8qIE9wZW4gY2FsbCBoaWVyYXJjaHkgbmVlZHMgdG8gYmUgZGlzYWJsZWQgZm9yIFRZUEVzICovCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5UWVBFKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvT3BlblR5cGVIaWVyYXJjaHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9PcGVuVHlwZUhpZXJhcmNoeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDVhNGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9PcGVuVHlwZUhpZXJhcmNoeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuVHlwZUhpZXJhcmNoeSBleHRlbmRzIEpzRWxlbWVudEFjdGlvblByb3h5IHsKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCS8qIE9wZW4gY2FsbCBoaWVyYXJjaHkgbmVlZHMgdG8gYmUgZGlzYWJsZWQgZm9yIFRZUEVzICovCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5nZXRFbGVtZW50VHlwZSgpICE9IElKYXZhU2NyaXB0RWxlbWVudC5UWVBFKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2hvd0hpc3RvcnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaG93SGlzdG9yeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzhjMDJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaG93SGlzdG9yeUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnV0aWwuRXhjZXB0aW9uSGFuZGxlcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93SGlzdG9yeUFjdGlvbiBleHRlbmRzIEpzRWxlbWVudEFjdGlvblByb3h5IHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0SG9zdFJlc291cmNlKElKYXZhU2NyaXB0RWxlbWVudCB2aXJ0dWFsRWxlbWVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gdmlydHVhbEVsZW1lbnQuZ2V0SmF2YVNjcmlwdFByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aCh2aXJ0dWFsRWxlbWVudC5nZXRIb3N0UGF0aCgpLmdldFBhdGgoKSk7Ci0JCUlSZXNvdXJjZSBob3N0ID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihwYXRoKTsKLQkJcmV0dXJuIGhvc3Q7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRzWzBdLmlzVmlydHVhbCgpKSB7Ci0JCQlyZXNvdXJjZSA9IGdldEhvc3RSZXNvdXJjZShlbGVtZW50c1swXSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNvdXJjZSA9IGVsZW1lbnRzWzBdLmdldFJlc291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHRhcmdldFdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCUlWaWV3UGFydCB2aWV3ID0gcGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJCWlmICh2aWV3IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb3VyY2UpOwotCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldCkgdmlldykuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKGUsIHRhcmdldFdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIE1lc3NhZ2VzLmdldFN0cmluZygiU2hvd0hpc3RvcnlBY3Rpb24uMCIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlNob3dIaXN0b3J5QWN0aW9uLjEiKSArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWxlbWVudHNbaV0uaXNWaXJ0dWFsKCkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRIb3N0UmVzb3VyY2UoZWxlbWVudHNbaV0pOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJbk5hdmlnYXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJbk5hdmlnYXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhiOTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaG93SW5OYXZpZ2F0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS51dGlsLkV4Y2VwdGlvbkhhbmRsZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2hvd0luTmF2aWdhdG9yQWN0aW9uIGV4dGVuZHMgSnNFbGVtZW50QWN0aW9uUHJveHkgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRIb3N0UmVzb3VyY2UoSUphdmFTY3JpcHRFbGVtZW50IHZpcnR1YWxFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB2aXJ0dWFsRWxlbWVudC5nZXRKYXZhU2NyaXB0UHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHZpcnR1YWxFbGVtZW50LmdldEhvc3RQYXRoKCkuZ2V0UGF0aCgpKTsKLQkJSVJlc291cmNlIGhvc3QgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotCQlyZXR1cm4gaG9zdDsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZWxlbWVudHNbMF0uaXNWaXJ0dWFsKCkpIHsKLQkJCXJlc291cmNlID0gZ2V0SG9zdFJlc291cmNlKGVsZW1lbnRzWzBdKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gZWxlbWVudHNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJfQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQkJSVZpZXdQYXJ0IHZpZXcgPSBwYWdlLnNob3dWaWV3KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihyZXNvdXJjZSk7Ci0JCQkJKChJU2V0U2VsZWN0aW9uVGFyZ2V0KSB2aWV3KS5zZWxlY3RSZXZlYWwoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwgdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaG93SW5OYXZpZ2F0b3JBY3Rpb24uMCIpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlNob3dJbk5hdmlnYXRvckFjdGlvbi4xIikgKyBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmlzVmlydHVhbCgpKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0SG9zdFJlc291cmNlKGVsZW1lbnRzW2ldKTsKLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCAhcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaG93SW5TY3JpcHRFeHBsb3JlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJblNjcmlwdEV4cGxvcmVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OWVhMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJblNjcmlwdEV4cGxvcmVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXcuUGFja2FnZUV4cGxvcmVyUGFydDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNob3dJblNjcmlwdEV4cGxvcmVyQWN0aW9uIGV4dGVuZHMgSnNFbGVtZW50QWN0aW9uUHJveHkgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRIb3N0UmVzb3VyY2UoSUphdmFTY3JpcHRFbGVtZW50IHZpcnR1YWxFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB2aXJ0dWFsRWxlbWVudC5nZXRKYXZhU2NyaXB0UHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHZpcnR1YWxFbGVtZW50LmdldEhvc3RQYXRoKCkuZ2V0UGF0aCgpKTsKLQkJSVJlc291cmNlIGhvc3QgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotCQlyZXR1cm4gaG9zdDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Kc0VsZW1lbnRBY3Rpb25Qcm94eSNnZXRSdW5BcmdzKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRSdW5BcmdzKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGVsZW1lbnRzWzBdIH07Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuSnNFbGVtZW50QWN0aW9uUHJveHkjZ2V0UnVuQXJnVHlwZXMoKQotCSAqLwotCQotCXB1YmxpYyBDbGFzc1tdIGdldFJ1bkFyZ1R5cGVzKCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJSmF2YVNjcmlwdEVsZW1lbnQuY2xhc3MgfTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZWxlbWVudHNbMF0uaXNWaXJ0dWFsKCkpIHsKLQkJCXJlc291cmNlID0gZ2V0SG9zdFJlc291cmNlKGVsZW1lbnRzWzBdKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gZWxlbWVudHNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJfQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlQYWNrYWdlRXhwbG9yZXJQYXJ0IHZpZXcgPSBQYWNrYWdlRXhwbG9yZXJQYXJ0Lm9wZW5JbkFjdGl2ZVBlcnNwZWN0aXZlKCk7Ci0JCQl2aWV3LnRyeVRvUmV2ZWFsKHJlc291cmNlKTsKLS8vIElXb3JrYmVuY2hQYWdlIHBhZ2U9IHRhcmdldFdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLS8vIElWaWV3UGFydCB2aWV3PSBwYWdlLnNob3dWaWV3KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihyZXNvdXJjZSk7Ci0JCQkJKChJU2V0U2VsZWN0aW9uVGFyZ2V0KSB2aWV3KS5zZWxlY3RSZXZlYWwoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKGUsCi0JCQkvLyB0YXJnZXRXb3JrYmVuY2hQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpLCAiRXJyb3IgT3BlbmluZyBpbgotCQkJLy8gU2NyaXB0IFZpZXciLCAiRXJyb3Igd2hpbGUgZGlzcGxheWluZyBlbGVtZW50IGluIFNjcmlwdCBWaWV3OlxuIgotCQkJLy8gKyBlKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWxlbWVudHNbaV0uaXNWaXJ0dWFsKCkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRIb3N0UmVzb3VyY2UoZWxlbWVudHNbaV0pOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NpbXBsZUpTRFRBY3Rpb25Qcm94eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NpbXBsZUpTRFRBY3Rpb25Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDI0YjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaW1wbGVKU0RUQWN0aW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkpzSmZhY2VOb2RlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlSlNEVEFjdGlvblByb3h5IGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCBoYW5kbGVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBwYXJhbWF0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1hdGVyVmFsdWVzKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sCi0JCQlOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUNsYXNzIHRhcmdldCA9IGhhbmRsZXIuZ2V0Q2xhc3MoKTsKLQkJTWV0aG9kIG0gPSB0YXJnZXQuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtYXRlclR5cGVzKTsKLQkJcmV0dXJuIG0uaW52b2tlKGhhbmRsZXIsIHBhcmFtYXRlclZhbHVlcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSnNKZmFjZU5vZGVbXSBnZXRKc0pmYWNlTm9kZXNGcm9tU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBKc0pmYWNlTm9kZVswXTsKLQkJfQotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSXRlcmF0b3IgaXR0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0dC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0dC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKc0pmYWNlTm9kZSkgewotCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChKc0pmYWNlTm9kZVtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBKc0pmYWNlTm9kZVtlbGVtZW50cy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gbmV3IEpzSmZhY2VOb2RlWzBdOwotCX0KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdGlvbkhhbmRsZXJUYXJnZXQ7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0JcHJvdGVjdGVkIElBY3Rpb24gaGFuZGxlclRhcmdldEFjdGlvbjsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0V29ya2JlbmNoUGFydDsKLQkKLQlwdWJsaWMgU2ltcGxlSlNEVEFjdGlvblByb3h5KCkge30KLQkKLQkvKgotCSAqIE1vc3QgaGFuZGxlcnMgbG9vayBmb3IgV29ya0JlbmNoU2l0ZSwgc28gd2UgY29udmVydCB0aGUgV29ya0JlbmNoUGFydCB0bwotCSAqIFdvcmtCZW5jaFNpdGUgZm9yIGluaXQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldEFjdGlvbkhhbmRsZXIoSUFjdGlvbiBhY3Rpb24pIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLQkJCUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkvKiBUYXJnZXQgY2xhc3MgaXMgY2FjaGVkICovCi0JCWlmIChoYW5kbGVyVGFyZ2V0QWN0aW9uID09IGFjdGlvbiAmJiBhY3Rpb25IYW5kbGVyVGFyZ2V0ICE9IG51bGwpIHsKLQkJCXJldHVybiBhY3Rpb25IYW5kbGVyVGFyZ2V0OwotCQl9Ci0JCUNsYXNzIHRhcmdldCA9IG51bGw7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRBY3Rpb25IYW5kbGVyQ2xhc3NOYW1lKGFjdGlvbik7Ci0JCXRyeSB7Ci0JCQl0YXJnZXQgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IuLiBDbGFzcyB0YXJnZXQgb2YgYWN0aW9uIGhhbmRsZXIgbm90IGZvdW5kOiAiICsgYWN0aW9uKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIlNpbXBsZUpTRFRBY3Rpb25Qcm94eS4wIikgKyBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyB1c2UgdGhlIGxvYWRlZCBjbGFzcwotCQlDbGFzc1tdIHR5cGVzID0gbmV3IENsYXNzW10geyBJV29ya2JlbmNoU2l0ZS5jbGFzcyB9OwotCQlDb25zdHJ1Y3RvciBjb25zID0gdGFyZ2V0LmdldENvbnN0cnVjdG9yKHR5cGVzKTsKLQkJT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IHRhcmdldFdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpIH07Ci0JCQotCQlhY3Rpb25IYW5kbGVyVGFyZ2V0ID0gY29ucy5uZXdJbnN0YW5jZShhcmdzKTsKLQkJaGFuZGxlclRhcmdldEFjdGlvbiA9IGFjdGlvbjsKLQkJcmV0dXJuIGFjdGlvbkhhbmRsZXJUYXJnZXQ7Ci0JfQotCQotCS8qCi0JICogRGVmYXVsdCB3YXkgb2YgZGV0ZXJtaW5pbmcgdGhlIGFjdGlvbiBoYW5kbGVycyBjbGFzcyBuYW1lLi4gbWF5IGJlCi0JICogc3ViY2xhc3NlZC9vdmVycmlkZGVuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBY3Rpb25IYW5kbGVyQ2xhc3NOYW1lKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJldHVybiBhY3Rpb24uZ2V0SWQoKTsKLQl9Ci0JCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRSdW5BcmdzKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyBnZXRDdXJyZW50U2VsZWN0aW9uKCkgfTsKLQl9Ci0JCi0JcHVibGljIENsYXNzW10gZ2V0UnVuQXJnVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElTdHJ1Y3R1cmVkU2VsZWN0aW9uLmNsYXNzIH07Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRTZWxlY3Rpb25DaGFuZ2VBcmdzKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgZ2V0Q3VycmVudFNlbGVjdGlvbigpIH07Ci0JfQotCQotCXB1YmxpYyBDbGFzc1tdIGdldFNlbGVjdGlvbkNoYW5nZUFyZ1R5cGVzKCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJU3RydWN0dXJlZFNlbGVjdGlvbi5jbGFzcyB9OwotCX0KLQkKLQkvKgotCSAqIEdlbmVyaWMgcmVmbGVjdGlvbiB1dGlsIG1ldGhvZCB0byBleGVjdXRlIGEgbmFtZWQgbWV0aG9kIHdpdGggdW5rbm93bgotCSAqIHBhcmFtYXRlcnMgb24gYW4gb2JqZWN0Ci0JICovCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQl0cnkgewotCQkJT2JqZWN0IGhhbmRsZXIgPSBnZXRBY3Rpb25IYW5kbGVyKGFjdGlvbik7Ci0JCQlTaW1wbGVKU0RUQWN0aW9uUHJveHkuZXhlY3V0ZU1ldGhvZChoYW5kbGVyLCAicnVuIiwgZ2V0UnVuQXJnVHlwZXMoKSwgZ2V0UnVuQXJncyhhY3Rpb24pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJaWYodGFyZ2V0V29ya2JlbmNoUGFydD09bnVsbCkgcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCU9iamVjdCBoYW5kbGVyID0gZ2V0QWN0aW9uSGFuZGxlcihhY3Rpb24pOwotCQkJU2ltcGxlSlNEVEFjdGlvblByb3h5LmV4ZWN1dGVNZXRob2QoaGFuZGxlciwgInNlbGVjdGlvbkNoYW5nZWQiLCBnZXRTZWxlY3Rpb25DaGFuZ2VBcmdUeXBlcygpLCBnZXRTZWxlY3Rpb25DaGFuZ2VBcmdzKGFjdGlvbiwgc2VsZWN0aW9uKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0V29ya2JlbmNoUGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NvdXJjZUFjdGlvbnNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9Tb3VyY2VBY3Rpb25zQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODE1ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NvdXJjZUFjdGlvbnNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlQWN0aW9uc0FjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1N0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1N0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTFkOWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSnNKZmFjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBBUFBFTkRfTkVXX0xJTkVTX1RPX0NPUFkgPSB0cnVlOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFkgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmNvcHkiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VUID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5jdXQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5kZWxldGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBORVdfTElORSA9ICdcbic7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTVEVfQUZURVIgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnBhc3RlLmFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1RFX0JFRk9SRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucGFzdGUuYmVmb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXByaXZhdGUgdm9pZCBjb3B5KElBY3Rpb24gYWN0aW9uKSB7Ci0JCUpzSmZhY2VOb2RlW10gbm9kZXMgPSBwYXJzZVNlbGVjdGlvbigpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5BUFBFTkRfTkVXX0xJTkVTX1RPX0NPUFkpIHsKLQkJCXRleHQuYXBwZW5kKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5ORVdfTElORSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKc0pmYWNlTm9kZSBjdXJyZW50Tm9kZSA9IG5vZGVzW2ldOwotCQkJCWludCBzdGFydCA9IGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IGN1cnJlbnROb2RlLmdldExlbmd0aCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gY3VycmVudE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGVsZW1lbnRUZXh0ID0gZG9jLmdldChzdGFydCwgbGVuZ3RoKTsKLQkJCQkJdGV4dC5hcHBlbmQoZWxlbWVudFRleHQpOwotCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCWlmIChTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uQVBQRU5EX05FV19MSU5FU19UT19DT1BZKSB7Ci0JCQkJCXRleHQuYXBwZW5kKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5ORVdfTElORSk7Ci0JCQkJfQotCQkJCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQkJCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10geyB0ZXh0LnRvU3RyaW5nKCkgfSwgbmV3IFRyYW5zZmVyW10geyBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjbGlwYm9hcmQgIT0gbnVsbCkgewotCQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZShJQWN0aW9uIGFjdGlvbikgewotCQlKc0pmYWNlTm9kZVtdIG5vZGVzID0gcGFyc2VTZWxlY3Rpb24oKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50IGxhc3REb2MgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJaW50IHN0YXJ0OwotCQkJaW50IGxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlKc0pmYWNlTm9kZSBjdXJyZW50Tm9kZSA9IG5vZGVzW2ldOwotCQkJCXN0YXJ0ID0gY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlsZW5ndGggPSBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IGN1cnJlbnROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWlmIChkb2MgIT0gbGFzdERvYykgewotCQkJCQlsYXN0RG9jID0gZG9jOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKGFjdGlvbik7Ci0JCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jKTsKLQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcoYWN0aW9uLCAiRGVsZXRlIEphdmFTY3JpcHQgRWxlbWVudCIsICJEZWxldGUgSmF2YVNjcmlwdCBFbGVtZW50Iik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZG9jLnJlcGxhY2VUZXh0KGFjdGlvbiwgc3RhcnQsIGxlbmd0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQltb2RlbC5lbmRSZWNvcmRpbmcoYWN0aW9uKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi44IikgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIEpzSmZhY2VOb2RlW10gcGFyc2VTZWxlY3Rpb24oKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBKc0pmYWNlTm9kZVswXTsKLQkJfQotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSXRlcmF0b3IgaXR0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0dC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0dC5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSkgewotCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChKc0pmYWNlTm9kZVtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBKc0pmYWNlTm9kZVtlbGVtZW50cy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gbmV3IEpzSmZhY2VOb2RlWzBdOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGFzdGUoSUFjdGlvbiBhY3Rpb24sIGJvb2xlYW4gYXRFbmQpIHsKLQkJSnNKZmFjZU5vZGVbXSBub2RlcyA9IHBhcnNlU2VsZWN0aW9uKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBzdGFydE9mUGFzdGUgPSAtMTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBudWxsOwotCQkvKiBGaWd1cmUgb3V0IHdoZXJlIHRvIHBhc3RlIHRoZSBjb250ZW50ICovCi0JCWlmIChhdEVuZCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICgobm9kZXNbaV0uZ2V0U3RhcnRPZmZzZXQoKSArIG5vZGVzW2ldLmdldExlbmd0aCgpKSA+IHN0YXJ0T2ZQYXN0ZSkgewotCQkJCQlzdGFydE9mUGFzdGUgPSAobm9kZXNbaV0uZ2V0U3RhcnRPZmZzZXQoKSArIG5vZGVzW2ldLmdldExlbmd0aCgpKTsKLQkJCQkJZG9jID0gbm9kZXNbaV0uZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICgobm9kZXNbaV0uZ2V0U3RhcnRPZmZzZXQoKSA8IHN0YXJ0T2ZQYXN0ZSB8fCBzdGFydE9mUGFzdGUgPCAwKSkgewotCQkJCQlzdGFydE9mUGFzdGUgPSBub2Rlc1tpXS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQlkb2MgPSBub2Rlc1tpXS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJCVN0cmluZyBwYXN0ZVN0cmluZyA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyhUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2MpOwotCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQltb2RlbC5iZWdpblJlY29yZGluZyhhY3Rpb24sIE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjkiKSArIChhdEVuZCA/IE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjEwIikgOiBNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xMSIpKSArIE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjEyIiksIE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjEzIikgKyAoYXRFbmQgPyBNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xNCIpIDogTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTUiKSkgKyBNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xNiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQlkb2MucmVwbGFjZVRleHQoYWN0aW9uLCBzdGFydE9mUGFzdGUsIDAsIHBhc3RlU3RyaW5nKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjbGlwYm9hcmQgIT0gbnVsbCkgewotCQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLmVuZFJlY29yZGluZyhhY3Rpb24pOwotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbi5nZXRJZCgpLmVxdWFscyhTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uQ1VUKSkgewotCQkJY29weShhY3Rpb24pOwotCQkJZGVsZXRlKGFjdGlvbik7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uLmdldElkKCkuZXF1YWxzKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5DT1BZKSkgewotCQkJY29weShhY3Rpb24pOwotCQl9IGVsc2UgaWYgKGFjdGlvbi5nZXRJZCgpLmVxdWFscyhTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uUEFTVEVfQkVGT1JFKSkgewotCQkJcGFzdGUoYWN0aW9uLCBmYWxzZSk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uLmdldElkKCkuZXF1YWxzKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5QQVNURV9BRlRFUikpIHsKLQkJCXBhc3RlKGFjdGlvbiwgdHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uLmdldElkKCkuZXF1YWxzKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5ERUxFVEUpKSB7Ci0JCQlkZWxldGUoYWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkge30KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OWI3NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjg9RXJyb3IgaW4gU3RhbmRhcmQgRWRpdG9yIEFjdGlvbiA6IAotU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjk9SW5zZXJ0IFRleHQgCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTA9YmVmb3JlCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTE9YWZ0ZXIKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xMj1cIGEgSmF2YVNjcmlwdCBFbGVtZW50LgotU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjEzPUluc2VydCBUZXh0IAotU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjE0PWJlZm9yZQotU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjE1PWFmdGVyCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTY9XCBhIEphdmFTY3JpcHQgRWxlbWVudC4KLVNpbXBsZUpTRFRBY3Rpb25Qcm94eS4wPUV4Y2VwdGlvbiA6IAotU2hvd0hpc3RvcnlBY3Rpb24uMD1FcnJvciBPcGVuaW5nIGluIFNjcmlwdCBWaWV3Ci1TaG93SGlzdG9yeUFjdGlvbi4xPUVycm9yIHdoaWxlIGRpc3BsYXlpbmcgZWxlbWVudCBpbiBTY3JpcHQgVmlldzpcbgotU2hvd0luTmF2aWdhdG9yQWN0aW9uLjA9RXJyb3IgT3BlbmluZyBpbiBTY3JpcHQgVmlldwotU2hvd0luTmF2aWdhdG9yQWN0aW9uLjE9RXJyb3Igd2hpbGUgZGlzcGxheWluZyBlbGVtZW50IGluIFNjcmlwdCBWaWV3OlxuCi1BZGRKYXZhRG9jU3R1YkFjdGlvbi4wPUphdmFTY3JpcHQgRG9jCi1BZGRKYXZhRG9jU3R1YkFjdGlvbi4xPUVycm9yIHdoaWxlIGFkZGluZyBjb21tZW50Ci1BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbi4wPUdlbmVyYXRlIEpzRG9jCi1BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbi4xPUdlbmVyYXRlIEpzRG9jCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0lBY3Rpb25Db25zdGFudHNKcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9JQWN0aW9uQ29uc3RhbnRzSnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxYWY1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0lBY3Rpb25Db25zdGFudHNKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWw7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25Db25zdGFudHNKcyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfTU9WRV9FTEVNRU5UID0gIk1vdmVFbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1JFTkFNRV9FTEVNRU5UID0gIlJlbmFtZUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0lBY3Rpb25EZWZpbml0aW9uSWRzSnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSUFjdGlvbkRlZmluaXRpb25JZHNKcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTYxNjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSUFjdGlvbkRlZmluaXRpb25JZHNKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLklKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uRGVmaW5pdGlvbklkc0pzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNT1ZFX0VMRU1FTlQgPSBJSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuTU9WRV9FTEVNRU5UOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTkFNRV9FTEVNRU5UID0gSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLlJFTkFNRV9FTEVNRU5UOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9KU1BVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9KU1BVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2I1ZDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhIHNhbXBsZSBKU1AgZG9jdW1lbnQuICBQbGVhc2UgdHJhbnNsYXRlIG9ubHkgdGhlIGZvbGxvd2luZyBwYXJ0czoKLSMjIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjEKLSMjIFdlbGNvbWUhCi0jIyBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4yCi0jIyBXZWxjb21lIQotU2FtcGxlX0pTUF9kb2M9PCVAIHBhZ2UgXG5cdGxhbmd1YWdlPVwiamF2YVwiIFxuXHRjb250ZW50VHlwZT1cInRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xXCJcbiU+XG48anNwOmluY2x1ZGUgZmx1c2g9XCJ0cnVlXCIgcGFnZT1cInRpdGxlQmFyLmpzcFwiLz5cblxuPCUtLSBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4xIC0tJT5cbjwlXG5cdFN5c3RlbS5vdXQucHJpbnRsbihcIldlbGNvbWUhXCIpO1xuJT5cbjwlLS0gVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMiAtLSU+XG48anNwOnNjcmlwdGxldD5cblx0U3lzdGVtLm91dC5wcmludGxuKFwiV2VsY29tZSFcIik7XG48L2pzcDpzY3JpcHRsZXQ+Ci1KU1BfRGVsaW1pdGVyc19VSV89SlNQIERlbGltaXRlcnMKLVJlZmFjdG9yX2xhYmVsPVJlZmFjdG9yCi1SZW5hbWVFbGVtZW50X2xhYmVsPVJlbmFtZQotTW92ZUVsZW1lbnRfbGFiZWw9TW92ZQotTW92ZUVsZW1lbnRXaXphcmQ9TW92ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMKLSMKLU9LPU9LCi1KU1BfY2hhbmdlcz1KU1AgY2hhbmdlcwotQWN0aW9uQ29udHJpYnV0b3JKU1BfMD1SZWZhJmN0b3IKLUpTUFJlbmFtZUVsZW1lbnRBY3Rpb25fMD1FZGl0b3Igc2VsZWN0aW9uIGRvZXMgbm90IHJlc29sdmUgdG8gYSByZW5hbWFibGUgSmF2YSBlbGVtZW50Ci1KU1BNb3ZlRWxlbWVudEFjdGlvbl8wPUVkaXRvciBzZWxlY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSB0byBtb3ZhYmxlIEphdmEgZWxlbWVudHMKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMD1KU1AgUmVuYW1lCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzE9aW4gZmlsZTogezB9IGxpbmU6IHsxfQotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yPU1vdmUgVHlwZSAnJ3swfScnIHRvIHBhY2thZ2UgJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8zPVJlbmFtZSBNZXRob2QgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQ9UmVuYW1lIFR5cGUgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzU9UmVuYW1lIFBhY2thZ2UgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzY9SlNQIFJlbmFtZSBDaGFuZ2UKLSMKLV9VSV9XSVpBUkRfTkVXX1RJVExFID0gTmV3IEphdmFTZXJ2ZXIgUGFnZQotX1VJX1dJWkFSRF9ORVdfSEVBRElORyA9IEphdmFTZXJ2ZXIgUGFnZQotX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04gPSBDcmVhdGUgYSBuZXcgSmF2YVNlcnZlciBQYWdlLgotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUCA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uIAotX1dBUk5JTkdfRklMRV9NVVNUX0JFX0lOU0lERV9KQVZBX1BST0pFQ1QgPSBKYXZhU2VydmVyIFBhZ2VzIGNyZWF0ZWQgaW4gcHJvamVjdHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBKYXZhIG1pZ2h0IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiAKLV9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCA9IEZpbGVzIGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHlvdXIgZGVwbG95ZWQgV2ViIGFwcGxpY2F0aW9uLiAKLVJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IEpTUCBUZW1wbGF0ZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8xPVNlbGVjdCBhIHRlbXBsYXRlIGFzIGluaXRpYWwgY29udGVudCBpbiB0aGUgSlNQIHBhZ2UuCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzI9TmFtZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8zPURlc2NyaXB0aW9uCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQ9VXNlIEpTUCBUZW1wbGF0ZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81PVByZXZpZXcKLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgSlNQJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkpTUCBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KLSMgQ29waWVkIGZyb20gc3NlLnVpCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA9ezB9IC0gezF9IE9jY3VycmVuY2VzIGluIHsyfQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yPWZpbGUKLUNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXz1Db250ZW50IEFzc2lzdCBub3QgYXZhaWxhYmxlIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uCi1KYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV89SmF2YSBDb250ZW50IEFzc2lzdCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBjdXJzb3IgbG9jYXRpb24KLSMKLU92ZXJyaWRlX21ldGhvZF9pbj1PdmVycmlkZSBtZXRob2QgaW4gJwotQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc9Q3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgcHJlZmVyZW5jZQotIwotSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMD1KU1AgU291cmNlIHByZWZlcmVuY2VzIGFyZSBiYXNlZCBvbiB0aGUgY29udGVudCB3aXRoaW4gdGhlIEpTUC4KLUpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzE9U2VlIDxhPicnezB9Jyc8L2E+IGZvciBKU1Agd2l0aCBIVE1MIGNvbnRlbnQuCi1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8yPVNlZSA8YT4nJ3swfScnPC9hPiBmb3IgSlNQIHdpdGggWE1MIGNvbnRlbnQuCi1KU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQ9SlNQIENvbnRlbnQKLUpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMD1WYWxpZGF0aW5nIGZpbGVzCi1KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzE9VmFsaWRhdGUgSlNQIGZyYWdtZW50cwotIyBKU1AgRnJhZ21lbnRzCi1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA9bm9uZQotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8xPVRoZSBwcm9wZXJ0aWVzIHVzZWQgaW5zdGVhZCBvZiB0aGUgcGFnZSBkaXJlY3RpdmUgdGhhdCBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIEpTUCBmcmFnbWVudCBmaWxlcy4gIFRoZSBwcm9qZWN0IHNldHRpbmcgaXMgdXNlZCBpZiB5b3Ugc3BlY2lmeSAibm9uZS4iCi1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzI9TGFuZ3VhZ2U6Ci1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzM9Q29udGVudCBUeXBlOgotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV80PUVuYWJsZSBzcGVjaWZpYyBzZXR0aW5nOgotUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1UaGUgcHJvcGVydGllcyBmb3IgSjJFRSBXZWIgcHJvamVjdHMgYWN0IGFzICJwcm9qZWN0IiBkZWZhdWx0IHRvIGJlIGxvb2tlZCB1cCB3aGVuIG5vIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEpTUCBmcmFnbWVudCBmaWxlLgotIyBDU1MgSlNQCi1UaXRsZV9JbnZhbGlkVmFsdWU9SW52YWxpZCBWYWx1ZQotTWVzc2FnZV9JbnZhbGlkVmFsdWU9SW52YWxpZCBwcm9wZXJ0eSB2YWx1ZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSnNVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pzVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmQ5Y2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSnNVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gCi0gKi8KLXB1YmxpYyBjbGFzcyBKc1VJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9KU1A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aW9uQ29udHJpYnV0b3JKU1BfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpTUFVJUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZE9jY3VycmVuY2VzX2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YV9Db250ZW50X0Fzc2lzdF9pc19ub3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUF9jaGFuZ2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUF9EZWxpbWl0ZXJzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUE1vdmVFbGVtZW50QWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VfSW52YWxpZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVFbGVtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRWxlbWVudFdpemFyZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVycmlkZV9tZXRob2RfaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWZhY3Rvcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUVsZW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlR3JvdXBfbmFtZUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYW1wbGVfSlNQX2RvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaXRsZV9JbnZhbGlkVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhKc1VJTWVzc2FnZXMuQlVORExFX05BTUUsIEpzVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoSnNVSU1lc3NhZ2VzLmZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJSnNVSU1lc3NhZ2VzLmZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShKc1VJTWVzc2FnZXMuQlVORExFX05BTUUpOwotCQkJfQotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJSnNVSU1lc3NhZ2VzLmZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIEpzVUlNZXNzYWdlcy5mUmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9Kc1VJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pzVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3NmM5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pzVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5KYXZhU2NyaXB0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBKc1VJUGx1Z2luIGluc3RhbmNlID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIEpzVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIEpzVUlQbHVnaW4uaW5zdGFuY2U7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpzVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBKc1VJUGx1Z2luLmluc3RhbmNlOwotCX0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUganNwIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUganNwIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JCi0JcHVibGljIEpzVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCUpzVUlQbHVnaW4uaW5zdGFuY2UgPSB0aGlzOwotCX0KLQkKLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUganNwIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBqc3AgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0vLyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3Ci0vLyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7Ci0vLyByZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFMTCk7Ci0vLyByZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0vLyByZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLlRBRyk7Ci0vLyByZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURSk7Ci0vLyByZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURV9WQUxVRSk7Ci0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeSA9IEphdmFTY3JpcHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvZGVUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGpzcCBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLS8vIGZUZW1wbGF0ZVN0b3JlID0gbmV3IENvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmUoCi0vLyBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLCBnZXRQcmVmZXJlbmNlU3RvcmUoKSwKLS8vIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCQkJSmF2YVNjcmlwdFBsdWdpbiBqcCA9IEphdmFTY3JpcHRQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQkJZlRlbXBsYXRlU3RvcmUgPSBqcC5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVTdG9yZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5Yzc1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBMb2dnZXIuRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBMb2dnZXIuSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIExvZ2dlci5PSzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgTG9nZ2VyLldBUk5JTkc7Ci0JCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gTG9nZ2VyLk9LX0RFQlVHIHx8IGxldmVsID09IExvZ2dlci5JTkZPX0RFQlVHIHx8IGxldmVsID09IExvZ2dlci5XQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IExvZ2dlci5FUlJPUl9ERUJVRykgewotCQkJaWYgKCFMb2dnZXIuaXNEZWJ1Z2dpbmcoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUc6Ci0JCQljYXNlIElORk86Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRzoKLQkJCWNhc2UgV0FSTklORzoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRzoKLQkJCWNhc2UgRVJST1I6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIExvZ2dlci5QTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKExvZ2dlci5QTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKExvZ2dlci5pc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBMb2dnZXIuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShMb2dnZXIuUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghTG9nZ2VyLmlzRGVidWdnaW5nKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihMb2dnZXIuUExVR0lOX0lEICsgTG9nZ2VyLlRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTG9nZ2VyLl9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl9sb2coTG9nZ2VyLkVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl9sb2coTG9nZ2VyLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlMb2dnZXIuX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvckpzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JKcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGMxOWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvckpzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFBdXRvSW5kZW50U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLlNtYXJ0U2VtaWNvbG9uQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LmphdmFkb2MuSmF2YURvY0F1dG9JbmRlbnRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBBdXRvRWRpdFN0cmF0ZWd5Rm9ySnMgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JcHJpdmF0ZSBJQXV0b0VkaXRTdHJhdGVneVtdIGZTdHJhdGVnaWVzOwotCQotCXB1YmxpYyBBdXRvRWRpdFN0cmF0ZWd5Rm9ySnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3RyYXRzID0gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKGRvY3VtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJhdHMubGVuZ3RoOyBpKyspIHsKLQkJCXN0cmF0c1tpXS5jdXN0b21pemVEb2N1bWVudENvbW1hbmQoZG9jdW1lbnQsIGNvbW1hbmQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGZTdHJhdGVnaWVzICE9IG51bGwpIHsKLQkJCXJldHVybiBmU3RyYXRlZ2llczsKLQkJfQotCQlTdHJpbmcgcGFydGl0aW9uaW5nID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJZlN0cmF0ZWdpZXMgPSBuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbXSB7IG5ldyBKYXZhRG9jQXV0b0luZGVudFN0cmF0ZWd5KHBhcnRpdGlvbmluZyksIG5ldyBTbWFydFNlbWljb2xvbkF1dG9FZGl0U3RyYXRlZ3kocGFydGl0aW9uaW5nKSwKLQkJCQluZXcgSmF2YUF1dG9JbmRlbnRTdHJhdGVneShwYXJ0aXRpb25pbmcsIGdldEphdmFQcm9qZWN0KGRvY3VtZW50KSkgfTsKLQkJLyogbmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzKCkgKi8KLQkJcmV0dXJuIGZTdHJhdGVnaWVzOwotCX0KLQkKLQlwcml2YXRlIElKYXZhU2NyaXB0UHJvamVjdCBnZXRKYXZhUHJvamVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJaWYgKGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJCXByb2plY3QgPSByb290LmdldFByb2plY3QoZmlsZVBhdGguc2VnbWVudCgwKSk7Ci0JCQl9Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJamF2YVByb2plY3QgPSBKYXZhU2NyaXB0Q29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBqYXZhUHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWI0NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Db25maWd1cmFibGVMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgQXV0b0VkaXRTdHJhdGVneUZvclRhYnMgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFCX0NIQVJBQ1RFUiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQkvLyBpZiBub3QgaW4gc21hcnQgaW5zZXJ0IG1vZGUganVzdCBpZ25vcmUKLQkJaWYgKCFpc1NtYXJ0SW5zZXJ0TW9kZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gc3BhY2VzIGZvciB0YWIgY2hhcmFjdGVyCi0JCWlmIChjb21tYW5kLmxlbmd0aCA9PSAwICYmIGNvbW1hbmQudGV4dCAhPSBudWxsICYmIGNvbW1hbmQudGV4dC5sZW5ndGgoKSA+IDAgJiYgY29tbWFuZC50ZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUikgIT0gLTEpIHsKLQkJCXNtYXJ0SW5zZXJ0Rm9yVGFiKGNvbW1hbmQsIGRvY3VtZW50KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGluZGVudGF0aW9uIHdpZHRoIGlmIHVzaW5nIHNwYWNlcyBmb3IgaW5kZW50YXRpb24sIC0xIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRJbmRlbnRhdGlvbldpZHRoKCkgewotCQlpbnQgd2lkdGggPSAtMTsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQl3aWR0aCA9IHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQkJfQotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCQotCS8qKgotCSAqIENhbGN1bGF0ZSBudW1iZXIgb2Ygc3BhY2VzIGZvciBuZXh0IHRhYiBzdG9wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKGludCBpbmRlbnRhdGlvbldpZHRoLCBpbnQgbGluZU9mZnNldCwgSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyLCBpbnQgaW5kZXgpIHsKLQkJaW50IGluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoOwotCQlpbnQgb2Zmc2V0SW5MaW5lID0gLTE7Ci0JCWlmIChsaW5lVHJhY2tlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBsaW5lVHJhY2tlci5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChpbmRleCk7Ci0JCQkJaWYgKGxpbmVJbmZvLmdldE9mZnNldCgpID09IDAgJiYgbGluZU9mZnNldCA+IC0xKSB7Ci0JCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCQl9IGVsc2UgewotCQkJCQlvZmZzZXRJbkxpbmUgPSBpbmRleCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobGluZU9mZnNldCA+IC0xKSB7Ci0JCQkJb2Zmc2V0SW5MaW5lID0gbGluZU9mZnNldCArIGluZGV4OwotCQkJfQotCQl9Ci0JCWlmIChvZmZzZXRJbkxpbmUgPiAtMSAmJiBpbmRlbnRhdGlvbldpZHRoID4gMCkgewotCQkJaW50IHJlbWFpbmRlciA9IG9mZnNldEluTGluZSAlIGluZGVudGF0aW9uV2lkdGg7Ci0JCQlpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aCAtIHJlbWFpbmRlcjsKLQkJfQotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudFNpemU7IGkrKykgewotCQkJaW5kZW50LmFwcGVuZCgnICcpOwotCQl9Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHVwIGEgbGluZSB0cmFja2VyIGZvciB0ZXh0IHdpdGhpbiBjb21tYW5kIGlmIHRleHQgaXMgbXVsdGktbGluZQotCSAqLwotCXByaXZhdGUgSUxpbmVUcmFja2VyIGdldExpbmVUcmFja2VyKElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIG9yaWdpbmFsVGV4dCkgewotCQlDb25maWd1cmFibGVMaW5lVHJhY2tlciBsaW5lVHJhY2tlciA9IG51bGw7Ci0JCWludFtdIGRlbGltcyA9IFRleHRVdGlsaXRpZXMuaW5kZXhPZihkb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCksIG9yaWdpbmFsVGV4dCwgMCk7Ci0JCWlmIChkZWxpbXNbMF0gIT0gLTEgfHwgZGVsaW1zWzFdICE9IC0xKSB7Ci0JCQlsaW5lVHJhY2tlciA9IG5ldyBDb25maWd1cmFibGVMaW5lVHJhY2tlcihkb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkpOwotCQkJbGluZVRyYWNrZXIuc2V0KG9yaWdpbmFsVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIGxpbmVUcmFja2VyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhY3RpdmUgZWRpdG9yIGlzIGluIHNtYXJ0IGluc2VydCBtb2RlLCBmYWxzZSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU21hcnRJbnNlcnRNb2RlKCkgewotCQlib29sZWFuIGlzU21hcnRJbnNlcnRNb2RlID0gZmFsc2U7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gY2hlY2sgaWYgc21hcnQgaW5zZXJ0IG1vZGUKLQkJaWYgKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKSB7Ci0JCQlpc1NtYXJ0SW5zZXJ0TW9kZSA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGlzU21hcnRJbnNlcnRNb2RlOwotCX0KLQkKLQkvKioKLQkgKiBJbnNlcnQgc3BhY2VzIGZvciB0YWJzCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JUYWIoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyB0YWIga2V5IHdhcyBwcmVzc2VkLiBub3cgY2hlY2sgcHJlZmVyZW5jZXMgdG8gc2VlIGlmIG5lZWQgdG8gaW5zZXJ0Ci0JCS8vIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYgotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IGdldEluZGVudGF0aW9uV2lkdGgoKTsKLQkJaWYgKGluZGVudGF0aW9uV2lkdGggPiAtMSkgewotCQkJU3RyaW5nIG9yaWdpbmFsVGV4dCA9IGNvbW1hbmQudGV4dDsKLQkJCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihvcmlnaW5hbFRleHQpOwotCQkJLy8gZGV0ZXJtaW5lIHdoZXJlIGluIGxpbmUgdGhpcyBjb21tYW5kIGJlZ2lucwotCQkJaW50IGxpbmVPZmZzZXQgPSAtMTsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGNvbW1hbmQub2Zmc2V0KTsKLQkJCQlsaW5lT2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgLSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCQlJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBnZXRMaW5lVHJhY2tlcihkb2N1bWVudCwgb3JpZ2luYWxUZXh0KTsKLQkJCWludCBzdGFydEluZGV4ID0gMDsKLQkJCWludCBpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnRTdHJpbmcoaW5kZW50YXRpb25XaWR0aCwgbGluZU9mZnNldCwgbGluZVRyYWNrZXIsIGluZGV4KTsKLQkJCQkvLyByZXBsYWNlIFx0IGNoYXJhY3RlciB3aXRoIHNwYWNlcwotCQkJCW5ld1RleHQucmVwbGFjZShpbmRleCwgaW5kZXggKyAxLCBpbmRlbnQpOwotCQkJCWlmIChsaW5lVHJhY2tlciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaW5lVHJhY2tlci5yZXBsYWNlKGluZGV4LCAxLCBpbmRlbnQpOwotCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHJlcGxhY2luZyB0ZXh0LCBqdXN0Ci0JCQkJCQkvLyByZXNldCB0byBjdXJyZW50IHN0cmluZwotCQkJCQkJbGluZVRyYWNrZXIuc2V0KG5ld1RleHQudG9TdHJpbmcoKSk7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3RhcnRJbmRleCA9IGluZGV4ICsgaW5kZW50Lmxlbmd0aCgpOwotCQkJCWluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIsIHN0YXJ0SW5kZXgpOwotCQkJfQotCQkJY29tbWFuZC50ZXh0ID0gbmV3VGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb21wbGV0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29tcGxldGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjMwYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuTGF6eUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTRFRDb21wbGV0aW9uUHJvcG9zYWwgZXh0ZW5kcyBKYXZhQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgewotCS8qCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCSAqIAotCSAqIFRoaXMgaXMgYSB3cmFwcGVkIHByb3Bvc2FsIHNvIHdlIGRvbid0IG5lZWQgdG8gbWFrZSAic2xvdyIgY2FsbHMgdG8gdGhlCi0JICogamF2YSBwcm9wb3NhbCB1cCBmcm9udCwgb25seSB3aGVuIG5lZWRlZCBmb3IgZXhhbXBsZSwgZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIHJlYWRzIGV4dGVybmFsIGphdmFkb2MsIGFuZCBpdCBtYWtlcyBubyBzZW5zZQotCSAqLwotCUlDb21wbGV0aW9uUHJvcG9zYWwgZkphdmFDb21wbGV0aW9uUHJvcG9zYWwgPSBudWxsOwotCQotCXB1YmxpYyBKU0RUQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgaW50IHJlcGxhY2VtZW50T2Zmc2V0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGludCBjdXJzb3JQb3NpdGlvbiwgSW1hZ2UgaW1hZ2UsCi0JCQlTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLAotCQkJYm9vbGVhbiB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpIHsKLQkJc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSk7Ci0JCXN1cGVyLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvc2l0aW9uKTsKLQkJc3VwZXIuc2V0Q29udGV4dEluZm9ybWF0aW9uKGNvbnRleHRJbmZvcm1hdGlvbik7Ci0vLyBzdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLAotLy8gY3Vyc29yUG9zaXRpb24sIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sCi0vLyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCByZWxldmFuY2UsCi0vLyB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIGN1cnNvciBwb3NpdGlvbiBhZnRlciBhcHBseWluZy4KLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlpZiAodGhpcy5mSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBpbnN0YW5jZW9mIExhenlKYXZhQ29tcGxldGlvblByb3Bvc2FsKQotCQl7Ci0JCQkoKExhenlKYXZhQ29tcGxldGlvblByb3Bvc2FsKXRoaXMuZkphdmFDb21wbGV0aW9uUHJvcG9zYWwpLmFwcGx5KHZpZXdlci5nZXREb2N1bWVudCgpLCB0cmlnZ2VyLCBvZmZzZXQpOwotCQl9Ci0JCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBvZmZzZXQpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCk7Ci0JCWlmIChqYXZhUHJvcG9zYWwgIT0gbnVsbCkgewotCQkJYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQl9Ci0JCXJldHVybiBhZGRpdGlvbmFsSW5mbzsKLQl9Ci0JCi0JZmluYWwgcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWwgZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbCgpIHsKLQkJcmV0dXJuIGZKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotCX0KLQkKLQlmaW5hbCBwdWJsaWMgdm9pZCBzZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKElDb21wbGV0aW9uUHJvcG9zYWwgamF2YUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQlmSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCA9IGphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZW50QXNzaXN0YW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRlbnRBc3Npc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhYzI3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRlbnRBc3Npc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVENvbnRlbnRBc3Npc3RhbnQgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCXByaXZhdGUgSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IgZkNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0JcHJpdmF0ZSBKU0RUVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IgZlRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yOwotCXByaXZhdGUgSnNUcmFuc2xhdGlvbkFkYXB0ZXIgZlRyYW5zbGF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIEpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3NvciBmSGh0bWxjb21wOwotCQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlWZWN0b3IgcHJvcG9zYWxzID0gbmV3IFZlY3RvcigpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcGxldGlvblByb3Bvc2FsczsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBlbmRTY3JpcHQgPSBnZXRIdG1sQ29udGVudEFzc2lzdFByb2Nlc3NvcigpLmdldEVuZFNjcmlwdFByb3Bvc2FsKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmKGVuZFNjcmlwdCE9bnVsbCkgewotCQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10ge2VuZFNjcmlwdH07Ci0JCQkvL3Byb3Bvc2Fscy5hZGQoZW5kU2NyaXB0KTsKLQkJfQotCQlKU0RUUHJvcG9zYWxDb2xsZWN0b3IgdGhlQ29sbGVjdG9yID0gZ2V0UHJvcG9zYWxDb2xsZWN0b3Iodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJLyogYWRkIGVuZCBzY3JpcHQgdGFnIGlmIG5lZWRlZCAqLwotCi0JCS8qIC0tLS0tLS0tLSBDb250ZW50IEFzc2lzdGFudCAtLS0tLS0tLS0gKi8KLQkJaWYodGhlQ29sbGVjdG9yPT1udWxsKSByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQotCQlnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkuc2V0UHJvcG9zYWxDb2xsZWN0b3IodGhlQ29sbGVjdG9yKTsKLQkJY29tcGxldGlvblByb3Bvc2FscyA9IGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlwcm9wb3NhbHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29tcGxldGlvblByb3Bvc2FscykpOwotCQkvKiBIVE1MIFByb3Bvc2FscyAqLwotCQljb21wbGV0aW9uUHJvcG9zYWxzID0gZ2V0SHRtbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlwcm9wb3NhbHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29tcGxldGlvblByb3Bvc2FscykpOwotCQkvKiAtLS0tLS0tLS0gdGVtcGxhdGUgY29tcGxldGlvbnMgLS0tLS0tLS0tICovCi0JCWdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLnNldFByb3Bvc2FsQ29sbGVjdG9yKHRoZUNvbGxlY3Rvcik7Ci0JCWNvbXBsZXRpb25Qcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlwcm9wb3NhbHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29tcGxldGlvblByb3Bvc2FscykpOwotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF0pOwotCX0KLQkKLQlwcml2YXRlIEpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3NvciBnZXRIdG1sQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJaWYgKGZIaHRtbGNvbXAgPT0gbnVsbCkgewotCQkJZkhodG1sY29tcCA9IG5ldyBKU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZkhodG1sY29tcDsKLQl9Ci0JCi0JcHJpdmF0ZSBKU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlpZiAoZkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZkNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0JfQotCXByaXZhdGUgSUpzVHJhbnNsYXRpb24gZ2V0SlNQVHJhbnNsYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodmlld2VyLmdldERvY3VtZW50KCkpOwotCQkJSURPTURvY3VtZW50IHhtbERvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZlRyYW5zbGF0aW9uQWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJZlRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJfQotCQkJaWYgKGZUcmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBmVHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKHRydWUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBnZXRKU1BUcmFuc2xhdGlvbih2aWV3ZXIsIG9mZnNldCk7Ci0JCWlmKHRyYW49PW51bGwpIHJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IEpTRFRQcm9wb3NhbENvbGxlY3Rvcih0cmFuKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKU0RUVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvciA9IG5ldyBKU0RUVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTcyZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNEVF9DT1JFX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGZKc3BTb3VyY2VQb3NpdGlvbiwgZkphdmFQb3NpdGlvbjsKLQlwcml2YXRlIEpTRFRQcm9wb3NhbENvbGxlY3RvciBmUHJvcG9zYWxDb2xsZWN0b3I7Ci0JcHJpdmF0ZSBKc1RyYW5zbGF0aW9uQWRhcHRlciBmVHJhbnNsYXRpb25BZGFwdGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0JCi0JcHVibGljIEpTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBjb21wbGV0aW9uIHByb3Bvc2FscyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uCi0JICogd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbgotCSAqIHdpdGhpbiB0aGUgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHByb3Bvc2FscwotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29tcGxldGlvbnMgc2hvdWxkIGJlCi0JICogICAgICAgICAgICBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLQkgKiAgICAgICAgIHByb3Bvc2FscyBhcmUgcG9zc2libGUKLQkgKi8KLQkKLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IHBvcykgewotCQlpbml0aWFsaXplKHBvcyk7Ci0JCUpTRFRQcm9wb3NhbENvbGxlY3RvciBjb2xsZWN0b3IgPSBudWxsOwotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB7Ci0JCQkJZlZpZXdlciA9IChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyOwotCQkJfQotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChmVHJhbnNsYXRpb25BZGFwdGVyID09IG51bGwpIHsKLQkJCQlmVHJhbnNsYXRpb25BZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQl9Ci0JCQlpZiAoZlRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBmVHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKHRydWUpOwotCQkJCWZKYXZhUG9zaXRpb24gPSBnZXREb2N1bWVudFBvc2l0aW9uKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJSUphdmFTY3JpcHRVbml0IGN1ID0gdHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCS8vIGNhbid0IGdldCBqYXZhIHByb3Bvc2FscyB3L291dCBhIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJLy8gb3Igd2l0aG91dCBhIHZhbGlkIHBvc2l0aW9uCi0JCQkJCWlmIChjdSA9PSBudWxsIHx8IC0xID09IGZKYXZhUG9zaXRpb24pIHsKLQkJCQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCQkJfQotCQkJCQljb2xsZWN0b3IgPSBnZXRQcm9wb3NhbENvbGxlY3RvcigpOwotCQkJCQlzeW5jaHJvbml6ZWQgKGN1KSB7Ci0JCQkJCQljdS5jb2RlQ29tcGxldGUoZkphdmFQb3NpdGlvbiwgY29sbGVjdG9yLCBudWxsKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY29yZUV4KSB7Ci0JCQkJCS8vIGEgcG9zc2libGUgSmF2YSBNb2RlbCBFeGNlcHRpb24gZHVlIHRvIG5vdCBiZWluZyBhIFdlYgotCQkJCQkvLyAoSmF2YSkgUHJvamVjdAotCQkJCQljb3JlRXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkvLyB0aHJvdyBvdXQgZXhjZXB0aW9ucyBvbiBjb2RlIGFzc2lzdC4KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJaWYgKGNvbGxlY3RvciAhPSBudWxsKSB7Ci0JCQlyZXN1bHRzID0gY29sbGVjdG9yLmdldEpTUENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJCWlmIChyZXN1bHRzID09IG51bGwgfHwgcmVzdWx0cy5sZW5ndGggPCAxKSB7Ci0JCQkJZkVycm9yTWVzc2FnZSA9IEpzVUlNZXNzYWdlcy5KYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV87Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgcG9zc2libGUgY29udGV4dHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwb3NzaWJsZQotCSAqICAgICAgICAgICAgY29udGV4dHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIHdoaWNoIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIHNob3VsZCBiZSBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29udGV4dCBpbmZvcm1hdGlvbiBvYmplY3RzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICBubyBjb250ZXh0IGNvdWxkIGJlIGZvdW5kCi0JICovCi0JCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBwcmVzc2VkIHNob3VsZCBhdXRvbWF0aWNhbGx5Ci0JICogZGlzcGxheSBjb250ZW50LWFzc2lzdCBwcm9wb3NhbHMuCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgb2YgY2hhcmFjdGVycwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dG9Qcm9wb3NhbEludm9jYXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gcHJlc3NlZCBzaG91bGQgYXV0b21hdGljYWxseQotCSAqIGRpc3BsYXkgYSBjb250ZW50LWFzc2lzdCB0aXAuCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgb2YgY2hhcmFjdGVycwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dG9UaXBJbnZvY2F0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCQotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgcHJlc2VudGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICogICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCQotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbGlkYXRvciB1c2VkIHRvIGRldGVybWluZSB3aGVuIGRpc3BsYXllZCBjb250ZXh0IGluZm9ybWF0aW9uCi0JICogc2hvdWxkIGJlIGRpc21pc3NlZC4gTWF5IG9ubHkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9jZXNzb3IKLQkgKiBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKi8KLQkKLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBnZXREb2N1bWVudFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkpzcFNvdXJjZVBvc2l0aW9uOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJLy8gVE9ETzogZ2V0IGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UKLQkJLy8gaWYgKGZDb2xsZWN0b3IuZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCAmJgotCQkvLyBmQ29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpLmxlbmd0aCgpID4gMCkKLQkJLy8gcmV0dXJuIGZDb2xsZWN0b3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCXJldHVybiBmRXJyb3JNZXNzYWdlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGdldFByb3Bvc2FsQ29sbGVjdG9yKCkgewotCQlyZXR1cm4gZlByb3Bvc2FsQ29sbGVjdG9yOwotCQkvLyByZXR1cm4gbmV3IEpTUFByb3Bvc2FsQ29sbGVjdG9yKHRyYW5zbGF0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgY29kZSBhc3Npc3QgcHJvY2Vzc29yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoaW50IHBvcykgewotCQlpbml0aWFsaXplSmF2YVBsdWdpbnMoKTsKLQkJZkpzcFNvdXJjZVBvc2l0aW9uID0gcG9zOwotCQlmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgSmF2YSBQbHVnaW5zIHRoYXQgdGhlIEpTUCBwcm9jZXNzb3IgcmVxdWlyZXMuIFNlZQotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM3NjUgV2Ugc2hvdWxkIG5vdCBjYWxsCi0JICogInN0YXJ0IiwgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UgdGhhdCBzdGF0ZSB0byBiZSByZW1lbWJlcmVkLCBhbmQKLQkgKiByZS1zdGFydGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoZSBuZXh0IGJvb3QgdXAgc2VxdWVuY2UuCi0JICogCi0JICogSVNTVUU6IHdlIG1heSBiZSBhYmxlIHRvIGdldCByaWQgb2YgdGhpcyBhbGwgdG9nZXRoZXIsIGluIGZ1dHVyZSwgc2luY2UKLQkgKiA5OSUgd2UgcHJvYmFibHkgaGF2ZSBhbHJlYWR5IHVzZWQgc29tZSBKRFQgY2xhc3MgYnkgdGhlIHRpbWUgd2UgbmVlZCBKRFQKLQkgKiB0byBiZSBhY3RpdmUgLi4uIGJ1dCAuLi4gdGhpcyBpcyB0aGUgc2FmZXN0IGZpeCBmb3IgdGhpcyBwb2ludCBpbiAxLjUKLQkgKiBzdHJlYW0uIE5leHQgcmVsZWFzZSwgbGV0J3MganVzdCByZW1vdmUgdGhpcywgcmUtZGlzY292ZXIgd2hhdCBldmVyIGJ1ZwotCSAqIHRoaXMgd2FzIGZpeGluZyAoaWYgYW55KSBhbmQgaWYgdGhlcmUgaXMgb25lLCB0aGVuIHdlJ2xsIGVpdGhlciBwdXQgYmFjawotCSAqIGluLCBhcyBpcywgb3IgY29tZSB1cCB3aXRoIGEgbW9yZSBhcHByb3ByaWF0ZSBmaXguCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCkgewotCQl0cnkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShKU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3Nvci5KU0RUX0NPUkVfUExVR0lOX0lEKTsKLQkJCWJ1bmRsZS5sb2FkQ2xhc3MoImR1bW15Q2xhc3NOYW1lVGhhdFNob3VsZE5ldmVyRXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHRoaXMgaXMgdGhlIGV4cGVjdGVkIHJlc3VsdCwgd2UganVzdCB3YW50IHRvCi0JCQkvLyBudWRnZSB0aGUgYnVuZGxlIHRvIGJlIHN1cmUgaXRzIGFjdGl2YXRlZC4KLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmVHJhbnNsYXRpb25BZGFwdGVyID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcG9zYWxDb2xsZWN0b3IoSlNEVFByb3Bvc2FsQ29sbGVjdG9yIHRyYW5zbGF0aW9uKSB7Ci0JCXRoaXMuZlByb3Bvc2FsQ29sbGVjdG9yID0gdHJhbnNsYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU0MTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnRleHQuamF2YS5KYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVENvbnRldEFzc2lzdEludm9jYXRpb25Db250ZXh0IGV4dGVuZHMgSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCB7Ci0JcHVibGljIHN0YXRpYyBKU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgZ2V0SW5zdGFuY2UoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0LCBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgdGhlQ29sbGVjdG9yKSB7Ci0JCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBKU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQuZ2V0SlNQVHJhbnNsYXRpb24odmlld2VyKTsKLQkJcmV0dXJuIG5ldyBKU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQodmlld2VyLCBvZmZzZXQsIHRoZUNvbGxlY3Rvcik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElKc1RyYW5zbGF0aW9uIGdldEpTUFRyYW5zbGF0aW9uKElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlJSnNUcmFuc2xhdGlvbiBmVHJhbnNsYXRpb24gPSBudWxsOwotCQkKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGZUcmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCWlmIChmVHJhbnNsYXRpb25BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlmVHJhbnNsYXRpb24gPSBmVHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKHRydWUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUcmFuc2xhdGlvbjsKLQl9Ci0JSVRleHRWaWV3ZXIgdmlld2VyOwotCQotCXByaXZhdGUgSlNEVENvbnRldEFzc2lzdEludm9jYXRpb25Db250ZXh0KElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCwgSlNEVFByb3Bvc2FsQ29sbGVjdG9yIHRoZUNvbGxlY3RvcikgewotCQlzdXBlcih2aWV3ZXIsIG9mZnNldCwgbnVsbCk7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQkvLyB0aGlzLm9mZnNldD1nZXRKU1BUcmFuc2xhdGlvbigpLmdldEphdmFPZmZzZXQob2Zmc2V0KTsKLQkJLy8gQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yIHRoZUNvbGxlY3RvciA9IGdldFByb3Bvc2FsQ29sbGVjdG9yKCk7Ci0JCXN1cGVyLnNldENvbGxlY3Rvcih0aGVDb2xsZWN0b3IpOwotCX0KLQkKLS8vIHB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0vLyByZXR1cm4KLS8vICgoSlNQVHJhbnNsYXRpb25FeHRlbnNpb24pZ2V0SlNQVHJhbnNsYXRpb24odmlld2VyKSkuZ2V0SmF2YURvY3VtZW50KCk7Ci0vLyAgICAgIAotLy8gfQotLy8gcHJvdGVjdGVkIENvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3RvciBnZXRQcm9wb3NhbENvbGxlY3RvcigpIHsKLS8vICAgICAgIAotLy8gcmV0dXJuICgoQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yKSAoIG5ldyBKU1BQcm9wb3NhbENvbGxlY3RvcigKLS8vIGdldEpTUFRyYW5zbGF0aW9uKCkpICkpOwotLy8gfQotCQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQl9Ci0vLyBwdWJsaWMgSUphdmFTY3JpcHRVbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLS8vIHJldHVybiBnZXRKU1BUcmFuc2xhdGlvbih2aWV3ZXIpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotLy8gfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWZlMTYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JCi0JcHVibGljIEpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3NvcigpIHt9Ci0JCi0JCi0JCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJLyogYWRkIDwvc2NyaXB0IGlmIG5lY2lzYXJ5ICovCi0JCUFycmF5TGlzdCBhbGxQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBnZXRKU1BUcmFuc2xhdGlvbih2aWV3ZXIpOwotCQlpbnQgbWlzc2luZ0F0T2Zmc2V0ID0gdHJhbi5nZXRNaXNzaW5nVGFnU3RhcnQoKTsKLQkJCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKWFsbFByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2FsbFByb3Bvc2Fscy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWwgZ2V0RW5kU2NyaXB0UHJvcG9zYWwoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCS8qIGFkZCA8L3NjcmlwdCBpZiBuZWNpc2FyeSAqLwotCQotCQlJSnNUcmFuc2xhdGlvbiB0cmFuID0gZ2V0SlNQVHJhbnNsYXRpb24odmlld2VyKTsKLQkJaWYodHJhbj09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQlpbnQgbWlzc2luZ0F0T2Zmc2V0ID0gdHJhbi5nZXRNaXNzaW5nVGFnU3RhcnQoKTsKLQkJCi0JCWlmKG9mZnNldD49bWlzc2luZ0F0T2Zmc2V0JiYgbWlzc2luZ0F0T2Zmc2V0Pi0xKSB7Ci0JCQkKLQkJCVN0cmluZyBhbGxUZXh0ID0gdmlld2VyLmdldERvY3VtZW50KCkuZ2V0KCk7Ci0JCQlTdHJpbmcgdGV4dCA9ICI8L3NjcmlwdD4iOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWludCBzdGFydEluVGFnID0gLTE7Ci0JCQlpbnQgcmVwbGFjZUxlbmd0aCA9MDsKLQkJCQotCQkJZm9yKGludCBpPTA7aTx0ZXh0Lmxlbmd0aCgpICYmIGFsbFRleHQubGVuZ3RoKCk+b2Zmc2V0LTE7aSsrKSB7Ci0JCQkJaWYoYWxsVGV4dC5jaGFyQXQob2Zmc2V0LTEpPT10ZXh0LmNoYXJBdChpKSkgewotCQkJCQlzdGFydEluVGFnID0gaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihzdGFydEluVGFnPT0tMSApIHsKLQkJCQlTdHJpbmcgZGlzcGxheVRleHQgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIkpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci4xIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXG4iICsgdGV4dCArICJcbiIgLG9mZnNldCwwLG9mZnNldCxudWxsLGRpc3BsYXlUZXh0LG51bGwsTWVzc2FnZXMuZ2V0U3RyaW5nKCJKU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuNCIpLDEwMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQkKLQkJCVN0cmluZyB0ZXh0MSA9IGFsbFRleHQuc3Vic3RyaW5nKG9mZnNldCAtIHN0YXJ0SW5UYWcgLSAxLCBvZmZzZXQpLnRvTG93ZXJDYXNlKCk7Ci0JCQlTdHJpbmcgdGV4dDIgPSB0ZXh0LnN1YnN0cmluZygwLCBzdGFydEluVGFnKzEpLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZihzdGFydEluVGFnPi0xICAmJiB0ZXh0Mi5jb21wYXJlVG8odGV4dDEpPT0wICkgewotCQkJCVN0cmluZyBkaXNwbGF5VGV4dCA9IE1lc3NhZ2VzLmdldFN0cmluZygiSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHRleHQgICxvZmZzZXQtc3RhcnRJblRhZy0xLDAsdGV4dC5sZW5ndGgoKSxudWxsLGRpc3BsYXlUZXh0LG51bGwsTWVzc2FnZXMuZ2V0U3RyaW5nKCJKU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuNiIpLDEwMCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBnZXRKU1BUcmFuc2xhdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgZlRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCi0JCQlpZiAoZlRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZUcmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVFByb3Bvc2FsQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjc1NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRQcm9wb3NhbENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnRleHQuamF2YS5Db21wbGV0aW9uUHJvcG9zYWxDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotCi0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGV4dGVuZHMgQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yIHsKLQlzdGF0aWMgY2hhcltdIGdldFR5cGVUcmlnZ2VycygpIHsKLQkJcmV0dXJuIENvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3Rvci5UWVBFX1RSSUdHRVJTOwotCX0KLQlwcml2YXRlIENvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBmVHJhbnNsYXRpb247Ci0JCi0vLyBwdWJsaWMgTGlzdCBnZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCl7Ci0vLyBpZihmR2VuZXJhdGVkRnVuY3Rpb25OYW1lcz09bnVsbCl7Ci0vLyBmR2VuZXJhdGVkRnVuY3Rpb25OYW1lcyA9IGZUcmFuc2xhdGlvbi5nZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCk7Ci0vLyB9Ci0vLyByZXR1cm4gZkdlbmVyYXRlZEZ1bmN0aW9uTmFtZXM7Ci0vLyB9Ci0JcHVibGljIEpTRFRQcm9wb3NhbENvbGxlY3RvcihJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbikgewotCQlzdXBlcih0cmFuc2xhdGlvbiE9bnVsbD90cmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKTpudWxsKTsKLQkJaWYgKHRyYW5zbGF0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkpTUFRyYW5zbGF0aW9uIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmVHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQ2FjbHVhdGVzIHRoZSB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBhZnRlciBhcHBseWluZyB0aGlzIHByb3Bvc2FsLgotCSAqIGVnLiBtZXRob2QofCkgaWYgdGhlIG1ldGhvZCBwcm9wb3NhbCBjaG9zZW4gaGFkIHBhcmFtcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcG9zYWwKLQkgKiBAcGFyYW0gY29tcGxldGlvbgotCSAqIEBwYXJhbSBjdXJyZW50Q3Vyc29yT2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVBvc2l0aW9uQWZ0ZXIoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsLCBTdHJpbmcgY29tcGxldGlvbiwgaW50IGN1cnJlbnRDdXJzb3JPZmZzZXQpIHsKLQkJLy8gY2FsY3VsYXRlIGN1cnNvciBwb3NpdGlvbiBhZnRlcgotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4Mzk4Ci0JCS8vIGludCBwb3NpdGlvbkFmdGVyID0gY3VycmVudEN1cnNvck9mZnNldCtjb21wbGV0aW9uLmxlbmd0aCgpOwotCQlpbnQgcG9zaXRpb25BZnRlciA9IGNvbXBsZXRpb24ubGVuZ3RoKCk7Ci0JCWludCBraW5kID0gcHJvcG9zYWwuZ2V0S2luZCgpOwotCQkvLyBtYXkgbmVlZCBiZXR0ZXIgbG9naWMgaGVyZS4uLgotCQkvLyBwdXQgY3Vyc29yIGluc2lkZSBwYXJlbnRoZXNpcyBpZiB0aGVyZSdzIHBhcmFtcwotCQkvLyBvbmx5IGNoZWNraW5nIGZvciBhbnkga2luZCBvZiBkZWNsYXJhdGlvbgotCQlpZiAoa2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OIHx8IGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9ERUNMQVJBVElPTiB8fCBraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5QT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OIHx8IGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpIHsKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhTdHJpbmcudmFsdWVPZihwcm9wb3NhbC5nZXRTaWduYXR1cmUoKSkpOwotCQkJaWYgKGNvbXBsZXRpb24ubGVuZ3RoKCkgPiAwICYmIHBhcmFtcy5sZW5ndGggPiAwKSB7Ci0JCQkJcG9zaXRpb25BZnRlci0tOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3NpdGlvbkFmdGVyOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvOiAtIHRyYW5zbGF0ZSBKYXZhIC0+IEpTUCBvZmZzZXRzIC0gZml4Ci0JICogY3Vyc29yLXBvc2l0aW9uLWFmdGVyIC0gZml4IG1hbmdsZWQgc2VydmxldCBuYW1lIGluIGRpc3BsYXkgc3RyaW5nIC0KLQkgKiByZW1vdmUgdW53YW50ZWQgcHJvcG9zYWxzIChzZXJ2bGV0IGNvbnN0cnVjdG9yKQotCSAqLwotCQotCXByb3RlY3RlZCBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQlKU0RUQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsID0gbnVsbDsKLQkJLy8gaWdub3JlIGNvbnN0cnVjdG9yIHByb3Bvc2FscyAodGhleSdyZSBub3QgcmVsZXZhbnQgZm9yIG91ciBKU1AKLQkJLy8gcHJvcG9zYWwgbGlzdCkKLQkJaWYgKCFwcm9wb3NhbC5pc0NvbnN0cnVjdG9yKCkpIHsKLS8vIGlmIChwcm9wb3NhbC5nZXRLaW5kKCkgPT0gQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSB7Ci0vLyBTdHJpbmcgc2lnbmF0dXJlID0gU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwKLS8vIC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKTsKLS8vIFN0cmluZyBjb21wbGV0aW9uID0gU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLS8vIGlmIChjb21wbGV0aW9uLmluZGV4T2Yoc2lnbmF0dXJlKSAhPSAtMSkgewotLy8ganNwUHJvcG9zYWwgPSBjcmVhdGVBdXRvSW1wb3J0UHJvcG9zYWwocHJvcG9zYWwpOwotLy8gfQotLy8gfQotCQkJLy8gZGVmYXVsdCBiZWhhdmlvcgotLy8gaWYgKGpzcFByb3Bvc2FsID09IG51bGwpIHsKLS8vIGZvcihpbnQgaSA9IDA7aTxnZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCkuc2l6ZSgpO2krKyl7Ci0vLyBpZigobmV3Ci0vLyBTdHJpbmcocHJvcG9zYWwuZ2V0TmFtZSgpKSkuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKWdldEdlbmVyYXRlZEZ1bmN0aW9uTmFtZXMoKS5nZXQoaSkpKQotLy8gcmV0dXJuIGpzcFByb3Bvc2FsOwotLy8gfQotCQkJanNwUHJvcG9zYWwgPSBjcmVhdGVKc3BQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCX0KLQkKLS8vIHByaXZhdGUgSlNQQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUF1dG9JbXBvcnRQcm9wb3NhbCgKLS8vIENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotLy8KLS8vIEpTUENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbCA9IG51bGw7Ci0vLwotLy8gU3RyaW5nIHNpZ25hdHVyZSA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSk7Ci0vLyBTdHJpbmcgY29tcGxldGlvbiA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLS8vCi0vLyAvLyBpdCdzIGZ1bGx5IHF1YWxpZmllZCBzbyB3ZSBzaG91bGQKLS8vIC8vIGFkZCBhbiBpbXBvcnQgc3RhdGVtZW50Ci0vLyAvLyBjcmVhdGUgYW4gYXV0b2ltcG9ydCBwcm9wb3NhbAotLy8gU3RyaW5nIG5ld0NvbXBsZXRpb24gPSBjb21wbGV0aW9uLnJlcGxhY2VBbGwoc2lnbmF0dXJlICsgIi4iLCAiIik7Ci0vLyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCi0vLyAvLyBqYXZhIG9mZnNldAotLy8gaW50IG9mZnNldCA9IHByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpOwotLy8gLy8gcmVwbGFjZW1lbnQgbGVuZ3RoCi0vLyBpbnQgbGVuZ3RoID0gcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpIC0gb2Zmc2V0OwotLy8gLy8gdHJhbnNsYXRlIG9mZnNldCBmcm9tIEphdmEgPiBKU1AKLS8vIG9mZnNldCA9IGZUcmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQob2Zmc2V0KTsKLS8vIC8vIGN1cnNvciBwb3NpdGlvbiBhZnRlciBtdXN0IGJlIGNhbGN1bGF0ZWQKLS8vIGludCBwb3NpdGlvbkFmdGVyID0gY2FsY3VsYXRlUG9zaXRpb25BZnRlcihwcm9wb3NhbCwgbmV3Q29tcGxldGlvbiwKLS8vIG9mZnNldCk7Ci0vLwotLy8gLy8gZnJvbSBqYXZhIHByb3Bvc2FsCi0vLyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBzdXBlcgotLy8gLmNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwpOwotLy8gcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKTsKLS8vIEltYWdlIGltYWdlID0gamF2YVByb3Bvc2FsLmdldEltYWdlKCk7Ci0vLyBTdHJpbmcgZGlzcGxheVN0cmluZyA9IGphdmFQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0vLyBkaXNwbGF5U3RyaW5nID0gZ2V0VHJhbnNsYXRpb24oKS5maXh1cE1hbmdsZWROYW1lKGRpc3BsYXlTdHJpbmcpOwotLy8gSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24gPSBqYXZhUHJvcG9zYWwKLS8vIC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLS8vIC8vIGRvbid0IGRvIHRoaXMsIGl0J3Mgc2xvdwotLy8gLy8gU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gamF2YVByb3Bvc2FsLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLS8vIGludCByZWxldmFuY2UgPSBqYXZhUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCk7Ci0vLwotLy8gYm9vbGVhbiB1cGRhdGVMZW5ndGhPblZhbGlkYXRlID0gdHJ1ZTsKLS8vCi0vLyBqc3BQcm9wb3NhbCA9IG5ldyBBdXRvSW1wb3J0UHJvcG9zYWwoY29tcGxldGlvbiwgbmV3Q29tcGxldGlvbiwgb2Zmc2V0LAotLy8gbGVuZ3RoLCBwb3NpdGlvbkFmdGVyLCBpbWFnZSwgZGlzcGxheVN0cmluZywKLS8vIGNvbnRleHRJbmZvcm1hdGlvbiwgbnVsbCwgcmVsZXZhbmNlLCB1cGRhdGVMZW5ndGhPblZhbGlkYXRlKTsKLS8vCi0vLyAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDgzCi0vLyAvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbgotLy8gLy8gZGVtYW5kCi0vLyBqc3BQcm9wb3NhbC5zZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKGphdmFQcm9wb3NhbCk7Ci0vLwotLy8gcmV0dXJuIGpzcFByb3Bvc2FsOwotLy8gfQotCXByaXZhdGUgSlNEVENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVKc3BQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJSlNEVENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbDsKLQkJU3RyaW5nIGNvbXBsZXRpb24gPSBTdHJpbmcudmFsdWVPZihwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCkpOwotCQkvLyBqYXZhIG9mZnNldAotCQlpbnQgb2Zmc2V0ID0gcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCk7Ci0JCS8vIHJlcGxhY2VtZW50IGxlbmd0aAotCQlpbnQgbGVuZ3RoID0gcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpIC0gb2Zmc2V0OwotCQkvLyB0cmFuc2xhdGUgb2Zmc2V0IGZyb20gSmF2YSA+IEpTUAotCQkvLyBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgbXVzdCBiZSBjYWxjdWxhdGVkCi0JCWludCBwb3NpdGlvbkFmdGVyID0gY2FsY3VsYXRlUG9zaXRpb25BZnRlcihwcm9wb3NhbCwgY29tcGxldGlvbiwgb2Zmc2V0KTsKLQkJLy8gZnJvbSBqYXZhIHByb3Bvc2FsCi0JCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IHN1cGVyLmNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwpOwotCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpOwotCQlJbWFnZSBpbWFnZSA9IGphdmFQcm9wb3NhbC5nZXRJbWFnZSgpOwotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IGphdmFQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0JCWRpc3BsYXlTdHJpbmcgPSBnZXRUcmFuc2xhdGlvbigpLmZpeHVwTWFuZ2xlZE5hbWUoZGlzcGxheVN0cmluZyk7Ci0vLyBmb3IoaW50IGkgPSAwO2k8Z2V0R2VuZXJhdGVkRnVuY3Rpb25OYW1lcygpLnNpemUoKTtpKyspewotLy8gZGlzcGxheVN0cmluZy5yZXBsYWNlKChTdHJpbmcpZ2V0R2VuZXJhdGVkRnVuY3Rpb25OYW1lcygpLmdldChpKSwgIiIpOwotLy8gfQotCQlJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiA9IGphdmFQcm9wb3NhbC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLQkJLy8gU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gamF2YVByb3Bvc2FsLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJaW50IHJlbGV2YW5jZSA9IGphdmFQcm9wb3NhbC5nZXRSZWxldmFuY2UoKTsKLQkJYm9vbGVhbiB1cGRhdGVMZW5ndGhPblZhbGlkYXRlID0gdHJ1ZTsKLQkJanNwUHJvcG9zYWwgPSBuZXcgSlNEVENvbXBsZXRpb25Qcm9wb3NhbChjb21wbGV0aW9uLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb25BZnRlciwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgbnVsbCwgcmVsZXZhbmNlLCB1cGRhdGVMZW5ndGhPblZhbGlkYXRlKTsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCQkvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbgotCQkvLyBkZW1hbmQKLQkJanNwUHJvcG9zYWwuc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhUHJvcG9zYWwpOwotCQlyZXR1cm4ganNwUHJvcG9zYWw7Ci0JfQotCQotCXByaXZhdGUgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkgewotCQlpZiAoZkNvbXBhcmF0b3IgPT0gbnVsbCkgewotCQkJZkNvbXBhcmF0b3IgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsQ29tcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBmQ29tcGFyYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHdlIG9ubHkgcmV0dXJuIEpTUENvbXBsZXRpb25Qcm9wb3NhbHMuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBKU1BDb21wbGV0aW9uUHJvcG9zYWxzCi0JICovCi0JcHVibGljIEpTRFRDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRKU1BDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gamF2YVByb3Bvc2FscyA9IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCS8vIG5lZWQgdG8gZmlsdGVyIG91dCBub24gSlNQQ29tcGxldGlvblByb3Bvc2FscwotCQkvLyBiZWNhdXNlIHRoZWlyIG9mZnNldHMgaGF2ZW4ndCBiZWVuIHRyYW5zbGF0ZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhUHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoamF2YVByb3Bvc2Fsc1tpXSBpbnN0YW5jZW9mIEpTRFRDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQkJCQlyZXN1bHRzLmFkZChqYXZhUHJvcG9zYWxzW2ldKTsKLQkJCX0KLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMsIGdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiAoSlNEVENvbXBsZXRpb25Qcm9wb3NhbFtdKSByZXN1bHRzLnRvQXJyYXkobmV3IEpTRFRDb21wbGV0aW9uUHJvcG9zYWxbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIElKc1RyYW5zbGF0aW9uIGdldFRyYW5zbGF0aW9uKCkgewotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVFRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVFRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOTgxNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuVGVtcGxhdGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS50ZXh0LmphdmEuSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IgewotCVRlbXBsYXRlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZkphdmFUZW1wbGF0ZUNvbXBsZXRpb247Ci0JSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGZQcm9wb3NhbENvbGxlY3RvcjsKLQlKc1RyYW5zbGF0aW9uQWRhcHRlciBmVHJhbnNsYXRpb25BZGFwdGVyOwotCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQkKLQlwdWJsaWMgSlNEVFRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yKCkgewotCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0JCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0ID0gZ2V0SW52b2NhdGlvbkNvbnRleHQodmlld2VyLCBvZmZzZXQpOwotCQlMaXN0IHByb3BzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGNvbnRleHQsIG1vbml0b3IpOwotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHt9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGdldEludm9jYXRpb25Db250ZXh0KElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gSlNEVENvbnRldEFzc2lzdEludm9jYXRpb25Db250ZXh0LmdldEluc3RhbmNlKHZpZXdlciwgb2Zmc2V0LCBnZXRQcm9wb3NhbENvbGxlY3RvcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpTRFRQcm9wb3NhbENvbGxlY3RvciBnZXRQcm9wb3NhbENvbGxlY3RvcigpIHsKLQkJcmV0dXJuIGZQcm9wb3NhbENvbGxlY3RvcjsKLQkJLy8gcmV0dXJuIG5ldyBKU1BQcm9wb3NhbENvbGxlY3Rvcih0cmFuc2xhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgVGVtcGxhdGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyKCkgewotCQlpZiAoZkphdmFUZW1wbGF0ZUNvbXBsZXRpb24gPT0gbnVsbCkgewotCQkJZkphdmFUZW1wbGF0ZUNvbXBsZXRpb24gPSBuZXcgVGVtcGxhdGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpOwotCQl9Ci0JCXJldHVybiBmSmF2YVRlbXBsYXRlQ29tcGxldGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcG9zYWxDb2xsZWN0b3IoSlNEVFByb3Bvc2FsQ29sbGVjdG9yIHRyYW5zbGF0aW9uKSB7Ci0JCXRoaXMuZlByb3Bvc2FsQ29sbGVjdG9yID0gdHJhbnNsYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5ZTIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZGY4MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjE9PD4gZW5kIHdpdGggPC9zY3JpcHQ+Ci1KU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuND1DbG9zZSB0aGUgc2NyaXB0IHRhZy4KLUpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci41PTw+IGVuZCB3aXRoIDwvc2NyaXB0PgotSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjY9Q2xvc2UgdGhlIHNjcmlwdCB0YWcuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5M2Q0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2luZ2xlQ2hhclJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBhcyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNoOwotCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAtMSkgewotCQkJYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZCgpCi0JICovCi0JCi0JcHVibGljIGFic3RyYWN0IGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWQoY2hhcltdLGludCxpbnQpCi0JICovCi0JCi0JcHVibGljIGludCByZWFkKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgZW5kID0gb2ZmICsgbGVuOwotCQlmb3IgKGludCBpID0gb2ZmOyBpIDwgZW5kOyBpKyspIHsKLQkJCWludCBjaCA9IHJlYWQoKTsKLQkJCWlmIChjaCA9PSAtMSkgewotCQkJCWlmIChpID09IG9mZikgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXJldHVybiBpIC0gb2ZmOwotCQkJfQotCQkJY2J1ZltpXSA9IChjaGFyKSBjaDsKLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkeSgpCi0JICovCi0JCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5ZjVkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQWN0aW9uQ29udHJpYnV0b3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSUFjdGlvbkNvbnN0YW50c0pzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5JQWN0aW9uRGVmaW5pdGlvbklkc0pzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnRyaWJ1dG9ySlNQIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3JIVE1MIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZSIsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBtb3ZlRWxlbWVudEFjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJTWVudU1hbmFnZXIgcmVmYWN0b3JNZW51ID0gbnVsbDsKLQlwcml2YXRlIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiByZW5hbWVFbGVtZW50QWN0aW9uID0gbnVsbDsKLQkKLQlwdWJsaWMgQWN0aW9uQ29udHJpYnV0b3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEpzVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKGJ1bmRsZSwgSUFjdGlvbkNvbnN0YW50c0pzLkFDVElPTl9OQU1FX1JFTkFNRV9FTEVNRU5UICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCXRoaXMucmVuYW1lRWxlbWVudEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUFjdGlvbkRlZmluaXRpb25JZHNKcy5SRU5BTUVfRUxFTUVOVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLCBJSGVscENvbnRleHRJZHMuSlNQX1JFRkFDVE9SUkVOQU1FX0hFTFBJRCk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKGJ1bmRsZSwgSUFjdGlvbkNvbnN0YW50c0pzLkFDVElPTl9OQU1FX01PVkVfRUxFTUVOVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJQWN0aW9uRGVmaW5pdGlvbklkc0pzLk1PVkVfRUxFTUVOVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5tb3ZlRWxlbWVudEFjdGlvbiwgSUhlbHBDb250ZXh0SWRzLkpTUF9SRUZBQ1RPUk1PVkVfSEVMUElEKTsKLQkJLy8gdGhlIHJlZmFjdG9yIG1lbnUsIGFkZCB0aGUgbWVudSBpdHNlbGYgdG8gYWRkIGFsbCByZWZhY3RvciBhY3Rpb25zCi0JCXRoaXMucmVmYWN0b3JNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKEpzVUlNZXNzYWdlcy5BY3Rpb25Db250cmlidXRvckpTUF8wLCBSZWZhY3RvckFjdGlvbkdyb3VwLk1FTlVfSUQpOwotCQlyZWZhY3Rvck1lbnUuYWRkKHRoaXMucmVuYW1lRWxlbWVudEFjdGlvbik7Ci0JCXJlZmFjdG9yTWVudS5hZGQodGhpcy5tb3ZlRWxlbWVudEFjdGlvbik7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5hZGRUb01lbnUobWVudSk7Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQsIHRoaXMucmVmYWN0b3JNZW51KTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEFjdGlvbkNvbnRyaWJ1dG9ySlNQLkVESVRPUl9JRFM7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCXRoaXMucmVuYW1lRWxlbWVudEFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKGdldFRleHRFZGl0b3IoZ2V0QWN0aXZlRWRpdG9yUGFydCgpKSwgSUFjdGlvbkNvbnN0YW50c0pzLkFDVElPTl9OQU1FX1JFTkFNRV9FTEVNRU5UKSk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbihnZXRUZXh0RWRpdG9yKGdldEFjdGl2ZUVkaXRvclBhcnQoKSksIElBY3Rpb25Db25zdGFudHNKcy5BQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDQxOGZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlQbHVnaW47Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0JLy8gSlNQIEZyYWdtZW50IFByb3BlcnR5IFBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRlJBR01FTlRfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJqc3BmMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gSlNQIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCArIl9zb3VyY2VfSGVscElkIjsgLy8kTk9OLU5MUy0xJAotCS8vIEpTUCBOZXcgRmlsZSBXaXphcmQgLSBUZW1wbGF0ZSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQgPSBJSGVscENvbnRleHRJZHMuUFJFRklYICsgImpzcHcwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8vIEpTUCBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfRklMRVNfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJ3ZWJ4MDA1MCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgU3R5bGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJ3ZWJ4MDA1MSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgVGVtcGxhdGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJ3ZWJ4MDA1MiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBSZWZhY3RvciBNb3ZlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JFRkFDVE9STU9WRV9IRUxQSUQgPSBJSGVscENvbnRleHRJZHMuUFJFRklYICsgImpzcHIwMDIwIjsgLy8kTk9OLU5MUy0xJAotCS8vIEpTUCBTb3VyY2UgRWRpdG9yIENvbnRleHQgTWVudQotCS8vIFJlZmFjdG9yIFJlbmFtZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9SRUZBQ1RPUlJFTkFNRV9IRUxQSUQgPSBJSGVscENvbnRleHRJZHMuUFJFRklYICsgImpzcHIwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBKc1VJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU0RULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU0RULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMGU2NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZm9ybWF0dGVyLkNvZGVGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZXh0LnV0aWwuQ29kZUZvcm1hdHRlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuZm9ybWF0dGVyLkRlZmF1bHRDb2RlRm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBGb3JtYXR0aW5nU3RyYXRlZ3lKU0RUIGV4dGVuZHMgQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcmVnaW9uU3RhcnRJbmRlbnRMZXZlbCA9IDE7Ci0JLyoqIERvY3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmRG9jdW1lbnRzID0gbmV3IExpbmtlZExpc3QoKTsKLQkvKiogUGFydGl0aW9ucyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmUGFydGl0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JcHJpdmF0ZSBpbnQgc3RhcnRJbmRlbnRMZXZlbDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGphdmEgZm9ybWF0dGluZyBzdHJhdGVneS4KLQkgKi8KLQlwdWJsaWMgRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JY2xhc3MgTW9kZWxJcnJpdGFudCBpbXBsZW1lbnRzIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyIHsKLQkJcHVibGljIE1vZGVsSXJyaXRhbnQoSURvY3VtZW50IGF0dGFjaGVkRG9jKSB7fQotCQkKLQkJcHVibGljIHZvaWQgZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkJZG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcih0aGlzKTsKLQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnJlcGxhY2UoMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCksIGRvY3VtZW50LmdldCgpKTsKLQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdCgpCi0JICovCi0JCi0JcHVibGljIHZvaWQgZm9ybWF0KCkgewotCQlzdXBlci5mb3JtYXQoKTsKLQkJZmluYWwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnRzLnJlbW92ZUZpcnN0KCk7Ci0JCWZpbmFsIFR5cGVkUG9zaXRpb24gcGFydGl0aW9uID0gKFR5cGVkUG9zaXRpb24pIGZQYXJ0aXRpb25zLnJlbW92ZUZpcnN0KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIEpTUFRyYW5zbGF0aW9uVXRpbCB0cmFuc2xhdGlvblV0aWwgPSBuZXcKLQkJCQkvLyBKU1BUcmFuc2xhdGlvblV0aWwoZG9jdW1lbnQpOwotCQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb24oZG9jdW1lbnQpOwotCQkJCUlKYXZhU2NyaXB0VW5pdCBjdSA9IHRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCWlmIChjdSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBjdVNvdXJjZSA9IGN1LmdldFNvdXJjZSgpOwotCQkJCQlpbnQgamF2YVN0YXJ0ID0gcGFydGl0aW9uLmdldE9mZnNldCgpOwotCQkJCQlpbnQgamF2YUxlbmd0aCA9IHBhcnRpdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQkJVGV4dEVkaXQgZWRpdCA9IENvZGVGb3JtYXR0ZXJVdGlsLmZvcm1hdDIoQ29kZUZvcm1hdHRlci5LX0pBVkFTQ1JJUFRfVU5JVCwgY3VTb3VyY2UsIGphdmFTdGFydCwgamF2YUxlbmd0aCwgc3RhcnRJbmRlbnRMZXZlbCwgVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2N1bWVudCksIGdldFByZWZlcmVuY2VzKCkpOwotCQkJCQlJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KHRyYW5zbGF0aW9uLmdldEpzVGV4dCgpKTsKLQkJCQkJLyogZXJyb3IgZm9ybWF0aW5nIHRoZSBjb2RlIHNvIGFib3J0ICovCi0JCQkJCWlmKGVkaXQ9PW51bGwpIHJldHVybjsKLQkJCQkJZWRpdC5hcHBseShkb2MpOwotCQkJCQlTdHJpbmcgcmVwbGFjZVRleHQgPSBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvY3VtZW50KSArIGdldEluZGVudGF0aW9uU3RyaW5nKGdldFByZWZlcmVuY2VzKCksIHN0YXJ0SW5kZW50TGV2ZWwpICsgKGRvYy5nZXQoZWRpdC5nZXRPZmZzZXQoKSwgZWRpdC5nZXRMZW5ndGgoKSkpLnRyaW0oKSArIFRleHRVdGlsaXRpZXMuZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoZG9jdW1lbnQpOwotCQkJCQkvKgotCQkJCQkgKiB0aGlzIGlzIG5lY2lzYXJ5IHNpbmNlIFNTRSBkaXNjb25uZWN0cyBkb2N1bWVudAotCQkJCQkgKiBwYXJ0aXRpb25lcnMuLiBCZWNhdXNlIG9mIHRoYXQsIHRoZSByZXBsYWNlZCByZWdpb25zIGFyZQotCQkJCQkgKiBjb25zaWRlcmVkICdwYXJ0aXRpb25sZXNzJyB3aGVuIHRoZSBsaW5lc3R5bGUgcHJvdmlkZXIKLQkJCQkJICogdHJ5cyB0byBjb2xvciB0aGVtLgotCQkJCQkgKiAKLQkJCQkJICovCi0JCQkJCWRvY3VtZW50LnJlcGxhY2VUZXh0KGRvY3VtZW50LCBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCksIHBhcnRpdGlvbi5nZXRMZW5ndGgoKSwgcmVwbGFjZVRleHQpOwotCQkJCS8vCWRvY3VtZW50LmFkZERvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIobmV3IE1vZGVsSXJyaXRhbnQoZG9jdW1lbnQpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RhcnRzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdGFydHMoZmluYWwgSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJZlBhcnRpdGlvbnMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BBUlRJVElPTikpOwotCQlmRG9jdW1lbnRzLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9NRURJVU0pKTsKLQkJc3RhcnRJbmRlbnRMZXZlbCA9IEZvcm1hdHRpbmdTdHJhdGVneUpTRFQucmVnaW9uU3RhcnRJbmRlbnRMZXZlbCArIDA7Ci0JCU1hcCBwcm9qZWN0T3B0aW9ucyA9IChNYXApIGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfUFJFRkVSRU5DRVMpOwotCQlpZiAocHJvamVjdE9wdGlvbnMgPT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvYyA9IChJRG9jdW1lbnQpIGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfTUVESVVNKTsKLQkJCWNvbnRleHQuc2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfUFJFRkVSRU5DRVMsIGdldFByb2plY3RPcHRpb25zKGRvYykpOwotCQl9Ci0JCXN1cGVyLmZvcm1hdHRlclN0YXJ0cyhjb250ZXh0KTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdG9wcygpCi0JICovCi0JCi0JcHVibGljIHZvaWQgZm9ybWF0dGVyU3RvcHMoKSB7Ci0JCXN1cGVyLmZvcm1hdHRlclN0b3BzKCk7Ci0JCWZQYXJ0aXRpb25zLmNsZWFyKCk7Ci0JCWZEb2N1bWVudHMuY2xlYXIoKTsKLQkJc3RhcnRJbmRlbnRMZXZlbCA9IDA7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50YXRpb25TdHJpbmcoTWFwIG9wdGlvbnMsIGludCBpbmRlbnRhdGlvbkxldmVsKSB7Ci0JCURlZmF1bHRDb2RlRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBEZWZhdWx0Q29kZUZvcm1hdHRlcihvcHRpb25zKTsKLQkJcmV0dXJuIGZvcm1hdHRlci5jcmVhdGVJbmRlbnRhdGlvblN0cmluZyhpbmRlbnRhdGlvbkxldmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZ2V0UHJvamVjdE9wdGlvbnMoSURvY3VtZW50IGJhc2VEb2N1bWVudCkgewotCQlJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQlNYXAgb3B0aW9ucyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoYmFzZURvY3VtZW50KTsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSB4bWxNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQkJcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChmaWxlUGF0aC5zZWdtZW50KDApKTsKLQkJCX0KLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlqYXZhUHJvamVjdCA9IEphdmFTY3JpcHRDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBqYXZhUHJvamVjdC5nZXRPcHRpb25zKHRydWUpOwotCQl9Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQkKLQlwdWJsaWMgSUpzVHJhbnNsYXRpb24gZ2V0VHJhbnNsYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlJSnNUcmFuc2xhdGlvbiB0cmFuID0gbnVsbDsKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIHRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJaWYgKHRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJdHJhbiA9IHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbih0cnVlKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRyYW47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOGM0MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JTG9jYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEV4dGVybmFsRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LCBJTG9jYXRpb25Qcm92aWRlciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLyoqCi0JICogVGhlIHdvcmtiZW5jaCBhZGFwdGVyIHdoaWNoIHNpbXBseSBwcm92aWRlcyB0aGUgbGFiZWwuCi0JICogCi0JICogQHNlZSBFY2xpcHNlIDMuMQotCSAqLwotCXByaXZhdGUgY2xhc3MgV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gKChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgbykuZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCXByaXZhdGUgRmlsZSBmRmlsZTsKLQlwcml2YXRlIFdvcmtiZW5jaEFkYXB0ZXIgZldvcmtiZW5jaEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoQWRhcHRlcigpOwotCQotCXB1YmxpYyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChGaWxlIGZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJZkZpbGUgPSBmaWxlOwotCQlmV29ya2JlbmNoQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hBZGFwdGVyKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAobyBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgbzsKLQkJCXJldHVybiBmRmlsZS5lcXVhbHMoaW5wdXQuZkZpbGUpOwotCQl9Ci0JCWlmIChvIGluc3RhbmNlb2YgSVBhdGhFZGl0b3JJbnB1dCkgewotCQkJSVBhdGhFZGl0b3JJbnB1dCBpbnB1dCA9IChJUGF0aEVkaXRvcklucHV0KSBvOwotCQkJcmV0dXJuIGdldFBhdGgoKS5lcXVhbHMoaW5wdXQuZ2V0UGF0aCgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZXhpc3RzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBmRmlsZS5leGlzdHMoKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChJTG9jYXRpb25Qcm92aWRlci5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCWlmIChJV29ya2JlbmNoQWRhcHRlci5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCXJldHVybiBmV29ya2JlbmNoQWRhcHRlcjsKLQkJfQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldE5hbWUoKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQjZ2V0UGF0aCgpCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyI2dldFBhdGgoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBQYXRoLmZyb21PU1N0cmluZyhpbnB1dC5mRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiYmQ2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEV4dGVybmFsRmlsZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluawotCXByaXZhdGUgRmlsZSBmSHlwZXJsaW5rRmlsZTsKLQlwcml2YXRlIElSZWdpb24gZkh5cGVybGlua1JlZ2lvbjsKLQkKLQlwdWJsaWMgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBGaWxlIGZpbGUpIHsKLQkJZkh5cGVybGlua0ZpbGUgPSBmaWxlOwotCQlmSHlwZXJsaW5rUmVnaW9uID0gcmVnaW9uOwotCX0KLQkKLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rUmVnaW9uOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmIChmSHlwZXJsaW5rRmlsZSAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoZkh5cGVybGlua0ZpbGUpOwotCQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQkJCXRyeSB7Ci0JCQkJZGVzY3JpcHRvciA9IElERS5nZXRFZGl0b3JEZXNjcmlwdG9yKGlucHV0LmdldE5hbWUoKSwgdHJ1ZSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGlucHV0LCBkZXNjcmlwdG9yLmdldElkKCksIHRydWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9KU0RUSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9KU0RUSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWM4NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNEVEh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSmF2YVNjcmlwdFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotY2xhc3MgSlNEVEh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCXByaXZhdGUgSUphdmFTY3JpcHRFbGVtZW50IGZFbGVtZW50OwotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCQotCXB1YmxpYyBKU0RUSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtSZWdpb24oKQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJdHJ5IHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEphdmFTY3JpcHRVSS5vcGVuSW5FZGl0b3IoZkVsZW1lbnQpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSmF2YVNjcmlwdFVJLnJldmVhbEluRWRpdG9yKGVkaXRvciwgZkVsZW1lbnQpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNEVEh5cGVybGlua0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9KU0RUSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyM2VhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9KU0RUSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JU291cmNlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JU291cmNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTRFRIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3IgewotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQsIElSZWdpb24gcmVnaW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSUh5cGVybGluayBsaW5rID0gbnVsbDsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBvcGVuIGxvY2FsIHZhcmlhYmxlIGluIHRoZSBKU1AgZmlsZS4uLgotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU291cmNlUmVmZXJlbmNlKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCQkJSVBhdGggb3V0c2lkZVBhdGggPSBudWxsOwotCQkJCWludCBqc3BPZmZzZXQgPSAwOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCQkvLyB0cnkgdG8gbG9jYXRlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkJCQl0cnkgewotCQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvL1VSSVJlc29sdmVyIHJlc29sdmVyID0gc01vZGVsLmdldFJlc29sdmVyKCk7Ci0JCQkJCQkvL2lmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0JCQkJCQkvLwlTdHJpbmcgdXJpU3RyaW5nID0gcmVzb2x2ZXIuZ2V0RmlsZUJhc2VMb2NhdGlvbigpOwotCQkJCQkJU3RyaW5nIHVyaVN0cmluZyA9IHNNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkJCQlmaWxlID0gZ2V0RmlsZSh1cmlTdHJpbmcpOwotCQkJCQkvLwl9Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBnZXQgSmF2YSByYW5nZSwgdHJhbnNsYXRlIGNvb3JkaW5hdGUgdG8gSlNQCi0JCQkJdHJ5IHsKLQkJCQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gbnVsbDsKLQkJCQkJSUpzVHJhbnNsYXRpb24ganNwVHJhbnNsYXRpb24gPSBnZXRKU1BUcmFuc2xhdGlvbihkb2N1bWVudCk7Ci0JCQkJCWlmIChqc3BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkvLyBsaW5rIHRvIGxvY2FsIHZhcmlhYmxlIGRlZmluaXRpb25zCi0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElMb2NhbFZhcmlhYmxlKSB7Ci0JCQkJCQkJcmFuZ2UgPSAoKElMb2NhbFZhcmlhYmxlKSBlbGVtZW50KS5nZXROYW1lUmFuZ2UoKTsKLQkJCQkJCQlJSmF2YVNjcmlwdEVsZW1lbnQgdW5pdD0oKElMb2NhbFZhcmlhYmxlKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJCQkJCQlJSmF2YVNjcmlwdFVuaXQgbXlVbml0ID0ganNwVHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCQkJCi0JCQkJCQkJd2hpbGUoISh1bml0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRVbml0IHx8IHVuaXQgaW5zdGFuY2VvZiBJQ2xhc3NGaWxlIHx8IHVuaXQ9PW51bGwpKSB7Ci0JCQkJCQkJCXVuaXQgPSAoKEphdmFFbGVtZW50KSB1bml0KS5nZXRQYXJlbnQoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYodW5pdCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0VW5pdCkgewotCQkJCQkJCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSAoSUphdmFTY3JpcHRVbml0KXVuaXQ7Ci0JCQkJCQkJCWlmKGN1IT1teVVuaXQpIHsKLQkJCQkJCQkJCWZpbGUgPSBnZXRGaWxlKGN1LmdldFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJCQkJCWlmKGZpbGU9PW51bGwpIHsKLQkJCQkJCQkJCQlvdXRzaWRlUGF0aCA9IGN1LmdldFBhdGgoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX1lbHNlIGlmKHVuaXQgaW5zdGFuY2VvZiBJQ2xhc3NGaWxlKSB7Ci0JCQkJCQkJCUlDbGFzc0ZpbGUgY3UgPSAoSUNsYXNzRmlsZSl1bml0OwotCQkJCQkJCQlpZihjdSE9bXlVbml0KSB7Ci0JCQkJCQkJCQlmaWxlID0gZ2V0RmlsZShjdS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlpZihmaWxlPT1udWxsKSB7Ci0JCQkJCQkJCQkJb3V0c2lkZVBhdGggPSBjdS5nZXRQYXRoKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQkvLyBsaW5raW5nIHRvIGZpZWxkcyBvZiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0Ci0JCQkJCQllbHNlIGlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LkZJRUxEKSB7Ci0JCQkJCQkJT2JqZWN0IGN1ID0gKChJRmllbGQpIGVsZW1lbnQpLmdldEphdmFTY3JpcHRVbml0KCk7Ci0JCQkJCQkJaWYgKGN1ICE9IG51bGwgJiYgY3UuZXF1YWxzKGpzcFRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpKSkgewotCQkJCQkJCQlyYW5nZSA9ICgoSVNvdXJjZVJlZmVyZW5jZSkgZWxlbWVudCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBsaW5raW5nIHRvIG1ldGhvZHMgb2YgdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdAotCQkJCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5NRVRIT0QpIHsKLQkJCQkJCQlPYmplY3QgY3UgPSAoKElGdW5jdGlvbikgZWxlbWVudCkuZ2V0SmF2YVNjcmlwdFVuaXQoKTsKLQkJCQkJCQlpZiAoY3UgIT0gbnVsbCAmJiBjdS5lcXVhbHMoanNwVHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCkpKSB7Ci0JCQkJCQkJCXJhbmdlID0gKChJU291cmNlUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocmFuZ2UgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwpIHsKLQkJCQkJCWpzcE9mZnNldCA9IHJhbmdlLmdldE9mZnNldCgpOwotCQkJCQkJaWYgKGpzcE9mZnNldCA+PSAwKSB7Ci0JCQkJCQkJbGluayA9IG5ldyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKHJlZ2lvbiwgZmlsZSwgbmV3IFJlZ2lvbihqc3BPZmZzZXQsIHJhbmdlLmdldExlbmd0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlIGlmIChyYW5nZSE9bnVsbCAmJiBvdXRzaWRlUGF0aCE9bnVsbCkgewotCQkJCQkJanNwT2Zmc2V0ID0gcmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQlpZiAoanNwT2Zmc2V0ID49IDApIHsKLQkJCQkJCQlsaW5rID0gbmV3IEV4dGVybmFsRmlsZUh5cGVybGluayhyZWdpb24sb3V0c2lkZVBhdGgudG9GaWxlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBqbWUuZ2V0TWVzc2FnZSgpLCBqbWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChsaW5rID09IG51bGwpIHsKLQkJCQlsaW5rID0gbmV3IEpTRFRIeXBlcmxpbmsocmVnaW9uLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGluazsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3IjZGV0ZWN0SHlwZXJsaW5rcyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCUxpc3QgaHlwZXJsaW5rcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiB0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGNoZWNrIGFuZCBtYWtlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIEphdmEgdHlwZQotCQkJSUpzVHJhbnNsYXRpb24ganNwVHJhbnNsYXRpb24gPSBnZXRKU1BUcmFuc2xhdGlvbihkb2N1bWVudCk7Ci0JCQlpZiAoanNwVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGlmIHdlIGFyZSBpbiBKU1AgSmF2YSBjb250ZW50Ci0JCQkJLy8gY2hlY2sgdGhhdCB3ZSBhcmUgbm90IGluIGluZGlyZWN0IEphdmEgY29udGVudCAobGlrZQotCQkJCS8vIGluY2x1ZGVkIGZpbGVzKQotCQkJCS8vIGdldCBKYXZhIGVsZW1lbnRzCi0JCQkJSUphdmFTY3JpcHRFbGVtZW50W10gZWxlbWVudHMgPSBqc3BUcmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc1JhbmdlKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJCS8vIGNyZWF0ZSBhIEpTUEphdmFIeXBlcmxpbmsgZm9yIGVhY2ggSmF2YSBlbGVtZW50Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJCQkvLyBmaW5kIGh5cGVybGluayByYW5nZSBmb3IgSmF2YSBlbGVtZW50Ci0JCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IHNlbGVjdFdvcmQoZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCQlJSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVIeXBlcmxpbmsoZWxlbWVudCwgaHlwZXJsaW5rUmVnaW9uLCBkb2N1bWVudCk7Ci0JCQkJCQlpZiAobGluayAhPSBudWxsKSB7Ci0JCQkJCQkJaHlwZXJsaW5rcy5hZGQobGluayk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSUh5cGVybGlua1tdKSBoeXBlcmxpbmtzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBpZiBwb3NzaWJsZSwgbnVsbCBpZiBjYW5ub3QgZmluZCBmaWxlCi0JICogZnJvbSB1cmkuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIHJldHVybnMgSUZpbGUgaWYgZmlsZVN0cmluZyBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZVN0cmluZykgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaWYgKGZpbGVTdHJpbmcgIT0gbnVsbCkgewotCQkJSVJlc291cmNlIHJlc291cmNlICA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmaWxlU3RyaW5nKTsKLQkJCWlmKHJlc291cmNlIT1udWxsICYmIHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlmaWxlID0gKElGaWxlKXJlc291cmNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gSlNQVHJhbnNsYXRpb24gaWYgb25lIGV4aXN0cywgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIElKc1RyYW5zbGF0aW9uIGdldEpTUFRyYW5zbGF0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQlKc1RyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0JfQotCQotCS8qKgotCSAqIEphdmEgYWx3YXlzIHNlbGVjdHMgd29yZCB3aGVuIGRlZmluaW5nIHJlZ2lvbgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBhbmNob3IKLQkgKiBAcmV0dXJuIElSZWdpb24KLQkgKi8KLQlwcml2YXRlIElSZWdpb24gc2VsZWN0V29yZChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBhbmNob3IpIHsKLQkJdHJ5IHsKLQkJCWludCBvZmZzZXQgPSBhbmNob3I7Ci0JCQljaGFyIGM7Ci0JCQl3aGlsZSAob2Zmc2V0ID49IDApIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQktLW9mZnNldDsKLQkJCX0KLQkJCWludCBzdGFydCA9IG9mZnNldDsKLQkJCW9mZnNldCA9IGFuY2hvcjsKLQkJCWludCBsZW5ndGggPSBkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJCXdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkrK29mZnNldDsKLQkJCX0KLQkJCWludCBlbmQgPSBvZmZzZXQ7Ci0JCQlpZiAoc3RhcnQgPT0gZW5kKSB7Ci0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQsIDApOwotCQkJfQotCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3NTFjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9VUkxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIFVSTEZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQlzdGF0aWMgY2xhc3MgU3RvcmFnZUVkaXRvcklucHV0IGltcGxlbWVudHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCB7Ci0JCUlTdG9yYWdlIGZTdG9yYWdlID0gbnVsbDsKLQkJCi0JCVN0b3JhZ2VFZGl0b3JJbnB1dChJU3RvcmFnZSBzdG9yYWdlKSB7Ci0JCQlmU3RvcmFnZSA9IHN0b3JhZ2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJCXJldHVybiBmU3RvcmFnZSAhPSBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBmU3RvcmFnZS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIGZTdG9yYWdlOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkJcmV0dXJuIGZTdG9yYWdlLmdldEZ1bGxQYXRoKCkgIT0gbnVsbCA/IGZTdG9yYWdlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSA6IGZTdG9yYWdlLmdldE5hbWUoKTsKLQkJfQotCX0KLQlzdGF0aWMgY2xhc3MgVVJMU3RvcmFnZSBpbXBsZW1lbnRzIElTdG9yYWdlIHsKLQkJVVJMIGZVUkwgPSBudWxsOwotCQkKLQkJVVJMU3RvcmFnZShVUkwgdXJsKSB7Ci0JCQlmVVJMID0gdXJsOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN0cmVhbSA9IGZVUkwub3BlblN0cmVhbSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpzVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBmVVJMLnRvU3RyaW5nKCksIGUpKTsKLQkJCX0KLQkJCXJldHVybiBzdHJlYW07Ci0JCX0KLQkJCi0JCXB1YmxpYyBJUGF0aCBnZXRGdWxsUGF0aCgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmVVJMLnRvU3RyaW5nKCkpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoZlVSTC5nZXRGaWxlKCkpLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIFVSTCBmVVJMOwotCQotCXB1YmxpYyBVUkxGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBVUkwgdXJsKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZVUkwgPSB1cmw7Ci0JfQotCQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZVUkwgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IFN0b3JhZ2VFZGl0b3JJbnB1dChuZXcgVVJMU3RvcmFnZShmVVJMKSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmMjllYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQlwcml2YXRlIElGaWxlIGZGaWxlOwotCXByaXZhdGUgSVJlZ2lvbiBmSGlnaGxpZ2h0UmFuZ2U7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCX0KLQkKLQlwdWJsaWMgV29ya3NwYWNlRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUZpbGUgZmlsZSwgSVJlZ2lvbiByYW5nZSkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRmlsZSA9IGZpbGU7Ci0JCWZIaWdobGlnaHRSYW5nZSA9IHJhbmdlOwotCX0KLQkKLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZGaWxlICE9IG51bGwgJiYgZkZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZGaWxlLCB0cnVlKTsKLQkJCQkvLyBoaWdobGlnaHQgcmFuZ2UgaW4gZWRpdG9yIGlmIHBvc3NpYmxlCi0JCQkJaWYgKGZIaWdobGlnaHRSYW5nZSAhPSBudWxsICYmIGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCSgoSVRleHRFZGl0b3IpIGVkaXRvcikuc2V0SGlnaGxpZ2h0UmFuZ2UoZkhpZ2hsaWdodFJhbmdlLmdldE9mZnNldCgpLCBmSGlnaGxpZ2h0UmFuZ2UuZ2V0TGVuZ3RoKCksIHRydWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2MDNkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuVVJMSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFhNTEh5cGVybGlua0RldGVjdG9yIGltcGxlbWVudHMgSUh5cGVybGlua0RldGVjdG9yIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OID0gIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhTSV9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgaHlwZXJsaW5rCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEBwYXJhbSBoeXBlcmxpbmtSZWdpb24KLQkgKiBAcmV0dXJuIElIeXBlcmxpbmsKLQkgKi8KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKFN0cmluZyB1cmlTdHJpbmcsIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgbm9kZSkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBudWxsOwotCQlpZiAoaXNIdHRwKHVyaVN0cmluZykpIHsKLQkJCWxpbmsgPSBuZXcgVVJMSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgdXJpU3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJRmlsZSBzeXN0ZW1GaWxlID0gZ2V0RmlsZUZyb21VcmlTdHJpbmcodXJpU3RyaW5nKTsKLQkJCWlmIChzeXN0ZW1GaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc3lzdGVtUGF0aCA9IHN5c3RlbUZpbGUuZ2V0UGF0aCgpOwotCQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHN5c3RlbVBhdGgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyBhIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBleGlzdHMgaW4KLQkJCQkJLy8gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgV29ya3NwYWNlRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIGZpbGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoaXMgaXMgYW4gRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZG9lcyBub3QKLQkJCQkJLy8gZXhpc3QgaW4gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgc3lzdGVtRmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQkKLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgewotCQkvLyBmb3Igbm93LCBvbmx5IGNhcGFibGUgb2YgY3JlYXRpbmcgMSBoeXBlcmxpbmsKLQkJTGlzdCBoeXBlcmxpbmtzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJTm9kZSBjdXJyZW50Tm9kZSA9IGdldEN1cnJlbnROb2RlKGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gbnVsbDsKLQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCQkvLyBkb2N0eXBlIG5vZGVzCi0JCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50Tm9kZSwgZG9jdW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkvLyBlbGVtZW50IG5vZGVzCi0JCQkJCUF0dHIgY3VycmVudEF0dHIgPSBnZXRDdXJyZW50QXR0ck5vZGUoY3VycmVudE5vZGUsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCWlmIChjdXJyZW50QXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0cnkgdG8gZmluZCBsaW5rIGZvciBjdXJyZW50IGF0dHJpYnV0ZQotCQkJCQkJLy8gcmVzb2x2ZSBhdHRyaWJ1dGUgdmFsdWUKLQkJCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50QXR0ciwgZG9jdW1lbnQpOwotCQkJCQkJLy8gdmVyaWZ5IHZhbGlkaXR5IG9mIHVyaSBzdHJpbmcKLQkJCQkJCWlmICh1cmlTdHJpbmcgPT0gbnVsbCB8fCAhaXNWYWxpZFVSSSh1cmlTdHJpbmcpKSB7Ci0JCQkJCQkJLy8gcmVzZXQgY3VycmVudCBhdHRyaWJ1dGUKLQkJCQkJCQljdXJyZW50QXR0ciA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGN1cnJlbnRBdHRyID09IG51bGwpIHsKLQkJCQkJCS8vIHRyeSB0byBmaW5kIGEgbGlua2FibGUgYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50Ci0JCQkJCQljdXJyZW50QXR0ciA9IGdldExpbmthYmxlQXR0cigoRWxlbWVudCkgY3VycmVudE5vZGUpOwotCQkJCQkJaWYgKGN1cnJlbnRBdHRyICE9IG51bGwpIHsKLQkJCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudEF0dHIsIGRvY3VtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnRBdHRyOwotCQkJCX0KLQkJCQkvLyB0cnkgdG8gY3JlYXRlIGh5cGVybGluayBmcm9tIGluZm9ybWF0aW9uIGdhdGhlcmVkCi0JCQkJaWYgKHVyaVN0cmluZyAhPSBudWxsICYmIGN1cnJlbnROb2RlICE9IG51bGwgJiYgaXNWYWxpZFVSSSh1cmlTdHJpbmcpKSB7Ci0JCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKGN1cnJlbnROb2RlKTsKLQkJCQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBjcmVhdGVIeXBlcmxpbmsodXJpU3RyaW5nLCBoeXBlcmxpbmtSZWdpb24sIGRvY3VtZW50LCBjdXJyZW50Tm9kZSk7Ci0JCQkJCWlmIChoeXBlcmxpbmsgIT0gbnVsbCkgewotCQkJCQkJaHlwZXJsaW5rcy5hZGQoaHlwZXJsaW5rKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaHlwZXJsaW5rcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsIChsb2NhbCBmaWxlIHN5c3RlbSkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRCYXNlTG9jYXRpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyBiYXNlTG9jID0gbnVsbDsKLQkJLy8gZ2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKHNNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJaWYgKGxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWJhc2VMb2MgPSBsb2NhdGlvbi50b1N0cmluZygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChsb2NhdGlvbi5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJCWJhc2VMb2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobG9jYXRpb24pLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJhc2VMb2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKGxvY2F0aW9uKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlTG9jOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIENNRWxlbWVudERlY2xhcmF0aW9uIGZvciBhbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtcSAhPSBudWxsKSB7Ci0JCQllZCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBlZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG5vZGUgd2l0aGluIG5vZGUgYXQgb2Zmc2V0Ci0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBBdHRyCi0JICovCi0JcHJpdmF0ZSBBdHRyIGdldEN1cnJlbnRBdHRyTm9kZShOb2RlIG5vZGUsIGludCBvZmZzZXQpIHsKLQkJaWYgKChub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5jb250YWlucyhvZmZzZXQpICYmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJLy8gZ28gdGhyb3VnaCBlYWNoIGF0dHJpYnV0ZSBpbiBub2RlIGFuZCBpZiBhdHRyaWJ1dGUgY29udGFpbnMKLQkJCS8vIG9mZnNldCwgcmV0dXJuIHRoYXQgYXR0cmlidXRlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyArK2kpIHsKLQkJCQkvLyBhc3N1bXB0aW9uIHRoYXQgaWYgcGFyZW50IG5vZGUgaXMgb2YgdHlwZSBJbmRleGVkUmVnaW9uLAotCQkJCS8vIHRoZW4gaXRzIGF0dHJpYnV0ZXMgd2lsbCBhbHNvIGJlIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbgotCQkJCUluZGV4ZWRSZWdpb24gYXR0UmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGF0dHJzLml0ZW0oaSk7Ci0JCQkJaWYgKGF0dFJlZ2lvbi5jb250YWlucyhvZmZzZXQpKSB7Ci0JCQkJCXJldHVybiAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50LiBudWxsIGlmIG5vCi0JICogbm9kZSBpcyBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIE5vZGUgZWl0aGVyIGVsZW1lbnQsIGRvY3R5cGUsIHRleHQsIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIGdldCB0aGUgY3VycmVudCBub2RlIGF0IHRoZSBvZmZzZXQgKHJldHVybnMgZWl0aGVyOiBlbGVtZW50LAotCQkvLyBkb2N0eXBlLCB0ZXh0KQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCQlpZiAoaW5vZGUgPT0gbnVsbCkgewotCQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0IC0gMSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIChOb2RlKSBpbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBJRmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgaWYgcG9zc2libGUsIG51bGwgaWYgY2Fubm90IGZpbmQgZmlsZQotCSAqIGZyb20gdXJpLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICogICAgICAgICAgICBmaWxlIHN5c3RlbSBwYXRoCi0JICogQHJldHVybiByZXR1cm5zIElGaWxlIGlmIGZpbGVTdHJpbmcgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmIChmaWxlU3RyaW5nICE9IG51bGwpIHsKLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVTdHJpbmcpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGZpbGUgPT0gbnVsbDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmV4aXN0cygpKSB7Ci0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyB1cmlTdHJpbmcgaXMgbm90IGh0dHA6Ly8KLQkgKiBAcmV0dXJuIEZpbGUgY3JlYXRlZCBmcm9tIHVyaVN0cmluZyBpZiBwb3NzaWJsZSwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIEZpbGUgZ2V0RmlsZUZyb21VcmlTdHJpbmcoU3RyaW5nIHVyaVN0cmluZykgewotCQlGaWxlIGZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZmlyc3QganVzdCB0cnkgdG8gY3JlYXRlIGEgZmlsZSBkaXJlY3RseSBmcm9tIHVyaVN0cmluZyBhcwotCQkJLy8gZGVmYXVsdCBpbiBjYXNlIGNyZWF0ZSBmaWxlIGZyb20gdXJpIGRvZXMgbm90IHdvcmsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmlTdHJpbmcpOwotCQkJLy8gdHJ5IHRvIGNyZWF0ZSBmaWxlIGZyb20gdXJpCi0JCQlVUkkgdXJpID0gbmV3IFVSSSh1cmlTdHJpbmcpOwotCQkJZmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBleGNlcHRpb24gaXMgdGhyb3duIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgRmlsZSBqdXN0IGlnbm9yZQotCQkJLy8gYW5kIGZpbGUgd2lsbCBiZSBudWxsCi0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXByaXZhdGUgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oTm9kZSBub2RlKSB7Ci0JCUlSZWdpb24gaHlwZXJSZWdpb24gPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCQkJSURPTU5vZGUgZG9jTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24oZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpLCBkb2NOb2RlLmdldEVuZE9mZnNldCgpIC0gZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZXMKLQkJCQlJRE9NQXR0ciBhdHQgPSAoSURPTUF0dHIpIG5vZGU7Ci0JCQkJLy8gZG8gbm90IGluY2x1ZGUgcXVvdGVzIGluIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24KLQkJCQlpbnQgcmVnT2Zmc2V0ID0gYXR0LmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dC5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCByZWdMZW5ndGggPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCVN0cmluZyBhdHRWYWx1ZSA9IGF0dC5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKFN0cmluZ1V0aWxzLmlzUXVvdGVkKGF0dFZhbHVlKSkgewotCQkJCQkJKytyZWdPZmZzZXQ7Ci0JCQkJCQlyZWdMZW5ndGggPSByZWdMZW5ndGggLSAyOwotCQkJCQl9Ci0JCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihyZWdPZmZzZXQsIHJlZ0xlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoeXBlclJlZ2lvbjsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gZmluZCBhbiBhdHRyaWJ1dGUgd2l0aGluIGVsZW1lbnQgdGhhdCBpcyBvcGVuYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gQXR0ciBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBmb3Igb3BlbiBvbiwgbnVsbCBpZiBubyBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBBdHRyIGdldExpbmthYmxlQXR0cihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbm9kZQotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGlzIGF0dHJpYnV0ZSBpcyAib3Blbk9uLWFibGUiCi0JCQlBdHRyIGF0dCA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKGlzTGlua2FibGVBdHRyKGF0dCwgZWQpKSB7Ci0JCQkJcmV0dXJuIGF0dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogRmluZCB0aGUgbG9jYXRpb24gaGludCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVVSSSBpZiBpdCBleGlzdHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudE5vZGUgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHJldHVybiBsb2NhdGlvbiBoaW50IChzeXN0ZW1JZCkgaWYgaXQgd2FzIGZvdW5kLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uSGludChFbGVtZW50IGVsZW1lbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCUF0dHIgc2NoZW1hTG9jTm9kZSA9IGVsZW1lbnROb2RlLmdldEF0dHJpYnV0ZU5vZGVOUyhYU0lfTkFNRVNQQUNFX1VSSSwgU0NIRU1BX0xPQ0FUSU9OKTsKLQkJaWYgKHNjaGVtYUxvY05vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzY2hlbWFMb2NOb2RlLmdldFZhbHVlKCkpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBwdWJsaWNJZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJLy8gZm91bmQgbG9jYXRpb24gaGludAotCQkJCWlmIChuYW1lc3BhY2VVUkkuZXF1YWxzSWdub3JlQ2FzZShwdWJsaWNJZCkpIHsKLQkJCQkJcmV0dXJuIHN5c3RlbUlkOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBub2RlIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVUklTdHJpbmcoTm9kZSBub2RlLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsKLQkJLy8gbmVlZCB0aGUgYmFzZSBsb2NhdGlvbiwgcHVibGljSWQsIGFuZCBzeXN0ZW1JZCBmb3IgVVJJUmVzb2x2ZXIKLQkJU3RyaW5nIGJhc2VMb2MgPSBudWxsOwotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCQlTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQliYXNlTG9jID0gZ2V0QmFzZUxvY2F0aW9uKGRvY3VtZW50KTsKLQkJCXB1YmxpY0lkID0gKChEb2N1bWVudFR5cGUpIG5vZGUpLmdldFB1YmxpY0lkKCk7Ci0JCQlzeXN0ZW1JZCA9ICgoRG9jdW1lbnRUeXBlKSBub2RlKS5nZXRTeXN0ZW1JZCgpOwotCQl9IGVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZQotCQkJQXR0ciBhdHRyTm9kZSA9IChBdHRyKSBub2RlOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ck5vZGUuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGF0dHJOb2RlLmdldFZhbHVlKCk7Ci0JCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChhdHRyVmFsdWUpOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmIGF0dHJWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQliYXNlTG9jID0gZ2V0QmFzZUxvY2F0aW9uKGRvY3VtZW50KTsKLQkJCQkvLyBoYW5kbGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JCQkJU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoYXR0ck5hbWUpOwotCQkJCVN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyTmFtZSk7Ci0JCQkJaWYgKChYTUxOUy5lcXVhbHMocHJlZml4KSkgfHwgKFhNTE5TLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQkJCXB1YmxpY0lkID0gYXR0clZhbHVlOwotCQkJCQlzeXN0ZW1JZCA9IGdldExvY2F0aW9uSGludChhdHRyTm9kZS5nZXRPd25lckVsZW1lbnQoKSwgcHVibGljSWQpOwotCQkJCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkgewotCQkJCQkJc3lzdGVtSWQgPSBhdHRyVmFsdWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKChYU0lfTkFNRVNQQUNFX1VSSS5lcXVhbHMoRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShhdHRyTm9kZSkpKSAmJiAoU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQkJCS8vIGZvciBub3cganVzdCB1c2UgdGhlIGZpcnN0IHBhaXIKLQkJCQkJLy8gbmVlZCB0byBsb29rIGludG8gYmVpbmcgbW9yZSBwcmVjaXNlCi0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlKTsKLQkJCQkJcHVibGljSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJCXN5c3RlbUlkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCQkvLyBlbHNlIGNoZWNrIGlmIHhtbG5zIHB1YmxpY0lkID0gdmFsdWUKLQkJCQl9IGVsc2UgewotCQkJCQlzeXN0ZW1JZCA9IGF0dHJWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmVzb2x2ZWRVUkkgPSByZXNvbHZlVVJJKGJhc2VMb2MsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCXJldHVybiByZXNvbHZlZFVSSTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdXJpU3RyaW5nIGlzIGFuIGh0dHAgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB1cmlTdHJpbmcgaXMgaHR0cCBzdHJpbmcsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0h0dHAoU3RyaW5nIHVyaVN0cmluZykgewotCQlib29sZWFuIGlzSHR0cCA9IGZhbHNlOwotCQlpZiAodXJpU3RyaW5nICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZW1wU3RyaW5nID0gdXJpU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGVtcFN0cmluZy5zdGFydHNXaXRoKEhUVFBfUFJPVE9DT0wpKSB7Ci0JCQkJaXNIdHRwID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNIdHRwOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaXMgb3BlbmFibGUuIEF0dHJpYnV0ZSBpcyBvcGVuYWJsZQotCSAqIGlmIGl0IGlzIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZSBvciBpZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzCi0JICogb2YgdHlwZSBVUkkuCi0JICogCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHBhcmFtIGNtRWxlbWVudAotCSAqICAgICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgKGNhbiBiZQotCSAqICAgICAgICAgICAgbnVsbCkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgIm9wZW5Pbi1hYmxlIiBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNMaW5rYWJsZUF0dHIoQXR0ciBhdHRyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjbUVsZW1lbnQpIHsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCVN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHJOYW1lKTsKLQkJU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJOYW1lKTsKLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSBpcyBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLQkJaWYgKChYTUxOUy5lcXVhbHMocHJlZml4KSkgfHwgKFhNTE5TLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIGNvbnRhaW5zIHNjaGVtYSBsb2NhdGlvbgotCQlpZiAoKFhTSV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhET01OYW1lc3BhY2VIZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKGF0dHIpKSkgJiYgKChTQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkgfHwgKE5PX05BTUVTUEFDRV9TQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIHZhbHVlIGlzIG9mIHR5cGUgVVJJCi0JCWlmIChjbUVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQlpZiAoKGF0dHJEZWNsICE9IG51bGwpICYmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpICYmIChDTURhdGFUeXBlLlVSSS5lcXVhbHMoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdXJpU3RyaW5nIGlzIHJlYWxseSBwb2ludGluZyB0byBhIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRVUkkoU3RyaW5nIHVyaVN0cmluZykgewotCQlib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKLQkJaWYgKGlzSHR0cCh1cmlTdHJpbmcpKSB7Ci0JCQlpc1ZhbGlkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCUZpbGUgZmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJaXNWYWxpZCA9IGZpbGUuaXNGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkkgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUxvY2F0aW9uCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHJldHVybiBTdHJpbmcgcmVzb2x2ZWQgdXJpLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJLy8gZG9udCByZXNvbHZlIGlmIHRoZXJlJ3Mgbm90aGluZyB0byByZXNvbHZlCi0JCWlmICgoYmFzZUxvY2F0aW9uID09IG51bGwpICYmIChwdWJsaWNJZCA9PSBudWxsKSAmJiAoc3lzdGVtSWQgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTY1ZjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkRvY3VtZW50Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkU3RyZWFtQ3JlYXRvcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCS8qKgotCSAqIENoYW5nZSBjbGFzcyB0aGF0IHdyYXBzIGEgdGV4dCBlZGl0IG9uIHRoZSBqc3AgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlbmFtZUNoYW5nZSBleHRlbmRzIERvY3VtZW50Q2hhbmdlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMDsKLQkJcHJpdmF0ZSBUZXh0RWRpdCBmRWRpdCA9IG51bGw7Ci0JCXByaXZhdGUgSURvY3VtZW50IGZKU1BEb2MgPSBudWxsOwotCQlwcml2YXRlIElGaWxlIGZKU1BGaWxlID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBSZW5hbWVDaGFuZ2UoSUZpbGUganNwRmlsZSwgSURvY3VtZW50IGpzcERvYywgVGV4dEVkaXQgZWRpdCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlzdXBlcihKc1VJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl82LCBqc3BEb2MpOwotCQkJdGhpcy5mRWRpdCA9IGVkaXQ7Ci0JCQl0aGlzLmZKU1BGaWxlID0ganNwRmlsZTsKLQkJCXRoaXMuZkpTUERvYyA9IGpzcERvYzsKLQkJCXRoaXMuZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mRGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgSURvY3VtZW50IGdldFByZXZpZXdEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJRG9jdW1lbnQgY29weURvYyA9IG5ldyBEb2N1bWVudChmSlNQRG9jLmdldCgpKTsKLQkJCXRyeSB7Ci0JCQkJZkVkaXQuYXBwbHkoY29weURvYyk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCXJldHVybiBjb3B5RG9jOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ2hlY2tzIGlmIGEgZG9jdW1lbnQgaXMgb3BlbiBpbiBhbiBlZGl0b3IKLQkJICogCi0JCSAqIEBwYXJhbSBqc3BEb2MKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGlzT3BlbkluRWRpdG9yKElEb2N1bWVudCBqc3BEb2MpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0JCQlJV29ya2JlbmNoV2luZG93IHcgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdyA9IHdpbmRvd3NbaV07Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHcuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gbnVsbDsKLQkJCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJCQlJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZlcmVuY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQllZGl0b3IgPSByZWZlcmVuY2VzW2pdLmdldEVkaXRvcih0cnVlKTsKLQkJCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNzY0Ci0JCQkJCQkvLyB1c2UgYWRhcHRlciB0byBnZXQgSVRleHRFZGl0b3IgKGZvciB0aGluZ3MgbGlrZQotCQkJCQkJLy8gcGFnZSBkZXNpZ25lcikKLQkJCQkJCW8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCQlpZiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkJCWRvYyA9ICgoSVRleHRFZGl0b3IpIG8pLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQkJaWYgKGRvYyAhPSBudWxsICYmIGRvYy5lcXVhbHMoanNwRG9jKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJUmVuYW1lQ2hhbmdlIHVuZG9DaGFuZ2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAoIWlzT3BlbkluRWRpdG9yKHRoaXMuZkpTUERvYykpIHsKLQkJCQkJLy8gYXBwbHkgZWRpdCB0byBKU1AgZG9jIEFORCBzYXZlIG1vZGVsCi0JCQkJCXVuZG9DaGFuZ2UgPSBuZXcgUmVuYW1lQ2hhbmdlKHRoaXMuZkpTUEZpbGUsIHRoaXMuZkpTUERvYywgdGhpcy5mRWRpdC5hcHBseShmSlNQRG9jKSwgdGhpcy5mRGVzY3JpcHRpb24pOwotCQkJCQlzYXZlRmlsZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGp1c3QgYXBwbHkgZWRpdCB0byBKU1AgZG9jdW1lbnQKLQkJCQkJdW5kb0NoYW5nZSA9IG5ldyBSZW5hbWVDaGFuZ2UodGhpcy5mSlNQRmlsZSwgdGhpcy5mSlNQRG9jLCB0aGlzLmZFZGl0LmFwcGx5KGZKU1BEb2MpLCB0aGlzLmZEZXNjcmlwdGlvbik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJcmV0dXJuIHVuZG9DaGFuZ2U7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBQZXJmb3JtZWQgaW4gYW4gb3BlcmF0aW9uIHNpbmNlIGl0IG1vZGlmaWVzIHJlc291cmNlcyBpbiB0aGUKLQkJICogd29ya3NwYWNlCi0JCSAqIAotCQkgKiBAcGFyYW0ganNwRG9jCi0JCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNhdmVGaWxlKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MpIHsKLQkJCVNhdmVKc3BGaWxlT3Agb3AgPSBuZXcgU2F2ZUpzcEZpbGVPcChqc3BGaWxlLCBqc3BEb2MpOwotCQkJdHJ5IHsKLQkJCQlvcC5ydW4oSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCS8vIGVuZCBpbm5lciBjbGFzcyBTYXZlSnNwRmlsZU9wCi0JLyoqCi0JICogV29ya3NwYWNlIG9wZXJhdGlvbiB0byBwZXJmb3JtIHNhdmUgb24gbW9kZWwgZm9yIHVwZGF0ZWQgZG9jdW1lbnRzLgotCSAqIFNob3VsZCBvbmx5IGJlIGRvbmUgb24gbW9kZWxzIG5vdCBvcGVuIGluIGFuIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFNhdmVKc3BGaWxlT3AgZXh0ZW5kcyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gewotCQlwcml2YXRlIElEb2N1bWVudCBmSlNQRG9jID0gbnVsbDsKLQkJcHJpdmF0ZSBJRmlsZSBmSlNQRmlsZSA9IG51bGw7Ci0JCQotCQlwdWJsaWMgU2F2ZUpzcEZpbGVPcChJRmlsZSBqc3BGaWxlLCBJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQl0aGlzLmZKU1BEb2MgPSBqc3BEb2M7Ci0JCQl0aGlzLmZKU1BGaWxlID0ganNwRmlsZTsKLQkJfQotCQkKLQkJCi0JCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3NjUKLQkJCS8vIHNhdmUgZmlsZSB3LyBubyBpbnRlcm1lZGlhdGUgbW9kZWwgY3JlYXRpb24KLQkJCUNvZGVkU3RyZWFtQ3JlYXRvciBjb2RlZFN0cmVhbUNyZWF0b3IgPSBuZXcgQ29kZWRTdHJlYW1DcmVhdG9yKCk7Ci0JCQlSZWFkZXIgcmVhZGVyID0gbmV3IERvY3VtZW50UmVhZGVyKHRoaXMuZkpTUERvYyk7Ci0JCQljb2RlZFN0cmVhbUNyZWF0b3Iuc2V0KHRoaXMuZkpTUEZpbGUsIHJlYWRlcik7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY29kZWRCeXRlU3RyZWFtID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIGNvZGVkU3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY29kZWRCeXRlU3RyZWFtID0gY29kZWRTdHJlYW1DcmVhdG9yLmdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJY29kZWRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29kZWRCeXRlU3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCWlmICh0aGlzLmZKU1BGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXRoaXMuZkpTUEZpbGUuc2V0Q29udGVudHMoY29kZWRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuZkpTUEZpbGUuY3JlYXRlKGNvZGVkU3RyZWFtLCBmYWxzZSwgbnVsbCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoY29kZWRCeXRlU3RyZWFtICE9IG51bGwpIHsKLQkJCQkJCWNvZGVkQnl0ZVN0cmVhbS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChjb2RlZFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCQljb2RlZFN0cmVhbS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyB1bmxpa2VseQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvLyBlbmQgaW5uZXIgY2xhc3MgUmVuYW1lQ2hhbmdlCi0JLyoqIFRoZSB0eXBlIGJlaW5nIHJlbmFtZWQgKHRoZSBvbGQgdHlwZSkgKi8KLQlJSmF2YVNjcmlwdEVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCS8qKiBUaGUgbmV3IG5hbWUgb2YgdGhlIHR5cGUgYmVpbmcgcmVuYW1lZCAqLwotCXByaXZhdGUgU3RyaW5nIGZOZXdOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvKiogbWFwcyBhIEpTUFNlYXJjaERvY3VtZW50IHBhdGggLT4gTXVsdGlUZXh0RWRpdCBmb3IgdGhlIGphdmEgZmlsZSAqLwotCXByaXZhdGUgSGFzaE1hcCBmU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG51bGw7Ci0JCi0JcHVibGljIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMuZk5ld05hbWUgPSBuZXdOYW1lOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5mU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoKQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGFjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgbWF0Y2hEb2N1bWVudFBhdGggPSBqYXZhTWF0Y2guZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCVNlYXJjaERvY3VtZW50IHNlYXJjaERvYyA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KG1hdGNoRG9jdW1lbnRQYXRoKTsKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldFJlbmFtZVRleHQoKEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSBzZWFyY2hEb2MsIGphdmFNYXRjaCk7Ci0JCQkvLyBhZGQgaXQgZm9yIHRoZSBjb3JyZWN0IGRvY3VtZW50Ci0JCQlhZGRKYXZhRWRpdChzZWFyY2hEb2MuZ2V0UGF0aCgpLCBuZXcgUmVwbGFjZUVkaXQoamF2YU1hdGNoLmdldE9mZnNldCgpLCBqYXZhTWF0Y2guZ2V0TGVuZ3RoKCksIHJlbmFtZVRleHQpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRvIHRoZSBtdWx0aSBlZGl0IGZvciBhIGdpdmUgamF2YSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YURvY3VtZW50Ci0JICogQHBhcmFtIGphdmFFZGl0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEphdmFFZGl0KFN0cmluZyBzZWFyY2hEb2NQYXRoLCBSZXBsYWNlRWRpdCBqYXZhRWRpdCkgewotCQlPYmplY3QgbyA9IHRoaXMuZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAuZ2V0KHNlYXJjaERvY1BhdGgpOwotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQlNdWx0aVRleHRFZGl0IG11bHRpID0gKE11bHRpVGV4dEVkaXQpIG87Ci0JCQltdWx0aS5hZGRDaGlsZChqYXZhRWRpdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB1c2UgYSBtdWx0aSBlZGl0IHNvIGRvYyBwb3NpdGlvbiBvZmZzZXRzIGdldCB1cGRhdGVkCi0JCQkvLyBhdXRvbWF0aWNhbGx5Ci0JCQkvLyB3aGVuIGFkZGluZyBtdWx0aXBsZSBjaGlsZCBlZGl0cwotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aSA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQltdWx0aS5hZGRDaGlsZChqYXZhRWRpdCk7Ci0JCQl0aGlzLmZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLnB1dChzZWFyY2hEb2NQYXRoLCBtdWx0aSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBDaGFuZ2UgY3JlYXRlQ2hhbmdlKEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgVGV4dEVkaXQgZWRpdCkgewotCQlJRG9jdW1lbnQgZG9jID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCkuZ2V0SHRtbERvY3VtZW50KCk7Ci0JCVN0cmluZyBmaWxlID0gc2VhcmNoRG9jLmdldEZpbGUoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBkb2N1bWVudCBsaW5lcyBhcmUgMCBiYXNlZAotCQkJU3RyaW5nIGxpbmVOdW1iZXIgPSBJbnRlZ2VyLnRvU3RyaW5nKGRvYy5nZXRMaW5lT2ZPZmZzZXQoZWRpdC5nZXRPZmZzZXQoKSkgKyAxKTsKLQkJCWRlc2NyaXB0aW9uICs9ICIgIiArIE5MUy5iaW5kKEpzVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzEsIG5ldyBTdHJpbmdbXSB7IGZpbGUsIGxpbmVOdW1iZXIgfSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbmV3IFJlbmFtZUNoYW5nZShzZWFyY2hEb2MuZ2V0RmlsZSgpLCBkb2MsIGVkaXQsIGRlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhbGwgSlNQIGNoYW5nZXMgZm9yIHRoZSBzZWFyY2ggbWF0Y2hlcyBmb3IgdGhlIGdpdmVuIFR5cGUKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlW10gZ2V0Q2hhbmdlcygpIHsKLQkJSnNTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJTGlzdCBjaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBrZXlzID0gZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHNlYXJjaERvY1BhdGggPSBudWxsOwotCQlTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IG51bGw7Ci0JCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJLy8gY3JlYXRlIG9uIHRoZSBmbHkKLQkJCXNlYXJjaERvY1BhdGggPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLQkJCU11bHRpVGV4dEVkaXQgamF2YUVkaXQgPSAoTXVsdGlUZXh0RWRpdCkgZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAuZ2V0KHNlYXJjaERvY1BhdGgpOwotCQkJZGVsZWdhdGUgPSBzdXBwb3J0LmdldFNlYXJjaERvY3VtZW50KHNlYXJjaERvY1BhdGgpOwotCQkJaWYgKGRlbGVnYXRlICE9IG51bGwgJiYgZGVsZWdhdGUgaW5zdGFuY2VvZiBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgewotCQkJCUpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIGphdmFEZWxlZ2F0ZSA9IChKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgZGVsZWdhdGU7Ci0JCQkJY2hhbmdlcy5hZGQoY3JlYXRlQ2hhbmdlKGphdmFEZWxlZ2F0ZSwgamF2YUVkaXQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKENoYW5nZVtdKSBjaGFuZ2VzLnRvQXJyYXkobmV3IENoYW5nZVtjaGFuZ2VzLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBiZXR0ZXIgZGVzY3JpYmUgdGhlIGNoYW5nZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5ldyBuYW1lIGZvciB0aGUgVHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZk5ld05hbWU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZWFyY2hEb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCXJldHVybiBnZXROZXdOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTk1MzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBKU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIgewotCXN0YXRpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IG51bGw7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCS8vIGdldCB0aGUgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyBlZGl0b3IncyBkb2N1bWVudAotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQkJCQllbGVtZW50cyA9IHRyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzUmFuZ2UodGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDdhZmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNZXRob2RSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJRnVuY3Rpb24gbWV0aG9kLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKc1NlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yKG1ldGhvZCwgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUobWV0aG9kLCBuZXcgSnNTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCS8vIHBhX1RPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkvLyBwYV9UT0RPIGltcGxlbWVudAotCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQkKLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y3ZGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSUphdmFXZWJOb2RlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JcHJpdmF0ZSBJRnVuY3Rpb24gZk1ldGhvZCA9IG51bGw7Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkKLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNoYW5nZVtdIGNoYW5nZXMgPSBKU1BNZXRob2RSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0Zvcih0aGlzLmZNZXRob2QsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCWlmIChjaGFuZ2VzLmxlbmd0aCA+IDApIHsKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXMsIGNoYW5nZXMpOwotCQl9Ci0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuZk1ldGhvZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW5hbWUgPSB0aGlzLmZNZXRob2QuZ2V0U291cmNlKCk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRnVuY3Rpb24pIHsKLQkJCXRoaXMuZk1ldGhvZCA9IChJRnVuY3Rpb24pIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVdlYk5vZGUpIHsKLQkJCWlmKCgoSUphdmFXZWJOb2RlKWVsZW1lbnQpLmdldEphdmFFbGVtZW50KCkgaW5zdGFuY2VvZiBJRnVuY3Rpb24pIHsKLQkJCQl0aGlzLmZNZXRob2QgPSAoSUZ1bmN0aW9uKSAoKElKYXZhV2ViTm9kZSllbGVtZW50KS5nZXRKYXZhRWxlbWVudCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTY4MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHsKLQlwdWJsaWMgSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihlbGVtZW50LCBuZXdOYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMywgbmV3IFN0cmluZ1tdIHsgbWV0aG9kTmFtZSwgbmV3TmFtZSB9KTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJU3RyaW5nIGphdmFUZXh0ID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCkuZ2V0SnNUZXh0KCk7Ci0JCVN0cmluZyBtZXRob2RUZXh0ID0gamF2YVRleHQuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJU3RyaW5nIG1ldGhvZFN1ZmZpeCA9IG1ldGhvZFRleHQuc3Vic3RyaW5nKG1ldGhvZFRleHQuaW5kZXhPZigiKCIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ2V0TmV3TmFtZSgpICsgbWV0aG9kU3VmZml4OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjc5YTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBBbiBhY3Rpb24gZGVsZWdhdGUgdGhhdCBsYXVuY2hlcyBKRFQgbW92ZSBlbGVtZW50IHdpemFyZAotICogCi0gKiBTdGlsbCByZWxpZXMgaGVhdmlseSBvbiBpbnRlcm5hbCBBUEkgd2lsbCBjaGFuZ2UgcG9zdCAzLjAgd2l0aCBwdWJsaWMgbW92ZQotICogc3VwcG9ydCBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE4MTcKLSAqLwotcHVibGljIGNsYXNzIEpTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCS8vIHByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCS8vIGZFZGl0b3IgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSnNVSU1lc3NhZ2VzLk1vdmVFbGVtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChKc1VJTWVzc2FnZXMuTW92ZUVsZW1lbnRfbGFiZWwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCS8vIG5vLW9wIHVudGlsIHdlIGtub3cgaG93IHdlJ3JlIHN1cHBvc2VkIHRvIHVzZSB0aGlzCi0JLy8gZWNsaXBzZSAzLjJNNQotCS8vIHB1YmxpYyBtb3ZlIHN1cHBvcnQ6Ci0JLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxODE3Ci0JLy8gSUphdmFTY3JpcHRFbGVtZW50W10gZWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKCk7Ci0JLy8gaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkvLwotCS8vIC8vIG5lZWQgdG8gY2hlY2sgaWYgaXQncyBtb3ZhYmxlCi0JLy8gdHJ5IHsKLQkvLyBKYXZhTW92ZVByb2Nlc3NvciBwcm9jZXNzb3IgPQotCS8vIEphdmFNb3ZlUHJvY2Vzc29yLmNyZWF0ZShnZXRSZXNvdXJjZXMoZWxlbWVudHMpLCBlbGVtZW50cyk7Ci0JLy8JCQkJCi0JLy8gU2hlbGwgcGFyZW50ID0KLQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JLy8gTW92ZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IE1vdmVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotCS8vCi0JLy8gUmVmYWN0b3JpbmdXaXphcmQgd2l6YXJkID0gY3JlYXRlV2l6YXJkKHJlZmFjdG9yaW5nKTsKLQkvLwotCS8vIC8qCi0JLy8gKiBXZSB3YW50IHRvIGdldCB0aGUgc2hlbGwgZnJvbSB0aGUgcmVmYWN0b3JpbmcgZGlhbG9nIGJ1dAotCS8vICogaXQncyBub3Qga25vd24gYXQgdGhpcyBwb2ludCwgc28gd2UgcGFzcyB0aGUgd2l6YXJkIGFuZAotCS8vICogdGhlbiwgb25jZSB0aGUgZGlhbG9nIGlzIG9wZW4sIHdlIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gaXRzCi0JLy8gKiBzaGVsbC4KLQkvLyAqLwotCS8vCi0JLy8gcHJvY2Vzc29yLnNldENyZWF0ZVRhcmdldFF1ZXJpZXMobmV3IENyZWF0ZVRhcmdldFF1ZXJpZXMod2l6YXJkKSk7Ci0JLy8gcHJvY2Vzc29yLnNldFJlb3JnUXVlcmllcyhuZXcgUmVvcmdRdWVyaWVzKHdpemFyZCkpOwotCS8vIC8vIFN0cmluZyBvcGVuUmVmYWN0b3JpbmdXaXpNc2cgPQotCS8vIC8vCi0JLy8gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIk9wZW5SZWZhY3RvcmluZ1dpemFyZEFjdGlvbi5yZWZhY3RvcmluZyIpOwotCS8vIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyBTdHJpbmcgb3BlblJlZmFjdG9yaW5nV2l6TXNnID0gSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudFdpemFyZDsgLy8KLQkvLyAiTW92ZQotCS8vIC8vIHRoZQotCS8vIC8vIHNlbGVjdGVkCi0JLy8gLy8gZWxlbWVudHMiOwotCS8vIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyBuZXcgUmVmYWN0b3JpbmdTdGFydGVyKCkuYWN0aXZhdGUocmVmYWN0b3JpbmcsIHdpemFyZCwgcGFyZW50LAotCS8vIG9wZW5SZWZhY3RvcmluZ1dpek1zZywgdHJ1ZSk7Ci0JLy8KLQkvLyBQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotCS8vCi0JLy8gfQotCS8vIGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCS8vIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyBQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5KU1BNb3ZlRWxlbWVudEFjdGlvbl8wKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCS8vIGZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOGEzNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFja2FnZVJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElQYWNrYWdlRnJhZ21lbnQgcGtnLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKc1NlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvcihwa2csIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHBrZywgbmV3IEpzU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkvLyByZXR1cm4gdGhpcy5wa2c7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXM7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0JCi0JCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFmNzNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogUmVtZW1iZXIgdG8gY2hhbmdlIHRoZSBwbHVnaW4ueG1sIGZpbGUgaWYgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBmUGtnID0gbnVsbDsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ2hhbmdlW10gY2hhbmdlcyA9IEpTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0Zvcih0aGlzLmZQa2csIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCWlmIChjaGFuZ2VzLmxlbmd0aCA+IDApIHsKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXMsIGNoYW5nZXMpOwotCQl9Ci0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuZlBrZyAhPSBudWxsKSB7Ci0JCQluYW1lID0gdGhpcy5mUGtnLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQl0aGlzLmZQa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhNDU5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JLyoqCi0JICogRWxlbWVudCBpcyB0aGUgb2xkIHBhY2thZ2UuIG5ld05hbWUgaXMgdGhlIG5ldyBwYWNrYWdlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXB1YmxpYyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihlbGVtZW50LCBuZXdOYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTkxTLmJpbmQoSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNSwgKG5ldyBTdHJpbmdbXSB7IHBhY2thZ2VOYW1lLCBuZXdOYW1lIH0pKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkMmZiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkucmVmYWN0b3JpbmcuUmVuYW1lU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBsYXRmb3JtU3RhdHVzTGluZVV0aWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZFZGl0b3IgPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIElKYXZhU2NyaXB0RWxlbWVudCBnZXRTZWxlY3RlZEVsZW1lbnQoKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSUphdmFTY3JpcHRFbGVtZW50W10gZWxlbWVudHMgPSBKU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKChJVGV4dEVkaXRvcikgZkVkaXRvcik7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDEpIHsKLQkJCQllbGVtZW50ID0gZWxlbWVudHNbMF07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChKc1VJTWVzc2FnZXMuUmVuYW1lRWxlbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoSnNVSU1lc3NhZ2VzLlJlbmFtZUVsZW1lbnRfbGFiZWwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCA9IGdldFNlbGVjdGVkRWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlSZW5hbWVTdXBwb3J0IHJlbmFtZVN1cHBvcnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJCQljYXNlIElKYXZhU2NyaXB0RWxlbWVudC5UWVBFOgotCQkJCQkJcmVuYW1lU3VwcG9ydCA9IFJlbmFtZVN1cHBvcnQuY3JlYXRlKChJVHlwZSkgZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUphdmFTY3JpcHRFbGVtZW50Lk1FVEhPRDoKLQkJCQkJCXJlbmFtZVN1cHBvcnQgPSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSUZ1bmN0aW9uKSBlbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YVNjcmlwdEVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKLQkJCQkJCXJlbmFtZVN1cHBvcnQgPSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChyZW5hbWVTdXBwb3J0ICE9IG51bGwpIHsKLQkJCQkJcmVuYW1lU3VwcG9ydC5vcGVuRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuZGlzcGxheUVycm9yTWVzc2FnZShKc1VJTWVzc2FnZXMuSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wKTsKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYWEzOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlTW92ZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElUeXBlIHR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUpzU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTUEluZGV4TWFuYWdlcgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNgotCQkvLyBzdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQlKU1BUeXBlTW92ZVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQVHlwZU1vdmVSZXF1ZXN0b3IodHlwZSwgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUodHlwZSwgbmV3IEpzU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSnNVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCQotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkKLQkKLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDg4ZTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuTW92ZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlUGFydGljaXBhbnQgZXh0ZW5kcyBNb3ZlUGFydGljaXBhbnQgewotCUlUeXBlIGZUeXBlID0gbnVsbDsKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHBtICE9IG51bGwgJiYgcG0uaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOwotCQlPYmplY3QgZGVzdCA9IGdldEFyZ3VtZW50cygpLmdldERlc3RpbmF0aW9uKCk7Ci0JCWlmIChkZXN0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJQ2hhbmdlW10gY2hhbmdlcyA9IEpTUFR5cGVNb3ZlQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IoZlR5cGUsICgoSVBhY2thZ2VGcmFnbWVudCkgZGVzdCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQlpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7Ci0JCQkJbXVsdGlDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlcywgY2hhbmdlcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGhpcy5mVHlwZSAhPSBudWxsKSB7Ci0JCQluYW1lID0gdGhpcy5mVHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCXRoaXMuZlR5cGUgPSAoSVR5cGUpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2MDgwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5Kc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlTW92ZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgSlNQVHlwZU1vdmVSZXF1ZXN0b3IoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdQYWNrYWdlKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG5ld1BhY2thZ2UpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMiwgbmV3IFN0cmluZ1tdIHsgdHlwZU5hbWUsIG5ld05hbWUgfSk7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCVN0cmluZyByZW5hbWVUZXh0ID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JLy8JSnNUcmFuc2xhdGlvbiB0cmFucyA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpOwotCQkvL1N0cmluZyBtYXRjaFRleHQgPSB0cmFucy5nZXRKc1RleHQoKS5zdWJzdHJpbmcoamF2YU1hdGNoLmdldE9mZnNldCgpLCBqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkgKyBqYXZhTWF0Y2guZ2V0TGVuZ3RoKCkpOwotCQkvLyBpZiBpdCdzIGFuIGltcG9ydCBvciBqc3A6dXNlQmVhbiwgd2UgbmVlZCB0byBhZGQgdGhlIHBhY2thZ2UgbmFtZSBhcwotCQkvLyB3ZWxsCi0vLyBpZiAodHJhbnMuaXNJbXBvcnQoamF2YU1hdGNoLmdldE9mZnNldCgpKQotLy8JCQkKLS8vIHx8IGlzRnVsbHlRdWFsaWZpZWQobWF0Y2hUZXh0KSkgewotLy8gaWYgKCFnZXROZXdOYW1lKCkuZXF1YWxzKCIiKSkgewotLy8gLy8gZ2V0TmV3TmFtZSgpIGlzIHRoZSBwa2cgbmFtZQotLy8gcmVuYW1lVGV4dCA9IGdldE5ld05hbWUoKSArICIuIiArIHJlbmFtZVRleHQ7IC8vJE5PTi1OTFMtMSQKLS8vIH0KLS8vIH0KLQkJcmV0dXJuIHJlbmFtZVRleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWQ4OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKc1NlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJSlNQVHlwZVJlbmFtZVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQVHlwZVJlbmFtZVJlcXVlc3Rvcih0eXBlLCBuZXdOYW1lKTsKLQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZSh0eXBlLCBuZXcgSnNTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkvLyBwYV9UT0RPIGltcGxlbWVudAotCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQkKLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YTQ2ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBSZW1lbWJlciB0byBjaGFuZ2UgdGhlIHBsdWdpbi54bWwgZmlsZSBpZiB0aGUgbmFtZSBvZiB0aGlzIGNsYXNzIGNoYW5nZXMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JcHJpdmF0ZSBJVHlwZSBmVHlwZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkKLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNoYW5nZVtdIGNoYW5nZXMgPSBKU1BUeXBlUmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IoZlR5cGUsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCWlmIChjaGFuZ2VzLmxlbmd0aCA+IDApIHsKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXMsIGNoYW5nZXMpOwotCQl9Ci0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuZlR5cGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQluYW1lID0gdGhpcy5mVHlwZS5nZXRTb3VyY2UoKTsKLQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQl0aGlzLmZUeXBlID0gKElUeXBlKSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFXZWJOb2RlKSB7Ci0JCQlpZigoKElKYXZhV2ViTm9kZSllbGVtZW50KS5nZXRKYXZhRWxlbWVudCgpIGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCQl0aGlzLmZUeXBlID0gKElUeXBlKSAoKElKYXZhV2ViTm9kZSllbGVtZW50KS5nZXRKYXZhRWxlbWVudCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTE4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5KU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBDcmVhdGVzIGRvY3VtZW50IGNoYW5nZShzKSBmb3IgYSB0eXBlIHJlbmFtZS4gQ2hhbmdlcyBhcmUgY3JlYXRlZCBmb3IgZXZlcnkKLSAqIHR5cGUgIm1hdGNoIiBpbiB0aGUgd29ya3NwYWNlCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JcHVibGljIEpTUFR5cGVSZW5hbWVSZXF1ZXN0b3IoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIodHlwZSwgbmV3TmFtZSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKc1VJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl80LCBuZXcgU3RyaW5nW10geyB0eXBlTmFtZSwgbmV3TmFtZSB9KTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJU3RyaW5nIHJlbmFtZVRleHQgPSBnZXROZXdOYW1lKCk7Ci0JLy8JU3RyaW5nIHBrZyA9IGdldFR5cGUoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCS8vCUpzVHJhbnNsYXRpb24gdHJhbnMgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKTsKLQkvLwlTdHJpbmcgbWF0Y2hUZXh0ID0gdHJhbnMuZ2V0SnNUZXh0KCkuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJLy8gaWYgaXQncyBhbiBpbXBvcnQgb3IganNwOnVzZUJlYW4gb3IgZnVsbHkgcXVhbGlmaWVkIHR5cGUsIHdlIG5lZWQgdG8KLQkJLy8gYWRkIHRoZSBwYWNrYWdlIG5hbWUgYXMgd2VsbAotLy8gaWYgKHRyYW5zLmlzSW1wb3J0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSkKLS8vIHx8IC8qIHRyYW5zLmlzVXNlQmVhbihqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpIHx8Ci0vLyAqL2lzRnVsbHlRdWFsaWZpZWQobWF0Y2hUZXh0KSkgewotLy8gaWYgKCFwa2cuZXF1YWxzKCIiKSkgewotLy8gcmVuYW1lVGV4dCA9IHBrZyArICIuIiArIHJlbmFtZVRleHQ7IC8vJE5PTi1OTFMtMSQKLS8vIH0KLS8vIH0KLQkJcmV0dXJuIHJlbmFtZVRleHQ7Ci0JfQotCQotCXByaXZhdGUgSVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIChJVHlwZSkgZ2V0RWxlbWVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pzU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDEwYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pzU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU3VwcG9ydDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIE1hcHMgamF2YSBzZWFyY2ggY29vcmRpbmF0ZXMgdG8gY29ycmVzcG9uZGluZyBKU1AgY29vcmRpbmF0ZXMuIEFkZHMgdGhlCi0JICogbWF0Y2hlcyB0byB0aGUgU2VhcmNoIFJlc3VsdHMgdmlldy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG1hdGNoRG9jdW1lbnRQYXRoID0gbWF0Y2guZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCVNlYXJjaERvY3VtZW50IHNlYXJjaERvYyA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KG1hdGNoRG9jdW1lbnRQYXRoKTsKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQlKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBqYXZhU2VhcmNoRG9jID0gKEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSBzZWFyY2hEb2M7Ci0JCQlpbnQganNwU3RhcnQgPSBtYXRjaC5nZXRPZmZzZXQoKTsKLQkJCWludCBqc3BFbmQgPSBtYXRjaC5nZXRPZmZzZXQoKSArIG1hdGNoLmdldExlbmd0aCgpOwotCQkJSUpzVHJhbnNsYXRpb24gdHJhbnMgPSBqYXZhU2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JCQlTdHJpbmcganNwVGV4dCA9IHRyYW5zLmdldEh0bWxUZXh0KCk7Ci0JCQlTdHJpbmcgamF2YVRleHQgPSBqYXZhU2VhcmNoRG9jLmdldEphdmFUZXh0KCk7Ci0JCQlpZiAoQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5ERUJVRykgewotCQkJCWRpc3BsYXlEZWJ1Z0luZm8obWF0Y2gsIGpzcFN0YXJ0LCBqc3BFbmQsIGpzcFRleHQsIGphdmFUZXh0KTsKLQkJCX0KLQkJCWlmIChqc3BTdGFydCA+IC0xICYmIGpzcEVuZCA+IC0xKSB7Ci0JCQkJYWRkU2VhcmNoTWF0Y2gobmV3IERvY3VtZW50KHRyYW5zLmdldEh0bWxUZXh0KCkpLCBqYXZhU2VhcmNoRG9jLmdldEZpbGUoKSwganNwU3RhcnQsIGpzcEVuZCwganNwVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlYXJjaERvYwotCSAqIEBwYXJhbSBqc3BTdGFydAotCSAqIEBwYXJhbSBqc3BFbmQKLQkgKiBAcGFyYW0ganNwVHJhbnNsYXRpb24KLQkgKiBAcGFyYW0ganNwVGV4dAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCS8vIGltcGxlbWVudCBpbiBzdWJjbGFzcwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNiZWdpblJlcG9ydGluZygpCi0JICovCi0JCi0JcHVibGljIHZvaWQgYmVnaW5SZXBvcnRpbmcoKSB7Ci0JCWlmIChCYXNpY0pzU2VhcmNoUmVxdWVzdG9yLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBiZWdpblJlcG9ydGluZygpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBGb3IgZGVidWcuCi0JICogCi0JICogQHBhcmFtIG9yaWdNYXRjaAotCSAqIEBwYXJhbSBqc3BTdGFydAotCSAqIEBwYXJhbSBqc3BFbmQKLQkgKiBAcGFyYW0ganNwVGV4dAotCSAqIEBwYXJhbSBqYXZhVGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwbGF5RGVidWdJbmZvKFNlYXJjaE1hdGNoIG9yaWdNYXRjaCwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCwgU3RyaW5nIGphdmFUZXh0KSB7Ci0JCWlmIChvcmlnTWF0Y2ggPT0gbnVsbCB8fCBqc3BTdGFydCA9PSAtMSB8fCBqc3BFbmQgPT0gLTEgfHwganNwRW5kIDwganNwU3RhcnQgfHwganNwVGV4dCA9PSBudWxsIHx8IGphdmFUZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oImFjY2VwdCBwb3NzaWJsZSBtYXRjaCBbanNwRG9jOiAiICsgb3JpZ01hdGNoLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkgKyAiICIgKyBvcmlnTWF0Y2guZ2V0T2Zmc2V0KCkgKyAiOiIgKyBvcmlnTWF0Y2guZ2V0T2Zmc2V0KCkgKyBvcmlnTWF0Y2guZ2V0TGVuZ3RoKCkgKyAiXT8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoIGluZm86Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ0aGUgamF2YSB0ZXh0IGlzOiIgKyBqYXZhVGV4dC5zdWJzdHJpbmcob3JpZ01hdGNoLmdldE9mZnNldCgpLCBvcmlnTWF0Y2guZ2V0T2Zmc2V0KCkgKyBvcmlnTWF0Y2guZ2V0TGVuZ3RoKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oImphdmEgc2VhcmNoIG1hdGNoIHRyYW5zbGF0ZXMgdG8ganNwIGNvb3JkcyBbc3RhcnQ6ICIgKyBqc3BTdGFydCArICIgZW5kOiIgKyBqc3BFbmQgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiB0aGUganNwIHRleHQgaXM6IiArIGpzcFRleHQuc3Vic3RyaW5nKGpzcFN0YXJ0LCBqc3BFbmQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNlbmRSZXBvcnRpbmcoKQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGVuZFJlcG9ydGluZygpIHsKLQkJaWYgKEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFNlYXJjaCByZXF1ZXN0b3I6IGVuZFJlcG9ydGluZygpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNlbnRlclBhcnRpY2lwYW50KG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50KQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGVudGVyUGFydGljaXBhbnQoU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQkJaWYgKEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFNlYXJjaCByZXF1ZXN0b3I6IGVudGVyUGFydGljaXBhbnQoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZXhpdFBhcnRpY2lwYW50KG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50KQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGV4aXRQYXJ0aWNpcGFudChTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewotCQlpZiAoQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZXhpdFBhcnRpY2lwYW50KCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmYzYzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaC5IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCQotCQotCXByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0JCQkvLyB0ZW1wb3JhcnksIHdvcmthcm91bmQgdG8gZGlzYWJsZSBmdW5jdGlvbiwgc2luY2UgdXNpbmcgdGhlCi0JCQkvLyBmdW5jdGlvbgotCQkJLy8gY2FuIGVhc2lseSBjYXVzZSBkZWFkbG9jayB0byBvY2N1ci4KLQkJCS8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzNjYyCi0vLyBKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IganNwUHJvY2Vzc29yID0gbmV3Ci0vLyBKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLS8vIGZQcm9jZXNzb3JzLmFkZChqc3BQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDRmYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUudGV4dC5JSnNQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB7Ci0JcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0SmF2YUVsZW1lbnRzRm9yQ3VycmVudFNlbGVjdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCXJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwID8gZWxlbWVudHNbMF0gOiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiB1c2VzIEpTUFRyYW5zbGF0aW9uIHRvIGdldCBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGN1cnJlbnRseSBzZWxlY3RlZCBJSmF2YUVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRKYXZhRWxlbWVudHNGb3JDdXJyZW50U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJLy8gZ2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgdmlld2VyJ3MgZG9jdW1lbnQKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbih0cnVlKTsKLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjIxMQotCQkJCQllbGVtZW50cyA9IHRyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzUmFuZ2Uoc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFydGl0aW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBJSnNQYXJ0aXRpb25zLkh0bWxKc1BhcnRpdGlvbiB9OwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UmVnaW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElTZWFyY2hRdWVyeSBnZXRTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVnaW9uVGV4dCwgU3RyaW5nIHJlZ2lvblR5cGUsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBKc1NlYXJjaFF1ZXJ5KGZpbGUsIGdldEphdmFFbGVtZW50KGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc09jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxZWYxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5PY2N1cnJlbmNlc1NlYXJjaFJlc3VsdDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc09jY3VycmVuY2VzU2VhcmNoUmVzdWx0IGV4dGVuZHMgT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQgewotCXB1YmxpYyBKc09jY3VycmVuY2VzU2VhcmNoUmVzdWx0KElTZWFyY2hRdWVyeSBxdWVyeSkgewotCQlzdXBlcihxdWVyeSk7Ci0JfQotCQotCQotCXB1YmxpYyBNYXRjaFtdIGdldE1hdGNoZXMoKSB7Ci0JCXJldHVybiAoKEpzU2VhcmNoUXVlcnkpIGdldFF1ZXJ5KCkpLmdldE1hdGNoZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2VhcmNoUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODJjMGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guQmFzaWNTZWFyY2hRdWVyeTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzU2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNpY1NlYXJjaFF1ZXJ5IHsKLQkvKiogdGhlIElKYXZhU2NyaXB0RWxlbWVudCB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZmlsZSAqICovCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCQotCXB1YmxpYyBKc1NlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGZpbGUpOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gY2FuUmVydW4oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJ1bkluQmFja2dyb3VuZCgpCi0JICovCi0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuSW5CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9RdWVyeSgpIHsKLQkJY2xlYXJNYXRjaGVzKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJdHJ5IHsKLQkJCUpzU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQkvLyBpbmRleCB0aGUgZmlsZQotCQkJU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBzdXBwb3J0LmFkZEpzcEZpbGUoZ2V0RmlsZSgpKTsKLQkJCVN0cmluZyBzY29wZVBhdGggPSBkZWxlZ2F0ZS5nZXRQYXRoKCk7Ci0JCQlKc1NlYXJjaFNjb3BlIHNpbmdsZUZpbGVTY29wZSA9IG5ldyBKc1NlYXJjaFNjb3BlKG5ldyBTdHJpbmdbXSB7IGdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHNjb3BlUGF0aCB9KTsKLQkJCS8vIHBlcmZvcm0gYSBzZWFyY2hzCi0JCQkvLyBieSBwYXNzaW5nIGluIHRoaXMganNwIHNlYXJjaCBxdWVyeSwgcmVxdXN0b3IgY2FuIGFkZCBtYXRjaGVzCi0JCQkvLyBzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKGdldEphdmFFbGVtZW50KCksIHNpbmdsZUZpbGVTY29wZSwgbmV3Ci0JCQkvLyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKGdldEluc3RhbmNlKCkpKTsKLQkJCXN1cHBvcnQuc2VhcmNoUnVubmFibGUoZ2V0SmF2YUVsZW1lbnQoKSwgc2luZ2xlRmlsZVNjb3BlLCBuZXcgSnNTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKGdldEluc3RhbmNlKCkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiLCBJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVuYW1lKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBKc1VJTWVzc2FnZXMuT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yOwotCQlpZiAoZ2V0RmlsZSgpICE9IG51bGwpIHsKLQkJCWZpbGVuYW1lID0gZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZmlsZW5hbWU7Ci0JfQotCQotCS8vIGZvciBhY2Nlc3MgYnkgaW5uZXIgY2xhc3MKLQlwdWJsaWMgSnNTZWFyY2hRdWVyeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmZFbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjZ2V0TGFiZWwoKQotCSAqLwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCVN0cmluZ1tdIGFyZ3MgPSB7IGdldFNlYXJjaFRleHQoKSwgZ2V0T2NjdXJyZW5jZXNDb3VudFRleHQoKSwgZ2V0RmlsZW5hbWUoKSB9OwotCQlyZXR1cm4gTkxTLmJpbmQoSnNVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMCwgYXJncyk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldE9jY3VycmVuY2VzQ291bnRUZXh0KCkgewotCQlTdHJpbmcgY291bnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBwYV9UT0RPIG1ha2UgZHluYW1pYwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hSZXN1bHQoKQotCSAqLwotCQotCXB1YmxpYyBJU2VhcmNoUmVzdWx0IGdldFNlYXJjaFJlc3VsdCgpIHsKLQkJcmV0dXJuIG5ldyBKc09jY3VycmVuY2VzU2VhcmNoUmVzdWx0KHRoaXMpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlYXJjaFRleHQoKSB7Ci0JCXJldHVybiBmRWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmZWI1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSVNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKc1NlYXJjaFJlcXVlc3RvciB7Ci0JcHJpdmF0ZSBJU2VhcmNoUmVxdWVzdG9yIGZKYXZhUmVxdWVzdG9yID0gbnVsbDsKLQkKLQlwdWJsaWMgSnNTZWFyY2hSZXF1ZXN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBKc1NlYXJjaFJlcXVlc3RvcihJU2VhcmNoUmVxdWVzdG9yIGphdmFSZXF1ZXN0b3IpIHsKLQkJLy8gbmVlZCB0byByZXBvcnQgbWF0Y2hlcyB0byBqYXZhUmVxdWVzdG9yCi0JCXRoaXMuZkphdmFSZXF1ZXN0b3IgPSBqYXZhUmVxdWVzdG9yOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFyY2hNYXRjaChJRG9jdW1lbnQganNwRG9jdW1lbnQsIElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQpIHsKLQkJaWYgKCFqc3BGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGxpbmVOdW1iZXIgPSAtMTsKLQkJdHJ5IHsKLQkJCWxpbmVOdW1iZXIgPSBqc3BEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoanNwU3RhcnQpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJvZmZzZXQ6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGpzcFN0YXJ0KSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljcmVhdGVTZWFyY2hNYXJrZXIoanNwRmlsZSwganNwU3RhcnQsIGpzcEVuZCwgbGluZU51bWJlcik7Ci0JCWlmICh0aGlzLmZKYXZhUmVxdWVzdG9yICE9IG51bGwpIHsKLQkJCU1hdGNoIG1hdGNoID0gbmV3IE1hdGNoKGpzcEZpbGUsIGpzcFN0YXJ0LCBqc3BFbmQgLSBqc3BTdGFydCk7Ci0JCQl0aGlzLmZKYXZhUmVxdWVzdG9yLnJlcG9ydE1hdGNoKG1hdGNoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBqc3BTdGFydAotCSAqIEBwYXJhbSBqc3BFbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VhcmNoTWFya2VyKElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgaW50IGxpbmVOdW1iZXIpIHsKLQkJdHJ5IHsKLQkJCUlNYXJrZXIgbWFya2VyID0ganNwRmlsZS5jcmVhdGVNYXJrZXIoTmV3U2VhcmNoVUkuU0VBUkNIX01BUktFUik7Ci0JCQlIYXNoTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCg0KTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgbmV3IEludGVnZXIoanNwU3RhcnQpKTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIG5ldyBJbnRlZ2VyKGpzcEVuZCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgbmV3IEludGVnZXIobGluZU51bWJlcikpOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTU2NTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKc1NlYXJjaFJlcXVlc3RvciB7Ci0JcHJpdmF0ZSBKc1NlYXJjaFF1ZXJ5IGZRdWVyeSA9IG51bGw7Ci0JCi0JcHVibGljIEpzU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3RvcihKc1NlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXRoaXMuZlF1ZXJ5ID0gcXVlcnk7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQkvLyBhZGQgbWF0Y2ggdG8gSlNQIHF1ZXJ5Li4uCi0JCXRoaXMuZlF1ZXJ5LmFkZE1hdGNoKGpzcERvY3VtZW50LCBqc3BTdGFydCwganNwRW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pzTWF0Y2hQcmVzZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSnNNYXRjaFByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWE4ODgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSnNNYXRjaFByZXNlbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzTWF0Y2hQcmVzZW50YXRpb24gaW1wbGVtZW50cyBJTWF0Y2hQcmVzZW50YXRpb24gewotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklNYXRjaFByZXNlbnRhdGlvbiNjcmVhdGVMYWJlbFByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgY3JlYXRlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBCYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uI3Nob3dNYXRjaChvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaCwKLQkgKiAgICAgIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dNYXRjaChNYXRjaCBtYXRjaCwgaW50IGN1cnJlbnRPZmZzZXQsIGludCBjdXJyZW50TGVuZ3RoLCBib29sZWFuIGFjdGl2YXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBPYmplY3Qgb2JqID0gbWF0Y2guZ2V0RWxlbWVudCgpOwotCQkvLyBzaG93IG1hdGNoIGluIEpTUCBlZGl0b3IKLQkJaWYgKGFjdGl2YXRlKSB7Ci0JCQkvLyB1c2Ugc2hvdyBpbiB0YXJnZXQ/Ci0JCX0gZWxzZSB7Ci0JCQkvLyBqdXN0IHNlbGVjdAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9Kc1F1ZXJ5UGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSnNRdWVyeVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjUyOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9Kc1F1ZXJ5UGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5FbGVtZW50UXVlcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklRdWVyeVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5QYXR0ZXJuUXVlcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLkpzU2VhcmNoUmVxdWVzdG9yOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzUXVlcnlQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElRdWVyeVBhcnRpY2lwYW50IHsKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNwc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JUXVlcnlQYXJ0aWNpcGFudCNlc3RpbWF0ZVRpY2tzKG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb24pCi0JICovCi0JcHVibGljIGludCBlc3RpbWF0ZVRpY2tzKFF1ZXJ5U3BlY2lmaWNhdGlvbiBkYXRhKSB7Ci0JCS8vIHBhX1RPRE8gdXNlIHByb2plY3QgZmlsZSBjb3VudGVyIGZyb20gSlNQU2VhcmNoU3VwcG9ydC4uLgotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjZ2V0VUlQYXJ0aWNpcGFudCgpCi0JICovCi0JcHVibGljIElNYXRjaFByZXNlbnRhdGlvbiBnZXRVSVBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gbmV3IEpzTWF0Y2hQcmVzZW50YXRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjc2VhcmNoKG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgUXVlcnlTcGVjaWZpY2F0aW9uIHF1ZXJ5U3BlY2lmaWNhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGluZGV4SWZOZWVkZWQoKTsKLQkJLy8gZG8gc2VhcmNoIGJhc2VkIG9uIHRoZSBwYXJ0aWN1bGFyIEphdmEgcXVlcnkKLQkJaWYgKHF1ZXJ5U3BlY2lmaWNhdGlvbiBpbnN0YW5jZW9mIEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pIHsKLQkJCS8vIGVsZW1lbnQgc2VhcmNoIChlZy4gZnJvbSBnbG9iYWwgZmluZCByZWZlcmVuY2VzIGluIEphdmEgZmlsZSkKLQkJCUVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24gZWxlbWVudFF1ZXJ5ID0gKEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pIHF1ZXJ5U3BlY2lmaWNhdGlvbjsKLQkJCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50ID0gZWxlbWVudFF1ZXJ5LmdldEVsZW1lbnQoKTsKLQkJCWlmIChKc1F1ZXJ5UGFydGljaXBhbnQuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBRdWVyeSBQYXJ0aWNpcGFudCBzZWFyY2hpbmcgb24gRUxFTUVOVDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTZWFyY2hSZXF1ZXN0b3IganNwUmVxdWVzdG9yID0gbmV3IEpzU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQkvLyBwYV9UT0RPIG5lZWQgdG8gYWRhcHQgSmF2YVNlYXJjaFNjb3BlIHRvIGEgSlNQU2VhcmNoU2NvcGUKLQkJCUpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNlYXJjaChlbGVtZW50LCBuZXcgSnNTZWFyY2hTY29wZSgpLCBqc3BSZXF1ZXN0b3IpOwotCQl9IGVsc2UgaWYgKHF1ZXJ5U3BlY2lmaWNhdGlvbiBpbnN0YW5jZW9mIFBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24pIHsKLQkJCS8vIHBhdHRlcm4gc2VhcmNoIChlZy4gZnJvbSBKYXZhIHNlYXJjaCBwYWdlKQotCQkJUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbiBwYXR0ZXJuUXVlcnkgPSAoUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbikgcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJU3RyaW5nIHBhdHRlcm4gPSBwYXR0ZXJuUXVlcnkuZ2V0UGF0dGVybigpOwotCQkJaWYgKEpzUXVlcnlQYXJ0aWNpcGFudC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFF1ZXJ5IFBhcnRpY2lwYW50IHNlYXJjaGluZyBvbiBQQVRURVJOOiAiICsgcGF0dGVybik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSnNTZWFyY2hSZXF1ZXN0b3IocmVxdWVzdG9yKTsKLQkJCUpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNlYXJjaChwYXR0ZXJuLCBuZXcgSnNTZWFyY2hTY29wZSgpLCBwYXR0ZXJuUXVlcnkuZ2V0U2VhcmNoRm9yKCksIHBhdHRlcm5RdWVyeS5nZXRMaW1pdFRvKCksIFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENILCBmYWxzZSwganNwUmVxdWVzdG9yKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmM2M5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU0RULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQkvKgotCSAqIEBzZWUgQWRhcHRlckZhY3RvcnlQcm92aWRlciNhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyB0aGVzZSBhcmUgdGhlIG1haW4gZmFjdG9yaWVzLCBvbiBtb2RlbCdzIGZhY3RvcnkgcmVnaXN0cnkKLQkJYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCS8vIC0tLS0tLS0KLQkJLy8gTXVzdCB1cGRhdGUvYWRkIHRvIHByb3BhZ2F0aW5nIGFkYXB0ZXJzIGhlcmUgdG9vCi0JCWFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCAiUHJvZ3JhbSBFcnJvcjogY2xpZW50IGNhbGxlciBtdXN0IGVuc3VyZSBtb2RlbCBoYXMgZmFjdG9yeSByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmICghKGZhY3RvcnkgaW5zdGFuY2VvZiBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQpKSB7Ci0JCQlmYWN0b3J5UmVnaXN0cnkucmVtb3ZlRmFjdG9yaWVzRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wYWdhdGluZ0FkYXB0ZXJzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7fQotCQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2lzRm9yKENvbnRlbnRUeXBlRGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQkvLyByZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JKU1ApOwotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JIVE1MKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVpbml0aWFsaXplRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWFkZEFkYXB0ZXJGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0pzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0pzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjM3ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNKcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTlRFTlQgPSAianNwX2NvbnRlbnQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0lTdHlsZUNvbnN0YW50c0pTRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZmVjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0pTRFQgewotCVN0cmluZyBKQVZBX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9LRVlXT1JEID0gImtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCA9ICJzaW5nbGVfbGluZV9jb21tZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVZBX1NUUklORyA9ICJzdHJpbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSlNEVENvZGVTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSlNEVENvZGVTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NGYxYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0pTRFRDb2RlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLkVuZE9mTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5TaW5nbGVMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuV29yZFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc0RhdGFUeXBlczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEpTRFRDb2RlU2Nhbm5lciBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuUnVsZUJhc2VkU2Nhbm5lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdDb25zdGFudHMgPSBKc0RhdGFUeXBlcy5DT05TVEFOVFM7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdLZXl3b3JkcyA9IEpzRGF0YVR5cGVzLktFWVdPUkRTOwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnVHlwZXMgPSBKc0RhdGFUeXBlcy5UWVBFUzsKLQlwcml2YXRlIElUb2tlbiBmRGVmYXVsdFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZLZXl3b3JkVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlNpbmdsZUxpbmVDb21tZW50VG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlN0cmluZ1Rva2VuOwotCXByaXZhdGUgSVRva2VuIGZUeXBlVG9rZW47Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIEphdmEgY29kZSBzY2FubmVyCi0JICovCi0JcHVibGljIEpTRFRDb2RlU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJ1bGVzKCkgewotCQlMaXN0IHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBBZGQgcnVsZSBmb3IgbXVsdGlwbGUgbGluZSBjb21tZW50cy4KLQkJcnVsZXMuYWRkKG5ldyBNdWx0aUxpbmVSdWxlKCIvKiIsICIqLyIsIGZTaW5nbGVMaW5lQ29tbWVudFRva2VuKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIEFkZCBydWxlIGZvciBzaW5nbGUgbGluZSBjb21tZW50cy4KLQkJcnVsZXMuYWRkKG5ldyBFbmRPZkxpbmVSdWxlKCIvLyIsIGZTaW5nbGVMaW5lQ29tbWVudFRva2VuKSk7Ly8kTk9OLU5MUy0xJAotCQkvLyBBZGQgcnVsZSBmb3Igc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4KLQkJcnVsZXMuYWRkKG5ldyBTaW5nbGVMaW5lUnVsZSgiXCIiLCAiXCIiLCBmU3RyaW5nVG9rZW4sICdcXCcpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlydWxlcy5hZGQobmV3IFNpbmdsZUxpbmVSdWxlKCInIiwgIiciLCBmU3RyaW5nVG9rZW4sICdcXCcpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkvLyBBZGQgZ2VuZXJpYyB3aGl0ZXNwYWNlIHJ1bGUuCi0JCS8vIHJ1bGVzLmFkZChuZXcgV2hpdGVzcGFjZVJ1bGUobmV3IEphdmFXaGl0ZXNwYWNlRGV0ZWN0b3IoKSkpOwotCQkvLyBBZGQgd29yZCBydWxlIGZvciBrZXl3b3JkcywgdHlwZXMsIGFuZCBjb25zdGFudHMuCi0JCVdvcmRSdWxlIHdvcmRSdWxlID0gbmV3IFdvcmRSdWxlKG5ldyBKYXZhV29yZERldGVjdG9yKCksIGZEZWZhdWx0VG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IEpTRFRDb2RlU2Nhbm5lci5mZ0tleXdvcmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3b3JkUnVsZS5hZGRXb3JkKEpTRFRDb2RlU2Nhbm5lci5mZ0tleXdvcmRzW2ldLCBmS2V5d29yZFRva2VuKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IEpTRFRDb2RlU2Nhbm5lci5mZ1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3b3JkUnVsZS5hZGRXb3JkKEpTRFRDb2RlU2Nhbm5lci5mZ1R5cGVzW2ldLCBmVHlwZVRva2VuKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IEpTRFRDb2RlU2Nhbm5lci5mZ0NvbnN0YW50cy5sZW5ndGg7IGkrKykgewotCQkJd29yZFJ1bGUuYWRkV29yZChKU0RUQ29kZVNjYW5uZXIuZmdDb25zdGFudHNbaV0sIGZUeXBlVG9rZW4pOwotCQl9Ci0JCXJ1bGVzLmFkZCh3b3JkUnVsZSk7Ci0JCUlSdWxlW10gcmVzdWx0ID0gbmV3IElSdWxlW3J1bGVzLnNpemUoKV07Ci0JCXJ1bGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJc2V0UnVsZXMocmVzdWx0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VG9rZW5EYXRhKFN0cmluZyB0b2tlbktleSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9LRVlXT1JEKSB7Ci0JCQlmS2V5d29yZFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQkJZlR5cGVUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU1RSSU5HKSB7Ci0JCQlmU3RyaW5nVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpIHsKLQkJCWZTaW5nbGVMaW5lQ29tbWVudFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9IGVsc2UgaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9ERUZBVUxUKSB7Ci0JCQlmRGVmYXVsdFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXb3JkRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV29yZERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNjI2OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXb3JkRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSmF2YVdvcmREZXRlY3RvciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciB7Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IjaXNXb3JkSWRlbnRpZmllclBhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRQYXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciNpc1dvcmRJZGVudGlmaWVyU3RhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNEVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTZhZDZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9MaW5lU3R5bGVQcm92aWRlckZvckpTRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9ySlNEVCBleHRlbmRzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0JLyoqIFRoZSBzY2FubmVyIGl0IHVzZXMgKi8KLQlwcml2YXRlIEpTRFRDb2RlU2Nhbm5lciBmU2Nhbm5lcjsKLQkKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcmVmZXJlbmNlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBoYXZlIHRvIGRvIGl0IHRoaXMgd2F5IHNvIG90aGVycyBjYW4gb3ZlcnJpZGUgdGhlIG1ldGhvZAotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JKU0RUKCkgewotCQlzdXBlcigpOwotCQlmU2Nhbm5lciA9IG5ldyBKU0RUQ29kZVNjYW5uZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGNvbG9yS2V5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCBhZGRzIHRoZSBzdHlsZQotCSAqIGluZm9ybWF0aW9uIHRvIGxpc3Qgb2YgVGV4dEF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3JLZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSmF2YVRleHRBdHRyaWJ1dGUoU3RyaW5nIGNvbG9yS2V5KSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCAmJiBjb2xvcktleSAhPSBudWxsKSB7Ci0JCQlUZXh0QXR0cmlidXRlIHRhID0gbnVsbDsKLQkJCWlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfS0VZV09SRCkgewotCQkJCS8vIGtleXdvcmQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX1NUUklORykgewotCQkJCS8vIHN0cmluZwotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19JVEFMSUMpOwotCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCkgewotCQkJCS8vIHNpbmdsZSBsaW5lIGNvbW1lbnQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfREVGQVVMVCkgewotCQkJCS8vIGRlZmF1bHQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0KLQkJCWlmICh0YSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIHRhKTsKLQkJCQlmU2Nhbm5lci5zZXRUb2tlbkRhdGEoY29sb3JLZXksIHRhKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHN0eWxlIGluZm9ybWF0aW9uIHRvIHRoZSBnaXZlbiB0ZXh0IHByZXNlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uCi0JICogICAgICAgICAgICB0aGUgdGV4dCBwcmVzZW50YXRpb24gdG8gYmUgZXh0ZW5kZWQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBkZXNjcmliaW5nIHRoZSBzdHlsZSBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJhbmdlKENvbGxlY3Rpb24gcHJlc2VudGF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBUZXh0QXR0cmlidXRlIGF0dHIpIHsKLQkJLy8gc3VwcG9ydCBmb3IgdXNlciBkZWZpbmVkIGJhY2tncm91ZCBmb3IgSlNQIHNjcmlwdGxldCByZWdpb25zCi0JCVRleHRBdHRyaWJ1dGUgdGEgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSnMuSlNQX0NPTlRFTlQpOwotCQlDb2xvciBiZ0NvbG9yID0gdGEuZ2V0QmFja2dyb3VuZCgpOwotCQlpZiAoYmdDb2xvciA9PSBudWxsKSB7Ci0JCQliZ0NvbG9yID0gYXR0ci5nZXRCYWNrZ3JvdW5kKCk7Ci0JCX0KLQkJU3R5bGVSYW5nZSByZXN1bHQgPSBuZXcgU3R5bGVSYW5nZShvZmZzZXQsIGxlbmd0aCwgYXR0ci5nZXRGb3JlZ3JvdW5kKCksIGJnQ29sb3IsIGF0dHIuZ2V0U3R5bGUoKSk7Ci0JCWlmICgoYXR0ci5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwKSB7Ci0JCQlyZXN1bHQuc3RyaWtlb3V0ID0gdHJ1ZTsKLQkJfQotCQlpZiAoKGF0dHIuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwKSB7Ci0JCQlyZXN1bHQudW5kZXJsaW5lID0gdHJ1ZTsKLQkJfQotCQlwcmVzZW50YXRpb24uYWRkKHJlc3VsdCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBKc1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldEphdmFDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHRleHQgYXR0cmlidXRlIGVuY29kZWQgaW4gdGhlIGdpdmVuIHRva2VuLiBJZiB0aGUgdG9rZW4ncyBkYXRhCi0JICogaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCBhIHRleHQgYXR0cmlidXRlIGl0IGlzIGFzc3VtZWQgdGhhdCBpdCBpcwotCSAqIHRoZSBlbmNvZGVkIHRleHQgYXR0cmlidXRlLiBJdCByZXR1cm5zIHRoZSBkZWZhdWx0IHRleHQgYXR0cmlidXRlIGlmCi0JICogdGhlcmUgaXMgbm8gZW5jb2RlZCB0ZXh0IGF0dHJpYnV0ZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiAgICAgICAgICAgIHRoZSB0b2tlbiB3aG9zZSB0ZXh0IGF0dHJpYnV0ZSBpcyB0byBiZSBkZXRlcm1pbmVkCi0JICogQHJldHVybiB0aGUgdG9rZW4ncyB0ZXh0IGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBnZXRUb2tlblRleHRBdHRyaWJ1dGUoSVRva2VuIHRva2VuKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCQlPYmplY3QgZGF0YSA9IHRva2VuLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBUZXh0QXR0cmlidXRlKSB7Ci0JCQl0YSA9IChUZXh0QXR0cmlidXRlKSBkYXRhOwotCQl9IGVsc2UgewotCQkJdGEgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX0RFRkFVTFQpOwotCQl9Ci0JCXJldHVybiB0YTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCQlTdHJpbmcgamF2YVN0eWxlS2V5ID0gbnVsbDsKLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzSnMuSlNQX0NPTlRFTlQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKcy5KU1BfQ09OVEVOVDsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQuZXF1YWxzKHByZWZLZXkpKSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJamF2YVN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX0tFWVdPUkQ7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xELmVxdWFscyhwcmVmS2V5KSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9TVFJJTkc7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQuZXF1YWxzKHByZWZLZXkpKSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9TSU5HTEVfTElORV9DT01NRU5UOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRC5lcXVhbHMocHJlZktleSkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfREVGQVVMVDsKLQkJCX0KLQkJfQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQl9Ci0JCWlmIChqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZEphdmFUZXh0QXR0cmlidXRlKGphdmFTdHlsZUtleSk7Ci0JCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQkJfQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCB8fCBqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gZm9yY2UgYSBmdWxsIHVwZGF0ZSBvZiB0aGUgdGV4dCB2aWV3ZXIKLQkJCXN1cGVyLmdldEhpZ2hsaWdodGVyKCkucmVmcmVzaERpc3BsYXkoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSnMuSlNQX0NPTlRFTlQpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfS0VZV09SRCk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9TVFJJTkcpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9ERUZBVUxUKTsKLQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IHNzc3NyZXF1ZXN0ZWRTdGFydCwgaW50IHNzc3NyZXF1ZXN0ZWRMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQkvKiBJbml0aWFsaXplIHRoZSB0ZXh0IGF0dHJpYnV0ZXMuIEFsc28gbG9hZCB0aGUgY29sb3JzIGFuZCBpbml0aWFsaXplIHRoZSBydWxlcyBvZiB0aGUgc2Nhbm5lciAqLwotCQlnZXRUZXh0QXR0cmlidXRlcygpOwotCQl0cnkgewotCQkJLy8gaWRlYWxseSwgZXZlbnR1YWxseSwgd2UnbGwgaGF2ZSBhICJ2aXJ0dWFsRG9jdW1lbnQiIHdlIGNhbgotCQkJLy8gcmVmZXIgdG8sIGJ1dCBmb3Igbm93IC4uLiB3ZSdsbCBzaW1wbGUgcmVzY2FuIHRoZSBvbmUgcmVnaW9uLgotCQkJLy8gdXNlIHNpbXBsZSBhZGp1c3RtZW50IChzaW5jZSAic3ViLWNvbnRlbnQiIHN0YXJ0cyBhdCAwCi0JCQlpbnQgbGFzdFN0YXJ0ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCUlUb2tlbiBsYXN0VG9rZW4gPSBUb2tlbi5VTkRFRklORUQ7Ci0JCQlmU2Nhbm5lci5zZXRSYW5nZShnZXREb2N1bWVudCgpLCBsYXN0U3RhcnQsIHR5cGVkUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJSVRva2VuIHRva2VuID0gZlNjYW5uZXIubmV4dFRva2VuKCk7Ci0JCQkJaWYgKHRva2VuLmlzRU9GKCkpIHsKLQkJCQkJaWYgKCFsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSAmJiBsZW5ndGggIT0gMCkgewotCQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCwgbGVuZ3RoLCBnZXRUb2tlblRleHRBdHRyaWJ1dGUobGFzdFRva2VuKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0b2tlbi5pc1doaXRlc3BhY2UoKSkgewotCQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSkgewotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAodG9rZW4gIT0gbGFzdFRva2VuKSB7Ci0JCQkJCWFkZFJhbmdlKGhvbGRSZXN1bHRzLCBsYXN0U3RhcnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGFzdFN0YXJ0ID0gZlNjYW5uZXIuZ2V0VG9rZW5PZmZzZXQoKTsKLQkJCQkJbGVuZ3RoID0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkbid0IGhhcHBlbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8gc3RvcCBvdGhlcgotCQkJLy8gaGlnaGxpZ2h0aW5nLCBpZiBpdCBkb2VzLgotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWZTY2FubmVyID0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdW5SZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTFByaW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDAwZTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MUHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotY2xhc3MgSFRNTFByaW50ZXIgewotCXN0YXRpYyBSR0IgQkdfQ09MT1JfUkdCID0gbnVsbDsKLQlzdGF0aWMgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkvKgotCQkJCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJCQkgKi8KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSFRNTFByaW50ZXIuQkdfQ09MT1JfUkdCID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKS5nZXRSR0IoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoU1dURXJyb3IgZXJyKSB7Ci0JCQkJLy8gc2VlOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDUyOTQKLQkJCQlpZiAoZXJyLmNvZGUgIT0gU1dULkVSUk9SX0RFVklDRV9ESVNQT1NFRCkgewotCQkJCQl0aHJvdyBlcnI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRCdWxsZXQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGJ1bGxldCkgewotCQlpZiAoYnVsbGV0ICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIjxsaT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChidWxsZXQpOwotCQkJYnVmZmVyLmFwcGVuZCgiPC9saT4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYWdlRXBpbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJYnVmZmVyLmFwcGVuZCgiPC9mb250PjwvYm9keT48L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlIVE1MUHJpbnRlci5pbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgYnVmZmVyLmxlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhcmFncmFwaChTdHJpbmdCdWZmZXIgYnVmZmVyLCBSZWFkZXIgcGFyYWdyYXBoUmVhZGVyKSB7Ci0JCWlmIChwYXJhZ3JhcGhSZWFkZXIgIT0gbnVsbCkgewotCQkJSFRNTFByaW50ZXIuYWRkUGFyYWdyYXBoKGJ1ZmZlciwgSFRNTFByaW50ZXIucmVhZChwYXJhZ3JhcGhSZWFkZXIpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGFyYWdyYXBoKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBwYXJhZ3JhcGgpIHsKLQkJaWYgKHBhcmFncmFwaCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI8cD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChwYXJhZ3JhcGgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTbWFsbEhlYWRlcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgaGVhZGVyKSB7Ci0JCWlmIChoZWFkZXIgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiPGg1PiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKGhlYWRlcik7Ci0JCQlidWZmZXIuYXBwZW5kKCI8L2g1PiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRDb2xvcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBSR0IgcmdiKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoJyMnKTsKLQkJYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5yZWQpKTsKLQkJYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5ncmVlbikpOwotCQlidWZmZXIuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcocmdiLmJsdWUpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRTdHlsZVNoZWV0TGluayhTdHJpbmdCdWZmZXIgYnVmZmVyLCBVUkwgc3R5bGVTaGVldFVSTCkgewotCQlpZiAoc3R5bGVTaGVldFVSTCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiPGhlYWQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiPExJTksgUkVMPVwic3R5bGVzaGVldFwiIEhSRUY9IFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChzdHlsZVNoZWV0VVJMKTsKLQkJYnVmZmVyLmFwcGVuZCgiXCIgQ0hBUlNFVD1cIklTTy04ODU5LTFcIiBUWVBFPVwidGV4dC9jc3NcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCI8L2hlYWQ+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJY29udGVudCA9IEhUTUxQcmludGVyLnJlcGxhY2UoY29udGVudCwgJyYnLCAiJmFtcDsiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZW50ID0gSFRNTFByaW50ZXIucmVwbGFjZShjb250ZW50LCAnIicsICImcXVvdDsiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZW50ID0gSFRNTFByaW50ZXIucmVwbGFjZShjb250ZW50LCAnPCcsICImbHQ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIEhUTUxQcmludGVyLnJlcGxhY2UoY29udGVudCwgJz4nLCAiJmd0OyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmRCdWxsZXRMaXN0KFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJYnVmZmVyLmFwcGVuZCgiPC91bD4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBSR0IgZ2V0QmdDb2xvcigpIHsKLQkJaWYgKEhUTUxQcmludGVyLkJHX0NPTE9SX1JHQiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gSFRNTFByaW50ZXIuQkdfQ09MT1JfUkdCOwotCQl9Ci0JCS8vIFJHQiB2YWx1ZSBvZiBpbmZvIGJnIGNvbG9yIG9uIFdpbmRvd3NYUAotCQlyZXR1cm4gbmV3IFJHQigyNTUsIDI1NSwgMjI1KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uKSB7Ci0JCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbiwgSFRNTFByaW50ZXIuZ2V0QmdDb2xvcigpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uLCBSR0IgYmdSR0IpIHsKLQkJaWYgKGJnUkdCID09IG51bGwpIHsKLQkJCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgcGFnZVByb2xvZyA9IG5ldyBTdHJpbmdCdWZmZXIoNjApOwotCQkJcGFnZVByb2xvZy5hcHBlbmQoIjxodG1sPjxib2R5IHRleHQ9XCIjMDAwMDAwXCIgYmdjb2xvcj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCQlIVE1MUHJpbnRlci5hcHBlbmRDb2xvcihwYWdlUHJvbG9nLCBiZ1JHQik7Ci0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiXCI+PGZvbnQgc2l6ZT0tMT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmluc2VydChwb3NpdGlvbiwgcGFnZVByb2xvZy50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0UGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgcG9zaXRpb24sIFJHQiBiZ1JHQiwgVVJMIHN0eWxlU2hlZXRVUkwpIHsKLQkJaWYgKGJnUkdCID09IG51bGwpIHsKLQkJCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbiwgc3R5bGVTaGVldFVSTCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgcGFnZVByb2xvZyA9IG5ldyBTdHJpbmdCdWZmZXIoMzAwKTsKLQkJCXBhZ2VQcm9sb2cuYXBwZW5kKCI8aHRtbD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJSFRNTFByaW50ZXIuYXBwZW5kU3R5bGVTaGVldExpbmsocGFnZVByb2xvZywgc3R5bGVTaGVldFVSTCk7Ci0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiPGJvZHkgdGV4dD1cIiMwMDAwMDBcIiBiZ2NvbG9yPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCUhUTUxQcmludGVyLmFwcGVuZENvbG9yKHBhZ2VQcm9sb2csIGJnUkdCKTsKLQkJCXBhZ2VQcm9sb2cuYXBwZW5kKCJcIj48Zm9udCBzaXplPS0xPiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuaW5zZXJ0KHBvc2l0aW9uLCBwYWdlUHJvbG9nLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBwb3NpdGlvbiwgVVJMIHN0eWxlU2hlZXRVUkwpIHsKLQkJSFRNTFByaW50ZXIuaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIHBvc2l0aW9uLCBIVE1MUHJpbnRlci5nZXRCZ0NvbG9yKCksIHN0eWxlU2hlZXRVUkwpOwotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIHJlYWQoUmVhZGVyIHJkKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbMjA0OF07Ci0JCXRyeSB7Ci0JCQlpbnQgbiA9IHJkLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCW4gPSByZC5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBuZXZlciBleHBlY3RlZAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgeC5nZXRNZXNzYWdlKCksIHgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgdGV4dCwgY2hhciBjLCBTdHJpbmcgcykgewotCQlpbnQgcHJldmlvdXMgPSAwOwotCQlpbnQgY3VycmVudCA9IHRleHQuaW5kZXhPZihjLCBwcmV2aW91cyk7Ci0JCWlmIChjdXJyZW50ID09IC0xKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoY3VycmVudCA+IC0xKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHByZXZpb3VzLCBjdXJyZW50KSk7Ci0JCQlidWZmZXIuYXBwZW5kKHMpOwotCQkJcHJldmlvdXMgPSBjdXJyZW50ICsgMTsKLQkJCWN1cnJlbnQgPSB0ZXh0LmluZGV4T2YoYywgcHJldmlvdXMpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcocHJldmlvdXMpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRCdWxsZXRMaXN0KFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJYnVmZmVyLmFwcGVuZCgiPHVsPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgSFRNTFByaW50ZXIoKSB7Ci0JLy8gbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9KU0RUSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9KU0RUSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThkNWU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSlNEVEhvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkphdmFTY3JpcHRFbGVtZW50TGFiZWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkpTZG9jQ29udGVudEFjY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uQWJzdHJhY3RIb3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVEhvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JLyoKLQkgKiBCdWxrIG9mIHRoZSB3b3JrIHdhcyBjb3BpZWQgZnJvbQotCSAqIG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5ob3Zlci5KYXZhZG9jSG92ZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGxvbmcgTEFCRUxfRkxBR1MgPSBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5BTExfRlVMTFlfUVVBTElGSUVEIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuTV9QUkVfUkVUVVJOVFlQRSB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLk1fUEFSQU1FVEVSX1RZUEVTIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuTV9QQVJBTUVURVJfTkFNRVMgfCBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5NX0VYQ0VQVElPTlMgfCBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5GX1BSRV9UWVBFX1NJR05BVFVSRSB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLk1fUFJFX1RZUEVfUEFSQU1FVEVSUyB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLlRfVFlQRV9QQVJBTUVURVJTIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuVVNFX1JFU09MVkVEOwotCXByaXZhdGUgZmluYWwgbG9uZyBMT0NBTF9WQVJJQUJMRV9GTEFHUyA9IExBQkVMX0ZMQUdTICYgfkphdmFTY3JpcHRFbGVtZW50TGFiZWxzLkZfRlVMTFlfUVVBTElGSUVEIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuRl9QT1NUX1FVQUxJRklFRDsKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRIb3ZlckluZm8oSUphdmFTY3JpcHRFbGVtZW50W10gcmVzdWx0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBuUmVzdWx0cyA9IHJlc3VsdC5sZW5ndGg7Ci0JCWlmIChuUmVzdWx0cyA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoblJlc3VsdHMgPiAxKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCUhUTUxQcmludGVyLnN0YXJ0QnVsbGV0TGlzdChidWZmZXIpOwotCQkJCUlKYXZhU2NyaXB0RWxlbWVudCBjdXJyID0gcmVzdWx0W2ldOwotCQkJCWlmIChjdXJyIGluc3RhbmNlb2YgSU1lbWJlciB8fCBjdXJyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LkxPQ0FMX1ZBUklBQkxFKSB7Ci0JCQkJCUhUTUxQcmludGVyLmFkZEJ1bGxldChidWZmZXIsIGdldEluZm9UZXh0KGN1cnIpKTsKLQkJCQl9Ci0JCQkJSFRNTFByaW50ZXIuZW5kQnVsbGV0TGlzdChidWZmZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSUphdmFTY3JpcHRFbGVtZW50IGN1cnIgPSByZXN1bHRbMF07Ci0JCQlpZiAoY3VyciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpZiAoY3VyciBpbnN0YW5jZW9mIElNZW1iZXIpIHsKLQkJCQlJTWVtYmVyIG1lbWJlciA9IChJTWVtYmVyKSBjdXJyOwotCQkJCUhUTUxQcmludGVyLmFkZFNtYWxsSGVhZGVyKGJ1ZmZlciwgZ2V0SW5mb1RleHQobWVtYmVyKSk7Ci0JCQkJUmVhZGVyIHJlYWRlcjsKLQkJCQl0cnkgewotCQkJCQlyZWFkZXIgPSBKU2RvY0NvbnRlbnRBY2Nlc3MuZ2V0SFRNTENvbnRlbnRSZWFkZXIobWVtYmVyLCB0cnVlLCB0cnVlKTsKLQkJCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCQlIVE1MUHJpbnRlci5hZGRQYXJhZ3JhcGgoYnVmZmVyLCByZWFkZXIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY3Vyci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5MT0NBTF9WQVJJQUJMRSB8fCBjdXJyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEVfUEFSQU1FVEVSKSB7Ci0JCQkJSFRNTFByaW50ZXIuYWRkU21hbGxIZWFkZXIoYnVmZmVyLCBnZXRJbmZvVGV4dChjdXJyKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCAwKTsKLQkJCUhUTUxQcmludGVyLmFkZFBhZ2VFcGlsb2coYnVmZmVyKTsKLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQkvLyBnZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyB2aWV3ZXIncyBkb2N1bWVudAotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbih0cnVlKTsKLQkJCQkJSUphdmFTY3JpcHRFbGVtZW50W10gcmVzdWx0ID0gdHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKSwgaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCkgKyBob3ZlclJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0vLyBWZWN0b3IgZmlsdGVyZWRSZXN1bHRzID0gbmV3IFZlY3RvcigpOwotLy8gTGlzdCBiYWRGdW5jdGlvbnMgPSB0cmFuc2xhdGlvbi5nZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCk7Ci0vLyBib29sZWFuIGJhZCA9IGZhbHNlOwotLy8gZm9yKGludCBpID0gMDtpPHJlc3VsdC5sZW5ndGg7aSsrKXsKLS8vIGJhZD1mYWxzZTsKLS8vIGlmKHJlc3VsdFtpXSBpbnN0YW5jZW9mIElGdW5jdGlvbil7Ci0vLyBmb3IoaW50IGo9MDtqPGJhZEZ1bmN0aW9ucy5zaXplKCkgJiYgISBiYWQ7aisrKXsKLS8vIGlmKCgoSUZ1bmN0aW9uKXJlc3VsdFtpXSkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpYmFkRnVuY3Rpb25zLmdldChqKSkpewotLy8gYmFkPXRydWU7Ci0vLyBjb250aW51ZTsKLS8vIH0KLS8vIH0KLS8vIGlmKCFiYWQpZmlsdGVyZWRSZXN1bHRzLmFkZChyZXN1bHRbaV0pOwotLy8gfQotLy8gfQotLy8gaWYoZmlsdGVyZWRSZXN1bHRzLnNpemUoKTwxKSByZXR1cm4gbmV3IFN0cmluZygpOwotLy8JCQkJCQotLy8gU3RyaW5nIGZpbHRlcmVkUmVzdWx0ID0KLS8vIHRyYW5zbGF0aW9uLmZpeHVwTWFuZ2xlZE5hbWUoZ2V0SG92ZXJJbmZvKChJSmF2YVNjcmlwdEVsZW1lbnRbXSlmaWx0ZXJlZFJlc3VsdHMudG9BcnJheShuZXcKLS8vIElKYXZhU2NyaXB0RWxlbWVudFtde30pKSk7Ci0vLyBmb3IoaW50IGkgPSAwO2k8YmFkRnVuY3Rpb25zLnNpemUoKTtpKyspewotLy8gZmlsdGVyZWRSZXN1bHQucmVwbGFjZSgoU3RyaW5nKWJhZEZ1bmN0aW9ucy5nZXQoaSksICIiKTsKLS8vIH0KLS8vIHJldHVybiBmaWx0ZXJlZFJlc3VsdDsKLQkJCQkJcmV0dXJuIHRyYW5zbGF0aW9uLmZpeHVwTWFuZ2xlZE5hbWUoZ2V0SG92ZXJJbmZvKHJlc3VsdCkpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gSnNXb3JkRmluZGVyLmZpbmRXb3JkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5mb1RleHQoSUphdmFTY3JpcHRFbGVtZW50IG1lbWJlcikgewotCQlsb25nIGZsYWdzID0gbWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LkxPQ0FMX1ZBUklBQkxFID8gTE9DQUxfVkFSSUFCTEVfRkxBR1MgOiBMQUJFTF9GTEFHUzsKLQkJU3RyaW5nIGxhYmVsID0gSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuZ2V0RWxlbWVudExhYmVsKG1lbWJlciwgZmxhZ3MpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBsYWJlbC5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPT0gJzwnKSB7Ci0JCQkJYnVmLmFwcGVuZCgiJmx0OyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGNoID09ICc+JykgewotCQkJCWJ1Zi5hcHBlbmQoIiZndDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlidWYuYXBwZW5kKGNoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0pTRFRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSlNEVEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM4YTRmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSlNEVEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVEluZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24gewotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNEVEluZm9ybWF0aW9uUHJvdmlkZXIoKSB7Ci0JCWZUZXh0SG92ZXIgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBKU0RUSG92ZXJQcm9jZXNzb3IoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCQotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9Kc1dvcmRGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9Kc1dvcmRGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzMTFhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSnNXb3JkRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBKc1dvcmRGaW5kZXIgewotCXB1YmxpYyBzdGF0aWMgSVJlZ2lvbiBmaW5kV29yZChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWludCBlbmQgPSAtMTsKLQkJdHJ5IHsKLQkJCWludCBwb3MgPSBvZmZzZXQ7Ci0JCQljaGFyIGM7Ci0JCQl3aGlsZSAocG9zID49IDApIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihwb3MpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSmF2YVdvcmRGaW5kZXIuZmluZFdvcmQoKSBUZXN0IGphdmEgY2hhcgotCQkJCS8vICgtLSk6IiArIGMpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQktLXBvczsKLQkJCX0KLQkJCXN0YXJ0ID0gcG9zOwotCQkJcG9zID0gb2Zmc2V0OwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50LmdldExlbmd0aCgpOwotCQkJd2hpbGUgKHBvcyA8IGxlbmd0aCkgewotCQkJCWMgPSBkb2N1bWVudC5nZXRDaGFyKHBvcyk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJKYXZhV29yZEZpbmRlci5maW5kV29yZCgpIFRlc3QgamF2YSBjaGFyCi0JCQkJLy8gKCsrKToiICsgYyk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCSsrcG9zOwotCQkJfQotCQkJZW5kID0gcG9zOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGFydDoiICsgc3RhcnQgKyAiRW5kOiIrZW5kKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSmF2YVdvcmRGaW5kZXIuZmluZFdvcmQoKSBSZXRyaWV2ZWQgamF2YQotCQkJLy8gdG9rZW4gb2Y6IiArIGRvY3VtZW50LmdldChzdGFydCwgZW5kLXN0YXJ0KSApOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkJaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gLTEpIHsKLQkJCWlmIChzdGFydCA9PSBvZmZzZXQgJiYgZW5kID09IG9mZnNldCkgewotCQkJCXJldHVybiBuZXcgUmVnaW9uKG9mZnNldCwgMCk7Ci0JCQl9IGVsc2UgaWYgKHN0YXJ0ID09IG9mZnNldCkgewotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0ICsgMSwgZW5kIC0gc3RhcnQgLSAxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNDb2RlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNDb2RlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OTM3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzQ29kZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZGVyaXZlZC5TaW5nbGVDaGFyUmVhZGVyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotY2xhc3MgSnNDb2RlUmVhZGVyIGV4dGVuZHMgU2luZ2xlQ2hhclJlYWRlciB7Ci0JLyoqIFRoZSBFT0YgY2hhcmFjdGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVOdW1iZXIgPSAtMTsKLQlwcml2YXRlIGludCBmQ2FjaGVkTGluZU9mZnNldCA9IC0xOwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmRW5kID0gLTE7Ci0JcHJpdmF0ZSBib29sZWFuIGZGb3J3YXJkID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldDsKLQlwcml2YXRlIGJvb2xlYW4gZlNraXBDb21tZW50cyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU2tpcFN0cmluZ3MgPSBmYWxzZTsKLQkKLQlwdWJsaWMgSnNDb2RlUmVhZGVyKCkge30KLQkKLQkvKgotCSAqIEBzZWUgUmVhZGVyI2Nsb3NlKCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUJhY2t3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQkJZkZvcndhcmQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZDYWNoZWRMaW5lTnVtYmVyID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb25maWd1cmVGb3J3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQkJZkZvcndhcmQgPSB0cnVlOwotCQlmRW5kID0gTWF0aC5taW4oZkRvY3VtZW50LmdldExlbmd0aCgpLCBmT2Zmc2V0ICsgbGVuZ3RoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IHJlYWQgY2hhcmFjdGVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQKLQkgKiBhZnRlciByZWFkIGhhcyBiZWVuIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZGb3J3YXJkID8gZk9mZnNldCAtIDEgOiBmT2Zmc2V0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRFbmQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicpIHsKLQkJCQlpZiAoZk9mZnNldCA8IGZFbmQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJCSsrZk9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRTdGFydCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldC0tKTsKLQkJCWlmIChjdXJyZW50ID09ICcqJyAmJiAwIDw9IGZPZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnb3RvTGluZUVuZCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJZk9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUgKyAxKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdvdG9TdHJpbmdFbmQoY2hhciBkZWxpbWl0ZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQkJCWlmIChjdXJyZW50ID09ICdcXCcpIHsKLQkJCQkvLyBpZ25vcmUgZXNjYXBlZCBjaGFyYWN0ZXJzCi0JCQkJKytmT2Zmc2V0OwotCQkJfSBlbHNlIGlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ1N0YXJ0KGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJaWYgKGN1cnJlbnQgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKCEoMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQgLSAxKSA9PSAnXFwnKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJLS1mT2Zmc2V0OwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTaW5nbGVMaW5lQ29tbWVudCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJaWYgKGxpbmUgPCBmQ2FjaGVkTGluZU51bWJlcikgewotCQkJZkNhY2hlZExpbmVOdW1iZXIgPSBsaW5lOwotCQkJZkNhY2hlZExpbmVPZmZzZXQgPSBmRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCWludCBvZmZzZXQgPSBmT2Zmc2V0OwotCQkJd2hpbGUgKGZDYWNoZWRMaW5lT2Zmc2V0IDwgb2Zmc2V0KSB7Ci0JCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIob2Zmc2V0LS0pOwotCQkJCWlmIChjdXJyZW50ID09ICcvJyAmJiBmQ2FjaGVkTGluZU9mZnNldCA8PSBvZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIob2Zmc2V0KSA9PSAnLycpIHsKLQkJCQkJZk9mZnNldCA9IG9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgU2luZ2xlQ2hhclJlYWRlciNyZWFkKCkKLQkgKi8KLQkKLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZGb3J3YXJkID8gcmVhZEZvcndhcmRzKCkgOiByZWFkQmFja3dhcmRzKCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgcmVhZEJhY2t3YXJkcygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJLS1mT2Zmc2V0OwotCQkJaGFuZGxlU2luZ2xlTGluZUNvbW1lbnQoKTsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLyc6Ci0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPiAxKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgZW5kcywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBzdGFydAotCQkJCQkJCWZPZmZzZXQgLT0gMjsKLQkJCQkJCQlnb3RvQ29tbWVudFN0YXJ0KCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJY2FzZSAnXCcnOgotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQktLWZPZmZzZXQ7Ci0JCQkJCQlnb3RvU3RyaW5nU3RhcnQoY3VycmVudCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQkJCX0KLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0JCXJldHVybiBKc0NvZGVSZWFkZXIuRU9GOwotCX0KLQkKLQlwcml2YXRlIGludCByZWFkRm9yd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlzd2l0Y2ggKGN1cnJlbnQpIHsKLQkJCQljYXNlICcvJzoKLQkJCQkJaWYgKGZTa2lwQ29tbWVudHMgJiYgZk9mZnNldCA8IGZFbmQpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBlbmQKLQkJCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCQkJZ290b0NvbW1lbnRFbmQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSBpZiAobmV4dCA9PSAnLycpIHsKLQkJCQkJCQkvLyAnLy8nLWNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBsaW5lIGVuZAotCQkJCQkJCWdvdG9MaW5lRW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJY2FzZSAnXCcnOgotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQlnb3RvU3RyaW5nRW5kKGN1cnJlbnQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCQlyZXR1cm4gSnNDb2RlUmVhZGVyLkVPRjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YzEwZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dC5Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciBleHRlbmRzIERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyAneycsICd9JywgJygnLCAnKScsICdbJywgJ10nIH07Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyKCkgewotCQlzdXBlcihuZXcgU3RyaW5nW10geyBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLAotCQkJCURPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlQgfSwgbmV3IEpzUGFpck1hdGNoZXIoSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLkJSQUNLRVRTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzUGFpck1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGV4dC9Kc1BhaXJNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTY1YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzUGFpck1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEpzUGFpck1hdGNoZXIgaW1wbGVtZW50cyBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgewotCXByb3RlY3RlZCBpbnQgZkFuY2hvcjsKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcm90ZWN0ZWQgaW50IGZFbmRQb3M7Ci0JcHJvdGVjdGVkIGludCBmT2Zmc2V0OwotCXByb3RlY3RlZCBjaGFyW10gZlBhaXJzOwotCXByb3RlY3RlZCBKc0NvZGVSZWFkZXIgZlJlYWRlciA9IG5ldyBKc0NvZGVSZWFkZXIoKTsKLQlwcm90ZWN0ZWQgaW50IGZTdGFydFBvczsKLQkKLQlwdWJsaWMgSnNQYWlyTWF0Y2hlcihjaGFyW10gcGFpcnMpIHsKLQkJZlBhaXJzID0gcGFpcnM7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAoZlJlYWRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZSZWFkZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljbGVhcigpOwotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUmVhZGVyID0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZ2V0QW5jaG9yKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFuY2hvcigpIHsKLQkJcmV0dXJuIGZBbmNob3I7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI21hdGNoKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIG1hdGNoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAoZk9mZnNldCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgbWF0Y2hQYWlyc0F0KCkgJiYgZlN0YXJ0UG9zICE9IGZFbmRQb3MpIHsKLQkJCXJldHVybiBuZXcgUmVnaW9uKGZTdGFydFBvcywgZkVuZFBvcyAtIGZTdGFydFBvcyArIDEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaFBhaXJzQXQoKSB7Ci0JCWludCBpOwotCQlpbnQgcGFpckluZGV4MSA9IGZQYWlycy5sZW5ndGg7Ci0JCWludCBwYWlySW5kZXgyID0gZlBhaXJzLmxlbmd0aDsKLQkJZlN0YXJ0UG9zID0gLTE7Ci0JCWZFbmRQb3MgPSAtMTsKLQkJLy8gZ2V0IHRoZSBjaGFycyBwcmVjZWRpbmcgYW5kIGZvbGxvd2luZyB0aGUgc3RhcnQgcG9zaXRpb24KLQkJdHJ5IHsKLQkJCWNoYXIgcHJldkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihNYXRoLm1heChmT2Zmc2V0IC0gMSwgMCkpOwotCQkJLy8gbW9kaWZpZWQgYmVoYXZpb3IgZm9yCi0JCQkvLyBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODc5Ci0JCQkvLyBjaGFyIG5leHRDaGFyPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCS8vIHNlYXJjaCBmb3Igb3BlbmluZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJLy8gaWYgKG5leHRDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCS8vIGZTdGFydFBvcz0gZk9mZnNldDsKLQkJCQkvLyBwYWlySW5kZXgxPSBpOwotCQkJCS8vIH0gZWxzZQotCQkJCWlmIChwcmV2Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkJZlN0YXJ0UG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDEgPSBpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHNlYXJjaCBmb3IgY2xvc2luZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmRW5kUG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDIgPSBpOwotCQkJCX0KLQkJCQkvLyBlbHNlIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLyBmRW5kUG9zPSBmT2Zmc2V0OwotCQkJCS8vIHBhaXJJbmRleDI9IGk7Ci0JCQkJLy8gfQotCQkJfQotCQkJaWYgKGZFbmRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuUklHSFQ7Ci0JCQkJZlN0YXJ0UG9zID0gc2VhcmNoRm9yT3BlbmluZ1BlZXIoZkVuZFBvcywgZlBhaXJzW3BhaXJJbmRleDIgLSAxXSwgZlBhaXJzW3BhaXJJbmRleDJdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmU3RhcnRQb3MgPiAtMSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlmRW5kUG9zID0gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChmU3RhcnRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuTEVGVDsKLQkJCQlmRW5kUG9zID0gc2VhcmNoRm9yQ2xvc2luZ1BlZXIoZlN0YXJ0UG9zLCBmUGFpcnNbcGFpckluZGV4MV0sIGZQYWlyc1twYWlySW5kZXgxICsgMV0sIGZEb2N1bWVudCk7Ci0JCQkJaWYgKGZFbmRQb3MgPiAtMSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlmU3RhcnRQb3MgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBzZWFyY2hGb3JDbG9zaW5nUGVlcihpbnQgb2Zmc2V0LCBpbnQgb3BlbmluZ1BlZXIsIGludCBjbG9zaW5nUGVlciwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmUmVhZGVyLmNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCArIDEsIGRvY3VtZW50LmdldExlbmd0aCgpLCB0cnVlLCB0cnVlKTsKLQkJaW50IHN0YWNrID0gMTsKLQkJaW50IGMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gSnNDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gb3BlbmluZ1BlZXIgJiYgYyAhPSBjbG9zaW5nUGVlcikgewotCQkJCXN0YWNrKys7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gY2xvc2luZ1BlZXIpIHsKLQkJCQlzdGFjay0tOwotCQkJfQotCQkJaWYgKHN0YWNrID09IDApIHsKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQkJCX0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yT3BlbmluZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRlci5jb25maWd1cmVCYWNrd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0LCB0cnVlLCB0cnVlKTsKLQkJaW50IHN0YWNrID0gMTsKLQkJaW50IGMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gSnNDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gY2xvc2luZ1BlZXIgJiYgYyAhPSBvcGVuaW5nUGVlcikgewotCQkJCXN0YWNrKys7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gb3BlbmluZ1BlZXIpIHsKLQkJCQlzdGFjay0tOwotCQkJfQotCQkJaWYgKHN0YWNrID09IDApIHsKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQkJCX0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA2MWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLjA9V2ViIFByb2plY3Qgc3VwcG9ydCBmb3IgSlNEVApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9yaW5vLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvcmluby5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTZhZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9yaW5vLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSUphdmFXZWJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0lKYXZhV2ViTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjk5MThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSUphdmFXZWJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJSmF2YVdlYk5vZGUgewotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKTsKLQkKLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCk7Ci0JCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmYTk1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmUuSnNDb250ZW50T3V0bGluZUNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUIGV4dGVuZHMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQoKSB7Ci0JCXRoaXMoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCQotCQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQkvLyBzaW5nbGV0b25BZGFwdGVyID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGb3JKU0RUKHRoaXMpOwotCQkJaWYgKEpzQ29udGVudE91dGxpbmVDb25maWcuVVNFX0FEVkFOQ0VEKSB7Ci0JCQkJc2luZ2xldG9uQWRhcHRlciA9IG5ldyBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZvckpzKHRoaXMpOwotCQkJfSBlbHNlIHsKLQkJCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRm9ySnModGhpcyk7Ci0JCQl9Ci0JCQlpbml0QWRhcHRlcihzaW5nbGV0b25BZGFwdGVyLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JKcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExMmRhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVNvdXJjZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVJlZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLlN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGb3JKcyBleHRlbmRzIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MIHsKLQkKLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZvckpzKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdFVuaXQgbGF6eUN1OwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCXByaXZhdGUgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyIGphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSkgewotCQkJSmF2YUVsZW1lbnQgZW5jbG9zZWRFbGVtZW50ID0gKEphdmFFbGVtZW50KSAoKElKYXZhV2ViTm9kZSkgb2JqZWN0KS5nZXRKYXZhRWxlbWVudCgpOwotCQkJaWYgKGVuY2xvc2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUphdmFTY3JpcHRFbGVtZW50W10gY2hpbGRyZW4gPSBlbmNsb3NlZEVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCQkJCQl9Ci0JCQkJCU9iamVjdFtdIG5vZGVzID0gbmV3IE9iamVjdFtjaGlsZHJlbi5sZW5ndGhdOwotCQkJCQlOb2RlIHBhcmVudCA9ICgoSUphdmFXZWJOb2RlKSBvYmplY3QpLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJLy8JaW50IGh0bWxsZW5ndGggPSAoKFNvdXJjZVJlZkVsZW1lbnQpIChjaGlsZHJlbltpXSkpLmdldFNvdXJjZVJhbmdlKCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCS8vCWludCBodG1sb2Zmc2V0ID0gKChTb3VyY2VSZWZFbGVtZW50KSAoY2hpbGRyZW5baV0pKS5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpOwotCQkJCQkJSUphdmFTY3JpcHRFbGVtZW50IGphdmFFbGVtZW50ID0gY2hpbGRyZW5baV07Ci0JCQkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBudWxsOwotCQkJCQkJaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgTWVtYmVyKSB7Ci0JCQkJCQkJCXJhbmdlID0gKChNZW1iZXIpIGphdmFFbGVtZW50KS5nZXROYW1lUmFuZ2UoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJhbmdlID0gKChTb3VyY2VSZWZFbGVtZW50KSBqYXZhRWxlbWVudCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJCX0KLQkJCQkJCWludCBodG1sbGVuZ3RoID0gcmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlpbnQgaHRtbG9mZnNldCA9IHJhbmdlLmdldE9mZnNldCgpOwotCi0JCQkJCQkKLQkJCQkJCVBvc2l0aW9uIHBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKGh0bWxvZmZzZXQsIGh0bWxsZW5ndGgpOwotCQkJCQkJbm9kZXNbaV0gPSBnZXRKc05vZGUocGFyZW50LCBqYXZhRWxlbWVudCwgcG9zaXRpb24pOwotCQkJCQl9Ci0JCQkJCXJldHVybiBub2RlczsKLQkJCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJaWYgKGlzSlNFbGVtZW50UGFyZW50KG5vZGUpKSB7Ci0JCQlPYmplY3RbXSByZXN1bHRzID0gZ2V0SlNFbGVtZW50c0Zyb21Ob2RlKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLCB0cnVlKTsKLQkJCQotCQkJCi0JCQlyZXR1cm4gZmlsdGVyKCByZXN1bHRzICk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCQotCS8qCi0JICogQEdJTk86IEFub255bW91cyAtLSBtYXRjaGVzIGFub255bW91cyB0eXBlcyBvbiB0aGUgdG9wIGxldmVsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgZWxlbWVudE9iaikgewotCQkKLQkJaWYoIGVsZW1lbnRPYmogaW5zdGFuY2VvZiBJSmF2YVdlYk5vZGUgKXsKLQkJCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50ID0gKChJSmF2YVdlYk5vZGUpZWxlbWVudE9iaikuZ2V0SmF2YUVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUgJiYgZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5KQVZBU0NSSVBUX1VOSVQgKSB7Ci0JCQkJCi0JCQkJSVR5cGUgdHlwZSA9IChJVHlwZSllbGVtZW50OwotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiB0eXBlLmlzQW5vbnltb3VzKCk7Ci0JCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQEdJTk86IEFub255bW91cyBGaWx0ZXIgZnJvbSB0b3AgbGV2ZWwKLQkgKgotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBmaWx0ZXIoT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJYm9vbGVhbiBpbml0aWFsaXplcnM9IGZhbHNlOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtYXRjaGVzKGNoaWxkcmVuW2ldKSkgewotCQkJCWluaXRpYWxpemVycz0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmICghaW5pdGlhbGl6ZXJzKQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCi0JCVZlY3RvciB2PSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hdGNoZXMoY2hpbGRyZW5baV0pKQotCQkJCWNvbnRpbnVlOwotCQkJdi5hZGRFbGVtZW50KGNoaWxkcmVuW2ldKTsKLQkJfQotCi0JCU9iamVjdFtdIHJlc3VsdD0gbmV3IE9iamVjdFt2LnNpemUoKV07Ci0JCXYuY29weUludG8ocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKS5nZXRFbGVtZW50cyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCX0KLQkKLQlwcml2YXRlIEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlciBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSB7Ci0JCWlmKGphdmFFbGVtZW50TGFiZWxQcm92aWRlcj09bnVsbCkgewotCQkJamF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyID0gbmV3IEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBqYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci0JfQotCQotCXByaXZhdGUgU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlciBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXIodHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0W10gZmlsdGVyQ2hpbGRyZW5Gb3JSYW5nZShJSmF2YVNjcmlwdEVsZW1lbnRbXSBhbGxDaGlsZHJlbiwgTm9kZSBub2RlKSB7Ci0JLy8JaW50IGphdmFQb3NpdGlvblN0YXJ0ID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkvLwlpbnQgamF2YVBvc2l0aW9uRW5kICAgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCi0JLy8JT2JqZWN0W10gcmVzdWx0ID1uZXcgT2JqZWN0WzBdOwotCQkKLQkJaW50IGphdmFQb3NpdGlvbkVuZCA9ICgoTm9kZUltcGwpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgamF2YVBvc2l0aW9uU3RhcnQgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCVZlY3RvciB2YWxpZENoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYWxsQ2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQgJiYgYWxsQ2hpbGRyZW5baV0uZ2V0RWxlbWVudFR5cGUoKSAhPSBJSmF2YVNjcmlwdEVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTikgewotCQkJCUlTb3VyY2VSYW5nZSByYW5nZSA9IG51bGw7Ci0JCQkJaWYgKGFsbENoaWxkcmVuW2ldIGluc3RhbmNlb2YgTWVtYmVyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyYW5nZSA9ICgoTWVtYmVyKSBhbGxDaGlsZHJlbltpXSkuZ2V0TmFtZVJhbmdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGFsbENoaWxkcmVuW2ldICBpbnN0YW5jZW9mIFNvdXJjZVJlZkVsZW1lbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJhbmdlID0gKChTb3VyY2VSZWZFbGVtZW50KWFsbENoaWxkcmVuW2ldICkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGFsbENoaWxkcmVuW2ldLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUgfHwgKGphdmFQb3NpdGlvblN0YXJ0IDw9IHJhbmdlLmdldE9mZnNldCgpICYmIHJhbmdlLmdldExlbmd0aCgpICsgcmFuZ2UuZ2V0T2Zmc2V0KCkgPD0gKGphdmFQb3NpdGlvbkVuZCkpKSB7Ci0JCQkJCQotCQkJCQkKLQkJCQkJCQlpbnQgaHRtbGxlbmd0aCA9IHJhbmdlID09IG51bGwgPyAwIDogcmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJaW50IGh0bWxvZmZzZXQgPSByYW5nZSA9PSBudWxsID8gMCA6IHJhbmdlLmdldE9mZnNldCgpOwotCQkJCQkJCWlmIChodG1sbGVuZ3RoIDwgMCB8fCBodG1sb2Zmc2V0IDwgMCkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJUG9zaXRpb24gcG9zaXRpb24gPSBuZXcgUG9zaXRpb24oaHRtbG9mZnNldCwgaHRtbGxlbmd0aCk7Ci0JCQkJCQkJdmFsaWRDaGlsZHJlbi5hZGQoZ2V0SnNOb2RlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBhbGxDaGlsZHJlbltpXSwgcG9zaXRpb24pKTsKLQkJCQkJCi0JCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0KLQotCQlpZiAodmFsaWRDaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQlyZXN1bHQgPSB2YWxpZENoaWxkcmVuLnRvQXJyYXkoKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBPYmplY3RbXSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUoTm9kZSBub2RlLCBib29sZWFuIGVuc3VyZUNvbnNpc3RhbnQpIHsKLQkJCQkKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaW50IGVuZE9mZnNldCA9IDA7Ci0JCWludCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlPYmplY3RbXSByZXN1bHQgPSBudWxsOwotCQlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAobm9kZSBpbnN0YW5jZW9mIE5vZGVJbXBsKSkgewotCQkJc3RhcnRPZmZzZXQgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJZW5kT2Zmc2V0ID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlJSmF2YVNjcmlwdFVuaXQgdW5pdCA9IGdldExhenlDdShub2RlKTsKLQkJCXRyeSB7Ci0JCQkJaWYoZW5zdXJlQ29uc2lzdGFudCkgdW5pdC5tYWtlQ29uc2lzdGVudChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgxKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWV4MS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gZmlsdGVyQ2hpbGRyZW5Gb3JSYW5nZSh1bml0LmdldENoaWxkcmVuKCksbm9kZSk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmVzdWx0ID0gbmV3IE9iamVjdFswXTsKLQkJCQlsYXp5Q3U9bnVsbDsKLQkJCX0KLQkJCQotCQkJLy90cmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uKG5vZGUpOwotCQkJLy9yZXN1bHQgPSB0cmFuc2xhdGlvbi5nZXRBbGxFbGVtZW50c0luSnNSYW5nZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihtb25pdG9yPT1udWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG1vbml0b3I7Ci0JCQotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBnZXRKc05vZGUoTm9kZSBwYXJlbnQsIElKYXZhU2NyaXB0RWxlbWVudCByb290LCBQb3NpdGlvbiBwb3NpdGlvbikgewotCQlKc0pmYWNlTm9kZSBpbnN0YW5jZSA9IG51bGw7Ci0JCWlmIChyb290LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUpIHsKLQkJCWluc3RhbmNlID0gbmV3IEpzSmZhY2VOb2RlKHBhcmVudCwgcm9vdCwgcG9zaXRpb24sICgoU291cmNlUmVmRWxlbWVudCkgcm9vdCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCX0gZWxzZSBpZiAocm9vdC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5GSUVMRCkgewotCQkJLyogRmllbGQgcmVmcmVuY2UsIHBvc3NpYmx5IHRvIGEgdHlwZSBtYXkgbmVlZCB0byBpbXBsZW1lbnQgbGF0ZXIgKi8KLQkJCWluc3RhbmNlID0gbmV3IEpzSmZhY2VOb2RlKHBhcmVudCwgcm9vdCwgIHBvc2l0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWluc3RhbmNlID0gbmV3IEpzSmZhY2VOb2RlKHBhcmVudCwgcm9vdCwgcG9zaXRpb24pOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkuZ2V0VGV4dChyb290KTsKLQkJaW5zdGFuY2Uuc2V0TmFtZShuYW1lKTsKLQkJLy8gKChKc0pmYWNlTm9kZSlpbnN0YW5jZSkuc2V0QWRhcHRlclJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoaW5zdGFuY2UpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSkZhY2VOb2RlQWRhcHRlckZvckpzKSkgewotCQkJKGluc3RhbmNlKS5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJKGluc3RhbmNlKS5hZGRBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBKc0pmYWNlTm9kZSkgewotCQkJcmV0dXJuICgoSnNKZmFjZU5vZGUpIG5vZGUpLmdldEltYWdlKCk7Ci0JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKS5nZXRJbWFnZShub2RlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGFiZWxJbWFnZShub2RlKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoT2JqZWN0IG5vZGUpIHsKLS8vCQlpZiAobm9kZSBpbnN0YW5jZW9mIEpzSmZhY2VOb2RlKSB7Ci0vLwkJCXJldHVybiAoKEpzSmZhY2VOb2RlKSBub2RlKS5nZXROYW1lKCk7Ci0vLwkJfQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldFRleHQobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExhYmVsVGV4dChub2RlKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JfQotCQotCXByaXZhdGUgSUphdmFTY3JpcHRVbml0IGdldExhenlDdShOb2RlIG5vZGUpIHsKLQkJaWYobGF6eUN1PT1udWxsKSB7Ci0JCQlJSnNUcmFuc2xhdGlvbiB0cmFuID0gZ2V0VHJhbnNsYXRpb24obm9kZSk7Ci0JCQlpZih0cmFuPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQlsYXp5Q3UgPSB0cmFuLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJdHJ5IHsKLQkJCQlsYXp5Q3UubWFrZUNvbnNpc3RlbnQoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKLQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhenlDdTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBnZXRUcmFuc2xhdGlvbihOb2RlIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSURPTURvY3VtZW50IHhtbERvYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9ICgoTm9kZUltcGwpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQkJLy8gbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQl9Ci0JCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQkJCWlmKGRvbU1vZGVsID09IG51bGwpIHJldHVybiBudWxsOwotCQkJeG1sRG9jID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIG1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWlmICh4bWxEb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgdHJhbnNsYXRpb25BZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCXJldHVybiB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKS5oYXNDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUphdmFXZWJOb2RlKSB7Ci0JCQlyZXR1cm4gKChJSmF2YVdlYk5vZGUpIG9iamVjdCkuaGFzQ2hpbGRyZW4oKTsKLQkJCQotCQl9Ci0JCWlmIChpc0pTRWxlbWVudFBhcmVudChub2RlKSkgewotCQkJT2JqZWN0W10gbm9kZXMgPSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUobm9kZS5nZXRGaXJzdENoaWxkKCksZmFsc2UpOwotCQkJYm9vbGVhbiBoYXNFbGVtZW50cyA9IChub2RlcyAhPSBudWxsICYmIG5vZGVzLmxlbmd0aCA+IDApOwotCQkJcmV0dXJuIGhhc0VsZW1lbnRzOwotCQl9Ci0JCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNKU0VsZW1lbnRQYXJlbnQoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInNjcmlwdCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSnNKZmFjZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSnNKZmFjZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhkYzUxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pzSmZhY2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdE5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzSmZhY2VOb2RlIGV4dGVuZHMgRWxlbWVudEltcGwgaW1wbGVtZW50cyBJbmRleGVkUmVnaW9uLCBJTm9kZU5vdGlmaWVyLCBOb2RlLCBJSmF2YVdlYk5vZGUgewotCXByaXZhdGUgY2xhc3MgSnNBZGFwdGFibGVOb2RlIGV4dGVuZHMgQWJzdHJhY3ROb3RpZmllciB7Ci0JCQotCQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJCXJldHVybiBhZGFwdGVyUmVnaXN0cnk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBKc0FkYXB0YWJsZU5vZGUgYWRhcHRhYmxlRG9tTm9kZSA9IG5ldyBKc0FkYXB0YWJsZU5vZGUoKTsKLQlwcml2YXRlIEZhY3RvcnlSZWdpc3RyeSBhZGFwdGVyUmVnaXN0cnk7Ci0JcHJpdmF0ZSBQb3NpdGlvbiBmRG9jUG9zaXRpb247Ci0vLwlwcml2YXRlIE5vZGUgcGFyZW50OwotCXByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwotCS8vcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnQgZGlydHlFbGVtZW50OwotCXByaXZhdGUgYm9vbGVhbiBoYXNDaGlsZHJlbjsKLQkvL3ByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBJbWFnZSBtZTsKLQkKLQlwdWJsaWMgSnNKZmFjZU5vZGUoTm9kZSBwYXJlbnQsIElKYXZhU2NyaXB0RWxlbWVudCBvcmlnaW5hbEVsZW1lbnQsIFBvc2l0aW9uIHN0cnVjdHVyZURvY0xvY2F0aW9uKSB7Ci0JCXRoaXMocGFyZW50LCBvcmlnaW5hbEVsZW1lbnQsIHN0cnVjdHVyZURvY0xvY2F0aW9uLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIEpzSmZhY2VOb2RlKE5vZGUgcGFyZW50LCBJSmF2YVNjcmlwdEVsZW1lbnQgb3JpZ2luYWxFbGVtZW50LCBQb3NpdGlvbiBzdHJ1Y3R1cmVEb2NMb2NhdGlvbiwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCS8vc3VwZXIoKTsKLQkJc3VwZXIoKChFbGVtZW50SW1wbClwYXJlbnQpKTsKLQkJLy8gc3VwZXIocGFyZW50T2JqZWN0LCBwYXJlbnRPYmplY3QuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWZEb2NQb3NpdGlvbiA9IHN0cnVjdHVyZURvY0xvY2F0aW9uOwotCQkvL3RoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0JCXRyeSB7Ci0JCQloYXNDaGlsZHJlbj0oKEphdmFFbGVtZW50KW9yaWdpbmFsRWxlbWVudCkuaGFzQ2hpbGRyZW4oKTsKLQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQloYXNDaGlsZHJlbj1mYWxzZTsKLQkJfQotCQlyZW1vdmVBdHRyaWJ1dGVzKCk7Ci0JCW1lID0gKG5ldyBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIoKSkuZ2V0SW1hZ2Uob3JpZ2luYWxFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJcmV0dXJuICgoSmF2YUVsZW1lbnQpdGhpcy5kaXJ0eUVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7Ci0vLwkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLS8vCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotCQlyZXR1cm4gaGFzQ2hpbGRyZW47Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzdXBlci5zZXRUYWdOYW1lKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlcikgewotCQlhZGFwdGFibGVEb21Ob2RlLmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXN0UG9zaXRpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIEpzSmZhY2VOb2RlICYmICgoSnNKZmFjZU5vZGUpIG8pLmZEb2NQb3NpdGlvbiA9PSB0aGlzLmZEb2NQb3NpdGlvbik7Ci0JfQotCQotLy8gcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0SW5zdGFuY2UoT2JqZWN0IHBhcmVudCwgUG9zaXRpb24gc3RydWN0dXJlRG9jTG9jYXRpb24KLS8vICl7Ci0vLyAvL3JldHVybiBuZXcgSnNKZmFjZU5vZGUoKEphdmFFbGVtZW50KXBhcmVudC5nZXRQYXJlbnQoKSwKLS8vIHBhcmVudC5nZXRFbGVtZW50TmFtZSgpLHN0cnVjdHVyZURvY0xvY2F0aW9uKTsKLS8vIFZlY3RvciBpbnRlcmZhY2VzID0gbmV3IFZlY3RvcigpOwotLy8gaW50ZXJmYWNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYXJlbnQuZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCkpKTsKLS8vIEpzSmZhY2VOb2RlIG1lID0gbmV3IEpzSmZhY2VOb2RlKHBhcmVudCxzdHJ1Y3R1cmVEb2NMb2NhdGlvbik7Ci0vLyBpbnRlcmZhY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1lLmdldENsYXNzKCkuZ2V0SW50ZXJmYWNlcygpKSk7Ci0vLyBPYmplY3QgcHJveHkgPSBudWxsOwotLy8gdHJ5IHsKLS8vIHByb3h5PSBQcm94eS5uZXdQcm94eUluc3RhbmNlKAotLy8gcGFyZW50LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwKLS8vIChDbGFzc1tdKWludGVyZmFjZXMudG9BcnJheShuZXcgQ2xhc3NbXXt9KSxtZSk7Ci0vLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotLy8gU3lzdGVtLm91dC5wcmludGxuKGUpOwotLy8gfQotLy8gcmV0dXJuIHByb3h5OwotLy8gfQotLy8gICAKLQkKLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGdldEFkYXB0ZXJGb3IoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIGFkYXB0YWJsZURvbU5vZGUuZ2V0QWRhcHRlckZvcih0eXBlKTsKLQl9Ci0JCi0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRhcHRlcnMoKSB7Ci0JCXJldHVybiBhZGFwdGFibGVEb21Ob2RlLmdldEFkYXB0ZXJzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZkRvY1Bvc2l0aW9uLmdldE9mZnNldCgpICsgZkRvY1Bvc2l0aW9uLmdldExlbmd0aCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGdldEV4aXN0aW5nQWRhcHRlcihPYmplY3QgdHlwZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBhZGFwdGFibGVEb21Ob2RlLmdldEV4aXN0aW5nQWRhcHRlcih0eXBlKTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKSB7Ci0JCS8qCi0JCSAqIHNpbmNlIHRoaXMgbWF5IGJlY29tZSAnc3RhbGUnIHdlIG5lZWQgdG8gcmVkaXNjb3ZlciBvdXIgZWxlbWVudCBldmVyeQotCQkgKiB0aW1lIHdlJ3JlIGFza2VkCi0JCSAqLwotCQlJSnNUcmFuc2xhdGlvbiB0cmFuID0gZ2V0VHJhbnNsYXRpb24oKTsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZE9mZnNldCA9IGdldExlbmd0aCgpOwotCQlpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCQkJSUphdmFTY3JpcHRFbGVtZW50IG15VHlwZSA9IHRyYW4uZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0VHlwZSh0eXBlTmFtZSk7Ci0JCQlyZXR1cm4gbXlUeXBlOwotCQl9Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gdHJhbi5nZXRBbGxFbGVtZW50c0luSnNSYW5nZShzdGFydE9mZnNldCwgc3RhcnRPZmZzZXQgKyBlbmRPZmZzZXQpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGVsZW1lbnRzWzBdOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiSnNKZmFjZU5vZGUuMSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmRG9jUG9zaXRpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCQotCQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk5vZGVJbXBsI2dldE93bmVyRG9jdW1lbnQoKQotCSAqLwotCQotCi0JCi0JCi0KLQkKLQkKLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZkRvY1Bvc2l0aW9uLmdldE9mZnNldCgpOwotCX0KLQkKLS8vIHByaXZhdGUgTWV0aG9kW10gZ2V0TWV0aG9kcygpewotLy8gLy8gcmV0dXJucyB0aGUgbWV0aG9kcyB0aGlzIGNsYXNzIHN1cHBvcnRzIChhcyBkZWNsYXJlZCBpbiBpbnRlcmZhY2VzKQotLy8gQ2xhc3NbXSBpbnRlcmZhY2VzID0gZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCk7Ci0vLyBWZWN0b3Igdk1ldGhvZHMgPSBuZXcgVmVjdG9yKCk7Ci0vLyBmb3IoaW50IGkgPSAwO2k8aW50ZXJmYWNlcy5sZW5ndGg7aSsrKXsKLS8vIE1ldGhvZCBtZXRob2RzW10gPSBpbnRlcmZhY2VzW2ldLmdldERlY2xhcmVkTWV0aG9kcygpOwotLy8gdk1ldGhvZHMuYWRkQWxsKEFycmF5cy5hc0xpc3QobWV0aG9kcykpOwotLy8gfQotLy8gICAgICAgIAotLy8gcmV0dXJuIChNZXRob2RbXSl2TWV0aG9kcy50b0FycmF5KCk7Ci0vLyB9Ci0vLyBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpIHRocm93cwotLy8gVGhyb3dhYmxlIHsKLS8vIE9iamVjdCByZXN1bHQ7Ci0vLyBNZXRob2RbXSBteU1ldGhvZHMgPSBnZXRNZXRob2RzKCk7Ci0vLyAgICAgICAgCi0vLyB0cnkgewotLy8gZm9yKGludCBpID0gMDtpPG15TWV0aG9kcy5sZW5ndGg7aSsrKXsKLS8vIGlmKG15TWV0aG9kc1tpXT09bWV0aG9kKXsKLS8vIHJldHVybiBtZXRob2QuaW52b2tlKHRoaXMsIGFyZ3MpOwotLy8gfQotLy8gfQotLy8gcmVzdWx0ID0gbWV0aG9kLmludm9rZShwYXJlbnRUeXBlLCBhcmdzKTsKLS8vIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotLy8gdGhyb3cgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidW5leHBlY3RlZCBpbnZvY2F0aW9uIGV4Y2VwdGlvbjogIiArCi0vLyBlLmdldE1lc3NhZ2UoKSk7Ci0vLyB9Ci0vLwotLy8gcmV0dXJuIHJlc3VsdDsKLS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Ob2RlSW1wbCNnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKQotCSAqLwotCQotCi0JCi0JcHVibGljIElKc1RyYW5zbGF0aW9uIGdldFRyYW5zbGF0aW9uKCkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jKTsKLQkJCQkvLyBtb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZG9jKTsKLQkJCX0KLQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQkJeG1sRG9jID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIG1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWlmICh4bWxEb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgdHJhbnNsYXRpb25BZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCXJldHVybiB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeShpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWFkYXB0YWJsZURvbU5vZGUubm90aWZ5KGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlcikgewotCQlhZGFwdGFibGVEb21Ob2RlLnJlbW92ZUFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFkYXB0ZXJSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJdGhpcy5hZGFwdGVyUmVnaXN0cnkgPSByZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDQ4MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNmU1YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUpzSmZhY2VOb2RlLjE9ZXJyb3IgaW4gSnNKZmFjZU5vZGUuLi4gSSBjb3VsZG4ndCByZXRyaWV2ZSBteSBqYXZhIGVsZW1lbnQgZnJvbSB0aGUgb3JpZ2luYWwgcGFnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZvckpzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMTU3ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5KYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZvckpzIGV4dGVuZHMgSkZhY2VOb2RlQWRhcHRlckZvckhUTUwgewotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRm9ySnMoSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJaWYgKGlzSlNFbGVtZW50UGFyZW50KG5vZGUpKSB7Ci0vLyBPYmplY3RbXSByZXN1bHRzID0gZ2V0SlNFbGVtZW50c0Zyb21Ob2RlKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKTsKLS8vIElNZW1iZXJbXSBhbGxSZXN1bHRzID0gbmV3IElNZW1iZXJbcmVzdWx0cy5sZW5ndGhdOwotLy8gZm9yKGludCBpID0gMDtpPHJlc3VsdHMubGVuZ3RoO2krKykgewotLy8gaWYocmVzdWx0c1tpXT09bnVsbCkgY29udGludWU7Ci0vLyBJTWVtYmVyIG1lbWJlciA9ICgoSU1lbWJlcilyZXN1bHRzW2ldKTsKLS8vIGFsbFJlc3VsdHNbaV0gPSBtZW1iZXI7Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gZ2V0SlNFbGVtZW50c0Zyb21Ob2RlKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKS5nZXRFbGVtZW50cyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCX0KLQkKLQlwcml2YXRlIEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlciBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCQotCXByaXZhdGUgU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlciBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXIodHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgc3luY2hyb25pemVkIE9iamVjdFtdIGdldEpTRWxlbWVudHNGcm9tTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaW50IGVuZE9mZnNldCA9IDA7Ci0JCWludCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSByZXN1bHQgPSBudWxsOwotCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlSW1wbCkpIHsKLQkJCXN0YXJ0T2Zmc2V0ID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWVuZE9mZnNldCA9ICgoTm9kZUltcGwpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJdHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbihub2RlKTsKLQkJCXJlc3VsdCA9IHRyYW5zbGF0aW9uLmdldEFsbEVsZW1lbnRzSW5Kc1JhbmdlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0vLwkJCQotLy8gaWYgKHJlc3VsdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vIE9iamVjdFtdIG5ld1Jlc3VsdHMgPSBuZXcgT2JqZWN0W3Jlc3VsdC5sZW5ndGhdOwotLy8gZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLS8vIGludCBodG1sbGVuZ3RoID0gMDsKLS8vIGludCBodG1sb2Zmc2V0ID0gMDsKLS8vIFBvc2l0aW9uIHBvc2l0aW9uID0gbnVsbDsKLS8vIHRyeSB7Ci0vLyBodG1sbGVuZ3RoID0gKChTb3VyY2VSZWZFbGVtZW50KSAocmVzdWx0W2ldKSkuZ2V0U291cmNlUmFuZ2UoKS5nZXRMZW5ndGgoKTsKLS8vIGh0bWxvZmZzZXQgPSB0cmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQoKChTb3VyY2VSZWZFbGVtZW50KQotLy8gKHJlc3VsdFtpXSkpLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkpOwotLy8gcG9zaXRpb24gPSBuZXcgUG9zaXRpb24oaHRtbG9mZnNldCwgaHRtbGxlbmd0aCk7Ci0vLyB9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vIH0KLS8vIG5ld1Jlc3VsdHNbaV0gPSBnZXRKc05vZGUobm9kZS5nZXRQYXJlbnROb2RlKCksIChJSmF2YVNjcmlwdEVsZW1lbnQpIHJlc3VsdFtpXSwKLS8vIHBvc2l0aW9uKTsKLS8vIH0KLS8vIHJldHVybiBuZXdSZXN1bHRzOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0TGFiZWxJbWFnZShPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldEltYWdlKG5vZGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMYWJlbEltYWdlKG5vZGUpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dChPYmplY3Qgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldFRleHQobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExhYmVsVGV4dChub2RlKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JfQotCQotCXByaXZhdGUgSUpzVHJhbnNsYXRpb24gZ2V0VHJhbnNsYXRpb24oTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlET01Eb2N1bWVudCB4bWxEb2MgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQkJCS8vIG1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChkb2MpOwotCQkJfQotCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCQl4bWxEb2MgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHhtbERvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKc1RyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJcmV0dXJuIHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbih0cnVlKTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJaWYgKGlzSlNFbGVtZW50UGFyZW50KG5vZGUpKSB7Ci0JCQlPYmplY3RbXSByZXN1bHRzID0gZ2V0SlNFbGVtZW50c0Zyb21Ob2RlKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCXJldHVybiAocmVzdWx0cyAhPSBudWxsICYmIHJlc3VsdHMubGVuZ3RoID4gMCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0pTRWxlbWVudFBhcmVudChOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgic2NyaXB0IikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9Kc0NvbnRlbnRPdXRsaW5lQ29uZmlnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzQ29udGVudE91dGxpbmVDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4OTYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzQ29udGVudE91dGxpbmVDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLnByb3Zpc2lvbmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUuSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0NvbnRlbnRPdXRsaW5lQ29uZmlnIGV4dGVuZHMgSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9BRFZBTkNFRCA9IGZhbHNlOwotCUlMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQkKLQlwdWJsaWMgSnNDb250ZW50T3V0bGluZUNvbmZpZygpIHt9Ci0JCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBnZXRKYXZhTGFiZWxQcm92aWRlcigpIHsKLQkJaWYgKGZMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IEpzTGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmTGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKCFKc0NvbnRlbnRPdXRsaW5lQ29uZmlnLlVTRV9BRFZBTkNFRCkgewotCQkJcmV0dXJuIHN1cGVyLmdldExhYmVsUHJvdmlkZXIodmlld2VyKTsKLQkJfQotCQlyZXR1cm4gZ2V0SmF2YUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIElNZW51TGlzdGVuZXIgZ2V0TWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQkvLyBpZighVVNFX0FEVkFOQ0VEKQotCQkvLyByZXR1cm4gc3VwZXIuZ2V0TWVudUxpc3RlbmVyKHRyZWVWaWV3ZXIpOwotCQlyZXR1cm4gbmV3IEpzTWVudUxpc3RlbmVyKHRyZWVWaWV3ZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0U3RhdHVzTGluZUxhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCWlmICghSnNDb250ZW50T3V0bGluZUNvbmZpZy5VU0VfQURWQU5DRUQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcih0cmVlVmlld2VyKTsKLQkJfQotCQlyZXR1cm4gZ2V0SmF2YUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9Kc0xhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzMGYxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBYTUxMYWJlbFByb3ZpZGVyIHsKLQlKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBudWxsOwotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldEltYWdlKG8pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIgZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKS5nZXRUZXh0KG8pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNNZW51TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNNZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzMjI4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzTWVudUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JbnRlcm5hbEhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLmphdmFlZGl0b3IuQ29tcGlsYXRpb25Vbml0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSUNvbnRleHRNZW51Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc01lbnVMaXN0ZW5lciBleHRlbmRzIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lciwgSVJlbGVhc2FibGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfR1JPVVBfSUQgPSAiZ3JvdXAuZWRpdCI7IC8vJE5PTi1OTFMtMSQKLQlDb21waWxhdGlvblVuaXRFZGl0b3JBY3Rpb25Db250cmlidXRvciBjb250cmliOwotCXByaXZhdGUgWE1MTm9kZUFjdGlvbk1hbmFnZXIgZkFjdGlvbk1hbmFnZXI7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKLQkKLQlwdWJsaWMgSnNNZW51TGlzdGVuZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIoKElTdHJ1Y3R1cmVkTW9kZWwpIHZpZXdlci5nZXRJbnB1dCgpLCB2aWV3ZXIpOwotCQljb250cmliID0gbmV3IENvbXBpbGF0aW9uVW5pdEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0JCWZUcmVlVmlld2VyID0gdmlld2VyOwotLy8JCQkKLS8vIGZBY3Rpb25Hcm91cHM9IG5ldyBDb21wb3NpdGVBY3Rpb25Hcm91cChuZXcgQWN0aW9uR3JvdXBbXSB7Ci0vLyBuZXcgT3BlblZpZXdBY3Rpb25Hcm91cChnZXRXb3JrYmVuY2hTaXRlKCksIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpLAotLy8gbmV3IENDUEFjdGlvbkdyb3VwKGdldFdvcmtiZW5jaFNpdGUoKSksCi0vLyBuZXcgR2VuZXJhdGVBY3Rpb25Hcm91cChnZXRXb3JrYmVuY2hTaXRlKCkpLAotLy8gbmV3IFJlZmFjdG9yQWN0aW9uR3JvdXAoZ2V0V29ya2JlbmNoU2l0ZSgpKSwKLS8vIG5ldyBKYXZhU2VhcmNoQWN0aW9uR3JvdXAoZ2V0V29ya2JlbmNoU2l0ZSgpKX0pOwotCX0KLQkKLQlwdWJsaWMgSUFjdGlvbltdIGdldEFsbEpzQWN0aW9ucygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVdvcmtiZW5jaFNpdGUgZ2V0V29ya2JlbmNoU2l0ZSgpIHsKLQkJcmV0dXJuIEludGVybmFsSGFuZGxlclV0aWwuZ2V0QWN0aXZlU2l0ZShmVHJlZVZpZXdlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGZUcmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgVHJlZVNlbGVjdGlvbikgewotCQkJVHJlZVNlbGVjdGlvbiB0c2VsZWN0ID0gKFRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gdHNlbGVjdC50b0FycmF5KCk7Ci0JCQlpbnQgamF2YUNvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJSmF2YVdlYk5vZGUpIHsKLQkJCQkJamF2YUNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKLS8vIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX05FVykpOwotLy8gbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9HT1RPKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9PUEVOKSk7Ci0vLyBtYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NIT1cpKTsKLS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfRURJVCkpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfUkVPUkdBTklaRSkpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfR0VORVJBVEUpKTsKLS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NFQVJDSCkpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfQlVJTEQpKTsKLS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX0FERElUSU9OUykpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfVklFV0VSX1NFVFVQKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9QUk9QRVJUSUVTKSk7Ci0JCQlpZiAoamF2YUNvdW50ID09IGVsZW1lbnRzLmxlbmd0aCAmJiBqYXZhQ291bnQgIT0gMCkgewotCQkJCS8vIHNlZSBwbHVnaW4ueG1sIGZvciBvYmplY3QgY29udHJpYnV0aW9ucyB0aGF0IHBvcHVsYXRlIHRoZXNlCi0JCQkJLy8gbWVudXMKLQkJCQkvKgotCQkJCSAqIE1lbnUgZm9yOgotCQkJCSAqIAotCQkJCSAqIE9wZW4gVHlwZSBIaWVyYXJjaHkgT3BlbiBDYWxsIEhpZXJhcmNoeSBTaG93IEluLS0+IFNjcmlwdAotCQkJCSAqIEV4cGxvcmVyIE5hdmlnYXRvcgotCQkJCSAqLwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NIT1cpKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NIT1cpKTsKLQkJCQkvKgotCQkJCSAqIE1lbnUgZm9yOiBDdXQgQ29weSBQYXN0ZSBEZWxldGUKLQkJCQkgKi8KLQkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKEpzTWVudUxpc3RlbmVyLkVESVRfR1JPVVBfSUQpKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSnNNZW51TGlzdGVuZXIuRURJVF9HUk9VUF9JRCkpOwotCQkJCS8qCi0JCQkJICogTWVudSBmb3I6Ci0JCQkJICogCi0JCQkJICogU291cmNlLS0+IEdlbmVyYXRlIEVsZW1lbnQgQ29tbWVudAotCQkJCSAqIAotCQkJCSAqIAotCQkJCSAqIFJlZmFjdG9yLS0+IFJlbmFtZSBNb3ZlIENoYW5nZSBGdW5jdGlvbiBTaWduYXR1cmUgSW5saW5lCi0JCQkJICogSW50cm9kdWNlIEluZGlyZWN0aW9uIEluZmVyIEdlbmVyaWMgVHlwZSBBcmd1bWVudHMKLQkJCQkgKi8KLQkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9TT1VSQ0UpKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NPVVJDRSkpOwotCQkJCS8qCi0JCQkJICogTWVudSBmb3I6Ci0JCQkJICogCi0JCQkJICogUmVmcmVuY2VzLS0+IFdvcmtzcGFjZSBQcm9qZWN0IEhpZXJhcmNoeSBXb3JraW5nIFNldAotCQkJCSAqIAotCQkJCSAqIERlY2xlcmF0aW9ucy0tPiBXb3Jrc3BhY2UgUHJvamVjdCBIaWVyYXJjaHkgV29ya2luZyBTZXQKLQkJCQkgKiAKLQkJCQkgKi8KLQkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9TRUFSQ0gpKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NFQVJDSCkpOwotCQkJCS8qIGFsbCBKYXZhIEVsZW1lbnRzICovCi0vLwkJCQkJCi0vLwkJCQkJCi0vLwkJCQkJCi0vLyBKYXZhU2NyaXB0UGx1Z2luLmNyZWF0ZVN0YW5kYXJkR3JvdXBzKG1hbmFnZXIpOwotLy8gU3RyaW5nW10gYWN0aW9uU2V0cyA9IEpTRFRBY3Rpb25TZXRVdGlsLmdldEFsbEFjdGlvblNldHMoKTsKLS8vCi0vLyBJQWN0aW9uW10gYWN0aW9ucyA9IEpTRFRBY3Rpb25TZXRVdGlsLmdldEFjdGlvbnNGcm9tU2V0KGFjdGlvblNldHMpOwotLy8gZm9yKGludCBpID0gMDtpPGFjdGlvbnMubGVuZ3RoO2krKykgewotLy8gbWFuYWdlci5hZGQoYWN0aW9uc1tpXSk7Ci0vLyB9Ci0vLyBmQWN0aW9uR3JvdXBzLnNldENvbnRleHQobmV3IEFjdGlvbkNvbnRleHQoc2VsZWN0aW9uKSk7Ci0vLyBmQWN0aW9uR3JvdXBzLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLS8vCQkJCQkKLQkJCX0gZWxzZSBpZiAoamF2YUNvdW50ID09IDApIHsKLQkJCQlmaWxsQ29udGV4dE1lbnUobWFuYWdlciwgc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGUjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZlRyZWVWaWV3ZXIgPSBudWxsOwotCQlpZiAoZkFjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJZkFjdGlvbk1hbmFnZXIuc2V0TW9kZWwobnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzV2ViRWxlbWVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzV2ViRWxlbWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGRiNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9Kc1dlYkVsZW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5TdGFuZGFyZEphdmFTY3JpcHRFbGVtZW50Q29udGVudFByb3ZpZGVyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc1dlYkVsZW1lbnRQcm92aWRlciBleHRlbmRzIFN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXIge30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvWE1MTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9YTUxMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNWM2MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9YTUxMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFhNTExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIHsKLQlib29sZWFuIGZTaG93QXR0cmlidXRlcyA9IGZhbHNlOwotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgbykgewotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuZ2V0VGV4dChvKSk7Ci0JCWlmIChvIGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG87Ci0JCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgZlNob3dBdHRyaWJ1dGVzKSB7Ci0JCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NDQ0Ci0JCQkJaWYgKG5vZGUuaGFzQXR0cmlidXRlcygpKSB7Ci0JCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlOb2RlIGlkVHlwZWRBdHRyaWJ1dGUgPSBudWxsOwotCQkJCQlOb2RlIHJlcXVpcmVkQXR0cmlidXRlID0gbnVsbDsKLQkJCQkJYm9vbGVhbiBoYXNJZCA9IGZhbHNlOwotCQkJCQlib29sZWFuIGhhc05hbWUgPSBmYWxzZTsKLQkJCQkJTm9kZSBzaG93bkF0dHJpYnV0ZSA9IG51bGw7Ci0JCQkJCS8vIHRyeSB0byBnZXQgY29udGVudCBtb2RlbCBlbGVtZW50Ci0JCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gbnVsbDsKLQkJCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCQlpZiAobXEgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudERlY2wgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCQkJfQotCQkJCQkvLyBmaW5kIGFuIGF0dHJpYnV0ZSBvZiB0eXBlIChvciBqdXN0IG5hbWVkKQotCQkJCQkvLyBJRAotCQkJCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJCQkJaW50IGkgPSAwOwotCQkJCQkJd2hpbGUgKChpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKSkgJiYgKGlkVHlwZWRBdHRyaWJ1dGUgPT0gbnVsbCkpIHsKLQkJCQkJCQlOb2RlIGF0dHIgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOwotCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQkJCQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCQkJCQkJaWYgKChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpICYmIChDTURhdGFUeXBlLklELmVxdWFscyhhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpKSkpIHsKLQkJCQkJCQkJCWlkVHlwZWRBdHRyaWJ1dGUgPSBhdHRyOwotCQkJCQkJCQl9IGVsc2UgaWYgKChhdHRyRGVjbC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpICYmIChyZXF1aXJlZEF0dHJpYnV0ZSA9PSBudWxsKSkgewotCQkJCQkJCQkJLy8gYXMgYSBiYWNrdXAsIGtlZXAgdGFicyBvbgotCQkJCQkJCQkJLy8gYW55IHJlcXVpcmVkCi0JCQkJCQkJCQkvLyBhdHRyaWJ1dGVzCi0JCQkJCQkJCQlyZXF1aXJlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQloYXNJZCA9IGhhc0lkIHx8IGF0dHJOYW1lLmVxdWFscygiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJaGFzTmFtZSA9IGhhc05hbWUgfHwgYXR0ck5hbWUuZXF1YWxzKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkrK2k7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogSWYgbm8gc3VpdGFibGUgYXR0cmlidXRlIHdhcyBmb3VuZCwgdHJ5IHVzaW5nIGEKLQkJCQkJICogcmVxdWlyZWQgYXR0cmlidXRlLCBpZiBub25lLCB0aGVuIHByZWZlciAiaWQiIG9yCi0JCQkJCSAqICJuYW1lIiwgb3RoZXJ3aXNlIGp1c3QgdXNlIGZpcnN0IGF0dHJpYnV0ZQotCQkJCQkgKi8KLQkJCQkJaWYgKGlkVHlwZWRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBpZFR5cGVkQXR0cmlidXRlOwotCQkJCQl9IGVsc2UgaWYgKHJlcXVpcmVkQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQkJCXNob3duQXR0cmlidXRlID0gcmVxdWlyZWRBdHRyaWJ1dGU7Ci0JCQkJCX0gZWxzZSBpZiAoaGFzSWQpIHsKLQkJCQkJCXNob3duQXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIGlmIChoYXNOYW1lKSB7Ci0JCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoc2hvd25BdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLml0ZW0oMCk7Ci0JCQkJCX0KLQkJCQkJLy8gZGlzcGxheSB0aGUgYXR0cmlidXRlIGFuZCB2YWx1ZSAod2l0aG91dCBxdW90ZXMpCi0JCQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gc2hvd25BdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJaWYgKChhdHRyaWJ1dGVOYW1lICE9IG51bGwpICYmIChhdHRyaWJ1dGVOYW1lLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCXRleHQuYXBwZW5kKCIgIiArIGF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBzaG93bkF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCWlmICgoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZVZhbHVlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCQl0ZXh0LmFwcGVuZCgiPSIgKyBTdHJpbmdVdGlscy5zdHJpcChhdHRyaWJ1dGVWYWx1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3dlYjEuR0lGIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS93ZWIxLkdJRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhMjIwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3dlYjEuR0lGCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS93ZWIxLkpQRyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvd2ViMS5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YmY5YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS93ZWIxLkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjlkZWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtZW5jb2RpbmciLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtdGFza3RhZ3MiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtY29udGVudHByb3BlcnRpZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ij4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vdHJhdmVyc2FsL05vZGVJdGVyYXRvciIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzEyMzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbgotbW9kZWwuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmVfMS4wLjAuamFyCi1AZG90Ci1zcmMuemlwCi0uZmJ3YXJuaW5ncwotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkMDFiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9tL2FkYXB0ZXIvbm90aWZpY2F0aW9uL3RpbWU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZS9jcml0ZXJpYT0xMAotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRkb2N1bWVudD1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL21vZGVsbWFuYWdlbWVudD1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL2xpZmVjeWNsZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9saWZlY3ljbGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvc3RhdGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbG9ja3M9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9tb2RlbG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcz1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2RldGVjdGlvbj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2pvYj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL292ZXJhbGx0aW1lPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvdGltZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL3ByZWZlcmVuY2VzPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcmVnaXN0cnk9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9mb3JtYXQ9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzViMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNGU2MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBNYXIgMjQgMTE6MjM6NTQgRURUIDIwMDcNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzI3MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKm5sc1hYWCovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOw0KLQ0KLQ0KLQ0KLSUlDQotDQotJXsNCi0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOw0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOw0KLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nDQotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsNCi0NCi0NCi0NCi0JcHVibGljIENTU0hlYWRUb2tlbml6ZXIoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgew0KLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovDQotCSAgCXl5X3JlYWRlciA9IGluOw0KLQ0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICAJCXl5X3N0YXRlID0gMDsNCi0NCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7DQotDQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotICAJCXl5X21hcmtlZFBvcyA9IDA7DQotDQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0NCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotICAJCXl5X2N1cnJlbnRQb3MgPSAwOw0KLQ0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsNCi0NCi0gIAkJLyoqIA0KLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0gIAkJICogZnJvbSBpbnB1dCANCi0gIAkJICovDQotICAJCXl5X2VuZFJlYWQgPSAwOw0KLQ0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIAkJeXlsaW5lID0gMDsNCi0NCi0gIAkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICAJCXl5Y2hhciA9IDA7DQotDQotICAJCS8qKg0KLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydA0KLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0DQotICAJCSAqLw0KLSAgCQl5eWNvbHVtbiA9IDA7IA0KLQ0KLSAgCQkvKiogDQotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIA0KLSAgCQkgKiBvZiBhIGxpbmUNCi0gIAkJICovDQotICAJCXl5X2F0Qk9MID0gZmFsc2U7DQotDQotICAJCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsNCi0NCi0gIAkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovDQotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7DQotDQotDQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7DQotICAJCQ0KLSAgCQloYXNNb3JlID0gdHJ1ZTsNCi0gIAkJDQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkDQotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudA0KLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuDQotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgew0KLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsNCi0JCX0NCi0gIAkJDQotDQotICAJfQ0KLQ0KLQ0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7DQotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7DQotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsNCi0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7DQotCQkJdmFsdWVUZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7DQotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsNCi0JfQ0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsNCi0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7DQotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JfQ0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgew0KLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOw0KLQl9DQotCQ0KLQ0KLSV9DQotDQotJWVvZnsNCi0JaGFzTW9yZT1mYWxzZTsNCi0lZW9mfQ0KLQ0KLSVwdWJsaWMNCi0lY2xhc3MgQ1NTSGVhZFRva2VuaXplcg0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0ldW5pY29kZQ0KLSVpZ25vcmVjYXNlIA0KLSVkZWJ1Zw0KLSVzd2l0Y2gNCi0NCi0NCi1VVEYxNkJFID0gXHhGRVx4RkYNCi1VVEYxNkxFID0gXHhGRlx4RkUNCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYNCi0NCi0vL1NwYWNlQ2hhciA9IFtceDIwXHgwOV0NCi0NCi0NCi0NCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKw0KLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0NCi0NCi0vL0JlZ2luQXR0cmliZVZhbHVlID0ge1N9KiBcPSB7U30qDQotDQotTGluZVRlcm1pbmF0b3IgPSBccnxcbg0KLQ0KLS8vIFogaXMgdGhlIHNpbmdsZS1ieXRlIHplcm8gY2hhcmFjdGVyIHRvIGJlIHVzZWQgaW4gcGFyc2luZyBkb3VibGUtYnl0ZSBmaWxlcw0KLVogPSAoXHgwMCk/DQotU19VVEYgPSB7Wn17U317Wn0NCi1CZWdpbkF0dHJpYnV0ZVZhbHVlVVRGID0ge1NfVVRGfSogXD0ge1NfVVRGfSoNCi0NCi0lc3RhdGUgU1RfWE1MRGVjbA0KLSVzdGF0ZSBDSEFSU0VUX1JVTEUNCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUNCi0lc3RhdGUgRFFfU1RSSU5HDQotJXN0YXRlIFNRX1NUUklORw0KLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZw0KLQ0KLSUlDQotDQotDQotPFlZSU5JVElBTD4gIA0KLXsNCi0Je1VURjE2QkV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9DQotCXtVVEYxNkxFfSAgIAkJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fQ0KLQl7VVRGODNCeXRlQk9NfSAgIAl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO30NCi0NCi0JLy8gZm9yY2UgdG8gYmUgc3RhcnRlZCBvbiBmaXJzdCBsaW5lLCBidXQgd2UgZG8gYWxsb3cgcHJlY2VlZGluZyBzcGFjZXMNCi0JXiB7Wn0oe1N9e1p9KSogKHtafTx7Wn1cP3tafXh7Wn1te1p9bHtafSl7U19VVEZ9KyB7aWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9fQ0KLQkNCi0JXiB7Wn0oe1N9e1p9KSooe1p9QHtafWN7Wn1oe1p9YXtafXJ7Wn1ze1p9ZXtafXR7Wn0pICAge2lmICh5eWNoYXIgPT0gMCApICB7eXliZWdpbihDSEFSU0VUX1JVTEUpOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEU7fX0NCi19CQ0KLQ0KLS8vIEkgZG9uJ3QgdGhpbmsgdGhlcmUncyByZWFsbHkgYW4gWE1MIGZvcm0gb2YgQ1NTIGZpbGVzIC4uLiBidXQgd2lsbCBsZWF2ZSBoZXJlIGZvciBjb25zaXN0ZW5jeQkNCi08U1RfWE1MRGVjbD4gDQotew0KLQkvLyJ2ZXJzaW9uIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9DQotCXtafWV7Wn1ue1p9Y3tafW97Wn1ke1p9aXtafW57Wn1ne1p9IHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQ0KLQkvLyBub3RlIHRoaXMgImZvcmNlZCBlbmQiIG9uY2UgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZA0KLQl7Wn1cP3tafT57Wn0gICAge3l5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQ0KLX0JDQotDQotPENIQVJTRVRfUlVMRT4gDQotew0KLQ0KLQl7U19VVEZ9KiAge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7fQ0KLQl7Wn07e1p9ICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5SdWxlRW5kO30NCi19DQotCQ0KLQ0KLTxRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4NCi17DQotCXtafVwie1p9ICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0NCi0Je1p9XCd7Wn0JCQl7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQ0KLQkvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcNCi0Je1NfVVRGfSouICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApO30NCi0NCi19CQ0KLQ0KLQ0KLTxEUV9TVFJJTkc+DQotew0KLQ0KLQl7Wn1cIntafSAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XD97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCQ0KLQl7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwve1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9O3tafSAgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQ0KLQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotDQotDQotfQ0KLQ0KLTxTUV9TVFJJTkc+DQotew0KLQ0KLQl7Wn1cJ3tafSAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQ0KLSAgCXtafXtMaW5lVGVybWluYXRvcn17Wn0gICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn0le1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XC97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn07e1p9ICAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9DQotCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0NCi19DQotDQotPFVuRGVsaW1pdGVkU3RyaW5nPg0KLXsNCi0NCi0NCi0Je1NfVVRGfSAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XD97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafTx7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0JLy8gdGhlc2UgYXJlIGEgYml0IHNwZWNpYWwsIHNpbmNlIHdlIHN0YXJ0ZWQgYW4gdW5kZWxpbWl0IHN0cmluZywgYnV0IGZvdW5kIGEgcXVvdGUgLi4uIHByb2JhYmx5IGluZGljYXRlcyBhIG1pc3NpbmcgYmVnaW5uaW5nIHF1b3RlDQotCXtafVwne1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwie1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9DQotCQ0KLQl7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafVwve1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9O3tafSAgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQ0KLQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotfQ0KLQ0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcNCi0vLyAoVGhhdCBpcywgcmVtZW1iZXIgdG8gdXBkYXRlIHN0YXRlIGxpc3QgaWYvd2hlbiBuZXcgc3RhdGVzIGFkZGVkKQ0KLS58XG4Je2lmKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319DQotDQotLy8gdGhpcyBydWxlIGFsd2F5cyBpbiBlZmZlY3QNCi08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzMDlkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NDEgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gNy8yOC8wOCA1OjE5IFBNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDcvMjgvMDggNToxOSBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi93b3Jrc3BhY2VzL3d0cDMwMS93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qRmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDU1NIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IENIQVJTRVRfUlVMRSA9IDQ7Ci0KLSAgLyoqCi0gICAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCA3Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxXDExXDEwXDBcMVw2XDFcMTBcMlwwXDFcN1wyMlwwXDFcNlwxXDBcMVwzNyIrCi0gICAgIlwyXDBcMVw0MlwxXDBcMVw0MFw3XDBcMVw0MVwxM1wwXDFcMzZcMVwxM1wxXDEyIisKLSAgICAiXDFcMzVcMVwxNFwxXDIwXDFcMjNcMVwwXDFcMjFcMVwzMlwxXDI2XDFcMFwxXDM0IisKLSAgICAiXDFcMjJcMVwzM1wyXDBcMVwxN1wxXDE2XDFcMzBcMVwzMVwyXDBcMVwyNFwxXDI1IisKLSAgICAiXDFcMjdcM1wwXDFcMTVcMTBcMFwxXDIzXDFcMFwxXDIxXDFcMzJcMVwyNlwxXDAiKwotICAgICJcMVwzNFwxXDIyXDFcMzNcMlwwXDFcMTdcMVwxNlwxXDMwXDFcMzFcMlwwXDFcMjQiKwotICAgICJcMVwyNVwxXDI3XDNcMFwxXDE1XDEwMlwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzIisKLSAgICAiXDE2XDBcMVwxXDIwXDBcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKiAKLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgCQkgKiBmcm9tIGlucHV0IAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLSAgCQkKLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTYwKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIAloYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgeXlfZm9yTmV4dDogeyBzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDY3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDY4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfc3RhdGUgPSA2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gNjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDc1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDc3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDgxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDgyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA4MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA3NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDg3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA4ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9zdGF0ZSA9IDg5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDYwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA4NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA4NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfc3RhdGUgPSA4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB5eV9zdGF0ZSA9IDk1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA5MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA5NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gOTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA5OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHl5X3N0YXRlID0gOTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTAwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gMTAxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTAzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA5OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfc3RhdGUgPSAxMDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSAxMDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDEwNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDEwNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMTAzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gMTA1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gMTA3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDExMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAxMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfc3RhdGUgPSAxMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX0lMTEVHQUxfU1RBVEUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggeXlfaXNGaW5hbCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCB5eV9ub0xvb2tBaGVhZCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDExOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICBjYXNlIDEyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7ICBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlJ1bGVFbmQ7IH0KLSAgICAgICAgY2FzZSAxMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAxMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApICB7eXliZWdpbihDSEFSU0VUX1JVTEUpOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEU7fSB9Ci0gICAgICAgIGNhc2UgMTIzOiBicmVhazsKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fSB9Ci0gICAgICAgIGNhc2UgMTI0OiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICAgIHsgaWYoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fSB9Ci0gICAgICAgIGNhc2UgMTI1OiBicmVhazsKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsgfQotICAgICAgICBjYXNlIDEyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSAxMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyB9Ci0gICAgICAgIGNhc2UgMTI4OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOyB9Ci0gICAgICAgIGNhc2UgMTI5OiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFOyB9Ci0gICAgICAgIGNhc2UgMTMwOiBicmVhazsKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007IH0KLSAgICAgICAgY2FzZSAxMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICAgIHsgIHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7ICB9Ci0gICAgICAgIGNhc2UgMTMyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSAxMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDEzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM2OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDEzNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTM4OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIENTU0hlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IENTU0hlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBDU1NIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplckdlbkphdmEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjA2ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1AZWNobyBvZmYNCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbmVlZCB0byBiZSBzZXQvc3BlY2lmaWVkIGZvciBlYWNoICJkZXZlbG9wbWVudCBtYWNoaW5lIg0KLXNldCBQQVRIPSVQQVRIJTtkOmpka3NcajJzZGsxLjQuMV8wMlxiaW4NCi1zZXQgV09SS1NQQUNFX0xPQ0FUSU9OPUQ6XGJ1aWxkc1xXb3Jrc3BhY2VzXFB1cmVIZWFkV29ya3NwYWNlDQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleFxsaWINCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZGlmZmVyIGZyb20gcHJvamVjdCB0byBwcm9qZWN0LCBidXQgc2hvdWxkIGJlIG90aGVyd2lzZSBjb25zdGFudA0KLXNldCBNQUlOX05BTUU9Q1NTSGVhZFRva2VuaXplcg0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWNcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXGVuY29kaW5nXHJlc291cmNlXGNvbnRlbnRzcGVjaWZpY1xjc3NcDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXJlbSBwYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleG91dC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3NDNjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotUmVhZGluZyAiQ1NTSGVhZFRva2VuaXplci5qZmxleCIKLUNvbnN0cnVjdGluZyBORkEgOiA0NTggc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0xMDIgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDY0IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIkNTU0hlYWRUb2tlbml6ZXIuamF2YSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNWRjMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuakZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qbmxzWFhYKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOw0KLQ0KLQ0KLQ0KLSUlDQotDQotJXsNCi0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOw0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOw0KLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nDQotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsNCi0JYm9vbGVhbiBmb3VuZENvbnRlbnRUeXBlVmFsdWUgPSBmYWxzZTsNCi0NCi0NCi0NCi0JcHVibGljIEhUTUxIZWFkVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsNCi0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLw0KLQkgIAl5eV9yZWFkZXIgPSBpbjsNCi0NCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLSAgCQl5eV9zdGF0ZSA9IDA7DQotDQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOw0KLQ0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOw0KLQ0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7DQotDQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsNCi0NCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICAJCXl5X3N0YXJ0UmVhZCA9IDA7DQotDQotICAJCS8qKiANCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAJCSAqIGZyb20gaW5wdXQgDQotICAJCSAqLw0KLSAgCQl5eV9lbmRSZWFkID0gMDsNCi0NCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICAJCXl5bGluZSA9IDA7DQotDQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgCQl5eWNoYXIgPSAwOw0KLQ0KLSAgCQkvKioNCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQNCi0gIAkJICogb2YgdGhlIG1hdGNoZWQgdGV4dA0KLSAgCQkgKi8NCi0gIAkJeXljb2x1bW4gPSAwOyANCi0NCi0gIAkJLyoqIA0KLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyANCi0gIAkJICogb2YgYSBsaW5lDQotICAJCSAqLw0KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOw0KLQ0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotICAJCXl5X2F0RU9GID0gZmFsc2U7DQotDQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLw0KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOw0KLQ0KLQ0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOw0KLSAgCQkNCi0gIAkJaGFzTW9yZSA9IHRydWU7DQotICAJCQ0KLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZA0KLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQNCi0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLg0KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsNCi0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07DQotCQl9DQotICAJCQ0KLQ0KLSAgCX0NCi0NCi0NCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOw0KLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7DQotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOw0KLQkJCXZhbHVlVGV4dCA9IG51bGw7DQotCQl9IGVsc2Ugew0KLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgew0KLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47DQotCX0NCi0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7DQotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgew0KLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCX0NCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsNCi0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsNCi0JfQ0KLQkNCi0NCi0lfQ0KLQ0KLSVlb2Z7DQotCWhhc01vcmU9ZmFsc2U7DQotJWVvZn0NCi0NCi0lcHVibGljDQotJWNsYXNzIEhUTUxIZWFkVG9rZW5pemVyDQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSV1bmljb2RlDQotJWlnbm9yZWNhc2UgDQotLy8lZGVidWcNCi0lc3dpdGNoDQotDQotDQotVVRGMTZCRSA9IFx4RkVceEZGDQotVVRGMTZMRSA9IFx4RkZceEZFDQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGDQotDQotU3BhY2VDaGFyID0gW1x4MjBceDA5XQ0KLQ0KLQ0KLQ0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrDQotUyA9IFtceDIwXHgwOVx4MERceDBBXQ0KLQ0KLS8vIEJlZ2luQXR0cmliZVZhbHVlID0ge1N9KiBcPSB7U30qDQotDQotTGluZVRlcm1pbmF0b3IgPSBccnxcbg0KLQ0KLVogPSAoXHgwMCk/DQotU19VVEYgPSB7Wn17U317Wn0NCi1CZWdpbkF0dHJpYnV0ZVZhbHVlVVRGID0ge1NfVVRGfSogXD0ge1NfVVRGfSoNCi0NCi0lc3RhdGUgU1RfWE1MRGVjbA0KLSVzdGF0ZSBTVF9NRVRBX1RBRw0KLSVzdGF0ZSBRdW90ZWRBdHRyaWJ1dGVWYWx1ZQ0KLSVzdGF0ZSBEUV9TVFJJTkcNCi0lc3RhdGUgU1FfU1RSSU5HDQotJXN0YXRlIFVuRGVsaW1pdGVkU3RyaW5nDQotJXN0YXRlIFVuRGVsaW1pdGVkQ2hhcnNldA0KLQ0KLSUlDQotDQotDQotPFlZSU5JVElBTD4gIA0KLXsNCi0Je1VURjE2QkV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9DQotCXtVVEYxNkxFfSAgIAkJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fQ0KLQl7VVRGODNCeXRlQk9NfSAgIAl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO30NCi0NCi0JLy8gZm9yY2UgdG8gYmUgc3RhcnRlZCBvbiBmaXJzdCBsaW5lLCBidXQgd2UgZG8gYWxsb3cgcHJlY2VlZGluZyBzcGFjZXMNCi0JXiB7U19VVEZ9KiAoe1p9PHtafVw/e1p9eHtafW17Wn1se1p9KXtTX1VURn0rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319DQotCSh7Wn08e1p9TXtafUV7Wn1Ue1p9QXtafSkgICAgICAge3l5YmVnaW4oU1RfTUVUQV9UQUcpOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ1N0YXJ0O30NCi0JDQotDQotfQkNCi0JDQotPFNUX1hNTERlY2w+IA0KLXsNCi0JLy8idmVyc2lvbiIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQ0KLQkoe1p9ZXtafW57Wn1je1p9b3tafWR7Wn1pe1p9bntafWd7Wn0pIHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQ0KLQkvLyBub3RlIHRoaXMgImZvcmNlZCBlbmQiIG9uY2UgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZA0KLQkoe1p9XD97Wn0+e1p9KSAgICB7eXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDt9DQotfQkNCi0NCi08U1RfTUVUQV9UQUc+IA0KLXsNCi0NCi0vLwkiaHR0cC1lcXVpdiIge1N9KiBcPSB7U30qIFwiPyAiQ29udGVudC1UeXBlIiBcIj8ge1N9KyAiY29udGVudCIge0JlZ2luQXR0cmliZVZhbHVlfSAge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IGZvdW5kQ29udGVudFR5cGVWYWx1ZT10cnVlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0NvbnRlbnRUeXBlO30NCi0Je1p9aHtafXR7Wn10e1p9cHtafS17Wn1le1p9cXtafXV7Wn1pe1p9dntafSB7U19VVEZ9KiBcPSB7U19VVEZ9KiB7Wn1cIj97Wn0gKHtafUN7Wn1ve1p9bntafXR7Wn1le1p9bntafXR7Wn0te1p9VHtafXl7Wn1we1p9ZXtafSkgXCI/e1p9ICh7U19VVEZ9KSsgKHtafWN7Wn1ve1p9bntafXR7Wn1le1p9bntafXR7Wn0pIHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSAge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IGZvdW5kQ29udGVudFR5cGVWYWx1ZT10cnVlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0NvbnRlbnRUeXBlO30NCi0Je1p9PntafSAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7fQ0KLQl7Wn1cL3tafT57Wn0gICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7fQ0KLX0NCi0JDQotDQotPFF1b3RlZEF0dHJpYnV0ZVZhbHVlPg0KLXsNCi0Je1p9XCJ7Wn0gICAgICAgICAgICB7IHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQ0KLQl7Wn1cJ3tafQkJCXsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9DQotCS8vIGluIHRoaXMgc3RhdGUsIGFueXRoaW5nIG90aGVyIHRoYW4gYSBzcGFjZSBjaGFyYWN0ZXIgY2FuIHN0YXJ0IGFuIHVuZGVsaW1pdGVkIHN0cmluZw0KLQl7U19VVEZ9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQ0KLQ0KLX0JDQotDQotDQotPERRX1NUUklORz4NCi17DQotDQotCXtafVwie1p9ICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQ0KLSAgCXtafXtMaW5lVGVybWluYXRvcn17Wn0gICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cP3tafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafTx7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0JDQotCXtafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XC97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotDQotDQotfQ0KLQ0KLTxTUV9TVFJJTkc+DQotew0KLQ0KLQl7Wn1cJ3tafSAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQ0KLSAgCXtafXtMaW5lVGVybWluYXRvcn17Wn0gICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn0le1p9PntafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XC97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotDQotDQotfQ0KLQ0KLTxVbkRlbGltaXRlZFN0cmluZz4NCi17DQotDQotDQotCS8vIG5vdGUgdGhpcyBpbml0aWFsIHNwZWNpYWwgY2FzZSBmb3IgSFRUUCBjb250ZW50dHlwZSB2YWx1ZXMNCi0JLy8gTG9vayBhaGVhZCBhbmQgc2VlIGlmIHRoZXJlIGFyZSBzcGFjZXMsIGJ1dCBkb24ndCBhcHBlbmQgdGhlIHNwYWNlcyBhcyB0aGV5IG1heSBiZSBkb3VibGUtYnl0ZQ0KLQkvLyBMZXQgdGhlIG5leHQgc3RhdGUgaGFuZGxlIHJlbW92YWwgb2YgdGhlIFx4MDAgYW5kIHByb3Blcmx5IGFwcGVuZCBzcGFjZXMNCi0JIjsiL3tTX1VURn0qCQkJeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRDaGFyc2V0KTsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLQl7U19VVEZ9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQ0KLSAgCXtafXtMaW5lVGVybWluYXRvcn17Wn0gICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cP3tafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9PHtafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQkvLyB0aGVzZSBhcmUgYSBiaXQgc3BlY2lhbCwgc2luY2Ugd2Ugc3RhcnRlZCBhbiB1bmRlbGltaXQgc3RyaW5nLCBidXQgZm91bmQgYSBxdW90ZSAuLi4gcHJvYmFibHkgaW5kaWNhdGVzIGEgbWlzc2luZyBiZWdpbm5pbmcgcXVvdGUNCi0Je1p9XCd7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XCJ7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30NCi0JDQotCXtafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XC97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQlbXlx4MDBdCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotDQotfQ0KLQ0KLTxVbkRlbGltaXRlZENoYXJzZXQ+DQotew0KLQl7U30geyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9DQotCS8vIEZvciBub24gXHgwMCBjaGFyYWN0ZXJzLCBsZXQgdGhlIHByZXZpb3VzIHN0YXRlIGhhbmRsZSBpdA0KLQlbXlx4MDBdIHt5eXB1c2hiYWNrKDEpOyBwb3BTdGF0ZSgpOyB9DQotfQ0KLQ0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcNCi0vLyAoVGhhdCBpcywgcmVtZW1iZXIgdG8gdXBkYXRlIHN0YXRlIGxpc3QgaWYvd2hlbiBuZXcgc3RhdGVzIGFkZGVkKQ0KLS58XG4Je2lmKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319DQotDQotLy8gdGhpcyBydWxlIGFsd2F5cyBpbiBlZmZlY3QNCi08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDZjOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxLzI3LzA0IDY6NDEgUE0gKi8KLQotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5odG1sOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5IZWFkUGFyc2VyVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSW50U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEvMjcvMDQgNjo0MSBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MSGVhZFRva2VuaXplciB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX01FVEFfVEFHID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDY7Ci0KLSAgLyoqCi0gICAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCA3Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcNlwxXDdcMlwwXDFcMTFcMjJcMFwxXDIyXDFcMFwxXDQwXDJcMCIrCi0gICAgIlwxXDQ0XDFcMFwxXDQzXDVcMFwxXDM0XDFcMFwxXDQyXDEzXDBcMVw0NVwxXDEyIisKLSAgICAiXDFcMTBcMVwzMVwxXDEzXDFcMFwxXDIxXDFcMFwxXDI0XDFcMjZcMVwxN1wxXDAiKwotICAgICJcMVwzMFwxXDMyXDFcMjdcMlwwXDFcMTZcMVwxNVwxXDIzXDFcMjVcMVwzM1wxXDM1IisKLSAgICAiXDJcMFwxXDIwXDFcMzZcMVwzN1wxXDBcMVwxNFwxXDQxXDdcMFwxXDIxXDFcMCIrCi0gICAgIlwxXDI0XDFcMjZcMVwxN1wxXDBcMVwzMFwxXDMyXDFcMjdcMlwwXDFcMTZcMVwxNSIrCi0gICAgIlwxXDIzXDFcMjVcMVwzM1wxXDM1XDJcMFwxXDIwXDFcMzZcMVwzN1wxXDBcMVwxNCIrCi0gICAgIlwxXDQxXDEwMVwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzXDE2XDBcMVwxXDIwXDAiKwotICAgICJcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCWJvb2xlYW4gZm91bmRDb250ZW50VHlwZVZhbHVlID0gZmFsc2U7Ci0KLQotCi0JcHVibGljIEhUTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKiAKLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgCQkgKiBmcm9tIGlucHV0IAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLSAgCQkKLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxNzQpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0KLSAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgCWhhc01vcmU9ZmFsc2U7Ci0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIHl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXG4nOwotICAgICAgaWYgKCF5eV9hdEJPTCAmJiB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdccicpIHsKLSAgICAgICAgeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLSAgICAgICAgaWYgKCF5eV9hdEVPRikgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgaWYgKHl5X2F0Qk9MKQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZV07Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5Y21hcFt5eV9pbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHl5X2lzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB5eV9mb3JOZXh0OiB7IHN3aXRjaCAoeXlfc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA1NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9zdGF0ZSA9IDU4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSA1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X3N0YXRlID0gNjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDYzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDY0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfc3RhdGUgPSA2NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X3N0YXRlID0gNjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9zdGF0ZSA9IDY3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA2NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDY4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfc3RhdGUgPSA2OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDY4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9zdGF0ZSA9IDcxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA3MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X3N0YXRlID0gNzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDc0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDczOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA3MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDc2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA3NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDc5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfc3RhdGUgPSA4MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gODE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB5eV9zdGF0ZSA9IDgyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSA4MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gODQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X3N0YXRlID0gODY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gODc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDg1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA4ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gODk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDkwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA5MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gOTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA5MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHl5X2lzRmluYWwgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggeXlfbm9Mb29rQWhlYWQgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDk2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0gICAgICAgIGNhc2UgOTc6IGJyZWFrOwotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7ICBpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKSBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kOyB9Ci0gICAgICAgIGNhc2UgOTg6IGJyZWFrOwotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDk5OiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyBpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKSBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kOyB9Ci0gICAgICAgIGNhc2UgMTAwOiBicmVhazsKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgMTAxOiBicmVhazsKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAxMDI6IGJyZWFrOwotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fSB9Ci0gICAgICAgIGNhc2UgMTAzOiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fSB9Ci0gICAgICAgIGNhc2UgMTA0OiBicmVhazsKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX01FVEFfVEFHKTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdTdGFydDsgfQotICAgICAgICBjYXNlIDEwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsgfQotICAgICAgICBjYXNlIDEwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgZm91bmRDb250ZW50VHlwZVZhbHVlPXRydWU7IHJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGU7IH0KLSAgICAgICAgY2FzZSAxMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOyB9Ci0gICAgICAgIGNhc2UgMTA4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOyB9Ci0gICAgICAgIGNhc2UgMTA5OiBicmVhazsKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFOyB9Ci0gICAgICAgIGNhc2UgMTEwOiBicmVhazsKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007IH0KLSAgICAgICAgY2FzZSAxMTE6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgICB7ICBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDExMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgIHsgIHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7ICB9Ci0gICAgICAgIGNhc2UgMTEzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgICAgeyAgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDExNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSAxMTU6IGJyZWFrOwotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSAxMTY6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjsgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqIFJ1bnMgdGhlIHNjYW5uZXIgb24gaW5wdXQgZmlsZXMuCi0gICAqCi0gICAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4KLSAgICogSXQgcHJpbnRzIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mCi0gICAqIGZpbGUgaXMgcmVhY2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJlZC4KLSAgICoKLSAgICogQHBhcmFtIGFyZ3YgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1bgotICAgKiAgICAgICAgICAgICAgIHRoZSBzY2FubmVyIG9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotICAgICAgSFRNTEhlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IEhUTUxIZWFkVG9rZW5pemVyKCBuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgSFRNTEhlYWRUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci5wcmltR2V0TmV4dFRva2VuKCkpOwotICAgICAgICB9IHdoaWxlICghc2Nhbm5lci55eV9hdEVPRik7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjIzMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLUBlY2hvIG9mZg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBuZWVkIHRvIGJlIHNldC9zcGVjaWZpZWQgZm9yIGVhY2ggImRldmVsb3BtZW50IG1hY2hpbmUiDQotc2V0IFBBVEg9JVBBVEglO2Q6amRrc1xqMnNkazEuNC4xXzAyXGJpbg0KLXNldCBXT1JLU1BBQ0VfTE9DQVRJT049RDpcYnVpbGRzXFdvcmtzcGFjZXNcUHVyZUhlYWRXb3Jrc3BhY2UNCi1zZXQgSkZMRVhfTElCX0xPQ0FUSU9OPUQ6XERldlRpbWVTdXBwb3J0XEpGbGV4XGxpYg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBkaWZmZXIgZnJvbSBwcm9qZWN0IHRvIHByb2plY3QsIGJ1dCBzaG91bGQgYmUgb3RoZXJ3aXNlIGNvbnN0YW50DQotc2V0IE1BSU5fTkFNRT1IVE1MSGVhZFRva2VuaXplcg0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWNcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXGVuY29kaW5nXHJlc291cmNlXGNvbnRlbnRzcGVjaWZpY1xodG1sXA0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAtc2tlbCAlU0tFTEVUT05fRklMRSUgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotSUYgRVhJU1QgJUpBVkFfRklMRSUgY29weSAlSkFWQV9GSUxFJSAlV09SS1NQQUNFX0xPQ0FUSU9OJSVQUk9KRUNUX1NSQyUlUEFDS0FHRV9ESVIlJUpBVkFfRklMRSUNCi0NCi1yZW0gcGF1c2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ2OWU5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleG91dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVJlYWRpbmcgIkhUTUxIZWFkVG9rZW5pemVyLmpmbGV4IgotCi1XYXJuaW5nIDogTWFjcm8gIlNwYWNlQ2hhciIgaGFzIGJlZW4gZGVjbGFyZWQgYnV0IG5ldmVyIHVzZWQuCi1Db25zdHJ1Y3RpbmcgTkZBIDogNjYwIHN0YXRlcyBpbiBORkEKLUNvbnZlcnRpbmcgTkZBIHRvIERGQSA6IAotLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotMTM1IHN0YXRlcyBiZWZvcmUgbWluaW1pemF0aW9uLCA5NSBzdGF0ZXMgaW4gbWluaW1pemVkIERGQQotV3JpdGluZyBjb2RlIHRvICJIVE1MSGVhZFRva2VuaXplci5qYXZhIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzA3Mzg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lcy5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsMjAwOCBJQk0gQ29ycG9yYXRpb24sIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBrYi5odWFuZyAgLSBCdWcgMjE0NDE2ICBEb3QgY2hhciBpcyBub3QgZXNjYXBlZCBpbiBYTUwxME5hbWVzLmpGbGV4Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLSUlCi0KLSV0YWJsZQotJXB1YmxpYwotJWZpbmFsCi0lY2xhc3MgWE1MMTBOYW1lcwotJWZ1bmN0aW9uIGlzVmFsaWRYTUwxME5hbWUKLSV0eXBlIGJvb2xlYW4KLSV1bmljb2RlCi0laWdub3JlY2FzZQotJWJ1ZmZlciAyMDQ4Ci0lYXBpcHJpdmF0ZQotCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdCi0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQotCi1Db21iaW5pbmdDaGFyID0gW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0KLQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0KLQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQotCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pCi0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8ICIuIiB8ICItIiB8ICJfIiB8ICI6IiB8IHtDb21iaW5pbmdDaGFyfSB8IHtFeHRlbmRlcn0pCi0KLU5hbWUgPSAoe0xldHRlcn0gfCAiXyIgfCAiOiIgKSAoe05hbWVDaGFyfSkqCi0KLQotCi0lewotICAgICAgICBib29sZWFuIHJlc3VsdDsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy56elJlYWRlciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKFN0cmluZyBzdHJpbmdUb0NoZWNrKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB5eXJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihzdHJpbmdUb0NoZWNrKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzVmFsaWRYTUwxME5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGltcG9zc2libGUgd2l0aCBzdHJpbmdzLCBidXQgaWYgb2NjdXJzLCBqdXN0IG1lYW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAibm90IgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotJX0KLQotCi0KLQotJSUKLQotPFlZSU5JVElBTD4KLXsKLQotICAgICAgICAvLyBuYW1lIG11c3QgYmUgd2hvbGUgbGluZSAoaW5wdXQpLCBub3QgcGFydGlhbAotICAgICAgICAvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNDQxNgotICAgICAgICB7TmFtZX0gICAgICAgICAgICB7cmV0dXJuIHRydWU7IC8qIGV4YWN0IG5hbWUgKi99Ci0gICAgICAgIHtOYW1lfS4rICAgICAgICAgIHtyZXR1cm4gZmFsc2U7IC8qIG1vcmUgdGhhbiBuYW1lICovfQotCi0gICAgICAgIC8vIG1hdGNoIGFueXRoaW5nIChlbHNlKSBzaG91bGQgbm9ybWFsbHkgY29tZSBsYXN0Ci0gICAgICAgIC4gICAgICAgICAgICAgICAgIHtyZXR1cm4gZmFsc2U7IC8qIG1hdGNoZWQgd2lsZCAqL30KLQotfQotCi0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+Ci17Ci0gICAgICAgIHtyZXR1cm4gZmFsc2U7IC8qIGhpdCBlbmQgd2l0aCBubyBtYXRjaCAqL30KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTkxMjEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk1ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuNCBvbiAyLzI1LzA4IDEwOjI1IEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsMjAwOCBJQk0gQ29ycG9yYXRpb24sIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBrYi5odWFuZyAgLSBCdWcgMjE0NDE2ICBEb3QgY2hhciBpcyBub3QgZXNjYXBlZCBpbiBYTUwxME5hbWVzLmpGbGV4Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNAotICogb24gMi8yNS8wOCAxMDoyNSBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5YTUwxME5hbWVzLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTDEwTmFtZXMgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9CVUZGRVJTSVpFID0gMjA0ODsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlZSU5JVElBTCA9IDA7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMTJcMFwxXDNcNDJcMFwxXDJcMVwyXDFcMFwxMlwyXDFcMVw2XDBcMzJcMSIrCi0gICAgIlw0XDBcMVwxXDFcMFwzMlwxXDc0XDBcMVwyXDEwXDBcMjdcMVwxXDBcMzdcMSIrCi0gICAgIlwxXDBcNzJcMVwyXDBcMTNcMVwyXDBcMTBcMVwxXDBcNjVcMVwxXDBcMTA0XDEiKwotICAgICJcMTFcMFw0NFwxXDNcMFwyXDFcNFwwXDM2XDFcNzBcMFwxMzFcMVwyMlwwXDdcMSIrCi0gICAgIlwxNlwwXDJcMlw1NlwwXDEwNlwyXDMyXDBcMlwyXDQ0XDBcMVwxXDFcMlwzXDEiKwotICAgICJcMVwwXDFcMVwxXDBcMjRcMVwxXDBcNTRcMVwxXDBcN1wxXDNcMFwxXDEiKwotICAgICJcMVwwXDFcMVwxXDBcMVwxXDFcMFwxXDFcMVwwXDIyXDFcMTVcMFwxNFwxIisKLSAgICAiXDFcMFwxMDJcMVwxXDBcMTRcMVwxXDBcNDRcMVwxXDBcNFwyXDExXDBcNjVcMSIrCi0gICAgIlwyXDBcMlwxXDJcMFwyXDFcM1wwXDM0XDFcMlwwXDEwXDFcMlwwXDJcMSIrCi0gICAgIlw2N1wwXDQ2XDFcMlwwXDFcMVw3XDBcNDZcMVwxMlwwXDIxXDJcMVwwXDI3XDIiKwotICAgICJcMVwwXDNcMlwxXDBcMVwyXDFcMFwyXDJcMVwwXDFcMlwxM1wwXDMzXDEiKwotICAgICJcNVwwXDNcMVw1NlwwXDMyXDFcNVwwXDFcMlwxMlwxXDEwXDJcMTVcMFwxMlwyIisKLSAgICAiXDZcMFwxXDJcMTA3XDFcMlwwXDVcMVwxXDBcMTdcMVwxXDBcNFwxXDFcMCIrCi0gICAgIlwxXDFcMTdcMlwyXDFcMlwyXDFcMFw0XDJcMlwwXDEyXDJcdTAyMDdcMFwzXDIiKwotICAgICJcMVwwXDY1XDFcMlwwXDFcMlwxXDFcMjBcMlwzXDBcNFwyXDNcMFwxMlwxIisKLSAgICAiXDJcMlwyXDBcMTJcMlwyMVwwXDNcMlwxXDBcMTBcMVwyXDBcMlwxXDJcMCIrCi0gICAgIlwyNlwxXDFcMFw3XDFcMVwwXDFcMVwzXDBcNFwxXDJcMFwxXDJcMVwwIisKLSAgICAiXDdcMlwyXDBcMlwyXDJcMFwzXDJcMTFcMFwxXDJcNFwwXDJcMVwxXDAiKwotICAgICJcM1wxXDJcMlwyXDBcMTJcMlwyXDFcMjBcMFwxXDJcMlwwXDZcMVw0XDAiKwotICAgICJcMlwxXDJcMFwyNlwxXDFcMFw3XDFcMVwwXDJcMVwxXDBcMlwxXDFcMCIrCi0gICAgIlwyXDFcMlwwXDFcMlwxXDBcNVwyXDRcMFwyXDJcMlwwXDNcMlwxM1wwIisKLSAgICAiXDRcMVwxXDBcMVwxXDdcMFwxMlwyXDJcMlwzXDFcMTRcMFwzXDJcMVwwIisKLSAgICAiXDdcMVwxXDBcMVwxXDFcMFwzXDFcMVwwXDI2XDFcMVwwXDdcMVwxXDAiKwotICAgICJcMlwxXDFcMFw1XDFcMlwwXDFcMlwxXDFcMTBcMlwxXDBcM1wyXDFcMCIrCi0gICAgIlwzXDJcMjJcMFwxXDFcNVwwXDEyXDJcMjFcMFwzXDJcMVwwXDEwXDFcMlwwIisKLSAgICAiXDJcMVwyXDBcMjZcMVwxXDBcN1wxXDFcMFwyXDFcMlwwXDRcMVwyXDAiKwotICAgICJcMVwyXDFcMVw2XDJcM1wwXDJcMlwyXDBcM1wyXDEwXDBcMlwyXDRcMCIrCi0gICAgIlwyXDFcMVwwXDNcMVw0XDBcMTJcMlwyMlwwXDJcMlwxXDBcNlwxXDNcMCIrCi0gICAgIlwzXDFcMVwwXDRcMVwzXDBcMlwxXDFcMFwxXDFcMVwwXDJcMVwzXDAiKwotICAgICJcMlwxXDNcMFwzXDFcM1wwXDEwXDFcMVwwXDNcMVw0XDBcNVwyXDNcMCIrCi0gICAgIlwzXDJcMVwwXDRcMlwxMVwwXDFcMlwxN1wwXDExXDJcMjFcMFwzXDJcMVwwIisKLSAgICAiXDEwXDFcMVwwXDNcMVwxXDBcMjdcMVwxXDBcMTJcMVwxXDBcNVwxXDRcMCIrCi0gICAgIlw3XDJcMVwwXDNcMlwxXDBcNFwyXDdcMFwyXDJcMTFcMFwyXDFcNFwwIisKLSAgICAiXDEyXDJcMjJcMFwyXDJcMVwwXDEwXDFcMVwwXDNcMVwxXDBcMjdcMVwxXDAiKwotICAgICJcMTJcMVwxXDBcNVwxXDRcMFw3XDJcMVwwXDNcMlwxXDBcNFwyXDdcMCIrCi0gICAgIlwyXDJcN1wwXDFcMVwxXDBcMlwxXDRcMFwxMlwyXDIyXDBcMlwyXDFcMCIrCi0gICAgIlwxMFwxXDFcMFwzXDFcMVwwXDI3XDFcMVwwXDIwXDFcNFwwXDZcMlwyXDAiKwotICAgICJcM1wyXDFcMFw0XDJcMTFcMFwxXDJcMTBcMFwyXDFcNFwwXDEyXDJcMjIxXDAiKwotICAgICJcNTZcMVwxXDBcMVwxXDFcMlwyXDFcN1wyXDVcMFw2XDFcMVwyXDEwXDIiKwotICAgICJcMVwwXDEyXDJcNDdcMFwyXDFcMVwwXDFcMVwyXDBcMlwxXDFcMFwxXDEiKwotICAgICJcMlwwXDFcMVw2XDBcNFwxXDFcMFw3XDFcMVwwXDNcMVwxXDBcMVwxIisKLSAgICAiXDFcMFwxXDFcMlwwXDJcMVwxXDBcMlwxXDFcMFwxXDFcMVwyXDJcMSIrCi0gICAgIlw2XDJcMVwwXDJcMlwxXDFcMlwwXDVcMVwxXDBcMVwyXDFcMFw2XDIiKwotICAgICJcMlwwXDEyXDJcNzZcMFwyXDJcNlwwXDEyXDJcMTNcMFwxXDJcMVwwXDFcMiIrCi0gICAgIlwxXDBcMVwyXDRcMFwyXDJcMTBcMVwxXDBcNDFcMVw3XDBcMjRcMlwxXDAiKwotICAgICJcNlwyXDRcMFw2XDJcMVwwXDFcMlwxXDBcMjVcMlwzXDBcN1wyXDFcMCIrCi0gICAgIlwxXDJcMzQ2XDBcNDZcMVwxMlwwXDQ3XDFcMTFcMFwxXDFcMVwwXDJcMVwxXDAiKwotICAgICJcM1wxXDFcMFwxXDFcMVwwXDJcMVwxXDBcNVwxXDUxXDBcMVwxXDFcMCIrCi0gICAgIlwxXDFcMVwwXDFcMVwxM1wwXDFcMVwxXDBcMVwxXDFcMFwxXDFcM1wwIisKLSAgICAiXDJcMVwzXDBcMVwxXDVcMFwzXDFcMVwwXDFcMVwxXDBcMVwxXDFcMCIrCi0gICAgIlwxXDFcMVwwXDFcMVwzXDBcMlwxXDNcMFwyXDFcMVwwXDFcMVw1MFwwIisKLSAgICAiXDFcMVwxMVwwXDFcMVwyXDBcMVwxXDJcMFwyXDFcN1wwXDJcMVwxXDAiKwotICAgICJcMVwxXDFcMFw3XDFcNTBcMFwxXDFcNFwwXDFcMVwxMFwwXDFcMVx1MGMwNlwwIisKLSAgICAiXDIzNFwxXDRcMFwxMzJcMVw2XDBcMjZcMVwyXDBcNlwxXDJcMFw0NlwxXDJcMCIrCi0gICAgIlw2XDFcMlwwXDEwXDFcMVwwXDFcMVwxXDBcMVwxXDFcMFwxXDFcMVwwIisKLSAgICAiXDM3XDFcMlwwXDY1XDFcMVwwXDdcMVwxXDBcMVwxXDNcMFwzXDFcMVwwIisKLSAgICAiXDdcMVwzXDBcNFwxXDJcMFw2XDFcNFwwXDE1XDFcNVwwXDNcMVwxXDAiKwotICAgICJcN1wxXDMyM1wwXDE1XDJcNFwwXDFcMlwxMDRcMFwxXDFcM1wwXDJcMVwyXDAiKwotICAgICJcMVwxXDEyMVwwXDNcMVx1MGU4MlwwXDFcMlwxXDBcMVwxXDMxXDBcMTFcMVw2XDIiKwotICAgICJcMVwwXDVcMlwxM1wwXDEyNFwxXDRcMFwyXDJcMlwwXDJcMlwyXDBcMTMyXDEiKwotICAgICJcMVwwXDNcMlw2XDBcNTBcMVx1MWNkM1wwXHU1MWE2XDFcdTBjNWFcMFx1MmJhNFwxXHUyODVjXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIFpaX0NNQVAgPSB6elVucGFja0NNYXAoWlpfQ01BUF9QQUNLRUQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBERkEgc3RhdGVzIHRvIGFjdGlvbiBzd2l0Y2ggbGFiZWxzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FDVElPTiA9IHp6VW5wYWNrQWN0aW9uKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9Ci0gICAgIlwxXDBcMVwxXDFcMlwxXDMiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfUk9XTUFQID0genpVbnBhY2tSb3dNYXAoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfUk9XTUFQX1BBQ0tFRF8wID0KLSAgICAiXDBcMFwwXDRcMFwxMFwwXDE0IjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tSb3dNYXAoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tSb3dNYXAoWlpfUk9XTUFQX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja1Jvd01hcChTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgaGlnaCA9IHBhY2tlZC5jaGFyQXQoaSsrKSA8PCAxNjsKLSAgICAgIHJlc3VsdFtqKytdID0gaGlnaCB8IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9UUkFOUyBbXSA9IHsKLSAgICAxLCAyLCAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDMsIDIsIAotICAgIDIsIC0xLCAzLCAzLCAzLCAtMQotICB9OwotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1BVU0hCQUNLXzJCSUcgPSAyOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKioKLSAgICogWlpfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FUVFJJQlVURSA9IHp6VW5wYWNrQXR0cmlidXRlKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FUVFJJQlVURV9QQUNLRURfMCA9Ci0gICAgIlwxXDBcMVwxMVwyXDEiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0F0dHJpYnV0ZSgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0F0dHJpYnV0ZShaWl9BVFRSSUJVVEVfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQXR0cmlidXRlKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHp6UmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHp6U3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgenpCdWZmZXJbXSA9IG5ldyBjaGFyW1paX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ek1hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgenpQdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6Q3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6U3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgenpFbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXljb2x1bW47Ci0KLSAgLyoqIAotICAgKiB6ekF0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotICAgICAgICBib29sZWFuIHJlc3VsdDsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy56elJlYWRlciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKFN0cmluZyBzdHJpbmdUb0NoZWNrKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB5eXJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihzdHJpbmdUb0NoZWNrKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzVmFsaWRYTUwxME5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGltcG9zc2libGUgd2l0aCBzdHJpbmdzLCBidXQgaWYgb2NjdXJzLCBqdXN0IG1lYW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAibm90IgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTDEwTmFtZXMoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUwxME5hbWVzKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEyMTgpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHp6U3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgenpTdGFydFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICB6ekVuZFJlYWQtenpTdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgenpFbmRSZWFkLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ekN1cnJlbnRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6TWFya2VkUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elB1c2hiYWNrUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh6ekN1cnJlbnRQb3MgPj0genpCdWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt6ekN1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHp6QnVmZmVyLmxlbmd0aCk7Ci0gICAgICB6ekJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHp6UmVhZGVyLnJlYWQoenpCdWZmZXIsIHp6RW5kUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIubGVuZ3RoLXp6RW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHp6RW5kUmVhZCs9IG51bVJlYWQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLSAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICogRG9lcyBub3QgY2xvc2UgdGhlIG9sZCByZWFkZXIuCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLSAgICB6elJlYWRlciA9IHJlYWRlcjsKLSAgICB6ekF0Qk9MICA9IHRydWU7Ci0gICAgenpBdEVPRiAgPSBmYWxzZTsKLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zID0gMDsKLSAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIHByaXZhdGUgZmluYWwgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIHByaXZhdGUgZmluYWwgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0gICAgaW50IFtdIHp6VHJhbnNMID0gWlpfVFJBTlM7Ci0gICAgaW50IFtdIHp6Um93TWFwTCA9IFpaX1JPV01BUDsKLSAgICBpbnQgW10genpBdHRyTCA9IFpaX0FUVFJJQlVURTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSB6ekxleGljYWxTdGF0ZTsKLQotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHp6TmV4dCA9IHp6VHJhbnNMWyB6elJvd01hcExbenpTdGF0ZV0gKyB6ekNNYXBMW3p6SW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHp6TmV4dCA9PSAtMSkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgenpTdGF0ZSA9IHp6TmV4dDsKLQotICAgICAgICAgIGludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IHJldHVybiBmYWxzZTsgLyogbWF0Y2hlZCB3aWxkICovCi0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgcmV0dXJuIHRydWU7IC8qIGV4YWN0IG5hbWUgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyByZXR1cm4gZmFsc2U7IC8qIG1vcmUgdGhhbiBuYW1lICovCi0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgICB7IHtyZXR1cm4gZmFsc2U7IC8qIGhpdCBlbmQgd2l0aCBubyBtYXRjaCAqL30gfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB6elNjYW5FcnJvcihaWl9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmFKRmxleDE0LmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmFKRmxleDE0LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4MTZkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXNHZW5KYXZhSkZsZXgxNC5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1AZWNobyBvbg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBuZWVkIHRvIGJlIHNldC9zcGVjaWZpZWQgZm9yIGVhY2ggImRldmVsb3BtZW50IG1hY2hpbmUiDQotc2V0IFBBVEg9JVBBVEglO0Q6XEpES3NcaWJtLWphdmEyLXNkay01MC13aW4taTM4NlxiaW4NCi1zZXQgV09SS1NQQUNFX0xPQ0FUSU9OPUQ6XGJ1aWxkc1xXb3Jrc3BhY2VzXG5ld1dUUHB1cmVoZWFkDQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleC0xLjRcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPVhNTDEwTmFtZXMNCi0NCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC54bWwuY29yZVxzcmNcDQotc2V0IFBBQ0tBR0VfRElSPW9yZ1xlY2xpcHNlXHdzdFx4bWxcY29yZVxpbnRlcm5hbFxwYXJzZXJcDQotDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxKZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgLXNrZWwgJVNLRUxFVE9OX0ZJTEUlIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxKZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotSUYgRVhJU1QgJUpBVkFfRklMRSUgY29weSAlSkFWQV9GSUxFJSAlV09SS1NQQUNFX0xPQ0FUSU9OJSVQUk9KRUNUX1NSQyUlUEFDS0FHRV9ESVIlJUpBVkFfRklMRSUNCi0NCi1wYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhlcnIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleG91dC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzNmYxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotUmVhZGluZyAiWE1MMTBOYW1lcy5qZmxleCIKLUNvbnN0cnVjdGluZyBORkEgOiA4NCBzdGF0ZXMgaW4gTkZBCi1Db252ZXJ0aW5nIE5GQSB0byBERkEgOiAKLS4uLi4uLi4uLi4uLgotMTQgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDQgc3RhdGVzIGluIG1pbmltaXplZCBERkEKLVdyaXRpbmcgY29kZSB0byAiWE1MMTBOYW1lcy5qYXZhIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmZlODk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0lJQotCi0lewotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0JcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLwotICAgICAgICAgICAgICAgIHp6UmVhZGVyID0gaW47Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gICAgICAgICAgICAgICAgenpTdGF0ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gICAgICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWxpbmUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gICAgICAgICAgICAgICAgeXljaGFyID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHl5Y29sdW1uID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpBdEJPTCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gICAgICAgICAgICAgICAgenpBdEVPRiA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gICAgICAgICAgICAgICAgenpFT0ZEb25lID0gZmFsc2U7Ci0KLQotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKLSAgCQkKLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0JCi0KLSV9Ci0KLSVlb2Z7Ci0JaGFzTW9yZT1mYWxzZTsKLSVlb2Z9Ci0KLSVwdWJsaWMKLSVjbGFzcyBYTUxIZWFkVG9rZW5pemVyCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbgotJXR5cGUgU3RyaW5nCi0lY2hhcgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlIAotLy8lZGVidWcKLSVzd2l0Y2gKLSVidWZmZXIgODE5MgotCi1VVEYxNkJFID0gXHhGRVx4RkYKLVVURjE2TEUgPSBceEZGXHhGRQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGCi0KLVNwYWNlQ2hhciA9IFtceDIwXHgwOV0KLQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsKLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0KLQotQmVnaW5BdHRyaWJlVmFsdWUgPSB7U30qIFw9IHtTfSoKLQotTGluZVRlcm1pbmF0b3IgPSBccnxcbgotCi0KLSVzdGF0ZSBTVF9YTUxEZWNsCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUKLSVzdGF0ZSBEUV9TVFJJTkcKLSVzdGF0ZSBTUV9TVFJJTkcKLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZwotCi0lJQotCi0KLTxZWUlOSVRJQUw+ICAKLXsKLQkvLyBmb3JjZSB0byBzdGFydCBhdCBiZWdpbm5pbmcgb2YgbGluZSAoXikgYW5kIGF0IGJlZ2lubmluZyBvZiBmaWxlICh5eWNoYXIgPT0gMCkKLQlee1VURjE2QkV9ICAgCQl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fX0KLQlee1VURjE2TEV9ICAgCQl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fX0KLQlee1VURjgzQnl0ZUJPTX0gICAJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fX0KLQkKLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcwotCV4ge1N9KiAiPFw/eG1sIiB7U30rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319Ci0JCi19CQotCQotPFNUX1hNTERlY2w+IAotewotCSJ2ZXJzaW9uIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9Ci0JImVuY29kaW5nIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzt9Ci0JLy8gbm90ZSB0aGUgImZvcmNlZCBlbmQiICh2aWEgJ2hhc01vcmU9ZmFsc2UnKSBvbmNlIHRoZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kCi0JLy8gVGhpcyBpcyBzaW5jZSBub24tYXNjaWkgY2hhcnMgbWF5IGZvbGxvdyBhbmQgbWF5IGNhdXNlIElPRXhjZXB0aW9ucyB3aGljaCB3b3VsZCBub3Qgb2NjdXIgb25jZSBzdHJlYW0gaXMgCi0JLy8gcmVhZCB3aXRoIGluY29ycmVjdCBlbmNvZGluZyAoc3VjaCBhcyBpZiBwbGF0Zm9ybSBlbmNvZGluZyBpcyBpbiBlZmZlY3QgdW50aWwgdHJ1ZSBlbmNvZGluZyBkZXRlY3RlZCkuIAotCSJcPz4iICAgIHt5eWJlZ2luKFlZSU5JVElBTCk7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDt9Ci19CQotCi0JCi0KLTxRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4KLXsKLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotCVwnCQkJeyB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQkvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcKLQl7U30qLiAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTt9Ci0KLX0JCi0KLQotPERRX1NUUklORz4KLXsKLQotCVwiICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0KLX0KLQotPFNRX1NUUklORz4KLXsKLQotCVwnICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTt9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiJT4iCQkJeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0KLX0KLQotPFVuRGVsaW1pdGVkU3RyaW5nPgotewotCi0Je1N9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQknPCcJCi0JeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLy8gdGhlc2UgYXJlIGEgYml0IHNwZWNpYWwsIHNpbmNlIHdlIHN0YXJ0ZWQgYW4gdW5kZWxpbWl0IHN0cmluZywgYnV0IGZvdW5kIGEgcXVvdGUgLi4uIHByb2JhYmx5IGluZGljYXRlcyBhIG1pc3NpbmcgYmVnaW5uaW5nIHF1b3RlCi0JXCcJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQlcIgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQotCQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotfQotCi0vLyBUaGUgIm1hdGNoIGFueXRoaW5nIiBydWxlIHNob3VsZCBhbHdheXMgYmUgaW4gZWZmZWN0IGV4Y2VwdCBmb3Igd2hlbiBsb29raW5nIGZvciBlbmQgb2Ygc3RyaW5nCi0vLyAoVGhhdCBpcywgcmVtZW1iZXIgdG8gdXBkYXRlIHN0YXRlIGxpc3QgaWYvd2hlbiBuZXcgc3RhdGVzIGFkZGVkKQotPFlZSU5JVElBTCwgU1RfWE1MRGVjbCwgUXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0vLyB0aGlzIGlzIHRoZSBmYWxsYmFjayAobWF0Y2ggImFueXRoaW5nIikgcnVsZSAgKGZvciB0aGlzIHNjYW5uZXIsIGlucHV0IGlzIGlnbm9yZWQsIGFuZCBwb3NpdGlvbiBhZHZhbmNlZCwgaWYgbm90IHJlY29nbml6ZWQpCi0ufFxuICAgICAgICAgICAgICB7aWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319Ci19Ci0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9Ci0KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzUzMDY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gNC82LzA0IDExOjEzIFBNICovCi0KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5IZWFkUGFyc2VyVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSW50U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gNC82LzA0IDExOjEzIFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNDsKLQotICAvKioKLSAgICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCA2Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcNlwxXDdcMlwwXDFcMTFcMjJcMFwxXDZcMVwwXDFcMjdcMlwwIisKLSAgICAiXDFcMzFcMVwwXDFcMzBcMjRcMFwxXDEyXDFcMTBcMVwyNlwxXDEzXDNcMFwxXDIxIisKLSAgICAiXDFcMjNcMVwxN1wxXDBcMVwyNVwxXDBcMVwyNFwyXDBcMVwxNlwxXDE1XDFcMjAiKwotICAgICJcMVwyMlwxMFwwXDFcMTRcMTJcMFwxXDIxXDFcMjNcMVwxN1wxXDBcMVwyNVwxXDAiKwotICAgICJcMVwyNFwyXDBcMVwxNlwxXDE1XDFcMjBcMVwyMlwxMFwwXDFcMTRcMTAyXDBcMVw0IisKLSAgICAiXDNcMFwxXDVcMTdcMFwxXDNcMTZcMFwxXDFcMjBcMFwxXDNcMTZcMFwxXDEiKwotICAgICJcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCXB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKiAKLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgCQkgKiBmcm9tIGlucHV0IAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0gIAkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotICAJCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50IAotICAJCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLiAKLSAgCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotICAJCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0gIAkJfQotCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0JCi0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMjgpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0KLSAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgCWhhc01vcmU9ZmFsc2U7Ci0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIHl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXG4nOwotICAgICAgaWYgKCF5eV9hdEJPTCAmJiB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdccicpIHsKLSAgICAgICAgeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLSAgICAgICAgaWYgKCF5eV9hdEVPRikgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgaWYgKHl5X2F0Qk9MKQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZV07Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5Y21hcFt5eV9pbnB1dF07Ci0KLSAgICAgICAgICBib29sZWFuIHl5X2lzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB5eV9mb3JOZXh0OiB7IHN3aXRjaCAoeXlfc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHl5X3N0YXRlID0gNDU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA0NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHl5X2lzRmluYWwgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggeXlfbm9Mb29rQWhlYWQgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgICB7ICBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNTU6IGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDU2OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0gICAgICAgIGNhc2UgNTc6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDU5OiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fSB9Ci0gICAgICAgIGNhc2UgNjE6IGJyZWFrOwotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO30gfQotICAgICAgICBjYXNlIDYyOiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9IH0KLSAgICAgICAgY2FzZSA2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9IH0KLSAgICAgICAgY2FzZSA2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9IH0KLSAgICAgICAgY2FzZSA2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7IH0KLSAgICAgICAgY2FzZSA2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSA2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgNjg6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7ICBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyAgfQotICAgICAgICBjYXNlIDY5OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgICAgeyAgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDcwOiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDcxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgNzI6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjsgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqIFJ1bnMgdGhlIHNjYW5uZXIgb24gaW5wdXQgZmlsZXMuCi0gICAqCi0gICAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4KLSAgICogSXQgcHJpbnRzIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mCi0gICAqIGZpbGUgaXMgcmVhY2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJlZC4KLSAgICoKLSAgICogQHBhcmFtIGFyZ3YgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1bgotICAgKiAgICAgICAgICAgICAgIHRoZSBzY2FubmVyIG9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotICAgICAgWE1MSGVhZFRva2VuaXplciBzY2FubmVyID0gbnVsbDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNjYW5uZXIgPSBuZXcgWE1MSGVhZFRva2VuaXplciggbmV3IGphdmEuaW8uRmlsZVJlYWRlcihhcmd2W2ldKSApOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUgXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIFhNTEhlYWRUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci5wcmltR2V0TmV4dFRva2VuKCkpOwotICAgICAgICB9IHdoaWxlICghc2Nhbm5lci55eV9hdEVPRik7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjMWM3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUBlY2hvIG9uDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7RDpcSkRLc1xqMnNkazEuNC4yXzAzXGJpbg0KLXNldCBXT1JLU1BBQ0VfTE9DQVRJT049RDpcYnVpbGRzXFdvcmtzcGFjZXNcV1NXQk04DQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleFxsaWINCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZGlmZmVyIGZyb20gcHJvamVjdCB0byBwcm9qZWN0LCBidXQgc2hvdWxkIGJlIG90aGVyd2lzZSBjb25zdGFudA0KLXNldCBNQUlOX05BTUU9WE1MSGVhZFRva2VuaXplcg0KLQ0KLXJlbSBzZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWxcc3JjXA0KLXJlbSBzZXQgUEFDS0FHRV9ESVI9Y29tXGlibVxzc2VcbW9kZWxceG1sXGVuY29kaW5nXA0KLQ0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWNcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXGVuY29kaW5nXHJlc291cmNlXGNvbnRlbnRzcGVjaWZpY1x4bWxcDQotDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXBhdXNlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTZjMzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1SZWFkaW5nICJYTUxIZWFkVG9rZW5pemVyLmpmbGV4IgotCi1XYXJuaW5nIDogTWFjcm8gIlNwYWNlQ2hhciIgaGFzIGJlZW4gZGVjbGFyZWQgYnV0IG5ldmVyIHVzZWQuCi1Db25zdHJ1Y3RpbmcgTkZBIDogMzU4IHN0YXRlcyBpbiBORkEKLUNvbnZlcnRpbmcgTkZBIHRvIERGQSA6IAotLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotNzkgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDU0IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIlhNTEhlYWRUb2tlbml6ZXIuamF2YSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvb2xkWE1MSGVhZFRva2VuaXplci5za2VsZXRvbiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvb2xkWE1MSGVhZFRva2VuaXplci5za2VsZXRvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwOTYwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL29sZFhNTEhlYWRUb2tlbml6ZXIuc2tlbGV0b24KKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotDQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8NCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7DQotDQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8NCi0tLS0gIGxleGljYWwgc3RhdGVzLCBjaGFybWFwDQotDQotICAvKiBlcnJvciBjb2RlcyAqLw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOw0KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsNCi0NCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsNCi0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAkJLy8kTk9OLU5MUy0xJA0KLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQNCi0gIH07DQotDQotLS0tIGlzRmluYWwgbGlzdA0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOw0KLQ0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOw0KLQ0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7DQotDQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7DQotDQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOw0KLQ0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsNCi0NCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsNCi0NCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0gICAgICBmcm9tIGlucHV0ICovDQotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOw0KLQ0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOw0KLQ0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOw0KLQ0KLSAgDQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOw0KLQ0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotDQotDQotLS0tIHVzZXIgY2xhc3MgY29kZQ0KLQ0KLSAgLyoqDQotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXINCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4NCi0gICAqDQotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4NCi0gICAqLw0KLS0tLSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbg0KLQ0KLQ0KLSAgLyoqDQotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4NCi0gICAqDQotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUNCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLg0KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3Vycw0KLSAgICovDQotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLQ0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOw0KLQ0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIA0KLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsNCi0NCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovDQotDQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovDQotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7DQotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgDQotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOw0KLQ0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovDQotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOw0KLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9zdGFydFJlYWQgPSAwOw0KLSAgICB9DQotDQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8NCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgew0KLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLw0KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOw0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOw0KLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsNCi0gICAgfQ0KLQ0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8NCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsNCi0NCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOw0KLQ0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsNCi0NCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOw0KLSAgfQ0KLQ0KLSAgICANCi0gIC8qKg0KLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7DQotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLw0KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8NCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgew0KLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUNCi0gICAqDQotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7DQotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4NCi0gICAqLw0KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7DQotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOw0KLSAgfQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7DQotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbg0KLSAgICoNCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5DQotICAgKi8NCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgew0KLSAgICB0cnkgew0KLSAgICAgIC8vTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsNCi0JU3lzdGVtLm91dC5wcmludGxuKCJTY2FuRXJyb3I6ICIgKyBlcnJvckNvZGUgKyAiOiAiICsgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOw0KLSAgICB9DQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLSAgICAgIC8vTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7DQotCVN5c3RlbS5vdXQucHJpbnRsbigiU2NhbkVycm9yOiAiICsgZXJyb3JDb2RlICsgIjogIiArIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7DQotICAgfQ0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3INCi0gICAgLy8gU3lzdGVtLmV4aXQoMSk7DQotICB9IA0KLQ0KLQ0KLSAgLyoqDQotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4NCi0gICAqDQotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kDQotICAgKg0KLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uDQotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSENCi0gICAqLw0KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgew0KLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQ0KLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsNCi0NCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsNCi0gIH0NCi0NCi0NCi0tLS0geXlfZG9Fb2YNCi0gIC8qKg0KLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwNCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4NCi0gICAqDQotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLS0tLSB5eWxleCBkZWNsYXJhdGlvbg0KLSAgICBpbnQgeXlfaW5wdXQ7DQotICAgIGludCB5eV9hY3Rpb247DQotDQotLS0tIGxvY2FsIGRlY2xhcmF0aW9ucw0KLQ0KLSAgICB3aGlsZSAodHJ1ZSkgew0KLQ0KLS0tLSBzdGFydCBhZG1pbiAobGluZSwgY2hhciwgY29sIGNvdW50KQ0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOw0KLQ0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7DQotDQotLS0tIHN0YXJ0IGFkbWluIChsZXhzdGF0ZSBldGMpDQotDQotICAgICAgeXlfZm9yQWN0aW9uOiB7DQotICAgICAgICB3aGlsZSAodHJ1ZSkgew0KLSAgICANCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7DQotDQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247DQotDQotLS0tIGxpbmUsIGNvbCwgY2hhciBjb3VudCwgbmV4dCB0cmFuc2l0aW9uLCBpc0ZpbmFsIGFjdGlvbg0KLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyANCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyANCi0tLS0gbGluZSBjb3VudCB1cGRhdGUNCi0gICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfQ0KLSAgICAgIH0NCi0NCi0tLS0gY2hhciBjb3VudCB1cGRhdGUNCi0NCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICANCi0NCi0tLS0gYWN0aW9ucw0KLSAgICAgICAgZGVmYXVsdDogDQotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgew0KLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsNCi0tLS0gZW9mdmFsdWUNCi0gICAgICAgICAgfSANCi0gICAgICAgICAgZWxzZSB7DQotLS0tIG5vIG1hdGNoDQotICAgICAgICAgIH0NCi0gICAgICB9DQotICAgIH0NCi0gIH0gICAgDQotDQotLS0tIG1haW4NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL0NTU1Rva2VuaXplci5qZmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMjY5YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL0NTU1Rva2VuaXplci5qZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLypubHNYWFgqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuQ1NTVGV4dFJlZ2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOw0KLQ0KLSUlDQotDQotJXB1YmxpYw0KLSVjbGFzcyBDU1NUb2tlbml6ZXINCi0laW1wbGVtZW50cyBDU1NSZWdpb25Db250ZXh0cywgSUNTU1Rva2VuaXplcg0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0ldW5pY29kZQ0KLSVjYXNlbGVzcw0KLS8vJWRlYnVnDQotJXBhY2sNCi0NCi0lew0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7DQotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydDsNCi0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7DQotLy8JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkJ1ZmZlcmVkVGV4dCA9IG51bGw7DQotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOw0KLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9OT1JNQUwgPSAxNjM4NDsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7DQotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsNCi0NCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgew0KLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgew0KLQkJZkluaXRpYWxCdWZmZXJTaXplID0gc2l6ZTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQ7DQotCQlTdHJpbmcgbmV4dFRva2VuVHlwZTsNCi0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOw0KLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsNCi0JCWludCBzdGFydDsNCi0JCWludCB0ZXh0TGVuZ3RoOw0KLQkJaW50IGxlbmd0aDsNCi0JCWlmIChmQnVmZmVyZWRDb250ZXh0ICE9IG51bGwpIHsNCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0Ow0KLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsNCi0NCi0JCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0vLwkJCXRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQlzdGFydCA9IHl5Y2hhcjsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCX0NCi0NCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsNCi0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsNCi0JCQkJLy8gdW5kZWYgLT4gY29uY2F0ZW5hdGUgdW5kZWYncw0KLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSA9PSBVTkRFRklORUQpIHsNCi0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCX0NCi0JCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7DQotLy8JCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsNCi0JCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsNCi0JCQkJc3BhY2VGb2xsb3dzID0gZmFsc2U7DQotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoY29udGV4dCkpIHsgLy8gZGVjbGFyYXRpb24gdmFsdWUgY2FuIGNvbnRhaW4gVkFMVUVfUw0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19ERUNMQVJBVElPTl9WQUxVRV9TKTsNCi0JCQkJfSBlbHNlIGlmIChjYW5Db250YWluU3BhY2UoY29udGV4dCkpIHsNCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfUyk7DQotCQkJCX0NCi0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkDQotCQkJCQlpZiAoc3BhY2VGb2xsb3dzKSB7DQotCQkJCQkJLy8gbmV4dCBpcyBzcGFjZSAtPiBhcHBlbmQNCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsNCi0JCQkJCQlsZW5ndGggKz0geXlsZW5ndGgoKTsNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYNCi0JCQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0vLwkJCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsNCi0JCQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgew0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgew0KLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047DQotCQkJfQ0KLQkJCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7DQotCQl9IGVsc2Ugew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLSAgCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovDQotICAJcHVibGljIGZpbmFsIExpc3QgcGFyc2VUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gIAkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotICAJCUNTU1RleHRUb2tlbiB0b2tlbjsNCi0JCWZvciAoU3RyaW5nIGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCk7IGtpbmQgIT0gbnVsbDsga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKSkgew0KLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOw0KLQkJCXRva2VuLmtpbmQgPSBraW5kOyAgCQkJCQ0KLQkJCXRva2VuLnN0YXJ0ID0geXljaGFyOw0KLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJdG9rZW4uaW1hZ2UgPSB5eXRleHQoKTsNCi0JCQl0b2tlbnMuYWRkKHRva2VuKTsNCi0JCX0NCi0NCi0gIAkJcmV0dXJuIHRva2VuczsNCi0gIAl9DQotICAJDQotICAJLyogdXNlciBtZXRob2QgKi8NCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7DQotICAJCWlmICh0eXBlID09IENTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgew0KLSAgCQkJcmV0dXJuIGZhbHNlOw0KLSAgCQl9IGVsc2Ugew0KLSAgCQkJcmV0dXJuIHRydWU7DQotICAJCX0NCi0gIAl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgew0KLQkJcmV0dXJuIHl5Y2hhcjsNCi0JfQ0KLQkNCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7DQotCQlyZXR1cm4genpBdEVPRjsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7DQotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLw0KLQkJenpSZWFkZXIgPSBpbjsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotCQl6elN0YXRlID0gMDsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotCQl6ekxleGljYWxTdGF0ZSA9IGZJbml0aWFsU3RhdGU7IC8vWVlJTklUSUFMOw0KLQ0KLQkJLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0JCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JCWlmICh6ekJ1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7DQotCQkJenpCdWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOw0KLQkJfQ0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsNCi0NCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLQkJenpNYXJrZWRQb3MgPSAwOw0KLQ0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotLy8JCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0JCXp6Q3VycmVudFBvcyA9IDA7DQotDQotCQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotCQl6elN0YXJ0UmVhZCA9IDA7DQotDQotCQkvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotCQkJZnJvbSBpbnB1dCAqLw0KLQkJenpFbmRSZWFkID0gMDsNCi0NCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5bGluZSA9IDA7DQotDQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCQl5eWNoYXIgPSAwOw0KLQ0KLQkJLyoqDQotCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgDQotCQkgKiBtYXRjaGVkIHRleHQNCi0JCSAqLw0KLS8vCQl5eWNvbHVtbiA9IDA7IA0KLQ0KLQkJLyoqIA0KLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lDQotCQkgKi8NCi0vLwkJeXlfYXRCT0wgPSBmYWxzZTsNCi0JCQ0KLQkJLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLQkJenpBdEVPRiA9IGZhbHNlOw0KLQ0KLQkJLyogdXNlciB2YXJpYWJsZXMgKi8NCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgQ1NTVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkZWQgdG8gd29ya2Fyb3VuZCBzdHJpY3RlciBjb21waWxhdGlvbiBvcHRpb25zIHdpdGhvdXQgY3JlYXRpbmcNCi0JICogYW4gYWx0ZXJuYXRlIHNrZWxldG9uIGZpbGUNCi0JICovDQotCXZvaWQgX3VzZVByaXZhdGVzKCkgew0KLQkJU3lzdGVtLm91dC5wcmludCh5eWNvbHVtbik7DQotCQlTeXN0ZW0ub3V0LnByaW50KHl5bGluZSk7DQotCQlTeXN0ZW0ub3V0LnByaW50KEJvb2xlYW4udG9TdHJpbmcoenpBdEJPTCkpOw0KLQl9DQotJX0NCi0NCi0lc3RhdGUgU1RfQ0hBUlNFVF9OQU1FDQotJXN0YXRlIFNUX0NIQVJTRVRfREVMSU1JVEVSDQotJXN0YXRlIFNUX0lNUE9SVF9VUkkNCi0lc3RhdGUgU1RfSU1QT1JUX01FRElVTQ0KLSVzdGF0ZSBTVF9JTVBPUlRfREVMSU1JVEVSDQotJXN0YXRlIFNUX01FRElBX01FRElVTQ0KLSVzdGF0ZSBTVF9NRURJQV9ERUxJTUlURVINCi0lc3RhdGUgU1RfUEFHRV9QU0VVRE9fUEFHRQ0KLSVzdGF0ZSBTVF9QQUdFX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSDQotJXN0YXRlIFNUX1NFTEVDVE9SDQotJXN0YXRlIFNUX1NFTEVDVE9SX01PRElGSUVSDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORA0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1INCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFDQotDQotaCA9IFswLTlhLWZdDQotbm9uYXNjaWkgPSBbXHUwMDgwLVx1ZmZmZl0NCi11bmljb2RlID0gXFx7aH17MSw2fVsgXHRcclxuXGZdPw0KLWVzY2FwZSA9IHt1bmljb2RlfXxcXFsgLX5cdTAwODAtXHVmZmZmXQ0KLQ0KLQ0KLQ0KLW5tc3RhcnQgPSBbX2EtekEtWl18e25vbmFzY2lpfXx7ZXNjYXBlfQ0KLW5tY2hhciA9IFtfYS16QS1aMC05LV18e25vbmFzY2lpfXx7ZXNjYXBlfQ0KLXN0cmluZzEgPSBcIihbXHQgISMkJSYoLX5dfFxce25sfXxcJ3x7bm9uYXNjaWl9fHtlc2NhcGV9KSpcIg0KLXN0cmluZzIgPSBcJyhbXHQgISMkJSYoLX5dfFxce25sfXxcInx7bm9uYXNjaWl9fHtlc2NhcGV9KSpcJw0KLQ0KLWlkZW50ID0gLT97bm1zdGFydH17bm1jaGFyfSoNCi12YWx1ZV9pZGVudCA9IC0/e25tc3RhcnR9Ii4iPyh7bm1jaGFyfSsiLiI/KSoNCi0NCi1uYW1lID0ge25tY2hhcn0rDQotbnVtID0gWystXT8oWzAtOV0rfFswLTldKiIuIlswLTldKykNCi1zdHJpbmcgPSB7c3RyaW5nMX18e3N0cmluZzJ9DQotdXJsID0gKFsgISMkJSYqLX5dfHtub25hc2NpaX18e2VzY2FwZX0pKg0KLXMgPSBbIFx0XHJcblxmXQ0KLXcgPSB7c30qDQotbmwgPSBcbnxcclxufFxyfFxmDQotDQotLy9yYW5nZSA9IFw/ezEsNn18e2h9KFw/ezAsNX18e2h9KFw/ezAsNH18e2h9KFw/ezAsM318e2h9KFw/ezAsMn18e2h9KFw/P3x7aH0pKSkpKQ0KLQ0KLWhhc2ggPSAiIyJ7bmFtZX0NCi11cmkgPSAoInVybCgie3d9e3N0cmluZ317d30iKSJ8InVybCgie3d9e3VybH17d30iKSIpDQotZnVuY3Rpb24gPSB7aWRlbnR9IigiDQotdW5pY29kZV9yYW5nZSA9ICJVIlwrWzAtOWEtZkEtRj9dezEsNn0oIi0iWzAtOWEtZkEtRj9dezEsNn0pPw0KLQ0KLSUlDQotDQotLyoNCi0gKiAqKiogZ2xvYmFsICoqKg0KLSAqLw0KLQ0KLXtzfSsgeyByZXR1cm4gQ1NTX1M7IH0NCi0iPCEtLSIgeyByZXR1cm4gQ1NTX0NETzsgfQ0KLSItLT4iIHsgcmV0dXJuIENTU19DREM7IH0NCi0ifSIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOyB9DQotXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvIHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotDQotLy88WVlJTklUSUFMPiB7DQotLy8JIkBpbXBvcnQiIHsJeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7IH0NCi0vL30NCi0NCi0vKg0KLSAqICoqKiBjaGFyc2V0IHJ1bGUgKioqDQotICogQ0hBUlNFVF9TWU0gUyogU1RSSU5HIFMqICc7Jw0KLSAqLw0KLQ0KLSJAY2hhcnNldCIgeyB5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7IHJldHVybiBDU1NfQ0hBUlNFVDsgfQ0KLQ0KLTxTVF9DSEFSU0VUX05BTUU+IHsNCi0Je3N0cmluZ30geyB5eWJlZ2luKFNUX0NIQVJTRVRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19TVFJJTkc7IH0NCi19DQotDQotPFNUX0NIQVJTRVRfREVMSU1JVEVSPiB7DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotLyoNCi0gKiAqKiogaW1wb3J0IHJ1bGUgKioqDQotICogSU1QT1JUX1NZTSBTKiBbU1RSSU5HfFVSSV0gUyogWyBtZWRpdW0gWyBDT01NQSBTKiBtZWRpdW1dKiBdPyAnOycgUyoNCi0gKi8NCi0NCi0iQGltcG9ydCIgeyB5eWJlZ2luKFNUX0lNUE9SVF9VUkkpOyByZXR1cm4gQ1NTX0lNUE9SVDsgfQ0KLQ0KLTxTVF9JTVBPUlRfVVJJPiB7DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19TVFJJTkc7IH0NCi0JLy8JInVybCgie3d9e3N0cmluZ317d30iKSIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQkvLwkidXJsKCJ7d317dXJsfXt3fSIpIiB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCXt1cml9IHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLX0NCi0NCi08U1RfSU1QT1JUX01FRElVTT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9JTVBPUlRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07IH0NCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLX0NCi0NCi08U1RfSU1QT1JUX0RFTElNSVRFUj4gew0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotCSIsIiB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIG1lZGlhIHJ1bGUgKioqDQotICogTUVESUFfU1lNIFMqIG1lZGl1bSBbIENPTU1BIFMqIG1lZGl1bSBdKiBMQlJBQ0UgUyogcnVsZXNldCogJ30nIFMqDQotICovDQotDQotIkBtZWRpYSIgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUE7IH0NCi0NCi0vKiANCi0gKiBtZWRpdW0NCi0gKiBJREVOVCBTKg0KLSAqLw0KLTxTVF9NRURJQV9NRURJVU0+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07IH0NCi19DQotDQotPFNUX01FRElBX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotCSIsIiB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7IH0NCi19DQotDQotLyoNCi0gKiAqKiogcGFnZSBydWxlICoqDQotICogUEFHRV9TWU0gUyogcHNldWRvX3BhZ2U/IFMqIExCUkFDRSBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiBdKiAnfScgUyoNCi0gKi8NCi0NCi0iQHBhZ2UiIHsgeXliZWdpbihTVF9QQUdFX1BTRVVET19QQUdFKTsgcmV0dXJuIENTU19QQUdFOyB9DQotIA0KLS8qDQotICogcHNldWRvX3BhZ2UNCi0gKiAnOicgSURFTlQNCi0gKi8NCi0NCi08U1RfUEFHRV9QU0VVRE9fUEFHRT4gew0KLQkiOiI/e2lkZW50fSB7IHl5YmVnaW4oU1RfUEFHRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1BBR0VfU0VMRUNUT1I7IH0NCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLTxTVF9QQUdFX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBmb250LWZhY2UNCi0gKiBGT05UX0ZBQ0VfU1lNIFMqICd7JyBTKiBkZWNsYXJhdGlvbiBbICc7JyBTKiBkZWNsYXJhdGlvbiAnKiAnfScgUyoNCi0gKi8NCi0NCi0iQGZvbnQtZmFjZSIgeyB5eWJlZ2luKFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX0ZPTlRfRkFDRTsgfQ0KLQ0KLTxTVF9GT05UX0ZBQ0VfREVMSU1JVEVSPiB7DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi0vKg0KLSAqIHNlbGVjdG9yDQotICogc2ltcGxlX3NlbGVjdG9yIFsgY29tYmluYXRvciBzaW1wbGVfc2VsZWN0b3IgXSoNCi0gKi8NCi0NCi0vKg0KLSAqIHNpbXBsZV9zZWxlY3Rvcg0KLSAqIGVsZW1lbnRfbmFtZSBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyBdKiB8IFsgSEFTSCB8IGNsYXNzIHwgYXR0cmliIHwgcHNldWRvIF0rDQotICovDQotDQotPFlZSU5JVElBTCwgU1RfU0VMRUNUT1JfTU9ESUZJRVIsIFNUX1NFTEVDVE9SPiB7DQotCSIqIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTDsgfQ0KLQl7aGFzaH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9JRDsgfQ0KLS8vCSI6IntpZGVudH0oIigie3N9KntpZGVudH17c30qIikiKT8geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87IH0NCi0JIjoiKHtpZGVudH0oIigie3N9KntpZGVudH17c30qIikiKT8pPyB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsgfQ0KLQkiLiJ7bmFtZX0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DTEFTUzsgfQ0KLQkiWyIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQ7IH0NCi19DQotDQotPFlZSU5JVElBTCwgU1RfU0VMRUNUT1I+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfTU9ESUZJRVI+IHsNCi0JIiwiIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfU0VQQVJBVE9SOyB9DQotCS8vIHVzaW5nIExPT0tBSEVBRA0KLQl7c30rL1teKz5ceywvXSB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7IH0NCi0JIisifCI+IiB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7IH0NCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLS8qDQotICogYXR0cmliDQotICogJ1snIFMqIElERU5UIFMqIFsgWyAnPScgfCBJTkNMVURFUyB8IERBU0hNQVRDSCBdIFMqIFsgSURFTlQgfCBTVFJJTkcgXSBTKiBdPyAnXScNCi0gKi8NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUU+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SPiB7DQotCSI9Inwifj0ifCJ8PSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SOyB9DQotCSJdIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRT4gew0KLQl7aWRlbnR9fHtzdHJpbmd9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ+IHsNCi0JIl0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsgfQ0KLX0NCi0NCi0vKg0KLSAqIGRlY2xhcmF0aW9uDQotICogcHJvcGVydHkgJzonIFMqIGV4cHIgcHJpbz8gfCAvLyBlbXB0eSAvLw0KLSAqLw0KLQ0KLTxTVF9ERUNMQVJBVElPTj4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZOyB9DQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1I+IHsNCi0JIjoiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUjsgfQ0KLX0NCi0NCi08U1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFLCBTVF9ERUNMQVJBVElPTl9WQUxVRT4gew0KLQkiISJ7c30qImltcG9ydGFudCIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQ7IH0NCi0JDQotCQ0KLQkiKSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsgfQ0KLQkNCi0JLy8gb3JkZXJlZCBmb2xsb3dpbmcgdHdvIHJ1bGVzIGRlbGliZXJhdGVseSwgc2VlIA0KLQkvLyAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyOTkwMg0KLQl7bnVtfXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047IH0NCi0Je3ZhbHVlX2lkZW50fSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UOyB9DQotDQotDQotCXtudW19IiUiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRTsgfQ0KLQkJDQotCXtudW19IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOyB9DQotCQ0KLQkNCi0JDQotCXtmdW5jdGlvbn0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsgfQ0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORzsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSTsgfQ0KLQkiIyJ7bmFtZX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIOyB9DQotCXt1bmljb2RlX3JhbmdlfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7IH0NCi0JWywvXSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOyB9DQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9WQUxVRT4gew0KLQl7c30rL1teO31dIHsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TOyB9DQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTiwgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SLCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUsIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCSI7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsgfQ0KLQkvLwkifSIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOyB9DQotfQ0KLQ0KLQ0KLS8vPFlZSU5JVElBTCwgU1RfSU1QT1JUX1VSSSwgU1RfSU1QT1JUX01FRElVTSwgU1RfSU1QT1JUX0RFTElNSVRFUj4gew0KLS8vCVwvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLyB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLS8vCXtzfSsgeyByZXR1cm4gQ1NTX1M7IH0NCi0vLwkuIHsgcmV0dXJuIFVOREVGSU5FRDsgfQ0KLS8vfQ0KLQ0KLS8vPFlZSU5JVElBTCwgU1RfSU1QT1JUX1VSSSwgU1RfSU1QT1JUX01FRElVTSwgU1RfSU1QT1JUX0RFTElNSVRFUj4gew0KLS8vCVteIFx0XHJcblxmXSsgeyByZXR1cm4gQ1NTX1VOS05PV047IH0NCi0vL30NCi0NCi0uIHsNCi0JcmV0dXJuIFVOREVGSU5FRDsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzlhZTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9mbGV4LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQGVjaG8gb2ZmDQotc2V0IEpBVkFfSE9NRT1kOlxqZGs2XzAzDQotc2V0IEpGTEVYX0hPTUU9RDpcSkZsZXhcamZsZXgtMS40LjINCi0NCi0lSkFWQV9IT01FJVxiaW5camF2YSAtWG14NDcwTSAtamFyICVKRkxFWF9IT01FJVxsaWJcSkZsZXguamFyIENTU1Rva2VuaXplci5qZmxleA0KLW1vdmUgQ1NTVG9rZW5pemVyLmphdmEgLi5cLi5cLi5cLi5cLi5cb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlXHNyY1xvcmdcZWNsaXBzZVx3c3RcY3NzXGNvcmVcaW50ZXJuYWxccGFyc2VyXCAmJiBkZWwgQ1NTVG9rZW5pemVyLmphdmEqDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9SRUFETUUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4MjBlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotZGV2ZWwgICAgIC0gdGhlIGFjdGl2ZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCAoc2FucyBKREspDQotICAgICAgICAgICAgLSBsYXRlc3QgdmVyc2lvbiBvZiBIVE1MVG9rZW5pemVyIHNwZWNpZmljYXRpb24gYW5kIGdlbmVyYXRlZCBjb2RlDQotICAgICAgICAgICAgLSBtb2RpZmllZCBza2VsZXRvbiB0byBwcmV2ZW50IFZNIGV4aXRzIG9uIHVubWF0Y2hlZCBpbnB1dA0KLSAgICAgICAgICAgIC0gImZsZXgiIHNjcmlwdHMgdG8gcnVuIEpGbGV4IHdpdGggbW9kaWZpZWQgc2tlbGV0b24NCi0gICAgICAgICAgICAtIGFjdGl2ZSBSQ1MgYXJjaGl2ZQ0KLXJlc291cmNlcyAtIGJhY2t1cC9wcmlzdGluZSByZXNvdXJjZXMNCi0gICAgICAgICAgICAtIFVubW9kaWZpZWQgSkZsZXggMS4yLjIgZG93bmxvYWQNCi0gICAgICAgICAgICAtIFNlcGFyYXRlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIEpGbGV4IHNrZWxldG9uDQotICAgICAgICAgICAgLSBXM0MgWE1MIHJlY29tbWVuZGF0aW9uIHVzZWQgZm9yIHNldmVyYWwgb2YgdGhlIEhUTUxUb2tlbml6ZXIgcnVsZXMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyNDQ3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzOCArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxMC8yNC8wNyA1OjE2IEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuSW50U3RhY2s7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMTAvMjQvMDcgNToxNiBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEpTUFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01KU1BSZWdpb25Db250ZXh0cyB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfRFFVT1RFUyA9IDUxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX1NRVU9URVMgPSA1MDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9TUVVPVEVTX0VORCA9IDUyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfU1FVT1RFU19FTkQgPSA0NTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX0RRVU9URVMgPSA0NDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMID0gNDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0JMT0NLX1RBR19TQ0FOID0gMzY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9TUVVPVEVTID0gNDM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9UQUdfQ0xPU0UgPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEID0gNDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUgPSAyNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTCA9IDQ5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfU1FVT1RFRF9WQkwgPSA1NTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEID0gNDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDIzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMjQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUgPSAxOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0NPTlRFTlQgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMzE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gMzI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUyA9IDIwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX0RRVU9URVNfRU5EID0gNTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9EUVVPVEVEX0VMID0gNDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OID0gMjg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX0VORCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfVEVYVCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAzMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04gPSAzNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX0RRVU9URVNfRU5EID0gNDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9TUVVPVEVEX0VMID0gNDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT01NRU5UX0VORCA9IDM5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDM1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMgPSAzMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RRVU9URURfVkJMID0gNTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0FCT1JUX0VNQkVEREVEID0gMzc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEID0gMjk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT01NRU5UID0gMzg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTiA9IDM3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSSA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX05BTUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1RBR19OQU1FID0gMjI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9UQUdfQ0xPU0UgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlQgPSAzOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDVcMVwyNlwyXDBcMVwxN1wyMlwwXDFcMTdcMVwyNVwxXDEyXDFcNjUiKwotICAgICJcMVwxNVwxXDIyXDFcMTNcMVwxNFwxXDI0XDFcMjRcMVwyNFwxXDI0XDFcMjRcMVw3IisKLSAgICAiXDFcNlwxXDNcMTJcMjBcMVwxMVwxXDcyXDFcMVwxXDUxXDFcMlwxXDRcMVwyMSIrCi0gICAgIlwxXDQwXDFcNzNcMVwzNlwxXDM3XDFcNTVcMVw3MFwxXDYyXDFcNjJcMVw2M1wxXDYyIisKLSAgICAiXDFcNjJcMVwzM1wxXDMxXDFcNjRcMVw1MlwxXDU0XDFcNjJcMVw2N1wxXDY2XDFcNDEiKwotICAgICJcMVw3MVwyXDYyXDFcMjdcMVw1M1wxXDYyXDFcMzVcMVwxMDRcMVwyM1wxXDBcMVwxMCIrCi0gICAgIlwxXDBcMVw1N1wxXDEwM1wxXDc0XDFcNjBcMVw0M1wxXDcwXDFcNzVcMVwxMDZcMVw0NiIrCi0gICAgIlwxXDEwMFwxXDYyXDFcMzRcMVwzMlwxXDUwXDFcNDdcMVwxMDFcMVw2MlwxXDQ0XDFcNDUiKwotICAgICJcMVw1NlwxXDEwMlwxXDQyXDFcNjJcMVwzMFwxXDYxXDFcNjJcMVwxNlwxXDBcMVwxMDUiKwotICAgICJcNzFcMFwxXDc3XDEwXDBcMjdcNzZcMVwwXDM3XDc2XDFcMFw3Mlw3NlwyXDBcMTNcNzYiKwotICAgICJcMlwwXDEwXDc2XDFcMFw2NVw3NlwxXDBcMTA0XDc2XDExXDBcNDRcNzZcM1wwXDJcNzYiKwotICAgICJcNFwwXDM2XDc2XDcwXDBcMTMxXDc2XDIyXDBcN1w3NlwxNlwwXDJcNzdcNTZcMFwxMDZcNzciKwotICAgICJcMzJcMFwyXDc3XDQ0XDBcMVw3NlwxXDc3XDNcNzZcMVwwXDFcNzZcMVwwXDI0XDc2IisKLSAgICAiXDFcMFw1NFw3NlwxXDBcN1w3NlwzXDBcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NiIrCi0gICAgIlwxXDBcMVw3NlwxXDBcMjJcNzZcMTVcMFwxNFw3NlwxXDBcMTAyXDc2XDFcMFwxNFw3NiIrCi0gICAgIlwxXDBcNDRcNzZcMVwwXDRcNzdcMTFcMFw2NVw3NlwyXDBcMlw3NlwyXDBcMlw3NiIrCi0gICAgIlwzXDBcMzRcNzZcMlwwXDEwXDc2XDJcMFwyXDc2XDY3XDBcNDZcNzZcMlwwXDFcNzYiKwotICAgICJcN1wwXDQ2XDc2XDEyXDBcMjFcNzdcMVwwXDI3XDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwyXDc3XDFcMFwxXDc3XDEzXDBcMzNcNzZcNVwwXDNcNzZcNTZcMFwzMlw3NiIrCi0gICAgIlw1XDBcMVw3N1wxMlw3NlwxMFw3N1wxNVwwXDEyXDc3XDZcMFwxXDc3XDEwN1w3NlwyXDAiKwotICAgICJcNVw3NlwxXDBcMTdcNzZcMVwwXDRcNzZcMVwwXDFcNzZcMTdcNzdcMlw3NlwyXDc3IisKLSAgICAiXDFcMFw0XDc3XDJcMFwxMlw3N1x1MDIwN1wwXDNcNzdcMVwwXDY1XDc2XDJcMFwxXDc3IisKLSAgICAiXDFcNzZcMjBcNzdcM1wwXDRcNzdcM1wwXDEyXDc2XDJcNzdcMlwwXDEyXDc3XDIxXDAiKwotICAgICJcM1w3N1wxXDBcMTBcNzZcMlwwXDJcNzZcMlwwXDI2XDc2XDFcMFw3XDc2XDFcMCIrCi0gICAgIlwxXDc2XDNcMFw0XDc2XDJcMFwxXDc3XDFcMFw3XDc3XDJcMFwyXDc3XDJcMCIrCi0gICAgIlwzXDc3XDExXDBcMVw3N1w0XDBcMlw3NlwxXDBcM1w3NlwyXDc3XDJcMFwxMlw3NyIrCi0gICAgIlwyXDc2XDIwXDBcMVw3N1wyXDBcNlw3Nlw0XDBcMlw3NlwyXDBcMjZcNzZcMVwwIisKLSAgICAiXDdcNzZcMVwwXDJcNzZcMVwwXDJcNzZcMVwwXDJcNzZcMlwwXDFcNzdcMVwwIisKLSAgICAiXDVcNzdcNFwwXDJcNzdcMlwwXDNcNzdcMTNcMFw0XDc2XDFcMFwxXDc2XDdcMCIrCi0gICAgIlwxMlw3N1wyXDc3XDNcNzZcMTRcMFwzXDc3XDFcMFw3XDc2XDFcMFwxXDc2XDFcMCIrCi0gICAgIlwzXDc2XDFcMFwyNlw3NlwxXDBcN1w3NlwxXDBcMlw3NlwxXDBcNVw3NlwyXDAiKwotICAgICJcMVw3N1wxXDc2XDEwXDc3XDFcMFwzXDc3XDFcMFwzXDc3XDIyXDBcMVw3Nlw1XDAiKwotICAgICJcMTJcNzdcMjFcMFwzXDc3XDFcMFwxMFw3NlwyXDBcMlw3NlwyXDBcMjZcNzZcMVwwIisKLSAgICAiXDdcNzZcMVwwXDJcNzZcMlwwXDRcNzZcMlwwXDFcNzdcMVw3Nlw2XDc3XDNcMCIrCi0gICAgIlwyXDc3XDJcMFwzXDc3XDEwXDBcMlw3N1w0XDBcMlw3NlwxXDBcM1w3Nlw0XDAiKwotICAgICJcMTJcNzdcMjJcMFwyXDc3XDFcMFw2XDc2XDNcMFwzXDc2XDFcMFw0XDc2XDNcMCIrCi0gICAgIlwyXDc2XDFcMFwxXDc2XDFcMFwyXDc2XDNcMFwyXDc2XDNcMFwzXDc2XDNcMCIrCi0gICAgIlwxMFw3NlwxXDBcM1w3Nlw0XDBcNVw3N1wzXDBcM1w3N1wxXDBcNFw3N1wxMVwwIisKLSAgICAiXDFcNzdcMTdcMFwxMVw3N1wyMVwwXDNcNzdcMVwwXDEwXDc2XDFcMFwzXDc2XDFcMCIrCi0gICAgIlwyN1w3NlwxXDBcMTJcNzZcMVwwXDVcNzZcNFwwXDdcNzdcMVwwXDNcNzdcMVwwIisKLSAgICAiXDRcNzdcN1wwXDJcNzdcMTFcMFwyXDc2XDRcMFwxMlw3N1wyMlwwXDJcNzdcMVwwIisKLSAgICAiXDEwXDc2XDFcMFwzXDc2XDFcMFwyN1w3NlwxXDBcMTJcNzZcMVwwXDVcNzZcNFwwIisKLSAgICAiXDdcNzdcMVwwXDNcNzdcMVwwXDRcNzdcN1wwXDJcNzdcN1wwXDFcNzZcMVwwIisKLSAgICAiXDJcNzZcNFwwXDEyXDc3XDIyXDBcMlw3N1wxXDBcMTBcNzZcMVwwXDNcNzZcMVwwIisKLSAgICAiXDI3XDc2XDFcMFwyMFw3Nlw0XDBcNlw3N1wyXDBcM1w3N1wxXDBcNFw3N1wxMVwwIisKLSAgICAiXDFcNzdcMTBcMFwyXDc2XDRcMFwxMlw3N1wyMjFcMFw1Nlw3NlwxXDBcMVw3NlwxXDc3IisKLSAgICAiXDJcNzZcN1w3N1w1XDBcNlw3NlwxXDc3XDEwXDc3XDFcMFwxMlw3N1w0N1wwXDJcNzYiKwotICAgICJcMVwwXDFcNzZcMlwwXDJcNzZcMVwwXDFcNzZcMlwwXDFcNzZcNlwwXDRcNzYiKwotICAgICJcMVwwXDdcNzZcMVwwXDNcNzZcMVwwXDFcNzZcMVwwXDFcNzZcMlwwXDJcNzYiKwotICAgICJcMVwwXDJcNzZcMVwwXDFcNzZcMVw3N1wyXDc2XDZcNzdcMVwwXDJcNzdcMVw3NiIrCi0gICAgIlwyXDBcNVw3NlwxXDBcMVw3N1wxXDBcNlw3N1wyXDBcMTJcNzdcNzZcMFwyXDc3IisKLSAgICAiXDZcMFwxMlw3N1wxM1wwXDFcNzdcMVwwXDFcNzdcMVwwXDFcNzdcNFwwXDJcNzciKwotICAgICJcMTBcNzZcMVwwXDQxXDc2XDdcMFwyNFw3N1wxXDBcNlw3N1w0XDBcNlw3N1wxXDAiKwotICAgICJcMVw3N1wxXDBcMjVcNzdcM1wwXDdcNzdcMVwwXDFcNzdcMzQ2XDBcNDZcNzZcMTJcMCIrCi0gICAgIlw0N1w3NlwxMVwwXDFcNzZcMVwwXDJcNzZcMVwwXDNcNzZcMVwwXDFcNzZcMVwwIisKLSAgICAiXDJcNzZcMVwwXDVcNzZcNTFcMFwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDEzXDAiKwotICAgICJcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NlwzXDBcMlw3NlwzXDBcMVw3Nlw1XDAiKwotICAgICJcM1w3NlwxXDBcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NlwzXDAiKwotICAgICJcMlw3NlwzXDBcMlw3NlwxXDBcMVw3Nlw1MFwwXDFcNzZcMTFcMFwxXDc2XDJcMCIrCi0gICAgIlwxXDc2XDJcMFwyXDc2XDdcMFwyXDc2XDFcMFwxXDc2XDFcMFw3XDc2XDUwXDAiKwotICAgICJcMVw3Nlw0XDBcMVw3NlwxMFwwXDFcNzZcdTBjMDZcMFwyMzRcNzZcNFwwXDEzMlw3Nlw2XDAiKwotICAgICJcMjZcNzZcMlwwXDZcNzZcMlwwXDQ2XDc2XDJcMFw2XDc2XDJcMFwxMFw3NlwxXDAiKwotICAgICJcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NlwxXDBcMzdcNzZcMlwwXDY1XDc2XDFcMCIrCi0gICAgIlw3XDc2XDFcMFwxXDc2XDNcMFwzXDc2XDFcMFw3XDc2XDNcMFw0XDc2XDJcMCIrCi0gICAgIlw2XDc2XDRcMFwxNVw3Nlw1XDBcM1w3NlwxXDBcN1w3NlwzMjNcMFwxNVw3N1w0XDAiKwotICAgICJcMVw3N1wxMDRcMFwxXDc2XDNcMFwyXDc2XDJcMFwxXDc2XDEyMVwwXDNcNzZcdTBlODJcMCIrCi0gICAgIlwxXDc3XDFcMFwxXDc2XDMxXDBcMTFcNzZcNlw3N1wxXDBcNVw3N1wxM1wwXDEyNFw3NiIrCi0gICAgIlw0XDBcMlw3N1wyXDBcMlw3N1wyXDBcMTMyXDc2XDFcMFwzXDc3XDZcMFw1MFw3NiIrCi0gICAgIlx1MWNkM1wwXHU1MWE2XDc2XHUwYzVhXDBcdTJiYTRcNzZcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA3MSwgICAxNDIsICAgMjEzLCAgIDI4NCwgICAzNTUsICAgNDI2LCAgIDQ5NywgICA1NjgsICAgNjM5LCAKLSAgICAgIDcxMCwgICA3ODEsICAgODUyLCAgIDkyMywgICA5OTQsICAxMDY1LCAgMTEzNiwgIDEyMDcsICAxMjc4LCAgMTM0OSwgCi0gICAgIDE0MjAsICAxNDkxLCAgMTU2MiwgIDE2MzMsICAxNzA0LCAgMTc3NSwgIDE4NDYsICAxOTE3LCAgMTk4OCwgIDIwNTksIAotICAgICAyMTMwLCAgMjIwMSwgIDIyNzIsICAyMzQzLCAgMjQxNCwgIDI0ODUsICAyNTU2LCAgMjYyNywgIDI2OTgsICAyNzY5LCAKLSAgICAgMjg0MCwgIDI5MTEsICAyOTgyLCAgMzA1MywgIDMxMjQsICAzMTk1LCAgMzI2NiwgIDMzMzcsICAzNDA4LCAgMzQ3OSwgCi0gICAgIDM1NTAsICAzNjIxLCAgMzY5MiwgIDM3NjMsICAzODM0LCAgMzkwNSwgIDM5NzYsICA0MDQ3LCAgNDExOCwgIDQxODksIAotICAgICA0MjYwLCAgNDMzMSwgIDQ0MDIsICA0NDczLCAgNDQwMiwgIDQ0NzMsICA0NTQ0LCAgNDQwMiwgIDQ0MDIsICA0NDczLCAKLSAgICAgNDYxNSwgIDQ2ODYsICA0NzU3LCAgNDgyOCwgIDQ4OTksICA0OTcwLCAgNTA0MSwgIDUxMTIsICA0NDAyLCAgNDQ3MywgCi0gICAgIDUxODMsICA1MjU0LCAgNTMyNSwgIDQ0MDIsICA1Mzk2LCAgNTM5NiwgIDU0NjcsICA1NTM4LCAgNTYwOSwgIDUxODMsIAotICAgICA0NDAyLCAgNTY4MCwgIDU3NTEsICA0NDAyLCAgNTgyMiwgIDU4OTMsICA1OTY0LCAgNjAzNSwgIDQ0MDIsICA0NDczLCAKLSAgICAgNjEwNiwgIDYxNzcsICA2MjQ4LCAgNjMxOSwgIDYzOTAsICA2NDYxLCAgNDQwMiwgIDY1MzIsICA2NTMyLCAgNjYwMywgCi0gICAgIDY2NzQsICA2NzQ1LCAgNjgxNiwgIDY4ODcsICA0NDAyLCAgNjk1OCwgIDcwMjksICA3MTAwLCAgNzE3MSwgIDcyNDIsIAotICAgICA3MzEzLCAgNDQwMiwgIDczODQsICA3NDU1LCAgNzUyNiwgIDc1OTcsICA3NjY4LCAgNzczOSwgIDc4MTAsICA3ODgxLCAKLSAgICAgNDQwMiwgIDc5NTIsICA4MDIzLCAgODA5NCwgIDgxNjUsICA4MjM2LCAgODMwNywgIDgzNzgsICA4NDQ5LCAgODQ0OSwgCi0gICAgIDg1MjAsICA4NTkxLCAgODY2MiwgIDg3MzMsICA4NzMzLCAgODgwNCwgIDg4NzUsICA4OTQ2LCAgOTAxNywgIDkwMTcsIAotICAgICA5MDg4LCAgOTE1OSwgIDkyMzAsICA5MzAxLCAgNDQwMiwgIDkzNzIsICA5MzcyLCAgOTQ0MywgIDk1MTQsICA5NTg1LCAKLSAgICAgOTY1NiwgIDQ0MDIsICA0NDAyLCAgNDQ3MywgIDQ0MDIsICA0NDczLCAgOTcyNywgIDk3OTgsICA5ODY5LCAgOTk0MCwgCi0gICAgIDQ0MDIsIDEwMDExLCAxMDA4MiwgMTAxNTMsIDEwMjI0LCAgNDQwMiwgMTAyOTUsIDEwMzY2LCAxMDQzNywgMTA1MDgsIAotICAgICA0NDAyLCAgNDQwMiwgMTA1NzksICA0NDAyLCAxMDY1MCwgMTA3MjEsIDEwNjUwLCAxMDc5MiwgMTA4NjMsIDEwNzkyLCAKLSAgICAgNDQwMiwgIDQ0MDIsIDEwOTM0LCAxMTAwNSwgMTEwNzYsICA0NDAyLCAxMTE0NywgMTEyMTgsIDExMjg5LCAxMTM2MCwgCi0gICAgMTE0MzEsICA0NDAyLCAgNDQwMiwgMTE1MDIsICA0NDAyLCAxMTU3MywgMTE2NDQsIDExNTczLCAxMTcxNSwgMTE3ODYsIAotICAgIDExNzE1LCAgNDQwMiwgIDQ0MDIsIDExODU3LCAxMTkyOCwgMTE5OTksICA0NDAyLCAxMjA3MCwgMTIxNDEsIDEyMjEyLCAKLSAgICAgNDQwMiwgIDQ0MDIsIDEyMjgzLCAxMjM1NCwgMTI0MjUsIDEyNDk2LCAxMjU2NywgIDQ0MDIsIDEyNjM4LCAxMjcwOSwgCi0gICAgMTI3ODAsIDEyODUxLCAxMjkyMiwgMTI5OTMsIDEzMDY0LCAxMzEzNSwgIDQ0MDIsIDEzMjA2LCAxMzI3NywgMTMzNDgsIAotICAgICA0NDAyLCAgNDQwMiwgIDUzOTYsICA1NTM4LCAgNDQwMiwgMTM0MTksICA1NjA5LCAxMzQ5MCwgIDU2ODAsICA1ODIyLCAKLSAgICAgNTg5MywgMTM1NjEsICA1OTY0LCAgNDQwMiwgMTM2MzIsIDEzNzAzLCAgNjAzNSwgMTM3NzQsICA0NDAyLCAxMjM1NCwgCi0gICAgIDQ0MDIsICA2NTMyLCAgNjYwMywgIDQ0MDIsIDEzODQ1LCAgNjY3NCwgMTM5MTYsICA0NDAyLCAxMzk4NywgMTQwNTgsIAotICAgICA3Mzg0LCAxNDEyOSwgIDc1OTcsICA0NDAyLCAxNDIwMCwgIDc2NjgsIDE0MjcxLCAxNDM0MiwgMTQ0MTMsIDE0NDg0LCAKLSAgICAxNDU1NSwgMTQ2MjYsICA4MTY1LCAgNDQwMiwgMTQ2OTcsIDE0NzY4LCAgODQ0OSwgIDg1MjAsICA0NDAyLCAxNDgzOSwgCi0gICAgMTQ5MTAsIDE0OTgxLCAxNTA1MiwgMTUxMjMsICA4NjYyLCAgODQ0OSwgIDg3MzMsICA4ODA0LCAgNDQwMiwgIDg4NzUsIAotICAgICA4OTQ2LCAgODczMywgIDkwMTcsICA5MDg4LCAgNDQwMiwgMTUxOTQsIDE1MjY1LCAxNTMzNiwgMTU0MDcsIDE1NDc4LCAKLSAgICAxNTU0OSwgMTU2MjAsICA5MzcyLCAgOTQ0MywgIDQ0MDIsIDE1NjkxLCAxNTc2MiwgMTU4MzMsIDE1OTA0LCAxNTk3NSwgCi0gICAgMTYwNDYsIDE2MTE3LCAxNjE4OCwgMTYyNTksICA0NDAyLCAgNDQwMiwgIDQ0MDIsIDE2MzMwLCAgNDQwMiwgIDQ0MDIsIAotICAgIDE2NDAxLCAxNjQ3MiwgMTY1NDMsIDE2NjE0LCAxMDY1MCwgIDQ0MDIsIDE2Njg1LCAxNjc1NiwgMTA3OTIsICA0NDAyLCAKLSAgICAxNjgyNywgMTY4OTgsIDE2OTY5LCAxNzA0MCwgMTcxMTEsIDE3MTgyLCAxNzI1MywgMTczMjQsIDE3Mzk1LCAxMTM2MCwgCi0gICAgMTE1NzMsICA0NDAyLCAxNzQ2NiwgMTc1MzcsIDExNzE1LCAgNDQwMiwgMTc2MDgsIDE3Njc5LCAxNzc1MCwgMTc4MjEsIAotICAgIDE3ODkyLCAxNzk2MywgMTgwMzQsIDE4MTA1LCAxODE3NiwgIDQ0MDIsICA0NDAyLCAgNDQwMiwgMTgyNDcsIDE4MzE4LCAKLSAgICAxODM4OSwgMTg0NjAsIDE4NTMxLCAgNDQwMiwgMTg2MDIsIDE4NjczLCAgNDQwMiwgIDQ0MDIsICA0NDAyLCAgNDQwMiwgCi0gICAgIDQ0MDIsICA0ODI4LCAxODc0NCwgMTg4MTUsIDE4ODg2LCAxODk1NywgMTkwMjgsIDE5MDk5LCAxOTE3MCwgMTkwOTksIAotICAgIDE5MjQxLCAxOTMxMiwgMTkyNDEsIDE5MzgzLCAxOTQ1NCwgMTk1MjUsIDE5NTk2LCAxOTY2NywgMTk3MzgsIDE5ODA5LCAKLSAgICAxOTgwOSwgMTk4ODAsIDE5OTUxLCAxOTk1MSwgMjAwMjIsICA5MjMwLCAgOTIzMCwgIDkyMzAsIDIwMDkzLCAyMDE2NCwgCi0gICAgMjAyMzUsIDIwMjM1LCAyMDMwNiwgIDk1ODUsICA5NTg1LCAgOTU4NSwgMjAzNzcsIDIwNDQ4LCAxNjU0MywgMjA1MTksIAotICAgIDEwNDM3LCAxMDQzNywgMTA0MzcsIDIwNTkwLCAyMDY2MSwgMTA2NTAsIDEwNjUwLCAxMDY1MCwgMjA3MzIsIDIwODAzLCAKLSAgICAxMDc5MiwgMTA3OTIsIDEwNzkyLCAyMDg3NCwgMjA5NDUsIDEwOTM0LCAxMDkzNCwgMTA5MzQsIDE3MTExLCAyMTAxNiwgCi0gICAgMjEwODcsIDExMTQ3LCAxMTE0NywgMTExNDcsIDE3MzI0LCAyMTE1OCwgMjEyMjksIDExMzYwLCAxMTM2MCwgMTEzNjAsIAotICAgIDIxMzAwLCAxMTU3MywgMTE1NzMsIDExNTczLCAyMTM3MSwgMjE0NDIsIDExNzE1LCAxMTcxNSwgMTE3MTUsIDIxNTEzLCAKLSAgICAyMTU4NCwgMTE4NTcsIDExODU3LCAxMTg1NywgMTc4OTIsIDIxNjU1LCAyMTcyNiwgMTIwNzAsIDEyMDcwLCAxMjA3MCwgCi0gICAgMTgxMDUsIDIxNzk3LCAgNDQwMiwgIDQ0MDIsIDIxODY4LCAyMTkzOSwgIDQ0MDIsIDIyMDEwLCAyMjA4MSwgMjIxNTIsIAotICAgIDIyMjIzLCAgNzM4NCwgIDQ0MDIsICA0NDAyLCAyMjI5NCwgMjIzNjUsIDIyNDM2LCAyMjUwNywgMjI1NzgsIDE1MDUyLCAKLSAgICAxNTQwNywgIDkyMzAsIDIyNjQ5LCAxNTkwNCwgIDk1ODUsIDIyNzIwLCAgNDQwMiwgMTA0MzcsIDEwNjUwLCAyMjc5MSwgCi0gICAgMTA3OTIsIDIyODYyLCAxMDkzNCwgMjI5MzMsICA0NDAyLCAxMTE0NywgMjMwMDQsIDExMzYwLCAxMTU3MywgMjMwNzUsIAotICAgIDExNzE1LCAyMzE0NiwgMTE4NTcsIDIzMjE3LCAgNDQwMiwgMTIwNzAsIDIzMjg4LCAyMzM1OSwgMjM0MzAsIDIzNTAxLCAKLSAgICAyMzU3MiwgMjM2NDMsIDIzNzE0LCAyMzc4NSwgMjM4NTYsIDIzOTI3LCAyMzk5OCwgMjQwNjksIDI0MTQwLCAyNDIxMSwgCi0gICAgMjQyODIsIDI0MzUzLCAyNDQyNCwgMjQ0OTUsIDI0NTY2LCAyNDYzNywgMjQ3MDgsIDI0Nzc5LCAyNDg1MCwgIDQ4MjgsIAotICAgIDI0OTIxLCAyNDk5MiwgMjUwNjMsIDI1MTM0LCAyNTIwNSwgIDQ0MDIsICA0NDAyLCAyNTI3NiwgMjUzNDcsIDI1NDE4LCAKLSAgICAyNTQ4OSwgMTcxMTEsIDE3MzI0LCAyNTU2MCwgMjU2MzEsIDE3ODkyLCAxODEwNSwgMjU3MDIsIDI1NzczLCAyNTg0NCwgCi0gICAgMjU5MTUsICA0NDAyLCAgNDQwMiwgIDQ0MDIsIDI1OTg2LCAyNjA1NywgMjYxMjgsIDI2MTk5LCAyNjI3MCwgMjYzNDEsIAotICAgIDI2NDEyLCAyNjQ4MywgIDcxMDAsIDI2NTU0LCAyNjYyNSwgMjY2OTYsIDI2NzY3LCAyNjgzOCwgMjY5MDksIDI2OTgwLCAKLSAgICAgNDQwMiwgMjcwNTEsIDI3MTIyLCAgOTIzMCwgIDk1ODUsIDEwNjUwLCAxMDc5MiwgMTE1NzMsIDExNzE1LCAyNzE5MywgCi0gICAgMjcyNjQsIDI3MzM1LCAyNzQwNiwgMjc0NzcsIDI3NTQ4LCAyNzYxOSwgMjc2OTAsICA0ODI4LCAyNzc2MSwgMjc4MzIsIAotICAgIDI3OTAzLCAyNzk3NCwgMjgwNDUsIDI4MTE2LCAyODE4NywgMjgyNTgsIDI4MzI5LCAyODQwMCwgMjg0NzEsIDI4NTQyLCAKLSAgICAyODYxMywgMjg2ODQsIDI4NzU1LCAyODgyNiwgMjg4OTcsIDI4OTY4LCAyOTAzOSwgMjkxMTAsIDI5MTgxLCAyOTI1MiwgCi0gICAgMjkzMjMsIDI5Mzk0LCAyOTQ2NSwgMjk1MzYsIDI5NjA3LCAyOTY3OCwgMjk3NDksIDI5ODIwLCAyOTg5MSwgMjk5NjIsIAotICAgIDMwMDMzLCAzMDEwNCwgMzAxNzUsIDMwMjQ2LCAgNDQwMiwgMzAzMTcsIDMwMzg4LCAzMDQ1OSwgMzA1MzAsICA3MTAwLCAKLSAgICAzMDYwMSwgMzA2NzIsIDMwNzQzLCAzMDgxNCwgMzA4ODUsIDMwOTU2LCAzMTAyNywgMzEwOTgsIDMxMTY5LCAzMTI0MCwgCi0gICAgMzEzMTEsIDMxMzgyLCAzMTQ1MywgMzE1MjQKLSAgfTsKLQotICAvKiogCi0gICAqIFRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXlfcGFja2VkID0gCi0gICAgIlwxXDcxXDFcNzJcMTFcNzFcMVw3M1wxXDcxXDFcNzRcNFw3MVwxXDc1IisKLSAgICAiXDQyXDcxXDFcNzZcMjFcNzFcMVw3N1wxXDEwMFwxMDVcNzdcMVwxMDFcMVwxMDIiKwotICAgICJcMjFcMTAxXDFcMTAzXDJcMTAxXDFcMTA0XDYwXDEwMVwxXDEwNVwxXDEwNlwxMDVcMTA1IisKLSAgICAiXDFcMTAxXDFcMTAyXDVcMTAxXDFcMTA3XDE2XDEwMVwxXDEwNFw2MVwxMDFcMVwxMDIiKwotICAgICJcMlwxMDFcMVwxMTBcMVwxMTFcMlwxMDFcMlwxMTJcNVwxMDFcMVwxMTFcNlwxMDEiKwotICAgICJcMVwxMTFcMVwxMTNcMVwxMTRcNFwxMTJcMVwxMDFcMTBcMTEyXDFcMTE1XDJcMTEyIisKLSAgICAiXDFcMTAxXDExXDExMlwxXDExNVwxXDExMlwxXDEwMVw0XDExMlwxXDEwMVw0XDExMiIrCi0gICAgIlwxXDEwMVw0XDExMlwyXDEwMVwxXDExMlwxXDEwMVwxXDEwMlwyXDEwMVwxXDExMCIrCi0gICAgIlwxXDExNlwxMVwxMDFcMVwxMTZcNlwxMDFcMVwxMTZcNjBcMTAxXDFcMTE3XDFcMTIwIisKLSAgICAiXDJcMTE3XDFcMTIxXDIxXDExN1wxXDEwNFw2MFwxMTdcMVwxMDFcMVwxMDJcMlwxMDEiKwotICAgICJcMVwxMjJcMVwxMTFcMlwxMDFcMlwxMjNcNVwxMDFcMVwxMTFcNlwxMDFcMVwxMTEiKwotICAgICJcNlwxMjNcMVwxMDFcMTNcMTIzXDFcMTAxXDEzXDEyM1wxXDEwMVw0XDEyM1wxXDEwMSIrCi0gICAgIlw0XDEyM1wxXDEwMVw0XDEyM1wyXDEwMVwxXDEyM1wxXDEwMVwxXDEwMlwyXDEwMSIrCi0gICAgIlwxXDEyMlwxXDExMVwyXDEwMVwyXDEyM1w1XDEwMVwxXDExMVw2XDEwMVwxXDExMSIrCi0gICAgIlw2XDEyM1wxXDEwMVwxM1wxMjNcMVwxMjRcMTNcMTIzXDFcMTAxXDRcMTIzXDFcMTAxIisKLSAgICAiXDRcMTIzXDFcMTAxXDRcMTIzXDJcMTAxXDFcMTIzXDFcMTI1XDFcMTAyXDFcMTAxIisKLSAgICAiXDFcMTI2XDFcMTI3XDFcMTExXDRcMTI1XDFcMTMwXDFcMTI1XDFcMTMxXDJcMTI1IisKLSAgICAiXDFcMTExXDZcMTI1XDFcMTExXDYwXDEyNVwxXDEwMVwxXDEwMlwyXDEwMVwxXDEzMiIrCi0gICAgIlwyMVwxMDFcMVwxMDRcNjFcMTAxXDFcMTAyXDFcMTMzXDFcMTM0XDFcMTAxXDFcMTExIisKLSAgICAiXDJcMTAxXDJcMTM1XDVcMTAxXDFcMTExXDZcMTAxXDFcMTExXDZcMTM1XDFcMTAxIisKLSAgICAiXDEzXDEzNVwxXDEwMVwxM1wxMzVcMVwxMDFcNFwxMzVcMVwxMDFcNFwxMzVcMVwxMDEiKwotICAgICJcNFwxMzVcMlwxMDFcMVwxMzVcMVwxMDFcMVwxMDJcMVwxMzNcMVwxMzRcMVwxMDEiKwotICAgICJcMVwxMTFcMlwxMDFcMlwxMzVcNVwxMDFcMVwxMTFcNlwxMDFcMVwxMTFcNlwxMzUiKwotICAgICJcMVwxMDFcMTNcMTM1XDFcMTM2XDEzXDEzNVwxXDEwMVw0XDEzNVwxXDEwMVw0XDEzNSIrCi0gICAgIlwxXDEwMVw0XDEzNVwyXDEwMVwxXDEzNVwxXDEzN1wxXDEwMlwxXDEzM1wxXDE0MCIrCi0gICAgIlwxXDEzN1wxXDExMVw0XDEzN1wxXDE0MVwxXDEzN1wxXDE0MlwyXDEzN1wxXDExMSIrCi0gICAgIlw2XDEzN1wxXDExMVw2MFwxMzdcMVwxMDFcMVwxMDJcM1wxMDFcMVwxMTFcMTFcMTAxIisKLSAgICAiXDFcMTExXDZcMTAxXDFcMTExXDYwXDEwMVwxXDE0M1wxXDE0NFwyMFwxNDNcMVwxNDUiKwotICAgICJcNjRcMTQzXDFcMTAxXDFcMTQ2XDNcMTAxXDFcMTExXDJcMTAxXDJcMTQ3XDVcMTAxIisKLSAgICAiXDFcMTExXDJcMTAxXDFcMTUwXDNcMTAxXDFcMTExXDZcMTQ3XDFcMTAxXDEzXDE0NyIrCi0gICAgIlwxXDEwMVwxM1wxNDdcMVwxMDFcNFwxNDdcMVwxMDFcNFwxNDdcMVwxMDFcNFwxNDciKwotICAgICJcMlwxMDFcMVwxNDdcMVwxMDFcMVwxNDZcM1wxMDFcMVwxNTFcMTFcMTAxXDFcMTUxIisKLSAgICAiXDJcMTAxXDFcMTUwXDNcMTAxXDFcMTUxXDYxXDEwMVwxXDE0NlwzXDEwMVwxXDExMSIrCi0gICAgIlwyXDEwMVwyXDE1Mlw1XDEwMVwxXDExMVwyXDEwMVwxXDE1MFwzXDEwMVwxXDExMSIrCi0gICAgIlw2XDE1MlwxXDEwMVwxM1wxNTJcMVwxMDFcMTNcMTUyXDFcMTAxXDRcMTUyXDFcMTAxIisKLSAgICAiXDRcMTUyXDFcMTAxXDRcMTUyXDJcMTAxXDFcMTUyXDFcMTAxXDFcMTQ2XDNcMTAxIisKLSAgICAiXDFcMTExXDJcMTAxXDJcMTUyXDVcMTAxXDFcMTExXDJcMTAxXDFcMTUwXDNcMTAxIisKLSAgICAiXDFcMTExXDZcMTUyXDFcMTAxXDEzXDE1MlwxXDE1M1wxM1wxNTJcMVwxMDFcNFwxNTIiKwotICAgICJcMVwxMDFcNFwxNTJcMVwxMDFcNFwxNTJcMlwxMDFcMVwxNTJcMVwxNTRcMVwxNDYiKwotICAgICJcMVwxMDFcMVwxNTVcMVwxNTRcMVwxMTFcNFwxNTRcMVwxNTZcMVwxNTRcMVwxNTciKwotICAgICJcMlwxNTRcMVwxMTFcMlwxNTRcMVwxNjBcM1wxNTRcMVwxMTFcNjBcMTU0XDFcMTYxIisKLSAgICAiXDFcMTYyXDFcMTYzXDFcMTY0XDRcMTYxXDJcMTY1XDE1XDE2MVw2XDE2NlwxXDE2MSIrCi0gICAgIlwxM1wxNjZcMVwxNjFcMTNcMTY2XDFcMTYxXDRcMTY2XDFcMTYxXDRcMTY2XDFcMTYxIisKLSAgICAiXDFcMTY3XDNcMTY2XDJcMTYxXDFcMTY2XDFcMTAxXDFcMTcwXDFcMTYzXDFcMTY0IisKLSAgICAiXDFcMTAxXDFcMTExXDJcMTAxXDJcMTcxXDVcMTAxXDFcMTExXDZcMTAxXDFcMTExIisKLSAgICAiXDZcMTcxXDFcMTAxXDEzXDE3MVwxXDEwMVwxM1wxNzFcMVwxMDFcNFwxNzFcMVwxMDEiKwotICAgICJcNFwxNzFcMVwxMDFcNFwxNzFcMlwxMDFcMVwxNzFcMVwxMDFcMVwxNzBcMVwxNjMiKwotICAgICJcMVwxNjRcMVwxMDFcMVwxMTFcMlwxMDFcMlwxNzFcNVwxMDFcMVwxMTFcNlwxMDEiKwotICAgICJcMVwxMTFcNlwxNzFcMVwxMDFcMTNcMTcxXDFcMTcyXDEzXDE3MVwxXDEwMVw0XDE3MSIrCi0gICAgIlwxXDEwMVw0XDE3MVwxXDEwMVw0XDE3MVwyXDEwMVwxXDE3MVwxXDE3M1wxXDE3NCIrCi0gICAgIlwxXDE2M1wxXDE3NVwxXDE3M1wxXDExMVw0XDE3M1wxXDE3NlwxXDE3M1wxXDE3NyIrCi0gICAgIlwxXDIwMFwxXDE3M1wxXDExMVw2XDE3M1wxXDExMVwzNlwxNzNcMVwyMDFcMjFcMTczIisKLSAgICAiXDFcMTAxXDFcMjAyXDFcMjAzXDJcMTAxXDFcMTExXDExXDEwMVwxXDExMVw2XDEwMSIrCi0gICAgIlwxXDExMVwxMFwxMDFcMVwyMDRcMVwyMDVcMlwxMDFcMVwyMDZcMTFcMTAxXDFcMjA2IisKLSAgICAiXDFcMTAxXDFcMjA1XDFcMjA0XDI3XDEwMVwxXDEwMlwxXDIwM1wyXDEwMVwxXDExMSIrCi0gICAgIlwxMVwxMDFcMVwxMTFcNlwxMDFcMVwxMTFcNlwxMDFcMVwyMDdcNTJcMTAxXDFcMTAyIisKLSAgICAiXDFcMjAzXDJcMTAxXDFcMTExXDJcMTAxXDJcMjEwXDVcMTAxXDFcMTExXDZcMTAxIisKLSAgICAiXDFcMTExXDZcMjEwXDFcMjA3XDEzXDIxMFwxXDEwMVwxM1wyMTBcMVwxMDFcNFwyMTAiKwotICAgICJcMVwxMDFcNFwyMTBcMVwxMDFcNFwyMTBcMlwxMDFcMVwyMTBcMVwxMDFcMVwxMDIiKwotICAgICJcMVwyMDNcMlwxMDFcMVwxMTFcMTFcMTAxXDFcMTExXDZcMTAxXDFcMTExXDZcMTAxIisKLSAgICAiXDFcMjA3XDdcMTAxXDFcMjExXDZcMTAxXDFcMjEyXDExXDEwMVwxXDIxMVwxMlwxMDEiKwotICAgICJcMVwyMTJcNVwxMDFcMVwyMTNcMVwxMDJcMVwyMDNcMVwyMTRcMVwyMTNcMVwxMTEiKwotICAgICJcNFwyMTNcMVwyMTVcMVwyMTNcMVwyMTZcMlwyMTNcMVwxMTFcNlwyMTNcMVwxMTEiKwotICAgICJcNlwyMTNcMVwyMTdcNTFcMjEzXDFcMjIwXDFcMTAyXDFcMjAzXDFcMjIxXDFcMjIwIisKLSAgICAiXDFcMTExXDRcMjIwXDFcMjIyXDFcMjIwXDFcMjIzXDJcMjIwXDFcMTExXDZcMjIwIisKLSAgICAiXDFcMTExXDZcMjIwXDFcMjI0XDUxXDIyMFwxXDIyNVwxXDEwMlwxXDIwM1wxXDIyNiIrCi0gICAgIlwxXDIyNVwxXDExMVw0XDIyNVwxXDIyN1wxXDIyNVwxXDIzMFwyXDIyNVwxXDExMSIrCi0gICAgIlw2XDIyNVwxXDExMVw2MFwyMjVcMVwyMzFcMVwyMzJcMVwyMzNcMTA0XDIzMVwxXDIzNCIrCi0gICAgIlwxXDEwMlwxXDIwM1wxXDIzNVwxXDIzNFwxXDExMVw0XDIzNFwxXDIzNlwxXDIzNCIrCi0gICAgIlwxXDIzN1wyXDIzNFwxXDExMVw2XDIzNFwxXDExMVw2MFwyMzRcMVwyNDBcMVwyNDEiKwotICAgICJcMVwyNDJcMTA0XDI0MFwxXDI0M1wxXDI0NFwxMDVcMjQzXDFcMTAxXDFcMTAyXDI0XDEwMSIrCi0gICAgIlwxXDEwNFw2MFwxMDFcMVwyNDVcMVwyNDZcMTA1XDI0NVwxXDEwMVwxXDEwMlw1XDEwMSIrCi0gICAgIlwxXDI0N1wxNlwxMDFcMVwxMDRcNjBcMTAxXDFcMjUwXDFcMjUxXDNcMjUwXDFcMjUyIisKLSAgICAiXDZcMjUwXDFcMjUzXDFcMjU0XDFcMjUwXDFcMjUyXDZcMjUwXDFcMjUyXDM2XDI1MCIrCi0gICAgIlwxXDI1NVwyMVwyNTBcMVwyNTZcMVwyNTFcM1wyNTZcMVwyNTdcNFwyNTZcMVwyNjAiKwotICAgICJcMlwyNTZcMVwyNjFcMVwyNTZcMVwyNTdcNlwyNTZcMVwyNTdcMzZcMjU2XDFcMjYyIisKLSAgICAiXDIxXDI1NlwxXDI2M1wxXDI2NFwxMFwyNjNcMVwyNjVcMVwyNjNcMVwyNjZcMVwyNjciKwotICAgICJcNjdcMjYzXDFcMjcwXDFcMjYzXDFcMjcxXDFcMjcyXDEyXDI3MVwxXDEwMVwxMVwyNzEiKwotICAgICJcMVwyNzNcNjBcMjcxXDFcMjc0XDFcMjc1XDEwXDI3NFwxXDEwMVwxM1wyNzRcMVwyNzYiKwotICAgICJcNjBcMjc0XDFcMTAxXDFcMTAyXDEyXDEwMVwxXDI3N1wxMVwxMDFcMVwxMDRcNjFcMTAxIisKLSAgICAiXDFcMTAyXDEwXDEwMVwxXDMwMFwxM1wxMDFcMVwxMDRcNjBcMTAxXDFcMzAxXDFcMzAyIisKLSAgICAiXDEwXDMwMVwxXDI2MFw3MVwzMDFcMVwzMDNcMVwzMDRcMVwzMDFcMVwzMDVcMVwzMDYiKwotICAgICJcMTJcMzA1XDFcMjUzXDY3XDMwNVwxXDMwN1wxXDMwNFwxXDMwNVwxXDMxMFwxXDMxMSIrCi0gICAgIlwxMFwzMTBcMVwzMTJcMVwzMTBcMVwzMTNcNTBcMzEwXDFcMzE0XDE3XDMxMFwxXDMxNSIrCi0gICAgIlwxXDMxMFwxXDMxNlwxXDMxN1wxMlwzMTZcMVwxMDFcMTFcMzE2XDFcMzIwXDYwXDMxNiIrCi0gICAgIlwxXDMyMVwxXDMyMlwxMFwzMjFcMVwxMDFcMTNcMzIxXDFcMzIzXDYwXDMyMVwxXDEwMSIrCi0gICAgIlwxXDEwMlwxMlwxMDFcMVwzMjRcMTFcMTAxXDFcMTA0XDYxXDEwMVwxXDEwMlwxMFwxMDEiKwotICAgICJcMVwzMjVcMTNcMTAxXDFcMTA0XDYwXDEwMVwxXDMyNlwxXDMyN1wxMFwzMjZcMVwyNjAiKwotICAgICJcNzFcMzI2XDFcMzMwXDFcMzMxXDFcMzI2XDFcMzMyXDFcMzMzXDEyXDMzMlwxXDI1MyIrCi0gICAgIlw2N1wzMzJcMVwzMzRcMVwzMzFcMVwzMzJcMVw3MVwxXDBcMTFcNzFcMVwwIisKLSAgICAiXDFcNzFcMVwwXDRcNzFcMVwwXDQyXDcxXDFcMFwyMVw3MVwzXDAiKwotICAgICJcMVwzMzVcMVwzMzZcMTVcMFwxXDMzN1wyXDBcMVwzNDBcNjZcMFwxXDM0MSIrCi0gICAgIlwyXDBcMlwzNDJcNVwwXDFcMzQxXDZcMFwxXDM0MVw2XDM0MlwxXDAiKwotICAgICJcMTNcMzQyXDFcMFwxM1wzNDJcMVwzNDNcNFwzNDJcMVwwXDRcMzQyXDFcMCIrCi0gICAgIlw0XDM0MlwyXDBcMVwzNDJcMVwzNDRcMVwwXDExXDM0NFwxXDBcMVwzNDQiKwotICAgICJcMVwzNDVcMVwzNDZcM1wzNDRcMVwwXDY0XDM0NFw1XDBcMVwzNDFcMlwwIisKLSAgICAiXDJcMzQ3XDVcMFwxXDM0MVw2XDBcMVwzNDFcNlwzNDdcMVwwXDEzXDM0NyIrCi0gICAgIlwxXDBcMTNcMzQ3XDFcMFw0XDM0N1wxXDBcNFwzNDdcMVwwXDRcMzQ3IisKLSAgICAiXDJcMFwxXDM0N1wxXDM0NFwxXDBcMTFcMzQ0XDFcMFwyXDM0NFwxXDM1MCIrCi0gICAgIlwzXDM0NFwxXDBcNDJcMzQ0XDFcMzUxXDIxXDM0NFwxMzFcMFwxXDMzN1wyXDAiKwotICAgICJcMVwzNTJcMTA0XDBcMVwzNTNcNzJcMFwxXDM1NFwxMDFcMFwxXDM1NVwxMTFcMCIrCi0gICAgIlwxXDExMVwxMVwwXDFcMTExXDZcMFwxXDExMVw2NlwwXDRcMTEyXDZcMCIrCi0gICAgIlwxXDExMlw2XDBcNlwxMTJcMVwwXDEzXDExMlwxXDBcMTNcMTEyXDFcMCIrCi0gICAgIlw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxMTJcNlwwIisKLSAgICAiXDFcMTEyXDZcMFwyXDExMlwyXDM1NlwyXDExMlwxXDBcMTNcMTEyXDFcMCIrCi0gICAgIlwxM1wxMTJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMCIrCi0gICAgIlw0XDExMlw2XDBcMVwxMTJcNlwwXDJcMTEyXDFcMzU2XDFcMzU3XDJcMTEyIisKLSAgICAiXDFcMFwxM1wxMTJcMVwwXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMiIrCi0gICAgIlwyXDBcMVwxMTJcNlwwXDRcMTEyXDZcMFwxXDExMlw2XDBcMlwxMTIiKwotICAgICJcMlwzNjBcMlwxMTJcMVwwXDEzXDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMiIrCi0gICAgIlwxXDBcMTFcMTEyXDJcMFwxXDExMlw1XDBcMVwxMTZcMTFcMFwxXDExNiIrCi0gICAgIlw2XDBcMVwxMTZcNjJcMFwxXDM2MVwxMDZcMFwxXDM2MlwxMTJcMFw0XDEyMyIrCi0gICAgIlw2XDBcMVwxMjNcNlwwXDZcMTIzXDFcMFwxM1wxMjNcMVwwXDEzXDEyMyIrCi0gICAgIlwxXDBcNFwxMjNcMVwwXDExXDEyM1wyXDBcMVwxMjNcMVwxMjVcMlwwIisKLSAgICAiXDFcMzYzXDFcMTI1XDFcMFw0XDEyNVwxXDBcMVwxMjVcMVwwXDJcMTI1IisKLSAgICAiXDFcMFw2XDEyNVwxXDBcNjFcMTI1XDFcMFwxXDM2MlwxXDM2M1wxXDEyNSIrCi0gICAgIlwxXDBcNFwxMjVcMVwwXDFcMTI1XDFcMFwyXDEyNVwxXDBcNlwxMjUiKwotICAgICJcMVwwXDYwXDEyNVwxXDM2NFwxXDBcMTBcMzY0XDFcMzY1XDJcMzY0XDFcMzY2IisKLSAgICAiXDQ3XDM2NFwxXDM2NlwyMVwzNjRcMVwzNjdcMVwwXDEyXDM2N1wxXDM2NVwxXDM3MCIrCi0gICAgIlw0N1wzNjdcMVwzNzBcMjFcMzY3XDJcMFwxXDEzM1wxXDM3MVwxMTFcMFw0XDEzNSIrCi0gICAgIlw2XDBcMVwxMzVcNlwwXDZcMTM1XDFcMFwxM1wxMzVcMVwwXDEzXDEzNSIrCi0gICAgIlwxXDBcNFwxMzVcMVwwXDExXDEzNVwyXDBcMVwxMzVcMVwxMzdcMlwwIisKLSAgICAiXDFcMzcyXDFcMTM3XDFcMFw0XDEzN1wxXDBcMVwxMzdcMVwwXDJcMTM3IisKLSAgICAiXDFcMFw2XDEzN1wxXDBcNjFcMTM3XDFcMFwxXDEzM1wxXDM3M1wxXDEzNyIrCi0gICAgIlwxXDBcNFwxMzdcMVwwXDFcMTM3XDFcMFwyXDEzN1wxXDBcNlwxMzciKwotICAgICJcMVwwXDYwXDEzN1wxXDE0MVwxXDBcMVwzNzRcMVwzNzVcMVwxNDFcMVwzNzQiKwotICAgICJcNFwxNDFcMVwzNzZcMVwxNDFcMVwzNzRcMVwzNzdcMVwxNDFcMVwzNzRcNlwxNDEiKwotICAgICJcMVwzNzRcMzZcMTQxXDFcMzc3XDIxXDE0MVwxXDE0MlwxXDBcMVx1MDEwMFwxXHUwMTAxIisKLSAgICAiXDFcMTQyXDFcdTAxMDBcNFwxNDJcMVx1MDEwMFwxXDE0MlwxXDM3NlwxXHUwMTAyXDFcMTQyIisKLSAgICAiXDFcdTAxMDBcNlwxNDJcMVx1MDEwMFwzNlwxNDJcMVx1MDEwMlwyMVwxNDJcMlwwXDFcdTAxMDMiKwotICAgICJcMTI2XDBcMVwzMzdcMlwwXDFcdTAxMDRcNjdcMFw0XDE0N1w2XDBcMVwxNDciKwotICAgICJcNlwwXDZcMTQ3XDFcMFwxM1wxNDdcMVwwXDEzXDE0N1wxXDBcNFwxNDciKwotICAgICJcMVwwXDExXDE0N1wyXDBcMVwxNDdcMlwwXDFcdTAxMDVcMTExXDBcMVwxNTEiKwotICAgICJcMTFcMFwxXDE1MVw2XDBcMVwxNTFcNjZcMFw0XDE1Mlw2XDBcMVwxNTIiKwotICAgICJcNlwwXDZcMTUyXDFcMFwxM1wxNTJcMVwwXDEzXDE1MlwxXDBcNFwxNTIiKwotICAgICJcMVwwXDExXDE1MlwyXDBcMVwxNTJcMVwxNTRcMlwwXDFcdTAxMDZcMVwxNTQiKwotICAgICJcMVwwXDRcMTU0XDFcMFwxXDE1NFwxXDBcMlwxNTRcMVwwXDZcMTU0IisKLSAgICAiXDFcMFw2MFwxNTRcMVx1MDEwN1wxXDBcMTBcdTAxMDdcMVx1MDEwOFwyXHUwMTA3XDFcdTAxMDkiKwotICAgICJcNDdcdTAxMDdcMVx1MDEwOVwyMVx1MDEwN1wxXHUwMTBhXDFcMFwxMlx1MDEwYVwxXHUwMTA4XDFcdTAxMGIiKwotICAgICJcNDdcdTAxMGFcMVx1MDEwYlwyMVx1MDEwYVwxXDE1NFwxXDBcMVx1MDEwNVwxXHUwMTA2XDFcMTU0IisKLSAgICAiXDFcMFw0XDE1NFwxXDBcMVwxNTRcMVwwXDJcMTU0XDFcMFw2XDE1NCIrCi0gICAgIlwxXDBcNjBcMTU0XDFcMTYxXDNcMFwyM1wxNjFcNlwwXDFcMTYxXDEzXDAiKwotICAgICJcMVwxNjFcMTNcMFwxXDE2MVw0XDBcMVwxNjFcNFwwXDFcMTYxXDRcMCIrCi0gICAgIlwyXDE2MVw0XDBcMVwzMzVcMTZcMFwxXDMzN1wyXDBcMVwzNDBcNjNcMCIrCi0gICAgIlwxXHUwMTBjXDEwNFwwXDFcMTYxXDNcMFwyXDE2MVw0XDE2NVw2XDE2MVwxXDE2NSIrCi0gICAgIlw2XDE2MVw2XDE2NlwxXDE2MVwxM1wxNjZcMVwxNjFcMTNcMTY2XDFcMTYxXDRcMTY2IisKLSAgICAiXDFcMTYxXDRcMTY2XDFcMTY1XDRcMTY2XDJcMTYxXDFcMTY2XDZcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDdcMTY2XDFcdTAxMGRcM1wxNjYiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjYiKwotICAgICJcM1wwXDFcMzM1XDRcMFwyXHUwMTBlXDEwXDBcMVwzMzdcMlwwXDFcMzQwIisKLSAgICAiXDFcMFw2XHUwMTBlXDFcMFwxM1x1MDEwZVwxXDBcMTNcdTAxMGVcMVwwXDRcdTAxMGUiKwotICAgICJcMVwwXDRcdTAxMGVcMVwwXDRcdTAxMGVcMlwwXDFcdTAxMGVcNlwwXDRcMTcxIisKLSAgICAiXDZcMFwxXDE3MVw2XDBcNlwxNzFcMVwwXDEzXDE3MVwxXDBcMTNcMTcxIisKLSAgICAiXDFcMFw0XDE3MVwxXDBcMTFcMTcxXDJcMFwxXDE3MVwxXDE3M1wyXDAiKwotICAgICJcMVx1MDEwZlwxXDE3M1wxXDBcNFwxNzNcMVwwXDFcMTczXDFcMFwyXDE3MyIrCi0gICAgIlwxXDBcNlwxNzNcMVwwXDYwXDE3M1wzXDBcMVwzMzVcNFwwXDJcdTAxMTAiKwotICAgICJcMTBcMFwxXDMzN1wyXDBcMVwzNDBcMVwwXDZcdTAxMTBcMVwwXDEzXHUwMTEwIisKLSAgICAiXDFcMFwxM1x1MDExMFwxXDBcNFx1MDExMFwxXDBcNFx1MDExMFwxXDBcNFx1MDExMCIrCi0gICAgIlwyXDBcMVx1MDExMFwxXDE3M1wxXDBcMVx1MDEwY1wxXHUwMTBmXDFcMTczXDFcMCIrCi0gICAgIlw0XDE3M1wxXDBcMVwxNzNcMVwwXDJcMTczXDFcMFw2XDE3M1wxXDAiKwotICAgICJcNjBcMTczXDFcdTAxMTFcMVwwXDEwXHUwMTExXDFcdTAxMTJcMlx1MDExMVwxXHUwMTEzXDQ3XHUwMTExIisKLSAgICAiXDFcdTAxMTNcMjFcdTAxMTFcMVx1MDExNFwxXDBcMTJcdTAxMTRcMVx1MDExMlwxXHUwMTE1XDQ3XHUwMTE0IisKLSAgICAiXDFcdTAxMTVcMjFcdTAxMTRcMVwxNzNcMlwwXDFcdTAxMGZcMVwxNzNcMVwwXDRcMTczIisKLSAgICAiXDFcMFwxXDE3M1wxXDBcMVwxNzNcMVx1MDExNlwxXDBcNlwxNzNcMVwwIisKLSAgICAiXDYxXDE3M1wyXDBcMVx1MDEwZlwxXDE3M1wxXDBcNFwxNzNcMVwwXDFcMTczIisKLSAgICAiXDFcMFwxXDE3M1wxXHUwMTE3XDFcMFw2XDE3M1wxXDBcNjBcMTczXDNcMCIrCi0gICAgIlwxXDMzNVwxNlwwXDFcMzM3XDJcMFwxXHUwMTA0XDEzMFwwXDFcdTAxMThcMlwwIisKLSAgICAiXDFcdTAxMThcNzVcMFwxXHUwMTE5XDE0XDBcMVx1MDExOVw2M1wwXDJcdTAxMWFcNTJcMCIrCi0gICAgIlwyM1x1MDExYlwxXHUwMTFjXDYzXHUwMTFiXDZcMFw0XDIxMFw2XDBcMVwyMTBcNlwwIisKLSAgICAiXDZcMjEwXDFcMFwxM1wyMTBcMVwwXDEzXDIxMFwxXDBcNFwyMTBcMVwwIisKLSAgICAiXDExXDIxMFwyXDBcMVwyMTBcNTNcMFwxXHUwMTFkXDVcMFwxXHUwMTFkXDExNlwwIisKLSAgICAiXDFcdTAxMWVcMTBcMFwxXHUwMTFlXDRcMFwxXDIxM1wyXDBcMVx1MDExZlwxXDIxMyIrCi0gICAgIlwxXDBcNFwyMTNcMVwwXDFcMjEzXDFcMFwyXDIxM1wxXDBcNlwyMTMiKwotICAgICJcMVwwXDYwXDIxM1wxXHUwMTIwXDFcMFwxMFx1MDEyMFwxXHUwMTIxXDJcdTAxMjBcMVx1MDEyMiIrCi0gICAgIlw0N1x1MDEyMFwxXHUwMTIyXDIxXHUwMTIwXDFcdTAxMjNcMVwwXDFcdTAxMjNcMlx1MDEyNFwxXHUwMTIzIisKLSAgICAiXDRcdTAxMjRcMlx1MDEyM1wxXHUwMTI1XDFcdTAxMjZcMVx1MDEyM1w0XHUwMTI0XDFcdTAxMjNcMTFcdTAxMjQiKwotICAgICJcMVx1MDEyM1wyN1x1MDEyNFwxXHUwMTI2XDEwXHUwMTI0XDJcdTAxMjNcNFx1MDEyNFwyXHUwMTIzXDFcdTAxMjQiKwotICAgICJcMVwyMTdcMlx1MDExYlwxXHUwMTI3XDFcMjE3XDFcdTAxMWJcNFwyMTdcMVx1MDExYlwxXDIxNyIrCi0gICAgIlwxXHUwMTFiXDJcMjE3XDFcdTAxMWJcM1wyMTdcMVx1MDEyOFwyXDIxN1wxXHUwMTFiXDYwXDIxNyIrCi0gICAgIlwxXDIyMFwyXDBcMVx1MDEyOVwxXDIyMFwxXDBcNFwyMjBcMVwwXDFcMjIwIisKLSAgICAiXDFcMFwyXDIyMFwxXDBcNlwyMjBcMVwwXDYwXDIyMFwxMlx1MDEyYVwxXHUwMTJiIisKLSAgICAiXDc0XHUwMTJhXDE0XHUwMTJjXDFcdTAxMmJcNzJcdTAxMmNcMVwyMjRcMlx1MDExYlwxXHUwMTJkXDFcMjI0IisKLSAgICAiXDFcdTAxMWJcNFwyMjRcMVx1MDExYlwxXDIyNFwxXHUwMTFiXDJcMjI0XDFcdTAxMWJcM1wyMjQiKwotICAgICJcMVx1MDEyZVwyXDIyNFwxXHUwMTFiXDYwXDIyNFwxXDIyNVwyXDBcMVx1MDEyZlwxXDIyNSIrCi0gICAgIlwxXDBcNFwyMjVcMVwwXDFcMjI1XDFcMFwyXDIyNVwxXDBcNlwyMjUiKwotICAgICJcMVwwXDYwXDIyNVwxXHUwMTMwXDFcMFwxMFx1MDEzMFwxXHUwMTMxXDJcdTAxMzBcMVx1MDEzMiIrCi0gICAgIlw0N1x1MDEzMFwxXHUwMTMyXDIxXHUwMTMwXDFcdTAxMzNcMVwwXDFcdTAxMzNcMlx1MDEzNFwxXHUwMTMzIisKLSAgICAiXDRcdTAxMzRcMlx1MDEzM1wxXHUwMTM1XDFcdTAxMzZcMVx1MDEzM1w0XHUwMTM0XDFcdTAxMzNcMTFcdTAxMzQiKwotICAgICJcMVx1MDEzM1wyN1x1MDEzNFwxXHUwMTM2XDEwXHUwMTM0XDJcdTAxMzNcNFx1MDEzNFwyXHUwMTMzXDFcdTAxMzQiKwotICAgICJcMlwyMzFcMVwwXDEwNlwyMzFcMVwwXDE3XDIzMVwxXHUwMTM3XDJcMjMxXDFcdTAxMzgiKwotICAgICJcNjFcMjMxXDFcMjM0XDJcMFwxXHUwMTM5XDFcMjM0XDFcMFw0XDIzNFwxXDAiKwotICAgICJcMVwyMzRcMVwwXDJcMjM0XDFcMFw2XDIzNFwxXDBcNjBcMjM0XDFcdTAxM2EiKwotICAgICJcMVwwXDEwXHUwMTNhXDFcdTAxM2JcMlx1MDEzYVwxXHUwMTNjXDQ3XHUwMTNhXDFcdTAxM2NcMjFcdTAxM2EiKwotICAgICJcMVx1MDEzZFwxXDBcMVx1MDEzZFwyXHUwMTNlXDFcdTAxM2RcNFx1MDEzZVwyXHUwMTNkXDFcdTAxM2YiKwotICAgICJcMVx1MDE0MFwxXHUwMTNkXDRcdTAxM2VcMVx1MDEzZFwxMVx1MDEzZVwxXHUwMTNkXDI3XHUwMTNlXDFcdTAxNDAiKwotICAgICJcMTBcdTAxM2VcMlx1MDEzZFw0XHUwMTNlXDJcdTAxM2RcMVx1MDEzZVwyXDI0MFwxXDBcMTA2XDI0MCIrCi0gICAgIlwxXDBcMTdcMjQwXDFcdTAxNDFcMlwyNDBcMVx1MDE0Mlw2MVwyNDBcN1wwXDFcdTAxNDMiKwotICAgICJcNzdcMFwxXDI1MFwxXDBcMTJcMjUwXDFcMFwxXHUwMTQ0XDQ3XDI1MFwxXHUwMTQ0IisKLSAgICAiXDIxXDI1MFwzXDBcMVx1MDE0NVwxNlwwXDFcMzM3XDJcMFwxXDM1Mlw2MVwwIisKLSAgICAiXDFcMjUwXDFcMFwzXDI1MFwxXDI1Mlw2XDI1MFwxXDBcMVx1MDE0NFwxXDI1MCIrCi0gICAgIlwxXDI1Mlw2XDI1MFwxXDI1MlwzNlwyNTBcMVx1MDE0NFwzN1wyNTBcMVx1MDE0NlwxMDZcMjUwIisKLSAgICAiXDFcdTAxNDdcNzBcMjUwXDFcMjU2XDFcMFwxMFwyNTZcMVwwXDJcMjU2XDFcdTAxNDgiKwotICAgICJcNDdcMjU2XDFcdTAxNDhcMjJcMjU2XDFcMFwzXDI1NlwxXDI1N1w0XDI1NlwxXDAiKwotICAgICJcMlwyNTZcMVx1MDE0OFwxXDI1NlwxXDI1N1w2XDI1NlwxXDI1N1wzNlwyNTZcMVx1MDE0OCIrCi0gICAgIlwzN1wyNTZcMVx1MDE0OVwxMDZcMjU2XDFcdTAxNGFcNzBcMjU2XDEyXDI2M1wxXDBcMVwyNjMiKwotICAgICJcMVwwXDFcdTAxNGJcNjdcMjYzXDFcMFwxM1wyNjNcMVwwXDFcMjYzXDFcMCIrCi0gICAgIlwxXHUwMTRiXDRcMjYzXDFcdTAxNGNcNjJcMjYzXDFcMFwxM1wyNjNcMVwwXDFcMjYzIisKLSAgICAiXDFcMFwxXDI2M1wxXHUwMTRkXDY2XDI2M1wxXHUwMTRlXDFcMjYzXDE0XHUwMTRmXDFcdTAxNTAiKwotICAgICJcMTA2XHUwMTRmXDFcdTAxNTBcNVx1MDE0ZlwxXHUwMTUxXDJcdTAxNGZcMVx1MDE1Mlw2MVx1MDE0ZlwxMlx1MDE1MyIrCi0gICAgIlwxXHUwMTU0XDEwNlx1MDE1M1wxXHUwMTU0XDdcdTAxNTNcMVx1MDE1NVwyXHUwMTUzXDFcdTAxNTZcNjFcdTAxNTMiKwotICAgICJcMTJcMzAxXDFcMFw3MVwzMDFcMVx1MDE1N1wxXDBcMTNcMzAxXDFcMFw3XDMwMSIrCi0gICAgIlwxXHUwMTU4XDYxXDMwMVwxXHUwMTU3XDFcMFwxM1wzMDFcMVx1MDE1OVw3NFwzMDFcMTRcMzA1IisKLSAgICAiXDFcMFw2N1wzMDVcMVx1MDE1YVwxXDBcMTVcMzA1XDFcMFw1XDMwNVwxXHUwMTViIisKLSAgICAiXDYxXDMwNVwxXHUwMTVhXDFcMFwxNVwzMDVcMVx1MDE1Y1w3MlwzMDVcMTJcMzEwXDFcMCIrCi0gICAgIlwxXDMxMFwxXDBcNzBcMzEwXDFcMFwxM1wzMTBcMVwwXDFcMzEwXDFcMCIrCi0gICAgIlw1XDMxMFwxXHUwMTVkXDYyXDMxMFwxXDBcMTNcMzEwXDFcMFwxXDMxMFwxXDAiKwotICAgICJcMVwzMTBcMVx1MDE1ZVw2NlwzMTBcMVwwXDFcMzEwXDE0XHUwMTVmXDFcdTAxNjBcMTA2XHUwMTVmIisKLSAgICAiXDFcdTAxNjBcNVx1MDE1ZlwxXHUwMTYxXDJcdTAxNWZcMVx1MDE2Mlw2MVx1MDE1ZlwxMlx1MDE2M1wxXHUwMTY0IisKLSAgICAiXDEwNlx1MDE2M1wxXHUwMTY0XDdcdTAxNjNcMVx1MDE2NVwyXHUwMTYzXDFcdTAxNjZcNjFcdTAxNjNcMTJcMzI2IisKLSAgICAiXDFcMFw3MVwzMjZcMVx1MDE2N1wxXDBcMTNcMzI2XDFcMFw3XDMyNlwxXHUwMTY4IisKLSAgICAiXDYxXDMyNlwxXHUwMTY3XDFcMFwxM1wzMjZcMVx1MDE2OVw3NFwzMjZcMTRcMzMyXDFcMCIrCi0gICAgIlw2N1wzMzJcMVx1MDE2YVwxXDBcMTVcMzMyXDFcMFw1XDMzMlwxXHUwMTZiXDYxXDMzMiIrCi0gICAgIlwxXHUwMTZhXDFcMFwxNVwzMzJcMVx1MDE2Y1w3MlwzMzJcN1wwXDFcdTAxNmRcMTFcMCIrCi0gICAgIlwxXHUwMTZlXDNcMFwxXHUwMTZmXDIzXDBcMVx1MDE3MFw0NFwwXDFcdTAxNzFcMjVcMCIrCi0gICAgIlwxXHUwMTcyXDU2XDBcMVwzNDFcMlwwXDJcdTAxNzNcNVwwXDFcMzQxXDZcMCIrCi0gICAgIlwxXDM0MVw2XHUwMTczXDFcMFwxM1x1MDE3M1wxXDBcMTNcdTAxNzNcMVwwXDRcdTAxNzMiKwotICAgICJcMVwwXDRcdTAxNzNcMVwwXDRcdTAxNzNcMlwwXDFcdTAxNzNcMVx1MDE3NFwxXDAiKwotICAgICJcM1x1MDE3NFwxXHUwMTc1XDRcMzQyXDFcdTAxNzRcMVwwXDNcdTAxNzRcMVx1MDE3NVwxXDM0MiIrCi0gICAgIlwxXHUwMTc0XDFcMFwzXHUwMTc0XDFcdTAxNzVcNlwzNDJcMVx1MDE3NFwxM1wzNDJcMVx1MDE3NCIrCi0gICAgIlwxM1wzNDJcMVx1MDE3NFw0XDM0MlwxXHUwMTc2XDExXDM0MlwyXHUwMTc0XDFcMzQyXDIwXDAiKwotICAgICJcMVx1MDE3N1w3XDBcMVx1MDE3OFw3M1wwXDFcMzQ1XDcxXDBcMTA1XDM0NlwxXHUwMTc5IisKLSAgICAiXDFcMzQ2XDFcdTAxNzRcMVwwXDNcdTAxNzRcMVx1MDE3NVw0XDM0N1wxXHUwMTc0XDFcMCIrCi0gICAgIlwzXHUwMTc0XDFcdTAxNzVcMVwzNDdcMVx1MDE3NFwxXDBcM1x1MDE3NFwxXHUwMTc1XDZcMzQ3IisKLSAgICAiXDFcdTAxNzRcMTNcMzQ3XDFcdTAxNzRcMTNcMzQ3XDFcdTAxNzRcNFwzNDdcMVx1MDE3YVwxMVwzNDciKwotICAgICJcMlx1MDE3NFwxXDM0N1wxMDVcMzUwXDFcdTAxN2JcMVwzNTBcNjVcMFwxXDM1MVw1NlwwIisKLSAgICAiXDFcdTAxNzJcNTNcMFwxXHUwMTdjXDEwNlwwXDFcdTAxN2RcMTEyXDBcNFwxMTJcNlwwIisKLSAgICAiXDFcMTEyXDZcMFw0XDExMlwyXHUwMTdlXDFcMFwxM1wxMTJcMVwwXDEzXDExMiIrCi0gICAgIlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTEyIisKLSAgICAiXDZcMFwxXDExMlw2XDBcNFwxMTJcMVx1MDE3ZVwxXHUwMTdmXDFcMFwxM1wxMTIiKwotICAgICJcMVwwXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTIiKwotICAgICJcNlwwXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwXDEzXDExMiIrCi0gICAgIlwxXDBcMlwxMTJcMVx1MDE4MFwxMFwxMTJcMVwwXDRcMTEyXDFcMFw2XDExMiIrCi0gICAgIlwxXHUwMTgwXDJcMTEyXDJcMFwxXDExMlwxMlwzNjRcMVwzNjVcM1wzNjRcMVwwIisKLSAgICAiXDcwXDM2NFwxNFwzNjdcMVwzNjVcMVwzNjdcMVwwXDcwXDM2N1wxXDM3NFwxXDAiKwotICAgICJcMTBcMzc0XDFcMzc2XDJcMzc0XDFcdTAxODFcNDdcMzc0XDFcdTAxODFcMjFcMzc0XDFcMTQxIisKLSAgICAiXDJcMzc0XDFcMzc1XDFcMTQxXDFcMzc0XDRcMTQxXDFcMzc2XDFcMTQxXDFcMzc0IisKLSAgICAiXDFcMTQxXDFcMTM3XDFcMzc0XDZcMTQxXDFcMzc0XDYwXDE0MVwxXHUwMTAwXDFcMCIrCi0gICAgIlwxMlx1MDEwMFwxXDM3NlwxXHUwMTgyXDQ3XHUwMTAwXDFcdTAxODJcMjFcdTAxMDBcMVwxNDJcMlx1MDEwMCIrCi0gICAgIlwxXHUwMTAxXDFcMTQyXDFcdTAxMDBcNFwxNDJcMVx1MDEwMFwxXDE0MlwxXDM3NlwxXDE0MiIrCi0gICAgIlwxXDEzN1wxXHUwMTAwXDZcMTQyXDFcdTAxMDBcNjBcMTQyXDEyXHUwMTA3XDFcdTAxMDhcM1x1MDEwNyIrCi0gICAgIlwxXDBcNzBcdTAxMDdcMTRcdTAxMGFcMVx1MDEwOFwxXHUwMTBhXDFcMFw3MFx1MDEwYVw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDRcMTY2XDFcMFw2XDE2NlwxXHUwMTgzXDJcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFx1MDEwZVw2XDBcMVx1MDEwZVw2XDBcNlx1MDEwZVwxXDAiKwotICAgICJcMTNcdTAxMGVcMVwwXDEzXHUwMTBlXDFcMFw0XHUwMTBlXDFcMFwxMVx1MDEwZVwyXDAiKwotICAgICJcMVx1MDEwZVw2XDBcNFx1MDExMFw2XDBcMVx1MDExMFw2XDBcNlx1MDExMFwxXDAiKwotICAgICJcMTNcdTAxMTBcMVwwXDEzXHUwMTEwXDFcMFw0XHUwMTEwXDFcMFwxMVx1MDExMFwyXDAiKwotICAgICJcMVx1MDExMFwxMlx1MDExMVwxXHUwMTEyXDNcdTAxMTFcMVwwXDcwXHUwMTExXDE0XHUwMTE0XDFcdTAxMTIiKwotICAgICJcMVx1MDExNFwxXDBcNzBcdTAxMTRcMVx1MDE4NFwyXHUwMTg1XDFcdTAxODZcMVx1MDE4NFwxXHUwMTg1IisKLSAgICAiXDRcdTAxODRcMVx1MDE4NVwxXHUwMTg0XDFcdTAxODVcMlx1MDE4NFwxXHUwMTg1XDZcdTAxODRcMVx1MDE4NSIrCi0gICAgIlw1Nlx1MDE4NFwxXDE3M1wxXHUwMTg0XDFcdTAxODdcMlx1MDE4OFwxXHUwMTg5XDFcdTAxODdcMVx1MDE4OCIrCi0gICAgIlw0XHUwMTg3XDFcdTAxODhcMVx1MDE4N1wxXHUwMTg4XDJcdTAxODdcMVx1MDE4OFw2XHUwMTg3XDFcdTAxODgiKwotICAgICJcNTZcdTAxODdcMVwxNzNcMVx1MDE4N1wzNlwwXDFcdTAxOGFcMzVcMFwxXHUwMThhXDUzXDAiKwotICAgICJcMVx1MDE4YlwxNFwwXDFcdTAxOGJcNzNcMFwxXHUwMThjXDExXDBcMVx1MDE4Y1w3NlwwIisKLSAgICAiXDFcdTAxOGRcMjBcMFwxXHUwMThkXDExM1wwXDFcdTAxOGVcN1wwXDFcdTAxOGVcM1wwIisKLSAgICAiXDEyXHUwMTIwXDFcdTAxMjFcM1x1MDEyMFwxXDBcNzBcdTAxMjBcMVx1MDEyM1wxXDBcMTJcdTAxMjMiKwotICAgICJcMVx1MDEyMVwxXHUwMThmXDQ3XHUwMTIzXDFcdTAxOGZcMjJcdTAxMjNcMVwwXDEyXHUwMTIzXDFcdTAxOTAiKwotICAgICJcMVx1MDE4Zlw0N1x1MDEyM1wxXHUwMThmXDIxXHUwMTIzXDE0XDBcMVx1MDE5MVw3MlwwXDE0XHUwMTIzIisKLSAgICAiXDFcdTAxOTBcMVx1MDEyM1wxXDBcNzBcdTAxMjNcMTJcdTAxMzBcMVx1MDEzMVwzXHUwMTMwXDFcMCIrCi0gICAgIlw3MFx1MDEzMFwxXHUwMTMzXDFcMFwxMlx1MDEzM1wxXHUwMTMxXDFcdTAxOTJcNDdcdTAxMzNcMVx1MDE5MiIrCi0gICAgIlwyMlx1MDEzM1wxXDBcMTJcdTAxMzNcMVx1MDE5M1wxXHUwMTkyXDQ3XHUwMTMzXDFcdTAxOTJcMjFcdTAxMzMiKwotICAgICJcMTRcMFwxXHUwMTk0XDcyXDBcMTRcdTAxMzNcMVx1MDE5M1wxXHUwMTMzXDFcMFw3MFx1MDEzMyIrCi0gICAgIlwyXDIzMVwxXDBcNFwyMzFcMVx1MDE5NVwxMVwyMzFcMVx1MDE5NlwzXDIzMVwxXHUwMTk3IisKLSAgICAiXDIzXDIzMVwxXHUwMTk4XDM3XDIzMVwxXDBcMzJcMjMxXDFcdTAxOTlcNTFcMjMxXDEyXHUwMTNhIisKLSAgICAiXDFcdTAxM2JcM1x1MDEzYVwxXDBcNzBcdTAxM2FcMVx1MDEzZFwxXDBcMTJcdTAxM2RcMVx1MDEzYiIrCi0gICAgIlwxXHUwMTlhXDQ3XHUwMTNkXDFcdTAxOWFcMjJcdTAxM2RcMVwwXDEyXHUwMTNkXDFcdTAxOWJcMVx1MDE5YSIrCi0gICAgIlw0N1x1MDEzZFwxXHUwMTlhXDIxXHUwMTNkXDE0XDBcMVx1MDE5Y1w3MlwwXDE0XHUwMTNkXDFcdTAxOWIiKwotICAgICJcMVx1MDEzZFwxXDBcNzBcdTAxM2RcMlwyNDBcMVwwXDRcMjQwXDFcdTAxOWRcMTFcMjQwIisKLSAgICAiXDFcdTAxOWVcM1wyNDBcMVx1MDE5ZlwyM1wyNDBcMVx1MDFhMFwzN1wyNDBcMVwwXDMyXDI0MCIrCi0gICAgIlwxXHUwMWExXDUxXDI0MFwyMlwwXDFcdTAxYTJcNjRcMFwxNlwyNTBcMVwwXDcwXDI1MCIrCi0gICAgIlwxNlwyNTZcMVwwXDcwXDI1NlwxMlwyNjNcMVwwXDFcMjYzXDFcMFwxXDI2MyIrCi0gICAgIlwxXHUwMWEzXDY2XDI2M1wxXHUwMTRlXDEwXDI2M1wxXHUwMWE0XDJcMjYzXDFcMFwxXDI2MyIrCi0gICAgIlwxXDBcMVx1MDE0YlwzXDI2M1wxXHUwMWE1XDNcMjYzXDFcdTAxYTZcMjNcMjYzXDFcdTAxYTciKwotICAgICJcMzNcMjYzXDFcMFwxXDI2M1wxMlx1MDFhM1wxXDBcMVx1MDFhM1wxXDBcNzBcdTAxYTMiKwotICAgICJcMVwwXDFcdTAxYTNcMTJcdTAxNGVcMVwwXDFcdTAxNGVcMVwwXDFcdTAxYThcNjdcdTAxNGUiKwotICAgICJcMVwwXDFcdTAxNGVcN1x1MDE0ZlwxXHUwMWE5XDRcdTAxNGZcMVx1MDE1MFw0XHUwMTRmXDFcdTAxYWEiKwotICAgICJcM1x1MDE0ZlwxXHUwMWFiXDIzXHUwMTRmXDFcdTAxYWNcNTFcdTAxNGZcMVx1MDE1MFwyMFx1MDE0ZlwxXHUwMWFkIisKLSAgICAiXDUxXHUwMTRmXDdcdTAxNTNcMVx1MDFhZVwyXHUwMTUzXDFcdTAxNTRcNlx1MDE1M1wxXHUwMWFmXDNcdTAxNTMiKwotICAgICJcMVx1MDFiMFwyM1x1MDE1M1wxXHUwMWIxXDQ3XHUwMTUzXDFcdTAxNTRcMjJcdTAxNTNcMVx1MDFiMlw1MVx1MDE1MyIrCi0gICAgIlwxMlwzMDFcMVwwXDEwM1wzMDFcMVx1MDFiM1wyXDMwMVwxXDBcNlwzMDFcMVx1MDFiNCIrCi0gICAgIlwzXDMwMVwxXHUwMWI1XDIzXDMwMVwxXHUwMWI2XDMyXDMwMVwxXHUwMTU3XDFcMFwxXDMwMSIrCi0gICAgIlwxMDRcdTAxYjdcMVx1MDFiOFwyXHUwMWI3XDE0XDMwNVwxXDBcMTAxXDMwNVwxXHUwMWI5XDRcMzA1IisKLSAgICAiXDFcMFw0XDMwNVwxXHUwMWJhXDNcMzA1XDFcdTAxYmJcMjNcMzA1XDFcdTAxYmNcMzJcMzA1IisKLSAgICAiXDFcdTAxNWFcMVwwXDFcMzA1XDEwNFx1MDFiZFwxXHUwMWJlXDJcdTAxYmRcN1wzMTBcMVx1MDFiZiIrCi0gICAgIlwyXDMxMFwxXDBcMVwzMTBcMVwwXDRcMzEwXDFcdTAxYzBcM1wzMTBcMVx1MDFjMSIrCi0gICAgIlwyM1wzMTBcMVx1MDFjMlwzM1wzMTBcMVwwXDFcMzEwXDdcdTAxNWZcMVx1MDFjM1w0XHUwMTVmIisKLSAgICAiXDFcdTAxNjBcNFx1MDE1ZlwxXHUwMWM0XDNcdTAxNWZcMVx1MDFjNVwyM1x1MDE1ZlwxXHUwMWM2XDUxXHUwMTVmIisKLSAgICAiXDFcdTAxNjBcMjBcdTAxNWZcMVx1MDFjN1w1MVx1MDE1Zlw3XHUwMTYzXDFcdTAxYzhcMlx1MDE2M1wxXHUwMTY0IisKLSAgICAiXDZcdTAxNjNcMVx1MDFjOVwzXHUwMTYzXDFcdTAxY2FcMjNcdTAxNjNcMVx1MDFjYlw0N1x1MDE2M1wxXHUwMTY0IisKLSAgICAiXDIyXHUwMTYzXDFcdTAxY2NcNTFcdTAxNjNcMTJcMzI2XDFcMFwxMDNcMzI2XDFcdTAxY2RcMlwzMjYiKwotICAgICJcMVwwXDZcMzI2XDFcdTAxY2VcM1wzMjZcMVx1MDFjZlwyM1wzMjZcMVx1MDFkMFwzMlwzMjYiKwotICAgICJcMVx1MDE2N1wxXDBcMVwzMjZcMTA0XHUwMWQxXDFcdTAxZDJcMlx1MDFkMVwxNFwzMzJcMVwwIisKLSAgICAiXDEwMVwzMzJcMVx1MDFkM1w0XDMzMlwxXDBcNFwzMzJcMVx1MDFkNFwzXDMzMlwxXHUwMWQ1IisKLSAgICAiXDIzXDMzMlwxXHUwMWQ2XDMyXDMzMlwxXHUwMTZhXDFcMFwxXDMzMlwxMDRcdTAxZDdcMVx1MDFkOCIrCi0gICAgIlwyXHUwMWQ3XDdcMFwxXHUwMWQ5XDEwNlwwXDFcdTAxZGFcMTM1XDBcMVx1MDFkYlw1MFwwIisKLSAgICAiXDFcdTAxNzNcMVwwXDExXHUwMTczXDFcMFw2XHUwMTczXDFcMFw2NFx1MDE3M1wxXHUwMTc0IisKLSAgICAiXDFcMFwxMVx1MDE3NFwxXDBcNlx1MDE3NFwxXDBcNDdcdTAxNzRcMVwwXDE1XHUwMTc0IisKLSAgICAiXDFcMFwzXHUwMTc0XDFcdTAxNzVcNVx1MDE3NFwxXDBcM1x1MDE3NFwxXHUwMTc1XDJcdTAxNzQiKwotICAgICJcMVwwXDNcdTAxNzRcMVx1MDE3NVw0M1x1MDE3NFwxXHUwMWRjXDE0XHUwMTc0XDIwXDBcMVx1MDE3NyIrCi0gICAgIlw1MVwwXDFcdTAxZGRcMzRcMFwxXHUwMWRlXDE1XDBcM1x1MDFkZVwyXDBcMVx1MDFkZSIrCi0gICAgIlwxMVwwXDFcdTAxZGVcMVwwXDJcdTAxZGVcN1wwXDFcdTAxZGVcMlwwXDJcdTAxZGUiKwotICAgICJcNlwwXDFcdTAxZGVcMTFcMFwxXDExMlwxXHUwMWRmXDJcMTEyXDZcMFwxXDExMiIrCi0gICAgIlw2XDBcNlwxMTJcMVwwXDEzXDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMiIrCi0gICAgIlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxMTJcNlwwXDFcMTEyIisKLSAgICAiXDZcMFw2XDExMlwxXDBcMTFcMTEyXDFcdTAxZTBcMVwxMTJcMVwwXDFcdTAxZTAiKwotICAgICJcMTJcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlwxMlwzNzQiKwotICAgICJcMVwzNzZcM1wzNzRcMVwwXDcwXDM3NFwxNFx1MDEwMFwxXDM3NlwxXHUwMTAwXDFcMCIrCi0gICAgIlw3MFx1MDEwMFw2XDBcM1wxNjZcMVx1MDFlMVw2XDBcMVwxNjZcNlwwXDZcMTY2IisKLSAgICAiXDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwyXDBcMVwxNjZcMVx1MDE4NFwyXHUwMTg1XDFcdTAxODZcMVx1MDE4NFwxXHUwMTg1XDRcdTAxODQiKwotICAgICJcMVx1MDE4NVwxXHUwMTg0XDFcdTAxODVcMlx1MDE4NFwxXHUwMTg1XDZcdTAxODRcMVx1MDE4NVw1Nlx1MDE4NCIrCi0gICAgIlwxXHUwMWUyXDFcdTAxODRcMTA1XHUwMTg1XDFcdTAxZTNcMVx1MDE4NVwxXHUwMTg3XDJcdTAxODhcMVx1MDE4OSIrCi0gICAgIlwxXHUwMTg3XDFcdTAxODhcNFx1MDE4N1wxXHUwMTg4XDFcdTAxODdcMVx1MDE4OFwyXHUwMTg3XDFcdTAxODgiKwotICAgICJcNlx1MDE4N1wxXHUwMTg4XDU2XHUwMTg3XDFcdTAxZTJcMVx1MDE4N1wxMDVcdTAxODhcMVx1MDFlNFwxXHUwMTg4IisKLSAgICAiXDQxXDBcMVx1MDFlNVwxNFwwXDFcdTAxZTVcNjNcMFwyXHUwMWU2XDEwM1wwXDJcdTAxZTciKwotICAgICJcMTE1XDBcMVx1MDFlOFwxNFwwXDFcdTAxZThcNjNcMFwyXHUwMWU5XDUyXDBcMTRcdTAxMjMiKwotICAgICJcMVx1MDEyMVwxXHUwMTIzXDFcMFw3MFx1MDEyM1wzXDBcMlx1MDFlYVwxXDBcNFx1MDFlYSIrCi0gICAgIlwyXDBcMVx1MDEyNVwxXHUwMWVhXDFcMFw0XHUwMWVhXDFcMFwxMVx1MDFlYVwxXDAiKwotICAgICJcNDBcdTAxZWFcMlwwXDRcdTAxZWFcMlwwXDFcdTAxZWFcMTRcdTAxMzNcMVx1MDEzMVwxXHUwMTMzIisKLSAgICAiXDFcMFw3MFx1MDEzM1wzXDBcMlx1MDFlYlwxXDBcNFx1MDFlYlwyXDBcMVx1MDEzNSIrCi0gICAgIlwxXHUwMWViXDFcMFw0XHUwMWViXDFcMFwxMVx1MDFlYlwxXDBcNDBcdTAxZWJcMlwwIisKLSAgICAiXDRcdTAxZWJcMlwwXDFcdTAxZWJcMlwyMzFcMVwwXDRcMjMxXDFcdTAxZWNcMTAxXDIzMSIrCi0gICAgIlwxXDBcMzNcMjMxXDFcdTAxZWRcNTBcMjMxXDE0XHUwMTNkXDFcdTAxM2JcMVx1MDEzZFwxXDAiKwotICAgICJcNzBcdTAxM2RcM1wwXDJcdTAxZWVcMVwwXDRcdTAxZWVcMlwwXDFcdTAxM2ZcMVx1MDFlZSIrCi0gICAgIlwxXDBcNFx1MDFlZVwxXDBcMTFcdTAxZWVcMVwwXDQwXHUwMWVlXDJcMFw0XHUwMWVlIisKLSAgICAiXDJcMFwxXHUwMWVlXDJcMjQwXDFcMFw0XDI0MFwxXHUwMWVmXDEwMVwyNDBcMVwwIisKLSAgICAiXDMzXDI0MFwxXHUwMWYwXDUwXDI0MFwyXDBcMVx1MDFmMVwxMDRcMFw3XDI2M1wxXHUwMWYyIisKLSAgICAiXDJcMjYzXDFcMFwxXDI2M1wxXDBcMVx1MDE0Ylw2N1wyNjNcMVwwXDFcMjYzIisKLSAgICAiXDEyXHUwMTRlXDFcMFwxXHUwMTRlXDFcMFwxXHUwMTRlXDFcMFw3MFx1MDE0ZVw3XHUwMTRmIisKLSAgICAiXDFcdTAxZjNcNFx1MDE0ZlwxXHUwMTUwXDEwNlx1MDE0ZlwxXHUwMTUwXDIxXHUwMTRmXDFcdTAxZjRcNTBcdTAxNGYiKwotICAgICJcN1x1MDE1M1wxXHUwMWY1XDJcdTAxNTNcMVx1MDE1NFwxMDZcdTAxNTNcMVx1MDE1NFwyM1x1MDE1M1wxXHUwMWY2IisKLSAgICAiXDUwXHUwMTUzXDdcMzAxXDFcdTAxZjdcMlwzMDFcMVwwXDcxXDMwMVwxXHUwMTU3XDFcMCIrCi0gICAgIlwxXDMwMVwxMlx1MDFmOFwxXHUwMWY5XDcyXHUwMWY4XDFcMFwxXHUwMWY4XDdcMzA1XDFcdTAxZmEiKwotICAgICJcNFwzMDVcMVwwXDY3XDMwNVwxXHUwMTVhXDFcMFwxXDMwNVwxNFx1MDFmYlwxXHUwMWY5IisKLSAgICAiXDcwXHUwMWZiXDFcMFwxXHUwMWZiXDdcMzEwXDFcdTAxZmNcMlwzMTBcMVwwXDFcMzEwIisKLSAgICAiXDFcMFw3MFwzMTBcMVwwXDFcMzEwXDdcdTAxNWZcMVx1MDFmZFw0XHUwMTVmXDFcdTAxNjAiKwotICAgICJcMTA2XHUwMTVmXDFcdTAxNjBcMjFcdTAxNWZcMVx1MDFmZVw1MFx1MDE1Zlw3XHUwMTYzXDFcdTAxZmZcMlx1MDE2MyIrCi0gICAgIlwxXHUwMTY0XDEwNlx1MDE2M1wxXHUwMTY0XDIzXHUwMTYzXDFcdTAyMDBcNTBcdTAxNjNcN1wzMjZcMVx1MDIwMSIrCi0gICAgIlwyXDMyNlwxXDBcNzFcMzI2XDFcdTAxNjdcMVwwXDFcMzI2XDEyXHUwMjAyXDFcdTAyMDMiKwotICAgICJcNzJcdTAyMDJcMVwwXDFcdTAyMDJcN1wzMzJcMVx1MDIwNFw0XDMzMlwxXDBcNjdcMzMyIisKLSAgICAiXDFcdTAxNmFcMVwwXDFcMzMyXDE0XHUwMjA1XDFcdTAyMDNcNzBcdTAyMDVcMVwwXDFcdTAyMDUiKwotICAgICJcMzdcMFwxXHUwMjA2XDE0MVwwXDFcdTAxZGNcMzRcMFwxXHUwMWRlXDE1XDBcM1x1MDFkZSIrCi0gICAgIlwyXDBcMVx1MDFkZVwxMVwwXDFcdTAxZGVcMVwwXDJcdTAxZGVcN1wwXDFcdTAxZGUiKwotICAgICJcMVwwXDFcdTAxZGRcMlx1MDFkZVw2XDBcMVx1MDFkZVwxMVwwXDRcMTEyXDZcMCIrCi0gICAgIlwxXDExMlw2XDBcNlwxMTJcMVwwXDdcMTEyXDFcdTAyMDdcM1wxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwIisKLSAgICAiXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwXDZcMTEyXDFcdTAyMDgiKwotICAgICJcNFwxMTJcMVwwXDEzXDExMlwxXDBcMVwxMTJcMVx1MDIwOFwyXDExMlwxXDAiKwotICAgICJcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcNlwxNjZcMVx1MDIwOVw0XDE2NlwxXDBcNlwxNjZcMVx1MDIwYSIrCi0gICAgIlw0XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNTNcMCIrCi0gICAgIlwxXHUwMjBiXDVcMFwxXHUwMjBiXDczXDBcMVx1MDIwY1wxNFwwXDFcdTAyMGNcNjZcMCIrCi0gICAgIlwxXHUwMjBkXDExXDBcMVx1MDIwZFw3NFwwXDFcdTAyMGVcMTFcMFwxXHUwMjBlXDc3XDAiKwotICAgICJcMVx1MDIwZlwxNFwwXDFcdTAyMGZcMjNcMFwyXDIzMVwxXDBcMzRcMjMxXDFcdTAyMTAiKwotICAgICJcNDdcMjMxXDJcMjQwXDFcMFwzNFwyNDBcMVx1MDIxMVw0N1wyNDBcMTRcdTAxNGZcMVx1MDE1MCIrCi0gICAgIlwyMlx1MDE0ZlwxXHUwMjEyXDQ3XHUwMTRmXDEyXHUwMTUzXDFcdTAxNTRcMjRcdTAxNTNcMVx1MDIxM1w0N1x1MDE1MyIrCi0gICAgIlwxMlx1MDFmOFwxXHUwMWI3XDcxXHUwMWY4XDFcdTAyMTRcMVx1MDFiN1wxXHUwMWY4XDE0XHUwMWZiXDFcdTAxYmQiKwotICAgICJcNjdcdTAxZmJcMVx1MDIxNVwxXHUwMWJkXDFcdTAxZmJcMTRcdTAxNWZcMVx1MDE2MFwyMlx1MDE1ZlwxXHUwMjE2IisKLSAgICAiXDQ3XHUwMTVmXDEyXHUwMTYzXDFcdTAxNjRcMjRcdTAxNjNcMVx1MDIxN1w0N1x1MDE2M1wxMlx1MDIwMlwxXHUwMWQxIisKLSAgICAiXDcxXHUwMjAyXDFcdTAyMThcMVx1MDFkMVwxXHUwMjAyXDE0XHUwMjA1XDFcdTAxZDdcNjdcdTAyMDVcMVx1MDIxOSIrCi0gICAgIlwxXHUwMWQ3XDFcdTAyMDVcNDBcMFwxXHUwMjFhXDU0XDBcNFwxMTJcNlwwXDFcMTEyIisKLSAgICAiXDZcMFw2XDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMlwxXHUwMjFiXDZcMTEyIisKLSAgICAiXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxMTIiKwotICAgICJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDBcM1wxMTJcMVx1MDIxY1w3XDExMiIrCi0gICAgIlwxXDBcNFwxMTJcMVx1MDIxY1w2XDExMlwxXDBcNFwxMTJcMVwwXDExXDExMiIrCi0gICAgIlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxXHUwMjFkXDFcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDZcMTY2XDFcMFwxMFwxNjZcMVx1MDIxZVwyXDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw1NFwwXDFcdTAyMWYiKwotICAgICJcMjRcMFwxXHUwMjFmXDUyXDBcMVx1MDIyMFwyMFwwXDFcdTAyMjBcNzBcMFwxXHUwMjIxIisKLSAgICAiXDEzXDBcMVx1MDIyMVw1M1wwXDJcdTAyMjJcMTEyXDBcMVx1MDIyM1wzNVwwXDFcdTAyMjMiKwotICAgICJcMTJcMFwyXDIzMVwxXDBcMzVcMjMxXDFcdTAyMjRcNDZcMjMxXDJcMjQwXDFcMCIrCi0gICAgIlwzNVwyNDBcMVx1MDIyNVw0NlwyNDBcMTRcdTAxNGZcMVx1MDE1MFwyM1x1MDE0ZlwxXHUwMjI2XDQ2XHUwMTRmIisKLSAgICAiXDEyXHUwMTUzXDFcdTAxNTRcMjVcdTAxNTNcMVx1MDIyN1w0Nlx1MDE1M1wxMlx1MDFmOFwxXHUwMjI4XDcxXHUwMWY4IisKLSAgICAiXDFcdTAyMTRcMVx1MDFiN1wxXHUwMWY4XDE0XHUwMWZiXDFcdTAyMjlcNjdcdTAxZmJcMVx1MDIxNVwxXHUwMWJkIisKLSAgICAiXDFcdTAxZmJcMTRcdTAxNWZcMVx1MDE2MFwyM1x1MDE1ZlwxXHUwMjJhXDQ2XHUwMTVmXDEyXHUwMTYzXDFcdTAxNjQiKwotICAgICJcMjVcdTAxNjNcMVx1MDIyYlw0Nlx1MDE2M1wxMlx1MDIwMlwxXHUwMjJjXDcxXHUwMjAyXDFcdTAyMThcMVx1MDFkMSIrCi0gICAgIlwxXHUwMjAyXDE0XHUwMjA1XDFcdTAyMmRcNjdcdTAyMDVcMVx1MDIxOVwxXHUwMWQ3XDFcdTAyMDVcNDFcMCIrCi0gICAgIlwxXHUwMjJlXDUzXDBcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw3XDExMlwxXHUwMjJmXDNcMTEyXDFcMFw0XDExMlwxXDAiKwotICAgICJcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcMTFcMTY2XDFcdTAyMzBcMVwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDZcMTY2XDFcdTAyMzFcNFwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNDNcMCIrCi0gICAgIlwxXHUwMjMyXDExXDBcMVx1MDIzMlw3MlwwXDFcdTAyMzNcMTRcMFwxXHUwMjMzXDcxXDAiKwotICAgICJcMVx1MDIzNFwxNFwwXDFcdTAyMzRcMzBcMFwyXDIzMVwxXDBcMzZcMjMxXDFcdTAyMzUiKwotICAgICJcNDVcMjMxXDJcMjQwXDFcMFwzNlwyNDBcMVx1MDIzNlw0NVwyNDBcMTRcdTAxNGZcMVx1MDE1MCIrCi0gICAgIlwyNFx1MDE0ZlwxXHUwMjM3XDQ1XHUwMTRmXDEyXHUwMTUzXDFcdTAxNTRcMjZcdTAxNTNcMVx1MDIzOFw0NVx1MDE1MyIrCi0gICAgIlwxNFx1MDE1ZlwxXHUwMTYwXDI0XHUwMTVmXDFcdTAyMzlcNDVcdTAxNWZcMTJcdTAxNjNcMVx1MDE2NFwyNlx1MDE2MyIrCi0gICAgIlwxXHUwMjNhXDQ1XHUwMTYzXDQwXDBcMVx1MDIzYlw1NFwwXDRcMTEyXDZcMFwxXDExMiIrCi0gICAgIlw2XDBcNVwxMTJcMVx1MDIzY1wxXDBcMTNcMTEyXDFcMFwxM1wxMTJcMVwwIisKLSAgICAiXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcdTAyM2QiKwotICAgICJcNlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFw1XDE2NlwxXHUwMjNlIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDJcMjMxXDFcMFwzNVwyMzFcMVx1MDIzZlw0NlwyMzFcMlwyNDBcMVwwIisKLSAgICAiXDM1XDI0MFwxXHUwMjQwXDQ2XDI0MFwxNFx1MDE0ZlwxXHUwMTUwXDIzXHUwMTRmXDFcdTAyNDFcNDZcdTAxNGYiKwotICAgICJcMTJcdTAxNTNcMVx1MDE1NFwyNVx1MDE1M1wxXHUwMjQyXDQ2XHUwMTUzXDE0XHUwMTVmXDFcdTAxNjBcMjNcdTAxNWYiKwotICAgICJcMVx1MDI0M1w0Nlx1MDE1ZlwxMlx1MDE2M1wxXHUwMTY0XDI1XHUwMTYzXDFcdTAyNDRcNDZcdTAxNjNcMzVcMCIrCi0gICAgIlwxXHUwMjQ1XDU3XDBcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDAiKwotICAgICJcNVwxMTJcMVx1MDI0Nlw1XDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMlwxXDAiKwotICAgICJcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwxXDE2NlwxXHUwMjQ3XDdcMTY2XDJcMFwxXDE2NlwyXDIzMVwxXDBcMzJcMjMxIisKLSAgICAiXDFcdTAyNDhcNTFcMjMxXDJcMjQwXDFcMFwzMlwyNDBcMVx1MDI0OVw1MVwyNDBcMTRcdTAxNGYiKwotICAgICJcMVx1MDE1MFwyMFx1MDE0ZlwxXHUwMjRhXDUxXHUwMTRmXDEyXHUwMTUzXDFcdTAxNTRcMjJcdTAxNTNcMVx1MDI0YiIrCi0gICAgIlw1MVx1MDE1M1wxNFx1MDE1ZlwxXHUwMTYwXDIwXHUwMTVmXDFcdTAyNGNcNTFcdTAxNWZcMTJcdTAxNjNcMVx1MDE2NCIrCi0gICAgIlwyMlx1MDE2M1wxXHUwMjRkXDUxXHUwMTYzXDZcMFw0XDExMlw2XDBcMVwxMTJcNlwwIisKLSAgICAiXDZcMTEyXDFcMFw3XDExMlwxXHUwMjRlXDNcMTEyXDFcMFwxM1wxMTJcMVwwIisKLSAgICAiXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcdTAyNGYiKwotICAgICJcNlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMCIrCi0gICAgIlw0XDExMlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMFwxM1wxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVx1MDI1MFw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTBcMTY2XDFcdTAyNTEiKwotICAgICJcMlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwIisKLSAgICAiXDVcMTEyXDFcdTAyNTJcNVwxMTJcMVwwXDEzXDExMlwxXDBcNFwxMTJcMVwwIisKLSAgICAiXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDRcMTY2XDFcdTAyNTNcNlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTEyXDZcMCIrCi0gICAgIlwxXDExMlw2XDBcNlwxMTJcMVwwXDVcMTEyXDFcdTAyNTRcNVwxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDVcMTY2XDFcdTAyNTUiKwotICAgICJcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcNFwxMTJcMVx1MDI1Nlw2XDExMlwxXDBcNFwxMTJcMVwwIisKLSAgICAiXDExXDExMlwyXDBcMVwxMTJcNlx1MDI1N1w0XHUwMjU4XDZcdTAyNTdcMVx1MDI1OFw1XHUwMjU3IisKLSAgICAiXDFcMFw2XHUwMjU4XDFcdTAyNTdcMTNcdTAyNThcMVx1MDI1N1wxM1x1MDI1OFwxXHUwMjU3XDRcdTAyNTgiKwotICAgICJcMVx1MDI1N1wxMVx1MDI1OFwyXHUwMjU3XDFcdTAyNThcNDJcMFwxXHUwMjU5XDNcMFwxXHUwMjVhIisKLSAgICAiXDdcMFwxXHUwMjViXDFcdTAyNWNcMjFcMFwxXHUwMjVkXDEzXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcNFwxNjZcMVx1MDI1ZVwzXDE2NlwxXHUwMjVmIisKLSAgICAiXDJcMTY2XDFcMFw0XDE2NlwxXHUwMjYwXDFcdTAyNjFcNVwxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFw2XDE2NlwxXHUwMjYyXDJcMTY2XDJcMFwxXDE2Nlw1N1wwXDFcdTAyNjMiKwotICAgICJcNzdcMFwxXHUwMjY0XDExNVwwXDFcdTAyNjVcMTA1XDBcMVx1MDI2NlwxMDdcMFwxXHUwMjY3IisKLSAgICAiXDM1XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFw1XDE2NlwxXHUwMjY4XDVcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2IisKLSAgICAiXDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcdTAyNjlcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDI2YVw1XDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI2YiIrCi0gICAgIlw2XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNVwxNjZcMVx1MDI2Y1w1XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNDRcMFwxXHUwMjZkXDEzNlwwXDFcdTAyNmVcMTA3XDBcMVx1MDI2Zlw2N1wwIisKLSAgICAiXDFcdTAyNzBcMTI1XDBcMVx1MDI3MVwxN1wwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDZcMTY2XDFcdTAyNzJcNFwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMVwxNjZcMVx1MDI3M1w3XDE2NlwyXDBcMVwxNjZcNlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMlwxNjZcMVx1MDI3NFw2XDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI3NVw2XDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMlwxNjZcMVx1MDI3Nlw2XDE2NlwyXDBcMVwxNjZcNDZcMFwxXHUwMjc3XDc0XDAiKwotICAgICJcMVx1MDI3OFwxMDZcMFwxXHUwMjc5XDExNlwwXDFcdTAyN2FcMTA1XDBcMVx1MDI3Ylw1MVwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEwXDE2NlwxXHUwMjdjIisKLSAgICAiXDJcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcdTAyN2QiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2IisKLSAgICAiXDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXHUwMjdlXDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDZcMTY2XDFcdTAyN2ZcNFwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDVcMTY2XDFcdTAyODBcNVwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNTdcMCIrCi0gICAgIlwxXHUwMjgxXDEzMVwwXDFcdTAyODJcNTJcMFwxXHUwMjgzXDEwNlwwXDFcdTAyODRcNDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDVcMTY2XDFcdTAyODVcNVwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDdcMTY2XDFcdTAyODYiKwotICAgICJcMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFwxMFwxNjZcMVx1MDI4N1wyXDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTBcMTY2XDFcdTAyODhcMlwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcMTAzXDAiKwotICAgICJcMVx1MDI4OVw2M1wwXDFcdTAyNzFcMTMxXDBcMVx1MDI3YlwxMDZcMFwxXHUwMjhhXDExXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMFwxNjZcMVx1MDI4YlwyXDBcMVwxNjYiKwotICAgICJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcNlwxNjZcMVx1MDI3Nlw0XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjYiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTBcMTY2IisKLSAgICAiXDFcdTAyODBcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDEwXDE2NlwxXHUwMjhjXDJcMFwxXDE2NlwzNFwwXDFcdTAyNzFcMTU0XDBcMVx1MDI4ZCIrCi0gICAgIlwxMlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVx1MDI3NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDdcMTY2XDFcdTAyOGUiKwotICAgICJcMVwxNjZcMlwwXDFcMTY2XDU2XDBcMVx1MDI3MVwzNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI3NiIrCi0gICAgIlw2XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjYiOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgLy8gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDksICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDksIAotICAgICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDksICA5LCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDMsICAzLCAgMywgCi0gICAgIDMsICAzLCAgMywgIDksICA5LCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDAsICA5LCAgMSwgIDIsICAxLCAgMiwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAxLCAKLSAgICAgOSwgIDksICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgCi0gICAgIDAsICAxLCAgOSwgIDAsICA5LCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMCwgIDEsIAotICAgICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDEsICAwLCAgMCwgCi0gICAgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsIAotICAgICAxLCAgMSwgIDAsICAwLCAgOSwgIDksICA5LCAgMCwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDIsIDEzLCAKLSAgICAgMywgIDIsICAyLCAxMywgIDMsICAyLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAyLCAxMywgCi0gICAgIDMsICAyLCAgMiwgMTMsICAzLCAgMiwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgIDAsICA5LCAgOSwgIDksIAotICAgICAwLCAgMCwgIDEsICAxLCAgMSwgIDksICAwLCAgMCwgMTMsICA5LCAxMywgIDksICA5LCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMywgIDIsICAyLCAgMywgIDIsICAyLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDIsICAzLCAgMywgIDMsICAyLCAgMiwgIDMsICAzLCAKLSAgICAgMywgIDIsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMiwgIDMsICAzLCAgMywgIDIsICAyLCAgMywgIDMsICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsIAotICAgICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDksICA5LCAgMCwgIDEsICA5LCAgMCwgIDEsICAxLCAKLSAgICAgMSwgIDUsIDEzLCAxMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgCi0gICAgIDksICAxLCAgMywgIDIsICAzLCAgMiwgIDEsICAwLCAgOSwgIDEsICAwLCAgMSwgIDMsICAyLCAgMywgIDIsIAotICAgICAxLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAKLSAgICAgMSwgIDIsICAyLCAgMCwgIDAsICAyLCAgMiwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgCi0gICAgIDAsICA5LCAgOSwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDIsICAyLCAgMSwgIDEsICAwLCAgMSwgIDEsIAotICAgICAxLCAgOSwgIDksICA5LCAgMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMiwgIDIsICAyLCAgMiwgIDksICAxLCAgMSwgIDEsICAxLCAgMywgIDMsICAzLCAgMywgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAKLSAgICAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOwotCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JLy8gYSAiaGludCIgYXMgdG8gd2hhdCBhbiBlbWJlZGRlZCByZWdpb24gc2hvdWxkIGJlIGV2YWx1YXRlZAotCXByaXZhdGUgU3RyaW5nIGZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JLy8gYSAiaGludCIgYXMgdG8gd2hhdCBzdGF0ZSB0byBlbnRlciBvbmNlIGFuIGVtYmVkZGVkIHJlZ2lvbiBoYXMKLQkvLyAgIGJlZW4gY29tcGxldGVkCi0JcHJpdmF0ZSBpbnQgZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCS8vIHRoZSBjb250YWluZXIgdXNlZCB0byBjcmVhdGUgZW1iZWRkZWQgcmVnaW9ucwotCXByaXZhdGUgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9DT05URVhUID0gIlBST1hZX0NPTlRFWFQiOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBpbnNpZGUgb2YgYW4gZW1iZWRkZWQgcmVnaW9uCi0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbENvbnRleHQgPSBudWxsOwotCi0JLy8gdGhlIGxpc3Qgb2YgdGFnIG5hbWUgQmxvY2tNYXJrZXJzCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCXByaXZhdGUgTGlzdCBmTmVzdGFibGVQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCi0JLy8gd2hlcmUgdGhlIGxhc3QgaW50ZXJuYWwgY29udGFpbmVyIGJsb2NrIHdhcyBmb3VuZAotCXByaXZhdGUgaW50IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7Ci0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBmRm9yYmlkSlNQID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBpbnQgZkVMbGV2ZWwgPSAwOwotCi0JcHJpdmF0ZSBKU1BQYXJzZXJSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gbmV3IEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkoKTsKLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCQlyZXR1cm47Ci0JCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcikgewotCQlmTmVzdGFibGVQcmVmaXhlcy5hZGQobWFya2VyKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCkgewotCQlyZXR1cm4gZk5lc3RhYmxlUHJlZml4ZXM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGFibGUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJLy9JdGVyYXRvciBibG9ja3MgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOwotCQkvL3doaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJLy8JVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJLy8JU3RyaW5nIG1hcmtlck5hbWUgPSBtYXJrZXIuZ2V0VGFnTmFtZSgpOwotCQkvLwlpZih0YWdOYW1lLmxlbmd0aCgpID4gbWFya2VyTmFtZS5sZW5ndGgoKSArIDEgJiYgdGFnTmFtZS5zdGFydHNXaXRoKG1hcmtlck5hbWUpICYmIHRhZ05hbWUuY2hhckF0KG1hcmtlck5hbWUubGVuZ3RoKCkpID09ICc6JykgewotCQkvLwkJcmV0dXJuIG1hcmtlci5pc0dsb2JhbCgpIHx8IGdldE9mZnNldCgpID49IG1hcmtlci5nZXRNYXJrZXIoKS5nZXRTdGFydCgpOwotCQkvLwl9Ci0JCS8vfQotCQkvL3JldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyBuYW1lKSB7Ci0JCWlmIChmTmVzdGFibGVQcmVmaXhlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBuZXN0YWJsZXMgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKG5lc3RhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoKChUYWdNYXJrZXIpIG5lc3RhYmxlcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCQluZXN0YWJsZXMucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWZCbG9ja01hcmtlcnMucmVtb3ZlKG1hcmtlcik7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JCWlmIChmQmxvY2tNYXJrZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCgoQmxvY2tNYXJrZXIpIGJsb2Nrcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHModGFnbmFtZSkpCi0JCQkJCWJsb2Nrcy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFRhZ05hbWUpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG51bGwsIGVuZFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzKSB7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBlbmRUeXBlcywgbnVsbCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFR5cGUpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG5ldyBTdHJpbmdbXXtlbmRUeXBlfSwgbnVsbCk7Ci0JfQotCS8qKgotCSAqICB1c2VyIG1ldGhvZCAKLQkgKiAKLQkgKiBBc3NlbWJsZXMgYW4gZW1iZWRkZWQgY29udGFpbmVyIGJlZ2lubmluZyB3aXRoIHRoZSBnaXZlbiBzdGFydFR5cGUgYXMKLQkgKiB0aGUgZmlyc3QgQ29udGV4dFJlZ2lvbiB3aXRoaW4gaXQgYW5kIG9mIHRoZSB0eXBlIGZFbWJlZGRlZEhpbnQuICBUaGUKLQkgKiBlbmRUeXBlc1tdIGFycmF5IGNvbnRhaW5zIHRoZSBjb250ZXh0IHR5cGVzIHRoYXQgd2lsbCBjYXVzZSBhIHN1Y2Nlc3NmdWwKLQkgKiBleGl0LiAgVXNlIG9mIHRoZSBlbmRUYWdOYW1lIHBhcmFtZXRlciBhbHRlcnMgdGhpcyBiZWhhdmlvciB0byBmb3JjZSBhbgotCSAqIGV4aXQgb24gYW4gWE1MX1RBR19DTE9TRSBhZnRlciBzZWVpbmcgYW4gWE1MX1RBR19OQU1FIHdob3NlIHNpZ25pZmljYW50Ci0JICogdGV4dCBtYXRjaGVzIHRoZSBlbmRUYWdOYW1lIFN0cmluZy4gIEFsbCBjb250ZW50cyBpbiBiZXR3ZWVuIGFyZQotCSAqIGluc2lnbmlmaWNhbnQsIGFuZCB5ZXMsIHRoaXMgbWVhbnMgY29tbWVudHMgYXJlIGFsbG93ZWQgaW5zaWRlLgotCSAqKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmdbXSBlbmRUeXBlcywgU3RyaW5nIGVuZFRhZ05hbWUpIHsKLQkJLy8gdGhlIGNvbnRleHQgb2YgdGhlIHJlZ2lvbiBiZWluZyBhZGRlZCB0byB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCWludGVybmFsQ29udGV4dCA9IHN0YXJ0VHlwZTsKLQkJLy8ga2VlcCB0cmFjayBvZiB3aGVyZSB0aGlzIGNvbnRhaW5lciBiZWdhbjsgdG8gcHJvdmlkZSByZWxhdGl2ZSBpbmRlY2VzIGZvciB0aGUgcmVnaW9ucwotCQlpbnQgY29udGFpbmVyU3RhcnQgPSB5eWNoYXI7Ci0JCWJvb2xlYW4gbm90RmluaXNoZWQgPSB0cnVlOwotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHdlIHNlZW0gdG8gYmUgc28gdGhhdCB0aGUgZW5kVGFnTmFtZSBjYW4gYmUgY2hlY2tlZAotCQlib29sZWFuIGlzSW5FbmRUYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpc0luRmlyc3RUYWcgPSB0cnVlOwotCQkvLyBjcmVhdGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciBhbmQgc2V0dXAgaXRzICJ0eXBlIgotCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsKLQkJCWZFbWJlZGRlZENvbnRhaW5lciA9IG5ldyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShmRW1iZWRkZWRIaW50KTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydChjb250YWluZXJTdGFydCk7Ci0JCQkvLyBUT0RPOiBwYXJlbnQgcmVnaW9uIG5lZWRzIHRvIGJlIHNldCAuLi4uIGJ1dCBub3Qgc3VyZSB3aGVyZSB0byBnZXQgaXQgZnJvbSAKLQkJCS8vCQlmRW1iZWRkZWRDb250YWluZXIuc2V0UGFyZW50KHBhcmVudFJlZ2lvbik7Ci0JCX0KLQkJY29udGFpbmVyU3RhcnQgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0U3RhcnQoKTsKLQkJd2hpbGUgKG5vdEZpbmlzaGVkKSB7Ci0JCQkvLyBhZGQgdGhlIHJlZ2lvbiB0byB0aGUgY29udGFpbmVyCi0JCQlpZiAoaW50ZXJuYWxDb250ZXh0ICE9IG51bGwgJiYgaW50ZXJuYWxDb250ZXh0ICE9IFBST1hZX0NPTlRFWFQpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCS8vIGxvbmdzY2FuIGRldGVybWluZXMgd2hldGhlciB0byBhdHRlbXB0IGEgYmxvY2tUYWdTY2FuIHdpdGhpbiB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCQkJYm9vbGVhbiBsb25nc2NhbiA9IGZhbHNlOwotCQkJCS8vIHNhdmUgdGhlIHRva2VuaXplciBzdGF0ZSBpbiBjYXNlIG9mIGEgYmxvY2sgdGFnIHNjYW4KLQkJCQlpbnQgcHJldmlvdXNTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQlTdHJpbmcgcHJldmlvdXNDdXJyZW50VGFnTmFtZSA9IGZDdXJyZW50VGFnTmFtZTsKLQkJCQlpbnQgcHJldmlvdXNQb3N0U3RhdGUgPSBmRW1iZWRkZWRQb3N0U3RhdGU7Ci0JCQkJU3RyaW5nIHByZXZpb3VzRW1iZWRkZWRIaW50ID0gZkVtYmVkZGVkSGludDsKLQkJCQkvLyBkZXRlcm1pbmUgaWYgYSBibG9jayB0YWcgc2NhbiBpcyBuZWNlc3NhcnkKLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCQkJaWYoIWlzTmVzdGFibGUoaW50ZXJuYWxUYWdOYW1lKSkgewotCQkJCQkJaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQkJCQkJCS8vIHNuYWdnZWQgYSB0YWcgbmFtZSB3ZSBzaG91bGRuJ3QgaGF2ZQotCQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQUJPUlRfRU1CRURERUQ7Ci0JCQkJCQlub3RGaW5pc2hlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX09QRU4gfHwgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gZG8gdXBrZWVwIGZvciBlbmRUYWdOYW1lIHVzYWdlOyBtdXN0IGJlIGhlcmUgc2luY2UgdGhlIG5leHQgdG9rZW4gY291bGQgYmUgdGhlIGNsb3NlCi0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCWlzSW5FbmRUYWcgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJaXNJbkZpcnN0VGFnID0gaXNJbkVuZFRhZyA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJIAlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJCQkJaWYgKGVtYmVkZGVkUmVnaW9ucy5zaXplKCkgPiAyICYmIChlbWJlZGRlZFJlZ2lvbnMuZ2V0KGVtYmVkZGVkUmVnaW9ucy5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBYTUxfVEFHX0NMT1NFICYmIChlbWJlZGRlZFJlZ2lvbnMuZ2V0KGVtYmVkZGVkUmVnaW9ucy5zaXplKCkgLSAzKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfT1BFTiAmJiBpbnRlcm5hbFRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQkJaWYgKGNvbnRhaW5zVGFnTmFtZShpbnRlcm5hbFRhZ05hbWUpKSB7Ci0JCQkJCQkJbG9uZ3NjYW4gPSB0cnVlOwotCQkJCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsb25nc2NhbikKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gaW50ZXJuYWxUYWdOYW1lOwotCQkJCS8vIHJlYWQgdGhlIG5leHQgcmVnaW9uIGFuZCBjb250ZXh0Ci0JCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCWlmIChsb25nc2NhbikgewotCQkJCQkvLyBSZXR1cm5pbmcgZnJvbSBhIGJsb2NrIHRhZyBzY2FuIHJlcXVpcmVzIHJlc3RvcmluZyBzb21lIHN0YXRlIHZhcmlhYmxlcwotCQkJCQkvLyBhcyB3ZWxsIGFzIGhhbmRsaW5nIHRoZSBibG9jayByZWdpb24gYW5kIHNldHRpbmcgdXAgZm9yIG5vcm1hbCBzY2FubmluZwotCQkJCQkvLyBpbnNpZGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lcgotCQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQkJCWxvbmdzY2FuID0gZmFsc2U7Ci0JCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IHByZXZpb3VzUG9zdFN0YXRlOwotCQkJCQlmRW1iZWRkZWRIaW50ID0gcHJldmlvdXNFbWJlZGRlZEhpbnQ7Ci0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHByZXZpb3VzQ3VycmVudFRhZ05hbWU7Ci0JCQkJCXl5YmVnaW4ocHJldmlvdXNTdGF0ZSk7Ci0JCQkJCWludGVybmFsQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJpbUdldE5leHRUb2tlbigpIGNhbGxzIG1heSB0aHJvdyBhbiBJT0V4Y2VwdGlvbgotCQkJCS8vIGNhdGNoIGFuZCBkbyBub3RoaW5nIHNpbmNlIHRoZSBpc0VPRiBjaGVjayBiZWxvdwotCQkJCS8vIHdpbGwgcHJvcGVybHkgZXhpdCBpZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGYpIHsKLQkJCQkvLyBzb21lIG90aGVyIGV4Y2VwdGlvbiBoYXBwZW5lZDsgbmV2ZXIgc2hvdWxkCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmKTsKLQkJCX0KLQkJCWJvb2xlYW4gaXNFbmRpbmdUeXBlID0geXlzdGF0ZSgpID09IFNUX0FCT1JUX0VNQkVEREVEOwotCQkJaWYoIWlzRW5kaW5nVHlwZSkgewotCQkJCS8vIGNoZWNrIGZvciBlbmRpbmcgY29udGV4dAotCQkJCWlmIChlbmRUYWdOYW1lID09IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaXNFbmRpbmdUeXBlID0gaXNFbmRpbmdUeXBlIHx8IChpbnRlcm5hbENvbnRleHQgPT0gZW5kVHlwZXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpc0VuZGluZ1R5cGUgPSAoKGlzSW5FbmRUYWcgJiYgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfQ0xPU0UpIHx8IChpc0luRmlyc3RUYWcgJiYgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTVBUWV9UQUdfQ0xPU0UpKSAmJiBpbnRlcm5hbFRhZ05hbWUgIT0gbnVsbCAmJiBpbnRlcm5hbFRhZ05hbWUuZXF1YWxzKGVuZFRhZ05hbWUpOwotCQkJCX0KLQkJCX0KLQkJCUlUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZExpc3QgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQkJbm90RmluaXNoZWQgPSBub3RGaW5pc2hlZCAmJiAoKCFpc0VuZGluZ1R5cGUpICYmICFpc0VPRigpICYmIChlbmRUYWdOYW1lICE9IG51bGwgfHwgaW50ZXJuYWxDb250ZXh0ICE9IFVOREVGSU5FRCkgJiYgIShpbnRlcm5hbENvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCAmJiAoZW1iZWRkZWRMaXN0LmdldChlbWJlZGRlZExpc3Quc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gVU5ERUZJTkVEKSk7Ci0JCX0KLQkJLy8gZmluaXNoIGFkZGluZyB0aGUgbGFzdCBjb250ZXh0Ci0JCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgewotCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsKLQkJfQotCQl5eWJlZ2luKGZFbWJlZGRlZFBvc3RTdGF0ZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JCXJldHVybiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmc7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gbmV3VmFsdWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckFsbG93c0pTUChmQ3VycmVudFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuYWxsb3dzSlNQKCk7Ci0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dCgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gbWFya2VyLmdldENvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7Ci0JCXJldHVybiBmQmxvY2tNYXJrZXJzOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoKSB7Ci0JCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7Ci0JCWJlZ2luQmxvY2tNYXJrZXJTY2FuKG5ld1RhZ05hbWUsIEJMT0NLX1RFWFQpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICogU3BlY2lhbCB0b2tlbml6ZXIgc2V0dXAuICBBbGxvd3MgdG9rZW5pemF0aW9uIHRvIGJlIGluaXRpYXRlZCBhdCB0aGUKLQkgKiBzdGFydCBvZiBhIHRleHQgYmxvY2sgd2l0aGluIGEgIm5ld1RhZ05hbWUiIHRhZy4KLQkgKgotCSAqIEV4YW1wbGU6IAotCSAqCVRva2VuaXplciB0b2tlciA9IG5ldyBUb2tlbml6ZXIoKTsKLQkgKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotCSAqCXRva2VyLnJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcigiYWZpdWhxd2tlamh0YXNpaGdhbGt3aHRxPC9zY3JpcHRlcj48L3Njcj48L3NjcmlwdD5hc2dkYXNnYSIpKTsKLQkgKgl0b2tlci5iZWdpbkJsb2NrTWFya2VyU2Nhbigic2NyaXB0IiwgQkxPQ0tfVEVYVCk7Ci0JICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLQkgKgotCSAqIFJldHVybnM6Ci0JICoJQkxPQ0tfVEVYVDogMC00MAotCSAqCVhNTF9FTkRfVEFHX09QRU46IDQxLTQyCi0JICoJWE1MX1RBR19OQU1FOiA0My00OAotCSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0JICoJWE1MX0NPTlRFTlQ6IDUwLTU3Ci0JICoKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGJsb2NrY29udGV4dCkgewotCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLQl9Ci0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gYWxsb3dKU1AgLSBjaGVjayBmb3IgYW5kIGFsbG93IGZvciBKU1AgbWFya3VwIDwlJT4KLSAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGNvbnRleHQgb2YgdGhlIHNjYW5uZWQgcmVnaW9uIGlmIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBhYm9ydFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSBzZWFyY2hTdHJpbmcgd2FzIGZvdW5kIGltbWVkaWF0ZWx5Ci0gKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBjb250ZXh0IGZvdW5kOiB0aGUgZGVzaXJlZCBjb250ZXh0IG9uIGEgbm9uLXplcm8gbGVuZ3RoIG1hdGNoLCB0aGUgYWJvcnRDb250ZXh0IG9uIGltbWVkaWF0ZSBzdWNjZXNzCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBib29sZWFuIGFsbG93SlNQLCBib29sZWFuIGFsbG93Q0RBVEEsIFN0cmluZyBzZWFyY2hDb250ZXh0LCBpbnQgZXhpdFN0YXRlLCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlib29sZWFuIHN0aWxsU2VhcmNoaW5nID0gdHJ1ZTsKLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQotCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCWludCBzZWFyY2hTdHJpbmdMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoKCk7Ci0JaW50IG4gPSAwOwotCWNoYXIgbGFzdENoZWNrQ2hhcjsKLQlpbnQgaTsKLQlib29sZWFuIHNhbWUgPSBmYWxzZTsKLQkvLyBDaGVjayBmb3IgSlNQIHN0YXJ0cyAoIjwlIikgaWYgdGhlIHRhZyBpcyBnbG9iYWwgbGlrZSBTQ1JJUFQgb3IgU1RZTEUKLQlib29sZWFuIGNoZWNrSlNQcyA9IGFsbG93SlNQICYmICFmRm9yYmlkSlNQOwotCWJvb2xlYW4gY2hlY2tlZEZvckpTUHNPbmNlID0gIWNoZWNrSlNQczsKLQlib29sZWFuIGNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSBmYWxzZTsKLQkKLQl3aGlsZSAoc3RpbGxTZWFyY2hpbmcpIHsKLQkJbiA9IDA7Ci0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuCi0JCW4gPSB5eV9hZHZhbmNlKCk7Ci0JCXdoaWxlKG4gIT0gWVlFT0YgJiYgeXlfY3VycmVudFBvcyA8IHNlYXJjaFN0cmluZ0xlbmd0aCkKLQkJCW4gPSB5eV9hZHZhbmNlKCk7Ci0vLwkJYyA9IChjaGFyKSBuOwotCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5LgotCQlpZiAobiA9PSBZWUVPRiAmJiBjaGVja2VkRm9ySlNQc09uY2UpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKioKLQkJCSAqIExvb2sgZm9yIHN0YXJ0aW5nIEpTUHMgIjwlIgotCQkJICovCi0JCQljaGVja2VkRm9ySlNQc09uY2UgPSB0cnVlOwotCQkJLy8gMSkgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCA6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIEpTUHMKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0LgotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQKLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4KLQkJCWlmKGNoZWNrSlNQcyAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgCi0JCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCArIDFdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBqc3BzdGFydGVyLmxlbmd0aCA6IFRoZXJlJ3Mgbm90IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IGNoZWNrIGZvciBhIEpTUCAyIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndAotCQkJLy8gc3BpbGwgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2hpbGUgY2hlY2tpbmcuCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmCi0JCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gMV0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSA9PSAnJScpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSAxOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMykgeXlfY3VycmVudFBvcy4uKHl5X2N1cnJlbnRQb3MranNwU3RhcnRsZW5ndGgtMSkgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLgotCQkJZWxzZSBpZihjaGVja0pTUHMgJiYgIWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X3N0YXJ0UmVhZCA+IDAgJiYKLQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsKLQkJCQljaGVja2VkSlNQc0F0U3RhcnRPbmNlID0gdHJ1ZTsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X3N0YXJ0UmVhZDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQotCi0JCQkvKioKLQkJCSAqIExvb2sgZm9yIHN0YXJ0aW5nIENEQVRBICI8IVtDREFUQVsiCi0JCQkgKi8KLQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIENEQVRBCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgQ0RBVEEgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0LgotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDxbIUNEQVRBW11dPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLgotLyoJCQlpZihjaGVja0NEQVRBICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyArIHNlYXJjaFN0cmluZ0xlbmd0aCA8IHl5X2J1ZmZlci5sZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiAKLQkJCQljaGFyc01hdGNoKGNkYXRhU3RhcnRlciwgeXlfYnVmZmVyLCAwLCB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoKSkgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJLy8gZ28gdG8gYSBzdGF0ZSB3aGVyZSBDREFUQSBjYW4gYmUgZm91bmQKLQkJCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFR5cGUoc2VhcmNoQ29udGV4dCk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydCh5eWNoYXIpOwotCQkJCX0KLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKHNlYXJjaENvbnRleHQsIHl5Y2hhciwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQlTdHJpbmcgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQlpZihjb250ZXh0LmVxdWFscyhYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfT1BFTikpIHsKLQkJCQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfT1BFTiwgWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX0NMT1NFKTsKLQkJCQl9Ci0JCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0qLy8qCi0JCQkvLyAyKSB5eV9jdXJyZW50UG9zIC0gY2RhdGFTdGFydGVyLmxlbmd0aDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgQ0RBVEEgcmlnaHQgaGVyZSBzcG90cyBiYWNrIGluIHdoYXQgd2UgY291bGQgcmVhZAotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb247IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24gKmhhdmluZyogY2xvc2VUYWdTdHJpbmdMZW5ndGggYW1vdW50IG9mIGlucHV0IHRvIHdvcmsgYXMgZGVzaWduZWQuICBNdXN0IGJlIHN1cmUgd2UgZG9uJ3QKLQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLgotCQkJZWxzZSBpZihjaGVja0NEQVRBICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9jdXJyZW50UG9zID4gMCAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYKLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAzKSB5eV9jdXJyZW50UG9zIDogQ2hlY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvbmUgdGltZQotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgaW1tZWRpYXRlbHkgaW4gdGhlIGJsb2NrIGFyZWE7IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24geXlfY3VycmVudFBvcyBlcXVhbGluZyBleGFjdGx5IHRoZSBwcmV2aW91cyBlbmQgKzEgdG8gd29yayBhcyBkZXNpZ25lZC4KLQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiAhY2hlY2tlZEZvckNEQVRBT25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJgotCQkJCQl5eV9zdGFydFJlYWQgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCArIDFdID09ICclJykgewotCQkJCWNoZWNrZWRGb3JDREFUQU9uY2UgPSB0cnVlOwotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotKi8KLQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyCi0JCQkvLyBhbmQgc2VlIGlmIGl0IG1hdGNoZXMKLQkJCWlmIChuID09IFlZRU9GKSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNhbWUgPSB0cnVlOwotCQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMKLQkJCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmKHNhbWUgJiYgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCQllbHNlIGlmKHNhbWUgJiYgIWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCQlzYW1lID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0pID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzZWFyY2hTdHJpbmcuY2hhckF0KGkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBzYWZldHkgY2hlY2sgZmFpbGVkOyBubyBtYXRjaCBpcyBwb3NzaWJsZSByaWdodCBub3cKLQkJCQllbHNlIHsKLQkJCQkJc2FtZSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgY2xvc2UgdGFncyB0byBlbnN1cmUgdGhhdCB0YXJnZXRTdHJpbmc9Ijwvc2NyaXB0IiBkb2Vzbid0IG1hdGNoCi0JCQkJLy8gIjwvc2NyaXB0UyIKLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOwotCQkJCS8vIFN1Y2NlZWQgb24gIjwvc2NyaXB0PiIgYW5kICI8L3NjcmlwdCAiCi0JCQkJaWYobGFzdENoZWNrQ2hhciA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsYXN0Q2hlY2tDaGFyKSkKLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCWlmIChuICE9IFlZRU9GIHx8IHNhbWUpIHsKLQkJLy8gV2UndmUgc3RvcHBlZCBzaG9ydCBvZiB0aGUgZW5kIG9yIGRlZmluaXRlbHkgZm91bmQgYSBtYXRjaAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJLy8gSWYgdGhlIHNlYXJjaFN0cmluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCQlpZiAoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJeXliZWdpbihpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsKLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8vIFdlIHJhbiB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBpbnB1dAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQl5eV9jdXJyZW50UG9zKys7Ci0JfQotCXl5YmVnaW4oZXhpdFN0YXRlKTsKLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCXJldHVybiBzZWFyY2hDb250ZXh0OwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOwotCXJldHVybiBkb1NjYW4oIjwvIiArIGZDdXJyZW50VGFnTmFtZSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSksIFlZSU5JVElBTCwgWVlJTklUSUFMKTsKLX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0JICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUKLQkgKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuCi0JICoKLQkgKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5Ci0JICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4KLQkgKgotCSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkCi0JICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuCi0JICovCi0JcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykKLQkJaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJCWlmIChmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gY29udGFpbmVyID0gZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXI7Ci0JCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJCQlyZXR1cm4gY29udGFpbmVyOwotCQkJfQotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQlpZiAoY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7Ci0JCQkJcmV0dXJuIGZFbWJlZGRlZENvbnRhaW5lcjsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCQllbHNlCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCQl9Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJaWYgKHl5X2F0RU9GKSB7Ci0JCQkJZlRva2VuQ291bnQrKzsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChmX2NvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCkgewotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmRW1iZWRkZWRDb250YWluZXI7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJZWxzZQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsKLQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsKLQkJfQotCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQkvLyBFT0YKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGlzY292ZXJlZCAiICsgZlRva2VuQ291bnQgKyAiIHRva2Vucy4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZUb2tlbkNvdW50Kys7Ci0JCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BUb2tlbml6ZXIoKXsKLQkJc3VwZXIoKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgSlNQVG9rZW5pemVyKGNoYXJbXSBjaGFyQXJyYXkpewotCQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgbmV3T2Zmc2V0KTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgewotCQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQkJcmVzZXQoaW4sIDApOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAqCi0JICoKLQkgKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLQkgKiB0aGF0IHJlc2V0dGluZyBhIHByZS1leGlzdGluZyB0b2tlbml6ZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLgotCSAqCi0JICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLQkgKiA8ZW0+Z2VuZXJhdGVkPC9lbT4gb3V0cHV0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBiZWZvcmUgdGhpcyBtZXRob2Qgd2FzCi0JICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJZk9mZnNldCA9IG5ld09mZnNldDsKLQkKLQkJLyogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQkKLQkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0JCi0JCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQkKLQkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0JCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXl5X21hcmtlZFBvcyA9IDA7Ci0JCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQkKLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCQotCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfc3RhcnRSZWFkID0gMDsKLQkKLQkJLyoqIAotCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkJICogZnJvbSBpbnB1dCAKLQkJICovCi0JCXl5X2VuZFJlYWQgPSAwOwotCQotCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQkKLQkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0JCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQkKLQkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0JCi0JCi0JCS8qIHVzZXIgdmFyczogKi8KLQkJZlRva2VuQ291bnQgPSAwOwotCSAKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQkJZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCQlmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCQotCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOwotCQotCQljb250ZXh0ID0gbnVsbDsKLQkJc3RhcnQgPSAwOwotCQl0ZXh0TGVuZ3RoID0gMDsKLQkJbGVuZ3RoID0gMDsKLQkKLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJCi0JCWZFTGxldmVsID0gMDsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqLwotCXB1YmxpYyBCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpIHsKLQkJSlNQVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IEpTUFRva2VuaXplcigpOwotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIAotCQkvLyBhcmUgbmV2ZXIgZGVzdHJveWVkIChlLmcuICdyZWxlYXNlJykKLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsKLQkJCWlmKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOwotCQl9Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBmTmVzdGFibGVQcmVmaXhlcy5zaXplKCk7IGkrKykgewotCQkJVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpIGZOZXN0YWJsZVByZWZpeGVzLmdldChpKTsKLQkJCWlmKG1hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZE5lc3RhYmxlUHJlZml4KG1hcmtlcik7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCQkvLyAgIFhNTF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCQlyZXR1cm4gZG9TY2FuKCItLT4iLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgWE1MX0NPTU1FTlRfVEVYVCwgU1RfWE1MX0NPTU1FTlRfRU5ELCBTVF9YTUxfQ09NTUVOVF9FTkQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5KU1BDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNjYW4gZm9yICctLSU+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkJLy8gICBKU1BfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkJLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9KU1BfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQkJcmV0dXJuIGRvU2NhbigiLS0lPiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgSlNQX0NPTU1FTlRfVEVYVCwgU1RfSlNQX0NPTU1FTlRfRU5ELCBTVF9KU1BfQ09NTUVOVF9FTkQpOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzMxNTk1XTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCA4MjA2KSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTM3NikgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3IKLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShjaGFyW10gbWFya2VyVGFnTmFtZSwgaW50IG9mZnNldCwgaW50IHRhZ25hbWVMZW5ndGgpIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBqKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgPT0gdGFnbmFtZUxlbmd0aCkgewotCQkJCWJvb2xlYW4gbWF0Y2hlc1NvRmFyID0gdHJ1ZTsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgewotCQkJCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpICE9IG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXRjaGVzU29GYXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqCi0JICogUmV0dXJuIEFMTCBvZiB0aGUgcmVnaW9ucyBzY2FubmFibGUgd2l0aGluIHRoZSByZW1haW5pbmcgdGV4dAotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlCi0JICovCi0JcHVibGljIGZpbmFsIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCXdoaWxlKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbmNlIHRoaXMgaXMgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBOT1QgdGhlIHJlY29tbWVuZGVkIAotCQkJLy8gd2F5IG9mIGdldHRpbmcgdG9rZW5zLCBtYW55IGVycm9ycyBhcmUgc2ltcGx5IGhpZGRlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcChTdHJpbmcgcykgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJKHl5bGVuZ3RoKCkgKyB5eWNoYXIpICsgIik6XCciICsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1V0aWxzLmVzY2FwZSh5eXRleHQoKSkgKyAiXCciKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgIC0gc2tlbGV0b24uc2VkICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLwotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKFN0cmluZyBtYXJrZXJUYWdOYW1lKSB7Ci0JSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2IKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIHl5X3B1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotICAgICAgeXlfd2FzX3B1c2hiYWNrID0gZmFsc2U7Ci0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIGludCB5eV9uZXh0ID0geXl0cmFuc1sgeXlfcm93TWFwW3l5X3N0YXRlXSArIHl5Y21hcFt5eV9pbnB1dF0gXTsKLSAgICAgICAgICBpZiAoeXlfbmV4dCA9PSAtMSkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIHl5X3N0YXRlID0geXlfbmV4dDsKLQotICAgICAgICAgIGludCB5eV9hdHRyaWJ1dGVzID0gWVlfQVRUUklCVVRFW3l5X3N0YXRlXTsKLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMikgPiAwICkKLSAgICAgICAgICAgIHl5X3B1c2hiYWNrUG9zID0geXlfY3VycmVudFBvczsKLQotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAxKSA+IDAgKSB7Ci0gICAgICAgICAgICB5eV93YXNfcHVzaGJhY2sgPSAoeXlfYXR0cmlidXRlcyAmIDQpID4gMDsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID4gMCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfd2FzX3B1c2hiYWNrKQotICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvczsKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSA2MjI6IAotICAgICAgICBjYXNlIDYyNzogCi0gICAgICAgIGNhc2UgNjM0OiAKLSAgICAgICAgY2FzZSA2Mzk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImpzcCBkaXJlY3RpdmUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NTU6IGJyZWFrOwotICAgICAgICBjYXNlIDU5NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWFNMIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjU2OiBicmVhazsKLSAgICAgICAgY2FzZSA1ODA6IAotICAgICAgICBjYXNlIDU4MzogCi0gICAgICAgIGNhc2UgNTg0OiAKLSAgICAgICAgY2FzZSA1ODU6IAotICAgICAgICBjYXNlIDU4NjogCi0gICAgICAgIGNhc2UgNTg3OiAKLSAgICAgICAgY2FzZSA1ODg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ0RBVEEgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7Ci0JcmV0dXJuIFhNTF9DREFUQV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDU3MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgianNwOnJvb3QgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gSlNQX1JPT1RfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTYzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjU5OiBicmVhazsKLSAgICAgICAgY2FzZSA1NjI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2NjA6IGJyZWFrOwotICAgICAgICBjYXNlIDU2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDY2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7Ci0gfQotICAgICAgICBjYXNlIDY2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07Ci0gfQotICAgICAgICBjYXNlIDY2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjY0OiBicmVhazsKLSAgICAgICAgY2FzZSA1MTQ6IAotICAgICAgICBjYXNlIDU1NTogCi0gICAgICAgIGNhc2UgNTU2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NjU6IGJyZWFrOwotICAgICAgICBjYXNlIDUwNDogCi0gICAgICAgIGNhc2UgNTUxOiAKLSAgICAgICAgY2FzZSA1NTI6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY2OiBicmVhazsKLSAgICAgICAgY2FzZSA0OTY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBKU1BfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjY3OiBicmVhazsKLSAgICAgICAgY2FzZSA0ODM6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0yKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiVkJMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2Njg6IGJyZWFrOwotICAgICAgICBjYXNlIDQ4MjogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJFTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY5OiBicmVhazsKLSAgICAgICAgY2FzZSA0NzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2NzA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09NTUVOVF9URVhUOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9DT01NRU5UOwotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOwotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2NzE6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3MjogCi0gICAgICAgIGNhc2UgNDkxOiAKLSAgICAgICAgY2FzZSA0OTQ6IAotICAgICAgICBjYXNlIDQ5NzogCi0gICAgICAgIGNhc2UgNDk4OiAKLSAgICAgICAgY2FzZSA1MDA6IAotICAgICAgICBjYXNlIDUwMjogCi0gICAgICAgIGNhc2UgNTA1OiAKLSAgICAgICAgY2FzZSA1MDc6IAotICAgICAgICBjYXNlIDUwODogCi0gICAgICAgIGNhc2UgNTEwOiAKLSAgICAgICAgY2FzZSA1MTI6IAotICAgICAgICBjYXNlIDUxNTogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgY29tbWVudCBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSAgewotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCXJldHVybiBKU1BfQ09NTUVOVF9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCS8vIHRoZSBjb21tZW50IGNvbnRhaW5lciBpdHNlbGYgd2lsbCBhY3QgYXMgY29tbWVudCB0ZXh0Ci0JCWZFbWJlZGRlZEhpbnQgPSBKU1BfQ09NTUVOVF9URVhUOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8qCi0JCSAqIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9uczsgbWFyayB0aGlzIG9uZSBhcyBhCi0JCSAqIGNvbW1lbnQgc28gaXQgd2lsbCBiZSBvdGhlcndpc2UgaWdub3JlZCBidXQgcHJlc2VydmVkICh3aGljaCBpcyB3aHkKLQkJICogd2UgY2FuJ3QgdXNlIHdoaXRlLXNwYWNlKQotCQkgKi8KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzgxOiAKLSAgICAgICAgY2FzZSAzODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzgwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjc1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzg6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7Ci0JZkVMbGV2ZWwrKzsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBKU1BfVkJMX0NMT1NFKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NzY6IGJyZWFrOwotICAgICAgICBjYXNlIDM3NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgNjc3OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzY6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAyKTsKLQlmRUxsZXZlbCsrOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgSlNQX0VMX0NMT1NFKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2Nzg6IGJyZWFrOwotICAgICAgICBjYXNlIDM3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2Nzk6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NzogCi0gICAgICAgIGNhc2UgNDA3OiAKLSAgICAgICAgY2FzZSA0MTU6IAotICAgICAgICBjYXNlIDQyMjogCi0gICAgICAgIGNhc2UgNDI3OiAKLSAgICAgICAgY2FzZSA0MzI6IAotICAgICAgICBjYXNlIDQzNzogCi0gICAgICAgIGNhc2UgNDQzOiAKLSAgICAgICAgY2FzZSA0NDk6IAotICAgICAgICBjYXNlIDQ1MzogCi0gICAgICAgIGNhc2UgNDU4OiAKLSAgICAgICAgY2FzZSA0NjM6IAotICAgICAgICBjYXNlIDQ2OTogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZXhwcmVzc2lvbiBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhbiBleHByZXNzaW9uIG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiBKU1BfRVhQUkVTU0lPTl9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VYUFJFU1NJT05fT1BFTiwgSlNQX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjgwOiBicmVhazsKLSAgICAgICAgY2FzZSAzNjY6IAotICAgICAgICBjYXNlIDQwNjogCi0gICAgICAgIGNhc2UgNDE0OiAKLSAgICAgICAgY2FzZSA0MjE6IAotICAgICAgICBjYXNlIDQyNjogCi0gICAgICAgIGNhc2UgNDMxOiAKLSAgICAgICAgY2FzZSA0MzY6IAotICAgICAgICBjYXNlIDQ0MjogCi0gICAgICAgIGNhc2UgNDQ4OiAKLSAgICAgICAgY2FzZSA0NTI6IAotICAgICAgICBjYXNlIDQ1NzogCi0gICAgICAgIGNhc2UgNDYyOiAKLSAgICAgICAgY2FzZSA0Njg6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGRlY2xhcmF0aW9uIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiBKU1BfREVDTEFSQVRJT05fT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfREVDTEFSQVRJT05fT1BFTiwgSlNQX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjgxOiBicmVhazsKLSAgICAgICAgY2FzZSAzNjU6IAotICAgICAgICBjYXNlIDQwNTogCi0gICAgICAgIGNhc2UgNDEzOiAKLSAgICAgICAgY2FzZSA0MjA6IAotICAgICAgICBjYXNlIDQyNTogCi0gICAgICAgIGNhc2UgNDMwOiAKLSAgICAgICAgY2FzZSA0MzU6IAotICAgICAgICBjYXNlIDQ0MTogCi0gICAgICAgIGNhc2UgNDQ3OiAKLSAgICAgICAgY2FzZSA0NTE6IAotICAgICAgICBjYXNlIDQ1NjogCi0gICAgICAgIGNhc2UgNDYxOiAKLSAgICAgICAgY2FzZSA0Njc6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGRpcmVjdGl2ZSBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIGRlY2xhcmF0aW9uIG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZGlyZWN0aXZlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7Ci0JCXJldHVybiBKU1BfRElSRUNUSVZFX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUUpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ESVJFQ1RJVkVfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9ESVJFQ1RJVkVfQ0xPU0UsIEpTUF9DTE9TRX0pOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2ODI6IGJyZWFrOwotICAgICAgICBjYXNlIDM1NTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfRFFVT1RFU19FTkQpOwotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODM6IGJyZWFrOwotICAgICAgICBjYXNlIDM1MTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfU1FVT1RFU19FTkQpOwotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM0OTogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbCsrOwotCWlmKGZFTGxldmVsID09IDEpIHsKLQkJcmV0dXJuIEpTUF9WQkxfT1BFTjsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY4NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM5OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX0RRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODY6IGJyZWFrOwotICAgICAgICBjYXNlIDMzNTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjg3OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzM6IAotICAgICAgICAgIHsgCi0JLy9TeXN0ZW0ub3V0LnByaW50bG4oSlNQX0VMX0NPTlRFTlQrICI6WyIgKyB5eXRleHQoKSArICJdIik7Ci0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODg6IGJyZWFrOwotICAgICAgICBjYXNlIDMzMjogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbCsrOwotCWlmKGZFTGxldmVsID09IDEpIHsKLQkJcmV0dXJuIEpTUF9FTF9PUEVOOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjg5OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjk6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9WQkwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI4OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX0RRVU9URURfRUwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI2OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfVkJMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgVkJMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTI6IGJyZWFrOwotICAgICAgICBjYXNlIDMyNTogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9TUVVPVEVEX0VMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTM6IGJyZWFrOwotICAgICAgICBjYXNlIDMyNDogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWludCBpbmNvbWluZ1N0YXRlID0geXlzdGF0ZSgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBlbmQgdGFnIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9FTkRfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjgzOiAKLSAgICAgICAgY2FzZSAyOTU6IAotICAgICAgICBjYXNlIDMwMTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOwotIH0KLSAgICAgICAgY2FzZSA2OTU6IGJyZWFrOwotICAgICAgICBjYXNlIDI3MTogCi0gICAgICAgICAgeyAKLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsKLQkvLyBwdXNoYmFjayB0byBqdXN0IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNrZXQKLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsKLQkvKgotCSAqIElmIHRoaXMgdGFnIGNhbiBub3QgYmUgbmVzdGVkIG9yIHdlJ3JlIGFscmVhZHkgc2VhcmNoaW5nIGZvciBhbgotCSAqIGF0dHJpYnV0ZSBuYW1lLCBlcXVhbHMsIG9yIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JaWYgKCFpc05lc3RhYmxlKHRhZ05hbWUpIHx8ICghZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0VRVUFMUyB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkpKSB7Ci0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsKLQl9Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0Ci0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTY6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgICAgeyAKLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsKLQkvLyBwdXNoYmFjayB0byBqdXN0IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNrZXQKLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsKLQkvKgotCSAqIElmIHRoaXMgdGFnIGNhbiBub3QgYmUgbmVzdGVkIG9yIHdlJ3JlIGFscmVhZHkgc2VhcmNoaW5nIGZvciBhbgotCSAqIGF0dHJpYnV0ZSBuYW1lLCBlcXVhbHMsIG9yIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JaWYgKCFpc05lc3RhYmxlKHRhZ05hbWUpIHx8ICghZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0VRVUFMUyB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkpKSB7Ci0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsKLQl9Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQkvLyBlbWJlZGRlZCBjb250YWluZXIgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIHRoZSBuYW1lIChhZ2FpbikgbmV4dAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY3OiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gWE1MX0VNUFRZX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjk4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjU6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBjb21wbGV4IGRvdWJsZSBxdW90ZWQiKTsvLyROT04tTkxTLTEkCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIzOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCB0YWcgZW1iZWRkZWQgbmFtZSBzdGFydCAtIHN0YXJ0IHRhZyIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDcwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIyOiAKLSAgICAgICAgY2FzZSAxMjc6IAotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgIGNhc2UgMjczOiAKLSAgICAgICAgY2FzZSAyNzc6IAotICAgICAgICBjYXNlIDI3ODogCi0gICAgICAgIGNhc2UgMzg3OiAKLSAgICAgICAgY2FzZSAzOTA6IAotICAgICAgICBjYXNlIDQ4MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNzAxOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA3MDI6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcwMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgY2FzZSAxMTc6IAotICAgICAgICBjYXNlIDExODogCi0gICAgICAgIGNhc2UgMjY4OiAKLSAgICAgICAgY2FzZSAzODY6IAotICAgICAgICBjYXNlIDQ4MDogCi0gICAgICAgIGNhc2UgNTIwOiAKLSAgICAgICAgY2FzZSA1MjE6IAotICAgICAgICBjYXNlIDU0MDogCi0gICAgICAgIGNhc2UgNTQxOiAKLSAgICAgICAgY2FzZSA1NTk6IAotICAgICAgICBjYXNlIDU2MDogCi0gICAgICAgIGNhc2UgNTczOiAKLSAgICAgICAgY2FzZSA1ODI6IAotICAgICAgICBjYXNlIDU5MDogCi0gICAgICAgIGNhc2UgNTkyOiAKLSAgICAgICAgY2FzZSA1OTQ6IAotICAgICAgICBjYXNlIDU5NjogCi0gICAgICAgIGNhc2UgNTk5OiAKLSAgICAgICAgY2FzZSA2MDU6IAotICAgICAgICBjYXNlIDYwNjogCi0gICAgICAgIGNhc2UgNjA3OiAKLSAgICAgICAgY2FzZSA2MDg6IAotICAgICAgICBjYXNlIDYwOTogCi0gICAgICAgIGNhc2UgNjE1OiAKLSAgICAgICAgY2FzZSA2MTY6IAotICAgICAgICBjYXNlIDYxNzogCi0gICAgICAgIGNhc2UgNjE4OiAKLSAgICAgICAgY2FzZSA2MTk6IAotICAgICAgICBjYXNlIDYyNTogCi0gICAgICAgIGNhc2UgNjI2OiAKLSAgICAgICAgY2FzZSA2Mjg6IAotICAgICAgICBjYXNlIDYyOTogCi0gICAgICAgIGNhc2UgNjM1OiAKLSAgICAgICAgY2FzZSA2MzY6IAotICAgICAgICBjYXNlIDYzNzogCi0gICAgICAgIGNhc2UgNjM4OiAKLSAgICAgICAgY2FzZSA2NDQ6IAotICAgICAgICBjYXNlIDY0NTogCi0gICAgICAgIGNhc2UgNjQ2OiAKLSAgICAgICAgY2FzZSA2NDc6IAotICAgICAgICBjYXNlIDY1MDogCi0gICAgICAgIGNhc2UgNjUxOiAKLSAgICAgICAgY2FzZSA2NTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzA0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWlmKGlzQmxvY2tNYXJrZXIoKSkgewotCQlmRW1iZWRkZWRIaW50ID0gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0JMT0NLX1RBR19TQ0FOOwotICAgICAgICAJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JfQotCWVsc2UKLSAgICAgICAgCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA3OiAKLSAgICAgICAgY2FzZSAxMTE6IAotICAgICAgICBjYXNlIDI2MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3MDY6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNzA3OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MDg6IGJyZWFrOwotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGRpcmVjdGl2ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UpOwotCXJldHVybiBKU1BfRElSRUNUSVZFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTg6IAotICAgICAgICBjYXNlIDk5OiAKLSAgICAgICAgY2FzZSAxMDA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBjb2RlIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIGRvU2NhbigiJT4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBKU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5UKTsKLSB9Ci0gICAgICAgIGNhc2UgNzEwOiBicmVhazsKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDk3OiAKLSAgICAgICAgY2FzZSAyNTM6IAotICAgICAgICBjYXNlIDI1NDogCi0gICAgICAgIGNhc2UgMjU3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3MTE6IGJyZWFrOwotICAgICAgICBjYXNlIDkzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDcxMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcxMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzE0OiBicmVhazsKLSAgICAgICAgY2FzZSA4NDogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICBjYXNlIDI0NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3MTU6IGJyZWFrOwotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNzE2OiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgIGNhc2UgMTk5OiAKLSAgICAgICAgY2FzZSAyMDA6IAotICAgICAgICBjYXNlIDIwMzogCi0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICBjYXNlIDIxNzogCi0gICAgICAgIGNhc2UgMjE4OiAKLSAgICAgICAgY2FzZSAzNjA6IAotICAgICAgICBjYXNlIDM2MzogCi0gICAgICAgIGNhc2UgNDQ2OiAKLSAgICAgICAgY2FzZSA0NjA6IAotICAgICAgICBjYXNlIDQ2NjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MTc6IGJyZWFrOwotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICBjYXNlIDE3OTogCi0gICAgICAgIGNhc2UgMTgyOiAKLSAgICAgICAgY2FzZSAxOTI6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMTk2OiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDMzMDogCi0gICAgICAgIGNhc2UgMzQ0OiAKLSAgICAgICAgY2FzZSAzNDc6IAotICAgICAgICBjYXNlIDQxODogCi0gICAgICAgIGNhc2UgNDE5OiAKLSAgICAgICAgY2FzZSA0MzQ6IAotICAgICAgICBjYXNlIDQ0MDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDE1OTogCi0gICAgICAgIGNhc2UgMTYwOiAKLSAgICAgICAgY2FzZSAzMjE6IAotICAgICAgICBjYXNlIDQxMjogCi0gICAgICAgIGNhc2UgNDE2OiAKLSAgICAgICAgY2FzZSA0OTU6IAotICAgICAgICBjYXNlIDUyODogCi0gICAgICAgIGNhc2UgNTQ4OiAKLSAgICAgICAgY2FzZSA1NjU6IAotICAgICAgICBjYXNlIDU3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MTk6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAxNTI6IAotICAgICAgICBjYXNlIDE1MzogCi0gICAgICAgIGNhc2UgMzExOiAKLSAgICAgICAgY2FzZSA0MDQ6IAotICAgICAgICBjYXNlIDQwODogCi0gICAgICAgIGNhc2UgNDkyOiAKLSAgICAgICAgY2FzZSA1Mjc6IAotICAgICAgICBjYXNlIDU0NzogCi0gICAgICAgIGNhc2UgNTY0OiAKLSAgICAgICAgY2FzZSA1NzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlpZighZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUR8fGZTdGF0ZVN0YWNrLnBlZWsoKT09U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpLTEpOwotCQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JfQotCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MjE6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAxMDQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA3MjI6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgMTY5OiAKLSAgICAgICAgY2FzZSAxNzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDcyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMDogCi0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgMjI1OiAKLSAgICAgICAgY2FzZSAyMjc6IAotICAgICAgICBjYXNlIDIyODogCi0gICAgICAgIGNhc2UgMjMwOiAKLSAgICAgICAgY2FzZSAyMzI6IAotICAgICAgICBjYXNlIDM3MDogCi0gICAgICAgIGNhc2UgMzcxOiAKLSAgICAgICAgY2FzZSAzNzI6IAotICAgICAgICBjYXNlIDQ3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTc6IAotICAgICAgICBjYXNlIDEwMTogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAxMTk6IAotICAgICAgICBjYXNlIDEyOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5zdGFydCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3MjU6IGJyZWFrOwotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgIGNhc2UgNzA6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSA4ODogCi0gICAgICAgIGNhc2UgODk6IAotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5NTogCi0gICAgICAgIGNhc2UgMTAzOiAKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgY2FzZSAxMTU6IAotICAgICAgICBjYXNlIDEyNDogCi0gICAgICAgIGNhc2UgMTMxOiAKLSAgICAgICAgY2FzZSAxMzI6IAotICAgICAgICBjYXNlIDEzMzogCi0gICAgICAgIGNhc2UgMTM0OiAKLSAgICAgICAgY2FzZSAxMzY6IAotICAgICAgICBjYXNlIDEzNzogCi0gICAgICAgIGNhc2UgMTM5OiAKLSAgICAgICAgY2FzZSAxNDA6IAotICAgICAgICBjYXNlIDE0MTogCi0gICAgICAgIGNhc2UgMTQ0OiAKLSAgICAgICAgY2FzZSAxNDU6IAotICAgICAgICBjYXNlIDE0NjogCi0gICAgICAgIGNhc2UgMTQ5OiAKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICBjYXNlIDE1MTogCi0gICAgICAgIGNhc2UgMTU2OiAKLSAgICAgICAgY2FzZSAxNTc6IAotICAgICAgICBjYXNlIDE1ODogCi0gICAgICAgIGNhc2UgMTY2OiAKLSAgICAgICAgY2FzZSAxNzE6IAotICAgICAgICBjYXNlIDE3MjogCi0gICAgICAgIGNhc2UgMTc2OiAKLSAgICAgICAgY2FzZSAxNzc6IAotICAgICAgICBjYXNlIDE4NDogCi0gICAgICAgIGNhc2UgMTg1OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICBjYXNlIDE4ODogCi0gICAgICAgIGNhc2UgMTk0OiAKLSAgICAgICAgY2FzZSAxOTg6IAotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgIGNhc2UgMjA2OiAKLSAgICAgICAgY2FzZSAyMDg6IAotICAgICAgICBjYXNlIDIwOTogCi0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgY2FzZSAyMTk6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgNzI2OiBicmVhazsKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JU3RyaW5nIHJldHVybmVkQ29udGV4dCA9IGRvU2NhbigiXV0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQsICBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQKLQlpZihyZXR1cm5lZENvbnRleHQgPT0gWE1MX0NEQVRBX1RFWFQpCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsKLQlyZXR1cm4gcmV0dXJuZWRDb250ZXh0OwotIH0KLSAgICAgICAgY2FzZSA3Mjc6IGJyZWFrOwotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSAxODY6IAotICAgICAgICBjYXNlIDE4OTogCi0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgY2FzZSAyMTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDcyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSA3Mjk6IGJyZWFrOwotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgY2FzZSAyMzc6IAotICAgICAgICBjYXNlIDIzODogCi0gICAgICAgIGNhc2UgMjM5OiAKLSAgICAgICAgY2FzZSAzODM6IAotICAgICAgICBjYXNlIDQ3ODogCi0gICAgICAgIGNhc2UgNDc5OiAKLSAgICAgICAgY2FzZSA1MTg6IAotICAgICAgICBjYXNlIDUxOTogCi0gICAgICAgIGNhc2UgNTM4OiAKLSAgICAgICAgY2FzZSA1NTg6IAotICAgICAgICBjYXNlIDU3MTogCi0gICAgICAgIGNhc2UgNTgxOiAKLSAgICAgICAgY2FzZSA1ODk6IAotICAgICAgICBjYXNlIDU5MTogCi0gICAgICAgIGNhc2UgNTkzOiAKLSAgICAgICAgY2FzZSA1OTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDczMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7Ci0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNzMxOiBicmVhazsKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICBjYXNlIDgwOiAKLSAgICAgICAgICB7IAotCQkvLyBibG9jayBzY2FuIHVudGlsIGNsb3NlIGlzIGZvdW5kCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7Ci0gfQotICAgICAgICBjYXNlIDczMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzMzOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjY6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBjb21wbGV4IHNpbmdsZSBxdW90ZWQiKTsvLyROT04tTkxTLTEkCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3MzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzM1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzM2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzg6IAotICAgICAgICBjYXNlIDE0MjogCi0gICAgICAgIGNhc2UgMjg4OiAKLSAgICAgICAgY2FzZSAyOTI6IAotICAgICAgICBjYXNlIDM5OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBwdWJsaWMgcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotIH0KLSAgICAgICAgY2FzZSA3Mzc6IGJyZWFrOwotICAgICAgICBjYXNlIDE0MzogCi0gICAgICAgIGNhc2UgMTQ3OiAKLSAgICAgICAgY2FzZSAyOTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgc3lzdGVtIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLSB9Ci0gICAgICAgIGNhc2UgNzM4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDg6IAotICAgICAgICBjYXNlIDMwNDogCi0gICAgICAgIGNhc2UgMzA4OiAKLSAgICAgICAgY2FzZSA0MDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3Mzk6IGJyZWFrOwotICAgICAgICBjYXNlIDE1NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NDA6IGJyZWFrOwotICAgICAgICBjYXNlIDE1NTogCi0gICAgICAgIGNhc2UgMzE0OiAKLSAgICAgICAgY2FzZSAzMTg6IAotICAgICAgICBjYXNlIDQxMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQxOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NDI6IGJyZWFrOwotICAgICAgICBjYXNlIDE2NDogCi0gICAgICAgIGNhc2UgMTY1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkpTUCBjb21tZW50IHRleHQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSA3NDM6IGJyZWFrOwotICAgICAgICBjYXNlIDE2NzogCi0gICAgICAgIGNhc2UgMTczOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQ0OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjg6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW5zaWRlIG9mIEpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JaWYoeXlzdGF0ZSgpICE9IFNUX0FCT1JUX0VNQkVEREVEKQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3NDU6IGJyZWFrOwotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NDY6IGJyZWFrOwotICAgICAgICBjYXNlIDE3NTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NDc6IGJyZWFrOwotICAgICAgICBjYXNlIDE4MDogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTKTsKLQlyZXR1cm4gSlNQX0VMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzQ4OiBicmVhazsKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFUyk7Ci0JcmV0dXJuIEpTUF9FTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc0OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgzOiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsLS07Ci0JaWYoZkVMbGV2ZWwgPT0gMCkgewotCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCXJldHVybiBKU1BfRUxfQ0xPU0U7Ci0JfQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzUwOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCXJldHVybiBKU1BfRUxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NTE6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JcmV0dXJuIEpTUF9FTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc1MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjAxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTKTsKLQlyZXR1cm4gSlNQX1ZCTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjAyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTKTsKLQlyZXR1cm4gSlNQX1ZCTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsLS07Ci0JaWYoZkVMbGV2ZWwgPT0gMCkgewotCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCXJldHVybiBKU1BfVkJMX0NMT1NFOwotCX0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3NTY6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCXJldHVybiBKU1BfVkJMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzU3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlyZXR1cm4gSlNQX1ZCTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NTk6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9FTkRfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDc2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9QSSk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzYxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjI6IAotICAgICAgICBjYXNlIDMxMDogCi0gICAgICAgIGNhc2UgMzIwOiAKLSAgICAgICAgY2FzZSAzMzE6IAotICAgICAgICBjYXNlIDMzNjogCi0gICAgICAgIGNhc2UgMzQwOiAKLSAgICAgICAgY2FzZSAzNDM6IAotICAgICAgICBjYXNlIDM0NjogCi0gICAgICAgIGNhc2UgMzQ4OiAKLSAgICAgICAgY2FzZSAzNTI6IAotICAgICAgICBjYXNlIDM1NjogCi0gICAgICAgIGNhc2UgMzU5OiAKLSAgICAgICAgY2FzZSAzNjI6IAotICAgICAgICAgIHsgCi0JLyogSlNQIHNjcmlwdGxldCBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygxKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX1NDUklQVExFVF9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfU0NSSVBUTEVUX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDc2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIzOiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzYzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzY0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNDA6IAotICAgICAgICAgIHsgCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUKLQkJZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NjU6IGJyZWFrOwotICAgICAgICBjYXNlIDI0MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzY2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gSlNQX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3Njc6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBKU1BfRElSRUNUSVZFX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3Njg6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MjogCi0gICAgICAgIGNhc2UgMTYzOiAKLSAgICAgICAgICB7IAotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQkgfQotICAgICAgICBjYXNlIDc2OTogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmZGI3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI3MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uQ29udGFpbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkludFN0YWNrOw0KLQ0KLSUlDQotDQotJXsNCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOw0KLSANCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZw0KLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQlwcml2YXRlIENvbnRleHRSZWdpb25Db250YWluZXIgZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOw0KLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOw0KLQ0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgYW4gZW1iZWRkZWQgcmVnaW9uIHNob3VsZCBiZSBldmFsdWF0ZWQNCi0JcHJpdmF0ZSBTdHJpbmcgZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JLy8gYSAiaGludCIgYXMgdG8gd2hhdCBzdGF0ZSB0byBlbnRlciBvbmNlIGFuIGVtYmVkZGVkIHJlZ2lvbiBoYXMNCi0JLy8gICBiZWVuIGNvbXBsZXRlZA0KLQlwcml2YXRlIGludCBmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCS8vIHRoZSBjb250YWluZXIgdXNlZCB0byBjcmVhdGUgZW1iZWRkZWQgcmVnaW9ucw0KLQlwcml2YXRlIENvbnRleHRSZWdpb25Db250YWluZXIgZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NPTlRFWFQgPSAiUFJPWFlfQ09OVEVYVCI7DQotDQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBzdGFydCA9IDA7DQotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOw0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOw0KLQ0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MNCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7DQotCQ0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkDQotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotDQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBpbnNpZGUgb2YgYW4gZW1iZWRkZWQgcmVnaW9uDQotCXByaXZhdGUgU3RyaW5nIGludGVybmFsVGFnTmFtZSA9IG51bGw7DQotCXByaXZhdGUgU3RyaW5nIGludGVybmFsQ29udGV4dCA9IG51bGw7DQotDQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2Vycw0KLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoMCk7DQotCXByaXZhdGUgTGlzdCBmTmVzdGFibGVQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3QoMSk7DQotCQ0KLQkvLyB3aGVyZSB0aGUgbGFzdCBpbnRlcm5hbCBjb250YWluZXIgYmxvY2sgd2FzIGZvdW5kDQotCXByaXZhdGUgaW50IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7DQotDQotCS8vIHJlcXVpcmVkIHRvIG5vdCBzZWVrIHRleHQgYmxvY2tzIG9uIGFuIGVuZCB0YWcNCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBmRm9yYmlkSlNQID0gZmFsc2U7DQotCQ0KLQlwcml2YXRlIGludCBmRUxsZXZlbCA9IDA7DQotDQotCXByaXZhdGUgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5KCk7DQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQkJaWYoY29udGFpbnNUYWdOYW1lKG1hcmtlci5nZXRUYWdOYW1lKCkpKQ0KLQkJCXJldHVybjsNCi0JCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKSB7DQotCQlmTmVzdGFibGVQcmVmaXhlcy5hZGQobWFya2VyKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCkgew0KLQkJcmV0dXJuIGZOZXN0YWJsZVByZWZpeGVzOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGFibGUoU3RyaW5nIHRhZ05hbWUpIHsNCi0JCS8vSXRlcmF0b3IgYmxvY2tzID0gZk5lc3RhYmxlUHJlZml4ZXMuaXRlcmF0b3IoKTsNCi0JCS8vd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJLy8JVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpYmxvY2tzLm5leHQoKTsNCi0JCS8vCVN0cmluZyBtYXJrZXJOYW1lID0gbWFya2VyLmdldFRhZ05hbWUoKTsNCi0JCS8vCWlmKHRhZ05hbWUubGVuZ3RoKCkgPiBtYXJrZXJOYW1lLmxlbmd0aCgpICsgMSAmJiB0YWdOYW1lLnN0YXJ0c1dpdGgobWFya2VyTmFtZSkgJiYgdGFnTmFtZS5jaGFyQXQobWFya2VyTmFtZS5sZW5ndGgoKSkgPT0gJzonKSB7DQotCQkvLwkJcmV0dXJuIG1hcmtlci5pc0dsb2JhbCgpIHx8IGdldE9mZnNldCgpID49IG1hcmtlci5nZXRNYXJrZXIoKS5nZXRTdGFydCgpOw0KLQkJLy8JfQ0KLQkJLy99DQotCQkvL3JldHVybiBmYWxzZTsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyBuYW1lKSB7DQotCQlpZiAoZk5lc3RhYmxlUHJlZml4ZXMgIT0gbnVsbCkgew0KLQkJCUl0ZXJhdG9yIG5lc3RhYmxlcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7DQotCQkJd2hpbGUgKG5lc3RhYmxlcy5oYXNOZXh0KCkpIHsNCi0JCQkJaWYgKCgoVGFnTWFya2VyKSBuZXN0YWJsZXMubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkNCi0JCQkJCW5lc3RhYmxlcy5yZW1vdmUoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kIA0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7DQotCQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7DQotCQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7DQotCQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7DQotCQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQ0KLQkJCQkJYmxvY2tzLnJlbW92ZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUYWdOYW1lKSB7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbnVsbCwgZW5kVGFnTmFtZSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMpIHsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBlbmRUeXBlcywgbnVsbCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFR5cGUpIHsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBuZXcgU3RyaW5nW117ZW5kVHlwZX0sIG51bGwpOw0KLQl9DQotCS8qKg0KLQkgKiAgdXNlciBtZXRob2QgDQotCSAqIA0KLQkgKiBBc3NlbWJsZXMgYW4gZW1iZWRkZWQgY29udGFpbmVyIGJlZ2lubmluZyB3aXRoIHRoZSBnaXZlbiBzdGFydFR5cGUgYXMNCi0JICogdGhlIGZpcnN0IENvbnRleHRSZWdpb24gd2l0aGluIGl0IGFuZCBvZiB0aGUgdHlwZSBmRW1iZWRkZWRIaW50LiAgVGhlDQotCSAqIGVuZFR5cGVzW10gYXJyYXkgY29udGFpbnMgdGhlIGNvbnRleHQgdHlwZXMgdGhhdCB3aWxsIGNhdXNlIGEgc3VjY2Vzc2Z1bA0KLQkgKiBleGl0LiAgVXNlIG9mIHRoZSBlbmRUYWdOYW1lIHBhcmFtZXRlciBhbHRlcnMgdGhpcyBiZWhhdmlvciB0byBmb3JjZSBhbg0KLQkgKiBleGl0IG9uIGFuIFhNTF9UQUdfQ0xPU0UgYWZ0ZXIgc2VlaW5nIGFuIFhNTF9UQUdfTkFNRSB3aG9zZSBzaWduaWZpY2FudA0KLQkgKiB0ZXh0IG1hdGNoZXMgdGhlIGVuZFRhZ05hbWUgU3RyaW5nLiAgQWxsIGNvbnRlbnRzIGluIGJldHdlZW4gYXJlDQotCSAqIGluc2lnbmlmaWNhbnQsIGFuZCB5ZXMsIHRoaXMgbWVhbnMgY29tbWVudHMgYXJlIGFsbG93ZWQgaW5zaWRlLg0KLQkgKiovDQotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzLCBTdHJpbmcgZW5kVGFnTmFtZSkgew0KLQkJLy8gdGhlIGNvbnRleHQgb2YgdGhlIHJlZ2lvbiBiZWluZyBhZGRlZCB0byB0aGUgZW1iZWRkZWQgY29udGFpbmVyDQotCQlpbnRlcm5hbENvbnRleHQgPSBzdGFydFR5cGU7DQotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHRoaXMgY29udGFpbmVyIGJlZ2FuOyB0byBwcm92aWRlIHJlbGF0aXZlIGluZGVjZXMgZm9yIHRoZSByZWdpb25zDQotCQlpbnQgY29udGFpbmVyU3RhcnQgPSB5eWNoYXI7DQotCQlib29sZWFuIG5vdEZpbmlzaGVkID0gdHJ1ZTsNCi0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgd2Ugc2VlbSB0byBiZSBzbyB0aGF0IHRoZSBlbmRUYWdOYW1lIGNhbiBiZSBjaGVja2VkDQotCQlib29sZWFuIGlzSW5FbmRUYWcgPSBmYWxzZTsNCi0JCWJvb2xlYW4gaXNJbkZpcnN0VGFnID0gdHJ1ZTsNCi0JCS8vIGNyZWF0ZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyIGFuZCBzZXR1cCBpdHMgInR5cGUiDQotCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOw0KLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKGZFbWJlZGRlZEhpbnQpOw0KLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydChjb250YWluZXJTdGFydCk7DQotCQkJLy8gVE9ETzogcGFyZW50IHJlZ2lvbiBuZWVkcyB0byBiZSBzZXQgLi4uLiBidXQgbm90IHN1cmUgd2hlcmUgdG8gZ2V0IGl0IGZyb20gDQotCQkJLy8JCWZFbWJlZGRlZENvbnRhaW5lci5zZXRQYXJlbnQocGFyZW50UmVnaW9uKTsNCi0JCX0NCi0JCWNvbnRhaW5lclN0YXJ0ID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFN0YXJ0KCk7DQotCQl3aGlsZSAobm90RmluaXNoZWQpIHsNCi0JCQkvLyBhZGQgdGhlIHJlZ2lvbiB0byB0aGUgY29udGFpbmVyDQotCQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7DQotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsNCi0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsNCi0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cw0KLQkJCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOw0KLQkJCX0NCi0JCQl0cnkgew0KLQkJCQkvLyBsb25nc2NhbiBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gYXR0ZW1wdCBhIGJsb2NrVGFnU2NhbiB3aXRoaW4gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcg0KLQkJCQlib29sZWFuIGxvbmdzY2FuID0gZmFsc2U7DQotCQkJCS8vIHNhdmUgdGhlIHRva2VuaXplciBzdGF0ZSBpbiBjYXNlIG9mIGEgYmxvY2sgdGFnIHNjYW4NCi0JCQkJaW50IHByZXZpb3VzU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCVN0cmluZyBwcmV2aW91c0N1cnJlbnRUYWdOYW1lID0gZkN1cnJlbnRUYWdOYW1lOw0KLQkJCQlpbnQgcHJldmlvdXNQb3N0U3RhdGUgPSBmRW1iZWRkZWRQb3N0U3RhdGU7DQotCQkJCVN0cmluZyBwcmV2aW91c0VtYmVkZGVkSGludCA9IGZFbWJlZGRlZEhpbnQ7DQotCQkJCS8vIGRldGVybWluZSBpZiBhIGJsb2NrIHRhZyBzY2FuIGlzIG5lY2Vzc2FyeQ0KLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgew0KLQkJCQkJaW50ZXJuYWxUYWdOYW1lID0geXl0ZXh0KCk7DQotCQkJCQlpZighaXNOZXN0YWJsZShpbnRlcm5hbFRhZ05hbWUpKSB7DQotCQkJCQkJaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsNCi0JCQkJCQkvLyBzbmFnZ2VkIGEgdGFnIG5hbWUgd2Ugc2hvdWxkbid0IGhhdmUNCi0JCQkJCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9BQk9SVF9FTUJFRERFRDsNCi0JCQkJCQlub3RGaW5pc2hlZCA9IGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX09QRU4gfHwgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7DQotCQkJCX0NCi0JCQkJLy8gZG8gdXBrZWVwIGZvciBlbmRUYWdOYW1lIHVzYWdlOyBtdXN0IGJlIGhlcmUgc2luY2UgdGhlIG5leHQgdG9rZW4gY291bGQgYmUgdGhlIGNsb3NlDQotCQkJCWlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJCQkJaXNJbkVuZFRhZyA9IHRydWU7DQotCQkJCX0gZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfQ0xPU0UpIHsNCi0JCQkJCWlzSW5GaXJzdFRhZyA9IGlzSW5FbmRUYWcgPSBmYWxzZTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJIAlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsNCi0JCQkJCWlmIChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpID4gMiAmJiAoZW1iZWRkZWRSZWdpb25zLmdldChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19DTE9TRSAmJiAoZW1iZWRkZWRSZWdpb25zLmdldChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpIC0gMykpLmdldFR5cGUoKSA9PSBYTUxfVEFHX09QRU4gJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwpIHsNCi0JCQkJCQlpZiAoY29udGFpbnNUYWdOYW1lKGludGVybmFsVGFnTmFtZSkpIHsNCi0JCQkJCQkJbG9uZ3NjYW4gPSB0cnVlOw0KLQkJCQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJaWYgKGxvbmdzY2FuKQ0KLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gaW50ZXJuYWxUYWdOYW1lOw0KLQkJCQkvLyByZWFkIHRoZSBuZXh0IHJlZ2lvbiBhbmQgY29udGV4dA0KLQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCWlmIChsb25nc2Nhbikgew0KLQkJCQkJLy8gUmV0dXJuaW5nIGZyb20gYSBibG9jayB0YWcgc2NhbiByZXF1aXJlcyByZXN0b3Jpbmcgc29tZSBzdGF0ZSB2YXJpYWJsZXMNCi0JCQkJCS8vIGFzIHdlbGwgYXMgaGFuZGxpbmcgdGhlIGJsb2NrIHJlZ2lvbiBhbmQgc2V0dGluZyB1cCBmb3Igbm9ybWFsIHNjYW5uaW5nDQotCQkJCQkvLyBpbnNpZGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lcg0KLQkJCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cw0KLQkJCQkJLy8gbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7DQotCQkJCQlsb25nc2NhbiA9IGZhbHNlOw0KLQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gcHJldmlvdXNQb3N0U3RhdGU7DQotCQkJCQlmRW1iZWRkZWRIaW50ID0gcHJldmlvdXNFbWJlZGRlZEhpbnQ7DQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBwcmV2aW91c0N1cnJlbnRUYWdOYW1lOw0KLQkJCQkJeXliZWdpbihwcmV2aW91c1N0YXRlKTsNCi0JCQkJCWludGVybmFsQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJfQ0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJLy8gcHJpbUdldE5leHRUb2tlbigpIGNhbGxzIG1heSB0aHJvdyBhbiBJT0V4Y2VwdGlvbg0KLQkJCQkvLyBjYXRjaCBhbmQgZG8gbm90aGluZyBzaW5jZSB0aGUgaXNFT0YgY2hlY2sgYmVsb3cNCi0JCQkJLy8gd2lsbCBwcm9wZXJseSBleGl0IGlmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGYpIHsNCi0JCQkJLy8gc29tZSBvdGhlciBleGNlcHRpb24gaGFwcGVuZWQ7IG5ldmVyIHNob3VsZA0KLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGYpOw0KLQkJCX0NCi0JCQlib29sZWFuIGlzRW5kaW5nVHlwZSA9IHl5c3RhdGUoKSA9PSBTVF9BQk9SVF9FTUJFRERFRDsNCi0JCQlpZighaXNFbmRpbmdUeXBlKSB7DQotCQkJCS8vIGNoZWNrIGZvciBlbmRpbmcgY29udGV4dA0KLQkJCQlpZiAoZW5kVGFnTmFtZSA9PSBudWxsKSB7DQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZFR5cGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQkJaXNFbmRpbmdUeXBlID0gaXNFbmRpbmdUeXBlIHx8IChpbnRlcm5hbENvbnRleHQgPT0gZW5kVHlwZXNbaV0pOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaXNFbmRpbmdUeXBlID0gKChpc0luRW5kVGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB8fCAoaXNJbkZpcnN0VGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfRU1QVFlfVEFHX0NMT1NFKSkgJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwgJiYgaW50ZXJuYWxUYWdOYW1lLmVxdWFscyhlbmRUYWdOYW1lKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRMaXN0ID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsNCi0JCQlub3RGaW5pc2hlZCA9IG5vdEZpbmlzaGVkICYmICgoIWlzRW5kaW5nVHlwZSkgJiYgIWlzRU9GKCkgJiYgKGVuZFRhZ05hbWUgIT0gbnVsbCB8fCBpbnRlcm5hbENvbnRleHQgIT0gVU5ERUZJTkVEKSAmJiAhKGludGVybmFsQ29udGV4dCA9PSBQUk9YWV9DT05URVhUICYmIChlbWJlZGRlZExpc3QuZ2V0KGVtYmVkZGVkTGlzdC5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBVTkRFRklORUQpKTsNCi0JCX0NCi0JCS8vIGZpbmlzaCBhZGRpbmcgdGhlIGxhc3QgY29udGV4dA0KLQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7DQotCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOw0KLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOw0KLQkJfQ0KLQkJeXliZWdpbihmRW1iZWRkZWRQb3N0U3RhdGUpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKCkgew0KLQkJcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgew0KLQkJZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gbmV3VmFsdWU7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSB7DQotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUChTdHJpbmcgbmFtZSkgew0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsNCi0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOw0KLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQ0KLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOw0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7DQotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgew0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsNCi0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsNCi0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkNCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCQl9DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dCgpIHsNCi0JCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgew0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCQlyZXR1cm4gbWFya2VyLmdldENvbnRleHQoKTsNCi0JCX0NCi0JCXJldHVybiBCTE9DS19URVhUOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsNCi0JCXJldHVybiBmQmxvY2tNYXJrZXJzOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgew0KLQkJcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7DQotCX0NCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoKSB7DQotCQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOw0KLQl9DQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7DQotCQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlyZXR1cm4gY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsNCi0JCWJlZ2luQmxvY2tNYXJrZXJTY2FuKG5ld1RhZ05hbWUsIEJMT0NLX1RFWFQpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKg0KLQkgKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQ0KLQkgKiBzdGFydCBvZiBhIHRleHQgYmxvY2sgd2l0aGluIGEgIm5ld1RhZ05hbWUiIHRhZy4NCi0JICoNCi0JICogRXhhbXBsZTogDQotCSAqCVRva2VuaXplciB0b2tlciA9IG5ldyBUb2tlbml6ZXIoKTsNCi0JICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsNCi0JICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOw0KLQkgKgl0b2tlci5iZWdpbkJsb2NrTWFya2VyU2Nhbigic2NyaXB0IiwgQkxPQ0tfVEVYVCk7DQotCSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgDQotCSAqDQotCSAqIFJldHVybnM6DQotCSAqCUJMT0NLX1RFWFQ6IDAtNDANCi0JICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDINCi0JICoJWE1MX1RBR19OQU1FOiA0My00OA0KLQkgKglYTUxfVEFHX0NMT1NFOiA0OS00OQ0KLQkgKglYTUxfQ09OVEVOVDogNTAtNTcNCi0JICoNCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7DQotCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7DQotCX0NCi0NCi0vKioNCi0gKiBNZXRob2QgZG9TY2FuLg0KLSAqIA0KLSAqIFJldHVybnMgYSBjb250ZXh0IHJlZ2lvbiBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdXB0byB0aGUgZW5kIG9mIGlucHV0IG9yDQotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcNCi0gKiANCi0gKiBAcGFyYW0gc2VhcmNoU3RyaW5nIC0gdGFyZ2V0IHN0cmluZyB0byBzZWFyY2ggZm9yIGV4LjogIi0tPiIsICI8L3RhZ25hbWUiDQotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicNCi0gKiBAcGFyYW0gYWxsb3dKU1AgLSBjaGVjayBmb3IgYW5kIGFsbG93IGZvciBKU1AgbWFya3VwIDwlJT4NCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgNCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aA0KLSAqIEBwYXJhbSBhYm9ydFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSBzZWFyY2hTdHJpbmcgd2FzIGZvdW5kIGltbWVkaWF0ZWx5DQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2Vzcw0KLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgYm9vbGVhbiBhbGxvd0pTUCwgYm9vbGVhbiBhbGxvd0NEQVRBLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOw0KLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQ0KLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsNCi0JaW50IG4gPSAwOw0KLQljaGFyIGxhc3RDaGVja0NoYXI7DQotCWludCBpOw0KLQlib29sZWFuIHNhbWUgPSBmYWxzZTsNCi0JLy8gQ2hlY2sgZm9yIEpTUCBzdGFydHMgKCI8JSIpIGlmIHRoZSB0YWcgaXMgZ2xvYmFsIGxpa2UgU0NSSVBUIG9yIFNUWUxFDQotCWJvb2xlYW4gY2hlY2tKU1BzID0gYWxsb3dKU1AgJiYgIWZGb3JiaWRKU1A7DQotCWJvb2xlYW4gY2hlY2tlZEZvckpTUHNPbmNlID0gIWNoZWNrSlNQczsNCi0JYm9vbGVhbiBjaGVja2VkSlNQc0F0U3RhcnRPbmNlID0gZmFsc2U7DQotCQ0KLQl3aGlsZSAoc3RpbGxTZWFyY2hpbmcpIHsNCi0JCW4gPSAwOw0KLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4NCi0JCW4gPSB5eV9hZHZhbmNlKCk7DQotCQl3aGlsZShuICE9IFlZRU9GICYmIHl5X2N1cnJlbnRQb3MgPCBzZWFyY2hTdHJpbmdMZW5ndGgpDQotCQkJbiA9IHl5X2FkdmFuY2UoKTsNCi0vLwkJYyA9IChjaGFyKSBuOw0KLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4NCi0JCWlmIChuID09IFlZRU9GICYmIGNoZWNrZWRGb3JKU1BzT25jZSkgew0KLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQkvKioNCi0JCQkgKiBMb29rIGZvciBzdGFydGluZyBKU1BzICI8JSINCi0JCQkgKi8NCi0JCQljaGVja2VkRm9ySlNQc09uY2UgPSB0cnVlOw0KLQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggOiBUaGVyZSdzIGF0IGxlYXN0IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IG9uY2UgdGhhdCdzIHJlYWQsIGNoZWNrIGZvciBKU1BzDQotCQkJLy8gLS0tDQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0Lg0KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kDQotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLg0KLQkJCWlmKGNoZWNrSlNQcyAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgDQotCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggKyAxXSA9PSAnJScpIHsNCi0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQl9DQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCX0NCi0JCQkvLyAyKSB5eV9jdXJyZW50UG9zIC0ganNwc3RhcnRlci5sZW5ndGggOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBKU1AgMiBzcG90cyBiYWNrIGluIHdoYXQgd2UgY291bGQgcmVhZA0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24gKmhhdmluZyogY2xvc2VUYWdTdHJpbmdMZW5ndGggYW1vdW50IG9mIGlucHV0IHRvIHdvcmsgYXMgZGVzaWduZWQuICBNdXN0IGJlIHN1cmUgd2UgZG9uJ3QNCi0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4NCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmDQotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7DQotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7DQotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOw0KLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7DQotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7DQotCQkJCX0NCi0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJfQ0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MuLih5eV9jdXJyZW50UG9zK2pzcFN0YXJ0bGVuZ3RoLTEpIDogQ2hlY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvbmUgdGltZQ0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24geXlfY3VycmVudFBvcyBlcXVhbGluZyBleGFjdGx5IHRoZSBwcmV2aW91cyBlbmQgKzEgdG8gd29yayBhcyBkZXNpZ25lZC4NCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiAhY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJg0KLQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsNCi0JCQkJY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IHRydWU7DQotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQl9DQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCX0NCi0NCi0NCi0JCQkvKioNCi0JCQkgKiBMb29rIGZvciBzdGFydGluZyBDREFUQSAiPCFbQ0RBVEFbIg0KLQkJCSAqLw0KLQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIENEQVRBDQotCQkJLy8gLS0tDQotCQkJLy8gTG9vayBmb3IgYSBDREFUQSBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuDQotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDxbIUNEQVRBW11dPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZA0KLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4NCi0vKgkJCWlmKGNoZWNrQ0RBVEEgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zICsgc2VhcmNoU3RyaW5nTGVuZ3RoIDwgeXlfYnVmZmVyLmxlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIA0KLQkJCQljaGFyc01hdGNoKGNkYXRhU3RhcnRlciwgeXlfYnVmZmVyLCAwLCB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoKSkgew0KLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7DQotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCS8vIGdvIHRvIGEgc3RhdGUgd2hlcmUgQ0RBVEEgY2FuIGJlIGZvdW5kDQotCQkJCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgew0KLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKHNlYXJjaENvbnRleHQpOw0KLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KHl5Y2hhcik7DQotCQkJCX0NCi0JCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihzZWFyY2hDb250ZXh0LCB5eWNoYXIsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOw0KLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsNCi0JCQkJeXliZWdpbihZWUlOSVRJQUwpOw0KLQkJCQlTdHJpbmcgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJaWYoY29udGV4dC5lcXVhbHMoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4pKSB7DQotCQkJCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOLCBYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfQ0xPU0UpOw0KLQkJCQl9DQotCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi0JCQl9DQotKi8vKg0KLQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBjZGF0YVN0YXJ0ZXIubGVuZ3RoOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBDREFUQSByaWdodCBoZXJlIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkDQotCQkJLy8gLS0tDQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24NCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndA0KLQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLg0KLQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmDQotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7DQotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7DQotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7DQotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOw0KLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7DQotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOw0KLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7DQotCQkJCX0NCi0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJfQ0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lDQotCQkJLy8gLS0tDQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24NCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLg0KLQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiAhY2hlY2tlZEZvckNEQVRBT25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJg0KLQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsNCi0JCQkJY2hlY2tlZEZvckNEQVRBT25jZSA9IHRydWU7DQotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQl9DQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCX0NCi0qLw0KLQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyDQotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzDQotCQkJaWYgKG4gPT0gWVlFT0YpIHsNCi0JCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXNhbWUgPSB0cnVlOw0KLQkJCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzDQotCQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoOyBpKyspIHsNCi0JCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykNCi0JCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsNCi0JCQkJCQllbHNlIGlmKHNhbWUgJiYgIWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykNCi0JCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93DQotCQkJCWVsc2Ugew0KLQkJCQkJc2FtZSA9IGZhbHNlOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7DQotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaA0KLQkJCQkvLyAiPC9zY3JpcHRTIg0KLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOw0KLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIg0KLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQ0KLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7DQotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoDQotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQ0KLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOw0KLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7DQotCQl9DQotCX0NCi0JZWxzZSB7DQotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQNCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7DQotCQl5eV9jdXJyZW50UG9zKys7DQotCX0NCi0JeXliZWdpbihleGl0U3RhdGUpOw0KLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5DQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpDQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QgDQotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUNCi0gKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrVGFnU2NhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCk7DQotCXJldHVybiBkb1NjYW4oIjwvIiArIGZDdXJyZW50VGFnTmFtZSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSksIFlZSU5JVElBTCwgWVlJTklUSUFMKTsNCi19DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKg0KLQkgKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkNCi0JICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUNCi0JICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0Lg0KLQkgKg0KLQkgKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5DQotCSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuDQotCSAqDQotCSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkDQotCSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLg0KLQkgKi8NCi0JcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOw0KLQkJLy8gbG9hZCB0aGUgc3RhcnRpbmcgbm9uLXdoaXRlc3BhY2UgdG9rZW4gKGFzc3VtZSB0aGF0IGl0IGlzIHNvKQ0KLQkJaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsNCi0JCQlpZiAoZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgIT0gbnVsbCkgew0KLQkJCQlJVGV4dFJlZ2lvbiBjb250YWluZXIgPSBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lcjsNCi0JCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOw0KLQkJCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCQkJCXJldHVybiBjb250YWluZXI7DQotCQkJfQ0KLQkJCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0Ow0KLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsNCi0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCQl9IGVsc2Ugew0KLQkJCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJaWYgKGNvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCkgew0KLQkJCQlyZXR1cm4gZkVtYmVkZGVkQ29udGFpbmVyOw0KLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsNCi0JCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkNCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJCQllbHNlDQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsNCi0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JCQl9DQotCQkJc3RhcnQgPSB5eWNoYXI7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJaWYgKHl5X2F0RU9GKSB7DQotCQkJCWZUb2tlbkNvdW50Kys7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCX0NCi0JCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuDQotCQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQlpZiAoZl9jb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsNCi0JCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IGZFbWJlZGRlZENvbnRhaW5lcjsNCi0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsNCi0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX1JPT1RfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgew0KLQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpDQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJCWVsc2UNCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsNCi0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgew0KLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7DQotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQl9DQotCQlmQnVmZmVyZWRDb250ZXh0ID0gZl9jb250ZXh0Ow0KLQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7DQotCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7DQotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgew0KLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JCQlsZW5ndGggKz0gZkJ1ZmZlcmVkTGVuZ3RoOw0KLQkJfQ0KLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgew0KLQkJCS8vIEVPRg0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRpc2NvdmVyZWQgIiArIGZUb2tlbkNvdW50ICsgIiB0b2tlbnMuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJZlRva2VuQ291bnQrKzsNCi0JCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBKU1BUb2tlbml6ZXIoKXsNCi0JCXN1cGVyKCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIEpTUFRva2VuaXplcihjaGFyW10gY2hhckFycmF5KXsNCi0JCQl0aGlzKG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgew0KLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7DQotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIG5ld09mZnNldCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgew0KLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCAwKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsNCi0JCXJlc2V0KGluLCAwKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgKg0KLQkgKg0KLQkgKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMNCi0JICogdGhhdCByZXNldHRpbmcgYSBwcmUtZXhpc3RpbmcgdG9rZW5pemVyIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4NCi0JICoNCi0JICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUNCi0JICogPGVtPmdlbmVyYXRlZDwvZW0+IG91dHB1dCBvZiB0aGlzIHNwZWNpZmljYXRpb24gYmVmb3JlIHRoaXMgbWV0aG9kIHdhcw0KLQkgKiBhZGRlZC4gIFRob3NlIGNvZGUgYmxvY2tzIHdlcmUgdW5kZXIgdGhlIGFib3ZlIGNvcHlyaWdodC4NCi0JICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlmT2Zmc2V0ID0gbmV3T2Zmc2V0Ow0KLQkNCi0JCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8NCi0JCXl5X3JlYWRlciA9IGluOw0KLQkNCi0JCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0JCXl5X3N0YXRlID0gMDsNCi0JDQotCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQkNCi0JCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0JCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7DQotCQ0KLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0JCXl5X21hcmtlZFBvcyA9IDA7DQotCQ0KLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0JDQotCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0JCXl5X2N1cnJlbnRQb3MgPSAwOw0KLQkNCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLQkJeXlfc3RhcnRSZWFkID0gMDsNCi0JDQotCQkvKiogDQotCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0JCSAqIGZyb20gaW5wdXQgDQotCQkgKi8NCi0JCXl5X2VuZFJlYWQgPSAwOw0KLQkNCi0JCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQkJeXlsaW5lID0gMDsNCi0JDQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5Y2hhciA9IDA7DQotCQ0KLQkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLQkJeXlfYXRFT0YgPSBmYWxzZTsNCi0JDQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8NCi0JCXl5X2VvZl9kb25lID0gZmFsc2U7DQotCQ0KLQkNCi0JCS8qIHVzZXIgdmFyczogKi8NCi0JCWZUb2tlbkNvdW50ID0gMDsNCi0JIA0KLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCQlmQnVmZmVyZWRTdGFydCA9IDE7DQotCQlmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQkJZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0JDQotCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOw0KLQkNCi0JCWNvbnRleHQgPSBudWxsOw0KLQkJc3RhcnQgPSAwOw0KLQkJdGV4dExlbmd0aCA9IDA7DQotCQlsZW5ndGggPSAwOw0KLQkNCi0JCWZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7DQotCQkNCi0JCWZFTGxldmVsID0gMDsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICovDQotCXB1YmxpYyBCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpIHsNCi0JCUpTUFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBKU1BUb2tlbml6ZXIoKTsNCi0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgDQotCQkvLyBhcmUgbmV2ZXIgZGVzdHJveWVkIChlLmcuICdyZWxlYXNlJykNCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7DQotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOw0KLQkJCWlmKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpDQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsNCi0JCX0NCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmTmVzdGFibGVQcmVmaXhlcy5zaXplKCk7IGkrKykgew0KLQkJCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKSBmTmVzdGFibGVQcmVmaXhlcy5nZXQoaSk7DQotCQkJaWYobWFya2VyLmlzR2xvYmFsKCkpDQotCQkJCW5ld0luc3RhbmNlLmFkZE5lc3RhYmxlUHJlZml4KG1hcmtlcik7DQotCQl9DQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhblhNTENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcw0KLQkJLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gNCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfWE1MX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQNCi0JCS8vICBjb250ZXh0IGFzIHVzdWFsLg0KLQkJcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuSlNQQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJLy8gU2NhbiBmb3IgJy0tJT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcw0KLQkJLy8gICBKU1BfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gNCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfSlNQX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQNCi0JCS8vICBjb250ZXh0IGFzIHVzdWFsLg0KLQkJcmV0dXJuIGRvU2NhbigiLS0lPiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgSlNQX0NPTU1FTlRfVEVYVCwgU1RfSlNQX0NPTU1FTlRfRU5ELCBTVF9KU1BfQ09NTUVOVF9FTkQpOw0KLQl9DQotJX0NCi0NCi0lZW9mew0KLS8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iDQotJWVvZn0NCi0NCi0lcHVibGljDQotJWNsYXNzIEpTUFRva2VuaXplcg0KLSVpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01KU1BSZWdpb25Db250ZXh0cw0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0lbGluZQ0KLSV1bmljb2RlDQotJXBhY2sNCi0NCi0lc3RhdGUgU1RfQ0RBVEFfVEVYVA0KLSVzdGF0ZSBTVF9DREFUQV9FTkQNCi0lc3RhdGUgU1RfWE1MX0NPTU1FTlQNCi0lc3RhdGUgU1RfWE1MX0NPTU1FTlRfRU5EDQotJXN0YXRlIFNUX1BJDQotJXN0YXRlIFNUX1BJX1dTDQotJXN0YXRlIFNUX1BJX0NPTlRFTlQNCi0lc3RhdGUgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1hNTF9QSV9FUVVBTFMNCi0lc3RhdGUgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9YTUxfUElfVEFHX0NMT1NFDQotJXN0YXRlIFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX0RIVE1MX0VRVUFMUw0KLSVzdGF0ZSBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfREhUTUxfVEFHX0NMT1NFDQotDQotLy8gc2NyaXB0bGV0IHN0YXRlKHMpDQotJXN0YXRlIFNUX0pTUF9DT05URU5UDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRQ0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRQ0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTDQotJXN0YXRlIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFDQotDQotLy8gbm9ybWFsIHRhZyBzdGF0ZXMNCi0lc3RhdGUgU1RfWE1MX1RBR19OQU1FDQotJXN0YXRlIFNUX1hNTF9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfRVFVQUxTDQotJXN0YXRlIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUNCi0NCi0vLyBkZWNsYXJhdGlvbiAoRFREKSBzdGF0ZXMNCi0lc3RhdGUgU1RfWE1MX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRQ0KLQ0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRA0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMNCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNDQotDQotJXN0YXRlIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQNCi0NCi0lc3RhdGUgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVA0KLQ0KLQ0KLSVzdGF0ZSBTVF9CTE9DS19UQUdfU0NBTg0KLSVzdGF0ZSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTg0KLQ0KLSVzdGF0ZSBTVF9KU1BfQ09NTUVOVA0KLSVzdGF0ZSBTVF9KU1BfQ09NTUVOVF9FTkQNCi0NCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEDQotJXN0YXRlIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRA0KLQ0KLSVzdGF0ZSBTVF9BQk9SVF9FTUJFRERFRA0KLQ0KLSVzdGF0ZSBTVF9KU1BfRUwNCi0lc3RhdGUgU1RfSlNQX0VMX1NRVU9URVMNCi0lc3RhdGUgU1RfSlNQX0VMX0RRVU9URVMNCi0lc3RhdGUgU1RfSlNQX0VMX1NRVU9URVNfRU5EDQotJXN0YXRlIFNUX0pTUF9FTF9EUVVPVEVTX0VORA0KLQ0KLSVzdGF0ZSBTVF9KU1BfRFFVT1RFRF9FTA0KLSVzdGF0ZSBTVF9KU1BfU1FVT1RFRF9FTA0KLQ0KLSVzdGF0ZSBTVF9KU1BfVkJMDQotJXN0YXRlIFNUX0pTUF9WQkxfU1FVT1RFUw0KLSVzdGF0ZSBTVF9KU1BfVkJMX0RRVU9URVMNCi0lc3RhdGUgU1RfSlNQX1ZCTF9TUVVPVEVTX0VORA0KLSVzdGF0ZSBTVF9KU1BfVkJMX0RRVU9URVNfRU5EDQotDQotJXN0YXRlIFNUX0pTUF9EUVVPVEVEX1ZCTA0KLSVzdGF0ZSBTVF9KU1BfU1FVT1RFRF9WQkwNCi0NCi0vLyBMZXR0ZXIgPSAoW0EtWmEtel0pDQotLy8gRGlnaXQgPSAoWzAtOV0pDQotDQotLyoqDQotICogc21hbGxlciB0b2tlbnMNCi0gKi8NCi1nZW5lcmljVGFnT3BlbiAgICAgICA9IDwNCi1nZW5lcmljVGFnQ2xvc2UgICAgICA9ID4NCi1nZW5lcmljRW5kVGFnT3BlbiAgICA9IDxcLw0KLWdlbmVyaWNFbXB0eVRhZ0Nsb3NlID0gXC8+DQotDQotUElzdGFydCA9IDxcPw0KLVBJZW5kICAgPSBcPz4NCi0NCi0NCi0vLyBbMV0gZG9jdW1lbnQgOjo9IHByb2xvZyBlbGVtZW50IE1pc2MqDQotZG9jdW1lbnQgPSAoe3Byb2xvZ30ge2VsZW1lbnR9IHtNaXNjfSopDQotDQotLy8gWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gfCBbI3hFMDAwLSN4RkZGRF0gfCBbI3gxMDAwMC0jeDEwRkZGRl0NCi0gLy9DaGFyID0gKC4pDQotQ2hhciA9IFtceDA5XHgwQVx4MERceDIwLVx1RDdGRlx1RTAwMC1cdUZGRkRdIA0KLQ0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrDQotUyA9IFtceDIwXHgwOVx4MERceDBBXSsNCi0NCi0vLyBbNF0gTmFtZUNoYXIgOjo9IExldHRlciB8IERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwgQ29tYmluaW5nQ2hhciB8IEV4dGVuZGVyDQotTmFtZUNoYXIgPSAoe0xldHRlcn0gfCB7RGlnaXR9IHwgXC4gfCBcLSB8IF8gfCA6IHwge0NvbWJpbmluZ0NoYXJ9IHwge0V4dGVuZGVyfSkNCi0NCi0vLyBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgTmFtZUNoYXIqDQotLy9OYW1lID0gKHtOYW1lQ2hhcn17TmFtZUNoYXJ9KikNCi1OYW1lID0gKHtMZXR0ZXJ9IHwgXyB8IDope05hbWVDaGFyfSoNCi0NCi0vLyBbNl0gTmFtZXMgOjo9IHtOYW1lfSAoe1N9IHtOYW1lfSkqDQotTmFtZXMgPSAoe05hbWV9ICh7U30ge05hbWV9KSopDQotDQotLy8gWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrDQotTm10b2tlbiA9ICh7TmFtZUNoYXJ9KykNCi0NCi0vLyBbOF0gTm10b2tlbnMgOjo9IE5tdG9rZW4gKFMgTm10b2tlbikqDQotTm10b2tlbnMgPSAoe05tdG9rZW59ICh7U30ge05tdG9rZW59KSopDQotDQotLy8gWzldIEVudGl0eVZhbHVlIDo6PSAnIicgKFteJSYiXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogJyInIHwgICInIiAoW14lJiddIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAiJyINCi1FbnRpdHlWYWx1ZSA9IChcIiAoW14lJlwiXSB8IHtQRVJlZmVyZW5jZX0gfCB7UmVmZXJlbmNlfSkqIFwiIHwgIFwnIChbXiUmXCddIHwge1BFUmVmZXJlbmNlfSB8IHtSZWZlcmVuY2V9KSogXCcpDQotDQotLy8gXHgyNCA9ICckJywgXHg3YiA9ICd7JywgXHgyMyA9ICcjJw0KLS8vIFsxMF0gQXR0VmFsdWUgOjo9ICciJyAoW148JiJdIHwgUmVmZXJlbmNlKSogJyInIHwgICInIiAoW148JiddIHwgUmVmZXJlbmNlKSogIiciDQotQXR0VmFsdWUgPSAoIFwiKFtePCJceDI0XHgyM10gfCBbXHgyNFx4MjNdW15ceDdiIl0gfCB7UmVmZXJlbmNlfSkqW1x4MjRceDIzXSpcIiB8IFwnKFtePCdceDI0XHgyM10gfCBbXHgyNFx4MjNdW15ceDdiJ10gfCB7UmVmZXJlbmNlfSkqW1x4MjRceDIzXSpcJyAgfCAoW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSopDQotDQotLy8gWzExXSBTeXN0ZW1MaXRlcmFsIDo6PSAoJyInIFteIl0qICciJykgfCAoIiciIFteJ10qICInIikgDQotU3lzdGVtTGl0ZXJhbCA9ICgoXCIgW15cIl0qIFwiKSB8IChcJyBbXlwnXSogXCcpKSANCi0NCi0vLyBbMTJdIFB1YmlkTGl0ZXJhbCA6Oj0gJyInIFB1YmlkQ2hhciogJyInIHwgIiciIChQdWJpZENoYXIgLSAiJyIpKiAiJyINCi1QdWJpZExpdGVyYWwgPSAoXCIge1B1YmlkQ2hhcn0qIFwiIHwgXCcgKHtQdWJpZENoYXJ9XCcpKiAiJyIpDQotDQotLy8gWzEzXSBQdWJpZENoYXIgOjo9ICN4MjAgfCAjeEQgfCAjeEEgfCBbYS16QS1aMC05XSB8IFstJygpKywuLzo9PzshKiNAJF8lXQ0KLVB1YmlkQ2hhciA9IChbXDA0MFwwMTVcMDEyXSB8IFthLXpBLVowLTldIHwgW1wtXCcoKVwrLC5cLzo9PzshXCojQFwkXyVdKQ0KLQ0KLS8vIFsxNF0gQ2hhckRhdGEgOjo9IFtePCZdKiAtIChbXjwmXSogJ11dPicgW148Jl0qKQ0KLS8vIGltcGxlbWVudCBsb29rYWhlYWQgYmVoYXZpb3IgZHVyaW5nIGFjdGlvbiBkZWZpbml0aW9uDQotQ2hhckRhdGEgPSAoW148JihcXVxdPildKikNCi0NCi0vLyBbMTVdIENvbW1lbnQgOjo9ICc8IS0tJyAoKENoYXIgLSAnLScpIHwgKCctJyAoQ2hhciAtICctJykpKSogJy0tPicNCi1Db21tZW50U3RhcnQgPSAoPCFcLVwtKQ0KLUNvbW1lbnRFbmQgICA9IChcLVwtPikNCi1Db21tZW50ID0gKHtDb21tZW50U3RhcnR9Lip7Q29tbWVudEVuZH0pDQotDQotLy8gWzE2XSBQSSA6Oj0gJzw/JyBQSVRhcmdldCAoUyAoQ2hhciogLSAoQ2hhciogJz8+JyBDaGFyKikpKT8gJz8+Jw0KLVBJID0gKDxcP3tQSVRhcmdldH0ge0NoYXJ9KiBcPz4pDQotDQotLy8gWzE3XSBQSVRhcmdldCA6Oj0gTmFtZSAtICgoJ1gnIHwgJ3gnKSAoJ00nIHwgJ20nKSAoJ0wnIHwgJ2wnKSkNCi1QSVRhcmdldCA9ICh7TmFtZX0oKFh8eCkoTXxtKShMfGwpKSkNCi0NCi0vLyBbMThdIENEU2VjdCA6Oj0gQ0RTdGFydCBDRGF0YSBDREVuZA0KLUNEU2VjdCA9ICh7Q0RTdGFydH17Q0RhdGF9e0NERW5kfSkNCi0NCi0vLyBbMTldIENEU3RhcnQgOjo9ICc8IVtDREFUQVsnDQotQ0RTdGFydCA9IDwhXFtDREFUQVxbDQotDQotLy8gWzIwXSBDRGF0YSA6Oj0gKENoYXIqIC0gKENoYXIqICddXT4nIENoYXIqKSkgDQotLy8gaW1wbGVtZW50IGxvb2thaGVhZCBiZWhhdmlvciBkdXJpbmcgYWN0aW9uIGRlZmluaXRpb24NCi1DRGF0YSA9IChbXihcXVxdPildKikNCi0NCi0vLyBbMjFdIENERW5kIDo6PSAnXV0+Jw0KLUNERW5kID0gKFxdXF0+KQ0KLQ0KLS8vIFsyMl0gcHJvbG9nIDo6PSBYTUxEZWNsPyBNaXNjKiAoZG9jdHlwZWRlY2wgTWlzYyopPw0KLXByb2xvZyA9ICh7WE1MRGVjbH0/IHtNaXNjfSogKHtkb2N0eXBlZGVjbH0ge01pc2N9Kik/KQ0KLQ0KLS8vIFsyM10gWE1MRGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbyBFbmNvZGluZ0RlY2w/IFNERGVjbD8gUz8gJz8+Jw0KLVhNTERlY2wgPSAoPFw/eG1sIHtWZXJzaW9uSW5mb30ge0VuY29kaW5nRGVjbH0/IHtTRERlY2x9PyB7U30/IFw/PikNCi0NCi0vLyBbMjRdIFZlcnNpb25JbmZvIDo6PSBTICd2ZXJzaW9uJyBFcSAoJyBWZXJzaW9uTnVtICcgfCAiIFZlcnNpb25OdW0gIikNCi1WZXJzaW9uSW5mbyA9ICh7U312ZXJzaW9ue0VxfShcJ3tWZXJzaW9uTnVtfVwnIHwgXCJ7VmVyc2lvbk51bX1cIikpDQotDQotLy8gWzI1XSBFcSA6Oj0gUz8gJz0nIFM/DQotRXEgPSAoXD0pDQotDQotLy8gWzI2XSBWZXJzaW9uTnVtIDo6PSAoW2EtekEtWjAtOV8uOl0gfCAnLScpKw0KLVZlcnNpb25OdW0gPSAoKFthLXpBLVowLTlfLjpdfFwtKSspDQotDQotLy8gWzI3XSBNaXNjIDo6PSBDb21tZW50IHwgUEkgfCAgUw0KLU1pc2MgPSAoe0NvbW1lbnR9IHwge1BJfSB8IHtTfSkNCi0NCi0vLyBbMjhdIGRvY3R5cGVkZWNsIDo6PSAnPCFET0NUWVBFJyBTIE5hbWUgKFMgRXh0ZXJuYWxJRCk/ICBTPyAoJ1snIChtYXJrdXBkZWNsIHwgUEVSZWZlcmVuY2UgfCBTKSogJ10nIFM/KT8gJz4nDQotZG9jdHlwZWRlY2wgPSAoPFwhRE9DVFlQRXtTfXtOYW1lfSAoe1N9e0V4dGVybmFsSUR9KT8ge1N9PyAoXFsgKHttYXJrdXBkZWNsfXx7UEVSZWZlcmVuY2V9fHtTfSkqIFxde1N9Pyk/PikNCi0NCi0vLyBbMjldIG1hcmt1cGRlY2wgOjo9IGVsZW1lbnRkZWNsIHwgQXR0bGlzdERlY2wgfCBFbnRpdHlEZWNsIHwgTm90YXRpb25EZWNsIHwgUEkgfCBDb21tZW50DQotbWFya3VwZGVjbCA9ICh7ZWxlbWVudGRlY2x9IHwge0F0dGxpc3REZWNsfSB8IHtFbnRpdHlEZWNsfSB8IHtOb3RhdGlvbkRlY2x9IHwge1BJfSB8IHtDb21tZW50fSkNCi0NCi0vLyBbMzBdIGV4dFN1YnNldCA6Oj0gVGV4dERlY2w/IGV4dFN1YnNldERlY2wNCi1leHRTdWJzZXQgPSAoe1RleHREZWNsfT8ge2V4dFN1YnNldERlY2x9KQ0KLQ0KLS8vIFszMV0gZXh0U3Vic2V0RGVjbCA6Oj0gKCBtYXJrdXBkZWNsIHwgY29uZGl0aW9uYWxTZWN0IHwgUEVSZWZlcmVuY2UgfCBTICkqDQotZXh0U3Vic2V0RGVjbCA9ICgoIHttYXJrdXBkZWNsfSB8IHtjb25kaXRpb25hbFNlY3R9IHwge1BFUmVmZXJlbmNlfSB8IHtTfSApKikNCi0NCi0vLyBbMzJdICBTRERlY2wgIDo6PSBTICdzdGFuZGFsb25lJyBFcSAoKCInIiAoJ3llcycgfCAnbm8nKSAiJyIpIHwgKCciJyAoJ3llcycgfCAnbm8nKSAnIicpKQ0KLVNERGVjbCAgPSAoe1N9c3RhbmRhbG9uZXtFcX17U30qKChcJyh5ZXN8bm8pXCcpfChcIih5ZXN8bm8pXCIpKSkNCi0NCi0vLyBbMzNdICBMYW5ndWFnZUlEICA6Oj0gTGFuZ2NvZGUgKCctJyBTdWJjb2RlKSoNCi1MYW5ndWFnZUlEICA9ICh7TGFuZ2NvZGV9KFwte1N1YmNvZGV9KSopDQotDQotLy8gWzM0XSAgTGFuZ2NvZGUgOjo9IElTTzYzOUNvZGUgfCAgSWFuYUNvZGUgfCAgVXNlckNvZGUNCi1MYW5nY29kZSA9ICh7SVNPNjM5Q29kZX0gfCAge0lhbmFDb2RlfSB8ICB7VXNlckNvZGV9KQ0KLQ0KLS8vIFszNV0gIElTTzYzOUNvZGUgOjo9IChbYS16XSB8IFtBLVpdKSAoW2Etel0gfCBbQS1aXSkNCi1JU082MzlDb2RlID0gKChbYS16XXxbQS1aXSkoW2Etel18W0EtWl0pKQ0KLQ0KLS8vIFszNl0gIElhbmFDb2RlIDo6PSAoJ2knIHwgJ0knKSAnLScgKFthLXpdIHwgW0EtWl0pKw0KLUlhbmFDb2RlID0gKChpfEkpXC0oW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzddICBVc2VyQ29kZSA6Oj0gKCd4JyB8ICdYJykgJy0nIChbYS16XSB8IFtBLVpdKSsNCi1Vc2VyQ29kZSA9ICgoeHxYKVwtKFthLXpdfFtBLVpdKSspDQotDQotLy8gWzM4XSAgU3ViY29kZSA6Oj0gKFthLXpdIHwgW0EtWl0pKw0KLVN1YmNvZGUgPSAoKFthLXpdfFtBLVpdKSspDQotDQotLy8gWzM5XSAgZWxlbWVudCAgOjo9IEVtcHR5RWxlbVRhZyB8IFNUYWcgY29udGVudCBFVGFnDQotZWxlbWVudCAgPSAoe0VtcHR5RWxlbVRhZ30gfCB7U1RhZ30ge2NvbnRlbnR9IHtFVGFnfSkNCi0NCi0vLyBbNDBdICBTVGFnICA6Oj0gJzwnIE5hbWUgKFMgQXR0cmlidXRlKSogUz8gJz4nDQotU1RhZyA9ICg8e05hbWV9KHtTfXtBdHRyaWJ1dGV9KSp7U30/PikNCi0NCi0vLyBbNDFdICBBdHRyaWJ1dGUgOjo9IE5hbWUgRXEgQXR0VmFsdWUNCi1BdHRyaWJ1dGUgPSAoe05hbWV9e1N9KntFcX17U30qe0F0dFZhbHVlfSkNCi0NCi0vLyBbNDJdICBFVGFnICA6Oj0gJ05hbWUgUz8gJz4nDQotRVRhZyA9ICg8XC97TmFtZX17U30/PikNCi0NCi0vLyBbNDNdICBjb250ZW50ICA6Oj0gKGVsZW1lbnQgfCBDaGFyRGF0YSB8IFJlZmVyZW5jZSB8IENEU2VjdCB8IFBJIHwgQ29tbWVudCkqDQotY29udGVudCA9ICgoe2VsZW1lbnR9IHwge0NoYXJEYXRhfSB8IHtSZWZlcmVuY2V9IHwge0NEU2VjdH0gfCB7UEl9IHwge0NvbW1lbnR9KSopDQotDQotLy8gWzQ0XSAgRW1wdHlFbGVtVGFnICA6Oj0gJzwnIE5hbWUgKFMgQXR0cmlidXRlKSogUz8gJy8+Jw0KLUVtcHR5RWxlbVRhZyA9ICg8e05hbWV9KHtTfXtBdHRyaWJ1dGV9KSp7U30/XC8+KQ0KLQ0KLS8vIFs0NV0gZWxlbWVudGRlY2wgOjo9ICc8IUVMRU1FTlQnIFMgTmFtZSBTIGNvbnRlbnRzcGVjIFM/ICc+Jw0KLWVsZW1lbnRkZWNsID0gKDxcIUVMRU1FTlR7U317TmFtZX17U317Y29udGVudHNwZWN9e1N9Pz4pDQotDQotLy8gWzQ2XSBjb250ZW50c3BlYyA6Oj0gJ0VNUFRZJyB8ICdBTlknIHwgTWl4ZWQgfCBjaGlsZHJlbg0KLWNvbnRlbnRzcGVjID0gKEVNUFRZfEFOWXx7TWl4ZWR9fHtjaGlsZHJlbn0pDQotDQotLy8gWzQ3XSBjaGlsZHJlbiA6Oj0gKGNob2ljZSB8IHNlcSkgKCc/JyB8ICcqJyB8ICcrJyk/DQotY2hpbGRyZW4gPSAoKHtjaG9pY2V9fHtzZXF9KShcP3xcKnxcKyk/KQ0KLQ0KLS8vIENBVVNFUyBMT09QIFRIUk9VR0ggREVGUyBPRiBDSE9JQ0UgQU5EIFNFUQ0KLS8vIFs0OF0gY3AgOjo9IChOYW1lIHwgY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8NCi1jcCA9ICgoe05hbWV9IHwge2Nob2ljZX0gfCB7c2VxfSkgKFw/fFwqfFwrKT8pDQotDQotLy8gWzQ5XSBjaG9pY2UgOjo9ICcoJyBTPyBjcCAoIFM/ICd8JyBTPyBjcCApKiBTPyAnKScNCi0vLyBjaG9pY2UgPSBcKHtTfT97Y3B9KHtTfT9cfHtTfT97Y3B9KSp7U30/XCkNCi1jaG9pY2UgPSBcKHtTfT97TmFtZX0oe1N9P1x8e1N9P3tOYW1lfSkqe1N9P1wpDQotDQotLy8gWzUwXSBzZXEgOjo9ICcoJyBTPyBjcCAoIFM/ICcsJyBTPyBjcCApKiBTPyAnKScNCi0vLyBzZXEgPSAoXCh7U30/e2NwfSh7U30/XCx7U30/e2NwfSkqe1N9P1wpKQ0KLXNlcSA9IChcKHtTfT97TmFtZX0oe1N9P1wse1N9P3tOYW1lfSkqe1N9P1wpKQ0KLQ0KLS8vIFs1MV0gTWl4ZWQgOjo9ICcoJyBTPyAnI1BDREFUQScgKFM/ICd8JyBTPyBOYW1lKSogUz8gICcpKicgfCAnKCcgUz8gJyNQQ0RBVEEnIFM/ICcpJw0KLU1peGVkID0gKHtTfT9cI1BDREFUQSh7U30/XHx7U30/e05hbWV9KSp7U30/KSpcfCh7U30/XCNQQ0RBVEF7U30/KQ0KLQ0KLS8vIFs1Ml0gQXR0bGlzdERlY2wgOjo9ICc8IUFUVExJU1QnIFMgTmFtZSBBdHREZWYqIFM/ICc+Jw0KLUF0dGxpc3REZWNsID0gKDxcIUFUVExJU1R7U317TmFtZX17QXR0RGVmfSp7U30/PikNCi0NCi0vLyBbNTNdIEF0dERlZiA6Oj0gUyBOYW1lIFMgQXR0VHlwZSBTIERlZmF1bHREZWNsDQotQXR0RGVmID0gKHtTfXtOYW1lfXtTfXtBdHRUeXBlfXtTfXtEZWZhdWx0RGVjbH0pDQotDQotLy8gWzU0XSBBdHRUeXBlIDo6PSBTdHJpbmdUeXBlIHwgVG9rZW5pemVkVHlwZSB8IEVudW1lcmF0ZWRUeXBlIA0KLUF0dFR5cGUgPSAoe1N0cmluZ1R5cGV9IHwge1Rva2VuaXplZFR5cGV9IHwge0VudW1lcmF0ZWRUeXBlfSkNCi0NCi0vLyBbNTVdIFN0cmluZ1R5cGUgOjo9ICdDREFUQScNCi1TdHJpbmdUeXBlID0gKENEQVRBKQ0KLQ0KLS8vIFs1Nl0gVG9rZW5pemVkVHlwZSA6Oj0gJ0lEJyB8ICdJRFJFRicgfCAnSURSRUZTJyB8ICdFTlRJVFknIHwgJ0VOVElUSUVTJyB8ICdOTVRPS0VOJyB8ICdOTVRPS0VOUycNCi1Ub2tlbml6ZWRUeXBlID0gKElEfElEUkVGfElEUkVGU3xFTlRJVFl8RU5USVRJRVN8Tk1UT0tFTnxOTVRPS0VOUykNCi0NCi0vLyBbNTddIEVudW1lcmF0ZWRUeXBlIDo6PSBOb3RhdGlvblR5cGUgfCBFbnVtZXJhdGlvbiANCi1FbnVtZXJhdGVkVHlwZSA9ICh7Tm90YXRpb25UeXBlfSB8IHtFbnVtZXJhdGlvbn0pDQotDQotLy8gWzU4XSBOb3RhdGlvblR5cGUgOjo9ICdOT1RBVElPTicgUyAnKCcgUz8gTmFtZSAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAnKScgDQotTm90YXRpb25UeXBlID0gKE5PVEFUSU9Oe1N9XCh7U30/e05hbWV9KHtTfT9cfHtTfT97TmFtZX0pKntTfT9cKSkNCi0NCi0vLyBbNTldIEVudW1lcmF0aW9uIDo6PSAnKCcgUz8gTm10b2tlbiAoUz8gJ3wnIFM/ICBObXRva2VuKSogUz8gJyknDQotRW51bWVyYXRpb24gPSAoXCh7U30/e05tdG9rZW59KHtTfT9cfHtTfT97Tm10b2tlbn0pKntTfT9cKSkNCi0NCi0vLyBbNjBdIERlZmF1bHREZWNsIDo6PSAnI1JFUVVJUkVEJyB8ICcjSU1QTElFRCcgfCAoKCcjRklYRUQnIFMpPyBBdHRWYWx1ZSkNCi1EZWZhdWx0RGVjbCA9IChcI1JFUVVJUkVEfFwjSU1QTElFRHwoKFwjRklYRUR7U30pP3tBdHRWYWx1ZX0pKQ0KLQ0KLS8vIFs2MV0gY29uZGl0aW9uYWxTZWN0IDo6PSBpbmNsdWRlU2VjdCB8IGlnbm9yZVNlY3QgDQotY29uZGl0aW9uYWxTZWN0ID0gKHtpbmNsdWRlU2VjdH0gfCB7aWdub3JlU2VjdH0pDQotDQotLy8gWzYyXSBpbmNsdWRlU2VjdCA6Oj0gJzwhWycgUz8gJ0lOQ0xVREUnIFM/ICdbJyBleHRTdWJzZXREZWNsICddXT4nIA0KLWluY2x1ZGVTZWN0ID0gKDxcIVxbe1N9P0lOQ0xVREV7U30/XFt7ZXh0U3Vic2V0RGVjbH1cXVxdPikNCi0NCi0vLyBbNjNdIGlnbm9yZVNlY3QgOjo9ICc8IVsnIFM/ICdJR05PUkUnIFM/ICdbJyBpZ25vcmVTZWN0Q29udGVudHMqICddXT4nDQotaWdub3JlU2VjdCA9ICg8XCFcW3tTfT9JR05PUkV7U30/XFt7aWdub3JlU2VjdENvbnRlbnRzfSpcXVxdPikNCi0NCi0vLyBbNjRdIGlnbm9yZVNlY3RDb250ZW50cyA6Oj0gSWdub3JlICgnPCFbJyBpZ25vcmVTZWN0Q29udGVudHMgJ11dPicgSWdub3JlKSoNCi1pZ25vcmVTZWN0Q29udGVudHMgPSAoe0lnbm9yZX0oPFwhXFt7aWdub3JlU2VjdENvbnRlbnRzfVxdXF0+e0lnbm9yZX0pKikNCi0NCi0vLyBbNjVdIElnbm9yZSA6Oj0gQ2hhciogLSAoQ2hhciogKCc8IVsnIHwgJ11dPicpIENoYXIqKQ0KLUlnbm9yZSA9ICAoW14oXDxcIVxbfFxdXF1cPildKikNCi0NCi0vLyBbNjZdIENoYXJSZWYgOjo9ICcmIycgWzAtOV0rICc7JyB8ICcmI3gnIFswLTlhLWZBLUZdKyAnOycNCi1DaGFyUmVmID0gKCYjWzAtOV0rO3wmI3hbMC05YS1mQS1GXSs7KQ0KLQ0KLS8vIFs2N10gUmVmZXJlbmNlIDo6PSBFbnRpdHlSZWYgfCBDaGFyUmVmDQotUmVmZXJlbmNlID0gKHtFbnRpdHlSZWZ9IHwge0NoYXJSZWZ9KQ0KLQ0KLS8vIFs2OF0gRW50aXR5UmVmID0gJyYnIE5hbWUgJzsnDQotRW50aXR5UmVmID0gKCZ7TmFtZX07KQ0KLQ0KLS8vIFs2OV0gUEVSZWZlcmVuY2UgOjo9ICclJyBOYW1lICc7Jw0KLVBFUmVmZXJlbmNlID0gKCV7TmFtZX07KQ0KLQ0KLS8vIFs3MF0gRW50aXR5RGVjbCA6Oj0gR0VEZWNsIHwgUEVEZWNsDQotRW50aXR5RGVjbCA9ICh7R0VEZWNsfSB8IHtQRURlY2x9KQ0KLQ0KLS8vIFs3MV0gR0VEZWNsIDo6PSAnPCFFTlRJVFknIFMgTmFtZSBTIEVudGl0eURlZiBTPyAnPicNCi1HRURlY2wgPSAoPFwhRU5USVRZe1N9e05hbWV9e1N9e0VudGl0eURlZn17U30/PikNCi0NCi0vLyBbNzJdIFBFRGVjbCA6Oj0gJzwhRU5USVRZJyBTICclJyBTIE5hbWUgUyBQRURlZiBTPyAnPicNCi1QRURlY2wgPSAoPFwhRU5USVRZe1N9XCV7U317TmFtZX17U317UEVEZWZ9e1N9Pz4pDQotDQotLy8gWzczXSBFbnRpdHlEZWYgOjo9IEVudGl0eVZhbHVlIHwgKEV4dGVybmFsSUQgTkRhdGFEZWNsPykNCi1FbnRpdHlEZWYgPSAoe0VudGl0eVZhbHVlfSB8ICh7RXh0ZXJuYWxJRH17TkRhdGFEZWNsfT8pKQ0KLQ0KLS8vIFs3NF0gUEVEZWYgOjo9IEVudGl0eVZhbHVlIHwgRXh0ZXJuYWxJRA0KLVBFRGVmID0gKHtFbnRpdHlWYWx1ZX0gfCB7RXh0ZXJuYWxJRH0pDQotDQotLy8gWzc1XSBFeHRlcm5hbElEIDo6PSAnU1lTVEVNJyBTIFN5c3RlbUxpdGVyYWwgfCAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbCBTIFN5c3RlbUxpdGVyYWwgDQotRXh0ZXJuYWxJRCA9IChTWVNURU17U317U3lzdGVtTGl0ZXJhbH18UFVCTElDe1N9e1B1YmlkTGl0ZXJhbH17U317U3lzdGVtTGl0ZXJhbH0gKQ0KLQ0KLS8vIFs3Nl0gTkRhdGFEZWNsIDo6PSBTICdOREFUQScgUyBOYW1lDQotTkRhdGFEZWNsID0gKHtTfU5EQVRBe1N9e05hbWV9KQ0KLQ0KLS8vIFs3N10gVGV4dERlY2wgOjo9ICc8P3htbCcgVmVyc2lvbkluZm8/IEVuY29kaW5nRGVjbCBTPyAnPz4nDQotVGV4dERlY2wgPSAoPFw/eG1se1ZlcnNpb25JbmZvfT97RW5jb2RpbmdEZWNsfXtTfT9cPz4pDQotDQotLy8gWzc4XSBleHRQYXJzZWRFbnQgOjo9IFRleHREZWNsPyBjb250ZW50DQotZXh0UGFyc2VkRW50ID0gKHtUZXh0RGVjbH0/e2NvbnRlbnR9KQ0KLQ0KLS8vIFs3OV0gZXh0UEUgOjo9IFRleHREZWNsPyBleHRTdWJzZXREZWNsDQotZXh0UEUgPSAoe1RleHREZWNsfT97ZXh0U3Vic2V0RGVjbH0pDQotDQotLy8gWzgwXSBFbmNvZGluZ0RlY2wgOjo9IFMgJ2VuY29kaW5nJyBFcSAoJyInIEVuY05hbWUgJyInIHwgICInIiBFbmNOYW1lICInIiApIA0KLUVuY29kaW5nRGVjbCA9ICh7U31lbmNvZGluZ3tTfSp7RXF9e1N9KihcIntFbmNOYW1lfVwifFwne0VuY05hbWV9XCcpKQ0KLQ0KLS8vIFs4MV0gRW5jTmFtZSA6Oj0gW0EtWmEtel0gKFtBLVphLXowLTkuX10gfCAnLScpKg0KLUVuY05hbWUgPSAoW0EtWmEtel0oW0EtWmEtejAtOS5fXXxcLSkqKQ0KLQ0KLS8vIFs4Ml0gTm90YXRpb25EZWNsIDo6PSAnPCFOT1RBVElPTicgUyBOYW1lIFMgKEV4dGVybmFsSUQgfCAgUHVibGljSUQpIFM/ICc+Jw0KLU5vdGF0aW9uRGVjbCA9ICg8XCFOT1RBVElPTntTfXtOYW1lfXtTfSh7RXh0ZXJuYWxJRH18e1B1YmxpY0lEfSl7U30/PikNCi0NCi0vLyBbODNdIFB1YmxpY0lEIDo6PSAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbA0KLVB1YmxpY0lEID0gKFBVQkxJQ3tTfXtQdWJpZExpdGVyYWx9KQ0KLQ0KLS8vIFs4NF0gIExldHRlciA6Oj0gQmFzZUNoYXIgfCBJZGVvZ3JhcGhpYw0KLUxldHRlciA9ICh7QmFzZUNoYXJ9IHwge0lkZW9ncmFwaGljfSkNCi0NCi0vLyBbODVdICBCYXNlQ2hhciA6Oj0gWyN4MDA0MS0jeDAwNUFdIHwgWyN4MDA2MS0jeDAwN0FdIHwgWyN4MDBDMC0jeDAwRDZdDQotLy8gfCBbI3gwMEQ4LSN4MDBGNl0gfCBbI3gwMEY4LSN4MDBGRl0gfCBbI3gwMTAwLSN4MDEzMV0NCi0vLyB8IFsjeDAxMzQtI3gwMTNFXSB8IFsjeDAxNDEtI3gwMTQ4XSB8IFsjeDAxNEEtI3gwMTdFXQ0KLS8vIHwgWyN4MDE4MC0jeDAxQzNdIHwgWyN4MDFDRC0jeDAxRjBdIHwgWyN4MDFGNC0jeDAxRjVdDQotLy8gfCBbI3gwMUZBLSN4MDIxN10gfCBbI3gwMjUwLSN4MDJBOF0gfCBbI3gwMkJCLSN4MDJDMV0gfCAjeDAzODYNCi0vLyB8IFsjeDAzODgtI3gwMzhBXSB8ICN4MDM4QyB8IFsjeDAzOEUtI3gwM0ExXSB8IFsjeDAzQTMtI3gwM0NFXQ0KLS8vIHwgWyN4MDNEMC0jeDAzRDZdIHwgI3gwM0RBIHwgI3gwM0RDIHwgI3gwM0RFIHwgI3gwM0UwDQotLy8gfCBbI3gwM0UyLSN4MDNGM10gfCBbI3gwNDAxLSN4MDQwQ10gfCBbI3gwNDBFLSN4MDQ0Rl0NCi0vLyB8IFsjeDA0NTEtI3gwNDVDXSB8IFsjeDA0NUUtI3gwNDgxXSB8IFsjeDA0OTAtI3gwNEM0XQ0KLS8vIHwgWyN4MDRDNy0jeDA0QzhdIHwgWyN4MDRDQi0jeDA0Q0NdIHwgWyN4MDREMC0jeDA0RUJdDQotLy8gfCBbI3gwNEVFLSN4MDRGNV0gfCBbI3gwNEY4LSN4MDRGOV0gfCBbI3gwNTMxLSN4MDU1Nl0gfCAjeDA1NTkNCi0vLyB8IFsjeDA1NjEtI3gwNTg2XSB8IFsjeDA1RDAtI3gwNUVBXSB8IFsjeDA1RjAtI3gwNUYyXQ0KLS8vIHwgWyN4MDYyMS0jeDA2M0FdIHwgWyN4MDY0MS0jeDA2NEFdIHwgWyN4MDY3MS0jeDA2QjddDQotLy8gfCBbI3gwNkJBLSN4MDZCRV0gfCBbI3gwNkMwLSN4MDZDRV0gfCBbI3gwNkQwLSN4MDZEM10gfCAjeDA2RDUNCi0vLyB8IFsjeDA2RTUtI3gwNkU2XSB8IFsjeDA5MDUtI3gwOTM5XSB8ICN4MDkzRCB8IFsjeDA5NTgtI3gwOTYxXQ0KLS8vIHwgWyN4MDk4NS0jeDA5OENdIHwgWyN4MDk4Ri0jeDA5OTBdIHwgWyN4MDk5My0jeDA5QThdDQotLy8gfCBbI3gwOUFBLSN4MDlCMF0gfCAjeDA5QjIgfCBbI3gwOUI2LSN4MDlCOV0gfCBbI3gwOURDLSN4MDlERF0NCi0vLyB8IFsjeDA5REYtI3gwOUUxXSB8IFsjeDA5RjAtI3gwOUYxXSB8IFsjeDBBMDUtI3gwQTBBXQ0KLS8vIHwgWyN4MEEwRi0jeDBBMTBdIHwgWyN4MEExMy0jeDBBMjhdIHwgWyN4MEEyQS0jeDBBMzBdDQotLy8gfCBbI3gwQTMyLSN4MEEzM10gfCBbI3gwQTM1LSN4MEEzNl0gfCBbI3gwQTM4LSN4MEEzOV0NCi0vLyB8IFsjeDBBNTktI3gwQTVDXSB8ICN4MEE1RSB8IFsjeDBBNzItI3gwQTc0XSB8IFsjeDBBODUtI3gwQThCXQ0KLS8vIHwgI3gwQThEIHwgWyN4MEE4Ri0jeDBBOTFdIHwgWyN4MEE5My0jeDBBQThdIHwgWyN4MEFBQS0jeDBBQjBdDQotLy8gfCBbI3gwQUIyLSN4MEFCM10gfCBbI3gwQUI1LSN4MEFCOV0gfCAjeDBBQkQgfCAjeDBBRTANCi0vLyB8IFsjeDBCMDUtI3gwQjBDXSB8IFsjeDBCMEYtI3gwQjEwXSB8IFsjeDBCMTMtI3gwQjI4XQ0KLS8vIHwgWyN4MEIyQS0jeDBCMzBdIHwgWyN4MEIzMi0jeDBCMzNdIHwgWyN4MEIzNi0jeDBCMzldIHwgI3gwQjNEDQotLy8gfCBbI3gwQjVDLSN4MEI1RF0gfCBbI3gwQjVGLSN4MEI2MV0gfCBbI3gwQjg1LSN4MEI4QV0NCi0vLyB8IFsjeDBCOEUtI3gwQjkwXSB8IFsjeDBCOTItI3gwQjk1XSB8IFsjeDBCOTktI3gwQjlBXSB8ICN4MEI5Qw0KLS8vIHwgWyN4MEI5RS0jeDBCOUZdIHwgWyN4MEJBMy0jeDBCQTRdIHwgWyN4MEJBOC0jeDBCQUFdDQotLy8gfCBbI3gwQkFFLSN4MEJCNV0gfCBbI3gwQkI3LSN4MEJCOV0gfCBbI3gwQzA1LSN4MEMwQ10NCi0vLyB8IFsjeDBDMEUtI3gwQzEwXSB8IFsjeDBDMTItI3gwQzI4XSB8IFsjeDBDMkEtI3gwQzMzXQ0KLS8vIHwgWyN4MEMzNS0jeDBDMzldIHwgWyN4MEM2MC0jeDBDNjFdIHwgWyN4MEM4NS0jeDBDOENdDQotLy8gfCBbI3gwQzhFLSN4MEM5MF0gfCBbI3gwQzkyLSN4MENBOF0gfCBbI3gwQ0FBLSN4MENCM10NCi0vLyB8IFsjeDBDQjUtI3gwQ0I5XSB8ICN4MENERSB8IFsjeDBDRTAtI3gwQ0UxXSB8IFsjeDBEMDUtI3gwRDBDXQ0KLS8vIHwgWyN4MEQwRS0jeDBEMTBdIHwgWyN4MEQxMi0jeDBEMjhdIHwgWyN4MEQyQS0jeDBEMzldDQotLy8gfCBbI3gwRDYwLSN4MEQ2MV0gfCBbI3gwRTAxLSN4MEUyRV0gfCAjeDBFMzAgfCBbI3gwRTMyLSN4MEUzM10NCi0vLyB8IFsjeDBFNDAtI3gwRTQ1XSB8IFsjeDBFODEtI3gwRTgyXSB8ICN4MEU4NCB8IFsjeDBFODctI3gwRTg4XQ0KLS8vIHwgI3gwRThBIHwgI3gwRThEIHwgWyN4MEU5NC0jeDBFOTddIHwgWyN4MEU5OS0jeDBFOUZdDQotLy8gfCBbI3gwRUExLSN4MEVBM10gfCAjeDBFQTUgfCAjeDBFQTcgfCBbI3gwRUFBLSN4MEVBQl0NCi0vLyB8IFsjeDBFQUQtI3gwRUFFXSB8ICN4MEVCMCB8IFsjeDBFQjItI3gwRUIzXSB8ICN4MEVCRA0KLS8vIHwgWyN4MEVDMC0jeDBFQzRdIHwgWyN4MEY0MC0jeDBGNDddIHwgWyN4MEY0OS0jeDBGNjldDQotLy8gfCBbI3gxMEEwLSN4MTBDNV0gfCBbI3gxMEQwLSN4MTBGNl0gfCAjeDExMDAgfCBbI3gxMTAyLSN4MTEwM10NCi0vLyB8IFsjeDExMDUtI3gxMTA3XSB8ICN4MTEwOSB8IFsjeDExMEItI3gxMTBDXSB8IFsjeDExMEUtI3gxMTEyXQ0KLS8vIHwgI3gxMTNDIHwgI3gxMTNFIHwgI3gxMTQwIHwgI3gxMTRDIHwgI3gxMTRFIHwgI3gxMTUwDQotLy8gfCBbI3gxMTU0LSN4MTE1NV0gfCAjeDExNTkgfCBbI3gxMTVGLSN4MTE2MV0gfCAjeDExNjMgfCAjeDExNjUNCi0vLyB8ICN4MTE2NyB8ICN4MTE2OSB8IFsjeDExNkQtI3gxMTZFXSB8IFsjeDExNzItI3gxMTczXSB8ICN4MTE3NQ0KLS8vIHwgI3gxMTlFIHwgI3gxMUE4IHwgI3gxMUFCIHwgWyN4MTFBRS0jeDExQUZdIHwgWyN4MTFCNy0jeDExQjhdDQotLy8gfCAjeDExQkEgfCBbI3gxMUJDLSN4MTFDMl0gfCAjeDExRUIgfCAjeDExRjAgfCAjeDExRjkNCi0vLyB8IFsjeDFFMDAtI3gxRTlCXSB8IFsjeDFFQTAtI3gxRUY5XSB8IFsjeDFGMDAtI3gxRjE1XQ0KLS8vIHwgWyN4MUYxOC0jeDFGMURdIHwgWyN4MUYyMC0jeDFGNDVdIHwgWyN4MUY0OC0jeDFGNERdDQotLy8gfCBbI3gxRjUwLSN4MUY1N10gfCAjeDFGNTkgfCAjeDFGNUIgfCAjeDFGNUQgfCBbI3gxRjVGLSN4MUY3RF0NCi0vLyB8IFsjeDFGODAtI3gxRkI0XSB8IFsjeDFGQjYtI3gxRkJDXSB8ICN4MUZCRSB8IFsjeDFGQzItI3gxRkM0XQ0KLS8vIHwgWyN4MUZDNi0jeDFGQ0NdIHwgWyN4MUZEMC0jeDFGRDNdIHwgWyN4MUZENi0jeDFGREJdDQotLy8gfCBbI3gxRkUwLSN4MUZFQ10gfCBbI3gxRkYyLSN4MUZGNF0gfCBbI3gxRkY2LSN4MUZGQ10gfCAjeDIxMjYNCi0vLyB8IFsjeDIxMkEtI3gyMTJCXSB8ICN4MjEyRSB8IFsjeDIxODAtI3gyMTgyXSB8IFsjeDMwNDEtI3gzMDk0XQ0KLS8vIHwgWyN4MzBBMS0jeDMwRkFdIHwgWyN4MzEwNS0jeDMxMkNdIHwgWyN4QUMwMC0jeEQ3QTNdDQotQmFzZUNoYXIgPSBbXHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXQ0KLQ0KLS8vIFs4Nl0gIElkZW9ncmFwaGljIDo6PSBbI3g0RTAwLSN4OUZBNV0gfCAjeDMwMDcgfCBbI3gzMDIxLSN4MzAyOV0NCi1JZGVvZ3JhcGhpYyA9IFtcdTRFMDAtXHU5RkE1XHUzMDA3XHUzMDIxLVx1MzAyOV0NCi0NCi0vLyBbODddICAgICAgQ29tYmluaW5nQ2hhciAgICA6Oj0gICAgWyN4MDMwMC0jeDAzNDVdICAgIHwgWyN4MDM2MC0jeDAzNjFdDQotLy8gfCBbI3gwNDgzLSN4MDQ4Nl0gICAgICAgICAgfCBbI3gwNTkxLSN4MDVBMV0gICAgICAgICB8IFsjeDA1QTMtI3gwNUI5XQ0KLS8vIHwgWyN4MDVCQi0jeDA1QkRdICAgICAgIHwgI3gwNUJGICAgICAgIHwgWyN4MDVDMS0jeDA1QzJdCSB8ICN4MDVDNA0KLS8vIHwgWyN4MDY0Qi0jeDA2NTJdICAgIHwgI3gwNjcwICAgIHwgWyN4MDZENi0jeDA2RENdICAgfCBbI3gwNkRELSN4MDZERl0NCi0vLyB8IFsjeDA2RTAtI3gwNkU0XSAgICAgICAgICB8IFsjeDA2RTctI3gwNkU4XSAgICAgICAgIHwgWyN4MDZFQS0jeDA2RURdDQotLy8gfCBbI3gwOTAxLSN4MDkwM10gICAgICAgfCAjeDA5M0MgICAgICAgfCBbI3gwOTNFLSN4MDk0Q10gICAgICB8ICN4MDk0RA0KLS8vIHwgWyN4MDk1MS0jeDA5NTRdICAgIHwgWyN4MDk2Mi0jeDA5NjNdICAgIHwgWyN4MDk4MS0jeDA5ODNdICAgfCAjeDA5QkMNCi0vLyB8ICN4MDlCRSAgICAgICB8ICN4MDlCRiAgICAgICB8IFsjeDA5QzAtI3gwOUM0XSAgICAgIHwgWyN4MDlDNy0jeDA5QzhdDQotLy8gfCBbI3gwOUNCLSN4MDlDRF0gICB8ICN4MDlENyAgIHwgWyN4MDlFMi0jeDA5RTNdICAgfCAjeDBBMDIgICB8ICN4MEEzQw0KLS8vIHwgI3gwQTNFICAgICAgIHwgI3gwQTNGICAgICAgIHwgWyN4MEE0MC0jeDBBNDJdICAgICAgfCBbI3gwQTQ3LSN4MEE0OF0NCi0vLyB8IFsjeDBBNEItI3gwQTREXSAgICB8IFsjeDBBNzAtI3gwQTcxXSAgICB8IFsjeDBBODEtI3gwQTgzXSAgIHwgI3gwQUJDDQotLy8gfCBbI3gwQUJFLSN4MEFDNV0gICAgICAgICAgfCBbI3gwQUM3LSN4MEFDOV0gICAgICAgICB8IFsjeDBBQ0ItI3gwQUNEXQ0KLS8vIHwgWyN4MEIwMS0jeDBCMDNdICAgIHwgI3gwQjNDICAgIHwgWyN4MEIzRS0jeDBCNDNdICAgfCBbI3gwQjQ3LSN4MEI0OF0NCi0vLyB8IFsjeDBCNEItI3gwQjREXSAgICAgICAgICB8IFsjeDBCNTYtI3gwQjU3XSAgICAgICAgIHwgWyN4MEI4Mi0jeDBCODNdDQotLy8gfCBbI3gwQkJFLSN4MEJDMl0gICAgfCBbI3gwQkM2LSN4MEJDOF0gICAgfCBbI3gwQkNBLSN4MEJDRF0gICB8ICN4MEJENw0KLS8vIHwgWyN4MEMwMS0jeDBDMDNdICAgICAgICAgIHwgWyN4MEMzRS0jeDBDNDRdICAgICAgICAgfCBbI3gwQzQ2LSN4MEM0OF0NCi0vLyB8IFsjeDBDNEEtI3gwQzREXSAgICAgICAgICB8IFsjeDBDNTUtI3gwQzU2XSAgICAgICAgIHwgWyN4MEM4Mi0jeDBDODNdDQotLy8gfCBbI3gwQ0JFLSN4MENDNF0gICAgICAgICAgfCBbI3gwQ0M2LSN4MENDOF0gICAgICAgICB8IFsjeDBDQ0EtI3gwQ0NEXQ0KLS8vIHwgWyN4MENENS0jeDBDRDZdICAgICAgICAgIHwgWyN4MEQwMi0jeDBEMDNdICAgICAgICAgfCBbI3gwRDNFLSN4MEQ0M10NCi0vLyB8IFsjeDBENDYtI3gwRDQ4XSAgICAgICB8IFsjeDBENEEtI3gwRDREXSAgICAgICB8ICN4MEQ1NyAgICAgIHwgI3gwRTMxDQotLy8gfCBbI3gwRTM0LSN4MEUzQV0gICAgfCBbI3gwRTQ3LSN4MEU0RV0gICAgfCAjeDBFQjEgICB8IFsjeDBFQjQtI3gwRUI5XQ0KLS8vIHwgWyN4MEVCQi0jeDBFQkNdICAgIHwgWyN4MEVDOC0jeDBFQ0RdICAgIHwgWyN4MEYxOC0jeDBGMTldICAgfCAjeDBGMzUNCi0vLyB8ICN4MEYzNyAgICAgIHwgI3gwRjM5ICAgICB8ICN4MEYzRSAgICAgfCAjeDBGM0YgICAgIHwgWyN4MEY3MS0jeDBGODRdDQotLy8gfCBbI3gwRjg2LSN4MEY4Ql0gICAgfCBbI3gwRjkwLSN4MEY5NV0gICAgfCAjeDBGOTcgICB8IFsjeDBGOTktI3gwRkFEXQ0KLS8vIHwgWyN4MEZCMS0jeDBGQjddICAgICAgIHwgI3gwRkI5ICAgICAgIHwgWyN4MjBEMC0jeDIwRENdICAgICAgfCAjeDIwRTENCi0vLyB8IFsjeDMwMkEtI3gzMDJGXSB8ICN4MzA5OSB8ICN4MzA5QQ0KLUNvbWJpbmluZ0NoYXIgPSAgICBbXHUwMzAwLVx1MDM0NVx1MDM2MC1cdTAzNjFcdTA0ODMtXHUwNDg2XHUwNTkxLVx1MDVBMVx1MDVBMy1cdTA1QjlcdTA1QkItXHUwNUJEXHUwNUJGXHUwNUMxLVx1MDVDMlx1MDVDNFx1MDY0Qi1cdTA2NTJcdTA2NzBcdTA2RDYtXHUwNkRDXHUwNkRELVx1MDZERlx1MDZFMC1cdTA2RTRcdTA2RTctXHUwNkU4XHUwNkVBLVx1MDZFRFx1MDkwMS1cdTA5MDNcdTA5M0NcdTA5M0UtXHUwOTRDXHUwOTREXHUwOTUxLVx1MDk1NFx1MDk2Mi1cdTA5NjNcdTA5ODEtXHUwOTgzXHUwOUJDXHUwOUJFXHUwOUJGXHUwOUMwLVx1MDlDNFx1MDlDNy1cdTA5QzhcdTA5Q0ItXHUwOUNEXHUwOUQ3XHUwOUUyLVx1MDlFM1x1MEEwMlx1MEEzQ1x1MEEzRVx1MEEzRlx1MEE0MC1cdTBBNDJcdTBBNDctXHUwQTQ4XHUwQTRCLVx1MEE0RFx1MEE3MC1cdTBBNzFcdTBBODEtXHUwQTgzXHUwQUJDXHUwQUJFLVx1MEFDNVx1MEFDNy1cdTBBQzlcdTBBQ0ItXHUwQUNEXHUwQjAxLVx1MEIwM1x1MEIzQ1x1MEIzRS1cdTBCNDNcdTBCNDctXHUwQjQ4XHUwQjRCLVx1MEI0RFx1MEI1Ni1cdTBCNTdcdTBCODItXHUwQjgzXHUwQkJFLVx1MEJDMlx1MEJDNi1cdTBCQzhcdTBCQ0EtXHUwQkNEXHUwQkQ3XHUwQzAxLVx1MEMwM1x1MEMzRS1cdTBDNDRcdTBDNDYtXHUwQzQ4XHUwQzRBLVx1MEM0RFx1MEM1NS1cdTBDNTZcdTBDODItXHUwQzgzXHUwQ0JFLVx1MENDNFx1MENDNi1cdTBDQzhcdTBDQ0EtXHUwQ0NEXHUwQ0Q1LVx1MENENlx1MEQwMi1cdTBEMDNcdTBEM0UtXHUwRDQzXHUwRDQ2LVx1MEQ0OFx1MEQ0QS1cdTBENERcdTBENTdcdTBFMzFcdTBFMzQtXHUwRTNBXHUwRTQ3LVx1MEU0RVx1MEVCMVx1MEVCNC1cdTBFQjlcdTBFQkItXHUwRUJDXHUwRUM4LVx1MEVDRFx1MEYxOC1cdTBGMTlcdTBGMzVcdTBGMzdcdTBGMzlcdTBGM0VcdTBGM0ZcdTBGNzEtXHUwRjg0XHUwRjg2LVx1MEY4Qlx1MEY5MC1cdTBGOTVcdTBGOTdcdTBGOTktXHUwRkFEXHUwRkIxLVx1MEZCN1x1MEZCOVx1MjBEMC1cdTIwRENcdTIwRTFcdTMwMkEtXHUzMDJGXHUzMDk5XHUzMDlBXQ0KLQ0KLS8vIFs4OF0gICBEaWdpdCAgOjo9ICBbI3gwMDMwLSN4MDAzOV0gfCBbI3gwNjYwLSN4MDY2OV0gfCBbI3gwNkYwLSN4MDZGOV0NCi0vLyB8IFsjeDA5NjYtI3gwOTZGXSAgICAgICAgICB8IFsjeDA5RTYtI3gwOUVGXSAgICAgICAgIHwgWyN4MEE2Ni0jeDBBNkZdDQotLy8gfCBbI3gwQUU2LSN4MEFFRl0gICAgICAgICAgfCBbI3gwQjY2LSN4MEI2Rl0gICAgICAgICB8IFsjeDBCRTctI3gwQkVGXQ0KLS8vIHwgWyN4MEM2Ni0jeDBDNkZdICAgICAgICAgIHwgWyN4MENFNi0jeDBDRUZdICAgICAgICAgfCBbI3gwRDY2LSN4MEQ2Rl0NCi0vLyB8IFsjeDBFNTAtI3gwRTU5XSB8IFsjeDBFRDAtI3gwRUQ5XSB8IFsjeDBGMjAtI3gwRjI5XQ0KLURpZ2l0ID0gIFtcdTAwMzAtXHUwMDM5XHUwNjYwLVx1MDY2OVx1MDZGMC1cdTA2RjlcdTA5NjYtXHUwOTZGXHUwOUU2LVx1MDlFRlx1MEE2Ni1cdTBBNkZcdTBBRTYtXHUwQUVGXHUwQjY2LVx1MEI2Rlx1MEJFNy1cdTBCRUZcdTBDNjYtXHUwQzZGXHUwQ0U2LVx1MENFRlx1MEQ2Ni1cdTBENkZcdTBFNTAtXHUwRTU5XHUwRUQwLVx1MEVEOVx1MEYyMC1cdTBGMjldDQotDQotLy8gWzg5XSAgRXh0ZW5kZXIgOjo9ICN4MDBCNyB8ICN4MDJEMCB8ICN4MDJEMSB8ICN4MDM4NyB8ICN4MDY0MCB8ICN4MEU0Ng0KLS8vIHwgI3gwRUM2ICAgICAgIHwgI3gzMDA1ICAgICAgIHwgWyN4MzAzMS0jeDMwMzVdICAgICAgfCBbI3gzMDlELSN4MzA5RV0NCi0vLyB8IFsjeDMwRkMtI3gzMEZFXQ0KLUV4dGVuZGVyID0gW1x1MDBCN1x1MDJEMFx1MDJEMVx1MDM4N1x1MDY0MFx1MEU0Nlx1MEVDNlx1MzAwNVx1MzAzMS1cdTMwMzVcdTMwOUQtXHUzMDlFXHUzMEZDLVx1MzBGRV0NCi0NCi0NCi0NCi0vKioNCi0gKiBKU1AgYW5kIHNjcmlwdGluZyBtYXJrZXIgYWxsb3dhbmNlcw0KLSAqLw0KLQ0KLWpzcENvbW1lbnRTdGFydCA9IDwlLS0NCi1qc3BDb21tZW50RW5kICAgPSAtLSU+DQotDQotanNwU2NyaXB0bGV0U3RhcnQgICAgICAgID0gPCUNCi1qc3BFeHByZXNzaW9uU3RhcnQgICAgICAgPSB7anNwU2NyaXB0bGV0U3RhcnR9PQ0KLWpzcERlY2xhcmF0aW9uU3RhcnQgICAgICA9IHtqc3BTY3JpcHRsZXRTdGFydH1cIQ0KLWpzcFNjcmlwdGxldEVuZCAgICAgICAgICA9ICU+DQotanNwRGlyZWN0aXZlU3RhcnQgICAgICAgID0ge2pzcFNjcmlwdGxldFN0YXJ0fUANCi0NCi0lJQ0KLQ0KLS8qIHdoaXRlIHNwYWNlIHdpdGhpbiBhIHRhZyAqLw0KLTxTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX1BJLCBTVF9YTUxfUElfRVFVQUxTLCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiwgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFLFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQsU1RfREhUTUxfQVRUUklCVVRFX05BTUUsU1RfREhUTUxfRVFVQUxTLFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSxTVF9ESFRNTF9UQUdfQ0xPU0U+IHtTfSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi0NCi0vLyBCRUdJTiBSRUdVTEFSIFhNTA0KLS8qIGhhbmRsZSBvcGVuaW5nIGEgbmV3IHRhZyBhbG1vc3QgYW55d2hlcmUgKi8NCi0NCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9KU1BfRElSRUNUSVZFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUywgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47DQotfQ0KLS8qIFZFUlkgc3BlY2lhbCBjYXNlcyBmb3IgdGFncyBhcyB2YWx1ZXMgKi8NCi0vKiBxdW90ZWQgSlNQICovDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gWyJdIHsNCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4gWyddIHsNCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URTsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IFsiXSB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBjb21wbGV4IGRvdWJsZSBxdW90ZWQiKTsvLyROT04tTkxTLTEkDQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpOw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiBbJ10gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCk7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBzaW5nbGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJA0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gKFtePCJceDI0XHgyM118W1x4MjRceDIzXVteXHg3Yl0pKyB7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4gKFtePCdceDI0XHgyM118W1x4MjRceDIzXVteXHg3Yl0pKyB7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IHtnZW5lcmljVGFnT3Blbn0gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCWludCBpbmNvbWluZ1N0YXRlID0geXlzdGF0ZSgpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgaW5zaWRlIG9mIEpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsNCi0JaWYoeXlzdGF0ZSgpICE9IFNUX0FCT1JUX0VNQkVEREVEKQ0KLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQsU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEPiB7Z2VuZXJpY0VuZFRhZ09wZW59IHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGVuZCB0YWciKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfRU5EX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7DQotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkNCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi0vKiB1bnF1b3RlZCAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY1RhZ09wZW59IHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCB0YWcgZW1iZWRkZWQgbmFtZSBzdGFydCAtIHN0YXJ0IHRhZyIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OPiB7Z2VuZXJpY0VuZFRhZ09wZW59IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9FTkRfVEFHX09QRU47DQotfQ0KLS8qIHNwZWNpYWxseSB0cmVhdGVkIEpTUCB0YWcgbmFtZXMgKi8NCi08U1RfWE1MX1RBR19OQU1FPiBqc3A6cm9vdCB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgianNwOnJvb3QgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIEpTUF9ST09UX1RBR19OQU1FOw0KLX0NCi08U1RfWE1MX1RBR19OQU1FPiBqc3A6ZGlyZWN0aXZlLihwYWdlfGluY2x1ZGV8dGFnfHRhZ2xpYnxhdHRyaWJ1dGV8dmFyaWFibGUpIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJqc3AgZGlyZWN0aXZlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBKU1BfRElSRUNUSVZFX05BTUU7DQotfQ0KLS8qIHRoZSB0YWcncyBuYW1lIHdhcyBmb3VuZCwgc3RhcnQgc2Nhbm5pbmcgZm9yIGF0dHJpYnV0ZXMgKi8NCi08U1RfWE1MX1RBR19OQU1FPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLQ0KLS8qIGFub3RoZXIgYXR0cmlidXRlIG5hbWUgd2FzIGZvdW5kLCByZXN1bWUgbG9va2luZyBmb3IgdGhlIGVxdWFscyBzaWduICovDQotPFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotfQ0KLS8qIGFuIGVxdWFsIHNpZ24gd2FzIGZvdW5kLCB3aGF0J3MgbmV4dCBpcyB0aGUgdmFsdWUgKi8NCi08U1RfWE1MX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0vKiB0aGUgdGFnJ3MgY2xvc2Ugd2FzIGZvdW5kICovDQotPFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlpZihpc0Jsb2NrTWFya2VyKCkpIHsNCi0JCWZFbWJlZGRlZEhpbnQgPSBnZXRCbG9ja01hcmtlckNvbnRleHQoKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0JMT0NLX1RBR19TQ0FOOw0KLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQl9DQotCWVsc2UNCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsNCi19DQotLyogdGhlIHRhZydzIGNsb3NlIHdhcyBmb3VuZCwgYnV0IHRoZSB0YWcgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgZW5kIHRhZyAqLw0KLTxTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNFbXB0eVRhZ0Nsb3NlfSB7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7DQotfQ0KLQ0KLTxTVF9YTUxfVEFHX05BTUU+IFtePC8+XHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXHU0RTAwLVx1OUZBNVx1MzAwN1x1MzAyMS1cdTMwMjldKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JaWYoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKT09U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEfHxmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpLTEpOw0KLQkJcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQl9DQotCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsNCi19DQotDQotLy8gRU5EIFJFR1VMQVIgWE1MDQotDQotLy8gQkVHSU4gTkVTVEVEIFhNTCBUQUdTDQotPFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0VRVUFMUz4gPHtOYW1lfSB7DQotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOw0KLQkvLyBwdXNoYmFjayB0byBqdXN0IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNrZXQNCi0JeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMSk7DQotCS8qDQotCSAqIElmIHRoaXMgdGFnIGNhbiBub3QgYmUgbmVzdGVkIG9yIHdlJ3JlIGFscmVhZHkgc2VhcmNoaW5nIGZvciBhbg0KLQkgKiBhdHRyaWJ1dGUgbmFtZSwgZXF1YWxzLCBvciB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5Lg0KLQkgKi8NCi0JaWYgKCFpc05lc3RhYmxlKHRhZ05hbWUpIHx8ICghZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0VRVUFMUyB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkpKSB7DQotCQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotCQlyZXR1cm4gWE1MX1RBR19PUEVOOw0KLQl9DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQkvLyBlbWJlZGRlZCBjb250YWluZXIgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIHRoZSBuYW1lIChhZ2FpbikgbmV4dA0KLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLQl5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IDx7TmFtZX0gew0KLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsNCi0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0DQotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOw0KLQkvKg0KLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4NCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4NCi0JICovDQotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpKSkgew0KLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsNCi0JfQ0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQkvLyBlbWJlZGRlZCBjb250YWluZXIgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIHRoZSBuYW1lIChhZ2FpbikgbmV4dA0KLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0vLyBFTkQgTkVTVEVEIFhNTA0KLQ0KLS8vIFhNTCAmIEpTUCBDb21tZW50cw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9YTUxfREVDTEFSQVRJT04sIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRT4ge0NvbW1lbnRTdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT01NRU5UX1RFWFQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9DT01NRU5UOw0KLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsNCi0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47DQotfQ0KLTxTVF9YTUxfQ09NTUVOVD4gLnxccnxcbiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotfQ0KLQ0KLTxTVF9YTUxfQ09NTUVOVF9FTkQ+IHtDb21tZW50RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiY29tbWVudCBlbmQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOw0KLX0NCi0NCi08U1RfSlNQX0NPTlRFTlQ+IHtqc3BTY3JpcHRsZXRFbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIEpTUF9DTE9TRTsNCi19DQotPFNUX0pTUF9DT05URU5UPiAufFxufFxyIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgY29kZSBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gZG9TY2FuKCIlPiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIEpTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQpOw0KLX0NCi17anNwU2NyaXB0bGV0U3RhcnR9IHsNCi0JLyogSlNQIHNjcmlwdGxldCBiZWd1biAoYW55d2hlcmUpDQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlDQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzDQotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkDQotCSAqLw0KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgew0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hDQotCQl5eXB1c2hiYWNrKDEpOw0KLQkJcmV0dXJuIEpTUF9DT05URU5UOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7DQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMik7DQotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMik7DQotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotCX0NCi0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7DQotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSByZWd1bGFyIHNjcmlwdGxldCBvdXQgaW4gY29udGVudA0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiXG5KU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlyZXR1cm4gSlNQX1NDUklQVExFVF9PUEVOOw0KLQl9DQotCWVsc2Ugew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgew0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOw0KLQkJfQ0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9TQ1JJUFRMRVRfT1BFTiwgSlNQX0NMT1NFKTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCQl9DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCXJldHVybiBQUk9YWV9DT05URVhUOw0KLQl9DQotfQ0KLXtqc3BFeHByZXNzaW9uU3RhcnR9IHsNCi0JLyogSlNQIGV4cHJlc3Npb24gYmVndW4gKGFueXdoZXJlKQ0KLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQ0KLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cw0KLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZA0KLQkgKi8NCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsNCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQ0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBKU1BfQ09OVEVOVDsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLQl9DQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzDQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsNCi0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhbiBleHByZXNzaW9uIG91dCBpbiBjb250ZW50DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJcbkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlyZXR1cm4gSlNQX0VYUFJFU1NJT05fT1BFTjsNCi0JfQ0KLQllbHNlIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCQl9DQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VYUFJFU1NJT05fT1BFTiwgSlNQX0NMT1NFKTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCQl9DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCXJldHVybiBQUk9YWV9DT05URVhUOw0KLQl9DQotfQ0KLXtqc3BEZWNsYXJhdGlvblN0YXJ0fSB7DQotCS8qIEpTUCBkZWNsYXJhdGlvbiBiZWd1biAoYW55d2hlcmUpDQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlDQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzDQotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkDQotCSAqLw0KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgew0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hDQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIEpTUF9DT05URU5UOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotCX0NCi0JLy8gZW5kIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlyZXR1cm4gSlNQX0RFQ0xBUkFUSU9OX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JCX0NCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfREVDTEFSQVRJT05fT1BFTiwgSlNQX0NMT1NFKTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCQl9DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCXJldHVybiBQUk9YWV9DT05URVhUOw0KLQl9DQotfQ0KLXtqc3BDb21tZW50U3RhcnR9IHsNCi0JLyogSlNQIGNvbW1lbnQgYmVndW4gKGFueXdoZXJlKQ0KLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQ0KLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cw0KLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZA0KLQkgKi8NCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsNCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQ0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBKU1BfQ09OVEVOVDsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgew0KLQkJeXlwdXNoYmFjayg0KTsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDQpOw0KLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDQpOw0KLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSAgew0KLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikNCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCXJldHVybiBQUk9YWV9DT05URVhUOw0KLQl9DQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MNCi0JaWYoeXlzdGF0ZSgpPT1ZWUlOSVRJQUwpIHsNCi0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJcbkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7DQotCQlyZXR1cm4gSlNQX0NPTU1FTlRfT1BFTjsNCi0JfQ0KLQllbHNlIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCQl9DQotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsNCi0JCS8vIHRoZSBjb21tZW50IGNvbnRhaW5lciBpdHNlbGYgd2lsbCBhY3QgYXMgY29tbWVudCB0ZXh0DQotCQlmRW1iZWRkZWRIaW50ID0gSlNQX0NPTU1FTlRfVEVYVDsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0NPTU1FTlRfT1BFTiwgSlNQX0NPTU1FTlRfQ0xPU0UpOw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7DQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7DQotCQl9DQotCQkvKg0KLQkJICogcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zOyBtYXJrIHRoaXMgb25lIGFzIGENCi0JCSAqIGNvbW1lbnQgc28gaXQgd2lsbCBiZSBvdGhlcndpc2UgaWdub3JlZCBidXQgcHJlc2VydmVkICh3aGljaCBpcyB3aHkNCi0JCSAqIHdlIGNhbid0IHVzZSB3aGl0ZS1zcGFjZSkNCi0JCSAqLw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLX0NCi0NCi08U1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4+IHtqc3BDb21tZW50U3RhcnR9ICB7DQotCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsNCi0JaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKQ0KLQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi17anNwRGlyZWN0aXZlU3RhcnR9IHsNCi0JLyogSlNQIGRpcmVjdGl2ZSBiZWd1biAoYW55d2hlcmUpDQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlDQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzDQotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkDQotCSAqLw0KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgew0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hDQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIEpTUF9DT05URU5UOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotCX0NCi0JLy8gZW5kIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIGRpcmVjdGl2ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsNCi0JCXJldHVybiBKU1BfRElSRUNUSVZFX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JCX0NCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RJUkVDVElWRV9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0RJUkVDVElWRV9DTE9TRSwgSlNQX0NMT1NFfSk7DQotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsNCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi0JCX0NCi0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLX0NCi0NCi0NCi08U1RfSlNQX0RJUkVDVElWRV9OQU1FPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBkaXJlY3RpdmUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSk7DQotCXJldHVybiBKU1BfRElSRUNUSVZFX05BTUU7DQotfQ0KLTxTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRT4ge1N9PyB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSk7DQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotfQ0KLTxTVF9KU1BfRElSRUNUSVZFX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSwgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFPiB7anNwU2NyaXB0bGV0RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBKU1BfRElSRUNUSVZFX0NMT1NFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7anNwQ29tbWVudFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5KU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7DQotCXJldHVybiBKU1BfQ09NTUVOVF9PUEVOOw0KLX0NCi0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEPiBceDI0XHg3YiB7DQotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOw0KLQl5eWJlZ2luKFNUX0pTUF9EUVVPVEVEX0VMKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7DQotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwNCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQl9DQotCWVsc2Ugew0KLQkJeXliZWdpbihlbnRlclN0YXRlKTsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gXHgyM1x4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9WQkwpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTA0KLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKSkgew0KLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7DQotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCX0NCi0JZWxzZSB7DQotCQl5eWJlZ2luKGVudGVyU3RhdGUpOw0KLQl9DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEPiBceDI0XHg3YiB7DQotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOw0KLQl5eWJlZ2luKFNUX0pTUF9TUVVPVEVEX0VMKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFfSk7DQotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwNCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQl9DQotCWVsc2Ugew0KLQkJeXliZWdpbihlbnRlclN0YXRlKTsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4gXHgyM1x4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9WQkwpOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTA0KLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgew0KLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7DQotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCX0NCi0JZWxzZSB7DQotCQl5eWJlZ2luKGVudGVyU3RhdGUpOw0KLQl9DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi0vLyB1bmVzY2FwZWQgZG91YmxlIHF1b3RlLCByZXR1cm4gYXMgZW5kaW5nIHJlZ2lvbg0KLTxTVF9KU1BfRFFVT1RFRF9FTCxTVF9KU1BfRFFVT1RFRF9WQkw+IFsiXSB7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEU7DQotfQ0KLS8vIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUsIHJldHVybiBhcyBlbmRpbmcgcmVnaW9uDQotPFNUX0pTUF9TUVVPVEVEX0VMLFNUX0pTUF9TUVVPVEVEX1ZCTD4gWyddIHsNCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URTsNCi19DQotDQotDQotLy8gcGFpcmVkIGVzY2FwZWQgZG91YmxlIHF1b3Rlcw0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gXFxcIiAoW15cXF18XFxbXiJ9XSspKiBcXFwiIHsNCi0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsNCi19DQotLy8gZXZlcnl0aGluZyBlbHNlIEVMDQotPFNUX0pTUF9EUVVPVEVEX0VMPiAoW15cXH0iXXxcXFteIl0pKyB7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9EUVVPVEVEX0VMPiBcXFwiIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi0vLyBwYWlyZWQgZXNjYXBlZCBxdW90ZXMNCi08U1RfSlNQX1NRVU9URURfRUw+IFxcXCcgKFteXFxdfFxcW14nfV0rKSogXFxcJyB7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBFTA0KLTxTVF9KU1BfU1FVT1RFRF9FTD4gKFteXFx9J118XFxbXiddKSsgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfU1FVT1RFRF9FTD4gXFxcJyB7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9EUVVPVEVEX0VMLFNUX0pTUF9TUVVPVEVEX0VMPiB9IHsNCi0JcmV0dXJuIEpTUF9FTF9DTE9TRTsNCi19DQotDQotDQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9EUVVPVEVEX1ZCTD4gXFxcIiAoW15cXF18XFxbXiJ9XSspKiBcXFwiIHsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBWQkwNCi08U1RfSlNQX0RRVU9URURfVkJMPiAoW15cXH0iXXxcXFteIl0pKyB7DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9WQkw+IFxcXCIgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0vLyBwYWlyZWQgZXNjYXBlZCBxdW90ZXMNCi08U1RfSlNQX1NRVU9URURfVkJMPiBcXFwnIChbXlxcXXxcXFteJ31dKykqIFxcXCcgew0KLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsNCi19DQotLy8gZXZlcnl0aGluZyBlbHNlIFZCTA0KLTxTVF9KU1BfU1FVT1RFRF9WQkw+IChbXlxcfSddfFxcW14nXSkrIHsNCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9TUVVPVEVEX1ZCTD4gXFxcJyB7DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9KU1BfRFFVT1RFRF9WQkwsU1RfSlNQX1NRVU9URURfVkJMPiB9IHsNCi0JcmV0dXJuIEpTUF9WQkxfQ0xPU0U7DQotfQ0KLQ0KLQ0KLS8vIFhNTCBjb250ZW50IGFyZWEgRUwNCi08WVlJTklUSUFMPiBceDI0XHg3YlteXHg3ZF0qL1x4N2Qgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCWlmKHl5bGVuZ3RoKCkgPiAyKQ0KLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7DQotCWZFTGxldmVsKys7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBKU1BfRUxfQ0xPU0UpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7DQotCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9KU1BfRUw+IFx4MjRceDdiIHsNCi0JZkVMbGV2ZWwrKzsNCi0JaWYoZkVMbGV2ZWwgPT0gMSkgew0KLQkJcmV0dXJuIEpTUF9FTF9PUEVOOw0KLQl9DQotfQ0KLS8vIFhNTCBjb250ZW50IGFyZWEgVkJMDQotPFlZSU5JVElBTD4gXHgyM1x4N2JbXlx4N2RdKi9ceDdkIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JaWYoeXlsZW5ndGgoKSA+IDIpDQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAyKTsNCi0JZkVMbGV2ZWwrKzsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBKU1BfVkJMX0NMT1NFKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOw0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfSlNQX1ZCTD4gXHgyM1x4N2Igew0KLQlmRUxsZXZlbCsrOw0KLQlpZihmRUxsZXZlbCA9PSAxKSB7DQotCQlyZXR1cm4gSlNQX1ZCTF9PUEVOOw0KLQl9DQotfQ0KLS8vIHJldHVybiBhbnl0aGluZyBub3Qgc3RhcnRpbmcgcXVvdGVzIG9yIGVuZGluZyB0aGUgVkJMIGFzIGNvbnRlbnQNCi08U1RfSlNQX1ZCTD4gW15ceDdkXHgyMlx4MjddKiB7DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLS8vIHJldHVybiBhbnl0aGluZyBub3Qgc3RhcnRpbmcgcXVvdGVzIG9yIGVuZGluZyB0aGUgRUwgYXMgY29udGVudA0KLTxTVF9KU1BfRUw+IFteXHg3ZFx4MjJceDI3XSogew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLQ0KLQ0KLS8vIHF1b3Rlcw0KLTxTVF9KU1BfRUw+IFx4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9FTF9EUVVPVEU7DQotfQ0KLTxTVF9KU1BfRUxfRFFVT1RFUz4gW15ceDIyXSsvXHgyMiB7DQotCXl5YmVnaW4oU1RfSlNQX0VMX0RRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9FTF9EUVVPVEVTX0VORD4gXHgyMiB7DQotCXl5YmVnaW4oU1RfSlNQX0VMKTsNCi0JcmV0dXJuIEpTUF9FTF9EUVVPVEU7DQotfQ0KLTxTVF9KU1BfRUw+IFx4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9FTF9TUVVPVEU7DQotfQ0KLTxTVF9KU1BfRUxfU1FVT1RFUz4gW15ceDI3XSsvXHgyNyB7DQotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9FTF9TUVVPVEVTX0VORD4gXHgyNyB7DQotCXl5YmVnaW4oU1RfSlNQX0VMKTsNCi0JcmV0dXJuIEpTUF9FTF9TUVVPVEU7DQotfQ0KLS8vIHF1b3Rlcw0KLTxTVF9KU1BfVkJMPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVMpOw0KLQlyZXR1cm4gSlNQX1ZCTF9EUVVPVEU7DQotfQ0KLTxTVF9KU1BfVkJMX0RRVU9URVM+IFteXHgyMl0rL1x4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9WQkxfRFFVT1RFU19FTkQpOw0KLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9WQkxfRFFVT1RFU19FTkQ+IFx4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9WQkwpOw0KLQlyZXR1cm4gSlNQX1ZCTF9EUVVPVEU7DQotfQ0KLTxTVF9KU1BfVkJMPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVMpOw0KLQlyZXR1cm4gSlNQX1ZCTF9TUVVPVEU7DQotfQ0KLTxTVF9KU1BfVkJMX1NRVU9URVM+IFteXHgyN10rL1x4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9WQkxfU1FVT1RFU19FTkQpOw0KLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9WQkxfU1FVT1RFU19FTkQ+IFx4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9WQkwpOw0KLQlyZXR1cm4gSlNQX1ZCTF9TUVVPVEU7DQotfQ0KLQ0KLS8vIHVucXVvdGVkIGNvbnRlbnQNCi08U1RfSlNQX0VMPiAoW159XHgyN1x4MjJceDI0XXxceDI0W15ceDdiXHgyN1x4MjJdKSsgew0KLQkvL1N5c3RlbS5vdXQucHJpbnRsbihKU1BfRUxfQ09OVEVOVCsgIjpbIiArIHl5dGV4dCgpICsgIl0iKTsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX0VMPiB9IHsNCi0JZkVMbGV2ZWwtLTsNCi0JaWYoZkVMbGV2ZWwgPT0gMCkgew0KLQkJeXliZWdpbihZWUlOSVRJQUwpOw0KLQkJcmV0dXJuIEpTUF9FTF9DTE9TRTsNCi0JfQ0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMPiB9IHsNCi0JZkVMbGV2ZWwtLTsNCi0JaWYoZkVMbGV2ZWwgPT0gMCkgew0KLQkJeXliZWdpbihZWUlOSVRJQUwpOw0KLQkJcmV0dXJuIEpTUF9WQkxfQ0xPU0U7DQotCX0NCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsNCi19DQotLy8gRUwgdW5xdW90ZWQgaW4gdGFnIChzZWN0aW9uIDIuMSBkZWNsYXJlcyBpdCBhcyB2YWxpZCBpbiB0ZW1wbGF0ZSB0ZXh0IChYTUxfQ09OVEVOVCkgb3IgYXR0cmlidXRlIHZhbHVlcw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiBceDI0XHg3YlteXHg3ZF0rL1x4N2Qgew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKHl5bGVuZ3RoKCkgPiAyKQ0KLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0yKTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJFTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCWZFTGxldmVsKys7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0V9KTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0vLyBWQkwgdW5xdW90ZWQgaW4gdGFnIG9yIGF0dHJpYnV0ZSB2YWx1ZXMNCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4gXHgyM1x4N2JbXlx4N2RdKy9ceDdkIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiVkJMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7DQotCWZFTGxldmVsKys7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRX0pOw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLQ0KLTxTVF9KU1BfQ09NTUVOVD4gLnxccnxcbiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5KU1AgY29tbWVudCB0ZXh0Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7DQotfQ0KLTxTVF9KU1BfQ09NTUVOVF9FTkQ+IHtqc3BDb21tZW50RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5KU1AgY29tbWVudCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLQlyZXR1cm4gSlNQX0NPTU1FTlRfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBtaXNjDQotDQote0NEU3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7DQotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsNCi19DQotPFNUX0NEQVRBX1RFWFQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JU3RyaW5nIHJldHVybmVkQ29udGV4dCA9IGRvU2NhbigiXV0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQsICBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQNCi0JaWYocmV0dXJuZWRDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQ0KLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOw0KLQlyZXR1cm4gcmV0dXJuZWRDb250ZXh0Ow0KLX0NCi08U1RfQ0RBVEFfRU5EPiB7Q0RFbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UEVSZWZlcmVuY2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsNCi19DQotPFlZSU5JVElBTD4ge0NoYXJSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7DQotfQ0KLTxZWUlOSVRJQUw+IHtFbnRpdHlSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UElzdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9QSSk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47DQotfQ0KLS8vIHRoZSBuZXh0IGZvdXIgYXJlIG9yZGVyIGRlcGVuZGVudA0KLTxTVF9QST4gKChYfHgpKE18bSkoTHxsKSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUEk+IChbaUldW21NXVtwUF1bb09dW3JSXVt0VF0pIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4geG1sLXN0eWxlc2hlZXQgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhTTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOw0KLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUElfV1M+IHtTfSsgew0KLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsNCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsNCi19DQotPFNUX1BJLCBTVF9QSV9XUz4gXD8+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLTxTVF9QSV9DT05URU5UPiAuIHsNCi0JCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQNCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7DQotfQ0KLTxTVF9QSV9DT05URU5ULFNUX1hNTF9QSV9UQUdfQ0xPU0U+IFw/PiB7DQotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlDQotCQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotDQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX1hNTF9QSV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0vKiB0aGUgUEkncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfWE1MX1BJX0VRVUFMUywgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFPiB7UEllbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0vLyBESFRNTA0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSwgU1RfREhUTUxfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX0RIVE1MX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0vKiBUaGUgREhUTUwgUEkncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfREhUTUxfRVFVQUxTLCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSwgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFPiBbL10qPiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0NCi0vLyBYTUwgZGVjbGFyYXRpb25zDQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0hIHsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0VlXVtMbF1bRWVdW01tXVtFZV1bTm5dW1R0XSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0RkXVtPb11bQ2NdW1R0XVtZeV1bUHBdW0VlXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0FhXVtUdF1bVHRdW0xsXVtJaV1bU3NdW1R0XSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsNCi19DQotDQotLy8gYmVnaW4gRE9DVFlQRSBoYW5kbGluZyBwcm9jZWR1cmUNCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFPiBcW1teXF1dKlxdIHsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsNCi19DQotDQotPFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgdHlwZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IFtQcF1bVXVdW0JiXVtMbF1bSWldW0NjXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IFtTc11bWXldW1NzXVtUdF1bRWVdW01tXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNPiB7QXR0VmFsdWV9fHtTeXN0ZW1MaXRlcmFsfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsNCi19DQotLy8gZW5kIERPQ1RZUEUgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBFTEVNRU5UIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOw0KLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOw0KLX0NCi08U1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVD4gW14+XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOw0KLX0NCi0NCi08U1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIEVMRU1FTlQgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBBVFRMSVNUIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsNCi19DQotDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQ+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIEFUVExJU1QgaGFuZGxpbmcNCi0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiwgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgREVDTEFSQVRJT04gaGFuZGxpbmcNCi0NCi08WVlJTklUSUFMPiAoW148JiVceDI0XHgyM10qfFx4MjMrfFx4MjQrfFsmJV17U30re05hbWV9W14mJTxdKnxbXHgyNFx4MjNdW15ceDdiPCYlXXxbJiVde05hbWV9KFteOyYlPF0qfHtTfSs7KikpIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0NPTlRFTlQ7DQotfQ0KLQ0KLQ0KLTxTVF9CTE9DS19UQUdfU0NBTj4gLnxccnxcbiB7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQ0KLS4gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCi0NCi1cMDQwIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJTUEFDRSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDExIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCIweDkiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxNSANCi17DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiQ0FSUklBR0UgUkVUVVJOIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTIgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2MDdhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzNyArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxMC8xNy8wNyA0OjI3IEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YTUxQYXJzZXJSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMTAvMTcvMDcgNDoyNyBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01SZWdpb25Db250ZXh0IHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfVEFHX05BTUUgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDE5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDE3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9URVhUID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfRU5EID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDMwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OID0gMjA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjJcMlwwXDFcMTRcMjJcMFwxXDE0XDFcMjFcMVwxMVwxXDU1IisKLSAgICAiXDFcMTZcMVwxN1wxXDEyXDFcMTNcMVwxNlwxXDE2XDFcMTZcMVwxNlwxXDE2XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDE1XDFcMTBcMVw2MVwxXDFcMVw0NVwxXDJcMVw0XDFcMTYiKwotICAgICJcMVwzNFwxXDYyXDFcMzJcMVwzM1wxXDUwXDFcNTdcMVwzNlwxXDM2XDFcNDJcMVwzNiIrCi0gICAgIlwxXDM2XDFcMjdcMVwyNVwxXDQ0XDFcNDNcMVw0N1wxXDM2XDFcNDBcMVw1NlwxXDM1IisKLSAgICAiXDFcNjBcMlwzNlwxXDIzXDFcNDZcMVwzNlwxXDMxXDFcMFwxXDIwXDFcMFwxXDEwIisKLSAgICAiXDFcMFwxXDUyXDFcNjJcMVw2M1wxXDUzXDFcMzdcMVw1N1wxXDM2XDFcNjZcMVw0MiIrCi0gICAgIlwyXDM2XDFcMzBcMVwyNlwxXDQ0XDFcNDNcMVw0N1wxXDM2XDFcNDBcMVw0MVwxXDUxIisKLSAgICAiXDFcNjBcMVwzNlwxXDM2XDFcMjRcMVw1NFwxXDM2XDFcMFwxXDBcNzJcMFwxXDY1IisKLSAgICAiXDEwXDBcMjdcNjRcMVwwXDM3XDY0XDFcMFw3Mlw2NFwyXDBcMTNcNjRcMlwwXDEwXDY0IisKLSAgICAiXDFcMFw2NVw2NFwxXDBcMTA0XDY0XDExXDBcNDRcNjRcM1wwXDJcNjRcNFwwXDM2XDY0IisKLSAgICAiXDcwXDBcMTMxXDY0XDIyXDBcN1w2NFwxNlwwXDJcNjVcNTZcMFwxMDZcNjVcMzJcMFwyXDY1IisKLSAgICAiXDQ0XDBcMVw2NFwxXDY1XDNcNjRcMVwwXDFcNjRcMVwwXDI0XDY0XDFcMFw1NFw2NCIrCi0gICAgIlwxXDBcN1w2NFwzXDBcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NCIrCi0gICAgIlwxXDBcMjJcNjRcMTVcMFwxNFw2NFwxXDBcMTAyXDY0XDFcMFwxNFw2NFwxXDBcNDRcNjQiKwotICAgICJcMVwwXDRcNjVcMTFcMFw2NVw2NFwyXDBcMlw2NFwyXDBcMlw2NFwzXDBcMzRcNjQiKwotICAgICJcMlwwXDEwXDY0XDJcMFwyXDY0XDY3XDBcNDZcNjRcMlwwXDFcNjRcN1wwXDQ2XDY0IisKLSAgICAiXDEyXDBcMjFcNjVcMVwwXDI3XDY1XDFcMFwzXDY1XDFcMFwxXDY1XDFcMFwyXDY1IisKLSAgICAiXDFcMFwxXDY1XDEzXDBcMzNcNjRcNVwwXDNcNjRcNTZcMFwzMlw2NFw1XDBcMVw2NSIrCi0gICAgIlwxMlw2NFwxMFw2NVwxNVwwXDEyXDY1XDZcMFwxXDY1XDEwN1w2NFwyXDBcNVw2NFwxXDAiKwotICAgICJcMTdcNjRcMVwwXDRcNjRcMVwwXDFcNjRcMTdcNjVcMlw2NFwyXDY1XDFcMFw0XDY1IisKLSAgICAiXDJcMFwxMlw2NVx1MDIwN1wwXDNcNjVcMVwwXDY1XDY0XDJcMFwxXDY1XDFcNjRcMjBcNjUiKwotICAgICJcM1wwXDRcNjVcM1wwXDEyXDY0XDJcNjVcMlwwXDEyXDY1XDIxXDBcM1w2NVwxXDAiKwotICAgICJcMTBcNjRcMlwwXDJcNjRcMlwwXDI2XDY0XDFcMFw3XDY0XDFcMFwxXDY0XDNcMCIrCi0gICAgIlw0XDY0XDJcMFwxXDY1XDFcMFw3XDY1XDJcMFwyXDY1XDJcMFwzXDY1XDExXDAiKwotICAgICJcMVw2NVw0XDBcMlw2NFwxXDBcM1w2NFwyXDY1XDJcMFwxMlw2NVwyXDY0XDIwXDAiKwotICAgICJcMVw2NVwyXDBcNlw2NFw0XDBcMlw2NFwyXDBcMjZcNjRcMVwwXDdcNjRcMVwwIisKLSAgICAiXDJcNjRcMVwwXDJcNjRcMVwwXDJcNjRcMlwwXDFcNjVcMVwwXDVcNjVcNFwwIisKLSAgICAiXDJcNjVcMlwwXDNcNjVcMTNcMFw0XDY0XDFcMFwxXDY0XDdcMFwxMlw2NVwyXDY1IisKLSAgICAiXDNcNjRcMTRcMFwzXDY1XDFcMFw3XDY0XDFcMFwxXDY0XDFcMFwzXDY0XDFcMCIrCi0gICAgIlwyNlw2NFwxXDBcN1w2NFwxXDBcMlw2NFwxXDBcNVw2NFwyXDBcMVw2NVwxXDY0IisKLSAgICAiXDEwXDY1XDFcMFwzXDY1XDFcMFwzXDY1XDIyXDBcMVw2NFw1XDBcMTJcNjVcMjFcMCIrCi0gICAgIlwzXDY1XDFcMFwxMFw2NFwyXDBcMlw2NFwyXDBcMjZcNjRcMVwwXDdcNjRcMVwwIisKLSAgICAiXDJcNjRcMlwwXDRcNjRcMlwwXDFcNjVcMVw2NFw2XDY1XDNcMFwyXDY1XDJcMCIrCi0gICAgIlwzXDY1XDEwXDBcMlw2NVw0XDBcMlw2NFwxXDBcM1w2NFw0XDBcMTJcNjVcMjJcMCIrCi0gICAgIlwyXDY1XDFcMFw2XDY0XDNcMFwzXDY0XDFcMFw0XDY0XDNcMFwyXDY0XDFcMCIrCi0gICAgIlwxXDY0XDFcMFwyXDY0XDNcMFwyXDY0XDNcMFwzXDY0XDNcMFwxMFw2NFwxXDAiKwotICAgICJcM1w2NFw0XDBcNVw2NVwzXDBcM1w2NVwxXDBcNFw2NVwxMVwwXDFcNjVcMTdcMCIrCi0gICAgIlwxMVw2NVwyMVwwXDNcNjVcMVwwXDEwXDY0XDFcMFwzXDY0XDFcMFwyN1w2NFwxXDAiKwotICAgICJcMTJcNjRcMVwwXDVcNjRcNFwwXDdcNjVcMVwwXDNcNjVcMVwwXDRcNjVcN1wwIisKLSAgICAiXDJcNjVcMTFcMFwyXDY0XDRcMFwxMlw2NVwyMlwwXDJcNjVcMVwwXDEwXDY0XDFcMCIrCi0gICAgIlwzXDY0XDFcMFwyN1w2NFwxXDBcMTJcNjRcMVwwXDVcNjRcNFwwXDdcNjVcMVwwIisKLSAgICAiXDNcNjVcMVwwXDRcNjVcN1wwXDJcNjVcN1wwXDFcNjRcMVwwXDJcNjRcNFwwIisKLSAgICAiXDEyXDY1XDIyXDBcMlw2NVwxXDBcMTBcNjRcMVwwXDNcNjRcMVwwXDI3XDY0XDFcMCIrCi0gICAgIlwyMFw2NFw0XDBcNlw2NVwyXDBcM1w2NVwxXDBcNFw2NVwxMVwwXDFcNjVcMTBcMCIrCi0gICAgIlwyXDY0XDRcMFwxMlw2NVwyMjFcMFw1Nlw2NFwxXDBcMVw2NFwxXDY1XDJcNjRcN1w2NSIrCi0gICAgIlw1XDBcNlw2NFwxXDY1XDEwXDY1XDFcMFwxMlw2NVw0N1wwXDJcNjRcMVwwXDFcNjQiKwotICAgICJcMlwwXDJcNjRcMVwwXDFcNjRcMlwwXDFcNjRcNlwwXDRcNjRcMVwwXDdcNjQiKwotICAgICJcMVwwXDNcNjRcMVwwXDFcNjRcMVwwXDFcNjRcMlwwXDJcNjRcMVwwXDJcNjQiKwotICAgICJcMVwwXDFcNjRcMVw2NVwyXDY0XDZcNjVcMVwwXDJcNjVcMVw2NFwyXDBcNVw2NCIrCi0gICAgIlwxXDBcMVw2NVwxXDBcNlw2NVwyXDBcMTJcNjVcNzZcMFwyXDY1XDZcMFwxMlw2NSIrCi0gICAgIlwxM1wwXDFcNjVcMVwwXDFcNjVcMVwwXDFcNjVcNFwwXDJcNjVcMTBcNjRcMVwwIisKLSAgICAiXDQxXDY0XDdcMFwyNFw2NVwxXDBcNlw2NVw0XDBcNlw2NVwxXDBcMVw2NVwxXDAiKwotICAgICJcMjVcNjVcM1wwXDdcNjVcMVwwXDFcNjVcMzQ2XDBcNDZcNjRcMTJcMFw0N1w2NFwxMVwwIisKLSAgICAiXDFcNjRcMVwwXDJcNjRcMVwwXDNcNjRcMVwwXDFcNjRcMVwwXDJcNjRcMVwwIisKLSAgICAiXDVcNjRcNTFcMFwxXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDEzXDBcMVw2NFwxXDAiKwotICAgICJcMVw2NFwxXDBcMVw2NFwzXDBcMlw2NFwzXDBcMVw2NFw1XDBcM1w2NFwxXDAiKwotICAgICJcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NFwzXDBcMlw2NFwzXDAiKwotICAgICJcMlw2NFwxXDBcMVw2NFw1MFwwXDFcNjRcMTFcMFwxXDY0XDJcMFwxXDY0XDJcMCIrCi0gICAgIlwyXDY0XDdcMFwyXDY0XDFcMFwxXDY0XDFcMFw3XDY0XDUwXDBcMVw2NFw0XDAiKwotICAgICJcMVw2NFwxMFwwXDFcNjRcdTBjMDZcMFwyMzRcNjRcNFwwXDEzMlw2NFw2XDBcMjZcNjRcMlwwIisKLSAgICAiXDZcNjRcMlwwXDQ2XDY0XDJcMFw2XDY0XDJcMFwxMFw2NFwxXDBcMVw2NFwxXDAiKwotICAgICJcMVw2NFwxXDBcMVw2NFwxXDBcMzdcNjRcMlwwXDY1XDY0XDFcMFw3XDY0XDFcMCIrCi0gICAgIlwxXDY0XDNcMFwzXDY0XDFcMFw3XDY0XDNcMFw0XDY0XDJcMFw2XDY0XDRcMCIrCi0gICAgIlwxNVw2NFw1XDBcM1w2NFwxXDBcN1w2NFwzMjNcMFwxNVw2NVw0XDBcMVw2NVwxMDRcMCIrCi0gICAgIlwxXDY0XDNcMFwyXDY0XDJcMFwxXDY0XDEyMVwwXDNcNjRcdTBlODJcMFwxXDY1XDFcMCIrCi0gICAgIlwxXDY0XDMxXDBcMTFcNjRcNlw2NVwxXDBcNVw2NVwxM1wwXDEyNFw2NFw0XDBcMlw2NSIrCi0gICAgIlwyXDBcMlw2NVwyXDBcMTMyXDY0XDFcMFwzXDY1XDZcMFw1MFw2NFx1MWNkM1wwXHU1MWE2XDY0IisKLSAgICAiXHUwYzVhXDBcdTJiYTRcNjRcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA1NSwgICAxMTAsICAgMTY1LCAgIDIyMCwgICAyNzUsICAgMzMwLCAgIDM4NSwgICA0NDAsICAgNDk1LCAKLSAgICAgIDU1MCwgICA2MDUsICAgNjYwLCAgIDcxNSwgICA3NzAsICAgODI1LCAgIDg4MCwgICA5MzUsICAgOTkwLCAgMTA0NSwgCi0gICAgIDExMDAsICAxMTU1LCAgMTIxMCwgIDEyNjUsICAxMzIwLCAgMTM3NSwgIDE0MzAsICAxNDg1LCAgMTU0MCwgIDE1OTUsIAotICAgICAxNjUwLCAgMTcwNSwgIDE3NjAsICAxODE1LCAgMTg3MCwgIDE5MjUsICAxOTgwLCAgMTkyNSwgIDE5ODAsICAyMDM1LCAKLSAgICAgMTkyNSwgIDE5MjUsICAxOTgwLCAgMjA5MCwgIDIxNDUsICAyMjAwLCAgMjI1NSwgIDIzMTAsICAyMzY1LCAgMjQyMCwgCi0gICAgIDI0NzUsICAxOTI1LCAgMTk4MCwgIDI1MzAsICAyNTg1LCAgMjY0MCwgIDE5MjUsICAyNjk1LCAgMjY5NSwgIDI3NTAsIAotICAgICAyODA1LCAgMjg2MCwgIDI1MzAsICAxOTI1LCAgMjkxNSwgIDI5NzAsICAxOTI1LCAgMzAyNSwgIDMwODAsICAzMTM1LCAKLSAgICAgMzE5MCwgIDMyNDUsICAzMzAwLCAgMTkyNSwgIDMzNTUsICAzNDEwLCAgMzQ2NSwgIDM1MjAsICAxOTI1LCAgMzU3NSwgCi0gICAgIDM2MzAsICAzNjg1LCAgMzc0MCwgIDM3OTUsICAxOTI1LCAgMzg1MCwgIDM5MDUsICAzOTYwLCAgNDAxNSwgIDQwNzAsIAotICAgICA0MTI1LCAgNDE4MCwgIDQyMzUsICA0MjM1LCAgNDI5MCwgIDQzNDUsICA0NDAwLCAgNDQ1NSwgIDQ0NTUsICA0NTEwLCAKLSAgICAgNDU2NSwgIDQ2MjAsICA0Njc1LCAgNDY3NSwgIDQ3MzAsICA0Nzg1LCAgNDg0MCwgIDQ4OTUsICAxOTI1LCAgNDk1MCwgCi0gICAgIDQ5NTAsICA1MDA1LCAgNTA2MCwgIDUxMTUsICA1MTcwLCAgMTkyNSwgIDE5MjUsICAxOTgwLCAgMTkyNSwgIDE5MjUsIAotICAgICA1MjI1LCAgNTI4MCwgIDUzMzUsICA1MzkwLCAgNTQ0NSwgIDU1MDAsICA1NTU1LCAgNTYxMCwgIDE5MjUsICA1NjY1LCAKLSAgICAgNTcyMCwgIDU3NzUsICAxOTI1LCAgMTkyNSwgIDI2OTUsICA1ODMwLCAgMjgwNSwgIDE5MjUsICA1ODg1LCAgMjg2MCwgCi0gICAgIDI5MTUsICAzMDI1LCAgMzA4MCwgIDU5NDAsICAzMTM1LCAgMTkyNSwgIDU5OTUsICAzMTkwLCAgMTkyNSwgIDM1NzUsIAotICAgICA2MDUwLCAgMzY4NSwgIDE5MjUsICA2MTA1LCAgMzc0MCwgIDUyMjUsICA2MTYwLCAgNjIxNSwgIDYyNzAsICA0MDE1LCAKLSAgICAgMTkyNSwgIDYzMjUsICA2MzgwLCAgNDIzNSwgIDY0MzUsICA0MjkwLCAgMTkyNSwgIDY0OTAsICA2NTQ1LCAgNjYwMCwgCi0gICAgIDY2MDAsICA2NjU1LCAgNjcxMCwgIDQ0MDAsICA0MjM1LCAgNDQ1NSwgIDY3NjUsICA0NTEwLCAgMTkyNSwgIDY4MjAsIAotICAgICA0NTY1LCAgNDYyMCwgIDQ0NTUsICA0Njc1LCAgNjg3NSwgIDQ3MzAsICAxOTI1LCAgNjkzMCwgIDY5ODUsICA3MDQwLCAKLSAgICAgNzA0MCwgIDcwOTUsICA3MTUwLCAgNzIwNSwgIDQ5NTAsICA3MjYwLCAgNTAwNSwgIDE5MjUsICA3MzE1LCAgNzM3MCwgCi0gICAgIDc0MjUsICA3NDI1LCAgNzQ4MCwgIDc1MzUsICA3NTkwLCAgNzY0NSwgIDc3MDAsICA3NzU1LCAgNzgxMCwgIDE5MjUsIAotICAgICA3ODY1LCAgNzkyMCwgIDE5MjUsICAxOTI1LCAgMTkyNSwgIDIyNTUsICA3OTc1LCAgODAzMCwgIDgwODUsICA4MTQwLCAKLSAgICAgODE5NSwgIDgyNTAsICA4MzA1LCAgNjQ5MCwgIDgzNjAsICA4MzYwLCAgNjkzMCwgIDg0MTUsICA4NDE1LCAgODQ3MCwgCi0gICAgIDczMTUsICA4NTI1LCAgODUyNSwgIDg1ODAsICAxOTI1LCAgODYzNSwgIDg2OTAsICAxOTI1LCAgODc0NSwgIDg4MDAsIAotICAgICA4ODU1LCAgODkxMCwgIDg5NjUsICA5MDIwLCAgOTA3NSwgIDkxMzAsICA2NjU1LCAgNzA5NSwgIDkxODUsICA3NDgwLCAKLSAgICAgOTI0MCwgIDkyOTUsICA5MzUwLCAgOTQwNSwgIDk0NjAsICA5NTE1LCAgOTU3MCwgIDk2MjUsICA5NjgwLCAgOTczNSwgCi0gICAgIDk3OTAsICA5ODQ1LCAgOTkwMCwgIDk5NTUsIDEwMDEwLCAxMDA2NSwgMTAxMjAsICAxOTI1LCAgMTkyNSwgMTAxNzUsIAotICAgIDEwMjMwLCAxMDI4NSwgMTAzNDAsIDEwMzk1LCAgMTkyNSwgIDE5MjUsICAxOTI1LCAxMDQ1MCwgMTA1MDUsIDEwNTYwLCAKLSAgICAxMDYxNSwgMTA2NzAsIDEwNzI1LCAgMTkyNSwgMTA3ODAsICA0ODQwLCAgNTExNSwgMTA4MzUsIDEwODkwLCAxMDk0NSwgCi0gICAgMTEwMDAsICAyMjU1Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9IAotICAgICJcMVw0MFwxXDQxXDEwXDQwXDFcNDJcNFw0MFwxXDQzXDQ3XDQwXDFcNDQiKwotICAgICJcMVw0NVw2NVw0NFwxXDQ2XDFcNDdcMTZcNDZcMVw1MFwxXDQ2XDFcNTEiKwotICAgICJcNDRcNDZcMVw1MlwxXDUzXDY1XDUyXDFcNDZcMVw0N1w1XDQ2XDFcNTQiKwotICAgICJcMTJcNDZcMVw1MVw0NVw0NlwxXDQ3XDJcNDZcMVw1NVwxXDU2XDJcNDYiKwotICAgICJcMVw1N1wzXDQ2XDFcNTZcNVw0NlwxXDU2XDFcNjBcMVw2MVw0XDU3IisKLSAgICAiXDFcNDZcMTBcNTdcMVw2MlwyXDU3XDFcNDZcN1w1N1wxXDQ2XDNcNTciKwotICAgICJcMVw0NlwzXDU3XDFcNDZcMVw1N1wxXDQ2XDFcNDdcMlw0NlwxXDU1IisKLSAgICAiXDFcNjNcNlw0NlwxXDYzXDVcNDZcMVw2M1w0NFw0NlwxXDY0XDFcNjUiKwotICAgICJcMlw2NFwxXDY2XDE1XDY0XDFcNTFcNDRcNjRcMVw0NlwxXDQ3XDJcNDYiKwotICAgICJcMVw2N1wxXDU2XDJcNDZcMVw3MFwzXDQ2XDFcNTZcNVw0NlwxXDU2IisKLSAgICAiXDZcNzBcMVw0NlwxM1w3MFwxXDQ2XDdcNzBcMVw0NlwzXDcwXDFcNDYiKwotICAgICJcM1w3MFwxXDQ2XDFcNzBcMVw0NlwxXDQ3XDJcNDZcMVw2N1wxXDU2IisKLSAgICAiXDJcNDZcMVw3MFwzXDQ2XDFcNTZcNVw0NlwxXDU2XDZcNzBcMVw0NiIrCi0gICAgIlwxM1w3MFwxXDcxXDdcNzBcMVw0NlwzXDcwXDFcNDZcM1w3MFwxXDQ2IisKLSAgICAiXDFcNzBcMVw3MlwxXDQ3XDFcNDZcMVw3M1wxXDc0XDFcNTZcM1w3MiIrCi0gICAgIlwxXDc1XDFcNzJcMVw3NlwxXDU2XDVcNzJcMVw1Nlw0NFw3MlwxXDQ2IisKLSAgICAiXDFcNDdcMlw0NlwxXDc3XDE1XDQ2XDFcNTFcNDVcNDZcMVw0N1wxXDEwMCIrCi0gICAgIlwxXDEwMVwxXDQ2XDFcNTZcMlw0NlwxXDEwMlwzXDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDZcMTAyXDFcNDZcMTNcMTAyXDFcNDZcN1wxMDJcMVw0NlwzXDEwMiIrCi0gICAgIlwxXDQ2XDNcMTAyXDFcNDZcMVwxMDJcMVw0NlwxXDQ3XDFcMTAwXDFcMTAxIisKLSAgICAiXDFcNDZcMVw1NlwyXDQ2XDFcMTAyXDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNlwxMDJcMVw0NlwxM1wxMDJcMVwxMDNcN1wxMDJcMVw0NlwzXDEwMlwxXDQ2IisKLSAgICAiXDNcMTAyXDFcNDZcMVwxMDJcMVwxMDRcMVw0N1wxXDEwMFwxXDEwNVwxXDEwNCIrCi0gICAgIlwxXDU2XDNcMTA0XDFcMTA2XDFcMTA0XDFcMTA3XDFcNTZcNVwxMDRcMVw1NiIrCi0gICAgIlw0NFwxMDRcMVw0NlwxXDQ3XDNcNDZcMVw1Nlw2XDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDQ0XDQ2XDFcMTEwXDFcMTExXDFcMTEyXDFcMTEzXDRcMTEwXDFcMTE0IisKLSAgICAiXDEyXDExMFw2XDExNVwxXDExMFwxM1wxMTVcMVwxMTBcN1wxMTVcMVwxMTBcM1wxMTUiKwotICAgICJcMVwxMTBcM1wxMTVcMVwxMTBcMVwxMTVcMVw0NlwxXDExMVwxXDExMlwxXDExMyIrCi0gICAgIlwxXDQ2XDFcNTZcMlw0NlwxXDExNlwzXDQ2XDFcNTZcNVw0NlwxXDU2IisKLSAgICAiXDZcMTE2XDFcNDZcMTNcMTE2XDFcNDZcN1wxMTZcMVw0NlwzXDExNlwxXDQ2IisKLSAgICAiXDNcMTE2XDFcNDZcMVwxMTZcMVw0NlwxXDExMVwxXDExMlwxXDExM1wxXDQ2IisKLSAgICAiXDFcNTZcMlw0NlwxXDExNlwzXDQ2XDFcNTZcNVw0NlwxXDU2XDZcMTE2IisKLSAgICAiXDFcNDZcMTNcMTE2XDFcMTE3XDdcMTE2XDFcNDZcM1wxMTZcMVw0NlwzXDExNiIrCi0gICAgIlwxXDQ2XDFcMTE2XDFcMTIwXDFcMTExXDFcMTEyXDFcMTIxXDFcMTIwXDFcNTYiKwotICAgICJcM1wxMjBcMVwxMjJcMVwxMjBcMVwxMjNcMVw1Nlw1XDEyMFwxXDU2XDQ0XDEyMCIrCi0gICAgIlwxXDQ2XDFcMTI0XDFcMTI1XDJcNDZcMVw1Nlw2XDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDEwXDQ2XDFcMTI2XDFcMTI3XDJcNDZcMVwxMzBcMTBcNDZcMVwxMzAiKwotICAgICJcMVw0NlwxXDEyN1wxXDEyNlwxNFw0NlwxXDQ3XDFcMTI1XDJcNDZcMVw1NiIrCi0gICAgIlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDZcNDZcMVwxMzFcMzZcNDZcMVw0NyIrCi0gICAgIlwxXDEyNVwyXDQ2XDFcNTZcMlw0NlwxXDEzMlwzXDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDZcMTMyXDFcMTMxXDEzXDEzMlwxXDQ2XDdcMTMyXDFcNDZcM1wxMzIiKwotICAgICJcMVw0NlwzXDEzMlwxXDQ2XDFcMTMyXDFcNDZcMVw0N1wxXDEyNVwyXDQ2IisKLSAgICAiXDFcNTZcNlw0NlwxXDU2XDVcNDZcMVw1Nlw2XDQ2XDFcMTMxXDdcNDYiKwotICAgICJcMVwxMzNcNVw0NlwxXDEzNFw2XDQ2XDFcMTMzXDEwXDQ2XDFcMTM1XDFcNDciKwotICAgICJcMVwxMjVcMVwxMzZcMVwxMzVcMVw1NlwzXDEzNVwxXDEzN1wxXDEzNVwxXDE0MCIrCi0gICAgIlwxXDU2XDVcMTM1XDFcNTZcNlwxMzVcMVwxNDFcMzVcMTM1XDFcMTQyXDFcNDciKwotICAgICJcMVwxMjVcMVwxNDNcMVwxNDJcMVw1NlwzXDE0MlwxXDE0NFwxXDE0MlwxXDE0NSIrCi0gICAgIlwxXDU2XDVcMTQyXDFcNTZcNlwxNDJcMVwxNDZcMzVcMTQyXDFcMTQ3XDFcNDciKwotICAgICJcMVwxMjVcMVwxNTBcMVwxNDdcMVw1NlwzXDE0N1wxXDE1MVwxXDE0N1wxXDE1MiIrCi0gICAgIlwxXDU2XDVcMTQ3XDFcNTZcNDRcMTQ3XDFcMTUzXDFcMTU0XDFcMTU1XDY0XDE1MyIrCi0gICAgIlwxXDE1NlwxXDQ3XDFcMTI1XDFcMTU3XDFcMTU2XDFcNTZcM1wxNTZcMVwxNjAiKwotICAgICJcMVwxNTZcMVwxNjFcMVw1Nlw1XDE1NlwxXDU2XDQ0XDE1NlwxXDE2MlwxXDE2MyIrCi0gICAgIlwxXDE2NFw2NFwxNjJcMVwxNjVcMVwxNjZcNjVcMTY1XDFcNDBcMVwwXDEwXDQwIisKLSAgICAiXDFcMFw0XDQwXDFcMFw0N1w0MFwzXDBcMVwxNjdcMVwxNzBcMTRcMCIrCi0gICAgIlwxXDE3MVw1MlwwXDFcMTcyXDJcMFwxXDE3M1wzXDBcMVwxNzJcNVwwIisKLSAgICAiXDFcMTcyXDZcMTczXDFcMFwxM1wxNzNcMVwwXDdcMTczXDFcMTc0XDNcMTczIisKLSAgICAiXDFcMFwzXDE3M1wxXDBcMVwxNzNcNVwwXDFcMTcyXDJcMFwxXDE3NSIrCi0gICAgIlwzXDBcMVwxNzJcNVwwXDFcMTcyXDZcMTc1XDFcMFwxM1wxNzVcMVwwIisKLSAgICAiXDdcMTc1XDFcMFwzXDE3NVwxXDBcM1wxNzVcMVwwXDFcMTc1XDExMFwwIisKLSAgICAiXDFcMTc2XDY1XDBcMVwxNzdcNTVcMFwxXDIwMFw2MVwwXDFcMjAxXDcxXDAiKwotICAgICJcMVw1Nlw2XDBcMVw1Nlw1XDBcMVw1Nlw1MlwwXDNcNTdcNFwwIisKLSAgICAiXDFcNTdcNVwwXDZcNTdcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlwyXDU3XDJcMjAyXDJcNTdcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlwyXDU3XDFcMjAyXDFcMjAzXDJcNTdcMVwwXDEzXDU3XDFcMFw3XDU3IisKLSAgICAiXDFcMFwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDJcMjA0XDJcNTdcMVwwXDEzXDU3XDFcMFw3XDU3IisKLSAgICAiXDFcMFwzXDU3XDFcMFw1XDU3XDVcMFwxXDYzXDZcMFwxXDYzIisKLSAgICAiXDVcMFwxXDYzXDQ2XDBcMVwyMDVcNjZcMFwxXDIwNlw3MlwwXDNcNzAiKwotICAgICJcNFwwXDFcNzBcNVwwXDZcNzBcMVwwXDEzXDcwXDFcMFw3XDcwIisKLSAgICAiXDFcMFwzXDcwXDFcMFw1XDcwXDFcNzJcMlwwXDFcMjA3XDFcNzIiKwotICAgICJcMVwwXDNcNzJcMVwwXDFcNzJcMlwwXDVcNzJcMVwwXDQ1XDcyIisKLSAgICAiXDFcMFwxXDIwNlwxXDIwN1wxXDcyXDFcMFwzXDcyXDFcMFwxXDcyIisKLSAgICAiXDJcMFw1XDcyXDFcMFw0NFw3MlwxXDc1XDFcMFwxXDIxMFwxXDIxMSIrCi0gICAgIlwxXDc1XDFcMjEwXDNcNzVcMVwyMTJcMVw3NVwyXDIxMFw1XDc1XDFcMjEwIisKLSAgICAiXDQ0XDc1XDFcNzZcMVwwXDFcMjEzXDFcMjE0XDFcNzZcMVwyMTNcM1w3NiIrCi0gICAgIlwxXDIxM1wxXDc2XDFcMjEyXDFcMjEzXDVcNzZcMVwyMTNcNDRcNzZcMlwwIisKLSAgICAiXDFcMTAwXDFcMjE1XDcxXDBcM1wxMDJcNFwwXDFcMTAyXDVcMFw2XDEwMiIrCi0gICAgIlwxXDBcMTNcMTAyXDFcMFw3XDEwMlwxXDBcM1wxMDJcMVwwXDVcMTAyIisKLSAgICAiXDFcMTA0XDJcMFwxXDIxNlwxXDEwNFwxXDBcM1wxMDRcMVwwXDFcMTA0IisKLSAgICAiXDJcMFw1XDEwNFwxXDBcNDVcMTA0XDFcMFwxXDEwMFwxXDIxN1wxXDEwNCIrCi0gICAgIlwxXDBcM1wxMDRcMVwwXDFcMTA0XDJcMFw1XDEwNFwxXDBcNDRcMTA0IisKLSAgICAiXDFcMTA2XDFcMFwxXDIyMFwxXDIyMVwxXDEwNlwxXDIyMFwzXDEwNlwxXDIyMiIrCi0gICAgIlwxXDEwNlwyXDIyMFw1XDEwNlwxXDIyMFw0NFwxMDZcMVwxMDdcMVwwXDFcMjIzIisKLSAgICAiXDFcMjI0XDFcMTA3XDFcMjIzXDNcMTA3XDFcMjIzXDFcMTA3XDFcMjIyXDFcMjIzIisKLSAgICAiXDVcMTA3XDFcMjIzXDQ0XDEwN1wxXDExMFwzXDBcMTdcMTEwXDZcMFwxXDExMCIrCi0gICAgIlwxM1wwXDFcMTEwXDdcMFwxXDExMFwzXDBcMVwxMTBcM1wwXDFcMTEwIisKLSAgICAiXDRcMFwxXDE2N1wxNVwwXDFcMTcxXDQ3XDBcMVwyMjVcNjRcMFwxXDExMCIrCi0gICAgIlwzXDBcMlwxMTBcM1wxMTRcNFwxMTBcMVwxMTRcNVwxMTBcNlwxMTVcMVwxMTAiKwotICAgICJcMTNcMTE1XDFcMTEwXDdcMTE1XDFcMTEwXDNcMTE1XDFcMTEwXDNcMTE1XDFcMTE0IisKLSAgICAiXDFcMTE1XDZcMFwzXDExNVw0XDBcMVwxMTVcNVwwXDZcMTE1XDFcMCIrCi0gICAgIlwxM1wxMTVcMVwwXDdcMTE1XDFcMFwzXDExNVwxXDBcNVwxMTVcNlwwIisKLSAgICAiXDNcMTE2XDRcMFwxXDExNlw1XDBcNlwxMTZcMVwwXDEzXDExNlwxXDAiKwotICAgICJcN1wxMTZcMVwwXDNcMTE2XDFcMFw1XDExNlwxXDEyMFwyXDBcMVwyMjYiKwotICAgICJcMVwxMjBcMVwwXDNcMTIwXDFcMFwxXDEyMFwyXDBcNVwxMjBcMVwwIisKLSAgICAiXDQ1XDEyMFwxXDBcMVwyMjVcMVwyMjZcMVwxMjBcMVwwXDNcMTIwXDFcMCIrCi0gICAgIlwxXDEyMFwyXDBcNVwxMjBcMVwwXDQ0XDEyMFwxXDEyMlwxXDBcMVwyMjciKwotICAgICJcMVwyMzBcMVwxMjJcMVwyMjdcM1wxMjJcMVwyMzFcMVwxMjJcMlwyMjdcNVwxMjIiKwotICAgICJcMVwyMjdcNDRcMTIyXDFcMTIzXDFcMFwxXDIzMlwxXDIzM1wxXDEyM1wxXDIzMiIrCi0gICAgIlwzXDEyM1wxXDIzMlwxXDEyM1wxXDIzMVwxXDIzMlw1XDEyM1wxXDIzMlw0NFwxMjMiKwotICAgICJcM1wwXDFcMTY3XDE1XDBcMVwyMzRcMTEwXDBcMVwyMzVcNjBcMFwxXDIzNiIrCi0gICAgIlwxM1wwXDFcMjM2XDQ0XDBcMlwyMzdcMzZcMFwyMFwyNDBcMVwyNDFcNDZcMjQwIisKLSAgICAiXDZcMFwzXDEzMlw0XDBcMVwxMzJcNVwwXDZcMTMyXDFcMFwxM1wxMzIiKwotICAgICJcMVwwXDdcMTMyXDFcMFwzXDEzMlwxXDBcNVwxMzJcNDZcMFwxXDI0MiIrCi0gICAgIlw1XDBcMVwyNDJcNzJcMFwxXDI0M1w2XDBcMVwxMzVcMlwwXDFcMjQ0IisKLSAgICAiXDFcMTM1XDFcMFwzXDEzNVwxXDBcMVwxMzVcMlwwXDVcMTM1XDFcMCIrCi0gICAgIlw0NFwxMzVcMVwxMzdcMVwwXDFcMjQ1XDFcMjQ2XDFcMTM3XDFcMjQ1XDNcMTM3IisKLSAgICAiXDFcMjQ3XDFcMTM3XDJcMjQ1XDVcMTM3XDFcMjQ1XDQ0XDEzN1wxXDI1MFwxXDAiKwotICAgICJcMVwyNTFcMVwyNTJcMVwyNTNcMVwyNTFcM1wyNTNcMVwyNTFcMVwyNTBcMVwyNTQiKwotICAgICJcMVwyNTVcM1wyNTNcMVwyNTBcMVwyNTNcMVwyNTVcNlwyNTNcMVwyNTBcMzJcMjUzIisKLSAgICAiXDJcMjUwXDFcMjUzXDFcMTQxXDJcMjQwXDFcMjU2XDFcMTQxXDFcMjQwXDNcMTQxIisKLSAgICAiXDFcMjQwXDFcMTQxXDJcMjQwXDNcMTQxXDFcMjU3XDFcMTQxXDFcMjQwXDQ0XDE0MSIrCi0gICAgIlwxXDE0MlwyXDBcMVwyNjBcMVwxNDJcMVwwXDNcMTQyXDFcMFwxXDE0MiIrCi0gICAgIlwyXDBcNVwxNDJcMVwwXDQ0XDE0MlwxXDE0NFwyXDI2MVwxXDI2MlwxXDE0NCIrCi0gICAgIlwxXDI2MVwzXDE0NFwxXDI2M1wxXDE0NFwyXDI2MVw1XDE0NFwxXDI2MVw0NFwxNDQiKwotICAgICJcMVwxNDVcMlwyNjRcMVwyNjVcMVwxNDVcMVwyNjRcM1wxNDVcMVwyNjRcMVwxNDUiKwotICAgICJcMVwyNjNcMVwyNjRcNVwxNDVcMVwyNjRcNDRcMTQ1XDFcMTQ2XDJcMjQwXDFcMjY2IisKLSAgICAiXDFcMTQ2XDFcMjQwXDNcMTQ2XDFcMjQwXDFcMTQ2XDJcMjQwXDNcMTQ2XDFcMjY3IisKLSAgICAiXDFcMTQ2XDFcMjQwXDQ0XDE0NlwxXDE0N1wyXDBcMVwyNzBcMVwxNDdcMVwwIisKLSAgICAiXDNcMTQ3XDFcMFwxXDE0N1wyXDBcNVwxNDdcMVwwXDQ0XDE0N1wxXDE1MSIrCi0gICAgIlwxXDBcMVwyNzFcMVwyNzJcMVwxNTFcMVwyNzFcM1wxNTFcMVwyNzNcMVwxNTEiKwotICAgICJcMlwyNzFcNVwxNTFcMVwyNzFcNDRcMTUxXDFcMjc0XDFcMFwxXDI3NVwxXDI3NiIrCi0gICAgIlwxXDI3N1wxXDI3NVwzXDI3N1wxXDI3NVwxXDI3NFwxXDMwMFwxXDMwMVwzXDI3NyIrCi0gICAgIlwxXDI3NFwxXDI3N1wxXDMwMVw2XDI3N1wxXDI3NFwzMlwyNzdcMlwyNzRcMVwyNzciKwotICAgICJcMlwxNTNcMVwwXDY2XDE1M1wxXDBcMTZcMTUzXDFcMzAyXDQ1XDE1M1wxXDE1NiIrCi0gICAgIlwyXDBcMVwzMDNcMVwxNTZcMVwwXDNcMTU2XDFcMFwxXDE1NlwyXDAiKwotICAgICJcNVwxNTZcMVwwXDQ0XDE1NlwxXDE2MFwxXDBcMVwzMDRcMVwzMDVcMVwxNjAiKwotICAgICJcMVwzMDRcM1wxNjBcMVwzMDZcMVwxNjBcMlwzMDRcNVwxNjBcMVwzMDRcNDRcMTYwIisKLSAgICAiXDFcMzA3XDFcMFwxXDMxMFwxXDMxMVwxXDMxMlwxXDMxMFwzXDMxMlwxXDMxMCIrCi0gICAgIlwxXDMwN1wxXDMxM1wxXDMxNFwzXDMxMlwxXDMwN1wxXDMxMlwxXDMxNFw2XDMxMiIrCi0gICAgIlwxXDMwN1wzMlwzMTJcMlwzMDdcMVwzMTJcMlwxNjJcMVwwXDY2XDE2MlwxXDAiKwotICAgICJcMTZcMTYyXDFcMzE1XDQ1XDE2Mlw3XDBcMVwzMTZcMjFcMFwxXDMxN1w0MlwwIisKLSAgICAiXDFcMTcyXDJcMFwxXDQwXDNcMFwxXDE3Mlw1XDBcMVwxNzJcNlw0MCIrCi0gICAgIlwxXDBcMTNcNDBcMVwwXDdcNDBcMVwwXDNcNDBcMVwwXDNcNDAiKwotICAgICJcMVwwXDFcNDBcMVwzMjBcMVwwXDNcMzIwXDFcMzIxXDNcMTczXDFcMzIwIisKLSAgICAiXDFcMFwxXDMyMFwxXDMyMVwxXDE3M1wxXDMyMFwxXDBcMlwzMjBcMVwzMjEiKwotICAgICJcNlwxNzNcMVwzMjBcMTNcMTczXDFcMzIwXDdcMTczXDFcMzIwXDNcMTczXDFcMzIyIisKLSAgICAiXDVcMTczXDE1XDBcMVwzMjNcNlwwXDFcMzI0XDQyXDBcMVwzMjBcMVwwIisKLSAgICAiXDNcMzIwXDFcMzIxXDNcMTc1XDFcMzIwXDFcMFwxXDMyMFwxXDMyMVwxXDE3NSIrCi0gICAgIlwxXDMyMFwxXDBcMlwzMjBcMVwzMjFcNlwxNzVcMVwzMjBcMTNcMTc1XDFcMzIwIisKLSAgICAiXDdcMTc1XDFcMzIwXDNcMTc1XDFcMzI1XDVcMTc1XDMxXDBcMVwzMTdcMzdcMCIrCi0gICAgIlwxXDMyNlw2NlwwXDFcMzI3XDcyXDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNFw1N1wyXDMzMFwxXDBcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwXDRcNTciKwotICAgICJcMVwzMzBcMVwzMzFcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMFw2XDU3IisKLSAgICAiXDFcMFwxM1w1N1wxXDBcMVw1N1wxXDMzMlw1XDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw1XDU3XDFcMjEwXDFcMFw3XDIxMFwxXDIxMlw1NVwyMTBcMVwyMTMiKwotICAgICJcMVwwXDExXDIxM1wxXDIxMlw1M1wyMTNcMVwyMjBcMVwwXDdcMjIwXDFcMjIyIisKLSAgICAiXDU1XDIyMFwxXDIyM1wxXDBcMTFcMjIzXDFcMjIyXDUzXDIyM1wxXDIyN1wxXDAiKwotICAgICJcN1wyMjdcMVwyMzFcNTVcMjI3XDFcMjMyXDFcMFwxMVwyMzJcMVwyMzFcNTNcMjMyIisKLSAgICAiXDMyXDBcMVwzMzNcMzBcMFwxXDMzM1w0MFwwXDFcMzM0XDEzXDBcMVwzMzQiKwotICAgICJcNTRcMFwxXDMzNVwxMFwwXDFcMzM1XDU3XDBcMVwzMzZcMTRcMFwxXDMzNiIrCi0gICAgIlw3MlwwXDFcMzM3XDRcMFwxXDI0NVwxXDBcN1wyNDVcMVwyNDdcNTVcMjQ1IisKLSAgICAiXDFcMjUwXDFcMFwxXDI1MVwxXDM0MFwxXDI1MFwxXDI1MVwzXDI1MFwxXDI1MSIrCi0gICAgIlwxXDI1MFwxXDI0N1wxXDI1MVw1XDI1MFwxXDI1MVw0NFwyNTBcMVwyNTFcMVwwIisKLSAgICAiXDExXDI1MVwxXDI0N1w1M1wyNTFcMVwyNTBcMVwwXDFcMjUxXDFcMzQwXDFcMjUwIisKLSAgICAiXDFcMjUxXDNcMjUwXDFcMjUxXDFcMjUwXDFcMzQxXDFcMjUxXDVcMjUwXDFcMjUxIisKLSAgICAiXDQ0XDI1MFwxM1wwXDFcMzQyXDUzXDBcMVwyNTFcMVwwXDExXDI1MVwxXDM0MSIrCi0gICAgIlw1M1wyNTFcMTFcMjYxXDFcMjYzXDU1XDI2MVwxM1wyNjRcMVwyNjNcNTNcMjY0XDFcMjcxIisKLSAgICAiXDFcMFw3XDI3MVwxXDI3M1w1NVwyNzFcMVwyNzRcMVwwXDFcMjc1XDFcMzQzIisKLSAgICAiXDFcMjc0XDFcMjc1XDNcMjc0XDFcMjc1XDFcMjc0XDFcMjczXDFcMjc1XDVcMjc0IisKLSAgICAiXDFcMjc1XDQ0XDI3NFwxXDI3NVwxXDBcMTFcMjc1XDFcMjczXDUzXDI3NVwxXDI3NCIrCi0gICAgIlwxXDBcMVwyNzVcMVwzNDNcMVwyNzRcMVwyNzVcM1wyNzRcMVwyNzVcMVwyNzQiKwotICAgICJcMVwzNDRcMVwyNzVcNVwyNzRcMVwyNzVcNDRcMjc0XDEzXDBcMVwzNDVcNTNcMCIrCi0gICAgIlwxXDI3NVwxXDBcMTFcMjc1XDFcMzQ0XDUzXDI3NVwyXDE1M1wxXDBcMjZcMTUzIisKLSAgICAiXDFcMzQ2XDM1XDE1M1wxXDMwNFwxXDBcN1wzMDRcMVwzMDZcNTVcMzA0XDFcMzA3IisKLSAgICAiXDFcMFwxXDMxMFwxXDM0N1wxXDMwN1wxXDMxMFwzXDMwN1wxXDMxMFwxXDMwNyIrCi0gICAgIlwxXDMwNlwxXDMxMFw1XDMwN1wxXDMxMFw0NFwzMDdcMVwzMTBcMVwwXDExXDMxMCIrCi0gICAgIlwxXDMwNlw1M1wzMTBcMVwzMDdcMVwwXDFcMzEwXDFcMzQ3XDFcMzA3XDFcMzEwIisKLSAgICAiXDNcMzA3XDFcMzEwXDFcMzA3XDFcMzUwXDFcMzEwXDVcMzA3XDFcMzEwXDQ0XDMwNyIrCi0gICAgIlwxM1wwXDFcMzUxXDUzXDBcMVwzMTBcMVwwXDExXDMxMFwxXDM1MFw1M1wzMTAiKwotICAgICJcMlwxNjJcMVwwXDI2XDE2MlwxXDM1MlwzNVwxNjJcN1wwXDFcMzUzXDExMVwwIisKLSAgICAiXDFcMzU0XDM0XDBcMVwzMjBcMVwwXDEwXDMyMFwxXDBcNFwzMjBcMVwwIisKLSAgICAiXDQxXDMyMFwxXDBcNlwzMjBcMVwwXDNcMzIwXDFcMzIxXDRcMzIwXDFcMCIrCi0gICAgIlwxXDMyMFwxXDMyMVwyXDMyMFwxXDBcMlwzMjBcMVwzMjFcMzZcMzIwXDFcMzU1IisKLSAgICAiXDVcMzIwXDE1XDBcMVwzMjNcNDNcMFwxXDM1NlwyMlwwXDFcMzU3XDE0XDAiKwotICAgICJcM1wzNTdcMlwwXDFcMzU3XDEwXDBcMVwzNTdcMVwwXDJcMzU3XDNcMCIrCi0gICAgIlwxXDM1N1wyXDBcMlwzNTdcMTFcMFwxXDU3XDFcMzYwXDFcNTdcNFwwIisKLSAgICAiXDFcNTdcNVwwXDZcNTdcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw2XDU3XDFcMFwxMVw1N1wxXDM2MVwxXDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDM1XDBcMVwzNjJcMTNcMFwxXDM2Mlw0NFwwIisKLSAgICAiXDJcMzYzXDYzXDBcMlwzNjRcNzVcMFwxXDM2NVwxM1wwXDFcMzY1XDQ0XDAiKwotICAgICJcMlwzNjZcNDFcMFwyXDM2N1wxXDBcM1wzNjdcMlwwXDFcMjU0XDRcMzY3IisKLSAgICAiXDFcMFwxMFwzNjdcMVwwXDMyXDM2N1wyXDBcMVwzNjdcM1wwXDJcMzcwIisKLSAgICAiXDFcMFwzXDM3MFwyXDBcMVwzMDBcNFwzNzBcMVwwXDEwXDM3MFwxXDAiKwotICAgICJcMzJcMzcwXDJcMFwxXDM3MFwyXDE1M1wxXDBcMjdcMTUzXDFcMzcxXDM0XDE1MyIrCi0gICAgIlwzXDBcMlwzNzJcMVwwXDNcMzcyXDJcMFwxXDMxM1w0XDM3MlwxXDAiKwotICAgICJcMTBcMzcyXDFcMFwzMlwzNzJcMlwwXDFcMzcyXDJcMTYyXDFcMFwyN1wxNjIiKwotICAgICJcMVwzNzNcMzRcMTYyXDMzXDBcMVwzNzRcMTE0XDBcMVwzNTVcMjJcMFwxXDM1NyIrCi0gICAgIlwxNFwwXDNcMzU3XDJcMFwxXDM1N1wxMFwwXDFcMzU3XDFcMFwyXDM1NyIrCi0gICAgIlwzXDBcMVwzNTdcMVwwXDFcMzU2XDJcMzU3XDExXDBcM1w1N1w0XDAiKwotICAgICJcMVw1N1w1XDBcNlw1N1wxXDBcN1w1N1wxXDM3NVwzXDU3XDFcMCIrCi0gICAgIlw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMCIrCi0gICAgIlwxXDU3XDVcMFw2XDU3XDFcMFw2XDU3XDFcMzc2XDRcNTdcMVwwIisKLSAgICAiXDdcNTdcMVwwXDNcNTdcMVwwXDVcNTdcNDZcMFwxXDM3N1w1XDAiKwotICAgICJcMVwzNzdcNTRcMFwxXHUwMTAwXDYzXDBcMVx1MDEwMVwxMFwwXDFcdTAxMDFcNTVcMCIrCi0gICAgIlwxXHUwMTAyXDEwXDBcMVx1MDEwMlw2MFwwXDFcdTAxMDNcMjRcMFwyXDE1M1wxXDAiKwotICAgICJcMzBcMTUzXDFcdTAxMDRcMzNcMTUzXDJcMTYyXDFcMFwzMFwxNjJcMVx1MDEwNVwzM1wxNjIiKwotICAgICJcMzRcMFwxXHUwMTA2XDQwXDBcM1w1N1w0XDBcMVw1N1w1XDBcNlw1NyIrCi0gICAgIlwxXDBcMTNcNTdcMVwwXDNcNTdcMVx1MDEwN1wzXDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMFw2XDU3IisKLSAgICAiXDFcMFwzXDU3XDFcdTAxMDhcN1w1N1wxXDBcM1w1N1wxXHUwMTA4XDNcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDVcNTdcNDdcMFwxXHUwMTA5XDYwXDBcMVx1MDEwYSIrCi0gICAgIlwxNFwwXDFcdTAxMGFcNTRcMFwxXHUwMTBiXDQ3XDBcMlx1MDEwY1w3MlwwXDFcdTAxMGQiKwotICAgICJcMzBcMFwxXHUwMTBkXDNcMFwyXDE1M1wxXDBcMzFcMTUzXDFcdTAxMGVcMzJcMTUzIisKLSAgICAiXDJcMTYyXDFcMFwzMVwxNjJcMVx1MDEwZlwzMlwxNjJcMzVcMFwxXHUwMTEwXDM3XDAiKwotICAgICJcM1w1N1w0XDBcMVw1N1w1XDBcNlw1N1wxXDBcMTNcNTdcMVwwIisKLSAgICAiXDZcNTdcMVx1MDExMVwxXDBcM1w1N1wxXDBcNVw1N1w1XDBcMVx1MDExMiIrCi0gICAgIlwzXDU3XDNcMFwxXHUwMTEyXDFcNTdcNFwwXDFcdTAxMTJcNlw1N1wxXDAiKwotICAgICJcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTdcMVwwXDVcNTdcMzdcMCIrCi0gICAgIlwxXHUwMTEzXDEwXDBcMVx1MDExM1w1M1wwXDFcdTAxMTRcMTNcMFwxXHUwMTE0XDUyXDAiKwotICAgICJcMVx1MDExNVwxM1wwXDFcdTAxMTVcMTVcMFwyXDE1M1wxXDBcMzJcMTUzXDFcdTAxMTYiKwotICAgICJcMzFcMTUzXDJcMTYyXDFcMFwzMlwxNjJcMVx1MDExN1wzMVwxNjJcMzRcMFwxXHUwMTE4IisKLSAgICAiXDQwXDBcM1w1N1w0XDBcMVw1N1w1XDBcNVw1N1wxXHUwMTE5XDFcMCIrCi0gICAgIlwxM1w1N1wxXDBcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1w1XDAiKwotICAgICJcMVx1MDExMlw2XDBcMVx1MDExMlw1XDBcMVx1MDExMlw0NFwwXDJcMTUzXDFcMCIrCi0gICAgIlwzMVwxNTNcMVx1MDExYVwzMlwxNTNcMlwxNjJcMVwwXDMxXDE2MlwxXHUwMTFiXDMyXDE2MiIrCi0gICAgIlwzMVwwXDFcdTAxMWNcNDNcMFwzXDU3XDRcMFwxXDU3XDVcMFw2XDU3IisKLSAgICAiXDFcMFw1XDU3XDFcdTAxMWRcNVw1N1wxXDBcN1w1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNVw1N1wyXDE1M1wxXDBcMjZcMTUzXDFcdTAxMWVcMzVcMTUzXDJcMTYyIisKLSAgICAiXDFcMFwyNlwxNjJcMVx1MDExZlwzNVwxNjJcNlwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDZcNTdcMVwwXDdcNTdcMVx1MDEyMFwzXDU3XDFcMFw3XDU3IisKLSAgICAiXDFcMFwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFw2XDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNFw1N1wxXHUwMTIxXDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw2XDU3XDFcMFw1XDU3XDFcdTAxMjJcNVw1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNlw1N1wxXDBcNVw1N1wxXHUwMTIzXDVcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDZcNTdcMVwwXDEzXDU3XDFcMFwzXDU3XDFcdTAxMjRcM1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1NyI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjayh5eV9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICAvLyBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAkJLy8kTk9OLU5MUy0xJAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIJLy8kTk9OLU5MUy0xJAotICB9OwotCi0gIC8qKgotICAgKiBZWV9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFlZX0FUVFJJQlVURVtdID0gewotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICAxLCAgOSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDksICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDksICAxLCAgMSwgIDEsICA5LCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAKLSAgICAgMSwgIDksICAwLCAgMCwgIDksICA5LCAgOSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICA5LCAgMCwgIDEsICA5LCAgMCwgIDEsIAotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgIDAsICA5LCAgOSwgIDEsICAxLCAgMCwgCi0gICAgIDEsICAxLCAgOSwgIDksICA5LCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCXJldHVybjsKLQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCX0KLQl9Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JfQotCXJldHVybiBCTE9DS19URVhUOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci19Ci1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0gKgotICogRXhhbXBsZTogCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0gKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLSAqCi0gKiBSZXR1cm5zOgotICoJQkxPQ0tfVEVYVDogMC00MAotICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0gKglYTUxfQ09OVEVOVDogNTAtNTcKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLX0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYW1lID0gdHJ1ZTsKLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQkKLQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMgKHl5X2N1cnJlbnRQb3MgaXMgdGhlICpsYXN0KiBjaGFyYWN0ZXIgd2UgY2FuIGNoZWNrIGFnYWluc3QpCi0JCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBBIGdlbmVyaWMgbG9va2FoZWFkLWxpa2Ugb3BlcmF0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tTY2FuKFN0cmluZyB0YXJnZXQsIFN0cmluZyB0YXJnZXRDb250ZXh0LCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZXR1cm4gZG9TY2FuKHRhcmdldCwgZmFsc2UsIHRhcmdldENvbnRleHQsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0gKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotICoKLSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotICovCi1wdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJc3RhcnQgPSB5eWNoYXI7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQlpZiAoeXlfYXRFT0YpIHsKLQkJCWZUb2tlbkNvdW50Kys7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQlpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCWVsc2UKLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JfQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JfQotCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JfQotCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJLy8gRU9GCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlmVG9rZW5Db3VudCsrOwotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsKLQlzdXBlcigpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQlyZXNldChpbiwgMCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kICoKLSAqCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0gKgotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JfQotCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0KLQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JeXlfcmVhZGVyID0gaW47Ci0KLQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JeXlfc3RhdGUgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JeXlfc3RhcnRSZWFkID0gMDsKLQotCS8qKiAKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkgKiBmcm9tIGlucHV0IAotCSAqLwotCXl5X2VuZFJlYWQgPSAwOwotCi0JLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JeXlsaW5lID0gMDsKLQotCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXl5Y2hhciA9IDA7Ci0KLQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JeXlfYXRFT0YgPSBmYWxzZTsKLQotCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotCS8qIHVzZXIgdmFyczogKi8KLQlmVG9rZW5Db3VudCA9IDA7Ci0gCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCWZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0KLQljb250ZXh0ID0gbnVsbDsKLQlzdGFydCA9IDA7Ci0JdGV4dExlbmd0aCA9IDA7Ci0JbGVuZ3RoID0gMDsKLX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKi8KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVhNTFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBYTUxUb2tlbml6ZXIoKTsKLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCAKLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7Ci0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotLyogdXNlciBtZXRob2QgKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsKLX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzExMDU1XTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAzNzM0KSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTM3MikgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3IKLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShjaGFyW10gbWFya2VyVGFnTmFtZSwgaW50IG9mZnNldCwgaW50IHRhZ25hbWVMZW5ndGgpIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBqKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgPT0gdGFnbmFtZUxlbmd0aCkgewotCQkJCWJvb2xlYW4gbWF0Y2hlc1NvRmFyID0gdHJ1ZTsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgewotCQkJCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpICE9IG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXRjaGVzU29GYXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqCi0JICogUmV0dXJuIEFMTCBvZiB0aGUgcmVnaW9ucyBzY2FubmFibGUgd2l0aGluIHRoZSByZW1haW5pbmcgdGV4dAotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlCi0JICovCi0JcHVibGljIGZpbmFsIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCXdoaWxlKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbmNlIHRoaXMgaXMgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBOT1QgdGhlIHJlY29tbWVuZGVkIAotCQkJLy8gd2F5IG9mIGdldHRpbmcgdG9rZW5zLCBtYW55IGVycm9ycyBhcmUgc2ltcGx5IGhpZGRlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcChTdHJpbmcgcykgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJKHl5bGVuZ3RoKCkgKyB5eWNoYXIpICsgIik6XCciICsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1V0aWxzLmVzY2FwZSh5eXRleHQoKSkgKyAiXCciKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgIC0gc2tlbGV0b24uc2VkICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLwotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKFN0cmluZyBtYXJrZXJUYWdOYW1lKSB7Ci0JSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2IKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgYm9vbGVhbiB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICBmb3IgKHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQ7IHl5X2N1cnJlbnRQb3MgPCB5eV9tYXJrZWRQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9jdXJyZW50UG9zKyspIHsKLSAgICAgICAgc3dpdGNoICh5eV9idWZmZXJbeXlfY3VycmVudFBvc10pIHsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHl5X2NvdW50ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHl5X2NvdW50ZWQpCi0gICAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV9jb3VudGVkKSB7Ci0gICAgICAgIGlmICggeXlfYWR2YW5jZSgpID09ICdcbicgKSB5eWxpbmUtLTsKLSAgICAgICAgaWYgKCAheXlfYXRFT0YgKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAxKSA+IDAgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA+IDAgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDI5MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWFNMIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDI5MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjgzOiAKLSAgICAgICAgY2FzZSAyODU6IAotICAgICAgICBjYXNlIDI4NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JeXliZWdpbihTVF9DREFUQV9URVhUKTsKLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI5NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk1OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyOTY6IGJyZWFrOwotICAgICAgICBjYXNlIDI3NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOwotIH0KLSAgICAgICAgY2FzZSAyOTg6IGJyZWFrOwotICAgICAgICBjYXNlIDI2NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTTsKLSB9Ci0gICAgICAgIGNhc2UgMjk5OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjM6IAotICAgICAgICBjYXNlIDI3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDIzNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDMwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgY2FzZSAyMTY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMDM6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA0OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMDU6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuRW50aXR5UmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRU5USVRZX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDE3NDogCi0gICAgICAgIGNhc2UgMTgyOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ7Ci0gfQotICAgICAgICBjYXNlIDMwODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ4OiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzEwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMzI6IAotICAgICAgICAgIHsgCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMTE6IGJyZWFrOwotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzEyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICAgIHsgCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMTM6IGJyZWFrOwotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5wcm9jZXNzaW5nIGluc3RydWN0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfUEkpOwotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMxNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMxNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTc6IAotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDEzNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE2OiBicmVhazsKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSAzMTc6IGJyZWFrOwotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICBjYXNlIDUyOiAKLSAgICAgICAgY2FzZSA1MzogCi0gICAgICAgICAgeyAKLQkvLyBibG9jayBzY2FuIHVudGlsIGNsb3NlIGlzIGZvdW5kCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOwotIH0KLSAgICAgICAgY2FzZSAzMTk6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOwotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDMyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICBjYXNlIDEyOTogCi0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDIxNzogCi0gICAgICAgIGNhc2UgMjM5OiAKLSAgICAgICAgY2FzZSAyNDA6IAotICAgICAgICBjYXNlIDI1MjogCi0gICAgICAgIGNhc2UgMjUzOiAKLSAgICAgICAgY2FzZSAyNjI6IAotICAgICAgICBjYXNlIDI3MjogCi0gICAgICAgIGNhc2UgMjgwOiAKLSAgICAgICAgY2FzZSAyODQ6IAotICAgICAgICBjYXNlIDI4NzogCi0gICAgICAgIGNhc2UgMjg4OiAKLSAgICAgICAgY2FzZSAyODk6IAotICAgICAgICBjYXNlIDI5MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgMzIyOiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIzOiBicmVhazsKLSAgICAgICAgY2FzZSAwOiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMTIyOiAKLSAgICAgICAgY2FzZSAxMjQ6IAotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgY2FzZSAyMzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzI1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDEwNjogCi0gICAgICAgIGNhc2UgMTA3OiAKLSAgICAgICAgY2FzZSAxOTM6IAotICAgICAgICBjYXNlIDIyOTogCi0gICAgICAgIGNhc2UgMjQ4OiAKLSAgICAgICAgY2FzZSAyNTk6IAotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgIGNhc2UgMjc3OiAKLSAgICAgICAgY2FzZSAyODE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDExMzogCi0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgY2FzZSAyMDQ6IAotICAgICAgICBjYXNlIDIzMzogCi0gICAgICAgIGNhc2UgMjUwOiAKLSAgICAgICAgY2FzZSAyNjA6IAotICAgICAgICBjYXNlIDI3MDogCi0gICAgICAgIGNhc2UgMjc4OiAKLSAgICAgICAgY2FzZSAyODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzI4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICBjYXNlIDU0OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICBjYXNlIDgwOiAKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSA4ODogCi0gICAgICAgIGNhc2UgOTA6IAotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgIGNhc2UgOTg6IAotICAgICAgICBjYXNlIDEwMzogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJU3lzdGVtLm91dC5wcmludGxuKCIhISF1bmV4cGVjdGVkISEhOiBcIiIgKyB5eXRleHQoKSArICJcIjoiICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBVTkRFRklORUQ7Ci0gfQotICAgICAgICBjYXNlIDMzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBibG9ja0NvbnRleHQgPSBkb0Jsb2NrU2NhbigiXV0+IiwgWE1MX0NEQVRBX1RFWFQsIFNUX0NEQVRBX0VORCk7Ly8kTk9OLU5MUy0xJAotCWlmKGJsb2NrQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkKLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOwotCXJldHVybiBibG9ja0NvbnRleHQ7Ci0gfQotICAgICAgICBjYXNlIDMzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSA3MDogCi0gICAgICAgIGNhc2UgMTQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM0OiBicmVhazsKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmKGlzQmxvY2tNYXJrZXIoKSkgewotICAgICAgICAJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JfQotCWVsc2UKLSAgICAgICAgCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMzY6IGJyZWFrOwotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMzc6IGJyZWFrOwotICAgICAgICBjYXNlIDc4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSA4MjogCi0gICAgICAgIGNhc2UgMTUyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM5OiBicmVhazsKLSAgICAgICAgY2FzZSA4NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQwOiBicmVhazsKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQpOwotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzNDE6IGJyZWFrOwotICAgICAgICBjYXNlIDkyOiAKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICBjYXNlIDk2OiAKLSAgICAgICAgY2FzZSAxNjY6IAotICAgICAgICBjYXNlIDE2NzogCi0gICAgICAgIGNhc2UgMTcwOiAKLSAgICAgICAgY2FzZSAxNzE6IAotICAgICAgICBjYXNlIDIyNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBwdWJsaWMgcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotIH0KLSAgICAgICAgY2FzZSAzNDI6IGJyZWFrOwotICAgICAgICBjYXNlIDk3OiAKLSAgICAgICAgY2FzZSA5OTogCi0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgY2FzZSAxMDE6IAotICAgICAgICBjYXNlIDE3ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotIH0KLSAgICAgICAgY2FzZSAzNDM6IGJyZWFrOwotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgIGNhc2UgMTA0OiAKLSAgICAgICAgY2FzZSAxMDU6IAotICAgICAgICBjYXNlIDE4NjogCi0gICAgICAgIGNhc2UgMTg3OiAKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgIGNhc2UgMjI3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQ0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQ1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgIGNhc2UgMjAxOiAKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICBjYXNlIDIzMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQ2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzNDc6IGJyZWFrOwotICAgICAgICBjYXNlIDExODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9FTkRfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDM0ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgY2FzZSAxMTc6IAotICAgICAgICAgIHsgCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCSB9Ci0gICAgICAgIGNhc2UgMzQ5OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmpmbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGVmN2IwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmpmbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLlhNTFBhcnNlclJlZ2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7DQotDQotJSUNCi0NCi0lew0KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7DQotIA0KLQkvLyByZXF1aXJlZCBob2xkZXJzIGZvciB3aGl0ZS1zcGFjZSBjb21wYWN0aW5nDQotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydCA9IDE7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7DQotCXByaXZhdGUgU3RyaW5nIGZfY29udGV4dCA9IG51bGw7DQotDQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zDQotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7DQotCXByaXZhdGUgaW50IHN0YXJ0ID0gMDsNCi0JcHJpdmF0ZSBpbnQgdGV4dExlbmd0aCA9IDA7DQotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7DQotDQotCS8vIG9mZnNldCBmb3IgdHJhY2tpbmcgcG9zaXRpb24gc3BlY2lmaWMgYmxvY2sgdGFncw0KLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsNCi0JDQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBiZWluZyBvcGVuZWQNCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsNCi0NCi0JLy8gdGhlIGxpc3Qgb2YgdGFnIG5hbWUgQmxvY2tNYXJrZXJzDQotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnDQotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7DQotDQotCXByaXZhdGUgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCk7DQotLyoqDQotICogdXNlciBtZXRob2QgDQotICovDQotcHVibGljIGZpbmFsIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7DQotCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkNCi0JCXJldHVybjsNCi0JZkJsb2NrTWFya2Vycy5hZGQobWFya2VyKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QgDQotICovDQotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7DQotCWZCbG9ja01hcmtlcnMucmVtb3ZlKG1hcmtlcik7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7DQotCWlmIChmQmxvY2tNYXJrZXJzICE9IG51bGwpIHsNCi0JCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsNCi0JCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7DQotCQkJaWYgKCgoQmxvY2tNYXJrZXIpIGJsb2Nrcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHModGFnbmFtZSkpDQotCQkJCWJsb2Nrcy5yZW1vdmUoKTsNCi0JCX0NCi0JfQ0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKCkgew0KLQlyZXR1cm4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIHNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhib29sZWFuIG5ld1ZhbHVlKSB7DQotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgew0KLSAgICAgICAgcmV0dXJuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KGZDdXJyZW50VGFnTmFtZSk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoU3RyaW5nIG5hbWUpIHsNCi0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgew0KLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsNCi0JCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpDQotCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkNCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsNCi0JfQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dCgpIHsNCi0JcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7DQotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7DQotCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQlyZXR1cm4gbWFya2VyLmdldENvbnRleHQoKTsNCi0JfQ0KLQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7DQotCXJldHVybiBmQmxvY2tNYXJrZXJzOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgew0KLQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsNCi19DQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoKSB7DQotCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7DQotfQ0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7DQotCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQlyZXR1cm4gY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZA0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7DQotCWJlZ2luQmxvY2tNYXJrZXJTY2FuKG5ld1RhZ05hbWUsIEJMT0NLX1RFWFQpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZA0KLSAqDQotICogU3BlY2lhbCB0b2tlbml6ZXIgc2V0dXAuICBBbGxvd3MgdG9rZW5pemF0aW9uIHRvIGJlIGluaXRpYXRlZCBhdCB0aGUNCi0gKiBzdGFydCBvZiBhIHRleHQgYmxvY2sgd2l0aGluIGEgIm5ld1RhZ05hbWUiIHRhZy4NCi0gKg0KLSAqIEV4YW1wbGU6IA0KLSAqCVRva2VuaXplciB0b2tlciA9IG5ldyBUb2tlbml6ZXIoKTsNCi0gKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOw0KLSAqCXRva2VyLnJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcigiYWZpdWhxd2tlamh0YXNpaGdhbGt3aHRxPC9zY3JpcHRlcj48L3Njcj48L3NjcmlwdD5hc2dkYXNnYSIpKTsNCi0gKgl0b2tlci5iZWdpbkJsb2NrTWFya2VyU2Nhbigic2NyaXB0IiwgQkxPQ0tfVEVYVCk7DQotICoJdG9rZXIuZ2V0UmVnaW9ucygpOyANCi0gKg0KLSAqIFJldHVybnM6DQotICoJQkxPQ0tfVEVYVDogMC00MA0KLSAqCVhNTF9FTkRfVEFHX09QRU46IDQxLTQyDQotICoJWE1MX1RBR19OQU1FOiA0My00OA0KLSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5DQotICoJWE1MX0NPTlRFTlQ6IDUwLTU3DQotICoNCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGJsb2NrY29udGV4dCkgew0KLQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsNCi19DQotLyoqDQotICogTWV0aG9kIGRvU2Nhbi4NCi0gKiANCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcg0KLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nDQotICogDQotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIg0KLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nDQotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoDQotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgNCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQ0KLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MNCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIFN0cmluZyBzZWFyY2hDb250ZXh0LCBpbnQgZXhpdFN0YXRlLCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JYm9vbGVhbiBzdGlsbFNlYXJjaGluZyA9IHRydWU7DQotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpDQotCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOw0KLQlpbnQgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aCgpOw0KLQlpbnQgbiA9IDA7DQotCWNoYXIgbGFzdENoZWNrQ2hhcjsNCi0JaW50IGk7DQotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOw0KLQl3aGlsZSAoc3RpbGxTZWFyY2hpbmcpIHsNCi0JCW4gPSAwOw0KLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4NCi0JCW4gPSB5eV9hZHZhbmNlKCk7DQotCQl3aGlsZShuICE9IFlZRU9GICYmIHl5X2N1cnJlbnRQb3MgPCBzZWFyY2hTdHJpbmdMZW5ndGgpDQotCQkJbiA9IHl5X2FkdmFuY2UoKTsNCi0JCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuDQotCQlpZiAobiA9PSBZWUVPRikgew0KLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQl9DQotCQllbHNlIHsNCi0JCQlzYW1lID0gdHJ1ZTsNCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZA0KLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4NCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcg0KLQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcw0KLQkJCQ0KLQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMgKHl5X2N1cnJlbnRQb3MgaXMgdGhlICpsYXN0KiBjaGFyYWN0ZXIgd2UgY2FuIGNoZWNrIGFnYWluc3QpDQotCQkJaWYoeXlfY3VycmVudFBvcyA+PSBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyA8PSB5eV9idWZmZXIubGVuZ3RoKSB7DQotCQkJCWZvcihpID0gMDsgaSA8IHNlYXJjaFN0cmluZ0xlbmd0aDsgaSsrKSB7DQotCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykNCi0JCQkJCQlzYW1lID0geXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSBzZWFyY2hTdHJpbmcuY2hhckF0KGkpOw0KLQkJCQkJZWxzZSBpZihzYW1lICYmICFmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7DQotCQkJCX0NCi0JCQl9DQotCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93DQotCQkJZWxzZSB7DQotCQkJCXNhbWUgPSBmYWxzZTsNCi0JCQl9DQotCQkJaWYgKHNhbWUgJiYgcmVxdWlyZVRhaWxTZXBhcmF0b3IgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0JCQkJLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgY2xvc2UgdGFncyB0byBlbnN1cmUgdGhhdCB0YXJnZXRTdHJpbmc9Ijwvc2NyaXB0IiBkb2Vzbid0IG1hdGNoDQotCQkJCS8vICI8L3NjcmlwdFMiDQotCQkJCWxhc3RDaGVja0NoYXIgPSB5eV9idWZmZXJbeXlfY3VycmVudFBvc107DQotCQkJCS8vIFN1Y2NlZWQgb24gIjwvc2NyaXB0PiIgYW5kICI8L3NjcmlwdCAiDQotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpDQotCQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJc3RpbGxTZWFyY2hpbmcgPSAhc2FtZSB8fCAoeXlfY3VycmVudFBvcyA8IHl5X3N0YXJ0UmVhZCArIHNlYXJjaFN0cmluZ0xlbmd0aCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCWlmIChuICE9IFlZRU9GIHx8IHNhbWUpIHsNCi0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gNCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7DQotCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUNCi0JCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5DQotCQlpZiAoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7DQotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCX0NCi0JfQ0KLQllbHNlIHsNCi0JCS8vIFdlIHJhbiB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBpbnB1dA0KLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsNCi0JCXl5X2N1cnJlbnRQb3MrKzsNCi0JfQ0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7DQotCS8vIElmIHRoZSBlbmRpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUNCi0JLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkNCi0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkNCi0JCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7DQotCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZA0KLSAqDQotICogQSBnZW5lcmljIGxvb2thaGVhZC1saWtlIG9wZXJhdGlvbg0KLSAqLw0KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tTY2FuKFN0cmluZyB0YXJnZXQsIFN0cmluZyB0YXJnZXRDb250ZXh0LCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JcmV0dXJuIGRvU2Nhbih0YXJnZXQsIGZhbHNlLCB0YXJnZXRDb250ZXh0LCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlLCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QgDQotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUNCi0gKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrVGFnU2NhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOw0KLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kDQotICoNCi0gKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkNCi0gKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQ0KLSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4NCi0gKg0KLSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkNCi0gKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLg0KLSAqDQotICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQNCi0gKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4NCi0gKi8NCi1wdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JLy8gbG9hZCB0aGUgc3RhcnRpbmcgbm9uLXdoaXRlc3BhY2UgdG9rZW4gKGFzc3VtZSB0aGF0IGl0IGlzIHNvKQ0KLQlpZiAoZlNob3VsZExvYWRCdWZmZXJlZCkgew0KLQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7DQotCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0Ow0KLQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsNCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JfQ0KLQllbHNlIHsNCi0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQlpZiAoY29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsNCi0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQ0KLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsNCi0JCQllbHNlDQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotCQl9DQotCQllbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfT1BFTikgew0KLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7DQotCQl9DQotCQllbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JCX0NCi0JCXN0YXJ0ID0geXljaGFyOw0KLQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQlpZiAoeXlfYXRFT0YpIHsNCi0JCQlmVG9rZW5Db3VudCsrOw0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuDQotCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsNCi0JCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpDQotCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7DQotCQllbHNlDQotCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsNCi0JfQ0KLQllbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7DQotCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOw0KLQl9DQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JfQ0KLQlmQnVmZmVyZWRDb250ZXh0ID0gZl9jb250ZXh0Ow0KLQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsNCi0JZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7DQotCWlmIChmQnVmZmVyZWRDb250ZXh0ID09IFdISVRFX1NQQUNFKSB7DQotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCQlsZW5ndGggKz0gZkJ1ZmZlcmVkTGVuZ3RoOw0KLQl9DQotCWlmIChjb250ZXh0ID09IG51bGwpIHsNCi0JCS8vIEVPRg0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JZlRva2VuQ291bnQrKzsNCi0JcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIGZDdXJyZW50VGFnTmFtZSk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIFhNTFRva2VuaXplcigpew0KLQlzdXBlcigpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBYTUxUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7DQotCQl0aGlzKG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgew0KLQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXksIGludCBuZXdPZmZzZXQpIHsNCi0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsNCi0JcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCAwKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgbmV3T2Zmc2V0KTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbikgew0KLQlyZXNldChpbiwgMCk7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kICoNCi0gKg0KLSAqIFJlc2V0IGludGVybmFsIGNvdW50ZXJzIGFuZCB2YXJzIHRvICJuZXdseSBjcmVhdGVkIiB2YWx1ZXMsIGluIHRoZSBob3Blcw0KLSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuDQotICoNCi0gKiBUaGlzIG1ldGhvZCBjb250YWlucyBjb2RlIGJsb2NrcyB0aGF0IHdlcmUgZXNzZW50aWFsbHkgZHVwbGljYXRlZCBmcm9tIHRoZQ0KLSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMNCi0gKiBhZGRlZC4gIFRob3NlIGNvZGUgYmxvY2tzIHdlcmUgdW5kZXIgdGhlIGFib3ZlIGNvcHlyaWdodC4NCi0gKi8NCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigicmVzZXR0aW5nIHRva2VuaXplciIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmT2Zmc2V0ID0gbmV3T2Zmc2V0Ow0KLQ0KLQkvKiB0aGUgaW5wdXQgZGV2aWNlICovDQotCXl5X3JlYWRlciA9IGluOw0KLQ0KLQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotCXl5X3N0YXRlID0gMDsNCi0NCi0JLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsNCi0NCi0JLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0JeXlfbWFya2VkUG9zID0gMDsNCi0NCi0JLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0JeXlfcHVzaGJhY2tQb3MgPSAwOw0KLQ0KLQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0JeXlfY3VycmVudFBvcyA9IDA7DQotDQotCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLQl5eV9zdGFydFJlYWQgPSAwOw0KLQ0KLQkvKiogDQotCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZA0KLQkgKiBmcm9tIGlucHV0IA0KLQkgKi8NCi0JeXlfZW5kUmVhZCA9IDA7DQotDQotCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQl5eWxpbmUgPSAwOw0KLQ0KLQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JeXljaGFyID0gMDsNCi0NCi0JLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLQl5eV9hdEVPRiA9IGZhbHNlOw0KLQ0KLQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8NCi0JeXlfZW9mX2RvbmUgPSBmYWxzZTsNCi0NCi0NCi0JLyogdXNlciB2YXJzOiAqLw0KLQlmVG9rZW5Db3VudCA9IDA7DQotIA0KLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQlmQnVmZmVyZWRTdGFydCA9IDE7DQotCWZCdWZmZXJlZExlbmd0aCA9IDA7DQotCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotDQotCWNvbnRleHQgPSBudWxsOw0KLQlzdGFydCA9IDA7DQotCXRleHRMZW5ndGggPSAwOw0KLQlsZW5ndGggPSAwOw0KLX0NCi0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7DQotCQlYTUxUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgWE1MVG9rZW5pemVyKCk7DQotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIA0KLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpDQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgew0KLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsNCi0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQ0KLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7DQotCQl9DQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7DQotCX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcw0KLQkvLyAgIFhNTF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaA0KLQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0DQotCS8vICBjb250ZXh0IGFzIHVzdWFsLg0KLQlyZXR1cm4gZG9TY2FuKCItLT4iLCBmYWxzZSwgWE1MX0NPTU1FTlRfVEVYVCwgU1RfWE1MX0NPTU1FTlRfRU5ELCBTVF9YTUxfQ09NTUVOVF9FTkQpOw0KLX0NCi0lfQ0KLQ0KLSVlb2Z7DQotLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2INCi0lZW9mfQ0KLQ0KLSVwdWJsaWMNCi0lY2xhc3MgWE1MVG9rZW5pemVyDQotJWltcGxlbWVudHMgQmxvY2tUb2tlbml6ZXIsIERPTVJlZ2lvbkNvbnRleHQNCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbg0KLSV0eXBlIFN0cmluZw0KLSVjaGFyDQotJWxpbmUNCi0ldW5pY29kZQ0KLSVwYWNrDQotDQotJXN0YXRlIFNUX0NEQVRBX1RFWFQNCi0lc3RhdGUgU1RfQ0RBVEFfRU5EDQotJXN0YXRlIFNUX1hNTF9DT01NRU5UDQotJXN0YXRlIFNUX1hNTF9DT01NRU5UX0VORA0KLSVzdGF0ZSBTVF9QSQ0KLSVzdGF0ZSBTVF9QSV9XUw0KLSVzdGF0ZSBTVF9QSV9DT05URU5UDQotJXN0YXRlIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfUElfRVFVQUxTDQotJXN0YXRlIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfWE1MX1BJX1RBR19DTE9TRQ0KLSVzdGF0ZSBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9ESFRNTF9FUVVBTFMNCi0lc3RhdGUgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX0RIVE1MX1RBR19DTE9TRQ0KLQ0KLS8vIG5vcm1hbCB0YWcgc3RhdGVzDQotJXN0YXRlIFNUX1hNTF9UQUdfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfWE1MX0VRVUFMUw0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFDQotDQotLy8gZGVjbGFyYXRpb24gKERURCkgc3RhdGVzDQotJXN0YXRlIFNUX1hNTF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UNCi0NCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQNCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTQ0KLQ0KLSVzdGF0ZSBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UDQotDQotJXN0YXRlIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQNCi0NCi0lc3RhdGUgU1RfQkxPQ0tfVEFHX1NDQU4NCi0NCi0vLyBMZXR0ZXIgPSAoW0EtWmEtel0pDQotLy8gRGlnaXQgPSAoWzAtOV0pDQotDQotLyoqDQotICogc21hbGxlciB0b2tlbnMNCi0gKi8NCi1nZW5lcmljVGFnT3BlbiAgICAgICA9IDwNCi1nZW5lcmljVGFnQ2xvc2UgICAgICA9ID4NCi1nZW5lcmljRW5kVGFnT3BlbiAgICA9IDxcLw0KLWdlbmVyaWNFbXB0eVRhZ0Nsb3NlID0gXC8+DQotDQotUElzdGFydCA9IDxcPw0KLVBJZW5kICAgPSBcPz4NCi0NCi0NCi0vLyBbMV0gZG9jdW1lbnQgOjo9IHByb2xvZyBlbGVtZW50IE1pc2MqDQotZG9jdW1lbnQgPSAoe3Byb2xvZ30ge2VsZW1lbnR9IHtNaXNjfSopDQotDQotLy8gWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gfCBbI3hFMDAwLSN4RkZGRF0gfCBbI3gxMDAwMC0jeDEwRkZGRl0NCi0gLy9DaGFyID0gKC4pDQotQ2hhciA9IFtceDA5XHgwQVx4MERceDIwLVx1RDdGRlx1RTAwMC1cdUZGRkRdIA0KLQ0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrDQotUyA9IFtceDIwXHgwOVx4MERceDBBXSsNCi0NCi0vLyBbNF0gTmFtZUNoYXIgOjo9IExldHRlciB8IERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwgQ29tYmluaW5nQ2hhciB8IEV4dGVuZGVyDQotTmFtZUNoYXIgPSAoe0xldHRlcn0gfCB7RGlnaXR9IHwgXC4gfCBcLSB8IF8gfCA6IHwge0NvbWJpbmluZ0NoYXJ9IHwge0V4dGVuZGVyfSkNCi0NCi0vLyBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgTmFtZUNoYXIqDQotLy9OYW1lID0gKHtOYW1lQ2hhcn17TmFtZUNoYXJ9KikNCi1OYW1lID0gKHtMZXR0ZXJ9IHwgXyB8IDope05hbWVDaGFyfSoNCi0NCi0vLyBbNl0gTmFtZXMgOjo9IHtOYW1lfSAoe1N9IHtOYW1lfSkqDQotTmFtZXMgPSAoe05hbWV9ICh7U30ge05hbWV9KSopDQotDQotLy8gWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrDQotTm10b2tlbiA9ICh7TmFtZUNoYXJ9KykNCi0NCi0vLyBbOF0gTm10b2tlbnMgOjo9IE5tdG9rZW4gKFMgTm10b2tlbikqDQotTm10b2tlbnMgPSAoe05tdG9rZW59ICh7U30ge05tdG9rZW59KSopDQotDQotLy8gWzldIEVudGl0eVZhbHVlIDo6PSAnIicgKFteJSYiXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogJyInIHwgICInIiAoW14lJiddIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAiJyINCi1FbnRpdHlWYWx1ZSA9IChcIiAoW14lJlwiXSB8IHtQRVJlZmVyZW5jZX0gfCB7UmVmZXJlbmNlfSkqIFwiIHwgIFwnIChbXiUmXCddIHwge1BFUmVmZXJlbmNlfSB8IHtSZWZlcmVuY2V9KSogXCcpDQotDQotLy8gWzEwXSBBdHRWYWx1ZSA6Oj0gJyInIChbXjwmIl0gfCBSZWZlcmVuY2UpKiAnIicgfCAgIiciIChbXjwmJ10gfCBSZWZlcmVuY2UpKiAiJyINCi1BdHRWYWx1ZSA9ICggXCIgKFtePFwiXSB8IHtSZWZlcmVuY2V9KSogXCIgfCBcJyAoW148XCddIHwge1JlZmVyZW5jZX0pKiBcJyAgfCAoW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKQ0KLQ0KLS8vIFsxMV0gU3lzdGVtTGl0ZXJhbCA6Oj0gKCciJyBbXiJdKiAnIicpIHwgKCInIiBbXiddKiAiJyIpIA0KLVN5c3RlbUxpdGVyYWwgPSAoKFwiIFteXCJdKiBcIikgfCAoXCcgW15cJ10qIFwnKSkgDQotDQotLy8gWzEyXSBQdWJpZExpdGVyYWwgOjo9ICciJyBQdWJpZENoYXIqICciJyB8ICInIiAoUHViaWRDaGFyIC0gIiciKSogIiciDQotUHViaWRMaXRlcmFsID0gKFwiIHtQdWJpZENoYXJ9KiBcIiB8IFwnICh7UHViaWRDaGFyfVwnKSogIiciKQ0KLQ0KLS8vIFsxM10gUHViaWRDaGFyIDo6PSAjeDIwIHwgI3hEIHwgI3hBIHwgW2EtekEtWjAtOV0gfCBbLScoKSssLi86PT87ISojQCRfJV0NCi1QdWJpZENoYXIgPSAoW1wwNDBcMDE1XDAxMl0gfCBbYS16QS1aMC05XSB8IFtcLVwnKClcKywuXC86PT87IVwqI0BcJF8lXSkNCi0NCi0vLyBbMTRdIENoYXJEYXRhIDo6PSBbXjwmXSogLSAoW148Jl0qICddXT4nIFtePCZdKikNCi0vLyBpbXBsZW1lbnQgbG9va2FoZWFkIGJlaGF2aW9yIGR1cmluZyBhY3Rpb24gZGVmaW5pdGlvbg0KLUNoYXJEYXRhID0gKFtePCYoXF1cXT4pXSopDQotDQotLy8gWzE1XSBDb21tZW50IDo6PSAnPCEtLScgKChDaGFyIC0gJy0nKSB8ICgnLScgKENoYXIgLSAnLScpKSkqICctLT4nDQotQ29tbWVudFN0YXJ0ID0gKDwhXC1cLSkNCi1Db21tZW50RW5kICAgPSAoXC1cLT4pDQotQ29tbWVudCA9ICh7Q29tbWVudFN0YXJ0fS4qe0NvbW1lbnRFbmR9KQ0KLQ0KLS8vIFsxNl0gUEkgOjo9ICc8PycgUElUYXJnZXQgKFMgKENoYXIqIC0gKENoYXIqICc/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/e2V4dFN1YnNldERlY2x9KQ0KLQ0KLS8vIFs4MF0gRW5jb2RpbmdEZWNsIDo6PSBTICdlbmNvZGluZycgRXEgKCciJyBFbmNOYW1lICciJyB8ICAiJyIgRW5jTmFtZSAiJyIgKSANCi1FbmNvZGluZ0RlY2wgPSAoe1N9ZW5jb2Rpbmd7U30qe0VxfXtTfSooXCJ7RW5jTmFtZX1cInxcJ3tFbmNOYW1lfVwnKSkNCi0NCi0vLyBbODFdIEVuY05hbWUgOjo9IFtBLVphLXpdIChbQS1aYS16MC05Ll9dIHwgJy0nKSoNCi1FbmNOYW1lID0gKFtBLVphLXpdKFtBLVphLXowLTkuX118XC0pKikNCi0NCi0vLyBbODJdIE5vdGF0aW9uRGVjbCA6Oj0gJzwhTk9UQVRJT04nIFMgTmFtZSBTIChFeHRlcm5hbElEIHwgIFB1YmxpY0lEKSBTPyAnPicNCi1Ob3RhdGlvbkRlY2wgPSAoPFwhTk9UQVRJT057U317TmFtZX17U30oe0V4dGVybmFsSUR9fHtQdWJsaWNJRH0pe1N9Pz4pDQotDQotLy8gWzgzXSBQdWJsaWNJRCA6Oj0gJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwNCi1QdWJsaWNJRCA9IChQVUJMSUN7U317UHViaWRMaXRlcmFsfSkNCi0NCi0vLyBbODRdICBMZXR0ZXIgOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMNCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pDQotDQotLy8gWzg1XSAgQmFzZUNoYXIgOjo9IFsjeDAwNDEtI3gwMDVBXSB8IFsjeDAwNjEtI3gwMDdBXSB8IFsjeDAwQzAtI3gwMEQ2XQ0KLS8vIHwgWyN4MDBEOC0jeDAwRjZdIHwgWyN4MDBGOC0jeDAwRkZdIHwgWyN4MDEwMC0jeDAxMzFdDQotLy8gfCBbI3gwMTM0LSN4MDEzRV0gfCBbI3gwMTQxLSN4MDE0OF0gfCBbI3gwMTRBLSN4MDE3RV0NCi0vLyB8IFsjeDAxODAtI3gwMUMzXSB8IFsjeDAxQ0QtI3gwMUYwXSB8IFsjeDAxRjQtI3gwMUY1XQ0KLS8vIHwgWyN4MDFGQS0jeDAyMTddIHwgWyN4MDI1MC0jeDAyQThdIHwgWyN4MDJCQi0jeDAyQzFdIHwgI3gwMzg2DQotLy8gfCBbI3gwMzg4LSN4MDM4QV0gfCAjeDAzOEMgfCBbI3gwMzhFLSN4MDNBMV0gfCBbI3gwM0EzLSN4MDNDRV0NCi0vLyB8IFsjeDAzRDAtI3gwM0Q2XSB8ICN4MDNEQSB8ICN4MDNEQyB8ICN4MDNERSB8ICN4MDNFMA0KLS8vIHwgWyN4MDNFMi0jeDAzRjNdIHwgWyN4MDQwMS0jeDA0MENdIHwgWyN4MDQwRS0jeDA0NEZdDQotLy8gfCBbI3gwNDUxLSN4MDQ1Q10gfCBbI3gwNDVFLSN4MDQ4MV0gfCBbI3gwNDkwLSN4MDRDNF0NCi0vLyB8IFsjeDA0QzctI3gwNEM4XSB8IFsjeDA0Q0ItI3gwNENDXSB8IFsjeDA0RDAtI3gwNEVCXQ0KLS8vIHwgWyN4MDRFRS0jeDA0RjVdIHwgWyN4MDRGOC0jeDA0RjldIHwgWyN4MDUzMS0jeDA1NTZdIHwgI3gwNTU5DQotLy8gfCBbI3gwNTYxLSN4MDU4Nl0gfCBbI3gwNUQwLSN4MDVFQV0gfCBbI3gwNUYwLSN4MDVGMl0NCi0vLyB8IFsjeDA2MjEtI3gwNjNBXSB8IFsjeDA2NDEtI3gwNjRBXSB8IFsjeDA2NzEtI3gwNkI3XQ0KLS8vIHwgWyN4MDZCQS0jeDA2QkVdIHwgWyN4MDZDMC0jeDA2Q0VdIHwgWyN4MDZEMC0jeDA2RDNdIHwgI3gwNkQ1DQotLy8gfCBbI3gwNkU1LSN4MDZFNl0gfCBbI3gwOTA1LSN4MDkzOV0gfCAjeDA5M0QgfCBbI3gwOTU4LSN4MDk2MV0NCi0vLyB8IFsjeDA5ODUtI3gwOThDXSB8IFsjeDA5OEYtI3gwOTkwXSB8IFsjeDA5OTMtI3gwOUE4XQ0KLS8vIHwgWyN4MDlBQS0jeDA5QjBdIHwgI3gwOUIyIHwgWyN4MDlCNi0jeDA5QjldIHwgWyN4MDlEQy0jeDA5RERdDQotLy8gfCBbI3gwOURGLSN4MDlFMV0gfCBbI3gwOUYwLSN4MDlGMV0gfCBbI3gwQTA1LSN4MEEwQV0NCi0vLyB8IFsjeDBBMEYtI3gwQTEwXSB8IFsjeDBBMTMtI3gwQTI4XSB8IFsjeDBBMkEtI3gwQTMwXQ0KLS8vIHwgWyN4MEEzMi0jeDBBMzNdIHwgWyN4MEEzNS0jeDBBMzZdIHwgWyN4MEEzOC0jeDBBMzldDQotLy8gfCBbI3gwQTU5LSN4MEE1Q10gfCAjeDBBNUUgfCBbI3gwQTcyLSN4MEE3NF0gfCBbI3gwQTg1LSN4MEE4Ql0NCi0vLyB8ICN4MEE4RCB8IFsjeDBBOEYtI3gwQTkxXSB8IFsjeDBBOTMtI3gwQUE4XSB8IFsjeDBBQUEtI3gwQUIwXQ0KLS8vIHwgWyN4MEFCMi0jeDBBQjNdIHwgWyN4MEFCNS0jeDBBQjldIHwgI3gwQUJEIHwgI3gwQUUwDQotLy8gfCBbI3gwQjA1LSN4MEIwQ10gfCBbI3gwQjBGLSN4MEIxMF0gfCBbI3gwQjEzLSN4MEIyOF0NCi0vLyB8IFsjeDBCMkEtI3gwQjMwXSB8IFsjeDBCMzItI3gwQjMzXSB8IFsjeDBCMzYtI3gwQjM5XSB8ICN4MEIzRA0KLS8vIHwgWyN4MEI1Qy0jeDBCNURdIHwgWyN4MEI1Ri0jeDBCNjFdIHwgWyN4MEI4NS0jeDBCOEFdDQotLy8gfCBbI3gwQjhFLSN4MEI5MF0gfCBbI3gwQjkyLSN4MEI5NV0gfCBbI3gwQjk5LSN4MEI5QV0gfCAjeDBCOUMNCi0vLyB8IFsjeDBCOUUtI3gwQjlGXSB8IFsjeDBCQTMtI3gwQkE0XSB8IFsjeDBCQTgtI3gwQkFBXQ0KLS8vIHwgWyN4MEJBRS0jeDBCQjVdIHwgWyN4MEJCNy0jeDBCQjldIHwgWyN4MEMwNS0jeDBDMENdDQotLy8gfCBbI3gwQzBFLSN4MEMxMF0gfCBbI3gwQzEyLSN4MEMyOF0gfCBbI3gwQzJBLSN4MEMzM10NCi0vLyB8IFsjeDBDMzUtI3gwQzM5XSB8IFsjeDBDNjAtI3gwQzYxXSB8IFsjeDBDODUtI3gwQzhDXQ0KLS8vIHwgWyN4MEM4RS0jeDBDOTBdIHwgWyN4MEM5Mi0jeDBDQThdIHwgWyN4MENBQS0jeDBDQjNdDQotLy8gfCBbI3gwQ0I1LSN4MENCOV0gfCAjeDBDREUgfCBbI3gwQ0UwLSN4MENFMV0gfCBbI3gwRDA1LSN4MEQwQ10NCi0vLyB8IFsjeDBEMEUtI3gwRDEwXSB8IFsjeDBEMTItI3gwRDI4XSB8IFsjeDBEMkEtI3gwRDM5XQ0KLS8vIHwgWyN4MEQ2MC0jeDBENjFdIHwgWyN4MEUwMS0jeDBFMkVdIHwgI3gwRTMwIHwgWyN4MEUzMi0jeDBFMzNdDQotLy8gfCBbI3gwRTQwLSN4MEU0NV0gfCBbI3gwRTgxLSN4MEU4Ml0gfCAjeDBFODQgfCBbI3gwRTg3LSN4MEU4OF0NCi0vLyB8ICN4MEU4QSB8ICN4MEU4RCB8IFsjeDBFOTQtI3gwRTk3XSB8IFsjeDBFOTktI3gwRTlGXQ0KLS8vIHwgWyN4MEVBMS0jeDBFQTNdIHwgI3gwRUE1IHwgI3gwRUE3IHwgWyN4MEVBQS0jeDBFQUJdDQotLy8gfCBbI3gwRUFELSN4MEVBRV0gfCAjeDBFQjAgfCBbI3gwRUIyLSN4MEVCM10gfCAjeDBFQkQNCi0vLyB8IFsjeDBFQzAtI3gwRUM0XSB8IFsjeDBGNDAtI3gwRjQ3XSB8IFsjeDBGNDktI3gwRjY5XQ0KLS8vIHwgWyN4MTBBMC0jeDEwQzVdIHwgWyN4MTBEMC0jeDEwRjZdIHwgI3gxMTAwIHwgWyN4MTEwMi0jeDExMDNdDQotLy8gfCBbI3gxMTA1LSN4MTEwN10gfCAjeDExMDkgfCBbI3gxMTBCLSN4MTEwQ10gfCBbI3gxMTBFLSN4MTExMl0NCi0vLyB8ICN4MTEzQyB8ICN4MTEzRSB8ICN4MTE0MCB8ICN4MTE0QyB8ICN4MTE0RSB8ICN4MTE1MA0KLS8vIHwgWyN4MTE1NC0jeDExNTVdIHwgI3gxMTU5IHwgWyN4MTE1Ri0jeDExNjFdIHwgI3gxMTYzIHwgI3gxMTY1DQotLy8gfCAjeDExNjcgfCAjeDExNjkgfCBbI3gxMTZELSN4MTE2RV0gfCBbI3gxMTcyLSN4MTE3M10gfCAjeDExNzUNCi0vLyB8ICN4MTE5RSB8ICN4MTFBOCB8ICN4MTFBQiB8IFsjeDExQUUtI3gxMUFGXSB8IFsjeDExQjctI3gxMUI4XQ0KLS8vIHwgI3gxMUJBIHwgWyN4MTFCQy0jeDExQzJdIHwgI3gxMUVCIHwgI3gxMUYwIHwgI3gxMUY5DQotLy8gfCBbI3gxRTAwLSN4MUU5Ql0gfCBbI3gxRUEwLSN4MUVGOV0gfCBbI3gxRjAwLSN4MUYxNV0NCi0vLyB8IFsjeDFGMTgtI3gxRjFEXSB8IFsjeDFGMjAtI3gxRjQ1XSB8IFsjeDFGNDgtI3gxRjREXQ0KLS8vIHwgWyN4MUY1MC0jeDFGNTddIHwgI3gxRjU5IHwgI3gxRjVCIHwgI3gxRjVEIHwgWyN4MUY1Ri0jeDFGN0RdDQotLy8gfCBbI3gxRjgwLSN4MUZCNF0gfCBbI3gxRkI2LSN4MUZCQ10gfCAjeDFGQkUgfCBbI3gxRkMyLSN4MUZDNF0NCi0vLyB8IFsjeDFGQzYtI3gxRkNDXSB8IFsjeDFGRDAtI3gxRkQzXSB8IFsjeDFGRDYtI3gxRkRCXQ0KLS8vIHwgWyN4MUZFMC0jeDFGRUNdIHwgWyN4MUZGMi0jeDFGRjRdIHwgWyN4MUZGNi0jeDFGRkNdIHwgI3gyMTI2DQotLy8gfCBbI3gyMTJBLSN4MjEyQl0gfCAjeDIxMkUgfCBbI3gyMTgwLSN4MjE4Ml0gfCBbI3gzMDQxLSN4MzA5NF0NCi0vLyB8IFsjeDMwQTEtI3gzMEZBXSB8IFsjeDMxMDUtI3gzMTJDXSB8IFsjeEFDMDAtI3hEN0EzXQ0KLUJhc2VDaGFyID0gW1x1MDA0MS1cdTAwNUFcdTAwNjEtXHUwMDdBXHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMEZGXHUwMTAwLVx1MDEzMVx1MDEzNC1cdTAxM0VcdTAxNDEtXHUwMTQ4XHUwMTRBLVx1MDE3RVx1MDE4MC1cdTAxQzNcdTAxQ0QtXHUwMUYwXHUwMUY0LVx1MDFGNVx1MDFGQS1cdTAyMTdcdTAyNTAtXHUwMkE4XHUwMkJCLVx1MDJDMVx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNDRVx1MDNEMC1cdTAzRDZcdTAzREFcdTAzRENcdTAzREVcdTAzRTBcdTAzRTItXHUwM0YzXHUwNDAxLVx1MDQwQ1x1MDQwRS1cdTA0NEZcdTA0NTEtXHUwNDVDXHUwNDVFLVx1MDQ4MVx1MDQ5MC1cdTA0QzRcdTA0QzctXHUwNEM4XHUwNENCLVx1MDRDQ1x1MDREMC1cdTA0RUJcdTA0RUUtXHUwNEY1XHUwNEY4LVx1MDRGOVx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg2XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjEtXHUwNjNBXHUwNjQxLVx1MDY0QVx1MDY3MS1cdTA2QjdcdTA2QkEtXHUwNkJFXHUwNkMwLVx1MDZDRVx1MDZEMC1cdTA2RDNcdTA2RDVcdTA2RTUtXHUwNkU2XHUwOTA1LVx1MDkzOVx1MDkzRFx1MDk1OC1cdTA5NjFcdTA5ODUtXHUwOThDXHUwOThGLVx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlEQy1cdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwLVx1MDlGMVx1MEEwNS1cdTBBMEFcdTBBMEYtXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzItXHUwQTMzXHUwQTM1LVx1MEEzNlx1MEEzOC1cdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOEJcdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjItXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFFMFx1MEIwNS1cdTBCMENcdTBCMEYtXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzItXHUwQjMzXHUwQjM2LVx1MEIzOVx1MEIzRFx1MEI1Qy1cdTBCNURcdTBCNUYtXHUwQjYxXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5LVx1MEI5QVx1MEI5Q1x1MEI5RS1cdTBCOUZcdTBCQTMtXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjVcdTBCQjctXHUwQkI5XHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzM1x1MEMzNS1cdTBDMzlcdTBDNjAtXHUwQzYxXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDREVcdTBDRTAtXHUwQ0UxXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDI4XHUwRDJBLVx1MEQzOVx1MEQ2MC1cdTBENjFcdTBFMDEtXHUwRTJFXHUwRTMwXHUwRTMyLVx1MEUzM1x1MEU0MC1cdTBFNDVcdTBFODEtXHUwRTgyXHUwRTg0XHUwRTg3LVx1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQS1cdTBFQUJcdTBFQUQtXHUwRUFFXHUwRUIwXHUwRUIyLVx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2OVx1MTBBMC1cdTEwQzVcdTEwRDAtXHUxMEY2XHUxMTAwXHUxMTAyLVx1MTEwM1x1MTEwNS1cdTExMDdcdTExMDlcdTExMEItXHUxMTBDXHUxMTBFLVx1MTExMlx1MTEzQ1x1MTEzRVx1MTE0MFx1MTE0Q1x1MTE0RVx1MTE1MFx1MTE1NC1cdTExNTVcdTExNTlcdTExNUYtXHUxMTYxXHUxMTYzXHUxMTY1XHUxMTY3XHUxMTY5XHUxMTZELVx1MTE2RVx1MTE3Mi1cdTExNzNcdTExNzVcdTExOUVcdTExQThcdTExQUJcdTExQUUtXHUxMUFGXHUxMUI3LVx1MTFCOFx1MTFCQVx1MTFCQy1cdTExQzJcdTExRUJcdTExRjBcdTExRjlcdTFFMDAtXHUxRTlCXHUxRUEwLVx1MUVGOVx1MUYwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjEyNlx1MjEyQS1cdTIxMkJcdTIxMkVcdTIxODAtXHUyMTgyXHUzMDQxLVx1MzA5NFx1MzBBMS1cdTMwRkFcdTMxMDUtXHUzMTJDXHVBQzAwLVx1RDdBM10NCi0NCi0vLyBbODZdICBJZGVvZ3JhcGhpYyA6Oj0gWyN4NEUwMC0jeDlGQTVdIHwgI3gzMDA3IHwgWyN4MzAyMS0jeDMwMjldDQotSWRlb2dyYXBoaWMgPSBbXHU0RTAwLVx1OUZBNVx1MzAwN1x1MzAyMS1cdTMwMjldDQotDQotLy8gWzg3XSAgICAgIENvbWJpbmluZ0NoYXIgICAgOjo9ICAgIFsjeDAzMDAtI3gwMzQ1XSAgICB8IFsjeDAzNjAtI3gwMzYxXQ0KLS8vIHwgWyN4MDQ4My0jeDA0ODZdICAgICAgICAgIHwgWyN4MDU5MS0jeDA1QTFdICAgICAgICAgfCBbI3gwNUEzLSN4MDVCOV0NCi0vLyB8IFsjeDA1QkItI3gwNUJEXSAgICAgICB8ICN4MDVCRiAgICAgICB8IFsjeDA1QzEtI3gwNUMyXQkgfCAjeDA1QzQNCi0vLyB8IFsjeDA2NEItI3gwNjUyXSAgICB8ICN4MDY3MCAgICB8IFsjeDA2RDYtI3gwNkRDXSAgIHwgWyN4MDZERC0jeDA2REZdDQotLy8gfCBbI3gwNkUwLSN4MDZFNF0gICAgICAgICAgfCBbI3gwNkU3LSN4MDZFOF0gICAgICAgICB8IFsjeDA2RUEtI3gwNkVEXQ0KLS8vIHwgWyN4MDkwMS0jeDA5MDNdICAgICAgIHwgI3gwOTNDICAgICAgIHwgWyN4MDkzRS0jeDA5NENdICAgICAgfCAjeDA5NEQNCi0vLyB8IFsjeDA5NTEtI3gwOTU0XSAgICB8IFsjeDA5NjItI3gwOTYzXSAgICB8IFsjeDA5ODEtI3gwOTgzXSAgIHwgI3gwOUJDDQotLy8gfCAjeDA5QkUgICAgICAgfCAjeDA5QkYgICAgICAgfCBbI3gwOUMwLSN4MDlDNF0gICAgICB8IFsjeDA5QzctI3gwOUM4XQ0KLS8vIHwgWyN4MDlDQi0jeDA5Q0RdICAgfCAjeDA5RDcgICB8IFsjeDA5RTItI3gwOUUzXSAgIHwgI3gwQTAyICAgfCAjeDBBM0MNCi0vLyB8ICN4MEEzRSAgICAgICB8ICN4MEEzRiAgICAgICB8IFsjeDBBNDAtI3gwQTQyXSAgICAgIHwgWyN4MEE0Ny0jeDBBNDhdDQotLy8gfCBbI3gwQTRCLSN4MEE0RF0gICAgfCBbI3gwQTcwLSN4MEE3MV0gICAgfCBbI3gwQTgxLSN4MEE4M10gICB8ICN4MEFCQw0KLS8vIHwgWyN4MEFCRS0jeDBBQzVdICAgICAgICAgIHwgWyN4MEFDNy0jeDBBQzldICAgICAgICAgfCBbI3gwQUNCLSN4MEFDRF0NCi0vLyB8IFsjeDBCMDEtI3gwQjAzXSAgICB8ICN4MEIzQyAgICB8IFsjeDBCM0UtI3gwQjQzXSAgIHwgWyN4MEI0Ny0jeDBCNDhdDQotLy8gfCBbI3gwQjRCLSN4MEI0RF0gICAgICAgICAgfCBbI3gwQjU2LSN4MEI1N10gICAgICAgICB8IFsjeDBCODItI3gwQjgzXQ0KLS8vIHwgWyN4MEJCRS0jeDBCQzJdICAgIHwgWyN4MEJDNi0jeDBCQzhdICAgIHwgWyN4MEJDQS0jeDBCQ0RdICAgfCAjeDBCRDcNCi0vLyB8IFsjeDBDMDEtI3gwQzAzXSAgICAgICAgICB8IFsjeDBDM0UtI3gwQzQ0XSAgICAgICAgIHwgWyN4MEM0Ni0jeDBDNDhdDQotLy8gfCBbI3gwQzRBLSN4MEM0RF0gICAgICAgICAgfCBbI3gwQzU1LSN4MEM1Nl0gICAgICAgICB8IFsjeDBDODItI3gwQzgzXQ0KLS8vIHwgWyN4MENCRS0jeDBDQzRdICAgICAgICAgIHwgWyN4MENDNi0jeDBDQzhdICAgICAgICAgfCBbI3gwQ0NBLSN4MENDRF0NCi0vLyB8IFsjeDBDRDUtI3gwQ0Q2XSAgICAgICAgICB8IFsjeDBEMDItI3gwRDAzXSAgICAgICAgIHwgWyN4MEQzRS0jeDBENDNdDQotLy8gfCBbI3gwRDQ2LSN4MEQ0OF0gICAgICAgfCBbI3gwRDRBLSN4MEQ0RF0gICAgICAgfCAjeDBENTcgICAgICB8ICN4MEUzMQ0KLS8vIHwgWyN4MEUzNC0jeDBFM0FdICAgIHwgWyN4MEU0Ny0jeDBFNEVdICAgIHwgI3gwRUIxICAgfCBbI3gwRUI0LSN4MEVCOV0NCi0vLyB8IFsjeDBFQkItI3gwRUJDXSAgICB8IFsjeDBFQzgtI3gwRUNEXSAgICB8IFsjeDBGMTgtI3gwRjE5XSAgIHwgI3gwRjM1DQotLy8gfCAjeDBGMzcgICAgICB8ICN4MEYzOSAgICAgfCAjeDBGM0UgICAgIHwgI3gwRjNGICAgICB8IFsjeDBGNzEtI3gwRjg0XQ0KLS8vIHwgWyN4MEY4Ni0jeDBGOEJdICAgIHwgWyN4MEY5MC0jeDBGOTVdICAgIHwgI3gwRjk3ICAgfCBbI3gwRjk5LSN4MEZBRF0NCi0vLyB8IFsjeDBGQjEtI3gwRkI3XSAgICAgICB8ICN4MEZCOSAgICAgICB8IFsjeDIwRDAtI3gyMERDXSAgICAgIHwgI3gyMEUxDQotLy8gfCBbI3gzMDJBLSN4MzAyRl0gfCAjeDMwOTkgfCAjeDMwOUENCi1Db21iaW5pbmdDaGFyID0gICAgW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0NCi0NCi0vLyBbODhdICAgRGlnaXQgIDo6PSAgWyN4MDAzMC0jeDAwMzldIHwgWyN4MDY2MC0jeDA2NjldIHwgWyN4MDZGMC0jeDA2RjldDQotLy8gfCBbI3gwOTY2LSN4MDk2Rl0gICAgICAgICAgfCBbI3gwOUU2LSN4MDlFRl0gICAgICAgICB8IFsjeDBBNjYtI3gwQTZGXQ0KLS8vIHwgWyN4MEFFNi0jeDBBRUZdICAgICAgICAgIHwgWyN4MEI2Ni0jeDBCNkZdICAgICAgICAgfCBbI3gwQkU3LSN4MEJFRl0NCi0vLyB8IFsjeDBDNjYtI3gwQzZGXSAgICAgICAgICB8IFsjeDBDRTYtI3gwQ0VGXSAgICAgICAgIHwgWyN4MEQ2Ni0jeDBENkZdDQotLy8gfCBbI3gwRTUwLSN4MEU1OV0gfCBbI3gwRUQwLSN4MEVEOV0gfCBbI3gwRjIwLSN4MEYyOV0NCi1EaWdpdCA9ICBbXHUwMDMwLVx1MDAzOVx1MDY2MC1cdTA2NjlcdTA2RjAtXHUwNkY5XHUwOTY2LVx1MDk2Rlx1MDlFNi1cdTA5RUZcdTBBNjYtXHUwQTZGXHUwQUU2LVx1MEFFRlx1MEI2Ni1cdTBCNkZcdTBCRTctXHUwQkVGXHUwQzY2LVx1MEM2Rlx1MENFNi1cdTBDRUZcdTBENjYtXHUwRDZGXHUwRTUwLVx1MEU1OVx1MEVEMC1cdTBFRDlcdTBGMjAtXHUwRjI5XQ0KLQ0KLS8vIFs4OV0gIEV4dGVuZGVyIDo6PSAjeDAwQjcgfCAjeDAyRDAgfCAjeDAyRDEgfCAjeDAzODcgfCAjeDA2NDAgfCAjeDBFNDYNCi0vLyB8ICN4MEVDNiAgICAgICB8ICN4MzAwNSAgICAgICB8IFsjeDMwMzEtI3gzMDM1XSAgICAgIHwgWyN4MzA5RC0jeDMwOUVdDQotLy8gfCBbI3gzMEZDLSN4MzBGRV0NCi1FeHRlbmRlciA9IFtcdTAwQjdcdTAyRDBcdTAyRDFcdTAzODdcdTA2NDBcdTBFNDZcdTBFQzZcdTMwMDVcdTMwMzEtXHUzMDM1XHUzMDlELVx1MzA5RVx1MzBGQy1cdTMwRkVdDQotDQotJSUNCi0NCi0NCi0vKiB3aGl0ZSBzcGFjZSB3aXRoaW4gYSB0YWcgKi8NCi08U1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9QSSwgU1RfWE1MX1BJX0VRVUFMUywgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFLCBTVF9YTUxfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiwgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04sIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLFNUX0RIVE1MX0VRVUFMUyxTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUsU1RfREhUTUxfVEFHX0NMT1NFPiB7U30qIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsNCi19DQotDQotLy8gQkVHSU4gUkVHVUxBUiBYTUwNCi0vKiBoYW5kbGUgb3BlbmluZyBhIG5ldyB0YWcgYWxtb3N0IGFueXdoZXJlICovDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5zdGFydCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47DQotfQ0KLQ0KLS8qIHVucXVvdGVkICovDQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTj4ge2dlbmVyaWNFbmRUYWdPcGVufSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsNCi19DQotLyogdGhlIHRhZydzIG5hbWUgd2FzIGZvdW5kLCBzdGFydCBzY2FubmluZyBmb3IgYXR0cmlidXRlcyAqLw0KLTxTVF9YTUxfVEFHX05BTUU+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgidGFnIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi0vKiBhbm90aGVyIGF0dHJpYnV0ZSBuYW1lIHdhcyBmb3VuZCwgcmVzdW1lIGxvb2tpbmcgZm9yIHRoZSBlcXVhbHMgc2lnbiAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9FUVVBTFM+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi0vKiBhbiBlcXVhbCBzaWduIHdhcyBmb3VuZCwgd2hhdCdzIG5leHQgaXMgdGhlIHZhbHVlICovDQotPFNUX1hNTF9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotLyogYWxsb3cgZm9yIHVuYmFsYW5jZWQgcXVvdGVzLCBtb3N0bHkgYSBkdXBsaWNhdGUgb2YgdGhlIEF0dFZhbHVlIHJ1bGUgKi8NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge0F0dFZhbHVlfSB8IChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotDQotDQotLyogdGhlIHRhZydzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7DQotICAgICAgICAJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCX0NCi0JZWxzZQ0KLSAgICAgICAgCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0NMT1NFOw0KLX0NCi0vKiB0aGUgdGFnJ3MgY2xvc2Ugd2FzIGZvdW5kLCBidXQgdGhlIHRhZyBkb2Vzbid0IG5lZWQgYSBtYXRjaGluZyBlbmQgdGFnICovDQotPFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY0VtcHR5VGFnQ2xvc2V9IHsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotICAgICAgICByZXR1cm4gWE1MX0VNUFRZX1RBR19DTE9TRTsNCi19DQotDQotPFNUX1hNTF9UQUdfTkFNRT4gW148Lz5cdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNcdTRFMDAtXHU5RkE1XHUzMDA3XHUzMDIxLVx1MzAyOV0qIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJpbmFwcHJvcHJpYXRlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7DQotfQ0KLQ0KLS8vIEVORCBSRUdVTEFSIFhNTA0KLQ0KLQ0KLS8vIFhNTCBDb21tZW50cw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9YTUxfREVDTEFSQVRJT04+IHtDb21tZW50U3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOw0KLQlyZXR1cm4gWE1MX0NPTU1FTlRfT1BFTjsNCi19DQotPFNUX1hNTF9DT01NRU5UPiAufFxyfFxuIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsNCi19DQotDQotPFNUX1hNTF9DT01NRU5UX0VORD4ge0NvbW1lbnRFbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBtaXNjDQotDQote0NEU3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7DQotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsNCi19DQotPFNUX0NEQVRBX1RFWFQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkDQotCVN0cmluZyBibG9ja0NvbnRleHQgPSBkb0Jsb2NrU2NhbigiXV0+IiwgWE1MX0NEQVRBX1RFWFQsIFNUX0NEQVRBX0VORCk7Ly8kTk9OLU5MUy0xJA0KLQlpZihibG9ja0NvbnRleHQgPT0gWE1MX0NEQVRBX1RFWFQpDQotCQl5eWJlZ2luKFNUX0NEQVRBX0VORCk7DQotCXJldHVybiBibG9ja0NvbnRleHQ7DQotfQ0KLTxTVF9DREFUQV9FTkQ+IHtDREVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkNEQVRBIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBYTUxfQ0RBVEFfQ0xPU0U7DQotfQ0KLQ0KLTxZWUlOSVRJQUw+IHtQRVJlZmVyZW5jZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuUEVSZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOw0KLX0NCi08WVlJTklUSUFMPiB7Q2hhclJlZn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9DSEFSX1JFRkVSRU5DRTsNCi19DQotPFlZSU5JVElBTD4ge0VudGl0eVJlZn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuRW50aXR5UmVmIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7DQotfQ0KLQ0KLTxZWUlOSVRJQUw+IHtQSXN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5wcm9jZXNzaW5nIGluc3RydWN0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1BJKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfT1BFTjsNCi19DQotLy8gdGhlIG5leHQgZm91ciBhcmUgb3JkZXIgZGVwZW5kZW50DQotPFNUX1BJPiAoKFh8eCkoTXxtKShMfGwpKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotPFNUX1BJPiAoW2lJXVttTV1bcFBdW29PXVtyUl1bdFRde1N9Kikgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUEk+IHhtbC1zdHlsZXNoZWV0IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYU0wgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUEk+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QSV9XUz4ge1N9KyB7DQotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOw0KLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi08U1RfUEksIFNUX1BJX1dTPiBcPz4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotPFNUX1BJX0NPTlRFTlQ+IC4gew0KLQkvLyBibG9jayBzY2FuIHVudGlsIGNsb3NlIGlzIGZvdW5kDQotCXJldHVybiBkb1NjYW4oIj8+IiwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsNCi19DQotPFNUX1BJX0NPTlRFTlQsU1RfWE1MX1BJX1RBR19DTE9TRT4gXD8+IHsNCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLTxTVF9YTUxfUElfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9QSV9FUVVBTFM+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9FUVVBTFMpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotfQ0KLTxTVF9YTUxfUElfRVFVQUxTPiB7RXF9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHwgKFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIHRoZSBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9YTUxfUElfRVFVQUxTLCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtQSWVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLS8vIERIVE1MDQotPFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9FUVVBTFM+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfREhUTUxfRVFVQUxTPiB7RXF9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7DQotfQ0KLS8qIHRoZSB2YWx1ZSB3YXMgZm91bmQsIGxvb2sgZm9yIHRoZSBuZXh0IG5hbWUgKi8NCi08U1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHwgKFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLX0NCi0vKiBUaGUgREhUTUwgUEkncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfREhUTUxfRVFVQUxTLCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSwgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFPiBbL10qPiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0NCi0vLyBYTUwgZGVjbGFyYXRpb25zDQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0hIHsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0VlXVtMbF1bRWVdW01tXVtFZV1bTm5dW1R0XSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0RkXVtPb11bQ2NdW1R0XVtZeV1bUHBdW0VlXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsNCi19DQotPFNUX1hNTF9ERUNMQVJBVElPTj4gW0FhXVtUdF1bVHRdW0xsXVtJaV1bU3NdW1R0XSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7DQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsNCi19DQotDQotLy8gYmVnaW4gRE9DVFlQRSBoYW5kbGluZyBwcm9jZWR1cmUNCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFPiBcW1teXF1dKlxdIHsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsNCi19DQotDQotPFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgdHlwZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IFtQcF1bVXVdW0JiXVtMbF1bSWldW0NjXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQ+IFtTc11bWXldW1NzXVtUdF1bRWVdW01tXSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOw0KLX0NCi08U1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9fChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBwdWJsaWMgcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0+IHtBdHRWYWx1ZX18e1N5c3RlbUxpdGVyYWx9fChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7DQotfQ0KLS8vIGVuZCBET0NUWVBFIGhhbmRsaW5nDQotDQotLy8gYmVnaW4gRUxFTUVOVCBoYW5kbGluZyBwcm9jZWR1cmUNCi08U1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04+IHtBdHRWYWx1ZX18e1B1YmlkTGl0ZXJhbH18KFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOw0KLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOw0KLX0NCi08U1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVD4gW14+XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOw0KLX0NCi0NCi08U1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIEVMRU1FTlQgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBBVFRMSVNUIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfXwoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRTsNCi19DQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQ+IFtePl0qIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOw0KLX0NCi0NCi08U1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dGxpc3QgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgQVRUTElTVCBoYW5kbGluZw0KLQ0KLTxTVF9YTUxfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCwgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04sIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UsIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7DQotfQ0KLS8vIGVuZCBERUNMQVJBVElPTiBoYW5kbGluZw0KLQ0KLTxZWUlOSVRJQUw+IFtePCYlXSp8WyYlXXtTfSt7TmFtZX1bXiYlPF0qfFsmJV17TmFtZX0oW147JiU8XSp8e1N9KzsqKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9DT05URU5UOw0KLX0NCi0NCi0NCi08U1RfQkxPQ0tfVEFHX1NDQU4+IC58XHJ8XG4gew0KLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7DQotCX0NCi0NCi0uIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIhISF1bmV4cGVjdGVkISEhOiBcIiIgKyB5eXRleHQoKSArICJcIjoiICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQNCi0JCQl5eWNoYXIgKyAiLSIgKyAoeXljaGFyICsgeXlsZW5ndGgoKSkpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFVOREVGSU5FRDsNCi19DQotDQotXDA0MCB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiU1BBQ0UiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxMSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiMHg5Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTUgDQotew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkNBUlJJQUdFIFJFVFVSTiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDEyIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4LmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZTgxMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQGVjaG8gb2ZmDQotY21kIC9jIGZsZXh4LmNtZA0KLWNtZCAvYyBmbGV4ai5jbWQNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguc2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjZlM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIS9iaW4vc2gNCi1leHBvcnQgUEFUSD0kUEFUSDovb3B0L0lCTUphdmEyLTEzMS9iaW4vOi9vcHQvSUJNSmF2YTItMTMvYmluLzovb3B0L2pkazEuNA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgSkZsZXgvbGliL3NlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluIEpTUFRva2VuaXplci5qZmxleCAtc2tlbCBza2VsZXRvbi5zc2UNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwIEpGbGV4L2xpYi9zZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiBYTUxUb2tlbml6ZXIuamZsZXggLXNrZWwgc2tlbGV0b24uc3NlDQotcm0gLWYgSlNQVG9rZW5pemVyLmphdmF+IEpTUFRva2VuaXplcn4gWE1MVG9rZW5pemVyLmphdmF+IFhNTFRva2VuaXplcn4NCi1jcCAtdiBYTUxUb2tlbml6ZXIuamF2YSAuLi8uLi8uLi8uLi9zZWRtb2RlbC9jb20vaWJtL3NlZC9wYXJzZXIvaW50ZXJuYWwNCi1jcCAtdiBKU1BUb2tlbml6ZXIuamF2YSAuLi8uLi8uLi8uLi9zZWRtb2RlbC9jb20vaWJtL3NlZC9wYXJzZXIvaW50ZXJuYWwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXhqLmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleGouY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDEwZTM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleGouY21kCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1AZWNobyBvZmYNCi1QQVRIPSVQQVRIJTtkOlxqZGs2XzAxXGJpbg0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgZDpcSkZsZXhcMS4yLjJcbGliXEpGbGV4LmphcjsuIEpGbGV4Lk1haW4gSlNQVG9rZW5pemVyLmpmbGV4IC1za2VsIHNrZWxldG9uLnNzZSAmJiBybSAtZiBKU1BUb2tlbml6ZXIuamF2YX4gSlNQVG9rZW5pemVyfiAmJiBjb3B5IEpTUFRva2VuaXplci5qYXZhIC4uXC4uXC4uXC4uXC4uXG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZVxzcmNcb3JnXGVjbGlwc2VcanN0XGpzcFxjb3JlXGludGVybmFsXHBhcnNlclxcaW50ZXJuYWxcSlNQVG9rZW5pemVyLmphdmENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXh4LmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleHguY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2IxZjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleHguY21kCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1AZWNobyBvZmYNCi1QQVRIPSVQQVRIJTtjOlxqZGsxLjQuMl8wOFxiaW4NCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwIGQ6XEpGbGV4XDEuMi4yXGxpYlxKRmxleC5qYXI7LiBKRmxleC5NYWluIFhNTFRva2VuaXplci5qZmxleCAtc2tlbCBza2VsZXRvbi5zc2UgJiYgcm0gLWYgWE1MVG9rZW5pemVyLmphdmF+IFhNTFRva2VuaXplcn4gJiYgY29weSBYTUxUb2tlbml6ZXIuamF2YSAuLlwuLlwuLlwuLlwuLlxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmVcc3JjXG9yZ1xlY2xpcHNlXHdzdFx4bWxcY29yZVxpbnRlcm5hbFxwYXJzZXJcWE1MVG9rZW5pemVyLmphdmENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmI3NjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLQ0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovDQotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOw0KLQ0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovDQotLS0tICBsZXhpY2FsIHN0YXRlcywgY2hhcm1hcA0KLQ0KLSAgLyogZXJyb3IgY29kZXMgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsNCi0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7DQotDQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovDQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7DQotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkDQotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkDQotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkDQotICB9Ow0KLQ0KLS0tLSBpc0ZpbmFsIGxpc3QNCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICBwcml2YXRlIGludCB5eV9zdGF0ZTsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7DQotDQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7DQotDQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAgICAgZnJvbSBpbnB1dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsNCi0NCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5bGluZTsNCi0NCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsNCi0NCi0gIC8qKg0KLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIA0KLSAgICogbWF0Y2hlZCB0ZXh0DQotICAgKi8NCi0gIC8vIHByaXZhdGUgaW50IHl5Y29sdW1uOyANCi0NCi0gIC8qKiANCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQ0KLSAgICovDQotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7DQotDQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOw0KLQ0KLS0tLSB1c2VyIGNsYXNzIGNvZGUNCi0NCi0gIC8qKg0KLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyDQotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuDQotICAgKg0KLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uDQotICAgKi8NCi0tLS0gY29uc3RydWN0b3IgZGVjbGFyYXRpb24NCi0NCi0NCi0gIC8qKg0KLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlDQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCi0NCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLw0KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0NCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyANCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7DQotDQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLw0KLQ0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLw0KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgew0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsNCi0NCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLw0KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfc3RhcnRSZWFkID0gMDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8NCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsNCi0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7DQotICAgIH0NCi0NCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovDQotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7DQotDQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsNCi0NCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7DQotDQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0gIH0NCi0NCi0gICAgDQotICAvKioNCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8NCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovDQotICAgIHl5X3JlYWRlci5jbG9zZSgpOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsNCi0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7DQotICB9DQotDQotICAvKioNCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKg0KLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQ0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgew0KLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgew0KLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgew0KLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24NCi0gICAqDQotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQ0KLSAgICovDQotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsNCi0gICAgdHJ5IHsNCi0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOw0KLSAgICB9DQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLSAgICB9DQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcg0KLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsNCi0gIH0gDQotDQotDQotICAvKioNCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICoNCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QNCi0gICAqDQotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4NCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQ0KLSAgICovDQotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgew0KLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQ0KLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsNCi0NCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsNCi0gIH0NCi0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkDQotCSAqLw0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7DQotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgew0KLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsNCi0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsNCi0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOw0KLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgew0KLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7DQotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkNCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7DQotCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkNCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJaWYobWF0Y2hlc1NvRmFyKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZA0KLQkgKg0KLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0DQotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgew0KLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsNCi0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgew0KLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsNCi0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsNCi0JCQkJfQ0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsNCi0JCQl9DQotCQl9DQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsNCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJA0KLQkJCXRocm93IGU7DQotCQl9DQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCANCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuDQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gdG9rZW5zOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJA0KLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7DQotCQlyZXR1cm4geXlfYXRFT0Y7DQotCX0NCi0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLw0KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgew0KLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOw0KLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7DQotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpDQotCQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS0tLSB5eV9kb0VvZg0KLSAgLyoqDQotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLA0KLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbg0KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3Vycw0KLSAgICovDQotLS0tIHl5bGV4IGRlY2xhcmF0aW9uDQotICAgIGludCB5eV9pbnB1dDsNCi0gICAgaW50IHl5X2FjdGlvbjsNCi0NCi0tLS0gbG9jYWwgZGVjbGFyYXRpb25zDQotDQotICAgIHdoaWxlICh0cnVlKSB7DQotDQotLS0tIHN0YXJ0IGFkbWluIChsaW5lLCBjaGFyLCBjb2wgY291bnQpDQotICAgICAgeXlfYWN0aW9uID0gLTE7DQotDQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsNCi0NCi0tLS0gc3RhcnQgYWRtaW4gKGxleHN0YXRlIGV0YykNCi0NCi0gICAgICB5eV9mb3JBY3Rpb246IHsNCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgIA0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsNCi0NCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsNCi0NCi0tLS0gbGluZSwgY29sLCBjaGFyIGNvdW50LCBuZXh0IHRyYW5zaXRpb24sIGlzRmluYWwgYWN0aW9uDQotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IA0KLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IA0KLS0tLSBsaW5lIGNvdW50IHVwZGF0ZQ0KLSAgICAgICAgICB9DQotDQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLS0tLSBjaGFyIGNvdW50IHVwZGF0ZQ0KLQ0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIA0KLQ0KLS0tLSBhY3Rpb25zDQotICAgICAgICBkZWZhdWx0OiANCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7DQotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOw0KLS0tLSBlb2Z2YWx1ZQ0KLSAgICAgICAgICB9IA0KLSAgICAgICAgICBlbHNlIHsNCi0tLS0gbm8gbWF0Y2gNCi0gICAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfSAgICANCi0NCi0tLS0gbWFpbg0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZS5yZWFkbWUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZS5yZWFkbWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODk3MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9za2VsZXRvbi5zc2UucmVhZG1lCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1UaGUgc2tlbGV0b24uc2VkIGZpbGUgY29udGFpbnMgdGhlIG1vZGlmaWVkIEpGbGV4IDEuMi4yIHNrZWxldG9uIGZpbGUgd2l0aA0KLWNoYW5nZXMgZm9yIHVzZSB3aXRoIHRoZSB0b2tlbml6ZXJzIHdpdGhpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbCBhbmQNCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuanNwIHBsdWdpbnMuDQotDQotVGhlIHNrZWxldG9uIGZpbGUncyBtZXRob2QgZGVmaW5pdGlvbnMgYXJlIGNvcGllZCBpbnRvIHRoZSBnZW5lcmF0ZWQgb3V0cHV0DQotZGlyZWN0bHkuDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQ4M2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IkNTU1Rva2VuaXplciI+Ci0JPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmtzcGFjZS5kaXIiIHZhbHVlPSIuLi8uLiIvPgotCQk8cHJvcGVydHkgbmFtZT0iamZsZXguamFyIiB2YWx1ZT0iL0RldlRpbWVTdXBwb3J0L0pGbGV4L2xpYi9zZWQtamZsZXguamFyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJqZmxleC5tYXhtZW1vcnkiIHZhbHVlPSI0NzAwMDAwMDAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImpmbGV4Lm9wdCIgdmFsdWU9Ii1za2VsIFNlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iQ1NTVG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJTZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iQ1NTVG9rZW5pemVyLmpmbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3Mvc3JjL2NvbS9pYm0vc3NlL21vZGVsL2Nzcy9pbnRlcm5hbC9wYXJzZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZpbmFsZGVzdC5kaXIiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC10b2tlbml6ZXIiPgotCQkJPHBhcmFtIG5hbWU9ImpmbGV4Lm9wdCIgdmFsdWU9IiIvPgotCQk8L2FudGNhbGw+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IlhNTFRva2VuaXplciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbCIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUxUb2tlbml6ZXIiLz4JCQkKLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbC9zcmMvY29tL2libS9zc2UvbW9kZWwveG1sL2ludGVybmFsL3BhcnNlciIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkLXRva2VuaXplciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJKU1BUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IlNlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iSlNQVG9rZW5pemVyLmpmbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5qc3Avc3JjL2NvbS9pYm0vc3NlL21vZGVsL2pzcC9wYXJzZXIvaW50ZXJuYWwiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC10b2tlbml6ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQtdG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJydW4tamZsZXgiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjb3B5Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY2xlYW4iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnVuLWpmbGV4IiBkZXBlbmRzPSJpbml0Ij4KLQkJPGphdmEgY2xhc3NuYW1lPSJKRmxleC5NYWluIiBtYXhtZW1vcnk9IiR7amZsZXgubWF4bWVtb3J5fSIgZm9yaz0ieWVzIiA+Ci0JCQk8YXJnIGxpbmU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0gJHtqZmxleC5vcHR9Ii8+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqZmxleC5qYXJ9Ii8+Ci0JCQk8L2NsYXNzcGF0aD4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY29weSIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxjb3B5IHRvZGlyPSIke3dvcmtzcGFjZS5kaXJ9LyR7ZGVzdC5kaXJ9IiBvdmVyd3JpdGU9InRydWUiIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphdmEiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9jb3B5PgotCQk8Y29weSB0b2Rpcj0iJHt3b3Jrc3BhY2UuZGlyfS8ke2ZpbmFsZGVzdC5kaXJ9IiBvdmVyd3JpdGU9InRydWUiIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphdmEiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9jb3B5PgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBkZWZhdWx0ZXhjbHVkZXM9Im5vIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqfiIvPgotCQkJPC9maWxlc2V0PgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQkKLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2RldlRpbWVTdXBwb3J0SW5mby50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9kZXZUaW1lU3VwcG9ydEluZm8udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQ3YWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2RldlRpbWVTdXBwb3J0SW5mby50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0KLQotVGhpcyBkaXJlY3RvcnksIERldlRpbWVTdXBwb3J0LCBub3JtYWxseSBjb250YWlucwotdGhlIHNvdXJjZSBmb3Igc29tZSBvZiBvdXIgcGFyc2VyIGdlbmVyYXRvcnMuIAotCi1TZWUgd3N0L2NvbXBvbmVudHMvc3NlL3BsdWdpbnMvCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmVcRGV2VGltZVN1cHBvcnQKLQotVGhpcyBwYXJ0aWN1bGFyIHRleHQgZmlsZSB5b3UgYXJlIHJlYWRpbmcgCi1pcyB0aGUgb25seSBvbmUgc2hpcHBlZCAKLXdpdGggYW4gU0RLIGJ1aWxkLCBzaW5jZSB0aGUgb3RoZXIgZmlsZXMgCi1hcmUgc2VsZG9tIG5lZWRlZCBkdXJpbmcgZGV2ZWxvcG1lbnQgb3IgZGVidWdnaW5nLCAKLWFuZCBzb21lIG9mIHRob3NlIGZpbGVzIGNhdXNlIHByb2JsZW1zIHdpdGggbG9uZyAKLWZpbGVuYW1lIG9yIHBhdGhzIHRoYXQgZW5kIHVwIGJlaW5nIHRvbyBsb25nIGZvciAKLXNvbWUgcGxhdGZvcm1zLCBhbmQgc29tZSB1bnppcCBwcm9ncmFtcy4gCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OWVhNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuNDAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscywKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTtleGNsdWRlOj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3BlcnR5dGVzdGVyIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9SRUFETUUudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViM2NjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGUgY29yZSBtb2RlbCBvZiB0aGUgc3NlIGZyYW1ld29yay4gSXQgcHJvdmlkZXMgdGhlIGJhc2UgZG9jdW1lbnQgY2xhc3NlcywKLWJ1aWxkZXJzIGFuZCBwYXJzZXJzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU0MWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMtZW5jb2RpbmcvLFwKLSAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgIHNyYy10YXNrdGFncy8sXAotICAgICAgICAgICBzcmMtY29udGVudHByb3BlcnRpZXMvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgZG9jLyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIERldlRpbWVTdXBwb3J0Lwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuZXhjbHVkZXMgPSBEZXZUaW1lU3VwcG9ydC9idWlsZC54bWwsXAotICAgICAgICAgICAgICAgRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvLFwKLSAgICAgICAgICAgICAgIERldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZTIyM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UiPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9zc2Uvb3ZlcnZpZXcuaHRtbCI+PC9kZXNjcmlwdGlvbj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVByb3BlcnR5U291cmNlRXh0ZW5zaW9uIiBpbXBsZW1lbnQ9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dEVkaXRvciIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvY2hhcnNldC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL2NoYXJzZXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0YTA3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvY2hhcnNldC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISB0aGUgbnVtYmVyIG9mIGNvZGVzZXQgbmFtZXMKLXRvdGFsbnVtYmVyPTI1Ci0KLSEgT25seSB0cmFuc2xhdGUgdGhlIHh4LmxhYmVsIHN0cmluZ3MuICBEbyBub3QgdHJhbnNsYXRlIHRoZSB4eC5pYW5hIG9yIHh4LmphdmEgc3RyaW5ncy4KLQotY29kZXNldC4wLmxhYmVsPUlTTyAxMDY0Ni9Vbmljb2RlKFVURi04KQotY29kZXNldC4wLmlhbmE9VVRGLTgKLQotY29kZXNldC4xLmxhYmVsPUlTTyAxMDY0Ni9Vbmljb2RlKFVURi0xNikgQmlnIEVuZGlhbgotY29kZXNldC4xLmlhbmE9VVRGLTE2Ci0KLWNvZGVzZXQuMi5sYWJlbD1JU08gMTA2NDYvVW5pY29kZShVVEYtMTZCRSkgQmlnIEVuZGlhbgotY29kZXNldC4yLmlhbmE9VVRGLTE2QkUKLQotY29kZXNldC4zLmxhYmVsPUlTTyAxMDY0Ni9Vbmljb2RlKFVURi0xNkxFKSBMaXR0bGUgRW5kaWFuCi1jb2Rlc2V0LjMuaWFuYT1VVEYtMTZMRQotCi1jb2Rlc2V0LjQubGFiZWw9VVMgQVNDSUkKLWNvZGVzZXQuNC5pYW5hPVVTLUFTQ0lJCi0KLWNvZGVzZXQuNS5sYWJlbD1JU08gTGF0aW4tMQotY29kZXNldC41LmlhbmE9SVNPLTg4NTktMQotCi0hIChTbGF2aWM6IEN6ZWNoLCBDcm9hdCwgR2VybWFuLCBIdW5nYXJpYW4sIFBvbGlzaCwgUm9tYW5pYW4sIFNsb3ZhaywgU2xvdmVuaWFuKQotY29kZXNldC42LmxhYmVsPUNlbnRyYWwvRWFzdCBFdXJvcGVhbiAoU2xhdmljKSAKLWNvZGVzZXQuNi5pYW5hPUlTTy04ODU5LTIKLQotISAoRXNwZXJhbnRvLCBHYWxpY2lhbiwgTWFsdGVzZSwgVHVya2lzaCkKLWNvZGVzZXQuNy5sYWJlbD1Tb3V0aGVybiBFdXJvcGVhbgotY29kZXNldC43LmlhbmE9SVNPLTg4NTktMwotCi1jb2Rlc2V0LjgubGFiZWw9QXJhYmljLCBMb2dpY2FsCi1jb2Rlc2V0LjguaWFuYT1JU08tODg1OS02Ci0KLWNvZGVzZXQuOS5sYWJlbD1BcmFiaWMKLWNvZGVzZXQuOS5pYW5hPXdpbmRvd3MtMTI1NgotCi1jb2Rlc2V0LjEwLmxhYmVsPUNoaW5lc2UsIE5hdGlvbmFsIFN0YW5kYXJkCi1jb2Rlc2V0LjEwLmlhbmE9R0IxODAzMAotCi1jb2Rlc2V0LjExLmxhYmVsPVRyYWRpdGlvbmFsIENoaW5lc2UsIEJpZzUKLWNvZGVzZXQuMTEuaWFuYT1CSUc1Ci0KLSEgKEVzdG9uaWFuLCBMYXR2aWFuLCBMaXRodWFuaWFuKQotY29kZXNldC4xMi5sYWJlbD1DeXJpbGxpYywgSVNPLTg4NTktNAotY29kZXNldC4xMi5pYW5hPUlTTy04ODU5LTQKLQotISAoQnVsZ2FyaWFuLCBCeWVsb3J1c3NpYW4sIE1hY2Vkb25pYW4sIFNlcmJpYW4sIFVrcmFpbmlhbikKLWNvZGVzZXQuMTMubGFiZWw9Q3lyaWxsaWMsIElTTy04ODU5LTUKLWNvZGVzZXQuMTMuaWFuYT1JU08tODg1OS01Ci0KLWNvZGVzZXQuMTQubGFiZWw9R3JlZWsKLWNvZGVzZXQuMTQuaWFuYT1JU08tODg1OS03Ci0KLWNvZGVzZXQuMTUubGFiZWw9SGVicmV3LCBWaXN1YWwKLWNvZGVzZXQuMTUuaWFuYT1JU08tODg1OS04Ci0KLSEgbGFiZWw9SGVicmV3LCBMb2dpY2FsCi0hIGlhbmE9SVNPLTg4NTktOC1JCi0KLWNvZGVzZXQuMTYubGFiZWw9SGVicmV3Ci1jb2Rlc2V0LjE2LmlhbmE9d2luZG93cy0xMjU1Ci0KLWNvZGVzZXQuMTcubGFiZWw9SmFwYW5lc2UsIEVVQy1KUAotY29kZXNldC4xNy5pYW5hPUVVQy1KUAotCi1jb2Rlc2V0LjE4LmxhYmVsPUphcGFuZXNlLCBJU08gMjAyMgotY29kZXNldC4xOC5pYW5hPUlTTy0yMDIyLUpQCi0KLWNvZGVzZXQuMTkubGFiZWw9SmFwYW5lc2UsIFNoaWZ0LUpJUwotY29kZXNldC4xOS5pYW5hPVNoaWZ0X0pJUwotCi1jb2Rlc2V0LjIwLmxhYmVsPUphcGFuZXNlLCBXaW5kb3dzLTMxSgotY29kZXNldC4yMC5pYW5hPXdpbmRvd3MtMzFqCi0KLWNvZGVzZXQuMjEubGFiZWw9S29yZWFuLCBFVUMtS1IKLWNvZGVzZXQuMjEuaWFuYT1FVUMtS1IKLQotY29kZXNldC4yMi5sYWJlbD1Lb3JlYW4sIElTTyAyMDIyCi1jb2Rlc2V0LjIyLmlhbmE9SVNPLTIwMjItS1IKLQotY29kZXNldC4yMy5sYWJlbD1UaGFpLCBUSVNJCi1jb2Rlc2V0LjIzLmlhbmE9VElTLTYyMAotCi1jb2Rlc2V0LjI0LmxhYmVsPVR1cmtpc2gKLWNvZGVzZXQuMjQuaWFuYT1JU08tODg1OS05CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvZGVmYXVsdElBTkEucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9kZWZhdWx0SUFOQS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDdlZDZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9kZWZhdWx0SUFOQS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGlzIGZpbGUgbGlzdHMgY2hhcnNldCBtYXBwaW5ncyBiZXR3ZWVuIGFuIGVuY29kaW5nIGFuZCBpdHMgZGVmYXVsdAotIyBlcXVpdmFsZW50IGVuY29kaW5nIGxpc3RlZCBpbiBjaGFyc2V0LnByb3BlcnRpZXMKLSMgZm9ybWF0OiBhbnluYW1lPWlhbmEgbmFtZSBsaXN0ZWQgaW4gY2hhcnNldC5wcm9wZXJ0aWVzCi0KLSMgTm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5Ci13aW5kb3dzLTEyNTI9SVNPLTg4NTktMQotd2luZG93cy05MzI9U2hpZnRfSklTCi14LWV1Yy1qcC1saW51eD1FVUMtSlAgCi13aW5kb3dzLTk0OT1FVUMtS1IKLXgtd2luZG93cy05NDk9RVVDLUtSCi13aW5kb3dzLTk1MD1CSUc1Ci14LXdpbmRvd3MtOTUwPUJJRzUKLXdpbmRvd3MtOTM2PUdCMTgwMzAKLXgtbXN3aW4tOTM2PUdCMTgwMzAKLUdCMjMxMj1HQjE4MDMwCi14LUVVQy1DTj1HQjE4MDMwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvb3ZlcnJpZGUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9vdmVycmlkZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTcwM2JhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9vdmVycmlkZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBmaWxlIGxpc3RzIGNoYXJzZXQgbWFwcGluZ3Mgd2hpY2ggc3VwcGxlbWVudCBvciBvdmVycmlkZSB0aG9zZQotIyBwcm92aWRlZCBieSB0aGUgVk0uIFRoZXJlIGFyZSBmZXcgY2FzZXMgd2hlcmUgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQuCi0jIE5vdGU6IHRoZXJlIGlzIG5vIGludGVncmV0eSBjaGVja2luZyB0byBzZWUgaWYgdGhlIHZhbGlkQ2hhcnNldE5hbWUgaXMgaW5kZWVkCi0jIHZhbGlkIGZvciBhIGdpdmVuIFZNLCBzbyBlcnJvcnMgd291bGQgb25seSBzaG93IHVwIHdoZW4gYXR0ZW1wdGVkIHRvIAotIyBiZSB1c2VkLgotCi0jIE5vIHRyYW5zbGF0aW9uIG5lY2Vzc2FyeQotCi0jIGZvcm1hdDogYW55bmFtZT12YWxpZGphdmFDaGFyc2V0TmFtZQotSVNPLTg4NTktOC1JPUlTTy04ODU5LTgKLVgtU0pJUz1TaGlmdF9KSVMKLVgtRVVDLUpQPVNoaWZ0X0pJUwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2Jvb2suY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mjc4Y2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvYy9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi1QLkNvZGUgew0KLQlkaXNwbGF5OiBibG9jazsNCi0JdGV4dC1hbGlnbjogbGVmdDsNCi0JdGV4dC1pbmRlbnQ6IDAuMDBwdDsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMTVwdDsNCi0JZm9udC1zaXplOiAxMC4wMDAwMDBwdDsNCi0JZm9udC13ZWlnaHQ6IG1lZGl1bTsNCi0JZm9udC1zdHlsZTogUmVndWxhcjsNCi0JY29sb3I6ICM0NDQ0Q0M7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyI7DQotfQ0KLUg2LkNhcHRpb25GaWdDb2x1bW4gew0KLQlkaXNwbGF5OiBibG9jazsNCi0JdGV4dC1hbGlnbjogbGVmdDsNCi0JdGV4dC1pbmRlbnQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi10b3A6IDMuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0Ow0KLQlmb250LXNpemU6IDkuMDAwMDAwcHQ7DQotCWZvbnQtd2VpZ2h0OiBtZWRpdW07DQotCWZvbnQtc3R5bGU6IEl0YWxpYzsNCi0JY29sb3I6ICMwMDAwMDA7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6ICJBcmlhbCI7DQotfQ0KLVAuTm90ZSB7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQl0ZXh0LWFsaWduOiBsZWZ0Ow0KLQl0ZXh0LWluZGVudDogMHB0Ow0KLQltYXJnaW4tdG9wOiAxOS41MDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMTkuNTAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDMwcHQ7DQotCWZvbnQtc2l6ZTogMTEuMDAwMDAwcHQ7DQotCWZvbnQtd2VpZ2h0OiBtZWRpdW07DQotCWZvbnQtc3R5bGU6IEl0YWxpYzsNCi0JY29sb3I6ICMwMDAwMDA7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6ICJBcmlhbCI7DQotfQ0KLUVNLlVJTGFiZWwgew0KLQlmb250LXdlaWdodDogQm9sZDsNCi0JZm9udC1zdHlsZTogUmVndWxhcjsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLX0NCi1FTS5Db2RlTmFtZSB7DQotCWZvbnQtd2VpZ2h0OiBCb2xkOw0KLQlmb250LXN0eWxlOiBSZWd1bGFyOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7DQotfQ0KLQ0KLQ0KLQ0KLQ0KLS8qIGZvbGxvd2luZyBmb250IGZhY2UgZGVjbGFyYXRpb25zIG5lZWQgdG8gYmUgcmVtb3ZlZCBmb3IgREJDUyAqLw0KLQ0KLWJvZHksIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIHRhYmxlLCB0ZCwgY2FwdGlvbiwgdGgsIHVsLCBvbCwgZGwsIGxpLCBkZCwgZHQge2ZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjogIzAwMDAwMH0NCi1wcmUJCQkJeyBmb250LWZhbWlseTogQ291cmllciwgbW9ub3NwYWNlfQ0KLQ0KLS8qIGVuZCBmb250IGZhY2UgZGVjbGFyYXRpb25zICovDQotDQotLyogZm9sbG93aW5nIGZvbnQgc2l6ZSBkZWNsYXJhdGlvbnMgc2hvdWxkIGJlIE9LIGZvciBEQkNTICovDQotYm9keSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgdGFibGUsIHRkLCBjYXB0aW9uLCB0aCwgdWwsIG9sLCBkbCwgbGksIGRkLCBkdCB7Zm9udC1zaXplOiAxMHB0OyB9DQotcHJlCQkJCXsgZm9udC1zaXplOiAxMHB0fQ0KLQ0KLS8qIGVuZCBmb250IHNpemUgZGVjbGFyYXRpb25zICovDQotDQotYm9keQkgICAgIHsgYmFja2dyb3VuZDogI0ZGRkZGRn0NCi1oMSAgICAgICAgICAgeyBmb250LXNpemU6IDE4cHQ7IG1hcmdpbi10b3A6IDU7IG1hcmdpbi1ib3R0b206IDEgfQkNCi1oMiAgICAgICAgICAgeyBmb250LXNpemU6IDE0cHQ7IG1hcmdpbi10b3A6IDI1OyBtYXJnaW4tYm90dG9tOiAzIH0NCi1oMyAgICAgICAgICAgeyBmb250LXNpemU6IDExcHQ7IG1hcmdpbi10b3A6IDIwOyBtYXJnaW4tYm90dG9tOiAzIH0NCi1oNCAgICAgICAgICAgeyBmb250LXNpemU6IDEwcHQ7IG1hcmdpbi10b3A6IDIwOyBtYXJnaW4tYm90dG9tOiAzOyBmb250LXN0eWxlOiBpdGFsaWMgfQ0KLXAgICAgICAgICAgICB7IG1hcmdpbi10b3A6IDEwcHg7IG1hcmdpbi1ib3R0b206IDEwcHggfQ0KLXByZQkgICAgIHsgbWFyZ2luLWxlZnQ6IDY7IGZvbnQtc2l6ZTogOXB0IH0NCi1hOmxpbmsJICAgICB7IGNvbG9yOiAjMDAwMEZGIH0NCi1hOmhvdmVyCSAgICAgeyBjb2xvcjogIzAwMDA4MCB9DQotYTp2aXNpdGVkICAgIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgfQ0KLXVsCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9DQotbGkJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfSANCi1saSBwCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0gDQotb2wJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDEwIH0NCi1kbAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMTAgfQ0KLWR0CSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwOyBmb250LXdlaWdodDogYm9sZCB9DQotZGQJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfQ0KLXN0cm9uZwkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGR9DQotZW0JICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30NCi12YXIJICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpY30NCi1kaXYucmV2aXNpb24geyBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7IGJvcmRlci1sZWZ0LXdpZHRoOiB0aGluOyANCi0JCQkJICAgYm9yZGVyLWxlZnQtY29sb3I6ICM3QjY4RUU7IHBhZGRpbmctbGVmdDo1IH0NCi10aAkgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvYy9zY2hlbWEuY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL3NjaGVtYS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZmJmMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL3NjaGVtYS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1INi5DYXB0aW9uRmlnQ29sdW1uI2hlYWRlciB7DQotCWZvbnQtc2l6ZToxNnB4OyANCi0JZGlzcGxheTppbmxpbmUNCi19DQotDQotUC5Ob3RlI2NvcHlyaWdodCB7DQotCWZvbnQtc2l6ZTogc21hbGxlcjsgDQotCWZvbnQtc3R5bGU6IG5vcm1hbDsNCi0JY29sb3I6ICMzMzY2OTk7IA0KLQlkaXNwbGF5OmlubGluZTsNCi0JbWFyZ2luLXRvcDogMy4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMTEuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSNkdGQgew0KLQljb2xvcjogIzgwMDAwMDsgDQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDEwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLkNvZGUjZHRkQXR0bGlzdCB7DQotCWNvbG9yOiAjODAwMDAwOyANCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMjAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSN0YWcgew0KLQljb2xvcjogIzAwMDA4MDsgDQotCWRpc3BsYXk6aW5saW5lOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAwLjAwMDAwMHB0Ow0KLX0NCi0NCi1QLkNvZGUjY3N0cmluZyB7DQotCWNvbG9yOiAjMDA4MDAwOyANCi0JZGlzcGxheTppbmxpbmU7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7CQ0KLX0NCi0NCi0uQ29uZmlnTWFya3VwI2VsZW1lbnREZXNjIHsNCi0JY29sb3I6IGJsYWNrOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAxMC4wMDAwMDBwdDsNCi19DQotDQotLkNvbmZpZ01hcmt1cCNhdHRsaXN0RGVzYyB7DQotCWNvbG9yOiBibGFjazsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMzIuMDAwMDAwcHQ7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2hhbmR5U3R1ZmYuanBhZ2UgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9oYW5keVN0dWZmLmpwYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQ3YjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2hhbmR5U3R1ZmYuanBhZ2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTFmZmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFRleHQgTW9kZWwKLSMgZXh0ZW5zaW9uIG5hbWVzCi1BZGFwdF9Pbl9DcmVhdGVfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1BZGFwdCBPbiBDcmVhdGUgRmFjdG9yeSBFeHRlbnNpb24KLURvY3VtZW50X1R5cGVzX0V4dGVuc2lvbi5uYW1lPURvY3VtZW50IFR5cGVzIEV4dGVuc2lvbgotSlNQX0VtYmVkZGVkX0NvbnRlbnRfVHlwZV9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lPUpTUCBFbWJlZGRlZCBDb250ZW50IFR5cGUgSGFuZGxlciBFeHRlbnNpb24KLUNvbnRlbnRfVHlwZV9GYWN0b3J5X0NvbnRyaWJ1dGlvbl9FeHRlbnNpb24ubmFtZT1Db250ZW50IFR5cGUgRmFjdG9yeSBDb250cmlidXRpb24gRXh0ZW5zaW9uCi1DU1NfUHJvZmlsZV9FeHRlbnNpb24ubmFtZT1DU1MgUHJvZmlsZSBFeHRlbnNpb24KLUNvbW1lbnRfRWxlbWVudF9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lPUNvbW1lbnQgRWxlbWVudCBIYW5kbGVyIEV4dGVuc2lvbgotTW9kZWxfSGFuZGxlcl9FeHRlbnNpb24ubmFtZT1Nb2RlbCBIYW5kbGVyIEV4dGVuc2lvbgotRm9ybWF0X1Byb2Nlc3NvcnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9Rm9ybWF0IFByb2Nlc3NvcnMgRXh0ZW5zaW9uIFBvaW50Ci1UYXNrX1NjYW5uZXJfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9VGFzayBTY2FubmVyIEV4dGVuc2lvbiBQb2ludAotU3RydWN0dXJlZF9Tb3VyY2VzX1Rhc2tfRXh0ZW5zaW9uLm5hbWU9RGV0ZWN0ZWQgVGFzawpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzY1MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0KLQk8IS0tIGRlcHJlY2F0ZWQgLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iYWRhcHRPbkNyZWF0ZUZhY3RvcnkiIG5hbWU9IiVBZGFwdF9Pbl9DcmVhdGVfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvYWRhcHRPbkNyZWF0ZUZhY3RvcnkuZXhzZCIvPgotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iZG9jdW1lbnRUeXBlcyIgbmFtZT0iJURvY3VtZW50X1R5cGVzX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9kb2N1bWVudFR5cGVzLmV4c2QiLz4KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImVtYmVkZGVkVHlwZUhhbmRsZXIiIG5hbWU9IiVKU1BfRW1iZWRkZWRfQ29udGVudF9UeXBlX0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2VtYmVkZGVkVHlwZUhhbmRsZXIuZXhzZCIvPgotCTwhLS0gZGVwcmVjYXRlZCAtLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24iIG5hbWU9IiVDb250ZW50X1R5cGVfRmFjdG9yeV9Db250cmlidXRpb25fRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbi5leHNkIi8+Ci0JPCEtLSBJIGNvbW1lbnRlZCBvdXQgLi4uIGNsaWVudHMgc2hvdWxkIGp1c3QgdXNlIHRoZSBub3JtYWwgcGxhdGZvcm0gd2F5IG9mIHJlZ2lzdGVyaW5nIHRoZXNlIAotCQlhZGFwdGVyRmFjdG9yaWVzLiBBdCB3b3JzdCwgdGhleSdkIG5lZWQgYSBzbWFsbCBwbHVnaW4gd2l0aCAnc3RhcnR1cCcgc3BlY2lmaWVkIC4uLiBidXQgdGhhdCdzIAotCQliZXR0ZXIgdGhhbiB1cyBnZXR0aW5nIGhpdCB3aXRoIHRoZSBwZXJmb3JtYW5jZSBpbXBhY3QgKG9mIGxvYWRpbmcgcGx1Z2lucyBhbmQgcHJlLXJlcXMsIGV0Yy4pLiAKLQkJPGV4dGVuc2lvbi1wb2ludCBpZD0idXJpUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeSIgbmFtZT0iUmVzb3VyY2UgQWRhcHRlciBGYWN0b3J5IGZvciBDcmVhdGluZyBVUklSZXNvbHZlcnMiLz4KLQktLT4KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImNzc3Byb2ZpbGUiIG5hbWU9IiVDU1NfUHJvZmlsZV9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvY3NzcHJvZmlsZS5leHNkIi8+Ci0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb21tZW50RWxlbWVudEhhbmRsZXIiIG5hbWU9IiVDb21tZW50X0VsZW1lbnRfSGFuZGxlcl9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvY29tbWVudEVsZW1lbnRIYW5kbGVyLmV4c2QiLz4KLQotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0ibW9kZWxIYW5kbGVyIiBuYW1lPSIlTW9kZWxfSGFuZGxlcl9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvbW9kZWxIYW5kbGVyLmV4c2QiLz4KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImZvcm1hdFByb2Nlc3NvcnMiCi0JCW5hbWU9IiVGb3JtYXRfUHJvY2Vzc29yc19FeHRlbnNpb25fUG9pbnQubmFtZSIKLQkJc2NoZW1hPSJzY2hlbWEvZm9ybWF0UHJvY2Vzc29ycy5leHNkIiAvPgotCi0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0YXNrc2Nhbm5lciIgbmFtZT0iJVRhc2tfU2Nhbm5lcl9FeHRlbnNpb25fUG9pbnQubmFtZSIgc2NoZW1hPSJzY2hlbWEvdGFza3NjYW5uZXIuZXhzZCIvPgotCi0JPCEtLSBNYWtlIHN1cmUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcyBhcmUgc2V0IGF0IHJ1bnRpbWUgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckdyb3VwIj4KLQkJPGdyb3VwIGlkPSJzdHJ1Y3R1cmVkTW9kZWxHcm91cCI+Ci0JCQk8bGlzdGVuZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0b3JHcm91cExpc3RlbmVyIi8+Ci0JCTwvZ3JvdXA+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBEZWZpbmUgdGhlIFN0cnVjdHVyZWRGaWxlUHJvcGVydHlUZXN0ZXIgYXMgaXQgd2lsbCBoYW5kbGUgdHJhY2luZyB0aGUgZW50aXJlIC0tPgotCTwhLS0gY29udGVudCB0eXBlIGhpZXJhcmNoeSBmb3IgYSBmaWxlLiBPbmx5IG9wZXJhdGVzIG9uIElGaWxlcyAgICAgICAgICAgICAgICAgICAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3Rlci5TdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3Rlci5TdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyIgotCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzIgotCQkJcHJvcGVydGllcz0iY29udGVudFR5cGVJZCIKLQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICA8L3Byb3BlcnR5VGVzdGVyPgotIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvYWRhcHRPbkNyZWF0ZUZhY3RvcnkuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9hZGFwdE9uQ3JlYXRlRmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGJmODk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9hZGFwdE9uQ3JlYXRlRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJhZGFwdE9uQ3JlYXRlRmFjdG9yeSIgbmFtZT0iQWRhcHQgT24gQ3JlYXRlIEZhY3RvcnkgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb21tZW50RWxlbWVudEhhbmRsZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb21tZW50RWxlbWVudEhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ0MTczNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY29tbWVudEVsZW1lbnRIYW5kbGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJjb21tZW50RWxlbWVudEhhbmRsZXIiIG5hbWU9IkNvbW1lbnQgRWxlbWVudCBIYW5kbGVyIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaGFuZGxlci1jdXN0b20iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iaGFuZGxlci1jdXN0b20iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdGFydHdpdGgiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnR0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdGFydHdpdGgiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24uZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4NDE4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImNvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbiIgbmFtZT0iQ29udGVudCBUeXBlIEZhY3RvcnkgQ29udHJpYnV0aW9uIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Nzc3Byb2ZpbGUuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jc3Nwcm9maWxlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2U4NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Nzc3Byb2ZpbGUuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImNzc3Byb2ZpbGUiIG5hbWU9IkNTUyBQcm9maWxlIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvZmlsZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9maWxlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2RvY3VtZW50VHlwZXMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9kb2N1bWVudFR5cGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MGYzNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2RvY3VtZW50VHlwZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImRvY3VtZW50VHlwZXMiIG5hbWU9IkRvY3VtZW50IFR5cGVzIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZG9jdW1lbnRUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRvY3VtZW50VHlwZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVsZW1lbnROYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlVVJJIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzWEhUTUwiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imhhc0ZyYW1lc2V0IiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwdWJsaWNJRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzeXN0ZW1JRCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0WEhUTUwiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzV01MIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0V01MIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2VtYmVkZGVkVHlwZUhhbmRsZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9lbWJlZGRlZFR5cGVIYW5kbGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiY2RlOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2VtYmVkZGVkVHlwZUhhbmRsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImVtYmVkZGVkVHlwZUhhbmRsZXIiIG5hbWU9IkpTUCBFbWJlZGRlZCBDb250ZW50IFR5cGUgSGFuZGxlciBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVtYmVkZGVkVHlwZUhhbmRsZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZW1iZWRkZWRUeXBlSGFuZGxlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZm9ybWF0UHJvY2Vzc29ycy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Zvcm1hdFByb2Nlc3NvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkNzMwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZm9ybWF0UHJvY2Vzc29ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJmb3JtYXRQcm9jZXNzb3JzIiBuYW1lPSJGb3JtYXQgUHJvY2Vzc29ycyBFeHRlbnNpb24gUG9pbnQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2Nlc3NvciIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzb3IiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuJmx0Oy9iJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7cHJlJmd0Ow0KLSAgICZsdDtleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0UHJvY2Vzc29ycyZxdW90OyZndDsNCi0gICAgICAmbHQ7cHJvY2Vzc29yDQotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MJnF1b3Q7DQotICAgICAgICAgICAgY29udGVudFR5cGVJZD0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sJnF1b3Q7Jmd0Ow0KLSAgICAgICZsdDsvcHJvY2Vzc29yJmd0Ow0KLSAgICZsdDsvZXh0ZW5zaW9uJmd0Ow0KLSZsdDsvcHJlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotDQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsNCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIA0KLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyANCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQ0KLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvbW9kZWxIYW5kbGVyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvbW9kZWxIYW5kbGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzc1YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL21vZGVsSGFuZGxlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0ibW9kZWxIYW5kbGVyIiBuYW1lPSJNb2RlbCBIYW5kbGVyIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibW9kZWxIYW5kbGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZGVsSGFuZGxlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFzc29jaWF0ZWRDb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS90YXNrc2Nhbm5lci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL3Rhc2tzY2FubmVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YzAzZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL3Rhc2tzY2FubmVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJ0YXNrc2Nhbm5lciIgbmFtZT0iVGFzayBTY2FubmVyIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2Nhbm5lciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzY2FubmVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGVJZHMiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0Fic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMGUzYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gbm8gb25lIGNhcmVzIGFueXdheXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciBpbXBsZW1lbnRzIElDb250ZW50U2V0dGluZ3NIYW5kbGVyIHsKLQotCi0JcHJpdmF0ZSBJQ29udGVudFNldHRpbmdzIGNvbnRlbnRTZXR0aW5ncyA9IENvbnRlbnRTZXR0aW5nc0NyZWF0b3IuY3JlYXRlKCk7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VEZWx0YSBmRGVsdGE7Ci0KLQlwcml2YXRlIHZvaWQgY29tbW9uV2l0aFJlc3BlY3RUb0tpbmQoKSB7Ci0JCWdldENvbnRlbnRTZXR0aW5ncygpLnJlbGVhc2VDYWNoZSgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJQ29udGVudFNldHRpbmdzIGdldENvbnRlbnRTZXR0aW5ncygpIHsKLQkJcmV0dXJuIGNvbnRlbnRTZXR0aW5nczsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSVJlc291cmNlRGVsdGEgZ2V0RGVsdGEoKSB7Ci0JCXJldHVybiBmRGVsdGE7Ci0JfQotCi0KLQkvKgotCSAqIEBzZWUgSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlKElSZXNvdXJjZURlbHRhKQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZShmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0aGlzLmZEZWx0YSA9IGRlbHRhOwotCQkvLyBnZXQgUmVzb3VyY2UgZGVsdGEga2luZAotCQlmaW5hbCBpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJLy8gbmV2ZXIgdXNlZCE/Ci0JCS8vSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCi0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogewotCQkJCWhhbmRsZUNoYW5nZWQoKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IHsKLQkJCQloYW5kbGVSZW1vdmVkKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDogewotCQkJCWhhbmRsZUFkZGVkKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0KLQotCQl9Ci0KLQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkZWQoKSB7Ci0JCWNvbW1vbldpdGhSZXNwZWN0VG9LaW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZCgpIHsKLQkJY29tbW9uV2l0aFJlc3BlY3RUb0tpbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZW1vdmVkKCkgewotCQljb21tb25XaXRoUmVzcGVjdFRvS2luZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RTdWJqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9BYnN0cmFjdFN1YmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjOThiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9BYnN0cmFjdFN1YmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdWJqZWN0IGltcGxlbWVudHMgSU5vdGlmeSwgSVN1YmplY3QgewotCi0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBsaXN0ZW5lckxpc3QgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdGVuZXIoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVyTGlzdC5wdXQobGlzdGVuZXIsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbnRlbnRTZXR0aW5nc0V2ZW50U3ViamVjdCNub3RpZnlDb250ZW50U2V0dGluZ3NMaXN0ZW5lcnMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIGNoYW5nZWRSZXNvdXJjZSkgewotCi0JCVNldCBrZXlzID0gbGlzdGVuZXJMaXN0LmtleVNldCgpOwotCQlJdGVyYXRvciBpdGVyID0ga2V5cy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGNzbCA9IChJQ29udGVudFNldHRpbmdzTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJY3NsLmNvbnRlbnRTZXR0aW5nc0NoYW5nZWQoY2hhbmdlZFJlc291cmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3OTdlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50U2V0dGluZ3MgaW1wbGVtZW50cyBJQ29udGVudFNldHRpbmdzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29udGVudFNldHRpbmdzTmFtZSA9ICIuY29udGVudHNldHRpbmdzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTaW1wbGVOb2RlT3BlcmF0b3IgZG9tT3BlcmF0b3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvamVjdCBwcmVQcm9qZWN0OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUNvbnRlbnRTZXR0aW5ncyBzaW5nbGV0b24gPSBuZXcgQ29udGVudFNldHRpbmdzKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRDb250ZW50U2V0dGluZ3NOYW1lKCkgewotCQlyZXR1cm4gY29udGVudFNldHRpbmdzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBJQ29udGVudFNldHRpbmdzIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRTZXR0aW5nc1BhdGg7Ci0JcHJpdmF0ZSBJUHJvamVjdCBjdXJyUHJvamVjdDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlRWxlbWVudE5hbWUgPSAiZmlsZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBBVEhBVFRSID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdEVsZW1lbnROYW1lID0gInByb2plY3QiOy8vJE5PTi1OTFMtMSQKLQotCi0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyByb290RWxlbWVudE5hbWUgPSAiY29udGVudHNldHRpbmdzIjsvLyROT04tTkxTLTEkCi0KLQotCi0JcHJpdmF0ZSBDb250ZW50U2V0dGluZ3MoKSB7Ci0JCWN1cnJQcm9qZWN0ID0gbnVsbDsKLQkJY29udGVudFNldHRpbmdzUGF0aCA9IG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgX3NldFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBNYXAgcHJvcGVydGllcykgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzID09IG51bGwgfHwgcHJvcGVydGllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBnZXRDb250ZW50U2V0dGluZ3NQYXRoKHJlc291cmNlKTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCi0JCQlpZiAoIWV4aXN0c0NvbnRlbnRTZXR0aW5ncygpKSB7Ci0JCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZvciBuZXcgWE1MIERvY3VtZW50Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZyb20gZXhpc3RpbmcgY29udGVudHNldHRpbmdzLgotCQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnQgZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZSh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIHByb2plY3QgRWxlbWVudCBhbmQgYWRkIGl0IGludG8gdHJlZQotCQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuYWRkRWxlbWVudFVuZGVyUm9vdCh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkvLyBjaGVjayBleGlzdHMgZmlsZSBFbGVtZW50Ci0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIGZpbGUgRWxlbWVudCBhbmQgYWRkIHBhdGggaW50byBpdC4KLQkJCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmFkZEVsZW1lbnRVbmRlclJvb3QodGhpcy5maWxlRWxlbWVudE5hbWUpOwotCQkJCWRvbU9wZXJhdG9yLmFkZEF0dHJpYnV0ZUF0KGUsIGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBleGlzdHMgcHJvcGVydHlOYW1lIGF0dHJpYnV0ZQotCQlNYXAgYXR0ckxpc3QgPSBkb21PcGVyYXRvci5nZXRBdHRyaWJ1dGVzT2YoZSk7Ci0JCWJvb2xlYW4gaGFzQXR0ciA9IHRydWU7Ci0JCWlmIChhdHRyTGlzdCA9PSBudWxsIHx8IGF0dHJMaXN0LmlzRW1wdHkoKSkKLQkJCWhhc0F0dHIgPSBmYWxzZTsKLQkJU2V0IGtleXMgPSBwcm9wZXJ0aWVzLmtleVNldCgpOwotCQlJdGVyYXRvciBpaSA9IGtleXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlpLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIGlpLm5leHQoKTsKLQkJCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTsKLQotCi0JCQlpZiAoIWhhc0F0dHIgfHwgKFN0cmluZykgYXR0ckxpc3QuZ2V0KHByb3BlcnR5TmFtZSkgPT0gbnVsbCkKLQkJCQkvLyBjcmVhdGUgcHJvcGVydHlOYW1lIGF0dHJpYnV0ZSBhbmQgYWRkCi0JCQkJZG9tT3BlcmF0b3IuYWRkQXR0cmlidXRlQXQoZSwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCWVsc2UKLQkJCQkvLyBzZXQgYXR0cmlidXRlIHZhbHVlCi0JCQkJZG9tT3BlcmF0b3IudXBkYXRlQXR0cmlidXRlQXQoZSwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJfQotCi0JCS8vIHdyaXRlIGRvbSB0cmVlIGludG8gLmNvbnRlbnRzZXR0aW5ncwotCQl0cnkgewotCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0JCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQotCi0JfQotCi0KLQlwcml2YXRlIHZvaWQgX3NldFByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcHJvcGVydHlOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBnZXRDb250ZW50U2V0dGluZ3NQYXRoKHJlc291cmNlKTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCi0JCQlpZiAoIWV4aXN0c0NvbnRlbnRTZXR0aW5ncygpKSB7Ci0JCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZvciBuZXcgWE1MIERvY3VtZW50Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZyb20gZXhpc3RpbmcgY29udGVudHNldHRpbmdzLgotCQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnQgZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZSh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIHByb2plY3QgRWxlbWVudCBhbmQgYWRkIGl0IGludG8gdHJlZQotCQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuYWRkRWxlbWVudFVuZGVyUm9vdCh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkvLyBjaGVjayBleGlzdHMgZmlsZSBFbGVtZW50Ci0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIGZpbGUgRWxlbWVudCBhbmQgYWRkIHBhdGggaW50byBpdC4KLQkJCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmFkZEVsZW1lbnRVbmRlclJvb3QodGhpcy5maWxlRWxlbWVudE5hbWUpOwotCQkJCWRvbU9wZXJhdG9yLmFkZEF0dHJpYnV0ZUF0KGUsIGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBleGlzdHMgcHJvcGVydHlOYW1lIGF0dHJpYnV0ZQotCi0JCU1hcCBhdHRyTGlzdCA9IGRvbU9wZXJhdG9yLmdldEF0dHJpYnV0ZXNPZihlKTsKLQkJaWYgKGF0dHJMaXN0ID09IG51bGwgfHwgYXR0ckxpc3QuaXNFbXB0eSgpIHx8IChTdHJpbmcpIGF0dHJMaXN0LmdldChwcm9wZXJ0eU5hbWUpID09IG51bGwpCi0JCQkvLyBjcmVhdGUgcHJvcGVydHlOYW1lIGF0dHJpYnV0ZSBhbmQgYWRkCi0JCQlkb21PcGVyYXRvci5hZGRBdHRyaWJ1dGVBdChlLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQllbHNlCi0JCQkvLyBzZXQgYXR0cmlidXRlIHZhbHVlCi0JCQlkb21PcGVyYXRvci51cGRhdGVBdHRyaWJ1dGVBdChlLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCi0KLQkJLy8gd3JpdGUgZG9tIHRyZWUgaW50byAuY29udGVudHNldHRpbmdzCi0JCXRyeSB7Ci0JCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCi0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVET01UcmVlKCkgdGhyb3dzIFNpbXBsZU5vZGVPcGVyYXRvci5SZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb21PcGVyYXRvciA9PSBudWxsIHx8IChjdXJyUHJvamVjdCAhPSBudWxsICYmICghY3VyclByb2plY3QuZXF1YWxzKHByZVByb2plY3QpKSAmJiBjb250ZW50U2V0dGluZ3NQYXRoICE9IG51bGwpKQotCQkJZG9tT3BlcmF0b3IgPSBuZXcgU2ltcGxlTm9kZU9wZXJhdG9yKGNvbnRlbnRTZXR0aW5nc1BhdGgpOwotCi0KLQl9Ci0KLQkvKgotCSAqIHByaXZhdGUgdm9pZCBjcmVhdGVOZXdET01UcmVlKCkgdGhyb3dzCi0JICogU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb257IC8vIGNyZWF0ZSBOZXcKLQkgKiBkb2N1bWVudCB3aGVuIG5vIGZpbGUgZXhpc3RzLiBET01JbXBsZW1lbnRhdGlvbiBpbXBsID0KLQkgKiBET01JbXBsZW1lbnRhdGlvbkltcGwuZ2V0RE9NSW1wbGVtZW50YXRpb24oKTsgRG9jdW1lbnQgZG9jdW1lbnQgPQotCSAqIGltcGwuY3JlYXRlRG9jdW1lbnQobnVsbCxyb290RWxlbWVudE5hbWUsbnVsbCk7IGRvbU9wZXJhdG9yID0gbmV3Ci0JICogU2ltcGxlTm9kZU9wZXJhdG9yKGRvY3VtZW50KTsgfQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVOZXdET01UcmVlKCkgdGhyb3dzIFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gY3JlYXRpbmcgZG9jdW1lbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBjcmVhdGluZyBkb2N1bWVudCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocm9vdEVsZW1lbnROYW1lKSk7Ci0JCQlkb21PcGVyYXRvciA9IG5ldyBTaW1wbGVOb2RlT3BlcmF0b3IoZG9jdW1lbnQpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVsZXRlQWxsUHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgZGVsZXRlZEZpbGUpIHsKLQkJaWYgKGRlbGV0ZWRGaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIGlmIChkZWxldGVkRmlsZS5leGlzdHMoKSkgcmV0dXJuOwotCQlpZiAoKGRlbGV0ZWRGaWxlKS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUgJiYgKGRlbGV0ZWRGaWxlKS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQlyZXR1cm47Ci0KLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChkZWxldGVkRmlsZSk7Ly8gZ2V0UHJvamVjdE9mKChJUmVzb3VyY2UpZGVsZXRlZEZpbGUpCi0JCS8vICsKLQkJLy8gSVBhdGguU0VQQVJBVE9SCi0JCS8vICsKLQkJLy8gY29udGVudFNldHRpbmdzTmFtZTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJY3JlYXRlRE9NVHJlZSgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnQgZSA9IG51bGw7Ci0JCWlmIChkZWxldGVkRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQkvLyBzZWxlY3QgcHJvamVjdCBlbGVtZW50IGFuZCBnZXQgYXR0cmlidXRlCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoTm9kZU5hbWUodGhpcy5wcm9qZWN0RWxlbWVudE5hbWUpOwotCQllbHNlIGlmIChkZWxldGVkRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KGRlbGV0ZWRGaWxlKSk7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0KLQkJLy8gd2hlbiBkZWxldGVkRmlsZSBlbnRyeSBleGlzdHMuCi0JCWlmIChkZWxldGVkRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQlkb21PcGVyYXRvci5yZW1vdmVFbGVtZW50V2l0aCh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKGRlbGV0ZWRGaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWRvbU9wZXJhdG9yLnJlbW92ZUVsZW1lbnRXaXRoKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KGRlbGV0ZWRGaWxlKSk7Ci0KLQotCQkvLyB3cml0ZSBkb20gdHJlZSBpbnRvIC5jb250ZW50c2V0dGluZ3MKLQkJdHJ5IHsKLQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0KLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWxldGVQcm9wZXJ0eShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuOwotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkgewotCQkJcmV0dXJuOyAvLyB3aGVuIC5jb250ZW50c2V0dGluZ3MueG1sIGlzIE5PVCBleGlzdC4KLQkJfQotCQl0cnkgewotCQkJY3JlYXRlRE9NVHJlZSgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJLy8gc2VsZWN0IHByb2plY3QgZWxlbWVudCBhbmQgZ2V0IGF0dHJpYnV0ZQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHRoaXMucHJvamVjdEVsZW1lbnROYW1lKTsKLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCi0KLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJZG9tT3BlcmF0b3IucmVtb3ZlQXR0cmlidXRlQXQoZSwgcHJvcGVydHlOYW1lKTsKLQkJCS8vIHdyaXRlIGRvbSB0cmVlIGludG8gLmNvbnRlbnRzZXR0aW5ncwotCQkJdHJ5IHsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0KLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBleGlzdHNDb250ZW50U2V0dGluZ3MoKSB7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVJlc291cmNlIGZpbGUgPSBjdXJyUHJvamVjdC5nZXRGaWxlKGNvbnRlbnRTZXR0aW5nc05hbWUpOwotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHNQcm9wZXJ0aWVzKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkKLQkJCXJldHVybiBmYWxzZTsgLy8gd2hlbiAuY29udGVudHNldHRpbmdzLnhtbCBpcyBOT1QgZXhpc3QuCi0KLQkJdHJ5IHsKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJLy8gc2VsZWN0IHByb2plY3QgZWxlbWVudCBhbmQgZ2V0IGF0dHJpYnV0ZQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHRoaXMucHJvamVjdEVsZW1lbnROYW1lKTsKLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCi0JCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNYXAgcHJvcGVydGllcyA9IGRvbU9wZXJhdG9yLmdldEF0dHJpYnV0ZXNPZihlKTsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcHJvcGVydGllcy5yZW1vdmUoZ2V0UGF0aEF0dHIoKSk7Ly8gaWYgSUZpbGUscmVtb3ZlZAotCQlpZiAocHJvcGVydGllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGVudFNldHRpbmdzUGF0aChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJZWxzZQotCQkJcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQotCQlJUGF0aCBwcm9qZWN0TG9jYXRpb24gPSBwcm9qZWN0LmdldExvY2F0aW9uKCk7Ci0JCWlmIChwcm9qZWN0TG9jYXRpb24gPT0gbnVsbCkgewotCQkJLyoqCi0JCQkgKiBBcyBhIGRlcHJlY2F0ZWQgY2xhc3MsIHBlcmZlY3Qgb3BlcmF0aW9uIGluIG5ldyBzY2VuYXJpb3Mgc3VjaAotCQkJICogYXMgd2l0aCBFRlMgaXMgbm90IHByb21pc2VkLgotCQkJICovCi0JCQlyZXR1cm4gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChyb290RWxlbWVudE5hbWUpLmFwcGVuZChwcm9qZWN0LmdldE5hbWUoKSkudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBwcm9qZWN0TG9jYXRpb24uYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQoY29udGVudFNldHRpbmdzTmFtZSkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBhdGhBdHRyKCkgewotCQlyZXR1cm4gUEFUSEFUVFI7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBNYXAgZ2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBnZXRDb250ZW50U2V0dGluZ3NQYXRoKHJlc291cmNlKTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpIHsKLQkJCXJldHVybiBudWxsOyAvLyB3aGVuIC5jb250ZW50c2V0dGluZ3MueG1sIGlzIE5PVCBleGlzdC4KLQkJfQotCi0KLQkJdHJ5IHsKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmb3IgbmV3IFhNTCBEb2N1bWVudAotCQkJdHJ5IHsKLQkJCQljcmVhdGVOZXdET01UcmVlKCk7Ci0JCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJfQotCi0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCS8vIHNlbGVjdCBwcm9qZWN0IGVsZW1lbnQgYW5kIGdldCBhdHRyaWJ1dGUKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZSh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QocmVzb3VyY2UpKTsKLQotCi0JCWlmIChlICE9IG51bGwpIHsKLQotCQkJTWFwIHByb3BlcnRpZXMgPSBkb21PcGVyYXRvci5nZXRBdHRyaWJ1dGVzT2YoZSk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHByb3BlcnRpZXMuaXNFbXB0eSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcHJvcGVydGllcy5yZW1vdmUoZ2V0UGF0aEF0dHIoKSk7Ci0JCQlyZXR1cm4gcHJvcGVydGllczsKLQkJfQotCQllbHNlIHsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybiBudWxsOy8vIHdoZW4gcHJvamVjdCBvciBmaWxlIGVsZW1lbnQgaXMgTk9UIGV4aXN0LgotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCEocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUIHx8IHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIWV4aXN0c0NvbnRlbnRTZXR0aW5ncygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gd2hlbiAuY29udGVudHNldHRpbmdzLnhtbCBpcyBOT1QgZXhpc3QuCi0JCX0KLQotCi0JCXRyeSB7Ci0JCQljcmVhdGVET01UcmVlKCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5SZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQkvLyBjcmVhdGUgRE9NIHRyZWUgZm9yIG5ldyBYTUwgRG9jdW1lbnQKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX0KLQotCi0JCUVsZW1lbnQgZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQkvLyBzZWxlY3QgcHJvamVjdCBlbGVtZW50IGFuZCBnZXQgYXR0cmlidXRlCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoTm9kZU5hbWUodGhpcy5wcm9qZWN0RWxlbWVudE5hbWUpOwotCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0KLQotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZS5nZXRBdHRyaWJ1dGUocHJvcGVydHlOYW1lKTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm4gbnVsbDsvLyB3aGVuIHByb2plY3Qgb3IgZmlsZSBlbGVtZW50IGlzIE5PVCBleGlzdC4KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaWYgcmVzb3VyY2UgaXMgcHJvamVjdCBvciB3b3Jrc3BhY2Ugcm9vdAotCQlTdHJpbmcgcmVzb3VyY2VQYXRoID0gcGF0aC50b1N0cmluZygpOwotCi0JCXJldHVybiByZXNvdXJjZVBhdGg7Ci0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZUNhY2hlKCkgewotCQlkb21PcGVyYXRvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBNYXAgcHJvcGVydGllcykgewotCQkvLyBkZW55IHRvIHNldCAicGF0aCIgYXR0cmlidXRlIHZhbHVlLgotCQlTZXQga2V5cyA9IHByb3BlcnRpZXMua2V5U2V0KCk7Ci0JCUl0ZXJhdG9yIGlpID0ga2V5cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaWkuaGFzTmV4dCgpKSB7Ci0JCQlpZiAodGhpcy5nZXRQYXRoQXR0cigpLmVxdWFscyhpaS5uZXh0KCkpKQotCQkJCXJldHVybjsKLQkJfQotCQl0aGlzLl9zZXRQcm9wZXJ0aWVzKHJlc291cmNlLCBwcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQkvLyBkZW55IHRvIHNldCAicGF0aCIgYXR0cmlidXRlIHZhbHVlLgotCQlpZiAodGhpcy5nZXRQYXRoQXR0cigpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKQotCQkJcmV0dXJuOwotCQl0aGlzLl9zZXRQcm9wZXJ0eShyZXNvdXJjZSwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVET01Eb2N1bWVudCgpIHRocm93cyBTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCWRvbU9wZXJhdG9yLndyaXRlRG9jdW1lbnQob3V0cHV0U3RyZWFtKTsKLQkJCW91dHB1dFN0cmVhbS5mbHVzaCgpOwotCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQotCQkJSUZpbGUgb3V0cHV0RmlsZSA9IGN1cnJQcm9qZWN0LmdldEZpbGUoY29udGVudFNldHRpbmdzTmFtZSk7Ci0JCQlpZiAob3V0cHV0RmlsZS5leGlzdHMoKSkKLQkJCQlvdXRwdXRGaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCB0cnVlLCBudWxsKTsKLQkJCWVsc2UKLQkJCQlvdXRwdXRGaWxlLmNyZWF0ZShpbnB1dFN0cmVhbSwgdHJ1ZSwgbnVsbCk7Ci0KLQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRocm93IG5ldyBTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKCJpbnZhbGlkIG91dHB1dEZpbGUgaW4gd3JpdGVET01Eb2N1bWVudCgpIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJdGhyb3cgbmV3IFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oImludmFsaWQgb3V0cHV0U3RyZWFtIG9yIGlucHV0U3RyZWFtIGluIHdyaXRlRE9NRG9jdW1lbnQoKSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmM1ODBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RTdWJqZWN0IHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgSU5vdGlmeSBub3RpZnk7Ci0JcHJpdmF0ZSBzdGF0aWMgSVN1YmplY3Qgc3ViamVjdDsKLQotCXByb3RlY3RlZCBzdGF0aWMgSU5vdGlmeSBnZXROb3RpZnkoKSB7Ci0JCWlmIChub3RpZnkgPT0gbnVsbCAmJiBzdWJqZWN0ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5jbGFzcykgewotCQkJCWlmIChub3RpZnkgPT0gbnVsbCAmJiBzdWJqZWN0ID09IG51bGwpIHsKLQkJCQkJbm90aWZ5ID0gbmV3IENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QoKTsKLQkJCQkJc3ViamVjdCA9IChJU3ViamVjdCkgbm90aWZ5OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBub3RpZnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3ViamVjdCBnZXRTdWJqZWN0KCkgewotCQlpZiAoc3ViamVjdCA9PSBudWxsICYmIG5vdGlmeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QuY2xhc3MpIHsKLQkJCQlpZiAoc3ViamVjdCA9PSBudWxsICYmIG5vdGlmeSA9PSBudWxsKSB7Ci0JCQkJCXN1YmplY3QgPSBuZXcgQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdCgpOwotCQkJCQlub3RpZnkgPSAoSU5vdGlmeSkgc3ViamVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1YmplY3Q7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZExpc3RlbmVyKElDb250ZW50U2V0dGluZ3NMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgY2hhbmdlZFJlc291cmNlKSB7Ci0JCXN1cGVyLm5vdGlmeUxpc3RlbmVycyhjaGFuZ2VkUmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0NyZWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0NyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkMzU1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFNldHRpbmdzQ3JlYXRvciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIElDb250ZW50U2V0dGluZ3MgY3JlYXRlKCkgewotCQlyZXR1cm4gQ29udGVudFNldHRpbmdzLmdldEluc3RhbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NGaWxlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzRmlsZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1MjYwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NGaWxlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0qIEBkZXByZWNhdGVkIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gbm8gb25lIGNhcmVzIGFueXdheXMuCi0qLwotY2xhc3MgQ29udGVudFNldHRpbmdzRmlsZUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIgewotCi0KLQotCXByaXZhdGUgTWFwIHByb3BlcnRpZXM7Ci0KLQotCXByaXZhdGUgdm9pZCBnZXRQcm9wZXJ0aWVzKElSZXNvdXJjZSBmaWxlKSB7Ci0JCXByb3BlcnRpZXMgPSBnZXRDb250ZW50U2V0dGluZ3MoKS5nZXRQcm9wZXJ0aWVzKGZpbGUpOwotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlQWRkZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZGVkKCkgewotCQlzdXBlci5oYW5kbGVBZGRlZCgpOwotCi0JCWlmIChzdXBlci5nZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVtdS0+Y29weS0+Y3JlYXRlIGZpbGUgd2l0aG91dCBvdmVycmlkZSwgbmV3IGZpbGUsCi0JCQkvLyBpbXBvcnQgd2l0aG91dCBvdmVycmlkZQotCQkJLy8gY29weSxuZXcsaW1wb3J0IGhhcyBzYW1lIGtpbmQoPTEpIGFuZCBmbGFnKD0wKS4KLQotCQl9IGVsc2UgaWYgKChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW51LT4gcmVuYW1lIHdpdGhvdXQgb3ZlcnJpZGUscHVsbGRvd24gbWVudS0+bW92ZQotCQkJLy8gd2l0aG91dCBvdmVycmlkZQotCQkJLy8gaW5zdGVhZCBvZiB0aGlzIG1ldGhvZCxoYW5kbGVSZW1vdmVkKCkgd29ya3MgZm9yIHRoaXMgZGVsdGEKLQotCQl9Ci0KLQl9Ci0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlQ2hhbmdlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZCgpIHsKLQkJLy8gZWRpdAotCQlpZiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLkNPTlRFTlQgJiYgKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSAwKSB7Ci0JCQlzdXBlci5oYW5kbGVDaGFuZ2VkKCk7Ci0KLQkJfSBlbHNlIGlmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuQ09OVEVOVCAmJiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpICE9IDApIHsKLQkJCS8vIG92ZXJyaWRlIGFzIGEgcmVzdWx0IG9mIGNvcHkgb3IgaW1wb3J0Ci0JCQkvLyBpbiBXZWIgcHJvamVjdCwgY29weSB3aXRoIG92ZXJyaWRlIGRvZXNuJ3QgaGFwcGVuCi0KLQkJCS8vIG92ZXJyaWRlIGFzIG1vdmUgb3IgcmVuYW1lCi0JCQkvLyBoYW5kbGVSZW1vdmVkKCkgd29ya3MgZm9yIHRoaXMgZGVsdGEKLQkJCXN1cGVyLmhhbmRsZUNoYW5nZWQoKTsKLQotCQl9Ci0KLQotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlUmVtb3ZlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlZCgpIHsKLQkJc3VwZXIuaGFuZGxlUmVtb3ZlZCgpOwotCQlJRmlsZSBkZWxldGVkRmlsZSA9IG51bGw7Ci0KLQkJLy8gaWYgZW50cnkgZXhpc3RzIHRoZW4gcmVtb3ZlIGl0LgotCQlpZiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpID09IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbnUtPmRlbGV0ZQotCQkJZGVsZXRlZEZpbGUgPSAoSUZpbGUpIGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKTsKLQotCQkJaWYgKGRlbGV0ZWRGaWxlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZ2V0Q29udGVudFNldHRpbmdzKCkuZGVsZXRlQWxsUHJvcGVydGllcyhkZWxldGVkRmlsZSk7Ci0KLQkJCWdldENvbnRlbnRTZXR0aW5ncygpLnJlbGVhc2VDYWNoZSgpOwotCQl9Ci0KLQkJZWxzZSBpZiAoKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKSB7Ci0KLQkJCS8vIHB1bGxkb3duIG1lbnUtPiByZW5hbWUsIHB1bGxkb3duIG1lbnUtPm1vdmUKLQkJCWRlbGV0ZWRGaWxlID0gKElGaWxlKSBnZXREZWx0YSgpLmdldFJlc291cmNlKCk7Ci0JCQlnZXRQcm9wZXJ0aWVzKGRlbGV0ZWRGaWxlKTsKLQotCQkJLy8gZ2V0IGRlc3RpbmF0aW9uIElSZXNvdXJjZQotCQkJSVBhdGggdGFyZ2V0UGF0aCA9IGdldERlbHRhKCkuZ2V0TW92ZWRUb1BhdGgoKTsKLQkJCUlXb3Jrc3BhY2VSb290IGl3ciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJUmVzb3VyY2UgdGFyZ2V0RmlsZSA9IGl3ci5nZXRGaWxlKHRhcmdldFBhdGgpOy8vaXdyLmZpbmRNZW1iZXIodGFyZ2V0UGF0aCk7Ci0KLQkJCS8vIHNldCBwcm9wZXJ0eSBvZiBkZXN0aW5hdGlvbiBmaWxlCi0JCQlnZXRDb250ZW50U2V0dGluZ3MoKS5kZWxldGVBbGxQcm9wZXJ0aWVzKHRhcmdldEZpbGUpOwotCQkJc2V0UHJvcGVydGllcyh0YXJnZXRGaWxlKTsKLQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpCi0JCQkJcHJvcGVydGllcy5jbGVhcigpOwotCQkJcHJvcGVydGllcyA9IG51bGw7Ci0JCX0KLQotCQlpZiAoZGVsZXRlZEZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0Q29udGVudFNldHRpbmdzKCkuZGVsZXRlQWxsUHJvcGVydGllcyhkZWxldGVkRmlsZSk7Ci0KLQkJZ2V0Q29udGVudFNldHRpbmdzKCkucmVsZWFzZUNhY2hlKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvcGVydGllcyhJUmVzb3VyY2UgZmlsZSkgewotCQlpZiAoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCEoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgic2h0bWwiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHRtIikvLyROT04tTkxTLTEkCi0JCQkJCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImh0bWwiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiamh0bWwiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgieGh0bWwiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNwIikvLyROT04tTkxTLTEkCi0JCQkJCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImNzcyIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqc2YiKS8vJE5PTi1OTFMtMSQKLQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNwZiIpKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwgfHwgcHJvcGVydGllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWdldENvbnRlbnRTZXR0aW5ncygpLnNldFByb3BlcnRpZXMoZmlsZSwgcHJvcGVydGllcyk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1NlbGZIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NTZWxmSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2FhMmI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1NlbGZIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0qIEBkZXByZWNhdGVkIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gbm8gb25lIGNhcmVzIGFueXdheXMuCi0qLwotZmluYWwgY2xhc3MgQ29udGVudFNldHRpbmdzU2VsZkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgSU5vdGlmeSBub3RpZnk7Ly8gPSBuZXcgQ29udGVudFNldHRpbmdzQ2hhbmdlZFN1YmplY3QoKTsKLQotCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGdldFN1YmplY3QoKSB7Ci0JCW5vdGlmeSA9IENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QuZ2V0Tm90aWZ5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVBZGRlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkZWQoKSB7Ci0JCWdldFN1YmplY3QoKTsKLQkJaWYgKHN1cGVyLmdldERlbHRhKCkuZ2V0RmxhZ3MoKSA9PSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW11LT5jb3B5LT5jcmVhdGUgZmlsZSB3aXRob3V0IG92ZXJyaWRlLCBuZXcgZmlsZSwKLQkJCS8vIHByb3BlcnR5IHBhZ2UgY3JlYXRlIC5jb250ZW50c2V0dGluZ3MKLQkJCXN1cGVyLmhhbmRsZUFkZGVkKCk7Ci0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfSBlbHNlIGlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgIT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVudS0+IHJlbmFtZSB3aXRob3V0IG92ZXJyaWRlLHB1bGxkb3duIG1lbnUtPm1vdmUKLQkJCS8vIHdpdGhvdXQgb3ZlcnJpZGUKLQkJCXN1cGVyLmhhbmRsZUFkZGVkKCk7Ci0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfQotCi0JfQotCi0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyI2hhbmRsZUNoYW5nZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWQoKSB7Ci0JCWdldFN1YmplY3QoKTsKLQkJaWYgKChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwICYmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgPT0gMCkgewotCQkJLy8gcmVzdWx0IG9mIGVkaXQsIHByb3BlcnR5IHBhZ2Ugb3BlcmF0ZSBzZXRQcm9wZXJ0eShhcHBseSBvciBvawotCQkJLy8gYnV0dG9uKSBpbiAuY29udGVudHNldHRpbmdzCi0JCQlzdXBlci5oYW5kbGVDaGFuZ2VkKCk7Ci0KLQkJCW5vdGlmeS5ub3RpZnlMaXN0ZW5lcnMoZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpKTsKLQotCQl9IGVsc2UgaWYgKChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwICYmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgIT0gMCkgewotCQkJc3VwZXIuaGFuZGxlQ2hhbmdlZCgpOwotCQkJbm90aWZ5Lm5vdGlmeUxpc3RlbmVycyhnZXREZWx0YSgpLmdldFJlc291cmNlKCkpOwotCi0JCX0KLQotCi0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVSZW1vdmVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZW1vdmVkKCkgewotCQlnZXRTdWJqZWN0KCk7Ci0JCWlmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVudS0+ZGVsZXRlCi0JCQlzdXBlci5oYW5kbGVSZW1vdmVkKCk7Ci0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfSBlbHNlIGlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbnUtPiByZW5hbWUsIHB1bGxkb3duIG1lbnUtPm1vdmUKLQkJCXN1cGVyLmhhbmRsZVJlbW92ZWQoKTsKLQkJCW5vdGlmeS5ub3RpZnlMaXN0ZW5lcnMoZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpKTsKLQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzM4YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50U2V0dGluZ3NTeW5jaHJvbml6ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JY2xhc3MgQ29udGVudFNldHRpbmdzVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCS8vIHJlZGVmaW5pdGlvbiBpbiBDb250ZW50U2V0dGluZ3MuamF2YQotCQlwcml2YXRlIFN0cmluZyBjb250ZW50U2V0dGluZ3NOYW1lID0gQ29udGVudFNldHRpbmdzLmdldENvbnRlbnRTZXR0aW5nc05hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUV2ZW50IGZFdmVudDsKLQkJcHJpdmF0ZSBJQ29udGVudFNldHRpbmdzSGFuZGxlciBoYW5kbGVyOwotCi0JCXB1YmxpYyBDb250ZW50U2V0dGluZ3NWaXNpdG9yKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLmZFdmVudCA9IGV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBwYXJlbnQgZm9sZGVyIG9yIHByb2plY3QKLQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiBkZWx0YS5nZXRGbGFncygpID09IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlmaW5hbCBpbnQgcmVzb3VyY2VUeXBlID0gcmVzb3VyY2UuZ2V0VHlwZSgpOwotCQkJc3dpdGNoIChyZXNvdXJjZVR5cGUpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQkvLyB3aGV0aGVyIHJlc291cmNlIGlzIC5jb250ZW50c2V0dGluZ3MgZmlsZSBvciBub3QKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IGRlbHRhLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpOwotCQkJCQlpZiAodGhpcy5mRXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFICYmIHJlc291cmNlLmVxdWFscyhwcm9qZWN0LmdldEZpbGUodGhpcy5jb250ZW50U2V0dGluZ3NOYW1lKSkpIHsKLQkJCQkJCS8vIG5ldyBvYmplY3QgZm9yIC5jb250ZW50c2V0dGluZ3MKLQkJCQkJCWhhbmRsZXIgPSBuZXcgQ29udGVudFNldHRpbmdzU2VsZkhhbmRsZXIoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh0aGlzLmZFdmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEICYmIHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBUT0RPIGNoYW5nZSB0byBjb250ZW50IHR5cGUhCi0JCQkJCQlpZiAocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoInNodG1sIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImh0bSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJodG1sIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpodG1sIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoInhodG1sIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpzcCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJjc3MiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgianNmIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpzcGYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gbmV3IG9iamVjdCBmb3IgSUZpbGUKLQkJCQkJCQloYW5kbGVyID0gbmV3IENvbnRlbnRTZXR0aW5nc0ZpbGVIYW5kbGVyKCk7Ci0JCQkJCQkJaGFuZGxlci5oYW5kbGUoZGVsdGEpOwotCQkJCQkJCWhhbmRsZXIgPSBudWxsOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsgLy8gdHJ1ZSBvciBmYWxzZTttb3RvbW90byB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0vLwkJCWZpbmFsIElSZXNvdXJjZURlbHRhIGZEZWx0YSA9IGRlbHRhOwotLy8JCQlmaW5hbCBJQ29udGVudFNldHRpbmdzSGFuZGxlciBkZWx0YUhhbmRsZXIgPSB0aGlzLmhhbmRsZXI7Ci0JCQkvLyBYWFggRklYTUUKLQkJCS8vIEkgY29tbWVudGVkIG91dCBmb2xsb3dpbmcgdG8gbW92ZSB0aGlzIHRvICJtb2RlbCIgCi0JCQkvLyBwYWNrYWdlcy4gU2luY2Ugd2FzbnQndCBob29rZWQgdXAvd29ya2luZyBhbnl3YXksIEkgdGhpbmsgCi0JCQkvLyBvayBmb3Igbm93LCBidXQgbmVlZCB0byByZS13b3JrIGFzIEpvYiwgb25jZSB3ZSBkbyBpbXBsZW1lbnQgCi0JCQkvLyBzZXR0aW5ncyBmb3IgcmVzb3VyY2VzIGFnYWluLiAKLS8vCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotLy8JCQlpZiAoZGlzcGxheSAhPSBudWxsICYmICFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotLy8JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotLy8JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vCQkJCQkJaWYgKGRlbHRhSGFuZGxlciAhPSBudWxsKSB7Ci0vLwkJCQkJCQlkZWx0YUhhbmRsZXIuaGFuZGxlKGZEZWx0YSk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9KTsKLS8vCQkJfQotLy8JCQllbHNlIGlmIChkZWx0YUhhbmRsZXIgIT0gbnVsbCkgewotLy8JCQkJZGVsdGFIYW5kbGVyLmhhbmRsZShmRGVsdGEpOwotLy8JCQl9Ci0JCQloYW5kbGVyID0gbnVsbDsKLQkJCXJldHVybiB0cnVlOyAvLyB0cnVlIG9yIGZhbHNlO21vdG9tb3RvIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb250ZW50U2V0dGluZ3NTeW5jaHJvbml6ZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IENvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50U2V0dGluZ3NWaXNpdG9yIGNzVmlzaXRvcjsKLQlwcml2YXRlIGJvb2xlYW4gZkxpc3RlbmluZyA9IGZhbHNlOwotCXByaXZhdGUgSVByb2plY3QgZlByb2plY3Q7Ci0KLQotCXByaXZhdGUgZmluYWwgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCXByaXZhdGUgZmluYWwgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluc3RhbGwoKSB7Ci0JCWlmICghZkxpc3RlbmluZykgewotCQkJZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQlmTGlzdGVuaW5nID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNMaXN0ZW5pbmcoKSB7Ci0JCXJldHVybiBmTGlzdGVuaW5nOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNzVmlzaXRvciA9PSBudWxsKQotCQkJCQljc1Zpc2l0b3IgPSBuZXcgQ29udGVudFNldHRpbmdzVmlzaXRvcihldmVudCk7Ci0JCQkJZGVsdGEuYWNjZXB0KGNzVmlzaXRvcik7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQljc1Zpc2l0b3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bkluc3RhbGwoKSB7Ci0JCWdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWZMaXN0ZW5pbmcgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OGRkNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFNldHRpbmdzIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIENTU19QUk9GSUxFID0gImNzcy1wcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgREVWSUNFX1BST0ZJTEUgPSAidGFyZ2V0LWRldmljZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfVFlQRSA9ICJkb2N1bWVudC10eXBlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgSFRNTF9ET0NVTUVOVF9UWVBFID0gImh0bWwtZG9jdW1lbnQtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUFsbFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIGRlbGV0ZWRGaWxlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHNQcm9wZXJ0aWVzKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIHJlbGVhc2UgY2FjaGUgb2YgRE9NIHRyZWUgaW4gLmNvbnRlbnRzZXR0aW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VDYWNoZSgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIE1hcCBwcm9wZXJ0aWVzKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3NIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjhiNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1pbnRlcmZhY2UgSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIgewotCi0JcHVibGljIHZvaWQgaGFuZGxlKGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3NMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTUxZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgewotCi0Jdm9pZCBjb250ZW50U2V0dGluZ3NDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lOb3RpZnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lOb3RpZnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjZjVmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JTm90aWZ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1pbnRlcmZhY2UgSU5vdGlmeSB7Ci0KLQl2b2lkIG5vdGlmeUxpc3RlbmVycyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgcmVzb3VyY2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSVN1YmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lTdWJqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZjQwMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSVN1YmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN1YmplY3QgewotCi0Jdm9pZCBhZGRMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0Jdm9pZCByZW1vdmVMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9TaW1wbGVOb2RlT3BlcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL1NpbXBsZU5vZGVPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmRhOTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL1NpbXBsZU5vZGVPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1jbGFzcyBTaW1wbGVOb2RlT3BlcmF0b3IgewotCi0JY2xhc3MgQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIENyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewotCQkJc3VwZXIocmVhc29uKTsKLQkJfQotCX0KLQotCi0JY2xhc3MgUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBSZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgcmVhc29uKSB7Ci0JCQlzdXBlcihyZWFzb24pOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFdyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIFdyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgcmVhc29uKSB7Ci0JCQlzdXBlcihyZWFzb24pOwotCQl9Ci0JfQotCi0JLy8gd3JpdGVyIGNsYXNzIGZvciAuY29udGVudFNldHRpbmdzLgotCWNsYXNzIFhNTERvY3VtZW50V3JpdGVyIHsKLQkJT3V0cHV0U3RyZWFtIGZPdXQ7Ci0KLQkJcHJvdGVjdGVkIFhNTERvY3VtZW50V3JpdGVyKE91dHB1dFN0cmVhbSBvdXQpIHsKLQkJCXRoaXMuZk91dCA9IG91dDsKLQkJfQotCi0JCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNsb3NlKCkgewotCQkJdHJ5IHsKLQkJCQlmT3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZywgc2hvdWxkbid0IG1hdHRlcgotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplKERvY3VtZW50IHNvdXJjZURvY3VtZW50KSB0aHJvd3MgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJCS8vIEpBWFAgdHJhbnNmb3JtYXRpb24KLQkJCVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKHNvdXJjZURvY3VtZW50KTsKLQkJCXRyeSB7Ci0JCQkJVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gdW5zdXBwb3J0ZWQgcHJvcGVydGllcwotCQkJCX0KLQkJCQlzZXJpYWxpemVyLnRyYW5zZm9ybShkb21Tb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQoZk91dCkpOwotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQkJdGhyb3cgbmV3IFdyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFdyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVNpbXBsZU5vZGVPcGVyYXRvciBhID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWEgPSBuZXcgU2ltcGxlTm9kZU9wZXJhdG9yKCJ3b3Jrc3BhY2Uvb3JnLmVjbGlwc2UuZXhhbXBsZXMuY29udGVudHNldHRpbmdzLy5jb250ZW50c2V0dGluZ3MueG1sIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCX0KLQotCQkvLyBwcmludCBhbGwgRWxlbWVudHMKLQkJLy9hLnByaW50VHJlZShpdGVyKTsKLQotCQkvLyBhZGQgRWxlbWVudAotCQlNYXAgYXR0TWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlhdHRNYXAucHV0KCJwYXRoIiwgImhvZ2VwYXRoIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWF0dE1hcC5wdXQoImZEb2N1bWVudC10eXBlIiwgImRvY3VtZW50aG9nZWhvZ2UiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYS5hZGRFbGVtZW50VW5kZXJSb290KCJmaWxlIiwgYXR0TWFwKTsvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCWEud3JpdGVEb2N1bWVudChTeXN0ZW0ub3V0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQl9Ci0KLQkvL25ldmVyIHVzZWQKLQkvL3ByaXZhdGUgRE9NUGFyc2VyIHBhcnNlcjsKLQlwcml2YXRlIERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIE5vZGUgcm9vdDsKLQotCXByaXZhdGUgU3RyaW5nIHNldHRpbmdzRmlsZU5hbWU7Ci0KLQotCXB1YmxpYyBTaW1wbGVOb2RlT3BlcmF0b3IoRG9jdW1lbnQgZG9jKSB0aHJvd3MgQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oIkRvY3VtZW50IGRvYz09bnVsbCIpOy8vJE5PTi1OTFMtMSQKLQkJZkRvY3VtZW50ID0gZG9jOwotCQlyb290ID0gZkRvY3VtZW50LmdldExhc3RDaGlsZCgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IENyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oIk5vZGUgcm9vdD09bnVsbCIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlTm9kZU9wZXJhdG9yKFN0cmluZyBmdWxsUGF0aCkgdGhyb3dzIFJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJdGhpcy5zZXR0aW5nc0ZpbGVOYW1lID0gZnVsbFBhdGg7Ci0JCWNyZWF0ZU9iamVjdE9mRG9jdW1lbnQoKTsKLQl9Ci0KLQkvLyBhZGQgYXR0cmlidXRlKGF0dE5hbWU9YXR0VmFsdWUpIG9mIGVsZSB3aXRob3V0IGNoZWNraW5nIG92ZXJsYXBwaW5nIG9mCi0JLy8gYW5vdGhlciBhdHRyaWJ1dGVzIG9mIGVsZS4KLQkvLyBpZiBvdmVybGFwcGluZyAsb3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTm9kZSBhZGRBdHRyaWJ1dGVBdChFbGVtZW50IGVsZSwgU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlBdHRyIGF0dCA9IGZEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoYXR0TmFtZSk7Ci0JCWF0dC5zZXRWYWx1ZShhdHRWYWx1ZSk7Ci0JCWlmIChlbGUgIT0gbnVsbCkKLQkJCWVsZS5zZXRBdHRyaWJ1dGVOb2RlKGF0dCk7Ci0JCXJldHVybiBlbGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgYWRkRWxlbWVudFVuZGVyKE5vZGUgcGFyZW50LCBTdHJpbmcgdGFnTmFtZSwgTWFwIGF0dE1hcCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgdGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVsZW1lbnQgZSA9IGZEb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQlpZiAoYXR0TWFwICE9IG51bGwpIHsKLQkJCWlmICghYXR0TWFwLmlzRW1wdHkoKSkgewotCQkJCVNldCBhdHRLZXlzID0gYXR0TWFwLmtleVNldCgpOwotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRLZXlzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJZS5zZXRBdHRyaWJ1dGUoa2V5LCAoU3RyaW5nKSBhdHRNYXAuZ2V0KGtleSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwYXJlbnQuYXBwZW5kQ2hpbGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBOb2RlIGFkZEVsZW1lbnRVbmRlclJvb3QoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIGFkZEVsZW1lbnRVbmRlcihyb290LCB0YWdOYW1lLCBudWxsKTsKLQl9Ci0KLQkvLyBhZGQgZWxlbWVudCB3aXRoIGF0dE1hcCBhcyBhdHRyaWJ1dGUgd2l0aG91dCBjaGVja2luZyBvdmVybGFwcGluZy4KLQlwcm90ZWN0ZWQgZmluYWwgTm9kZSBhZGRFbGVtZW50VW5kZXJSb290KFN0cmluZyB0YWdOYW1lLCBNYXAgYXR0TWFwKSB7Ci0JCXJldHVybiBhZGRFbGVtZW50VW5kZXIocm9vdCwgdGFnTmFtZSwgYXR0TWFwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlT2JqZWN0T2ZEb2N1bWVudCgpIHRocm93cyBSZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlmRG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IEZpbGUoc2V0dGluZ3NGaWxlTmFtZSkpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIHBhcnNpbmciICsgc2V0dGluZ3NGaWxlTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSS9PIGV4Y2VwdGlvbiBwYXJzaW5nIiArIHNldHRpbmdzRmlsZU5hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGFjY2Vzc2luZyBET01JbXBsZW1lbnRhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGFjY2Vzc2luZyBET01JbXBsZW1lbnRhdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy9nZXQgdGhlIHJvb3Qgb2YgdGhlIFhNTCBmRG9jdW1lbnQKLQkJcm9vdCA9IGZEb2N1bWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKCJFcnJvcjogTm9kZSByb290PT1udWxsIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRBdHRyaWJ1dGVzT2YoTm9kZSBub2RlKSB7Ci0JCWlmICghbm9kZS5oYXNBdHRyaWJ1dGVzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgc2l6ZSA9IGF0dHJzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQltYXAucHV0KGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiAobWFwKTsKLQl9Ci0KLQlwcml2YXRlIE5vZGUgZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoTm9kZSBmaXJzdCwgU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlOb2RlIG5hdnBvaW50ID0gZmlyc3Q7Ci0JCXdoaWxlIChuYXZwb2ludCAhPSBudWxsKSB7Ci0JCQlpZiAobmF2cG9pbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCU5hbWVkTm9kZU1hcCBtID0gbmF2cG9pbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCWlmIChtID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtLmdldE5hbWVkSXRlbShhdHROYW1lKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChhdHRWYWx1ZS5lcXVhbHMoKChBdHRyKSBtLmdldE5hbWVkSXRlbShhdHROYW1lKSkuZ2V0Tm9kZVZhbHVlKCkpKQotCQkJCQkJcmV0dXJuIG5hdnBvaW50OwotCQkJCX0KLQkJCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbmF2cG9pbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwgJiYgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJTm9kZSBob2xkTm9kZSA9IGdldEVsZW1lbnRXaXRoQXR0cmlidXRlKG5hdnBvaW50LmdldEZpcnN0Q2hpbGQoKSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotCQkJCQlpZiAoaG9sZE5vZGUgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGhvbGROb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbmF2cG9pbnQgPSBuYXZwb2ludC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gcmV0dXJuIGEgKGZpcnN0KSBFbGVtZW50IHdpdGggYXR0cihhdHROYW1lPWF0dFZhbHVlKSBpdCBpZiBleGlzdHMsCi0JLy8gb3RoZXJ3aXNlIHJldHVybiBudWxsCi0JcHJvdGVjdGVkIE5vZGUgZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlpZiAoYXR0TmFtZSA9PSBudWxsIHx8IGF0dFZhbHVlID09IG51bGwgfHwgIWZEb2N1bWVudC5oYXNDaGlsZE5vZGVzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGZEb2N1bWVudC5nZXRGaXJzdENoaWxkKCksIGF0dE5hbWUsIGF0dFZhbHVlKTsKLQl9Ci0KLQkvLyByZXRydW4gRWxlbWVudCB3aGljaCBoYXMgbm9kZU5hbWUgYXMgTm9kZSBOYW1lCi0JcHJvdGVjdGVkIE5vZGUgZ2V0RWxlbWVudFdpdGhOb2RlTmFtZShTdHJpbmcgbm9kZU5hbWUpIHsKLQkJaWYgKG5vZGVOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZUxpc3Qgbm9kZXMgPSBmRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobm9kZU5hbWUpOwotCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gbm9kZXMuaXRlbSgwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFRyZWUoTm9kZUl0ZXJhdG9yIGl0ZXIpIHsKLQkJTm9kZSBuOwotCQl3aGlsZSAoKG4gPSBpdGVyLm5leHROb2RlKCkpICE9IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihuLmdldE5vZGVOYW1lKCkgKyAiOiIpOy8vJE5PTi1OTFMtMSQKLQkJCU5hbWVkTm9kZU1hcCBtID0gbi5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAobSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlTdHJpbmcgYXR0TmFtZSA9IG0uaXRlbShpKS5nZXROb2RlTmFtZSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAiICsgYXR0TmFtZSArICI9IiArIG0uaXRlbShpKS5nZXROb2RlVmFsdWUoKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCi0JLy8gcmVtb3ZlIGF0dHJpYnV0ZShhdHROYW1lKSBhdCBlbGUuCi0JcHJvdGVjdGVkIEF0dHIgcmVtb3ZlQXR0cmlidXRlQXQoRWxlbWVudCBlbGUsIFN0cmluZyBhdHROYW1lKSB7Ci0JCWlmIChlbGUgPT0gbnVsbCB8fCBhdHROYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQXR0ciBhdHQgPSBlbGUuZ2V0QXR0cmlidXRlTm9kZShhdHROYW1lKTsKLQkJZWxlLnJlbW92ZUF0dHJpYnV0ZShhdHROYW1lKTsKLQkJcmV0dXJuIGF0dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCByZW1vdmVFbGVtZW50V2l0aChTdHJpbmcgbm9kZU5hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSBmRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobm9kZU5hbWUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCW5vZGVzLml0ZW0oaSkuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKG5vZGVzLml0ZW0oaSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIHJlbW92ZSBhIChmaXJzdCkgRWxlbWVudCB3aXRoIGF0dHIoYXR0TmFtZT1hdHRWYWx1ZSkgYW5kIHJldHVybiBpdCBpZgotCS8vIGV4aXN0cywgb3RoZXJ3aXNlIHJldHVybiBudWxsCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVtb3ZlRWxlbWVudFdpdGgoU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlpZiAoZkRvY3VtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJTm9kZSBlbGVtZW50ID0gZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0VmFsdWUpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQllbGVtZW50LmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChlbGVtZW50KTsKLQkJCQlyZXR1cm4gKEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQkvLyB1cGRhdGUgYXR0cmlidXRlKGF0dE5hbWU9bmV3VmFsdWUpIGF0IGVsZSBpZiBib3RoIGVsZSBhbmQgYXR0cmlidXRlIG9mCi0JLy8gZWxlIGV4aXN0Ci0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQXR0cmlidXRlQXQoRWxlbWVudCBlbGUsIFN0cmluZyBhdHROYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJQXR0ciBhdHQgPSBudWxsOwotCQlpZiAoZWxlICE9IG51bGwpCi0JCQlpZiAoKGF0dCA9IGVsZS5nZXRBdHRyaWJ1dGVOb2RlKGF0dE5hbWUpKSAhPSBudWxsKQotCQkJCWF0dC5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVEb2N1bWVudChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJWE1MRG9jdW1lbnRXcml0ZXIgd3JpdGVyID0gbmV3IFhNTERvY3VtZW50V3JpdGVyKG91dCk7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIuc2VyaWFsaXplKGZEb2N1bWVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkSU8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRJTy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjMxODI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRJTy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvZGVkSU8gewotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRl9TSVpFID0gMTAyNCAqIDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfTUFSS19TSVpFID0gTUFYX0JVRl9TSVpFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fU1BFQ19ERUZBVUxUID0gIk5vU3BlY0RlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIG92ZXJyaWRlbkNoYXJzZXRzID0gbnVsbDsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZXJlIGFyZSB0d28gd2VsbCBrbm93biB1bmRlcnN0b29kIGNhc2VzIHdoZXJlIHRoZSBzdGFuZGFyZC9kZWZhdWx0Ci0JICogSmF2YSBNYXBwaW5ncyBhcmUgbm90IHN1ZmZpY2llbnQuIChUaGFua3MgdG8gSGlyb3Rha2EgTWF0c3Vtb3RvIGZvcgotCSAqIHByb3ZpZGluZyB0aGVzZSB0d28pLiBJIGJlbGlldmUgdGhlcmUgYXJlIG90aGVycyB0aGF0IGluZGl2aWR1YWwKLQkgKiBjdXN0b21lcnMgaGF2ZSByZXF1ZXN0ZWQgdG8gb3ZlcnJpZGUgb24gYSBjYXNlIGJ5IGNhc2UgYmFzaXMsIGJ1dCBJJ3ZlCi0JICogbG9zdCB0aGUgZGV0YWlscy4gVE9ETy1mdXR1cmU6IGRvY3VtZW50IHNvbWUgb2YgdGhvc2UgdXNlLWNhc2VzLgotCSAqIDwvcD4KLQkgKiA8dWw+Ci0JICogPGxpPklTTy04ODU5LTgtSTwvbGk+Ci0JICogPHA+Ci0JICogSW4gdGhlIGNvZGUgY29udmVyc2lvbiBwb2ludCBvZiB2aWV3LCBJU08tOTk1OS04IGFuZCBJU08tODg1OS04LUkgYXJlCi0JICogdGhlIHNhbWUuIEhvd2V2ZXIuIHRoZSByZXByZXNlbnRhdGlvbiBvbiB0aGUgYnJvd3NlciBpcyBkaWZmZXJlbnQuICgKLQkgKiBJdCdzIHZlcnkgdmVyeSBoYXJkIHRvIGV4cGxhaW4gdGhpcyBpbnRvIHRoZSB3b3JkcywgYnV0IG9uY2UgeW91IHdpbGwKLQkgKiBzZWUsIHlvdSB3aWxsIHVuZGVyc3RhbmQgaXQgOikgTWFueSBCaURpIEhUTUwvSlNQcyB1c2UgSVNPLTg4NTktOC1JIGluCi0JICogTUVUQS9wYWdlIGRpcmVjdGl2ZS4gU28gV1NBRCBuZWVkcyB0byBzdXBwb3J0IHRoaXMgZW5jb2RpbmcuCi0JICogPC9wPgotCSAqIDxsaT5YLVNKSVM8L2xpPgotCSAqIDxwPgotCSAqIEJlY2F1c2UgTW9zYWljL05hdmlnYXRvciAyLjAgc3VwcG9ydGVkIG9ubHkgWC1TSklTL1gtRVVDLUpQLCBsb3RzIG9mCi0JICogb2xkIEhUTUwgZmlsZXMgdXNlZCBYLVNKSVMvWC1FVUMtSlAgc28gdGhhdCB0aGUgY3VzdG9tZXJzIHN0aWxsIHdhbnQgdXMKLQkgKiB0byBzdXBwb3J0IHRoaXMgY29kZSBjb252ZXJzaW9uIGZvciBIVE1MIGZpbGVzLgotCSAqIDwvcD4KLQkgKiA8L3VsPgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybiB0aGUgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgaWYgbm8gb3ZlcnJpZGVzLCBvdGhlcndpc2UgdGhlIGNoYXJzZXQKLQkgKiAgICAgICAgIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKi8KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWxpYmVyYXRseSAnZGVmYXVsdCBhY2Nlc3MnIHNpbmNlIGNsaWVudHMgc2hvdWxkIG5vdAotCSAqIG5lZWQgdG8gYWNjZXNzIHRoaXMgaW5mb3JtYXRpb24gZGlyZWN0bHkuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdoYXQgd2FzIHBhc3NlZCBpbiwgaWYKLQkJLy8gdGhlcmUgYXJlIG5vCi0JCS8vIG92ZXJyaWRlcy4KLQkJU3RyaW5nIHJlc3VsdCA9IGRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JCVN0cmluZyBuZXdSZXN1bHQgPSBnZXRPdmVycmlkZW5DaGFyc2V0cygpLmdldFByb3BlcnR5KGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQlpZiAobmV3UmVzdWx0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IG5ld1Jlc3VsdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbmNvZGluZ01lbWVudG8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGJ5dGVbXSBkZXRlY3RlZEJvbSwgU3RyaW5nIGphdmFDaGFyc2V0TmFtZSwgU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyB1blN1cHBvcnRlZE5hbWUsIFN0cmluZyBzcGVjRGVmYXVsdEVuY29kaW5nLCBTdHJpbmcgcmVhc29uKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCXJlc3VsdC5zZXRKYXZhQ2hhcnNldE5hbWUoamF2YUNoYXJzZXROYW1lKTsKLQkJcmVzdWx0LnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJaWYgKHNwZWNEZWZhdWx0RW5jb2RpbmcgPT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRBcHByb3ByaWF0ZURlZmF1bHQoTk9fU1BFQ19ERUZBVUxUKTsKLQkJZWxzZQotCQkJcmVzdWx0LnNldEFwcHJvcHJpYXRlRGVmYXVsdChzcGVjRGVmYXVsdEVuY29kaW5nKTsKLQkJaWYgKHVuU3VwcG9ydGVkTmFtZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0SW52YWxpZEVuY29kaW5nKHVuU3VwcG9ydGVkTmFtZSk7Ci0JCX0KLQkJLy8gY2hlY2sgaWYgdmFsaWQKLQkJdHJ5IHsKLQkJCUNoYXJzZXQuaXNTdXBwb3J0ZWQoamF2YUNoYXJzZXROYW1lKTsKLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5zZXRJbnZhbGlkRW5jb2RpbmcoamF2YUNoYXJzZXROYW1lKTsKLQkJfQotCi0JCS8vIGNoZWNrIFVURjgzQnl0ZUJPTVVzZWQgYW5kIFVuaWNvZGVTdHJlYW0KLQkJaWYgKGRldGVjdGVkQm9tICE9IG51bGwpIHsKLQkJCWlmIChkZXRlY3RlZEJvbS5sZW5ndGggPT0gMikKLQkJCQlyZXN1bHQuc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCWVsc2UgaWYgKGRldGVjdGVkQm9tLmxlbmd0aCA9PSAzKQotCQkJCXJlc3VsdC5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQkJcmVzdWx0LnNldFVuaWNvZGVCT00oZGV0ZWN0ZWRCb20pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJcmV0dXJuIGNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW5jb2RpbmdNZW1lbnRvIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQlyZXR1cm4gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUsIHJlYXNvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24sIFN0cmluZyBzcGVjRGVmYXVsdEVuY29kaW5nKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCXJlc3VsdCA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJU3RyaW5nIGphdmFDaGFyc2V0ID0gZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJcmVzdWx0LnNldEphdmFDaGFyc2V0TmFtZShqYXZhQ2hhcnNldCk7Ci0JCXJlc3VsdC5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWlmIChzcGVjRGVmYXVsdEVuY29kaW5nID09IG51bGwpCi0JCQlyZXN1bHQuc2V0QXBwcm9wcmlhdGVEZWZhdWx0KE5PX1NQRUNfREVGQVVMVCk7Ci0JCWVsc2UKLQkJCXJlc3VsdC5zZXRBcHByb3ByaWF0ZURlZmF1bHQoc3BlY0RlZmF1bHRFbmNvZGluZyk7Ci0JCS8vIGNoZWNrIGlmIHZhbGlkCi0JCXRyeSB7Ci0JCQlDaGFyc2V0LmlzU3VwcG9ydGVkKGphdmFDaGFyc2V0KTsKLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5zZXRJbnZhbGlkRW5jb2RpbmcoamF2YUNoYXJzZXQpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJLy8gd2UgZG9uJ3QgYWxsb3cgbnVsbCBhcmd1bWVudCAob3IgcmlzayBOUEUgb3IKLQkJLy8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGxhdGVyIGF0IHNldmVyYWwKLQkJLy8gcG9pbnRzLgotCQlBc3NlcnQuaXNOb3ROdWxsKGRldGVjdGVkQ2hhcnNldE5hbWUsICJpbGxlZ2FsIGNoYXJzZXQgYXJndW1lbnQuIGl0IGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBkZXRlY3RlZENoYXJzZXROYW1lOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCS8vIE5vdGU6IHRoaXMgd2lsbCBpbW1lZGlhdGx5IHRocm93Ci0JCS8vICJVbnN1cHBvdGVkQ2hhcnNldEV4Y2VwdGlvbiIgaWYgaXQKLQkJLy8gaW52YWxpZC4gSXNzdWU6IElzIGl0IG1vcmUgY2xpZW50IGZyaWVuZGx5IHRvCi0JCS8vIGVhdCB0aGF0IGV4Y2VwdGlvbiBhbmQgcmV0dXJuIG51bGw/Ci0JCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKHJlc3VsdCk7Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG92ZXJyaWRlbkNoYXJzZXRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZ2V0T3ZlcnJpZGVuQ2hhcnNldHMoKSB7Ci0JCWlmIChvdmVycmlkZW5DaGFyc2V0cyA9PSBudWxsKSB7Ci0JCQlvdmVycmlkZW5DaGFyc2V0cyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlCdW5kbGUga2V5QnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKElDb2RlZFJlc291cmNlUGx1Z2luLklEKTsKLQkJCUlQYXRoIGtleVBhdGggPSBuZXcgUGF0aCgiY29uZmlnL292ZXJyaWRlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJVVJMIGxvY2F0aW9uID0gUGxhdGZvcm0uZmluZChrZXlCdW5kbGUsIGtleVBhdGgpOwotCQkJSW5wdXRTdHJlYW0gcHJvcGVydGllc0lucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcHJvcGVydGllc0lucHV0U3RyZWFtID0gbG9jYXRpb24ub3BlblN0cmVhbSgpOwotCQkJCW92ZXJyaWRlbkNoYXJzZXRzLmxvYWQocHJvcGVydGllc0lucHV0U3RyZWFtKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBjYW4ndCByZWFkLCBqdXN0IGFzc3VtZSB0aGVyZSdzIG5vCi0JCQkJLy8gb3ZlcnJpZGVzCi0JCQkJLy8gYW5kIHJlcGVhdGVkIGF0dGVtcHRzIHdpbGwgbm90IG9jY3VyLAotCQkJCS8vIHNpbmNlIHRoZXkKLQkJCQkvLyB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IGFuIGVtcHR5Ci0JCQkJLy8gUHJvcGVydGllcyBvYmplY3QKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3ZlcnJpZGVuQ2hhcnNldHM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjbGFzcyBuZWVkIG5vdCBiZSBpbnN0YW50aWF0ZWQgKHRob3VnaCBpdHMgc3ViY2xhc3NlcyBjYW4gYmUpLgotCSAqLwotCXByb3RlY3RlZCBDb2RlZElPKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBFbmNvZGluZ01lbWVudG8gY3JlYXRlTWVtZW50byhJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbikgewotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0OwotCQlTdHJpbmcgYXBwcm9wcmlhdGVEZWZhdWx0ID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZ2V0RGVmYXVsdENoYXJzZXQoKTsKLQkJU3RyaW5nIGRldGVjdGVkQ2hhcnNldCA9IChTdHJpbmcpIGNvbnRlbnREZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCk7Ci0JCVN0cmluZyB1blN1cHBvcnRlZENoYXJzZXQgPSAoU3RyaW5nKSBjb250ZW50RGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpOwotCQlTdHJpbmcgamF2YUNoYXJzZXQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q2hhcnNldCgpOwotCQkvLyBpbnRlZ3JpdHkgY2hlY2tzIGZvciBkZWJ1Z2dpbmcKLQkJaWYgKGphdmFDaGFyc2V0ID09IG51bGwpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJjaGFyc2V0IGVxdWFsZWQgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGphdmFDaGFyc2V0Lmxlbmd0aCgpID09IDApIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJjaGFyc2V0IGVxdWFsZWQgZW1wdHlTdHJpbmchIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlieXRlW10gQk9NID0gKGJ5dGVbXSkgY29udGVudERlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJLy9yZXN1bHQgPSAoRW5jb2RpbmdNZW1lbnRvKQotCQkvLyBjb250ZW50RGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8pOwotCQlyZXN1bHQgPSBjcmVhdGVFbmNvZGluZ01lbWVudG8oQk9NLCBqYXZhQ2hhcnNldCwgZGV0ZWN0ZWRDaGFyc2V0LCB1blN1cHBvcnRlZENoYXJzZXQsIGFwcHJvcHJpYXRlRGVmYXVsdCwgbnVsbCk7Ci0JCWlmICghcmVzdWx0LmlzVmFsaWQoKSkgewotCQkJcmVzdWx0LnNldEFwcHJvcHJpYXRlRGVmYXVsdChhcHByb3ByaWF0ZURlZmF1bHQpOwotCQkJLy8gaW50ZWdyaXR5IGNoZWNrIGZvciBkZWJ1Z2dpbmcgImludmFsaWQiIGNhc2VzLgotCQkJLy8gdGhlIGFwcHJyaWF0ZSBkZWZhdWx0IHdlIGhhdmUsIHNob3VsZCBlcXVhbCB3aGF0J3MgaW4gdGhlCi0JCQkvLyBkZXRlY3RlZCBmaWVsZC4gKG5vdCBzdXJlIHRoaXMgaXMgYWx3YXlzIHJlcXVpcmVkKQotCQkJaWYgKERFQlVHICYmIGFwcHJvcHJpYXRlRGVmYXVsdCAhPSBudWxsICYmICFhcHByb3ByaWF0ZURlZmF1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldCkpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiYXBwcm9wcmlhdGUgZGlkIG5vdCBlcXVhbCBkZXRlY3RlZCwgYXMgZXhwZWN0ZWQgZm9yIGludmFsaWQgY2hhcnNldCBjYXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRSZWFkZXJDcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkUmVhZGVyQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTVjY2RiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRSZWFkZXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkJ1ZmZlcmVkTGltaXRlZFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuTnVsbElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLlVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zLlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci0KLQotLyoqCi0gKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGNlbnRyYWxpemUgYW5hbHlzaXMgb2YgYSBmaWxlIHRvIGRldGVybWluZQotICogdGhlIG1vc3QgYXBwcm9wcmlhdGUgcnVsZXMgb2YgZGVjb2RpbmcgaXQuIFRoZSBpbnRlbmRlZCB1c2UgaXMgdG8gc2V0IHRoZQotICogaW5wdXQsIHRoZW4gZ2V0IHRoZSByZWFkZXIgZm9yIHRoYXQgaW5wdXQgd2hpY2ggd2lsbCBoYXZlIGl0cyBlbmNvZGluZyBzZXQKLSAqIGFwcHJvcHJpYXRlbHkuIEFkZGl0aW9uYWxseSwgdGhlcmUgaXMgYW4gRW5jb2RpbmdNZW1lbnRvIHByb3ZpZGVkLCB3aGljaAotICogd2lsbCBiZSByZXF1aXJlZCwgaW4gc29tZSBjYXNlcywgdG8gbGF0ZXIgZGV0ZXJtaW5lIHRoZSBtb3N0IGFwcHJvcHJpYXRlCi0gKiBmb3JtIG9mIGVuY29kZWQgb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgQ29kZWRSZWFkZXJDcmVhdG9yIGV4dGVuZHMgQ29kZWRJTyB7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBmQ2xpZW50U3VwcGxpZWRTdHJlYW07Ci0KLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIEVuY29kaW5nUnVsZSBmRW5jb2RpbmdSdWxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkZpbGVuYW1lOwotCi0JcHJpdmF0ZSBJRmlsZSBmSUZpbGU7Ci0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUX1VURl8xNj0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUlNFVF9VVEZfMTZMRT0gIlVURi0xNkxFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIENvZGVkUmVhZGVyQ3JlYXRvcigpIHsKLQotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb2RlZFJlYWRlckNyZWF0b3IoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQl0aGlzKCk7Ci0JCXNldChmaWxlKTsKLQkJc2V0RW5jb2RpbmdSdWxlKEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQl9Ci0KLQlwdWJsaWMgQ29kZWRSZWFkZXJDcmVhdG9yKElGaWxlIGZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJdGhpcygpOwotCQlzZXQoZmlsZSk7Ci0JCXNldEVuY29kaW5nUnVsZShlbmNvZGluZ1J1bGUpOwotCX0KLQotCXB1YmxpYyBDb2RlZFJlYWRlckNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCi0JCXRoaXMoKTsKLQkJc2V0KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCXNldEVuY29kaW5nUnVsZShFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JfQotCi0JcHVibGljIENvZGVkUmVhZGVyQ3JlYXRvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB7Ci0KLQkJdGhpcygpOwotCQlzZXQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJc2V0RW5jb2RpbmdSdWxlKGVuY29kaW5nUnVsZSk7Ci0JfQotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gY2hlY2tGb3JFbmNvZGluZ0luQ29udGVudHMoSW5wdXRTdHJlYW0gbGltaXRlZFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gaWYgZW5jb2RpbmcgbWVtZW50byBhbHJlYWR5IHNldCwgdGhlbiBpRmlsZSBtdXN0Ci0JCS8vIGhhdmUgYmVlbiBzZXQsIGFuZCBubyBuZWVkIHRvIGdldCBhZ2Fpbi4KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChmQ2xpZW50U3VwcGxpZWRTdHJlYW0pIHsKLQkJCQl0cnkgewotCQkJCQlsaW1pdGVkU3RyZWFtLnJlc2V0KCk7Ci0JCQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gY29udGVudFR5cGVNYW5hZ2VyLmdldERlc2NyaXB0aW9uRm9yKGxpbWl0ZWRTdHJlYW0sIGZGaWxlbmFtZSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCWZFbmNvZGluZ01lbWVudG8gPSBjcmVhdGVNZW1lbnRvKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWxpbWl0ZWRTdHJlYW0ucmVzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHN0YXRlOgotCQkJCS8vIGVuY29kaW5nTWVtZW50byB3YXMgbnVsbCBidXQgbm8gaW5wdXQgc3RyZWFtIHN1cHBsaWVkIGJ5Ci0JCQkJLy8gY2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNWYWxpZCgpICYmICFmb3JjZURlZmF1bHQoKSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwocmVzdWx0KTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gY2hlY2tTdHJlYW1Gb3JCT00oSW5wdXRTdHJlYW0gcmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yIHVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yID0gbmV3IFVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yKCk7Ci0JCXVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yLnNldChyZXNldHRhYmxlTGltaXRlZFN0cmVhbSk7Ci0JCXJlc3VsdCA9IHVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmaW5kTWVtZW50b0Zyb21GaWxlQ2FzZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBUaGlzIG1ldGhvZCBwcm92aWRlcyBwb3NzaWJsZSBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhdCB0aGUKLQkJCS8vIGNvc3Qgb2Ygc29tZXRpbWVzIHJldHVybmluZyBudWxsCi0JCQlpZiAoZklGaWxlLmV4aXN0cygpKQotCQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IGZJRmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBBc3N1bWUgaWYgY29yZSBleGNlcHRpb24gb2NjdXJzLCB3ZSBjYW4gc3RpbGwgdHJ5IG1vcmUKLQkJCS8vIGV4cGVuc2l2ZQotCQkJLy8gZGlzY292ZXJ5IG9wdGlvbnMuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCAmJiBmSUZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY29udGVudHMgPSBmSUZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihjb250ZW50cywgZklGaWxlLmdldE5hbWUoKSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQkvLyBBc3N1bWUgaWYgY29yZSBleGNlcHRpb24gb2NjdXJzLCB3ZSBjYW4ndCByZWFsbHkgZG8gbXVjaAotCQkJCS8vIHdpdGgKLQkJCQkvLyBkZXRlcm1pbmluZyBlbmNvZGluZywgZXRjLgotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJCXRocm93IGUxOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJLy8gV2UgbGlrZWx5IGNvdWxkbid0IGdldCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUsIHNvbWV0aGluZwotCQkJCS8vIGlzIHJlYWxseSB3cm9uZwotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXRocm93IGUyOwotCQkJfQotCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlTWVtZW50byhjb250ZW50RGVzY3JpcHRpb24pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSBtZXRob2Qgd2hpY2ggY29udGFpbnMgdGhlIGhpZ2hlc3QgbGV2ZWwgcnVsZXMgZm9yIGhvdyB0bwotCSAqIGRlY2lkZSBhcHByb3ByaWF0ZSBkZWNvZGluZyBydWxlczogMS4gZmlyc3QgY2hlY2sgZm9yIHVuaWNvZGUgc3RyZWFtIDIuCi0JICogdGhlbiBsb29rZWQgZm9yIGVuY29kaW5nIHNwZWNpZmllZCBpbiBjb250ZW50IChhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YKLQkgKiBjb250ZW50IHRoYXQgaXMgaXQgLi4uIHhtbCwgaHRtbCwganNwLCBldGMuIDMuIHRoZW4gY2hlY2sgZm9yIHZhcmlvdXMKLQkgKiBzZXR0aW5nczogZmlsZSBzZXR0aW5ncyBmaXJzdCwgaWYgbnVsbCBjaGVjayBwcm9qZWN0IHNldHRpbmdzLCBpZiBudWxsLAotCSAqIGNoZWNrIHVzZXIgcHJlZmVyZW5jZXMuIDQuIGxhc3RseSAob3IsIHdoYXQgaXMgdGhlIGxhc3QgdXNlcgotCSAqIHByZWZlcmVuY2UpIGlzIHRvIHVzZSAid29ya2JlbmNoIGRlZmF1bHRzIi4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZmluZE1lbWVudG9Gcm9tU3RyZWFtQ2FzZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc2V0dGFibGVMaW1pdGVkU3RyZWFtID0gZ2V0TGltaXRlZFN0cmVhbShnZXRSZXNldHRhYmxlU3RyZWFtKCkpOwotCQkJaWYgKHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtICE9IG51bGwpIHsKLQkJCQkvLyBmaXJzdCBjaGVjayBmb3IgdW5pY29kZSBzdHJlYW0KLQkJCQlyZXN1bHQgPSBjaGVja1N0cmVhbUZvckJPTShyZXNldHRhYmxlTGltaXRlZFN0cmVhbSk7Ci0JCQkJLy8gaWYgbm90IHRoYXQsIHRoZW4gY2hlY2sgY29udGVudHMKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0ucmVzZXQoKTsKLQkJCQkJcmVzdWx0ID0gY2hlY2tGb3JFbmNvZGluZ0luQ29udGVudHMocmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gc3RyZWFtIG51bGwsIG1heSBuYW1lJ3Mgbm90LgotCQkJCWlmIChmRmlsZW5hbWUgIT0gbnVsbCkgewotCQkJCQkvLyBmaWxlbmFtZSBub3QgbnVsbAotCQkJCQlJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXREZXNjcmlwdGlvbkZvcihuZXcgTnVsbElucHV0U3RyZWFtKCksIGZGaWxlbmFtZSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGNyZWF0ZU1lbWVudG8oY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChyZXNldHRhYmxlTGltaXRlZFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaGFuZGxlU3RyZWFtQ2xvc2UocmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlRGVmYXVsdCgpIHsKLQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZkVuY29kaW5nUnVsZSAhPSBudWxsICYmIGZFbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBSZWFkZXIgZ2V0Q29kZWRSZWFkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCVJlYWRlciByZXN1bHQgPSBudWxsOwotCQkvLyB3ZSBtYWtlIGEgbG9jYWwgY29weSBvZiBlbmNvZGluZyBtZW1lbnRvIHNvCi0JCS8vIHN0cmVhbSB3b24ndAotCQkvLyBiZSBhY2Nlc3NlZCBzaW11bHRhbmVvdXNseS4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IGdldEVuY29kaW5nTWVtZW50bygpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGVuY29kaW5nTWVtZW50bywgIkFwcGVhcnMgcmVhZGVyIHJlcXVlc3RlZCBiZWZvcmUgZmlsZSBvciBzdHJlYW0gc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJSW5wdXRTdHJlYW0gc3RyZWFtVG9SZXR1cm4gPSBnZXRSZXNldHRhYmxlU3RyZWFtKCk7Ci0JCXN0cmVhbVRvUmV0dXJuLnJlc2V0KCk7Ci0JCS8vIGlmIFVURiAzIGJ5dGUgQk9NIGlzIHVzZWQgKG9yIFVURi0xNkxFKSwgdGhlCi0JCS8vIGJ1aWx0IGluIGNvbnZlcnRlcnMKLQkJLy8gZG9uJ3QKLQkJLy8gY29ycmVjdCBza2lwIGFsbCB0aHJlZSBieXRlcyAuLi4gc28gc2tpcAotCQkvLyByZW1haW5pbmcgb25lIHRvIGxlYXZlCi0JCS8vIHN0cmVhbSB0cmFuc3BhcmVudGx5IHJlYWR5IGZvciBjbGllbnQuCi0JCS8vIHNlZSAuLi4gVE9ETyBsb29rIHVwIGJ1ZyBudW1iZXIKLQkJaWYgKGVuY29kaW5nTWVtZW50by5pc1VuaWNvZGVTdHJlYW0oKSkgewotCQkJc3RyZWFtVG9SZXR1cm4uc2tpcCgyKTsKLQkJfQotCQllbHNlIGlmIChlbmNvZGluZ01lbWVudG8uaXNVVEY4M0J5dGVCT01Vc2VkKCkpIHsKLQkJCXN0cmVhbVRvUmV0dXJuLnNraXAoMyk7Ci0JCX0KLQkJU3RyaW5nIGNoYXJzZXROYW1lID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCQlpZiAoY2hhcnNldE5hbWUgPT0gbnVsbCkgewotCQkJY2hhcnNldE5hbWUgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQl9Ci0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSAmJiAhZm9yY2VEZWZhdWx0KCkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsKGVuY29kaW5nTWVtZW50byk7Ci0JCX0KLQotCQlpZiAoZkVuY29kaW5nUnVsZSA9PSBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCkgewotCQkJY2hhcnNldE5hbWUgPSBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCk7Ci0JCX0KLQkJCi0JCS8vIFsyMjgzNjZdIEZvciBmaWxlcyB0aGF0IGhhdmUgYSB1bmljb2RlIEJPTSwgYW5kIGEgY2hhcnNldCBuYW1lIG9mIFVURi0xNiwgdGhlIGNoYXJzZXQgZGVjb2RlciBuZWVkcyAiVVRGLTE2TEUiCi0JCWlmKENIQVJTRVRfVVRGXzE2LmVxdWFscyhjaGFyc2V0TmFtZSkgJiYgZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKSA9PSBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZMRSkKLQkJCWNoYXJzZXROYW1lID0gQ0hBUlNFVF9VVEZfMTZMRTsKLQkJCi0JCUNoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShjaGFyc2V0TmFtZSk7Ci0JCUNoYXJzZXREZWNvZGVyIGNoYXJzZXREZWNvZGVyID0gY2hhcnNldC5uZXdEZWNvZGVyKCk7Ci0JCWlmIChmRW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikgewotCQkJY2hhcnNldERlY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQkJCWNoYXJzZXREZWNvZGVyLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBMQUNFKTsKLQkJfQotCQllbHNlIHsKLQkJCWNoYXJzZXREZWNvZGVyLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKLQkJCWNoYXJzZXREZWNvZGVyLm9uVW5tYXBwYWJsZUNoYXJhY3RlcihDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQl9Ci0JCS8vIG1vcmUgZWZmaWNpZW50IHRvIGJlIGJ1ZmZlcmVkLCBhbmQgSSBrbm93IG9mIG5vCi0JCS8vIHJlYXNvbiBub3QgdG8gcmV0dXJuCi0JCS8vIHRoYXQgZGlyZWN0bHkuCi0JCXJlc3VsdCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtVG9SZXR1cm4sIGNoYXJzZXREZWNvZGVyKSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXN1bHQubWFyayhDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyBmaWd1cmUgb3V0IGVuY29kaW5nIG1lbWVudG8gZnJvbSBlbmNvZGluZyBzdHJhdGVneQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQlpZiAoZkNsaWVudFN1cHBsaWVkU3RyZWFtKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50byA9IGZpbmRNZW1lbnRvRnJvbVN0cmVhbUNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50byA9IGZpbmRNZW1lbnRvRnJvbUZpbGVDYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiBlbmNvZGluZyBzdHJhdGFneSBkb2Vzbid0IHByb3ZpZGUgYW5zd2VyLAotCQkvLyB0aGVuIHRyeSBmaWxlIHNldHRpbmdzLCBwcm9qZWN0IHNldHRpbmdzLAotCQkvLyB1c2VyIHByZWZlcmVuY2VzLCBhbmQKLQkJLy8gZmluYWxseSB3b3JrYmVuY2ggZGVmYXVsdC4KLQkJLy8KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCB8fCBmRW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpOwotCQl9Ci0KLQkJLy8gdXNlIERlZmF1bHROYW1lUnVsZXMgZnJvbSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzIGFzIHRoZSBmaW5hbAotCQkvLyBkZWZhdWx0Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBoYW5kbGVOb3RQcm92aWRlZEZyb21Db250ZW50Q2FzZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSB3aGVuIGVuY29kaW5nIGlzIG5vdCBkZXRlY3RlZCBpbiB0aGUgZmlsZS4KLQkgKiAKLQkgKiBIZXJlIGlzIGVuY29kaW5nIGxvb2t1cCBvcmRlciB3ZSB3aWxsIHRyeTogLSB0cnkgcmVzb3VyY2UgY29udGVudAotCSAqIGRlc2NyaXB0aW9uIChFY2xpcHNlIFRleHQgZmlsZSBlbmNvZGluZykgLSB0cnkgcmVzb3VyY2UgY29udGVudAotCSAqIHByb3BlcnRpZXMgKGZvciBKU1Agb25seSkgLSB0cnkgY29udGVudCB0eXBlIGVuY29kaW5nIHByZWZlcmVuY2VzIChmb3IKLQkgKiBIVE1MIG9ubHkpIC0gdHJ5IHJlc291cmNlIGNvbnRlbnQgZGVzY3JpcHRpb24gKEVjbGlwc2UgVGV4dCBmaWxlCi0JICogZW5jb2RpbmcsIGltcGxpY2l0IGNoZWNrKQotCSAqIAotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGFwcGVhcnMgaW4gYm90aCBDb2RlZFJlYWRlckNyZWF0b3IgYW5kCi0JICogQ29kZWRTdHJlYW1DcmVhdG9yICh3aXRoIGp1c3QgYSBtaW5vciBkaWZmZXJlbmNlKS4gVGhleSBzaG91bGQgYmUga2VwdAotCSAqIHRoZSBzYW1lLgotCSAqLwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50b0Zyb21SZXNvdXJjZUFuZFByZWZlcmVuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gZkVuY29kaW5nTWVtZW50bzsKLQotCQkvLyBGb2xsb3cgRWNsaXBzZSBQbGF0Zm9ybSdzIGRpcmVjdGlvbi4gR2V0IHRoZSBjaGFyc2V0IGZyb20gSUZpbGUuCi0JCWlmIChmSUZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNoYXJzZXQgPSBmSUZpbGUuZ2V0Q2hhcnNldCgpOwotCQkJZW5jb2RpbmdNZW1lbnRvID0gQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCk7Ci0JCX0KLQotCQlyZXR1cm4gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCBhbiBJbnB1dFN0cmVhbSBoYXMgbWFyay9yZXNldCBzdXBwb3J0LCBpcyByZWFkbGltaXQgaXMKLQkgKiBzZXQsIGFuZCB0aGF0IHRoZSBzdHJlYW0gaXMgImxpbWl0YWJsZSIgKHRoYXQgaXMsIHJlcG9ydHMgImVuZCBvZgotCSAqIGlucHV0IiByYXRoZXIgdGhhbiBhbGxvdyBnb2luZyBwYXN0IG1hcmspLiBUaGlzIGlzIHZlcnkgc3BlY2lhbGl6ZWQKLQkgKiBzdHJlYW0gaW50cm9kdWNlZCB0byBvdmVyY29tZQotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzIxMS4gU2VlIGFsc28KLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njg1NjUKLQkgKi8KLQlwcml2YXRlIElucHV0U3RyZWFtIGdldExpbWl0ZWRTdHJlYW0oSW5wdXRTdHJlYW0gb3JpZ2luYWwpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9yaWdpbmFsIGluc3RhbmNlb2YgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKQotCQkJcmV0dXJuIG9yaWdpbmFsOwotCQlJbnB1dFN0cmVhbSBzID0gbmV3IEJ1ZmZlcmVkTGltaXRlZFN0cmVhbShvcmlnaW5hbCwgQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJcy5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXJldHVybiBzOwotCX0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0UmVzZXR0YWJsZVN0cmVhbSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG51bGw7Ci0KLQkJaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIG5vdGUgd2UgYWx3YXlzIGdldCBjb250ZW50cywgZXZlbiBpZiBvdXQgb2Ygc3luY2gKLQkJCQlpbnB1dFN0cmVhbSA9IGZJRmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTSE9VTEQgYWN0dWFsbHkgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZgotCQkJCS8vIGZJU3RvcmFnZSwgYnV0Ci0JCQkJLy8gZm9yIG5vdyB3aWxsIGp1c3QgYXNzdW1lIGNvcmUgZXhjZXB0aW9uCi0JCQkJLy8gbWVhbnMgaXQKLQkJCQkvLyBkb2Vzbid0IGV4aXN0IG9uIGZpbGUgc3lzdGVtLCB5ZXQuCi0JCQkJLy8gYW5kIHdlJ2xsIGxvZywganVzdCBpbiBjYXNlIGl0cyBhIG5vdGVhYmxlIGVycm9yCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQlpbnB1dFN0cmVhbSA9IG5ldyBOdWxsSW5wdXRTdHJlYW0oKTsKLQkJCX0KLQkJCXJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGZJbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaWYgKGZJbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCQkJcmVzZXR0YWJsZVN0cmVhbSA9IGZJbnB1dFN0cmVhbTsKLQkJCQkJLy8gdHJ5IHsKLQkJCQkJcmVzZXR0YWJsZVN0cmVhbS5yZXNldCgpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIC8vIGFzc3VtZWQganVzdCBoYXNuJ3QgYmVlbiBtYXJrZWQgeWV0LCBzbyBpZ25vcmUKLQkJCQkJLy8gfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZJbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyZXNldHRhYmxlU3RyZWFtID09IG51bGwpIHsKLQkJCXJlc2V0dGFibGVTdHJlYW0gPSBuZXcgTnVsbElucHV0U3RyZWFtKCk7Ci0JCX0KLQotCQkvLyBtYXJrIHRoaXMgb25jZSwgc3RyZWFtIGF0ICJ6ZXJvIiBwb3NpdGlvbgotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCXJldHVybiByZXNldHRhYmxlU3RyZWFtOwotCX0KLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGhhbmRsZU5vdFByb3ZpZGVkRnJvbUNvbnRlbnRDYXNlKCkgewotCi0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgc3BlY0RlZmF1bHQgPSBudWxsOwotCQkvLyB0cnkgewotCQkvLyBzcGVjRGVmYXVsdCA9IGdldEVuY29kaW5nRGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCS8vIH0KLQkJLy8gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkvLyAvLyBJZiB0aGlzIGV4Y2VwdGlvbiBvY2N1cnMsIGFzc3VtZXMgdGhlcmUgaXMKLQkJLy8gLy8gbm8gc3BlY0RlZmF1bHQKLQkJLy8gfQotCQkvLyBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkvLyAvLyBJZiB0aGlzIGV4Y2VwdGlvbiBvY2N1cnMsIGFzc3VtZXMgdGhlcmUgaXMKLQkJLy8gLy8gbm8gc3BlY0RlZmF1bHQKLQkJLy8gfQotCQkvLyBmaW5hbGx5IHsKLQkJLy8gdHJ5IHsKLQkJLy8gaGFuZGxlU3RyZWFtQ2xvc2UoZkVuY29kaW5nRGV0ZWN0b3JTdHJlYW0pOwotCQkvLyB9Ci0JCS8vIGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkvLyAvLyBzZXZlcmUgZXJyb3IsIG5vdCBtdWNoIHRvIGRvIGhlcmUKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHRoaXMgbG9naWMgc2hvdWxkIGJlIG1vdmVkIHRvICdkZXRlY3Rpb24nIGlmIG5vdCBhbHJlYWR5Ci0JCVN0cmluZyBjaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKHNwZWNEZWZhdWx0KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjaGFyc2V0LCAicG9zdCBjb25kaXRpb24gZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0ID0gQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc2V0dGFibGVJbnB1dFN0cmVhbQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3RyZWFtQ2xvc2UoSW5wdXRTdHJlYW0gcmVzZXR0YWJsZUlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWlmIChyZXNldHRhYmxlSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJaWYgKGZDbGllbnRTdXBwbGllZFN0cmVhbSkgewotCQkJCXJlc2V0dGFibGVJbnB1dFN0cmVhbS5yZXNldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0KLQkJCQlyZXNldHRhYmxlSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIFRPRE8gV2UganVzdCBjb3B5IHRoZSBjb250ZW50IHByb3BlcnRpZXMgZW5jb2RpbmcgdG8gY3VycmVudCByZXNvdXJjZSdzCi0JLy8gZW5jb2RpbmcgZm9yIG5vdy4gTWF5IGltcHJvdmUgdGhlIFVJIGxhdGVyIGJ5IHNldHRpbmcgYW4gaW5mb3JtYXRpb25hbAotCS8vIG1lc3NhZ2UgYW5kL29yIGRpc2FibGUgdGhlIGNvbnRlbnQgcHJvcGVydGllcyBlbmNvZGluZyBmaWVsZC4KLQkvLyBUT0RPOiByZW1ha2UgcHJpdmF0ZSBlbHNlIHJlbW92ZQotCXZvaWQgbWlncmF0ZUNvbnRlbnRQcm9wZXJ0aWVzRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElGaWxlIGZpbGUgPSBmSUZpbGU7Ci0JCWZpbmFsIFN0cmluZyBjaGFyc2V0ID0gZW5jb2Rpbmc7Ci0JCS8vIFRPRE86IGV4dGVybmFsaXplIHN0cmluZyBsYXRlcgotCQlKb2IgbWlncmF0ZXIgPSBuZXcgSm9iKFNTRUNvcmVNZXNzYWdlcy5NaWdyYXRlX0NoYXJzZXQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZpbGUuc2V0Q2hhcnNldChjaGFyc2V0LCBudWxsKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQltaWdyYXRlci5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCW1pZ3JhdGVyLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCi0JCWZFbmNvZGluZ1J1bGUgPSBudWxsOwotCQlmSUZpbGUgPSBudWxsOwotCQlmRmlsZW5hbWUgPSBudWxsOwotCQlmSW5wdXRTdHJlYW0gPSBudWxsOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQkJZkNsaWVudFN1cHBsaWVkU3RyZWFtID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiaWxsZWdhbCBhcmd1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCXJlc2V0QWxsKCk7Ci0JCWZJRmlsZSA9IGlGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0KLQkJcmVzZXRBbGwoKTsKLQkJZkZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCWZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlmQ2xpZW50U3VwcGxpZWRTdHJlYW0gPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nUnVsZShFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB7Ci0KLQkJZkVuY29kaW5nUnVsZSA9IGVuY29kaW5nUnVsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkU3RyZWFtQ3JlYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZFN0cmVhbUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxMjI0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkU3RyZWFtQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5DaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zLlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci0KLQotcHVibGljIGNsYXNzIENvZGVkU3RyZWFtQ3JlYXRvciBleHRlbmRzIENvZGVkSU8gewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOSVRJQUxfQlVGRkVSX1NJWkUgPSAxMDI0ICogMTY7Ci0KLQkvLyB0aGUgMzIgYnl0ZXMgdXNlZCBieSBkZWZhdWx0IGJ5IEJ5dGVPdXRwdXRTdHJlYW0gaXMKLQkvLyBhIGxpdHRsZSBzbWFsbAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9HUkFNX0VSUk9SX19GQUlMRURfVE9fRklORF9BTllfQ0hBUlNFVF9BTllXSEVSRV8gPSAiUHJvZ3JhbSBlcnJvcjogZmFpbGVkIHRvIGZpbmQgYW55IGNoYXJzZXQgYW55d2hlcmUhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNkJFX0NIQVJTRVRfTkFNRSA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2TEVfQ0hBUlNFVF9OQU1FID0gIlVURi0xNkxFIjsgLy8kTk9OLU5MUy0xJAotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTZfQ0hBUlNFVF9OQU1FID0gIlVURi0xNiI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84X0NIQVJTRVRfTkFNRSA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBmQ2xpZW50U3VwcGxpZWRSZWFkZXI7Ci0KLQkvLyBmdXR1cmVfVE9ETzogdGhpcyAnY2hlY2tDb252ZXJzaW9uJyBjYW4gYmUgYSBsaXR0bGUKLQkvLyBwcmljZXkgZm9yIGxhcmdlCi0JLy8gZmlsZXMsIGNob3VsZCBiZSBhIHVzZXIgcHJlZmVyZW5jZSwgb3Igc29tZXRoaW5nLgotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2hlY2tDb252ZXJzaW9uID0gdHJ1ZTsKLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmQ3VycmVudEVuY29kaW5nTWVtZW50bzsKLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIFN0cmluZyBmRmlsZW5hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkhhc0JlZW5BbmFseXplZDsKLQotCXByaXZhdGUgSUZpbGUgZklGaWxlOwotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJpdmF0ZSBSZWFkZXIgZlJlYWRlcjsKLQotCXByaXZhdGUgUmVhZGVyIGZSZXNldHRhYmxlUmVhZGVyOwotCXByaXZhdGUgYnl0ZVtdIFVURjE2QkVCT00gPSBuZXcgYnl0ZVtdeyhieXRlKSAweEZFLCAoYnl0ZSkgMHhGRn07Ci0KLQlwcml2YXRlIGJ5dGVbXSBVVEYxNkxFQk9NID0gbmV3IGJ5dGVbXXsoYnl0ZSkgMHhGRiwgKGJ5dGUpIDB4RkV9OwotCXByaXZhdGUgYnl0ZVtdIFVURjNCWVRFQk9NID0gbmV3IGJ5dGVbXXsoYnl0ZSkgMHhFRiwgKGJ5dGUpIDB4QkIsIChieXRlKSAweEJGfTsKLQotCXB1YmxpYyBDb2RlZFN0cmVhbUNyZWF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvZGVkU3RyZWFtQ3JlYXRvcihTdHJpbmcgZmlsZW5hbWUsIGNoYXJbXSBjaGFyYWN0ZXJBcnJheSkgewotCQlzdXBlcigpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZlJlYWRlciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhcmFjdGVyQXJyYXkpOwotCX0KLQotCXB1YmxpYyBDb2RlZFN0cmVhbUNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlbmFtZSA9IGZpbGVuYW1lOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCX0KLQotCXB1YmxpYyBDb2RlZFN0cmVhbUNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dFN0cmluZykgewotCQlzdXBlcigpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZlJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIodGV4dFN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgbWV0aG9kIHdoaWNoIGNvbnRhaW5zIHRoZSBoaWdoZXN0IGxldmVsIHJ1bGVzIGZvciBob3cgdG8KLQkgKiBkZWNpZGUgYXBwcm9wcmlhdGUgZGVjb2RpbmcgcnVsZXM6IDEuIGZpcnN0IGNoZWNrIGZvciB1bmljb2RlIHN0cmVhbSAyLgotCSAqIHRoZW4gbG9va2VkIGZvciBlbmNvZGluZyBzcGVjaWZpZWQgaW4gY29udGVudCAoYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mCi0JICogY29udGVudCB0aGF0IGlzIGl0IC4uLiB4bWwsIGh0bWwsIGpzcCwgZXRjLiAzLiB0aGVuIGNoZWNrIGZvciB2YXJpb3VzCi0JICogc2V0dGluZ3M6IGZpbGUgc2V0dGluZ3MgZmlyc3QsIGlmIG51bGwgY2hlY2sgcHJvamVjdCBzZXR0aW5ncywgaWYgbnVsbCwKLQkgKiBjaGVjayB1c2VyIHByZWZlcmVuY2VzLiA0LiBsYXN0bHkgKG9yLCB3aGF0IGlzIHRoZSBsYXN0IHVzZXIKLQkgKiBwcmVmZXJlbmNlKSBpcyB0byB1c2UgIndvcmtiZW5jaCBkZWZhdWx0cyIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFuYWx5emUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlSZWFkZXIgcmVzZXR0YWJsZVJlYWRlciA9IGdldFJlc2V0dGFibGVSZWFkZXIoKTsKLQkJdHJ5IHsKLQkJCWlmIChmQ3VycmVudEVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkJcmVzZXR0YWJsZVJlYWRlci5yZXNldCgpOwotCQkJCWZDdXJyZW50RW5jb2RpbmdNZW1lbnRvID0gY2hlY2tGb3JFbmNvZGluZ0luQ29udGVudHMoKTsKLQkJCX0KLQkJCS8vIGlmIGVuY29kaW5nIHN0cmF0YWd5IGRvZXNuJ3QgcHJvdmlkZSBhbnN3ZXIsCi0JCQkvLyB0aGVuIHRyeSBmaWxlIHNldHRpbmdzLCBwcm9qZWN0IHNldHRpbmdzLAotCQkJLy8gdXNlciBwcmVmZXJlbmNlcywgYW5kCi0JCQkvLyBmaW5hbGx5IHdvcmtiZW5jaCBkZWZhdWx0LgotCQkJLy8KLQkJCWlmIChmQ3VycmVudEVuY29kaW5nTWVtZW50byA9PSBudWxsIHx8IGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmVzZXR0YWJsZVJlYWRlci5yZXNldCgpOwotCQkJCWZDdXJyZW50RW5jb2RpbmdNZW1lbnRvID0gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpOwotCQkJfQotCi0JCQkvLyB1c2UgRGVmYXVsdE5hbWVSdWxlcyBmcm9tIE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMgYXMgdGhlCi0JCQkvLyBmaW5hbCBkZWZhdWx0Ci0JCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkJaGFuZGxlTm90UHJvdmlkZWRGcm9tQ29udGVudENhc2UoKTsKLQkJCX0KLQotCQkJZkhhc0JlZW5BbmFseXplZCA9IHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVzZXR0YWJsZVJlYWRlciAhPSBudWxsKSB7Ci0JCQkJcmVzZXR0YWJsZVJlYWRlci5yZXNldCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBjaGVjayBjb252ZXJzaW9uIGVhcmx5IG9uLiBUaGVyZSdzIHNvbWUgZGFuZ2VyIHRoYW4gb2xkCi0JICogY29udGVudHMgb2YgYSBmaWxlIGFyZSBzZXQgdG8gZW1wdHksIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCi0JICogCi0JICogQHBhcmFtIGFsbFRleHQKLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiBAcGFyYW0gZW5jb2RpbmdSdWxlCi0JICogQHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwKLQkgKiBAZGVwcmVjYXRlZCAtIHdlIG5lZWQgdG8gZmluZCAiY2hlYXBlciIgd2F5IHRvIHRvIHRoaXMgZnVuY3Rpb25hbGl0eSBzbwotCSAqICAgICAgICAgICAgIGxpa2VseSB0byBnbyBhd2F5IGluIGZ1dHVyZQotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0NvbnZlcnNpb24oRW5jb2RpbmdNZW1lbnRvIG1lbWVudG8sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBqYXZhRW5jb2RpbmcgPSBtZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCQlTdHJpbmcgZGV0ZWN0ZWRFbmNvZGluZyA9IG1lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoamF2YUVuY29kaW5nKTsKLQkJQ2hhcnNldEVuY29kZXIgY2hhcnNldEVuY29kZXIgPSBjaGFyc2V0Lm5ld0VuY29kZXIoKTsKLQkJY2hhcnNldEVuY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQljaGFyc2V0RW5jb2Rlci5vblVubWFwcGFibGVDaGFyYWN0ZXIoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKLQkJUmVhZGVyIHJlYWRlciA9IGdldFJlc2V0dGFibGVSZWFkZXIoKTsKLQkJcmVhZGVyLnJlc2V0KCk7Ci0JCWludCBjdXJyZW50Q2hhciA9IHJlYWRlci5yZWFkKCk7Ci0JCWludCBjdXJyZW50UG9zID0gMTsKLQkJdHJ5IHsKLQkJCXdoaWxlIChjdXJyZW50Q2hhciAhPSAtMSkgewotCQkJCS8vIG5vdGU6IHRoaXMgY2FuIHByb2JhYmx5IGJlIG1hZGUgbW9yZQotCQkJCS8vIGVmZmljaWVudCBsYXRlciB0bwotCQkJCS8vIGNoZWNrIGJ1ZmZlciBieSBidWZmZXIsIGluc3RlYWQgb2YKLQkJCQkvLyBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLgotCQkJCXRyeSB7Ci0JCQkJCWJvb2xlYW4gY2FuQ29udmVydCA9IGNoYXJzZXRFbmNvZGVyLmNhbkVuY29kZSgoY2hhcikgY3VycmVudENoYXIpOwotCQkJCQlpZiAoIWNhbkNvbnZlcnQpIHsKLQkJCQkJCWlmIChlbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLklHTk9SRV9DT05WRVJTSU9OX0VSUk9SKSB7Ci0JCQkJCQkJLy8gaWYgd2UncmUgdG9sZCB0byBpZ25vcmUgdGhlCi0JCQkJCQkJLy8gZW5jb2RpbmcgY29udmVyc2lvbgotCQkJCQkJCS8vIGVycm9yLAotCQkJCQkJCS8vIG5vdGljZSB3ZSBzdGlsbCB3YW50IHRvIGRldGVjdAotCQkJCQkJCS8vIGFuZCBsb2cgaXQuIFdlIHNpbXBseQotCQkJCQkJCS8vIGRvbid0IHRocm93IHRoZSBleGNlcHRpb24sIGFuZAotCQkJCQkJCS8vIHdlIGRvIGNvbnRpbnVlIHdpdGgKLQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkvLyBzYXZlLgotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiRW5jb2RpbmcgQ29udmVyc2lvbiBFcnJvciBkdXJpbmcgc2F2ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRocm93IG5ldyBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsKGphdmFFbmNvZGluZywgZGV0ZWN0ZWRFbmNvZGluZywgY3VycmVudFBvcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudENoYXIgPSByZWFkZXIucmVhZCgpOwotCQkJCQljdXJyZW50UG9zKys7Ci0JCQkJfQotCQkJCS8vIElCTSdzIEpSRSBzZWVtcyB0byB0aHJvdyBOUEUgd2hlbiBEQkNTIGNoYXIgaXMgZ2l2ZW4gdG8KLQkJCQkvLyBTQkNTIGNoYXJzZXRFbmNvZGVyCi0JCQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsKGphdmFFbmNvZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiB3ZSBnZXQgYWxsIHRoZSB3YXkgdGhyb3VnaCBsb29wIHdpdGhvdXQgdGhyb3dpbmcgZXhjZXB0aW9uLAotCQkJLy8gdGhlbiB0aGVyZSBtdXN0Ci0JCQkvLyBiZSBhbiBlcnJvciBub3QgZGV0ZWN0YWJsZSB3aGVuIGdvaW5nIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuCi0JCQl0aHJvdyBuZXcgQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwoamF2YUVuY29kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJcmVhZGVyLnJlc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjaGVja0ZvckVuY29kaW5nSW5Db250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCi0JCS8vIGlmIGVuY29kaW5nIG1lbWVudG8gYWxyZWFkeSBzZXQsIGFuZCBubyBuZWVkIHRvIGdldCBhZ2Fpbi4KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfSBlbHNlIHsKLQkJCWlmIChmQ2xpZW50U3VwcGxpZWRSZWFkZXIpIHsKLQkJCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCQl0cnkgewotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXREZXNjcmlwdGlvbkZvcihmUmVhZGVyLCBmRmlsZW5hbWUsIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlmRW5jb2RpbmdNZW1lbnRvID0gY3JlYXRlTWVtZW50byhjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZkVuY29kaW5nTWVtZW50byA9IENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE86IHdvcmsgYXJvdW5kIGZvciA1LzE0IGJ1ZyBpbiBiYXNlLCBzaG91bGQgYmUKLQkJCQkJLy8gcmVtb3ZlZCB3aGVuIG1vdmUgdXAgdG8gNS8yMQotCQkJCQkvLyBqdXN0IGNyZWF0ZWQgYSBzaW1wbGUgZGVmYXVsdCBvbmUKLQkJCQkJZkVuY29kaW5nTWVtZW50byA9IENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgc3RhdGU6IGVuY29kaW5nTWVtZW50byB3YXMgbnVsbCBidXQgbm8gaW5wdXQgc3RyZWFtIHN1cHBsaWVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkvLwkJdHJ5IHsKLQkJLy8JCQlyZXN1bHQgPSBnZXRFbmNvZGluZ0RldGVjdG9yKCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNWYWxpZCgpICYmICFmb3JjZURlZmF1bHQoKSkgewotCQkvLwkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChyZXN1bHQpOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJLy8JCWZpbmFsbHkgewotCQkvLwkJCWhhbmRsZVN0cmVhbUNsb3NlKGZFbmNvZGluZ0RldGVjdG9yU3RyZWFtKTsKLQkJLy8JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBkdW1wKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUsIGJvb2xlYW4gdXNlM0J5dGVCT01pZlVURjgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWdldEN1cnJlbnRFbmNvZGluZ01lbWVudG8oKTsKLQkJU3RyaW5nIGphdmFFbmNvZGluZ05hbWUgPSBudWxsOwotCQlpZiAoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKSB7Ci0JCQlpZiAoZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkJamF2YUVuY29kaW5nTmFtZSA9IGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChmQ3VycmVudEVuY29kaW5nTWVtZW50byk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikKLQkJCWphdmFFbmNvZGluZ05hbWUgPSBmQ3VycmVudEVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQkJZWxzZSBpZiAoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKQotCQkJamF2YUVuY29kaW5nTmFtZSA9IGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpOwotCQkvLyB3cml0ZSBhcHByb3ByaWF0ZSAiaGVhZGVyIiB1bmljb2RlIEJPTSBieXRlcwotCQkvLyBOb3RlOiBKYXZhIHNlZW1zIHRvIHdyaXRlIGFwcHJvcHJpYXRlIGhlYWRlciBmb3IKLQkJLy8gVVRGLTE2LCBidXQgbm90Ci0JCS8vIFVURi04IG5vciBVVEYtMTZCRS4gVGhpcwotCQkvLyBtYXkgdmFyeSBieSBKUkUgdmVyc2lvbiwgc28gbmVlZCB0byB0ZXN0IHdlbGwuCi0JCS8vIE5vdGU6IGphdmFFbmNvZGluZ05hbWUgY2FuIGJlIG51bGwgaW4gaW52YWxpZAotCQkvLyBjYXNlcywgc28gd2Ugbm8gaGFyZAotCQkvLyB0byBza2lwIHdob2xlIGNoZWNrIGlmIHRoYXQncyB0aGUgY2FzZS4KLQkJaWYgKGphdmFFbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJaWYgKChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfOF9DSEFSU0VUX05BTUUpICYmIHVzZTNCeXRlQk9NaWZVVEY4KSB8fCAoamF2YUVuY29kaW5nTmFtZS5lcXVhbHMoVVRGXzhfQ0hBUlNFVF9OQU1FKSAmJiBmQ3VycmVudEVuY29kaW5nTWVtZW50by5pc1VURjgzQnl0ZUJPTVVzZWQoKSkpIHsKLQkJCQlvdXRwdXRTdHJlYW0ud3JpdGUoVVRGM0JZVEVCT00pOwotCQkJfSBlbHNlIGlmIChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfMTZMRV9DSEFSU0VUX05BTUUpKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLndyaXRlKFVURjE2TEVCT00pOwotCQkJfSBlbHNlIGlmIChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfMTZCRV9DSEFSU0VUX05BTUUpKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLndyaXRlKFVURjE2QkVCT00pOwotCQkJfQotCQl9Ci0JCS8vIFRPRE8gYWRkIGJhY2sgaW4gbGluZSBkZWxpbWl0ZXIgaGFuZGxpbmcgdGhlCi0JCS8vICJyaWdodCIgd2F5ICh1cGRhdGluZwotCQkvLyBtYXJrZXJzLCBub3QgcmVxdWlyaW5nIHN0cmluZywgZXRjLiAuLiBtYXkgbmVlZAotCQkvLyB0byBtb3ZlIHRvIGRvY3VtZW50Ci0JCS8vIGxldmVsKQotCQkvL2FsbFRleHRCdWZmZXIgPQotCQkvLyBoYW5kbGVMaW5lRGVsaW1pdGVyKGFsbFRleHRCdWZmZXIsIGRvY3VtZW50KTsKLQkJUmVhZGVyIHJlYWRlciA9IGdldFJlc2V0dGFibGVSZWFkZXIoKTsKLQkJLy8gYmUgc3VyZSB0byB0ZXN0IGxhcmdlICJyZWFkZXJzIiAuLi4gd2UnbGwgbmVlZAotCQkvLyB0byBtYWtlIHN1cmUgdGhleSBhbGwKLQkJLy8gY2FuIHJlc2V0IHRvIGluaXRpYWwgcG9zaXRpb24gKFN0cmluZ1JlYWRlciwKLQkJLy8gQ2hhckFycmF5UmVhZGVyLCBhbmQKLQkJLy8gRG9jdW1lbnRSZWFkZXIgc2hvdWxkIGFsbCB3b3JrIG9rKS4KLQkJcmVhZGVyLnJlc2V0KCk7Ci0JCS8vIFRoZXJlIG11c3QgYmUgY2xlYW5lciBsb2dpYyBzb21laG93LCBidXQgdGhlCi0JCS8vIGlkZWEgaXMgdGhhdAotCQkvLyBqYXZhRW5jb2RpbmdOYW1lIGNhbiBiZSBudWxsCi0JCS8vIGlmIG9yaWdpbmFsIGRldGVjdGVkIGVuY29kaW5nIGlzIG5vdCB2YWxpZCAoYW5kCi0JCS8vIGlmIEZPUkNFX0RFRkFVTFQgd2FzCi0JCS8vIG5vdCBzcGVjaWZpZWQpLiBIZW5jZSwgd2UgV0FOVCB0aGUgZmlyc3QKLQkJLy8gQ2hhcnNldC5mb3JOYW1lIHRvCi0JCS8vIHRocm93IGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KLQkJQ2hhcnNldCBjaGFyc2V0ID0gbnVsbDsKLQotCQkvLyB0aGlzIGNhbGwgY2hlY2tzICJvdmVycmlkZSIgcHJvcGVydGllcyBmaWxlCi0JCWphdmFFbmNvZGluZ05hbWUgPSBDb2RlZElPLmdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoamF2YUVuY29kaW5nTmFtZSk7Ci0KLQkJaWYgKGphdmFFbmNvZGluZ05hbWUgPT0gbnVsbCkgewotCQkJY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShmQ3VycmVudEVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCkpOwotCQl9IGVsc2UgewotCQkJY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShqYXZhRW5jb2RpbmdOYW1lKTsKLQkJfQotCQlDaGFyc2V0RW5jb2RlciBjaGFyc2V0RW5jb2RlciA9IGNoYXJzZXQubmV3RW5jb2RlcigpOwotCQlpZiAoIShlbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLklHTk9SRV9DT05WRVJTSU9OX0VSUk9SKSkgewotCQkJY2hhcnNldEVuY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQkJY2hhcnNldEVuY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyc2V0RW5jb2Rlci5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotCQkJY2hhcnNldEVuY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotCi0JCX0KLQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyc2V0RW5jb2Rlcik7Ci0JCS8vVE9ETzogdGhpcyBtYXkgbm8gbG9uZ2VyIGJlIG5lZWRlZCAoYW5kIGlzIGF0Ci0JCS8vIGxlYXN0IHdyb25nIHNwb3QgZm9yCi0JCS8vIGl0KS4KLQkJLy8JCWlmIChjaGVja0NvbnZlcnNpb24gJiYgKCEoZW5jb2RpbmdSdWxlID09Ci0JCS8vIEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikpKSB7Ci0JCS8vCQkJY2hlY2tDb252ZXJzaW9uKGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLAotCQkvLyBlbmNvZGluZ1J1bGUpOwotCQkvLwkJfQotCQljaGFyW10gY2hhcmJ1ZiA9IG5ldyBjaGFyW0NvZGVkSU8uTUFYX0JVRl9TSVpFXTsKLQkJaW50IG5SZWFkID0gMDsKLQkJdHJ5IHsKLQkJCXdoaWxlIChuUmVhZCAhPSAtMSkgewotCQkJCW5SZWFkID0gcmVhZGVyLnJlYWQoY2hhcmJ1ZiwgMCwgTUFYX0JVRl9TSVpFKTsKLQkJCQlpZiAoblJlYWQgPiAwKSB7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUoY2hhcmJ1ZiwgMCwgblJlYWQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbiBlKSB7Ci0JCQljaGVja0NvbnZlcnNpb24oZkN1cnJlbnRFbmNvZGluZ01lbWVudG8sIGVuY29kaW5nUnVsZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBzaW5jZSB3ZSBkb24ndCBvd24gdGhlIG9yaWdpbmFsIG91dHB1dCBzdHJlYW0sIHdlCi0JCQkvLyB3b24ndCBjbG9zZSBpdCBvdXJzLgotCQkJLy8gdGhlIGNhbGxlciB3aG8gcGFzc2VkIGl0IHRvIHVzIG11c3QgY2xvc2Ugb3JpZ2luYWwgb25lCi0JCQkvLyB3aGVuIGFwcHJvcHJpYXRlLgotCQkJLy8gKGJ1dCB3ZSBkbyBmbHVzaCB0byBiZSBzdXJlIGFsbCB1cC10by1kYXRlKQotCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0M0J5dGVCT01QcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlVTRV8zQllURV9CT01fV0lUSF9VVEY4KTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vQXNzZXJ0LmlzTm90TnVsbChmUHJldmlvdXNFbmNvZGluZ01lbWVudG8sCi0JCS8vICJwcmV2aW91c0VuY29kaW5nTWVtZW50bwotCQkvLyBuZWVkcyB0byBiZSBzZXQgZmlyc3QiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oSU5JVElBTF9CVUZGRVJfU0laRSk7Ci0JCWR1bXAoYnl0ZUFycmF5T3V0cHV0U3RyZWFtLCBlbmNvZGluZ1J1bGUsIGdldDNCeXRlQk9NUHJlZmVyZW5jZSgpKTsKLQkJcmV0dXJuIGJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEN1cnJlbnRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvL0Fzc2VydC5pc05vdE51bGwoZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvLAotCQkvLyAicHJldmlvdXNFbmNvZGluZ01lbWVudG8KLQkJLy8gbmVlZHMgdG8gYmUgc2V0IGZpcnN0Iik7Ci0JCWlmICghZkhhc0JlZW5BbmFseXplZCkgewotCQkJYW5hbHl6ZSgpOwotCQl9Ci0JCS8vIHBvc3QgY29uZGl0aW9uCi0JCUFzc2VydC5pc05vdE51bGwoZkN1cnJlbnRFbmNvZGluZ01lbWVudG8sICJpbGxlZ2FsIHBvc3QgY29uZGl0aW9uIHN0YXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYmUgc3VyZSB0byBjYXJyeSBvdmVyIGFwcHJvcHJpYXRlIGVuY29kaW5nCi0JCS8vICJzdGF0ZSIgdGhhdCBtYXkgYmUKLQkJLy8gcmVsZXZlbnQuCi0JCWlmIChmUHJldmlvdXNFbmNvZGluZ01lbWVudG8gIT0gbnVsbCkgewotCQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZChmUHJldmlvdXNFbmNvZGluZ01lbWVudG8uaXNVVEY4M0J5dGVCT01Vc2VkKCkpOwotCQl9Ci0JCXJldHVybiBmQ3VycmVudEVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IHdoZW4gZW5jb2RpbmcgaXMgbm90IGRldGVjdGVkIGluIHRoZSBmaWxlLgotCSAqIAotCSAqIEhlcmUgaXMgZW5jb2RpbmcgbG9va3VwIG9yZGVyIHdlIHdpbGwgdHJ5OiAtIHRyeSByZXNvdXJjZSBjb250ZW50Ci0JICogZGVzY3JpcHRpb24gKEVjbGlwc2UgVGV4dCBmaWxlIGVuY29kaW5nKSAtIHRyeSByZXNvdXJjZSBjb250ZW50Ci0JICogcHJvcGVydGllcyAoZm9yIEpTUCBvbmx5KSAtIHRyeSBjb250ZW50IHR5cGUgZW5jb2RpbmcgcHJlZmVyZW5jZXMgKGZvcgotCSAqIEhUTUwgb25seSkgLSB0cnkgcmVzb3VyY2UgY29udGVudCBkZXNjcmlwdGlvbiAoRWNsaXBzZSBUZXh0IGZpbGUKLQkgKiBlbmNvZGluZywgaW1wbGljaXQgY2hlY2spCi0JICogCi0JICogTm90ZTogVGhpcyBtZXRob2QgYXBwZWFycyBpbiBib3RoIENvZGVkUmVhZGVyQ3JlYXRvciBhbmQKLQkgKiBDb2RlZFN0cmVhbUNyZWF0b3IgKHdpdGgganVzdCBhIG1pbm9yIGRpZmZlcmVuY2UpLiBUaGV5IHNob3VsZCBiZSBrZXB0Ci0JICogdGhlIHNhbWUuCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSBmRW5jb2RpbmdNZW1lbnRvOwotCi0JCS8vIEZvbGxvdyBFY2xpcHNlIFBsYXRmb3JtJ3MgZGlyZWN0aW9uLiBHZXQgdGhlIGNoYXJzZXQgZnJvbSBJRmlsZS4KLQkJaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2hhcnNldCA9IGZJRmlsZS5nZXRDaGFyc2V0KCk7Ci0JCQllbmNvZGluZ01lbWVudG8gPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0KTsKLQkJfQotCi0JCXJldHVybiBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0JcHJpdmF0ZSBSZWFkZXIgZ2V0UmVzZXR0YWJsZVJlYWRlcigpIHsKLQkJaWYgKGZSZXNldHRhYmxlUmVhZGVyID09IG51bGwpIHsKLQkJCWlmIChmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJCWZSZXNldHRhYmxlUmVhZGVyID0gZlJlYWRlcjsKLQkJCX0gZWxzZSB7Ci0JCQkJZlJlc2V0dGFibGVSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZlJlYWRlcik7Ci0JCQkJdHJ5IHsKLQkJCQkJZlJlc2V0dGFibGVSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGp1c3QgY2hlY2tlZCBpZgotCQkJCQkvLyBtYXJrYWJsZQotCQkJCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZSZXNldHRhYmxlUmVhZGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdFByb3ZpZGVkRnJvbUNvbnRlbnRDYXNlKCkgewotCQkvLyBtb3ZlIHRvICJkZXRlY3RvcnMiIGlmIG5vdCBhbHJlYWR5Ci0JCVN0cmluZyBzcGVjRGVmYXVsdCA9IG51bGw7Ci0JCS8vc3BlY0RlZmF1bHQgPSBnZXRFbmNvZGluZ0RldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlTdHJpbmcgY2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhzcGVjRGVmYXVsdCk7Ci0JCUFzc2VydC5pc05vdE51bGwoY2hhcnNldCwgUFJPR1JBTV9FUlJPUl9fRkFJTEVEX1RPX0ZJTkRfQU5ZX0NIQVJTRVRfQU5ZV0hFUkVfKTsKLQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8gPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0KTsKLQl9Ci0KLQkvLyBUT0RPIFdlIGp1c3QgY29weSB0aGUgY29udGVudCBwcm9wZXJ0aWVzIGVuY29kaW5nIHRvIGN1cnJlbnQgcmVzb3VyY2UncwotCS8vIGVuY29kaW5nIGZvciBub3cuIE1heSBpbXByb3ZlIHRoZSBVSSBsYXRlciBieSBzZXR0aW5nIGFuIGluZm9ybWF0aW9uYWwKLQkvLyBtZXNzYWdlIGFuZC9vciBkaXNhYmxlIHRoZSBjb250ZW50IHByb3BlcnRpZXMgZW5jb2RpbmcgZmllbGQuCi0JLy8gVE9ETyBtYWtlIHByaXZpYXRlIGlmIG5lZWRlZCwgZWxzZSByZW1vdmUKLQl2b2lkIG1pZ3JhdGVDb250ZW50UHJvcGVydGllc0VuY29kaW5nKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZklGaWxlICE9IG51bGwpCi0JCQlmSUZpbGUuc2V0Q2hhcnNldChlbmNvZGluZywgbnVsbCk7Ci0JCWZpbmFsIElGaWxlIGZpbGUgPSBmSUZpbGU7Ci0JCWZpbmFsIFN0cmluZyBjaGFyc2V0ID0gZW5jb2Rpbmc7Ci0JCS8vIFRPRE86IGV4dGVybmFsaXplIHN0cmluZyBsYXRlcgotCQlKb2IgbWlncmF0ZXIgPSBuZXcgSm9iKFNTRUNvcmVNZXNzYWdlcy5NaWdyYXRlX0NoYXJzZXQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZpbGUuc2V0Q2hhcnNldChjaGFyc2V0LCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQltaWdyYXRlci5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCW1pZ3JhdGVyLnNjaGVkdWxlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmRmlsZW5hbWUgPSBudWxsOwotCQlmUmVhZGVyID0gbnVsbDsKLQkJZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCQlmSGFzQmVlbkFuYWx5emVkID0gZmFsc2U7Ci0JCWZDbGllbnRTdXBwbGllZFJlYWRlciA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRmlsZSBmaWxlLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCWZJRmlsZSA9IGZpbGU7Ci0JCXNldChmaWxlLmdldE5hbWUoKSwgcmVhZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIGZpbGVuYW1lLCBjaGFyW10gY2hhcmFjdGVyQXJyYXkpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZkZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCWZSZWFkZXIgPSBuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJhY3RlckFycmF5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIGZpbGVuYW1lLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZGaWxlbmFtZSA9IGZpbGVuYW1lOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlmQ2xpZW50U3VwcGxpZWRSZWFkZXIgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0U3RyaW5nKSB7Ci0JCXNldChmaWxlbmFtZSwgbmV3IFN0cmluZ1JlYWRlcih0ZXh0U3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXNFbmNvZGluZ01lbWVudG8oRW5jb2RpbmdNZW1lbnRvIHByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKSB7Ci0JCWZQcmV2aW91c0VuY29kaW5nTWVtZW50byA9IHByZXZpb3VzRW5jb2RpbmdNZW1lbnRvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uQ2hhcnNldE5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkNoYXJzZXROYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MThjN2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uQ2hhcnNldE5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIENvbW1vbkNoYXJzZXRzIGlzIGEgdXRpbGl0eSBjbGFzcyB0byBwcm92aWRlIGEgY2VudHJhbCBwbGFjZSB0byBtYXAgc29tZQotICogSUFOQSBjaGFyc2V0IG5hbWUgdG8gYSBKYXZhIGNoYXJzZXQgbmFtZS4gSW4gMS40IEpSRSdzIHRoaXMgbW9zdGx5IGlzIGEKLSAqIHRoaW4gd3JhcHBlciBvZiBleGlzdGluZyBDaGFyc2V0IGZ1bmN0aW9uYWxpdHkuIEl0IGRvZXMsIGhvd2V2ZXIsIGFsbG93Ci0gKiBzb21lICJvdmVycmlkaW5nIiBvZiB0aGUgYnVpbHQgaW4gSlJFIG1hcHBpbmdzIGluIHRoZSBldmVudCB0aGV5IGFyZQotICogbmVjZXNzYXJ5LiBTZWUgQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgYWxzbyBwcm92aWRlcyBzb21lIGNvbnZlbmllbnQgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gZm9yIHRoZQotICogY2hhcnNldCBuYW1lcyB3aGljaCBjYW4gYmUgdXNlZCBpbiB1c2VyIGludGVyZmFjZXMuIFRoZSBkZXNjcmlwdGlvbiBpcyBOTAotICogYXdhcmUgYmFzZWQgb24gbG9jYWxlLiBUaGUgZGF0YSBpcyBwb3B1bGF0ZWQgdmlhIHRoZSBjaGFyc2V0LnByb3BlcnRpZXMKLSAqIGZpbGUgb25seSBvbmNlLCBiYXNlZCBvbiBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGhhc2h0YWJsZXMuCi0gKiA8cD4KLSAqIFRoZSBJQU5BIHRhZ3MgYXJlIGJhc2VkIG9uIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3VuZCBhdCB0aGUKLSAqIGh0dHA6Ly93d3cuaWFuYS5vcmcgc2l0ZS4gU3BlY2lmaWNhbGx5IHNlZQotICogaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9jaGFyYWN0ZXItc2V0cwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tbW9uQ2hhcnNldE5hbWVzIHsKLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZGVmYXVsdElBTkFtYXBwaW5ncyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZW5jb2RpbmdzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBzdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxpc3Qgb2YgY29tbW9ubHkgYXZhaWxhYmxlIGVuY29kaW5nIG5hbWVzLiBTdWl0YWJsZSBmb3IKLQkgKiBwb3B1bGF0aW5nIGEgVUkgZGlhbG9nIG9yIGRyb3AgZG93bi4gVGhpcyBsaXN0IHdvdWxkIGJlIGEgc3Vic2V0IG9mIGFsbAotCSAqIHBvc3NpYmxlIGNoYXJzZXRzIHRoZSBWTSBzdXBwb3J0cyAod2hpY2ggY2FuIGdldCBpbnRvIHRoZSBodW5kcmVkcykuCi0JICogRm9yIHRoZSBWTSBzdXBwb3J0ZWQgY2hhcnNldHMsIHVzZQotCSAqIDxjb2RlPkNoYXJzZXQuYXZhaWxhYmxlQ2hhcnNldHMoKTwvY29kZT4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZ1tdCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb21tb25DaGFyc2V0TmFtZXMoKSB7Ci0JCVN0cmluZ1tdIGVuYyA9IG5ldyBTdHJpbmdbZ2V0RW5jb2RpbmdzKCkuc2l6ZSgpXTsKLQkJZ2V0RW5jb2RpbmdzKCkudG9BcnJheShlbmMpOwotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVmYXVsdElBTkFtYXBwaW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIGdldERlZmF1bHRJQU5BTWFwcGluZ3MoKSB7Ci0JCWlmIChkZWZhdWx0SUFOQW1hcHBpbmdzID09IG51bGwpIHsKLQkJCWRlZmF1bHRJQU5BbWFwcGluZ3MgPSBuZXcgUHJvcGVydGllcygpOwotCQkJQnVuZGxlIGtleUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCk7Ci0JCQlJUGF0aCBrZXlQYXRoID0gbmV3IFBhdGgoImNvbmZpZy9kZWZhdWx0SUFOQS5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVVSTCBsb2NhdGlvbiA9IFBsYXRmb3JtLmZpbmQoa2V5QnVuZGxlLCBrZXlQYXRoKTsKLQkJCUlucHV0U3RyZWFtIHByb3BlcnRpZXNJbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXByb3BlcnRpZXNJbnB1dFN0cmVhbSA9IGxvY2F0aW9uLm9wZW5TdHJlYW0oKTsKLQkJCQlkZWZhdWx0SUFOQW1hcHBpbmdzLmxvYWQocHJvcGVydGllc0lucHV0U3RyZWFtKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgY2FuJ3QgcmVhZCwganVzdCBhc3N1bWUgdGhlcmUncyBubwotCQkJCS8vIGRlZmF1bHQgSUFOQSBtYXBwaW5ncwotCQkJCS8vIGFuZCByZXBlYXRlZCBhdHRlbXB0cyB3aWxsIG5vdCBvY2N1ciwKLQkJCQkvLyBzaW5jZSB0aGV5Ci0JCQkJLy8gd2lsbCBiZSByZXByZXNlbnRlZCBieSBhbiBlbXB0eQotCQkJCS8vIFByb3BlcnRpZXMgb2JqZWN0Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRJQU5BbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBkaXNwbGF5ICh0cmFuc2xhdGVkKSBzdHJpbmcgZm9yIGVuY29kaW5nIG5hbWUuIElmIHRoZXJlIGlzIG5vCi0JICogImN1c3RvbSIgdHJhbnNsYXRlZCB2ZXJzaW9uIGF2YWlsYWJsZSwgaXQgZGVmZXJzIHRvIHRoZXIgVk0ncyBDaGFyc2V0Ci0JICogc3VwcG9ydC4gSXQgd2lsbCByZXR1cm4gbnVsbCBpZiBubyBkaXNwbGF5IG5hbWUgaXMgYXZhaWxhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIGNoYXJzZXQgbmFtZQotCSAqIEByZXR1cm4gSHVtYW4gZnJpZW5kbHkgZGlzcGxheSBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZyhTdHJpbmcgY2hhcnNldE5hbWUpIHsKLQkJaWYgKGNoYXJzZXROYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIGdldFN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzKCkuZ2V0KGNoYXJzZXROYW1lKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lhbCBvbmUsIGp1c3QgcmV0dXJuCi0JCQkvLyB3aGF0J3MgcHJvdmlkZWQgYnkgQ2hhcnNldAotCi0JCQl0cnkgewotCQkJCUNoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShjaGFyc2V0TmFtZSk7Ci0JCQkJcmVzdWx0ID0gY2hhcnNldC5kaXNwbGF5TmFtZSgpOwotCQkJfQotCQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgbm90IHN1cHBvcnRlZCwgdGhlIGRpc3BsYXkgbmFtZSBpcwotCQkJCS8vIHRoZSBsZWFzdCBvZiBjbGllbnRzIGNvbmNlcm5zIDopCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGphdmFFbmNvZGluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGdldEVuY29kaW5ncygpIHsKLQkJaWYgKGVuY29kaW5ncyA9PSBudWxsKSB7Ci0JCQlpbml0SGFzaFRhYmxlcygpOwotCQl9Ci0JCXJldHVybiBlbmNvZGluZ3M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SWFuYVByZWZlcnJlZENoYXJzZXROYW1lKFN0cmluZyBjaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcHJlZmVycmVkTmFtZSA9IGNoYXJzZXROYW1lOwotCi0JCXRyeSB7Ci0JCQlDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoY2hhcnNldE5hbWUpOwotCQkJaWYgKGNoYXJzZXQubmFtZSgpICE9IG51bGwpIHsKLQkJCQlwcmVmZXJyZWROYW1lID0gY2hhcnNldC5uYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IHJldHVybiBpbnB1dCBpZiBpbGxlZ2FsCi0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IHJldHVybiBpbnB1dCBpZiBpbGxlZ2FsCi0JCX0KLQkJcmV0dXJuIHByZWZlcnJlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlZmF1bHQgSUFOQSBuYW1lIHRoYXQgaXMgbGlzdGVkIGluIENvbW1vbkNoYXJzZXROYW1lcy4gSGVyZQotCSAqIGlzIGhvdyBpdCBjaGVja3M6IDEuIGNoZWNrIHRvIHNlZSBpZiBjaGFyc2V0TmFtZSBpcyBpbiB0aGUKLQkgKiBDb21tb25DaGFyc2V0TmFtZXMgbGlzdCBhbmQgaWYgc28sIGp1c3QgcmV0dXJuIGl0LiAyLiBjaGVjayB0byBzZWUgaWYKLQkgKiBjaGFyc2V0TmFtZSBpcyBsaXN0ZWQgaW4gZGVmYXVsdElBTkFtYXBwaW5ncyB3aGljaCBjb250YWlucyBhIG1hcHBpbmcKLQkgKiBvZiBtb3JlIGNvbW1vbiBlbmNvZGluZ3MgYW5kIHRoZSBkZWZhdWx0IElBTkEgbmFtZSB0aGV5IHNob3VsZCBtYXAgdG8uCi0JICogMy4gcmV0dXJuIGRlZmF1bHRJYW5hTmFtZSBpZiBhbGwgZWxzZSBmYWlscwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZlcnJlZERlZmF1bHRJYW5hTmFtZShTdHJpbmcgY2hhcnNldE5hbWUsIFN0cmluZyBkZWZhdWx0SWFuYU5hbWUpIHsKLQkJU3RyaW5nIHByZWZlcnJlZE5hbWUgPSBkZWZhdWx0SWFuYU5hbWU7Ci0JCVN0cmluZyBndWVzc2VkTmFtZSA9IGNoYXJzZXROYW1lOwotCQl0cnkgewotCQkJZ3Vlc3NlZE5hbWUgPSBDb2RlZElPLmdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoY2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBpZ25vcmUgaWYgaWxsZWdhbAotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBpZ25vcmUgaWYgaWxsZWdhbAotCQl9Ci0JCWlmIChnZXRFbmNvZGluZ3MoKS5jb250YWlucyhndWVzc2VkTmFtZSkpCi0JCQlwcmVmZXJyZWROYW1lID0gZ3Vlc3NlZE5hbWU7Ci0JCWVsc2UgewotCQkJcHJlZmVycmVkTmFtZSA9IGdldERlZmF1bHRJQU5BTWFwcGluZ3MoKS5nZXRQcm9wZXJ0eShndWVzc2VkTmFtZSwgcHJlZmVycmVkTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJlZmVycmVkTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGdldFN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzKCkgewotCQlpZiAoc3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJaW5pdEhhc2hUYWJsZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0SGFzaFRhYmxlcygpIHsKLQkJaWYgKHN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCS8vIEluaXRpYWxpemUgaGFzaCB0YWJsZSBmb3IgZW5jb2RpbmcgdGFibGUKLQkJCXN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJZW5jb2RpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gYnVuZGxlU3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJVVJMIGJ1bmRsZVVSTCA9IFBsYXRmb3JtLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKElDb2RlZFJlc291cmNlUGx1Z2luLklEKSwgUGF0aC5mcm9tT1NTdHJpbmcoIiRubCQvY29uZmlnL2NoYXJzZXQucHJvcGVydGllcyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChidW5kbGVVUkwgIT0gbnVsbCkgewotCQkJCQlidW5kbGVTdHJlYW0gPSBidW5kbGVVUkwub3BlblN0cmVhbSgpOwotCQkJCQlidW5kbGUgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShidW5kbGVTdHJlYW0pOwotCQkJCX0KLQotCQkJCVN0cmluZyB0b3RhbE51bVN0cmluZyA9IGJ1bmRsZS5nZXRTdHJpbmcoInRvdGFsbnVtYmVyIik7Ly8kTk9OLU5MUy0xJAotCQkJCWludCB0b3RhbE51bSA9IDA7Ci0JCQkJaWYgKHRvdGFsTnVtU3RyaW5nLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRvdGFsTnVtID0gSW50ZWdlci52YWx1ZU9mKHRvdGFsTnVtU3RyaW5nKS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJdG90YWxOdW0gPSAwOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbE51bTsgaSsrKSB7Ci0JCQkJCVN0cmluZyBpYW5hID0gYnVuZGxlLmdldFN0cmluZygiY29kZXNldC4iICsgaSArICIuaWFuYSIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoImNvZGVzZXQuIiArIGkgKyAiLmxhYmVsIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQkJCQllbmNvZGluZ3MuYWRkKGlhbmEpOwotCQkJCQlzdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lcy5wdXQoaWFuYSwgZGlzcGxheU5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiaW52YWxpZCBpbnN0YWxsIG9yIGNvbmZpZ3VyYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGJ1bmRsZVN0cmVhbSAhPSBudWxsKQotCQkJCQkJYnVuZGxlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQkvLyB1bml0IHRlc3Qgb25seQotCQlTdHJpbmcgdGVzdCA9ICJDcDEyNTIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0SWFuYVByZWZlcnJlZENoYXJzZXROYW1lKHRlc3QpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odGVzdCArICIgLS0+ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0KLQkJdGVzdCA9ICJNUzkzMiI7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0ID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldElhbmFQcmVmZXJyZWRDaGFyc2V0TmFtZSh0ZXN0KTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3QgKyAiIC0tPiAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIENvbW1vbkNoYXJzZXROYW1lcygpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdEhhc2hUYWJsZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4N2UwM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgdG8gc3BlY2lmeSBlbmNvZGluZyBhbmQgZW5kIG9mIGxpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcyB7Ci0JCi0JcHJpdmF0ZSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBDb25zdGFudCB0byBiZSB1c2VkIHdoZW4gcmVmZXJyaW5nIHRvIENSL01BQyBsaW5lIGRlbGltaXRlcgotCSAqIEBkZXByZWNhdGVkIC0gbm8gbG9uZ2VyIHVzZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9ICJFT0xfTWFjIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIENvbnN0YW50IHRvIGJlIHVzZWQgd2hlbiByZWZlcnJpbmcgdG8gQ1JMRi9XSU5ET1dTIGxpbmUgZGVsaW1pdGVyCi0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSTEYgPSAiRU9MX1dpbmRvd3MiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGVuZC1vZi1saW5lIGNoYXJhY3RlcihzKSB0byB1c2UuCi0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9PRl9MSU5FX0NPREUgPSAiZW5kT2ZMaW5lQ29kZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgY29kZSB0byB1c2Ugd2hlbiByZWFkaW5nIGEgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9DT0RFU0VUID0gImlucHV0Q29kZXNldCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gYmUgdXNlZCB3aGVuIHJlZmVycmluZyB0byBMRi9VTklYIGxpbmUgZGVsaW1pdGVyCi0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExGID0gIkVPTF9Vbml4IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIENvbnN0YW50IHRvIGJlIHVzZWQgd2hlbiByZWZlcnJpbmcgdG8gTm8gdHJhbnNsYXRpb24gb2YgbGluZSBkZWxpbWl0ZXJzCi0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1RSQU5TTEFUSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgY2hhcmFjdGVyIGNvZGUgdG8gdXNlIHdoZW4gd3JpdGluZyBhIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0NPREVTRVQgPSAib3V0cHV0Q29kZXNldCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIENSL01BQyBsaW5lIGRlbGltaXRlcgotCSAqIEBkZXByZWNhdGVkIC0gbm8gbG9uZ2VyIHVzZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfQ1IgPSAiXHIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBDUkxGL1dJTkRPV1MgbGluZSBkZWxpbWl0ZXIKLQkgKiBAZGVwcmVjYXRlZCAtIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0NSTEYgPSAiXHJcbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIExGL1VOSVggbGluZSBkZWxpbWl0ZXIKLQkgKiBAZGVwcmVjYXRlZCAtIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0xGID0gIlxuIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgVXNlIDMgYnl0ZSBCT00gKEJ5dGUgT3JkZXIgTWFyaykgd2hlbiBzYXZpbmcgVVRGLTggZW5jb2RlZCBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV8zQllURV9CT01fV0lUSF9VVEY4ID0gIlVzZTNCeXRlQk9NV2l0aFVURjgiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjhkYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0KLXB1YmxpYyBjbGFzcyBDb250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheSB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTE9DQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBSVU5USU1FX1hNTF9JRCA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTU0VfWE1MX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBidW5kbGVFeGlzdHMoU3RyaW5nIHBsdWdpbklkKSB7Ci0KLQkJLy8gdGhpcyBqdXN0IHZlcmlmaWVzIHRoZXJlJ3MgcmVhbGx5IGEgcGx1Z2luIHdpdGggdGhpcyBJRCBpbiAic3RhY2siCi0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlyZXR1cm4gKCEoYnVuZGxlID09IG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbnRyaWJ1dG9yUGx1Z2luSWQoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gaGF2ZSByZWdpc3RyYXRpb24gaW5mbyBoZXJlLCBidXQgZm9yIG5vdywgd2UnbGwgdXNlCi0JCS8vIHNpbXBsZSBoZXVyaXN0aWMgdG8gY292ZXIgdGhlIGNhc2VzIHdlIGtub3cgYWJvdXQuCi0JCVN0cmluZyBmdWxsSWQgPSBudWxsOwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJZnVsbElkID0gREVGQVVMVF9MT0NBVElPTjsKLQkJfSBlbHNlIHsKLQkJCWZ1bGxJZCA9IGNvbnRlbnRUeXBlLmdldElkKCk7Ci0JCX0KLQkJLy8gb25seSBvbmUga25vd24gY2FzZSwgc28gZmFyLCBvZiBoYXJkIGNvZGVkIHJlLWRpcmVjdGlvbgotCQkvLyAobm90IHN1cmUgdGhpcyBpcyBldmVuIG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSkuCi0JCS8vIFdlIGRvbid0IHdhbnQgdG8gc3RvcmUvY2hhbmdlIHJ1bnRpbWUueG1sIHByZWZlcmVuY2VzCi0JCWlmIChSVU5USU1FX1hNTF9JRC5lcXVhbHMoZnVsbElkKSkgewotCQkJZnVsbElkID0gU1NFX1hNTF9JRDsKLQkJfQotCQlTdHJpbmcgcGx1Z2luSWQgPSBpbmZlclBsdWdpbklkKGZ1bGxJZCk7Ci0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXREZWZhdWx0UHJlZmVyZW5jZXMoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZWNsaXBzZVByZWZlcmVuY2VzID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0Um9vdE5vZGUoKTsKLQkJLy8gVE9ETzogZXZlbnRhdWxseSBuZWVkIGV4dGVuc2lvbiBtZWNoYW5pc20gdG8gYXZvaWQgdGhlc2UgaGFyZCBjb2RlZAotCQkvLyBtZWNoYW5pc20uCi0JCS8vIFRoZSBpZGVhIGlzIHRvIGxvYWQvc3RvcmUgYmFzZWQgb24gcGx1Z2luJ3MgcHJlZmVyZW5jZXMsIHdoZXJlIHRoZQotCQkvLyBjb250ZW50IHR5cGUgd2FzIGNvbnRyaWJ1dGVkCi0JCS8vIEV2ZW50dWFsbHksIHRvbywgd2UgY291bGQgZG8gbW9yZSAiZHluYW1pYyBsb29rdXAiIHRvIGdldCBwYXJlbnQKLQkJLy8gdHlwZXMgZm9yIGRlZmF1bHRzLCBldGMuCi0KLQkJLy8gR2V0IGRlZmF1bHQgcGx1Z2luIHByZWZlcmVuY2VzCi0JCVN0cmluZyBwbHVnaW5QcmVmZXJlbmNlTG9jYXRpb24gPSBEZWZhdWx0U2NvcGUuU0NPUEUgKyBJUGF0aC5TRVBBUkFUT1IgKyBnZXRDb250cmlidXRvclBsdWdpbklkKGNvbnRlbnRUeXBlKTsKLQkJUHJlZmVyZW5jZXMgcGx1Z2luUHJlZmVyZW5jZXMgPSBlY2xpcHNlUHJlZmVyZW5jZXMubm9kZShwbHVnaW5QcmVmZXJlbmNlTG9jYXRpb24pOwotCi0JCS8vIHRoZSBiZWxvdyBjb2RlIGRvZXMgbm90IHdvcmsgYXQgdGhpcyB0aW1lIGJlY2F1c2UgY29udGVudCB0eXBlCi0JCS8vIHByZWZlcmVuY2VzIGFyZSBzdG9yZWQgaW4gdGhlIHBsYWNlIGFzIHBsdWdpbiBwcmVmZXJlbmNlcwotCi0JCS8vCQlQcmVmZXJlbmNlcyBjb250ZW50UHJlZmVyZW5jZXMgPSBudWxsOwotCQkvLwkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJLy8JCQljb250ZW50UHJlZmVyZW5jZXMgPSBwbHVnaW5QcmVmZXJlbmNlcy5ub2RlKGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkvLwkJfQotCQkvLwkJZWxzZSB7Ci0JCS8vCQkJY29udGVudFByZWZlcmVuY2VzID0gcGx1Z2luUHJlZmVyZW5jZXMubm9kZShERUZBVUxUX0xPQ0FUSU9OICk7Ci0JCS8vCQl9Ci0JCS8vCi0JCS8vCQlyZXR1cm4gY29udGVudFByZWZlcmVuY2VzOwotCi0JCXJldHVybiBwbHVnaW5QcmVmZXJlbmNlczsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIFByZWZlcmVuY2VzIGdldERlZmF1bHRQcmVmZXJlbmNlcyhTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLQkJcmV0dXJuIGdldERlZmF1bHRQcmVmZXJlbmNlcyhjb250ZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBlY2xpcHNlUHJlZmVyZW5jZXMgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpOwotCQkvLyBUT0RPOiBldmVudGF1bGx5IG5lZWQgZXh0ZW5zaW9uIG1lY2hhbmlzbSB0byBhdm9pZCB0aGVzZSBoYXJkIGNvZGVkCi0JCS8vIG1lY2hhbmlzbS4KLQkJLy8gVGhlIGlkZWEgaXMgdG8gbG9hZC9zdG9yZSBiYXNlZCBvbiBwbHVnaW4ncyBwcmVmZXJlbmNlcywgd2hlcmUgdGhlCi0JCS8vIGNvbnRlbnQgdHlwZSB3YXMgY29udHJpYnV0ZWQKLQkJLy8gRXZlbnR1YWxseSwgdG9vLCB3ZSBjb3VsZCBkbyBtb3JlICJkeW5hbWljIGxvb2t1cCIgdG8gZ2V0IHBhcmVudAotCQkvLyB0eXBlcyBmb3IgZGVmYXVsdHMsIGV0Yy4KLQotCQkvLyBHZXQgaW5zdGFuY2UgcGx1Z2luIHByZWZlcmVuY2VzCi0JCVN0cmluZyBwbHVnaW5QcmVmZXJlbmNlTG9jYXRpb24gPSBQbHVnaW4uUExVR0lOX1BSRUZFUkVOQ0VfU0NPUEUgKyBJUGF0aC5TRVBBUkFUT1IgKyBnZXRDb250cmlidXRvclBsdWdpbklkKGNvbnRlbnRUeXBlKTsKLQkJUHJlZmVyZW5jZXMgcGx1Z2luUHJlZmVyZW5jZXMgPSBlY2xpcHNlUHJlZmVyZW5jZXMubm9kZShwbHVnaW5QcmVmZXJlbmNlTG9jYXRpb24pOwotCi0JCS8vIHRoZSBiZWxvdyBjb2RlIGRvZXMgbm90IHdvcmsgYXQgdGhpcyB0aW1lIGJlY2F1c2UgY29udGVudCB0eXBlCi0JCS8vIHByZWZlcmVuY2VzIGFyZSBzdG9yZWQgaW4gdGhlIHBsYWNlIGFzIHBsdWdpbiBwcmVmZXJlbmNlcwotCi0JCS8vCQlQcmVmZXJlbmNlcyBjb250ZW50UHJlZmVyZW5jZXMgPSBudWxsOwotCQkvLwkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJLy8JCQljb250ZW50UHJlZmVyZW5jZXMgPSBwbHVnaW5QcmVmZXJlbmNlcy5ub2RlKGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkvLwkJfQotCQkvLwkJZWxzZSB7Ci0JCS8vCQkJY29udGVudFByZWZlcmVuY2VzID0gcGx1Z2luUHJlZmVyZW5jZXMubm9kZShERUZBVUxUX0xPQ0FUSU9OICk7Ci0JCS8vCQl9Ci0JCS8vCi0JCS8vCQlyZXR1cm4gY29udGVudFByZWZlcmVuY2VzOwotCQlyZXR1cm4gcGx1Z2luUHJlZmVyZW5jZXM7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoY29udGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZlcmVuY2VzU3RyaW5nKElDb250ZW50VHlwZSBjb250ZW50VHlwZSwgU3RyaW5nIGtleSkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKGNvbnRlbnRUeXBlKTsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGtleSwgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKGNvbnRlbnRUeXBlKS5nZXQoa2V5LCBudWxsKSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmZXJlbmNlc1N0cmluZyhTdHJpbmcgY29udGVudFR5cGVJZCwgU3RyaW5nIGtleSkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKGNvbnRlbnRUeXBlSWQpOwotCQlTdHJpbmcgdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoa2V5LCBnZXREZWZhdWx0UHJlZmVyZW5jZXMoY29udGVudFR5cGVJZCkuZ2V0KGtleSwgbnVsbCkpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZ1bGxJZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW5mZXJQbHVnaW5JZChTdHJpbmcgZnVsbElkKSB7Ci0JCS8vIHNpbXBseSB0cmltIG9mZiBsYXN0ICJzZWdtZW50IiBmcm9tIGZ1bGwgSUQuCi0JCWludCBsYXN0U2VnbWVudFBvcyA9IGZ1bGxJZC5sYXN0SW5kZXhPZignLicpOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBudWxsOwotCQlpZiAobGFzdFNlZ21lbnRQb3MgIT0gLTEpIHsKLQkJCXBsdWdpbklkID0gZnVsbElkLnN1YnN0cmluZygwLCBsYXN0U2VnbWVudFBvcyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB3ZWlyZCBjYXNlPyBXZSdsbCBhdCBsZWFzdCBwdXQvZ2V0IHRoZW0gc29tZXdoZXJlCi0JCQlwbHVnaW5JZCA9IERFRkFVTFRfTE9DQVRJT047Ci0JCX0KLQkJaWYgKCFidW5kbGVFeGlzdHMocGx1Z2luSWQpKSB7Ci0JCQkvLyB1c2UgZGVmYXVsdCBsb2NhdGlvbgotCQkJcGx1Z2luSWQgPSBERUZBVUxUX0xPQ0FUSU9OOwotCQl9Ci0JCXJldHVybiBwbHVnaW5JZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4MjY3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Bc3NlcnQ7Ci0KLQotLyoqCi0gKiBBIGNvbnZlbmllbmNlIGNsYXNzIHRvIHN0YXRpY2FsbHkgZ2V0IHByZWZlcmVuZW5jZXMuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcyB7Ci0KLQkvLyBhY3R1YWxseSBhIG51bGwvZW1wdHkgc3RyaW5nIGFsc28gbWVhbnMgdXNlIHdvcmtiZW5jaCBkZWZhdWx0IHNvIHRoaXMKLQkvLyBjb25zdGFudCBtaWdodCBub3QgcmVhbGx5IGJlIG5lY2Vzc2FyeQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktCRU5DSF9ERUZBVUxUID0gIldPUktCRU5DSF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SmF2YVBsYXRmb3JtRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBub3RlOiBpdHMgaW1wb3J0YW50IHRvIHVzZSB0aGlzIHN5c3RlbSBwcm9wZXJ0eSwKLQkJLy8gaW5zdGVhZAotCQkvLyBvZgotCQkvLyBCeXRlVG9DaGFyQ29udmVydGVyLmdldERlZmF1bHQoKS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpCi0JCS8vIGlub3JkZXIgdG8gaGFuZGxlIGNoYW5nZXMgIm9uIHRoZSBmbHkiLiB0aGUKLQkJLy8gQnl0ZVRvQ2hhckNvbnZlcnRlcgotCQkvLyBkZWZhdWx0IGlzIGFwcGFyZW50bHkgc2V0IG9ubHkgd2hlbiBWTSBzdGFydHMuCi0JCS8vIFRoZXJlJ3Mgbm90IHJlYWxseSBhbnkgImN1c29tdGVyIHNjbmVyZXJpb3MiCi0JCS8vIHRoYXQgY2hhbmdlIHRoZQotCQkvLyBkZWZhdWx0IGVuY29kaW5nICJvbiB0aGUgZmx5IiwgYnV0IGl0cyBhdCBsZWFzdAotCQkvLyB1c2VkIGR1cmluZwotCQkvLyBvdXIgYXV0b21hdGVkIHRlc3RzLgotCQlTdHJpbmcgZW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIG5ld0xpbmVDb2RlID0gbnVsbDsKLQkJbmV3TGluZUNvZGUgPSBDb250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5nZXRQcmVmZXJlbmNlc1N0cmluZyhjb250ZW50VHlwZUlkLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFKTsKLQkJaWYgKG5ld0xpbmVDb2RlID09IG51bGwpCi0JCQlyZXN1bHQgPSBudWxsOwotCQllbHNlIGlmIChuZXdMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpKQotCQkJcmVzdWx0ID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSOwotCQllbHNlIGlmIChuZXdMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpKQotCQkJcmVzdWx0ID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0xGOwotCQllbHNlIGlmIChuZXdMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1JMRikpCi0JCQlyZXN1bHQgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1JMRjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGN1cnJlbnQgb3V0cHV0IGVuY29kaW5nIHByZWZlcmVuY2UgZm9yIGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCSAqICh1bmlxdWUgSUFOQSBlbmNvZGluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVc2VyUHJlZmVycmVkQ2hhcnNldE5hbWUoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJU3RyaW5nIHByZWZFbmNvZGluZyA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSWQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJU3RyaW5nIGVuY29kaW5nID0gcHJlZkVuY29kaW5nOwotCQkvLyBnZXQgd29ya2JlbmNoIGVuY29kaW5nIHByZWZlcmVuY2UgaWYgcHJlZmVyZW5jZQotCQkvLyByZXF1ZXN0cyBpdAotCQlpZiAocHJlZkVuY29kaW5nID09IG51bGwgfHwgcHJlZkVuY29kaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwIHx8IHByZWZFbmNvZGluZy5lcXVhbHMoQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLldPUktCRU5DSF9ERUZBVUxUKSkgewotCQkJZW5jb2RpbmcgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0V29ya2JlbmNoUHJlZmVycmVkQ2hhcnNldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gZ2V0IHNwZWNpZmllZCBwcmVmZXJlbmNlLiBTdWJjbGFzc2VzIGNhbid0IG92ZXJyaWRlLAotCSAqIHNpbmNlIHdlIGV4cGVjdCB0aGlzIHRvIHdvcmsgaW4gYSBjb25zaXN0ZW50IHdheS4gTm90ZTogdGhpcyBpcwotCSAqIHNwZWNpZmljIHRvIEhUTUwgYW5kIENTUyBhbmQgaXMgaW50ZW5kZWQgdG8gc3VwcGx5IGEgImRlZmF1bHQgc3BlYyIKLQkgKiBvdGhlciB0aGFuIHRoZSB3b3JrYmVuY2ggcGxhdGZvcm0ncyBkZWZhdWx0LCBvbmx5IGZvciB0aG9zZSBjYXNlcyB3aGVyZQotCSAqIHRoZXJlIGlzIG5vIGVuY29kaW5nIHNwZWNpZmllZCBhbnl3aGVyZSBlbHNlLCBlLmcuIGluIHRoZSBmaWxlLCBvciBhcyBhCi0JICogZmlsZSBvciBmb2xkZXIgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VXNlclNwZWNpZmllZERlZmF1bHRFbmNvZGluZ1ByZWZlcmVuY2UoKSB7Ci0JCVN0cmluZyBDb250ZW50VHlwZUlEX0hUTUwgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ2V0VXNlclNwZWNpZmllZERlZmF1bHRFbmNvZGluZ1ByZWZlcmVuY2UoQ29udGVudFR5cGVJRF9IVE1MKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZShTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQotCQkvLyBmaXJzdCB0cnkgdG8gZ2V0IGJhc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJRCk7Ci0JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQllbmMgPSBjb250ZW50VHlwZS5nZXREZWZhdWx0Q2hhcnNldCgpOwotCQl9Ci0JCQotCQkvLyBuZXh0IHRyeSB0byBnZXQgc3NlJ3MgZGVmYXVsdCBlbmNvZGluZyBmb3IgY29udGVudCB0eXBlCi0JCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSUQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQpOwotCQl9Ci0JCQotCQkvLyBuZXh0LCBqdXN0IHRyeSBhbmQgdXNlIHdvcmtiZW5jaCBlbmNvZGluZwotCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBnZXRXb3JrYmVuY2hTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmcoKTsKLQkJfQotCQkKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgV29ya2JlbmNoIGVuY29kaW5nIHByZWZlcmVuY2UuIE5vdGU6IGlmIHdvcmtiZW5jaCBlbmNvZGluZyBpcwotCSAqIG51bGwsIHBsYXRmb3JtIGVuY29kaW5nIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFdvcmtiZW5jaFByZWZlcnJlZENoYXJzZXROYW1lKCkgewotCQlTdHJpbmcgY2hhcnNldCA9IFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCQljaGFyc2V0ID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldElhbmFQcmVmZXJyZWRDaGFyc2V0TmFtZShjaGFyc2V0KTsKLQkJcmV0dXJuIGNoYXJzZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBXb3JrYmVuY2ggZW5jb2RpbmcgcHJlZmVyZW5jZS4gV2lsbCByZXR1cm4gbnVsbCBpZiBub25lCi0JICogc3BlY2lmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRXb3JrYmVuY2hTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCVJlc291cmNlc1BsdWdpbiByZXNvdXJjZVBsdWdpbiA9IFJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKTsKLQkJU3RyaW5nIGVuYyA9IHJlc291cmNlUGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFJlc291cmNlc1BsdWdpbi5QUkVGX0VOQ09ESU5HKTsKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHVzZURlZmF1bHROYW1lUnVsZXMoSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGVuY29kaW5nUHJvdmlkZXIpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQllbmMgPSBlbmNvZGluZ1Byb3ZpZGVyLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBlbmM7Ci0JCX0gZWxzZSB7Ci0JCQllbmMgPSBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZSgpOwotCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5jOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuYyA9IGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpOwotCQkJCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGVuYzsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuYyA9IGdldEphdmFQbGF0Zm9ybURlZmF1bHRFbmNvZGluZygpOwotCQkJCQkvLyBlbmMgc2hvdWxkIG5ldmVyIGJlIG51bGwgKGJ1dCB3ZSdsbAotCQkJCQkvLyBjaGVjayBhbnl3YXkpCi0JCQkJCWlmIChlbmMgIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gZW5jOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUFzc2VydC5pc05vdE51bGwoZW5jLCAicG9zdCBjb25kaXRpb24gaW52YWxpZCIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGVuYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9FbmNvZGluZ01lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5NWE4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0byBzaW1wbHkgaG9sZCBpbmZvcm1hdGlvbiBhbmQgZGF0YSBhYm91dCB0aGUgdHlwZSBvZgotICogZW5jb2RpbmcgZm91bmQgZm9yIGEgcmVzb3VyY2UuIEl0IG5vdCBvbmx5IGluY2x1ZGVzIG5hbWVzLCBldGMuLCBidXQgYWxzbwotICogZ2l2ZXMgaGludHMgYWJvdXQgdGhlIGFsZ29yaXRobSwgb3IgcnVsZSwgdGhhdCB0aGUgZW5jb2RuZyB3YXMgZGV0ZXJtaW5lZC4KLSAqIEhhdmluZyBhbGwgdGhpcyBpbmZvIGluIGEgY2VudHJhbCBvYmplY3QsIGFzc29jaWF0ZWQgd2l0aCB0aGUgRG9jdW1lbnQKLSAqICh0ZWNobmljYWxseSwgSVN0cnVjdHVyZWREb2N1bWVudCksIGFsbG93cyBmb3IgYmV0dGVyIHVzZXIgZXJyb3IgbWVzc2FnZXMsCi0gKiBhbmQgYmV0dGVyIGhhbmRsaW5nIG9mIGtub3dpbmcgaG93IHRvIGR1bXAgYSBmaWxlLCBnaXZlbiB3ZSBrbm93IGhvdyBpdCB3YXMKLSAqIGxvYWRlZC4KLSAqIAotICogTm90ZTogdGhlIGRhdGEgaW4gdGhpcyBjbGFzcyBpcyBvbmx5IHZhbGlkIGlmIGl0cyBoYXMgYWN0dWFsbHkgZ29uZSB0aHJvdWdoCi0gKiB0aGUgbG9hZGluZyBvciBkdW1waW5nIHNlcXVlbmNlLiBJdCBpcyBub3QgYWNjdXJhdGUsIGZvciBleGFtcGxlLCBpZiBhCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgc2ltcGx5IGNyZWF0ZWQgYW5kIHRoZW4gc2V0VGV4dCBjYWxsZWQuIEluIHRoaXMgdHlwZQotICogb2YgY2FzZSwgYWNjdXJhY3kgZm9yIGxvYWRpbmcgYW5kIGR1bXBpbmcgaXMgbm90IHJlcXVpcmVkLCBzaW5jZSBpdHMgYWxsCi0gKiByZS1kaXNjb3ZlcmVkLiBPbmUgbGltaXRhdGlvbiBpcyB0aGF0IHN0cnVjdHVyZWREb2N1bWVudCdzIGNyZWF0ZWQgImZyb20KLSAqIHNjcmF0Y2giIHRoaXMgd2F5LCBkb24ndCBoYXZlIGFueSBlbmNvZGluZyBpbmZvcm1hdGlvbiB0byBjb3VudCBvbiwgYW5kCi0gKiB3b3VsZCBoYXZlIHRvIGFycmFuZ2UgdGhlIHByb2Nlc3NpbmcgdG8gYmUgZG9uZS4gKEFuZCBpdCBpcyBkb25lLAotICogYXV0b21hdGljYWxseSBpZiBnb2luZyB0aHJvdWdoIGxvYWRlciBvciBkdW1wZXIsIGJ1dCBwZXJoYXBzIG5vdCBpbiBmdXR1cmUKLSAqIG5ldyB1c2VzLiBUT0RPOiB0aGlzIGNhbiBiZSBpbnByb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuKQotICogCi0gKiBpc0luaXRpYWxpemVkIGlzIHNldCB3aGVuIHRoZSBsb2FkZXIgb3IgZHVtcGVyIHByb2Nlc3NlcyBoYXZlIGJlZW4gdXNlZCwKLSAqIGJ1dCBldmVuIHRoaXMgY2FuJ3QgYmUgY291bnRlZCBvbiAxMDAlIGlmIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBtb2RpZmllZAotICogc2luY2UuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nTWVtZW50byBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTE9ORUQgPSAiY2xvbmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUID0gIkRlZmF1bHRzQXNzdW1lZEZvckVtcHR5SW5wdXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVFNfVVNFRF9EVUVfVE9fU01BTExfU1RSRUFNID0gImRlZmF1bHRzVXNlZER1ZVRvU21hbGxTdHJlYW0iOyAvLyROT04tTkxTLTEkCi0KLQotCS8qCi0JICogU3RyaW5ncyB0byBiZSB1c2VkIGZvciB0cmFjaW5nLiBUT0RPOiBuZWVkIHRvIGNsZWFuIHRoaXMgdXAsIHdlIG5vCi0JICogbG9uZ2VyIHVzZSBhbGwgb2YgdGhlbQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMgPSAiZGV0ZWN0ZWRTdGFuZGFyZFVuaWNvZGVCeXRlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1VORF9FTkNPRElOR19JTl9DT05URU5UID0gImZvdW5kRW5jb2RpbmdJbkNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9VTkRfRU5DT0RJTkdfSU5fU1RSRUFNID0gImZvdW5kRW5jb2RpbmdJblN0cmVhbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1VORF9FTkNPRElOR19JTl9TVFJVQ1RVUkVEX0RPQ1VNRU5UID0gImZvdW5kRW5jb2RpbmdJblN0cnVjdHVyZWREb2N1bWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHVUVTU0VEX0VOQ09ESU5HX0ZST01fU1RSRUFNID0gIkd1ZXNzRW5jb2RpbmdGcm9tU3RyZWFtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfTkFNRV9GT1VORF9BU19JQU5BX05BTUUgPSAibm9NYXBwaW5nRm91bmRCdXRKYXZhTmFtZUZvdW5kVG9CZUlBTkFOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfTkFNRV9GT1VORF9JTl9BTElBU19OQU1FID0gIm5vTWFwcGluZ0ZvdW5kQnV0SmF2YU5hbWVGb3VuZEluQWxpYXNUYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT19JQU5BX05BTUVfRk9VTkQgPSAibm9NYXBwaW5nRm91bmRGcm9tSmF2YU5hbWVUb0lBTkFOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQgPSAiVXNlZENvbnRlbnRUeXBlRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VEX0pBVkFfREVGQVVMVCA9ICJVc2VkSmF2YURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFRF9NRU1FTlRPX0ZST01fTE9BRCA9ICJ1c2VkTWVtZW50b0Zyb21Mb2FkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfUFJPUEVSVFlfU0VUVElOR1MgPSAiVVNFRF9QUk9QRVJUWV9TRVRUSU5HUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VEX1VTRVJfU1BFQ0lGSUVEX1BSRUZFUkVOQ0UgPSAiVXNlZFVzZXJTcGVjaWZpZWRQcmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfV09SS1NQQUNFX0RFRkFVTFQgPSAiVXNlZFdvcmtzcGFjZURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFUl9JU19VU0lOR19KQVZBX0VOQ09ESU5HID0gIlVzZXJJc1VzaW5nSmF2YUVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZBcHByb3ByaWF0ZURlZmF1bHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkludmFsaWRFbmNvZGluZzsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgZkphdmFDaGFyc2V0TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZlVuaWNvZGVTdHJlYW07Ci0JcHJpdmF0ZSBib29sZWFuIGZVVEY4M0J5dGVCT01Vc2VkOwotCQotCXByaXZhdGUgYnl0ZVtdIGZCT007Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQlFbmNvZGluZ01lbWVudG8gb2JqZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW9iamVjdCA9IChFbmNvZGluZ01lbWVudG8pIHN1cGVyLmNsb25lKCk7Ci0JCX0KLQkJY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3JlIGltcGxlbWVudGluZyBoZXJlCi0JCX0KLQotCQlyZXR1cm4gb2JqZWN0OwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGVEZWZhdWx0LiBUaGlzIGlzIG9ubHkgc2V0IGlmIGFuIGludmFsaWQgZW5jb2RpbmcKLQkgKiB3YXMgZm91bmQsIGFuZCBjb250YWlucyBhbiBjaGFyc2V0IGFwcHJvcHJpYXRlIHRvIHVzZSBhcyBhIGRlZmF1bHQKLQkgKiB2YWx1ZSwgaWYsIGZvciBleGFtcGxlLCB0aGUgdXNlciBkZWNpZGVzIHRvIGxvYWQgdGhlIGRvY3VtZW50IGFueXdheSwKLQkgKiBldmVuIHRob3VnaCB0aGUgY2hhcnNldCB3YXMgZm91bmQgdG8gYmUgaW52YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkgewotCQlpZiAoZkFwcHJvcHJpYXRlRGVmYXVsdCA9PSBudWxsKSB7Ci0JCQlmQXBwcm9wcmlhdGVEZWZhdWx0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQl9Ci0JCXJldHVybiBmQXBwcm9wcmlhdGVEZWZhdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJzZXQgbmFtZSwgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGNoYXJzZXQgbmFtZQotCSAqIGZvdW5kIGluIGdldEphdmFDaGFyc2V0TmFtZS4gVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgdGhlcmUgYXJlCi0JICogZGlmZmVyZW5jZXMgaW4gY2FzZS4gVGhpcyBtZXRob2QgbWlnaHQgcmV0dXJuIFNISUZUX0pJUywgYW5kIHRoZSB0aGUKLQkgKiBnZXRKYXZhQ2hhcnNldE5hbWUgbWlnaHQgcmV0dXJuIFNoaWZ0X0pJUyAtLSBpZiBTSElGVF9KSVMgd2FzIGRldGVjdGVkCi0JICogaW4gZmlsZS9kb2N1bWVudC4gSWYgdGhlIG9yaWdpbmFsIGZpbGUgY29udGFpbmVkIHRoZSBjb3JyZWN0IGNhc2UsIHRoZW4KLQkgKiB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4gbnVsbC4gVGhlIGdldEphdmFDaGFyc2V0TmFtZSBpcyB0eXBpY2FsbHkgdGhlCi0JICogb25lIHRoYXQgc2hvdWxkIGFsd2F5cyBiZSB1c2VkLCBhbmQgdGhpcyBvbmUgb25seSB1c2VkIGZvciBjZXJ0YWluCi0JICogZXJyb3IgY29uZGl0aW9ucywgb3Igb3IgaWYgd2hlbiBjcmVhdGluZyBhICJkdXBsaWNhdGUiIHJlc291cmNlLCBpdCB3YXMKLQkgKiBkZXNpcmVkIHRvIHVzZSBleGFjdGx5IHRoZSBjaGFyc2V0IG5hbWUgYXMgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50LiBBcwotCSAqIGFuIGV4YW1wbGUgb2YgdGhpcyBsYXRlciBjYXNlLCB0aGUgb3JpZ2luYWwgZG9jdW1lbnQgbWlnaHQgY29udGFpbgotCSAqIElTTy04ODU5LTksIGJ1dCB0aGUgZGV0ZWN0ZWQgY2hhcnNldCBuYW1lIG1pZ2h0IGNvbnRhaW4gSVNPLTg4NTktOS1JLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXRlY3RlZENoYXJzZXROYW1lKCkgewotCQlyZXR1cm4gZkRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNoYXJzZXQgbmFtZSB0aGF0IHdhcyBkZXRlY3RlZCwgYnV0IG5vdCBmb3VuZCB0byBiZSBhIGNoYXJzZXQKLQkgKiBzdXBwb29ydGVkIGJ5IHRoZSBWTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW52YWxpZEVuY29kaW5nKCkgewotCQlyZXR1cm4gZkludmFsaWRFbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBqYXZhIGNvbm9uaWNhbCBjaGFyc2V0IG5hbWUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFDaGFyc2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZKYXZhQ2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogd2UgbWF5IGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgbWV0aG9kLCBpZiBpdCB0dXJucyBvdXQgdGhpcyB3b3JrCi0JICogaXMgZG9uZSBieSAidGV4dCIgdHlwZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRVbmljb2RlQk9NKCkgewotCQlieXRlW10gYm9tID0gbnVsbDsKLQkJaWYgKGlzVVRGODNCeXRlQk9NVXNlZCgpKQotCQkJYm9tID0gSUNvbnRlbnREZXNjcmlwdGlvbi5CT01fVVRGXzg7Ci0JCWVsc2UgaWYgKGlzVW5pY29kZVN0cmVhbSgpKQotCQkJYm9tID0gZkJPTTsKLQkJcmV0dXJuIGJvbTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBpbiBvdXIgaW1wbGVtZW50YXRpb24sIHRoZSBzdHJlYW0gaXMgYSB1bmljb2RlIHN0cmVhbSBpZiB0aGUKLQkgKiBjaGFyc2V0IGlzIFVURi0xNiwgVVRGLTE2TEUsIG9yIFVURi0xNkJFLiBBIHN0cmVhbSB3aXRoIDMgYnl0ZSBCT00gaXMKLQkgKiBub3QgY29uc2lkZXJlZCB1bmljb2RlIHN0cmVhbSBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGlzIGEgdW5pY29kZSAoVVRGLTE2KSBzdHJlYW0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VuaWNvZGVTdHJlYW0oKSB7Ci0JCXJldHVybiBmVW5pY29kZVN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBpbiBvdXIgaW1wbGVtZW50YXRpb24sIHRoZSBzdHJlYW0gaXMgYSB1bmljb2RlIHN0cmVhbSBpZiB0aGUKLQkgKiBjaGFyc2V0IGlzIFVURi0xNiwgVVRGLTE2TEUsIG9yIFVURi0xNkJFLiBBIHN0cmVhbSB3aXRoIDMgYnl0ZSBCT00gaXMKLQkgKiBub3QgY29uc2lkZXJlZCB1bmljb2RlIHN0cmVhbSBoZXJlLgotCSAqIAotCSAqIFNldCBkdXJpbmcgbG9hZCwgY2FuIGJlIHVzZWQgYnkgZHVtcGVyIHRvIHdyaXRlIDMgYnl0ZSBCT00sIHdoaWNoIEphdmEKLQkgKiBkb2VzIG5vdCBub3JtYWxseSBkby4gVGhpcyBoZWxwcyBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLQkgKiBwcm9ncmFtcyAodGhvc2UgdGhhdCB3cm90ZSB0aGUgMyBieXRlIEJPTSB0aGVyZSB0byBiZWdpbiB3aXRoLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVVRGODNCeXRlQk9NVXNlZCgpIHsKLQkJcmV0dXJuIGZVVEY4M0J5dGVCT01Vc2VkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiBnZXRJbnZhbGlkRW5jb2RpbmcoKSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFwcHJvcHJpYXRlRGVmYXVsdC4KLQkgKiAKLQkgKiBAcGFyYW0gYXBwcm9wcmlhdGVEZWZhdWx0Ci0JICogICAgICAgICAgICBUaGUgYXBwcm9wcmlhdGVEZWZhdWx0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcHJvcHJpYXRlRGVmYXVsdChTdHJpbmcgYXBwcm9wcmlhdGVEZWZhdWx0KSB7Ci0JCWZBcHByb3ByaWF0ZURlZmF1bHQgPSBhcHByb3ByaWF0ZURlZmF1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREZXRlY3RlZENoYXJzZXROYW1lKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZEZXRlY3RlZENoYXJzZXROYW1lID0gZGV0ZWN0ZWRDaGFyc2V0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnZhbGlkRW5jb2RpbmcoU3RyaW5nIGludmFsaWRFbmNvZGluZykgewotCQlmSW52YWxpZEVuY29kaW5nID0gaW52YWxpZEVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGphdmFFbmNvZGluZ05hbWUuCi0JICogCi0JICogQHBhcmFtIGphdmFFbmNvZGluZ05hbWUKLQkgKiAgICAgICAgICAgIFRoZSBqYXZhRW5jb2RpbmdOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFDaGFyc2V0TmFtZShTdHJpbmcgamF2YUNoYXJzZXROYW1lKSB7Ci0JCWZKYXZhQ2hhcnNldE5hbWUgPSBqYXZhQ2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmljb2RlU3RyZWFtKGJvb2xlYW4gdW5pY29kZVN0cmVhbSkgewotCQlmVW5pY29kZVN0cmVhbSA9IHVuaWNvZGVTdHJlYW07Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1VEY4M0J5dGVCT01mb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gdVRGODNCeXRlQk9NZm91bmQKLQkgKiAgICAgICAgICAgIFRoZSB1VEY4M0J5dGVCT01mb3VuZCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVVEY4M0J5dGVCT01Vc2VkKGJvb2xlYW4gdVRGODNCeXRlQk9NVXNlZCkgewotCQlmVVRGODNCeXRlQk9NVXNlZCA9IHVURjgzQnl0ZUJPTVVzZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5pY29kZUJPTShieXRlW10gYm9tKSB7Ci0JCWZCT00gPSBib207Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9FbmNvZGluZ1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRW5jb2RpbmdSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMjk4OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9FbmNvZGluZ1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLQotLyoqCi0gKiBDbGFzcyB0byBwcm92aWRlZCAiZW51bWVyYXRlZCB0eXBlcyIgZm9yIGVuY29kaW5nIHJ1bGUgcGFyYW1ldGVyLiBUaGlzIGlzCi0gKiB0byBiZSB1c2VkIGJ5IGNsaWVudCB0byBoYXZlIHNvbWUgY29udHJvbCBvdmVyIGhvdyBlbmNvZGluZyBpcyBkZXRlcm1pbmVkLgotICovCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdSdWxlIHsKLQkvKioKLQkgKiBDT05URU5UX0JBU0VEIG1lYW5zIHRoZSBjbGFzcyB3aGljaCB1c2VzIHRoZSBwYXJhbWV0ZXIgKHN1Y2ggYXMKLQkgKiBjb250ZW50VHlwZSBMb2FkZXJzKSBzaG91bGQgdXNlIHdoYXQgZXZlciBydWxlcyBpdCBub3JtYWxseSB3b3VsZC4KLQkgKiAoTm90ZSwgc29tZSBjb250ZW50IHR5cGUgbG9hZGVycyBtYXkgbm90IGFsd2F5cyBsaXRlcmFsbHkgdXNlIHRoZSBmaWxlCi0JICogY29udGVudCB0byBkZXRlcm1pbmUgZW5jb2RpbmcsIGJ1dCB0aGUgcG9pbnQgaXMgdGhleSBzaG91bGQgdXNlIHdoYXQKLQkgKiBldmVyIHJ1bGVzIHRoZXkgbm9ybWFsbHkgd291bGQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW5jb2RpbmdSdWxlIENPTlRFTlRfQkFTRUQgPSBuZXcgRW5jb2RpbmdSdWxlKCJDT05URU5UX0JBU0VEIik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBGT1JDRV9ERUZBVUxUIG1lYW5zIHRoZSBjbGFzcyB3aGljaCB1c2VzIHRoZSBwYXJhbWV0ZXIgKHN1Y2ggYXMKLQkgKiBjb250ZW50VHlwZSBMb2FkZXJzKSBzaG91bGQgdXNlIHdoYXQgZXZlciBpdCBkZWZpbmVzIGFzIHRoZSBkZWZhdWx0Ci0JICogZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGluZ1J1bGUgRk9SQ0VfREVGQVVMVCA9IG5ldyBFbmNvZGluZ1J1bGUoIkZPUkNFX0RFRkFVTFQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSUdOT1JFX0NPTlZFUlNJT05fRVJST1IgbWVhbnMgdGhhdCB0aGUgc2F2ZSBvcGVyYXRpb24gc2hvdWxkIHNhdmUgZXZlbgotCSAqIGlmIGl0IGVuY291bnRlcnMgY29udmVyc2lvbiBlcnJvcnMuIFRoaXMgd2lsbCByZXN1bHQgaW4gc29tZSBkYXRhIGxvc3MsCi0JICogc28gc2hvdWxkIG9ubHkgYmUgdXNlZCBhZnRlciB0aGUgdXNlciBjb25maXJtcyB0aGF0IGlzIGluZGVlZCB3aGF0IHRoZXkKLQkgKiB3YW50IHRvIGRvLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW5jb2RpbmdSdWxlIElHTk9SRV9DT05WRVJTSU9OX0VSUk9SID0gbmV3IEVuY29kaW5nUnVsZSgiSUdOT1JFX0NPTlZFUlNJT05fRVJST1IiKTsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBlbmNvZGluZ1J1bGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW5jb2RpbmdSdWxlIGlzIHByaXZhdGUsIHNvIG5vIG9uZSBjYW4gaW5zdGFudGlhdGUKLQkgKiBleGNlcHQgdGhpcyBjbGFzcyBpdHNlbGYuCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ1J1bGUoU3RyaW5nIHJ1bGVOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCWVuY29kaW5nUnVsZSA9IHJ1bGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBlbmNvZGluZ1J1bGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQ5MDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUNvZGVkUmVzb3VyY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLQotcHVibGljIGludGVyZmFjZSBJQ29kZWRSZXNvdXJjZVBsdWdpbiB7Ci0JU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMmUwYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZCB7Ci0JLyoqCi0JICogVGhlIEFQUFJPUFJJQVRFX0RFRkFVTFQgZmllbGQgaXMgdXNlZCBvbmx5IHdoZW4gdGhlCi0JICogSUNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0IHJldHVybnMgbnVsbC4gSXRzIHR5cGljYWxseSBzZXQgZnJvbQotCSAqIHVzZXIgcHJlZmVyZW5jZXMuIEtub3duIHVzZXMgY2FzZXMgYXJlIEhUTUwgYW5kIENTUywgd2hlcmUgdGhlcmUgaXMgbm8KLQkgKiAic3BlYyBkZWZhdWx0IiBmb3IgdGhvc2UgY29udGVudCB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgQVBQUk9QUklBVEVfREVGQVVMVCA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiYXBwcm9wcmlhdGVEZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgREVURUNURURfQ0hBUlNFVCBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0IHdoZW4gdGhlICJkZXRlY3RlZCIgY2hhcnNldAotCSAqIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBqYXZhIGNoYXJzZXQsIGV2ZW4gdGhvdWdoIGZ1bmN0aW9uYWxseQotCSAqIGVxdWl2ZWxlbnQuIFRoaXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgY2FzZXMgYXJlIGRpZmZlcmVudCwKLQkgKiBvciB3aGVuIGFuIGFsaWFzIG5hbWUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBjb25hbmljYWwgbmFtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgREVURUNURURfQ0hBUlNFVCA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiZGV0ZWN0ZWRDaGFyc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgVU5TVVBQT1JURURfQ0hBUlNFVCBwcm9wZXJ0eSBob2xkcyB0aGUgY2hhcnNldCB2YWx1ZSwgaWYgaXRzIGJlZW4KLQkgKiBmb3VuZCB0byBiZSBhbiB1bnN1cHBvdGVkIGNoYXJzZXQuIFRoaXMgaXMgaGVscGZ1bCBpbiBlcnJvciBtZXNzYWdlcywKLQkgKiBvciBpbiBjYXNlcyB3aGVuIGV2ZW4gdGhvdWdoIHRoZSBjaGFyc2V0IGlzIGludmFsaWQsIHRoZSBqYXZhIGNoYXJzZXQKLQkgKiBpcyBhc3N1bWVkIHRvIGJlIHRoZSBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBVTlNVUFBPUlRFRF9DSEFSU0VUID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJ1bnN1cHBvcnRlZENoYXJzZXQiKTsgLy8kTk9OLU5MUy0xJAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVJlc291cmNlQ2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lSZXNvdXJjZUNoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGRjYmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVJlc291cmNlQ2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGV4dGVuZHMgSVN0cmVhbUNoYXJzZXREZXRlY3RvciB7Ci0Jdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lTdHJlYW1DaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVN0cmVhbUNoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjUwOGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVN0cmVhbUNoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotcHVibGljIGludGVyZmFjZSBJU3RyZWFtQ2hhcnNldERldGVjdG9yIHsKLQlTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0Jdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pOwotCi0Jdm9pZCBzZXQoUmVhZGVyIHJlYWRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNzE1OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotCi1wdWJsaWMgY2xhc3MgTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SmF2YVBsYXRmb3JtRGVmYXVsdEVuY29kaW5nKCkgewotCQlTdHJpbmcgZW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXNlclNwZWNpZmllZERlZmF1bHRGb3JDb250ZW50VHlwZShJRmlsZSBpRmlsZSkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQkJCi0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50VHlwZSA9IGlGaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkKLQkJCS8vIGZpcnN0IHRyeSB0byBnZXQgYmFzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZSAKLQkJCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJZW5jID0gY29udGVudFR5cGUuZ2V0RGVmYXVsdENoYXJzZXQoKTsKLQkJCX0KLQotCQkJLy8gbmV4dCB0cnkgdG8gZ2V0IHNzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZQotCQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWVuYyA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VUKTsKLQkJCX0KLQkJCQotCQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQllbmMgPSBudWxsOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGNvcmUgZXhjZXB0aW9uIG9jY3VycywgYXNzdW1lIG5vIHByZWZlcmVuY2UhCi0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXNlclNwZWNpZmllZERlZmF1bHRGb3JDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQkJCi0JCS8vIGZpcnN0IHRyeSB0byBnZXQgYmFzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCWVuYyA9IGNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0KCk7Ci0JCX0KLQkJCi0JCS8vIG5leHQgdHJ5IHRvIGdldCBzc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUKLQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuZ2V0UHJlZmVyZW5jZXNTdHJpbmcoY29udGVudFR5cGVJZCwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCk7Ci0JCX0KLQkJCi0JCS8vIHJldHVybiBibGFuayBhcyBudWxsCi0JCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0V29ya2JlbmNoU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nKCkgewotCQlSZXNvdXJjZXNQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JCVN0cmluZyBlbmMgPSByZXNvdXJjZVBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhSZXNvdXJjZXNQbHVnaW4uUFJFRl9FTkNPRElORyk7Ci0JCS8vIHJldHVybiBibGFuayBhcyBudWxsCi0JCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3BlY0RlZmF1bHQKLQkgKiAgICAgICAgICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgY2hhcnNldCBuYW1lIHRoYXQgd291bGQgb3JkaW5hcmlseSBiZQotCSAqICAgICAgICAgICAgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgY29udGVudC4gTnVsbCBtYXkgYmUKLQkgKiAgICAgICAgICAgIHNwZWNpZmlmZWQgZm9yIHRob3NlIHR5cGVzIHdpdGggbm8gc3BlYyBkZWZhdWx0LiBJZiB0aGUgc3BlYwotCSAqICAgICAgICAgICAgZGVmYXVsdCBpcyBrbm93biAoYW5kIHBhc3NlZCBpbiksIHRoZW4gaXQgd2lsbCBiZSByZXR1cm5lZAotCSAqICAgICAgICAgICAgYWZ0ZXIgYmVpbmcgY2hlY2tlZCB0byBzZWUgaWYgdGhlcmUncyBiZSBhbnkgdXNlciBzcGVjaWZpZWQKLQkgKiAgICAgICAgICAgICJvdmVycmlkZSIgZm9yIHRoYXQgY2hhcnNldCAod2hpY2ggd291bGQgYmUgcmFyZSkuIEluIG90aGVyCi0JICogICAgICAgICAgICB3b3JkcywgaWYgdGhlIHNwZWMgaXMga25vd24sIHRoZXJlJ3MgbGl0dGxlIHJlYXNvbiB0byB1c2UKLQkgKiAgICAgICAgICAgIHRoaXMgbWV0aG9kLgotCSAqIEByZXR1cm4gdGhlIGNoYXJzZXQgdGhhdCBzaG91bGQgYmUgdXNlZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCi0JICogICAgICAgICBlc3RhYmxpc2hlZCBieSB0aGlzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHVzZURlZmF1bHROYW1lUnVsZXMoU3RyaW5nIHNwZWNEZWZhdWx0KSB7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJZW5jID0gc3BlY0RlZmF1bHQ7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZW5jOwotCQl9IGVsc2UgewotCQkJZW5jID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFVzZXJTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmdQcmVmZXJlbmNlKCk7Ci0JCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZXN1bHQgPSBlbmMudHJpbSgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuYyA9IGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpOwotCQkJCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGVuYy50cmltKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQllbmMgPSBnZXRKYXZhUGxhdGZvcm1EZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQkJLy8gZW5jIHNob3VsZCBuZXZlciBiZSBudWxsIChidXQgd2UnbGwKLQkJCQkJLy8gY2hlY2sgYW55d2F5KQotCQkJCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGVuYzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQXNzZXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMWIzNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MgaW4KLSAqIGNvZGUuIFRoZSBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZSB0eXBlIG9mCi0gKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlIHRocm93biB3aGVuCi0gKiBzb21ldGhpbmcgaXMgbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseSB1bnNwZWNpZmllZAotICogYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbiB0aGVzZSBiZWluZyB0aHJvd24KLSAqIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbSBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQotCS8qKgotCSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLQkgKiBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluIDxjb2RlPkFzc2VydDwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcwotCSAqIHRoYXQgY2F0Y2ggb3Igb3RoZXJ3aXNlIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvCi0JICogdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogPC9wPgotCSAqLwotCXN0YXRpYyBjbGFzcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsKSB7Ci0JCQlzdXBlcihkZXRhaWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyBub3QKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiwgYW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcwotCSAqIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZAotCSAqIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikKLQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcyBpcwotCSAqIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgZ2l2ZW4KLQkgKiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byB0ZXN0Ci0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90Ci0JICogdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UKLQkgKiBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikgewotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KLQlwcml2YXRlIEFzc2VydCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMjZiZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J1ZmZlcmVkTGltaXRlZFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgcHJldHR5IGxpbWl0ZWQgaW1wbGVtZW50YXRpb24sIHNvcnQgb2Ygc3BlY2lmaWMgCi0gKiB0byB0aGUgd2F5IGl0cyB1c2VkIGJ5IHRva2VuaXplcnMgKEpGbGV4KS4gVG8gcmVhbGx5IAotICogYmUgZ2VuZXJhbCBwdXJwb3NlLCB3b3VsZCBuZWVkIG1vcmUgd29yay4gCi0gKgotICovCi0KLQotcHVibGljIGNsYXNzIEJ1ZmZlcmVkTGltaXRlZFJlYWRlciBleHRlbmRzIEJ1ZmZlcmVkUmVhZGVyIHsKLQlwcml2YXRlIGludCBsaW1pdGVkQ291bnQ7Ci0JcHJpdmF0ZSBpbnQgblJlYWQ7Ci0KLQlwdWJsaWMgQnVmZmVyZWRMaW1pdGVkUmVhZGVyKFJlYWRlciByZWFkZXIsIGludCBzaXplKSB7Ci0JCXN1cGVyKHJlYWRlciwgc2l6ZSk7Ci0JCWlmIChyZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0cnkgewotCQkJCW1hcmsoc2l6ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGltcG9zc2libGUKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCWxpbWl0ZWRDb3VudCA9IHNpemU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCW5SZWFkKys7Ci0JCWlmIChuUmVhZCA+IGxpbWl0ZWRDb3VudCkgewotCQkJcmVzdWx0ID0gLTE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBzdXBlci5yZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChuUmVhZCArIGxlbiA+IGxpbWl0ZWRDb3VudCkgewotCQkJcmVzdWx0ID0gLTE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBzdXBlci5yZWFkKGNidWYsIG9mZiwgbGVuKTsKLQkJCW5SZWFkID0gblJlYWQgKyByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkU3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnVmZmVyZWRMaW1pdGVkU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Mjg2NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J1ZmZlcmVkTGltaXRlZFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEJ1ZmZlcmVkTGltaXRlZFN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gewotCi0JcHJpdmF0ZSBpbnQgbGltaXRlZENvdW50OwotCi0JcHVibGljIEJ1ZmZlcmVkTGltaXRlZFN0cmVhbShJbnB1dFN0cmVhbSBpblN0cmVhbSwgaW50IHNpemUpIHsKLQkJc3VwZXIoaW5TdHJlYW0sIHNpemUpOwotCQltYXJrKHNpemUpOwotCQl0cnkgewotCQkJbGltaXRlZENvdW50ID0gTWF0aC5taW4oc2l6ZSwgaW5TdHJlYW0uYXZhaWxhYmxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB1bmxpa2VseQotCQkJbGltaXRlZENvdW50ID0gMDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNhdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJcmV0dXJuIGxpbWl0ZWRDb3VudCAtIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBjb3BpZWQgZG93biBmcm9tIHN1cGVyIGNsYXNzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZU9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogY29waWVkIGRvd24gZnJvbSBzdXBlciBjbGFzcyB0aGVuLCBjaGFuZ2VkIHRvIHNpbWl1bGF0ZSBFT0YgaWYgZ29lcwotCSAqIGJleW9uZCBidWZmZXJlZCBhbW91bnQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlT3BlbigpOwotCQkvLyBmb3IgdGhpcyBzcGVjaWFsIHN0cmVhbSwgaW5kaWNhdGUgImVuZCBvZiBmaWxlIiB3aGVuIGJ1ZmZlciBpcwotCQkvLyBmdWxsCi0JCWlmIChwb3MgPj0gbGltaXRlZENvdW50KSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnJlYWQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZvciB0aGlzIHNwZWNpYWwgc3RyZWFtLCBpbmRpY2F0ZSAiZW5kIG9mIGZpbGUiIHdoZW4gYnVmZmVyIGlzCi0JCS8vIGZ1bGwKLQkJaWYgKHBvcyA+PSBsaW1pdGVkQ291bnQpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucmVhZChiLCBvZmYsIGxlbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J5dGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDQ2ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J5dGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQl0aGlzLmZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IHRoaXMuZkJ1ZmZlci5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IHRoaXMuZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKHRoaXMuZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWludCBiMCA9IHRoaXMuZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Db2RlZFJlc291cmNlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzkyOGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Db2RlZFJlc291cmNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb2RlZFJlc291cmNlUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQ29kZWRSZXNvdXJjZVBsdWdpbiBleHRlbmRzIFBsdWdpbiBpbXBsZW1lbnRzIElDb2RlZFJlc291cmNlUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ29kZWRSZXNvdXJjZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2RlZFJlc291cmNlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDb2RlZFJlc291cmNlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5VU0VfM0JZVEVfQk9NX1dJVEhfVVRGOCwgZmFsc2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5MTFiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTnVsbElucHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTnVsbElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDRmMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL051bGxJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBOdWxsSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jbWFyayhpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCS8vIHdlIGNhbiBtYXJrIG5vdGhpbmcuCi0JCS8vIGFuZCwgd2UgYXJlIHVzaW5nIHRoaXMgTnVsbCBjbGFzcyBzcGVjaWZpY2FsbHkgZm9yCi0JCS8vIGEgImZha2UiIHJlc2V0dGFibGUgc3RyZWFtLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhYWExZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLy9UT0RPOiByZXdvcmsgdGhpcyB3aXRoIG5ldyBwbGF0Zm9ybS9ydW50aW1lIEFQSXMgKGlmIHN0aWxsIG5lZWRlZCkuCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUJ1bmRsZUhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKFN0cmluZyByZXNvdXJjZVVSSSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VCdW5kbGUocmVzb3VyY2VVUkksIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoU3RyaW5nIHJlc291cmNlVVJJLCBMb2NhbGUgdGFyZ2V0TG9jYWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIHRyeSB0byBsb2FkIGJ1bmRsZSBmcm9tIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIHJlc291cmNlVVJJCi0JCS8vIHdlIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcmVzb3VyY2VVUkkgcG9pbnRzIHRvIHRoZSBsb2NhbAotCQkvLyBmaWxlIHN5c3RlbQotCi0JCWludCBpbmRleCA9IHJlc291cmNlVVJJLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJlc291cmNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIEJlbG93IHdlIHNldCAncmVzb3VyY2VEaXJlY3RvcnknIHNvIHRoYXQgaXQgZW5kcyB3aXRoIGEgJy8nLgotCQkvLyBIZXJlJ3MgYW4gZXhjZXJwdCBmcm9tIHRoZSBDbGFzc0xvYWRlciBKYXZhZG9jIC4uLgotCQkvLyBBbnkgVVJMIHRoYXQgZW5kcyB3aXRoIGEgJy8nIGlzIGFzc3VtZWQgdG8gcmVmZXIgdG8gYSBkaXJlY3RvcnkuCi0JCS8vIE90aGVyd2lzZSwgdGhlIFVSTCBpcyBhc3N1bWVkCi0JCS8vIHRvIHJlZmVyIHRvIGEgSkFSIGZpbGUgd2hpY2ggd2lsbCBiZSBvcGVuZWQgYXMgbmVlZGVkLgotCQkvLwotCQlTdHJpbmcgcmVzb3VyY2VEaXJlY3RvcnkgPSByZXNvdXJjZVVSSS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKLQkJU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSA9IHJlc291cmNlVVJJLnN1YnN0cmluZyhpbmRleCArIDEpOwotCi0JCS8vIGNyZWF0ZSBhIGNsYXNzIGxvYWRlciB3aXRoIGEgY2xhc3MgcGF0aCB0aGF0IHBvaW50cyB0byB0aGUgcmVzb3VyY2UKLQkJLy8gYnVuZGxlJ3MgbG9jYXRpb24KLQkJLy8gICAgICAgICAKLQkJVVJMW10gY2xhc3NwYXRoID0gbmV3IFVSTFsxXTsKLQkJY2xhc3NwYXRoWzBdID0gUGxhdGZvcm0ucmVzb2x2ZShuZXcgVVJMKHJlc291cmNlRGlyZWN0b3J5KSk7Ci0JCUNsYXNzTG9hZGVyIHJlc291cmNlTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKGNsYXNzcGF0aCwgbnVsbCk7Ci0KLQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZU5hbWUsIHRhcmdldExvY2FsZSwgcmVzb3VyY2VMb2FkZXIpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL1VuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjOWQ5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSAiY29tbW9uIGZ1bmN0aW9uIiBjbGFzcyB0byBkZWNpZGUgaWYgYW4gaW5wdXQgc3RyZWFtLCBpcyBhCi0gKiB1bmljb2RlIHN0cmVhbS4KLSAqLwotcHVibGljIGNsYXNzIFVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNl9DSEFSU0VUX05BTUUgPSAiVVRGLTE2IjsKLQkvLyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE5vdEVub3VnaElucHV0Rm9yQk9NRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotCi0JCS8qKgotCQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIE5vdEVub3VnaElucHV0Rm9yQk9NRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCQlzdXBlcihzKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBCQiA9IChieXRlKSAweEJCOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgQkYgPSAoYnl0ZSkgMHhCRjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIEVGID0gKGJ5dGUpIDB4RUY7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBGRSA9IChieXRlKSAtMjsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgRkYgPSAoYnl0ZSkgLTE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNkJFX0NIQVJTRVRfTkFNRSA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2TEVfQ0hBUlNFVF9OQU1FID0gIlVURi0xNkxFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84X0NIQVJTRVRfTkFNRSA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZk5vQk9NUG9zc2libGU7Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjaGVja0ZvckJPTShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQotCQl0cnkgewotCQkJYnl0ZSBiMSA9IGdldE5leHRCeXRlKGlucHV0U3RyZWFtKTsKLQkJCWJ5dGUgYjIgPSBnZXROZXh0Qnl0ZShpbnB1dFN0cmVhbSk7Ci0JCQlpZiAoYjEgPT0gRkUgJiYgYjIgPT0gRkYpIHsKLQkJCQlyZXN1bHQgPSBjcmVhdGVFbmNvZGluZ01lbWVudG8oVVRGXzE2QkVfQ0hBUlNFVF9OQU1FKTsKLQkJCQlyZXN1bHQuc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGIxID09IEZGICYmIGIyID09IEZFKSB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUVuY29kaW5nTWVtZW50byhVVEZfMTZMRV9DSEFSU0VUX05BTUUpOwotCQkJCQlyZXN1bHQuc2V0VW5pY29kZVN0cmVhbSh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlieXRlIGIzID0gZ2V0TmV4dEJ5dGUoKGlucHV0U3RyZWFtKSk7Ci0JCQkJCWlmIChiMSA9PSBFRiAmJiBiMiA9PSBCQiAmJiBiMyA9PSBCRikgewotCQkJCQkJcmVzdWx0ID0gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFVURl84X0NIQVJTRVRfTkFNRSk7Ci0JCQkJCQlyZXN1bHQuc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBzb3J0IG9mIHVuZXhwZWN0ZWQgZm9yIG5vcm1hbCBjYXNlcywgYnV0IGNhbiBvY2N1ciBmb3IKLQkJCS8vIGVtcHR5Ci0JCQkvLyBzdHJlYW1zLiBBbmQsIHRoaXMgY2FuIG9jY3VyICJub3JtYWxseSIgZm9yIG5vbi1CT00gc3RyZWFtcwotCQkJLy8gdGhhdAotCQkJLy8gaGF2ZSBvbmx5IHR3bwotCQkJLy8gYnl0ZXMsIGFuZCBmb3Igd2hpY2ggdGhvc2UgdHdvIGJ5dGVzIG1hdGNoIHRoZSBmaXJzdCB0d28gYnl0ZXMKLQkJCS8vIG9mIFVURi04Ci0JCQkvLyBCT00gSW4gYW55IGNhc2UsIHdlJ2xsIHNpbXBseSByZXR1cm4gbnVsbDsKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG90aGVyIGVycm9ycyBzaG91bGQgYmUgaW1wb3NzaWJsZQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGphdmFFbmNvZGluZ05hbWUpIHsKLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShqYXZhRW5jb2RpbmdOYW1lKTsKLQkJU3RyaW5nIGlhbmFOYW1lID0gQ2hhcnNldC5mb3JOYW1lKGphdmFFbmNvZGluZ05hbWUpLm5hbWUoKTsKLQkJZW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoaWFuYU5hbWUpOwotCQlpZiAoamF2YUVuY29kaW5nTmFtZS5lcXVhbHMoVVRGXzhfQ0hBUlNFVF9OQU1FKSkgewotCQkJZW5jb2RpbmdNZW1lbnRvLnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIGVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgSUFOQSBlbmNvZGluZyBuYW1lIGlmIEJPTSBkZXRlY3RlZCBpbiBzdHJlYW0uIElmIGEgQk9NIGlzCi0JICogZGV0ZWN0ZWQsIHRoZSBzdHJlYW0gaXMgbGVmdCBwb3NpdGlvbmVkIGFmdGVyIHJlYWR5aW5nIHRoZSBCT00uIElmIGEKLQkgKiBCT00gaXMgbm90IGRldGVjdGVkLCB0aGUgc3RlYW0gaXMgcmVzZXQuCi0JICogCi0JICogMHhGRUZGIFVURi0xNiwgYmlnLWVuZGlhbiAweEZGRkUgVVRGLTE2LCBsaXR0bGUtZW5kaWFuIDB4RUZCQkJGIFVURi04Ci0JICogKEJPTSBpcyBvcHRpb25hbCkKLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXRTdHJlYW0gLQotCSAqICAgICAgICAgICAgbXVzdCBiZSBhIHJlc2V0YWJsZSAobWFyayBzdXBwb3J0ZWQpIHN0cmVhbSBzbyBpdCBjYW4gYmUKLQkgKiAgICAgICAgICAgIHJlc2V0LCBpZiBub3QgQk9NIGVuY29kZWQgc3RyZWFtCi0JICogQHJldHVybiBTdHJpbmcgLSBJQU5BIGVuY29kaW5nbmFtZSAobWF5IG5vdCB3b3JrIHdlbGwgb24gMS4zLCBidXQgMS40Ci0JICogICAgICAgICBzZWVtcyB0byBoYXZlIGdvb2Qgc3VwcG9ydCBmb3IgSUFOQSBuYW1lcykKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKCFmTm9CT01Qb3NzaWJsZSkgewotCi0JCQlpZiAoZklucHV0U3RyZWFtID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICghZklucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlucHV0U3RyZWFtIG11c3QgYmUgcmVzZXRhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcmVzdWx0ID0gY2hlY2tGb3JCT00oZklucHV0U3RyZWFtKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQlwcml2YXRlIGJ5dGUgZ2V0TmV4dEJ5dGUoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaW50IGJ5dGVDaGFyQXNJbnQgPSAtMTsKLQkJLy8gYmUgc3VyZSB3ZSB3b24ndCBibG9jawotCQlpZiAoaW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQlieXRlQ2hhckFzSW50ID0gaW5wdXRTdHJlYW0ucmVhZCgpOwotCQkJYnl0ZUNoYXJBc0ludCA9IGJ5dGVDaGFyQXNJbnQgJiAwWEZGOwotCQl9Ci0JCS8vIHRvIGF2b2lkIGNvbmZ1c3Rpb24gb3ZlciBtZWFuaW5nIG9mIHJldHVybmVkIGJ5dGUsCi0JCS8vIHRocm93IGV4Y2VwdGlvbiBpZiBFT0YgcmVhY2hlZC4KLQkJaWYgKGJ5dGVDaGFyQXNJbnQgPT0gLTEpCi0JCQl0aHJvdyBuZXcgTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24oInR5cGljYWxseSBub3QgYW4gZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKGJ5dGUpIGJ5dGVDaGFyQXNJbnQ7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQkvLyBUaGVyZSBpcyBubyBkZWZhdWx0IGZvciB0aGlzIGNhc2UKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZk5vQk9NUG9zc2libGUgPSBmYWxzZTsKLQkJZklucHV0U3RyZWFtID0gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc2V0KG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlTdG9yYWdlLmdldENvbnRlbnRzKCksIENvZGVkSU8uTUFYX0JVRl9TSVpFKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlpZiAocmVhZGVyIGluc3RhbmNlb2YgQnl0ZVJlYWRlcikgewotCQkJQnl0ZVJlYWRlciBieXRlUmVhZGVyID0gKEJ5dGVSZWFkZXIpIHJlYWRlcjsKLQkJCWZJbnB1dFN0cmVhbSA9IGJ5dGVSZWFkZXIuZklucHV0U3RyZWFtOwotCQl9IGVsc2UgewotCQkJZk5vQk9NUG9zc2libGUgPSB0cnVlOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9DaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL0NoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTk0NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL0NoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwgZXh0ZW5kcyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNoYXJzZXROYW1lOwotCi0JcHVibGljIENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsKFN0cmluZyBjaGFyc2V0TmFtZSkgewotCQlzdXBlcigpOwotCQlmQ2hhcnNldE5hbWUgPSBjaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZDaGFyc2V0TmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYXJzZXROYW1lKCkgewotCQlyZXR1cm4gZkNoYXJzZXROYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzMWJiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBJbnRlbmRlZCB0byBiZSBhIG1vcmUgcHJlY2lzZSBmb3JtIG9mIHRoZSBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiwgd2hlcmUKLSAqIGNoYXJhY3RlciBwb3NpdGlvbiBhbmQgYXR0ZW1wdGVkIGVuY29kaW5nIGNhbiBiZSBhdHRlbXB0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwgZXh0ZW5kcyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewotCi0JLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgaW50IGZDaGFyUG9zaXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZkRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZFeGNlZWRlZE1heCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZKYXZhQ2hhcnNldE5hbWU7Ci0JcHJpdmF0ZSBpbnQgZk1heEJ1ZmZlcjsKLQotCS8qKgotCSAqIERpc2FsbG93IGRlZmF1bHQgY29uc3RydWN0b3IuIElmIGF0dGVtcHRlZEVuY29kaW5nIGFuZCBjaGFyUG9zdGlvbiBjYW4KLQkgKiBub3QgYmUgcHJvdmlkZWQsIHVzZSBvbmUgb2YgamF2YSdzIE1hbGZvcm1lZEV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKCkgewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JcHVibGljIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbChTdHJpbmcgZW5jb2RpbmdOYW1lLCBpbnQgY2hhclBvc3Rpb24pIHsKLQkJdGhpcy5mSmF2YUNoYXJzZXROYW1lID0gZW5jb2RpbmdOYW1lOwotCQl0aGlzLmZEZXRlY3RlZENoYXJzZXROYW1lID0gZW5jb2RpbmdOYW1lOwotCQl0aGlzLmZDaGFyUG9zaXRpb24gPSBjaGFyUG9zdGlvbjsKLQl9Ci0KLQlwdWJsaWMgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKFN0cmluZyBhdHRlbXB0ZWRKYXZhRW5jb2RpbmcsIFN0cmluZyBhdHRlbXB0ZWRJQU5BRW5jb2RpbmcsIGludCBjaGFyUG9zdGlvbikgewotCQl0aGlzLmZKYXZhQ2hhcnNldE5hbWUgPSBhdHRlbXB0ZWRKYXZhRW5jb2Rpbmc7Ci0JCXRoaXMuZkRldGVjdGVkQ2hhcnNldE5hbWUgPSBhdHRlbXB0ZWRJQU5BRW5jb2Rpbmc7Ci0JCXRoaXMuZkNoYXJQb3NpdGlvbiA9IGNoYXJQb3N0aW9uOwotCX0KLQotCS8qKgotCSAqIElmIGNoYXJQb3NpdGlvbiA9IC0xIHRoaXMgY291bGQgYmUgYmVjYXVzZSB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uCi0JICogZXhjZWVkZWQgdGhlIG1heGltdW0gYnVmZmVyIHNpemUsIG1heEJ1ZmZlciwgdGhlbiBleGNlZWRlZE1heCA9IHRydWUuCi0JICovCi0JcHVibGljIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbChTdHJpbmcgYXR0ZW1wdGVkSmF2YUVuY29kaW5nLCBTdHJpbmcgYXR0ZW1wdGVkSUFOQUVuY29kaW5nLCBpbnQgY2hhclBvc3Rpb24sIGJvb2xlYW4gZXhjZWVkZWRNYXgsIGludCBtYXhCdWZmZXIpIHsKLQkJdGhpcy5mSmF2YUNoYXJzZXROYW1lID0gYXR0ZW1wdGVkSmF2YUVuY29kaW5nOwotCQl0aGlzLmZEZXRlY3RlZENoYXJzZXROYW1lID0gYXR0ZW1wdGVkSUFOQUVuY29kaW5nOwotCQl0aGlzLmZDaGFyUG9zaXRpb24gPSBjaGFyUG9zdGlvbjsKLQkJdGhpcy5mRXhjZWVkZWRNYXggPSBleGNlZWRlZE1heDsKLQkJdGhpcy5mTWF4QnVmZmVyID0gbWF4QnVmZmVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dGVtcHRlZElBTkFFbmNvZGluZygpIHsKLQkJcmV0dXJuIGZEZXRlY3RlZENoYXJzZXROYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF0dGVtcHRlZEphdmFFbmNvZGluZygpIHsKLQkJcmV0dXJuIGZKYXZhQ2hhcnNldE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoYXJQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDaGFyUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWF4QnVmZmVyLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRNYXhCdWZmZXIoKSB7Ci0JCXJldHVybiBmTWF4QnVmZmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4Y2VlZGVkTWF4LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhjZWVkZWRNYXgoKSB7Ci0JCXJldHVybiBmRXhjZWVkZWRNYXg7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL01hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlYzY4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zOwotCi0KLXB1YmxpYyBjbGFzcyBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsIGV4dGVuZHMgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsIHsKLQotCS8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuIElmIGF0dGVtcHRlZEVuY29kaW5nIGFuZCBjaGFyUG9zdGlvbiBjYW4KLQkgKiBub3QgYmUgcHJvdmlkZWQsIHVzZSBzdW4uaW8uTWFsZm9ybWVkRXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhdHRlbXB0ZWRKYXZhRW5jb2RpbmcKLQkgKiBAcGFyYW0gYXR0ZW1wdGVkSUFOQUVuY29kaW5nCi0JICogQHBhcmFtIGNoYXJQb3N0aW9uCi0JICovCi0JcHVibGljIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoU3RyaW5nIGF0dGVtcHRlZEphdmFFbmNvZGluZywgU3RyaW5nIGF0dGVtcHRlZElBTkFFbmNvZGluZywgaW50IGNoYXJQb3N0aW9uKSB7Ci0JCXN1cGVyKGF0dGVtcHRlZEphdmFFbmNvZGluZywgYXR0ZW1wdGVkSUFOQUVuY29kaW5nLCBjaGFyUG9zdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL1Vuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzYWY4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotCi0KLS8qKgotICogVGhpcyBpcyBpbnRlbmRlZCBmb3Igc2FtZSBwdXJwb3NlIGFzIGl0IHN1cGVyIGNsYXNzLCBidXQgc2ltcGx5IHByb3ZpZGVzCi0gKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoYW4gdGhlIG5hbWUgaW4gZXJyb3IuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwKLSAqIGZvciAiVUlzIiB3aGljaCBjYW4gcHJlc2VudCB1c2VycyB3aXRoIHRoZSBlcnJvciwgYW5kIHRoZQotICogImFwcHJvcHJpYXRlRGVmYXVsdCIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIGlucHV0LgotICovCi1wdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbCBleHRlbmRzIFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50aW87Ci0KLQlwdWJsaWMgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB7Ci0JCXRoaXMoZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKSk7Ci0JCWZFbmNvZGluZ01lbWVudGlvID0gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXByb3RlY3RlZCBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsKFN0cmluZyBjaGFyc2V0TmFtZSkgewotCQlzdXBlcihjaGFyc2V0TmFtZSk7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRpbzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGFza3MvSUZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9JRmlsZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNjU1YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9JRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotCi0vKioKLSAqIFNjYW5uZXJzIGZvciB0aGUgbWFpbiBUYXNrIFNjYW5uZXIuIFNjYW5uZXJzIG1heSBiZSBjb250cmlidXRlZCB1c2luZyB0aGUKLSAqIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciBleHRlbnNpb24gcG9pbnQuIEZvciByZXNvdXJjZXMgYW5kCi0gKiByZXNvdXJjZSBkZWx0YXMgd2l0aCBtYXRjaGluZyBjb250ZW50IHR5cGVzLCB0aGUgbWFpbiBzY2FubmVyIHdpbGwgZmlyc3QKLSAqIGNhbGwgdGhlIHN0YXJ0dXAoKSBtZXRob2QsIHNjYW4oKSwgYW5kIHRoZW4gc2h1dGRvd24oKSBpbiBzZXF1ZW5jZS4gU2Nhbm5lcgotICogaW5zdGFuY2VzIHdpbGwgYmUgcmV1c2VkIGFjcm9zcyBwcm9qZWN0cyBidXQgYXJlIG5vdCBzaGFyZWQgcGVyIGNvbnRlbnQKLSAqIHR5cGUuIFNjYW5uZXJzIHNob3VsZCBub3QgaG9sZCBvbiB0byByZWZlcmVuY2VzIHRvIG1vZGVscyBvciByZXNvdXJjZXMKLSAqIGFmdGVyIHNodXRkb3duKCkgYW5kIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGxlYWsgbWVtb3J5IG9yIHJlc291cmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRmlsZVRhc2tTY2FubmVyIHsKLQkvKioKLQkgKiBEZWZhdWx0IG1hcmtlciB0eXBlIElEIG9mIHRhc2sgbWFya2VycyB0aGF0IGFyZSBjcmVhdGVkLgotCSAqLwotCVN0cmluZyBUQVNLX01BUktFUl9JRCA9IFNTRUNvcmVQbHVnaW4uSUQgKyAiLnRhc2siOyAvLyROT04tTkxTLTEkOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdGFzayBtYXJrZXIgdHlwZSB0aGF0IHNob3VsZCBiZSByZW1vdmVkIGVhY2ggdGltZSB0YXNrcyBhcmUKLQkgKiAgICAgICAgIHJlc2Nhbm5lZCBhbmQgdXNlZCBieSBkZWZhdWx0IHdoZW4gY3JlYXRpbmcgdGFzayBtYXJrZXJzLgotCSAqICAgICAgICAgQ2hpbGRyZW4gb2YgdGhpcyBtYXJrZXIgdHlwZSB3aWxsIGJlIHJlbW92ZWQgYXV0b21hdGljYWxseS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWFya2VyVHlwZSgpOwotCi0JLyoqCi0JICogUmVxdWVzdHMgdGhhdCB0aGUgbGlzdCBvZiBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyZWQgdGFza3MgZm9yIHRoZSBnaXZlbgotCSAqIGZpbGUgYmUgdXBkYXRlZC4gT25jZSBjb21wbGV0ZWQsIHRoZSBsaXN0IG9mIHRhc2tzIHNob3VsZCBjb3JyZXNwb25kCi0JICogZXhhY3RseSB0byB0aGUgZmlsZSdzIGNvbnRlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIC0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHNjYW5uZWQKLQkgKiBAcGFyYW0gdGFza1RhZ3MgLQotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2YgdGFzayB0YWdzIGZvciB3aGljaCB0byBzY2FuCi0JICogQHBhcmFtIG1vbml0b3IgLQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtYXBzIGNvbnRhaW5pbmcgdGhlIGF0dHJpYnV0ZXMgb2YgdGFzayBtYXJrZXJzIHRvCi0JICogICAgICAgICBiZSBjcmVhdGVkCi0JICogICAgICAgICA8cD4KLQkgKiAgICAgICAgIFRoZSByZXNlcnZlZCBhdHRyaWJ1dGUgbmFtZQotCSAqICAgICAgICAgPGI+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGFza21hcmtlcjwvYj4gbWF5IGJlIHVzZWQgdG8KLQkgKiAgICAgICAgIHNwZWNpZnkgYSB0eXBlIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSB0YXNrIG1hcmtlci4KLQkgKiAgICAgICAgIDwvcD4KLQkgKi8KLQlNYXBbXSBzY2FuKElGaWxlIGZpbGUsIFRhc2tUYWdbXSB0YXNrVGFncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBzY2FubmVyIHRoYXQgc2Nhbm5pbmcgaXMgZG9uZSBmb3Igbm93LiBSZXNvdXJjZXMgaGVsZCBmcm9tCi0JICogc3RhcnR1cCBzaG91bGQgbm93IGJlIHJlbGVhc2VkLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IC0KLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRoYXQgd2FzIGp1c3Qgc2Nhbm5lZAotCSAqLwotCXZvaWQgc2h1dGRvd24oSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgc2Nhbm5lciB0aGF0IGEgc2VxdWVuY2Ugb2Ygc2NhbnMgaXMgYWJvdXQgdG8gYmUgcmVxdWVzdGVkLgotCSAqIElkZWFsbHkgdGhlIHRpbWUgdG8gbG9hZCBwcmVmZXJlbmNlcyBhbmQgcGVyZm9ybSBhbnkgZXhwZW5zaXZlCi0JICogY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgLQotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgdGhhdCBpcyBhYm91dCB0byBiZSBzY2FubmVkCi0JICogCi0JICovCi0Jdm9pZCBzdGFydHVwKElQcm9qZWN0IHByb2plY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9UYXNrVGFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3Rhc2tzL1Rhc2tUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiNzI1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3Rhc2tzL1Rhc2tUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLQotLyoqCi0gKiBTaW1wbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlcyB0aGF0IG1ha2UgdXAgYSBUYXNrIFRhZwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGFza1RhZyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9ISUdIID0gSU1hcmtlci5QUklPUklUWV9ISUdIOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX0xPVyA9IElNYXJrZXIuUFJJT1JJVFlfTE9XOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSSU9SSVRZX05PUk1BTCA9IElNYXJrZXIuUFJJT1JJVFlfTk9STUFMOwotCi0JLyoqCi0JICogdGhpcyB0YXNrIHRhZydzIHByaW9yaXR5Ci0JICovCi0JcHJpdmF0ZSBpbnQgZlByaW9yaXR5ID0gUFJJT1JJVFlfTk9STUFMOwotCQotCS8qKgotCSAqIHRoaXMgdGFzayB0YWcncyAidGFnZ2luZyIgdGV4dAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZUYWcgPSBudWxsOwotCi0JcHVibGljIFRhc2tUYWcoU3RyaW5nIHRhZywgaW50IHByaW9yaXR5KSB7Ci0JCXN1cGVyKCk7Ci0JCWZUYWcgPSB0YWc7Ci0JCWZQcmlvcml0eSA9IHByaW9yaXR5OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0JCXJldHVybiBmUHJpb3JpdHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWcoKSB7Ci0JCXJldHVybiBmVGFnOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRUYWcoKSArICI6IiArIGdldFByaW9yaXR5KCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL0ZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL0ZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTFlNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9GaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLklGaWxlVGFza1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgY2xhc3MgU2Nhbm5lckluZm8gewotCQlTdHJpbmcgZklkOwotCQlJRmlsZVRhc2tTY2FubmVyIGZTY2FubmVyOwotCi0JCVNjYW5uZXJJbmZvKFN0cmluZyBpZCwgSUZpbGVUYXNrU2Nhbm5lciBzY2FubmVyKSB7Ci0JCQlzdXBlcigpOwotCQkJZklkID0gaWQ7Ci0JCQlmU2Nhbm5lciA9IHNjYW5uZXI7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFNjYW5uZXJJbmZvICYmIGZJZC5lcXVhbHMoKChTY2FubmVySW5mbykgb2JqKS5mSWQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCXJldHVybiBmSWQ7Ci0JCX0KLQotCQlwdWJsaWMgSUZpbGVUYXNrU2Nhbm5lciBnZXRTY2FubmVyKCkgewotCQkJcmV0dXJuIGZTY2FubmVyOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIgX2luc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2luc3RhbmNlID0gbmV3IEZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBBVFRfQ09OVEVOVF9UWVBFUyA9ICJjb250ZW50VHlwZUlkcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZlNjYW5uZXJFbGVtZW50czsKLQotCS8vIGEgbWFwcGluZyBmcm9tIGNvbnRlbnQgdHlwZXMgdG8gU2Nhbm5lckluZm8gaW5zdGFuY2VzCi0JcHJpdmF0ZSBNYXAgZlNjYW5uZXJJbmZvcyA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBOQU1FX1NDQU5ORVIgPSAic2Nhbm5lciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIFNDQU5ORVJfRVhURU5TSU9OX1BPSU5UX0lEID0gU1NFQ29yZVBsdWdpbi5JRCArICIudGFza3NjYW5uZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUlGaWxlVGFza1NjYW5uZXJbXSBnZXRGaWxlVGFza1NjYW5uZXJzKElDb250ZW50VHlwZVtdIGNvbnRlbnRUeXBlcykgewotCQlpZiAoZlNjYW5uZXJFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZWFkUmVnaXN0cnkoKTsKLQkJfQotCi0JCUxpc3Qgc2Nhbm5lckluZm9zID0gbmV3IEFycmF5TGlzdCgxKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJU2Nhbm5lckluZm9bXSBzY2FubmVySW5mb3NGb3JDb250ZW50VHlwZSA9IChTY2FubmVySW5mb1tdKSBmU2Nhbm5lckluZm9zLmdldChjb250ZW50VHlwZXNbaV0uZ2V0SWQoKSk7Ci0JCQlpZiAoc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJCXNjYW5uZXJJbmZvc0ZvckNvbnRlbnRUeXBlID0gbG9hZFNjYW5uZXJzKGNvbnRlbnRUeXBlc1tpXSk7Ci0JCQl9Ci0JCQkvLyBvbmx5IGFkZCBub24tZHVwbGljYXRlIHNjYW5uZXJzCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNjYW5uZXJJbmZvc0ZvckNvbnRlbnRUeXBlLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCFzY2FubmVySW5mb3MuY29udGFpbnMoc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGVbal0pKSB7Ci0JCQkJCXNjYW5uZXJJbmZvcy5hZGQoc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGVbal0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJRmlsZVRhc2tTY2FubmVyW10gc2Nhbm5lcnMgPSBuZXcgSUZpbGVUYXNrU2Nhbm5lcltzY2FubmVySW5mb3Muc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzY2FubmVycy5sZW5ndGg7IGkrKykgewotCQkJc2Nhbm5lcnNbaV0gPSAoKFNjYW5uZXJJbmZvKSBzY2FubmVySW5mb3MuZ2V0KGkpKS5nZXRTY2FubmVyKCk7Ci0JCX0KLQkJcmV0dXJuIHNjYW5uZXJzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRDb250ZW50VHlwZUlkcygpIHsKLQkJaWYgKGZTY2FubmVyRWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmVhZFJlZ2lzdHJ5KCk7Ci0JCX0KLQotCQkvLyBmaW5kIHRoZSByZWxldmFudCBleHRlbnNpb25zCi0JCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBzY2FubmVyRWxlbWVudHMgPSBmU2Nhbm5lckVsZW1lbnRzOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHNjYW5uZXJFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJaWYgKCFzY2FubmVyRWxlbWVudHNbal0uZ2V0TmFtZSgpLmVxdWFscyhOQU1FX1NDQU5ORVIpKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nW10gY29udGVudFR5cGVJZHMgPSBTdHJpbmdVdGlscy51bnBhY2soc2Nhbm5lckVsZW1lbnRzW2pdLmdldEF0dHJpYnV0ZShBVFRfQ09OVEVOVF9UWVBFUykpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50VHlwZUlkcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghdHlwZXMuY29udGFpbnMoY29udGVudFR5cGVJZHNbaV0pKSB7Ci0JCQkJCXR5cGVzLmFkZChjb250ZW50VHlwZUlkc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgdHlwZXMudG9BcnJheShuZXcgU3RyaW5nW3R5cGVzLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgU2Nhbm5lckluZm9bXSBsb2FkU2Nhbm5lcnMoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlTY2FubmVySW5mb1tdIHNjYW5uZXJJbmZvcyA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGRlbGVnYXRlRWxlbWVudHMgPSBmU2Nhbm5lckVsZW1lbnRzOwotCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVsZWdhdGVFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCWlmICghZGVsZWdhdGVFbGVtZW50c1tqXS5nZXROYW1lKCkuZXF1YWxzKE5BTUVfU0NBTk5FUikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVN0cmluZ1tdIHN1cHBvcnRlZENvbnRlbnRUeXBlSWRzID0gU3RyaW5nVXRpbHMudW5wYWNrKGRlbGVnYXRlRWxlbWVudHNbal0uZ2V0QXR0cmlidXRlKEFUVF9DT05URU5UX1RZUEVTKSk7Ci0JCQkJSUNvbnRlbnRUeXBlW10gc3VwcG9ydGVkQ29udGVudFR5cGVzID0gbmV3IElDb250ZW50VHlwZVtzdXBwb3J0ZWRDb250ZW50VHlwZUlkcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgc3VwcG9ydGVkQ29udGVudFR5cGVJZHMubGVuZ3RoOyBrKyspIHsKLQkJCQkJc3VwcG9ydGVkQ29udGVudFR5cGVzW2tdID0gY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKHN1cHBvcnRlZENvbnRlbnRUeXBlSWRzW2tdLnRyaW0oKSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgc3VwcG9ydGVkQ29udGVudFR5cGVJZHMubGVuZ3RoOyBrKyspIHsKLQkJCQkJLy8gYWxsb3cgc3VidHlwZXMgdG8gYmUgcmV0dXJuZWQgYXMgd2VsbAotCQkJCQlpZiAoc3VwcG9ydGVkQ29udGVudFR5cGVzW2tdICE9IG51bGwgJiYgY29udGVudFR5cGUuaXNLaW5kT2Yoc3VwcG9ydGVkQ29udGVudFR5cGVzW2tdKSkgewotCQkJCQkJZWxlbWVudHMuYWRkKGRlbGVnYXRlRWxlbWVudHNbal0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gaW5zdGFudGlhdGUgYW5kIHNhdmUgdGhlIHNjYW5uZXJzCi0JCQlMaXN0IHNjYW5uZXJJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMuc2l6ZSgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlJRmlsZVRhc2tTY2FubmVyIHNjYW5uZXIgPSAoSUZpbGVUYXNrU2Nhbm5lcikgKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGVsZW1lbnRzLmdldChpKSkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQkJCQlpZiAoc2Nhbm5lciAhPSBudWxsKSB7Ci0JCQkJCQlzY2FubmVySW5mb0xpc3QuYWRkKG5ldyBTY2FubmVySW5mbygoKElDb25maWd1cmF0aW9uRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpKS5nZXRBdHRyaWJ1dGUoQVRUX0lEKSwgc2Nhbm5lcikpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiTm9uLWZhdGFsIGV4Y2VwdGlvbiBjcmVhdGluZyB0YXNrIHNjYW5uZXIgZm9yICIgKyBjb250ZW50VHlwZS5nZXRJZCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXNjYW5uZXJJbmZvcyA9IChTY2FubmVySW5mb1tdKSBzY2FubmVySW5mb0xpc3QudG9BcnJheShuZXcgU2Nhbm5lckluZm9bc2Nhbm5lckluZm9MaXN0LnNpemUoKV0pOwotCQkJZlNjYW5uZXJJbmZvcy5wdXQoY29udGVudFR5cGUuZ2V0SWQoKSwgc2Nhbm5lckluZm9zKTsKLQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NSRUdJU1RSWSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRlZCAiICsgc2Nhbm5lckluZm9zLmxlbmd0aCArICIgdGFzayBzY2FubmVyIGZvciAiICsgY29udGVudFR5cGUuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCXJldHVybiBzY2FubmVySW5mb3M7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJZlNjYW5uZXJJbmZvcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIEp1c3QgcmVtZW1iZXIgdGhlIGVsZW1lbnRzLCBzbyBwbHVnaW5zIGRvbid0IGhhdmUgdG8gYmUgYWN0aXZhdGVkLAotCQkvLyB1bmxlc3MgZXh0ZW5zaW9uIGF0dHJpYnV0ZXMgbWF0Y2ggdGhvc2Ugb2YgaW50ZXJlc3QKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChTQ0FOTkVSX0VYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlmU2Nhbm5lckVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1N0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjI3MWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuSUZpbGVUYXNrU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuVGFza1RhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0vKioKLSAqIEEgZGVsZWdhdGUgdG8gY3JlYXRlIElNYXJrZXIuVEFTS3MgZm9yICJ0b2RvcyIgYW5kIHNpbWlsYXIgY29tbWVudHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyIGltcGxlbWVudHMgSUZpbGVUYXNrU2Nhbm5lciwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCS8vIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoZSBuZXcgdGFza3MgZm9yIHRoZSBjdXJyZW50IGZpbGUKLQlwcm90ZWN0ZWQgTGlzdCBmTmV3TWFya2VyQXR0cmlidXRlTWFwcyA9IG51bGw7Ci0KLQlMaXN0IG9sZE1hcmtlcnMgPSBudWxsOwotCXByaXZhdGUgbG9uZyB0aW1lMDsKLQlwcml2YXRlIFN0cmluZyBydW50aW1lTWFya2VyVHlwZTsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyKCkgewotCQlzdXBlcigpOwotCQlmTmV3TWFya2VyQXR0cmlidXRlTWFwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW5jZSBjcmVhdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZXMgd2l0aCB3aGljaCBhIG5ld2x5IGNyZWF0ZWQgbWFya2VyIHdpbGwgYmUKLQkgKiBpbml0aWFsaXplZC4gTW9kaWZpZWQgZnJvbSB0aGUgbWV0aG9kIGluIE1hcmtlclJ1bGVyQWN0aW9uCi0JICogCi0JICogQHJldHVybiB0aGUgaW5pdGlhbCBtYXJrZXIgYXR0cmlidXRlcwotCSAqLwotCXByb3RlY3RlZCBNYXAgY3JlYXRlSW5pdGlhbE1hcmtlckF0dHJpYnV0ZXMoU3RyaW5nIHRleHQsIGludCBkb2N1bWVudExpbmUsIGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCwgaW50IHByaW9yaXR5KSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoNik7Ci0JCS8vIG1hcmtlciBsaW5lIG51bWJlcnMgYXJlIDEtYmFzZWQKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgbmV3IEludGVnZXIoZG9jdW1lbnRMaW5lICsgMSkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlRBU0ssIGdldE1hcmtlclR5cGUoKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgbmV3IEludGVnZXIoc3RhcnRPZmZzZXQpKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIoc3RhcnRPZmZzZXQgKyBsZW5ndGgpKTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5NRVNTQUdFLCB0ZXh0KTsKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5VU0VSX0VESVRBQkxFLCBCb29sZWFuLkZBTFNFKTsKLQotCQlzd2l0Y2ggKHByaW9yaXR5KSB7Ci0JCQljYXNlIElNYXJrZXIuUFJJT1JJVFlfSElHSCA6IHsKLQkJCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX0hJR0gpKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSU1hcmtlci5QUklPUklUWV9MT1cgOiB7Ci0JCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9MT1cpKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOiB7Ci0JCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9OT1JNQUwpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRhc2tzLklGaWxlVGFza1NjYW5uZXIjZ2V0TWFya2VyVHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXJrZXJUeXBlKCkgewotCQlpZiAocnVudGltZU1hcmtlclR5cGUgIT0gbnVsbCkKLQkJCXJldHVybiBydW50aW1lTWFya2VyVHlwZTsKLQotCQlyZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlci5UQVNLOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRldGVjdENoYXJzZXQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmlsZS5nZXRDaGFyc2V0KHRydWUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb21tZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmluZFRhc2tzKElEb2N1bWVudCBkb2N1bWVudCwgVGFza1RhZ1tdIHRhc2tUYWdzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBjb21tZW50KSB7Ci0JCWlmIChpc0NvbW1lbnRSZWdpb24oZG9jdW1lbnRSZWdpb24sIGNvbW1lbnQpKSB7Ci0JCQlpbnQgc3RhcnRPZmZzZXQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21tZW50KTsKLQkJCWludCBlbmRPZmZzZXQgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGNvbW1lbnQpOwotCQkJdHJ5IHsKLQkJCQlpbnQgc3RhcnRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJCQlpbnQgZW5kTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChlbmRPZmZzZXQpOwotCQkJCWZvciAoaW50IGxpbmVOdW1iZXIgPSBzdGFydExpbmU7IGxpbmVOdW1iZXIgPD0gZW5kTGluZTsgbGluZU51bWJlcisrKSB7Ci0JCQkJCUlSZWdpb24gbGluZSA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsaW5lTnVtYmVyKTsKLQkJCQkJaW50IGJlZ2luID0gTWF0aC5tYXgoc3RhcnRPZmZzZXQsIGxpbmUuZ2V0T2Zmc2V0KCkpOwotCQkJCQlpbnQgZW5kID0gTWF0aC5taW4oZW5kT2Zmc2V0LCBsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSk7Ci0JCQkJCWludCBsZW5ndGggPSBlbmQgLSBiZWdpbjsKLQotCQkJCQkvKiBYWFg6IFRoaXMgZ2VuZXJhdGVzIGEgbG90IG9mIGdhcmJhZ2Ugb2JqZWN0cyAqLwotCi0JCQkJCVN0cmluZyBjb21tZW50ZWRUZXh0ID0gZ2V0Q29tbWVudGVkVGV4dChkb2N1bWVudCwgYmVnaW4sIGxlbmd0aCk7Ci0JCQkJCVN0cmluZyBjb21wYXJpc29uVGV4dCA9IGNvbW1lbnRlZFRleHQudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFza1RhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWludCB0YWdJbmRleCA9IGNvbXBhcmlzb25UZXh0LmluZGV4T2YodGFza1RhZ3NbaV0uZ2V0VGFnKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKTsKLQkJCQkJCWlmICh0YWdJbmRleCA+PSAwKSB7Ci0JCQkJCQkJU3RyaW5nIG1hcmtlckRlc2NyaXB0aW9uID0gY29tbWVudGVkVGV4dC5zdWJzdHJpbmcodGFnSW5kZXgpOwotCQkJCQkJCWludCBtYXJrZXJPZmZzZXQgPSBiZWdpbiArIHRhZ0luZGV4OwotCQkJCQkJCWludCBtYXJrZXJMZW5ndGggPSBlbmQgLSBtYXJrZXJPZmZzZXQ7Ci0JCQkJCQkJZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMuYWRkKGNyZWF0ZUluaXRpYWxNYXJrZXJBdHRyaWJ1dGVzKG1hcmtlckRlc2NyaXB0aW9uLCBsaW5lTnVtYmVyLCBtYXJrZXJPZmZzZXQsIG1hcmtlckxlbmd0aCwgdGFza1RhZ3NbaV0uZ2V0UHJpb3JpdHkoKSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRUYXNrcyhJRmlsZSBmaWxlLCBmaW5hbCBUYXNrVGFnW10gdGFza1RhZ3MsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRIYW5kbGVyRm9yKGZpbGUpOwotCi0JCQkvLyByZWNvcmRzIGlmIHRoZSBvcHRpbWl6ZWQgc3RyZWFtaXNoIHBhcnNlIHdhcyBwb3NzaWJsZQotCQkJYm9vbGVhbiBkaWRTdHJlYW1QYXJzZSA9IGZhbHNlOwotCQkJZmluYWwgSUVuY29kZWREb2N1bWVudCBkZWZhdWx0RG9jdW1lbnQgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZGVmYXVsdERvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVJlZ2lvblBhcnNlciBwYXJzZXIgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRlZmF1bHREb2N1bWVudCkuZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgewotCQkJCQlkaWRTdHJlYW1QYXJzZSA9IHRydWU7Ci0JCQkJCVN0cmluZyBjaGFyc2V0ID0gZGV0ZWN0Q2hhcnNldChmaWxlKTsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGRvY3VtZW50UGFyc2VyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgcGFyc2VyOwotCQkJCQlmaW5hbCBJRG9jdW1lbnQgdGV4dERvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCQkJCXNldERvY3VtZW50Q29udGVudCh0ZXh0RG9jdW1lbnQsIGZpbGUuZ2V0Q29udGVudHModHJ1ZSksIGNoYXJzZXQpOwotCQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgdGV4dERvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJCQkJZG9jdW1lbnRQYXJzZXIucmVzZXQobmV3IERvY3VtZW50UmVhZGVyKHRleHREb2N1bWVudCkpOwotCQkJCQlkb2N1bWVudFBhcnNlci5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWdpb25zLnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIGNvbW1lbnQgPSByZWdpb25zLmdldChqKTsKLQkJCQkJCQkJZmluZFRhc2tzKHRleHREb2N1bWVudCwgdGFza1RhZ3MsIGRvY3VtZW50UmVnaW9uLCBjb21tZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gZGlzY29ubmVjdCB0aGUgZG9jdW1lbnQgcmVnaW9ucwotCQkJCQkJCWlmIChkb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpICE9IG51bGwpIHsKLQkJCQkJCQkJZG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKS5zZXRQcmV2aW91cyhudWxsKTsKLQkJCQkJCQkJZG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKS5zZXROZXh0KG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQkJdGV4dERvY3VtZW50LnNldCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJbW9uaXRvci53b3JrZWQoZG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJZG9jdW1lbnRQYXJzZXIuZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFkaWRTdHJlYW1QYXJzZSkgewotCQkJCS8vIFVzZSBhIFN0cnVjdHVyZWREb2N1bWVudAotCQkJCUlFbmNvZGVkRG9jdW1lbnQgZG9jdW1lbnQgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGZpbGUpOwotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBkb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJd2hpbGUgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWdpb25zLnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJSVRleHRSZWdpb24gY29tbWVudCA9IHJlZ2lvbnMuZ2V0KGopOwotCQkJCQkJCWZpbmRUYXNrcyhkb2N1bWVudCwgdGFza1RhZ3MsIGRvY3VtZW50UmVnaW9uLCBjb21tZW50KTsKLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iud29ya2VkKGRvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiB3aXRoICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJTdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyIGVuY291bnRlcmVkIENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiByZWFkaW5nICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2l0aCAiICsgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tZW50ZWRUZXh0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZG9jdW1lbnQuZ2V0KGJlZ2luLCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbik7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIE1hcFtdIHNjYW4oSUZpbGUgZmlsZSwgVGFza1RhZ1tdIHRhc2tUYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMuY2xlYXIoKTsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpIHx8ICFzaG91bGRTY2FuKGZpbGUpKSB7Ci0JCQlyZXR1cm4gbmV3IE1hcFswXTsKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUEVSRikgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlpZiAodGFza1RhZ3MubGVuZ3RoID4gMCkgewotCQkJZmluZFRhc2tzKGZpbGUsIHRhc2tUYWdzLCBtb25pdG9yKTsKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUEVSRikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIGZvciAiICsgZmlsZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIChNYXBbXSkgZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMudG9BcnJheShuZXcgTWFwW2ZOZXdNYXJrZXJBdHRyaWJ1dGVNYXBzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50IGNvbnRlbnQgZnJvbSB0aGlzIHN0cmVhbSBhbmQgY2xvc2VzIHRoZSBzdHJlYW0KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnQoSURvY3VtZW50IGRvY3VtZW50LCBJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtLCBTdHJpbmcgY2hhcnNldCkgewotCQlSZWFkZXIgaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbnRlbnRTdHJlYW0sIGNoYXJzZXQpLCAyMDQ4KTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwNDgpOwotCQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKLQkJCWludCBuID0gaW4ucmVhZChyZWFkQnVmZmVyKTsKLQkJCXdoaWxlIChuID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQocmVhZEJ1ZmZlciwgMCwgbik7Ci0JCQkJbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl9Ci0JCQlkb2N1bWVudC5zZXQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXJ1bnRpbWVNYXJrZXJUeXBlID0gZGF0YS50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JYm9vbGVhbiBzaG91bGRTY2FuKElSZXNvdXJjZSByKSB7Ci0JCS8vIHNraXAgImRvdCIgZmlsZXMKLQkJU3RyaW5nIHMgPSByLmdldE5hbWUoKTsKLQkJcmV0dXJuIHMubGVuZ3RoKCkgPT0gMCB8fCBzLmNoYXJBdCgwKSAhPSAnLic7Ci0JfQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcyArICIgc2h1dGRvd24gZm9yICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcyArICIgc3RhcnR1cCBmb3IgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NQRVJGKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NQRVJGKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMgbG9hZGluZyBwcmVmcyBmb3IgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tTY2FubmluZ0pvYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4M2JlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tTY2FubmluZ0pvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFF1ZXVlaW5nIEpvYiBmb3IgcHJvY2Vzc2luZyBkZWx0YXMgYW5kIHByb2plY3RzLgotICovCi1jbGFzcyBUYXNrU2Nhbm5pbmdKb2IgZXh0ZW5kcyBKb2IgewotCXN0YXRpYyBmaW5hbCBpbnQgSk9CX0RFTEFZX0RFTFRBID0gNDAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKT0JfREVMQVlfUFJPSkVDVCA9IDIwMDA7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQgPSAidGFzay10YWctcHJvamVjdHMtYWxyZWFkeS1zY2FubmVkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTGlzdCBmUXVldWUgPSBudWxsOwotCi0JLyoqIHN5bWJvbGljIG5hbWUgZm9yIE9TR0kgZnJhbWV3b3JrICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1NHSV9GUkFNRVdPUktfSUQgPSAib3JnLmVjbGlwc2Uub3NnaSI7IC8vJE5PTi1OTFMtMSQKLQotCVRhc2tTY2FubmluZ0pvYigpIHsKLQkJc3VwZXIoU1NFQ29yZU1lc3NhZ2VzLlRhc2tTY2FubmVyXzApOwotCQlmUXVldWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXNldFByaW9yaXR5KEpvYi5ERUNPUkFURSk7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQkJc2V0VXNlcihmYWxzZSk7Ci0KLQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgYWRkUHJvamVjdERlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCUlSZXNvdXJjZSBwcm9qZWN0UmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCi0JCWlmIChwcm9qZWN0UmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQlpZiAoaXNFbmFibGVkT25Qcm9qZWN0KChJUHJvamVjdCkgcHJvamVjdFJlc291cmNlKSkgewotCQkJCWZRdWV1ZS5hZGQoZGVsdGEpOwotCQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IpIHsKLQkJCQkJU3RyaW5nIGtpbmQgPSBudWxsOwotCQkJCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0JCQkJCQkJa2luZCA9ICIgW0lSZXNvdXJjZURlbHRhLkFEREVEXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6Ci0JCQkJCQkJa2luZCA9ICIgW0lSZXNvdXJjZURlbHRhLkNIQU5HRURdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQkJCQlraW5kID0gIiBbSVJlc291cmNlRGVsdGEuUkVNT1ZFRF0iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEX1BIQU5UT00gOgotCQkJCQkJCWtpbmQgPSAiIFtJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NIDoKLQkJCQkJCQlraW5kID0gIiBbSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBkZWx0YSAiICsgZGVsdGEuZ2V0RnVsbFBhdGgoKSArIGtpbmQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXNjaGVkdWxlKEpPQl9ERUxBWV9ERUxUQSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3RIYXNOb3RCZWVuRnVsbHlTY2FubmVkKHByb2plY3QpKSB7Ci0JCQlmUXVldWUuYWRkKHByb2plY3QpOwotCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU0pPQikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2NoZWR1bGUoSk9CX0RFTEFZX1BST0pFQ1QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBjaGVjayB0byBzZWUgaWYgdGhlIE9TR0kgZnJhbWV3b3JrIGlzIHNodXR0aW5nIGRvd24uCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBTeXN0ZW0gQnVuZGxlIGlzIHN0b3BwZWQgKGllLiB0aGUgZnJhbWV3b3JrIGlzCi0JICogICAgICAgICBzaHV0dGluZyBkb3duKQotCSAqLwotCWJvb2xlYW4gZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSB7Ci0JCS8vIGluIHRoZSBGcmFtZXdvcmsgY2xhc3MgdGhlcmUncyBhIG5vdGU6Ci0JCS8vIHNldCB0aGUgc3RhdGUgb2YgdGhlIFN5c3RlbSBCdW5kbGUgdG8gU1RPUFBJTkcuCi0JCS8vIHRoaXMgbXVzdCBiZSBkb25lIGZpcnN0IGFjY29yZGluZyB0byBzZWN0aW9uIDQuMTkuMiBmcm9tIHRoZSBPU0dpCi0JCS8vIFIzIHNwZWMuCi0JCWJvb2xlYW4gc2h1dHRpbmdEb3duID0gIVBsYXRmb3JtLmlzUnVubmluZygpIHx8IFBsYXRmb3JtLmdldEJ1bmRsZShPU0dJX0ZSQU1FV09SS19JRCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RPUFBJTkc7Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IgJiYgc2h1dHRpbmdEb3duKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRhc2tTY2FubmluZ0pvYjogc3lzdGVtIGlzIHNodXR0aW5nIGRvd24hIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc2h1dHRpbmdEb3duOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkT25Qcm9qZWN0KElQcm9qZWN0IHApIHsKLQkJSVByZWZlcmVuY2VzU2VydmljZSBwcmVmZXJlbmNlc1NlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsKLQkJSVNjb3BlQ29udGV4dFtdIGxvb2t1cE9yZGVyID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKHApLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQlyZXR1cm4gcHJlZmVyZW5jZXNTZXJ2aWNlLmdldEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlLCBsb29rdXBPcmRlcik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByb2plY3RIYXNOb3RCZWVuRnVsbHlTY2FubmVkKElSZXNvdXJjZSBwcm9qZWN0KSB7Ci0JCVN0cmluZ1tdIHByb2plY3RzU2Nhbm5lZCA9IFN0cmluZ1V0aWxzLnVucGFjayhTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQpKTsKLQotCQlib29sZWFuIHNob3VsZFNjYW4gPSB0cnVlOwotCQlTdHJpbmcgbmFtZSA9IHByb2plY3QuZ2V0TmFtZSgpOwotCQlmb3IgKGludCBqID0gMDsgc2hvdWxkU2NhbiAmJiBqIDwgcHJvamVjdHNTY2FubmVkLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAocHJvamVjdHNTY2FubmVkW2pdLmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2Nhbm5pbmcgSm9iIHNraXBwaW5nICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzaG91bGRTY2FuID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFNjYW47Ci0JfQotCi0Jc3luY2hyb25pemVkIExpc3QgcmV0cmlldmVRdWV1ZSgpIHsKLQkJTGlzdCBxdWV1ZSA9IGZRdWV1ZTsKLQkJZlF1ZXVlID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcXVldWU7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQotCQljbGVhbnVwUmVtZW1iZXJlZFByb2plY3RMaXN0KFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlMaXN0IGN1cnJlbnRRdWV1ZSA9IHJldHJpZXZlUXVldWUoKTsKLQkJTGlzdCBlcnJvcnMgPSBudWxsOwotCQlpbnQgdGlja3MgPSBjdXJyZW50UXVldWUuc2l6ZSgpOwotCQlTdHJpbmcgdGFza05hbWUgPSBudWxsOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CKSB7Ci0JCQl0YXNrTmFtZSA9IFNTRUNvcmVNZXNzYWdlcy5UYXNrU2Nhbm5pbmdKb2JfMCArICIgKCIgKyB0aWNrcyArICIgd29yayBpdGVtcykiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCXRhc2tOYW1lID0gU1NFQ29yZU1lc3NhZ2VzLlRhc2tTY2FubmluZ0pvYl8wOwotCQl9Ci0JCW1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCB0aWNrcyk7Ci0KLQkJSVByb2dyZXNzTW9uaXRvciBzY2FuTW9uaXRvciA9IG51bGw7Ci0JCXdoaWxlICghY3VycmVudFF1ZXVlLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IG8gPSBjdXJyZW50UXVldWUucmVtb3ZlKDApOwotCQkJaWYgKGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpCi0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJdHJ5IHsKLQkJCQlzY2FuTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElSZXNvdXJjZURlbHRhKSB7Ci0JCQkJCVdvcmtzcGFjZVRhc2tTY2FubmVyLmdldEluc3RhbmNlKCkuc2NhbigoSVJlc291cmNlRGVsdGEpIG8sIHNjYW5Nb25pdG9yKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCVdvcmtzcGFjZVRhc2tTY2FubmVyLmdldEluc3RhbmNlKCkuc2NhbigoSVByb2plY3QpIG8sIHNjYW5Nb25pdG9yKTsKLQkJCQkJaWYoIXNjYW5Nb25pdG9yLmlzQ2FuY2VsZWQoKSApIHsKLQkJCQkJCVN0cmluZ1tdIHByb2plY3RzUHJldmlvdXNseVNjYW5uZWQgPSBTdHJpbmdVdGlscy51bnBhY2soU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVEKSk7Ci0JCQkJCQlTdHJpbmdbXSB1cGRhdGVkUHJvamVjdHMgPSBuZXcgU3RyaW5nW3Byb2plY3RzUHJldmlvdXNseVNjYW5uZWQubGVuZ3RoICsgMV07Ci0JCQkJCQl1cGRhdGVkUHJvamVjdHNbcHJvamVjdHNQcmV2aW91c2x5U2Nhbm5lZC5sZW5ndGhdID0gKChJUmVzb3VyY2UpIG8pLmdldE5hbWUoKTsKLQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocHJvamVjdHNQcmV2aW91c2x5U2Nhbm5lZCwgMCwgdXBkYXRlZFByb2plY3RzLCAwLCBwcm9qZWN0c1ByZXZpb3VzbHlTY2FubmVkLmxlbmd0aCk7Ci0JCQkJCQlTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCwgU3RyaW5nVXRpbHMucGFjayh1cGRhdGVkUHJvamVjdHMpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChlcnJvcnMgPT0gbnVsbCkgewotCQkJCQllcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJfQotCQkJCWVycm9ycy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VDb3JlUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCAiIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0KLQkJaWYgKGVycm9ycyA9PSBudWxsIHx8IGVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZXJyb3JzLnNpemUoKSA9PSAxKSB7Ci0JCQkJc3RhdHVzID0gKElTdGF0dXMpIGVycm9ycy5nZXQoMCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJU3RhdHVzW10gc3RhdGlpID0gKElTdGF0dXNbXSkgZXJyb3JzLnRvQXJyYXkobmV3IElTdGF0dXNbZXJyb3JzLnNpemUoKV0pOwotCQkJCXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhTU0VDb3JlUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBzdGF0aWksIFNTRUNvcmVNZXNzYWdlcy5UYXNrU2Nhbm5pbmdKb2JfMSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW51cFJlbWVtYmVyZWRQcm9qZWN0TGlzdChTdHJpbmcgcHJlZmVyZW5jZU5hbWUpIHsKLQkJU3RyaW5nW10gcmVtZW1iZXJlZFByb2plY3ROYW1lcyA9IFN0cmluZ1V0aWxzLnVucGFjayhTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhwcmVmZXJlbmNlTmFtZSkpOwotCQlJUmVzb3VyY2VbXSB3b3Jrc3BhY2VQcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJU3RyaW5nW10gcHJvamVjdE5hbWVzID0gbmV3IFN0cmluZ1t3b3Jrc3BhY2VQcm9qZWN0cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJcHJvamVjdE5hbWVzW2ldID0gd29ya3NwYWNlUHJvamVjdHNbaV0uZ2V0TmFtZSgpOwotCQl9Ci0KLQkJTGlzdCBwcm9qZWN0TmFtZXNUb1JlbWVtYmVyID0gbmV3IEFycmF5TGlzdChyZW1lbWJlcmVkUHJvamVjdE5hbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtZW1iZXJlZFByb2plY3ROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiByZW1lbWJlcmVkUHJvamVjdEV4aXN0cyA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7ICFyZW1lbWJlcmVkUHJvamVjdEV4aXN0cyAmJiBqIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKHJlbWVtYmVyZWRQcm9qZWN0TmFtZXNbaV0uZXF1YWxzKHByb2plY3ROYW1lc1tqXSkpIHsKLQkJCQkJcmVtZW1iZXJlZFByb2plY3RFeGlzdHMgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZW1lbWJlcmVkUHJvamVjdEV4aXN0cykgewotCQkJCXByb2plY3ROYW1lc1RvUmVtZW1iZXIuYWRkKHJlbWVtYmVyZWRQcm9qZWN0TmFtZXNbaV0pOwotCQkJfQotCQkJZWxzZSBpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZW1vdmluZyAiICsgcmVtZW1iZXJlZFByb2plY3ROYW1lc1tpXSArICIgcmVtb3ZlZCBmcm9tICIgKyBwcmVmZXJlbmNlTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0KLQkJaWYgKHByb2plY3ROYW1lc1RvUmVtZW1iZXIuc2l6ZSgpICE9IHJlbWVtYmVyZWRQcm9qZWN0TmFtZXMubGVuZ3RoKSB7Ci0JCQlTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKHByZWZlcmVuY2VOYW1lLCBTdHJpbmdVdGlscy5wYWNrKChTdHJpbmdbXSkgcHJvamVjdE5hbWVzVG9SZW1lbWJlci50b0FycmF5KG5ldyBTdHJpbmdbcHJvamVjdE5hbWVzVG9SZW1lbWJlci5zaXplKCldKSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdTY2hlZHVsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1NjYW5uaW5nU2NoZWR1bGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTU2ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdTY2hlZHVsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgVGFza1NjYW5uaW5nU2NoZWR1bGVyIHsKLQlwcml2YXRlIGNsYXNzIExpc3RlbmVyVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlpbnQgcmVzb3VyY2VUeXBlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlc291cmNlVHlwZSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWRlbHRhLmFjY2VwdCh0aGlzKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gaGFuZGxpbmcgcmVzb3VyY2UgY2hhbmdlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAoKGRlbHRhLmdldEtpbmQoKSAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpID4gMCB8fCAoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuRU5DT0RJTkcpID4gMCB8fCAoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKSA+IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5ST09UKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJZkpvYi5hZGRQcm9qZWN0RGVsdGEoZGVsdGEpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUYXNrU2Nhbm5pbmdTY2hlZHVsZXIgc2NoZWR1bGVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoVGFza1NjYW5uaW5nSm9iLlRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXNjaGVkdWxlci5lbnF1ZXVlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nW10gcHJvamVjdE5hbWVzID0gU3RyaW5nVXRpbHMudW5wYWNrKFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFRhc2tTY2FubmluZ0pvYi5UQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQpKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyZXNoUHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXByb2plY3ROYW1lc1tpXS5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpKSB7Ci0JCQkJZnJlc2hQcm9qZWN0TGlzdC5hZGQocHJvamVjdE5hbWVzW2ldKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgZnJlc2hQcm9qZWN0cyA9IFN0cmluZ1V0aWxzLnBhY2soKFN0cmluZ1tdKSBmcmVzaFByb2plY3RMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tmcmVzaFByb2plY3RMaXN0LnNpemUoKV0pKTsKLQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShUYXNrU2Nhbm5pbmdKb2IuVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVELCBmcmVzaFByb2plY3RzKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNjaGVkdWxlci5lbnF1ZXVlKHByb2plY3QpOwotCX0KLQotCi0JLyoqCi0JICogT25seSBmb3IgdXNlIGJ5IFNTRUNvcmVQbHVnaW4gY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChzY2hlZHVsZXIgIT0gbnVsbCkgewotCQkJc2NoZWR1bGVyLmZKb2IuY2FuY2VsKCk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihzY2hlZHVsZXIudmlzaXRvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPbmx5IGZvciB1c2UgYnkgU1NFQ29yZVBsdWdpbiBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlzY2hlZHVsZXIgPSBuZXcgVGFza1NjYW5uaW5nU2NoZWR1bGVyKCk7Ci0KLQkJLyoKLQkJICogQWNjb3JkaW5nIHRvCi0JCSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZS9kZXZlbG9wbWVudC9wZXJmb3JtYW5jZS9ibG9vcGVycy5odG1sLAotCQkgKiBQT1NUX0NIQU5HRSBsaXN0ZW5lcnMgYWRkIGEgdHJpdmlhbCBwZXJmb3JtYW5jZSBjb3N0LgotCQkgKiAKLQkJICogQWx3YXlzIGFkZCBsaXN0ZW5lciBzaW5jZSB3ZSBtaWdodCBiZSBlbmFibGVkIHBlci1wcm9qZWN0IGV2ZW4gaWYgZGlzYWJsZWQgd29ya3NwYWNlLXdpZGUuCi0JCSAqLwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihzY2hlZHVsZXIudmlzaXRvciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0JCXNjaGVkdWxlci5lbnF1ZXVlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCX0KLQotCVRhc2tTY2FubmluZ0pvYiBmSm9iID0gbnVsbDsKLQotCUxpc3RlbmVyVmlzaXRvciB2aXNpdG9yID0gbnVsbDsKLQotCXByaXZhdGUgVGFza1NjYW5uaW5nU2NoZWR1bGVyKCkgewotCQlzdXBlcigpOwotCQlmSm9iID0gbmV3IFRhc2tTY2FubmluZ0pvYigpOwotCQl2aXNpdG9yID0gbmV3IExpc3RlbmVyVmlzaXRvcigpOwotCX0KLQotCXZvaWQgZW5xdWV1ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZKb2IuYWRkUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQl2b2lkIGVucXVldWUoSVdvcmtzcGFjZVJvb3Qgcm9vdCkgewotCQlJUHJvamVjdFtdIGFsbFByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmSm9iLmFkZFByb2plY3QoYWxsUHJvamVjdHNbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrVGFnUHJlZmVyZW5jZUtleXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1RhZ1ByZWZlcmVuY2VLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2UzMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrVGFnUHJlZmVyZW5jZUtleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGFza1RhZ1ByZWZlcmVuY2VLZXlzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCA9ICJpZ25vcmVkLWNvbnRlbnRUeXBlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19FTkFCTEUgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19OT0RFID0gU1NFQ29yZVBsdWdpbi5JRCArIElQYXRoLlNFUEFSQVRPUiArICJ0YXNrLXRhZ3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfUEVSX1BST0pFQ1QgPSAidXNlLXByb2plY3Qtc2V0dGluZ3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfUFJJT1JJVElFUyA9ICJ0YXNrUHJpb3JpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19UQUdTID0gInRhc2tUYWdzIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9Xb3Jrc3BhY2VUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9Xb3Jrc3BhY2VUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM0YmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvV29ya3NwYWNlVGFza1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5JRmlsZVRhc2tTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5UYXNrVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiBEaXNwYXRjaGVyIGZvciBzY2FubmluZyBiYXNlZCBvbiBkZWx0YXMgYW5kIHJlcXVlc3RlZCBwcm9qZWN0cwotICovCi1jbGFzcyBXb3Jrc3BhY2VUYXNrU2Nhbm5lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgV29ya3NwYWNlVGFza1NjYW5uZXIgX2luc3RhbmNlID0gbnVsbDsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNZTlRIRVRJQ19UQVNLID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudGFzay1zeW50aGV0aWMiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZJQ0FUSU9OX1NUQU1QID0gIm9yZy5lY2xpcHNlLndzdC5zc2UubW9kaWZpY2F0aW9uLXN0YW1wIjsKLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgV29ya3NwYWNlVGFza1NjYW5uZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2luc3RhbmNlID0gbmV3IFdvcmtzcGFjZVRhc2tTY2FubmVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQlmaW5hbCBTdHJpbmcgREVGQVVMVF9NQVJLRVJfVFlQRSA9IElGaWxlVGFza1NjYW5uZXIuVEFTS19NQVJLRVJfSUQ7Ci0JcHJpdmF0ZSBMaXN0IGZBY3RpdmVTY2FubmVycyA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JcHJpdmF0ZSBUYXNrVGFnW10gZkN1cnJlbnRUYXNrVGFncyA9IG51bGw7Ci0KLQlwcml2YXRlIEZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5ID0gbnVsbDsKLQotCXByaXZhdGUgbG9uZyB0aW1lMDsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgV29ya3NwYWNlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlZ2lzdHJ5ID0gRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJZkFjdGl2ZVNjYW5uZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmQ3VycmVudFRhc2tUYWdzID0gbmV3IFRhc2tUYWdbMF07Ci0JCWZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzID0gbmV3IElDb250ZW50VHlwZVswXTsKLQl9Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZVtdIGRldGVjdENvbnRlbnRUeXBlcyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQl0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCWlmICh0eXBlcy5sZW5ndGggPT0gMCkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gb3B0aW1pemVkIGRlc2NyaXB0aW9uIGxvb2t1cCwgbWlnaHQgbm90IHN1Y2NlZWQKLQkJCQkJZCA9ICgoSUZpbGUpIHJlc291cmNlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQkJdHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW117ZC5nZXRDb250ZW50VHlwZSgpfTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIHNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kIGZpbGUKLQkJCQkJICogdHlwZSBjaGVjayBhYm92ZQotCQkJCQkgKi8KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodHlwZXMgPT0gbnVsbCkgewotCQkJCXR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU0NPTlRFTlRUWVBFKSB7Ci0JCQkJaWYgKHR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJaWYgKHR5cGVzLmxlbmd0aCA+IDEpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpICsgIjogIiArICJtdWx0aXBsZSBiYXNlZCBvbiBuYW1lIChwcm9iYWJseSBoaWVyYXJjaGljYWwpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpICsgIiBtYXRjaGVkOiAiICsgdHlwZXNbaV0uZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQl9Ci0JCWVsc2UgewotCQkJcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5pdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QocmVzb3VyY2UpOwotCi0JCUlQcmVmZXJlbmNlc1NlcnZpY2UgcHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCUlTY29wZUNvbnRleHRbXSBsb29rdXBPcmRlciA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IFByb2plY3RTY29wZShwcm9qZWN0KSwgbmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQotCQlib29sZWFuIHByb2NlZWQgPSBwcmVmZXJlbmNlc1NlcnZpY2UuZ2V0Qm9vbGVhbihUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UsIGxvb2t1cE9yZGVyKTsKLQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUFJFRlMpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2NhbiBvZiAiICsgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSArICI6IiArIHByb2NlZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmIChwcm9jZWVkKSB7Ci0JCQlTdHJpbmdbXSB0YWdzID0gU3RyaW5nVXRpbHMudW5wYWNrKHByZWZlcmVuY2VzU2VydmljZS5nZXRTdHJpbmcoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTLCBudWxsLCBsb29rdXBPcmRlcikpOwotCQkJU3RyaW5nW10gcHJpb3JpdGllcyA9IFN0cmluZ1V0aWxzLnVucGFjayhwcmVmZXJlbmNlc1NlcnZpY2UuZ2V0U3RyaW5nKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgbnVsbCwgbG9va3VwT3JkZXIpKTsKLQkJCVN0cmluZ1tdIGN1cnJlbnRJZ25vcmVDb250ZW50VHlwZUlEcyA9IFN0cmluZ1V0aWxzLnVucGFjayhwcmVmZXJlbmNlc1NlcnZpY2UuZ2V0U3RyaW5nKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQsIG51bGwsIGxvb2t1cE9yZGVyKSk7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUFJFRlMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB0YWdzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFncy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQodGFnc1tpXSk7Ci0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCVN5c3RlbS5vdXQucHJpbnQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHByaW9yaXRpZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmlvcml0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpID4gMCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJU3lzdGVtLm91dC5wcmludChwcmlvcml0aWVzW2ldKTsKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludChnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaWdub3JlZCBjb250ZW50IHR5cGVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudElnbm9yZUNvbnRlbnRUeXBlSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpID4gMCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJU3lzdGVtLm91dC5wcmludChjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHNbaV0pOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzID0gbmV3IElDb250ZW50VHlwZVtjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHMubGVuZ3RoXTsKLQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRJZ25vcmVDb250ZW50VHlwZUlEcy5sZW5ndGg7IGkrKykgewotCQkJCWZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzW2ldID0gY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGN1cnJlbnRJZ25vcmVDb250ZW50VHlwZUlEc1tpXSk7Ci0JCQl9Ci0JCQlpbnQgbWF4ID0gTWF0aC5taW4odGFncy5sZW5ndGgsIHByaW9yaXRpZXMubGVuZ3RoKTsKLQkJCWZDdXJyZW50VGFza1RhZ3MgPSBuZXcgVGFza1RhZ1ttYXhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJCWludCBwcmlvcml0eSA9IFRhc2tUYWcuUFJJT1JJVFlfTk9STUFMOwotCQkJCXRyeSB7Ci0JCQkJCXByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludChwcmlvcml0aWVzW2ldKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGRlZmF1bHQgdG8gbm9ybWFsIHByaW9yaXR5Ci0JCQkJfQotCQkJCWZDdXJyZW50VGFza1RhZ3NbaV0gPSBuZXcgVGFza1RhZyh0YWdzW2ldLCBwcmlvcml0eSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2NlZWQ7Ci0JfQotCi0Jdm9pZCBpbnRlcm5hbFNjYW4oZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHNjYW5Nb25pdG9yKSB7Ci0JCWlmIChzY2FuTW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJCWlmIChyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiAhcmVzb3VyY2UuaXNEZXJpdmVkKCkgJiYgIXJlc291cmNlLmlzUGhhbnRvbSgpICYmICFyZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgJiYgbmFtZS5sZW5ndGgoKSAhPSAwICYmIG5hbWUuY2hhckF0KDApICE9ICcuJykgewotCQkJCWlmICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZPTERFUikgPiAwIHx8IChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPiAwKSB7Ci0JCQkJCUlSZXNvdXJjZVtdIGNoaWxkcmVuID0gKChJQ29udGFpbmVyKSByZXNvdXJjZSkubWVtYmVycygpOwotCQkJCQlzY2FuTW9uaXRvci5iZWdpblRhc2soIiIsIGNoaWxkcmVuLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQkJaW50ZXJuYWxTY2FuKHByb2plY3QsIGNoaWxkcmVuW2ldLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHNjYW5Nb25pdG9yLCAxLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spKTsKLQkJCQkJfQotCQkJCQlzY2FuTW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRklMRSkgPiAwKSB7Ci0JCQkJCXNjYW5GaWxlKHByb2plY3QsIGZDdXJyZW50VGFza1RhZ3MsIChJRmlsZSkgcmVzb3VyY2UsIHNjYW5Nb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXZvaWQgaW50ZXJuYWxTY2FuKElSZXNvdXJjZURlbHRhIGRlbHRhLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJU3RyaW5nIG5hbWUgPSBkZWx0YS5nZXRGdWxsUGF0aCgpLmxhc3RTZWdtZW50KCk7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKCFyZXNvdXJjZS5pc0Rlcml2ZWQoKSAmJiAhcmVzb3VyY2UuaXNQaGFudG9tKCkgJiYgIXJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSAmJiBuYW1lLmxlbmd0aCgpICE9IDAgJiYgbmFtZS5jaGFyQXQoMCkgIT0gJy4nKSB7Ci0JCQkJaWYgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRk9MREVSKSA+IDAgfHwgKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA+IDApIHsKLQkJCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGNoaWxkcmVuLmxlbmd0aCk7Ci0JCQkJCWlmIChuYW1lLmxlbmd0aCgpICE9IDAgJiYgbmFtZS5jaGFyQXQoMCkgIT0gJy4nICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCQkJCWZvciAoaW50IGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJCWludGVybmFsU2NhbihjaGlsZHJlbltpXSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GSUxFKSA+IDApIHsKLQkJCQkJaWYgKChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5BRERFRCkgPiAwIHx8ICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgPiAwICYmIChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPiAwKSkgewotCQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0JCQkJCQlzY2FuRmlsZShmaWxlLmdldFByb2plY3QoKSwgZkN1cnJlbnRUYXNrVGFncywgZmlsZSwgbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VUYXNrTWFya2VycyhmaW5hbCBJRmlsZSBmaWxlLCBmaW5hbCBTdHJpbmdbXSBtYXJrZXJUeXBlcywgZmluYWwgTWFwIG1hcmtlckF0dHJpYnV0ZU1hcHNbXSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIElGaWxlIGZpbmFsRmlsZSA9IGZpbGU7Ci0JCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQl0cnkgewotCQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSByID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKCIiLCAyKTsvLyROT04tTkxTLTEkCi0JCQkJCQl0cnkgewotCQkJCQkJCS8qCi0JCQkJCQkJICogRGVsZXRlIG9sZCBUYXNrIG1hcmtlcnMgKGRvbid0IGRlbGV0ZSByZWd1bGFyCi0JCQkJCQkJICogVGFza3Mgc2luY2UgdGhhdCBpbmNsdWRlcyB1c2VyLWRlZmluZWQgb25lcykKLQkJCQkJCQkgKi8KLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCWlmIChJTWFya2VyLlRBU0suZXF1YWxzKG1hcmtlclR5cGVzW2ldKSkgewotCQkJCQkJCQkJLy8gb25seSByZW1vdmUgaWYgc3ludGhldGljCi0JCQkJCQkJCQlJTWFya2VyW10gZm91bmRNYXJrZXJzID0gZmlsZS5maW5kTWFya2VycyhtYXJrZXJUeXBlc1tpXSwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmb3VuZE1hcmtlcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJCQlpZiAoZm91bmRNYXJrZXJzW2pdLmdldEF0dHJpYnV0ZShTWU5USEVUSUNfVEFTSykgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlmb3VuZE1hcmtlcnNbal0uZGVsZXRlKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJZmlsZS5kZWxldGVNYXJrZXJzKG1hcmtlclR5cGVzW2ldLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGRlbGV0aW5nIG9sZCB0YXNrcyIsIGUpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChtYXJrZXJBdHRyaWJ1dGVNYXBzICE9IG51bGwgJiYgbWFya2VyQXR0cmlidXRlTWFwcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyBtYXJrZXJBdHRyaWJ1dGVNYXBzLmxlbmd0aCArICIgdGFza3MgZm9yICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJBdHRyaWJ1dGVNYXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCVN0cmluZyBzcGVjaWZpZWRNYXJrZXJUeXBlID0gKFN0cmluZykgbWFya2VyQXR0cmlidXRlTWFwc1tpXS5nZXQoSU1hcmtlci5UQVNLKTsKLQkJCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBmaW5hbEZpbGUuY3JlYXRlTWFya2VyKHNwZWNpZmllZE1hcmtlclR5cGUpOwotCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlcyhtYXJrZXJBdHRyaWJ1dGVNYXBzW2ldKTsKLQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlVTRVJfRURJVEFCTEUsIEJvb2xlYW4uRkFMU0UpOwotCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE1PRElGSUNBVElPTl9TVEFNUCwgTG9uZy50b1N0cmluZyhmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpKTsKLQkJCQkJCQkJaWYgKElNYXJrZXIuVEFTSy5lcXVhbHMoc3BlY2lmaWVkTWFya2VyVHlwZSkpIHsKLQkJCQkJCQkJCS8vIHNldCB0byBzeW50aGV0aWMgYW5kIG1ha2UgdXNlciBlZGl0YWJsZQotCQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShTWU5USEVUSUNfVEFTSywgdHJ1ZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJZmluYWxGaWxlLmdldFdvcmtzcGFjZSgpLnJ1bihyLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKGZpbGUpLCBJV29ya3NwYWNlLkFWT0lEX1VQREFURSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCX0KLQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBub3QgYW4gZXJyb3IgY29uZGl0aW9uCi0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHNjYW4oZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBzY2FuTW9uaXRvcikgewotCQlpZiAoc2Nhbk1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNjYW5uaW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2tpcHBpbmcgaW5hY2Nlc3NpYmxlIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU09WRVJBTExQRVJGKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWlmIChpbml0KHByb2plY3QpKSB7Ci0JCQlpbnRlcm5hbFNjYW4ocHJvamVjdCwgcHJvamVjdCwgc2Nhbk1vbml0b3IpOwotCQkJc2h1dGRvd25EZWxlZ2F0ZXMocHJvamVjdCk7Ci0JCX0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU09WRVJBTExQRVJGKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMgZm9yICIgKyBwcm9qZWN0LmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCi0Jdm9pZCBzY2FuKElSZXNvdXJjZURlbHRhIGRlbHRhLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTT1ZFUkFMTFBFUkYpIHsKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKGluaXQoZGVsdGEuZ2V0UmVzb3VyY2UoKSkpIHsKLQkJCWludGVybmFsU2NhbihkZWx0YSwgbW9uaXRvcik7Ci0JCQlzaHV0ZG93bkRlbGVnYXRlcyhkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKSk7Ci0JCX0KLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU09WRVJBTExQRVJGKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMgZm9yICIgKyBkZWx0YS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQl2b2lkIHNjYW5GaWxlKElQcm9qZWN0IHByb2plY3QsIFRhc2tUYWdbXSB0YXNrVGFncywgSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQotCQkvLyAzICJzdGFnZXMiCi0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCA4KTsvLyROT04tTkxTLTEkCi0JCW1vbml0b3Iuc3ViVGFzayhmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSkpOwotCi0JCUxpc3QgbWFya2VyQXR0cmlidXRlcyA9IG51bGw7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZGV0ZWN0Q29udGVudFR5cGVzKGZpbGUpOwotCQlTZXQgbWFya2VyVHlwZXMgPSBuZXcgSGFzaFNldCgzKTsKLQkJLy8gQWx3YXlzIGluY2x1ZGVkIGZvciBzYWZldHkgYW5kIG1pZ3JhdGlvbgotCQltYXJrZXJUeXBlcy5hZGQoREVGQVVMVF9NQVJLRVJfVFlQRSk7Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCUlGaWxlVGFza1NjYW5uZXJbXSBmaWxlU2Nhbm5lcnMgPSBudWxsOwotCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJaWYgKGZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJZmlsZVNjYW5uZXJzID0gcmVnaXN0cnkuZ2V0RmlsZVRhc2tTY2FubmVycyh0eXBlcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlMaXN0IHZhbGlkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gb2J0YWluIGEgZmlsdGVyZWQgbGlzdCBvZiBkZWxlZ2F0ZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWJvb2xlYW4gaWdub3JlQ29udGVudFR5cGUgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWdub3JlQ29udGVudFR5cGUgPSBpZ25vcmVDb250ZW50VHlwZSB8fCB0eXBlc1tpXS5pc0tpbmRPZihmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlc1tqXSk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFpZ25vcmVDb250ZW50VHlwZSkgewotCQkJCQkJdmFsaWRUeXBlcy5hZGQodHlwZXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbGVTY2FubmVycyA9IHJlZ2lzdHJ5LmdldEZpbGVUYXNrU2Nhbm5lcnMoKElDb250ZW50VHlwZVtdKSB2YWxpZFR5cGVzLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVt2YWxpZFR5cGVzLnNpemUoKV0pKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQlpZiAoZmlsZVNjYW5uZXJzLmxlbmd0aCA+IDApIHsKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIHNjYW5uZXJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAzLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCQkJCXNjYW5uZXJNb25pdG9yLmJlZ2luVGFzaygiIiwgZmlsZVNjYW5uZXJzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IgKGludCBqID0gMDsgZmlsZVNjYW5uZXJzICE9IG51bGwgJiYgaiA8IGZpbGVTY2FubmVycy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmICghZkFjdGl2ZVNjYW5uZXJzLmNvbnRhaW5zKGZpbGVTY2FubmVyc1tqXSkgJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJZmlsZVNjYW5uZXJzW2pdLnN0YXJ0dXAoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCWZBY3RpdmVTY2FubmVycy5hZGQoZmlsZVNjYW5uZXJzW2pdKTsKLQkJCQkJCX0KLQkJCQkJCW1hcmtlclR5cGVzLmFkZChmaWxlU2Nhbm5lcnNbal0uZ2V0TWFya2VyVHlwZSgpKTsKLQkJCQkJCU1hcFtdIHRhc2tNYXJrZXJBdHRyaWJ1dGVzID0gZmlsZVNjYW5uZXJzW2pdLnNjYW4oZmlsZSwgdGFza1RhZ3MsIG5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc2Nhbm5lck1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSykpOwotCQkJCQkJLyoKLQkJCQkJCSAqIFRPRE86IHBvb2wgdGhlIG1hcmtlciByZXN1bHRzIHNvIHRoZXJlJ3Mgb25seSBvbmUKLQkJCQkJCSAqIG9wZXJhdGlvbiBjcmVhdGluZyB0aGVtCi0JCQkJCQkgKi8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFza01hcmtlckF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpZiAobWFya2VyQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQkJCQkJCW1hcmtlckF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghdGFza01hcmtlckF0dHJpYnV0ZXNbaV0uY29udGFpbnNLZXkoSU1hcmtlci5UQVNLKSkgewotCQkJCQkJCQl0YXNrTWFya2VyQXR0cmlidXRlc1tpXS5wdXQoSU1hcmtlci5UQVNLLCBmaWxlU2Nhbm5lcnNbal0uZ2V0TWFya2VyVHlwZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGFza01hcmtlckF0dHJpYnV0ZXNbaV0ucHV0KElNYXJrZXIuU09VUkNFX0lELCBmaWxlU2Nhbm5lcnNbal0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJCQkJCW1hcmtlckF0dHJpYnV0ZXMuYWRkKHRhc2tNYXJrZXJBdHRyaWJ1dGVzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXNjYW5uZXJNb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW1vbml0b3Iud29ya2VkKDQpOwotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQkvLyBvbmx5IHVwZGF0ZSBtYXJrZXJzIGlmIHdlIHJhbiBhIHNjYW5uZXIgb24gdGhpcyBmaWxlCi0JCWlmIChmaWxlU2Nhbm5lcnMgIT0gbnVsbCAmJiBmaWxlU2Nhbm5lcnMubGVuZ3RoID4gMCkgewotCQkJSVByb2dyZXNzTW9uaXRvciBtYXJrZXJVcGRhdGVNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAzLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCQkJaWYgKG1hcmtlckF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCXJlcGxhY2VUYXNrTWFya2VycyhmaWxlLCAoU3RyaW5nW10pIG1hcmtlclR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1ttYXJrZXJUeXBlcy5zaXplKCldKSwgKE1hcFtdKSBtYXJrZXJBdHRyaWJ1dGVzLnRvQXJyYXkobmV3IE1hcFttYXJrZXJBdHRyaWJ1dGVzLnNpemUoKV0pLCBtYXJrZXJVcGRhdGVNb25pdG9yKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW1vbml0b3Iud29ya2VkKDMpOwotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaHV0ZG93bkRlbGVnYXRlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZkFjdGl2ZVNjYW5uZXJzLnNpemUoKTsgaisrKSB7Ci0JCQl0cnkgewotCQkJCSgoSUZpbGVUYXNrU2Nhbm5lcikgZkFjdGl2ZVNjYW5uZXJzLmdldChqKSkuc2h1dGRvd24ocHJvamVjdCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKHByb2plY3QuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBlKTsKLQkJCX0KLQkJfQotCQlmQWN0aXZlU2Nhbm5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvU3RydWN0dXJlZE1vZGVsTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NmY5ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbE1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ2xhc3MgdG8gYWxsb3cgYWNjZXNzIHRvIE1vZGVsTWFuYWdlci4gTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiAKLSAqIEBzaW5jZSAgMS41ICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUKLSAqLwotZmluYWwgcHVibGljIGNsYXNzIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIgewotCS8qKgotCSAqIERvIG5vdCBhbGxvdyBpbnN0YW5jZXMgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSBvZiBJTW9kZWxNYW5hZ2VyLiBSZXR1cm5zIG51bGwgaWYgbW9kZWwKLQkgKiBtYW5hZ2VyIGNhbiBub3QgYmUgY3JlYXRlZCBvciBpcyBub3QgdmFsaWQgKHN1Y2ggYXMsIHdoZW4gd29ya2JlbmNoIGlzCi0JICogc2h1dHRpbmcgZG93bikuCi0JICogCi0JICogQHJldHVybiBJTW9kZWxNYW5hZ2VyIC0gcmV0dXJucyB0aGUgb25lIG1vZGVsIG1hbmFnZXIgZm9yIHN0cnVjdHVyZWQKLQkgKiAgICAgICAgIG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJYm9vbGVhbiBpc1JlYWR5ID0gZmFsc2U7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJd2hpbGUgKCFpc1JlYWR5KSB7Ci0JCQlCdW5kbGUgbG9jYWxCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoU1NFQ29yZVBsdWdpbi5JRCk7Ci0JCQlpbnQgc3RhdGUgPSBsb2NhbEJ1bmRsZS5nZXRTdGF0ZSgpOwotCQkJaWYgKHN0YXRlID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQkvLyBnZXRJbnN0YW5jZSBpcyBhIHN5bmNocm9uaXplZCBzdGF0aWMgbWV0aG9kLgotCQkJCW1vZGVsTWFuYWdlciA9IE1vZGVsTWFuYWdlckltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXRlID09IEJ1bmRsZS5TVEFSVElORykgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0KLQkJCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUsIGp1c3QgbG9vcCBhZ2FpbgotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXRlID09IEJ1bmRsZS5TVE9QUElORyB8fCBzdGF0ZSA9PSBCdW5kbGUuVU5JTlNUQUxMRUQpIHsKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQltb2RlbE1hbmFnZXIgPSBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbm90IHN1cmUgYWJvdXQgb3RoZXIgc3RhdGVzLCAncmVzb2x2ZWQnLCAnaW5zdGFsbGVkJwotCQkJCWlzUmVhZHkgPSB0cnVlOwotCQkJCW1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0ZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGU1ZWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotCi0vKioKLSAqIE5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLCByZWZlcmVuY2VkIG9yIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICogCi0gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBjb29yZGluYXRpbmcgdGhlIGNyZWF0aW9uIGFuZCBkaXNwb3NhbCBvZgotICogc3RydWN0dXJlZCBtb2RlbHMgYnVpbHQgb24gc3RydWN0dXJlZCBkb2N1bWVudHMgZm91bmQgaW4gRmlsZUJ1ZmZlcnMuIEl0Ci0gKiBhbGxvd3MgdGhlIFNTRSBNb2RlbCBNYW5hZ2VyIHRvIGFjdCBhcyBhIGNsaWVudCB0byB0aGUKLSAqIFRleHRGaWxlQnVmZmVyTWFuYWdlci4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgewotCi0Jc3RhdGljIGNsYXNzIERvY3VtZW50SW5mbyB7Ci0JCS8qKgotCQkgKiBUaGUgSVRleHRGaWxlQnVmZmVyCi0JCSAqLwotCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIHBsYXRmb3JtIGNvbnRlbnQtdHlwZSBJRCBvZiB0aGlzIGRvY3VtZW50Ci0JCSAqLwotCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBJU3RydWN0dXJlTW9kZWwgY29udGFpbmluZyB0aGlzIGRvY3VtZW50OyBtaWdodCBiZSBudWxsIGF0Ci0JCSAqIHBvaW50cyBpbiB0aGUgSVRleHRGaWxlQnVmZmVyJ3MgbGlmZWN5Y2xlCi0JCSAqLwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQotCQkvKioKLQkJICogV2hldGhlciBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGNhbGxlZCBjb25uZWN0KCkgZm9yIHRoaXMKLQkJICogRG9jdW1lbnRJbmZvJ3MgdGV4dCBmaWxlYnVmZmVyCi0JCSAqLwotCQlib29sZWFuIHNlbGZDb25uZWN0ZWQgPSBmYWxzZTsKLQotCQlpbnQgYnVmZmVyUmVmZXJlbmNlQ291bnQgPSAwOwotCQlpbnQgbW9kZWxSZWZlcmVuY2VDb3VudCA9IDA7Ci0KLQkJLyoqCi0JCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSAiY29tcGF0aWJpbGl0eSIga2luZCBmcm9tIGJlZm9yZSB0aGVyZSB3YXMKLQkJICogYSBMb2NhdGlvbktpbmQgaGludCBvYmplY3QtLXRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgb3ZlcnJpZGRlbiBhdAotCQkgKiBydW50aW1lLgotCQkgKi8KLQkJTG9jYXRpb25LaW5kIGxvY2F0aW9uS2luZCA9IExvY2F0aW9uS2luZC5OT1JNQUxJWkU7Ci0JfQotCi0JLyoqCi0JICogQSBVUklSZXNvbHZlciBpbnN0YW5jZSBvZiBtb2RlbHMgYnVpbHQgb24gamF2YS5pby5GaWxlcwotCSAqLwotCWNsYXNzIEV4dGVybmFsVVJJUmVzb2x2ZXIgaW1wbGVtZW50cyBVUklSZXNvbHZlciB7Ci0JCUlQYXRoIGZMb2NhdGlvbjsKLQotCQlFeHRlcm5hbFVSSVJlc29sdmVyKElQYXRoIGxvY2F0aW9uKSB7Ci0JCQlmTG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUJhc2VMb2NhdGlvbigpIHsKLQkJCXJldHVybiBmTG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlLCBmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQkvLyBpZ25vcmUgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzIHZhbHVlCi0JCQlpZiAodXJpID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAodXJpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0JCQkJCXJldHVybiB1cmwuZ2V0RmlsZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gVVJJSGVscGVyLm5vcm1hbGl6ZSh1cmksIGJhc2VSZWZlcmVuY2UsIFBhdGguUk9PVC50b1N0cmluZygpKTsKLQkJfQotCi0JCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSUNvbnRhaW5lciBnZXRSb290TG9jYXRpb24oKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRVUklTdHJlYW0oU3RyaW5nIHVyaSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgewotCQkJZkxvY2F0aW9uID0gbmV3IFBhdGgobmV3TG9jYXRpb24pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBuZXdQcm9qZWN0KSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIFVSSVJlc29sdmVyIGluc3RhbmNlIG9mIG1vZGVscyBidWlsdCBvbiB0aGUgZXh0ZW5zaWJsZSBXU1QgVVJJCi0JICogcmVzb2x2ZXIKLQkgKi8KLQljbGFzcyBDb21tb25VUklSZXNvbHZlciBpbXBsZW1lbnRzIFVSSVJlc29sdmVyIHsKLQkJU3RyaW5nIGZMb2NhdGlvbjsKLQkJSVBhdGggZlBhdGg7Ci0JCXByaXZhdGUgSVByb2plY3QgZlByb2plY3Q7Ci0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgU0VQQVJBVE9SID0gIi8iOyAvLyROT04tTkxTLTEkIAotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVfUFJFRklYID0gImZpbGU6Ly8iOyAvLyROT04tTkxTLTEkCi0KLQkJQ29tbW9uVVJJUmVzb2x2ZXIoSUZpbGUgd29ya3NwYWNlRmlsZSkgewotCQkJZlBhdGggPSB3b3Jrc3BhY2VGaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQlmUHJvamVjdCA9IHdvcmtzcGFjZUZpbGUuZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRGaWxlQmFzZUxvY2F0aW9uKCkgewotCQkJcmV0dXJuIGZMb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlLCBmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQlib29sZWFuIGJhc2VIYXNQcmVmaXggPSBiYXNlUmVmZXJlbmNlICE9IG51bGwgJiYgYmFzZVJlZmVyZW5jZS5zdGFydHNXaXRoKEZJTEVfUFJFRklYKTsKLQkJCVN0cmluZyByZWZlcmVuY2UgPSBudWxsOwotCQkJaWYgKGJhc2VIYXNQcmVmaXgpIHsKLQkJCQlyZWZlcmVuY2UgPSBiYXNlUmVmZXJlbmNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVmZXJlbmNlID0gRklMRV9QUkVGSVggKyBiYXNlUmVmZXJlbmNlOwotCQkJfQotCQkJU3RyaW5nIHJlc3VsdCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShyZWZlcmVuY2UsIG51bGwsIHVyaSk7Ci0JCQkvLyBMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLAotCQkJLy8gIlVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZSgiCi0JCQkvLyArIHJlZmVyZW5jZSArICIsIG51bGwsICIgK3VyaSsiKSA9ICIgKyByZXN1bHQpOwotCQkJaWYgKCFiYXNlSGFzUHJlZml4ICYmIHJlc3VsdC5zdGFydHNXaXRoKEZJTEVfUFJFRklYKSAmJiByZXN1bHQubGVuZ3RoKCkgPiBGSUxFX1BSRUZJWC5sZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoRklMRV9QUkVGSVgubGVuZ3RoKCkpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQkJcmV0dXJuIGZQcm9qZWN0OwotCQl9Ci0KLQkJcHVibGljIElDb250YWluZXIgZ2V0Um9vdExvY2F0aW9uKCkgewotCQkJU3RyaW5nIHJvb3QgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoRklMRV9QUkVGSVggKyBnZXRGaWxlQmFzZUxvY2F0aW9uKCksIG51bGwsIFNFUEFSQVRPUik7Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChyb290KSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKChmaWxlc1tpXS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRk9MREVSKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQkJCWlmIChmUGF0aC5pc1ByZWZpeE9mKCgoSUZvbGRlcikgZmlsZXNbaV0pLmdldEZ1bGxQYXRoKCkpKSB7Ci0JCQkJCQlyZXR1cm4gKElGb2xkZXIpIGZpbGVzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGdldFByb2plY3QoKTsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRVUklTdHJlYW0oU3RyaW5nIHVyaSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgewotCQkJZkxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJCWZQcm9qZWN0ID0gbmV3UHJvamVjdDsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcHMgaW50ZXJlc3RpbmcgZG9jdW1lbnRzIGluIGZpbGUgYnVmZmVycyB0byB0aG9zZSBmaWxlIGJ1ZmZlcnMuCi0JICogUmVxdWlyZWQgdG8gYWxsb3dzIHVzIHRvIGdvIGZyb20gZG9jdW1lbnRzIHRvIGNvbXBsZXRlIG1vZGVscy4KLQkgKi8KLQljbGFzcyBGaWxlQnVmZmVyTWFwcGVyIGltcGxlbWVudHMgSUZpbGVCdWZmZXJMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNvbnRlbnRSZXBsYWNlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNyZWF0ZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIHRleHRCdWZmZXIgPSAoSVRleHRGaWxlQnVmZmVyKSBidWZmZXI7Ci0JCQkJaWYgKCEodGV4dEJ1ZmZlci5nZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkxlYXJuZWQgbmV3IGJ1ZmZlcjogIiArIGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiICIgKyBidWZmZXIgKyAiICIgKyAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSBuZXcgRG9jdW1lbnRJbmZvKCk7Ci0JCQkJaW5mby5idWZmZXIgPSB0ZXh0QnVmZmVyOwotCQkJCWluZm8uY29udGVudFR5cGVJRCA9IGRldGVjdENvbnRlbnRUeXBlKGJ1ZmZlci5nZXRMb2NhdGlvbigpKS5nZXRJZCgpOwotCQkJCWluZm8uYnVmZmVyUmVmZXJlbmNlQ291bnQrKzsKLQkJCQlmRG9jdW1lbnRNYXAucHV0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSwgaW5mbyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBidWZmZXJEaXNwb3NlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgdGV4dEJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQlpZiAoISh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRGlzY2FyZGVkIGJ1ZmZlcjogIiArIGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiICIgKyBidWZmZXIgKyAiICIgKyAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50LS07Ci0JCQkJCWlmIChpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50ID09IDAgJiYgaW5mby5tb2RlbFJlZmVyZW5jZUNvdW50ID09IDApCi0JCQkJCQlmRG9jdW1lbnRNYXAucmVtb3ZlKHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlydHlTdGF0ZUNoYW5nZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBib29sZWFuIGlzRGlydHkpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkJ1ZmZlciBkaXJ0eSBzdGF0ZSBjaGFuZ2VkOiAoIiArIGlzRGlydHkgKyAiKSAiICsgYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIgIiArIGJ1ZmZlciArICIgIiArICgoSVRleHRGaWxlQnVmZmVyKSBidWZmZXIpLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJfQotCQkJCUlUZXh0RmlsZUJ1ZmZlciB0ZXh0QnVmZmVyID0gKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyOwotCQkJCWlmICghKHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpKQotCQkJCQlyZXR1cm47Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLm1vZGVsICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1zZyA9ICJVcGRhdGluZyBtb2RlbCBkaXJ0eSBzdGF0ZSBmb3IiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQgfHwgTG9nZ2VyLkRFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIG1zZyk7Ci0JCQkJCX0KLQkJCQkJaW5mby5tb2RlbC5zZXREaXJ0eVN0YXRlKGlzRGlydHkpOwotCi0JCQkJCUlGaWxlIHdvcmtzcGFjZUZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpKTsKLQkJCQkJaWYgKCFpc0RpcnR5ICYmIHdvcmtzcGFjZUZpbGUgIT0gbnVsbCkgewotCQkJCQkJaW5mby5tb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKHdvcmtzcGFjZUZpbGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VGYWlsZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5naW5nKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVWYWxpZGF0aW9uQ2hhbmdlZChJRmlsZUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gaXNTdGF0ZVZhbGlkYXRlZCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5kZXJseWluZ0ZpbGVEZWxldGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRGVsZXRlZCBidWZmZXI6ICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkgKyAiICIgKyBidWZmZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1bmRlcmx5aW5nRmlsZU1vdmVkKElGaWxlQnVmZmVyIGJ1ZmZlciwgSVBhdGggcGF0aCkgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW92ZWQgYnVmZmVyIGZyb206ICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkgKyAiICIgKyBidWZmZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vdmVkIGJ1ZmZlciB0bzogIiArIHBhdGgudG9PU1N0cmluZygpICsgIiAiICsgYnVmZmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBpbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0Jc3RhdGljIGZpbmFsIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQpIHsKLQkJCQlJRG9jdW1lbnRbXSBkYW5nbGluZ0RvY3VtZW50cyA9IChJRG9jdW1lbnRbXSkgaW5zdGFuY2UuZkRvY3VtZW50TWFwLmtleVNldCgpLnRvQXJyYXkobmV3IElEb2N1bWVudFswXSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYW5nbGluZ0RvY3VtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGluc3RhbmNlLmZEb2N1bWVudE1hcC5nZXQoZGFuZ2xpbmdEb2N1bWVudHNbaV0pOwotCQkJCQlpZiAoaW5mby5tb2RlbFJlZmVyZW5jZUNvdW50ID4gMCkKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTEVBS0VEIE1PREVMOiAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIChpbmZvLm1vZGVsICE9IG51bGwgPyBpbmZvLm1vZGVsLmdldElkKCkgOiBudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAoaW5mby5idWZmZXJSZWZlcmVuY2VDb3VudCA+IDApCi0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkxFQUtFRCBCVUZGRVI6ICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgaW5mby5idWZmZXIuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLnJlbW92ZUZpbGVCdWZmZXJMaXN0ZW5lcihpbnN0YW5jZS5mRmlsZUJ1ZmZlckxpc3RlbmVyKTsKLQkJCWluc3RhbmNlID0gbnVsbDsKLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCB2b2lkIHN0YXJ0dXAoKSB7Ci0JCWdldEluc3RhbmNlKCk7Ci0JfQotCi0JLy8gYSBtYXAgb2YgSVN0cnVjdHVyZWREb2N1bWVudHMgdG8gRG9jdW1lbnRJbmZvIG9iamVjdHMKLQlNYXAgZkRvY3VtZW50TWFwID0gbnVsbDsKLQotCUlGaWxlQnVmZmVyTGlzdGVuZXIgZkZpbGVCdWZmZXJMaXN0ZW5lciA9IG51bGw7Ci0KLQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnRNYXAgPSBuZXcgSGFzaHRhYmxlKDQpOwotCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5hZGRGaWxlQnVmZmVyTGlzdGVuZXIoZkZpbGVCdWZmZXJMaXN0ZW5lciA9IG5ldyBGaWxlQnVmZmVyTWFwcGVyKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjYWxjdWxhdGUgYSBtb2RlbCBJRCB3aXRob3V0IGFuIElGaWxlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBpZCA9IG51bGw7Ci0JCUlQYXRoIHBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBUaGUgSUQgb2YgbW9kZWxzIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbGl6ZWQgcGF0aHMKLQkJCSAqIHN0b3JlZCBpbiB0aGUgdW5kZXJseWluZyBGaWxlQnVmZmVycyB0byByZXRyaWV2ZSB0aGVtIGJ5IGNvbW1vbgotCQkJICogSUQgbGF0ZXIgb24uIFdlIGNob3NlIHRoZSBGaWxlQnVmZmVyIG5vcm1hbGl6ZWQgcGF0aCBvdmVyIHRoZQotCQkJICogcHJldmlvdXNseSB1c2VkIGFic29sdXRlIElGaWxlIHBhdGggYmVjYXVzZSB0aGUgYnVmZmVycyBzaG91bGQKLQkJCSAqIGFscmVhZHkgZXhpc3QgYmVmb3JlIHdlIGJ1aWxkIGEgbW9kZWwgYW5kIHdlIGNhbid0IHJldHJpZXZlIGEKLQkJCSAqIEZpbGVCdWZmZXIgdXNpbmcgdGhlIElEIG9mIGEgbW9kZWwgdGhhdCBkb2Vzbid0IHlldCBleGlzdC4KLQkJCSAqLwotCQkJaWQgPSBGaWxlQnVmZmVycy5ub3JtYWxpemVMb2NhdGlvbihwYXRoKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBpZDsKLQotCX0KLQotCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVJZChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGNhbGN1bGF0ZSBhIG1vZGVsIElEIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IGdldEJ1ZmZlcihkb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWQgPSBidWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgImludGVyZXN0IiBpbiBhIGRvY3VtZW50LCBvciByYXRoZXIgdGhlIGZpbGUgYnVmZmVyIHRoYXQKLQkgKiBiYWNrcyBpdC4gSW50ZW50aW9uYWxseSB1c2VkIHRvIGFsdGVyIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGZpbGUKLQkgKiBidWZmZXIgc28gaXQgaXMgbm90IGFjY2lkZW50YWxseSBkaXNwb3NlZCBvZi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiggaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIGJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLQkJSVBhdGggYnVmZmVyTG9jYXRpb24gPSBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpOwotCQlib29sZWFuIGlzT0sgPSB0cnVlOwotCQl0cnkgewotCQkJYnVmZmVyTWFuYWdlci5jb25uZWN0KGJ1ZmZlckxvY2F0aW9uLCBpbmZvLmxvY2F0aW9uS2luZCwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCWlzT0sgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gaXNPSzsKLQl9Ci0KLQlVUklSZXNvbHZlciBjcmVhdGVVUklSZXNvbHZlcihJVGV4dEZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCUlQYXRoIGxvY2F0aW9uID0gYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCUlGaWxlIHdvcmtzcGFjZUZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCVVSSVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLQkJaWYgKHdvcmtzcGFjZUZpbGUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZUZpbGUuZ2V0UHJvamVjdCgpOwotCQkJcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXIpIHByb2plY3QuZ2V0QWRhcHRlcihVUklSZXNvbHZlci5jbGFzcyk7Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCXJlc29sdmVyID0gbmV3IENvbW1vblVSSVJlc29sdmVyKHdvcmtzcGFjZUZpbGUpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJCWlmICh3b3Jrc3BhY2VGaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IHdvcmtzcGFjZUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsICYmIHdvcmtzcGFjZUZpbGUuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gd29ya3NwYWNlRmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoYmFzZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSB3b3Jrc3BhY2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXJlc29sdmVyLnNldEZpbGVCYXNlTG9jYXRpb24oYmFzZUxvY2F0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc29sdmVyID0gbmV3IEV4dGVybmFsVVJJUmVzb2x2ZXIobG9jYXRpb24pOwotCQl9Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQotCUlDb250ZW50VHlwZSBkZXRlY3RDb250ZW50VHlwZShJUGF0aCBsb2NhdGlvbikgewotCQlJQ29udGVudFR5cGUgdHlwZSA9IG51bGw7Ci0KLQkJSVJlc291cmNlIHJlc291cmNlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24obG9jYXRpb24pOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gT3B0aW1pemVkIGRlc2NyaXB0aW9uIGxvb2t1cCwgbWlnaHQgbm90IHN1Y2NlZWQKLQkJCQkJZCA9ICgoSUZpbGUpIHJlc291cmNlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQkJdHlwZSA9IGQuZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kIGZpbGUKLQkJCQkJLy8gdHlwZSBjaGVjayBhYm92ZQotCQkJCX0KLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBGaWxlQnVmZmVycy5nZXRTeXN0ZW1GaWxlQXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihpbnB1dCwgbG9jYXRpb24udG9PU1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKElDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogRGVyZWdpc3RlcnMgImludGVyZXN0IiBpbiBhIGRvY3VtZW50LCBvciByYXRoZXIgdGhlIGZpbGUgYnVmZmVyIHRoYXQKLQkgKiBiYWNrcyBpdC4gSW50ZW50aW9uYWxseSB1c2VkIHRvIGFsdGVyIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGZpbGUKLQkgKiBidWZmZXIgc28gdGhhdCBpdCBrbm93cyBpdCBjYW4gc2FmZWx5IGJlIGRpc3Bvc2VkIG9mLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmKCBpbmZvID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQlJUGF0aCBidWZmZXJMb2NhdGlvbiA9IGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCk7Ci0JCWJvb2xlYW4gaXNPSyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlidWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QoYnVmZmVyTG9jYXRpb24sIGluZm8ubG9jYXRpb25LaW5kLCBudWxsKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJaXNPSyA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBpc09LOwotCX0KLQotCXB1YmxpYyBJVGV4dEZpbGVCdWZmZXIgZ2V0QnVmZmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgZ2V0IGEgYnVmZmVyIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkKLQkJCXJldHVybiBpbmZvLmJ1ZmZlcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JU3RyaW5nIGdldENvbnRlbnRUeXBlSUQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpCi0JCQlyZXR1cm4gaW5mby5jb250ZW50VHlwZUlEOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBnZXQvY3JlYXRlIGEgbW9kZWwgd2l0aG91dCBhIGphdmEuaW8uRmlsZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBidWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgY29ubmVjdGluZyB0byBGaWxlICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1ZmZlck1hbmFnZXIuY29ubmVjdChsb2NhdGlvbiwgTG9jYXRpb25LaW5kLkxPQ0FUSU9OLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gYnVmZmVyTWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihsb2NhdGlvbiwgTG9jYXRpb25LaW5kLkxPQ0FUSU9OKTsKLQkJCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChidWZmZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkvKgotCQkJCQkgKiBOb3RlOiAiaW5mbyIgYmVpbmcgbnVsbCBhdCB0aGlzIHBvaW50IGlzIGEgc2xpZ2h0Ci0JCQkJCSAqIGVycm9yLgotCQkJCQkgKiAKLQkJCQkJICogVGhlIGNvbm5lY3QgY2FsbCBmcm9tIGFib3ZlIChvciBhdCBzb21lIHRpbWUgZWFybGllciBpbgotCQkJCQkgKiB0aGUgc2Vzc2lvbikgd291bGQgaGF2ZSBub3RpZmllZCB0aGUgRmlsZUJ1ZmZlck1hcHBlcgotCQkJCQkgKiBvZiB0aGUgY3JlYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgdGV4dCBidWZmZXIgYW5kCi0JCQkJCSAqIGNyZWF0ZWQgdGhlIERvY3VtZW50SW5mbyBvYmplY3QgZm9yCi0JCQkJCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRzLgotCQkJCQkgKi8KLQkJCQkJaW5mby5sb2NhdGlvbktpbmQgPSBMb2NhdGlvbktpbmQuTE9DQVRJT047Ci0JCQkJCWluZm8uc2VsZkNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogQ2hlY2sgdGhlIGRvY3VtZW50IHR5cGUuIEFsdGhvdWdoIHJldHVybmluZyBudWxsIGZvcgotCQkJCSAqIHVua25vd24gZG9jdW1lbnRzIHdvdWxkIGJlIGZhaXIsIHRyeSB0byBnZXQgYSBtb2RlbCBpZgotCQkJCSAqIHRoZSBkb2N1bWVudCBpcyBhdCBsZWFzdCBhIHZhbGlkIHR5cGUuCi0JCQkJICovCi0JCQkJSURvY3VtZW50IGJ1ZmZlckRvY3VtZW50ID0gYnVmZmVyLmdldERvY3VtZW50KCk7Ci0JCQkJaWYgKGJ1ZmZlckRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsKChJU3RydWN0dXJlZERvY3VtZW50KSBidWZmZXJEb2N1bWVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiAxOTA3NjggLSBRdWljayBkaWZmIG1hcmtzIGRvIG5vdCBkaXNhcHBlYXIgaW4gdGhlCi0JCQkJCSAqIHZlcnRpY2FsIHJ1bGVyIG9mIEphdmFTY3JpcHQgZWRpdG9yIGFuZAotCQkJCQkgKiAKLQkJCQkJICogMTkzODA1IC0gQ2hhbmdlcyBhcmUgbm90IHRocm93biBhd2F5IHdoZW4gY2xvc2UKLQkJCQkJICogd2l0aCBubyBzYXZlIGZvciBmaWxlcyB3aXRoIG5vIHN0cnVjdHVyZWQgbW9kZWwKLQkJCQkJICogYXNzb2NpYXRlZCB3aXRoIHRoZW0gKHRleHQgZmlsZXMsIGphdmFzY3JpcHQgZmlsZXMsCi0JCQkJCSAqIGV0YykgaW4gd2ViIHByb2plY3QKLQkJCQkJICovCi0JCQkJCWJ1ZmZlck1hbmFnZXIuZGlzY29ubmVjdChsb2NhdGlvbiwgTG9jYXRpb25LaW5kLklGSUxFLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIGdldHRpbmcgbW9kZWwgZm9yICIgKyBmaWxlLmdldFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBnZXQvY3JlYXRlIGEgbW9kZWwgd2l0aG91dCBhbiBJRmlsZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBidWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBjb25uZWN0aW5nIHRvIElGaWxlICIgKyBmaWxlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBzZWUgVGV4dEZpbGVEb2N1bWVudFByb3ZpZGVyI2NyZWF0ZUZpbGVJbmZvIGFib3V0IHdoeSB3ZSB1c2UKLQkJCS8vIElGaWxlI2dldEZ1bGxQYXRoCi0JCQkvLyBoZXJlLCBub3QgSUZpbGUjZ2V0TG9jYXRpb24uCi0JCQlJUGF0aCBsb2NhdGlvbiA9IGZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyTWFuYWdlci5jb25uZWN0KGxvY2F0aW9uLCBMb2NhdGlvbktpbmQuSUZJTEUsIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gYnVmZmVyTWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihsb2NhdGlvbiwgTG9jYXRpb25LaW5kLklGSUxFKTsKLQkJCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIE5vdGU6ICJpbmZvIiBiZWluZyBudWxsIGF0IHRoaXMgcG9pbnQgaXMgYSBzbGlnaHQKLQkJCQkJCSAqIGVycm9yLgotCQkJCQkJICogCi0JCQkJCQkgKiBUaGUgY29ubmVjdCBjYWxsIGZyb20gYWJvdmUgKG9yIGF0IHNvbWUgdGltZQotCQkJCQkJICogZWFybGllciBpbiB0aGUgc2Vzc2lvbikgd291bGQgaGF2ZSBub3RpZmllZCB0aGUKLQkJCQkJCSAqIEZpbGVCdWZmZXJNYXBwZXIgb2YgdGhlIGNyZWF0aW9uIG9mIHRoZQotCQkJCQkJICogY29ycmVzcG9uZGluZyB0ZXh0IGJ1ZmZlciBhbmQgY3JlYXRlZCB0aGUKLQkJCQkJCSAqIERvY3VtZW50SW5mbyBvYmplY3QgZm9yIElTdHJ1Y3R1cmVkRG9jdW1lbnRzLgotCQkJCQkJICovCi0JCQkJCQlpbmZvLnNlbGZDb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJaW5mby5sb2NhdGlvbktpbmQgPSBMb2NhdGlvbktpbmQuSUZJTEU7Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogQ2hlY2sgdGhlIGRvY3VtZW50IHR5cGUuIEFsdGhvdWdoIHJldHVybmluZyBudWxsIGZvcgotCQkJCQkgKiB1bmtub3duIGRvY3VtZW50cyB3b3VsZCBiZSBmYWlyLCB0cnkgdG8gZ2V0IGEgbW9kZWwgaWYKLQkJCQkJICogdGhlIGRvY3VtZW50IGlzIGF0IGxlYXN0IGEgdmFsaWQgdHlwZS4KLQkJCQkJICovCi0JCQkJCUlEb2N1bWVudCBidWZmZXJEb2N1bWVudCA9IGJ1ZmZlci5nZXREb2N1bWVudCgpOwotCQkJCQlpZiAoYnVmZmVyRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCQltb2RlbCA9IGdldE1vZGVsKChJU3RydWN0dXJlZERvY3VtZW50KSBidWZmZXJEb2N1bWVudCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvKgotCQkJCQkJICogMTkwNzY4IC0gUXVpY2sgZGlmZiBtYXJrcyBkbyBub3QgZGlzYXBwZWFyIGluIHRoZQotCQkJCQkJICogdmVydGljYWwgcnVsZXIgb2YgSmF2YVNjcmlwdCBlZGl0b3IgYW5kCi0JCQkJCQkgKiAKLQkJCQkJCSAqIDE5MzgwNSAtIENoYW5nZXMgYXJlIG5vdCB0aHJvd24gYXdheSB3aGVuIGNsb3NlCi0JCQkJCQkgKiB3aXRoIG5vIHNhdmUgZm9yIGZpbGVzIHdpdGggbm8gc3RydWN0dXJlZCBtb2RlbAotCQkJCQkJICogYXNzb2NpYXRlZCB3aXRoIHRoZW0gKHRleHQgZmlsZXMsIGphdmFzY3JpcHQgZmlsZXMsCi0JCQkJCQkgKiBldGMpIGluIHdlYiBwcm9qZWN0Ci0JCQkJCQkgKi8KLQkJCQkJCWJ1ZmZlck1hbmFnZXIuZGlzY29ubmVjdChsb2NhdGlvbiwgTG9jYXRpb25LaW5kLklGSUxFLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3IgZ2V0dGluZyBtb2RlbCBmb3IgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgZ2V0L2NyZWF0ZSBhIG1vZGVsIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLm1vZGVsID09IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGNyZWF0aW5nIG1vZGVsIGZvciAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIGluZm8uYnVmZmVyLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWluZm8ubW9kZWxSZWZlcmVuY2VDb3VudCsrOwotCi0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoaW5mby5jb250ZW50VHlwZUlEKTsKLQkJCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCQltb2RlbCA9IGxvYWRlci5jcmVhdGVNb2RlbChkb2N1bWVudCwgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCBoYW5kbGVyKTsKLQkJCXRyeSB7Ci0JCQkJaW5mby5tb2RlbCA9IG1vZGVsOwotCQkJCW1vZGVsLnNldElkKGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQkJLy8gaGFuZGxlciBub3cgc2V0IGJ5IGxvYWRlciwgZm9yIG5vdwotCQkJCS8vIG1vZGVsLnNldE1vZGVsSGFuZGxlcihoYW5kbGVyKTsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgewotCQkJCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBtb2RlbCkuc2V0Q29udGVudFR5cGVJZGVudGlmaWVyKGluZm8uY29udGVudFR5cGVJRCk7Ci0JCQkJfQotCQkJCW1vZGVsLnNldFJlc29sdmVyKGNyZWF0ZVVSSVJlc29sdmVyKGdldEJ1ZmZlcihkb2N1bWVudCkpKTsKLQkJCQlpZiAoaW5mby5idWZmZXIuaXNEaXJ0eSgpKSB7Ci0JCQkJCW1vZGVsLnNldERpcnR5U3RhdGUodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImF0dGVtcHRlZCB0byBjcmVhdGUgbmV3IG1vZGVsIHdpdGggZXhpc3RpbmcgSUQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1vZGVsID0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW5mby5tb2RlbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFeGlzdGluZ0J1ZmZlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGNoZWNrIGZvciBhbiBleGlzdGluZyBidWZmZXIgd2l0aG91dCBhIGRvY3VtZW50IHJlZmVyZW5jZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJcmV0dXJuIGluZm8gIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlTW9kZWwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCByZWxlYXNlIGEgbW9kZWwgd2l0aG91dCBhIGRvY3VtZW50IHJlZmVyZW5jZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIG5vdGljZWQgZnVsbCByZWxlYXNlIG9mIG1vZGVsIGZvciAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIGluZm8uYnVmZmVyLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWluZm8ubW9kZWwgPSBudWxsOwotCQkJaW5mby5tb2RlbFJlZmVyZW5jZUNvdW50LS07Ci0JCQlpZiAoaW5mby5zZWxmQ29ubmVjdGVkKSB7Ci0JCQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGRpc2Nvbm5lY3RpbmcgZnJvbSAiICsgaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKSArICIgIiArIGluZm8uYnVmZmVyLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJSVBhdGggbG9jYXRpb24gPSBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpOwotCQkJCXRyeSB7Ci0JCQkJCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmRpc2Nvbm5lY3QobG9jYXRpb24sIGluZm8ubG9jYXRpb25LaW5kLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3IgcmVsZWFzaW5nIG1vZGVsIGZvciAiICsgbG9jYXRpb24sIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmV2ZXJ0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgcmVsZWFzZSBhIG1vZGVsIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybjsKLQkJfQotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgd2FzIGFza2VkIHRvIHJldmVydCBhIGRvY3VtZW50IGJ1dCB3YXMgbm90IGJlaW5nIG1hbmFnZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJLy8gZ2V0IHBhdGgganVzdCBmb3IgcG90ZW50aWFsIGVycm9yIG1lc3NhZ2UKLQkJCUlQYXRoIGxvY2F0aW9uID0gaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJLy8gSVNTVUU6IGluIGZ1dHVyZSwgY2xpZW50cyBzaG91bGQgcHJvdmlkZSBwcm9ncmVzcyBtb25pdG9yCi0JCQkJaW5mby5idWZmZXIucmV2ZXJ0KGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJU1NVRTogc2hvdWRsIHdlIG5vdCBiZSByZS10aHJvd2luZyBDb3JlRXhjZXB0aW9ucz8gT3IKLQkJCQkvLyBub3QgY2F0Y2ggdGhlbSBhdCBhbGw/Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3IgcmV2ZXJ0aW5nIG1vZGVsIGZvciAiICsgbG9jYXRpb24sIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lFeGVjdXRpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JRXhlY3V0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3ZWI2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lFeGVjdXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4ZWN1dGlvbkRlbGVnYXRlIHsKLQotCXZvaWQgZXhlY3V0ZShSdW5uYWJsZSBydW5uYWJsZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lMb2NrYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JTG9ja2FibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhYTUwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lMb2NrYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci0KLS8qKgotICogCi0gKiBOb3QgQVBJOiBub3QgdG8gYmUgdXNlZCBvciBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiBUaGlzIGlzIGEgc3BlY2lhbAotICogcHVycG9zZSBpbnRlcmZhY2UgdG8gaGVscCBndWFyZCBzb21lIHRocmVhZGluZyBpc3N1ZXMgYmV0d2VlZW4gbW9kZWwgYW5kCi0gKiBkb2N1bWVudC4gV2lsbCBiZSBjaGFuZ2VkIHNvb24uCi0gKiAgCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJTG9ja2FibGUgewotCi0JSUxvY2sgZ2V0TG9ja09iamVjdCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0pTUEF3YXJlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSlNQQXdhcmVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWUyMjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSlNQQXdhcmVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLQotcHVibGljIGludGVyZmFjZSBKU1BBd2FyZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQl2b2lkIGluaXRpYWxpemVXaXRoKEVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRDb250ZW50VHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxOWRkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogdHJ1ZSBpZiBib3RoIHBsYXRmb3JtIGFuZCB0aGlzIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFBsYXRmb3JtLmluRGVidWdNb2RlKCkgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kZWJ1ZyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgYWRhcHRlcgotCSAqIG5vdGlmaWNhdGlvbiB0aW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0FEQVBURVJOT1RJRklDQVRJT05USU1FID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgc3RydWN0dXJlZAotCSAqIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0RPQ1VNRU5UID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkZG9jdW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIGZpbGUgYnVmZmVyCi0JICogbW9kZWwgbWFuYWdlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9maWxlYnVmZmVycy9tb2RlbG1hbmFnZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIGZvcm1hdHRpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRk9STUFUID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9mb3JtYXQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRleHQgYnVmZmVyCi0JICogbGlmZWN5Y2xlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL2xpZmVjeWNsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgbW9kZWwKLQkgKiBsaWZlY3ljbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfTElGRUNZQ0xFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbGlmZWN5Y2xlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyBtb2RlbCBzdGF0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19NT0RFTFNUQVRFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvc3RhdGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIG1vZGVsIGxvY2sKLQkgKiBzdGF0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19NT0RFTExPQ0sgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9sb2NrcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgbW9kZWwKLQkgKiBtYW5hZ2VyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX01PREVMTUFOQUdFUiA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZG1vZGVsL21vZGVsbWFuYWdlciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RBU0tTID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogY29udGVudCB0eXBlIGRldGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLU0NPTlRFTlRUWVBFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9kZXRlY3Rpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIGpvYnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NKT0IgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2pvYiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogb3ZlcmFsbCBwZXJmb3JtYW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLU09WRVJBTExQRVJGID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9vdmVyYWxsdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NQRVJGID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy90aW1lIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyB0YXNrIHRhZ3MKLQkgKiBwcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLU1BSRUZTID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9wcmVmZXJlbmNlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogcmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NSRUdJU1RSWSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcmVnaXN0cnkiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoKLQkgKiBLZWVwIG91ciBvd24gY29weSBpbiBjYXNlIHdlIHdhbnQgdG8gYWRkIG90aGVyIHNldmVyaXR5IGxldmVscwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKGxldmVsLCBQTFVHSU5fSUQsIGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgbWVzc2FnZSB0byB0aGUgbG9nIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5IGxldmVsCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBFUlJPUiwgV0FSTklORywgSU5GTywgT0sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBhZGQgdG8gdGhlIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgYSBtZXNzYWdlIGFuZCBleGNlcHRpb24gdG8gdGhlIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgRVJST1IsIFdBUk5JTkcsIElORk8sIE9LCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdG8gYWRkIHRvIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIGV4Y2VwdGlvbiBhcyBhbiBlcnJvciBpbiB0aGUgbG9nIGFsb25nIHdpdGggYW4gYWNjb21wYW55aW5nCi0JICogbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRvIGFkZCB0byB0aGUgbG9nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBleGNlcHRpb24gYXMgYW4gZXJyb3IgaW4gdGhlIGxvZwotCSAqIAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0byBhZGQgdG8gdGhlIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKElTdGF0dXMuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Nb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Nb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjkwMjVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlciByZWFkZXIgPSBudWxsOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChyZWFkZXIgPT0gbnVsbCkgewotCQkJcmVhZGVyID0gbmV3IE1vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQURBUFRFUktFWSA9ICJhZGFwdGVyS2V5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9DT05URU5UVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9SRUdJU1RFUkFEQVBURVIgPSAicmVnaXN0ZXJBZGFwdGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImFkYXB0T25DcmVhdGVGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiQWRhcHRPbkNyZWF0ZUZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBYTUxFZGl0b3JQbHVnaW5SZWdpc3RyeVJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoSURvY3VtZW50VHlwZUhhbmRsZXIgaGFuZGxlcikgewotCQlyZXR1cm4gbG9hZFJlZ2lzdHJ5KGhhbmRsZXIuZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBsb2FkUmVnaXN0cnkodHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlckZhY3RvcnkgbG9hZEZhY3RvcnlGcm9tQ29uZmlndXJhdGlvbkVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIE9iamVjdCByZXF1ZXN0ZXJUeXBlKSB7Ci0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlTdHJpbmcgY29udGVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NPTlRFTlRUWVBFKTsKLQkJCWlmICghY29udGVudFR5cGUuZXF1YWxzKHJlcXVlc3RlclR5cGUpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQ0xBU1MpOwotCQkJU3RyaW5nIGFkYXB0ZXJLZXlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQURBUFRFUktFWSk7Ci0JCQlTdHJpbmcgcmVnaXN0ZXJBZGFwdGVycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfUkVHSVNURVJBREFQVEVSKTsKLQotCQkJLy8gaWYgY2xhc3NOYW1lIGlzIG51bGwsIHRoZW4gbm8gb25lIGRlZmluZWQgdGhlIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gZm9yIGFkYXB0ZXIgZmFjdG9yaWVzCi0JCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKG5hbWUpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gaWYgYW4gZXJyb3Igb2NjdXJzIGhlcmUsIGl0cyBwcm9iYWJseSB0aGF0IHRoZSBwbHVnaW4KLQkJCQkJLy8gY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZAotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBidW5kbGU6ICIgKyBuYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfQotCQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIHVzZUV4dGVuZGVkQ29uc3RydWN0b3IgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBkb1JlZ2lzdGVyQWRhcHRlcnMgPSBmYWxzZTsKLQkJCQkJT2JqZWN0IGFkYXB0ZXJLZXkgPSBudWxsOwotCi0JCQkJCWlmIChyZWdpc3RlckFkYXB0ZXJzICE9IG51bGwgJiYgcmVnaXN0ZXJBZGFwdGVycy5sZW5ndGgoKSA+IDAgJiYgQm9vbGVhbi52YWx1ZU9mKHJlZ2lzdGVyQWRhcHRlcnMpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlkb1JlZ2lzdGVyQWRhcHRlcnMgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmIChhZGFwdGVyS2V5Q2xhc3MgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlDbGFzcyBhQ2xhc3MgPSBudWxsOwotCQkJCQkJCS8vIGFDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPwotCQkJCQkJCS8vIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhhZGFwdGVyS2V5Q2xhc3MpIDoKLQkJCQkJCQkvLyBDbGFzcy5mb3JOYW1lKGFkYXB0ZXJLZXlDbGFzcyk7Ci0JCQkJCQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5VTklOU1RBTExFRCkgewotCQkJCQkJCQlhQ2xhc3MgPSBidW5kbGUubG9hZENsYXNzKGFkYXB0ZXJLZXlDbGFzcyk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlhQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGFkYXB0ZXJLZXlDbGFzcyk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChhQ2xhc3MgIT0gbnVsbCkgewotCQkJCQkJCQl1c2VFeHRlbmRlZENvbnN0cnVjdG9yID0gdHJ1ZTsKLQkJCQkJCQkJYWRhcHRlcktleSA9IGFDbGFzczsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWFkYXB0ZXJLZXkgPSBhZGFwdGVyS2V5Q2xhc3M7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBhbnlFcnJvcnMpIHsKLQkJCQkJCQlhZGFwdGVyS2V5ID0gYWRhcHRlcktleUNsYXNzOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCUNsYXNzIHRoZUNsYXNzID0gbnVsbDsKLQkJCQkJCS8vIENsYXNzIHRoZUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/Ci0JCQkJCQkvLyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSA6Ci0JCQkJCQkvLyBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQkJCQlpZiAoYnVuZGxlLmdldFN0YXRlKCkgIT0gQnVuZGxlLlVOSU5TVEFMTEVEKSB7Ci0JCQkJCQkJdGhlQ2xhc3MgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl0aGVDbGFzcyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh1c2VFeHRlbmRlZENvbnN0cnVjdG9yKSB7Ci0JCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3JbXSBjdG9ycyA9IHRoZUNsYXNzLmdldENvbnN0cnVjdG9ycygpOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3RvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJQ2xhc3NbXSBwYXJhbVR5cGVzID0gY3RvcnNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCQkJCQkJaWYgKGN0b3JzW2ldLmlzQWNjZXNzaWJsZSgpICYmIHBhcmFtVHlwZXMubGVuZ3RoID09IDIgJiYgcGFyYW1UeXBlc1swXS5lcXVhbHMoT2JqZWN0LmNsYXNzKSAmJiBwYXJhbVR5cGVzWzFdLmVxdWFscyhib29sZWFuLmNsYXNzKSkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGN0b3JzW2ldLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXthZGFwdGVyS2V5LCBuZXcgQm9vbGVhbihkb1JlZ2lzdGVyQWRhcHRlcnMpfSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbgotCQkJCQkJCQkJCS8vIG5vdCB0bwotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24KLQkJCQkJCQkJCQkvLyBub3QgdG8KLQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbgotCQkJCQkJCQkJCS8vIG5vdCB0bwotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uCi0JCQkJCQkJCQkJLy8gbm90IHRvCi0JCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBlKSB7Ci0JCQkJCQkJCQkJLy8gbG9nIG9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uCi0JCQkJCQkJCQkJLy8gbm90IHRvCi0JCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQkJCWZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfQ0xBU1MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGxvZyBvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgbG9hZFJlZ2lzdHJ5KE9iamVjdCBjb250ZW50VHlwZSkgewotCQlMaXN0IGZhY3RvcnlMaXN0ID0gbmV3IFZlY3RvcigpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChTU0VDb3JlUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBsb2FkRmFjdG9yeUZyb21Db25maWd1cmF0aW9uRWxlbWVudChlbGVtZW50c1tpXSwgY29udGVudFR5cGUpOwotCQkJCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQkJCWZhY3RvcnlMaXN0LmFkZChmYWN0b3J5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeUxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Ob0NhbmNlbFByb2dyZXNzTW9uaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Ob0NhbmNlbFByb2dyZXNzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWYxMjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm9DYW5jZWxQcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgTm9DYW5jZWxQcm9ncmVzc01vbml0b3IgZXh0ZW5kcyBOdWxsUHJvZ3Jlc3NNb25pdG9yIHsKLQotCi0JcHVibGljIE5vQ2FuY2VsUHJvZ3Jlc3NNb25pdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTBiOTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi0KLXB1YmxpYyBjbGFzcyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlwdWJsaWMgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQl9Ci0KLQlwdWJsaWMgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKGNhdXNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL051bGxNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL051bGxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTQzMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gRW5jb2RpbmdNZW1lbnRvIChpdHMgc3VwZXIgY2xhc3MpLAotICogd2hlbiB0aGVyZSBpcyBub3QgaW4gZmFjdCBBTlkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB3aGVuIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBTdHJpbmcKLSAqLwotcHVibGljIGNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIE51bGxNZW1lbnRvKCkgewotCQlzdXBlcigpOwotCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldEFwcHJvcHJpYXRlRGVmYXVsdChkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Qcm9wYWdhdGluZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAxYzQ4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotcHVibGljIGludGVyZmFjZSBQcm9wYWdhdGluZ0FkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0Jdm9pZCBhZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpOwotCi0JTGlzdCBnZXRBZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGFkZGluZyBhIGZhY3RvcnksCi0JICogdHlwaWNhbGx5IG9uIHRoZSBkb2N1bWVudCAodG9wIGxldmVsKSBub2RlLCBzbyBhbGwgbm9kZXMgY2FuIGJlCi0JICogYWRhcHRlZCwgaWYgbmVlZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhvc2Ugb2NjYXNpb25zIHdoZW4gYSBmYWN0b3J5Ci0JICogaXMgYWRkZWRlZCBhZnRlciBzb21lIG5vZGVzIG1heSBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIGF0IHRoZSB0aW1lCi0JICogdGhlIGZhY3RvcnkgaXMgYWRkZWQuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplRm9yRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIElOb2RlTm90aWZpZXIgbm9kZSk7Ci0KLQkvLyBkbXc6IHNob3VsZCBoYXZlIGdldEZhY3RvcnlGb3I/Ci0Jdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGM4NGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCXZvaWQgYWRkQ29udHJpYnV0ZWRGYWN0b3JpZXMoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KTsKLQotCXZvaWQgc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMoQXJyYXlMaXN0IGxpc3QpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmZDFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgU1NFIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTU0VDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFNTRUNvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTU0VDb3JlTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQV9tb2RlbF9zX2lkX2Nhbl9ub3RfYmVfbnVfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ncmFtX0Vycm9yX19Nb2RlbE1hbmFnZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yaWdpbmFsX0Vycm9yX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dF9DaGFuZ2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tTY2FubmVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1NjYW5uaW5nSm9iXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1NjYW5uaW5nSm9iXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlncmF0ZV9DaGFyc2V0OwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0ZThmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBTU0UgQ29yZSBQbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBTU0VDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlzdGF0aWMgU1NFQ29yZVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFNTRUNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBTU0VDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGRlZmF1bHQgbm9uLVVJCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJLy8gc2V0IG1vZGVsIHByZWZlcmVuY2UgZGVmYXVsdHMKLQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlVTRV8zQllURV9CT01fV0lUSF9VVEY4LCBmYWxzZSk7Ci0JCQotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UpOwotCQlwcmVmcy5zZXREZWZhdWx0KENvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLlRBU0tfVEFHX1RBR1MsICJUT0RPLEZJWE1FLFhYWCIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFTS19UQUdfUFJJT1JJVElFUywgIjEsMiwxIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLnNodXRkb3duKCk7Ci0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJLy8gaW5pdGlhbGl6ZSBGaWxlQnVmZmVyIGhhbmRsaW5nCi0JCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuc3RhcnR1cCgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCSAqLwotCXB1YmxpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmMDFmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQV9tb2RlbF9zX2lkX2Nhbl9ub3RfYmVfbnVfRVhDXz1BIG1vZGVsJ3MgaWQgY2FuIG5vdCBiZSBudWxsCi1Qcm9ncmFtX0Vycm9yX19Nb2RlbE1hbmFnZV9FWENfPVByb2dyYW0gRXJyb3I6IE1vZGVsTWFuYWdlckltcGw6OnNhdmVNb2RlbC4gTW9kZWwgc2hvdWxkIGJlIGluIHRoZSBjYWNoZQotT3JpZ2luYWxfRXJyb3JfX1VJXz1PcmlnaW5hbCBFcnJvcjoKLVRleHRfQ2hhbmdlX1VJXz1UZXh0IENoYW5nZQotVGFza1NjYW5uZXJfMD1TY2FubmluZyBmb3IgVGFza3MKLVRhc2tTY2FubmluZ0pvYl8wPVNjYW5uaW5nCi1UYXNrU2Nhbm5pbmdKb2JfMT1FcnJvcnMgd2hpbGUgZGV0ZWN0aW5nIFRhc2tzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1NaWdyYXRlX0NoYXJzZXQ9TWlncmF0ZSBDaGFyc2V0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUyNWQ1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgaW1wbGVtZW50cyBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMgPSB0cnVlOyAvLyBzcGVjaWFsIGZsYWcgZm9yIEpVbml0Ci0KLQkvLyB0ZXN0cyB0byBza2lwIHJlZnJlc2gKLQkvLyBvZiBjbGVhbnVwIHByZWZlcmVuY2VzCi0JLy8gd2hlbiBpdCdzIHNldCB0byBmYWxzZQotCi0JcHVibGljIFN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArIGdldENvbnRlbnRUeXBlKCk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCAwLCBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9IGZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgaW5wdXQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCWlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCJVVEY4IikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaWQgPSBpbnB1dFN0cmVhbS50b1N0cmluZygpICsgZ2V0Q29udGVudFR5cGUoKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9IGZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQotCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHN0YXJ0ID49IDAgJiYgbGVuZ3RoID49IDAgJiYgc3RhcnQgKyBsZW5ndGggPD0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJCS8vIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmCi0JCQkJLy8gbW9kZWwgY2hhbmdlZC4KLQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJCS8vIGNsZWFudXAKLQkJCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cEZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIDAsIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vIG91dHB1dFN0cmVhbSA9IG5ldwotCQkJLy8gRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZShmaWxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZShJRmlsZSBmaWxlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJLy8gc2F2ZSBvdXRwdXQgdG8gZmlsZQotCQkJLy8gb3V0cHV0U3RyZWFtID0gbmV3Ci0JCQkvLyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKGZpbGUpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGVOYW1lLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIDAsIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCS8vIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHNhdmUgb3V0cHV0IHRvIGZpbGUKLQkJCS8vIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsKLQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlpZiAoKHN0YXJ0ID49IDApICYmIChsZW5ndGggPD0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKSkgewotCQkJCVZlY3RvciBhY3RpdmVOb2RlcyA9IGdldEFjdGl2ZU5vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQkJaWYgKGFjdGl2ZU5vZGVzLnNpemUoKSA+IDApIHsKLQkJCQkJTm9kZSBmaXJzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMuZmlyc3RFbGVtZW50KCk7Ci0JCQkJCU5vZGUgbGFzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMubGFzdEVsZW1lbnQoKTsKLQkJCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQkJCU5vZGUgZWFjaE5vZGUgPSBmaXJzdE5vZGU7Ci0JCQkJCU5vZGUgbmV4dE5vZGUgPSBudWxsOwotCi0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM2MjEKLQkJCQkJLy8gaWYgZG9pbmcgYW55IHNvcnQgb2YgY2xlYW51cCwgc2V0IHVwIHJld3JpdGUgc2Vzc2lvbi9tb2RlbGNoYW5nZWQKLQkJCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBkb2NFeHQ0ID0gbnVsbDsKLQkJCQkJaWYgKHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjQpIHsKLQkJCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNCkgc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQl9Ci0JCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb24gcmV3cml0ZVNlc3Npb24gPSBudWxsOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQkvLyB3aGVuZXZlciBmb3JtYXR0aW5nIG1vZGVsLCBmaXJlCi0JCQkJCQkvLyBhYm91dHRvY2hhbmdlL21vZGVsY2hhbmdlZAotCQkJCQkJc3RydWN0dXJlZE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsIHx8IGRvY0V4dDQuZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKSAhPSBudWxsKSA/IG51bGwgOiBkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQotCQkJCQkJd2hpbGUgKCFkb25lKSB7Ci0JCQkJCQkJLy8gdXBkYXRlICJkb25lIgotCQkJCQkJCWRvbmUgPSAoZWFjaE5vZGUgPT0gbGFzdE5vZGUpOwotCi0JCQkJCQkvLyBnZXQgbmV4dCBzaWJsaW5nIGJlZm9yZSBjbGVhbnVwIGJlY2F1c2UgZWFjaE5vZGUKLQkJCQkJCQkvLyBtYXkKLQkJCQkJCQkvLyBiZSBkZWxldGVkLAotCQkJCQkJCS8vIGZvciBleGFtcGxlIHdoZW4gaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUKLQkJCQkJCQluZXh0Tm9kZSA9IGVhY2hOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQkJCQkvLyBjbGVhbnVwIHNlbGVjdGVkIG5vZGUocykKLQkJCQkJCQljbGVhbnVwTm9kZShlYWNoTm9kZSk7Ci0KLQkJCQkJCQkvLyB1cGRhdGUgZWFjaCBub2RlCi0JCQkJCQkJaWYgKG5leHROb2RlICE9IG51bGwgJiYgbmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpCi0JCQkJCQkJCS8vIG5leHROb2RlIGlzIGRlbGV0ZWQgZHVyaW5nIGNsZWFudXAKLQkJCQkJCQkJZWFjaE5vZGUgPSBlYWNoTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJZWFjaE5vZGUgPSBuZXh0Tm9kZTsKLQotCQkJCQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UKLQkJCQkJCQkvLyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHdpdGggZWFjaE5vZGUuCi0JCQkJCQkJLy8gV2UgZG9uJ3Qgd2FudCBhbiBpbmZpbml0ZSBsb29wIGhlcmUuCi0JCQkJCQkJaWYgKGVhY2hOb2RlID09IG51bGwpCi0JCQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJfQotCi0JCQkJCQkvLyBmb3JtYXQgc291cmNlCi0JCQkJCQlpZiAoZ2V0Rm9ybWF0U291cmNlUHJlZmVyZW5jZShzdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCQkJLy8gZm9ybWF0IHRoZSBkb2N1bWVudAotCQkJCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IGdldEZvcm1hdFByb2Nlc3NvcigpOwotCQkJCQkJCWZvcm1hdFByb2Nlc3Nvci5mb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJLy8gd2UgbmVlZCB0d28gZmluYWxseSdzLCBqdXN0IGluIGNhc2UgZmlyc3QgZmFpbHMKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKChkb2NFeHQ0ICE9IG51bGwpICYmIChyZXdyaXRlU2Vzc2lvbiAhPSBudWxsKSkKLQkJCQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJLy8gYWx3YXlzIG1ha2Ugc3VyZSB0byBmaXJlIGNoYW5nZWRtb2RlbCB3aGVuIGRvbmUKLQkJCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjbGVhbnVwTm9kZSA9IG5vZGU7Ci0KLQkJCS8vIGNsZWFudXAgdGhlIG93bmVyIG5vZGUgaWYgaXQncyBhbiBhdHRyaWJ1dGUgbm9kZQotCQkJaWYgKGNsZWFudXBOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQljbGVhbnVwTm9kZSA9ICgoQXR0cikgY2xlYW51cE5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCi0JCQkvLyByZWZyZXNoIGNsZWFudXAgcHJlZmVyZW5jZXMgYmVmb3JlIGdldHRpbmcgY2xlYW51cCBoYW5kbGVyCi0JCQlpZiAocmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcykKLQkJCQlyZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCS8vIGdldCBjbGVhbnVwIGhhbmRsZXIKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBnZXRDbGVhbnVwSGFuZGxlcihjbGVhbnVwTm9kZSk7Ci0JCQlpZiAoY2xlYW51cEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCS8vIGNsZWFudXAgZWFjaCBub2RlCi0JCQkJY2xlYW51cEhhbmRsZXIuY2xlYW51cChjbGVhbnVwTm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb252ZXJ0TGluZURlbGltaXRlcnMoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgbmV3RGVsaW1pdGVyKSB7Ci0JCWZpbmFsIGludCBsaW5lQ291bnQgPSBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCU1hcCBwYXJ0aXRpb25lcnMgPSBUZXh0VXRpbGl0aWVzLnJlbW92ZURvY3VtZW50UGFydGl0aW9uZXJzKGRvY3VtZW50KTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHsKLQkJCQlmaW5hbCBTdHJpbmcgZGVsaW1pdGVyID0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKTsKLQkJCQlpZiAoZGVsaW1pdGVyICE9IG51bGwgJiYgZGVsaW1pdGVyLmxlbmd0aCgpID4gMCAmJiAhZGVsaW1pdGVyLmVxdWFscyhuZXdEZWxpbWl0ZXIpKSB7Ci0JCQkJCUlSZWdpb24gcmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCQlkb2N1bWVudC5yZXBsYWNlKHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSwgZGVsaW1pdGVyLmxlbmd0aCgpLCBuZXdEZWxpbWl0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVRleHRVdGlsaXRpZXMuYWRkRG9jdW1lbnRQYXJ0aXRpb25lcnMoZG9jdW1lbnQsIHBhcnRpdGlvbmVycyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbnN1cmVDbG9zZWQoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdHJ5IHsKLQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsgLy8gaG9wZWxlc3MKLQkJfQotCQl0cnkgewotCQkJaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIGdldEFjdGl2ZU5vZGVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnROb2RlT2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVZlY3RvciBhY3RpdmVOb2RlcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCU5vZGUgc3RhcnROb2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCk7Ci0JCQlOb2RlIGVuZE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoKTsKLQotCQkJLy8gbWFrZSBzdXJlIGl0J3MgYW4gbm9uLWVtcHR5IGRvY3VtZW50Ci0JCQlpZiAoc3RhcnROb2RlICE9IG51bGwpIHsKLQkJCQl3aGlsZSAoaXNTaWJsaW5nT2Yoc3RhcnROb2RlLCBlbmROb2RlKSA9PSBmYWxzZSkgewotCQkJCQlpZiAoZW5kTm9kZSAhPSBudWxsKQotCQkJCQkJZW5kTm9kZSA9IGVuZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAoZW5kTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlzdGFydE5vZGUgPSBzdGFydE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJZW5kTm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJd2hpbGUgKHN0YXJ0Tm9kZSAhPSBlbmROb2RlKSB7Ci0JCQkJCWFjdGl2ZU5vZGVzLmFkZEVsZW1lbnQoc3RhcnROb2RlKTsKLQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCkKLQkJCQkJYWN0aXZlTm9kZXMuYWRkRWxlbWVudChzdGFydE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2ZU5vZGVzOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXNQcmVmZXJlbmNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJYm9vbGVhbiBjb252ZXJ0RU9MQ29kZXMgPSB0cnVlOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKDApKTsKLQkJaWYgKGNsZWFudXBIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBIYW5kbGVyLmdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCQkJY29udmVydEVPTENvZGVzID0gY2xlYW51cFByZWZlcmVuY2VzLmdldENvbnZlcnRFT0xDb2RlcygpOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFT0xDb2RlUHJlZmVyZW5jZShJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCUlTY29wZUNvbnRleHRbXSBzY29wZUNvbnRleHQgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCl9OwotCQlTdHJpbmcgZW9sQ29kZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBudWxsLCBzY29wZUNvbnRleHQpOwotCi0JCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBnZXRDbGVhbnVwSGFuZGxlcigoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oMCkpOwotCQlpZiAoY2xlYW51cEhhbmRsZXIgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgY2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cEhhbmRsZXIuZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCk7Ci0JCQllb2xDb2RlID0gY2xlYW51cFByZWZlcmVuY2VzLmdldEVPTENvZGUoKTsKLQkJfQotCQlyZXR1cm4gZW9sQ29kZTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRGb3JtYXRTb3VyY2VQcmVmZXJlbmNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJYm9vbGVhbiBmb3JtYXRTb3VyY2UgPSB0cnVlOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKDApKTsKLQkJaWYgKGNsZWFudXBIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBIYW5kbGVyLmdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCQkJZm9ybWF0U291cmNlID0gY2xlYW51cFByZWZlcmVuY2VzLmdldEZvcm1hdFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBmb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaWJsaW5nT2YoTm9kZSBub2RlLCBOb2RlIGVuZE5vZGUpIHsKLQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlOb2RlIHNpYmxpbmdOb2RlID0gbm9kZTsKLQkJCXdoaWxlIChzaWJsaW5nTm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNpYmxpbmdOb2RlID09IGVuZE5vZGUpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJc2libGluZ05vZGUgPSBzaWJsaW5nTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOTg5NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0JTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSk7Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCXZvaWQgc2V0Q2xlYW51cFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjUwNThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIHsKLQotCWludCBnZXRBdHRyTmFtZUNhc2UoKTsKLQotCWJvb2xlYW4gZ2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKCk7Ci0KLQlib29sZWFuIGdldENvbnZlcnRFT0xDb2RlcygpOwotCi0JU3RyaW5nIGdldEVPTENvZGUoKTsKLQotCWJvb2xlYW4gZ2V0Rm9ybWF0U291cmNlKCk7Ci0KLQlib29sZWFuIGdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0KLQlib29sZWFuIGdldEluc2VydFJlcXVpcmVkQXR0cnMoKTsKLQotCWJvb2xlYW4gZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0KLQlpbnQgZ2V0VGFnTmFtZUNhc2UoKTsKLQotCXZvaWQgc2V0QXR0ck5hbWVDYXNlKGludCBhdHRyTmFtZUNhc2UpOwotCi0Jdm9pZCBzZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MpOwotCi0Jdm9pZCBzZXRDb252ZXJ0RU9MQ29kZXMoYm9vbGVhbiBjb252ZXJ0RU9MQ29kZXMpOwotCi0Jdm9pZCBzZXRFT0xDb2RlKFN0cmluZyBFT0xDb2RlKTsKLQotCXZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKTsKLQotCXZvaWQgc2V0SW5zZXJ0TWlzc2luZ1RhZ3MoYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyk7Ci0KLQl2b2lkIHNldEluc2VydFJlcXVpcmVkQXR0cnMoYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzKTsKLQotCXZvaWQgc2V0UHJlZmVyZW5jZXMoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpOwotCi0Jdm9pZCBzZXRRdW90ZUF0dHJWYWx1ZXMoYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMpOwotCi0Jdm9pZCBzZXRUYWdOYW1lQ2FzZShpbnQgdGFnTmFtZUNhc2UpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2JjZTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbmQgcmVsYXRlZCBjbGFzc2VzIGFyZSAnaW50ZXJuYWwnIGFuZCBzaG91bGQgbm90IAotICogYmUgdHJlYXRlZCBhcyBBUEksIGV2ZW4gdGhvdWdoIHVzZWQgYWNyb3NzIGNvbXBvbmVudHMgaW4gV1RQLiAKLSAqIENvbnNpZGVyIGl0IGEgd29yayBpbiBwcm9ncmVzcy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciB7Ci0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIGlucHV0IHN0cmluZyBhcyBpbnB1dCwKLQkgKiBjcmVhdGVzIGFuIElucHV0U3RyZWFtIGZyb20gdGhlIGlucHV0IHN0cmluZywgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsCi0JICogb2YgdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQsIGNsZWFudXBzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZXR1cm5zCi0JICogdGhlIGNsZWFuZWQgdXAgaW5wdXQgc3RyaW5nLgotCSAqLwotCVN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIGlucHV0IHN0cmluZyBhcyBpbnB1dCwKLQkgKiBjcmVhdGVzIGFuIElucHV0U3RyZWFtIGZyb20gdGhlIGlucHV0IHN0cmluZywgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsCi0JICogb2YgdGhlIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQsIGNsZWFudXBzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kCi0JICogbGVuZ3RoLCB0aGVuIHJldHVybnMgdGhlIGNsZWFuZWQgdXAgaW5wdXQgc3RyaW5nLgotCSAqLwotCVN0cmluZyBjbGVhbnVwQ29udGVudChTdHJpbmcgY29udGVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gSURvY3VtZW50IGFzIGlucHV0LCBjcmVhdGVzCi0JICogYSB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElEb2N1bWVudCdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSB3aG9sZSBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuCi0JICovCi0Jdm9pZCBjbGVhbnVwRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gSURvY3VtZW50IGFzIGlucHV0LCBjcmVhdGVzCi0JICogYSB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElEb2N1bWVudCdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aCwgdGhlbiByZWxlYXNlcwotCSAqIHRoZSBtb2RlbC4KLQkgKi8KLQl2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIElGaWxlIGFzIGlucHV0LCBjcmVhdGVzIGEKLQkgKiB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElGaWxlJ3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIHdob2xlIG1vZGVsLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4gVGhlIElGaWxlCi0JICogaXMgdXBkYXRlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgaXMgcmVsZWFzZWQgaW4gdGhlCi0JICogbW9kZWwgbWFuYWdlci4KLQkgKi8KLQl2b2lkIGNsZWFudXBGaWxlKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBJRmlsZSBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRmlsZSdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGNsZWFudXBzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aCwgdGhlbiByZWxlYXNlcwotCSAqIHRoZSBtb2RlbC4gVGhlIElGaWxlIGlzIHVwZGF0ZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzCi0JICogcmVsZWFzZWQgaW4gdGhlIG1vZGVsIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwRmlsZShJRmlsZSBmaWxlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhIGZpbGUgbmFtZSBhcyBpbnB1dCxjcmVhdGVzIGFuCi0JICogSW5wdXRTdHJlYW0gZnJvbSB0aGUgZmlsZSwgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZQotCSAqIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGZpbGUgbmFtZSdzIGZpbGUgZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgd2hvbGUKLQkgKiBtb2RlbCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuIFRoZSBmaWxlIGlzIHVwZGF0ZWQgd2hlbiB0aGUgbGFzdAotCSAqIHJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgaXMgcmVsZWFzZWQgaW4gdGhlIG1vZGVsIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBmaWxlIG5hbWUgYXMgaW5wdXQsY3JlYXRlcyBhbgotCSAqIElucHV0U3RyZWFtIGZyb20gdGhlIGZpbGUsIGNyZWF0ZSBhIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUKLQkgKiBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmaWxlIG5hbWUncyBmaWxlIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIG1vZGVsCi0JICogd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGgsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLiBUaGUgZmlsZSBpcyB1cGRhdGVkCi0JICogd2hlbiB0aGUgbGFzdCByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGlzIHJlbGVhc2VkIGluIHRoZSBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY2xlYW51cEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBtb2RlbCBhcyBpbnB1dCwgYW5kIGNsZWFudXBzCi0JICogdGhlIHdob2xlIG1vZGVsLgotCSAqLwotCXZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKTsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhIG1vZGVsIGFzIGlucHV0LCBhbmQgY2xlYW51cHMKLQkgKiB0aGUgbW9kZWwgd2l0aGluIHN0YXJ0IGFuZCBsZW5ndGguCi0JICovCi0Jdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYSBub2RlIGFzIGlucHV0LCBhbmQgZm9ybWF0cwotCSAqIHRoZSBub2RlIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgotCSAqLwotCXZvaWQgY2xlYW51cE5vZGUoTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODM0NDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgewotCXByaXZhdGUgaW50IGZBdHRyTmFtZUNhc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3M7Ci0JcHJpdmF0ZSBib29sZWFuIGZDb252ZXJ0RU9MQ29kZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVPTENvZGU7Ci0JcHJpdmF0ZSBib29sZWFuIGZGb3JtYXRTb3VyY2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbnNlcnRNaXNzaW5nVGFnczsKLQlwcml2YXRlIGJvb2xlYW4gZkluc2VydFJlcXVpcmVkQXR0cnM7Ci0JLy9wcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZSA9IG51bGw7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBmUHJlZmVyZW5jZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUXVvdGVBdHRyVmFsdWVzOwotCi0JcHJpdmF0ZSBpbnQgZlRhZ05hbWVDYXNlOwotCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZBdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKCkgewotCi0JCXJldHVybiBmQ29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldENvbnZlcnRFT0xDb2RlcygpIHsKLQotCQlyZXR1cm4gZkNvbnZlcnRFT0xDb2RlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVPTENvZGUoKSB7Ci0KLQkJcmV0dXJuIGZFT0xDb2RlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEZvcm1hdFNvdXJjZSgpIHsKLQotCQlyZXR1cm4gZkZvcm1hdFNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnNlcnRNaXNzaW5nVGFncygpIHsKLQotCQlyZXR1cm4gZkluc2VydE1pc3NpbmdUYWdzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEluc2VydFJlcXVpcmVkQXR0cnMoKSB7Ci0KLQkJcmV0dXJuIGZJbnNlcnRSZXF1aXJlZEF0dHJzOwotCX0KLQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQotCQlpZiAoZlByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZQcmVmZXJlbmNlcyA9IFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRRdW90ZUF0dHJWYWx1ZXMoKSB7Ci0KLQkJcmV0dXJuIGZRdW90ZUF0dHJWYWx1ZXM7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQotCQlyZXR1cm4gZlRhZ05hbWVDYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJOYW1lQ2FzZShpbnQgYXR0ck5hbWVDYXNlKSB7Ci0KLQkJZkF0dHJOYW1lQ2FzZSA9IGF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MpIHsKLQotCQlmQ29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzID0gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRFT0xDb2Rlcyhib29sZWFuIGNvbnZlcnRFT0xDb2RlcykgewotCi0JCWZDb252ZXJ0RU9MQ29kZXMgPSBjb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RU9MQ29kZShTdHJpbmcgRU9MQ29kZSkgewotCi0JCWZFT0xDb2RlID0gRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpIHsKLQotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc2VydE1pc3NpbmdUYWdzKGJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQotCQlmSW5zZXJ0TWlzc2luZ1RhZ3MgPSBpbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRSZXF1aXJlZEF0dHJzKGJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycykgewotCi0JCWZJbnNlcnRSZXF1aXJlZEF0dHJzID0gaW5zZXJ0UmVxdWlyZWRBdHRyczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlcyhQcmVmZXJlbmNlcyBwcmVmcykgewotCi0JCWZQcmVmZXJlbmNlcyA9IHByZWZzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFF1b3RlQXR0clZhbHVlcyhib29sZWFuIHF1b3RlQXR0clZhbHVlcykgewotCi0JCWZRdW90ZUF0dHJWYWx1ZXMgPSBxdW90ZUF0dHJWYWx1ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFnTmFtZUNhc2UoaW50IHRhZ05hbWVDYXNlKSB7Ci0KLQkJZlRhZ05hbWVDYXNlID0gdGFnTmFtZUNhc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMDZjYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotcHVibGljIGludGVyZmFjZSBTdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyIHsKLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKFN0cmluZyBjb250ZW50VHlwZSk7Ci0KLQl2b2lkIHNldENsZWFudXBQcm9jZXNzb3IoSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IsIFN0cmluZyBjb250ZW50VHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2E2MjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlckltcGwgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyIHsKLQlwcm90ZWN0ZWQgTWFwIGZDbGVhbnVwUHJvY2Vzc29yczsKLQotCXB1YmxpYyBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcihTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZW50VHlwZSk7Ci0KLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29ycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIChJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IpIGZDbGVhbnVwUHJvY2Vzc29ycy5nZXQoY29udGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcm9jZXNzb3IoSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnRUeXBlKTsKLQotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3JzID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWlmIChmQ2xlYW51cFByb2Nlc3NvcnMgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29ycy5yZW1vdmUoY29udGVudFR5cGUpOwotCQllbHNlCi0JCQlmQ2xlYW51cFByb2Nlc3NvcnMucHV0KGNvbnRlbnRUeXBlLCBjbGVhbnVwUHJvY2Vzc29yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0RG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3REb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk5NTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3REb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkUmVhZGVyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYSBmaWxlIGFuZCBjcmVhdGVzIGFuIFN0cnVjdHVyZWQgTW9kZWwuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIGltcGxlbWVudHMgSURvY3VtZW50TG9hZGVyIHsKLQotCXByaXZhdGUgQ29kZWRSZWFkZXJDcmVhdG9yIGZDb2RlZFJlYWRlckNyZWF0b3I7Ci0JcHJvdGVjdGVkIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCS8vIHByaXZhdGUgYm9vbGVhbiBmUHJvcGVydGllc09idGFpbmVkOwotCi0JcHJvdGVjdGVkIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCXByb3RlY3RlZCBSZWFkZXIgZkZ1bGxQcmVwYXJlZFJlYWRlcjsKLQotCS8qKgotCSAqIEFic3RyYWN0TG9hZGVyIGNvbnN0cnVjdG9yIGFsc28gaW5pdGlhbGl6ZXMgZW5jb2RpbmcgY29udmVydGVyL21hcHBlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdERvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgY29udmVydExpbmVEZWxpbWl0ZXJzKFN0cmluZ0J1ZmZlciBhbGxUZXh0QnVmZmVyLCBTdHJpbmcgbGluZURlbGltaXRlclRvVXNlKSB7Ci0JCS8vIFRPRE86IGF2b2lkIHVzZSBvZiBTdHJpbmcgaW5zdGFuY2UKLQkJU3RyaW5nIGFsbFRleHQgPSBhbGxUZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JCUlEb2N1bWVudCB0ZW1wRG9jID0gbmV3IERvY3VtZW50KGFsbFRleHQpOwotCQlpZiAobGluZURlbGltaXRlclRvVXNlID09IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyVG9Vc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsaW5lQ291bnQgPSB0ZW1wRG9jLmdldE51bWJlck9mTGluZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gbGluZUluZm8gPSB0ZW1wRG9jLmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQlpbnQgbGluZVN0YXJ0T2Zmc2V0ID0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGxpbmVMZW5ndGggPSBsaW5lSW5mby5nZXRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZUVuZE9mZnNldCA9IGxpbmVTdGFydE9mZnNldCArIGxpbmVMZW5ndGg7Ci0JCQkJbmV3VGV4dC5hcHBlbmQoYWxsVGV4dC5zdWJzdHJpbmcobGluZVN0YXJ0T2Zmc2V0LCBsaW5lRW5kT2Zmc2V0KSk7Ci0JCQkJaWYgKChpIDwgbGluZUNvdW50IC0gMSkgJiYgKHRlbXBEb2MuZ2V0TGluZURlbGltaXRlcihpKSAhPSBudWxsKSkKLQkJCQkJbmV3VGV4dC5hcHBlbmQobGluZURlbGltaXRlclRvVXNlKTsKLQkJCX0KLQkJCWNhdGNoIChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCS8vIHNob3VsZCBmaXggdXAgdG8gZWl0aGVyIHRocm93IG5vdGhpbmcsIG9yIHRoZSByaWdodCB0aGluZywKLQkJCQkvLyBidXQKLQkJCQkvLyBpbiB0aGUgY291cnNlIG9mIHJlZmFjdG9yaW5nLCB0aGlzIHdhcyBlYXNpZXN0ICJxdWljayBmaXgiLgotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1RleHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgSUVuY29kZWREb2N1bWVudCwgdGhhdCBoYXMKLQkgKiBiZWVuIGluaXRpYWxpemVkIHdpdGggYXBwcm9wcmlhdGUgcGFyc2VyLiBGb3IgbWFueSBsb2FkZXJzLCB0aGUKLQkgKiAoZGVmYXVsdCkgcGFyc2VyIHVzZWQgaXMga25vd24gZm9yIGFueSBpbnB1dC4gRm9yIG90aGVycywgdGhlIGNvcnJlY3QKLQkgKiBwYXJzZXIgKGFuZCBpdHMgaW5pdGlhbGl6YXRpb24pIGlzIG5vcm1hbGx5IGRlcGVuZGVudCBvbiB0aGUgY29udGVudCBvZgotCSAqIHRoZSBmaWxlLiBUaGlzIG5vLWFyZ3VtZW50IG1ldGhvZCBzaG91bGQgYXNzdW1lICJlbXB0eSBpbnB1dCIgYW5kIHdvdWxkCi0JICogdGhlcmVmb3JlIHJldHVybiB0aGUgZGVmYXVsdCBwYXJzZXIgZm9yIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqLwotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBuZXdFbmNvZGVkRG9jdW1lbnQoKTsKLQkJLy8gTWFrZSBzdXJlIGV2ZXJ5IHN0cnVjdHVyZWREb2N1bWVudCBoYXMgYW4gRW5jb2RpbmcgTWVtZW50bywKLQkJLy8gd2hpY2ggaXMgdGhlIGRlZmF1bHQgb25lIGZvciAiZW1wdHkiIHN0cnVjdHVyZWREb2N1bWVudHMKLQkJU3RyaW5nIGNoYXJzZXQgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSk7Ci0JCVN0cmluZyBzcGVjRGVmYXVsdENoYXJzZXQgPSBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCwgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVULCBzcGVjRGVmYXVsdENoYXJzZXQpKTsKLQotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIobnVsbCk7Ci0JCWlmIChsaW5lRGVsaW1pdGVyICE9IG51bGwpCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihsaW5lRGVsaW1pdGVyKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBkZWZhdWx0UGFydGl0aW9uZXIgPSBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgewotCQkJKChJRG9jdW1lbnRFeHRlbnNpb24zKSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldERvY3VtZW50UGFydGl0aW9uZXIoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgZGVmYXVsdFBhcnRpdGlvbmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXREb2N1bWVudFBhcnRpdGlvbmVyKGRlZmF1bHRQYXJ0aXRpb25lcik7Ci0JCX0KLQkJZGVmYXVsdFBhcnRpdGlvbmVyLmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWJzdHJhY3QgdmVyc2lvbiBzaG91bGQgaGFuZGxlIG1vc3QgY2FzZXMsIGJ1dCB3b24ndCBpZgotCSAqIGNvbnRlbnRUeXBlIGlzIHNlbnNpdGl2ZSB0byBlbmNvZGluZywgYW5kL29yIGVtYmVkZGVkIHR5cGVzCi0JICovCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihpRmlsZSk7Ci0JCWlmIChsaW5lRGVsaW1pdGVyICE9IG51bGwpCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihsaW5lRGVsaW1pdGVyKTsKLQotCQl0cnkgewotCi0JCQlDb2RlZFJlYWRlckNyZWF0b3IgY3JlYXRvciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpOwotCQkJY3JlYXRvci5zZXQoaUZpbGUpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IGNyZWF0b3IuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGZFbmNvZGluZ01lbWVudG8pOwotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldENvZGVkUmVhZGVyKCk7Ci0KLQkJCXNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCwgZkZ1bGxQcmVwYXJlZFJlYWRlcik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoZkZ1bGxQcmVwYXJlZFJlYWRlciAhPSBudWxsKSB7Ci0JCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZW5hbWUsIGlucHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JfQotCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsICYmIGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgaGF2ZSBib3RoIG51bGwgZmlsZW5hbWUgYW5kIGlucHV0c3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb2RlZFJlYWRlckNyZWF0b3IgY29kZWRSZWFkZXJDcmVhdG9yID0gZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCk7Ci0JCXRyeSB7Ci0JCQljb2RlZFJlYWRlckNyZWF0b3Iuc2V0KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCQljb2RlZFJlYWRlckNyZWF0b3Iuc2V0RW5jb2RpbmdSdWxlKGVuY29kaW5nUnVsZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGNvZGVkUmVhZGVyQ3JlYXRvci5nZXRDb2RlZFJlYWRlcigpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldEVuY29kaW5nTWVtZW50byhmRW5jb2RpbmdNZW1lbnRvKTsKLQkJCXNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCwgZkZ1bGxQcmVwYXJlZFJlYWRlcik7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChmRnVsbFByZXBhcmVkUmVhZGVyICE9IG51bGwpIHsKLQkJCQlmRnVsbFByZXBhcmVkUmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXByaXZhdGUgaW50IGdldENoYXJQb3N0aW9uT2ZGYWlsdXJlKEJ1ZmZlcmVkUmVhZGVyIGlucHV0U3RyZWFtKSB7Ci0JCWludCBjaGFyUG9zaXRpb24gPSAxOwotCQlpbnQgY2hhclJlYWQgPSAtMTsKLQkJYm9vbGVhbiBlcnJvckZvdW5kID0gZmFsc2U7Ci0JCWRvIHsKLQkJCXRyeSB7Ci0JCQkJY2hhclJlYWQgPSBpbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCQkJY2hhclBvc2l0aW9uKys7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIHRoaXMgaXMgZXhwZWN0ZWQsIHNpbmNlIHdlJ3JlIGV4cGVjdGluZyBmYWlsdXJlLAotCQkJCS8vIHNvIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcuCi0JCQkJZXJyb3JGb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKCEoY2hhclJlYWQgPT0gLTEgfHwgZXJyb3JGb3VuZCkpOwotCi0JCWlmIChlcnJvckZvdW5kKQotCQkJLy8gZG13LCBibGluZGx5IG1vZGlmaWVkIHRvICsxIHRvIGdldCB1bml0IHRlc3RzIHRvIHdvcmssIG1vdmluZwotCQkJLy8gZnJvbSBKYXZhIDEuMywgdG8gMS40Ci0JCQkvLyBub3Qgc3VyZSBob3cvd2h5IHRoaXMgYmVoYXZpb3Igd291bGQgaGF2ZSBjaGFuZ2VkLiAoSXRzIGFzIGlmCi0JCQkvLyAncmVhZCcgaXMgcmVwb3J0aW5nIGVycm9yCi0JCQkvLyBvbmUgY2hhcmFjdGVyIGVhcmx5KS4KLQkJCXJldHVybiBjaGFyUG9zaXRpb24gKyAxOwotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb2RlZFJlYWRlckNyZWF0b3IuCi0JICovCi0JcHJvdGVjdGVkIENvZGVkUmVhZGVyQ3JlYXRvciBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKSB7Ci0JCWlmIChmQ29kZWRSZWFkZXJDcmVhdG9yID09IG51bGwpIHsKLQkJCWZDb2RlZFJlYWRlckNyZWF0b3IgPSBuZXcgQ29kZWRSZWFkZXJDcmVhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb2RlZFJlYWRlckNyZWF0b3I7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGFydGl0aW9uZXIgdG8gYmUgdXNlZCB3aXRoIHRoZQotCSAqIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcgcGFydGl0aW9uaW5nCi0JICogCi0JICogQHJldHVybiBJRG9jdW1lbnRQYXJ0aXRpb25lcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5jb2RpbmdNZW1lbnRvLgotCSAqIAotCSAqIEByZXR1cm4gRW5jb2RpbmdNZW1lbnRvCi0JICovCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IGVuY29kaW5nTWVtZW50byB3YXMgYWNjZXNzZWQgYmVmb3JlIGl0IHdhcyBzZXQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZnVsbFByZXBhcmVkUmVhZGVyLgotCSAqLwotCXByb3RlY3RlZCBSZWFkZXIgZ2V0RnVsbFByZXBhcmVkUmVhZGVyKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgPT0gbnVsbCkgewotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldENvZGVkUmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZGdWxsUHJlcGFyZWRSZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBsaW5lIGRlbGltaXRlciBwcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGxpbmUgZGVsaW1pdGVyCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBsYXRmb3JtTGluZURlbGltaXRlclByZWZlcmVuY2UoSUZpbGUgZmlsZSkgewotCQlJU2NvcGVDb250ZXh0W10gc2NvcGVDb250ZXh0OwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCS8vIHByb2plY3QgcHJlZmVyZW5jZQotCQkJc2NvcGVDb250ZXh0ID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKX07Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlciA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBudWxsLCBzY29wZUNvbnRleHQpOwotCQkJaWYgKGxpbmVEZWxpbWl0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQkJfQotCQkvLyB3b3Jrc3BhY2UgcHJlZmVyZW5jZQotCQlzY29wZUNvbnRleHQgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCl9OwotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIG51bGwsIHNjb3BlQ29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUpIGluc3RlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKG51bGwpOwotCX0KLQotCS8qKgotCSAqIElmIHN1YmNsYXNzIGRvZXNuJ3QgaW1wbGVtZW50LCByZXR1cm4gcGxhdGZvcm0gZGVmYXVsdAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBnZXRQbGF0Zm9ybUxpbmVEZWxpbWl0ZXJQcmVmZXJlbmNlKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIEEgdXRpbGl0eSBtZXRob2QsIGJ1dCBkZXBlbmRzIG9uIHN1YmNsYXNzZXMgdG8gaW1wbGltZW50IHRoZSBwcmVmZXJyZWQKLQkgKiBlbmQgb2YgbGluZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZS4gTm90ZTogc3ViY2xhc3NlcyBzaG91bGQgbm90Ci0JICogcmUtaW1wbGVtZW50IHRoaXMgbWV0aG9kICh0aGVyZSdzIG5vIHJlYXNvbiB0bywgZXZlbiB0aG91Z2ggaXRzIHBhcnQgb2YKLQkgKiBpbnRlcmZhY2UpLiBUaGlzIG1ldGhvZCBub3Qgb25seSBjb252ZXJ0cyBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzLCBpZgotCSAqIG5lZWRlZCwgYnV0IHNldHMgdGhlIGNvcnJlY3QgZW5kLW9mLWxpbmUgZGVsaW1pdGVyIGluCi0JICogc3RydWN0dXJlZERvY3VtZW50LiBNaW5vciBub3RlOiBjYW4ndCB1c2UgdGhpcyBleGFjdCBtZXRob2QgaW4gZHVtcGVycywKLQkgKiBzaW5jZSB0aGUgZGVjaXNpb24gdG8gY2hhbmdlIG9yIG5vdCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQsIGFuZCBzaW5jZQotCSAqIHRoZXJlIHdlIGhhdmUgdG8gY2hhbmdlIHRleHQgb2Ygc3RydWN0dXJlZERvY3VtZW50IGlmIGZvdW5kIHRvIG5lZWQKLQkgKiBjb252ZXJzaW9uLiAoV2hlcmUgYXMgZm9yIGxvYWRpbmcsIHdlIGFzc3VtZSB3ZSBoYXZlbid0IHlldCBzZXQgdGV4dCBpbgotCSAqIHN0cnVjdHVyZWREb2N1bWVudCwgYnV0IHdpbGwgYmUgZG9uZSBieSBvdGhlciBtZXRob2QganVzdCBhIHRpbnkgYml5Ci0JICogbGF0ZXIpLiBOZWVkcyB0byBiZSBwdWJsaWMgdG8gaGFuZGxlIGludGVyZmFjZS4gSXQgaXMgaW4gdGhlIGludGVyZmFjZQotCSAqIGp1c3Qgc28gTW9kZWxNYW5hZ2VySW1wbCBjYW4gdXNlIGl0IGluIGEgc3BlY2lhbCBjaXJjdW1zdGFuY2UuCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBoYW5kbGVMaW5lRGVsaW1pdGVyKFN0cmluZ0J1ZmZlciBvcmlnaW5hbFN0cmluZywgSUVuY29kZWREb2N1bWVudCB0aGVGbGF0TW9kZWwpIHsKLQkJLy8gVE9ETzogbmVlZCB0byBoYW5kbGUgbGluZSBkZWxpbWl0ZXJzIHNvIE1hcmtlciBQb3NpdGlvbnMgYXJlCi0JCS8vIHVwZGF0ZWQKLQkJU3RyaW5nQnVmZmVyIGNvbnZlcnRlZFRleHQgPSBudWxsOwotCQkvLyBiYXNlZCBvbiB0ZXh0LCBtYWtlIGEgZ3Vlc3Mgb24gd2hhdCdzIGJlaW5nIHVzZWQgYXMKLQkJLy8gbGluZSBkZWxpbWl0ZXIKLQkJU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlciA9IFRleHRVdGlsaXRpZXMuZGV0ZXJtaW5lTGluZURlbGltaXRlcihvcmlnaW5hbFN0cmluZywgdGhlRmxhdE1vZGVsLmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcHJlZmVycmVkTGluZURlbGltaXRlciA9IGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIobnVsbCk7Ci0JCWlmIChwcmVmZXJyZWRMaW5lRGVsaW1pdGVyID09IG51bGwpIHsKLQkJCS8vIHdoZW4gcHJlZmVycmVkTGluZURlbGltaXRlciBpcyBudWxsLCBpdCBtZWFucyAibGVhdmUgYWxvbmUiCi0JCQkvLyBzbyBubyBjb252ZXJzaW9uIG5lZWRlZC4KLQkJCS8vIHNldCBoZXJlLCBvbmx5IGlmIG51bGwgKHNob3VsZCBhbHJlYWR5IGJlIHNldCwgYnV0IGlmIG5vdCwKLQkJCS8vIHdlJ2xsIHNldCBzbyBhbnkgc3Vic2VxdWVudCBlZGl0aW5nIGluc2VydHMgd2hhdCB3ZSdyZQotCQkJLy8gYXNzdW1pbmcpCi0JCQlpZiAoIXRoZUZsYXRNb2RlbC5nZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCkuZXF1YWxzKHByb2JhYmxlTGluZURlbGltaXRlcikpIHsKLQkJCQl0aGVGbGF0TW9kZWwuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpOwotCQkJfQotCQkJY29udmVydGVkVGV4dCA9IG9yaWdpbmFsU3RyaW5nOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCFwcmVmZXJyZWRMaW5lRGVsaW1pdGVyLmVxdWFscyhwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJLy8gdGVjaG5pY2FsbHksIHdvdWxkbid0IGhhdmUgdG8gY29udmVydCBsaW5lIGRlbGltaXRlcnMKLQkJCQkvLyBoZXJlIGF0IGJlZ2lubmluZywgYnV0IHdoZW4gd2Ugc2F2ZSwgaWYgdGhlIHByZWZlcnJlZAotCQkJCS8vIGxpbmUgZGVsaW10ZXIgaXMgImxlYXZlIGFsb25lIiB0aGVuIHdlIGRvIGxlYXZlIGFsb25lLAotCQkJCS8vIHNvIGJlc3QgdG8gYmUgcmlnaHQgZnJvbSBiZWdpbm5pbmcuCi0JCQkJY29udmVydGVkVGV4dCA9IGNvbnZlcnRMaW5lRGVsaW1pdGVycyhvcmlnaW5hbFN0cmluZywgcHJlZmVycmVkTGluZURlbGltaXRlcik7Ci0JCQkJdGhlRmxhdE1vZGVsLnNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIocHJlZmVycmVkTGluZURlbGltaXRlcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGV5IGFyZSBhbHJlYWR5IHRoZSBzYW1lLCBubyBjb252ZXJzaW9uIG5lZWRlZAotCQkJCXRoZUZsYXRNb2RlbC5zZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKHByZWZlcnJlZExpbmVEZWxpbWl0ZXIpOwotCQkJCWNvbnZlcnRlZFRleHQgPSBvcmlnaW5hbFN0cmluZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udmVydGVkVGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIFZlcnkgbWVjaGFuaWNhbCBtZXRob2QsIGp1c3QgdG8gcmVhZCB0aGUgY2hhcmFjdGVycywgb25jZSB0aGUgcmVhZGVyIGlzCi0JICogY29ycmVjdGx5IGNyZWF0ZWQuIENhbiB0aHJvdyBNYWxGb3JtZWRJbnB1dEV4Y2VwdGlvbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciByZWFkSW5wdXRTdHJlYW0oUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpbnQgZkJsb2Nrc1JlYWQgPSAwOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbnVtUmVhZCA9IDA7Ci0JCXRyeSB7Ci0JCQljaGFyIHRCdWZmW10gPSBuZXcgY2hhcltDb2RlZElPLk1BWF9CVUZfU0laRV07Ci0JCQl3aGlsZSAobnVtUmVhZCAhPSAtMSkgewotCQkJCW51bVJlYWQgPSByZWFkZXIucmVhZCh0QnVmZiwgMCwgdEJ1ZmYubGVuZ3RoKTsKLQkJCQlpZiAobnVtUmVhZCA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCh0QnVmZiwgMCwgbnVtUmVhZCk7Ci0JCQkJCWZCbG9ja3NSZWFkKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKGZFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCksIGZCbG9ja3NSZWFkICogQ29kZWRJTy5NQVhfQlVGX1NJWkUgKyBudW1SZWFkICsgZS5nZXRJbnB1dExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKGZFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCksIGZCbG9ja3NSZWFkICogQ29kZWRJTy5NQVhfQlVGX1NJWkUgKyBudW1SZWFkICsgZS5nZXRJbnB1dExlbmd0aCgpKTsKLQotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsb2FkKElFbmNvZGVkRG9jdW1lbnQgZW5jb2RlZERvY3VtZW50LCBSZWFkZXIgaW5wdXRTdHJlYW1SZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dFN0cmVhbVJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdHJlYW0gcmVhZGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaW50IFJFQURfQlVGRkVSX1NJWkUgPSA4MTkyOwotCQlpbnQgTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUksgPSAyMDAwMDA7Ci0JCS8vIHRlbXAgLi4uLiBldmVudHVhbGx5IHdlJ2xsbCBvbmx5IHJlYWQgYXMgbmVlZGVkCi0JCUJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlucHV0U3RyZWFtUmVhZGVyLCBNQVhfQlVGRkVSRURfU0laRV9GT1JfUkVTRVRfTUFSSyk7Ci0JCWJ1ZmZlcmVkUmVhZGVyLm1hcmsoTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUkspOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJaW50IG51bVJlYWQgPSAwOwotCQkJY2hhciB0QnVmZltdID0gbmV3IGNoYXJbUkVBRF9CVUZGRVJfU0laRV07Ci0JCQl3aGlsZSAoKG51bVJlYWQgPSBidWZmZXJlZFJlYWRlci5yZWFkKHRCdWZmLCAwLCB0QnVmZi5sZW5ndGgpKSAhPSAtMSkgewotCQkJCWJ1ZmZlci5hcHBlbmQodEJ1ZmYsIDAsIG51bVJlYWQpOwotCQkJfQotCQkJLy8gcmVtZW1iZXIgLS0gd2UgZGlkbid0IG9wZW4gc3RyZWFtIC4uLiBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbnQgcG9zID0gZS5nZXRJbnB1dExlbmd0aCgpOwotCQkJRW5jb2RpbmdNZW1lbnRvIGxvY2FsRW5jb2RpbmdNZW1lbnRvID0gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlib29sZWFuIGNvdWxkUmVzZXQgPSB0cnVlOwotCQkJU3RyaW5nIGVuY29kaW5nTmFtZUluRXJyb3IgPSBsb2NhbEVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQkJCWlmIChlbmNvZGluZ05hbWVJbkVycm9yID09IG51bGwpIHsKLQkJCQllbmNvZGluZ05hbWVJbkVycm9yID0gbG9jYWxFbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlidWZmZXJlZFJlYWRlci5yZXNldCgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHJlc2V0RXhjZXB0aW9uKSB7Ci0JCQkJLy8gdGhlIG9ubHkgZXJycm8gdGhhdCBjYW4gb2NjdXIgZHVyaW5nIHJlc2V0IGlzIGFuCi0JCQkJLy8gSU9FeGNlcHRpb24KLQkJCQkvLyBkdWUgdG8gYWxyZWFkeSBiZWluZyBwYXN0IHRoZSByZXN0IG1hcmsuIEluIHRoYXQgY2FzZSwgd2UKLQkJCQkvLyB0aHJvdyBtb3JlIGdlbmVyaWMgbWVzc2FnZQotCQkJCWNvdWxkUmVzZXQgPSBmYWxzZTsKLQkJCX0KLQkJCS8vIC0xIGNhbiBiZSB1c2VkIGJ5IFVJIGxheWVyIGFzIGEgY29kZSB0aGF0ICJwb3NpdGlvbiBjb3VsZCBub3QKLQkJCS8vIGJlCi0JCQkvLyBkZXRlcm1pbmVkIgotCQkJaW50IGNoYXJQb3N0aW9uID0gLTE7Ci0JCQlpZiAoY291bGRSZXNldCkgewotCi0JCQkJY2hhclBvc3Rpb24gPSBnZXRDaGFyUG9zdGlvbk9mRmFpbHVyZShidWZmZXJlZFJlYWRlcik7Ci0JCQkJLy8gZ2V0Q2hhclBvc3Rpb25PZkZhaWx1cmUobmV3IElucHV0U3RyZWFtUmVhZGVyKGluU3RyZWFtLAotCQkJCS8vIGphdmFFbmNvZGluZ05hbWVJbkVycm9yKSk7Ci0JCQl9Ci0JCQkvLyBhbGwgb2YgdGhhdCBqdXN0IHRvIHRocm93IG1vcmUgYWNjdXJhdGUgZXJyb3IKLQkJCS8vIG5vdGU6IHdlIGRvIHRoZSBjb252ZXJzaW9uIHRvIGlhbmFOYW1lLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZQotCQkJLy8gbG9jYWwKLQkJCS8vIHZhcmlhYmxlLAotCQkJLy8gYmVjYXVzZSB0aGlzIGlzIHVsdGltYXRlbHkgb25seSBmb3IgdGhlIHVzZXIgZXJyb3IgbWVzc2FnZQotCQkJLy8gKHRoYXQKLQkJCS8vIGlzLAotCQkJLy8gdGhlIGVycm9yIG9jY3VycmVkCi0JCQkvLyBpbiBjb250ZXh0IG9mIGphdmFFbmNvZGluZ05hbWUgbm8gbWF0dGVyIHdoYXQgaWFuYUVuY29kaW5nTmFtZQotCQkJLy8gaXMKLQkJCXRocm93IG5ldyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoZW5jb2RpbmdOYW1lSW5FcnJvciwgQ29kZWRJTy5nZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGVuY29kaW5nTmFtZUluRXJyb3IpLCBjaGFyUG9zdGlvbiwgIWNvdWxkUmVzZXQsIE1BWF9CVUZGRVJFRF9TSVpFX0ZPUl9SRVNFVF9NQVJLKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gYnVmZmVyOwotCQllbmNvZGVkRG9jdW1lbnQuc2V0KHN0cmluZ2J1ZmZlci50b1N0cmluZygpKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKElFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCVN0cmluZ0J1ZmZlciBhbGxUZXh0ID0gcmVhZElucHV0U3RyZWFtKHJlYWRlcik7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXQoYWxsVGV4dC50b1N0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjgwMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLS8qKgotICogQSBqYXZhLmlvLlJlYWRlciB0aGF0IGNhbiBvcGVyYXRlIG9mZiBvZiBhbiBJRG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIGludCBtYXJrID0gMDsKLQlwcml2YXRlIGludCBwb3NpdGlvbiA9IDA7Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50UmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzKGRvY3VtZW50LCAwKTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZWFkZXIoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5pdGlhbFBvc2l0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlwb3NpdGlvbiA9IGluaXRpYWxQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJbWFyayA9IHBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYoZkRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCQotCQljaGFyW10gcmVhZENoYXJzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChwb3NpdGlvbiA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJLy8gdGhlIElEb2N1bWVudCBpcyBsaWtlbHkgdXNpbmcgYSBHYXBUZXh0U3RvcmUsIHNvIHdlIGNhbid0Ci0JCQkvLyByZXRyaWV2ZSBhIGNoYXJbXSBkaXJlY3RseQotCQkJaWYgKHBvc2l0aW9uICsgbGVuID4gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJCXJlYWRDaGFycyA9IGZEb2N1bWVudC5nZXQocG9zaXRpb24sIGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIHBvc2l0aW9uKS50b0NoYXJBcnJheSgpOwotCQkJZWxzZQotCQkJCXJlYWRDaGFycyA9IGZEb2N1bWVudC5nZXQocG9zaXRpb24sIGxlbikudG9DaGFyQXJyYXkoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkocmVhZENoYXJzLCAwLCBjYnVmLCBvZmYsIHJlYWRDaGFycy5sZW5ndGgpOwotCQkJLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgcG9zaXRpb24gKyAiOiIgKyByZWFkQ2hhcnMubGVuZ3RoICsgIiAiCi0JCQkvLyArIFN0cmluZ1V0aWxzLmVzY2FwZShuZXcgU3RyaW5nKHJlYWRDaGFycykpKTsKLQkJCXBvc2l0aW9uICs9IHJlYWRDaGFycy5sZW5ndGg7Ci0JCQlyZXR1cm4gcmVhZENoYXJzLmxlbmd0aDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgZnJvbSBJRG9jdW1lbnQ6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwb3NpdGlvbiA9IG1hcms7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5pdGlhbFBvc2l0aW9uKSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlwb3NpdGlvbiA9IGluaXRpYWxQb3NpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChpbnQgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwb3NpdGlvbiA9IHBvczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYoZkRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlsb25nIHNraXBwZWQgPSBuOwotCQlpZiAocG9zaXRpb24gKyBuID4gZkRvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQlza2lwcGVkID0gZkRvY3VtZW50LmdldExlbmd0aCgpIC0gcG9zaXRpb247Ci0JCQlwb3NpdGlvbiA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJfSBlbHNlIHsKLQkJCXBvc2l0aW9uICs9IG47Ci0JCX0KLQkJcmV0dXJuIHNraXBwZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSURvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYThiMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLQotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCXZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhOTlkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudExvYWRlciB7Ci0KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgaXMgbGlrZSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIGV4Y2VwdCBpdCBzaG91bGQgcG9wdWxhdGUKLQkgKiB0aGUgc3RydWN0dXJlZERvY3VtZW50IHdpdGggdGhlIGNvbnRlbnRzIG9mIElGaWxlLiBBbHNvLCB0aG9zZQotCSAqIFN0cnVjdHVyZWREb2N1bWVudHMgd2hpY2ggYXJlIHNlbnNpdGl2ZSB0byB0aGUgaW5wdXQgKHRoYXQgaXMsIHRoZQotCSAqIHBhcnNlciBvciBwYXJzZXIgaW5pdGlhbGl6YXRpb24gbXkgcmVxdWlyZSB0aGUgaW5wdXQpIHNob3VsZAotCSAqIGFkZGl0aW9uYWxseSBpbml0aWFsaXplIHRoZSBwYXJzZXIsIGV0Yy4sIGFwcHJvcHJpYXRlIHRvIHRoZSBpbnB1dC4KLQkgKiAKLQkgKiBBcyBhbHdheXMsIHRoZSBhcHByb3ByaWF0ZSBkZWNvZGluZyBzaG91bGQgYmUgdXNlZC4KLQkgKi8KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChJRmlsZSBpRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBJRW5jb2RlZERvY3VtZW50LCB0aGF0IGhhcwotCSAqIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhcHByb3ByaWF0ZSBwYXJzZXIuIEZvciBtYW55IGxvYWRlcnMsIHRoZQotCSAqIChkZWZhdWx0KSBwYXJzZXIgdXNlZCBpcyBrbm93biBmb3IgYW55IGlucHV0LiBGb3Igb3RoZXJzLCB0aGUgY29ycmVjdAotCSAqIHBhcnNlciAoYW5kIGl0cyBpbml0aWFsaXphdGlvbikgaXMgbm9ybWFsbHkgZGVwZW5kZW50IG9uIHRoZSBjb250ZW50IG9mCi0JICogdGhlIGZpbGUuIFRoaXMgbm8tYXJndW1lbnQgbWV0aG9kIHNob3VsZCBhc3N1bWUgImVtcHR5IGlucHV0IiBhbmQgd291bGQKLQkgKiB0aGVyZWZvcmUgcmV0dXJuIHRoZSBkZWZhdWx0IHBhcnNlciBmb3IgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpc3RyZWFtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCUlFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaXN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQlJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCi0JSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpOwotCi0JLyoqCi0JICogQSB1dGlsaXR5IG1ldGhvZCwgYnV0IGRlcGVuZHMgb24gc3ViY2xhc3NlcyB0byBpbXBsaW1lbnQgdGhlIHByZWZlcnJlZAotCSAqIGVuZCBvZiBsaW5lIGZvciBhIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLiBOb3RlOiBzdWJjbGFzc2VzIHNob3VsZCBub3QKLQkgKiByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgKHRoZXJlJ3Mgbm8gcmVhc29uIHRvLCBldmVuIHRob3VnaCBpdHMgcGFydCBvZgotCSAqIGludGVyZmFjZSkuIFRoaXMgbWV0aG9kIG5vdCBvbmx5IGNvbnZlcnRzIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMsIGlmCi0JICogbmVlZGVkLCBidXQgc2V0cyB0aGUgY29ycmVjdCBlbmQtb2YtbGluZSBkZWxpbWl0ZXIgaW4KLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBlaXRoZXIgdGhlIG9yaWdpbmFsIHN0cmluZywKLQkgKiBpZiBubyBjb252ZXJzaW9uIGlzIG5lZWRlZCwgb3IgYSBuZXcgc3RyaW5nIHdpdGggZW5kLW9mLWxpbmVzCi0JICogY29udmVydGVkLgotCSAqLwotCVN0cmluZ0J1ZmZlciBoYW5kbGVMaW5lRGVsaW1pdGVyKFN0cmluZ0J1ZmZlciBvcmlnaW5hbFN0cmluZywgSUVuY29kZWREb2N1bWVudCB0aGVTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0Jdm9pZCByZWxvYWQoSUVuY29kZWREb2N1bWVudCBkb2N1bWVudCwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2MThmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogQXQgdGhlIG1vbWVudCwgdGhpcyBpcyBwcmltYXJpbHkgaW50ZW5kZWQgYXMgYSBjb252ZW5pZW5jZSB0byBoZWxwIHN3aXRjaAotICogYmV0d2VlbiB2YXJpb3VzIHR5cGVzIG9mIHRocmVhZGluZyBtb2RlbHMgaW4gdGhlIGRvY3VtZW50LCBhbGwgaW4gYSBjZW50cmFsCi0gKiBwaWVjZSBvZiBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdSSVRFX1NZTkNIUk9OSVpFRCA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFQgPSBXUklURV9TWU5DSFJPTklaRUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOU1lOQ0hST05JWkVEID0gMTsKLQotCXByaXZhdGUgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoaW50IHR5cGUsIFJlZ2lvblBhcnNlciBwYXJzZXIpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgVU5TWU5DSFJPTklaRUQgOgotCQkJCXJlc3VsdCA9IG5ldyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudChwYXJzZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXUklURV9TWU5DSFJPTklaRUQgOgotCQkJCXJlc3VsdCA9IG5ldyBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50KHBhcnNlcik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlcXVlc3QgZG9jdW1lbnQgdHlwZSB3YXMgbm90IGtub3duIik7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhlIChzeXN0ZW0gZGVmYXVsdCkgc3RydWN0dXJlZCBkb2N1bWVudCBpbml0aWFsaXplZCB3aXRoIHRoZQotCSAqIHBhcnNlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyc2VyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShSZWdpb25QYXJzZXIgcGFyc2VyKSB7Ci0JCXJldHVybiBnZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShERUZBVUxULCBwYXJzZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0VXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlYzU5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLS8qKgotICogQ29sbGVjdGlvbiBvZiB0ZXh0IGZ1bmN0aW9ucy4KLSAqIAotICogQGRlcHJlY2F0ZWQgLSBtYXJrZWQgYXMgZGVwcmVjYXRlZCB0byByZW1pbmQgdXMgdG8gcGhhc2UgdGhpcyBvdXQgKGFuZC9vcgotICogICAgICAgICAgICAgbW92ZSB0byAiZmluaXNoZWQiIHZlcnNpb24pLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dFV0aWxpdGllcyB7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpZiBwb3NzaWJsZSwgaXRzIGJlc3QgdG8gdXNlCi0JICogICAgICAgICAgICAgSURvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gZmdEZWxpbWl0ZXJzID0gbmV3IFN0cmluZ1tdeyJcbiIsICJcciIsICJcclxuIn07Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoaWNoIG9uZSBvZiBmZ0RlbGltaXRlcnMgYXBwZWFycyBmaXJzdCBpbiB0aGUgdGV4dC4gSWYgbm9uZQotCSAqIG9mIHRoZW0gdGhlIGhpbnQgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGV0ZXJtaW5lTGluZURlbGltaXRlcihTdHJpbmdCdWZmZXIgdGV4dEJ1ZmZlciwgU3RyaW5nW10gcG9zc2libGVzLCBTdHJpbmcgaGludCkgewotCQl0cnkgewotCQkJLy8gVE9ETzogYXZvaWQgdXNlIG9mIFN0cmluZyBpbnN0YW5jZQotCQkJU3RyaW5nIHRleHQgPSB0ZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQlpbnRbXSBpbmZvID0gaW5kZXhPZihwb3NzaWJsZXMsIHRleHQsIDApOwotCQkJcmV0dXJuIHBvc3NpYmxlc1tpbmZvWzFdXTsKLQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHgpIHsKLQkJfQotCQlyZXR1cm4gaGludDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nIGdyZWF0ZXIgdGhhbiBvZmZzZXQgb2YgdGhlIGxvbmdlc3QKLQkgKiBtYXRjaGluZyBzZWFyY2ggc3RyaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGluZGV4T2YoU3RyaW5nW10gc2VhcmNoU3RyaW5ncywgU3RyaW5nIHRleHQsIGludCBvZmZzZXQpIHsKLQotCQlpbnRbXSByZXN1bHQgPSB7LTEsIC0xfTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWludCBpbmRleCA9IHRleHQuaW5kZXhPZihzZWFyY2hTdHJpbmdzW2ldLCBvZmZzZXQpOwotCQkJaWYgKGluZGV4ID49IDApIHsKLQotCQkJCWlmIChyZXN1bHRbMF0gPT0gLTEpIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfSBlbHNlIGlmIChpbmRleCA8IHJlc3VsdFswXSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4ID09IHJlc3VsdFswXSAmJiBzZWFyY2hTdHJpbmdzW2ldLmxlbmd0aCgpID4gc2VhcmNoU3RyaW5nc1tyZXN1bHRbMV1dLmxlbmd0aCgpKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2ZpbGVidWZmZXJzL0Jhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9maWxlYnVmZmVycy9CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY0NjdiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2ZpbGVidWZmZXJzL0Jhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBHZW5lcmljIElEb2N1bWVudEZhY3RvcnkgZm9yIElTdHJ1Y3R1cmVkRG9jdW1lbnRzIHRvIGJlIHVzZWQgYnkgdGhlCi0gKiBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24gZXh0ZW5zaW9uIHBvaW50LiBUaGlzIGNsYXNzCi0gKiBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkgaW1wbGVtZW50cyBJRG9jdW1lbnRGYWN0b3J5LCBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0KLQkvKgotCSAqIFRoZSBjb250ZW50IHR5cGUgSUQgdXNlZCB0byBkZWNsYXJlIHRoaXMgZmFjdG9yeTsgaXQgaXMgdXNlZCB0byBmaW5kCi0JICogdGhlIGNvcnJlc3BvbmRpbmcgc3VwcG9ydCBmb3IgY3JlYXRpbmcgdGhlIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRlbnRUeXBlSWRlbnRpZmllciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvciwgb25seSB0byBiZSB1c2VkIGJ5IHRoZQotCSAqIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIEJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50RmFjdG9yeSNjcmVhdGVEb2N1bWVudCgpCi0JICovCi0JcHVibGljIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQl3aGlsZSAoaGFuZGxlciA9PSBudWxsICYmICFJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQuZXF1YWxzKGNvbnRlbnRUeXBlLmdldElkKCkpKSB7Ci0JCQloYW5kbGVyID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCWNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJfQotCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWRvY3VtZW50ID0gbmV3IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gZkNvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQl9Ci0KLQkvKgotCSAqIExvYWRzIHRoZSBjb250ZW50IHR5cGUgSUQgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBTdHJ1Y3R1cmVkIERvY3VtZW50LiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZDb250ZW50VHlwZUlkZW50aWZpZXIgPSBjb25maWcuZ2V0QXR0cmlidXRlKCJjb250ZW50VHlwZUlkIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZGF0YS50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCWZDb250ZW50VHlwZUlkZW50aWZpZXIgPSAoU3RyaW5nKSBkYXRhOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1NTRiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSBpbml0aWFsIElEb2N1bWVudEV4dGVuc2lvbjQgc3VwcG9ydCAtICMxMDI4MjIKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgewotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZkZvcm1hdENvbnRyYWludHMgPSBudWxsOwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcyA9IHRydWU7IC8vIHNwZWNpYWwgZmxhZyBmb3IgSlVuaXQKLQkvKgotCSAqIE1heCBsZW5ndGggb2YgdGV4dCB0byBiZSBmb3JtYXR0ZWQgdG8gYmUgY29uc2lkZXJlZCBhICJzbWFsbCBjaGFuZ2UiCi0JICogVXNlZCBmb3IgZG9jdW1lbnQgcmV3cml0ZSBzZXNzaW9uIHR5cGUuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NNQUxMX0ZPUk1BVF9TSVpFID0gMTAwMDsKLQotCXByb3RlY3RlZCB2b2lkIGVuc3VyZUNsb3NlZChPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCi0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQkJdHJ5IHsKLQkJCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOyAvLyBob3BlbGVzcwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb3JtYXRDb250ZW50KFN0cmluZyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlyZXR1cm4gaW5wdXQ7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciByZWFkLiBXaWxsIHJldHVybiBmb3JtYXR0ZWQKLQkJCS8vIHN0cmluZyBhbmQgTk9UIHNhdmUgbW9kZWwuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArICIuIiArIGdldEZpbGVFeHRlbnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyByZXR1cm4gb3V0cHV0Ci0JCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb3JtYXRDb250ZW50KFN0cmluZyBpbnB1dCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybiBpbnB1dDsKLQotCQlpZiAoKHN0YXJ0ID49IDApICYmIChsZW5ndGggPj0gMCkgJiYgKHN0YXJ0ICsgbGVuZ3RoIDw9IGlucHV0Lmxlbmd0aCgpKSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgcmVhZC4gV2lsbCByZXR1cm4gZm9ybWF0dGVkCi0JCQkJLy8gc3RyaW5nIGFuZCBOT1Qgc2F2ZSBtb2RlbC4KLQkJCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBpZCA9IGlucHV0U3RyZWFtLnRvU3RyaW5nKCkgKyAiLiIgKyBnZXRGaWxlRXh0ZW5zaW9uKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkJLy8gZm9ybWF0Ci0JCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJCS8vIHJldHVybiBvdXRwdXQKLQkJCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKLQkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICgoc3RhcnQgPj0gMCkgJiYgKGxlbmd0aCA+PSAwKSAmJiAoc3RhcnQgKyBsZW5ndGggPD0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZgotCQkJCS8vIG1vZGVsIGNoYW5nZWQuCi0JCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0KLQkJCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQkJLy8gZm9ybWF0Ci0JCQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGUoSUZpbGUgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJLy8gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcwotCQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBkb2NFeHQ0ID0gbnVsbDsKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJZG9jRXh0NCA9IChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQl9Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQkvLyB3aGVuZXZlciBmb3JtYXR0aW5nIG1vZGVsLCBmaXJlIGFib3V0dG9jaGFuZ2UvbW9kZWxjaGFuZ2VkCi0JCQkJc3RydWN0dXJlZE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHJld3JpdGVUeXBlID0gKGxlbmd0aCA+IE1BWF9TTUFMTF9GT1JNQVRfU0laRSkgPyBEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5VTlJFU1RSSUNURUQgOiBEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5VTlJFU1RSSUNURURfU01BTEw7Ci0JCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsIHx8IGRvY0V4dDQuZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKSAhPSBudWxsKSA/IG51bGwgOiBkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24ocmV3cml0ZVR5cGUpOwotCi0JCQkJaWYgKChzdGFydCA9PSAwKSAmJiAobGVuZ3RoID09IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSkpCi0JCQkJCXNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KHN0cnVjdHVyZWRNb2RlbCwgZmFsc2UpOwotCQkJCWVsc2UKLQkJCQkJc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoc3RydWN0dXJlZE1vZGVsLCB0cnVlKTsKLQotCQkJCWlmICgoc3RhcnQgPj0gMCkgJiYgKGxlbmd0aCA+PSAwKSAmJiAoc3RhcnQgKyBsZW5ndGggPD0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKSkgewotCQkJCQlMaXN0IGFjdGl2ZU5vZGVzID0gZ2V0QWxsQWN0aXZlTm9kZXMoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQkJCQkJaWYgKGFjdGl2ZU5vZGVzLnNpemUoKSA+IDApIHsKLQkJCQkJCU5vZGUgZmlyc3ROb2RlID0gKE5vZGUpIGFjdGl2ZU5vZGVzLmdldCgwKTsKLQkJCQkJCU5vZGUgbGFzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMuZ2V0KGFjdGl2ZU5vZGVzLnNpemUoKSAtIDEpOwotCi0JCQkJCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCQkJCU5vZGUgZWFjaE5vZGUgPSBmaXJzdE5vZGU7Ci0JCQkJCQlOb2RlIG5leHROb2RlID0gbnVsbDsKLQkJCQkJCXdoaWxlICghZG9uZSkgewotCQkJCQkJCS8vIHVwZGF0ZSAiZG9uZSIKLQkJCQkJCQlkb25lID0gKGVhY2hOb2RlID09IGxhc3ROb2RlKTsKLQotCQkJCQkJCS8qCi0JCQkJCQkJICogZ2V0IG5leHQgc2libGluZyBiZWZvcmUgZm9ybWF0IGJlY2F1c2UgZWFjaE5vZGUKLQkJCQkJCQkgKiBtYXkgYmUgZGVsZXRlZCwgZm9yIGV4YW1wbGUgd2hlbiBpdCdzIGFuIGVtcHR5Ci0JCQkJCQkJICogdGV4dCBub2RlCi0JCQkJCQkJICovCi0JCQkJCQkJbmV4dE5vZGUgPSBlYWNoTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJLy8gZm9ybWF0IGVhY2ggbm9kZQotCQkJCQkJCWZvcm1hdE5vZGUoZWFjaE5vZGUpOwotCi0JCQkJCQkJLy8gdXBkYXRlIGVhY2ggbm9kZQotCQkJCQkJCWlmICgobmV4dE5vZGUgIT0gbnVsbCkgJiYgKG5leHROb2RlLmdldFBhcmVudE5vZGUoKSA9PSBudWxsKSkKLQkJCQkJCQkJLy8gbmV4dE5vZGUgaXMgZGVsZXRlZCBkdXJpbmcgZm9ybWF0Ci0JCQkJCQkJCWVhY2hOb2RlID0gZWFjaE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWVhY2hOb2RlID0gbmV4dE5vZGU7Ci0KLQkJCQkJCQkvLyBUaGlzIHNob3VsZCBub3QgYmUgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlCi0JCQkJCQkJLy8gc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB3aXRoIGVhY2hOb2RlLgotCQkJCQkJCS8vIFdlIGRvbid0IHdhbnQgYW4gaW5maW5pdGUgbG9vcCBoZXJlLgotCQkJCQkJCWlmIChlYWNoTm9kZSA9PSBudWxsKQotCQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gd2UgbmVlZCB0d28gZmluYWxseSdzLCBqdXN0IGluIGNhc2UgZmlyc3QgZmFpbHMKLQkJCQl0cnkgewotCQkJCQlpZiAoKGRvY0V4dDQgIT0gbnVsbCkgJiYgKHJld3JpdGVTZXNzaW9uICE9IG51bGwpKQotCQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJLy8gYWx3YXlzIG1ha2Ugc3VyZSB0byBmaXJlIGNoYW5nZWRtb2RlbCB3aGVuIGRvbmUKLQkJCQkJc3RydWN0dXJlZE1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKExvZ2dlci5ERUJVR19GT1JNQVQpIHsKLQkJCQlsb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvcm1hdE1vZGVsIHRpbWU6ICIgKyAoZW5kVGltZSAtIHN0YXJ0VGltZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXROb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIG5ld05vZGUgPSBub2RlOwotCi0JCQkvLyBmb3JtYXQgdGhlIG93bmVyIG5vZGUgaWYgaXQncyBhbiBhdHRyaWJ1dGUgbm9kZQotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCQkJCW5ld05vZGUgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCi0JCQkvLyByZWZyZXNoIGZvcm1hdCBwcmVmZXJlbmNlcyBiZWZvcmUgZ2V0dGluZyBmb3JtYXR0ZXIKLQkJCWlmIChyZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMpCi0JCQkJcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCk7Ci0KLQkJCS8vIGdldCBmb3JtYXR0ZXIgYW5kIGZvcm1hdCBjb250cmFpbnRzCi0JCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBnZXRGb3JtYXR0ZXIobmV3Tm9kZSk7Ci0JCQkvLyBUT0RPX2Z1dHVyZTogYWRkZWQgYXNzZXJ0IHRvIHJlcGxhY2UgInJlZHVuZGFudCBudWxsIGNoZWNrIi4KLQkJCS8vIGlmIGZvcm1hdHRlciBpcyBldmVyIG51bGwsIHdlIHNob3VsZCBwcm92aWRlIHNvbWUKLQkJCS8vIGRlZmF1bHQgZm9ybWF0dGVyIHRvIHNlcnZlIGFzIHBsYWNlIGhvbGRlci4KLQkJCUFzc2VydC5pc05vdE51bGwoZm9ybWF0dGVyLCAiZm9ybWF0dGVyIHdhcyBudWxsIGZvciBhIG5vZGUsICIpOyAvLyROT04tTkxTLTEkCi0JCQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cyA9IGZvcm1hdHRlci5nZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0JCQlmb3JtYXRDb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KHRydWUpOwotCQkJLy8gZm9ybWF0IGVhY2ggbm9kZQotCQkJZm9ybWF0dGVyLmZvcm1hdChuZXdOb2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSBnZXRBbGxBY3RpdmVOb2RlcyBpbnN0ZWFkCi0JICovCi0JcHJvdGVjdGVkIFZlY3RvciBnZXRBY3RpdmVOb2RlcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0Tm9kZU9mZnNldCwgaW50IGxlbmd0aCkgewotCQlMaXN0IGFsbEFjdGl2ZU5vZGVzID0gZ2V0QWxsQWN0aXZlTm9kZXMoc3RydWN0dXJlZE1vZGVsLCBzdGFydE5vZGVPZmZzZXQsIGxlbmd0aCk7Ci0JCXJldHVybiBuZXcgVmVjdG9yKGFsbEFjdGl2ZU5vZGVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBbGxBY3RpdmVOb2RlcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0Tm9kZU9mZnNldCwgaW50IGxlbmd0aCkgewotCQlMaXN0IGFjdGl2ZU5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJTm9kZSBzdGFydE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0KTsKLQkJCS8vIHNlZSBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDcxMQotCQkJLy8KLQkJCS8vIFdlIGhhdmUgdG8gd2F0Y2ggZm9yIHNlbGVjdGlvbiBib3VuZGFyeSBjb25kaXRpb25zLiBVc2UgdGhpcyBhcwotCQkJLy8gYW4gZXhhbXBsZTogPGE+dGV4dDwvYT48Yj50ZXh0PC9iPiwKLQkJCS8vIElmIHRoZSB3aG9sZSA8YT4gbm9kZSBpcyBzZWxlY3RlZCwgbGlrZToKLQkJCS8vIHw8YT50ZXh0PC9hPnw8Yj50ZXh0PC9iPiwgd2UgbmVlZCB0byBzdWJzdHJhY3QgdGhlIGxlbmd0aCBieSAxCi0JCQkvLyB0byBmaW5kCi0JCQkvLyB0aGUgbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb246Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGggLSAxKSwKLQkJCS8vIG9yIGVsc2UKLQkJCS8vIHdlJ2QgZmluZCB0aGUgbmV4dCBhZGphY2VudCBub2RlLgotCQkJLy8KLQkJCS8vIEhvd2V2ZXIsIHdoZW4gdGhlIHNlbGVjdGlvbiBsZW5ndGggaXMgMCAobWVhbmluZyBubyB0ZXh0IGlzCi0JCQkvLyBzZWxlY3RlZCksIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGJlZ2lubmluZwotCQkJLy8gb2YgdGhlIG5vZGUgd2Ugd2FudCB0byBmb3JtYXQ6IHw8YT50ZXh0PC9hPjxiPnRleHQ8L2I+LCB0aGUKLQkJCS8vIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGlzOgotCQkJLy8gc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoKS4KLQkJCWludCBlbmROb2RlT2Zmc2V0ID0gbGVuZ3RoID4gMCA/IHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCAtIDEgOiBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGg7Ci0JCQlOb2RlIGVuZE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oZW5kTm9kZU9mZnNldCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBpdCdzIGFuIG5vbi1lbXB0eSBkb2N1bWVudAotCQkJaWYgKHN0YXJ0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKGlzU2libGluZ09mKHN0YXJ0Tm9kZSwgZW5kTm9kZSkgPT0gZmFsc2UpIHsKLQkJCQkJaWYgKGVuZE5vZGUgIT0gbnVsbCkKLQkJCQkJCWVuZE5vZGUgPSBlbmROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkgewotCQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCS8vIHNlZQotCQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ3MTEKLQkJCQkJCS8vIGFuZCBub3RlcyBhYm92ZQotCQkJCQkJZW5kTm9kZU9mZnNldCA9IGxlbmd0aCA+IDAgPyBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGggLSAxIDogc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoOwotCQkJCQkJZW5kTm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihlbmROb2RlT2Zmc2V0KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXdoaWxlIChzdGFydE5vZGUgIT0gZW5kTm9kZSkgewotCQkJCQlhY3RpdmVOb2Rlcy5hZGQoc3RhcnROb2RlKTsKLQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCkKLQkJCQkJYWN0aXZlTm9kZXMuYWRkKHN0YXJ0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZlTm9kZXM7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCk7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gMjYyMTM1IC0gTlBFIGR1cmluZyBmb3JtYXQgb2YgZW1wdHkgZG9jdW1lbnQKLQkJaWYgKChmRm9ybWF0Q29udHJhaW50cyA9PSBudWxsKSAmJiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oMCk7Ci0KLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBnZXRGb3JtYXR0ZXIobm9kZSk7Ci0JCQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQkJCWZGb3JtYXRDb250cmFpbnRzID0gZm9ybWF0dGVyLmdldEZvcm1hdENvbnRyYWludHMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaWJsaW5nT2YoTm9kZSBub2RlLCBOb2RlIGVuZE5vZGUpIHsKLQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIHsKLQkJCU5vZGUgc2libGluZ05vZGUgPSBub2RlOwotCQkJd2hpbGUgKHNpYmxpbmdOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoc2libGluZ05vZGUgPT0gZW5kTm9kZSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlzaWJsaW5nTm9kZSA9IHNpYmxpbmdOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMoKTsKLQotCXByb3RlY3RlZCB2b2lkIHNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBib29sZWFuIGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KSB7Ci0JCS8vIDI2MjEzNSAtIE5QRSBkdXJpbmcgZm9ybWF0IG9mIGVtcHR5IGRvY3VtZW50Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzID0gZ2V0Rm9ybWF0Q29udHJhaW50cyhzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCWlmIChmb3JtYXRDb250cmFpbnRzICE9IG51bGwpCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzAwNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotLyoqCi0gKiBUaGVzZSBhcmUgaXRlbXMgdGhhdCBjaGFuZ2UgZnJvbSBlbGVtZW50IHRvIGVsZW1lbnQuCi0gKiBQYXNzZWQgZnJvbSBub2RlIHRvIG5vZGUgaW4gYSByZWN1cnNpdmUgY2FsbC4KLSAqIGVnLiBjdXJyZW50IGluZGVudCBpcyAyIGRlZXAsIGJ1dCBmb3IgdGhlIG5leHQgbm9kZSBtaWdodCBiZSAzLi4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIHsKLQlib29sZWFuIGdldENsZWFyQWxsQmxhbmtMaW5lcygpOwotCi0JU3RyaW5nIGdldEN1cnJlbnRJbmRlbnQoKTsKLQotCWJvb2xlYW4gZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKTsKLQotCWJvb2xlYW4gZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpOwotCi0JLyoqIAotCSAqIHNvbWUgc3BlY2lhbCBlbGVtZW50cyBjYW4gaWdub3JlIGNsZWFyaW5nIGJsYW5rIGxpbmVzCi0JICogKi8KLQl2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyk7Ci0KLQl2b2lkIHNldEN1cnJlbnRJbmRlbnQoU3RyaW5nIGN1cnJlbnRJbmRlbnQpOwotCi0Jdm9pZCBzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChib29sZWFuIGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KTsKLQkKLQl2b2lkIHNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoYm9vbGVhbiBpblByZXNlcnZlU3BhY2VFbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlZjE0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotLyoqCi0gKiBUaGVzZSBhcmUgaXRlbXMgdGhhdCBkbyBub3QgY2hhbmdlIGZyb20gZWxlbWVudCB0byBlbGVtZW50LgotICogUGFzc2VkIGZyb20gbm9kZSB0byBub2RlIGluIGEgcmVjdXJzaXZlIGNhbGwgYmVjYXVzZSBzb21ldGltZXMKLSAqIGNoaWxkIG5vZGVzIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgewotCQotCWJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQlTdHJpbmcgZ2V0SW5kZW50KCk7Ci0KLQlpbnQgZ2V0TGluZVdpZHRoKCk7Ci0KLQl2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyk7Ci0KLQl2b2lkIHNldEluZGVudChTdHJpbmcgaW5kZW50KTsKLQotCXZvaWQgc2V0TGluZVdpZHRoKGludCBsaW5lV2lkdGgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4M2FhYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhlIG1haW4gZm9ybWF0dGluZyBlbmdpbmUuICAKLSAqIExvb3BzIHRocm91Z2ggYWxsIHRoZSBub2RlcyBpbiBhbiBJU3RydWN0dXJlZE1vZGVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIHsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGFuIElEb2N1bWVudCBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRG9jdW1lbnQncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBmb3JtYXRzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aCwgdGhlbiByZWxlYXNlcyB0aGUKLQkgKiBtb2RlbC4KLQkgKi8KLQl2b2lkIGZvcm1hdERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhbiBJRmlsZSBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRmlsZSdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGZvcm1hdHMgdGhlIHdob2xlIG1vZGVsLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4KLQkgKi8KLQl2b2lkIGZvcm1hdEZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYSBtb2RlbCBhcyBpbnB1dCwgYW5kIGZvcm1hdHMKLQkgKiB0aGUgd2hvbGUgbW9kZWwuCi0JICovCi0Jdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhIG1vZGVsIGFzIGlucHV0LCBhbmQgZm9ybWF0cwotCSAqIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aC4KLQkgKi8KLQl2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYSBub2RlIGFzIGlucHV0LCBhbmQgZm9ybWF0cyB0aGUKLQkgKiBub2RlIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgotCSAqLwotCXZvaWQgZm9ybWF0Tm9kZShOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhpcyA8Y29kZT5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjwvY29kZT4uCi0JICogVGhlIG1vbml0b3IgaXMgdXNlZCB0byBkaXNwbGF5IHByb2dyZXNzIG9yIGNhbmNlbCBpZiB0aGUgZm9ybWF0dGVyIGlzIHJ1biAKLQkgKiBpbiBhIGJhY2tncm91bmQgam9iLgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0Jdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzIzZDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogS25vd3MgaG93IHRvIGZvcm1hdCBhIHBhcnRpY3VsYXIgbm9kZS4KLSAqIAotICogZWcuIGdlbmVyaWMgbm9kZSwgdGV4dCBub2RlLCBkb2N1bWVudCBub2RlLCBjb21tZW50LCBldGMuLi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZEZvcm1hdHRlciB7Ci0JCi0Jdm9pZCBmb3JtYXQoTm9kZSBub2RlKTsKLQotCXZvaWQgZm9ybWF0KE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpOwotCi0JSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoKTsKLQotCUlTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKTsKLQotCXZvaWQgc2V0Rm9ybWF0UHJlZmVyZW5jZXMoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcyk7Ci0KLQl2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNDdlNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0geG1sOnNwYWNlPSdwcmVzZXJ2ZScgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyB7Ci0JcHJpdmF0ZSBib29sZWFuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRJbmRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiBmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluUHJlc2VydmVTcGFjZUVsZW1lbnQgPSBmYWxzZTsKLQotCXB1YmxpYyBib29sZWFuIGdldENsZWFyQWxsQmxhbmtMaW5lcygpIHsKLQkJcmV0dXJuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50SW5kZW50KCkgewotCQlyZXR1cm4gZkN1cnJlbnRJbmRlbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSB7Ci0JCXJldHVybiBmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzKSB7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMgPSBjbGVhckFsbEJsYW5rTGluZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudEluZGVudChTdHJpbmcgY3VycmVudEluZGVudCkgewotCQlmQ3VycmVudEluZGVudCA9IGN1cnJlbnRJbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoYm9vbGVhbiBmb3JtYXRXaXRoU2libGluZ0luZGVudCkgewotCQlmRm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQgPSBmb3JtYXRXaXRoU2libGluZ0luZGVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkgewotCQlyZXR1cm4gZkluUHJlc2VydmVTcGFjZUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChib29sZWFuIGluUHJlc2VydmVTcGFjZUVsZW1lbnQpIHsKLQkJZkluUHJlc2VydmVTcGFjZUVsZW1lbnQgPSBpblByZXNlcnZlU3BhY2VFbGVtZW50OwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmMWI5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyB7Ci0JcHJpdmF0ZSBib29sZWFuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkluZGVudDsKLQlwcml2YXRlIGludCBmTGluZVdpZHRoOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkgewotCQlyZXR1cm4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZGVudCgpIHsKLQkJcmV0dXJuIGZJbmRlbnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMaW5lV2lkdGgoKSB7Ci0JCXJldHVybiBmTGluZVdpZHRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcykgewotCQlmQ2xlYXJBbGxCbGFua0xpbmVzID0gY2xlYXJBbGxCbGFua0xpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZGVudChTdHJpbmcgaW5kZW50KSB7Ci0JCWZJbmRlbnQgPSBpbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZVdpZHRoKGludCBsaW5lV2lkdGgpIHsKLQkJZkxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvQWJzdHJhY3RNb2RlbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9BYnN0cmFjdE1vZGVsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQ1NTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9BYnN0cmFjdE1vZGVsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5QbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXI7Ci0KLS8qKgotICogSVNTVUU6IG5lZWQgdG8gcHJvdmlkZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gaW1wcm92ZWQgQVBJLgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCXByaXZhdGUgU3RyaW5nIGFzc29jaWF0ZWRDb250ZW50VHlwZUlkOwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0U2V0dGluZzsKLQlwcml2YXRlIFN0cmluZyBtb2RlbEhhbmRsZXJJRDsKLQotCXB1YmxpYyBBYnN0cmFjdE1vZGVsSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVzZSBmYWN0b3JpZXMgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgbW9kZWwgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIGhvbGRGYWN0b3JpZXMgPSBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3JpZXModGhpcyk7Ci0JCWlmIChob2xkRmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCXJlc3VsdC5hZGRBbGwoaG9sZEZhY3Rvcmllcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCkgewotCQlyZXR1cm4gYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gbW9kZWxIYW5kbGVySUQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmYXVsdFNldHRpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQgPSBjb250ZW50VHlwZUlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoYm9vbGVhbiBkZWZhdWx0UGFyYW0pIHsKLQkJZGVmYXVsdFNldHRpbmcgPSBkZWZhdWx0UGFyYW07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCW1vZGVsSGFuZGxlcklEID0gaWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNGQzMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuSlNQQ2FwYWJsZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGVkVHlwZUhhbmRsZXIgewotCi0JLyoqCi0JICogVGhlc2UgQWRhcHRlckZhY3RvcmllcyBhcmUgTk9UIGFkZGVkIHRvIElTdHJ1Y3R1cmVkTW9kZWwncwotCSAqIElBZGFwdGVyRmFjdG9yeSBSZWdpc3RyeSAuLi4gdGhleSBhcmUgZm9yIHVzZSBieSAiSlNQIEF3YXJlCi0JICogQWRhcHRlckZhY3RvcmllcyIgVGhlIGFyZSBhZGRlZCB0byB0aGUgInJlZ2lzdHJ5IiBpbiB0aGUKLQkgKiBQYWdlRGlyZWN0aXZlQWRhcHRlci4KLQkgKi8KLQlMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29udGVudCB0eXBlIGZhbWlseSB0aGlzCi0JICogQ29udGVudFR5cGVEZXNjcmlwdGlvbiBiZWxvbmdzIHRvLgotCSAqLwotCVN0cmluZyBnZXRGYW1pbHlJZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbWltZSB0eXBlcyAoYXMgU3RyaW5ncykgdGhpcyBoYW5kbGVyIGlzIGFwcHJvcHJpYXRlCi0JICogZm9yCi0JICovCi0JTGlzdCBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKTsKLQkKLQkvKioKLQkgKiBJZiB0aGlzIGhhbmRlciBjYW4gaGFuZGxlIGEgZ2l2ZW4gbWltZVR5cGUuCi0JICogCi0JICogVGhpcyBpcyBhIGxvb3NlciBjaGVjayB0aGFuIHNpbXBseSBjaGVja2luZyBpZiBhIGdpdmUgbWltZVR5cGUKLQkgKiBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgdHlwZXMsIHNvIGl0IHNob3VsZCBiZSB1c2VkIHdpdGggdGhhdAotCSAqIGluIG1pbmQuICBUaGF0IGlzLCB0aGUgc3VwcG9ydGVkIG1pbWVUeXBlIGxpc3Qgc2hvdWxkIGlkZWFsbHkgYmUKLQkgKiBjaGVja2VkIGZpcnN0LgotCSAqIAotCSAqIGVnLiBpZiBhIG1pbWUgdHlwZSBlbmRzIHdpdGggIit4bWwiLCBsaWtlIHZvaWNlK3htbAotCSAqICAgICB0aGUgRW1iZWRkZWRYTUwgaGFuZGxlciBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgaXQKLQkgKiAgICAgCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgaGFuZGxlciB0aGlua3MgY2FuIGhhbmRsZSB0aGUgZ2l2ZW4gbWltZVR5cGUKLQkgKi8KLQlib29sZWFuIGNhbkhhbmRsZU1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSk7Ci0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdG8gZ2l2ZSB0aGUgRW1iZWRkZWRDb250ZW50VHlwZSBhbiBvcHBvcnR1bml0eSB0byBhZGQKLQkgKiBmYWN0b3JpZXMgZGlyZWN0bHkgdG8gdGhlIElTdHJ1Y3R1cmVkTW9kZWwncyBJQWRhcHRlckZhY3RvcnkgcmVnaXN0cnkuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSk7Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplUGFyc2VyIEl0cyBwdXJwb3NlIGlzIHRvIHNldEJsb2NrVGFncwotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcik7Ci0KLQlib29sZWFuIGlzRGVmYXVsdCgpOwotCi0JRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdJbnN0YW5jZSgpOwotCi0Jdm9pZCB1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLQotCXZvaWQgdW5pbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9JRG9jdW1lbnRUeXBlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODYyYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGFsbG93IGN1c3RvbSBjb250ZW50IHR5cGVzIHRvIGJlIGRlZmluZWQgYXMgZXh0ZW5zaW9uIHBvaW50cwotICogaW4gcGx1Z2lucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRUeXBlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBUaGUgTG9hZGVyIGlzIHJlcG9uc2libGUgZm9yIGRlY29kaW5nIHRoZSBSZXNvdXJjZSwKLQkgKi8KLQlJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gbGlrZWx5IHRvIGdvIGF3YXksIHNvIEkgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8KLQkgKiAgICAgICAgICAgICBkaXNjb3Vyc2FnZSB1c2UKLQkgKi8KLQlJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpOwotCi0JLyoqCi0JICogTXVzdCByZXR1cm4gdW5pcXVlIElEIHRoYXQgaXMgdGhlIHNhbWUgYXMgaWRlbnRpZmllZCBpbiBwbHVnaW4gcmVnaXN0cnkKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9JTW9kZWxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvSU1vZGVsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk0N2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9JTW9kZWxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxIYW5kbGVyIGV4dGVuZHMgSURvY3VtZW50VHlwZUhhbmRsZXIgewotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gRmFjdG9yaWVzIHdoaWNoIGFyZSBhZGRlZCBhdXRvbWF0aWNhbGx5IGJ5Ci0JICogSU1vZGVsTWFuYWdlci4gVGhpcyBjYW4gYW5kIHdpbGwgb2Z0ZW4gYmUgYW4gZW1wdHkgTGlzdCAob3IgbnVsbCksCi0JICogc2luY2Ugc29tZSBBZGFwdGVyRmFjdG9yaWVzIG11c3QgYmUgYWRkZWQgYnkgTG9hZGVyIGRpcmVjdGx5LCBhbmQgbW9zdAotCSAqIHNob3VsZCBiZSBhZGRlZCBieSBFZGl0b3JzLiBGb3JtYXRBZGFwdGVyRmFjdG9yeSBpcyBhbiBleGFtcGxlIG9mIG9uZQotCSAqIHRoYXQgY2FuIGJlIHJldHVybmVkIGhlcmUsIHNpbmNlIHRoZSB0aW1pbmcgb2YgYWRkaW5nIGl0IGlzIG5vdAotCSAqIGNyaXRpY2FsLCBidXQgaXQgbWF5IGJlIG5lZWRlZCBldmVuIHdoZW4gYW4gZWRpdG9yIGlzIG5vdCBiZWluZyB1c2VkLgotCSAqLwotCUxpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgZm9yIHRoZSBhc3NvY2lhdGVkIENvbnRlbnRUeXBlSGFuZGxlciBCdXQgaXMgbmVlZGVkIGZvcgotCSAqIG5vdy4KLQkgKi8KLQlTdHJpbmcgZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKTsKLQotCS8qKgotCSAqIFRoZSBMb2FkZXIgaXMgcmVwb25zaWJsZSBmb3IgZGVjb2RpbmcgdGhlIFJlc291cmNlLAotCSAqLwotCUlNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja01hcmtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrTWFya2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OGIzNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogSVNTVUU6IG5lZWQgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IGluIGltcHJvdmVkIEFQSS4gCi0gKi8KLXB1YmxpYyBjbGFzcyBCbG9ja01hcmtlciBleHRlbmRzIFRhZ01hcmtlciB7Ci0KLQkvLyBhbGxvdyBmb3IgSlNQIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgYmxvY2sKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmQWxsb3dKU1AgPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkNhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotCS8vIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudHMgb2YgdGhpcyB0YWcgKEJMT0NLX1RFWFQsIEpTUF9DT05URU5ULAotCS8vIGV0Yy4pCi0JcHJvdGVjdGVkIFN0cmluZyBmQ29udGV4dDsKLQotCXB1YmxpYyBCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSwgSVRleHRSZWdpb24gbWFya2VyLCBTdHJpbmcgY29udGV4dCkgewotCQl0aGlzKHRhZ05hbWUsIG1hcmtlciwgY29udGV4dCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lLCBJVGV4dFJlZ2lvbiBtYXJrZXIsIFN0cmluZyBjb250ZXh0LCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJdGhpcyh0YWdOYW1lLCBtYXJrZXIsIGNvbnRleHQsIGNhc2VTZW5zaXRpdmUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSwgSVRleHRSZWdpb24gbWFya2VyLCBTdHJpbmcgY29udGV4dCwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlLCBib29sZWFuIGFsbG93SlNQKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIG1hcmtlcik7Ci0JCXNldENvbnRleHQoY29udGV4dCk7Ci0JCXNldENhc2VTZW5zaXRpdmUoY2FzZVNlbnNpdGl2ZSk7Ci0JCXNldEFsbG93SlNQKGFsbG93SlNQKTsKLQl9Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUsIFN0cmluZyByZWdpb25Db250ZXh0LCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJdGhpcyh0YWdOYW1lLCBudWxsLCByZWdpb25Db250ZXh0LCBjYXNlU2Vuc2l0aXZlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWxsb3dKU1AuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFsbG93c0pTUCgpIHsKLQkJcmV0dXJuIGZBbGxvd0pTUDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGZDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGZDYXNlU2Vuc2l0aXZlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFsbG93SlNQLgotCSAqIAotCSAqIEBwYXJhbSBhbGxvd0pTUAotCSAqICAgICAgICAgICAgVGhlIGFsbG93SlNQIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93SlNQKGJvb2xlYW4gYWxsb3dKU1ApIHsKLQkJZkFsbG93SlNQID0gYWxsb3dKU1A7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIHNlbnNpdGl2ZSkgewotCQlmQ2FzZVNlbnNpdGl2ZSA9IHNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgY29udGV4dCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCWZDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1RhZ1BhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrVGFnUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDZiNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrVGFnUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQmxvY2tUYWdQYXJzZXIgewotCi0Jdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpOwotCi0Jdm9pZCBiZWdpbkJsb2NrU2NhbihTdHJpbmcgdGFnTmFtZSk7Ci0KLQlCbG9ja01hcmtlciBnZXRCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSk7Ci0KLQlMaXN0IGdldEJsb2NrTWFya2VycygpOwotCi0Jdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpOwotCi0Jdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWFkNTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1Rva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQmxvY2tUb2tlbml6ZXIgewotCi0Jdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpOwotCi0Jdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGNvbnRleHQpOwotCi0Jdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSk7Ci0KLQlMaXN0IGdldEJsb2NrTWFya2VycygpOwotCi0JSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JaW50IGdldE9mZnNldCgpOwotCi0JYm9vbGVhbiBpc0VPRigpOwotCi0JQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKTsKLQotCXZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKTsKLQotCXZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpOwotCi0Jdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KTsKLQotCXZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCk7Ci0KLQl2b2lkIHJlc2V0KElucHV0U3RyZWFtIGluKTsKLQotCXZvaWQgcmVzZXQoSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpOwotCi0Jdm9pZCByZXNldChSZWFkZXIgaW4pOwotCi0Jdm9pZCByZXNldChSZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0lCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlYWIwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0vKioKLSAqIElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGp1c3QgbGlrZSBhbiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0gKiBleGNlcHQgcmVzdWx0cyBmcm9tIHBhcnNpbmcgYSAiYmxvY2sgdGFnIiAoc3VjaCBhcyBTQ1JJUFQgb3IgU1RZTEUpLgotICogQmVjYXVzZSB0aGVzZSBhcmUgInZhcmlhYmxlIiBwYXJ0aXRpb24gdHlwZXMsIGl0cyBvZnRlbiBoYW5keSAoZWZmaWNpZW50KQotICogdG8ga2VlcCB0cmFjayBvZiB0aGUgcGFydGl0aW9uIHR5cGUuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXJ0aW9uIHR5cGUgZm9yIHRoaXMgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcnRpb24gdHlwZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFydGlvbiB0eXBlLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmUtcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICovCi0Jdm9pZCBzZXRQYXJ0aXRpb25UeXBlKFN0cmluZyBwYXJ0aXRpb25UeXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9KU1BDYXBhYmxlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSlNQQ2FwYWJsZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU1OTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9KU1BDYXBhYmxlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBKU1BDYXBhYmxlUGFyc2VyIGV4dGVuZHMgUmVnaW9uUGFyc2VyLCBCbG9ja1RhZ1BhcnNlciB7Ci0Jdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKTsKLQotCS8qKgotCSAqIHJldHVybnMgdGhlIFRhZ01hcmtlcnMgZm9yIHByZWZpeGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgbmVzdGFibGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCk7Ci0KLQl2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyB0YWdOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9SZWdpb25QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9SZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4ZGZjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvUmVnaW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUmVnaW9uUGFyc2VyIHsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0KLQlMaXN0IGdldFJlZ2lvbnMoKTsKLQotCS8qKgotCSAqIFRoZSAnbmV3SW5zdGFuY2UnIG1ldGhvZCBpcyBzaW1pbGFyIHRvICdjbG9uZScsIGJ1dCBkb2VzIG5vdCBpbmNsdWRlCi0JICogdGhlIGNvcHlpbmcgb2YgYW55IGNvbnRlbnQuIEZvciBhIHB1cmUgUmVnaW9uUGFyc2VyIGl0c2VsZiwgdGhlcmUgd291bGQKLQkgKiBiZSBsaXR0bGUgc3RhdGUgdG8gImNsb25lIiwgYnV0IGZvciBzb21lIHN1YnR5cGVzLCBzdWNoIGFzCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGFuZCBKU1BDYXBhYmxlUGFyc2VyLCB0aGVyZSBjb3VsZCB0aGUKLQkgKiBtb3JlIGludGVybmFsIGRhdGEgdG8gImNsb25lIiwgc3VjaCBhcyB0aGUgaW50ZXJuYWwgdG9rZW5pemVyIHNob3VsZCBiZQotCSAqIGNsb25lZCAoaW5jbHVkaW5nIGJsb2NrIHRhZ3MsIGV0YykuCi0JICovCi0JUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCk7Ci0KLQl2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpOwotCi0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBvZmZzZXQgZm9yIHVzZSB3aXRoIGFueSBwb3NpdGlvbi1kZXBlbmRhbnQgcGFyc2luZyBydWxlcwotCSAqLwotCXZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlciwgaW50IG9mZnNldCk7Ci0KLQl2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCk7Ci0KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIG9mZnNldCBmb3IgdXNlIHdpdGggYW55IHBvc2l0aW9uLWRlcGVuZGFudCBwYXJzaW5nIHJ1bGVzCi0JICovCi0Jdm9pZCByZXNldChTdHJpbmcgaW5wdXQsIGludCBvZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTVjYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCi0JLy8gU2VudCB3aGVuIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBmaXJzdCBwYXJzZWQKLQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JLy8gU2VudCB3aGVuIHRoZSBjYWxsaW5nIHBhcnNlcidzIG1vZGVsIHVuZGVyZ29lcyBhIGZ1bGwgcmVzZXQKLQkvLyAgIGFuZCBhbnkgaW5mb3JtYXRpb24gYmFzZWQgdXBvbiB0aGUgb2xkIG1vZGVsIHNob3VsZCBiZQotCS8vICAgY2xlYXJlZAotCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWYyZDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGJiZTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGV4dGVuZHMgUmVnaW9uUGFyc2VyIHsKLQotCXZvaWQgYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGhhbmRsZXIpOwotCi0Jdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlcik7Ci0KLQl2b2lkIHJlc2V0SGFuZGxlcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0OTUwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpc3Qgb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgbGlzdGVuaW5nCi0JICogdG8gdGhpcyBwYXJzZXIuCi0JICogCi0JICogQHJldHVybiBMaXN0IC0gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLCB0aGUgbGlzdCBtYXkgbm90IGJlIG51bGwgYW5kIGVhY2gKLQkgKiAgICAgICAgIGVsZW1lbnQgaW4gaXQgbXVzdCBpbXBsZW1lbnQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcgotCSAqLwotCUxpc3QgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9UYWdNYXJrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9UYWdNYXJrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlMjI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvVGFnTWFya2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiBJU1NVRTogbmVlZCB0byBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgaW4gaW1wcm92ZWQgQVBJLiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVGFnTWFya2VyIHsKLQotCS8vIGEgSVRleHRSZWdpb24gKG1lYW50IHRvIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbW9kZWwpIG1hcmtpbmcgdGhlIHBvc2l0aW9uCi0JLy8gd2hlcmUgdGhpcyB0YWduYW1lIGJlY29tZXMgZWZmZWN0aXZlCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGZNYXJrZXIgPSBudWxsOwotCi0JLy8gdGhlIHRhZ25hbWUKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUYWdOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgVGFnTWFya2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUYWdNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGFnTmFtZSh0YWduYW1lKTsKLQl9Ci0KLQlwdWJsaWMgVGFnTWFya2VyKFN0cmluZyB0YWduYW1lLCBJVGV4dFJlZ2lvbiBtYXJrZXIpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGFnTmFtZSh0YWduYW1lKTsKLQkJc2V0TWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE1hcmtlcigpIHsKLQkJcmV0dXJuIGZNYXJrZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlyZXR1cm4gZlRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKSB7Ci0JCXJldHVybiBmTWFya2VyID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld01hcmtlcgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldE1hcmtlcihJVGV4dFJlZ2lvbiBuZXdNYXJrZXIpIHsKLQkJZk1hcmtlciA9IG5ld01hcmtlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VGFnbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJZlRhZ05hbWUgPSBuZXdUYWdOYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWZhYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUYWdQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYSBmaWxlIGFuZCBjcmVhdGVzIGFuIFN0cnVjdHVyZWQgTW9kZWwuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsTG9hZGVyIGltcGxlbWVudHMgSU1vZGVsTG9hZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBlbmNvZGluZ05hbWVTZWFyY2hMaW1pdCA9IDEwMDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBsb25nIGNvbXB1dGVNZW0oKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQlTeXN0ZW0uZ2MoKTsKLQkJCVN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKLQkJfQotCQlyZXR1cm4gUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSURvY3VtZW50TG9hZGVyIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdExvYWRlciBjb25zdHJ1Y3RvciBhbHNvIGluaXRpYWxpemVzIGVuY29kaW5nIGNvbnZlcnRlci9tYXBwZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgTGlzdCBmYWN0b3J5TGlzdCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1vZGVsKTsKLQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnksICJJU3RydWN0dXJlZE1vZGVsICIgKyBtb2RlbC5nZXRJZCgpICsgIiBoYXMgYSBudWxsIEZhY3RvcnlSZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKGZhY3RvcnlMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmFjdG9yeUxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcGVyZm9ybSBhbGwgdGhlIG1vZGVsIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGJlZm9yZQotCSAqIGl0IGNvbnRhaW5zIGNvbnRlbnQsIG5hbWVseSwgaXQgc2hvdWxkIGNhbGwgbmV3TW9kZWwsIHRoZQotCSAqIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpLCB0aGVuIGFkZCB0aG9zZSBhZGFwdGVyIGZhY3RvcmllcyB3aGljaAotCSAqIG11c3QgYmUgc2V0IGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkKLQkgKiAibG9hZCIgbWV0aG9kLiAodGhpcyBpcyB0ZW50YXRpdmUgQVBJKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ld01vZGVsKCk7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCW1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCWFkZEZhY3Rvcmllcyhtb2RlbCwgZ2V0QWRhcHRlckZhY3RvcmllcygpKTsKLQkJCS8vCi0JCQlpbml0RW1iZWRkZWRUeXBlUHJlKG1vZGVsLCAoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCWluaXRFbWJlZGRlZFR5cGVQb3N0KG1vZGVsKTsKLQkJCS8vIEZvciB0eXBlcyB3aXRoIHByb3BhZ2F0aW5nIGFkYXB0ZXJzLCBpdHMgaW1wb3J0YW50Ci0JCQkvLyB0aGF0IHRoZSBwcm9wYWdhdGluZyBhZGFwdGVyIGJlIGluIHBsYWNlIGJlZm9yZSB0aGUgY29udGVudHMKLQkJCS8vIGFyZSBzZXQuCi0JCQlwcmVMb2FkQWRhcHQobW9kZWwpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgSU1vZGVsSGFuZGxlciBoYW5kbGVyKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbmV3TW9kZWwoKTsKLQkJbW9kZWwuc2V0QmFzZUxvY2F0aW9uKGJhc2VMb2NhdGlvbik7Ci0JCQotCQkvLyBoYW5kbGVyIG11c3QgYmUgc2V0IGVhcmx5LCBpbmNhc2UgYSByZS1pbml0IGlzIAotCQkvLyByZXF1aXJlZCBkdXJpbmcgY3JlYXRpb24uCi0JCW1vZGVsLnNldE1vZGVsSGFuZGxlcihoYW5kbGVyKTsKLQkJCi0JCWFkZEZhY3Rvcmllcyhtb2RlbCwgZ2V0QWRhcHRlckZhY3RvcmllcygpKTsKLQkJLy8gRm9yIHR5cGVzIHdpdGggcHJvcGFnYXRpbmcgYWRhcHRlcnMsIGl0J3MgaW1wb3J0YW50Ci0JCS8vIHRoYXQgdGhlIHByb3BhZ2F0aW5nIGFkYXB0ZXIgYmUgaW4gcGxhY2UgYmVmb3JlIHRoZSBjb250ZW50cwotCQkvLyBhcmUgc2V0LgotCQlwcmVMb2FkQWRhcHQobW9kZWwpOwotCQlpbml0RW1iZWRkZWRUeXBlUHJlKG1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCW1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLwotCQlpbml0RW1iZWRkZWRUeXBlUG9zdChtb2RlbCk7Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNsb25pbmcgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpIHsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBuZXdNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IG9sZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudC5uZXdJbnN0YW5jZSgpOwotCQluZXdNb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8gTk9URTogd2UgRE8gTk9UIHNpbXBseSBhZGQgdGhlIHN0YW5kYXJkIG9uZXMgdG8gdGhlIG5ldyBtb2RlbAotCQkvLyBhZGRGYWN0b3JpZXMobmV3TW9kZWwsIGdldEFkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCS8vIE5vdywgd2UgdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gYWRkIEZhY3RvcmllcyBmcm9tIHRoZSBvbGRNb2RlbCdzCi0JCS8vIHJlZ2lzdHJ5IHRvIHRoZSBuZXcgbW9kZWwncyByZWdpc3RyeSAuLiBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5Ci0JCS8vIGV4aXN0IHRoZXJlLgotCQlkdXBsaWNhdGVGYWN0b3J5UmVnaXN0cnkobmV3TW9kZWwsIG9sZE1vZGVsKTsKLQkJaWYgKG5ld01vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIG5ld01vZGVsKS5zZXRDb250ZW50VHlwZUlkZW50aWZpZXIob2xkTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQl9Ci0JCS8vIGFkZEZhY3RvcmllcyhuZXdNb2RlbCwgb2xkTW9kZWwpOwotCQlpbml0RW1iZWRkZWRUeXBlKG9sZE1vZGVsLCBuZXdNb2RlbCk7Ci0JCS8vIEZvciB0eXBlcyB3aXRoIHByb3BhZ2F0aW5nIGFkYXB0ZXJzLCBpdHMgaW1wb3J0YW50Ci0JCS8vIHRoYXQgdGhlIHByb3BhZ2F0aW5nIGFkYXB0ZXIgYmUgaW4gcGxhY2UgYmVmb3JlIHRoZSBjb250ZW50cwotCQkvLyBhcmUgc2V0LgotCQlwcmVMb2FkQWRhcHQobmV3TW9kZWwpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGR1cGxpY2F0ZUZhY3RvcnlSZWdpc3RyeShJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsKSB7Ci0JCUxpc3Qgb2xkQWRhcHRlckZhY3RvcmllcyA9IG9sZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcmllcygpOwotCQlMaXN0IG5ld0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIG9sZExpc3RJdGVyYXRvciA9IG9sZEFkYXB0ZXJGYWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG9sZExpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlOb2RlQWRhcHRlckZhY3Rvcnkgb2xkQWRhcHRlckZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgb2xkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIG5vdyAiY2xvbmUiIHRoZSBhZGFwdGVyZmFjdG9yeQotCQkJbmV3QWRhcHRlckZhY3Rvcmllcy5hZGQob2xkQWRhcHRlckZhY3RvcnkuY29weSgpKTsKLQkJfQotCQkvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSAiY2xvbmVkIiBsaXN0LCBhZGQgdG8gbmV3IG1vZGVsCi0JCWFkZEZhY3RvcmllcyhuZXdNb2RlbCwgbmV3QWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhvc2UgZmFjdG9yaWVzIHdoaWNoIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlCi0JICogc3RydWN0dXJlZE1vZGVsIGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJLy8gYWJzdHJhY3QgbWV0aG9kIHJldHVybnMgbm9uZQotCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgaW5pdEVtYmVkZGVkVHlwZSwgInByZSItc3RhZ2UuIE5vdGhpbmcgdG8gZG8gaGVyZSBpbiBzdXBlciBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlUHJlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaW5pdEVtYmVkZGVkVHlwZSwgInByZSItc3RhZ2UuIEJ5IGRlZmF1bHQgc2ltcGx5IGNhbGxzIHRoZQotCSAqIHZlcnNpb24gb2YgdGhpcyBtZXRob2QgdGhhdCB1c2VzIG9ubHkgdGhlIHN0cnVjdHVyZWQgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICB0aGUgbW9kZWwgZm9yIHdoaWNoIHRvIGluaXRpYWxpemUKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50Ci0JICogICAgICAgICAgICBUaGUgc3RydWN0dXJlZCBkb2N1bWVudCBjb250YWluaW5nIHRoZSB0ZXh0IGNvbnRlbnQgZm9yIHRoZQotCSAqICAgICAgICAgICAgbW9kZWwsIHdoaWNoIG1heSBiZSBhIGRpZmZlcmVudCBpbnN0YW5jZSB0aGFuIHdoYXQgaXMgaW4gdGhlCi0JICogICAgICAgICAgICBtb2RlbCBhdCB0aGlzIHN0YWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRFbWJlZGRlZFR5cGVQcmUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJaW5pdEVtYmVkZGVkVHlwZVByZShtb2RlbCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlUG9zdChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUuIE5vdGhpbmcgdG8gZG8gaGVyZSBpbiBzdXBlciBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTW9kZWwKLQkgKiBAcGFyYW0gbmV3TW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQllbHNlCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlKTsKLQotCQkvLyBUT0RPOiBuZWVkIHRvIHN0cmFpZ2h0ZW4gb3V0IElFbmNvZGVkRG9jdW1lbnQgbWVzcwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXRyYW5zZm9ybUluc3RhbmNlKG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCAoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJZWxzZQotCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0KHN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0KLQkJLy8gb3JpZ2luYWwgaGFjawotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vICgoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5maXJlTmV3RG9jdW1lbnQodGhpcyk7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQkvLyB0ZWNobmljcSBvZiBmdXR1cmUKLQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyBkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGUgd2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGFzc3VtZSdzIG1vZGVsIGhhcyBiZWVuIGluaXRpYWxpemVkIGFscmVhZHkgd2l0aCBiYXNlIGxvY2F0aW9uCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSwgaW5wdXRTdHJlYW0sIGVuY29kaW5nUnVsZSk7Ci0JCQkvLyBUT0RPOiBtb2RlbCdzIG5vdCBkZXNpZ25lZCBmb3IgdGhpcyEKLQkJCS8vIHdlIHdhbnQgdG8gbW92ZSB0byB0aGlzICJzZXQiIG1ldGhvZCwgYnV0IHRoZSAnZmlyZScgd2FzIG5lZWRlZAotCQkJLy8gYXMKLQkJCS8vIGEgd29yayBhcm91bmQgZm9yIHN0cnVjdXRyZWRNb2RlbCBub3QgaGFuZGxpbmcgJ3NldCcgcmlnaHQsIGJ1dAotCQkJLy8gdGhhdCAnZmlyZU5ld0RvY3VtZW50JyBtZXRob2Qgd2FzIGNhdXNpbmcgdW5iYWxhbmNlCi0JCQkvLyAiYWJvdXRUb0NoYW5nZSIgYW5kICJjaGFuZ2VkIgotCQkJLy8gZXZlbnRzLgotCQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCS8vICgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJCS8vIHN0cnVjdHVyZWREb2N1bWVudCkuZmlyZU5ld0RvY3VtZW50KHRoaXMpOwotCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0KHN0cnVjdHVyZWREb2N1bWVudC5nZXQoKSk7Ci0KLQkJfQotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQotCX0KLQotCS8qKgotCSAqIGRlcHJlY2F0ZWQgLS0gdXNlIEVuY29kaW5nUnVsZSBmb3JtCi0JICovCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyBlbmNvZGluZ05hbWUsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGUgd2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQkvLyBURU1QIHdvcmsgYXJvdW5kIHRvIG1haW50YWluIHByZXZpb3VzIGZ1bmN0aW9uLAotCQkvLyB1bnRpbCBldmVyeW9uZSBjYW4gY2hhbmdlIHRvIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUCi0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCAmJiBlbmNvZGluZ05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCS8vIHJlZGlyZWN0IHRvIG5ldyBtZXRob2QKLQkJCWxvYWQoaW5wdXRTdHJlYW0sIG1vZGVsLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsb2FkKGlucHV0U3RyZWFtLCBtb2RlbCwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBTdHJpbmcganVuaywgU3RyaW5nIGR1bW15KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLQkJbG9uZyBtZW1vcnlVc2VkID0gMDsKLQkJaWYgKERFQlVHKSB7Ci0JCQltZW1vcnlVc2VkID0gY29tcHV0ZU1lbSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJtZWFzdXJpbmcgaGVhcCBtZW1vcnkgZm9yICIgKyBmaWxlbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGVhcCBtZW1vcnkgdXNlZCBiZWZvcmUgbG9hZDogIiArCi0JCQkvLyBtZW1vcnlVc2VkKTsKLQkJfQotCi0JCS8vIGR1cmluZyBhbiBpbml0aWFsIGxvYWQsIHdlIGV4cGVjdCB0aGUgb2xkZG9jdW1lbnQgdG8gYmUgZW1wdHkKLQkJLy8gZHVyaW5nIHJlLWxvYWQsIGhvd2V2ZXIsIGl0IHdvdWxkIGJlIGZ1bGwuCi0JCUlFbmNvZGVkRG9jdW1lbnQgbmV3c3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQkJSUVuY29kZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkvLyBnZXQgbmV3IGRvY3VtZW50Ci0JCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQluZXdzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3c3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJfQotCQlpZiAoREVCVUcpIHsKLQkJCWxvbmcgbWVtb3J5QXRFbmQgPSBjb21wdXRlTWVtKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhlYXAgbWVtb3J5IHVzZWQgYWZ0ZXIgbG9hZGluZyBuZXcKLQkJCS8vIGRvY3VtZW50OiAiICsgbWVtb3J5QXRFbmQpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgaGVhcCBtZW1vcnkgaW1wbGllZCB1c2VkIGJ5IGRvY3VtZW50OiAiICsgKG1lbW9yeUF0RW5kIC0gbWVtb3J5VXNlZCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCi0JCS8vIFRPRE86IG5lZWQgdG8gc3RyYWlnaHRlbiBvdXQgSUVuY29kZWREb2N1bWVudCBtZXNzCi0JCWlmIChuZXdzdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQl0cmFuc2Zvcm1JbnN0YW5jZSgoSVN0cnVjdHVyZWREb2N1bWVudCkgb2xkU3RydWN0dXJlZERvY3VtZW50LCAoSVN0cnVjdHVyZWREb2N1bWVudCkgbmV3c3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdlIGRvbid0IHJlYWxseSBleHBlY3QgdGhpcyBjYXNlLCBqdXN0IGluY2x1ZGVkIGZvciBzYWZldHkKLQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudC5zZXQobmV3c3RydWN0dXJlZERvY3VtZW50LmdldCgpKTsKLQkJfQotCQkvLyBvcmlnaW5hbCBoYWNrCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8gKChJU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLmZpcmVOZXdEb2N1bWVudCh0aGlzKTsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCS8vIHRlY2huaWNxIG9mIGZ1dHVyZQotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vIGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQlpZiAoREVCVUcpIHsKLQkJCWxvbmcgbWVtb3J5QXRFbmQgPSBjb21wdXRlTWVtKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhlYXAgbWVtb3J5IHVzZWQgYWZ0ZXIgc2V0dGluZyB0byBtb2RlbDogIgotCQkJLy8gKyBtZW1vcnlBdEVuZCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBoZWFwIG1lbW9yeSBpbXBsaWVkIHVzZWQgYnkgZG9jdW1lbnQgYW5kIG1vZGVsOiAiICsgKG1lbW9yeUF0RW5kIC0gbWVtb3J5VXNlZCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlcXVpcmVkIGJ5IGludGVyZmFjZSwgYmVpbmcgZGVjbGFyZWQgaGVyZSBhYnN0cmFjdGx5IGp1c3QgYXMgYW5vdGhlcgotCSAqIHJlbWluZGVyLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCk7Ci0KLQkvKioKLQkgKiBUaGVyZSdzIG5vdGhpbmcgdG8gZG8gaGVyZSBpbiBhYnN0cmFjdCBjbGFzcyBmb3IgaW5pdGlhbGl6aW5nIGFkYXB0ZXJzLgotCSAqIFN1YmNsYXNzZXMgY2FuIGFuZCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHByb3ZpZGUgcHJvcGVyCi0JICogaW50aWFsaXphdGlvbiAoRm9yIGV4YW1wbGUsIHRvIGdldCBET00gZG9jdW1lbnQgYW5kICdnZXRBZGFwdGVyJyBvbiBpdCwKLQkgKiBzbyB0aGF0IHRoZSBmaXJzdCBub2RlL25vdGlmaWVyIGhhcyB0aGUgYWRhcHRlciBvbiBpdC4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQotCX0KLQotCS8qKgotCSAqIE5vcm1hbGx5LCBoZXJlIGluIHRoZSBhYnN0YWN0IGNsYXNzLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8sIGJ1dCB3ZSB3aWxsCi0JICogcmVzZXQgdGV4dCwgc2luY2UgdGhpcyBNSUdIVCBlbmQgdXAgYmVpbmcgY2FsbGVkIHRvIHJlY292ZXIgZnJvbSBlcnJvcgotCSAqIGNvbmRpdGlvbnMgKGUuZy4gSVN0cnVjdHVyZWREb2N1bWVudCBleGNlcHRpb25zKSBBbmQsIGNhbiBiZSBjYWxsZWQgYnkKLQkgKiBzdWJjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIHJlaW5pdGlhbGl6ZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCS8vIE5vdGU6IHRoZSAibWluaW11bWl6YXRpb24iIHJvdXRpbmVzCi0JCS8vIG9mICdyZXBsYWNlVGV4dCcgYWxsb3cgbWFueSBvbGQgbm9kZXMgdG8gcGFzcyB0aHJvdWdoLCB3aGVuCi0JCS8vIHJlYWxseSBpdHMgYXNzdW1lZCB0aGV5IGFyZSBjcmVhdGVkIGFuZXcuCi0JCS8vIHNvIHdlIG5lZWQgdG8gdXNlICdzZXRUZXh0JyAoSSB0aGluayAic2V0VGV4dCcgZW5kcyB1cAotCQkvLyB0aHJvd2luZyBhICduZXdNb2RlbCcgZXZlbnQgdGhvdWdoLCB0aGF0IG1heSBoYXZlIHNvbWUKLQkJLy8gaW1wbGljYXRpb25zLgotCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXRUZXh0KHRoaXMsIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhLCBhbmQgcmVwb3B1bGF0ZXMgdGhlIG1vZGVscwotCSAqIC4uLiBieSBhIGNhbGwgdG8gc2V0VGV4dCBvbiB0aGUgc3RydWN0dXJlZERvY3VtZW50LiBUaGlzIG1ldGhvZCBpcwotCSAqIG5lZWRlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGNsaWVudHMgYXJlIHNoYXJpbmcgYSBtb2RlbCBhbmQgdGhlbiBjaGFuZ2VzCi0JICogY2FuY2VsZWQuIFNheSBmb3IgZXhhbXBsZSwgb25lIGVkaXRvciBhbmQgc2V2ZXJhbCAiZGlzcGxheXMiIGFyZQotCSAqIHNoYXJpbmcgYSBtb2RlbCwgaWYgdGhlIGVkaXRvciBpcyBjbG9zZWQgd2l0aG91dCBzYXZpbmcgY2hhbmdlcywgdGhlbgotCSAqIHRoZSBkaXNwbGF5cyBzdGlsbCBuZWVkIGEgbW9kZWwsIGJ1dCB0aGV5IHNob3VsZCByZXZlcnQgdG8gdGhlIG9yaWdpbmFsCi0JICogdW5zYXZlZCB2ZXJzaW9uLgotCSAqLwotCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCQl0cnkgewotCQkJLy8gdGVtcCBzb2x1dGlvbiAuLi4gd2Ugc2hvdWxkIGJlIGFibGUgdG8gZG8gYmV0dGVyIChtb3JlCi0JCQkvLyBlZmZpY2llbnQpIGluIGZ1dHVyZS4KLQkJCS8vIEFkYXB0ZXJzIHdpbGwgKHByb2JhYmx5KSBuZWVkIHRvIGJlIHNlbnNpdGl2ZSB0byB0aGUgZmFjdCB0aGF0Ci0JCQkvLyB0aGUgZG9jdW1lbnQgaW5zdGFuY2UgY2hhbmdlZAotCQkJLy8gKGJ5IGJlaW5nIGxpZmUgY3ljbGUgbGlzdGVuZXJzKQotCQkJbG9hZChpbnB1dFN0cmVhbSwgc3RydWN0dXJlZE1vZGVsLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0KLQkJCS8vIC8vIE5vdGU6IHdlIGFwcGFyZW50bHkgcmVhZCB0aGUgZGF0YSAoYW5kIGVuY29kaW5nKSBjb3JyZWN0bHkKLQkJCS8vIC8vIGJlZm9yZSwgd2UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBmb2xsb3dlZCB0aGUgc2FtZSBydWxlCi0JCQkvLyBhcwotCQkJLy8gLy8gYmVmb3JlLgotCQkJLy8gRW5jb2RpbmdNZW1lbnRvIHByZXZpb3VzTWVtZW50byA9Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQkvLyBFbmNvZGluZ1J1bGUgcHJldmlvdXNSdWxlID0gcHJldmlvdXNNZW1lbnRvLmdldEVuY29kaW5nUnVsZSgpOwotCQkJLy8gLy9JRmlsZSBmaWxlID0gUmVzb3VyY2VVdGlsLmdldEZpbGVGb3Ioc3RydWN0dXJlZE1vZGVsKTsKLQkJCS8vIC8vIE5vdGU6IHRoZXJlJ3Mgb3Bwb3J0dW5pdHkgaGVyZSBmb3Igc29tZSBvZGQgYmVoYXZpb3IsIGlmIHRoZQotCQkJLy8gLy8gc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkIGZyb20gdGhlIGZpcnN0IGxvYWQgdG8gdGhlIHJlbG9hZC4KLQkJCS8vIEJ1dCwKLQkJCS8vIC8vIGhvcGVmdWxseSwKLQkJCS8vIC8vIHdpbGwgcmVzdWx0IGluIHRoZSBpbnRlbmRlZCBiZWhhdmlvci4KLQkJCS8vIFJlYWRlciBhbGxUZXh0UmVhZGVyID0KLQkJCS8vIGdldERvY3VtZW50TG9hZGVyKCkucmVhZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBwcmV2aW91c1J1bGUpOwotCQkJLy8KLQkJCS8vIC8vIFRPRE86IGF2b2lkIHVzZSBvZiBTdHJpbmcgaW5zdGFuY2UKLQkJCS8vIGdldERvY3VtZW50TG9hZGVyKCkucmVsb2FkKHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwKLQkJCS8vIGFsbFRleHRSZWFkZXIpOwotCQkJLy8gLy8gYW5kIG5vdyAicmVzZXQiIGVuY29kaW5nIG1lbWVudG8gdG8ga2VlcCBpdCBjdXJyZW50IHdpdGggdGhlCi0JCQkvLyAvLyBvbmUKLQkJCS8vIC8vIHRoYXQgd2FzIGp1c3QgZGV0ZXJtaW5lZC4KLQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXRFbmNvZGluZ01lbWVudG8oZ2V0RG9jdW1lbnRMb2FkZXIoKS5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQkvLyBTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NZ3IgPQotCQkJLy8gc3RydWN0dXJlZE1vZGVsLmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQkvLyBpZiAodW5kb01nciAhPSBudWxsKSB7Ci0JCQkvLyB1bmRvTWdyLnJlc2V0KCk7Ci0JCQkvLyB9Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gY291bGRuJ3QgaGFwcGVuLiBUaGUgcHJvZ3JhbSBoYXMgYXBwYXJlbnRseQotCQkJLy8gcmVhZCB0aGUgbW9kZWwgb25jZSwgYW5kIHRoZXJlJ2QgYmUgbm8gcmVhc29uIHRoZSBlbmNvZGluZwotCQkJLy8gY291bGQgbm90IGJlIHVzZWQgYWdhaW4uCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJXYXJuaW5nOiAgWE1MTG9hZGVyOjpyZWxvYWQuICBUaGlzIGV4Y2VwdGlvbiByZWFsbHkgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkISEgQnV0IHdpbGwgYXR0ZW1wIHRvIGNvbnRpbnVlIGFmdGVyIGR1bXBpbmcgc3RhY2sgdHJhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEVycm9yKCJQcm9ncmFtIEVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gY291bGRuJ3QgaGFwcGVuLiBUaGUgcHJvZ3JhbSBoYXMgYXBwYXJlbnRseQotCQkJLy8gcmVhZCB0aGUgbW9kZWwgb25jZSwgYW5kIHRoZXJlJ2QgYmUgbm8gKGNvbW1vbikgcmVhc29uIGl0Ci0JCQkvLyBjb3VsZG4ndCBiZSBsb2FkZWQgYWdhaW4uCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJXYXJuaW5nOiAgWE1MTG9hZGVyOjpyZWxvYWQuICBUaGlzIGV4Y2VwdGlvbiByZWFsbHkgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkISEgQnV0IHdpbGwgYXR0ZW1wIHRvIGNvbnRpbnVlIGFmdGVyIGR1bXBpbmcgc3RhY2sgdHJhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEVycm9yKCJQcm9ncmFtIEVycm9yIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIHRoaXMgd29yayBpcyBkb25lIGJldHRlciBlbHNld2hlcmUsIGJ1dCBkb25lIGhlcmUgZm9yIHRoaXMgdmVyc2lvbiB0bwotCSAqIHJlZHVjZSBjaGFuZ2VzLiBlc3BlY2lhbGx5IHNpbmNlIHRoZSBuZWVkIGZvciBpdCBzaG91bGQgZ28gYXdheSBvbmNlIHdlCi0JICogbm8gbG9uZ2VyIG5lZWQgdG8gcmUtdXNlIG9sZCBkb2N1bWVudCBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNmb3JtSW5zdGFuY2UoSVN0cnVjdHVyZWREb2N1bWVudCBvbGRJbnN0YW5jZSwgSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSkgewotCQkvKioKLQkJICogaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MjAKLQkJICogCi0JCSAqIEpTUCB0YWdsaWIgc3VwcG9ydCBicm9rZW4sIGNvcnJlY3QgYnkgZHVwbGljYXRpbmcgZXh0ZW5kZWQgc2V0dXAKLQkJICogaW5mb3JtYXRpb24gKEJsb2NrVGFnUGFyc2VyIGV4dGVuc2lvbiwKLQkJICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGV4dGVuc2lvbnMpCi0JCSAqLwotCQlSZWdpb25QYXJzZXIgb2xkUGFyc2VyID0gb2xkSW5zdGFuY2UuZ2V0UGFyc2VyKCk7Ci0JCVJlZ2lvblBhcnNlciBuZXdQYXJzZXIgPSBuZXdJbnN0YW5jZS5nZXRQYXJzZXIoKS5uZXdJbnN0YW5jZSgpOwotCQkvLyBSZWdpc3RlciBhbGwgb2YgdGhlIG9sZCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyBvbiB0aGUgbmV3Ci0JCS8vIHBhcnNlcgotCQlpZiAob2xkUGFyc2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uICYmIG5ld1BhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbikgewotCQkJTGlzdCBvbGRIYW5kbGVycyA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uKSBvbGRQYXJzZXIpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKSBvbGRIYW5kbGVycy5nZXQoaSkpOwotCQkJCWlmIChoYW5kbGVyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbikgewotCQkJCQkvKioKLQkJCQkJICogU2tpcCB0aGUgdHJhbnNmZXJyaW5nIGhlcmUsIHRoZSBoYW5kbGVyIHdpbGwgZG8gdGhpcwotCQkJCQkgKiBhZnRlciBldmVyeXRoaW5nIGVsc2UgYnV0IHRoZSBzb3VyY2UgaXMgdHJhbnNmZXJyZWQuCi0JCQkJCSAqLwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIG9sZFBhcnNlcikucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihoYW5kbGVyKTsKLQkJCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIG5ld1BhcnNlcikuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihoYW5kbGVyKTsKLQkJCQkJaGFuZGxlci5yZXNldE5vZGVzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIEFkZCBhbnkgZ2xvYmFsIEJsb2NrTWFya2VycyB0byB0aGUgbmV3IHBhcnNlcgotCQlpZiAob2xkUGFyc2VyIGluc3RhbmNlb2YgQmxvY2tUYWdQYXJzZXIgJiYgbmV3UGFyc2VyIGluc3RhbmNlb2YgQmxvY2tUYWdQYXJzZXIpIHsKLQkJCUxpc3Qgb2xkQmxvY2tNYXJrZXJzID0gKChCbG9ja1RhZ1BhcnNlcikgb2xkUGFyc2VyKS5nZXRCbG9ja01hcmtlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoKEJsb2NrTWFya2VyKSBvbGRCbG9ja01hcmtlcnMuZ2V0KGkpKTsKLQkJCQlpZiAoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkgewotCQkJCQkoKEJsb2NrVGFnUGFyc2VyKSBuZXdQYXJzZXIpLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBvbGRJbnN0YW5jZSkuc2V0UGFyc2VyKG5ld1BhcnNlcik7Ci0KLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgb2xkSW5zdGFuY2UpLnNldFJlUGFyc2VyKG5ld0luc3RhbmNlLmdldFJlUGFyc2VyKCkubmV3SW5zdGFuY2UoKSk7Ci0KLQkJaWYgKG5ld0luc3RhbmNlLmdldERvY3VtZW50UGFydGl0aW9uZXIoKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIHsKLQkJCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBudWxsOwotCQkJaWYgKG9sZEluc3RhbmNlIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMyAmJiBuZXdJbnN0YW5jZSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCQlwYXJ0aXRpb25lciA9ICgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgKChJRG9jdW1lbnRFeHRlbnNpb24zKSBuZXdJbnN0YW5jZSkuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKSk7Ci0JCQkJaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCQkJcGFydGl0aW9uZXIgPSAoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgcGFydGl0aW9uZXIubmV3SW5zdGFuY2UoKTsKLQkJCQl9Ci0JCQkJKChJRG9jdW1lbnRFeHRlbnNpb24zKSBvbGRJbnN0YW5jZSkuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBwYXJ0aXRpb25lcik7Ci0JCQl9Ci0JCQlpZiAocGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJCXBhcnRpdGlvbmVyID0gKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpICgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgbmV3SW5zdGFuY2UuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpKS5uZXdJbnN0YW5jZSgpOwotCQkJCW9sZEluc3RhbmNlLnNldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uZXIpOwotCQkJfQotCQkJaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCQlwYXJ0aXRpb25lci5jb25uZWN0KG9sZEluc3RhbmNlKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBleGlzdGluZ0xpbmVEZWxpbWl0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJZXhpc3RpbmdMaW5lRGVsaW1pdGVyID0gbmV3SW5zdGFuY2UuZ2V0TGluZURlbGltaXRlcigwKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gaWYgZW1wdHkgZmlsZSwgYXNzdW1lIHBsYXRmb3JtIGRlZmF1bHQKLQkJCS8vIFRPRE86IHNob3VsZCBiZSB1c2luZyB1c2VyIHNldCBwcmVmZXJlbmNlLCBwZXIgY29udGVudCB0eXBlPwotCQkJZXhpc3RpbmdMaW5lRGVsaW1pdGVyID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlvbGRJbnN0YW5jZS5zZXRMaW5lRGVsaW1pdGVyKGV4aXN0aW5nTGluZURlbGltaXRlcik7IC8vJE5PTi1OTFMtMSQpOwotCQlpZiAobmV3SW5zdGFuY2UuZ2V0RW5jb2RpbmdNZW1lbnRvKCkgIT0gbnVsbCkgewotCQkJb2xkSW5zdGFuY2Uuc2V0RW5jb2RpbmdNZW1lbnRvKChFbmNvZGluZ01lbWVudG8pIG5ld0luc3RhbmNlLmdldEVuY29kaW5nTWVtZW50bygpLmNsb25lKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTIwCi0JCSAqIAotCQkgKiBKU1AgdGFnbGliIHN1cHBvcnQgYnJva2VuLCBjb3JyZWN0IGJ5IGR1cGxpY2F0aW5nIGV4dGVuZGVkIHNldHVwCi0JCSAqIGluZm9ybWF0aW9uIChCbG9ja1RhZ1BhcnNlciBleHRlbnNpb24sCi0JCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciBleHRlbnNpb25zKQotCQkgKi8KLQkJaWYgKG9sZFBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbiAmJiBuZXdQYXJzZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24pIHsKLQkJCUxpc3Qgb2xkSGFuZGxlcnMgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbikgb2xkUGFyc2VyKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRIYW5kbGVycy5zaXplKCk7IGkrKykgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlciA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcikgb2xkSGFuZGxlcnMuZ2V0KGkpKTsKLQkJCQlpZiAoaGFuZGxlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24pIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiBoYW5kbGVyRXh0ZW5zaW9uID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24pIGhhbmRsZXI7Ci0JCQkJCWhhbmRsZXJFeHRlbnNpb24uc2V0U3RydWN0dXJlZERvY3VtZW50KG9sZEluc3RhbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGhvbGRTdHJpbmcgPSBuZXdJbnN0YW5jZS5nZXQoKTsKLQkJbmV3SW5zdGFuY2UgPSBudWxsOwotCQlvbGRJbnN0YW5jZS5zZXQoaG9sZFN0cmluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU1NDE2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0Fic3RyYWN0U3RydWN0dXJlZE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuRG9jdW1lbnRDaGFuZ2VkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLkFib3V0VG9CZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX01BTkFHRVJfTlVMTCA9ICJXYXJuaW5nOiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbDo6Y2xvc2U6ICBtb2RlbCBtYW5hZ2VyIHdhcyBudWxsIGR1cmluZyBhIGNsb3NlIG9mIGEgbW9kZWwgKHdoaWNoIHNob3VsZCBiZSBpbXBvc3NpYmxlKSI7IC8vJE5PTi1OTFMtMSQKLQotCWNsYXNzIERpcnR5U3RhdGVXYXRjaGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCS8vIEkgZG9uJ3QgdGhpbmsgaXRzIHNhZmUgdG8gYXNzdW1lIGEgbmV3IG1vZGVsCi0JCQkvLyBpcyBhbHdheXMgImZyZXNoIiwgc28gd2UnbGwgbGVhdmUgZGlydHkgc3RhdGUKLQkJCS8vIHVuY2hhbmdlZDsKLQkJCS8vIGJ1dCB3ZSdsbCB0ZWxsIGV2ZXJ5b25lIGFib3V0IGl0LgotCQkJc2V0RGlydHlTdGF0ZShmRGlydHlTdGF0ZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCS8vIGRvbid0IGNoYW5nZSBkaXJ0eSBzdGF0ZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlzZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJLy8gbm8gbmVlZCB0byBsaXN0ZW4gYW55IG1vcmUKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlzZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJLy8gbm8gbmVlZCB0byBsaXN0ZW4gYW55IG1vcmUKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJc2V0RGlydHlTdGF0ZSh0cnVlKTsKLQkJCS8vIG5vIG5lZWQgdG8gbGlzdGVuIGFueSBtb3JlCi0JCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRGlydHlTdGF0ZVdhdGNoZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgRG9jdW1lbnRUb01vZGVsTm90aWZpZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIsIElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBJZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBhcmUgYWJvdXQgdG8KLQkJCS8vIGNoYW5nZSBiYXNlZCBvbiBvdXIgdW5kZXJseWluZyBkb2N1bWVudCBjaGFuZ2luZy4KLQkJCS8vIElmIHdlIGRpZCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgd2UsIG9yIGNsaWVudCwgc2hvdWxkIGhhdmUKLQkJCS8vIGFscmVhZHkgY2FsbGVkIGFib3V0VG9DaGFuZ2VNb2RlbC4KLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpICE9IHRoaXMpIHsKLQkJCQlhYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCX0KLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNuZXdNb2RlbChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBpZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBoYXZlIGNoYW5nZWQKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpICE9IHRoaXMpIHsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjbm9DaGFuZ2Uob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5Ob0NoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25vZGVzUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIGlmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGhhdmUgY2hhbmdlZAotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgIT0gdGhpcykgewotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIGlmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGhhdmUgY2hhbmdlZAotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgIT0gdGhpcykgewotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25zUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeTsKLQlwcml2YXRlIFN0cmluZyBmQmFzZUxvY2F0aW9uOwotCWJvb2xlYW4gZkRpcnR5U3RhdGU7Ci0JRGlydHlTdGF0ZVdhdGNoZXIgZkRpcnR5U3RhdGVXYXRjaGVyOwotCURvY3VtZW50VG9Nb2RlbE5vdGlmaWVyIGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcjsKLQlwcml2YXRlIFN0cmluZyBmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZklkOwotCi0JcHJpdmF0ZSBMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyIGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyOwotCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgZkxpc3RlbmVyTG9jayA9IG5ldyBieXRlWzBdOwotCXByb3RlY3RlZCBJTG9jayBmTG9ja09iamVjdDsKLQkvLyBwcml2YXRlIFN0cmluZyBmTGluZURlbGltaXRlcjsKLQkvLyBwcml2YXRlIE9iamVjdCBmVHlwZTsKLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgZk1vZGVsSGFuZGxlcjsKLQkvLyBpc3N1ZTogd2Ugc2hvdWxkIG5vdCAiaG9sZCBvbiIgdG8gbW9kZWwgbWFuYWdlciwgY2FuIAotCS8vIGVhc2lseSBnZXQgd2l0aCBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCS8vIGJ1dCB3aWxsIG5lZWQgdG8gYWRkIG1vcmUgbnVsbCBjaGVja3MuCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGZNb2RlbE1hbmFnZXI7Ci0JcHJpdmF0ZSBpbnQgZk1vZGVsU3RhdGVDaGFuZ2luZzsKLQlwcml2YXRlIE9iamVjdFtdIGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCXByaXZhdGUgYm9vbGVhbiBmTmV3U3RhdGUgPSBmYWxzZTsKLQlwcml2YXRlIFVSSVJlc29sdmVyIGZSZXNvbHZlcjsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50OwotCS8qKgotCSAqIFRoZSB0aW1lIHN0YW1wIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlJ3MgbW9kaWZpY2F0aW9uIGRhdGUsIGF0IHRoZQotCSAqIHRpbWUgdGhpcyBtb2RlbCB3YXMgY3JlYXRlZCwgb3IgdGhlIGxhc3QgdGltZSBpdCB3YXMgc2F2ZWQuIE5vdGU6IGZvcgotCSAqIHRoaXMgdmVyc2lvbiwgdGhpcyB2YXJpYWJsZSBpcyBub3Qgc2V0IGF1dG9tYXRpY2FsbHksIGJlIG5lZWRzIHRvIGJlCi0JICogbWFuYWdlZCBieSBjbGllbnQuIFRoZSBGaWxlTW9kZWxQcm92aWRlciBkb2VzIHRoaXMgZm9yIG1vc3QgY2FzZXMsIGJ1dAotCSAqIGlmIGNsaWVudCBkbyBub3QgdXNlIEZpbGVNb2RlbFByb3ZpZGVyLCB0aGV5IG11c3Qgc2V0IHRoaXMgdmFyaWFibGUKLQkgKi8KLQlwdWJsaWMgbG9uZyBmU3luY2hyb25pemF0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQlwcml2YXRlIGJvb2xlYW4gcmVpbml0aWFsaXphdGlvbk5lZWRlZDsKLQlwcml2YXRlIE9iamVjdCByZWluaXRpYWxpemVTdGF0ZURhdGE7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCgpIHsKLQotCQlzdXBlcigpOwotCQlmRGlydHlTdGF0ZVdhdGNoZXIgPSBuZXcgRGlydHlTdGF0ZVdhdGNoZXIoKTsKLQkJZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyID0gbmV3IERvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IGZvciBnZXR0aW5nIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCBtYW5hZ2VyIG9mIHRoZQotCSAqIHJpZ2h0IEltcGwgdHlwZSwgdG8gYmUgdXNlZCAiaW50ZXJuYWxseSIgZm9yIG1ha2luZyBwcm90ZWN0ZWQgY2FsbHMKLQkgKiBkaXJlY3RseSB0byB0aGUgaW1wbCBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIE1vZGVsTWFuYWdlckltcGwgX2dldE1vZGVsTWFuYWdlcigpIHsKLQkJLy8gVE9ET19mdXR1cmU6IHJlZGVzaWduIHNvIHdlIGRvbid0IG5lZWQgdGhpcyAnSW1wbCcgdmVyc2lvbgotCQlpZiAoZk1vZGVsTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmTW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJfQotCi0JCXJldHVybiAoTW9kZWxNYW5hZ2VySW1wbCkgZk1vZGVsTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogImxhcmdlIiBjaGFuZ2UgdG8gdGhlIG1vZGVsLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50Ci0JICogb3IgaXQgbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uIE5vdGUgdGhhdCBpbgotCSAqIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCBub3RpZmljYXRpb24gdG8gbGlzdGVuZXJzIGlzIHNlbnQgb25seQotCSAqIG9uY2UuIE5vdGUgdGhhdCB0aGUgY2xpZW50IHdobyBpcyBtYWtpbmcgdGhlc2UgY2hhbmdlcyBoYXMgdGhlCi0JICogcmVzcG9uc2liaWxpdHkgdG8gcmVzdG9yZSB0aGUgbW9kZWxzIHN0YXRlIG9uY2UgZmluaXNoZWQgd2l0aCB0aGUKLQkgKiBjaGFuZ2VzLiBTZWUgZ2V0TWVtZW50byBhbmQgcmVzdG9yZVN0YXRlLiBUaGUgbWV0aG9kCi0JICogaXNNb2RlbFN0YXRlQ2hhbmdpbmcgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbAotCSAqIGlzIGFscmVhZHkgaW4gYSBjaGFuZ2Ugc2VxdWVuY2UuCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0NoYW5nZU1vZGVsKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJaW50ZXJuYWxBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhYm91dFRvUmVpbml0aWFsaXplTW9kZWwoKSB7Ci0KLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWZpcmVNb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMaXN0ZW5lckxvY2spIHsKLQkJCWlmIChmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0JCQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgPSBuZXcgTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlcigpOwotCQkJfQotCQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKCFVdGlsaXRpZXMuY29udGFpbnMoZk1vZGVsU3RhdGVMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmTW9kZWxTdGF0ZUxpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZNb2RlbFN0YXRlTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmTW9kZWxTdGF0ZUxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbG9jayB0byBsb2NrIHRoZSBzbWFsbCBiaXRzIG9mIGRhdGEgYW5kIG9wZXJhdGlvbnMgaW4gdGhlIG1vZGVscwotCSAqIHRoZW1zZWxmZXMuIHRoaXMgbG9jayBpcyAic2hhcmVkIiB3aXRoIGRvY3VtZW50LCBzbywgZXZlbnR1YWxseSwKLQkgKiBjaGFuZ2VzIGNhbiBiZSBtYWRlIHNhZmVmbHkgZnJvbSBlaXRoZXIgc2lkZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBiZWdpbkxvY2soKSB7Ci0KLQkJLy8gaWYgd2UgZ2V0IGEgZGlmZmVyZW50IGxvY2sgb2JqZWN0Ci0JCS8vIHRoYW4gd2UgaGFkIGJlZm9yZSwgYmVzdXJlIHRvIHJlbGVhc2UKLQkJLy8gb2xkIG9uZSBmaXJzdCBiZWZvcmUgbG9zaW5nIGl0LgotCQkvLyBJU1NVRTogdGhpcyBzbWVsbHMgbGlrZSBhbiBlcnJvciBjb25kaXRpb24sCi0JCS8vIHdoZW4gd291bGQgdGhpcyBoYXBwZW4/IGJldHRlciB0byBjaGVjayBpbiBzZXQgZG9jdW1lbnQ/Ci0JCUlMb2NrIGRvY3VtZW50TG9jayA9IGdldExvY2tPYmplY3RGcm9tRG9jdW1lbnQoKTsKLQotCQlpZiAoZkxvY2tPYmplY3QgIT0gbnVsbCAmJiBmTG9ja09iamVjdCAhPSBkb2N1bWVudExvY2spIHsKLQkJCWZMb2NrT2JqZWN0LnJlbGVhc2UoKTsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbCBsb2NrIHJlbGVhc2VkIGVhcmx5IiArIGZMb2NrT2JqZWN0ICsgIiBhcHBhcmVudGx5IGRvY3VtZW50IHN3aXRjaGVkPyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQl9Ci0JCWZMb2NrT2JqZWN0ID0gZG9jdW1lbnRMb2NrOwotCQlpZiAoZkxvY2tPYmplY3QgIT0gbnVsbCkgewotCQkJZkxvY2tPYmplY3QuYWNxdWlyZSgpOwotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vZGVsIGxvY2sgYWNxdWlyZWQ6ICIgKyBmTG9ja09iamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIpIHsKLQotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCi0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbnVsbCwgbnVsbCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKSB7Ci0KLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBudWxsLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgZGVzY3JpcHRpb24sIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBhIGNsaWVudCBjb250cm9sbGVkIHdheSBvZiBub3RpZnlpbmcgYWxsIE1vZGVsRXZlbnQKLQkgKiBsaXN0bmVycyB0aGF0IHRoZSBtb2RlbCBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQgcGFpcgotCSAqIHRvIGFib3V0VG9DaGFuZ2VNb2RlbCwgYW5kICptdXN0KiBiZSBjYWxsZWQgYWZ0ZXIgYWJvdXRUb0NoYW5nZU1vZGVsCi0JICogLi4uIG9yIHNvbWUgbGlzdGVuZXJzIGNvdWxkIGJlIGxlZnQgd2FpdGluZyBpbmRlZmluaXRlbHkgZm9yIHRoZQotCSAqIGNoYW5nZWQgZXZlbnQuIFNvLCBpdHMgc3VnZ2VzdGVkIHRoYXQgY2hhbmdlZE1vZGVsIGFsd2F5cyBiZSBpbiBhCi0JICogZmluYWxseSBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwKLQkgKiB3aXRob3V0IGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LiBJbiB0aGUgY2FzZSBvZiBlbWJlZGRlZAotCSAqIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZWRNb2RlbCgpIHsKLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWludGVybmFsTW9kZWxDaGFuZ2VkKCk7Ci0JCS8vIGFsc28gbm90ZSEKLQkJLy8gaWYgd2UndmUgYmVlbiAiY2hhbmdlZCIgYnkgYSBjbGllbnQsIHdlIG1pZ2h0IHN0aWxsIG5lZWQKLQkJLy8gdG8gYmUgcmUtaW5pdGlhbGl6ZWQsIHNvIHdlJ2xsIGNoZWNrIGFuZCBoYW5kbGUgdGhhdCBoZXJlLgotCQkvLyBOb3RlIG9ubHkgZG9lcyB0aGlzIHByb3ZpZGUgYSBzb2x1dGlvbiB0byBzb21lICJtaXNzZWQiCi0JCS8vIHJlLWluaXRzLCBpbiBwcm92aWRlcyBhIGJ1aWx0IGluIHdheSBmb3IgY2xpZW50cyB0bwotCQkvLyAiZm9yY2UiIHRoZSBtb2RlbCB0byBoYW5kbGUgaXRzZWxmLCBieSBicmFja2V0aW5nIGFueQotCQkvLyBjaGFuZ2VzIHdpdGggYWJvdXRUb0NoYW5nZSBhbmQgY2hhbmdlZCwgdGhlIG1vZGVsIGl0c2VsZgotCQkvLyB3aWxsIGNoZWNrLiBCdXQgb25seSBjYWxsIHJlLWluaXQgaWYgYWxsIG90aGVyIHBlbmRpbmcKLQkJLy8gbW9kZWxDaGFuZ2VkIHN0YXRlcyBoYXZlIGJlZW4gaGFuZGxlZC4KLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPT0gMCAmJiBpc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSkgewotCQkJcmVpbml0KCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEJhc2VkIG9uIHNpbWlsYXIgbWV0aG9kIGluIEZpbGVEb2N1bWVudFByb3ZpZGVyLiBJdCB3aWxsIHByb3ZpZGUgd2hhdAotCSAqIHRoZSBtb2RpZmljYXRpb25TdGFtcCB3b3VsZCBiZSBpZiByZXNldFN5bmNocm9uemF0aW9uU3RhbXAocmVzb3VyY2UpCi0JICogd2VyZSB1c2VkLCBhbHRob3VnaCBmb3IgdGhpcyAnY29tcHV0ZScgQVBJLCBubyBjaGFuZ2VzIHRvIHRoZSBpbnN0YW5jZQotCSAqIGFyZSBtYWRlLgotCSAqLwotCXB1YmxpYyBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQotCi0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXAgPSByZXNvdXJjZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIG1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0JCS8vIE5vdGU6IGNoZWNraW5nIGV4aXN0ZW5jZSBvZiBmaWxlIGlzIGEgbGl0dGxlIGRpZmZlcmVudCB0aGFuCi0JCS8vIGltcGwgaW4KLQkJLy8gdGhlIEZpbGVEb2N1bWVudFByb3ZpZGVyLiBTZWUgZGVmZWN0IG51bWJlciAyMjM3OTAuCi0JCUZpbGUgZmlsZSA9IHBhdGgudG9GaWxlKCk7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIG1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0JCW1vZGlmaWNhdGlvblN0YW1wID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJcmV0dXJuIG1vZGlmaWNhdGlvblN0YW1wOwotCX0KLQotCi0JLyoqCi0JICogUHJvdmlkZXMgYSBjb3B5IG9mIHRoZSBtb2RlbCwgYnV0IGEgbmV3IElEIG11c3QgYmUgcHJvdmlkZWQuIFRoZQotCSAqIHByaW5jaXBsZSBvZiB0aGlzIGNvcHkgaXMgbm90IHRvIGNvcHkgZmllbGRzLCBldGMuLCBhcyBpcyB0eXBpY2FsbHkKLQkgKiBkb25lIGluIGEgY2xvbmUgbWV0aG9kLCBidXQgdG8gcmV0dXJuIGEgbW9kZWwgd2l0aCB0aGUgc2FtZSBjb250ZW50IGluCi0JICogdGhlIHN0cnVjdHVyZWREb2N1bWVudC4gTm90ZTogSXQgaXMgdGhlIGNhbGxlcnMgcmVzcG9uc2liaWxpdHkgdG8KLQkgKiBzZXRCYXNlTG9jYXRpb24sIGxpc3RuZXJzLCBldGMuLCBhcyBhcHByb3ByaWF0ZS4gVHlwZSBhbmQgRW5jb2RpbmcgYXJlCi0JICogdGhlIG9ubHkgZmllbGRzIHNldCBieSB0aGlzIG1ldGhvZC4gSWYgdGhlIG5ld0lkIHByb3ZpZGVkIGFscmVhZHkgZXhpc3QKLQkgKiBpbiB0aGUgbW9kZWwgbWFuYWdlciwgYSBSZXNvdXJjZUluVXNlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY29weShTdHJpbmcgbmV3SWQpIHRocm93cyBSZXNvdXJjZUluVXNlIHsKLQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBudWxsOwotCQkvLyB0aGlzIGZpcnN0IG9uZSBzaG91bGQgZmFpbCwgaWYgbm90LCBpdHMgdHJlYXRlZCBhcyBhbiBlcnJvcgotCQkvLyBJZiB0aGUgY2FsbGVyIHdhbnRzIHRvIHVzZSBhbiBleGlzdGluZyBvbmUsIHRoZXkgY2FuIGNhbGwKLQkJLy8gZ2V0RXhpc3RpbmcKLQkJLy8gYWZ0ZXIgdGhpcyBmYWlsdXJlCi0JCW5ld01vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQobmV3SWQpOwotCQlpZiAobmV3TW9kZWwgIT0gbnVsbCkgewotCQkJLy8gYmUgc3VyZSB0byByZWxlYXNlIHRoZSByZWZlcmVuY2Ugd2UgZ290ICJieSBhY2NpZGVudCIgKGFuZAotCQkJLy8gbm8KLQkJCS8vIGxvbmdlciBuZWVkKQotCQkJbmV3TW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl0aHJvdyBuZXcgUmVzb3VyY2VJblVzZSgpOwotCQl9Ci0JCW5ld01vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuY29weU1vZGVsRm9yRWRpdChnZXRJZCgpLCBuZXdJZCk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQotCS8qKgotCSAqIERpc2FibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2FibGVVbmRvTWFuYWdlbWVudCgpIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5kaXNhYmxlVW5kb01hbmFnZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmVuYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogZW5kTG9jayBpcyBwcm90ZWN0ZWQgb25seSBmb3IgYSB2ZXJ5IHNwZWNpYWwgcHVycG9zZS4gU28gc3ViY2xhc3NlcyBjYW4KLQkgKiBjYWxsIGl0IHRvIGVuZCB0aGUgbG9jayBhZnRlciB1cGRhdGVzIGhhdmUgYmVlbiBtYWRlLCBidXQgYmVmb3JlCi0JICogbm90aWZpY2F0aW9ucyBhcmUgc2VudAotCSAqIAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGVuZExvY2soKSB7Ci0JCWlmIChmTG9ja09iamVjdCAhPSBudWxsKSB7Ci0JCQlmTG9ja09iamVjdC5yZWxlYXNlKCk7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWwgbG9jayByZWxlYXNlZDogIiArIGZMb2NrT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5lbmRSZWNvcmRpbmcocmVxdWVzdGVyLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIG1vZGVsIHN0YXRlIGxpc3RlbmVycyB0aGF0IHRoZSB0aGUgbW9kZWwgaXMKLQkgKiBhYm91dCB0byB1bmRlciBnbyBhIGNoYW5nZS4gVGhpcyBjaGFuZ2UgbWlnaHQgYmUgaW4gdGVybXMgb2YgY29udGVudHMKLQkgKiBvciBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwncyBpZCBvciBiYXNlIGxvY2F0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBmaXJlTW9kZWxBYm91dFRvQmVDaGFuZ2VkKCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5Ci0JCS8vIGZyb20gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxBYm91dFRvQmVDaGFuZ2VkKHRoaXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBOT1RFOiB0cmljayBmb3IgdHJhbnNpdGlvbi4gV2UgYWN0dWFsIHVzZSB0aGUgc2FtZQotCQkJCS8vIGxpc3RlbmVycwotCQkJCS8vIGFzIG1vZGVsU3RhdGUsIGJ1dCBvbmx5IHNlbmQgdGhpcyB0byB0aG9zZSB0aGF0IGhhdmUKLQkJCQkvLyBpbXBsZW1lbnRlZCBNb2RlbFN0YXRlRXh0ZW5kZWQuCi0JCQkJSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldOwotCQkJCWxpc3RlbmVyLm1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlTW9kZWxDaGFuZ2VkKCkgewotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMKLQkJLy8gdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQKLQkJLy8gYW5kIHJlbW92ZSBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lcgotCQkvLyBhcnJheSBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQkoKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm1vZGVsQ2hhbmdlZCh0aGlzKTsKLQkJCQl9Ci0JCQkJLy8gaXRzIHNvIGNyaXRpY2lhbCB0aGF0IHRoZSBiZWdpbi9lbmQgYXJyaXZlIGluCi0JCQkJLy8gcGFpcnMsCi0JCQkJLy8gaWYgdGhlcmUgaGFwcGVuZHMgdG8gYmUgYW4gZXJyb3IgaW4gb25lIG9mIHRoZQotCQkJCS8vIG1vZGVsQ2hhbmdlZCwKLQkJCQkvLyB0aGV5IHdlIHdhbnQgdG8gYmUgc3VyZSByZXN0IGNvbXBsZXRlIG9rLgotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlCi0JICogZGlydHkgc3RhdGUgb2YgdGhlIG1vZGVsLiBUaGUgZGlydHkgc3RhdGUgaXMgZW50aXJlbHkgYWJvdXQgY2hhbmdlcyBpbgotCSAqIHRoZSBjb250ZW50IG9mIHRoZSBtb2RlbCAobm90LCBmb3IgZXhhbXBsZSwgYWJvdXQgY2hhbmdlcyB0byBpZCwgb3IKLQkgKiBiYXNlIGxvY2F0aW9uIC0tIHNlZSBtb2RlbE1vdmVkKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIGVsZW1lbnQsIGJvb2xlYW4gaXNEaXJ0eSkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbERpcnR5U3RhdGVDaGFuZ2VkKGVsZW1lbnQsIGlzRGlydHkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZGVsUmVpbml0aWFsaXplZCgpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxSZWluaXRpYWxpemVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldOwotCQkJCWxpc3RlbmVyLm1vZGVsUmVpbml0aWFsaXplZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgc3RhdGUgbGlzdGVuZXJzIGFib3V0IHRoZSBkZWxldGlvbiBvZiBhCi0JICogbW9kZWwncyB1bmRlcmx5aW5nIHJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIGVsZW1lbnQpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxSZXNvdXJjZURlbGV0ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm1vZGVsUmVzb3VyY2VEZWxldGVkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCB0aGUgcmVzb3VyY2UKLQkgKiB1bmRlcmx5aW5nIGEgbW9kZWwgaGFzIGJlZW4gbW92ZWQuIFRoaXMgaXMgdHlwaWNhbGx5IHJlZmxlY3RlZCBpbiBhCi0JICogY2hhbmdlIHRvIHRoZSBpZCwgYmFzZUxvY2F0aW9uLCBvciBib3RoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvcmlnaW5hbEVsZW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW92ZWRFbGVtZW50KSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsUmVzb3VyY2VNb3ZlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxSZXNvdXJjZU1vdmVkKG9yaWdpbmFsRWxlbWVudCwgbW92ZWRFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRCYXNlTG9jYXRpb24oKSB7Ci0KLQkJcmV0dXJuIGZCYXNlTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbCNnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkgewotCQlpZiAoZkV4cGxpY2l0Q29udGVudFR5cGVJZGVudGlmaWVyICE9IG51bGwpCi0JCQlyZXR1cm4gZkV4cGxpY2l0Q29udGVudFR5cGVJZGVudGlmaWVyOwotCQlyZXR1cm4gZk1vZGVsSGFuZGxlci5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlpZiAoZmFjdG9yeVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWZhY3RvcnlSZWdpc3RyeSA9IG5ldyBGYWN0b3J5UmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFRoZSBpZCBpcyB0aGUgaWQgdGhhdCB0aGUgbW9kZWwgbWFuYWdlciB1c2VzIHRvIGlkZW50aWZ5IHRoaXMgbW9kZWwKLQkgKiAKLQkgKiBASVNTVUUgLSBubyBvbmUgc2hvdWxkIG5lZWQgdG8ga25vdyBJRCwgc28gdGhpcyBzaG91bGQgYmUgZGVmYXVsdCBhY2Nlc3MgZXZlbnR1YWxseS4gCi0JICogSWYgY2xpZW50cyBiZWxpZXZlIHRoZXkgZG8gbmVlZCBJRCwgYmUgc3VyZSB0byBsZXQgdXMga25vdyAob3BlbiBhIGJ1ZykuIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0KLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSUxvY2sgZ2V0TG9ja09iamVjdEZyb21Eb2N1bWVudCgpIHsKLQotCQkvLyB3ZSBhbHdheXMgImdldCBhZnJlc2giIHRoZSBsb2NrIG9iamVjdCBmcm9tIG91ciBkb2N1bWVudCwKLQkJLy8ganVzdCBpbiBjYXNlIHRoZSBpbnN0YW5jZSBvZiB0aGUgZG9jdW1lbnQgY2hhbmdlcy4KLQkJSUxvY2sgcmVzdWx0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBmU3RydWN0dXJlZERvY3VtZW50OwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJTG9ja2FibGUpIHsKLQkJCQkvLyByZW1lbWJlciwgbW9yZSB0aGFuIG9uZSBjbGllbnQgY2FuIGdldCB0aGUKLQkJCQkvLyBsb2NrIG9iamVjdCwgaXRzIGR1cmluZyB0aGUgYXF1aXJlIHRoYXQgdGhlCi0JCQkJLy8gbG9jayBvbiB0aGUgdGhyZWFkIGlzIG9idGFpbmVkLgotCQkJCXJlc3VsdCA9ICgoSUxvY2thYmxlKSBkb2MpLmdldExvY2tPYmplY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24uCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgQ29udGVudFR5cGVEZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldE1vZGVsSGFuZGxlcigpIHsKLQotCQlyZXR1cm4gZk1vZGVsSGFuZGxlcjsKLQl9Ci0KLQotCXB1YmxpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQotCQlyZXR1cm4gX2dldE1vZGVsTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnQoKSB7Ci0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0UmVmZXJlbmNlQ291bnQoZ2V0SWQoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCS8vIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbiBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQlwdWJsaWMgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdCgpIHsKLQotCi0KLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGdldE1vZGVsTWFuYWdlcigpLmdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdChnZXRJZCgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKCkgewotCi0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKGdldElkKCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKCkgewotCi0JCXJldHVybiByZWluaXRpYWxpemVTdGF0ZURhdGE7Ci0JfQotCi0KLQotCXB1YmxpYyBVUklSZXNvbHZlciBnZXRSZXNvbHZlcigpIHsKLQotCQlyZXR1cm4gZlJlc29sdmVyOwotCX0KLQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAyOjMwOjI2Ci0JICogUE0pCi0JICogCi0JICogQHJldHVybiBsb25nCi0JICovCi0JcHVibGljIGxvbmcgZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKSB7Ci0KLQkJcmV0dXJuIGZTeW5jaHJvbml6YXRpb25TdGFtcDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKSB7Ci0KLQkJSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgc3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJc3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyID0gc3RydWN0dXJlZERvY3VtZW50LmdldFVuZG9NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdElkKFN0cmluZyBpZCkgewotCQlmSWQgPSBpZDsKLQl9Ci0KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFib3V0VG9CZUNoYW5nZWQoKSB7Ci0KLQkJLy8gbm90aWNlIHdlIG9ubHkgZmlyZSB0aGlzIGV2ZW50IGlmIHdlIGFyZSBub3QKLQkJLy8gYWxyZWFkeSBpbiBhIG1vZGVsIHN0YXRlIGNoYW5naW5nIHNlcXVlbmNlCi0JCWlmIChmTW9kZWxTdGF0ZUNoYW5naW5nID09IDApIHsKLQotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsQWJvdXRUb0JlQ2hhbmdlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlmaXJlTW9kZWxBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgbm90aWZ5aW5nIG1vZGVsIHN0YXRlIGxpc3RlcnMgb2YgYWJvdXQgdG8gY2hhbmdlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIGJlZ2luIGxvY2sgYWZ0ZXIgbGlzdGVuZXJzIG5vdGlmaWVkLCBvdGhlcndpc2UKLQkJCQkvLyBkZWFkbG9jayBjb3VsZCBvY2N1ciBpZiB0aGV5IGNhbGwgdXMgYmFjay4KLQkJCQliZWdpbkxvY2soKTsKLQkJCX0KLQotCQl9Ci0JCS8vIHdlIGFsd2F5cyBpbmNyZW1lbnQgY291bnRlciwgZm9yIGV2ZXJ5IHJlcXVlc3QgKHNvICptdXN0KiByZWNlaXZlCi0JCS8vIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mICdjaGFuZ2VkTW9kZWwnIHJlcXVlc3RzKQotCQlmTW9kZWxTdGF0ZUNoYW5naW5nKys7Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgdGhhdCBhbiBpbXBlbmRpbmcgY2hhbmdlCi0JICogaXMgbm93IGNvbXBsZXRlLiBUaGlzIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIGJ5ICdtb2RlbENoYW5nZWQnCi0JICogc2luY2UgaXQga2VlcHMgdHJhY2sgb2YgY291bnRzLgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGludGVybmFsTW9kZWxDaGFuZ2VkKCkgewotCi0JCS8vIGFsd2F5cyBkZWNyZW1lbnQKLQkJZk1vZGVsU3RhdGVDaGFuZ2luZy0tOwotCi0KLQkJLy8gQ2hlY2sgaW50ZWdyaXR5Ci0JCS8vIHRvIGJlIGxlc3MgdGhhbiB6ZXJvIGlzIGEgcHJvZ3JhbW1pbmcgZXJyb3IsCi0JCS8vIGJ1dCB3ZSdsbCByZXNldCB0byB6ZXJvCi0JCS8vIGFuZCB0cnkgdG8gY29udGludWUKLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPCAwKSB7Ci0JCQlmTW9kZWxTdGF0ZUNoYW5naW5nID0gMDsKLQkJCS8vIHNob3VsZCBub3QgYmUgbG9ja2VkLCBidXQganVzdCBpbiBjYXNlCi0JCQllbmRMb2NrKCk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBtb2RlbFN0YXRlQ2hhbmdpbmcgd2FzIGxlc3MgdGhhbiB6ZXJvIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0KLQkJLy8gV2Ugb25seSBmaXJlIHRoaXMgZXZlbnQgaWYgYWxsIHBlbmRpbmcgcmVxdWVzdHMgYXJlIGRvbmUuCi0JCS8vIFRoYXQgaXMsIGlmIHdlJ3ZlIHJlY2VpdmVkIHRoZSBzYW1lIG51bWJlciBvZiBtb2RlbENoYW5nZWQgYXMKLQkJLy8gd2UgaGF2ZSBhYm91dFRvQ2hhbmdlTW9kZWwuCi0JCWlmIChmTW9kZWxTdGF0ZUNoYW5naW5nID09IDApIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbENoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWVuZExvY2soKTsKLQkJCS8vIG5vdGlmaWZ5IGxpc3RlbmVycyBvdXRzaWRlIG9mIGxvY2tlZCBzdGF0ZSAob3IgZGVhZGxvY2sKLQkJCS8vIGNhbiBvY2N1ciBpZiBvbmUgb2YgdGhlbSBjYWxscyB1cyBiYWNrLgotCQkJZmlyZU1vZGVsQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQotCQlyZXR1cm4gZkRpcnR5U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaGFzIHZlcnkgc3BlY2lhbCBwdXJwb3NlLCBpdHMgdXNlZCBpbiBzdWJjbGFzcwotCSAqICdjaGFuZ2VkTW9kZWwnIHRvIGtub3cgd2hlbiB0byBkbyAiZW5kaW5nIiBzb3J0cyBvZiB0aGluZ3MsIHJpZ2h0Ci0JICogYmVmb3JlIGEgY2FsbCB0byBzdXBlci5DaGFuZ2VkTW9kZWwgd291bGQgaW4gZGVlZCBwdXQgdGhlIG1vZGVsIGluCi0JICogJ2VuZCcgc3RhdGUuIFB1dCBhbm90aGVyIHdheSwgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3ViY2xhc3NlcydzCi0JICogY2hhbmdlZE1vZGVsLCB0aGUgaXNNb2RlbFN0YXRlQ2hhbmdpbmcgaXMgdHJ1ZSwgYnV0IGF0IGVuZCwgaXQgd2lsbCBiZQotCSAqIGZhbHNlLiBTbywgdGhpcyBtZXRob2QgYWxsb3dzIGEgc21hbGwgInBlZWsgYWhlYWQiLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTW9kZWxDaGFuZ2VTdGF0ZU9uVmVyZ2VPZkVuZGluZygpIHsKLQotCi0JCXJldHVybiBmTW9kZWxTdGF0ZUNoYW5naW5nID09IDE7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKSB7Ci0KLQotCQlyZXR1cm4gZk1vZGVsU3RhdGVDaGFuZ2luZyA+IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7Ci0KLQkJcmV0dXJuIGZOZXdTdGF0ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlaW5pdGlhbGl6YXRpb25OZWVkZWQoKSB7Ci0KLQkJcmV0dXJuIHJlaW5pdGlhbGl6YXRpb25OZWVkZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCkgewotCi0KLQkJaWYgKCFpc1NoYXJlZEZvckVkaXQoKSkKLQkJCXJldHVybiBpc0RpcnR5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWQoZ2V0SWQoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yRWRpdCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWRGb3JFZGl0KGdldElkKCkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvclJlYWQoKSB7Ci0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldE1vZGVsTWFuYWdlcigpLmlzU2hhcmVkRm9yUmVhZChnZXRJZCgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZCgpIHsKLQotCi0JCS8vIG5vdGljZSB0aGlzIGlzIGp1c3QgYSBwdWJsaWMgYXZlbnVlIHRvIG91ciBwcm90ZWN0ZWQgbWV0aG9kCi0JCWZpcmVNb2RlbFJlaW5pdGlhbGl6ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdJbnN0YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG51bGw7Ci0JCS8vIHdlIGRlbGVnYXRlIHRvIHRoZSBtb2RlbCBtYW5hZ2VyLCBzbyBsb2FkZXIsIGV0Yy4sIGNhbiBiZQotCQkvLyB1c2VkLgotCQluZXdNb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZU5ld0luc3RhbmNlKHRoaXMpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0KCkgewotCi0KLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlpZiAoZk1vZGVsU3RhdGVDaGFuZ2luZyA9PSAwKSB7Ci0JCQl0cnkgewotCQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCWFib3V0VG9SZWluaXRpYWxpemVNb2RlbCgpOwotCQkJCXJlc3VsdCA9IF9nZXRNb2RlbE1hbmFnZXIoKS5yZWluaXRpYWxpemUodGhpcyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRSZWluaXRpYWxpemVOZWVkZWQoZmFsc2UpOwotCQkJCXNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShudWxsKTsKLQkJCQltb2RlbFJlaW5pdGlhbGl6ZWQoKTsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJpbmRlZWQhISEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tRWRpdCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1PREVMX01BTkFHRVJfTlVMTCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBCZSBzdXJlIHRvIGNoZWNrIHRoZSBzaGFyZWQgc3RhdGUgYmVmb3JlIHJlbGVhc2luZy4gKFNpbmNlCi0JCQkgKiBpc1NoYXJlZCBhc3N1bWVzIGEgY291bnQgb2YgMSBtZWFucyBub3Qgc2hhcmVkIC4uLiBhbmQgd2Ugd2FudAotCQkJICogb3VyICcxJyB0byBiZSB0aGF0IG9uZS4pIFRoZSBwcm9ibGVtLCBvZiBjb3Vyc2UsIGlzIHRoYXQKLQkJCSAqIGJldHdlZW4gcHJlLWN5Y2xlIG5vdGlmaWNhdGlvbiBhbmQgcG9zdC1yZWxlYXNlIG5vdGlmaWNhdGlvbiwKLQkJCSAqIHRoZSBtb2RlbCBjb3VsZCBvbmNlIGFnYWluIGhhdmUgYmVjb21lIHNoYXJlZCwgcmVuZGVyaW5nIHRoZQotCQkJICogcmVsZWFzZSBub3RpZmljYXRpb24gaW5jb3JyZWN0LgotCQkJICovCi0JCQlib29sZWFuIGlzU2hhcmVkID0gaXNTaGFyZWQoKTsKLQotCQkJaWYgKCFpc1NoYXJlZCkgewotCQkJCXNpZ25hbFByZUxpZmVDeWNsZUV2ZW50UmVsZWFzZSh0aGlzKTsKLQkJCX0KLQotCQkJX2dldE1vZGVsTWFuYWdlcigpLnJlbGVhc2VGcm9tRWRpdCh0aGlzKTsKLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlzaWduYWxQb3N0TGlmZUN5Y2xlTGlzdGVuZXJSZWxlYXNlKHRoaXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNT0RFTF9NQU5BR0VSX05VTEwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQkvKgotCQkJICogQmUgc3VyZSB0byBjaGVjayB0aGUgc2hhcmVkIHN0YXRlIGJlZm9yZSByZWxlYXNpbmcuIChTaW5jZQotCQkJICogaXNTaGFyZWQgYXNzdW1lcyBhIGNvdW50IG9mIDEgbWVhbnMgbm90IHNoYXJlZCAuLi4gYW5kIHdlIHdhbnQKLQkJCSAqIG91ciAnMScgdG8gYmUgdGhhdCBvbmUuKSBUaGUgcHJvYmxlbSwgb2YgY291cnNlLCBpcyB0aGF0Ci0JCQkgKiBiZXR3ZWVuIHByZS1jeWNsZSBub3RpZmljYXRpb24gYW5kIHBvc3QtcmVsZWFzZSBub3RpZmljYXRpb24sCi0JCQkgKiB0aGUgbW9kZWwgY291bGQgb25jZSBhZ2FpbiBoYXZlIGJlY29tZSBzaGFyZWQsIHJlbmRlcmluZyB0aGUKLQkJCSAqIHJlbGVhc2Ugbm90aWZpY2F0aW9uIGluY29ycmVjdC4KLQkJCSAqLwotCQkJYm9vbGVhbiBpc1NoYXJlZCA9IGlzU2hhcmVkKCk7Ci0KLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlzaWduYWxQcmVMaWZlQ3ljbGVFdmVudFJlbGVhc2UodGhpcyk7Ci0JCQl9Ci0KLQkJCV9nZXRNb2RlbE1hbmFnZXIoKS5yZWxlYXNlRnJvbVJlYWQodGhpcyk7Ci0KLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlzaWduYWxQb3N0TGlmZUN5Y2xlTGlzdGVuZXJSZWxlYXNlKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJlcGxlbmlzaGVzIHRoZSBtb2RlbCB3aXRoIHRoZSByZXNvdXJjZSB3aXRob3V0IHNhdmluZwotCSAqIGFueSBwb3NzaWJsZSBjaGFuZ2VzLiBJdCBpcyB1c2VkIHdoZW4gb25lIGVkaXRvciBtYXkgYmUgY2xvc2luZywgYW5kCi0JICogc3BlY2lmaWFsbHkgc2F5cyBub3QgdG8gc2F2ZSB0aGUgbW9kZWwsIGJ1dCBhbm90aGVyICJkaXNwbGF5IiBvZiB0aGUKLQkgKiBtb2RlbCBzdGlsbCBuZWVkcyB0byBoYW5nIG9uIHRvIHNvbWUgbW9kZWwsIHNvIG5lZWRzIGEgZnJlc2ggY29weS4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJcmVzdWx0ID0gX2dldE1vZGVsTWFuYWdlcigpLnJlbG9hZE1vZGVsKGdldElkKCksIGlucHV0U3RyZWFtKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJLy8gaWYgbWFuYWdlciBpcyBudWxsLCB0aGVuIG5vbmUgaGF2ZSBiZWVuIGFkZGVkLCBzbwotCQkvLyBubyBuZWVkIHRvIHJlbW92ZSBhbnkKLQkJaWYgKGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN5bmNocm9uaXplZCAoZkxpc3RlbmVyTG9jaykgewotCQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJc3luY2hyb25pemVkIChmTGlzdGVuZXJMb2NrKSB7Ci0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZNb2RlbFN0YXRlTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUgb25lIHdlIGFyZQotCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJLy8gb2xkCi0JCQkJLy8gb25lCi0JCQkJZk1vZGVsU3RhdGVMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEEgbWV0aG9kIHRoYXQgbW9kaWZpZXMgdGhlIG1vZGVsJ3Mgc3luY2hyb25pemF0aW9uIHN0YW1wIHRvIG1hdGNoIHRoZQotCSAqIHJlc291cmNlLiBUdXJucyBvdXQgdGhlcmUncyBzZXZlcmFsIHdheXMgb2YgZG9pbmcgaXQsIHNvIHRoaXMgZW5zdXJlcyBhCi0JICogY29tbW9uIGFsZ29yaXRobS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFN5bmNocm9uaXphdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSkgewotCi0KLQkJc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgdG8gaW5pdGlhdGUgbm90aWZpY2F0aW9uIHRvIGFsbCBpbnRlcmVzdGVkCi0JICogcGFydGllcyB0aGF0IGEgbW9kZWwncyB1bmRlcmx5aW5nIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VEZWxldGVkKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsUmVzb3VyY2VEZWxldGVkKHRoaXMpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWxsb3dzIGEgbW9kZWwgY2xpZW50IHRvIGluaXRpYXRlIG5vdGlmaWNhdGlvbiB0byBhbGwKLQkgKiBpbnRlcmVzdGVkIHBhcnRpZXMgdGhhdCBhIG1vZGVsJ3MgdW5kZXJseWluZyByZXNvdXJjZSBsb2NhdGlvbiBoYXMKLQkgKiBjaGFuZ2VkLiBOb3RlOiB3ZSBhc3N1bWUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoYW5nZWQgYmFzZUxvY2F0aW9uLCBJZCwKLQkgKiBldGMuLCBzaW5jZSBpdHMgcmVhbGx5IHVwIHRvIHRoZSBjbGllbnQgdG8gZGV0ZXJtaW5lIHdoYXQncyAibmV3IiBhYm91dAotCSAqIGEgbW92ZWQgbW9kZWwuIENhdXRpb246ICd0aGlzJyBhbmQgJ25ld01vZGVsJyBtYXkgYmUgdGhlIHNhbWUgb2JqZWN0LgotCSAqIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGN1cnJlbnQgd29ya2luZyB3aXRoIEZpbGVNb2RlbFByb3ZpZGVyLCBidXQgaGF2ZQotCSAqIGxlZnQgdGhlIGR1YWwgYXJndW1lbnQgZm9yIGZ1dHVyZSBwb3NzaWJpbGl0aWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsUmVzb3VyY2VNb3ZlZCh0aGlzLCBuZXdNb2RlbCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChzdHJpbmdJZCwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCQl9Ci0KLQkJZmluYWxseSB7Ci0JCQkvLyB3ZSBwdXQgZW5kIG5vdGlmaWNhdGlvbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNhdmUoRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChzdHJpbmdJZCwgZW5jb2RpbmdSdWxlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9uIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2F2ZShJRmlsZSBpRmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChpRmlsZSwgc3RyaW5nSWQsIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQkJfQotCi0JCWZpbmFsbHkgewotCQkJLy8gd2UgcHV0IGVuZCBub3RpZmljYXRpb24gaW4gZmluYWxseSBibG9jaywgc28gZXZlbiBpZgotCQkJLy8gZXJyb3Igb2NjdXJzIGR1cmluZyBzYXZlLCBsaXN0ZW5lcnMgYXJlIHN0aWxsIG5vdGlmaWVkLAotCQkJLy8gc2luY2UgdGhlaXIgY29kZSBjb3VsZCBkZXBlbmQgb24gcmVjZWl2aW5nLCB0byBjbGVhbiB1cAotCQkJLy8gc29tZSBzdGF0ZSwgb3IgY29vcmRpbmF0ZSBvdGhlciByZXNvdXJjZXMuCi0JCQl0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJCW1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzYXZlKElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJpbmdJZCA9IGdldElkKCk7Ci0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkuc2F2ZU1vZGVsKGlGaWxlLCBzdHJpbmdJZCwgZW5jb2RpbmdSdWxlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9vbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChzdHJpbmdJZCwgb3V0cHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JCX0KLQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9uIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdHlwaWNhbGx5IHVzZWQgdG8gZGVub3RlIHRoZSBtb2RlbCdzIHVuZGVybHlpbmcKLQkgKiByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlTG9jYXRpb24oamF2YS5sYW5nLlN0cmluZyBuZXdCYXNlTG9jYXRpb24pIHsKLQotCQlmQmFzZUxvY2F0aW9uID0gbmV3QmFzZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlSWRlbnRpZmllcihTdHJpbmcgY29udGVudFR5cGVJZGVudGlmaWVyKSB7Ci0JCWZFeHBsaWNpdENvbnRlbnRUeXBlSWRlbnRpZmllciA9IGNvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eVN0YXRlKGJvb2xlYW4gZGlydHlTdGF0ZSkgewotCi0JCS8vIG5vIG5lZWQgdG8gcHJvY2VzcyAoc2V0IG9yIGZpcmUgZXZlbnQpLCBpZiBzYW1lIHZhbHVlCi0JCWlmIChmRGlydHlTdGF0ZSAhPSBkaXJ0eVN0YXRlKSB7Ci0JCQkvLyBwcmUtY2hhbmdlIG5vdGlmaWNhdGlvbgotCQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX0RJUlRZX1NUQVRFIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQ7Ci0JCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0KLQkJCS8vIHRoZSBhY3R1YWwgY2hhbmdlCi0JCQlmRGlydHlTdGF0ZSA9IGRpcnR5U3RhdGU7Ci0KLQkJCS8vIG9sZCBub3RpZmljYXRpb24KLQkJCS8vIFRPRE86IEMzIHJlbW92ZSBvbGQgbm90aWZpY2F0aW9uCi0JCQlpZiAoZkRpcnR5U3RhdGUgPT0gZmFsc2UpIHsKLQkJCQkvLyBpZiB3ZSBhcmUgYmVpbmcgc2V0IHRvIG5vdCBkaXJ0eSAoc3VjaCBhcyBqdXN0IGJlZW4gc2F2ZWQpCi0JCQkJLy8gdGhlbiB3ZSBuZWVkIHRvIHN0YXJ0IGxpc3RlbmluZyBmb3IgY2hhbmdlcwotCQkJCS8vIGFnYWluIHRvIGtub3cgd2hlbiB0byBzZXQgc3RhdGUgdG8gdHJ1ZTsKLQkJCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRGlydHlTdGF0ZVdhdGNoZXIpOwotCQkJfQotCQkJZmlyZU1vZGVsRGlydHlTdGF0ZUNoYW5nZWQodGhpcywgZGlydHlTdGF0ZSk7Ci0KLQotCQkJLy8gcG9zdCBjaGFuZ2Ugbm90aWZpY2F0aW9uCi0JCQl0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ESVJUWV9TVEFURSB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJCW1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB3aWxsIGxpa2VseSBiZSBkZXByZWNhdGVkIHNvb24sIGluIGZhdm9yIG9mIGRpcmVjdCAnYWRkcycKLQkgKiAgICAgICAgICAgICAuLi4gYnV0IHRha2VzIHNvbWUgcmVkZXNpZ24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkpIHsKLQkJdGhpcy5mYWN0b3J5UmVnaXN0cnkgPSBmYWN0b3J5UmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGlkIGlzIHRoZSBpZCB0aGF0IHRoZSBtb2RlbCBtYW5hZ2VyIHVzZXMgdG8gaWRlbnRpZnkgdGhpcyBtb2RlbC4gSWYKLQkgKiBpdCBpcyBiZWluZyBzZXQgaGVyZSwgaXQgbWVhbnMgdGhlIG1vZGVsIG1hbmdlciBpcyBhbHJlYWR5IG1hbmFnaW5nIHRoZQotCSAqIG1vZGVsIHdpdGggYW5vdGhlciBpZCwgc28gd2UgaGF2ZSB0byBrZWVwIGl0IGluIHN5bmMuIFRoaXMgbWV0aG9kIGNhbGxzCi0JICogbm90aWZpZXMgbGlzdG5lcnMsIGlmIHRoZXkgaGF2ZW4ndCBiZWVuIG5vdGlmaWVkIGFscmVhZHksIHRoYXQgYSAibW9kZWwKLQkgKiBzdGF0ZSBjaGFuZ2UiIGlzIGFib3V0IHRvIG9jY3VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCi0KLQkJLy8gSXQgbWFrZXMgbm8gc2Vuc2UsIEkgZG9uJ3QgdGhpbmssIHRvIGhhdmUgYW4gaWQgb2YgbnVsbCwgc28KLQkJLy8gd2UnbGwgdGhyb3cgYW4gaWxsZWdhbCBhcmd1bWVudCBleGNlcHRpb24gaWYgc29tZW9uZSB0cnlzLiBOb3RlOgotCQkvLyB0aGUgSU1vZGVsTWFuYWdlciBjb3VsZCBub3QgbWFuYWdlIGEgbW9kZWwgd2l0aCBhbiBpZCBvZiBudWxsLAotCQkvLyBzaW5jZSBpdCB1c2VzIGhhc2h0YWJsZXMsIGFuZCB5b3UgY2FuJ3QgaGF2ZSBhIG51bGwgaWQgZm9yIGEKLQkJLy8gaGFzaHRhYmxlLgotCQlpZiAobmV3SWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU1NFQ29yZU1lc3NhZ2VzLkFfbW9kZWxfc19pZF9jYW5fbm90X2JlX251X0VYQ18pOyAvLyROT04tTkxTLTEkID0gIkEgbW9kZWwncyBpZCBjYW4gbm90IGJlIG51bGwiCi0JCS8vIFRvIGd1YXJkIGFnYWluc3QgdGhyb3dpbmcgYSBzcHVyaW91cyBSZXNvdXJjZUluVXNlIGV4Y2VwdGlvbiwKLQkJLy8gd2hpY2ggY2FuIG9jY3VyIHdoZW4gdHdvIHBpZWNlcyBvZiBjb2RlIGJvdGggd2FudCB0byBjaGFuZ2UgdGhlIGlkLAotCQkvLyBzbyB0aGUgc2Vjb25kIHJlcXVlc3QgaXMgc3B1cmlvdXMsIHdlJ2xsIGlnbm9yZSBhbnkgcmVxdWVzdHMgdGhhdAotCQkvLyBhdHRlbXB0IHRvIGNoYW5nZSB0aGUgaWQgdG8gd2hhdCBpdCBhbHJlYWR5IGlzIC4uLiBub3RlLCB3ZSB1c2UKLQkJLy8gJ2VxdWFscycsIG5vdCBpZGVudGl0eSAoJz09Jykgc28gdGhhdCB0aGluZ3MgbGlrZQotCQkvLyBzdHJpbmdzIGNhbiBiZSB1c2VkLiBUaGlzIGlzIHRoZSBzYW1lIGNyaXRlcmlhIHRoYXQgaWRzIGFyZQotCQkvLyBmb3VuZCBpbiBtb2RlbCBtYW5hZ2VyIC0tIHdlbGwsIGFjdHVhbGx5LCBJIGp1c3QgY2hlY2tlZCwgYW5kIGZvcgotCQkvLyB0aGUgaGFzaHRhYmxlIGltcGwsIHRoZSBjcml0ZXJpYSB1c2VzIC5lcXVhbHMgQU5EIHRoZSBjb25kaXRpb24KLQkJLy8gdGhhdCB0aGUgaGFzaCB2YWx1ZXMgYmUgaWRlbnRpY2FsIChJJ20gYXNzdW1pbmcgdGhpcyBpcyBhbHdheXMKLQkJLy8gdHJ1ZSwgaWYgZXF1YWxzIGlzIHRydWUsIGZvciBub3csIEknbSBub3Qgc3VyZQotCQkvLyB3ZSBjYW4gYXNzdW1lIHRoYXQgaGFzaHRhYmxlIHdpbGwgYWx3YXlzIGJlIHVzZWQsIGJ1dCBpbgotCQkvLyBnZW5lcmFsLCBzaG91bGQgbWF0Y2guKQotCQkvLwotCQlpZiAobmV3SWQuZXF1YWxzKGZJZCkpCi0JCQlyZXR1cm47Ci0JCS8vIHdlIG11c3QgZ3VhcmQgYWdhaW5zdCByZWFzc2lnbmluZyBhbiBpZCB0byBvbmUgdGhhdCB3ZSBhbHJlYWR5Ci0JCS8vIGFyZSBtYW5hZ2luZy4KLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gaW5Vc2UgPSAoKE1vZGVsTWFuYWdlckltcGwpZ2V0TW9kZWxNYW5hZ2VyKCkpLmlzSWRJblVzZShuZXdJZCk7Ci0JCQlpZiAoaW5Vc2UpIHsKLQkJCQl0aHJvdyBuZXcgUmVzb3VyY2VJblVzZSgpOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQkvLyBub3JtYWwgY29kZSBwYXRoCi0JCQlhYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCVN0cmluZyBvbGRJZCA9IGZJZDsKLQkJCWZJZCA9IG5ld0lkOwotCQkJaWYgKGdldE1vZGVsTWFuYWdlcigpICE9IG51bGwpIHsKLQkJCQkvLyBpZiBtYW5hZ2VkIGFuZCB0aGUgaWQgaGFzIGNoYW5nZWQsIG5vdGlmeSB0bwotCQkJCS8vIElNb2RlbE1hbmFnZXIKLQkJCQkvLyBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24gbm90IHRvIGRvIHRoYXQKLQkJCQlpZiAob2xkSWQgIT0gbnVsbCAmJiBuZXdJZCAhPSBudWxsICYmICFuZXdJZC5lcXVhbHMob2xkSWQpKSB7Ci0JCQkJCWdldE1vZGVsTWFuYWdlcigpLm1vdmVNb2RlbChvbGRJZCwgbmV3SWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIG1ha2Ugc3VyZSB0aGlzIGZpbmFsbHkgaXMgb25seSBleGVjdXRlZCBpZiAnYWJvdXQgdG8gQ2hhbmdlCi0JCQkvLyBtb2RlbCcgaGFzCi0JCQkvLyBiZWVuIGV4ZWN1dGVkLgotCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZW50VHlwZURlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZURlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgY29udGVudFR5cGVEZXNjcmlwdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbEhhbmRsZXIoSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIpIHsKLQotCQkvLyBubyBuZWVkIHRvIGZpcmUgZXZlbnRzIGlmIG1vZGVsSGFuZGxlciBoYXMgYmVlbiBudWxsCi0JCS8vIGZvciB0aGlzIG1vZGVsIC0tCi0JCS8vIHRoaXMgaXMgYW4gYXR0ZW1wdCBhdCBpbml0aWFsaXphdGlvbiBvcHRpbWl6YXRpb24gYW5kIG1heSBuZWVkCi0JCS8vIHRvIGNoYW5nZSBpbiBmdXR1cmUuCi0JCWJvb2xlYW4gdHJ1ZUNoYW5nZSA9IGZhbHNlOwotCQlpZiAoZk1vZGVsSGFuZGxlciAhPSBudWxsKQotCQkJdHJ1ZUNoYW5nZSA9IHRydWU7Ci0JCWlmICh0cnVlQ2hhbmdlKSB7Ci0JCQlpbnRlcm5hbEFib3V0VG9CZUNoYW5nZWQoKTsKLQkJfQotCQlmTW9kZWxIYW5kbGVyID0gbW9kZWxIYW5kbGVyOwotCQlpZiAodHJ1ZUNoYW5nZSkgewotCQkJaW50ZXJuYWxNb2RlbENoYW5nZWQoKTsKLQkJfQotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbE1hbmFnZXIoSU1vZGVsTWFuYWdlciBuZXdNb2RlbE1hbmFnZXIpIHsKLQotCQlmTW9kZWxNYW5hZ2VyID0gbmV3TW9kZWxNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ld1N0YXRlKGJvb2xlYW4gbmV3U3RhdGUpIHsKLQotCQlmTmV3U3RhdGUgPSBuZXdTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGEgImZsYWciIHRoYXQgcmVpbml0aWFsaXphdGlvbiBpcyBuZWVkZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVpbml0aWFsaXplTmVlZGVkKGJvb2xlYW4gbmVlZGVkKSB7Ci0KLQkJcmVpbml0aWFsaXphdGlvbk5lZWRlZCA9IG5lZWRlZDsKLQl9Ci0KLQkvKioKLQkgKiBIb2xkcyBhbnkgZGF0YSB0aGF0IHRoZSByZWluaXQgcHJvY2VkdXJlIG1pZ2h0IGZpbmQgdXNlZnVsIGluCi0JICogcmVpbml0aWFsaXppbmcgdGhlIG1vZGVsLiBUaGlzIGlzIGhhbmR5LCBzaW5jZSB0aGUgcmVpbml0aWFsaXphdGlvbiBtYXkKLQkgKiBub3QgdGFrZSBwbGFjZSBhdCBvbmNlLCBhbmQgc29tZSAib2xkIiBkYXRhIG1heSBiZSBuZWVkZWQgdG8gcHJvcGVybHkKLQkgKiB1bmRvIHByZXZpb3VzIHNldHRpbmdzLiBOb3RlOiB0aGUgcGFyYW1ldGVyIHdhcyBpbnRlbnRpb25hbGx5IG1hZGUgdG8KLQkgKiBiZSBvZiB0eXBlICdPYmplY3QnIHNvIGRpZmZlcmVudCBtb2RlbHMgY2FuIHVzZSBpbiBkaWZmZXJlbnQgd2F5cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWluaXRpYWxpemVTdGF0ZURhdGEoT2JqZWN0IG9iamVjdCkgewotCi0JCXJlaW5pdGlhbGl6ZVN0YXRlRGF0YSA9IG9iamVjdDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld1Jlc29sdmVyKSB7Ci0KLQkJZlJlc29sdmVyID0gbmV3UmVzb2x2ZXI7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJYm9vbGVhbiBsaWZlQ3ljbGVOb3RpZmljYXRpb24gPSBmYWxzZTsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRGlydHlTdGF0ZVdhdGNoZXIpOwotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIpOwotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIpOwotCQkJLy8gcHJlY2hhbmdlIG5vdGlmaWNhdGlvbgotCQkJbGlmZUN5Y2xlTm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBEb2N1bWVudENoYW5nZWQoTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQsIHRoaXMsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCi0JCS8vIGhvbGQgZm9yIGxpZmUgY3ljbGUgbm90aWZpY2F0aW9uCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcHJldmlvdXNEb2N1bWVudCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCS8vIHRoZSBhY3R1YWwgY2hhbmdlCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotCQkvLyBhdCB0aGUgc3VwZXIgY2xhc3MgbGV2ZWwsIHdlJ2xsIGxpc3RlbiBmb3Igc3RydWN0dXJlZERvY3VtZW50Ci0JCS8vIGNoYW5nZXMKLQkJLy8gc28gd2UgY2FuIHNldCBvdXIgZGlydHkgc3RhdGUgZmxhZwotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcik7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEb2N1bWVudFRvTW9kZWxOb3RpZmllcik7Ci0JCX0KLQotCQlpZiAobGlmZUN5Y2xlTm90aWZpY2F0aW9uKSB7Ci0JCQkvLyBwb3N0IGNoYW5nZSBub3RpZmljYXRpb24KLQkJCU1vZGVsTGlmZWN5Y2xlRXZlbnQgbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBEb2N1bWVudENoYW5nZWQoTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5ULCB0aGlzLCBwcmV2aW91c0RvY3VtZW50LCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAyOjMwOjI2Ci0JICogUE0pCi0JICogCi0JICogQHBhcmFtIG5ld1N5bmNocm9uaXphdGlvblN0YW1wCi0JICogICAgICAgICAgICBsb25nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3luY2hyb25pemF0aW9uU3RhbXAobG9uZyBuZXdTeW5jaHJvbml6YXRpb25TdGFtcCkgewotCi0JCWZTeW5jaHJvbml6YXRpb25TdGFtcCA9IG5ld1N5bmNocm9uaXphdGlvblN0YW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuZG9NYW5hZ2VyKElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyKSB7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkb2N1bWVudCB3YXMgbnVsbCB3aGVuIHVuZG8gbWFuYWdlciBzZXQgb24gbW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXRVbmRvTWFuYWdlcih1bmRvTWFuYWdlcik7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgY2FsbGVkIG9ubHkgYnkgImZyaWVuZGx5IiBjbGFzc2VzLCBzdWNoIGFzIE1vZGVsTWFuYWdlciwgYW5kCi0JICogc3ViY2xhc3Nlcy4KLQkgKi8KLQl2b2lkIHNpZ25hbExpZmVjeWNsZUV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2lnbmFsUG9zdExpZmVDeWNsZUxpc3RlbmVyUmVsZWFzZShJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfUkVMRUFTRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCS8vIHdoYXQncyB3cm9uZyB3aXRoIHRoaXMgZGVzaWduIHRoYXQgYSBjYXN0IGlzIG5lZWRlZCBoZXJlIT8KLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHN0cnVjdHVyZWRNb2RlbCwgdHlwZSk7Ci0JCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuc2lnbmFsTGlmZWN5Y2xlRXZlbnQoZXZlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaWduYWxQcmVMaWZlQ3ljbGVFdmVudFJlbGVhc2UoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1JFTEVBU0VEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQ7Ci0JCS8vIHdoYXQncyB3cm9uZyB3aXRoIHRoaXMgZGVzaWduIHRoYXQgYSBjYXN0IGlzIG5lZWRlZCBoZXJlIT8KLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHN0cnVjdHVyZWRNb2RlbCwgdHlwZSk7Ci0JCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuc2lnbmFsTGlmZWN5Y2xlRXZlbnQoZXZlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0ZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDMwMzkwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0ZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNpbXBseSBtYWludGFpbnMgdGhlIGxpc3Qgb2YgZmFjdG9yaWVzIGFuZCByZXR1cm5zIHNpbmdsZXRvbgotICogaW5zdGFuY2VzIG9mIHRoZW0uIFNvbWUgImJ1aWx0IGluIiB0eXBlcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvcm0KLSAqIEZhY3RvcnlDb25maWcsIGlmIG5vdCBmb3VuZCByZWdpc3RlcmQsIGJ1dCBub3JtYWxseSBjbGllbnRzIGNhbi9zaG91bGQKLSAqIHJlZ2lzdGVyIHRoZWlyIG93biBmYWN0b3JpZXMuCi0gKiAKLSAqIE5vdCBpbnRlbmRlZCBmb3IgY2xpZW50cyB0byBzdWJjbGFzcyBvciBpbnN0YW50aWF0ZS4KLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmFjdG9yeVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgTGlzdCBmYWN0b3JpZXM7Ci0KLQkvKioKLQkgKiBpbnRlbnRpb25hbGx5IGRlZmF1bHQgYWNjZXNzCi0JICovCi0JRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCi0JfQotCi0JcHJpdmF0ZSBMaXN0IF9nZXRGYWN0b3JpZXMoKSB7Ci0KLQkJaWYgKGZhY3RvcmllcyA9PSBudWxsKSB7Ci0JCQkvLyBtYXkgbmVlZCB0byB1c2UgamF2YS51dGlsLkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QoKSBpZgotCQkJLy8gc3luY3Jvbml6YXRpb24gYmVjb21lcwotCQkJLy8gbmVjZXNzYXJ5IChhbmQgaWYgc28sIHJlbWVtYmVyIHRvIHN5bmNocm9uaXplIG9uIGZhY3RvcmllcykKLQkJCWZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yaWVzOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJX2dldEZhY3RvcmllcygpLmFkZChmYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckZhY3RvcmllcygpIHsKLQkJZmFjdG9yaWVzLmNsZWFyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEZhY3RvcnlSZWdpc3RyeSNjb250YWlucyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IHR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UncmUgbm90IHVzaW5nIGNsb25lZCBsaXN0LCBzbyBzdHJpY3RseSBzcGVha2luZwotCQkvLyBpcyBub3QgdGhyZWFkIHNhZmUuCi0JCUxpc3QgaW50ZXJuYWxMaXN0ID0gX2dldEZhY3RvcmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVybmFsTGlzdC5zaXplKCk7IGkrKykgewotCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGludGVybmFsTGlzdC5nZXQoaSk7Ci0JCQlpZiAoZmFjdG9yeS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGxpc3Qgb2YgZmFjdG9yaWVzIGluIHRoZSByZWdpc3RyeS4gTm90ZToKLQkgKiB0aGlzIGNhbiBub3QgYmUgdXNlZCB0byBhZGQvcmVtb3ZlIGZhY3Rvcmllcy4gSXRzIHByaW1hcmlseSBwcm92aWRlZAotCSAqIGZvciB0aG9zZSBmZXcgY2FzZXMgd2hlcmUgYSBsaXN0IG9mIGZhY3RvcmllcyBtdXN0IGJlIGNvcGllZCBmcm9tIG9uZQotCSAqIG1vZGVsIGFuZCBhZGRlZCB0byBhbm90aGVyLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZhY3RvcmllcygpIHsKLQkJLy8gbm90ZTogZm9yIG9iamVjdCBpbnRlZ3JpdHksIHdlIGRvbid0IGxldCBhbnlvbmUgZ2V0Ci0JCS8vIG91ciBtYWluIGxpc3QgKHNvIHRoZXkgaGF2ZSB0byBhZGQgdGhyb3VnaCBhZGRGYWN0b3J5KSwKLQkJLy8gYnV0IHdlIHdpbGwgcmV0dXJuIGEgc2hhbGxvdyAiY2xvbmVkIiBsaXN0LgotCQlMaXN0IGZhY3RvcnlMaXN0ID0gbmV3IEFycmF5TGlzdChfZ2V0RmFjdG9yaWVzKCkpOwotCQlyZXR1cm4gZmFjdG9yeUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgYSBub3QgYSBwdXJlIHJlc2lzdHJ5LiBGYWN0b3JpZXMgcmV0cmlldmVkIGJhc2VkIG9uCi0JICogdGhlaXIgcmVzcG9uc2UgdG8gImlzRmFjdG9yeUZvclR5cGUodHlwZSkiLiBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgbW9yZQotCSAqIHRoYW4gb25lIGZhY3RvcnkgdGhhdCBjYW4gYW5zd2VyICd0cnVlJyB0aGF0IHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkCi0JICogZmFjdG9yeSBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGdldEZhY3RvcnlGb3IoT2JqZWN0IHR5cGUpIHsKLQotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChmYWN0b3JpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGlzdFNpemUgPSBmYWN0b3JpZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gbGlzdFNpemUgLSAxOyBpID49IDA7IGktLSkgewotCQkJLy8gSXQgaXMgdGhlIGFkYXB0ZXIgZmFjdG9yaWVzIHJlc3BvbnNpYmlsaXR5IHRvIGFuc3dlcgotCQkJLy8gaXNGYWN0b3J5Rm9yVHlwZSBzbyBpdCBnZXRzIGNob29zZW4uCi0JCQkvLyBOb3RpY2Ugd2UgYXJlIGdvaW5nIHRocm91Z2ggdGhlIGxpc3QgYmFja3dhcmRzIHRvIGdldCB0aGUKLQkJCS8vIGZhY3RvcnkgYWRkZWQgbGFzdC4KLQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgYSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBmYWN0b3JpZXMuZ2V0KGkpOwotCQkJaWYgKGEuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJCXJlc3VsdCA9IGE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG1vZGlmaWVkIHRvIHdvcmsgb24gY29weSBvZiBsaXN0LCBmb3IgVjVQVEYxCi0JCS8vIHNlbmQgcmVsZWFzZSB0byBsb2NhbCBjb3B5IG9mIGxpc3QKLQkJLy8gb2YgZmFjdG9yaWVzLCBzaW5jZSBzb21lIGZhY3RvcmllcywgZHVyaW5nCi0JCS8vIHRoZWlyIHJlbGVhc2UgZnVuY3Rpb24sIG1heSByZW1vdmUKLQkJLy8gdGhlbXNlbHZlcyBmcm9tIHRoZSByZWdpc3RyeS4KLQkJTGlzdCBsb2NhbExpc3QgPSBnZXRGYWN0b3JpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgYSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBsb2NhbExpc3QuZ2V0KGkpOwotCQkJLy8gVG8gaGVscCBidWxsZXQgcHJvb2YgY29kZSwgd2UnbGwgY2F0Y2ggYW5kIGxvZwotCQkJLy8gYW55IG1lc3NhZ2VzIHRocm93biBieSBmYWN0b3JpZXMgZHVyaW5nIHJlbGVhc2UsCi0JCQkvLyBidXQgd2UnbGwgYXR0ZW1wdCB0byBrZWVwIGdvaW5nLgotCQkJLy8gSW4gbmVhcmx5IGFsbCBjYXNlcywgdGhvdWdoLCBzdWNoIGVycm9ycyBhcmUKLQkJCS8vIHNldmVyZSBmb3IgcHJvZHVjdC9jbGllbnQsIGFuZCBuZWVkIHRvIGJlIGZpeGVkLgotCQkJdHJ5IHsKLQkJCQlhLnJlbGVhc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlByb2dyYW0gcHJvYmxlbSByZWxlYXNpbmcgZmFjdG9yeSIgKyBhLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGZhY3RvcnkgaWYgaXQgY2FuIGJlIHJldHJpZXZlZCBieSBnZXRGYWN0b3J5Rm9yKHR5cGUpLiBJZgotCSAqIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIGFsbCBhcmUgcmVtb3ZlZC4gSWYgdGhlcmUgaXMgbm9uZSwgdGhlIGNhbGwKLQkgKiBzaW1wbHkgcmV0dXJucyAodGhhdCBpcywgaXQgaXMgbm90IGNvbnNpZGVyZWQgYW4gZXJyb3IpLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZhY3Rvcmllc0ZvcihqYXZhLmxhbmcuT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlpbnQgbGlzdFNpemUgPSBmYWN0b3JpZXMuc2l6ZSgpOwotCQkJLy8gd2UnbGwgZ28gYmFja3dhcmRzIHRocm91Z2ggbGlzdCwgc2luY2Ugd2UncmUgcmVtb3ZpbmcsIHNvCi0JCQkvLyAnc2l6ZScgY2hhbmdlIHdvbid0IG1hdHRlci4KLQkJCS8vIE5vdGU6IEknbSBhc3N1bWluZyBvdGhlciBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbiBkbyBub3QgY2hhbmdlCi0JCQkvLyBwb3NpdGlvbgotCQkJLy8gc2ltcGx5IGJlY2F1c2UgYW5vdGhlciB3YXMgcmVtb3ZlZC4KLQkJCWZvciAoaW50IGkgPSBsaXN0U2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJLy8gSXQgaXMgdGhlIGFkYXB0ZXIgZmFjdG9yaWVzIHJlc3BvbnNpYmlsaXR5IHRvIGFuc3dlcgotCQkJCS8vIGlzRmFjdG9yeUZvclR5cGUgc28gaXQgZ2V0cyBjaG9vc2VuLgotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgYSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBmYWN0b3JpZXMuZ2V0KGkpOwotCQkJCWlmIChhLmlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCQkJZmFjdG9yaWVzLnJlbW92ZShhKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlfZ2V0RmFjdG9yaWVzKCkucmVtb3ZlKGZhY3RvcnkpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0xpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNmMDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiBGb3IgImludGVybmFsIHVzZSIgb25seSBieSBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbAotICovCi0KLWNsYXNzIExpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgewotCXByaXZhdGUgT2JqZWN0W10gZkxpc3RlbmVyczsKLQotCUxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBjb3B5IG9mIHRoZSBnaXZlbiBsaXN0ZW5lciB0byB0aGUgbGlzdCBvZiBMaWZlIEN5Y2xlCi0JICogTGlzdGVuZXJzLgotCSAqIAotCSAqIE11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSBsaXN0ZW5lciBhcmUgYWxsb3dlZC4gVGhpcyBpcyByZXF1aXJlZCB0bwotCSAqIHN1cHBvcnQgdGhyZWFkZWQgbGlzdGVuZXIgbWFuYWdlbWVudCBwcm9wZXJseSBhbmQgZm9yIG1vZGVsLWRyaXZlbiBtb3ZlCi0JICogdG8gd29yay4gRm9yIGV4YW1wbGUsIHR3byBhZGRzIGFuZCBhIHNpbmdsZSByZW1vdmUgc2hvdWxkIHJlc3VsdCBpbiB0aGUKLQkgKiBsaXN0ZW5lciBzdGlsbCBsaXN0ZW5pbmcgZm9yIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIGFkZExpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChMb2dnZXIuREVCVUcgJiYgVXRpbGl0aWVzLmNvbnRhaW5zKGZMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIklNb2RlbExpZmVjeWNsZUxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgbGlzdGVuaW5nIG1vcmUgdGhhbiBvbmNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWludCBvbGRTaXplID0gMDsKLQkJaWYgKGZMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yIGZpcnN0Ci0JCQkvLyB0aW1lIHRocm91Z2gKLQkJCW9sZFNpemUgPSBmTGlzdGVuZXJzLmxlbmd0aDsKLQkJfQotCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCX0KLQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkvLwotCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCWZMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHNpbmdsZSBjb3B5IG9mIHRoZSBnaXZlbiBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IG9mIExpZmUgQ3ljbGUKLQkgKiBMaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0Jdm9pZCByZW1vdmVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJCWludCBvbGRTaXplID0gZkxpc3RlbmVycy5sZW5ndGg7Ci0JCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlib29sZWFuIHJlbW92ZWRPbmNlID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCWlmIChmTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyICYmICFyZW1vdmVkT25jZSkgewotCQkJCQkvLyBpZ25vcmUgb24gdGhlIGZpcnN0IG1hdGNoCi0JCQkJCXJlbW92ZWRPbmNlID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXQncyBub3QgdGhlIG9uZSB3ZSBhcmUgcmVtb3ZpbmcKLQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZkxpc3RlbmVyc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZSBvbGQKLQkJCS8vIG9uZQotCQkJZkxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHICYmIFV0aWxpdGllcy5jb250YWlucyhmTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHJlbW92ZWQgb25jZSBidXQgc3RpbGwgbGlzdGVuaW5nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jdm9pZCBzaWduYWxMaWZlY3ljbGVFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChMb2dnZXIuREVCVUdfTElGRUNZQ0xFKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWxMaWZlY3ljbGVFdmVudCBmaXJlZCBmb3IgIiArIGV2ZW50LmdldE1vZGVsKCkuZ2V0SWQoKSArICI6ICIgKyBldmVudC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGVsTGlmZWN5Y2xlRXZlbnQgZmlyZWQgZm9yICIgKyBldmVudC5nZXRNb2RlbCgpLmdldElkKCkgKyAiOiAiICsgZXZlbnQudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCS8vIFdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlIGxpc3RlbmVyIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZQotCQkvLyBsaXN0ZW5lciBhcnJheSBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV07Ci0JCQkJLy8gb25seSBvbmUgdHlwZSBvZiBsaXN0ZW5lciBmb3Igbm93IC4uLiB0aGlzIGNvdWxkIGJlY29tZQotCQkJCS8vIG1vcmUgY29tcGxleAotCQkJCWlmICgoZXZlbnQuZ2V0SW50ZXJuYWxUeXBlKCkgJiBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVCkgPT0gTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQpIHsKLQkJCQkJbGlzdGVuZXIucHJvY2Vzc1ByZU1vZGVsRXZlbnQoZXZlbnQpOwotCQkJCX0KLQkJCQlpZiAoKGV2ZW50LmdldEludGVybmFsVHlwZSgpICYgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQpIHsKLQkJCQkJbGlzdGVuZXIucHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL01vZGVsTGlmZWN5Y2xlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxMaWZlY3ljbGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY2NmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxMaWZlY3ljbGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGlzIGFuIGVhcmx5IHZlcnNpb24gb2YgYSBjbGFzcyB0aGF0IG1heSBjaGFuZ2Ugb3ZlciB0aGUgbmV4dCBmZXcKLSAqIG1pbGVzdG9uZXMuCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxMaWZlY3ljbGVFdmVudCB7Ci0KLQotCS8vIHRoaXMgbGlzdCBpcyBmb3IgInB1YmxpYyIgY29uc3VtcHRpb24KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9TQVZFRCA9IDB4MDAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9SRUxFQVNFRCA9IDB4MDAwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCA9IDB4MDAwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9ESVJUWV9TVEFURSA9IDB4MDAwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9SRVZFUlQ9IDB4MDAwNTsKLQotCS8vIFRPRE86IGZpbmlzaCBzdXBwb3J0IGZvciB0aGVzZQotCS8vIGZvbGxvd2luZyBub3QgaW1wbGVtZW50ZWQgeWV0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVJTklUSUFMSVpFRCA9IDB4MDAwNjsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEQVBURVJTX05PVElGSUVEID0gMHgwMDA3OwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVTT1VSQ0VfTU9WRUQgPSAweDAwMDg7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9SRVNPVVJDRV9ERUxFVEVEID0gMHgwMDA5OwotCi0JLy8gVGhpcyBsaXN0ICh1cHBlciB0d28gYnl0ZXMpIGlzIGZvciBvbmx5IGludGVybmFsIG1lY2hhbmlzbXMgYW5kCi0JLy8gc3ViY2xhc3NlcwotCS8vIEZvciBzaW1wbGljaXR5IHRoZXkgYXJlICJtYXNrZWQgb3V0IiB3aGVuIGNsaWVudCBjYWxscyBnZXRUeXBlKCkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQUkVfRVZFTlQgPSAweDAxMDA7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BU0sgPSAweDAwRkY7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9FVkVOVCA9IDB4MDIwMDsKLQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZNb2RlbDsKLQlwcml2YXRlIGludCBmVHlwZTsKLQotCXB1YmxpYyBNb2RlbExpZmVjeWNsZUV2ZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNb2RlbExpZmVjeWNsZUV2ZW50KGludCB0eXBlKSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBNb2RlbExpZmVjeWNsZUV2ZW50KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgdHlwZSkgewotCQl0aGlzKHR5cGUpOwotCQlmTW9kZWwgPSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVidWdTdHJpbmcoaW50IHR5cGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSAmIE1BU0spIHsKLQkJCWNhc2UgTU9ERUxfU0FWRUQgOgotCQkJCXJlc3VsdCA9ICJNT0RFTF9TQVZFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERUxfUkVMRUFTRUQgOgotCQkJCXJlc3VsdCA9ICJNT0RFTF9SRUxFQVNFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCA6Ci0JCQkJcmVzdWx0ID0gIk1PREVMX0RPQ1VNRU5UX0NIQU5HRUQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVMX0RJUlRZX1NUQVRFIDoKLQkJCQlyZXN1bHQgPSAiTU9ERUxfRElSVFlfU1RBVEUiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQkvKgotCQkJICogY2FzZSBNT0RFTF9SRUlOSVRJQUxJWkVEIDogcmVzdWx0ID0gIk1PREVMX1JFSU5JVElBTElaRUQiOwotCQkJICogYnJlYWs7IGNhc2UgTU9ERUxfUkVMT0FERUQgOiByZXN1bHQgPSAiTU9ERUxfUkVMT0FERUQiOyBicmVhazsKLQkJCSAqIGNhc2UgQURBUFRFUlNfTk9USUZJRUQgOiByZXN1bHQgPSAiQURBUFRFUlNfTk9USUZJRUQiOyBicmVhazsKLQkJCSAqIGNhc2UgTU9ERUxfUkVTT1VSQ0VfTU9WRUQgOiByZXN1bHQgPSAiTU9ERUxfUkVTT1VSQ0VfTU9WRUQiOwotCQkJICogYnJlYWs7IGNhc2UgTU9ERUxfUkVTT1VSQ0VfREVMRVRFRCA6IHJlc3VsdCA9Ci0JCQkgKiAiTU9ERUxfUkVTT1VSQ0VfREVMRVRFRCI7IGJyZWFrOwotCQkJICovCi0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNb2RlbExpZmVjeWNsZUV2ZW50IGRpZCBub3QgaGF2ZSB2YWxpZCB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0SW50ZXJuYWxUeXBlKCkgewotCi0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbCgpIHsKLQotCQlyZXR1cm4gZk1vZGVsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQotCQkvLyBmb3Igbm93LCB3ZSdsbCBtYXNrIHR5cGUgdG8gInB1YmxpYyIgb25lcyB0aGlzIGVhc3kKLQkJLy8gd2F5IC4uLiBidXQgSSBrbm93IHRoZXJlIG11c3QgYmUgYSBiZXR0ZXIgd2F5Ci0JCXJldHVybiBmVHlwZSAmIE1BU0s7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9ICJNb2RlbExpZmVjeWNsZUV2ZW50OiAiICsgZGVidWdTdHJpbmcoZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL01vZGVsTWFuYWdlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmY2OTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5OdWxsTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFN0cmVhbUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Qcm9qZWN0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0vKioKLSAqIE5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLCByZWZlcmVuY2VkIG9yIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgotICogCi0gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZywgcmV0cmlldmluZywgYW5kIGNhY2hpbmcKLSAqIFN0cnVjdHVyZWRNb2RlbHMgSXQgcmV0cmlldmVzIHRoZSBjYWNoZWQgb2JqZWN0cyBieSBhbiBpZCB3aGljaCBpcwotICogdHlwaWNhbGx5IGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmVzb3VyY2VzIFVSSS4gTm90ZTogSXRzIGltcG9ydGFudCB0aGF0Ci0gKiBhbGwgY2xpZW50cyB0aGF0IHNoYXJlIGEgcmVzb3VyY2UgZG8gc28gdXNpbmcgPGI+aWRlbnRpY2FsIDwvYj4KLSAqIGlkZW50aWZpZXJzLCBvciBlbHNlIGRpZmZlcmVudCBpbnN0YW5jZXMgd2lsbCBiZSBjcmVhdGVkIGFuZCByZXRyaWV2ZWQsCi0gKiBldmVuIGlmIHRoZXkgYWxsIHRlY2huaWNhbGx5IHBvaW50IHRvIHRoZSBzYW1lIHJlc291cmNlIG9uIHRoZSBmaWxlIHN5c3RlbS4KLSAqIFRoaXMgY2xhc3MgYWxzbyBwcm92aWRlcyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gcmVnaXN0ZXIgTW9kZWwgTG9hZGVycyBhbmQKLSAqIER1bXBlcnMgYmFzZWQgb24gJ3R5cGUnLgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIElNb2RlbE1hbmFnZXIgewotCi0Jc3RhdGljIGNsYXNzIFJlYWRFZGl0VHlwZSB7Ci0JCVJlYWRFZGl0VHlwZShTdHJpbmcgdHlwZSkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBEYXRhIGNsYXNzIHRvIHRyYWNrIG91ciBzaGFyZWQgb2JqZWN0cwotCSAqLwotCSBzdGF0aWMgY2xhc3MgU2hhcmVkT2JqZWN0IHsKLQkJaW50IHJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJaW50IHJlZmVyZW5jZUNvdW50Rm9yUmVhZDsKLQkJSVN0cnVjdHVyZWRNb2RlbCB0aGVTaGFyZWRNb2RlbDsKLQkJYm9vbGVhbiBpbml0aWFsaXppbmcgPSB0cnVlOwotCQlib29sZWFuIGRvV2FpdCA9IHRydWU7Ci0JCQotCQlTaGFyZWRPYmplY3QoSVN0cnVjdHVyZWRNb2RlbCBzaGFyZWRNb2RlbCkgewotCQkJdGhlU2hhcmVkTW9kZWwgPSBzaGFyZWRNb2RlbDsKLQkJCXJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9IDA7Ci0JCQlyZWZlcmVuY2VDb3VudEZvckVkaXQgPSAwOwotCQl9Ci0JCQotCQkvKioKLQkJICogV2FpdHMgdW50aWwgdGhpcyBzaGFyZWQgb2JqZWN0IGhhcyBiZWVuIGF0dGVtcHRlZCB0byBiZSBsb2FkZWQuIAotCQkgKiBUaGUgbG9hZCBpcyAiYXR0ZW1wdGVkIiBiZWNhdXNlIG5vdCBhbGwgbG9hZHMgcmVzdWx0IGluIGEgbW9kZWwuIAotCQkgKiBIb3dldmVyLCB1cG9uIGxlYXZpbmcgdGhpcyBtZXRob2QsIHRoZVNoYXJlTW9kZWwgdmFyaWFibGUKLQkJICogaXMgdXAtdG8tZGF0ZS4KLQkJICovCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3YWl0Rm9yTG9hZEF0dGVtcHQoKSB7Ci0JCQl3aGlsZShpbml0aWFsaXppbmcpIHsKLQkJCQl0cnkgewotCQkJCQl3YWl0KCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZSBpbnRlcnJ1cHRpb24hCi0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvKioKLQkJICogRmxhZ3MgdGhpcyBtb2RlbCBhcyBsb2FkZWQuIEFsbCB3YWl0aW5nIG1ldGhvZHMgb24gCi0JCSAqIHtAbGluayAjd2FpdEZvckxvYWRBdHRlbXB0KCl9IHdpbGwgcHJvY2VlZCBhZnRlciB0aGlzIAotCQkgKiBtZXRob2QgcmV0dXJucy4gCi0JCSAqLwotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TG9hZGVkKCkgewotCQkJaW5pdGlhbGl6aW5nID0gZmFsc2U7Ci0JCQlub3RpZnlBbGwoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRXhjZXB0aW9uIGRlYnVnRXhjZXB0aW9uID0gbnVsbDsKLQotCS8qKgotCSAqIE91ciBzaW5nbGV0b24gaW5zdGFuY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNb2RlbE1hbmFnZXJJbXBsIGluc3RhbmNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBSRUFEX0JVRkZFUl9TSVpFID0gNDA5NjsKLQotCS8qKgotCSAqIE5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgd2lsbCBiZSBtYWRlIHJlc3RyaWN0ZWQgYWNjZXNzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBJTW9kZWxNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCi0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBNb2RlbE1hbmFnZXJJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIE91ciBjYWNoZSBvZiBtYW5hZ2VkIG9iamVjdHMKLQkgKi8KLQlwcml2YXRlIE1hcCBmTWFuYWdlZE9iamVjdHM7Ci0KLQlwcml2YXRlIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGZNb2RlbEhhbmRsZXJSZWdpc3RyeTsKLQlwcml2YXRlIGZpbmFsIFJlYWRFZGl0VHlwZSBSRUFEID0gbmV3IFJlYWRFZGl0VHlwZSgicmVhZCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBSZWFkRWRpdFR5cGUgRURJVCA9IG5ldyBSZWFkRWRpdFR5cGUoImVkaXQiKTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgSUxvY2sgU1lOQyA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCS8qKgotCSAqIEludGVudGlvbmFsbHkgZGVmYXVsdCBhY2Nlc3Mgb25seS4KLQkgKiAKLQkgKi8KLQlNb2RlbE1hbmFnZXJJbXBsKCkgewotCQlzdXBlcigpOwotCQlmTWFuYWdlZE9iamVjdHMgPSBuZXcgSGFzaE1hcCgpOwotCQkvLyBUbyBwcmV2ZW50IGRlYWRsb2NrczogIGFsd2F5cyBhY3F1aXJlIG11bHRpcGxlIGxvY2tzIGluIHRoaXMgb3JkZXI6IFNZTkMsIHNoYXJlZE9iamVjdC4gCi0JCS8vIERPIE5PVCBhY3F1aXJlIGEgU1lOQyB3aXRoaW4gYSBzaGFyZWRPYmplY3QgbG9jaywgdW5sZXNzIHlvdSBhbHJlYWR5IG93biB0aGUgU1lOQyBsb2NrCi0JCS8vIFRpcDogVHJ5IHRvIGhvbGQgdGhlIHNtYWxsZXN0IG51bWJlciBvZiBsb2NrcyB5b3UgY2FuCi0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25DcmVhdGVNb2RlbChJRmlsZSBmaWxlLCBTdHJpbmcgaWQsIElNb2RlbEhhbmRsZXIgaGFuZGxlciwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFJlYWRFZGl0VHlwZSByd1R5cGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBJT0V4Y2VwdGlvbixDb3JlRXhjZXB0aW9uIHsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IG51bGw7Ci0JCQotCQlTWU5DLmFjcXVpcmUoKTsKLQkJc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCVNZTkMucmVsZWFzZSgpOwotCQkKLQkJd2hpbGUodHJ1ZSkgewotCQkJaWYgKHNoYXJlZE9iamVjdCE9bnVsbCkgewotCQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCX0KLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJLy8gd2Uga25vdyB0aGlzIG9iamVjdCdzIG1vZGVsIGhhcyBwYXNzZWQgdGhlIGxvYWQsIGhvd2V2ZXIsIHdlIGRvbid0IGtub3cgCi0JCQkvLyBpdCdzIHJlZmVyZW5jZSBjb3VudCBzdGF0dXMuIEl0IG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLiBPciBpdCBjb3VsZCBoYXZlIAotCQkJLy8gYmVlbiBkaXNwb3NlZCBhbmQgYSBjb25jdXJyZW50IHRocmVhZCBoYXMgYWxyZWFkeSBiZWd1biBsb2FkaW5nIGl0LCBpbiB3aGljaCBjYXNlCi0JCQkvLyB3ZSBzaG91bGQgdXNlIHRoZSBzaGFyZWRvYmplY3QgdGhleSBhcmUgbG9hZGluZy4gCi0JCQkvLyBOT1RFOiBUaGlzIHBhdHRlcm4gaXMgYXBwbGllZCAzIHRpbWVzIGluIHRoaXMgY2xhc3MsIGJ1dCBvbmx5IGRvYydkIG9uY2UuIFRoZSBsb2dpYyBpcyAKLQkJCS8vIGV4YWN0bHkgdGhlIHNhbWUuIAotCQkJU2hhcmVkT2JqZWN0IHRlc3RPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCWlmICh0ZXN0T2JqZWN0PT1udWxsKSB7Ci0JCQkJLy8gbnVsbCBtZWFucyBpdCdzIGJlZW4gZGlzcG9zZWQsIHdlIG5lZWQgdG8gZG8gdGhlIHdvcmsgdG8gcmVsb2FkIGl0LgotCQkJCXNoYXJlZE9iamVjdCA9IG5ldyBTaGFyZWRPYmplY3QobnVsbCk7Ci0JCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlfZG9Db21tb25DcmVhdGVNb2RlbChmaWxlLCBpZCwgaGFuZGxlciwgcmVzb2x2ZXIsIHJ3VHlwZSwgZW5jb2RpbmdSdWxlLAotCQkJCQkJc2hhcmVkT2JqZWN0KTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoc2hhcmVkT2JqZWN0ID09IHRlc3RPYmplY3QpIHsKLQkJCQkvLyBpZiBub3RoaW5nIGhhcHBlbmVkLCBqdXN0IGluY3JlbWVudCB0aGUgY291bGQgYW5kIHJldHVybiB0aGUgc2hhcmVkIG1vZGVsCi0JCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsKSB7Ci0JCQkJCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc2hhcmVkT2JqZWN0ICE9IHRlc3RPYmplY3Qgd2hpY2ggbWVhbnMgdGhlIG9iamVjdCB3ZSB3ZXJlIHdhaXRpbmcgb24gaGFzIGJlZW4gZGlzcG9zZWQKLQkJCQkvLyBhIHJlcGxhY2VtZW50IGhhcyBhbHJlYWR5IGJlZW4gcGxhY2VkIGluIHRoZSBtYW5hZ2VkT2JqZWN0cyB0YWJsZS4gVGhyb3VnaCBhd2F5IG91cgotCQkJCS8vIHN0YWxlIHNoYXJlZE9iamVjdCBhbmQgY29udGludWUgb24gd2l0aCB0aGUgb25lIHdlIGdvdCBmcm9tIHRoZSBxdWV1ZS4gTm90ZTogV2UgZG9uJ3Qga25vdyBpdHMKLQkJCQkvLyBzdGF0ZSwgc28gY29udGludWUgdGhlIHdhaXRGb3JMb2FkLWNoZWNrIGxvb3AuIAotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCXNoYXJlZE9iamVjdCA9IHRlc3RPYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHdlIGV4cGVjdCB0byBhbHdheXMgcmV0dXJuIHNvbWV0aGluZwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCWRlYnVnRXhjZXB0aW9uID0gbmV3IEV4Y2VwdGlvbigiaW5zdGFuY2Ugb25seSBmb3Igc3RhY2sgdHJhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogbm8gbW9kZWwgcmVjb3JkZWQgZm9yIGlkICIgKyBpZCwgZGVidWdFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vIG5vdGU6IGNsaWVudHMgbXVzdCBjYWxsIHJlbGVhc2UgZm9yIGVhY2ggdGltZSB0aGV5IGNhbGwgZ2V0LgotCQlyZXR1cm4gc2hhcmVkT2JqZWN0PT1udWxsID8gbnVsbCA6IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2RlY3JDb3VudChTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0LCBSZWFkRWRpdFR5cGUgdHlwZSkgewotCQlpZiAodHlwZSA9PSBSRUFEKSB7Ci0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkLS07Ci0JCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGlzY29ubmVjdChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRURJVCkgewotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdC0tOwotCQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRpc2Nvbm5lY3Qoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJfQotCQllbHNlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9kb0NvbW1vbkNyZWF0ZU1vZGVsKElGaWxlIGZpbGUsIFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLAotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFJlYWRFZGl0VHlwZSByd1R5cGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUsCi0JCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlib29sZWFuIGRvUmVtb3ZlID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IF9jb21tb25DcmVhdGVNb2RlbChpZCwgaGFuZGxlciwgcmVzb2x2ZXIpOwotCQkJCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCQkJaW5wdXRTdHJlYW0gPSBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShmaWxlLmdldENvbnRlbnRzKHRydWUpKTsKLQkJCQlsb2FkZXIubG9hZChVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIG1vZGVsLCBlbmNvZGluZ1J1bGUpOwotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3ZlIGFscmVhZHkgZm91bmQKLQkJCQloYW5kbGVQcm9ncmFtRXJyb3IoZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChpbnB1dFN0cmVhbSE9bnVsbCkgewotCQkJCQl0cnkgeyAKLQkJCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBhZGQgdG8gb3VyIGNhY2hlCi0JCQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsPW1vZGVsOwotCQkJCV9pbml0Q291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJfSBlbHNlIHsKLQkJCQlkb1JlbW92ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRvUmVtb3ZlKSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsJCi0JCQlmTWFuYWdlZE9iamVjdHMucmVtb3ZlKGlkKTsJCi0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCQlzaGFyZWRPYmplY3Quc2V0TG9hZGVkKCk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25DcmVhdGVNb2RlbChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGlkLCBJTW9kZWxIYW5kbGVyIGhhbmRsZXIsIFVSSVJlc29sdmVyIHJlc29sdmVyLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkKLQkJaWYgKGlkID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IGlkIG1heSBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IG51bGw7Ci0JCi0JCVNZTkMuYWNxdWlyZSgpOwotCQlzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQotCQl3aGlsZSh0cnVlKSB7Ci0JCQlpZiAoc2hhcmVkT2JqZWN0IT1udWxsKSB7Ci0JCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJfQotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlTaGFyZWRPYmplY3QgdGVzdE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJaWYgKHRlc3RPYmplY3Q9PW51bGwpIHsKLQkJCQkvLyBpdCB3YXMgcmVtb3ZlZCAsc28gbGV0cyBjcmVhdGUgaXQKLQkJCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KG51bGwpOwotCQkJCWZNYW5hZ2VkT2JqZWN0cy5wdXQoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJX2RvQ29tbW9uQ3JlYXRlTW9kZWwoaW5wdXRTdHJlYW0sIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgcndUeXBlLAotCQkJCQkJZW5jb2RpbmcsIGxpbmVEZWxpbWl0ZXIsIHNoYXJlZE9iamVjdCk7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHNoYXJlZE9iamVjdCA9PSB0ZXN0T2JqZWN0KSB7Ci0JCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsKSB7Ci0JCQkJCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJc2hhcmVkT2JqZWN0ID0gdGVzdE9iamVjdDsKLQkJCX0KLQkJfQotCQkKLQkJLy8gd2UgZXhwZWN0IHRvIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nCi0JCUFzc2VydC5pc05vdE51bGwoc2hhcmVkT2JqZWN0LCAiUHJvZ3JhbSBFcnJvcjogbm8gbW9kZWwgcmVjb3JkZWQgZm9yIGlkICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbm90ZTogY2xpZW50cyBtdXN0IGNhbGwgcmVsZWFzZSBmb3IgZWFjaCB0aW1lIHRoZXkgY2FsbCBnZXQuCi0JCXJldHVybiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCi0JfQotCi0JcHJpdmF0ZSB2b2lkIF9kb0NvbW1vbkNyZWF0ZU1vZGVsKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgaWQsIElNb2RlbEhhbmRsZXIgaGFuZGxlciwKLQkJCVVSSVJlc29sdmVyIHJlc29sdmVyLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyLAotCQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBkb1JlbW92ZSA9IGZhbHNlOwotCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaWQsIGhhbmRsZXIsIHJlc29sdmVyKTsKLQkJCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQkJCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJtb2RlbCB3YXMgcmVxdWVzdGVkIGZvciBpZCAiICsgaWQgKyAiIHdpdGhvdXQgYSBjb250ZW50IElucHV0U3RyZWFtIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlsb2FkZXIubG9hZChpZCwgVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCBtb2RlbCwgZW5jb2RpbmcsIGxpbmVEZWxpbWl0ZXIpOwotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3ZlIGFscmVhZHkgZm91bmQKLQkJCQloYW5kbGVQcm9ncmFtRXJyb3IoZSk7Ci0JCQl9Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCA9IG1vZGVsOwotCQkJCV9pbml0Q291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJfSBlbHNlIHsKLQkJCQlkb1JlbW92ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRvUmVtb3ZlKSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCS8vIHJlbW92ZSBpdCBpZiB3ZSBkaWRuJ3QgZ2V0IG9uZSBiYWNrCi0JCQlmTWFuYWdlZE9iamVjdHMucmVtb3ZlKGlkKTsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXNoYXJlZE9iamVjdC5zZXRMb2FkZWQoKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkNyZWF0ZU1vZGVsKFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCi0JCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbG9hZGVyLmNyZWF0ZU1vZGVsKCk7Ci0JCS8vIGluIHRoZSBwYXN0LCBpZCB3YXMgbnVsbCBmb3IgInVubWFuYWdlZCIgY2FzZSwgc28gd2Ugd29uJ3QKLQkJLy8gdHJ5IGFuZCBzZXQgaXQKLQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCXJlc3VsdC5zZXRJZChpZCk7Ci0JCX0KLQkJcmVzdWx0LnNldE1vZGVsSGFuZGxlcihoYW5kbGVyKTsKLQkJcmVzdWx0LnNldFJlc29sdmVyKHJlc29sdmVyKTsKLQkJLy8gc29tZSBvYnZpb3VzIHJlZHVuYW5jeSBoZXJlIHRoYXQgbWF5YmUgY291bGQgYmUgaW1wcm92ZWQKLQkJLy8gaW4gZnV0dXJlLCBidXQgaXMgbmVjZXNzYXJ5IGZvciBub3cKLQkJcmVzdWx0LnNldEJhc2VMb2NhdGlvbihpZCk7Ci0JCWlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0JCQlyZXNvbHZlci5zZXRGaWxlQmFzZUxvY2F0aW9uKGlkKTsKLQkJfQotCQlhZGRGYWN0b3JpZXMocmVzdWx0LCBoYW5kbGVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkdldE1vZGVsKElGaWxlIGlGaWxlLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQotCQlpZiAoaUZpbGUgIT0gbnVsbCAmJiBpRmlsZS5leGlzdHMoKSkgewotCQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpRmlsZSk7Ci0JCQlVUklSZXNvbHZlciByZXNvbHZlciA9IGNhbGN1bGF0ZVVSSVJlc29sdmVyKGlGaWxlKTsKLQkJCW1vZGVsID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlGaWxlLCBpZCwgaGFuZGxlciwgcmVzb2x2ZXIsIHJ3VHlwZSwgZW5jb2RpbmdSdWxlKTsKLQkJfQotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkdldE1vZGVsKElGaWxlIGlGaWxlLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQlVUklSZXNvbHZlciByZXNvbHZlciA9IGNhbGN1bGF0ZVVSSVJlc29sdmVyKGlGaWxlKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IF9jb21tb25HZXRNb2RlbChpRmlsZSwgaWQsIGhhbmRsZXIsIHJlc29sdmVyLCByd1R5cGUsIGVuY29kaW5nLCBsaW5lRGVsaW1pdGVyKTsKLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25HZXRNb2RlbChJRmlsZSBmaWxlLCBTdHJpbmcgaWQsIElNb2RlbEhhbmRsZXIgaGFuZGxlciwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFJlYWRFZGl0VHlwZSByd1R5cGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogaWQgbWF5IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gbnVsbDsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkKLQkJCXdoaWxlKHRydWUpIHsKLQkJCQlpZiAoc2hhcmVkT2JqZWN0IT1udWxsKSB7Ci0JCQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCQl9Ci0JCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQkJU2hhcmVkT2JqZWN0IHRlc3RPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCQlpZiAodGVzdE9iamVjdD09bnVsbCkgewotCQkJCQkvLyBpdCB3YXMgcmVtb3ZlZCAsc28gbGV0cyBjcmVhdGUgaXQKLQkJCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChudWxsKTsKLQkJCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCQkJCi0JCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCQlfZG9Db21tb25HZXRNb2RlbChmaWxlLCBpZCwgc2hhcmVkT2JqZWN0LHJ3VHlwZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAoc2hhcmVkT2JqZWN0ID09IHRlc3RPYmplY3QpIHsKLQkJCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCQkJaWYgKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCE9bnVsbCkgewotCQkJCQkJCV9pbmNyQ291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB3ZSBnb3QgYSBkaWZmZXJlbnQgb2JqZWN0IHRoYW4gd2hhdCB3ZSB3ZXJlIGV4cGVjdGluZwotCQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQkJLy8gdHdvIHRocmVhZHMgd2VyZSBpbnRlcmVzdGVkIGluIG1vZGVscyBmb3IgdGhlIHNhbWUgaWQuIAotCQkJCQkvLyBUaGUgb3RoZXIgdGhyZWFkIG9uZSwgc28gbGV0cyBiYWNrIG9mZiBhbmQgdHJ5IGFnYWluLiAKLQkJCQkJc2hhcmVkT2JqZWN0ID0gdGVzdE9iamVjdDsgCi0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiB3ZSBkb24ndCBrbm93IGhvdyB0byBjcmVhdGUgYSBtb2RlbAotCQkvLyBmb3IgdGhpcyB0eXBlIG9mIGZpbGUsIHJldHVybiBudWxsCi0JCi0JCS8vIG5vdGU6IGNsaWVudHMgbXVzdCBjYWxsIHJlbGVhc2UgZm9yIGVhY2ggdGltZSB0aGV5IGNhbGwKLQkJLy8gZ2V0LgotCQkJCi0JCXJldHVybiBzaGFyZWRPYmplY3Q9PW51bGwgPyBudWxsIDogc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBfZG9Db21tb25HZXRNb2RlbChJRmlsZSBmaWxlLCBTdHJpbmcgaWQsIFNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QsUmVhZEVkaXRUeXBlIHJ3VHlwZSkgewotCQlib29sZWFuIGRvUmVtb3ZlID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCXNoYXJlZE9iamVjdC5kb1dhaXQ9ZmFsc2U7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKGZpbGUpOwotCQkJc2hhcmVkT2JqZWN0LmRvV2FpdD10cnVlOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw9bW9kZWw7Ci0JCQkJX2luaXRDb3VudChzaGFyZWRPYmplY3QsIHJ3VHlwZSk7Ci0JCQl9IGVsc2UgewotCQkJCWRvUmVtb3ZlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoZG9SZW1vdmUpIHsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJZk1hbmFnZWRPYmplY3RzLnJlbW92ZShpZCk7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCQlzaGFyZWRPYmplY3Quc2V0TG9hZGVkKCk7Ci0JfQotCi0JcHJpdmF0ZSBTaGFyZWRPYmplY3QgX2NvbW1vbk5ld01vZGVsKElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgYVNoYXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gRmlyc3QsIGNoZWNrIGlmIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9uIGZpbGUgc3lzdGVtLgotCQkvLyBpZiBpcyBkb2VzLCB0aGVuIHRocm93IFJlc291cmNlIGluIFVzZSBpZmYgZm9yY2U9PWZhbHNlCi0KLQkJaWYgKGlGaWxlLmV4aXN0cygpICYmICFmb3JjZSkgewotCQkJdGhyb3cgbmV3IFJlc291cmNlQWxyZWFkeUV4aXN0cygpOwotCQl9Ci0JCQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gbnVsbDsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQl0cnkgewotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQotCQkJIHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQotCQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsICYmICFmb3JjZSkgewotCQkJCS8vIGlmIGluIGNhY2hlIGFscmVhZHksIGFuZCBmb3JjZSBpcyBub3QgdHJ1ZSwgdGhlbiB0aGlzIGlzIGFuCi0JCQkJLy8gZXJyb3IKLQkJCQkvLyBpbiBjYWxsCi0JCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJCX0KLQkJCQotCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChudWxsKTsKLQkJCWZNYW5hZ2VkT2JqZWN0cy5wdXQoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCQotCQkvLyBpZiB3ZSBnZXQgdG8gaGVyZSB3aXRob3V0IGFib3ZlIGV4Y2VwdGlvbnMsIHRoZW4gYWxsIGlzIG9rCi0JCS8vIHRvIGdldCBtb2RlbCBsaWtlIG5vcm1hbCwgYnV0IHNldCAnbmV3JyBhdHRyaWJ1dGUgKHdoZXJlIHRoZQotCQkvLyAnbmV3JyBhdHRyaWJ1dGUgbWVhbnMgdGhpcyBpcyBhIG1vZGVsIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nCi0JCS8vIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0JCWFTaGFyZWRNb2RlbCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbChpRmlsZSk7Ci0JCWFTaGFyZWRNb2RlbC5zZXROZXdTdGF0ZSh0cnVlKTsKLQkJCi0JCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbD1hU2hhcmVkTW9kZWw7Ci0JCS8vIHdoZW4gcmVzb3VyY2UgaXMgcHJvdmlkZWQsIHdlIGNhbiBzZXQKLQkJLy8gc3luY2hyb25pemF0aW9uIHN0YW1wIC4uLiBvdGhlcndpc2UgY2xpZW50IHNob3VsZAotCQkvLyBOb3RlOiBvbmUgY2xpZW50IHdoaWNoIGRvZXMgdGhpcyBpcyBGaWxlTW9kZWxQcm92aWRlci4KLQkJYVNoYXJlZE1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoaUZpbGUpOwotCQlyZXR1cm4gc2hhcmVkT2JqZWN0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIF9nZXRNb2RlbEZvcihJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBSZWFkRWRpdFR5cGUgYWNjZXNzVHlwZSkgewotCi0JCVN0cmluZyBpZCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jYWxjdWxhdGVJZChkb2N1bWVudCk7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJ1bmtub3duIElTdHJ1Y3R1cmVkRG9jdW1lbnQgIiArIGRvY3VtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IG51bGw7Ci0JCVNZTkMuYWNxdWlyZSgpOwotCQlzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQotCQl3aGlsZSh0cnVlKSB7Ci0JCQlpZiAoc2hhcmVkT2JqZWN0IT1udWxsKSB7Ci0JCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJfQotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlTaGFyZWRPYmplY3QgdGVzdE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJaWYgKHRlc3RPYmplY3Q9PW51bGwpIHsKLQkJCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KG51bGwpOwotCQkJCWZNYW5hZ2VkT2JqZWN0cy5wdXQoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoZG9jdW1lbnQpOwotCQkJCQlfaW5pdENvdW50KHNoYXJlZE9iamVjdCwgYWNjZXNzVHlwZSk7Ci0JCQkJCXNoYXJlZE9iamVjdC5zZXRMb2FkZWQoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHNoYXJlZE9iamVjdCA9PSB0ZXN0T2JqZWN0KSB7Ci0JCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCQlBc3NlcnQuaXNUcnVlKHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgKyBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkID4gMCk7Ci0JCQkJCWlmIChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwhPW51bGwpIHsKLQkJCQkJCV9pbmNyQ291bnQoc2hhcmVkT2JqZWN0LCBhY2Nlc3NUeXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJc2hhcmVkT2JqZWN0ID0gdGVzdE9iamVjdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHNoYXJlZE9iamVjdD09bnVsbCA/IG51bGwgOiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pbmNyQ291bnQoU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCwgUmVhZEVkaXRUeXBlIHR5cGUpIHsKLQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJaWYgKHR5cGUgPT0gUkVBRCkgewotCQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQrKzsKLQkJCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY29ubmVjdChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBFRElUKSB7Ci0JCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCsrOwotCQkJCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jb25uZWN0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pbml0Q291bnQoU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCwgUmVhZEVkaXRUeXBlIHR5cGUpIHsKLQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJaWYgKHR5cGUgPT0gUkVBRCkgewotCQkJCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jb25uZWN0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9IDE7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IEVESVQpIHsKLQkJCQlGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY29ubmVjdChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgPSAxOwotCQkJfQotCQkJZWxzZQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobW9kZWwsICJtb2RlbCBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChyZWdpc3RyeSwgIkZhY3RvcnkgUmVnaXN0cnkgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBmYWN0b3J5TGlzdCA9IGhhbmRsZXIuZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCQlhZGRGYWN0b3JpZXMobW9kZWwsIGZhY3RvcnlMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIExpc3QgZmFjdG9yeUxpc3QpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChtb2RlbCwgIm1vZGVsIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5LCAiRmFjdG9yeSBSZWdpc3RyeSBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBOb3RlOiB3ZSBhZGQgYWxsIG9mIHRoZW0gZnJvbSBoYW5kbGVyLCBldmVuIGlmCi0JCS8vIGFscmVhZHkgZXhpc3RzLiBNYXkgbmVlZCB0byByZWNvbnNpZGVyIHRoaXMuCi0JCWlmIChmYWN0b3J5TGlzdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGZhY3RvcnlMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlyZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBDYWxjdWxhdGUgaWQgcHJvdmlkZXMgYSBjb21tb24gd2F5IHRvIGRldGVybWluZSB0aGUgaWQgZnJvbSB0aGUgaW5wdXQKLQkgKiAuLi4gbmVlZGVkIHRvIGdldCBhbmQgc2F2ZSB0aGUgbW9kZWwuIEl0IGlzIGEgc2ltcGxlIGNsYXNzIHV0aWxpdHksIGJ1dAotCSAqIGlzIGFuIGluc3RhbmNlIG1ldGhvZCBzbyBjYW4gYmUgYWNjZXNzZWQgdmlhIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jYWxjdWxhdGVJZChmaWxlKTsKLQl9Ci0KLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgY2FsY3VsYXRlVHlwZShJRmlsZSBpRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBJTW9kZWxNYW5hZ2VyIG1tID0gKChNb2RlbE1hbmFnZXJQbHVnaW4pCi0JCS8vIFBsYXRmb3JtLmdldFBsdWdpbihNb2RlbE1hbmFnZXJQbHVnaW4uSUQpKS5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJTW9kZWxIYW5kbGVyUmVnaXN0cnkgY3IgPSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpOwotCQlJTW9kZWxIYW5kbGVyIGNkID0gY3IuZ2V0SGFuZGxlckZvcihpRmlsZSk7Ci0JCXJldHVybiBjZDsKLQl9Ci0KLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgY2FsY3VsYXRlVHlwZShTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNb2RlbEhhbmRsZXJSZWdpc3RyeSBjciA9IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCk7Ci0JCUlNb2RlbEhhbmRsZXIgY2QgPSBjci5nZXRIYW5kbGVyRm9yKGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCXJldHVybiBjZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFVSSVJlc29sdmVyIGNhbGN1bGF0ZVVSSVJlc29sdmVyKElGaWxlIGZpbGUpIHsKLQkJLy8gTm90ZTogc2VlIGNvbW1lbnQgaW4gcGx1Z2luLnhtbCBmb3IgcG90ZW50aWFsbHkKLQkJLy8gYnJlYWtpbmcgY2hhbmdlIGluIGJlaGF2aW9yLgotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAoVVJJUmVzb2x2ZXIpIHByb2plY3QuZ2V0QWRhcHRlcihVUklSZXNvbHZlci5jbGFzcyk7Ci0JCWlmIChyZXNvbHZlciA9PSBudWxsKQotCQkJcmVzb2x2ZXIgPSBuZXcgUHJvamVjdFJlc29sdmVyKHByb2plY3QpOwotCQlPYmplY3QgbG9jYXRpb24gPSBmaWxlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJbG9jYXRpb24gPSBmaWxlLmdldExvY2F0aW9uVVJJKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKQotCQkJcmVzb2x2ZXIuc2V0RmlsZUJhc2VMb2NhdGlvbihsb2NhdGlvbi50b1N0cmluZygpKTsKLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCS8qCi0JICogTm90ZTogVGhpcyBtZXRob2QgYXBwZWFycyBpbiBib3RoIE1vZGVsTWFuYWdlckltcGwgYW5kIEpTRWRpdG9yICh3aXRoCi0JICoganVzdCBhIG1pbm9yIGRpZmZlcmVuY2UpLiBUaGV5IHNob3VsZCBiZSBrZXB0IHRoZSBzYW1lLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gaGFuZGxlZCBieSBwbGF0Zm9ybQotCSAqLwotCXByaXZhdGUgdm9pZCBjb252ZXJ0TGluZURlbGltaXRlcnMoSURvY3VtZW50IGRvY3VtZW50LCBJRmlsZSBpRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBOb3RlOiBjYWxjdWxhdGVUeXBlKGlGaWxlKSByZXR1cm5zIGEgZGVmYXVsdCB4bWwgbW9kZWwgaGFuZGxlciBpZgotCQkvLyBjb250ZW50IHR5cGUgaXMgbnVsbC4KLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKS5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCQlTdHJpbmcgZW5kT2ZMaW5lQ29kZSA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSWQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUpOwotCQkvLyBlbmRPZkxpbmVDb2RlID09IG51bGwgbWVhbnMgdGhlIGNvbnRlbnQgdHlwZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMKLQkJLy8gZnVuY3Rpb24gKGUuZy4gRFREKQotCQkvLyBlbmRPZkxpbmVDb2RlID09ICIiIG1lYW5zIG5vIHRyYW5zbGF0aW9uCi0JCWlmIChlbmRPZkxpbmVDb2RlICE9IG51bGwgJiYgZW5kT2ZMaW5lQ29kZS5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyVG9Vc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlbmRPZkxpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUikpCi0JCQkJbGluZURlbGltaXRlclRvVXNlID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0NSOwotCQkJZWxzZSBpZiAoZW5kT2ZMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpKQotCQkJCWxpbmVEZWxpbWl0ZXJUb1VzZSA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19MRjsKLQkJCWVsc2UgaWYgKGVuZE9mTGluZUNvZGUuZXF1YWxzKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSTEYpKQotCQkJCWxpbmVEZWxpbWl0ZXJUb1VzZSA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19DUkxGOwotCi0JCQlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCWludCBsaW5lQ291bnQgPSBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHsKLQkJCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQkJaW50IGxpbmVTdGFydE9mZnNldCA9IGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJCQlpbnQgbGluZUxlbmd0aCA9IGxpbmVJbmZvLmdldExlbmd0aCgpOwotCQkJCQlpbnQgbGluZUVuZE9mZnNldCA9IGxpbmVTdGFydE9mZnNldCArIGxpbmVMZW5ndGg7Ci0KLQkJCQkJaWYgKGkgPCBsaW5lQ291bnQgLSAxKSB7Ci0JCQkJCQlTdHJpbmcgY3VycmVudExpbmVEZWxpbWl0ZXIgPSBkb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKGkpOwotCQkJCQkJaWYgKGN1cnJlbnRMaW5lRGVsaW1pdGVyICE9IG51bGwgJiYgY3VycmVudExpbmVEZWxpbWl0ZXIuY29tcGFyZVRvKGxpbmVEZWxpbWl0ZXJUb1VzZSkgIT0gMCkKLQkJCQkJCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBSZXBsYWNlRWRpdChsaW5lRW5kT2Zmc2V0LCBjdXJyZW50TGluZURlbGltaXRlci5sZW5ndGgoKSwgbGluZURlbGltaXRlclRvVXNlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAobXVsdGlUZXh0RWRpdC5nZXRDaGlsZHJlblNpemUoKSA+IDApCi0JCQkJCW11bHRpVGV4dEVkaXQuYXBwbHkoZG9jdW1lbnQpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCS8vIGp1c3QgYWRkaW5nIGdlbmVyaWMgcnVudGltZSBoZXJlLCB1bnRpbCB3aG9sZSBtZXRob2QKLQkJCQkvLyBkZWxldGVkLgotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhpcyB1c2VkIHRvIGJlIGluIGxvYWRlciwgYnV0IGhhcyBiZWVuIG1vdmVkIGhlcmUKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgY29weShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBTdHJpbmcgbmV3SWQpIHRocm93cyBSZXNvdXJjZUluVXNlIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwgPSBtb2RlbDsKLQkJSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSBvbGRNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IG1vZGVsSGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQkvLyBuZXdNb2RlbCA9IGxvYWRlci5uZXdNb2RlbCgpOwotCQluZXdNb2RlbCA9IGxvYWRlci5jcmVhdGVNb2RlbChvbGRNb2RlbCk7Ci0JCS8vIG5ld0lkLCBvbGRNb2RlbC5nZXRSZXNvbHZlcigpLCBvbGRNb2RlbC5nZXRNb2RlbE1hbmFnZXIoKSk7Ci0JCW5ld01vZGVsLnNldE1vZGVsSGFuZGxlcihtb2RlbEhhbmRsZXIpOwotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9Ci0JCS8vIG9sZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCA9Ci0JCS8vIG9sZFN0cnVjdHVyZWREb2N1bWVudC5uZXdJbnN0YW5jZSgpOwotCQkvLyBuZXdNb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQkJbmV3TW9kZWwuc2V0UmVzb2x2ZXIob2xkTW9kZWwuZ2V0UmVzb2x2ZXIoKSk7Ci0JCW5ld01vZGVsLnNldE1vZGVsTWFuYWdlcihvbGRNb2RlbC5nZXRNb2RlbE1hbmFnZXIoKSk7Ci0JCS8vIGR1cGxpY2F0ZUZhY3RvcnlSZWdpc3RyeShuZXdNb2RlbCwgb2xkTW9kZWwpOwotCQluZXdNb2RlbC5zZXRJZChuZXdJZCk7Ci0JCS8vIHNldCB0ZXh0IG9mIG5ldyBvbmUgYWZ0ZXIgYWxsIGluaXRpYWxpemF0aW9uIGlzIGRvbmUKLQkJU3RyaW5nIGNvbnRlbnRzID0gb2xkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0VGV4dCgpOwotCQluZXdNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXRUZXh0KHRoaXMsIGNvbnRlbnRzKTsKLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNvcHlNb2RlbEZvckVkaXQoU3RyaW5nIG9sZElkLCBTdHJpbmcgbmV3SWQpIHRocm93cyBSZXNvdXJjZUluVXNlIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG51bGw7Ci0JCS8vIGdldCB0aGUgZXhpc3RpbmcgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaWQKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwob2xkSWQpOwotCQkvLyBpZiBpdCBkb2Vzbid0IGV4aXN0LCBpZ25vcmUgcmVxdWVzdCAodGhvdWdoIHRoaXMgd291bGQgbm9ybWFsbHkKLQkJLy8gYmUgYSBwcm9ncmFtbWluZyBlcnJvci4KLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCS8vIG5vdyBiZSBzdXJlIG5ld01vZGVsIGRvZXMgbm90IGV4aXN0Ci0JCQlzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KG5ld0lkKTsKLQkJCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBSZXNvdXJjZUluVXNlKCk7Ci0JCQl9Ci0JCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KG51bGwpOwotCQkJZk1hbmFnZWRPYmplY3RzLnB1dChuZXdJZCxzaGFyZWRPYmplY3QpOwotCQl9IGZpbmFsbHkgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCX0KLQkJLy8gZ2V0IGxvYWRlciBiYXNlZCBvbiBleGlzdGluZyB0eXBlIChub3RlIHRoZSB0eXBlIGFzc3VtcHRpb24pCi0JCS8vIE9iamVjdCB0eXBlID0gKChJU3RydWN0dXJlZE1vZGVsKSBtb2RlbCkuZ2V0VHlwZSgpOwotCQkvLyBJTW9kZWxIYW5kbGVyIHR5cGUgPSBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJLy8gSU1vZGVsTG9hZGVyIGxvYWRlciA9IChJTW9kZWxMb2FkZXIpIGdldE1vZGVsTG9hZGVycygpLmdldCh0eXBlKTsKLQkJLy8gSU1vZGVsTG9hZGVyIGxvYWRlciA9IChJTW9kZWxMb2FkZXIpIGdldE1vZGVsTG9hZGVycygpLmdldCh0eXBlKTsKLQkJLy8gYXNrIHRoZSBsb2FkZXIgdG8gY29weQotCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQlzaGFyZWRPYmplY3QuZG9XYWl0ID0gZmFsc2U7Ci0JCQluZXdNb2RlbCA9IGNvcHkobW9kZWwsIG5ld0lkKTsKLQkJCXNoYXJlZE9iamVjdC5kb1dhaXQgPSB0cnVlOwotCQl9Ci0JCWlmIChuZXdNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBhZGQgdG8gb3VyIGNhY2hlCi0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsPW5ld01vZGVsOwotCQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgPSAxOwotCQkJCXRyYWNlKCJjb3BpZWQgbW9kZWwiLCBuZXdJZCwgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJZk1hbmFnZWRPYmplY3RzLnJlbW92ZShuZXdJZCk7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCQlzaGFyZWRPYmplY3Quc2V0TG9hZGVkKCk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhlIG5ldyBpbnN0YW5jZSBoYXMgbm8gY29udGVudC4gTm90ZTogdGhpcwotCSAqIHByb2R1Y2VzIGFuIHVubWFuYWdlZCBtb2RlbCwgZm9yIHRlbXBvcmFyeSB1c2UuIElmIGEgdHJ1ZSBzaGFyZWQgbW9kZWwKLQkgKiBpcyBkZXNpcmVkLCB1c2UgImNvcHkiLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU5ld0luc3RhbmNlKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG9sZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbG9hZGVyLmNyZWF0ZU1vZGVsKG9sZE1vZGVsKTsKLQkJbmV3TW9kZWwuc2V0TW9kZWxIYW5kbGVyKGhhbmRsZXIpOwotCQlpZiAobmV3TW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgewotCQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgbmV3TW9kZWwpLnNldENvbnRlbnRUeXBlSWRlbnRpZmllcihvbGRNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCX0KLQkJVVJJUmVzb2x2ZXIgb2xkUmVzb2x2ZXIgPSBvbGRNb2RlbC5nZXRSZXNvbHZlcigpOwotCQluZXdNb2RlbC5zZXRSZXNvbHZlcihvbGRSZXNvbHZlcik7Ci0JCXRyeSB7Ci0JCQluZXdNb2RlbC5zZXRJZChEVVBMSUNBVEVEX01PREVMKTsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB0aGlzIGlzIGFuIHVubWFuYWdlZCBtb2RlbAotCQl9Ci0JCS8vIGJhc2UgbG9jYXRpb24gc2hvdWxkIGJlIG51bGwsIGJ1dCB3ZSdsbCBzZXQgdG8KLQkJLy8gbnVsbCB0byBiZSBzdXJlLgotCQluZXdNb2RlbC5zZXRCYXNlTG9jYXRpb24obnVsbCk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGl0cyBhc3N1bWUgdGhhdCBJRmlsZSBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBhcwotCSAqIGEgcmVzb3VyY2UgeWV0LiBJZiBpdCBkb2VzLCBSZXNvdXJjZUFscmVhZHlFeGlzdHMgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiB0aGUgcmVzb3VyY2UgZG9lcyBhbHJlYWR5IGV4aXN0LCB0aGVuIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvciBpcwotCSAqIHRoZSByaWdodCBBUEkgdG8gdXNlLgotCSAqIAotCSAqIEB0aHJvd3MgUmVzb3VyY2VJblVzZQotCSAqIAotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlGaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgUmVzb3VyY2VBbHJlYWR5RXhpc3RzKGlGaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJfQotCQkvLyBXaWxsIHJlY29uc2lkZXIgaW4gZnV0dXJlIHZlcnNpb24KLQkJLy8gU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQkvLyBpZiAoaXNSZXNvdXJjZUluVXNlKGlkKSkgewotCQkvLyB0aHJvdyBuZXcgUmVzb3VyY2VJblVzZShpRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCS8vIH0KLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCS8vIGZvciB0aGlzIEFQSSwgImNyZWF0ZU5ldyIgd2UgYXNzdW1lIHRoZSBJRmlsZSBkb2VzIG5vdCBleGlzdCB5ZXQKLQkJLy8gYXMgY2hlY2tlZCBhYm92ZSwgc28ganVzdCBjcmVhdGUgZW1wdHkgZG9jdW1lbnQuCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGNsaWVudHMgc2hvdWxkIHZlcmlmeSBJRmlsZSBleGlzdHMgYmVmb3JlIHVzaW5nCi0JICogdGhpcyBtZXRob2QuIElmIHRoaXMgSUZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4KLQkgKiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgdGhlIGNvcnJlY3QgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIFJlc291cmNlSW5Vc2UKLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoIWlGaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGlGaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJfQotCQkvLyBXaWxsIHJlY29uc2lkZXIgaW4gZnV0dXJlIHZlcnNpb24KLQkJLy8gU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQkvLyBpZiAoaXNSZXNvdXJjZUluVXNlKGlkKSkgewotCQkvLyB0aHJvdyBuZXcgUmVzb3VyY2VJblVzZShpRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCS8vIH0KLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoaUZpbGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhCi0JICogcHJvcGVyIHBhcnNlciBhc3NpZ25lZC4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGFuIGVtcHR5Ci0JICogc3RydWN0dXJlZERvY3VtZW50IGlzIG5lZWRlZC4gT3RoZXJ3aXNlLCB1c2UgSUZpbGUgZm9ybS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIFRPRE86IHRvIGJlIHJlbW92ZWQgYnkgQzQgZG8gd2UgcmVhbGx5IG5lZWQgdGhpcz8gSQotCSAqICAgICAgICAgICAgIHJlY29tbWVuZCB0byAtIHVzZSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoZmlsZW5hbWUsCi0JICogICAgICAgICAgICAgbnVsbCwgbnVsbCkgLSB0aGUgZmlsZW5hbWUgZG9lcyBub3QgbmVlZCB0byByZXByZXNlbnQgYQotCSAqICAgICAgICAgICAgIHJlYWwgLSBmaWxlLCBidXQgY2FuIHRha2UgZm9yIGZvcm0gb2YgZHVtbXkuanNwLCB0ZXN0LnhtbCwKLQkgKiAgICAgICAgICAgICBldGMuIC0gVGhhdCB3YXkgd2UgZG9uJ3QgaGFyZCBjb2RlIHRoZSBoYW5kbGVyLCBidXQgc3BlY2lmeQotCSAqICAgICAgICAgICAgIHdlIC0gd2FudCB0aGUgaGFuZGxlciB0aGF0ICJnb2VzIHdpdGgiIGEgY2VydGFpbiB0eXBlIG9mIC0KLQkgKiAgICAgICAgICAgICBmaWxlLgotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCU1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNyID0gZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY3IuZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoY29udGVudFR5cGVJZCk7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIlByb2dyYW0gZXJyb3I6IG5vIG1vZGVsIGhhbmRsZXIgZm91bmQgZm9yICIgKyBjb250ZW50VHlwZUlkKTsgLy8kTk9OLU5MUy0xJAotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYQotCSAqIHByb3BlciBwYXJzZXIgYXNzaWduZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLS0gLSBUT0RPOiB0byBiZSByZW1vdmVkIGJ5IEM0IEkgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8KLQkgKiAgICAgICAgICAgICBkaXNjb3VhZ2UgdXNlIG9mIHRoaXMgbWV0aG9kLiBJdCBkb2VzIG5vdCByZWFsbHkgd29yayBmb3IKLQkgKiAgICAgICAgICAgICBKU1AgZnJhZ21lbnRzLCBzaW5jZSBKU1AgRnJhZ21lbnRzIG5lZWQgYW4gSUZpbGUgdG8KLQkgKiAgICAgICAgICAgICBjb3JyZWN0bHkgbG9vayB1cCB0aGUgY29udGVudCBzZXR0aW5ncy4gVXNlIElGaWxlIGZvcm0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlzdHJlYW0gPSBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0JCWlmIChpc3RyZWFtICE9IG51bGwpIHsKLQkJCWlzdHJlYW0ucmVzZXQoKTsKLQkJfQotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGZpbGVuYW1lLCBpc3RyZWFtKTsKLQkJbG9hZGVyID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZW5hbWUsIGlzdHJlYW0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBjYXNlIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUKLQkgKiB0aGVyZSBpcyBhbiBlbmNvZGluZyBmb3IgaW5wdXQgc3RyZWFtIHRoYXQgc2hvdWxkIG92ZXJyaWRlIGFsbCB0aGUKLQkgKiBub3JtYWwgcnVsZXMgZm9yIGVuY29kaW5nLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYW4gZW5jb2RpbmcKLQkgKiAoY2hhcnNldCkgc3BlY2lmaWVkIGluIEhUVFAgcmVzcG9uc2UgaGVhZGVyLCB0aGVuIHRoYXQgZW5jb2RpbmcgaXMgdXNlZAotCSAqIHRvIHRyYW5zbGF0ZSB0aGUgaW5wdXQgc3RyZWFtIHRvIGEgc3RyaW5nLCBidXQgdGhlbiB0aGUgbm9ybWFsIGVuY29kaW5nCi0JICogcnVsZXMgYXJlIGlnbm9yZWQsIHNvIHRoYXQgdGhlIHN0cmluZyBpcyBub3QgdHJhbnNsYXRlZCB0d2ljZSAoZm9yCi0JICogZXhhbXBsZSwgaWYgaXRzIGFuIEhUTUwgImZpbGUiLCB0aGVuIGV2ZW4gaWYgaXQgY29udGFpbnMgYSBjaGFyc2V0IGluCi0JICogbWV0YSB0YWcsIGl0cyBpZ25vcmVkIHNpbmNlIGl0cyBhc3N1bWVkIGl0cyBhbGwgY29ycmVjdGx5IGRlY29kZWQgYnkKLQkgKiB0aGUgSFRUUCBjaGFyc2V0LgotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIGVuY29kaW5nKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoZmlsZW5hbWUsIGNvbnRlbnQsIHJlc29sdmVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHdoZW4gdGhlIHJlc291cmNlIGRvZXMgbm90Ci0JICogcmVhbGx5IGV4aXN0IChlLmcuIHdoZW4gY29udGVudCBpcyBiZWluZyBjcmVhdGVkLCBidXQgaGFzbid0IGJlZW4KLQkgKiB3cml0dGVuIHRvIGRpc2sgeWV0KS4gTm90ZSB0aGF0IHNpbmNlIHRoZSBjb250ZW50IGlzIGJlaW5nIHByb3ZpZGVkIGFzCi0JICogYSBTdHJpbmcsIGl0IGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBiZSBkZWNvZGVkIGNvcnJlY3RseSBzbyBubwotCSAqIHRyYW5zZm9ybWF0aW9uIGlzIGRvbmUuCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBjb250ZW50LCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogYXZvaWQgYWxsIHRoZXNlIFN0cmluZyBpbnN0YW5jZXMKLQkJU3RyaW5nQnVmZmVyIGNvbnRlbnRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbnRlbnQpOwotCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbnVsbDsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShmaWxlbmFtZSwgbnVsbCk7Ci0JCWxvYWRlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlTdHJpbmdCdWZmZXIgY29udmVydGVkQ29udGVudCA9IGxvYWRlci5oYW5kbGVMaW5lRGVsaW1pdGVyKGNvbnRlbnRCdWZmZXIsIHJlc3VsdCk7Ci0JCXJlc3VsdC5zZXRFbmNvZGluZ01lbWVudG8obmV3IE51bGxNZW1lbnRvKCkpOwotCQlyZXN1bHQuc2V0VGV4dCh0aGlzLCBjb252ZXJ0ZWRDb250ZW50LnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZEVtcHR5TW9kZWxGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlVUklSZXNvbHZlciByZXNvbHZlciA9IGNhbGN1bGF0ZVVSSVJlc29sdmVyKGlGaWxlKTsKLQotCQl0cnkgewotCQkJcmVzdWx0ID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlkLCBoYW5kbGVyLCByZXNvbHZlcik7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2UncmUgbm90IHNoYXJpbmcKLQkJCS8vIChldmVuIGlmIGl0IHJlYWxseSBpcyBpbiB1c2UgLi4uIHdlIGRvbid0IGNhcmUpCi0JCQkvLyB0aGlzIG1heSBuZWVkIHRvIGJlIHJlLWV4YW1pbmVkLgotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTE1BTkFHRVIpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vZGVsTWFuZ2VySW1wbDo6Y3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yLiBNb2RlbCB1bmV4cGVjdGVkbHkgaW4gdXNlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QuIEl0IGRlcGVuZHMgb24gdGhlIGxvYWRlcnMgbmV3TW9kZWwgbWV0aG9kIHRvIHJldHVybgotCSAqIGFuIGFwcHJvcHJpYXRlIFN0cnVjdXR1cmVkTW9kZWwgYXBwcm9wcmlhdGVseSBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gY3JlYXRlVW5NYW5hZ2VkRW1wdHlNb2RlbEZvcihpRmlsZSk7Ci0KLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IHJlc3VsdC5nZXRNb2RlbEhhbmRsZXIoKS5nZXREb2N1bWVudExvYWRlcigpOwotCQlJRW5jb2RlZERvY3VtZW50IGRvY3VtZW50ID0gbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChpRmlsZSk7Ci0KLQkJcmVzdWx0LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnNldFRleHQodGhpcywgZG9jdW1lbnQuZ2V0KCkpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QuIEl0IGRlcGVuZHMgb24gdGhlIGxvYWRlcnMgbmV3TW9kZWwgbWV0aG9kIHRvIHJldHVybgotCSAqIGFuIGFwcHJvcHJpYXRlIFN0cnVjdXR1cmVkTW9kZWwgYXBwcm9wcmlhdGVseSBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCXJldHVybiBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoY29udGVudFR5cGVJZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QuIEl0IGRlcGVuZHMgb24gdGhlIGxvYWRlcnMgbmV3TW9kZWwgbWV0aG9kIHRvIHJldHVybgotCSAqIGFuIGFwcHJvcHJpYXRlIFN0cnVjdXR1cmVkTW9kZWwgYXBwcm9wcmlhdGVseSBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKFN0cmluZyBjb250ZW50VHlwZUlkLCBVUklSZXNvbHZlciByZXNvbHZlcikgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCU1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNyID0gZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY3IuZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoY29udGVudFR5cGVJZCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBfY29tbW9uQ3JlYXRlTW9kZWwoVU5NQU5BR0VEX01PREVMLCBoYW5kbGVyLCByZXNvbHZlcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSdyZSBub3Qgc2hhcmluZwotCQkJLy8gKGV2ZW4gaWYgaXQgcmVhbGx5IGlzIGluIHVzZSAuLi4gd2UgZG9uJ3QgY2FyZSkKLQkJCS8vIHRoaXMgbWF5IG5lZWQgdG8gYmUgcmUtZXhhbWluZWQuCi0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMTUFOQUdFUikKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW9kZWxNYW5nZXJJbXBsOjpjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IuIE1vZGVsIHVuZXhwZWN0ZWRseSBpbiB1c2UuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWwoT2JqZWN0IGlkKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJCi0JCVNZTkMuYWNxdWlyZSgpOwotCQkvKioKLQkJICogV2hpbGUgYSBnb29kIGNoZWNrIGluIHRoZW9yeSwgaXQncyBwb3NzaWJsZSBmb3IgYW4gZXZlbnQgZmlyZWQgdG8KLQkJICogY2F1c2UgYSBsaXN0ZW5lciB0byBhY2Nlc3MgYSBtZXRob2QgdGhhdCBjYWxscyB0aGlzIG9uZS4KLQkJICovCi0JCS8vQXNzZXJ0LmlzVHJ1ZShTWU5DLmdldERlcHRoKCk9PTEsICJkZXB0aCBub3QgZXF1YWwgdG8gMSIpOwotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCS8vIGlmIG5vdCwgdGhlbiB3ZSdsbCBzaW1wbHkgcmV0dXJuIG51bGwKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCXJlc3VsdCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJfSBlbHNlIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE5vdGU6IHVzZXJzIG9mIHRoaXMgJ21vZGVsJyBtdXN0IHN0aWxsIHJlbGVhc2UgaXQgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCQotCQlTWU5DLmFjcXVpcmUoKTsJCQotCQkvLyBjcmVhdGUgYSBzbmFwc2hvdAotCQlTZXQgaWRzID0gbmV3IEhhc2hTZXQoZk1hbmFnZWRPYmplY3RzLmtleVNldCgpKTsKLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpZHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBvdGVudGlhbElkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJU1lOQy5hY3F1aXJlKCk7CQotCQkJaWYgKGZNYW5hZ2VkT2JqZWN0cy5jb250YWluc0tleShwb3RlbnRpYWxJZCkpIHsKLQkJCQkvLyBjaGVjayB0byBzZWUgaWYgc3RpbGwgdmFsaWQKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHRlbXBSZXN1bHQgPSBnZXRFeGlzdGluZ01vZGVsKHBvdGVudGlhbElkKTsKLQkJCQlpZiAodGVtcFJlc3VsdCE9bnVsbCAmJiBkb2N1bWVudCA9PSB0ZW1wUmVzdWx0LmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSB7Ci0JCQkJCXJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KHBvdGVudGlhbElkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGlkKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBmb3JtIC0gdGhpcyBvbmUgd2lsbCBiZWNvbWUgcHJvdGVjdGVkIG9yIHByaXZhdGUKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChPYmplY3QgaWQpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJYm9vbGVhbiBkb1JlbGVhc2UgPSB0cnVlOwotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQl0cnkgewotCQkJU1lOQy5hY3F1aXJlKCk7Ci0JCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQkvLyBpZiBub3QsIHRoZW4gd2UnbGwgc2ltcGx5IHJldHVybiBudWxsCi0JCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkvLyBpZiBzaGFyZWQgb2JqZWN0IGlzIGluIG91ciBjYWNoZSwgdGhlbiBzaW1wbHkgaW5jcmVtZW50IGl0cyByZWYKLQkJCQkvLyBjb3VudCwKLQkJCQkvLyBhbmQgcmV0dXJuIHRoZSBvYmplY3QuCi0JCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkJZG9SZWxlYXNlPWZhbHNlOwotCQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQkJaWYgKHNoYXJlZE9iamVjdC5kb1dhaXQpIHsKLQkJCQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCQkJfQotCQkJCQlpZiAoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsKSB7Ci0JCQkJCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgRURJVCk7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCQkJCX0KLQkJCQl0cmFjZSgiZ290IGV4aXN0aW5nIG1vZGVsIGZvciBFZGl0OiAiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cmFjZSgiICAgaW5jcmVtZW50ZWQgcmVmZXJlbmNlQ291bnRGb3JFZGl0ICIsIGlkLCBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGRvUmVsZWFzZSkgewotCQkJCVNZTkMucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE5vdGU6IHVzZXJzIG9mIHRoaXMgJ21vZGVsJyBtdXN0IHN0aWxsIHJlbGVhc2UgaXQgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCQotCQlTWU5DLmFjcXVpcmUoKTsJCQotCQkvLyBjcmVhdGUgYSBzbmFwc2hvdAotCQlTZXQgaWRzID0gbmV3IEhhc2hTZXQoZk1hbmFnZWRPYmplY3RzLmtleVNldCgpKTsKLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpZHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBvdGVudGlhbElkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJU1lOQy5hY3F1aXJlKCk7CQotCQkJaWYgKGZNYW5hZ2VkT2JqZWN0cy5jb250YWluc0tleShwb3RlbnRpYWxJZCkpIHsKLQkJCQkvLyBjaGVjayB0byBzZWUgaWYgc3RpbGwgdmFsaWQKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHRlbXBSZXN1bHQgPSBnZXRFeGlzdGluZ01vZGVsKHBvdGVudGlhbElkKTsKLQkJCQlpZiAodGVtcFJlc3VsdCE9bnVsbCAmJiBkb2N1bWVudCA9PSB0ZW1wUmVzdWx0LmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSB7Ci0JCQkJCXJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHBvdGVudGlhbElkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGlkKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBmb3JtIC0gdGhpcyBvbmUgd2lsbCBiZWNvbWUgcHJvdGVjdGVkIG9yIHByaXZhdGUKLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlib29sZWFuIGRvUmVsZWFzZSA9IHRydWU7Ci0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCXRyeSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCS8vIGlmIG5vdCwgdGhlbiB3ZSdsbCBzaW1wbHkgcmV0dXJuIG51bGwKLQkJCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJCS8vIGlmIHNoYXJlZCBvYmplY3QgaXMgaW4gb3VyIGNhY2hlLCB0aGVuIHNpbXBseSBpbmNyZW1lbnQgaXRzIHJlZgotCQkJCS8vIGNvdW50LAotCQkJCS8vIGFuZCByZXR1cm4gdGhlIG9iamVjdC4KLQkJCQlTWU5DLnJlbGVhc2UoKTsKLQkJCQlkb1JlbGVhc2U9ZmFsc2U7Ci0KLQkJCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJCWlmIChzaGFyZWRPYmplY3QuZG9XYWl0KSB7Ci0JCQkJCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCE9bnVsbCkgewotCQkJCQkJX2luY3JDb3VudChzaGFyZWRPYmplY3QsIFJFQUQpOwotCQkJCQl9Ci0JCQkJCXJlc3VsdCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZG9SZWxlYXNlKQotCQkJCVNZTkMucmVsZWFzZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgRE1XOiBUb20sIHRoaXMgaXMgInNwZWNpYWwiIGZvciBsaW5rcyBidWlsZGVyIEFzc3VtaW5nIGl0cwotCSAqICAgICAgICAgICAgIHN0aWxsIG5lZWRlZCwgd291bGRuJ3QgaXQgYmUgYmV0dGVyIHRvIGNoYW5nZSB0bwotCSAqICAgICAgICAgICAgIGdldEV4aXN0aW5nTW9kZWxzKCk/IC0tIHdpbGwgYmUgcmVtb3ZlZC4gSXRzIG5vdCB0aHJlYWQKLQkgKiAgICAgICAgICAgICBzYWZlIGZvciBvbmUgdGhyZWFkIHRvIGdldCB0aGUgRW51bWVyYXRpb24sIHdoZW4gdW5kZXJseWluZwotCSAqICAgICAgICAgICAgIGRhdGEgY291bGQgYmUgY2hhbmdlZCBpbiBhbm90aGVyIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgIEVudW1lcmF0aW9uIGdldEV4aXN0aW5nTW9kZWxJZHMoKSB7Ci0JCXRyeSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCS8vIGNyZWF0ZSBhIGNvcHkKLQkJCVZlY3RvciBrZXlzID0gbmV3IFZlY3RvciggZk1hbmFnZWRPYmplY3RzLmtleVNldCgpICk7Ci0JCQlyZXR1cm4ga2V5cy5lbGVtZW50cygpOwotCQl9IGZpbmFsbHkgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPOiByZXBsYWNlIChvciBzdXBwbGVtZW50KSB0aGlzIGlzIGEgIm1vZGVsIGluZm8iIGFzc29jaWF0aW9uIHRvIHRoZQotCS8vIElGaWxlIHRoYXQgY3JlYXRlZCB0aGUgbW9kZWwKLQlwcml2YXRlIElGaWxlIGdldEZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcGF0aCA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcGF0aCA9IGlkLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gVE9PRE8gbmVlZHMgcmV3b3JrIGZvciBsaW5rZWQgcmVzb3VyY2VzCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIHByaW1hcnkgZm9ybXMgdG8gZ2V0IGEgbWFuYWdlZCBtb2RlbAotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgRURJVCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIEVESVQsIGVuY29kaW5nUnVsZSk7Ci0JfQotCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgRURJVCwgZW5jb2RpbmcsIGxpbmVEZWxpbWl0ZXIpOwotCX0KLQotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gX2dldE1vZGVsRm9yKGRvY3VtZW50LCBFRElUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCB1c2UgSUZpbGUgb3IgU3RyaW5nIGZvcm0KLQkgKi8KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KE9iamVjdCBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JFZGl0KHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBJRmlsZSBvciBTdHJpbmcgZm9ybQotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoT2JqZWN0IGlkLCBPYmplY3QgbW9kZWxUeXBlLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlciwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JFZGl0KHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KFN0cmluZyBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogaWQgbWF5IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0KLQkJSW5wdXRTdHJlYW0gaXN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpZCwgaXN0cmVhbSk7Ci0JCWlmIChoYW5kbGVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IF9jb21tb25DcmVhdGVNb2RlbChpc3RyZWFtLCBpZCwgaGFuZGxlciwgcmVzb2x2ZXIsIEVESVQsIG51bGwsIG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIm5vIG1vZGVsIGhhbmRsZXIgZm91bmQgZm9yIGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgcHJpbWFyeSBmb3JtcyB0byBnZXQgYSBtYW5hZ2VkIG1vZGVsCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIFJFQUQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgUkVBRCwgZW5jb2RpbmdSdWxlKTsKLQl9Ci0KLQlwdWJsaWMgIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIFJFQUQsIGVuY29kaW5nTmFtZSwgbGluZURlbGltaXRlcik7Ci0JfQotCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBfZ2V0TW9kZWxGb3IoZG9jdW1lbnQsIFJFQUQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlcgotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBvciBTdHJpbmcgZm9ybQotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoT2JqZWN0IGlkLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JSZWFkKHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCB1c2UgSUZpbGUgZm9ybQotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoT2JqZWN0IGlkLCBPYmplY3QgbW9kZWxUeXBlLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlciwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0cmluZ0lkID0gaWQudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGdldE1vZGVsRm9yUmVhZChzdHJpbmdJZCwgVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCByZXNvbHZlcik7Ci0JfQotCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChTdHJpbmcgaWQsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaXN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpZCwgaXN0cmVhbSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlzdHJlYW0sIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgUkVBRCwgbnVsbCwgbnVsbCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBvbmx5IHRlbXBvcmFyaWx5IHZpc2libGUKLQkgKi8KLQlwdWJsaWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKSB7Ci0JCWlmIChmTW9kZWxIYW5kbGVyUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZk1vZGVsSGFuZGxlclJlZ2lzdHJ5ID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gZk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlciNnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBfY29tbW9uTmV3TW9kZWwoaUZpbGUsIGZvcmNlKTsKLQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9IDE7Ci0JCX0KLQkJc2hhcmVkT2JqZWN0LnNldExvYWRlZCgpOwotCQlyZXR1cm4gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlciNnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljICBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IF9jb21tb25OZXdNb2RlbChpRmlsZSwgZm9yY2UpOwotCQlTWU5DLmFjcXVpcmUoKTsKLQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJaWYgKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCE9bnVsbCkgewotCQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgPSAxOwotCQkJfQotCQl9Ci0JCVNZTkMucmVsZWFzZSgpOwotCQlzaGFyZWRPYmplY3Quc2V0TG9hZGVkKCk7Ci0JCXJldHVybiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICovCi0JcHVibGljICBpbnQgZ2V0UmVmZXJlbmNlQ291bnQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJc3luY2hyb25pemVkIChzaGFyZWRPYmplY3QpIHsKLQkJCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgKyBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0OwotCQkJfQotCQl9Ci0JCVNZTkMucmVsZWFzZSgpOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZDsKLQkJCX0KLQkJfQotCQlTWU5DLnJlbGVhc2UoKTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDb252ZXJ0TGluZURlbGltaXRlcnMoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlLCBFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbCwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpID4gMSkgewotCQkJY29udmVydExpbmVEZWxpbWl0ZXJzKHN0cnVjdHVyZWREb2N1bWVudCwgaUZpbGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2dyYW1FcnJvcihUaHJvd2FibGUgdCkgewotCi0JCUxvZ2dlci5sb2dFeGNlcHRpb24oIkltcG9zc2libGUgUHJvZ3JhbSBFcnJvciIsIHQpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgIGJvb2xlYW4gaXNTaGFyZWQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCArIHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQ7Ci0JCQl9Ci0JCX0KLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCXJlc3VsdCA9IGNvdW50ID4gMTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKi8KLQlwdWJsaWMgIGJvb2xlYW4gaXNTaGFyZWRGb3JFZGl0KE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb3VudCA9IDA7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVNZTkMuYWNxdWlyZSgpOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0OwotCQkJfQotCQl9IGVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCX0KLQkJcmVzdWx0ID0gY291bnQgPiAxOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCXB1YmxpYyAgYm9vbGVhbiBpc1NoYXJlZEZvclJlYWQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJCVNZTkMuYWNxdWlyZSgpOwotCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZDsKLQkJCX0KLQkJfQotCQlTWU5DLnJlbGVhc2UoKTsKLQkJcmVzdWx0ID0gY291bnQgPiAxOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbCBtYW5hZ2VyIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdGhlIG1hbmFnZXIgZG9lcyBub3Qgb3RoZXJ3aXNlIGludGVyYWN0IHdpdGggdGhlc2Ugc3RhdGVzCi0JICogQHJldHVybiBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGVDaGFuZ2luZygpIHsKLQkJLy8gZG9lc24ndCBzZWVtIHRvIGJlIHVzZWQgYW55bW9yZQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgaWQgb2YgdGhlIG1vZGVsLiBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlTW9kZWwoT2JqZWN0IG9sZElkLCBPYmplY3QgbmV3SWQpIHsKLQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0LmlzTm90TnVsbChvbGRJZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTWU5DLmFjcXVpcmUoKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQob2xkSWQpOwotCQkvLyBpZiBub3QgZm91bmQgaW4gY2FjaGUsIGlnbm9yZSByZXF1ZXN0LgotCQkvLyB0aGlzIHdvdWxkIG5vcm1hbGx5IGJlIGEgcHJvZ3JhbSBlcnJvcgotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCWZNYW5hZ2VkT2JqZWN0cy5yZW1vdmUob2xkSWQpOwotCQkJZk1hbmFnZWRPYmplY3RzLnB1dChuZXdJZCwgc2hhcmVkT2JqZWN0KTsKLQkJfQotCQlTWU5DLnJlbGVhc2UoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZWFkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBpYW5hRW5jb2RpbmdOYW1lKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCVN0cmluZyBhbGxUZXh0ID0gbnVsbDsKLQkJaWYgKChpYW5hRW5jb2RpbmdOYW1lICE9IG51bGwpICYmIChpYW5hRW5jb2RpbmdOYW1lLmxlbmd0aCgpICE9IDApKSB7Ci0JCQlTdHJpbmcgZW5jID0gQ29kZWRJTy5nZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGlhbmFFbmNvZGluZ05hbWUpOwotCQkJaWYgKGVuYyA9PSBudWxsKSB7Ci0JCQkJLy8gaWYgbm8gY29udmVyc2lvbiB3YXMgcG9zc2libGUsIGxldCdzIGFzc3VtZSB0aGF0Ci0JCQkJLy8gdGhlIGVuY29kaW5nIGlzIGFscmVhZHkgYSBqYXZhIGVuY29kaW5nIG5hbWUsIHNvIHdlJ2xsCi0JCQkJLy8gcHJvY2VlZCB3aXRoIHRoYXQgYXNzdW1wdGlvbi4gVGhpcyBpcyB0aGUgY2FzZSwgZm9yCi0JCQkJLy8gZXhhbXBsZSwKLQkJCQkvLyBmb3IgdGhlIHJlbG9hZCgpIHByb2NlZHVyZS4KLQkJCQkvLyBJZiBpbiBmYWN0IGl0IGlzIG5vdCBhIHZhbGlkIGphdmEgZW5jb2RpbmcsIHRoZW4KLQkJCQkvLyB0aGUgImFsbFRleHQ9IiBsaW5lIHdpbGwgY2F1c2UgYW4KLQkJCQkvLyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JCQkJZW5jID0gaWFuYUVuY29kaW5nTmFtZTsKLQkJCX0KLQkJCWFsbFRleHQgPSByZWFkSW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtLCBlbmMpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdlIG5vcm1hbGx5IGFzc3VtZSBlbmNvZGluZyBpcyBwcm92aWRlZCBmb3IgdGhpcyBtZXRob2QsIGJ1dCBpZgotCQkJLy8gbm90LAotCQkJLy8gd2UnbGwgdXNlIHBsYXRmb3JtIGRlZmF1bHQKLQkJCWFsbFRleHQgPSByZWFkSW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7Ci0JCX0KLQkJcmV0dXJuIGFsbFRleHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZElucHV0U3RyZWFtKElucHV0U3RyZWFtUmVhZGVyIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWludCBudW1SZWFkID0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhciB0QnVmZltdID0gbmV3IGNoYXJbUkVBRF9CVUZGRVJfU0laRV07Ci0JCXdoaWxlICgobnVtUmVhZCA9IGlucHV0U3RyZWFtLnJlYWQodEJ1ZmYsIDAsIHRCdWZmLmxlbmd0aCkpICE9IC0xKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRCdWZmLCAwLCBudW1SZWFkKTsKLQkJfQotCQkvLyByZW1lbWJlciAtLSB3ZSBkaWRuJ3Qgb3BlbiBzdHJlYW0gLi4uIHNvIHdlIGRvbid0IGNsb3NlIGl0Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlciNyZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCi0JCS8vIGdldEhhbmRsZXIgKGFzc3VtZSBpdHMgdGhlICJuZXcgb25lIikKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gbW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCk7Ci0JCS8vIGdldExvYWRlciBmb3IgdGhhdCBuZXcgb25lCi0JCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCS8vIGFzayBpdCB0byByZWluaXRpYWxpemUKLQkJbW9kZWwgPSBsb2FkZXIucmVpbml0aWFsaXplKG1vZGVsKTsKLQkJLy8gdGhlIGxvYWRlciBzaG91bGQgY2hlY2sgdG8gc2VlIGlmIHRoZSBvbmUgaXQgcmVjZWl2ZWQKLQkJLy8gaXMgdGhlIHNhbWUgdHlwZSBpdCB3b3VsZCBub3JtYWxseSBjcmVhdGUuCi0JCS8vIGlmIG5vdCwgaXQgbXVzdCAic3RhcnQgZnJvbSBzY3JhdGNoIiBhbmQgY3JlYXRlIGEgd2hvbGUKLQkJLy8gbmV3IG9uZS4KLQkJLy8gaWYgaXQgaXMgb2YgdGhlIHNhbWUgdHlwZSwgaXQgc2hvdWxkIGp1c3QgJ3JlcGxhY2UgdGV4dCcKLQkJLy8gcmVwbGFjaW5nIGFsbCB0aGUgZXhpc3RpbmcgdGV4dCB3aXRoIHRoZSBuZXcgdGV4dC4KLQkJLy8gdGhlIGltcG9ydGFudCBvbmUgaXMgdGhlIEpTUCBsb2FkZXIgLi4uIGl0IHNob3VsZCBnbyB0aHJvdWdoCi0JCS8vIGl0cyBlbWJlZGRlZCBjb250ZW50IGNoZWNraW5nIGFuZCBpbml0aWFsaXphdGlvbgotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JIHZvaWQgcmVsZWFzZUZyb21FZGl0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCU9iamVjdCBpZCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRJZCgpOwotCQlpZiAoaWQuZXF1YWxzKFVOTUFOQUdFRF9NT0RFTCkgfHwgaWQuZXF1YWxzKERVUExJQ0FURURfTU9ERUwpKSB7Ci0JCQljbGVhbnVwRGlzY2FyZGVkTW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlbGVhc2VGcm9tRWRpdChpZCk7Ci0JCX0KLQotCX0KLQkKLQkgdm9pZCByZWxlYXNlRnJvbVJlYWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJT2JqZWN0IGlkID0gc3RydWN0dXJlZE1vZGVsLmdldElkKCk7Ci0JCWlmIChpZC5lcXVhbHMoVU5NQU5BR0VEX01PREVMKSB8fCBpZC5lcXVhbHMoRFVQTElDQVRFRF9NT0RFTCkpIHsKLQkJCWNsZWFudXBEaXNjYXJkZWRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVsZWFzZUZyb21SZWFkKGlkKTsKLQkJfQotCi0JfQotCS8qKgotCSAqIGRlZmF1bHQgZm9yIHVzZSBpbiBzYW1lIHBhY2thZ2UsIG5vdCBzdWJjbGFzc2VzCi0JICogCi0JICovCi0JIHByaXZhdGUgdm9pZCByZWxlYXNlRnJvbUVkaXQoT2JqZWN0IGlkKSB7Ci0JCS8vIElTU1VFOiBtYW55IG9mIHRoZXNlIGFzc2VydHMgc2hvdWxkIGJlIGNoYW5nZWQgdG8gImxvZ3MiCi0JCS8vIGFuZCBjb250aW51ZSB0byBsaW1wIGFsb25nPwotCi0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IG51bGw7Ci0KLQkJLy8gSVNTVUU6IGhlcmUgd2UgbmVlZCBiZXR0ZXIgInNwZWMiIHdoYXQgdG8gZG8gd2l0aAotCQkvLyB1bm1hbmFnZWQgb3IgZHVwbGljYXRlZCBtb2RlbHMuIFJlbGVhc2Ugc3RpbGwgbmVlZHMKLQkJLy8gdG8gYmUgY2FsbGVkIG9uIHRoZW0sIGZvciBub3csIGJ1dCB0aGUgbW9kZWwgbWFuYWdlcgotCQkvLyBkb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0JCWlmIChpZC5lcXVhbHMoVU5NQU5BR0VEX01PREVMKSB8fCBpZC5lcXVhbHMoRFVQTElDQVRFRF9NT0RFTCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklkcyBvZiBVTk1BTkFHRURfTU9ERUwgb3IgRFVQTElDQVRFRF9NT0RFTCBhcmUgaWxsZWdhbCBoZXJlIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQkKLQkJCUFzc2VydC5pc05vdE51bGwoc2hhcmVkT2JqZWN0LCAicmVsZWFzZSB3YXMgcmVxdWVzdGVkIG9uIGEgbW9kZWwgdGhhdCB3YXMgbm90IGJlaW5nIG1hbmFnZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJCi0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCXN5bmNocm9uaXplZChzaGFyZWRPYmplY3QpIHsKLQkJCQlfZGVjckNvdW50KHNoYXJlZE9iamVjdCwgRURJVCk7Ci0JCQkJaWYgKChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkID09IDApICYmIChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID09IDApKSB7Ci0JCQkJCWRpc2NhcmRNb2RlbChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCS8vIGlmIGVkaXQgZ29lcyB0byB6ZXJvLCBidXQgc3RpbGwgb3BlbiBmb3IgcmVhZCwKLQkJCS8vIHRoZW4gd2Ugc2hvdWxkIHJlbG9hZCBoZXJlLCBzbyB3ZSBhcmUgaW4gc3luY2ggd2l0aAotCQkJLy8gY29udGVudHMgb24gZGlzay4KLQkJCS8vIElTU1VFOiBzaG91bGQgd2UgY2hlY2sgaXNEaXJ0eSBoZXJlPwotCQkJLy8gQU5TV0VSOiBoZXJlLCBmb3Igbm93IG5vdy4gbW9kZWwgc3RpbGwgaGFzIGl0cyBvd24gZGlydHkKLQkJCS8vIGZsYWcgZm9yIHNvbWUgcmVhc29uLgotCQkJLy8gd2UgbmVlZCB0byBhZGRyZXNzICogdGhhdCAqIHRvby4KLQotCQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJCWlmICgoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA+IDApICYmIChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID09IDApICYmIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5pc0RpcnR5KCkpIHsKLQkJCQkJc2lnbmFsUHJlTGlmZUN5Y2xlTGlzdGVuZXJSZXZlcnQoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsKTsKLQkJCQkJcmV2ZXJ0TW9kZWwoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQkJCS8qCi0JCQkJCSAqIEJlY2F1c2UgbW9kZWwgZXZlbnRzIGFyZSBmaXJlZCB0byBub3RpZnkgYWJvdXQgdGhlCi0JCQkJCSAqIHJldmVydCdzIGNoYW5nZXMsIGFuZCBsaXN0ZW5lcnMgY2FuIHN0aWxsIGdldC9yZWxlYXNlCi0JCQkJCSAqIHRoZSBtb2RlbCBmcm9tIHRoaXMgdGhyZWFkIChsb2NraW5nIHByZXZlbnRzIGl0IGJlaW5nCi0JCQkJCSAqIGRvbmUgZnJvbSBvdGhlciB0aHJlYWRzKSwgdGhlIHJlZmVyZW5jZSBjb3VudHMgY291bGQKLQkJCQkJICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHdlIGVudGVyZWQgdGhpcyBpZiBibG9jaywgYW5kIHRoZQotCQkJCQkgKiBtb2RlbCBjb3VsZCBoYXZlIGJlZW4gZGlzY2FyZGVkLiAgQ2hlY2sgdGhlIGNvdW50cyBhZ2Fpbi4KLQkJCQkJICovCi0JCQkJCWlmIChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkID4gMCAmJiBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID09IDApIHsKLQkJCQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCQkJfQotCQkJCQlzaWduYWxQb3N0TGlmZUN5Y2xlTGlzdGVuZXJSZXZlcnQoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgZm9yIG5vdywgdGhvdWdoIHB1YmxpYyBmb3JtcyBoYXZlIGJlZW4gcmVxdWVzdGVkLCBpbiBwYXN0LgotCXByaXZhdGUgdm9pZCByZXZlcnRNb2RlbChPYmplY3QgaWQsIFNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZXZlcnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2lnbmFsUHJlTGlmZUN5Y2xlTGlzdGVuZXJSZXZlcnQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1JFVkVSVCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQkvLyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGlzIGRlc2lnbiB0aGF0IGEgY2FzdCBpcyBuZWVkZWQgaGVyZSE/Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudChzdHJ1Y3R1cmVkTW9kZWwsIHR5cGUpOwotCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2lnbmFsUG9zdExpZmVDeWNsZUxpc3RlbmVyUmV2ZXJ0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRVZFUlQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCS8vIHdoYXQncyB3cm9uZyB3aXRoIHRoaXMgZGVzaWduIHRoYXQgYSBjYXN0IGlzIG5lZWRlZCBoZXJlIT8KLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHN0cnVjdHVyZWRNb2RlbCwgdHlwZSk7Ci0JCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuc2lnbmFsTGlmZWN5Y2xlRXZlbnQoZXZlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNjYXJkTW9kZWwoT2JqZWN0IGlkLCBTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0KSB7Ci0JCVNZTkMuYWNxdWlyZSgpOwotCQlmTWFuYWdlZE9iamVjdHMucmVtb3ZlKGlkKTsKLQkJU1lOQy5yZWxlYXNlKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJUGxhdGZvcm0uZ2V0TG9nKFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VDb3JlUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCAiQXR0ZW1wdGVkIHRvIGRpc2NhcmQgYSBzdHJ1Y3R1cmVkIG1vZGVsIGJ1dCB0aGUgdW5kZXJseWluZyBkb2N1bWVudCBoYXMgYWxyZWFkeSBiZWVuIHNldCB0byBudWxsOiAiICsgc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBudWxsKSk7Ci0JCX0KLQotCQljbGVhbnVwRGlzY2FyZGVkTW9kZWwoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW51cERpc2NhcmRlZE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkvKgotCQkgKiBUaGlzIGNhbGwgKGFuZCBzZXR0aW5nIHRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnQgdG8gbnVsbCkgd2VyZQotCQkgKiBwcmV2aW91c2x5IGRvbmUgd2l0aGluIHRoZSBtb2RlbCBpdHNlbGYsIGJ1dCBmb3IgY29uY3VycmVuY3kgaXQKLQkJICogbXVzdCBiZSBkb25lIGhlcmUgZHVyaW5nIGEgc3luY2hyb25pemVkIHJlbGVhc2UuCi0JCSAqLwotCQlzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkucmVsZWFzZSgpOwotCi0JCS8qCi0JCSAqIEZvciBzdHJ1Y3R1cmVkIGRvY3VtZW50cyBvcmlnaW5hdGluZyBmcm9tIGZpbGUgYnVmZmVycywgZGlzY29ubmVjdAotCQkgKiB1cyBmcm9tIHRoZSBmaWxlIGJ1ZmZlciwgbm93LgotCQkgKi8KLQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VNb2RlbChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCS8qCi0JCSAqIFNldHRpbmcgdGhlIGRvY3VtZW50IHRvIG51bGwgaXMgcmVxdWlyZWQgc2luY2Ugc29tZSBzdWJjbGFzc2VzIG9mCi0JCSAqIG1vZGVsIG1pZ2h0IGhhdmUgImNsZWFudXAiIG9mIGxpc3RlbmVycywgZXRjLiwgdG8gcmVtb3ZlLCB3aGljaAotCQkgKiB3ZXJlIGluaXRpYWxpemVkIGR1cmluZyB0aGUgaW5pdGlhbCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JCSAqIAotCQkgKiBUaGUgbW9kZWwgaXRzZWxmIGluIHBhcnRpY3VsYXIgbWF5IGhhdmUgaW50ZXJuYWwgbGlzdGVuZXJzIHVzZWQgdG8KLQkJICogY29vcmRpbmF0ZSB0aGUgZG9jdW1lbnQgd2l0aCBpdHMgb3duICJzdHJ1Y3R1cmUiLgotCQkgKi8KLQkJc3RydWN0dXJlZE1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChudWxsKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBkZWZhdWx0IGZvciB1c2UgaW4gc2FtZSBwYWNrYWdlLCBub3Qgc3ViY2xhc3NlcwotCSAqIAotCSAqLwotCSBwcml2YXRlIHZvaWQgcmVsZWFzZUZyb21SZWFkKE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBudWxsOwotCi0JCWlmIChpZC5lcXVhbHMoVU5NQU5BR0VEX01PREVMKSB8fCBpZC5lcXVhbHMoRFVQTElDQVRFRF9NT0RFTCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklkcyBvZiBVTk1BTkFHRURfTU9ERUwgb3IgRFVQTElDQVRFRF9NT0RFTCBhcmUgaWxsZWdhbCBoZXJlIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKHNoYXJlZE9iamVjdCwgInJlbGVhc2Ugd2FzIHJlcXVlc3RlZCBvbiBhIG1vZGVsIHRoYXQgd2FzIG5vdCBiZWluZyBtYW5hZ2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNoYXJlZE9iamVjdC53YWl0Rm9yTG9hZEF0dGVtcHQoKTsKLQkJfQotCQlTWU5DLmFjcXVpcmUoKTsKLQkJc3luY2hyb25pemVkKHNoYXJlZE9iamVjdCkgewotCQkJX2RlY3JDb3VudChzaGFyZWRPYmplY3QsIFJFQUQpOwotCQkJaWYgKChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkID09IDApICYmIChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID09IDApKSB7Ci0JCQkJZGlzY2FyZE1vZGVsKGlkLCBzaGFyZWRPYmplY3QpOwotCQkJfQotCQl9Ci0JCVNZTkMucmVsZWFzZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QgdXNlCi0JICogdGhlIGNhY2hlZCB2ZXJzaW9uLCBidXQgZm9yY2VzIHRoZSBjYWNoZWQgdmVyc2lvbiB0byBiZSByZXBsYWNlZCB3aXRoIGEKLQkgKiBmcmVzaCwgdW5jaGFuZ2VkIHZlcnNpb24uIE5vdGU6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGNoYW5nZSBhbnkKLQkgKiByZWZlcmVuY2UgY291bnRzLiBBbHNvLCBpZiB0aGVyZSBpcyBub3QgYWxyZWFkeSBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZQotCSAqIG1vZGVsLCB0aGVuIHRoaXMgY2FsbCBpcyBlc3NlbnRpYWxseSBpZ25vcmVkICh0aGF0IGlzLCBpdCBkb2VzIG5vdCBwdXQKLQkgKiBhIG1vZGVsIGluIHRoZSBjYWNoZSkgYW5kIHJldHVybnMgbnVsbC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIHdpbGwgYmVjb21lIHByb3RlY3RlZCwgdXNlIHJlbG9hZCBkaXJlY3RseSBvbiBtb2RlbAotCSAqLwotCXB1YmxpYyAgSVN0cnVjdHVyZWRNb2RlbCByZWxvYWRNb2RlbChPYmplY3QgaWQsIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCi0JCS8vIGdldCB0aGUgZXhpc3RpbmcgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaWQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKGlkKTsKLQkJLy8gZm9yIHRoZSBtb2RlbCB0byBiZSBudWxsIGlzIHByb2JhYmx5IGFuIGVycm9yICh0aGF0IGlzLAotCQkvLyByZWxvYWQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkLCBidXQgd2UnbGwgZ3VhcmQgYWdhaW5zdAotCQkvLyBhIG51bGwgcG9pbnRlciBleGFtcGxlIGFuZCByZXR1cm4gbnVsbCBpZiB3ZSBhcmUgbm8gbG9uZ2VyIG1hbmFnaW5nCi0JCS8vIHRoYXQgbW9kZWwuCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGxvYWRlciBiYXNlZCBvbiBleGlzdGluZyB0eXBlCi0JCQkvLyBkbXdUT0RPIGV2YWx1YXRlIHdoZW4gcmVsb2FkIHNob3VsZCBvY2N1cgotCQkJLy8gd2l0aCBwb3RlbnRpYWxseSBuZXcgdHlwZSAoZS5nLiBodG1sICdzYXZlIGFzJyBqc3ApLgotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gc3RydWN0dXJlZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJCS8vIGFzayB0aGUgbG9hZGVyIHRvIHJlLWxvYWQKLQkJCWxvYWRlci5yZWxvYWQoVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCBzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJdHJhY2UoInJlLWxvYWRpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVNb2RlbChJRmlsZSBpRmlsZSwgU3RyaW5nIGlkLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCi0JCVNZTkMuYWNxdWlyZSgpOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgPT0gbnVsbCB8fCBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwgPT0gbnVsbCkgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFNTRUNvcmVNZXNzYWdlcy5Qcm9ncmFtX0Vycm9yX19Nb2RlbE1hbmFnZV9FWENfKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ncmFtIEVycm9yOiBNb2RlbE1hbmFnZXJJbXBsOjpzYXZlTW9kZWwuIE1vZGVsIHNob3VsZCBiZSBpbiB0aGUgY2FjaGUiCi0JCX0gCi0JCWVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQkKLQkJCS8qKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMTYxMAotCQkJICogCi0JCQkgKiBTeW5jIHJlbW92ZWQgZnJvbSBoZXJlIHRvIHByZXZlbnQgZGVhZGxvY2suIEFsdGhvdWdoIHRoZSBtb2RlbAotCQkJICogaW5zdGFuY2UgbWF5IGRpc2FwcGVhciBvciBiZSBtYWRlIGludmFsaWQgd2hpbGUgdGhlIHNhdmUgaXMKLQkJCSAqIGhhcHBlbmluZywgdGhlIGRvY3VtZW50IGl0c2VsZiBzdGlsbCBoYXMgdGhlIGNvbnRlbnRzIHdlJ3JlCi0JCQkgKiB0cnlpbmcgdG8gc2F2ZS4gU2ltdWx0YW5lb3VzIHNhdmVzIHNob3VsZCBiZSB0aHJvdHRsZWQgYnkKLQkJCSAqIHJlc291cmNlIGxvY2tpbmcgd2l0aG91dCBvdXIgaW50ZXJ2ZW50aW9uLgotCQkJICovCi0JCQlib29sZWFuIHNhdmVkID0gZmFsc2U7Ci0JCQkvLyBpZiB0aGlzIG1vZGVsIHdhcyBiYXNlZCBvbiBhIEZpbGUgQnVmZmVyIGFuZCB3ZSdyZSB3cml0aW5nIGJhY2sKLQkJCS8vIHRvIHRoZSBzYW1lIGxvY2F0aW9uLCB1c2UgdGhlIGJ1ZmZlciB0byBkbyB0aGUgd3JpdGluZwotCQkJaWYgKEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0V4aXN0aW5nQnVmZmVyKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkpIHsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCUlQYXRoIGZpbGVMb2NhdGlvbiA9IEZpbGVCdWZmZXJzLm5vcm1hbGl6ZUxvY2F0aW9uKGlGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJCWlmIChmaWxlTG9jYXRpb24uZXF1YWxzKGJ1ZmZlci5nZXRMb2NhdGlvbigpKSkgewotCQkJCQlidWZmZXIuY29tbWl0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRydWUpOwotCQkJCQlzYXZlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzYXZlZCkgewotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCXNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQsIGlGaWxlLCBlbmNvZGluZ1J1bGUpOwotCQkJCXRyYWNlKCJzYXZpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXROZXdTdGF0ZShmYWxzZSk7Ci0JCX0JCi0JfQotCi0JLyoqCi0JICogU2F2aW5nIHRoZSBtb2RlbCByZWFsbHkganVzdCBtZWFucyB0byBzYXZlIGl0J3Mgc3RydWN0dXJlZCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gb3V0cHV0U3RyZWFtCi0JICogQHBhcmFtIGVuY29kaW5nUnVsZQotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kZWwoU3RyaW5nIGlkLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0KLQkJU1lOQy5hY3F1aXJlKCk7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQlTWU5DLnJlbGVhc2UoKTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU1NFQ29yZU1lc3NhZ2VzLlByb2dyYW1fRXJyb3JfX01vZGVsTWFuYWdlX0VYQ18pOyAvLyROT04tTkxTLTEkID0gIlByb2dyYW0gRXJyb3I6IE1vZGVsTWFuYWdlckltcGw6OnNhdmVNb2RlbC4gTW9kZWwgc2hvdWxkIGJlIGluIHRoZSBjYWNoZSIKLQkJfQotCQllbHNlIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJc2hhcmVkT2JqZWN0LndhaXRGb3JMb2FkQXR0ZW1wdCgpOwotCQkJLyoqCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIxNjEwCi0JCQkgKiAKLQkJCSAqIFN5bmMgcmVtb3ZlZCBmcm9tIGhlcmUgdG8gcHJldmVudCBkZWFkbG9jay4gQWx0aG91Z2ggdGhlIG1vZGVsCi0JCQkgKiBpbnN0YW5jZSBtYXkgZGlzYXBwZWFyIG9yIGJlIG1hZGUgaW52YWxpZCB3aGlsZSB0aGUgc2F2ZSBpcwotCQkJICogaGFwcGVuaW5nLCB0aGUgZG9jdW1lbnQgaXRzZWxmIHN0aWxsIGhhcyB0aGUgY29udGVudHMgd2UncmUKLQkJCSAqIHRyeWluZyB0byBzYXZlLiBTaW11bHRhbmVvdXMgc2F2ZXMgc2hvdWxkIGJlIHRocm90dGxlZCBieQotCQkJICogcmVzb3VyY2UgbG9ja2luZyB3aXRob3V0IG91ciBpbnRlcnZlbnRpb24uCi0JCQkgKi8KLQkJCS8qCi0JCQkgKiBpZiB0aGlzIG1vZGVsIHdhcyBiYXNlZCBvbiBhIEZpbGUgQnVmZmVyIGFuZCB3ZSdyZSB3cml0aW5nIGJhY2sKLQkJCSAqIHRvIHRoZSBzYW1lIGxvY2F0aW9uLCB1c2UgdGhlIGJ1ZmZlciB0byBkbyB0aGUgd3JpdGluZwotCQkJICovCi0JCQlpZiAoRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzRXhpc3RpbmdCdWZmZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSkgewotCQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJYnVmZmVyLmNvbW1pdChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0cnVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlGaWxlIGlGaWxlID0gZ2V0RmlsZUZvcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCXNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQsIGlGaWxlKTsKLQkJCQl0cmFjZSgic2F2aW5nIG1vZGVsIiwgaWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0TmV3U3RhdGUoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB0aGlzIG1ldGhvZCBpcyBsZXNzIGVmZmljaWVudCB0aGFuIElGaWxlIGZvcm0sIHNpbmNlIGl0Ci0JICogICAgICAgICAgICAgcmVxdWlyZXMgYW4gZXh0cmEgImNvcHkiIG9mIGJ5dGUgYXJyYXksIGFuZCBzaG91bGQgYmUgYXZvaWQKLQkgKiAgICAgICAgICAgICBpbiBmYXZvciBvZiB0aGUgSUZpbGUgZm9ybS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kZWwoU3RyaW5nIGlkLCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlTWU5DLmFjcXVpcmUoKTsKLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCVNZTkMucmVsZWFzZSgpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTU0VDb3JlTWVzc2FnZXMuUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvZ3JhbSBFcnJvcjogTW9kZWxNYW5hZ2VySW1wbDo6c2F2ZU1vZGVsLiBNb2RlbCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlIgotCQl9Ci0JCWVsc2UgewotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlzaGFyZWRPYmplY3Qud2FpdEZvckxvYWRBdHRlbXB0KCk7Ci0JCQlzeW5jaHJvbml6ZWQoc2hhcmVkT2JqZWN0KSB7Ci0JCQkJQ29kZWRTdHJlYW1DcmVhdG9yIGNvZGVkU3RyZWFtQ3JlYXRvciA9IG5ldyBDb2RlZFN0cmVhbUNyZWF0b3IoKTsKLQkJCQljb2RlZFN0cmVhbUNyZWF0b3Iuc2V0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRJZCgpLCBuZXcgRG9jdW1lbnRSZWFkZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKSk7Ci0JCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldFByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbShlbmNvZGluZ1J1bGUpOwotCQkJCWJ5dGVbXSBvdXRwdXRCeXRlcyA9IGJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOwotCQkJCW91dHB1dFN0cmVhbS53cml0ZShvdXRwdXRCeXRlcyk7Ci0JCQkJdHJhY2UoInNhdmluZyBtb2RlbCIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0TmV3U3RhdGUoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgSUZpbGUgaUZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50LCBpRmlsZSwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzRXhpc3RpbmdCdWZmZXIoc3RydWN0dXJlZERvY3VtZW50KSkgewotCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCWlmIChidWZmZXIuZ2V0TG9jYXRpb24oKS5lcXVhbHMoaUZpbGUuZ2V0RnVsbFBhdGgoKSkgfHwgYnVmZmVyLmdldExvY2F0aW9uKCkuZXF1YWxzKGlGaWxlLmdldExvY2F0aW9uKCkpKSB7Ci0JCQkJYnVmZmVyLmNvbW1pdChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0cnVlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIElNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQkJLy8gSURvY3VtZW50RHVtcGVyIGR1bXBlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnREdW1wZXIoKTsKLQkJCUNvZGVkU3RyZWFtQ3JlYXRvciBjb2RlZFN0cmVhbUNyZWF0b3IgPSBuZXcgQ29kZWRTdHJlYW1DcmVhdG9yKCk7Ci0JCQlSZWFkZXIgcmVhZGVyID0gbmV3IERvY3VtZW50UmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQljb2RlZFN0cmVhbUNyZWF0b3Iuc2V0KGlGaWxlLCByZWFkZXIpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldFByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKHN0cnVjdHVyZWREb2N1bWVudC5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gY29kZWRTdHJlYW1DcmVhdG9yLmdldEN1cnJlbnRFbmNvZGluZ01lbWVudG8oKTsKLQotCQkJLy8gYmUgc3VyZSBkb2N1bWVudCdzIGlzIHVwZGF0ZWQsIGluIGNhc2UgZXhjZXB0aW9uIGlzIHRocm93biBpbgotCQkJLy8gZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0KLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdNZW1lbnRvKTsKLQotCQkJLy8gQ29udmVydCBsaW5lIGRlbGltaXRlcnMgYWZ0ZXIgZW5jb2RpbmcgbWVtZW50byBpcyBmaWd1cmVkIG91dCwKLQkJCS8vIGJ1dAotCQkJLy8gYmVmb3JlIHdyaXRpbmcgdG8gb3V0cHV0IHN0cmVhbS4KLQkJCWhhbmRsZUNvbnZlcnRMaW5lRGVsaW1pdGVycyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIGlGaWxlLCBlbmNvZGluZ1J1bGUsIGVuY29kaW5nTWVtZW50byk7Ci0KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBjb2RlZEJ5dGVTdHJlYW0gPSBjb2RlZFN0cmVhbUNyZWF0b3IuZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oZW5jb2RpbmdSdWxlKTsKLQkJCUlucHV0U3RyZWFtIGNvZGVkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvZGVkQnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCWlmIChpRmlsZS5leGlzdHMoKSkKLQkJCQlpRmlsZS5zZXRDb250ZW50cyhjb2RlZFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQllbHNlCi0JCQkJaUZpbGUuY3JlYXRlKGNvZGVkU3RyZWFtLCBmYWxzZSwgbnVsbCk7Ci0JCQljb2RlZEJ5dGVTdHJlYW0uY2xvc2UoKTsKLQkJCWNvZGVkU3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gdHJhY2UgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyYWNlKFN0cmluZyBtc2csIE9iamVjdCBpZCkgewotCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMTUFOQUdFUikgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgbXNnICsgIiAiICsgVXRpbGl0aWVzLm1ha2VTaG9ydElkKGlkKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tbW9uIHRyYWNlIG1ldGhvZAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFjZShTdHJpbmcgbXNnLCBPYmplY3QgaWQsIGludCB2YWx1ZSkgewotCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMTUFOQUdFUikgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgbXNnICsgVXRpbGl0aWVzLm1ha2VTaG9ydElkKGlkKSArICIgKCIgKyB2YWx1ZSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQkgYm9vbGVhbiBpc0lkSW5Vc2UoU3RyaW5nIG5ld0lkKSB7Ci0JCQlib29sZWFuIGluVXNlID0gZmFsc2U7Ci0JCQlTWU5DLmFjcXVpcmUoKTsKLQkJCVNoYXJlZE9iamVjdCBvYmplY3QgPShTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQobmV3SWQpOwotCQkJaWYgKG9iamVjdCE9bnVsbCkgewotCQkJCWluVXNlID0gb2JqZWN0LnRoZVNoYXJlZE1vZGVsIT1udWxsOwotCQkJfQotCQkJU1lOQy5yZWxlYXNlKCk7Ci0JCQlyZXR1cm4gaW5Vc2U7Ci0JCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGExMGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci0KLS8qKgotICogVGhlIGVudHJpZXMgaW4gdGhpcyByZWdpc3RyeSBhcmUsIGNvbmNlcHR1YWxseSwgc2luZ2xldG9uJ3MgU2luY2Ugb25seSBvbmUKLSAqIGluc3RhbmNlIGlzIGNyZWF0ZWQgaW4gdGhlIHJlZ2lzdHJ5LCBhbmQgdGhlbiB0aGF0IGluc3RhbmNlIHJldHVybmVkIHdoZW4KLSAqIHJlcXVpcmVkLgotICogCi0gKiBOb3RlIHRoYXQgdGhlcmUgaXMgaW50ZW50aW9uYWxseSBubyAncmVtb3ZlJyBtZXRob2QsIFNpbmNlIHRoZSByZWdpc3RyeQotICogaXRzZWxmIGlzIHJlYWQgaXQgd2hlbiBvbmNlLCBmcm9tIHRoZSBwbGF0Zm9ybSdzIHBsdWdpbiByZWdpc3RyeSwgYW5kIGlzCi0gKiBub3QgaW50ZW5kZWQgdG8gYmUgbW9kaWZpZWQgYWZ0ZXIgdGhhdC4gQSBjaGFuZ2UgaW4gYW4gZXh0ZW5zdGlvbiBpbiBhCi0gKiBwbHVnaW4ueG1sIHdpbGwgb25seSB0YWtlIGVmZmVjdCB3aGVuIHRoZSB3b3JrYmVuY2ggaXMgcmUtc3RhcnRlZC4KLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gcmV0dXJuIHRoZSBzcGVjaWZpYyB0eXBlIGZvciB0aGUgc3BlY2lmaWMgbWltZXR5cGUuCi0JICovCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0VHlwZUZvcihTdHJpbmcgbWltZVR5cGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWE4OTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgc3RhdGljIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaFNldCBoYXNoU2V0ID0gbnVsbDsKLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgcmVnaXN0cnlEZWZhdWx0SGFuZGxlciA9IG51bGw7Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudFR5cGVSZWdpc3RyeSNnZXRUeXBlRm9yKFN0cmluZykKLQkgKi8KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29udGVudFR5cGVSZWdpc3RyeUltcGwuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWhhc2hTZXQgPSBuZXcgSGFzaFNldCgpOwotCQluZXcgRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoaGFzaFNldCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50VHlwZVJlZ2lzdHJ5I2FkZChDb250ZW50VHlwZURlc2NyaXB0aW9uKQotCSAqLwotCXZvaWQgYWRkKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJaGFzaFNldC5hZGQoY29udGVudFR5cGVEZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRUeXBlRm9yKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRSZWdpc3RyeURlZmF1bHQuIFdlIGNhY2hlIHRoZSBkZWZhdWx0IGhhbmRsZXIsIHNpbmNlIGNhbid0Ci0JICogY2hhbmdlIG9uY2UgcGx1Z2luIGRlc2NyaXB0b3JzIGFyZSBsb2FkZWQuCi0JICogCi0JICogQHJldHVybiBFbWJlZGRlZFR5cGVIYW5kbGVyCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldFJlZ2lzdHJ5RGVmYXVsdCgpIHsKLQkJaWYgKHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBoYXNoU2V0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoKHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgJiYgKGl0Lmhhc05leHQoKSkpIHsgLy8gc2FmZQotCQkJCS8vIGNhc3QKLQkJCQkvLyBzaW5jZQotCQkJCS8vICdhZGQnCi0JCQkJLy8gcmVxdWlyZXMKLQkJCQkvLyBFbWJlZGRlZENvbnRlbnRUeXBlRGVzY3JpcHRpb24KLQkJCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGl0ZW0gPSAoRW1iZWRkZWRUeXBlSGFuZGxlcikgaXQubmV4dCgpOwotCQkJCWlmICgoaXRlbSAhPSBudWxsKSAmJiAoaXRlbS5pc0RlZmF1bHQoKSkpIHsKLQkJCQkJcmVnaXN0cnlEZWZhdWx0SGFuZGxlciA9IGl0ZW07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVnaXN0cnlEZWZhdWx0SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgY29udGVudFR5cGVEZXNjcmlwdGlvbiBiYXNlZCBvbiBsaXRlcmFsIGlkLiBJdHMgYmFzaWNhbGx5IGEKLQkgKiAiZmlyc3QgZm91bmQgZmlyc3QgcmV0dXJuZWQiLiBOb3RlIHRoZSBvcmRlciBpcyBmYWlybHkgdW5wcmVkaWN0YWJsZSwKLQkgKiBzbyBub24tdW5pcXVlIGlkcyB3b3VsZCBjYXVzZSBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRUeXBlRm9yKFN0cmluZyBtaW1lVHlwZSkgewotCQkvLyBOb3RlOiB0aGUgcmVhc29uIHdlIGhhdmUgdGhpcyBwcmVjb25kaXRpb24gaXMgdGhhdCB0aGUKLQkJLy8gZGVmYXVsdCBpcyBkaWZmZXJlbnQgaW5zaWRlIHRoZSByZWdpc3RyeSB0aGFuIHdoZW4gY2FsbGVkLAotCQkvLyBmb3IgZXhhbXBsZSwgZnJvbSB0aGUgSlNQTG9hZGVyLiBGb3IgdGhlIEpTUExvYWRlciwgaWYgdGhlcmUKLQkJLy8gaXMgbm8gbWltZXR5cGUsIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBIVE1MLiBIZXJlLCBpZiB0aGVyZSBpcwotCQkvLyBzb21lIG1pbWV0eXBlLCBidXQgaXQgaXMgbm90IHJlY29nbml6ZWQsIHdlIHJldHVybiBhIGRlZmF1bHQKLQkJLy8gZm9yIFhNTC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgdmFyaW91cyB2b2ljZSB4bWwgdHlwZXMsIGV0Yy4KLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBmb3VuZCA9IG51bGw7Ci0JCWlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmb3VuZCA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfSBlbHNlIHsKLQkJCUl0ZXJhdG9yIGl0ID0gaGFzaFNldC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKChmb3VuZCA9PSBudWxsKSAmJiAoaXQuaGFzTmV4dCgpKSkgeyAvLyBzYWZlIGNhc3Qgc2luY2UKLQkJCQkvLyAnYWRkJyByZXF1aXJlcwotCQkJCS8vIEVtYmVkZGVkQ29udGVudFR5cGVEZXNjcmlwdGlvbgotCQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgaXRlbSA9IChFbWJlZGRlZFR5cGVIYW5kbGVyKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChpdGVtICE9IG51bGwpICYmIChpdGVtLmdldFN1cHBvcnRlZE1pbWVUeXBlcygpLmNvbnRhaW5zKG1pbWVUeXBlKSkpIHsKLQkJCQkJZm91bmQgPSBpdGVtOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiBubyBleGFjdCBtYXRjaCwgZG8gdGhlICJsb29zZXIiIGNoZWNrCi0JCQlpZihmb3VuZCA9PSBudWxsKSB7Ci0JCQkJaXQgPSBoYXNoU2V0Lml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKChmb3VuZCA9PSBudWxsKSAmJiAoaXQuaGFzTmV4dCgpKSkgeyAKLQkJCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBpdGVtID0gKEVtYmVkZGVkVHlwZUhhbmRsZXIpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKChpdGVtICE9IG51bGwpICYmIChpdGVtLmNhbkhhbmRsZU1pbWVUeXBlKG1pbWVUeXBlKSkpIHsKLQkJCQkJCWZvdW5kID0gaXRlbTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIG5vIG1hdGNoZXMsIHVzZSBkZWZhdWx0Ci0JCWlmIChmb3VuZCA9PSBudWxsKSB7Ci0JCQlmb3VuZCA9IGdldFJlZ2lzdHJ5RGVmYXVsdCgpOwotCQl9Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OThmN2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIgewotCXByb3RlY3RlZCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImVtYmVkZGVkVHlwZUhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQotCXByb3RlY3RlZCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIFRBR19OQU1FID0gImVtYmVkZGVkVHlwZUhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlFbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW1iZWRkZWRUeXBlSGFuZGxlciByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbiA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRlbnRUeXBlRGVzY3JpcHRpb24gPSAoRW1iZWRkZWRUeXBlSGFuZGxlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZW50VHlwZURlc2NyaXB0aW9uLCAiRXJyb3IgcmVhZGluZyBjb250ZW50IHR5cGUgZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29udGVudFR5cGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBXZSBzaW1wbHkgcmVxdWlyZSBhbiAnYWRkJyBtZXRob2QsIG9mIHdoYXQgZXZlciBpdCBpcyB3ZSBhcmUgdG8gcmVhZAotCSAqIGludG8KLQkgKi8KLQl2b2lkIHJlYWRSZWdpc3RyeShTZXQgc2V0KSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZENvbnRlbnRUeXBlID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCS8vIG51bGwgY2FuIGJlIHJldHVybmVkIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyB0aGUKLQkJCQkvLyBlbGVtZW50Ci0JCQkJaWYgKGVtYmVkZGVkQ29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCQlzZXQuYWRkKGVtYmVkZGVkQ29udGVudFR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjgzZGVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJSZWdpc3RyeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgaW5zdGFuY2UgPSBudWxsOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfREVGQVVMVF9FWFRFTlNJT04gPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgTW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGRlZmF1bHRIYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlcigpOwotCi0JcHJpdmF0ZSBNb2RlbEhhbmRsZXJSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJcmVhZGVyID0gbmV3IE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyKCkucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGRlZmF1bHQgbW9kZWwgaGFuZGxlci4gTm90ZTogd2Ugc3RpbGwgZ28gdGhyb3VnaCB0aGUgcmVnaXN0cnkKLQkgKiB0byBiZSBzdXJlIHRvIGdldCB0aGUgZXhpc3RpbmcgaW5zdGFuY2UsIGJ1dCB0aGVuIHdlIGRvIHJlbWVtYmVyIGl0LCBzbwotCSAqIHN1YnNlcXVlbnQgcmVxdWVzdHMgd2lsbCBiZSBmYXN0ZXIuIFRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHdlIGRvIGNoZWNrCi0JICogdGhlIHdob2xlIGxpc3QsIHRvIGJlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUuCi0JICogCi0JICovCi0JZmluYWwgcHVibGljIElNb2RlbEhhbmRsZXIgZ2V0RGVmYXVsdCgpIHsKLQkJaWYgKGRlZmF1bHRIYW5kbGVyID09IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVhZGVyLmVsZW1lbnRzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWJvb2xlYW4gb2ZJbnRlcmVzdCA9IHJlYWRlci5pc0VsZW1lbnREZWZhdWx0KGVsZW1lbnRzW2ldKTsKLQkJCQlpZiAob2ZJbnRlcmVzdCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiwgaGVyZSB3aXRoaW4gdGhlIHNlYXJjaCBsb29wIHdlJ3ZlIGFscmVhZHkgZm91bmQgb25lCi0JCQkJCSAqIGRlZmF1bHRIYW5kbGVyLCB0aGVuIHNvbWV0aGluZyBpcyB3cm9uZyEKLQkJCQkJICovCi0JCQkJCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlkZWZhdWx0SGFuZGxlciA9IHJlYWRlci5nZXRJbnN0YW5jZShlbGVtZW50c1tpXSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSAiUHJvZ3JhbSBvciBjb25maWd1cmF0aW9uIGVycm9yLiBNb3JlIHRoYW4gb25lIGRlZmF1bHQgY29udGVudCBoYW5kbGVyIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIGVycm9yU3RyaW5nKTsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXJyb3JTdHJpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWZhdWx0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSAiUHJvZ3JhbSBvciBjb25maWd1cmF0aW9uIGVycm9yLiBObyBkZWZhdWx0IGNvbnRlbnQgdHlwZSBoYW5kbGVyIGZvdW5kLiI7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBlcnJvclN0cmluZyk7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSBNb2RlbEhhbmRsZXIgYmFzZWQgb24gbGl0ZXJhbCBleHRlbnNpb24gaWQuIEl0J3MgYmFzaWNhbGx5IGEKLQkgKiAiZmlyc3QgZm91bmQgZmlyc3QgcmV0dXJuZWQiLiBObyBzcGVjaWZpYyBvcmRlciBpcyBndWFyYW50ZWVkIGFuZCB0aGUKLQkgKiB1bmlxdWVuZXNzIG9mIElEcyBpcyBub3QgY29uc2lkZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uSWQKLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBleHRlbnNpb24sIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgZ2V0SGFuZGxlckV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uSWQpIHsKLQkJSU1vZGVsSGFuZGxlciBmb3VuZCA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVhZGVyLmVsZW1lbnRzOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBjdXJyZW50SWQgPSByZWFkZXIuZ2V0SWQoZWxlbWVudHNbaV0pOwotCQkJCWlmIChleHRlbnNpb25JZC5lcXVhbHMoY3VycmVudElkKSkgewotCQkJCQlJTW9kZWxIYW5kbGVyIGl0ZW0gPSByZWFkZXIuZ2V0SW5zdGFuY2UoZWxlbWVudHNbaV0pOwotCQkJCQlmb3VuZCA9IGl0ZW07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKExvZ2dlci5ERUJVRyl7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGhlcmUgd2VyZSBubyBNb2RlbCBIYW5kbGVyIGZvdW5kIGluIHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBuYW1lZCBmaWxlJ3MgY29udGVudAotCSAqIHR5cGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIFRoZSBJTW9kZWxIYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGdpdmVuCi0JICogICAgICAgICBmaWxlLiBJZiBhbiBleGFjdCBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBtb3N0LXNwZWNpZmljIG1hdGNoCi0JICogICAgICAgICBhY2NvcmRpbmcgdG8gSUNvbnRlbnRUeXBlLmlzS2luZE9mKCkgd2lsbCBiZSByZXR1cm5lZC4gSWYgbm9uZQotCSAqICAgICAgICAgYXJlIGZvdW5kLCBlaXRoZXIgYSBkZWZhdWx0IG9yIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSU1vZGVsSGFuZGxlciBnZXRIYW5kbGVyRm9yKElGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSBudWxsOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCWJvb2xlYW4gYWNjZXNzaWJsZSA9IGZpbGUuaXNBY2Nlc3NpYmxlKCk7Ci0JCWlmIChhY2Nlc3NpYmxlKSB7Ci0JCQkvKiBUcnkgdGhlIG9wdGltaXplZCBtZXRob2QgZmlyc3QgYXMgdGhlIGRlc2NyaXB0aW9uIG1heSBiZSBjYWNoZWQgKi8KLQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkvLyB1c2UgdGhlIHByb3ZpZGVkIGRlc2NyaXB0aW9uCi0JCQkJY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIHVzZSB0aGUgbW9yZSB0aG9yb3VnaCBkaXNjb3ZlcnkgbWV0aG9kIHRvIGdldCBhIGRlc2NyaXB0aW9uICovCi0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJCQkJY29udGVudERlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoY29udGVudHMsIGZpbGUuZ2V0TmFtZSgpLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3RoaW5nIGZ1cnRoZXIgY2FuIGJlIGRvbmUsIGJ1dCB3aWxsIGxvZyBmb3IgZGVidWdnaW5nCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJLy8gbm90aGluZyBjYW4gYmUgZG9uZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogSWYgd2UgY291bGRuJ3QgZ2V0IHRoZSBjb250ZW50IHR5cGUgZnJvbSBhIGRlc2NyaXB0aW9uLCB0cnkgYmFzaW5nCi0JCSAqIGl0IG9uIGp1c3QgdGhlIGZpbGVuYW1lCi0JCSAqLwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoZmlsZS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCW1vZGVsSGFuZGxlciA9IGdldEhhbmRsZXJGb3JDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBoYXJkIGNvZGluZyBmb3IgbnVsbCBjb250ZW50IHR5cGUKLQkJCW1vZGVsSGFuZGxlciA9IGdldEhhbmRsZXJFeHRlbnNpb24oSU5URVJOQUxfREVGQVVMVF9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gbW9kZWxIYW5kbGVyOwotCX0KLQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBuYW1lZCBJbnB1dFN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXROYW1lCi0JICogQHBhcmFtIGlucHV0U3RyZWFtCi0JICogQHJldHVybiBUaGUgSU1vZGVsSGFuZGxlciByZWdpc3RlcmVkIGZvciB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBnaXZlbgotCSAqICAgICAgICAgaW5wdXQuIElmIGFuIGV4YWN0IG1hdGNoIGlzIG5vdCBmb3VuZCwgdGhlIG1vc3Qtc3BlY2lmaWMgbWF0Y2gKLQkgKiAgICAgICAgIGFjY29yZGluZyB0byBJQ29udGVudFR5cGUuaXNLaW5kT2YoKSB3aWxsIGJlIHJldHVybmVkLiBJZiBub25lCi0JICogICAgICAgICBhcmUgZm91bmQsIGVpdGhlciBhIGRlZmF1bHQgb3IgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSU1vZGVsSGFuZGxlciBnZXRIYW5kbGVyRm9yKFN0cmluZyBpbnB1dE5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpU3RyZWFtID0gVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pOwotCQlJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlciA9IG51bGw7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQkJCWNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKFV0aWxpdGllcy5nZXRMaW1pdGVkU3RyZWFtKGlTdHJlYW0pLCBpbnB1dE5hbWUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGlTdHJlYW0gIT0gbnVsbCAmJiBpU3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJCQlpU3RyZWFtLnJlc2V0KCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGlucHV0TmFtZSk7Ci0JCX0KLQkJLy8gaWYgYWxsIGVsc2UgZmFpbGVkLCB0cnkgdG8gZGV0ZWN0IHNvbGVseSBvbiBjb250ZW50czsgZG9uZSBsYXN0IGZvcgotCQkvLyBwZXJmb3JtYW5jZSByZWFzb25zCi0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihVdGlsaXRpZXMuZ2V0TGltaXRlZFN0cmVhbShpU3RyZWFtKSwgbnVsbCk7Ci0JCX0KLQkJbW9kZWxIYW5kbGVyID0gZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQkJcmV0dXJuIG1vZGVsSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgcmVnaXN0ZXJlZCBJTW9kZWxIYW5kbGVyIGZvciBhIGdpdmVuIElDb250ZW50VHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuIFRoZSBJTW9kZWxIYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjb250ZW50IHR5cGUuIElmIGFuCi0JICogICAgICAgICBleGFjdCBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBtb3N0LXNwZWNpZmljIG1hdGNoIGFjY29yZGluZyB0bwotCSAqICAgICAgICAgSUNvbnRlbnRUeXBlLmlzS2luZE9mKCkgd2lsbCBiZSByZXR1cm5lZC4gSWYgbm9uZSBhcmUgZm91bmQsCi0JICogICAgICAgICBlaXRoZXIgYSBkZWZhdWx0IG9yIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGV4YWN0Q29udGVudFR5cGVFbGVtZW50ID0gbnVsbDsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBraW5kT2ZDb250ZW50VHlwZUVsZW1lbnQgPSBudWxsOwotCQkJaW50IGtpbmRPZkNvbnRlbnRUeXBlRGVwdGggPSAwOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWFkZXIuZWxlbWVudHM7Ci0JCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoICYmIGV4YWN0Q29udGVudFR5cGVFbGVtZW50ID09IG51bGw7IGkrKykgewotCQkJCQlTdHJpbmcgY3VycmVudElkID0gcmVhZGVyLmdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKGVsZW1lbnRzW2ldKTsKLQkJCQkJSUNvbnRlbnRUeXBlIGFzc29jaWF0ZWRDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGN1cnJlbnRJZCk7Ci0JCQkJCWlmIChjb250ZW50VHlwZS5lcXVhbHMoYXNzb2NpYXRlZENvbnRlbnRUeXBlKSkgewotCQkJCQkJZXhhY3RDb250ZW50VHlwZUVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjb250ZW50VHlwZS5pc0tpbmRPZihhc3NvY2lhdGVkQ29udGVudFR5cGUpKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogVXBkYXRlIHRoZSBraW5kT2ZFbGVtZW50IHZhcmlhYmxlIG9ubHkgaWYgdGhpcwotCQkJCQkJICogZWxlbWVudCdzIGNvbnRlbnQgdHlwZSBpcyAiZGVlcGVyIiAoZGVwdGggdGVzdAotCQkJCQkJICogZW5zdXJlcyB0aGUgZmlyc3QgY29udGVudCB0eXBlIGlzIHJlbWVtYmVyZWQpCi0JCQkJCQkgKi8KLQkJCQkJCUlDb250ZW50VHlwZSB0ZXN0Q29udGVudFR5cGUgPSBhc3NvY2lhdGVkQ29udGVudFR5cGU7Ci0JCQkJCQlpbnQgdGVzdERlcHRoID0gMDsKLQkJCQkJCXdoaWxlICh0ZXN0Q29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCQkJCXRlc3REZXB0aCsrOwotCQkJCQkJCXRlc3RDb250ZW50VHlwZSA9IHRlc3RDb250ZW50VHlwZS5nZXRCYXNlVHlwZSgpOwotCQkJCQkJfQotCQkJCQkJaWYgKHRlc3REZXB0aCA+IGtpbmRPZkNvbnRlbnRUeXBlRGVwdGgpIHsKLQkJCQkJCQlraW5kT2ZDb250ZW50VHlwZUVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQkJCQlraW5kT2ZDb250ZW50VHlwZURlcHRoID0gdGVzdERlcHRoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoTG9nZ2VyLkRFQlVHKXsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGhlcmUgd2VyZSBubyBNb2RlbCBIYW5kbGVyIGZvdW5kIGluIHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChleGFjdENvbnRlbnRUeXBlRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaGFuZGxlciA9IHJlYWRlci5nZXRJbnN0YW5jZShleGFjdENvbnRlbnRUeXBlRWxlbWVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChraW5kT2ZDb250ZW50VHlwZUVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWhhbmRsZXIgPSByZWFkZXIuZ2V0SW5zdGFuY2Uoa2luZE9mQ29udGVudFR5cGVFbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWlmIChoYW5kbGVyID09IG51bGwpIHsKLQkJCS8vIHRlbXAgaGFyZCBjb2RpbmcgZm9yIG51bGwgY29udGVudCB0eXBlIGFyZ3VtZW50cwotCQkJaGFuZGxlciA9IGdldEhhbmRsZXJFeHRlbnNpb24oSU5URVJOQUxfREVGQVVMVF9FWFRFTlNJT04pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHJlZ2lzdGVyZWQgSU1vZGVsSGFuZGxlciBmb3IgYSBnaXZlbiBjb250ZW50IHR5cGUgSUQuIE5vCi0JICogc3BlY2lmaWMgb3JkZXIgaXMgZ3VhcmFudGVlZCBhbmQgdGhlIHVuaXF1ZW5lc3Mgb2YgSURzIGlzIG5vdAotCSAqIGNvbnNpZGVyZWQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiBUaGUgSU1vZGVsSGFuZGxlciByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlIElELiBJZgotCSAqICAgICAgICAgYW4gZXhhY3QgbWF0Y2ggaXMgbm90IGZvdW5kLCB0aGUgbW9zdC1zcGVjaWZpYyBtYXRjaCBhY2NvcmRpbmcKLQkgKiAgICAgICAgIHRvIElDb250ZW50VHlwZS5pc0tpbmRPZigpIHdpbGwgYmUgcmV0dXJuZWQuIElmIG5vbmUgYXJlIGZvdW5kLAotCSAqICAgICAgICAgZWl0aGVyIGEgZGVmYXVsdCBvciBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIElNb2RlbEhhbmRsZXIgZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZCk7Ci0JCXJldHVybiBnZXRIYW5kbGVyRm9yQ29udGVudFR5cGUoY29udGVudFR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmQ2MTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBqdXN0IGNvbnZlcnRzIHdoYXQncyBpbiB0aGUgcGx1Z2lucyByZWdpc3RyeSBpbnRvIGEgZm9ybSBtb3JlCi0gKiBlYXNpbHkgdXNlYWJsZSBieSBvdGhlcnMsIHRoZSBDb250ZW50VHlwZVJlZ2lzdHJ5LgotICovCi1jbGFzcyBNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlciB7Ci0JcHJpdmF0ZSBIYXNoTWFwIGFsbFJlYWR5Q3JlYXRlSW5zdGFuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIEFUVF9BU1NPQ0lBVEVEX0NPTlRFTlRfVFlQRSA9ICJhc3NvY2lhdGVkQ29udGVudFR5cGVJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIEFUVF9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHM7Ci0JcHJvdGVjdGVkIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAibW9kZWxIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCS8vCi0JcHJvdGVjdGVkIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgVEFHX05BTUUgPSAibW9kZWxIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8KLQkvKioKLQkgKiBDb250ZW50VHlwZVJlZ2lzdHJ5UmVhZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JU3RyaW5nIGdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9BU1NPQ0lBVEVEX0NPTlRFTlRfVFlQRSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0SWQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGlkVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlyZXR1cm4gaWRWYWx1ZTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgSU1vZGVsSGFuZGxlciBnZXRJbnN0YW5jZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBNYXkgbmVlZCB0byByZWNvbnNpZGVyLCBidXQgZm9yIG5vdywgd2UnbGwgYXNzdW1lIGFsbCBjbGllbnRzIG11c3QKLQkJLy8gc3ViY2xhc3MgQWJzdHJhY3RDb250ZW50VHlwZUlkZW50aWZpZXIuIEl0cyBlYXNpZXIgYW5kIHNhZmVyLCBmb3IKLQkJLy8gdGhpcwotCQkvLyBsb3cgbGV2ZWwgInN5c3RlbSIgb2JqZWN0LiAoVGhhdCBpcywgd2UgY2FuIGNoZWNrIGFuZCBzZXQgInBhY2thZ2UKLQkJLy8gcHJvdGVjdGVkIgotCQkvLyBhdHRyaWJ1dGVzLgotCQlBYnN0cmFjdE1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSAoQWJzdHJhY3RNb2RlbEhhbmRsZXIpIGFsbFJlYWR5Q3JlYXRlSW5zdGFuY2VzLmdldChnZXRJZChlbGVtZW50KSk7Ci0JCWlmIChtb2RlbEhhbmRsZXIgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbEhhbmRsZXIgPSAoQWJzdHJhY3RNb2RlbEhhbmRsZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQkJCWlmIChtb2RlbEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQlhbGxSZWFkeUNyZWF0ZUluc3RhbmNlcy5wdXQoZ2V0SWQoZWxlbWVudCksIG1vZGVsSGFuZGxlcik7Ci0JCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREVGQVVMVCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1vZGVsSGFuZGxlci5zZXREZWZhdWx0KHRydWUpOwotCQkJCQllbHNlCi0JCQkJCQltb2RlbEhhbmRsZXIuc2V0RGVmYXVsdChmYWxzZSk7Ci0JCQkJCS8vIFRPRE8gLS0gc2V0IGFuZCBjaGVjayBhdHRyaWJ1dGVzIHZzLiBjcmVhdGVkIGluc3RhbmNlCi0JCQkJCS8vY29udGVudFR5cGVJZGVudGlmaWVyLnNldE9yQ2hlY2tJZChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudERlZmF1bHQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERUZBVUxUKTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHMoZGVmYXVsdFZhbHVlKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlciByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCS8vIGp1c3QgcmVtZW1iZXIgdGhlIGVsZW1lbnRzLCBzbyBwbHVnaW5zIGRvbid0IGhhdmUgdG8KLQkJCS8vIGJlIGFjdGl2YXRlZCwgdW5sZXNzIGV4dGVuc2lvbiBtYXRjaGVzIHRob3NlICJvZiBpbnRlcmVzdCIuCi0JCQllbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiMmE0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci0KLS8qKgotICogCi0gKiBMaWtlbHkgYSB0ZW1wb3JhcnkgY2xhc3MgdG8gYmUgcmVwbGFjZWQgYnkgcGx1Z2luLCBldmVudHVhbGx5LgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyVXRpbGl0eSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBNb2RlbEhhbmRsZXJSZWdpc3RyeSBjb250ZW50VHlwZVJlZ2lzdHJ5OwotCi0JcHVibGljIHN0YXRpYyBJRG9jdW1lbnRUeXBlSGFuZGxlciBnZXRDb250ZW50VHlwZUZvcihTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBnZXRDb250ZW50VHlwZVJlZ2lzdHJ5KCkuZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoc3RyaW5nKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNb2RlbEhhbmRsZXJSZWdpc3RyeSBnZXRDb250ZW50VHlwZVJlZ2lzdHJ5KCkgewotCQlpZiAoY29udGVudFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQljb250ZW50VHlwZVJlZ2lzdHJ5ID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gY29udGVudFR5cGVSZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RGVmYXVsdEVtYmVkZGVkVHlwZSgpIHsKLQkJcmV0dXJuIGdldEVtYmVkZGVkQ29udGVudFR5cGVGb3IoInRleHQvaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkQ29udGVudFR5cGVGb3IoU3RyaW5nIHN0cmluZykgewotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGluc3RhbmNlID0gbnVsbDsKLQkJaW5zdGFuY2UgPSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRm9yKHN0cmluZyk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyVXRpbGl0eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9QbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1BsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDJlMmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1BsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIAotICogQ2xpZW50cyBjYW4gbWFrZSB1c2Ugb2YgSUV4ZWN1dGFibGVFeHRlbnNpb24gdG8gaGFuZGxlIHRoZSBvcHRpb25hbCBhZGFwdGVyCi0gKiBjbGFzcyBhbmQga2V5LiBUeXBpY2FsbHksIG1hbnkgY2xpZW50cyB1c2UgYSB0eXBpY2FsIHBhdHRlcm4gb2YgcHJvdmlkaW5nCi0gKiBhbiBhZGFwdGVyIGNsYXNzIGFuZCBrZXkgaW4gdGhlaXIgbnVsbCBhcmd1bWVudCBjb25zdHJ1Y3RvciBhbnl3YXksIHNvCi0gKiB0aGV5J2Qgb25seSBoYXZlIHRvIHVzZSBJRXhlY3V0YWJsZUV4dGVuc2lvbiBpZiB0aGUgZmFjdG9yeSB3YXMgZm9yIG1vcmUKLSAqIHRoYW4gb25lLgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyIHsKLQkvLwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQURBUFRFUktFWSA9ICJhZGFwdGVyS2V5Q2xhc3MiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLwlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfUkVHSVNURVJBREFQVEVSID0gInJlZ2lzdGVyQWRhcHRlcnMiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKHJlYWRlciA9PSBudWxsKSB7Ci0JCQlyZWFkZXIgPSBuZXcgUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0NPTlRFTlRUWVBFID0gImNvbnRlbnRUeXBlSWRlbnRpZmVySWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJmYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoSURvY3VtZW50VHlwZUhhbmRsZXIgaGFuZGxlcikgewotCQlyZXR1cm4gbG9hZFJlZ2lzdHJ5KGhhbmRsZXIuZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBsb2FkUmVnaXN0cnkodHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlckZhY3RvcnkgbG9hZEZhY3RvcnlGcm9tQ29uZmlndXJhdGlvbkVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIE9iamVjdCByZXF1ZXN0ZXJUeXBlKSB7Ci0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlTdHJpbmcgY29udGVudFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NPTlRFTlRUWVBFKTsKLQkJCWlmICghcmVxdWVzdGVyVHlwZS5lcXVhbHMoY29udGVudFR5cGUpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQ0xBU1MpOwotCQkJLy8JCQlTdHJpbmcgYWRhcHRlcktleUNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9BREFQVEVSS0VZKTsKLQkJCS8vCQkJU3RyaW5nIHJlZ2lzdGVyQWRhcHRlcnMgPQotCQkJLy8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9SRUdJU1RFUkFEQVBURVIpOwotCi0JCQkvLyBpZiBjbGFzc05hbWUgaXMgbnVsbCwgdGhlbiBubyBvbmUgZGVmaW5lZCB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0JCQkvLyBmb3IgYWRhcHRlciBmYWN0b3JpZXMKLQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfQ0xBU1MpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZiBhbiBlcnJvciBvY2N1cnMgaGVyZSwgaXRzIHByb2JhYmx5IHRoYXQgdGhlIHBsdWdpbgotCQkJCQkvLyBjb3VsZCBub3QgYmUgZm91bmQvbG9hZGVkCi0JCQkJCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBjbGFzczogIiArIGNsYXNzTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZiBhbiBlcnJvciBvY2N1cnMgaGVyZSwgaXRzIHByb2JhYmx5IHRoYXQgdGhlIHBsdWdpbgotCQkJCQkvLyBjb3VsZCBub3QgYmUgZm91bmQvbG9hZGVkIC0tIGJ1dCBpbiBhbnkgY2FzZSB3ZSBqdXN0Ci0JCQkJCS8vIHdhbnQKLQkJCQkJLy8gdG8gbG9nIHRoZSBlcnJvciBhbmQgY29udGludWUgcnVubmluZyBhbmQgYmVzdCB3ZSBjYW4uCi0JCQkJCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXIubG9nRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBjbGFzczogIiArIGNsYXNzTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8JCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJLy8JCQkJCWZhY3RvcnkgPSBvbGRBdHRyaWJ1dGVzQ29kZShlbGVtZW50LCBmYWN0b3J5LCBjbGFzc05hbWUsCi0JCQkJLy8gcGx1Z2luKTsKLQkJCQkvLwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgbG9hZFJlZ2lzdHJ5KE9iamVjdCBjb250ZW50VHlwZSkgewotCQlMaXN0IGZhY3RvcnlMaXN0ID0gbnVsbDsgLy8gbmV3IFZlY3RvcigpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChTU0VDb3JlUGx1Z2luLklELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJLy8gdGhpcyBpcyBjYWxsZWQgYSBsb3QsIHNvIGRvbid0IGNyZWF0ZSB2ZWN0b3IgdW5sZXNzIHJlYWxseQotCQkJCS8vIG5lZWRlZAotCQkJCS8vIFRPRE86IGNvdWxkIGV2ZW50dWFsbHkgY2FjaGUgaW4gYSBoYXNodGFibGUsIG9yIHNvbWV0aGluZywKLQkJCQkvLyB0byBhdm9pZCByZXBlYXQgcHJvY2Vzc2luZwotCQkJCWZhY3RvcnlMaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbG9hZEZhY3RvcnlGcm9tQ29uZmlndXJhdGlvbkVsZW1lbnQoZWxlbWVudHNbaV0sIGNvbnRlbnRUeXBlKTsKLQkJCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCQkJCWZhY3RvcnlMaXN0LmFkZChmYWN0b3J5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY3RvcnlMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhYWZkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogUmVnaW9ucyBvZiB0aGlzIGNsYXNzIGFyZSBpbnRlbmRlZCBzcGVjaWZpY2FsbHkgZm9yIFhNTC9IVE1ML0pTUHMuIE90aGVyCi0gKiBsYW5ndWFnZXMgbWF5IG5lZWQgdGhlaXIgb3duIHN1YmNsYXNzZXMuIChTZWUgdGhlIHVwZGF0ZU1vZGVsIG1ldGhvZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0UmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXByb3RlY3RlZCBpbnQgZkxlbmd0aDsKLQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0OwotCXByb3RlY3RlZCBpbnQgZlRleHRMZW5ndGg7Ci0JcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLQotCXByb3RlY3RlZCBDb250ZXh0UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb250ZXh0UmVnaW9uKFN0cmluZyBuZXdDb250ZXh0LCBpbnQgbmV3U3RhcnQsIGludCBuZXdUZXh0TGVuZ3RoLCBpbnQgbmV3TGVuZ3RoKSB7Ci0JCWZUeXBlID0gbmV3Q29udGV4dDsKLQkJZlN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gbmV3VGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IG5ld0xlbmd0aDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JYm9vbGVhbiBhbGxMZXR0ZXJPckRpZ2l0KFN0cmluZyBjaGFuZ2VzKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aCgpOyBpKyspIHsKLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2hlY2sgdGhhdCBhIEphdmEgTGV0dGVyIG9yIERpZ2l0IGlzCi0JCQkvLyB0aGUgc2FtZSB0aGluZyBhcyBhbiBYTUwgbGV0dGVyIG9yIGRpZ2l0Ci0JCQlpZiAoIShDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoYW5nZXMuY2hhckF0KGkpKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWJvb2xlYW4gYWxsV2hpdGVTcGFjZShTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhbmdlcy5jaGFyQXQoaSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWJvb2xlYW4gY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSBub24td2hpdGUgc3BhY2UgYXJlYQotCQlpZiAoKHJlcXVlc3RTdGFydCA8PSAoZ2V0VGV4dEVuZCgpKSkgJiYgKGFsbExldHRlck9yRGlnaXQoY2hhbmdlcykpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JYm9vbGVhbiBjYW5IYW5kbGVBc1doaXRlU3BhY2UoU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgd2UgYXJlIGluIHRoZSAid2hpdGUgc3BhY2UiIGFyZWEgb2YgYSByZWdpb24sIHRoZW4KLQkJLy8gd2UgZG9uJ3Qgd2FudCB0byBoYW5kbGUsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCS8vIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24gaXMgY29uc2lkZXIgYW55d2hlcmUgdGhhdCB3b3VsZAotCQkvLyBsZWF2ZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhpcyBjaGFyYWN0ZXIgYW5kIHRoZSB0ZXh0IHBhcnQuCi0JCS8vIGFuZCBvZiBjb3Vyc2UsIHdlIGNhbiBpbnNlcnQgd2hpdGVzcGFjZSBpbiB3aGl0ZXNwYWNlIHJlZ2lvbgotCQkvLwotCQkvLyBpZiB0aGVyZSBpcyBubyB3aGl0ZXNwYWNlIGluIHRoaXMgcmVnaW9uLCBubyBuZWVkIHRvIGxvb2sgZnVydGhlcgotCQlpZiAoZ2V0RW5kKCkgPiBnZXRUZXh0RW5kKCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gYWRkIG9uZSB0byBlbmQgb2YgdGV4dCwgYXMgd2UgdXNlZCB0bywgc2luY2Ugd2UKLQkJCS8vIGNoYW5nZSBkZWZpbml0aW9uIG9mIGxlbmd0aCB0byBlcXVhdGUgdG8gb2Zmc2V0IHBsdXMgb25lLgotCQkJaWYgKHJlcXVlc3RTdGFydCA+IGdldFRleHRFbmQoKSkgewotCQkJCS8vIG9rLCB3ZSBhcmUgaW4gdGhlIHdoaXRlc3BhY2UgcmVnaW9uLCBzbyB3ZSBjYW4ndCBoYW5kbGUsCi0JCQkJLy8gdW5sZXNzCi0JCQkJLy8gd2UgYXJlIGp1c3QgaW5zZXJ0aW5nIHdoaXRlc3BhY2UuCi0JCQkJaWYgKGFsbFdoaXRlU3BhY2UoY2hhbmdlcykpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgcG9zaXRpb24pIHsKLQotCQlyZXR1cm4gZlN0YXJ0IDw9IHBvc2l0aW9uICYmIHBvc2l0aW9uIDwgZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgaSkgewotCQlmU3RhcnQgPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHN0cmluZykgewotCQlmVHlwZSA9IHN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gc2hvcnRDbGFzc05hbWUgKyAiLS0+ICIgKyBnZXRUeXBlKCkgKyAiOiAiICsgZ2V0U3RhcnQoKSArICItIiArIGdldFRleHRFbmQoKSArIChnZXRUZXh0RW5kKCkgIT0gZ2V0RW5kKCkgPyAoIi8iICsgZ2V0RW5kKCkpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJLy8gTk9URTogaWYgdGhlIGRvY3VtZW50IGhlbGQgYnkgYW55IHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGFuZCB0aGUKLQkJLy8gcmVnaW9uIG9mZnNldHMgaGF2ZSBub3QKLQkJLy8geWV0IGJlZW4gdXBkYXRlZCwgdGhlIG91dHB1dCBmcm9tIHRoaXMgbWV0aG9kIGludmFsaWQuCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gdGhlIGZvdXIgdHlwZXMgd2UgdXNlZCB0byBoYW5kbGUgaGVyZSwgaGF2ZSBhbGwgYmVlbiBtb3ZlZCB0bwotCQkvLyBzcGVjaWZpYyByZWdpb24gY2xhc3Nlcy4KLQkJLy8gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUKLQkJLy8gWE1MX1RBR19BVFRSSUJVVEVfTkFNRQotCQkvLyBYTUxfQ09OVEVOVAotCQkvLyBYTUxfQ0RBVEFfVEVYVAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0ZvcmVpZ25SZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0ZvcmVpZ25SZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJiNWEzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Gb3JlaWduUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIEZvcmVpZ25SZWdpb24gZXh0ZW5kcyBDb250ZXh0UmVnaW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIGxhbmd1YWdlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzdXJyb3VuZGluZ1RhZyA9IG51bGw7Ci0KLQlwdWJsaWMgRm9yZWlnblJlZ2lvbihTdHJpbmcgbmV3Q29udGV4dCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3VGV4dExlbmd0aCwgaW50IG5ld0xlbmd0aCkgewotCQlzdXBlcihuZXdDb250ZXh0LCBuZXdTdGFydCwgbmV3VGV4dExlbmd0aCwgbmV3TGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgRm9yZWlnblJlZ2lvbihTdHJpbmcgbmV3Q29udGV4dCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3VGV4dExlbmd0aCwgaW50IG5ld0xlbmd0aCwgU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCXN1cGVyKG5ld0NvbnRleHQsIG5ld1N0YXJ0LCBuZXdUZXh0TGVuZ3RoLCBuZXdMZW5ndGgpOwotCQlzZXRMYW5ndWFnZShuZXdMYW5ndWFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBsYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdXJyb3VuZGluZ1RhZygpIHsKLQkJcmV0dXJuIHN1cnJvdW5kaW5nVGFnOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdMYW5ndWFnZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmd1YWdlKGphdmEubGFuZy5TdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJbGFuZ3VhZ2UgPSBuZXdMYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3U3Vycm91bmRpbmdUYWcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXJyb3VuZGluZ1RhZyhqYXZhLmxhbmcuU3RyaW5nIG5ld1N1cnJvdW5kaW5nVGFnKSB7Ci0JCXN1cnJvdW5kaW5nVGFnID0gbmV3U3Vycm91bmRpbmdUYWc7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJGT1JFSUdOOiAiICsgc3VwZXIudG9TdHJpbmcoKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXRub2RlLCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJZlRleHRMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChmbGF0bm9kZS5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIGZsYXRub2RlLCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZWYyNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcyBhcmUgbm93IG1hbmFnZWQgYnkgZWFjaCBpbmRpdmlkdWFsCi0gKiAgICAgICAgICAgICBjb250ZW50IHR5cGUuIChYWENvcmVQcmVmZXJlbmNlTmFtZXMpCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcyB7Ci0JU3RyaW5nIFRBQl9XSURUSCA9ICJ0YWJXaWR0aCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBMSU5FX1dJRFRIID0gImxpbmVXaWR0aCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBTUExJVF9NVUxUSV9BVFRSUyA9ICJzcGxpdE11bHRpQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5ERU5UX1VTSU5HX1RBQlMgPSAiaW5kZW50VXNpbmdUYWJzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENMRUFSX0FMTF9CTEFOS19MSU5FUyA9ICJjbGVhckFsbEJsYW5rTGluZXMiOy8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQUdfTkFNRV9DQVNFID0gInRhZ05hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9DQVNFID0gImF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEZPUk1BVFRJTkdfU1VQUE9SVEVEID0gImZvcm1hdHRpbmdTdXBwb3J0ZWQiOy8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBQUkVGRVJSRURfTUFSS1VQX0NBU0VfU1VQUE9SVEVEID0gInByZWZlcnJlZE1hcmt1cENhc2VTdXBwb3J0ZWQiOy8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQVNLX1RBR19UQUdTID0gInRhc2stdGFnLXRhZ3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBU0tfVEFHX1BSSU9SSVRJRVMgPSAidGFzay10YWctcHJpb3JpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFTS19UQUdfRU5BQkxFID0gInRhc2stdGFncyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFTS19UQUdfUFJPSkVDVFNfSUdOT1JFRCA9ICJ0YXNrLXRhZy1wcm9qZWN0cy10b0lnbm9yZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogdGhlc2UgYXJlIHByZWZlcmVuY2VzIHRoYXQgc2hvdWxkIGJlIGluaGVyaXRlZCBmcm9tIHRoZSAiZW1iZWRkZWQKLQkgKiBwcmVmZXJlbmNlIHN0b3JlIiBmb3IgZXhhbXBsZTogaWYgeW91IGFzayBmb3IgdGggT1ZFUlZJRVdfUlVMRVIKLQkgKiBwcmVmZXJlbmNlIGZvciBKU1AsIHlvdSB3aWxsIGF1dG9tYXRpY2FsbHkgZ2V0IHRoZSBwcmVmZXJlbmNlIGZyb20gdGhlCi0JICogSFRNTCBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCVN0cmluZyBFTUJFRERFRF9DT05URU5UX1RZUEVfUFJFRkVSRU5DRVNbXSA9IHtUQUJfV0lEVEgsIExJTkVfV0lEVEgsIFNQTElUX01VTFRJX0FUVFJTLCBJTkRFTlRfVVNJTkdfVEFCUywgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBUQUdfTkFNRV9DQVNFLCBBVFRSX05BTUVfQ0FTRSx9OwotCi0JU3RyaW5nIEZPUk1BVFRJTkdfUFJFRkVSRU5DRVNbXSA9IHtUQUJfV0lEVEgsIExJTkVfV0lEVEgsIFNQTElUX01VTFRJX0FUVFJTLCBJTkRFTlRfVVNJTkdfVEFCUywgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLH07Ci0KLQlTdHJpbmcgQVVUTyA9ICJBdXRvIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVURl84ID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElTT184ODU5XzEgPSAiSVNPLTg4NTktMSI7Ly8kTk9OLU5MUy0xJAotCi0JaW50IEFTSVMgPSAwOwotCWludCBMT1dFUiA9IDE7Ci0JaW50IFVQUEVSID0gMjsKLQotCS8vIGNsZWFudXAgcHJlZmVyZW5jZSBuYW1lcwotCVN0cmluZyBDTEVBTlVQX1RBR19OQU1FX0NBU0UgPSAiY2xlYW51cFRhZ05hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENMRUFOVVBfQVRUUl9OQU1FX0NBU0UgPSAiY2xlYW51cEF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MgPSAiY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOU0VSVF9SRVFVSVJFRF9BVFRSUyA9ICJpbnNlcnRSZXF1aXJlZEF0dHJzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUVVPVEVfQVRUUl9WQUxVRVMgPSAicXVvdGVBdHRyVmFsdWVzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlRfRU9MX0NPREVTID0gImNvbnZlcnRFT0xDb2RlcyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBTlVQX0VPTF9DT0RFID0gImNsZWFudXBFT0xDb2RlIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgTEFTVF9BQ1RJVkVfUEFHRSA9ICJsYXN0QWN0aXZlUGFnZSI7Ly8kTk9OLU5MUy0xJAkKLQotCS8vIG5lZWQgdG8gcHV0IGRlZmF1bHQgdGFiIHdpZHRoIHByZWZlcmVuY2UgaGVyZSBzbyBpdCBpcyBhY2Nlc3NpYmxlIGJ5Ci0JLy8gYm90aCBtb2RlbCBhbmQgZWRpdG9yCi0JLy8gdGhpcyB3YXksIGVkaXRvciBkb2VzIG5vdCBuZWVkIHRvIHF1ZXJ5IG1vZGVsJ3MgZGVmYXVsdCB0YWIgd2lkdGgKLQkvLyBwcmVmZXJlbmNlCi0JaW50IERFRkFVTFRfVEFCX1dJRFRIID0gNDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA1NjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHRhc2tUYWdEZWZhdWx0cyA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKTsKLQkJdGFza1RhZ0RlZmF1bHRzLnB1dEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UpOwotCQl0YXNrVGFnRGVmYXVsdHMucHV0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTLCAiVE9ETyxGSVhNRSxYWFgiKTsgLy8kTk9OLU5MUy0xJAotCQl0YXNrVGFnRGVmYXVsdHMucHV0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTLCAiMSwyLDEiKTsgLy8kTk9OLU5MUy0xJAotCQl0YXNrVGFnRGVmYXVsdHMucHV0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm9wZXJ0eXRlc3Rlci9TdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3BlcnR5dGVzdGVyL1N0cnVjdHVyZWRGaWxlUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY0YjZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3BlcnR5dGVzdGVyL1N0cnVjdHVyZWRGaWxlUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3BlcnR5dGVzdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEEgUHJvcGVydHkgVGVzdGVyIHRoYXQgb3BlcmF0ZXMgb24gSUZpbGVzIGFuZCB2YWxpZGF0ZXMKLSAqIHRoYXQgdGhlIGV4cGVjdGVkIGNvbnRlbnQgdHlwZSBpZCBtYXRjaGVzIHRoYXQgb2YgdGhlIGNvbnRlbnQKLSAqIHR5cGUgb2YgdGhlIGZpbGUsIG9yIGFueSBvZiB0aGUgYmFzZSBjb250ZW50IHR5cGVzLgotICogCi0gKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnByb3BlcnR5dGVzdGVyLkZpbGVQcm9wZXJ0eVRlc3RlcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRmlsZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgewotCi0JLyoqCi0JICogQSBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgd2UgYXJlIGxvb2tpbmcgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgbWF0Y2hlcwotCSAqIHRoZSBjb250ZW50IHR5cGUgbWF0Y2hpbmcgdGhlIGdpdmVuIGlkZW50aWZpZXIuIFRoZSBpZGVudGlmaWVyIGlzCi0JICogcHJvdmlkZWQgYXMgdGhlIGV4cGVjdGVkIHZhbHVlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9DT05URU5UX1RZUEVfSUQgPSAiY29udGVudFR5cGVJZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuSVByb3BlcnR5VGVzdGVyI3Rlc3QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCWlmKFBST1BFUlRZX0NPTlRFTlRfVFlQRV9JRC5lcXVhbHMocHJvcGVydHkpICYmIChleHBlY3RlZFZhbHVlICE9IG51bGwpICYmIChyZWNlaXZlciBpbnN0YW5jZW9mIElGaWxlKSAmJiAoKElGaWxlKSByZWNlaXZlcikuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdGVzdENvbnRlbnRUeXBlKChJRmlsZSkgcmVjZWl2ZXIsIGV4cGVjdGVkVmFsdWUudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgY29udGVudCB0eXBlIGZvciA8Y29kZT5maWxlPC9jb2RlPiAob3IgYW55IGJhc2UgY29udGVudCB0eXBlcykgCi0JICogbWF0Y2hlcyB0aGUgPGNvZGU+Y29udGVudFR5cGVJZDwvY29kZT4uIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcyBtZXRob2QgY2FsbCBjb3VsZAotCSAqIGNhdXNlIHRoZSBmaWxlIHRvIGJlIHJlYWQuIEl0IGlzIGFsc28gcG9zc2libGUgKHRocm91Z2ggcG9vciBwbHVnLWluCi0JICogZGVzaWduKSBmb3IgdGhpcyBtZXRob2QgdG8gbG9hZCBwbHVnLWlucy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgVGhlIGZpbGUgZm9yIHdoaWNoIHRoZSBjb250ZW50IHR5cGUgc2hvdWxkIGJlIGRldGVybWluZWQ7IG11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gY29udGVudFR5cGVJZAotCSAqICAgICAgICAgICAgVGhlIGV4cGVjdGVkIGNvbnRlbnQgdHlwZTsgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSdzIGNvbnRlbnQgdHlwZSAob3IgYmFzZSBjb250ZW50IHR5cGVzKSAKLQkgKiAgICAgICAgIGhhcyBhbiBpZGVudGlmaWVyIHRoYXQgbWF0Y2hlcyA8Y29kZT5jb250ZW50VHlwZUlkPC9jb2RlPjsKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHRlc3RDb250ZW50VHlwZShmaW5hbCBJRmlsZSBmaWxlLCBTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlmaW5hbCBTdHJpbmcgZXhwZWN0ZWRWYWx1ZSA9IGNvbnRlbnRUeXBlSWQudHJpbSgpOwotCi0JCXRyeSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQl3aGlsZSAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCQlpZiAoZXhwZWN0ZWRWYWx1ZS5lcXVhbHMoY29udGVudFR5cGUuZ2V0SWQoKSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5nZXRCYXNlVHlwZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFsyMzI4MzFdIC0gTG9nIG1lc3NhZ2VzIG9ubHkgd2hlbiBkZWJ1Z2dpbmcKLQkJCWlmKExvZ2dlci5ERUJVRykKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWE5YzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIElBZGFwdGVyRmFjdG9yeS4gQWxsIGltcGxlbWVudGVycyBvZgotICogSUFkYXB0ZXJGYWN0b3J5IHNob3VsZCBzdWJjbGFzcyB0aGlzIGNsYXNzLiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB1c2VzCi0gKiBpdHNlbGYgKHRoaXMpIGFzIHRoZSBrZXkuIFN1YmNsYXNzZXMgbmVlZCB0byBwcm92aWRlIGEgd2F5IHRvIGNyZWF0ZSB0aGUKLSAqIGFkYXB0ZXIsIGFuZCBjYW4gb3ZlcnJpZGUgb3IgY2FsbCBvdGhlciBtZXRob2RzLgotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0KLQotCXByaXZhdGUgT2JqZWN0IGZBZGFwdGVyS2V5OwotCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRSZWdpc3RlckFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBJZiB0aGlzIGRlZmF1bHQgY29uc3RydWN0b3IgdXNlZCwgc2V0QWRhcHRlcktleSBhbmQgc2V0U2hvdWxkUmVnaXN0ZXIKLQkgKiBzaG91bGQgYmUgdXNlZCB0byBwcm9wZXJseSBpbml0aWFsaXplLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCi0JfQotCi0KLQlwdWJsaWMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSkgewotCQl0aGlzKGFkYXB0ZXJLZXksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFN1Y2xhc3NlcyBtYXkgZXh0ZW5kZWQgdGhpcyBjb25zdHJ1Y3RvciwgaWYgbmVlZGVkLgotCSAqLwotCi0JcHVibGljIEFic3RyYWN0QWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCi0JCXN1cGVyKCk7Ci0JCWZBZGFwdGVyS2V5ID0gYWRhcHRlcktleTsKLQkJZlNob3VsZFJlZ2lzdGVyQWRhcHRlciA9IHJlZ2lzdGVyQWRhcHRlcnM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogc2hvdWxkIGJlIGZpbmFsLiBTZWUgdGhvc2UgdGhhdCBpbXBsZW1lbnQgaXQgCi0JICogZm9yIGNvbXBsaWNhdGluZyBkZXRhaWxzIGFuZCAidW5rbm93bnMiLiAKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gdGFyZ2V0LmdldEV4aXN0aW5nQWRhcHRlcihmQWRhcHRlcktleSk7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJYWRhcHRlciA9IGFkYXB0TmV3KHRhcmdldCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgbm9ybWFsbHkgaW1wbGVtZW50IHRoZWlyIG93biAnY29weScgbWV0aG9kLiBCeQotCSAqIGRlZmF1bHQsIHdlJ2xsIHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSwgZm9yIGNvbnZlbmllbmNlIG9mIHRob3NlIHVzaW5nCi0JICogc2luZ2xldG9uIGZhY3RvcmllcyAod2hpY2ggaGF2ZSBubyBzdGF0ZSwgYW5kIHNvIG5lZWQgdG8gZG8gYW55dGhpbmcgb24KLQkgKiAncmVsZWFzZScpLgotCSAqIAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG5lZWRzIHRvIHJldHVybiB0cnVlIG9mIHRoaXMgZmFjdG9yeSBpcyBmb3IgYWRhcHRlcnMgb2YKLQkgKiB0eXBlICd0eXBlJy4gSXQgaXMgcmVxdWlyZWQgdGhhdCBpdCByZXR1cm4gdHJ1ZSBpZiAnZXF1YWxzJyBhbmQgdGhpcwotCSAqIGRlZmF1bHQgYmVoYXZpb3IgaXMgcHJvdmlkZWQgYnkgdGhpcyBzdXBlciBjbGFzcy4gQ2xpZW50cyBtYXkgZXh0ZW5kCi0JICogdGhpcyBiZWhhdmlvciBpZiBtb3JlIGNvbXBsZXggbG9naWMgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoZkFkYXB0ZXJLZXkpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbWF5IG5lZWQgdG8gImNsZWFudXAiIHRoZWlyIGFkYXB0ZXIgZmFjdG9yeSwgcmVsZWFzZQotCSAqIGFkYXB0ZXJzLCByZXNvdXJjZXMsIGV0Yy4gU3ViY2xhc3NlcyBtYXkgZXh0ZW5kIHRoaXMgbWV0aG9kIGlmIHN1Y2gKLQkgKiBjbGVhbiB1cCBpcyByZXF1aXJlZC4gTm90ZTogd2hpbGUgY3VycmVudCBiZWhhdmlvciBpcyB0byBkbyBub3RoaW5nLAotCSAqIHN1YmNsYXNzZXMgc2hvdWxkIG5vdCBhc3N1bWUgdGhpcyB3b3VsZCBhbHdheXMgYmUgdHJ1ZSwgc28gc2hvdWxkCi0JICogYWx3YXlzIGNhbGwgc3VwZXIucmVsZWFzZSBhdCB0aGUgZW5kIG9mIHRoZWlyIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZWZhdWx0IGZvciBzdXBlcmNsYXNzIGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IGZvciBzcGVjaWFsIGNhc2VzIHRoZXJlIHRoZSBhZGFwdGVyIGtleSBjYW4gYmUgc2V0IGluIHRoZQotCSAqIGNvbnN0cnVjdG9yLiBJdCBjYW4gYmUgc2V0IGhlcmUuIElmIGl0IGlzIHNldCBtb3JlIHRoYW4sIGFuZAotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIHNldEFkYXB0ZXJLZXkoT2JqZWN0IGtleSkgewotCQlpZiAoZkFkYXB0ZXJLZXkgIT0gbnVsbCAmJiAhKGZBZGFwdGVyS2V5LmVxdWFscyhrZXkpKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIklOb2RlQWRhcHRlciBLZXkgY2Fubm90IGJlIGNoYW5nZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJZkFkYXB0ZXJLZXkgPSBrZXk7Ci0JfQotCi0JLyoqCi0JICogQ2FuIGJlIGNhbGxlZCBieSBzdWJjbGFzc2VzIGR1cmluZyAnYWRhcHQnIHByb2Nlc3MsIGJ1dCBtdXN0IG5vdCBiZQotCSAqIG92ZXJyaWRkZW4gb3IgcmVpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElOb2RlQWRhcHRlciBhZGFwdE5ldyhJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGNyZWF0ZUFkYXB0ZXIodGFyZ2V0KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGZTaG91bGRSZWdpc3RlckFkYXB0ZXIpIHsKLQkJCQl0YXJnZXQuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLiBJdCBpcyBjYWxsZWQgYnkgaW5mcmFzdHJ1Y3R1cmUKLQkgKiB3aGVuIGFuIGluc3RhbmNlIGlzIG5lZWRlZC4gSXQgaXMgcHJvdmlkZWQgdGhlIG5vZGUgbm90aWZpZXIsIHdoaWNoIG1heQotCSAqIG9yIG1heSBub3QgYmUgcmVsZXZlbnQgd2hlbiBjcmVhdGluZyB0aGUgYWRhcHRlci4gTm90ZTogdGhlIGFkYXB0ZXIKLQkgKiBkb2VzIG5vdCBoYXZlIHRvIGxpdGVyYWxseSBiZSBhIG5ldyBpbnRhbmNlIGFuZCBpcyBhY3R1YWxseSByZWNvbW1lbmRlZAotCSAqIHRvIHR5cGljYWxseSBiZSBhIHNpbmdsZXRvbiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCk7Ci0KLQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gZlNob3VsZFJlZ2lzdGVyQWRhcHRlcjsKLQl9Ci0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFNob3VsZFJlZ2lzdGVyQWRhcHRlcihib29sZWFuIHNob3VsZFJlZ2lzdGVyQWRhcHRlcikgewotCQkvLyBJU1NVRTogdGVjaG5pY2FsbHkgd2UgcHJvYmFibHkgc2hvdWxkIG5vdCBhbGxvdyB0aGlzIHZhbHVlIHRvCi0JCS8vIGNoYW5nZSwgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGJ1dCBpcyBub3Qgc28gZWFzeSB0byBkbywKLQkJLy8gYW5kIEknbSBub3Qgc3VyZSBpdHMgIndvcnRoIiB0aGUgcHJvdGVjdGlvbi4KLQkJZlNob3VsZFJlZ2lzdGVyQWRhcHRlciA9IHNob3VsZFJlZ2lzdGVyQWRhcHRlcjsKLQl9Ci0KLQotCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgZ2V0QWRhcHRlcktleSgpIHsKLQkJcmV0dXJuIGZBZGFwdGVyS2V5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3ROb3RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9BYnN0cmFjdE5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTdmOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9BYnN0cmFjdE5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLQotCi0KLS8qKgotICogQWJzdHJhY3ROb3RpZmllciBpcyBzaW1pbGFyIHRvIChhbmQgYmFzZWQgb24pIHRoZSBFTUYgTm90aWZpZXJJbXBsIGNsYXNzLAotICogYnV0IGlzIG5vdCByZWxhdGVkIHRvIEVNRiBwZXIgc2UuIFRoaXMgY2xhc3MgaXMgc2ltcGxlciAodGhhdCBpcywgbm90IGFzCi0gKiBtYW55IGZ1bmN0aW9ucykuCi0gKiAKLSAqIEltcGxlbWVudGVycyBvZiB0aGlzIElOb2RlTm90aWZpZXIgbXVzdCBzdWJjbGFzcyB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROb3RpZmllciBpbXBsZW1lbnRzIElOb2RlTm90aWZpZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBncm93dGhDb25zdGFudCA9IDM7Ci0JcHJpdmF0ZSBpbnQgYWRhcHRlckNvdW50ID0gMDsKLQotCXByaXZhdGUgSU5vZGVBZGFwdGVyW10gZkFkYXB0ZXJzOwotCi0JLyoqCi0JICogQWJzdHJhY3ROb3RpZmllciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdE5vdGlmaWVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGFkZEFkYXB0ZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEFkYXB0ZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpIHsKLQotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbnN1cmVDYXBhY2l0eShhZGFwdGVyQ291bnQgKyAxKTsKLQkJZkFkYXB0ZXJzW2FkYXB0ZXJDb3VudCsrXSA9IGFkYXB0ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBuZWVkZWQpIHsKLQkJaWYgKGZBZGFwdGVycyA9PSBudWxsKSB7Ci0JCQkvLyBmaXJzdCB0aW1lCi0JCQlmQWRhcHRlcnMgPSBuZXcgSU5vZGVBZGFwdGVyW25lZWRlZCArIGdyb3d0aENvbnN0YW50XTsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgb2xkTGVuZ3RoID0gZkFkYXB0ZXJzLmxlbmd0aDsKLQkJaWYgKG9sZExlbmd0aCA8IG5lZWRlZCkgewotCQkJSU5vZGVBZGFwdGVyW10gb2xkQWRhcHRlcnMgPSBmQWRhcHRlcnM7Ci0JCQlJTm9kZUFkYXB0ZXJbXSBuZXdBZGFwdGVycyA9IG5ldyBJTm9kZUFkYXB0ZXJbbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRBZGFwdGVycywgMCwgbmV3QWRhcHRlcnMsIDAsIGFkYXB0ZXJDb3VudCk7Ci0JCQlmQWRhcHRlcnMgPSBuZXdBZGFwdGVyczsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5PVCBBUEk6IHVzZWQgb25seSBmb3IgdGVzdGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWRhcHRlckNvdW50KCkgewotCQlyZXR1cm4gYWRhcHRlckNvdW50OwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgYmVoYXZpb3IgZm9yIGdldHRpbmcgYW4gYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGdldEFkYXB0ZXJGb3IoT2JqZWN0IHR5cGUpIHsKLQkJLy8gZmlyc3QsIHdlJ2xsIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgb25lCi0JCUlOb2RlQWRhcHRlciByZXN1bHQgPSBnZXRFeGlzdGluZ0FkYXB0ZXIodHlwZSk7Ci0JCS8vIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSBpbiBvdXIgbGlzdCBhbHJlYWR5LAotCQkvLyBsZXQncyBjcmVhdGUgaXQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlGYWN0b3J5UmVnaXN0cnkgcmVnID0gZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQlpZiAocmVnICE9IG51bGwpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSByZWcuZ2V0RmFjdG9yeUZvcih0eXBlKTsKLQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGZhY3RvcnkuYWRhcHQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJLy8gV2Ugd29uJ3QgcHJldmVudCBudWxsIGZyb20gYmVpbmcgcmV0dXJuZWQsIGJ1dCBpdCB3b3VsZCBiZQotCQkJLy8gdW51c3VhbC4KLQkJCS8vIEl0IG1pZ2h0IGJlIGJlY2F1c2UgRmFjdG9yeSBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHksIG9yCi0JCQkvLyBub3QgaW5zdGFsbGVkLCBzbyB3ZSdsbCBhbGxvdyB3YXJuaW5nIG1lc3NhZ2UuCi0JCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGlzcGxheVdhcm5pbmdzKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogbm8gYWRhcHRlciB3YXMgZm91bmQgb3IgY3JlYXRlZCBmb3IgIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjbG9uZSBvZiBsaXN0LCBzaW5jZSBjbGllbnRzIHNob3VsZCBub3QgbWFuaXB1bGF0ZQotCSAqIG91ciBsaXN0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCB1c2UgYWRkL3JlbW92ZUFkYXB0ZXIuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRhcHRlcnMoKSB7Ci0JCWlmIChmQWRhcHRlcnMgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXJDb3VudCA9PSAwKSB7Ci0JCQkJZkFkYXB0ZXJzID0gbnVsbDsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG5lZWQgdG8gbWFrZSBhIG5ldyBhcnJheSwgdG8gYmUgc3VyZQotCQkJCS8vIGl0IGRvZXNuJ3QgY29udGFpbiBudWxscyBhdCBlbmQsIHdoaWNoIG1heSBiZQotCQkJCS8vIHByZXNlbnQgdGhlcmUgZm9yICJncm93dGgiLgotCQkJCUlOb2RlQWRhcHRlcltdIHRlbXBBZGFwdGVycyA9IG5ldyBJTm9kZUFkYXB0ZXJbYWRhcHRlckNvdW50XTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZBZGFwdGVycywgMCwgdGVtcEFkYXB0ZXJzLCAwLCBhZGFwdGVyQ291bnQpOwotCQkJCS8vIEVNRiB1c2VzIHRoZSB1bm1vZGlmaWFibGVDb2xsZWN0aW9uLiBJdHMgYSBiaXQgb2YgYQotCQkJCS8vIHBlcmZvcm1hbmNlCi0JCQkJLy8gZHJhaW4sIGJ1dCBtYXkgd2FudCB0byBsZWF2ZSBpbiBzaW5jZQotCQkJCS8vIGl0IHdvdWxkICJmYWlsIGZhc3QiIGlmIHNvbWVvbmUgd2FzIHRyeWluZyB0byBtb2RpZnkgdGhlCi0JCQkJLy8gbGlzdC4KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihBcnJheXMuYXNMaXN0KHRlbXBBZGFwdGVycykpOwotCQkJCS8vIHJldHVybiBBcnJheXMuYXNMaXN0KG5ld0FkYXB0ZXJzKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwcml2YXRlIGxvbmcgZ2V0QWRhcHRlclRpbWVDcml0ZXJpYSgpIHsKLQkJLy8gdG8gInJlLWdldCIgdGhlIHByb3BlcnR5IGVhY2ggdGltZSBpcyBhIGxpdHRsZSBhd2t3YXJkLCBidXQgd2UKLQkJLy8gZG8gaXQgdGhhdCB3YXkgdG8gYXZvaWQgYWRkaW5nIGluc3RhbmNlIHZhcmlhYmxlIGp1c3QgZm9yCi0JCS8vIGRlYnVnZ2luZy4KLQkJLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGRlYnVnQWRhcHRlck5vdGlmY2F0aW9uVGltZQotCQkvLyBpcyB0cnVlLgotCQlmaW5hbCBTdHJpbmcgY3JpdGVyaWFTdHIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2RvbS9hZGFwdGVyL25vdGlmaWNhdGlvbi90aW1lL2NyaXRlcmlhIik7IC8vJE5PTi1OTFMtMSQKLQkJbG9uZyBjcml0ZXJpYSA9IC0xOwotCQlpZiAoY3JpdGVyaWFTdHIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljcml0ZXJpYSA9IExvbmcucGFyc2VMb25nKGNyaXRlcmlhU3RyKTsKLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCS8vIGNhdGNoIHRvIGJlIHN1cmUgd2UgZG9uJ3QgYnVyYiBpbiBub3RpZmljYXRpb24gbG9vcCwKLQkJCQkvLyBidXQgaWdub3JlLCBzaW5jZSBqdXN0IGEgZGVidWcgYWlkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyaXRlcmlhOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgZ2V0RXhpc3RpbmdBZGFwdGVyKE9iamVjdCB0eXBlKSB7Ci0JCUlOb2RlQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJDb3VudDsgaSsrKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYSA9IGZBZGFwdGVyc1tpXTsKLQkJCWlmIChhICE9IG51bGwgJiYgYS5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJcmVzdWx0ID0gYTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBkaWRuJ3QgZmluZCBvbmUgaW4gb3VyIGxpc3QsCi0JCS8vIHJldHVybiB0aGUgbnVsbCByZXN1bHQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JcHVibGljIHZvaWQgbm90aWZ5KGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQotCQlpZiAoZkFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCWludCBsb2NhbEFkYXB0ZXJDb3VudCA9IDA7Ci0JCQlJTm9kZUFkYXB0ZXJbXSBsb2NhbEFkYXB0ZXJzID0gbnVsbDsKLQotCQkJLy8gbG9jayBvYmplY3Qgd2hpbGUgbWFraW5nIGxvY2FsIGFzc2lnbm1lbnRzCi0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlsb2NhbEFkYXB0ZXJDb3VudCA9IGFkYXB0ZXJDb3VudDsKLQkJCQlsb2NhbEFkYXB0ZXJzID0gbmV3IElOb2RlQWRhcHRlcltsb2NhbEFkYXB0ZXJDb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmQWRhcHRlcnMsIDAsIGxvY2FsQWRhcHRlcnMsIDAsIGxvY2FsQWRhcHRlckNvdW50KTsKLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEFkYXB0ZXJDb3VudDsgaSsrKSB7Ci0JCQkJSU5vZGVBZGFwdGVyIGEgPSBsb2NhbEFkYXB0ZXJzW2ldOwotCi0JCQkJaWYgKExvZ2dlci5ERUJVR19BREFQVEVSTk9USUZJQ0FUSU9OVElNRSkgewotCQkJCQlsb25nIGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEgPSBnZXRBZGFwdGVyVGltZUNyaXRlcmlhKCk7Ci0JCQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCS8vICoqIGtlZXAgdGhpcyBsaW5lIGlkZW50aWNhbCB3aXRoIG5vbi1kZWJ1ZyB2ZXJzaW9uISEKLQkJCQkJYS5ub3RpZnlDaGFuZ2VkKHRoaXMsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJCQkJbG9uZyBub3RpZnlEdXJhdGlvbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lOwotCQkJCQlpZiAoZ2V0QWRhcHRlclRpbWVDcml0ZXJpYSA+PSAwICYmIG5vdGlmeUR1cmF0aW9uID4gZ2V0QWRhcHRlclRpbWVDcml0ZXJpYSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGFwdGVyIG5vdGlmeUR1cmF0aW9uOiAiICsgbm90aWZ5RHVyYXRpb24gKyAiICBjbGFzczogIiArIGEuZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJLy8gKioga2VlcCB0aGlzIGxpbmUgaWRlbnRpY2FsIHdpdGggZGVidWcgdmVyc2lvbiEhCi0JCQkJCQlhLm5vdGlmeUNoYW5nZWQodGhpcywgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gSXRzIGltcG9ydGFudCB0byAia2VlcCBnb2luZyIsIHNpbmNlIG5vdGlmaWNhdGlvbnMKLQkJCQkJCS8vIG9jY3VyIGJldHdlZW4gYW4KLQkJCQkJCS8vIGFib3V0VG9DaGFuZ2UgZXZlbnQgYW5kIGEgY2hhbmdlZCBldmVudCAtLSB0aGUKLQkJCQkJCS8vIGNoYW5nZWQgZXZlbnQgdHlwaWNhbGx5IGJlaW5nIHJlcXVpcmUKLQkJCQkJCS8vIHRvIHJlc3RvcmUgc3RhdGUsIGV0Yy4gU28sIHdlIGp1c3QgbG9nIG1lc3NhZ2UsIGRvCi0JCQkJCQkvLyBub3QgcmUtdGhyb3cgaXQsIGJ1dAotCQkJCQkJLy8gdHlwaWNhbGx5IHRoZSBleGNlcHRpb24gZG9lcyBpbmRpY2F0ZSBhIHNlcmlvdXMKLQkJCQkJCS8vIHByb2dyYW0gZXJyb3IuCi0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJBIHN0cnVjdHVyZWQgbW9kZWwgY2xpZW50LCAiICsgYSArICIgdGhyZXcgZm9sbG93aW5nIGV4Y2VwdGlvbiBkdXJpbmcgYWRhcHRlciBub3RpZmljYXRpb24gKCIgKyBJTm9kZU5vdGlmaWVyLkVWRU5UX1RZUEVfU1RSSU5HU1tldmVudFR5cGVdICsgIiApIiwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBZGFwdGVyKElOb2RlQWRhcHRlciBhKSB7Ci0JCWlmIChmQWRhcHRlcnMgPT0gbnVsbCB8fCBhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBuZXdJbmRleCA9IDA7Ci0JCUlOb2RlQWRhcHRlcltdIG5ld0FkYXB0ZXJzID0gbmV3IElOb2RlQWRhcHRlcltmQWRhcHRlcnMubGVuZ3RoXTsKLQkJaW50IG9sZEFkYXB0ZXJDb3VudCA9IGFkYXB0ZXJDb3VudDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBvbGRJbmRleCA9IDA7IG9sZEluZGV4IDwgb2xkQWRhcHRlckNvdW50OyBvbGRJbmRleCsrKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgY2FuZGlkYXRlID0gZkFkYXB0ZXJzW29sZEluZGV4XTsKLQkJCWlmIChhID09IGNhbmRpZGF0ZSkgewotCQkJCWFkYXB0ZXJDb3VudC0tOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQluZXdBZGFwdGVyc1tuZXdJbmRleCsrXSA9IGZBZGFwdGVyc1tvbGRJbmRleF07Ci0JCX0KLQkJaWYgKGZvdW5kKQotCQkJZkFkYXB0ZXJzID0gbmV3QWRhcHRlcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0RvY3VtZW50Q2hhbmdlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9Eb2N1bWVudENoYW5nZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3YTRlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0RvY3VtZW50Q2hhbmdlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbExpZmVjeWNsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudENoYW5nZWQgZXh0ZW5kcyBNb2RlbExpZmVjeWNsZUV2ZW50IHsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZk5ld0RvY3VtZW50OwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZPbGREb2N1bWVudDsKLQotCXByb3RlY3RlZCBEb2N1bWVudENoYW5nZWQoKSB7Ci0KLQkJc3VwZXIoTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ET0NVTUVOVF9DSEFOR0VEKTsKLQotCX0KLQotCXByb3RlY3RlZCBEb2N1bWVudENoYW5nZWQoaW50IGFkZGl0aW9uYWxUeXBlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0KLQkJc3VwZXIobW9kZWwsIE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCB8IGFkZGl0aW9uYWxUeXBlKTsKLQotCX0KLQotCXB1YmxpYyBEb2N1bWVudENoYW5nZWQoaW50IGFkZGl0aW9uYWxUeXBlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50IG9sZERvY3VtZW50LCBJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0KLQkJdGhpcyhhZGRpdGlvbmFsVHlwZSwgbW9kZWwpOwotCQlmT2xkRG9jdW1lbnQgPSBvbGREb2N1bWVudDsKLQkJZk5ld0RvY3VtZW50ID0gbmV3RG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0TmV3RG9jdW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGZOZXdEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRPbGREb2N1bWVudCgpIHsKLQotCQlyZXR1cm4gZk9sZERvY3VtZW50OwotCX0KLQotCXZvaWQgc2V0TmV3RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdEb2N1bWVudCkgewotCi0JCWZOZXdEb2N1bWVudCA9IG5ld0RvY3VtZW50OwotCX0KLQotCXZvaWQgc2V0T2xkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBvbGREb2N1bWVudCkgewotCi0JCWZPbGREb2N1bWVudCA9IG9sZERvY3VtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdmODM1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbExpZmVjeWNsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBpcyBhbiBlYXJseSB2ZXJzaW9uIG9mIGEgY2xhc3MgdGhhdCBtYXkgY2hhbmdlIG92ZXIgdGhlIG5leHQgZmV3Ci0gKiBtaWxlc3RvbmVzLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgewotCi0Jdm9pZCBwcm9jZXNzUG9zdE1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCk7Ci0KLQl2b2lkIHByb2Nlc3NQcmVNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMzA4ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIG5ldyBNb2RlbCBmcm9tIGEgcmVzb3VyY2UsIG9yIGFzIGEgbmV3LCBlbXB0eQotICogaW5zdGFuY2UuCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxMb2FkZXIgewotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBwZXJmb3JtIGFsbCB0aGUgbW9kZWwgaW5pdGlhbGl6YXRpb24gcmVxdWlyZWQgYmVmb3JlCi0JICogaXQgY29udGFpbnMgY29udGVudCwgbmFtZWx5LCBpdCBzaG91bGQgY2FsbCBuZXdNb2RlbCwgdGhlCi0JICogY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCksIHRoZW4gc2V0QWRhcHRlckZhY3Rvcmllcy4gKHRoaXMgaXMKLQkgKiB0ZW50YXRpdmUpCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbCgpOwotCi0JLyoqCi0JICogTWV0aG9kIGNyZWF0ZU1vZGVsLiBDcmVhdGVzIGEgbmV3IG1vZGVsIGJhc2VkIG9uIG9sZCBvbmUuCi0JICogCi0JICogQHBhcmFtIG9sZE1vZGVsCi0JICogQHJldHVybiBJU3RydWN0dXJlZE1vZGVsCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRob3NlIGZhY3RvcmllcyB3aGljaCBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIHN0cnVjdHVyZWRNb2RlbCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLgotCSAqLwotCUxpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCi0Jdm9pZCBsb2FkKElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCBsb2FkKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyBlbmNvZGluZ05hbWUsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgcmV0dXJuIGFuIG5ldywgZW1wdHkgU3RydWN0dXJlZCBNb2RlbAotCSAqIGFwcHJvcHJpYXRlIGZvciBpdHNlbGYuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpOwotCi0JSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgZ2V0IGEgZnJlc2ggY29weSBvZiB0aGUgZGF0YSwgYW5kIHJlcG9wdWxhdGUgdGhlCi0JICogbW9kZWxzIC4uLiBub3JtYWxseSBieSBhIGNhbGwgdG8gc2V0VGV4dCBvbiB0aGUgc3RydWN0dXJlZERvY3VtZW50LCBmb3IKLQkgKiBTdHJ1Y3R1cmVkTW9kZWxzLiBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgaW4gc29tZSBjYXNlcyB3aGVyZSBjbGllbnRzIGFyZQotCSAqIHNoYXJpbmcgYSBtb2RlbCBhbmQgdGhlbiBjaGFuZ2VzIGNhbmNlbGVkLiBTYXkgZm9yIGV4YW1wbGUsIG9uZSBlZGl0b3IKLQkgKiBhbmQgc2V2ZXJhbCAiZGlzcGxheXMiIGFyZSBzaGFyaW5nIGEgbW9kZWwsIGlmIHRoZSBlZGl0b3IgaXMgY2xvc2VkCi0JICogd2l0aG91dCBzYXZpbmcgY2hhbmdlcywgdGhlbiB0aGUgZGlzcGxheXMgc3RpbGwgbmVlZCBhIG1vZGVsLCBidXQgdGhleQotCSAqIHNob3VsZCByZXZlcnQgdG8gdGhlIG9yaWdpbmFsIHVuc2F2ZWQgdmVyc2lvbi4KLQkgKi8KLQl2b2lkIHJlbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBTdHJ1Y3R1cmVkIE1vZGVsIHdpdGggdGhlIGdpdmVuIFN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZSBhcwotCSAqIGl0cyBkb2N1bWVudCAoaW5zdGVhZCBvZiBhIG5ldyBkb2N1bWVudCBpbnN0YW5jZSBhcyB3ZWxsKQotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTW9kZWwoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgSU1vZGVsSGFuZGxlciBoYW5kbGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5OTMyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci0KLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgc2V0IG9mIEFQSXMgZm9yIGNyZWF0aW5nIGEgbmV3IG1vZGVsIG1hbmFnZXIsCi0gKiBmb3IgbWFuYWdpbmcgKGFkZCBvciByZW1vdmUpIG1vZGVsIGxvYWRlcnMgYW5kIG1vZGVsIGR1bXBlcnMsIGFuZCBmb3IKLSAqIG1hbmFnaW5nIChnZXQsIHJlbGVhc2UsIHNhdmUsIGFuZCBzYXZlIGFzKSBtb2RlbHMuCi0gKiAKLSAqIENsaWVudHMgY2FuIHJlZmVyZW5jZSwgYnV0IHNob3VsZCBub3QgaW1wbGVtZW50LgotICogCi0gKiBAc2VlIFN0cnVjdHVyZWRNb2RlbE1hbmdlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbE1hbmFnZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRFVQTElDQVRFRF9NT0RFTCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlci5EVVBMSUNBVEVEX01PREVMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOTUFOQUdFRF9NT0RFTCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsTWFuYWdlci5VTk1BTkFHRURfTU9ERUwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDYWxjdWxhdGUgaWQgcHJvdmlkZXMgYSBjb21tb24gd2F5IHRvIGRldGVybWluZSB0aGUgaWQgZnJvbSB0aGUgaW5wdXQKLQkgKiAuLi4gbmVlZGVkIHRvIGdldCBhbmQgc2F2ZSB0aGUgbW9kZWwuIEl0IGlzIGEgc2ltcGxlIGNsYXNzIHV0aWxpdHksIGJ1dAotCSAqIGlzIGFuIGluc3RhbmNlIG1ldGhvZCBzbyBjYW4gYmUgYWNjZXNzZWQgdmlhIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElGaWxlIGZpbGUpOwotCi0JSVN0cnVjdHVyZWRNb2RlbCBjb3B5TW9kZWxGb3JFZGl0KFN0cmluZyBvbGRJZCwgU3RyaW5nIG5ld0lkKSB0aHJvd3MgUmVzb3VyY2VJblVzZTsKLQotCS8qKgotCSAqIGNyZWF0ZU5ld0luc3RhbmNlIGlzIHNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCB0aGUgbmV3IGluc3RhbmNlIGhhcyBubwotCSAqIGNvbnRlbnQuIE5vdGU6IHRoaXMgcHJvZHVjZXMgYW4gdW5tYW5hZ2VkIG1vZGVsLCBmb3IgdGVtcG9yYXJ5IHVzZS4gSWYKLQkgKiBhIHRydWUgc2hhcmVkIG1vZGVsIGlzIGRlc2lyZWQsIHVzZSAiY29weSIuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTmV3SW5zdGFuY2UoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEgcHJvcGVyCi0JICogcGFyc2VyIGFzc2lnbmVkLiBOb3RlOiBpdHMgYXNzdW1lIHRoYXQgSUZpbGUgZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgYXMKLQkgKiBhIHJlc291cmNlIHlldC4gSWYgaXQgZG9lcywgUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgdGhlIHJlc291cmNlIGRvZXMgYWxyZWFkeSBleGlzdCwgdGhlbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IgaXMKLQkgKiB0aGUgcmlnaHQgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGNsaWVudHMgc2hvdWxkIHZlcmlmeSBJRmlsZSBleGlzdHMgYmVmb3JlIHVzaW5nCi0JICogdGhpcyBtZXRob2QuIElmIHRoaXMgSUZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4KLQkgKiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgdGhlIGNvcnJlY3QgQVBJIHRvIHVzZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEKLQkgKiBwcm9wZXIgcGFyc2VyIGFzc2lnbmVkLiBJdCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gYW4gZW1wdHkKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgbmVlZGVkLiBPdGhlcndpc2UsIHVzZSBJRmlsZSBmb3JtLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBjb250ZW50VHlwZUlkKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0tIEkgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8gZGlzY291YWdlIHVzZSBvZiB0aGlzIG1ldGhvZC4KLQkgKiAgICAgICAgICAgICBJdCBkb2VzIG5vdCByZWFsbHkgd29yayBmb3IgSlNQIGZyYWdtZW50cywgc2luY2UgSlNQCi0JICogICAgICAgICAgICAgRnJhZ21lbnRzIG5lZWQgYW4gSUZpbGUgdG8gY29ycmVjdGx5IGxvb2sgdXAgdGhlIGNvbnRlbnQKLQkgKiAgICAgICAgICAgICBzZXR0aW5ncy4gVXNlIElGaWxlIGZvcm0gaW5zdGVhZC4gTm90ZTogc29tZSBjb25mdXN0aW9uCi0JICogICAgICAgICAgICAgd2l0aCBpdCBhbmQgdGhlIGZvcm0gZm9yIEhUUFAgZW5jb2RpbmcsIHNvIG9uY2UgYSBudWxsIGFyZwotCSAqICAgICAgICAgICAgIGlzIGFsbG93ZWQgaW4gdGhhdCBBUEkgLi4uIHdlIGNhbiByZW1vdmUgdGhpcyBvbmUuIChhZnRlcgotCSAqICAgICAgICAgICAgIHZlcmlmeWluZyBhZ2FpbiB3aXRoIFRvbS9MaW5rc2J1aWxkKQotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlciwgU3RyaW5nIGlhbmFFbmNvZGluZ05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvbnRlbnQsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVycyBuZXdNb2RlbCBtZXRob2QgdG8gcmV0dXJuCi0JICogYW4gYXBwcm9wcmlhdGUgU3RydWN1dHVyZWRNb2RlbCBhcHByb3ByaWF0ZWx5IGluaXRpYWxpemVkLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZC4gSXQgZGVwZW5kcyBvbiB0aGUgbG9hZGVycyBuZXdNb2RlbCBtZXRob2QgdG8gcmV0dXJuCi0JICogYW4gYXBwcm9wcmlhdGUgU3RydWN1dHVyZWRNb2RlbCBhcHByb3ByaWF0ZWx5IGluaXRpYWxpemVkLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKFN0cmluZyBjb250ZW50VHlwZUlkKTsKLQotCUlTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKFN0cmluZyBjb250ZW50VHlwZUlkLCBVUklSZXNvbHZlciByZXNvbHZlcik7Ci0KLQkvKioKLQkgKiBOb3RlOiB1c2VycyBvZiB0aGlzICdtb2RlbCcgbXVzdCBzdGlsbCByZWxlYXNlIGl0IHdoZW4gZmluaXNoZWQuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZXJlJ3Mgbm90IGEgbW9kZWwgY29ycmVzcG9uZGluZyB0byBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElEb2N1bWVudCBkb2N1bWVudCk7Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBOb3RlOiB1c2VycyBvZiB0aGlzICdtb2RlbCcgbXVzdCBzdGlsbCByZWxlYXNlIGl0IHdoZW4gZmluaXNoZWQuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZXJlJ3Mgbm90IGEgbW9kZWwgY29ycmVzcG9uZGluZyB0byBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElEb2N1bWVudCBkb2N1bWVudCk7Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKE9iamVjdCBpZCk7Ci0KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RXhpc3RpbmdNb2RlbElkcygpOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIC0gZW5jb2RpbmcgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJU3RydWN0dXJlZERvY3VtZW50IHRleHRGaWxlQnVmZmVyRG9jdW1lbnQpOwotCi0JLyoKLQkgKiBAZGVwcmVjYXRlZCAtIGEgVVJJIHJlc29sdmVyIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2hlbgotCSAqICAgICAgICAgICAgIG5lZWRlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChTdHJpbmcgaWQsIElucHV0U3RyZWFtIGluU3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIC0gZW5jb2RpbmcgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIC0gZW5jb2RpbmcgYW5kIGxpbmUgZGVsaW1pdGVycyBhcmUgaGFuZGxlZCBhdXRvbWF0aWNhbGx5Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSVN0cnVjdHVyZWREb2N1bWVudCB0ZXh0RmlsZUJ1ZmZlckRvY3VtZW50KTsKLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgLSBhIFVSSSByZXNvbHZlciBzaG91bGQgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIHdoZW4KLQkgKiAgICAgICAgICAgICBuZWVkZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpblN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNyZWF0ZSBhIG5ldyBtb2RlbCBpZiBpdCBhbHJlYWR5IGV4aXN0cyAuLi4gaWYKLQkgKiBmb3JjZSBpcyBmYWxzZS4gVGhlIGlkZWEgaXMgdGhhdCBhIGNsaWVudCBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBvbmNlCi0JICogd2l0aCBmb3JjZSBzZXQgdG8gZmFsc2UuIElmIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVuIHByb21wdCBjbGllbnQKLQkgKiBpZiB0aGV5IHdhbnQgdG8gb3ZlcndyaXRlLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNyZWF0ZSBhIG5ldyBtb2RlbCBpZiBpdCBhbHJlYWR5IGV4aXN0cyAuLi4gaWYKLQkgKiBmb3JjZSBpcyBmYWxzZS4gVGhlIGlkZWEgaXMgdGhhdCBhIGNsaWVudCBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBvbmNlCi0JICogd2l0aCBmb3JjZSBzZXQgdG8gZmFsc2UuIElmIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVuIHByb21wdCBjbGllbnQKLQkgKiBpZiB0aGV5IHdhbnQgdG8gb3ZlcndyaXRlLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JaW50IGdldFJlZmVyZW5jZUNvdW50KE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvckVkaXQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yUmVhZChPYmplY3QgaWQpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZChPYmplY3QgaWQpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZEZvckVkaXQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JSZWFkKE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgbW9kZWwgbWFuYWdlciBpcyB3aXRoaW4gYQotCSAqICJhYm91dFRvQ2hhbmdlIiBhbmQgImNoYW5nZWQiIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGVDaGFuZ2luZygpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgaWQgb2YgdGhlIG1vZGVsLiBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXZvaWQgbW92ZU1vZGVsKE9iamVjdCBvbGRJZCwgT2JqZWN0IG5ld0lkKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgY29udGVudCB0eXBlIG9mIGEgbW9kZWwgY2hhbmdlcy4gSXRzCi0JICogYXNzdW1lZCB0aGUgY29udGVudFR5cGUgaGFzIGFscmVhZHkgYmVlbiBjaGFuZ2VkLCBhbmQgdGhpcyBtZXRob2QgdXNlcwotCSAqIHRoZSB0ZXh0IG9mIHRoZSBvbGQgb25lLCB0byByZXBvcHVsYXRlIHRoZSB0ZXh0IG9mIHRoZSBuZXcgb25lLiBJbgotCSAqIHRoZW9yeSwgdGhlIGFjdHVhbCBpbnN0YW5jZSBjb3VsZCBjaGFuZ2UsIChlLmcuIHVzaW5nICdzYXZlQXMnIHRvIGdvCi0JICogZnJvbSB4bWwgdG8gZHRkKSwgYnV0IGluIHByYWN0aWNlLCB0aGUgaW50ZW50IG9mIHRoaXMgQVBJIGlzIHRvIHJldHVybgotCSAqIHRoZSBzYW1lIGluc3RhbmNlLCBqdXN0IHVzaW5nIGRpZmZlcmVudCBoYW5kbGVycywgYWRhcHRlciBmYWN0b3JpZXMsCi0JICogZXRjLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QgdXNlCi0JICogdGhlIGNhY2hlZCB2ZXJzaW9uLCBidXQgZm9yY2VzIHRoZSBjYWNoZWQgdmVyc2lvbiB0byBiZSByZXBsYWNlZCB3aXRoIGEKLQkgKiBmcmVzaCwgdW5jaGFuZ2VkIHZlcnNpb24uIE5vdGU6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGNoYW5nZSBhbnkKLQkgKiByZWZlcmVuY2UgY291bnRzLiBBbHNvLCBpZiB0aGVyZSBpcyBub3QgYWxyZWFkeSBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZQotCSAqIG1vZGVsLCB0aGVuIHRoaXMgY2FsbCBpcyBlc3NlbnRpYWxseSBpZ25vcmVkICh0aGF0IGlzLCBpdCBkb2VzIG5vdCBwdXQKLQkgKiBhIG1vZGVsIGluIHRoZSBjYWNoZSkgYW5kIHJldHVybnMgbnVsbC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgcmVsb2FkTW9kZWwoT2JqZWN0IGlkLCBJbnB1dFN0cmVhbSBpblN0cmVhbSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLQl2b2lkIHNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsU3RhdGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxTdGF0ZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNGU0NzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxTdGF0ZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHRob3NlIHdhbnRpbmcgdG8gbGlzdGVuIHRvIGEgbW9kZWwncyBzdGF0ZSBjaGFuZ2luZy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxTdGF0ZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIEEgbW9kZWwgaXMgYWJvdXQgdG8gYmUgY2hhbmdlZC4gVGhpcyB0eXBpY2FsbHkgaXMgaW5pdGlhdGVkIGJ5IG9uZQotCSAqIGNsaWVudCBvZiB0aGUgbW9kZWwsIHRvIHNpZ25hbCBhIGxhcmdlIGNoYW5nZSBhbmQvb3IgYSBjaGFuZ2UgdG8gdGhlCi0JICogbW9kZWwncyBJRCBvciBiYXNlIExvY2F0aW9uLiBBIHR5cGljYWwgdXNlIG1pZ2h0IGJlIGlmIGEgY2xpZW50IG1pZ2h0Ci0JICogd2FudCB0byBzdXNwZW5kIHByb2Nlc3NpbmcgdW50aWwgYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUuCi0JICovCi0Jdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCk7Ci0KLQkvKioKLQkgKiBTaWduYWxzIHRoYXQgdGhlIGNoYW5nZXMgZm9yZXRvbGQgYnkgbW9kZWxBYm91dFRvQmVDaGFuZ2VkIGhhdmUgYmVlbgotCSAqIG1hZGUuIEEgdHlwaWNhbCB1c2UgbWlnaHQgYmUgdG8gcmVmcmVzaCwgb3IgdG8gcmVzdW1lIHByb2Nlc3NpbmcgdGhhdAotCSAqIHdhcyBzdXNwZW5kZWQgYXMgYSByZXN1bHQgb2YgbW9kZWxBYm91dFRvQmVDaGFuZ2VkLgotCSAqLwotCXZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCBhIG1vZGVsJ3MgZGlydHkgc3RhdGUgaGFzIGNoYW5nZWQsIGFuZCBwYXNzZXMgdGhhdCBzdGF0ZQotCSAqIGluIGlzRGlydHkuIEEgbW9kZWwgYmVjb21lcyBkaXJ0eSB3aGVuIGFueSBjaGFuZ2UgaXMgbWFkZSwgYW5kIGJlY29tZXMKLQkgKiBub3QtZGlydHkgd2hlbiB0aGUgbW9kZWwgaXMgc2F2ZWQuCi0JICovCi0Jdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSk7Ci0KLQkvKioKLQkgKiBBIG1vZGVsRGVsZXRlZCBtZWFucyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkLiBUaGUKLQkgKiBtb2RlbCBpdHNlbGYgaXMgbm90IHJlbW92ZWQgZnJvbSBtb2RlbCBtYW5hZ2VtZW50IHVudGlsIGFsbCBoYXZlCi0JICogcmVsZWFzZWQgaXQuIE5vdGU6IGJhc2VMb2NhdGlvbiBpcyBub3QgKG5lY2Vzc2FyaWx5KSBjaGFuZ2VkIGluIHRoaXMKLQkgKiBldmVudCwgYnV0IG1heSBub3QgYmUgYWNjdXJhdGUuCi0JICovCi0Jdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIEEgbW9kZWwgaGFzIGJlZW4gcmVuYW1lZCBvciBjb3BpZWQgKGFzIGluIHNhdmVBcy4uKS4gSW4gdGhlIHJlbmFtZWQKLQkgKiBjYXNlLCB0aGUgdHdvIHBhcmFtZW50ZXJzIGFyZSB0aGUgc2FtZSBpbnN0YW5jZSwgYW5kIG9ubHkgY29udGFpbiB0aGUKLQkgKiBuZXcgaW5mbyBmb3IgaWQgYW5kIGJhc2UgbG9jYXRpb24uCi0JICovCi0Jdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQl2b2lkIG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQl2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OGEyNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIG5vZGVzIHRvIGJlIGFkYXB0ZWQuCi0gKiAKLSAqIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIHR5cGUgb2YgYWRhcHRlciAoSUFkYXB0YWJsZSkgYW5kIGJhc2UKLSAqIGFkYXB0ZXIgaXMgdGhhdCB0aGVzZSBhZGFwdGVycyBhcmUgbm90aWZpZWQgb2YgY2hhbmdlcy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICogVGhlIGluZnJhc3RydWN0dXJlIGNhbGxzIHRoaXMgbWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgYWRhcHRlciBpcwotCSAqIGFwcHJvcHJpYXRlIGZvciAndHlwZScuIFR5cGljYWxseSwgYWRhcHRlcnMgcmV0dXJuIHRydWUgYmFzZWQgb24KLQkgKiBpZGVudGl0eSBjb21wYXJpc29uIHRvICd0eXBlJywgYnV0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCB0aGF0IGlzLCB0aGUKLQkgKiBkZWNpc2lvbiBjYW4gYmUgYmFzZWQgb24gY29tcGxleCBsb2dpYy4KLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpOwotCi0JLyoqCi0JICogU2VudCB0byBhZGFwdGVyIHdoZW4gbm90aWZpZXIgY2hhbmdlcy4gRWFjaCBub3RpZmllciBpcyByZXNwb25zaWJsZSBmb3IKLQkgKiBkZWZpbmluZyBzcGVjaWZpYyBldmVudFR5cGVzLCBmZWF0dXJlIGNoYW5nZWQsIGV0Yy4KLQkgKiAKLQkgKiBJU1NVRTogbWF5IGJlIG1vcmUgZXZvbHZhYmxlIGlmIHRoZSBhcmd1bWVudCB3YXMgb25lIGJpZyAnbm90aWZpZXIKLQkgKiBldmVudCcgaW5zdGFuY2UuCi0JICovCi0Jdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lOb2RlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhMjUwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lOb2RlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogSU5vZGVOb3RpZmllcnMgY2FuIGJlIGFkYXB0ZWQgYnkgSU5vZGVBZGFwdGVycy4gVGhpcyBmYWN0b3J5IGludGVyZmFjZQotICogcHJvdmlkZXMgYSB3YXkgdG8gcHJvdmlkZSBmYWN0b3JpZXMgd2hpY2ggYXJlIGludm9rZWQgYnkgdGhlIGluZnJhc3RydWN0dXJlCi0gKiB0byBtYW5hZ2UgdGhpcyBwcm9jZXNzLCBmcm9tIGNyZWF0aW5nLCB0byBhZGFwdGluZywgdG8gcmVsZWFzaW5nLCBpZgotICogcmVxdWlyZWQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIGFuIGFkYXB0ZXIgZmFjdG9yeSBpcyB0byBjcmVhdGUgYW4gYWRhcHRlciBhbmQKLQkgKiBhc3NvY2lhdGUgaXQgd2l0aCBhbiBJTm9kZU5vdGlmaWVyLiBUaGlzIGFkYXB0IG1ldGhvZCBNZXRob2QgdGhhdAotCSAqIHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuIFRoZQotCSAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIGFkZEFkYXB0ZXIgb24gdGhlIGFkYXB0ZWQKLQkgKiBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciwgaWYgYXBwcm9wcmlhdGUuCi0JICogCi0JICogTm90ZTogdGhlIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIHJldHVybmVkIG1heSBiZSBhIHNpbmdsZXRvbiBvciBub3QKLQkgKiAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUgSU5vZGVBZGFwdGVyIC4uLiBidXQgaW4gZ2VuZXJhbCBpdCBpcwotCSAqIHJlY29tbWVuZGVkIGZvciBhbiBhZGFwdGVyIHRvIGJlIHN0YXRlbGVzcywgc28gdGhlIGVmZmljaWVuY2llcyBvZiBhCi0JICogc2luZ2xldG9uIGNhbiBiZSBnYWluZWQuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIG5vZGUgbm90aWZpZXIgdG8gYmUgYWRhcHRlZAotCSAqLwotCUlOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG9iamVjdCk7Ci0KLQkvKioKLQkgKiBVbmxpa2UgY2xvbmUsIHRoaXMgbWV0aG9kIG1heSBvciBtYXkgbm90IHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSwgc3VjaAotCSAqIGFzIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBJQWRhcHRlckZhY3RvcnkgaXMgaW50ZW5kZWQgdG8gYmUgYSBzaW5nbGV0b24uCi0JICogCi0JICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCk7Ci0KLQkvKioKLQkgKiBpc0ZhY3RvcnlGb3JUeXBlIGlzIGNhbGxlZCBieSBpbmZyYXN0cnVjdHVyZSB0byBkZWNpZGUgaWYgdGhpcyBhZGFwdGVyCi0JICogZmFjdG9yeSBpcyBhcHBvcmlhdGUgdG8gdXNlIGZvciBhbiBhZGFwdGVyIHJlcXVlc3QgdGhhdCBzcGVjaWZpZXMKLQkgKiAndHlwZScuCi0JICogCi0JICogQHBhcmFtIHR5cGUgLQotCSAqICAgICAgICAgICAgc2FtZSBvYmplY3QgdXNlZCB0byBpZGVudGlmeS9yZXF1ZXN0IGFkYXB0ZXJzLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBmYWN0b3J5IGlzIGFwcHJvcHJpYXRlIGZvciB0eXBlLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKTsKLQotCS8qKgotCSAqIHJlbGVhc2UgaXMgY2FsbGVkIGJ5IGluZnJhc3RydWN0dXJlIHdoZW4gdGhlIGZhY3RvcnkgcmVnaXN0cnkgaXMKLQkgKiByZWxlYXNlZCAod2hpY2ggaXMgZG9uZSB3aGVuIGEgc3RydWN0dXJlZCBtb2RlbCBpcyByZWxlYXNlZCkuIFRoaXMKLQkgKiBpbnRlbmVkIGZvciB0aGUgZmFjdG9yeSB0byBiZSBhbGxvd2VkIHRvIGNsZWFuIHVwIGFueSBzdGF0ZSBpbmZvcm1hdGlvbgotCSAqIGl0IG1heSBoYXZlLgotCSAqIAotCSAqIE5vdGU6IHdoaWxlIG5vdCByZWNvbW1lbmRlZCwgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGlmIGluZGl2aWR1YWwKLQkgKiBhZGFwdGVycyBuZWVkIHNvbWUgY2xlYW51cCAob3IgbmVlZCB0byBiZSByZWxlYXNlZCkgaXQgaXMgKHR5cGljYWxseSkKLQkgKiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeSB0byB0cmFjayB0aGVtLCBhbmQgaW5pdGlhdGUKLQkgKiB3aGF0IGV2ZXIgY2xlYW4gdXAgaXMgbmVlZGVkLiBJbiBvdGhlciB3b3JrcywgY2xlYW51cCBhdCB0aGUgYWRhdHBlcgotCSAqIGxldmVsIGlzIG5vdCBwcm92aWRlZCBieSBpbmZyYXN0cnVjdHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVOb3RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZU5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZDE4ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZU5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBJTm9kZU5vdGlmaWVycyBhbmQgSU5vZGVBZGFwdGVycyBmb3JtIGEgY29sbGFib3JhdGlvbiB0aGF0IGFsbG93cyBjbGllbnRzCi0gKiB0byB1c2UgdGhlIHR5cGljYWwgYWRhcHRlciBwYXR0ZXJuIGJ1dCB3aXRoIG5vdGlmaWNhdGlvbiBhZGRlZCwgdGhhdCBpcywKLSAqIGNsaWVudCdzIGFkYXB0ZXJzIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgbm9kZU5vdGlmaWVyIGNoYW5nZXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVOb3RpZmllciB7Ci0KLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYSBub24tc3RydWN0dXJhbCBjaGFuZ2UsIHNlbnQgdG8gbm9kZSBub3RpZmllcidzCi0JICogcGFyZW50LgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFID0gMTsKLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYW4gYWRkIGV2ZW50LgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQUREID0gMjsKLQotCS8qKgotCSAqIFRoZSBjaGFuZ2UgcmVwcmVzZW50cyBhIHJlbW92ZSBldmVudC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYSBzdHJ1Y3R1cmFsIGNoYW5nZSwgc2VudCB0byBsZWFzdC1jb21tb24gcGFyZW50Ci0JICogb2Ygbm9kZSBub3RpZmllcnMgaW52b2x2ZWQgaW4gdGhlIHN0cnVjdHVyYWwgY2hhbmdlCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBTVFJVQ1RVUkVfQ0hBTkdFRCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYSBub3RpZmljYXRpb24gdG8gcGFyZW50IG5vdGlmaWVyIHRoYW4gaXRzCi0JICogY29udGVudHMgaGF2ZSBjaGFuZ2VkLgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9DSEFOR0VEID0gNTsKLQotCi0JLyoqCi0JICogTk9UIEFQSTogdGhlc2Ugc3RyaW5ncyBhcmUgZm9yIHByaW50aW5nLCBzdWNoIGFzIGR1cmluZyBkZWJ1Z2luZwotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFVkVOVF9UWVBFX1NUUklOR1MgPSBuZXcgU3RyaW5nW117InVuZGVmaW5lZCIsICJDSEFOR0UiLCAiQUREIiwgIlJFTU9WRSIsICJTVFJVQ1VUUkVEX0NIQU5HRUQiLCAiQ09OVEVOVF9DSEFOR0VEIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0KLQotCS8qKgotCSAqIEFkZCBhbiBhZGFwdGVyIG9mIHRoaXMgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiAgICAgICAgICAgIHRoZSBhZGFwdGVyIHRvIGJlIGFkZGVkCi0JICogCi0JICovCi0Jdm9pZCBhZGRBZGFwdGVyKElOb2RlQWRhcHRlciBhZGFwdGVyKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBleGlzaXRpbmcgYWRhcHRlciBvZiB0eXBlICJ0eXBlIiBvciBpZiBub25lIGZvdW5kIGNyZWF0ZSBhCi0JICogbmV3IGFkYXB0ZXIgdXNpbmcgYSByZWdpc3RlcmVkIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCUlOb2RlQWRhcHRlciBnZXRBZGFwdGVyRm9yKE9iamVjdCB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHJlYWQtb25seSBDb2xsZWN0aW9uIG9mIHRoZSBBZGFwdGVycyB0byB0aGlzIG5vdGlmaWVyLgotCSAqIAotCSAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiBhZGFwdGVycy4KLQkgKi8KLQlDb2xsZWN0aW9uIGdldEFkYXB0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZXhpc2l0aW5nIGFkYXB0ZXIgb2YgdHlwZSAidHlwZSIgb3IgbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JSU5vZGVBZGFwdGVyIGdldEV4aXN0aW5nQWRhcHRlcihPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKiBzZW50IHRvIGFkYXB0ZXIgd2hlbiBpdHMgbm9kZU5vdGlmaWVyIGNoYW5nZXMuCi0JICovCi0Jdm9pZCBub3RpZnkoaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcyk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYW4gYWRhcHRlciBvZiB0aGlzIG5vdGlmaWVyLiBJZiB0aGUgYWRhcHRlciBkb2VzIG5vdCBleGlzdCBmb3IKLQkgKiB0aGlzIG5vZGUgbm90aWZpZXIsIHRoaXMgcmVxdWVzdCBpcyBpZ25vcmVkLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogICAgICAgICAgICB0aGUgYWRhcHRlciB0byByZW1vdmUKLQkgKi8KLQl2b2lkIHJlbW92ZUFkYXB0ZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JU3RydWN0dXJlZE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lTdHJ1Y3R1cmVkTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3MGU5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lTdHJ1Y3R1cmVkTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotCi0KLS8qKgotICogSVN0cnVjdHVyZWRNb2RlbHMgYXJlIG1haW5seSBpbnRlcmVzdGluZyBieSB0aGVpciBleHRlbnNpb25zIGFuZAotICogaW1wbGVtZW50ZXJzLiBUaGUgbWFpbiBwdXJwb3NlZCBvZiB0aGlzIGFic3RyYWN0aW9uIGlzIHRvIHByb3ZpZGUgYSBjb21tb24KLSAqIG1lYW5zIHRvIG1hbmFnZSBtb2RlbHMgdGhhdCBoYXZlIGFuIGFzc29jaWF0ZWQgc3RydWN0dXJlZCBkb2N1bWVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMi4wCi0gKiAKLSAqIDxwPgotICogSVNTVUU6IHRoaXMgaW50ZXJmYWNlIG5lZWRzIHRvbiBvZiBjbGVhbnVwIQotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkTW9kZWwgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGNsaWVudHMgdG8gZGVjbGFyZSB0aGF0IHRoZXkgYXJlIGFib3V0IHRvIG1ha2UgYQotCSAqICJsYXJnZSIgY2hhbmdlIHRvIHRoZSBtb2RlbC4gVGhpcyBjaGFuZ2UgbWlnaHQgYmUgaW4gdGVybXMgb2YgY29udGVudAotCSAqIG9yIGl0IG1pZ2h0IGJlIGluIHRlcm1zIG9mIHRoZSBtb2RlbCBpZCBvciBiYXNlIGxvY2F0aW9uLgotCSAqIAotCSAqIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBlbWJlZGRlZCBjYWxscywgbm90aWZpY2F0aW9uIHRvIGxpc3RlbmVycyBpcwotCSAqIHNlbnQgb25seSBvbmNlLgotCSAqIAotCSAqIE5vdGUgdGhhdCB0aGUgY2xpZW50IHdobyBpcyBtYWtpbmcgdGhlc2UgY2hhbmdlcyBoYXMgdGhlIHJlc3BvbnNpYmlsaXR5Ci0JICogdG8gcmVzdG9yZSB0aGUgbW9kZWwncyBzdGF0ZSBvbmNlIGZpbmlzaGVkIHdpdGggdGhlIGNoYW5nZXMuIFNlZQotCSAqIGdldE1lbWVudG8gYW5kIHJlc3RvcmVTdGF0ZS4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kIGlzTW9kZWxTdGF0ZUNoYW5naW5nIGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRldGVybWluZSBpZgotCSAqIHRoZSBtb2RlbCBpcyBhbHJlYWR5IGluIGEgY2hhbmdlIHNlcXVlbmNlLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyIHRvIGNoYW5nZWRNb2RlbCwgYW5kIG11c3QgYmUgY2FsbGVkCi0JICogYmVmb3JlIGNoYW5nZWRNb2RlbC4gQSBjbGllbnQgc2hvdWxkIG5ldmVyIGNhbGwgY2hhbmdlZE1vZGVsIHdpdGhvdXQKLQkgKiBjYWxsaW5nIGFib3V0VG9DaGFuZ2VNb2RlbCBmaXJzdCBub3IgY2FsbCBhYm91dFRvQ2hhbmdlTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgY2hhbmdlZE1vZGVsIGxhdGVyIGZyb20gdGhlIHNhbWUgVGhyZWFkLgotCSAqLwotCXZvaWQgYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQl2b2lkIGFkZE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0Jdm9pZCBhZGRNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgY29udHJvbGxlZCB3YXkgb2Ygbm90aWZ5aW5nIGFsbCBNb2RlbEV2ZW50Ci0JICogbGlzdGVuZXJzIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZAotCSAqIHBhaXIgdG8gYWJvdXRUb0NoYW5nZU1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWJvdXRUb0NoYW5nZU1vZGVsCi0JICogLi4uIG9yIHNvbWUgbGlzdGVuZXJzIGNvdWxkIGJlIGxlZnQgd2FpdGluZyBpbmRlZmluaXRlbHkgZm9yIHRoZQotCSAqIGNoYW5nZWQgZXZlbnQuIFNvLCBpdHMgc3VnZ2VzdGVkIHRoYXQgY2hhbmdlZE1vZGVsIGFsd2F5cyBiZSBpbiBhCi0JICogZmluYWxseSBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwKLQkgKiB3aXRob3V0IGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LgotCSAqIAotCSAqIEluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqIAotCSAqLwotCXZvaWQgY2hhbmdlZE1vZGVsKCk7Ci0KLQlsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChJUmVzb3VyY2UgcmVzb3VyY2UpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNvcHkoU3RyaW5nIGlkKSB0aHJvd3MgUmVzb3VyY2VJblVzZSwgUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotCi0JLyoqCi0JICogRGlzYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0Jdm9pZCBkaXNhYmxlVW5kb01hbmFnZW1lbnQoKTsKLQotCS8qKgotCSAqIEVuYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0Jdm9pZCBlbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRW5kIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIEVuZCByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgYSBjbGllbnQtZGVmaW5lZCB2YWx1ZSBmb3Igd2hhdCB0aGF0IGNsaWVudCAoYW5kL29yIGxvYWRlcikKLQkgKiBjb25zaWRlcnMgdGhlICJiYXNlIiBvZiB0aGUgc3RydWN0dXJlZCBtb2RlbC4gRnJlcXVlbnRseSB0aGUgbG9jYXRpb24KLQkgKiBpcyBlaXRoZXIgYSB3b3Jrc3BhY2Ugcm9vdC1yZWxhdGl2ZSBwYXRoIG9mIGEgd29ya3NwYWNlIHJlc291cmNlIG9yIGFuCi0JICogYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0JICovCi0JU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCBjb250ZW50IHR5cGUgaWRlbnRpZmllciAoU3RyaW5nKSBmb3IgdGhpcyBtb2RlbC4KLQkgKi8KLQlTdHJpbmcgZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBtb2RlbCdzIEZhY3RvcnlSZWdpc3RyeS4gQSBtb2RlbCBpcyBub3QgdmFsaWQgd2l0aG91dCBvbmUuCi0JICovCi0JRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JLyoqCi0JICogVGhlIGlkIGlzIHRoZSBpZCB0aGF0IHRoZSBtb2RlbCBtYW5hZ2VyIHVzZXMgdG8gaWRlbnRpZnkgdGhpcyBtb2RlbAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgYSB0ZXh0IG9mZnNldCB3aXRoaW4gdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIGFuIEluZGV4ZWRSZWdpb24gY29udGFpbmluZyB0aGlzIG9mZnNldCBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpOwotCi0JSU1vZGVsSGFuZGxlciBnZXRNb2RlbEhhbmRsZXIoKTsKLQotCUlNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICogCi0JICogQHJldHVybiB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwKLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZWRpdC1yZXNwb25zaWJsZSByZWZlcmVuY2UgY291bnQgb2YKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwgVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogICAgICAgICAgICBub3QgdG8gdXNlIHRoaXMgZnVuY3Rpb24KLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlYWRlciByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICovCi0JaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yUmVhZCgpOwotCi0JT2JqZWN0IGdldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YSgpOwotCi0JLyoqCi0JICogR2V0IFVSSSByZXNvbHV0aW9uIGhlbHBlcgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JVVJJUmVzb2x2ZXIgZ2V0UmVzb2x2ZXIoKTsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBtb2RpZmljYXRpb24gZGF0ZSBvZiB1bmRlcmx5aW5nIHJlc291cmNlLCB3aGVuIHRoaXMgbW9kZWwgd2FzIG9wZW4sIG9yCi0JICogbGFzdCBzYXZlZC4gKE5vdGU6IGZvciB0aGlzIHZlcnNpb24sIHRoZSBjbGllbnQgbXVzdCBtYW5hZ2UgdGhlCi0JICogYWNjdXJhY3kgb2YgdGhpcyBkYXRhKQotCSAqLwotCWxvbmcgZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQotCS8qKgotCSAqIEdldCB1bmRvIG1hbmFnZXIuCi0JICovCi0JSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNOZXcoKTsKLQotCWJvb2xlYW4gaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgaWYgdGhlIG1vZGVsIGlzIGRpcnR5IGFuZCBpZiB0aGUgbW9kZWwgaXMKLQkgKiBzaGFyZWQgZm9yIHdyaXRlIGFjY2Vzcy4gVGhlIGxhc3Qgd3JpdGVyIGFzIHRoZSByZXNwb25zaWJpbGl0eSB0byBiZQotCSAqIHN1cmUgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGVpdGhlciBpc1NoYXJlZEZvclJlYWQgb3IgaXNTaGFyZWRGb3JFZGl0Ci0JICogaXMgdHJ1ZS4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JFZGl0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCWJvb2xlYW4gaXNTaGFyZWRGb3JSZWFkKCk7Ci0KLQkvKioKLQkgKiBuZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhhdCB0aGUgbmV3SW5zdGFuY2UgY29udGFpbnMKLQkgKiBubyBjb250ZW50LiBJdHMgcHVycG9zZSBpcyBzbyBjbGllbnRzIGNhbiBnZXQgYSB0ZW1wb3JhcnksIHVubWFuYWdlZCwKLQkgKiBtb2RlbCBvZiB0aGUgc2FtZSAidHlwZSIgYXMgdGhlIG9yaWdpbmFsLiBOb3RlOiB0aGUgY2xpZW50IG1heSBzdGlsbAotCSAqIG5lZWQgdG8gZG8gc29tZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgbW9kZWwgcmV0dXJuZWQgYnkgbmV3SW5zdGFuY2UsCi0JICogZGVwZW5kaW5nIG9uIGRlc2lyZWQgdXNlLiBGb3IgZXhhbXBsZSwgdGhlIG9ubHkgZmFjdG9yaWVzIGluIHRoZQotCSAqIG5ld0luc3RhbmNlIGFyZSB0aG9zZSB0aGF0IHdvdWxkIGJlIG5vcm1hbGx5IGJlIGNyZWF0ZWQgZm9yIGEgbW9kZWwgb2YKLQkgKiB0aGUgZ2l2ZW4gY29udGVudFR5cGUuIE90aGVycyBhcmUgbm90IGNvcGllZCBhdXRvbWF0aWNhbGx5LCBhbmQgaWYKLQkgKiBkZXNpcmVkLCBzaG91bGQgYmUgYWRkZWQgYnkgY2xpZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3SW5zdGFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHJlaW5pdGlhbGl6YXRpb24gcHJvY2VkdXJlLiBGb3IgdGhpcyBtb2RlbC4gTm90ZSBmb3IgZnV0dXJlOgotCSAqIHRoZXJlIG1heSBiZSBhIGRheSB3aGVyZSB0aGUgbW9kZWwgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBpcyBhCi0JICogZGlmZmVyZW50IGluc3RhbmNlIHRoYW4gdGhlIGluc3RhbmNlIGl0IHdhcyBjYWxsZWQgb24uIFRoaXMgd2lsbCBvY2N1cgotCSAqIHdoZW4gdGhlcmUgaXMgZnVsbCBzdXBwb3J0IGZvciAic2F2ZSBhcyIgdHlwZSBmdW5jdGlvbnMsIHdoZXJlIHRoZQotCSAqIG1vZGVsIGNvdWxkIHRoZW9yZXRpY2FsbHkgY2hhbmdlIGNvbXBsZXRlbHkuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWluaXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqIAotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21FZGl0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqIAotCSAqLwotCXZvaWQgcmVsZWFzZUZyb21SZWFkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJlcGxlbmlzaGVzIHRoZSBtb2RlbCB3aXRoIHRoZSByZXNvdXJjZSB3aXRob3V0IHNhdmluZwotCSAqIGFueSBwb3NzaWJsZSBjaGFuZ2VzLiBJdCBpcyB1c2VkIHdoZW4gb25lIGVkaXRvciBtYXkgYmUgY2xvc2luZywgYW5kCi0JICogc3BlY2lmaWNhbGx5IHNheXMgbm90IHRvIHNhdmUgdGhlIG1vZGVsLCBidXQgYW5vdGhlciAiZGlzcGxheSIgb2YgdGhlCi0JICogbW9kZWwgc3RpbGwgbmVlZHMgdG8gaGFuZyBvbiB0byBzb21lIG1vZGVsLCBzbyBuZWVkcyBhIGZyZXNoIGNvcHkuCi0JICogCi0JICogT25seSB2YWxpZCBmb3IgdXNlIHdpdGggbWFuYWdlZCBtb2RlbHMuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXZvaWQgcmVtb3ZlTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQl2b2lkIHJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEEgbWV0aG9kIHRoYXQgbW9kaWZpZXMgdGhlIG1vZGVsJ3Mgc3luY2hyb25pemF0aW9uIHN0YW1wIHRvIG1hdGNoIHRoZQotCSAqIHJlc291cmNlLiBUdXJucyBvdXQgdGhlcmUncyBzZXZlcmFsIHdheXMgb2YgZG9pbmcgaXQsIHNvIHRoaXMgZW5zdXJlcyBhCi0JICogY29tbW9uIGFsZ29yaXRobS4KLQkgKi8KLQl2b2lkIHJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoSVJlc291cmNlIHJlc291cmNlKTsKLQotCXZvaWQgcmVzb3VyY2VEZWxldGVkKCk7Ci0KLQl2b2lkIHJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQl2b2lkIHNhdmUoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQl2b2lkIHNhdmUoRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBzYXZlKElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQl2b2lkIHNhdmUoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQl2b2lkIHNldEJhc2VMb2NhdGlvbihTdHJpbmcgbmV3QmFzZUxvY2F0aW9uKTsKLQotCXB1YmxpYyB2b2lkIHNldERpcnR5U3RhdGUoYm9vbGVhbiBkaXJ0eVN0YXRlKTsKLQotCXZvaWQgc2V0RmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSk7Ci0KLQkvKioKLQkgKiBUaGUgaWQgaXMgdGhlIGlkIHRoYXQgdGhlIG1vZGVsIG1hbmFnZXIgdXNlcyB0byBpZGVudGlmeSB0aGlzIG1vZGVsCi0JICovCi0Jdm9pZCBzZXRJZChTdHJpbmcgaWQpIHRocm93cyBSZXNvdXJjZUluVXNlOwotCi0Jdm9pZCBzZXRNb2RlbEhhbmRsZXIoSU1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIpOwotCi0Jdm9pZCBzZXRNb2RlbE1hbmFnZXIoSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIpOwotCi0JcHVibGljIHZvaWQgc2V0TmV3U3RhdGUoYm9vbGVhbiBuZXdTdGF0ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIGEgImZsYWciIHRoYXQgcmVpbml0aWFsaXphdGlvbiBpcyBuZWVkZWQuCi0JICovCi0Jdm9pZCBzZXRSZWluaXRpYWxpemVOZWVkZWQoYm9vbGVhbiBiKTsKLQotCS8qKgotCSAqIEhvbGRzIGFueSBkYXRhIHRoYXQgdGhlIHJlaW5pdGlhbGl6YXRpb24gcHJvY2VkdXJlIG1pZ2h0IGZpbmQgdXNlZnVsIGluCi0JICogcmVpbml0aWFsaXppbmcgdGhlIG1vZGVsLiBUaGlzIGlzIGhhbmR5LCBzaW5jZSB0aGUgcmVpbml0aWFsaXphdGlvbiBtYXkKLQkgKiBub3QgdGFrZSBwbGFjZSBhdCBvbmNlLCBhbmQgc29tZSAib2xkIiBkYXRhIG1heSBiZSBuZWVkZWQgdG8gcHJvcGVybHkKLQkgKiB1bmRvIHByZXZpb3VzIHNldHRpbmdzLiBOb3RlOiB0aGUgcGFyYW1ldGVyIHdhcyBpbnRlbnRpb25hbGx5IG1hZGUgdG8KLQkgKiBiZSBvZiB0eXBlICdPYmplY3QnIHNvIGRpZmZlcmVudCBtb2RlbHMgY2FuIHVzZSBpbiBkaWZmZXJlbnQgd2F5cy4KLQkgKi8KLQl2b2lkIHNldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YShPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIFNldCB0aGUgVVJJIHJlc29sdXRpb24gaGVscGVyCi0JICovCi0Jdm9pZCBzZXRSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlcik7Ci0KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkvKioKLQkgKiBTZXQgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JbmRleGVkUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0luZGV4ZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5YjdiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0luZGV4ZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIFRoaXMgdHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIHBvc2l0aW9ucyBhbmQgbGVuZ3RocyBpbiBzb3VyY2UuIE5vdGljZSB0aGF0Ci0gKiB3aGlsZSBnZXRFbmRPZmZzZXQgYW5kIGdldExlbmd0aCBhcmUgcmVkdW5kYW50LCBnaXZlbiB0aGF0Ci0gKiAKLSAqIDxwcmU+Ci0gKiA8Y29kZT4KLSAqICAgICAgICAgIGdldEVuZE9mZnNldCgpID09IGdldFN0YXJ0T2Zmc2V0KCkgKyBnZXRMZW5ndGgoKTsgCi0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIAotICogd2UgcHJvdmlkZSAocmVxdWlyZSkgYm90aCBzaW5jZSBpbiBzb21lIGNhc2VzIGltcGxlbWVudG9ycyBtYXkgYmUgYWJsZSB0bwotICogcHJvdmlkZSBvbmUgb3IgdGhlIG90aGVyIG1vcmUgZWZmaWNpZW50bHkuCi0gKiAKLSAqIE5vdGU6IGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgY29udHJhY3QgdGhhdCBpbXBsZW1lbnRvcnMgb2YgSW5kZXhlZFJlZ2lvbiAtLQotICogYXMgYSB3aG9sZSBjb2xsZWN0aW9uIGZvciBhIHBhcnRpY3VsYXIgc291cmNlIC0tIG11c3QgY29tcGxldGVseSBjb3ZlciB0aGUKLSAqIG9yaWdpbmFsIHNvdXJjZS4gVGhleSBjdXJyZW50bHkgb2Z0ZW4gZG8sIHNvIHRob3VnaHQgSSdkIG1lbnRpb24gZXhwbGljaXRseQotICogdGhpcyBtYXkgbm90IGFsd2F5cyBiZSB0cnVlLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJbmRleGVkUmVnaW9uIHsKLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIHRlc3QgaWYgdGhlIGluZGV4ZWQgcmVnaW9ucyBjb250YWlucyB0aGUgdGVzdCBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdFBvc2l0aW9uCi0JICogQHJldHVybiB0cnVlIGlmIHRlc3QgcG9zaXRpb24gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHN0YXJ0IG9mZnNldAotCSAqICAgICAgICAgYW5kIGxlc3MgdGhhbiBzdGFydCBvZmZzZXQgcGx1cyBsZW5ndGguCi0JICovCi0JYm9vbGVhbiBjb250YWlucyhpbnQgdGVzdFBvc2l0aW9uKTsKLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIGdldCBlbmQgb2Zmc2V0IG9mIHNvdXJjZSB0ZXh0LCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YKLQkgKiBkb2N1bW50LiBJbXBsZW1lbnRlcnMgc2hvdWxkIHJldHVybiAtMSBpZiwgb3Igc29tZSByZWFzb24sIHRoZSByZWdpb24KLQkgKiBpcyBub3QgdmFsaWQuCi0JICogCi0JICogQHJldHVybiBlbmRvZmZzZXQKLQkgKi8KLQlpbnQgZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBDYW4gYmUgdXNlZCB0byBnZXQgc291cmNlIHBvc3Rpb24gb2YgYmVnaW5uaW5nIG9mIGluZGV4ZWQgcmVnaW9uLgotCSAqIEltcGxlbWVudGVycyBzaG91bGQgcmV0dXJuIC0xIGlmLCBvciBzb21lIHJlYXNvbiwgdGhlIHJlZ2lvbiBpcyBub3QKLQkgKiB2YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCBwb3NpdGlvbiBvZiBzdGFydCBvZiBpbmRleCByZWdpb24uCi0JICovCi0JaW50IGdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBDYW4gYmUgdXNlZCB0byBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc291cmNlIHRleHQuIEltcGxlbWVudGVycyBzaG91bGQKLQkgKiByZXR1cm4gLTEgaWYsIG9yIHNvbWUgcmVhc29uLCB0aGUgcmVnaW9uIGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCBwb3NpdGlvbiBvZiBsZW5ndGggb2YgaW5kZXggcmVnaW9uLgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEzNjkyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBDbGFzcyB0byBhbGxvdyBhY2Nlc3MgdG8gTW9kZWxNYW5hZ2VyLiBOb3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgb25lIHRoYXQgaXMgaW4KLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHRydWN0dXJlZE1vZGVsTWFuYWdlcgotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1vZGVsTWFuYWdlciB7Ci0JLyoqCi0JICogRG8gbm90IGFsbG93IGluc3RhbmNlcyB0byBiZSBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZE1vZGVsTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGluc3RhbmNlIG9mIElNb2RlbE1hbmFnZXIuIFJldHVybnMgbnVsbCBpZiBtb2RlbAotCSAqIG1hbmFnZXIgY2FuIG5vdCBiZSBjcmVhdGVkIG9yIGlzIG5vdCB2YWxpZCAoc3VjaCBhcywgd2hlbiB3b3JrYmVuY2ggaXMKLQkgKiBzaHV0dGluZyBkb3duKS4KLQkgKiAKLQkgKiBAcmV0dXJuIElNb2RlbE1hbmFnZXIgLSByZXR1cm5zIHRoZSBvbmUgbW9kZWwgbWFuYWdlciBmb3Igc3RydWN0dXJlZAotCSAqICAgICAgICAgbW9kZWwKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgb25lIHRoYXQgaXMgaW4KLQkgKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3R0cnVjdHVyZWRNb2RlbE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlib29sZWFuIGlzUmVhZHkgPSBmYWxzZTsKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCQl3aGlsZSAoIWlzUmVhZHkpIHsKLQkJCUJ1bmRsZSBsb2NhbEJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShTU0VDb3JlUGx1Z2luLklEKTsKLQkJCWludCBzdGF0ZSA9IGxvY2FsQnVuZGxlLmdldFN0YXRlKCk7Ci0JCQlpZiAoc3RhdGUgPT0gQnVuZGxlLkFDVElWRSkgewotCQkJCWlzUmVhZHkgPSB0cnVlOwotCQkJCS8vIGdldEluc3RhbmNlIGlzIGEgc3luY2hyb25pemVkIHN0YXRpYyBtZXRob2QuCi0JCQkJbW9kZWxNYW5hZ2VyID0gTW9kZWxNYW5hZ2VySW1wbC5nZXRJbnN0YW5jZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoc3RhdGUgPT0gQnVuZGxlLlNUQVJUSU5HKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZSwganVzdCBsb29wIGFnYWluCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoc3RhdGUgPT0gQnVuZGxlLlNUT1BQSU5HIHx8IHN0YXRlID09IEJ1bmRsZS5VTklOU1RBTExFRCkgewotCQkJCWlzUmVhZHkgPSB0cnVlOwotCQkJCW1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBub3Qgc3VyZSBhYm91dCBvdGhlciBzdGF0ZXMsICdyZXNvbHZlZCcsICdpbnN0YWxsZWQnCi0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUVuY29kZWREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRW5jb2RlZERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNjQ3MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRW5jb2RlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBzdHJpY3RseSB0byBkZWZpbmUgaW1wb3J0YW50ICJkb2N1bWVudCBwcm9wZXJ0aWVzIiBub3QKLSAqIGZvdW5kIGluIElEb2N1bWVudCwgYnV0IG5vdCBjZW50cmFsIHRvICJTdHJ1Y3R1cmVkRG9jdW1lbnQiLgotICogCi0gKiBJdHMgbm90IHRvIGJlIGJlIGltcGxtZW50ZWQgYnkgY2xpZW50cy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJRW5jb2RlZERvY3VtZW50IGV4dGVuZHMgSURvY3VtZW50IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuY29kaW5nIG1lbWVudG8gZm9yIHRoaXMgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKi8KLQlFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgbGluZSBkZWxpbWl0ZXIgZm9yIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JU3RyaW5nIGdldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGVuY29kaW5nIG1lbWVudG8gZm9yIHRoaXMgZG9jdW1lbnQuCi0JICogCi0JICogSXMgbm90IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLCBvbmx5IGRvY3VtZW50IGNyZWF0aW9uIGNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIGxvY2FsRW5jb2RpbmdNZW1lbnRvCi0JICovCi0Jdm9pZCBzZXRFbmNvZGluZ01lbWVudG8oRW5jb2RpbmdNZW1lbnRvIGxvY2FsRW5jb2RpbmdNZW1lbnRvKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHByZWZlcnJlZExpbmVEZWxpbWl0ZXIuIElzIG5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seQotCSAqIGRvY3VtZW50IGNyZWF0aW9uIGNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIHByb2JhYmxlTGluZURlbGltaXRlcgotCSAqLwotCXZvaWQgc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihTdHJpbmcgcHJvYmFibGVMaW5lRGVsaW1pdGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU3RydWN0dXJlZERvY3VtZW50UHJvcG9zZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ODMyYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU3RydWN0dXJlZERvY3VtZW50UHJvcG9zZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotCi0vKioKLSAqIEEgSVN0cnVjdHVyZWREb2N1bWVudCBpcyBhIGNvbGxlY3Rpb24gb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy4gSXQncwotICogb2Z0ZW4gY2FsbGVkIGEgImZsYXQgbW9kZWwiIGJlY2F1c2UgaXRzIGRvZXMgY29udGFpbiBzb21lIHN0cnVjdHVyYWwKLSAqIGluZm9ybWF0aW9uLCBidXQgbm90IHZlcnkgbXVjaCwgdXN1YWxseSwgYXQgbW9zdCwgYSBmZXcgbGV2ZWxzIG9mCi0gKiBjb250YWlubWVudC4KLSAqIAotICogQ2xpZW50cyBzaG91bGQgbm90IGltcGxlbWVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkIGV4dGVuZHMgSURvY3VtZW50LCBJRG9jdW1lbnRFeHRlbnNpb24sIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogVGhlIGRvY3VtZW50IGNoYW5naW5nIGxpc3RlbmVycyByZWNlaXZlcyB0aGUgc2FtZSBldmVudHMgYXMgdGhlCi0JICogZG9jdW1lbnQgbGlzdGVuZXJzLCBidXQgdGhlIGRpZmZlcmVuY2UgaXMgdGhlIHRpbWluZyBhbmQKLQkgKiBzeW5jaHJvbml6YXRpb24gb2YgZGF0YSBjaGFuZ2VzIGFuZCBub3RpZmljYXRpb25zLgotCSAqLwotCXZvaWQgYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIHRoaXMgQVBJIGVuc3VyZXMgdGhhdCBhbnkgcG9ydGlvbiBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIHN0YXJ0T2ZmIHRvCi0JICogbGVuZ3RoIGlzIG5vdCByZWFkb25seSAodGhhdCBpcywgdGhhdCBpdHMgZWRpdGFibGUpLiBOb3RlIHRoYXQgaWYgdGhlCi0JICogcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBvdGhlciByZWFkb25seSByZWdpb25zLCB0aG9zZSBvdGhlciByZWFkb25seQotCSAqIHJlZ2lvbnMgd2lsbCBiZSBhZGp1c3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICovCi0Jdm9pZCBjbGVhclJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRydWUgaWYgYW55IHBvcnRpb24gb2Ygc3RhcnRPZmZzZXQgdG8gbGVuZ3RoIGlzIHJlYWRvbmx5Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lvbiBjb250YWluZWQgYnkgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIFJlc3R1cm5zIGEgbGlzdCBvZiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqIAotCSAqIE5vdGU6IHBvc3NpYmx5IGV4cGVuc2l2ZSBjYWxsLCBub3QgdG8gYmUgdXNlZCBjYXN1YWxseS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIFNhbWUgYXMgJ2dldCcgaW4gc3VwZXIgY2xhc3MsIGFkZGVkIGZvciBkZXNjcmlwdGl2ZW5lc3MuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBvZiB0aGlzIGRvY3VtZW50LgotCSAqLwotCVN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBjYXVzZXMgdGhhdCBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCBmcm9tIHN0YXJ0T2Zmc2V0IHRvIGxlbmd0aCB0byBiZQotCSAqIG1hcmtlZCBhcyByZWFkb25seS4gTm90ZSB0aGF0IGlmIHRoaXMgcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBzb21lIG90aGVyCi0JICogcmVnaW9uIHdpdGggaXMgcmVhZG9ubHksIHRoZSByZWdpb25zIGFyZSBlZmZlY3Rpdmx5IGNvbWJpbmVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQl2b2lkIG1ha2VSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogbmV3SW5zdGFuY2UgaXMgc2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IGl0IGNvbnRhaW5zIG5vIGRhdGEuIE9uZQotCSAqIGltcG9ydGFudCB0aGluZyB0byBkdXBsaWNhdGUgaXMgdGhlIHBhcnNlciwgd2l0aCB0aGUgcGFyc2VyIGNvcnJlY3RseQotCSAqICJjbG9uZWQiLCBpbmNsdWRpbmcgaXRzIHRva2VuaW56ZXIsIGJsb2NrIHRhZ3MsIGV0Yy4KLQkgKiAKLQkgKiBOT1RFOiBldmVuIGFmdGVyIG9idGFpbmluZyBhICduZXdJbnN0YW5jZScgdGhlIGNsaWVudCBtYXkgaGF2ZSB0byBkbwotCSAqIHNvbWUgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlLCBpdCBtYXkgbmVlZCB0byBhZGQgaXRzIG93biBtb2RlbAotCSAqIGxpc3RlbmVycy4gT3IsIGFzIGFub3RoZXIgZXhhbXBsZSwgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGEKLQkgKiBwYXJzZXIgb2YgdHlwZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIsIHRoZW4gdGhlIGNsaWVudCBtYXkgbmVlZAotCSAqIHRvIGFkZCBpdHMgb3duIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgdG8gdGhhdCBwYXJzZXIsIGlmIGl0IGlzCi0JICogaW4gZmFjdCBuZWVkZWQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkIG5ld0luc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBUaGUgZG9jdW1lbnQgY2hhbmdpbmcgbGlzdGVuZXJzIHJlY2VpdmVzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGUKLQkgKiBkb2N1bWVudCBsaXN0ZW5lcnMsIGJ1dCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgdGltaW5nIGFuZAotCSAqIHN5bmNocm9uaXphdGlvbiBvZiBkYXRhIGNoYW5nZXMgYW5kIG5vdGlmaWNhdGlvbnMuCi0JICovCi0Jdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogcmVwbGFjZVRleHQgcmVwbGFjZXMgdGhlIHRleHQgZnJvbSBvbGRTdGFydCB0byBvbGRFbmQgd2l0aCB0aGUgbmV3IHRleHQKLQkgKiBmb3VuZCBpbiB0aGUgcmVxdWVzdGVkQ2hhbmdlIHN0cmluZy4gSWYgb2xkU3RhcnQgYW5kIG9sZEVuZCBhcmUgZXF1YWwsCi0JICogaXQgaXMgYW4gaW5zZXJ0aW9uIHJlcXVlc3QuIElmIHJlcXVlc3RlZENoYW5nZSBpcyBudWxsIChvciBlbXB0eSkgaXQgaXMKLQkgKiBhIGRlbGV0ZSByZXF1ZXN0LiBPdGhlcndpc2UgaXQgaXMgYSByZXBsYWNlIHJlcXVlc3QuCi0JICogCi0JICogU2ltaWxhciB0byAncmVwbGFjZScgaW4gc3VwZXIgY2xhc3MuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogTm90ZSwgc2FtZSBhcyByZXBsYWNlVGV4dCBBUEksIGJ1dCB3aWxsIGFsbG93IHJlYWRvbmx5IGFyZWFzIHRvIGJlCi0JICogcmVwbGFjZWQuIFRoaXMgbWV0aG9kIGlzIG5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seQotCSAqIGluZnJhc3RydWN0dXJlLiBGb3IgZXhhbXBsZSwgb25lIGNhc2Ugd2hlcmUgaXRzIG9rIGlzIHdpdGggdW5kbwotCSAqIG9wZXJhdGlvbnMgKHNpbmNlLCBwcmVzdW1hYmx5LCBpZiB1c2VyIGp1c3QgZGlkIHNvbWV0aGluZyB0aGF0Ci0JICogaGFwcGVuZGVkIHRvIGludm9sdmUgc29tZSBpbnNlcnRpbmcgcmVhZG9ubHkgdGV4dCwgdGhleSBzaG91bGQgbm9ybWFsbHkKLQkgKiBiZSBhbGxvd2VkIHRvIHN0aWxsIHVuZG8gdGhhdCBvcGVyYXRpb24uIFRoZXJlIG1pZ2h0IGJlIG90aGVyIGNhc2VzCi0JICogd2hlcmUgaXRzIHVzZWQgdG8gZ2l2ZSB0aGUgdXNlciBhIGNob2ljZSwgZS5nLiAieW91IGFyZSBhYm91dCB0bwotCSAqIG92ZXJ3cml0ZSByZWFkIG9ubHkgcG9ydGlvbnMsIGRvIHlvdSB3YW50IHRvIGNvbnRpbnVlIi4KLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBvdmVycmlkZVJlYWRPbmx5cmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IG9sZFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpOwotCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgVGV4dC4KLQkgKiAKLQkgKiBUaGUgc2V0VGV4dCBtZXRob2QgcmVwbGFjZXMgYWxsIHRleHQgaW4gdGhlIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCByZXF1ZXN0aW5nIHRoZSBkb2N1bWVudCBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBhbGxUZXh0IC0KLQkgKiAgICAgICAgICAgIGFsbCB0aGUgdGV4dCBvZiB0aGUgZG9jdW1lbnQuCi0JICogQHJldHVybiBOZXdEb2N1bWVudEV2ZW50IC0gYmVzaWRlcyBjYXVzaW5nIHRoaXMgZXZlbnQgdG8gYmUgc2VudCB0bwotCSAqICAgICAgICAgZG9jdW1lbnQgbGlzdGVuZXJzLCB0aGUgZXZlbnQgaXMgcmV0dXJuZWQuCi0JICovCi0JTmV3RG9jdW1lbnRFdmVudCBzZXRUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBhbGxUZXh0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuY29kaW5nIG1lbWVudG8gZm9yIHRoaXMgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKi8KLQlFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5lIGRlbGltaXRlciBkZXRlY3RlZCB3aGVuIHRoaXMgZG9jdW1lbnQgd2FzIHJlYWQgZnJvbQotCSAqIHN0b3JhZ2UuCi0JICogCi0JICogQHJldHVybiBsaW5lIGRlbGltaXRlciBkZXRlY3RlZCB3aGVuIHRoaXMgZG9jdW1lbnQgd2FzIHJlYWQgZnJvbQotCSAqICAgICAgICAgc3RvcmFnZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGV0ZWN0ZWRMaW5lRGVsaW1pdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmNvZGluZyBtZW1lbnRvIGZvciB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIElzIG5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seSBkb2N1bWVudCBjcmVhdGlvbiBjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhbEVuY29kaW5nTWVtZW50bwotCSAqLwotCXZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBsb2NhbEVuY29kaW5nTWVtZW50byk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXRlY3RlZCBsaW5lIGRlbGltaXRlciB3aGVuIHRoZSBkb2N1bWVudCB3YXMgcmVhZC4gSXMgbm90IHRvCi0JICogYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgZG9jdW1lbnQgY3JlYXRpb24gY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmFibGVMaW5lRGVsaW1pdGVyCi0JICovCi0Jdm9pZCBzZXREZXRlY3RlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlcik7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd2F5IGZvciBjbGllbnRzIHRvIGNvbXBhcmUgYSBzdHJpbmcgd2l0aCBhCi0JICogcmVnaW9uIG9mIHRoZSBkb2N1bW5ldCwgd2l0aG91dCBoYXZpbmcgdG8gcmV0cmlldmUgKGNyZWF0ZSkgYSBzdHJpbmcKLQkgKiBmcm9tIHRoZSBkb2N1bWVudCwgdGh1cyBtb3JlIGVmZmljaWVudCBvZiBsb3RzIG9mIGNvbXBhcmlzb25zIGJlaW5nCi0JICogZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWdub3JlQ2FzZSAtCi0JICogICAgICAgICAgICBpZiB0cnVlIHRoZSBjaGFyYWN0ZXJzIGFyZSBjb21wYXJlZCBiYXNlZCBvbiBpZGVudGl0eS4gSWYKLQkgKiAgICAgICAgICAgIGZhbHNlLCB0aGUgc3RyaW5nIGFyZSBjb21wYXJlZCB3aXRoIGNhc2UgYWNjb3VudGVkIGZvci4KLQkgKiBAcGFyYW0gdGVzdFN0cmluZyAtCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGNvbXBhcmUuCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBpbiB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBjb21wYXJpc29uLgotCSAqIEBwYXJhbSBsZW5ndGggLQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBpbiB0aGUgZG9jdW1lbnQgdG8gY29tcGFyZSAoTm90ZTogdGVjaG5pY2FsbHksCi0JICogICAgICAgICAgICBjbGllbnRzIGNvdWxkIGp1c3QgcHJvdmlkZSB0aGUgc3RyaW5nLCBhbmQgd2UgY291bGQgaW5mZXIKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggZnJvbSB0aGUgc3RyaW5nIHN1cHBsaWVkLCBidXQgdGhpcyBsZWF2ZXMgZXZlcnkKLQkgKiAgICAgICAgICAgIGNsaWVudCB0byBjb3JyZWN0bHkgbm90IGV2ZW4gYXNrIHVzIGlmIHRoZSB0aGUgc3RyaW5nIGxlbmd0aAotCSAqICAgICAgICAgICAgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgbGVuZ3RoLCBzbyB0aGlzIGlzIGFuIGVmZm9ydCB0bwotCSAqICAgICAgICAgICAgbWF4aW1pemUgcGVyZm9ybWFuY2Ugd2l0aCBjb3JyZWN0IGNvZGUuCi0JICogQHJldHVybiB0cnVlIGlmIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIHN0cmluZ01hdGNoZXMoYm9vbGVhbiBpZ25vcmVDYXNlLCBTdHJpbmcgdGVzdFN0cmluZywgaW50IGRvY3VtZW50T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQkKLQlQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbihpbnQgb2Zmc2V0LCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyB0eXBlKTsKLQkKLQlQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyB0eXBlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvQWJvdXRUb0JlQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0OTY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbmQgdG8gc3RydWN0dXJlZCBkb2N1bWVudCBsaXN0ZW5lcnMuIEl0IGlzIHBlcmZlY3RseQotICogYW5hbGFnb3VzIHRvIGl0cyBjb3JyZXNwb25kaW5nIGpmYWNlIERvY3VtZW50RXZlbnQgYW5kIGlzIHByb3ZpZGVkIHNpbXBseQotICogdG8gYWxsb3cgY2xpZW50cyB0byBkaXN0aW5ndWlzaCB0aGUgc291cmNlIG9mIHRoZSBldmVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBYm91dFRvQmVDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGludm9sdmVkIGluIHRoZSBjaGFuZ2UKLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIKLQkgKiAgICAgICAgICAgIHNvdXJjZSBvZiBvcmlnaW5hbCByZXF1ZXN0Ci0JICogQHBhcmFtIGNoYW5nZXMKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGNoYW5nZXMKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBvZmZzZXQgb2YgcmVxdWVzdAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiAgICAgICAgICAgIGFtb3VudCwgaWYgYW55LCBvZiByZXBsYWNlZCB0ZXh0Ci0JICovCi0JcHVibGljIEFib3V0VG9CZUNoYW5nZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0lNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDQ1NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotCi0KLS8qKgotICogQ2xpZW50cyBjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQgcmVnaXN0ZXIgd2l0aCB0aGUKLSAqIHN0cnVjdHVyZWREb2N1bWVudCB1c2luZyBhZGRBYm91dFRvQmVDaGFuZ2VkTGlzdG5lciB0byBiZSBub3RpZmllZCB0aGF0IHRoZQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGFib3V0IHRvIGJlIGNoYW5nZWQsIGJ1dCBoYXNuJ3QgYmVlbiBjaGFuZ2VkIGF0IHRoZQotICogdGltZSB0aGlzIGV2ZW50IGlzIGZpcmVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQl2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChBYm91dFRvQmVDaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1MzVhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBzaW5jZSB3ZSBub3cgc3ViY2xhc3MgRG9jdW1lbnRFdmVudC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50Q29udGVudEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOGRiNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGUgTmV3RG9jdW1lbnRDb250ZW50RXZlbnQgaXMgZmlyZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiBhCi0gKiBJU3RydWN0dXJlZERvY3VtZW50IHJlcGxhY2VzIGFsbCBvZiBpdHMgdGV4dC4KLSAqIAotICogSVNTVUU6IG5vdCBjdXJyZW50bHkgdXNlZCwgYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSBlZmZpY2llbmNpZXMgdG8gYmUgaGFkIHNvCi0gKiBwbGFuIHRvIGltcGxlbWVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdEb2N1bWVudENvbnRlbnRFdmVudCBleHRlbmRzIE5ld0RvY3VtZW50RXZlbnQgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgcmVxdWVzdGVyIG9mIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgTmV3RG9jdW1lbnRDb250ZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgT2JqZWN0IG9yaWdpbmFsUmVxdWVzdGVyKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3Rlcik7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5YTczYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9OZXdEb2N1bWVudEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogVGhlIE5ld0RvY3VtZW50RXZlbnQgaXMgZmlyZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnQKLSAqIHNldHMgb3IgcmVwbGFjZXMgYWxsIG9mIGl0cyB0ZXh0LgotICogCi0gKiBJU1NVRTogbmVlZCB0byBjaGFuZ2Ugc28gdGhpcyBpcyB1c2VkIGZvciAnc2V0JyBvbmx5LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0RvY3VtZW50RXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIE5ld0RvY3VtZW50RXZlbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBiZWluZyBjaGFuZ2VkCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICBzb3VyY2Ugb2YgcmVxdWVzdAotCSAqLwotCXB1YmxpYyBOZXdEb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlcikgewotCQlzdXBlcihkb2N1bWVudCwgb3JpZ2luYWxSZXF1ZXN0ZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBpbnQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXNuJ3QgbWVhbiBxdWl0ZSB0aGUgc2FtZSB0aGluZyBhcyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudAotCSAqIEV2ZW50cyBpbiB0aGUgc3VwZXIgY2xhc3MuIEl0IGFsd2F5cyB3aWxsIHJldHVybiB6ZXJvLgotCSAqIAotCSAqIEByZXR1cm4gaW50IGZvciBhIG5ld0RvY3VtZW50LCB0aGUgb2Zmc2V0IG9mIGlzIGFsd2F5cyAwCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEZvciBhIG5ldyBkb2N1bWVudCwgdGhlIHRleHQgaW52b2x2ZWQgaXMgdGhlIGNvbXBsZXRlIHRleHQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHRleHQgdGhhdCBpcyB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGUgZG9jdW1uZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0cyA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFRleHQoKTsKLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTm9DaGFuZ2VFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTm9DaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTAwNGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05vQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbnQgaWYsIGFmdGVyIGFuYWx5c2lzLCBpdCBpcyBmb3VuZCB0aGVyZSBpcyBubyByZWFzb24gdG8KLSAqIGNoYW5nZSB0aGUgc3RydWN0dXJlZERvY3VtZW50LiBUaGlzIG1pZ2h0IG9jY3VyLCBmb3IgZXhhbXBsZSwgaWYgc29tZW9uZQotICogcGFzdGVzIGluIHRoZSBleGFjdCBzYW1lIHRleHQgdGhhdCB0aGV5IGFyZSByZXBsYWNpbmcsIG9yIGlmIHNvbWVvbmUgdHJpZXMKLSAqIHRvIGNoYW5nZSBhIHJlYWQtb25seSByZWdpb24uCi0gKiAKLSAqIFRoaXMgbWlnaHQgYmUgaW1wb3J0YW50LCBmb3IgZXhhbXBsZSwgaWYgc29tZSBzdGF0ZSB2YXJpYWJsZXMgYXJlIHNldCBvbiBhbgotICogImFib3V0IHRoZSBjaGFuZ2UiIGV2ZW50LiB0aGVuIGlmIHRoZXJlIGlzIG5vIGNoYW5nZSAoaS5lLm5vIG90aGVyIGV2ZW50IGlzCi0gKiBmaXJlZCksIHRob3NlIHN0YXRlIHZhcmlhYmxlcyBjb3VsZCByZXNldCwgb3Igd2hhdGV2ZXIsIHVwb24gcmVjZWl2aW5nIHRoaXMKLSAqIGV2ZW50LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5vQ2hhbmdlRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0JLyoqCi0JICogTk9fQ09OVEVOVF9DSEFOR0UgbWVhbnMgdGhhdCBhIHNvbWUgdGV4dCB3YXMgcmVxdWVzdGVkIHRvIGJlIHJlcGxhY2VkCi0JICogd2l0aCBpZGVudGljYWwgdGV4dCwgc28gbm8gY2hhbmdlIGlzIGFjdHVhbGx5IGRvbmUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTk9fQ09OVEVOVF9DSEFOR0UgPSAyOwotCS8qKgotCSAqIE5PX0VWRU5UIGlzIHVzZWQgaW4gcmFyZSBlcnJvciBjb25kaXRpb25zLCB3aGVuLCBiYXNpY2FsbHksIGEgcmVxdWVzdAotCSAqIHRvIGNoYW5nZSB0aGUgZG9jdW1lbnQgaXMgbWFkZSBiZWZvcmUgdGhlIHByZXZpb3VzIHJlcXVlc3QgaGFzCi0JICogY29tcGxldGVkLiBUaGlzIGV2ZW50IHRvIHVzZWQgc28gYWJvdXRUb0NoYW5nZS9DaGFuZ2VkIGN5Y2xlcyBjYW4KLQkgKiBjb21wbGV0ZSBhcyByZXF1aXJlZCwgYnV0IHRoZSBkb2N1bWVudCBpcyBtb3N0IGxpa2VseSBub3QgbW9kaWZpZWQgYXMKLQkgKiBleHBlY3RlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19FVkVOVCA9IDg7Ci0JLyoqCi0JICogUkVBRF9PTkxZX1NUQVRFX0NIQU5HRSBtZWFucyB0aGF0IHRoZSAicmVhZCBvbmx5IiBzdGF0ZSBvZiB0aGUgdGV4dCB3YXMKLQkgKiBjaGFuZ2VkLCBub3QgdGhlIGNvbnRlbnQgaXRzZWxmLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFQURfT05MWV9TVEFURV9DSEFOR0UgPSA0OwotCi0JLyoqCi0JICogc2V0IHRvIG9uZSBvZiB0aGUgYWJvdmUgZGV0YWlsZWQgcmVhc29ucyBmb3Igd2h5IG5vIGNoYW5nZSB3YXMgZG9uZS4KLQkgKi8KLQlwdWJsaWMgaW50IHJlYXNvbiA9IDA7Ci0KLQkvKioKLQkgKiBOb0NoYW5nZUV2ZW50IGNvbnN0cnVjdG9yLiBUaGlzIGV2ZW50IGNhbiBvY2N1ciBpZiB0aGVyZSB3YXMgYSByZXF1ZXN0Ci0JICogdG8gbW9kaWZ5IGEgZG9jdW1lbnQgb3IgaXRzIHByb3BlcnRpZXMsIGJ1dCB0aGVyZSBhcyBub3QgcmVhbGx5IGlzIG5vCi0JICogY2hhbmdlIHRvIGEgZG9jdW1lbnQncyBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gb3JpZ2luYWxTb3VyY2UKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBOb0NoYW5nZUV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlLCBPYmplY3Qgb3JpZ2luYWxTb3VyY2UsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgb3JpZ2luYWxTb3VyY2UsIGNoYW5nZXMsIG9mZnNldCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9SZWdpb25DaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWQ0MzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyB1c2VkIHdoZW4gYSBkb2N1bWVudCByZWdpb24gY2hhbmdlcyBpbiBhIG5vbi1zdHJ1Y3R1cmFsIHdheS4KLSAqIE5vbi1zdHJ1Y3R1cmFsLCB0aGF0IGlzLCBhcyBmYXIgYXMgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY29uY2VybmVkLgotICogVGhlIHdob2xlIHJlZ2lvbiwgYWxvbmcgd2l0aCB0aGUgbmV3IHRleHQgaXMgc2VudCwganVzdCBpbiBjYXNlIGEgbGlzdGVuZXIKLSAqIChlLmcuIGEgdHJlZSBtb2RlbCkgbWlnaHQgbWFrZSBpdHMgb3duIGRldGVybWluYXRpb24gb2Ygd2hhdCB0byBkbywgYW5kCi0gKiBuZWVkcyB0aGUgd2hvbGUgcmVnaW9uIHRvIGFjdCBhcHByb3ByaWF0ZWx5LgotICogCi0gKiBOb3RlOiB1c2VycyBzaG91bGQgbm90IG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQgd2hldGhlciB0aGUgcmVnaW9uIGlzCi0gKiBsaXRlcmFsbHkgdGhlIHNhbWUgaW5zdGFuY2Ugb3Igbm90IC0tIGl0IGlzIGN1cnJlbnRseSBhIGRpZmZlcmVudCBpbnN0YW5jZQotICogdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIG9sZCBleGNlcHQgZm9yIHRoZSBjaGFuZ2VkIHJlZ2lvbiwgYnV0IHRoaXMKLSAqIGltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uQ2hhbmdlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSVRleHRSZWdpb24gZkNoYW5nZWRSZWdpb247Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGluc3RhbmNlIG9mIGEgUmVnaW9uQ2hhbmdlZEV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IG1ha2luZyB0aGUgcmVxdWVzdCBmb3IgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyByZWdpb24KLQkgKiBAcGFyYW0gY2hhbmdlZFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiB0aGF0IGhhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBjaGFuZ2VzCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIHNwZWNpZmllZCB0byBiZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgUmVnaW9uQ2hhbmdlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQlmQ2hhbmdlZFJlZ2lvbiA9IGNoYW5nZWRSZWdpb247Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IHJlZ2lvbiBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgcmVnaW9uIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uKCkgewotCQlyZXR1cm4gZkNoYW5nZWRSZWdpb247Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCByZWdpb24gY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCByZWdpb24gY2hhbmdlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvUmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbnNSZXBsYWNlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTJlNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvUmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyB1c2VkIHdoZW4gYSBub2RlJ3MgcmVnaW9ucyBjaGFuZ2UsIGJ1dCB0aGUgZG9jdW1lbnQgcmVnaW9uCi0gKiBpdHNlbGYgZG9lc24ndC4gVGhpcyBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGUgZG9jdW1lbnQKLSAqIHJlZ2lvbiwgdGhhdCBtYXkgc3RpbGwgaGF2ZSBjaGFuZ2VkLiBBbHNvLCBpdHMgYXNzdW1lZC9yZXF1aXJlZCB0aGF0IGFsbAotICogdGhlIHJlZ2lvbnMgYXJlIHJlcGxhY2VkIChldmVuIHRob3NlIHRoYXQgbWF5IG5vdCBoYXZlIGNoYW5nZWQpLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGZOZXdSZWdpb25zOwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGZPbGRSZWdpb25zOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgUmVnaW9uc1JlcGxhY2VkRXZlbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyIC0KLQkgKiAgICAgICAgICAgIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gLQotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiBjb250YWluaW5nIHRoZSBjaGFuZ2UuCi0JICogQHBhcmFtIG9sZFJlZ2lvbnMgLQotCSAqICAgICAgICAgICAgdGhlIG9sZCBSZWdpb25zIGJlaW5nIHJlcGxhY2VkLgotCSAqIEBwYXJhbSBuZXdSZWdpb25zIC0KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgcmVnaW9ucyBiZWluZyBhZGRlZC4KLQkgKiBAcGFyYW0gY2hhbmdlcyAtCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQgLQotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UgLQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIHJlcGxhY2UuCi0JICovCi0JcHVibGljIFJlZ2lvbnNSZXBsYWNlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJc3VwZXIoZG9jdW1lbnQsIG9yaWdpbmFsUmVxdWVzdGVyLCBjaGFuZ2VzLCBvZmZzZXQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCWZPbGRSZWdpb25zID0gb2xkUmVnaW9uczsKLQkJZk5ld1JlZ2lvbnMgPSBuZXdSZWdpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5ldyB0ZXh0IHJlZ2lvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV3IHRleHQgcmVnaW9ucy4KLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldE5ld1JlZ2lvbnMoKSB7Ci0JCXJldHVybiBmTmV3UmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgdGV4dCByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9sZCB0ZXh0IHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRPbGRSZWdpb25zKCkgewotCQlyZXR1cm4gZk9sZFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5MzBmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBJU3RydWN0dXJlZERvY3VtZW50IGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBJU3RydWN0dXJlZERvY3VtZW50LCBhZnRlcgotICogdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYWN0cyBvbiBhIHJlcXVlc3QuIE5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQsCi0gKiBleGNlcHQgYnkgc3ViY2xhc3NlcyBpbiBpbmZyYXN0cnVjdHVyZS4gTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkKLSAqIGNsaWVudHMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXh0ZW5kcyBEb2N1bWVudEV2ZW50IHsKLQlwcml2YXRlIFN0cmluZyBmRGVsZXRlZFRleHQ7Ci0JcHJpdmF0ZSBPYmplY3QgZk9yaWdpbmFsUmVxdWVzdGVyOwotCi0JLyoqCi0JICogVGhlcmUgaXMgbm8gcHVibGljIG51bGwtYXJnIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFdlIGFzc3VtZSAoYW5kIHJlcXVpcmUpIHRoYXQgYW4gSVN0cnVjdHVyZWREb2N1bWVudCdzIGFyZSBhbHdheXMgdGhlCi0JICogc291cmNlIG9mIFN0cnVjdHVyZWREb2N1bWVudCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudWxsIHNvdXJjZSIpOyAvLyROT04tTkxTLTEkCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT3JpZ2luYWxSZXF1ZXN0ZXIgPSBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBXZSBhc3N1bWUgKGFuZCByZXF1aXJlKSB0aGF0IGFuIElTdHJ1Y3R1cmVkRG9jdW1lbnQncyBhcmUgYWx3YXlzIHRoZQotCSAqIHNvdXJjZSBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZC4KLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlcikgewotCQl0aGlzKGRvY3VtZW50KTsKLQkJZk9yaWdpbmFsUmVxdWVzdGVyID0gb3JpZ2luYWxSZXF1ZXN0ZXI7Ci0JfQotCi0JLyoqCi0JICogV2UgYXNzdW1lIChhbmQgcmVxdWlyZSkgdGhhdCBhbiBJU3RydWN0dXJlZERvY3VtZW50J3MgYXJlIGFsd2F5cyB0aGUKLQkgKiBzb3VyY2Ugb2YgU3RydWN0dXJlZERvY3VtZW50IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyIC0KLQkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gY2hhbmdlcyAtCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmV3IHRleHQKLQkgKiBAcGFyYW0gb2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlIC0KLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGV4dCB0byByZXBsYWNlLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJdGhpcyhkb2N1bWVudCk7Ci0JCWZPcmlnaW5hbFJlcXVlc3RlciA9IG9yaWdpbmFsUmVxdWVzdGVyOwotCQlmVGV4dCA9IGNoYW5nZXM7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZMZW5ndGggPSBsZW5ndGhUb1JlcGxhY2U7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhlIHRleHQgdGhhdCBpcyBiZWluZyBkZWxldGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgdGhhdCBpcyBiZWluZyBkZWxldGVkLCBvciBudWxsIGlmIG5vbmUgaXMgYmVpbmcKLQkgKiAgICAgICAgIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWxldGVkVGV4dCgpIHsKLQkJcmV0dXJuIGZEZWxldGVkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvYmplY3QgdGhhdCBvcmlnaW5hbGx5IGNhdXNlZCB0aGUgZXZlbnQgdG8KLQkgKiBmaXJlLiBUaGlzIGlzIHR5cGljYWxseSBub3QgdGhlIG9iamVjdCB0aGF0IGNyZWF0ZWQgdGhlIGV2ZW50ICh0aGUKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50KSBidXQgaW5zdGVhZCB0aGUgb2JqZWN0IHRoYXQgbWFkZSBhIHJlcXVlc3QgdG8gdGhlCi0JICogSVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgdGhhdCBtYWRlIHRoZSByZXF1ZXN0IHRvIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSB7Ci0JCXJldHVybiBmT3JpZ2luYWxSZXF1ZXN0ZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byAnZ2V0RG9jdW1lbnQnIGV4Y2VwdCBpdCByZXR1cm5zIGFuIG9iamVjdAotCSAqIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIChuYW1lbHksIGEgSVN0cnVjdHVyZWREb2N1bWVudCwgaW5zdGVhZCBvZgotCSAqIElEb2N1bWVudCkuCi0JICogCi0JICogQHJldHVybiBJU3RydWN0dXJlZERvY3VtbnQgLSB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJLy8gYSBzYWZlIGNhc2UsIHNpbmNlIGNvbnN0cnVjdG9yIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGEKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudAotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBOb3QgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkgcGFyc2VycyBhbmQgcmVwYXJzZXJzLiAod2lsbAotCSAqIGV2ZW50dWFsbHkgYmUgbW92ZWQgdG8gYW4gU1BJIHBhY2thZ2UpLgotCSAqIAotCSAqIEBwYXJhbSBuZXdEZWxldGVkVGV4dCAtCi0JICogICAgICAgICAgICB0aGUgdGV4dCB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZFRleHQoU3RyaW5nIG5ld0RlbGV0ZWRUZXh0KSB7Ci0JCWZEZWxldGVkVGV4dCA9IG5ld0RlbGV0ZWRUZXh0OwotCX0KLQotCS8qKgotCSAqIGZvciBkZWJ1Z2dpbmcgb25seQotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gbmVlZCB0byBmaXggdW5pdCB0ZXN0cyB3aGljaCBkZXBlbmQgb24gdGhpcyBleGFjdCBmb3JtYXQsCi0JICogICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhpcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJbc291cmNlPSIgKyBzb3VyY2UgKyAiXSI7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0MmJmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHVzZWQgd2hlbiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgZGVsZXRlZCwgb3IgcmVwbGFjZWQKLSAqIHdpdGggbW9yZSB0aGFuIG9uZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBvciB3aGVuIHNpbXBseSBtb3JlIHRoYW4gb25lCi0gKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNoYW5nZXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBvcmlnaW5hbFJlcXVlc3RlciAtCi0JICogICAgICAgICAgICB0aGUgcmVxdWVzdGVyIG9mIHRoZSBjaGFuZ2UuCi0JICogQHBhcmFtIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgLQotCSAqICAgICAgICAgICAgdGhlIG9sZCBkb2N1bWVudCByZWdpb25zIHJlbW92ZWQuCi0JICogQHBhcmFtIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgLQotCSAqICAgICAgICAgICAgdGhlIG5ldyBkb2N1bWVudCByZWdpb25zIGFkZGVkLgotCSAqIEBwYXJhbSBjaGFuZ2VzIC0KLQkgKiAgICAgICAgICAgIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGV4dCBjaGFuZ2UuCi0JICogQHBhcmFtIG9mZnNldCAtCi0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBjaGFuZ2UuCi0JICogQHBhcmFtIGxlbmd0aFRvUmVwbGFjZSAtCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRleHQgcmVxdWVzdGVkIHRvIGJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JCWZOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXcgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBmTmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9sZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VBbHJlYWR5RXhpc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VBbHJlYWR5RXhpc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTZlOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9leGNlcHRpb25zL1Jlc291cmNlQWxyZWFkeUV4aXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zOwotCi0KLQotcHVibGljIGNsYXNzIFJlc291cmNlQWxyZWFkeUV4aXN0cyBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFJlc291cmNlQWxyZWFkeUV4aXN0cygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUFscmVhZHlFeGlzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUFscmVhZHlFeGlzdHMoU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9leGNlcHRpb25zL1Jlc291cmNlSW5Vc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXhjZXB0aW9ucy9SZXNvdXJjZUluVXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZjFhYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9leGNlcHRpb25zL1Jlc291cmNlSW5Vc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9uczsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluVXNlIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUFscmVhZHlFeGlzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VJblVzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvdXJjZUFscmVhZHlFeGlzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUluVXNlKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsTWFuYWdlclByb3Bvc2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lNb2RlbE1hbmFnZXJQcm9wb3NlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2U5NDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsTWFuYWdlclByb3Bvc2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogUmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIElTdHJ1Y3R1cmVkTW9kZWxzLgotICogCi0gKiBUaGlzIGFsbG93cyBjbGllbnRzIHRvIHNoYXJlIG1vZGVscywgc28gdGhleSBkbyBub3QgaGF2ZSB0byBiZSByZS1jcmVhdGVkCi0gKiBvciBwYXNzZWQgYXJvdW5kIGZyb20gb25lIGNsaWVudCB0byBhbm90aGVyLiBDbGllbnRzIHNob3VsZCBpbnRlcm5hbGx5Ci0gKiBlbmZvcmNlIHRoYXQgbW9kZWxzIGFyZSBnb3R0ZW4gYW5kIHJlbGVhc2VkIGZyb20gbG9jYXRpb25zIGNsb3NlIHRvIGVhY2gKLSAqIG90aGVyIHRvIHByZXZlbnQgbW9kZWwgbGVha3MuCi0gKiAKLSAqIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGdldCBhIG1vZGVsIGJhc2VkIG9uIHVzYWdlIGFuZCByZXNwb25zaWJpbGl0eTogZm9yCi0gKiAnTU9ESUZZJywganVzdCBmb3IgJ1NIQVJFRCcsIGFuZCAnVU5TSEFSRUQnLiBDb250cmFyeSB0byB0aGVpciBuYW1lcywgYQotICogbW9kZWwgY2FuIHRlY2huaWNhbGx5IGJlIG1vZGlmaWVkLCBhbmQgYWxsIG1vZGlmaWNhdGlvbnMgZGlyZWN0bHkgYWZmZWN0Ci0gKiB0aGUgY29tbW9ubHkgc2hhcmVkIHZlcnNpb24gb2YgdGhlIG1vZGVsLiBJdCBpcyBwYXJ0IG9mIHRoZSBBUEkgY29udHJhY3QsCi0gKiBob3dldmVyLCB0aGF0IGNsaWVudHMgd2hvIGdldCBhIG1vZGVsIGZvciBTSEFSRUQgZG8gbm90IG1vZGlmeSBpdC4gVGhlCi0gKiBzaWduaWZpY2FuY2Ugb2YgdGhlICdNT0RJRlknIG1vZGVsIGlzIHRoYXQgdGhlIGNsaWVudCBpcyByZWdpc3RlcmluZyB0aGVpcgotICogaW50ZXJlc3QgaW4gc2F2aW5nIGNoYW5nZXMgdG8gdGhlIG1vZGVsLgotICogCi0gKiBDbGllbnRzIGNhbiByZWZlcmVuY2UgdGhpcyBpbnRlcmZhY2UsIGJ1dCBzaG91bGQgbm90IGltcGxlbWVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsTWFuYWdlclByb3Bvc2VkIHsKLQotCS8qKgotCSAqIEFjY2Vzc1R5cGUgaXMgdXNlZCBpbnRlcm5hbGx5IGFzIGEgSlJFIDEuNCBjb21wYXRpYmxlIGVudW1lcmF0ZWQgdHlwZS4KLQkgKiBOb3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgotCSAqLwotCXN0YXRpYyBjbGFzcyBBY2Nlc3NUeXBlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQkJLyoqCi0JCSAqIGRlZmF1bHQgYWNjZXNzIGNvbnRydWN0b3Igd2UgdXNlIHRvIGNyZWF0ZSBvdXIgc3BlY2lmaWMgY29uc3RhbnRzLgotCQkgKiAKLQkJICogQHBhcmFtIHR5cGUKLQkJICovCi0JCUFjY2Vzc1R5cGUoU3RyaW5nIHR5cGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmVHlwZSA9IHR5cGU7Ci0JCX0KLQotCQkvKioKLQkJICogRm9yIGRlYnVnIHB1cnBvc2VzIG9ubHkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJNb2RlbCBBY2Nlc3MgVHlwZTogIiArIGZUeXBlOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdGFudCB0byBwcm92aWRlIGNvbXBpbGUgdGltZSBzYWZlIHBhcmFtZXRlci4gPGNvZGU+Tk9UU0hBUkVEPC9jb2RlPnNpZ25pZmllcwotCSAqIHRoZSBjbGllbnQgaW50ZW50aWFsbHkgd2FudHMgYSBtb2RlbCB0aGF0IGlzIG5vdCBzaGFyZWQgd2l0aCBvdGhlcgotCSAqIGNsaWVudHMuIE5PVFNIQVJFRCBtb2RlbHMgY2FuIG5vdCBiZSBzYXZlZC4KLQkgKi8KLQlmaW5hbCBBY2Nlc3NUeXBlIE5PVFNIQVJFRCA9IG5ldyBBY2Nlc3NUeXBlKCJOT1RTSEFSRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUgc2FmZSBwYXJhbWV0ZXIuIDxjb2RlPlNIQVJFRDwvY29kZT5zaWduaWZpZXMKLQkgKiB0aGUgY2xpZW50IGlzIG5vdCBpbnRlbmRpbmcgdG8gbWFrZSBjaGFuZ2VzIGFuZCBkb2VzIG5vdCBjYXJlIHdoZXRoZXIKLQkgKiB0aGUgbW9kZWwgYWNjZXNzZWQgaXMgc2F2ZWQuCi0JICovCi0JZmluYWwgQWNjZXNzVHlwZSBTSEFSRUQgPSBuZXcgQWNjZXNzVHlwZSgiU0hBUkVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0YW50IHRvIHByb3ZpZGUgY29tcGlsZS10aW1lIHNhZmUgcGFyYW1ldGVyLiA8Y29kZT5NT0RJRlk8L2NvZGU+c2lnbmlmaWVzCi0JICogdGhlIGNsaWVudCBpcyBpbnRlbmRpbmcgdG8gbWFrZSBjaGFuZ2VzIGFuZCBpcyByZXNwb25zaWJsZSBmb3Igc2F2aW5nCi0JICogY2hhbmdlcyAob3Igbm90KSBpZiB0aGV5IGFyZSB0aGUgbGFzdCBvbmUgaG9sZGluZyBNT0RJRlkgYWNjZXNzIHRvIHRoZQotCSAqIG1vZGVsIGJlZm9yZSBpdCdzIHJlbGVhc2VkLgotCSAqLwotCWZpbmFsIEFjY2Vzc1R5cGUgTU9ESUZZID0gbmV3IEFjY2Vzc1R5cGUoIk1PRElGWSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBjb3B5TW9kZWwgaXMgc2ltaWxhciB0byBhIGRlZXAgY2xvbmUuIFRoZSByZXN1bHRpbmcgbW9kZWwgaXMgc2hhcmVkLAotCSAqIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgUmVhZEVkaXRUeXBlLiBJZiBhIG1vZGVsIGFscmVhZHkgaXMgYmVpbmcKLQkgKiBtYW5hZ2VkIGZvciAnbmV3TG9jYXRpb24nIHRoZW4gYSBSZXNvdXJjZUluVXNlIGV4Y2VwdGlvbiBpcyB0aHJvd24sCi0JICogdW5sZXNzIHRoZSBSZWFkRWRpdFR5cGUgaXMgTk9UU0hBUkVELCBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHRpbmcgbW9kZWwKLQkgKiBjYW4gbm90IGJlIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBvbGRMb2NhdGlvbgotCSAqIEBwYXJhbSBuZXdMb2NhdGlvbgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUmVzb3VyY2VJblVzZQotCSAqIAotCSAqIElTU1VFOiBpcyB0aGlzIGltcG9ydGFudCBlbm91Z2ggdG8gYmUgQVBJLCBvciBjYW4gY2xpZW50cyBzb2x2ZQotCSAqIHRoZW1zZWx2ZXMKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNvcHlNb2RlbChJUGF0aCBvbGRMb2NhdGlvbiwgSVBhdGggbmV3TG9jYXRpb24sIEFjY2Vzc1R5cGUgdHlwZSkgdGhyb3dzIFJlc291cmNlSW5Vc2U7Ci0KLQkvKioKLQkgKiBjcmVhdGVOZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhlIG5ldyBpbnN0YW5jZSBoYXMgbm8KLQkgKiB0ZXh0IGNvbnRlbnQuIE5vdGU6IHRoaXMgcHJvZHVjZXMgYW4gVU5TSEFSRUQgbW9kZWwsIGZvciB0ZW1wb3JhcnkgdXNlLAotCSAqIHRoYXQgaGFzIHRoZSBzYW1lIGNoYXJhY3RlcmlzdGljcyBhcyBvcmlnaW5hbCBtb2RlbC4gSWYgYSB0cnVlIHNoYXJlZAotCSAqIG1vZGVsIGlzIGRlc2lyZWQsIHVzZSAiY29weSIuCi0JICogCi0JICogSVNTVUU6IHN0aWxsIG5lZWRlZD8KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVOZXdJbnN0YW5jZShPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGl0cyBhc3N1bWUgdGhhdCBJUGF0aCBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBhcwotCSAqIGEgcmVzb3VyY2UgeWV0LiBJZiBpdCBkb2VzLCBSZXNvdXJjZUFscmVhZHlFeGlzdHMgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiB0aGUgcmVzb3VyY2UgZG9lcyBhbHJlYWR5IGV4aXN0LCB0aGVuIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvciBpcwotCSAqIHRoZSByaWdodCBBUEkgdG8gdXNlLgotCSAqIAotCSAqIElTU1VFOiBkbyB3ZSB3YW50IHRvIHN1cHBvcnQgdGhpcyB2aWEgbW9kZWwgbWFuYWdlciwgb3IgZWxzZSB3aGVyZT8KLQkgKiBJU1NVRTogZG8gd2UgbmVlZCB0d28gb2YgdGhlc2U/IFdoYXQncyBsZWdhY3kgdXNlIGNhc2U/Ci0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudEZvcihJUGF0aCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEgcHJvcGVyCi0JICogcGFyc2VyIGFzc2lnbmVkLiBOb3RlOiBjbGllbnRzIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGUgcmVzb3VyY2UKLQkgKiBpZGVudGlmaWVkIGJ5IHRoZSBJUGF0aCBleGlzdHMgYmVmb3JlIHVzaW5nIHRoaXMgbWV0aG9kLiBJZiB0aGlzIElGaWxlCi0JICogZG9lcyBub3QgZXhpc3QsIHRoZW4gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50IGlzIHRoZSBjb3JyZWN0IEFQSSB0bwotCSAqIHVzZS4KLQkgKiAKLQkgKiBJU1NVRTogZG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXMgdmlhIG1vZGVsIG1hbmFnZXIsIG9yIGVsc2Ugd2hlcmU/Ci0JICogSVNTVUU6IGRvIHdlIG5lZWQgdHdvIG9mIHRoZXNlPyBXaGF0J3MgbGVnYWN5IHVzZSBjYXNlPwotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKElQYXRoIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTm90ZTogY2FsbGVycyBvZiB0aGlzIG1ldGhvZCBtdXN0IHN0aWxsIHJlbGVhc2UgdGhlIG1vZGVsIHdoZW4KLQkgKiBmaW5pc2hlZC4gUmV0dXJucyB0aGUgbW9kZWwgZm9yIHRoaXMgZG9jdW1lbnQgaWYgaXQgYWxyZWFkeSBleGlzdHMgYW5kCi0JICogaXMgYmVpbmcgc2hhcmVkLiBSZXR1cm5zIG51bGwgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UuIFRoZSBSZWFkRWRpdFR5cGUKLQkgKiBtdXN0IGJlIGVpdGhlciBNT0RJRlkgb3IgU0hBUkVELgotCSAqIAotCSAqIElTU1VFOiBzaG91bGQgd2UgYWNjZXB0IElEb2N1bWVudCBvbiBwYXJhbWV0ZXIgZm9yIGZ1dHVyZSBldm9sdXRpb24sCi0JICogYW5kIGNvbnN0cmFpbiB0byBTdHJ1Y3R1cmVkRG9jdW1lbnRzIGF0IHJ1bnRpbWU/Ci0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHJldHVybgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBBY2Nlc3NUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCk7Ci0KLQkvKioKLQkgKiBDYWxsZXJzIG9mIHRoaXMgbWV0aG9kIG11c3Qgc3RpbGwgcmVsZWFzZSB0aGUgbW9kZWwgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIHRoZSBtb2RlbCBmb3IgdGhpcyBsb2NhdGlvbiBpZiBpdCBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgYmVpbmcKLQkgKiBzaGFyZWQuIFJldHVybnMgbnVsbCBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS4gVGhlIFJlYWRFZGl0VHlwZSBtdXN0IGJlCi0JICogZWl0aGVyIE1PRElGWSBvciBTSEFSRUQuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgQWNjZXNzVHlwZSB0eXBlLCBJUGF0aCBsb2NhdGlvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIGRvY3VtZW50IGFzIGl0cyBzdHJ1Y3R1cmVkCi0JICogZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBBY2Nlc3NUeXBlIHR5cGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kZWwgYmFzZWQgb24gdGhlIGNvbnRlbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KLQkgKiAKLQkgKiBOb3RlOiBpZiB0aGUgTW9kZWxNYW5hZ2VyIGRvZXMgbm90IGtub3cgaG93IHRvIGNyZWF0ZSBhIG1vZGVsIGZvciAKLQkgKiBzdWNoIGEgZmlsZSBmb3IgY29udGVudCwgbnVsbCBpcyByZXR1cm4uCi0JICogSVNTVUU6IHNob3VsZCB3ZSB0aHJvdyBzb21lIHNwZWNpYWwsIG1lYW5pbmdmdWwsIGNoZWNrZWQgCi0JICogZXhjZXB0aW9uIGluc3RlYWQ/Ci0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgQWNjZXNzVHlwZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgSVBhdGggbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNyZWF0ZSBhIG5ldyBtb2RlbCBpZiBpdCBhbHJlYWR5IGV4aXN0cyAuLi4gaWYKLQkgKiBmb3JjZSBpcyBmYWxzZS4gVGhlIGlkZWEgaXMgdGhhdCBhIGNsaWVudCBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBvbmNlCi0JICogd2l0aCBmb3JjZSBzZXQgdG8gZmFsc2UuIElmIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVuIHByb21wdCBjbGllbnQKLQkgKiBpZiB0aGV5IHdhbnQgdG8gb3ZlcndyaXRlLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gZm9yY2UKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMKLQkgKiBAdGhyb3dzIFJlc291cmNlSW5Vc2UKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBJUGF0aCBsb2NhdGlvbiwgYm9vbGVhbiBmb3JjZSwgQWNjZXNzVHlwZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKElQYXRoIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwsIHNoYXJlZCBpbiB0aGUgc3BlY2lmaWVkIHdheS4gVGhlIFJlYWRFZGl0VHlwZSBtdXN0IGJlCi0JICogZWl0aGVyIE1PRElGWSBvciBTSEFSRUQuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZChJUGF0aCBsb2NhdGlvbiwgQWNjZXNzVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgY29udGVudCB0eXBlIG9mIGEgbW9kZWwgY2hhbmdlcy4gSXRzCi0JICogYXNzdW1lZCB0aGUgY29udGVudFR5cGUgaGFzIGFscmVhZHkgYmVlbiBjaGFuZ2VkLCBhbmQgdGhpcyBtZXRob2QgdXNlcwotCSAqIHRoZSB0ZXh0IG9mIHRoZSBvbGQgb25lLCB0byByZXBvcHVsYXRlIHRoZSB0ZXh0IG9mIHRoZSBuZXcgb25lLgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgYnkgY2xpZW50cyB0byBzaWduaWZ5IHRoYXQgdGhleSBhcmUgZmluaXNoZWQgd2l0aCBhIG1vZGVsCi0JICogYW5kIHdpbGwgbm8gbG9uZ2VyIGFjY2VzcyBpdCBvciBhbnkgb2YgaXRzIHVuZGVybHlpbmcgZGF0YSAoc3VjaCBhcyBpdHMKLQkgKiBzdHJ1Y3R1cmVkIGRvY3VtZW50KS4gVGhlIFJlYWRFZGl0VHlwZSBtdXN0IG1hdGNoIHdoYXQgZXZlciB0aGUgY2xpZW50Ci0JICogdXNlZCBpbiB0aGUgY29ycmVzcG9uZGluZyAnZ2V0JyBtZXRob2QuCi0JICogCi0JICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZm9yIGV2ZXJ5ICdnZXQnLiBDbGllbnRzIHNob3VsZCB1c2UgdGhlCi0JICogdHJ5L2ZpbmFsbHkgcGF0dGVybiB0byBlbnN1cmUgdGhlIHJlbGVhc2UgaXMgY2FsbGVkIGV2ZW4gaWYgdGhlcmUgaXMgYW4KLQkgKiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHN0cnVjdHVyZWRNb2RlbAotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0Jdm9pZCByZWxlYXNlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIEFjY2Vzc1R5cGUgdHlwZSk7Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQgdG8gdGhlIElQYXRoLgotCSAqIAotCSAqIElTU1VFOiB3ZSB3YW50IHRvIGp1c3QgImR1bXAiIGNvbnRlbnRzIHRvIGxvY2F0aW9uLCBidXQgbmVlZCB0byBzcGVjLgotCSAqIGFsbCB0aGUgZGlmZmVyZW50IGNhc2VzIG9mIHNoYXJlZCwgZXRjLgotCSAqIAotCSAqID9JZiB0byBzYW1lIGxvY2F0aW9uIGFzICdnZXQnLCB0aGVuIHNhbWUgaW5zdGFuY2Ugb2YgbW9kZWwsIElmIHRvCi0JICogZGlmZmVyZW50IGxvY2F0aW9uIChlc3AuIGlmIHNoYXJlZCkgdGhlbiBuZWVkIHRvIGxlYXZlIG9sZCBpbnN0YW5jZSBvZgotCSAqIG1vZGVsLCBjcmVhdGUgbmV3IG1vZGVsLCBhbmQgc2F2ZSB0byBuZXcgbG9jYXRpb24uID8KLQkgKiAKLQkgKiBDYXNlczogSVBhdGggaXMgbnVsbCwgd3JpdGUgdG8gSVBhdGggY3JlYXRlZCB3aXRoIElQYXRoIHNwZWNpZmljZWQgYW5kCi0JICogZXF1YWxzIElQYXRoIGNyZWF0ZWQgd2l0aCwgd3JpdGUgdG8gSVBhdGggSVBhdGggc3BlY2lmaWVkIGFuZCBub3QKLQkgKiBlcXVhbHMgSVBhdGggY3JlYXRlZCB3aXRoLCBkdW1wcyB0byBuZXcgSVBhdGgsIG5vIGNoYW5nZSBpbiBjdXJyZW50Ci0JICogbW9kZWwgc3RhdGUuCi0JICogCi0JICogSVNTVUU6IHRoaW5rIHRocm91Z2ggJ25vcm1hbGl6YXRpb24nIGNhc2VzCi0JICogCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWRNb2RlbAotCSAqIEBwYXJhbSBsb2NhdGlvbiAtIGFscmVhZHkgbm9ybWFsaXplZD8KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIElTU1VFOiByZXNvdXJjZSBhbGVhZHkgZXhpc3RzPyB2ZXRvIG92ZXJyaWRlCi0JICovCi0Jdm9pZCBzYXZlTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElQYXRoIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogV3JpdGVzIHRoZSB1bmRlcmx5aW5nIGRvY3VtZW50IHRvIHRoZSBJUGF0aCBpZiB0aGUgbW9kZWwgaXMgb25seSBzaGFyZWQKLQkgKiBmb3IgRURJVCBieSBvbmUgY2xpZW50LiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgZm9yICdiYWNrZ3JvdW5kCi0JICogam9icycgdG8gc2F2ZSBtb2RlbHMsIGluIGNhc2UgdGhlIG1vZGVsIGlzIGJlaW5nIHNoYXJlZCBieSBhbiBlZGl0b3IsCi0JICogb3Igb3RoZXIgY2xpZW50IHRoYXQgbWlnaHQgZGVzaXJlIHVzZXIgaW50ZXJ2ZW50aW9uIHRvIHNhdmUgYSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZE1vZGVsCi0JICogQHBhcmFtIGxvY2F0aW9uIC0gYWxyZWFkeSBub3JtYWxpemVkPwotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogSVNTVUU6IGlzIGxvY2FpdG9uIG5lZWRlZCBpbiB0aGlzIGNhc2UsIG9yIGp1c3QgdXNlIHRoZSBvbmUgaXQgd2FzCi0JICogY3JlYXRlZCB3aXRoCi0JICovCi0Jdm9pZCBzYXZlTW9kZWxJZk5vdFNoYXJlZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgSVBhdGggbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lNb2RlbFN0YXRlTGlzdGVuZXJQcm9wb3NlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTW9kZWxTdGF0ZUxpc3RlbmVyUHJvcG9zZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ZmM3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lNb2RlbFN0YXRlTGlzdGVuZXJQcm9wb3NlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5tb2RlbDsKLQotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgdGhvc2Ugd2FudGluZyB0byBsaXN0ZW4gdG8gYSBtb2RlbCdzIHN0YXRlIGNoYW5naW5nLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxTdGF0ZUxpc3RlbmVyUHJvcG9zZWQgewotCi0JLyoqCi0JICogQSBtb2RlbCBpcyBhYm91dCB0byBiZSBjaGFuZ2VkLiBUaGUgZXZlbnQgb2JqZWN0IGl0c2VsZiBzaWduaWZpZXMgd2hpY2gKLQkgKiBtb2RlbCwgYW5kIGFueSBwZXJ0aW5lbnQgaW5mb3JtYXRpb24uCi0JICovCi0Jdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFNpZ25hbHMgdGhhdCB0aGUgY2hhbmdlcyBmb3JldG9sZCBieSBtb2RlbEFib3V0VG9CZUNoYW5nZWQgaGF2ZSBiZWVuCi0JICogbWFkZS4gQSB0eXBpY2FsIHVzZSBtaWdodCBiZSB0byByZWZyZXNoLCBvciB0byByZXN1bWUgcHJvY2Vzc2luZyB0aGF0Ci0JICogd2FzIHN1c3BlbmRlZCBhcyBhIHJlc3VsdCBvZiBtb2RlbEFib3V0VG9CZUNoYW5nZWQuCi0JICovCi0Jdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbEV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTm9kZUFkYXB0ZXJGYWN0b3J5TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTm9kZUFkYXB0ZXJGYWN0b3J5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzJkMTY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU5vZGVBZGFwdGVyRmFjdG9yeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci0vKioKLSAqIFByb3ZpZGVzIGEgbWVhbnMgZm9yIGNsaWVudHMgdG8gcmVnaXN0ZXIgSUFkYXB0ZXJGYWN0b3JpZXMgZm9yIHVzZQotICogYnkgaW5mcmFzdHJ1Y3R1cmUgd2hlbiBTdHJ1Y3R1cmVkTW9kZWxzIGFyZSBjcmVhdGVkLiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTm9kZUFkYXB0ZXJGYWN0b3J5TWFuYWdlciB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqLwotCXZvaWQgYWRkQWRhcHRlckZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpOwotCi0Jdm9pZCByZW1vdmVBZGFwdGVyRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIElDb250ZW50VHlwZSBjb250ZW50VHlwZSk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JU3RydWN0dXJlZE1vZGVsRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSVN0cnVjdHVyZWRNb2RlbEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmMzYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JU3RydWN0dXJlZE1vZGVsRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5tb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZE1vZGVsRXZlbnQgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxQcm9wb3NlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JU3RydWN0dXJlZE1vZGVsUHJvcG9zZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5ODRkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxQcm9wb3NlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogSVN0cnVjdHVyZWRNb2RlbCdzIGFyZSBtYWlubHkgaW50ZXJlc3RpbmcgYnkgdGhlaXIgZXh0ZW5zaW9ucyBhbmQKLSAqIGltcGxlbWVudGVycy4gVGhlIG1haW4gcHVycG9zZWQgb2YgdGhpcyBhYnN0cmFjdGlvbiBpdCB0byBwcm92aWRlIGEgY29tbW9uCi0gKiB3YXkgdG8gbWFuYWdlIG1vZGVscyB0aGF0IGhhdmUgYW4gYXNzb2NpYXRlZCBzdHJ1Y3R1cmVkIGRvY3VtbmV0LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkTW9kZWxQcm9wb3NlZCBleHRlbmRzIElBZGFwdGFibGUgewotCi0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogImxhcmdlIiBjaGFuZ2UgdG8gdGhlIG1vZGVsLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50Ci0JICogb3IgaXQgbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICogCi0JICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCBub3RpZmljYXRpb24gdG8gbGlzdGVuZXJzIGlzCi0JICogc2VudCBvbmx5IG9uY2UuCi0JICogCi0JICogTm90ZSB0aGF0IHRoZSBjbGllbnQgd2hvIGlzIG1ha2luZyB0aGVzZSBjaGFuZ2VzIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkKLQkgKiB0byByZXN0b3JlIHRoZSBtb2RlbCdzIHN0YXRlIG9uY2UgZmluaXNoZWQgd2l0aCB0aGUgY2hhbmdlcy4gU2VlCi0JICogZ2V0TWVtZW50byBhbmQgcmVzdG9yZVN0YXRlLgotCSAqIAotCSAqIFRoZSBtZXRob2QgaXNNb2RlbFN0YXRlQ2hhbmdpbmcgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGV0ZXJtaW5lIGlmCi0JICogdGhlIG1vZGVsIGlzIGFscmVhZHkgaW4gYSBjaGFuZ2Ugc2VxdWVuY2UuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIgdG8gY2hhbmdlZE1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQKLQkgKiBiZWZvcmUgY2hhbmdlZE1vZGVsLiBBIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0IG5vciBjYWxsIGFib3V0VG9DaGFuZ2VNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBjaGFuZ2VkTW9kZWwgbGF0ZXIgZnJvbSB0aGUgc2FtZSBUaHJlYWQuCi0JICovCi0Jdm9pZCBhYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCXZvaWQgYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RuZXJzIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyCi0JICogdG8gYWJvdXRUb0NoYW5nZU1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWJvdXRUb0NoYW5nZU1vZGVsIC4uLgotCSAqIG9yIHNvbWUgbGlzdGVuZXJzIGNvdWxkIGJlIGxlZnQgd2FpdGluZyBpbmRlZmluaXRlbHkgZm9yIHRoZSBjaGFuZ2VkCi0JICogZXZlbnQuIFNvLCBpdHMgc3VnZ2VzdGVkIHRoYXQgY2hhbmdlZE1vZGVsIGFsd2F5cyBiZSBpbiBhIGZpbmFsbHkKLQkgKiBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LgotCSAqIAotCSAqIEluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqIAotCSAqLwotCXZvaWQgY2hhbmdlZE1vZGVsKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY2xpZW50LWRlZmluZWQgdmFsdWUgZm9yIHdoYXQgdGhhdCBjbGllbnQgKGFuZC9vciBsb2FkZXIpCi0JICogY29uc2lkZXJzIHRoZSAiYmFzZSIgb2YgdGhlIHN0cnVjdHVyZWQgbW9kZWwuIEZyZXF1ZW50bHkgdGhlIGxvY2F0aW9uCi0JICogaXMgZWl0aGVyIGEgd29ya3NwYWNlIHJvb3QtcmVsYXRpdmUgcGF0aCBvZiBhIHdvcmtzcGFjZSByZXNvdXJjZSBvciBhbgotCSAqIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotCSAqLwotCUlQYXRoIGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIGNvbnRlbnQgdHlwZSBpZGVudGlmaWVyIChTdHJpbmcpIGZvciB0aGlzIG1vZGVsLgotCSAqLwotCUlDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgbW9kZWwncyBGYWN0b3J5UmVnaXN0cnkuIEEgbW9kZWwgaXMgbm90IHZhbGlkIHdpdGhvdXQgb25lLgotCSAqLwotCUZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggcmVnaW9uIGF0IG9mZnNldC4gUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vCi0JICogSW5kZXhlZFJlZ2lvbiB0aGF0IGNvbnRhaW5zIG9mZnNldC4KLQkgKi8KLQlJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBJU1NVRTogZG8gd2Ugd2FudCB0byBwcm92aWRlIHRoaXM/IEhvdyB0byBlbnN1cmUgam9iL3RocmVhZCBzYWZldHkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSW5kZXhlZFJlZ2lvbltdIGdldEluZGV4ZWRSZWdpb25zKCk7Ci0KLQkvKioKLQkgKiBScmV0dXJucyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCB0aGF0IHVuZGVybGllcyB0aGlzIG1vZGVsCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzRGlydHkoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbCBpcyB3aXRoaW4gYQotCSAqICJhYm91dFRvQ2hhbmdlIiBhbmQgImNoYW5nZWQiIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kZWxTdGF0ZUNoYW5naW5nKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzTmV3KCk7Ci0KLQlib29sZWFuIGlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIGlmIHRoZSBtb2RlbCBpcyBkaXJ0eSBhbmQgaWYgdGhlIG1vZGVsIGlzCi0JICogc2hhcmVkIGZvciB3cml0ZSBhY2Nlc3MuIFRoZSBsYXN0IHdyaXRlciBhcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gYmUKLQkgKiBzdXJlIHRoZSB1c2VyIGlzIHByb21wdGVkIHRvIHNhdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBuZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhhdCB0aGUgbmV3SW5zdGFuY2UgY29udGFpbnMKLQkgKiBubyBjb250ZW50LiBJdHMgcHVycG9zZSBpcyBzbyBjbGllbnRzIGNhbiBnZXQgYSB0ZW1wb3JhcnksIHVubWFuYWdlZCwKLQkgKiBtb2RlbCBvZiB0aGUgc2FtZSAidHlwZSIgYXMgdGhlIG9yaWdpbmFsLiBOb3RlOiB0aGUgY2xpZW50IG1heSBzdGlsbAotCSAqIG5lZWQgdG8gZG8gc29tZSBpbnRpYWxpemF0aW9uIG9mIHRoZSBtb2RlbCByZXR1cm5lZCBieSBuZXdJbnN0YW5jZSwKLQkgKiBkZXBlbmRpbmcgb24gZGVzaXJlZCB1c2UuIEZvciBleGFtcGxlLCB0aGUgb25seSBmYWN0b3JpZXMgaW4gdGhlCi0JICogbmV3SW5zdGFuY2UgYXJlIHRob3NlIHRoYXQgd291bGQgYmUgbm9ybWFsbHkgYmUgY3JlYXRlZCBmb3IgYSBtb2RlbCBvZgotCSAqIHRoZSBnaXZlbiBjb250ZW50VHlwZS4gT3RoZXJzIGFyZSBub3QgY29waWVkIGF1dG9tYXRpY2FsbHksIGFuZCBpZgotCSAqIGRlc2lyZWQsIHNob3VsZCBiZSBhZGRlZCBieSBjbGllbnQuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkIG5ld0luc3RhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0Jdm9pZCByZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkNGVmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci0KLQotLyoqCi0gKiBBIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgYSBjb2xsZWN0aW9uIG9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuIEl0J3MKLSAqIG9mdGVuIGNhbGxlZCAiZmxhdCIgYmVjYXVzZSBpdHMgY29udGVudHMgYnkgZGVzaWduIGRvIG5vdCBjb250YWluIG11Y2gKLSAqIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYmV5b25kIGNvbnRhaW5tZW50LiBDbGllbnRzIHNob3VsZCBub3QgaW1wbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZXh0ZW5kcyBJRW5jb2RlZERvY3VtZW50LCBJRG9jdW1lbnRFeHRlbnNpb24sIElBZGFwdGFibGUgewotCi0Jdm9pZCBhZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogVGhlIFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVycyBhbmQgTW9kZWxDaGFuZ2VkTGlzdGVuZXJzIGFyZSB2ZXJ5Ci0JICogc2ltaWxhci4gVGhleSBib3RoIHJlY2VpdmUgaWRlbnRpY2FsIGV2ZW50cy4gVGhlIGRpZmZlcmVuY2UgaXMgdGhlCi0JICogdGltaW5nLiBUaGUgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVycyBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlCi0JICogc3RydWN0dXJlZERvY3VtZW50IGhhcyBiZWVuIGNoYW5nZWQsIGJ1dCBiZWZvcmUgb3RoZXIsIHJlbGF0ZWQgbW9kZWxzCi0JICogbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIHN1Y2ggYXMgdGhlIFN0cnVjdHVyYWwgTW9kZWwuIFRoZSBTdHJ1Y3R1cmFsCi0JICogbW9kZWwgaXMgaW4gZmFjdCBpdHNlbGYgYSAicHVyZSIgU3RydWN0dXJlZERvY3VtZW50TGlzdG5lci4gVGhlCi0JICogTW9kZWxDaGFuZ2VkTGlzdGVuZXJzIGNhbiByZXN0IGFzc3VyZWQgdGhhdCBhbGwgbW9kZWxzIGFuZCBkYXRhIGhhdmUKLQkgKiBiZWVuIHVwZGF0ZWQgZnJvbSB0aGUgY2hhbmdlIGJ5IHRoZSB0aWVtIHRoZXkgYXJlIG5vdGlmaWVkLiBUaGlzIGlzCi0JICogZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHRoZSB0ZXh0IHdpZGdldCwgZm9yIGV4YW1wbGUsIHdoaWNoIG1heSByZWx5Ci0JICogb24gYm90aCBzdHJ1Y3R1cmVkRG9jdW1lbnQgYW5kIHN0cnVjdHVyYWwgbW9kZWwgaW5mb3JtYXRpb24uCi0JICovCi0Jdm9pZCBhZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogVGhlIFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVycyBhbmQgTW9kZWxDaGFuZ2VkTGlzdGVuZXJzIGFyZSB2ZXJ5Ci0JICogc2ltaWxhci4gVGhleSBib3RoIHJlY2VpdmUgaWRlbnRpY2FsIGV2ZW50cy4gVGhlIGRpZmZlcmVuY2UgaXMgdGhlCi0JICogdGltaW5nLiBUaGUgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVycyBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlCi0JICogc3RydWN0dXJlZERvY3VtZW50IGhhcyBiZWVuIGNoYW5nZWQsIGJ1dCBiZWZvcmUgb3RoZXIsIHJlbGF0ZWQgbW9kZWxzCi0JICogbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIHN1Y2ggYXMgdGhlIFN0cnVjdHVyYWwgTW9kZWwuIFRoZSBTdHJ1Y3R1cmFsCi0JICogbW9kZWwgaXMgaW4gZmFjdCBpdHNlbGYgYSAicHVyZSIgU3RydWN0dXJlZERvY3VtZW50TGlzdG5lci4gVGhlCi0JICogTW9kZWxDaGFuZ2VkTGlzdGVuZXJzIGNhbiByZXN0IGFzc3VyZWQgdGhhdCBhbGwgbW9kZWxzIGFuZCBkYXRhIGhhdmUKLQkgKiBiZWVuIHVwZGF0ZWQgZnJvbSB0aGUgY2hhbmdlIGJ5IHRoZSB0aWVtIHRoZXkgYXJlIG5vdGlmaWVkLiBUaGlzIGlzCi0JICogZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHRoZSB0ZXh0IHdpZGdldCwgZm9yIGV4YW1wbGUsIHdoaWNoIG1heSByZWx5Ci0JICogb24gYm90aCBzdHJ1Y3R1cmVkRG9jdW1lbnQgYW5kIHN0cnVjdHVyYWwgbW9kZWwgaW5mb3JtYXRpb24uCi0JICovCi0Jdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIHRoaXMgQVBJIGVuc3VyZXMgdGhhdCBhbnkgcG9ydGlvbiBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIHN0YXJ0T2ZmIHRvCi0JICogbGVuZ3RoIGlzIG5vdCByZWFkb25seSAodGhhdCBpcywgdGhhdCBpdHMgZWRpdGFibGUpLiBOb3RlIHRoYXQgaWYgdGhlCi0JICogcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBvdGhlciByZWFkb25seSByZWdpb25zLCB0aG9zZSBvdGhlciByZWFkb25seQotCSAqIHJlZ2lvbnMgd2lsbCBiZSBhZGp1c3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICovCi0Jdm9pZCBjbGVhclJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRydWUgaWYgYW55IHBvcnRpb24gb2Ygc3RhcnRPZmZzZXQgdG8gbGVuZ3RoIGlzIHJlYWRvbmx5Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHRvIHJlbWVtYmVyIGluZm8gYWJvdXQgdGhlIGVuY29kaW5nIFdoZW4gdGhlIHJlc291cmNlCi0JICogd2FzIGxhc3QgbG9hZGVkIG9yIHNhdmVkLiBOb3RlOiBpdCBpcyBub3Qga2VwdCAiY3VycmVudCIsIHRoYXQgaXMsIGNhbgotCSAqIG5vdCBiZSBkZXBlbmRlZCBvbiBibGluZGx5IHRvIHJlZmxlY3Qgd2hhdCBlbmNvZGluZyB0byB1c2UuIEZvciB0aGF0LAotCSAqIG11c3QgZ28gdGhyb3VnaCB0aGUgbm9ybWFsIHJ1bGVzIGV4cHJlc3NlZCBpbiBMb2FkZXJzIGFuZCBEdW1wZXJzLgotCSAqLwotCi0JRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpOwotCi0Jb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0Jb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNhbiBiZSBjb25zaWRlcmVkIHRoZSBwcmVmZXJyZWQgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpOwotCi0JaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KTsgLy8gdGhyb3dzIFNvdXJjZUVkaXRpbmdFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGUgcGFyc2VyIGlzIG5vdyByZXF1aXJlZCBvbiBjb25zdHJ1Y3Rvciwgc28gdGhlcmUgYXJlIG9jY2FzaW9ucyBpdAotCSAqIG5lZWRzIHRvIGJlIHJldHJpZXZlZCwgc3VjaCBhcyB0byBiZSBpbml0aWFsaXplZCBieSBFbWJlZGRlZENvbnRlbnRUeXBlCi0JICovCi0JUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKQotCSAqIEByZXR1cm4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRSZWdpb25MaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPiBhdCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIG9mZnNldC4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiB0aGUgPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjwvY29kZT4gYXQgdGhlIGdpdmVuIGNoYXJhY3RlciBvZmZzZXQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+cyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybiA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPnMgaW4gdGhlIHNwZWNpZmllZCByYW5nZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPnMgaW4gdGhlIGRvY3VtZW50LgotCSAqIEByZXR1cm4gYWxsIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+cyBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkKLQkvKioKLQkgKiBOb3RlOiB0aGlzIG1ldGhvZCB3YXMgbWFkZSBwdWJsaWMsIGFuZCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UsIGZvcgotCSAqIGVhc2llciB0ZXN0aW5nLiBDbGllbnRzIG5vcm1hbGx5IG5ldmVyIG1hbmlwdWxhdGUgdGhlIHJlcGFyc2VyIGRpcmVjdGx5Ci0JICogKG5vciBzaG91bGQgdGhleSBuZWVkIHRvKS4KLQkgKi8KLQlJU3RydWN0dXJlZFRleHRSZVBhcnNlciBnZXRSZVBhcnNlcigpOwotCi0JU3RyaW5nIGdldFRleHQoKTsKLQotCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGdldFVuZG9NYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBjYXVzZXMgdGhhdCBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCBmcm9tIHN0YXJ0T2Zmc2V0IHRvIGxlbmd0aCB0byBiZQotCSAqIG1hcmtlZCBhcyByZWFkb25seS4gTm90ZSB0aGF0IGlmIHRoaXMgcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBzb21lIG90aGVyCi0JICogcmVnaW9uIHdpdGggaXMgcmVhZG9ubHksIHRoZSByZWdpb25zIGFyZSBlZmZlY3Rpdmx5IGNvbWJpbmVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQl2b2lkIG1ha2VSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogbmV3SW5zdGFuY2UgaXMgc2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IGl0IGNvbnRhaW5zIG5vIGRhdGEuIE9uZQotCSAqIGltcG9ydGFudCB0aGluZyB0byBkdXBsaWNhdGUgaXMgdGhlIHBhcnNlciwgd2l0aCB0aGUgcGFyc2VyIGNvcnJlY3RseQotCSAqICJjbG9uZWQiLCBpbmNsdWRpbmcgaXRzIHRva2VuaW56ZXIsIGJsb2NrIHRhZ3MsIGV0Yy4KLQkgKiAKLQkgKiBOT1RFOiBldmVuIGFmdGVyIG9idGFpbmluZyBhICduZXdJbnN0YW5jZScgdGhlIGNsaWVudCBtYXkgaGF2ZSB0byBkbwotCSAqIHNvbWUgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlLCBpdCBtYXkgbmVlZCB0byBhZGQgaXRzIG93biBtb2RlbAotCSAqIGxpc3RlbmVycy4gT3IsIGFzIGFub3RoZXIgZXhhbXBsZSwgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGEKLQkgKiBwYXJzZXIgb2YgdHlwZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIsIHRoZW4gdGhlIGNsaWVudCBtYXkgbmVlZAotCSAqIHRvIGFkZCBpdHMgb3duIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgdG8gdGhhdCBwYXJzZXIsIGlmIGl0IGlzCi0JICogaW4gZmFjdCBuZWVkZWQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSgpOwotCi0Jdm9pZCByZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0Jdm9pZCByZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0Jdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgQVBJcyB0byBtYW5pcHVsYXRlIHRoZSBJU3RydWN0dXJlZERvY3VtZW50LgotCSAqIAotCSAqIHJlcGxhY2VUZXh0IHJlcGxhY2VzIHRoZSB0ZXh0IGZyb20gb2xkU3RhcnQgdG8gb2xkRW5kIHdpdGggdGhlIG5ldyB0ZXh0Ci0JICogZm91bmQgaW4gdGhlIHJlcXVlc3RlZENoYW5nZSBzdHJpbmcuIElmIG9sZFN0YXJ0IGFuZCBvbGRFbmQgYXJlIGVxdWFsLAotCSAqIGl0IGlzIGFuIGluc2VydGlvbiByZXF1ZXN0LiBJZiByZXF1ZXN0ZWRDaGFuZ2UgaXMgbnVsbCAob3IgZW1wdHkpIGl0IGlzCi0JICogYSBkZWxldGUgcmVxdWVzdC4gT3RoZXJ3aXNlIGl0IGlzIGEgcmVwbGFjZSByZXF1ZXN0LgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlKTsKLQotCS8qKgotCSAqIE5vdGUsIHNhbWUgYXMgcmVwbGFjZVRleHQgQVBJLCBidXQgd2lsbCBhbGxvdyByZWFkb25seSBhcmVhcyB0byBiZQotCSAqIHJlcGxhY2VkLiBUaGlzIHNob3VsZCBzZWxkb20gYmUgY2FsbGVkIHdpdGggYSB2YWx1ZSBvZiAidHJ1ZSIgZm9yCi0JICogaWdub3JlUmVhZE9ubHlTZXR0aW5nLiBPbmUgY2FzZSB3aGVyZSBpdHMgb2sgaXMgd2l0aCB1bmRvIG9wZXJhdGlvbnMKLQkgKiAoc2luY2UsIHByZXN1bWFibHksIGlmIHVzZXIganVzdCBkaWQgc29tZXRoaW5nIHRoYXQgaGFwcGVuZGVkIHRvCi0JICogaW52b2x2ZSBzb21lIGluc2VydGluZyByZWFkb25seSB0ZXh0LCB0aGV5IHNob3VsZCBub3JtYWxseSBiZSBhbGxvd2VkCi0JICogdG8gc3RpbGwgdW5kbyB0aGF0IG9wZXJhdGlvbi4gT3RoZXJ3aXNlLCBJIGNhbid0IHRoaW5rIG9mIGEgc2luZ2xlCi0JICogZXhhbXBsZSwgdW5sZXNzIGl0cyB0byBnaXZlIHRoZSB1c2VyIGEgY2hvaWNlLCBlLmcuICJ5b3UgYXJlIGFib3V0IHRvCi0JICogb3ZlcndyaXRlIHJlYWQgb25seSBwb3J0aW9ucywgZG8geW91IHdhbnQgdG8gY29udGludWUiLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlLCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZyk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB0byByZW1lbWJlciBpbmZvIGFib3V0IHRoZSBlbmNvZGluZyBXaGVuIHRoZSByZXNvdXJjZQotCSAqIHdhcyBsYXN0IGxvYWRlZCBvciBzYXZlZC4gTm90ZTogaXQgaXMgbm90IGtlcHQgImN1cnJlbnQiLCB0aGF0IGlzLCBjYW4KLQkgKiBub3QgYmUgZGVwZW5kZWQgb24gYmxpbmRseSB0byByZWZsZWN0IHdoYXQgZW5jb2RpbmcgdG8gdXNlLiBGb3IgdGhhdCwKLQkgKiBtdXN0IGdvIHRocm91Z2ggdGhlIG5vcm1hbCBydWxlcyBleHByZXNzZWQgaW4gTG9hZGVycyBhbmQgRHVtcGVycy4KLQkgKi8KLQl2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKTsKLQotCXB1YmxpYyB2b2lkIHNldExpbmVEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcik7Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIEFQSXMgdG8gbWFuaXB1bGF0ZSB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBpbiB0ZXJtcyBvZiBUZXh0LgotCSAqIAotCSAqIFRoZSBzZXRUZXh0IG1ldGhvZCByZXBsYWNlcyBhbGwgdGV4dCBpbiB0aGUgbW9kZWwuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgc2V0VGV4dChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgYWxsVGV4dCk7Ci0KLQl2b2lkIHNldFVuZG9NYW5hZ2VyKElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMDNiMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLS8qKgotICogQSBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gaXMgYSBjb2xsZWN0aW9uIG9mIElUZXh0UmVnaW9ucy4gSXQgaXMgYSBzdHJ1Y3R1cmFsCi0gKiB1bml0LCBidXQgYSBtaW5pbWFsIG9uZS4gRm9yIGV4YW1wbGUsIGluIG1pZ2h0IGNvbnNpc3Qgb2YgYSAic3RhcnQgdGFnIiBidXQKLSAqIG5vdCBhIHdob2xlIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gewotCi0JLyoqCi0JICogQWRkcyBhIHRleHQgcmVnaW9uIHRvIHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24gb2YgcmVnaW9ucyBjb250YWluZWQgYnkKLQkgKiB0aGlzIHJlZ2lvbi4gSXQgaXMgdGhlIHBhcnNlcnMgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIGl0cyBhCi0JICogY29ycmVjdCByZWdpb24gKHRoYXQgaXMsIGl0cyBzdGFydCBvZmZzZXQgaXMgb25lIGdyZWF0ZXIgdGhhbiBwcmV2aW91cwotCSAqIHJlZ2lvbnMgZW5kIG9mZnNldCkKLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gdGhhdCBmb2xsb3dzIHRoaXMgb25lIG9yIG51bGwgaWYKLQkgKiBhdCBlbmQgb2YgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gdGhhdCBmb2xsb3dzIHRoaXMgb25lLgotCSAqIAotCSAqIElTU1VFOiBmb3IgdGhyZWFkIHNhZmV0eSwgdGhpcyBzaG91bGQgYmUgbW9yZSByZXN0cmljdGl2ZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyByZWdpb25zIHBhcmVudCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgcmVnaW9ucyBwYXJlbnQgZG9jdW1lbnQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRQYXJlbnREb2N1bWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gdGhhdCBwcmVjZWVkcyB0aGlzIG9uZSBvciBudWxsCi0JICogaWYgYXQgYmVnaW5uaW5nIG9mIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIHRoYXQgZm9sbG93cyB0aGlzIG9uZS4KLQkgKiAKLQkgKiBJU1NVRTogZm9yIHRocmVhZCBzYWZldHksIHRoaXMgc2hvdWxkIGJlIG1vcmUgcmVzdHJpY3RpdmUuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZCwgYW5kIGlzIG5vIGxvbmdlciBwYXJ0Ci0JICogb2YgdGhlIGFjdHVhbCBzdHJ1Y3R1cmVkIGRvY3VtZW50LiBUaGlzIGZpZWxkIGNhbiBiZSB1c2VkIGluCi0JICogbXVsdGktdGhyZWFkZWQgb3BlcmF0aW9ucywgd2hpY2ggbWF5IHJldHJpZXZlIGEgbG9uZyBsaXN0IG9mIHJlZ2lvbnMKLQkgKiBhbmQgYmUgaXRlcmF0aW5nIHRocm91Z2ggdGhlbSBhdCB0aGUgc2FtZSB0aW1lIHRoZSBkb2N1bWVudCBpcwotCSAqIG1vZGlmaWVkLCBhbmQgcmVnaW9ucyBkZWxldGVkLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlZ2lvbiBpcyBubyBsb25nZXIgcGFydCBvZiBkb2N1bWVudC4KLQkgKi8KLQlib29sZWFuIGlzRGVsZXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gd2FzIGVuZGVkICJuYXR1cmFsbHkiCi0JICogYnkgc3ludGFjdGljIHJ1bGVzLCBvciBpZiBzaW1wbHkgYXNzdW1lZCB0byBlbmQgc28gYW5vdGhlciBjb3VsZCBiZQotCSAqIHN0YXJ0ZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHJlZ2lvbiBoYXMgc3ludGFjdGljIGVuZC4KLQkgKi8KLQlib29sZWFuIGlzRW5kZWQoKTsKLQotCS8qKgotCSAqIFRlc3RzIGlzIHJlZ2lvbiBpcyBlcXVhbCB0byB0aGlzIG9uZSwgaWdub3JpbmcgcG9zaXRpb24gb2Zmc2V0cyBvZgotCSAqIHNoaWZ0LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEBwYXJhbSBzaGlmdAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIHNhbWVBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KTsKLQotCS8qKgotCSAqIFRlc3RzIGlmIDxjb2RlPm9sZFJlZ2lvbjwvY29kZT4gaXMgc2FtZSBhcyA8Y29kZT5uZXdSZWdpb248L2NvZGU+LAotCSAqIGlnbm9yaW5nIHBvc2l0aW9uIG9mZnNldHMgb2YgPGNvZGU+c2hpZnQ8L2NvZGU+LgotCSAqIAotCSAqIElTU1VFOiB3aGljaCBkb2N1bWVudCByZWdpb24gYXJlIG9sZCBhbmQgbmV3IGluPwotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICogCi0JICogQHBhcmFtIG9sZFJlZ2lvbgotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBuZXdSZWdpb24KLQkgKiBAcGFyYW0gc2hpZnQKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCk7Ci0KLQkvKioKLQkgKiBTZXQgdG8gdHJ1ZSBpZi93aGVuIHRoaXMgcmVnaW9uIGlzIHJlbW92ZWQgZnJvbSBhIGRvY3VtZW50LCBkdXJpbmcgdGhlCi0JICogcHJvY2VzcyBvZiByZS1wYXJzaW5nLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICogCi0JICogQHBhcmFtIGRlbGV0ZWQKLQkgKi8KLQl2b2lkIHNldERlbGV0ZWQoYm9vbGVhbiBkZWxldGVkKTsKLQotCS8qKgotCSAqIFNldCB0byB0cnVlIGJ5IHBhcnNlci9yZXBhcnNlciBpZiByZWdpb24gZGVlbWVkIHRvIGVuZCBzeW50YWN0aWNhbGx5LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICogCi0JICogQHBhcmFtIGhhc0VuZAotCSAqLwotCXZvaWQgc2V0RW5kZWQoYm9vbGVhbiBoYXNFbmQpOwotCi0JLyoqCi0JICogU2V0cyBsZW5ndGggb2YgcmVnaW9uLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoaW50IG5ld0xlbmd0aCk7Ci0KLQkvKioKLQkgKiBBc3NpZ25zIHBvaW50ZXIgdG8gbmV4dCByZWdpb24sIG9yIG51bGwgaWYgbGFzdCByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIHNldE5leHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0KTsKLQotCS8qKgotCSAqIEFzc2lnbnMgcGFyZW50IGRvY3VtbmV0LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KTsKLQotCS8qKgotCSAqIEFzc2lnbnMgcG9pbnRlciB0byBwcmV2aW91cyByZWdpb24sIG9yIG51bGwgaWYgZmlyc3QgcmVnaW9uLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBzZXRQcmV2aW91cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzKTsKLQotCS8qKgotCSAqIFNldHMgc3RhcnQgb2Zmc2V0IG9mIHJlZ2lvbiwgcmVsYXRpdmUgdG8gYmVnaW5uaW5nIG9mIGRvY3VtZW50LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBzZXRTdGFydChpbnQgbmV3U3RhcnQpOwotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0NDMxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgY2xhc3MgdXNlZCB0byBwcm92aWRlIGEgbGlzdCBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBzbyB0aGUKLSAqIGltcGxlbWVudGF0aW9uIG9mIGhvdyB0aGUgbGlzdCBpcyBmb3JtZWQgY2FuIGJlIGhpZGRlbiAoZW5jYXBzdWxhdGVkIGJ5Ci0gKiB0aGlzIGNsYXNzKS4KLSAqIAotICogSVNTVUU6IHNob3VsZCBleHRlbmQgSVRleHRSZWdpb25MaXN0IGluc3RlYWQ/Ci0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgewotCi0JLyoqCi0JICogUmV0dXJucyBlbnVtZXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGVudW1lcmF0aW9uLgotCSAqLwotCUVudW1lcmF0aW9uIGVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNpemUgb2YgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHNpemUgb2YgbGlzdC4KLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBhdCBpbmRleCBpLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBpbmRleCBvZiByZWdpb24gdG8gcmV0dXJuCi0JICogQHJldHVybiB0aGUgcmVnaW9uIGF0IHNwZWNpZmllZCBvZmZzZXQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpdGVtKGludCBpKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFBhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzIwMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb25pbmcgZm9yIFN0cnVjdHVyZWREb2N1bWVudHMuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcyB7Ci0KLQlTdHJpbmcgREVGQVVMVF9QQVJUSVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVTktOT1dOX1BBUlRJVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLlVOS05PV05fUEFSVElUSU9OX1RZUEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFBhcnRpdGlvbmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2U5NDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFBhcnRpdGlvbmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0gKiBJZGVudGlmaWVzIHRoZSB3YXkgdGhhdCBEb2N1bWVudHMgYXJlIHBhcnRpdGlvbmVkLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFBhcnRpdGlvbmluZyB7Ci0JCi0JLyoqIFN0cmluZyB0byBpZGVudGlmeSBkZWZhdWx0IHBhcnRpdGlvbmluZyovCi0JU3RyaW5nIERFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRlZmF1bHRfc3RydWN0dXJlZF90ZXh0X3BhcnRpdGlvbmluZyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTNmOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLklTdHJ1Y3R1cmVkVHlwZWRSZWdpb247Ci0KLQotLyoqCi0gKiBBIHBhcnRpdGlvbmVyIGludGVyZmFjZSByZXF1aXJlZCBmb3IgaGFuZGxpbmcgdGhlIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSAKLSAqIHByb3Blcmx5LiAKLSAqIAotICogSVNTVUU6IG5lZWQgdG8gaW52ZXN0aWdhdGUgbmVjZXNzaXR5IG9mIHRoZXNlIG1ldGhvZHMKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBleHRlbmRzIElEb2N1bWVudFBhcnRpdGlvbmVyIHsKLQotCS8qKgotCSAqIFVzZWQgYnkgSlNQIHBhcnRpdGlvbmVyIHRvIGVuc3VyZSB0aGF0IHRoZSBwYXJ0aXRpb25lciBvZiB0aGUKLQkgKiBlbWJlZGRlZCBjb250ZW50IHR5cGUgZ2V0cyB0byBjcmVhdGUgdGhlIHBhcnRpdGlvbiBpbiBjYXNlIHRoZSBzcGVjaWZpYwotCSAqIGNsYXNzZXMgYXJlIGltcG9ydGFudC4KLQkgKiAKLQkgKiBJU1NVRTogaW52ZXN0aWdhdGUgaWYgd2UgcmVhbGx5IG5lZWQgdGhpcy4uLgotCSAqLwotCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gY3JlYXRlUGFydGl0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBwYXJ0aXRpb25UeXBlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIERlZmF1bHQgcGFydGl0aW9uIHR5cGUgZm9yIHRoaXMgcGFydGl0aW9uZXIuCi0JICogPHA+Ci0JICogZWc6Ci0JICogPGJyPjxjb2RlPm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUPC9jb2RlPgotCSAqIDxicj48Y29kZT5vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVDwvY29kZT4KLQkgKiA8YnI+PGNvZGU+b3JnLmVjbGlwc2Uud3N0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQ8L2NvZGU+Ci0JICogPC9wPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9ucwotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9ucwotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBEZWZhdWx0IHBhcnRpdGlvbiB0eXBlIGZvciB0aGlzIHBhcnRpdGlvbmVyLgotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGljdWxhciBwYXJ0aXRpb24gdHlwZSBmb3IgdGhlIGdpdmVuIHJlZ2lvbi9vZmZzZXQuCi0JICogPHA+Ci0JICogZWc6Ci0JICogPGJyPjxjb2RlPm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUPC9jb2RlPgotCSAqIDxicj48Y29kZT5vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVDwvY29kZT4KLQkgKiA8YnI+PGNvZGU+b3JnLmVjbGlwc2Uud3N0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQ8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24gb2YgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiBAcGFyYW0gb2Zmc2V0IGluIHRoZSBJU3RydWN0dXJlZERvdWNtZW50Ci0JICogQHJldHVybiB0aGUgcGFydGljdWxhciBwYXJ0aXRpb24gdHlwZSBmb3IgdGhlIGdpdmVuIHJlZ2lvbi9vZmZzZXQuCi0JICovCi0JU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZyBvZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAKLQkgKiBiZXR3ZWVuIHRoZSAyIHJlZ2lvbiBwYXJhbWV0ZXJzLgotCSAqIFVzZWZ1bCBmb3IgZmluZGluZyB0aGUgcGFydGl0aW9uIHR5cGUgb2YgYSAwIGxlbmd0aCByZWdpb24uCi0JICogZWcuCi0JICogPHByZT4KLQkgKiAJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnw8L3NjcmlwdD4KLQkgKiA8L3ByZT4KLQkgKiBAcGFyYW0gcHJldmlvdXNOb2RlCi0JICogQHBhcmFtIG5leHROb2RlCi0JICogQHJldHVybiB0aGUgcGFydGl0aW9uIHR5cGUgb2YgdGhlIG5vZGUgYmV0d2VlbiBwcmV2aW91c05vZGUgYW5kIG5leHROb2RlCi0JICogQGRlcHJlY2F0ZWQgbW92ZSB0byBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIgLT4KLQkgKiAgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQsIGJvb2xlYW4gcHJlZmVyT3BlblBhcnRpdGlvbnMpOwotCSAqLwotCVN0cmluZyBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFRleHRSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNkZmExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFRleHRSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCi0vKioKLSAqIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIGRlc2NyaWJlcyB0aGUgY2hhcmFjdGVyaXN0aWNzIGFuZCByZXNwb25zaWJpbGl0aWVzCi0gKiBmb3IgcmVwYXJzaW5nIGEgc3RydWN0dXJlZCBkb2N1bWVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgewotCi0JLyoqCi0JICogQmVnaW5zIHRoZSBwcm9jZXNzIG9mIHJlcGFyc2luZywgYnkgcHJvdmlkaW5nIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQKLQkgKiBmb3IgdGhlIHJlcGFyc2UuIFRoZSByZXBhcnNlIGlzIGFjdHVhbGx5IHBlcmZvcm1lZCB3aGVuIHRoZSByZXBhcnNlCi0JICogbWV0aG9kIGlzIGNhbGxlZC4gV2lsbCB0aHJvdWdoIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBkb2N1bWVudCBhcwotCSAqIG5vdCBiZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZShPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIHRvIGVuYWJsZSBtdWx0aXBsZSB0aHJlYWRzIHRvIHJlcGFyc2UgYQotCSAqIGRvY3VtZW50LiBUaGlzIGlzIG5lZWRlZCBzaW5jZSB0aGUgaW50aWFsaXplIG1ldGhvZCBzZXRzIHN0YXRlCi0JICogdmFyaWFibGVzIHRoYXQgbXVzdCBiZSAiaW4gc3luYyIgd2l0aCB0aGUgc3RydWN0dXJlZERvY3VtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyc2luZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHJlcGFyc2VyLCB1c2VkIHdoZW4gY2xvbmluZyBkb2N1bWVudHMuCi0JICogCi0JICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHJlcGFyc2VyLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogQW4gZW50cnkgcG9pbnQgZm9yIHJlcGFyc2luZy4gSXQgbmVlZHMgdG8gY2FsY3VsYXRlcyB0aGUgZGlydHkgc3RhcnQKLQkgKiBhbmQgZGlydHkgZW5kIGluIHRlcm1zIG9mIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucyBiYXNlZCBvbiB0aGUKLQkgKiBzdGFydCBwb2ludCBhbmQgbGVuZ3RoIG9mIHRoZSBjaGFuZ2VzLCB3aGljaCBhcmUgcHJvdmlkZWQgYnkgdGhlCi0JICogaW5pdGlhbGl6ZSBtZXRob2QuIFdpbGwgdGhyb3VnaCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgZG9jdW1lbnQgYXMKLQkgKiBub3QgYmUgc2V0LgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKCk7Ci0KLQotCi0JLyoqCi0JICogVGhlIHJlcGFyc2VyIGlzIGluaXRpYWxpemVkIHdpdGggaXRzIGRvY3VtZW50LCBlaXRoZXIgaW4gb3Igc2hvcnRseQotCSAqIGFmdGVyIGl0cyBjb25zdHJ1Y3RlZCBpcyBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTI4MWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCi0vKioKLSAqIEEgc2ltcGxlIGRlc2NyaXB0aW9uIG9mIGEgYml0IG9mIHRleHQgKHRlY2huaWNhbGx5LCBhIGJpdCBvZiBhIHRleHQgYnVmZmVyKQotICogdGhhdCBoYXMgYSAidHlwZSIgYXNzb2NpYXRlZCB3aXRoIGl0LiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBYTUwgdGV4dAotICogIiZMVDtJTUcmR1Q7IiwgdGhlICcgPCcgbWlnaHQgZm9ybSBhIHJlZ2lvbiBvZiB0eXBlICJvcGVuIGJyYWNrZXQiIHdoZXJlIGFzCi0gKiB0aGUgdGV4dCAiSU1HIiBtaWdodCBmb3JtIGEgcmVnaW9uIG9mIHR5cGUgInRhZyBuYW1lIi4KLSAqIAotICogTm90ZSB0aGF0IHRoZXJlIGFyZSB0aHJlZSBwb3NpdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcmVnaW9uLCB0aGUgc3RhcnQsCi0gKiB0aGUgZW5kLCBhbmQgdGhlIGVuZCBvZiB0aGUgdGV4dC4gVGhlIGVuZCBvZiB0aGUgcmVnaW9uIHNob3VsZCBhbHdheXMgYmUKLSAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZW5kIG9mIHRoZSB0ZXh0LCBiZWNhdXNlIHRoZSBlbmQgb2YgdGhlIHRleHQKLSAqIHNpbXBseSBpbmNsdWRlcyBhbnkgd2hpdGUgc3BhY2UgdGhhdCBtaWdodCBmb2xsb3cgdGhlIG5vbi13aGl0ZXNwYWNlCi0gKiBwb3J0aW9uIG9mIHRoZSByZWdpb24uIFRoaXMgd2hpdGVzcGFjZSBpcyBhc3N1bWVkIHRvIGJlIGlnbm9yYWJsZSBleGNlcHQKLSAqIGZvciByZWFzb25zIG9mIG1haW50YWluaW5nIGl0IGluIHRoZSBvcmlnaW5hbCBkb2N1bWVudCBmb3IgZm9ybWF0dGluZywKLSAqIGFwcGVhcmFuY2UsIGV0Yy4KLSAqIAotICogRm9sbG93cyB0aGUgUHJpbWUgRGlyZWN0aXZlczoKLSAqIAotICogZ2V0RW5kKCkgPT0gZ2V0U3RhcnQoKSArIGdldExlbmd0aCgpCi0gKiAKLSAqIGdldFRleHRFbmQoKSA9PSBnZXRTdGFydCgpICsgZ2V0VGV4dExlbmd0aCgpOwotICogCi0gKiBFdmVudCB0aG91Z2ggJ2VuZCcgYW5kICdsZW5ndGgnIGFyZSByZWR1bmRhbnQgKGdpdmVuIHN0YXJ0KSwgYm90aCBtZXRob2RzCi0gKiBhcmUgcHJvdmlkZWQsIHNpbmNlIHNvbWUgcGFyc2Vycy9pbXBsZW1lbnRhdGlvbnMgZmF2b3Igb25lIG9yIHRoZSBvdGhlciBmb3IKLSAqIGVmZmljaWVuY3kuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0UmVnaW9uIHsKLQotCS8qKgotCSAqIENoYW5nZXMgbGVuZ3RoIG9mIHJlZ2lvbi4gTWF5IGJlIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbgotCSAqIHplcm8uIEl0IG1heSBub3QsIGhvd2V2ZXIsIGNhdXNlIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbiB0byBiZSBsZXNzCi0JICogdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBvciBhbiBpbGxlZ2FsIGFyZ3VtZW50IGFjY2VwdGlvbiBtYXkgYmUgdGhyb3duCi0JICogYXQgcnVudGltZS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKTsKLQotCS8qKgotCSAqIENoYW5nZXMgc3RhcnQgb2Zmc2V0IG9mIHJlZ2lvbi4gTWF5IGJlIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIKLQkgKiB0aGFuIHplcm8uIEl0IG1heSBub3QsIGhvd2V2ZXIsIGNhdXNlIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lvbiB0byBiZQotCSAqIGxlc3MgdGhhbiB6ZXJvLCBvciBhbiBpbGxlZ2FsIGFyZ3VtZW50IGFjY2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0JICogcnVudGltZS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgYWRqdXN0U3RhcnQoaW50IGkpOwotCi0JLyoqCi0JICogQ2hhbmdlcyB0ZXh0IGxlbmd0aCBvZiByZWdpb24uCi0JICogCi0JICogTWF5IGJlIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvLiBJdCBtYXkgbm90LCBob3dldmVyLAotCSAqIGNhdXNlIHRoZSB0ZXh0IGxlbmd0aCBvZiB0aGUgcmVnaW9uIHRvIGJlIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIGEKLQkgKiByZWdpb24sIG9yIGFuIGlsbGVnYWwgYXJndW1lbnQgYWNjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQgcnVudGltZS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSk7Ci0KLQkvKioKLQkgKiBNYWtlcyB0aGlzIHJlZ2lvbnMgc3RhcnQsIGxlbmd0aCwgYW5kIHRleHQgbGVuZ3RoIGVxdWFsIHRvIHRoZQotCSAqIHBhcmVtdGVyJ3Mgc3RhcnQsIGxlbmd0aCwgYW5kIHRleHQgbGVuZ3RoLgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKi8KLQl2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHJlZ2lvbi4gV2hldGhlciBpcyByZWxhdGl2ZSB0byB0aGUKLQkgKiBkb2N1bWVudCwgb3IgYW5vdGhlciByZWdpb24gZGVwZW5kcyBvbiB0aGUgc3VidHlwZS4KLQkgKiAKLQkgKiBGb2xsb3dzIHRoZSBQcmltZSBEaXJlY3RpdmU6IGdldEVuZCgpID09IGdldFN0YXJ0KCkgKyBnZXRMZW5ndGgoKQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhpcyByZWdpb24uCi0JICovCi0JaW50IGdldEVuZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24uCi0JICogCi0JICogRm9sbG93cyB0aGUgUHJpbWUgRGlyZWN0aXZlOiBnZXRFbmQoKSA9PSBnZXRTdGFydCgpICsgZ2V0TGVuZ3RoKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uLiBXaGV0aGVyIGlzIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCwKLQkgKiBvciBhbm90aGVyIHJlZ2lvbiBkZXBlbmRzIG9uIHRoZSBzdWJ0eXBlLgotCSAqIAotCSAqIEZvbGxvd3MgdGhlIFByaW1lIERpcmVjdGl2ZTogZ2V0RW5kKCkgPT0gZ2V0U3RhcnQoKSArIGdldExlbmd0aCgpCi0JICogCi0JICogQHJldHVybiB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhpcyByZWdpb24uCi0JICogCi0JICogSW4gc29tZSBpbXBsZW1lbnRhdGlvbnMsIHRoZSAiZW5kIiBvZiB0aGUgcmVnaW9uIChhY2Nlc3NpYmxlIHZpYQotCSAqIGdldEVuZCgpKSBhbHNvIGNvbnRhaW5zIGFueSBhbmQgYWxsIHdoaXRlIHNwYWNlIHRoYXQgbWF5IG9yIG1heSBub3QgYmUKLQkgKiBwcmVzZW50IGFmdGVyIHRoZSAidG9rZW4iIChyZWFkOiByZWxldmFudCkgcGFydCBvZiB0aGUgcmVnaW9uLiBUaGlzCi0JICogbWV0aG9kLCBnZXRUZXh0RW5kKCksIGlzIHNwZWNpZmljIGZvciB0aGUgInRva2VuIiBwYXJ0IG9mIHRoZSByZWdpb24sCi0JICogd2l0aG91dCB0aGUgd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLgotCSAqLwotCWludCBnZXRUZXh0RW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgb2YgdGhpcyByZWdpb24uCi0JICogCi0JICogVGhlIHRleHQgbGVuZ3RoIGlzIGVxdWFsIHRvIGxlbmd0aCBpZiB0aGVyZSBpcyBubyB3aGl0ZSBzcGFjZSBhdCB0aGUKLQkgKiBlbmQgb2YgYSByZWdpb24uIE90aGVyd2lzZSBpdCBpcyBzbWFsbGVyIHRoYW4gbGVuZ3RoLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0VGV4dExlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBAc2VlIHJlZ2lvbnR5cGVzLCBzdHJ1Y3R1cmVkZG9jdW1lbnRyZWdpb250eXBlcwotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyByZWdpb24uCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEFsbG93cyB0aGUgcmVnaW9uIGl0c2VsZiB0byBwYXJ0aWNpcGF0ZSBpbiByZXBhcnNpbmcgcHJvY2Vzcy4KLQkgKiAKLQkgKiBUaGUgcmVnaW9uIGl0c2VsZiBjYW4gZGVjaWRlIGlmIGl0IGNhbiBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50Ci0JICogdG8gcmV0dXJuLCBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGNoYW5nZS4gSWYgaXQgY2FuIG5vdCwgdGhpcyBtZXRob2QKLQkgKiBtdXN0IHJldHVybiBudWxsLCBzbyBhICJoaWdoZXIgbGV2ZWwiIHJlcGFyc2luZyBwcm9jZXNzIHdpbGwgYmUgZ2l2ZW4KLQkgKiB0aGUgb3BwdXJ0dW5pdHkgdG8gZGVjaWRlLiBJZiBpdCByZXR1cm5zIGFuIEV2ZW50LCB0aGF0J3MgaXQsIG5vdCBvdGhlcgotCSAqIHJlcGFyc2luZyBwcm9jZXNzIHdpbGwgZ2V0IGFuIG9wcHVydHVuaXR5IHRvIHJlcGFyc2UuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODg5MGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIElUZXh0UmVnaW9uQ29sbGVjdGlvbiwgYXMgaXRzIG5hbWUgaW1wbGllcywgaXMgYSBjb2xsZWN0aW9uIG9mCi0gKiBJVGV4dFJlZ2lvbnMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBleHRlbmRzIElUZXh0UmVnaW9uIHsKLQotCS8qKgotCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgcmVnaW9uIGNvbnRhaW5zIGEgcGFydGljdWxhciBvZmZzZXQsIHdoZXJlCi0JICogb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVnaW9ucyBzdGFydCBhbmQKLQkgKiAgICAgICAgIGxlc3MgdGhhbiBpdHMgZW5kIG9mZnNldC4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogVXNlZCB0byBkZXRlcm1pbmUgaWYgYSByZWdpb24gY29udGFpbnMgYSBwYXJ0aWN1bGFyIG9mZnNldC4KLQkgKiAKLQkgKiBJU1NVRTogSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGlzIGlzIHJlYWxseSBmb3IhICh0aGF0IGlzLCBob3cgdG8KLQkgKiBkZXNjcmliZSBpdCwgb3IgaWYgc3RpbGwgbmVlZGVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVnaW9ucyBzdGFydCBhbmQKLQkgKiAgICAgICAgIGxlc3MgdGhhbiBpdHMgZW5kIG9mZnNldC4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLCByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YKLQkgKiBkb2N1bWVudC4KLQkgKiAKLQkgKiBGb3Igc29tZSBzdWJ0eXBlcywgYnV0IG5vdCBhbGwsIGl0IGlzIGVxdWl2aWxlbnQgdG8gZ2V0RW5kKCkuCi0JICogCi0JICogQHJldHVybiB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0LCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudCBvZgotCSAqIHRoZSBjb250YWluZWQgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZWRSZWdpb24KLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLgotCSAqLwotCWludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IHJlZ2lvbiBvZiB0aG9zZSBjb250YWluZWQgYnkgdGhpcyByZWdpb24gY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGwgdGV4dCBvZiB0aGlzIHJlZ2lvbiwgaW5jbHVkaW5nIHdoaXRlc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZnVsbCB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbFRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGwgdGV4dCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbiwgaW5jbHVkaW5nIHdoaXRlc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbFRleHQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhc3QgcmVnaW9uIG9mIHRob3NlIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbiBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhc3QgcmVnaW9uLgotCSAqLwotCUlUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcmVnaW9ucyBjb250YWluZWQgYnkgdGhpcyByZWdpb24uCi0JICovCi0JaW50IGdldE51bWJlck9mUmVnaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaW9uIHRoYXQgY29udGFpbnMgb2Zmc2V0LiBJbiB0aGUgY2FzZSBvZiAibmVzdGVkIgotCSAqIHJlZ2lvbnMsIHJldHVybnMgdGhlIHRvcCBtb3N0IHJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICByZWxhdGl2ZSB0byBiZWdpbm5pbmcgb2YgZG9jdW1lbnQuCi0JICogQHJldHVybiB0aGUgcmVnaW9uIHRoYXQgY29udGFpbnMgb2Zmc2V0LiBJbiB0aGUgY2FzZSBvZiAibmVzdGVkIgotCSAqICAgICAgICAgcmVnaW9ucywgcmV0dXJucyB0aGUgdG9wIG1vc3QgcmVnaW9uLgotCSAqLwotCUlUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaW9ucyBjb250YWluZWQgYnkgdGhpcyByZWdpb24uCi0JICogCi0JICogTm90ZTogbm8gYXNzdW1wdGlvbnMgc2hvdWxkIGJlIG1hZGUgYWJvdXQgdGhlIG9iamVjdCBpZGVudGl0eSBvZiB0aGUKLQkgKiByZWdpb25zIHJldHVybmVkLiBQdXQgYW5vdGhlciB3YXksIGR1ZSB0byBtZW1vcnkgdXNlIG9wdGltaXphdGlvbnMsCi0JICogZXZlbiBpZiB0aGUgdW5kZXJseWluZyB0ZXh0IGhhcyBub3QgY2hhbmdlZCwgdGhlIHJlZ2lvbnMgbWF5IG9yIG1heSBub3QKLQkgKiBiZSB0aGUgc2FtZSBvbmVzIHJldHVybmVkIGZyb20gb25lIGNhbGwgdG8gdGhlIG5leHQuCi0JICogCi0JICogQHJldHVybiB0aGUgcmVnaW9ucyBjb250YWluZWQgYnkgdGhpcyByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGlzIHJlZ2lvbiwgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZgotCSAqIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhpcyByZWdpb24KLQkgKi8KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbiwgcmVsYXRpdmUgdG8gdGhlCi0JICogYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24KLQkgKi8KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhpcyByZWdpb24sIG5vdCBpbmNsdWRpbmcgd2hpdGUgc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbiwgbm90IGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbiwgbm90IGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlCi0JICogc3BhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbiwgbm90IGluY2x1ZGluZyB3aGl0ZQotCSAqICAgICAgICAgc3BhY2UuCi0JICovCi0JaW50IGdldFRleHRFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIG5vdAotCSAqIGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBub3QKLQkgKiAgICAgICAgIGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKi8KLQlpbnQgZ2V0VGV4dEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogQXNzaWducyB0aGUgY29sbGVjdGlvbiBjb250YWluZWQgaW4gdGhpcyByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVkUmVnaW9ucwotCSAqLwotCXZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgY29udGFpbmVkUmVnaW9ucyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTRjYTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0gKiBJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWlucyBvdGhlciByZWdpb25zLCBsaWtlIGEgSVRleHRSZWdpb25Db2xsZWN0aW9uCi0gKiBidXQgaXMgaXRzZWxmIGEgcmVnaW9uIGluIGFuIElUZXh0UmVnaW9uQ29sbGVjdGlvbiwgc28gaXRzICJwYXJlbnQiIHJlZ2lvbgotICogaXMgbWFpbnRhaW5lZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb25Db250YWluZXIgZXh0ZW5kcyBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IHJlZ2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgcmVnaW9uLgotCSAqLwotCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCByZWdpb24uCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgSVRleHRSZWdpb25Db2xsZWN0aW9uIHRoaXMgcmVnaW9uIGlzIGNvbnRhaW5lZCBpbi4KLQkgKi8KLQl2b2lkIHNldFBhcmVudChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlNDZkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb25MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIElUZXh0UmVnaW9uTGlzdCBpcyB0byBwcm92aWRlIGEgbGlzdCBvZiByZWdpb25zLiBJdCBjYW4gYmUgdXNlZCBzbyBjbGllbnRzCi0gKiBkbyBub3QgbmVlZCB0byBiZSBhd2FyZSBvZiB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0UmVnaW9uTGlzdCB7Ci0KLQkvKioKLQkgKiBBZGRzIHJlZ2lvbiB0byB0aGUgbGlzdC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoSVRleHRSZWdpb24gcmVnaW9uKTsKLQotCS8qKgotCSAqIEFkZHMgbmV3IHJlZ2lvbnMgdG8gdGhlIGxpc3QuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seSwgd2hpbGUgbGlzdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiBAcGFyYW0gbmV3UmVnaW9ucwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluc2VydFBvcywgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgcmVnaW9ucyBmcm9tIHRoZSBsaXN0LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHksIHdoaWxlIGxpc3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpb24gYXQgPGNvZGU+aW5kZXg8L2NvZGU+LCB3aGVyZSAwIGlzIGZpcnN0IG9uZSBpbgotCSAqIHRoZSBsaXN0LiBUaHJvd3MgYW4gPGNvZGU+QXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uPC9jb2RlPiBpZgotCSAqIGxpc3QgaXMgZW1wdHksIG9yIGlmIGluZGV4IGlzIG91dCBvZiByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5kZXggb2YgPGNvZGU+cmVnaW9uPC9jb2RlPiBvciAtMSBpZiA8Y29kZT5yZWdpb248L2NvZGU+Ci0JICogaXMgbm90IGluIHRoZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBpbmRleE9mKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbGlzdCBoYXMgbm8gcmVnaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgbGlzdCBoYXMgbm8gcmVnaW9ucy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCk7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIHRoaXMgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciB0aGlzIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSByZWdpb24gYXQgaW5kZXguCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seSwgd2hpbGUgbGlzdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqIAotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiByZW1vdmUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHJlZ2lvbkxpc3QgZnJvbSB0aGlzIGxpc3QuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seSwgd2hpbGUgbGlzdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCk7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIHJlZ2lvbnMgaW4gYW4gYXJyYXkuIE5vIGFzc3VtcHRpb25zIHNob3VsZCBiZQotCSAqIG1hZGUgaWYgdGhlIHJlZ2lvbnMgaW4gdGhlIGFycmF5IGFyZSBjbG9uZXMgYXJlIHNhbWUgaW5zdGFuY2Ugb2YKLQkgKiBvcmlnaW5hbCByZWdpb24uCi0JICogCi0JICogSVNTVUU6IGRvIHdlIG5lZWQgdG8gc3BlY2lmeSBpZiBjbG9uZWQgY29waWVzIG9yIG5vdD8KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uW10gdG9BcnJheSgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM5OGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSBpbml0aWFsIElEb2N1bWVudEV4dGVuc2lvbjQgc3VwcG9ydCAtICMxMDI4MjIKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQYXJ0aXRpb25pbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdExpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5TZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLlN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotCi0vKioKLSAqIFRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiBzdHJ1Y3R1cmVkIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50LCBJRG9jdW1lbnRFeHRlbnNpb24sIElEb2N1bWVudEV4dGVuc2lvbjMsIElEb2N1bWVudEV4dGVuc2lvbjQsIENoYXJTZXF1ZW5jZSwgSVJlZ2lvbkNvbXBhcmlibGUgewotCi0JLyoqCi0JICogVGhpcyBUaHJlYWRMb2NhbCBjb25zdHJ1Y3QgaXMgdXNlZCBzbyBlYWNoIHRocmVhZCBjYW4gbWFpbnRhaW4gaXRzIG9ubHkKLQkgKiBwb2ludGVyIHRvIHRoZSBkb3VibGUgbGlua2VkIGxpc3QgdGhhdCBtYW5hZ2VzIHRoZSBkb2N1bWVudHMgcmVnaW9ucy4KLQkgKiBUaGUgb25seSB0aGluZyB3ZSAiZ2F1cmQiIGZvciBpcyB0aGF0IGEgcHJldmlvdXNseSBjYWNoZWQgcmVnaW9uIGhhcwotCSAqIGJlZW4gZGVsZXRlZC4KLQkgKiAKLQkgKiBUaGUgb2JqZWN0IHRoYXQgaXMga2VwdCBpbiB0aGUgdGhyZWFkIGxvY2FsJ3MgbWFwLCBpcyBqdXN0IGEgcG9pbnRlciB0bwotCSAqIGFuIGFycmF5IHBvc2l0aW9uLiBUaGF0J3MgYmVjYXVzZSB0aGUgb2JqZWN0IHRoZXJlIG5lZWRzIHRvIGJlICJmcmVlIgotCSAqIGZyb20gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzLCBvciBpdCB3aWxsIG5vdCBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEN1cnJlbnREb2N1bWVudFJlZ2lvbkNhY2hlIHsKLQkJLy8gSSdtIGFzc3VtaW5nIGZvciBub3cgdGhlcmUgd291bGQgbmV2ZXIgYmUgc28gbWFueSB0aHJlYWRzIHRoYXQKLQkJLy8gdGhpcyBhcnJheUxpc3QgbmVlZHMgdG8gYmUgYm91bmRlZCwgb3IgJ2NsZWFuZWQgdXAnLgotCQkvLyB0aGlzIGFzc3VtcHRpb24gc2hvdWxkIGJlIHRlc3RlZCBpbiBwcmFjdGljZSBhbmQgbG9uZyBydW5uaW5nCi0JCS8vIGpvYnMgLS0gZm91bmQgbm90IHRvIGJlIGEgZ29vZCBhc3N1bXB0aW9uLiBTZWUgYmVsb3cuCi0JCXByaXZhdGUgTGlzdCBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5ID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0KCkpOwotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkJcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NJWkUgPSA1MDsKLQotCi0JCXByaXZhdGUgVGhyZWFkTG9jYWwgdGhyZWFkTG9jYWxDYWNoZVBvc2l0aW9uID0gbmV3IFRocmVhZExvY2FsKCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXQoKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQlpbnQgcG9zID0gZ2V0VGhyZWFkTG9jYWxQb3NpdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlyZWdpb24gPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5nZXQocG9zKTsKLQkJCX0KLQkJCWNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBldmVuIHRob3VnaCB0aGUgY2FjaGVkUmVnaW9uUG9zaXRpb24gaXMgc3luY2hyb25pemVkLAotCQkJCS8vIHRoYXQganVzdCBtZWFucyBlYWNoIGFjY2VzcyBpcyBzeW5jcm9uaXplZCwgaXRzCi0JCQkJLy8gc3RpbGwgcG9zc2libGUgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGNhdXNlIGl0IHRvCi0JCQkJLy8gYmUgY2xlYXJlZCwgYWZ0ZXIgdGhpcyB0aHJlYWQgZ2V0cyBpdCBwb3NpdGlvbi4KLQkJCQkvLyBTbywgaWYgdGhhdCBoYXBwZW5zLCBhbGwgd2UgY2FuIGRvIGlzIHJlc2V0IHRvIGJlZ2lubmluZy4KLQkJCQkvLyBUaGlzIHNob3VsZCBiZSBleHRyZW1lbHkgcmFyZSAoaW4gb3RoZXIgd29yZHMsIHByb2JhYmx5Ci0JCQkJLy8gbm90IHdvcnRoIHVzaW5nIHN5bmNocm9uaXplZCBibG9ja3MKLQkJCQkvLyB0byBhY2Nlc3MgY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS4KLQkJCQlyZWluaXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQkJcmVzZXRUb0luaXRpYWxTdGF0ZSgpOwotCQkJfQotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJcmVnaW9uID0gcmVzZXRUb0luaXRpYWxTdGF0ZSgpOwotCQkJfQotCQkJZWxzZQotCQkJLy8gcmVnaW9uIG5vdCBudWxsCi0JCQlpZiAocmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQkJcmVnaW9uID0gcmVzZXRUb0luaXRpYWxTdGF0ZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCi0JCXByaXZhdGUgaW50IGdldFRocmVhZExvY2FsUG9zaXRpb24oKSB7Ci0JCQlPYmplY3QgdGhyZWFkTG9jYWxPYmplY3QgPSB0aHJlYWRMb2NhbENhY2hlUG9zaXRpb24uZ2V0KCk7Ci0JCQlpbnQgcG9zID0gLTE7Ci0JCQlpZiAodGhyZWFkTG9jYWxPYmplY3QgPT0gbnVsbCkgewotCi0JCQkJcG9zID0gcmVpbml0VGhyZWFkTG9jYWxQb3NpdGlvbigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcG9zID0gKChJbnRlZ2VyKSB0aHJlYWRMb2NhbE9iamVjdCkuaW50VmFsdWUoKTsKLQkJCX0KLQkJCXJldHVybiBwb3M7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgcmVpbml0VGhyZWFkTG9jYWxQb3NpdGlvbigpIHsKLQkJCUludGVnZXIgcG9zaXRpb247Ci0JCQlpbnQgcG9zOwotCQkJLy8gVE9ET19mdXR1cmU6IHRoaW5rIG9mIGEgYmV0dGVyIHNvbHV0aW9uIHRoYXQgZG9lc24ndAotCQkJLy8gcmVxdWlyZSB0aGlzIGtsdWRnZS4gVGhpcyBpcyBlc3BlY2lhbGx5IHJlcXVpcmVkIGJlY2F1c2UKLQkJCS8vIHNvbWUgaW5mcmFzdHVyZSwgc3VjaCBhcyByZWNvbmNpbGVyLCBhY3R1YWxseSBudWxsIG91dAotCQkJLy8gdGhlaXIgdGhyZWFkIG9iamVjdCBhbmQgcmVjcmVhdGUgaXQsIDUwMCBtc2VjcyBsYXRlcgotCQkJLy8gKGFwcHJveGltYXRlbHkpLgotCQkJLy8gTm90ZTogdGhlIGxpa2VseSBzb2x1dGlvbiBpbiBmdXR1cmUgaXMgdG8gY2xlYXIgYWZ0ZXIgZXZlcnkKLQkJCS8vIGhlYXZ5IHVzZSBvZiBnZXRDYWNoZWRSZWdpb24sIHN1Y2ggYXMgaW4gY3JlYXRpbmcgbm9kZQotCQkJLy8gbGlzdHMsIG9yIHJlcGFyc2luZyBvciBwYXJ0aW9uaW5nLgotCQkJaWYgKGNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuc2l6ZSgpID4gTUFYX1NJWkUpIHsKLQkJCQljYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LmNsZWFyKCk7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheSBjbGVhcmVkIGF0IHNpemUgIiArIE1BWF9TSVpFKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXBvc2l0aW9uID0gbmV3IEludGVnZXIoY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5zaXplKCkpOwotCQkJdGhyZWFkTG9jYWxDYWNoZVBvc2l0aW9uLnNldChwb3NpdGlvbik7Ci0JCQljYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LmFkZChwb3NpdGlvbi5pbnRWYWx1ZSgpLCBudWxsKTsKLQkJCXBvcyA9IHBvc2l0aW9uLmludFZhbHVlKCk7Ci0JCQlyZXR1cm4gcG9zOwotCQl9Ci0KLQkJcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc2V0VG9Jbml0aWFsU3RhdGUoKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbjsKLQkJCXJlZ2lvbiA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlzZXQocmVnaW9uKTsKLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQotCQkvLyBUT0RPOiBtYWtlIHByaXZpdGUgaWYgdXNlZCwgZWxzZSBkZWxldGUKLQkJdm9pZCBzZXQoaW50IHBvcywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJCWNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuc2V0KHBvcywgcmVnaW9uKTsKLQkJfQotCi0JCXZvaWQgc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCQl0cnkgewotCQkJCWludCBwb3MgPSBnZXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQkJY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5zZXQocG9zLCByZWdpb24pOwotCQkJfQotCQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCS8vIGV2ZW4gdGhvdWdoIHRoZSBjYWNoZWRSZWdpb25Qb3NpdGlvbiBpcyBzeW5jaHJvbml6ZWQsCi0JCQkJLy8gdGhhdCBqdXN0IG1lYW5zIGVhY2ggYWNjZXNzIGlzIHN5bmNyb25pemVkLCBpdHMKLQkJCQkvLyBzdGlsbCBwb3NzaWJsZSBmb3IgYW5vdGhlciB0aHJlYWQgdG8gY2F1c2UgaXQgdG8KLQkJCQkvLyBiZSBjbGVhcmVkLCBhZnRlciB0aGlzIHRocmVhZCBnZXRzIGl0IHBvc2l0aW9uLgotCQkJCS8vIFNvLCBpZiB0aGF0IGhhcHBlbnMsIGFsbCB3ZSBjYW4gZG8gaXMgcmVzZXQgdG8gYmVnaW5uaW5nLgotCQkJCS8vIFRoaXMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIChpbiBvdGhlciB3b3JkcywgcHJvYmFibHkKLQkJCQkvLyBub3Qgd29ydGggdXNpbmcgc3luY2hyb25pemVkIGJsb2NrcwotCQkJCS8vIHRvIGFjY2VzcyBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LgotCQkJCXJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCQlyZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIE51bGxEb2N1bWVudEV2ZW50IGlzIHVzZWQgdG8gY29tcGxldGUgdGhlICJhYm91dFRvQ2hhbmdlIiBhbmQKLQkgKiAiY2hhbmdlZCIgY3ljbGUsIHdoZW4gaW4gZmFjdCB0aGUgb3JpZ2luYWwgY2hhbmdlIGlzIG5vIGxvbmdlciB2YWxpZC4KLQkgKiBUaGUgb25seSBrbm93biAodmFsaWQpIGNhc2Ugb2YgdGhpcyBpcyB3aGVuIGEgbW9kZWwgcmUtaW5pdGlhbGl6ZSB0YWtlcwotCSAqIHBsYWNlLCB3aGljaCBjYXVzZXMgc2V0VGV4dCB0byBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBzb21lIHByZXZpb3VzCi0JICogY2hhbmdlLiBbVGhpcyBhcmNoaXRlY3R1cmUgd2lsbCBiZSBpbXByb3ZlZCBpbiBmdXR1cmVdLgotCSAqLwotCXB1YmxpYyBjbGFzcyBOdWxsRG9jdW1lbnRFdmVudCBleHRlbmRzIERvY3VtZW50RXZlbnQgewotCQlwdWJsaWMgTnVsbERvY3VtZW50RXZlbnQoKSB7Ci0JCQl0aGlzKEJhc2ljU3RydWN0dXJlZERvY3VtZW50LnRoaXMsIDAsIDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBOdWxsRG9jdW1lbnRFdmVudChJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQkJc3VwZXIoZG9jLCBvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZWdpc3RlcmVkUmVwbGFjZSB7Ci0JCS8qKiBUaGUgb3duZXIgb2YgdGhpcyByZXBsYWNlIG9wZXJhdGlvbi4gKi8KLQkJSURvY3VtZW50TGlzdGVuZXIgZk93bmVyOwotCQkvKiogVGhlIHJlcGxhY2Ugb3BlcmF0aW9uICovCi0JCUlEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSBmUmVwbGFjZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBidW5kbGUgb2JqZWN0LgotCQkgKiAKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGxpc3RlbmVyIG93bmluZyB0aGUgcmVwbGFjZSBvcGVyYXRpb24KLQkJICogQHBhcmFtIHJlcGxhY2UKLQkJICogICAgICAgICAgICB0aGUgcmVwbGFjZSBvcGVyYXRpb24KLQkJICovCi0JCVJlZ2lzdGVyZWRSZXBsYWNlKElEb2N1bWVudExpc3RlbmVyIG93bmVyLCBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgcmVwbGFjZSkgewotCQkJZk93bmVyID0gb3duZXI7Ci0JCQlmUmVwbGFjZSA9IHJlcGxhY2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGVzZSBjb250cm9sIHZhcmlhYmxlIGlzbid0IG1hcmsgYXMgJ2ZpbmFsJyBzaW5jZSB0aGVyZSdzIHNvbWUgdW5pdAotCSAqIHRlc3RzIHRoYXQgbWFuaXB1bGF0ZSBpdC4gRm9yIGZpbmFsIHByb2R1Y3QsIGl0IHNob3VsZCBiZS4KLQkgKi8KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gVVNFX0xPQ0FMX1RIUkVBRCA9IHRydWU7Ci0KLQkvKioKLQkgKiBwdXJlbHkgZm9yIGRlYnVnZ2luZy9wZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMgSW4gcHJhY3RpY2UsIHdvdWxkIGFsd2F5cwotCSAqIGJlICd0cnVlJy4gKGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ5IGNhbGxlZCBieSBjbGllbnRzKS4gSXRzIG5vdAotCSAqICdmaW5hbCcgb3IgcHJpdmF0ZSBqdXN0IHNvIGl0IGNhbiBiZSB2YXJpZWQgZHVyaW5nCi0JICogZGVidWdnaW5nL3BlcmZvcm1hbmNlIG1lYXN1cmVtZW50IHJ1bnMuCi0JICogCi0JICogQHBhcmFtIHVzZV9sb2NhbF90aHJlYWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VVNFX0xPQ0FMX1RIUkVBRChmaW5hbCBib29sZWFuIHVzZV9sb2NhbF90aHJlYWQpIHsKLQkJVVNFX0xPQ0FMX1RIUkVBRCA9IHVzZV9sb2NhbF90aHJlYWQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNhY2hlZERvY3VtZW50UmVnaW9uOwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50bzsKLQlwcml2YXRlIGJvb2xlYW4gZkFjY2VwdFBvc3ROb3RpZmljYXRpb25SZXBsYWNlcyA9IHRydWU7Ci0JcHJpdmF0ZSBDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZSBmQ3VycmVudERvY3VtbmV0UmVnaW9uQ2FjaGU7Ci0JcHJpdmF0ZSBEb2N1bWVudEV2ZW50IGZEb2N1bWVudEV2ZW50OwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXJbXSBmRG9jdW1lbnRMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBUaGUgcmVnaXN0ZXJlZCBkb2N1bWVudCBwYXJ0aXRpb25lcnMuCi0JICovCi0JcHJpdmF0ZSBNYXAgZkRvY3VtZW50UGFydGl0aW9uZXJzOwotCS8qKiBUaGUgcmVnaXN0ZXJlZCBkb2N1bWVudCBwYXJ0aXRpb25pbmcgbGlzdGVuZXJzICovCi0JcHJpdmF0ZSBMaXN0IGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyczsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3REb2N1bWVudFJlZ2lvbjsKLQlwcml2YXRlIFJlZ2lvblBhcnNlciBmUGFyc2VyOwotCXByaXZhdGUgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciBmUG9zaXRpb25NYW5hZ2VyOwotCXByaXZhdGUgTGlzdCBmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXM7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lcltdIGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzOwotCXByaXZhdGUgaW50IGZSZWVudHJhbmNlQ291bnQgPSAwOwotCXByaXZhdGUgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgZlJlUGFyc2VyOwotCXByaXZhdGUgaW50IGZTdG9wcGVkQ291bnQgPSAwOwotCi0JcHJpdmF0ZSBJVGV4dFN0b3JlIGZTdG9yZTsKLQlwcml2YXRlIE9iamVjdFtdIGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzOwotCXByaXZhdGUgT2JqZWN0W10gZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIExpc3QgZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIElMaW5lVHJhY2tlciBmVHJhY2tlcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGZVbmRvTWFuYWdlcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdERvY3VtZW50UmVnaW9uOwotCi0JcHJpdmF0ZSBieXRlW10gbGlzdGVuZXJMb2NrID0gbmV3IGJ5dGVbMF07Ci0JcHJpdmF0ZSBOdWxsRG9jdW1lbnRFdmVudCBOVUxMX0RPQ1VNRU5UX0VWRU5UOwotCi0JLyoqCi0JICogVGhlb3JldGljYWxseSwgYSBkb2N1bWVudCBjYW4gY29udGFpbiBtaXhlZCBsaW5lIGRlbGltaXRlcnMsIGJ1dCB0aGUKLQkgKiB1c2VyJ3MgcHJlZmVyZW5jZSBpcyB1c3VhbGx5IHRvIGJlIGludGVybmFsbHkgY29uc2lzdGVudC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmSW5pdGlhbExpbmVEZWxpbWl0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkgPSAiX1JFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZXyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDdXJyZW50IHJld3JpdGUgc2Vzc2lvbiwgb3Igbm9uZSBpZiBub3QgcHJlc2VudGx5IHJld3JpdGluZy4KLQkgKi8KLQlwcml2YXRlIERvY3VtZW50UmV3cml0ZVNlc3Npb24gZkFjdGl2ZVJld3JpdGVTZXNzaW9uOwotCS8qKgotCSAqIExhc3QgbW9kaWZpY2F0aW9uIHN0YW1wLCBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgb24gY2hhbmdlLgotCSAqLwotCXByaXZhdGUgbG9uZyBmTW9kaWZpY2F0aW9uU3RhbXA7Ci0JLyoqCi0JICogS2VlcHMgdHJhY2sgb2YgbmV4dCBtb2RpZmljYXRpb24gc3RhbXAuCi0JICovCi0JcHJpdmF0ZSBsb25nIGZOZXh0TW9kaWZpY2F0aW9uU3RhbXA9IElEb2N1bWVudEV4dGVuc2lvbjQuVU5LTk9XTl9NT0RJRklDQVRJT05fU1RBTVA7Ci0JLyoqCi0JICogZGVidWcgdmFyaWFibGUgb25seQotCSAqIAotCSAqIEBwYXJhbSBwYXJzZXIKLQkgKi8KLQlwcml2YXRlIGxvbmcgc3RhcnRTdHJlYW1UaW1lOwotCS8qKgotCSAqIGRlYnVnIHZhcmlhYmxlIG9ubHkKLQkgKiAKLQkgKiBAcGFyYW0gcGFyc2VyCi0JICovCi0JcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKLQotCXB1YmxpYyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJc3VwZXIoKTsKLQkJZkN1cnJlbnREb2N1bW5ldFJlZ2lvbkNhY2hlID0gbmV3IEN1cnJlbnREb2N1bWVudFJlZ2lvbkNhY2hlKCk7Ci0JCWZTdG9yZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUoNTAsIDMwMCk7Ci0JCXNldExpbmVUcmFja2VyKG5ldyBEZWZhdWx0TGluZVRyYWNrZXIoKSk7Ci0JCU5VTExfRE9DVU1FTlRfRVZFTlQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQotCQlpbnRlcm5hbF9hZGRQb3NpdGlvbkNhdGVnb3J5KFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJaW50ZXJuYWxfYWRkUG9zaXRpb25VcGRhdGVyKG5ldyBEZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlcihSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSkpOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgcHJpbWFyeSB3YXkgdG8gZ2V0IGEgbmV3IHN0cnVjdHVyZWREb2N1bWVudC4gSXRzIGJlc3QgdG8KLQkgKiB1c2UgdGhlIGZhY3RvcnkgbWV0aG9kcyBpbiBNb2RlbE1hbmdlciB0byBjcmVhdGUgYSBuZXcKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50LCBzaW5jZSBpdCB3aWxsIGdldCBhbmQgaW5pdGlhbGl6ZSB0aGUgcGFyc2VyCi0JICogYWNjb3JkaW5nIHRvIHRoZSBkZXNpcmVkIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQl0aGlzKCk7Ci0JCUFzc2VydC5pc05vdE51bGwocGFyc2VyLCAiUHJvZ3JhbSBFcnJvcjogSVN0cnVjdHVyZWREb2N1bWVudCBjYW4gbm90IGJlIGNyZWF0ZWQgd2l0aCBudWxsIHBhcnNlciIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGdvIHRocm91Z2ggc2V0dGVyIGluIGNhc2UgdGhlcmUgaXMgc2lkZSBlZmZlY3RzCi0JCWludGVybmFsX3NldFBhcnNlcihwYXJzZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBfY2xlYXJEb2N1bWVudEV2ZW50KCkgewotCQkvLyBubyBoYXJkIGFuZCBmYXN0IHJlcXVpcmVtZW50IHRvIG51bGwgb3V0IC4uLiBqdXN0IHNlZW1zIGxpa2UKLQkJLy8gYSBnb29kIGlkZWEsIHNpbmNlIHdlIGFyZSBkb25lIHdpdGggaXQuCi0JCWZEb2N1bWVudEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2UoT2JqZWN0W10gbGlzdGVuZXJzKSB7Ci0JCS8vIG1vc3QgRG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkIGxpc3RlbmVycyBkbyBub3QgYW50aWNpcGF0ZQotCQkvLyBEb2N1bWVudEV2ZW50ID09IG51bGwuIFNvIG1ha2Ugc3VyZSBkb2N1bWVudEV2ZW50IGlzIG5vdAotCQkvLyBudWxsLiAodGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCB5ZXQgaXQgZG9lcyBzb21ldGltZXMpCi0JCWlmIChmRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFdmVudCA9IG5ldyBOdWxsRG9jdW1lbnRFdmVudCgpOwotCQl9Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJLy8gTm90ZTogdGhlIGRvY0V2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZVRleHQgQVBJCi0JCQkvLyBmaXJlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElEb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoZkRvY3VtZW50RXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzQWJvdXRUb0NoYW5nZShEb2N1bWVudEV2ZW50IGRvY3VtZW50RXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gZkRvY3VtZW50UGFydGl0aW9uZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwID0gKElEb2N1bWVudFBhcnRpdGlvbmVyKSBlLm5leHQoKTsKLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJcC5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoZG9jdW1lbnRFdmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVEb2N1bWVudENoYW5nZWQoT2JqZWN0W10gbGlzdGVuZXJzLCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJLy8gTk9URTogZG9jdW1lbnQgZXZlbnQgaXMgY3JlYXRlZCBpbiByZXBsYWNlIFRleHQgQVBJIGFuZCBzZXRUZXh0Ci0JCQkvLyBBUEkKLQkJCS8vIG5vdyBmaXJlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCi0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCS8vIE5vdGVzOiBmRG9jdW1lbnRFdmVudCBjYW4gYmUgInN1ZGRlbmx5IiBudWxsLCBpZiBvbmUgb2YKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIHByZXZpb3VzIGNoYW5nZXMKLQkJCQkJLy8gY2F1c2VkIGEgInNldFRleHQiIHRvIGJlIGNhbGxlZC4gVGhlIG9ubHkga25vd24gY2FzZSBvZgotCQkJCQkvLyB0aGlzCi0JCQkJCS8vIGlzIGEgbW9kZWwgcmVzZXQKLQkJCQkJLy8gZHVlIHRvIHBhZ2UgZGlyZWN0aXZlIGNoYW5naW5nLiBFdmVudHVhbGx5IHdlIHNob3VsZAotCQkJCQkvLyBjaGFuZ2UKLQkJCQkJLy8gYXJjaGV0ZWN0dXJlIHRvIGhhdmUKLQkJCQkJLy8gZXZlbnQgcXVlIGFuZCBiZSBhYmxlIHRvICJjYW5jZWwiIHBlbmRpbmcgZXZlbnRzLCBidXQKLQkJCQkJLy8gZm9yCi0JCQkJCS8vIG5vdywgd2UnbGwganVzdCBwYXNzIGEKLQkJCQkJLy8gTnVsbERvY3VtZW50RXZlbnQuIEJ5IHRoZSB3YXksIGl0IGlzIGltcG9ydGFudCB0byBzZW5kCi0JCQkJCS8vIHNvbWV0aGluZywgc2luY2UgY2xpZW50cyBtaWdodAotCQkJCQkvLyBoYXZlIGluZGV0ZXJtaW5hbnQgc3RhdGUgZHVlIHRvICJhYm91dFRvQ2hhbmdlIiBiZWluZwotCQkJCQkvLyBzZW50Ci0JCQkJCS8vIGVhcmxpZXIuCi0JCQkJCWlmIChmRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQkJCQkoKElEb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5kb2N1bWVudENoYW5nZWQoTlVMTF9ET0NVTUVOVF9FVkVOVCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmRG9jdW1lbnRFdmVudC5mTW9kaWZpY2F0aW9uU3RhbXAgPSBnZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCQkJKChJRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkuZG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudEV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZG9jdW1lbnRFdmVudCkgewotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBmRG9jdW1lbnRQYXJ0aXRpb25lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyIHAgPSAoSURvY3VtZW50UGFydGl0aW9uZXIpIGUubmV4dCgpOwotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQlpZiAocCBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uKSB7Ci0JCQkJCQkvLyBJUmVnaW9uIGNoYW5nZWRQYXJ0aW9uID0KLQkJCQkJCSgoSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24pIHApLmRvY3VtZW50Q2hhbmdlZDIoZG9jdW1lbnRFdmVudCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwLmRvY3VtZW50Q2hhbmdlZChkb2N1bWVudEV2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIE5vQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubm9DaGFuZ2UoZXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlRXZlbnQoT2JqZWN0W10gbGlzdGVuZXJzLCBSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkucmVnaW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLnJlZ2lvbnNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm5vZGVzUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9maXJlU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZShPYmplY3RbXSBsaXN0ZW5lcnMpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQkvLyBOb3RlOiB0aGUgZG9jRXZlbnQgaXMgY3JlYXRlZCBpbiByZXBsYWNlVGV4dCBBUEkKLQkJCS8vIGZpcmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIG5vdGljZSB0aGUgQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IGlzIGNyZWF0ZWQgZnJvbSB0aGUKLQkJCQkJLy8gRG9jdW1lbnRFdmVudCwgc2luY2UgaXQgaXMgKG5lYXJseSkKLQkJCQkJLy8gdGhlIHNhbWUgaW5mb3JtYXRpb24uID9XaGF0IHRvIGRvIGFib3V0Ci0JCQkJCS8vIG9yaWdpbmFsUmVxdWVzdGVyPwotCQkJCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJCQkJfQotCQkJCQlBYm91dFRvQmVDaGFuZ2VkRXZlbnQgYWJvdXRUb0JlQ2hhbmdlZEV2ZW50ID0gbmV3IEFib3V0VG9CZUNoYW5nZWRFdmVudCh0aGlzLCBudWxsLCBmRG9jdW1lbnRFdmVudC5nZXRUZXh0KCksIGZEb2N1bWVudEV2ZW50LmdldE9mZnNldCgpLCBmRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCSgoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbEFib3V0VG9CZUNoYW5nZWQoYWJvdXRUb0JlQ2hhbmdlZEV2ZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgSVN0cnVjdHVyZWREb2N1bWVudDo6ZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50LiBUaW1lIHdhcyAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgbXNlY3MgdG8gZmlyZSBOZXdNb2RlbEV2ZW50IHRvIGluc3RhbmNlIG9mICIgKyBob2xkTGlzdGVuZXJzW2ldLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjcXVpcmVMb2NrKCkgewotCQkvLyBkbyBub3RoaW5nIGhlcmUgaW4gc3VwZXIgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBhZGRNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmICghVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IDA7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yCi0JCQkJCS8vIGZpcnN0Ci0JCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCQlvbGRTaXplID0gZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCX0KLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJCQl9Ci0JCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCQkJLy8KLQkJCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVycyBhbmQgTW9kZWxDaGFnbmVkTGlzdGVuZXJzIGFyZSB2ZXJ5Ci0JICogc2ltaWxhci4gVGhleSBib3RoIHJlY2VpdmUgaWRlbnRpY2FsIGV2ZW50cy4gVGhlIGRpZmZlcmVuY2UgaXMgdGhlCi0JICogdGltaW5nLiBUaGUgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RuZXJzIGFyZSBub3RpZmllZCBhZnRlciB0aGUKLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZCwgYnV0IGJlZm9yZSBvdGhlciwgcmVsYXRlZCBtb2RlbHMKLQkgKiBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgc3VjaCBhcyB0aGUgU3RydWN0dXJhbCBNb2RlbC4gVGhlIFN0cnVjdHVyYWwKLQkgKiBtb2RlbCBpcyBpbiBmYWN0IGl0c2VsZiBhICJwdXJlIiBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0bmVyLiBUaGUKLQkgKiBNb2RlbENoYW5nZWRMaXN0ZW5lcnMgY2FuIHJlc3QgYXNzdXJlZCB0aGF0IGFsbCBtb2RlbHMgYW5kIGRhdGEgaGF2ZQotCSAqIGJlZW4gdXBkYXRlZCBmcm9tIHRoZSBjaGFuZ2UgYnkgdGhlIHRpZW0gdGhleSBhcmUgbm90aWZpZWQuIFRoaXMgaXMKLQkgKiBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgdGhlIHRleHQgd2lkZ2V0LCBmb3IgZXhhbXBsZSwgd2hpY2ggbWF5IHJlbHkKLQkgKiBvbiBib3RoIHN0cnVjdHVyZWREb2N1bWVudCBhbmQgc3RydWN0dXJhbCBtb2RlbCBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRNb2RlbENoYW5nZWRMaXN0ZW5lci4gUmVxdWVzdCB0byBhZGQgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gc3RydWN0dXJlZERvY3VtZW50LiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRNb2RlbENoYW5nZWRMaXN0ZW5lci4gbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB3YXMgYWRkZWRlZCBtb3JlIHRoYW4gb25jZS4gIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIuIEFkZGluZyBhbiBpbnN0YW5jZSBvZiAiICsgbGlzdGVuZXIuZ2V0Q2xhc3MoKSArICIgYXMgYSBsaXN0ZW5lciBvbiBzdHJ1Y3R1cmVkRG9jdW1lbnQuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQkvLwotCQkJCS8vIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZCwKLQkJCQkvLyBzZW5kIHRoZSBuZXcgbW9kZWwgZXZlbnQgdG8gdGhhdCBvbmUgcGFydGljdWxhciBsaXN0ZW5lciwKLQkJCQkvLyBzbyBpdAotCQkJCS8vIGNhbiBpbml0aWFsaXplIGl0c2VsZiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2RlbAotCQkJCS8vIGxpc3RlbmVyLm5ld01vZGVsKG5ldyBOZXdNb2RlbEV2ZW50KHRoaXMsIGxpc3RlbmVyKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuIFJlcXVlc3QgdG8gYWRkIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmFkZFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLiBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBhZGRlZGVkIG1vcmUgdGhhbiBvbmNlLiAiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lci4gQWRkaW5nIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCX0KLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJLy8KLQkJCQkvLyB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQsCi0JCQkJLy8gc2VuZCB0aGUgbmV3IG1vZGVsIGV2ZW50IHRvIHRoYXQgb25lIHBhcnRpY3VsYXIgbGlzdGVuZXIsCi0JCQkJLy8gc28gaXQKLQkJCQkvLyBjYW4gaW5pdGlhbGl6ZSBpdHNlbGYgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kZWwKLQkJCQkvLyBsaXN0ZW5lci5uZXdNb2RlbChuZXcgTmV3TW9kZWxFdmVudCh0aGlzLCBsaXN0ZW5lcikpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV2UgbWFuYWdlIG91ciBvd24gZG9jdW1lbnQgbGlzdG5lcnMsIGluc3RlYWQgb2YgZGVsZWdhdGluZyB0byBvdXIKLQkgKiBwYXJlbnREb2N1bWVudCwgc28gd2UgY2FuIGZpcmUgYXQgdmVyeSBlbmQgKGFuZCBub3Qgd2hlbiB0aGUKLQkgKiBwYXJlbnREb2N1bWVudCBjaGFuZ2VzKS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLCBpZiBuZWVkZWQpCi0JCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmRG9jdW1lbnRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZkRvY3VtZW50TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUgc3VyZSwgZm9yCi0JCQkJCS8vIGZpcnN0Ci0JCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCQlvbGRTaXplID0gZkRvY3VtZW50TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQl9Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG51bGw7Ci0JCQkJbmV3TGlzdGVuZXJzID0gbmV3IElEb2N1bWVudExpc3RlbmVyW25ld1NpemVdOwotCQkJCWlmIChmRG9jdW1lbnRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZEb2N1bWVudExpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJCQl9Ci0JCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZEb2N1bWVudExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGREb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIpCi0JICogCi0JICogUmVnaXN0ZXJzIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgbGlzdGVuZXIgd2l0aCB0aGUgZG9jdW1lbnQuIEFmdGVyCi0JICogcmVnaXN0cmF0aW9uIHRoZSBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBpcyBpbmZvcm1lZCBhYm91dCBlYWNoCi0JICogcGFydGl0aW9uIGNoYW5nZSBjYXVzZSBieSBhIGRvY3VtZW50IG1hbmlwdWxhdGlvbi4gSWYgYSBkb2N1bWVudAotCSAqIHBhcnRpdGlvbmluZyBsaXN0ZW5lciBpcyBhbHNvIGEgZG9jdW1lbnQgbGlzdGVuZXIsIHRoZSBmb2xsb3dpbmcKLQkgKiBub3RpZmljYXRpb24gc2VxdWVuY2UgaXMgZ3VhcmFudGVlZCBpZiBhIGRvY3VtZW50IG1hbmlwdWxhdGlvbiBjaGFuZ2VzCi0JICogdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZzogMSkKLQkgKiBsaXN0ZW5lci5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCk7IDIpCi0JICogbGlzdGVuZXIuZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKCk7IDMpCi0JICogbGlzdGVuZXIuZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQpOyBJZiB0aGUgbGlzdGVuZXIgaXMgYWxyZWFkeQotCSAqIHJlZ2lzdGVyZWQgbm90aGluZyBoYXBwZW5zLgotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIKLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0ZW5lcik7Ci0JCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCQlmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJfQotCQkJaWYgKCFmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgcG9zaXRpb24gdG8gdGhlIGRvY3VtZW50J3MgZGVmYXVsdCBwb3NpdGlvbiBjYXRlZ29yeS4gVGhlCi0JICogZGVmYXVsdCBjYXRlZ29yeSBtdXN0IGJlIHNwZWNpZmllZCBieSB0aGUgaW1wbGVtZW50ZXIuIEEgcG9zaXRpb24gdGhhdAotCSAqIGhhcyBiZWVuIGFkZGVkIHRvIGEgcG9zaXRpb24gY2F0ZWdvcnkgaXMgdXBkYXRlZCBhdCBlYWNoIGNoYW5nZSBhcHBsaWVkCi0JICogdG8gdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBub3QgYSB2YWxpZCByYW5nZSBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2FkZFBvc2l0aW9uCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb24oY2F0ZWdvcnksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNhZGRQb3NpdGlvbkNhdGVnb3J5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaW50ZXJuYWxfYWRkUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjYWRkUG9zaXRpb25VcGRhdGVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlpbnRlcm5hbF9hZGRQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgbGlzdGVuZXIgYXMgb25lIHdoaWNoIGlzIG5vdGlmaWVkIGJlZm9yZSB0aG9zZQotCSAqIGRvY3VtZW50IGxpc3RlbmVycyBhZGRlZCB3aXRoIDxjb2RlPmFkZERvY3VtZW50TGlzdGVuZXI8L2NvZGU+IGFyZQotCSAqIG5vdGlmaWVkLiBJZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgaXMgYWxzbyByZWdpc3RlcmVkIHVzaW5nCi0JICogPGNvZGU+YWRkRG9jdW1lbnRMaXN0ZW5lcjwvY29kZT4gaXQgd2lsbCBiZSBub3RpZmllZCB0d2ljZS4gSWYgdGhlCi0JICogbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIG5vdGhpbmcgaGFwcGVucy4KLQkgKiA8cD4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgZm9yIHB1YmxpYyB1c2UsIGl0IG1heSBvbmx5IGJlIGNhbGxlZCBieQotCSAqIGltcGxlbWVudGVycyBvZiA8Y29kZT5JRG9jdW1lbnRBZGFwdGVyPC9jb2RlPiBhbmQgb25seSBpZiB0aG9zZQotCSAqIGltcGxlbWVudGVycyBuZWVkIHRvIGltcGxlbWVudCA8Y29kZT5JRG9jdW1lbnRMaXN0ZW5lcjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50QWRhcHRlcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkIGFzIHByZW5vdGlmaWVkIGRvY3VtZW50IGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWludCBwcmV2aW91c1NpemUgPSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJSURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbcHJldmlvdXNTaXplICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgMCwgbGlzdGVuZXJzLCAwLCBwcmV2aW91c1NpemUpOwotCQkJCWxpc3RlbmVyc1twcmV2aW91c1NpemVdID0gZG9jdW1lbnRBZGFwdGVyOwotCQkJCWZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbMV07Ci0JCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnNbMF0gPSBkb2N1bWVudEFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGFyZzApIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRDaGFyKDApOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBBUEkgcmVtb3ZlcyBhbGwgcmVhZCBvbmx5IHBvc2l0aW9ucywgYXMgc2hvdWxkIGJlIGRvbmUKLQkgKiB3ZSAnc2V0VGV4dCcgaXMgY2FsbGVkLiBOb3RlOiBhbiBhbHRlcm5hdGl2ZSBhbGdvcml0aG0gbWF5IHNpbXBseQotCSAqIHJlbW92ZSB0aGUgY2F0ZWdvcnkgKGFuZCBpdCB3b3VsZCBnZXQgYWRkZWQgYmFjayBpbiBsYXRlciwgaWYvd2hlbgotCSAqIHJlYWRvbmx5IHJlZ2lvbnMgYWRkZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyUmVhZE9ubHkoKSB7Ci0JCVBvc2l0aW9uW10gcG9zaXRpb25zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBvc2l0aW9ucyA9IGdldFBvc2l0aW9ucyhSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvZ3JhbSBlcnJvcjogc2hvdWxkIG5ldmVyIG9jY3VyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkvLyBub3RlIHdlIGRvbid0IGZpcmUgdGhlICJhYm91dCB0byBjaGFuZ2UiIG9yICJjaGFuZ2VkIiBldmVudHMsCi0JCQkvLyBzaW5jZSBwcmVzdW1hYmx5LCB0ZXh0IGlzIGFsbCBnb2luZyBhd2F5IGFuZCBiZWluZyByZXBsYWNlZAotCQkJLy8gYW55d2F5LgotCQkJcG9zaXRpb24uZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNsZWFyUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE8gRFcgSSBzdGlsbCBuZWVkIHRvIGltcGxlbWVudCBzbWFydGVyIGFsZ29yaXRobSB0aGF0Ci0JCS8vIGFkdXN0IGV4aXN0aW5nIFJPIHJlZ2lvbnMsIGlmIG5lZWRlZC4gRm9yIG5vdywgSSdsbCBqdXN0Ci0JCS8vIHJlbW92ZSBhbnkgdGhhdCBvdmVybGFwLgotCQl0cnkgewotCQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBnZXRQb3NpdGlvbnMoUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQb3NpdGlvbiBwb3NpdGlvbiA9IHBvc2l0aW9uc1tpXTsKLQkJCQlpZiAocG9zaXRpb24ub3ZlcmxhcHNXaXRoKHN0YXJ0T2Zmc2V0LCBsZW5ndGgpKSB7Ci0JCQkJCVN0cmluZyBlZmZlY3RlZFRleHQgPSB0aGlzLmdldChzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJLy8gZkRvY3VtZW50RXZlbnQgPSBuZXcgRG9jdW1lbnRFdmVudCh0aGlzLCBzdGFydE9mZnNldCwKLQkJCQkJLy8gbGVuZ3RoLCBlZmZlY3RlZFRleHQpOwotCQkJCQlmaXJlUmVhZE9ubHlBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCQkJCXBvc2l0aW9uLmRlbGV0ZSgpOwotCQkJCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudCh0aGlzLCBudWxsLCBlZmZlY3RlZFRleHQsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkJCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuUkVBRF9PTkxZX1NUQVRFX0NIQU5HRTsKLQkJCQkJZmlyZVJlYWRPbmx5U3RydWN0dXJlZERvY3VtZW50RXZlbnQobm9DaGFuZ2VFdmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgbWVhbnMgbm8gcmVhZG9ubHkgcmVnaW9ucyBiZWVuIGRlZmluZWQgeWV0Ci0JCQkvLyBzbyBub3RoaW5nIHRvIGRvLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGluZGV4IGF0IHdoaWNoIGEgPGNvZGU+UG9zaXRpb248L2NvZGU+IHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG9mZnNldCB3b3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBjYXRlZ29yeS4gQXMgdGhlCi0JICogb3JkZXJpbmcgaW5zaWRlIGEgY2F0ZWdvcnkgb25seSBkZXBlbmRzIG9uIHRoZSBvZmZzZXQsIHRoZSBpbmRleCBtdXN0Ci0JICogYmUgY2hvb3NlbiB0byBiZSB0aGUgZmlyc3Qgb2YgYWxsIHBvc2l0aW9ucyB3aXRoIHRoZSBzYW1lIG9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIHRoZSBjYXRlZ29yeSBpbiB3aGljaCB3b3VsZCBiZSBhZGRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZmZzZXQgdG8gYmUgY29uc2lkZXJlZAotCSAqIEByZXR1cm4gdGhlIGluZGV4IGludG8gdGhlIGNhdGVnb3J5Ci0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBpbnZhbGlkIGluIHRoaXMgZG9jdW1lbnQKLQkgKiBAZXhjZXB0aW9uIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBjYXRlZ29yeSBpcyB1bmRlZmluZWQgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuY29tcHV0ZUluZGV4SW5DYXRlZ29yeShjYXRlZ29yeSwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBnaXZlbiB0ZXh0LiBGb3IgYSBnaXZlbiBpbXBsZW1lbnRlcgotCSAqIG9mIHRoaXMgaW50ZXJmYWNlIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNhbWUgcmVzdWx0IGFzCi0JICogPGNvZGU+c2V0KHRleHQpOyBnZXROdW1iZXJPZkxpbmVzKCk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB3aG9zZSBudW1iZXIgb2YgbGluZXMgc2hvdWxkIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBnaXZlbiB0ZXh0Ci0JICovCi0JcHVibGljIGludCBjb21wdXRlTnVtYmVyT2ZMaW5lcyhTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmNvbXB1dGVOdW1iZXJPZkxpbmVzKHRleHQpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBwYXJ0aXRpb25pbmcgb2YgdGhlIGdpdmVuIGRvY3VtZW50IHJhbmdlIHVzaW5nIHRoZQotCSAqIGRvY3VtZW50J3MgcGFydGl0aW9uZXIuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IG9mZnNldCBhdCB3aGljaCB0aGUgcmFuZ2Ugc3RhcnRzCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmFuZ2UKLQkgKiBAcmV0dXJuIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmFuZ2UncyBwYXJ0aXRpb25pbmcKLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVR5cGVkUmVnaW9uW10gY29tcHV0ZVBhcnRpdGlvbmluZyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlJVHlwZWRSZWdpb25bXSB0eXBlZFJlZ2lvbnMgPSBudWxsOwotCQl0cnkgewotCQkJdHlwZWRSZWdpb25zID0gY29tcHV0ZVBhcnRpdGlvbmluZyhJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIGxlbmd0aCwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlpZiAodHlwZWRSZWdpb25zID09IG51bGwpIHsKLQkJCXR5cGVkUmVnaW9ucyA9IG5ldyBJVHlwZWRSZWdpb25bMF07Ci0JCX0KLQkJcmV0dXJuIHR5cGVkUmVnaW9uczsKLQl9Ci0KLQotCXB1YmxpYyBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKFN0cmluZyBwYXJ0aXRpb25pbmcsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gaW5jbHVkZVplcm9MZW5ndGhQYXJ0aXRpb25zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCWlmICgoMCA+IG9mZnNldCkgfHwgKDAgPiBsZW5ndGgpIHx8IChvZmZzZXQgKyBsZW5ndGggPiBnZXRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpCi0JCQlyZXR1cm4gKChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHBhcnRpdGlvbmVyKS5jb21wdXRlUGFydGl0aW9uaW5nKG9mZnNldCwgbGVuZ3RoLCBpbmNsdWRlWmVyb0xlbmd0aFBhcnRpdGlvbnMpOwotCQllbHNlIGlmIChwYXJ0aXRpb25lciAhPSBudWxsKQotCQkJcmV0dXJuIHBhcnRpdGlvbmVyLmNvbXB1dGVQYXJ0aXRpb25pbmcob2Zmc2V0LCBsZW5ndGgpOwotCQllbHNlIGlmIChJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLmVxdWFscyhwYXJ0aXRpb25pbmcpKQotCQkJcmV0dXJuIG5ldyBUeXBlZFJlZ2lvbltde25ldyBUeXBlZFJlZ2lvbihvZmZzZXQsIGxlbmd0aCwgREVGQVVMVF9DT05URU5UX1RZUEUpfTsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2NvbnRhaW5zUG9zaXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuY29udGFpbnNQb3NpdGlvbihjYXRlZ29yeSwgb2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2NvbnRhaW5zUG9zaXRpb25DYXRlZ29yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVBvc2l0aW9uW10gcG9zaXRpb25zID0gZ2V0UG9zaXRpb25zKFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkJaWYgKHBvc2l0aW9uLm92ZXJsYXBzV2l0aChzdGFydE9mZnNldCwgbGVuZ3RoKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBtZWFucyBubyByZWFkb25seSByZWdpb25zIGJlZW4gZGVmaW5lZCB5ZXQKLQkJCS8vIHNvIG9idmlvdXNseSBmYWxzZQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVBvc3ROb3RpZmljYXRpb25DaGFuZ2VzKCkgewotCQlpZiAoZlN0b3BwZWRDb3VudCA+IDApCi0JCQlyZXR1cm47Ci0JCXdoaWxlIChmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgIT0gbnVsbCkgewotCQkJTGlzdCBjaGFuZ2VzID0gZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzOwotCQkJZlBvc3ROb3RpZmljYXRpb25DaGFuZ2VzID0gbnVsbDsKLQkJCUl0ZXJhdG9yIGUgPSBjaGFuZ2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlSZWdpc3RlcmVkUmVwbGFjZSByZXBsYWNlID0gKFJlZ2lzdGVyZWRSZXBsYWNlKSBlLm5leHQoKTsKLQkJCQlyZXBsYWNlLmZSZXBsYWNlLnBlcmZvcm0odGhpcywgcmVwbGFjZS5mT3duZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2VkKCkgewotCQkvLyBtb3N0IERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCBsaXN0ZW5lcnMgZG8gbm90IGFudGljaXBhdGUKLQkJLy8gRG9jdW1lbnRFdmVudCA9PSBudWxsLiBTbyBtYWtlIHN1cmUgZG9jdW1lbnRFdmVudCBpcyBub3QKLQkJLy8gbnVsbC4gKHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgeWV0IGl0IGRvZXMgc29tZXRpbWVzKQotCQlpZiAoZkRvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQkJfQotCi0JCV9maXJlU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZShmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyk7Ci0JCS8vIE5vdGU6IHRoZSBkb2NFdmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2VUZXh0IEFQSSEgKG9yIHNldCBUZXh0KQotCQlfZmlyZURvY3VtZW50QWJvdXRUb0NoYW5nZShmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzQWJvdXRUb0NoYW5nZShmRG9jdW1lbnRFdmVudCk7Ci0JCV9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZEb2N1bWVudExpc3RlbmVycyk7Ci0JfQotCi0JLyoqCi0JICogRmlyZXMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBjaGFuZ2VkIG5vdGlmaWNhdGlvbiB0byBhbGwgcmVnaXN0ZXJlZAotCSAqIGRvY3VtZW50IHBhcnRpdGlvbmluZyBsaXN0ZW5lcnMuIFVzZXMgYSByb2J1c3QgaXRlcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGNoYW5nZWQgZXZlbnQKLQkgKiAKLQkgKiBAc2VlIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyA9PSBudWxsIHx8IGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyk7Ci0JCUl0ZXJhdG9yIGUgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbCA9IChJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikgZS5uZXh0KCk7Ci0JCQlpZiAobCBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMikgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMiBleHRlbnNpb24yID0gKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uMikgbDsKLQkJCQlleHRlbnNpb24yLmRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24pIHsKLQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24pIGw7Ci0JCQkJZXh0ZW5zaW9uLmRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCh0aGlzLCBldmVudC5nZXRDb3ZlcmFnZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWwuZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKHRoaXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVJlYWRPbmx5QWJvdXRUb0JlQ2hhbmdlZCgpIHsKLQkJX2ZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzKTsKLQkJLy8gTm90ZTogdGhlIGRvY0V2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZVRleHQgQVBJISAob3Igc2V0IFRleHQpCi0JCS8vIF9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzKTsKLQkJLy8gX2ZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2UoZkRvY3VtZW50TGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVJlYWRPbmx5U3RydWN0dXJlZERvY3VtZW50RXZlbnQoTm9DaGFuZ2VFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCS8vIF9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCS8vIF9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQkvLyBfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChOb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoUmVnaW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0RvY3VtZW50Q2hhbmdlZChldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZkRvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCV9jbGVhckRvY3VtZW50RXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCdzIGNvbXBsZXRlIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXQoKSB7Ci0JCXJldHVybiBnZXRTdG9yZSgpLmdldCgwLCBnZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBsZW5ndGggY2hhcmFjdGVycyBmcm9tIHRoZSBkb2N1bWVudCdzIHRleHQgc3RhcnRpbmcgZnJvbSB0aGUKLQkgKiBzcGVjaWZpZWQgcG9zaXRpb24uCi0JICogCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB0aGUgcmFuZ2UgaXMgbm90IHZhbGlkIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWludCBteUxlbmd0aCA9IGdldExlbmd0aCgpOwotCQlpZiAoMCA+IG9mZnNldCkKLQkJCW9mZnNldCA9IDA7Ci0JCWlmICgwID4gbGVuZ3RoKQotCQkJbGVuZ3RoID0gMDsKLQkJaWYgKG9mZnNldCArIGxlbmd0aCA+IG15TGVuZ3RoKSB7Ci0JCQkvLyBmaXJzdCB0cnkgYWRqdXN0aW5nIGxlbmd0aCB0byBmaXQKLQkJCWludCBsZXNzTGVuZ3RoID0gbXlMZW5ndGggLSBvZmZzZXQ7Ci0JCQlpZiAoKGxlc3NMZW5ndGggPj0gMCkgJiYgKG9mZnNldCArIGxlc3NMZW5ndGggPT0gbXlMZW5ndGgpKSB7Ci0JCQkJbGVuZ3RoID0gbGVzc0xlbmd0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHNlY29uZCwgdHJ5IG9mZnNldAotCQkJCWludCBtb3JlT2Zmc2V0ID0gbXlMZW5ndGggLSBsZW5ndGg7Ci0JCQkJaWYgKChtb3JlT2Zmc2V0ID49IDApICYmIChtb3JlT2Zmc2V0ICsgbGVuZ3RoID09IG15TGVuZ3RoKSkgewotCQkJCQlvZmZzZXQgPSBtb3JlT2Zmc2V0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gY2FuIGhhcHBlbiBpZiBteUxlbmd0aCBpcyAwLgotCQkJCQkvLyBubyBhZGp1c3RtZW50IHBvc3NpYmxlLgotCQkJCQlyZXN1bHQgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdG9yZSgpLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKFVTRV9MT0NBTF9USFJFQUQpIHsKLQkJCXJlc3VsdCA9IGZDdXJyZW50RG9jdW1uZXRSZWdpb25DYWNoZS5nZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGNhY2hlZERvY3VtZW50UmVnaW9uOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjZ2V0Q2hhcgotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBwb3NpdGlvbiBpcyBub3QgYSB2YWxpZCByYW5nZSBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDaGFyKGludCBwb3MpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWNoYXIgcmVzdWx0ID0gMHgwMDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldFN0b3JlKCkuZ2V0KHBvcyk7Ci0JCX0KLQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGRvY3VtZW50IHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSBnaXZlbgotCSAqIGNoYXJhY3RlciBwb3NpdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkuZ2V0Q29udGVudFR5cGUob2Zmc2V0KTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoU3RyaW5nIHBhcnRpdGlvbmluZywgaW50IG9mZnNldCwgYm9vbGVhbiBwcmVmZXJPcGVuUGFydGl0aW9ucykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gewotCQlpZiAoKDAgPiBvZmZzZXQpIHx8IChvZmZzZXQgPiBnZXRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpCi0JCQlyZXR1cm4gKChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHBhcnRpdGlvbmVyKS5nZXRDb250ZW50VHlwZShvZmZzZXQsIHByZWZlck9wZW5QYXJ0aXRpb25zKTsKLQkJZWxzZSBpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJ0aXRpb25lci5nZXRDb250ZW50VHlwZShvZmZzZXQpOwotCQllbHNlIGlmIChJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLmVxdWFscyhwYXJ0aXRpb25pbmcpKQotCQkJcmV0dXJuIERFRkFVTFRfQ09OVEVOVF9UWVBFOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoKSB7Ci0JCQotCQlTdHJpbmcgbGluZURlbGltaXRlcj0gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlsaW5lRGVsaW1pdGVyPSBnZXRMaW5lRGVsaW1pdGVyKDApOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkKLQkJaWYgKGxpbmVEZWxpbWl0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBsaW5lRGVsaW1pdGVyOwotCi0JCWlmIChmSW5pdGlhbExpbmVEZWxpbWl0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBmSW5pdGlhbExpbmVEZWxpbWl0ZXI7Ci0KLQkJU3RyaW5nIHN5c0xpbmVEZWxpbWl0ZXI9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBkZWxpbWl0ZXJzPSBnZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCk7Ci0JCUFzc2VydC5pc1RydWUoZGVsaW1pdGVycy5sZW5ndGggPiAwKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGRlbGltaXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkZWxpbWl0ZXJzW2ldLmVxdWFscyhzeXNMaW5lRGVsaW1pdGVyKSkgewotCQkJCWxpbmVEZWxpbWl0ZXI9IHN5c0xpbmVEZWxpbWl0ZXI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyPSBkZWxpbWl0ZXJzWzBdOwotCQotCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQncyBwYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAc2VlIElEb2N1bWVudFBhcnRpdGlvbmVyCi0JICovCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkcpOwotCX0KLQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERvY3VtZW50UGFydGl0aW9uZXIoU3RyaW5nIHBhcnRpdGlvbmluZykgewotCi0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIGRvY3VtZW50UGFydGl0aW9uZXIgPSBudWxsOwotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzICE9IG51bGwpIHsKLQkJCWRvY3VtZW50UGFydGl0aW9uZXIgPSAoSURvY3VtZW50UGFydGl0aW9uZXIpIGZEb2N1bWVudFBhcnRpdGlvbmVycy5nZXQocGFydGl0aW9uaW5nKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRQYXJ0aXRpb25lcjsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmV0dXJuIGVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJLy8gc2hvdWxkIHdlIHVwZGF0ZSBjYWNoZWROb2RlPwotCQkvLyBXZSBzaG91bGQgdG8ga2VlcCBjb25zaXN0ZW50IHBoaWxvc29waHkgb2YgcmVtZW1iZXJpbmcgbGFzdAotCQkvLyByZXF1ZXN0ZWQgcG9zaXRpb24sCi0JCS8vIGZvciBlZmZpY2llbmN5LgotCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihmaXJzdERvY3VtZW50UmVnaW9uKTsKLQkJcmV0dXJuIGZpcnN0RG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJLy8gc2hvdWxkIHdlIHVwZGF0ZSBjYWNoZWROb2RlPwotCQkvLyBXZSBzaG91bGQgdG8ga2VlcCBjb25zaXN0ZW50IHBoaWxvc29waHkgb2YgcmVtZW1iZXJpbmcgbGFzdAotCQkvLyByZXF1ZXN0ZWQgcG9zaXRpb24sCi0JCS8vIGZvciBlZmZpY2llbmN5LgotCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihsYXN0RG9jdW1lbnRSZWdpb24pOwotCQlyZXR1cm4gbGFzdERvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGFydGl0aW9ucwotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXRMZWdhbENvbnRlbnRUeXBlcyhJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKTsKLQkJfQotCQljYXRjaCAoQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoU3RyaW5nIHBhcnRpdGlvbmluZykgdGhyb3dzIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25pbmcpOwotCQlpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJ0aXRpb25lci5nZXRMZWdhbENvbnRlbnRUeXBlcygpOwotCQlpZiAoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORy5lcXVhbHMocGFydGl0aW9uaW5nKSkKLQkJCXJldHVybiBuZXcgU3RyaW5nW117REVGQVVMVF9DT05URU5UX1RZUEV9OwotCQl0aHJvdyBuZXcgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0gbGluZSBkZWxpbWl0ZXIgY29udmVyc2lvbgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExlZ2FsTGluZURlbGltaXRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNnZXRMZW5ndGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFN0b3JlKCkuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I2dldExpbmVEZWxpbWl0ZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRMaW5lRGVsaW1pdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGluZSBkZWxpbWl0ZXIgb2YgdGhhdCBsaW5lCi0JICogCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBsaW5lIG51bWJlciBpcyBpbnZhbGlkIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcihpbnQgbGluZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExpbmVEZWxpbWl0ZXIobGluZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbGluZS4gVGhlIGxpbmUgaXMgZGVzY3JpYmVkIGJ5Ci0JICogaXRzIG9mZnNldCBhbmQgaXRzIGxlbmd0aCBleGNsdWRpbmcgdGhlIGxpbmUncyBkZWxpbWl0ZXIuCi0JICogCi0JICogQHBhcmFtIGxpbmUKLQkgKiAgICAgICAgICAgIHRoZSBsaW5lIG9mIGludGVyZXN0Ci0JICogQHJldHVybiBhIGxpbmUgZGVzY3JpcHRpb24KLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxpbmUgbnVtYmVyIGlzIGludmFsaWQgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gZ2V0TGluZUluZm9ybWF0aW9uKGludCBsaW5lKSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LiBUaGUgZGVzY3JpcHRpb24KLQkgKiBjb250YWlucyB0aGUgb2Zmc2V0IGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lIGV4Y2x1ZGluZyB0aGUgbGluZSdzCi0JICogZGVsaW1pdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2hvc2UgbGluZSBzaG91bGQgYmUgZGVzY3JpYmVkCi0JICogQHJldHVybiBhIHJlZ2lvbiBkZXNjcmliaW5nIHRoZSBsaW5lCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBpbnZhbGlkIGluIHRoaXMgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uIGdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGludCBvZmZzZXQpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCX0KLQotCS8qCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsaW5lIGluZm9ybWF0aW9uCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVMZW5ndGgoaW50IGxpbmUpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lTGVuZ3RoKGxpbmUpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBsaW5lCi0JICogICAgICAgICAgICB0aGUgbGluZSBvZiBpbnRlcmVzdAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50IG9mZnNldAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGluZSBudW1iZXIgaXMgaW52YWxpZCBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBnZXRMaW5lT2Zmc2V0KGludCBsaW5lKSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGluZU9mZnNldChsaW5lKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGdldFRyYWNrZXIoKS5nZXRMaW5lTnVtYmVyT2ZPZmZzZXQob2Zmc2V0KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJaWYgKExvZ2dlci5ERUJVR19ET0NVTUVOVCkKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRGV2LiBQcm9ncmFtIEluZm8gT25seTogSVN0cnVjdHVyZWREb2N1bWVudDo6Z2V0TGluZU9mT2Zmc2V0OiBvZmZzZXQgb3V0IG9mIHJhbmdlLCB6ZXJvIGFzc3VtZWQuIG9mZnNldCA9ICIgKyBvZmZzZXQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJlc3VsdCA9IDA7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhpcyBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKCkgewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldE51bWJlck9mTGluZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGluZXMgd2hpY2ggYXJlIG9jY3VwaWVkIGJ5IGEgZ2l2ZW4gdGV4dCByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgdGV4dCByYW5nZQotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHNwZWNpZmllZCB0ZXh0IHJhbmdlCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxpbmVzIG9jY3VwaWVkIGJ5IHRoZSBzcGVjaWZpZWQgcmFuZ2UKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgc3BlY2lmaWVkIHJhbmdlIGlzIGludmFsaWQgaW4gdGhpcyB0cmFja2VyCi0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXROdW1iZXJPZkxpbmVzKG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHB1YmxpYywgdGVtcG9yYXJpbHksIGZvciB1c2UgYnkgdGFnIGxpYiBjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAoZlBhcnNlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJU3RydWN0dXJlZERvY3VtZW50OjpnZXRQYXJzZXIuIFBhcnNlciBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgcGFydGl0aW9uIGluIHdoaWNoIHRoZSBwb3NpdGlvbiBpcyBsb2NhdGVkLiBUaGUKLQkgKiBwYXJ0aXRpb24gaXMgc3BlY2lmaWVkIGFzIHR5cGVkIHJlZ2lvbi4KLQkgKi8KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnRpdGlvbiA9IGdldFBhcnRpdGlvbihJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlpZiAocGFydGl0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFcnJvcigpOwotCQl9Ci0JCXJldHVybiBwYXJ0aXRpb247Ci0JfQotCi0KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihTdHJpbmcgcGFydGl0aW9uaW5nLCBpbnQgb2Zmc2V0LCBib29sZWFuIHByZWZlck9wZW5QYXJ0aXRpb25zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCWlmICgoMCA+IG9mZnNldCkgfHwgKG9mZnNldCA+IGdldExlbmd0aCgpKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCQlJVHlwZWRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQotCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjIpIHsKLQkJCXJlc3VsdCA9ICgoSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24yKSBwYXJ0aXRpb25lcikuZ2V0UGFydGl0aW9uKG9mZnNldCwgcHJlZmVyT3BlblBhcnRpdGlvbnMpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHBhcnRpdGlvbmVyLmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQl9Ci0JCWVsc2UgaWYgKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcuZXF1YWxzKHBhcnRpdGlvbmluZykpIHsKLQkJCXJlc3VsdCA9IG5ldyBUeXBlZFJlZ2lvbigwLCBnZXRMZW5ndGgoKSwgREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQl9Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24oKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0aXRpb25pbmdzKCkgewotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gcGFydGl0aW9uaW5ncyA9IG5ldyBTdHJpbmdbZkRvY3VtZW50UGFydGl0aW9uZXJzLnNpemUoKV07Ci0JCWZEb2N1bWVudFBhcnRpdGlvbmVycy5rZXlTZXQoKS50b0FycmF5KHBhcnRpdGlvbmluZ3MpOwotCQlyZXR1cm4gcGFydGl0aW9uaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBwb3NpdGlvbiBjYXRlZ29yaWVzIGFkZGVkIHRvIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBvc2l0aW9uQ2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9uQ2F0ZWdvcmllcygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9zaXRpb25NYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciBnZXRQb3NpdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChmUG9zaXRpb25NYW5hZ2VyID09IG51bGwpIHsKLQkJCWZQb3NpdGlvbk1hbmFnZXIgPSBuZXcgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gZlBvc2l0aW9uTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBQb3NpdGlvbnMgb2YgdGhlIGdpdmVuIHBvc2l0aW9uIGNhdGVnb3J5LgotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIGNhdGVnb3J5IGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRQb3NpdGlvbnMoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9ucyhjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjZ2V0UG9zaXRpb25VcGRhdGVycwotCSAqLwotCXB1YmxpYyBJUG9zaXRpb25VcGRhdGVyW10gZ2V0UG9zaXRpb25VcGRhdGVycygpIHsKLQkJcmV0dXJuIGdldFBvc2l0aW9uTWFuYWdlcigpLmdldFBvc2l0aW9uVXBkYXRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIHdoaWNoIGlzIHRoZSBjYXNlIGlmIHRoZSBvZmZzZXQgaXMganVzdAotCSAqIGJlZm9yZSBvciBqdXN0IGFmdGVyIHRoZSBleGlzdGluZyB0ZXh0LiBDb21wYXJlIHdpdGgKLQkgKiBnZXROb2RlQXRDaGFyYWN0ZXJPZmZzZXQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gRklYTUU6IG5lZWQgdG8gc3luY2ggb24gJ2NhY2hlZFJlZ2lvbicgKGJ1dCBzaW5jZSB0aGF0J3MgYQotCQkvLyBjb25zdGFudGx5IGNoYW5naW5nIG9iamVjdCwgd2UKLQkJLy8gY2FuJ3QsIHNvIG5lZWQgdG8gYWRkIGEgInJlZ2lvbl9sb2NrIiBvYmplY3QsIGFuZCB1c2UgaXQgaGVyZSwgYW5kCi0JCS8vIGluIHJlLXBhcnNlci4KLQkJLy8gT2gsIGFuZCBuZWVkIHRvIG1ha2Ugc3VyZSwgYWZ0ZXIgc3luY2gsIHRoYXQgdGhlIHJlZ2lvbiBpcyBub3QKLQkJLy8gZGVsZXRlZCwgYW5kIGlmIHNvLCBJIGd1ZXNzIGdvIGJhY2sKLQkJLy8gdG8gdGhlIGJlZ2lubmluZyEKLQotCQkvLyBjYWNoZWQgbm9kZSBjYW4gYmUgbnVsbCB3aGVuIGRvY3VtZW50IGlzIGVtcHR5Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG90ZW50aWFsQ2FjaGVkUmVnaW9uID0gZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHBvdGVudGlhbENhY2hlZFJlZ2lvbiAhPSBudWxsKSB7Ci0KLQkJCS8vIAotCi0JCQkvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IG5vZGUsIHJldHVybiB0aGF0LgotCQkJaWYgKHBvdGVudGlhbENhY2hlZFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJcmVzdWx0ID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZmlyc3QsIGZpbmQgb3V0IHdoYXQgZGlyZWN0aW9uIHRvIGdvLCByZWxhdGl2ZSB0bwotCQkJCS8vIGNhY2hlZE5vZGUuCi0JCQkJLy8gbmVnYXRpdmUgbWVhbnMgInRvd2FyZHMgdGhlIGZyb250IiBvZiB0aGUgZmlsZSwKLQkJCQkvLyBwb3N0aXRpdmUKLQkJCQkvLyBtZWFucwotCQkJCS8vIHRvd2FyZHMgdGhlIGVuZC4KLQkJCQlpbnQgZGlyZWN0aW9uID0gb2Zmc2V0IC0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA8IDApIHsKLQkJCQkJLy8gc2VhcmNoIHRvd2FyZHMgYmVnaW5uaW5nCi0JCQkJCXdoaWxlICghcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGVtcE5vZGUgPSBwb3RlbnRpYWxDYWNoZWRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCQkJCWlmICh0ZW1wTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlwb3RlbnRpYWxDYWNoZWRSZWdpb24gPSB0ZW1wTm9kZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gc2VhcmNoIHRvd2FyZHMgZW5kCi0JCQkJCS8vIFRoZXJlIGlzIGEgbGVnaXRhbWF0IGNvbmRpdGlvbiB3aGVyZSB0aGUKLQkJCQkJLy8gb2Zmc2V0IHdpbGwgbm90IGJlIGNvbnRhaW5lZCBpbiBhbnkgbm9kZSwKLQkJCQkJLy8gd2hpY2ggaXMgaWYgdGhlIG9mZnNldCBpcyBqdXN0IHBhc3QgdGhlIGxhc3QKLQkJCQkJLy8gY2hhcmFjdGVyIG9mIHRleHQuCi0JCQkJCS8vIEFuZCwgd2UgbXVzdCBnYXVyZCBhZ2FpbnN0IHNldHRpbmcgY2FjaGVkTm9kZSB0bwotCQkJCQkvLyBudWxsIQotCQkJCQl3aGlsZSAoIXBvdGVudGlhbENhY2hlZFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRlbXBOb2RlID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmdldE5leHQoKTsKLQkJCQkJCWlmICh0ZW1wTm9kZSA9PSBudWxsKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZWxzZQotCQkJCQkJCXBvdGVudGlhbENhY2hlZFJlZ2lvbiA9IHRlbXBOb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uOwotCQl9Ci0JCS8vIGp1c3QgdG8gYmUgZG91Ymx5IHN1cmUgd2UgbmV2ZXIgYXNzaWduIG51bGwgdG8gYW4gYWxyZWFkeSB2YWxpZAotCQkvLyBjYWNoZWRSZWdpb24uCi0JCS8vIEkgYmVsaWV2ZSBhbnkgdGltZSAncmVzdWx0JyBpcyBudWxsIGF0IHRoaXMgcG9pbnQsIHRoYXQganVzdCBtZWFucwotCQkvLyB3ZSBoYXZlIGFuCi0JCS8vIGVtcHR5IGRvY3VtZW50LCBhbmQgdGhlIGNhY2hlZFJlZ2lvbiBpcyBhbHJlYWR5IG51bGwsIGJ1dCB3ZSBjaGVjawotCQkvLyBhbmQgcHJpbnQKLQkJLy8gd2FybmluZywganVzdCBzbyBkdXJpbmcgZGV2ZWxvcG1lbnQgd2UgYmUgc3VyZSB3ZSBuZXZlciBhY2NpZGVudGx5Ci0JCS8vIGJyZWFrIHRoaXMgYXNzdW1wdGlvbi4KLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJZWxzZSBpZiAoZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9ncmFtIEVycm9yOiBubyByZWdpb24gY291bGQgYmUgZm91bmQgdG8gY2FjaGUsIGJ1dCBjYWNoZSB3YXMgbm9uIG51bGwuIEluZGljYXRlcyBjb3JydXB0ZWQgbW9kZWwgb3IgcmVnaW9uIGxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZ2V0UmVnaW9uTGlzdCgpIHsKLQkJQ29yZU5vZGVMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQlyZXN1bHQgPSBuZXcgQ29yZU5vZGVMaXN0KG51bGwpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBuZXcgQ29yZU5vZGVMaXN0KGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKDAsIGdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJbiB0aGUgY2FzZSBvZiAwIGxlbmd0aCwgdGhlIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+Ci0JICogYXQgdGhlIGNoYXJhY3RlciBvZmZzZXQgaXMgcmV0dXJlbmVkLiBJbiBvdGhlciB3b3JkcywgdGhlIHJlZ2lvbiB0byB0aGUKLQkgKiByaWdodCBvZiB0aGUgY2FyZXQgaXMgcmV0dXJuZWQuIGV4Y2VwdCBmb3IgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsCi0JICogdGhlbiB0aGUgbGFzdCByZWdpb24gaXMgcmV0dXJuZWQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE90aGVyd2lzZSBhbGwgdGhlIHJlZ2lvbnMgImluYmV0d2VlbiIgdGhlIGluZGljYXRlZCByYW5nZSBhcmUgcmV0dXJuZWQsCi0JICogaW5jbHVkaW5nIHRoZSByZWdpb25zIHdoaWNoIG92ZXJsYXAgdGhlIHJlZ2lvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogPGJyPgotCSAqIGVnLgotCSAqIDxwPgotCSAqIDxicj4KLQkgKiBlZy4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2h0bWwmZ3Q7WyZsdDtoZWFkJmd0OyZsdDsvaGVhZCZndDtdJmx0Oy9odG1sJmd0OyByZXR1cm5zICZsdDtoZWFkJmd0OywmbHQ7L2hlYWQmZ3Q7Ci0JICogPC9wcmU+Ci0JICogICAgPHByZT4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICZsdDtodFttbCZndDsmbHQ7aGVhZCZndDsmbHQ7L2hlXWFkJmd0OyZsdDsvaHRtbCZndDsgcmV0dXJucyAmbHQ7aHRtbCZndDssJmx0O2hlYWQmZ3Q7LCZsdDsvaGVhZCZndDsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiA8cHJlPgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aHRtbCZndDtbJmx0O2hlYWQmZ3Q7Jmx0Oy9oZWFkJmd0O10mbHQ7L2h0bWwmZ3Q7IHJldHVybnMgJmx0O2hlYWQmZ3Q7LCZsdDsvaGVhZCZndDsKLQkgKiA8L3ByZT4KLQkgKiAgICA8cHJlPgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aHRbbWwmZ3Q7Jmx0O2hlYWQmZ3Q7Jmx0Oy9oZV1hZCZndDsmbHQ7L2h0bWwmZ3Q7IHJldHVybnMgJmx0O2h0bWwmZ3Q7LCZsdDtoZWFkJmd0OywmbHQ7L2hlYWQmZ3Q7Ci0JICogPC9wcmU+Ci0JICogCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQotCQlpZiAobGVuZ3RoIDwgMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbid0IGhhdmUgbmVnYXRpdmUgbGVuZ3RoIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0aGlzIHdpbGwgbWFrZSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgcmFuZ2UgcG9pbnQgaW50byB0aGUgc2VsZWN0aW9uCi0JCS8vIGVnLiA8aHRtbD5bPGhlYWQ+PC9oZWFkPl08L2h0bWw+Ci0JCS8vIHdpbGwgcmV0dXJuIDxoZWFkPiw8L2hlYWQ+IGluc3RlYWQgb2YgPGhlYWQ+LDwvaGVhZD4sPC9odG1sPgotCQlpZiAobGVuZ3RoID4gMCkKLQkJCWxlbmd0aC0tOwotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBzdGFydCB0aHJlYWQgc2FmZSBibG9jawotCQl0cnkgewotCQkJYWNxdWlyZUxvY2soKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCArIGxlbmd0aCk7Ci0JCQl3aGlsZSAoY3VycmVudFJlZ2lvbiAhPSBlbmRSZWdpb24gJiYgY3VycmVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0cy5hZGQoY3VycmVudFJlZ2lvbik7Ci0JCQkJY3VycmVudFJlZ2lvbiA9IGN1cnJlbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJfQotCQkJLy8gbmVlZCB0byBhZGQgdGhhdCBsYXN0IGVuZCByZWdpb24KLQkJCS8vIGNhbiBiZSBudWxsIGluIHRoZSBjYXNlIG9mIGFuIGVtcHR5IGRvY3VtZW50Ci0JCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpCi0JCQkJcmVzdWx0cy5hZGQoZW5kUmVnaW9uKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXJlbGVhc2VMb2NrKCk7Ci0JCX0KLQkJLy8gZW5kIHRocmVhZCBzYWZlIGJsb2NrCi0KLQkJcmV0dXJuIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10pIHJlc3VsdHMudG9BcnJheShuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIHdhcyBtYWRlIHB1YmxpYyBmb3IgZWFzaWVyIHRlc3RpbmcuIE5vcm1hbGx5IHNob3VsZCBuZXZlciBiZSB1c2VkIGJ5Ci0JICogY2xpZW50IGNvZGVzLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBnZXRSZVBhcnNlcigpIHsKLQkJaWYgKGZSZVBhcnNlciA9PSBudWxsKSB7Ci0JCQlmUmVQYXJzZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQkJCWZSZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZSZVBhcnNlcjsKLQl9Ci0KLQlwcml2YXRlIElUZXh0U3RvcmUgZ2V0U3RvcmUoKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZlN0b3JlKTsKLQkJcmV0dXJuIGZTdG9yZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBnZXQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCdzIGxpbmUgdHJhY2tlci4gQXNzdW1lcyB0aGF0IHRoZSBkb2N1bWVudCBoYXMgYmVlbgotCSAqIGluaXRpYWxpemVkIHdpdGggYSBsaW5lIHRyYWNrZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgZG9jdW1lbnQncyBsaW5lIHRyYWNrZXIKLQkgKi8KLQlwcml2YXRlIElMaW5lVHJhY2tlciBnZXRUcmFja2VyKCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGZUcmFja2VyKTsKLQkJcmV0dXJuIGZUcmFja2VyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcigpIHsKLQkJaWYgKGZVbmRvTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmVW5kb01hbmFnZXIgPSBuZXcgU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBmVW5kb01hbmFnZXI7Ci0JfQotCi0Jdm9pZCBpbml0aWFsaXplRmlyc3RBbmRMYXN0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCS8vIGNhY2hlZCBOb2RlIG11c3QgYWxzbyBiZSBmaXJzdCwgYXQgdGhlIGluaXRpYWwgcG9pbnQuIE9ubHkKLQkJLy8gdmFsaWQKLQkJLy8gdG8gY2FsbCB0aGlzIG1ldGhvZCByaWdodCBhZnRlciB0aGUgZmlyc3QgcGFyc2UuCi0JCS8vIAotCQkvLyB3aGVuIHN0YXJ0aW5nIGFmcmVzaCwgb3VyIGNhY2hlZE5vZGUgc2hvdWxkIGJlIG91ciBmaXJzdE5vZGUsCi0JCS8vIHNvIGJlIHN1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgZmlyc3ROb2RlCi0JCWZpcnN0RG9jdW1lbnRSZWdpb24gPSBnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpOwotCQkvLyBiZSBzdXJlIHRvIHVzZSAnZ2V0TmV4dCcgZm9yIHRoaXMgaW5pdGlhbCBmaW5kaW5nIG9mIHRoZSBsYXN0Ci0JCS8vIG5vZGUsCi0JCS8vIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBub2RlLmdldExhc3ROb2RlIG1heSBzaW1wbHkgY2FsbAotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiEKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGZpcnN0RG9jdW1lbnRSZWdpb247Ci0JCWlmIChhTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBkZWZlY3QgMjU0NjA3OiB0byBoYW5kbGUgZW1wdHkgZG9jdW1lbnRzIHJpZ2h0LCBpZgotCQkJLy8gZmlyc3Rub2RlIGlzCi0JCQkvLyBudWxsLCBtYWtlIHN1cmUgbGFzdCBub2RlIGlzIG51bGwgdG9vCi0JCQlsYXN0RG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCQlsYXN0RG9jdW1lbnRSZWdpb24gPSBhTm9kZTsKLQkJCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2luc2VydFBvc2l0aW9uVXBkYXRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIsIGludCBpbmRleCkgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5pbnNlcnRQb3NpdGlvblVwZGF0ZXIodXBkYXRlciwgaW5kZXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbF9hZGRQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5hZGRQb3NpdGlvbkNhdGVnb3J5KGNhdGVnb3J5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxfYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5hZGRQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsX3NldFBhcnNlcihSZWdpb25QYXJzZXIgbmV3UGFyc2VyKSB7Ci0JCWZQYXJzZXIgPSBuZXdQYXJzZXI7Ci0JfQotCi0JU3RyaW5nIGludGVybmFsR2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGludCBteUxlbmd0aCA9IGdldExlbmd0aCgpOwotCQkvLyBpZiAoKDAgPiBvZmZzZXQpIHx8ICgwID4gbGVuZ3RoKSB8fCAob2Zmc2V0ICsgbGVuZ3RoID4gbXlMZW5ndGgpKQotCQkvLyB0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQkJcmVzdWx0ID0gZ2V0U3RvcmUoKS5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRMZW5ndGgKLQkgKiBAcGFyYW0gY2hhbmdlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGludGVybmFsUmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyBjaGFuZ2VzLCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQotCQlzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJaWYgKGNoYW5nZXMgPT0gbnVsbCkKLQkJCWNoYW5nZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyAKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KQotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjo6cmVwbGFjZVRleHQoIiArIHN0YXJ0ICsgIiwiICsgcmVwbGFjZW1lbnRMZW5ndGggKyAiLCIgKyBjaGFuZ2VzICsgIikiKTsgLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlpZiAoRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5IHx8IERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0UmF3U3RydWN0dXJlZERvY3VtZW50T25seSkgewotCQkJc3RhcnRTdHJlYW1UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vIE5vdGU6IGV2ZW50IG11c3QgYmUgY29tcHV0ZWQgYmVmb3JlICdmaXJlJyBtZXRob2QgY2FsbGVkCi0JCQlmRG9jdW1lbnRFdmVudCA9IG5ldyBEb2N1bWVudEV2ZW50KHRoaXMsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcyk7Ci0JCQlmaXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlZCgpOwotCi0JCQl0cnkgewotCQkJCWFjcXVpcmVMb2NrKCk7Ci0KLQkJCQlpZiAoIWlnbm9yZVJlYWRPbmx5U2V0dGluZ3MgJiYgKGNvbnRhaW5zUmVhZE9ubHkoc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKSkpIHsKLQkJCQkJTm9DaGFuZ2VFdmVudCBub0NoYW5nZUV2ZW50ID0gbmV3IE5vQ2hhbmdlRXZlbnQodGhpcywgcmVxdWVzdGVyLCBjaGFuZ2VzLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgpOwotCQkJCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuUkVBRF9PTkxZX1NUQVRFX0NIQU5HRTsKLQkJCQkJcmVzdWx0ID0gbm9DaGFuZ2VFdmVudDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IHVwZGF0ZU1vZGVsKHJlcXVlc3Rlciwgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlyZWxlYXNlTG9jaygpOwotCQkJfQotCi0KLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdFJhd1N0cnVjdHVyZWREb2N1bWVudE9ubHkgfHwgRGVidWcucGVyZlRlc3QpIHsKLQkJCQlsb25nIHN0b3BTdHJlYW1UaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IFRpbWUgZm9yIElTdHJ1Y3R1cmVkRG9jdW1lbnQgcmF3IHJlcGxhY2VUZXh0OiAiICsgKHN0b3BTdHJlYW1UaW1lIC0gc3RhcnRTdHJlYW1UaW1lKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZXZlbnQgdHlwZSByZXR1cm5lZCBieSByZXBsYWNlVGV4dFdpdGhOb0RlYnVnZ2luZ1RocmVhZDogIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIEZVVFVSRV9UT19ETzogaW1wbGVtZW50IGNhbGxiYWNrIG1lY2hhbmlzbT8gdG8gYXZvaWQgaW5zdGFuY2VvZgotCQkJLy8gYW5kIGNhc3RpbmcKLQkJCS8vIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBtdXN0IGJlIGNhbGxlZCBpbiBvcmRlciB0byBlbmQKLQkJCS8vIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZCBzdGF0ZQotCi0JCQkvLyBpbmNyZW1lbnQgbW9kaWZpY2F0aW9uIHN0YW1wIGlmIG1vZGlmaWNhdGlvbnMgd2VyZSBtYWRlCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJCWZNb2RpZmljYXRpb25TdGFtcCsrOwotCQkJCWZOZXh0TW9kaWZpY2F0aW9uU3RhbXA9IE1hdGgubWF4KGZNb2RpZmljYXRpb25TdGFtcCwgZk5leHRNb2RpZmljYXRpb25TdGFtcCk7Ci0JCQl9Ci0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCS8vIHJlc3VsdCBzaG91bGQgbm90IGJlIG51bGwsIGJ1dCBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93biwKLQkJCQkvLyBpdCB3aWxsIGJlCi0JCQkJLy8gc28gc2VuZCBhIG5vQ2hhbmdlRXZlbnQgYW5kIGxvZyB0aGUgcHJvYmxlbQotCQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIHJlcXVlc3RlciwgY2hhbmdlcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuTk9fRVZFTlQ7Ci0JCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KG5vQ2hhbmdlRXZlbnQpOwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiUHJvZ3JhbSBFcnJvcjogaW52YWxpZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IGV2ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZWdpb25DaGFuZ2VkRXZlbnQpIHsKLQkJCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KChSZWdpb25DaGFuZ2VkRXZlbnQpIHJlc3VsdCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgoUmVnaW9uc1JlcGxhY2VkRXZlbnQpIHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCQkJCQkvLyBwcm9iYWJseSBtb3JlIGVmZmljaWVudCB0byBtYXJrIG9sZCByZWdpb25zIGFzCi0JCQkJCQkJLy8gJ2RlbGV0ZWQnIGF0IHRoZSB0aW1lCi0JCQkJCQkJLy8gdGhhdCBhcmUgZGV0ZXJtaW5lZCB0byBiZSBkZWxldGVkLCBidXQgSSdsbCBkbwotCQkJCQkJCS8vIGhlcmUKLQkJCQkJCQkvLyBpbiB0aGVuIGNlbnRyYWwgc3BvdAotCQkJCQkJCS8vIGZvciBwcm9ncmFtbWluZyBlYXNlLgotCQkJCQkJCXVwZGF0ZURlbGV0ZWRGaWVsZHMoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSByZXN1bHQpOwotCQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHJlc3VsdCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkgewotCQkJCQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoKE5vQ2hhbmdlRXZlbnQpIHJlc3VsdCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBpZiBoZXJlLCB0aGlzIG1lYW5zIGEgbmV3IGV2ZW50IHdhcyBjcmVhdGVkCi0JCQkJCQkJCS8vIGFuZCBub3QgaGFuZGxlZCBoZXJlCi0JCQkJCQkJCS8vIGp1c3Qgc2VuZCBhIG5vIGV2ZW50IHVudGlsIHRoaXMgaXNzdWUgaXMKLQkJCQkJCQkJLy8gcmVzb2x2ZWQuCi0JCQkJCQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIHJlcXVlc3RlciwgY2hhbmdlcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJCQkJCQkJbm9DaGFuZ2VFdmVudC5yZWFzb24gPSBOb0NoYW5nZUV2ZW50Lk5PX0VWRU5UOwotCQkJCQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQobm9DaGFuZ2VFdmVudCk7Ci0JCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJQcm9ncmFtIEVycm9yOiB1bmV4cGVjdGVkIHN0cnVjdHVyZWQgZG9jdW1lbnQgZXZlbnQ6ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50T25seSkgewotCQkJCWxvbmcgc3RvcFN0cmVhbVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgVG90YWwgVGltZSBmb3IgSVN0cnVjdHVyZWREb2N1bWVudCBldmVudCBzaWduYWxpbmcvcHJvY2Vzc2luZyBpbiByZXBsYWNlVGV4dDogIiArIChzdG9wU3RyZWFtVGltZSAtIHN0YXJ0U3RyZWFtVGltZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2xlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBsZW5ndGgoKSB7Ci0KLQkJcmV0dXJuIGdldExlbmd0aCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtYWtlUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCW1ha2VSZWFkT25seShzdGFydE9mZnNldCwgbGVuZ3RoLCBmYWxzZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gY2FuSW5zZXJ0QmVmb3JlLCBib29sZWFuIGNhbkluc2VydEFmdGVyKSB7CQotCQkvLyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIHJlYWRvbmx5IHJlZ2lvbiBvZiAwIGxlbmd0aCwKLQkJLy8gc28gd2UnbGwgaWdub3JlIHRob3NlIHJlcXVlc3RzCi0JCWlmIChsZW5ndGggPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGFmZmVjdGVkVGV4dCA9IHRoaXMuZ2V0KHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkvLyBhIGRvY3VtZW50IGV2ZW50IGZvciAicmVhZCBvbmx5IiBjaGFuZ2UgLi4uIG11c3QKLQkJLy8gYmUgZm9sbG93ZWQgYnkgIm5vIGNoYW5nZSIgc3RydWN0dXJlZERvY3VtZW50IGV2ZW50Ci0JCS8vIGZEb2N1bWVudEV2ZW50ID0gbmV3IERvY3VtZW50RXZlbnQodGhpcywgc3RhcnRPZmZzZXQsIGxlbmd0aCwKLQkJLy8gYWZmZWN0ZWRUZXh0KTsKLQkJZmlyZVJlYWRPbmx5QWJvdXRUb0JlQ2hhbmdlZCgpOwotCQkvLyBpZiAoY29udGFpbnNSZWFkT25seShzdGFydE9mZnNldCwgbGVuZ3RoKSkgewotCQkvLyBhZGp1c3RSZWFkT25seVJlZ2lvbnMoc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIHdlIGNhbiBibGluZGx5IGFkZCBjYXRlZ29yeSwgc2luY2Ugbm8gaGFybSBkb25lIGlmIGFscmVhZHkKLQkJLy8gZXhpc3RzLgotCQlhZGRQb3NpdGlvbkNhdGVnb3J5KFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJUG9zaXRpb24gbmV3UG9zaXRpb24gPSBuZXcgUmVhZE9ubHlQb3NpdGlvbihzdGFydE9mZnNldCwgbGVuZ3RoLCBjYW5JbnNlcnRCZWZvcmUpOwotCQl0cnkgewotCQkJYWRkUG9zaXRpb24oUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlksIG5ld1Bvc2l0aW9uKTsKLQkJCS8vIEZJWE1FOiBuZWVkIHRvIGNoYW5nZSBBUEkgdG8gcGFzcyBpbiByZXF1ZXN0ZXIsIHNvIHRoaXMgZXZlbnQKLQkJCS8vIGNhbiBiZQotCQkJLy8gY3JlYXRlZCBjb3JyZWN0bHksIGluc3RlYWQgb2YgdXNpbmcgbnVsbC4KLQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIG51bGwsIGFmZmVjdGVkVGV4dCwgc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0JCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuUkVBRF9PTkxZX1NUQVRFX0NIQU5HRTsKLQkJCWZpcmVSZWFkT25seVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KG5vQ2hhbmdlRXZlbnQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmb3Igbm93LCBsb2cgYW5kIGlnbm9yZS4gUGVyaGFwcyBsYXRlciB3ZQotCQkJLy8gY291bGQgYWRqdXN0IHRvIGhhbmRsZSBzb21lIGNhc2VzPwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigoImNvdWxkIG5vdCBjcmVhdGUgcmVhZG9ubHkgcmVnaW9uIGF0ICIgKyBzdGFydE9mZnNldCArICIgdG8gIiArIGxlbmd0aCksIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQljYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgbmV2ZXIgb2NjdXIsIHNpbmNlIHdlIGFkZCBjYXRlZ29yeQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKS5uZXdJbnN0YW5jZSgpKTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgbmV3SW5zdGFuY2UpLnNldFJlUGFyc2VyKGdldFJlUGFyc2VyKCkubmV3SW5zdGFuY2UoKSk7Ci0JCWlmIChnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSB7Ci0JCQluZXdJbnN0YW5jZS5zZXREb2N1bWVudFBhcnRpdGlvbmVyKCgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpKS5uZXdJbnN0YW5jZSgpKTsKLQkJCW5ld0luc3RhbmNlLmdldERvY3VtZW50UGFydGl0aW9uZXIoKS5jb25uZWN0KG5ld0luc3RhbmNlKTsKLQkJfQotCQluZXdJbnN0YW5jZS5zZXRMaW5lRGVsaW1pdGVyKGdldExpbmVEZWxpbWl0ZXIoKSk7Ci0JCWlmIChnZXRFbmNvZGluZ01lbWVudG8oKSAhPSBudWxsKSB7Ci0JCQluZXdJbnN0YW5jZS5zZXRFbmNvZGluZ01lbWVudG8oKEVuY29kaW5nTWVtZW50bykgZ2V0RW5jb2RpbmdNZW1lbnRvKCkuY2xvbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSVJlZ2lvbkNvbXBhcmlibGUjcmVnaW9uTWF0Y2hlcyhpbnQsCi0JICogICAgICBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCUlUZXh0U3RvcmUgc3RvcmUgPSBnZXRTdG9yZSgpOwotCQlpZiAoc3RvcmUgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJcmVzdWx0ID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgc3RvcmUpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXQob2Zmc2V0LCBsZW5ndGgpLmVxdWFscyhzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJVGV4dFN0b3JlIHN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHN0b3JlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIHN0b3JlKS5yZWdpb25NYXRjaGVzSWdub3JlQ2FzZShvZmZzZXQsIGxlbmd0aCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGdldChvZmZzZXQsIGxlbmd0aCkuZXF1YWxzSWdub3JlQ2FzZShzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbiNyZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKElEb2N1bWVudExpc3RlbmVyIG93bmVyLCBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgcmVwbGFjZSkgewotCQlpZiAoZkFjY2VwdFBvc3ROb3RpZmljYXRpb25SZXBsYWNlcykgewotCQkJaWYgKGZQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcyA9PSBudWxsKQotCQkJCWZQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQlmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMuYWRkKG5ldyBSZWdpc3RlcmVkUmVwbGFjZShvd25lciwgcmVwbGFjZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZUxvY2soKSB7Ci0JCS8vIGRvIG5vdGhpbmcgaGVyZSBpbiBzdXBlciBjbGFzcwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJCWludCBvbGRTaXplID0gZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUKLQkJCQkJCQkvLyByZW1vdmluZwotCQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJCS8vIG9sZAotCQkJCQkvLyBvbmUKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmICgoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQkJaW50IG9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUgb25lIHdlIGFyZQotCQkJCQkJCS8vIHJlbW92aW5nCi0JCQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnNbaV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkJLy8gb2xkCi0JCQkJCS8vIG9uZQotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmICgoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCQlpbnQgb2xkU2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycy5sZW5ndGg7Ci0JCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUKLQkJCQkJCQkvLyByZW1vdmluZwotCQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyc1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZQotCQkJCQkvLyBvbGQKLQkJCQkJLy8gb25lCi0JCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmICgoZkRvY3VtZW50TGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmRG9jdW1lbnRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCQlpbnQgb2xkU2l6ZSA9IGZEb2N1bWVudExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJCUlEb2N1bWVudExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElEb2N1bWVudExpc3RlbmVyW25ld1NpemVdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJaWYgKGZEb2N1bWVudExpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmRG9jdW1lbnRMaXN0ZW5lcnNbaV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkJLy8gb2xkCi0JCQkJCS8vIG9uZQotCQkJCQlmRG9jdW1lbnRMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I3JlbW92ZURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCUFzc2VydC5pc05vdE51bGwobGlzdGVuZXIpOwotCQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyAhPSBudWxsKQotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+UG9zaXRpb248L2NvZGU+IGZyb20gdGhlIGRvY3VtZW50J3MgZGVmYXVsdAotCSAqIHBvc2l0aW9uIGNhdGVnb3J5LiBUaGUgZGVmYXVsdCBwb3NpdGlvbiBjYXRlZ29yeSBpcyB0byBiZSBkZWZpbmVkIGJ5Ci0JICogdGhlIGltcGxlbWVudGVycy4gSWYgdGhlIHBvc2l0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBkb2N1bWVudCdzIGRlZmF1bHQKLQkgKiBjYXRlZ29yeSBub3RoaW5nIGhhcHBlbnMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb24oUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkucmVtb3ZlUG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uCi0JICogQGV4Y2VwdGlvbiBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIGNhdGVnb3J5IGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLnJlbW92ZVBvc2l0aW9uKGNhdGVnb3J5LCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25DYXRlZ29yeQotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkucmVtb3ZlUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25VcGRhdGVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5yZW1vdmVQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgbGlzdGVuZXIgZnJvbSB0ZWggZG9jdW1lbnQncyBsaXN0IG9mCi0JICogcHJlbm90aWZpZWQgZG9jdW1lbnQgbGlzdGVuZXJzLiBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aAotCSAqIHRoZSBkb2N1bWVudCBub3RoaW5nIGhhcHBlbnMuCi0JICogPHA+Ci0JICogCi0JICogVGhpcyBtZXRob2QgaXMgbm90IGZvciBwdWJsaWMgdXNlLCBpdCBtYXkgb25seSBiZSBjYWxsZWQgYnkKLQkgKiBpbXBsZW1lbnRlcnMgb2YgPGNvZGU+SURvY3VtZW50QWRhcHRlcjwvY29kZT4gYW5kIG9ubHkgaWYgdGhvc2UKLQkgKiBpbXBsZW1lbnRlcnMgbmVlZCB0byBpbXBsZW1lbnQgPGNvZGU+SURvY3VtZW50TGlzdGVuZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudEFkYXB0ZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkCi0JICogCi0JICogQHNlZSAjYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBkb2N1bWVudEFkYXB0ZXIpKSB7Ci0JCQkJaW50IHByZXZpb3VzU2l6ZSA9IGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpZiAocHJldmlvdXNTaXplID4gMSkgewotCQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcltwcmV2aW91c1NpemUgLSAxXTsKLQkJCQkJaW50IHByZXZpb3VzSW5kZXggPSAwOwotCQkJCQlpbnQgbmV3SW5kZXggPSAwOwotCQkJCQl3aGlsZSAocHJldmlvdXNJbmRleCA8IHByZXZpb3VzU2l6ZSkgewotCQkJCQkJaWYgKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzW3ByZXZpb3VzSW5kZXhdICE9IGRvY3VtZW50QWRhcHRlcikKLQkJCQkJCQlsaXN0ZW5lcnNbbmV3SW5kZXgrK10gPSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyc1twcmV2aW91c0luZGV4XTsKLQkJCQkJCXByZXZpb3VzSW5kZXgrKzsKLQkJCQkJfQotCQkJCQlmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgSU5URVJOQUwgVVNFIE9OTFkgYW5kIGlzIE5PVCBBUEkuCi0JICogCi0JICogUmVidWlsZHMgdGhlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjaGFpbiBmcm9tIHRoZSBleGlzdGluZyB0ZXh0LgotCSAqIEZpbGVCdWZmZXIgc3VwcG9ydCBkb2VzIG5vdCBhbGxvdyBjbGllbnRzIHRvIGtub3cgdGhlIGRvY3VtZW50J3MKLQkgKiBsb2NhdGlvbiBiZWZvcmUgdGhlIHRleHQgY29udGVudHMgYXJlIHNldC4KLQkgKiAKLQkgKiBAc2VlIHNldChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwYXJzZShPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQljbGVhclJlYWRPbmx5KCk7Ci0KLQkJYWNxdWlyZUxvY2soKTsKLQkJdHJ5IHsKLQkJCUNoYXJTZXF1ZW5jZVJlYWRlciBzdWJTZXRUZXh0U3RvcmVSZWFkZXIgPSBuZXcgQ2hhclNlcXVlbmNlUmVhZGVyKChDaGFyU2VxdWVuY2UpIGdldFN0b3JlKCksIDAsIGdldFN0b3JlKCkuZ2V0TGVuZ3RoKCkpOwotCQkJcmVzZXRQYXJzZXIoc3ViU2V0VGV4dFN0b3JlUmVhZGVyLCAwKTsKLQkJCS8vCi0JCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihnZXRQYXJzZXIoKS5nZXREb2N1bWVudFJlZ2lvbnMoKSk7Ci0JCQkvLyB3aGVuIHN0YXJ0aW5nIGFmcmVzaCwgb3VyIGNhY2hlZE5vZGUgc2hvdWxkIGJlIG91ciBmaXJzdE5vZGUsCi0JCQkvLyBzbyBiZSBzdXJlIHRvIGluaXRpYWxpemUgdGhlIGZpcnN0Tm9kZSBhbmQgbGFzdE5vZGUKLQkJCWluaXRpYWxpemVGaXJzdEFuZExhc3REb2N1bWVudFJlZ2lvbigpOwotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0UGFyZW50RG9jdW1lbnQoZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSwgdGhpcyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlyZWxlYXNlTG9jaygpOwotCQl9Ci0KLQkJcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNyZXBsYWNlCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IHBvcywgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RlOiBJU3RydWN0dXJlZERvY3VtZW50OjpyZXBsYWNlKGludCwgaW50LCBTdHJpbmcpIC4uLi4gaXRzIGJldHRlciB0byB1c2UgcmVwbGFjZVRleHQoc291cmNlLCBzdHJpbmcsIGludCwgaW50KSBBUEkgZm9yIHN0cnVjdHVyZWREb2N1bWVudCB1cGRhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXBsYWNlVGV4dCh0aGlzLCBwb3MsIGxlbmd0aCwgc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSB0ZXh0IHdpdGggIm5ld1RleHQiIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICJzdGFydCIgZm9yIGEKLQkgKiBsZW5ndGggb2YgInJlcGxhY2VMZW5ndGgiLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgc3RhcnQgb2Zmc2V0IG9mIHRleHQgdG8gcmVwbGFjZSBOb25lIG9mIHRoZSBvZmZzZXRzIGluY2x1ZGUKLQkgKiAgICAgICAgICAgIGRlbGltaXRlcnMgb2YgcHJlY2VlZGluZyBsaW5lcy4gT2Zmc2V0IDAgaXMgdGhlIGZpcnN0Ci0JICogICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGRvY3VtZW50LgotCSAqIEBwYXJhbSByZXBsYWNlTGVuZ3RoCi0JICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGV4dCB0byByZXBsYWNlCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UKLQkgKiAgICAgICAgICAgIDxwPgotCSAqICAgICAgICAgICAgSW1wbGVtZW50b3JzIGhhdmUgdG8gbm90aWZ5IFRleHRDaGFuZ2VkIGxpc3RlbmVycyBhZnRlciB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgaGFzIGJlZW4gdXBkYXRlZC4gVGhlIFRleHRDaGFuZ2VkRXZlbnQgc2hvdWxkIGJlIHNldAotCSAqICAgICAgICAgICAgYXMgZm9sbG93czoKLQkgKiAKLQkgKiBldmVudC50eXBlID0gU1dULlRleHRSZXBsYWNlZCBldmVudC5zdGFydCA9IHN0YXJ0IG9mIHRoZSByZXBsYWNlZCB0ZXh0Ci0JICogZXZlbnQubnVtUmVwbGFjZWRMaW5lcyA9IG51bWJlciBvZiByZXBsYWNlZCBsaW5lcyBldmVudC5udW1OZXdMaW5lcyA9Ci0JICogbnVtYmVyIG9mIG5ldyBsaW5lcyBldmVudC5yZXBsYWNlZExlbmd0aCA9IGxlbmd0aCBvZiB0aGUgcmVwbGFjZWQgdGV4dAotCSAqIGV2ZW50Lm5ld0xlbmd0aCA9IGxlbmd0aCBvZiB0aGUgbmV3IHRleHQKLQkgKiAKLQkgKiBOT1RFOiBudW1OZXdMaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGluc2VydGVkIGxpbmVzIGFuZCBudW1SZXBsYWNlZExpbmVzCi0JICogaXMgdGhlIG51bWJlciBvZiBkZWxldGVkIGxpbmVzIGJhc2VkIG9uIHRoZSBjaGFuZ2UgdGhhdCBvY2N1cnMKLQkgKiB2aXN1YWxseS4gRm9yIGV4YW1wbGU6Ci0JICogCi0JICogcmVwbGFjZWRUZXh0IG5ld1RleHQgbnVtUmVwbGFjZWRMaW5lcyBudW1OZXdMaW5lcyAiIiAiXG4iIDAgMSAiXG5cbiIKLQkgKiAiYSIgMiAwICJhIiAiXG5cbiIgMCAyCi0JICovCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCXJldHVybiByZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgY2hhbmdlcywgYm9vbGVhbiBpZ25vcmVSZWFkT25seVNldHRpbmdzKSB7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCQotCQlpZiAocmVwbGFjZW1lbnRMZW5ndGggPT0gMCAmJiAoY2hhbmdlcyA9PSBudWxsIHx8IGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpCi0JCQltb2RpZmljYXRpb25TdGFtcCA9IGdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCWVsc2UKLQkJCW1vZGlmaWNhdGlvblN0YW1wID0gZ2V0TmV4dE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQotCQlyZXR1cm4gcmVwbGFjZVRleHQocmVxdWVzdGVyLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMsIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MsIG1vZGlmaWNhdGlvblN0YW1wKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIGNoYW5nZXMsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5ncywgbG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCA9IGludGVybmFsUmVwbGFjZVRleHQocmVxdWVzdGVyLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMsIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpOwotCQlmTW9kaWZpY2F0aW9uU3RhbXAgPSBtb2RpZmljYXRpb25TdGFtcDsKLQkJZk5leHRNb2RpZmljYXRpb25TdGFtcD0gTWF0aC5tYXgoZk1vZGlmaWNhdGlvblN0YW1wLCBmTmV4dE1vZGlmaWNhdGlvblN0YW1wKTsKLQkJcmV0dXJuIGV2ZW50OwotCX0KLQotCXZvaWQgcmVzZXRQYXJzZXIoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0KLQkJUmVnaW9uUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQlJVGV4dFN0b3JlIHRleHRTdG9yZSA9IGdldFN0b3JlKCk7Ci0JCWlmICh0ZXh0U3RvcmUgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKLQkJCUNoYXJTZXF1ZW5jZVJlYWRlciBzdWJTZXRUZXh0U3RvcmVSZWFkZXIgPSBuZXcgQ2hhclNlcXVlbmNlUmVhZGVyKChDaGFyU2VxdWVuY2UpIHRleHRTdG9yZSwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQkJCXBhcnNlci5yZXNldChzdWJTZXRUZXh0U3RvcmVSZWFkZXIsIHN0YXJ0T2Zmc2V0KTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBuZXdOb2RlVGV4dCA9IGdldChzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJcGFyc2VyLnJlc2V0KG5ld05vZGVUZXh0LCBzdGFydE9mZnNldCk7Ci0KLQkJfQotCi0JfQotCi0Jdm9pZCByZXNldFBhcnNlcihSZWFkZXIgcmVhZGVyLCBpbnQgc3RhcnRPZmZzZXQpIHsKLQkJUmVnaW9uUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQlwYXJzZXIucmVzZXQocmVhZGVyLCBzdGFydE9mZnNldCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbiNyZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKSB7Ci0JCS0tZlN0b3BwZWRDb3VudDsKLQkJaWYgKGZTdG9wcGVkQ291bnQgPT0gMCAmJiBmUmVlbnRyYW5jZUNvdW50ID09IDApCi0JCQlleGVjdXRlUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzIGluIDMuMCAtIHVzZSBhIEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyCi0JICogICAgICAgICAgICAgZGlyZWN0bHkKLQkgKiBAc2VlIElEb2N1bWVudCNzZWFyY2gKLQkgKi8KLQlwdWJsaWMgaW50IHNlYXJjaChpbnQgc3RhcnRQb3NpdGlvbiwgU3RyaW5nIGZpbmRTdHJpbmcsIGJvb2xlYW4gZm9yd2FyZFNlYXJjaCwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlLCBib29sZWFuIHdob2xlV29yZCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJLy8gKGRtdykgSSBhZGRlZCB0aGlzIHdhcm5pbmcsIHRvIGtub3cgaWYgc3RpbGwgYmVpbmcgdXNlZC4gSSdtIG5vdAotCQkvLyBzdXJlIGl0Ci0JCS8vIHdvcmtzIGFzIGV4cGVjdGVkIGFueSBsb25nZXIuCi0JCS8vIGJ1dCB0aGUgd2FybmluZyBzaG91bGQgYmUgcmVtb3ZlZCwgb25jZSBrbm93LgotCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiV0FSTklORzogdXNpbmcgdW5zdXBwb3J0ZWQgZGVwcmVjYXRlZCBtZXRob2QgJ3NlYXJjaCciKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgb2Zmc2V0ID0gLTE7Ci0JCUlSZWdpb24gbWF0Y2ggPSBuZXcgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIodGhpcykuZmluZChzdGFydFBvc2l0aW9uLCBmaW5kU3RyaW5nLCBmb3J3YXJkU2VhcmNoLCBjYXNlU2Vuc2l0aXZlLCB3aG9sZVdvcmQsIGZhbHNlKTsKLQkJaWYgKG1hdGNoICE9IG51bGwpIHsKLQkJCW9mZnNldCA9IG1hdGNoLmdldE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjc2V0VGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RlOiBJU3RydWN0dXJlZERvY3VtZW50OjpzZXRUZXh0KFN0cmluZykgLi4uLiBpdHMgYmV0dGVyIHRvIHVzZSBzZXRUZXh0KHNvdXJjZSwgc3RyaW5nKSBBUEkgZm9yIHN0cnVjdHVyZWREb2N1bWVudCB1cGRhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzZXRUZXh0KG51bGwsIHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtYXkgYmUgbWFya2VkIHB1YmxpYywgYnV0IHNob3VsZCBiZSBwYWNrYWdlZCBwcm90ZWN0ZWQsIG9uY2UKLQkgKiByZWZhY3RvcmluZyBpcyBjb21wbGV0ZSAoaW4gb3RoZXIgd29yZHMsIG5vdCBmb3IgY2xpZW50IHVzZSkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkUmVnaW9uKSB7Ci0JCWlmIChVU0VfTE9DQUxfVEhSRUFEKSB7Ci0JCQlmQ3VycmVudERvY3VtbmV0UmVnaW9uQ2FjaGUuc2V0KHN0cnVjdHVyZWRSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJY2FjaGVkRG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkUmVnaW9uOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZG9jdW1lbnQncyBwYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAc2VlIElEb2N1bWVudFBhcnRpdGlvbmVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgewotCQlzZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkcsIHBhcnRpdGlvbmVyKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50UGFydGl0aW9uZXIoU3RyaW5nIHBhcnRpdGlvbmluZywgSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIpIHsKLQkJaWYgKHBhcnRpdGlvbmVyID09IG51bGwpIHsKLQkJCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgIT0gbnVsbCkgewotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycy5yZW1vdmUocGFydGl0aW9uaW5nKTsKLQkJCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzLnNpemUoKSA9PSAwKQotCQkJCQlmRG9jdW1lbnRQYXJ0aXRpb25lcnMgPSBudWxsOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyA9PSBudWxsKQotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmRG9jdW1lbnRQYXJ0aXRpb25lcnMucHV0KHBhcnRpdGlvbmluZywgcGFydGl0aW9uZXIpOwotCQl9Ci0JCURvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IERvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50KHRoaXMpOwotCQlldmVudC5zZXRQYXJ0aXRpb25DaGFuZ2UocGFydGl0aW9uaW5nLCAwLCBnZXRMZW5ndGgoKSk7Ci0JCWZpcmVEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB7Ci0JCXRoaXMuZW5jb2RpbmdNZW1lbnRvID0gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXZvaWQgc2V0Rmlyc3REb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlmaXJzdERvY3VtZW50UmVnaW9uID0gcmVnaW9uOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjc2V0SW5pdGlhbExpbmVEZWxpbWl0ZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsTGluZURlbGltaXRlcihTdHJpbmcgbGluZURlbGltaXRlcikgewotCQkvLyBtYWtlIHN1cmUgb3VyIHByZWZlcnJlZCBkZWxpbWl0ZXIgaXMKLQkJLy8gb25lIG9mIHRoZSBsZWdhbCBvbmVzCi0JCWlmIChVdGlsaXRpZXMuY29udGFpbnNTdHJpbmcoZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBsaW5lRGVsaW1pdGVyKSkgewotCQkJZkluaXRpYWxMaW5lRGVsaW1pdGVyPSBsaW5lRGVsaW1pdGVyOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKExvZ2dlci5ERUJVR19ET0NVTUVOVCkKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiQXR0ZW1wdCB0byBzZXQgbGluZWRlbGltaXRlciB0byBub24tbGVnYWwgZGVsaW1pdGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkluaXRpYWxMaW5lRGVsaW1pdGVyID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSwgbmV3IElTY29wZUNvbnRleHRbXSB7IG5ldyBJbnN0YW5jZVNjb3BlKCkgfSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0Jdm9pZCBzZXRMYXN0RG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJbGFzdERvY3VtZW50UmVnaW9uID0gcmVnaW9uOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I3NldExpbmVEZWxpbWl0ZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5lRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJc2V0SW5pdGlhbExpbmVEZWxpbWl0ZXIoZGVsaW1pdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCdzIGxpbmUgdHJhY2tlci4gTXVzdCBiZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZgotCSAqIHRoZSBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gdHJhY2tlcgotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50J3MgbGluZSB0cmFja2VyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldExpbmVUcmFja2VyKElMaW5lVHJhY2tlciB0cmFja2VyKSB7Ci0JCWZUcmFja2VyID0gdHJhY2tlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZXIoUmVnaW9uUGFyc2VyIG5ld1BhcnNlcikgewotCQlpbnRlcm5hbF9zZXRQYXJzZXIobmV3UGFyc2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcG9zaXRpb25NYW5hZ2VyCi0JICogICAgICAgICAgICBUaGUgcG9zaXRpb25NYW5hZ2VyIHRvIHNldC4KLQkgKi8KLQkvLyBUT0RPOiBtYWtlIHByaXZhdGUgaXMgbmVlZGVkLCBlbHNlIHJlbW92ZQotCXZvaWQgc2V0UG9zaXRpb25NYW5hZ2VyKEdlbmVyaWNQb3NpdGlvbk1hbmFnZXIgcG9zaXRpb25NYW5hZ2VyKSB7Ci0JCWZQb3NpdGlvbk1hbmFnZXIgPSBwb3NpdGlvbk1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVQYXJzZXIoSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3UmVQYXJzZXIpIHsKLQkJZlJlUGFyc2VyID0gbmV3UmVQYXJzZXI7Ci0JCWlmIChmUmVQYXJzZXIgIT0gbnVsbCkgewotCQkJZlJlUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgQVBJcyB0byBtYW5pcHVsYXRlIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IGluIHRlcm1zIG9mIHRleHQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHNldFRleHQoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIHRoZVN0cmluZykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCi0JCXJlc3VsdCA9IHJlcGxhY2VUZXh0KHJlcXVlc3RlciwgMCwgZ2V0TGVuZ3RoKCksIHRoZVN0cmluZywgdHJ1ZSwgZ2V0TmV4dE1vZGlmaWNhdGlvblN0YW1wKCkpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZG9jdW1lbnQncyB0ZXh0IHN0b3JlLiBNdXN0IGJlIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotCSAqIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBzdG9yZQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50J3MgdGV4dCBzdG9yZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRUZXh0U3RvcmUoSVRleHRTdG9yZSBzdG9yZSkgewotCQlmU3RvcmUgPSBzdG9yZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcikgewotCi0JCS8vIGlmIHRoZSB1bmRvIG1hbmFnZXIgaGFzIGFscmVhZHkgYmVlbiBzZXQsIHRoZW4KLQkJLy8gZmFpbCBmYXN0LCBzaW5jZSBjaGFuZ2luZyB0aGUgdW5kbyBtYW5hZ2VyIHdpbGwgbGVhZAotCQkvLyB0byB1bnVzdWFsIHJlc3VsdHMgKG9yIGF0IGxlYXN0IGxvc3Mgb2YgdW5kbyBzdGFjaykuCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCAmJiBmVW5kb01hbmFnZXIgIT0gdW5kb01hbmFnZXIpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgY2hhbmdlIHVuZG8gbWFuYWdlciBvbmNlIGl0cyBiZWVuIHNldCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlmVW5kb01hbmFnZXIgPSB1bmRvTWFuYWdlcjsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc3RhcnRTZXF1ZW50aWFsUmV3cml0ZShib29sZWFuIG5vcm1hbGl6ZWQpIHsKLQkJSVRleHRTdG9yZSBzdG9yZSA9IG5ldyBTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZShnZXRTdG9yZSgpKTsKLQkJc2V0VGV4dFN0b3JlKHN0b3JlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkgewotCQkrK2ZTdG9wcGVkQ291bnQ7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzdG9wU2VxdWVudGlhbFJld3JpdGUoKSB7Ci0JCWlmIChnZXRTdG9yZSgpIGluc3RhbmNlb2YgU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUpIHsKLQkJCVNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlIHNyd3MgPSAoU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUpIGdldFN0b3JlKCk7Ci0JCQlJVGV4dFN0b3JlIHNvdXJjZSA9IHNyd3MuZ2V0U291cmNlU3RvcmUoKTsKLQkJCXNldFRleHRTdG9yZShzb3VyY2UpOwotCQkJc3J3cy5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgYXJnMCwgaW50IGFyZzEpIHsKLQkJcmV0dXJuIGdldChhcmcwLCBhcmcxKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURlbGV0ZWRGaWVsZHMoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRSZWdpb25zLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gb2xkUmVnaW9ucy5pdGVtKGkpOwotCQkJc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLnNldERlbGV0ZWQodHJ1ZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSByZS1wYXJzZXIuIE5vdGU6IHRoaXMgbWV0aG9kIG1heSBiZSAicHVibGljIiBidXQgc2hvdWxkIG9ubHkKLQkgKiBiZSBjYWxsZWQgYnkgcmUtcGFyc2VycyBpbiB0aGUgcmlnaHQgY2lyY3Vtc3RhbmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVEb2N1bWVudERhdGEoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlLCBTdHJpbmcgY2hhbmdlcykgewotCQlzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQkJZ2V0U3RvcmUoKS5yZXBsYWNlKHN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UsIGNoYW5nZXMpOwotCQl0cnkgewotCQkJZ2V0VHJhY2tlcigpLnJlcGxhY2Uoc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcyk7Ci0JCX0KLQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIGJlIGltcG9zc2libGUgaGVyZSwgYnV0IHdpbGwgbG9nIGZvciBub3cKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKGZQb3NpdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlBvc2l0aW9uTWFuYWdlci51cGRhdGVQb3NpdGlvbnMobmV3IERvY3VtZW50RXZlbnQodGhpcywgc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcykpOwotCQl9Ci0JCWZNb2RpZmljYXRpb25TdGFtcCsrOwotCQlmTmV4dE1vZGlmaWNhdGlvblN0YW1wPSBNYXRoLm1heChmTW9kaWZpY2F0aW9uU3RhbXAsIGZOZXh0TW9kaWZpY2F0aW9uU3RhbXApOwotCQlyZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlLCBTdHJpbmcgY2hhbmdlcykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlJU3RydWN0dXJlZFRleHRSZVBhcnNlciByZVBhcnNlciA9IGdldFJlUGFyc2VyKCk7Ci0JCS8vIGluaXRpYWxpemUgdGhlIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIHdpdGggdGhlIHN0YW5kYXJkIGRhdGEKLQkJLy8gdGhhdCdzCi0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJcmVQYXJzZXIuaW5pdGlhbGl6ZShyZXF1ZXN0ZXIsIHN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UsIGNoYW5nZXMpOwotCQlyZXN1bHQgPSByZVBhcnNlci5yZXBhcnNlKCk7Ci0JCS8vIGlmIHJlc3VsdCBpcyBudWxsIGF0IHRoaXMgcG9pbnQsIHRoZW4gdGhlcmUgbXVzdCBiZSBhbiBlcnJvciwgc2luY2UKLQkJLy8gZXZlbiBpZiB0aGVyZQotCQkvLyB3YXMgbm8gY2hhbmdlIChlaXRoZXIgZGlzYWxsb3cgZHVlIHRvIHJlYWRvbmx5LCBvciBhIHBlcnNvbiBwYXN0ZWQKLQkJLy8gdGhlIHNhbWUgdGhpbmcKLQkJLy8gdGhleSBoYWQgc2VsZWN0ZWQpIHRoZW4gYSAiTm9DaGFuZ2UiIGV2ZW50IHNob3VsZCBoYXZlIGJlZW4gZmlyZWQuCi0JCUFzc2VydC5pc05vdE51bGwocmVzdWx0LCAibm8gc3RydWN0dXJlZERvY3VtZW50IGV2ZW50IHdhcyBjcmVhdGVkIGluIElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnVwZGF0ZVN0cnVjdHVyZWREb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudCNnZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0TGluZURlbGltaXRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQjc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlcikgewotCQlzZXRJbml0aWFsTGluZURlbGltaXRlcihwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpOwotCi0JfQotCi0KLQkvKioKLQkgKiBDbGFzcyB3aGljaCBpbXBsZW1lbnRzIHRoZSByZXdyaXRhYmxlIHNlc3Npb24gZm9yIHRoZSBTU0UuCi0JICogCi0JICovCi0JY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmV3cml0ZVNlc3Npb24gZXh0ZW5kcyBEb2N1bWVudFJld3JpdGVTZXNzaW9uIHsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBzZXNzaW9uLgotCQkgKiAKLQkJICogQHBhcmFtIHNlc3Npb25UeXBlCi0JCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhpcyBzZXNzaW9uCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUpIHsKLQkJCXN1cGVyKHNlc3Npb25UeXBlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I3N0YXJ0UmV3cml0ZVNlc3Npb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSkKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHNlc3Npb25UeXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJLy8gZGVsZWdhdGUgdG8gc3ViLWNsYXNzLCBzbyBVSSB0aHJlYWRpbmcgaXMgaGFuZGxlZCBjb3JyZWN0bHkKLQkJcmV0dXJuIGludGVybmFsU3RhcnRSZXdyaXRlU2Vzc2lvbihzZXNzaW9uVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogTk9ULUFQSS4gRmluYWwgcHJvdGVjdGVkIHNvIGNsaWVudHMgbWF5IGNhbGwgdGhpcyBtZXRob2QgaWYgbmVlZGVkLCBidXQKLQkgKiBjYW5ub3Qgb3ZlcnJpZGUuCi0JICogCi0JICogQHBhcmFtIHNlc3Npb25UeXBlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIERvY3VtZW50UmV3cml0ZVNlc3Npb24gaW50ZXJuYWxTdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHNlc3Npb25UeXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJaWYgKGdldEFjdGl2ZVJld3JpdGVTZXNzaW9uKCkgIT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFscmVhZHkgaW4gYSByZXdyaXRlIHNlc3Npb24iKTsKLQotCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmV3cml0ZVNlc3Npb24oc2Vzc2lvblR5cGUpOwotCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQgZXZlbnQgPSBuZXcgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50KHRoaXMsIHNlc3Npb24sIERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudC5TRVNTSU9OX1NUQVJUKTsKLQkJZmlyZURvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudChldmVudCk7Ci0KLQkJSUxpbmVUcmFja2VyIHRyYWNrZXIgPSBnZXRUcmFja2VyKCk7Ci0JCWlmICh0cmFja2VyIGluc3RhbmNlb2YgSUxpbmVUcmFja2VyRXh0ZW5zaW9uKSB7Ci0JCQlJTGluZVRyYWNrZXJFeHRlbnNpb24gZXh0ZW5zaW9uID0gKElMaW5lVHJhY2tlckV4dGVuc2lvbikgdHJhY2tlcjsKLQkJCWV4dGVuc2lvbi5zdGFydFJld3JpdGVTZXNzaW9uKHNlc3Npb24pOwotCQl9Ci0KLQkJc3RhcnRSZXdyaXRlU2Vzc2lvbk9uUGFydGl0aW9uZXJzKHNlc3Npb24pOwotCi0JCWlmIChEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5TRVFVRU5USUFMID09IHNlc3Npb25UeXBlKQotCQkJc3RhcnRTZXF1ZW50aWFsUmV3cml0ZShmYWxzZSk7Ci0JCWVsc2UgaWYgKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlNUUklDVExZX1NFUVVFTlRJQUwgPT0gc2Vzc2lvblR5cGUpCi0JCQlzdGFydFNlcXVlbnRpYWxSZXdyaXRlKHRydWUpOwotCi0JCWZBY3RpdmVSZXdyaXRlU2Vzc2lvbiA9IHNlc3Npb247Ci0JCXJldHVybiBzZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgZ2l2ZW4gcmV3cml0ZSBzZXNzaW9uLgotCSAqCi0JICogQHBhcmFtIHNlc3Npb24gdGhlIHJld3JpdGUgc2Vzc2lvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlmaW5hbCB2b2lkIHN0YXJ0UmV3cml0ZVNlc3Npb25PblBhcnRpdGlvbmVycyhEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlPSBmRG9jdW1lbnRQYXJ0aXRpb25lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBwYXJ0aXRpb25lcj0gZS5uZXh0KCk7Ci0JCQkJaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24zKSB7Ci0JCQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMyBleHRlbnNpb249IChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjMpIHBhcnRpdGlvbmVyOwotCQkJCQlleHRlbnNpb24uc3RhcnRSZXdyaXRlU2Vzc2lvbihzZXNzaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHN0b3BSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJLy8gZGVsZWdhdGUgdG8gc3ViLWNsYXNzLCBzbyBVSSB0aHJlYWRpbmcgaXMgaGFuZGxlZCBjb3JyZWN0bHkKLQkJaW50ZXJuYWxTdG9wUmV3cml0ZVNlc3Npb24oc2Vzc2lvbik7Ci0JfQotCi0JLyoqCi0JICogTk9ULUFQSS4gRmluYWwgcHJvdGVjdGVkIHNvIGNsaWVudHMgbWF5IGNhbGwgdGhpcyBtZXRob2QgaWYgbmVlZGVkLCBidXQKLQkgKiBjYW5ub3Qgb3ZlcnJpZGUuCi0JICogCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFN0b3BSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJaWYgKGZBY3RpdmVSZXdyaXRlU2Vzc2lvbiA9PSBzZXNzaW9uKSB7Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSA9IHNlc3Npb24uZ2V0U2Vzc2lvblR5cGUoKTsKLQkJCWlmIChEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5TRVFVRU5USUFMID09IHNlc3Npb25UeXBlIHx8IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlNUUklDVExZX1NFUVVFTlRJQUwgPT0gc2Vzc2lvblR5cGUpCi0JCQkJc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCk7Ci0KLQkJCXN0b3BSZXdyaXRlU2Vzc2lvbk9uUGFydGl0aW9uZXJzKHNlc3Npb24pOwotCi0JCQlJTGluZVRyYWNrZXIgdHJhY2tlciA9IGdldFRyYWNrZXIoKTsKLQkJCWlmICh0cmFja2VyIGluc3RhbmNlb2YgSUxpbmVUcmFja2VyRXh0ZW5zaW9uKSB7Ci0JCQkJSUxpbmVUcmFja2VyRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChJTGluZVRyYWNrZXJFeHRlbnNpb24pIHRyYWNrZXI7Ci0JCQkJZXh0ZW5zaW9uLnN0b3BSZXdyaXRlU2Vzc2lvbihzZXNzaW9uLCBnZXQoKSk7Ci0JCQl9Ci0KLQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCBldmVudCA9IG5ldyBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQodGhpcywgc2Vzc2lvbiwgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50LlNFU1NJT05fU1RPUCk7Ci0JCQlmaXJlRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50KGV2ZW50KTsKLQkJCWZBY3RpdmVSZXdyaXRlU2Vzc2lvbiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGUgZ2l2ZW4gcmV3cml0ZSBzZXNzaW9uLgotCSAqCi0JICogQHBhcmFtIHNlc3Npb24gdGhlIHJld3JpdGUgc2Vzc2lvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlmaW5hbCB2b2lkIHN0b3BSZXdyaXRlU2Vzc2lvbk9uUGFydGl0aW9uZXJzKERvY3VtZW50UmV3cml0ZVNlc3Npb24gc2Vzc2lvbikgewotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzICE9IG51bGwpIHsKLQkJCURvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50IGV2ZW50PSBuZXcgRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQodGhpcyk7Ci0JCQlJdGVyYXRvciBlPSBmRG9jdW1lbnRQYXJ0aXRpb25lcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBwYXJ0aXRpb25pbmc9IChTdHJpbmcpIGUubmV4dCgpOwotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyPSAoSURvY3VtZW50UGFydGl0aW9uZXIpIGZEb2N1bWVudFBhcnRpdGlvbmVycy5nZXQocGFydGl0aW9uaW5nKTsKLQkJCQlpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjMpIHsKLQkJCQkJSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24zIGV4dGVuc2lvbj0gKElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMykgcGFydGl0aW9uZXI7Ci0JCQkJCWV4dGVuc2lvbi5zdG9wUmV3cml0ZVNlc3Npb24oc2Vzc2lvbik7Ci0JCQkJCWV2ZW50LnNldFBhcnRpdGlvbkNoYW5nZShwYXJ0aXRpb25pbmcsIDAsIGdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWV2ZW50LmlzRW1wdHkoKSkKLQkJCQlmaXJlRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I2dldEFjdGl2ZVJld3JpdGVTZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBnZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpIHsKLQkJcmV0dXJuIGZBY3RpdmVSZXdyaXRlU2Vzc2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNhZGREb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGxpc3RlbmVyKTsKLQkJCWlmIChmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkJZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJfQotCQkJaWYgKCFmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQkJZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I3JlbW92ZURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0ZW5lcik7Ci0JCQlpZiAoZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQlmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjcmVwbGFjZShpbnQsIGludCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCwgbG9uZyBtb2RpZmljYXRpb25TdGFtcCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCBsZW5ndGgsIHRleHQsIGZhbHNlLCBtb2RpZmljYXRpb25TdGFtcCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjc2V0KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCwgbG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQkvLyBidWcgMTUxMDY5IC0gb3ZlcndyaXRlIHJlYWQgb25seSByZWdpb25zIHdoZW4gc2V0dGluZyBlbnRpcmUgZG9jdW1lbnQKLQkJIHJlcGxhY2VUZXh0KG51bGwsIDAsIGdldExlbmd0aCgpLCB0ZXh0LCB0cnVlLCBtb2RpZmljYXRpb25TdGFtcCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvblN0YW1wOwotCX0KLQkKLQlwcml2YXRlIGxvbmcgZ2V0TmV4dE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQlpZiAoZk5leHRNb2RpZmljYXRpb25TdGFtcCA9PSBMb25nLk1BWF9WQUxVRSB8fCBmTmV4dE1vZGlmaWNhdGlvblN0YW1wID09IElEb2N1bWVudEV4dGVuc2lvbjQuVU5LTk9XTl9NT0RJRklDQVRJT05fU1RBTVApCi0JCQlmTmV4dE1vZGlmaWNhdGlvblN0YW1wPSAwOwotCQllbHNlCi0JCQlmTmV4dE1vZGlmaWNhdGlvblN0YW1wPSBmTmV4dE1vZGlmaWNhdGlvblN0YW1wICsgMTsKLQotCQlyZXR1cm4gZk5leHRNb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhbiBldmVudCwgYXMgc3BlY2lmaWVkLCB0byB0aGUgYXNzb2NpYXRlZCBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gZmlyZSwgZWl0aGVyIGEgc3RhcnQgb3Igc3RvcCBldmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZURvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudChEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzID09IG51bGwgfHwgZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycyk7Ci0JCUl0ZXJhdG9yIGUgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBsID0gKElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIpIGUubmV4dCgpOwotCQkJbC5kb2N1bWVudFJld3JpdGVTZXNzaW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjQ5NTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotcHVibGljIGNsYXNzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1RPUkVfTk9UX0FTU0lHTkVEID0gInRleHQgc3RvcmUgbm90IGFzc2lnbmVkIHlldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERUZJTkVEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkRG9jdW1lbnQuVU5ERUZJTkVEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbkxpc3QgX3JlZ2lvbnM7Ci0JLyoqCi0JICogaGFzIHRoaXMgcmVnaW9uIGJlZW4gcmVtb3ZlZCBmcm9tIGl0cyBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTUFTS19JU19ERUxFVEVEID0gMTsKLQkvKioKLQkgKiB3YXMgdGhpcyByZWdpb24gdGVybWluYXRlZCBub3JtYWxseQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTUFTS19JU19FTkRFRCA9IDEgPDwgMTsKLQotCXByaXZhdGUgYnl0ZSBmSXNEZWxldGVkT3JFbmRlZCA9IDA7Ci0KLQkvKioKLQkgKiBhbGxvdyBhIHBvaW50ZXIgYmFjayB0byB0aGlzIG5vZGVzIG1vZGVsCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZQYXJlbnREb2N1bWVudDsKLQkKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91cyA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBzdGFydDsKLQotCXB1YmxpYyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQkJX3JlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBFdmVuIGluc2lkZS10aGlzIGNsYXNzIHVzZXMgb2YgJ3JlZ2lvbnMnIHNob3VsZCB1c2UgdGhpcyBtZXRob2QsIGFzCi0JICogdGhpcyBpcyB3aGVyZSAoc29mdCkgbWVtb3J5IG1hbmFnZW1lbnQvcmVwYXJzaW5nLCBldGMuLCB3aWxsIGJlCi0JICogY2VudHJhbGl6ZWQuCi0JICovCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbkxpc3QgX2dldFJlZ2lvbnMoKSB7Ci0KLQkJcmV0dXJuIF9yZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCV9nZXRSZWdpb25zKCkuYWRkKGFSZWdpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQlzdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJc3RhcnQgKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBpKSB7Ci0KLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gaSAmJiBpIDwgZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pIDw9IG9mZnNldCAmJiBvZmZzZXQgPCBnZXRFbmRPZmZzZXQoY29udGFpbmVkUmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW5kIGFuZCBnZXRFbmRPZmZzZXQgYXJlIHRoZSBzYW1lIG9ubHkgZm9yCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIHN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmQgYW5kIGdldEVuZE9mZnNldCBhcmUgdGhlIHNhbWUgb25seSBmb3IKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pICsgY29udGFpbmVkUmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpIHsKLQkJaWYgKF9nZXRSZWdpb25zKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gX2dldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXRQYXJlbnREb2N1bWVudCgpLmdldChzdGFydCwgZkxlbmd0aCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpbnQgcmVnaW9uU3RhcnQgPSBhUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpbnQgcmVnaW9uTGVuZ3RoID0gYVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCXJlc3VsdCA9IGZQYXJlbnREb2N1bWVudC5nZXQoc3RhcnQgKyByZWdpb25TdGFydCwgcmVnaW9uTGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJLy8gRE1XOiBsb29waW5nIGlzIGZhc3RlciB0aGFuIGVudW1lcmF0aW9uLAotCQkvLyBzbyBzd2l0Y2hlZCBhcm91bmQgMi8xMi8wMwotCQkvLyBFbnVtZXJhdGlvbiBlID0gZ2V0UmVnaW9ucygpLmVsZW1lbnRzKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJcmVnaW9uID0gZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IGNvbnRleHQpCi0JCQkJcmVzdWx0ICs9IGdldEZ1bGxUZXh0KHJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpIHsKLQkJaWYgKF9nZXRSZWdpb25zKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gX2dldFJlZ2lvbnMoKS5nZXQoX2dldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dCgpIHsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7Ci0JCXJldHVybiBfZ2V0UmVnaW9ucygpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRQYXJlbnREb2N1bWVudCgpIHsKLQotCQlyZXR1cm4gZlBhcmVudERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzKCkgewotCQlyZXR1cm4gcHJldmlvdXM7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcmFtZXRlciBvZmZzZXQgcmVmZXJzIHRvIHRoZSBvdmVyYWxsIG9mZnNldCBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKF9nZXRSZWdpb25zKCkgIT0gbnVsbCkgewotCQkJLy8gdHJhbnNmb3JtIHRoZSByZXF1ZXN0ZWQgb2Zmc2V0IHRvIHRoZSAic2NhbGUiIHRoYXQKLQkJCS8vIHJlZ2lvbnMgYXJlIHN0b3JlZCBpbiwgd2hpY2ggYXJlIGFsbCByZWxhdGl2ZSB0byB0aGUKLQkJCS8vIHN0YXJ0IHBvaW50LgotCQkJLy8gaW50IHRyYW5zZm9ybWVkT2Zmc2V0ID0gb2Zmc2V0IC0gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCS8vCi0JCQlpbnQgbGVuZ3RoID0gZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlZ2lvbihzKSBpbiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOjpnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldDogIiArIHJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVxdWVzdGVkIG9mZnNldDogIiArIG9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgdHJhbnNmb3JtZWRPZmZzZXQ6ICIgKwotCQkJCQkvLyB0cmFuc2Zvcm1lZE9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIHN0YXJ0OiAiICsgcmVnaW9uLmdldFN0YXJ0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBlbmQ6ICIgKyByZWdpb24uZ2V0RW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiB0eXBlOiAiICsgcmVnaW9uLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIGNsYXNzOiAiICsgcmVnaW9uLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQl9Ci0JCQkJaWYgKChnZXRTdGFydE9mZnNldChyZWdpb24pIDw9IG9mZnNldCkgJiYgKG9mZnNldCA8IGdldEVuZE9mZnNldChyZWdpb24pKSkgewotCQkJCQlyZXN1bHQgPSByZWdpb247Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpIHsKLQkJcmV0dXJuIF9nZXRSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnQgYW5kIGdldFN0YXJ0T2Zmc2V0IGFyZSB0aGUgc2FtZSBvbmx5IGZvcgotCSAqIElTdHJ1Y3V0cmVkRG9jdW1lbnRSZWdpb25zCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0IGFuZCBnZXRTdGFydE9mZnNldCBhcmUgdGhlIHNhbWUgb25seSBmb3IKLQkgKiBJU3RydWN1dHJlZERvY3VtZW50UmVnaW9ucwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCS8vIGFzc2VydDogY29udGFpbmVkUmVnaW9uIGNhbiBub3QgYmUgbnVsbAotCQkvLyAobWlnaHQgYmUgcGVyZm9ybWFuY2UgaGl0IGlmIGxpdGVyYWxseSBwdXQgaW4gYXNzZXJ0IGNhbGwsCi0JCS8vIGJ1dCBjb250YWluZWRSZWdpb24gY2FuIG5vdCBiZSBudWxsKS4gTmVlZHMgdG8gYmUgY2hlY2tlZAotCQkvLyBieSBjYWxsaW5nIGNvZGUuCi0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgY29udGFpbmVkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChmUGFyZW50RG9jdW1lbnQgPT0gbnVsbCkgewotCQkJCS8vIGxpa2VseSB0byBoYXBwZW4gZHVyaW5nIGluc3BlY3RpbmcKLQkJCQlyZXN1bHQgPSBURVhUX1NUT1JFX05PVF9BU1NJR05FRDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IGZQYXJlbnREb2N1bWVudC5nZXQoc3RhcnQsIGZMZW5ndGgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJLy8gYXNzZXJ0OiBhUmVnaW9uIGNhbiBub3QgYmUgbnVsbAotCQkvLyAobWlnaHQgYmUgcGVyZm9ybWFuY2UgaGl0IGlmIGxpdGVyYWxseSBwdXQgaW4gYXNzZXJ0IGNhbGwsCi0JCS8vIGJ1dCBhUmVnaW9uIGNhbiBub3QgYmUgbnVsbCkuIE5lZWRzIHRvIGJlIGNoZWNrZWQKLQkJLy8gYnkgY2FsbGluZyBjb2RlLgotCQl0cnkgewotCQkJcmV0dXJuIGZQYXJlbnREb2N1bWVudC5nZXQodGhpcy5nZXRTdGFydE9mZnNldChhUmVnaW9uKSwgYVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIGZpcnN0IHJlZ2lvbiB3aXRoIHRoZSBtYXRjaGluZyBjb250ZXh0IHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJLy8gRE1XOiBsb29waW5nIGlzIGZhc3RlciB0aGFuIGVudW1lcmF0aW9uLAotCQkvLyBzbyBzd2l0Y2hlZCBhcm91bmQgMi8xMi8wMwotCQkvLyBFbnVtZXJhdGlvbiBlID0gZ2V0UmVnaW9ucygpLmVsZW1lbnRzKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJcmVnaW9uID0gZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IGNvbnRleHQpIHsKLQkJCQlyZXN1bHQgPSBnZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBzdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IF9nZXRSZWdpb25zKCkuZ2V0KF9nZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSk7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFRleHRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pICsgY29udGFpbmVkUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSB0eXBlIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gLi4uIG5vdCB0byBiZSBjb25mdXNlZAotCSAqIHdpdGggdHlwZSBvZiBYTUwgbm9kZSEgVGhpcyBpcyBzdWJjbGFzc2VkLCBpZiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0eXBlCi0JICogb2YgZmlyc3QgcmVnaW9uIGlzIGRlc2lyZWQuCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gVU5ERUZJTkVEOwotCQlJVGV4dFJlZ2lvbkxpc3Qgc3VicmVnaW9ucyA9IGdldFJlZ2lvbnMoKTsKLQkJaWYgKHN1YnJlZ2lvbnMgIT0gbnVsbCAmJiBzdWJyZWdpb25zLnNpemUoKSA+IDApIHsKLQkJCUlUZXh0UmVnaW9uIGZpcnN0UmVnaW9uID0gc3VicmVnaW9ucy5nZXQoMCk7Ci0JCQlpZiAoZmlyc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGZpcnN0UmVnaW9uLmdldFR5cGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiNpc0RlbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCgpIHsKLQkJcmV0dXJuIChmSXNEZWxldGVkT3JFbmRlZCAmIE1BU0tfSVNfREVMRVRFRCkgIT0gMCB8fCAoZlBhcmVudERvY3VtZW50ID09IG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kZWQoKSB7Ci0JCXJldHVybiAoZklzRGVsZXRlZE9yRW5kZWQgJiBNQVNLX0lTX0VOREVEKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHJlZ2lvbiA9PSBudWxsLCB3ZSByZXR1cm4gZmFsc2U7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIHJlZ2lvbnMgYXJlIHRoZSBzYW1lIGluc3RhbmNlLCB0aGV5IGFyZSBlcXVhbAotCQkJaWYgKHRoaXMgPT0gcmVnaW9uKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRoaXMgaXMgdGhlIG5vbi10cml2aWFsIHBhcnQKLQkJCQkvLyBub3RlOiB3ZSBjaGFuZ2UgZm9yIHR5cGUgZmlyc3QsIHRoZW4gc3RhcnQgb2Zmc2V0IGFuZCBlbmQKLQkJCQkvLyBvZmZzZXQsCi0JCQkJLy8gc2luY2UgdGhhdCB3b3VsZCBkZWNpZGUgbWFueSBjYXNlcyByaWdodCBhd2F5IGFuZCBhdm9pZCB0aGUKLQkJCQkvLyB0ZXh0IGNvbXBhcmlzb24KLQkJCQlpZiAoZ2V0VHlwZSgpID09IHJlZ2lvbi5nZXRUeXBlKCkpIHsKLQkJCQkJaWYgKHNhbWVPZmZzZXRzQXMocmVnaW9uLCBzaGlmdCkgJiYgc2FtZVRleHRBcyhyZWdpb24sIHNoaWZ0KSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdEb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgYW55IHJlZ2lvbiBpcyBudWxsLCB3ZSByZXR1cm4gZmFsc2UgKGV2ZW4gaWYgYm90aCBhcmUhKQotCQlpZiAoKG9sZFJlZ2lvbiAhPSBudWxsKSAmJiAobmV3UmVnaW9uICE9IG51bGwpKSB7Ci0JCQkvLyBpZiB0aGUgcmVnaW9ucyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UsIHRoZXkgYXJlIGVxdWFsCi0JCQlpZiAob2xkUmVnaW9uID09IG5ld1JlZ2lvbikgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBub24tdHJpdmlhbCBwYXJ0Ci0JCQkJLy8gbm90ZTogd2UgY2hhbmdlIGZvciB0eXBlIGZpcnN0LCB0aGVuIHN0YXJ0IG9mZnNldCBhbmQgZW5kCi0JCQkJLy8gb2Zmc2V0LAotCQkJCS8vIHNpbmNlIHRoYXQgd291bGQgZGVjaWRlIG1hbnkgY2FzZXMgcmlnaHQgYXdheSBhbmQgYXZvaWQgdGhlCi0JCQkJLy8gdGV4dCBjb21wYXJpc29uCi0JCQkJaWYgKG9sZFJlZ2lvbi5nZXRUeXBlKCkgPT0gbmV3UmVnaW9uLmdldFR5cGUoKSkgewotCQkJCQlpZiAoc2FtZU9mZnNldHNBcyhvbGRSZWdpb24sIG5ld0RvY3VtZW50UmVnaW9uLCBuZXdSZWdpb24sIHNoaWZ0KSkgewotCQkJCQkJaWYgKHNhbWVUZXh0QXMob2xkUmVnaW9uLCBuZXdEb2N1bWVudFJlZ2lvbiwgbmV3UmVnaW9uLCBzaGlmdCkpIHsKLQkJCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lT2Zmc2V0c0FzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJaWYgKGdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgLSBzaGlmdCkgewotCQkJaWYgKGdldEVuZE9mZnNldCgpID09IHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIHNoaWZ0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lT2Zmc2V0c0FzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJaWYgKGdldFN0YXJ0T2Zmc2V0KG9sZFJlZ2lvbikgPT0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmV3UmVnaW9uKSAtIHNoaWZ0KSB7Ci0JCQlpZiAoZ2V0RW5kT2Zmc2V0KG9sZFJlZ2lvbikgPT0gZG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KG5ld1JlZ2lvbikgLSBzaGlmdCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2FtZVRleHRBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0VGV4dCgpLmVxdWFscyhyZWdpb24uZ2V0VGV4dCgpKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gSVNTVUU6IHdlIHNob3VsZCBub3QgbmVlZCB0aGlzCi0JCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2FtZVRleHRBcyhJVGV4dFJlZ2lvbiBvbGRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5ld1JlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKGdldFRleHQob2xkUmVnaW9uKS5lcXVhbHMoZG9jdW1lbnRSZWdpb24uZ2V0VGV4dChuZXdSZWdpb24pKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uI3NldERlbGV0ZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGV0ZWQoYm9vbGVhbiBpc0RlbGV0ZWQpIHsKLQkJZklzRGVsZXRlZE9yRW5kZWQgPSAoYnl0ZSkgKGlzRGVsZXRlZCA/IGZJc0RlbGV0ZWRPckVuZGVkIHwgTUFTS19JU19ERUxFVEVEIDogMCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0hhc0VuZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZGVkKGJvb2xlYW4gbmV3SGFzRW5kKSB7Ci0JCWZJc0RlbGV0ZWRPckVuZGVkID0gKGJ5dGUpIChuZXdIYXNFbmQgPyBmSXNEZWxldGVkT3JFbmRlZCB8IE1BU0tfSVNfRU5ERUQgOiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IG5ld0xlbmd0aCkgewotCQkvLyB0ZXh0TGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlmTGVuZ3RoID0gbmV3TGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5leHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0KSB7Ci0JCW5leHQgPSBuZXdOZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZlBhcmVudERvY3VtZW50ID0gZG9jdW1lbnQ7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzKSB7Ci0JCXByZXZpb3VzID0gbmV3UHJldmlvdXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgY29udGFpbmVkUmVnaW9ucykgewotCQlfcmVnaW9ucyA9IGNvbnRhaW5lZFJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KSB7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJLy8gTk9URTogaWYgdGhlIGRvY3VtZW50IGhlbGQgYnkgYW55IHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGFuZCB0aGUKLQkJLy8gcmVnaW9uIG9mZnNldHMgaGF2ZSBub3QKLQkJLy8geWV0IGJlZW4gdXBkYXRlZCwgdGhlIG91dHB1dCBmcm9tIHRoaXMgbWV0aG9kIGludmFsaWQuCi0JCS8vIEFsc28gbm90ZSwgdGhpcyBtZXRob2QgY2FuIG5vdCBiZSBjaGFuZ2VkLCB3aXRob3V0ICJicmVha2luZyIKLQkJLy8gdW5pdCB0ZXN0cywgc2luY2Ugc29tZSBvZiB0aGVtIGNvbXBhcmUgY3VycmVudCByZXN1bHRzIHRvIHByZXZpb3VzCi0JCS8vIHJlc3VsdHMuCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSAiWyIgKyBnZXRTdGFydCgpICsgIiwgIiArIGdldEVuZCgpICsgIl0gKCIgKyBnZXRUZXh0KCkgKyAiKSI7IC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRG93blN0cmVhbVJlZ2lvbnMoSVRleHRSZWdpb24gY2hhbmdlZFJlZ2lvbiwgaW50IGxlbmd0aERpZmZlcmVuY2UpIHsKLQkJaW50IGxpc3RMZW5ndGggPSBfZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkvLyBmaXJzdCwgbG9vcCB0aHJvdWdoIHRvIGZpbmQgaW5kZXggb2Ygd2hlcmUgdG8gc3RhcnQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TGVuZ3RoOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IF9nZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbiA9PSBjaGFuZ2VkUmVnaW9uKSB7Ci0JCQkJc3RhcnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gbm93LCBiZWdpbm5pbmcgb25lIHBhc3QgdGhlIG9uZSB0aGF0IHdhcyBjaGFuZ2VkLCBsb29wCi0JCS8vIHRocm91Z2ggdG8gZW5kIG9mIGxpc3QsIGFkanVzdGluZyB0aGUgc3RhcnQgcG9zdGlvbnMuCi0JCXN0YXJ0SW5kZXgrKzsKLQkJZm9yIChpbnQgaiA9IHN0YXJ0SW5kZXg7IGogPCBsaXN0TGVuZ3RoOyBqKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IF9nZXRSZWdpb25zKCkuZ2V0KGopOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KGxlbmd0aERpZmZlcmVuY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQkvLyBHZXQgdGhlIHJlZ2lvbiBwb2ludGVkIHRvIGJ5IHRoZSByZXF1ZXN0U3RhcnQgcG9zdGlvbiwgYW5kIGdpdmUKLQkJLy8gdGhhdCByZWdpb24gYSBjaGFuY2UgdG8gZWZmZWN0Ci0JCS8vIHRoZSB1cGRhdGUuCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHJlcXVlc3RTdGFydCk7Ci0JCS8vIGlmIHRoZXJlIGlzIG5vIHJlZ2lvbiwgdGhlbiB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgbXVzdCBjb21lIHJpZ2h0Ci0JCS8vIGFmdGVyIHRoZQotCQkvLyBub2RlIChhbmQgcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgcmVnaW9uKS4gVGhpcyBoYXBwZW5zLCBmb3IgZXhhbXBsZSwKLQkJLy8gd2hlbiBzb21lb25lCi0JCS8vIHR5cGVzIHNvbWV0aGluZyBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCwgb3IgbW9yZSBjb21tb25seSwgd2hlbgotCQkvLyB0aGV5IGFyZSByaWdodAotCQkvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIG9uZSBub2RlLCBhbmQgdGhlIGRpcnR5IHN0YXJ0IGlzIHRoZXJlZm9yZQotCQkvLyBjYWxjdWxhdGVkIHRvIGJlIHRoZQotCQkvLyBwcmV2aW91cyBub2RlLgotCQkvLyBTbywgaW4gdGhpcyBjYXNlLCB3ZSdsbCBnaXZlIHRoZSBsYXN0IHJlZ2lvbiBhIGNoYW5jZSB0byBzZWUgaWYgaXQKLQkJLy8gd2FudHMgdG8KLQkJLy8gc3dhbGxvdyB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgLS0gYnV0IG9ubHkgZm9yIGluc2VydHMgLS0gZGVsZXRlcwotCQkvLyBhbmQgInJlcGxhY2VzIgotCQkvLyBzaG91bGQgYmUgcmVwYXJzZWQgaWYgdGhleSBhcmUgaW4gdGhlc2UgYm9yZGVyIHJlZ2lvbnMsIGFuZCBvbmx5IGlmCi0JCS8vIHRoZQotCQlpZiAoKHJlZ2lvbiA9PSBudWxsKSAmJiAobGVuZ3RoVG9SZXBsYWNlID09IDApKSB7Ci0JCQlyZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChfZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCQkJLy8gbWFrZSBzdXJlIHRoZSByZWdpb24gaXMgY29udGlndW91cwotCQkJaWYgKGdldEVuZE9mZnNldChyZWdpb24pID09IHJlcXVlc3RTdGFydCkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbi51cGRhdGVSZWdpb24ocmVxdWVzdGVyLCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkvLwotCQkJCS8vIElmIHRoZSByZXF1ZXN0ZWQgY2hhbmdlIHNwYW5zIG1vcmUgdGhhbiBvbmUgcmVnaW9uLCB0aGVuCi0JCQkJLy8gd2UgZG9uJ3QgZ2l2ZSB0aGUgcmVnaW9uIGEgY2hhbmNlIHRvIHVwZGF0ZS4KLQkJCQlpZiAoKGNvbnRhaW5zT2Zmc2V0KHJlZ2lvbiwgcmVxdWVzdFN0YXJ0KSkgJiYgKGNvbnRhaW5zT2Zmc2V0KHJlZ2lvbiwgcmVxdWVzdFN0YXJ0ICsgbGVuZ3RoVG9SZXBsYWNlKSkpIHsKLQkJCQkJcmVzdWx0ID0gcmVnaW9uLnVwZGF0ZVJlZ2lvbihyZXF1ZXN0ZXIsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgcmVzdWx0IGlzIG5vdCBudWxsLCB0aGVuIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzdGFydCBhbmQgZW5kCi0JCS8vIHBvc3Rpb25zIG9mIHRoZSByZWdpb25zIHRoYXQgZm9sbG93IHRoaXMgb25lCi0JCS8vIGlmIHJlc3VsdCBpcyBudWxsLCB0aGVuIGFwcGx5IHRoZSBmbGF0bm9kZSBzcGVjaWZpYyBjaGVja3Mgb24gd2hhdAotCQkvLyBpdCBjYW4gY2hhbmdlCi0JCS8vIChpLmUuIG1vcmUgdGhhbiBvbmUgcmVnaW9uLCBidXQgbm8gY2hhbmdlIHRvIHRoZSBub2RlIGl0c2VsZikKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkvLyBUaGF0IGlzLCBhIHJlZ2lvbiBkZWNpZGVkIGl0IGNvdWxkIGhhbmRsZSB0aGUgY2hhbmdlIGFuZAotCQkJLy8gY3JlYXRlZAotCQkJLy8gYSByZWdpb24gY2hhbmdlZCBldmVudC4KLQkJCUFzc2VydC5pc1RydWUocmVzdWx0IGluc3RhbmNlb2YgUmVnaW9uQ2hhbmdlZEV2ZW50LCAiUHJvZ3JhbSBFcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCQl1cGRhdGVEb3duU3RyZWFtUmVnaW9ucygoKFJlZ2lvbkNoYW5nZWRFdmVudCkgcmVzdWx0KS5nZXRSZWdpb24oKSwgbGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkvLyBQTFVTLCB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgb3duIG5vZGUgZW5kIHBvaW50IChsZW5ndGgpCi0JCQlzZXRMZW5ndGgoZ2V0TGVuZ3RoKCkgKyBsZW5ndGhEaWZmZXJlbmNlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ2hhclNlcXVlbmNlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ2hhclNlcXVlbmNlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjI5YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NoYXJTZXF1ZW5jZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgQ2hhclNlcXVlbmNlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQlwcml2YXRlIGludCBmQ3VycmVudFBvc2l0aW9uOwotCXByaXZhdGUgaW50IGZNYXhpbXVtUmVhZE9mZnNldDsKLQotCXByaXZhdGUgQ2hhclNlcXVlbmNlIGZPcmlnaW5hbFNvdXJjZTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlDaGFyU2VxdWVuY2VSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgQ2hhclNlcXVlbmNlUmVhZGVyKENoYXJTZXF1ZW5jZSBvcmlnaW5hbFNvdXJjZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkvLyBJU1NVRTogc2hvdWxkIHdlICJmYWlsIGZhc3QiIGlmIHJlcXVlc3RlZCBsZW5ndGggaXMgbW9yZSB0aGFuIHRoZXJlCi0JCS8vIGlzPwotCQlmT3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbFNvdXJjZTsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotCQlpbnQgbWF4UmVxdWVzdGVkT2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBsZW5ndGg7Ci0JCWludCBtYXhQb3NzaWJsZU9mZnNldCA9IDAgKyBvcmlnaW5hbFNvdXJjZS5sZW5ndGgoKTsKLQkJZk1heGltdW1SZWFkT2Zmc2V0ID0gTWF0aC5taW4obWF4UmVxdWVzdGVkT2Zmc2V0LCBtYXhQb3NzaWJsZU9mZnNldCk7Ci0KLQkJZkN1cnJlbnRQb3NpdGlvbiA9IHN0YXJ0T2Zmc2V0OwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvY2tPYmplY3QKLQkgKi8KLQlDaGFyU2VxdWVuY2VSZWFkZXIoT2JqZWN0IGxvY2tPYmplY3QpIHsKLQkJc3VwZXIobG9ja09iamVjdCk7Ci0JCS8vIGZvciB0aHJlYWQgc2FmZXR5LCBtYXkgbmVlZCB0byBhZGQgYmFjayBsb2NraW5nIG1lY2hhbmlzbQotCQkvLyBpbiBvdXIgY3VzdG9tIGNvbnN0cnVjdG9yLiBUaGlzIGNvbnN0cnVjdG9yIGxlZnQgaGVyZSBqdXN0Ci0JCS8vIGZvciBhIHJlbWluZGVyLgotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZyB0byBkbyB3aGVuIHdlIGNsb3NlCi0JCS8vIChtYXkgYmUgdG8gZXZlbnR1YWxseSAidW5sb2NrIiBvciBudWxsIG91dCBzb21lIHZhcmlibGVzCi0JCS8vIGp1c3QgZm9yIGh5Z2VuZS4KLQkJLy8gb3IsIHBlcmhhcHMgaWYgYWxyZWFkeSBjbG9zZWQgb25jZSB0aHJvdyBJT0V4Y2VwdGlvbj8gZm9yCi0JCS8vIGNvbnNpc3RlbmN5PwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3JpZ2luYWxTb3VyY2UuCi0JICogQGRlcHJlY2F0ZWQgLSBvbmx5IHRlbXBvcmFyaWx5IHB1YmxpYywgc2hvdWxkIGJlICdkZWZhdWx0JyBldmVudHVhbGx5Ci0JICogICAgICAgICAgICAgb3IgZ28gYXdheSBhbHRvZ2V0aGVyLgotCSAqLwotCXB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0T3JpZ2luYWxTb3VyY2UoKSB7Ci0JCXJldHVybiBmT3JpZ2luYWxTb3VyY2U7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWlmIChmQ3VycmVudFBvc2l0aW9uIDwgZk1heGltdW1SZWFkT2Zmc2V0KSB7Ci0JCQlyZXN1bHQgPSBmT3JpZ2luYWxTb3VyY2UuY2hhckF0KGZDdXJyZW50UG9zaXRpb24rKyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkIGNoYXJhY3RlcnMgaW50byBhIHBvcnRpb24gb2YgYW4gYXJyYXkuIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sKLQkgKiB1bnRpbCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUKLQkgKiBzdHJlYW0gaXMgcmVhY2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY2J1ZgotCSAqICAgICAgICAgICAgRGVzdGluYXRpb24gYnVmZmVyCi0JICogQHBhcmFtIG9mZgotCSAqICAgICAgICAgICAgT2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHN0b3JpbmcgY2hhcmFjdGVycwotCSAqIEBwYXJhbSBsZW4KLQkgKiAgICAgICAgICAgIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZAotCSAqIAotCSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQotCSAqICAgICAgICAgaGFzIGJlZW4gcmVhY2hlZAotCSAqIAotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0JICovCi0KLQlwdWJsaWMgaW50IHJlYWQoY2hhcltdIGNidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjaGFyc1RvUmVhZCA9IC0xOwotCQkvLyBpZiBhbHJlYWR5IG92ZXIgbWF4LCBqdXN0IHJldHVybiAtMQotCQkvLyByZW1lbWJlciwgY3VycmVudFBvc2l0aW9uIGlzIHdoYXQgaXMgZ2V0dGluZyByZWFkeSB0byBiZSByZWFkCi0JCS8vICh0aGF0IGlzLCBpdHMgYWxyZWFkeSBiZWVuIGluY3JlbWVudGVkIGluIHJlYWQoKSkuCi0JCWlmIChmQ3VycmVudFBvc2l0aW9uIDwgZk1heGltdW1SZWFkT2Zmc2V0KSB7Ci0KLQotCQkJaW50IGJ1ZmZNYXhUb1JlYWQgPSBjYnVmLmxlbmd0aCAtIG9mZjsKLQkJCWludCBtaW5SZXF1ZXN0ZWQgPSBNYXRoLm1pbihidWZmTWF4VG9SZWFkLCBsZW4pOwotCQkJaW50IGxlbmd0aFJlbWFpbmluZyA9IGZNYXhpbXVtUmVhZE9mZnNldCAtIGZDdXJyZW50UG9zaXRpb247Ci0JCQljaGFyc1RvUmVhZCA9IE1hdGgubWluKG1pblJlcXVlc3RlZCwgbGVuZ3RoUmVtYWluaW5nKTsKLQotCi0JCQlDaGFyU2VxdWVuY2Ugc2VxID0gZk9yaWdpbmFsU291cmNlLnN1YlNlcXVlbmNlKGZDdXJyZW50UG9zaXRpb24sIGZDdXJyZW50UG9zaXRpb24gKyBjaGFyc1RvUmVhZCk7Ci0JCQkvLyBmb3Igbm93LCBoYXJkIGFzc3VtcHRpb24gdGhhdCBvcmlnaW5hbCBpcyBhIFN0cmluZyBzaW5jZSBzb3VyY2UKLQkJCS8vIGlzIGFzc3VtZWQgdG8gYmUgZG9jdW1lbnQsIG9yIHRleHQgc3RvcmUKLQkJCVN0cmluZyBzZXFTdHJpbmcgPSAoU3RyaW5nKSBzZXE7Ci0JCQlzZXFTdHJpbmcuZ2V0Q2hhcnMoMCwgc2VxU3RyaW5nLmxlbmd0aCgpLCBjYnVmLCBvZmYpOwotCi0KLQotCQkJZkN1cnJlbnRQb3NpdGlvbiA9IGZDdXJyZW50UG9zaXRpb24gKyBjaGFyc1RvUmVhZDsKLQotCi0JCX0KLQkJcmV0dXJuIGNoYXJzVG9SZWFkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Db3JlTm9kZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Db3JlTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjZDkyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ29yZU5vZGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENvcmVOb2RlTGlzdCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IHsKLQlpbnQgY291bnRlZExlbmd0aDsKLQlpbnQgY3VycmVudEluZGV4ID0gLTE7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZmxhdE5vZGVzOwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZDsKLQotCS8qKgotCSAqIENvcmVOb2RlTGlzdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb3JlTm9kZUxpc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIGNyZWF0ZSBhbiBhcnJheSwgZXZlbiBpZiB6ZXJvIGxlbmd0aAotCQlmbGF0Tm9kZXMgPSBuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblswXTsKLQl9Ci0KLQlwdWJsaWMgQ29yZU5vZGVMaXN0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3SGVhZCkgewotCQlzdXBlcigpOwotCQkvLyBzYXZlIGhlYWQKLQkJaGVhZCA9IG5ld0hlYWQ7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gbmV3SGVhZDsKLQkJLy8gd2UgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZSBsaXN0IG9uY2UsIHRvIGdldCBpdHMKLQkJLy8gbGVuZ3RoIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgYXJyYXkKLQkJd2hpbGUgKGNvdW50Tm9kZSAhPSBudWxsKSB7Ci0JCQljb3VudCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQkvLyBjcmVhdGUgYW4gYXJyYXksIGV2ZW4gaWYgemVybyBsZW5ndGgKLQkJZmxhdE5vZGVzID0gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bY291bnRdOwotCQkvLyBzdGFydCBjb3VudE5vZGUgb3ZlciBhZ2Fpbiwgc28gdG8gc3BlYWsuCi0JCWNvdW50Tm9kZSA9IG5ld0hlYWQ7Ci0JCWNvdW50ID0gMDsKLQkJd2hpbGUgKGNvdW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlmbGF0Tm9kZXNbY291bnQrK10gPSBjb3VudE5vZGU7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChjb3VudCA+IDApIHsKLQkJCWN1cnJlbnRJbmRleCA9IDA7Ci0JCQkvLyBlbHNlIGl0IHN0YXlzIGF0IC0xIGluaXRpYWxpemVkIGF0IG9iamVjdCBjcmVhdGlvbgotCQkJLy8KLQkJCS8vIHNhdmUgbGVuZ3RoCi0JCQljb3VudGVkTGVuZ3RoID0gY291bnQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29yZU5vZGVMaXN0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIHNhdmUgaGVhZAotCQloZWFkID0gc3RhcnQ7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gc3RhcnQ7Ci0JCWlmICgoc3RhcnQgPT0gbnVsbCkgfHwgKGVuZCA9PSBudWxsKSkgewotCQkJLy8gZXJyb3IgY29uZGl0aW9uCi0JCQkvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3QgcHJvdmlkZSBzdGFydCBhbmQgZW5kCi0JCQkvLyBub2RlcyB0byBjb25zdHJ1Y3QgQ29yZU5vZGVMaXN0Iik7Ci0JCX0gZWxzZSB7Ci0JCQljb3VudCA9IDE7Ci0JCQl3aGlsZSAoKGNvdW50Tm9kZSAhPSBudWxsKSAmJiAoY291bnROb2RlICE9IGVuZCkpIHsKLQkJCQljb3VudCsrOwotCQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgZW5kZWQgYmVjYXVzZSB0aGUgbGFzdCBvbmUgd2FzIG51bGwsCi0JCS8vIGJhY2t1cCBvbmUuCi0JCWlmIChjb3VudE5vZGUgPT0gbnVsbCkKLQkJCWNvdW50LS07Ci0JCWlmIChjb3VudCA8IDApIHsKLQkJCWNvdW50ID0gMDsKLQkJfQotCQlmbGF0Tm9kZXMgPSBuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltjb3VudF07Ci0JCWlmIChjb3VudCA+IDApIHsKLQkJCWZsYXROb2Rlc1swXSA9IGNvdW50Tm9kZSA9IHN0YXJ0OwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJZmxhdE5vZGVzW2ldID0gZmxhdE5vZGVzW2kgLSAxXS5nZXROZXh0KCk7Ci0JCQl9Ci0KLQkJfQotCQljdXJyZW50SW5kZXggPSAwOwotCQljb3VudGVkTGVuZ3RoID0gY291bnQ7Ci0JfQotCi0JcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiByZXN1bHQgPSBudWxsOwotCQlpZiAoKGZsYXROb2RlcyAhPSBudWxsKSAmJiAoZmxhdE5vZGVzLmxlbmd0aCA+IDApKQotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uKGZsYXROb2Rlc1swXSwgZmxhdE5vZGVzW2ZsYXROb2Rlcy5sZW5ndGggLSAxXSk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbihudWxsKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZsYXROb2Rlcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXMoT2JqZWN0IG8pIHsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYXROb2Rlcy5sZW5ndGg7IGkrKykKLQkJCWlmIChmbGF0Tm9kZXNbaV0gPT0gbykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGl0ZW0oaW50IGkpIHsKLQkJcmV0dXJuIGZsYXROb2Rlc1tpXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvRGVsZXRlRXF1YWxQb3NpdGlvblVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9EZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM3ODNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9EZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdFBvc2l0aW9uVXBkYXRlcjsKLQotLyoqCi0gKiBGb2xsb3dzIHRoZSBiZWhhdmlvciBvZiBEZWZhdWx0UG9zaXRpb25VcGRhdGVyIGV4Y2VwdCBpbiBhZGRpdGlvbiB0bwotICogZGVsZXRpbmcvb3ZlcndyaXRpbmcgdGV4dCB3aGljaCBjb21wbGV0ZWx5IGNvbnRhaW5zIHRoZSBwb3NpdGlvbiBkZWxldGVzCi0gKiB0aGUgcG9zaXRpb24sIGRlbGV0aW5nIHRleHQgdGhhdCBlcXVhbHMgdGhlIHRleHQgaW4gcG9zaXRpb24gYWxzbyBkZWxldGVzCi0gKiB0aGUgcG9zaXRpb24uCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlciBleHRlbmRzIERlZmF1bHRQb3NpdGlvblVwZGF0ZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICovCi0JcHVibGljIERlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyKFN0cmluZyBjYXRlZ29yeSkgewotCQlzdXBlcihjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50bHkgaW52ZXN0aWdhdGVkIHBvc2l0aW9uIGhhcyBiZWVuIGRlbGV0ZWQKLQkgKiBieSB0aGUgcmVwbGFjZSBvcGVyYXRpb24gc3BlY2lmaWVkIGluIHRoZSBjdXJyZW50IGV2ZW50LiBJZiBzbywgaXQKLQkgKiBkZWxldGVzIHRoZSBwb3NpdGlvbiBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBkb2N1bWVudCdzIHBvc2l0aW9uCi0JICogY2F0ZWdvcnkuCi0JICogCi0JICogTk9URTogcG9zaXRpb24gaXMgZGVsZXRlZCBpZiBjdXJyZW50IGV2ZW50IGNvbXBsZXRlbHkgb3ZlcndyaXRlcwotCSAqIHBvc2l0aW9uIE9SIGlmIGN1cnJlbnQgZXZlbnQgZGVsZXRlcyB0aGUgYXJlYSBzdXJyb3VuZGluZy9pbmNsdWRpbmcgdGhlCi0JICogcG9zaXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBvc2l0aW9uIGhhcyBiZWVuIGRlbGV0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3REZWxldGVkKCkgewotCQkvLyBwb3NpdGlvbiBpcyBkZWxldGVkIGlmIGN1cnJlbnQgZXZlbnQgY29tcGxldGVseSBvdmVyd3JpdGVzIHBvc2l0aW9uCi0JCS8vIE9SIGlmCi0JCS8vIGN1cnJlbnQgZXZlbnQgZGVsZXRlcyB0aGUgYXJlYSBzdXJyb3VuZGluZy9pbmNsdWRpbmcgdGhlIHBvc2l0aW9uCi0JCWlmICgoZk9mZnNldCA8IGZQb3NpdGlvbi5vZmZzZXQgJiYgKGZQb3NpdGlvbi5vZmZzZXQgKyBmUG9zaXRpb24ubGVuZ3RoIDwgZk9mZnNldCArIGZMZW5ndGgpKSB8fCAoZk9mZnNldCA8PSBmUG9zaXRpb24ub2Zmc2V0ICYmIChmUG9zaXRpb24ub2Zmc2V0ICsgZlBvc2l0aW9uLmxlbmd0aCA8PSBmT2Zmc2V0ICsgZkxlbmd0aCkgJiYgZlJlcGxhY2VMZW5ndGggPT0gMCkpIHsKLQotCQkJZlBvc2l0aW9uLmRlbGV0ZSgpOwotCi0JCQl0cnkgewotCQkJCWZEb2N1bWVudC5yZW1vdmVQb3NpdGlvbihnZXRDYXRlZ29yeSgpLCBmUG9zaXRpb24pOwotCQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB4KSB7Ci0JCQl9Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0dlbmVyaWNQb3NpdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9HZW5lcmljUG9zaXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNDIyYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0dlbmVyaWNQb3NpdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRQb3NpdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotLyoqCi0gKiBCYXNlZCBvbiB0aGUgUG9zaXRpb24gbWFuYWdlbWVudCBtZXRob2RzIGZyb20KLSAqIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQWJzdHJhY3REb2N1bWVudAotICovCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljUG9zaXRpb25NYW5hZ2VyIHsKLQlwcml2YXRlIENoYXJTZXF1ZW5jZSBmQ2hhclNlcXVlbmNlOwotCi0KLQotCXByaXZhdGUgTWFwIGZQb3NpdGlvbnM7Ci0JLyoqIEFsbCByZWdpc3RlcmVkIGRvY3VtZW50IHBvc2l0aW9uIHVwZGF0ZXJzICovCi0JcHJpdmF0ZSBMaXN0IGZQb3NpdGlvblVwZGF0ZXJzOwotCi0JLyoqCi0JICogZG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRoIG91dCBkb2N1bWVudCBwb2ludGVyCi0JICogCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljUG9zaXRpb25NYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBHZW5lcmljUG9zaXRpb25NYW5hZ2VyKENoYXJTZXF1ZW5jZSBjaGFyU2VxdWVuY2UpIHsKLQkJdGhpcygpOwotCQkvLyB3ZSBvbmx5IHVzZSBjaGFyU2VxdWVuY2UgZm9yICJsZW5ndGgiLCB0bwotCQkvLyBtYWRlIG1vcmUgZ2VuZXJpYyB0aGFuICJkb2N1bWVudCIgZXZlbiAidGV4dCBzdG9yZSIKLQkJZkNoYXJTZXF1ZW5jZSA9IGNoYXJTZXF1ZW5jZTsKLQkJY29tcGxldGVJbml0aWFsaXphdGlvbigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGRQb3NpdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJYWRkUG9zaXRpb24oSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlksIHBvc2l0aW9uKTsKLQkJfQotCQljYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2FkZFBvc2l0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCi0JCWlmICgoMCA+IHBvc2l0aW9uLm9mZnNldCkgfHwgKDAgPiBwb3NpdGlvbi5sZW5ndGgpIHx8IChwb3NpdGlvbi5vZmZzZXQgKyBwb3NpdGlvbi5sZW5ndGggPiBnZXREb2N1bWVudExlbmd0aCgpKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24oKTsKLQotCQlMaXN0IGxpc3QgPSAoTGlzdCkgZlBvc2l0aW9ucy5nZXQoY2F0ZWdvcnkpOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24oKTsKLQotCQlsaXN0LmFkZChjb21wdXRlSW5kZXhJblBvc2l0aW9uTGlzdChsaXN0LCBwb3NpdGlvbi5vZmZzZXQpLCBwb3NpdGlvbik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2FkZFBvc2l0aW9uQ2F0ZWdvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghY29udGFpbnNQb3NpdGlvbkNhdGVnb3J5KGNhdGVnb3J5KSkKLQkJCWZQb3NpdGlvbnMucHV0KGNhdGVnb3J5LCBuZXcgQXJyYXlMaXN0KCkpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGRQb3NpdGlvblVwZGF0ZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUG9zaXRpb25VcGRhdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJaW5zZXJ0UG9zaXRpb25VcGRhdGVyKHVwZGF0ZXIsIGZQb3NpdGlvblVwZGF0ZXJzLnNpemUoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkb2N1bWVudCBsaXN0ZW5lcnMsIHBvc2l0aW9ucywgYW5kIHBvc2l0aW9uIHVwZGF0ZXJzLiBNdXN0Ci0JICogYmUgY2FsbGVkIGluc2lkZSB0aGUgY29uc3RydWN0b3IgYWZ0ZXIgdGhlIGltcGxlbWVudGF0aW9uIHBsdWctaW5zIGhhdmUKLQkgKiBiZWVuIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wbGV0ZUluaXRpYWxpemF0aW9uKCkgewotCi0JCWZQb3NpdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlmUG9zaXRpb25VcGRhdGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlhZGRQb3NpdGlvbkNhdGVnb3J5KElEb2N1bWVudC5ERUZBVUxUX0NBVEVHT1JZKTsKLQkJYWRkUG9zaXRpb25VcGRhdGVyKG5ldyBEZWZhdWx0UG9zaXRpb25VcGRhdGVyKElEb2N1bWVudC5ERUZBVUxUX0NBVEVHT1JZKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2NvbXB1dGVJbmRleEluQ2F0ZWdvcnkoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXB1dGVJbmRleEluQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5LCBpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCi0JCWlmICgwID4gb2Zmc2V0IHx8IG9mZnNldCA+IGdldERvY3VtZW50TGVuZ3RoKCkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQotCQlMaXN0IGMgPSAoTGlzdCkgZlBvc2l0aW9ucy5nZXQoY2F0ZWdvcnkpOwotCQlpZiAoYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24oKTsKLQotCQlyZXR1cm4gY29tcHV0ZUluZGV4SW5Qb3NpdGlvbkxpc3QoYywgb2Zmc2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBpbmRleCBpbiB0aGUgbGlzdCBvZiBwb3NpdGlvbnMgYXQgd2hpY2ggYSBwb3NpdGlvbiB3aXRoCi0JICogdGhlIGdpdmVuIG9mZnNldCB3b3VsZCBiZSBpbnNlcnRlZC4gVGhlIHBvc2l0aW9uIGlzIHN1cHBvc2VkIHRvIGJlY29tZQotCSAqIHRoZSBmaXJzdCBpbiB0aGlzIGxpc3Qgb2YgYWxsIHBvc2l0aW9ucyB3aXRoIHRoZSBzYW1lIG9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb25zCi0JICogICAgICAgICAgICB0aGUgbGlzdCBpbiB3aGljaCB0aGUgaW5kZXggaXMgY29tcHV0ZWQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IGZvciB3aGljaCB0aGUgaW5kZXggaXMgY29tcHV0ZWQKLQkgKiBAcmV0dXJuIHRoZSBjb21wdXRlZCBpbmRleAotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50I2NvbXB1dGVJbmRleEluQ2F0ZWdvcnkoU3RyaW5nLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBpbnQgY29tcHV0ZUluZGV4SW5Qb3NpdGlvbkxpc3QoTGlzdCBwb3NpdGlvbnMsIGludCBvZmZzZXQpIHsKLQotCQlpZiAocG9zaXRpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0KLQkJaW50IGxlZnQgPSAwOwotCQlpbnQgcmlnaHQgPSBwb3NpdGlvbnMuc2l6ZSgpIC0gMTsKLQkJaW50IG1pZCA9IDA7Ci0JCVBvc2l0aW9uIHAgPSBudWxsOwotCi0JCXdoaWxlIChsZWZ0IDwgcmlnaHQpIHsKLQotCQkJbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOwotCi0JCQlwID0gKFBvc2l0aW9uKSBwb3NpdGlvbnMuZ2V0KG1pZCk7Ci0JCQlpZiAob2Zmc2V0IDwgcC5nZXRPZmZzZXQoKSkgewotCQkJCWlmIChsZWZ0ID09IG1pZCkKLQkJCQkJcmlnaHQgPSBsZWZ0OwotCQkJCWVsc2UKLQkJCQkJcmlnaHQgPSBtaWQgLSAxOwotCQkJfQotCQkJZWxzZSBpZiAob2Zmc2V0ID4gcC5nZXRPZmZzZXQoKSkgewotCQkJCWlmIChyaWdodCA9PSBtaWQpCi0JCQkJCWxlZnQgPSByaWdodDsKLQkJCQllbHNlCi0JCQkJCWxlZnQgPSBtaWQgKyAxOwotCQkJfQotCQkJZWxzZSBpZiAob2Zmc2V0ID09IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCQlsZWZ0ID0gcmlnaHQgPSBtaWQ7Ci0JCQl9Ci0KLQkJfQotCi0JCWludCBwb3MgPSBsZWZ0OwotCQlwID0gKFBvc2l0aW9uKSBwb3NpdGlvbnMuZ2V0KHBvcyk7Ci0JCWlmIChvZmZzZXQgPiBwLmdldE9mZnNldCgpKSB7Ci0JCQkvLyBhcHBlbmQgdG8gdGhlIGVuZAotCQkJcG9zKys7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBlbnRyeSB3aWxsIGJlY2FtZSB0aGUgZmlyc3Qgb2YgYWxsIGVudHJpZXMgd2l0aCB0aGUgc2FtZQotCQkJLy8gb2Zmc2V0Ci0JCQlkbyB7Ci0JCQkJLS1wb3M7Ci0JCQkJaWYgKHBvcyA8IDApCi0JCQkJCWJyZWFrOwotCQkJCXAgPSAoUG9zaXRpb24pIHBvc2l0aW9ucy5nZXQocG9zKTsKLQkJCX0KLQkJCXdoaWxlIChvZmZzZXQgPT0gcC5nZXRPZmZzZXQoKSk7Ci0JCQkrK3BvczsKLQkJfQotCi0JCUFzc2VydC5pc1RydWUoMCA8PSBwb3MgJiYgcG9zIDw9IHBvc2l0aW9ucy5zaXplKCkpOwotCi0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2NvbnRhaW5zUG9zaXRpb24oamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTGlzdCBsaXN0ID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWludCBpbmRleCA9IGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KGxpc3QsIG9mZnNldCk7Ci0JCWlmIChpbmRleCA8IHNpemUpIHsKLQkJCVBvc2l0aW9uIHAgPSAoUG9zaXRpb24pIGxpc3QuZ2V0KGluZGV4KTsKLQkJCXdoaWxlIChwICE9IG51bGwgJiYgcC5vZmZzZXQgPT0gb2Zmc2V0KSB7Ci0JCQkJaWYgKHAubGVuZ3RoID09IGxlbmd0aCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJKytpbmRleDsKLQkJCQlwID0gKGluZGV4IDwgc2l6ZSkgPyAoUG9zaXRpb24pIGxpc3QuZ2V0KGluZGV4KSA6IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2NvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKGNhdGVnb3J5ICE9IG51bGwpCi0JCQlyZXR1cm4gZlBvc2l0aW9ucy5jb250YWluc0tleShjYXRlZ29yeSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCi0JcHVibGljIGludCBnZXREb2N1bWVudExlbmd0aCgpIHsKLQkJcmV0dXJuIGZDaGFyU2VxdWVuY2UubGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgcG9zaXRpb25zIG1hbmFnZWQgYnkgdGhlIGRvY3VtZW50IGdyb3VwZWQgYnkgY2F0ZWdvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZG9jdW1lbnQncyBwb3NpdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldERvY3VtZW50TWFuYWdlZFBvc2l0aW9ucygpIHsKLQkJcmV0dXJuIGZQb3NpdGlvbnM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2dldFBvc2l0aW9uQ2F0ZWdvcmllcygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBvc2l0aW9uQ2F0ZWdvcmllcygpIHsKLQkJU3RyaW5nW10gY2F0ZWdvcmllcyA9IG5ldyBTdHJpbmdbZlBvc2l0aW9ucy5zaXplKCldOwotCQlJdGVyYXRvciBrZXlzID0gZlBvc2l0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspCi0JCQljYXRlZ29yaWVzW2ldID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCXJldHVybiBjYXRlZ29yaWVzOwotCX0KLQotCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0UG9zaXRpb25zKFN0cmluZyBjYXRlZ29yeSkgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24oKTsKLQotCQlMaXN0IGMgPSAoTGlzdCkgZlBvc2l0aW9ucy5nZXQoY2F0ZWdvcnkpOwotCQlpZiAoYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24oKTsKLQotCQlQb3NpdGlvbltdIHBvc2l0aW9ucyA9IG5ldyBQb3NpdGlvbltjLnNpemUoKV07Ci0JCWMudG9BcnJheShwb3NpdGlvbnMpOwotCQlyZXR1cm4gcG9zaXRpb25zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNnZXRQb3NpdGlvblVwZGF0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgSVBvc2l0aW9uVXBkYXRlcltdIGdldFBvc2l0aW9uVXBkYXRlcnMoKSB7Ci0JCUlQb3NpdGlvblVwZGF0ZXJbXSB1cGRhdGVycyA9IG5ldyBJUG9zaXRpb25VcGRhdGVyW2ZQb3NpdGlvblVwZGF0ZXJzLnNpemUoKV07Ci0JCWZQb3NpdGlvblVwZGF0ZXJzLnRvQXJyYXkodXBkYXRlcnMpOwotCQlyZXR1cm4gdXBkYXRlcnM7Ci0JfQotCi0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNpbnNlcnRQb3NpdGlvblVwZGF0ZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUG9zaXRpb25VcGRhdGVyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbnNlcnRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyLCBpbnQgaW5kZXgpIHsKLQotCQlmb3IgKGludCBpID0gZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChmUG9zaXRpb25VcGRhdGVycy5nZXQoaSkgPT0gdXBkYXRlcikKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaW5kZXggPT0gZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpKQotCQkJZlBvc2l0aW9uVXBkYXRlcnMuYWRkKHVwZGF0ZXIpOwotCQllbHNlCi0JCQlmUG9zaXRpb25VcGRhdGVycy5hZGQoaW5kZXgsIHVwZGF0ZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlyZW1vdmVQb3NpdGlvbihJRG9jdW1lbnQuREVGQVVMVF9DQVRFR09SWSwgcG9zaXRpb24pOwotCQl9Ci0JCWNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCi0JCWlmIChwb3NpdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24oKTsKLQotCQlMaXN0IGMgPSAoTGlzdCkgZlBvc2l0aW9ucy5nZXQoY2F0ZWdvcnkpOwotCQlpZiAoYyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24oKTsKLQotCQkvLyByZW1vdmUgYmFzZWQgb24gaWRlbnRpdHkgbm90IGVxdWFsaXR5Ci0JCWludCBzaXplID0gYy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAocG9zaXRpb24gPT0gYy5nZXQoaSkpIHsKLQkJCQljLnJlbW92ZShpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25DYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoY2F0ZWdvcnkpKQotCQkJdGhyb3cgbmV3IEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24oKTsKLQotCQlmUG9zaXRpb25zLnJlbW92ZShjYXRlZ29yeSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uVXBkYXRlcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXIpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJZm9yIChpbnQgaSA9IGZQb3NpdGlvblVwZGF0ZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoZlBvc2l0aW9uVXBkYXRlcnMuZ2V0KGkpID09IHVwZGF0ZXIpIHsKLQkJCQlmUG9zaXRpb25VcGRhdGVycy5yZW1vdmUoaSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBVcGRhdGVzIGFsbCBwb3NpdGlvbnMgb2YgYWxsIGNhdGVnb3JpZXMgdG8gdGhlIGNoYW5nZSBkZXNjcmliZWQgYnkgdGhlCi0JICogZG9jdW1lbnQgZXZlbnQuIEFsbCByZWdpc3RlcmVkIGRvY3VtZW50IHVwZGF0ZXJzIGFyZSBjYWxsZWQgaW4gdGhlCi0JICogc2VxdWVuY2UgdGhleSBoYXZlIGJlZW4gYXJyYW5nZWQuIFVzZXMgYSByb2J1c3QgaXRlcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgZXZlbnQgZGVzY3JpYmluZyB0aGUgY2hhbmdlIHRvIHdoaWNoIHRvIGFkYXB0Ci0JICogICAgICAgICAgICB0aGUgcG9zaXRpb25zCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZVBvc2l0aW9ucyhEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZlBvc2l0aW9uVXBkYXRlcnMpOwotCQlJdGVyYXRvciBlID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlQb3NpdGlvblVwZGF0ZXIgdSA9IChJUG9zaXRpb25VcGRhdGVyKSBlLm5leHQoKTsKLQkJCXUudXBkYXRlKGV2ZW50KTsKLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSUV4ZWN1dGlvbkRlbGVnYXRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSUV4ZWN1dGlvbkRlbGVnYXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZWQyNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lFeGVjdXRpb25EZWxlZ2F0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLklFeGVjdXRpb25EZWxlZ2F0ZTsKLQotcHVibGljIGludGVyZmFjZSBJRXhlY3V0aW9uRGVsZWdhdGFibGUgewotCi0Jdm9pZCBzZXRFeGVjdXRpb25EZWxlZ2F0ZShJRXhlY3V0aW9uRGVsZWdhdGUgZXhlY3V0aW9uRGVsZWdhdGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lSZWdpb25Db21wYXJpYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSVJlZ2lvbkNvbXBhcmlibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzMDQzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSVJlZ2lvbkNvbXBhcmlibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZ2lvbkNvbXBhcmlibGUgewotCWJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKTsKLQotCWJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjgyZDI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRXhlY3V0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLklMb2NrYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLQotCi0KLXB1YmxpYyBjbGFzcyBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50IGV4dGVuZHMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQgaW1wbGVtZW50cyBJRXhlY3V0aW9uRGVsZWdhdGFibGUsIElMb2NrYWJsZSB7Ci0KLQlwcml2YXRlIFN0YWNrIGZFeGVjdXRpb25EZWxlZ2F0ZXMgPSBuZXcgU3RhY2soKTsKLQlwcml2YXRlIElMb2NrIGZMb2NrYWJsZSA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCi0JcHVibGljIEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudChSZWdpb25QYXJzZXIgcGFyc2VyKSB7Ci0JCXN1cGVyKHBhcnNlcik7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhY3F1aXJlTG9jaygpIHsKLQkJZ2V0TG9ja09iamVjdCgpLmFjcXVpcmUoKTsKLQl9Ci0KLQlwcml2YXRlIElFeGVjdXRpb25EZWxlZ2F0ZSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpIHsKLQkJaWYgKCFmRXhlY3V0aW9uRGVsZWdhdGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiAoSUV4ZWN1dGlvbkRlbGVnYXRlKSBmRXhlY3V0aW9uRGVsZWdhdGVzLnBlZWsoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklMb2NrYWJsZSNnZXRMb2NrKCkKLQkgKi8KLQotCXB1YmxpYyBJTG9jayBnZXRMb2NrT2JqZWN0KCkgewotCQlyZXR1cm4gZkxvY2thYmxlOwotCX0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVsZWFzZUxvY2soKSB7Ci0JCWdldExvY2tPYmplY3QoKS5yZWxlYXNlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I3JlcGxhY2VUZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQsIGludCwgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoZmluYWwgT2JqZWN0IHJlcXVlc3RlciwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGZpbmFsIFN0cmluZyBjaGFuZ2VzLCBmaW5hbCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQgPSBudWxsOwotCQlJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUgPSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpOwotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIGRlbGVnYXRlIGhhcyBub3QgYmVlbiBzZXQsIHdlIGV4ZWN1dGUgb24gY3VycmVudAotCQkJLy8gdGhyZWFkLCBsaWtlICJub3JtYWwiLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBub3JtYWwKLQkJCS8vIG5vbi1lZGl0b3IKLQkJCS8vIHVzZSAod2hpY2ggc2hvdWxkIHN0aWxsLCB1bHRpbWF0ZWx5LCBiZSBwcm90ZWN0ZWQgYnkKLQkJCS8vIGEgc2NoZWR1bGluZyBydWxlKS4KLQkJCWV2ZW50ID0gc3VwZXIucmVwbGFjZVRleHQocmVxdWVzdGVyLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMsIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gSWYgZG9jdW1lbnQgaXMgYmVpbmcgdXNlZCBieSBhbiBlZGl0b3IsIGEgcnVubmFibGUgaXMKLQkJCS8vIGNyZWF0ZWQsCi0JCQkvLyBldmVuIGlmIGxhdGVyIChpbiB0aGUgZXhlY3V0aW9uIGRlbGVnYXRlIGluc3RhbmNlKSBpdCBpcwotCQkJLy8gZGVjaWRlZAotCQkJLy8gbm90aGluZyBzcGVjaWFsIGlzIG5lZWRlZCAodGhhdCBpcywgaW4gZmFjdCBiZWluZyBjYWxsZWQKLQkJCS8vIGZyb20KLQkJCS8vIGVkaXRvcidzIGRpc3BsYXkgdGhyZWFkLCBpbiB3aGljaCBjYXNlIGl0cyBqdXN0IGV4ZWN1dGVkKQotCQkJZmluYWwgT2JqZWN0W10gcmVzdWx0U2xvdCA9IG5ldyBPYmplY3RbMV07Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRTbG90WzBdID0gSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5zdXBlci5yZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgaWdub3JlUmVhZE9ubHlTZXR0aW5ncyk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQlyZXN1bHRTbG90WzBdID0gZTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQkvLyBzdHJvbmdseSBhc3N1bWVzIHN5bmNocm9ub3VzIGNhbGwsIHRvICJ3YWl0IiBmb3IKLQkJCS8vIHJlc3VsdHMKLQkJCS8vIGJhc2ljYWxseSBqdXN0IHJvdXRlcyB0byBEaXNwbGF5LnN5bmNoRXhlYyhydW5uYWJsZSksCi0JCQkvLyBpZiBub3QgYWxyZWFkeSBydW5uaW5nIG9uIGRpc3BsYXkgdGhyZWFkLgotCQkJZGVsZWdhdGUuZXhlY3V0ZShydW5uYWJsZSk7Ci0KLQkJCS8vIHRoaXMgcmVtZW1iZXJpbmcgYW5kIHJlLXRocm93aW5nIG9mIGV4Y2VwdGlvbiBpcyBqdXN0IHRvCi0JCQkvLyBnZXQgYW4KLQkJCS8vIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIG9uIG9uZSB0aHJlYWQsIHRvIGJlIHRocm93biBvbgotCQkJLy8gY2FsbGVycwotCQkJLy8gdGhyZWFkLgotCQkJaWYgKHJlc3VsdFNsb3RbMF0gaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigoVGhyb3dhYmxlKSByZXN1bHRTbG90WzBdKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWV2ZW50ID0gKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSByZXN1bHRTbG90WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRpb25EZWxlZ2F0ZShJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpCi0JCQlmRXhlY3V0aW9uRGVsZWdhdGVzLnB1c2goZGVsZWdhdGUpOwotCQllbHNlIGlmICghZkV4ZWN1dGlvbkRlbGVnYXRlcy5pc0VtcHR5KCkpCi0JCQlmRXhlY3V0aW9uRGVsZWdhdGVzLnBvcCgpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBzZXRUZXh0KGZpbmFsIE9iamVjdCByZXF1ZXN0ZXIsIGZpbmFsIFN0cmluZyB0aGVTdHJpbmcpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQgPSBudWxsOwotCQlJRXhlY3V0aW9uRGVsZWdhdGUgZXhlY3V0aW9uRGVsZWdhdGUgPSBnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpOwotCQlpZiAoZXhlY3V0aW9uRGVsZWdhdGUgPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIGRlbGVnYXRlIGhhcyBub3QgYmVlbiBzZXQsIHdlIGV4ZWN1dGUgb24gY3VycmVudAotCQkJLy8gdGhyZWFkLCBsaWtlICJub3JtYWwiLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBub3JtYWwKLQkJCS8vIG5vbi1lZGl0b3IKLQkJCS8vIHVzZSAod2hpY2ggc2hvdWxkIHN0aWxsLCB1bHRpbWF0ZWx5LCBiZSBwcm90ZWN0ZWQgYnkKLQkJCS8vIGEgc2NoZWR1bGluZyBydWxlKS4KLQkJCWV2ZW50ID0gc3VwZXIuc2V0VGV4dChyZXF1ZXN0ZXIsIHRoZVN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJZiBkb2N1bWVudCBpcyBiZWluZyB1c2VkIGJ5IGFuIGVkaXRvciwgYSBydW5uYWJsZSBpcwotCQkJLy8gY3JlYXRlZCwKLQkJCS8vIGV2ZW4gaWYgbGF0ZXIgKGluIHRoZSBleGVjdXRpb24gZGVsZWdhdGUgaW5zdGFuY2UpIGl0IGlzCi0JCQkvLyBkZWNpZGVkCi0JCQkvLyBub3RoaW5nIHNwZWNpYWwgaXMgbmVlZGVkICh0aGF0IGlzLCBpbiBmYWN0IGJlaW5nIGNhbGxlZAotCQkJLy8gZnJvbQotCQkJLy8gZWRpdG9yJ3MgZGlzcGxheSB0aHJlYWQsIGluIHdoaWNoIGNhc2UgaXRzIGp1c3QgZXhlY3V0ZWQpCi0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFNsb3RbMF0gPSBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LnN1cGVyLnNldFRleHQocmVxdWVzdGVyLCB0aGVTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJcmVzdWx0U2xvdFswXSA9IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJLy8gc3Ryb25nbHkgYXNzdW1lcyBzeW5jaHJvbm91cyBjYWxsLCB0byAid2FpdCIgZm9yCi0JCQkvLyByZXN1bHRzCi0JCQkvLyBiYXNpY2FsbHkganVzdCByb3V0ZXMgdG8gRGlzcGxheS5zeW5jaEV4ZWMocnVubmFibGUpLAotCQkJLy8gaWYgbm90IGFscmVhZHkgcnVubmluZyBvbiBkaXNwbGF5IHRocmVhZC4KLQkJCWV4ZWN1dGlvbkRlbGVnYXRlLmV4ZWN1dGUocnVubmFibGUpOwotCi0JCQkvLyB0aGlzIHJlbWVtYmVyaW5nIGFuZCByZS10aHJvd2luZyBvZiBleGNlcHRpb24gaXMganVzdCB0bwotCQkJLy8gZ2V0IGFuCi0JCQkvLyBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCBvbiBvbmUgdGhyZWFkLCB0byBiZSB0aHJvd24gb24KLQkJCS8vIGNhbGxlcnMKLQkJCS8vIHRocmVhZC4KLQkJCWlmIChyZXN1bHRTbG90WzBdIGluc3RhbmNlb2YgVGhyb3dhYmxlKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKFRocm93YWJsZSkgcmVzdWx0U2xvdFswXSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlldmVudCA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgcmVzdWx0U2xvdFswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi0JcHVibGljIERvY3VtZW50UmV3cml0ZVNlc3Npb24gc3RhcnRSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50UmV3cml0ZVNlc3Npb24gc2Vzc2lvbiA9IG51bGw7Ci0JCUlFeGVjdXRpb25EZWxlZ2F0ZSBleGVjdXRpb25EZWxlZ2F0ZSA9IGdldEV4ZWN1dGlvbkRlbGVnYXRlKCk7Ci0JCWlmIChleGVjdXRpb25EZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQkvLyBpZiB0aGUgZGVsZWdhdGUgaGFzIG5vdCBiZWVuIHNldCwgd2UgZXhlY3V0ZSBvbiBjdXJyZW50Ci0JCQkvLyB0aHJlYWQsIGxpa2UgIm5vcm1hbCIuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIG5vcm1hbAotCQkJLy8gbm9uLWVkaXRvcgotCQkJLy8gdXNlICh3aGljaCBzaG91bGQgc3RpbGwsIHVsdGltYXRlbHksIGJlIHByb3RlY3RlZCBieQotCQkJLy8gYSBzY2hlZHVsaW5nIHJ1bGUpLgotCQkJc2Vzc2lvbiA9IGludGVybmFsU3RhcnRSZXdyaXRlU2Vzc2lvbihzZXNzaW9uVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJZiBkb2N1bWVudCBpcyBiZWluZyB1c2VkIGJ5IGFuIGVkaXRvciwgYSBydW5uYWJsZSBpcwotCQkJLy8gY3JlYXRlZCwKLQkJCS8vIGV2ZW4gaWYgbGF0ZXIgKGluIHRoZSBleGVjdXRpb24gZGVsZWdhdGUgaW5zdGFuY2UpIGl0IGlzCi0JCQkvLyBkZWNpZGVkCi0JCQkvLyBub3RoaW5nIHNwZWNpYWwgaXMgbmVlZGVkICh0aGF0IGlzLCBpbiBmYWN0IGJlaW5nIGNhbGxlZAotCQkJLy8gZnJvbQotCQkJLy8gZWRpdG9yJ3MgZGlzcGxheSB0aHJlYWQsIGluIHdoaWNoIGNhc2UgaXRzIGp1c3QgZXhlY3V0ZWQpCi0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCWZpbmFsIERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIGZpbmFsU2Vzc2lvblR5cGUgPSBzZXNzaW9uVHlwZTsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFNsb3RbMF0gPSBpbnRlcm5hbFN0YXJ0UmV3cml0ZVNlc3Npb24oZmluYWxTZXNzaW9uVHlwZSk7Ci0KLQkJCQkJfQotCQkJCQljYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJCXJlc3VsdFNsb3RbMF0gPSBlOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCS8vIHN0cm9uZ2x5IGFzc3VtZXMgc3luY2hyb25vdXMgY2FsbCwgdG8gIndhaXQiIGZvcgotCQkJLy8gcmVzdWx0cwotCQkJLy8gYmFzaWNhbGx5IGp1c3Qgcm91dGVzIHRvIERpc3BsYXkuc3luY2hFeGVjKHJ1bm5hYmxlKSwKLQkJCS8vIGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcgb24gZGlzcGxheSB0aHJlYWQuCi0JCQlleGVjdXRpb25EZWxlZ2F0ZS5leGVjdXRlKHJ1bm5hYmxlKTsKLQotCQkJLy8gdGhpcyByZW1lbWJlcmluZyBhbmQgcmUtdGhyb3dpbmcgb2YgZXhjZXB0aW9uIGlzIGp1c3QgdG8KLQkJCS8vIGdldCBhbgotCQkJLy8gZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgb24gb25lIHRocmVhZCwgdG8gYmUgdGhyb3duIG9uCi0JCQkvLyBjYWxsZXJzCi0JCQkvLyB0aHJlYWQuCi0JCQlpZiAocmVzdWx0U2xvdFswXSBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKChUaHJvd2FibGUpIHJlc3VsdFNsb3RbMF0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2Vzc2lvbiA9IChEb2N1bWVudFJld3JpdGVTZXNzaW9uKSByZXN1bHRTbG90WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZXNzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJSUV4ZWN1dGlvbkRlbGVnYXRlIGV4ZWN1dGlvbkRlbGVnYXRlID0gZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKTsKLQkJaWYgKGV4ZWN1dGlvbkRlbGVnYXRlID09IG51bGwpIHsKLQkJCS8vIGlmIHRoZSBkZWxlZ2F0ZSBoYXMgbm90IGJlZW4gc2V0LCB3ZSBleGVjdXRlIG9uIGN1cnJlbnQKLQkJCS8vIHRocmVhZCwgbGlrZSAibm9ybWFsIi4gVGhpcyBpcyB0aGUgY2FzZSBmb3Igbm9ybWFsCi0JCQkvLyBub24tZWRpdG9yCi0JCQkvLyB1c2UgKHdoaWNoIHNob3VsZCBzdGlsbCwgdWx0aW1hdGVseSwgYmUgcHJvdGVjdGVkIGJ5Ci0JCQkvLyBhIHNjaGVkdWxpbmcgcnVsZSkuCi0JCQlpbnRlcm5hbFN0b3BSZXdyaXRlU2Vzc2lvbihzZXNzaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIElmIGRvY3VtZW50IGlzIGJlaW5nIHVzZWQgYnkgYW4gZWRpdG9yLCBhIHJ1bm5hYmxlIGlzCi0JCQkvLyBjcmVhdGVkLAotCQkJLy8gZXZlbiBpZiBsYXRlciAoaW4gdGhlIGV4ZWN1dGlvbiBkZWxlZ2F0ZSBpbnN0YW5jZSkgaXQgaXMKLQkJCS8vIGRlY2lkZWQKLQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgKHRoYXQgaXMsIGluIGZhY3QgYmVpbmcgY2FsbGVkCi0JCQkvLyBmcm9tCi0JCQkvLyBlZGl0b3IncyBkaXNwbGF5IHRocmVhZCwgaW4gd2hpY2ggY2FzZSBpdHMganVzdCBleGVjdXRlZCkKLQkJCWZpbmFsIE9iamVjdFtdIHJlc3VsdFNsb3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJZmluYWwgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBmaW5hbFNlc3Npb24gPSBzZXNzaW9uOwotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJaW50ZXJuYWxTdG9wUmV3cml0ZVNlc3Npb24oZmluYWxTZXNzaW9uKTsKLQotCQkJCQl9Ci0JCQkJCWNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJcmVzdWx0U2xvdFswXSA9IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJLy8gc3Ryb25nbHkgYXNzdW1lcyBzeW5jaHJvbm91cyBjYWxsLCB0byAid2FpdCIgZm9yCi0JCQkvLyByZXN1bHRzCi0JCQkvLyBiYXNpY2FsbHkganVzdCByb3V0ZXMgdG8gRGlzcGxheS5zeW5jaEV4ZWMocnVubmFibGUpLAotCQkJLy8gaWYgbm90IGFscmVhZHkgcnVubmluZyBvbiBkaXNwbGF5IHRocmVhZC4KLQkJCWV4ZWN1dGlvbkRlbGVnYXRlLmV4ZWN1dGUocnVubmFibGUpOwotCi0JCQkvLyB0aGlzIHJlbWVtYmVyaW5nIGFuZCByZS10aHJvd2luZyBvZiBleGNlcHRpb24gaXMganVzdCB0bwotCQkJLy8gZ2V0IGFuCi0JCQkvLyBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCBvbiBvbmUgdGhyZWFkLCB0byBiZSB0aHJvd24gb24KLQkJCS8vIGNhbGxlcnMKLQkJCS8vIHRocmVhZC4KLQkJCWlmIChyZXN1bHRTbG90WzBdIGluc3RhbmNlb2YgVGhyb3dhYmxlKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKFRocm93YWJsZSkgcmVzdWx0U2xvdFswXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L01pbmltYWxEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L01pbmltYWxEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDQ2NzVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLQotCi0vKioKLSAqIFB1cmVseSBhIGR1bW15ICJtYXJrZXIiIGluc3RhbmNlIGZvciBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHdoaWNoIGFyZQotICogY3JlYXRlZCB0ZW1vcmFyaWx5IGluIHRoZSBjb3Vyc2Ugb2YgcmUtcGFyc2luZy4gUHJpbWFyaWx5IGEgcGxhY2UgaG9sZGVyLAotICogYnV0IGNhbiBiZSBuZWVkZWQgdG8gZ2V0IHRleHQgZnJvbS4KLSAqLwotcHVibGljIGNsYXNzIE1pbmltYWxEb2N1bWVudCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnQgewotCXByaXZhdGUgU3ViU2V0VGV4dFN0b3JlIGRhdGE7Ci0KLQkvKioKLQkgKiBNYXJrZWQgcHJpdmF0ZSB0byBiZSBzdXJlIG5ldmVyIGNyZWF0ZWQgd2l0aG91dCBkYXRhIGJlaW5nIGluaXRpYWxpemVkLgotCSAqICAKLQkgKi8KLQlwcml2YXRlIE1pbmltYWxEb2N1bWVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTWluaW1hbERvY3VtZW50KFN1YlNldFRleHRTdG9yZSBpbml0aWFsQ29udGVudHMpIHsKLQkJdGhpcygpOwotCQlkYXRhID0gaW5pdGlhbENvbnRlbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb24oUG9zaXRpb24gcG9zaXRpb24pIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgUG9zaXRpb24gcG9zaXRpb24pIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhclJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQkvLyBUT0RPOiB0aGlzIGlzIGNhbGxlZCBmcm9tIG5vdGlmaWVyIGxvb3AgaW5hcHByb3ByaWF0ZWx5Ci0JCS8vCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXB1dGVJbmRleEluQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5LCBpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXB1dGVOdW1iZXJPZkxpbmVzKFN0cmluZyB0ZXh0KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZmlyZU5ld0RvY3VtZW50KE9iamVjdCByZXF1ZXN0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBkYXRhLmdldCgwLCBkYXRhLmdldExlbmd0aCgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGRhdGEuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBjaGFyIGdldENoYXIoaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRhdGEuZ2V0KG9mZnNldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJLy8gdGVtcCBmaXgKLQkJcmV0dXJuIG51bGw7Ci0JCS8vCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGRhdGEuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmVmZXJlZExpbmVEZWxpbWl0ZXIoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcihpbnQgbGluZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0TGluZUluZm9ybWF0aW9uKGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVMZW5ndGgoaW50IGxpbmUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZU9mZnNldChpbnQgbGluZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRMaW5lT2ZPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mTGluZXMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMaW5lcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkFuIGluc3RhbmNlIG9mIE1pbmltYWxEb2N1bWVudCB3YXMgYXNrZWQgZm9yIGl0cyBwYXJ0aXRpb24sIHNvbWV0aW1lIGluZGljYXRpbmcgYSBkZWxldGVkIHJlZ2lvbiB3YXMgYmVpbmcgYWNjZXNzZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBUeXBlZFJlZ2lvbigwLDAsICJ1bmRlZmluZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvL3Rocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBQb3NpdGlvbltdIGdldFBvc2l0aW9ucyhTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElQb3NpdGlvblVwZGF0ZXJbXSBnZXRQb3NpdGlvblVwZGF0ZXJzKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRSZWdpb25MaXN0KCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgZ2V0UmVQYXJzZXIoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGRhdGEuZ2V0KDAsIGRhdGEuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNnZXRVbmRvTWFuYWdlcigpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGdldFVuZG9NYW5hZ2VyKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyLCBpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgbWFrZVJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQkvLyBUT0RPOiB0aGlzIGlzIGNhbGxlZCBmcm9tIG5vdGlmaWVyIGxvb3AgaW5hcHByb3ByaWF0ZWx5Ci0JCS8vCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbiNyZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKElEb2N1bWVudExpc3RlbmVyIG93bmVyLCBJUmVwbGFjZSByZXBsYWNlKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb24oUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lciBkb2N1bWVudEFkYXB0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vCQlkYXRhLnJlcGxhY2Uob2Zmc2V0LCBsZW5ndGgsIHRleHQpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChPYmplY3Qgc291cmNlLCBpbnQgb2xkU3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIHJlcXVlc3RlZENoYW5nZSkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjcmVwbGFjZVRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChPYmplY3Qgc291cmNlLCBpbnQgb2xkU3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIHJlcXVlc3RlZENoYW5nZSwgYm9vbGVhbiBpZ25vcmVSZWFkT25seVNldHRpbmcpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbiNyZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgc2VhcmNoKGludCBzdGFydE9mZnNldCwgU3RyaW5nIGZpbmRTdHJpbmcsIGJvb2xlYW4gZm9yd2FyZFNlYXJjaCwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlLCBib29sZWFuIHdob2xlV29yZCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyB0ZXh0KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkvLwkJZGF0YS5zZXQodGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmNvZGluZ01lbWVudG8oRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50bykgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHNldFRleHQoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGFsbFRleHQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I3NldFVuZG9NYW5hZ2VyKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51bmRvLlN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5kb01hbmFnZXIoSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbiNzdGFydFNlcXVlbnRpYWxSZXdyaXRlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRTZXF1ZW50aWFsUmV3cml0ZShib29sZWFuIG5vcm1hbGl6ZSkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0b3BTZXF1ZW50aWFsUmV3cml0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVycmVkTGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZURlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9SZWFkT25seVBvc2l0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvUmVhZE9ubHlQb3NpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzRiY2NmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9SZWFkT25seVBvc2l0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLQotY2xhc3MgUmVhZE9ubHlQb3NpdGlvbiBleHRlbmRzIFBvc2l0aW9uIHsKLQlwcml2YXRlIGJvb2xlYW4gZkluY2x1ZGVTdGFydE9mZnNldCA9IGZhbHNlOwotCi0JcHVibGljIFJlYWRPbmx5UG9zaXRpb24oaW50IG5ld09mZnNldCwgaW50IG5ld0xlbmd0aCwgYm9vbGVhbiBpbmNsdWRlU3RhcnQpIHsKLQkJc3VwZXIobmV3T2Zmc2V0LCBuZXdMZW5ndGgpOwotCQlmSW5jbHVkZVN0YXJ0T2Zmc2V0ID0gaW5jbHVkZVN0YXJ0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIG92ZXJsYXBzV2l0aChpbnQgbmV3T2Zmc2V0LCBpbnQgbmV3TGVuZ3RoKSB7Ci0JCWJvb2xlYW4gb3ZlcmxhcHNXaXRoID0gc3VwZXIub3ZlcmxhcHNXaXRoKG5ld09mZnNldCwgbmV3TGVuZ3RoKTsKLQkJaWYgKG92ZXJsYXBzV2l0aCkgewotCQkJLyoKLQkJCSAqIEJVRzE1NzUyNiBJZiBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlYWQgb25seSByZWdpb24gYW5kIGxlbmd0aCA9Ci0JCQkgKiAwIG1vc3QgbGlrZWx5IGFza2luZyB0byBpbnNlcnQgYW5kIHdhbnQgdG8gYWxsIGluc2VydGluZyBiZWZvcmUKLQkJCSAqIHJlYWQgb25seSByZWdpb24KLQkJCSAqLwotCQkJaWYgKGZJbmNsdWRlU3RhcnRPZmZzZXQgJiYgKG5ld0xlbmd0aCA9PSAwKSAmJiAodGhpcy5sZW5ndGggIT0gMCkgJiYgKG5ld09mZnNldCA9PSB0aGlzLm9mZnNldCkpIHsKLQkJCQlvdmVybGFwc1dpdGggPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3ZlcmxhcHNXaXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDVkYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5GaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1RhZ1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjZW50cmFsaXplZCBwbGFjZSB0byBwdXQgInJlcGFyc2luZyIgbG9naWMuIFRoaXMgaXMKLSAqIHRoZSBsb2dpYyB0aGF0IHJlcGFyc2VzIHRoZSB0ZXh0IGluY3JlbWVudGFsbHksIGFzIGEgdXNlciB0eXBlcyBpbiBuZXcKLSAqIGNoYXJhY3RlcnMsIG9yIERPTSBub2RlcyBhcmUgaW5zZXJ0ZWQgb3IgZGVsZXRlZC4gTm90ZTogaXQgaXMgbm90IGEgdGhyZWFkCi0gKiBzYWZlIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQgPSBudWxsOwotCWZpbmFsIHByaXZhdGUgU3RyaW5nIGRvdWJsZVF1b3RlID0gbmV3IFN0cmluZyhuZXcgY2hhcltdeydcIid9KTsKLQlwcm90ZWN0ZWQgZmluYWwgQ29yZU5vZGVMaXN0IEVNUFRZX0xJU1QgPSBuZXcgQ29yZU5vZGVMaXN0KCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmQ2hhbmdlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZEZWxldGVkVGV4dDsKLQotCXByaXZhdGUgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGhEaWZmZXJlbmNlOwotCXByb3RlY3RlZCBpbnQgZkxlbmd0aFRvUmVwbGFjZTsKLQlwcm90ZWN0ZWQgT2JqZWN0IGZSZXF1ZXN0ZXI7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnQ7Ci0JLy8gbm90ZTogdGhpcyBpcyB0aGUgaW1wbCBjbGFzcyBvZiBJU3RydWN0dXJlZERvY3VtZW50LCBub3QgdGhlIGludGVyZmFjZQotCS8vIEZVVFVSRV9UT19ETzogSSBiZWxpZXZlIHNvbWUgb2YgdGhlc2UgY2FuIGJlIG1hZGUgcHJpdmF0ZSBub3cuPwotCXByb3RlY3RlZCBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50OwotCi0JLyoqCi0JICogdmFyaWFibGUgdXNlZCBpbiBhbnRpY2lhcGF0aW9uIG9mIG11bHRpdGhyZWFkaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJzaW5nOwotCWZpbmFsIHByaXZhdGUgU3RyaW5nIHNpbmdsZVF1b3RlID0gbmV3IFN0cmluZyhuZXcgY2hhcltdeydcJyd9KTsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgX2NoZWNrQmxvY2tOb2RlTGlzdChMaXN0IGJsb2NrVGFnTGlzdCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoYmxvY2tUYWdMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tUYWdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXIgYmxvY2tUYWcgPSAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXIpIGJsb2NrVGFnTGlzdC5nZXQoaSk7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSBibG9ja1RhZy5nZXRUYWdOYW1lKCk7Ci0JCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbE5hbWUoIjwiICsgdGFnTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxOYW1lKCI8LyIgKyB0YWdOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gdXRpbGl0eSBmb3IgY2hlY2tpbmcgZm9yIGNyaXRpY2FsIHdvcmQgc3VjaCBhcyAiIDxTQ1JJUFQ+IgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgX2NoZWNrRm9yQ3JpdGljYWxXb3JkKFN0cmluZyBjcml0aWNhbFRhcmdldCwgYm9vbGVhbiBjaGVja0VuZCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpbnQgZG9jdW1lbnRMZW5ndGggPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpOwotCQlpbnQgcHJvcExlbiA9IGZMZW5ndGhUb1JlcGxhY2U7Ci0JCWlmIChwcm9wTGVuID4gZG9jdW1lbnRMZW5ndGgpCi0JCQlwcm9wTGVuID0gZG9jdW1lbnRMZW5ndGg7Ci0JCWludCBzdGFydE5laWdoYm9yaG9vZCA9IGZTdGFydCAtIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpOwotCQlpbnQgYWRqdXN0SW5zZXJ0ID0gMDsKLQkJaWYgKHN0YXJ0TmVpZ2hib3Job29kIDwgMCkgewotCQkJYWRqdXN0SW5zZXJ0ID0gMCAtIHN0YXJ0TmVpZ2hib3Job29kOwotCQkJc3RhcnROZWlnaGJvcmhvb2QgPSAwOwotCQl9Ci0JCWludCBlbmROZWlnaGJvcmhvb2QgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlICsgY3JpdGljYWxUYXJnZXQubGVuZ3RoKCkgLSAxOwotCQlpZiAoZW5kTmVpZ2hib3Job29kID4gZG9jdW1lbnRMZW5ndGgpCi0JCQllbmROZWlnaGJvcmhvb2QgPSBkb2N1bWVudExlbmd0aCAtIDE7Ci0JCWludCBvbGRsZW4gPSBlbmROZWlnaGJvcmhvb2QgLSBzdGFydE5laWdoYm9yaG9vZDsgLy8gKyAxOwotCQlpZiAob2xkbGVuICsgc3RhcnROZWlnaGJvcmhvb2QgPiBkb2N1bWVudExlbmd0aCkgewotCQkJb2xkbGVuID0gZG9jdW1lbnRMZW5ndGggLSBzdGFydE5laWdoYm9yaG9vZDsKLQkJfQotCQlTdHJpbmcgb2xkVGV4dCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0TmVpZ2hib3Job29kLCBvbGRsZW4pOwotCQlTdHJpbmcgcGVlayA9IFN0cmluZ1V0aWxzLnBhc3RlKG9sZFRleHQsIGZDaGFuZ2VzLCBjcml0aWNhbFRhcmdldC5sZW5ndGgoKSAtIGFkanVzdEluc2VydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gaXNDcml0aWNhbFN0cmluZyA9IGNoZWNrVGFnTmFtZXMob2xkVGV4dCwgY3JpdGljYWxUYXJnZXQsIGNoZWNrRW5kKTsKLQkJYm9vbGVhbiB0b0JlQ3JpdGljYWxTdHJpbmcgPSBjaGVja1RhZ05hbWVzKHBlZWssIGNyaXRpY2FsVGFyZ2V0LCBjaGVja0VuZCk7Ci0JCWlmICgoaXNDcml0aWNhbFN0cmluZyAhPSB0b0JlQ3JpdGljYWxTdHJpbmcpIHx8IC8vIE9SIGlmIGJvdGggYXJlCi0JCQkJCS8vIGNyaXRpY2FsIGFuZCB0aGVyZSdzCi0JCQkJCS8vIGEgY2hhbmdlIGluIHRoZSBlbmQKLQkJCQkJLy8gdGFnICgnPicpCi0JCQkJCSgoaXNDcml0aWNhbFN0cmluZyAmJiB0b0JlQ3JpdGljYWxTdHJpbmcpICYmIChjaGFuZ2VJbklzRW5kZWRTdGF0ZShvbGRUZXh0LCBwZWVrKSkpKSB7Ci0JCQkvLyBpZiBpdCBpbnZvbHZlcyBhIGNoYW5nZSBvZiBhIGNyaXRpY2FsIHN0cmluZyAobWFraW5nIG9uZSB3aGVyZQotCQkJLy8gdGhlcmUgd2Fzbid0LCBvciByZW1vdmluZwotCQkJLy8gb25lIHdoZXJlIHRoZXJlIHdhcyBvbmUpIHRoZW4gcmVwYXJzZSBldmVydGhpbmcuCi0JCQlyZXN1bHQgPSByZXBhcnNlKDAsIGRvY3VtZW50TGVuZ3RoIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBfY29tcHV0ZVN0YXJ0T2ZEaWZmZXJlbmNlcyhDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQlpbnQgc3RhcnRPZkRpZmZlcmVuY2VzID0gLTE7Ci0JCWludCBuZXdOb2Rlc0xlbmd0aCA9IG5ld05vZGVzLmdldExlbmd0aCgpOwotCQlib29sZWFuIGZvdW5kRGlmZmVyZW5jZSA9IGZhbHNlOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJLy8gd2UnbGwgY29udHJvbCBvdXIgbG9vcCBiYXNlZCBvbiB0aGUgb2xkIExpc3QgbGVuZ3RoCi0JCWludCBvbGROb2Rlc0xlbmd0aCA9IG9sZE5vZGVzLmdldExlbmd0aCgpOwotCQkvLyBiZSBzdXJlIHRvIGNoZWNrICdkb25lJyBmaXJzdCwgc28gc3RhcnRPZkRpZmZlcmVuY2VzIGlzbid0Ci0JCS8vIGljcmVtZW50ZWQgaWYgZG9uZSBpcyB0cnVlCi0JCWRvbmUgOiB3aGlsZSAoKCFkb25lKSAmJiAoKytzdGFydE9mRGlmZmVyZW5jZXMgPCBvbGROb2Rlc0xlbmd0aCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSA9IG9sZE5vZGVzLml0ZW0oc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCS8vIHRoaXMgbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbiBpcyB0byBjaGVjayB0byBiZSBzdXJlIHRoZSBub2RlIGlzCi0JCQkvLyBpbmZhY3QgYSBjYW5kaWRhdGUKLQkJCS8vIHRvIGJlIGNvbnNpZGVyZWQgYXMgIm9sZCIuIFRoaXMgY2hlY2sgaXMgaW1wb3J0YW50IGZvciB0aGUgY2FzZQotCQkJLy8gd2hlcmUgc29tZQotCQkJLy8gdGV4dCBpcyByZXBsYWNlaW5nIHRleHQgdGhhdAotCQkJLy8gYXBwZWFycyBpZGVudGljYWwsIGJ1dCBpcyBhIGRpZmZlcmVudCBpbnN0YW5jZS4gRm9yIGV4YW1wbGUsIGlmCi0JCQkvLyB0aGUgdGV4dAotCQkJLy8gaXMgPFA+PEI+PC9CPjwvUD4gYW5kIDxCPjwvQj4gaXMgaW5zZXJ0ZWQgYXQgcG9zdGlvbiAzLAotCQkJLy8gcmVzdWx0aW5nIGluIDxQPjxCPjwvQj48Qj48L0I+PC9QPgotCQkJLy8gd2UgZG8gbm90IHdhbnQgdGhlCi0JCQkvLyBmaXJzdCA8Qj4gdG8gYmUgY29uc2lkZXJlZCBvbGQgLi4uIGl0IGlzIHRoZSBuZXcgb25lLCB0aGUKLQkJCS8vIHNlY29uZAotCQkJLy8gPEI+IGlzIHRoZSBvbGQgb25lLgotCQkJaWYgKF9sZXNzVGhhbkVmZmVjdGVkUmVnaW9uKG9sZE5vZGUpKSB7Ci0JCQkJLy8gYmUgc3VyZSB0byBjaGVjayB0aGF0IHdlIGhhdmUgbmV3IG5vZGVzIHRvIGNvbXBhcmUgYWdhaW5zdC4KLQkJCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gbmV3Tm9kZXNMZW5ndGgpIHsKLQkJCQkJZm91bmREaWZmZXJlbmNlID0gZmFsc2U7Ci0JCQkJCWRvbmUgPSB0cnVlOwotCQkJCQljb250aW51ZSBkb25lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vCi0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZSA9IG5ld05vZGVzLml0ZW0oc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCQkJLy8gbm90ZTogc2hpZnQgaXMgMCB3aGlsZSBhdCBiZWdpbm5pbmcgb2YgbGlzdCwgYmVmb3JlIHRoZQotCQkJCQkvLyBpbnNlcnRpb24gKG9yIGRlbGV0aW9uKSBwb2ludC4gQWZ0ZXIgdGhhdCwgaXQgaXMKLQkJCQkJLy8gZlN0YXJ0K2ZMZW5ndGhEaWZmZXJlbmNlCi0JCQkJCWlmICghKG9sZE5vZGUuc2FtZUFzKG5ld05vZGUsIDApKSkgewotCQkJCQkJZm91bmREaWZmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJY29udGludWUgZG9uZTsKLQkJCQkJfSBlbHNlIHsgLy8gaWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gd2Ugd2lsbCBiZSBrZWVwaW5nIHRoZQotCQkJCQkJLy8gb2xkIG9uZSwgc28KLQkJCQkJCS8vIHdlIG5lZWQgdG8gYmUgc3VyZSBpdHMgcGFyZW50RG9jdW1lbnQgaXMgc2V0IGJhY2sKLQkJCQkJCS8vIHRvCi0JCQkJCQkvLyB0aGUgcmlnaHQgaW5zdGFuY2UKLQkJCQkJCW9sZE5vZGUuc2V0UGFyZW50RG9jdW1lbnQoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIGRpZG4ndCBsaXRlcmFsbHkgZmluZCBhIGRpZmZlcmVuY2UsIGJ1dCB3ZSBjb3VudCBpdCBhcwotCQkJCS8vIHN1Y2ggYnkgaW1wbGljYXRpb24KLQkJCQlmb3VuZERpZmZlcmVuY2UgPSB0cnVlOwotCQkJCWRvbmUgPSB0cnVlOwotCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgbGl0ZXJhbGx5IGZvdW5kIGEgZGlmZmVyZW5jZSwgdGhlbiBhbGwgaXMgb2sgYW5kIHdlIGNhbgotCQkvLyByZXR1cm4KLQkJLy8gaXQuCi0JCS8vIGlmIHdlIGRpZCBub3QgbGl0ZXJhbGx5IGZpbmQgb25lLCB0aGVuIHdlIGhhdmUgdG8gZGVjaWRlIHdoeS4KLQkJaWYgKCFmb3VuZERpZmZlcmVuY2UpIHsKLQkJCWlmIChuZXdOb2Rlc0xlbmd0aCA9PSBvbGROb2Rlc0xlbmd0aCkgeyAvLyB0aGVuIGxpc3RzIGFyZQotCQkJCS8vIGlkZW50aWNhbAotCQkJCS8vIChhbmQgbWF5IGJlIG9mIHplcm8KLQkJCQkvLyBsZW5ndGgpCi0JCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gLTE7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChuZXdOb2Rlc0xlbmd0aCA+IG9sZE5vZGVzTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJCS8vIGlkZW50aWNhbCBleGNlcHQgZm9yCi0JCQkJCS8vIG5ld05vZGVzIGFkZGVkCi0JCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG9sZE5vZGVzTGVuZ3RoOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2Rlc0xlbmd0aCA8IG9sZE5vZGVzTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJCQkvLyBpZGVudGljYWwgZXhjZXB0Ci0JCQkJCQkvLyBmb3Igb2xkIE5vZGVzCi0JCQkJCQkvLyBkZWxldGVkCi0JCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBuZXdOb2Rlc0xlbmd0aDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhcnRPZkRpZmZlcmVuY2VzOwotCX0KLQotCXByaXZhdGUgaW50IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZVBhcmFtLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlUGFyYW0sIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zKSB7Ci0JCWludCBzdGFydE9mRGlmZmVyZW5jZXMgPSAtMTsKLQkJaW50IG5ld1JlZ2lvbnNMZW5ndGggPSBuZXdSZWdpb25zLnNpemUoKTsKLQkJYm9vbGVhbiBmb3VuZERpZmZlcmVuY2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCS8vIHdlJ2xsIGNvbnRyb2wgb3VyIGxvb3AgYmFzZWQgb24gdGhlIG9sZCBMaXN0IGxlbmd0aAotCQlpbnQgb2xkUmVnaW9uc0xlbmd0aCA9IG9sZFJlZ2lvbnMuc2l6ZSgpOwotCQkvLyBiZSBzdXJlIHRvIGNoZWNrICdkb25lJyBmaXJzdCwgc28gc3RhcnRPZkRpZmZlcmVuY2VzIGlzbid0Ci0JCS8vIGljcmVtZW50ZWQgaWYgZG9uZSBpcyB0cnVlCi0JCWRvbmUgOiB3aGlsZSAoKCFkb25lKSAmJiAoKytzdGFydE9mRGlmZmVyZW5jZXMgPCBvbGRSZWdpb25zTGVuZ3RoKSkgewotCQkJSVRleHRSZWdpb24gb2xkUmVnaW9uID0gb2xkUmVnaW9ucy5nZXQoc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCS8vIHRoaXMgbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbiBpcyB0byBjaGVjayB0byBiZSBzdXJlIHRoZSBub2RlIGlzCi0JCQkvLyBpbmZhY3QgYSBjYW5kaWRhdGUKLQkJCS8vIHRvIGJlIGNvbnNpZGVyZWQgYXMgIm9sZCIuIFRoaXMgY2hlY2sgaXMgaW1wb3J0YW50IGZvciB0aGUgY2FzZQotCQkJLy8gd2hlcmUgc29tZQotCQkJLy8gdGV4dCBpcyByZXBsYWNlaW5nIHRleHQgdGhhdAotCQkJLy8gYXBwZWFycyBpZGVudGljYWwsIGJ1dCBpcyBhIGRpZmZlcmVudCBpbnN0YW5jZS4gRm9yIGV4YW1wbGUsIGlmCi0JCQkvLyB0aGUgdGV4dAotCQkJLy8gaXMgPFA+PEI+PC9CPjwvUD4gYW5kIDxCPjwvQj4gaXMgaW5zZXJ0ZWQgYXQgcG9zdGlvbiAzLAotCQkJLy8gcmVzdWx0aW5nIGluIDxQPjxCPjwvQj48Qj48L0I+PC9QPgotCQkJLy8gd2UgZG8gbm90IHdhbnQgdGhlCi0JCQkvLyBmaXJzdCA8Qj4gdG8gYmUgY29uc2lkZXJlZCBvbGQgLi4uIGl0IGlzIHRoZSBuZXcgb25lLCB0aGUKLQkJCS8vIHNlY29uZAotCQkJLy8gPEI+IGlzIHRoZSBvbGQgb25lLgotCQkJaWYgKF9sZXNzVGhhbkVmZmVjdGVkUmVnaW9uKG9sZE5vZGVQYXJhbSwgb2xkUmVnaW9uKSkgewotCQkJCS8vIGJlIHN1cmUgdG8gY2hlY2sgdGhhdCB3ZSBoYXZlIG5ldyBub2RlcyB0byBjb21wYXJlIGFnYWluc3QuCi0JCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IG5ld1JlZ2lvbnNMZW5ndGgpIHsKLQkJCQkJZm91bmREaWZmZXJlbmNlID0gZmFsc2U7Ci0JCQkJCWRvbmUgPSB0cnVlOwotCQkJCQljb250aW51ZSBkb25lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KHN0YXJ0T2ZEaWZmZXJlbmNlcyk7Ci0JCQkJCS8vIG5vdGU6IHNoaWZ0IGlzIDAgd2hpbGUgYXQgYmVnaW5uaW5nIG9mIGxpc3QsIGJlZm9yZSB0aGUKLQkJCQkJLy8gaW5zZXJ0aW9uIChvciBkZWxldGlvbikgcG9pbnQuIEFmdGVyIHRoYXQsIGl0IGlzCi0JCQkJCS8vIGZTdGFydCtmTGVuZ3RoRGlmZmVyZW5jZQotCQkJCQlpZiAoIShvbGROb2RlUGFyYW0uc2FtZUFzKG9sZFJlZ2lvbiwgbmV3Tm9kZVBhcmFtLCBuZXdSZWdpb24sIDApKSkgewotCQkJCQkJZm91bmREaWZmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJY29udGludWUgZG9uZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGlmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIHdlIHdpbGwgYmUga2VlcGluZyB0aGUgb2xkCi0JCQkJCQkvLyBvbmUuCi0JCQkJCQkvLyB1bmxpa2UgdGhlIGZsYXRub2RlIGNhc2UsIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwotCQkJCQkJLy8gdXBkYXRlCi0JCQkJCQkvLyB0aGUgdGV4dHN0b3JlLCBzaW5jZSBpdHMgdGhlIHNhbWUgdGV4dCBzdG9yZSBpbgotCQkJCQkJLy8gZWl0aGVyIGNhc2UKLQkJCQkJCS8vIChzaW5jZSBpdHMgdGhlIHNhbWUgZmxhdG5vZGUpCi0JCQkJCQkvL29sZFJlZ2lvbi5zZXRUZXh0U3RvcmUoZlN0cnVjdHVyZWREb2N1bWVudC5wYXJlbnREb2N1bWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIGRpZG4ndCBsaXRlcmFsbHkgZmluZCBhIGRpZmZlcmVuY2UsIGJ1dCB3ZSBjb3VudCBpdCBhcwotCQkJCS8vIHN1Y2ggYnkgaW1wbGljYXRpb24KLQkJCQlmb3VuZERpZmZlcmVuY2UgPSB0cnVlOwotCQkJCWRvbmUgPSB0cnVlOwotCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgbGl0ZXJhbGx5IGZvdW5kIGEgZGlmZmVyZW5jZSwgdGhlbiBhbGwgaXMgb2sgYW5kIHdlIGNhbgotCQkvLyByZXR1cm4KLQkJLy8gaXQuCi0JCS8vIGlmIHdlIGRpZCBub3QgbGl0ZXJhbGx5IGZpbmQgb25lLCB0aGVuIHdlIGhhdmUgdG8gZGVjaWRlIHdoeS4KLQkJaWYgKCFmb3VuZERpZmZlcmVuY2UpIHsKLQkJCWlmIChuZXdSZWdpb25zTGVuZ3RoID09IG9sZFJlZ2lvbnNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cyBhcmUKLQkJCQkvLyBpZGVudGljYWwgKGFuZCBtYXkKLQkJCQkvLyBiZSBvZiB6ZXJvIGxlbmd0aCkKLQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSAtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG5ld1JlZ2lvbnNMZW5ndGggPiBvbGRSZWdpb25zTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJCS8vIGlkZW50aWNhbCBleGNlcHQKLQkJCQkJLy8gZm9yIG5ld1JlZ2lvbnMKLQkJCQkJLy8gYWRkZWQKLQkJCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gb2xkUmVnaW9uc0xlbmd0aDsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobmV3UmVnaW9uc0xlbmd0aCA8IG9sZFJlZ2lvbnNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cwotCQkJCQkJLy8gYXJlIGlkZW50aWNhbAotCQkJCQkJLy8gZXhjZXB0IGZvcgotCQkJCQkJLy8gb2xkIE5vZGVzCi0JCQkJCQkvLyBkZWxldGVkCi0JCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBuZXdSZWdpb25zTGVuZ3RoOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydE9mRGlmZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogUGFydCAxIG9mIDIgc3RlcHMgdG8gZG8gYSBjb3JlX3JlcGFyc2UKLQkgKiAKLQkgKiBQYXJzZXMgYSBwb3J0aW9uIG9mIHRoZSBjdXJyZW50IHRleHQgaW4gdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYW5kCi0JICogcmV0dXJucyB0aGUgcmF3IHJlc3VsdAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBfY29yZV9yZXBhcnNlX3RleHQoaW50IHJlc2NhblN0YXJ0LCBpbnQgcmVzY2FuRW5kKSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVzZXRQYXJzZXIocmVzY2FuU3RhcnQsIHJlc2NhbkVuZCk7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpLmdldERvY3VtZW50UmVnaW9ucygpOwotCX0KLQotCS8qKgotCSAqIFBhcnQgMiBvZiAyIHN0ZXBzIHRvIGRvIGEgY29yZV9yZXBhcnNlCi0JICogCi0JICogSW50ZWdyYXRlcyBhIGxpc3Qgb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudAotCSAqIHRleHQgY29udGVudHMgb2YgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW50byB0aGUgSVN0cnVjdHVyZWREb2N1bWVudAotCSAqIGRhdGEgc3RydWN0dXJlCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBfY29yZV9yZXBhcnNlX3VwZGF0ZV9tb2RlbChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGVzSGVhZCwgaW50IHJlc2NhblN0YXJ0LCBpbnQgcmVzY2FuRW5kLCBDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIGJvb2xlYW4gZmlyc3RUaW1lKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUNvcmVOb2RlTGlzdCBuZXdOb2RlcyA9IG51bGw7Ci0JCS8vIHJlc2NhbgotCQluZXdOb2RlcyA9IG5ldyBDb3JlTm9kZUxpc3QobmV3Tm9kZXNIZWFkKTsKLQkJLy8gYWRqdXN0IG91ciBuZXdOb2RlIGNoYWluIHNvIHRoZSBvZmZzZXQgcG9zaXRpb25zIG1hdGNoCi0JCS8vIG91ciB0ZXh0IHN0b3JlIChub3QgdGhlIHNpbXBsZSBzdHJpbmcgb2YgdGV4dCByZXBhcnNlZCkKLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuYWRqdXN0U3RhcnQobmV3Tm9kZXNIZWFkLCByZXNjYW5TdGFydCk7Ci0JCS8vIGluaXRpYWxpemUgdGhlIHBhcmVudERvY3VtZW50IHZhcmlhYmxlIG9mIGVhY2ggaW5zdGFuY2UgaW4gdGhlIG5ldwotCQkvLyBjaGFpbgotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5zZXRQYXJlbnREb2N1bWVudChuZXdOb2Rlc0hlYWQsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgdmFyaWFibGUgb2YgZWFjaCBpbnN0YW5jZSBpbiB0aGUKLQkJLy8gbmV3IGNoYWluCi0JCS8vU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld05vZGVzSGVhZCwKLQkJLy8gZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vCi0JCWlmIChmaXJzdFRpbWUpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24obmV3Tm9kZXNIZWFkKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuaW5pdGlhbGl6ZUZpcnN0QW5kTGFzdERvY3VtZW50UmVnaW9uKCk7Ci0JCQkvLyBub3RlOiBzaW5jZSB3ZSBhcmUgaW5zZXJ0aW5nIG5vZGVzLCBmb3IgdGhlIGZpcnN0IHRpbWUsIHRoZXJlCi0JCQkvLyBpcwotCQkJLy8gbm8gYWRqdXN0bWVudHMKLQkJCS8vIHRvIGRvd25zdHJlYW0gc3R1ZmYgbmVjZXNzYXJ5LgotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGVzLCBuZXdOb2RlcywgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RlOiBpbnRlZ3JhdGVzIGNoYW5nZXMgaW50byBtb2RlbCBhcyBhIHNpZGUgZWZmZWN0Ci0JCQlyZXN1bHQgPSBtaW5pbXVtRXZlbnQob2xkTm9kZXMsIG5ld05vZGVzKTsKLQkJfQotCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvcmVOb2RlTGlzdCBfZm9ybU1pbmltdW1MaXN0KENvcmVOb2RlTGlzdCBmbGF0bm9kZXMsIGludCBzdGFydE9mRGlmZmVyZW5jZXMsIGludCBlbmRPZkRpZmZlcmVuY2VzKSB7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsTm9kZXMgPSBudWxsOwotCQkvLyBpZiBzdGFydE9mRGlmZmVyY2VzIGlzIHN0aWxsIGl0cyBpbml0aWFsIHZhbHVlLCB0aGVuIHdlIGhhdmUgYW4KLQkJLy8gZW1wdHkgZG9jdW1lbnQKLQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA9PSAtMSkgewotCQkJbWluaW1hbE5vZGVzID0gRU1QVFlfTElTVDsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHdlIGRvIG5vdCBoYXZlIGFueSBmbGF0bm9kZSBpbiBvdXIgZmxhdG5vZGUgbGlzdCwgdGhlbgotCQkJLy8gc2ltcGx5Ci0JCQkvLyByZXR1cm4gb3VyIHN0YW5kYXJkIGVtcHR5IGxpc3QKLQkJCWlmIChmbGF0bm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCW1pbmltYWxOb2RlcyA9IEVNUFRZX0xJU1Q7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGlmIHN0YXJ0T2ZEaWZmZXJlbmNlcyBpcyBncmVhdGVyIHRoYW4gZW5kT2ZEaWZmZXJlbmNlcywKLQkJCQkvLyB0aGVuCi0JCQkJLy8gdGhhdCBtZWFucyB0aGUgY2FsY3VsYXRpb25zICJjcm9zc2VkIiBlYWNoIG90aGVyLCBhbmQKLQkJCQkvLyBoZW5jZSwKLQkJCQkvLyB0aGVyZSByZWFsbHkgaXMgbm8gZGlmZmVyZW5jZXMsIHNvLCBhZ2FpbiwgcmV0dXJuIHRoZSBlbXB0eQotCQkJCS8vIGxpc3QKLQkJCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gZW5kT2ZEaWZmZXJlbmNlcykgewotCQkJCQltaW5pbWFsTm9kZXMgPSBFTVBUWV9MSVNUOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoZSBsYXN0IGNoZWNrIGJlIHN1cmUgd2UgaGF2ZSBzb21lIGRpZmZlcm5jZXMKLQkJCQkJaWYgKChlbmRPZkRpZmZlcmVuY2VzID4gLTEpKSB7Ci0JCQkJCQltaW5pbWFsTm9kZXMgPSBuZXcgQ29yZU5vZGVMaXN0KGZsYXRub2Rlcy5pdGVtKHN0YXJ0T2ZEaWZmZXJlbmNlcyksIGZsYXRub2Rlcy5pdGVtKGVuZE9mRGlmZmVyZW5jZXMpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHRoZXJlIHdlcmUgbm8gZGlmZmVyZW5jZXMsIHRoZSBsaXN0IHdhc24ndAotCQkJCQkJLy8gbWluaW1pemVkLCBzbyBzaW1wbHkgcmV0dXJuIGl0LgotCQkJCQkJbWluaW1hbE5vZGVzID0gZmxhdG5vZGVzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtaW5pbWFsTm9kZXM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIF9ncmVhdGVyVGhhbkVmZmVjdGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgbm9kZVN0YXJ0ID0gb2xkTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgY2hhbmdlZFJlZ2lvbkVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlyZXN1bHQgPSBub2RlU3RhcnQgPiBjaGFuZ2VkUmVnaW9uRW5kOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIG9sZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBvbGROb2RlLmdldFN0YXJ0T2Zmc2V0KG9sZFJlZ2lvbik7Ci0JCWludCBlZmZlY3RlZFJlZ2lvbkVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlyZXN1bHQgPSByZWdpb25TdGFydE9mZnNldCA+IGVmZmVjdGVkUmVnaW9uRW5kOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVFbmQgPSBvbGROb2RlLmdldEVuZE9mZnNldCgpIC0gMTsKLQkJcmVzdWx0ID0gbm9kZUVuZCA8IGZTdGFydDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2xlc3NUaGFuRWZmZWN0ZWRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbiBvbGRSZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVFbmQgPSBvbGROb2RlLmdldEVuZE9mZnNldChvbGRSZWdpb24pIC0gMTsKLQkJcmVzdWx0ID0gbm9kZUVuZCA8IGZTdGFydDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX3JlZ2lvbnNTYW1lS2luZChJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIElUZXh0UmVnaW9uIG9sZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiBvbmUgcmVnaW9uIGlzIGEgY29udGFpbmVyIHJlZ2lvbiwgYW5kIHRoZSBvdGhlciBub3QsIGFsd2F5cwotCQkvLyByZXR1cm4gZmFsc2UKLQkJLy8gZWxzZSwganVzdCBjaGVjayB0aGVpciB0eXBlLgotCQkvLyAgICAgIERXIGRydWluZyByZWZhY3RvcmluZywgbG9va3MgbGlrZSBhICJ0eXBvIiBoZXJlLCB1c2luZyAnb2xkJyBpbgotCQkvLyBib3RoLgotCQkvLwkJaWYgKGlzQ29udGFpbmVyUmVnaW9uKG9sZFJlZ2lvbikgIT0gaXNDb250YWluZXJSZWdpb24ob2xkUmVnaW9uKSkKLQkJaWYgKGlzQ29sbGVjdGlvblJlZ2lvbihvbGRSZWdpb24pICE9IGlzQ29sbGVjdGlvblJlZ2lvbihuZXdSZWdpb24pKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKG9sZFJlZ2lvbi5nZXRUeXBlKCkgPT0gbmV3UmVnaW9uLmdldFR5cGUoKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8JcHJpdmF0ZSBib29sZWFuIGhhc0NvbGxlY3Rpb25SZWdpb25zKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkvLwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkvLwkJaWYgKGFSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkvLwkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb25Db250YWludGVyID0gKElUZXh0UmVnaW9uQ29sbGVjdGlvbikKLQkvLyBhUmVnaW9uOwotCS8vCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSByZWdpb25Db250YWludGVyLmdldFJlZ2lvbnMoKTsKLQkvLwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCS8vCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCS8vCQkJCWlmIChhUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JLy8JCQkJCXJlc3VsdCA9IHRydWU7Ci0JLy8JCQkJCWJyZWFrOwotCS8vCQkJCX0KLQkvLwkJCX0KLQkvLwkJfQotCS8vCQlyZXR1cm4gcmVzdWx0OwotCS8vCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBzcGVjaWZpY2FsbHkgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gJ2lzRW5kZWQnIHN0YXRlLAotCSAqIGFsdGhvdWdoIGl0IHN0aWxsIGRvZXMgc28gd2l0aCBoZXVyaXN0aWNzLiBJZiBudW1iZXIgb2YgJz4nIGNoYW5nZXMsCi0JICogYXNzdW1lIHRoZSBpc0VuZGVkIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2VJbklzRW5kZWRTdGF0ZShTdHJpbmcgb2xkVGV4dCwgU3RyaW5nIG5ld1RleHQpIHsKLQkJaW50IG5PbGQgPSBTdHJpbmdVdGlscy5vY2N1cnJlbmNlc09mKG9sZFRleHQsICc+Jyk7Ci0JCWludCBuTmV3ID0gU3RyaW5nVXRpbHMub2NjdXJyZW5jZXNPZihuZXdUZXh0LCAnPicpOwotCQlyZXR1cm4gIShuT2xkID09IG5OZXcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0FuZEFzc2lnblBhcmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KG9sZE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiB0ZXh0UmVnaW9uQ29sbGVjdGlvbiA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbjsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gdGV4dFJlZ2lvbkNvbGxlY3Rpb24uZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gaW5uZXJSZWdpb24gPSByZWdpb25MaXN0LmdldChpKTsKLQkJCQljaGVja0FuZEFzc2lnblBhcmVudChvbGROb2RlLCBpbm5lclJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIGNoYW5nZSB0byBhIENEQVRBIHRhZyBjYW4gcmVzdWx0IGluIGFsbCBiZWluZyByZXBhcnNlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ0RBVEEoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwhW0NEQVRBWyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIl1dPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgYSBjb21tZW50IHN0YXJ0IG9yIGVuZCB0YWcgaXMgYmVpbmcgYWRkZWQgb3IgZGVsZXRlZCwgd2UnbGwgcmVzY2FuCi0JICogdGhlIHdob2xlIGRvY3VtZW50LiBUaGUgcmVhc29uIGlzIHRoYXQgY29udGVudCB0aGF0IGlzIHJldmVhbGVkIG9yCi0JICogY29tbWVudGVkIG91dCBjYW4gZWZmZWN0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmVzdCBvZiB0aGUKLQkgKiBkb2N1bWVudC4gTm90ZTogZm9yIG5vdyB0aGlzIGlzIHZlcnkgWE1MIHNwZWNpZmljLCBjYW4gcmVmYWN0b3IvaW1wcm92ZQotCSAqIGxhdGVyLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNvbW1lbnRzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8IS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiLS0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gd2UnbGwgYWxzbyBjaGVjayBmb3IgdGhlc2UgZGVnZW5lcmF0ZSBjYXNlcwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8IS0tLT4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbW1vbiB1dGlsaXR5IGZvciBjaGVja2luZyBmb3IgY3JpdGljYWwgd29yZCBzdWNoIGFzICIgPFNDUklQVD4iCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3JpdGljYWxLZXkoU3RyaW5nIGNyaXRpY2FsVGFyZ2V0KSB7Ci0JCXJldHVybiBfY2hlY2tGb3JDcml0aWNhbFdvcmQoY3JpdGljYWxUYXJnZXQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gdXRpbGl0eSBmb3IgY2hlY2tpbmcgZm9yIGNyaXRpY2FsIHdvcmQgc3VjaCBhcyAiIDxTQ1JJUFQ+IgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcml0aWNhbE5hbWUoU3RyaW5nIGNyaXRpY2FsVGFyZ2V0KSB7Ci0JCXJldHVybiBfY2hlY2tGb3JDcml0aWNhbFdvcmQoY3JpdGljYWxUYXJnZXQsIHRydWUpOwotCX0KLQotCS8vCS8qKgotCS8vCSAqIEN1cnJlbnRseSB0aGlzIG1ldGhvZCBpcyBwcmV0dHkgc3BlY2lmaWMgdG8gP01MCi0JLy8JICogQGRlcHJlY2F0ZWQgLSBub3QgcmVhbGx5IGRlcHJlY2F0ZWQsIGJ1dCBwbGFuIHRvIG1ha2UKLQkvLwkgKiBwcm90ZWN0ZWQgLi4uIEknbSBub3Qgc3VyZSB3aHkgaXRzIHB1YmxpYyBvciBtaXNzcGVsbGVkPwotCS8vCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBDYXNlIDE6IFNlZSBpZiB0aGUgbGFuZ3VhZ2UncyBzeW50YXggcmVxdWlyZXMgdGhhdCBtdWx0aXBsZQotCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGJlIHJlc2Nhbm5lZAotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25TeW50YXgoKTsKLQkJfQotCQkvLyBDYXNlIDI6ICJibG9jayB0YWdzIiB3aG9zZSBjb250ZW50IGlzIGxlZnQgdW5wYXJzZWQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlPYmplY3QgcGFyc2VyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJCWlmIChwYXJzZXIgaW5zdGFuY2VvZiBCbG9ja1RhZ1BhcnNlcikgewotCQkJCUxpc3QgYmxvY2tUYWdzID0gKChCbG9ja1RhZ1BhcnNlcikgcGFyc2VyKS5nZXRCbG9ja01hcmtlcnMoKTsKLQkJCQlyZXN1bHQgPSBfY2hlY2tCbG9ja05vZGVMaXN0KGJsb2NrVGFncyk7Ci0JCQl9Ci0JCX0KLQkJLy8gRlVUVVJFX1RPX0RPOiBpcyB0aGVyZSBhIGJldHRlciBwbGFjZSB0byBkbyB0aGlzPwotCQkvLyBvciEgZG8gd2UgYWxyZWFkeSBkbyBpdCBzb21lIG90aGVyIG1vcmUgY2VudHJhbCBwbGFjZT8KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFsbG93IGEgcmVwYXJzZXIgdG8gY2hlY2sgZm9yIGV4dHJhIHN5bnRhY3RpYyBjYXNlcyB0aGF0IHJlcXVpcmUKLQkgKiBwYXJzaW5nIGJleW9uZCB0aGUgZmxhdE5vZGUgYm91bmRhcnkuCi0JICogCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IFhNTC1jZW50cmljLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uU3ludGF4KCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQ7Ci0JCS8vIENhc2UgMTogUXVvdGUgY2hhcmFjdGVycyBhcmUgaW52b2x2ZWQKLQkJcmVzdWx0ID0gY2hlY2tGb3JRdW90ZXMoKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBDYXNlIDI6IFRoZSBpbnB1dCBmb3JtcyBvciB1bmRvZXMgYSBjb21tZW50IGJlZ2lubmluZyBvcgotCQkJLy8gY29tbWVudAotCQkJLy8gZW5kCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNvbW1lbnRzKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBDYXNlIDM6IFRoZSBpbnB1dCBmb3JtcyBvciB1bmRvZXMgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi0JCQlyZXN1bHQgPSBjaGVja0ZvclBJKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBDYXNlIDQ6IFRoZSBpbnB1dCBmb3JtcyBvciB1bmRvZXMgYSBDREFUQSBzZWN0aW9uCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNEQVRBKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIGNoYW5nZSByZXF1ZXN0IGV4YWN0bHkgbWF0Y2hlcyB0aGUgdGV4dCBpdCB3b3VsZCBiZQotCSAqIHJlcGxhY2luZy4gKEluIGZ1dHVyZSwgdGhpcywgb3Igc2ltaWxhciBtZXRob2QgaXMgd2hlcmUgdG8gY2hlY2sgZm9yCi0JICogInJlYWQgb25seSIgYXR0ZW1wdGVkIGNoYW5nZS4pCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0Zvck5vQ2hhbmdlKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBkb24ndCBjaGVjayBlcXVhbHMgdW5sZXNzIGxlbmd0aHMgbWF0Y2gKLQkJLy8gc2hvdWxkIGJlIGEgdGlueSBiaXQgZmFzdGVyLCBzaW5jZSB1c3VhbGx5IG5vdAotCQkvLyBvZiBlcXVhbCBsZW5ndGhzIChJJ20gc3VycHJpc2VkIFN0cmluZydzIGVxdWFscyBtZXRob2QKLQkJLy8gZG9lc24ndCBkbyB0aGlzLikKLQkJaWYgKChmQ2hhbmdlcyAhPSBudWxsKSAmJiAoZkRlbGV0ZWRUZXh0ICE9IG51bGwpICYmIChmQ2hhbmdlcy5sZW5ndGgoKSA9PSBmRGVsZXRlZFRleHQubGVuZ3RoKCkpICYmIChmQ2hhbmdlcy5lcXVhbHMoZkRlbGV0ZWRUZXh0KSkpIHsKLQkJCXJlc3VsdCA9IG5ldyBOb0NoYW5nZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQSBjaGFuZ2UgdG8gYSBQSSB0YWcgY2FuIHJlc3VsdCBpbiBhbGwgYmVpbmcgcmVwYXJzZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvclBJKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8PyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyAgRm9yIHNpbXBsaWNpdHksIGlmIGVpdGhlciB0ZXh0IHRvIGJlIGRlbGV0ZWQsIG9yIHRleHQgdG8gYmUgaW5zZXJ0ZWQKLQkvLyBjb250YWlucyBhdCBsZWFzdAotCS8vICBvbmUgcXVvdGUsIHdlJ2xsIHNlYXJjaCBmb3IgcHJldmlvdXMgcXVvdGUgaW4gZG9jdW1lbnQsIGlmIGFueSwgYW5kIHVzZQotCS8vIHRoYXQgZmxhdG5vZGUgYXMKLQkvLyAgYSBkaXJ0eSBzdGFydCwgYW5kIHdlJ2xsIHVzZSBlbmQgb2YgZG9jdW1lbnQgYXMgZGlydHkgZW5kLiBXZSBuZWVkIHRvCi0JLy8gYXNzdW1lIGVpdGhlciBcIiBvcgotCS8vICBcJyBpcyBhbiBleGNlcHRhYmxlIHF1b3RlLiAoTk9URTogdGhpcyBpcywgbG9vc2VseSwgYW4gWE1MIGFzc3VtcHRpb24KLQkvLyAtLQotCS8vIG90aGVyIGxhbmd1YWdlcwotCS8vICB3b3VsZCBkaWZmZXIsIGJ1dCB3ZSdsbCAiaGFyZCBjb2RlIiBmb3IgWE1MIGZvciBub3cuCi0JLy8gZnV0dXJlX1RPRE86IHRoaXMgaXMgYSByZWFsbHkgYmFkIGhldXJpc3RpYyAuLi4gd2Ugc2hvdWxkIGJlIGxvb2tpbmcKLQkvLyBmb3IKLQkvLyBvZGQgbnVtYmVyIG9mIHF1b3RlcwotCS8vIHdpdGhpbiBhIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAob3Igc29tZXRoaW5nISkgVGhpcyBjYXVzZXMgd2F5IHRvbwotCS8vIG11Y2ggcmVwYXJzaW5nIG9uCi0JLy8gc2ltcGxlIGNhc2VzLCBsaWtlIGRlbGV0aW5nIGEgdGFnIHdpdGggYSBxdW90ZWQgYXR0cmlidXRlIQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JRdW90ZXMoKSB7Ci0JCS8vIHJvdXRpbmUgaXMgc3VwcG9ydGVkIHdpdGggbnVsbCBvciBlbXB0eSBzdHJpbmcgbWVhbmluZyB0aGUgc2FtZQotCQkvLyB0aGluZzogZGVsZXRpb24KLQkJaWYgKGZDaGFuZ2VzID09IG51bGwpCi0JCQlmQ2hhbmdlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgZGlydHlTdGFydFBvcyA9IC0xOwotCQkJU3RyaW5nIHByb3Bvc2VkRGVsZXRpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJaWYgKGZTdGFydCA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlpZiAoKGZDaGFuZ2VzLmluZGV4T2Yoc2luZ2xlUXVvdGUpID4gLTEpIHx8IChwcm9wb3NlZERlbGV0aW9uLmluZGV4T2Yoc2luZ2xlUXVvdGUpID4gLTEpKSB7Ci0JCQkJCUlSZWdpb24gc2luZ2xlUXVvdGVSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoZlN0YXJ0LCBzaW5nbGVRdW90ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCQlpZiAoc2luZ2xlUXVvdGVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJZGlydHlTdGFydFBvcyA9IHNpbmdsZVF1b3RlUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgoZkNoYW5nZXMuaW5kZXhPZihkb3VibGVRdW90ZSkgPiAtMSkgfHwgKHByb3Bvc2VkRGVsZXRpb24uaW5kZXhPZihkb3VibGVRdW90ZSkgPiAtMSkpIHsKLQkJCQkJSVJlZ2lvbiBkb3VibGVRdW90ZVJlZ2lvbiA9IGdldEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKCkuZmluZChmU3RhcnQsIGRvdWJsZVF1b3RlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChkb3VibGVRdW90ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlkaXJ0eVN0YXJ0UG9zID0gZG91YmxlUXVvdGVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlydHlTdGFydFBvcyA+IC0xKSB7Ci0JCQkJLy8gdGhlbiB3ZSBmb3VuZCBvbmUsIGRvIGNyZWF0ZSBuZXcgc3RydWN0dXJlZERvY3VtZW50IGV2ZW50Ci0JCQkJLy8gYmFzZWQgb24gdGhlIHByZXZpb3VzIHF1b3RlIHRvIGVuZCBvZiBkb2N1bWVudAotCQkJCS8vIGV4Y2VwdCwgd2UgbmVlZCB0byBiZSBwb3NpdGl2ZSB0aGF0IHRoZSBwcmV2aW91cyBxdW90ZSBpcwotCQkJCS8vIGluIGEgInNhZmUgc3RhcnQiIHJlZ2lvbiAoZS5nLiBpZiBpbiBKU1AgY29udGVudCwgd2UgbmVlZAotCQkJCS8vIHRvCi0JCQkJLy8gYmFja3VwIHRpbGwgd2UgaW5jbHVkZSB0aGUgd2hvbGUgSlNQIHJlZ2lvbiwgaW4gb3JkZXIgZm9yCi0JCQkJLy8gaXQKLQkJCQkvLyB0byBiZSBjb3JyZWN0bHkgcmUtcGFyc2VkLiBUaGUgYmFja2luZyB1cCBpcyBkb25lIGluIHRoZQotCQkJCS8vIHJlcGFyc2UvZmluZCBkaXJ0eSBzdGFydCBmcm9tIGhpbnQKLQkJCQkvLyBtZXRob2QuCi0JCQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0UG9zLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tIZXVyaXN0aWNzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0Zvck5vQ2hhbmdlKCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJvdW5kcnlDYXNlcygpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVpY2tDaGVjaygpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGFrZXMgaW50byBhY2NvdW50ICJ0YWcgbmFtZSIgcnVsZXMgZm9yIGNvbXBhcmlzb25zOyBjYXNlLWluc2Vuc2l0aXZlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1RhZ05hbWVzKFN0cmluZyBjb21wYXJlVGV4dCwgU3RyaW5nIGNyaXRpY2FsVGFyZ2V0LCBib29sZWFuIGNoZWNrRW5kKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmICgoY29tcGFyZVRleHQgPT0gbnVsbCkgfHwgKGNyaXRpY2FsVGFyZ2V0ID09IG51bGwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgcG9zT2ZDcml0aWNhbFdvcmQgPSBjb21wYXJlVGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoY3JpdGljYWxUYXJnZXQudG9Mb3dlckNhc2UoKSk7Ci0JCXJlc3VsdCA9IHBvc09mQ3JpdGljYWxXb3JkID4gLTE7Ci0JCWlmIChjaGVja0VuZCAmJiByZXN1bHQpIHsKLQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRydWUgcmlnaHQgYXdheSwgd2UnbGwgb25seSByZXR1cm4gdHJ1ZQotCQkJLy8gdGhlCi0JCQkvLyBwb3RlbnRpYWxseSBtYXRjaGVkIHRhZyBpcyBpbmRlZWQgYSB0YWcsIGZvciBleGFtcGxlLCBpZgotCQkJLy8gPFNDUklQVAotCQkJLy8gYmVjb21lcyA8U0NSSVBUUyB3ZSBkb24ndCB3YW50IHRvIHNheSB0aGUgbGF0dGVyIGlzIGEgY3JpdGljYWwKLQkJCS8vIHRhZwotCQkJaW50IGxhc3RQb3MgPSBwb3NPZkNyaXRpY2FsV29yZCArIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpOwotCQkJaWYgKGxhc3RQb3MgPCBjb21wYXJlVGV4dC5sZW5ndGgoKSkgewotCQkJCWNoYXIgbGFzdENoYXIgPSBjb21wYXJlVGV4dC5jaGFyQXQobGFzdFBvcyk7Ci0JCQkJLy8gRnV0dXJlOiBjaGVjayBmb3JtYWwgZGVmaW5pdGlvbiBvZiB0aGlzIGphdmEgbWV0aG9kLCB2cy4KLQkJCQkvLyBYTUwKLQkJCQkvLyBwYXJzaW5nIHJ1bGVzCi0JCQkJcmVzdWx0ID0gKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGxhc3RDaGFyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29yZSByZXBhcnNpbmcgbWV0aG9kIC4uLiBhZnRlciB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5IGVuZCBoYXZlCi0JICogYmVlbiBjYWxjdWxhdGVkIGVsc2V3aGVyZSwgYW5kIHRoZSB0ZXh0IHVwZGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNvcmVfcmVwYXJzZShpbnQgcmVzY2FuU3RhcnQsIGludCByZXNjYW5FbmQsIENvcmVOb2RlTGlzdCBvbGROb2RlcywgYm9vbGVhbiBmaXJzdFRpbWUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2Rlc0hlYWQgPSBudWxsOwotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQluZXdOb2Rlc0hlYWQgPSBfY29yZV9yZXBhcnNlX3RleHQocmVzY2FuU3RhcnQsIHJlc2NhbkVuZCk7Ci0JCXJlc3VsdCA9IF9jb3JlX3JlcGFyc2VfdXBkYXRlX21vZGVsKG5ld05vZGVzSGVhZCwgcmVzY2FuU3RhcnQsIHJlc2NhbkVuZCwgb2xkTm9kZXMsIGZpcnN0VGltZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHN0YXRlIHRvICJub3QgcGFyc2luZyIKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGVuZFJlUGFyc2UoKSB7Ci0JCWlzUGFyc2luZyA9IGZhbHNlOwotCQlkaXJ0eVN0YXJ0ID0gbnVsbDsKLQkJZGlydHlFbmQgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmREaXJ0eUVuZChpbnQgZW5kKSB7Ci0JCS8vIENhdXRpb246IGhlcmUncyBvbmUgcGxhY2Ugd2UgaGF2ZSB0byBjYXN0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQpOwotCQkvLyBpZiBub3Qgd2VsbCBmb3JtZWQsIGdldCBvbmUgcGFzdCwgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlCi0JCWlmICgocmVzdWx0ICE9IG51bGwpICYmICghcmVzdWx0LmlzRW5kZWQoKSkpIHsKLQkJCWlmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JCS8vIGFsc28sIGdldCBvbmUgcGFzdCBpZiBleGFjdGx5IGVxdWFsIHRvIHRoZSBlbmQgKHRoaXMgd2FzIG5lZWRlZAotCQkvLyBhcyBhIHNpbXBsZSBmaXggdG8gd2hlbiBhIHdob2xlIGV4YWN0IHJlZ2lvbiBpcyBkZWxldGVkLgotCQkvLyB0aGVyZSdzIHByb2JhYmx5IGEgYmV0dGVyIHdheS4KLQkJaWYgKChyZXN1bHQgIT0gbnVsbCkgJiYgKGVuZCA9PSByZXN1bHQuZ2V0RW5kKCkpKSB7Ci0JCQlpZiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJCX0KLQkJfQotCQkvLyBtb3ZlZCB0byBzdWJjbGFzcyBmb3IgcXVpY2sgdHJhbnNpdGlvbgotCQkvLyAxMi82LzIwMDEgLSBTaW5jZSB3ZSd2ZSBjaGFuZ2VkIHRoZSBwYXJzZXIvc2Nhbm5lciB0byBhbGxvdyBhIGxvbmUKLQkJLy8gJzwnIHdpdGhvdXQKLQkJLy8gYWx3YXlzIGludGVycHJldHRpbmcgaXQgYXMgc3RhcnQgb2YgYSB0YWcgbmFtZSwgd2UgbmVlZCB0byBiZSBhCi0JCS8vIGxpdHRsZSBmYW5jaWVyLCBpbiBvcmRlcgotCQkvLyB0byAic2tpcCIgb3ZlciBhbnkgcGxhaW4gJ29sIGNvbnRlbnQgYmV0d2VlbiB0aGUgbG9uZSAnPCcgYW5kIGFueQotCQkvLyBwb3RlbnRpYWwgbWVhdGluZwotCQkvLyByZWdpb25zIHBhc3QgcGxhaW4gJ29sIGNvbnRlbnQuCi0JCS8vCQlpZiAoaXNMb25lT3BlbkZvbGxvd2VkQnlDb250ZW50KHJlc3VsdCkgJiYgKHJlc3VsdC5nZXROZXh0KCkgIT0KLQkJLy8gbnVsbCkpIHsKLQkJLy8JCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkvLwkJfQotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWRpcnR5RW5kID0gcmVzdWx0OwotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluZERpcnR5U3RhcnQoaW50IHN0YXJ0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCS8vIGhldXJpc3RpYzogaWYgdGhlIHBvc3Rpb24gaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgc3RhcnQsIHRoZW4KLQkJLy8gZ28gYmFjayBvbmUgbW9yZSwgaWYgaXQgZXhpc3RzLiBUaGlzIHByZXZlbnRzIHByb2JsZW1zIHdpdGgKLQkJLy8gaW5zZXJ0aW9ucwotCQkvLyBvZiB0ZXh0IHRoYXQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBwcmV2aW91cyBub2RlIGluc3RlYWQgb2YKLQkJLy8gc2ltcGx5IGh1bmcKLQkJLy8gb2ZmIG9mIGl0IGFzIGEgc2VwYXJhdGUgbm9kZSAoZXguOiBYTUwgY29udGVudCBpbnNlcnRlZCByaWdodAotCQkvLyBiZWZvcmUKLQkJLy8gYW4gb3BlbgotCQkvLyBicmFja2V0IHNob3VsZCBiZWNvbWUgcGFydCBvZiB0aGUgcHJldmlvdXMgY29udGVudCBub2RlKQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSByZXN1bHQuZ2V0UHJldmlvdXMoKTsKLQkJCWlmICgocHJldmlvdXMgIT0gbnVsbCkgJiYgKCghKHByZXZpb3VzLmlzRW5kZWQoKSkpIHx8IChzdGFydCA9PSByZXN1bHQuZ2V0U3RhcnQoKSkpKSB7Ci0JCQkJcmVzdWx0ID0gcHJldmlvdXM7Ci0JCQl9Ci0JCQkvLyBJZiB3ZSBhcmUgbm93IGF0IHRoZSBlbmQgb2YgYSAidGFnIGRlcGVuZGVudCIgY29udGVudCBhcmVhIChvcgotCQkJLy8gSlNQIGFyZWEpCi0JCQkvLyB0aGVuIHdlIG5lZWQgdG8gYmFjayB1cCBhbGwgdGhlIHdheSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoYXQuCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBvdGVudGlhbCA9IHJlc3VsdDsKLQkJCS8vIG1vdmVkIHRvIHN1YmNsYXNzIHRvIHNwZWVkIHRyYW5zaXRpb24KLQkJCS8vCQkJd2hpbGUgKGlzUGFydE9mQmxvY2tSZWdpb24ocG90ZW50aWFsKSkgewotCQkJLy8JCQkJcG90ZW50aWFsID0gcG90ZW50aWFsLmdldFByZXZpb3VzKCk7Ci0JCQkvLwkJCX0KLQkJCWlmIChwb3RlbnRpYWwgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHBvdGVudGlhbDsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJZGlydHlTdGFydCA9IHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29yZU5vZGVMaXN0IGZvcm1PbGROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJQ29yZU5vZGVMaXN0IG9sZE5vZGVzID0gbmV3IENvcmVOb2RlTGlzdChkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JCS8vIE5vdyBzYXZlIHRoZSBvbGQgdGV4dCwgdGhhdCAiZ29lcyB3aXRoIiB0aGUgb2xkIG5vZGVzIGFuZCByZWdpb25zLgotCQkvLyBOb3RpY2Ugd2UgYXJlIGdldHRpbmcgaXQgZGlyZWN0bHkgZnJvbSB0aGUgdGV4dCBzdG9yZQotCQlTdHJpbmcgb2xkVGV4dCA9IG51bGw7Ci0JCWludCBvbGRTdGFydCA9IC0xOwotCQlpbnQgb2xkRW5kID0gLTE7Ci0JCS8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBzb21lIHRleHQsIGlmIG5vdCwgdXNlIGVtcHR5IHN0cmluZwotCQkvLyAoaWYgb25lIG5vZGUgaXMgbm90IG51bGwsIHRoZSBvdGhlciBzaG91bGQgQUxXQVlTIGJlIG5vdCBudWxsIHRvbywKLQkJLy8gc2luY2UgaXQKLQkJLy8gd291bGQgYXQgbGVhc3QgYmUgZXF1YWwgdG8gaXQuKQotCQlpZiAoZGlydHlTdGFydCAhPSBudWxsKSB7Ci0JCQlvbGRTdGFydCA9IGRpcnR5U3RhcnQuZ2V0U3RhcnQoKTsKLQkJCW9sZEVuZCA9IGRpcnR5RW5kLmdldEVuZCgpOwotCQkJb2xkVGV4dCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KG9sZFN0YXJ0LCBvbGRFbmQgLSBvbGRTdGFydCk7Ci0JCX0gZWxzZSB7Ci0JCQlvbGRTdGFydCA9IDA7Ci0JCQlvbGRFbmQgPSAwOwotCQkJb2xkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gY3JlYXRlIGEgdGVtcG9yYXJ5IHRleHQgc3RvcmUgZm9yIHRoaXMgdGV4dAotCQlTdWJTZXRUZXh0U3RvcmUgc3ViVGV4dFN0b3JlID0gbmV3IFN1YlNldFRleHRTdG9yZShvbGRUZXh0LCBvbGRTdGFydCwgb2xkRW5kLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJLy8gTm93IHVwZGF0ZSB0aGUgdGV4dCBzdG9yZSBvZiB0aGUgb2xkTm9kZXMKLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0UGFyZW50RG9jdW1lbnQob2xkTm9kZXMsIG5ldyBNaW5pbWFsRG9jdW1lbnQoc3ViVGV4dFN0b3JlKSk7Ci0JCXJldHVybiBvbGROb2RlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpIHsKLQkJaWYgKGZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciA9PSBudWxsKSB7Ci0JCQlmRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgPSBuZXcgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQkJcmV0dXJuIGZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcjsKLQl9Ci0KLQkvLyBOb3RlOiBpZiB0aGVhZCBzYWZldHkgaXMgbmVlZGVkLCB0aGlzIGFuZCBhbGwgdGhlIG90aGVyIHB1YmxpYyBtZXRob2RzCi0JLy8gb2YgdGhpcyBjbGFzcwotCS8vIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQuCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCWlzUGFyc2luZyA9IHRydWU7Ci0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoVG9SZXBsYWNlID0gbGVuZ3RoVG9SZXBsYWNlOwotCQlmQ2hhbmdlcyA9IGNoYW5nZXM7Ci0JCS8vIG5vdGljZSB0aGlzIG9uZSBpcyBkZXJpdmVkCi0JCWZMZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoZkNoYW5nZXMsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQlmRGVsZXRlZFRleHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNPbGROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRPbGROb2RlLCBDb3JlTm9kZUxpc3QgbmV3Tm9kZXMpIHsKLQkJLy8KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5ldyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5ldyA9IG51bGw7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkUHJldmlvdXMgPSBwcmV2aW91c09sZE5vZGU7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTmV4dCA9IG5leHRPbGROb2RlOwotCQkvLwotCQlpZiAobmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBnZXQgcG9pbnRlcnMKLQkJCWZpcnN0TmV3ID0gbmV3Tm9kZXMuaXRlbSgwKTsKLQkJCWxhc3ROZXcgPSBuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSk7Ci0JCQkvLyBzd2l0Y2ggc3Vycm91bmRpbmcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucycgcmVmZXJlbmNlcyB0bwotCQkJLy8gbGlzdHMKLQkJCWlmIChvbGRQcmV2aW91cyAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzLnNldE5leHQoZmlyc3ROZXcpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkgewotCQkJCW9sZE5leHQuc2V0UHJldmlvdXMobGFzdE5ldyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFNJREUgRUZGRUNUCi0JCQkJLy8gaWYgb2xkTmV4dCBpcyBudWxsLCB0aGF0IG1lYW5zIHdlIGFyZSByZXBsYWNlaW5nIHRoZQotCQkJCS8vIGxhc3ROb2RlIGluIHRoZSBjaGFpbiwKLQkJCQkvLyBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RydWN0dXJlZERvY3VtZW50cyBsYXN0Tm9kZSBhcwotCQkJCS8vIHRoZQotCQkJCS8vIGxhc3Qgb2YgdGhlIG5ldyBub2Rlcy4KLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldExhc3REb2N1bWVudFJlZ2lvbihuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSkpOwotCQkJfQotCQkJaWYgKGZpcnN0TmV3ICE9IG51bGwpCi0JCQkJZmlyc3ROZXcuc2V0UHJldmlvdXMob2xkUHJldmlvdXMpOwotCQkJaWYgKGxhc3ROZXcgIT0gbnVsbCkKLQkJCQlsYXN0TmV3LnNldE5leHQob2xkTmV4dCk7Ci0JCX0KLQkJLy8gZWxzZSBub3RoaW5nIHRvIGluc2VydAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRSZWdpb24KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb2xsZWN0aW9uUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJcmV0dXJuIChhUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNpbmcoKSB7Ci0JCXJldHVybiBpc1BhcnNpbmc7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1pbmltaXphdGlvbiBhbGdvcml0aG0gc2ltcGx5IGNoZWNrcyB0aGUgb2xkIG5vZGVzIHRvIHNlZSBpZiBhbnkgb2YKLQkgKiB0aGVtICJzdXJ2aXZlZCIgdGhlIHJlc2NhbiBhbmQgYXJlIHVuY2hhbmdlZC4gSWYgc28sIHRoZSBpbnN0YW5jZSBvZgotCSAqIHRoZSBvbGQgbm9kZSBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIG5ldyBub2RlLiBCZWZvcmUgdGhlIHJlcXVlc3RlZAotCSAqIGNoYW5nZSwgbmVlZCB0byBjaGVjayB0eXBlLCBvZmZzZXRzLCBhbmQgdGV4dCB0byBkZXRlcm1pbmUgaWYgdGhlIHNhbWUuCi0JICogQWZ0ZXIgdGhlIHJlcXVlc3RlZCBjaGFuZ2UsIG5lZWQgdG8gY2hlY2sgdHlwZSBhbmQgdGV4dCwgYnV0IGFkanVzdCB0aGUKLQkgKiBvZmZzZXRzIHRvIHdoYXQgZXZlciB0aGUgY2hhbmdlIHdhcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgbWluaW11bUV2ZW50KENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJQ29yZU5vZGVMaXN0IG1pbmltYWxPbGROb2RlcyA9IG51bGw7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsTmV3Tm9kZXMgPSBudWxsOwotCQkvLyBUbyBtaW5pbWl6ZSBub2Rlcywgd2UnbGwgY29sbGVjdCBhbGwgdGhvc2UKLQkJLy8gdGhhdCBhcmUgbm90IGVxdWFsIGludG8gb2xkIGFuZCBuZXcgbGlzdHMKLQkJLy8gTm90ZTogd2UgYXNzdW1lIHRoYXQgb2xkIGFuZCBuZXcgbm9kZXMKLQkJLy8gYXJlIGJhc2ljYWxseSBjb250aWd1b3VzIC0tIGFuZCB3ZSBmb3JjZSBpdCB0byBiZSBzbywKLQkJLy8gYnkgc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyB0bwotCQkvLyBmaW5kIGZpcnN0IGRpZmZlcmVuY2UsIGFuZCB0aGVuIHN0YXJ0aW5nIGF0IHRoZSBlbmQgdG8gZmluZAotCQkvLyBsYXN0IGRpZmZlcmVuY2UuIEV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB3ZSBhc3N1bWUgaXMgZGlmZmVyZW50LgotCQkvLwotCQkvLwotCQkvLwotCQkvLyBzdGFydE9mRGlmZmVyZW5jZXMgaXMgdGhlIGluZGV4IGludG8gdGhlIGNvcmUgbm9kZSBsaXN0IHdoZXJlIHRoZQotCQkvLyBmaXJzdCBkaWZmZXJlbmNlCi0JCS8vIG9jY3Vycy4gQnV0IGl0IG1heSBwb2ludCBpbnRvIHRoZSBvbGQgb3IgdGhlIG5ldyBsaXN0LgotCQlpbnQgc3RhcnRPZkRpZmZlcmVuY2VzID0gX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMob2xkTm9kZXMsIG5ld05vZGVzKTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNPbGQgPSAtMTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNOZXcgPSAtMTsKLQkJLy8gaWYgb25lIG9mIHRoZSBsaXN0cyBhcmUgc2hvcnRlciB0aGFuIHdoZXJlIHRoZSBkaWZmZXJlbmNlcyBzdGFydCwKLQkJLy8gdGhlbgotCQkvLyB0aGVuIHNvbWUgcG9ydGlvbiBvZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbAotCQlpZiAoKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBvbGROb2Rlcy5nZXRMZW5ndGgoKSkgfHwgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBuZXdOb2Rlcy5nZXRMZW5ndGgoKSkpIHsKLQkJCWlmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA8IG5ld05vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJLy8gVGhlbiB0aGVyZSBhcmUgbmV3IHJlZ2lvbnMgdG8gYWRkCi0JCQkJLy8gICAgIHRoZXNlIGxlbmd0aHMgd2lsbCBjYXVzZSB0aGUgdmVjdG9yIG9mIG9sZCBvbmVzIHRvIG5vdAotCQkJCS8vICAgICBoYXZlIGFueSBlbGVtZW50cywgYW5kIHRoZSB2ZWN0b3Igb2YgbmV3IHJlZ2lvbnMgdG8gaGF2ZQotCQkJCS8vICAgICBqdXN0IHRoZSBuZXcgb25lcyBub3QgaW4gY29tbW9uIHdpdGggdGhlIG9sZCBvbmVzCi0JCQkJLy9zdGFydE9mRGlmZmVyZW5jZXMgc2hvdWxkIGVxdWFsIG9sZE5vZGVzLmdldExlbmd0aCgpLAotCQkJCS8vIGNhbGN1bGF0ZWQgYWJvdmUgb24gX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMKLQkJCQltaW5pbWFsT2xkTm9kZXMgPSBFTVBUWV9MSVNUOwotCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQkJbWluaW1hbE5ld05vZGVzID0gX2Zvcm1NaW5pbXVtTGlzdChuZXdOb2Rlcywgc3RhcnRPZkRpZmZlcmVuY2VzLCBlbmRPZkRpZmZlcmVuY2VzTmV3KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9sZE5vZGVzLmdldExlbmd0aCgpID4gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJLy8gZGVsZXRlIG9sZAotCQkJCQkvLyB0aGVuIHRoZXJlIGFyZSBvbGQgcmVnaW9ucyB0byBkZWxldGUKLQkJCQkJLy8gICAgdGhlc2UgbGVuZ3RocyB3aWxsIGNhdXNlIHRoZSB2ZWN0b3Igb2Ygb2xkIHJlZ2lvbnMgdG8KLQkJCQkJLy8gICAgY29udGFpbiB0aGUgb25lcyB0byBkZWxldGUsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldwotCQkJCQkvLyByZWdpb25zCi0JCQkJCS8vICAgIG5vdCBoYXZlIGFueSBlbGVtZW50cwotCQkJCQkvL3N0YXJ0T2ZEaWZmZXJlbmNlcyBzaG91bGQgZXF1YWwgbmV3Tm9kZXMuZ2V0TGVuZ3RoKCksCi0JCQkJCS8vIGNhbGN1bGF0ZWQgYWJvdmUgb24gX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMKLQkJCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IG9sZE5vZGVzLmdldExlbmd0aCgpIC0gMTsKLQkJCQkJbWluaW1hbE9sZE5vZGVzID0gX2Zvcm1NaW5pbXVtTGlzdChvbGROb2Rlcywgc3RhcnRPZkRpZmZlcmVuY2VzLCBlbmRPZkRpZmZlcmVuY2VzT2xkKTsKLQkJCQkJbWluaW1hbE5ld05vZGVzID0gRU1QVFlfTElTVDsKLQkJCQl9IGVsc2UKLQkJCQkJLy8gdW5saWtlbHkgZXZlbnQKLQkJCQkJZXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIFdlIGZvdW5kIGEgbm9ybWFsIHN0YXJ0T2ZEaWZmZXJuY2VzLCBidXQgaGF2ZSBub3QgeWV0IGZvdW5kIHRoZQotCQkJLy8gZW5kcy4KLQkJCS8vIFdlJ2xsIGxvb2sgZm9yIHRoZSBlbmQgb2YgZGlmZmVyZW5jZXMgYnkgZ29pbmcgYmFja3dhcmRzIGRvd24KLQkJCS8vIHRoZSB0d28gbGlzdHMuCi0JCQkvLyBIZXJlIHdlIG5lZWQgYSBzZXBlcmF0ZSBpbmRleCBmb3IgZWFjaCBhcnJheSwgc2luY2UgdGhleSBtYXkgYmUKLQkJCS8vIChhbmQKLQkJCS8vIHByb2JhYmx5IGFyZSkgb2YgZGlmZmVyZW50IGxlbmd0aHMuCi0JCQlpbnQgaW5kZXhPbGQgPSBvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQlpbnQgaW5kZXhOZXcgPSBuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQkvLyBUaGUgZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbiBpcyBpbXBvcnRhbnQgdG8gZ2F1cmQgYWdhaW5zdAotCQkJLy8gaW5jb3JyZWN0IGNvdW50aW5nCi0JCQkvLyB3aGVuIHNvbWV0aGluZyBpZGVudGljYWwgaXMgaW5zZXJ0ZWQgdG8gd2hhdCdzIGFscmVhZHkgdGhlcmUKLQkJCS8vIChzZWUgbWluaW1pemF0aW9uIHRlc3QgY2FzZSA1KQotCQkJLy8gTm90ZTogdGhlIGluZGV4T2xkID4gc3RhcnRPZkRpZmZlcmVuY2VzIGtlZXBzIGluZGV4T2xkIGZyb20KLQkJCS8vIGdldHRpbmcgdG9vIHNtYWxsLAotCQkJLy8gc28gdGhhdCB0aGUgc3Vic2VxdWVudCBvbGROb2Rlcy5pdGVtKGluZGV4T2xkKSBpcyBhbHdheXMgdmFsaWQuCi0JCQl3aGlsZSAoKGluZGV4T2xkID49IHN0YXJ0T2ZEaWZmZXJlbmNlcykgJiYgKF9ncmVhdGVyVGhhbkVmZmVjdGVkUmVnaW9uKG9sZE5vZGVzLml0ZW0oaW5kZXhPbGQpKSkpIHsKLQkJCQlpZiAoIShvbGROb2Rlcy5pdGVtKGluZGV4T2xkKS5zYW1lQXMobmV3Tm9kZXMuaXRlbShpbmRleE5ldyksIGZMZW5ndGhEaWZmZXJlbmNlKSkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gaWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gd2Ugd2lsbCBiZSBrZWVwaW5nIHRoZSBvbGQgb25lLAotCQkJCQkvLyBzbwotCQkJCQkvLyB3ZSBuZWVkIHRvIGJlIHN1cmUgaXRzIHBhcmVudERvY3VtZW50IGlzIHNldCBiYWNrIHRvCi0JCQkJCS8vIHRoZQotCQkJCQkvLyByaWdodCBpbnN0YW5jZQotCQkJCQlvbGROb2Rlcy5pdGVtKGluZGV4T2xkKS5zZXRQYXJlbnREb2N1bWVudChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCQl9Ci0JCQkJaW5kZXhPbGQtLTsKLQkJCQlpbmRleE5ldy0tOwotCQkJfQotCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IGluZGV4T2xkOwotCQkJZW5kT2ZEaWZmZXJlbmNlc05ldyA9IGluZGV4TmV3OwotCQkJbWluaW1hbE9sZE5vZGVzID0gX2Zvcm1NaW5pbXVtTGlzdChvbGROb2Rlcywgc3RhcnRPZkRpZmZlcmVuY2VzLCBlbmRPZkRpZmZlcmVuY2VzT2xkKTsKLQkJCW1pbmltYWxOZXdOb2RlcyA9IF9mb3JtTWluaW11bUxpc3QobmV3Tm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc05ldyk7Ci0JCX0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdERvd25TdHJlYW1Ob2RlID0gbnVsbDsKLQkJZXZlbnQgPSByZWdpb25DaGVjayhtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlmaXJzdERvd25TdHJlYW1Ob2RlID0gbWluaW1hbE9sZE5vZGVzLml0ZW0oMCkuZ2V0TmV4dCgpOwotCQkJaWYgKGZpcnN0RG93blN0cmVhbU5vZGUgIT0gbnVsbCAmJiBmTGVuZ3RoRGlmZmVyZW5jZSAhPSAwKSB7IC8vIGlmCi0JCQkJLy8gZmlyc3REb3duU3RyZWFtCi0JCQkJLy8gaXMKLQkJCQkvLyBudWxsLAotCQkJCS8vIHRoZW4KLQkJCQkvLyB3ZSdyZQotCQkJCS8vIGF0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZW5kCi0JCQkJLy8gb2YKLQkJCQkvLyB0aGUKLQkJCQkvLyBkb2N1bWVudAotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmFkanVzdFN0YXJ0KGZpcnN0RG93blN0cmVhbU5vZGUsIGZMZW5ndGhEaWZmZXJlbmNlKTsKLQkJCX0gLy8KLQkJfSBlbHNlIHsKLQkJCWV2ZW50ID0gbm9kZXNSZXBsYWNlZENoZWNrKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCS8vIG5vdyBzcGxpY2UgdGhlIG5ldyBjaGFpbiBvZiBub2RlcyB0byB3aGVyZSB0aGUgb2xkIGNoYWluIGlzIChvcgotCQkJLy8gd2FzKQotCQkJLy8gdGhlIGZpcnN0RG93blN0cmVhbU5vZGUgKHRoZSBmaXJzdCBvZiB0aG9zZSBhZnRlciB0aGUgbmV3Ci0JCQkvLyBub2RlcykKLQkJCS8vIGlzCi0JCQkvLyByZW1lbWJlcmVkIGFzIGEgdGlueSBvcHRpbWl6YXRpb24uCi0JCQlpZiAobWluaW1hbE9sZE5vZGVzLmdldExlbmd0aCgpID09IDAgJiYgbWluaW1hbE5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCS8vIGlmIG5vIG9sZCBub2RlcyBhcmUgYmVpbmcgZGVsZXRlZCwgdGhlbiB1c2UgdGhlCi0JCQkJLy8gdGhlIG5ld05vZGVzIG9mZnNldCAobWludXMgb25lKSB0byBmaW5kIHRoZSBwb2ludCB0bwotCQkJCS8vIHVwZGF0ZSBkb3duc3RyZWFtIG5vZGVzLCBhbmQgYWZ0ZXIgdXBkYXRpbmcgZG93bnN0cmVhbQotCQkJCS8vIG5vZGVzIHBvc3Rpb25zLCBpbnNlcnQgdGhlIG5ldyBvbmVzLgotCQkJCWludCBpbnNlcnRPZmZzZXQgPSBtaW5pbWFsTmV3Tm9kZXMuaXRlbSgwKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE9sZFVuY2hhbmdlZE5vZGUgPSBudWxsOwotCQkJCWlmIChpbnNlcnRPZmZzZXQgPiAwKSB7Ci0JCQkJCWxhc3RPbGRVbmNoYW5nZWROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRPZmZzZXQgLSAxKTsKLQkJCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IGxhc3RPbGRVbmNoYW5nZWROb2RlLmdldE5leHQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB3ZSdyZSBpbnNlcnRpbmcgYXQgdmVyeSBiZWdpbm5pbmcKLQkJCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJLy8gU0lERSBFRkZFQ1Q6IGNoYW5nZSB0aGUgZmlyc3ROb2RlIHBvaW50ZXIgaWYgd2UncmUKLQkJCQkJLy8gaW5zZXJ0aW5nIGF0IGJlZ2lubmluZwotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldEZpcnN0RG9jdW1lbnRSZWdpb24obWluaW1hbE5ld05vZGVzLml0ZW0oMCkpOwotCQkJCX0KLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkJaW5zZXJ0Tm9kZXMobGFzdE9sZFVuY2hhbmdlZE5vZGUsIGZpcnN0RG93blN0cmVhbU5vZGUsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQkJLy8gdGhpcyAobm9kZXMgcmVwbGFjZWQpIGlzIHRoZSBvbmx5IGNhc2Ugd2hlcmUgd2UgbmVlZCB0bwotCQkJCS8vIHVwZGF0ZSB0aGUgY2FjaGVkIE5vZGUKLQkJCQlyZVNldENhY2hlZE5vZGUobWluaW1hbE9sZE5vZGVzLCBtaW5pbWFsTmV3Tm9kZXMpOwotCQkJfSBlbHNlIHsKLQkJCQlmaXJzdERvd25TdHJlYW1Ob2RlID0gc3dpdGNoTm9kZUxpc3RzKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCQkvLyBubyBuZWVkIHRvIGFkanVzdCB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgbm9kZXMgdGhlbXNlbHZlcywKLQkJCQkvLyB0aGV5Ci0JCQkJLy8gYXJlIGFscmVhZHkgY29ycmVjdCwgYnV0IHdlIGRvIG5lZWQgdG8KLQkJCQkvLyBhZGp1c3QgYWxsICJkb3duIHN0cmVhbSIgbm9kZXMgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZQotCQkJCS8vIGluc2VydGlvbiBvciBkZWxldGlvbgotCQkJCS8vIC0tLSBhZGp1c3RtZW50IG1vdmVkIHRvIGNhbGxpbmcgbWV0aG9kLgotCQkJCWlmIChmaXJzdERvd25TdHJlYW1Ob2RlICE9IG51bGwpIHsKLQkJCQkJLy8gJiYgZXZlbnQgIT0gbnVsbAotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkJfSAvLwotCQkJCS8vIHRoaXMgKG5vZGVzIHJlcGxhY2VkKSBpcyB0aGUgb25seSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8KLQkJCQkvLyB1cGRhdGUgdGhlIGNhY2hlZCBOb2RlCi0JCQkJcmVTZXRDYWNoZWROb2RlKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi0JLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgYWJzdHJhY3QuCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IG5vZGVzUmVwbGFjZWRDaGVjayhDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQkvLyBhY3R1YWxseSwgbm90aGluZyB0byBjaGVjayBoZXJlLCBzaW5jZSAoYW5kIGFzc3VtaW5nKSB3ZSd2ZSBhbHJlYWR5Ci0JCS8vIG1pbmltaXplZCB0aGUgbnVtYmVyIG9mIG5vZGVzLCBhbmQgcnVsZWQgb3V0IG1lcmUgcmVnaW9uIGNoYW5nZXMKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGVzLCBuZXdOb2RlcywgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQSBtZXRob2QgdG8gYWxsb3cgYW55IGhldXJpc3RpYyAicXVpY2sgY2hlY2tzIiB0aGF0IG1pZ2h0IGNvdmVyIG1hbnkKLQkgKiBtYW55IGNhc2VzLCBiZWZvcmUgZXhwZW5kaW5nIHRoZSB0aW1lIG9uIGEgZnVsbCByZXBhcnNlLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcXVpY2tDaGVjaygpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIGRpcnR5IHN0YXJ0IGlzIG51bGwsIHRoZW4gd2UgaGF2ZSBhbiBlbXB0eSBkb2N1bWVudC4KLQkJLy8gaW4gd2hpY2ggY2FzZSB3ZSdsbCByZXR1cm4gbnVsbCBzbyBldmVyeXRoaW5nIGNhbiBiZQotCQkvLyByZXBhcnNlZCAiZnJvbSBzY3JhdGNoIiAuIElmIGl0cyBub3QgbnVsbCwgd2UnbGwgZ2l2ZSB0aGUgZmxhdG5vZGUKLQkJLy8gYQotCQkvLyBjaGFuY2UKLQkJLy8gdG8gaGFuZGxlLCBidXQgb25seSBpZiB0aGVyZSBpcyBvbmUgZmxhdG5vZGUgaW52b2x2ZWQuCi0JCWlmIChkaXJ0eVN0YXJ0ICE9IG51bGwgJiYgZGlydHlTdGFydCA9PSBkaXJ0eUVuZCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YXJnZXROb2RlID0gZGlydHlTdGFydDsKLQkJCXJlc3VsdCA9IGRpcnR5U3RhcnQudXBkYXRlUmVnaW9uKGZSZXF1ZXN0ZXIsIHRhcmdldE5vZGUsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJLy8gYXQgdGhpcyBwb2ludCBvbmx5LCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdGV4dCBzdG9yZSBhbmQKLQkJCQkvLyBhbmQgZG93bnN0cmVhbSBub2Rlcy4KLQkJCQkvLyBGVVRVUkVfVE9fRE86IGNhbiB0aGlzIGRlcGVuZGVuY3kgb24gc3RydWN0dXJlZERvY3VtZW50Ci0JCQkJLy8gbWV0aG9kIGJlIGVsaW1pbmF0ZWQ/Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC51cGRhdGVEb2N1bWVudERhdGEoZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlLCBmQ2hhbmdlcyk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdERvd25TdHJlYW1Ob2RlID0gdGFyZ2V0Tm9kZS5nZXROZXh0KCk7Ci0JCQkJLy8gdGhlbiBmbGF0bm9kZSBtdXN0IGhhdmUgYmVlbiB0aGUgbGFzdCBvbmUsIHNvIG5lZWQgdG8KLQkJCQkvLyB1cGRhdGUKLQkJCQkvLyBhbnkgZG93bnN0cmVhbSBvbmVzCi0JCQkJaWYgKGZpcnN0RG93blN0cmVhbU5vZGUgIT0gbnVsbCkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmVzdWx0LnNldERlbGV0ZWRUZXh0KGZEZWxldGVkVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBvbmx5IG9uZSBub2RlIGlzIGludm9sdmVkLCBzZWVzIGhvdyBtYW55IHJlZ2lvbnMgYXJlIGNoYW5nZWQuIElmCi0JICogb25seSBvbmUsIHRoZW4gaXRzIGEgJ3JlZ2lvbkNoYW5nZWQnIGV2ZW50IC4uLiBpZiBtb3JlIHRoYW4gb25lLCBpdHMgYQotCSAqICdyZWdpb25zUmVwbGFjZWQnIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZWdpb25DaGVjayhDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnJlZ2lvbnNSZXBsYWNlZENoZWNrIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8kTk9OLU5MUy0xJAotCQkvLyROT04tTkxTLTEkCi0JCS8vIHRoZSAicmVnaW9uc1JlcGxhY2VkIiBldmVudCBjb3VsZCBvbmx5IGJlIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlCi0JCS8vIG5vZGVsaXN0cwotCQkvLyBhcmUgZWFjaCBvbmx5ICIxIiBpbiBsZW5ndGguCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBvbGRMZW5ndGggPSBvbGROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJaW50IG5ld0xlbmd0aCA9IG5ld05vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoKG9sZExlbmd0aCAhPSAxKSB8fCAobmV3TGVuZ3RoICE9IDEpKSB7Ci0JCQlyZXN1bHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlID0gb2xkTm9kZXMuaXRlbSgwKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZSA9IG5ld05vZGVzLml0ZW0oMCk7Ci0JCQlyZXN1bHQgPSByZWdpb25DaGVjayhvbGROb2RlLCBuZXdOb2RlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIG9ubHkgb25lIG5vZGUgaXMgaW52b2x2ZWQsIHNlZXMgaG93IG1hbnkgcmVnaW9ucyBhcmUgY2hhbmdlZC4gSWYKLQkgKiBvbmx5IG9uZSwgdGhlbiBpdHMgYSAncmVnaW9uQ2hhbmdlZCcgZXZlbnQgLi4uIGlmIG1vcmUgdGhhbiBvbmUsIGl0cyBhCi0JICogJ3JlZ2lvbnNSZXBsYWNlZCcgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlZ2lvbkNoZWNrKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlKSB7Ci0JCS8vCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gb2xkTm9kZS5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gbmV3Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uW10gb2xkUmVnaW9uc0FycmF5ID0gb2xkUmVnaW9ucy50b0FycmF5KCk7Ci0JCUlUZXh0UmVnaW9uW10gbmV3UmVnaW9uc0FycmF5ID0gbmV3UmVnaW9ucy50b0FycmF5KCk7Ci0JCS8vCi0JCS8vIGZvciB0aGUgJ3JlZ2lvbnNSZXBsYWNlZCcgZXZlbnQsIHdlIGRvbid0IGNhcmUgaWYKLQkJLy8gdGhlIHJlZ2lvbnMgY2hhbmdlZCBkdWUgdG8gdHlwZSwgb3IgdGV4dCwKLQkJLy8gd2UnbGwganVzdCBjb2xsZWN0IGFsbCB0aG9zZSB0aGF0IGFyZSBub3QgZXF1YWwKLQkJLy8gaW50byB0aGUgb2xkIGFuZCBuZXcgcmVnaW9uIGxpc3RzLgotCQkvLyBOb3RlOiB3ZSwgb2YgY291cnNlLCBhc3N1bWUgdGhhdCBvbGQgYW5kIG5ldyByZWdpb25zCi0JCS8vIGFyZSBiYXNpY2FsbHkgY29udGlndW91cyAtLSBhbmQgd2UgZm9yY2UgaXQgdG8gYmUgc28sCi0JCS8vIGV2ZW4gaWYgbm90IGxpdGVyYWxseSBzbywgYnkgc3RhcnRpbmcgYXQgYmVnaW5uaW5nIHRvCi0JCS8vIGZpbmQgZmlyc3QgZGlmZmVyZW5jZSwgYW5kIHRoZW4gc3RhcnRpbmcgYXQgZW5kIHRvIGZpbmQKLQkJLy8gbGFzdCBkaWZmZXJlbmNlLiBFdmVyeXRoaW5nIGluIGJldHdlZW4gd2UgYXNzdW1lIGlzIGRpZmZlcmVudC4KLQkJLy8KLQkJLy8gZ29pbmcgdXAgaXMgZWFzeSwgd2Ugc3RhcnQgYXQgemVybyBpbiBlYWNoLCBhbmQgY29udGludWUKLQkJLy8gdGlsbCByZWdpb25zIGFyZSBub3QgdGhlIHNhbWUuCi0JCWludCBzdGFydE9mRGlmZmVyZW5jZXMgPSBfY29tcHV0ZVN0YXJ0T2ZEaWZmZXJlbmNlcyhvbGROb2RlLCBvbGRSZWdpb25zLCBuZXdOb2RlLCBuZXdSZWdpb25zKTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNPbGQgPSAtMTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNOZXcgPSAtMTsKLQkJLy8KLQkJLy8KLQkJLy8gaWYgb25lIG9mIHRoZSBsaXN0cyBhcmUgc2hvcnRlciB0aGFuIHdoZXJlIHRoZSBkaWZmZXJlbmNlcyBzdGFydCwKLQkJLy8gdGhlbgotCQkvLyB0aGVuIHNvbWUgcG9ydGlvbiBvZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbAotCQlpZiAoKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBvbGRSZWdpb25zLnNpemUoKSkgfHwgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBuZXdSZWdpb25zLnNpemUoKSkpIHsKLQkJCWlmIChvbGRSZWdpb25zLnNpemUoKSA8IG5ld1JlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJLy8gSU5TRVJUIENBU0UKLQkJCQkvLyB0aGVuIHRoZXJlIGFyZSBuZXcgcmVnaW9ucyB0byBhZGQKLQkJCQkvLyAgICAgdGhlc2UgbGVuZ3RocyB3aWxsIGNhdXNlIHRoZSB2ZWN0b3Igb2Ygb2xkIG9uZXMgdG8gbm90Ci0JCQkJLy8gICAgIGhhdmUgYW55IGVsZW1lbnRzLCBhbmQgdGhlIHZlY3RvciBvZiBuZXcgcmVnaW9ucyB0byBoYXZlCi0JCQkJLy8gICAgIGp1c3QgdGhlIG5ldyBvbmVzLgotCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGg7Ci0JCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBuZXdSZWdpb25zQXJyYXkubGVuZ3RoIC0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9sZFJlZ2lvbnMuc2l6ZSgpID4gbmV3UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJLy8gREVMRVRFIENBU0UKLQkJCQkJLy8gdGhlbiB0aGVyZSBhcmUgb2xkIHJlZ2lvbnMgdG8gZGVsZXRlCi0JCQkJCS8vICAgIHRoZXNlIGxlbmd0aHMgd2lsbCBjYXVzZSB0aGUgdmVjdG9yIG9mIG9sZCByZWdpb25zIHRvCi0JCQkJCS8vICAgIGNvbnRhaW4gdGhlIG9uZXMgdG8gZGVsZXRlLCBhbmQgdGhlIHZlY3RvciBvZiBuZXcKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQkvLyAgICBub3QgaGF2ZSBhbnkgZWxlbWVudHMKLQkJCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gbmV3UmVnaW9uc0FycmF5Lmxlbmd0aDsKLQkJCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCQllbmRPZkRpZmZlcmVuY2VzTmV3ID0gbmV3UmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZWxzZSB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCEKLQkJCQkJLy8gdW5saWtlbHkgZXZlbnQsIHByb2JhYmx5IGVycm9yIGluIGN1cnJlbnQgZGVzaWduLCBzaW5jZQotCQkJCQkvLyB3ZSBjaGVjayBmb3IgaWRlbnRpdHkgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mCi0JCQkJCS8vIHJlcGFyc2luZy4KLQkJCQkJcmVzdWx0ID0gbmV3IE5vQ2hhbmdlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3RlciwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChzdGFydE9mRGlmZmVyZW5jZXMgPiAtMSkgJiYgKGVuZE9mRGlmZmVyZW5jZXNPbGQgPCAwKSAmJiAoZW5kT2ZEaWZmZXJlbmNlc05ldyA8IDApKSB7Ci0JCQkJLy8gV2UgZm91bmQgYSBub3JtYWwgc3RhcnRPZkRpZmZlcm5jZXMsIGJ1dCBoYXZlIG5vdCB5ZXQgZm91bmQKLQkJCQkvLyB0aGUgZW5kcy4KLQkJCQkvLyBXZSdsbCBsb29rIGZvciB0aGUgZW5kIG9mIGRpZmZlcmVuY2VzIGJ5IGdvaW5nIGJhY2t3YXJkcwotCQkJCS8vIGRvd24gdGhlIHR3byBsaXN0cy4KLQkJCQkvLyBIZXJlIHdlIG5lZWQgYSBzZXBlcmF0ZSBpbmRleCBmb3IgZWFjaCBhcnJheSwgc2luY2UgdGhleQotCQkJCS8vIG1heQotCQkJCS8vIGJlIChhbmQKLQkJCQkvLyBwcm9iYWJseSBhcmUpIG9mIGRpZmZlcmVudCBsZW5ndGhzLgotCQkJCWludCBpbmRleE9sZCA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCWludCBpbmRleE5ldyA9IG5ld1JlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCXdoaWxlICgoaW5kZXhPbGQgPj0gc3RhcnRPZkRpZmZlcmVuY2VzKSAmJiAoX2dyZWF0ZXJUaGFuRWZmZWN0ZWRSZWdpb24ob2xkTm9kZSwgb2xkUmVnaW9uc0FycmF5W2luZGV4T2xkXSkpKSB7Ci0JCQkJCWlmICgoIShvbGROb2RlLnNhbWVBcyhvbGRSZWdpb25zQXJyYXlbaW5kZXhPbGRdLCBuZXdOb2RlLCBuZXdSZWdpb25zQXJyYXlbaW5kZXhOZXddLCBmTGVuZ3RoRGlmZmVyZW5jZSkpKSkgewotCQkJCQkJLy9lbmRPZkRpZmZlcmVuY2VzT2xkID0gaW5kZXhPbmU7Ci0JCQkJCQkvL2VuZE9mRGlmZmVyZW5jZXNOZXcgPSBpbmRleFR3bzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWluZGV4T2xkLS07Ci0JCQkJCWluZGV4TmV3LS07Ci0JCQkJfQotCQkJCWVuZE9mRGlmZmVyZW5jZXNPbGQgPSBpbmRleE9sZDsKLQkJCQllbmRPZkRpZmZlcmVuY2VzTmV3ID0gaW5kZXhOZXc7Ci0JCQl9Ci0JCX0KLQkJLy8KLQkJLy8gcmVzdWx0ICE9IG51bGwgbWVhbnMgdGhlIGltcG9zc2libGUgY2FzZSBhYm92ZSBvY2N1cnJlZAotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIE5vdyBmb3JtIHRoZSB0d28gdmVjdG9ycyBvZiBkaWZmZXJlbnQgcmVnaW9ucwotCQkJSVRleHRSZWdpb25MaXN0IGhvbGRPbGRSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCQkJSVRleHRSZWdpb25MaXN0IGhvbGROZXdSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IC0xICYmIGVuZE9mRGlmZmVyZW5jZXNPbGQgPiAtMSkgewotCQkJCWZvciAoaW50IGkgPSBzdGFydE9mRGlmZmVyZW5jZXM7IGkgPD0gZW5kT2ZEaWZmZXJlbmNlc09sZDsgaSsrKSB7Ci0JCQkJCWhvbGRPbGRSZWdpb25zLmFkZChvbGRSZWdpb25zQXJyYXlbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzdGFydE9mRGlmZmVyZW5jZXMgPiAtMSAmJiBlbmRPZkRpZmZlcmVuY2VzTmV3ID4gLTEpIHsKLQkJCQlmb3IgKGludCBpID0gc3RhcnRPZkRpZmZlcmVuY2VzOyBpIDw9IGVuZE9mRGlmZmVyZW5jZXNOZXc7IGkrKykgewotCQkJCQlob2xkTmV3UmVnaW9ucy5hZGQobmV3UmVnaW9uc0FycmF5W2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaG9sZE9sZFJlZ2lvbnMuc2l6ZSgpID09IDAgJiYgaG9sZE5ld1JlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCQkvLyB0aGVuIHRoaXMgbWVhbnMgdGhlIHJlZ2lvbnMgd2VyZSBpZGVudGljYWwsIHdoaWNoIG1lYW5zCi0JCQkJLy8gc29tZW9uZQotCQkJCS8vIHBhc3RlZCBleGFjdGx5IHRoZSBzYW1lIHRoaW5nIHRoZXkgaGFkIHNlbGVjdGVkLCBvciAhISEKLQkJCQkvLyBzb21lb25lIGRlbGV0ZWQgdGhlIGVuZCBicmFja2V0IG9mIHRoZSB0YWcuICEhIT8KLQkJCQlyZXN1bHQgPSBuZXcgTm9DaGFuZ2VFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9JZiBib3RoIGhvbGRPbGRSZWdpb25zIGFuZCBob2xkTmV3UmVnaW9ucyBhcmUgb2YgbGVuZ3RoIDEsCi0JCQkJLy8gdGhlbiBpdHMKLQkJCQkvLyBhICJyZWdpb24gY2hhbmdlZCIgZXZlbnQsIGVsc2UgYSAicmVnaW9ucyByZXBsYWNlZCIgZXZlbnQuCi0JCQkJLy8gc28gd2Ugd2FudCB0aGUgbmV3IGluc3RhbmNlIG9mIHJlZ2lvbiB0byBiZWNvbWUgcGFydCBvZiB0aGUKLQkJCQkvLyBvbGQgaW5zdGFuY2Ugb2Ygb2xkIG5vZGUKLQkJCQlpZiAoKGhvbGRPbGRSZWdpb25zLnNpemUoKSA9PSAxKSAmJiAoaG9sZE5ld1JlZ2lvbnMuc2l6ZSgpID09IDEpICYmIF9yZWdpb25zU2FtZUtpbmQoKGhvbGROZXdSZWdpb25zLmdldCgwKSksIChob2xkT2xkUmVnaW9ucy5nZXQoMCkpKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXdPbGRSZWdpb24gPSBzd2FwTmV3Rm9yT2xkUmVnaW9uKG9sZE5vZGUsIGhvbGRPbGRSZWdpb25zLmdldCgwKSwgbmV3Tm9kZSwgaG9sZE5ld1JlZ2lvbnMuZ2V0KDApKTsKLQkJCQkJLy8gLS0gbmVlZCB0byB1cGRhdGUgYW55IGRvd24gc3RyZWFtIHJlZ2lvbnMsIHdpdGhpbiB0aGlzCi0JCQkJCS8vICdvbGROb2RlJwotCQkJCQl1cGRhdGVEb3duU3RyZWFtUmVnaW9ucyhvbGROb2RlLCBuZXdPbGRSZWdpb24pOwotCQkJCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGUsIG5ld09sZFJlZ2lvbiwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVwbGFjZVJlZ2lvbnMob2xkTm9kZSwgaG9sZE9sZFJlZ2lvbnMsIG5ld05vZGUsIGhvbGROZXdSZWdpb25zKTsKLQkJCQkJLy8gLS0gbmVlZCB0byB1cGRhdGUgYW55IGRvd24gc3RyZWFtIHJlZ2lvbnMsIHdpdGhpbiB0aGlzCi0JCQkJCS8vICdvbGROb2RlJwotCQkJCQkvLyBkb24ndCBuZWVkIHdpdGggdGhlIHdheSByZXBsYWNlUmVnaW9ucyBpcyBpbXBsZW1lbnRlZC4KLQkJCQkJLy8gSXQgaGFuZGxlcy4KLQkJCQkJLy9pZihob2xkTmV3UmVnaW9ucy5zaXplKCkgPiAwKQotCQkJCQkvL3VwZGF0ZURvd25TdHJlYW1SZWdpb25zKG9sZE5vZGUsIChJVGV4dFJlZ2lvbikKLQkJCQkJLy8gaG9sZE5ld1JlZ2lvbnMubGFzdEVsZW1lbnQoKSk7Ci0JCQkJCXJlc3VsdCA9IG5ldyBSZWdpb25zUmVwbGFjZWRFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBvbGROb2RlLCBob2xkT2xkUmVnaW9ucywgaG9sZE5ld1JlZ2lvbnMsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFuIGVudHJ5IHBvaW50IGZvciByZXBhcnNpbmcuIEl0IGNhbGN1bGF0ZXMgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eQotCSAqIGVuZCBmbGF0bm9kZXMgYmFzZWQgb24gdGhlIHN0YXJ0IHBvaW50IGFuZCBsZW5ndGggb2YgdGhlIGNoYW5nZXMuCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGNhY2hlZE5vZGUsIHRoZW4gdGhlIGRvY3VtZW50Ci0JCS8vIG11c3QgYmUgZW1wdHksIHNvIHNpbXBseSB1c2UgJ251bGwnIGFzIHRoZSBkaXJ0eVN0YXJ0IGFuZCBkaXJ0eUVuZAotCQkvLyBvdGhlcndpc2UsIGZpbmQgdGhlbS4KLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQlmaW5kRGlydHlTdGFydChmU3RhcnQpOwotCQkJaW50IGVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2U7Ci0JCQlmaW5kRGlydHlFbmQoZW5kKTsKLQkJfQotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNoZWNrSGV1cmlzdGljcygpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JCX0KLQkJZW5kUmVQYXJzZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFuIGVudHJ5IHBvaW50IGZvciByZXBhcnNpbmcuIEl0IGNhbGN1bGF0ZXMgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eQotCSAqIGVuZCBmbGF0bm9kZXMgYmFzZWQgb24gc3VnZ2VzdGVkIHBvc2l0aW9ucyB0byBiZWdpbiBhbmQgZW5kLiBUaGlzIGlzCi0JICogbmVlZGVkIGZvciBjYXNlcyB3aGVyZSBwYXJzaW5nIG11c3QgZ28gYmV5b25kIHRoZSBpbW1lZGlhdGUgbm9kZSBhbmQKLQkgKiBpdHMgZGlyZWN0IG5laWdoYm9ycy4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoaW50IHJlU2NhblN0YXJ0SGludCwgaW50IHJlU2NhbkVuZEhpbnQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgd2UgZG8gbm90IGhhdmUgYSBjYWNoZWROb2RlLCB0aGVuIHRoZSBkb2N1bWVudAotCQkvLyBtdXN0IGJlIGVtcHR5LCBzbyBzaW1wbHkgdXNlICdudWxsJyBhcyB0aGUgZGlydHlTdGFydCBhbmQgZGlydHlFbmQKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQlmaW5kRGlydHlTdGFydChyZVNjYW5TdGFydEhpbnQpOwotCQkJZmluZERpcnR5RW5kKHJlU2NhbkVuZEhpbnQpOwotCQl9Ci0JCXJlc3VsdCA9IHJlcGFyc2UoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCQlpc1BhcnNpbmcgPSBmYWxzZTsKLQkJLy8gZGVidWcKLQkJLy92ZXJpZnlTdHJ1Y3R1cmVkKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvcmUgcmVwYXJzaW5nIG1ldGhvZCAuLi4gYWZ0ZXIgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eSBlbmQgaGF2ZQotCSAqIGJlZW4gY2FsY3VsYXRlZCBlbHNld2hlcmUuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eVN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5RW5kKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCByZXNjYW5TdGFydCA9IC0xOwotCQlpbnQgcmVzY2FuRW5kID0gLTE7Ci0JCWJvb2xlYW4gZmlyc3RUaW1lID0gZmFsc2U7Ci0JCS8vCi0JCS8vICJzYXZlIiB0aGUgb2xkTm9kZXMgKHRoYXQgbWF5IGJlIHJlcGxhY2VkKSBpbiBhIGxpc3QKLQkJQ29yZU5vZGVMaXN0IG9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGRpcnR5U3RhcnQsIGRpcnR5RW5kKTsKLQkJaWYgKGRpcnR5U3RhcnQgPT0gbnVsbCB8fCBkaXJ0eUVuZCA9PSBudWxsKSB7Ci0JCQkvLyBkaXJ0eVN0YXJ0IG9yIGRpcnR5IGVuZCBhcmUgbnVsbCwgdGhlbiB0aGF0IG1lYW5zIHdlIGRpZG4ndAotCQkJLy8gaGF2ZQotCQkJLy8gYQotCQkJLy8gY2FjaGVkIG5vZGUsIHdoaWNoIG1lYW5zIHdlIGhhdmUgYW4gZW1wdHkgZG9jdW1lbnQsIHNvIHdlCi0JCQkvLyBqdXN0IG5lZWQgdG8gcmVzY2FuIHRoZSBjaGFuZ2VzCi0JCQlyZXNjYW5TdGFydCA9IDA7Ci0JCQlyZXNjYW5FbmQgPSBmQ2hhbmdlcy5sZW5ndGgoKTsKLQkJCWZpcnN0VGltZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlc2NhbgotCQkJcmVzY2FuU3RhcnQgPSBkaXJ0eVN0YXJ0LmdldFN0YXJ0KCk7Ci0JCQkvLwotCQkJLy8gc2V0IHRoZSBlbmQgb2YgdGhlIHRleHQgdG8gcmVzY2FuCi0JCQkvLyBub3RpY2Ugd2UgdXNlIHRoZSBzYW1lIHJhdGlvbmFsZSBhcyBmb3IgdGhlIHJlc2NhblN0YXJ0LAotCQkJLy8gd2l0aCB0aGUgYWRkZWQgY2F2ZWF0IHRoYXQgbGVuZ3RoIGhhcyB0byBiZSBhZGRlZCB0byBpdCwKLQkJCS8vIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBuZXcgdGV4dCB3aGljaCBoYXMgYmVlbiBhZGRlZCBvciBkZWxldGVkLgotCQkJLy8gSWYgY2hhbmdlcyBoYXMgemVybyBsZW5ndGgsIHRoZW4gImxlbmd0aCIgd2lsbCBiZSBuZWdhdGl2ZSwKLQkJCS8vIHNpbmNlCi0JCQkvLyB3ZSBhcmUgZGVsZXRpbmcgdGV4dC4gT3RoZXJ3aXNlLCB1c2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCQkJLy8gd2hhdCdzIHNlbGVjdGVkIHRvIGJlIHJlcGxhY2VkIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgdGV4dC4KLQkJCXJlc2NhbkVuZCA9IGRpcnR5RW5kLmdldEVuZCgpICsgZkxlbmd0aERpZmZlcmVuY2U7Ci0JCX0KLQkJLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgb2xkIHN0dWZmICJzYXZlZCIgYXdheSwgdXBkYXRlIHRoZSBkb2N1bWVudAotCQkvLyB3aXRoIHRoZSBjaGFuZ2VzLgotCQkvLyBGVVRVUkVfVE9fRE8gLS0gZG9uJ3QgZmlyZSAiZG9jdW1lbnQgY2hhbmdlZCIgZXZlbnQgdGlsbCBsYXRlcgotCQlmU3RydWN0dXJlZERvY3VtZW50LnVwZGF0ZURvY3VtZW50RGF0YShmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZDaGFuZ2VzKTsKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tIG5vdyB0aGUgcmVhbCB3b3JrCi0JCXJlc3VsdCA9IGNvcmVfcmVwYXJzZShyZXNjYW5TdGFydCwgcmVzY2FuRW5kLCBvbGROb2RlcywgZmlyc3RUaW1lKTsKLQkJLy8KLQkJLy8gZXZlbnQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgaW5jYXNlIHRoZXJlIGlzCi0JCS8vIHNvbWUgb3BpdG1pemF0aW9uIHRoZXkgY2FuIGRvCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucykgewotCQlpbnQgaW5zZXJ0UG9zID0gLTE7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gb2xkTm9kZS5nZXRSZWdpb25zKCk7Ci0JCS8vIG1ha2UgYSBmYWtlIGZsYXRub2RlIHRvIGJlIG5ldyBwYXJlbnQgb2Ygb2xkUmVnaW9ucywgc28gdGhlaXIgdGV4dAotCQkvLyB3aWxsIGJlIHJpZ2h0LgotCQkvL0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaG9sZE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldwotCQkvLyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGROb2RlKTsKLQkJLy8KLQkJLy8gbmVlZCB0byByZXNldCB0aGUgcGFyZW50IG9mIHRoZSBuZXcgdG8tYmUtaW5zZXJ0ZWQgcmVnaW9ucyB0byBiZQotCQkvLyB0aGUKLQkJLy8gc2FtZSBvbGROb2RlIHRoYXQgaXMgdGhlIG9uZSBoYXZpbmcgaXRzIHJlZ2lvbnMgY2hhbmdlZAotCQkvLyBEVywgNC8xNi8yMDAzLCByZW1vdmVkIHNpbmNlIElUZXh0UmVnaW9uIG5vIGxvbmdlciBoYXMgcGFyZW50LgotCQkvLyAJCUlUZXh0UmVnaW9uQ29udGFpbmVyIG9sZFBhcmVudCA9IG9sZE5vZGU7Ci0JCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1JlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJLy8JCQlBYnN0cmFjdFJlZ2lvbiByZWdpb24gPSAoQWJzdHJhY3RSZWdpb24pIG5ld1JlZ2lvbnMuZWxlbWVudEF0KGkpOwotCQkvLwkJCXJlZ2lvbi5zZXRQYXJlbnQob2xkUGFyZW50KTsKLQkJLy8JCX0KLQkJLy8gaWYgdGhlcmUgYXJlIG5vIG9sZCByZWdpb25zLCBpbnNlcnQgdGhlIG5ldyByZWdpb25zIGFjY29yZGluZyB0bwotCQkvLyBvZmZzZXQKLQkJaWYgKG9sZFJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCUlUZXh0UmVnaW9uIGZpcnN0TmV3UmVnaW9uID0gbmV3UmVnaW9ucy5nZXQoMCk7Ci0JCQlpbnQgZmlyc3RPZmZzZXQgPSBuZXdOb2RlLmdldFN0YXJ0T2Zmc2V0KGZpcnN0TmV3UmVnaW9uKTsKLQkJCS8vIGlmIGF0IGJlZ2lubmluZywgaW5zZXJ0IHRoZXJlCi0JCQlpZiAoZmlyc3RPZmZzZXQgPT0gMCkgewotCQkJCWluc2VydFBvcyA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCS8vCi0JCQkJSVRleHRSZWdpb24gcmVnaW9uQXRPZmZzZXQgPSBvbGROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZpcnN0T2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uQXRPZmZzZXQgPT0gbnVsbCkKLQkJCQkJaW5zZXJ0UG9zID0gcmVnaW9ucy5zaXplKCk7Ci0JCQkJZWxzZQotCQkJCQlpbnNlcnRQb3MgPSByZWdpb25zLmluZGV4T2YocmVnaW9uQXRPZmZzZXQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gZWxzZSwgZGVsZXRlIG9sZCBvbmVzIGJlZm9yZSBpbnNlcnRpbmcgbmV3IG9uZXMgaW4gdGhlaXIgcGxhY2UKLQkJCUlUZXh0UmVnaW9uIGZpcnN0T2xkUmVnaW9uID0gb2xkUmVnaW9ucy5nZXQoMCk7Ci0JCQlpbnNlcnRQb3MgPSByZWdpb25zLmluZGV4T2YoZmlyc3RPbGRSZWdpb24pOwotCQkJcmVnaW9ucy5yZW1vdmVBbGwob2xkUmVnaW9ucyk7Ci0JCX0KLQkJcmVnaW9ucy5hZGRBbGwoaW5zZXJ0UG9zLCBuZXdSZWdpb25zKTsKLQkJLy8gbm93IHJlZ2lvbnMgdmVjdG9yIG9mIGVhY2ggbm9kZSBzaG91bGQgYmUgb2YgZXF1YWwgbGVuZ3RoLAotCQkvLyBzbyBnbyB0aHJvdWdoIGVhY2gsIGFuZCBtYWtlIHN1cmUgdGhlIG9sZCByZWdpb25zCi0JCS8vIG9mZnNldHMgbWF0Y2hlcyB0aGUgbmV3IHJlZ2lvbnMgb2Zmc2V0cwotCQkvLyAod2UnbGwganVzdCBhc3NpZ24gdGhlbSBhbGwsIGJ1dCBjb3VsZCBiZSBzbGlnaHRseSBtb3JlIGVmZmllY2llbnQpCi0JCUlUZXh0UmVnaW9uTGlzdCBhbGxOZXdSZWdpb25zID0gbmV3Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gbmV4dE9sZGlzaFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJSVRleHRSZWdpb24gbmV4dE5ld1JlZ2lvbiA9IGFsbE5ld1JlZ2lvbnMuZ2V0KGkpOwotCQkJbmV4dE9sZGlzaFJlZ2lvbi5lcXVhdGVQb3NpdGlvbnMobmV4dE5ld1JlZ2lvbik7Ci0JCQljaGVja0FuZEFzc2lnblBhcmVudChvbGROb2RlLCBuZXh0T2xkaXNoUmVnaW9uKTsKLQkJfQotCQlvbGROb2RlLnNldExlbmd0aChuZXdOb2RlLmdldExlbmd0aCgpKTsKLQkJb2xkTm9kZS5zZXRFbmRlZChuZXdOb2RlLmlzRW5kZWQoKSk7Ci0JCW9sZE5vZGUuc2V0UGFyZW50RG9jdW1lbnQobmV3Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpKTsKLQkJLy8gcmVtb3ZlZCBjb25jZXB0IG9mIHBhcnQgb2YgdGhlc2UgcmVnaW9ucywgc28gbm8gbG9uZ2VyIG5lZWQgdG8gZG8uCi0JCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJLy8JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIG9sZFJlZ2lvbnMuZWxlbWVudEF0KGkpOwotCQkvLwkJCXJlZ2lvbi5zZXRQYXJlbnQoaG9sZE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCS8vCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlU2V0Q2FjaGVkTm9kZShDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQkvLyB1c2UgdGhlIGxhc3QgbmV3Tm9kZSBhcyB0aGUgbmV3IGNhY2hlZE5vZGUgcG9zdGlvbiwgdW5sZXNzIGl0cyBudWxsCi0JCS8vIChlLmcuIHdoZW4gbm9kZXMgYXJlIGRlbGV0ZWQpIGluIHdoaWNoIGNhc2UsIGFzc2lnbgotCQkvLyBpdCB0byBhICJzYWZlIiBub2RlIHNvIHdlIGRvbid0IGxvc2UgcmVmZXJlbmNlIHRvIHRoZQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQhCi0JCWlmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCS8vIHVzZSBsYXN0IG5ldyBub2RlIGFzIHRoZSBjYWNoZQotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSkpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgY2FjaGVkTm9kZSBpcyBhbiBvbGQgbm9kZSwgdGhlbiB3ZSdyZSBpbiB0cm91YmxlOgotCQkJLy8gd2UgY2FuJ3QgbGVhdmUgaXQgYXMgdGhlIGNhY2hlZCBub2RlISBhbmQgaXRzIGFscmVhZHkKLQkJCS8vIGJlZW4gZGlzY29ubmVjdGVkIGZyb20gdGhlIG1vZGVsLCBzbyB3ZSBjYW4ndCBkbyBnZXROZXh0Ci0JCQkvLyBvciBnZXRQcmV2aW91cywgc28gd2UnbGwgZ2V0IG9uZSB0aGF0IGlzIHJpZ2h0IGJlZm9yZQotCQkJLy8gKG9yIHJpZ2h0IGFmdGVyKSB0aGUgb2Zmc2V0IG9mIHRoZSBvbGQgbm9kZXMgdGhhdCBhcmUgYmVpbmcKLQkJCS8vIGRlbGV0ZWQuCi0JCQkvLyAKLQkJCS8vIGlmIG5ld05vZGVzSGVhZCBhbmQgY2FjaGVkTm9kZSBhcmUgYm90aCBudWxsLCB0aGVuCi0JCQkvLyBpdCBtZWFucyB3ZSB3ZXJlIGFza2VkIHRvIGluc2VydCBhbiBlbXB0eSBzdHJpbmcgaW50bwotCQkJLy8gYW4gZW1wdHkgZG9jdW1lbnQuIFNvIHdlIGhhdmUgbm90aGluZyB0byBkbyBoZXJlCi0JCQkvLyAodGhhdCBpcywgd2UgaGF2ZSBubyBub2RlIHRvIGNhY2hlKQotCQkJLy8gc2ltaWxhcmx5IGlmIHRoZXJlIGFyZSBubyBuZXcgbm9kZXMgYW5kIG5vIG9sZCBub2RlcyB0aGVuCi0JCQkvLyBub3RoaW5nIHRvIGRvIChidXQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuIC4uLiB3ZSBzaG91bGRuJ3QKLQkJCS8vIGdldCB0aGVyZSBpZiB0aGVyZSBpcyBubyBldmVudCB0byBnZW5lcmF0ZSkuCi0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJCS8vIG5vdGU6IHdlIGNhbid0IHNpbXBsZSB1c2Ugbm9kZUF0Q2hhcmFjdGVyT2Zmc2V0LCBzaW5jZSBpdAotCQkJCS8vIGRlcGVuZHMgb24gY2FjaGVkTm9kZS4KLQkJCQlpZiAob2xkTm9kZXMuaW5jbHVkZXMoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpKSkKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJfQotCQkJaWYgKChmU3RydWN0dXJlZERvY3VtZW50LmdldENhY2hlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgJiYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgaGFwcGVuIG5vdyBsZWdpdGFtYXRlbHkgd2hlbiBhbGwgdGV4dCBpcyBkZWxldGVkCi0JCQkJLy8gZnJvbSBhIGRvY3VtZW50Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjo6cmVTZXRDYWNoZWROb2RlOiBjb3VsZCBub3QgZmluZCBhIG5vZGUgdG8gY2FjaGUhIChpdHMgb2sgaWYgYWxsIHRleHQgZGVsZXRlZCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCS8vIE5PVEU6IHRoaXMgbWV0aG9kIChhbmQgY2xhc3MpIGRlcGVuZCBvbiBiZWluZyBhYmxlIHRvCi0JCS8vIGRvIHRoZSBmb2xsb3dpbmcgY2FzdCAoaS5lLiByZWZlcmVuY2VzIHNvbWUgZmllbGRzIGRpcmVjdGx5KQotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCWZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNwbGljZShDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQkvLwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0T2xkID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5ldyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE9sZCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5ldyA9IG51bGw7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkUHJldmlvdXMgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5leHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0ID0gbnVsbDsKLQkJLy8KLQkJLy8gaWYgY2FsbGVkIHdpdGggYm90aCBhcmd1bWVudHMgZW1wdHkgbGlzdHMsIHdlIGNhbiBkaXNyZWdhcmQuCi0JCS8vIHRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsIHdoZW4gc29tZSB0ZXh0IGlzIHJlcGxhY2VkIHdpdGggdGhlCi0JCS8vIGlkZW50aWNhbCB0ZXh0LgotCQlpZiAoKG9sZE5vZGVzLmdldExlbmd0aCgpID09IDApICYmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gZ2V0IHBvaW50ZXJzCi0JCWlmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWZpcnN0TmV3ID0gbmV3Tm9kZXMuaXRlbSgwKTsKLQkJCWxhc3ROZXcgPSBuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJLy8KLQkJaWYgKG9sZE5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJZmlyc3RPbGQgPSBvbGROb2Rlcy5pdGVtKDApOwotCQkJbGFzdE9sZCA9IG9sZE5vZGVzLml0ZW0ob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCWlmIChmaXJzdE9sZCAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzID0gZmlyc3RPbGQuZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChsYXN0T2xkICE9IG51bGwpCi0JCQkJb2xkTmV4dCA9IGxhc3RPbGQuZ2V0TmV4dCgpOwotCQl9Ci0JCS8vIGhhbmRsZSBzd2l0Y2gKLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJLy8gc3dpdGNoIHN1cnJvdW5kaW5nIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMnIHJlZmVyZW5jZXMgdG8KLQkJCS8vIGxpc3RzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KGZpcnN0TmV3KTsKLQkJCWlmIChuZXdQcmV2aW91cyAhPSBudWxsKQotCQkJCW5ld1ByZXZpb3VzLnNldE5leHQoZmlyc3RPbGQpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKGxhc3ROZXcpOwotCQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCQluZXdOZXh0LnNldFByZXZpb3VzKGxhc3RPbGQpOwotCQkJLy8gc3dpdGNoIGxpc3QgcG9pbnRlcnMgdG8gc3Vycm91bmRpbmcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJaWYgKGZpcnN0T2xkICE9IG51bGwpCi0JCQkJZmlyc3RPbGQuc2V0UHJldmlvdXMobmV3UHJldmlvdXMpOwotCQkJaWYgKGxhc3RPbGQgIT0gbnVsbCkKLQkJCQlsYXN0T2xkLnNldE5leHQobmV3TmV4dCk7Ci0JCQlpZiAoZmlyc3ROZXcgIT0gbnVsbCkKLQkJCQlmaXJzdE5ldy5zZXRQcmV2aW91cyhvbGRQcmV2aW91cyk7Ci0JCQlpZiAobGFzdE5ldyAhPSBudWxsKQotCQkJCWxhc3ROZXcuc2V0TmV4dChvbGROZXh0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIHNob3J0IGNpcmN1aXQgd2hlbiB0aGVyZSBhcmUgbm8gbmV3IG5vZGVzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KG9sZE5leHQpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKG9sZFByZXZpb3VzKTsKLQkJfQotCQkvLwotCQkvLyBTSURFIEVGRkVDVHMKLQkJLy8gaWYgd2UgaGF2ZSBvbGROb2RlcywgYW5kIGlmIG9sZE5leHQgb3Igb2xkUHJldmlvdXMgaXMgbnVsbCwKLQkJLy8gdGhhdCBtZWFucyB3ZSBhcmUgcmVwbGFjaW5nCi0JCS8vIHRoZSBsYXN0Tm9kZSBvciBmaXJzdE5vZGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMncyBjaGFpbiBvZiBub2RlcywKLQkJLy8gc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMgbGFzdCBvciBmaXJzdCBOb2RlCi0JCS8vIGFzIHRoZSBsYXN0IG9yIGZpcnN0IG9mIHRoZSBuZXcgbm9kZXMuCi0JCS8vIChhbmQgc29tZXRpbWVzIGV2ZW4gdGhlc2Ugd2lsbCBiZSBudWxsISBzdWNoIGFzIHdoZW4gZGVsZXRpbmcgYWxsCi0JCS8vIHRleHQgaW4gYSBkb2N1bWVudCkuCi0JCWlmICgob2xkTmV4dCA9PSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0TGFzdERvY3VtZW50UmVnaW9uKGxhc3ROZXcpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBpbiB0aGlzIGNhc2UsIHRoZSBsYXN0IG5vZGUgaXMgYmVpbmcgZGVsZXRlZCwgYnV0IG5vdAotCQkJCS8vIHJlcGxhY2VkCi0JCQkJLy8gd2l0aCBhbnl0aGluZy4gSW4gdGhpcyBjYXNlLCB3ZSBjYW4ganVzdCBiYWNrIHVwIG9uZQotCQkJCS8vIGZyb20gdGhlIGZpcnN0IG9sZCBub2RlCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRMYXN0RG9jdW1lbnRSZWdpb24oZmlyc3RPbGQuZ2V0UHJldmlvdXMoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKChvbGRQcmV2aW91cyA9PSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Rmlyc3REb2N1bWVudFJlZ2lvbihmaXJzdE5ldyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGluIHRoaXMgY2FzZSB0aGUgZmlyc3Qgbm9kZSBpcyBiZWluZyBkZWxldGVkLCBidXQgbm90Ci0JCQkJLy8gcmVwbGFjZWQKLQkJCQkvLyB3aXRoIGFueXRoaW5nLiBTbywgd2UganVzdCBnbyBvbmUgZm9yd2FyZCBwYXN0IHRoZSBsYXN0IG9sZAotCQkJCS8vIG5vZGUuCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRGaXJzdERvY3VtZW50UmVnaW9uKGxhc3RPbGQuZ2V0TmV4dCgpKTsKLQkJCX0KLQkJfQotCQkvLyBhcyBhIHRpbnkgb3B0aW1pemF0aW9uLCB3ZSByZXR1cm4gdGhlIGZpcnN0IG9mIHRoZSBkb3duc3RyZWFtCi0JCS8vIG5vZGVzLAotCQkvLyBpZiBhbnkKLQkJcmV0dXJuIG9sZE5leHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gInJldXNlIiB0aGUgb2xkIGNvbnRhaW5lciByZWdpb24sIHdoZW4KLQkgKiBmb3VuZCB0byBiZSBzYW1lIChzbyBzYW1lIGluc3RhbmNlIGRvZXNuJ3QgY2hhbmdlKS4gVGhlIGdvYWwgaXMgdG8KLQkgKiAidHJhbnNmb3JtIiB0aGUgb2xkIHJlZ2lvbiwgc28gaXRzIGVxdWl2ZWxlbnQgdG8gdGhlIG5ld2x5IHBhcnNlZCBvbmUuCi0JICogIAotCSAqLwotCXByaXZhdGUgSVRleHRSZWdpb24gc3dhcE5ld0Zvck9sZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24pIHsKLQkJLy8gbWFrZXMgdGhlIG9sZCByZWdpb24gaW5zdGFuY2UgdGhlIGNvcnJlY3Qgc2l6ZS4KLQkJb2xkUmVnaW9uLmVxdWF0ZVBvc2l0aW9ucyhuZXdSZWdpb24pOwotCQkvLyBhZGp1c3RzIG9sZCBub2RlIGluc3RhbmNlIGFwcHJvcHJpYXRlbHkKLQkJb2xkTm9kZS5zZXRMZW5ndGgobmV3Tm9kZS5nZXRMZW5ndGgoKSk7Ci0JCW9sZE5vZGUuc2V0RW5kZWQobmV3Tm9kZS5pc0VuZGVkKCkpOwotCQkvLyB3ZSBkbyBoYXZlIHRvIHNldCB0aGUgcGFyZW50IGRvY3VtZW50LCBzaW5jZSB0aGUgb2xkTm9kZSdzCi0JCS8vIHdlcmUgc2V0IHRvIGEgdGVtcG9yYXJ5IG9uZSwgdGhlbiBuZXdOb2RlJ3MgaGF2ZSB0aGUKLQkJLy8gcmlnaHQgb25lLgotCQlvbGROb2RlLnNldFBhcmVudERvY3VtZW50KG5ld05vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKSk7Ci0JCS8vIGlmIHdlJ3JlIHRyYW5zZm9ybWluZyBhIGNvbnRhaW5lciByZWdpb24sIHdlIG5lZWQgdG8gYmUgc3VyZSB0bwotCQkvLyB0cmFuc2ZlciB0aGUgbmV3IGVtYmVkZGVkIHJlZ2lvbnMsIHRvIHRoZSBvbGQgcGFyZW50Ci0JCS8vIE5vdGU6IGlmIG9sZFJlZ2lvbiBoYXNFbWJlZGRlZFJlZ2lvbnMsIHRoZW4gd2Uga25vdyB0aGUKLQkJLy8gbmV3UmVnaW9uIGRvZXMgdG9vLCBzaW5jZSB3ZSBnb3QgaGVyZSBiZWNhdXNlIHRoZXkgd2VyZSB0aGUKLQkJLy8gc2FtZSB0eXBlLgotCQlpZiAoaXNDb2xsZWN0aW9uUmVnaW9uKG9sZFJlZ2lvbikpIHsgLy8gfHwKLQkJCS8vIGhhc0NvbnRhaW5lclJlZ2lvbnMob2xkUmVnaW9uKSkKLQkJCS8vIHsKLQkJCXRyYW5zZmVyRW1iZWRkZWRSZWdpb25zKG9sZE5vZGUsIChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgb2xkUmVnaW9uLCAoSVRleHRSZWdpb25Db250YWluZXIpIG5ld1JlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIG9sZFJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3dpdGNoTm9kZUxpc3RzKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gc3BsaWNlKG9sZE5vZGVzLCBuZXdOb2Rlcyk7Ci0JCS8vIGVuc3VyZSB0aGF0IHRoZSBvbGQgbm9kZXMgaG9sZCBubyByZWZlcmVuY2VzIHRvIHRoZSBleGlzdGluZyBtb2RlbAotCQlpZiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0SXRlbSA9IG9sZE5vZGVzLml0ZW0oMCk7Ci0JCQlmaXJzdEl0ZW0uc2V0UHJldmlvdXMobnVsbCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RJdGVtID0gb2xkTm9kZXMuaXRlbShvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJbGFzdEl0ZW0uc2V0TmV4dChudWxsKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvICJyZXVzZSIgdGhlIG9sZCBjb250YWluZXIgcmVnaW9uLCB3aGVuCi0JICogZm91bmQgdG8gYmUgc2FtZSAoc28gc2FtZSBpbnN0YW5jZSBkb2Vzbid0IGNoYW5nZSkuIFRoZSBnb2FsIGlzIHRvCi0JICogInRyYW5zZm9ybSIgdGhlIG9sZCByZWdpb24sIHNvIGl0cyBlcXVpdmVsZW50IHRvIHRoZSBuZXdseSBwYXJzZWQgb25lLgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNmZXJFbWJlZGRlZFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbkNvbnRhaW5lciBvbGRSZWdpb24sIElUZXh0UmVnaW9uQ29udGFpbmVyIG5ld1JlZ2lvbikgewotCQkvLyB0aGUgb2xkUmVnaW9uIHNob3VsZCBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IHBhcmVudCwgc2luY2UKLQkJLy8gd2UgZ290IGhlcmUgYmVjYXVzZSBhbGwncyBlcXVpdmVsZW50IGV4Y2VwdCB0aGUgcmVnaW9uCi0JCS8vIHBvc3Rpb25zIGhhdmUgY2hhbmdlZC4KLQkJLy9vbGRSZWdpb24uc2V0UGFyZW50KG5ld1JlZ2lvbi5nZXRQYXJlbnQoKSk7Ci0JCS8vIGJ1dCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlcmUncyAibmVzdGVkIiBlbWJlZGRlZCByZWdpb25zLCBhbmQgaWYKLQkJLy8gc28sIHdlIGNhbiBqdXN0IG1vdmUgdGhlbSBvdmVyLiBzZXR0aW5nIHRoZWlyIHBhcmVudCBhcyB0aGlzIG9sZAotCQkvLyByZWdpb24uCi0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zVG9UcmFuc2ZlciA9IG5ld1JlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCW9sZFJlZ2lvbi5zZXRSZWdpb25zKG5ld1JlZ2lvbnNUb1RyYW5zZmVyKTsKLQkJSXRlcmF0b3IgbmV3UmVnaW9uc0luT2xkT25lID0gbmV3UmVnaW9uc1RvVHJhbnNmZXIuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG5ld1JlZ2lvbnNJbk9sZE9uZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIG5ld09uZSA9IChJVGV4dFJlZ2lvbikgbmV3UmVnaW9uc0luT2xkT25lLm5leHQoKTsKLQkJCWlmIChpc0NvbGxlY3Rpb25SZWdpb24obmV3T25lKSkgeyAvLyB8fAotCQkJCS8vIGhhc0NvbnRhaW5lclJlZ2lvbnMobmV3T25lKSkgewotCQkJCS8vKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgbmV3T25lKS5zZXRQYXJlbnQob2xkUmVnaW9uKTsKLQkJCQlvbGRSZWdpb24uc2V0UmVnaW9ucyhuZXdSZWdpb24uZ2V0UmVnaW9ucygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVEb3duU3RyZWFtUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiBsYXN0S25vd25SZWdpb24pIHsKLQkJLy8gc28gYWxsIHJlZ2lvbnMgYWZ0ZXIgdGhlIGxhc3Qga25vd24gcmVnaW9uIChsYXN0IGtub3duIHRvIGJlIG9rKQotCQkvLyBoYXZlIHRvIGhhdmUgdGhlaXIgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgYWRqdXN0ZWQuCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpbnQgbGlzdExlbmd0aCA9IHJlZ2lvbnMuc2l6ZSgpOwotCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCS8vIGZpcnN0LCBsb29wIHRocm91Z2ggdG8gZmluZCB3aGVyZSB0byBzdGFydAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uID09IGxhc3RLbm93blJlZ2lvbikgewotCQkJCXN0YXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIG5vdywgYmVnaW5uaW5nIG9uZSBwYXN0IHRoZSBsYXN0IGtub3duIG9uZSwgbG9vcAotCQkvLyB0aHJvdWdoIHRvIGVuZCBvZiBsaXN0LCBhZGp1c3RpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zdGlvbnMuCi0JCXN0YXJ0SW5kZXgrKzsKLQkJZm9yIChpbnQgaiA9IHN0YXJ0SW5kZXg7IGogPCBsaXN0TGVuZ3RoOyBqKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGopOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KGZMZW5ndGhEaWZmZXJlbmNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTExOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLQotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7Ci0KLQlwcml2YXRlIGludCBjb3VudDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkSGVhZDsKLQotCS8qKgotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3SGVhZCkgewotCQlzdXBlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvdW50Tm9kZSA9IGhlYWQgPSBuZXdIZWFkOwotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCWNvdW50Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChEZWJ1Zy5ERUJVRyA+IDUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTiBOb2RlcyBpbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiBDb250cnVjdG9yOiAiICsgY291bnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZCkgewotCQlzdXBlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvdW50Tm9kZSA9IGhlYWQgPSBzdGFydDsKLQkJaWYgKChzdGFydCA9PSBudWxsKSB8fCAoZW5kID09IG51bGwpKSB7Ci0JCQkvLyBlcnJvciBjb25kaXRpb24KLQkJCWNvdW50ID0gMDsKLQkJCXJldHVybjsKLQkJfQotCQkvL0lmIGJvdGggbm9kZXMgYXJlIG5vbi1udWxsLCB3ZSBhc3N1bWUgdGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IG9uZQotCQkvLyBpdGVtCi0JCWNvdW50ID0gMTsKLQkJd2hpbGUgKGNvdW50Tm9kZSAhPSBlbmQpIHsKLQkJCWNvdW50Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5ERUJVRyA+IDUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTiBOb2RlcyBpbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiBDb250cnVjdG9yOiAiICsgY291bnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBoYXNNb3JlRWxlbWVudHMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIGNvdW50ID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBuZXh0RWxlbWVudCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJaWYgKGNvdW50ID4gMCkgewotCQkJY291bnQtLTsKLQkJCW9sZEhlYWQgPSBoZWFkOwotCQkJaGVhZCA9IGhlYWQuZ2V0TmV4dCgpOwotCQkJcmV0dXJuIG9sZEhlYWQ7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTIxYjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFkanVzdFN0YXJ0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUsIGludCBhZGp1c3RtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBoZWFkTm9kZTsKLQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCWFOb2RlLmFkanVzdFN0YXJ0KGFkanVzdG1lbnQpOwotCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGNvdW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChmbGF0Tm9kZXMgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGZsYXROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmbGF0Tm9kZXMuaXRlbShpKTsKLQkJCQkvLyBkb24ndCBrbm93IHdoeSwgYnV0IHdlJ3JlIGdldHRpbmcgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMKLQkJCQkvLyBpbiB0aGlzIG1ldGhvZAotCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gcmVzdWx0ICsgbm9kZS5nZXROdW1iZXJPZlJlZ2lvbnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBnZXRUZXh0KENvcmVOb2RlTGlzdCBmbGF0Tm9kZXMpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChmbGF0Tm9kZXMgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJLy9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFOb2RlID0gbnVsbDsKLQkJCWludCBsZW5ndGggPSBmbGF0Tm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmZi5hcHBlbmQoZmxhdE5vZGVzLml0ZW0oaSkuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJCXJlc3VsdCA9IGJ1ZmYudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29yZU5vZGVMaXN0IHNldFBhcmVudERvY3VtZW50KENvcmVOb2RlTGlzdCBub2RlbGlzdCwgSVN0cnVjdHVyZWREb2N1bWVudCB0ZXh0U3RvcmUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlbGlzdCwgIm5vZGVsaXN0IHdhcyBudWxsIGluIENvcmVOb2RlTGlzdDo6c2V0VGV4dFN0b3JlKENvcmVOb2RlTGlzdCwgU3RydWN0dXJlZFRleHRTdG9yZSkiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuID0gbm9kZWxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IG5vZGVsaXN0Lml0ZW0oaSk7Ci0JCQkvL0Fzc2VydC5pc05vdE51bGwobm9kZSwgIndobydzIHB1dHRpbmcgbnVsbCBpbiB0aGUgbm9kZSBsaXN0PyBpbgotCQkJLy8gQ29yZU5vZGVMaXN0OjpzZXRUZXh0U3RvcmUoQ29yZU5vZGVMaXN0LAotCQkJLy8gU3RydWN0dXJlZFRleHRTdG9yZSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJbm9kZS5zZXRQYXJlbnREb2N1bWVudCh0ZXh0U3RvcmUpOwotCQl9Ci0JCXJldHVybiBub2RlbGlzdDsKLQl9Ci0KLQkvLwlwdWJsaWMgZmluYWwgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkvLyBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSwKLQkvLyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkvLwkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCS8vCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCS8vCQkJYU5vZGUuc2V0UGFyZW50RG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkvLwkJCWFOb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGFOb2RlLmdldE5leHQoKTsKLQkvLwkJfQotCS8vCQlyZXR1cm4gaGVhZE5vZGU7Ci0JLy8JfQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBoZWFkTm9kZTsKLQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCWFOb2RlLnNldFBhcmVudERvY3VtZW50KGRvY3VtZW50KTsKLQkJCWFOb2RlID0gYU5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFZlY3RvciB0b1ZlY3RvcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBoZWFkTm9kZTsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JCQl2LmFkZEVsZW1lbnQoYU5vZGUpOwotCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzMWFhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZSBleHRlbmRzIFNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlIGltcGxlbWVudHMgQ2hhclNlcXVlbmNlLCBJUmVnaW9uQ29tcGFyaWJsZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc291cmNlCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlKElUZXh0U3RvcmUgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2NoYXJBdChpbnQpCi0JICovCi0JcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotCQlyZXR1cm4gZ2V0KGluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjbGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQkJcmV0dXJuIGdldExlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjCi0JICogQHBhcmFtIGQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoZXNJZ25vcmVDYXNlKGNoYXIgYzEsIGNoYXIgYzIpIHsKLQkJLy8gd2UgY2hlY2sgYm90aCBjYXNlIGNvbnZlcnNpb25zIHRvIGhhbmRsZSB0aG9zZSBmZXcgY2FzZXMsCi0JCS8vIGluIGxhbmd1YWdlcyBzdWNoIGFzIFR1cmtpc2gsIHdoaWNoIGhhdmUgc29tZSBjaGFyYWN0ZXJzCi0JCS8vIHdoaWNoIHNvcnQgb2YgaGF2ZSAzIGNhc2VzLgotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzIpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzIpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IGNvbXBhcmVMZW5ndGggPSBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWlmIChjb21wYXJlTGVuZ3RoID09IGxlbmd0aCkgewotCQkJaW50IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aDsKLQkJCWlmIChlbmRPZmZzZXQgPD0gbGVuZ3RoKCkpIHsKLQkJCQlyZXN1bHQgPSByZWdpb25NYXRjaGVzKG9mZnNldCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYXNzdW1lcyBhbGwgbGVuZ3RocyBoYXZlIGJlZW4gY2hlY2tlZCBhbmQgZmFsbCB3aXRoaW50Ci0JICogZXhjZXB0YWJsZSBsaW1pdHMKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIHN0cmluZ1RvQ29tcGFyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaW50IHN0cmluZ09mZnNldCA9IDA7Ci0JCWludCBsZW4gPSBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGNoYXJBdChpKSAhPSBzdHJpbmdUb0NvbXBhcmUuY2hhckF0KHN0cmluZ09mZnNldCsrKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgY29tcGFyZUxlbmd0aCA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJaWYgKGNvbXBhcmVMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJaWYgKGVuZE9mZnNldCA8PSBsZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKG9mZnNldCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpbnQgc3RyaW5nT2Zmc2V0ID0gMDsKLQkJaW50IGxlbiA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoIW1hdGNoZXNJZ25vcmVDYXNlKGNoYXJBdChpKSwgc3RyaW5nVG9Db21wYXJlLmNoYXJBdChzdHJpbmdPZmZzZXQrKykpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQotCQlyZXR1cm4gZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjVlNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFRleHRTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBWaWFjaGVzbGF2IEthYmFub3ZpY2gvRXhhZGVsIDk3ODE3IFdyb25nIGFsZ29yaXRtIGluIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFRleHRTdG9yZQotICogICAgIAkJCWh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzgxNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5HYXBUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlIGltcGxlbWVudHMgSVRleHRTdG9yZSwgQ2hhclNlcXVlbmNlLCBJUmVnaW9uQ29tcGFyaWJsZSB7Ci0KLQlwcml2YXRlIEdhcFRleHRTdG9yZSBmSW50ZXJuYWxTdG9yZTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlKCkgewotCQl0aGlzKDUwLCAzMDApOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb3dXYXRlcm1hcmsKLQkgKiBAcGFyYW0gaGlnaFdhdGVybWFyawotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUoaW50IGxvd1dhdGVybWFyaywgaW50IGhpZ2hXYXRlcm1hcmspIHsKLQkJc3VwZXIoKTsKLQkJZkludGVybmFsU3RvcmUgPSBuZXcgR2FwVGV4dFN0b3JlKGxvd1dhdGVybWFyaywgaGlnaFdhdGVybWFyayk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2NoYXJBdChpbnQpCi0JICovCi0JcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0KGluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNnZXQoaW50KQotCSAqLwotCXB1YmxpYyBjaGFyIGdldChpbnQgb2Zmc2V0KSB7Ci0KLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldChvZmZzZXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI2dldChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjZ2V0TGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2xlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBsZW5ndGgoKSB7Ci0KLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldExlbmd0aCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzSWdub3JlQ2FzZShjaGFyIGMxLCBjaGFyIGMyKSB7Ci0JCS8vIHdlIGNoZWNrIGJvdGggY2FzZSBjb252ZXJzaW9ucyB0byBoYW5kbGUgdGhvc2UgZmV3IGNhc2VzLAotCQkvLyBpbiBsYW5ndWFnZXMgc3VjaCBhcyBUdXJraXNoLCB3aGljaCBoYXZlIHNvbWUgY2hhcmFjdGVycwotCQkvLyB3aGljaCBzb3J0IG9mIGhhdmUgMyBjYXNlcy4KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMyKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMyKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBjb21wYXJlTGVuZ3RoID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlpZiAoY29tcGFyZUxlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCWludCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQlpZiAoZW5kT2Zmc2V0IDw9IGxlbmd0aCgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVnaW9uTWF0Y2hlcyhvZmZzZXQsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgYWxsIGxlbmd0aHMgaGF2ZSBiZWVuIGNoZWNrZWQgYW5kIGZhbGwgd2l0aGludAotCSAqIGV4Y2VwdGFibGUgbGltaXRzCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBzdHJpbmdUb0NvbXBhcmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWludCBzdHJpbmdPZmZzZXQgPSAwOwotCQlpbnQgZW5kID0gb2Zmc2V0ICsgc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgZW5kOyBpKyspIHsKLQkJCWlmIChjaGFyQXQoaSkgIT0gc3RyaW5nVG9Db21wYXJlLmNoYXJBdChzdHJpbmdPZmZzZXQrKykpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IGNvbXBhcmVMZW5ndGggPSBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWlmIChjb21wYXJlTGVuZ3RoID09IGxlbmd0aCkgewotCQkJaW50IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aDsKLQkJCWlmIChlbmRPZmZzZXQgPD0gbGVuZ3RoKCkpIHsKLQkJCQlyZXN1bHQgPSByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShvZmZzZXQsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaW50IHN0cmluZ09mZnNldCA9IDA7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBlbmQ7IGkrKykgewotCQkJaWYgKCFtYXRjaGVzSWdub3JlQ2FzZShjaGFyQXQoaSksIHN0cmluZ1RvQ29tcGFyZS5jaGFyQXQoc3RyaW5nT2Zmc2V0KyspKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjcmVwbGFjZShpbnQsIGludCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQlmSW50ZXJuYWxTdG9yZS5yZXBsYWNlKG9mZnNldCwgbGVuZ3RoLCB0ZXh0KTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI3NldChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCkgewotCQlmSW50ZXJuYWxTdG9yZS5zZXQodGV4dCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJLy8gY29udmVydCAnZW5kJyB0byAnbGVuZ3RoJwotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N1YlNldFRleHRTdG9yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N1YlNldFRleHRTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWNhOGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdWJTZXRUZXh0U3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0vKioKLSAqIFRoaXMgaXMgYSBjb252aWVuY2Ugb3IgdXRpbGl0eSBjbGFzcyB0aGF0IGFsbG93cyB5b3UgdG8gbWFrZSBhIGNvcHkgb2YgYQotICogcGFydCBvZiBhIGxhcmdlciB0ZXh0IHN0b3JlLCBidXQgaGF2ZSB0aGUgY29weSBiZWhhdmUgYXMgaWYgaXQgd2FzIHRoZQotICogbGFyZ2VyIHRleHQgc3RvcmUuCi0gKiAKLSAqIEluIG90aGVyIHdvcmRzLCBpdCBwcm92aWRlcyBhIHN1YnNldCBvZiBhIGxhcmdlciBkb2N1bWVudCwgdGhhdCAibG9va3MgbGlrZSIKLSAqIHRoZSBvcmdpbmFsIGRvY3VtZW50LiBUaGF0IGlzLCAibG9va3MgbGlrZSIgaW4gdGVybXMgb2Ygb2Zmc2V0cyBhbmQgbGVuZ3Rocy4KLSAqIFZhbGlkIGFjY2VzcyBjYW4gb25seSBiZSBtYWRlIHRvIGRhdGEgYmV0d2VlbiB0aGUgb3JpZ25hbCBvZmZzZXRzLCBldmVuCi0gKiB0aG91Z2ggdGhvc2Ugb2Zmc2V0cyBhcmUgaW4gdGhlIHNhbWUgdW5pdHMgYXQgdGhlIG9yaWdpbmFsLCBhbmQgZXZlbiB0aG91Z2gKLSAqIHRoZSBsZW5ndGggYXBwZWFycyB0byBiZSBsb25nLgotICogCi0gKiBGb3IgZXhhbXBsZSwgaWYgYSBzdWJzZXR0ZXh0IHN0b3JlIGlzIGNyZWF0ZWQgZm9yIHRoZSBkZWYgcGFydCBvZiBhYmNkZWZnaCwKLSAqIHRoZW4gZ2V0KDMsNSkgaXMgdmFsaWQsIGdldExlbmd0aCBpcyA4LiBBbnkgb3RoZXIgYWNjZXNzLCBzdWNoIGFzCi0gKiBnZXRDaGFyKDIpLCB3b3VsZCBiZSBpbnZhbGlkLgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotCi0vKioKLSAqIFNpbWlsYXIgdG8gYmFzaWNzIG9mIElEb2N1bWVudCwgYnV0IHRoZSBvZmZzZXRzIGFyZSBtYXBwZWQgZnJvbSBjb29yZGluYXRlcwotICogb2YgdW5kZXJseWluZyBzdG9yYWdlIHRvIGEgInZpcnR1YWwiIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgU3ViU2V0VGV4dFN0b3JlIGltcGxlbWVudHMgSVRleHRTdG9yZSB7Ci0JcHJpdmF0ZSBpbnQgcHNldWRvQmVnaW5PZmZzZXQ7IC8vIG1hcHMgdG8gInplcm8iIHBvc3Rpb24gb2YgbmV3IHRleHQKLQkvL3ByaXZhdGUgaW50IHBzZXVkb0VuZE9mZnNldDsKLQlwcml2YXRlIGludCBwc2V1ZG9MZW5ndGg7IC8vIGxlbmd0aCBvZiBvbGQvb3JpZ2luYWwgZG9jdW1lbnQKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkvKioKLQkgKiBTdWJTZXRUZXh0U3RvcmUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5pdGlhbENvbnRlbnQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3ViU2V0VGV4dFN0b3JlKFN0cmluZyBpbml0aWFsQ29udGVudCwgaW50IGJlZ2luT2Zmc2V0LCBpbnQgZW5kT2Zmc2V0LCBpbnQgb3JpZ2luYWxEb2N1bWVudExlbmd0aCkgewotCQlzdXBlcigpOwotCQlwc2V1ZG9CZWdpbk9mZnNldCA9IGJlZ2luT2Zmc2V0OwotCQkvL3BzZXVkb0VuZE9mZnNldCA9IGVuZE9mZnNldDsKLQkJLy8gdXNlZCB0byBiZSBvcmlnaW5hbERvY3VtZW50LmdldExlbmd0aCAuLi4gbm90IHN1cmUgaWYgdXNlZCwgb3IKLQkJLy8gd2hpY2gKLQkJLy8gaXMgcmlnaHQKLQkJcHNldWRvTGVuZ3RoID0gb3JpZ2luYWxEb2N1bWVudExlbmd0aDsKLQkJc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihpbml0aWFsQ29udGVudCk7Ci0JCS8vc2V0KGluaXRpYWxDb250ZW50KTsKLQl9Ci0KLQkvLyB0aGlzIGlzIG91ciAicHJpdmF0ZSIgZ2V0LCB3aGljaCBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkCi0JLy8gdXNlIHRvIGdldCB1c2luZyAicmVhbCIgY29vcmRpbmF0ZXMgb2YgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbi4KLQlwcml2YXRlIFN0cmluZyBfZ2V0KGludCBiZWdpbiwgaW50IGxlbmd0aCkgewotCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpbnQgc3JjRW5kID0gYmVnaW4gKyBsZW5ndGg7Ci0JCXN0cmluZ0J1ZmZlci5nZXRDaGFycyhiZWdpbiwgc3JjRW5kLCBjaGFycywgMCk7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNoYXJzKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXQoaW50IG9mZnNldCkgewotCQlyZXR1cm4gc3RyaW5nQnVmZmVyLmNoYXJBdChvZmZzZXQgLSBwc2V1ZG9CZWdpbk9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGJlZ2luCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChpbnQgYmVnaW4sIGludCBsZW5ndGgpIHsKLQkJLy8gcmVtYXAgdGhlIGJlZ2luIGFuZCBlbmQgdG8gImFwcGVhciIgdG8gYmUgaW4gdGhlCi0JCS8vIHNhbWUgY29vcmRpbmF0ZXMgb2YgdGhlIG9yaWdpbmFsIHBhcmVudERvY3VtZW50Ci0JCXJldHVybiBfZ2V0KGJlZ2luIC0gcHNldWRvQmVnaW5PZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGJlZ2luCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDaGFyKGludCBwb3MpIHsKLQkJLy8gcmVtYXAgdGhlIGJlZ2luIGFuZCBlbmQgdG8gImFwcGVhciIgdG8gYmUgaW4gdGhlCi0JCS8vIHNhbWUgY29vcmRpbmF0ZXMgb2YgdGhlIG9yaWdpbmFsIHBhcmVudERvY3VtZW50Ci0JCXJldHVybiBnZXQocG9zIC0gcHNldWRvQmVnaW5PZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIFdlIHJlZGVmaW5lIGdldExlbmd0aCBzbyBpdHMgbm90IHRoZSB0cnVlIGxlbmd0aCBvZiB0aGlzIHN1Yi1zZXQKLQkgKiBkb2N1bWVudCwgYnV0IHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsLiBUaGlzIGlzIG5lZWRlZCwgYXMgYSBzaW1wbGUKLQkgKiBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBzZWUgaWYgdGhlIHBzZXVkbyBlbmQgaXMgZXF1YWwgdGhlIGxhc3QKLQkgKiBwb3NpdGlvbiBvZiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBwc2V1ZG9MZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIGFzIGlmIGNvbnNpZGVyZWQgYSB0cnVlLCBzdGFuZGFsb25lIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBnZXRUcnVlTGVuZ3RoKCkgewotCQlyZXR1cm4gc3RyaW5nQnVmZmVyLmxlbmd0aCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2hhbmdlcykgewotCQkvLyByZW1hcCB0aGUgYmVnaW4gYW5kIGVuZCB0byAiYXBwZWFyIiB0byBiZSBpbiB0aGUKLQkJLy8gc2FtZSBjb29yZGluYXRlcyBvZiB0aGUgb3JpZ2luYWwgcGFyZW50RG9jdW1lbnQKLQkJaW50IGVuZCA9IGJlZ2luICsgbGVuZ3RoOwotCQlzdHJpbmdCdWZmZXIucmVwbGFjZShiZWdpbiAtIHBzZXVkb0JlZ2luT2Zmc2V0LCBlbmQsIGNoYW5nZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCkgewotCQlzdHJpbmdCdWZmZXIuc2V0TGVuZ3RoKDApOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9UZXh0UmVnaW9uTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9UZXh0UmVnaW9uTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5MjMwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvVGV4dFJlZ2lvbkxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBUZXh0UmVnaW9uTGlzdEltcGwgaW1wbGVtZW50cyBJVGV4dFJlZ2lvbkxpc3QgewotCi0JcHJpdmF0ZSBjbGFzcyBOdWxsSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCXB1YmxpYyBOdWxsSXRlcmF0b3IoKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCByZW1vdmUgcmVnaW9ucyB2aWEgaXRlcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgUmVnaW9uSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCXByaXZhdGUgSVRleHRSZWdpb25bXSBmSXRlcmF0b3JSZWdpb25zOwotCQlwcml2YXRlIGludCBpbmRleCA9IC0xOwotCQlwcml2YXRlIGludCBtYXhpbmRleCA9IC0xOwotCi0JCXB1YmxpYyBSZWdpb25JdGVyYXRvcigpIHsKLQkJCWZJdGVyYXRvclJlZ2lvbnMgPSB0b0FycmF5KCk7Ci0JCQltYXhpbmRleCA9IGZJdGVyYXRvclJlZ2lvbnMubGVuZ3RoIC0gMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gaW5kZXggPCBtYXhpbmRleDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCWlmICghKGluZGV4IDwgbWF4aW5kZXgpKQotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQlyZXR1cm4gZkl0ZXJhdG9yUmVnaW9uc1srK2luZGV4XTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCByZW1vdmUgcmVnaW9ucyB2aWEgaXRlcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBncm93dGhDb25zdGFudCA9IDI7Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uW10gZlJlZ2lvbnM7Ci0JcHJpdmF0ZSBpbnQgZlJlZ2lvbnNDb3VudCA9IDA7Ci0KLQlwdWJsaWMgVGV4dFJlZ2lvbkxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmVnaW9uTGlzdEltcGwoSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QpIHsKLQkJdGhpcygpOwotCQlmUmVnaW9ucyA9IChJVGV4dFJlZ2lvbltdKSByZWdpb25MaXN0LnRvQXJyYXkoKS5jbG9uZSgpOwotCQlmUmVnaW9uc0NvdW50ID0gZlJlZ2lvbnMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVuc3VyZUNhcGFjaXR5KGZSZWdpb25zQ291bnQgKyAxKTsKLQkJZlJlZ2lvbnNbZlJlZ2lvbnNDb3VudCsrXSA9IHJlZ2lvbjsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbnNlcnRQb3MsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zKSB7Ci0JCS8vIGJlZ2lubmluZyBvZiBsaXN0IGlzIDAgdG8gaW5zZXJ0UG9zLTEKLQkJLy8gcmVtYWluZGVyIG9mIGxpc3QgaXMgaW5zZXJ0UG9zIHRvIGZSZWdpb25zQ291bnQKLQkJLy8gcmVzdWx0aW5nIHRvdGFsIHdpbGwgYmUgYmUgZlJlZ2lvbnNDb3VudCArIG5ld1JlZ2lvbnMuc2l6ZSgpCi0JCWlmIChpbnNlcnRQb3MgPCAwIHx8IGluc2VydFBvcyA+IGZSZWdpb25zQ291bnQpIHsKLQkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaW5zZXJ0UG9zKTsKLQkJfQotCi0JCWludCBuZXdSZWdpb25zU2l6ZSA9IG5ld1JlZ2lvbnMuc2l6ZSgpOwotCi0JCWVuc3VyZUNhcGFjaXR5KGZSZWdpb25zQ291bnQgKyBuZXdSZWdpb25zU2l6ZSk7Ci0KLQkJaW50IG51bU1vdmVkID0gZlJlZ2lvbnNDb3VudCAtIGluc2VydFBvczsKLQkJaWYgKG51bU1vdmVkID4gMCkKLQkJCVN5c3RlbS5hcnJheWNvcHkoZlJlZ2lvbnMsIGluc2VydFBvcywgZlJlZ2lvbnMsIGluc2VydFBvcyArIG5ld1JlZ2lvbnNTaXplLCBudW1Nb3ZlZCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdSZWdpb25zU2l6ZTsgaSsrKQotCQkJZlJlZ2lvbnNbaW5zZXJ0UG9zKytdID0gbmV3UmVnaW9ucy5nZXQoaSk7Ci0KLQkJZlJlZ2lvbnNDb3VudCArPSBuZXdSZWdpb25zU2l6ZTsKLQkJcmV0dXJuIG5ld1JlZ2lvbnNTaXplICE9IDA7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJLy8gbm90ZTogc2l6ZSBvZiBhcnJheSBpcyBub3QgcmVkdWNlZCEKLQkJZlJlZ2lvbnNDb3VudCA9IDA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZUNhcGFjaXR5KGludCBuZWVkZWQpIHsKLQkJaWYgKGZSZWdpb25zID09IG51bGwpIHsKLQkJCS8vIGZpcnN0IHRpbWUKLQkJCWZSZWdpb25zID0gbmV3IElUZXh0UmVnaW9uW25lZWRlZF07Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IG9sZExlbmd0aCA9IGZSZWdpb25zLmxlbmd0aDsKLQkJaWYgKG9sZExlbmd0aCA8IG5lZWRlZCkgewotCQkJSVRleHRSZWdpb25bXSBvbGRBZGFwdGVycyA9IGZSZWdpb25zOwotCQkJSVRleHRSZWdpb25bXSBuZXdBZGFwdGVycyA9IG5ldyBJVGV4dFJlZ2lvbltuZWVkZWQgKyBncm93dGhDb25zdGFudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEFkYXB0ZXJzLCAwLCBuZXdBZGFwdGVycywgMCwgZlJlZ2lvbnNDb3VudCk7Ci0JCQlmUmVnaW9ucyA9IG5ld0FkYXB0ZXJzOwotCQl9Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGZSZWdpb25zQ291bnQpIHsKLQkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaW5kZXgpOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlc3VsdCA9IGZSZWdpb25zW2luZGV4XTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0KLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCWlmIChmUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocmVnaW9uLmVxdWFscyhmUmVnaW9uc1tpXSkpIHsKLQkJCQkJCXJlc3VsdCA9IGk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBmUmVnaW9uc0NvdW50ID09IDA7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlpZiAoc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBuZXcgTnVsbEl0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFJlZ2lvbkl0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gcmVtb3ZlKGludCBpbmRleCkgewotCQkvLyBtdWNoIG1vcmUgZWZmaWNpZW50IHdheXMgdG8gaW1wbGVtZW50IHRoaXMsIGJ1dAotCQkvLyBJIGRvdWJ0IGlmIGNhbGxlZCBvZnRlbgotCQlJVGV4dFJlZ2lvbiBvbmVUb1JlbW92ZSA9IGdldChpbmRleCk7Ci0JCXJlbW92ZShvbmVUb1JlbW92ZSk7Ci0JCXJldHVybiBvbmVUb1JlbW92ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVRleHRSZWdpb24gYSkgewotCQlpZiAoZlJlZ2lvbnMgPT0gbnVsbCB8fCBhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBuZXdJbmRleCA9IDA7Ci0JCUlUZXh0UmVnaW9uW10gbmV3UmVnaW9ucyA9IG5ldyBJVGV4dFJlZ2lvbltmUmVnaW9uc0NvdW50XTsKLQkJaW50IG9sZFJlZ2lvbkNvdW50ID0gZlJlZ2lvbnNDb3VudDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBvbGRJbmRleCA9IDA7IG9sZEluZGV4IDwgb2xkUmVnaW9uQ291bnQ7IG9sZEluZGV4KyspIHsKLQkJCUlUZXh0UmVnaW9uIGNhbmRpZGF0ZSA9IGZSZWdpb25zW29sZEluZGV4XTsKLQkJCWlmIChhID09IGNhbmRpZGF0ZSkgewotCQkJCWZSZWdpb25zQ291bnQtLTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9IGVsc2UKLQkJCQluZXdSZWdpb25zW25ld0luZGV4KytdID0gZlJlZ2lvbnNbb2xkSW5kZXhdOwotCQl9Ci0JCWlmIChmb3VuZCkKLQkJCWZSZWdpb25zID0gbmV3UmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QpIHsKLQkJLy8gbXVjaCBtb3JlIGVmZmljaWVudCB3YXlzIHRvIGltcGxlbWVudCB0aGlzLCBidXQKLQkJLy8gSSBkb3VidCBpZiBjYWxsZWQgb2Z0ZW4KLQkJaWYgKHJlZ2lvbkxpc3QgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJdGhpcy5yZW1vdmUocmVnaW9uTGlzdC5nZXQoaSkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBmUmVnaW9uc0NvdW50OwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbltdIHRvQXJyYXkoKSB7Ci0JCS8vIHJldHVybiAiY2xvbmUiIG9mIGludGVybmFsIGFycmF5Ci0JCUlUZXh0UmVnaW9uW10gbmV3QXJyYXkgPSBuZXcgSVRleHRSZWdpb25bZlJlZ2lvbnNDb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZlJlZ2lvbnMsIDAsIG5ld0FycmF5LCAwLCBmUmVnaW9uc0NvdW50KTsKLQkJcmV0dXJuIG5ld0FycmF5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvSVN0cnVjdHVyZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyYjc2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvSVN0cnVjdHVyZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotLyoqCi0gKiBMaWtlIHN1cGVyIGNsYXNzIGV4Y2VwdCBhbGxvd3MgbGVuZ3RoIGFuZCBvZmZzZXQgdG8gYmUgbW9kaWZpZWQuIFRoaXMgaXMKLSAqIGNvbnZlbmllbnQgZm9yIHNvbWUgYWxnb3JpdGhtcywgYW5kIGFsbG93cyByZWdpb24gb2JqZWN0cyB0byBiZSByZXVzZWQuCi0gKiBOb3RlOiBUaGVyZSBNSUdIVCBiZSBzb21lIGNvZGUgdGhhdCBhc3N1bWVzIHJlZ2lvbnMgYXJlIGltbXV0YWJsZS4gVGhpcwotICogY2xhc3Mgd291bGQgbm90IGJlIGFwcHJvcHJpYXRlIGZvciB0aG9zZSB1c2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkUmVnaW9uIGV4dGVuZHMgSVJlZ2lvbiB7Ci0Jdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCk7Ci0KLQl2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9JU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWEyMWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9JU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLQotLyoqCi0gKiBTaW1pbGFyIHRvIGV4dGVuZGVkIGludGVyZmFjZSwgZXhjZXB0IGl0IGFsbG93cyB0aGUgbGVuZ3RoLCBvZmZzZXQsIGFuZAotICogdHlwZSB0byBiZSBzZXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gaXRlcmF0aW5nIHRocm91Z2ggYSBudW1iZXIgb2YgInNtYWxsIgotICogcmVnaW9ucywgdGhhdCBhbGwgbWFwIHRvIHRoZSB0aGUgc2FtZSBwYXJ0aW9uIHJlZ2lvbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBleHRlbmRzIElTdHJ1Y3R1cmVkUmVnaW9uLCBJVHlwZWRSZWdpb24gewotCXZvaWQgc2V0VHlwZShTdHJpbmcgcGFydGl0aW9uVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhMWRlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotCi0KLQotLyoqCi0gKiBTaW1pbGFyIHRvIGpmYWNlIHJlZ2lvbiBleGNlcHQgd2Ugd2FudGVkIGEgc2V0dGluZyBvbiBsZW5ndGgKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0cnVjdHVyZWRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZFJlZ2lvbiB7Ci0JLyoqIFRoZSByZWdpb24gbGVuZ3RoICovCi0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQotCS8qKiBUaGUgcmVnaW9uIG9mZnNldCAqLwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJ1Y3R1cmVkUmVnaW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBUd28gcmVnaW9ucyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG9mZnNldCBhbmQgbGVuZ3RoLgotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2VxdWFscwotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElSZWdpb24pIHsKLQkJCUlSZWdpb24gciA9IChJUmVnaW9uKSBvOwotCQkJcmV0dXJuIHIuZ2V0T2Zmc2V0KCkgPT0gZk9mZnNldCAmJiByLmdldExlbmd0aCgpID09IGZMZW5ndGg7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVnaW9uI2dldExlbmd0aAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlZ2lvbiNnZXRPZmZzZXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjaGFzaENvZGUgaGFzY29kZSBpcyBvdmVycmlkZGVuIHNpbmNlIHdlIHByb3ZpZGUgb3VyIG93bgotCSAqICAgICAgZXF1YWxzLgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAoZk9mZnNldCA8PCAyNCkgfCAoZkxlbmd0aCA8PCAxNik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoLgotCSAqIAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIFRoZSBsZW5ndGggdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODIyYThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotCi0KLQotLyoqCi0gKiBTaW1pbGFyIGphY2UgVHlwZWRSZWdpb24sIGJ1dCBoYWQgdG8gc3ViY2xhc3Mgb3VyIHZlcnNpb24gd2hpY2ggYWxsb3dlZAotICogbGVuZ3RoIHRvIGJlIHNldC4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBleHRlbmRzIFNpbXBsZVN0cnVjdHVyZWRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIHsKLQotCS8qKiBUaGUgcmVnaW9uJ3MgdHlwZSAqLwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHR5cGVkIHJlZ2lvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gc3BlY2lmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgcmVnaW9uJ3Mgb2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbidzIGxlbmd0aAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uJ3MgdHlwZQotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIob2Zmc2V0LCBsZW5ndGgpOwotCQlmVHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogVHdvIHR5cGVkIHBvc2l0aW9ucyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG9mZnNldCwgbGVuZ3RoLCBhbmQKLQkgKiB0eXBlLgotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2VxdWFscwotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbikgewotCQkJU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uIHIgPSAoU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uKSBvOwotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhyKSAmJiAoKGZUeXBlID09IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gbnVsbCkgfHwgZlR5cGUuZXF1YWxzKHIuZ2V0VHlwZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJVHlwZWRSZWdpb24jZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCB0eXBlID0gZlR5cGUgPT0gbnVsbCA/IDAgOiBmVHlwZS5oYXNoQ29kZSgpOwotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKSB8IHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlmVHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcy5hcHBlbmQoZ2V0T2Zmc2V0KCkpOwotCQlzLmFwcGVuZCgiOiIpOyAvLyROT04tTkxTLTEkCi0JCXMuYXBwZW5kKGdldExlbmd0aCgpKTsKLQkJcy5hcHBlbmQoIiAtICIpOyAvLyROT04tTkxTLTEkCi0JCXMuYXBwZW5kKGdldFR5cGUoKSk7Ci0JCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjZDc1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLQotCi0vKioKLSAqIEJhc2UgRG9jdW1lbnQgcGFydGl0aW9uZXIgZm9yIFN0cnVjdHVyZWREb2N1bWVudHMuIEJMT0NLX1RFWFQgSVRleHRSZWdpb25zCi0gKiBoYXZlIGEgcGFydGl0aW9uIHR5cGUgb2YgQkxPQ0sgb3IgQkxPQ0s6VEFHTkFNRSBpZiBhIHN1cnJvdW5kaW5nIHRhZ25hbWUKLSAqIHdhcyByZWNvcmRlZC4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRQYXJ0aXRpb25lciwgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCi0Jc3RhdGljIGNsYXNzIENhY2hlZENvbXB1dGVkUGFydGl0aW9ucyB7Ci0JCWludCBmTGVuZ3RoOwotCQlpbnQgZk9mZnNldDsKLQkJSVR5cGVkUmVnaW9uW10gZlBhcnRpdGlvbnM7Ci0JCWJvb2xlYW4gaXNJblZhbGlkOwotCi0JCUNhY2hlZENvbXB1dGVkUGFydGl0aW9ucyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zKSB7Ci0JCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQkJZkxlbmd0aCA9IGxlbmd0aDsKLQkJCWZQYXJ0aXRpb25zID0gcGFydGl0aW9uczsKLQkJCWlzSW5WYWxpZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENhY2hlZENvbXB1dGVkUGFydGl0aW9ucyBjYWNoZWRQYXJ0aXRpb25zID0gbmV3IENhY2hlZENvbXB1dGVkUGFydGl0aW9ucygtMSwgLTEsIG51bGwpOwotCXByb3RlY3RlZCBTdHJpbmdbXSBmU3VwcG9ydGVkVHlwZXMgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlID0gbmV3IFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbigwLCAwLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04pOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uaW5nIG9mIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgY29ubmVjdGVkIGRvY3VtZW50LgotCSAqIFRoZXJlIG11c3QgYmUgYSBkb2N1bWVudCBjb25uZWN0ZWQgdG8gdGhpcyBwYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBOb3RlOiB0aGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgZGlyY3RseSBieSBjbGllbnRzLCB1bmxlc3MgdGhleSBjb250cm9sCi0JICogdGhlIHRocmVhZGluZyB0aGF0IGluY2x1ZGVzIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvY3VtZW50LiBPdGhlcndpc2UKLQkgKiB0aGUgZG9jdW1lbnQgY291bGQgYmUgbW9kaWZpZWQgd2hpbGUgcGFydGl0aW9ucyBhcmUgYmVpbmcgY29tcHV0ZWQuIFdlCi0JICogYWR2aXNlIHRoYXQgY2xpZW50cyB1c2UgdGhlIGNvbXB1dGVQYXJ0aXRpb25zIEFQSSBkaXJlY3RseSBmcm9tIHRoZQotCSAqIGRvY3VtZW50LCBzbyB0aGV5IHdvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhhdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZSBvZiBpbnRlcmVzdAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIG9mIGludGVyZXN0Ci0JICogQHJldHVybiB0aGUgcGFydGl0aW9uaW5nIG9mIHRoZSByYW5nZQotCSAqLwotCXB1YmxpYyBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZG9jdW1lbnQgcGFydGl0aW9uZXIgaXMgbm90IGNvbm5lY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVR5cGVkUmVnaW9uW10gcmVzdWx0cyA9IG51bGw7Ci0KLQotCi0JCWlmICgoIWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkKSAmJiAob2Zmc2V0ID09IGNhY2hlZFBhcnRpdGlvbnMuZk9mZnNldCkgJiYgKGxlbmd0aCA9PSBjYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGgpKSB7Ci0JCQlyZXN1bHRzID0gY2FjaGVkUGFydGl0aW9ucy5mUGFydGl0aW9uczsKLQkJfSBlbHNlIHsKLQotCQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBJVHlwZWRSZWdpb25bXXtnZXRQYXJ0aXRpb24ob2Zmc2V0KX07Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpbnQgZW5kUG9zID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJCWlmIChlbmRQb3MgPiBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJCS8vIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBtb2RlbCBpbnN0YW5jZSBpcyBiZWluZwotCQkJCQkvLyBjaGFuZ2VkCi0JCQkJCS8vIGFuZCBldmVyeW9uZSdzIG5vdCB5ZXQgdXAgdG8gZGF0ZQotCQkJCQlyZXR1cm4gbmV3IElUeXBlZFJlZ2lvbltde2NyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgZ2V0VW5rbm93bigpKX07Ci0JCQkJfQotCQkJCWludCBjdXJyZW50UG9zID0gb2Zmc2V0OwotCQkJCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcHJldmlvdXNQYXJ0aXRpb24gPSBudWxsOwotCQkJCXdoaWxlIChjdXJyZW50UG9zIDwgZW5kUG9zKSB7Ci0JCQkJCWludGVybmFsR2V0UGFydGl0aW9uKGN1cnJlbnRQb3MsIGZhbHNlKTsKLQkJCQkJY3VycmVudFBvcyArPSBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRMZW5ndGgoKTsKLQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBwYXJ0aXRpb24ganVzdCBjb250aW51ZXMgbGFzdCBvbmUKLQkJCQkJLy8gKHR5cGUgaXMgdGhlIHNhbWUpLAotCQkJCQkvLyBpZiBzbywganVzdCBleHRlbmQgbGVuZ3RoIG9mIGxhc3Qgb25lLCBub3QgbmVlZCB0bwotCQkJCQkvLyBjcmVhdGUgbmV3Ci0JCQkJCS8vIGluc3RhbmNlLgotCQkJCQlpZiAocHJldmlvdXNQYXJ0aXRpb24gIT0gbnVsbCAmJiBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRUeXBlKCkuZXF1YWxzKHByZXZpb3VzUGFydGl0aW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCS8vIHNhbWUgcGFydGl0aW9uIHR5cGUKLQkJCQkJCXByZXZpb3VzUGFydGl0aW9uLnNldExlbmd0aChwcmV2aW91c1BhcnRpdGlvbi5nZXRMZW5ndGgoKSArIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldExlbmd0aCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5vdCB0aGUgc2FtZSwgc28gYWRkIHRvIGxpc3QKLQkJCQkJCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcGFydGl0aW9uID0gY3JlYXRlTmV3UGFydGl0aW9uSW5zdGFuY2UoKTsKLQkJCQkJCWxpc3QuYWRkKHBhcnRpdGlvbik7Ci0JCQkJCQkvLyBhbmQgbWFrZSBjdXJyZW50LCBwcmV2aW91cwotCQkJCQkJcHJldmlvdXNQYXJ0aXRpb24gPSBwYXJ0aXRpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0cyA9IG5ldyBJVHlwZWRSZWdpb25bbGlzdC5zaXplKCldOwotCQkJCWxpc3QudG9BcnJheShyZXN1bHRzKTsKLQkJCX0KLQkJCWlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHsKLQkJCQkvLyB0cnVuY2F0ZSByZXR1cm5lZCByZXN1bHRzIHRvIHJlcXVlc3RlZCByYW5nZQotCQkJCWlmIChyZXN1bHRzWzBdLmdldE9mZnNldCgpIDwgb2Zmc2V0ICYmIHJlc3VsdHNbMF0gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFJlZ2lvbikgewotCQkJCQkoKElTdHJ1Y3R1cmVkUmVnaW9uKSByZXN1bHRzWzBdKS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQl9Ci0JCQkJaW50IGxhc3RFbmQgPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uZ2V0T2Zmc2V0KCkgKyByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKGxhc3RFbmQgPiBvZmZzZXQgKyBsZW5ndGggJiYgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRSZWdpb24pIHsKLQkJCQkJKChJU3RydWN0dXJlZFJlZ2lvbikgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdKS5zZXRMZW5ndGgob2Zmc2V0ICsgbGVuZ3RoIC0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLmdldE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGggPSBsZW5ndGg7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZQYXJ0aXRpb25zID0gcmVzdWx0czsKLQkJCWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0KLQotCS8qKgotCSAqIENvbm5lY3RzIHRoZSBkb2N1bWVudCB0byB0aGUgcGFydGl0aW9uZXIsIGkuZS4gaW5kaWNhdGVzIHRoZSBiZWdpbiBvZgotCSAqIHRoZSB1c2FnZSBvZiB0aGUgcmVjZWl2ZXIgYXMgcGFydGl0aW9uZXIgb2YgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmlzSW5WYWxpZCA9IHRydWU7Ci0JCQl0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGlzIGNsYXNzIGFuZCBBUEkgYXJlIGZvciBTdHJ1Y3R1cmVkIERvY3VtZW50cyBvbmx5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIElUZXh0UmVnaW9uQ29udGFpbmVyIGl0c2VsZiBjb250YWlucyBhbm90aGVyCi0JICogSVRleHRSZWdpb25Db250YWluZXIKLQkgKiAKLQkgKiBAcGFyYW0gSVRleHRSZWdpb25Db250YWluZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0VtYmVkZGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyKSB7Ci0JCWJvb2xlYW4gY29udGFpbnNFbWJlZGRlZFJlZ2lvbiA9IGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCWNvbnRhaW5zRW1iZWRkZWRSZWdpb24gPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluc0VtYmVkZGVkUmVnaW9uOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVOZXdQYXJ0aXRpb25JbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24oaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2UuZ2V0T2Zmc2V0KCksIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldExlbmd0aCgpLCBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbmNyZXRlIHBhcnRpdGlvbiBmcm9tIHRoZSBnaXZlbiB2YWx1ZXMuIFJldHVybnMgYSBuZXcKLQkgKiBpbnN0YW5jZSBmb3IgZWFjaCBjYWxsLgotCSAqIAotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIElUeXBlZFJlZ2lvbgotCSAqIAotCSAqIFRPRE86IHNob3VsZCBiZSBwcm90ZWN0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUpOwotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3RzIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBwYXJ0aXRpb25lciwgaS5lLiBpbmRpY2F0ZXMgdGhlIGVuZAotCSAqIG9mIHRoZSB1c2FnZSBvZiB0aGUgcmVjZWl2ZXIgYXMgcGFydGl0aW9uZXIgb2YgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNkaXNjb25uZWN0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJY2FjaGVkUGFydGl0aW9ucy5pc0luVmFsaWQgPSB0cnVlOwotCQl0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWJvdXQgYSBmb3J0aGNvbWluZyBkb2N1bWVudCBjaGFuZ2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZC4gVGhlIHBhcnRpdGlvbmVyIHVwZGF0ZXMgdGhlIHNldCBvZgotCSAqIHJlZ2lvbnMgYW5kIHJldHVybnMgd2hldGhlciB0aGUgc3RydWN0dXJlIG9mIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcKLQkgKiBoYXMgYmVlbiBjaGFuZ2VkLCBpLmUuIHdoZXRoZXIgcGFydGl0aW9ucyBoYXZlIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCS8vIHBhcnRpdGlvbnMgZG9uJ3QgYWx3YXlzIGNoYW5nZSB3aGlsZSBkb2N1bWVudCByZWdpb25zIGRvLAotCQkJLy8gYnV0IHRoYXQncyB0aGUgb25seSAicXVpY2sgY2hlY2siIHdlIGhhdmUuCi0JCQkvLyBJJ20gbm90IHN1cmUgaWYgc29tZXRoaW5nIG1vcmUgc29waGlzdGljYXRlZCB3aWxsIGJlIG5lZWRlZAotCQkJLy8gaW4gdGhlIGZ1dHVyZS4gKGRtdywgMDIvMTgvMDQpLgotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvUGFyc2VyU3BlY2lmaWNDaGVjayhpbnQgb2Zmc2V0LCBib29sZWFuIHBhcnRpdGlvbkZvdW5kLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXh0LCBJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0KSB7Ci0JCS8vIHRoaXMgKGNvbmNlcHR1YWxseSkgYWJzdHJhY3QgbWV0aG9kIGlzIG5vdCBjb25jZXJuZWQgd2l0aAotCQkvLyBzcGVjaWZpYyByZWdpb24gdHlwZXMKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuCi0JICogY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBkb2N1bWVudC4gVGhlIGRvY3VtZW50IGhhcyBwcmV2aW91c2x5Ci0JICogYmVlbiBjb25uZWN0ZWQgdG8gdGhlIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNnZXRDb250ZW50VHlwZShpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRQYXJ0aXRpb24ob2Zmc2V0KS5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBkZWZhdWx0IQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0KLQkJcmV0dXJuIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIGNvbnRlbnQgdHlwZXMgdGhlIHBhcnRpdG9uZXIgc3VwcG9ydHMuCi0JICogSS5lLiBBbnkgcmVzdWx0IGRlbGl2ZXJlZCBieSB0aGlzIHBhcnRpdGlvbmVyIG1heSBub3QgY29udGFpbiBhIGNvbnRlbnQKLQkgKiB0eXBlIHdoaWNoIHdvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGlzIG1ldGhvZCdzIHJlc3VsdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZ2V0TGVnYWxDb250ZW50VHlwZXMoKQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCWlmIChmU3VwcG9ydGVkVHlwZXMgPT0gbnVsbCkgewotCQkJaW5pdExlZ2FsQ29udGVudFR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGZTdXBwb3J0ZWRUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZQotCSAqIGdpdmVuIGRvY3VtZW50LiBUaGUgZG9jdW1lbnQgaGFzIHByZXZpb3VzbHkgYmVlbiBjb25uZWN0ZWQgdG8gdGhlCi0JICogcGFydGl0aW9uZXIuCi0JICogCi0JICogTm90ZTogdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmN0bHkgYnkgY2xpZW50cywgdW5sZXNzIHRoZXkgY29udHJvbAotCSAqIHRoZSB0aHJlYWRpbmcgdGhhdCBpbmNsdWRlcyBtb2RpZmljYXRpb25zIHRvIHRoZSBkb2N1bWVudC4gT3RoZXJ3aXNlCi0JICogdGhlIGRvY3VtZW50IGNvdWxkIGJlIG1vZGlmaWVkIHdoaWxlIHBhcnRpdGlvbnMgYXJlIGJlaW5nIGNvbXB1dGVkLiBXZQotCSAqIGFkdmlzZSB0aGF0IGNsaWVudHMgdXNlIHRoZSBnZXRQYXJ0aXRpb24gQVBJIGRpcmVjdGx5IGZyb20gdGhlCi0JICogZG9jdW1lbnQsIHNvIHRoZXkgd29uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LgotCSAqIAotCSAqIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNnZXRQYXJ0aXRpb24oaW50KQotCSAqLwotCXB1YmxpYyBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKGludCBvZmZzZXQpIHsKLQkJaW50ZXJuYWxHZXRQYXJ0aXRpb24ob2Zmc2V0LCB0cnVlKTsKLQkJcmV0dXJuIGNyZWF0ZU5ld1BhcnRpdGlvbkluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0LCBTdHJpbmcgcmVzdWx0KSB7Ci0JCS8vIHBhcnNlciBzZW5zaXRpdmUgY29kZSB3YXMgbW92ZWQgdG8gc3ViY2xhc3MgZm9yIHF1aWNrIHRyYW5zaXRpb24KLQkJLy8gdGhpcyAoY29uY2VwdHVhbGx5KSBhYnN0cmFjdCB2ZXJzaW9uIGlzbid0IGNvbmNlcm5lZCB3aXRoIGJsb2NrZWQKLQkJLy8gdGV4dAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0YWduYW1lID0gcmVnaW9uLmdldFN1cnJvdW5kaW5nVGFnKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAodGFnbmFtZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiQkxPQ0s6IiArIHRhZ25hbWUudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSAiQkxPQ0siOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBibG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCi0JCS8vIHJlZ2lvbnMgc2hvdWxkIG5ldmVyIGJlIG51bGwsIG9yIGhvbGQgemVybyByZWdpb25zLCBidXQganVzdCBpbgotCQkvLyBjYXNlLi4uCi0JCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAocmVnaW9ucy5zaXplKCkgPT0gMSkgewotCQkJCS8vIGlmIG9ubHkgb25lLCB0aGVuIGl0cyBhICJwdXJlIiBibG9ja2VkIG5vdGUuCi0JCQkJLy8gaWYgbW9yZSB0aGFuIG9uZSwgdGhlbiBtdXN0IGNvbnRhaW4gc29tZSBlbWJlZGRlZCByZWdpb24KLQkJCQkvLyBjb250YWluZXIKLQkJCQlJVGV4dFJlZ2lvbiBibG9ja2VkUmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQkJLy8gZG91YmxlIGNoZWNrIGZvciBjb2RlIHNhZmVmeSwgdGhvdWdoIHNob3VsZCBhbHdheXMgYmUgdHJ1ZQotCQkJCWlmIChibG9ja2VkUmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChGb3JlaWduUmVnaW9uKSBibG9ja2VkUmVnaW9uLCBvZmZzZXQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbXVzdCBoYXZlIHNvbWUgZW1iZWRkZWQgcmVnaW9uIGNvbnRhaW5lciwgc28gd2UnbGwgbWFrZQotCQkJCS8vIHN1cmUgd2UnbGwgZ2V0IHRoZSBhcHByb3ByaWF0ZSBvbmUKLQkJCQlyZXN1bHQgPSBnZXRSZWxldmVudFJlZ2lvblR5cGUoYmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRQYXJ0aXRpb25UeXBlLgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIGlmIGl0IGdldCdzIHRvIHRoaXMgInJhdyIgbGV2ZWwsIHRoZW4KLQkJLy8gbXVzdCBiZSBkZWZhdWx0LgotCQlyZXR1cm4gZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gYmFzZWQgb24gcmVnaW9uIHR5cGUuIFRoaXMgYmFzaWNhbGx5IG1hcHMgZnJvbQotCSAqIG9uZSByZWdpb24tdHlwZSBzcGFjZSB0byBhbm90aGVyLCBoaWdoZXIgbGV2ZWwsIHJlZ2lvbi10eXBlIHNwYWNlLgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCQkvLwkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIENvbnRleHRSZWdpb25Db250YWluZXIpIHsKLQkJLy8JCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uLCBvZmZzZXQpOwotCQkvLwkJfSBlbHNlIHsKLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0KLQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uRnJvbUJsb2NrZWRUZXh0KHJlZ2lvbiwgb2Zmc2V0LCByZXN1bHQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIG1ldGhvZCB3aXRoICdJVGV4dFJlZ2lvbicgYXMgYXJndW1lbnQsIGV4Y2VwdCBmb3IKLQkgKiBSZWdpb25Db250YWluZXJzLCBpZiBpdCBoYXMgZW1iZWRkZWQgcmVnaW9ucywgdGhlbiB3ZSBuZWVkIHRvIGRyaWxsCi0JICogZG93biBhbmQgcmV0dXJuIERvY3VtZW50UGFydGl0aW9uIGJhc2VkIG9uICJsb3dlc3QgbGV2ZWwiIHJlZ2lvbiB0eXBlLgotCSAqIEZvciBleGFtcGxlLCBpbiA8Ym9keSBpZD0iIDwlPSBvYmplY3QuZ2V0SUQoKSAlPiIgPiBUaGUgdGV4dCBiZXR3ZWVuCi0JICogPCU9IGFuZCAlPiB3b3VsZCBiZSBhICJqYXZhIHJlZ2lvbiIgbm90IGFuICJIVE1MIHJlZ2lvbiIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uQ29udGFpbmVyIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyBUT0RPIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlICdjbGVhbmVkIHVwJyBhZnRlciByZWZhY3RvcmluZwotCQkvLyBpdHMgaW5zdGFuY2VvZiBsb2dpYyBzZWVtcyBtZXNzZWQgdXAgbm93LgotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjb3JlUmVnaW9uID0gcmVnaW9uOwotCQkJaWYgKGNvcmVSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb3JlUmVnaW9uLCAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb3JlUmVnaW9uKS5nZXRSZWdpb25zKCksIG9mZnNldCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUocmVnaW9uKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uKSByZWdpb24sIG9mZnNldCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb25Db250YWluZXIgY29yZVJlZ2lvbiwgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMsIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoY29yZVJlZ2lvbi5jb250YWluc09mZnNldChyZWdpb24sIG9mZnNldCkpIHsKLQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBwYXJ0aXRpb24gdHlwZSBmb3IgdGhlIHplcm8tbGVuZ3RoIHBhcnRpdGlvbiBiZXR3ZWVuIGEKLQkgKiBzdGFydCB0YWcgYW5kIGVuZCB0YWcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSByZWdpb25zLgotCSAqIAotCSAqIEBwYXJhbSBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbgotCSAqIEBwYXJhbSBuZXh0RW5kVGFnTmFtZVJlZ2lvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElUZXh0UmVnaW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQuIEZvciBtb3N0IGNhc2VzLCB0aGlzIHdpbGwKLQkgKiBiZSB0aGUgZmxhdE5vZGUgaXRzZWxmLiBTaG91bGQgaXQgY29udGFpbiBhbiBlbWJlZGRlZAotCSAqIElUZXh0UmVnaW9uQ29udGFpbmVyLCB3aWxsIHJldHVybiB0aGUgaW50ZXJuYWwgcmVnaW9uIGF0IHRoZSBvZmZzZXQKLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBJVGV4dFJlZ2lvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFJlbGV2ZW50UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vCQkqIE5vdGU6IHRoZSBvcmlnaW5hbCBmb3JtIG9mIHRoaXMgbWV0aG9kIC0tIHdoaWNoIHJldHVybmVkICJkZWVwIgotCQkvLyByZWdpb24sIGlzbid0IHRoYXQKLQkJLy8JCSogdXNlZnVsLCBhZnRlciBkb2luZyBwYXJlbnQgZWxpbWluYXRpb24gcmVmYWN0b3JpbmcsCi0JCS8vCQkqIHNpbmNlIG9uY2UgdGhlIGRlZXAgcmVnaW9uIGlzIHJldHVybmVkLCBpdHMgaGFyZCB0byBnZXQgaXRzIHRleHQKLQkJLy8gb3Igb2Zmc2V0IHdpdGhvdXQKLQkJLy8JCSogcHJvcGVyIHBhcmVudC4KLQkJSVRleHRSZWdpb24gcmVzdWx0UmVnaW9uID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5zRW1iZWRkZWRSZWdpb24oZmxhdE5vZGUpKSB7Ci0JCQlyZXN1bHRSZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKHJlc3VsdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJcmVzdWx0UmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIHJlc3VsdFJlZ2lvbikuZ2V0UmVnaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pKSB7Ci0JCQkJCQlyZXN1bHRSZWdpb24gPSByZWdpb247Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdFJlZ2lvbiA9IGZsYXROb2RlOwotCQl9Ci0JCXJldHVybiByZXN1bHRSZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFRvIGJlIHVzZWQsIGluc3RlYWQgb2YgZGVmYXVsdCwgd2hlbiB0aGVyZSBpcyBzb21lIHRoaW5nIHN1cnByaXNpbmcKLQkgKiBhYm91dCBhcmUgYXR0ZW1wdCB0byBwYXJ0aXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVua25vd24oKSB7Ci0JCXJldHVybiBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT047Ci0JfQotCi0JLyoqCi0JICogdG8gYmUgYWJzdHJhY3QgZXZlbnR1YWxseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IFN0cmluZ1tde0lTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTiwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZQotCSAqIGdpdmVuIGRvY3VtZW50LiBUaGUgZG9jdW1lbnQgaGFzIHByZXZpb3VzbHkgYmVlbiBjb25uZWN0ZWQgdG8gdGhlCi0JICogcGFydGl0aW9uZXIuIElmIHRoZSBjaGVja0JldHdlZW4gcGFyYW1ldGVyIGlzIHRydWUsIGFuIG9mZnNldCBiZXR3ZWVuIGEKLQkgKiBzdGFydCBhbmQgZW5kIHRhZyB3aWxsIHJldHVybiBhIHplcm8tbGVuZ3RoIHJlZ2lvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxHZXRQYXJ0aXRpb24oaW50IG9mZnNldCwgYm9vbGVhbiBjaGVja0JldHdlZW4pIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZG9jdW1lbnQgcGFydGl0aW9uZXIgaXMgbm90IGNvbm5lY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlib29sZWFuIHBhcnRpdGlvbkZvdW5kID0gZmFsc2U7Ci0JCWludCBkb2NMZW5ndGggPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpOwotCQkvLyBnZXQgZG9jdW1lbnQgcmVnaW9uIHR5cGUgYW5kIG1hcCB0byBwYXJ0aXRpb24gdHlwZSA6Ci0JCS8vIE5vdGU6IGEgcGFydGlvbiBjYW4gYmUgc21hbGxlciB0aGFuIGEgZmxhdG5vZGUsIGlmIHRoYXQgZmxhdG5vZGUKLQkJLy8gY29udGFpbnMgYSByZWdpb24gY29udGFpbmVyLgotCQkvLyBUaGF0J3Mgd2h5IHdlIG5lZWQgdG8gZ2V0ICJyZWxldmVudCByZWdpb24iLgotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJLy8gZmxhdE5vZGUgaXMgbnVsbCBpZiBlbXB0eSBkb2N1bWVudAotCQkvLyB0aGlzIGlzIGtpbmcgb2YgYSAibm9ybWFsIGNhc2UiIGZvciBlbXB0eSBkb2N1bWVudAotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCWlmIChkb2NMZW5ndGggPT0gMCkgewotCQkJCS8qCi0JCQkJICogSW4gb3JkZXIgdG8gcHJldmVudCBpbmZpbml0ZSBlcnJvciBsb29wcywgdGhpcyBwYXJ0aXRpb24KLQkJCQkgKiBtdXN0IG5ldmVyIGhhdmUgYSB6ZXJvIGxlbmd0aCB1bmxlc3MgdGhlIGRvY3VtZW50IGlzIGFsc28KLQkJCQkgKiB6ZXJvIGxlbmd0aAotCQkJCSAqLwotCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMCwgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSk7Ci0JCQkJcGFydGl0aW9uRm91bmQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGlzIGNhc2UgaXMgInVudXN1YWwiLiBXaGVuIHdvdWxkIHJlZ2lvbiBiZSBudWxsLCBhbmQKLQkJCQkgKiBkb2N1bWVudCBsb25nZXIgdGhhbiAwLiBJIHRoaW5rIHRoaXMgbWVhbnMgc29tZXRoaW5nJ3MgIm91dAotCQkJCSAqIG9mIHN5bmMiLiBBbmQgd2UgbWF5IHdhbnQgdG8gImZsYWciIHRoYXQgZmFjdCBhbmQganVzdAotCQkJCSAqIHJldHVybiBvbmUgYmlnIHJlZ2lvbiBvZiAndW5rbm93bicsIGluc3RlYWQgb2Ygb25lCi0JCQkJICogY2hhcmFjdGVyIGF0IGEgdGltZS4KLQkJCQkgKi8KLQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIDEsIGdldFVua25vd24oKSk7Ci0JCQkJcGFydGl0aW9uRm91bmQgPSB0cnVlOwotCQkJfQotCQl9CQotCQllbHNlIGlmIChjaGVja0JldHdlZW4pIHsKLQkJCS8vIGRtdzogbWluaW1pemVzIG91dCB0byB0aGUgZmlyc3QgaWYgdGVzdCBhYm92ZQotCQkJLy8JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgJiYgZG9jTGVuZ3RoID09IDApIHsKLQkJCS8vCQkJCS8vIGtub3duIHNwZWNpYWwgY2FzZSBmb3IgYW4gZW1wdHkgZG9jdW1lbnQKLQkJCS8vCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMCwgZ2V0RGVmYXVsdCgpKTsKLQkJCS8vCQkJCXBhcnRpdGlvbkZvdW5kID0gdHJ1ZTsKLQkJCS8vCQkJfQotCQkJLy8JCQllbHNlCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPT0gb2Zmc2V0KSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJCWlmIChwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQkJSVRleHRSZWdpb24gcHJldmlvdXNTdGFydCA9IHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQlwYXJ0aXRpb25Gb3VuZCA9IGRvUGFyc2VyU3BlY2lmaWNDaGVjayhvZmZzZXQsIHBhcnRpdGlvbkZvdW5kLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBuZXh0LCBwcmV2aW91c1N0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXBhcnRpdGlvbkZvdW5kICYmIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZXN1bHRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCXBhcnRpdGlvbkZvdW5kID0gaXNEb2N1bWVudFJlZ2lvbkJhc2VkUGFydGl0aW9uKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVzdWx0UmVnaW9uLCBvZmZzZXQpOwotCQkJaWYgKCFwYXJ0aXRpb25Gb3VuZCkgewotCQkJCS8vIE5vdGU6IHRoaXMgbmV3IGxvZ2ljIGRvZXNuJ3QgaGFuZGxlIGNvbnRhaW5lciByZWdpb25zCi0JCQkJLy8gaW5zaWRlIG9mCi0JCQkJLy8gY29udGFpbmVyIHJlZ2lvbnMgLi4uIG1heSBuZWVkIHRvIG1ha2UgdGhpcyBmaXJzdCBjbGF1c2UKLQkJCQkvLyBhIHJlY3Vyc2l2ZSBtZXRob2QKLQkJCQlpZiAocmVzdWx0UmVnaW9uICE9IG51bGwgJiYgcmVzdWx0UmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJSVRleHRSZWdpb25Db250YWluZXIgY29udGFpbmVyUmVnaW9uID0gKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZXN1bHRSZWdpb247Ci0JCQkJCS8vIHRoZW4gbmVlZCB0byAiZHJpbGwgZG93biIgZm9yIHJlbGV2ZW50IHJlZ2lvbiBhbmQKLQkJCQkJLy8gcmVsZXZlbnQgb2Zmc2V0Ci0JCQkJCUlUZXh0UmVnaW9uIGRlZXBSZWdpb24gPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQkJaW50IGVuZE9mZnNldCA9IGNvbnRhaW5lclJlZ2lvbi5nZXRFbmRPZmZzZXQoZGVlcFJlZ2lvbik7Ci0JCQkJCVN0cmluZyB0eXBlID0gZ2V0UGFydGl0aW9uVHlwZShkZWVwUmVnaW9uLCBlbmRPZmZzZXQpOwotCQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGVuZE9mZnNldCAtIG9mZnNldCwgdHlwZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHJlc3VsdFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgdHlwZSA9IGdldFBhcnRpdGlvblR5cGUocmVzdWx0UmVnaW9uLCBvZmZzZXQpOwotCQkJCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KHJlc3VsdFJlZ2lvbikgLSBvZmZzZXQsIHR5cGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gY2FuIGhhcHBlbiBhdCBFT0YKLQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjQ4ODYKLQkJCQkJCS8vIFRoZSB1bmtub3duIHR5cGUgd2FzIGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBjb250ZW50IGFzc2lzdCBpbiBKU1AgZG9jdW1lbnRzCi0JCQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIDEsIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgZm9yIGEgcGVyLVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvdmVycmlkZSBzZWxlY3RpbmcgdGhlCi0JICogcGFydGl0aW9uIHR5cGUgdXNpbmcgbW9yZSB0aGFuIGp1c3QgYSBzaW5nbGUgSVRleHRSZWdpb24uCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb250YWluZWRDaGlsZFJlZ2lvbgotCSAqICAgICAgICAgICAgYW4gSVRleHRSZWdpb24gd2l0aGluIHRoZSBnaXZlbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiAgICAgICAgICAgIHRoYXQgd291bGQgbm9ybWFsbHkgZGV0ZXJtaW5lIHRoZSBwYXJ0aXRpb24gdHlwZSBieSBpdHNlbGYKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgb2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJ0aXRpb24gdHlwZSB3aWxsIGJlIG92ZXJyaWRkZW4sIGZhbHNlIHRvCi0JICogICAgICAgICBjb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY29udGFpbmVkQ2hpbGRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2Uuc2V0T2Zmc2V0KG9mZnNldCk7Ci0JCWludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLnNldExlbmd0aChsZW5ndGgpOwotCQlpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5zZXRUeXBlKHR5cGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0NvbW1hbmRDdXJzb3JQb3NpdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0NvbW1hbmRDdXJzb3JQb3NpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzljZjUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9Db21tYW5kQ3Vyc29yUG9zaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEN1cnNvclBvc2l0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSBzZXQgdG8gYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0UmVkb1NlbGVjdGlvbkxlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHNldCB0byBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFVuZG9DdXJzb3JQb3NpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXZvaWQgc2V0UmVkb0N1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXZvaWQgc2V0UmVkb1NlbGVjdGlvbkxlbmd0aChpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSB1c2VkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0Jdm9pZCBzZXRVbmRvQ3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0Jdm9pZCBzZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKGludCBzZWxlY3Rpb25MZW5ndGgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzMjg4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50IHNlbGVjdGlvbiBtZWRpYXRvcidzIGlucHV0IGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50IHNlbGVjdGlvbiBtZWRpYXRvcidzIGlucHV0IGRvY3VtZW50Ci0JICovCi0JSURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIGEgbmV3IHNlbGVjdGlvbiBpbiB0aGUgZG9jdW1lbnQgYXMgYSByZXN1bHQgb2YgYW4gdW5kbyBvcGVyYXRpb24uCi0JICogCi0JICogVW5kb0RvY3VtZW50RXZlbnQgY29udGFpbnMgdGhlIHJlcXVlc3RlciBvZiB0aGUgdW5kbyBvcGVyYXRpb24sIGFuZCB0aGUKLQkgKiBvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgbmV3IHNlbGVjdGlvbi4gSW1wbGVtZW50YXRpb24gb2YKLQkgKiBJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBjYW4gY2hlY2sgaWYgaXQncyB0aGUgcmVxdWVzdGVyIHRoYXQgY2F1c2VkCi0JICogdGhlIG5ldyBzZWxlY3Rpb24sIGFuZCBkZWNpZGUgaWYgdGhlIG5ldyBzZWxlY3Rpb24gc2hvdWxkIGJlIGFwcGxpZWQuCi0JICovCi0Jdm9pZCB1bmRvT3BlcmF0aW9uU2VsZWN0aW9uQ2hhbmdlZChVbmRvRG9jdW1lbnRFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDM1MWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgewotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogQ29ubmVjdCB0aGUgbWVkaWF0b3IgdG8gdGhlIHVuZG8gbWFuYWdlci4KLQkgKi8KLQl2b2lkIGNvbm5lY3QoSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgbWVkaWF0b3IpOwotCi0JLyoqCi0JICogRGlzYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0Jdm9pZCBkaXNhYmxlVW5kb01hbmFnZW1lbnQoKTsKLQotCS8qKgotCSAqIERpc2Nvbm5lY3QgdGhlIG1lZGlhdG9yIGZyb20gdGhlIHVuZG8gbWFuYWdlci4KLQkgKi8KLQl2b2lkIGRpc2Nvbm5lY3QoSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgbWVkaWF0b3IpOwotCi0JLyoqCi0JICogRW5hYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKi8KLQl2b2lkIGVuYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0KLQkvKioKLQkgKiBFbmQgcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIpOwotCi0JLyoqCi0JICogRW5kIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogPHA+Ci0JICogTm9ybWFsbHksIHRoZSB1bmRvIG1hbmFnZXIgY2FuIGZpZ3VyZSBvdXQgdGhlIGJlc3QgdGltZXMgd2hlbiB0byBlbmQgYQotCSAqIHBlbmRpbmcgY29tbWFuZCBhbmQgYmVnaW4gYSBuZXcgb25lIC4uLiB0byB0aGUgc3RydWN0dXJlIG9mIGEgc3RydWN0dWVkCi0JICogZG9jdW1lbnQuIFRoZXJlIGFyZSB0aW1lcywgaG93ZXZlciwgd2hlbiBjbGllbnRzIG1heSB3aXNoIHRvIG92ZXJyaWRlCi0JICogdGhvc2UgYWxnb3JpdGhtcyBhbmQgZW5kIG9uZSBlYXJsaWVyIHRoYW4gbm9ybWFsLiBUaGUgb25lIGtub3duIGNhc2UgaXMKLQkgKiBmb3IgbXVsdGlwYWdlIGVkaXRvcnMuIElmIGEgdXNlciBpcyBvbiBvbmUgcGFnZSwgYW5kIHR5cGUgJzEyMycgYXMKLQkgKiBhdHRyaWJ1dGUgdmFsdWUsIHRoZW4gY2xpY2sgYXJvdW5kIHRvIG90aGVyIHBhcnRzIG9mIHBhZ2UsIG9yIGRpZmZlcmVudAotCSAqIHBhZ2VzLCB0aGVuIHJldHVybiB0byAnMTIzfCcgYW5kIHR5cGUgNDU2LCB0aGVuICJ1bmRvIiB0aGV5IHR5cGljYWxseQotCSAqIGV4cGVjdCB0aGUgdW5kbyB0byBqdXN0IHVuZG8gd2hhdCB0aGV5IGp1c3QgdHlwZWQsIHRoZSA0NTYsIG5vdCB0aGUKLQkgKiB3aG9sZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICogPHA+Ci0JICogSWYgdGhlcmUgaXMgbm8gcGVuZGluZyBjb21tYW5kLCB0aGUgcmVxdWVzdCBpcyBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGZvcmNlRW5kT2ZQZW5kaW5nQ29tbWFuZChPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3VycmVudFBvc2l0aW9uLCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFNvbWUgY2xpZW50cyBuZWVkIHRvIGRvIGNvbXBsaWNhdGVkIHRoaW5ncyB3aXRoIHVuZG8gc3RhY2suIFBsdXMsIGluCi0JICogc29tZSBjYXNlcywgaWYgY2xpZW50cyBzZXRDb21tYW5kU3RhY2sgdGVtcG9yYXJpbHksIHRoZXkgaGF2ZQotCSAqIHJlcG9uc2liaWxpdHkgdG8gc2V0IGJhY2sgdG8gb3JpZ2luYWwgb25lIHdoZW4gZmluaXNoZWQuCi0JICovCi0JcHVibGljIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKTsKLQotCS8qKgotCSAqIEdldCB0aGUgcmVkbyBjb21tYW5kIGV2ZW4gaWYgaXQncyBub3QgY29tbWl0dGVkIHlldC4KLQkgKi8KLQlDb21tYW5kIGdldFJlZG9Db21tYW5kKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHVuZG8gY29tbWFuZCBldmVuIGlmIGl0J3Mgbm90IGNvbW1pdHRlZCB5ZXQuCi0JICovCi0JQ29tbWFuZCBnZXRVbmRvQ29tbWFuZCgpOwotCi0JLyoqCi0JICogUmVkbyB0aGUgbGFzdCBjb21tYW5kIGluIHRoZSB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCByZWRvKCk7Ci0KLQkvKioKLQkgKiBSZWRvIHRoZSBsYXN0IGNvbW1hbmQgaW4gdGhlIHVuZG8gbWFuYWdlciBhbmQgbm90aWZ5IHRoZSByZXF1ZXN0ZXIKLQkgKiBhYm91dCB0aGUgbmV3IHNlbGVjdGlvbi4KLQkgKi8KLQl2b2lkIHJlZG8oSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBhdCBsZWFzdCBvbmUgdGV4dCBjaGFuZ2UgY2FuIGJlIHJlcGVhdGVkLiBBIHRleHQgY2hhbmdlCi0JICogY2FuIGJlIHJlcGVhdGVkIG9ubHkgaWYgaXQgd2FzIGV4ZWN1dGVkIGFuZCByb2xsZWQgYmFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF0IGxlYXN0IG9uIHRleHQgY2hhbmdlIGNhbiBiZSByZXBlYXRlZAotCSAqLwotCWJvb2xlYW4gcmVkb2FibGUoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgY29tbWFuZCBzdGFjay4KLQkgKi8KLQl2b2lkIHNldENvbW1hbmRTdGFjayhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKTsKLQotCS8qKgotCSAqIFVuZG8gdGhlIGxhc3QgY29tbWFuZCBpbiB0aGUgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgdW5kbygpOwotCi0JLyoqCi0JICogVW5kbyB0aGUgbGFzdCBjb21tYW5kIGluIHRoZSB1bmRvIG1hbmFnZXIgYW5kIG5vdGlmeSB0aGUgcmVxdWVzdGVyCi0JICogYWJvdXQgdGhlIG5ldyBzZWxlY3Rpb24uCi0JICovCi0Jdm9pZCB1bmRvKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIHRleHQgY2hhbmdlIGNhbiBiZSByb2xsZWQgYmFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF0IGxlYXN0IG9uZSB0ZXh0IGNoYW5nZSBjYW4gYmUgcm9sbGVkCi0JICogICAgICAgICBiYWNrCi0JICovCi0JYm9vbGVhbiB1bmRvYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDg1ZjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZFRleHRDb21tYW5kIHsKLQotCVN0cmluZyBnZXRUZXh0RGVsZXRlZCgpOwotCi0JaW50IGdldFRleHRFbmQoKTsKLQotCVN0cmluZyBnZXRUZXh0SW5zZXJ0ZWQoKTsKLQotCWludCBnZXRUZXh0U3RhcnQoKTsKLQotCXZvaWQgc2V0VGV4dERlbGV0ZWQoU3RyaW5nIHRleHREZWxldGVkKTsKLQotCXZvaWQgc2V0VGV4dEVuZChpbnQgdGV4dEVuZCk7Ci0KLQl2b2lkIHNldFRleHRJbnNlcnRlZChTdHJpbmcgdGV4dEluc2VydGVkKTsKLQotCXZvaWQgc2V0VGV4dFN0YXJ0KGludCB0ZXh0U3RhcnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjJiYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRDb21tYW5kSW1wbCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCB7Ci0KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7IC8vIG5lZWRlZCBmb3IgdXBkYXRpbmcgdGhlIHRleHQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUZXh0RGVsZXRlZCA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBmVGV4dEVuZCA9IC0xOwotCXByb3RlY3RlZCBTdHJpbmcgZlRleHRJbnNlcnRlZCA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBmVGV4dFN0YXJ0ID0gLTE7Ci0KLQkvKioKLQkgKiBXZSBoYXZlIG5vLWFyZyBjb25zdHJ1Y3RvciBub24tcHVibGljIHRvIGZvcmNlIGRvY3VtZW50IHRvIGJlIHNwZWNmaWVkLgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRDb21tYW5kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21tYW5kSW1wbChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcygpOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsgLy8gbmVlZGVkIGZvciB1cGRhdGluZyB0aGUgdGV4dAotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JfQotCi0JLyoqCi0JICogZ2V0VGV4dERlbGV0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dERlbGV0ZWQoKSB7Ci0JCXJldHVybiBmVGV4dERlbGV0ZWQ7Ci0JfQotCi0JLyoqCi0JICogdGV4dEVuZCBpcyB0aGUgc2FtZSBhcyAodGV4dFN0YXJ0ICsgdGV4dEluc2VydGVkLmxlbmd0aCgpKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZUZXh0RW5kOwotCX0KLQotCS8qKgotCSAqIGdldFRleHRJbnNlcnRlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRUZXh0SW5zZXJ0ZWQoKSB7Ci0JCXJldHVybiBmVGV4dEluc2VydGVkOwotCX0KLQotCS8qKgotCSAqIGdldFRleHRTdGFydCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLQkJcmV0dXJuIGZUZXh0U3RhcnQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKGZEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCS8vIG5vdGU6IG9uZSBvZiB0aGUgZmV3IHBsYWNlcyB3ZSBwcm9ncmFtYXRpY2FsbHkgaWdub3JlIHJlYWQtb25seQotCQkJLy8gc2V0dGluZ3MKLQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5yZXBsYWNlVGV4dCh0aGlzLCBmVGV4dFN0YXJ0LCBmVGV4dERlbGV0ZWQubGVuZ3RoKCksIGZUZXh0SW5zZXJ0ZWQsIHRydWUpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlmRG9jdW1lbnQucmVwbGFjZShmVGV4dFN0YXJ0LCBmVGV4dERlbGV0ZWQubGVuZ3RoKCksIGZUZXh0SW5zZXJ0ZWQpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGFzc3VtZWQgaW1wb3NzaWJsZSwgZm9yIG5vdwotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0RGVsZXRlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0RGVsZXRlZChqYXZhLmxhbmcuU3RyaW5nIHRleHREZWxldGVkKSB7Ci0JCWZUZXh0RGVsZXRlZCA9IHRleHREZWxldGVkOwotCX0KLQotCS8qKgotCSAqIHNldFRleHRFbmQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dEVuZChpbnQgdGV4dEVuZCkgewotCQlmVGV4dEVuZCA9IHRleHRFbmQ7Ci0JfQotCi0JLyoqCi0JICogc2V0VGV4dEluc2VydGVkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRJbnNlcnRlZChqYXZhLmxhbmcuU3RyaW5nIHRleHRJbnNlcnRlZCkgewotCQlmVGV4dEluc2VydGVkID0gdGV4dEluc2VydGVkOwotCX0KLQotCS8qKgotCSAqIHNldFRleHRTdGFydCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0U3RhcnQoaW50IHRleHRTdGFydCkgewotCQlmVGV4dFN0YXJ0ID0gdGV4dFN0YXJ0OwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkvLyBub3RlOiBvbmUgb2YgdGhlIGZldyBwbGFjZXMgd2UgcHJvZ3JhbWF0aWNhbGx5IGlnbm9yZSByZWFkLW9ubHkKLQkJCS8vIHNldHRpbmdzCi0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkucmVwbGFjZVRleHQodGhpcywgZlRleHRTdGFydCwgZlRleHRJbnNlcnRlZC5sZW5ndGgoKSwgZlRleHREZWxldGVkLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJZkRvY3VtZW50LnJlcGxhY2UoZlRleHRTdGFydCwgZlRleHRJbnNlcnRlZC5sZW5ndGgoKSwgZlRleHREZWxldGVkKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBhc3N1bWVkIGltcG9zc2libGUsIGZvciBub3cKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGY3NjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLQotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kQ3Vyc29yUG9zaXRpb24gewotCXByb3RlY3RlZCBpbnQgZlJlZG9DdXJzb3JQb3NpdGlvbiA9IC0xOwotCXByb3RlY3RlZCBpbnQgZlJlZG9TZWxlY3Rpb25MZW5ndGggPSAwOwotCi0JcHJvdGVjdGVkIGludCBmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JcHJvdGVjdGVkIGludCBmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4LCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoaW50IHJlc3VsdEluZGV4LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBkZXNjcmlwdGlvbiwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoU3RyaW5nIGxhYmVsLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHNldCB0byBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZWRvQ3Vyc29yUG9zaXRpb24oKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCi0JCWlmIChmUmVkb0N1cnNvclBvc2l0aW9uICE9IC0xKQotCQkJY3Vyc29yUG9zaXRpb24gPSBmUmVkb0N1cnNvclBvc2l0aW9uOwotCQllbHNlIGlmICghY29tbWFuZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlpbnQgY29tbWFuZExpc3RTaXplID0gY29tbWFuZExpc3Quc2l6ZSgpOwotCQkJQ29tbWFuZCBsYXN0Q29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQoY29tbWFuZExpc3RTaXplIC0gMSk7Ci0KLQkJCWlmIChsYXN0Q29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikKLQkJCQljdXJzb3JQb3NpdGlvbiA9ICgoQ29tbWFuZEN1cnNvclBvc2l0aW9uKSBsYXN0Q29tbWFuZCkuZ2V0UmVkb0N1cnNvclBvc2l0aW9uKCk7Ci0JCX0KLQotCQlyZXR1cm4gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVkb1NlbGVjdGlvbkxlbmd0aCgpIHsKLQkJcmV0dXJuIGZSZWRvU2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSBzZXQgdG8gYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VW5kb0N1cnNvclBvc2l0aW9uKCkgewotCQlpbnQgY3Vyc29yUG9zaXRpb24gPSAtMTsKLQotCQlpZiAoZlVuZG9DdXJzb3JQb3NpdGlvbiAhPSAtMSkKLQkJCWN1cnNvclBvc2l0aW9uID0gZlVuZG9DdXJzb3JQb3NpdGlvbjsKLQkJZWxzZSBpZiAoIWNvbW1hbmRMaXN0LmlzRW1wdHkoKSkgewotCQkJLy8gbmV2ZXIgdXNlZAotCQkJLy9pbnQgY29tbWFuZExpc3RTaXplID0gY29tbWFuZExpc3Quc2l6ZSgpOwotCQkJQ29tbWFuZCBmaXJzdENvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZExpc3QuZ2V0KDApOwotCi0JCQlpZiAoZmlyc3RDb21tYW5kIGluc3RhbmNlb2YgQ29tbWFuZEN1cnNvclBvc2l0aW9uKQotCQkJCWN1cnNvclBvc2l0aW9uID0gKChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGZpcnN0Q29tbWFuZCkuZ2V0VW5kb0N1cnNvclBvc2l0aW9uKCk7Ci0JCX0KLQotCQlyZXR1cm4gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VW5kb1NlbGVjdGlvbkxlbmd0aCgpIHsKLQkJcmV0dXJuIGZVbmRvU2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSB1c2VkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVkb0N1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbikgewotCQlmUmVkb0N1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWRvU2VsZWN0aW9uTGVuZ3RoKGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJZlJlZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHVzZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmRvQ3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuZG9TZWxlY3Rpb25MZW5ndGgoaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQlmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbkxlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyZmYzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0gaW5pdGlhbCBJRG9jdW1lbnRFeHRlbnNpb240IHN1cHBvcnQgLSAjMTAyODIyCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB7Ci0KLQljbGFzcyBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyIGltcGxlbWVudHMgQ29tbWFuZFN0YWNrTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlyZXNldEludGVybmFsQ29tbWFuZHMoKTsKLQkJfQotCX0KLQotCWNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIERvIG5vdGhpbmcuIERvIG5vdCBwdXNoIHRoZSBuZXcgbW9kZWwncyBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJCS8vIGNoYW5nZXMKLQkJCS8vIG9udG8gdGhlIHVuZG8gY29tbWFuZCBzdGFjaywgb3IgZWxzZSB0aGUgdXNlciBtYXkgYmUgYWJsZSB0bwotCQkJLy8gdW5kbwotCQkJLy8gYW4gZXhpc3RpbmcgZmlsZSB0byBhbiBlbXB0eSBmaWxlLgotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gU2luY2UgIm5vIGNoYW5nZSIsIGRvIG5vdGhpbmcuCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlwcm9jZXNzU3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJpbmcgdGV4dERlbGV0ZWQsIFN0cmluZyB0ZXh0SW5zZXJ0ZWQsIGludCB0ZXh0U3RhcnQsIGludCB0ZXh0RW5kKSB7Ci0JCQlpZiAoZlRleHRDb21tYW5kICE9IG51bGwgJiYgdGV4dFN0YXJ0ID09IGZUZXh0Q29tbWFuZC5nZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBhcHBlbmQgdG8gdGhlIHRleHQgY29tbWFuZAotCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0RGVsZXRlZChmVGV4dENvbW1hbmQuZ2V0VGV4dERlbGV0ZWQoKS5jb25jYXQodGV4dERlbGV0ZWQpKTsKLQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dEluc2VydGVkKGZUZXh0Q29tbWFuZC5nZXRUZXh0SW5zZXJ0ZWQoKS5jb25jYXQodGV4dEluc2VydGVkKSk7Ci0JCQkJZlRleHRDb21tYW5kLnNldFRleHRFbmQodGV4dEVuZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmVGV4dENvbW1hbmQgIT0gbnVsbCAmJiB0ZXh0U3RhcnQgPT0gZlRleHRDb21tYW5kLmdldFRleHRTdGFydCgpIC0gKHRleHRFbmQgLSB0ZXh0U3RhcnQgKyAxKSAmJiB0ZXh0RW5kIDw9IGZUZXh0Q29tbWFuZC5nZXRUZXh0RW5kKCkgLSAodGV4dEVuZCAtIHRleHRTdGFydCArIDEpICYmIHRleHREZWxldGVkLmxlbmd0aCgpID09IDEgJiYgdGV4dEluc2VydGVkLmxlbmd0aCgpID09IDApIHsKLQkJCQkvLyBiYWNrc3BhY2UgcHJlc3NlZAotCi0JCQkJLy8gZXJhc2UgYSBjaGFyYWN0ZXIganVzdCBpbnNlcnRlZAotCQkJCWlmIChmVGV4dENvbW1hbmQuZ2V0VGV4dEluc2VydGVkKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0SW5zZXJ0ZWQoZlRleHRDb21tYW5kLmdldFRleHRJbnNlcnRlZCgpLnN1YnN0cmluZygwLCBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpIC0gZlRleHRDb21tYW5kLmdldFRleHRTdGFydCgpIC0gMSkpOwotCQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dEVuZCh0ZXh0RW5kKTsKLQkJCQl9Ci0JCQkJLy8gZXJhc2UgYSBjaGFyYWN0ZXIgaW4gdGhlIGZpbGUKLQkJCQllbHNlIHsKLQkJCQkJZlRleHRDb21tYW5kLnNldFRleHREZWxldGVkKHRleHREZWxldGVkLmNvbmNhdChmVGV4dENvbW1hbmQuZ2V0VGV4dERlbGV0ZWQoKSkpOwotCQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dFN0YXJ0KHRleHRTdGFydCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY3JlYXRlTmV3VGV4dENvbW1hbmQodGV4dERlbGV0ZWQsIHRleHRJbnNlcnRlZCwgdGV4dFN0YXJ0LCB0ZXh0RW5kKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBjdXJzb3IgcG9zaXRpb24KLQkJCWZDdXJzb3JQb3NpdGlvbiA9IHRleHRFbmQ7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBOb3RlOiBmTGlzdGVuaW5nIHRlbGxzIHVzIGlmIHdlIHNob3VsZCBsaXN0ZW4gdG8gdGhlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4KLQkJCS8vIGZMaXN0ZW5pbmcgaXMgc2V0IHRvIGZhbHNlIHJpZ2h0IGJlZm9yZSB0aGUgdW5kby9yZWRvIHByb2Nlc3MKLQkJCS8vIGFuZAotCQkJLy8gdGhlbiBzZXQgdG8gdHJ1ZSBhZ2FpbgotCQkJLy8gcmlnaHQgYWZ0ZXIgdGhlIHVuZG8vcmVkbyBwcm9jZXNzIHRvIGJsb2NrIG91dCBhbmQgaWdub3JlIGFsbAotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50RXZlbnRzIGdlbmVyYXRlZAotCQkJLy8gYnkgdGhlIHVuZG8vcmVkbyBwcm9jZXNzLgotCi0JCQkvLyBQcm9jZXNzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGlmIGZMaXN0ZW5pbmcgaXMgdHJ1ZS4KLQkJCS8vCi0JCQkvLyBXZSBhcmUgZXhlY3V0aW5nIGEgY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIHN0YWNrIGlmIHRoZQotCQkJLy8gcmVxdWVzdGVyCi0JCQkvLyBpcyBhIGNvbW1hbmQgKGZvciBleGFtcGxlLCB1bmRvL3JlZG8pLgotCQkJLy8gV2Ugc2hvdWxkIG5vdCBwcm9jZXNzIHRoZSBmbGF0IG1vZGVsIGV2ZW50IHdoZW4gd2UgYXJlCi0JCQkvLyBleGVjdXRpbmcgYQotCQkJLy8gY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIHN0YWNrLgotCQkJaWYgKGZVbmRvTWFuYWdlbWVudEVuYWJsZWQgJiYgIShzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpIGluc3RhbmNlb2YgQ29tbWFuZCkpIHsKLQkJCQkvLyBjaGVjayByZXF1ZXN0ZXIgaWYgbm90IHJlY29yZGluZwotCQkJCWlmICghZlJlY29yZGluZykKLQkJCQkJY2hlY2tSZXF1ZXN0ZXIoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSk7Ci0KLQkJCQkvLyBwcm9jZXNzIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCQkJCVN0cmluZyB0ZXh0RGVsZXRlZCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldERlbGV0ZWRUZXh0KCk7Ci0JCQkJU3RyaW5nIHRleHRJbnNlcnRlZCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFRleHQoKTsKLQkJCQlpbnQgdGV4dFN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IHRleHRFbmQgPSB0ZXh0U3RhcnQgKyB0ZXh0SW5zZXJ0ZWQubGVuZ3RoKCk7Ci0JCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHRleHREZWxldGVkLCB0ZXh0SW5zZXJ0ZWQsIHRleHRTdGFydCwgdGV4dEVuZCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hBTkdFX1RFWFQgPSBTU0VDb3JlTWVzc2FnZXMuVGV4dF9DaGFuZ2VfVUlfOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2sgZkNvbW1hbmRTdGFjayA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ29tcG91bmRDb21tYW5kTGFiZWwgPSBudWxsOwotCWludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyIGZJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyOwotCS8vIHByaXZhdGUgTWFwIGZUZXh0Vmlld2VyVG9MaXN0ZW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcltdIGZNZWRpYXRvcnMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUmVjb3JkaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZlJlY29yZGluZ0NvdW50ID0gMDsKLQlwcml2YXRlIE9iamVjdCBmUmVxdWVzdGVyOwotCVN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwgZlRleHRDb21tYW5kID0gbnVsbDsKLQlwcml2YXRlIGludCBmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JYm9vbGVhbiBmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gdHJ1ZTsKLQlwcml2YXRlIGludCBmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcigpIHsKLQkJdGhpcyhuZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIoQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlzZXRDb21tYW5kU3RhY2soY29tbWFuZFN0YWNrKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcihJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmTWVkaWF0b3JzLCBtZWRpYXRvcikpIHsKLQkJCWludCBvbGRTaXplID0gMDsKLQotCQkJaWYgKGZNZWRpYXRvcnMgIT0gbnVsbCkgewotCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvciBmaXJzdAotCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCW9sZFNpemUgPSBmTWVkaWF0b3JzLmxlbmd0aDsKLQkJCX0KLQotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCUlEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW10gbmV3TWVkaWF0b3JzID0gbmV3IElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW25ld1NpemVdOwotCQkJaWYgKGZNZWRpYXRvcnMgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoZk1lZGlhdG9ycywgMCwgbmV3TWVkaWF0b3JzLCAwLCBvbGRTaXplKTsKLQkJCX0KLQotCQkJLy8gYWRkIHRoZSBuZXcgdW5kbyBtZWRpYXRvciB0byBsYXN0IHBvc2l0aW9uCi0JCQluZXdNZWRpYXRvcnNbbmV3U2l6ZSAtIDFdID0gbWVkaWF0b3I7Ci0KLQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCWZNZWRpYXRvcnMgPSBuZXdNZWRpYXRvcnM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQkJCWFkZERvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJLy8gc2F2ZSB0aGUgcmVxdWVzdGVyCi0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0KLQkJLy8gdXBkYXRlIGxhYmVsIGFuZCBkZXNjIG9ubHkgb24gdGhlIGZpcnN0IGxldmVsIHdoZW4gcmVjb3JkaW5nIGlzCi0JCS8vIG5lc3RlZAotCQlpZiAoZlJlY29yZGluZ0NvdW50ID09IDApIHsKLQkJCWZDb21wb3VuZENvbW1hbmRMYWJlbCA9IGxhYmVsOwotCQkJaWYgKGZDb21wb3VuZENvbW1hbmRMYWJlbCA9PSBudWxsKQotCQkJCWZDb21wb3VuZENvbW1hbmRMYWJlbCA9IFRFWFRfQ0hBTkdFX1RFWFQ7Ci0KLQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJaWYgKGZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IFRFWFRfQ0hBTkdFX1RFWFQ7Ci0KLQkJCS8vIGNsZWFyIGNvbW1hbmRzCi0JCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCQkJZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCX0KLQotCQkvLyB1cGRhdGUgY291bnRlciBhbmQgZmxhZwotCQlmUmVjb3JkaW5nQ291bnQrKzsKLQkJZlJlY29yZGluZyA9IHRydWU7Ci0KLQkJLy8gbm8gdW5kbyBjdXJzb3IgcG9zaXRpb24gYW5kIHVuZG8gc2VsZWN0aW9uIGxlbmd0aCBzcGVjaWZpZWQKLQkJLy8gcmVzZXQgdW5kbyBjdXJzb3IgcG9zaXRpb24gYW5kIHVuZG8gc2VsZWN0aW9uIGxlbmd0aAotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCXZvaWQgY2hlY2tSZXF1ZXN0ZXIoT2JqZWN0IHJlcXVlc3RlcikgewotCQlpZiAoZlJlcXVlc3RlciAhPSBudWxsICYmICFmUmVxdWVzdGVyLmVxdWFscyhyZXF1ZXN0ZXIpKSB7Ci0JCQkvLyBGb3JjZSByZXN0YXJ0IG9mIHJlY29yZGluZyBzbyB0aGUgbGFzdCBjb21wb3VuZCBjb21tYW5kIGlzCi0JCQkvLyBjbG9zZWQuCi0JCQkvLwotCQkJLy8gSG93ZXZlciwgd2Ugc2hvdWxkIG5vdCBmb3JjZSByZXN0YXJ0IG9mIHJlY29yZGluZyB3aGVuIHRoZQotCQkJLy8gcmVxdWVzdCBjYW1lIGZyb20gU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlciBvcgotCQkJLy8gWE1MTW9kZWxJbXBsCi0JCQkvLyBiZWNhdXNlIGN1dC9wYXN0ZSByZXF1ZXN0cyBhbmQgY2hhcmFjdGVyIGluc2VydHMgdG8gdGhlCi0JCQkvLyB0ZXh0Vmlld2VyIGFyZSBmcm9tIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIsCi0JCQkvLyBhbmQgcmVxdWVzdHMgdG8gZGVsZXRlIGEgbm9kZSBpbiB0aGUgWE1MVGFibGVUcmVlVmlld2VyIGFyZQotCQkJLy8gZnJvbSBYTUxNb2RlbEltcGwgKHdoaWNoIGltcGxlbWVudHMgSVN0cnVjdHVyZWRNb2RlbCkuCi0KLQkJCWlmICghKHJlcXVlc3RlciBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwgfHwgcmVxdWVzdGVyIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCQlyZXNldEludGVybmFsQ29tbWFuZHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobWVkaWF0b3IpOwotCQlpZiAoZkRvY3VtZW50ID09IG51bGwpIHsKLQkJCS8vIGFkZCB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQlmRG9jdW1lbnQgPSBtZWRpYXRvci5nZXREb2N1bWVudCgpOwotCQkJLy8gZnV0dXJlX1RPRE86IGV2ZW50dWFsbHkgd2Ugd2FudCB0byByZWZhY3RvciBvciBhbGxvdyBlaXRoZXIKLQkJCS8vIHR5cGUgb2YgZG9jdW1lbnQsIGJ1dCBmb3Igbm93LCB3ZSdsbCBkbyBpbnN0YW5jZW9mIGNoZWNrLCBhbmQKLQkJCS8vIGZhaWwKLQkJCS8vIGlmIG5vdCByaWdodCB0eXBlCi0JCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihnZXRJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25seSBtZWRpdGF0b3Igd2l0aCBzdHJ1Y3R1cmVkIGRvY3VtZW50cyBjdXJyZW50bHkgaGFuZGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IGhhZCBvdXIgZG9jdW1lbnQgc2V0LCB3ZSdsbCBqdXN0IGRvIHRoaXMgZmFpbAotCQkJLy8gZmFzdCBpbnRlZ3JpdHkgY2hlY2sKLQkJCWlmICghZkRvY3VtZW50LmVxdWFscyhtZWRpYXRvci5nZXREb2N1bWVudCgpKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb25uZWN0aW9uIHRvIHVuZG8gbWFuYWdlciBmYWlsZWQuIERvY3VtZW50IGZvciBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IgaW5jb25pc3RlbnQgd2l0aCB1bmRvIG1hbmFnZXIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFkZERvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCX0KLQotCXZvaWQgY3JlYXRlTmV3VGV4dENvbW1hbmQoU3RyaW5nIHRleHREZWxldGVkLCBTdHJpbmcgdGV4dEluc2VydGVkLCBpbnQgdGV4dFN0YXJ0LCBpbnQgdGV4dEVuZCkgewotCQlTdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsIHRleHRDb21tYW5kID0gbmV3IFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoZkRvY3VtZW50KTsKLQkJdGV4dENvbW1hbmQuc2V0TGFiZWwoVEVYVF9DSEFOR0VfVEVYVCk7Ci0JCXRleHRDb21tYW5kLnNldERlc2NyaXB0aW9uKFRFWFRfQ0hBTkdFX1RFWFQpOwotCQl0ZXh0Q29tbWFuZC5zZXRUZXh0U3RhcnQodGV4dFN0YXJ0KTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dEVuZCh0ZXh0RW5kKTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dERlbGV0ZWQodGV4dERlbGV0ZWQpOwotCQl0ZXh0Q29tbWFuZC5zZXRUZXh0SW5zZXJ0ZWQodGV4dEluc2VydGVkKTsKLQotCQlpZiAoZlJlY29yZGluZykgewotCQkJaWYgKGZDb21wb3VuZENvbW1hbmQgPT0gbnVsbCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb21wb3VuZENvbW1hbmQgPSBuZXcgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKCk7Ci0JCQkJY29tcG91bmRDb21tYW5kLnNldFVuZG9DdXJzb3JQb3NpdGlvbihmVW5kb0N1cnNvclBvc2l0aW9uKTsKLQkJCQljb21wb3VuZENvbW1hbmQuc2V0VW5kb1NlbGVjdGlvbkxlbmd0aChmVW5kb1NlbGVjdGlvbkxlbmd0aCk7Ci0KLQkJCQljb21wb3VuZENvbW1hbmQuc2V0TGFiZWwoZkNvbXBvdW5kQ29tbWFuZExhYmVsKTsKLQkJCQljb21wb3VuZENvbW1hbmQuc2V0RGVzY3JpcHRpb24oZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uKTsKLQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKHRleHRDb21tYW5kKTsKLQotCQkJCWZDb21wb3VuZENvbW1hbmQgPSBjb21wb3VuZENvbW1hbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQ29tcG91bmRDb21tYW5kLmFwcGVuZCh0ZXh0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmQ29tbWFuZFN0YWNrLmV4ZWN1dGUodGV4dENvbW1hbmQpOwotCQl9Ci0KLQkJZlRleHRDb21tYW5kID0gdGV4dENvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogRGlzYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCQlmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQotCQlpZiAoZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID09IDAgJiYgZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQkvLyBmdXR1cmVfVE9ETzogZXZlbnR1YWxseSB3ZSB3YW50IHRvIHJlZmFjdG9yIG9yIGFsbG93IGVpdGhlcgotCQkJLy8gdHlwZSBvZiBkb2N1bWVudCwgYnV0IGZvciBub3csIHdlJ2xsIGRvIGluc3RhbmNlb2YgY2hlY2ssIGFuZAotCQkJLy8gZmFpbAotCQkJLy8gaWYgbm90IHJpZ2h0IHR5cGUKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGdldEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvbmx5IG1lZGl0YXRvciB3aXRoIHN0cnVjdHVyZWQgZG9jdW1lbnRzIGN1cnJlbnRseSBoYW5kbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIGlmIG5vIGxvbmdlciBsaXN0ZW5pbmcgdG8gZG9jdW1lbnQsIHRoZW4gZG9udCBldmVuIHRyYWNrIGl0Ci0JCQkvLyBhbnltb3JlCi0JCQkvLyAodGhpcyBhbGxvd3MgY29ubmVjdCB0byByZWNvbm5lY3QgdG8gZG9jdW1lbnQgYWdhaW4pCi0JCQlmRG9jdW1lbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0JCWZVbmRvTWFuYWdlbWVudEVuYWJsZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IChmVGV4dENvbW1hbmQgIT0gbnVsbCkgPyBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpIDogLTE7Ci0JCWludCBzZWxlY3Rpb25MZW5ndGggPSAwOwotCi0JCWVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJLy8gUmVjb3JkaW5nIGNvdWxkIGJlIHN0b3BwZWQgYnkgZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKCkuIE1ha2Ugc3VyZQotCQkvLyB3ZSBhcmUgc3RpbGwgcmVjb3JkaW5nIGJlZm9yZSBwcm9jZWVkaW5nLCBvciBlbHNlIGZSZWNvcmRpbmdDb3VudAotCQkvLyBtYXkgbm90IGJlIGJhbGFuY2VkLgotCQlpZiAoZlJlY29yZGluZykgewotCQkJaWYgKGZDb21wb3VuZENvbW1hbmQgIT0gbnVsbCkgewotCQkJCWZDb21wb3VuZENvbW1hbmQuc2V0UmVkb0N1cnNvclBvc2l0aW9uKGN1cnNvclBvc2l0aW9uKTsKLQkJCQlmQ29tcG91bmRDb21tYW5kLnNldFJlZG9TZWxlY3Rpb25MZW5ndGgoc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCX0KLQotCQkJLy8gZW5kIHJlY29yZGluZyBpcyBhIGxvZ2ljYWwgc3RvcHBpbmcgcG9pbnQgZm9yIHRleHQgY29tbWFuZCwKLQkJCS8vIGV2ZW4gd2hlbiBmUmVjb3JkaW5nQ291bnQgPiAwIChpbiBuZXN0ZWQgYmVnaW5SZWNvcmRpbmcpCi0JCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCi0JCQkvLyB1cGRhdGUgY291bnRlciBhbmQgZmxhZwotCQkJaWYgKGZSZWNvcmRpbmdDb3VudCA+IDApCi0JCQkJZlJlY29yZGluZ0NvdW50LS07Ci0JCQlpZiAoZlJlY29yZGluZ0NvdW50ID09IDApIHsKLQkJCQkKLQkJCQkvLyBGaW5hbGx5IGV4ZWN1dGUgdGhlIGNvbW1hbmRzIGFjY3VtdWxhdGVkIGluIHRoZSBjb21wb3VuZCBjb21tYW5kLgotCQkJCQotCQkJCWlmIChmQ29tcG91bmRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJZkNvbW1hbmRTdGFjay5leGVjdXRlKGZDb21wb3VuZENvbW1hbmQpOwotCQkJCX0KLQkJCQkKLQkJCQlmUmVjb3JkaW5nID0gZmFsc2U7Ci0KLQkJCQkvLyByZXNldCBjb21wb3VuZCBjb21tYW5kIG9ubHkgd2hlbiBmUmVjb3JkaW5nQ291bnQgPT0KLQkJCQkvLyAwCi0JCQkJZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCQkJZkNvbXBvdW5kQ29tbWFuZExhYmVsID0gbnVsbDsKLQkJCQlmQ29tcG91bmRDb21tYW5kRGVzY3JpcHRpb24gPSBudWxsOwotCi0JCQkJLy8gQWxzbyByZXNldCBmUmVxdWVzdGVyCi0JCQkJZlJlcXVlc3RlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBmaW5kIG1vZGVsIGdpdmVuIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZpbmRTdHJ1Y3R1cmVkTW9kZWwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIjZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JjZUVuZE9mUGVuZGluZ0NvbW1hbmQoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnJlbnRQb3NpdGlvbiwgaW50IGxlbmd0aCkgewotCQlpZiAoZlJlY29yZGluZykKLQkJCWVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnJlbnRQb3NpdGlvbiwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJcmVzZXRJbnRlcm5hbENvbW1hbmRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciNnZXRDb21tYW5kU3RhY2soKQotCSAqLwotCXB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZkNvbW1hbmRTdGFjazsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2tMaXN0ZW5lciBnZXRJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlpZiAoZkludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBmSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZ2V0SW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJaWYgKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID0gbmV3IEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0UmVkb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmdldFJlZG9Db21tYW5kKCk7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0VW5kb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmdldFVuZG9Db21tYW5kKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJcmVkbyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlcikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZmluZFN0cnVjdHVyZWRNb2RlbChmRG9jdW1lbnQpOwotCi0JCWlmIChyZWRvYWJsZSgpKSB7Ci0JCQlJRG9jdW1lbnRFeHRlbnNpb240IGRvY0V4dDQgPSBudWxsOwotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiByZXdyaXRlU2Vzc2lvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCUNvbW1hbmQgcmVkb0NvbW1hbmQgPSBnZXRSZWRvQ29tbWFuZCgpOwotCQkJCWlmIChyZWRvQ29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCAmJgotCQkJCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNCltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsKSA/IG51bGwgOgotCQkJCQlkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQotCQkJCS8vIG1ha2Ugc3VyZSB0byByZWRvIGJlZm9yZSBzZXR0aW5nIGRvY3VtZW50IHNlbGVjdGlvbgotCQkJCWZDb21tYW5kU3RhY2sucmVkbygpOwotCi0JCQkJLy8gc2V0IGRvY3VtZW50IHNlbGVjdGlvbgotCQkJCXNldFJlZG9Eb2N1bWVudFNlbGVjdGlvbihyZXF1ZXN0ZXIsIHJlZG9Db21tYW5kKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChkb2NFeHQ0ICE9IG51bGwgJiYgcmV3cml0ZVNlc3Npb24gIT0gbnVsbCkKLQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWRvYWJsZSgpIHsKLQkJcmV0dXJuIGZDb21tYW5kU3RhY2suY2FuUmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCWlmIChmTWVkaWF0b3JzICE9IG51bGwgJiYgbWVkaWF0b3IgIT0gbnVsbCkgewotCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgYXJyYXksIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmTWVkaWF0b3JzLCBtZWRpYXRvcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IGZNZWRpYXRvcnMubGVuZ3RoOwotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbXSBuZXdNZWRpYXRvcnMgPSBuZXcgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbbmV3U2l6ZV07Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQlpZiAoZk1lZGlhdG9yc1tpXSA9PSBtZWRpYXRvcikgeyAvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlIHJlbW92aW5nCi0JCQkJCQluZXdNZWRpYXRvcnNbaW5kZXgrK10gPSBmTWVkaWF0b3JzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlIG9sZAotCQkJCS8vIG9uZQotCQkJCWZNZWRpYXRvcnMgPSBuZXdNZWRpYXRvcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlc2V0SW50ZXJuYWxDb21tYW5kcygpIHsKLQkJLy8gRWl0aGVyIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgY2hhbmdlIGV2ZW50IGlzCi0JCS8vIGNoYW5nZWQsIG9yIHRoZSBjb21tYW5kIHN0YWNrIGlzIGNoYW5nZWQuIE5lZWQgdG8gcmVzZXQgaW50ZXJuYWwKLQkJLy8gY29tbWFuZHMgc28gd2Ugd29uJ3QgY29udGludWUgdG8gYXBwZW5kIGNoYW5nZXMuCi0JCWZDb21wb3VuZENvbW1hbmQgPSBudWxsOwotCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCi0JCS8vIEFsc28gcmVzZXQgZlJlcXVlc3RlcgotCQlmUmVxdWVzdGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlpZiAoZkNvbW1hbmRTdGFjayAhPSBudWxsKQotCQkJZkNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihnZXRJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCkpOwotCi0JCWZDb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7Ci0KLQkJaWYgKGZDb21tYW5kU3RhY2sgIT0gbnVsbCkKLQkJCWZDb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoZ2V0SW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVkb0RvY3VtZW50U2VsZWN0aW9uKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikgewotCQkJQ29tbWFuZEN1cnNvclBvc2l0aW9uIGNvbW1hbmRDdXJzb3JQb3NpdGlvbiA9IChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRSZWRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCkgewotCQkJU3RydWN0dXJlZFRleHRDb21tYW5kIHN0cnVjdHVyZWRUZXh0Q29tbWFuZCA9IChTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0SW5zZXJ0ZWQoKS5sZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjdXJzb3JQb3NpdGlvbiA+IC0xICYmIGZNZWRpYXRvcnMgIT0gbnVsbCAmJiBmTWVkaWF0b3JzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZk1lZGlhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGZNZWRpYXRvcnNbaV0uZ2V0RG9jdW1lbnQoKTsKLQkJCQlmTWVkaWF0b3JzW2ldLnVuZG9PcGVyYXRpb25TZWxlY3Rpb25DaGFuZ2VkKG5ldyBVbmRvRG9jdW1lbnRFdmVudChyZXF1ZXN0ZXIsIGRvY3VtZW50LCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikgewotCQkJQ29tbWFuZEN1cnNvclBvc2l0aW9uIGNvbW1hbmRDdXJzb3JQb3NpdGlvbiA9IChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRVbmRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCkgewotCQkJU3RydWN0dXJlZFRleHRDb21tYW5kIHN0cnVjdHVyZWRUZXh0Q29tbWFuZCA9IChTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0RGVsZXRlZCgpLmxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGN1cnNvclBvc2l0aW9uID4gLTEgJiYgZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWVkaWF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZk1lZGlhdG9yc1tpXS5nZXREb2N1bWVudCgpOwotCQkJCWZNZWRpYXRvcnNbaV0udW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQobmV3IFVuZG9Eb2N1bWVudEV2ZW50KHJlcXVlc3RlciwgZG9jdW1lbnQsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXVuZG8obnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbyhJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIpIHsKLQkJLy8gRm9yY2UgYW4gZW5kUmVjb3JkaW5nIGJlZm9yZSB1bmRvLgotCQkvLwotCQkvLyBGb3IgZXhhbXBsZSwgcmVjb3JkaW5nIHdhcyB0dXJuZWQgb24gb24gdGhlIERlc2lnbiBQYWdlIG9mCi0JCS8vIFBhZ2VEZXNpZ25lci4KLQkJLy8gVGhlbiB1bmRvIGlzIGludm9rZWQgb24gdGhlIFNvdXJjZSBQYWdlLiBSZWNvcmRpbmcgc2hvdWxkIGJlCi0JCS8vIHN0b3BwZWQgYmVmb3JlIHdlIHVuZG8uCi0JCS8vIE5vdGUgdGhhdCByZWRvIHNob3VsZCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gd2Ugc3dpdGNoIHRvIHRoZSBTb3VyY2UKLQkJLy8gUGFnZS4KLQkJLy8gVGhlcmVmb3JlLCB0aGlzIGZvcmNlIGVuZGluZyBvZiByZWNvcmRpbmcgaXMgbm90IG5lZWRlZCBpbiByZWRvLgotCQlpZiAoZlJlY29yZGluZykKLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQotCQlpZiAodW5kb2FibGUoKSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGZpbmRTdHJ1Y3R1cmVkTW9kZWwoZkRvY3VtZW50KTsKLQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQlDb21tYW5kIHVuZG9Db21tYW5kID0gZ2V0VW5kb0NvbW1hbmQoKTsKLQkJCQlpZiAodW5kb0NvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQgJiYKLQkJCQkJCW1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCXJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCkgPyBudWxsIDoKLQkJCQkJZG9jRXh0NC5zdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCk7Ci0JCQkJCi0JCQkJLy8gbWFrZSBzdXJlIHRvIHVuZG8gYmVmb3JlIHNldHRpbmcgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJZkNvbW1hbmRTdGFjay51bmRvKCk7Ci0KLQkJCQkvLyBzZXQgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKHJlcXVlc3RlciwgdW5kb0NvbW1hbmQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGRvY0V4dDQgIT0gbnVsbCAmJiByZXdyaXRlU2Vzc2lvbiAhPSBudWxsKQotCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHVuZG9hYmxlKCkgewotCQlyZXR1cm4gZkNvbW1hbmRTdGFjay5jYW5VbmRvKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1VuZG9Eb2N1bWVudEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlZTQ2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgVW5kb0RvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBmUmVxdWVzdGVyOwotCi0JcHVibGljIFVuZG9Eb2N1bWVudEV2ZW50KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gZk9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgZ2V0UmVxdWVzdGVyKCkgewotCQlyZXR1cm4gZlJlcXVlc3RlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvQXNzZXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZDFlZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcyBpbgotICogY29kZS4gVGhlIHByZWRpY2F0ZSBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lIHR5cGUgb2YKLSAqIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUgdGhyb3duIHdoZW4KLSAqIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5IHVuc3BlY2lmaWVkCi0gKiBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uIHRoZXNlIGJlaW5nIHRocm93bgotICogKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgewotCi0JLyoqCi0JICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgotCSAqIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zCi0JICogdGhhdCBjYXRjaCBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8KLQkgKiB1bmV4cGVjdGVkIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiA8L3A+Ci0JICovCi0JY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQkJc3VwZXIoZGV0YWlsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90Ci0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIGlzTGVnYWwoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyBub3QKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiwgYW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcwotCSAqIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZAotCSAqIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgbGVnYWxpdHkgdGVzdCBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbChib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzCi0JICogbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QpIHsKLQkJaXNOb3ROdWxsKG9iamVjdCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzCi0JICogbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbgotCSAqIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCS8vTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJudWxsX2FyZ3VtZW50OiAiICsgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdAotCSAqIHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIGlzVHJ1ZShleHByZXNzaW9uLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90Ci0JICogdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UKLQkgKiBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9EZWJ1Zy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RlYnVnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTI2YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RlYnVnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWJ1ZyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGNoZWNrRm9yTWVtb3J5TGVha3MgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb2xsZWN0U3RhdHMgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQlVHID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19USFJFQURMT0NBTCA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnQnJlYWtwb2ludHMgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdDYXJldE1lZGlhdG9yID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnRGlzcGxheVRyZWVQb3NpdGlvbnMgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z01lZGlhdG9yID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdOb3RpZmljYXRpb24gPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdOb3RpZmljYXRpb25BbmRFdmVudHMgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z05vdGlmeURlZmVycmVkID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnUmVjb25jaWxpbmcgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1J0ZkZvcm1hdFByb3ZpZGVyID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdUYWdsaWJzID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdUb2tlbml6ZXIgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1RyZWVNb2RlbCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1VwZGF0ZVRyZWVQb3NpdGlvbnMgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGlzcGxheUluZm8gPSBmYWxzZTsKLQotCS8qKiBlZmZlY3RzIG91dHB1dCBvZiBMb2dnZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGlzcGxheVRvQ29uc29sZSA9IHRydWU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRpc3BsYXlXYXJuaW5ncyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGhlYWRQYXJzaW5nID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGpzRGVidWdDb250ZXh0QXNzaXN0ID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4ganNEZWJ1Z1N5bnRheENvbG9yaW5nID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DS1MgPSBmYWxzZTsKLQkvLyAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3QgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RBZGFwdGVyQ2xhc3NMb2FkaW5nID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0Rm9ybWF0ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0UmF3U3RydWN0dXJlZERvY3VtZW50T25seSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudE9ubHkgPSBmYWxzZTsKLQotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHN5bnRheEhpZ2hsaWdodGluZyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZVN0YW5kYXJkRW9sSW5XaWRnZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEZvciB0ZXN0cyBhbmQgZGVidWcgb25seQotCSAqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGR1bXAoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJZHVtcChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZHVtcChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRHVtcCBvZiBzdHJ1Y3R1cmVkRG9jdW1lbnQ6Iik7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJRW51bWVyYXRpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGZsYXROb2Rlcy5lbGVtZW50cygpOwotCQl3aGlsZSAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZmxhdE5vZGUgPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoIXZlcmJvc2UpIHsKLQkJCQlTdHJpbmcgb3V0U3RyaW5nID0gZmxhdE5vZGUudG9TdHJpbmcoKTsKLQkJCQlvdXRTdHJpbmcgPSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHMuZXNjYXBlKG91dFN0cmluZyk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG91dFN0cmluZyk7Ci0JCQl9IGVsc2UgewotCQkJCWR1bXAoZmxhdE5vZGUsIHZlcmJvc2UpOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIj0gPSA9ID0gPSA9Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICogQHBhcmFtIHZlcmJvc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZHVtcChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodmVyYm9zZSkgewotCQkJcHJpbnRQYXJlbnQocmVnaW9uKTsKLQkJfQotCQlwcmludENoaWxkUmVnaW9ucyhyZWdpb24sIDApOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRDaGlsZFJlZ2lvbnMoSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbiwgaW50IGRlcHRoKSB7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gPT0+IC8vIElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb25Db2xsZWN0aW9uID0gcmVnaW9uOwotCQkJU3lzdGVtLm91dC5wcmludGxuKHJlZ2lvbik7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbkxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiByID0gcmVnaW9uTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKHIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHJjID0gKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcjsKLQkJCQkJcHJpbnRDaGlsZFJlZ2lvbnMocmMsIGRlcHRoKyspOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzcGFjZShkZXB0aCkgKyByKTsKLQkJCQkJZGVwdGgtLTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgdXRpbGl0eSB0byBtYWtlIHN1cmUgcHJpbnRsbidzIGFyZSBzb21lIHdoYXQgaW4gb3JkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHByaW50bG4oU3RyaW5nIG1zZykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiXHQiICsgbXNnKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRQYXJlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgW3BhcmVudCBkb2N1bWVudDogIiArIHRvU3RyaW5nVXRpbChyZWdpb24uZ2V0UGFyZW50RG9jdW1lbnQoKSkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UGFyZW50KElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXByaW50UGFyZW50KChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSByZWdpb24pOwotCQl9IGVsc2UgaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlwcmludFBhcmVudCgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbik7Ci0JCX0gZWxzZQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgW3BhcmVudCBkb2N1bWVudDogIiArICIobmEpIiArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBhcmVudChJVGV4dFJlZ2lvbkNvbnRhaW5lciByZWdpb24pIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgW3BhcmVudCBkb2N1bWVudDogIiArIHRvU3RyaW5nVXRpbChyZWdpb24uZ2V0UGFyZW50KCkpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlcHRoCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzcGFjZShpbnQgZGVwdGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7Ci0JCQlyZXN1bHQgKz0gIiAgIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmdVdGlsKElTdHJ1Y3R1cmVkRG9jdW1lbnQgb2JqZWN0KSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gc2hvcnRDbGFzc05hbWU7Ci0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmdVdGlsKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBvYmplY3QpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBzaG9ydENsYXNzTmFtZTsKLQkJLy8gTk9URTogaWYgdGhlIGRvY3VtZW50IGhlbGQgYnkgYW55IHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGFuZCB0aGUKLQkJLy8gcmVnaW9uIG9mZnNldHMgaGF2ZSBub3QKLQkJLy8geWV0IGJlZW4gdXBkYXRlZCwgdGhlIG91dHB1dCBmcm9tIHRoaXMgbWV0aG9kIGludmFsaWQuCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBEZWJ1ZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBEZWJ1ZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvRG9jdW1lbnRJbnB1dFN0cmVhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50SW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkMDk1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvRG9jdW1lbnRJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmTWFyayA9IC0xOwotCXByaXZhdGUgaW50IGZQb3NpdGlvbiA9IDA7Ci0KLQlwdWJsaWMgRG9jdW1lbnRJbnB1dFN0cmVhbShJRG9jdW1lbnQgc291cmNlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IHNvdXJjZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jYXZhaWxhYmxlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSBmUG9zaXRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jbWFyayhpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotCQlmTWFyayA9IGZQb3NpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jbWFya1N1cHBvcnRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3JlYWQoKQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlBvc2l0aW9uIDwgZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJCXJldHVybiBmRG9jdW1lbnQuZ2V0Q2hhcihmUG9zaXRpb24rKyk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIC0xOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmUG9zaXRpb24gPSBmTWFyazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jc2tpcChsb25nKQotCSAqLwotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlsb25nIHNraXBwZWQgPSBuOwotCQlpZiAobiA8IGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIGZQb3NpdGlvbikgewotCQkJc2tpcHBlZCA9IG47Ci0JCQlmUG9zaXRpb24gKz0gc2tpcHBlZDsKLQkJfSBlbHNlIHsKLQkJCXNraXBwZWQgPSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSBmUG9zaXRpb247Ci0JCQlmUG9zaXRpb24gPSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIHNraXBwZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0phclV0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0phclV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTgyZGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXJVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgSmFyVXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIEBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3AvZXJyYXRhXzFfMV9hXzA0MjgwMC5odG1sLCBJc3N1ZXMKLQkgKiAgICAgIDggJiA5Ci0JICogCi0JICogIlRoZXJlIGFyZSB0d28gY2FzZXMuIEluIGJvdGggY2FzZXMgdGhlIFRMRF9VUkkgaXMgdG8gYmUgaW50ZXJwcmV0ZWQKLQkgKiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV2ViIEFwcGxpY2F0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSB0aGUKLQkgKiBUTERfVVJJIHJlZmVycyB0byBhIFRMRCBmaWxlIGRpcmVjdGx5LiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBUTERfVVJJCi0JICogcmVmZXJzIHRvIGEgSkFSIGZpbGUuIElmIHNvLCB0aGF0IEpBUiBmaWxlIHNob3VsZCBoYXZlIGEgVExEIGF0Ci0JICogbG9jYXRpb24gTUVUQS1JTkYvdGFnbGliLnRsZC4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQMTFfVEFHTElCID0gIk1FVEEtSU5GL3RhZ2xpYi50bGQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VKYXJGaWxlKFppcEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJZmlsZS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkphclV0aWxpdGllczogQ291bGQgbm90IGNsb3NlIGZpbGUgIiArIGZpbGUuZ2V0TmFtZSgpLCBpb2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhIHN0cmVhbSB0byBhIGxvY2FsIGNvcHkgb2YgdGhlIGlucHV0IG9yIG51bGwgaWYgbm90IHBvc3NpYmxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRDYWNoZWRJbnB1dFN0cmVhbShTdHJpbmcgamFyRmlsZW5hbWUsIFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKGphckZpbGVuYW1lKTsKLQkJaWYgKCF0ZXN0RmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlucHV0U3RyZWFtIGNhY2hlID0gbnVsbDsKLQkJWmlwRmlsZSBqYXJmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphcmZpbGUgPSBuZXcgWmlwRmlsZShqYXJGaWxlbmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKYXJVdGlsaXRpZXM6ICIgKyBqYXJGaWxlbmFtZSwgaW9FeGMpOyAvLyROT04tTkxTLTEkCi0JCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCX0KLQotCQlpZiAoamFyZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVppcEVudHJ5IHplbnRyeSA9IGphcmZpbGUuZ2V0RW50cnkoZW50cnlOYW1lKTsKLQkJCQlpZiAoemVudHJ5ICE9IG51bGwpIHsKLQkJCQkJSW5wdXRTdHJlYW0gZW50cnlJbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQllbnRyeUlucHV0U3RyZWFtID0gamFyZmlsZS5nZXRJbnB1dFN0cmVhbSh6ZW50cnkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSmFyVXRpbGl0aWVzOiAiICsgamFyRmlsZW5hbWUsIGlvRXhjKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJaWYgKGVudHJ5SW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJaW50IGM7Ci0JCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbnVsbDsKLQkJCQkJCWlmICh6ZW50cnkuZ2V0U2l6ZSgpID4gMCkgewotCQkJCQkJCWJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKGludCkgemVudHJ5LmdldFNpemUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBhcnJheSBkaW0gcmVzdHJpY3Rpb24/Ci0JCQkJCQlieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJd2hpbGUgKChjID0gZW50cnlJbnB1dFN0cmVhbS5yZWFkKGJ5dGVzKSkgPj0gMCkgewotCQkJCQkJCQlidWZmZXIud3JpdGUoYnl0ZXMsIDAsIGMpOwotCQkJCQkJCX0KLQkJCQkJCQljYWNoZSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSk7Ci0JCQkJCQkJY2xvc2VKYXJGaWxlKGphcmZpbGUpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWVudHJ5SW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBjb3B5QW5kQ2xvc2VTdHJlYW0oSW5wdXRTdHJlYW0gb3JpZ2luYWwpIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJSW5wdXRTdHJlYW0gY2FjaGVkQ29weSA9IG51bGw7Ci0JCQotCQlpZiAob3JpZ2luYWwgIT0gbnVsbCkgewotCQkJaW50IGM7Ci0JCQkvLyBhcnJheSBkaW0gcmVzdHJpY3Rpb24/Ci0JCQlieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKChjID0gb3JpZ2luYWwucmVhZChieXRlcykpID49IDApIHsKLQkJCQkJYnVmZmVyLndyaXRlKGJ5dGVzLCAwLCBjKTsKLQkJCQl9Ci0JCQkJY2FjaGVkQ29weSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSk7Ci0JCQkJY2xvc2VTdHJlYW0ob3JpZ2luYWwpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2FjaGVkQ29weTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEVudHJ5TmFtZXMoSVJlc291cmNlIGphclJlc291cmNlKSB7Ci0JCWlmIChqYXJSZXNvdXJjZSA9PSBudWxsIHx8IGphclJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlpZihqYXJSZXNvdXJjZS5nZXRMb2NhdGlvbigpID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGdldEVudHJ5TmFtZXMobmV3IFppcElucHV0U3RyZWFtKCgoSUZpbGUpamFyUmVzb3VyY2UpLmdldENvbnRlbnRzKCkpLCB0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJQcm9ibGVtIHJlYWRpbmcgY29udGVudHMgb2YgIiArIGphclJlc291cmNlLmdldEZ1bGxQYXRoKCksIGUpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRFbnRyeU5hbWVzKGphclJlc291cmNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnRyeU5hbWVzKFN0cmluZyBqYXJGaWxlbmFtZSkgewotCQlyZXR1cm4gZ2V0RW50cnlOYW1lcyhqYXJGaWxlbmFtZSwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0RW50cnlOYW1lcyhaaXBJbnB1dFN0cmVhbSBqYXJJbnB1dFN0cmVhbSwgYm9vbGVhbiBleGNsdWRlRGlyZWN0b3JpZXMpIHsKLQkJTGlzdCBlbnRyeU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJWmlwRW50cnkgeiA9IGphcklucHV0U3RyZWFtLmdldE5leHRFbnRyeSgpOwotCQkJd2hpbGUgKHogIT0gbnVsbCkgewotCQkJCWlmICghKHouaXNEaXJlY3RvcnkoKSAmJiBleGNsdWRlRGlyZWN0b3JpZXMpKQotCQkJCQllbnRyeU5hbWVzLmFkZCh6LmdldE5hbWUoKSk7Ci0JCQkJeiA9IGphcklucHV0U3RyZWFtLmdldE5leHRFbnRyeSgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChaaXBFeGNlcHRpb24gekV4YykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkphclV0aWxpdGllcyBaaXBFeGNlcHRpb246IChzdHJlYW0pICIgKyB6RXhjLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkphclV0aWxpdGllcyBJT0V4Y2VwdGlvbjogKHN0cmVhbSkgIiArIGlvRXhjLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2xvc2VTdHJlYW0oamFySW5wdXRTdHJlYW0pOwotCQl9Ci0JCVN0cmluZ1tdIG5hbWVzID0gKFN0cmluZ1tdKSBlbnRyeU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNsb3NlU3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRyeSB7Ci0JCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEVudHJ5TmFtZXMoU3RyaW5nIGphckZpbGVuYW1lLCBib29sZWFuIGV4Y2x1ZGVEaXJlY3RvcmllcykgewotCQlaaXBGaWxlIGphcmZpbGUgPSBudWxsOwotCQlMaXN0IGVudHJ5TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlqYXJmaWxlID0gbmV3IFppcEZpbGUoamFyRmlsZW5hbWUpOwotCQkJRW51bWVyYXRpb24gZW50cmllcyA9IGphcmZpbGUuZW50cmllcygpOwotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlaaXBFbnRyeSB6ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKCEoei5pc0RpcmVjdG9yeSgpICYmIGV4Y2x1ZGVEaXJlY3RvcmllcykpCi0JCQkJCWVudHJ5TmFtZXMuYWRkKHouZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoWmlwRXhjZXB0aW9uIHpFeGMpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJKYXJVdGlsaXRpZXMgWmlwRXhjZXB0aW9uOiAiICsgamFyRmlsZW5hbWUgKyAiICIgKyB6RXhjLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkphclV0aWxpdGllcyBJT0V4Y2VwdGlvbjogIiArIGphckZpbGVuYW1lICsgIiAiICsgaW9FeGMuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZmluYWxseSB7Ci0JCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCX0KLQkJU3RyaW5nW10gbmFtZXMgPSAoU3RyaW5nW10pIGVudHJ5TmFtZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSVJlc291cmNlIGphclJlc291cmNlLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCWlmIChqYXJSZXNvdXJjZSA9PSBudWxsIHx8IGphclJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybiBudWxsOwotCQlJUGF0aCBsb2NhdGlvbiA9IGphclJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCWlmKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSW5wdXRTdHJlYW0gemlwU3RyZWFtID0gKChJRmlsZSlqYXJSZXNvdXJjZSkuZ2V0Q29udGVudHMoKTsKLQkJCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW0obmV3IFppcElucHV0U3RyZWFtKHppcFN0cmVhbSksIGVudHJ5TmFtZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvYmxlbSByZWFkaW5nIGNvbnRlbnRzIG9mICIgKyBqYXJSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBlKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW0obG9jYXRpb24udG9TdHJpbmcoKSwgZW50cnlOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oWmlwSW5wdXRTdHJlYW0gemlwLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCUlucHV0U3RyZWFtIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlaaXBFbnRyeSB6ID0gemlwLmdldE5leHRFbnRyeSgpOwotCQkJd2hpbGUgKHogIT0gbnVsbCAmJiAhei5nZXROYW1lKCkuZXF1YWxzKGVudHJ5TmFtZSkpIHsKLQkJCQl6ID0gemlwLmdldE5leHRFbnRyeSgpOwotCQkJfQotCQkJaWYoeiAhPSBudWxsKSB7CQkJCQotCQkJCXJlc3VsdCA9IGNvcHlBbmRDbG9zZVN0cmVhbSh6aXApOwotCQkJfQotCQl9Ci0JCWNhdGNoIChaaXBFeGNlcHRpb24gekV4YykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkphclV0aWxpdGllcyBaaXBFeGNlcHRpb246IChzdHJlYW0pICIgKyB6RXhjLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkphclV0aWxpdGllcyBJT0V4Y2VwdGlvbjogKHN0cmVhbSkgIiArIGlvRXhjLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2xvc2VTdHJlYW0oemlwKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIGphckZpbGVuYW1lLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCS8vIGNoZWNrIHNhbml0eQotCQlpZiAoamFyRmlsZW5hbWUgPT0gbnVsbCB8fCBqYXJGaWxlbmFtZS5sZW5ndGgoKSA8IDEgfHwgZW50cnlOYW1lID09IG51bGwgfHwgZW50cnlOYW1lLmxlbmd0aCgpIDwgMSkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEpBUiBmaWxlcyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBsZWFkaW5nICcvJyBpbiBtZW1iZXIgbmFtZXMKLQkJU3RyaW5nIGludGVybmFsTmFtZSA9IG51bGw7Ci0JCWlmIChlbnRyeU5hbWUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDEpOwotCQllbHNlCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWU7Ci0KLQkJcmV0dXJuIGdldENhY2hlZElucHV0U3RyZWFtKGphckZpbGVuYW1lLCBpbnRlcm5hbE5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9QYXRoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUGF0aEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjhmMzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9QYXRoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIGhlbHBlciBtZXRob2RzIHRvIG1hbmFnZSBhbmQgY29udmVydCBsaW5rcyBPcmlnaW5hbGx5IHBhcnQgb2YKLSAqIHRoZSBMaW5rc01hbmFnZXIgCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoSGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLV0FSRF9TTEFTSCA9ICJcXCI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9TTEFTSCA9ICIvIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMQVRJVkVfUEFUSF9TSUcgPSAiLi4vIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBhZGp1c3QgcmVsYXRpdmUgcGF0aCBpc3NpZGUgdGhlIGFic29sdXRlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGp1c3RQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKChpID0gcGF0aC5pbmRleE9mKFJFTEFUSVZFX1BBVEhfU0lHKSkgPiAwKSB7Ci0JCQkvLyBzcGxpdCB0aGUgc3RyaW5nIGludG8gdHdvCi0JCQlTdHJpbmcgcGFydDEgPSBwYXRoLnN1YnN0cmluZygwLCBpIC0gMSk7Ci0JCQlTdHJpbmcgcGFydDIgPSBwYXRoLnN1YnN0cmluZyhpICsgUkVMQVRJVkVfUEFUSF9TSUcubGVuZ3RoKCkgLSAxKTsKLQkJCS8vIHN0cmlwIG9uZSBwYXRoIHNlZyBmcm9tIHBhcnQxCi0JCQlpbnQgaiA9IHBhcnQxLmxhc3RJbmRleE9mKEZPUldBUkRfU0xBU0gpOwotCQkJaWYgKGogPT0gLTEpIHsKLQkJCQkvLyBjYW4ndCByZXNvbHZlLiBwYXNzZWQgcGF0aCBpcyBsaWtlCi0JCQkJLy8gRTovZWNsaXBzZXByb2plY3QvLi4vLi4vc2FtcGxlLmNzcy4KLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJcGFydDEgPSBwYXJ0MS5zdWJzdHJpbmcoMCwgaik7Ci0JCQlwYXRoID0gcGFydDEgKyBwYXJ0MjsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdHJhaWxpbmcgdXJsIHNsYXNoIGlmIG5lZWRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFRyYWlsaW5nVVJMU2xhc2goU3RyaW5nIGlucHV0KSB7Ci0JCS8vIGNoZWNrIHRvIHNlZSBhbHJlYWR5IGEgc2xhc2gKLQkJaWYgKCFpbnB1dC5lbmRzV2l0aChGT1JXQVJEX1NMQVNIKSkgewotCQkJaW5wdXQgKz0gRk9SV0FSRF9TTEFTSDsKLQkJfQotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0byByZWxhdGl2ZSB1cmwgYmFzZWQgb24gYmFzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1JlbGF0aXZlKFN0cmluZyBpbnB1dCwgU3RyaW5nIGJhc2UpIHsKLQkJLy8gdG9rZW5pemUgdGhlIHN0cmluZ3MKLQkJU3RyaW5nVG9rZW5pemVyIGlucHV0VG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbnB1dCwgRk9SV0FSRF9TTEFTSCk7Ci0JCVN0cmluZ1Rva2VuaXplciBiYXNlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihiYXNlLCBGT1JXQVJEX1NMQVNIKTsKLQkJU3RyaW5nIHRva2VuMSA9ICIiLCB0b2tlbjIgPSAiIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkvLwotCQkvLyBHbyB0aHJvdWdoIHVudGlsIGVxdWxzCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoIWlucHV0VG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSB8fCAhYmFzZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0JCQkJYnJlYWs7Ci0JCQl0b2tlbjEgPSBiYXNlVG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJdG9rZW4yID0gaW5wdXRUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAoIXRva2VuMS5lcXVhbHModG9rZW4yKSkKLQkJCQlicmVhazsKLQkJfQotCQkvLyBub3cgZ2VuZXJhdGUgdGhlIGJhY2tzCi0JCVN0cmluZyBvdXRwdXQgPSAiIjsvLyROT04tTkxTLTEkCi0JCXdoaWxlIChiYXNlVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJYmFzZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCW91dHB1dCArPSAiLi4vIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW91dHB1dCArPSB0b2tlbjI7Ci0JCS8vIGdlbmVyYXRlIHRoZSByZXN0Ci0JCXdoaWxlIChpbnB1dFRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCW91dHB1dCA9IG91dHB1dCArIEZPUldBUkRfU0xBU0ggKyBpbnB1dFRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJfQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmluZyBmb2xkZXIgcGF0aC4gV2lsbCBoYW5kbGUgYm90aCB1cmwgYW5kIGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbnRhaW5pbmdGb2xkZXJQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCVN0cmluZyByZXRWYWx1ZSA9IHBhdGg7Ci0KLQkJaW50IHVybFNsYXNoSW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKEZPUldBUkRfU0xBU0gpOwotCQlpbnQgZmlsZVBhdGhTbGFzaEluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0JCWludCBpbmRleCA9IGZpbGVQYXRoU2xhc2hJbmRleDsKLQkJaWYgKHVybFNsYXNoSW5kZXggPiBmaWxlUGF0aFNsYXNoSW5kZXgpCi0JCQlpbmRleCA9IHVybFNsYXNoSW5kZXg7Ci0JCWlmIChpbmRleCA+PSAwKQotCQkJcmV0VmFsdWUgPSBwYXRoLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCXJldHVybiByZXRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbGVhZGluZyBwYXRoIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUxlYWRpbmdQYXRoU2VwYXJhdG9yKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKQotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKEZpbGUuc2VwYXJhdG9yLmxlbmd0aCgpKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVMZWFkaW5nU2VwYXJhdG9yKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoLnN0YXJ0c1dpdGgoRmlsZS5zZXBhcmF0b3IpKQotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKEZpbGUuc2VwYXJhdG9yLmxlbmd0aCgpKTsKLQkJZWxzZSBpZiAocGF0aC5zdGFydHNXaXRoKEZPUldBUkRfU0xBU0gpIHx8IHBhdGguc3RhcnRzV2l0aChCQUNLV0FSRF9TTEFTSCkpCi0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoRk9SV0FSRF9TTEFTSC5sZW5ndGgoKSk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFN3aXRjaCB0byBmaWxlIHBhdGggc2xhc2hlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaFRvRmlsZVBhdGhTbGFzaGVzKFN0cmluZyBwYXRoKSB7Ci0JCXBhdGggPSBwYXRoLnJlcGxhY2UoRk9SV0FSRF9TTEFTSC5jaGFyQXQoMCksIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCXBhdGggPSBwYXRoLnJlcGxhY2UoQkFDS1dBUkRfU0xBU0guY2hhckF0KDApLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBTd2l0Y2ggdG8gZmlsZSBwYXRoIHNsYXNoZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzd2l0Y2hUb0ZvcndhcmRTbGFzaGVzKFN0cmluZyBwYXRoKSB7Ci0JCXBhdGggPSBwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCBGT1JXQVJEX1NMQVNILmNoYXJBdCgwKSk7Ci0JCXBhdGggPSBwYXRoLnJlcGxhY2UoQkFDS1dBUkRfU0xBU0guY2hhckF0KDApLCBGT1JXQVJEX1NMQVNILmNoYXJBdCgwKSk7Ci0JCXJldHVybiBwYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Qcm9qZWN0UmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Qcm9qZWN0UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyMWY5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUHJvamVjdFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBUaGUgVVJJUmVzb2x2ZXIgaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgcmVzb2x2ZXIgZnJvbQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RSZXNvbHZlciBpbXBsZW1lbnRzIFVSSVJlc29sdmVyIHsKLQlwcml2YXRlIFN0cmluZyBmRmlsZUJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IGNsaWVudHMgdXNlCi0JICogcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKSB0byBvYnRhaW4gYSBVUklSZXNvbHZlciBhd2FyZSBvZgotCSAqIHRoZSBQcm9qZWN0J3Mgc3BlY2lhbCByZXF1aXJlbWVudHMuIE5vdGUgdGhhdCBhIFVSSVJlc29sdmVyIG1heSBub3QgYmUKLQkgKiByZXR1cm5lZCBhdCBhbGwgc28gbWFudWFsbHkgY3JlYXRpbmcgdGhpcyBvYmplY3QgbWF5IHN0aWxsIGJlIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBQcm9qZWN0UmVzb2x2ZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlQmFzZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gZkZpbGVCYXNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBnZXRGaWxlQmFzZUxvY2F0aW9uKCkpOwotCX0KLQotCS8vIGRlZmVjdCAyNDQ4MTcgZW5kCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgKHBvc3NpYmx5IHJlbGF0aXZlKSBVUkkgYWNvcmRpbmcgdG8gUkZDMTgwOCB1c2luZyB0aGUKLQkgKiBkZWZhdWx0IGZpbGUgYmFzZSBsb2NhdGlvbi4gUmVzb2x2ZXMgcmVzb3VyY2UgcmVmZXJlbmNlcyBpbnRvIGFic29sdXRlCi0JICogcmVzb3VyY2UgbG9jYXRpb25zIHdpdGhvdXQgZW5zdXJpbmcgdGhhdCB0aGUgcmVzb3VyY2UgYWN0dWFsbHkgZXhpc3RzLgotCSAqIAotCSAqIE5vdGU6IGN1cnJlbnRseSByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgaWdub3JlZCBpbiB0aGlzCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSkgewotCQlpZiAodXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLyoKLQkJICogZGVmZWN0IDI0NDgxNyB0cnkgeyBVUkwgYVVSTCA9IG5ldyBVUkwodXJpKTsKLQkJICovCi0JCS8qKgotCQkgKiBBbiBhY3R1YWwgVVJMIHdhcyBnaXZlbiwgYnV0IG9ubHkgdGhlICJmaWxlOi8vLyIgcHJvdG9jb2wgaXMKLQkJICogc3VwcG9ydGVkLiBSZXNvbHZlIHRoZSBVUkkgYnkgZmluZGluZyB0aGUgZmlsZSB0byB3aGljaCBpdCBwb2ludHMuCi0JCSAqLwotCQkvKgotCQkgKiBkZWZlY3QgMjQ0ODE3IGlmICghYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygicGxhdGZvcm0iKSkgewotCQkgKiAvLyROT04tTkxTLTEkIGlmIChhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikgJiYKLQkJICogKGFVUkwuZ2V0SG9zdCgpLmVxdWFscygibG9jYWxob3N0IikgfHwgYVVSTC5nZXRIb3N0KCkubGVuZ3RoKCkgPT0KLQkJICogMCkpIHsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQgcmV0dXJuIGFVUkwuZ2V0RmlsZSgpOyB9IHJldHVybgotCQkgKiB1cmk7IH0gfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1mdUV4YykgeyB9Ci0JCSAqLwotCQkvLyBkZWZlY3QgMjQ0ODE3IHN0YXJ0Ci0JCWlmIChpc0ZpbGVVUkwodXJpKSkgewotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotCQkJCXJldHVybiBnZXRQYXRoKHVybCk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQkvLyBkZWZlY3QgMjQ0ODE3IGVuZAotCi0JCS8vIHdoaWNoIG9mIHRoZSBzZXJ2ZXJhbCBhcmUgd2Ugc3VwcG9zZSB0byB1c2UgaGVyZT8KLQkJLy8KLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEyMjMKLQkJLy8gV29ya2Fyb3VuZCBmb3IgcHJvYmxlbSBpbiBVUklIZWxwZXI7IHVyaXMgc3RhcnRpbmcgd2l0aCAnLycgYXJlCi0JCS8vIHJldHVybmVkIGFzLWlzLgotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCQlpZiAodXJpLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJUHJvamVjdCBwID0gZ2V0UHJvamVjdCgpOwotCQkJaWYgKHAgIT0gbnVsbCAmJiBwLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IHAuZ2V0RmlsZSh1cmkpOwotCQkJCQotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlpZiAobG9jYXRpb24gPT0gbnVsbCAmJiBmaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJCQlsb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJCQlsb2NhdGlvbiA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlsb2NhdGlvbiA9IFVSSUhlbHBlci5ub3JtYWxpemUodXJpLCBiYXNlUmVmZXJlbmNlLCBnZXRSb290TG9jYXRpb25TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gdGhlIGdldExvY2F0aW9uQnlVUkkgYWN0aW9uIHVzaW5nIHRoZSBiYXNlUmVmZXJlbmNlIGFzIHRoZQotCSAqIHBvaW50IG9mIHJlZmVyZW5jZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvciB0aGlzIHJlc29sdmVyCi0JICogCi0JICogTm90ZTogY3VycmVudGx5IHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyBpcyBpZ25vcmVkIGluIHRoaXMKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgYmFzZVJlZmVyZW5jZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gaG9zdAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aChJUGF0aCBwYXRoLCBTdHJpbmcgaG9zdCkgewotCQlJUGF0aCBuZXdQYXRoID0gcGF0aDsKLQkJLy8gVGhleSBhcmUgcG90ZW50aWFsbHkgZm9yIG9ubHkgV2luZG93cyBvcGVyYXRpbmcgc3lzdGVtLgotCQkvLyBhLikgaWYgcGF0aCBoYXMgYSBkZXZpY2UsIGFuZCBpZiBpdCBiZWdpbnMgd2l0aCBJUGF0aC5TRVBBUkFUT1IsCi0JCS8vIHJlbW92ZSBpdAotCQlmaW5hbCBTdHJpbmcgZGV2aWNlID0gcGF0aC5nZXREZXZpY2UoKTsKLQkJaWYgKChkZXZpY2UgIT0gbnVsbCkgJiYgKGRldmljZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlpZiAoZGV2aWNlLmNoYXJBdCgwKSA9PSBJUGF0aC5TRVBBUkFUT1IpIHsKLQkJCQlmaW5hbCBTdHJpbmcgbmV3RGV2aWNlID0gZGV2aWNlLnN1YnN0cmluZygxKTsKLQkJCQluZXdQYXRoID0gcGF0aC5zZXREZXZpY2UobmV3RGV2aWNlKTsKLQkJCX0KLQkJfQotCQkvLyBiLikgaWYgaXQgaGFzIGEgaG9zdG5hbWUsIGl0IGlzIFVOQyBuYW1lLi4uIEFueSBqYXZhIG9yIGVjbGlwc2UgYXBpCi0JCS8vIGhlbHBzIGl0ID8/Ci0JCWlmIChwYXRoICE9IG51bGwgJiYgaG9zdCAhPSBudWxsICYmIGhvc3QubGVuZ3RoKCkgIT0gMCkgewotCQkJSVBhdGggdW5jUGF0aCA9IG5ldyBQYXRoKGhvc3QpOwotCQkJdW5jUGF0aCA9IHVuY1BhdGguYXBwZW5kKHBhdGgpOwotCQkJbmV3UGF0aCA9IHVuY1BhdGgubWFrZVVOQyh0cnVlKTsKLQkJfQotCQlyZXR1cm4gbmV3UGF0aC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhdGgoVVJMIHVybCkgewotCQlTdHJpbmcgcmVmID0gdXJsLmdldFJlZigpID09IG51bGwgPyAiIiA6ICIjIiArIHVybC5nZXRSZWYoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZyBzdHJQYXRoID0gdXJsLmdldEZpbGUoKSArIHJlZjsKLQkJSVBhdGggcGF0aDsKLQkJaWYgKHN0clBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJcGF0aCA9IFBhdGguUk9PVDsKLQkJfQotCQllbHNlIHsKLQkJCXBhdGggPSBuZXcgUGF0aChzdHJQYXRoKTsKLQkJCVN0cmluZyBxdWVyeSA9IG51bGw7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJQYXRoLCAiPyIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgdG9rZW5Db3VudCA9IHBhcnNlci5jb3VudFRva2VucygpOwotCQkJaWYgKHRva2VuQ291bnQgPT0gMikgewotCQkJCXBhdGggPSBuZXcgUGF0aCgoU3RyaW5nKSBwYXJzZXIubmV4dEVsZW1lbnQoKSk7Ci0JCQkJcXVlcnkgPSAoU3RyaW5nKSBwYXJzZXIubmV4dEVsZW1lbnQoKTsKLQkJCX0KLQkJCWlmIChxdWVyeSA9PSBudWxsKSB7Ci0JCQkJcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLnRvU3RyaW5nKCksICIjIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0b2tlbkNvdW50ID0gcGFyc2VyLmNvdW50VG9rZW5zKCk7Ci0JCQkJaWYgKHRva2VuQ291bnQgPT0gMikgewotCQkJCQlwYXRoID0gbmV3IFBhdGgoKFN0cmluZykgcGFyc2VyLm5leHRFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0UGF0aChwYXRoLCB1cmwuZ2V0SG9zdCgpKTsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyIGdldFJvb3RMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Um9vdExvY2F0aW9uU3RyaW5nKCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCQlpZiAoZlByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZlByb2plY3QuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQlsb2NhdGlvbiA9IGZQcm9qZWN0LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAobG9jYXRpb24gPT0gbnVsbCAmJiBmUHJvamVjdC5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwpIHsKLQkJCWxvY2F0aW9uID0gZlByb2plY3QuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCQl9Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlsb2NhdGlvbiA9IGZQcm9qZWN0LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldFVSSVN0cmVhbShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIGRlZmVjdCAyNDQ4MTcgc3RhcnQKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFzc2VkU3BlYwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZpbGVVUkwoU3RyaW5nIHBhc3NlZFNwZWMpIHsKLQkJaWYgKHBhc3NlZFNwZWMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbmFsIFN0cmluZyBzcGVjID0gcGFzc2VkU3BlYy50cmltKCk7Ci0JCWlmIChzcGVjLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmaW5hbCBpbnQgbGltaXQgPSBzcGVjLmxlbmd0aCgpOwotCQlTdHJpbmcgbmV3UHJvdG9jb2wgPSBudWxsOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGltaXQ7IGluZGV4KyspIHsKLQkJCWZpbmFsIGNoYXIgcCA9IHNwZWMuY2hhckF0KGluZGV4KTsKLQkJCWlmIChwID09ICcvJykgeyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocCA9PSAnOicpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5ld1Byb3RvY29sID0gc3BlYy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiAobmV3UHJvdG9jb2wgIT0gbnVsbCAmJiBuZXdQcm90b2NvbC5jb21wYXJlVG9JZ25vcmVDYXNlKCJmaWxlIikgPT0gMCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdGaWxlQmFzZUxvY2F0aW9uKSB7Ci0JCWZGaWxlQmFzZUxvY2F0aW9uID0gbmV3RmlsZUJhc2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJZlByb2plY3QgPSBuZXdQcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9SZXNvdXJjZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1OWVjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUmVzb3VyY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSBtYWtlcyBhc3N1bXB0aW9ucyBvbiBiZWhhbGYgb2YgdGhlIHJlcXVlc3RlcgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VVdGlsIHsKLQotCS8qKgotCSAqIE9idGFpbnMgdGhlIElGaWxlIGZvciBhIG1vZGVsCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICB0aGUgbW9kZWwgdG8gdXNlCi0JICogQHJldHVybiB0aGUgSUZpbGUgdXNlZCB0byBjcmVhdGUgdGhlIG1vZGVsLCBpZiBpdCBjYW1lIGZyb20gYW4gSUZpbGUsCi0JICogICAgICAgICBudWxsIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0RmlsZUZvcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCS8vIGlmIHRoZSBwYXRoIGlzIG5vdCBhIHBhdGggaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCB0aGVyZSBhcmUgYXQgbGVhc3QKLQkJLy8gMiBzZWdtZW50cywgaXQgbWlnaHQgYmUgaW4gdGhlIHdvcmtzcGFjZQotCQlJRmlsZVtdIGZpbGVzID0gcm9vdC5maW5kRmlsZXNGb3JMb2NhdGlvbihsb2NhdGlvbik7Ci0JCWlmIChmaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQlmaWxlID0gZmlsZXNbMF07Ci0JCX0KLQkJZWxzZSBpZiAobG9jYXRpb24uc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkvLyByZW1lbWJlciwgdGhpcyBJRmlsZSBpc24ndCBndWFyYW50ZWVkIHRvIGV4aXN0Ci0JCQlmaWxlID0gcm9vdC5nZXRGaWxlKGxvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBPYnRhaW4gSUZpbGVzIGZyb20gSVN0cnVjdHVyZWRNb2RlbCAoaW5jbHVkZXMgbGlua2VkUmVzb3VyY2VzKQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSwgb3IgYW4gZW1wdHkgYXJyYXkgaWYKLQkgKiAgICAgICAgIG5vbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlW10gZ2V0RmlsZXNGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlGaWxlW10gZmlsZXMgPSBudWxsOwotCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCS8vIGlmIHRoZSBwYXRoIGlzIG5vdCBhIHBhdGggaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCB0aGVyZSBhcmUgYXQgbGVhc3QKLQkJLy8gMiBzZWdtZW50cywgaXQgbWlnaHQgYmUgaW4gdGhlIHdvcmtzcGFjZQotCQlpZiAoIWxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpICYmIGxvY2F0aW9uLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJLy8gcmVtZW1iZXIsIHRoaXMgSUZpbGUgaXNuJ3QgZ3VhcmFudGVlZCB0byBleGlzdAotCQkJZmlsZXMgPSBuZXcgSUZpbGVbXXtyb290LmdldEZpbGUobG9jYXRpb24pfTsKLQkJfQotCQllbHNlIHsKLQkJCWZpbGVzID0gcm9vdC5maW5kRmlsZXNGb3JMb2NhdGlvbihsb2NhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9TY3JpcHRMYW5ndWFnZUtleXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9TY3JpcHRMYW5ndWFnZUtleXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0ZDdhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvU2NyaXB0TGFuZ3VhZ2VLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogQ29udGFpbnMgbGlzdCBvZiBzY3JpcHQgbGFuZ3VhZ2VzIGFuZCBtaW1lIHR5cGVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NyaXB0TGFuZ3VhZ2VLZXlzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkEgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQV9MQU5HVUFHRV9LRVlTID0gbmV3IFN0cmluZ1tdeyJqYXZhIn07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFTQ1JJUFQgPSAiamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUyA9IHsiamF2YXNjcmlwdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuMCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuMSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuMiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuMyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuNCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuNSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdDEuNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkianNjcmlwdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkic2FzaHNjcmlwdCJ9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEpBVkFTQ1JJUFRfTUlNRV9UWVBFX0tFWVMgPSB7InRleHQvamF2YXNjcmlwdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkidGV4dC9qc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L3Nhc2hzY3JpcHQifTsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1NvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1NvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ZmNDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Tb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLS8qKgotICogVGhlIFNvcnRPcGVyYXRpb24gdGFrZXMgYSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgYW5kIHJldHVybnMgYSBzb3J0ZWQKLSAqIGNvbGxlY3Rpb24gb2YgdGhlc2Ugb2JqZWN0cy4gQ29uY3JldGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcHJvdmlkZSB0aGUKLSAqIGNyaXRlcmlhIGZvciB0aGUgc29ydGluZyBvZiB0aGUgb2JqZWN0cyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNvcnRlciB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lIFRoaXMgaXMgdGhlCi0JICogJ29yZGVyaW5nJyBtZXRob2Qgb2YgdGhlIHNvcnQgb3BlcmF0aW9uLiBFYWNoIHN1YmNsYXNzIG92ZXJpZGVzIHRoaXMKLQkgKiBtZXRob2Qgd2l0aCB0aGUgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJ2dyZWF0ZXIgdGhhbicgY29uY2VwdAotCSAqIGZvciB0aGUgb2JqZWN0cyBiZWluZyBzb3J0ZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29tcGFyZShPYmplY3QgZWxlbWVudE9uZSwgT2JqZWN0IGVsZW1lbnRUd28pOwotCi0JLyoqCi0JICogU29ydCB0aGUgb2JqZWN0cyBpbiBzb3J0ZWQgY29sbGVjdGlvbiBhbmQgcmV0dXJuIHRoYXQgY29sbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIHF1aWNrU29ydChPYmplY3RbXSBzb3J0ZWRDb2xsZWN0aW9uLCBpbnQgbGVmdCwgaW50IHJpZ2h0KSB7Ci0JCWludCBvcmlnaW5hbExlZnQgPSBsZWZ0OwotCQlpbnQgb3JpZ2luYWxSaWdodCA9IHJpZ2h0OwotCQlPYmplY3QgbWlkID0gc29ydGVkQ29sbGVjdGlvblsobGVmdCArIHJpZ2h0KSAvIDJdOwotCi0JCWRvIHsKLQkJCXdoaWxlIChjb21wYXJlKHNvcnRlZENvbGxlY3Rpb25bbGVmdF0sIG1pZCkpCi0JCQkJbGVmdCsrOwotCQkJd2hpbGUgKGNvbXBhcmUobWlkLCBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSkpCi0JCQkJcmlnaHQtLTsKLQkJCWlmIChsZWZ0IDw9IHJpZ2h0KSB7Ci0JCQkJT2JqZWN0IHRtcCA9IHNvcnRlZENvbGxlY3Rpb25bbGVmdF07Ci0JCQkJc29ydGVkQ29sbGVjdGlvbltsZWZ0XSA9IHNvcnRlZENvbGxlY3Rpb25bcmlnaHRdOwotCQkJCXNvcnRlZENvbGxlY3Rpb25bcmlnaHRdID0gdG1wOwotCQkJCWxlZnQrKzsKLQkJCQlyaWdodC0tOwotCQkJfQotCQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKLQotCQlpZiAob3JpZ2luYWxMZWZ0IDwgcmlnaHQpCi0JCQlzb3J0ZWRDb2xsZWN0aW9uID0gcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIG9yaWdpbmFsTGVmdCwgcmlnaHQpOwotCQlpZiAobGVmdCA8IG9yaWdpbmFsUmlnaHQpCi0JCQlzb3J0ZWRDb2xsZWN0aW9uID0gcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsUmlnaHQpOwotCi0JCXJldHVybiBzb3J0ZWRDb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBzb3J0ZWQgY29sbGVjdGlvbiBmcm9tIHRoaXMgdW5zb3J0ZWQgY29sbGVjdGlvbi4gU29ydAotCSAqIHVzaW5nIHF1aWNrIHNvcnQuCi0JICovCi0JcHVibGljIE9iamVjdFtdIHNvcnQoT2JqZWN0W10gdW5Tb3J0ZWRDb2xsZWN0aW9uKSB7Ci0JCWludCBzaXplID0gdW5Tb3J0ZWRDb2xsZWN0aW9uLmxlbmd0aDsKLQkJT2JqZWN0W10gc29ydGVkQ29sbGVjdGlvbiA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0KLQkJLy9jb3B5IHRoZSBhcnJheSBzbyBjYW4gcmV0dXJuIGEgbmV3IHNvcnRlZCBjb2xsZWN0aW9uCi0JCVN5c3RlbS5hcnJheWNvcHkodW5Tb3J0ZWRDb2xsZWN0aW9uLCAwLCBzb3J0ZWRDb2xsZWN0aW9uLCAwLCBzaXplKTsKLQkJaWYgKHNpemUgPiAxKQotCQkJcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIDAsIHNpemUgLSAxKTsKLQotCQlyZXR1cm4gc29ydGVkQ29sbGVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVGV4dFV0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1RleHRVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzZmE0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVGV4dFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIHRleHQgZnVuY3Rpb25zLgotICogQGRlcHJlY2F0ZWQgLSB0aGUgSkZhY2UgY2xhc3MgaXMgcHVibGljIGluIDMuMQotICovCi0vLyBUaGlzIGNsYXNzIHdhcyBvcmlnaW5hbGx5IGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsIGFuZCBtYWRlCi0vLyBwdWJsaWMKLXB1YmxpYyBjbGFzcyBUZXh0VXRpbGl0aWVzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRleHQgZW5kcyB3aXRoIG9uZSBvZiB0aGUgZ2l2ZW4gc2VhcmNoIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVuZHNXaXRoKFN0cmluZ1tdIHNlYXJjaFN0cmluZ3MsIFN0cmluZyB0ZXh0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRleHQuZW5kc1dpdGgoc2VhcmNoU3RyaW5nc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgZ3JlYXRlciB0aGFuIG9mZnNldCBvZiB0aGUgbG9uZ2VzdAotCSAqIG1hdGNoaW5nIHNlYXJjaCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBpbmRleE9mKFN0cmluZ1tdIHNlYXJjaFN0cmluZ3MsIFN0cmluZyB0ZXh0LCBpbnQgb2Zmc2V0KSB7Ci0KLQkJaW50W10gcmVzdWx0ID0gey0xLCAtMX07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgaW5kZXggPSB0ZXh0LmluZGV4T2Yoc2VhcmNoU3RyaW5nc1tpXSwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA+PSAwKSB7Ci0KLQkJCQlpZiAocmVzdWx0WzBdID09IC0xKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0gZWxzZSBpZiAoaW5kZXggPCByZXN1bHRbMF0pIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfSBlbHNlIGlmIChpbmRleCA9PSByZXN1bHRbMF0gJiYgc2VhcmNoU3RyaW5nc1tpXS5sZW5ndGgoKSA+IHNlYXJjaFN0cmluZ3NbcmVzdWx0WzFdXS5sZW5ndGgoKSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1VSSVJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyNTllYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqIAotICogU2hvdWxkIHVzZSBleHRlbnNpYmxlIFVSSVJlc29sdmVyIGZyb20gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcgotICogaW5zdGVhZC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFVSSVJlc29sdmVyIHsKLQotCVN0cmluZyBnZXRGaWxlQmFzZUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSAocG9zc2libHkgcmVsYXRpdmUpIFVSSSBhY29yZGluZyB0byBSRkMxODA4IHVzaW5nIHRoZQotCSAqIGRlZmF1bHQgZmlsZSBiYXNlIGxvY2F0aW9uLiBSZXNvbHZlcyByZXNvdXJjZSByZWZlcmVuY2VzIGludG8gYWJzb2x1dGUKLQkgKiByZXNvdXJjZSBsb2NhdGlvbnMgd2l0aG91dCBlbnN1cmluZyB0aGF0IHRoZSByZXNvdXJjZSBhY3R1YWxseSBleGlzdHMuCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSk7Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSAocG9zc2libHkgcmVsYXRpdmUpIFVSSSBhY29yZGluZyB0byBSRkMxODA4IHVzaW5nIHRoZQotCSAqIGRlZmF1bHQgZmlsZSBiYXNlIGxvY2F0aW9uLiBSZXNvbHZlcyByZXNvdXJjZSByZWZlcmVuY2VzIGludG8gYWJzb2x1dGUKLQkgKiByZXNvdXJjZSBsb2NhdGlvbnMgd2l0aG91dCBlbnN1cmluZyB0aGF0IHRoZSByZXNvdXJjZSBhY3R1YWxseSBleGlzdHMuCi0JICogCi0JICogSWYgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwKLQkgKiBwcm9wZXJseSByZXNvbHZlIHRoZSBVUkkgaWYgaXQgaXMgYSB2YWxpZCBVUkkgdG8gYW5vdGhlciAoYXBwcm9wcmlhdGUpCi0JICogcHJvamVjdC4KLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyk7Ci0KLQkvKioKLQkgKiBQZXJmb3JtIHRoZSBnZXRMb2NhdGlvbkJ5VVJJIGFjdGlvbiB1c2luZyB0aGUgYmFzZVJlZmVyZW5jZSBhcyB0aGUKLQkgKiBwb2ludCBvZiByZWZlcmVuY2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmb3IgdGhpcyByZXNvbHZlcgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gdGhlIGdldExvY2F0aW9uQnlVUkkgYWN0aW9uIHVzaW5nIHRoZSBiYXNlUmVmZXJlbmNlIGFzIHRoZQotCSAqIHBvaW50IG9mIHJlZmVyZW5jZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvciB0aGlzIHJlc29sdmVyCi0JICogCi0JICogSWYgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwKLQkgKiBwcm9wZXJseSByZXNvbHZlIHRoZSBVUkkgaWYgaXQgaXMgYSB2YWxpZCBVUkkgdG8gYW5vdGhlciAoYXBwcm9wcmlhdGUpCi0JICogcHJvamVjdC4KLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpOwotCi0JSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JSUNvbnRhaW5lciBnZXRSb290TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIHJldHVybiBhIGRpcmVjdCBpbnB1dHN0cmVhbSB0byB0aGUgZ2l2ZW4gVVJJIHdoaWNoIG11c3QgYmUKLQkgKiByZWxhdGl2ZSB0byB0aGUgZGVmYXVsdCBwb2ludCBvZiByZWZlcmVuY2UuCi0JICogCi0JICovCi0JSW5wdXRTdHJlYW0gZ2V0VVJJU3RyZWFtKFN0cmluZyB1cmkpOwotCi0Jdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbik7Ci0KLQl2b2lkIHNldFByb2plY3QoSVByb2plY3QgbmV3UHJvamVjdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VdGlsaXRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExYzVlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQnVmZmVyZWRMaW1pdGVkU3RyZWFtOwotCi0KLQotcHVibGljIGNsYXNzIFV0aWxpdGllcyB7Ci0KLQkvKioKLQkgKiBhIGNvbW1vbiBjYWxjdWxhdGlvbiBpbiBzb21lIG9mIHRoZSBwYXJzaW5nIG1ldGhvZHMgKGUuZy4gaW4KLQkgKiBDb250ZXh0UmVnaW9uIGFuZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoU3RyaW5nIGNoYW5nZXMsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggYnkgdGhlIHRleHQgaXRzZWxmLCBvciwgaWYgdGhlcmUgaXMgbm8gdGV4dCB0bwotCQkvLyBpbnNlcnQgKGkuZS4gd2UgYXJlIGRvaW5nIGEgZGVsZXRlKSB0aGVuIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIGFzCi0JCS8vIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGRlbm90ZSB0aGUgYW1vdW50IHRvIGRlbGV0ZS4KLQkJLy8gRm9yIGEgc3RyYWlnaHQgaW5zZXJ0LCB0aGUgc2VsZWN0aW9uIExlbmd0aCB3aWxsIGJlIHplcm8uCi0JCWludCBsZW5ndGhEaWZmZXJlbmNlID0gMDsKLQkJaWYgKGNoYW5nZXMgPT0gbnVsbCkgewotCQkJLy8gdGhlIGRlbGV0ZSBjYXNlCi0JCQlsZW5ndGhEaWZmZXJlbmNlID0gMCAtIGxlbmd0aFRvUmVwbGFjZTsKLQkJfQotCQllbHNlIHsKLQkJCWxlbmd0aERpZmZlcmVuY2UgPSBjaGFuZ2VzLmxlbmd0aCgpIC0gbGVuZ3RoVG9SZXBsYWNlOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsZW5ndGhEaWZmZXJlbmNlOiAiICsgbGVuZ3RoRGlmZmVyZW5jZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBsZW5ndGhEaWZmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZmYgYm90aCBwYXJhbWV0ZXJzIGFyZSBub3QgbnVsbCBhbmQgdGhlIG9iamVjdCBpcyB3aXRoaW4KLQkgKiB0aGUgYXJyYXkuIENhcmVmdWwsIHRoaXMgdXNlcyBpZGVudGl0eS4gTm90IGdvb2QgZm9yIGJhc2ljIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdFtdIG9iamVjdEFycmF5LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIG9iamVjdCBvciBvYmplY3RBcnJheSBpcyBudWxsLCByZXR1cm4gZmFsc2UKLQkJaWYgKChvYmplY3RBcnJheSAhPSBudWxsKSAmJiAob2JqZWN0ICE9IG51bGwpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9iamVjdEFycmF5W2ldID09IG9iamVjdCkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNTdHJpbmcoU3RyaW5nW10gb2JqZWN0QXJyYXksIFN0cmluZyBvYmplY3QpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgb2JqZWN0IG9yIG9iamVjdEFycmF5IGlzIG51bGwsIHJldHVybiBmYWxzZQotCQlpZiAoKG9iamVjdEFycmF5ICE9IG51bGwpICYmIChvYmplY3QgIT0gbnVsbCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob2JqZWN0QXJyYXlbaV0uZXF1YWxzKG9iamVjdCkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IGFuIElucHV0U3RyZWFtIGhhcyBtYXJrL3Jlc2V0IHN1cHBvcnQsIGlzIHJlYWRsaW1pdCBpcwotCSAqIHNldCwgYW5kIHRoYXQgdGhlIHN0cmVhbSBpcyAibGltaXRhYmxlIiAodGhhdCBpcywgcmVwb3J0cyAiZW5kIG9mCi0JICogaW5wdXQiIHJhdGhlciB0aGFuIGFsbG93IGdvaW5nIHBhc3QgbWFyaykuIFRoaXMgaXMgdmVyeSBzcGVjaWFsaXplZAotCSAqIHN0cmVhbSBpbnRyb2R1Y2VkIHRvIG92ZXJjb21lCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3MjExLiBTZWUgYWxzbwotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODU2NQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0TGltaXRlZFN0cmVhbShJbnB1dFN0cmVhbSBvcmlnaW5hbCkgewotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob3JpZ2luYWwgaW5zdGFuY2VvZiBCdWZmZXJlZExpbWl0ZWRTdHJlYW0pCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKG9yaWdpbmFsLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRW5zdXJlcyB0aGF0IGFuIElucHV0U3RyZWFtIGhhcyBtYXJrL3Jlc2V0IHN1cHBvcnQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEl0J3Mgdml0YWwgdGhhdCBhIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gPGI+bm90PC9iPiBiZSB3cmFwcGVkIGluIGFub3RoZXIKLQkgKiBCdWZmZXJlZElucHV0U3RyZWFtIGFzIGVhY2ggY2FuIHByZWVtcHRpdmVseSBjb25zdW1lIDxpPm48L2k+IGJ5dGVzCi0JICogKGUuZy4gMjA0OCkgZnJvbSB0aGUgcGFyZW50IHN0cmVhbSBiZWZvcmUgYW55IHJlcXVlc3RzIGFyZSBtYWRlLiBUaGUKLQkgKiBjYXNjYWRpbmcgZWZmZWN0IGlzIHRoYXQgdGhlIHNlY29uZC9pbm5lciBCdWZmZXJlZElucHV0U3RyZWFtIGNhbiBuZXZlcgotCSAqIHJld2luZCBpdHNlbGYgdG8gdGhlIGZpcnN0IDxpPm48L2k+IGJ5dGVzIHNpbmNlIHRoZXkgd2VyZSBhbHJlYWR5Ci0JICogY29uc3VtZWQgYnkgaXRzIHBhcmVudC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRNYXJrU3VwcG9ydGVkU3RyZWFtKElucHV0U3RyZWFtIG9yaWdpbmFsKSB7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvcmlnaW5hbC5tYXJrU3VwcG9ydGVkKCkpCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCUlucHV0U3RyZWFtIGJ1ZmZlcmVkID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0ob3JpZ2luYWwsIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJYnVmZmVyZWQubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlyZXR1cm4gYnVmZmVyZWQ7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBmb3IgbG9nL3RyYWNlIG1lc3NhZ2VzLiBJZCBpcyBhc3N1bWVkIHRvIGJlIHNvbWUgZm9ybSBvZiBhCi0JICogZmlsZW5hbWUuIFNlZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VTaG9ydElkKE9iamVjdCBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCWlkID0gIk5PSUQiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHdob2xlID0gaWQudG9TdHJpbmcoKTsKLQkJU3RyaW5nIHBhcnQgPSB3aG9sZS5zdWJzdHJpbmcod2hvbGUubGFzdEluZGV4T2YoIi8iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAiLi4uIiArIHBhcnQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFV0aWxpdGllcyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBVdGlsaXRpZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvckluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRXJyb3JJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNmI5MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIEVycm9ySW5mbyB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhpbnQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpOwotCi0JcHVibGljIGludCBnZXRTdGF0ZSgpOwotCi0JcHVibGljIHNob3J0IGdldFRhcmdldFR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2MDIwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25BZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKTsKLQotCS8qKgotCSAqLwotCXZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyZjYwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTWVzc2FnZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUdOT1JFID0gLTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9STUFUSU9OID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMjsKLQlwcml2YXRlIGludCBsZW5ndGg7Ci0KLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCXByaXZhdGUgaW50IG9mZnNldDsKLQlwcml2YXRlIGludCBzZXZlcml0eTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IG9mZnNldCwgaW50IHNldmVyaXR5KSB7Ci0JCXRoaXMobWVzc2FnZSwgb2Zmc2V0LCAwLCBzZXZlcml0eSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgc2V2ZXJpdHkpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMubWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRoaXMub2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiB0aGlzLnNldmVyaXR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvblJlcG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25SZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEwNmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUmVwb3J0ZXIgewotCi0JLyoqCi0JICovCi0Jdm9pZCByZXBvcnQoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSk7Ci0JCi0Jdm9pZCByZXBvcnQoRXJyb3JJbmZvIGluZm8pOwotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0b3JHcm91cExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRvckdyb3VwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjNmY4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRvckdyb3VwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklWYWxpZGF0b3JHcm91cExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRvckdyb3VwTGlzdGVuZXIgaW1wbGVtZW50cyBJVmFsaWRhdG9yR3JvdXBMaXN0ZW5lciB7Ci0KLQlNYXAgZkRpYWdub3N0aWNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnID0gZmFsc2U7Ci0KLQlwdWJsaWMgVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcigpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQlzdXBlci5maW5hbGl6ZSgpOwotCQlpZiAoZkRpYWdub3N0aWNNYXAgIT0gbnVsbCAmJiAhZkRpYWdub3N0aWNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBwYXRocyA9IGZEaWFnbm9zdGljTWFwLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkxlYWtlZCBtb2RlbDogIiArIHBhdGhzW2ldKTsKLQkJCQl2YWxpZGF0aW9uRmluaXNoaW5nKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSgoSVBhdGgpIHBhdGhzW2ldKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uRmluaXNoaW5nKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUpIHsKLQkJaWYgKF9kZWJ1ZykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoaW5nOiIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCXJldHVybjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gKElTdHJ1Y3R1cmVkTW9kZWwpIGZEaWFnbm9zdGljTWFwLnJlbW92ZShyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGlvblN0YXJ0aW5nKElSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUpIHsKLQkJaWYgKF9kZWJ1ZykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmc6ICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWZEaWFnbm9zdGljTWFwLnB1dChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBtb2RlbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JU3RydWN0dXJlZFBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdGV4dC9JU3RydWN0dXJlZFBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjZmMyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uaW5nIGZvciBTdHJ1Y3R1cmVkRG9jdW1lbnRzLgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkUGFydGl0aW9ucyB7Ci0KLQlTdHJpbmcgREVGQVVMVF9QQVJUSVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVTktOT1dOX1BBUlRJVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLlVOS05PV05fUEFSVElUSU9OX1RZUEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWxzL1N0cmluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWxzL1N0cmluZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NGZkZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS91dGlscy9TdHJpbmdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgU3RyaW5nVXRpbHMgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFNUEVSU1RBTkQgPSAiJiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTVBFUlNUQU5EX0VOVElUWSA9ICImJjsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FSUklBR0VfUkVUVVJOID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBUlJJQUdFX1JFVFVSTl9FTlRJVFkgPSAiXFxyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSTEYgPSAiXHJcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVJTID0gIiBcdFxuXHJcZiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEUgPSAiXCIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URV9DSEFSID0gJ1wiJzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URV9FTlRJVFkgPSAiJnF1b3Q7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVQUxfU0lHTiA9ICI9IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUFMX1NJR05fRU5USVRZID0gIiYjNjE7IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVBVEVSX1RIQU4gPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVBVEVSX1RIQU5fRU5USVRZID0gIiZndDsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVTU19USEFOID0gIjwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVTU19USEFOX0VOVElUWSA9ICImbHQ7IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExGID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRCA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRURfRU5USVRZID0gIlxcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRURfVEFHID0gIjxkbD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9UQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9UQUJfRU5USVRZID0gIlxcdCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1RBQl9UQUcgPSAiPGRkPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEUgPSAiJyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFX0NIQVIgPSAnXCcnOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1FVT1RFX0VOVElUWSA9ICImIzAzOTsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRV9FTlRJVFkgPSAiJm5ic3A7IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBcHBlbmQgYXBwZW5kU3RyaW5nIHRvIHRoZSBlbmQgb2YgYVN0cmluZyBvbmx5IGlmIGFTdHJpbmcgZG9lcyBub3QgZW5kCi0JICogd2l0aCB0aGUgaW5zZXJ0U3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZElmTm90RW5kV2l0aChTdHJpbmcgYVN0cmluZywgU3RyaW5nIGFwcGVuZFN0cmluZykgewotCQlpZiAoKGFTdHJpbmcgIT0gbnVsbCkgJiYgKGFwcGVuZFN0cmluZyAhPSBudWxsKSkKLQkJCWlmIChhU3RyaW5nLmVuZHNXaXRoKGFwcGVuZFN0cmluZykpCi0JCQkJcmV0dXJuIGFTdHJpbmc7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGFTdHJpbmcgKyBhcHBlbmRTdHJpbmc7Ci0JCWVsc2UKLQkJCXJldHVybiBhU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEJyZWFrcyBvdXQgc3BhY2Utc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuIEZvciBleGFtcGxlOgotCSAqIDxjb2RlPiJubyBjb21tZW50IjwvY29kZT4gaW50byBhbiBhcnJheSA8Y29kZT5hWzBdPSJubyI8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmFbMV09ICJjb21tZW50IjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFzQXJyYXkoU3RyaW5nIHZhbHVlKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUpOwotCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWxpc3QuYWRkKHN0b2submV4dFRva2VuKCkpOwotCQl9Ci0JCVN0cmluZyByZXN1bHRbXSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCcmVha3Mgb3V0IGRlbGltLXNlcGFyYXRlZCB3b3JkcyBpbnRvIGFuIGFycmF5IG9mIHdvcmRzLiBGb3IgZXhhbXBsZToKLQkgKiA8Y29kZT4ibm8gY29tbWVudCI8L2NvZGU+IGludG8gYW4gYXJyYXkgPGNvZGU+YVswXT0ibm8iPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5hWzFdPSAiY29tbWVudCI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHdvcmRzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhc0FycmF5KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGRlbGltKSB7Ci0JCXJldHVybiBhc0FycmF5KHZhbHVlLCBkZWxpbSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEJyZWFrcyBvdXQgZGVsaW0tc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuIEZvciBleGFtcGxlOgotCSAqIDxjb2RlPiJubyBjb21tZW50IjwvY29kZT4gaW50byBhbiBhcnJheSA8Y29kZT5hWzBdPSJubyI8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmFbMV09ICJjb21tZW50IjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFzQXJyYXkoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVsaW0sIGJvb2xlYW4gcmV0dXJuVG9rZW5zKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsIGRlbGltLCByZXR1cm5Ub2tlbnMpOwotCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWxpc3QuYWRkKHN0b2submV4dFRva2VuKCkpOwotCQl9Ci0JCVN0cmluZyByZXN1bHRbXSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCcmVha3Mgb3V0IGRlbGltLXNlcGFyYXRlZCB3b3JkcyBpbnRvIGFuIGFycmF5IG9mIHdvcmRzLiBGb3IgZXhhbXBsZToKLQkgKiA8Y29kZT4iYWJjLCxkZWYiPC9jb2RlPiBpbnRvIGFuIGFycmF5IDxjb2RlPmFbMF09ImFiYyI8L2NvZGU+LAotCSAqIDxjb2RlPmFbMV09bnVsbDwvY29kZT4sIGFuZCA8Y29kZT5hWzJdPSAiZGVmIjwvY29kZT4gd2hlcmUgIiwiIGlzCi0JICogdGhlIGRlbGltLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHdvcmRzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhc0ZpeGVkQXJyYXkoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVsaW0pIHsKLQkJU3RyaW5nIGFycmF5W10gPSBhc0FycmF5KHZhbHVlLCBkZWxpbSwgdHJ1ZSk7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJYm9vbGVhbiBzdHJpbmdGb3VuZCA9IGZhbHNlOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB0b2tlbiA9IGFycmF5W2ldOwotCQkJaWYgKHRva2VuLmNvbXBhcmVUbyhkZWxpbSkgPT0gMCkgewotCQkJCWlmICghc3RyaW5nRm91bmQpCi0JCQkJCWxpc3QuYWRkKG51bGwpOwotCQkJCXN0cmluZ0ZvdW5kID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsaXN0LmFkZCh0b2tlbik7Ci0JCQkJc3RyaW5nRm91bmQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGFkZCBvbmUgbW9yZSBudWxsIGlmIGxhc3QgdG9rZW4gaXMgdGhlIGRlbGltCi0JCWlmICghc3RyaW5nRm91bmQpCi0JCQlsaXN0LmFkZChudWxsKTsKLQotCQlTdHJpbmcgcmVzdWx0W10gPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hvcChTdHJpbmcgc291cmNlKSB7Ci0JCXJldHVybiBjaG9wKHNvdXJjZSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNob3AoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlbGltaXRlcikgewotCQlyZXR1cm4gc291cmNlLnN1YnN0cmluZygwLCBzb3VyY2UubGFzdEluZGV4T2YoZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZ1tdIGFycmF5T2ZTdHJpbmdzLCBTdHJpbmcgbmVlZGxlLCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG5lZWRsZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXJyYXlPZlN0cmluZ3MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoY2FzZVNlbnNpdGl2ZSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheU9mU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChuZWVkbGUuZXF1YWxzKGFycmF5T2ZTdHJpbmdzW2ldKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5T2ZTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG5lZWRsZS5lcXVhbHNJZ25vcmVDYXNlKGFycmF5T2ZTdHJpbmdzW2ldKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNMZXR0ZXJzKFN0cmluZyBmdWxsVmFsdWUpIHsKLQotCQlpZiAoZnVsbFZhbHVlID09IG51bGwgfHwgZnVsbFZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJY2hhcltdIGNoYXJzID0gZnVsbFZhbHVlLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnVsbFZhbHVlLmxlbmd0aCgpOyBpKyspCi0JCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGNoYXJzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zTGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZykgIT0gLTE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydExpbmVEZWxpbWl0ZXJzKFN0cmluZyBhbGxUZXh0LCBTdHJpbmcgbGluZURlbGltaXRlclRvVXNlKSB7Ci0JCUlEb2N1bWVudCB0ZW1wRG9jID0gbmV3IERvY3VtZW50KGFsbFRleHQpOwotCi0JCWlmIChsaW5lRGVsaW1pdGVyVG9Vc2UgPT0gbnVsbCkKLQkJCWxpbmVEZWxpbWl0ZXJUb1VzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxpbmVDb3VudCA9IHRlbXBEb2MuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBsaW5lSW5mbyA9IHRlbXBEb2MuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCWludCBsaW5lU3RhcnRPZmZzZXQgPSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgbGluZUxlbmd0aCA9IGxpbmVJbmZvLmdldExlbmd0aCgpOwotCQkJCWludCBsaW5lRW5kT2Zmc2V0ID0gbGluZVN0YXJ0T2Zmc2V0ICsgbGluZUxlbmd0aDsKLQkJCQluZXdUZXh0ICs9IGFsbFRleHQuc3Vic3RyaW5nKGxpbmVTdGFydE9mZnNldCwgbGluZUVuZE9mZnNldCk7Ci0KLQkJCQlpZiAoKGkgPCBsaW5lQ291bnQgLSAxKSAmJiAodGVtcERvYy5nZXRMaW5lRGVsaW1pdGVyKGkpICE9IG51bGwpKQotCQkJCQluZXdUZXh0ICs9IGxpbmVEZWxpbWl0ZXJUb1VzZTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHNwZWNpYWwgSFRNTCBjaGFyYWN0ZXJzIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogSFRNTCBlbnRpdHkgZXF1aXZhbGVudC4gV0FSTklORyBvbmx5IHVzZSB0aGlzIG1ldGhvZCBmb3Igc3RyaW5ncyB0aGF0Ci0JICogZG9udCBhbHJlYWR5IGhhdmUgSFRNTC1zcGVjaWZpYyBpdGVtcyBzdWNoIGFzIHRhZ3MgYW5kIGVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgU3RyaW5nIHRvIGNvbnZlcnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29udmVydGVkIHN0cmluZwotCSAqIEBzZWUgSFRNTFByaW50ZXIjY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgQU1QRVJTVEFORCwgQU1QRVJTVEFORF9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMRVNTX1RIQU4sIExFU1NfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBHUkVBVEVSX1RIQU4sIEdSRUFURVJfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX0ZFRUQsIExJTkVfRkVFRF9UQUcpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX1RBQiwgTElORV9UQUJfVEFHKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU0lOR0xFX1FVT1RFLCBTSU5HTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgRE9VQkxFX1FVT1RFLCBET1VCTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU1BBQ0UgKyBTUEFDRSwgU1BBQ0VfRU5USVRZICsgU1BBQ0VfRU5USVRZKTsgLy8gcmVwbGFjaW5nCi0JCS8vIGV2ZXJ5Ci0JCS8vIHNwYWNlCi0JCS8vIHdvdWxkCi0JCS8vIGJlCi0JCS8vIHRvbwotCQkvLyBtdWNoCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSBmb3JtIHRoYXQgd2lsbCBub3QgY29uZmxpY3Qgd2l0aCBzYXZpbmcgaXQKLQkgKiBpbnRvIGFuIElOSSBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBub3JtYWxTdHJpbmcpIHsKLQkJaWYgKG5vcm1hbFN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBlc2NhcGVkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5vcm1hbFN0cmluZywgRVFVQUxfU0lHTiArIExJTkVfRkVFRCArIENBUlJJQUdFX1JFVFVSTiArIExJTkVfVEFCLCB0cnVlKTsKLQkJU3RyaW5nIGNodW5rID0gbnVsbDsKLQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJY2h1bmsgPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCWlmIChjaHVuay5lcXVhbHMoRVFVQUxfU0lHTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChFUVVBTF9TSUdOX0VOVElUWSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaHVuay5lcXVhbHMoTElORV9GRUVEKSkgewotCQkJCWVzY2FwZWRCdWZmZXIuYXBwZW5kKExJTkVfRkVFRF9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSBpZiAoY2h1bmsuZXF1YWxzKENBUlJJQUdFX1JFVFVSTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChDQVJSSUFHRV9SRVRVUk5fRU5USVRZKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNodW5rLmVxdWFscyhMSU5FX1RBQikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChMSU5FX1RBQl9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXNjYXBlZEJ1ZmZlci5hcHBlbmQoY2h1bmspOwotCQkJfQotCQl9Ci0JCXJldHVybiBlc2NhcGVkQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZ2l2ZW4gdGV4dCB3aXRob3V0IGEgdHJhaWxpbmcgZGVsaW1pdGVyCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlyc3RMaW5lT2YoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDwgMSkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJSURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCh0ZXh0KTsKLQkJdHJ5IHsKLQkJCWludCBsaW5lTnVtYmVyID0gZG9jLmdldExpbmVPZk9mZnNldCgwKTsKLQkJCUlSZWdpb24gbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24obGluZU51bWJlcik7Ci0JCQlyZXR1cm4gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKGFTdHJpbmcsIGFTdHJpbmcubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZywgaW50IG9mZnNldCkgewotCQlpbnQgaW5kZXggPSAtMTsKLQotCQlpZiAoYVN0cmluZyAhPSBudWxsICYmIGFTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpbmRleCA9IGFTdHJpbmcubGFzdEluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihDUiwgb2Zmc2V0KTsKLQkJCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihMRiwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mTGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkxpbmVEZWxpbWl0ZXIoU3RyaW5nIGFTdHJpbmcsIGludCBvZmZzZXQpIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0KLQkJaWYgKGFTdHJpbmcgIT0gbnVsbCAmJiBhU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5pbmRleE9mKENSLCBvZmZzZXQpOwotCQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoTEYsIG9mZnNldCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBpbmRleE9mTm9uYmxhbmsoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBpbmRleCA9IC0xOwotCi0JCWlmIChhU3RyaW5nICE9IG51bGwgJiYgYVN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBhU3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoREVMSU1JVEVSUy5pbmRleE9mKGFTdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAxKSkgPT0gLTEpIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IGluc2VydFN0cmluZyB0byB0aGUgYmVnaW5uaW5nIG9mIGFTdHJpbmcgb25seSBpZiBhU3RyaW5nIGRvZXMKLQkgKiBub3Qgc3RhcnQgd2l0aCB0aGUgaW5zZXJ0U3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc2VydElmTm90U3RhcnRXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgaW5zZXJ0U3RyaW5nKSB7Ci0JCWlmICgoYVN0cmluZyAhPSBudWxsKSAmJiAoaW5zZXJ0U3RyaW5nICE9IG51bGwpKQotCQkJaWYgKGFTdHJpbmcuc3RhcnRzV2l0aChpbnNlcnRTdHJpbmcpKQotCQkJCXJldHVybiBhU3RyaW5nOwotCQkJZWxzZQotCQkJCXJldHVybiBpbnNlcnRTdHJpbmcgKyBhU3RyaW5nOwotCQllbHNlCi0JCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNRdW90ZWQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZyA9PSBudWxsKSB8fCAoc3RyaW5nLmxlbmd0aCgpIDwgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0cmluZy5sZW5ndGgoKSAtIDE7Ci0JCWNoYXIgZmlyc3RDaGFyID0gc3RyaW5nLmNoYXJBdCgwKTsKLQkJY2hhciBsYXN0Q2hhciA9IHN0cmluZy5jaGFyQXQobGFzdEluZGV4KTsKLQotCQlyZXR1cm4gKCgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URV9DSEFSKSAmJiAobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFX0NIQVIpKSB8fCAoKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEVfQ0hBUikgJiYgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkpOwotCX0KLQotCS8qKgotCSAqIFVuaXQgdGVzdHMuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy8gdGVzdFBhc3RlKCk7Ci0JCXRlc3RTdHJpcE5vbkxldHRlckRpZ2l0cygpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbWVyZ2VkIGZvcm0gb2YgYm90aCBzdHJpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2UoU3RyaW5nIG5ld1N0YXJ0LCBTdHJpbmcgbmV3RW5kKSB7Ci0JCVN0cmluZ1tdIHJlZ2lvbnMgPSBvdmVybGFwUmVnaW9ucyhuZXdTdGFydCwgbmV3RW5kKTsKLQkJcmV0dXJuIHJlZ2lvbnNbMF0gKyByZWdpb25zWzFdICsgcmVnaW9uc1syXTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBvY2N1cnJlbmNlc09mKFN0cmluZyBzZWFyY2hTdHJpbmcsIGNoYXIgdGFyZ2V0Q2hhcikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaW50IGxlbiA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHRhcmdldENoYXIgPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKSkKLQkJCQlyZXN1bHQrKzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIAotCSAqIFJldHVybnMgYSAzIFN0cmluZyBhcnJheSBjb250YWluaW5nIHVuaXF1ZSB0ZXh0IGZyb20gdGhlIHN0YXJ0LAotCSAqIGR1cGxpY2F0ZWQgdGV4dCB0aGF0IG92ZXJsYXBzIHRoZSBzdGFydCBhbmQgZW5kLCBhbmQgdGhlIHVuaXF1ZSB0ZXh0Ci0JICogZnJvbSB0aGUgZW5kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG92ZXJsYXBSZWdpb25zKFN0cmluZyBzdGFydCwgU3RyaW5nIGVuZCkgewotCQlTdHJpbmdbXSByZXN1bHRzID0gbnVsbDsKLQkJaWYgKHN0YXJ0ICE9IG51bGwgJiYgZW5kID09IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBuZXcgU3RyaW5nW117c3RhcnQsICIiLCAiIn07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsIGVuZH07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgPT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgIT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCi0JCQlpbnQgc3RhcnRMZW5ndGggPSBzdGFydC5sZW5ndGgoKTsKLQkJCWludCBlbmRMZW5ndGggPSBlbmQubGVuZ3RoKCk7Ci0KLQkJCWlmIChzdGFydExlbmd0aCA9PSAwIHx8IGVuZExlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHRzID0gbmV3IFN0cmluZ1szXTsKLQkJCQlTdHJpbmcgdGVzdFN0YXJ0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGVzdEVuZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IG1lcmdlTGVuZ3RoID0gTWF0aC5taW4oc3RhcnRMZW5ndGgsIGVuZExlbmd0aCk7Ci0JCQkJYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOwotCQkJCXdoaWxlIChtZXJnZUxlbmd0aCA+IDAgJiYgIWZpbmlzaGVkKSB7Ci0JCQkJCXRlc3RTdGFydCA9IHN0YXJ0LnN1YnN0cmluZyhzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJdGVzdEVuZCA9IGVuZC5zdWJzdHJpbmcoMCwgbWVyZ2VMZW5ndGgpOwotCQkJCQkvLyBjYXNlIHNlbnNpdGl2ZQotCQkJCQlpZiAodGVzdFN0YXJ0LmVxdWFscyh0ZXN0RW5kKSkgewotCQkJCQkJZmluaXNoZWQgPSB0cnVlOwotCQkJCQkJcmVzdWx0c1swXSA9IHN0YXJ0LnN1YnN0cmluZygwLCBzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJCXJlc3VsdHNbMV0gPSBzdGFydC5zdWJzdHJpbmcoc3RhcnRMZW5ndGggLSBtZXJnZUxlbmd0aCk7Ci0JCQkJCQlyZXN1bHRzWzJdID0gZW5kLnN1YnN0cmluZyhtZXJnZUxlbmd0aCk7Ci0JCQkJCX0KLQkJCQkJbWVyZ2VMZW5ndGgtLTsKLQkJCQl9Ci0JCQkJaWYgKCFmaW5pc2hlZCkgewotCQkJCQlyZXN1bHRzWzBdID0gc3RhcnQ7Ci0JCQkJCXJlc3VsdHNbMV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHRzWzJdID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBQYWNrcyBhbiBhcnJheSBvZiBTdHJpbmdzIGludG8gYSBzaW5nbGUgY29tbWEgZGVsaW1pdGVkIFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqIEByZXR1cm4KLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2soU3RyaW5nW10gc3RyaW5ncykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMucmVwbGFjZShzdHJpbmdzW2ldLCAiLCIsICImY29tbWE7IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChpIDwgc3RyaW5ncy5sZW5ndGggLSAxKQotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIFBhc3RlcyB0aGUgbmV3IHRleHQgaW50byB0aGUgb2xkIGF0IHRoZSBzdGFydCBwb3NpdGlvbiwgcmVwbGFjaW5nIHRleHQKLQkgKiBpbXBsaWVkIGJ5IGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZShTdHJpbmcgb2xkVGV4dCwgU3RyaW5nIG5ld1RleHQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgc3RhcnRJbmRleCA9IHN0YXJ0OwotCQlpbnQgZW5kSW5kZXggPSBzdGFydCArIGxlbmd0aDsKLQkJaWYgKHN0YXJ0SW5kZXggPiBvbGRUZXh0Lmxlbmd0aCgpKSB7Ci0JCQlzdGFydEluZGV4ID0gb2xkVGV4dC5sZW5ndGgoKTsKLQkJfQotCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCkpOwotCQkvLyBudWxsIG9yIGVtcHR5IG5ldyB0ZXh0IGFjY29tcGxpY2hlcyBhIGRlbGV0ZQotCQlpZiAobmV3VGV4dCAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQobmV3VGV4dCk7Ci0JCX0KLQkJaWYgKGVuZEluZGV4IDwgb2xkVGV4dC5sZW5ndGgoKSkgewotCi0JCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoZW5kSW5kZXgpKTsKLQkJfQotCQlyZXN1bHQgPSBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgbWF0Y2hpbmcgbGl0ZXJhbCBwb3J0aW9ucyBvZiBhIHN0cmluZyB3aXRoIGFub3RoZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkgewotCQlpZiAoYVN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBub3JtYWxTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gYVN0cmluZy5sZW5ndGgoKTsKLQkJaW50IHBvc2l0aW9uID0gMDsKLQkJaW50IHByZXZpb3VzID0gMDsKLQkJaW50IHNwYWNlciA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJd2hpbGUgKHBvc2l0aW9uICsgc3BhY2VyIC0gMSA8IGxlbmd0aCAmJiBhU3RyaW5nLmluZGV4T2Yoc291cmNlLCBwb3NpdGlvbikgPiAtMSkgewotCQkJcG9zaXRpb24gPSBhU3RyaW5nLmluZGV4T2Yoc291cmNlLCBwcmV2aW91cyk7Ci0JCQlub3JtYWxTdHJpbmcgPSBub3JtYWxTdHJpbmcgKyBhU3RyaW5nLnN1YnN0cmluZyhwcmV2aW91cywgcG9zaXRpb24pICsgdGFyZ2V0OwotCQkJcG9zaXRpb24gKz0gc3BhY2VyOwotCQkJcHJldmlvdXMgPSBwb3NpdGlvbjsKLQkJfQotCQlub3JtYWxTdHJpbmcgPSBub3JtYWxTdHJpbmcgKyBhU3RyaW5nLnN1YnN0cmluZyhwb3NpdGlvbiwgYVN0cmluZy5sZW5ndGgoKSk7Ci0KLQkJcmV0dXJuIG5vcm1hbFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHRoZSBlbnRpdHkgcmVmZXJlbmNlcyBmb3IgbWFya3VwIGRlbGltaXRlcnMgaW4gdGV4dCB3aGVyZSB0aGV5Ci0JICogaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBwcm9wZXIgVW5pY29kZSB2YWx1ZXMgdGhyb3VnaCBhIERPTSB0ZXh0Ci0JICogcGFyc2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3RvcmVNYXJrZXJzKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBjb250ZW50ID0gdGV4dDsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgQU1QRVJTVEFORCwgQU1QRVJTVEFORF9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMRVNTX1RIQU4sIExFU1NfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBHUkVBVEVSX1RIQU4sIEdSRUFURVJfVEhBTl9FTlRJVFkpOwotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGV4dHJhIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhbmQgcXVvdGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXAoU3RyaW5nIHF1b3RlZFN0cmluZykgewotCQlpZiAocXVvdGVkU3RyaW5nID09IG51bGwgfHwgcXVvdGVkU3RyaW5nLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gcXVvdGVkU3RyaW5nOwotCQlTdHJpbmcgdHJpbW1lZCA9IHF1b3RlZFN0cmluZy50cmltKCk7Ci0JCWlmICh0cmltbWVkLmxlbmd0aCgpIDwgMikKLQkJCXJldHVybiBxdW90ZWRTdHJpbmc7Ci0KLQkJY2hhciBmaXJzdCA9IHRyaW1tZWQuY2hhckF0KDApOwotCQljaGFyIG5leHRUb0xhc3QgPSB0cmltbWVkLmNoYXJBdCh0cmltbWVkLmxlbmd0aCgpIC0gMik7Ci0JCWNoYXIgbGFzdCA9IHRyaW1tZWQuY2hhckF0KHRyaW1tZWQubGVuZ3RoKCkgLSAxKTsKLQotCQlpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInICYmIG5leHRUb0xhc3QgIT0gJ1xcJykgfHwgKGZpcnN0ID09ICdcJycgJiYgbGFzdCA9PSAnXCcnICYmIG5leHRUb0xhc3QgIT0gJ1xcJykpIHsKLQkJCXJldHVybiB0cmltbWVkLnN1YnN0cmluZygxLCB0cmltbWVkLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHRyaW1tZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3RyaXBzIGFueXRoaW5nIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nIHRoYXQKLQkgKiBpcyBub3QgYSBsZXR0ZXIgb3IgZGlnaXQuIEl0IGlzIHVzZWQgYnkgc29tZSBlbmNvZGluZyBkZXRlY3RvcnMgdG8gY29tZQotCSAqIHVwIHdpdGggdGhlIGVuY29kaW5nIG5hbWUgZnJvbSBpbGxmb3JtZWQgaW5wdXQgKGUuZyBpbiA8P3htbAotCSAqIGVuY29kaW5nPSJhYmM/PiAtLSB3aGVyZSBmaW5hbCBxdW90ZSBpcyBsZWZ0IG9mZiwgdGhlICc+JyBpcyByZXR1cm5lZAotCSAqIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAnYWJjJykuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBOb25MZXR0ZXJEaWdpdHMoU3RyaW5nIGZ1bGxWYWx1ZSkgewotCQlpZiAoZnVsbFZhbHVlID09IG51bGwgfHwgZnVsbFZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZnVsbFZhbHVlOwotCQlpbnQgZnVsbFZhbHVlTGVuZ3RoID0gZnVsbFZhbHVlLmxlbmd0aCgpOwotCQlpbnQgZmlyc3RQb3MgPSAwOwotCQl3aGlsZSAoZmlyc3RQb3MgPCBmdWxsVmFsdWVMZW5ndGggJiYgIUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoZnVsbFZhbHVlLmNoYXJBdChmaXJzdFBvcykpKSB7Ci0JCQlmaXJzdFBvcysrOwotCQl9Ci0JCWludCBsYXN0UG9zID0gZnVsbFZhbHVlTGVuZ3RoIC0gMTsKLQkJd2hpbGUgKGxhc3RQb3MgPiBmaXJzdFBvcyAmJiAhQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChmdWxsVmFsdWUuY2hhckF0KGxhc3RQb3MpKSkgewotCQkJbGFzdFBvcy0tOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSBmdWxsVmFsdWU7Ci0JCWlmIChmaXJzdFBvcyAhPSAwIHx8IGxhc3RQb3MgIT0gZnVsbFZhbHVlTGVuZ3RoKSB7Ci0JCQlyZXN1bHQgPSBmdWxsVmFsdWUuc3Vic3RyaW5nKGZpcnN0UG9zLCBsYXN0UG9zICsgMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIHN0cmlwLCBleGNlcHQgcXVvdGVzIGRvbid0IG5lZWQgdG8gbWF0Y2ggc3VjaCBhcyAiVVRGJyBpcwotCSAqIHN0aWxsIHN0cmlwcGVkIG9mIGJvdGggcXVvdGVzLiAoUGx1cywgdGhpcyBvbmUgZG9lcyBub3QgZGV0ZWN0IGVzY2FwZWQKLQkgKiBxdW90ZXMpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXMoU3RyaW5nIHF1b3RlZFZhbHVlKSB7Ci0JCWlmIChxdW90ZWRWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIG5vcm1hbGx5IHdpbGwgbmV2ZXIgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIGJsYW5rcywKLQkJLy8gYnV0IGlmIGl0IGRvZXMsIHdlJ2xsIGRvIGxlbmllbnQgaW50ZXJwcmV0YXRpb24KLQkJcmV0dXJuIHN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShxdW90ZWRWYWx1ZSkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIExpa2Ugc3RyaXAgcXVvdGVzLCBleGNlcHQgbGVhdmVzIHRoZSBzdGFydCBhbmQgZW5kIHNwYWNlIGluc2lkZSB0aGUKLQkgKiBxdW90ZXMKLQkgKiAKLQkgKiBAcGFyYW0gcXVvdGVkVmFsdWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXNMZWF2ZUluc2lkZVNwYWNlKFN0cmluZyBxdW90ZWRWYWx1ZSkgewotCQlpZiAocXVvdGVkVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBub21hbGx5IHdpbGwgbmV2ZXIgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIGJsYW5rcyAuLi4gYnV0IGp1c3QgaW4KLQkJLy8gY2FzZS4KLQkJU3RyaW5nIHJlc3VsdCA9IHF1b3RlZFZhbHVlLnRyaW0oKTsKLQkJaW50IGxlbiA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCWNoYXIgZmlyc3RDaGFyID0gcmVzdWx0LmNoYXJBdCgwKTsKLQkJCWlmICgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URV9DSEFSKSB8fCAoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMSwgbGVuKTsKLQkJCX0KLQkJCWxlbiA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJY2hhciBsYXN0Q2hhciA9IHJlc3VsdC5jaGFyQXQobGVuIC0gMSk7Ci0JCQkJaWYgKChsYXN0Q2hhciA9PSBTSU5HTEVfUVVPVEVfQ0hBUikgfHwgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkgewotCQkJCQlyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0UGFzdGUoKSB7Ci0JCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRoZSBxdWljayBicm93biBmb3ggLi4uIjsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgbnVsbCwgNCwgNSkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgbnVsbCwgNCwgNikpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgIiIsIDQsIDYpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgImZhc3QiLCA0LCA2KSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsICJmYXN0ICIsIDQsIDYpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgIkJ1dCAiLCAwLCAwKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKCIiLCAiYnVycCIsIDQsIDYpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFN0cmlwTm9uTGV0dGVyRGlnaXRzKCkgewotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJhYmMiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiXCJhYmNcIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiXCJhYi1jMT8iOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIisrKyI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiYWJjPSI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiYWJjICI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhib29sZWFuIGJvb2xlYW5WYWx1ZSkgewotCQlpZiAoYm9vbGVhblZhbHVlKQotCQkJcmV0dXJuIFRSVUU7Ci0JCWVsc2UKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgImVzY2FwZWQiIGNoYXJzIGZyb20gYSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIGFTdHJpbmcpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbm9ybWFsU3RyaW5nID0gcmVwbGFjZShhU3RyaW5nLCBFUVVBTF9TSUdOX0VOVElUWSwgRVFVQUxfU0lHTik7Ci0JCW5vcm1hbFN0cmluZyA9IHJlcGxhY2Uobm9ybWFsU3RyaW5nLCBMSU5FX0ZFRURfRU5USVRZLCBMSU5FX0ZFRUQpOwotCQlub3JtYWxTdHJpbmcgPSByZXBsYWNlKG5vcm1hbFN0cmluZywgQ0FSUklBR0VfUkVUVVJOX0VOVElUWSwgQ0FSUklBR0VfUkVUVVJOKTsKLQkJbm9ybWFsU3RyaW5nID0gcmVwbGFjZShub3JtYWxTdHJpbmcsIExJTkVfVEFCX0VOVElUWSwgTElORV9UQUIpOwotCQlyZXR1cm4gbm9ybWFsU3RyaW5nOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZUVuZE9mKFN0cmluZyBuZXdTdGFydCwgU3RyaW5nIG5ld0VuZCkgewotCQlTdHJpbmdbXSByZWdpb25zID0gb3ZlcmxhcFJlZ2lvbnMobmV3U3RhcnQsIG5ld0VuZCk7Ci0JCXJldHVybiByZWdpb25zWzJdOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgYSBjb21tYSBkZWxpbWl0ZWQgU3RyaW5nIGludG8gYW4gYXJyYXkgb2YgU3RyaW5ncwotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybgotCSAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB1bnBhY2soU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkvLyBzaW5jZSB3ZSdyZSBzZXBhcmF0aW5nIHRoZSB2YWx1ZXMgd2l0aCAnLCcsIGVzY2FwZSAnLCcgaW4gdGhlCi0JCQkvLyB2YWx1ZXMKLQkJCWxpc3QuYWRkKFN0cmluZ1V0aWxzLnJlcGxhY2UodG9rZXIubmV4dFRva2VuKCksICImY29tbWE7IiwgIiwiKS50cmltKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogU3RyaW5nVXRpbHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1V0aWxzKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Q0NzY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTg3ZDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDBlOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gTWF5IDE0IDIyOjQ0OjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5MjViZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jV2VkIEp1biAxNSAxNDoxNDo0NiBFRFQgMjAwNQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc0ZDM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmE3Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUsIDIwMDg8L3A+Ci08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMKLXBsdWctaW4gKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcwotcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhCi0JaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZQotRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5Ci0oIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyCi11c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QKLXRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQKLXN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZAotcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseQotZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsCi1wdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSBmb3IKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND5PcGVuIE1vYmlsZSBBbGxpYW5jZSBEVERzPC9oND4KLQotPHA+VGhlIHBsdWctaW4gaXMgYWNjb21wYW5pZWQgYnkgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucwotKCZxdW90O1dBUCBEVERzJnF1b3Q7KSBkZWZpbmVkIGJ5IHRoZSBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbAotKFdBUCkgRm9ydW0uIFRoZSBXQVAgRm9ydW0gaGFzIG5vdyBiZWVuIGNvbnNvbGlkYXRlZCBpbnRvIHRoZSBPcGVuCi1Nb2JpbGUgQWxsaWFuY2UgKE9NQSkuIFRoZSBXQVAgRFREcyBhcmUgdGhlIGZvbGxvd2luZyBmaWxlcyBsb2NhdGVkIGluCi10aGUgcGx1Zy1pbjo8L3A+Ci08dWw+Ci0JPGxpPjxzdHJvbmc+d21sMTEuZHRkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbF8xLjEueG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbF8xLjEueG1sPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+d21sMTMuZHRkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbDEzLmR0ZCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWwxMy5kdGQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQveGh0bWwtbW9iaWxlMTAuZHRkPC9hPjwvbGk+Ci08L3VsPgotCi08cD5Zb3VyIHVzZSBvZiB0aGUgV0FQIERURHMgaXMgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1vZiB0aGUgRVBMLjwvcD4KLQotPHA+TW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgV0FQIGFuZCB0aGUgT01BIGlzIGF2YWlsYWJsZSBhdCA8YQotCWhyZWY9Imh0dHA6Ly93d3cub3Blbm1vYmlsZWFsbGlhbmNlLm9yZy90ZWNoL2FmZmlsaWF0ZXMvd2FwL3dhcGluZGV4Lmh0bWwiPmh0dHA6Ly93d3cub3Blbm1vYmlsZWFsbGlhbmNlLm9yZy90ZWNoL2FmZmlsaWF0ZXMvd2FwL3dhcGluZGV4Lmh0bWw8L2E+LjwvcD4KLQotPGg0PlczQyBEVERzPC9oND4KLQotPHA+VGhlIHBsdWctaW4gaXMgYWNjb21wYW5pZWQgYnkgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoJnF1b3Q7Ci1XM0MgRFREcyZxdW90OykgZGVmaW5lZCBieSB0aGUgdGhlIFczQyBFeHRlbnNpYmxlIEh5cGVyVGV4dCBNYXJrdXAKLUxhbmd1YWdlIChYSFRNTCkgMS4xLiBYSFRNTCBpcyBkZXNjcmliZWQgYXQgPGEKLQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExLyI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS88L2E+LjwvcD4KLVRoZSBXM0MgRFREcyBhcmUgdGhlIGZvbGxvd2luZyBmaWxlcyBsb2NhdGVkIGluIHRoZSBwbHVnLWluOgotPHA+Ci08dWw+Ci0JPGxpPjxzdHJvbmc+eGh0bWwxMS1mbGF0LmR0ZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbDEtZnJhbWVzZXQuZHRkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIgotCQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwxLXN0cmljdDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiCi0JCXRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwxLXRyYW5zaXRpb25hbC5kdGQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIgotCQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZDwvYT48L2xpPgotCTxsaT48c3Ryb25nPnhodG1sLWJhc2ljMTAtZi5kdGQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCIKLQkJdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAuZHRkPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwtbGF0MS5lbnQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLWxhdDEuZW50IiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1sYXQxLmVudDwvYT48L2xpPgotCTxsaT48c3Ryb25nPnhodG1sLXNwZWNpYWwuZW50PC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zcGVjaWFsLmVudCIKLQkJdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3BlY2lhbC5lbnQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbC1zeW1ib2wuZW50PC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zeW1ib2wuZW50IgotCQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zeW1ib2wuZW50PC9hPjwvbGk+Ci08L3VsPgotCi08cD5BcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA1LjEwIG9mIHRoZSBGQVEgbG9jYXRlZCBhdCA8YQotCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS0yMDAwMDYyMC5odG1sI0RURCIKLQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLTIwMDAwNjIwLmh0bWwjRFREPC9hPiwKLXlvdXIgdXNlIG9mIHRoZSBXM0MgRFREcyBpcyBnb3Zlcm5lZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1XM0MgU29mdHdhcmUgTGljZW5zZSBhIGNvcHkgb2Ygd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlIGZpbGUgPGEKLQlocmVmPSJhYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAuaHRtIj5hYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAuaHRtPC9hPgotYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCi0JaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAiCi0JdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwPC9hPi48L3A+Ci08aDQ+V1NETCBTY2hlbWFzPC9oND4KLQotPHA+VGhlIHBsdWctaW4gaXMgYWNjb21wYW5pZWQgYnkgZml2ZSBzY2hlbWEgZmlsZXMuIFlvdXIgdXNlIG9mIHRoZQotZm9sbG93aW5nIGZpbGVzIGxvY2F0ZWQgaW4gdGhlIHhzZCBkaXJlY3Rvcnkgb2YgdGhlIHBsdWctaW46PC9wPgotCi08dWw+Ci0JPGxpPjxzdHJvbmc+aHR0cC54c2Q8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLzwvYT48L2xpPgotCTxsaT48c3Ryb25nPnNvYXAueHNkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC88L2E+PC9saT4KLQk8bGk+PHN0cm9uZz53c2RsLnhzZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC88L2E+PC9saT4KLQk8bGk+PHN0cm9uZz53c2RsLW1pbmUueHNkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS88L2E+PC9saT4KLTwvdWw+Ci0KLTxwPmlzIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgJnF1b3Q7TGljZW5zZSBmb3IKLVdTREwgU2NoZW1hIEZpbGVzJnF1b3Q7IGEgY29weSB3aGljaCBpcyBsb2NhdGVkIGluIDxhCi0JaHJlZj0iYWJvdXRfZmlsZXMvd3NkbC1zY2hlbWEtZmlsZXMtbGljZW5zZS50eHQiPmFib3V0X2ZpbGVzL3dzZGwtc2NoZW1hLWZpbGVzLWxpY2Vuc2UudHh0PC9hPi48L3A+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgZmlsZSBsb2NhdGVkIGluIHRoZSB4c2QgZGlyZWN0b3J5IG9mIHRoZSBwbHVnLWluOgotPHA+Ci08dWw+Ci0JPGxpPjxzdHJvbmc+c29hcC1lbmMueHNkPC9zdHJvbmc+Ci08L3VsPgotCi08cD5pcyBnb3Zlcm5lZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIFczQyBTb2Z0d2FyZQotTGljZW5zZSBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA1LjEwIG9mIHRoZSBGQVEgbG9jYXRlZCBhdCA8YQotCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS0yMDAwMDYyMC5odG1sI0RURCIKLQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLTIwMDAwNjIwLmh0bWwjRFREPC9hPi4KLUEgY29weSBvZiB0aGUgVzNDIFNvZnR3YXJlIExpY2Vuc2UgaXMgbG9jYXRlZCBpbiA8YQotCWhyZWY9ImFib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMC5odG0iPmFib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMC5odG08L2E+Ci1hbmQgaXMgYWxzbyBhdmFpbAotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwLmh0bSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyYWM3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Ci0KLQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIj4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwX2ZpbGVzL2Jhc2UuY3NzIj48dGl0bGU+VzNDIElQUiBTT0ZUV0FSRSBOT1RJQ0U8L3RpdGxlPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIiB0ZXh0PSIjMDAwMDAwIj4KLTxoMT5XM0M8c3VwPq48L3N1cD4gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFPC9oMT4KLQotPGgzPkNvcHlyaWdodCCpIDE5OTQtMjAwMiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8iPldvcmxkCi1XaWRlIFdlYiBDb25zb3J0aXVtPC9hPiwgKDxhIGhyZWY9Imh0dHA6Ly93d3cubGNzLm1pdC5lZHUvIj5NYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZgotVGVjaG5vbG9neTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5yaWEuZnIvIj5JbnN0aXR1dCBOYXRpb25hbCBkZQotUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cua2Vpby5hYy5qcC8iPktlaW8gVW5pdmVyc2l0eTwvYT4pLiBBbGwgUmlnaHRzCi1SZXNlcnZlZC4gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC88L2gzPgotCi08cD5UaGlzIFczQyB3b3JrIChpbmNsdWRpbmcgc29mdHdhcmUsIGRvY3VtZW50cywgb3Igb3RoZXIgcmVsYXRlZAotaXRlbXMpIGlzIGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyB1bmRlciB0aGUKLWZvbGxvd2luZyBsaWNlbnNlLiBCeSBvYnRhaW5pbmcsIHVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywKLXlvdSAodGhlIGxpY2Vuc2VlKSBhZ3JlZSB0aGF0IHlvdSBoYXZlIHJlYWQsIHVuZGVyc3Rvb2QsIGFuZCB3aWxsCi1jb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOjwvcD4KLQotPHA+UGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQotYW5kIGl0cyBkb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCZuYnNwOyBmb3IgYW55Ci1wdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0Ci15b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZAotZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucywgdGhhdAoteW91IG1ha2U6PC9wPgotCi08b2w+Ci08bGk+VGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mCi10aGUgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIHdvcmsuPC9saT4KLQotPGxpPkFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvcgotdGVybXMgYW5kIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIGEgc2hvcnQgbm90aWNlIG9mIHRoZQotZm9sbG93aW5nIGZvcm0gKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSBzaG91bGQKLWJlIHVzZWQgd2l0aGluIHRoZSBib2R5IG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZToKLSJDb3B5cmlnaHQgqSBbJGRhdGUtb2Ytc29mdHdhcmVdIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+V29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bTwvYT4sICg8YSBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1LyI+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKLVRlY2hub2xvZ3k8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmlucmlhLmZyLyI+SW5zdGl0dXQgTmF0aW9uYWwgZGUKLVJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmtlaW8uYWMuanAvIj5LZWlvIFVuaXZlcnNpdHk8L2E+KS4gQWxsIFJpZ2h0cwotUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIjwvbGk+Ci0KLTxsaT5Ob3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgVzNDIGZpbGVzLAotaW5jbHVkaW5nIHRoZSBkYXRlIGNoYW5nZXMgd2VyZSBtYWRlLiAoV2UgcmVjb21tZW5kIHlvdSBwcm92aWRlCi1VUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKTwvbGk+Ci08L29sPgotCi08cD5USElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORAotQ09QWVJJR0hUIEhPTERFUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgVEhBVCBUSEUKLVVTRSBPRiBUSEUgU09GVFdBUkUgT1IgRE9DVU1FTlRBVElPTiBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgVEhJUkQKLVBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLjwvcD4KLQotPHA+Q09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLVNQRUNJQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFCi1TT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OLjwvcD4KLQotPHA+VGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgY29weXJpZ2h0IGhvbGRlcnMgbWF5IE5PVCBiZSB1c2VkIGluCi1hZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dAotc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGl0bGUgdG8gY29weXJpZ2h0IGluIHRoaXMKLXNvZnR3YXJlIGFuZCBhbnkgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYXQgYWxsIHRpbWVzIHJlbWFpbgotd2l0aCBjb3B5cmlnaHQgaG9sZGVycy48L3A+Ci0KLTxwPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXzwvcD4KLQotPHA+VGhpcyBmb3JtdWxhdGlvbiBvZiBXM0MncyBub3RpY2UgYW5kIGxpY2Vuc2UgYmVjYW1lIGFjdGl2ZSBvbgotQXVndXN0IDE0IDE5OTggc28gYXMgdG8gaW1wcm92ZSBjb21wYXRpYmlsaXR5IHdpdGggR1BMLiBUaGlzCi12ZXJzaW9uIGVuc3VyZXMgdGhhdCBXM0Mgc29mdHdhcmUgbGljZW5zaW5nIHRlcm1zIGFyZSBubyBtb3JlCi1yZXN0cmljdGl2ZSB0aGFuIEdQTCBhbmQgY29uc2VxdWVudGx5IFczQyBzb2Z0d2FyZSBtYXkgYmUKLWRpc3RyaWJ1dGVkIGluIEdQTCBwYWNrYWdlcy4gU2VlIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDUxOS5odG1sIj5vbGRlciBmb3JtdWxhdGlvbjwvYT4gZm9yCi10aGUgcG9saWN5IHByaW9yIHRvIHRoaXMgZGF0ZS4gUGxlYXNlIHNlZSBvdXIgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLmh0bWwiPkNvcHlyaWdodCBGQVE8L2E+IGZvciBjb21tb24gcXVlc3Rpb25zIGFib3V0Ci11c2luZyBtYXRlcmlhbHMgZnJvbSBvdXIgc2l0ZSwgaW5jbHVkaW5nIHNwZWNpZmljIHRlcm1zIGFuZAotY29uZGl0aW9ucyBmb3IgcGFja2FnZXMgbGlrZSBsaWJ3d3csIEFtYXlhLCBhbmQgSmlnc2F3LiBPdGhlcgotcXVlc3Rpb25zIGFib3V0IHRoaXMgbm90aWNlIGNhbiBiZSBkaXJlY3RlZCB0byA8YSBocmVmPSJtYWlsdG86c2l0ZS1wb2xpY3lAdzMub3JnIj5zaXRlLXBvbGljeUB3My5vcmc8L2E+Ljxicj4KLSZuYnNwOzwvcD4KLQotPHA+Jm5ic3A7PC9wPgotCi08YWRkcmVzcz48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9IZWxwL1dlYm1hc3Rlci5odG1sIj53ZWJtYXN0ZXI8L2E+PGJyPgotIChsYXN0IHVwZGF0ZWQgJERhdGU6IDIwMDcvMDUvMTUgMDI6NDI6MjQgJCk8L2FkZHJlc3M+Ci0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjBfZmlsZXMvYmFzZS5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMF9maWxlcy9iYXNlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1N2FjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMF9maWxlcy9iYXNlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qIENvcHlyaWdodCAxOTk3LTIwMDMgVzNDIChNSVQsIEVSQ0lNLCBLZWlvKS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgIFRoZSBmb2xsb3dpbmcgc29mdHdhcmUgbGljZW5zaW5nIHJ1bGVzIGFwcGx5OgotICAgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUgKi8KLQotLyogJElkOiBiYXNlLmNzcyx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjI0IGRhdmlkX3dpbGxpYW1zIEV4cCAkICovCi0KLS8qIHRoaXMgc3R5bGUgc2hlZXQgZGVmaW5lcyB0aGUgYmFzaWMgc3R5bGUgZm9yIGFsbCBXM0MgcGFnZXMgKi8KLS8qIHlvdSBjYW4gcG9pbnQgdG8gdGhpcyBieSBhZGRpbmc6Ci0KLSAgICAgPExJTksgcmVsPSJTdHlsZXNoZWV0IiBocmVmPSIvU3R5bGVTaGVldHMvYmFzZSI+Ci0KLQotICAgaW4gdGhlIEhFQUQgb2YgeW91ciBIVE1MIGRvY3VtZW50ICovCi0KLWJvZHkgewotICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLSAgY29sb3I6IGJsYWNrOwotICBiYWNrZ3JvdW5kOiB3aGl0ZTsKLX0KLQotYTpsaW5rLCBhOmFjdGl2ZSB7Ci0gIGNvbG9yOiAjMDBlOwotICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKLX0KLQotYTp2aXNpdGVkIHsKLSAgY29sb3I6ICM1Mjk7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwotfQotCi1kaXYuaW50cm8gewotICBtYXJnaW4tbGVmdDogNSU7Ci0gIG1hcmdpbi1yaWdodDogNSU7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi1wcmUgewotICBmb250LWZhbWlseTogbW9ub3NwYWNlCi19Ci0KLWE6bGluayBpbWcsIGE6dmlzaXRlZCBpbWcgewotICAgYm9yZGVyLXN0eWxlOiBub25lCi19Ci0KLWEgaW1nIHsgY29sb3I6IHdoaXRlOyB9ICAgICAgICAvKiBoaWRlIHRoZSBib3JkZXIgaW4gTmV0c2NhcGUgNCAqLwotQG1lZGlhIGFsbCB7ICAgICAgICAgICAgICAgICAgIC8qIGhpZGUgZnJvbSBOZXRzY2FwZSA0ICovCi0gIGEgaW1nIHsgY29sb3I6IGluaGVyaXQ7IH0gICAgLyogdW5kbyB0aGUgcnVsZSBhYm92ZSAqLwotfQotCi11bC50b2MsIG9sLnRvYyB7Ci0gIGxpc3Qtc3R5bGU6IGRpc2M7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci19Ci0KLWRpdi5pc3N1ZSB7Ci0gIHBhZGRpbmc6IDAuNWVtOwotICBib3JkZXI6IG5vbmU7Ci0gIG1hcmdpbi1yaWdodDogNSU7Ci19Ci0KLS5oaWRlbWUgeyBkaXNwbGF5OiBub25lIH0KLQotQG1lZGlhIHByaW50IHsKLQotICB0YWJsZSB7Ci0gICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkCi0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvd3NkbC1zY2hlbWEtZmlsZXMtbGljZW5zZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL3dzZGwtc2NoZW1hLWZpbGVzLWxpY2Vuc2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTVmODFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvd3NkbC1zY2hlbWEtZmlsZXMtbGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1Db3B5cmlnaHQgMjAwMSAtIDIwMDUsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgotQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1MaWNlbnNlIGZvciBXU0RMIFNjaGVtYSBGaWxlcwotCi1UaGUgQXV0aG9ycyBncmFudCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFdTREwgU2NoZW1hIAotRmlsZXMgaW4gYW55IG1lZGl1bSB3aXRob3V0IGZlZSBvciByb3lhbHR5IGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgYW5kIAotbGljZW5zZSBhcmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGVtLiAgVGhlIG9yaWdpbmFscyBvZiB0aGVzZSBmaWxlcyBjYW4gCi1iZSBsb2NhdGVkIGF0OgotCi0gICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLwotICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8KLSAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLwotICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8KLSAgICAKLQotVEhFU0UgU0NIRU1BIEZJTEVTIEFSRSBQUk9WSURFRCAiQVMgSVMsIiBBTkQgVEhFIEFVVEhPUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgCi1PUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFJFR0FSRElORyBUSEVTRSBGSUxFUywgSU5DTFVESU5HLCBCVVQgTk9UIAotTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCAKLU5PTi1JTkZSSU5HRU1FTlQgT1IgVElUTEUuICBUSEUgQVVUSE9SUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIAotSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIAotUkVMQVRJTkcgVE8gQU5ZIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFU0UgRklMRVMuCi0KLVRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIHRoZSBBdXRob3JzIG1heSBOT1QgYmUgdXNlZCBpbiBhbnkgbWFubmVyLCAKLWluY2x1ZGluZyBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGVzZSBmaWxlcyBvciBhbnkgcHJvZ3JhbSAKLW9yIHNlcnZpY2UgdGhhdCB1c2VzIHRoZXNlIGZpbGVzLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaXRsZSB0byBjb3B5cmlnaHQgCi1pbiB0aGVzZSBmaWxlcyB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCB0aGUgQXV0aG9ycy4KLQotTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTk2ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBkdGRzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8sXAotICAgICAgICAgICAgICAgeHNkLwotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHhzZC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBkdGRzLyxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9IVE1MbGF0MS5lbnQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvSFRNTGxhdDEuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ0NDg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9IVE1MbGF0MS5lbnQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxLy9FTi8vSFRNTCI+Ci0gICAgICVIVE1MbGF0MTsKLS0tPgotCi08IUVOVElUWSBuYnNwICAgQ0RBVEEgIiYjMTYwOyIgLS0gbm8tYnJlYWsgc3BhY2UgPSBub24tYnJlYWtpbmcgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEEwIElTT251bSAtLT4KLTwhRU5USVRZIGlleGNsICBDREFUQSAiJiMxNjE7IiAtLSBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrLCBVKzAwQTEgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VudCAgIENEQVRBICImIzE2MjsiIC0tIGNlbnQgc2lnbiwgVSswMEEyIElTT251bSAtLT4KLTwhRU5USVRZIHBvdW5kICBDREFUQSAiJiMxNjM7IiAtLSBwb3VuZCBzaWduLCBVKzAwQTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgY3VycmVuIENEQVRBICImIzE2NDsiIC0tIGN1cnJlbmN5IHNpZ24sIFUrMDBBNCBJU09udW0gLS0+Ci08IUVOVElUWSB5ZW4gICAgQ0RBVEEgIiYjMTY1OyIgLS0geWVuIHNpZ24gPSB5dWFuIHNpZ24sIFUrMDBBNSBJU09udW0gLS0+Ci08IUVOVElUWSBicnZiYXIgQ0RBVEEgIiYjMTY2OyIgLS0gYnJva2VuIGJhciA9IGJyb2tlbiB2ZXJ0aWNhbCBiYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEE2IElTT251bSAtLT4KLTwhRU5USVRZIHNlY3QgICBDREFUQSAiJiMxNjc7IiAtLSBzZWN0aW9uIHNpZ24sIFUrMDBBNyBJU09udW0gLS0+Ci08IUVOVElUWSB1bWwgICAgQ0RBVEEgIiYjMTY4OyIgLS0gZGlhZXJlc2lzID0gc3BhY2luZyBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEE4IElTT2RpYSAtLT4KLTwhRU5USVRZIGNvcHkgICBDREFUQSAiJiMxNjk7IiAtLSBjb3B5cmlnaHQgc2lnbiwgVSswMEE5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZGYgICBDREFUQSAiJiMxNzA7IiAtLSBmZW1pbmluZSBvcmRpbmFsIGluZGljYXRvciwgVSswMEFBIElTT251bSAtLT4KLTwhRU5USVRZIGxhcXVvICBDREFUQSAiJiMxNzE7IiAtLSBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGVmdCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBBQiBJU09udW0gLS0+Ci08IUVOVElUWSBub3QgICAgQ0RBVEEgIiYjMTcyOyIgLS0gbm90IHNpZ24sIFUrMDBBQyBJU09udW0gLS0+Ci08IUVOVElUWSBzaHkgICAgQ0RBVEEgIiYjMTczOyIgLS0gc29mdCBoeXBoZW4gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmVnICAgIENEQVRBICImIzE3NDsiIC0tIHJlZ2lzdGVyZWQgc2lnbiA9IHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRSBJU09udW0gLS0+Ci08IUVOVElUWSBtYWNyICAgQ0RBVEEgIiYjMTc1OyIgLS0gbWFjcm9uID0gc3BhY2luZyBtYWNyb24gPSBvdmVybGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVBMIG92ZXJiYXIsIFUrMDBBRiBJU09kaWEgLS0+Ci08IUVOVElUWSBkZWcgICAgQ0RBVEEgIiYjMTc2OyIgLS0gZGVncmVlIHNpZ24sIFUrMDBCMCBJU09udW0gLS0+Ci08IUVOVElUWSBwbHVzbW4gQ0RBVEEgIiYjMTc3OyIgLS0gcGx1cy1taW51cyBzaWduID0gcGx1cy1vci1taW51cyBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCMSBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAyICAgQ0RBVEEgIiYjMTc4OyIgLS0gc3VwZXJzY3JpcHQgdHdvID0gc3VwZXJzY3JpcHQgZGlnaXQgdHdvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzcXVhcmVkLCBVKzAwQjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMyAgIENEQVRBICImIzE3OTsiIC0tIHN1cGVyc2NyaXB0IHRocmVlID0gc3VwZXJzY3JpcHQgZGlnaXQgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGN1YmVkLCBVKzAwQjMgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWN1dGUgIENEQVRBICImIzE4MDsiIC0tIGFjdXRlIGFjY2VudCA9IHNwYWNpbmcgYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI0IElTT2RpYSAtLT4KLTwhRU5USVRZIG1pY3JvICBDREFUQSAiJiMxODE7IiAtLSBtaWNybyBzaWduLCBVKzAwQjUgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGFyYSAgIENEQVRBICImIzE4MjsiIC0tIHBpbGNyb3cgc2lnbiA9IHBhcmFncmFwaCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNiBJU09udW0gLS0+Ci08IUVOVElUWSBtaWRkb3QgQ0RBVEEgIiYjMTgzOyIgLS0gbWlkZGxlIGRvdCA9IEdlb3JnaWFuIGNvbW1hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBHcmVlayBtaWRkbGUgZG90LCBVKzAwQjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VkaWwgIENEQVRBICImIzE4NDsiIC0tIGNlZGlsbGEgPSBzcGFjaW5nIGNlZGlsbGEsIFUrMDBCOCBJU09kaWEgLS0+Ci08IUVOVElUWSBzdXAxICAgQ0RBVEEgIiYjMTg1OyIgLS0gc3VwZXJzY3JpcHQgb25lID0gc3VwZXJzY3JpcHQgZGlnaXQgb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRtICAgQ0RBVEEgIiYjMTg2OyIgLS0gbWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCQSBJU09udW0gLS0+Ci08IUVOVElUWSByYXF1byAgQ0RBVEEgIiYjMTg3OyIgLS0gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByaWdodCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBCQiBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTQgQ0RBVEEgIiYjMTg4OyIgLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgcXVhcnRlciwgVSswMEJDIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxMiBDREFUQSAiJiMxODk7IiAtLSB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBoYWxmLCBVKzAwQkQgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzM0IENEQVRBICImIzE5MDsiIC0tIHZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMsIFUrMDBCRSBJU09udW0gLS0+Ci08IUVOVElUWSBpcXVlc3QgQ0RBVEEgIiYjMTkxOyIgLS0gaW52ZXJ0ZWQgcXVlc3Rpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHVybmVkIHF1ZXN0aW9uIG1hcmssIFUrMDBCRiBJU09udW0gLS0+Ci08IUVOVElUWSBBZ3JhdmUgQ0RBVEEgIiYjMTkyOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWFjdXRlIENEQVRBICImIzE5MzsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFjaXJjICBDREFUQSAiJiMxOTQ7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF0aWxkZSBDREFUQSAiJiMxOTU7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdW1sICAgQ0RBVEEgIiYjMTk2OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFyaW5nICBDREFUQSAiJiMxOTc7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQUVsaWcgIENEQVRBICImIzE5ODsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEFFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIEFFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQ2NlZGlsIENEQVRBICImIzE5OTsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWdyYXZlIENEQVRBICImIzIwMDsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzggSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVhY3V0ZSBDREFUQSAiJiMyMDE7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFY2lyYyAgQ0RBVEEgIiYjMjAyOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFdW1sICAgQ0RBVEEgIiYjMjAzOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0IgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElncmF2ZSBDREFUQSAiJiMyMDQ7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJYWN1dGUgQ0RBVEEgIiYjMjA1OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWNpcmMgIENEQVRBICImIzIwNjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgSXVtbCAgIENEQVRBICImIzIwNzsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFVEggICAgQ0RBVEEgIiYjMjA4OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRVRILCBVKzAwRDAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE50aWxkZSBDREFUQSAiJiMyMDk7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBOIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPZ3JhdmUgQ0RBVEEgIiYjMjEwOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2FjdXRlIENEQVRBICImIzIxMTsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9jaXJjICBDREFUQSAiJiMyMTI7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE90aWxkZSBDREFUQSAiJiMyMTM7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdW1sICAgQ0RBVEEgIiYjMjE0OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRpbWVzICBDREFUQSAiJiMyMTU7IiAtLSBtdWx0aXBsaWNhdGlvbiBzaWduLCBVKzAwRDcgSVNPbnVtIC0tPgotPCFFTlRJVFkgT3NsYXNoIENEQVRBICImIzIxNjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBzdHJva2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVZ3JhdmUgQ0RBVEEgIiYjMjE3OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWFjdXRlIENEQVRBICImIzIxODsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVjaXJjICBDREFUQSAiJiMyMTk7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFV1bWwgICBDREFUQSAiJiMyMjA7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgWWFjdXRlIENEQVRBICImIzIyMTsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFRIT1JOICBDREFUQSAiJiMyMjI7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBUSE9STiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHN6bGlnICBDREFUQSAiJiMyMjM7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgc2hhcnAgcyA9IGVzcy16ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZ3JhdmUgQ0RBVEEgIiYjMjI0OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhYWN1dGUgQ0RBVEEgIiYjMjI1OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFjaXJjICBDREFUQSAiJiMyMjY7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdGlsZGUgQ0RBVEEgIiYjMjI3OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF1bWwgICBDREFUQSAiJiMyMjg7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFyaW5nICBDREFUQSAiJiMyMjk7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZWxpZyAgQ0RBVEEgIiYjMjMwOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGFlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBhZSwgVSswMEU2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBjY2VkaWwgQ0RBVEEgIiYjMjMxOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWdyYXZlIENEQVRBICImIzIzMjsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlYWN1dGUgQ0RBVEEgIiYjMjMzOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVjaXJjICBDREFUQSAiJiMyMzQ7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldW1sICAgQ0RBVEEgIiYjMjM1OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpZ3JhdmUgQ0RBVEEgIiYjMjM2OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlhY3V0ZSBDREFUQSAiJiMyMzc7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWNpcmMgIENEQVRBICImIzIzODsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGl1bWwgICBDREFUQSAiJiMyMzk7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV0aCAgICBDREFUQSAiJiMyNDA7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZXRoLCBVKzAwRjAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG50aWxkZSBDREFUQSAiJiMyNDE7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2dyYXZlIENEQVRBICImIzI0MjsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvYWN1dGUgQ0RBVEEgIiYjMjQzOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9jaXJjICBDREFUQSAiJiMyNDQ7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdGlsZGUgQ0RBVEEgIiYjMjQ1OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG91bWwgICBDREFUQSAiJiMyNDY7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGRpdmlkZSBDREFUQSAiJiMyNDc7IiAtLSBkaXZpc2lvbiBzaWduLCBVKzAwRjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3NsYXNoIENEQVRBICImIzI0ODsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggc3Ryb2tlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIG8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY4IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Z3JhdmUgQ0RBVEEgIiYjMjQ5OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVhY3V0ZSBDREFUQSAiJiMyNTA7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWNpcmMgIENEQVRBICImIzI1MTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHV1bWwgICBDREFUQSAiJiMyNTI7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHlhY3V0ZSBDREFUQSAiJiMyNTM7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGhvcm4gIENEQVRBICImIzI1NDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciB0aG9ybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHl1bWwgICBDREFUQSAiJiMyNTU7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkYgSVNPbGF0MSAtLT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvSFRNTHNwZWNpYWwuZW50IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL0hUTUxzcGVjaWFsLmVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNWM2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvSFRNTHNwZWNpYWwuZW50CisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPCEtLSBTcGVjaWFsIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsLy9FTi8vSFRNTCI+Ci0gICAgICVIVE1Mc3BlY2lhbDsgLS0+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgbGlzdCkgZG8gbm90IGNsYXNoIHdpdGggYW55Ci0gICAgIGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IGNoYXJhY3RlciBudW1iZXJzCi0gICAgIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gQ0RBVEEgdmFsdWVzIGFyZSBkZWNpbWFsCi0gICAgIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUgZG9jdW1lbnQKLSAgICAgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIElTTyAxMDY0NiBuYW1lcy4gCi0KLS0tPgotCi08IS0tIEMwIENvbnRyb2xzIGFuZCBCYXNpYyBMYXRpbiAtLT4KLTwhRU5USVRZIHF1b3QgICAgQ0RBVEEgIiYjMzQ7IiAgIC0tIHF1b3RhdGlvbiBtYXJrID0gQVBMIHF1b3RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMDIyIElTT251bSAtLT4KLTwhRU5USVRZIGFtcCAgICAgQ0RBVEEgIiYjMzg7IiAgIC0tIGFtcGVyc2FuZCwgVSswMDI2IElTT251bSAtLT4KLTwhRU5USVRZIGx0ICAgICAgQ0RBVEEgIiYjNjA7IiAgIC0tIGxlc3MtdGhhbiBzaWduLCBVKzAwM0MgSVNPbnVtIC0tPgotPCFFTlRJVFkgZ3QgICAgICBDREFUQSAiJiM2MjsiICAgLS0gZ3JlYXRlci10aGFuIHNpZ24sIFUrMDAzRSBJU09udW0gLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQSAtLT4KLTwhRU5USVRZIE9FbGlnICAgQ0RBVEEgIiYjMzM4OyIgIC0tIGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgT0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNTIgSVNPbGF0MiAtLT4KLTwhRU5USVRZIG9lbGlnICAgQ0RBVEEgIiYjMzM5OyIgIC0tIGxhdGluIHNtYWxsIGxpZ2F0dXJlIG9lLCBVKzAxNTMgSVNPbGF0MiAtLT4KLTwhLS0gbGlnYXR1cmUgaXMgYSBtaXNub21lciwgdGhpcyBpcyBhIHNlcGFyYXRlIGNoYXJhY3RlciBpbiBzb21lIGxhbmd1YWdlcyAtLT4KLTwhRU5USVRZIFNjYXJvbiAgQ0RBVEEgIiYjMzUyOyIgIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFMgd2l0aCBjYXJvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE2MCBJU09sYXQyIC0tPgotPCFFTlRJVFkgc2Nhcm9uICBDREFUQSAiJiMzNTM7IiAgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHMgd2l0aCBjYXJvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE2MSBJU09sYXQyIC0tPgotPCFFTlRJVFkgWXVtbCAgICBDREFUQSAiJiMzNzY7IiAgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE3OCBJU09sYXQyIC0tPgotCi08IS0tIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyAtLT4KLTwhRU5USVRZIGNpcmMgICAgQ0RBVEEgIiYjNzEwOyIgIC0tIG1vZGlmaWVyIGxldHRlciBjaXJjdW1mbGV4IGFjY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDJDNiBJU09wdWIgLS0+Ci08IUVOVElUWSB0aWxkZSAgIENEQVRBICImIzczMjsiICAtLSBzbWFsbCB0aWxkZSwgVSswMkRDIElTT2RpYSAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgZW5zcCAgICBDREFUQSAiJiM4MTk0OyIgLS0gZW4gc3BhY2UsIFUrMjAwMiBJU09wdWIgLS0+Ci08IUVOVElUWSBlbXNwICAgIENEQVRBICImIzgxOTU7IiAtLSBlbSBzcGFjZSwgVSsyMDAzIElTT3B1YiAtLT4KLTwhRU5USVRZIHRoaW5zcCAgQ0RBVEEgIiYjODIwMTsiIC0tIHRoaW4gc3BhY2UsIFUrMjAwOSBJU09wdWIgLS0+Ci08IUVOVElUWSB6d25qICAgIENEQVRBICImIzgyMDQ7IiAtLSB6ZXJvIHdpZHRoIG5vbi1qb2luZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMEMgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgendqICAgICBDREFUQSAiJiM4MjA1OyIgLS0gemVybyB3aWR0aCBqb2luZXIsIFUrMjAwRCBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBscm0gICAgIENEQVRBICImIzgyMDY7IiAtLSBsZWZ0LXRvLXJpZ2h0IG1hcmssIFUrMjAwRSBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBybG0gICAgIENEQVRBICImIzgyMDc7IiAtLSByaWdodC10by1sZWZ0IG1hcmssIFUrMjAwRiBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBuZGFzaCAgIENEQVRBICImIzgyMTE7IiAtLSBlbiBkYXNoLCBVKzIwMTMgSVNPcHViIC0tPgotPCFFTlRJVFkgbWRhc2ggICBDREFUQSAiJiM4MjEyOyIgLS0gZW0gZGFzaCwgVSsyMDE0IElTT3B1YiAtLT4KLTwhRU5USVRZIGxzcXVvICAgQ0RBVEEgIiYjODIxNjsiIC0tIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDE4IElTT251bSAtLT4KLTwhRU5USVRZIHJzcXVvICAgQ0RBVEEgIiYjODIxNzsiIC0tIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOSBJU09udW0gLS0+Ci08IUVOVElUWSBzYnF1byAgIENEQVRBICImIzgyMTg7IiAtLSBzaW5nbGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxQSBORVcgLS0+Ci08IUVOVElUWSBsZHF1byAgIENEQVRBICImIzgyMjA7IiAtLSBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxQyBJU09udW0gLS0+Ci08IUVOVElUWSByZHF1byAgIENEQVRBICImIzgyMjE7IiAtLSByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgYmRxdW8gICBDREFUQSAiJiM4MjIyOyIgLS0gZG91YmxlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUUgTkVXIC0tPgotPCFFTlRJVFkgZGFnZ2VyICBDREFUQSAiJiM4MjI0OyIgLS0gZGFnZ2VyLCBVKzIwMjAgSVNPcHViIC0tPgotPCFFTlRJVFkgRGFnZ2VyICBDREFUQSAiJiM4MjI1OyIgLS0gZG91YmxlIGRhZ2dlciwgVSsyMDIxIElTT3B1YiAtLT4KLTwhRU5USVRZIHBlcm1pbCAgQ0RBVEEgIiYjODI0MDsiIC0tIHBlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxzYXF1byAgQ0RBVEEgIiYjODI0OTsiIC0tIHNpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDM5IElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gbHNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSByc2FxdW8gIENEQVRBICImIzgyNTA7IiAtLSBzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0EgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSByc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIGV1cm8gICBDREFUQSAiJiM4MzY0OyIgIC0tIGV1cm8gc2lnbiwgVSsyMEFDIE5FVyAtLT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvSFRNTHN5bWJvbC5lbnQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvSFRNTHN5bWJvbC5lbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNGJmZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL0hUTUxzeW1ib2wuZW50CisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLTwhLS0gTWF0aGVtYXRpY2FsLCBHcmVlayBhbmQgU3ltYm9saWMgY2hhcmFjdGVycyBmb3IgSFRNTCAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scy8vRU4vL0hUTUwiPgotICAgICAlSFRNTHN5bWJvbDsgLS0+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgbGlzdCkgZG8gbm90IGNsYXNoIHdpdGggYW55Ci0gICAgIGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IGNoYXJhY3RlciBudW1iZXJzCi0gICAgIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gQ0RBVEEgdmFsdWVzIGFyZSBkZWNpbWFsCi0gICAgIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUgZG9jdW1lbnQKLSAgICAgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIElTTyAxMDY0NiBuYW1lcy4gCi0KLS0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUIgLS0+Ci08IUVOVElUWSBmbm9mICAgICBDREFUQSAiJiM0MDI7IiAtLSBsYXRpbiBzbWFsbCBmIHdpdGggaG9vayA9IGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZsb3JpbiwgVSswMTkyIElTT3RlY2ggLS0+Ci0KLTwhLS0gR3JlZWsgLS0+Ci08IUVOVElUWSBBbHBoYSAgICBDREFUQSAiJiM5MTM7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBhbHBoYSwgVSswMzkxIC0tPgotPCFFTlRJVFkgQmV0YSAgICAgQ0RBVEEgIiYjOTE0OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYmV0YSwgVSswMzkyIC0tPgotPCFFTlRJVFkgR2FtbWEgICAgQ0RBVEEgIiYjOTE1OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZ2FtbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIERlbHRhICAgIENEQVRBICImIzkxNjsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzk0IElTT2dyazMgLS0+Ci08IUVOVElUWSBFcHNpbG9uICBDREFUQSAiJiM5MTc7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBlcHNpbG9uLCBVKzAzOTUgLS0+Ci08IUVOVElUWSBaZXRhICAgICBDREFUQSAiJiM5MTg7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB6ZXRhLCBVKzAzOTYgLS0+Ci08IUVOVElUWSBFdGEgICAgICBDREFUQSAiJiM5MTk7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBldGEsIFUrMDM5NyAtLT4KLTwhRU5USVRZIFRoZXRhICAgIENEQVRBICImIzkyMDsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRoZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzk4IElTT2dyazMgLS0+Ci08IUVOVElUWSBJb3RhICAgICBDREFUQSAiJiM5MjE7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBpb3RhLCBVKzAzOTkgLS0+Ci08IUVOVElUWSBLYXBwYSAgICBDREFUQSAiJiM5MjI7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBrYXBwYSwgVSswMzlBIC0tPgotPCFFTlRJVFkgTGFtYmRhICAgQ0RBVEEgIiYjOTIzOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzlCIElTT2dyazMgLS0+Ci08IUVOVElUWSBNdSAgICAgICBDREFUQSAiJiM5MjQ7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBtdSwgVSswMzlDIC0tPgotPCFFTlRJVFkgTnUgICAgICAgQ0RBVEEgIiYjOTI1OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbnUsIFUrMDM5RCAtLT4KLTwhRU5USVRZIFhpICAgICAgIENEQVRBICImIzkyNjsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHhpLCBVKzAzOUUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9taWNyb24gIENEQVRBICImIzkyNzsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9taWNyb24sIFUrMDM5RiAtLT4KLTwhRU5USVRZIFBpICAgICAgIENEQVRBICImIzkyODsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBpLCBVKzAzQTAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFJobyAgICAgIENEQVRBICImIzkyOTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHJobywgVSswM0ExIC0tPgotPCEtLSB0aGVyZSBpcyBubyBTaWdtYWYsIGFuZCBubyBVKzAzQTIgY2hhcmFjdGVyIGVpdGhlciAtLT4KLTwhRU5USVRZIFNpZ21hICAgIENEQVRBICImIzkzMTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0EzIElTT2dyazMgLS0+Ci08IUVOVElUWSBUYXUgICAgICBDREFUQSAiJiM5MzI7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB0YXUsIFUrMDNBNCAtLT4KLTwhRU5USVRZIFVwc2lsb24gIENEQVRBICImIzkzMzsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFBoaSAgICAgIENEQVRBICImIzkzNDsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBoaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNiBJU09ncmszIC0tPgotPCFFTlRJVFkgQ2hpICAgICAgQ0RBVEEgIiYjOTM1OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgY2hpLCBVKzAzQTcgLS0+Ci08IUVOVElUWSBQc2kgICAgICBDREFUQSAiJiM5MzY7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBwc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9tZWdhICAgIENEQVRBICImIzkzNzsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E5IElTT2dyazMgLS0+Ci0KLTwhRU5USVRZIGFscGhhICAgIENEQVRBICImIzk0NTsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMSBJU09ncmszIC0tPgotPCFFTlRJVFkgYmV0YSAgICAgQ0RBVEEgIiYjOTQ2OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGJldGEsIFUrMDNCMiBJU09ncmszIC0tPgotPCFFTlRJVFkgZ2FtbWEgICAgQ0RBVEEgIiYjOTQ3OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0IzIElTT2dyazMgLS0+Ci08IUVOVElUWSBkZWx0YSAgICBDREFUQSAiJiM5NDg7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGVwc2lsb24gIENEQVRBICImIzk0OTsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBlcHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I1IElTT2dyazMgLS0+Ci08IUVOVElUWSB6ZXRhICAgICBDREFUQSAiJiM5NTA7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgemV0YSwgVSswM0I2IElTT2dyazMgLS0+Ci08IUVOVElUWSBldGEgICAgICBDREFUQSAiJiM5NTE7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXRhLCBVKzAzQjcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhICAgIENEQVRBICImIzk1MjsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCOCBJU09ncmszIC0tPgotPCFFTlRJVFkgaW90YSAgICAgQ0RBVEEgIiYjOTUzOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGlvdGEsIFUrMDNCOSBJU09ncmszIC0tPgotPCFFTlRJVFkga2FwcGEgICAgQ0RBVEEgIiYjOTU0OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGthcHBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0JBIElTT2dyazMgLS0+Ci08IUVOVElUWSBsYW1iZGEgICBDREFUQSAiJiM5NTU7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0JCIElTT2dyazMgLS0+Ci08IUVOVElUWSBtdSAgICAgICBDREFUQSAiJiM5NTY7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgbXUsIFUrMDNCQyBJU09ncmszIC0tPgotPCFFTlRJVFkgbnUgICAgICAgQ0RBVEEgIiYjOTU3OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG51LCBVKzAzQkQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHhpICAgICAgIENEQVRBICImIzk1ODsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciB4aSwgVSswM0JFIElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWljcm9uICBDREFUQSAiJiM5NTk7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21pY3JvbiwgVSswM0JGIE5FVyAtLT4KLTwhRU5USVRZIHBpICAgICAgIENEQVRBICImIzk2MDsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBwaSwgVSswM0MwIElTT2dyazMgLS0+Ci08IUVOVElUWSByaG8gICAgICBDREFUQSAiJiM5NjE7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgcmhvLCBVKzAzQzEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hZiAgIENEQVRBICImIzk2MjsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBmaW5hbCBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMiBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWEgICAgQ0RBVEEgIiYjOTYzOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0MzIElTT2dyazMgLS0+Ci08IUVOVElUWSB0YXUgICAgICBDREFUQSAiJiM5NjQ7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGF1LCBVKzAzQzQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHVwc2lsb24gIENEQVRBICImIzk2NTsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M1IElTT2dyazMgLS0+Ci08IUVOVElUWSBwaGkgICAgICBDREFUQSAiJiM5NjY7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGhpLCBVKzAzQzYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGNoaSAgICAgIENEQVRBICImIzk2NzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBjaGksIFUrMDNDNyBJU09ncmszIC0tPgotPCFFTlRJVFkgcHNpICAgICAgQ0RBVEEgIiYjOTY4OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBzaSwgVSswM0M4IElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWVnYSAgICBDREFUQSAiJiM5Njk7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21lZ2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhc3ltIENEQVRBICImIzk3NzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzRDEgTkVXIC0tPgotPCFFTlRJVFkgdXBzaWggICAgQ0RBVEEgIiYjOTc4OyIgLS0gZ3JlZWsgdXBzaWxvbiB3aXRoIGhvb2sgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QyIE5FVyAtLT4KLTwhRU5USVRZIHBpdiAgICAgIENEQVRBICImIzk4MjsiIC0tIGdyZWVrIHBpIHN5bWJvbCwgVSswM0Q2IElTT2dyazMgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGJ1bGwgICAgIENEQVRBICImIzgyMjY7IiAtLSBidWxsZXQgPSBibGFjayBzbWFsbCBjaXJjbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDIyIElTT3B1YiAgLS0+Ci08IS0tIGJ1bGxldCBpcyBOT1QgdGhlIHNhbWUgYXMgYnVsbGV0IG9wZXJhdG9yLCBVKzIyMTkgLS0+Ci08IUVOVElUWSBoZWxsaXAgICBDREFUQSAiJiM4MjMwOyIgLS0gaG9yaXpvbnRhbCBlbGxpcHNpcyA9IHRocmVlIGRvdCBsZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDI2IElTT3B1YiAgLS0+Ci08IUVOVElUWSBwcmltZSAgICBDREFUQSAiJiM4MjQyOyIgLS0gcHJpbWUgPSBtaW51dGVzID0gZmVldCwgVSsyMDMyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBQcmltZSAgICBDREFUQSAiJiM4MjQzOyIgLS0gZG91YmxlIHByaW1lID0gc2Vjb25kcyA9IGluY2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMzMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9saW5lICAgIENEQVRBICImIzgyNTQ7IiAtLSBvdmVybGluZSA9IHNwYWNpbmcgb3ZlcnNjb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzRSBORVcgLS0+Ci08IUVOVElUWSBmcmFzbCAgICBDREFUQSAiJiM4MjYwOyIgLS0gZnJhY3Rpb24gc2xhc2gsIFUrMjA0NCBORVcgLS0+Ci0KLTwhLS0gTGV0dGVybGlrZSBTeW1ib2xzIC0tPgotPCFFTlRJVFkgd2VpZXJwICAgQ0RBVEEgIiYjODQ3MjsiIC0tIHNjcmlwdCBjYXBpdGFsIFAgPSBwb3dlciBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFdlaWVyc3RyYXNzIHAsIFUrMjExOCBJU09hbXNvIC0tPgotPCFFTlRJVFkgaW1hZ2UgICAgQ0RBVEEgIiYjODQ2NTsiIC0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgSSA9IGltYWdpbmFyeSBwYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExMSBJU09hbXNvIC0tPgotPCFFTlRJVFkgcmVhbCAgICAgQ0RBVEEgIiYjODQ3NjsiIC0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgUiA9IHJlYWwgcGFydCBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTFDIElTT2Ftc28gLS0+Ci08IUVOVElUWSB0cmFkZSAgICBDREFUQSAiJiM4NDgyOyIgLS0gdHJhZGUgbWFyayBzaWduLCBVKzIxMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWxlZnN5bSAgQ0RBVEEgIiYjODUwMTsiIC0tIGFsZWYgc3ltYm9sID0gZmlyc3QgdHJhbnNmaW5pdGUgY2FyZGluYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTM1IE5FVyAtLT4KLTwhLS0gYWxlZiBzeW1ib2wgaXMgTk9UIHRoZSBzYW1lIGFzIGhlYnJldyBsZXR0ZXIgYWxlZiwKLSAgICAgVSswNUQwIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIGNvdWxkIGJlIHVzZWQgdG8gZGVwaWN0IGJvdGggY2hhcmFjdGVycyAtLT4KLQotPCEtLSBBcnJvd3MgLS0+Ci08IUVOVElUWSBsYXJyICAgICBDREFUQSAiJiM4NTkyOyIgLS0gbGVmdHdhcmRzIGFycm93LCBVKzIxOTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgdWFyciAgICAgQ0RBVEEgIiYjODU5MzsiIC0tIHVwd2FyZHMgYXJyb3csIFUrMjE5MSBJU09udW0tLT4KLTwhRU5USVRZIHJhcnIgICAgIENEQVRBICImIzg1OTQ7IiAtLSByaWdodHdhcmRzIGFycm93LCBVKzIxOTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZGFyciAgICAgQ0RBVEEgIiYjODU5NTsiIC0tIGRvd253YXJkcyBhcnJvdywgVSsyMTkzIElTT251bSAtLT4KLTwhRU5USVRZIGhhcnIgICAgIENEQVRBICImIzg1OTY7IiAtLSBsZWZ0IHJpZ2h0IGFycm93LCBVKzIxOTQgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGNyYXJyICAgIENEQVRBICImIzg2Mjk7IiAtLSBkb3dud2FyZHMgYXJyb3cgd2l0aCBjb3JuZXIgbGVmdHdhcmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjYXJyaWFnZSByZXR1cm4sIFUrMjFCNSBORVcgLS0+Ci08IUVOVElUWSBsQXJyICAgICBDREFUQSAiJiM4NjU2OyIgLS0gbGVmdHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQwIElTT3RlY2ggLS0+Ci08IS0tIElTTyAxMDY0NiBkb2VzIG5vdCBzYXkgdGhhdCBsQXJyIGlzIHRoZSBzYW1lIGFzIHRoZSAnaXMgaW1wbGllZCBieScgYXJyb3cKLSAgICBidXQgYWxzbyBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciBjaGFyYWN0ZXIgZm9yIHRoYXQgZnVuY3Rpb24uIFNvID8gbEFyciBjYW4KLSAgICBiZSB1c2VkIGZvciAnaXMgaW1wbGllZCBieScgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIHVBcnIgICAgIENEQVRBICImIzg2NTc7IiAtLSB1cHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQxIElTT2Ftc2EgLS0+Ci08IUVOVElUWSByQXJyICAgICBDREFUQSAiJiM4NjU4OyIgLS0gcmlnaHR3YXJkcyBkb3VibGUgYXJyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMUQyIElTT3RlY2ggLS0+Ci08IS0tIElTTyAxMDY0NiBkb2VzIG5vdCBzYXkgdGhpcyBpcyB0aGUgJ2ltcGxpZXMnIGNoYXJhY3RlciBidXQgZG9lcyBub3QgaGF2ZSAKLSAgICAgYW5vdGhlciBjaGFyYWN0ZXIgd2l0aCB0aGlzIGZ1bmN0aW9uIHNvID8KLSAgICAgckFyciBjYW4gYmUgdXNlZCBmb3IgJ2ltcGxpZXMnIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSBkQXJyICAgICBDREFUQSAiJiM4NjU5OyIgLS0gZG93bndhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQzIElTT2Ftc2EgLS0+Ci08IUVOVElUWSBoQXJyICAgICBDREFUQSAiJiM4NjYwOyIgLS0gbGVmdCByaWdodCBkb3VibGUgYXJyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMUQ0IElTT2Ftc2EgLS0+Ci0KLTwhLS0gTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAtLT4KLTwhRU5USVRZIGZvcmFsbCAgIENEQVRBICImIzg3MDQ7IiAtLSBmb3IgYWxsLCBVKzIyMDAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHBhcnQgICAgIENEQVRBICImIzg3MDY7IiAtLSBwYXJ0aWFsIGRpZmZlcmVudGlhbCwgVSsyMjAyIElTT3RlY2ggIC0tPgotPCFFTlRJVFkgZXhpc3QgICAgQ0RBVEEgIiYjODcwNzsiIC0tIHRoZXJlIGV4aXN0cywgVSsyMjAzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlbXB0eSAgICBDREFUQSAiJiM4NzA5OyIgLS0gZW1wdHkgc2V0ID0gbnVsbCBzZXQgPSBkaWFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMDUgSVNPYW1zbyAtLT4KLTwhRU5USVRZIG5hYmxhICAgIENEQVRBICImIzg3MTE7IiAtLSBuYWJsYSA9IGJhY2t3YXJkIGRpZmZlcmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBpc2luICAgICBDREFUQSAiJiM4NzEyOyIgLS0gZWxlbWVudCBvZiwgVSsyMjA4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBub3RpbiAgICBDREFUQSAiJiM4NzEzOyIgLS0gbm90IGFuIGVsZW1lbnQgb2YsIFUrMjIwOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbmkgICAgICAgQ0RBVEEgIiYjODcxNTsiIC0tIGNvbnRhaW5zIGFzIG1lbWJlciwgVSsyMjBCIElTT3RlY2ggLS0+Ci08IS0tIHNob3VsZCB0aGVyZSBiZSBhIG1vcmUgbWVtb3JhYmxlIG5hbWUgdGhhbiAnbmknPyAtLT4KLTwhRU5USVRZIHByb2QgICAgIENEQVRBICImIzg3MTk7IiAtLSBuLWFyeSBwcm9kdWN0ID0gcHJvZHVjdCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwRiBJU09hbXNiIC0tPgotPCEtLSBwcm9kIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EwICdncmVlayBjYXBpdGFsIGxldHRlciBwaScgdGhvdWdoCi0gICAgIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBzdW0gICAgICBDREFUQSAiJiM4NzIxOyIgLS0gbi1hcnkgc3VtYXRpb24sIFUrMjIxMSBJU09hbXNiIC0tPgotPCEtLSBzdW0gaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTMgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hJwotICAgICB0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIG1pbnVzICAgIENEQVRBICImIzg3MjI7IiAtLSBtaW51cyBzaWduLCBVKzIyMTIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxvd2FzdCAgIENEQVRBICImIzg3Mjc7IiAtLSBhc3RlcmlzayBvcGVyYXRvciwgVSsyMjE3IElTT3RlY2ggLS0+Ci08IUVOVElUWSByYWRpYyAgICBDREFUQSAiJiM4NzMwOyIgLS0gc3F1YXJlIHJvb3QgPSByYWRpY2FsIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjFBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwcm9wICAgICBDREFUQSAiJiM4NzMzOyIgLS0gcHJvcG9ydGlvbmFsIHRvLCBVKzIyMUQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGluZmluICAgIENEQVRBICImIzg3MzQ7IiAtLSBpbmZpbml0eSwgVSsyMjFFIElTT3RlY2ggLS0+Ci08IUVOVElUWSBhbmcgICAgICBDREFUQSAiJiM4NzM2OyIgLS0gYW5nbGUsIFUrMjIyMCBJU09hbXNvIC0tPgotPCFFTlRJVFkgYW5kICAgICAgQ0RBVEEgIiYjODc0MzsiIC0tIGxvZ2ljYWwgYW5kID0gd2VkZ2UsIFUrMjIyNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3IgICAgICAgQ0RBVEEgIiYjODc0NDsiIC0tIGxvZ2ljYWwgb3IgPSB2ZWUsIFUrMjIyOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgY2FwICAgICAgQ0RBVEEgIiYjODc0NTsiIC0tIGludGVyc2VjdGlvbiA9IGNhcCwgVSsyMjI5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjdXAgICAgICBDREFUQSAiJiM4NzQ2OyIgLS0gdW5pb24gPSBjdXAsIFUrMjIyQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW50ICAgICAgQ0RBVEEgIiYjODc0NzsiIC0tIGludGVncmFsLCBVKzIyMkIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHRoZXJlNCAgIENEQVRBICImIzg3NTY7IiAtLSB0aGVyZWZvcmUsIFUrMjIzNCBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2ltICAgICAgQ0RBVEEgIiYjODc2NDsiIC0tIHRpbGRlIG9wZXJhdG9yID0gdmFyaWVzIHdpdGggPSBzaW1pbGFyIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIzQyBJU090ZWNoIC0tPgotPCEtLSB0aWxkZSBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIHRoZSB0aWxkZSwgVSswMDdFLAotICAgICBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIHRvIHJlcHJlc2VudCBib3RoICAtLT4KLTwhRU5USVRZIGNvbmcgICAgIENEQVRBICImIzg3NzM7IiAtLSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvLCBVKzIyNDUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFzeW1wICAgIENEQVRBICImIzg3NzY7IiAtLSBhbG1vc3QgZXF1YWwgdG8gPSBhc3ltcHRvdGljIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI0OCBJU09hbXNyIC0tPgotPCFFTlRJVFkgbmUgICAgICAgQ0RBVEEgIiYjODgwMDsiIC0tIG5vdCBlcXVhbCB0bywgVSsyMjYwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlcXVpdiAgICBDREFUQSAiJiM4ODAxOyIgLS0gaWRlbnRpY2FsIHRvLCBVKzIyNjEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxlICAgICAgIENEQVRBICImIzg4MDQ7IiAtLSBsZXNzLXRoYW4gb3IgZXF1YWwgdG8sIFUrMjI2NCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZ2UgICAgICAgQ0RBVEEgIiYjODgwNTsiIC0tIGdyZWF0ZXItdGhhbiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNjUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1YiAgICAgIENEQVRBICImIzg4MzQ7IiAtLSBzdWJzZXQgb2YsIFUrMjI4MiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwICAgICAgQ0RBVEEgIiYjODgzNTsiIC0tIHN1cGVyc2V0IG9mLCBVKzIyODMgSVNPdGVjaCAtLT4KLTwhLS0gbm90ZSB0aGF0IG5zdXAsICdub3QgYSBzdXBlcnNldCBvZiwgVSsyMjgzJyBpcyBub3QgY292ZXJlZCBieSB0aGUgU3ltYm9sIAotICAgICBmb250IGVuY29kaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIFNob3VsZCBpdCBiZSwgZm9yIHN5bW1ldHJ5PwotICAgICBJdCBpcyBpbiBJU09hbXNuICAtLT4gCi08IUVOVElUWSBuc3ViICAgICBDREFUQSAiJiM4ODM2OyIgLS0gbm90IGEgc3Vic2V0IG9mLCBVKzIyODQgSVNPYW1zbiAtLT4KLTwhRU5USVRZIHN1YmUgICAgIENEQVRBICImIzg4Mzg7IiAtLSBzdWJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwZSAgICAgQ0RBVEEgIiYjODgzOTsiIC0tIHN1cGVyc2V0IG9mIG9yIGVxdWFsIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI4NyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3BsdXMgICAgQ0RBVEEgIiYjODg1MzsiIC0tIGNpcmNsZWQgcGx1cyA9IGRpcmVjdCBzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjk1IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBvdGltZXMgICBDREFUQSAiJiM4ODU1OyIgLS0gY2lyY2xlZCB0aW1lcyA9IHZlY3RvciBwcm9kdWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NyBJU09hbXNiIC0tPgotPCFFTlRJVFkgcGVycCAgICAgQ0RBVEEgIiYjODg2OTsiIC0tIHVwIHRhY2sgPSBvcnRob2dvbmFsIHRvID0gcGVycGVuZGljdWxhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyQTUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNkb3QgICAgIENEQVRBICImIzg5MDE7IiAtLSBkb3Qgb3BlcmF0b3IsIFUrMjJDNSBJU09hbXNiIC0tPgotPCEtLSBkb3Qgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwQjcgbWlkZGxlIGRvdCAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCAtLT4KLTwhRU5USVRZIGxjZWlsICAgIENEQVRBICImIzg5Njg7IiAtLSBsZWZ0IGNlaWxpbmcgPSBhcGwgdXBzdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMDggSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByY2VpbCAgICBDREFUQSAiJiM4OTY5OyIgLS0gcmlnaHQgY2VpbGluZywgVSsyMzA5IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGZsb29yICAgQ0RBVEEgIiYjODk3MDsiIC0tIGxlZnQgZmxvb3IgPSBhcGwgZG93bnN0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMwQSBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJmbG9vciAgIENEQVRBICImIzg5NzE7IiAtLSByaWdodCBmbG9vciwgVSsyMzBCIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGFuZyAgICAgQ0RBVEEgIiYjOTAwMTsiIC0tIGxlZnQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGJyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMjkgSVNPdGVjaCAtLT4KLTwhLS0gbGFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzQyAnbGVzcyB0aGFuJyAKLSAgICAgb3IgVSsyMDM5ICdzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci08IUVOVElUWSByYW5nICAgICBDREFUQSAiJiM5MDAyOyIgLS0gcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGtldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMkEgSVNPdGVjaCAtLT4KLTwhLS0gcmFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzRSAnZ3JlYXRlciB0aGFuJyAKLSAgICAgb3IgVSsyMDNBICdzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotCi08IS0tIEdlb21ldHJpYyBTaGFwZXMgLS0+Ci08IUVOVElUWSBsb3ogICAgICBDREFUQSAiJiM5Njc0OyIgLS0gbG96ZW5nZSwgVSsyNUNBIElTT3B1YiAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgLS0+Ci08IUVOVElUWSBzcGFkZXMgICBDREFUQSAiJiM5ODI0OyIgLS0gYmxhY2sgc3BhZGUgc3VpdCwgVSsyNjYwIElTT3B1YiAtLT4KLTwhLS0gYmxhY2sgaGVyZSBzZWVtcyB0byBtZWFuIGZpbGxlZCBhcyBvcHBvc2VkIHRvIGhvbGxvdyAtLT4KLTwhRU5USVRZIGNsdWJzICAgIENEQVRBICImIzk4Mjc7IiAtLSBibGFjayBjbHViIHN1aXQgPSBzaGFtcm9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzI2NjMgSVNPcHViIC0tPgotPCFFTlRJVFkgaGVhcnRzICAgQ0RBVEEgIiYjOTgyOTsiIC0tIGJsYWNrIGhlYXJ0IHN1aXQgPSB2YWxlbnRpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjY1IElTT3B1YiAtLT4KLTwhRU5USVRZIGRpYW1zICAgIENEQVRBICImIzk4MzA7IiAtLSBibGFjayBkaWFtb25kIHN1aXQsIFUrMjY2NiBJU09wdWIgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL2ZyYW1lc2V0LmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9mcmFtZXNldC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDlkZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL2ZyYW1lc2V0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwhLS0KLSAgICBUaGlzIGlzIHRoZSBIVE1MIDQuMDEgRnJhbWVzZXQgRFRELCB3aGljaCBzaG91bGQgYmUKLSAgICB1c2VkIGZvciBkb2N1bWVudHMgd2l0aCBmcmFtZXMuIFRoaXMgRFREIGlzIGlkZW50aWNhbAotICAgIHRvIHRoZSBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsIERURCBleGNlcHQgZm9yIHRoZQotICAgIGNvbnRlbnQgbW9kZWwgb2YgdGhlICJIVE1MIiBlbGVtZW50OiBpbiBmcmFtZXNldCAKLSAgICBkb2N1bWVudHMsIHRoZSAiRlJBTUVTRVQiIGVsZW1lbnQgcmVwbGFjZXMgdGhlICJCT0RZIiAKLSAgICBlbGVtZW50LgotCi0gICAgICAgICAgRHJhZnQ6ICREYXRlOiAyMDA4LzA3LzIyIDA3OjM3OjAxICQKLQotICAgICAgICAgIEF1dGhvcnM6Ci0gICAgICAgICAgICAgIERhdmUgUmFnZ2V0dCA8ZHNyQHczLm9yZz4KLSAgICAgICAgICAgICAgQXJuYXVkIExlIEhvcnMgPGxlaG9yc0B3My5vcmc+Ci0gICAgICAgICAgICAgIElhbiBKYWNvYnMgPGlqQHczLm9yZz4KLQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgSFRNTCA0LjAxIGlzIGF2YWlsYWJsZSBhdDoKLQotICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQuCi0tLT4KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIgotICAtLSBUeXBpY2FsIHVzYWdlOgotCi0gICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ZyYW1lc2V0LmR0ZCI+Ci0gICAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgLi4uCi0gICAgPC9oZWFkPgotICAgIDxmcmFtZXNldD4KLSAgICAuLi4KLSAgICA8L2ZyYW1lc2V0PgotICAgIDwvaHRtbD4KLS0tPgotCi08IUVOVElUWSAlIEhUTUwuRnJhbWVzZXQgIklOQ0xVREUiPgotPCFFTlRJVFkgJSBIVE1MNC5kdGQgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci0lSFRNTDQuZHRkOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9sb29zZS5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvbG9vc2UuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFmYjQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9sb29zZS5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkzICswLDAgQEAKLTwhLS0KLSAgICBUaGlzIGlzIHRoZSBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsIERURCwgd2hpY2ggaW5jbHVkZXMKLSAgICBwcmVzZW50YXRpb24gYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgdGhhdCBXM0MgZXhwZWN0cyB0byBwaGFzZSBvdXQKLSAgICBhcyBzdXBwb3J0IGZvciBzdHlsZSBzaGVldHMgbWF0dXJlcy4gQXV0aG9ycyBzaG91bGQgdXNlIHRoZSBTdHJpY3QKLSAgICBEVEQgd2hlbiBwb3NzaWJsZSwgYnV0IG1heSB1c2UgdGhlIFRyYW5zaXRpb25hbCBEVEQgd2hlbiBzdXBwb3J0Ci0gICAgZm9yIHByZXNlbnRhdGlvbiBhdHRyaWJ1dGUgYW5kIGVsZW1lbnRzIGlzIHJlcXVpcmVkLgotCi0gICAgSFRNTCA0IGluY2x1ZGVzIG1lY2hhbmlzbXMgZm9yIHN0eWxlIHNoZWV0cywgc2NyaXB0aW5nLAotICAgIGVtYmVkZGluZyBvYmplY3RzLCBpbXByb3ZlZCBzdXBwb3J0IGZvciByaWdodCB0byBsZWZ0IGFuZCBtaXhlZAotICAgIGRpcmVjdGlvbiB0ZXh0LCBhbmQgZW5oYW5jZW1lbnRzIHRvIGZvcm1zIGZvciBpbXByb3ZlZAotICAgIGFjY2Vzc2liaWxpdHkgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcy4KLQotICAgICAgICAgIERyYWZ0OiAkRGF0ZTogMjAwOC8wNy8yMiAwNzozNzowMSAkCi0KLSAgICAgICAgICBBdXRob3JzOgotICAgICAgICAgICAgICBEYXZlIFJhZ2dldHQgPGRzckB3My5vcmc+Ci0gICAgICAgICAgICAgIEFybmF1ZCBMZSBIb3JzIDxsZWhvcnNAdzMub3JnPgotICAgICAgICAgICAgICBJYW4gSmFjb2JzIDxpakB3My5vcmc+Ci0KLSAgICBGdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IEhUTUwgNC4wMSBpcyBhdmFpbGFibGUgYXQ6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNAotCi0KLSAgICBUaGUgSFRNTCA0LjAxIHNwZWNpZmljYXRpb24gaW5jbHVkZXMgYWRkaXRpb25hbAotICAgIHN5bnRhY3RpYyBjb25zdHJhaW50cyB0aGF0IGNhbm5vdCBiZSBleHByZXNzZWQgd2l0aGluCi0gICAgdGhlIERURHMuCi0KLS0tPgotPCFFTlRJVFkgJSBIVE1MLlZlcnNpb24gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotICAtLSBUeXBpY2FsIHVzYWdlOgotCi0gICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotICAgIDxodG1sPgotICAgIDxoZWFkPgotICAgIC4uLgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAuLi4KLSAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotCi0gICAgVGhlIFVSSSB1c2VkIGFzIGEgc3lzdGVtIGlkZW50aWZpZXIgd2l0aCB0aGUgcHVibGljIGlkZW50aWZpZXIgYWxsb3dzCi0gICAgdGhlIHVzZXIgYWdlbnQgdG8gZG93bmxvYWQgdGhlIERURCBhbmQgZW50aXR5IHNldHMgYXMgbmVlZGVkLgotCi0gICAgVGhlIEZQSSBmb3IgdGhlIFN0cmljdCBIVE1MIDQuMDEgRFREIGlzOgotCi0gICAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgotCi0gICAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBzdHJpY3QgRFREIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvc3RyaWN0LmR0ZAotCi0gICAgQXV0aG9ycyBzaG91bGQgdXNlIHRoZSBTdHJpY3QgRFREIHVubGVzcyB0aGV5IG5lZWQgdGhlCi0gICAgcHJlc2VudGF0aW9uIGNvbnRyb2wgZm9yIHVzZXIgYWdlbnRzIHRoYXQgZG9uJ3QgKGFkZXF1YXRlbHkpCi0gICAgc3VwcG9ydCBzdHlsZSBzaGVldHMuCi0KLSAgICBJZiB5b3UgYXJlIHdyaXRpbmcgYSBkb2N1bWVudCB0aGF0IGluY2x1ZGVzIGZyYW1lcywgdXNlIAotICAgIHRoZSBmb2xsb3dpbmcgRlBJOgotCi0gICAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIgotCi0gICAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBmcmFtZXNldCBEVEQgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9mcmFtZXNldC5kdGQKLQotICAgIFVzZSB0aGUgZm9sbG93aW5nIChyZWxhdGl2ZSkgVVJJcyB0byByZWZlciB0byAKLSAgICB0aGUgRFREcyBhbmQgZW50aXR5IGRlZmluaXRpb25zIG9mIHRoaXMgc3BlY2lmaWNhdGlvbjoKLQotICAgICJzdHJpY3QuZHRkIgotICAgICJsb29zZS5kdGQiCi0gICAgImZyYW1lc2V0LmR0ZCIKLSAgICAiSFRNTGxhdDEuZW50IgotICAgICJIVE1Mc3ltYm9sLmVudCIKLSAgICAiSFRNTHNwZWNpYWwuZW50IgotCi0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBJbXBvcnRlZCBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gRmVhdHVyZSBTd2l0Y2ggZm9yIGZyYW1lc2V0IGRvY3VtZW50cyAtLT4KLTwhRU5USVRZICUgSFRNTC5GcmFtZXNldCAiSUdOT1JFIj4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZSAiQ0RBVEEiCi0gICAgLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlcyAiQ0RBVEEiCi0gICAgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0ICJDREFUQSIKLSAgICAtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXRzICJDREFUQSIKLSAgICAtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBMYW5ndWFnZUNvZGUgIk5BTUUiCi0gICAgLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzE3NjZdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcmFjdGVyICJDREFUQSIKLSAgICAtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIAotICAgIC0tPgotCi08IUVOVElUWSAlIExpbmtUeXBlcyAiQ0RBVEEiCi0gICAgLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcwotICAgIC0tPgotCi08IUVOVElUWSAlIE1lZGlhRGVzYyAiQ0RBVEEiCi0gICAgLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgVVJJICJDREFUQSIKLSAgICAtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwKLSAgICAgICBzZWUgW1VSSV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBEYXRldGltZSAiQ0RBVEEiIC0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLQotCi08IUVOVElUWSAlIFNjcmlwdCAiQ0RBVEEiIC0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotCi08IUVOVElUWSAlIFN0eWxlU2hlZXQgIkNEQVRBIiAtLSBzdHlsZSBzaGVldCBkYXRhIC0tPgotCi08IUVOVElUWSAlIEZyYW1lVGFyZ2V0ICJDREFUQSIgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0+Ci0KLQotPCFFTlRJVFkgJSBUZXh0ICJDREFUQSI+Ci0KLQotPCEtLSBQYXJhbWV0ZXIgRW50aXRpZXMgLS0+Ci0KLTwhRU5USVRZICUgaGVhZC5taXNjICJTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCIgLS0gcmVwZWF0YWJsZSBoZWFkIGVsZW1lbnRzIC0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgIkgxfEgyfEgzfEg0fEg1fEg2Ij4KLQotPCFFTlRJVFkgJSBsaXN0ICJVTCB8IE9MIHwgIERJUiB8IE1FTlUiPgotCi08IUVOVElUWSAlIHByZWZvcm1hdHRlZCAiUFJFIj4KLQotPCFFTlRJVFkgJSBDb2xvciAiQ0RBVEEiIC0tIGEgY29sb3IgdXNpbmcgc1JHQjogI1JSR0dCQiBhcyBIZXggdmFsdWVzIC0tPgotCi08IS0tIFRoZXJlIGFyZSBhbHNvIDE2IHdpZGVseSBrbm93biBjb2xvciBuYW1lcyB3aXRoIHRoZWlyIHNSR0IgdmFsdWVzOgotCi0gICAgQmxhY2sgID0gIzAwMDAwMCAgICBHcmVlbiAgPSAjMDA4MDAwCi0gICAgU2lsdmVyID0gI0MwQzBDMCAgICBMaW1lICAgPSAjMDBGRjAwCi0gICAgR3JheSAgID0gIzgwODA4MCAgICBPbGl2ZSAgPSAjODA4MDAwCi0gICAgV2hpdGUgID0gI0ZGRkZGRiAgICBZZWxsb3cgPSAjRkZGRjAwCi0gICAgTWFyb29uID0gIzgwMDAwMCAgICBOYXZ5ICAgPSAjMDAwMDgwCi0gICAgUmVkICAgID0gI0ZGMDAwMCAgICBCbHVlICAgPSAjMDAwMEZGCi0gICAgUHVycGxlID0gIzgwMDA4MCAgICBUZWFsICAgPSAjMDA4MDgwCi0gICAgRnVjaHNpYT0gI0ZGMDBGRiAgICBBcXVhICAgPSAjMDBGRkZGCi0gLS0+Ci0KLTwhRU5USVRZICUgYm9keWNvbG9ycyAiCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudCBiYWNrZ3JvdW5kIGNvbG9yIC0tCi0gIHRleHQgICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudCB0ZXh0IGNvbG9yIC0tCi0gIGxpbmsgICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjb2xvciBvZiBsaW5rcyAtLQotICB2bGluayAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gY29sb3Igb2YgdmlzaXRlZCBsaW5rcyAtLQotICBhbGluayAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gY29sb3Igb2Ygc2VsZWN0ZWQgbGlua3MgLS0KLSAgIj4KLQotPCEtLT09PT09PT09PT09PT09PT0gQ2hhcmFjdGVyIG1uZW1vbmljIGVudGl0aWVzID09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIExhdGluMS8vRU4vL0hUTUwiCi0gICAiSFRNTGxhdDEuZW50Ij4KLSVIVE1MbGF0MTsKLQotPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scy8vRU4vL0hUTUwiCi0gICAiSFRNTHN5bWJvbC5lbnQiPgotJUhUTUxzeW1ib2w7Ci0KLTwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsLy9FTi8vSFRNTCIKLSAgICJIVE1Mc3BlY2lhbC5lbnQiPgotJUhUTUxzcGVjaWFsOwotPCEtLT09PT09PT09PT09PT09PT09PT0gR2VuZXJpYyBBdHRyaWJ1dGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBjb3JlYXR0cnMKLSAiaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkIC0tCi0gIGNsYXNzICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzIC0tCi0gIHN0eWxlICAgICAgICVTdHlsZVNoZWV0OyAgICNJTVBMSUVEICAtLSBhc3NvY2lhdGVkIHN0eWxlIGluZm8gLS0KLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IHRpdGxlIC0tIgotICA+Ci0KLTwhRU5USVRZICUgaTE4bgotICJsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjSU1QTElFRCAgLS0gZGlyZWN0aW9uIGZvciB3ZWFrL25ldXRyYWwgdGV4dCAtLSIKLSAgPgotCi08IUVOVElUWSAlIGV2ZW50cwotICJvbmNsaWNrICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgY2xpY2tlZCAtLQotICBvbmRibGNsaWNrICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgZG91YmxlIGNsaWNrZWQtLQotICBvbm1vdXNlZG93biAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcHJlc3NlZCBkb3duIC0tCi0gIG9ubW91c2V1cCAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyByZWxlYXNlZCAtLQotICBvbm1vdXNlb3ZlciAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCBvbnRvIC0tCi0gIG9ubW91c2Vtb3ZlICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgd2FzIG1vdmVkIHdpdGhpbiAtLQotICBvbm1vdXNlb3V0ICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCBhd2F5IC0tCi0gIG9ua2V5cHJlc3MgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQgLS0KLSAgb25rZXlkb3duICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEga2V5IHdhcyBwcmVzc2VkIGRvd24gLS0KLSAgb25rZXl1cCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEga2V5IHdhcyByZWxlYXNlZCAtLSIKLSAgPgotCi08IS0tIFJlc2VydmVkIEZlYXR1cmUgU3dpdGNoIC0tPgotPCFFTlRJVFkgJSBIVE1MLlJlc2VydmVkICJJR05PUkUiPgotCi08IS0tIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0+Ci08IVsgJUhUTUwuUmVzZXJ2ZWQ7IFsKLTwhRU5USVRZICUgcmVzZXJ2ZWQKLSAiZGF0YXNyYyAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGEgc2luZ2xlIG9yIHRhYnVsYXIgRGF0YSBTb3VyY2UgLS0KLSAgZGF0YWZsZCAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHRoZSBwcm9wZXJ0eSBvciBjb2x1bW4gbmFtZSAtLQotICBkYXRhZm9ybWF0YXMgKHBsYWludGV4dHxodG1sKSBwbGFpbnRleHQgLS0gdGV4dCBvciBodG1sIC0tIgotICA+Ci1dXT4KLQotPCFFTlRJVFkgJSByZXNlcnZlZCAiIj4KLQotPCFFTlRJVFkgJSBhdHRycyAiJWNvcmVhdHRyczsgJWkxOG47ICVldmVudHM7Ij4KLQotPCFFTlRJVFkgJSBhbGlnbiAiYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkpICAjSU1QTElFRCIKLSAgICAgICAgICAgICAgICAgICAtLSBkZWZhdWx0IGlzIGxlZnQgZm9yIGx0ciBwYXJhZ3JhcGhzLCByaWdodCBmb3IgcnRsIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBNYXJrdXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBmb250c3R5bGUKLSAiVFQgfCBJIHwgQiB8IFUgfCBTIHwgU1RSSUtFIHwgQklHIHwgU01BTEwiPgotCi08IUVOVElUWSAlIHBocmFzZSAiRU0gfCBTVFJPTkcgfCBERk4gfCBDT0RFIHwKLSAgICAgICAgICAgICAgICAgICBTQU1QIHwgS0JEIHwgVkFSIHwgQ0lURSB8IEFCQlIgfCBBQ1JPTllNIiA+Ci0KLTwhRU5USVRZICUgc3BlY2lhbAotICAgIkEgfCBJTUcgfCBBUFBMRVQgfCBPQkpFQ1QgfCBGT05UIHwgQkFTRUZPTlQgfCBCUiB8IFNDUklQVCB8Ci0gICAgTUFQIHwgUSB8IFNVQiB8IFNVUCB8IFNQQU4gfCBCRE8gfCBJRlJBTUUiPgotCi08IUVOVElUWSAlIGZvcm1jdHJsICJJTlBVVCB8IFNFTEVDVCB8IFRFWFRBUkVBIHwgTEFCRUwgfCBCVVRUT04iPgotCi08IS0tICVpbmxpbmU7IGNvdmVycyBpbmxpbmUgb3IgInRleHQtbGV2ZWwiIGVsZW1lbnRzIC0tPgotPCFFTlRJVFkgJSBpbmxpbmUgIiNQQ0RBVEEgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJXNwZWNpYWw7IHwgJWZvcm1jdHJsOyI+Ci0KLTwhRUxFTUVOVCAoJWZvbnRzdHlsZTt8JXBocmFzZTspIC0gLSAoJWlubGluZTspKj4KLTwhQVRUTElTVCAoJWZvbnRzdHlsZTt8JXBocmFzZTspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCAoU1VCfFNVUCkgLSAtICglaW5saW5lOykqICAgIC0tIHN1YnNjcmlwdCwgc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1QgKFNVQnxTVVApCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBTUEFOIC0gLSAoJWlubGluZTspKiAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIFNQQU4KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVyZXNlcnZlZDsJCQkgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgQkRPIC0gLSAoJWlubGluZTspKiAgICAgICAgICAtLSBJMThOIEJpRGkgb3Zlci1yaWRlIC0tPgotPCFBVFRMSVNUIEJETwotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgbGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI1JFUVVJUkVEIC0tIGRpcmVjdGlvbmFsaXR5IC0tCi0gID4KLQotPCFFTEVNRU5UIEJBU0VGT05UIC0gTyBFTVBUWSAgICAgICAgICAgLS0gYmFzZSBmb250IHNpemUgLS0+Ci08IUFUVExJU1QgQkFTRUZPTlQKLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkIC0tCi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBiYXNlIGZvbnQgc2l6ZSBmb3IgRk9OVCBlbGVtZW50cyAtLQotICBjb2xvciAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gdGV4dCBjb2xvciAtLQotICBmYWNlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZm9udCBuYW1lcyAtLQotICA+Ci0KLTwhRUxFTUVOVCBGT05UIC0gLSAoJWlubGluZTspKiAgICAgICAgIC0tIGxvY2FsIGNoYW5nZSB0byBmb250IC0tPgotPCFBVFRMSVNUIEZPTlQKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gICVpMThuOwkJICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBbK3wtXW5uIGUuZy4gc2l6ZT0iKzEiLCBzaXplPSI0IiAtLQotICBjb2xvciAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gdGV4dCBjb2xvciAtLQotICBmYWNlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZm9udCBuYW1lcyAtLQotICA+Ci0KLTwhRUxFTUVOVCBCUiAtIE8gRU1QVFkgICAgICAgICAgICAgICAgIC0tIGZvcmNlZCBsaW5lIGJyZWFrIC0tPgotPCFBVFRMSVNUIEJSCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBjbGVhciAgICAgICAobGVmdHxhbGx8cmlnaHR8bm9uZSkgbm9uZSAtLSBjb250cm9sIG9mIHRleHQgZmxvdyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSFRNTCBjb250ZW50IG1vZGVscyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgICBIVE1MIGhhcyB0d28gYmFzaWMgY29udGVudCBtb2RlbHM6Ci0KLSAgICAgICAgJWlubGluZTsgICAgIGNoYXJhY3RlciBsZXZlbCBlbGVtZW50cyBhbmQgdGV4dCBzdHJpbmdzCi0gICAgICAgICVibG9jazsgICAgICBibG9jay1saWtlIGVsZW1lbnRzIGUuZy4gcGFyYWdyYXBocyBhbmQgbGlzdHMKLS0tPgotCi08IUVOVElUWSAlIGJsb2NrCi0gICAgICJQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0gICAgICBOT1NDUklQVCB8IE5PRlJBTUVTIHwgQkxPQ0tRVU9URSB8IEZPUk0gfCBJU0lOREVYIHwgSFIgfAotICAgICAgVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MiPgotCi08IUVOVElUWSAlIGZsb3cgIiVibG9jazsgfCAlaW5saW5lOyI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IERvY3VtZW50IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCT0RZIE8gTyAoJWZsb3c7KSogKyhJTlN8REVMKSAtLSBkb2N1bWVudCBib2R5IC0tPgotPCFBVFRMSVNUIEJPRFkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG9ubG9hZCAgICAgICAgICAlU2NyaXB0OyAgICNJTVBMSUVEICAtLSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gbG9hZGVkIC0tCi0gIG9udW5sb2FkICAgICAgICAlU2NyaXB0OyAgICNJTVBMSUVEICAtLSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCAtLQotICBiYWNrZ3JvdW5kICAgICAgJVVSSTsgICAgICAjSU1QTElFRCAgLS0gdGV4dHVyZSB0aWxlIGZvciBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCAtLQotICAlYm9keWNvbG9yczsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYmdjb2xvciwgdGV4dCwgbGluaywgdmxpbmssIGFsaW5rIC0tCi0gID4KLQotPCFFTEVNRU5UIEFERFJFU1MgLSAtICgoJWlubGluZTspfFApKiAgLS0gaW5mb3JtYXRpb24gb24gYXV0aG9yIC0tPgotPCFBVFRMSVNUIEFERFJFU1MKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIERJViAtIC0gKCVmbG93OykqICAgICAgICAgICAgLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgRElWCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYWxpZ24sIHRleHQgYWxpZ25tZW50IC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBDRU5URVIgLSAtICglZmxvdzspKiAgICAgICAgIC0tIHNob3J0aGFuZCBmb3IgRElWIGFsaWduPWNlbnRlciAtLT4KLTwhQVRUTElTVCBDRU5URVIKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBUaGUgQW5jaG9yIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBTaGFwZSAiKHJlY3R8Y2lyY2xlfHBvbHl8ZGVmYXVsdCkiPgotPCFFTlRJVFkgJSBDb29yZHMgIkNEQVRBIiAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tPgotCi08IUVMRU1FTlQgQSAtIC0gKCVpbmxpbmU7KSogLShBKSAgICAgICAtLSBhbmNob3IgLS0+Ci08IUFUVExJU1QgQQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQgIC0tIGNoYXIgZW5jb2Rpbmcgb2YgbGlua2VkIHJlc291cmNlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBhZHZpc29yeSBjb250ZW50IHR5cGUgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWVkIGxpbmsgZW5kIC0tCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIGZvcndhcmQgbGluayB0eXBlcyAtLQotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gcmV2ZXJzZSBsaW5rIHR5cGVzIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgcmVjdCAgICAgIC0tIGZvciB1c2Ugd2l0aCBjbGllbnQtc2lkZSBpbWFnZSBtYXBzIC0tCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVEICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBNQVAgLSAtICgoJWJsb2NrOykgfCBBUkVBKSsgLS0gY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tPgotPCFBVFRMSVNUIE1BUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIGZvciByZWZlcmVuY2UgYnkgdXNlbWFwIC0tCi0gID4KLQotPCFFTEVNRU5UIEFSRUEgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gY2xpZW50LXNpZGUgaW1hZ2UgbWFwIGFyZWEgLS0+Ci08IUFUVExJU1QgQVJFQQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgcmVjdCAgICAgIC0tIGNvbnRyb2xzIGludGVycHJldGF0aW9uIG9mIGNvb3JkcyAtLQotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRCAgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQgIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tCi0gIG5vaHJlZiAgICAgIChub2hyZWYpICAgICAgICNJTVBMSUVEICAtLSB0aGlzIHJlZ2lvbiBoYXMgbm8gYWN0aW9uIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIExJTksgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgUmVsYXRpb25zaGlwIHZhbHVlcyBjYW4gYmUgdXNlZCBpbiBwcmluY2lwbGU6Ci0KLSAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cyB3aGVuIHVzZWQKLSAgICAgIHdpdGggdGhlIExJTksgZWxlbWVudCBpbiBkb2N1bWVudCBoZWFkIGUuZy4KLSAgICAgICAgc3RhcnQsIGNvbnRlbnRzLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9c3R5bGVzaGVldCkKLSAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9c2NyaXB0KQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIHBvc3RzY3JpcHQgb3IgcGRmIHZlcnNpb24gKHJlbD1hbHRlcm5hdGUgbWVkaWE9cHJpbnQpCi0tLT4KLQotPCFFTEVNRU5UIExJTksgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gYSBtZWRpYS1pbmRlcGVuZGVudCBsaW5rIC0tPgotPCFBVFRMSVNUIExJTksKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IGNvbnRlbnQgdHlwZSAtLQotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gZm9yd2FyZCBsaW5rIHR5cGVzIC0tCi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSByZXZlcnNlIGxpbmsgdHlwZXMgLS0KLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQgIC0tIGZvciByZW5kZXJpbmcgb24gdGhlc2UgbWVkaWEgLS0KLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQgIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBMZW5ndGggZGVmaW5lZCBpbiBzdHJpY3QgRFREIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLTwhRU5USVRZICUgTGVuZ3RoICJDREFUQSIgLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aCAiQ0RBVEEiIC0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLQotPCFbICVIVE1MLkZyYW1lc2V0OyBbCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgUGl4ZWxzICJDREFUQSIgLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLQotPCFFTlRJVFkgJSBJQWxpZ24gIih0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSIgLS0gY2VudGVyPyAtLT4KLQotPCEtLSBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIHRleHQtb25seSBVQXMgYXMgd2VsbCBhcyAKLSAgIHRvIG1ha2UgaW1hZ2UgY29udGVudCB1bmRlcnN0YW5kYWJsZSBhbmQgbmF2aWdhYmxlIAotICAgdG8gdXNlcnMgb2Ygbm9uLXZpc3VhbCBVQXMsIHlvdSBuZWVkIHRvIHByb3ZpZGUKLSAgIGEgZGVzY3JpcHRpb24gd2l0aCBBTFQsIGFuZCBhdm9pZCBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzIC0tPgotPCFFTEVNRU5UIElNRyAtIE8gRU1QVFkgICAgICAgICAgICAgICAgLS0gRW1iZWRkZWQgaW1hZ2UgLS0+Ci08IUFUVExJU1QgSU1HCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQgLS0gVVJJIG9mIGltYWdlIHRvIGVtYmVkIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbGluayB0byBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxlbWVudHMgYWx0KSAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZSBvZiBpbWFnZSBmb3Igc2NyaXB0aW5nIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIHdpZHRoIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIGlzbWFwICAgICAgIChpc21hcCkgICAgICAgICNJTVBMSUVEICAtLSB1c2Ugc2VydmVyLXNpZGUgaW1hZ2UgbWFwIC0tCi0gIGFsaWduICAgICAgICVJQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudCAtLQotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gbGluayBib3JkZXIgd2lkdGggLS0KLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGhvcml6b250YWwgZ3V0dGVyIC0tCi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBndXR0ZXIgLS0KLSAgPgotCi08IS0tIFVTRU1BUCBwb2ludHMgdG8gYSBNQVAgZWxlbWVudCB3aGljaCBtYXkgYmUgaW4gdGhpcyBkb2N1bWVudAotICBvciBhbiBleHRlcm5hbCBkb2N1bWVudCwgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09IE9CSkVDVCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBPQkpFQ1QgaXMgdXNlZCB0byBlbWJlZCBvYmplY3RzIGFzIHBhcnQgb2YgSFRNTCBwYWdlcyAKLSAgUEFSQU0gZWxlbWVudHMgc2hvdWxkIHByZWNlZGUgb3RoZXIgY29udGVudC4gU0dNTCBtaXhlZCBjb250ZW50Ci0gIG1vZGVsIHRlY2huaWNhbGl0eSBwcmVjbHVkZXMgc3BlY2lmeWluZyB0aGlzIGZvcm1hbGx5IC4uLgotLS0+Ci0KLTwhRUxFTUVOVCBPQkpFQ1QgLSAtIChQQVJBTSB8ICVmbG93OykqCi0gLS0gZ2VuZXJpYyBlbWJlZGRlZCBvYmplY3QgLS0+Ci08IUFUVExJU1QgT0JKRUNUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBkZWNsYXJlICAgICAoZGVjbGFyZSkgICAgICAjSU1QTElFRCAgLS0gZGVjbGFyZSBidXQgZG9uJ3QgaW5zdGFudGlhdGUgZmxhZyAtLQotICBjbGFzc2lkICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gaWRlbnRpZmllcyBhbiBpbXBsZW1lbnRhdGlvbiAtLQotICBjb2RlYmFzZSAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gYmFzZSBVUkkgZm9yIGNsYXNzaWQsIGRhdGEsIGFyY2hpdmUtLQotICBkYXRhICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gcmVmZXJlbmNlIHRvIG9iamVjdCdzIGRhdGEgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgZGF0YSAtLQotICBjb2RldHlwZSAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciBjb2RlIC0tCi0gIGFyY2hpdmUgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVUklzIC0tCi0gIHN0YW5kYnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBtZXNzYWdlIHRvIHNob3cgd2hpbGUgbG9hZGluZyAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSB3aWR0aCAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3VibWl0IGFzIHBhcnQgb2YgZm9ybSAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgYm9yZGVyIHdpZHRoIC0tCi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBob3Jpem9udGFsIGd1dHRlciAtLQotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgZ3V0dGVyIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBQQVJBTSAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIG5hbWVkIHByb3BlcnR5IHZhbHVlIC0tPgotPCFBVFRMSVNUIFBBUkFNCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gcHJvcGVydHkgbmFtZSAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcHJvcGVydHkgdmFsdWUgLS0KLSAgdmFsdWV0eXBlICAgKERBVEF8UkVGfE9CSkVDVCkgREFUQSAgIC0tIEhvdyB0byBpbnRlcnByZXQgdmFsdWUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdmFsdWV0eXBlPXJlZiAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEphdmEgQVBQTEVUID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgT25lIG9mIGNvZGUgb3Igb2JqZWN0IGF0dHJpYnV0ZXMgbXVzdCBiZSBwcmVzZW50LgotICBQbGFjZSBQQVJBTSBlbGVtZW50cyBiZWZvcmUgb3RoZXIgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIEFQUExFVCAtIC0gKFBBUkFNIHwgJWZsb3c7KSogLS0gSmF2YSBhcHBsZXQgLS0+Ci08IUFUVExJU1QgQVBQTEVUCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBjb2RlYmFzZSAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gb3B0aW9uYWwgYmFzZSBVUkkgZm9yIGFwcGxldCAtLQotICBhcmNoaXZlICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gY29tbWEtc2VwYXJhdGVkIGFyY2hpdmUgbGlzdCAtLQotICBjb2RlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gYXBwbGV0IGNsYXNzIGZpbGUgLS0KLSAgb2JqZWN0ICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNlcmlhbGl6ZWQgYXBwbGV0IGZpbGUgLS0KLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBhbGxvd3MgYXBwbGV0cyB0byBmaW5kIGVhY2ggb3RoZXIgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI1JFUVVJUkVEIC0tIGluaXRpYWwgd2lkdGggLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI1JFUVVJUkVEIC0tIGluaXRpYWwgaGVpZ2h0IC0tCi0gIGFsaWduICAgICAgICVJQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudCAtLQotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIGd1dHRlciAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhvcml6b250YWwgUnVsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBIUiAtIE8gRU1QVFkgLS0gaG9yaXpvbnRhbCBydWxlIC0tPgotPCFBVFRMSVNUIEhSCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhbGlnbiAgICAgICAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVECi0gIG5vc2hhZGUgICAgIChub3NoYWRlKSAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFAgLSBPICglaW5saW5lOykqICAgICAgICAgICAgLS0gcGFyYWdyYXBoIC0tPgotPCFBVFRMSVNUIFAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBhbGlnbiwgdGV4dCBhbGlnbm1lbnQgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIZWFkaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRpbmdzIGZyb20gSDEgKHRoZSBtb3N0IGltcG9ydGFudCkKLSAgdG8gSDYgKHRoZSBsZWFzdCBpbXBvcnRhbnQpLgotLS0+Ci0KLTwhRUxFTUVOVCAoJWhlYWRpbmc7KSAgLSAtICglaW5saW5lOykqIC0tIGhlYWRpbmcgLS0+Ci08IUFUVExJU1QgKCVoZWFkaW5nOykKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBhbGlnbiwgdGV4dCBhbGlnbm1lbnQgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQcmVmb3JtYXR0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGV4Y2x1ZGVzIG1hcmt1cCBmb3IgaW1hZ2VzIGFuZCBjaGFuZ2VzIGluIGZvbnQgc2l6ZSAtLT4KLTwhRU5USVRZICUgcHJlLmV4Y2x1c2lvbiAiSU1HfE9CSkVDVHxBUFBMRVR8QklHfFNNQUxMfFNVQnxTVVB8Rk9OVHxCQVNFRk9OVCI+Ci0KLTwhRUxFTUVOVCBQUkUgLSAtICglaW5saW5lOykqIC0oJXByZS5leGNsdXNpb247KSAtLSBwcmVmb3JtYXR0ZWQgdGV4dCAtLT4KLTwhQVRUTElTVCBQUkUKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHdpZHRoICAgICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PSBJbmxpbmUgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFEgLSAtICglaW5saW5lOykqICAgICAgICAgICAgLS0gc2hvcnQgaW5saW5lIHF1b3RhdGlvbiAtLT4KLTwhQVRUTElTVCBRCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBzb3VyY2UgZG9jdW1lbnQgb3IgbXNnIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQmxvY2stbGlrZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEJMT0NLUVVPVEUgLSAtICglZmxvdzspKiAgICAgLS0gbG9uZyBxdW90YXRpb24gLS0+Ci08IUFUVExJU1QgQkxPQ0tRVU9URQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3Igc291cmNlIGRvY3VtZW50IG9yIG1zZyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQotPCEtLSBJTlMvREVMIGFyZSBoYW5kbGVkIGJ5IGluY2x1c2lvbiBvbiBCT0RZIC0tPgotPCFFTEVNRU5UIChJTlN8REVMKSAtIC0gKCVmbG93OykqICAgICAgLS0gaW5zZXJ0ZWQgdGV4dCwgZGVsZXRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIChJTlN8REVMKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGluZm8gb24gcmVhc29uIGZvciBjaGFuZ2UgLS0KLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQgIC0tIGRhdGUgYW5kIHRpbWUgb2YgY2hhbmdlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gTGlzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBkZWZpbml0aW9uIGxpc3RzIC0gRFQgZm9yIHRlcm0sIEREIGZvciBpdHMgZGVmaW5pdGlvbiAtLT4KLQotPCFFTEVNRU5UIERMIC0gLSAoRFR8REQpKyAgICAgICAgICAgICAgLS0gZGVmaW5pdGlvbiBsaXN0IC0tPgotPCFBVFRMSVNUIERMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRCAgLS0gcmVkdWNlZCBpbnRlcml0ZW0gc3BhY2luZyAtLQotICA+Ci0KLTwhRUxFTUVOVCBEVCAtIE8gKCVpbmxpbmU7KSogICAgICAgICAgIC0tIGRlZmluaXRpb24gdGVybSAtLT4KLTwhRUxFTUVOVCBERCAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGRlZmluaXRpb24gZGVzY3JpcHRpb24gLS0+Ci08IUFUVExJU1QgKERUfEREKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tIE9yZGVyZWQgbGlzdHMgKE9MKSBOdW1iZXJpbmcgc3R5bGUKLQotICAgIDEgICBhcmFibGljIG51bWJlcnMgICAgIDEsIDIsIDMsIC4uLgotICAgIGEgICBsb3dlciBhbHBoYSAgICAgICAgIGEsIGIsIGMsIC4uLgotICAgIEEgICB1cHBlciBhbHBoYSAgICAgICAgIEEsIEIsIEMsIC4uLgotICAgIGkgICBsb3dlciByb21hbiAgICAgICAgIGksIGlpLCBpaWksIC4uLgotICAgIEkgICB1cHBlciByb21hbiAgICAgICAgIEksIElJLCBJSUksIC4uLgotCi0gICAgVGhlIHN0eWxlIGlzIGFwcGxpZWQgdG8gdGhlIHNlcXVlbmNlIG51bWJlciB3aGljaCBieSBkZWZhdWx0Ci0gICAgaXMgcmVzZXQgdG8gMSBmb3IgdGhlIGZpcnN0IGxpc3QgaXRlbSBpbiBhbiBvcmRlcmVkIGxpc3QuCi0KLSAgICBUaGlzIGNhbid0IGJlIGV4cHJlc3NlZCBkaXJlY3RseSBpbiBTR01MIGR1ZSB0byBjYXNlIGZvbGRpbmcuCi0tLT4KLQotPCFFTlRJVFkgJSBPTFN0eWxlICJDREFUQSIgICAgICAtLSBjb25zdHJhaW5lZCB0bzogIigxfGF8QXxpfEkpIiAtLT4KLQotPCFFTEVNRU5UIE9MIC0gLSAoTEkpKyAgICAgICAgICAgICAgICAgLS0gb3JkZXJlZCBsaXN0IC0tPgotPCFBVFRMSVNUIE9MCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICB0eXBlICAgICAgICAlT0xTdHlsZTsgICAgICAjSU1QTElFRCAgLS0gbnVtYmVyaW5nIHN0eWxlIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEICAtLSByZWR1Y2VkIGludGVyaXRlbSBzcGFjaW5nIC0tCi0gIHN0YXJ0ICAgICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgLS0KLSAgPgotCi08IS0tIFVub3JkZXJlZCBMaXN0cyAoVUwpIGJ1bGxldCBzdHlsZXMgLS0+Ci08IUVOVElUWSAlIFVMU3R5bGUgIihkaXNjfHNxdWFyZXxjaXJjbGUpIj4KLQotPCFFTEVNRU5UIFVMIC0gLSAoTEkpKyAgICAgICAgICAgICAgICAgLS0gdW5vcmRlcmVkIGxpc3QgLS0+Ci08IUFUVExJU1QgVUwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHR5cGUgICAgICAgICVVTFN0eWxlOyAgICAgICNJTVBMSUVEICAtLSBidWxsZXQgc3R5bGUgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgPgotCi08IUVMRU1FTlQgKERJUnxNRU5VKSAtIC0gKExJKSsgLSglYmxvY2s7KSAtLSBkaXJlY3RvcnkgbGlzdCwgbWVudSBsaXN0IC0tPgotPCFBVFRMSVNUIERJUgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQgLS0gcmVkdWNlZCBpbnRlcml0ZW0gc3BhY2luZyAtLQotICA+Ci08IUFUVExJU1QgTUVOVQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQgLS0gcmVkdWNlZCBpbnRlcml0ZW0gc3BhY2luZyAtLQotICA+Ci0KLTwhRU5USVRZICUgTElTdHlsZSAiQ0RBVEEiIC0tIGNvbnN0cmFpbmVkIHRvOiAiKCVVTFN0eWxlO3wlT0xTdHlsZTspIiAtLT4KLQotPCFFTEVNRU5UIExJIC0gTyAoJWZsb3c7KSogICAgICAgICAgICAgLS0gbGlzdCBpdGVtIC0tPgotPCFBVFRMSVNUIExJCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICB0eXBlICAgICAgICAlTElTdHlsZTsgICAgICAjSU1QTElFRCAgLS0gbGlzdCBpdGVtIHN0eWxlIC0tCi0gIHZhbHVlICAgICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSByZXNldCBzZXF1ZW5jZSBudW1iZXIgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBGb3JtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTEVNRU5UIEZPUk0gLSAtICglZmxvdzspKiAtKEZPUk0pICAgLS0gaW50ZXJhY3RpdmUgZm9ybSAtLT4KLTwhQVRUTElTVCBGT1JNCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhY3Rpb24gICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQgLS0gc2VydmVyLXNpZGUgZm9ybSBoYW5kbGVyIC0tCi0gIG1ldGhvZCAgICAgIChHRVR8UE9TVCkgICAgIEdFVCAgICAgICAtLSBIVFRQIG1ldGhvZCB1c2VkIHRvIHN1Ym1pdCB0aGUgZm9ybS0tCi0gIGVuY3R5cGUgICAgICVDb250ZW50VHlwZTsgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVEICAtLSBsaXN0IG9mIE1JTUUgdHlwZXMgZm9yIGZpbGUgdXBsb2FkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lIG9mIGZvcm0gZm9yIHNjcmlwdGluZyAtLQotICBvbnN1Ym1pdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGZvcm0gd2FzIHN1Ym1pdHRlZCAtLQotICBvbnJlc2V0ICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGZvcm0gd2FzIHJlc2V0IC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICAjSU1QTElFRCAgLS0gbGlzdCBvZiBzdXBwb3J0ZWQgY2hhcnNldHMgLS0KLSAgPgotCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkIC0tPgotPCFFTEVNRU5UIExBQkVMIC0gLSAoJWlubGluZTspKiAtKExBQkVMKSAtLSBmb3JtIGZpZWxkIGxhYmVsIHRleHQgLS0+Ci08IUFUVExJU1QgTEFCRUwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGZvciAgICAgICAgIElEUkVGICAgICAgICAgICNJTVBMSUVEICAtLSBtYXRjaGVzIGZpZWxkIElEIHZhbHVlIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCFFTlRJVFkgJSBJbnB1dFR5cGUKLSAgIihURVhUIHwgUEFTU1dPUkQgfCBDSEVDS0JPWCB8Ci0gICAgUkFESU8gfCBTVUJNSVQgfCBSRVNFVCB8Ci0gICAgRklMRSB8IEhJRERFTiB8IElNQUdFIHwgQlVUVE9OKSIKLSAgID4KLQotPCEtLSBhdHRyaWJ1dGUgbmFtZSByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgYW5kIHJlc2V0IC0tPgotPCFFTEVNRU5UIElOUFVUIC0gTyBFTVBUWSAgICAgICAgICAgICAgLS0gZm9ybSBjb250cm9sIC0tPgotPCFBVFRMSVNUIElOUFVUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICB0eXBlICAgICAgICAlSW5wdXRUeXBlOyAgICBURVhUICAgICAgLS0gd2hhdCBraW5kIG9mIHdpZGdldCBpcyBuZWVkZWQgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHN1Ym1pdCBhcyBwYXJ0IG9mIGZvcm0gLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIFNwZWNpZnkgZm9yIHJhZGlvIGJ1dHRvbnMgYW5kIGNoZWNrYm94ZXMgLS0KLSAgY2hlY2tlZCAgICAgKGNoZWNrZWQpICAgICAgI0lNUExJRUQgIC0tIGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVjayBib3hlcyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVEICAtLSBmb3IgdGV4dCBhbmQgcGFzc3dkIC0tCi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzcGVjaWZpYyB0byBlYWNoIHR5cGUgb2YgZmllbGQgLS0KLSAgbWF4bGVuZ3RoICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIG1heCBjaGFycyBmb3IgdGV4dCBmaWVsZHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGZvciBmaWVsZHMgd2l0aCBpbWFnZXMgLS0KLSAgYWx0ICAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIGlzbWFwICAgICAgIChpc21hcCkgICAgICAgICNJTVBMSUVEICAtLSB1c2Ugc2VydmVyLXNpZGUgaW1hZ2UgbWFwIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBNSU1FIHR5cGVzIGZvciBmaWxlIHVwbG9hZCAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNFTEVDVCAtIC0gKE9QVEdST1VQfE9QVElPTikrIC0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBTRUxFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBmaWVsZCBuYW1lIC0tCi0gIHNpemUgICAgICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSByb3dzIHZpc2libGUgLS0KLSAgbXVsdGlwbGUgICAgKG11bHRpcGxlKSAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHQgaXMgc2luZ2xlIHNlbGVjdGlvbiAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIE9QVEdST1VQIC0gLSAoT1BUSU9OKSsgLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIE9QVEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgdXNlIGluIGhpZXJhcmNoaWNhbCBtZW51cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBPUFRJT04gLSBPICgjUENEQVRBKSAgICAgICAgIC0tIHNlbGVjdGFibGUgY2hvaWNlIC0tPgotPCFBVFRMSVNUIE9QVElPTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSBpbiBoaWVyYXJjaGljYWwgbWVudXMgLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHRzIHRvIGVsZW1lbnQgY29udGVudCAtLQotICA+Ci0KLTwhRUxFTUVOVCBURVhUQVJFQSAtIC0gKCNQQ0RBVEEpICAgICAgIC0tIG11bHRpLWxpbmUgdGV4dCBmaWVsZCAtLT4KLTwhQVRUTElTVCBURVhUQVJFQQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgTlVNQkVSICAgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgIE5VTUJFUiAgICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IS0tCi0gICNQQ0RBVEEgaXMgdG8gc29sdmUgdGhlIG1peGVkIGNvbnRlbnQgcHJvYmxlbSwKLSAgcGVyIHNwZWNpZmljYXRpb24gb25seSB3aGl0ZXNwYWNlIGlzIGFsbG93ZWQgdGhlcmUhCi0gLS0+Ci08IUVMRU1FTlQgRklFTERTRVQgLSAtICgjUENEQVRBLExFR0VORCwoJWZsb3c7KSopIC0tIGZvcm0gY29udHJvbCBncm91cCAtLT4KLTwhQVRUTElTVCBGSUVMRFNFVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgTEVHRU5EIC0gLSAoJWlubGluZTspKiAgICAgICAtLSBmaWVsZHNldCBsZWdlbmQgLS0+Ci08IUVOVElUWSAlIExBbGlnbiAiKHRvcHxib3R0b218bGVmdHxyaWdodCkiPgotCi08IUFUVExJU1QgTEVHRU5ECi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIGFsaWduICAgICAgICVMQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSByZWxhdGl2ZSB0byBmaWVsZHNldCAtLQotICA+Ci0KLTwhRUxFTUVOVCBCVVRUT04gLSAtCi0gICAgICglZmxvdzspKiAtKEF8JWZvcm1jdHJsO3xGT1JNfElTSU5ERVh8RklFTERTRVR8SUZSQU1FKQotICAgICAtLSBwdXNoIGJ1dHRvbiAtLT4KLTwhQVRUTElTVCBCVVRUT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZW50IHRvIHNlcnZlciB3aGVuIHN1Ym1pdHRlZCAtLQotICB0eXBlICAgICAgICAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0IC0tIGZvciB1c2UgYXMgZm9ybSBidXR0b24gLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIElFVEYgSFRNTCB0YWJsZSBzdGFuZGFyZCwgc2VlIFtSRkMxOTQyXSAtLT4KLQotPCEtLQotIFRoZSBCT1JERVIgYXR0cmlidXRlIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZQotIHRhYmxlLiBUaGUgZGVmYXVsdCB1bml0cyBhcmUgc2NyZWVuIHBpeGVscy4KLQotIFRoZSBGUkFNRSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSBWQUxJR04gYXR0cmlidXRlLgotCi0gVGhlIHZhbHVlICJib3JkZXIiIGlzIGluY2x1ZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCi0gPFRBQkxFIEJPUkRFUj4gd2hpY2ggeWllbGRzIGZyYW1lPWJvcmRlciBhbmQgYm9yZGVyPWltcGxpZWQKLSBGb3IgPFRBQkxFIEJPUkRFUj0xPiB5b3UgZ2V0IGJvcmRlcj0xIGFuZCBmcmFtZT1pbXBsaWVkLiBJbiB0aGlzCi0gY2FzZSwgaXQgaXMgYXBwcm9wcmlhdGUgdG8gdHJlYXQgdGhpcyBhcyBmcmFtZT1ib3JkZXIgZm9yIGJhY2t3YXJkcwotIGNvbXBhdGliaWxpdHkgd2l0aCBkZXBsb3llZCBicm93c2Vycy4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgUlVMRVMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgUlVMRVMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgQk9SREVSIGlzIGFic2VudCBvciBCT1JERVI9MCBvdGhlcndpc2UgImFsbCIKLS0tPgotCi08IUVOVElUWSAlIFRSdWxlcyAiKG5vbmUgfCBncm91cHMgfCByb3dzIHwgY29scyB8IGFsbCkiPgotICAKLTwhLS0gaG9yaXpvbnRhbCBwbGFjZW1lbnQgb2YgdGFibGUgcmVsYXRpdmUgdG8gZG9jdW1lbnQgLS0+Ci08IUVOVElUWSAlIFRBbGlnbiAiKGxlZnR8Y2VudGVyfHJpZ2h0KSI+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbGhhbGlnbgotICAiYWxpZ24gICAgICAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRAotICAgY2hhciAgICAgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWxpZ25tZW50IGNoYXIsIGUuZy4gY2hhcj0nOicgLS0KLSAgIGNoYXJvZmYgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG9mZnNldCBmb3IgYWxpZ25tZW50IGNoYXIgLS0iCi0gID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbHZhbGlnbgotICAidmFsaWduICAgICAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEIgotICA+Ci0KLTwhRUxFTUVOVCBUQUJMRSAtIC0KLSAgICAgKENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrKT4KLTwhRUxFTUVOVCBDQVBUSU9OICAtIC0gKCVpbmxpbmU7KSogICAgIC0tIHRhYmxlIGNhcHRpb24gLS0+Ci08IUVMRU1FTlQgVEhFQUQgICAgLSBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBoZWFkZXIgLS0+Ci08IUVMRU1FTlQgVEZPT1QgICAgLSBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBmb290ZXIgLS0+Ci08IUVMRU1FTlQgVEJPRFkgICAgTyBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBib2R5IC0tPgotPCFFTEVNRU5UIENPTEdST1VQIC0gTyAoQ09MKSogICAgICAgICAgLS0gdGFibGUgY29sdW1uIGdyb3VwIC0tPgotPCFFTEVNRU5UIENPTCAgICAgIC0gTyBFTVBUWSAgICAgICAgICAgLS0gdGFibGUgY29sdW1uIC0tPgotPCFFTEVNRU5UIFRSICAgICAgIC0gTyAoVEh8VEQpKyAgICAgICAgLS0gdGFibGUgcm93IC0tPgotPCFFTEVNRU5UIChUSHxURCkgIC0gTyAoJWZsb3c7KSogICAgICAgLS0gdGFibGUgaGVhZGVyIGNlbGwsIHRhYmxlIGRhdGEgY2VsbC0tPgotCi08IUFUVExJU1QgVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSBlbGVtZW50IC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzdW1tYXJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gcHVycG9zZS9zdHJ1Y3R1cmUgZm9yIHNwZWVjaCBvdXRwdXQtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gdGFibGUgd2lkdGggLS0KLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGNvbnRyb2xzIGZyYW1lIHdpZHRoIGFyb3VuZCB0YWJsZSAtLQotICBmcmFtZSAgICAgICAlVEZyYW1lOyAgICAgICAjSU1QTElFRCAgLS0gd2hpY2ggcGFydHMgb2YgZnJhbWUgdG8gcmVuZGVyIC0tCi0gIHJ1bGVzICAgICAgICVUUnVsZXM7ICAgICAgICNJTVBMSUVEICAtLSBydWxpbmdzIGJldHdlZW4gcm93cyBhbmQgY29scyAtLQotICBjZWxsc3BhY2luZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyBiZXR3ZWVuIGNlbGxzIC0tCi0gIGNlbGxwYWRkaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBzcGFjaW5nIHdpdGhpbiBjZWxscyAtLQotICBhbGlnbiAgICAgICAlVEFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdGFibGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gd2luZG93IC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBiYWNrZ3JvdW5kIGNvbG9yIGZvciBjZWxscyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgZGF0YXBhZ2VzaXplIENEQVRBICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTlRJVFkgJSBDQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFBVFRMSVNUIENBUFRJT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFsaWduICAgICAgICVDQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSByZWxhdGl2ZSB0byB0YWJsZSAtLQotICA+Ci0KLTwhLS0KLUNPTEdST1VQIGdyb3VwcyBhIHNldCBvZiBDT0wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UgdG8gZ3JvdXAKLXNldmVyYWwgc2VtYW50aWNhbGx5IHJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotPCFBVFRMSVNUIENPTEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcGFuICAgICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gZGVmYXVsdCBudW1iZXIgb2YgY29sdW1ucyBpbiBncm91cCAtLQotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRCAgLS0gZGVmYXVsdCB3aWR0aCBmb3IgZW5jbG9zZWQgQ09McyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhLS0KLSBDT0wgZWxlbWVudHMgZGVmaW5lIHRoZSBhbGlnbm1lbnQgcHJvcGVydGllcyBmb3IgY2VsbHMgaW4KLSBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gVGhlIFdJRFRIIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW5zLCBlLmcuCi0KLSAgICAgd2lkdGg9NjQgICAgICAgIHdpZHRoIGluIHNjcmVlbiBwaXhlbHMKLSAgICAgd2lkdGg9MC41KiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gVGhlIFNQQU4gYXR0cmlidXRlIGNhdXNlcyB0aGUgYXR0cmlidXRlcyBvZiBvbmUKLSBDT0wgZWxlbWVudCB0byBhcHBseSB0byBtb3JlIHRoYW4gb25lIGNvbHVtbi4KLS0tPgotPCFBVFRMSVNUIENPTCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY29sdW1uIGdyb3VwcyBhbmQgcHJvcGVydGllcyAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3BhbiAgICAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIENPTCBhdHRyaWJ1dGVzIGFmZmVjdCBOIGNvbHVtbnMgLS0KLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQgIC0tIGNvbHVtbiB3aWR0aCBzcGVjaWZpY2F0aW9uIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCEtLQotICAgIFVzZSBUSEVBRCB0byBkdXBsaWNhdGUgaGVhZGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBoZWFkZXJzIHdoZW4KLSAgICBUQk9EWSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIFRGT09UIHRvIGR1cGxpY2F0ZSBmb290ZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgbXVsdGlwbGUgVEJPRFkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgYmV0d2VlbiBncm91cHMgb2YgdGFibGUgcm93cy4KLS0tPgotPCFBVFRMSVNUIChUSEVBRHxUQk9EWXxURk9PVCkgICAgICAgICAgLS0gdGFibGUgc2VjdGlvbiAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IUFUVExJU1QgVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSByb3cgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBiYWNrZ3JvdW5kIGNvbG9yIGZvciByb3cgLS0KLSAgPgotCi0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGhlYWRlcnMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJvd3xjb2x8cm93Z3JvdXB8Y29sZ3JvdXApIj4KLQotPCEtLSBUSCBpcyBmb3IgaGVhZGVycywgVEQgZm9yIGRhdGEsIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIFREIC0tPgotPCFBVFRMSVNUIChUSHxURCkgICAgICAgICAgICAgICAgICAgICAgLS0gaGVhZGVyIG9yIGRhdGEgY2VsbCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFiYnJldmlhdGlvbiBmb3IgaGVhZGVyIGNlbGwgLS0KLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlbGF0ZWQgaGVhZGVycy0tCi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVEICAtLSBsaXN0IG9mIGlkJ3MgZm9yIGhlYWRlciBjZWxscyAtLQotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRCAgLS0gc2NvcGUgY292ZXJlZCBieSBoZWFkZXIgY2VsbHMgLS0KLSAgcm93c3BhbiAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIG51bWJlciBvZiByb3dzIHNwYW5uZWQgYnkgY2VsbCAtLQotICBjb2xzcGFuICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gbnVtYmVyIG9mIGNvbHMgc3Bhbm5lZCBieSBjZWxsIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gIG5vd3JhcCAgICAgIChub3dyYXApICAgICAgICNJTVBMSUVEICAtLSBzdXBwcmVzcyB3b3JkIHdyYXAgLS0KLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGNlbGwgYmFja2dyb3VuZCBjb2xvciAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gd2lkdGggZm9yIGNlbGwgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIGhlaWdodCBmb3IgY2VsbCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgRnJhbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgVGhlIGNvbnRlbnQgbW9kZWwgZm9yIEhUTUwgZG9jdW1lbnRzIGRlcGVuZHMgb24gd2hldGhlciB0aGUgSEVBRCBpcwotICBmb2xsb3dlZCBieSBhIEZSQU1FU0VUIG9yIEJPRFkgZWxlbWVudC4gVGhlIHdpZGVzcHJlYWQgb21pc3Npb24gb2YKLSAgdGhlIEJPRFkgc3RhcnQgdGFnIG1ha2VzIGl0IGltcHJhY3RpY2FsIHRvIGRlZmluZSB0aGUgY29udGVudCBtb2RlbAotICB3aXRob3V0IHRoZSB1c2Ugb2YgYSBtYXJrZWQgc2VjdGlvbi4KLS0tPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRUxFTUVOVCBGUkFNRVNFVCAtIC0gKChGUkFNRVNFVHxGUkFNRSkrICYgTk9GUkFNRVM/KSAtLSB3aW5kb3cgc3ViZGl2aXNpb24tLT4KLTwhQVRUTElTVCBGUkFNRVNFVAotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgcm93cyAgICAgICAgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEwMCUgKDEgcm93KSAtLQotICBjb2xzICAgICAgICAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBsZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMTAwJSAoMSBjb2wpIC0tCi0gIG9ubG9hZCAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhbGwgdGhlIGZyYW1lcyBoYXZlIGJlZW4gbG9hZGVkICAtLSAKLSAgb251bmxvYWQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGFsbCB0aGUgZnJhbWVzIGhhdmUgYmVlbiByZW1vdmVkIC0tIAotICA+Ci1dXT4KLQotPCFbICVIVE1MLkZyYW1lc2V0OyBbCi08IS0tIHJlc2VydmVkIGZyYW1lIG5hbWVzIHN0YXJ0IHdpdGggIl8iIG90aGVyd2lzZSBzdGFydHMgd2l0aCBsZXR0ZXIgLS0+Ci08IUVMRU1FTlQgRlJBTUUgLSBPIEVNUFRZICAgICAgICAgICAgICAtLSBzdWJ3aW5kb3cgLS0+Ci08IUFUVExJU1QgRlJBTUUKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBsaW5rIHRvIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wbGVtZW50cyB0aXRsZSkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgZnJhbWUgZm9yIHRhcmdldHRpbmcgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHNvdXJjZSBvZiBmcmFtZSBjb250ZW50IC0tCi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgIDEgICAgICAgICAtLSByZXF1ZXN0IGZyYW1lIGJvcmRlcnM/IC0tCi0gIG1hcmdpbndpZHRoICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBtYXJnaW4gd2lkdGhzIGluIHBpeGVscyAtLQotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIGhlaWdodCBpbiBwaXhlbHMgLS0KLSAgbm9yZXNpemUgICAgKG5vcmVzaXplKSAgICAgI0lNUExJRUQgIC0tIGFsbG93IHVzZXJzIHRvIHJlc2l6ZSBmcmFtZXM/IC0tCi0gIHNjcm9sbGluZyAgICh5ZXN8bm98YXV0bykgIGF1dG8gICAgICAtLSBzY3JvbGxiYXIgb3Igbm9uZSAtLQotICA+Ci1dXT4KLQotPCFFTEVNRU5UIElGUkFNRSAtIC0gKCVmbG93OykqICAgICAgICAgLS0gaW5saW5lIHN1YndpbmRvdyAtLT4KLTwhQVRUTElTVCBJRlJBTUUKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBsaW5rIHRvIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wbGVtZW50cyB0aXRsZSkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgZnJhbWUgZm9yIHRhcmdldHRpbmcgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHNvdXJjZSBvZiBmcmFtZSBjb250ZW50IC0tCi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgIDEgICAgICAgICAtLSByZXF1ZXN0IGZyYW1lIGJvcmRlcnM/IC0tCi0gIG1hcmdpbndpZHRoICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBtYXJnaW4gd2lkdGhzIGluIHBpeGVscyAtLQotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIGhlaWdodCBpbiBwaXhlbHMgLS0KLSAgc2Nyb2xsaW5nICAgKHllc3xub3xhdXRvKSAgYXV0byAgICAgIC0tIHNjcm9sbGJhciBvciBub25lIC0tCi0gIGFsaWduICAgICAgICVJQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudCAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gZnJhbWUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBmcmFtZSB3aWR0aCAtLQotICA+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTlRJVFkgJSBub2ZyYW1lcy5jb250ZW50ICIoQk9EWSkgLShOT0ZSQU1FUykiPgotXV0+Ci0KLTwhRU5USVRZICUgbm9mcmFtZXMuY29udGVudCAiKCVmbG93OykqIj4KLQotPCFFTEVNRU5UIE5PRlJBTUVTIC0gLSAlbm9mcmFtZXMuY29udGVudDsKLSAtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBmcmFtZS1iYXNlZCByZW5kZXJpbmcgLS0+Ci08IUFUVExJU1QgTk9GUkFNRVMKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gJWhlYWQubWlzYzsgZGVmaW5lZCBlYXJsaWVyIG9uIGFzICJTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCIgLS0+Ci08IUVOVElUWSAlIGhlYWQuY29udGVudCAiVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/Ij4KLQotPCFFTEVNRU5UIEhFQUQgTyBPICglaGVhZC5jb250ZW50OykgKyglaGVhZC5taXNjOykgLS0gZG9jdW1lbnQgaGVhZCAtLT4KLTwhQVRUTElTVCBIRUFECi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgcHJvZmlsZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWVkIGRpY3Rpb25hcnkgb2YgbWV0YSBpbmZvIC0tCi0gID4KLQotPCEtLSBUaGUgVElUTEUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0gICAgLS0+Ci08IUVMRU1FTlQgVElUTEUgLSAtICgjUENEQVRBKSAtKCVoZWFkLm1pc2M7KSAtLSBkb2N1bWVudCB0aXRsZSAtLT4KLTwhQVRUTElTVCBUSVRMRSAlaTE4bj4KLQotPCFFTEVNRU5UIElTSU5ERVggLSBPIEVNUFRZICAgICAgICAgICAgLS0gc2luZ2xlIGxpbmUgcHJvbXB0IC0tPgotPCFBVFRMSVNUIElTSU5ERVgKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgcHJvbXB0ICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHByb21wdCBtZXNzYWdlIC0tPgotCi08IUVMRU1FTlQgQkFTRSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLTwhQVRUTElTVCBCQVNFCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgdGhhdCBhY3RzIGFzIGJhc2UgVVJJIC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBNRVRBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFBVFRMSVNUIE1FVEEKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciwgZm9yIHVzZSB3aXRoIGNvbnRlbnQgLS0KLSAgaHR0cC1lcXVpdiAgTkFNRSAgICAgICAgICAgI0lNUExJRUQgIC0tIEhUVFAgcmVzcG9uc2UgaGVhZGVyIG5hbWUgIC0tCi0gIG5hbWUgICAgICAgIE5BTUUgICAgICAgICAgICNJTVBMSUVEICAtLSBtZXRhaW5mb3JtYXRpb24gbmFtZSAtLQotICBjb250ZW50ICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiAtLQotICBzY2hlbWUgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VsZWN0IGZvcm0gb2YgY29udGVudCAtLQotICA+Ci0KLTwhRUxFTUVOVCBTVFlMRSAtIC0gJVN0eWxlU2hlZXQgICAgICAgIC0tIHN0eWxlIGluZm8gLS0+Ci08IUFUVExJU1QgU1RZTEUKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciwgZm9yIHVzZSB3aXRoIHRpdGxlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRCAtLSBjb250ZW50IHR5cGUgb2Ygc3R5bGUgbGFuZ3VhZ2UgLS0KLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQgIC0tIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCB0aGVzZSBtZWRpYSAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUgLS0KLSAgPgotCi08IUVMRU1FTlQgU0NSSVBUIC0gLSAlU2NyaXB0OyAgICAgICAgICAtLSBzY3JpcHQgc3RhdGVtZW50cyAtLT4KLTwhQVRUTElTVCBTQ1JJUFQKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQgIC0tIGNoYXIgZW5jb2Rpbmcgb2YgbGlua2VkIHJlc291cmNlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRCAtLSBjb250ZW50IHR5cGUgb2Ygc2NyaXB0IGxhbmd1YWdlIC0tCi0gIGxhbmd1YWdlICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBwcmVkZWZpbmVkIHNjcmlwdCBsYW5ndWFnZSBuYW1lIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGFuIGV4dGVybmFsIHNjcmlwdCAtLQotICBkZWZlciAgICAgICAoZGVmZXIpICAgICAgICAjSU1QTElFRCAgLS0gVUEgbWF5IGRlZmVyIGV4ZWN1dGlvbiBvZiBzY3JpcHQgLS0KLSAgZXZlbnQgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGZvciAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBOT1NDUklQVCAtIC0gKCVmbG93OykqCi0gIC0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci08IUFUVExJU1QgTk9TQ1JJUFQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRU5USVRZICUgdmVyc2lvbiAidmVyc2lvbiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247JyI+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEZSQU1FU0VUIj4KLV1dPgotCi08IUVOVElUWSAlIGh0bWwuY29udGVudCAiSEVBRCwgQk9EWSI+Ci0KLTwhRUxFTUVOVCBIVE1MIE8gTyAoJWh0bWwuY29udGVudDspICAgIC0tIGRvY3VtZW50IHJvb3QgZWxlbWVudCAtLT4KLTwhQVRUTElTVCBIVE1MCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgJXZlcnNpb247Ci0gID4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy9zdHJpY3QuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3N0cmljdC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMzJjYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3N0cmljdC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw4NzAgKzAsMCBAQAotPCEtLQotICAgIFRoaXMgaXMgSFRNTCA0LjAxIFN0cmljdCBEVEQsIHdoaWNoIGV4Y2x1ZGVzIHRoZSBwcmVzZW50YXRpb24gCi0gICAgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgdGhhdCBXM0MgZXhwZWN0cyB0byBwaGFzZSBvdXQgYXMgCi0gICAgc3VwcG9ydCBmb3Igc3R5bGUgc2hlZXRzIG1hdHVyZXMuIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0Ci0gICAgRFREIHdoZW4gcG9zc2libGUsIGJ1dCBtYXkgdXNlIHRoZSBUcmFuc2l0aW9uYWwgRFREIHdoZW4gc3VwcG9ydAotICAgIGZvciBwcmVzZW50YXRpb24gYXR0cmlidXRlIGFuZCBlbGVtZW50cyBpcyByZXF1aXJlZC4KLSAgICAKLSAgICBIVE1MIDQgaW5jbHVkZXMgbWVjaGFuaXNtcyBmb3Igc3R5bGUgc2hlZXRzLCBzY3JpcHRpbmcsCi0gICAgZW1iZWRkaW5nIG9iamVjdHMsIGltcHJvdmVkIHN1cHBvcnQgZm9yIHJpZ2h0IHRvIGxlZnQgYW5kIG1peGVkCi0gICAgZGlyZWN0aW9uIHRleHQsIGFuZCBlbmhhbmNlbWVudHMgdG8gZm9ybXMgZm9yIGltcHJvdmVkCi0gICAgYWNjZXNzaWJpbGl0eSBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzLgotCi0gICAgICAgICAgRHJhZnQ6ICREYXRlOiAyMDA4LzA3LzIyIDA3OjM3OjAxICQKLQotICAgICAgICAgIEF1dGhvcnM6Ci0gICAgICAgICAgICAgIERhdmUgUmFnZ2V0dCA8ZHNyQHczLm9yZz4KLSAgICAgICAgICAgICAgQXJuYXVkIExlIEhvcnMgPGxlaG9yc0B3My5vcmc+Ci0gICAgICAgICAgICAgIElhbiBKYWNvYnMgPGlqQHczLm9yZz4KLQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgSFRNTCA0LjAxIGlzIGF2YWlsYWJsZSBhdDoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0Ci0KLQotICAgIFRoZSBIVE1MIDQuMDEgc3BlY2lmaWNhdGlvbiBpbmNsdWRlcyBhZGRpdGlvbmFsCi0gICAgc3ludGFjdGljIGNvbnN0cmFpbnRzIHRoYXQgY2Fubm90IGJlIGV4cHJlc3NlZCB3aXRoaW4KLSAgICB0aGUgRFREcy4KLQotLS0+Ci08IS0tCi0gICAgVHlwaWNhbCB1c2FnZToKLQotICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgLi4uCi0gICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLQotICAgIFRoZSBVUkkgdXNlZCBhcyBhIHN5c3RlbSBpZGVudGlmaWVyIHdpdGggdGhlIHB1YmxpYyBpZGVudGlmaWVyIGFsbG93cwotICAgIHRoZSB1c2VyIGFnZW50IHRvIGRvd25sb2FkIHRoZSBEVEQgYW5kIGVudGl0eSBzZXRzIGFzIG5lZWRlZC4KLQotICAgIFRoZSBGUEkgZm9yIHRoZSBUcmFuc2l0aW9uYWwgSFRNTCA0LjAxIERURCBpczoKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0KLSAgICBUaGlzIHZlcnNpb24gb2YgdGhlIHRyYW5zaXRpb25hbCBEVEQgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQKLQotICAgIElmIHlvdSBhcmUgd3JpdGluZyBhIGRvY3VtZW50IHRoYXQgaW5jbHVkZXMgZnJhbWVzLCB1c2UgCi0gICAgdGhlIGZvbGxvd2luZyBGUEk6Ci0KLSAgICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0KLSAgICBUaGlzIHZlcnNpb24gb2YgdGhlIGZyYW1lc2V0IERURCBpczoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2ZyYW1lc2V0LmR0ZAotCi0gICAgVXNlIHRoZSBmb2xsb3dpbmcgKHJlbGF0aXZlKSBVUklzIHRvIHJlZmVyIHRvIAotICAgIHRoZSBEVERzIGFuZCBlbnRpdHkgZGVmaW5pdGlvbnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uOgotCi0gICAgInN0cmljdC5kdGQiCi0gICAgImxvb3NlLmR0ZCIKLSAgICAiZnJhbWVzZXQuZHRkIgotICAgICJIVE1MbGF0MS5lbnQiCi0gICAgIkhUTUxzeW1ib2wuZW50IgotICAgICJIVE1Mc3BlY2lhbC5lbnQiCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBGZWF0dXJlIFN3aXRjaCBmb3IgZnJhbWVzZXQgZG9jdW1lbnRzIC0tPgotPCFFTlRJVFkgJSBIVE1MLkZyYW1lc2V0ICJJR05PUkUiPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSIKLSAgICAtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSIKLSAgICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIgotICAgIC0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIgotICAgIC0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTkFNRSIKLSAgICAtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIgotICAgIC0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSIKLSAgICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSIKLSAgICAtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIgotICAgIC0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLAotICAgICAgIHNlZSBbVVJJXQotICAgIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSIgLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSIgLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiIC0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLQotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLQotCi08IS0tIFBhcmFtZXRlciBFbnRpdGllcyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLSByZXBlYXRhYmxlIGhlYWQgZWxlbWVudHMgLS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiSDF8SDJ8SDN8SDR8SDV8SDYiPgotCi08IUVOVElUWSAlIGxpc3QgIlVMIHwgT0wiPgotCi08IUVOVElUWSAlIHByZWZvcm1hdHRlZCAiUFJFIj4KLQotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4xLy9FTi8vSFRNTCIKLSAgICJIVE1MbGF0MS5lbnQiPgotJUhUTUxsYXQxOwotCi08IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzLy9FTi8vSFRNTCIKLSAgICJIVE1Mc3ltYm9sLmVudCI+Ci0lSFRNTHN5bWJvbDsKLQotPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwvL0VOLy9IVE1MIgotICAgIkhUTUxzcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgLS0KLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQgIC0tIGFzc29jaWF0ZWQgc3R5bGUgaW5mbyAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBpMThuCi0gImxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNJTVBMSUVEICAtLSBkaXJlY3Rpb24gZm9yIHdlYWsvbmV1dHJhbCB0ZXh0IC0tIgotICA+Ci0KLTwhRU5USVRZICUgZXZlbnRzCi0gIm9uY2xpY2sgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBjbGlja2VkIC0tCi0gIG9uZGJsY2xpY2sgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBkb3VibGUgY2xpY2tlZC0tCi0gIG9ubW91c2Vkb3duICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBwcmVzc2VkIGRvd24gLS0KLSAgb25tb3VzZXVwICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHJlbGVhc2VkIC0tCi0gIG9ubW91c2VvdmVyICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgd2FzIG1vdmVkIG9udG8gLS0KLSAgb25tb3VzZW1vdmUgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgd2l0aGluIC0tCi0gIG9ubW91c2VvdXQgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgd2FzIG1vdmVkIGF3YXkgLS0KLSAgb25rZXlwcmVzcyAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEga2V5IHdhcyBwcmVzc2VkIGFuZCByZWxlYXNlZCAtLQotICBvbmtleWRvd24gICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgZG93biAtLQotICBvbmtleXVwICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHJlbGVhc2VkIC0tIgotICA+Ci0KLTwhLS0gUmVzZXJ2ZWQgRmVhdHVyZSBTd2l0Y2ggLS0+Ci08IUVOVElUWSAlIEhUTUwuUmVzZXJ2ZWQgIklHTk9SRSI+Ci0KLTwhLS0gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLT4KLTwhWyAlSFRNTC5SZXNlcnZlZDsgWwotPCFFTlRJVFkgJSByZXNlcnZlZAotICJkYXRhc3JjICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gYSBzaW5nbGUgb3IgdGFidWxhciBEYXRhIFNvdXJjZSAtLQotICBkYXRhZmxkICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gdGhlIHByb3BlcnR5IG9yIGNvbHVtbiBuYW1lIC0tCi0gIGRhdGFmb3JtYXRhcyAocGxhaW50ZXh0fGh0bWwpIHBsYWludGV4dCAtLSB0ZXh0IG9yIGh0bWwgLS0iCi0gID4KLV1dPgotCi08IUVOVElUWSAlIHJlc2VydmVkICIiPgotCi08IUVOVElUWSAlIGF0dHJzICIlY29yZWF0dHJzOyAlaTE4bjsgJWV2ZW50czsiPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlCi0gIlRUIHwgSSB8IEIgfCBCSUcgfCBTTUFMTCI+Ci0KLTwhRU5USVRZICUgcGhyYXNlICJFTSB8IFNUUk9ORyB8IERGTiB8IENPREUgfAotICAgICAgICAgICAgICAgICAgIFNBTVAgfCBLQkQgfCBWQVIgfCBDSVRFIHwgQUJCUiB8IEFDUk9OWU0iID4KLQotPCFFTlRJVFkgJSBzcGVjaWFsCi0gICAiQSB8IElNRyB8IE9CSkVDVCB8IEJSIHwgU0NSSVBUIHwgTUFQIHwgUSB8IFNVQiB8IFNVUCB8IFNQQU4gfCBCRE8iPgotCi08IUVOVElUWSAlIGZvcm1jdHJsICJJTlBVVCB8IFNFTEVDVCB8IFRFWFRBUkVBIHwgTEFCRUwgfCBCVVRUT04iPgotCi08IS0tICVpbmxpbmU7IGNvdmVycyBpbmxpbmUgb3IgInRleHQtbGV2ZWwiIGVsZW1lbnRzIC0tPgotPCFFTlRJVFkgJSBpbmxpbmUgIiNQQ0RBVEEgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJXNwZWNpYWw7IHwgJWZvcm1jdHJsOyI+Ci0KLTwhRUxFTUVOVCAoJWZvbnRzdHlsZTt8JXBocmFzZTspIC0gLSAoJWlubGluZTspKj4KLTwhQVRUTElTVCAoJWZvbnRzdHlsZTt8JXBocmFzZTspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCAoU1VCfFNVUCkgLSAtICglaW5saW5lOykqICAgIC0tIHN1YnNjcmlwdCwgc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1QgKFNVQnxTVVApCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBTUEFOIC0gLSAoJWlubGluZTspKiAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIFNQQU4KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVyZXNlcnZlZDsJCQkgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgQkRPIC0gLSAoJWlubGluZTspKiAgICAgICAgICAtLSBJMThOIEJpRGkgb3Zlci1yaWRlIC0tPgotPCFBVFRMSVNUIEJETwotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgbGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI1JFUVVJUkVEIC0tIGRpcmVjdGlvbmFsaXR5IC0tCi0gID4KLQotCi08IUVMRU1FTlQgQlIgLSBPIEVNUFRZICAgICAgICAgICAgICAgICAtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBCUgotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEhUTUwgY29udGVudCBtb2RlbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICAgSFRNTCBoYXMgdHdvIGJhc2ljIGNvbnRlbnQgbW9kZWxzOgotCi0gICAgICAgICVpbmxpbmU7ICAgICBjaGFyYWN0ZXIgbGV2ZWwgZWxlbWVudHMgYW5kIHRleHQgc3RyaW5ncwotICAgICAgICAlYmxvY2s7ICAgICAgYmxvY2stbGlrZSBlbGVtZW50cyBlLmcuIHBhcmFncmFwaHMgYW5kIGxpc3RzCi0tLT4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAiUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBOT1NDUklQVCB8Ci0gICAgICBCTE9DS1FVT1RFIHwgRk9STSB8IEhSIHwgVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MiPgotCi08IUVOVElUWSAlIGZsb3cgIiVibG9jazsgfCAlaW5saW5lOyI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IERvY3VtZW50IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCT0RZIE8gTyAoJWJsb2NrO3xTQ1JJUFQpKyArKElOU3xERUwpIC0tIGRvY3VtZW50IGJvZHkgLS0+Ci08IUFUVExJU1QgQk9EWQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgb25sb2FkICAgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQgIC0tIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBsb2FkZWQgLS0KLSAgb251bmxvYWQgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQgIC0tIHRoZSBkb2N1bWVudCBoYXMgYmVlbiByZW1vdmVkIC0tCi0gID4KLQotPCFFTEVNRU5UIEFERFJFU1MgLSAtICglaW5saW5lOykqIC0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLTwhQVRUTElTVCBBRERSRVNTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBESVYgLSAtICglZmxvdzspKiAgICAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIERJVgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci08IUVOVElUWSAlIENvb3JkcyAiQ0RBVEEiIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0+Ci0KLTwhRUxFTUVOVCBBIC0gLSAoJWlubGluZTspKiAtKEEpICAgICAgIC0tIGFuY2hvciAtLT4KLTwhQVRUTElTVCBBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IGNvbnRlbnQgdHlwZSAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZWQgbGluayBlbmQgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSB3aXRoIGNsaWVudC1zaWRlIGltYWdlIG1hcHMgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgTUFQIC0gLSAoKCVibG9jazspIHwgQVJFQSkrIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLT4KLTwhQVRUTElTVCBNQVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgcmVmZXJlbmNlIGJ5IHVzZW1hcCAtLQotICA+Ci0KLTwhRUxFTUVOVCBBUkVBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCBhcmVhIC0tPgotPCFBVFRMSVNUIEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBjb250cm9scyBpbnRlcnByZXRhdGlvbiBvZiBjb29yZHMgLS0KLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIG5vaHJlZiAgICAgIChub2hyZWYpICAgICAgICNJTVBMSUVEICAtLSB0aGlzIHJlZ2lvbiBoYXMgbm8gYWN0aW9uIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIExJTksgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgUmVsYXRpb25zaGlwIHZhbHVlcyBjYW4gYmUgdXNlZCBpbiBwcmluY2lwbGU6Ci0KLSAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cyB3aGVuIHVzZWQKLSAgICAgIHdpdGggdGhlIExJTksgZWxlbWVudCBpbiBkb2N1bWVudCBoZWFkIGUuZy4KLSAgICAgICAgc3RhcnQsIGNvbnRlbnRzLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9c3R5bGVzaGVldCkKLSAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9c2NyaXB0KQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIHBvc3RzY3JpcHQgb3IgcGRmIHZlcnNpb24gKHJlbD1hbHRlcm5hdGUgbWVkaWE9cHJpbnQpCi0tLT4KLQotPCFFTEVNRU5UIExJTksgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gYSBtZWRpYS1pbmRlcGVuZGVudCBsaW5rIC0tPgotPCFBVFRMSVNUIExJTksKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IGNvbnRlbnQgdHlwZSAtLQotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gZm9yd2FyZCBsaW5rIHR5cGVzIC0tCi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSByZXZlcnNlIGxpbmsgdHlwZXMgLS0KLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQgIC0tIGZvciByZW5kZXJpbmcgb24gdGhlc2UgbWVkaWEgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGluIHN0cmljdCBEVEQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIiAtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSIgLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRU5USVRZICUgTXVsdGlMZW5ndGhzICJDREFUQSIgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgTXVsdGlMZW5ndGggLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSBQaXhlbHMgIkNEQVRBIiAtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotCi0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgCi0gICB0byBtYWtlIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSAKLSAgIHRvIHVzZXJzIG9mIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlCi0gICBhIGRlc2NyaXB0aW9uIHdpdGggQUxULCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcyAtLT4KLTwhRUxFTUVOVCBJTUcgLSBPIEVNUFRZICAgICAgICAgICAgICAgIC0tIEVtYmVkZGVkIGltYWdlIC0tPgotPCFBVFRMSVNUIElNRwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSBvZiBpbWFnZSB0byBlbWJlZCAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgdG8gbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRzIGFsdCkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgaW1hZ2UgZm9yIHNjcmlwdGluZyAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSB3aWR0aCAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICA+Ci0KLTwhLS0gVVNFTUFQIHBvaW50cyB0byBhIE1BUCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT0JKRUNUID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9CSkVDVCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzIAotICBQQVJBTSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBTR01MIG1peGVkIGNvbnRlbnQKLSAgbW9kZWwgdGVjaG5pY2FsaXR5IHByZWNsdWRlcyBzcGVjaWZ5aW5nIHRoaXMgZm9ybWFsbHkgLi4uCi0tLT4KLQotPCFFTEVNRU5UIE9CSkVDVCAtIC0gKFBBUkFNIHwgJWZsb3c7KSoKLSAtLSBnZW5lcmljIGVtYmVkZGVkIG9iamVjdCAtLT4KLTwhQVRUTElTVCBPQkpFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVEICAtLSBkZWNsYXJlIGJ1dCBkb24ndCBpbnN0YW50aWF0ZSBmbGFnIC0tCi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpZGVudGlmaWVzIGFuIGltcGxlbWVudGF0aW9uIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBiYXNlIFVSSSBmb3IgY2xhc3NpZCwgZGF0YSwgYXJjaGl2ZS0tCi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZWZlcmVuY2UgdG8gb2JqZWN0J3MgZGF0YSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciBkYXRhIC0tCi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGNvZGUgLS0KLSAgYXJjaGl2ZSAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgLS0KLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIG1lc3NhZ2UgdG8gc2hvdyB3aGlsZSBsb2FkaW5nIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIHdpZHRoIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBQQVJBTSAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIG5hbWVkIHByb3BlcnR5IHZhbHVlIC0tPgotPCFBVFRMSVNUIFBBUkFNCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gcHJvcGVydHkgbmFtZSAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcHJvcGVydHkgdmFsdWUgLS0KLSAgdmFsdWV0eXBlICAgKERBVEF8UkVGfE9CSkVDVCkgREFUQSAgIC0tIEhvdyB0byBpbnRlcnByZXQgdmFsdWUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdmFsdWV0eXBlPXJlZiAtLQotICA+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEhSIC0gTyBFTVBUWSAtLSBob3Jpem9udGFsIHJ1bGUgLS0+Ci08IUFUVExJU1QgSFIKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFAgLSBPICglaW5saW5lOykqICAgICAgICAgICAgLS0gcGFyYWdyYXBoIC0tPgotPCFBVFRMSVNUIFAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIEgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIEg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgKCVoZWFkaW5nOykgIC0gLSAoJWlubGluZTspKiAtLSBoZWFkaW5nIC0tPgotPCFBVFRMSVNUICglaGVhZGluZzspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgbWFya3VwIGZvciBpbWFnZXMgYW5kIGNoYW5nZXMgaW4gZm9udCBzaXplIC0tPgotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8T0JKRUNUfEJJR3xTTUFMTHxTVUJ8U1VQIj4KLQotPCFFTEVNRU5UIFBSRSAtIC0gKCVpbmxpbmU7KSogLSglcHJlLmV4Y2x1c2lvbjspIC0tIHByZWZvcm1hdHRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIFBSRQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUSAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIFEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQkxPQ0tRVU9URSAtIC0gKCVibG9jazt8U0NSSVBUKSsgLS0gbG9uZyBxdW90YXRpb24gLS0+Ci08IUFUVExJU1QgQkxPQ0tRVU9URQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3Igc291cmNlIGRvY3VtZW50IG9yIG1zZyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQotPCEtLSBJTlMvREVMIGFyZSBoYW5kbGVkIGJ5IGluY2x1c2lvbiBvbiBCT0RZIC0tPgotPCFFTEVNRU5UIChJTlN8REVMKSAtIC0gKCVmbG93OykqICAgICAgLS0gaW5zZXJ0ZWQgdGV4dCwgZGVsZXRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIChJTlN8REVMKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGluZm8gb24gcmVhc29uIGZvciBjaGFuZ2UgLS0KLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQgIC0tIGRhdGUgYW5kIHRpbWUgb2YgY2hhbmdlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gTGlzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBkZWZpbml0aW9uIGxpc3RzIC0gRFQgZm9yIHRlcm0sIEREIGZvciBpdHMgZGVmaW5pdGlvbiAtLT4KLQotPCFFTEVNRU5UIERMIC0gLSAoRFR8REQpKyAgICAgICAgICAgICAgLS0gZGVmaW5pdGlvbiBsaXN0IC0tPgotPCFBVFRMSVNUIERMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBEVCAtIE8gKCVpbmxpbmU7KSogICAgICAgICAgIC0tIGRlZmluaXRpb24gdGVybSAtLT4KLTwhRUxFTUVOVCBERCAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGRlZmluaXRpb24gZGVzY3JpcHRpb24gLS0+Ci08IUFUVExJU1QgKERUfEREKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi0KLTwhRUxFTUVOVCBPTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIG9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBPTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tIFVub3JkZXJlZCBMaXN0cyAoVUwpIGJ1bGxldCBzdHlsZXMgLS0+Ci08IUVMRU1FTlQgVUwgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSB1bm9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBVTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi0KLQotPCFFTEVNRU5UIExJIC0gTyAoJWZsb3c7KSogICAgICAgICAgICAgLS0gbGlzdCBpdGVtIC0tPgotPCFBVFRMSVNUIExJCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVMRU1FTlQgRk9STSAtIC0gKCVibG9jazt8U0NSSVBUKSsgLShGT1JNKSAtLSBpbnRlcmFjdGl2ZSBmb3JtIC0tPgotPCFBVFRMSVNUIEZPUk0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjdGlvbiAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBzZXJ2ZXItc2lkZSBmb3JtIGhhbmRsZXIgLS0KLSAgbWV0aG9kICAgICAgKEdFVHxQT1NUKSAgICAgR0VUICAgICAgIC0tIEhUVFAgbWV0aG9kIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtLS0KLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3IgZmlsZSB1cGxvYWQgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgZm9ybSBmb3Igc2NyaXB0aW5nIC0tCi0gIG9uc3VibWl0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZm9ybSB3YXMgc3VibWl0dGVkIC0tCi0gIG9ucmVzZXQgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZm9ybSB3YXMgcmVzZXQgLS0KLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQgIC0tIGxpc3Qgb2Ygc3VwcG9ydGVkIGNoYXJzZXRzIC0tCi0gID4KLQotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZCAtLT4KLTwhRUxFTUVOVCBMQUJFTCAtIC0gKCVpbmxpbmU7KSogLShMQUJFTCkgLS0gZm9ybSBmaWVsZCBsYWJlbCB0ZXh0IC0tPgotPCFBVFRMSVNUIExBQkVMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBmb3IgICAgICAgICBJRFJFRiAgICAgICAgICAjSU1QTElFRCAgLS0gbWF0Y2hlcyBmaWVsZCBJRCB2YWx1ZSAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICIoVEVYVCB8IFBBU1NXT1JEIHwgQ0hFQ0tCT1ggfAotICAgIFJBRElPIHwgU1VCTUlUIHwgUkVTRVQgfAotICAgIEZJTEUgfCBISURERU4gfCBJTUFHRSB8IEJVVFRPTikiCi0gICA+Ci0KLTwhLS0gYXR0cmlidXRlIG5hbWUgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0IGFuZCByZXNldCAtLT4KLTwhRUxFTUVOVCBJTlBVVCAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgVEVYVCAgICAgIC0tIHdoYXQga2luZCBvZiB3aWRnZXQgaXMgbmVlZGVkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBTcGVjaWZ5IGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIC0tCi0gIGNoZWNrZWQgICAgIChjaGVja2VkKSAgICAgICNJTVBMSUVEICAtLSBmb3IgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2sgYm94ZXMgLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRCAgLS0gZm9yIHRleHQgYW5kIHBhc3N3ZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BlY2lmaWMgdG8gZWFjaCB0eXBlIG9mIGZpZWxkIC0tCi0gIG1heGxlbmd0aCAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBtYXggY2hhcnMgZm9yIHRleHQgZmllbGRzIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBmb3IgZmllbGRzIHdpdGggaW1hZ2VzIC0tCi0gIGFsdCAgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gc29tZSB0ZXh0IHdhcyBzZWxlY3RlZCAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3IgZmlsZSB1cGxvYWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNFTEVDVCAtIC0gKE9QVEdST1VQfE9QVElPTikrIC0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBTRUxFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBmaWVsZCBuYW1lIC0tCi0gIHNpemUgICAgICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSByb3dzIHZpc2libGUgLS0KLSAgbXVsdGlwbGUgICAgKG11bHRpcGxlKSAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHQgaXMgc2luZ2xlIHNlbGVjdGlvbiAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIE9QVEdST1VQIC0gLSAoT1BUSU9OKSsgLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIE9QVEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgdXNlIGluIGhpZXJhcmNoaWNhbCBtZW51cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBPUFRJT04gLSBPICgjUENEQVRBKSAgICAgICAgIC0tIHNlbGVjdGFibGUgY2hvaWNlIC0tPgotPCFBVFRMSVNUIE9QVElPTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSBpbiBoaWVyYXJjaGljYWwgbWVudXMgLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHRzIHRvIGVsZW1lbnQgY29udGVudCAtLQotICA+Ci0KLTwhRUxFTUVOVCBURVhUQVJFQSAtIC0gKCNQQ0RBVEEpICAgICAgIC0tIG11bHRpLWxpbmUgdGV4dCBmaWVsZCAtLT4KLTwhQVRUTElTVCBURVhUQVJFQQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgTlVNQkVSICAgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgIE5VTUJFUiAgICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IS0tCi0gICNQQ0RBVEEgaXMgdG8gc29sdmUgdGhlIG1peGVkIGNvbnRlbnQgcHJvYmxlbSwKLSAgcGVyIHNwZWNpZmljYXRpb24gb25seSB3aGl0ZXNwYWNlIGlzIGFsbG93ZWQgdGhlcmUhCi0gLS0+Ci08IUVMRU1FTlQgRklFTERTRVQgLSAtICgjUENEQVRBLExFR0VORCwoJWZsb3c7KSopIC0tIGZvcm0gY29udHJvbCBncm91cCAtLT4KLTwhQVRUTElTVCBGSUVMRFNFVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgTEVHRU5EIC0gLSAoJWlubGluZTspKiAgICAgICAtLSBmaWVsZHNldCBsZWdlbmQgLS0+Ci0KLTwhQVRUTElTVCBMRUdFTkQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgPgotCi08IUVMRU1FTlQgQlVUVE9OIC0gLQotICAgICAoJWZsb3c7KSogLShBfCVmb3JtY3RybDt8Rk9STXxGSUVMRFNFVCkKLSAgICAgLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgQlVUVE9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VudCB0byBzZXJ2ZXIgd2hlbiBzdWJtaXR0ZWQgLS0KLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCAtLSBmb3IgdXNlIGFzIGZvcm0gYnV0dG9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgQk9SREVSIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgRlJBTUUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgVkFMSUdOIGF0dHJpYnV0ZS4KLQotIFRoZSB2YWx1ZSAiYm9yZGVyIiBpcyBpbmNsdWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAotIDxUQUJMRSBCT1JERVI+IHdoaWNoIHlpZWxkcyBmcmFtZT1ib3JkZXIgYW5kIGJvcmRlcj1pbXBsaWVkCi0gRm9yIDxUQUJMRSBCT1JERVI9MT4geW91IGdldCBib3JkZXI9MSBhbmQgZnJhbWU9aW1wbGllZC4gSW4gdGhpcwotIGNhc2UsIGl0IGlzIGFwcHJvcHJpYXRlIHRvIHRyZWF0IHRoaXMgYXMgZnJhbWU9Ym9yZGVyIGZvciBiYWNrd2FyZHMKLSBjb21wYXRpYmlsaXR5IHdpdGggZGVwbG95ZWQgYnJvd3NlcnMuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIFJVTEVTIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIFJVTEVTIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIEJPUkRFUiBpcyBhYnNlbnQgb3IgQk9SREVSPTAgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9JzonIC0tCi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyIC0tIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgVEFCTEUgLSAtCi0gICAgIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyk+Ci08IUVMRU1FTlQgQ0FQVElPTiAgLSAtICglaW5saW5lOykqICAgICAtLSB0YWJsZSBjYXB0aW9uIC0tPgotPCFFTEVNRU5UIFRIRUFEICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgaGVhZGVyIC0tPgotPCFFTEVNRU5UIFRGT09UICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgZm9vdGVyIC0tPgotPCFFTEVNRU5UIFRCT0RZICAgIE8gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgYm9keSAtLT4KLTwhRUxFTUVOVCBDT0xHUk9VUCAtIE8gKENPTCkqICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiBncm91cCAtLT4KLTwhRUxFTUVOVCBDT0wgICAgICAtIE8gRU1QVFkgICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiAtLT4KLTwhRUxFTUVOVCBUUiAgICAgICAtIE8gKFRIfFREKSsgICAgICAgIC0tIHRhYmxlIHJvdyAtLT4KLTwhRUxFTUVOVCAoVEh8VEQpICAtIE8gKCVmbG93OykqICAgICAgIC0tIHRhYmxlIGhlYWRlciBjZWxsLCB0YWJsZSBkYXRhIGNlbGwtLT4KLQotPCFBVFRMSVNUIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgZWxlbWVudCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHB1cnBvc2Uvc3RydWN0dXJlIGZvciBzcGVlY2ggb3V0cHV0LS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHdpZHRoIC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBjb250cm9scyBmcmFtZSB3aWR0aCBhcm91bmQgdGFibGUgLS0KLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQgIC0tIHdoaWNoIHBhcnRzIG9mIGZyYW1lIHRvIHJlbmRlciAtLQotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRCAgLS0gcnVsaW5ncyBiZXR3ZWVuIHJvd3MgYW5kIGNvbHMgLS0KLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHNwYWNpbmcgYmV0d2VlbiBjZWxscyAtLQotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyB3aXRoaW4gY2VsbHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGRhdGFwYWdlc2l6ZSBDREFUQSAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLQotPCFBVFRMSVNUIENBUFRJT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLQotQ09MR1JPVVAgZ3JvdXBzIGEgc2V0IG9mIENPTCBlbGVtZW50cy4gSXQgYWxsb3dzIHlvdSB0byBncm91cAotc2V2ZXJhbCBzZW1hbnRpY2FsbHkgcmVsYXRlZCBjb2x1bW5zIHRvZ2V0aGVyLgotLS0+Ci08IUFUVExJU1QgQ09MR1JPVVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNwYW4gICAgICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBkZWZhdWx0IG51bWJlciBvZiBjb2x1bW5zIGluIGdyb3VwIC0tCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVEICAtLSBkZWZhdWx0IHdpZHRoIGZvciBlbmNsb3NlZCBDT0xzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCEtLQotIENPTCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgV0lEVEggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgU1BBTiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIENPTCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBjb2x1bW4gZ3JvdXBzIGFuZCBwcm9wZXJ0aWVzIC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcGFuICAgICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gQ09MIGF0dHJpYnV0ZXMgYWZmZWN0IE4gY29sdW1ucyAtLQotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRCAgLS0gY29sdW1uIHdpZHRoIHNwZWNpZmljYXRpb24gLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IS0tCi0gICAgVXNlIFRIRUFEIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgVEZPT1QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgVEJPRFkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSBUQk9EWSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgKFRIRUFEfFRCT0RZfFRGT09UKSAgICAgICAgICAtLSB0YWJsZSBzZWN0aW9uIC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhQVRUTElTVCBUUiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHRhYmxlIHJvdyAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGhlYWRlcnMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJvd3xjb2x8cm93Z3JvdXB8Y29sZ3JvdXApIj4KLQotPCEtLSBUSCBpcyBmb3IgaGVhZGVycywgVEQgZm9yIGRhdGEsIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIFREIC0tPgotPCFBVFRMSVNUIChUSHxURCkgICAgICAgICAgICAgICAgICAgICAgLS0gaGVhZGVyIG9yIGRhdGEgY2VsbCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFiYnJldmlhdGlvbiBmb3IgaGVhZGVyIGNlbGwgLS0KLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlbGF0ZWQgaGVhZGVycy0tCi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVEICAtLSBsaXN0IG9mIGlkJ3MgZm9yIGhlYWRlciBjZWxscyAtLQotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRCAgLS0gc2NvcGUgY292ZXJlZCBieSBoZWFkZXIgY2VsbHMgLS0KLSAgcm93c3BhbiAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIG51bWJlciBvZiByb3dzIHNwYW5uZWQgYnkgY2VsbCAtLQotICBjb2xzcGFuICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gbnVtYmVyIG9mIGNvbHMgc3Bhbm5lZCBieSBjZWxsIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAlaGVhZC5taXNjOyBkZWZpbmVkIGVhcmxpZXIgb24gYXMgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLT4KLTwhRU5USVRZICUgaGVhZC5jb250ZW50ICJUSVRMRSAmIEJBU0U/Ij4KLQotPCFFTEVNRU5UIEhFQUQgTyBPICglaGVhZC5jb250ZW50OykgKyglaGVhZC5taXNjOykgLS0gZG9jdW1lbnQgaGVhZCAtLT4KLTwhQVRUTElTVCBIRUFECi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgcHJvZmlsZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWVkIGRpY3Rpb25hcnkgb2YgbWV0YSBpbmZvIC0tCi0gID4KLQotPCEtLSBUaGUgVElUTEUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0gICAgLS0+Ci08IUVMRU1FTlQgVElUTEUgLSAtICgjUENEQVRBKSAtKCVoZWFkLm1pc2M7KSAtLSBkb2N1bWVudCB0aXRsZSAtLT4KLTwhQVRUTElTVCBUSVRMRSAlaTE4bj4KLQotCi08IUVMRU1FTlQgQkFTRSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLTwhQVRUTElTVCBCQVNFCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBVUkkgdGhhdCBhY3RzIGFzIGJhc2UgVVJJIC0tCi0gID4KLQotPCFFTEVNRU5UIE1FVEEgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gZ2VuZXJpYyBtZXRhaW5mb3JtYXRpb24gLS0+Ci08IUFUVExJU1QgTUVUQQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyLCBmb3IgdXNlIHdpdGggY29udGVudCAtLQotICBodHRwLWVxdWl2ICBOQU1FICAgICAgICAgICAjSU1QTElFRCAgLS0gSFRUUCByZXNwb25zZSBoZWFkZXIgbmFtZSAgLS0KLSAgbmFtZSAgICAgICAgTkFNRSAgICAgICAgICAgI0lNUExJRUQgIC0tIG1ldGFpbmZvcm1hdGlvbiBuYW1lIC0tCi0gIGNvbnRlbnQgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIC0tCi0gIHNjaGVtZSAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZWxlY3QgZm9ybSBvZiBjb250ZW50IC0tCi0gID4KLQotPCFFTEVNRU5UIFNUWUxFIC0gLSAlU3R5bGVTaGVldCAgICAgICAgLS0gc3R5bGUgaW5mbyAtLT4KLTwhQVRUTElTVCBTVFlMRQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyLCBmb3IgdXNlIHdpdGggdGl0bGUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVEIC0tIGNvbnRlbnQgdHlwZSBvZiBzdHlsZSBsYW5ndWFnZSAtLQotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRCAgLS0gZGVzaWduZWQgZm9yIHVzZSB3aXRoIHRoZXNlIG1lZGlhIC0tCi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhZHZpc29yeSB0aXRsZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBTQ1JJUFQgLSAtICVTY3JpcHQ7ICAgICAgICAgIC0tIHNjcmlwdCBzdGF0ZW1lbnRzIC0tPgotPCFBVFRMSVNUIFNDUklQVAotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVEIC0tIGNvbnRlbnQgdHlwZSBvZiBzY3JpcHQgbGFuZ3VhZ2UgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgYW4gZXh0ZXJuYWwgc2NyaXB0IC0tCi0gIGRlZmVyICAgICAgIChkZWZlcikgICAgICAgICNJTVBMSUVEICAtLSBVQSBtYXkgZGVmZXIgZXhlY3V0aW9uIG9mIHNjcmlwdCAtLQotICBldmVudCAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgZm9yICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIE5PU0NSSVBUIC0gLSAoJWJsb2NrOykrCi0gIC0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci08IUFUVExJU1QgTk9TQ1JJUFQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBCT0RZIj4KLQotPCFFTEVNRU5UIEhUTUwgTyBPICglaHRtbC5jb250ZW50OykgICAgLS0gZG9jdW1lbnQgcm9vdCBlbGVtZW50IC0tPgotPCFBVFRMSVNUIEhUTUwKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICA+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvd21sMTEuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3dtbDExLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiMTJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvd21sMTEuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLTwhLS0KLVdpcmVsZXNzIE1hcmt1cCBMYW5ndWFnZSAoV01MKSBEb2N1bWVudCBUeXBlIERlZmluaXRpb24uCi0KLUNvcHlyaWdodCBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbCBGb3J1bSBMdGQuLCAxOTk4LDE5OTkuCi0gICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAotCi1XTUwgaXMgYW4gWE1MIGxhbmd1YWdlLiAgVHlwaWNhbCB1c2FnZToKLSAgIDw/eG1sIHZlcnNpb249IjEuMCI/PgotICAgPCFET0NUWVBFIHdtbCBQVUJMSUMgIi0vL1dBUEZPUlVNLy9EVEQgV01MIDEuMS8vRU4iCi0gICAgICAgICAgImh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWxfMS4xLnhtbCI+Ci0gICA8d21sPgotICAgLi4uCi0gICA8L3dtbD4KLQotVGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgV2lyZWxlc3MgCi1BcHBsaWNhdGlvbiBQcm90b2NvbCBGb3J1bSBMdGQuIHdlYiBzaXRlIGF0Ci1odHRwOi8vd3d3LndhcGZvcnVtLm9yZy9kb2NzL2NvcHlyaWdodC5odG0uCi0tLT4KLQotPCFFTlRJVFkgJSBsZW5ndGggICJDREFUQSI+ICAgIDwhLS0gWzAtOV0rIGZvciBwaXhlbHMgb3IgWzAtOV0rIiUiIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIHZkYXRhICAgIkNEQVRBIj4gICAgPCEtLSBhdHRyaWJ1dGUgdmFsdWUgcG9zc2libHkgY29udGFpbmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgcmVmZXJlbmNlcyAtLT4KLTwhRU5USVRZICUgSFJFRiAgICAiJXZkYXRhOyI+ICA8IS0tIFVSSSwgVVJMIG9yIFVSTiBkZXNpZ25hdGluZyBhIGh5cGVydGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS4gTWF5IGNvbnRhaW4gdmFyaWFibGUgcmVmZXJlbmNlcyAtLT4KLTwhRU5USVRZICUgYm9vbGVhbiAgICAgICIodHJ1ZXxmYWxzZSkiPgotPCFFTlRJVFkgJSBudW1iZXIgICJOTVRPS0VOIj4gIDwhLS0gYSBudW1iZXIsIHdpdGggZm9ybWF0IFswLTldKyAtLT4KLTwhRU5USVRZICUgY29yZWF0dHJzICAiaWQgICAgSUQgICAgICNJTVBMSUVEIAotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBDREFUQSAgI0lNUExJRUQiPgotCi0KLQotPCFFTlRJVFkgJSBlbXBoICAgICJlbSB8IHN0cm9uZyB8IGIgfCBpIHwgdSB8IGJpZyB8IHNtYWxsIj4KLTwhRU5USVRZICUgbGF5b3V0ICAiYnIiPgotCi08IUVOVElUWSAlIHRleHQgICAgICIjUENEQVRBIHwgJWVtcGg7Ij4KLQotPCEtLSBmbG93IGNvdmVycyAiY2FyZC1sZXZlbCIgZWxlbWVudHMsIHN1Y2ggYXMgdGV4dCBhbmQgaW1hZ2VzIC0tPgotPCFFTlRJVFkgJSBmbG93ICAgICAiJXRleHQ7IHwgJWxheW91dDsgfCBpbWcgfCBhbmNob3IgfCBhIHwgdGFibGUiPgotCi08IS0tIFRhc2sgdHlwZXMgLS0+Ci08IUVOVElUWSAlIHRhc2sgICAiZ28gfCBwcmV2IHwgbm9vcCB8IHJlZnJlc2giPgotCi08IS0tIE5hdmlnYXRpb24gYW5kIGV2ZW50IGVsZW1lbnRzIC0tPgotPCFFTlRJVFkgJSBuYXZlbG10cyAiZG8gfCBvbmV2ZW50Ij4KLQotPCEtLT09PT09PT09PT09PT09PT0gRGVja3MgYW5kIENhcmRzID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHdtbCAoIGhlYWQ/LCB0ZW1wbGF0ZT8sIGNhcmQrICk+Ci08IUFUVExJU1Qgd21sCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS0gY2FyZCBpbnRyaW5zaWMgZXZlbnRzIC0tPgotPCFFTlRJVFkgJSBjYXJkZXYKLSAib25lbnRlcmZvcndhcmQgICVIUkVGOyAgICAgICAgICAjSU1QTElFRAotICBvbmVudGVyYmFja3dhcmQgJUhSRUY7ICAgICAgICAgICNJTVBMSUVECi0gIG9udGltZXIgICAgICAgICAlSFJFRjsgICAgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBjYXJkIGZpZWxkIHR5cGVzIC0tPgotPCFFTlRJVFkgJSBmaWVsZHMgICIlZmxvdzsgfCBpbnB1dCB8IHNlbGVjdCB8IGZpZWxkc2V0Ij4KLQotPCFFTEVNRU5UIGNhcmQgKG9uZXZlbnQqLCB0aW1lcj8sIChkbyB8IHApKik+Ci08IUFUVExJU1QgY2FyZAotICB0aXRsZSAgICAgICAgICAgJXZkYXRhOyAgICAgICAjSU1QTElFRAotICBuZXdjb250ZXh0ICAgICAgJWJvb2xlYW47ICAgICAiZmFsc2UiCi0gIG9yZGVyZWQgICAgICAgICAlYm9vbGVhbjsgICAgICJ0cnVlIgotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY2FyZGV2OwotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEV2ZW50IEJpbmRpbmdzID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGRvICgldGFzazspPgotPCFBVFRMSVNUIGRvCi0gIHR5cGUgICAgICAgICBDREFUQSAgICAgICAjUkVRVUlSRUQKLSAgbGFiZWwgICAgICAgICV2ZGF0YTsgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgICBOTVRPS0VOICAgICAjSU1QTElFRAotICBvcHRpb25hbCAgICAgJWJvb2xlYW47ICAgImZhbHNlIgotICB4bWw6bGFuZyAgICAgTk1UT0tFTiAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgb25ldmVudCAoJXRhc2s7KT4KLTwhQVRUTElTVCBvbmV2ZW50Ci0gIHR5cGUgICAgICAgICBDREFUQSAgICAgICAjUkVRVUlSRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEZWNrLWxldmVsIGRlY2xhcmF0aW9ucyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBoZWFkICggYWNjZXNzIHwgbWV0YSApKz4KLTwhQVRUTElTVCBoZWFkCi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHRlbXBsYXRlICglbmF2ZWxtdHM7KSo+Ci08IUFUVExJU1QgdGVtcGxhdGUKLSAgJWNhcmRldjsKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgYWNjZXNzIEVNUFRZPgotPCFBVFRMSVNUIGFjY2VzcwotICBkb21haW4gICAgICAgQ0RBVEEgICAgICAgI0lNUExJRUQKLSAgcGF0aCAgICAgICAgIENEQVRBICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIG1ldGEgRU1QVFk+Ci08IUFUVExJU1QgbWV0YQotICBodHRwLWVxdWl2ICAgICBDREFUQSAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgICAgIENEQVRBICAgICAgI0lNUExJRUQKLSAgZm9ydWEgICAgICAgICAgJWJvb2xlYW47ICAjSU1QTElFRAotICBjb250ZW50ICAgICAgICBDREFUQSAgICAgICNSRVFVSVJFRAotICBzY2hlbWUgICAgICAgICBDREFUQSAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gVGFza3MgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgZ28gKHBvc3RmaWVsZCB8IHNldHZhcikqPgotPCFBVFRMSVNUIGdvCi0gIGhyZWYgICAgICAgICAgICAlSFJFRjsgICAgICAgICAgICNSRVFVSVJFRAotICBzZW5kcmVmZXJlciAgICAgJWJvb2xlYW47ICAgICAgICJmYWxzZSIKLSAgbWV0aG9kICAgICAgICAgIChwb3N0fGdldCkgICAgICAiZ2V0IgotICBhY2NlcHQtY2hhcnNldCAgQ0RBVEEgICAgICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHByZXYgKHNldHZhcikqPgotPCFBVFRMSVNUIHByZXYKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgcmVmcmVzaCAoc2V0dmFyKSo+Ci08IUFUVExJU1QgcmVmcmVzaAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBub29wIEVNUFRZPgotPCFBVFRMSVNUIG5vb3AKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBwb3N0ZmllbGQgPT09PT09PT09PT09PT09PS0tPgotIAotPCFFTEVNRU5UIHBvc3RmaWVsZCBFTVBUWT4KLTwhQVRUTElTVCBwb3N0ZmllbGQKLSAgbmFtZSAgICAgICAgICV2ZGF0YTsgICAgICAgICAgICNSRVFVSVJFRAotICB2YWx1ZSAgICAgICAgJXZkYXRhOyAgICAgICAgICAgI1JFUVVJUkVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gdmFyaWFibGVzID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHNldHZhciBFTVBUWT4KLTwhQVRUTElTVCBzZXR2YXIKLSAgbmFtZSAgICAgICAgICV2ZGF0YTsgICAgICAgICAgICNSRVFVSVJFRAotICB2YWx1ZSAgICAgICAgJXZkYXRhOyAgICAgICAgICAgI1JFUVVJUkVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gQ2FyZCBGaWVsZHMgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgc2VsZWN0IChvcHRncm91cHxvcHRpb24pKz4KLTwhQVRUTElTVCBzZWxlY3QKLSAgdGl0bGUgICAgICAgICV2ZGF0YTsgICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgICBOTVRPS0VOICAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICAgJXZkYXRhOyAgICAgICAgICAgI0lNUExJRUQKLSAgaW5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICAgICNJTVBMSUVECi0gIGl2YWx1ZSAgICAgICAldmRhdGE7ICAgICAgICAgICAjSU1QTElFRAotICBtdWx0aXBsZSAgICAgJWJvb2xlYW47ICAgICAgICAgImZhbHNlIgotICB0YWJpbmRleCAgICAgJW51bWJlcjsgICAgICAgICAgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgIE5NVE9LRU4gICAgICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIG9wdGdyb3VwIChvcHRncm91cHxvcHRpb24pKyA+Ci08IUFUVExJU1Qgb3B0Z3JvdXAKLSAgdGl0bGUgICAgICAldmRhdGE7ICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgTk1UT0tFTiAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBvcHRpb24gKCNQQ0RBVEEgfCBvbmV2ZW50KSo+Ci08IUFUVExJU1Qgb3B0aW9uCi0gIHZhbHVlICAgICAgJXZkYXRhOyAgICAjSU1QTElFRAotICB0aXRsZSAgICAgICV2ZGF0YTsgICAgI0lNUExJRUQKLSAgb25waWNrICAgICAlSFJFRjsgICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgTk1UT0tFTiAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBpbnB1dCBFTVBUWT4KLTwhQVRUTElTVCBpbnB1dAotICBuYW1lICAgICAgIE5NVE9LRU4gICAgICAgICAgICNSRVFVSVJFRAotICB0eXBlICAgICAgICh0ZXh0fHBhc3N3b3JkKSAgICJ0ZXh0IgotICB2YWx1ZSAgICAgICV2ZGF0YTsgICAgICAgICAgICNJTVBMSUVECi0gIGZvcm1hdCAgICAgQ0RBVEEgICAgICAgICAgICAgI0lNUExJRUQKLSAgZW1wdHlvayAgICAlYm9vbGVhbjsgICAgICAgICAiZmFsc2UiCi0gIHNpemUgICAgICAgJW51bWJlcjsgICAgICAgICAgI0lNUExJRUQKLSAgbWF4bGVuZ3RoICAlbnVtYmVyOyAgICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICVudW1iZXI7ICAgICAgICAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgJXZkYXRhOyAgICAgICAgICAgI0lNUExJRUQKLSAgeG1sOmxhbmcgICBOTVRPS0VOICAgICAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBmaWVsZHNldCAoJWZpZWxkczsgfCBkbykqID4KLTwhQVRUTElTVCBmaWVsZHNldAotICB0aXRsZSAgICAgICAgICAgJXZkYXRhOyAgICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgdGltZXIgRU1QVFk+Ci08IUFUVExJU1QgdGltZXIKLSAgbmFtZSAgICAgICBOTVRPS0VOICAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICV2ZGF0YTsgICAgICAgICAgICNSRVFVSVJFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSUFsaWduICIodG9wfG1pZGRsZXxib3R0b20pIiA+Ci0KLTwhRUxFTUVOVCBpbWcgRU1QVFk+Ci08IUFUVExJU1QgaW1nCi0gIGFsdCAgICAgICAgJXZkYXRhOyAgICAgICNSRVFVSVJFRAotICBzcmMgICAgICAgICVIUkVGOyAgICAgICAjUkVRVUlSRUQKLSAgbG9jYWxzcmMgICAldmRhdGE7ICAgICAgI0lNUExJRUQKLSAgdnNwYWNlICAgICAlbGVuZ3RoOyAgICAgIjAiCi0gIGhzcGFjZSAgICAgJWxlbmd0aDsgICAgICIwIgotICBhbGlnbiAgICAgICVJQWxpZ247ICAgICAiYm90dG9tIgotICBoZWlnaHQgICAgICVsZW5ndGg7ICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICVsZW5ndGg7ICAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgIE5NVE9LRU4gICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEFuY2hvciA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBhbmNob3IgKCAjUENEQVRBIHwgYnIgfCBpbWcgfCBnbyB8IHByZXYgfCByZWZyZXNoICkqPgotPCFBVFRMSVNUIGFuY2hvcgotICB0aXRsZSAgICAgICAgJXZkYXRhOyAgICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICBOTVRPS0VOICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgYSAoICNQQ0RBVEEgfCBiciB8IGltZyApKj4KLTwhQVRUTElTVCBhCi0gIGhyZWYgICAgICAgICAlSFJFRjsgICAgICAgI1JFUVVJUkVECi0gIHRpdGxlICAgICAgICAldmRhdGE7ICAgICAgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgIE5NVE9LRU4gICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCB0YWJsZSAodHIpKz4KLTwhQVRUTElTVCB0YWJsZQotICB0aXRsZSAgICAgICAldmRhdGE7ICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgIENEQVRBICAgICAgI0lNUExJRUQKLSAgY29sdW1ucyAgICAgJW51bWJlcjsgICAjUkVRVUlSRUQKLSAgeG1sOmxhbmcgICAgTk1UT0tFTiAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCB0ciAodGQpKz4KLTwhQVRUTElTVCB0cgotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCB0ZCAoICV0ZXh0OyB8ICVsYXlvdXQ7IHwgaW1nIHwgYW5jaG9yIHwgYSApKj4KLTwhQVRUTElTVCB0ZAotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IFRleHQgbGF5b3V0IGFuZCBsaW5lIGJyZWFrcyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBlbSAgICAgKCVmbG93OykqPgotPCFBVFRMSVNUIGVtCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHN0cm9uZyAoJWZsb3c7KSo+Ci08IUFUVExJU1Qgc3Ryb25nCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGIgICAgICAoJWZsb3c7KSo+Ci08IUFUVExJU1QgYgotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBpICAgICAgKCVmbG93OykqPgotPCFBVFRMSVNUIGkKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgdSAgICAgICglZmxvdzspKj4KLTwhQVRUTElTVCB1Ci0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGJpZyAgICAoJWZsb3c7KSo+Ci08IUFUVExJU1QgYmlnCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHNtYWxsICAoJWZsb3c7KSo+Ci08IUFUVExJU1Qgc21hbGwKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVOVElUWSAlIFRBbGlnbiAiKGxlZnR8cmlnaHR8Y2VudGVyKSI+Ci08IUVOVElUWSAlIFdyYXBNb2RlICIod3JhcHxub3dyYXApIiA+Ci08IUVMRU1FTlQgcCAoJWZpZWxkczsgfCBkbykqPgotPCFBVFRMSVNUIHAKLSAgYWxpZ24gICAgICAgJVRBbGlnbjsgICAgICJsZWZ0IgotICBtb2RlICAgICAgICAlV3JhcE1vZGU7ICAgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgTk1UT0tFTiAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGJyIEVNUFRZPgotPCFBVFRMSVNUIGJyCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTlRJVFkgcXVvdCAgIiYjMzQ7Ij4gICAgIDwhLS0gcXVvdGF0aW9uIG1hcmsgLS0+Ci08IUVOVElUWSBhbXAgICAiJiMzODsjMzg7Ij4gPCEtLSBhbXBlcnNhbmQgLS0+Ci08IUVOVElUWSBhcG9zICAiJiMzOTsiPiAgICAgPCEtLSBhcG9zdHJvcGhlIC0tPgotPCFFTlRJVFkgbHQgICAgIiYjMzg7IzYwOyI+IDwhLS0gbGVzcyB0aGFuIC0tPgotPCFFTlRJVFkgZ3QgICAgIiYjNjI7Ij4gICAgIDwhLS0gZ3JlYXRlciB0aGFuIC0tPgotPCFFTlRJVFkgbmJzcCAgIiYjMTYwOyI+ICAgIDwhLS0gbm9uLWJyZWFraW5nIHNwYWNlIC0tPgotPCFFTlRJVFkgc2h5ICAgIiYjMTczOyI+ICAgIDwhLS0gc29mdCBoeXBoZW4gKGRpc2NyZXRpb25hcnkgaHlwaGVuKSAtLT4KLQotPCEtLQotQ29weXJpZ2h0IFdpcmVsZXNzIEFwcGxpY2F0aW9uIFByb3RvY29sIEZvcnVtIEx0ZC4sIDE5OTgsMTk5OS4KLSAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgCi0tLT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy93bWwxMy5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvd21sMTMuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q4NWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy93bWwxMy5kdGQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtYmFzaWMxMC1mLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1iYXNpYzEwLWYuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjNkMjVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1iYXNpYzEwLWYuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMzA4NiArMCwwIEBACi08IS0tIFhIVE1MIEJhc2ljIDEuMCBEVEQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmFzaWMxMC5kdGQgLS0+Ci0KLTwhLS0gWEhUTUwgQmFzaWMgMS4wIERURAotCi0gICAgIFRoaXMgaXMgWEhUTUwgQmFzaWMsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLQotICAgICBUaGUgRXh0ZW5zaWJsZSBIeXBlclRleHQgTWFya3VwIExhbmd1YWdlIChYSFRNTCkKLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtCi0gICAgICAgIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICAgICAgICAgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4KLSAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSAgICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGUgWEhUTUwgQmFzaWMgRFRECi0gICAgIGFuZCBpdHMgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcwotICAgICBoZXJlYnkgZ3JhbnRlZCBpbiBwZXJwZXR1aXR5LCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlCi0gICAgIGFuZCB0aGlzIHBhcmFncmFwaCBhcHBlYXIgaW4gYWxsIGNvcGllcy4gIFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlCi0gICAgIG5vIHJlcHJlc2VudGF0aW9uIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGUgRFREIGZvciBhbnkgcHVycG9zZS4KLQotICAgICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzc2VkIG9yIGltcGxpZWQgd2FycmFudHkuCi0KLSAgICAgICAgRWRpdG9yczogICAgTXVycmF5IE0uIEFsdGhlaW0gPG1haWx0bzphbHRoZWltQGVuZy5zdW4uY29tPgotICAgICAgICAgICAgICAgICAgICBQZXRlciBTdGFyayAgICAgICA8bWFpbHRvOlBldGVyLlN0YXJrQGVjcy5lcmljc3Nvbi5zZT4KLSAgICAgICAgUmV2aXNpb246ICAgJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLS0tPgotPCEtLSBUaGlzIGlzIHRoZSBkcml2ZXIgZmlsZSBmb3IgdmVyc2lvbiAxLjAgb2YgdGhlIFhIVE1MIEJhc2ljIERURC4KLQotICAgICBUaGlzIERURCBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICBQVUJMSUM6ICItLy9XM0MvL0RURCBYSFRNTCBCYXNpYyAxLjAvL0VOIgotICAgICBTWVNURU06ICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCIKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC52ZXJzaW9uICAiLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIgPgotCi08IS0tIFVzZSB0aGlzIFVSSSB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBuYW1lc3BhY2U6Ci0KLSAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCi0gICAgIFNlZSB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZSBmb3IgaW5mb3JtYXRpb24KLSAgICAgb24gdGhlIHVzZSBvZiBuYW1lc3BhY2UgcHJlZml4ZXMgaW4gdGhlIERURC4KLS0tPgotPCFFTlRJVFkgJSBOUy5wcmVmaXhlZCAiSUdOT1JFIiA+Ci08IUVOVElUWSAlIFhIVE1MLnByZWZpeCAgIiIgPgotCi08IS0tIFJlc2VydmVkIGZvciB1c2Ugd2l0aCB0aGUgWExpbmsgbmFtZXNwYWNlOgotLS0+Ci08IUVOVElUWSAlIFhMSU5LLnhtbG5zICIiID4KLTwhRU5USVRZICUgWExJTksueG1sbnMuYXR0cmliICIiID4KLQotPCEtLSBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB1c2luZyBYSFRNTCBCYXNpYyAxLjAgZGlyZWN0bHksIHVzZQotICAgICB0aGUgRlBJIGluIHRoZSBET0NUWVBFIGRlY2xhcmF0aW9uLCB3aXRoIHRoZSB4bWxucyBhdHRyaWJ1dGUKLSAgICAgb24gdGhlIGRvY3VtZW50IGVsZW1lbnQgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgbmFtZXNwYWNlOgotCi0gICAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KLSAgICAgICAgIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKLSAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtYmFzaWMveGh0bWwtYmFzaWMxMC5kdGQiID4KLSAgICAgICAgIDxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIiA+Ci0gICAgICAgICAuLi4KLSAgICAgICAgIDwvaHRtbD4KLS0tPgotCi08IS0tIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIHdpdGggZG9jdW1lbnQgcHJvZmlsZXMgLS0+Ci08IUVOVElUWSAlIFhIVE1MLnByb2ZpbGUgICIiID4KLQotPCEtLSBCaWRpcmVjdGlvbmFsIFRleHQgZmVhdHVyZXMKLSAgICAgVGhpcyBmZWF0dXJlLXRlc3QgZW50aXR5IGlzIHVzZWQgdG8gZGVjbGFyZSBlbGVtZW50cwotICAgICBhbmQgYXR0cmlidXRlcyB1c2VkIGZvciBiaWRpcmVjdGlvbmFsIHRleHQgc3VwcG9ydC4KLS0tPgotPCFFTlRJVFkgJSBYSFRNTC5iaWRpICAiSUdOT1JFIiA+Ci0KLTw/ZG9jIHR5cGU9ImRvY3R5cGUiIHJvbGU9InRpdGxlIiB7IFhIVE1MIEJhc2ljIDEuMCB9ID8+Ci0KLTwhLS0gOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kdWxlICAgIklHTk9SRSIgPgotPCFFTlRJVFkgJSB4aHRtbC1iZG8ubW9kdWxlICAgICAgIiVYSFRNTC5iaWRpOyIgPgotCi08IUVOVElUWSAlIHhodG1sLW1vZGVsLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQmFzaWMgMS4wIERvY3VtZW50IE1vZGVsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmFzaWMxMC1tb2RlbC0xLm1vZCIgPgotCi08IUVOVElUWSAlIHhodG1sLWZyYW1ld29yay5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtZnJhbWV3b3JrLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWZyYW1ld29yay0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWZyYW1ld29yay0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBNb2R1bGFyIEZyYW1ld29yawotCi0gICAgIFRoaXMgcmVxdWlyZWQgbW9kdWxlIGluc3RhbnRpYXRlcyB0aGUgbW9kdWxlcyBuZWVkZWQKLSAgICAgdG8gc3VwcG9ydCB0aGUgWEhUTUwgbW9kdWxhcml6YXRpb24gbW9kZWwsIGluY2x1ZGluZzoKLQotICAgICAgICArICBub3RhdGlvbnMKLSAgICAgICAgKyAgZGF0YXR5cGVzCi0gICAgICAgICsgIG5hbWVzcGFjZS1xdWFsaWZpZWQgbmFtZXMKLSAgICAgICAgKyAgY29tbW9uIGF0dHJpYnV0ZXMKLSAgICAgICAgKyAgZG9jdW1lbnQgbW9kZWwKLSAgICAgICAgKyAgY2hhcmFjdGVyIGVudGl0aWVzCi0KLSAgICAgVGhlIEludHJpbnNpYyBFdmVudHMgbW9kdWxlIGlzIGlnbm9yZWQgYnkgZGVmYXVsdCBidXQKLSAgICAgb2NjdXJzIGluIHRoaXMgbW9kdWxlIGJlY2F1c2UgaXQgbXVzdCBiZSBpbnN0YW50aWF0ZWQKLSAgICAgcHJpb3IgdG8gQXR0cmlidXRlcyBidXQgYWZ0ZXIgRGF0YXR5cGVzLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYXJjaC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1hcmNoLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEFyY2hpdGVjdHVyZSAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWFyY2gtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmFzZSBBcmNoaXRlY3R1cmUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYXJjaC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEFyY2hpdGVjdHVyZSAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWFyY2gtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGhpcyBvcHRpb25hbCBtb2R1bGUgaW5jbHVkZXMgZGVjbGFyYXRpb25zIHRoYXQgZW5hYmxlIFhIVE1MIHRvIGJlIHVzZWQKLSAgICAgYXMgYSBiYXNlIGFyY2hpdGVjdHVyZSBhY2NvcmRpbmcgdG8gdGhlICdBcmNoaXRlY3R1cmFsIEZvcm1zIERlZmluaXRpb24KLSAgICAgUmVxdWlyZW1lbnRzJyAoQW5uZXggQS4zLCBJU08vSUVDIDEwNzQ0LCAybmQgZWRpdGlvbikuIEZvciBtb3JlIGluZm9ybWF0aW9uCi0gICAgIG9uIHVzZSBvZiBhcmNoaXRlY3R1cmFsIGZvcm1zLCBzZWUgdGhlIEh5VGltZSB3ZWIgc2l0ZSBhdDoKLQotICAgICAgICAgaHR0cDovL3d3dy5oeXRpbWUub3JnLwotLS0+Ci0KLTw/SVMxMDc0NCBBcmNCYXNlIHhodG1sID8+Ci0KLTwhTk9UQVRJT04geGh0bWwgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIEFGRFIgQVJDQkFTRSBYSFRNTCAxLjEvL0VOIiA+Ci0KLTwhLS0gRW50aXR5IGRlY2xhcmF0aW9uIGZvciBhc3NvY2lhdGVkIEFyY2hpdGVjdHVyYWwgRFRECi0tLT4KLTwhRU5USVRZIHhodG1sLWFyY2guZHRkCi0gICAgICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIEFyY2hpdGVjdHVyZSAxLjEvL0VOIgotICAgICAgICAgICAgICJ4aHRtbDExLWFyY2guZHRkIiA+Ci0KLTw/SVMxMDc0NDphcmNoIHhodG1sCi0gICAgcHVibGljLWlkICAgICAgID0gICItLy9XM0MvL05PVEFUSU9OIEFGRFIgQVJDQkFTRSBYSFRNTCAxLjEvL0VOIgotICAgIGR0ZC1wdWJsaWMtaWQgICA9ICAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLSAgICBkdGQtc3lzdGVtLWlkICAgPSAgInhodG1sMTEuZHRkIgotICAgIGRvYy1lbGVtLWZvcm0gICA9ICAiaHRtbCIKLSAgICBmb3JtLWF0dCAgICAgICAgPSAgImh0bWwiCi0gICAgcmVuYW1lci1hdHQgICAgID0gICJodG5hbWVzIgotICAgIHN1cHByZXNzb3ItYXR0ICA9ICAiaHRzdXBwIgotICAgIGRhdGEtaWdub3JlLWF0dCA9ICAiaHRpZ24iCi0gICAgYXV0byAgICAgICAgICAgID0gICJBcmNBdXRvIgotICAgIG9wdGlvbnMgICAgICAgICA9ICAiSHRNb2RSZXEgSHRNb2RPcHQiCi0gICAgSHRNb2RSZXEgICAgICAgID0gICJGcmFtZXdvcmsgVGV4dCBIeXBlcnRleHQgTGlzdHMgU3RydWN0dXJlIgotICAgIEh0TW9kT3B0ICAgICAgICA9ICAiU3RhbmRhcmQiCi0/PgotCi08IS0tIGVuZCBvZiB4aHRtbC1hcmNoLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtbm90YXRpb25zLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW5vdGF0aW9ucy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ub3RhdGlvbnMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTlMgWEhUTUwgTm90YXRpb25zIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtbm90YXRpb25zLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIE5vdGF0aW9ucyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW5vdGF0aW9ucy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OUyBYSFRNTCBOb3RhdGlvbnMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1ub3RhdGlvbnMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTm90YXRpb25zCi0KLSAgICAgZGVmaW5lcyB0aGUgZm9sbG93aW5nIG5vdGF0aW9ucywgbWFueSBvZiB0aGVzZSBpbXBvcnRlZCBmcm9tIAotICAgICBvdGhlciBzcGVjaWZpY2F0aW9ucyBhbmQgc3RhbmRhcmRzLiBXaGVuIGFuIGV4aXN0aW5nIEZQSSBpcwotICAgICBrbm93biwgaXQgaXMgaW5jb3Jwb3JhdGVkIGhlcmUuCi0tLT4KLQotPCEtLSBYTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFNHTUwgYW5kIFhNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBXM0MgWE1MIDEuMCBSZWNvbW1lbmRhdGlvbiAtLT4KLTwhTk9UQVRJT04gdzNjLXhtbCAKLSAgICAgUFVCTElDICJJU08gODg3OS8vTk9UQVRJT04gRXh0ZW5zaWJsZSBNYXJrdXAgTGFuZ3VhZ2UgKFhNTCkgMS4wLy9FTiIgPgotCi08IS0tIFhNTCAxLjAgQ0RBVEEgLS0+Ci08IU5PVEFUSU9OIGNkYXRhIAotICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWE1MIDEuMDogQ0RBVEEvL0VOIiA+Ci0KLTwhLS0gU0dNTCBGb3JtYWwgUHVibGljIElkZW50aWZpZXJzIC0tPgotPCFOT1RBVElPTiBmcGkKLSAgICAgUFVCTElDICJJU08gODg3OToxOTg2Ly9OT1RBVElPTiBGb3JtYWwgUHVibGljIElkZW50aWZpZXIvL0VOIiA+Ci0KLTwhLS0gWEhUTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLQotPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IU5PVEFUSU9OIGxlbmd0aCAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IExlbmd0aC8vRU4iID4KLQotPCEtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzIC0tPgotPCFOT1RBVElPTiBsaW5rVHlwZXMgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMaW5rVHlwZXMvL0VOIiA+Ci0KLTwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotPCFOT1RBVElPTiBtZWRpYURlc2MgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBNZWRpYURlc2MvL0VOIiA+Ci0KLTwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotPCFOT1RBVElPTiBtdWx0aUxlbmd0aCAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE11bHRpTGVuZ3RoLy9FTiIgPgotCi08IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAoTlVNQkVSKSAtLT4KLTwhTk9UQVRJT04gbnVtYmVyIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTnVtYmVyLy9FTiIgPgotCi08IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci08IU5PVEFUSU9OIHBpeGVscyAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFBpeGVscy8vRU4iID4KLQotPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLTwhTk9UQVRJT04gc2NyaXB0IAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogU2NyaXB0Ly9FTiIgPgotCi08IS0tIHRleHR1YWwgY29udGVudCAtLT4KLTwhTk9UQVRJT04gdGV4dCAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFRleHQvL0VOIiA+Ci0KLTwhLS0gSW1wb3J0ZWQgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci08IU5PVEFUSU9OIGNoYXJhY3RlciAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJhY3Rlci8vRU4iID4KLQotPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY2hhcnNldCAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJzZXQvL0VOIiA+Ci0KLTwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjaGFyc2V0cyAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJzZXRzLy9FTiIgPgotCi08IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNvbnRlbnRUeXBlIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ29udGVudFR5cGUvL0VOIiA+Ci0KLTwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNvbnRlbnRUeXBlcyAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENvbnRlbnRUeXBlcy8vRU4iID4KLQotPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci08IU5PVEFUSU9OIGRhdGV0aW1lIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogRGF0ZXRpbWUvL0VOIiA+Ci0KLTwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzE3NjZdIC0tPgotPCFOT1RBVElPTiBsYW5ndWFnZUNvZGUgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMYW5ndWFnZUNvZGUvL0VOIiA+Ci0KLTwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbVVJJXSAtLT4KLTwhTk9UQVRJT04gdXJpIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogVVJJLy9FTiIgPgotCi08IS0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycywgc2VlIFtVUkldIC0tPgotPCFOT1RBVElPTiB1cmlzIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogVVJJcy8vRU4iID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbm90YXRpb25zLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZGF0YXR5cGVzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWRhdGF0eXBlcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1kYXRhdHlwZXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBEYXRhdHlwZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1kYXRhdHlwZXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRGF0YXR5cGVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtZGF0YXR5cGVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIERhdGF0eXBlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWRhdGF0eXBlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBEYXRhdHlwZXMKLQotICAgICBkZWZpbmVzIGNvbnRhaW5lcnMgZm9yIHRoZSBmb2xsb3dpbmcgZGF0YXR5cGVzLCBtYW55IG9mCi0gICAgIHRoZXNlIGltcG9ydGVkIGZyb20gb3RoZXIgc3BlY2lmaWNhdGlvbnMgYW5kIHN0YW5kYXJkcy4KLS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLQotPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIExlbmd0aC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzIC0tPgotPCFFTlRJVFkgJSBMaW5rVHlwZXMuZGF0YXR5cGUgIk5NVE9LRU5TIiA+Ci0KLTwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotPCFFTlRJVFkgJSBNZWRpYURlc2MuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IUVOVElUWSAlIE51bWJlci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotPCFFTlRJVFkgJSBQaXhlbHMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci08IUVOVElUWSAlIFNjcmlwdC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSB0ZXh0dWFsIGNvbnRlbnQgLS0+Ci08IUVOVElUWSAlIFRleHQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gSW1wb3J0ZWQgRGF0YXR5cGVzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci08IUVOVElUWSAlIENoYXJhY3Rlci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ2hhcnNldC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENoYXJzZXRzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENvbnRlbnRUeXBlLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotPCFFTlRJVFkgJSBEYXRldGltZS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBmb3JtYWwgcHVibGljIGlkZW50aWZpZXIsIGFzIHBlciBbSVNPODg3OV0gLS0+Ci08IUVOVElUWSAlIEZQSS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0gLS0+Ci08IUVOVElUWSAlIExhbmd1YWdlQ29kZS5kYXRhdHlwZSAiTk1UT0tFTiIgPgotCi08IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1VSSV0gLS0+Ci08IUVOVElUWSAlIFVSSS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMsIHNlZSBbVVJJXSAtLT4KLTwhRU5USVRZICUgVVJJcy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZGF0YXR5cGVzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIFhMaW5rIHN1cHBvcnQgbW9kdWxlIC0tPgotPCFFTlRJVFkgJSB4aHRtbC14bGluay5tb2QgIiIgPgotCi0KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtcW5hbWUubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtcW5hbWUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1xbmFtZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgUW5hbWUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXFuYW1lLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIFF1YWxpZmllZCBOYW1lcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLXFuYW1lLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFhIVE1MIFFuYW1lIChRdWFsaWZpZWQgTmFtZSkgTW9kdWxlCi0KLSAgICAgVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHR3byBwYXJ0cywgbGFiZWxlZCBTZWN0aW9uICdBJyBhbmQgJ0InOgotCi0gICAgICAgU2VjdGlvbiBBIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB0byBzdXBwb3J0IG5hbWVzcGFjZS0KLSAgICAgICBxdWFsaWZpZWQgbmFtZXMsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMsIGFuZCBuYW1lIHByZWZpeGluZyAKLSAgICAgICBmb3IgWEhUTUwgYW5kIGV4dGVuc2lvbnMuCi0gICAgCi0gICAgICAgU2VjdGlvbiBCIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwgWEhUTUwgZWxlbWVudCB0eXBlczoKLQotICAgICAgICAgJWFwcGxldC5xbmFtZTsgICB0aGUgeG1sbnMtcXVhbGlmaWVkIG5hbWUgZm9yIDxhcHBsZXQ+Ci0gICAgICAgICAlYmFzZS5xbmFtZTsgICAgIHRoZSB4bWxucy1xdWFsaWZpZWQgbmFtZSBmb3IgPGJhc2U+Ci0gICAgICAgICAuLi4KLQotICAgICBYSFRNTCBleHRlbnNpb25zIHdvdWxkIGNyZWF0ZSBhIG1vZHVsZSBzaW1pbGFyIHRvIHRoaXMgb25lLiAKLSAgICAgSW5jbHVkZWQgaW4gdGhlIFhIVE1MIGRpc3RyaWJ1dGlvbiBpcyBhIHRlbXBsYXRlIG1vZHVsZSAKLSAgICAgKCd0ZW1wbGF0ZS1xbmFtZS0xLm1vZCcpIHN1aXRhYmxlIGZvciB0aGlzIHB1cnBvc2UuCi0tLT4KLQotPCEtLSBTZWN0aW9uIEE6IFhIVE1MIFhNTCBOYW1lc3BhY2UgRnJhbWV3b3JrIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIDEuIERlY2xhcmUgYSAlWEhUTUwucHJlZml4ZWQ7IGNvbmRpdGlvbmFsIHNlY3Rpb24ga2V5d29yZCwgdXNlZAotICAgICAgICB0byBhY3RpdmF0ZSBuYW1lc3BhY2UgcHJlZml4aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgCi0gICAgICAgIGluaGVyaXQgJyVOUy5wcmVmaXhlZDsnIGZyb20gdGhlIERURCBkcml2ZXIsIHNvIHRoYXQgdW5sZXNzIAotICAgICAgICBvdmVycmlkZGVuLCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9sbG93cyB0aGUgb3ZlcmFsbCBEVEQgCi0gICAgICAgIHByZWZpeGluZyBzY2hlbWUuCi0tLT4KLTwhRU5USVRZICUgTlMucHJlZml4ZWQgIklHTk9SRSIgPgotPCFFTlRJVFkgJSBYSFRNTC5wcmVmaXhlZCAiJU5TLnByZWZpeGVkOyIgPgotCi08IS0tIDIuIERlY2xhcmUgYSBwYXJhbWV0ZXIgZW50aXR5IChlZy4sICVYSFRNTC54bWxuczspIGNvbnRhaW5pbmcgCi0gICAgICAgIHRoZSBVUkkgcmVmZXJlbmNlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIFhIVE1MIG5hbWVzcGFjZToKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucyAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiID4KLQotPCEtLSAzLiBEZWNsYXJlIHBhcmFtZXRlciBlbnRpdGllcyAoZWcuLCAlWEhUTUwucHJlZml4OykgY29udGFpbmluZwotICAgICAgICB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4IHN0cmluZyhzKSB0byB1c2Ugd2hlbiBwcmVmaXhpbmcgCi0gICAgICAgIGlzIGVuYWJsZWQuIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gaW4gdGhlIERURCBkcml2ZXIgb3IgdGhlCi0gICAgICAgIGludGVybmFsIHN1YnNldCBvZiBhbiBkb2N1bWVudCBpbnN0YW5jZS4gSWYgbm8gZGVmYXVsdCBwcmVmaXgKLSAgICAgICAgaXMgZGVzaXJlZCwgdGhpcyBtYXkgYmUgZGVjbGFyZWQgYXMgYW4gZW1wdHkgc3RyaW5nLgotCi0gICAgIE5PVEU6IEFzIHNwZWNpZmllZCBpbiBbWE1MTkFNRVNdLCB0aGUgbmFtZXNwYWNlIHByZWZpeCBzZXJ2ZXMgCi0gICAgIGFzIGEgcHJveHkgZm9yIHRoZSBVUkkgcmVmZXJlbmNlLCBhbmQgaXMgbm90IGluIGl0c2VsZiBzaWduaWZpY2FudC4KLS0tPgotPCFFTlRJVFkgJSBYSFRNTC5wcmVmaXggICIiID4KLQotPCEtLSA0LiBEZWNsYXJlIHBhcmFtZXRlciBlbnRpdGllcyAoZWcuLCAlWEhUTUwucGZ4OykgY29udGFpbmluZyB0aGUgCi0gICAgICAgIGNvbG9uaXplZCBwcmVmaXgoZXMpIChlZy4sICclWEhUTUwucHJlZml4OzonKSB1c2VkIHdoZW4gCi0gICAgICAgIHByZWZpeGluZyBpcyBhY3RpdmUsIGFuIGVtcHR5IHN0cmluZyB3aGVuIGl0IGlzIG5vdC4KLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgWEhUTUwucGZ4ICAiJVhIVE1MLnByZWZpeDs6IiA+Ci1dXT4KLTwhRU5USVRZICUgWEhUTUwucGZ4ICAiIiA+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgbmFtZSBleHRlbnNpb25zIGhlcmUgLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS1leHRyYS5tb2QgIiIgPgotCi0KLTwhLS0gNS4gVGhlIHBhcmFtZXRlciBlbnRpdHkgJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsgbWF5IGJlCi0gICAgICAgIHJlZGVjbGFyZWQgdG8gY29udGFpbiBhbnkgbm9uLVhIVE1MIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiAKLSAgICAgICAgYXR0cmlidXRlcyBmb3IgbmFtZXNwYWNlcyBlbWJlZGRlZCBpbiBYSFRNTC4gVGhlIGRlZmF1bHQgCi0gICAgICAgIGlzIGFuIGVtcHR5IHN0cmluZy4gIFhMaW5rIHNob3VsZCBiZSBpbmNsdWRlZCBoZXJlIGlmIHVzZWQgCi0gICAgICAgIGluIHRoZSBEVEQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliICIiID4KLQotPCEtLSBUaGUgcmVtYWluZGVyIG9mIFNlY3Rpb24gQSBpcyBvbmx5IGZvbGxvd2VkIGluIFhIVE1MLCBub3QgZXh0ZW5zaW9ucy4gLS0+Ci0KLTwhLS0gRGVjbGFyZSBhIHBhcmFtZXRlciBlbnRpdHkgJU5TLmRlY2wuYXR0cmliOyBjb250YWluaW5nCi0gICAgIGFsbCBYTUwgTmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB1c2VkIGluIHRoZSBEVEQsIHBsdXMgdGhlCi0gICAgIHhtbG5zIGRlY2xhcmF0aW9uIGZvciBYSFRNTCwgaXRzIGZvcm0gZGVwZW5kZW50IG9uIHdoZXRoZXIgCi0gICAgIHByZWZpeGluZyBpcyBhY3RpdmUuIAotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBOUy5kZWNsLmF0dHJpYgotICAgICAieG1sbnM6JVhIVE1MLnByZWZpeDsgICVVUkkuZGF0YXR5cGU7ICAgI0ZJWEVEICclWEhUTUwueG1sbnM7JwotICAgICAgJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsiCi0+Ci1dXT4KLTwhRU5USVRZICUgTlMuZGVjbC5hdHRyaWIKLSAgICAgIiVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IgotPgotCi08IS0tIFRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgZnV0dXJlIFhMaW5rIHN1cHBvcnQuCi0tLT4KLTwhRU5USVRZICUgWExJTksueG1sbnMuYXR0cmliICIiID4KLQotPCEtLSBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAlTlMuZGVjbC5hdHRyaWI7IGNvbnRhaW5pbmcgYWxsIAotICAgICBYTUwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZXMgdXNlZCBieSBYSFRNTCwgaW5jbHVkaW5nCi0gICAgIGEgZGVmYXVsdCB4bWxucyBhdHRyaWJ1dGUgd2hlbiBwcmVmaXhpbmcgaXMgaW5hY3RpdmUuCi0tLT4KLTwhWyVYSFRNTC5wcmVmaXhlZDtbCi08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmF0dHJpYgotICAgICAiJU5TLmRlY2wuYXR0cmliOwotICAgICAgJVhMSU5LLnhtbG5zLmF0dHJpYjsiCi0+Ci1dXT4KLTwhRU5USVRZICUgWEhUTUwueG1sbnMuYXR0cmliCi0gICAgICJ4bWxucyAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNGSVhFRCAnJVhIVE1MLnhtbG5zOycKLSAgICAgICVYTElOSy54bWxucy5hdHRyaWI7IgotPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBxdWFsaWZpZWQgbmFtZSByZWRlY2xhcmF0aW9ucyAtLT4KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUucmVkZWNsICIiID4KLQotCi08IS0tIFNlY3Rpb24gQjogWEhUTUwgUXVhbGlmaWVkIE5hbWVzIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIDYuIFRoaXMgc2VjdGlvbiBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdXNlZCB0byBwcm92aWRlCi0gICAgICAgIG5hbWVzcGFjZS1xdWFsaWZpZWQgbmFtZXMgZm9yIGFsbCBYSFRNTCBlbGVtZW50IHR5cGVzLgotLS0+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYXBwbGV0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBhcHBsZXQucW5hbWUgICIlWEhUTUwucGZ4O2FwcGxldCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJhc2UtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGJhc2UucW5hbWUgICAgIiVYSFRNTC5wZng7YmFzZSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJkby0xLm1vZCAtLT4KLTwhRU5USVRZICUgYmRvLnFuYW1lICAgICAiJVhIVE1MLnBmeDtiZG8iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtwaHJhcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgYWRkcmVzcy5xbmFtZSAiJVhIVE1MLnBmeDthZGRyZXNzIiA+Ci08IUVOVElUWSAlIGJsb2NrcXVvdGUucW5hbWUgICIlWEhUTUwucGZ4O2Jsb2NrcXVvdGUiID4KLTwhRU5USVRZICUgcHJlLnFuYW1lICAgICAiJVhIVE1MLnBmeDtwcmUiID4KLTwhRU5USVRZICUgaDEucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMSIgPgotPCFFTlRJVFkgJSBoMi5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gyIiA+Ci08IUVOVElUWSAlIGgzLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDMiID4KLTwhRU5USVRZICUgaDQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNCIgPgotPCFFTlRJVFkgJSBoNS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g1IiA+Ci08IUVOVElUWSAlIGg2LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDYiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtwcmVzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBoci5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2hyIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBkaXYucW5hbWUgICAgICIlWEhUTUwucGZ4O2RpdiIgPgotPCFFTlRJVFkgJSBwLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O3AiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1lZGl0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBpbnMucW5hbWUgICAgICIlWEhUTUwucGZ4O2lucyIgPgotPCFFTlRJVFkgJSBkZWwucW5hbWUgICAgICIlWEhUTUwucGZ4O2RlbCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWZvcm0tMS5tb2QgLS0+Ci08IUVOVElUWSAlIGZvcm0ucW5hbWUgICAgIiVYSFRNTC5wZng7Zm9ybSIgPgotPCFFTlRJVFkgJSBsYWJlbC5xbmFtZSAgICIlWEhUTUwucGZ4O2xhYmVsIiA+Ci08IUVOVElUWSAlIGlucHV0LnFuYW1lICAgIiVYSFRNTC5wZng7aW5wdXQiID4KLTwhRU5USVRZICUgc2VsZWN0LnFuYW1lICAiJVhIVE1MLnBmeDtzZWxlY3QiID4KLTwhRU5USVRZICUgb3B0Z3JvdXAucW5hbWUgICIlWEhUTUwucGZ4O29wdGdyb3VwIiA+Ci08IUVOVElUWSAlIG9wdGlvbi5xbmFtZSAgIiVYSFRNTC5wZng7b3B0aW9uIiA+Ci08IUVOVElUWSAlIHRleHRhcmVhLnFuYW1lICAiJVhIVE1MLnBmeDt0ZXh0YXJlYSIgPgotPCFFTlRJVFkgJSBmaWVsZHNldC5xbmFtZSAgIiVYSFRNTC5wZng7ZmllbGRzZXQiID4KLTwhRU5USVRZICUgbGVnZW5kLnFuYW1lICAiJVhIVE1MLnBmeDtsZWdlbmQiID4KLTwhRU5USVRZICUgYnV0dG9uLnFuYW1lICAiJVhIVE1MLnBmeDtidXR0b24iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1oeXBlcnRleHQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGEucW5hbWUgICAgICAgIiVYSFRNTC5wZng7YSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWltYWdlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBpbWcucW5hbWUgICAgICIlWEhUTUwucGZ4O2ltZyIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHBocmFzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBhYmJyLnFuYW1lICAgICIlWEhUTUwucGZ4O2FiYnIiID4KLTwhRU5USVRZICUgYWNyb255bS5xbmFtZSAiJVhIVE1MLnBmeDthY3JvbnltIiA+Ci08IUVOVElUWSAlIGNpdGUucW5hbWUgICAgIiVYSFRNTC5wZng7Y2l0ZSIgPgotPCFFTlRJVFkgJSBjb2RlLnFuYW1lICAgICIlWEhUTUwucGZ4O2NvZGUiID4KLTwhRU5USVRZICUgZGZuLnFuYW1lICAgICAiJVhIVE1MLnBmeDtkZm4iID4KLTwhRU5USVRZICUgZW0ucW5hbWUgICAgICAiJVhIVE1MLnBmeDtlbSIgPgotPCFFTlRJVFkgJSBrYmQucW5hbWUgICAgICIlWEhUTUwucGZ4O2tiZCIgPgotPCFFTlRJVFkgJSBxLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O3EiID4KLTwhRU5USVRZICUgc2FtcC5xbmFtZSAgICAiJVhIVE1MLnBmeDtzYW1wIiA+Ci08IUVOVElUWSAlIHN0cm9uZy5xbmFtZSAgIiVYSFRNTC5wZng7c3Ryb25nIiA+Ci08IUVOVElUWSAlIHZhci5xbmFtZSAgICAgIiVYSFRNTC5wZng7dmFyIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5scHJlcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgYi5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtiIiA+Ci08IUVOVElUWSAlIGJpZy5xbmFtZSAgICAgIiVYSFRNTC5wZng7YmlnIiA+Ci08IUVOVElUWSAlIGkucW5hbWUgICAgICAgIiVYSFRNTC5wZng7aSIgPgotPCFFTlRJVFkgJSBzbWFsbC5xbmFtZSAgICIlWEhUTUwucGZ4O3NtYWxsIiA+Ci08IUVOVElUWSAlIHN1Yi5xbmFtZSAgICAgIiVYSFRNTC5wZng7c3ViIiA+Ci08IUVOVElUWSAlIHN1cC5xbmFtZSAgICAgIiVYSFRNTC5wZng7c3VwIiA+Ci08IUVOVElUWSAlIHR0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7dHQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGJyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7YnIiID4KLTwhRU5USVRZICUgc3Bhbi5xbmFtZSAgICAiJVhIVE1MLnBmeDtzcGFuIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaXNtYXAtMS5tb2QgKGFsc28gY3Npc21hcCwgc3Npc21hcCkgLS0+Ci08IUVOVElUWSAlIG1hcC5xbmFtZSAgICAgIiVYSFRNTC5wZng7bWFwIiA+Ci08IUVOVElUWSAlIGFyZWEucW5hbWUgICAgIiVYSFRNTC5wZng7YXJlYSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWxpbmstMS5tb2QgLS0+Ci08IUVOVElUWSAlIGxpbmsucW5hbWUgICAgIiVYSFRNTC5wZng7bGluayIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWxpc3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGRsLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZGwiID4KLTwhRU5USVRZICUgZHQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkdCIgPgotPCFFTlRJVFkgJSBkZC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2RkIiA+Ci08IUVOVElUWSAlIG9sLnFuYW1lICAgICAgIiVYSFRNTC5wZng7b2wiID4KLTwhRU5USVRZICUgdWwucW5hbWUgICAgICAiJVhIVE1MLnBmeDt1bCIgPgotPCFFTlRJVFkgJSBsaS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2xpIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbWV0YS0xLm1vZCAtLT4KLTwhRU5USVRZICUgbWV0YS5xbmFtZSAgICAiJVhIVE1MLnBmeDttZXRhIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtcGFyYW0tMS5tb2QgLS0+Ci08IUVOVElUWSAlIHBhcmFtLnFuYW1lICAgIiVYSFRNTC5wZng7cGFyYW0iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1vYmplY3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIG9iamVjdC5xbmFtZSAgIiVYSFRNTC5wZng7b2JqZWN0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc2NyaXB0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBzY3JpcHQucW5hbWUgICIlWEhUTUwucGZ4O3NjcmlwdCIgPgotPCFFTlRJVFkgJSBub3NjcmlwdC5xbmFtZSAgIiVYSFRNTC5wZng7bm9zY3JpcHQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGh0bWwucW5hbWUgICAgIiVYSFRNTC5wZng7aHRtbCIgPgotPCFFTlRJVFkgJSBoZWFkLnFuYW1lICAgICIlWEhUTUwucGZ4O2hlYWQiID4KLTwhRU5USVRZICUgdGl0bGUucW5hbWUgICAiJVhIVE1MLnBmeDt0aXRsZSIgPgotPCFFTlRJVFkgJSBib2R5LnFuYW1lICAgICIlWEhUTUwucGZ4O2JvZHkiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zdHlsZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgc3R5bGUucW5hbWUgICAiJVhIVE1MLnBmeDtzdHlsZSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXRhYmxlLTEubW9kIC0tPgotPCFFTlRJVFkgJSB0YWJsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3RhYmxlIiA+Ci08IUVOVElUWSAlIGNhcHRpb24ucW5hbWUgIiVYSFRNTC5wZng7Y2FwdGlvbiIgPgotPCFFTlRJVFkgJSB0aGVhZC5xbmFtZSAgICIlWEhUTUwucGZ4O3RoZWFkIiA+Ci08IUVOVElUWSAlIHRmb290LnFuYW1lICAgIiVYSFRNTC5wZng7dGZvb3QiID4KLTwhRU5USVRZICUgdGJvZHkucW5hbWUgICAiJVhIVE1MLnBmeDt0Ym9keSIgPgotPCFFTlRJVFkgJSBjb2xncm91cC5xbmFtZSAgIiVYSFRNTC5wZng7Y29sZ3JvdXAiID4KLTwhRU5USVRZICUgY29sLnFuYW1lICAgICAiJVhIVE1MLnBmeDtjb2wiID4KLTwhRU5USVRZICUgdHIucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0ciIgPgotPCFFTlRJVFkgJSB0aC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RoIiA+Ci08IUVOVElUWSAlIHRkLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dGQiID4KLQotCi08IS0tIFByb3Zpc2lvbmFsIFhIVE1MIDIuMCBRdWFsaWZpZWQgTmFtZXMgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW1hZ2UtMi5tb2QgLS0+Ci08IUVOVElUWSAlIGFsdC5xbmFtZSAgICAgIiVYSFRNTC5wZng7YWx0IiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXFuYW1lLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZHVsZSAiSUdOT1JFIiA+Ci08IVsleGh0bWwtZXZlbnRzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWV2ZW50cy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIEludHJpbnNpYyBFdmVudHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ldmVudHMtMS5tb2QiID4KLSV4aHRtbC1ldmVudHMubW9kO11dPgotCi08IUVOVElUWSAlIHhodG1sLWF0dHJpYnMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYXR0cmlicy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1hdHRyaWJzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1hdHRyaWJzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWF0dHJpYnMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1hdHRyaWJzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIENvbW1vbiBBdHRyaWJ1dGVzCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgbWFueSBvZiB0aGUgY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHRoZSBYSFRNTCBEVEQuCi0gICAgICVOUy5kZWNsLmF0dHJpYjsgaXMgZGVjbGFyZWQgaW4gdGhlIFhIVE1MIFFuYW1lIG1vZHVsZS4KLS0tPgotCi08IUVOVElUWSAlIGlkLmF0dHJpYgotICAgICAiaWQgICAgICAgICAgIElEICAgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBjbGFzcy5hdHRyaWIKLSAgICAgImNsYXNzICAgICAgICBOTVRPS0VOUyAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgdGl0bGUuYXR0cmliCi0gICAgICJ0aXRsZSAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIENvcmUuZXh0cmEuYXR0cmliICIiID4KLQotPCFFTlRJVFkgJSBDb3JlLmF0dHJpYgotICAgICAiJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVpZC5hdHRyaWI7Ci0gICAgICAlY2xhc3MuYXR0cmliOwotICAgICAgJXRpdGxlLmF0dHJpYjsKLSAgICAgICVDb3JlLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhRU5USVRZICUgbGFuZy5hdHRyaWIKLSAgICAgInhtbDpsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQiCi0+Ci0KLTwhWyVYSFRNTC5iaWRpO1sKLTwhRU5USVRZICUgZGlyLmF0dHJpYgotICAgICAiZGlyICAgICAgICAgICggbHRyIHwgcnRsICkgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBJMThuLmF0dHJpYgotICAgICAiJWRpci5hdHRyaWI7Ci0gICAgICAlbGFuZy5hdHRyaWI7IgotPgotCi1dXT4KLTwhRU5USVRZICUgSTE4bi5hdHRyaWIKLSAgICAgIiVsYW5nLmF0dHJpYjsiCi0+Ci0KLTwhRU5USVRZICUgQ29tbW9uLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhLS0gaW50cmluc2ljIGV2ZW50IGF0dHJpYnV0ZXMgZGVjbGFyZWQgcHJldmlvdXNseQotLS0+Ci08IUVOVElUWSAlIEV2ZW50cy5hdHRyaWIgIiIgPgotCi08IUVOVElUWSAlIENvbW1vbi5hdHRyaWIKLSAgICAgIiVDb3JlLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgICVFdmVudHMuYXR0cmliOwotICAgICAgJUNvbW1vbi5leHRyYS5hdHRyaWI7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1hdHRyaWJzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIGNvbnRlbnQgbW9kZWwgcmVkZWNsYXJhdGlvbnMgLS0+Ci08IUVOVElUWSAlIHhodG1sLW1vZGVsLnJlZGVjbCAiIiA+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1tb2RlbC5tb2R1bGU7WwotPCEtLSBpbnN0YW50aWF0ZSB0aGUgRG9jdW1lbnQgTW9kZWwgbW9kdWxlIGRlY2xhcmVkIGluIHRoZSBEVEQgZHJpdmVyCi0tLT4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJhc2ljIDEuMCBEb2N1bWVudCBNb2RlbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmFzaWMxMC1tb2RlbC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwgQmFzaWMsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIEJhc2ljIDEuMCBEb2N1bWVudCBNb2RlbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtYmFzaWMveGh0bWwtYmFzaWMxMC1tb2RlbC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBYSFRNTCBCYXNpYyBEb2N1bWVudCBNb2RlbAotCi0gICAgIFRoaXMgbW9kdWxlIGRlc2NyaWJlcyB0aGUgZ3JvdXBpbmdzIG9mIGVsZW1lbnRzIHRoYXQgbWFrZSB1cAotICAgICBjb21tb24gY29udGVudCBtb2RlbHMgZm9yIFhIVE1MIGVsZW1lbnRzLgotLS0+Ci0KLTwhLS0gT3B0aW9uYWwgRWxlbWVudHMgaW4gaGVhZCAgLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSGVhZE9wdHMubWl4Ci0gICAgICIoICVtZXRhLnFuYW1lOyB8ICVsaW5rLnFuYW1lOyB8ICVvYmplY3QucW5hbWU7ICkqIiA+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgTWlzYy5jbGFzcyAiIiA+Ci0KLTwhLS0gSW5saW5lIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSW5sU3RydWN0LmNsYXNzICIlYnIucW5hbWU7IHwgJXNwYW4ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sUGhyYXMuY2xhc3MKLSAgICAgInwgJWVtLnFuYW1lOyB8ICVzdHJvbmcucW5hbWU7IHwgJWRmbi5xbmFtZTsgfCAlY29kZS5xbmFtZTsKLSAgICAgIHwgJXNhbXAucW5hbWU7IHwgJWtiZC5xbmFtZTsgfCAldmFyLnFuYW1lOyB8ICVjaXRlLnFuYW1lOwotICAgICAgfCAlYWJici5xbmFtZTsgfCAlYWNyb255bS5xbmFtZTsgfCAlcS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxQcmVzLmNsYXNzICIiID4KLQotPCFFTlRJVFkgJSBJMThuLmNsYXNzICIiID4KLQotPCFFTlRJVFkgJSBBbmNob3IuY2xhc3MgInwgJWEucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sU3BlY2lhbC5jbGFzcyAifCAlaW1nLnFuYW1lOyB8ICVvYmplY3QucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sRm9ybS5jbGFzcwotICAgICAifCAlaW5wdXQucW5hbWU7IHwgJXNlbGVjdC5xbmFtZTsgfCAldGV4dGFyZWEucW5hbWU7Ci0gICAgICB8ICVsYWJlbC5xbmFtZTsiCi0+Ci0KLTwhRU5USVRZICUgSW5saW5lLmV4dHJhICIiID4KLQotPCFFTlRJVFkgJSBJbmxpbmUuY2xhc3MKLSAgICAgIiVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlSW5sRm9ybS5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7IgotPgotCi08IUVOVElUWSAlIElubE5vQW5jaG9yLmNsYXNzCi0gICAgICIlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlSW5sRm9ybS5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7IgotPgotCi08IUVOVElUWSAlIElubE5vQW5jaG9yLm1peAotICAgICAiJUlubE5vQW5jaG9yLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IUVOVElUWSAlIElubGluZS5taXgKLSAgICAgIiVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gQmxvY2sgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSGVhZGluZy5jbGFzcwotICAgICAiJWgxLnFuYW1lOyB8ICVoMi5xbmFtZTsgfCAlaDMucW5hbWU7Ci0gICAgICB8ICVoNC5xbmFtZTsgfCAlaDUucW5hbWU7IHwgJWg2LnFuYW1lOyIKLT4KLTwhRU5USVRZICUgTGlzdC5jbGFzcyAgIiV1bC5xbmFtZTsgfCAlb2wucW5hbWU7IHwgJWRsLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIFRhYmxlLmNsYXNzICJ8ICV0YWJsZS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBGb3JtLmNsYXNzICAifCAlZm9ybS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBCbGtTdHJ1Y3QuY2xhc3MgIiVwLnFuYW1lOyB8ICVkaXYucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrUGhyYXMuY2xhc3MKLSAgICAgInwgJXByZS5xbmFtZTsgfCAlYmxvY2txdW90ZS5xbmFtZTsgfCAlYWRkcmVzcy5xbmFtZTsiCi0+Ci0KLTwhRU5USVRZICUgQmxrUHJlcy5jbGFzcyAiIiA+Ci0KLTwhRU5USVRZICUgQmxrU3BlY2lhbC5jbGFzcwotICAgICAiJVRhYmxlLmNsYXNzOwotICAgICAgJUZvcm0uY2xhc3M7IgotPgotCi08IUVOVElUWSAlIEJsb2NrLmV4dHJhICIiID4KLQotPCFFTlRJVFkgJSBCbG9jay5jbGFzcwotICAgICAiJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVCbGtTcGVjaWFsLmNsYXNzOwotICAgICAgJUJsb2NrLmV4dHJhOyIKLT4KLQotPCFFTlRJVFkgJSBCbG9jay5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsb2NrLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIEFsbCBDb250ZW50IEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGRlY2xhcmVzIGFsbCBjb250ZW50IGV4Y2VwdCB0YWJsZXMKLS0tPgotPCFFTlRJVFkgJSBGbG93Tm9UYWJsZS5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVGb3JtLmNsYXNzOwotICAgICAgJUJsb2NrLmV4dHJhOwotICAgICAgfCAlSW5saW5lLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IUVOVElUWSAlIEZsb3cubWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbG9jay5jbGFzczsKLSAgICAgIHwgJUlubGluZS5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmFzaWMxMC1tb2RlbC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWNoYXJlbnQubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtY2hhcmVudC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1jaGFyZW50Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtY2hhcmVudC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtY2hhcmVudC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1jaGFyZW50LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIENoYXJhY3RlciBFbnRpdGllcyBmb3IgWEhUTUwKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgc2V0IG9mIGNoYXJhY3RlciBlbnRpdGllcyBmb3IgWEhUTUwsCi0gICAgIGluY2x1ZGluZyB0aGUgTGF0aW4gMSwgU3ltYm9sIGFuZCBTcGVjaWFsIGNoYXJhY3RlciBjb2xsZWN0aW9ucy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWxhdDEKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtbGF0MS5lbnQiID4KLTwhRU5USVRZICUgeGh0bWwtc3ltYm9sCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLXN5bWJvbC5lbnQiID4KLTwhRU5USVRZICUgeGh0bWwtc3BlY2lhbAotICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICJ4aHRtbC1zcGVjaWFsLmVudCIgPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODYKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgIDwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLWxhdDEuZW50Ij4KLSAgICAlSFRNTGxhdDE7Ci0tLT4KLQotPCFFTlRJVFkgbmJzcCAgICImIzE2MDsiPiA8IS0tIG5vLWJyZWFrIHNwYWNlID0gbm9uLWJyZWFraW5nIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBMCBJU09udW0gLS0+Ci08IUVOVElUWSBpZXhjbCAgIiYjMTYxOyI+IDwhLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaywgVSswMEExIElTT251bSAtLT4KLTwhRU5USVRZIGNlbnQgICAiJiMxNjI7Ij4gPCEtLSBjZW50IHNpZ24sIFUrMDBBMiBJU09udW0gLS0+Ci08IUVOVElUWSBwb3VuZCAgIiYjMTYzOyI+IDwhLS0gcG91bmQgc2lnbiwgVSswMEEzIElTT251bSAtLT4KLTwhRU5USVRZIGN1cnJlbiAiJiMxNjQ7Ij4gPCEtLSBjdXJyZW5jeSBzaWduLCBVKzAwQTQgSVNPbnVtIC0tPgotPCFFTlRJVFkgeWVuICAgICImIzE2NTsiPiA8IS0tIHllbiBzaWduID0geXVhbiBzaWduLCBVKzAwQTUgSVNPbnVtIC0tPgotPCFFTlRJVFkgYnJ2YmFyICImIzE2NjsiPiA8IS0tIGJyb2tlbiBiYXIgPSBicm9rZW4gdmVydGljYWwgYmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBNiBJU09udW0gLS0+Ci08IUVOVElUWSBzZWN0ICAgIiYjMTY3OyI+IDwhLS0gc2VjdGlvbiBzaWduLCBVKzAwQTcgSVNPbnVtIC0tPgotPCFFTlRJVFkgdW1sICAgICImIzE2ODsiPiA8IS0tIGRpYWVyZXNpcyA9IHNwYWNpbmcgZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBOCBJU09kaWEgLS0+Ci08IUVOVElUWSBjb3B5ICAgIiYjMTY5OyI+IDwhLS0gY29weXJpZ2h0IHNpZ24sIFUrMDBBOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRmICAgIiYjMTcwOyI+IDwhLS0gZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0gLS0+Ci08IUVOVElUWSBsYXF1byAgIiYjMTcxOyI+IDwhLS0gbGVmdC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtIC0tPgotPCFFTlRJVFkgbm90ICAgICImIzE3MjsiPiA8IS0tIG5vdCBzaWduID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFDIElTT251bSAtLT4KLTwhRU5USVRZIHNoeSAgICAiJiMxNzM7Ij4gPCEtLSBzb2Z0IGh5cGhlbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRCBJU09udW0gLS0+Ci08IUVOVElUWSByZWcgICAgIiYjMTc0OyI+IDwhLS0gcmVnaXN0ZXJlZCBzaWduID0gcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFFIElTT251bSAtLT4KLTwhRU5USVRZIG1hY3IgICAiJiMxNzU7Ij4gPCEtLSBtYWNyb24gPSBzcGFjaW5nIG1hY3JvbiA9IG92ZXJsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBUEwgb3ZlcmJhciwgVSswMEFGIElTT2RpYSAtLT4KLTwhRU5USVRZIGRlZyAgICAiJiMxNzY7Ij4gPCEtLSBkZWdyZWUgc2lnbiwgVSswMEIwIElTT251bSAtLT4KLTwhRU5USVRZIHBsdXNtbiAiJiMxNzc7Ij4gPCEtLSBwbHVzLW1pbnVzIHNpZ24gPSBwbHVzLW9yLW1pbnVzIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEIxIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDIgICAiJiMxNzg7Ij4gPCEtLSBzdXBlcnNjcmlwdCB0d28gPSBzdXBlcnNjcmlwdCBkaWdpdCB0d28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNxdWFyZWQsIFUrMDBCMiBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAzICAgIiYjMTc5OyI+IDwhLS0gc3VwZXJzY3JpcHQgdGhyZWUgPSBzdXBlcnNjcmlwdCBkaWdpdCB0aHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY3ViZWQsIFUrMDBCMyBJU09udW0gLS0+Ci08IUVOVElUWSBhY3V0ZSAgIiYjMTgwOyI+IDwhLS0gYWN1dGUgYWNjZW50ID0gc3BhY2luZyBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjQgSVNPZGlhIC0tPgotPCFFTlRJVFkgbWljcm8gICImIzE4MTsiPiA8IS0tIG1pY3JvIHNpZ24sIFUrMDBCNSBJU09udW0gLS0+Ci08IUVOVElUWSBwYXJhICAgIiYjMTgyOyI+IDwhLS0gcGlsY3JvdyBzaWduID0gcGFyYWdyYXBoIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI2IElTT251bSAtLT4KLTwhRU5USVRZIG1pZGRvdCAiJiMxODM7Ij4gPCEtLSBtaWRkbGUgZG90ID0gR2VvcmdpYW4gY29tbWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEdyZWVrIG1pZGRsZSBkb3QsIFUrMDBCNyBJU09udW0gLS0+Ci08IUVOVElUWSBjZWRpbCAgIiYjMTg0OyI+IDwhLS0gY2VkaWxsYSA9IHNwYWNpbmcgY2VkaWxsYSwgVSswMEI4IElTT2RpYSAtLT4KLTwhRU5USVRZIHN1cDEgICAiJiMxODU7Ij4gPCEtLSBzdXBlcnNjcmlwdCBvbmUgPSBzdXBlcnNjcmlwdCBkaWdpdCBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZG0gICAiJiMxODY7Ij4gPCEtLSBtYXNjdWxpbmUgb3JkaW5hbCBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEJBIElTT251bSAtLT4KLTwhRU5USVRZIHJhcXVvICAiJiMxODc7Ij4gPCEtLSByaWdodC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHJpZ2h0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEJCIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxNCAiJiMxODg7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBxdWFydGVyLCBVKzAwQkMgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzEyICImIzE4OTsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgaGFsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIGhhbGYsIFUrMDBCRCBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMzQgIiYjMTkwOyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiB0aHJlZSBxdWFydGVycywgVSswMEJFIElTT251bSAtLT4KLTwhRU5USVRZIGlxdWVzdCAiJiMxOTE7Ij4gPCEtLSBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0dXJuZWQgcXVlc3Rpb24gbWFyaywgVSswMEJGIElTT251bSAtLT4KLTwhRU5USVRZIEFncmF2ZSAiJiMxOTI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBYWN1dGUgIiYjMTkzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWNpcmMgICImIzE5NDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXRpbGRlICImIzE5NTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF1bWwgICAiJiMxOTY7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXJpbmcgICImIzE5NzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBRWxpZyAgIiYjMTk4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgQUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBDY2VkaWwgIiYjMTk5OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQyB3aXRoIGNlZGlsbGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFZ3JhdmUgIiYjMjAwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWFjdXRlICImIzIwMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVjaXJjICAiJiMyMDI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0EgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEV1bWwgICAiJiMyMDM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWdyYXZlICImIzIwNDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0MgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElhY3V0ZSAiJiMyMDU7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJY2lyYyAgIiYjMjA2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJdW1sICAgIiYjMjA3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0YgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVUSCAgICAiJiMyMDg7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFVEgsIFUrMDBEMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgTnRpbGRlICImIzIwOTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9ncmF2ZSAiJiMyMTA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPYWN1dGUgIiYjMjExOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2NpcmMgICImIzIxMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENCBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3RpbGRlICImIzIxMzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE91bWwgICAiJiMyMTQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGltZXMgICImIzIxNTsiPiA8IS0tIG11bHRpcGxpY2F0aW9uIHNpZ24sIFUrMDBENyBJU09udW0gLS0+Ci08IUVOVElUWSBPc2xhc2ggIiYjMjE2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHN0cm9rZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyBzbGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDggSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVncmF2ZSAiJiMyMTc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVYWN1dGUgIiYjMjE4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWNpcmMgICImIzIxOTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgVXVtbCAgICImIzIyMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBZYWN1dGUgIiYjMjIxOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVEhPUk4gICImIzIyMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFRIT1JOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERSBJU09sYXQxIC0tPgotPCFFTlRJVFkgc3psaWcgICImIzIyMzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBzaGFycCBzID0gZXNzLXplZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFncmF2ZSAiJiMyMjQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFhY3V0ZSAiJiMyMjU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWNpcmMgICImIzIyNjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF0aWxkZSAiJiMyMjc7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXVtbCAgICImIzIyODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXJpbmcgICImIzIyOTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFlbGlnICAiJiMyMzA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxpZ2F0dXJlIGFlLCBVKzAwRTYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGNjZWRpbCAiJiMyMzE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYyB3aXRoIGNlZGlsbGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlZ3JhdmUgIiYjMjMyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTggSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVhY3V0ZSAiJiMyMzM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWNpcmMgICImIzIzNDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV1bWwgICAiJiMyMzU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlncmF2ZSAiJiMyMzY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWFjdXRlICImIzIzNzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpY2lyYyAgIiYjMjM4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgaXVtbCAgICImIzIzOTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXRoICAgICImIzI0MDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBldGgsIFUrMDBGMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgbnRpbGRlICImIzI0MTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBuIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvZ3JhdmUgIiYjMjQyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9hY3V0ZSAiJiMyNDM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2NpcmMgICImIzI0NDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG90aWxkZSAiJiMyNDU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3VtbCAgICImIzI0NjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZGl2aWRlICImIzI0NzsiPiA8IS0tIGRpdmlzaW9uIHNpZ24sIFUrMDBGNyBJU09udW0gLS0+Ci08IUVOVElUWSBvc2xhc2ggIiYjMjQ4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBzdHJva2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyBzbGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjggSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVncmF2ZSAiJiMyNDk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWFjdXRlICImIzI1MDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZBIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Y2lyYyAgIiYjMjUxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdXVtbCAgICImIzI1MjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgeWFjdXRlICImIzI1MzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZEIElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aG9ybiAgIiYjMjU0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHRob3JuIHdpdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZFIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5dW1sICAgIiYjMjU1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZGIElTT2xhdDEgLS0+Ci0KLTwhLS0gTWF0aGVtYXRpY2FsLCBHcmVlayBhbmQgU3ltYm9saWMgY2hhcmFjdGVycyBmb3IgSFRNTCAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAgICAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3ltYm9sLmVudCI+Ci0gICAgICVIVE1Mc3ltYm9sOwotLS0+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgbGlzdCkgZG8gbm90IGNsYXNoIHdpdGggYW55Ci0gICAgIGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IGNoYXJhY3RlciBudW1iZXJzCi0gICAgIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gdmFsdWVzIGFyZSBkZWNpbWFsCi0gICAgIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUgZG9jdW1lbnQKLSAgICAgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIFVuaWNvZGUgbmFtZXMuIAotLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQiAtLT4KLTwhRU5USVRZIGZub2YgICAgICImIzQwMjsiPiA8IS0tIGxhdGluIHNtYWxsIGYgd2l0aCBob29rID0gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmxvcmluLCBVKzAxOTIgSVNPdGVjaCAtLT4KLQotPCEtLSBHcmVlayAtLT4KLTwhRU5USVRZIEFscGhhICAgICImIzkxMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGFscGhhLCBVKzAzOTEgLS0+Ci08IUVOVElUWSBCZXRhICAgICAiJiM5MTQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBiZXRhLCBVKzAzOTIgLS0+Ci08IUVOVElUWSBHYW1tYSAgICAiJiM5MTU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5MyBJU09ncmszIC0tPgotPCFFTlRJVFkgRGVsdGEgICAgIiYjOTE2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIEVwc2lsb24gICImIzkxNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGVwc2lsb24sIFUrMDM5NSAtLT4KLTwhRU5USVRZIFpldGEgICAgICImIzkxODsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHpldGEsIFUrMDM5NiAtLT4KLTwhRU5USVRZIEV0YSAgICAgICImIzkxOTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGV0YSwgVSswMzk3IC0tPgotPCFFTlRJVFkgVGhldGEgICAgIiYjOTIwOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIElvdGEgICAgICImIzkyMTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGlvdGEsIFUrMDM5OSAtLT4KLTwhRU5USVRZIEthcHBhICAgICImIzkyMjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGthcHBhLCBVKzAzOUEgLS0+Ci08IUVOVElUWSBMYW1iZGEgICAiJiM5MjM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOUIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE11ICAgICAgICImIzkyNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG11LCBVKzAzOUMgLS0+Ci08IUVOVElUWSBOdSAgICAgICAiJiM5MjU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBudSwgVSswMzlEIC0tPgotPCFFTlRJVFkgWGkgICAgICAgIiYjOTI2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgeGksIFUrMDM5RSBJU09ncmszIC0tPgotPCFFTlRJVFkgT21pY3JvbiAgIiYjOTI3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21pY3JvbiwgVSswMzlGIC0tPgotPCFFTlRJVFkgUGkgICAgICAgIiYjOTI4OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGksIFUrMDNBMCBJU09ncmszIC0tPgotPCFFTlRJVFkgUmhvICAgICAgIiYjOTI5OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcmhvLCBVKzAzQTEgLS0+Ci08IS0tIHRoZXJlIGlzIG5vIFNpZ21hZiwgYW5kIG5vIFUrMDNBMiBjaGFyYWN0ZXIgZWl0aGVyIC0tPgotPCFFTlRJVFkgU2lnbWEgICAgIiYjOTMxOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFRhdSAgICAgICImIzkzMjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRhdSwgVSswM0E0IC0tPgotPCFFTlRJVFkgVXBzaWxvbiAgIiYjOTMzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNSBJU09ncmszIC0tPgotPCFFTlRJVFkgUGhpICAgICAgIiYjOTM0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGhpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E2IElTT2dyazMgLS0+Ci08IUVOVElUWSBDaGkgICAgICAiJiM5MzU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBjaGksIFUrMDNBNyAtLT4KLTwhRU5USVRZIFBzaSAgICAgICImIzkzNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOCBJU09ncmszIC0tPgotPCFFTlRJVFkgT21lZ2EgICAgIiYjOTM3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21lZ2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTkgSVNPZ3JrMyAtLT4KLQotPCFFTlRJVFkgYWxwaGEgICAgIiYjOTQ1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0IxIElTT2dyazMgLS0+Ci08IUVOVElUWSBiZXRhICAgICAiJiM5NDY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYmV0YSwgVSswM0IyIElTT2dyazMgLS0+Ci08IUVOVElUWSBnYW1tYSAgICAiJiM5NDc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZ2FtbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGRlbHRhICAgICImIzk0ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNCBJU09ncmszIC0tPgotPCFFTlRJVFkgZXBzaWxvbiAgIiYjOTQ5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHpldGEgICAgICImIzk1MDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB6ZXRhLCBVKzAzQjYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGV0YSAgICAgICImIzk1MTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBldGEsIFUrMDNCNyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGEgICAgIiYjOTUyOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I4IElTT2dyazMgLS0+Ci08IUVOVElUWSBpb3RhICAgICAiJiM5NTM7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgaW90YSwgVSswM0I5IElTT2dyazMgLS0+Ci08IUVOVElUWSBrYXBwYSAgICAiJiM5NTQ7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIga2FwcGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQkEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGxhbWJkYSAgICImIzk1NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQkIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG11ICAgICAgICImIzk1NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBtdSwgVSswM0JDIElTT2dyazMgLS0+Ci08IUVOVElUWSBudSAgICAgICAiJiM5NTc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbnUsIFUrMDNCRCBJU09ncmszIC0tPgotPCFFTlRJVFkgeGkgICAgICAgIiYjOTU4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHhpLCBVKzAzQkUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9taWNyb24gICImIzk1OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWljcm9uLCBVKzAzQkYgTkVXIC0tPgotPCFFTlRJVFkgcGkgICAgICAgIiYjOTYwOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBpLCBVKzAzQzAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHJobyAgICAgICImIzk2MTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciByaG8sIFUrMDNDMSBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWFmICAgIiYjOTYyOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGZpbmFsIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0MyIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYSAgICAiJiM5NjM7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRhdSAgICAgICImIzk2NDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0YXUsIFUrMDNDNCBJU09ncmszIC0tPgotPCFFTlRJVFkgdXBzaWxvbiAgIiYjOTY1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBoaSAgICAgICImIzk2NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaGksIFUrMDNDNiBJU09ncmszIC0tPgotPCFFTlRJVFkgY2hpICAgICAgIiYjOTY3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGNoaSwgVSswM0M3IElTT2dyazMgLS0+Ci08IUVOVElUWSBwc2kgICAgICAiJiM5Njg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcHNpLCBVKzAzQzggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9tZWdhICAgICImIzk2OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDOSBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGFzeW0gIiYjOTc3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMSBORVcgLS0+Ci08IUVOVElUWSB1cHNpaCAgICAiJiM5Nzg7Ij4gPCEtLSBncmVlayB1cHNpbG9uIHdpdGggaG9vayBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzRDIgTkVXIC0tPgotPCFFTlRJVFkgcGl2ICAgICAgIiYjOTgyOyI+IDwhLS0gZ3JlZWsgcGkgc3ltYm9sLCBVKzAzRDYgSVNPZ3JrMyAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgYnVsbCAgICAgIiYjODIyNjsiPiA8IS0tIGJ1bGxldCA9IGJsYWNrIHNtYWxsIGNpcmNsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMjIgSVNPcHViICAtLT4KLTwhLS0gYnVsbGV0IGlzIE5PVCB0aGUgc2FtZSBhcyBidWxsZXQgb3BlcmF0b3IsIFUrMjIxOSAtLT4KLTwhRU5USVRZIGhlbGxpcCAgICImIzgyMzA7Ij4gPCEtLSBob3Jpem9udGFsIGVsbGlwc2lzID0gdGhyZWUgZG90IGxlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMjYgSVNPcHViICAtLT4KLTwhRU5USVRZIHByaW1lICAgICImIzgyNDI7Ij4gPCEtLSBwcmltZSA9IG1pbnV0ZXMgPSBmZWV0LCBVKzIwMzIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIFByaW1lICAgICImIzgyNDM7Ij4gPCEtLSBkb3VibGUgcHJpbWUgPSBzZWNvbmRzID0gaW5jaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb2xpbmUgICAgIiYjODI1NDsiPiA8IS0tIG92ZXJsaW5lID0gc3BhY2luZyBvdmVyc2NvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNFIE5FVyAtLT4KLTwhRU5USVRZIGZyYXNsICAgICImIzgyNjA7Ij4gPCEtLSBmcmFjdGlvbiBzbGFzaCwgVSsyMDQ0IE5FVyAtLT4KLQotPCEtLSBMZXR0ZXJsaWtlIFN5bWJvbHMgLS0+Ci08IUVOVElUWSB3ZWllcnAgICAiJiM4NDcyOyI+IDwhLS0gc2NyaXB0IGNhcGl0YWwgUCA9IHBvd2VyIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gV2VpZXJzdHJhc3MgcCwgVSsyMTE4IElTT2Ftc28gLS0+Ci08IUVOVElUWSBpbWFnZSAgICAiJiM4NDY1OyI+IDwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBJID0gaW1hZ2luYXJ5IHBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTExIElTT2Ftc28gLS0+Ci08IUVOVElUWSByZWFsICAgICAiJiM4NDc2OyI+IDwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBSID0gcmVhbCBwYXJ0IHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMUMgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHRyYWRlICAgICImIzg0ODI7Ij4gPCEtLSB0cmFkZSBtYXJrIHNpZ24sIFUrMjEyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbGVmc3ltICAiJiM4NTAxOyI+IDwhLS0gYWxlZiBzeW1ib2wgPSBmaXJzdCB0cmFuc2Zpbml0ZSBjYXJkaW5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMzUgTkVXIC0tPgotPCEtLSBhbGVmIHN5bWJvbCBpcyBOT1QgdGhlIHNhbWUgYXMgaGVicmV3IGxldHRlciBhbGVmLAotICAgICBVKzA1RDAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggY291bGQgYmUgdXNlZCB0byBkZXBpY3QgYm90aCBjaGFyYWN0ZXJzIC0tPgotCi08IS0tIEFycm93cyAtLT4KLTwhRU5USVRZIGxhcnIgICAgICImIzg1OTI7Ij4gPCEtLSBsZWZ0d2FyZHMgYXJyb3csIFUrMjE5MCBJU09udW0gLS0+Ci08IUVOVElUWSB1YXJyICAgICAiJiM4NTkzOyI+IDwhLS0gdXB3YXJkcyBhcnJvdywgVSsyMTkxIElTT251bS0tPgotPCFFTlRJVFkgcmFyciAgICAgIiYjODU5NDsiPiA8IS0tIHJpZ2h0d2FyZHMgYXJyb3csIFUrMjE5MiBJU09udW0gLS0+Ci08IUVOVElUWSBkYXJyICAgICAiJiM4NTk1OyI+IDwhLS0gZG93bndhcmRzIGFycm93LCBVKzIxOTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgaGFyciAgICAgIiYjODU5NjsiPiA8IS0tIGxlZnQgcmlnaHQgYXJyb3csIFUrMjE5NCBJU09hbXNhIC0tPgotPCFFTlRJVFkgY3JhcnIgICAgIiYjODYyOTsiPiA8IS0tIGRvd253YXJkcyBhcnJvdyB3aXRoIGNvcm5lciBsZWZ0d2FyZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNhcnJpYWdlIHJldHVybiwgVSsyMUI1IE5FVyAtLT4KLTwhRU5USVRZIGxBcnIgICAgICImIzg2NTY7Ij4gPCEtLSBsZWZ0d2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDAgSVNPdGVjaCAtLT4KLTwhLS0gVW5pY29kZSBkb2VzIG5vdCBzYXkgdGhhdCBsQXJyIGlzIHRoZSBzYW1lIGFzIHRoZSAnaXMgaW1wbGllZCBieScgYXJyb3cKLSAgICBidXQgYWxzbyBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciBjaGFyYWN0ZXIgZm9yIHRoYXQgZnVuY3Rpb24uIFNvID8gbEFyciBjYW4KLSAgICBiZSB1c2VkIGZvciAnaXMgaW1wbGllZCBieScgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIHVBcnIgICAgICImIzg2NTc7Ij4gPCEtLSB1cHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQxIElTT2Ftc2EgLS0+Ci08IUVOVElUWSByQXJyICAgICAiJiM4NjU4OyI+IDwhLS0gcmlnaHR3YXJkcyBkb3VibGUgYXJyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMUQyIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoaXMgaXMgdGhlICdpbXBsaWVzJyBjaGFyYWN0ZXIgYnV0IGRvZXMgbm90IGhhdmUgCi0gICAgIGFub3RoZXIgY2hhcmFjdGVyIHdpdGggdGhpcyBmdW5jdGlvbiBzbyA/Ci0gICAgIHJBcnIgY2FuIGJlIHVzZWQgZm9yICdpbXBsaWVzJyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgZEFyciAgICAgIiYjODY1OTsiPiA8IS0tIGRvd253YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMyBJU09hbXNhIC0tPgotPCFFTlRJVFkgaEFyciAgICAgIiYjODY2MDsiPiA8IS0tIGxlZnQgcmlnaHQgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFENCBJU09hbXNhIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgLS0+Ci08IUVOVElUWSBmb3JhbGwgICAiJiM4NzA0OyI+IDwhLS0gZm9yIGFsbCwgVSsyMjAwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwYXJ0ICAgICAiJiM4NzA2OyI+IDwhLS0gcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoICAtLT4KLTwhRU5USVRZIGV4aXN0ICAgICImIzg3MDc7Ij4gPCEtLSB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgZW1wdHkgICAgIiYjODcwOTsiPiA8IS0tIGVtcHR5IHNldCA9IG51bGwgc2V0ID0gZGlhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA1IElTT2Ftc28gLS0+Ci08IUVOVElUWSBuYWJsYSAgICAiJiM4NzExOyI+IDwhLS0gbmFibGEgPSBiYWNrd2FyZCBkaWZmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgaXNpbiAgICAgIiYjODcxMjsiPiA8IS0tIGVsZW1lbnQgb2YsIFUrMjIwOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbm90aW4gICAgIiYjODcxMzsiPiA8IS0tIG5vdCBhbiBlbGVtZW50IG9mLCBVKzIyMDkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5pICAgICAgICImIzg3MTU7Ij4gPCEtLSBjb250YWlucyBhcyBtZW1iZXIsIFUrMjIwQiBJU090ZWNoIC0tPgotPCEtLSBzaG91bGQgdGhlcmUgYmUgYSBtb3JlIG1lbW9yYWJsZSBuYW1lIHRoYW4gJ25pJz8gLS0+Ci08IUVOVElUWSBwcm9kICAgICAiJiM4NzE5OyI+IDwhLS0gbi1hcnkgcHJvZHVjdCA9IHByb2R1Y3Qgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMEYgSVNPYW1zYiAtLT4KLTwhLS0gcHJvZCBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMCAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGknIHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgc3VtICAgICAgIiYjODcyMTsiPiA8IS0tIG4tYXJ5IHN1bWF0aW9uLCBVKzIyMTEgSVNPYW1zYiAtLT4KLTwhLS0gc3VtIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EzICdncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYScKLSAgICAgdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBtaW51cyAgICAiJiM4NzIyOyI+IDwhLS0gbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsb3dhc3QgICAiJiM4NzI3OyI+IDwhLS0gYXN0ZXJpc2sgb3BlcmF0b3IsIFUrMjIxNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgcmFkaWMgICAgIiYjODczMDsiPiA8IS0tIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIxQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgcHJvcCAgICAgIiYjODczMzsiPiA8IS0tIHByb3BvcnRpb25hbCB0bywgVSsyMjFEIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbmZpbiAgICAiJiM4NzM0OyI+IDwhLS0gaW5maW5pdHksIFUrMjIxRSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYW5nICAgICAgIiYjODczNjsiPiA8IS0tIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbyAtLT4KLTwhRU5USVRZIGFuZCAgICAgICImIzg3NDM7Ij4gPCEtLSBsb2dpY2FsIGFuZCA9IHdlZGdlLCBVKzIyMjcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9yICAgICAgICImIzg3NDQ7Ij4gPCEtLSBsb2dpY2FsIG9yID0gdmVlLCBVKzIyMjggSVNPdGVjaCAtLT4KLTwhRU5USVRZIGNhcCAgICAgICImIzg3NDU7Ij4gPCEtLSBpbnRlcnNlY3Rpb24gPSBjYXAsIFUrMjIyOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgY3VwICAgICAgIiYjODc0NjsiPiA8IS0tIHVuaW9uID0gY3VwLCBVKzIyMkEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGludCAgICAgICImIzg3NDc7Ij4gPCEtLSBpbnRlZ3JhbCwgVSsyMjJCIElTT3RlY2ggLS0+Ci08IUVOVElUWSB0aGVyZTQgICAiJiM4NzU2OyI+IDwhLS0gdGhlcmVmb3JlLCBVKzIyMzQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNpbSAgICAgICImIzg3NjQ7Ij4gPCEtLSB0aWxkZSBvcGVyYXRvciA9IHZhcmllcyB3aXRoID0gc2ltaWxhciB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyM0MgSVNPdGVjaCAtLT4KLTwhLS0gdGlsZGUgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyB0aGUgdGlsZGUsIFUrMDA3RSwKLSAgICAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCB0byByZXByZXNlbnQgYm90aCAgLS0+Ci08IUVOVElUWSBjb25nICAgICAiJiM4NzczOyI+IDwhLS0gYXBwcm94aW1hdGVseSBlcXVhbCB0bywgVSsyMjQ1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBhc3ltcCAgICAiJiM4Nzc2OyI+IDwhLS0gYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNDggSVNPYW1zciAtLT4KLTwhRU5USVRZIG5lICAgICAgICImIzg4MDA7Ij4gPCEtLSBub3QgZXF1YWwgdG8sIFUrMjI2MCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZXF1aXYgICAgIiYjODgwMTsiPiA8IS0tIGlkZW50aWNhbCB0bywgVSsyMjYxIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsZSAgICAgICAiJiM4ODA0OyI+IDwhLS0gbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGdlICAgICAgICImIzg4MDU7Ij4gPCEtLSBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjY1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdWIgICAgICAiJiM4ODM0OyI+IDwhLS0gc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cCAgICAgICImIzg4MzU7Ij4gPCEtLSBzdXBlcnNldCBvZiwgVSsyMjgzIElTT3RlY2ggLS0+Ci08IS0tIG5vdGUgdGhhdCBuc3VwLCAnbm90IGEgc3VwZXJzZXQgb2YsIFUrMjI4MycgaXMgbm90IGNvdmVyZWQgYnkgdGhlIFN5bWJvbCAKLSAgICAgZm9udCBlbmNvZGluZyBhbmQgaXMgbm90IGluY2x1ZGVkLiBTaG91bGQgaXQgYmUsIGZvciBzeW1tZXRyeT8KLSAgICAgSXQgaXMgaW4gSVNPYW1zbiAgLS0+IAotPCFFTlRJVFkgbnN1YiAgICAgIiYjODgzNjsiPiA8IS0tIG5vdCBhIHN1YnNldCBvZiwgVSsyMjg0IElTT2Ftc24gLS0+Ci08IUVOVElUWSBzdWJlICAgICAiJiM4ODM4OyI+IDwhLS0gc3Vic2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODYgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cGUgICAgICImIzg4Mzk7Ij4gPCEtLSBzdXBlcnNldCBvZiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyODcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9wbHVzICAgICImIzg4NTM7Ij4gPCEtLSBjaXJjbGVkIHBsdXMgPSBkaXJlY3Qgc3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NSBJU09hbXNiIC0tPgotPCFFTlRJVFkgb3RpbWVzICAgIiYjODg1NTsiPiA8IS0tIGNpcmNsZWQgdGltZXMgPSB2ZWN0b3IgcHJvZHVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTcgSVNPYW1zYiAtLT4KLTwhRU5USVRZIHBlcnAgICAgICImIzg4Njk7Ij4gPCEtLSB1cCB0YWNrID0gb3J0aG9nb25hbCB0byA9IHBlcnBlbmRpY3VsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMkE1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzZG90ICAgICAiJiM4OTAxOyI+IDwhLS0gZG90IG9wZXJhdG9yLCBVKzIyQzUgSVNPYW1zYiAtLT4KLTwhLS0gZG90IG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMEI3IG1pZGRsZSBkb3QgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBUZWNobmljYWwgLS0+Ci08IUVOVElUWSBsY2VpbCAgICAiJiM4OTY4OyI+IDwhLS0gbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzA4IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmNlaWwgICAgIiYjODk2OTsiPiA8IS0tIHJpZ2h0IGNlaWxpbmcsIFUrMjMwOSBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxmbG9vciAgICImIzg5NzA7Ij4gPCEtLSBsZWZ0IGZsb29yID0gYXBsIGRvd25zdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMEEgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByZmxvb3IgICAiJiM4OTcxOyI+IDwhLS0gcmlnaHQgZmxvb3IsIFUrMjMwQiBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxhbmcgICAgICImIzkwMDE7Ij4gPCEtLSBsZWZ0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBicmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzI5IElTT3RlY2ggLS0+Ci08IS0tIGxhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0MgJ2xlc3MgdGhhbicgCi0gICAgIG9yIFUrMjAzOSAnc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotPCFFTlRJVFkgcmFuZyAgICAgIiYjOTAwMjsiPiA8IS0tIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzJBIElTT3RlY2ggLS0+Ci08IS0tIHJhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0UgJ2dyZWF0ZXIgdGhhbicgCi0gICAgIG9yIFUrMjAzQSAnc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLQotPCEtLSBHZW9tZXRyaWMgU2hhcGVzIC0tPgotPCFFTlRJVFkgbG96ICAgICAgIiYjOTY3NDsiPiA8IS0tIGxvemVuZ2UsIFUrMjVDQSBJU09wdWIgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBTeW1ib2xzIC0tPgotPCFFTlRJVFkgc3BhZGVzICAgIiYjOTgyNDsiPiA8IS0tIGJsYWNrIHNwYWRlIHN1aXQsIFUrMjY2MCBJU09wdWIgLS0+Ci08IS0tIGJsYWNrIGhlcmUgc2VlbXMgdG8gbWVhbiBmaWxsZWQgYXMgb3Bwb3NlZCB0byBob2xsb3cgLS0+Ci08IUVOVElUWSBjbHVicyAgICAiJiM5ODI3OyI+IDwhLS0gYmxhY2sgY2x1YiBzdWl0ID0gc2hhbXJvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjYzIElTT3B1YiAtLT4KLTwhRU5USVRZIGhlYXJ0cyAgICImIzk4Mjk7Ij4gPCEtLSBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2NSBJU09wdWIgLS0+Ci08IUVOVElUWSBkaWFtcyAgICAiJiM5ODMwOyI+IDwhLS0gYmxhY2sgZGlhbW9uZCBzdWl0LCBVKzI2NjYgSVNPcHViIC0tPgotCi08IS0tIFNwZWNpYWwgY2hhcmFjdGVycyBmb3IgSFRNTCAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXNwZWNpYWwuZW50Ij4KLSAgICAgJUhUTUxzcGVjaWFsOwotLS0+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgbGlzdCkgZG8gbm90IGNsYXNoIHdpdGggYW55Ci0gICAgIGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IGNoYXJhY3RlciBudW1iZXJzCi0gICAgIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gdmFsdWVzIGFyZSBkZWNpbWFsCi0gICAgIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUgZG9jdW1lbnQKLSAgICAgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIFVuaWNvZGUgbmFtZXMuIAotLS0+Ci0KLTwhLS0gQzAgQ29udHJvbHMgYW5kIEJhc2ljIExhdGluIC0tPgotPCFFTlRJVFkgcXVvdCAgICAiJiMzNDsiPiA8IS0tICBxdW90YXRpb24gbWFyayA9IEFQTCBxdW90ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDAyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbXAgICAgICImIzM4OyMzODsiPiA8IS0tICBhbXBlcnNhbmQsIFUrMDAyNiBJU09udW0gLS0+Ci08IUVOVElUWSBsdCAgICAgICImIzM4OyM2MDsiPiA8IS0tICBsZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bSAtLT4KLTwhRU5USVRZIGd0ICAgICAgIiYjNjI7Ij4gPCEtLSAgZ3JlYXRlci10aGFuIHNpZ24sIFUrMDAzRSBJU09udW0gLS0+Ci08IUVOVElUWSBhcG9zCSAiJiMzOTsiPiA8IS0tICBhcG9zdHJvcGhlIG1hcmssIFUrMDAyNyBJU09udW0gLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQSAtLT4KLTwhRU5USVRZIE9FbGlnICAgIiYjMzM4OyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgT0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNTIgSVNPbGF0MiAtLT4KLTwhRU5USVRZIG9lbGlnICAgIiYjMzM5OyI+IDwhLS0gIGxhdGluIHNtYWxsIGxpZ2F0dXJlIG9lLCBVKzAxNTMgSVNPbGF0MiAtLT4KLTwhLS0gbGlnYXR1cmUgaXMgYSBtaXNub21lciwgdGhpcyBpcyBhIHNlcGFyYXRlIGNoYXJhY3RlciBpbiBzb21lIGxhbmd1YWdlcyAtLT4KLTwhRU5USVRZIFNjYXJvbiAgIiYjMzUyOyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGV0dGVyIFMgd2l0aCBjYXJvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE2MCBJU09sYXQyIC0tPgotPCFFTlRJVFkgc2Nhcm9uICAiJiMzNTM7Ij4gPCEtLSAgbGF0aW4gc21hbGwgbGV0dGVyIHMgd2l0aCBjYXJvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE2MSBJU09sYXQyIC0tPgotPCFFTlRJVFkgWXVtbCAgICAiJiMzNzY7Ij4gPCEtLSAgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE3OCBJU09sYXQyIC0tPgotCi08IS0tIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyAtLT4KLTwhRU5USVRZIGNpcmMgICAgIiYjNzEwOyI+IDwhLS0gIG1vZGlmaWVyIGxldHRlciBjaXJjdW1mbGV4IGFjY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDJDNiBJU09wdWIgLS0+Ci08IUVOVElUWSB0aWxkZSAgICImIzczMjsiPiA8IS0tICBzbWFsbCB0aWxkZSwgVSswMkRDIElTT2RpYSAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgZW5zcCAgICAiJiM4MTk0OyI+IDwhLS0gZW4gc3BhY2UsIFUrMjAwMiBJU09wdWIgLS0+Ci08IUVOVElUWSBlbXNwICAgICImIzgxOTU7Ij4gPCEtLSBlbSBzcGFjZSwgVSsyMDAzIElTT3B1YiAtLT4KLTwhRU5USVRZIHRoaW5zcCAgIiYjODIwMTsiPiA8IS0tIHRoaW4gc3BhY2UsIFUrMjAwOSBJU09wdWIgLS0+Ci08IUVOVElUWSB6d25qICAgICImIzgyMDQ7Ij4gPCEtLSB6ZXJvIHdpZHRoIG5vbi1qb2luZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMEMgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgendqICAgICAiJiM4MjA1OyI+IDwhLS0gemVybyB3aWR0aCBqb2luZXIsIFUrMjAwRCBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBscm0gICAgICImIzgyMDY7Ij4gPCEtLSBsZWZ0LXRvLXJpZ2h0IG1hcmssIFUrMjAwRSBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBybG0gICAgICImIzgyMDc7Ij4gPCEtLSByaWdodC10by1sZWZ0IG1hcmssIFUrMjAwRiBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBuZGFzaCAgICImIzgyMTE7Ij4gPCEtLSBlbiBkYXNoLCBVKzIwMTMgSVNPcHViIC0tPgotPCFFTlRJVFkgbWRhc2ggICAiJiM4MjEyOyI+IDwhLS0gZW0gZGFzaCwgVSsyMDE0IElTT3B1YiAtLT4KLTwhRU5USVRZIGxzcXVvICAgIiYjODIxNjsiPiA8IS0tIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDE4IElTT251bSAtLT4KLTwhRU5USVRZIHJzcXVvICAgIiYjODIxNzsiPiA8IS0tIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOSBJU09udW0gLS0+Ci08IUVOVElUWSBzYnF1byAgICImIzgyMTg7Ij4gPCEtLSBzaW5nbGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxQSBORVcgLS0+Ci08IUVOVElUWSBsZHF1byAgICImIzgyMjA7Ij4gPCEtLSBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxQyBJU09udW0gLS0+Ci08IUVOVElUWSByZHF1byAgICImIzgyMjE7Ij4gPCEtLSByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgYmRxdW8gICAiJiM4MjIyOyI+IDwhLS0gZG91YmxlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUUgTkVXIC0tPgotPCFFTlRJVFkgZGFnZ2VyICAiJiM4MjI0OyI+IDwhLS0gZGFnZ2VyLCBVKzIwMjAgSVNPcHViIC0tPgotPCFFTlRJVFkgRGFnZ2VyICAiJiM4MjI1OyI+IDwhLS0gZG91YmxlIGRhZ2dlciwgVSsyMDIxIElTT3B1YiAtLT4KLTwhRU5USVRZIHBlcm1pbCAgIiYjODI0MDsiPiA8IS0tIHBlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxzYXF1byAgIiYjODI0OTsiPiA8IS0tIHNpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDM5IElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gbHNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSByc2FxdW8gICImIzgyNTA7Ij4gPCEtLSBzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0EgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSByc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIGV1cm8gICAiJiM4MzY0OyI+IDwhLS0gIGV1cm8gc2lnbiwgVSsyMEFDIE5FVyAtLT4KLQotCi08IS0tIGVuZCBvZiB4aHRtbC1jaGFyZW50LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWZyYW1ld29yay0xLm1vZCAtLT4KLQotCi08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyApKiIKLT4KLQotPCFFTlRJVFkgJSB4aHRtbC10ZXh0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgVGV4dCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLXRleHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgVGV4dCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtdGV4dC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUZXh0IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtdGV4dC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUZXh0dWFsIENvbnRlbnQKLQotICAgICBUaGUgVGV4dCBtb2R1bGUgaW5jbHVkZXMgZGVjbGFyYXRpb25zIGZvciBhbGwgY29yZSAKLSAgICAgdGV4dCBjb250YWluZXIgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHJ1Y3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW5sc3RydWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHN0cnVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5sc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHN0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWlubHN0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgU3RydWN0dXJhbAotCi0gICAgICAgIGJyLCBzcGFuCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIAotICAgICB1c2VkIHRvIHN1cHBvcnQgaW5saW5lLWxldmVsIHN0cnVjdHVyYWwgbWFya3VwLgotLS0+Ci0KLTwhLS0gYnI6IGZvcmNlZCBsaW5lIGJyZWFrIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYnIuZWxlbWVudDtbCi0KLTwhRU5USVRZICUgYnIuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGJyLnFuYW1lICAiYnIiID4KLTwhRUxFTUVOVCAlYnIucW5hbWU7ICAlYnIuY29udGVudDsgPgotCi08IS0tIGVuZCBvZiBici5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYnIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJyLnFuYW1lOwotICAgICAgJUNvcmUuYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYnIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBzcGFuOiBnZW5lcmljIGlubGluZSBjb250YWluZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc3Bhbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNwYW4uZWxlbWVudDtbCi08IUVOVElUWSAlIHNwYW4uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzcGFuLnFuYW1lICAic3BhbiIgPgotPCFFTEVNRU5UICVzcGFuLnFuYW1lOyAgJXNwYW4uY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3Bhbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNwYW4uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzcGFuLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzcGFuLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzcGFuLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHN0cnVjdC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWlubHBocmFzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHBocmFzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHBocmFzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1pbmxwaHJhcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgUGhyYXNhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxwaHJhcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWlubHBocmFzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBQaHJhc2FsCi0KLSAgICAgICAgYWJiciwgYWNyb255bSwgY2l0ZSwgY29kZSwgZGZuLCBlbSwga2JkLCBxLCBzYW1wLCBzdHJvbmcsIHZhcgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgaW5saW5lLWxldmVsIHBocmFzYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgYWJici5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWFiYnIuZWxlbWVudDtbCi08IUVOVElUWSAlIGFiYnIuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBhYmJyLnFuYW1lICAiYWJiciIgPgotPCFFTEVNRU5UICVhYmJyLnFuYW1lOyAgJWFiYnIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYWJici5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGFiYnIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhYmJyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhYmJyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBhYmJyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWNyb255bS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWFjcm9ueW0uZWxlbWVudDtbCi08IUVOVElUWSAlIGFjcm9ueW0uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBhY3JvbnltLnFuYW1lICAiYWNyb255bSIgPgotPCFFTEVNRU5UICVhY3JvbnltLnFuYW1lOyAgJWFjcm9ueW0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgYWNyb255bS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGFjcm9ueW0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhY3JvbnltLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhY3JvbnltLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBhY3JvbnltLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgY2l0ZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNpdGUuZWxlbWVudDtbCi08IUVOVElUWSAlIGNpdGUuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBjaXRlLnFuYW1lICAiY2l0ZSIgPgotPCFFTEVNRU5UICVjaXRlLnFuYW1lOyAgJWNpdGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgY2l0ZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNpdGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjaXRlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjaXRlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjaXRlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgY29kZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNvZGUuZWxlbWVudDtbCi08IUVOVElUWSAlIGNvZGUuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBjb2RlLnFuYW1lICAiY29kZSIgPgotPCFFTEVNRU5UICVjb2RlLnFuYW1lOyAgJWNvZGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgY29kZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNvZGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjb2RlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjb2RlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjb2RlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGZuLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGZuLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkZm4uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBkZm4ucW5hbWUgICJkZm4iID4KLTwhRUxFTUVOVCAlZGZuLnFuYW1lOyAgJWRmbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkZm4uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZm4uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkZm4uYXR0bGlzdDtbCi08IUFUVExJU1QgJWRmbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGZuLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgZW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVlbS5lbGVtZW50O1sKLTwhRU5USVRZICUgZW0uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBlbS5xbmFtZSAgImVtIiA+Ci08IUVMRU1FTlQgJWVtLnFuYW1lOyAgJWVtLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGVtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZW0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVlbS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZW0ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGVtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUga2JkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsla2JkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBrYmQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBrYmQucW5hbWUgICJrYmQiID4KLTwhRUxFTUVOVCAla2JkLnFuYW1lOyAgJWtiZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBrYmQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBrYmQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVrYmQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWtiZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Yga2JkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgcS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXEuZWxlbWVudDtbCi08IUVOVElUWSAlIHEuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBxLnFuYW1lICAicSIgPgotPCFFTEVNRU5UICVxLnFuYW1lOyAgJXEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVxLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVxLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaXRlICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBxLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2FtcC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNhbXAuZWxlbWVudDtbCi08IUVOVElUWSAlIHNhbXAuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzYW1wLnFuYW1lICAic2FtcCIgPgotPCFFTEVNRU5UICVzYW1wLnFuYW1lOyAgJXNhbXAuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2FtcC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNhbXAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzYW1wLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzYW1wLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzYW1wLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Ryb25nLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3Ryb25nLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzdHJvbmcuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzdHJvbmcucW5hbWUgICJzdHJvbmciID4KLTwhRUxFTUVOVCAlc3Ryb25nLnFuYW1lOyAgJXN0cm9uZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzdHJvbmcuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdHJvbmcuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzdHJvbmcuYXR0bGlzdDtbCi08IUFUVExJU1QgJXN0cm9uZy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3Ryb25nLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgdmFyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldmFyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB2YXIuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSB2YXIucW5hbWUgICJ2YXIiID4KLTwhRUxFTUVOVCAldmFyLnFuYW1lOyAgJXZhci5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB2YXIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB2YXIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV2YXIuYXR0bGlzdDtbCi08IUFUVExJU1QgJXZhci5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdmFyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHBocmFzLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYmxrc3RydWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWJsa3N0cnVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ibGtzdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmxrc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJsb2NrIFN0cnVjdHVyYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJsa3N0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtYmxrc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJsb2NrIFN0cnVjdHVyYWwKLQotICAgICAgICBkaXYsIHAKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGJsb2NrLWxldmVsIHN0cnVjdHVyYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgZGl2LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGl2LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkaXYuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZGl2LnFuYW1lICAiZGl2IiA+Ci08IUVMRU1FTlQgJWRpdi5xbmFtZTsgICVkaXYuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGl2LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGl2LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGl2LmF0dGxpc3Q7WwotPCEtLSBlbmQgb2YgZGl2LmF0dGxpc3QgLS0+XV0+Ci08IUFUVExJU1QgJWRpdi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotCi08IUVOVElUWSAlIHAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotPCFFTlRJVFkgJSBwLnFuYW1lICAicCIgPgotPCFFTEVNRU5UICVwLnFuYW1lOyAgJXAuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVwLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBwLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJsa3N0cnVjdC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWJsa3BocmFzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWJsa3BocmFzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJsa3BocmFzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJsa3BocmFzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJsb2NrIFBocmFzYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJsa3BocmFzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1ibGtwaHJhcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBQaHJhc2FsCi0KLSAgICAgICAgYWRkcmVzcywgYmxvY2txdW90ZSwgcHJlLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBwaHJhc2FsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGFkZHJlc3MuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhZGRyZXNzLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhZGRyZXNzLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotPCFFTlRJVFkgJSBhZGRyZXNzLnFuYW1lICAiYWRkcmVzcyIgPgotPCFFTEVNRU5UICVhZGRyZXNzLnFuYW1lOyAgJWFkZHJlc3MuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYWRkcmVzcy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGFkZHJlc3MuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhZGRyZXNzLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhZGRyZXNzLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBhZGRyZXNzLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmxvY2txdW90ZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJsb2NrcXVvdGUuZWxlbWVudDtbCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuY29udGVudAotICAgICAiKCAlQmxvY2subWl4OyApKyIKLT4KLTwhRU5USVRZICUgYmxvY2txdW90ZS5xbmFtZSAgImJsb2NrcXVvdGUiID4KLTwhRUxFTUVOVCAlYmxvY2txdW90ZS5xbmFtZTsgICVibG9ja3F1b3RlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJsb2NrcXVvdGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmxvY2txdW90ZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmxvY2txdW90ZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgYmxvY2txdW90ZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHByZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXByZS5lbGVtZW50O1sKLTwhRU5USVRZICUgcHJlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSAKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgIHwgJXR0LnFuYW1lOyB8ICVpLnFuYW1lOyB8ICViLnFuYW1lOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgfCAlc2NyaXB0LnFuYW1lOyB8ICVtYXAucW5hbWU7Ci0gICAgICAlSW5saW5lLmV4dHJhOyApKiIKLT4KLTwhRU5USVRZICUgcHJlLnFuYW1lICAicHJlIiA+Ci08IUVMRU1FTlQgJXByZS5xbmFtZTsgICVwcmUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcHJlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcHJlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcHJlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVwcmUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHhtbDpzcGFjZSAgICAoIHByZXNlcnZlICkgICAgICAgICAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLT4KLTwhLS0gZW5kIG9mIHByZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4gIEhlYWRpbmcgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSGVhZGluZy5jb250ZW50ICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci0KLTwhRU5USVRZICUgaDEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMS5lbGVtZW50O1sKLTwhRU5USVRZICUgaDEucW5hbWUgICJoMSIgPgotPCFFTEVNRU5UICVoMS5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgxLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgxLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMi5lbGVtZW50O1sKLTwhRU5USVRZICUgaDIucW5hbWUgICJoMiIgPgotPCFFTEVNRU5UICVoMi5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDMuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMy5lbGVtZW50O1sKLTwhRU5USVRZICUgaDMucW5hbWUgICJoMyIgPgotPCFFTEVNRU5UICVoMy5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgzLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDMuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDMucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgzLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNC5lbGVtZW50O1sKLTwhRU5USVRZICUgaDQucW5hbWUgICJoNCIgPgotPCFFTEVNRU5UICVoNC5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNS5lbGVtZW50O1sKLTwhRU5USVRZICUgaDUucW5hbWUgICJoNSIgPgotPCFFTEVNRU5UICVoNS5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg1LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg1LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDYuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNi5lbGVtZW50O1sKLTwhRU5USVRZICUgaDYucW5hbWUgICJoNiIgPgotPCFFTEVNRU5UICVoNi5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg2LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDYuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDYucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg2LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJsa3BocmFzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXRleHQtMS5tb2QgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1oeXBlcnRleHQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBIeXBlcnRleHQgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1oeXBlcnRleHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSHlwZXJ0ZXh0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaHlwZXJ0ZXh0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEh5cGVydGV4dCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWh5cGVydGV4dC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBIeXBlcnRleHQKLQotICAgICAgICBhCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGFuY2hvciAoJ2EnKSBlbGVtZW50IHR5cGUsIHdoaWNoCi0gICAgIGRlZmluZXMgdGhlIHNvdXJjZSBvZiBhIGh5cGVydGV4dCBsaW5rLiBUaGUgZGVzdGluYXRpb24KLSAgICAgKG9yIGxpbmsgJ3RhcmdldCcpIGlzIGlkZW50aWZpZWQgdmlhIGl0cyAnaWQnIGF0dHJpYnV0ZSAKLSAgICAgcmF0aGVyIHRoYW4gdGhlICduYW1lJyBhdHRyaWJ1dGUgYXMgd2FzIHVzZWQgaW4gSFRNTC4KLS0tPgotCi08IS0tIC4uLi4uLi4uLi4uLiAgQW5jaG9yIEVsZW1lbnQgIC4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYS5lbGVtZW50O1sKLTwhRU5USVRZICUgYS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5sTm9BbmNob3IubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYS5xbmFtZSAgImEiID4KLTwhRUxFTUVOVCAlYS5xbmFtZTsgICVhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2hhcnNldCAgICAgICVDaGFyc2V0LmRhdGF0eXBlOyAgICAgICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgaHJlZmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRAotICAgICAgcmVsICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgcmV2ICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgYS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1oeXBlcnRleHQtMS5tb2QgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1saXN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGlzdHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1saXN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIExpc3RzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWxpc3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGlzdHMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1saXN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExpc3RzCi0KLSAgICAgICAgZGwsIGR0LCBkZCwgb2wsIHVsLCBsaQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBsaXN0LW9yaWVudGVkIGVsZW1lbnQgdHlwZXMKLSAgICAgYW5kIHRoZWlyIGF0dHJpYnV0ZXMuCi0tLT4KLQotPCFFTlRJVFkgJSBkbC5xbmFtZSAgImRsIiA+Ci08IUVOVElUWSAlIGR0LnFuYW1lICAiZHQiID4KLTwhRU5USVRZICUgZGQucW5hbWUgICJkZCIgPgotPCFFTlRJVFkgJSBvbC5xbmFtZSAgIm9sIiA+Ci08IUVOVElUWSAlIHVsLnFuYW1lICAidWwiID4KLTwhRU5USVRZICUgbGkucW5hbWUgICJsaSIgPgotCi08IS0tIGRsOiBEZWZpbml0aW9uIExpc3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkbC5jb250ZW50ICAiKCAlZHQucW5hbWU7IHwgJWRkLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVkbC5xbmFtZTsgICVkbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGwuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGR0OiBEZWZpbml0aW9uIFRlcm0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWR0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkdC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWR0LnFuYW1lOyAgJWR0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGR0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZHQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZHQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGR0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZGQ6IERlZmluaXRpb24gRGVzY3JpcHRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGRkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGQuZWxlbWVudDtbCi08IUVOVElUWSAlIGRkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWRkLnFuYW1lOyAgJWRkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gb2w6IE9yZGVyZWQgTGlzdCAobnVtYmVyZWQgc3R5bGVzKSAuLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG9sLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb2wuZWxlbWVudDtbCi08IUVOVElUWSAlIG9sLmNvbnRlbnQgICIoICVsaS5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlb2wucW5hbWU7ICAlb2wuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb2wuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9sLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygb2wuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB1bDogVW5vcmRlcmVkIExpc3QgKGJ1bGxldCBzdHlsZXMpIC4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV1bC5lbGVtZW50O1sKLTwhRU5USVRZICUgdWwuY29udGVudCAgIiggJWxpLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV1bC5xbmFtZTsgICV1bC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB1bC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHVsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldWwuYXR0bGlzdDtbCi08IUFUVExJU1QgJXVsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB1bC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGxpOiBMaXN0IEl0ZW0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsaS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxpLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBsaS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICVsaS5xbmFtZTsgICVsaS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsaS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxpLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGkuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxpLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBsaS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1saXN0LTEubW9kIC0tPgotCi0KLTwhLS0gOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gSW1hZ2UgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtaW1hZ2UubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW1hZ2UubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW1hZ2UubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbWFnZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1pbWFnZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbWFnZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbWFnZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUm92aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbWFnZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1pbWFnZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbWFnZXMKLQotICAgICAgICBpbWcKLQotICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYXJrdXAgdG8gc3VwcG9ydCBiYXNpYyBpbWFnZSBlbWJlZGRpbmcuCi0tLT4KLQotPCEtLSBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIHRleHQtb25seSBVQXMgYXMgd2VsbCBhcyB0byBtYWtlCi0gICAgIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSB0byB1c2VycyBvZgotICAgICBub24tdmlzdWFsIFVBcywgeW91IG5lZWQgdG8gcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHdpdGgKLSAgICAgdGhlICdhbHQnIGF0dHJpYnV0ZSwgYW5kIGF2b2lkIHNlcnZlci1zaWRlIGltYWdlIG1hcHMuCi0tLT4KLQotPCFFTlRJVFkgJSBpbWcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbWcuZWxlbWVudDtbCi08IUVOVElUWSAlIGltZy5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgaW1nLnFuYW1lICAiaW1nIiA+Ci08IUVMRU1FTlQgJWltZy5xbmFtZTsgICVpbWcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW1nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaW1nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaW1nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVpbWcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBhbHQgICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNSRVFVSVJFRAotICAgICAgbG9uZ2Rlc2MgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVpZ2h0ICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgd2lkdGggICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW1nLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWltYWdlLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gVGFibGVzIE1vZHVsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtdGFibGUubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtdGFibGUubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtdGFibGUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBUYWJsZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1iYXNpYy10YWJsZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmFzaWMgVGFibGUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2ljLXRhYmxlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCBCYXNpYywgYSBwcm9wZXIgc3Vic2V0IG9mIFhIVE1MLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzaWMgVGFibGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtYmFzaWMtdGFibGUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmFzaWMgVGFibGVzCi0KLSAgICAgICAgdGFibGUsIGNhcHRpb24sIHRyLCB0aCwgdGQKLQotICAgICBUaGlzIHRhYmxlIG1vZHVsZSBkZWNsYXJlcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBkZWZpbmluZwotICAgICBhIHRhYmxlIG1vZGVsIGJhc2VkIGZ1bmRhbWVudGFsbHkgb24gZmVhdHVyZXMgZm91bmQgaW4gdGhlCi0gICAgIHdpZGVseS1kZXBsb3llZCBIVE1MIDMuMiB0YWJsZSBtb2RlbC4gIFdoaWxlIHRoaXMgbW9kdWxlCi0gICAgIG1pbWljcyB0aGUgY29udGVudCBtb2RlbCBhbmQgdGFibGUgYXR0cmlidXRlcyBvZiBIVE1MIDMuMgotICAgICB0YWJsZXMsIHRoZSBlbGVtZW50IHR5cGVzIGRlY2xhcmVkIGhlcmVpbiBhbHNvIGluY2x1ZGVzIGFsbAotICAgICBIVE1MIDQgY29tbW9uIGFuZCBtb3N0IG9mIHRoZSBIVE1MIDQgdGFibGUgYXR0cmlidXRlcy4KLS0tPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIGVsZW1lbnQgdHlwZSBuYW1lczoKLS0tPgotPCFFTlRJVFkgJSB0YWJsZS5xbmFtZSAgInRhYmxlIiA+Ci08IUVOVElUWSAlIGNhcHRpb24ucW5hbWUgICJjYXB0aW9uIiA+Ci08IUVOVElUWSAlIHRyLnFuYW1lICAidHIiID4KLTwhRU5USVRZICUgdGgucW5hbWUgICJ0aCIgPgotPCFFTlRJVFkgJSB0ZC5xbmFtZSAgInRkIiA+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cwotLS0+Ci08IUVOVElUWSAlIENlbGxIQWxpZ24uYXR0cmliCi0gICAgICJhbGlnbiAgICAgICAgKCBsZWZ0Ci0gICAgICAgICAgICAgICAgICAgfCBjZW50ZXIKLSAgICAgICAgICAgICAgICAgICB8IHJpZ2h0ICkgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMKLS0tPgotPCFFTlRJVFkgJSBDZWxsVkFsaWduLmF0dHJpYgotICAgICAidmFsaWduICAgICAgICggdG9wCi0gICAgICAgICAgICAgICAgICAgfCBtaWRkbGUKLSAgICAgICAgICAgICAgICAgICB8IGJvdHRvbSApICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gc2NvcGUgaXMgc2ltcGxlciB0aGFuIGF4ZXMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzCi0tLT4KLTwhRU5USVRZICUgc2NvcGUuYXR0cmliCi0gICAgICJzY29wZSAgICAgICAgKCByb3cgfCBjb2wgICkgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHRhYmxlOiBUYWJsZSBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0YWJsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRhYmxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0YWJsZS5jb250ZW50Ci0gICAgICIoICVjYXB0aW9uLnFuYW1lOz8sICV0ci5xbmFtZTsrICkiCi0+Ci08IUVMRU1FTlQgJXRhYmxlLnFuYW1lOyAgJXRhYmxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRhYmxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGFibGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0YWJsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGFibGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHN1bW1hcnkgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHRhYmxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY2FwdGlvbjogVGFibGUgQ2FwdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGNhcHRpb24uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjYXB0aW9uLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjYXB0aW9uLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlY2FwdGlvbi5xbmFtZTsgICVjYXB0aW9uLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNhcHRpb24uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjYXB0aW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY2FwdGlvbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY2FwdGlvbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY2FwdGlvbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRyOiBUYWJsZSBSb3cgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ci5jb250ZW50ICAiKCAldGgucW5hbWU7IHwgJXRkLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV0ci5xbmFtZTsgICV0ci5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ci5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldHIuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0ci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRoOiBUYWJsZSBIZWFkZXIgQ2VsbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSB0aCBpcyBmb3IgaGVhZGVyIGNlbGxzLCB0ZCBmb3IgZGF0YSwKLSAgICAgYnV0IGZvciBjZWxscyBhY3RpbmcgYXMgYm90aCB1c2UgdGQKLS0tPgotCi08IUVOVElUWSAlIHRoLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGguZWxlbWVudDtbCi08IUVOVElUWSAlIHRoLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Tm9UYWJsZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICV0aC5xbmFtZTsgICV0aC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0aC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRoLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGguYXR0bGlzdDtbCi08IUFUVExJU1QgJXRoLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhYmJyICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBheGlzICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWFkZXJzICAgICAgSURSRUZTICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAlc2NvcGUuYXR0cmliOwotICAgICAgcm93c3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIGNvbHNwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0aC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRkOiBUYWJsZSBEYXRhIENlbGwgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvd05vVGFibGUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAldGQucW5hbWU7ICAldGQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWJiciAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgYXhpcyAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVhZGVycyAgICAgIElEUkVGUyAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgJXNjb3BlLmF0dHJpYjsKLSAgICAgIHJvd3NwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICBjb2xzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmFzaWMtdGFibGUtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBGb3JtcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1mb3JtLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWZvcm0ubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZm9ybS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIEZvcm1zIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmFzaWMtZm9ybS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBTaW1wbGlmaWVkIEZvcm1zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNpYy1mb3JtLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCBCYXNpYywgYSBwcm9wZXIgc3Vic2V0IG9mIFhIVE1MLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzaWMgRm9ybXMgMS4wLy9FTiIgIAotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWJhc2ljLWZvcm0tMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmFzaWMgRm9ybXMKLQotICAgICBUaGlzIGZvcm1zIG1vZHVsZSBpcyBiYXNlZCBvbiB0aGUgSFRNTCAzLjIgZm9ybXMgbW9kZWwsIHdpdGgKLSAgICAgdGhlIFdBSS1yZXF1ZXN0ZWQgYWRkaXRpb24gb2YgdGhlIGxhYmVsIGVsZW1lbnQuIFdoaWxlIHRoaXMgCi0gICAgIG1vZHVsZSBlc3NlbnRpYWxseSBtaW1pY3MgdGhlIGNvbnRlbnQgbW9kZWwgYW5kIGF0dHJpYnV0ZXMgb2YgCi0gICAgIEhUTUwgMy4yIGZvcm1zLCB0aGUgZWxlbWVudCB0eXBlcyBkZWNsYXJlZCBoZXJlaW4gYWxzbyBpbmNsdWRlCi0gICAgIGFsbCBIVE1MIDQgY29tbW9uIGF0dHJpYnV0ZXMuCi0KLSAgICAgICAgZm9ybSwgbGFiZWwsIGlucHV0LCBzZWxlY3QsIG9wdGlvbiwgdGV4dGFyZWEKLS0tPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIGVsZW1lbnQgdHlwZSBuYW1lczoKLS0tPgotPCFFTlRJVFkgJSBmb3JtLnFuYW1lICAiZm9ybSIgPgotPCFFTlRJVFkgJSBsYWJlbC5xbmFtZSAgImxhYmVsIiA+Ci08IUVOVElUWSAlIGlucHV0LnFuYW1lICAiaW5wdXQiID4KLTwhRU5USVRZICUgc2VsZWN0LnFuYW1lICAic2VsZWN0IiA+Ci08IUVOVElUWSAlIG9wdGlvbi5xbmFtZSAgIm9wdGlvbiIgPgotPCFFTlRJVFkgJSB0ZXh0YXJlYS5xbmFtZSAgInRleHRhcmVhIiA+Ci0KLTwhLS0gJUJsa05vRm9ybS5taXg7IGluY2x1ZGVzIGFsbCBub24tZm9ybSBibG9jayBlbGVtZW50cywKLSAgICAgcGx1cyAlTWlzYy5jbGFzczsKLS0tPgotPCFFTlRJVFkgJSBCbGtOb0Zvcm0ubWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlQmxrUHJlcy5jbGFzczsKLSAgICAgIHwgJXRhYmxlLnFuYW1lOyAKLSAgICAgICVCbG9jay5leHRyYTsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBmb3JtOiBGb3JtIEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZm9ybS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWZvcm0uZWxlbWVudDtbCi08IUVOVElUWSAlIGZvcm0uY29udGVudAotICAgICAiKCAlQmxrTm9Gb3JtLm1peDsgKSsiCi0+Ci08IUVMRU1FTlQgJWZvcm0ucW5hbWU7ICAlZm9ybS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBmb3JtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZm9ybS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWZvcm0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWZvcm0ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFjdGlvbiAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBtZXRob2QgICAgICAgKCBnZXQgfCBwb3N0ICkgICAgICAgICAgICdnZXQnCi0gICAgICBlbmN0eXBlICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCi0+Ci08IS0tIGVuZCBvZiBmb3JtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbGFiZWw6IEZvcm0gRmllbGQgTGFiZWwgVGV4dCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxhYmVsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGFiZWwuZWxlbWVudDtbCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkCi0tLT4KLTwhRU5USVRZICUgbGFiZWwuY29udGVudAotICAgICAiKCAjUENEQVRBIAotICAgICAgfCAlaW5wdXQucW5hbWU7IHwgJXNlbGVjdC5xbmFtZTsgfCAldGV4dGFyZWEucW5hbWU7Ci0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVJbmxQcmVzLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsgKSoiCi0+Ci08IUVMRU1FTlQgJWxhYmVsLnFuYW1lOyAgJWxhYmVsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxhYmVsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGFiZWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsYWJlbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGFiZWwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGZvciAgICAgICAgICBJRFJFRiAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGxhYmVsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaW5wdXQ6IEZvcm0gQ29udHJvbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGlucHV0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaW5wdXQuZWxlbWVudDtbCi08IUVOVElUWSAlIGlucHV0LmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTEVNRU5UICVpbnB1dC5xbmFtZTsgICVpbnB1dC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpbnB1dC5lbGVtZW50IC0tPl1dPgotCi08IS0tIEJhc2ljIEZvcm1zIHJlbW92ZXMgJ2ltYWdlJyBhbmQgJ2ZpbGUnIGlucHV0IHR5cGVzLgotLS0+Ci08IUVOVElUWSAlIGlucHV0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaW5wdXQuYXR0bGlzdDtbCi08IUVOVElUWSAlIElucHV0VHlwZS5jbGFzcwotICAgICAiKCB0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIAotICAgICAgfCBzdWJtaXQgfCByZXNldCB8IGhpZGRlbiApIgotPgotPCEtLSBhdHRyaWJ1dGUgbmFtZSByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldAotLS0+Ci08IUFUVExJU1QgJWlucHV0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICB0eXBlICAgICAgICAgJUlucHV0VHlwZS5jbGFzczsgICAgICAgICd0ZXh0JwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2hlY2tlZCAgICAgICggY2hlY2tlZCApICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgc2l6ZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgbWF4bGVuZ3RoICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgc3JjICAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW5wdXQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBzZWxlY3Q6IE9wdGlvbiBTZWxlY3RvciAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc2VsZWN0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc2VsZWN0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzZWxlY3QuY29udGVudCAgIiggJW9wdGlvbi5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlc2VsZWN0LnFuYW1lOyAgJXNlbGVjdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzZWxlY3QuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzZWxlY3QuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzZWxlY3QuYXR0bGlzdDtbCi08IUFUVExJU1QgJXNlbGVjdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgc2l6ZSAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgbXVsdGlwbGUgICAgICggbXVsdGlwbGUgKSAgICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygc2VsZWN0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gb3B0aW9uOiBTZWxlY3RhYmxlIENob2ljZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG9wdGlvbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9wdGlvbi5lbGVtZW50O1sKLTwhRU5USVRZICUgb3B0aW9uLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTEVNRU5UICVvcHRpb24ucW5hbWU7ICAlb3B0aW9uLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9wdGlvbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9wdGlvbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9wdGlvbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb3B0aW9uLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzZWxlY3RlZCAgICAgKCBzZWxlY3RlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBvcHRpb24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0ZXh0YXJlYTogTXVsdGktTGluZSBUZXh0IEZpZWxkIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGV4dGFyZWEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ZXh0YXJlYS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGV4dGFyZWEuY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVMRU1FTlQgJXRleHRhcmVhLnFuYW1lOyAgJXRleHRhcmVhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRleHRhcmVhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGV4dGFyZWEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ZXh0YXJlYS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGV4dGFyZWEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHJvd3MgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI1JFUVVJUkVECi0gICAgICBjb2xzICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNSRVFVSVJFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgdGV4dGFyZWEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmFzaWMtZm9ybS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIExpbmsgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWxpbmsubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbGluay5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1saW5rLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGluayBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtbGluay0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBMaW5rIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1saW5rLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpbmsgRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWxpbmstMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGluayBlbGVtZW50Ci0KLSAgICAgICAgbGluawotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBsaW5rIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHdoaWNoIGNvdWxkIChpbiBwcmluY2lwbGUpIGJlIHVzZWQgdG8gZGVmaW5lIGRvY3VtZW50LWxldmVsIGxpbmtzCi0gICAgIHRvIGV4dGVybmFsIHJlc291cmNlcyBzdWNoIGFzOgotCi0gICAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cywgZS5nLiBzdGFydCwgY29udGVudHMsCi0gICAgICAgIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPSJzdHlsZXNoZWV0IikKLSAgICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD0ic2NyaXB0IikKLSAgICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YgaHRtbCBub2RlcyBhcmUKLSAgICAgICAgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgICAgZS5nLiBhIHBvc3RzY3JpcHQgb3IgcGRmIHZlcnNpb24gKHJlbD0iYWx0ZXJuYXRlIiBtZWRpYT0icHJpbnQiKQotLS0+Ci0KLTwhLS0gbGluazogTWVkaWEtSW5kZXBlbmRlbnQgTGluayAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxpbmsuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsaW5rLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBsaW5rLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBsaW5rLnFuYW1lICAibGluayIgPgotPCFFTEVNRU5UICVsaW5rLnFuYW1lOyAgJWxpbmsuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGluay5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxpbmsuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsaW5rLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsaW5rLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaGFyc2V0ICAgICAgJUNoYXJzZXQuZGF0YXR5cGU7ICAgICAgICNJTVBMSUVECi0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBocmVmbGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICByZWwgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICByZXYgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICBtZWRpYSAgICAgICAgJU1lZGlhRGVzYy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBsaW5rLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWxpbmstMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBEb2N1bWVudCBNZXRhaW5mb3JtYXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1tZXRhLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW1ldGEubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbWV0YS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIE1ldGFpbmZvcm1hdGlvbiAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLW1ldGEtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRG9jdW1lbnQgTWV0YWluZm9ybWF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbWV0YS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBNZXRhaW5mb3JtYXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1tZXRhLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE1ldGEgSW5mb3JtYXRpb24KLQotICAgICAgICBtZXRhCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIG1ldGEgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBwcm92aWRlIGRlY2xhcmF0aXZlIGRvY3VtZW50IG1ldGFpbmZvcm1hdGlvbi4KLS0tPgotCi08IS0tIG1ldGE6IEdlbmVyaWMgTWV0YWluZm9ybWF0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBtZXRhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbWV0YS5lbGVtZW50O1sKLTwhRU5USVRZICUgbWV0YS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgbWV0YS5xbmFtZSAgIm1ldGEiID4KLTwhRUxFTUVOVCAlbWV0YS5xbmFtZTsgICVtZXRhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG1ldGEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBtZXRhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbWV0YS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbWV0YS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICBodHRwLWVxdWl2ICAgTk1UT0tFTiAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBuYW1lICAgICAgICAgTk1UT0tFTiAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjb250ZW50ICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgc2NoZW1lICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbWV0YS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1tZXRhLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gQmFzZSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtYmFzZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1iYXNlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJhc2UubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1iYXNlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJhc2UgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2UtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtYmFzZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCYXNlIGVsZW1lbnQKLQotICAgICAgICBiYXNlCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGJhc2UgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBkZWZpbmUgYSBiYXNlIFVSSSBhZ2FpbnN0IHdoaWNoIHJlbGF0aXZlIFVSSXMgaW4gdGhlCi0gICAgIGRvY3VtZW50IHdpbGwgYmUgcmVzb2x2ZWQuCi0KLSAgICAgTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGFsc28gcmVkZWNsYXJlcyB0aGUgY29udGVudCBtb2RlbCBmb3IKLSAgICAgdGhlIGhlYWQgZWxlbWVudCB0byBpbmNsdWRlIHRoZSBiYXNlIGVsZW1lbnQuCi0tLT4KLQotPCEtLSBiYXNlOiBEb2N1bWVudCBCYXNlIFVSSSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYmFzZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJhc2UuZWxlbWVudDtbCi08IUVOVElUWSAlIGJhc2UuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGJhc2UucW5hbWUgICJiYXNlIiA+Ci08IUVMRU1FTlQgJWJhc2UucW5hbWU7ICAlYmFzZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBiYXNlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmFzZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJhc2UuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJhc2UucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjUkVRVUlSRUQKLT4KLTwhLS0gZW5kIG9mIGJhc2UuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQKLSAgICAiKCAlSGVhZE9wdHMubWl4OywKLSAgICAgKCAoICV0aXRsZS5xbmFtZTssICVIZWFkT3B0cy5taXg7LCAoICViYXNlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKT8gKQotICAgICB8ICggJWJhc2UucW5hbWU7LCAlSGVhZE9wdHMubWl4OywgKCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApKSkpIgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iYXNlLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gUGFyYW0gRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtcGFyYW0ubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtcGFyYW0ubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtcGFyYW0ubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBQYXJhbSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtcGFyYW0tMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgUGFyYW0gRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXBhcmFtLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFBhcmFtIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1wYXJhbS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBQYXJhbWV0ZXJzIGZvciBKYXZhIEFwcGxldHMgYW5kIEVtYmVkZGVkIE9iamVjdHMKLQotICAgICAgICBwYXJhbQotCi0gICAgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHBhcmFtIGVsZW1lbnQsIAotICAgICB1c2VkIHRvIHByb3ZpZGUgbmFtZWQgcHJvcGVydHkgdmFsdWVzIGZvciB0aGUgYXBwbGV0Ci0gICAgIGFuZCBvYmplY3QgZWxlbWVudHMuIAotLS0+Ci0KLTwhLS0gcGFyYW06IE5hbWVkIFByb3BlcnR5IFZhbHVlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHBhcmFtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcGFyYW0uZWxlbWVudDtbCi08IUVOVElUWSAlIHBhcmFtLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBwYXJhbS5xbmFtZSAgInBhcmFtIiA+Ci08IUVMRU1FTlQgJXBhcmFtLnFuYW1lOyAgJXBhcmFtLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHBhcmFtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcGFyYW0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwYXJhbS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcGFyYW0ucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOyAKLSAgICAgICVpZC5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWV0eXBlICAgICggZGF0YSB8IHJlZiB8IG9iamVjdCApICAnZGF0YScKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHBhcmFtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXBhcmFtLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gRW1iZWRkZWQgT2JqZWN0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtb2JqZWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW9iamVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1vYmplY3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBFbWJlZGRlZCBPYmplY3QgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1vYmplY3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRW1iZWRkZWQgT2JqZWN0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtb2JqZWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVtYmVkZGVkIE9iamVjdCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLW9iamVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBFbWJlZGRlZCBPYmplY3RzCi0KLSAgICAgICAgb2JqZWN0Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIG9iamVjdCBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB1c2VkIHRvIGVtYmVkIGV4dGVybmFsIG9iamVjdHMgYXMgcGFydCBvZiBYSFRNTCBwYWdlcy4gSW4gdGhlCi0gICAgIGRvY3VtZW50LCBwbGFjZSBwYXJhbSBlbGVtZW50cyBwcmlvciB0byB0aGUgb2JqZWN0IGVsZW1lbnRzIAotICAgICB0aGF0IHJlcXVpcmUgdGhlaXIgY29udGVudC4KLQotICAgICBOb3RlIHRoYXQgdXNlIG9mIHRoaXMgbW9kdWxlIHJlcXVpcmVzIGluc3RhbnRpYXRpb24gb2YgdGhlIAotICAgICBQYXJhbSBFbGVtZW50IE1vZHVsZSBwcmlvciB0byB0aGlzIG1vZHVsZS4KLS0tPgotCi08IS0tIG9iamVjdDogR2VuZXJpYyBFbWJlZGRlZCBPYmplY3QgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvYmplY3QuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvYmplY3QuZWxlbWVudDtbCi08IUVOVElUWSAlIG9iamVjdC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7IHwgJXBhcmFtLnFuYW1lOyApKiIKLT4KLTwhRU5USVRZICUgb2JqZWN0LnFuYW1lICAib2JqZWN0IiA+Ci08IUVMRU1FTlQgJW9iamVjdC5xbmFtZTsgICVvYmplY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb2JqZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb2JqZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb2JqZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvYmplY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGRlY2xhcmUgICAgICAoIGRlY2xhcmUgKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNsYXNzaWQgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNvZGViYXNlICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRhdGEgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGNvZGV0eXBlICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGFyY2hpdmUgICAgICAlVVJJcy5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHN0YW5kYnkgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlaWdodCAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHdpZHRoICAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG9iamVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1vYmplY3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1zdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBEb2N1bWVudCBTdHJ1Y3R1cmUgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1zdHJ1Y3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgU3RydWN0dXJlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3RydWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIERvY3VtZW50IFN0cnVjdHVyZSAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLXN0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBEb2N1bWVudCBTdHJ1Y3R1cmUKLQotICAgICAgICB0aXRsZSwgaGVhZCwgYm9keSwgaHRtbAotCi0gICAgIFRoZSBTdHJ1Y3R1cmUgTW9kdWxlIGRlZmluZXMgdGhlIG1ham9yIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kIAotICAgICB0aGVpciBhdHRyaWJ1dGVzLgotCi0gICAgIE5vdGUgdGhhdCB0aGUgY29udGVudCBtb2RlbCBvZiB0aGUgaGVhZCBlbGVtZW50IHR5cGUgaXMgcmVkZWNsYXJlZCAKLSAgICAgd2hlbiB0aGUgQmFzZSBNb2R1bGUgaXMgaW5jbHVkZWQgaW4gdGhlIERURC4KLQotICAgICBUaGUgcGFyYW1ldGVyIGVudGl0eSBjb250YWluaW5nIHRoZSBYTUwgbmFtZXNwYWNlIFVSSSB2YWx1ZSB1c2VkIAotICAgICBmb3IgWEhUTUwgaXMgJyVYSFRNTC54bWxuczsnLCBkZWZpbmVkIGluIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlLgotLS0+Ci0KLTwhLS0gdGl0bGU6IERvY3VtZW50IFRpdGxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFRoZSB0aXRsZSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotLS0+Ci0KLTwhRU5USVRZICUgdGl0bGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0aXRsZS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGl0bGUuY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVOVElUWSAlIHRpdGxlLnFuYW1lICAidGl0bGUiID4KLTwhRUxFTUVOVCAldGl0bGUucW5hbWU7ICAldGl0bGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGl0bGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0aXRsZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRpdGxlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0aXRsZS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7IAotICAgICAgJUkxOG4uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGl0bGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBoZWFkOiBEb2N1bWVudCBIZWFkIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaGVhZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWhlYWQuZWxlbWVudDtbCi08IUVOVElUWSAlIGhlYWQuY29udGVudAotICAgICIoICVIZWFkT3B0cy5taXg7LCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApIgotPgotPCFFTlRJVFkgJSBoZWFkLnFuYW1lICAiaGVhZCIgPgotPCFFTEVNRU5UICVoZWFkLnFuYW1lOyAgJWhlYWQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaGVhZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGhlYWQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoZWFkLmF0dGxpc3Q7WwotPCEtLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSB3aXRoIGRvY3VtZW50IHByb2ZpbGVzCi0tLT4KLTwhRU5USVRZICUgcHJvZmlsZS5hdHRyaWIKLSAgICAgInByb2ZpbGUgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgJyVYSFRNTC5wcm9maWxlOyciCi0+Ci0KLTwhQVRUTElTVCAlaGVhZC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7IAotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgJXByb2ZpbGUuYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaGVhZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGJvZHk6IERvY3VtZW50IEJvZHkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBib2R5LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYm9keS5lbGVtZW50O1sKLTwhRU5USVRZICUgYm9keS5jb250ZW50Ci0gICAgICIoICVCbG9jay5taXg7ICkrIgotPgotPCFFTlRJVFkgJSBib2R5LnFuYW1lICAiYm9keSIgPgotPCFFTEVNRU5UICVib2R5LnFuYW1lOyAgJWJvZHkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYm9keS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJvZHkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVib2R5LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVib2R5LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBib2R5LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaHRtbDogWEhUTUwgRG9jdW1lbnQgRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGh0bWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVodG1sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgICIoICVoZWFkLnFuYW1lOywgJWJvZHkucW5hbWU7ICkiID4KLTwhRU5USVRZICUgaHRtbC5xbmFtZSAgImh0bWwiID4KLTwhRUxFTUVOVCAlaHRtbC5xbmFtZTsgICVodG1sLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGh0bWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBodG1sLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaHRtbC5hdHRsaXN0O1sKLTwhLS0gdmVyc2lvbiBhdHRyaWJ1dGUgdmFsdWUgZGVmaW5lZCBpbiBkcml2ZXIKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC52ZXJzaW9uLmF0dHJpYgotICAgICAidmVyc2lvbiAgICAgICVGUEkuZGF0YXR5cGU7ICAgICAgICAgICAjRklYRUQgJyVYSFRNTC52ZXJzaW9uOyciCi0+Ci0KLTwhLS0gc2VlIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlIGZvciBpbmZvcm1hdGlvbiAKLSAgICAgb24gaG93IHRvIGV4dGVuZCBYSFRNTCB1c2luZyBYTUwgbmFtZXNwYWNlcyAKLS0tPgotPCFBVFRMSVNUICVodG1sLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsgCi0gICAgICAlWEhUTUwudmVyc2lvbi5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBodG1sLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXN0cnVjdC0xLm1vZCAtLT4KLQotCi08IS0tIGVuZCBvZiBYSFRNTCBCYXNpYyAxLjAgRFREICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLWxhdDEuZW50IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLWxhdDEuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjE5OGVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1sYXQxLmVudAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODYKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgIDwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLWxhdDEuZW50Ij4KLSAgICAlSFRNTGxhdDE7Ci0tLT4KLQotPCFFTlRJVFkgbmJzcCAgICImIzE2MDsiPiA8IS0tIG5vLWJyZWFrIHNwYWNlID0gbm9uLWJyZWFraW5nIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBMCBJU09udW0gLS0+Ci08IUVOVElUWSBpZXhjbCAgIiYjMTYxOyI+IDwhLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaywgVSswMEExIElTT251bSAtLT4KLTwhRU5USVRZIGNlbnQgICAiJiMxNjI7Ij4gPCEtLSBjZW50IHNpZ24sIFUrMDBBMiBJU09udW0gLS0+Ci08IUVOVElUWSBwb3VuZCAgIiYjMTYzOyI+IDwhLS0gcG91bmQgc2lnbiwgVSswMEEzIElTT251bSAtLT4KLTwhRU5USVRZIGN1cnJlbiAiJiMxNjQ7Ij4gPCEtLSBjdXJyZW5jeSBzaWduLCBVKzAwQTQgSVNPbnVtIC0tPgotPCFFTlRJVFkgeWVuICAgICImIzE2NTsiPiA8IS0tIHllbiBzaWduID0geXVhbiBzaWduLCBVKzAwQTUgSVNPbnVtIC0tPgotPCFFTlRJVFkgYnJ2YmFyICImIzE2NjsiPiA8IS0tIGJyb2tlbiBiYXIgPSBicm9rZW4gdmVydGljYWwgYmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBNiBJU09udW0gLS0+Ci08IUVOVElUWSBzZWN0ICAgIiYjMTY3OyI+IDwhLS0gc2VjdGlvbiBzaWduLCBVKzAwQTcgSVNPbnVtIC0tPgotPCFFTlRJVFkgdW1sICAgICImIzE2ODsiPiA8IS0tIGRpYWVyZXNpcyA9IHNwYWNpbmcgZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBOCBJU09kaWEgLS0+Ci08IUVOVElUWSBjb3B5ICAgIiYjMTY5OyI+IDwhLS0gY29weXJpZ2h0IHNpZ24sIFUrMDBBOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRmICAgIiYjMTcwOyI+IDwhLS0gZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0gLS0+Ci08IUVOVElUWSBsYXF1byAgIiYjMTcxOyI+IDwhLS0gbGVmdC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtIC0tPgotPCFFTlRJVFkgbm90ICAgICImIzE3MjsiPiA8IS0tIG5vdCBzaWduID0gYW5nbGVkIGRhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFDIElTT251bSAtLT4KLTwhRU5USVRZIHNoeSAgICAiJiMxNzM7Ij4gPCEtLSBzb2Z0IGh5cGhlbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRCBJU09udW0gLS0+Ci08IUVOVElUWSByZWcgICAgIiYjMTc0OyI+IDwhLS0gcmVnaXN0ZXJlZCBzaWduID0gcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFFIElTT251bSAtLT4KLTwhRU5USVRZIG1hY3IgICAiJiMxNzU7Ij4gPCEtLSBtYWNyb24gPSBzcGFjaW5nIG1hY3JvbiA9IG92ZXJsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBUEwgb3ZlcmJhciwgVSswMEFGIElTT2RpYSAtLT4KLTwhRU5USVRZIGRlZyAgICAiJiMxNzY7Ij4gPCEtLSBkZWdyZWUgc2lnbiwgVSswMEIwIElTT251bSAtLT4KLTwhRU5USVRZIHBsdXNtbiAiJiMxNzc7Ij4gPCEtLSBwbHVzLW1pbnVzIHNpZ24gPSBwbHVzLW9yLW1pbnVzIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEIxIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDIgICAiJiMxNzg7Ij4gPCEtLSBzdXBlcnNjcmlwdCB0d28gPSBzdXBlcnNjcmlwdCBkaWdpdCB0d28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNxdWFyZWQsIFUrMDBCMiBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAzICAgIiYjMTc5OyI+IDwhLS0gc3VwZXJzY3JpcHQgdGhyZWUgPSBzdXBlcnNjcmlwdCBkaWdpdCB0aHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY3ViZWQsIFUrMDBCMyBJU09udW0gLS0+Ci08IUVOVElUWSBhY3V0ZSAgIiYjMTgwOyI+IDwhLS0gYWN1dGUgYWNjZW50ID0gc3BhY2luZyBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjQgSVNPZGlhIC0tPgotPCFFTlRJVFkgbWljcm8gICImIzE4MTsiPiA8IS0tIG1pY3JvIHNpZ24sIFUrMDBCNSBJU09udW0gLS0+Ci08IUVOVElUWSBwYXJhICAgIiYjMTgyOyI+IDwhLS0gcGlsY3JvdyBzaWduID0gcGFyYWdyYXBoIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI2IElTT251bSAtLT4KLTwhRU5USVRZIG1pZGRvdCAiJiMxODM7Ij4gPCEtLSBtaWRkbGUgZG90ID0gR2VvcmdpYW4gY29tbWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEdyZWVrIG1pZGRsZSBkb3QsIFUrMDBCNyBJU09udW0gLS0+Ci08IUVOVElUWSBjZWRpbCAgIiYjMTg0OyI+IDwhLS0gY2VkaWxsYSA9IHNwYWNpbmcgY2VkaWxsYSwgVSswMEI4IElTT2RpYSAtLT4KLTwhRU5USVRZIHN1cDEgICAiJiMxODU7Ij4gPCEtLSBzdXBlcnNjcmlwdCBvbmUgPSBzdXBlcnNjcmlwdCBkaWdpdCBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZG0gICAiJiMxODY7Ij4gPCEtLSBtYXNjdWxpbmUgb3JkaW5hbCBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEJBIElTT251bSAtLT4KLTwhRU5USVRZIHJhcXVvICAiJiMxODc7Ij4gPCEtLSByaWdodC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHJpZ2h0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEJCIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxNCAiJiMxODg7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBxdWFydGVyLCBVKzAwQkMgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzEyICImIzE4OTsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgaGFsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIGhhbGYsIFUrMDBCRCBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMzQgIiYjMTkwOyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiB0aHJlZSBxdWFydGVycywgVSswMEJFIElTT251bSAtLT4KLTwhRU5USVRZIGlxdWVzdCAiJiMxOTE7Ij4gPCEtLSBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0dXJuZWQgcXVlc3Rpb24gbWFyaywgVSswMEJGIElTT251bSAtLT4KLTwhRU5USVRZIEFncmF2ZSAiJiMxOTI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBYWN1dGUgIiYjMTkzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWNpcmMgICImIzE5NDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXRpbGRlICImIzE5NTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF1bWwgICAiJiMxOTY7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXJpbmcgICImIzE5NzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBRWxpZyAgIiYjMTk4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgQUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBDY2VkaWwgIiYjMTk5OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQyB3aXRoIGNlZGlsbGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFZ3JhdmUgIiYjMjAwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWFjdXRlICImIzIwMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVjaXJjICAiJiMyMDI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0EgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEV1bWwgICAiJiMyMDM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWdyYXZlICImIzIwNDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0MgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElhY3V0ZSAiJiMyMDU7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJY2lyYyAgIiYjMjA2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJdW1sICAgIiYjMjA3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0YgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVUSCAgICAiJiMyMDg7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFVEgsIFUrMDBEMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgTnRpbGRlICImIzIwOTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9ncmF2ZSAiJiMyMTA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPYWN1dGUgIiYjMjExOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2NpcmMgICImIzIxMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENCBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3RpbGRlICImIzIxMzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE91bWwgICAiJiMyMTQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGltZXMgICImIzIxNTsiPiA8IS0tIG11bHRpcGxpY2F0aW9uIHNpZ24sIFUrMDBENyBJU09udW0gLS0+Ci08IUVOVElUWSBPc2xhc2ggIiYjMjE2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHN0cm9rZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyBzbGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDggSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVncmF2ZSAiJiMyMTc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVYWN1dGUgIiYjMjE4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWNpcmMgICImIzIxOTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgVXVtbCAgICImIzIyMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBZYWN1dGUgIiYjMjIxOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVEhPUk4gICImIzIyMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFRIT1JOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERSBJU09sYXQxIC0tPgotPCFFTlRJVFkgc3psaWcgICImIzIyMzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBzaGFycCBzID0gZXNzLXplZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFncmF2ZSAiJiMyMjQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFhY3V0ZSAiJiMyMjU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWNpcmMgICImIzIyNjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF0aWxkZSAiJiMyMjc7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXVtbCAgICImIzIyODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXJpbmcgICImIzIyOTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFlbGlnICAiJiMyMzA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxpZ2F0dXJlIGFlLCBVKzAwRTYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGNjZWRpbCAiJiMyMzE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYyB3aXRoIGNlZGlsbGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlZ3JhdmUgIiYjMjMyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTggSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVhY3V0ZSAiJiMyMzM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWNpcmMgICImIzIzNDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV1bWwgICAiJiMyMzU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlncmF2ZSAiJiMyMzY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWFjdXRlICImIzIzNzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpY2lyYyAgIiYjMjM4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgaXVtbCAgICImIzIzOTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXRoICAgICImIzI0MDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBldGgsIFUrMDBGMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgbnRpbGRlICImIzI0MTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBuIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvZ3JhdmUgIiYjMjQyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9hY3V0ZSAiJiMyNDM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2NpcmMgICImIzI0NDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG90aWxkZSAiJiMyNDU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3VtbCAgICImIzI0NjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZGl2aWRlICImIzI0NzsiPiA8IS0tIGRpdmlzaW9uIHNpZ24sIFUrMDBGNyBJU09udW0gLS0+Ci08IUVOVElUWSBvc2xhc2ggIiYjMjQ4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBzdHJva2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyBzbGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjggSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVncmF2ZSAiJiMyNDk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWFjdXRlICImIzI1MDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZBIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Y2lyYyAgIiYjMjUxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdXVtbCAgICImIzI1MjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgeWFjdXRlICImIzI1MzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZEIElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aG9ybiAgIiYjMjU0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHRob3JuIHdpdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZFIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5dW1sICAgIiYjMjU1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZGIElTT2xhdDEgLS0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTE1MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLW1vYmlsZTEwLWZsYXQuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMzIxNiArMCwwIEBACi08IS0tIFhIVE1MIE1vYmlsZSAxLjAgRFREICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW1vYmlsZTEwLmR0ZCAtLT4KLTwhLS0gCi0gICAgIFRoaXMgaXMgWEhUTUwgTW9iaWxlIHByb2ZpbGUsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgCi0gICAgIAlAV2lyZWxlc3MgQXBwbGljYXRpb24gUHJvdG9jb2wgRm9ydW0sIEx0ZC4gMjAwMS4KLQotCVRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFdpcmVsZXNzIEFwcGxpY2F0aW9uIFByb3RvY29sIEZvcnVtIEx0ZC4gCi0JV2ViIHNpdGUgKGh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL3doYXQvY29weXJpZ2h0Lmh0bSkuCi0gICAgCi0tLT4KLTwhLS0gVGhpcyBpcyB0aGUgZHJpdmVyIGZpbGUgZm9yIHZlcnNpb24gMS4wIG9mIHRoZSBYSFRNTCBNb2JpbGUgRFRELgotCi0gICAgIFRoaXMgRFREIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgIFBVQkxJQzogIi0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iCi0gICAgIFNZU1RFTTogImh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiCi0tLT4KLTwhRU5USVRZICUgWEhUTUwudmVyc2lvbiAgIi0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iID4KLQotPCEtLSBVc2UgdGhpcyBVUkkgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgbmFtZXNwYWNlOgotCi0gICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQotICAgICBTZWUgdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUgZm9yIGluZm9ybWF0aW9uCi0gICAgIG9uIHRoZSB1c2Ugb2YgbmFtZXNwYWNlIHByZWZpeGVzIGluIHRoZSBEVEQuCi0tLT4KLTwhRU5USVRZICUgTlMucHJlZml4ZWQgIklHTk9SRSIgPgotPCFFTlRJVFkgJSBYSFRNTC5wcmVmaXggICIiID4KLQotPCEtLSBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB1c2luZyBYSFRNTCBNb2JpbGUgMS4wIGRpcmVjdGx5LCB1c2UKLSAgICAgdGhlIEZQSSBpbiB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiwgd2l0aCB0aGUgeG1sbnMgYXR0cmlidXRlCi0gICAgIG9uIHRoZSBkb2N1bWVudCBlbGVtZW50IHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLQotICAgICAgICAgPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0gICAgICAgICA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iCi0gICAgICAgICAgICAgImh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiID4KLSAgICAgICAgIDxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIiA+Ci0gICAgICAgICAuLi4KLSAgICAgICAgIDwvaHRtbD4KLS0tPgotCi08IS0tIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIHdpdGggZG9jdW1lbnQgcHJvZmlsZXMgLS0+Ci08IUVOVElUWSAlIFhIVE1MLnByb2ZpbGUgICIiID4KLQotPCEtLSBJbmxpbmUgU3R5bGUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHlsZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBTdHlsZSAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxzdHlsZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgU3R5bGUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxzdHlsZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBJbmxpbmUgU3R5bGUgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxzdHlsZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgU3R5bGUKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgJ3N0eWxlJyBhdHRyaWJ1dGUsIHVzZWQgdG8gc3VwcG9ydCBpbmxpbmUKLSAgICAgc3R5bGUgbWFya3VwLiBUaGlzIG1vZHVsZSBtdXN0IGJlIGluc3RhbnRpYXRlZCBwcmlvciB0byB0aGUgWEhUTUwKLSAgICAgQ29tbW9uIEF0dHJpYnV0ZXMgbW9kdWxlIGluIG9yZGVyIHRvIGJlIGluY2x1ZGVkIGluICVDb3JlLmF0dHJpYjsuCi0tLT4KLQotPCFFTlRJVFkgJSBzdHlsZS5hdHRyaWIKLSAgICAgInN0eWxlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLQotPCFFTlRJVFkgJSBDb3JlLmV4dHJhLmF0dHJpYgotICAgICAiJXN0eWxlLmF0dHJpYjsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHN0eWxlLTEubW9kIC0tPgotCi0KLTwhLS0gRG9jdW1lbnQgTW9kZWwgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwubW9kCi0gICAgIFBVQkxJQyAiLS8vV0FQRk9SVU0vL0VOVElUSUVTIFhIVE1MIE1vYmlsZSAxLjAgRG9jdW1lbnQgTW9kZWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQveGh0bWwtbW9iaWxlMTAtbW9kZWwtMS5tb2QiID4KLQotPCEtLSBYSFRNTCBGcmFtZXdvcmsgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgWEhUTUwuYmlkaSAgIklHTk9SRSIgPgotPCFFTlRJVFkgJSB4aHRtbC1mcmFtZXdvcmsubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1mcmFtZXdvcmstMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtZnJhbWV3b3JrLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWZyYW1ld29yay0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBNb2R1bGFyIEZyYW1ld29yawotCi0gICAgIFRoaXMgcmVxdWlyZWQgbW9kdWxlIGluc3RhbnRpYXRlcyB0aGUgbW9kdWxlcyBuZWVkZWQKLSAgICAgdG8gc3VwcG9ydCB0aGUgWEhUTUwgbW9kdWxhcml6YXRpb24gbW9kZWwsIGluY2x1ZGluZzoKLQotICAgICAgICArICBub3RhdGlvbnMKLSAgICAgICAgKyAgZGF0YXR5cGVzCi0gICAgICAgICsgIG5hbWVzcGFjZS1xdWFsaWZpZWQgbmFtZXMKLSAgICAgICAgKyAgY29tbW9uIGF0dHJpYnV0ZXMKLSAgICAgICAgKyAgZG9jdW1lbnQgbW9kZWwKLSAgICAgICAgKyAgY2hhcmFjdGVyIGVudGl0aWVzCi0KLSAgICAgVGhlIEludHJpbnNpYyBFdmVudHMgbW9kdWxlIGlzIGlnbm9yZWQgYnkgZGVmYXVsdCBidXQKLSAgICAgb2NjdXJzIGluIHRoaXMgbW9kdWxlIGJlY2F1c2UgaXQgbXVzdCBiZSBpbnN0YW50aWF0ZWQKLSAgICAgcHJpb3IgdG8gQXR0cmlidXRlcyBidXQgYWZ0ZXIgRGF0YXR5cGVzLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYXJjaC5tb2R1bGUgIklHTk9SRSIgPgotPCFbJXhodG1sLWFyY2gubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYXJjaC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgQXJjaGl0ZWN0dXJlIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYXJjaC0xLm1vZCIgPgotJXhodG1sLWFyY2gubW9kO11dPgotCi08IUVOVElUWSAlIHhodG1sLW5vdGF0aW9ucy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ub3RhdGlvbnMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbm90YXRpb25zLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT05TIFhIVE1MIE5vdGF0aW9ucyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLW5vdGF0aW9ucy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBOb3RhdGlvbnMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ub3RhdGlvbnMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT05TIFhIVE1MIE5vdGF0aW9ucyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW5vdGF0aW9ucy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBOb3RhdGlvbnMKLQotICAgICBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbm90YXRpb25zLCBtYW55IG9mIHRoZXNlIGltcG9ydGVkIGZyb20KLSAgICAgb3RoZXIgc3BlY2lmaWNhdGlvbnMgYW5kIHN0YW5kYXJkcy4gV2hlbiBhbiBleGlzdGluZyBGUEkgaXMKLSAgICAga25vd24sIGl0IGlzIGluY29ycG9yYXRlZCBoZXJlLgotLS0+Ci0KLTwhLS0gWE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBTR01MIGFuZCBYTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVzNDIFhNTCAxLjAgUmVjb21tZW5kYXRpb24gLS0+Ci08IU5PVEFUSU9OIHczYy14bWwKLSAgICAgUFVCTElDICJJU08gODg3OS8vTk9UQVRJT04gRXh0ZW5zaWJsZSBNYXJrdXAgTGFuZ3VhZ2UgKFhNTCkgMS4wLy9FTiIgPgotCi08IS0tIFhNTCAxLjAgQ0RBVEEgLS0+Ci08IU5PVEFUSU9OIGNkYXRhCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYTUwgMS4wOiBDREFUQS8vRU4iID4KLQotPCEtLSBTR01MIEZvcm1hbCBQdWJsaWMgSWRlbnRpZmllcnMgLS0+Ci08IU5PVEFUSU9OIGZwaQotICAgICBQVUJMSUMgIklTTyA4ODc5OjE5ODYvL05PVEFUSU9OIEZvcm1hbCBQdWJsaWMgSWRlbnRpZmllci8vRU4iID4KLQotPCEtLSBYSFRNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotCi08IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhTk9UQVRJT04gbGVuZ3RoCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMZW5ndGgvL0VOIiA+Ci0KLTwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLTwhTk9UQVRJT04gbGlua1R5cGVzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMaW5rVHlwZXMvL0VOIiA+Ci0KLTwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotPCFOT1RBVElPTiBtZWRpYURlc2MKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE1lZGlhRGVzYy8vRU4iID4KLQotPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci08IU5PVEFUSU9OIG11bHRpTGVuZ3RoCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBNdWx0aUxlbmd0aC8vRU4iID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IU5PVEFUSU9OIG51bWJlcgotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTnVtYmVyLy9FTiIgPgotCi08IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci08IU5PVEFUSU9OIHBpeGVscwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogUGl4ZWxzLy9FTiIgPgotCi08IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotPCFOT1RBVElPTiBzY3JpcHQKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFNjcmlwdC8vRU4iID4KLQotPCEtLSB0ZXh0dWFsIGNvbnRlbnQgLS0+Ci08IU5PVEFUSU9OIHRleHQKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFRleHQvL0VOIiA+Ci0KLTwhLS0gSW1wb3J0ZWQgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci08IU5PVEFUSU9OIGNoYXJhY3RlcgotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcmFjdGVyLy9FTiIgPgotCi08IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjaGFyc2V0Ci0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyc2V0Ly9FTiIgPgotCi08IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY2hhcnNldHMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJzZXRzLy9FTiIgPgotCi08IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNvbnRlbnRUeXBlCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDb250ZW50VHlwZS8vRU4iID4KLQotPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY29udGVudFR5cGVzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDb250ZW50VHlwZXMvL0VOIiA+Ci0KLTwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotPCFOT1RBVElPTiBkYXRldGltZQotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogRGF0ZXRpbWUvL0VOIiA+Ci0KLTwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzMwNjZdIC0tPgotPCFOT1RBVElPTiBsYW5ndWFnZUNvZGUKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IExhbmd1YWdlQ29kZS8vRU4iID4KLQotPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtVUkldIC0tPgotPCFOT1RBVElPTiB1cmkKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFVSSS8vRU4iID4KLQotPCEtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMsIHNlZSBbVVJJXSAtLT4KLTwhTk9UQVRJT04gdXJpcwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogVVJJcy8vRU4iID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbm90YXRpb25zLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZGF0YXR5cGVzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWRhdGF0eXBlcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1kYXRhdHlwZXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBEYXRhdHlwZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1kYXRhdHlwZXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRGF0YXR5cGVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtZGF0YXR5cGVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBEYXRhdHlwZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1kYXRhdHlwZXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRGF0YXR5cGVzCi0KLSAgICAgZGVmaW5lcyBjb250YWluZXJzIGZvciB0aGUgZm9sbG93aW5nIGRhdGF0eXBlcywgbWFueSBvZgotICAgICB0aGVzZSBpbXBvcnRlZCBmcm9tIG90aGVyIHNwZWNpZmljYXRpb25zIGFuZCBzdGFuZGFyZHMuCi0tLT4KLQotPCEtLSBMZW5ndGggZGVmaW5lZCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci0KLTwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFFTlRJVFkgJSBMZW5ndGguZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLTwhRU5USVRZICUgTGlua1R5cGVzLmRhdGF0eXBlICJOTVRPS0VOUyIgPgotCi08IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLTwhRU5USVRZICUgTWVkaWFEZXNjLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLTwhRU5USVRZICUgTXVsdGlMZW5ndGguZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIChOVU1CRVIpIC0tPgotPCFFTlRJVFkgJSBOdW1iZXIuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLTwhRU5USVRZICUgUGl4ZWxzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotPCFFTlRJVFkgJSBTY3JpcHQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gdGV4dHVhbCBjb250ZW50IC0tPgotPCFFTlRJVFkgJSBUZXh0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIEltcG9ydGVkIERhdGF0eXBlcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotPCFFTlRJVFkgJSBDaGFyYWN0ZXIuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENoYXJzZXQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDaGFyc2V0cy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBDb2xvciBzcGVjaWZpY2F0aW9uIHVzaW5nIGNvbG9yIG5hbWUgb3Igc1JHQiAoI1JSR0dCQikgdmFsdWVzIC0tPgotPCFFTlRJVFkgJSBDb2xvci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDb250ZW50VHlwZS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ29udGVudFR5cGVzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLTwhRU5USVRZICUgRGF0ZXRpbWUuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZm9ybWFsIHB1YmxpYyBpZGVudGlmaWVyLCBhcyBwZXIgW0lTTzg4NzldIC0tPgotPCFFTlRJVFkgJSBGUEkuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzMwNjZdIC0tPgotPCFFTlRJVFkgJSBMYW5ndWFnZUNvZGUuZGF0YXR5cGUgIk5NVE9LRU4iID4KLQotPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtVUkldIC0tPgotPCFFTlRJVFkgJSBVUkkuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzLCBzZWUgW1VSSV0gLS0+Ci08IUVOVElUWSAlIFVSSXMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWRhdGF0eXBlcy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBYTGluayBzdXBwb3J0IG1vZHVsZSAtLT4KLTwhRU5USVRZICUgeGh0bWwteGxpbmsubW9kICIiID4KLQotCi08IUVOVElUWSAlIHhodG1sLXFuYW1lLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXFuYW1lLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXFuYW1lLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgUXVhbGlmaWVkIE5hbWVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtcW5hbWUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFFuYW1lIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1xbmFtZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgUXVhbGlmaWVkIE5hbWVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtcW5hbWUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotIzIwMDAtMTAtMjI6IGFkZGVkIHFuYW1lIGRlY2xhcmF0aW9ucyBmb3IgcnVieSBlbGVtZW50cwotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBYSFRNTCBRbmFtZSAoUXVhbGlmaWVkIE5hbWUpIE1vZHVsZQotCi0gICAgIFRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0d28gcGFydHMsIGxhYmVsZWQgU2VjdGlvbiAnQScgYW5kICdCJzoKLQotICAgICAgIFNlY3Rpb24gQSBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdG8gc3VwcG9ydCBuYW1lc3BhY2UtCi0gICAgICAgcXVhbGlmaWVkIG5hbWVzLCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLCBhbmQgbmFtZSBwcmVmaXhpbmcKLSAgICAgICBmb3IgWEhUTUwgYW5kIGV4dGVuc2lvbnMuCi0KLSAgICAgICBTZWN0aW9uIEIgZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHVzZWQgdG8gcHJvdmlkZQotICAgICAgIG5hbWVzcGFjZS1xdWFsaWZpZWQgbmFtZXMgZm9yIGFsbCBYSFRNTCBlbGVtZW50IHR5cGVzOgotCi0gICAgICAgICAlYXBwbGV0LnFuYW1lOyAgIHRoZSB4bWxucy1xdWFsaWZpZWQgbmFtZSBmb3IgPGFwcGxldD4KLSAgICAgICAgICViYXNlLnFuYW1lOyAgICAgdGhlIHhtbG5zLXF1YWxpZmllZCBuYW1lIGZvciA8YmFzZT4KLSAgICAgICAgIC4uLgotCi0gICAgIFhIVE1MIGV4dGVuc2lvbnMgd291bGQgY3JlYXRlIGEgbW9kdWxlIHNpbWlsYXIgdG8gdGhpcyBvbmUuCi0gICAgIEluY2x1ZGVkIGluIHRoZSBYSFRNTCBkaXN0cmlidXRpb24gaXMgYSB0ZW1wbGF0ZSBtb2R1bGUKLSAgICAgKCd0ZW1wbGF0ZS1xbmFtZS0xLm1vZCcpIHN1aXRhYmxlIGZvciB0aGlzIHB1cnBvc2UuCi0tLT4KLQotPCEtLSBTZWN0aW9uIEE6IFhIVE1MIFhNTCBOYW1lc3BhY2UgRnJhbWV3b3JrIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIDEuIERlY2xhcmUgYSAlWEhUTUwucHJlZml4ZWQ7IGNvbmRpdGlvbmFsIHNlY3Rpb24ga2V5d29yZCwgdXNlZAotICAgICAgICB0byBhY3RpdmF0ZSBuYW1lc3BhY2UgcHJlZml4aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQKLSAgICAgICAgaW5oZXJpdCAnJU5TLnByZWZpeGVkOycgZnJvbSB0aGUgRFREIGRyaXZlciwgc28gdGhhdCB1bmxlc3MKLSAgICAgICAgb3ZlcnJpZGRlbiwgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvbGxvd3MgdGhlIG92ZXJhbGwgRFRECi0gICAgICAgIHByZWZpeGluZyBzY2hlbWUuCi0tLT4KLTwhRU5USVRZICUgTlMucHJlZml4ZWQgIklHTk9SRSIgPgotPCFFTlRJVFkgJSBYSFRNTC5wcmVmaXhlZCAiJU5TLnByZWZpeGVkOyIgPgotCi08IS0tIDIuIERlY2xhcmUgYSBwYXJhbWV0ZXIgZW50aXR5IChlZy4sICVYSFRNTC54bWxuczspIGNvbnRhaW5pbmcKLSAgICAgICAgdGhlIFVSSSByZWZlcmVuY2UgdXNlZCB0byBpZGVudGlmeSB0aGUgWEhUTUwgbmFtZXNwYWNlOgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zICAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgPgotCi08IS0tIDMuIERlY2xhcmUgcGFyYW1ldGVyIGVudGl0aWVzIChlZy4sICVYSFRNTC5wcmVmaXg7KSBjb250YWluaW5nCi0gICAgICAgIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBwcmVmaXggc3RyaW5nKHMpIHRvIHVzZSB3aGVuIHByZWZpeGluZwotICAgICAgICBpcyBlbmFibGVkLiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGluIHRoZSBEVEQgZHJpdmVyIG9yIHRoZQotICAgICAgICBpbnRlcm5hbCBzdWJzZXQgb2YgYW4gZG9jdW1lbnQgaW5zdGFuY2UuIElmIG5vIGRlZmF1bHQgcHJlZml4Ci0gICAgICAgIGlzIGRlc2lyZWQsIHRoaXMgbWF5IGJlIGRlY2xhcmVkIGFzIGFuIGVtcHR5IHN0cmluZy4KLQotICAgICBOT1RFOiBBcyBzcGVjaWZpZWQgaW4gW1hNTE5BTUVTXSwgdGhlIG5hbWVzcGFjZSBwcmVmaXggc2VydmVzCi0gICAgIGFzIGEgcHJveHkgZm9yIHRoZSBVUkkgcmVmZXJlbmNlLCBhbmQgaXMgbm90IGluIGl0c2VsZiBzaWduaWZpY2FudC4KLS0tPgotPCFFTlRJVFkgJSBYSFRNTC5wcmVmaXggICIiID4KLQotPCEtLSA0LiBEZWNsYXJlIHBhcmFtZXRlciBlbnRpdGllcyAoZWcuLCAlWEhUTUwucGZ4OykgY29udGFpbmluZyB0aGUKLSAgICAgICAgY29sb25pemVkIHByZWZpeChlcykgKGVnLiwgJyVYSFRNTC5wcmVmaXg7OicpIHVzZWQgd2hlbgotICAgICAgICBwcmVmaXhpbmcgaXMgYWN0aXZlLCBhbiBlbXB0eSBzdHJpbmcgd2hlbiBpdCBpcyBub3QuCi0tLT4KLTwhWyVYSFRNTC5wcmVmaXhlZDtbCi08IUVOVElUWSAlIFhIVE1MLnBmeCAgIiVYSFRNTC5wcmVmaXg7OiIgPgotXV0+Ci08IUVOVElUWSAlIFhIVE1MLnBmeCAgIiIgPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIG5hbWUgZXh0ZW5zaW9ucyBoZXJlIC4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUtZXh0cmEubW9kICIiID4KLQotCi08IS0tIDUuIFRoZSBwYXJhbWV0ZXIgZW50aXR5ICVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IG1heSBiZQotICAgICAgICByZWRlY2xhcmVkIHRvIGNvbnRhaW4gYW55IG5vbi1YSFRNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLSAgICAgICAgYXR0cmlidXRlcyBmb3IgbmFtZXNwYWNlcyBlbWJlZGRlZCBpbiBYSFRNTC4gVGhlIGRlZmF1bHQKLSAgICAgICAgaXMgYW4gZW1wdHkgc3RyaW5nLiAgWExpbmsgc2hvdWxkIGJlIGluY2x1ZGVkIGhlcmUgaWYgdXNlZAotICAgICAgICBpbiB0aGUgRFRELgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhLS0gVGhlIHJlbWFpbmRlciBvZiBTZWN0aW9uIEEgaXMgb25seSBmb2xsb3dlZCBpbiBYSFRNTCwgbm90IGV4dGVuc2lvbnMuIC0tPgotCi08IS0tIERlY2xhcmUgYSBwYXJhbWV0ZXIgZW50aXR5ICVOUy5kZWNsLmF0dHJpYjsgY29udGFpbmluZwotICAgICBhbGwgWE1MIE5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgdXNlZCBpbiB0aGUgRFRELCBwbHVzIHRoZQotICAgICB4bWxucyBkZWNsYXJhdGlvbiBmb3IgWEhUTUwsIGl0cyBmb3JtIGRlcGVuZGVudCBvbiB3aGV0aGVyCi0gICAgIHByZWZpeGluZyBpcyBhY3RpdmUuCi0tLT4KLTwhWyVYSFRNTC5wcmVmaXhlZDtbCi08IUVOVElUWSAlIE5TLmRlY2wuYXR0cmliCi0gICAgICJ4bWxuczolWEhUTUwucHJlZml4OyAgJVVSSS5kYXRhdHlwZTsgICAjRklYRUQgJyVYSFRNTC54bWxuczsnCi0gICAgICAlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyIKLT4KLV1dPgotPCFFTlRJVFkgJSBOUy5kZWNsLmF0dHJpYgotICAgICAiJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhLS0gVGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBmdXR1cmUgWExpbmsgc3VwcG9ydC4KLS0tPgotPCFFTlRJVFkgJSBYTElOSy54bWxucy5hdHRyaWIgIiIgPgotCi08IS0tIERlY2xhcmUgYSBwYXJhbWV0ZXIgZW50aXR5ICVOUy5kZWNsLmF0dHJpYjsgY29udGFpbmluZyBhbGwKLSAgICAgWE1MIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGVzIHVzZWQgYnkgWEhUTUwsIGluY2x1ZGluZwotICAgICBhIGRlZmF1bHQgeG1sbnMgYXR0cmlidXRlIHdoZW4gcHJlZml4aW5nIGlzIGluYWN0aXZlLgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5hdHRyaWIKLSAgICAgIiVOUy5kZWNsLmF0dHJpYjsKLSAgICAgICVYTElOSy54bWxucy5hdHRyaWI7IgotPgotXV0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmF0dHJpYgotICAgICAieG1sbnMgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjRklYRUQgJyVYSFRNTC54bWxuczsnCi0gICAgICAlWExJTksueG1sbnMuYXR0cmliOyIKLT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgcXVhbGlmaWVkIG5hbWUgcmVkZWNsYXJhdGlvbnMgLS0+Ci08IUVOVElUWSAlIHhodG1sLXFuYW1lLnJlZGVjbCAiIiA+Ci0KLQotPCEtLSBTZWN0aW9uIEI6IFhIVE1MIFF1YWxpZmllZCBOYW1lcyA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSA2LiBUaGlzIHNlY3Rpb24gZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHVzZWQgdG8gcHJvdmlkZQotICAgICAgICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwgWEhUTUwgZWxlbWVudCB0eXBlcy4KLS0tPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWFwcGxldC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYXBwbGV0LnFuYW1lICAiJVhIVE1MLnBmeDthcHBsZXQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1iYXNlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiYXNlLnFuYW1lICAgICIlWEhUTUwucGZ4O2Jhc2UiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1iZG8tMS5tb2QgLS0+Ci08IUVOVElUWSAlIGJkby5xbmFtZSAgICAgIiVYSFRNTC5wZng7YmRvIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrcGhyYXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFkZHJlc3MucW5hbWUgIiVYSFRNTC5wZng7YWRkcmVzcyIgPgotPCFFTlRJVFkgJSBibG9ja3F1b3RlLnFuYW1lICAiJVhIVE1MLnBmeDtibG9ja3F1b3RlIiA+Ci08IUVOVElUWSAlIHByZS5xbmFtZSAgICAgIiVYSFRNTC5wZng7cHJlIiA+Ci08IUVOVElUWSAlIGgxLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDEiID4KLTwhRU5USVRZICUgaDIucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMiIgPgotPCFFTlRJVFkgJSBoMy5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gzIiA+Ci08IUVOVElUWSAlIGg0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDQiID4KLTwhRU5USVRZICUgaDUucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNSIgPgotPCFFTlRJVFkgJSBoNi5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g2IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrcHJlcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgaHIucW5hbWUgICAgICAiJVhIVE1MLnBmeDtociIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3N0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgZGl2LnFuYW1lICAgICAiJVhIVE1MLnBmeDtkaXYiID4KLTwhRU5USVRZICUgcC5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtwIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtZWRpdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgaW5zLnFuYW1lICAgICAiJVhIVE1MLnBmeDtpbnMiID4KLTwhRU5USVRZICUgZGVsLnFuYW1lICAgICAiJVhIVE1MLnBmeDtkZWwiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1mb3JtLTEubW9kIC0tPgotPCFFTlRJVFkgJSBmb3JtLnFuYW1lICAgICIlWEhUTUwucGZ4O2Zvcm0iID4KLTwhRU5USVRZICUgbGFiZWwucW5hbWUgICAiJVhIVE1MLnBmeDtsYWJlbCIgPgotPCFFTlRJVFkgJSBpbnB1dC5xbmFtZSAgICIlWEhUTUwucGZ4O2lucHV0IiA+Ci08IUVOVElUWSAlIHNlbGVjdC5xbmFtZSAgIiVYSFRNTC5wZng7c2VsZWN0IiA+Ci08IUVOVElUWSAlIG9wdGdyb3VwLnFuYW1lICAiJVhIVE1MLnBmeDtvcHRncm91cCIgPgotPCFFTlRJVFkgJSBvcHRpb24ucW5hbWUgICIlWEhUTUwucGZ4O29wdGlvbiIgPgotPCFFTlRJVFkgJSB0ZXh0YXJlYS5xbmFtZSAgIiVYSFRNTC5wZng7dGV4dGFyZWEiID4KLTwhRU5USVRZICUgZmllbGRzZXQucW5hbWUgICIlWEhUTUwucGZ4O2ZpZWxkc2V0IiA+Ci08IUVOVElUWSAlIGxlZ2VuZC5xbmFtZSAgIiVYSFRNTC5wZng7bGVnZW5kIiA+Ci08IUVOVElUWSAlIGJ1dHRvbi5xbmFtZSAgIiVYSFRNTC5wZng7YnV0dG9uIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaHlwZXJ0ZXh0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBhLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2EiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbWFnZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgaW1nLnFuYW1lICAgICAiJVhIVE1MLnBmeDtpbWciID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxwaHJhcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgYWJici5xbmFtZSAgICAiJVhIVE1MLnBmeDthYmJyIiA+Ci08IUVOVElUWSAlIGFjcm9ueW0ucW5hbWUgIiVYSFRNTC5wZng7YWNyb255bSIgPgotPCFFTlRJVFkgJSBjaXRlLnFuYW1lICAgICIlWEhUTUwucGZ4O2NpdGUiID4KLTwhRU5USVRZICUgY29kZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtjb2RlIiA+Ci08IUVOVElUWSAlIGRmbi5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGZuIiA+Ci08IUVOVElUWSAlIGVtLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZW0iID4KLTwhRU5USVRZICUga2JkLnFuYW1lICAgICAiJVhIVE1MLnBmeDtrYmQiID4KLTwhRU5USVRZICUgcS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtxIiA+Ci08IUVOVElUWSAlIHNhbXAucW5hbWUgICAgIiVYSFRNTC5wZng7c2FtcCIgPgotPCFFTlRJVFkgJSBzdHJvbmcucW5hbWUgICIlWEhUTUwucGZ4O3N0cm9uZyIgPgotPCFFTlRJVFkgJSB2YXIucW5hbWUgICAgICIlWEhUTUwucGZ4O3ZhciIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHByZXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGIucW5hbWUgICAgICAgIiVYSFRNTC5wZng7YiIgPgotPCFFTlRJVFkgJSBiaWcucW5hbWUgICAgICIlWEhUTUwucGZ4O2JpZyIgPgotPCFFTlRJVFkgJSBpLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2kiID4KLTwhRU5USVRZICUgc21hbGwucW5hbWUgICAiJVhIVE1MLnBmeDtzbWFsbCIgPgotPCFFTlRJVFkgJSBzdWIucW5hbWUgICAgICIlWEhUTUwucGZ4O3N1YiIgPgotPCFFTlRJVFkgJSBzdXAucW5hbWUgICAgICIlWEhUTUwucGZ4O3N1cCIgPgotPCFFTlRJVFkgJSB0dC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3R0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5sc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBici5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2JyIiA+Ci08IUVOVElUWSAlIHNwYW4ucW5hbWUgICAgIiVYSFRNTC5wZng7c3BhbiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlzbWFwLTEubW9kIChhbHNvIGNzaXNtYXAsIHNzaXNtYXApIC0tPgotPCFFTlRJVFkgJSBtYXAucW5hbWUgICAgICIlWEhUTUwucGZ4O21hcCIgPgotPCFFTlRJVFkgJSBhcmVhLnFuYW1lICAgICIlWEhUTUwucGZ4O2FyZWEiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1saW5rLTEubW9kIC0tPgotPCFFTlRJVFkgJSBsaW5rLnFuYW1lICAgICIlWEhUTUwucGZ4O2xpbmsiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1saXN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBkbC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2RsIiA+Ci08IUVOVElUWSAlIGR0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZHQiID4KLTwhRU5USVRZICUgZGQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkZCIgPgotPCFFTlRJVFkgJSBvbC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O29sIiA+Ci08IUVOVElUWSAlIHVsLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dWwiID4KLTwhRU5USVRZICUgbGkucW5hbWUgICAgICAiJVhIVE1MLnBmeDtsaSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLW1ldGEtMS5tb2QgLS0+Ci08IUVOVElUWSAlIG1ldGEucW5hbWUgICAgIiVYSFRNTC5wZng7bWV0YSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXBhcmFtLTEubW9kIC0tPgotPCFFTlRJVFkgJSBwYXJhbS5xbmFtZSAgICIlWEhUTUwucGZ4O3BhcmFtIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtb2JqZWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBvYmplY3QucW5hbWUgICIlWEhUTUwucGZ4O29iamVjdCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXNjcmlwdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgc2NyaXB0LnFuYW1lICAiJVhIVE1MLnBmeDtzY3JpcHQiID4KLTwhRU5USVRZICUgbm9zY3JpcHQucW5hbWUgICIlWEhUTUwucGZ4O25vc2NyaXB0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBodG1sLnFuYW1lICAgICIlWEhUTUwucGZ4O2h0bWwiID4KLTwhRU5USVRZICUgaGVhZC5xbmFtZSAgICAiJVhIVE1MLnBmeDtoZWFkIiA+Ci08IUVOVElUWSAlIHRpdGxlLnFuYW1lICAgIiVYSFRNTC5wZng7dGl0bGUiID4KLTwhRU5USVRZICUgYm9keS5xbmFtZSAgICAiJVhIVE1MLnBmeDtib2R5IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc3R5bGUtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHN0eWxlLnFuYW1lICAgIiVYSFRNTC5wZng7c3R5bGUiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC10YWJsZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgdGFibGUucW5hbWUgICAiJVhIVE1MLnBmeDt0YWJsZSIgPgotPCFFTlRJVFkgJSBjYXB0aW9uLnFuYW1lICIlWEhUTUwucGZ4O2NhcHRpb24iID4KLTwhRU5USVRZICUgdGhlYWQucW5hbWUgICAiJVhIVE1MLnBmeDt0aGVhZCIgPgotPCFFTlRJVFkgJSB0Zm9vdC5xbmFtZSAgICIlWEhUTUwucGZ4O3Rmb290IiA+Ci08IUVOVElUWSAlIHRib2R5LnFuYW1lICAgIiVYSFRNTC5wZng7dGJvZHkiID4KLTwhRU5USVRZICUgY29sZ3JvdXAucW5hbWUgICIlWEhUTUwucGZ4O2NvbGdyb3VwIiA+Ci08IUVOVElUWSAlIGNvbC5xbmFtZSAgICAgIiVYSFRNTC5wZng7Y29sIiA+Ci08IUVOVElUWSAlIHRyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dHIiID4KLTwhRU5USVRZICUgdGgucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0aCIgPgotPCFFTlRJVFkgJSB0ZC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RkIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtcnVieS0xLm1vZCAtLT4KLQotPCFFTlRJVFkgJSBydWJ5LnFuYW1lICAgICIlWEhUTUwucGZ4O3J1YnkiID4KLTwhRU5USVRZICUgcmJjLnFuYW1lICAgICAiJVhIVE1MLnBmeDtyYmMiID4KLTwhRU5USVRZICUgcnRjLnFuYW1lICAgICAiJVhIVE1MLnBmeDtydGMiID4KLTwhRU5USVRZICUgcmIucW5hbWUgICAgICAiJVhIVE1MLnBmeDtyYiIgPgotPCFFTlRJVFkgJSBydC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3J0IiA+Ci08IUVOVElUWSAlIHJwLnFuYW1lICAgICAgIiVYSFRNTC5wZng7cnAiID4KLQotPCEtLSBQcm92aXNpb25hbCBYSFRNTCAyLjAgUXVhbGlmaWVkIE5hbWVzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWltYWdlLTIubW9kIC0tPgotPCFFTlRJVFkgJSBhbHQucW5hbWUgICAgICIlWEhUTUwucGZ4O2FsdCIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1xbmFtZS0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWV2ZW50cy5tb2R1bGUgIklHTk9SRSIgPgotPCFbJXhodG1sLWV2ZW50cy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBJbnRyaW5zaWMgRXZlbnRzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtZXZlbnRzLTEubW9kIiA+Ci0leGh0bWwtZXZlbnRzLm1vZDtdXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1hdHRyaWJzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWF0dHJpYnMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYXR0cmlicy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYXR0cmlicy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBDb21tb24gQXR0cmlidXRlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1hdHRyaWJzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDb21tb24gQXR0cmlidXRlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWF0dHJpYnMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQ29tbW9uIEF0dHJpYnV0ZXMKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBtYW55IG9mIHRoZSBjb21tb24gYXR0cmlidXRlcyBmb3IgdGhlIFhIVE1MIERURC4KLSAgICAgJU5TLmRlY2wuYXR0cmliOyBpcyBkZWNsYXJlZCBpbiB0aGUgWEhUTUwgUW5hbWUgbW9kdWxlLgotLS0+Ci0KLTwhRU5USVRZICUgaWQuYXR0cmliCi0gICAgICJpZCAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIGNsYXNzLmF0dHJpYgotICAgICAiY2xhc3MgICAgICAgIE5NVE9LRU5TICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSB0aXRsZS5hdHRyaWIKLSAgICAgInRpdGxlICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgQ29yZS5leHRyYS5hdHRyaWIgIiIgPgotCi08IUVOVElUWSAlIENvcmUuYXR0cmliCi0gICAgICIlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJWlkLmF0dHJpYjsKLSAgICAgICVjbGFzcy5hdHRyaWI7Ci0gICAgICAldGl0bGUuYXR0cmliOwotICAgICAgJUNvcmUuZXh0cmEuYXR0cmliOyIKLT4KLQotPCFFTlRJVFkgJSBsYW5nLmF0dHJpYgotICAgICAieG1sOmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRCIKLT4KLQotPCFbJVhIVE1MLmJpZGk7WwotPCFFTlRJVFkgJSBkaXIuYXR0cmliCi0gICAgICJkaXIgICAgICAgICAgKCBsdHIgfCBydGwgKSAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIEkxOG4uYXR0cmliCi0gICAgICIlZGlyLmF0dHJpYjsKLSAgICAgICVsYW5nLmF0dHJpYjsiCi0+Ci0KLV1dPgotPCFFTlRJVFkgJSBJMThuLmF0dHJpYgotICAgICAiJWxhbmcuYXR0cmliOyIKLT4KLQotPCFFTlRJVFkgJSBDb21tb24uZXh0cmEuYXR0cmliICIiID4KLQotPCEtLSBpbnRyaW5zaWMgZXZlbnQgYXR0cmlidXRlcyBkZWNsYXJlZCBwcmV2aW91c2x5Ci0tLT4KLTwhRU5USVRZICUgRXZlbnRzLmF0dHJpYiAiIiA+Ci0KLTwhRU5USVRZICUgQ29tbW9uLmF0dHJpYgotICAgICAiJUNvcmUuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgJUV2ZW50cy5hdHRyaWI7Ci0gICAgICAlQ29tbW9uLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWF0dHJpYnMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgY29udGVudCBtb2RlbCByZWRlY2xhcmF0aW9ucyAtLT4KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwucmVkZWNsICIiID4KLQotCi08IUVOVElUWSAlIHhodG1sLW1vZGVsLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW1vZGVsLm1vZHVsZTtbCi08IS0tIGluc3RhbnRpYXRlIHRoZSBEb2N1bWVudCBNb2RlbCBtb2R1bGUgZGVjbGFyZWQgaW4gdGhlIERURCBkcml2ZXIKLS0tPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTW9iaWxlIDEuMCBEb2N1bWVudCBNb2RlbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbW9iaWxlMTAtbW9kZWwtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MIE1vYmlsZSwgYSBwcm9wZXIgc3Vic2V0IG9mIFhIVE1MLgotICAgICAJQFdpcmVsZXNzIEFwcGxpY2F0aW9uIFByb3RvY29sIEZvcnVtLCBMdGQuIDIwMDEuCi0KLQlUZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbCBGb3J1bSBMdGQuIAotCVdlYiBzaXRlIChodHRwOi8vd3d3LndhcGZvcnVtLm9yZy93aGF0L2NvcHlyaWdodC5odG0pLgotICAgIAotLS0+Ci08IS0tIFhIVE1MIE1vYmlsZSBEb2N1bWVudCBNb2RlbAotCi0gICAgIFRoaXMgbW9kdWxlIGRlc2NyaWJlcyB0aGUgZ3JvdXBpbmdzIG9mIGVsZW1lbnRzIHRoYXQgbWFrZSB1cAotICAgICBjb21tb24gY29udGVudCBtb2RlbHMgZm9yIFhIVE1MIGVsZW1lbnRzLgotLS0+Ci0KLTwhLS0gT3B0aW9uYWwgRWxlbWVudHMgaW4gaGVhZCAgLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSGVhZE9wdHMubWl4Ci0gICAgICIoICVtZXRhLnFuYW1lOyB8ICVsaW5rLnFuYW1lOyB8ICVvYmplY3QucW5hbWU7IHwgJXN0eWxlLnFuYW1lOyApKiIgPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIE1pc2MuY2xhc3MgIiIgPgotCi08IS0tIElubGluZSBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIElubFN0cnVjdC5jbGFzcyAiJWJyLnFuYW1lOyB8ICVzcGFuLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFBocmFzLmNsYXNzCi0gICAgICJ8ICVlbS5xbmFtZTsgfCAlc3Ryb25nLnFuYW1lOyB8ICVkZm4ucW5hbWU7IHwgJWNvZGUucW5hbWU7Ci0gICAgICB8ICVzYW1wLnFuYW1lOyB8ICVrYmQucW5hbWU7IHwgJXZhci5xbmFtZTsgfCAlY2l0ZS5xbmFtZTsKLSAgICAgIHwgJWFiYnIucW5hbWU7IHwgJWFjcm9ueW0ucW5hbWU7IHwgJXEucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sUHJlcy5jbGFzcwotICAgICAifCAlaS5xbmFtZTsgfCAlYi5xbmFtZTsgfCAlYmlnLnFuYW1lOyB8ICVzbWFsbC5xbmFtZTsgIiA+Ci0KLQotPCFFTlRJVFkgJSBJMThuLmNsYXNzICIiID4KLQotPCFFTlRJVFkgJSBBbmNob3IuY2xhc3MgInwgJWEucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sU3BlY2lhbC5jbGFzcyAifCAlaW1nLnFuYW1lOyB8ICVvYmplY3QucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sRm9ybS5jbGFzcwotICAgICAifCAlaW5wdXQucW5hbWU7IHwgJXNlbGVjdC5xbmFtZTsgfCAldGV4dGFyZWEucW5hbWU7Ci0gICAgICB8ICVsYWJlbC5xbmFtZTsiCi0+Ci0KLTwhRU5USVRZICUgSW5saW5lLmV4dHJhICIiID4KLQotPCFFTlRJVFkgJSBJbmxpbmUuY2xhc3MKLSAgICAgIiVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlSW5sRm9ybS5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7IgotPgotCi08IUVOVElUWSAlIElubE5vQW5jaG9yLmNsYXNzCi0gICAgICIlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlSW5sRm9ybS5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7IgotPgotCi08IUVOVElUWSAlIElubE5vQW5jaG9yLm1peAotICAgICAiJUlubE5vQW5jaG9yLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IUVOVElUWSAlIElubGluZS5taXgKLSAgICAgIiVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gQmxvY2sgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSGVhZGluZy5jbGFzcwotICAgICAiJWgxLnFuYW1lOyB8ICVoMi5xbmFtZTsgfCAlaDMucW5hbWU7Ci0gICAgICB8ICVoNC5xbmFtZTsgfCAlaDUucW5hbWU7IHwgJWg2LnFuYW1lOyIKLT4KLTwhRU5USVRZICUgTGlzdC5jbGFzcyAgIiV1bC5xbmFtZTsgfCAlb2wucW5hbWU7IHwgJWRsLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIFRhYmxlLmNsYXNzICJ8ICV0YWJsZS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBGb3JtLmNsYXNzICAifCAlZm9ybS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBGaWVsZHNldC5jbGFzcyAgInwgJWZpZWxkc2V0LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1N0cnVjdC5jbGFzcyAiJXAucW5hbWU7IHwgJWRpdi5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBCbGtQaHJhcy5jbGFzcwotICAgICAifCAlcHJlLnFuYW1lOyB8ICVibG9ja3F1b3RlLnFuYW1lOyB8ICVhZGRyZXNzLnFuYW1lOyIKLT4KLQotPCFFTlRJVFkgJSBCbGtQcmVzLmNsYXNzICJ8ICVoci5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBCbGtTcGVjaWFsLmNsYXNzCi0gICAgICIlVGFibGUuY2xhc3M7Ci0gICAgICAlRm9ybS5jbGFzczsKLSAgICAgICVGaWVsZHNldC5jbGFzczsiCi0+Ci0KLTwhRU5USVRZICUgQmxvY2suZXh0cmEgIiIgPgotCi08IUVOVElUWSAlIEJsb2NrLmNsYXNzCi0gICAgICIlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUJsa1ByZXMuY2xhc3M7Ci0gICAgICAlQmxrU3BlY2lhbC5jbGFzczsKLSAgICAgICVCbG9jay5leHRyYTsiCi0+Ci0KLTwhRU5USVRZICUgQmxrTm9Gb3JtLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUJsa1ByZXMuY2xhc3M7Ci0gICAgICAlVGFibGUuY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhRU5USVRZICUgQmxvY2subWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbG9jay5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBBbGwgQ29udGVudCBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBkZWNsYXJlcyBhbGwgY29udGVudCBleGNlcHQgdGFibGVzCi0tLT4KLTwhRU5USVRZICUgRmxvd05vVGFibGUubWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlRm9ybS5jbGFzczsKLSAgICAgICVCbG9jay5leHRyYTsKLSAgICAgIHwgJUlubGluZS5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotCi08IUVOVElUWSAlIEZsb3cubWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbG9jay5jbGFzczsKLSAgICAgIHwgJUlubGluZS5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbW9iaWxlMTAtbW9kZWwtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1jaGFyZW50Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWNoYXJlbnQubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtY2hhcmVudC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWNoYXJlbnQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWNoYXJlbnQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWNoYXJlbnQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIEVudGl0aWVzIGZvciBYSFRNTAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBzZXQgb2YgY2hhcmFjdGVyIGVudGl0aWVzIGZvciBYSFRNTCwKLSAgICAgaW5jbHVkaW5nIHRoZSBMYXRpbiAxLCBTeW1ib2wgYW5kIFNwZWNpYWwgY2hhcmFjdGVyIGNvbGxlY3Rpb25zLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtbGF0MQotICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICJ4aHRtbC1sYXQxLmVudCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYTUwtY29tcGF0aWJsZSBJU08gTGF0aW4gMSBDaGFyYWN0ZXIgRW50aXR5IFNldCBmb3IgWEhUTUwgLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1sYXQxLmVudAotCi0gICAgIFR5cGljYWwgaW52b2NhdGlvbjoKLQotICAgICAgIDwhRU5USVRZICUgeGh0bWwtbGF0MQotICAgICAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAgICAgICAgInhodG1sLWxhdDEuZW50IiA+Ci0gICAgICAgJXhodG1sLWxhdDE7Ci0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1sYXQxLmVudCIKLQotICAgICBSZXZpc2lvbjogICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGggY29uZm9ybWluZwotICAgICBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluIElTTyA4ODc5LCBwcm92aWRlZAotICAgICB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhRU5USVRZIG5ic3AgICAiJiMxNjA7IiA+PCEtLSBuby1icmVhayBzcGFjZSA9IG5vbi1icmVha2luZyBzcGFjZSwgVSswMEEwIElTT251bSAtLT4KLTwhRU5USVRZIGlleGNsICAiJiMxNjE7IiA+PCEtLSBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrLCBVKzAwQTEgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VudCAgICImIzE2MjsiID48IS0tIGNlbnQgc2lnbiwgVSswMEEyIElTT251bSAtLT4KLTwhRU5USVRZIHBvdW5kICAiJiMxNjM7IiA+PCEtLSBwb3VuZCBzaWduLCBVKzAwQTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgY3VycmVuICImIzE2NDsiID48IS0tIGN1cnJlbmN5IHNpZ24sIFUrMDBBNCBJU09udW0gLS0+Ci08IUVOVElUWSB5ZW4gICAgIiYjMTY1OyIgPjwhLS0geWVuIHNpZ24gPSB5dWFuIHNpZ24sIFUrMDBBNSBJU09udW0gLS0+Ci08IUVOVElUWSBicnZiYXIgIiYjMTY2OyIgPjwhLS0gYnJva2VuIGJhciA9IGJyb2tlbiB2ZXJ0aWNhbCBiYXIsIFUrMDBBNiBJU09udW0gLS0+Ci08IUVOVElUWSBzZWN0ICAgIiYjMTY3OyIgPjwhLS0gc2VjdGlvbiBzaWduLCBVKzAwQTcgSVNPbnVtIC0tPgotPCFFTlRJVFkgdW1sICAgICImIzE2ODsiID48IS0tIGRpYWVyZXNpcyA9IHNwYWNpbmcgZGlhZXJlc2lzLCBVKzAwQTggSVNPZGlhIC0tPgotPCFFTlRJVFkgY29weSAgICImIzE2OTsiID48IS0tIGNvcHlyaWdodCBzaWduLCBVKzAwQTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkZiAgICImIzE3MDsiID48IS0tIGZlbWluaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQUEgSVNPbnVtIC0tPgotPCFFTlRJVFkgbGFxdW8gICImIzE3MTsiID48IS0tIGxlZnQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrID0gbGVmdCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBBQiBJU09udW0gLS0+Ci08IUVOVElUWSBub3QgICAgIiYjMTcyOyIgPjwhLS0gbm90IHNpZ24sIFUrMDBBQyBJU09udW0gLS0+Ci08IUVOVElUWSBzaHkgICAgIiYjMTczOyIgPjwhLS0gc29mdCBoeXBoZW4gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwgVSswMEFEIElTT251bSAtLT4KLTwhRU5USVRZIHJlZyAgICAiJiMxNzQ7IiA+PCEtLSByZWdpc3RlcmVkIHNpZ24gPSByZWdpc3RlcmVkIHRyYWRlIG1hcmsgc2lnbiwgVSswMEFFIElTT251bSAtLT4KLTwhRU5USVRZIG1hY3IgICAiJiMxNzU7IiA+PCEtLSBtYWNyb24gPSBzcGFjaW5nIG1hY3JvbiA9IG92ZXJsaW5lID0gQVBMIG92ZXJiYXIsIFUrMDBBRiBJU09kaWEgLS0+Ci08IUVOVElUWSBkZWcgICAgIiYjMTc2OyIgPjwhLS0gZGVncmVlIHNpZ24sIFUrMDBCMCBJU09udW0gLS0+Ci08IUVOVElUWSBwbHVzbW4gIiYjMTc3OyIgPjwhLS0gcGx1cy1taW51cyBzaWduID0gcGx1cy1vci1taW51cyBzaWduLCBVKzAwQjEgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMiAgICImIzE3ODsiID48IS0tIHN1cGVyc2NyaXB0IHR3byA9IHN1cGVyc2NyaXB0IGRpZ2l0IHR3byA9IHNxdWFyZWQsIFUrMDBCMiBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAzICAgIiYjMTc5OyIgPjwhLS0gc3VwZXJzY3JpcHQgdGhyZWUgPSBzdXBlcnNjcmlwdCBkaWdpdCB0aHJlZSA9IGN1YmVkLCBVKzAwQjMgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWN1dGUgICImIzE4MDsiID48IS0tIGFjdXRlIGFjY2VudCA9IHNwYWNpbmcgYWN1dGUsIFUrMDBCNCBJU09kaWEgLS0+Ci08IUVOVElUWSBtaWNybyAgIiYjMTgxOyIgPjwhLS0gbWljcm8gc2lnbiwgVSswMEI1IElTT251bSAtLT4KLTwhRU5USVRZIHBhcmEgICAiJiMxODI7IiA+PCEtLSBwaWxjcm93IHNpZ24gPSBwYXJhZ3JhcGggc2lnbiwgVSswMEI2IElTT251bSAtLT4KLTwhRU5USVRZIG1pZGRvdCAiJiMxODM7IiA+PCEtLSBtaWRkbGUgZG90ID0gR2VvcmdpYW4gY29tbWEgPSBHcmVlayBtaWRkbGUgZG90LCBVKzAwQjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VkaWwgICImIzE4NDsiID48IS0tIGNlZGlsbGEgPSBzcGFjaW5nIGNlZGlsbGEsIFUrMDBCOCBJU09kaWEgLS0+Ci08IUVOVElUWSBzdXAxICAgIiYjMTg1OyIgPjwhLS0gc3VwZXJzY3JpcHQgb25lID0gc3VwZXJzY3JpcHQgZGlnaXQgb25lLCBVKzAwQjkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkbSAgICImIzE4NjsiID48IS0tIG1hc2N1bGluZSBvcmRpbmFsIGluZGljYXRvciwgVSswMEJBIElTT251bSAtLT4KLTwhRU5USVRZIHJhcXVvICAiJiMxODc7IiA+PCEtLSByaWdodC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsgPSByaWdodCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBCQiBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTQgIiYjMTg4OyIgPjwhLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyID0gZnJhY3Rpb24gb25lIHF1YXJ0ZXIsIFUrMDBCQyBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTIgIiYjMTg5OyIgPjwhLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmID0gZnJhY3Rpb24gb25lIGhhbGYsIFUrMDBCRCBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMzQgIiYjMTkwOyIgPjwhLS0gdnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzID0gZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMsIFUrMDBCRSBJU09udW0gLS0+Ci08IUVOVElUWSBpcXVlc3QgIiYjMTkxOyIgPjwhLS0gaW52ZXJ0ZWQgcXVlc3Rpb24gbWFyayA9IHR1cm5lZCBxdWVzdGlvbiBtYXJrLCBVKzAwQkYgSVNPbnVtIC0tPgotPCFFTlRJVFkgQWdyYXZlICImIzE5MjsiID48IS0tIGxhdGluIGNhcGl0YWwgQSB3aXRoIGdyYXZlID0gbGF0aW4gY2FwaXRhbCBBIGdyYXZlLCBVKzAwQzAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFhY3V0ZSAiJiMxOTM7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEEgd2l0aCBhY3V0ZSwgVSswMEMxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBY2lyYyAgIiYjMTk0OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBBIHdpdGggY2lyY3VtZmxleCwgVSswMEMyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdGlsZGUgIiYjMTk1OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBBIHdpdGggdGlsZGUsIFUrMDBDMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXVtbCAgICImIzE5NjsiID48IS0tIGxhdGluIGNhcGl0YWwgQSB3aXRoIGRpYWVyZXNpcywgVSswMEM0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBcmluZyAgIiYjMTk3OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBBIHdpdGggcmluZyBhYm92ZSA9IGxhdGluIGNhcGl0YWwgQSByaW5nLCBVKzAwQzUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFFbGlnICAiJiMxOTg7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEFFID0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBBRSwgVSswMEM2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBDY2VkaWwgIiYjMTk5OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBDIHdpdGggY2VkaWxsYSwgVSswMEM3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFZ3JhdmUgIiYjMjAwOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBFIHdpdGggZ3JhdmUsIFUrMDBDOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWFjdXRlICImIzIwMTsiID48IS0tIGxhdGluIGNhcGl0YWwgRSB3aXRoIGFjdXRlLCBVKzAwQzkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVjaXJjICAiJiMyMDI7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEUgd2l0aCBjaXJjdW1mbGV4LCBVKzAwQ0EgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEV1bWwgICAiJiMyMDM7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEUgd2l0aCBkaWFlcmVzaXMsIFUrMDBDQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWdyYXZlICImIzIwNDsiID48IS0tIGxhdGluIGNhcGl0YWwgSSB3aXRoIGdyYXZlLCBVKzAwQ0MgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElhY3V0ZSAiJiMyMDU7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEkgd2l0aCBhY3V0ZSwgVSswMENEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJY2lyYyAgIiYjMjA2OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBJIHdpdGggY2lyY3VtZmxleCwgVSswMENFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJdW1sICAgIiYjMjA3OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBJIHdpdGggZGlhZXJlc2lzLCBVKzAwQ0YgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVUSCAgICAiJiMyMDg7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEVUSCwgVSswMEQwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBOdGlsZGUgIiYjMjA5OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBOIHdpdGggdGlsZGUsIFUrMDBEMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2dyYXZlICImIzIxMDsiID48IS0tIGxhdGluIGNhcGl0YWwgTyB3aXRoIGdyYXZlLCBVKzAwRDIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9hY3V0ZSAiJiMyMTE7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIE8gd2l0aCBhY3V0ZSwgVSswMEQzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPY2lyYyAgIiYjMjEyOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBPIHdpdGggY2lyY3VtZmxleCwgVSswMEQ0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdGlsZGUgIiYjMjEzOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBPIHdpdGggdGlsZGUsIFUrMDBENSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3VtbCAgICImIzIxNDsiID48IS0tIGxhdGluIGNhcGl0YWwgTyB3aXRoIGRpYWVyZXNpcywgVSswMEQ2IElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aW1lcyAgIiYjMjE1OyIgPjwhLS0gbXVsdGlwbGljYXRpb24gc2lnbiwgVSswMEQ3IElTT251bSAtLT4KLTwhRU5USVRZIE9zbGFzaCAiJiMyMTY7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIE8gd2l0aCBzdHJva2UgPSBsYXRpbiBjYXBpdGFsIE8gc2xhc2gsIFUrMDBEOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWdyYXZlICImIzIxNzsiID48IS0tIGxhdGluIGNhcGl0YWwgVSB3aXRoIGdyYXZlLCBVKzAwRDkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVhY3V0ZSAiJiMyMTg7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIFUgd2l0aCBhY3V0ZSwgVSswMERBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVY2lyYyAgIiYjMjE5OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBVIHdpdGggY2lyY3VtZmxleCwgVSswMERCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVdW1sICAgIiYjMjIwOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBVIHdpdGggZGlhZXJlc2lzLCBVKzAwREMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFlhY3V0ZSAiJiMyMjE7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIFkgd2l0aCBhY3V0ZSwgVSswMEREIElTT2xhdDEgLS0+Ci08IUVOVElUWSBUSE9STiAgIiYjMjIyOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBUSE9STiwgVSswMERFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBzemxpZyAgIiYjMjIzOyIgPjwhLS0gbGF0aW4gc21hbGwgc2hhcnAgcyA9IGVzcy16ZWQsIFUrMDBERiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWdyYXZlICImIzIyNDsiID48IS0tIGxhdGluIHNtYWxsIGEgd2l0aCBncmF2ZSA9IGxhdGluIHNtYWxsIGEgZ3JhdmUsIFUrMDBFMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWFjdXRlICImIzIyNTsiID48IS0tIGxhdGluIHNtYWxsIGEgd2l0aCBhY3V0ZSwgVSswMEUxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhY2lyYyAgIiYjMjI2OyIgPjwhLS0gbGF0aW4gc21hbGwgYSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBFMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXRpbGRlICImIzIyNzsiID48IS0tIGxhdGluIHNtYWxsIGEgd2l0aCB0aWxkZSwgVSswMEUzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdW1sICAgIiYjMjI4OyIgPjwhLS0gbGF0aW4gc21hbGwgYSB3aXRoIGRpYWVyZXNpcywgVSswMEU0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhcmluZyAgIiYjMjI5OyIgPjwhLS0gbGF0aW4gc21hbGwgYSB3aXRoIHJpbmcgYWJvdmUgPSBsYXRpbiBzbWFsbCBhIHJpbmcsIFUrMDBFNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWVsaWcgICImIzIzMDsiID48IS0tIGxhdGluIHNtYWxsIGFlID0gbGF0aW4gc21hbGwgbGlnYXR1cmUgYWUsIFUrMDBFNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgY2NlZGlsICImIzIzMTsiID48IS0tIGxhdGluIHNtYWxsIGMgd2l0aCBjZWRpbGxhLCBVKzAwRTcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVncmF2ZSAiJiMyMzI7IiA+PCEtLSBsYXRpbiBzbWFsbCBlIHdpdGggZ3JhdmUsIFUrMDBFOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWFjdXRlICImIzIzMzsiID48IS0tIGxhdGluIHNtYWxsIGUgd2l0aCBhY3V0ZSwgVSswMEU5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlY2lyYyAgIiYjMjM0OyIgPjwhLS0gbGF0aW4gc21hbGwgZSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBFQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXVtbCAgICImIzIzNTsiID48IS0tIGxhdGluIHNtYWxsIGUgd2l0aCBkaWFlcmVzaXMsIFUrMDBFQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWdyYXZlICImIzIzNjsiID48IS0tIGxhdGluIHNtYWxsIGkgd2l0aCBncmF2ZSwgVSswMEVDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpYWN1dGUgIiYjMjM3OyIgPjwhLS0gbGF0aW4gc21hbGwgaSB3aXRoIGFjdXRlLCBVKzAwRUQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGljaXJjICAiJiMyMzg7IiA+PCEtLSBsYXRpbiBzbWFsbCBpIHdpdGggY2lyY3VtZmxleCwgVSswMEVFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpdW1sICAgIiYjMjM5OyIgPjwhLS0gbGF0aW4gc21hbGwgaSB3aXRoIGRpYWVyZXNpcywgVSswMEVGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldGggICAgIiYjMjQwOyIgPjwhLS0gbGF0aW4gc21hbGwgZXRoLCBVKzAwRjAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG50aWxkZSAiJiMyNDE7IiA+PCEtLSBsYXRpbiBzbWFsbCBuIHdpdGggdGlsZGUsIFUrMDBGMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2dyYXZlICImIzI0MjsiID48IS0tIGxhdGluIHNtYWxsIG8gd2l0aCBncmF2ZSwgVSswMEYyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvYWN1dGUgIiYjMjQzOyIgPjwhLS0gbGF0aW4gc21hbGwgbyB3aXRoIGFjdXRlLCBVKzAwRjMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9jaXJjICAiJiMyNDQ7IiA+PCEtLSBsYXRpbiBzbWFsbCBvIHdpdGggY2lyY3VtZmxleCwgVSswMEY0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdGlsZGUgIiYjMjQ1OyIgPjwhLS0gbGF0aW4gc21hbGwgbyB3aXRoIHRpbGRlLCBVKzAwRjUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG91bWwgICAiJiMyNDY7IiA+PCEtLSBsYXRpbiBzbWFsbCBvIHdpdGggZGlhZXJlc2lzLCBVKzAwRjYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGRpdmlkZSAiJiMyNDc7IiA+PCEtLSBkaXZpc2lvbiBzaWduLCBVKzAwRjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3NsYXNoICImIzI0ODsiID48IS0tIGxhdGluIHNtYWxsIG8gd2l0aCBzdHJva2UsID0gbGF0aW4gc21hbGwgbyBzbGFzaCwgVSswMEY4IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Z3JhdmUgIiYjMjQ5OyIgPjwhLS0gbGF0aW4gc21hbGwgdSB3aXRoIGdyYXZlLCBVKzAwRjkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVhY3V0ZSAiJiMyNTA7IiA+PCEtLSBsYXRpbiBzbWFsbCB1IHdpdGggYWN1dGUsIFUrMDBGQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWNpcmMgICImIzI1MTsiID48IS0tIGxhdGluIHNtYWxsIHUgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRkIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHV1bWwgICAiJiMyNTI7IiA+PCEtLSBsYXRpbiBzbWFsbCB1IHdpdGggZGlhZXJlc2lzLCBVKzAwRkMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHlhY3V0ZSAiJiMyNTM7IiA+PCEtLSBsYXRpbiBzbWFsbCB5IHdpdGggYWN1dGUsIFUrMDBGRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGhvcm4gICImIzI1NDsiID48IS0tIGxhdGluIHNtYWxsIHRob3JuIHdpdGgsIFUrMDBGRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgeXVtbCAgICImIzI1NTsiID48IS0tIGxhdGluIHNtYWxsIHkgd2l0aCBkaWFlcmVzaXMsIFUrMDBGRiBJU09sYXQxIC0tPgotPCEtLSBlbmQgb2YgeGh0bWwtbGF0MS5lbnQgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1zeW1ib2wKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtc3ltYm9sLmVudCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBJU08gTWF0aCwgR3JlZWsgYW5kIFN5bWJvbGljIENoYXJhY3RlciBFbnRpdHkgU2V0IGZvciBYSFRNTCAuLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1zeW1ib2wuZW50Ci0KLSAgICAgVHlwaWNhbCBpbnZvY2F0aW9uOgotCi0gICAgICAgPCFFTlRJVFkgJSB4aHRtbC1zeW1ib2wKLSAgICAgICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgICAgICAgICJ4aHRtbC1zeW1ib2wuZW50IiA+Ci0gICAgICAgJXhodG1sLXN5bWJvbDsKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXN5bWJvbC5lbnQiCi0KLSAgICAgUmV2aXNpb246ICAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoIGNvbmZvcm1pbmcKLSAgICAgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbiBJU08gODg3OSwgcHJvdmlkZWQKLSAgICAgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgW1NHTUxdIGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoCi0gICAgIGFueSBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBbSVNPMTA2NDZdIGNoYXJhY3RlcgotICAgICBudW1iZXJzIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gRW50aXR5IHZhbHVlcyBhcmUKLSAgICAgZGVjaW1hbCBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlCi0gICAgIGRvY3VtZW50IGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIFtVTklDT0RFXSBuYW1lcy4KLS0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUIgLS0+Ci08IUVOVElUWSBmbm9mICAgICAiJiM0MDI7IiA+PCEtLSBsYXRpbiBzbWFsbCBmIHdpdGggaG9vayA9IGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZsb3JpbiwgVSswMTkyIElTT3RlY2ggLS0+Ci0KLTwhLS0gR3JlZWsgLS0+Ci08IUVOVElUWSBBbHBoYSAgICAiJiM5MTM7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBhbHBoYSwgVSswMzkxIC0tPgotPCFFTlRJVFkgQmV0YSAgICAgIiYjOTE0OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYmV0YSwgVSswMzkyIC0tPgotPCFFTlRJVFkgR2FtbWEgICAgIiYjOTE1OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZ2FtbWEsIFUrMDM5MyBJU09ncmszIC0tPgotPCFFTlRJVFkgRGVsdGEgICAgIiYjOTE2OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZGVsdGEsIFUrMDM5NCBJU09ncmszIC0tPgotPCFFTlRJVFkgRXBzaWxvbiAgIiYjOTE3OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXBzaWxvbiwgVSswMzk1IC0tPgotPCFFTlRJVFkgWmV0YSAgICAgIiYjOTE4OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgemV0YSwgVSswMzk2IC0tPgotPCFFTlRJVFkgRXRhICAgICAgIiYjOTE5OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXRhLCBVKzAzOTcgLS0+Ci08IUVOVElUWSBUaGV0YSAgICAiJiM5MjA7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB0aGV0YSwgVSswMzk4IElTT2dyazMgLS0+Ci08IUVOVElUWSBJb3RhICAgICAiJiM5MjE7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBpb3RhLCBVKzAzOTkgLS0+Ci08IUVOVElUWSBLYXBwYSAgICAiJiM5MjI7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBrYXBwYSwgVSswMzlBIC0tPgotPCFFTlRJVFkgTGFtYmRhICAgIiYjOTIzOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbGFtYmRhLCBVKzAzOUIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE11ICAgICAgICImIzkyNDsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG11LCBVKzAzOUMgLS0+Ci08IUVOVElUWSBOdSAgICAgICAiJiM5MjU7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBudSwgVSswMzlEIC0tPgotPCFFTlRJVFkgWGkgICAgICAgIiYjOTI2OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgeGksIFUrMDM5RSBJU09ncmszIC0tPgotPCFFTlRJVFkgT21pY3JvbiAgIiYjOTI3OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21pY3JvbiwgVSswMzlGIC0tPgotPCFFTlRJVFkgUGkgICAgICAgIiYjOTI4OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGksIFUrMDNBMCBJU09ncmszIC0tPgotPCFFTlRJVFkgUmhvICAgICAgIiYjOTI5OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcmhvLCBVKzAzQTEgLS0+Ci08IS0tIHRoZXJlIGlzIG5vIFNpZ21hZiwgYW5kIG5vIFUrMDNBMiBjaGFyYWN0ZXIgZWl0aGVyIC0tPgotPCFFTlRJVFkgU2lnbWEgICAgIiYjOTMxOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEsIFUrMDNBMyBJU09ncmszIC0tPgotPCFFTlRJVFkgVGF1ICAgICAgIiYjOTMyOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQgLS0+Ci08IUVOVElUWSBVcHNpbG9uICAiJiM5MzM7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E1IElTT2dyazMgLS0+Ci08IUVOVElUWSBQaGkgICAgICAiJiM5MzQ7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaGksIFUrMDNBNiBJU09ncmszIC0tPgotPCFFTlRJVFkgQ2hpICAgICAgIiYjOTM1OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgY2hpLCBVKzAzQTcgLS0+Ci08IUVOVElUWSBQc2kgICAgICAiJiM5MzY7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwc2ksIFUrMDNBOCBJU09ncmszIC0tPgotPCFFTlRJVFkgT21lZ2EgICAgIiYjOTM3OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21lZ2EsIFUrMDNBOSBJU09ncmszIC0tPgotPCFFTlRJVFkgYWxwaGEgICAgIiYjOTQ1OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGFscGhhLCBVKzAzQjEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGJldGEgICAgICImIzk0NjsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBiZXRhLCBVKzAzQjIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGdhbW1hICAgICImIzk0NzsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBnYW1tYSwgVSswM0IzIElTT2dyazMgLS0+Ci08IUVOVElUWSBkZWx0YSAgICAiJiM5NDg7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZGVsdGEsIFUrMDNCNCBJU09ncmszIC0tPgotPCFFTlRJVFkgZXBzaWxvbiAgIiYjOTQ5OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGVwc2lsb24sIFUrMDNCNSBJU09ncmszIC0tPgotPCFFTlRJVFkgemV0YSAgICAgIiYjOTUwOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHpldGEsIFUrMDNCNiBJU09ncmszIC0tPgotPCFFTlRJVFkgZXRhICAgICAgIiYjOTUxOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGV0YSwgVSswM0I3IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YSAgICAiJiM5NTI7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEsIFUrMDNCOCBJU09ncmszIC0tPgotPCFFTlRJVFkgaW90YSAgICAgIiYjOTUzOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGlvdGEsIFUrMDNCOSBJU09ncmszIC0tPgotPCFFTlRJVFkga2FwcGEgICAgIiYjOTU0OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGthcHBhLCBVKzAzQkEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGxhbWJkYSAgICImIzk1NTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBsYW1iZGEsIFUrMDNCQiBJU09ncmszIC0tPgotPCFFTlRJVFkgbXUgICAgICAgIiYjOTU2OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG11LCBVKzAzQkMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG51ICAgICAgICImIzk1NzsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMgLS0+Ci08IUVOVElUWSB4aSAgICAgICAiJiM5NTg7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgeGksIFUrMDNCRSBJU09ncmszIC0tPgotPCFFTlRJVFkgb21pY3JvbiAgIiYjOTU5OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9taWNyb24sIFUrMDNCRiBORVcgLS0+Ci08IUVOVElUWSBwaSAgICAgICAiJiM5NjA7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGksIFUrMDNDMCBJU09ncmszIC0tPgotPCFFTlRJVFkgcmhvICAgICAgIiYjOTYxOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHJobywgVSswM0MxIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYWYgICAiJiM5NjI7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZmluYWwgc2lnbWEsIFUrMDNDMiBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWEgICAgIiYjOTYzOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHNpZ21hLCBVKzAzQzMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRhdSAgICAgICImIzk2NDsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0YXUsIFUrMDNDNCBJU09ncmszIC0tPgotPCFFTlRJVFkgdXBzaWxvbiAgIiYjOTY1OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHVwc2lsb24sIFUrMDNDNSBJU09ncmszIC0tPgotPCFFTlRJVFkgcGhpICAgICAgIiYjOTY2OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBoaSwgVSswM0M2IElTT2dyazMgLS0+Ci08IUVOVElUWSBjaGkgICAgICAiJiM5Njc7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgY2hpLCBVKzAzQzcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBzaSAgICAgICImIzk2ODsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwc2ksIFUrMDNDOCBJU09ncmszIC0tPgotPCFFTlRJVFkgb21lZ2EgICAgIiYjOTY5OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9tZWdhLCBVKzAzQzkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhc3ltICImIzk3NzsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSBzeW1ib2wsIFUrMDNEMSBORVcgLS0+Ci08IUVOVElUWSB1cHNpaCAgICAiJiM5Nzg7IiA+PCEtLSBncmVlayB1cHNpbG9uIHdpdGggaG9vayBzeW1ib2wsIFUrMDNEMiBORVcgLS0+Ci08IUVOVElUWSBwaXYgICAgICAiJiM5ODI7IiA+PCEtLSBncmVlayBwaSBzeW1ib2wsIFUrMDNENiBJU09ncmszIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBidWxsICAgICAiJiM4MjI2OyIgPjwhLS0gYnVsbGV0ID0gYmxhY2sgc21hbGwgY2lyY2xlLCBVKzIwMjIgSVNPcHViICAtLT4KLTwhLS0gYnVsbGV0IGlzIE5PVCB0aGUgc2FtZSBhcyBidWxsZXQgb3BlcmF0b3IsIFUrMjIxOSAtLT4KLTwhRU5USVRZIGhlbGxpcCAgICImIzgyMzA7IiA+PCEtLSBob3Jpem9udGFsIGVsbGlwc2lzID0gdGhyZWUgZG90IGxlYWRlciwgVSsyMDI2IElTT3B1YiAgLS0+Ci08IUVOVElUWSBwcmltZSAgICAiJiM4MjQyOyIgPjwhLS0gcHJpbWUgPSBtaW51dGVzID0gZmVldCwgVSsyMDMyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBQcmltZSAgICAiJiM4MjQzOyIgPjwhLS0gZG91YmxlIHByaW1lID0gc2Vjb25kcyA9IGluY2hlcywgVSsyMDMzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBvbGluZSAgICAiJiM4MjU0OyIgPjwhLS0gb3ZlcmxpbmUgPSBzcGFjaW5nIG92ZXJzY29yZSwgVSsyMDNFIE5FVyAtLT4KLTwhRU5USVRZIGZyYXNsICAgICImIzgyNjA7IiA+PCEtLSBmcmFjdGlvbiBzbGFzaCwgVSsyMDQ0IE5FVyAtLT4KLQotPCEtLSBMZXR0ZXJsaWtlIFN5bWJvbHMgLS0+Ci08IUVOVElUWSB3ZWllcnAgICAiJiM4NDcyOyIgPjwhLS0gc2NyaXB0IGNhcGl0YWwgUCA9IHBvd2VyIHNldCA9IFdlaWVyc3RyYXNzIHAsIFUrMjExOCBJU09hbXNvIC0tPgotPCFFTlRJVFkgaW1hZ2UgICAgIiYjODQ2NTsiID48IS0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgSSA9IGltYWdpbmFyeSBwYXJ0LCBVKzIxMTEgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHJlYWwgICAgICImIzg0NzY7IiA+PCEtLSBibGFja2xldHRlciBjYXBpdGFsIFIgPSByZWFsIHBhcnQgc3ltYm9sLCBVKzIxMUMgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHRyYWRlICAgICImIzg0ODI7IiA+PCEtLSB0cmFkZSBtYXJrIHNpZ24sIFUrMjEyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbGVmc3ltICAiJiM4NTAxOyIgPjwhLS0gYWxlZiBzeW1ib2wgPSBmaXJzdCB0cmFuc2Zpbml0ZSBjYXJkaW5hbCwgVSsyMTM1IE5FVyAtLT4KLTwhLS0gYWxlZiBzeW1ib2wgaXMgTk9UIHRoZSBzYW1lIGFzIGhlYnJldyBsZXR0ZXIgYWxlZiwgVSswNUQwIGFsdGhvdWdoCi0gICAgIHRoZSBzYW1lIGdseXBoIGNvdWxkIGJlIHVzZWQgdG8gZGVwaWN0IGJvdGggY2hhcmFjdGVycyAtLT4KLQotPCEtLSBBcnJvd3MgLS0+Ci08IUVOVElUWSBsYXJyICAgICAiJiM4NTkyOyIgPjwhLS0gbGVmdHdhcmRzIGFycm93LCBVKzIxOTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgdWFyciAgICAgIiYjODU5MzsiID48IS0tIHVwd2FyZHMgYXJyb3csIFUrMjE5MSBJU09udW0tLT4KLTwhRU5USVRZIHJhcnIgICAgICImIzg1OTQ7IiA+PCEtLSByaWdodHdhcmRzIGFycm93LCBVKzIxOTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZGFyciAgICAgIiYjODU5NTsiID48IS0tIGRvd253YXJkcyBhcnJvdywgVSsyMTkzIElTT251bSAtLT4KLTwhRU5USVRZIGhhcnIgICAgICImIzg1OTY7IiA+PCEtLSBsZWZ0IHJpZ2h0IGFycm93LCBVKzIxOTQgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGNyYXJyICAgICImIzg2Mjk7IiA+PCEtLSBkb3dud2FyZHMgYXJyb3cgd2l0aCBjb3JuZXIgbGVmdHdhcmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjYXJyaWFnZSByZXR1cm4sIFUrMjFCNSBORVcgLS0+Ci08IUVOVElUWSBsQXJyICAgICAiJiM4NjU2OyIgPjwhLS0gbGVmdHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQwIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoYXQgbEFyciBpcyB0aGUgc2FtZSBhcyB0aGUgJ2lzIGltcGxpZWQgYnknIGFycm93Ci0gICAgYnV0IGFsc28gZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgY2hhcmFjdGVyIGZvciB0aGF0IGZ1bmN0aW9uLiBTbyA/IGxBcnIgY2FuCi0gICAgYmUgdXNlZCBmb3IgJ2lzIGltcGxpZWQgYnknIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSB1QXJyICAgICAiJiM4NjU3OyIgPjwhLS0gdXB3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMSBJU09hbXNhIC0tPgotPCFFTlRJVFkgckFyciAgICAgIiYjODY1ODsiID48IS0tIHJpZ2h0d2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDIgSVNPdGVjaCAtLT4KLTwhLS0gVW5pY29kZSBkb2VzIG5vdCBzYXkgdGhpcyBpcyB0aGUgJ2ltcGxpZXMnIGNoYXJhY3RlciBidXQgZG9lcyBub3QgaGF2ZQotICAgICBhbm90aGVyIGNoYXJhY3RlciB3aXRoIHRoaXMgZnVuY3Rpb24gc28gPwotICAgICByQXJyIGNhbiBiZSB1c2VkIGZvciAnaW1wbGllcycgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIGRBcnIgICAgICImIzg2NTk7IiA+PCEtLSBkb3dud2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDMgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGhBcnIgICAgICImIzg2NjA7IiA+PCEtLSBsZWZ0IHJpZ2h0IGRvdWJsZSBhcnJvdywgVSsyMUQ0IElTT2Ftc2EgLS0+Ci0KLTwhLS0gTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAtLT4KLTwhRU5USVRZIGZvcmFsbCAgICImIzg3MDQ7IiA+PCEtLSBmb3IgYWxsLCBVKzIyMDAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHBhcnQgICAgICImIzg3MDY7IiA+PCEtLSBwYXJ0aWFsIGRpZmZlcmVudGlhbCwgVSsyMjAyIElTT3RlY2ggIC0tPgotPCFFTlRJVFkgZXhpc3QgICAgIiYjODcwNzsiID48IS0tIHRoZXJlIGV4aXN0cywgVSsyMjAzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlbXB0eSAgICAiJiM4NzA5OyIgPjwhLS0gZW1wdHkgc2V0ID0gbnVsbCBzZXQgPSBkaWFtZXRlciwgVSsyMjA1IElTT2Ftc28gLS0+Ci08IUVOVElUWSBuYWJsYSAgICAiJiM4NzExOyIgPjwhLS0gbmFibGEgPSBiYWNrd2FyZCBkaWZmZXJlbmNlLCBVKzIyMDcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGlzaW4gICAgICImIzg3MTI7IiA+PCEtLSBlbGVtZW50IG9mLCBVKzIyMDggSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5vdGluICAgICImIzg3MTM7IiA+PCEtLSBub3QgYW4gZWxlbWVudCBvZiwgVSsyMjA5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBuaSAgICAgICAiJiM4NzE1OyIgPjwhLS0gY29udGFpbnMgYXMgbWVtYmVyLCBVKzIyMEIgSVNPdGVjaCAtLT4KLTwhLS0gc2hvdWxkIHRoZXJlIGJlIGEgbW9yZSBtZW1vcmFibGUgbmFtZSB0aGFuICduaSc/IC0tPgotPCFFTlRJVFkgcHJvZCAgICAgIiYjODcxOTsiID48IS0tIG4tYXJ5IHByb2R1Y3QgPSBwcm9kdWN0IHNpZ24sIFUrMjIwRiBJU09hbXNiIC0tPgotPCEtLSBwcm9kIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EwICdncmVlayBjYXBpdGFsIGxldHRlciBwaScgdGhvdWdoCi0gICAgIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBzdW0gICAgICAiJiM4NzIxOyIgPjwhLS0gbi1hcnkgc3VtYXRpb24sIFUrMjIxMSBJU09hbXNiIC0tPgotPCEtLSBzdW0gaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTMgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hJwotICAgICB0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIG1pbnVzICAgICImIzg3MjI7IiA+PCEtLSBtaW51cyBzaWduLCBVKzIyMTIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxvd2FzdCAgICImIzg3Mjc7IiA+PCEtLSBhc3RlcmlzayBvcGVyYXRvciwgVSsyMjE3IElTT3RlY2ggLS0+Ci08IUVOVElUWSByYWRpYyAgICAiJiM4NzMwOyIgPjwhLS0gc3F1YXJlIHJvb3QgPSByYWRpY2FsIHNpZ24sIFUrMjIxQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgcHJvcCAgICAgIiYjODczMzsiID48IS0tIHByb3BvcnRpb25hbCB0bywgVSsyMjFEIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbmZpbiAgICAiJiM4NzM0OyIgPjwhLS0gaW5maW5pdHksIFUrMjIxRSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYW5nICAgICAgIiYjODczNjsiID48IS0tIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbyAtLT4KLTwhRU5USVRZIGFuZCAgICAgICImIzg3NDM7IiA+PCEtLSBsb2dpY2FsIGFuZCA9IHdlZGdlLCBVKzIyMjcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9yICAgICAgICImIzg3NDQ7IiA+PCEtLSBsb2dpY2FsIG9yID0gdmVlLCBVKzIyMjggSVNPdGVjaCAtLT4KLTwhRU5USVRZIGNhcCAgICAgICImIzg3NDU7IiA+PCEtLSBpbnRlcnNlY3Rpb24gPSBjYXAsIFUrMjIyOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgY3VwICAgICAgIiYjODc0NjsiID48IS0tIHVuaW9uID0gY3VwLCBVKzIyMkEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGludCAgICAgICImIzg3NDc7IiA+PCEtLSBpbnRlZ3JhbCwgVSsyMjJCIElTT3RlY2ggLS0+Ci08IUVOVElUWSB0aGVyZTQgICAiJiM4NzU2OyIgPjwhLS0gdGhlcmVmb3JlLCBVKzIyMzQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNpbSAgICAgICImIzg3NjQ7IiA+PCEtLSB0aWxkZSBvcGVyYXRvciA9IHZhcmllcyB3aXRoID0gc2ltaWxhciB0bywgVSsyMjNDIElTT3RlY2ggLS0+Ci08IS0tIHRpbGRlIG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgdGhlIHRpbGRlLCBVKzAwN0UsCi0gICAgIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgdG8gcmVwcmVzZW50IGJvdGggIC0tPgotPCFFTlRJVFkgY29uZyAgICAgIiYjODc3MzsiID48IS0tIGFwcHJveGltYXRlbHkgZXF1YWwgdG8sIFUrMjI0NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYXN5bXAgICAgIiYjODc3NjsiID48IS0tIGFsbW9zdCBlcXVhbCB0byA9IGFzeW1wdG90aWMgdG8sIFUrMjI0OCBJU09hbXNyIC0tPgotPCFFTlRJVFkgbmUgICAgICAgIiYjODgwMDsiID48IS0tIG5vdCBlcXVhbCB0bywgVSsyMjYwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlcXVpdiAgICAiJiM4ODAxOyIgPjwhLS0gaWRlbnRpY2FsIHRvLCBVKzIyNjEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxlICAgICAgICImIzg4MDQ7IiA+PCEtLSBsZXNzLXRoYW4gb3IgZXF1YWwgdG8sIFUrMjI2NCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZ2UgICAgICAgIiYjODgwNTsiID48IS0tIGdyZWF0ZXItdGhhbiBvciBlcXVhbCB0bywgVSsyMjY1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdWIgICAgICAiJiM4ODM0OyIgPjwhLS0gc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cCAgICAgICImIzg4MzU7IiA+PCEtLSBzdXBlcnNldCBvZiwgVSsyMjgzIElTT3RlY2ggLS0+Ci08IS0tIG5vdGUgdGhhdCBuc3VwLCAnbm90IGEgc3VwZXJzZXQgb2YsIFUrMjI4MycgaXMgbm90IGNvdmVyZWQgYnkgdGhlIFN5bWJvbAotICAgICBmb250IGVuY29kaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIFNob3VsZCBpdCBiZSwgZm9yIHN5bW1ldHJ5PwotICAgICBJdCBpcyBpbiBJU09hbXNuICAtLT4KLTwhRU5USVRZIG5zdWIgICAgICImIzg4MzY7IiA+PCEtLSBub3QgYSBzdWJzZXQgb2YsIFUrMjI4NCBJU09hbXNuIC0tPgotPCFFTlRJVFkgc3ViZSAgICAgIiYjODgzODsiID48IS0tIHN1YnNldCBvZiBvciBlcXVhbCB0bywgVSsyMjg2IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXBlICAgICAiJiM4ODM5OyIgPjwhLS0gc3VwZXJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3BsdXMgICAgIiYjODg1MzsiID48IS0tIGNpcmNsZWQgcGx1cyA9IGRpcmVjdCBzdW0sIFUrMjI5NSBJU09hbXNiIC0tPgotPCFFTlRJVFkgb3RpbWVzICAgIiYjODg1NTsiID48IS0tIGNpcmNsZWQgdGltZXMgPSB2ZWN0b3IgcHJvZHVjdCwgVSsyMjk3IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBwZXJwICAgICAiJiM4ODY5OyIgPjwhLS0gdXAgdGFjayA9IG9ydGhvZ29uYWwgdG8gPSBwZXJwZW5kaWN1bGFyLCBVKzIyQTUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNkb3QgICAgICImIzg5MDE7IiA+PCEtLSBkb3Qgb3BlcmF0b3IsIFUrMjJDNSBJU09hbXNiIC0tPgotPCEtLSBkb3Qgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwQjcgbWlkZGxlIGRvdCAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCAtLT4KLTwhRU5USVRZIGxjZWlsICAgICImIzg5Njg7IiA+PCEtLSBsZWZ0IGNlaWxpbmcgPSBhcGwgdXBzdGlsZSwgVSsyMzA4IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmNlaWwgICAgIiYjODk2OTsiID48IS0tIHJpZ2h0IGNlaWxpbmcsIFUrMjMwOSBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxmbG9vciAgICImIzg5NzA7IiA+PCEtLSBsZWZ0IGZsb29yID0gYXBsIGRvd25zdGlsZSwgVSsyMzBBIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmZsb29yICAgIiYjODk3MTsiID48IS0tIHJpZ2h0IGZsb29yLCBVKzIzMEIgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsYW5nICAgICAiJiM5MDAxOyIgPjwhLS0gbGVmdC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0gYnJhLCBVKzIzMjkgSVNPdGVjaCAtLT4KLTwhLS0gbGFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzQyAnbGVzcyB0aGFuJwotICAgICBvciBVKzIwMzkgJ3NpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLTwhRU5USVRZIHJhbmcgICAgICImIzkwMDI7IiA+PCEtLSByaWdodC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0ga2V0LCBVKzIzMkEgSVNPdGVjaCAtLT4KLTwhLS0gcmFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzRSAnZ3JlYXRlciB0aGFuJwotICAgICBvciBVKzIwM0EgJ3NpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci0KLTwhLS0gR2VvbWV0cmljIFNoYXBlcyAtLT4KLTwhRU5USVRZIGxveiAgICAgICImIzk2NzQ7IiA+PCEtLSBsb3plbmdlLCBVKzI1Q0EgSVNPcHViIC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgU3ltYm9scyAtLT4KLTwhRU5USVRZIHNwYWRlcyAgICImIzk4MjQ7IiA+PCEtLSBibGFjayBzcGFkZSBzdWl0LCBVKzI2NjAgSVNPcHViIC0tPgotPCEtLSBibGFjayBoZXJlIHNlZW1zIHRvIG1lYW4gZmlsbGVkIGFzIG9wcG9zZWQgdG8gaG9sbG93IC0tPgotPCFFTlRJVFkgY2x1YnMgICAgIiYjOTgyNzsiID48IS0tIGJsYWNrIGNsdWIgc3VpdCA9IHNoYW1yb2NrLCBVKzI2NjMgSVNPcHViIC0tPgotPCFFTlRJVFkgaGVhcnRzICAgIiYjOTgyOTsiID48IS0tIGJsYWNrIGhlYXJ0IHN1aXQgPSB2YWxlbnRpbmUsIFUrMjY2NSBJU09wdWIgLS0+Ci08IUVOVElUWSBkaWFtcyAgICAiJiM5ODMwOyIgPjwhLS0gYmxhY2sgZGlhbW9uZCBzdWl0LCBVKzI2NjYgSVNPcHViIC0tPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zeW1ib2wuZW50IC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtc3BlY2lhbAotICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICJ4aHRtbC1zcGVjaWFsLmVudCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYTUwtY29tcGF0aWJsZSBJU08gU3BlY2lhbCBDaGFyYWN0ZXIgRW50aXR5IFNldCBmb3IgWEhUTUwgLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1zcGVjaWFsLmVudAotCi0gICAgIFR5cGljYWwgaW52b2NhdGlvbjoKLQotICAgICAgIDwhRU5USVRZICUgeGh0bWwtc3BlY2lhbAotICAgICAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAgICAgICAgInhodG1sLXNwZWNpYWwuZW50IiA+Ci0gICAgICAgJXhodG1sLXNwZWNpYWw7Ci0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zcGVjaWFsLmVudCIKLQotICAgICBSZXZpc2lvbjogICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGggY29uZm9ybWluZwotICAgICBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluIElTTyA4ODc5LCBwcm92aWRlZAotICAgICB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotCi0gICAgIFJldmlzaW9uczoKLTIwMDAtMTAtMjg6IGFkZGVkICZhcG9zOyBhbmQgYWx0ZXJlZCBYTUwgUHJlZGVmaW5lZCBFbnRpdGllcyBmb3IgY29tcGF0aWJpbGl0eQotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBbU0dNTF0gbGlzdCkgZG8gbm90IGNsYXNoIHdpdGgKLSAgICAgYW55IGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IFtJU08xMDY0Nl0gY2hhcmFjdGVyCi0gICAgIG51bWJlcnMgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiBFbnRpdHkgdmFsdWVzIGFyZQotICAgICBkZWNpbWFsIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUKLSAgICAgZG9jdW1lbnQgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIFVuaWNvZGUgW1VOSUNPREVdIG5hbWVzLgotLS0+Ci0KLTwhLS0gQzAgQ29udHJvbHMgYW5kIEJhc2ljIExhdGluIC0tPgotPCFFTlRJVFkgbHQgICAgICAiJiMzODsmIzYwOyIgPjwhLS0gbGVzcy10aGFuIHNpZ24sIFUrMDAzQyBJU09udW0gLS0+Ci08IUVOVElUWSBndCAgICAgICImIzYyOyIgPjwhLS0gZ3JlYXRlci10aGFuIHNpZ24sIFUrMDAzRSBJU09udW0gLS0+Ci08IUVOVElUWSBhbXAgICAgICImIzM4OyYjMzg7IiA+PCEtLSBhbXBlcnNhbmQsIFUrMDAyNiBJU09udW0gLS0+Ci08IUVOVElUWSBhcG9zICAgICImIzM5OyIgPjwhLS0gYXBvc3Ryb3BoZSwgVSswMDI3IElTT251bSAtLT4KLTwhRU5USVRZIHF1b3QgICAgIiYjMzQ7IiA+PCEtLSBxdW90YXRpb24gbWFyayA9IEFQTCBxdW90ZSwgVSswMDIyIElTT251bSAtLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1BIC0tPgotPCFFTlRJVFkgT0VsaWcgICAiJiMzMzg7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLCBVKzAxNTIgSVNPbGF0MiAtLT4KLTwhRU5USVRZIG9lbGlnICAgIiYjMzM5OyIgPjwhLS0gbGF0aW4gc21hbGwgbGlnYXR1cmUgb2UsIFUrMDE1MyBJU09sYXQyIC0tPgotCi08IS0tIGxpZ2F0dXJlIGlzIGEgbWlzbm9tZXIsIHRoaXMgaXMgYSBzZXBhcmF0ZSBjaGFyYWN0ZXIgaW4gc29tZSBsYW5ndWFnZXMgLS0+Ci08IUVOVElUWSBTY2Fyb24gICImIzM1MjsiID48IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFMgd2l0aCBjYXJvbiwgVSswMTYwIElTT2xhdDIgLS0+Ci08IUVOVElUWSBzY2Fyb24gICImIzM1MzsiID48IS0tIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sIFUrMDE2MSBJU09sYXQyIC0tPgotPCFFTlRJVFkgWXVtbCAgICAiJiMzNzY7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggZGlhZXJlc2lzLCBVKzAxNzggSVNPbGF0MiAtLT4KLQotPCEtLSBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgLS0+Ci08IUVOVElUWSBjaXJjICAgICImIzcxMDsiID48IS0tIG1vZGlmaWVyIGxldHRlciBjaXJjdW1mbGV4IGFjY2VudCwgVSswMkM2IElTT3B1YiAtLT4KLTwhRU5USVRZIHRpbGRlICAgIiYjNzMyOyIgPjwhLS0gc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGVuc3AgICAgIiYjODE5NDsiID48IS0tIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViIC0tPgotPCFFTlRJVFkgZW1zcCAgICAiJiM4MTk1OyIgPjwhLS0gZW0gc3BhY2UsIFUrMjAwMyBJU09wdWIgLS0+Ci08IUVOVElUWSB0aGluc3AgICImIzgyMDE7IiA+PCEtLSB0aGluIHNwYWNlLCBVKzIwMDkgSVNPcHViIC0tPgotPCFFTlRJVFkgenduaiAgICAiJiM4MjA0OyIgPjwhLS0gemVybyB3aWR0aCBub24tam9pbmVyLCBVKzIwMEMgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgendqICAgICAiJiM4MjA1OyIgPjwhLS0gemVybyB3aWR0aCBqb2luZXIsIFUrMjAwRCBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBscm0gICAgICImIzgyMDY7IiA+PCEtLSBsZWZ0LXRvLXJpZ2h0IG1hcmssIFUrMjAwRSBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBybG0gICAgICImIzgyMDc7IiA+PCEtLSByaWdodC10by1sZWZ0IG1hcmssIFUrMjAwRiBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBuZGFzaCAgICImIzgyMTE7IiA+PCEtLSBlbiBkYXNoLCBVKzIwMTMgSVNPcHViIC0tPgotPCFFTlRJVFkgbWRhc2ggICAiJiM4MjEyOyIgPjwhLS0gZW0gZGFzaCwgVSsyMDE0IElTT3B1YiAtLT4KLTwhRU5USVRZIGxzcXVvICAgIiYjODIxNjsiID48IS0tIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMTggSVNPbnVtIC0tPgotPCFFTlRJVFkgcnNxdW8gICAiJiM4MjE3OyIgPjwhLS0gcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2JxdW8gICAiJiM4MjE4OyIgPjwhLS0gc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUEgTkVXIC0tPgotPCFFTlRJVFkgbGRxdW8gICAiJiM4MjIwOyIgPjwhLS0gbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmssIFUrMjAxQyBJU09udW0gLS0+Ci08IUVOVElUWSByZHF1byAgICImIzgyMjE7IiA+PCEtLSByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmssIFUrMjAxRCBJU09udW0gLS0+Ci08IUVOVElUWSBiZHF1byAgICImIzgyMjI7IiA+PCEtLSBkb3VibGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxRSBORVcgLS0+Ci08IUVOVElUWSBkYWdnZXIgICImIzgyMjQ7IiA+PCEtLSBkYWdnZXIsIFUrMjAyMCBJU09wdWIgLS0+Ci08IUVOVElUWSBEYWdnZXIgICImIzgyMjU7IiA+PCEtLSBkb3VibGUgZGFnZ2VyLCBVKzIwMjEgSVNPcHViIC0tPgotPCFFTlRJVFkgcGVybWlsICAiJiM4MjQwOyIgPjwhLS0gcGVyIG1pbGxlIHNpZ24sIFUrMjAzMCBJU090ZWNoIC0tPgotCi08IS0tIGxzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgbHNhcXVvICAiJiM4MjQ5OyIgPjwhLS0gc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssIFUrMjAzOSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIHJzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgcnNhcXVvICAiJiM4MjUwOyIgPjwhLS0gc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwM0EgSVNPIHByb3Bvc2VkIC0tPgotPCFFTlRJVFkgZXVybyAgICAiJiM4MzY0OyIgPjwhLS0gZXVybyBzaWduLCBVKzIwQUMgTkVXIC0tPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zcGVjaWFsLmVudCAtLT4KLQotCi08IS0tIGVuZCBvZiB4aHRtbC1jaGFyZW50LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWZyYW1ld29yay0xLm1vZCAtLT4KLQotCi08IS0tIFhIVE1MIENvcmUgTW9kdWxlcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgICAiKCAjUENEQVRBCi0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsgKSoiCi0+Ci0KLTwhRU5USVRZICUgeGh0bWwtdGV4dC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFRleHQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtdGV4dC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBUZXh0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC10ZXh0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUZXh0IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtdGV4dC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUZXh0dWFsIENvbnRlbnQKLQotICAgICBUaGUgVGV4dCBtb2R1bGUgaW5jbHVkZXMgZGVjbGFyYXRpb25zIGZvciBhbGwgY29yZQotICAgICB0ZXh0IGNvbnRhaW5lciBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWlubHN0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxzdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW5sc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5sc3RydWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHN0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgU3RydWN0dXJhbAotCi0gICAgICAgIGJyLCBzcGFuCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzCi0gICAgIHVzZWQgdG8gc3VwcG9ydCBpbmxpbmUtbGV2ZWwgc3RydWN0dXJhbCBtYXJrdXAuCi0tLT4KLQotPCEtLSBicjogZm9yY2VkIGxpbmUgYnJlYWsgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYnIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVici5lbGVtZW50O1sKLQotPCFFTlRJVFkgJSBici5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgYnIucW5hbWUgICJiciIgPgotPCFFTEVNRU5UICVici5xbmFtZTsgICVici5jb250ZW50OyA+Ci0KLTwhLS0gZW5kIG9mIGJyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYnIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVici5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYnIucW5hbWU7Ci0gICAgICAlQ29yZS5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBici5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHNwYW46IGdlbmVyaWMgaW5saW5lIGNvbnRhaW5lciAuLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzcGFuLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3Bhbi5lbGVtZW50O1sKLTwhRU5USVRZICUgc3Bhbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHNwYW4ucW5hbWUgICJzcGFuIiA+Ci08IUVMRU1FTlQgJXNwYW4ucW5hbWU7ICAlc3Bhbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzcGFuLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Bhbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNwYW4uYXR0bGlzdDtbCi08IUFUVExJU1QgJXNwYW4ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHNwYW4uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5sc3RydWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtaW5scGhyYXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW5scGhyYXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW5scGhyYXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWlubHBocmFzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBQaHJhc2FsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHBocmFzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHBocmFzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBQaHJhc2FsCi0KLSAgICAgICAgYWJiciwgYWNyb255bSwgY2l0ZSwgY29kZSwgZGZuLCBlbSwga2JkLCBxLCBzYW1wLCBzdHJvbmcsIHZhcgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgaW5saW5lLWxldmVsIHBocmFzYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgYWJici5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWFiYnIuZWxlbWVudDtbCi08IUVOVElUWSAlIGFiYnIuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBhYmJyLnFuYW1lICAiYWJiciIgPgotPCFFTEVNRU5UICVhYmJyLnFuYW1lOyAgJWFiYnIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYWJici5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGFiYnIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhYmJyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhYmJyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBhYmJyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWNyb255bS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWFjcm9ueW0uZWxlbWVudDtbCi08IUVOVElUWSAlIGFjcm9ueW0uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBhY3JvbnltLnFuYW1lICAiYWNyb255bSIgPgotPCFFTEVNRU5UICVhY3JvbnltLnFuYW1lOyAgJWFjcm9ueW0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgYWNyb255bS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGFjcm9ueW0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhY3JvbnltLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhY3JvbnltLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBhY3JvbnltLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgY2l0ZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNpdGUuZWxlbWVudDtbCi08IUVOVElUWSAlIGNpdGUuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBjaXRlLnFuYW1lICAiY2l0ZSIgPgotPCFFTEVNRU5UICVjaXRlLnFuYW1lOyAgJWNpdGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgY2l0ZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNpdGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjaXRlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjaXRlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjaXRlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgY29kZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNvZGUuZWxlbWVudDtbCi08IUVOVElUWSAlIGNvZGUuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBjb2RlLnFuYW1lICAiY29kZSIgPgotPCFFTEVNRU5UICVjb2RlLnFuYW1lOyAgJWNvZGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgY29kZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNvZGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjb2RlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjb2RlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjb2RlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGZuLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGZuLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkZm4uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBkZm4ucW5hbWUgICJkZm4iID4KLTwhRUxFTUVOVCAlZGZuLnFuYW1lOyAgJWRmbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkZm4uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZm4uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkZm4uYXR0bGlzdDtbCi08IUFUVExJU1QgJWRmbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGZuLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgZW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVlbS5lbGVtZW50O1sKLTwhRU5USVRZICUgZW0uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBlbS5xbmFtZSAgImVtIiA+Ci08IUVMRU1FTlQgJWVtLnFuYW1lOyAgJWVtLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGVtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZW0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVlbS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZW0ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGVtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUga2JkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsla2JkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBrYmQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBrYmQucW5hbWUgICJrYmQiID4KLTwhRUxFTUVOVCAla2JkLnFuYW1lOyAgJWtiZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBrYmQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBrYmQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVrYmQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWtiZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Yga2JkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgcS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXEuZWxlbWVudDtbCi08IUVOVElUWSAlIHEuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBxLnFuYW1lICAicSIgPgotPCFFTEVNRU5UICVxLnFuYW1lOyAgJXEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVxLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVxLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaXRlICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBxLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2FtcC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNhbXAuZWxlbWVudDtbCi08IUVOVElUWSAlIHNhbXAuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzYW1wLnFuYW1lICAic2FtcCIgPgotPCFFTEVNRU5UICVzYW1wLnFuYW1lOyAgJXNhbXAuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2FtcC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNhbXAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzYW1wLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzYW1wLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzYW1wLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Ryb25nLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3Ryb25nLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzdHJvbmcuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzdHJvbmcucW5hbWUgICJzdHJvbmciID4KLTwhRUxFTUVOVCAlc3Ryb25nLnFuYW1lOyAgJXN0cm9uZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzdHJvbmcuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdHJvbmcuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzdHJvbmcuYXR0bGlzdDtbCi08IUFUVExJU1QgJXN0cm9uZy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3Ryb25nLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgdmFyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldmFyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB2YXIuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSB2YXIucW5hbWUgICJ2YXIiID4KLTwhRUxFTUVOVCAldmFyLnFuYW1lOyAgJXZhci5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB2YXIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB2YXIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV2YXIuYXR0bGlzdDtbCi08IUFUVExJU1QgJXZhci5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdmFyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHBocmFzLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYmxrc3RydWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWJsa3N0cnVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ibGtzdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmxrc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJsb2NrIFN0cnVjdHVyYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJsa3N0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJsa3N0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBTdHJ1Y3R1cmFsCi0KLSAgICAgICAgZGl2LCBwCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBzdHJ1Y3R1cmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGRpdi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRpdi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGl2LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGRpdi5xbmFtZSAgImRpdiIgPgotPCFFTEVNRU5UICVkaXYucW5hbWU7ICAlZGl2LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRpdi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRpdi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRpdi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGl2LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkaXYuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcC5lbGVtZW50O1sKLTwhRU5USVRZICUgcC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLTwhRU5USVRZICUgcC5xbmFtZSAgInAiID4KLTwhRUxFTUVOVCAlcC5xbmFtZTsgICVwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgcC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ibGtwaHJhcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtwaHJhcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ibGtwaHJhcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ibGtwaHJhcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBQaHJhc2FsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtwaHJhcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJsa3BocmFzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJsb2NrIFBocmFzYWwKLQotICAgICAgICBhZGRyZXNzLCBibG9ja3F1b3RlLCBwcmUsIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGJsb2NrLWxldmVsIHBocmFzYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgYWRkcmVzcy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWFkZHJlc3MuZWxlbWVudDtbCi08IUVOVElUWSAlIGFkZHJlc3MuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci08IUVOVElUWSAlIGFkZHJlc3MucW5hbWUgICJhZGRyZXNzIiA+Ci08IUVMRU1FTlQgJWFkZHJlc3MucW5hbWU7ICAlYWRkcmVzcy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhZGRyZXNzLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWRkcmVzcy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWFkZHJlc3MuYXR0bGlzdDtbCi08IUFUVExJU1QgJWFkZHJlc3MucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGFkZHJlc3MuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYmxvY2txdW90ZS5lbGVtZW50O1sKLTwhRU5USVRZICUgYmxvY2txdW90ZS5jb250ZW50Ci0gICAgICIoICVCbG9jay5taXg7ICkrIgotPgotPCFFTlRJVFkgJSBibG9ja3F1b3RlLnFuYW1lICAiYmxvY2txdW90ZSIgPgotPCFFTEVNRU5UICVibG9ja3F1b3RlLnFuYW1lOyAgJWJsb2NrcXVvdGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmxvY2txdW90ZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVibG9ja3F1b3RlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVibG9ja3F1b3RlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaXRlICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBibG9ja3F1b3RlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgcHJlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcHJlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgICAiKCAjUENEQVRBCi0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICB8ICV0dC5xbmFtZTsgfCAlaS5xbmFtZTsgfCAlYi5xbmFtZTsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgIHwgJXNjcmlwdC5xbmFtZTsgfCAlbWFwLnFuYW1lOwotICAgICAgJUlubGluZS5leHRyYTsgKSoiCi0+Ci08IUVOVElUWSAlIHByZS5xbmFtZSAgInByZSIgPgotPCFFTEVNRU5UICVwcmUucW5hbWU7ICAlcHJlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHByZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHByZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXByZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcHJlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICB4bWw6c3BhY2UgICAgKCBwcmVzZXJ2ZSApICAgICAgICAgICAgICNGSVhFRCAncHJlc2VydmUnCi0+Ci08IS0tIGVuZCBvZiBwcmUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uICBIZWFkaW5nIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRpbmcuY29udGVudCAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotCi08IUVOVElUWSAlIGgxLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDEuZWxlbWVudDtbCi08IUVOVElUWSAlIGgxLnFuYW1lICAiaDEiID4KLTwhRUxFTUVOVCAlaDEucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgxLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDEuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgxLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGgyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDIuZWxlbWVudDtbCi08IUVOVElUWSAlIGgyLnFuYW1lICAiaDIiID4KLTwhRUxFTUVOVCAlaDIucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGgzLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDMuZWxlbWVudDtbCi08IUVOVElUWSAlIGgzLnFuYW1lICAiaDMiID4KLTwhRUxFTUVOVCAlaDMucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgzLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDMuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgzLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDQuZWxlbWVudDtbCi08IUVOVElUWSAlIGg0LnFuYW1lICAiaDQiID4KLTwhRUxFTUVOVCAlaDQucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg1LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDUuZWxlbWVudDtbCi08IUVOVElUWSAlIGg1LnFuYW1lICAiaDUiID4KLTwhRUxFTUVOVCAlaDUucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg1LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg1LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg2LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDYuZWxlbWVudDtbCi08IUVOVElUWSAlIGg2LnFuYW1lICAiaDYiID4KLTwhRUxFTUVOVCAlaDYucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg2LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDYuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg2LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtwaHJhcy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC10ZXh0LTEubW9kIC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtaHlwZXJ0ZXh0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSHlwZXJ0ZXh0IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWh5cGVydGV4dC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBIeXBlcnRleHQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1oeXBlcnRleHQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEh5cGVydGV4dCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWh5cGVydGV4dC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBIeXBlcnRleHQKLQotICAgICAgICBhCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGFuY2hvciAoJ2EnKSBlbGVtZW50IHR5cGUsIHdoaWNoCi0gICAgIGRlZmluZXMgdGhlIHNvdXJjZSBvZiBhIGh5cGVydGV4dCBsaW5rLiBUaGUgZGVzdGluYXRpb24KLSAgICAgKG9yIGxpbmsgJ3RhcmdldCcpIGlzIGlkZW50aWZpZWQgdmlhIGl0cyAnaWQnIGF0dHJpYnV0ZQotICAgICByYXRoZXIgdGhhbiB0aGUgJ25hbWUnIGF0dHJpYnV0ZSBhcyB3YXMgdXNlZCBpbiBIVE1MLgotLS0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uICBBbmNob3IgRWxlbWVudCAgLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxOb0FuY2hvci5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBhLnFuYW1lICAiYSIgPgotPCFFTEVNRU5UICVhLnFuYW1lOyAgJWEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjaGFyc2V0ICAgICAgJUNoYXJzZXQuZGF0YXR5cGU7ICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBocmVmbGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVECi0gICAgICByZWwgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICByZXYgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWh5cGVydGV4dC0xLm1vZCAtLT4KLQotCi08IUVOVElUWSAlIHhodG1sLWxpc3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaXN0cyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1saXN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIExpc3RzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWxpc3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpc3RzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGlzdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMaXN0cwotCi0gICAgICAgIGRsLCBkdCwgZGQsIG9sLCB1bCwgbGkKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbGlzdC1vcmllbnRlZCBlbGVtZW50IHR5cGVzCi0gICAgIGFuZCB0aGVpciBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhRU5USVRZICUgZGwucW5hbWUgICJkbCIgPgotPCFFTlRJVFkgJSBkdC5xbmFtZSAgImR0IiA+Ci08IUVOVElUWSAlIGRkLnFuYW1lICAiZGQiID4KLTwhRU5USVRZICUgb2wucW5hbWUgICJvbCIgPgotPCFFTlRJVFkgJSB1bC5xbmFtZSAgInVsIiA+Ci08IUVOVElUWSAlIGxpLnFuYW1lICAibGkiID4KLQotPCEtLSBkbDogRGVmaW5pdGlvbiBMaXN0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZGwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkbC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGwuY29udGVudCAgIiggJWR0LnFuYW1lOyB8ICVkZC5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlZGwucW5hbWU7ICAlZGwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBkdDogRGVmaW5pdGlvbiBUZXJtIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZHQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkdC5lbGVtZW50O1sKLTwhRU5USVRZICUgZHQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICVkdC5xbmFtZTsgICVkdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGR0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZHQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWR0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGRkOiBEZWZpbml0aW9uIERlc2NyaXB0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICVkZC5xbmFtZTsgICVkZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9sOiBPcmRlcmVkIExpc3QgKG51bWJlcmVkIHN0eWxlcykgLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvbC5jb250ZW50ICAiKCAlbGkucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJW9sLnFuYW1lOyAgJW9sLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb2wuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb2wucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIG9sLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdWw6IFVub3JkZXJlZCBMaXN0IChidWxsZXQgc3R5bGVzKSAuLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHVsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldWwuZWxlbWVudDtbCi08IUVOVElUWSAlIHVsLmNvbnRlbnQgICIoICVsaS5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldWwucW5hbWU7ICAldWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB1bC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXVsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV1bC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBsaTogTGlzdCBJdGVtIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsaS5lbGVtZW50O1sKLTwhRU5USVRZICUgbGkuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlbGkucW5hbWU7ICAlbGkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsaS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxpLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsaS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgbGkuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbGlzdC0xLm1vZCAtLT4KLQotPCEtLSBFeHRlbmQgbGlzdHMgd2l0aCB2YWx1ZSBhbmQgc3RhcnQgYXR0cmlidXRlcyAtLT4gCi08IUFUVExJU1QgJWxpLnFuYW1lOwotICAgICAgdmFsdWUgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAgI0lNUExJRUQKLT4KLTwhQVRUTElTVCAlb2wucW5hbWU7Ci0gICAgICBzdGFydCAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gSW1hZ2UgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtaW1hZ2UubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbWFnZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW1hZ2UtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW1hZ2VzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW1hZ2UtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJvdmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEltYWdlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWltYWdlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEltYWdlcwotCi0gICAgICAgIGltZwotCi0gICAgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hcmt1cCB0byBzdXBwb3J0IGJhc2ljIGltYWdlIGVtYmVkZGluZy4KLS0tPgotCi08IS0tIFRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGV4dC1vbmx5IFVBcyBhcyB3ZWxsIGFzIHRvIG1ha2UKLSAgICAgaW1hZ2UgY29udGVudCB1bmRlcnN0YW5kYWJsZSBhbmQgbmF2aWdhYmxlIHRvIHVzZXJzIG9mCi0gICAgIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlIGEgZGVzY3JpcHRpb24gd2l0aAotICAgICB0aGUgJ2FsdCcgYXR0cmlidXRlLCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcy4KLS0tPgotCi08IUVOVElUWSAlIGltZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWltZy5lbGVtZW50O1sKLTwhRU5USVRZICUgaW1nLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBpbWcucW5hbWUgICJpbWciID4KLTwhRUxFTUVOVCAlaW1nLnFuYW1lOyAgJWltZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpbWcuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpbWcuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpbWcuYXR0bGlzdDtbCi08IUFUVExJU1QgJWltZy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc3JjICAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGFsdCAgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBsb25nZGVzYyAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWlnaHQgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICB3aWR0aCAgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBpbWcuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW1hZ2UtMS5tb2QgLS0+Ci0KLQotPCEtLSBUYWJsZXMgTW9kdWxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC10YWJsZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIFRhYmxlcyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNpYy10YWJsZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmFzaWMgVGFibGUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2ljLXRhYmxlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCBCYXNpYywgYSBwcm9wZXIgc3Vic2V0IG9mIFhIVE1MLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIFRhYmxlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJhc2ljLXRhYmxlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2ljIFRhYmxlcwotCi0gICAgICAgIHRhYmxlLCBjYXB0aW9uLCB0ciwgdGgsIHRkCi0KLSAgICAgVGhpcyB0YWJsZSBtb2R1bGUgZGVjbGFyZXMgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZGVmaW5pbmcKLSAgICAgYSB0YWJsZSBtb2RlbCBiYXNlZCBmdW5kYW1lbnRhbGx5IG9uIGZlYXR1cmVzIGZvdW5kIGluIHRoZQotICAgICB3aWRlbHktZGVwbG95ZWQgSFRNTCAzLjIgdGFibGUgbW9kZWwuICBXaGlsZSB0aGlzIG1vZHVsZQotICAgICBtaW1pY3MgdGhlIGNvbnRlbnQgbW9kZWwgYW5kIHRhYmxlIGF0dHJpYnV0ZXMgb2YgSFRNTCAzLjIKLSAgICAgdGFibGVzLCB0aGUgZWxlbWVudCB0eXBlcyBkZWNsYXJlZCBoZXJlaW4gYWxzbyBpbmNsdWRlcyBhbGwKLSAgICAgSFRNTCA0IGNvbW1vbiBhbmQgbW9zdCBvZiB0aGUgSFRNTCA0IHRhYmxlIGF0dHJpYnV0ZXMuCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgdGFibGUucW5hbWUgICJ0YWJsZSIgPgotPCFFTlRJVFkgJSBjYXB0aW9uLnFuYW1lICAiY2FwdGlvbiIgPgotPCFFTlRJVFkgJSB0ci5xbmFtZSAgInRyIiA+Ci08IUVOVElUWSAlIHRoLnFuYW1lICAidGgiID4KLTwhRU5USVRZICUgdGQucW5hbWUgICJ0ZCIgPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMKLS0tPgotPCFFTlRJVFkgJSBDZWxsSEFsaWduLmF0dHJpYgotICAgICAiYWxpZ24gICAgICAgICggbGVmdAotICAgICAgICAgICAgICAgICAgIHwgY2VudGVyCi0gICAgICAgICAgICAgICAgICAgfCByaWdodCApICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0tLT4KLTwhRU5USVRZICUgQ2VsbFZBbGlnbi5hdHRyaWIKLSAgICAgInZhbGlnbiAgICAgICAoIHRvcAotICAgICAgICAgICAgICAgICAgIHwgbWlkZGxlCi0gICAgICAgICAgICAgICAgICAgfCBib3R0b20gKSAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHNjb3BlIGlzIHNpbXBsZXIgdGhhbiBheGVzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcwotLS0+Ci08IUVOVElUWSAlIHNjb3BlLmF0dHJpYgotICAgICAic2NvcGUgICAgICAgICggcm93IHwgY29sICApICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSB0YWJsZTogVGFibGUgRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGFibGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0YWJsZS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGFibGUuY29udGVudAotICAgICAiKCAlY2FwdGlvbi5xbmFtZTs/LCAldHIucW5hbWU7KyApIgotPgotPCFFTEVNRU5UICV0YWJsZS5xbmFtZTsgICV0YWJsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0YWJsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRhYmxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGFibGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRhYmxlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzdW1tYXJ5ICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiB0YWJsZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGNhcHRpb246IFRhYmxlIENhcHRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBjYXB0aW9uLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY2FwdGlvbi5lbGVtZW50O1sKLTwhRU5USVRZICUgY2FwdGlvbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWNhcHRpb24ucW5hbWU7ICAlY2FwdGlvbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjYXB0aW9uLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY2FwdGlvbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNhcHRpb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJWNhcHRpb24ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNhcHRpb24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0cjogVGFibGUgUm93IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdHIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ci5lbGVtZW50O1sKLTwhRU5USVRZICUgdHIuY29udGVudCAgIiggJXRoLnFuYW1lOyB8ICV0ZC5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldHIucW5hbWU7ICAldHIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdHIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ci5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ci5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdHIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0aDogVGFibGUgSGVhZGVyIENlbGwgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gdGggaXMgZm9yIGhlYWRlciBjZWxscywgdGQgZm9yIGRhdGEsCi0gICAgIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIHRkCi0tLT4KLQotPCFFTlRJVFkgJSB0aC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRoLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0aC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvd05vVGFibGUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAldGgucW5hbWU7ICAldGguY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGguZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0aC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRoLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0aC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWJiciAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgYXhpcyAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVhZGVycyAgICAgIElEUkVGUyAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgJXNjb3BlLmF0dHJpYjsKLSAgICAgIHJvd3NwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICBjb2xzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGguYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0ZDogVGFibGUgRGF0YSBDZWxsIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ZC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3dOb1RhYmxlLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJXRkLnFuYW1lOyAgJXRkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFiYnIgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGF4aXMgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlYWRlcnMgICAgICBJRFJFRlMgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICVzY29wZS5hdHRyaWI7Ci0gICAgICByb3dzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgY29sc3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2ljLXRhYmxlLTEubW9kIC0tPgotCi0KLTwhLS0gRm9ybXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAKLQlYSFRNTCBiYXNpYyBmb3JtcyBtb2R1bGUgZXh0ZW5kZWQgd2l0aCBvcHRncm91cCBhbmQgZmllbGRzZXQKLS0tPgotPCFFTEVNRU5UICVvcHRncm91cC5xbmFtZTsgKCVvcHRpb24ucW5hbWU7KSs+Ci08IUFUVExJU1QgJW9wdGdyb3VwLnFuYW1lOwotCSVDb21tb24uYXR0cmliOyAKLQlsYWJlbCAlVGV4dC5kYXRhdHlwZTsgI1JFUVVJUkVECi0+Ci08IUVOVElUWSAlIHNlbGVjdC5jb250ZW50ICIoICVvcHRncm91cC5xbmFtZTsgfCAlb3B0aW9uLnFuYW1lOyApKyI+Ci08IUVMRU1FTlQgJWZpZWxkc2V0LnFuYW1lOyAoI1BDREFUQSB8ICVGbG93Lm1peDspKj4KLTwhQVRUTElTVCAlZmllbGRzZXQucW5hbWU7Ci0JJUNvbW1vbi5hdHRyaWI7IAotPgotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQgIiggJUJsa05vRm9ybS5taXg7IHwgJWZpZWxkc2V0LnFuYW1lOyApKyI+Ci08IUVOVElUWSAlIHhodG1sLWZvcm0ubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBGb3JtcyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNpYy1mb3JtLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFNpbXBsaWZpZWQgRm9ybXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2ljLWZvcm0tMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MIEJhc2ljLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzaWMgRm9ybXMgMS4wLy9FTiIgIAotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJhc2ljLWZvcm0tMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmFzaWMgRm9ybXMKLQotICAgICBUaGlzIGZvcm1zIG1vZHVsZSBpcyBiYXNlZCBvbiB0aGUgSFRNTCAzLjIgZm9ybXMgbW9kZWwsIHdpdGgKLSAgICAgdGhlIFdBSS1yZXF1ZXN0ZWQgYWRkaXRpb24gb2YgdGhlIGxhYmVsIGVsZW1lbnQuIFdoaWxlIHRoaXMgCi0gICAgIG1vZHVsZSBlc3NlbnRpYWxseSBtaW1pY3MgdGhlIGNvbnRlbnQgbW9kZWwgYW5kIGF0dHJpYnV0ZXMgb2YgCi0gICAgIEhUTUwgMy4yIGZvcm1zLCB0aGUgZWxlbWVudCB0eXBlcyBkZWNsYXJlZCBoZXJlaW4gYWxzbyBpbmNsdWRlCi0gICAgIGFsbCBIVE1MIDQgY29tbW9uIGF0dHJpYnV0ZXMuCi0KLSAgICAgICAgZm9ybSwgbGFiZWwsIGlucHV0LCBzZWxlY3QsIG9wdGlvbiwgdGV4dGFyZWEKLS0tPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIGVsZW1lbnQgdHlwZSBuYW1lczoKLS0tPgotPCFFTlRJVFkgJSBmb3JtLnFuYW1lICAiZm9ybSIgPgotPCFFTlRJVFkgJSBsYWJlbC5xbmFtZSAgImxhYmVsIiA+Ci08IUVOVElUWSAlIGlucHV0LnFuYW1lICAiaW5wdXQiID4KLTwhRU5USVRZICUgc2VsZWN0LnFuYW1lICAic2VsZWN0IiA+Ci08IUVOVElUWSAlIG9wdGlvbi5xbmFtZSAgIm9wdGlvbiIgPgotPCFFTlRJVFkgJSB0ZXh0YXJlYS5xbmFtZSAgInRleHRhcmVhIiA+Ci0KLTwhLS0gJUJsa05vRm9ybS5taXg7IGluY2x1ZGVzIGFsbCBub24tZm9ybSBibG9jayBlbGVtZW50cywKLSAgICAgcGx1cyAlTWlzYy5jbGFzczsKLS0tPgotPCFFTlRJVFkgJSBCbGtOb0Zvcm0ubWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlQmxrUHJlcy5jbGFzczsKLSAgICAgIHwgJXRhYmxlLnFuYW1lOyAKLSAgICAgICVCbG9jay5leHRyYTsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBmb3JtOiBGb3JtIEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZm9ybS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWZvcm0uZWxlbWVudDtbCi08IUVOVElUWSAlIGZvcm0uY29udGVudAotICAgICAiKCAlQmxrTm9Gb3JtLm1peDsgKSsiCi0+Ci08IUVMRU1FTlQgJWZvcm0ucW5hbWU7ICAlZm9ybS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBmb3JtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZm9ybS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWZvcm0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWZvcm0ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFjdGlvbiAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBtZXRob2QgICAgICAgKCBnZXQgfCBwb3N0ICkgICAgICAgICAgICdnZXQnCi0gICAgICBlbmN0eXBlICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCi0+Ci08IS0tIGVuZCBvZiBmb3JtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbGFiZWw6IEZvcm0gRmllbGQgTGFiZWwgVGV4dCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxhYmVsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGFiZWwuZWxlbWVudDtbCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkCi0tLT4KLTwhRU5USVRZICUgbGFiZWwuY29udGVudAotICAgICAiKCAjUENEQVRBIAotICAgICAgfCAlaW5wdXQucW5hbWU7IHwgJXNlbGVjdC5xbmFtZTsgfCAldGV4dGFyZWEucW5hbWU7Ci0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVJbmxQcmVzLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsgKSoiCi0+Ci08IUVMRU1FTlQgJWxhYmVsLnFuYW1lOyAgJWxhYmVsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxhYmVsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGFiZWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsYWJlbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGFiZWwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGZvciAgICAgICAgICBJRFJFRiAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGxhYmVsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaW5wdXQ6IEZvcm0gQ29udHJvbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGlucHV0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaW5wdXQuZWxlbWVudDtbCi08IUVOVElUWSAlIGlucHV0LmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTEVNRU5UICVpbnB1dC5xbmFtZTsgICVpbnB1dC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpbnB1dC5lbGVtZW50IC0tPl1dPgotCi08IS0tIEJhc2ljIEZvcm1zIHJlbW92ZXMgJ2ltYWdlJyBhbmQgJ2ZpbGUnIGlucHV0IHR5cGVzLgotLS0+Ci08IUVOVElUWSAlIGlucHV0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaW5wdXQuYXR0bGlzdDtbCi08IUVOVElUWSAlIElucHV0VHlwZS5jbGFzcwotICAgICAiKCB0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIAotICAgICAgfCBzdWJtaXQgfCByZXNldCB8IGhpZGRlbiApIgotPgotPCEtLSBhdHRyaWJ1dGUgbmFtZSByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldAotLS0+Ci08IUFUVExJU1QgJWlucHV0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICB0eXBlICAgICAgICAgJUlucHV0VHlwZS5jbGFzczsgICAgICAgICd0ZXh0JwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2hlY2tlZCAgICAgICggY2hlY2tlZCApICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgc2l6ZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgbWF4bGVuZ3RoICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgc3JjICAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW5wdXQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBzZWxlY3Q6IE9wdGlvbiBTZWxlY3RvciAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc2VsZWN0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc2VsZWN0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzZWxlY3QuY29udGVudCAgIiggJW9wdGlvbi5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlc2VsZWN0LnFuYW1lOyAgJXNlbGVjdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzZWxlY3QuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzZWxlY3QuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzZWxlY3QuYXR0bGlzdDtbCi08IUFUVExJU1QgJXNlbGVjdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgc2l6ZSAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgbXVsdGlwbGUgICAgICggbXVsdGlwbGUgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygc2VsZWN0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gb3B0aW9uOiBTZWxlY3RhYmxlIENob2ljZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG9wdGlvbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9wdGlvbi5lbGVtZW50O1sKLTwhRU5USVRZICUgb3B0aW9uLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTEVNRU5UICVvcHRpb24ucW5hbWU7ICAlb3B0aW9uLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9wdGlvbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9wdGlvbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9wdGlvbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb3B0aW9uLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzZWxlY3RlZCAgICAgKCBzZWxlY3RlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBvcHRpb24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0ZXh0YXJlYTogTXVsdGktTGluZSBUZXh0IEZpZWxkIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGV4dGFyZWEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ZXh0YXJlYS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGV4dGFyZWEuY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVMRU1FTlQgJXRleHRhcmVhLnFuYW1lOyAgJXRleHRhcmVhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRleHRhcmVhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGV4dGFyZWEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ZXh0YXJlYS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGV4dGFyZWEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHJvd3MgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI1JFUVVJUkVECi0gICAgICBjb2xzICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNSRVFVSVJFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgdGV4dGFyZWEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmFzaWMtZm9ybS0xLm1vZCAtLT4KLQotCi08IS0tIExpbmsgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWxpbmsubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaW5rIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGluay0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBMaW5rIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1saW5rLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaW5rIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1saW5rLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExpbmsgZWxlbWVudAotCi0gICAgICAgIGxpbmsKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbGluayBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB3aGljaCBjb3VsZCAoaW4gcHJpbmNpcGxlKSBiZSB1c2VkIHRvIGRlZmluZSBkb2N1bWVudC1sZXZlbCBsaW5rcwotICAgICB0byBleHRlcm5hbCByZXNvdXJjZXMgc3VjaCBhczoKLQotICAgICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMsIGUuZy4gc3RhcnQsIGNvbnRlbnRzLAotICAgICAgICBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD0ic3R5bGVzaGVldCIpCi0gICAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9InNjcmlwdCIpCi0gICAgIGQpIGJ5IHN0eWxlIHNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZiBodG1sIG5vZGVzIGFyZQotICAgICAgICByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgICBlLmcuIGEgcG9zdHNjcmlwdCBvciBwZGYgdmVyc2lvbiAocmVsPSJhbHRlcm5hdGUiIG1lZGlhPSJwcmludCIpCi0tLT4KLQotPCEtLSBsaW5rOiBNZWRpYS1JbmRlcGVuZGVudCBMaW5rIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGluay5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxpbmsuZWxlbWVudDtbCi08IUVOVElUWSAlIGxpbmsuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGxpbmsucW5hbWUgICJsaW5rIiA+Ci08IUVMRU1FTlQgJWxpbmsucW5hbWU7ICAlbGluay5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsaW5rLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGluay5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxpbmsuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxpbmsucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNoYXJzZXQgICAgICAlQ2hhcnNldC5kYXRhdHlwZTsgICAgICAgI0lNUExJRUQKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhyZWZsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIHJlbCAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHJldiAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIG1lZGlhICAgICAgICAlTWVkaWFEZXNjLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGxpbmsuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbGluay0xLm1vZCAtLT4KLQotCi08IS0tIERvY3VtZW50IE1ldGFpbmZvcm1hdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLW1ldGEubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBNZXRhaW5mb3JtYXRpb24gMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbWV0YS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEb2N1bWVudCBNZXRhaW5mb3JtYXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1tZXRhLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBNZXRhaW5mb3JtYXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1tZXRhLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE1ldGEgSW5mb3JtYXRpb24KLQotICAgICAgICBtZXRhCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIG1ldGEgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBwcm92aWRlIGRlY2xhcmF0aXZlIGRvY3VtZW50IG1ldGFpbmZvcm1hdGlvbi4KLS0tPgotCi08IS0tIG1ldGE6IEdlbmVyaWMgTWV0YWluZm9ybWF0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBtZXRhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbWV0YS5lbGVtZW50O1sKLTwhRU5USVRZICUgbWV0YS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgbWV0YS5xbmFtZSAgIm1ldGEiID4KLTwhRUxFTUVOVCAlbWV0YS5xbmFtZTsgICVtZXRhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG1ldGEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBtZXRhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbWV0YS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbWV0YS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICBodHRwLWVxdWl2ICAgTk1UT0tFTiAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBuYW1lICAgICAgICAgTk1UT0tFTiAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjb250ZW50ICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgc2NoZW1lICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbWV0YS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1tZXRhLTEubW9kIC0tPgotCi0KLTwhLS0gQmFzZSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtYmFzZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJhc2UgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2UtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJhc2UtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmFzZSBlbGVtZW50Ci0KLSAgICAgICAgYmFzZQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBiYXNlIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gZGVmaW5lIGEgYmFzZSBVUkkgYWdhaW5zdCB3aGljaCByZWxhdGl2ZSBVUklzIGluIHRoZQotICAgICBkb2N1bWVudCB3aWxsIGJlIHJlc29sdmVkLgotCi0gICAgIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBhbHNvIHJlZGVjbGFyZXMgdGhlIGNvbnRlbnQgbW9kZWwgZm9yCi0gICAgIHRoZSBoZWFkIGVsZW1lbnQgdG8gaW5jbHVkZSB0aGUgYmFzZSBlbGVtZW50LgotLS0+Ci0KLTwhLS0gYmFzZTogRG9jdW1lbnQgQmFzZSBVUkkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJhc2UuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViYXNlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiYXNlLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBiYXNlLnFuYW1lICAiYmFzZSIgPgotPCFFTEVNRU5UICViYXNlLnFuYW1lOyAgJWJhc2UuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmFzZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJhc2UuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyViYXNlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViYXNlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0+Ci08IS0tIGVuZCBvZiBiYXNlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50Ci0gICAgIiggJUhlYWRPcHRzLm1peDssCi0gICAgICggKCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OywgKCAlYmFzZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICk/ICkKLSAgICAgfCAoICViYXNlLnFuYW1lOywgJUhlYWRPcHRzLm1peDssICggJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKSkpKSIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmFzZS0xLm1vZCAtLT4KLQotCi08IS0tIFN0eWxlc2hlZXRzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXN0eWxlLm1vZCBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgU3R5bGUgU2hlZXRzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXN0eWxlLTEubW9kIj4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRG9jdW1lbnQgU3R5bGUgU2hlZXQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3R5bGUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCBTdHlsZSBTaGVldHMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHlsZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBTdHlsZSBTaGVldHMKLQotICAgICAgICBzdHlsZQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBzdHlsZSBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB1c2VkIHRvIGVtYmVkIHN0eWxlIHNoZWV0IGluZm9ybWF0aW9uIGluIHRoZSBkb2N1bWVudCBoZWFkIGVsZW1lbnQuCi0tLT4KLQotPCEtLSBzdHlsZTogU3R5bGUgU2hlZXQgSW5mb3JtYXRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc3R5bGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdHlsZS5lbGVtZW50O1sKLTwhRU5USVRZICUgc3R5bGUuY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVOVElUWSAlIHN0eWxlLnFuYW1lICAic3R5bGUiID4KLTwhRUxFTUVOVCAlc3R5bGUucW5hbWU7ICAlc3R5bGUuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3R5bGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdHlsZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN0eWxlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdHlsZS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAldGl0bGUuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjUkVRVUlSRUQKLSAgICAgIG1lZGlhICAgICAgICAlTWVkaWFEZXNjLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHhtbDpzcGFjZSAgICAoIHByZXNlcnZlICkgICAgICAgICAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLT4KLTwhLS0gZW5kIG9mIHN0eWxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXN0eWxlLTEubW9kIC0tPgotCi0KLTwhLS0gUGFyYW0gRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtcGFyYW0ubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBQYXJhbSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXBhcmFtLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFBhcmFtIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1wYXJhbS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUGFyYW0gRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXBhcmFtLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFBhcmFtZXRlcnMgZm9yIEphdmEgQXBwbGV0cyBhbmQgRW1iZWRkZWQgT2JqZWN0cwotCi0gICAgICAgIHBhcmFtCi0KLSAgICAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgZGVjbGFyYXRpb25zIGZvciB0aGUgcGFyYW0gZWxlbWVudCwKLSAgICAgdXNlZCB0byBwcm92aWRlIG5hbWVkIHByb3BlcnR5IHZhbHVlcyBmb3IgdGhlIGFwcGxldAotICAgICBhbmQgb2JqZWN0IGVsZW1lbnRzLgotLS0+Ci0KLTwhLS0gcGFyYW06IE5hbWVkIFByb3BlcnR5IFZhbHVlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHBhcmFtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcGFyYW0uZWxlbWVudDtbCi08IUVOVElUWSAlIHBhcmFtLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBwYXJhbS5xbmFtZSAgInBhcmFtIiA+Ci08IUVMRU1FTlQgJXBhcmFtLnFuYW1lOyAgJXBhcmFtLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHBhcmFtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcGFyYW0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwYXJhbS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcGFyYW0ucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJWlkLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZXR5cGUgICAgKCBkYXRhIHwgcmVmIHwgb2JqZWN0ICkgICdkYXRhJwotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgcGFyYW0uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcGFyYW0tMS5tb2QgLS0+Ci0KLQotPCEtLSBFbWJlZGRlZCBPYmplY3QgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1vYmplY3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBFbWJlZGRlZCBPYmplY3QgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtb2JqZWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEVtYmVkZGVkIE9iamVjdCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW9iamVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRW1iZWRkZWQgT2JqZWN0IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtb2JqZWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEVtYmVkZGVkIE9iamVjdHMKLQotICAgICAgICBvYmplY3QKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgb2JqZWN0IGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsIHVzZWQKLSAgICAgdG8gZW1iZWQgZXh0ZXJuYWwgb2JqZWN0cyBhcyBwYXJ0IG9mIFhIVE1MIHBhZ2VzLiBJbiB0aGUgZG9jdW1lbnQsCi0gICAgIHBsYWNlIHBhcmFtIGVsZW1lbnRzIHByaW9yIHRvIG90aGVyIGNvbnRlbnQgd2l0aGluIHRoZSBvYmplY3QgZWxlbWVudC4KLQotICAgICBOb3RlIHRoYXQgdXNlIG9mIHRoaXMgbW9kdWxlIHJlcXVpcmVzIGluc3RhbnRpYXRpb24gb2YgdGhlIFBhcmFtCi0gICAgIEVsZW1lbnQgTW9kdWxlLgotLS0+Ci0KLTwhLS0gb2JqZWN0OiBHZW5lcmljIEVtYmVkZGVkIE9iamVjdCAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG9iamVjdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9iamVjdC5lbGVtZW50O1sKLTwhRU5USVRZICUgb2JqZWN0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgfCAlcGFyYW0ucW5hbWU7ICkqIgotPgotPCFFTlRJVFkgJSBvYmplY3QucW5hbWUgICJvYmplY3QiID4KLTwhRUxFTUVOVCAlb2JqZWN0LnFuYW1lOyAgJW9iamVjdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvYmplY3QuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvYmplY3QuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvYmplY3QuYXR0bGlzdDtbCi08IUFUVExJU1QgJW9iamVjdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgZGVjbGFyZSAgICAgICggZGVjbGFyZSApICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2xhc3NpZCAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgY29kZWJhc2UgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGF0YSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgY29kZXR5cGUgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgYXJjaGl2ZSAgICAgICVVUklzLmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgc3RhbmRieSAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVpZ2h0ICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgd2lkdGggICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygb2JqZWN0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW9iamVjdC0xLm1vZCAtLT4KLQotCi08IS0tIERvY3VtZW50IFN0cnVjdHVyZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXN0cnVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIERvY3VtZW50IFN0cnVjdHVyZSAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHJ1Y3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgU3RydWN0dXJlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3RydWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBEb2N1bWVudCBTdHJ1Y3R1cmUgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRG9jdW1lbnQgU3RydWN0dXJlCi0KLSAgICAgICAgdGl0bGUsIGhlYWQsIGJvZHksIGh0bWwKLQotICAgICBUaGUgU3RydWN0dXJlIE1vZHVsZSBkZWZpbmVzIHRoZSBtYWpvciBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZAotICAgICB0aGVpciBhdHRyaWJ1dGVzLgotCi0gICAgIE5vdGUgdGhhdCB0aGUgY29udGVudCBtb2RlbCBvZiB0aGUgaGVhZCBlbGVtZW50IHR5cGUgaXMgcmVkZWNsYXJlZAotICAgICB3aGVuIHRoZSBCYXNlIE1vZHVsZSBpcyBpbmNsdWRlZCBpbiB0aGUgRFRELgotCi0gICAgIFRoZSBwYXJhbWV0ZXIgZW50aXR5IGNvbnRhaW5pbmcgdGhlIFhNTCBuYW1lc3BhY2UgVVJJIHZhbHVlIHVzZWQKLSAgICAgZm9yIFhIVE1MIGlzICclWEhUTUwueG1sbnM7JywgZGVmaW5lZCBpbiB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZS4KLS0tPgotCi08IS0tIHRpdGxlOiBEb2N1bWVudCBUaXRsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUaGUgdGl0bGUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLS0tPgotCi08IUVOVElUWSAlIHRpdGxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGl0bGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHRpdGxlLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTlRJVFkgJSB0aXRsZS5xbmFtZSAgInRpdGxlIiA+Ci08IUVMRU1FTlQgJXRpdGxlLnFuYW1lOyAgJXRpdGxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRpdGxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGl0bGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0aXRsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGl0bGUucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGl0bGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBoZWFkOiBEb2N1bWVudCBIZWFkIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaGVhZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWhlYWQuZWxlbWVudDtbCi08IUVOVElUWSAlIGhlYWQuY29udGVudAotICAgICIoICVIZWFkT3B0cy5taXg7LCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApIgotPgotPCFFTlRJVFkgJSBoZWFkLnFuYW1lICAiaGVhZCIgPgotPCFFTEVNRU5UICVoZWFkLnFuYW1lOyAgJWhlYWQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaGVhZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGhlYWQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoZWFkLmF0dGxpc3Q7WwotPCEtLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSB3aXRoIGRvY3VtZW50IHByb2ZpbGVzCi0tLT4KLTwhRU5USVRZICUgcHJvZmlsZS5hdHRyaWIKLSAgICAgInByb2ZpbGUgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgJyVYSFRNTC5wcm9maWxlOyciCi0+Ci0KLTwhQVRUTElTVCAlaGVhZC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICAlcHJvZmlsZS5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoZWFkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gYm9keTogRG9jdW1lbnQgQm9keSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJvZHkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVib2R5LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBib2R5LmNvbnRlbnQKLSAgICAgIiggJUJsb2NrLm1peDsgKSsiCi0+Ci08IUVOVElUWSAlIGJvZHkucW5hbWUgICJib2R5IiA+Ci08IUVMRU1FTlQgJWJvZHkucW5hbWU7ICAlYm9keS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBib2R5LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYm9keS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJvZHkuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJvZHkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJvZHkuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBodG1sOiBYSFRNTCBEb2N1bWVudCBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaHRtbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWh0bWwuZWxlbWVudDtbCi08IUVOVElUWSAlIGh0bWwuY29udGVudCAgIiggJWhlYWQucW5hbWU7LCAlYm9keS5xbmFtZTsgKSIgPgotPCFFTlRJVFkgJSBodG1sLnFuYW1lICAiaHRtbCIgPgotPCFFTEVNRU5UICVodG1sLnFuYW1lOyAgJWh0bWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaHRtbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGh0bWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVodG1sLmF0dGxpc3Q7WwotPCEtLSB2ZXJzaW9uIGF0dHJpYnV0ZSB2YWx1ZSBkZWZpbmVkIGluIGRyaXZlcgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnZlcnNpb24uYXR0cmliCi0gICAgICJ2ZXJzaW9uICAgICAgJUZQSS5kYXRhdHlwZTsgICAgICAgICAgICNGSVhFRCAnJVhIVE1MLnZlcnNpb247JyIKLT4KLQotPCEtLSBzZWUgdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUgZm9yIGluZm9ybWF0aW9uCi0gICAgIG9uIGhvdyB0byBleHRlbmQgWEhUTUwgdXNpbmcgWE1MIG5hbWVzcGFjZXMKLS0tPgotPCFBVFRMSVNUICVodG1sLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVYSFRNTC52ZXJzaW9uLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGh0bWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3RydWN0LTEubW9kIC0tPgotCi0KLTwhLS0gQmxvY2sgUHJlc2VudGF0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWJsa3ByZXMubW9kIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAJCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmxrcHJlcy0xLm1vZCI+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJsb2NrIFByZXNlbnRhdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJsa3ByZXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJsa3ByZXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgUHJlc2VudGF0aW9uYWwgRWxlbWVudHMKLQotICAgICAgICBocgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgcHJlc2VudGF0aW9uYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgaHIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoci5lbGVtZW50O1sKLTwhRU5USVRZICUgaHIuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGhyLnFuYW1lICAiaHIiID4KLTwhRUxFTUVOVCAlaHIucW5hbWU7ICAlaHIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaHIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoci5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWhyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoci5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaHIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmxrcHJlcy0xLm1vZCAtLT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gCi0JSW5saW5lIFByZXNlbnRhdGlvbjogYiwgYmlnLCBpLCBzbWFsbAkJCi0tLT4KLTwhRU5USVRZICUgc3ViLmVsZW1lbnQgIklHTk9SRSI+Ci08IUVOVElUWSAlIHN1Yi5hdHRsaXN0ICJJR05PUkUiPgotPCFFTlRJVFkgJSBzdXAuZWxlbWVudCAiSUdOT1JFIj4KLTwhRU5USVRZICUgc3VwLmF0dGxpc3QgIklHTk9SRSI+Ci08IUVOVElUWSAlIHR0LmVsZW1lbnQgIklHTk9SRSI+Ci08IUVOVElUWSAlIHR0LmF0dGxpc3QgIklHTk9SRSI+Ci08IUVOVElUWSAlIHhodG1sLWlubHByZXMubW9kIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0JCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5scHJlcy0xLm1vZCI+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBQcmVzZW50YXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHByZXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxwcmVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBQcmVzZW50YXRpb25hbCBFbGVtZW50cwotCi0gICAgICAgIGIsIGJpZywgaSwgc21hbGwsIHN1Yiwgc3VwLCB0dAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgaW5saW5lLWxldmVsIHByZXNlbnRhdGlvbmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYi5xbmFtZSAgImIiID4KLTwhRUxFTUVOVCAlYi5xbmFtZTsgICViLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGJpZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJpZy5lbGVtZW50O1sKLTwhRU5USVRZICUgYmlnLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYmlnLnFuYW1lICAiYmlnIiA+Ci08IUVMRU1FTlQgJWJpZy5xbmFtZTsgICViaWcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmlnLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmlnLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmlnLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViaWcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJpZy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgaS5xbmFtZSAgImkiID4KLTwhRUxFTUVOVCAlaS5xbmFtZTsgICVpLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHNtYWxsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc21hbGwuZWxlbWVudDtbCi08IUVOVElUWSAlIHNtYWxsLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc21hbGwucW5hbWUgICJzbWFsbCIgPgotPCFFTEVNRU5UICVzbWFsbC5xbmFtZTsgICVzbWFsbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzbWFsbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNtYWxsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc21hbGwuYXR0bGlzdDtbCi08IUFUVExJU1QgJXNtYWxsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzbWFsbC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN1Yi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN1Yi5lbGVtZW50O1sKLTwhRU5USVRZICUgc3ViLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3ViLnFuYW1lICAic3ViIiA+Ci08IUVMRU1FTlQgJXN1Yi5xbmFtZTsgICVzdWIuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3ViLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3ViLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3ViLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdWIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN1Yi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN1cC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN1cC5lbGVtZW50O1sKLTwhRU5USVRZICUgc3VwLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3VwLnFuYW1lICAic3VwIiA+Ci08IUVMRU1FTlQgJXN1cC5xbmFtZTsgICVzdXAuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3VwLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3VwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3VwLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN1cC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHR0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldHQuZWxlbWVudDtbCi08IUVOVElUWSAlIHR0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgdHQucW5hbWUgICJ0dCIgPgotPCFFTEVNRU5UICV0dC5xbmFtZTsgICV0dC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0dC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHR0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldHQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXR0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0dC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxwcmVzLTEubW9kIC0tPgotCi0KLTwhLS0gZW5kIG9mIFhIVE1MIE1vYmlsZSAxLjAgRFREICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1zcGVjaWFsLmVudCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1zcGVjaWFsLmVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3MDlkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtc3BlY2lhbC5lbnQKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IS0tIFNwZWNpYWwgY2hhcmFjdGVycyBmb3IgSFRNTCAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXNwZWNpYWwuZW50Ij4KLSAgICAgJUhUTUxzcGVjaWFsOwotLS0+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgbGlzdCkgZG8gbm90IGNsYXNoIHdpdGggYW55Ci0gICAgIGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IGNoYXJhY3RlciBudW1iZXJzCi0gICAgIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gdmFsdWVzIGFyZSBkZWNpbWFsCi0gICAgIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUgZG9jdW1lbnQKLSAgICAgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIFVuaWNvZGUgbmFtZXMuIAotLS0+Ci0KLTwhLS0gQzAgQ29udHJvbHMgYW5kIEJhc2ljIExhdGluIC0tPgotPCFFTlRJVFkgcXVvdCAgICAiJiMzNDsiPiA8IS0tICBxdW90YXRpb24gbWFyayA9IEFQTCBxdW90ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDAyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbXAgICAgICImIzM4OyMzODsiPiA8IS0tICBhbXBlcnNhbmQsIFUrMDAyNiBJU09udW0gLS0+Ci08IUVOVElUWSBsdCAgICAgICImIzM4OyM2MDsiPiA8IS0tICBsZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bSAtLT4KLTwhRU5USVRZIGd0ICAgICAgIiYjNjI7Ij4gPCEtLSAgZ3JlYXRlci10aGFuIHNpZ24sIFUrMDAzRSBJU09udW0gLS0+Ci08IUVOVElUWSBhcG9zCSAiJiMzOTsiPiA8IS0tICBhcG9zdHJvcGhlIG1hcmssIFUrMDAyNyBJU09udW0gLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQSAtLT4KLTwhRU5USVRZIE9FbGlnICAgIiYjMzM4OyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgT0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNTIgSVNPbGF0MiAtLT4KLTwhRU5USVRZIG9lbGlnICAgIiYjMzM5OyI+IDwhLS0gIGxhdGluIHNtYWxsIGxpZ2F0dXJlIG9lLCBVKzAxNTMgSVNPbGF0MiAtLT4KLTwhLS0gbGlnYXR1cmUgaXMgYSBtaXNub21lciwgdGhpcyBpcyBhIHNlcGFyYXRlIGNoYXJhY3RlciBpbiBzb21lIGxhbmd1YWdlcyAtLT4KLTwhRU5USVRZIFNjYXJvbiAgIiYjMzUyOyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGV0dGVyIFMgd2l0aCBjYXJvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE2MCBJU09sYXQyIC0tPgotPCFFTlRJVFkgc2Nhcm9uICAiJiMzNTM7Ij4gPCEtLSAgbGF0aW4gc21hbGwgbGV0dGVyIHMgd2l0aCBjYXJvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE2MSBJU09sYXQyIC0tPgotPCFFTlRJVFkgWXVtbCAgICAiJiMzNzY7Ij4gPCEtLSAgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE3OCBJU09sYXQyIC0tPgotCi08IS0tIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyAtLT4KLTwhRU5USVRZIGNpcmMgICAgIiYjNzEwOyI+IDwhLS0gIG1vZGlmaWVyIGxldHRlciBjaXJjdW1mbGV4IGFjY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDJDNiBJU09wdWIgLS0+Ci08IUVOVElUWSB0aWxkZSAgICImIzczMjsiPiA8IS0tICBzbWFsbCB0aWxkZSwgVSswMkRDIElTT2RpYSAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgZW5zcCAgICAiJiM4MTk0OyI+IDwhLS0gZW4gc3BhY2UsIFUrMjAwMiBJU09wdWIgLS0+Ci08IUVOVElUWSBlbXNwICAgICImIzgxOTU7Ij4gPCEtLSBlbSBzcGFjZSwgVSsyMDAzIElTT3B1YiAtLT4KLTwhRU5USVRZIHRoaW5zcCAgIiYjODIwMTsiPiA8IS0tIHRoaW4gc3BhY2UsIFUrMjAwOSBJU09wdWIgLS0+Ci08IUVOVElUWSB6d25qICAgICImIzgyMDQ7Ij4gPCEtLSB6ZXJvIHdpZHRoIG5vbi1qb2luZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMEMgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgendqICAgICAiJiM4MjA1OyI+IDwhLS0gemVybyB3aWR0aCBqb2luZXIsIFUrMjAwRCBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBscm0gICAgICImIzgyMDY7Ij4gPCEtLSBsZWZ0LXRvLXJpZ2h0IG1hcmssIFUrMjAwRSBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBybG0gICAgICImIzgyMDc7Ij4gPCEtLSByaWdodC10by1sZWZ0IG1hcmssIFUrMjAwRiBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBuZGFzaCAgICImIzgyMTE7Ij4gPCEtLSBlbiBkYXNoLCBVKzIwMTMgSVNPcHViIC0tPgotPCFFTlRJVFkgbWRhc2ggICAiJiM4MjEyOyI+IDwhLS0gZW0gZGFzaCwgVSsyMDE0IElTT3B1YiAtLT4KLTwhRU5USVRZIGxzcXVvICAgIiYjODIxNjsiPiA8IS0tIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDE4IElTT251bSAtLT4KLTwhRU5USVRZIHJzcXVvICAgIiYjODIxNzsiPiA8IS0tIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOSBJU09udW0gLS0+Ci08IUVOVElUWSBzYnF1byAgICImIzgyMTg7Ij4gPCEtLSBzaW5nbGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxQSBORVcgLS0+Ci08IUVOVElUWSBsZHF1byAgICImIzgyMjA7Ij4gPCEtLSBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxQyBJU09udW0gLS0+Ci08IUVOVElUWSByZHF1byAgICImIzgyMjE7Ij4gPCEtLSByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgYmRxdW8gICAiJiM4MjIyOyI+IDwhLS0gZG91YmxlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUUgTkVXIC0tPgotPCFFTlRJVFkgZGFnZ2VyICAiJiM4MjI0OyI+IDwhLS0gZGFnZ2VyLCBVKzIwMjAgSVNPcHViIC0tPgotPCFFTlRJVFkgRGFnZ2VyICAiJiM4MjI1OyI+IDwhLS0gZG91YmxlIGRhZ2dlciwgVSsyMDIxIElTT3B1YiAtLT4KLTwhRU5USVRZIHBlcm1pbCAgIiYjODI0MDsiPiA8IS0tIHBlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxzYXF1byAgIiYjODI0OTsiPiA8IS0tIHNpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDM5IElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gbHNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSByc2FxdW8gICImIzgyNTA7Ij4gPCEtLSBzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0EgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSByc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIGV1cm8gICAiJiM4MzY0OyI+IDwhLS0gIGV1cm8gc2lnbiwgVSsyMEFDIE5FVyAtLT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1zeW1ib2wuZW50IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLXN5bWJvbC5lbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Zjg3NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLXN5bWJvbC5lbnQKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotPCEtLSBNYXRoZW1hdGljYWwsIEdyZWVrIGFuZCBTeW1ib2xpYyBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zeW1ib2wuZW50Ij4KLSAgICAgJUhUTUxzeW1ib2w7Ci0tLT4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aCBhbnkKLSAgICAgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgY2hhcmFjdGVyIG51bWJlcnMKLSAgICAgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiB2YWx1ZXMgYXJlIGRlY2ltYWwKLSAgICAgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZSBkb2N1bWVudAotICAgICBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgVW5pY29kZSBuYW1lcy4gCi0tLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1CIC0tPgotPCFFTlRJVFkgZm5vZiAgICAgIiYjNDAyOyI+IDwhLS0gbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmbG9yaW4sIFUrMDE5MiBJU090ZWNoIC0tPgotCi08IS0tIEdyZWVrIC0tPgotPCFFTlRJVFkgQWxwaGEgICAgIiYjOTEzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYWxwaGEsIFUrMDM5MSAtLT4KLTwhRU5USVRZIEJldGEgICAgICImIzkxNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGJldGEsIFUrMDM5MiAtLT4KLTwhRU5USVRZIEdhbW1hICAgICImIzkxNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzkzIElTT2dyazMgLS0+Ci08IUVOVElUWSBEZWx0YSAgICAiJiM5MTY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5NCBJU09ncmszIC0tPgotPCFFTlRJVFkgRXBzaWxvbiAgIiYjOTE3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXBzaWxvbiwgVSswMzk1IC0tPgotPCFFTlRJVFkgWmV0YSAgICAgIiYjOTE4OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgemV0YSwgVSswMzk2IC0tPgotPCFFTlRJVFkgRXRhICAgICAgIiYjOTE5OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXRhLCBVKzAzOTcgLS0+Ci08IUVOVElUWSBUaGV0YSAgICAiJiM5MjA7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5OCBJU09ncmszIC0tPgotPCFFTlRJVFkgSW90YSAgICAgIiYjOTIxOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5IC0tPgotPCFFTlRJVFkgS2FwcGEgICAgIiYjOTIyOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIga2FwcGEsIFUrMDM5QSAtLT4KLTwhRU5USVRZIExhbWJkYSAgICImIzkyMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5QiBJU09ncmszIC0tPgotPCFFTlRJVFkgTXUgICAgICAgIiYjOTI0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbXUsIFUrMDM5QyAtLT4KLTwhRU5USVRZIE51ICAgICAgICImIzkyNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG51LCBVKzAzOUQgLS0+Ci08IUVOVElUWSBYaSAgICAgICAiJiM5MjY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB4aSwgVSswMzlFIElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWljcm9uICAiJiM5Mjc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWljcm9uLCBVKzAzOUYgLS0+Ci08IUVOVElUWSBQaSAgICAgICAiJiM5Mjg7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaSwgVSswM0EwIElTT2dyazMgLS0+Ci08IUVOVElUWSBSaG8gICAgICAiJiM5Mjk7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciByaG8sIFUrMDNBMSAtLT4KLTwhLS0gdGhlcmUgaXMgbm8gU2lnbWFmLCBhbmQgbm8gVSswM0EyIGNoYXJhY3RlciBlaXRoZXIgLS0+Ci08IUVOVElUWSBTaWdtYSAgICAiJiM5MzE7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBMyBJU09ncmszIC0tPgotPCFFTlRJVFkgVGF1ICAgICAgIiYjOTMyOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQgLS0+Ci08IUVOVElUWSBVcHNpbG9uICAiJiM5MzM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E1IElTT2dyazMgLS0+Ci08IUVOVElUWSBQaGkgICAgICAiJiM5MzQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIENoaSAgICAgICImIzkzNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3IC0tPgotPCFFTlRJVFkgUHNpICAgICAgIiYjOTM2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E4IElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWVnYSAgICAiJiM5Mzc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOSBJU09ncmszIC0tPgotCi08IUVOVElUWSBhbHBoYSAgICAiJiM5NDU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGJldGEgICAgICImIzk0NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBiZXRhLCBVKzAzQjIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGdhbW1hICAgICImIzk0NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMyBJU09ncmszIC0tPgotPCFFTlRJVFkgZGVsdGEgICAgIiYjOTQ4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I0IElTT2dyazMgLS0+Ci08IUVOVElUWSBlcHNpbG9uICAiJiM5NDk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNSBJU09ncmszIC0tPgotPCFFTlRJVFkgemV0YSAgICAgIiYjOTUwOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHpldGEsIFUrMDNCNiBJU09ncmszIC0tPgotPCFFTlRJVFkgZXRhICAgICAgIiYjOTUxOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGV0YSwgVSswM0I3IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YSAgICAiJiM5NTI7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGlvdGEgICAgICImIzk1MzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGthcHBhICAgICImIzk1NDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQSBJU09ncmszIC0tPgotPCFFTlRJVFkgbGFtYmRhICAgIiYjOTU1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQiBJU09ncmszIC0tPgotPCFFTlRJVFkgbXUgICAgICAgIiYjOTU2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG11LCBVKzAzQkMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG51ICAgICAgICImIzk1NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMgLS0+Ci08IUVOVElUWSB4aSAgICAgICAiJiM5NTg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgeGksIFUrMDNCRSBJU09ncmszIC0tPgotPCFFTlRJVFkgb21pY3JvbiAgIiYjOTU5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9taWNyb24sIFUrMDNCRiBORVcgLS0+Ci08IUVOVElUWSBwaSAgICAgICAiJiM5NjA7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGksIFUrMDNDMCBJU09ncmszIC0tPgotPCFFTlRJVFkgcmhvICAgICAgIiYjOTYxOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHJobywgVSswM0MxIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYWYgICAiJiM5NjI7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZmluYWwgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hICAgICImIzk2MzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGF1ICAgICAgIiYjOTY0OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRhdSwgVSswM0M0IElTT2dyazMgLS0+Ci08IUVOVElUWSB1cHNpbG9uICAiJiM5NjU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDNSBJU09ncmszIC0tPgotPCFFTlRJVFkgcGhpICAgICAgIiYjOTY2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBoaSwgVSswM0M2IElTT2dyazMgLS0+Ci08IUVOVElUWSBjaGkgICAgICAiJiM5Njc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgY2hpLCBVKzAzQzcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBzaSAgICAgICImIzk2ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwc2ksIFUrMDNDOCBJU09ncmszIC0tPgotPCFFTlRJVFkgb21lZ2EgICAgIiYjOTY5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M5IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YXN5bSAiJiM5Nzc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QxIE5FVyAtLT4KLTwhRU5USVRZIHVwc2loICAgICImIzk3ODsiPiA8IS0tIGdyZWVrIHVwc2lsb24gd2l0aCBob29rIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMiBORVcgLS0+Ci08IUVOVElUWSBwaXYgICAgICAiJiM5ODI7Ij4gPCEtLSBncmVlayBwaSBzeW1ib2wsIFUrMDNENiBJU09ncmszIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBidWxsICAgICAiJiM4MjI2OyI+IDwhLS0gYnVsbGV0ID0gYmxhY2sgc21hbGwgY2lyY2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyMiBJU09wdWIgIC0tPgotPCEtLSBidWxsZXQgaXMgTk9UIHRoZSBzYW1lIGFzIGJ1bGxldCBvcGVyYXRvciwgVSsyMjE5IC0tPgotPCFFTlRJVFkgaGVsbGlwICAgIiYjODIzMDsiPiA8IS0tIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyNiBJU09wdWIgIC0tPgotPCFFTlRJVFkgcHJpbWUgICAgIiYjODI0MjsiPiA8IS0tIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgUHJpbWUgICAgIiYjODI0MzsiPiA8IS0tIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDMzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBvbGluZSAgICAiJiM4MjU0OyI+IDwhLS0gb3ZlcmxpbmUgPSBzcGFjaW5nIG92ZXJzY29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0UgTkVXIC0tPgotPCFFTlRJVFkgZnJhc2wgICAgIiYjODI2MDsiPiA8IS0tIGZyYWN0aW9uIHNsYXNoLCBVKzIwNDQgTkVXIC0tPgotCi08IS0tIExldHRlcmxpa2UgU3ltYm9scyAtLT4KLTwhRU5USVRZIHdlaWVycCAgICImIzg0NzI7Ij4gPCEtLSBzY3JpcHQgY2FwaXRhbCBQID0gcG93ZXIgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBXZWllcnN0cmFzcyBwLCBVKzIxMTggSVNPYW1zbyAtLT4KLTwhRU5USVRZIGltYWdlICAgICImIzg0NjU7Ij4gPCEtLSBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMTEgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHJlYWwgICAgICImIzg0NzY7Ij4gPCEtLSBibGFja2xldHRlciBjYXBpdGFsIFIgPSByZWFsIHBhcnQgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExQyBJU09hbXNvIC0tPgotPCFFTlRJVFkgdHJhZGUgICAgIiYjODQ4MjsiPiA8IS0tIHRyYWRlIG1hcmsgc2lnbiwgVSsyMTIyIElTT251bSAtLT4KLTwhRU5USVRZIGFsZWZzeW0gICImIzg1MDE7Ij4gPCEtLSBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjEzNSBORVcgLS0+Ci08IS0tIGFsZWYgc3ltYm9sIGlzIE5PVCB0aGUgc2FtZSBhcyBoZWJyZXcgbGV0dGVyIGFsZWYsCi0gICAgIFUrMDVEMCBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBjb3VsZCBiZSB1c2VkIHRvIGRlcGljdCBib3RoIGNoYXJhY3RlcnMgLS0+Ci0KLTwhLS0gQXJyb3dzIC0tPgotPCFFTlRJVFkgbGFyciAgICAgIiYjODU5MjsiPiA8IS0tIGxlZnR3YXJkcyBhcnJvdywgVSsyMTkwIElTT251bSAtLT4KLTwhRU5USVRZIHVhcnIgICAgICImIzg1OTM7Ij4gPCEtLSB1cHdhcmRzIGFycm93LCBVKzIxOTEgSVNPbnVtLS0+Ci08IUVOVElUWSByYXJyICAgICAiJiM4NTk0OyI+IDwhLS0gcmlnaHR3YXJkcyBhcnJvdywgVSsyMTkyIElTT251bSAtLT4KLTwhRU5USVRZIGRhcnIgICAgICImIzg1OTU7Ij4gPCEtLSBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0gLS0+Ci08IUVOVElUWSBoYXJyICAgICAiJiM4NTk2OyI+IDwhLS0gbGVmdCByaWdodCBhcnJvdywgVSsyMTk0IElTT2Ftc2EgLS0+Ci08IUVOVElUWSBjcmFyciAgICAiJiM4NjI5OyI+IDwhLS0gZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2FycmlhZ2UgcmV0dXJuLCBVKzIxQjUgTkVXIC0tPgotPCFFTlRJVFkgbEFyciAgICAgIiYjODY1NjsiPiA8IS0tIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGF0IGxBcnIgaXMgdGhlIHNhbWUgYXMgdGhlICdpcyBpbXBsaWVkIGJ5JyBhcnJvdwotICAgIGJ1dCBhbHNvIGRvZXMgbm90IGhhdmUgYW55IG90aGVyIGNoYXJhY3RlciBmb3IgdGhhdCBmdW5jdGlvbi4gU28gPyBsQXJyIGNhbgotICAgIGJlIHVzZWQgZm9yICdpcyBpbXBsaWVkIGJ5JyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgdUFyciAgICAgIiYjODY1NzsiPiA8IS0tIHVwd2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDEgSVNPYW1zYSAtLT4KLTwhRU5USVRZIHJBcnIgICAgICImIzg2NTg7Ij4gPCEtLSByaWdodHdhcmRzIGRvdWJsZSBhcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxRDIgSVNPdGVjaCAtLT4KLTwhLS0gVW5pY29kZSBkb2VzIG5vdCBzYXkgdGhpcyBpcyB0aGUgJ2ltcGxpZXMnIGNoYXJhY3RlciBidXQgZG9lcyBub3QgaGF2ZSAKLSAgICAgYW5vdGhlciBjaGFyYWN0ZXIgd2l0aCB0aGlzIGZ1bmN0aW9uIHNvID8KLSAgICAgckFyciBjYW4gYmUgdXNlZCBmb3IgJ2ltcGxpZXMnIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSBkQXJyICAgICAiJiM4NjU5OyI+IDwhLS0gZG93bndhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQzIElTT2Ftc2EgLS0+Ci08IUVOVElUWSBoQXJyICAgICAiJiM4NjYwOyI+IDwhLS0gbGVmdCByaWdodCBkb3VibGUgYXJyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMUQ0IElTT2Ftc2EgLS0+Ci0KLTwhLS0gTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAtLT4KLTwhRU5USVRZIGZvcmFsbCAgICImIzg3MDQ7Ij4gPCEtLSBmb3IgYWxsLCBVKzIyMDAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHBhcnQgICAgICImIzg3MDY7Ij4gPCEtLSBwYXJ0aWFsIGRpZmZlcmVudGlhbCwgVSsyMjAyIElTT3RlY2ggIC0tPgotPCFFTlRJVFkgZXhpc3QgICAgIiYjODcwNzsiPiA8IS0tIHRoZXJlIGV4aXN0cywgVSsyMjAzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlbXB0eSAgICAiJiM4NzA5OyI+IDwhLS0gZW1wdHkgc2V0ID0gbnVsbCBzZXQgPSBkaWFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMDUgSVNPYW1zbyAtLT4KLTwhRU5USVRZIG5hYmxhICAgICImIzg3MTE7Ij4gPCEtLSBuYWJsYSA9IGJhY2t3YXJkIGRpZmZlcmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBpc2luICAgICAiJiM4NzEyOyI+IDwhLS0gZWxlbWVudCBvZiwgVSsyMjA4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBub3RpbiAgICAiJiM4NzEzOyI+IDwhLS0gbm90IGFuIGVsZW1lbnQgb2YsIFUrMjIwOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbmkgICAgICAgIiYjODcxNTsiPiA8IS0tIGNvbnRhaW5zIGFzIG1lbWJlciwgVSsyMjBCIElTT3RlY2ggLS0+Ci08IS0tIHNob3VsZCB0aGVyZSBiZSBhIG1vcmUgbWVtb3JhYmxlIG5hbWUgdGhhbiAnbmknPyAtLT4KLTwhRU5USVRZIHByb2QgICAgICImIzg3MTk7Ij4gPCEtLSBuLWFyeSBwcm9kdWN0ID0gcHJvZHVjdCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwRiBJU09hbXNiIC0tPgotPCEtLSBwcm9kIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EwICdncmVlayBjYXBpdGFsIGxldHRlciBwaScgdGhvdWdoCi0gICAgIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBzdW0gICAgICAiJiM4NzIxOyI+IDwhLS0gbi1hcnkgc3VtYXRpb24sIFUrMjIxMSBJU09hbXNiIC0tPgotPCEtLSBzdW0gaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTMgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hJwotICAgICB0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIG1pbnVzICAgICImIzg3MjI7Ij4gPCEtLSBtaW51cyBzaWduLCBVKzIyMTIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxvd2FzdCAgICImIzg3Mjc7Ij4gPCEtLSBhc3RlcmlzayBvcGVyYXRvciwgVSsyMjE3IElTT3RlY2ggLS0+Ci08IUVOVElUWSByYWRpYyAgICAiJiM4NzMwOyI+IDwhLS0gc3F1YXJlIHJvb3QgPSByYWRpY2FsIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjFBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwcm9wICAgICAiJiM4NzMzOyI+IDwhLS0gcHJvcG9ydGlvbmFsIHRvLCBVKzIyMUQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGluZmluICAgICImIzg3MzQ7Ij4gPCEtLSBpbmZpbml0eSwgVSsyMjFFIElTT3RlY2ggLS0+Ci08IUVOVElUWSBhbmcgICAgICAiJiM4NzM2OyI+IDwhLS0gYW5nbGUsIFUrMjIyMCBJU09hbXNvIC0tPgotPCFFTlRJVFkgYW5kICAgICAgIiYjODc0MzsiPiA8IS0tIGxvZ2ljYWwgYW5kID0gd2VkZ2UsIFUrMjIyNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3IgICAgICAgIiYjODc0NDsiPiA8IS0tIGxvZ2ljYWwgb3IgPSB2ZWUsIFUrMjIyOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgY2FwICAgICAgIiYjODc0NTsiPiA8IS0tIGludGVyc2VjdGlvbiA9IGNhcCwgVSsyMjI5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjdXAgICAgICAiJiM4NzQ2OyI+IDwhLS0gdW5pb24gPSBjdXAsIFUrMjIyQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW50ICAgICAgIiYjODc0NzsiPiA8IS0tIGludGVncmFsLCBVKzIyMkIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHRoZXJlNCAgICImIzg3NTY7Ij4gPCEtLSB0aGVyZWZvcmUsIFUrMjIzNCBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2ltICAgICAgIiYjODc2NDsiPiA8IS0tIHRpbGRlIG9wZXJhdG9yID0gdmFyaWVzIHdpdGggPSBzaW1pbGFyIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIzQyBJU090ZWNoIC0tPgotPCEtLSB0aWxkZSBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIHRoZSB0aWxkZSwgVSswMDdFLAotICAgICBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIHRvIHJlcHJlc2VudCBib3RoICAtLT4KLTwhRU5USVRZIGNvbmcgICAgICImIzg3NzM7Ij4gPCEtLSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvLCBVKzIyNDUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFzeW1wICAgICImIzg3NzY7Ij4gPCEtLSBhbG1vc3QgZXF1YWwgdG8gPSBhc3ltcHRvdGljIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI0OCBJU09hbXNyIC0tPgotPCFFTlRJVFkgbmUgICAgICAgIiYjODgwMDsiPiA8IS0tIG5vdCBlcXVhbCB0bywgVSsyMjYwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlcXVpdiAgICAiJiM4ODAxOyI+IDwhLS0gaWRlbnRpY2FsIHRvLCBVKzIyNjEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxlICAgICAgICImIzg4MDQ7Ij4gPCEtLSBsZXNzLXRoYW4gb3IgZXF1YWwgdG8sIFUrMjI2NCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZ2UgICAgICAgIiYjODgwNTsiPiA8IS0tIGdyZWF0ZXItdGhhbiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNjUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1YiAgICAgICImIzg4MzQ7Ij4gPCEtLSBzdWJzZXQgb2YsIFUrMjI4MiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwICAgICAgIiYjODgzNTsiPiA8IS0tIHN1cGVyc2V0IG9mLCBVKzIyODMgSVNPdGVjaCAtLT4KLTwhLS0gbm90ZSB0aGF0IG5zdXAsICdub3QgYSBzdXBlcnNldCBvZiwgVSsyMjgzJyBpcyBub3QgY292ZXJlZCBieSB0aGUgU3ltYm9sIAotICAgICBmb250IGVuY29kaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIFNob3VsZCBpdCBiZSwgZm9yIHN5bW1ldHJ5PwotICAgICBJdCBpcyBpbiBJU09hbXNuICAtLT4gCi08IUVOVElUWSBuc3ViICAgICAiJiM4ODM2OyI+IDwhLS0gbm90IGEgc3Vic2V0IG9mLCBVKzIyODQgSVNPYW1zbiAtLT4KLTwhRU5USVRZIHN1YmUgICAgICImIzg4Mzg7Ij4gPCEtLSBzdWJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwZSAgICAgIiYjODgzOTsiPiA8IS0tIHN1cGVyc2V0IG9mIG9yIGVxdWFsIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI4NyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3BsdXMgICAgIiYjODg1MzsiPiA8IS0tIGNpcmNsZWQgcGx1cyA9IGRpcmVjdCBzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjk1IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBvdGltZXMgICAiJiM4ODU1OyI+IDwhLS0gY2lyY2xlZCB0aW1lcyA9IHZlY3RvciBwcm9kdWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NyBJU09hbXNiIC0tPgotPCFFTlRJVFkgcGVycCAgICAgIiYjODg2OTsiPiA8IS0tIHVwIHRhY2sgPSBvcnRob2dvbmFsIHRvID0gcGVycGVuZGljdWxhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyQTUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNkb3QgICAgICImIzg5MDE7Ij4gPCEtLSBkb3Qgb3BlcmF0b3IsIFUrMjJDNSBJU09hbXNiIC0tPgotPCEtLSBkb3Qgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwQjcgbWlkZGxlIGRvdCAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCAtLT4KLTwhRU5USVRZIGxjZWlsICAgICImIzg5Njg7Ij4gPCEtLSBsZWZ0IGNlaWxpbmcgPSBhcGwgdXBzdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMDggSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByY2VpbCAgICAiJiM4OTY5OyI+IDwhLS0gcmlnaHQgY2VpbGluZywgVSsyMzA5IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGZsb29yICAgIiYjODk3MDsiPiA8IS0tIGxlZnQgZmxvb3IgPSBhcGwgZG93bnN0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMwQSBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJmbG9vciAgICImIzg5NzE7Ij4gPCEtLSByaWdodCBmbG9vciwgVSsyMzBCIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGFuZyAgICAgIiYjOTAwMTsiPiA8IS0tIGxlZnQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGJyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMjkgSVNPdGVjaCAtLT4KLTwhLS0gbGFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzQyAnbGVzcyB0aGFuJyAKLSAgICAgb3IgVSsyMDM5ICdzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci08IUVOVElUWSByYW5nICAgICAiJiM5MDAyOyI+IDwhLS0gcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGtldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMkEgSVNPdGVjaCAtLT4KLTwhLS0gcmFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzRSAnZ3JlYXRlciB0aGFuJyAKLSAgICAgb3IgVSsyMDNBICdzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotCi08IS0tIEdlb21ldHJpYyBTaGFwZXMgLS0+Ci08IUVOVElUWSBsb3ogICAgICAiJiM5Njc0OyI+IDwhLS0gbG96ZW5nZSwgVSsyNUNBIElTT3B1YiAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgLS0+Ci08IUVOVElUWSBzcGFkZXMgICAiJiM5ODI0OyI+IDwhLS0gYmxhY2sgc3BhZGUgc3VpdCwgVSsyNjYwIElTT3B1YiAtLT4KLTwhLS0gYmxhY2sgaGVyZSBzZWVtcyB0byBtZWFuIGZpbGxlZCBhcyBvcHBvc2VkIHRvIGhvbGxvdyAtLT4KLTwhRU5USVRZIGNsdWJzICAgICImIzk4Mjc7Ij4gPCEtLSBibGFjayBjbHViIHN1aXQgPSBzaGFtcm9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzI2NjMgSVNPcHViIC0tPgotPCFFTlRJVFkgaGVhcnRzICAgIiYjOTgyOTsiPiA8IS0tIGJsYWNrIGhlYXJ0IHN1aXQgPSB2YWxlbnRpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjY1IElTT3B1YiAtLT4KLTwhRU5USVRZIGRpYW1zICAgICImIzk4MzA7Ij4gPCEtLSBibGFjayBkaWFtb25kIHN1aXQsIFUrMjY2NiBJU09wdWIgLS0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLWZyYW1lc2V0LmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtZnJhbWVzZXQuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDNmNzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtZnJhbWVzZXQuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNSArMCwwIEBACi08IS0tCi0gICBFeHRlbnNpYmxlIEhUTUwgdmVyc2lvbiAxLjAgRnJhbWVzZXQgRFRECi0KLSAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgSFRNTCA0LjAgRnJhbWVzZXQgZXhjZXB0IGZvcgotICAgY2hhbmdlcyBkdWUgdG8gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gWE1MIGFuZCBTR01MLgotCi0gICBOYW1lc3BhY2UgPSBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sCi0KLSAgIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBzZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMQotCi0gICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLAotICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0KLSAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOIgotICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQiCi0KLSAgICRSZXZpc2lvbjogMS4xICQKLSAgICREYXRlOiAyMDA3LzA1LzE1IDAyOjQyOjIyICQKLQotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtbGF0MS5lbnQiPgotJUhUTUxsYXQxOwotCi08IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtc3ltYm9sLmVudCI+Ci0lSFRNTHN5bWJvbDsKLQotPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1zcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIj4KLSAgICA8IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0ICJDREFUQSI+Ci0gICAgPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiPgotICAgIDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTk1UT0tFTiI+Ci0gICAgPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcmFjdGVyICJDREFUQSI+Ci0gICAgPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotCi08IUVOVElUWSAlIE51bWJlciAiQ0RBVEEiPgotICAgIDwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIC0tPgotCi08IUVOVElUWSAlIExpbmtUeXBlcyAiQ0RBVEEiPgotICAgIDwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIj4KLSAgICA8IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIj4KLSAgICA8IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1JGQzIzOTZdIC0tPgotCi08IUVOVElUWSAlIFVyaUxpc3QgIkNEQVRBIj4KLSAgICA8IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAtLT4KLQotPCFFTlRJVFkgJSBEYXRldGltZSAiQ0RBVEEiPgotICAgIDwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi08IUVOVElUWSAlIFNjcmlwdCAiQ0RBVEEiPgotICAgIDwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiPgotICAgIDwhLS0gc3R5bGUgc2hlZXQgZGF0YSAtLT4KLQotPCFFTlRJVFkgJSBUZXh0ICJDREFUQSI+Ci0gICAgPCEtLSB1c2VkIGZvciB0aXRsZXMgZXRjLiAtLT4KLQotPCFFTlRJVFkgJSBGcmFtZVRhcmdldCAiTk1UT0tFTiI+Ci0gICAgPCEtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLT4KLQotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIj4KLSAgICA8IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aCAiQ0RBVEEiPgotICAgIDwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgTXVsdGlMZW5ndGggLS0+Ci0KLTwhRU5USVRZICUgUGl4ZWxzICJDREFUQSI+Ci0gICAgPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotCi08IS0tIHRoZXNlIGFyZSB1c2VkIGZvciBpbWFnZSBtYXBzIC0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci0KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tPgotCi08IS0tIHVzZWQgZm9yIG9iamVjdCwgYXBwbGV0LCBpbWcsIGlucHV0IGFuZCBpZnJhbWUgLS0+Ci08IUVOVElUWSAlIEltZ0FsaWduICIodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkiPgotCi08IS0tIGEgY29sb3IgdXNpbmcgc1JHQjogI1JSR0dCQiBhcyBIZXggdmFsdWVzIC0tPgotPCFFTlRJVFkgJSBDb2xvciAiQ0RBVEEiPgotCi08IS0tIFRoZXJlIGFyZSBhbHNvIDE2IHdpZGVseSBrbm93biBjb2xvciBuYW1lcyB3aXRoIHRoZWlyIHNSR0IgdmFsdWVzOgotCi0gICAgQmxhY2sgID0gIzAwMDAwMCAgICBHcmVlbiAgPSAjMDA4MDAwCi0gICAgU2lsdmVyID0gI0MwQzBDMCAgICBMaW1lICAgPSAjMDBGRjAwCi0gICAgR3JheSAgID0gIzgwODA4MCAgICBPbGl2ZSAgPSAjODA4MDAwCi0gICAgV2hpdGUgID0gI0ZGRkZGRiAgICBZZWxsb3cgPSAjRkZGRjAwCi0gICAgTWFyb29uID0gIzgwMDAwMCAgICBOYXZ5ICAgPSAjMDAwMDgwCi0gICAgUmVkICAgID0gI0ZGMDAwMCAgICBCbHVlICAgPSAjMDAwMEZGCi0gICAgUHVycGxlID0gIzgwMDA4MCAgICBUZWFsICAgPSAjMDA4MDgwCi0gICAgRnVjaHNpYT0gI0ZGMDBGRiAgICBBcXVhICAgPSAjMDBGRkZGCi0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gR2VuZXJpYyBBdHRyaWJ1dGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb3JlIGF0dHJpYnV0ZXMgY29tbW9uIHRvIG1vc3QgZWxlbWVudHMKLSAgaWQgICAgICAgZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQKLSAgY2xhc3MgICAgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcwotICBzdHlsZSAgICBhc3NvY2lhdGVkIHN0eWxlIGluZm8KLSAgdGl0bGUgICAgYWR2aXNvcnkgdGl0bGUvYW1wbGlmaWNhdGlvbgotLS0+Ci08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGludGVybmF0aW9uYWxpemF0aW9uIGF0dHJpYnV0ZXMKLSAgbGFuZyAgICAgICAgbGFuZ3VhZ2UgY29kZSAoYmFja3dhcmRzIGNvbXBhdGlibGUpCi0gIHhtbDpsYW5nICAgIGxhbmd1YWdlIGNvZGUgKGFzIHBlciBYTUwgMS4wIHNwZWMpCi0gIGRpciAgICAgICAgIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQKLS0tPgotPCFFTlRJVFkgJSBpMThuCi0gImxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gYXR0cmlidXRlcyBmb3IgY29tbW9uIFVJIGV2ZW50cwotICBvbmNsaWNrICAgICBhIHBvaW50ZXIgYnV0dG9uIHdhcyBjbGlja2VkCi0gIG9uZGJsY2xpY2sgIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkCi0gIG9ubW91c2Vkb3duIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93bgotICBvbm1vdXNldXAgICBhIHBvaW50ZXIgYnV0dG9uIHdhcyByZWxlYXNlZAotICBvbm1vdXNlbW92ZSBhIHBvaW50ZXIgd2FzIG1vdmVkIG9udG8gdGhlIGVsZW1lbnQKLSAgb25tb3VzZW91dCAgYSBwb2ludGVyIHdhcyBtb3ZlZCBhd2F5IGZyb20gdGhlIGVsZW1lbnQKLSAgb25rZXlwcmVzcyAgYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkCi0gIG9ua2V5ZG93biAgIGEga2V5IHdhcyBwcmVzc2VkIGRvd24KLSAgb25rZXl1cCAgICAgYSBrZXkgd2FzIHJlbGVhc2VkCi0tLT4KLTwhRU5USVRZICUgZXZlbnRzCi0gIm9uY2xpY2sgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uZGJsY2xpY2sgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2Vkb3duICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2V1cCAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2VvdmVyICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2Vtb3ZlICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2VvdXQgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5cHJlc3MgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gYXR0cmlidXRlcyBmb3IgZWxlbWVudHMgdGhhdCBjYW4gZ2V0IHRoZSBmb2N1cwotICBhY2Nlc3NrZXkgICBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIKLSAgdGFiaW5kZXggICAgcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlcgotICBvbmZvY3VzICAgICB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzCi0gIG9uYmx1ciAgICAgIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzCi0tLT4KLTwhRU5USVRZICUgZm9jdXMKLSAiYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCFFTlRJVFkgJSBhdHRycyAiJWNvcmVhdHRyczsgJWkxOG47ICVldmVudHM7Ij4KLQotPCEtLSB0ZXh0IGFsaWdubWVudCBmb3IgcCwgZGl2LCBoMS1oNi4gVGhlIGRlZmF1bHQgaXMKLSAgICAgYWxpZ249ImxlZnQiIGZvciBsdHIgaGVhZGluZ3MsICJyaWdodCIgZm9yIHJ0bCAtLT4KLQotPCFFTlRJVFkgJSBUZXh0QWxpZ24gImFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJiciB8IHNwYW4gfCBiZG8gfG9iamVjdCB8IGFwcGxldCB8IGltZyB8IG1hcCB8IGlmcmFtZSI+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlICJ0dCB8IGkgfCBiIHwgYmlnIHwgc21hbGwgfCB1Ci0gICAgICAgICAgICAgICAgICAgICAgfCBzIHwgc3RyaWtlIHxmb250IHwgYmFzZWZvbnQiPgotCi08IUVOVElUWSAlIHBocmFzZSAiZW0gfCBzdHJvbmcgfCBkZm4gfCBjb2RlIHwgcSB8IHN1YiB8IHN1cCB8Ci0gICAgICAgICAgICAgICAgICAgc2FtcCB8IGtiZCB8IHZhciB8IGNpdGUgfCBhYmJyIHwgYWNyb255bSI+Ci0KLTwhRU5USVRZICUgaW5saW5lLmZvcm1zICJpbnB1dCB8IHNlbGVjdCB8IHRleHRhcmVhIHwgbGFiZWwgfCBidXR0b24iPgotCi08IS0tIHRoZXNlIGNhbiBvY2N1ciBhdCBibG9jayBvciBpbmxpbmUgbGV2ZWwgLS0+Ci08IUVOVElUWSAlIG1pc2MgImlucyB8IGRlbCB8IHNjcmlwdCB8IG5vc2NyaXB0Ij4KLQotPCFFTlRJVFkgJSBpbmxpbmUgImEgfCAlc3BlY2lhbDsgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczsiPgotCi08IS0tICVJbmxpbmU7IGNvdmVycyBpbmxpbmUgb3IgInRleHQtbGV2ZWwiIGVsZW1lbnRzIC0tPgotPCFFTlRJVFkgJSBJbmxpbmUgIigjUENEQVRBIHwgJWlubGluZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQmxvY2sgbGV2ZWwgZWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiaDF8aDJ8aDN8aDR8aDV8aDYiPgotPCFFTlRJVFkgJSBsaXN0cyAidWwgfCBvbCB8IGRsIHwgbWVudSB8IGRpciI+Ci08IUVOVElUWSAlIGJsb2NrdGV4dCAicHJlIHwgaHIgfCBibG9ja3F1b3RlIHwgYWRkcmVzcyB8IGNlbnRlciI+Ci0KLTwhRU5USVRZICUgYmxvY2sKLSAgICAicCB8ICVoZWFkaW5nOyB8IGRpdiB8ICVsaXN0czsgfCAlYmxvY2t0ZXh0OyB8IGlzaW5kZXggfCBmaWVsZHNldCB8IHRhYmxlIj4KLQotPCFFTlRJVFkgJSBCbG9jayAiKCVibG9jazsgfCBmb3JtIHwgJW1pc2M7KSoiPgotCi08IS0tICVGbG93OyBtaXhlcyBCbG9jayBhbmQgSW5saW5lIGFuZCBpcyB1c2VkIGZvciBsaXN0IGl0ZW1zIGV0Yy4gLS0+Ci08IUVOVElUWSAlIEZsb3cgIigjUENEQVRBIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDb250ZW50IG1vZGVscyBmb3IgZXhjbHVzaW9ucyA9PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBhIGVsZW1lbnRzIHVzZSAlSW5saW5lOyBleGNsdWRpbmcgYSAtLT4KLQotPCFFTlRJVFkgJSBhLmNvbnRlbnQKLSAgICIoI1BDREFUQSB8ICVzcGVjaWFsOyB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOyB8ICVtaXNjOykqIj4KLQotPCEtLSBwcmUgdXNlcyAlSW5saW5lIGV4Y2x1ZGluZyBpbWcsIG9iamVjdCwgYXBwbGV0LCBiaWcsIHNtYWxsLAotICAgICBzdWIsIHN1cCwgZm9udCwgb3IgYmFzZWZvbnQgLS0+Ci0KLTwhRU5USVRZICUgcHJlLmNvbnRlbnQKLSAgICIoI1BDREFUQSB8IGEgfCBiciB8IHNwYW4gfCBiZG8gfCBtYXAgfCB0dCB8IGkgfCBiIHwgdSB8IHMgfAotICAgICAgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOykqIj4KLQotPCEtLSBmb3JtIHVzZXMgJUZsb3c7IGV4Y2x1ZGluZyBmb3JtIC0tPgotCi08IUVOVElUWSAlIGZvcm0uY29udGVudCAiKCNQQ0RBVEEgfCAlYmxvY2s7IHwgJWlubGluZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS0gYnV0dG9uIHVzZXMgJUZsb3c7IGJ1dCBleGNsdWRlcyBhLCBmb3JtLCBmb3JtIGNvbnRyb2xzLCBpZnJhbWUgLS0+Ci0KLTwhRU5USVRZICUgYnV0dG9uLmNvbnRlbnQKLSAgICIoI1BDREFUQSB8IHAgfCAlaGVhZGluZzsgfCBkaXYgfCAlbGlzdHM7IHwgJWJsb2NrdGV4dDsgfAotICAgICAgdGFibGUgfCBiciB8IHNwYW4gfCBiZG8gfCBvYmplY3QgfCBhcHBsZXQgfCBpbWcgfCBtYXAgfAotICAgICAgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVtaXNjOykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSB0aGUgbmFtZXNwYWNlIFVSSSBkZXNpZ25hdGVzIHRoZSBkb2N1bWVudCBwcm9maWxlIC0tPgotCi08IUVMRU1FTlQgaHRtbCAoaGVhZCwgZnJhbWVzZXQpPgotPCFBVFRMSVNUIGh0bWwKLSAgJWkxOG47Ci0gIHhtbG5zICAgICAgICVVUkk7ICAgICAgICAgICNGSVhFRCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGhlYWQubWlzYyAiKHNjcmlwdHxzdHlsZXxtZXRhfGxpbmt8b2JqZWN0fGlzaW5kZXgpKiI+Ci0KLTwhLS0gY29udGVudCBtb2RlbCBpcyAlaGVhZC5taXNjOyBjb21iaW5lZCB3aXRoIGEgc2luZ2xlCi0gICAgIHRpdGxlIGFuZCBhbiBvcHRpb25hbCBiYXNlIGVsZW1lbnQgaW4gYW55IG9yZGVyIC0tPgotCi08IUVMRU1FTlQgaGVhZCAoJWhlYWQubWlzYzssCi0gICAgICgodGl0bGUsICVoZWFkLm1pc2M7LCAoYmFzZSwgJWhlYWQubWlzYzspPykgfAotICAgICAgKGJhc2UsICVoZWFkLm1pc2M7LCAodGl0bGUsICVoZWFkLm1pc2M7KSkpKT4KLQotPCFBVFRMSVNUIGhlYWQKLSAgJWkxOG47Ci0gIHByb2ZpbGUgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBUaGUgdGl0bGUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0gICAgLS0+Ci08IUVMRU1FTlQgdGl0bGUgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHRpdGxlICVpMThuOz4KLQotPCEtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLQotPCFFTEVNRU5UIGJhc2UgRU1QVFk+Ci08IUFUVExJU1QgYmFzZQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS0gZ2VuZXJpYyBtZXRhaW5mb3JtYXRpb24gLS0+Ci08IUVMRU1FTlQgbWV0YSBFTVBUWT4KLTwhQVRUTElTVCBtZXRhCi0gICVpMThuOwotICBodHRwLWVxdWl2ICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjb250ZW50ICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgc2NoZW1lICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMgd2hlbiB1c2VkCi0gICAgICB3aXRoIHRoZSBsaW5rIGVsZW1lbnQgaW4gZG9jdW1lbnQgaGVhZCBlLmcuCi0gICAgICAgIHN0YXJ0LCBjb250ZW50cywgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPSJzdHlsZXNoZWV0IikKLSAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9InNjcmlwdCIpCi0gICBkKSBieSBzdHlsZXNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZgotICAgICAgaHRtbCBub2RlcyBhcmUgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBlLmcuIGEgUG9zdFNjcmlwdCBvciBQREYgdmVyc2lvbiAocmVsPSJhbHRlcm5hdGUiIG1lZGlhPSJwcmludCIpCi0tLT4KLQotPCFFTEVNRU5UIGxpbmsgRU1QVFk+Ci08IUFUVExJU1QgbGluawotICAlYXR0cnM7Ci0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVECi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLSBzdHlsZSBpbmZvLCB3aGljaCBtYXkgaW5jbHVkZSBDREFUQSBzZWN0aW9ucyAtLT4KLTwhRUxFTUVOVCBzdHlsZSAoI1BDREFUQSk+Ci08IUFUVExJU1Qgc3R5bGUKLSAgJWkxOG47Ci0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRAotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB4bWw6c3BhY2UgICAocHJlc2VydmUpICAgICAjRklYRUQgJ3ByZXNlcnZlJwotICA+Ci0KLTwhLS0gc2NyaXB0IHN0YXRlbWVudHMsIHdoaWNoIG1heSBpbmNsdWRlIENEQVRBIHNlY3Rpb25zIC0tPgotPCFFTEVNRU5UIHNjcmlwdCAoI1BDREFUQSk+Ci08IUFUVExJU1Qgc2NyaXB0Ci0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRAotICBsYW5ndWFnZSAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkZWZlciAgICAgICAoZGVmZXIpICAgICAgICAjSU1QTElFRAotICB4bWw6c3BhY2UgICAocHJlc2VydmUpICAgICAjRklYRUQgJ3ByZXNlcnZlJwotICA+Ci0KLTwhLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gc2NyaXB0LWJhc2VkIHJlbmRlcmluZyAtLT4KLQotPCFFTEVNRU5UIG5vc2NyaXB0ICVGbG93Oz4KLTwhQVRUTElTVCBub3NjcmlwdAotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IEZyYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBvbmx5IG9uZSBub2ZyYW1lcyBlbGVtZW50IHBlcm1pdHRlZCBwZXIgZG9jdW1lbnQgLS0+Ci0KLTwhRUxFTUVOVCBmcmFtZXNldCAoZnJhbWVzZXR8ZnJhbWV8bm9mcmFtZXMpKj4KLTwhQVRUTElTVCBmcmFtZXNldAotICAlY29yZWF0dHJzOwotICByb3dzICAgICAgICAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRAotICBjb2xzICAgICAgICAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRAotICBvbmxvYWQgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnVubG9hZCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gcmVzZXJ2ZWQgZnJhbWUgbmFtZXMgc3RhcnQgd2l0aCAiXyIgb3RoZXJ3aXNlIHN0YXJ0cyB3aXRoIGxldHRlciAtLT4KLQotPCEtLSB0aWxlZCB3aW5kb3cgd2l0aGluIGZyYW1lc2V0IC0tPgotCi08IUVMRU1FTlQgZnJhbWUgRU1QVFk+Ci08IUFUVExJU1QgZnJhbWUKLSAgJWNvcmVhdHRyczsKLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZnJhbWVib3JkZXIgKDF8MCkgICAgICAgICAgIjEiCi0gIG1hcmdpbndpZHRoICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAgICAgICNJTVBMSUVECi0gIG5vcmVzaXplICAgIChub3Jlc2l6ZSkgICAgICNJTVBMSUVECi0gIHNjcm9sbGluZyAgICh5ZXN8bm98YXV0bykgICJhdXRvIgotICA+Ci0KLTwhLS0gaW5saW5lIHN1YndpbmRvdyAtLT4KLQotPCFFTEVNRU5UIGlmcmFtZSAlRmxvdzs+Ci08IUFUVExJU1QgaWZyYW1lCi0gICVjb3JlYXR0cnM7Ci0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgICIxIgotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRAotICBzY3JvbGxpbmcgICAoeWVzfG5vfGF1dG8pICAiYXV0byIKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIGZyYW1lLWJhc2VkIHJlbmRlcmluZyAtLT4KLQotPCFFTEVNRU5UIG5vZnJhbWVzIChib2R5KT4KLTwhQVRUTElTVCBub2ZyYW1lcwotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGJvZHkgJUZsb3c7PgotPCFBVFRMSVNUIGJvZHkKLSAgJWF0dHJzOwotICBvbmxvYWQgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnVubG9hZCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBiYWNrZ3JvdW5kICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB0ZXh0ICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBsaW5rICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB2bGluayAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBhbGluayAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBkaXYgJUZsb3c7PiAgPCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBkaXYKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFBhcmFncmFwaHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBwICVJbmxpbmU7PgotPCFBVFRMSVNUIHAKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhlYWRpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgVGhlcmUgYXJlIHNpeCBsZXZlbHMgb2YgaGVhZGluZ3MgZnJvbSBoMSAodGhlIG1vc3QgaW1wb3J0YW50KQotICB0byBoNiAodGhlIGxlYXN0IGltcG9ydGFudCkuCi0tLT4KLQotPCFFTEVNRU5UIGgxICAlSW5saW5lOz4KLTwhQVRUTElTVCBoMQotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGgyICVJbmxpbmU7PgotPCFBVFRMSVNUIGgyCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDMgJUlubGluZTs+Ci08IUFUVExJU1QgaDMKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoNCAlSW5saW5lOz4KLTwhQVRUTElTVCBoNAotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGg1ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg1Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDYgJUlubGluZTs+Ci08IUFUVExJU1QgaDYKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IExpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gVW5vcmRlcmVkIGxpc3QgYnVsbGV0IHN0eWxlcyAtLT4KLQotPCFFTlRJVFkgJSBVTFN0eWxlICIoZGlzY3xzcXVhcmV8Y2lyY2xlKSI+Ci0KLTwhLS0gVW5vcmRlcmVkIGxpc3QgLS0+Ci0KLTwhRUxFTUVOVCB1bCAobGkpKz4KLTwhQVRUTElTVCB1bAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVVTFN0eWxlOyAgICAgI0lNUExJRUQKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gT3JkZXJlZCBsaXN0IG51bWJlcmluZyBzdHlsZQotCi0gICAgMSAgIGFyYWJpYyBudW1iZXJzICAgICAgMSwgMiwgMywgLi4uCi0gICAgYSAgIGxvd2VyIGFscGhhICAgICAgICAgYSwgYiwgYywgLi4uCi0gICAgQSAgIHVwcGVyIGFscGhhICAgICAgICAgQSwgQiwgQywgLi4uCi0gICAgaSAgIGxvd2VyIHJvbWFuICAgICAgICAgaSwgaWksIGlpaSwgLi4uCi0gICAgSSAgIHVwcGVyIHJvbWFuICAgICAgICAgSSwgSUksIElJSSwgLi4uCi0KLSAgICBUaGUgc3R5bGUgaXMgYXBwbGllZCB0byB0aGUgc2VxdWVuY2UgbnVtYmVyIHdoaWNoIGJ5IGRlZmF1bHQKLSAgICBpcyByZXNldCB0byAxIGZvciB0aGUgZmlyc3QgbGlzdCBpdGVtIGluIGFuIG9yZGVyZWQgbGlzdC4KLS0tPgotPCFFTlRJVFkgJSBPTFN0eWxlICJDREFUQSI+Ci0KLTwhLS0gT3JkZXJlZCAobnVtYmVyZWQpIGxpc3QgLS0+Ci0KLTwhRUxFTUVOVCBvbCAobGkpKz4KLTwhQVRUTElTVCBvbAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVPTFN0eWxlOyAgICAgICNJTVBMSUVECi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVECi0gIHN0YXJ0ICAgICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBzaW5nbGUgY29sdW1uIGxpc3QgKERFUFJFQ0FURUQpIC0tPiAKLTwhRUxFTUVOVCBtZW51IChsaSkrPgotPCFBVFRMSVNUIG1lbnUKLSAgJWF0dHJzOwotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBtdWx0aXBsZSBjb2x1bW4gbGlzdCAoREVQUkVDQVRFRCkgLS0+IAotPCFFTEVNRU5UIGRpciAobGkpKz4KLTwhQVRUTElTVCBkaXIKLSAgJWF0dHJzOwotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBMSVN0eWxlIGlzIGNvbnN0cmFpbmVkIHRvOiAiKCVVTFN0eWxlO3wlT0xTdHlsZTspIiAtLT4KLTwhRU5USVRZICUgTElTdHlsZSAiQ0RBVEEiPgotCi08IS0tIGxpc3QgaXRlbSAtLT4KLQotPCFFTEVNRU5UIGxpICVGbG93Oz4KLTwhQVRUTElTVCBsaQotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVMSVN0eWxlOyAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBkZWZpbml0aW9uIGxpc3RzIC0gZHQgZm9yIHRlcm0sIGRkIGZvciBpdHMgZGVmaW5pdGlvbiAtLT4KLQotPCFFTEVNRU5UIGRsIChkdHxkZCkrPgotPCFBVFRMSVNUIGRsCi0gICVhdHRyczsKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZHQgJUlubGluZTs+Ci08IUFUVExJU1QgZHQKLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBkZCAlRmxvdzs+Ci08IUFUVExJU1QgZGQKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEFkZHJlc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gaW5mb3JtYXRpb24gb24gYXV0aG9yIC0tPgotCi08IUVMRU1FTlQgYWRkcmVzcyAlSW5saW5lOz4KLTwhQVRUTElTVCBhZGRyZXNzCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsIFJ1bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgaHIgRU1QVFk+Ci08IUFUVExJU1QgaHIKLSAgJWF0dHJzOwotICBhbGlnbiAgICAgICAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVECi0gIG5vc2hhZGUgICAgIChub3NoYWRlKSAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUHJlZm9ybWF0dGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb250ZW50IGlzICVJbmxpbmU7IGV4Y2x1ZGluZyAKLSAgICAgICAgImltZ3xvYmplY3R8YXBwbGV0fGJpZ3xzbWFsbHxzdWJ8c3VwfGZvbnR8YmFzZWZvbnQiIC0tPgotCi08IUVMRU1FTlQgcHJlICVwcmUuY29udGVudDs+Ci08IUFUVExJU1QgcHJlCi0gICVhdHRyczsKLSAgd2lkdGggICAgICAgJU51bWJlcjsgICAgICAjSU1QTElFRAotICB4bWw6c3BhY2UgICAocHJlc2VydmUpICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQmxvY2stbGlrZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGJsb2NrcXVvdGUgJUZsb3c7PgotPCFBVFRMSVNUIGJsb2NrcXVvdGUKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgYWxpZ25tZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY2VudGVyIGNvbnRlbnQgLS0+Ci08IUVMRU1FTlQgY2VudGVyICVGbG93Oz4KLTwhQVRUTElTVCBjZW50ZXIKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQotPCEtLQotICBpbnMvZGVsIGFyZSBhbGxvd2VkIGluIGJsb2NrIGFuZCBpbmxpbmUgY29udGVudCwgYnV0IGl0cwotICBpbmFwcHJvcHJpYXRlIHRvIGluY2x1ZGUgYmxvY2sgY29udGVudCB3aXRoaW4gYW4gaW5zIGVsZW1lbnQKLSAgb2NjdXJyaW5nIGluIGlubGluZSBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgaW5zICVGbG93Oz4KLTwhQVRUTElTVCBpbnMKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBkZWwgJUZsb3c7PgotPCFBVFRMSVNUIGRlbAotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBUaGUgQW5jaG9yIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb250ZW50IGlzICVJbmxpbmU7IGV4Y2VwdCB0aGF0IGFuY2hvcnMgc2hvdWxkbid0IGJlIG5lc3RlZCAtLT4KLQotPCFFTEVNRU5UIGEgJWEuY29udGVudDs+Ci08IUFUVExJU1QgYQotICAlYXR0cnM7Ci0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgICJyZWN0IgotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT0gSW5saW5lIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBzcGFuICVJbmxpbmU7PiA8IS0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIHNwYW4KLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBiZG8gJUlubGluZTs+ICA8IS0tIEkxOE4gQmlEaSBvdmVyLXJpZGUgLS0+Ci08IUFUVExJU1QgYmRvCi0gICVjb3JlYXR0cnM7Ci0gICVldmVudHM7Ci0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRAotICA+Ci0KLTwhRUxFTUVOVCBiciBFTVBUWT4gICA8IS0tIGZvcmNlZCBsaW5lIGJyZWFrIC0tPgotPCFBVFRMSVNUIGJyCi0gICVjb3JlYXR0cnM7Ci0gIGNsZWFyICAgICAgIChsZWZ0fGFsbHxyaWdodHxub25lKSAibm9uZSIKLSAgPgotCi08IUVMRU1FTlQgZW0gJUlubGluZTs+ICAgPCEtLSBlbXBoYXNpcyAtLT4KLTwhQVRUTElTVCBlbSAlYXR0cnM7PgotCi08IUVMRU1FTlQgc3Ryb25nICVJbmxpbmU7PiAgIDwhLS0gc3Ryb25nIGVtcGhhc2lzIC0tPgotPCFBVFRMSVNUIHN0cm9uZyAlYXR0cnM7PgotCi08IUVMRU1FTlQgZGZuICVJbmxpbmU7PiAgIDwhLS0gZGVmaW5pdGlvbmFsIC0tPgotPCFBVFRMSVNUIGRmbiAlYXR0cnM7PgotCi08IUVMRU1FTlQgY29kZSAlSW5saW5lOz4gICA8IS0tIHByb2dyYW0gY29kZSAtLT4KLTwhQVRUTElTVCBjb2RlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzYW1wICVJbmxpbmU7PiAgIDwhLS0gc2FtcGxlIC0tPgotPCFBVFRMSVNUIHNhbXAgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGtiZCAlSW5saW5lOz4gIDwhLS0gc29tZXRoaW5nIHVzZXIgd291bGQgdHlwZSAtLT4KLTwhQVRUTElTVCBrYmQgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHZhciAlSW5saW5lOz4gICA8IS0tIHZhcmlhYmxlIC0tPgotPCFBVFRMSVNUIHZhciAlYXR0cnM7PgotCi08IUVMRU1FTlQgY2l0ZSAlSW5saW5lOz4gICA8IS0tIGNpdGF0aW9uIC0tPgotPCFBVFRMSVNUIGNpdGUgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGFiYnIgJUlubGluZTs+ICAgPCEtLSBhYmJyZXZpYXRpb24gLS0+Ci08IUFUVExJU1QgYWJiciAlYXR0cnM7PgotCi08IUVMRU1FTlQgYWNyb255bSAlSW5saW5lOz4gICA8IS0tIGFjcm9ueW0gLS0+Ci08IUFUVExJU1QgYWNyb255bSAlYXR0cnM7PgotCi08IUVMRU1FTlQgcSAlSW5saW5lOz4gICA8IS0tIGlubGluZWQgcXVvdGUgLS0+Ci08IUFUVExJU1QgcQotICAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICAgPgotCi08IUVMRU1FTlQgc3ViICVJbmxpbmU7PiA8IS0tIHN1YnNjcmlwdCAtLT4KLTwhQVRUTElTVCBzdWIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN1cCAlSW5saW5lOz4gPCEtLSBzdXBlcnNjcmlwdCAtLT4KLTwhQVRUTElTVCBzdXAgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHR0ICVJbmxpbmU7PiAgIDwhLS0gZml4ZWQgcGl0Y2ggZm9udCAtLT4KLTwhQVRUTElTVCB0dCAlYXR0cnM7PgotCi08IUVMRU1FTlQgaSAlSW5saW5lOz4gICA8IS0tIGl0YWxpYyBmb250IC0tPgotPCFBVFRMSVNUIGkgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGIgJUlubGluZTs+ICAgPCEtLSBib2xkIGZvbnQgLS0+Ci08IUFUVExJU1QgYiAlYXR0cnM7PgotCi08IUVMRU1FTlQgYmlnICVJbmxpbmU7PiAgIDwhLS0gYmlnZ2VyIGZvbnQgLS0+Ci08IUFUVExJU1QgYmlnICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzbWFsbCAlSW5saW5lOz4gICA8IS0tIHNtYWxsZXIgZm9udCAtLT4KLTwhQVRUTElTVCBzbWFsbCAlYXR0cnM7PgotCi08IUVMRU1FTlQgdSAlSW5saW5lOz4gICA8IS0tIHVuZGVybGluZSAtLT4KLTwhQVRUTElTVCB1ICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzICVJbmxpbmU7PiAgIDwhLS0gc3RyaWtlLXRocm91Z2ggLS0+Ci08IUFUVExJU1QgcyAlYXR0cnM7PgotCi08IUVMRU1FTlQgc3RyaWtlICVJbmxpbmU7PiAgIDwhLS0gc3RyaWtlLXRocm91Z2ggLS0+Ci08IUFUVExJU1Qgc3RyaWtlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiYXNlZm9udCBFTVBUWT4gIDwhLS0gYmFzZSBmb250IHNpemUgLS0+Ci08IUFUVExJU1QgYmFzZWZvbnQKLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gIGNvbG9yICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIGZhY2UgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGZvbnQgJUlubGluZTs+IDwhLS0gbG9jYWwgY2hhbmdlIHRvIGZvbnQgLS0+Ci08IUFUVExJU1QgZm9udAotICAlY29yZWF0dHJzOwotICAlaTE4bjsKLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT2JqZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIG9iamVjdCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzLgotICBwYXJhbSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBQYXJhbWV0ZXJzCi0gIGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBhcyBhdHRyaWJ1dGUvdmFsdWUgcGFpcnMgb24gdGhlCi0gIG9iamVjdCBlbGVtZW50IGl0c2VsZiB3aGVuIGJyZXZpdHkgaXMgZGVzaXJlZC4KLS0tPgotCi08IUVMRU1FTlQgb2JqZWN0ICgjUENEQVRBIHwgcGFyYW0gfCAlYmxvY2s7IHwgZm9ybSB8JWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBvYmplY3QKLSAgJWF0dHJzOwotICBkZWNsYXJlICAgICAoZGVjbGFyZSkgICAgICAjSU1QTElFRAotICBjbGFzc2lkICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBjb2RlYmFzZSAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRhICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBjb2RldHlwZSAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBhcmNoaXZlICAgICAlVXJpTGlzdDsgICAgICAjSU1QTElFRAotICBzdGFuZGJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgcGFyYW0gaXMgdXNlZCB0byBzdXBwbHkgYSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZS4KLSAgSW4gWE1MIGl0IHdvdWxkIHNlZW0gbmF0dXJhbCB0byBmb2xsb3cgUkRGIGFuZCBzdXBwb3J0IGFuCi0gIGFiYnJldmlhdGVkIHN5bnRheCB3aGVyZSB0aGUgcGFyYW0gZWxlbWVudHMgYXJlIHJlcGxhY2VkCi0gIGJ5IGF0dHJpYnV0ZSB2YWx1ZSBwYWlycyBvbiB0aGUgb2JqZWN0IHN0YXJ0IHRhZy4KLS0tPgotPCFFTEVNRU5UIHBhcmFtIEVNUFRZPgotPCFBVFRMSVNUIHBhcmFtCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZXR5cGUgICAoZGF0YXxyZWZ8b2JqZWN0KSAiZGF0YSIKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBKYXZhIGFwcGxldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9uZSBvZiBjb2RlIG9yIG9iamVjdCBhdHRyaWJ1dGVzIG11c3QgYmUgcHJlc2VudC4KLSAgUGxhY2UgcGFyYW0gZWxlbWVudHMgYmVmb3JlIG90aGVyIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBhcHBsZXQgKCNQQ0RBVEEgfCBwYXJhbSB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBhcHBsZXQKLSAgJWNvcmVhdHRyczsKLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgYXJjaGl2ZSAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY29kZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgb2JqZWN0ICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI1JFUVVJUkVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgIFRvIGF2b2lkIGFjY2Vzc2liaWxpdHkgcHJvYmxlbXMgZm9yIHBlb3BsZSB3aG8gYXJlbid0Ci0gICBhYmxlIHRvIHNlZSB0aGUgaW1hZ2UsIHlvdSBzaG91bGQgcHJvdmlkZSBhIHRleHQKLSAgIGRlc2NyaXB0aW9uIHVzaW5nIHRoZSBhbHQgYW5kIGxvbmdkZXNjIGF0dHJpYnV0ZXMuCi0gICBJbiBhZGRpdGlvbiwgYXZvaWQgdGhlIHVzZSBvZiBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzLgotLS0+Ci0KLTwhRUxFTUVOVCBpbWcgRU1QVFk+Ci08IUFUVExJU1QgaW1nCi0gICVhdHRyczsKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVECi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gdXNlbWFwIHBvaW50cyB0byBhIG1hcCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBtYXAgKCglYmxvY2s7IHwgZm9ybSB8ICVtaXNjOykrIHwgYXJlYSspPgotPCFBVFRMSVNUIG1hcAotICAlaTE4bjsKLSAgJWV2ZW50czsKLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI1JFUVVJUkVECi0gIGNsYXNzICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHN0eWxlICAgICAgICVTdHlsZVNoZWV0OyAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGFyZWEgRU1QVFk+Ci08IUFUVExJU1QgYXJlYQotICAlYXR0cnM7Ci0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgICJyZWN0IgotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBub2hyZWYgICAgICAobm9ocmVmKSAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBGb3JtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgZm9ybSAlZm9ybS5jb250ZW50Oz4gICA8IS0tIGZvcm1zIHNob3VsZG4ndCBiZSBuZXN0ZWQgLS0+Ci0KLTwhQVRUTElTVCBmb3JtCi0gICVhdHRyczsKLSAgYWN0aW9uICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVECi0gIG1ldGhvZCAgICAgIChnZXR8cG9zdCkgICAgICJnZXQiCi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIGVuY3R5cGUgICAgICVDb250ZW50VHlwZTsgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gIG9uc3VibWl0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ucmVzZXQgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVECi0gIGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZAotICBMYWJlbCBlbGVtZW50cyBzaG91bGRuJ3QgYmUgbmVzdGVkLgotLS0+Ci08IUVMRU1FTlQgbGFiZWwgJUlubGluZTs+Ci08IUFUVExJU1QgbGFiZWwKLSAgJWF0dHJzOwotICBmb3IgICAgICAgICBJRFJFRiAgICAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICIodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfAotICAgIHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotICAgIGZpbGUgfCBoaWRkZW4gfCBpbWFnZSB8IGJ1dHRvbikiCi0gICA+Ci0KLTwhLS0gdGhlIG5hbWUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCAmIHJlc2V0IC0tPgotCi08IUVMRU1FTlQgaW5wdXQgRU1QVFk+ICAgICA8IS0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBpbnB1dAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVJbnB1dFR5cGU7ICAgICJ0ZXh0IgotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjaGVja2VkICAgICAoY2hlY2tlZCkgICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBtYXhsZW5ndGggICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBzZWxlY3QgKG9wdGdyb3VwfG9wdGlvbikrPiAgPCEtLSBvcHRpb24gc2VsZWN0b3IgLS0+Ci08IUFUVExJU1Qgc2VsZWN0Ci0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgbXVsdGlwbGUgICAgKG11bHRpcGxlKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgb3B0Z3JvdXAgKG9wdGlvbikrPiAgIDwhLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIG9wdGdyb3VwCi0gICVhdHRyczsKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIG9wdGlvbiAoI1BDREFUQSk+ICAgICA8IS0tIHNlbGVjdGFibGUgY2hvaWNlIC0tPgotPCFBVFRMSVNUIG9wdGlvbgotICAlYXR0cnM7Ci0gIHNlbGVjdGVkICAgIChzZWxlY3RlZCkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHRleHRhcmVhICgjUENEQVRBKT4gICAgIDwhLS0gbXVsdGktbGluZSB0ZXh0IGZpZWxkIC0tPgotPCFBVFRMSVNUIHRleHRhcmVhCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgJU51bWJlcjsgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgICVOdW1iZXI7ICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgVGhlIGZpZWxkc2V0IGVsZW1lbnQgaXMgdXNlZCB0byBncm91cCBmb3JtIGZpZWxkcy4KLSAgT25seSBvbmUgbGVnZW5kIGVsZW1lbnQgc2hvdWxkIG9jY3VyIGluIHRoZSBjb250ZW50Ci0gIGFuZCBpZiBwcmVzZW50IHNob3VsZCBvbmx5IGJlIHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UuCi0tLT4KLTwhRUxFTUVOVCBmaWVsZHNldCAoI1BDREFUQSB8IGxlZ2VuZCB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBmaWVsZHNldAotICAlYXR0cnM7Ci0gID4KLQotPCFFTlRJVFkgJSBMQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFFTEVNRU5UIGxlZ2VuZCAlSW5saW5lOz4gICAgIDwhLS0gZmllbGRzZXQgbGFiZWwgLS0+Ci08IUFUVExJU1QgbGVnZW5kCi0gICVhdHRyczsKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUxBbGlnbjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gQ29udGVudCBpcyAlRmxvdzsgZXhjbHVkaW5nIGEsIGZvcm0sIGZvcm0gY29udHJvbHMsIGlmcmFtZQotLS0+IAotPCFFTEVNRU5UIGJ1dHRvbiAlYnV0dG9uLmNvbnRlbnQ7PiAgPCEtLSBwdXNoIGJ1dHRvbiAtLT4KLTwhQVRUTElTVCBidXR0b24KLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgInN1Ym1pdCIKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHNpbmdsZS1saW5lIHRleHQgaW5wdXQgY29udHJvbCAoREVQUkVDQVRFRCkgLS0+Ci08IUVMRU1FTlQgaXNpbmRleCBFTVBUWT4KLTwhQVRUTElTVCBpc2luZGV4Ci0gICVjb3JlYXR0cnM7Ci0gICVpMThuOwotICBwcm9tcHQgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBUYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gRGVyaXZlZCBmcm9tIElFVEYgSFRNTCB0YWJsZSBzdGFuZGFyZCwgc2VlIFtSRkMxOTQyXSAtLT4KLQotPCEtLQotIFRoZSBib3JkZXIgYXR0cmlidXRlIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZQotIHRhYmxlLiBUaGUgZGVmYXVsdCB1bml0cyBhcmUgc2NyZWVuIHBpeGVscy4KLQotIFRoZSBmcmFtZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSB2YWxpZ24gYXR0cmlidXRlLgotLS0+Ci08IUVOVElUWSAlIFRGcmFtZSAiKHZvaWR8YWJvdmV8YmVsb3d8aHNpZGVzfGxoc3xyaHN8dnNpZGVzfGJveHxib3JkZXIpIj4KLQotPCEtLQotIFRoZSBydWxlcyBhdHRyaWJ1dGUgZGVmaW5lcyB3aGljaCBydWxlcyB0byBkcmF3IGJldHdlZW4gY2VsbHM6Ci0KLSBJZiBydWxlcyBpcyBhYnNlbnQgdGhlbiBhc3N1bWU6Ci0gICAgICJub25lIiBpZiBib3JkZXIgaXMgYWJzZW50IG9yIGJvcmRlcj0iMCIgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMKLQotICBjaGFyICAgICAgICBhbGlnbm1lbnQgY2hhciwgZS5nLiBjaGFyPSI6IgotICBjaGFyb2ZmICAgICBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyCi0tLT4KLTwhRU5USVRZICUgY2VsbGhhbGlnbgotICAiYWxpZ24gICAgICAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRAotICAgY2hhciAgICAgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICAgY2hhcm9mZiAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsdmFsaWduCi0gICJ2YWxpZ24gICAgICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQiCi0gID4KLQotPCFFTEVNRU5UIHRhYmxlCi0gICAgIChjYXB0aW9uPywgKGNvbCp8Y29sZ3JvdXAqKSwgdGhlYWQ/LCB0Zm9vdD8sICh0Ym9keSt8dHIrKSk+Ci08IUVMRU1FTlQgY2FwdGlvbiAgJUlubGluZTs+Ci08IUVMRU1FTlQgdGhlYWQgICAgKHRyKSs+Ci08IUVMRU1FTlQgdGZvb3QgICAgKHRyKSs+Ci08IUVMRU1FTlQgdGJvZHkgICAgKHRyKSs+Ci08IUVMRU1FTlQgY29sZ3JvdXAgKGNvbCkqPgotPCFFTEVNRU5UIGNvbCAgICAgIEVNUFRZPgotPCFFTEVNRU5UIHRyICAgICAgICh0aHx0ZCkrPgotPCFFTEVNRU5UIHRoICAgICAgICVGbG93Oz4KLTwhRUxFTUVOVCB0ZCAgICAgICAlRmxvdzs+Ci0KLTwhQVRUTElTVCB0YWJsZQotICAlYXR0cnM7Ci0gIHN1bW1hcnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGZyYW1lICAgICAgICVURnJhbWU7ICAgICAgICNJTVBMSUVECi0gIHJ1bGVzICAgICAgICVUUnVsZXM7ICAgICAgICNJTVBMSUVECi0gIGNlbGxzcGFjaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGNlbGxwYWRkaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgICVUQWxpZ247ICAgICAgICNJTVBMSUVECi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTlRJVFkgJSBDQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFBVFRMSVNUIGNhcHRpb24KLSAgJWF0dHJzOwotICBhbGlnbiAgICAgICAlQ0FsaWduOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLWNvbGdyb3VwIGdyb3VwcyBhIHNldCBvZiBjb2wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UgdG8gZ3JvdXAKLXNldmVyYWwgc2VtYW50aWNhbGx5IHJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotPCFBVFRMSVNUIGNvbGdyb3VwCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gY29sIGVsZW1lbnRzIGRlZmluZSB0aGUgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yIGNlbGxzIGluCi0gb25lIG9yIG1vcmUgY29sdW1ucy4KLQotIFRoZSB3aWR0aCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucywgZS5nLgotCi0gICAgIHdpZHRoPTY0ICAgICAgICB3aWR0aCBpbiBzY3JlZW4gcGl4ZWxzCi0gICAgIHdpZHRoPTAuNSogICAgICByZWxhdGl2ZSB3aWR0aCBvZiAwLjUKLQotIFRoZSBzcGFuIGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lCi0gY29sIGVsZW1lbnQgdG8gYXBwbHkgdG8gbW9yZSB0aGFuIG9uZSBjb2x1bW4uCi0tLT4KLTwhQVRUTElTVCBjb2wKLSAgJWF0dHJzOwotICBzcGFuICAgICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhLS0KLSAgICBVc2UgdGhlYWQgdG8gZHVwbGljYXRlIGhlYWRlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgaGVhZGVycyB3aGVuCi0gICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSB0Zm9vdCB0byBkdXBsaWNhdGUgZm9vdGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBmb290ZXJzIHdoZW4KLSAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIG11bHRpcGxlIHRib2R5IHNlY3Rpb25zIHdoZW4gcnVsZXMgYXJlIG5lZWRlZAotICAgIGJldHdlZW4gZ3JvdXBzIG9mIHRhYmxlIHJvd3MuCi0tLT4KLTwhQVRUTElTVCB0aGVhZAotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdGZvb3QKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRib2R5Ci0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0cgotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBoZWFkZXJzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gdGggaXMgZm9yIGhlYWRlcnMsIHRkIGZvciBkYXRhIGFuZCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggLS0+Ci0KLTwhQVRUTElTVCB0aAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhQVRUTElTVCB0ZAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtc3RyaWN0LmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtc3RyaWN0LmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiMTFhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLXN0cmljdC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw5ODggKzAsMCBAQAotPCEtLQotICAgRXh0ZW5zaWJsZSBIVE1MIHZlcnNpb24gMS4wIFN0cmljdCBEVEQKLQotICAgVGhpcyBpcyB0aGUgc2FtZSBhcyBIVE1MIDQuMCBTdHJpY3QgZXhjZXB0IGZvcgotICAgY2hhbmdlcyBkdWUgdG8gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gWE1MIGFuZCBTR01MLgotCi0gICBOYW1lc3BhY2UgPSBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sCi0KLSAgIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBzZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMQotCi0gICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLAotICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0KLSAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCIKLQotICAgJFJldmlzaW9uOiAxLjEgJAotICAgJERhdGU6IDIwMDcvMDUvMTUgMDI6NDI6MjIgJAotCi0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT0gQ2hhcmFjdGVyIG1uZW1vbmljIGVudGl0aWVzID09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1sYXQxLmVudCI+Ci0lSFRNTGxhdDE7Ci0KLTwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1zeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLXNwZWNpYWwuZW50Ij4KLSVIVE1Mc3BlY2lhbDsKLQotPCEtLT09PT09PT09PT09PT09PT09PSBJbXBvcnRlZCBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZSAiQ0RBVEEiPgotICAgIDwhLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMgIkNEQVRBIj4KLSAgICA8IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIj4KLSAgICA8IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXRzICJDREFUQSI+Ci0gICAgPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlICJOTVRPS0VOIj4KLSAgICA8IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIj4KLSAgICA8IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci0KLTwhRU5USVRZICUgTnVtYmVyICJDREFUQSI+Ci0gICAgPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSI+Ci0gICAgPCEtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzIC0tPgotCi08IUVOVElUWSAlIE1lZGlhRGVzYyAiQ0RBVEEiPgotICAgIDwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotCi08IUVOVElUWSAlIFVSSSAiQ0RBVEEiPgotICAgIDwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbUkZDMjM5Nl0gLS0+Ci0KLTwhRU5USVRZICUgVXJpTGlzdCAiQ0RBVEEiPgotICAgIDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSI+Ci0gICAgPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSI+Ci0gICAgPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLQotPCFFTlRJVFkgJSBTdHlsZVNoZWV0ICJDREFUQSI+Ci0gICAgPCEtLSBzdHlsZSBzaGVldCBkYXRhIC0tPgotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLSAgICA8IS0tIHVzZWQgZm9yIHRpdGxlcyBldGMuIC0tPgotCi08IUVOVElUWSAlIEZyYW1lVGFyZ2V0ICJOTVRPS0VOIj4KLSAgICA8IS0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tPgotCi08IUVOVElUWSAlIExlbmd0aCAiQ0RBVEEiPgotICAgIDwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSI+Ci0gICAgPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci0KLTwhRU5USVRZICUgTXVsdGlMZW5ndGhzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBNdWx0aUxlbmd0aCAtLT4KLQotPCFFTlRJVFkgJSBQaXhlbHMgIkNEQVRBIj4KLSAgICA8IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLTwhLS0gdGhlc2UgYXJlIHVzZWQgZm9yIGltYWdlIG1hcHMgLS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLQotPCFFTlRJVFkgJSBDb29yZHMgIkNEQVRBIj4KLSAgICA8IS0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEdlbmVyaWMgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29yZSBhdHRyaWJ1dGVzIGNvbW1vbiB0byBtb3N0IGVsZW1lbnRzCi0gIGlkICAgICAgIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkCi0gIGNsYXNzICAgIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMKLSAgc3R5bGUgICAgYXNzb2NpYXRlZCBzdHlsZSBpbmZvCi0gIHRpdGxlICAgIGFkdmlzb3J5IHRpdGxlL2FtcGxpZmljYXRpb24KLS0tPgotPCFFTlRJVFkgJSBjb3JlYXR0cnMKLSAiaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBpbnRlcm5hdGlvbmFsaXphdGlvbiBhdHRyaWJ1dGVzCi0gIGxhbmcgICAgICAgIGxhbmd1YWdlIGNvZGUgKGJhY2t3YXJkcyBjb21wYXRpYmxlKQotICB4bWw6bGFuZyAgICBsYW5ndWFnZSBjb2RlIChhcyBwZXIgWE1MIDEuMCBzcGVjKQotICBkaXIgICAgICAgICBkaXJlY3Rpb24gZm9yIHdlYWsvbmV1dHJhbCB0ZXh0Ci0tLT4KLTwhRU5USVRZICUgaTE4bgotICJsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGF0dHJpYnV0ZXMgZm9yIGNvbW1vbiBVSSBldmVudHMKLSAgb25jbGljayAgICAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgY2xpY2tlZAotICBvbmRibGNsaWNrICBhIHBvaW50ZXIgYnV0dG9uIHdhcyBkb3VibGUgY2xpY2tlZAotICBvbm1vdXNlZG93biBhIHBvaW50ZXIgYnV0dG9uIHdhcyBwcmVzc2VkIGRvd24KLSAgb25tb3VzZXVwICAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQKLSAgb25tb3VzZW1vdmUgYSBwb2ludGVyIHdhcyBtb3ZlZCBvbnRvIHRoZSBlbGVtZW50Ci0gIG9ubW91c2VvdXQgIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSBmcm9tIHRoZSBlbGVtZW50Ci0gIG9ua2V5cHJlc3MgIGEga2V5IHdhcyBwcmVzc2VkIGFuZCByZWxlYXNlZAotICBvbmtleWRvd24gICBhIGtleSB3YXMgcHJlc3NlZCBkb3duCi0gIG9ua2V5dXAgICAgIGEga2V5IHdhcyByZWxlYXNlZAotLS0+Ci08IUVOVElUWSAlIGV2ZW50cwotICJvbmNsaWNrICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmRibGNsaWNrICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlZG93biAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3ZlciAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3V0ICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleWRvd24gICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXVwICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGF0dHJpYnV0ZXMgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGdldCB0aGUgZm9jdXMKLSAgYWNjZXNza2V5ICAgYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyCi0gIHRhYmluZGV4ICAgIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIKLSAgb25mb2N1cyAgICAgdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cwotICBvbmJsdXIgICAgICB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cwotLS0+Ci08IUVOVElUWSAlIGZvY3VzCi0gImFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgc3BlY2lhbAotICAgImJyIHwgc3BhbiB8IGJkbyB8IG9iamVjdCB8IGltZyB8IG1hcCI+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlICJ0dCB8IGkgfCBiIHwgYmlnIHwgc21hbGwiPgotCi08IUVOVElUWSAlIHBocmFzZSAiZW0gfCBzdHJvbmcgfCBkZm4gfCBjb2RlIHwgcSB8IHN1YiB8IHN1cCB8Ci0gICAgICAgICAgICAgICAgICAgc2FtcCB8IGtiZCB8IHZhciB8IGNpdGUgfCBhYmJyIHwgYWNyb255bSI+Ci0KLTwhRU5USVRZICUgaW5saW5lLmZvcm1zICJpbnB1dCB8IHNlbGVjdCB8IHRleHRhcmVhIHwgbGFiZWwgfCBidXR0b24iPgotCi08IS0tIHRoZXNlIGNhbiBvY2N1ciBhdCBibG9jayBvciBpbmxpbmUgbGV2ZWwgLS0+Ci08IUVOVElUWSAlIG1pc2MgImlucyB8IGRlbCB8IHNjcmlwdCB8IG5vc2NyaXB0Ij4KLQotPCFFTlRJVFkgJSBpbmxpbmUgImEgfCAlc3BlY2lhbDsgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczsiPgotCi08IS0tICVJbmxpbmU7IGNvdmVycyBpbmxpbmUgb3IgInRleHQtbGV2ZWwiIGVsZW1lbnRzIC0tPgotPCFFTlRJVFkgJSBJbmxpbmUgIigjUENEQVRBIHwgJWlubGluZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQmxvY2sgbGV2ZWwgZWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiaDF8aDJ8aDN8aDR8aDV8aDYiPgotPCFFTlRJVFkgJSBsaXN0cyAidWwgfCBvbCB8IGRsIj4KLTwhRU5USVRZICUgYmxvY2t0ZXh0ICJwcmUgfCBociB8IGJsb2NrcXVvdGUgfCBhZGRyZXNzIj4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAicCB8ICVoZWFkaW5nOyB8IGRpdiB8ICVsaXN0czsgfCAlYmxvY2t0ZXh0OyB8IGZpZWxkc2V0IHwgdGFibGUiPgotCi08IUVOVElUWSAlIEJsb2NrICIoJWJsb2NrOyB8IGZvcm0gfCAlbWlzYzspKiI+Ci0KLTwhLS0gJUZsb3c7IG1peGVzIEJsb2NrIGFuZCBJbmxpbmUgYW5kIGlzIHVzZWQgZm9yIGxpc3QgaXRlbXMgZXRjLiAtLT4KLTwhRU5USVRZICUgRmxvdyAiKCNQQ0RBVEEgfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENvbnRlbnQgbW9kZWxzIGZvciBleGNsdXNpb25zID09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGEgZWxlbWVudHMgdXNlICVJbmxpbmU7IGV4Y2x1ZGluZyBhIC0tPgotCi08IUVOVElUWSAlIGEuY29udGVudAotICAgIigjUENEQVRBIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7IHwgJW1pc2M7KSoiPgotCi08IS0tIHByZSB1c2VzICVJbmxpbmUgZXhjbHVkaW5nIGltZywgb2JqZWN0LCBiaWcsIHNtYWxsLCBzdXAgb3Igc3VwIC0tPgotCi08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCBhIHwgYnIgfCBzcGFuIHwgYmRvIHwgbWFwIHwgdHQgfCBpIHwgYiB8Ci0gICAgICAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7KSoiPgotCi08IS0tIGZvcm0gdXNlcyAlQmxvY2s7IGV4Y2x1ZGluZyBmb3JtIC0tPgotCi08IUVOVElUWSAlIGZvcm0uY29udGVudCAiKCVibG9jazsgfCAlbWlzYzspKiI+Ci0KLTwhLS0gYnV0dG9uIHVzZXMgJUZsb3c7IGJ1dCBleGNsdWRlcyBhLCBmb3JtIGFuZCBmb3JtIGNvbnRyb2xzIC0tPgotCi08IUVOVElUWSAlIGJ1dHRvbi5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCBwIHwgJWhlYWRpbmc7IHwgZGl2IHwgJWxpc3RzOyB8ICVibG9ja3RleHQ7IHwKLSAgICB0YWJsZSB8ICVzcGVjaWFsOyB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IFN0cnVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gdGhlIG5hbWVzcGFjZSBVUkkgZGVzaWduYXRlcyB0aGUgZG9jdW1lbnQgcHJvZmlsZSAtLT4KLQotPCFFTEVNRU5UIGh0bWwgKGhlYWQsIGJvZHkpPgotPCFBVFRMSVNUIGh0bWwKLSAgJWkxOG47Ci0gIHhtbG5zICAgICAgICVVUkk7ICAgICAgICAgICNGSVhFRCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGhlYWQubWlzYyAiKHNjcmlwdHxzdHlsZXxtZXRhfGxpbmt8b2JqZWN0KSoiPgotCi08IS0tIGNvbnRlbnQgbW9kZWwgaXMgJWhlYWQubWlzYzsgY29tYmluZWQgd2l0aCBhIHNpbmdsZQotICAgICB0aXRsZSBhbmQgYW4gb3B0aW9uYWwgYmFzZSBlbGVtZW50IGluIGFueSBvcmRlciAtLT4KLQotPCFFTEVNRU5UIGhlYWQgKCVoZWFkLm1pc2M7LAotICAgICAoKHRpdGxlLCAlaGVhZC5taXNjOywgKGJhc2UsICVoZWFkLm1pc2M7KT8pIHwKLSAgICAgIChiYXNlLCAlaGVhZC5taXNjOywgKHRpdGxlLCAlaGVhZC5taXNjOykpKSk+Ci0KLTwhQVRUTElTVCBoZWFkCi0gICVpMThuOwotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gVGhlIHRpdGxlIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotICAgIC0tPgotPCFFTEVNRU5UIHRpdGxlICgjUENEQVRBKT4KLTwhQVRUTElTVCB0aXRsZSAlaTE4bjs+Ci0KLTwhLS0gZG9jdW1lbnQgYmFzZSBVUkkgLS0+Ci0KLTwhRUxFTUVOVCBiYXNlIEVNUFRZPgotPCFBVFRMSVNUIGJhc2UKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFFTEVNRU5UIG1ldGEgRU1QVFk+Ci08IUFUVExJU1QgbWV0YQotICAlaTE4bjsKLSAgaHR0cC1lcXVpdiAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gIHNjaGVtZSAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBSZWxhdGlvbnNoaXAgdmFsdWVzIGNhbiBiZSB1c2VkIGluIHByaW5jaXBsZToKLQotICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgd2l0aCB0aGUgbGluayBlbGVtZW50IGluIGRvY3VtZW50IGhlYWQgZS5nLgotICAgICAgICBzdGFydCwgY29udGVudHMsIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD0ic3R5bGVzaGVldCIpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPSJzY3JpcHQiKQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIFBvc3RTY3JpcHQgb3IgUERGIHZlcnNpb24gKHJlbD0iYWx0ZXJuYXRlIiBtZWRpYT0icHJpbnQiKQotLS0+Ci0KLTwhRUxFTUVOVCBsaW5rIEVNUFRZPgotPCFBVFRMSVNUIGxpbmsKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gc3R5bGUgaW5mbywgd2hpY2ggbWF5IGluY2x1ZGUgQ0RBVEEgc2VjdGlvbnMgLS0+Ci08IUVMRU1FTlQgc3R5bGUgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHN0eWxlCi0gICVpMThuOwotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tIHNjcmlwdCBzdGF0ZW1lbnRzLCB3aGljaCBtYXkgaW5jbHVkZSBDREFUQSBzZWN0aW9ucyAtLT4KLTwhRUxFTUVOVCBzY3JpcHQgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHNjcmlwdAotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci0KLTwhRUxFTUVOVCBub3NjcmlwdCAlQmxvY2s7PgotPCFBVFRMSVNUIG5vc2NyaXB0Ci0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgYm9keSAlQmxvY2s7PgotPCFBVFRMSVNUIGJvZHkKLSAgJWF0dHJzOwotICBvbmxvYWQgICAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRAotICBvbnVubG9hZCAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBkaXYgJUZsb3c7PiAgPCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBkaXYKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFBhcmFncmFwaHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBwICVJbmxpbmU7PgotPCFBVFRMSVNUIHAKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhlYWRpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgVGhlcmUgYXJlIHNpeCBsZXZlbHMgb2YgaGVhZGluZ3MgZnJvbSBoMSAodGhlIG1vc3QgaW1wb3J0YW50KQotICB0byBoNiAodGhlIGxlYXN0IGltcG9ydGFudCkuCi0tLT4KLQotPCFFTEVNRU5UIGgxICAlSW5saW5lOz4KLTwhQVRUTElTVCBoMQotICAgJWF0dHJzOwotICAgPgotCi08IUVMRU1FTlQgaDIgJUlubGluZTs+Ci08IUFUVExJU1QgaDIKLSAgICVhdHRyczsKLSAgID4KLQotPCFFTEVNRU5UIGgzICVJbmxpbmU7PgotPCFBVFRMSVNUIGgzCi0gICAlYXR0cnM7Ci0gICA+Ci0KLTwhRUxFTUVOVCBoNCAlSW5saW5lOz4KLTwhQVRUTElTVCBoNAotICAgJWF0dHJzOwotICAgPgotCi08IUVMRU1FTlQgaDUgJUlubGluZTs+Ci08IUFUVExJU1QgaDUKLSAgICVhdHRyczsKLSAgID4KLQotPCFFTEVNRU5UIGg2ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg2Ci0gICAlYXR0cnM7Ci0gICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IExpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gVW5vcmRlcmVkIGxpc3QgLS0+Ci0KLTwhRUxFTUVOVCB1bCAobGkpKz4KLTwhQVRUTElTVCB1bAotICAlYXR0cnM7Ci0gID4KLQotPCEtLSBPcmRlcmVkIChudW1iZXJlZCkgbGlzdCAtLT4KLQotPCFFTEVNRU5UIG9sIChsaSkrPgotPCFBVFRMSVNUIG9sCi0gICVhdHRyczsKLSAgPgotCi08IS0tIGxpc3QgaXRlbSAtLT4KLQotPCFFTEVNRU5UIGxpICVGbG93Oz4KLTwhQVRUTElTVCBsaQotICAlYXR0cnM7Ci0gID4KLQotPCEtLSBkZWZpbml0aW9uIGxpc3RzIC0gZHQgZm9yIHRlcm0sIGRkIGZvciBpdHMgZGVmaW5pdGlvbiAtLT4KLQotPCFFTEVNRU5UIGRsIChkdHxkZCkrPgotPCFBVFRMSVNUIGRsCi0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgZHQgJUlubGluZTs+Ci08IUFUVExJU1QgZHQKLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBkZCAlRmxvdzs+Ci08IUFUVExJU1QgZGQKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEFkZHJlc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gaW5mb3JtYXRpb24gb24gYXV0aG9yIC0tPgotCi08IUVMRU1FTlQgYWRkcmVzcyAlSW5saW5lOz4KLTwhQVRUTElTVCBhZGRyZXNzCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsIFJ1bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgaHIgRU1QVFk+Ci08IUFUVExJU1QgaHIKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29udGVudCBpcyAlSW5saW5lOyBleGNsdWRpbmcgImltZ3xvYmplY3R8YmlnfHNtYWxsfHN1YnxzdXAiIC0tPgotCi08IUVMRU1FTlQgcHJlICVwcmUuY29udGVudDs+Ci08IUFUVExJU1QgcHJlCi0gICVhdHRyczsKLSAgeG1sOnNwYWNlIChwcmVzZXJ2ZSkgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgYmxvY2txdW90ZSAlQmxvY2s7PgotPCFBVFRMSVNUIGJsb2NrcXVvdGUKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgaW5zL2RlbCBhcmUgYWxsb3dlZCBpbiBibG9jayBhbmQgaW5saW5lIGNvbnRlbnQsIGJ1dCBpdHMKLSAgaW5hcHByb3ByaWF0ZSB0byBpbmNsdWRlIGJsb2NrIGNvbnRlbnQgd2l0aGluIGFuIGlucyBlbGVtZW50Ci0gIG9jY3VycmluZyBpbiBpbmxpbmUgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGlucyAlRmxvdzs+Ci08IUFUVExJU1QgaW5zCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZGVsICVGbG93Oz4KLTwhQVRUTElTVCBkZWwKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29udGVudCBpcyAlSW5saW5lOyBleGNlcHQgdGhhdCBhbmNob3JzIHNob3VsZG4ndCBiZSBuZXN0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBhICVhLmNvbnRlbnQ7PgotPCFBVFRMSVNUIGEKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgc3BhbiAlSW5saW5lOz4gPCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBzcGFuCi0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgYmRvICVJbmxpbmU7PiAgPCEtLSBJMThOIEJpRGkgb3Zlci1yaWRlIC0tPgotPCFBVFRMSVNUIGJkbwotICAlY29yZWF0dHJzOwotICAlZXZlbnRzOwotICBsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjUkVRVUlSRUQKLSAgPgotCi08IUVMRU1FTlQgYnIgRU1QVFk+ICAgPCEtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBicgotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBlbSAlSW5saW5lOz4gICA8IS0tIGVtcGhhc2lzIC0tPgotPCFBVFRMSVNUIGVtICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdHJvbmcgJUlubGluZTs+ICAgPCEtLSBzdHJvbmcgZW1waGFzaXMgLS0+Ci08IUFUVExJU1Qgc3Ryb25nICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBkZm4gJUlubGluZTs+ICAgPCEtLSBkZWZpbml0aW9uYWwgLS0+Ci08IUFUVExJU1QgZGZuICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBjb2RlICVJbmxpbmU7PiAgIDwhLS0gcHJvZ3JhbSBjb2RlIC0tPgotPCFBVFRMSVNUIGNvZGUgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHNhbXAgJUlubGluZTs+ICAgPCEtLSBzYW1wbGUgLS0+Ci08IUFUVExJU1Qgc2FtcCAlYXR0cnM7PgotCi08IUVMRU1FTlQga2JkICVJbmxpbmU7PiAgPCEtLSBzb21ldGhpbmcgdXNlciB3b3VsZCB0eXBlIC0tPgotPCFBVFRMSVNUIGtiZCAlYXR0cnM7PgotCi08IUVMRU1FTlQgdmFyICVJbmxpbmU7PiAgIDwhLS0gdmFyaWFibGUgLS0+Ci08IUFUVExJU1QgdmFyICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBjaXRlICVJbmxpbmU7PiAgIDwhLS0gY2l0YXRpb24gLS0+Ci08IUFUVExJU1QgY2l0ZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgYWJiciAlSW5saW5lOz4gICA8IS0tIGFiYnJldmlhdGlvbiAtLT4KLTwhQVRUTElTVCBhYmJyICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBhY3JvbnltICVJbmxpbmU7PiAgIDwhLS0gYWNyb255bSAtLT4KLTwhQVRUTElTVCBhY3JvbnltICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBxICVJbmxpbmU7PiAgIDwhLS0gaW5saW5lZCBxdW90ZSAtLT4KLTwhQVRUTElTVCBxCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgc3ViICVJbmxpbmU7PiA8IS0tIHN1YnNjcmlwdCAtLT4KLTwhQVRUTElTVCBzdWIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN1cCAlSW5saW5lOz4gPCEtLSBzdXBlcnNjcmlwdCAtLT4KLTwhQVRUTElTVCBzdXAgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHR0ICVJbmxpbmU7PiAgIDwhLS0gZml4ZWQgcGl0Y2ggZm9udCAtLT4KLTwhQVRUTElTVCB0dCAlYXR0cnM7PgotCi08IUVMRU1FTlQgaSAlSW5saW5lOz4gICA8IS0tIGl0YWxpYyBmb250IC0tPgotPCFBVFRMSVNUIGkgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGIgJUlubGluZTs+ICAgPCEtLSBib2xkIGZvbnQgLS0+Ci08IUFUVExJU1QgYiAlYXR0cnM7PgotCi08IUVMRU1FTlQgYmlnICVJbmxpbmU7PiAgIDwhLS0gYmlnZ2VyIGZvbnQgLS0+Ci08IUFUVExJU1QgYmlnICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzbWFsbCAlSW5saW5lOz4gICA8IS0tIHNtYWxsZXIgZm9udCAtLT4KLTwhQVRUTElTVCBzbWFsbCAlYXR0cnM7PgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT2JqZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIG9iamVjdCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzLgotICBwYXJhbSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBQYXJhbWV0ZXJzCi0gIGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBhcyBhdHRyaWJ1dGUvdmFsdWUgcGFpcnMgb24gdGhlCi0gIG9iamVjdCBlbGVtZW50IGl0c2VsZiB3aGVuIGJyZXZpdHkgaXMgZGVzaXJlZC4KLS0tPgotCi08IUVMRU1FTlQgb2JqZWN0ICgjUENEQVRBIHwgcGFyYW0gfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1Qgb2JqZWN0Ci0gICVhdHRyczsKLSAgZGVjbGFyZSAgICAgKGRlY2xhcmUpICAgICAgI0lNUExJRUQKLSAgY2xhc3NpZCAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0YSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgY29kZXR5cGUgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgYXJjaGl2ZSAgICAgJVVyaUxpc3Q7ICAgICAgI0lNUExJRUQKLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIHBhcmFtIGlzIHVzZWQgdG8gc3VwcGx5IGEgbmFtZWQgcHJvcGVydHkgdmFsdWUuCi0gIEluIFhNTCBpdCB3b3VsZCBzZWVtIG5hdHVyYWwgdG8gZm9sbG93IFJERiBhbmQgc3VwcG9ydCBhbgotICBhYmJyZXZpYXRlZCBzeW50YXggd2hlcmUgdGhlIHBhcmFtIGVsZW1lbnRzIGFyZSByZXBsYWNlZAotICBieSBhdHRyaWJ1dGUgdmFsdWUgcGFpcnMgb24gdGhlIG9iamVjdCBzdGFydCB0YWcuCi0tLT4KLTwhRUxFTUVOVCBwYXJhbSBFTVBUWT4KLTwhQVRUTElTVCBwYXJhbQotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZXR5cGUgICAoZGF0YXxyZWZ8b2JqZWN0KSAiZGF0YSIKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICBUbyBhdm9pZCBhY2Nlc3NpYmlsaXR5IHByb2JsZW1zIGZvciBwZW9wbGUgd2hvIGFyZW4ndAotICAgYWJsZSB0byBzZWUgdGhlIGltYWdlLCB5b3Ugc2hvdWxkIHByb3ZpZGUgYSB0ZXh0Ci0gICBkZXNjcmlwdGlvbiB1c2luZyB0aGUgYWx0IGFuZCBsb25nZGVzYyBhdHRyaWJ1dGVzLgotICAgSW4gYWRkaXRpb24sIGF2b2lkIHRoZSB1c2Ugb2Ygc2VydmVyLXNpZGUgaW1hZ2UgbWFwcy4KLSAgIE5vdGUgdGhhdCBpbiB0aGlzIERURCB0aGVyZSBpcyBubyBuYW1lIGF0dHJpYnV0ZS4gVGhhdAotICAgaXMgb25seSBhdmFpbGFibGUgaW4gdGhlIHRyYW5zaXRpb25hbCBhbmQgZnJhbWVzZXQgRFRELgotLS0+Ci0KLTwhRUxFTUVOVCBpbWcgRU1QVFk+Ci08IUFUVExJU1QgaW1nCi0gICVhdHRyczsKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVECi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gdXNlbWFwIHBvaW50cyB0byBhIG1hcCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBtYXAgKCglYmxvY2s7IHwgZm9ybSB8ICVtaXNjOykrIHwgYXJlYSspPgotPCFBVFRMSVNUIG1hcAotICAlaTE4bjsKLSAgJWV2ZW50czsKLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI1JFUVVJUkVECi0gIGNsYXNzICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHN0eWxlICAgICAgICVTdHlsZVNoZWV0OyAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGFyZWEgRU1QVFk+Ci08IUFUVExJU1QgYXJlYQotICAlYXR0cnM7Ci0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgICJyZWN0IgotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBub2hyZWYgICAgICAobm9ocmVmKSAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBGb3JtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTEVNRU5UIGZvcm0gJWZvcm0uY29udGVudDs+ICAgPCEtLSBmb3JtcyBzaG91bGRuJ3QgYmUgbmVzdGVkIC0tPgotCi08IUFUVExJU1QgZm9ybQotICAlYXR0cnM7Ci0gIGFjdGlvbiAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBtZXRob2QgICAgICAoZ2V0fHBvc3QpICAgICAiZ2V0IgotICBlbmN0eXBlICAgICAlQ29udGVudFR5cGU7ICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICBvbnN1Ym1pdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnJlc2V0ICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRAotICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgRWFjaCBsYWJlbCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBPTkUgZmllbGQKLSAgTGFiZWwgZWxlbWVudHMgc2hvdWxkbid0IGJlIG5lc3RlZC4KLS0tPgotPCFFTEVNRU5UIGxhYmVsICVJbmxpbmU7PgotPCFBVFRMSVNUIGxhYmVsCi0gICVhdHRyczsKLSAgZm9yICAgICAgICAgSURSRUYgICAgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIElucHV0VHlwZQotICAiKHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwKLSAgICByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLSAgICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24pIgotICAgPgotCi08IS0tIHRoZSBuYW1lIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldCAtLT4KLQotPCFFTEVNRU5UIGlucHV0IEVNUFRZPiAgICAgPCEtLSBmb3JtIGNvbnRyb2wgLS0+Ci08IUFUVExJU1QgaW5wdXQKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlSW5wdXRUeXBlOyAgICAidGV4dCIKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY2hlY2tlZCAgICAgKGNoZWNrZWQpICAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgbWF4bGVuZ3RoICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgc2VsZWN0IChvcHRncm91cHxvcHRpb24pKz4gIDwhLS0gb3B0aW9uIHNlbGVjdG9yIC0tPgotPCFBVFRMSVNUIHNlbGVjdAotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG11bHRpcGxlICAgIChtdWx0aXBsZSkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIG9wdGdyb3VwIChvcHRpb24pKz4gICA8IS0tIG9wdGlvbiBncm91cCAtLT4KLTwhQVRUTElTVCBvcHRncm91cAotICAlYXR0cnM7Ci0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICA+Ci0KLTwhRUxFTUVOVCBvcHRpb24gKCNQQ0RBVEEpPiAgICAgPCEtLSBzZWxlY3RhYmxlIGNob2ljZSAtLT4KLTwhQVRUTElTVCBvcHRpb24KLSAgJWF0dHJzOwotICBzZWxlY3RlZCAgICAoc2VsZWN0ZWQpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCB0ZXh0YXJlYSAoI1BDREFUQSk+ICAgICA8IS0tIG11bHRpLWxpbmUgdGV4dCBmaWVsZCAtLT4KLTwhQVRUTElTVCB0ZXh0YXJlYQotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHJvd3MgICAgICAgICVOdW1iZXI7ICAgICAgICNSRVFVSVJFRAotICBjb2xzICAgICAgICAlTnVtYmVyOyAgICAgICAjUkVRVUlSRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIFRoZSBmaWVsZHNldCBlbGVtZW50IGlzIHVzZWQgdG8gZ3JvdXAgZm9ybSBmaWVsZHMuCi0gIE9ubHkgb25lIGxlZ2VuZCBlbGVtZW50IHNob3VsZCBvY2N1ciBpbiB0aGUgY29udGVudAotICBhbmQgaWYgcHJlc2VudCBzaG91bGQgb25seSBiZSBwcmVjZWRlZCBieSB3aGl0ZXNwYWNlLgotLS0+Ci08IUVMRU1FTlQgZmllbGRzZXQgKCNQQ0RBVEEgfCBsZWdlbmQgfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1QgZmllbGRzZXQKLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBsZWdlbmQgJUlubGluZTs+ICAgICA8IS0tIGZpZWxkc2V0IGxhYmVsIC0tPgotPCFBVFRMSVNUIGxlZ2VuZAotICAlYXR0cnM7Ci0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotIENvbnRlbnQgaXMgJUZsb3c7IGV4Y2x1ZGluZyBhLCBmb3JtIGFuZCBmb3JtIGNvbnRyb2xzCi0tLT4gCi08IUVMRU1FTlQgYnV0dG9uICVidXR0b24uY29udGVudDs+ICA8IS0tIHB1c2ggYnV0dG9uIC0tPgotPCFBVFRMSVNUIGJ1dHRvbgotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgIChidXR0b258c3VibWl0fHJlc2V0KSAic3VibWl0IgotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBUYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gRGVyaXZlZCBmcm9tIElFVEYgSFRNTCB0YWJsZSBzdGFuZGFyZCwgc2VlIFtSRkMxOTQyXSAtLT4KLQotPCEtLQotIFRoZSBib3JkZXIgYXR0cmlidXRlIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZQotIHRhYmxlLiBUaGUgZGVmYXVsdCB1bml0cyBhcmUgc2NyZWVuIHBpeGVscy4KLQotIFRoZSBmcmFtZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSB2YWxpZ24gYXR0cmlidXRlLgotLS0+Ci08IUVOVElUWSAlIFRGcmFtZSAiKHZvaWR8YWJvdmV8YmVsb3d8aHNpZGVzfGxoc3xyaHN8dnNpZGVzfGJveHxib3JkZXIpIj4KLQotPCEtLQotIFRoZSBydWxlcyBhdHRyaWJ1dGUgZGVmaW5lcyB3aGljaCBydWxlcyB0byBkcmF3IGJldHdlZW4gY2VsbHM6Ci0KLSBJZiBydWxlcyBpcyBhYnNlbnQgdGhlbiBhc3N1bWU6Ci0gICAgICJub25lIiBpZiBib3JkZXIgaXMgYWJzZW50IG9yIGJvcmRlcj0iMCIgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMKLQotICBjaGFyICAgICAgICBhbGlnbm1lbnQgY2hhciwgZS5nLiBjaGFyPSc6JwotICBjaGFyb2ZmICAgICBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyCi0tLT4KLTwhRU5USVRZICUgY2VsbGhhbGlnbgotICAiYWxpZ24gICAgICAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRAotICAgY2hhciAgICAgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICAgY2hhcm9mZiAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsdmFsaWduCi0gICJ2YWxpZ24gICAgICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQiCi0gID4KLQotPCFFTEVNRU5UIHRhYmxlCi0gICAgIChjYXB0aW9uPywgKGNvbCp8Y29sZ3JvdXAqKSwgdGhlYWQ/LCB0Zm9vdD8sICh0Ym9keSt8dHIrKSk+Ci08IUVMRU1FTlQgY2FwdGlvbiAgJUlubGluZTs+Ci08IUVMRU1FTlQgdGhlYWQgICAgKHRyKSs+Ci08IUVMRU1FTlQgdGZvb3QgICAgKHRyKSs+Ci08IUVMRU1FTlQgdGJvZHkgICAgKHRyKSs+Ci08IUVMRU1FTlQgY29sZ3JvdXAgKGNvbCkqPgotPCFFTEVNRU5UIGNvbCAgICAgIEVNUFRZPgotPCFFTEVNRU5UIHRyICAgICAgICh0aHx0ZCkrPgotPCFFTEVNRU5UIHRoICAgICAgICVGbG93Oz4KLTwhRUxFTUVOVCB0ZCAgICAgICAlRmxvdzs+Ci0KLTwhQVRUTElTVCB0YWJsZQotICAlYXR0cnM7Ci0gIHN1bW1hcnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGZyYW1lICAgICAgICVURnJhbWU7ICAgICAgICNJTVBMSUVECi0gIHJ1bGVzICAgICAgICVUUnVsZXM7ICAgICAgICNJTVBMSUVECi0gIGNlbGxzcGFjaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGNlbGxwYWRkaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTlRJVFkgJSBDQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFBVFRMSVNUIGNhcHRpb24KLSAgJWF0dHJzOwotICA+Ci0KLTwhLS0KLWNvbGdyb3VwIGdyb3VwcyBhIHNldCBvZiBjb2wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UgdG8gZ3JvdXAKLXNldmVyYWwgc2VtYW50aWNhbGx5IHJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotPCFBVFRMSVNUIGNvbGdyb3VwCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gY29sIGVsZW1lbnRzIGRlZmluZSB0aGUgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yIGNlbGxzIGluCi0gb25lIG9yIG1vcmUgY29sdW1ucy4KLQotIFRoZSB3aWR0aCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucywgZS5nLgotCi0gICAgIHdpZHRoPTY0ICAgICAgICB3aWR0aCBpbiBzY3JlZW4gcGl4ZWxzCi0gICAgIHdpZHRoPTAuNSogICAgICByZWxhdGl2ZSB3aWR0aCBvZiAwLjUKLQotIFRoZSBzcGFuIGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lCi0gY29sIGVsZW1lbnQgdG8gYXBwbHkgdG8gbW9yZSB0aGFuIG9uZSBjb2x1bW4uCi0tLT4KLTwhQVRUTElTVCBjb2wKLSAgJWF0dHJzOwotICBzcGFuICAgICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhLS0KLSAgICBVc2UgdGhlYWQgdG8gZHVwbGljYXRlIGhlYWRlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgaGVhZGVycyB3aGVuCi0gICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSB0Zm9vdCB0byBkdXBsaWNhdGUgZm9vdGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBmb290ZXJzIHdoZW4KLSAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIG11bHRpcGxlIHRib2R5IHNlY3Rpb25zIHdoZW4gcnVsZXMgYXJlIG5lZWRlZAotICAgIGJldHdlZW4gZ3JvdXBzIG9mIHRhYmxlIHJvd3MuCi0tLT4KLTwhQVRUTElTVCB0aGVhZAotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdGZvb3QKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRib2R5Ci0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0cgotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGhlYWRlcnMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJvd3xjb2x8cm93Z3JvdXB8Y29sZ3JvdXApIj4KLQotPCEtLSB0aCBpcyBmb3IgaGVhZGVycywgdGQgZm9yIGRhdGEgYW5kIGZvciBjZWxscyBhY3RpbmcgYXMgYm90aCAtLT4KLQotPCFBVFRMSVNUIHRoCi0gICVhdHRyczsKLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQKLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQKLSAgcm93c3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIGNvbHNwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRkCi0gICVhdHRyczsKLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQKLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQKLSAgcm93c3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIGNvbHNwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmM5ZWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDExOTYgKzAsMCBAQAotPCEtLQotICAgRXh0ZW5zaWJsZSBIVE1MIHZlcnNpb24gMS4wIFRyYW5zaXRpb25hbCBEVEQKLQotICAgVGhpcyBpcyB0aGUgc2FtZSBhcyBIVE1MIDQuMCBUcmFuc2l0aW9uYWwgZXhjZXB0IGZvcgotICAgY2hhbmdlcyBkdWUgdG8gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gWE1MIGFuZCBTR01MLgotCi0gICBOYW1lc3BhY2UgPSBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sCi0KLSAgIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBzZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMQotCi0gICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLAotICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0KLSAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIKLQotICAgJFJldmlzaW9uOiAxLjEgJAotICAgJERhdGU6IDIwMDcvMDUvMTUgMDI6NDI6MjIgJAotCi0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT0gQ2hhcmFjdGVyIG1uZW1vbmljIGVudGl0aWVzID09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1sYXQxLmVudCI+Ci0lSFRNTGxhdDE7Ci0KLTwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1zeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLXNwZWNpYWwuZW50Ij4KLSVIVE1Mc3BlY2lhbDsKLQotPCEtLT09PT09PT09PT09PT09PT09PSBJbXBvcnRlZCBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZSAiQ0RBVEEiPgotICAgIDwhLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMgIkNEQVRBIj4KLSAgICA8IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIj4KLSAgICA8IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXRzICJDREFUQSI+Ci0gICAgPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlICJOTVRPS0VOIj4KLSAgICA8IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIj4KLSAgICA8IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci0KLTwhRU5USVRZICUgTnVtYmVyICJDREFUQSI+Ci0gICAgPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSI+Ci0gICAgPCEtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzIC0tPgotCi08IUVOVElUWSAlIE1lZGlhRGVzYyAiQ0RBVEEiPgotICAgIDwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotCi08IUVOVElUWSAlIFVSSSAiQ0RBVEEiPgotICAgIDwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbUkZDMjM5Nl0gLS0+Ci0KLTwhRU5USVRZICUgVXJpTGlzdCAiQ0RBVEEiPgotICAgIDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSI+Ci0gICAgPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSI+Ci0gICAgPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLQotPCFFTlRJVFkgJSBTdHlsZVNoZWV0ICJDREFUQSI+Ci0gICAgPCEtLSBzdHlsZSBzaGVldCBkYXRhIC0tPgotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLSAgICA8IS0tIHVzZWQgZm9yIHRpdGxlcyBldGMuIC0tPgotCi08IUVOVElUWSAlIEZyYW1lVGFyZ2V0ICJOTVRPS0VOIj4KLSAgICA8IS0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tPgotCi08IUVOVElUWSAlIExlbmd0aCAiQ0RBVEEiPgotICAgIDwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSI+Ci0gICAgPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci0KLTwhRU5USVRZICUgTXVsdGlMZW5ndGhzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBNdWx0aUxlbmd0aCAtLT4KLQotPCFFTlRJVFkgJSBQaXhlbHMgIkNEQVRBIj4KLSAgICA8IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLTwhLS0gdGhlc2UgYXJlIHVzZWQgZm9yIGltYWdlIG1hcHMgLS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLQotPCFFTlRJVFkgJSBDb29yZHMgIkNEQVRBIj4KLSAgICA8IS0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0+Ci0KLTwhLS0gdXNlZCBmb3Igb2JqZWN0LCBhcHBsZXQsIGltZywgaW5wdXQgYW5kIGlmcmFtZSAtLT4KLTwhRU5USVRZICUgSW1nQWxpZ24gIih0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhLS0gYSBjb2xvciB1c2luZyBzUkdCOiAjUlJHR0JCIGFzIEhleCB2YWx1ZXMgLS0+Ci08IUVOVElUWSAlIENvbG9yICJDREFUQSI+Ci0KLTwhLS0gVGhlcmUgYXJlIGFsc28gMTYgd2lkZWx5IGtub3duIGNvbG9yIG5hbWVzIHdpdGggdGhlaXIgc1JHQiB2YWx1ZXM6Ci0KLSAgICBCbGFjayAgPSAjMDAwMDAwICAgIEdyZWVuICA9ICMwMDgwMDAKLSAgICBTaWx2ZXIgPSAjQzBDMEMwICAgIExpbWUgICA9ICMwMEZGMDAKLSAgICBHcmF5ICAgPSAjODA4MDgwICAgIE9saXZlICA9ICM4MDgwMDAKLSAgICBXaGl0ZSAgPSAjRkZGRkZGICAgIFllbGxvdyA9ICNGRkZGMDAKLSAgICBNYXJvb24gPSAjODAwMDAwICAgIE5hdnkgICA9ICMwMDAwODAKLSAgICBSZWQgICAgPSAjRkYwMDAwICAgIEJsdWUgICA9ICMwMDAwRkYKLSAgICBQdXJwbGUgPSAjODAwMDgwICAgIFRlYWwgICA9ICMwMDgwODAKLSAgICBGdWNoc2lhPSAjRkYwMEZGICAgIEFxdWEgICA9ICMwMEZGRkYKLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvcmUgYXR0cmlidXRlcyBjb21tb24gdG8gbW9zdCBlbGVtZW50cwotICBpZCAgICAgICBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZAotICBjbGFzcyAgICBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzCi0gIHN0eWxlICAgIGFzc29jaWF0ZWQgc3R5bGUgaW5mbwotICB0aXRsZSAgICBhZHZpc29yeSB0aXRsZS9hbXBsaWZpY2F0aW9uCi0tLT4KLTwhRU5USVRZICUgY29yZWF0dHJzCi0gImlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIGNsYXNzICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHN0eWxlICAgICAgICVTdHlsZVNoZWV0OyAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gaW50ZXJuYXRpb25hbGl6YXRpb24gYXR0cmlidXRlcwotICBsYW5nICAgICAgICBsYW5ndWFnZSBjb2RlIChiYWNrd2FyZHMgY29tcGF0aWJsZSkKLSAgeG1sOmxhbmcgICAgbGFuZ3VhZ2UgY29kZSAoYXMgcGVyIFhNTCAxLjAgc3BlYykKLSAgZGlyICAgICAgICAgZGlyZWN0aW9uIGZvciB3ZWFrL25ldXRyYWwgdGV4dAotLS0+Ci08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBhdHRyaWJ1dGVzIGZvciBjb21tb24gVUkgZXZlbnRzCi0gIG9uY2xpY2sgICAgIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQKLSAgb25kYmxjbGljayAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgZG91YmxlIGNsaWNrZWQKLSAgb25tb3VzZWRvd24gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcHJlc3NlZCBkb3duCi0gIG9ubW91c2V1cCAgIGEgcG9pbnRlciBidXR0b24gd2FzIHJlbGVhc2VkCi0gIG9ubW91c2Vtb3ZlIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byB0aGUgZWxlbWVudAotICBvbm1vdXNlb3V0ICBhIHBvaW50ZXIgd2FzIG1vdmVkIGF3YXkgZnJvbSB0aGUgZWxlbWVudAotICBvbmtleXByZXNzICBhIGtleSB3YXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQKLSAgb25rZXlkb3duICAgYSBrZXkgd2FzIHByZXNzZWQgZG93bgotICBvbmtleXVwICAgICBhIGtleSB3YXMgcmVsZWFzZWQKLS0tPgotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZXVwICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW1vdmUgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXlwcmVzcyAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXlkb3duICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXl1cCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBhdHRyaWJ1dGVzIGZvciBlbGVtZW50cyB0aGF0IGNhbiBnZXQgdGhlIGZvY3VzCi0gIGFjY2Vzc2tleSAgIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlcgotICB0YWJpbmRleCAgICBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyCi0gIG9uZm9jdXMgICAgIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMKLSAgb25ibHVyICAgICAgdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMKLS0tPgotPCFFTlRJVFkgJSBmb2N1cwotICJhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IUVOVElUWSAlIGF0dHJzICIlY29yZWF0dHJzOyAlaTE4bjsgJWV2ZW50czsiPgotCi08IS0tIHRleHQgYWxpZ25tZW50IGZvciBwLCBkaXYsIGgxLWg2LiBUaGUgZGVmYXVsdCBpcwotICAgICBhbGlnbj0ibGVmdCIgZm9yIGx0ciBoZWFkaW5ncywgInJpZ2h0IiBmb3IgcnRsIC0tPgotCi08IUVOVElUWSAlIFRleHRBbGlnbiAiYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRCI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgc3BlY2lhbAotICAgImJyIHwgc3BhbiB8IGJkbyB8IG9iamVjdCB8IGFwcGxldCB8IGltZyB8IG1hcCB8IGlmcmFtZSI+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlICJ0dCB8IGkgfCBiIHwgYmlnIHwgc21hbGwgfCB1Ci0gICAgICAgICAgICAgICAgICAgICAgfCBzIHwgc3RyaWtlIHxmb250IHwgYmFzZWZvbnQiPgotCi08IUVOVElUWSAlIHBocmFzZSAiZW0gfCBzdHJvbmcgfCBkZm4gfCBjb2RlIHwgcSB8IHN1YiB8IHN1cCB8Ci0gICAgICAgICAgICAgICAgICAgc2FtcCB8IGtiZCB8IHZhciB8IGNpdGUgfCBhYmJyIHwgYWNyb255bSI+Ci0KLTwhRU5USVRZICUgaW5saW5lLmZvcm1zICJpbnB1dCB8IHNlbGVjdCB8IHRleHRhcmVhIHwgbGFiZWwgfCBidXR0b24iPgotCi08IS0tIHRoZXNlIGNhbiBvY2N1ciBhdCBibG9jayBvciBpbmxpbmUgbGV2ZWwgLS0+Ci08IUVOVElUWSAlIG1pc2MgImlucyB8IGRlbCB8IHNjcmlwdCB8IG5vc2NyaXB0Ij4KLQotPCFFTlRJVFkgJSBpbmxpbmUgImEgfCAlc3BlY2lhbDsgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczsiPgotCi08IS0tICVJbmxpbmU7IGNvdmVycyBpbmxpbmUgb3IgInRleHQtbGV2ZWwiIGVsZW1lbnRzIC0tPgotPCFFTlRJVFkgJSBJbmxpbmUgIigjUENEQVRBIHwgJWlubGluZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQmxvY2sgbGV2ZWwgZWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiaDF8aDJ8aDN8aDR8aDV8aDYiPgotPCFFTlRJVFkgJSBsaXN0cyAidWwgfCBvbCB8IGRsIHwgbWVudSB8IGRpciI+Ci08IUVOVElUWSAlIGJsb2NrdGV4dCAicHJlIHwgaHIgfCBibG9ja3F1b3RlIHwgYWRkcmVzcyB8IGNlbnRlciB8IG5vZnJhbWVzIj4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICJwIHwgJWhlYWRpbmc7IHwgZGl2IHwgJWxpc3RzOyB8ICVibG9ja3RleHQ7IHwgaXNpbmRleCB8ZmllbGRzZXQgfCB0YWJsZSI+Ci0KLTwhRU5USVRZICUgQmxvY2sgIiglYmxvY2s7IHwgZm9ybSB8ICVtaXNjOykqIj4KLQotPCEtLSAlRmxvdzsgbWl4ZXMgQmxvY2sgYW5kIElubGluZSBhbmQgaXMgdXNlZCBmb3IgbGlzdCBpdGVtcyBldGMuIC0tPgotPCFFTlRJVFkgJSBGbG93ICIoI1BDREFUQSB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQ29udGVudCBtb2RlbHMgZm9yIGV4Y2x1c2lvbnMgPT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gYSBlbGVtZW50cyB1c2UgJUlubGluZTsgZXhjbHVkaW5nIGEgLS0+Ci0KLTwhRU5USVRZICUgYS5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCAlc3BlY2lhbDsgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczsgfCAlbWlzYzspKiI+Ci0KLTwhLS0gcHJlIHVzZXMgJUlubGluZSBleGNsdWRpbmcgaW1nLCBvYmplY3QsIGFwcGxldCwgYmlnLCBzbWFsbCwKLSAgICAgc3ViLCBzdXAsIGZvbnQsIG9yIGJhc2Vmb250IC0tPgotCi08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCBhIHwgYnIgfCBzcGFuIHwgYmRvIHwgbWFwIHwgdHQgfCBpIHwgYiB8IHUgfCBzIHwKLSAgICAgICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczspKiI+Ci0KLTwhLS0gZm9ybSB1c2VzICVGbG93OyBleGNsdWRpbmcgZm9ybSAtLT4KLQotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQgIigjUENEQVRBIHwgJWJsb2NrOyB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tIGJ1dHRvbiB1c2VzICVGbG93OyBidXQgZXhjbHVkZXMgYSwgZm9ybSwgZm9ybSBjb250cm9scywgaWZyYW1lIC0tPgotCi08IUVOVElUWSAlIGJ1dHRvbi5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCBwIHwgJWhlYWRpbmc7IHwgZGl2IHwgJWxpc3RzOyB8ICVibG9ja3RleHQ7IHwKLSAgICAgIHRhYmxlIHwgYnIgfCBzcGFuIHwgYmRvIHwgb2JqZWN0IHwgYXBwbGV0IHwgaW1nIHwgbWFwIHwKLSAgICAgICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IFN0cnVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gdGhlIG5hbWVzcGFjZSBVUkkgZGVzaWduYXRlcyB0aGUgZG9jdW1lbnQgcHJvZmlsZSAtLT4KLQotPCFFTEVNRU5UIGh0bWwgKGhlYWQsIGJvZHkpPgotPCFBVFRMSVNUIGh0bWwKLSAgJWkxOG47Ci0gIHhtbG5zICAgICAgICVVUkk7ICAgICAgICAgICNGSVhFRCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGhlYWQubWlzYyAiKHNjcmlwdHxzdHlsZXxtZXRhfGxpbmt8b2JqZWN0fGlzaW5kZXgpKiI+Ci0KLTwhLS0gY29udGVudCBtb2RlbCBpcyAlaGVhZC5taXNjOyBjb21iaW5lZCB3aXRoIGEgc2luZ2xlCi0gICAgIHRpdGxlIGFuZCBhbiBvcHRpb25hbCBiYXNlIGVsZW1lbnQgaW4gYW55IG9yZGVyIC0tPgotCi08IUVMRU1FTlQgaGVhZCAoJWhlYWQubWlzYzssCi0gICAgICgodGl0bGUsICVoZWFkLm1pc2M7LCAoYmFzZSwgJWhlYWQubWlzYzspPykgfAotICAgICAgKGJhc2UsICVoZWFkLm1pc2M7LCAodGl0bGUsICVoZWFkLm1pc2M7KSkpKT4KLQotPCFBVFRMSVNUIGhlYWQKLSAgJWkxOG47Ci0gIHByb2ZpbGUgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBUaGUgdGl0bGUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0gICAgLS0+Ci08IUVMRU1FTlQgdGl0bGUgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHRpdGxlICVpMThuOz4KLQotPCEtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLQotPCFFTEVNRU5UIGJhc2UgRU1QVFk+Ci08IUFUVExJU1QgYmFzZQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS0gZ2VuZXJpYyBtZXRhaW5mb3JtYXRpb24gLS0+Ci08IUVMRU1FTlQgbWV0YSBFTVBUWT4KLTwhQVRUTElTVCBtZXRhCi0gICVpMThuOwotICBodHRwLWVxdWl2ICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjb250ZW50ICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgc2NoZW1lICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMgd2hlbiB1c2VkCi0gICAgICB3aXRoIHRoZSBsaW5rIGVsZW1lbnQgaW4gZG9jdW1lbnQgaGVhZCBlLmcuCi0gICAgICAgIHN0YXJ0LCBjb250ZW50cywgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPSJzdHlsZXNoZWV0IikKLSAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9InNjcmlwdCIpCi0gICBkKSBieSBzdHlsZXNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZgotICAgICAgaHRtbCBub2RlcyBhcmUgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBlLmcuIGEgUG9zdFNjcmlwdCBvciBQREYgdmVyc2lvbiAocmVsPSJhbHRlcm5hdGUiIG1lZGlhPSJwcmludCIpCi0tLT4KLQotPCFFTEVNRU5UIGxpbmsgRU1QVFk+Ci08IUFUVExJU1QgbGluawotICAlYXR0cnM7Ci0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVECi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLSBzdHlsZSBpbmZvLCB3aGljaCBtYXkgaW5jbHVkZSBDREFUQSBzZWN0aW9ucyAtLT4KLTwhRUxFTUVOVCBzdHlsZSAoI1BDREFUQSk+Ci08IUFUVExJU1Qgc3R5bGUKLSAgJWkxOG47Ci0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRAotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB4bWw6c3BhY2UgICAocHJlc2VydmUpICAgICAjRklYRUQgJ3ByZXNlcnZlJwotICA+Ci0KLTwhLS0gc2NyaXB0IHN0YXRlbWVudHMsIHdoaWNoIG1heSBpbmNsdWRlIENEQVRBIHNlY3Rpb25zIC0tPgotPCFFTEVNRU5UIHNjcmlwdCAoI1BDREFUQSk+Ci08IUFUVExJU1Qgc2NyaXB0Ci0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRAotICBsYW5ndWFnZSAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkZWZlciAgICAgICAoZGVmZXIpICAgICAgICAjSU1QTElFRAotICB4bWw6c3BhY2UgICAocHJlc2VydmUpICAgICAjRklYRUQgJ3ByZXNlcnZlJwotICA+Ci0KLTwhLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gc2NyaXB0LWJhc2VkIHJlbmRlcmluZyAtLT4KLQotPCFFTEVNRU5UIG5vc2NyaXB0ICVGbG93Oz4KLTwhQVRUTElTVCBub3NjcmlwdAotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IEZyYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBpbmxpbmUgc3Vid2luZG93IC0tPgotCi08IUVMRU1FTlQgaWZyYW1lICVGbG93Oz4KLTwhQVRUTElTVCBpZnJhbWUKLSAgJWNvcmVhdHRyczsKLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZnJhbWVib3JkZXIgKDF8MCkgICAgICAgICAgIjEiCi0gIG1hcmdpbndpZHRoICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAgICAgICNJTVBMSUVECi0gIHNjcm9sbGluZyAgICh5ZXN8bm98YXV0bykgICJhdXRvIgotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gZnJhbWUtYmFzZWQgcmVuZGVyaW5nIC0tPgotCi08IUVMRU1FTlQgbm9mcmFtZXMgJUZsb3c7PgotPCFBVFRMSVNUIG5vZnJhbWVzCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgYm9keSAlRmxvdzs+Ci08IUFUVExJU1QgYm9keQotICAlYXR0cnM7Ci0gIG9ubG9hZCAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9udW5sb2FkICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIGJhY2tncm91bmQgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIHRleHQgICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIGxpbmsgICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIHZsaW5rICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIGFsaW5rICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGRpdiAlRmxvdzs+ICA8IS0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIGRpdgotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHAgJUlubGluZTs+Ci08IUFUVExJU1QgcAotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIGgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIGg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgaDEgICVJbmxpbmU7PgotPCFBVFRMSVNUIGgxCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDIgJUlubGluZTs+Ci08IUFUVExJU1QgaDIKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoMyAlSW5saW5lOz4KLTwhQVRUTElTVCBoMwotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGg0ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg0Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDUgJUlubGluZTs+Ci08IUFUVExJU1QgaDUKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoNiAlSW5saW5lOz4KLTwhQVRUTElTVCBoNgotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gTGlzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBVbm9yZGVyZWQgbGlzdCBidWxsZXQgc3R5bGVzIC0tPgotCi08IUVOVElUWSAlIFVMU3R5bGUgIihkaXNjfHNxdWFyZXxjaXJjbGUpIj4KLQotPCEtLSBVbm9yZGVyZWQgbGlzdCAtLT4KLQotPCFFTEVNRU5UIHVsIChsaSkrPgotPCFBVFRMSVNUIHVsCi0gICVhdHRyczsKLSAgdHlwZSAgICAgICAgJVVMU3R5bGU7ICAgICAjSU1QTElFRAotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBPcmRlcmVkIGxpc3QgbnVtYmVyaW5nIHN0eWxlCi0KLSAgICAxICAgYXJhYmljIG51bWJlcnMgICAgICAxLCAyLCAzLCAuLi4KLSAgICBhICAgbG93ZXIgYWxwaGEgICAgICAgICBhLCBiLCBjLCAuLi4KLSAgICBBICAgdXBwZXIgYWxwaGEgICAgICAgICBBLCBCLCBDLCAuLi4KLSAgICBpICAgbG93ZXIgcm9tYW4gICAgICAgICBpLCBpaSwgaWlpLCAuLi4KLSAgICBJICAgdXBwZXIgcm9tYW4gICAgICAgICBJLCBJSSwgSUlJLCAuLi4KLQotICAgIFRoZSBzdHlsZSBpcyBhcHBsaWVkIHRvIHRoZSBzZXF1ZW5jZSBudW1iZXIgd2hpY2ggYnkgZGVmYXVsdAotICAgIGlzIHJlc2V0IHRvIDEgZm9yIHRoZSBmaXJzdCBsaXN0IGl0ZW0gaW4gYW4gb3JkZXJlZCBsaXN0LgotLS0+Ci08IUVOVElUWSAlIE9MU3R5bGUgIkNEQVRBIj4KLQotPCEtLSBPcmRlcmVkIChudW1iZXJlZCkgbGlzdCAtLT4KLQotPCFFTEVNRU5UIG9sIChsaSkrPgotPCFBVFRMSVNUIG9sCi0gICVhdHRyczsKLSAgdHlwZSAgICAgICAgJU9MU3R5bGU7ICAgICAgI0lNUExJRUQKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQKLSAgc3RhcnQgICAgICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHNpbmdsZSBjb2x1bW4gbGlzdCAoREVQUkVDQVRFRCkgLS0+IAotPCFFTEVNRU5UIG1lbnUgKGxpKSs+Ci08IUFUVExJU1QgbWVudQotICAlYXR0cnM7Ci0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIG11bHRpcGxlIGNvbHVtbiBsaXN0IChERVBSRUNBVEVEKSAtLT4gCi08IUVMRU1FTlQgZGlyIChsaSkrPgotPCFBVFRMSVNUIGRpcgotICAlYXR0cnM7Ci0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIExJU3R5bGUgaXMgY29uc3RyYWluZWQgdG86ICIoJVVMU3R5bGU7fCVPTFN0eWxlOykiIC0tPgotPCFFTlRJVFkgJSBMSVN0eWxlICJDREFUQSI+Ci0KLTwhLS0gbGlzdCBpdGVtIC0tPgotCi08IUVMRU1FTlQgbGkgJUZsb3c7PgotPCFBVFRMSVNUIGxpCi0gICVhdHRyczsKLSAgdHlwZSAgICAgICAgJUxJU3R5bGU7ICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBkdCBmb3IgdGVybSwgZGQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgZGwgKGR0fGRkKSs+Ci08IUFUVExJU1QgZGwKLSAgJWF0dHJzOwotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBkdCAlSW5saW5lOz4KLTwhQVRUTElTVCBkdAotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGRkICVGbG93Oz4KLTwhQVRUTElTVCBkZAotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQWRkcmVzcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBpbmZvcm1hdGlvbiBvbiBhdXRob3IgLS0+Ci0KLTwhRUxFTUVOVCBhZGRyZXNzICVJbmxpbmU7PgotPCFBVFRMSVNUIGFkZHJlc3MKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhvcml6b250YWwgUnVsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBociBFTVBUWT4KLTwhQVRUTElTVCBocgotICAlYXR0cnM7Ci0gIGFsaWduICAgICAgIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQKLSAgbm9zaGFkZSAgICAgKG5vc2hhZGUpICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQcmVmb3JtYXR0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvbnRlbnQgaXMgJUlubGluZTsgZXhjbHVkaW5nIAotICAgICAgICAiaW1nfG9iamVjdHxhcHBsZXR8YmlnfHNtYWxsfHN1YnxzdXB8Zm9udHxiYXNlZm9udCIgLS0+Ci0KLTwhRUxFTUVOVCBwcmUgJXByZS5jb250ZW50Oz4KLTwhQVRUTElTVCBwcmUKLSAgJWF0dHJzOwotICB3aWR0aCAgICAgICAlTnVtYmVyOyAgICAgICNJTVBMSUVECi0gIHhtbDpzcGFjZSAgIChwcmVzZXJ2ZSkgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgYmxvY2txdW90ZSAlRmxvdzs+Ci08IUFUVExJU1QgYmxvY2txdW90ZQotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBhbGlnbm1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjZW50ZXIgY29udGVudCAtLT4KLTwhRUxFTUVOVCBjZW50ZXIgJUZsb3c7PgotPCFBVFRMSVNUIGNlbnRlcgotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW5zZXJ0ZWQvRGVsZXRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBpbnMvZGVsIGFyZSBhbGxvd2VkIGluIGJsb2NrIGFuZCBpbmxpbmUgY29udGVudCwgYnV0IGl0cwotICBpbmFwcHJvcHJpYXRlIHRvIGluY2x1ZGUgYmxvY2sgY29udGVudCB3aXRoaW4gYW4gaW5zIGVsZW1lbnQKLSAgb2NjdXJyaW5nIGluIGlubGluZSBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgaW5zICVGbG93Oz4KLTwhQVRUTElTVCBpbnMKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBkZWwgJUZsb3c7PgotPCFBVFRMSVNUIGRlbAotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBUaGUgQW5jaG9yIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb250ZW50IGlzICVJbmxpbmU7IGV4Y2VwdCB0aGF0IGFuY2hvcnMgc2hvdWxkbid0IGJlIG5lc3RlZCAtLT4KLQotPCFFTEVNRU5UIGEgJWEuY29udGVudDs+Ci08IUFUVExJU1QgYQotICAlYXR0cnM7Ci0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgICJyZWN0IgotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT0gSW5saW5lIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBzcGFuICVJbmxpbmU7PiA8IS0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIHNwYW4KLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBiZG8gJUlubGluZTs+ICA8IS0tIEkxOE4gQmlEaSBvdmVyLXJpZGUgLS0+Ci08IUFUVExJU1QgYmRvCi0gICVjb3JlYXR0cnM7Ci0gICVldmVudHM7Ci0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRAotICA+Ci0KLTwhRUxFTUVOVCBiciBFTVBUWT4gICA8IS0tIGZvcmNlZCBsaW5lIGJyZWFrIC0tPgotPCFBVFRMSVNUIGJyCi0gICVjb3JlYXR0cnM7Ci0gIGNsZWFyICAgICAgIChsZWZ0fGFsbHxyaWdodHxub25lKSAibm9uZSIKLSAgPgotCi08IUVMRU1FTlQgZW0gJUlubGluZTs+ICAgPCEtLSBlbXBoYXNpcyAtLT4KLTwhQVRUTElTVCBlbSAlYXR0cnM7PgotCi08IUVMRU1FTlQgc3Ryb25nICVJbmxpbmU7PiAgIDwhLS0gc3Ryb25nIGVtcGhhc2lzIC0tPgotPCFBVFRMSVNUIHN0cm9uZyAlYXR0cnM7PgotCi08IUVMRU1FTlQgZGZuICVJbmxpbmU7PiAgIDwhLS0gZGVmaW5pdGlvbmFsIC0tPgotPCFBVFRMSVNUIGRmbiAlYXR0cnM7PgotCi08IUVMRU1FTlQgY29kZSAlSW5saW5lOz4gICA8IS0tIHByb2dyYW0gY29kZSAtLT4KLTwhQVRUTElTVCBjb2RlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzYW1wICVJbmxpbmU7PiAgIDwhLS0gc2FtcGxlIC0tPgotPCFBVFRMSVNUIHNhbXAgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGtiZCAlSW5saW5lOz4gIDwhLS0gc29tZXRoaW5nIHVzZXIgd291bGQgdHlwZSAtLT4KLTwhQVRUTElTVCBrYmQgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHZhciAlSW5saW5lOz4gICA8IS0tIHZhcmlhYmxlIC0tPgotPCFBVFRMSVNUIHZhciAlYXR0cnM7PgotCi08IUVMRU1FTlQgY2l0ZSAlSW5saW5lOz4gICA8IS0tIGNpdGF0aW9uIC0tPgotPCFBVFRMSVNUIGNpdGUgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGFiYnIgJUlubGluZTs+ICAgPCEtLSBhYmJyZXZpYXRpb24gLS0+Ci08IUFUVExJU1QgYWJiciAlYXR0cnM7PgotCi08IUVMRU1FTlQgYWNyb255bSAlSW5saW5lOz4gICA8IS0tIGFjcm9ueW0gLS0+Ci08IUFUVExJU1QgYWNyb255bSAlYXR0cnM7PgotCi08IUVMRU1FTlQgcSAlSW5saW5lOz4gICA8IS0tIGlubGluZWQgcXVvdGUgLS0+Ci08IUFUVExJU1QgcQotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHN1YiAlSW5saW5lOz4gPCEtLSBzdWJzY3JpcHQgLS0+Ci08IUFUVExJU1Qgc3ViICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdXAgJUlubGluZTs+IDwhLS0gc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1Qgc3VwICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB0dCAlSW5saW5lOz4gICA8IS0tIGZpeGVkIHBpdGNoIGZvbnQgLS0+Ci08IUFUVExJU1QgdHQgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGkgJUlubGluZTs+ICAgPCEtLSBpdGFsaWMgZm9udCAtLT4KLTwhQVRUTElTVCBpICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiICVJbmxpbmU7PiAgIDwhLS0gYm9sZCBmb250IC0tPgotPCFBVFRMSVNUIGIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGJpZyAlSW5saW5lOz4gICA8IS0tIGJpZ2dlciBmb250IC0tPgotPCFBVFRMSVNUIGJpZyAlYXR0cnM7PgotCi08IUVMRU1FTlQgc21hbGwgJUlubGluZTs+ICAgPCEtLSBzbWFsbGVyIGZvbnQgLS0+Ci08IUFUVExJU1Qgc21hbGwgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHUgJUlubGluZTs+ICAgPCEtLSB1bmRlcmxpbmUgLS0+Ci08IUFUVExJU1QgdSAlYXR0cnM7PgotCi08IUVMRU1FTlQgcyAlSW5saW5lOz4gICA8IS0tIHN0cmlrZS10aHJvdWdoIC0tPgotPCFBVFRMSVNUIHMgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN0cmlrZSAlSW5saW5lOz4gICA8IS0tIHN0cmlrZS10aHJvdWdoIC0tPgotPCFBVFRMSVNUIHN0cmlrZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgYmFzZWZvbnQgRU1QVFk+ICA8IS0tIGJhc2UgZm9udCBzaXplIC0tPgotPCFBVFRMSVNUIGJhc2Vmb250Ci0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICBjb2xvciAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBmYWNlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBmb250ICVJbmxpbmU7PiA8IS0tIGxvY2FsIGNoYW5nZSB0byBmb250IC0tPgotPCFBVFRMSVNUIGZvbnQKLSAgJWNvcmVhdHRyczsKLSAgJWkxOG47Ci0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNvbG9yICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIGZhY2UgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09IE9iamVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBvYmplY3QgaXMgdXNlZCB0byBlbWJlZCBvYmplY3RzIGFzIHBhcnQgb2YgSFRNTCBwYWdlcy4KLSAgcGFyYW0gZWxlbWVudHMgc2hvdWxkIHByZWNlZGUgb3RoZXIgY29udGVudC4gUGFyYW1ldGVycwotICBjYW4gYWxzbyBiZSBleHByZXNzZWQgYXMgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIG9uIHRoZQotICBvYmplY3QgZWxlbWVudCBpdHNlbGYgd2hlbiBicmV2aXR5IGlzIGRlc2lyZWQuCi0tLT4KLQotPCFFTEVNRU5UIG9iamVjdCAoI1BDREFUQSB8IHBhcmFtIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqPgotPCFBVFRMSVNUIG9iamVjdAotICAlYXR0cnM7Ci0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVECi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIGFyY2hpdmUgICAgICVVcmlMaXN0OyAgICAgICNJTVBMSUVECi0gIHN0YW5kYnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBwYXJhbSBpcyB1c2VkIHRvIHN1cHBseSBhIG5hbWVkIHByb3BlcnR5IHZhbHVlLgotICBJbiBYTUwgaXQgd291bGQgc2VlbSBuYXR1cmFsIHRvIGZvbGxvdyBSREYgYW5kIHN1cHBvcnQgYW4KLSAgYWJicmV2aWF0ZWQgc3ludGF4IHdoZXJlIHRoZSBwYXJhbSBlbGVtZW50cyBhcmUgcmVwbGFjZWQKLSAgYnkgYXR0cmlidXRlIHZhbHVlIHBhaXJzIG9uIHRoZSBvYmplY3Qgc3RhcnQgdGFnLgotLS0+Ci08IUVMRU1FTlQgcGFyYW0gRU1QVFk+Ci08IUFUVExJU1QgcGFyYW0KLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVldHlwZSAgIChkYXRhfHJlZnxvYmplY3QpICJkYXRhIgotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEphdmEgYXBwbGV0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgT25lIG9mIGNvZGUgb3Igb2JqZWN0IGF0dHJpYnV0ZXMgbXVzdCBiZSBwcmVzZW50LgotICBQbGFjZSBwYXJhbSBlbGVtZW50cyBiZWZvcmUgb3RoZXIgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGFwcGxldCAoI1BDREFUQSB8IHBhcmFtIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqPgotPCFBVFRMSVNUIGFwcGxldAotICAlY29yZWF0dHJzOwotICBjb2RlYmFzZSAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBhcmNoaXZlICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjb2RlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBvYmplY3QgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI1JFUVVJUkVECi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICAgVG8gYXZvaWQgYWNjZXNzaWJpbGl0eSBwcm9ibGVtcyBmb3IgcGVvcGxlIHdobyBhcmVuJ3QKLSAgIGFibGUgdG8gc2VlIHRoZSBpbWFnZSwgeW91IHNob3VsZCBwcm92aWRlIGEgdGV4dAotICAgZGVzY3JpcHRpb24gdXNpbmcgdGhlIGFsdCBhbmQgbG9uZ2Rlc2MgYXR0cmlidXRlcy4KLSAgIEluIGFkZGl0aW9uLCBhdm9pZCB0aGUgdXNlIG9mIHNlcnZlci1zaWRlIGltYWdlIG1hcHMuCi0tLT4KLQotPCFFTEVNRU5UIGltZyBFTVBUWT4KLTwhQVRUTElTVCBpbWcKLSAgJWF0dHJzOwotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGlzbWFwICAgICAgIChpc21hcCkgICAgICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gIGJvcmRlciAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSB1c2VtYXAgcG9pbnRzIHRvIGEgbWFwIGVsZW1lbnQgd2hpY2ggbWF5IGJlIGluIHRoaXMgZG9jdW1lbnQKLSAgb3IgYW4gZXh0ZXJuYWwgZG9jdW1lbnQsIGFsdGhvdWdoIHRoZSBsYXR0ZXIgaXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQ2xpZW50LXNpZGUgaW1hZ2UgbWFwcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gVGhlc2UgY2FuIGJlIHBsYWNlZCBpbiB0aGUgc2FtZSBkb2N1bWVudCBvciBncm91cGVkIGluIGEKLSAgICAgc2VwYXJhdGUgZG9jdW1lbnQgYWx0aG91Z2ggdGhpcyBpc24ndCB5ZXQgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCFFTEVNRU5UIG1hcCAoKCVibG9jazsgfCBmb3JtIHwgJW1pc2M7KSsgfCBhcmVhKyk+Ci08IUFUVExJU1QgbWFwCi0gICVpMThuOwotICAlZXZlbnRzOwotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgYXJlYSBFTVBUWT4KLTwhQVRUTElTVCBhcmVhCi0gICVhdHRyczsKLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgInJlY3QiCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVECi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5vaHJlZiAgICAgIChub2hyZWYpICAgICAgICNJTVBMSUVECi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBmb3JtICVmb3JtLmNvbnRlbnQ7PiAgIDwhLS0gZm9ybXMgc2hvdWxkbid0IGJlIG5lc3RlZCAtLT4KLQotPCFBVFRMSVNUIGZvcm0KLSAgJWF0dHJzOwotICBhY3Rpb24gICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQKLSAgbWV0aG9kICAgICAgKGdldHxwb3N0KSAgICAgImdldCIKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQKLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkCi0gIExhYmVsIGVsZW1lbnRzIHNob3VsZG4ndCBiZSBuZXN0ZWQuCi0tLT4KLTwhRUxFTUVOVCBsYWJlbCAlSW5saW5lOz4KLTwhQVRUTElTVCBsYWJlbAotICAlYXR0cnM7Ci0gIGZvciAgICAgICAgIElEUkVGICAgICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTlRJVFkgJSBJbnB1dFR5cGUKLSAgIih0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8Ci0gICAgcmFkaW8gfCBzdWJtaXQgfCByZXNldCB8Ci0gICAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKSIKLSAgID4KLQotPCEtLSB0aGUgbmFtZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0ICYgcmVzZXQgLS0+Ci0KLTwhRUxFTUVOVCBpbnB1dCBFTVBUWT4gICAgIDwhLS0gZm9ybSBjb250cm9sIC0tPgotPCFBVFRMSVNUIGlucHV0Ci0gICVhdHRyczsKLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgInRleHQiCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNoZWNrZWQgICAgIChjaGVja2VkKSAgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG1heGxlbmd0aCAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGFsdCAgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVECi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHNlbGVjdCAob3B0Z3JvdXB8b3B0aW9uKSs+ICA8IS0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBzZWxlY3QKLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBtdWx0aXBsZSAgICAobXVsdGlwbGUpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBvcHRncm91cCAob3B0aW9uKSs+ICAgPCEtLSBvcHRpb24gZ3JvdXAgLS0+Ci08IUFUVExJU1Qgb3B0Z3JvdXAKLSAgJWF0dHJzOwotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgPgotCi08IUVMRU1FTlQgb3B0aW9uICgjUENEQVRBKT4gICAgIDwhLS0gc2VsZWN0YWJsZSBjaG9pY2UgLS0+Ci08IUFUVExJU1Qgb3B0aW9uCi0gICVhdHRyczsKLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgdGV4dGFyZWEgKCNQQ0RBVEEpPiAgICAgPCEtLSBtdWx0aS1saW5lIHRleHQgZmllbGQgLS0+Ci08IUFUVExJU1QgdGV4dGFyZWEKLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICByb3dzICAgICAgICAlTnVtYmVyOyAgICAgICAjUkVRVUlSRUQKLSAgY29scyAgICAgICAgJU51bWJlcjsgICAgICAgI1JFUVVJUkVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBUaGUgZmllbGRzZXQgZWxlbWVudCBpcyB1c2VkIHRvIGdyb3VwIGZvcm0gZmllbGRzLgotICBPbmx5IG9uZSBsZWdlbmQgZWxlbWVudCBzaG91bGQgb2NjdXIgaW4gdGhlIGNvbnRlbnQKLSAgYW5kIGlmIHByZXNlbnQgc2hvdWxkIG9ubHkgYmUgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZS4KLS0tPgotPCFFTEVNRU5UIGZpZWxkc2V0ICgjUENEQVRBIHwgbGVnZW5kIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqPgotPCFBVFRMSVNUIGZpZWxkc2V0Ci0gICVhdHRyczsKLSAgPgotCi08IUVOVElUWSAlIExBbGlnbiAiKHRvcHxib3R0b218bGVmdHxyaWdodCkiPgotCi08IUVMRU1FTlQgbGVnZW5kICVJbmxpbmU7PiAgICAgPCEtLSBmaWVsZHNldCBsYWJlbCAtLT4KLTwhQVRUTElTVCBsZWdlbmQKLSAgJWF0dHJzOwotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlTEFsaWduOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSBDb250ZW50IGlzICVGbG93OyBleGNsdWRpbmcgYSwgZm9ybSwgZm9ybSBjb250cm9scywgaWZyYW1lCi0tLT4gCi08IUVMRU1FTlQgYnV0dG9uICVidXR0b24uY29udGVudDs+ICA8IS0tIHB1c2ggYnV0dG9uIC0tPgotPCFBVFRMSVNUIGJ1dHRvbgotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgIChidXR0b258c3VibWl0fHJlc2V0KSAic3VibWl0IgotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gc2luZ2xlLWxpbmUgdGV4dCBpbnB1dCBjb250cm9sIChERVBSRUNBVEVEKSAtLT4KLTwhRUxFTUVOVCBpc2luZGV4IEVNUFRZPgotPCFBVFRMSVNUIGlzaW5kZXgKLSAgJWNvcmVhdHRyczsKLSAgJWkxOG47Ci0gIHByb21wdCAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBEZXJpdmVkIGZyb20gSUVURiBIVE1MIHRhYmxlIHN0YW5kYXJkLCBzZWUgW1JGQzE5NDJdIC0tPgotCi08IS0tCi0gVGhlIGJvcmRlciBhdHRyaWJ1dGUgc2V0cyB0aGUgdGhpY2tuZXNzIG9mIHRoZSBmcmFtZSBhcm91bmQgdGhlCi0gdGFibGUuIFRoZSBkZWZhdWx0IHVuaXRzIGFyZSBzY3JlZW4gcGl4ZWxzLgotCi0gVGhlIGZyYW1lIGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hpY2ggcGFydHMgb2YgdGhlIGZyYW1lIGFyb3VuZAotIHRoZSB0YWJsZSBzaG91bGQgYmUgcmVuZGVyZWQuIFRoZSB2YWx1ZXMgYXJlIG5vdCB0aGUgc2FtZSBhcwotIENBTFMgdG8gYXZvaWQgYSBuYW1lIGNsYXNoIHdpdGggdGhlIHZhbGlnbiBhdHRyaWJ1dGUuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIHJ1bGVzIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIHJ1bGVzIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIGJvcmRlciBpcyBhYnNlbnQgb3IgYm9yZGVyPSIwIiBvdGhlcndpc2UgImFsbCIKLS0tPgotCi08IUVOVElUWSAlIFRSdWxlcyAiKG5vbmUgfCBncm91cHMgfCByb3dzIHwgY29scyB8IGFsbCkiPgotICAKLTwhLS0gaG9yaXpvbnRhbCBwbGFjZW1lbnQgb2YgdGFibGUgcmVsYXRpdmUgdG8gZG9jdW1lbnQgLS0+Ci08IUVOVElUWSAlIFRBbGlnbiAiKGxlZnR8Y2VudGVyfHJpZ2h0KSI+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cwotCi0gIGNoYXIgICAgICAgIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9JzonCi0gIGNoYXJvZmYgICAgIG9mZnNldCBmb3IgYWxpZ25tZW50IGNoYXIKLS0tPgotPCFFTlRJVFkgJSBjZWxsaGFsaWduCi0gICJhbGlnbiAgICAgIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5fGNoYXIpICNJTVBMSUVECi0gICBjaGFyICAgICAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgdGFibGUKLSAgICAgKGNhcHRpb24/LCAoY29sKnxjb2xncm91cCopLCB0aGVhZD8sIHRmb290PywgKHRib2R5K3x0cispKT4KLTwhRUxFTUVOVCBjYXB0aW9uICAlSW5saW5lOz4KLTwhRUxFTUVOVCB0aGVhZCAgICAodHIpKz4KLTwhRUxFTUVOVCB0Zm9vdCAgICAodHIpKz4KLTwhRUxFTUVOVCB0Ym9keSAgICAodHIpKz4KLTwhRUxFTUVOVCBjb2xncm91cCAoY29sKSo+Ci08IUVMRU1FTlQgY29sICAgICAgRU1QVFk+Ci08IUVMRU1FTlQgdHIgICAgICAgKHRofHRkKSs+Ci08IUVMRU1FTlQgdGggICAgICAgJUZsb3c7PgotPCFFTEVNRU5UIHRkICAgICAgICVGbG93Oz4KLQotPCFBVFRMSVNUIHRhYmxlCi0gICVhdHRyczsKLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQKLSAgcnVsZXMgICAgICAgJVRSdWxlczsgICAgICAgI0lNUExJRUQKLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgY2VsbHBhZGRpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJVRBbGlnbjsgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIENBbGlnbiAiKHRvcHxib3R0b218bGVmdHxyaWdodCkiPgotCi08IUFUVExJU1QgY2FwdGlvbgotICAlYXR0cnM7Ci0gIGFsaWduICAgICAgICVDQWxpZ247ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotY29sZ3JvdXAgZ3JvdXBzIGEgc2V0IG9mIGNvbCBlbGVtZW50cy4gSXQgYWxsb3dzIHlvdSB0byBncm91cAotc2V2ZXJhbCBzZW1hbnRpY2FsbHkgcmVsYXRlZCBjb2x1bW5zIHRvZ2V0aGVyLgotLS0+Ci08IUFUVExJU1QgY29sZ3JvdXAKLSAgJWF0dHJzOwotICBzcGFuICAgICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhLS0KLSBjb2wgZWxlbWVudHMgZGVmaW5lIHRoZSBhbGlnbm1lbnQgcHJvcGVydGllcyBmb3IgY2VsbHMgaW4KLSBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gVGhlIHdpZHRoIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW5zLCBlLmcuCi0KLSAgICAgd2lkdGg9NjQgICAgICAgIHdpZHRoIGluIHNjcmVlbiBwaXhlbHMKLSAgICAgd2lkdGg9MC41KiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gVGhlIHNwYW4gYXR0cmlidXRlIGNhdXNlcyB0aGUgYXR0cmlidXRlcyBvZiBvbmUKLSBjb2wgZWxlbWVudCB0byBhcHBseSB0byBtb3JlIHRoYW4gb25lIGNvbHVtbi4KLS0tPgotPCFBVFRMSVNUIGNvbAotICAlYXR0cnM7Ci0gIHNwYW4gICAgICAgICVOdW1iZXI7ICAgICAgICIxIgotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRAotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCEtLQotICAgIFVzZSB0aGVhZCB0byBkdXBsaWNhdGUgaGVhZGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBoZWFkZXJzIHdoZW4KLSAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIHRmb290IHRvIGR1cGxpY2F0ZSBmb290ZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgIHRib2R5IHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgbXVsdGlwbGUgdGJvZHkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgYmV0d2VlbiBncm91cHMgb2YgdGFibGUgcm93cy4KLS0tPgotPCFBVFRMSVNUIHRoZWFkCi0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0Zm9vdAotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdGJvZHkKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRyCi0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGhlYWRlcnMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJvd3xjb2x8cm93Z3JvdXB8Y29sZ3JvdXApIj4KLQotPCEtLSB0aCBpcyBmb3IgaGVhZGVycywgdGQgZm9yIGRhdGEgYW5kIGZvciBjZWxscyBhY3RpbmcgYXMgYm90aCAtLT4KLQotPCFBVFRMSVNUIHRoCi0gICVhdHRyczsKLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQKLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQKLSAgcm93c3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIGNvbHNwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gIG5vd3JhcCAgICAgIChub3dyYXApICAgICAgICNJTVBMSUVECi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFBVFRMSVNUIHRkCi0gICVhdHRyczsKLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQKLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQKLSAgcm93c3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIGNvbHNwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gIG5vd3JhcCAgICAgIChub3dyYXApICAgICAgICNJTVBMSUVECi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gID4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMTEtZmxhdC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxMS1mbGF0LmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhODUxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxMS1mbGF0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDQ1MTMgKzAsMCBAQAotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgMS4xIERURCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sMTEuZHRkCi0tLT4KLQotPCEtLSBYSFRNTCAxLjEgRFRECi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLQotICAgICBUaGUgRXh0ZW5zaWJsZSBIeXBlclRleHQgTWFya3VwIExhbmd1YWdlIChYSFRNTCkKLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtCi0gICAgICAgIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZQotICAgICAgICAgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4KLSAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSAgICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGUgWEhUTUwgRFREIGFuZCBpdHMgCi0gICAgIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IAotICAgICBncmFudGVkIGluIHBlcnBldHVpdHksIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIAotICAgICB0aGlzIHBhcmFncmFwaCBhcHBlYXIgaW4gYWxsIGNvcGllcy4gIFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlIG5vIAotICAgICByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhlIERURCBmb3IgYW55IHB1cnBvc2UuCi0KLSAgICAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3NlZCBvciBpbXBsaWVkIHdhcnJhbnR5LgotCi0gICAgICAgIEF1dGhvcjogICAgIE11cnJheSBNLiBBbHRoZWltIDxhbHRoZWltQGVuZy5zdW4uY29tPgotICAgICAgICBSZXZpc2lvbjogICAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0tLT4KLTwhLS0gVGhpcyBpcyB0aGUgZHJpdmVyIGZpbGUgZm9yIHZlcnNpb24gMS4xIG9mIHRoZSBYSFRNTCBEVEQuCi0KLSAgICAgUGxlYXNlIHVzZSB0aGlzIGZvcm1hbCBwdWJsaWMgaWRlbnRpZmllciB0byBpZGVudGlmeSBpdDoKLQotICAgICAgICAgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0tLT4KLTwhRU5USVRZICUgWEhUTUwudmVyc2lvbiAgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iID4KLQotPCEtLSBVc2UgdGhpcyBVUkkgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgbmFtZXNwYWNlOgotCi0gICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQotICAgICBTZWUgdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUgZm9yIGluZm9ybWF0aW9uCi0gICAgIG9uIHRoZSB1c2Ugb2YgbmFtZXNwYWNlIHByZWZpeGVzIGluIHRoZSBEVEQuCi0tLT4KLTwhRU5USVRZICUgTlMucHJlZml4ZWQgIklHTk9SRSIgPgotPCFFTlRJVFkgJSBYSFRNTC5wcmVmaXggIiIgPgotCi08IS0tIFJlc2VydmVkIGZvciB1c2Ugd2l0aCB0aGUgWExpbmsgbmFtZXNwYWNlOgotLS0+Ci08IUVOVElUWSAlIFhMSU5LLnhtbG5zICIiID4KLTwhRU5USVRZICUgWExJTksueG1sbnMuYXR0cmliICIiID4KLQotPCEtLSBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB1c2luZyBYSFRNTCAxLjEgZGlyZWN0bHksIHVzZSB0aGUgRlBJCi0gICAgIGluIHRoZSBET0NUWVBFIGRlY2xhcmF0aW9uLCB3aXRoIHRoZSB4bWxucyBhdHRyaWJ1dGUgb24gdGhlCi0gICAgIGRvY3VtZW50IGVsZW1lbnQgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgbmFtZXNwYWNlOgotCi0gICAgICAgPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0gICAgICAgPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIiAieGh0bWwxMS5kdGQiPgotICAgICAgIDxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+Ci0gICAgICAgLi4uCi0gICAgICAgPC9odG1sPgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0tLT4KLQotPCEtLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSB3aXRoIGRvY3VtZW50IHByb2ZpbGVzIC0tPgotPCFFTlRJVFkgJSBYSFRNTC5wcm9maWxlICAiIiA+Ci0KLTwhLS0gQmlkaXJlY3Rpb25hbCBUZXh0IGZlYXR1cmVzCi0gICAgIFRoaXMgZmVhdHVyZS10ZXN0IGVudGl0eSBpcyB1c2VkIHRvIGRlY2xhcmUgZWxlbWVudHMKLSAgICAgYW5kIGF0dHJpYnV0ZXMgdXNlZCBmb3IgYmlkaXJlY3Rpb25hbCB0ZXh0IHN1cHBvcnQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwuYmlkaSAgIklOQ0xVREUiID4KLQotPD9kb2MgdHlwZT0iZG9jdHlwZSIgcm9sZT0idGl0bGUiIHsgWEhUTUwgMS4xIH0gPz4KLQotPCEtLSA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSBQcmUtRnJhbWV3b3JrIFJlZGVjbGFyYXRpb24gcGxhY2Vob2xkZXIgIC4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSB0aGlzIHNlcnZlcyBhcyBhIGxvY2F0aW9uIHRvIGluc2VydCBtYXJrdXAgZGVjbGFyYXRpb25zCi0gICAgIGludG8gdGhlIERURCBwcmlvciB0byB0aGUgZnJhbWV3b3JrIGRlY2xhcmF0aW9ucy4KLS0tPgotPCFFTlRJVFkgJSB4aHRtbC1wcmVmdy1yZWRlY2wubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1wcmVmdy1yZWRlY2wubW9kdWxlO1sKLSV4aHRtbC1wcmVmdy1yZWRlY2wubW9kOwotPCEtLSBlbmQgb2YgeGh0bWwtcHJlZnctcmVkZWNsLm1vZHVsZSAtLT5dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kdWxlICJJTkNMVURFIiA+Ci0KLTwhLS0gSW5saW5lIFN0eWxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtaW5sc3R5bGUubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW5sc3R5bGUubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW5sc3R5bGUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgU3R5bGUgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5sc3R5bGUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFN0eWxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5sc3R5bGUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBJbmxpbmUgU3R5bGUgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxzdHlsZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgU3R5bGUKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgJ3N0eWxlJyBhdHRyaWJ1dGUsIHVzZWQgdG8gc3VwcG9ydCBpbmxpbmUKLSAgICAgc3R5bGUgbWFya3VwLiBUaGlzIG1vZHVsZSBtdXN0IGJlIGluc3RhbnRpYXRlZCBwcmlvciB0byB0aGUgWEhUTUwKLSAgICAgQ29tbW9uIEF0dHJpYnV0ZXMgbW9kdWxlIGluIG9yZGVyIHRvIGJlIGluY2x1ZGVkIGluICVDb3JlLmF0dHJpYjsuCi0tLT4KLQotPCFFTlRJVFkgJSBzdHlsZS5hdHRyaWIKLSAgICAgInN0eWxlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLQotPCFFTlRJVFkgJSBDb3JlLmV4dHJhLmF0dHJpYgotICAgICAiJXN0eWxlLmF0dHJpYjsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHN0eWxlLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZGVjbGFyZSBEb2N1bWVudCBNb2RlbCBtb2R1bGUgaW5zdGFudGlhdGVkIGluIGZyYW1ld29yawotLS0+Ci08IUVOVElUWSAlIHhodG1sLW1vZGVsLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgMS4xIERvY3VtZW50IE1vZGVsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwxMS1tb2RlbC0xLm1vZCIgPgotCi08IS0tIE1vZHVsYXIgRnJhbWV3b3JrIE1vZHVsZSAocmVxdWlyZWQpIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWZyYW1ld29yay5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1mcmFtZXdvcmsubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZnJhbWV3b3JrLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZnJhbWV3b3JrLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWZyYW1ld29yay0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWZyYW1ld29yay0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBNb2R1bGFyIEZyYW1ld29yawotCi0gICAgIFRoaXMgcmVxdWlyZWQgbW9kdWxlIGluc3RhbnRpYXRlcyB0aGUgbW9kdWxlcyBuZWVkZWQKLSAgICAgdG8gc3VwcG9ydCB0aGUgWEhUTUwgbW9kdWxhcml6YXRpb24gbW9kZWwsIGluY2x1ZGluZzoKLQotICAgICAgICArICBub3RhdGlvbnMKLSAgICAgICAgKyAgZGF0YXR5cGVzCi0gICAgICAgICsgIG5hbWVzcGFjZS1xdWFsaWZpZWQgbmFtZXMKLSAgICAgICAgKyAgY29tbW9uIGF0dHJpYnV0ZXMKLSAgICAgICAgKyAgZG9jdW1lbnQgbW9kZWwKLSAgICAgICAgKyAgY2hhcmFjdGVyIGVudGl0aWVzCi0KLSAgICAgVGhlIEludHJpbnNpYyBFdmVudHMgbW9kdWxlIGlzIGlnbm9yZWQgYnkgZGVmYXVsdCBidXQKLSAgICAgb2NjdXJzIGluIHRoaXMgbW9kdWxlIGJlY2F1c2UgaXQgbXVzdCBiZSBpbnN0YW50aWF0ZWQKLSAgICAgcHJpb3IgdG8gQXR0cmlidXRlcyBidXQgYWZ0ZXIgRGF0YXR5cGVzLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYXJjaC5tb2R1bGUgIklHTk9SRSIgPgotPCFbJXhodG1sLWFyY2gubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYXJjaC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgQXJjaGl0ZWN0dXJlIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYXJjaC0xLm1vZCIgPgotJXhodG1sLWFyY2gubW9kO11dPgotCi08IUVOVElUWSAlIHhodG1sLW5vdGF0aW9ucy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ub3RhdGlvbnMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbm90YXRpb25zLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT05TIFhIVE1MIE5vdGF0aW9ucyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLW5vdGF0aW9ucy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBOb3RhdGlvbnMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ub3RhdGlvbnMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTlMgWEhUTUwgTm90YXRpb25zIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbm90YXRpb25zLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE5vdGF0aW9ucwotCi0gICAgIGRlZmluZXMgdGhlIGZvbGxvd2luZyBub3RhdGlvbnMsIG1hbnkgb2YgdGhlc2UgaW1wb3J0ZWQgZnJvbQotICAgICBvdGhlciBzcGVjaWZpY2F0aW9ucyBhbmQgc3RhbmRhcmRzLiBXaGVuIGFuIGV4aXN0aW5nIEZQSSBpcwotICAgICBrbm93biwgaXQgaXMgaW5jb3Jwb3JhdGVkIGhlcmUuCi0tLT4KLQotPCEtLSBYTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFNHTUwgYW5kIFhNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBXM0MgWE1MIDEuMCBSZWNvbW1lbmRhdGlvbiAtLT4KLTwhTk9UQVRJT04gdzNjLXhtbAotICAgICBQVUJMSUMgIklTTyA4ODc5Ly9OT1RBVElPTiBFeHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZSAoWE1MKSAxLjAvL0VOIiA+Ci0KLTwhLS0gWE1MIDEuMCBDREFUQSAtLT4KLTwhTk9UQVRJT04gY2RhdGEKLSAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhNTCAxLjA6IENEQVRBLy9FTiIgPgotCi08IS0tIFNHTUwgRm9ybWFsIFB1YmxpYyBJZGVudGlmaWVycyAtLT4KLTwhTk9UQVRJT04gZnBpCi0gICAgIFBVQkxJQyAiSVNPIDg4Nzk6MTk4Ni8vTk9UQVRJT04gRm9ybWFsIFB1YmxpYyBJZGVudGlmaWVyLy9FTiIgPgotCi08IS0tIFhIVE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMZW5ndGggZGVmaW5lZCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci0KLTwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFOT1RBVElPTiBsZW5ndGgKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IExlbmd0aC8vRU4iID4KLQotPCEtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzIC0tPgotPCFOT1RBVElPTiBsaW5rVHlwZXMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IExpbmtUeXBlcy8vRU4iID4KLQotPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci08IU5PVEFUSU9OIG1lZGlhRGVzYwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTWVkaWFEZXNjLy9FTiIgPgotCi08IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLTwhTk9UQVRJT04gbXVsdGlMZW5ndGgKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE11bHRpTGVuZ3RoLy9FTiIgPgotCi08IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAoTlVNQkVSKSAtLT4KLTwhTk9UQVRJT04gbnVtYmVyCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBOdW1iZXIvL0VOIiA+Ci0KLTwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLTwhTk9UQVRJT04gcGl4ZWxzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBQaXhlbHMvL0VOIiA+Ci0KLTwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci08IU5PVEFUSU9OIHNjcmlwdAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogU2NyaXB0Ly9FTiIgPgotCi08IS0tIHRleHR1YWwgY29udGVudCAtLT4KLTwhTk9UQVRJT04gdGV4dAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogVGV4dC8vRU4iID4KLQotPCEtLSBJbXBvcnRlZCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLTwhTk9UQVRJT04gY2hhcmFjdGVyCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyYWN0ZXIvL0VOIiA+Ci0KLTwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNoYXJzZXQKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJzZXQvL0VOIiA+Ci0KLTwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjaGFyc2V0cwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcnNldHMvL0VOIiA+Ci0KLTwhLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY29udGVudFR5cGUKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENvbnRlbnRUeXBlLy9FTiIgPgotCi08IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjb250ZW50VHlwZXMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENvbnRlbnRUeXBlcy8vRU4iID4KLQotPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci08IU5PVEFUSU9OIGRhdGV0aW1lCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBEYXRldGltZS8vRU4iID4KLQotPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMzA2Nl0gLS0+Ci08IU5PVEFUSU9OIGxhbmd1YWdlQ29kZQotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGFuZ3VhZ2VDb2RlLy9FTiIgPgotCi08IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1VSSV0gLS0+Ci08IU5PVEFUSU9OIHVyaQotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogVVJJLy9FTiIgPgotCi08IS0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycywgc2VlIFtVUkldIC0tPgotPCFOT1RBVElPTiB1cmlzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBVUklzLy9FTiIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ub3RhdGlvbnMtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1kYXRhdHlwZXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtZGF0YXR5cGVzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWRhdGF0eXBlcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIERhdGF0eXBlcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWRhdGF0eXBlcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEYXRhdHlwZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1kYXRhdHlwZXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgRGF0YXR5cGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZGF0YXR5cGVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIERhdGF0eXBlcwotCi0gICAgIGRlZmluZXMgY29udGFpbmVycyBmb3IgdGhlIGZvbGxvd2luZyBkYXRhdHlwZXMsIG1hbnkgb2YKLSAgICAgdGhlc2UgaW1wb3J0ZWQgZnJvbSBvdGhlciBzcGVjaWZpY2F0aW9ucyBhbmQgc3RhbmRhcmRzLgotLS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotCi08IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgTGVuZ3RoLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci08IUVOVElUWSAlIExpbmtUeXBlcy5kYXRhdHlwZSAiTk1UT0tFTlMiID4KLQotPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci08IUVOVElUWSAlIE1lZGlhRGVzYy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAoTlVNQkVSKSAtLT4KLTwhRU5USVRZICUgTnVtYmVyLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci08IUVOVElUWSAlIFBpeGVscy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLTwhRU5USVRZICUgU2NyaXB0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHRleHR1YWwgY29udGVudCAtLT4KLTwhRU5USVRZICUgVGV4dC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBJbXBvcnRlZCBEYXRhdHlwZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLTwhRU5USVRZICUgQ2hhcmFjdGVyLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDaGFyc2V0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ2hhcnNldHMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ29udGVudFR5cGUuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENvbnRlbnRUeXBlcy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci08IUVOVElUWSAlIERhdGV0aW1lLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGZvcm1hbCBwdWJsaWMgaWRlbnRpZmllciwgYXMgcGVyIFtJU084ODc5XSAtLT4KLTwhRU5USVRZICUgRlBJLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMzMDY2XSAtLT4KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlICJOTVRPS0VOIiA+Ci0KLTwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbVVJJXSAtLT4KLTwhRU5USVRZICUgVVJJLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycywgc2VlIFtVUkldIC0tPgotPCFFTlRJVFkgJSBVUklzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1kYXRhdHlwZXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgWExpbmsgc3VwcG9ydCBtb2R1bGUgLS0+Ci08IUVOVElUWSAlIHhodG1sLXhsaW5rLm1vZCAiIiA+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1xbmFtZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIFF1YWxpZmllZCBOYW1lcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLXFuYW1lLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBRbmFtZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcW5hbWUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgUXVhbGlmaWVkIE5hbWVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtcW5hbWUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotIzIwMDAtMTAtMjI6IGFkZGVkIHFuYW1lIGRlY2xhcmF0aW9ucyBmb3IgcnVieSBlbGVtZW50cwotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBYSFRNTCBRbmFtZSAoUXVhbGlmaWVkIE5hbWUpIE1vZHVsZQotCi0gICAgIFRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0d28gcGFydHMsIGxhYmVsZWQgU2VjdGlvbiAnQScgYW5kICdCJzoKLQotICAgICAgIFNlY3Rpb24gQSBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdG8gc3VwcG9ydCBuYW1lc3BhY2UtCi0gICAgICAgcXVhbGlmaWVkIG5hbWVzLCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLCBhbmQgbmFtZSBwcmVmaXhpbmcKLSAgICAgICBmb3IgWEhUTUwgYW5kIGV4dGVuc2lvbnMuCi0KLSAgICAgICBTZWN0aW9uIEIgZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHVzZWQgdG8gcHJvdmlkZQotICAgICAgIG5hbWVzcGFjZS1xdWFsaWZpZWQgbmFtZXMgZm9yIGFsbCBYSFRNTCBlbGVtZW50IHR5cGVzOgotCi0gICAgICAgICAlYXBwbGV0LnFuYW1lOyAgIHRoZSB4bWxucy1xdWFsaWZpZWQgbmFtZSBmb3IgPGFwcGxldD4KLSAgICAgICAgICViYXNlLnFuYW1lOyAgICAgdGhlIHhtbG5zLXF1YWxpZmllZCBuYW1lIGZvciA8YmFzZT4KLSAgICAgICAgIC4uLgotCi0gICAgIFhIVE1MIGV4dGVuc2lvbnMgd291bGQgY3JlYXRlIGEgbW9kdWxlIHNpbWlsYXIgdG8gdGhpcyBvbmUuCi0gICAgIEluY2x1ZGVkIGluIHRoZSBYSFRNTCBkaXN0cmlidXRpb24gaXMgYSB0ZW1wbGF0ZSBtb2R1bGUKLSAgICAgKCd0ZW1wbGF0ZS1xbmFtZS0xLm1vZCcpIHN1aXRhYmxlIGZvciB0aGlzIHB1cnBvc2UuCi0tLT4KLQotPCEtLSBTZWN0aW9uIEE6IFhIVE1MIFhNTCBOYW1lc3BhY2UgRnJhbWV3b3JrIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIDEuIERlY2xhcmUgYSAlWEhUTUwucHJlZml4ZWQ7IGNvbmRpdGlvbmFsIHNlY3Rpb24ga2V5d29yZCwgdXNlZAotICAgICAgICB0byBhY3RpdmF0ZSBuYW1lc3BhY2UgcHJlZml4aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQKLSAgICAgICAgaW5oZXJpdCAnJU5TLnByZWZpeGVkOycgZnJvbSB0aGUgRFREIGRyaXZlciwgc28gdGhhdCB1bmxlc3MKLSAgICAgICAgb3ZlcnJpZGRlbiwgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvbGxvd3MgdGhlIG92ZXJhbGwgRFRECi0gICAgICAgIHByZWZpeGluZyBzY2hlbWUuCi0tLT4KLTwhRU5USVRZICUgTlMucHJlZml4ZWQgIklHTk9SRSIgPgotPCFFTlRJVFkgJSBYSFRNTC5wcmVmaXhlZCAiJU5TLnByZWZpeGVkOyIgPgotCi08IS0tIDIuIERlY2xhcmUgYSBwYXJhbWV0ZXIgZW50aXR5IChlZy4sICVYSFRNTC54bWxuczspIGNvbnRhaW5pbmcKLSAgICAgICAgdGhlIFVSSSByZWZlcmVuY2UgdXNlZCB0byBpZGVudGlmeSB0aGUgWEhUTUwgbmFtZXNwYWNlOgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zICAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgPgotCi08IS0tIDMuIERlY2xhcmUgcGFyYW1ldGVyIGVudGl0aWVzIChlZy4sICVYSFRNTC5wcmVmaXg7KSBjb250YWluaW5nCi0gICAgICAgIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBwcmVmaXggc3RyaW5nKHMpIHRvIHVzZSB3aGVuIHByZWZpeGluZwotICAgICAgICBpcyBlbmFibGVkLiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGluIHRoZSBEVEQgZHJpdmVyIG9yIHRoZQotICAgICAgICBpbnRlcm5hbCBzdWJzZXQgb2YgYW4gZG9jdW1lbnQgaW5zdGFuY2UuIElmIG5vIGRlZmF1bHQgcHJlZml4Ci0gICAgICAgIGlzIGRlc2lyZWQsIHRoaXMgbWF5IGJlIGRlY2xhcmVkIGFzIGFuIGVtcHR5IHN0cmluZy4KLQotICAgICBOT1RFOiBBcyBzcGVjaWZpZWQgaW4gW1hNTE5BTUVTXSwgdGhlIG5hbWVzcGFjZSBwcmVmaXggc2VydmVzCi0gICAgIGFzIGEgcHJveHkgZm9yIHRoZSBVUkkgcmVmZXJlbmNlLCBhbmQgaXMgbm90IGluIGl0c2VsZiBzaWduaWZpY2FudC4KLS0tPgotPCFFTlRJVFkgJSBYSFRNTC5wcmVmaXggICIiID4KLQotPCEtLSA0LiBEZWNsYXJlIHBhcmFtZXRlciBlbnRpdGllcyAoZWcuLCAlWEhUTUwucGZ4OykgY29udGFpbmluZyB0aGUKLSAgICAgICAgY29sb25pemVkIHByZWZpeChlcykgKGVnLiwgJyVYSFRNTC5wcmVmaXg7OicpIHVzZWQgd2hlbgotICAgICAgICBwcmVmaXhpbmcgaXMgYWN0aXZlLCBhbiBlbXB0eSBzdHJpbmcgd2hlbiBpdCBpcyBub3QuCi0tLT4KLTwhWyVYSFRNTC5wcmVmaXhlZDtbCi08IUVOVElUWSAlIFhIVE1MLnBmeCAgIiVYSFRNTC5wcmVmaXg7OiIgPgotXV0+Ci08IUVOVElUWSAlIFhIVE1MLnBmeCAgIiIgPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIG5hbWUgZXh0ZW5zaW9ucyBoZXJlIC4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUtZXh0cmEubW9kICIiID4KLQotCi08IS0tIDUuIFRoZSBwYXJhbWV0ZXIgZW50aXR5ICVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IG1heSBiZQotICAgICAgICByZWRlY2xhcmVkIHRvIGNvbnRhaW4gYW55IG5vbi1YSFRNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLSAgICAgICAgYXR0cmlidXRlcyBmb3IgbmFtZXNwYWNlcyBlbWJlZGRlZCBpbiBYSFRNTC4gVGhlIGRlZmF1bHQKLSAgICAgICAgaXMgYW4gZW1wdHkgc3RyaW5nLiAgWExpbmsgc2hvdWxkIGJlIGluY2x1ZGVkIGhlcmUgaWYgdXNlZAotICAgICAgICBpbiB0aGUgRFRELgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhLS0gVGhlIHJlbWFpbmRlciBvZiBTZWN0aW9uIEEgaXMgb25seSBmb2xsb3dlZCBpbiBYSFRNTCwgbm90IGV4dGVuc2lvbnMuIC0tPgotCi08IS0tIERlY2xhcmUgYSBwYXJhbWV0ZXIgZW50aXR5ICVOUy5kZWNsLmF0dHJpYjsgY29udGFpbmluZwotICAgICBhbGwgWE1MIE5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgdXNlZCBpbiB0aGUgRFRELCBwbHVzIHRoZQotICAgICB4bWxucyBkZWNsYXJhdGlvbiBmb3IgWEhUTUwsIGl0cyBmb3JtIGRlcGVuZGVudCBvbiB3aGV0aGVyCi0gICAgIHByZWZpeGluZyBpcyBhY3RpdmUuCi0tLT4KLTwhWyVYSFRNTC5wcmVmaXhlZDtbCi08IUVOVElUWSAlIE5TLmRlY2wuYXR0cmliCi0gICAgICJ4bWxuczolWEhUTUwucHJlZml4OyAgJVVSSS5kYXRhdHlwZTsgICAjRklYRUQgJyVYSFRNTC54bWxuczsnCi0gICAgICAlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyIKLT4KLV1dPgotPCFFTlRJVFkgJSBOUy5kZWNsLmF0dHJpYgotICAgICAiJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhLS0gVGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBmdXR1cmUgWExpbmsgc3VwcG9ydC4KLS0tPgotPCFFTlRJVFkgJSBYTElOSy54bWxucy5hdHRyaWIgIiIgPgotCi08IS0tIERlY2xhcmUgYSBwYXJhbWV0ZXIgZW50aXR5ICVOUy5kZWNsLmF0dHJpYjsgY29udGFpbmluZyBhbGwKLSAgICAgWE1MIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGVzIHVzZWQgYnkgWEhUTUwsIGluY2x1ZGluZwotICAgICBhIGRlZmF1bHQgeG1sbnMgYXR0cmlidXRlIHdoZW4gcHJlZml4aW5nIGlzIGluYWN0aXZlLgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5hdHRyaWIKLSAgICAgIiVOUy5kZWNsLmF0dHJpYjsKLSAgICAgICVYTElOSy54bWxucy5hdHRyaWI7IgotPgotXV0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmF0dHJpYgotICAgICAieG1sbnMgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjRklYRUQgJyVYSFRNTC54bWxuczsnCi0gICAgICAlWExJTksueG1sbnMuYXR0cmliOyIKLT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgcXVhbGlmaWVkIG5hbWUgcmVkZWNsYXJhdGlvbnMgLS0+Ci08IUVOVElUWSAlIHhodG1sLXFuYW1lLnJlZGVjbCAiIiA+Ci0KLQotPCEtLSBTZWN0aW9uIEI6IFhIVE1MIFF1YWxpZmllZCBOYW1lcyA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSA2LiBUaGlzIHNlY3Rpb24gZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHVzZWQgdG8gcHJvdmlkZQotICAgICAgICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwgWEhUTUwgZWxlbWVudCB0eXBlcy4KLS0tPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWFwcGxldC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYXBwbGV0LnFuYW1lICAiJVhIVE1MLnBmeDthcHBsZXQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1iYXNlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiYXNlLnFuYW1lICAgICIlWEhUTUwucGZ4O2Jhc2UiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1iZG8tMS5tb2QgLS0+Ci08IUVOVElUWSAlIGJkby5xbmFtZSAgICAgIiVYSFRNTC5wZng7YmRvIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrcGhyYXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFkZHJlc3MucW5hbWUgIiVYSFRNTC5wZng7YWRkcmVzcyIgPgotPCFFTlRJVFkgJSBibG9ja3F1b3RlLnFuYW1lICAiJVhIVE1MLnBmeDtibG9ja3F1b3RlIiA+Ci08IUVOVElUWSAlIHByZS5xbmFtZSAgICAgIiVYSFRNTC5wZng7cHJlIiA+Ci08IUVOVElUWSAlIGgxLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDEiID4KLTwhRU5USVRZICUgaDIucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMiIgPgotPCFFTlRJVFkgJSBoMy5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gzIiA+Ci08IUVOVElUWSAlIGg0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDQiID4KLTwhRU5USVRZICUgaDUucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNSIgPgotPCFFTlRJVFkgJSBoNi5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g2IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrcHJlcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgaHIucW5hbWUgICAgICAiJVhIVE1MLnBmeDtociIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3N0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgZGl2LnFuYW1lICAgICAiJVhIVE1MLnBmeDtkaXYiID4KLTwhRU5USVRZICUgcC5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtwIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtZWRpdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgaW5zLnFuYW1lICAgICAiJVhIVE1MLnBmeDtpbnMiID4KLTwhRU5USVRZICUgZGVsLnFuYW1lICAgICAiJVhIVE1MLnBmeDtkZWwiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1mb3JtLTEubW9kIC0tPgotPCFFTlRJVFkgJSBmb3JtLnFuYW1lICAgICIlWEhUTUwucGZ4O2Zvcm0iID4KLTwhRU5USVRZICUgbGFiZWwucW5hbWUgICAiJVhIVE1MLnBmeDtsYWJlbCIgPgotPCFFTlRJVFkgJSBpbnB1dC5xbmFtZSAgICIlWEhUTUwucGZ4O2lucHV0IiA+Ci08IUVOVElUWSAlIHNlbGVjdC5xbmFtZSAgIiVYSFRNTC5wZng7c2VsZWN0IiA+Ci08IUVOVElUWSAlIG9wdGdyb3VwLnFuYW1lICAiJVhIVE1MLnBmeDtvcHRncm91cCIgPgotPCFFTlRJVFkgJSBvcHRpb24ucW5hbWUgICIlWEhUTUwucGZ4O29wdGlvbiIgPgotPCFFTlRJVFkgJSB0ZXh0YXJlYS5xbmFtZSAgIiVYSFRNTC5wZng7dGV4dGFyZWEiID4KLTwhRU5USVRZICUgZmllbGRzZXQucW5hbWUgICIlWEhUTUwucGZ4O2ZpZWxkc2V0IiA+Ci08IUVOVElUWSAlIGxlZ2VuZC5xbmFtZSAgIiVYSFRNTC5wZng7bGVnZW5kIiA+Ci08IUVOVElUWSAlIGJ1dHRvbi5xbmFtZSAgIiVYSFRNTC5wZng7YnV0dG9uIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaHlwZXJ0ZXh0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBhLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2EiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbWFnZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgaW1nLnFuYW1lICAgICAiJVhIVE1MLnBmeDtpbWciID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxwaHJhcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgYWJici5xbmFtZSAgICAiJVhIVE1MLnBmeDthYmJyIiA+Ci08IUVOVElUWSAlIGFjcm9ueW0ucW5hbWUgIiVYSFRNTC5wZng7YWNyb255bSIgPgotPCFFTlRJVFkgJSBjaXRlLnFuYW1lICAgICIlWEhUTUwucGZ4O2NpdGUiID4KLTwhRU5USVRZICUgY29kZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtjb2RlIiA+Ci08IUVOVElUWSAlIGRmbi5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGZuIiA+Ci08IUVOVElUWSAlIGVtLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZW0iID4KLTwhRU5USVRZICUga2JkLnFuYW1lICAgICAiJVhIVE1MLnBmeDtrYmQiID4KLTwhRU5USVRZICUgcS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtxIiA+Ci08IUVOVElUWSAlIHNhbXAucW5hbWUgICAgIiVYSFRNTC5wZng7c2FtcCIgPgotPCFFTlRJVFkgJSBzdHJvbmcucW5hbWUgICIlWEhUTUwucGZ4O3N0cm9uZyIgPgotPCFFTlRJVFkgJSB2YXIucW5hbWUgICAgICIlWEhUTUwucGZ4O3ZhciIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHByZXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGIucW5hbWUgICAgICAgIiVYSFRNTC5wZng7YiIgPgotPCFFTlRJVFkgJSBiaWcucW5hbWUgICAgICIlWEhUTUwucGZ4O2JpZyIgPgotPCFFTlRJVFkgJSBpLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2kiID4KLTwhRU5USVRZICUgc21hbGwucW5hbWUgICAiJVhIVE1MLnBmeDtzbWFsbCIgPgotPCFFTlRJVFkgJSBzdWIucW5hbWUgICAgICIlWEhUTUwucGZ4O3N1YiIgPgotPCFFTlRJVFkgJSBzdXAucW5hbWUgICAgICIlWEhUTUwucGZ4O3N1cCIgPgotPCFFTlRJVFkgJSB0dC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3R0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5sc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBici5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2JyIiA+Ci08IUVOVElUWSAlIHNwYW4ucW5hbWUgICAgIiVYSFRNTC5wZng7c3BhbiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlzbWFwLTEubW9kIChhbHNvIGNzaXNtYXAsIHNzaXNtYXApIC0tPgotPCFFTlRJVFkgJSBtYXAucW5hbWUgICAgICIlWEhUTUwucGZ4O21hcCIgPgotPCFFTlRJVFkgJSBhcmVhLnFuYW1lICAgICIlWEhUTUwucGZ4O2FyZWEiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1saW5rLTEubW9kIC0tPgotPCFFTlRJVFkgJSBsaW5rLnFuYW1lICAgICIlWEhUTUwucGZ4O2xpbmsiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1saXN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBkbC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2RsIiA+Ci08IUVOVElUWSAlIGR0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZHQiID4KLTwhRU5USVRZICUgZGQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkZCIgPgotPCFFTlRJVFkgJSBvbC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O29sIiA+Ci08IUVOVElUWSAlIHVsLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dWwiID4KLTwhRU5USVRZICUgbGkucW5hbWUgICAgICAiJVhIVE1MLnBmeDtsaSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLW1ldGEtMS5tb2QgLS0+Ci08IUVOVElUWSAlIG1ldGEucW5hbWUgICAgIiVYSFRNTC5wZng7bWV0YSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXBhcmFtLTEubW9kIC0tPgotPCFFTlRJVFkgJSBwYXJhbS5xbmFtZSAgICIlWEhUTUwucGZ4O3BhcmFtIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtb2JqZWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBvYmplY3QucW5hbWUgICIlWEhUTUwucGZ4O29iamVjdCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXNjcmlwdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgc2NyaXB0LnFuYW1lICAiJVhIVE1MLnBmeDtzY3JpcHQiID4KLTwhRU5USVRZICUgbm9zY3JpcHQucW5hbWUgICIlWEhUTUwucGZ4O25vc2NyaXB0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBodG1sLnFuYW1lICAgICIlWEhUTUwucGZ4O2h0bWwiID4KLTwhRU5USVRZICUgaGVhZC5xbmFtZSAgICAiJVhIVE1MLnBmeDtoZWFkIiA+Ci08IUVOVElUWSAlIHRpdGxlLnFuYW1lICAgIiVYSFRNTC5wZng7dGl0bGUiID4KLTwhRU5USVRZICUgYm9keS5xbmFtZSAgICAiJVhIVE1MLnBmeDtib2R5IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc3R5bGUtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHN0eWxlLnFuYW1lICAgIiVYSFRNTC5wZng7c3R5bGUiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC10YWJsZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgdGFibGUucW5hbWUgICAiJVhIVE1MLnBmeDt0YWJsZSIgPgotPCFFTlRJVFkgJSBjYXB0aW9uLnFuYW1lICIlWEhUTUwucGZ4O2NhcHRpb24iID4KLTwhRU5USVRZICUgdGhlYWQucW5hbWUgICAiJVhIVE1MLnBmeDt0aGVhZCIgPgotPCFFTlRJVFkgJSB0Zm9vdC5xbmFtZSAgICIlWEhUTUwucGZ4O3Rmb290IiA+Ci08IUVOVElUWSAlIHRib2R5LnFuYW1lICAgIiVYSFRNTC5wZng7dGJvZHkiID4KLTwhRU5USVRZICUgY29sZ3JvdXAucW5hbWUgICIlWEhUTUwucGZ4O2NvbGdyb3VwIiA+Ci08IUVOVElUWSAlIGNvbC5xbmFtZSAgICAgIiVYSFRNTC5wZng7Y29sIiA+Ci08IUVOVElUWSAlIHRyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dHIiID4KLTwhRU5USVRZICUgdGgucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0aCIgPgotPCFFTlRJVFkgJSB0ZC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RkIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtcnVieS0xLm1vZCAtLT4KLQotPCFFTlRJVFkgJSBydWJ5LnFuYW1lICAgICIlWEhUTUwucGZ4O3J1YnkiID4KLTwhRU5USVRZICUgcmJjLnFuYW1lICAgICAiJVhIVE1MLnBmeDtyYmMiID4KLTwhRU5USVRZICUgcnRjLnFuYW1lICAgICAiJVhIVE1MLnBmeDtydGMiID4KLTwhRU5USVRZICUgcmIucW5hbWUgICAgICAiJVhIVE1MLnBmeDtyYiIgPgotPCFFTlRJVFkgJSBydC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3J0IiA+Ci08IUVOVElUWSAlIHJwLnFuYW1lICAgICAgIiVYSFRNTC5wZng7cnAiID4KLQotPCEtLSBQcm92aXNpb25hbCBYSFRNTCAyLjAgUXVhbGlmaWVkIE5hbWVzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWltYWdlLTIubW9kIC0tPgotPCFFTlRJVFkgJSBhbHQucW5hbWUgICAgICIlWEhUTUwucGZ4O2FsdCIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1xbmFtZS0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWV2ZW50cy5tb2R1bGUgIklHTk9SRSIgPgotPCFbJXhodG1sLWV2ZW50cy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBJbnRyaW5zaWMgRXZlbnRzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtZXZlbnRzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEludHJpbnNpYyBFdmVudHMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWV2ZW50cy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBJbnRyaW5zaWMgRXZlbnRzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZXZlbnRzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEludHJpbnNpYyBFdmVudCBBdHRyaWJ1dGVzCi0KLSAgICAgVGhlc2UgYXJlIHRoZSBldmVudCBhdHRyaWJ1dGVzIGRlZmluZWQgaW4gSFRNTCA0LjAsCi0gICAgIFNlY3Rpb24gMTguMi4zICJJbnRyaW5zaWMgRXZlbnRzIi4gVGhpcyBtb2R1bGUgbXVzdCBiZQotICAgICBpbnN0YW50aWF0ZWQgcHJpb3IgdG8gdGhlIEF0dHJpYnV0ZXMgTW9kdWxlIGJ1dCBhZnRlcgotICAgICB0aGUgRGF0YXR5cGUgTW9kdWxlIGluIHRoZSBNb2R1bGFyIEZyYW1ld29yayBtb2R1bGUuCi0KLSAgICAiTm90ZTogQXV0aG9ycyBvZiBIVE1MIGRvY3VtZW50cyBhcmUgYWR2aXNlZCB0aGF0IGNoYW5nZXMKLSAgICAgYXJlIGxpa2VseSB0byBvY2N1ciBpbiB0aGUgcmVhbG0gb2YgaW50cmluc2ljIGV2ZW50cwotICAgICAoZS5nLiwgaG93IHNjcmlwdHMgYXJlIGJvdW5kIHRvIGV2ZW50cykuIFJlc2VhcmNoIGluCi0gICAgIHRoaXMgcmVhbG0gaXMgY2FycmllZCBvbiBieSBtZW1iZXJzIG9mIHRoZSBXM0MgRG9jdW1lbnQKLSAgICAgT2JqZWN0IE1vZGVsIFdvcmtpbmcgR3JvdXAgKHNlZSB0aGUgVzNDIFdlYiBzaXRlIGF0Ci0gICAgIGh0dHA6Ly93d3cudzMub3JnLyBmb3IgbW9yZSBpbmZvcm1hdGlvbikuIgotLS0+Ci08IS0tIE5PVEU6IEJlY2F1c2UgdGhlIEFUVExJU1QgZGVjbGFyYXRpb25zIGluIHRoaXMgbW9kdWxlIG9jY3VyCi0gICAgIGJlZm9yZSB0aGVpciByZXNwZWN0aXZlIEVMRU1FTlQgZGVjbGFyYXRpb25zIGluIG90aGVyCi0gICAgIG1vZHVsZXMsIHRoZXJlIG1heSBiZSBhIGRlcGVuZGVuY3kgb24gdGhpcyBtb2R1bGUgdGhhdAotICAgICBzaG91bGQgYmUgY29uc2lkZXJlZCBpZiBhbnkgb2YgdGhlIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkCi0gICAgIGZvciBlbGVtZW50IHR5cGUgbmFtZXMgKGVnLiwgJWEucW5hbWU7KSBhcmUgcmVkZWNsYXJlZC4KLS0tPgotCi08IUVOVElUWSAlIEV2ZW50cy5hdHRyaWIKLSAgICAgIm9uY2xpY2sgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uZGJsY2xpY2sgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9ubW91c2Vkb3duICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9ubW91c2V1cCAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9ubW91c2VvdmVyICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9ubW91c2Vtb3ZlICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9ubW91c2VvdXQgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9ua2V5cHJlc3MgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9ua2V5ZG93biAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9ua2V5dXAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIGFuY2hvciBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAlYS5xbmFtZTsKLSAgICAgb25mb2N1cyAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAgI0lNUExJRUQKLSAgICAgb25ibHVyICAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gZm9ybSBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAlZm9ybS5xbmFtZTsKLSAgICAgIG9uc3VibWl0ICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9ucmVzZXQgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gbGFiZWwgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWxhYmVsLnFuYW1lOwotICAgICAgb25mb2N1cyAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25ibHVyICAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBpbnB1dCBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAlaW5wdXQucW5hbWU7Ci0gICAgICBvbmZvY3VzICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmJsdXIgICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbnNlbGVjdCAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmNoYW5nZSAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIHNlbGVjdCBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAlc2VsZWN0LnFuYW1lOwotICAgICAgb25mb2N1cyAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25ibHVyICAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25jaGFuZ2UgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiB0ZXh0YXJlYSBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAldGV4dGFyZWEucW5hbWU7Ci0gICAgICBvbmZvY3VzICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmJsdXIgICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbnNlbGVjdCAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmNoYW5nZSAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIGJ1dHRvbiBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAlYnV0dG9uLnFuYW1lOwotICAgICAgb25mb2N1cyAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25ibHVyICAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBib2R5IGVsZW1lbnQKLS0tPgotPCFBVFRMSVNUICVib2R5LnFuYW1lOwotICAgICAgb25sb2FkICAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb251bmxvYWQgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBhcmVhIGVsZW1lbnQKLS0tPgotPCFBVFRMSVNUICVhcmVhLnFuYW1lOwotICAgICAgb25mb2N1cyAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25ibHVyICAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ldmVudHMtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1hdHRyaWJzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWF0dHJpYnMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYXR0cmlicy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYXR0cmlicy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBDb21tb24gQXR0cmlidXRlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1hdHRyaWJzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYXR0cmlicy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDb21tb24gQXR0cmlidXRlcwotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIG1hbnkgb2YgdGhlIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciB0aGUgWEhUTUwgRFRELgotICAgICAlTlMuZGVjbC5hdHRyaWI7IGlzIGRlY2xhcmVkIGluIHRoZSBYSFRNTCBRbmFtZSBtb2R1bGUuCi0tLT4KLQotPCFFTlRJVFkgJSBpZC5hdHRyaWIKLSAgICAgImlkICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgY2xhc3MuYXR0cmliCi0gICAgICJjbGFzcyAgICAgICAgTk1UT0tFTlMgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIHRpdGxlLmF0dHJpYgotICAgICAidGl0bGUgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBDb3JlLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhRU5USVRZICUgQ29yZS5hdHRyaWIKLSAgICAgIiVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlaWQuYXR0cmliOwotICAgICAgJWNsYXNzLmF0dHJpYjsKLSAgICAgICV0aXRsZS5hdHRyaWI7Ci0gICAgICAlQ29yZS5leHRyYS5hdHRyaWI7IgotPgotCi08IUVOVElUWSAlIGxhbmcuYXR0cmliCi0gICAgICJ4bWw6bGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVEIgotPgotCi08IVslWEhUTUwuYmlkaTtbCi08IUVOVElUWSAlIGRpci5hdHRyaWIKLSAgICAgImRpciAgICAgICAgICAoIGx0ciB8IHJ0bCApICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgSTE4bi5hdHRyaWIKLSAgICAgIiVkaXIuYXR0cmliOwotICAgICAgJWxhbmcuYXR0cmliOyIKLT4KLQotXV0+Ci08IUVOVElUWSAlIEkxOG4uYXR0cmliCi0gICAgICIlbGFuZy5hdHRyaWI7IgotPgotCi08IUVOVElUWSAlIENvbW1vbi5leHRyYS5hdHRyaWIgIiIgPgotCi08IS0tIGludHJpbnNpYyBldmVudCBhdHRyaWJ1dGVzIGRlY2xhcmVkIHByZXZpb3VzbHkKLS0tPgotPCFFTlRJVFkgJSBFdmVudHMuYXR0cmliICIiID4KLQotPCFFTlRJVFkgJSBDb21tb24uYXR0cmliCi0gICAgICIlQ29yZS5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICAlRXZlbnRzLmF0dHJpYjsKLSAgICAgICVDb21tb24uZXh0cmEuYXR0cmliOyIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYXR0cmlicy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBjb250ZW50IG1vZGVsIHJlZGVjbGFyYXRpb25zIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5yZWRlY2wgIiIgPgotCi0KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbW9kZWwubW9kdWxlO1sKLTwhLS0gaW5zdGFudGlhdGUgdGhlIERvY3VtZW50IE1vZGVsIG1vZHVsZSBkZWNsYXJlZCBpbiB0aGUgRFREIGRyaXZlcgotLS0+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCAxLjEgRG9jdW1lbnQgTW9kZWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwxMS1tb2RlbC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwgMS4xLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgMS4xIERvY3VtZW50IE1vZGVsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLW1vZGVsLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFhIVE1MIDEuMSBEb2N1bWVudCBNb2RlbAotCi0gICAgIFRoaXMgbW9kdWxlIGRlc2NyaWJlcyB0aGUgZ3JvdXBpbmdzIG9mIGVsZW1lbnRzIHRoYXQgbWFrZSB1cAotICAgICBjb21tb24gY29udGVudCBtb2RlbHMgZm9yIFhIVE1MIGVsZW1lbnRzLgotCi0gICAgIFhIVE1MIGhhcyB0aHJlZSBiYXNpYyBjb250ZW50IG1vZGVsczoKLQotICAgICAgICAgJUlubGluZS5taXg7ICBjaGFyYWN0ZXItbGV2ZWwgZWxlbWVudHMKLSAgICAgICAgICVCbG9jay5taXg7ICAgYmxvY2stbGlrZSBlbGVtZW50cywgZWcuLCBwYXJhZ3JhcGhzIGFuZCBsaXN0cwotICAgICAgICAgJUZsb3cubWl4OyAgICBhbnkgYmxvY2sgb3IgaW5saW5lIGVsZW1lbnRzCi0KLSAgICAgQW55IHBhcmFtZXRlciBlbnRpdGllcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZSBtYXkgYmUgdXNlZAotICAgICB0byBjcmVhdGUgZWxlbWVudCBjb250ZW50IG1vZGVscywgYnV0IHRoZSBhYm92ZSB0aHJlZSBhcmUKLSAgICAgY29uc2lkZXJlZCAnZ2xvYmFsJyAoaW5zb2ZhciBhcyB0aGF0IHRlcm0gYXBwbGllcyBoZXJlKS4KLQotICAgICBUaGUgcmVzZXJ2ZWQgd29yZCAnI1BDREFUQScgKGluZGljYXRpbmcgYSB0ZXh0IHN0cmluZykgaXMgbm93Ci0gICAgIGluY2x1ZGVkIGV4cGxpY2l0bHkgd2l0aCBlYWNoIGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBpcwotICAgICBkZWNsYXJlZCBhcyBtaXhlZCBjb250ZW50LCBhcyBYTUwgcmVxdWlyZXMgdGhhdCB0aGlzIHRva2VuCi0gICAgIG9jY3VyIGZpcnN0IGluIGEgY29udGVudCBtb2RlbCBzcGVjaWZpY2F0aW9uLgotLS0+Ci08IS0tIEV4dGVuZGluZyB0aGUgTW9kZWwKLQotICAgICBXaGlsZSBpbiBzb21lIGNhc2VzIHRoaXMgbW9kdWxlIG1heSBuZWVkIHRvIGJlIHJld3JpdHRlbiB0bwotICAgICBhY2NvbW1vZGF0ZSBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudCBtb2RlbCwgbWlub3IgZXh0ZW5zaW9ucwotICAgICBtYXkgYmUgYWNjb21wbGlzaGVkIGJ5IHJlZGVjbGFyaW5nIGFueSBvZiB0aGUgdGhyZWUgKi5leHRyYTsKLSAgICAgcGFyYW1ldGVyIGVudGl0aWVzIHRvIGNvbnRhaW4gZXh0ZW5zaW9uIGVsZW1lbnQgdHlwZXMgYXMgZm9sbG93czoKLQotICAgICAgICAgJU1pc2MuZXh0cmE7ICAgIHdob3NlIHBhcmVudCBtYXkgYmUgYW55IGJsb2NrIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lIGVsZW1lbnQuCi0KLSAgICAgICAgICVJbmxpbmUuZXh0cmE7ICB3aG9zZSBwYXJlbnQgbWF5IGJlIGFueSBpbmxpbmUgZWxlbWVudC4KLQotICAgICAgICAgJUJsb2NrLmV4dHJhOyAgIHdob3NlIHBhcmVudCBtYXkgYmUgYW55IGJsb2NrIGVsZW1lbnQuCi0KLSAgICAgSWYgdXNlZCwgdGhlc2UgcGFyYW1ldGVyIGVudGl0aWVzIG11c3QgYmUgYW4gT1Itc2VwYXJhdGVkCi0gICAgIGxpc3QgYmVnaW5uaW5nIHdpdGggYW4gT1Igc2VwYXJhdG9yICgifCIpLCBlZy4sICJ8IGEgfCBiIHwgYyIKLQotICAgICBBbGwgYmxvY2sgYW5kIGlubGluZSAqLmNsYXNzIHBhcmFtZXRlciBlbnRpdGllcyBub3QgcGFydAotICAgICBvZiB0aGUgKnN0cnVjdC5jbGFzcyBjbGFzc2VzIGJlZ2luIHdpdGggInwgIiB0byBhbGxvdyBmb3IKLSAgICAgZXhjbHVzaW9uIGZyb20gbWl4ZXMuCi0tLT4KLQotPCEtLSAuLi4uLi4uLi4uLi4uLiAgT3B0aW9uYWwgRWxlbWVudHMgaW4gaGVhZCAgLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRPcHRzLm1peAotICAgICAiKCAlc2NyaXB0LnFuYW1lOyB8ICVzdHlsZS5xbmFtZTsgfCAlbWV0YS5xbmFtZTsKLSAgICAgIHwgJWxpbmsucW5hbWU7IHwgJW9iamVjdC5xbmFtZTsgKSoiCi0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4gIE1pc2NlbGxhbmVvdXMgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBpbnMgYW5kIGRlbCBhcmUgdXNlZCB0byBkZW5vdGUgZWRpdGluZyBjaGFuZ2VzCi0tLT4KLTwhRU5USVRZICUgRWRpdC5jbGFzcyAifCAlaW5zLnFuYW1lOyB8ICVkZWwucW5hbWU7IiA+Ci0KLTwhLS0gc2NyaXB0IGFuZCBub3NjcmlwdCBhcmUgdXNlZCB0byBjb250YWluIHNjcmlwdHMKLSAgICAgYW5kIGFsdGVybmF0aXZlIGNvbnRlbnQKLS0tPgotPCFFTlRJVFkgJSBTY3JpcHQuY2xhc3MgInwgJXNjcmlwdC5xbmFtZTsgfCAlbm9zY3JpcHQucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgTWlzYy5leHRyYSAiIiA+Ci0KLTwhLS0gVGhlc2UgZWxlbWVudHMgYXJlIG5laXRoZXIgYmxvY2sgbm9yIGlubGluZSwgYW5kIGNhbgotICAgICBlc3NlbnRpYWxseSBiZSB1c2VkIGFueXdoZXJlIGluIHRoZSBkb2N1bWVudCBib2R5LgotLS0+Ci08IUVOVElUWSAlIE1pc2MuY2xhc3MKLSAgICAgIiVFZGl0LmNsYXNzOwotICAgICAgJVNjcmlwdC5jbGFzczsKLSAgICAgICVNaXNjLmV4dHJhOyIKLT4KLQotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLiAgSW5saW5lIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIElubFN0cnVjdC5jbGFzcyAiJWJyLnFuYW1lOyB8ICVzcGFuLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFBocmFzLmNsYXNzCi0gICAgICJ8ICVlbS5xbmFtZTsgfCAlc3Ryb25nLnFuYW1lOyB8ICVkZm4ucW5hbWU7IHwgJWNvZGUucW5hbWU7Ci0gICAgICB8ICVzYW1wLnFuYW1lOyB8ICVrYmQucW5hbWU7IHwgJXZhci5xbmFtZTsgfCAlY2l0ZS5xbmFtZTsKLSAgICAgIHwgJWFiYnIucW5hbWU7IHwgJWFjcm9ueW0ucW5hbWU7IHwgJXEucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sUHJlcy5jbGFzcwotICAgICAifCAldHQucW5hbWU7IHwgJWkucW5hbWU7IHwgJWIucW5hbWU7IHwgJWJpZy5xbmFtZTsKLSAgICAgIHwgJXNtYWxsLnFuYW1lOyB8ICVzdWIucW5hbWU7IHwgJXN1cC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJMThuLmNsYXNzICJ8ICViZG8ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQW5jaG9yLmNsYXNzICJ8ICVhLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFNwZWNpYWwuY2xhc3MKLSAgICAgInwgJWltZy5xbmFtZTsgfCAlbWFwLnFuYW1lOwotICAgICAgfCAlb2JqZWN0LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubEZvcm0uY2xhc3MKLSAgICAgInwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOwotICAgICAgfCAlbGFiZWwucW5hbWU7IHwgJWJ1dHRvbi5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxpbmUuZXh0cmEgIiIgPgotCi08IUVOVElUWSAlIFJ1YnkuY2xhc3MgInwgJXJ1YnkucW5hbWU7IiA+Ci0KLTwhLS0gJUlubGluZS5jbGFzczsgaW5jbHVkZXMgYWxsIGlubGluZSBlbGVtZW50cywKLSAgICAgdXNlZCBhcyBhIGNvbXBvbmVudCBpbiBtaXhlcwotLS0+Ci08IUVOVElUWSAlIElubGluZS5jbGFzcwotICAgICAiJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJbmxQcmVzLmNsYXNzOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlSW5sRm9ybS5jbGFzczsKLSAgICAgICVSdWJ5LmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsiCi0+Ci0KLTwhLS0gJUlubE5vUnVieS5jbGFzczsgaW5jbHVkZXMgYWxsIGlubGluZSBlbGVtZW50cwotICAgICBleGNlcHQgcnVieSwgdXNlZCBhcyBhIGNvbXBvbmVudCBpbiBtaXhlcwotLS0+Ci08IUVOVElUWSAlIElubE5vUnVieS5jbGFzcwotICAgICAiJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJbmxQcmVzLmNsYXNzOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlSW5sRm9ybS5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7IgotPgotCi08IS0tICVOb1J1YnkuY29udGVudDsgaW5jbHVkZXMgYWxsIGlubGluZXMgZXhjZXB0IHJ1YnkKLS0tPgotPCFFTlRJVFkgJSBOb1J1YnkuY29udGVudAotICAgICAiKCAjUENEQVRBCi0gICAgICB8ICVJbmxOb1J1YnkuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsgKSoiCi0+Ci0KLTwhLS0gJUlubE5vQW5jaG9yLmNsYXNzOyBpbmNsdWRlcyBhbGwgbm9uLWFuY2hvciBpbmxpbmVzLAotICAgICB1c2VkIGFzIGEgY29tcG9uZW50IGluIG1peGVzCi0tLT4KLTwhRU5USVRZICUgSW5sTm9BbmNob3IuY2xhc3MKLSAgICAgIiVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlSW5sRm9ybS5jbGFzczsKLSAgICAgICVSdWJ5LmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsiCi0+Ci0KLTwhLS0gJUlubE5vQW5jaG9yLm1peDsgaW5jbHVkZXMgYWxsIG5vbi1hbmNob3IgaW5saW5lcwotLS0+Ci08IUVOVElUWSAlIElubE5vQW5jaG9yLm1peAotICAgICAiJUlubE5vQW5jaG9yLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tICVJbmxpbmUubWl4OyBpbmNsdWRlcyBhbGwgaW5saW5lIGVsZW1lbnRzLCBpbmNsdWRpbmcgJU1pc2MuY2xhc3M7Ci0tLT4KLTwhRU5USVRZICUgSW5saW5lLm1peAotICAgICAiJUlubGluZS5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gIEJsb2NrIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEluIHRoZSBIVE1MIDQuMCBEVEQsIGhlYWRpbmcgYW5kIGxpc3QgZWxlbWVudHMgd2VyZSBpbmNsdWRlZAotICAgICBpbiB0aGUgJWJsb2NrOyBwYXJhbWV0ZXIgZW50aXR5LiBUaGUgJUhlYWRpbmcuY2xhc3M7IGFuZAotICAgICAlTGlzdC5jbGFzczsgcGFyYW1ldGVyIGVudGl0aWVzIG11c3Qgbm93IGJlIGluY2x1ZGVkIGV4cGxpY2l0bHkKLSAgICAgb24gZWxlbWVudCBkZWNsYXJhdGlvbnMgd2hlcmUgZGVzaXJlZC4KLS0tPgotCi08IUVOVElUWSAlIEhlYWRpbmcuY2xhc3MKLSAgICAgIiVoMS5xbmFtZTsgfCAlaDIucW5hbWU7IHwgJWgzLnFuYW1lOwotICAgICAgfCAlaDQucW5hbWU7IHwgJWg1LnFuYW1lOyB8ICVoNi5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBMaXN0LmNsYXNzICIldWwucW5hbWU7IHwgJW9sLnFuYW1lOyB8ICVkbC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBUYWJsZS5jbGFzcyAifCAldGFibGUucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgRm9ybS5jbGFzcyAgInwgJWZvcm0ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgRmllbGRzZXQuY2xhc3MgICJ8ICVmaWVsZHNldC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBCbGtTdHJ1Y3QuY2xhc3MgIiVwLnFuYW1lOyB8ICVkaXYucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrUGhyYXMuY2xhc3MKLSAgICAgInwgJXByZS5xbmFtZTsgfCAlYmxvY2txdW90ZS5xbmFtZTsgfCAlYWRkcmVzcy5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBCbGtQcmVzLmNsYXNzICJ8ICVoci5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBCbGtTcGVjaWFsLmNsYXNzCi0gICAgICIlVGFibGUuY2xhc3M7Ci0gICAgICAlRm9ybS5jbGFzczsKLSAgICAgICVGaWVsZHNldC5jbGFzczsiCi0+Ci0KLTwhRU5USVRZICUgQmxvY2suZXh0cmEgIiIgPgotCi08IS0tICVCbG9jay5jbGFzczsgaW5jbHVkZXMgYWxsIGJsb2NrIGVsZW1lbnRzLAotICAgICB1c2VkIGFzIGFuIGNvbXBvbmVudCBpbiBtaXhlcwotLS0+Ci08IUVOVElUWSAlIEJsb2NrLmNsYXNzCi0gICAgICIlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUJsa1ByZXMuY2xhc3M7Ci0gICAgICAlQmxrU3BlY2lhbC5jbGFzczsKLSAgICAgICVCbG9jay5leHRyYTsiCi0+Ci0KLTwhLS0gJUJsb2NrLm1peDsgaW5jbHVkZXMgYWxsIGJsb2NrIGVsZW1lbnRzIHBsdXMgJU1pc2MuY2xhc3M7Ci0tLT4KLTwhRU5USVRZICUgQmxvY2subWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbG9jay5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSAuLi4uLi4uLi4uLi4uLi4uICBBbGwgQ29udGVudCBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tICVGbG93Lm1peDsgaW5jbHVkZXMgYWxsIHRleHQgY29udGVudCwgYmxvY2sgYW5kIGlubGluZQotLS0+Ci08IUVOVElUWSAlIEZsb3cubWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbG9jay5jbGFzczsKLSAgICAgIHwgJUlubGluZS5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwxMS1tb2RlbC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWNoYXJlbnQubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtY2hhcmVudC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1jaGFyZW50Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtY2hhcmVudC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtY2hhcmVudC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1jaGFyZW50LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIENoYXJhY3RlciBFbnRpdGllcyBmb3IgWEhUTUwKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgc2V0IG9mIGNoYXJhY3RlciBlbnRpdGllcyBmb3IgWEhUTUwsCi0gICAgIGluY2x1ZGluZyB0aGUgTGF0aW4gMSwgU3ltYm9sIGFuZCBTcGVjaWFsIGNoYXJhY3RlciBjb2xsZWN0aW9ucy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWxhdDEKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtbGF0MS5lbnQiID4KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgPCFFTlRJVFkgJSBIVE1MbGF0MSBQVUJMSUMKLSAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtbGF0MS5lbnQiPgotICAgICVIVE1MbGF0MTsKLS0tPgotCi08IUVOVElUWSBuYnNwICAgIiYjMTYwOyI+IDwhLS0gbm8tYnJlYWsgc3BhY2UgPSBub24tYnJlYWtpbmcgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEEwIElTT251bSAtLT4KLTwhRU5USVRZIGlleGNsICAiJiMxNjE7Ij4gPCEtLSBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrLCBVKzAwQTEgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VudCAgICImIzE2MjsiPiA8IS0tIGNlbnQgc2lnbiwgVSswMEEyIElTT251bSAtLT4KLTwhRU5USVRZIHBvdW5kICAiJiMxNjM7Ij4gPCEtLSBwb3VuZCBzaWduLCBVKzAwQTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgY3VycmVuICImIzE2NDsiPiA8IS0tIGN1cnJlbmN5IHNpZ24sIFUrMDBBNCBJU09udW0gLS0+Ci08IUVOVElUWSB5ZW4gICAgIiYjMTY1OyI+IDwhLS0geWVuIHNpZ24gPSB5dWFuIHNpZ24sIFUrMDBBNSBJU09udW0gLS0+Ci08IUVOVElUWSBicnZiYXIgIiYjMTY2OyI+IDwhLS0gYnJva2VuIGJhciA9IGJyb2tlbiB2ZXJ0aWNhbCBiYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEE2IElTT251bSAtLT4KLTwhRU5USVRZIHNlY3QgICAiJiMxNjc7Ij4gPCEtLSBzZWN0aW9uIHNpZ24sIFUrMDBBNyBJU09udW0gLS0+Ci08IUVOVElUWSB1bWwgICAgIiYjMTY4OyI+IDwhLS0gZGlhZXJlc2lzID0gc3BhY2luZyBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEE4IElTT2RpYSAtLT4KLTwhRU5USVRZIGNvcHkgICAiJiMxNjk7Ij4gPCEtLSBjb3B5cmlnaHQgc2lnbiwgVSswMEE5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZGYgICAiJiMxNzA7Ij4gPCEtLSBmZW1pbmluZSBvcmRpbmFsIGluZGljYXRvciwgVSswMEFBIElTT251bSAtLT4KLTwhRU5USVRZIGxhcXVvICAiJiMxNzE7Ij4gPCEtLSBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGVmdCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBBQiBJU09udW0gLS0+Ci08IUVOVElUWSBub3QgICAgIiYjMTcyOyI+IDwhLS0gbm90IHNpZ24gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2h5ICAgICImIzE3MzsiPiA8IS0tIHNvZnQgaHlwaGVuID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFEIElTT251bSAtLT4KLTwhRU5USVRZIHJlZyAgICAiJiMxNzQ7Ij4gPCEtLSByZWdpc3RlcmVkIHNpZ24gPSByZWdpc3RlcmVkIHRyYWRlIG1hcmsgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUUgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWFjciAgICImIzE3NTsiPiA8IS0tIG1hY3JvbiA9IHNwYWNpbmcgbWFjcm9uID0gb3ZlcmxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFQTCBvdmVyYmFyLCBVKzAwQUYgSVNPZGlhIC0tPgotPCFFTlRJVFkgZGVnICAgICImIzE3NjsiPiA8IS0tIGRlZ3JlZSBzaWduLCBVKzAwQjAgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGx1c21uICImIzE3NzsiPiA8IS0tIHBsdXMtbWludXMgc2lnbiA9IHBsdXMtb3ItbWludXMgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjEgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMiAgICImIzE3ODsiPiA8IS0tIHN1cGVyc2NyaXB0IHR3byA9IHN1cGVyc2NyaXB0IGRpZ2l0IHR3bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3F1YXJlZCwgVSswMEIyIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDMgICAiJiMxNzk7Ij4gPCEtLSBzdXBlcnNjcmlwdCB0aHJlZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IHRocmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjdWJlZCwgVSswMEIzIElTT251bSAtLT4KLTwhRU5USVRZIGFjdXRlICAiJiMxODA7Ij4gPCEtLSBhY3V0ZSBhY2NlbnQgPSBzcGFjaW5nIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNCBJU09kaWEgLS0+Ci08IUVOVElUWSBtaWNybyAgIiYjMTgxOyI+IDwhLS0gbWljcm8gc2lnbiwgVSswMEI1IElTT251bSAtLT4KLTwhRU5USVRZIHBhcmEgICAiJiMxODI7Ij4gPCEtLSBwaWxjcm93IHNpZ24gPSBwYXJhZ3JhcGggc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWlkZG90ICImIzE4MzsiPiA8IS0tIG1pZGRsZSBkb3QgPSBHZW9yZ2lhbiBjb21tYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gR3JlZWsgbWlkZGxlIGRvdCwgVSswMEI3IElTT251bSAtLT4KLTwhRU5USVRZIGNlZGlsICAiJiMxODQ7Ij4gPCEtLSBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhLCBVKzAwQjggSVNPZGlhIC0tPgotPCFFTlRJVFkgc3VwMSAgICImIzE4NTsiPiA8IS0tIHN1cGVyc2NyaXB0IG9uZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkbSAgICImIzE4NjsiPiA8IS0tIG1hc2N1bGluZSBvcmRpbmFsIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQkEgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmFxdW8gICImIzE4NzsiPiA8IS0tIHJpZ2h0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcmlnaHQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQkIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzE0ICImIzE4ODsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIHF1YXJ0ZXIsIFUrMDBCQyBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTIgIiYjMTg5OyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgaGFsZiwgVSswMEJEIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMzNCAiJiMxOTA7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzLCBVKzAwQkUgSVNPbnVtIC0tPgotPCFFTlRJVFkgaXF1ZXN0ICImIzE5MTsiPiA8IS0tIGludmVydGVkIHF1ZXN0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHR1cm5lZCBxdWVzdGlvbiBtYXJrLCBVKzAwQkYgSVNPbnVtIC0tPgotPCFFTlRJVFkgQWdyYXZlICImIzE5MjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFhY3V0ZSAiJiMxOTM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBY2lyYyAgIiYjMTk0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdGlsZGUgIiYjMTk1OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXVtbCAgICImIzE5NjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBcmluZyAgIiYjMTk3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFFbGlnICAiJiMxOTg7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBBRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIENjZWRpbCAiJiMxOTk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBDIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVncmF2ZSAiJiMyMDA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFYWN1dGUgIiYjMjAxOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWNpcmMgICImIzIwMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRXVtbCAgICImIzIwMzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJZ3JhdmUgIiYjMjA0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWFjdXRlICImIzIwNTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0QgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEljaXJjICAiJiMyMDY7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0UgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEl1bWwgICAiJiMyMDc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgRVRIICAgICImIzIwODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEVUSCwgVSswMEQwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBOdGlsZGUgIiYjMjA5OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2dyYXZlICImIzIxMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9hY3V0ZSAiJiMyMTE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPY2lyYyAgIiYjMjEyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdGlsZGUgIiYjMjEzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3VtbCAgICImIzIxNDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ2IElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aW1lcyAgIiYjMjE1OyI+IDwhLS0gbXVsdGlwbGljYXRpb24gc2lnbiwgVSswMEQ3IElTT251bSAtLT4KLTwhRU5USVRZIE9zbGFzaCAiJiMyMTY7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggc3Ryb2tlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWdyYXZlICImIzIxNzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVhY3V0ZSAiJiMyMTg7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVY2lyYyAgIiYjMjE5OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVdW1sICAgIiYjMjIwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFlhY3V0ZSAiJiMyMjE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEREIElTT2xhdDEgLS0+Ci08IUVOVElUWSBUSE9STiAgIiYjMjIyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVEhPUk4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBzemxpZyAgIiYjMjIzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHNoYXJwIHMgPSBlc3MtemVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWdyYXZlICImIzIyNDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWFjdXRlICImIzIyNTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhY2lyYyAgIiYjMjI2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXRpbGRlICImIzIyNzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdW1sICAgIiYjMjI4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhcmluZyAgIiYjMjI5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWVsaWcgICImIzIzMDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGlnYXR1cmUgYWUsIFUrMDBFNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgY2NlZGlsICImIzIzMTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBjIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVncmF2ZSAiJiMyMzI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWFjdXRlICImIzIzMzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlY2lyYyAgIiYjMjM0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXVtbCAgICImIzIzNTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWdyYXZlICImIzIzNjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpYWN1dGUgIiYjMjM3OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGljaXJjICAiJiMyMzg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpdW1sICAgIiYjMjM5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldGggICAgIiYjMjQwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGV0aCwgVSswMEYwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBudGlsZGUgIiYjMjQxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9ncmF2ZSAiJiMyNDI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2FjdXRlICImIzI0MzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvY2lyYyAgIiYjMjQ0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3RpbGRlICImIzI0NTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdW1sICAgIiYjMjQ2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBkaXZpZGUgIiYjMjQ3OyI+IDwhLS0gZGl2aXNpb24gc2lnbiwgVSswMEY3IElTT251bSAtLT4KLTwhRU5USVRZIG9zbGFzaCAiJiMyNDg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHN0cm9rZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBvIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWdyYXZlICImIzI0OTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY5IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1YWN1dGUgIiYjMjUwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVjaXJjICAiJiMyNTE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZCIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1dW1sICAgIiYjMjUyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZDIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5YWN1dGUgIiYjMjUzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRob3JuICAiJiMyNTQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdGhvcm4gd2l0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHl1bWwgICAiJiMyNTU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkYgSVNPbGF0MSAtLT4KLQotCi08IUVOVElUWSAlIHhodG1sLXN5bWJvbAotICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICJ4aHRtbC1zeW1ib2wuZW50IiA+Ci08IS0tIE1hdGhlbWF0aWNhbCwgR3JlZWsgYW5kIFN5bWJvbGljIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXN5bWJvbC5lbnQiPgotICAgICAlSFRNTHN5bWJvbDsKLS0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIG5hbWVzLiAKLS0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUIgLS0+Ci08IUVOVElUWSBmbm9mICAgICAiJiM0MDI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBmIHdpdGggaG9vayA9IGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZsb3JpbiwgVSswMTkyIElTT3RlY2ggLS0+Ci0KLTwhLS0gR3JlZWsgLS0+Ci08IUVOVElUWSBBbHBoYSAgICAiJiM5MTM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBhbHBoYSwgVSswMzkxIC0tPgotPCFFTlRJVFkgQmV0YSAgICAgIiYjOTE0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYmV0YSwgVSswMzkyIC0tPgotPCFFTlRJVFkgR2FtbWEgICAgIiYjOTE1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZ2FtbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIERlbHRhICAgICImIzkxNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzk0IElTT2dyazMgLS0+Ci08IUVOVElUWSBFcHNpbG9uICAiJiM5MTc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBlcHNpbG9uLCBVKzAzOTUgLS0+Ci08IUVOVElUWSBaZXRhICAgICAiJiM5MTg7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB6ZXRhLCBVKzAzOTYgLS0+Ci08IUVOVElUWSBFdGEgICAgICAiJiM5MTk7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBldGEsIFUrMDM5NyAtLT4KLTwhRU5USVRZIFRoZXRhICAgICImIzkyMDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRoZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzk4IElTT2dyazMgLS0+Ci08IUVOVElUWSBJb3RhICAgICAiJiM5MjE7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBpb3RhLCBVKzAzOTkgLS0+Ci08IUVOVElUWSBLYXBwYSAgICAiJiM5MjI7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBrYXBwYSwgVSswMzlBIC0tPgotPCFFTlRJVFkgTGFtYmRhICAgIiYjOTIzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzlCIElTT2dyazMgLS0+Ci08IUVOVElUWSBNdSAgICAgICAiJiM5MjQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBtdSwgVSswMzlDIC0tPgotPCFFTlRJVFkgTnUgICAgICAgIiYjOTI1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbnUsIFUrMDM5RCAtLT4KLTwhRU5USVRZIFhpICAgICAgICImIzkyNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHhpLCBVKzAzOUUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9taWNyb24gICImIzkyNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9taWNyb24sIFUrMDM5RiAtLT4KLTwhRU5USVRZIFBpICAgICAgICImIzkyODsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBpLCBVKzAzQTAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFJobyAgICAgICImIzkyOTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHJobywgVSswM0ExIC0tPgotPCEtLSB0aGVyZSBpcyBubyBTaWdtYWYsIGFuZCBubyBVKzAzQTIgY2hhcmFjdGVyIGVpdGhlciAtLT4KLTwhRU5USVRZIFNpZ21hICAgICImIzkzMTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0EzIElTT2dyazMgLS0+Ci08IUVOVElUWSBUYXUgICAgICAiJiM5MzI7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB0YXUsIFUrMDNBNCAtLT4KLTwhRU5USVRZIFVwc2lsb24gICImIzkzMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFBoaSAgICAgICImIzkzNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBoaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNiBJU09ncmszIC0tPgotPCFFTlRJVFkgQ2hpICAgICAgIiYjOTM1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgY2hpLCBVKzAzQTcgLS0+Ci08IUVOVElUWSBQc2kgICAgICAiJiM5MzY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9tZWdhICAgICImIzkzNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E5IElTT2dyazMgLS0+Ci0KLTwhRU5USVRZIGFscGhhICAgICImIzk0NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMSBJU09ncmszIC0tPgotPCFFTlRJVFkgYmV0YSAgICAgIiYjOTQ2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGJldGEsIFUrMDNCMiBJU09ncmszIC0tPgotPCFFTlRJVFkgZ2FtbWEgICAgIiYjOTQ3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0IzIElTT2dyazMgLS0+Ci08IUVOVElUWSBkZWx0YSAgICAiJiM5NDg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGVwc2lsb24gICImIzk0OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBlcHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I1IElTT2dyazMgLS0+Ci08IUVOVElUWSB6ZXRhICAgICAiJiM5NTA7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgemV0YSwgVSswM0I2IElTT2dyazMgLS0+Ci08IUVOVElUWSBldGEgICAgICAiJiM5NTE7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXRhLCBVKzAzQjcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhICAgICImIzk1MjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCOCBJU09ncmszIC0tPgotPCFFTlRJVFkgaW90YSAgICAgIiYjOTUzOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGlvdGEsIFUrMDNCOSBJU09ncmszIC0tPgotPCFFTlRJVFkga2FwcGEgICAgIiYjOTU0OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGthcHBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0JBIElTT2dyazMgLS0+Ci08IUVOVElUWSBsYW1iZGEgICAiJiM5NTU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0JCIElTT2dyazMgLS0+Ci08IUVOVElUWSBtdSAgICAgICAiJiM5NTY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbXUsIFUrMDNCQyBJU09ncmszIC0tPgotPCFFTlRJVFkgbnUgICAgICAgIiYjOTU3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG51LCBVKzAzQkQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHhpICAgICAgICImIzk1ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB4aSwgVSswM0JFIElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWljcm9uICAiJiM5NTk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21pY3JvbiwgVSswM0JGIE5FVyAtLT4KLTwhRU5USVRZIHBpICAgICAgICImIzk2MDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaSwgVSswM0MwIElTT2dyazMgLS0+Ci08IUVOVElUWSByaG8gICAgICAiJiM5NjE7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcmhvLCBVKzAzQzEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hZiAgICImIzk2MjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBmaW5hbCBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMiBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWEgICAgIiYjOTYzOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0MzIElTT2dyazMgLS0+Ci08IUVOVElUWSB0YXUgICAgICAiJiM5NjQ7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGF1LCBVKzAzQzQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHVwc2lsb24gICImIzk2NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M1IElTT2dyazMgLS0+Ci08IUVOVElUWSBwaGkgICAgICAiJiM5NjY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGhpLCBVKzAzQzYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGNoaSAgICAgICImIzk2NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBjaGksIFUrMDNDNyBJU09ncmszIC0tPgotPCFFTlRJVFkgcHNpICAgICAgIiYjOTY4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBzaSwgVSswM0M4IElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWVnYSAgICAiJiM5Njk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21lZ2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhc3ltICImIzk3NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzRDEgTkVXIC0tPgotPCFFTlRJVFkgdXBzaWggICAgIiYjOTc4OyI+IDwhLS0gZ3JlZWsgdXBzaWxvbiB3aXRoIGhvb2sgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QyIE5FVyAtLT4KLTwhRU5USVRZIHBpdiAgICAgICImIzk4MjsiPiA8IS0tIGdyZWVrIHBpIHN5bWJvbCwgVSswM0Q2IElTT2dyazMgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGJ1bGwgICAgICImIzgyMjY7Ij4gPCEtLSBidWxsZXQgPSBibGFjayBzbWFsbCBjaXJjbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDIyIElTT3B1YiAgLS0+Ci08IS0tIGJ1bGxldCBpcyBOT1QgdGhlIHNhbWUgYXMgYnVsbGV0IG9wZXJhdG9yLCBVKzIyMTkgLS0+Ci08IUVOVElUWSBoZWxsaXAgICAiJiM4MjMwOyI+IDwhLS0gaG9yaXpvbnRhbCBlbGxpcHNpcyA9IHRocmVlIGRvdCBsZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDI2IElTT3B1YiAgLS0+Ci08IUVOVElUWSBwcmltZSAgICAiJiM4MjQyOyI+IDwhLS0gcHJpbWUgPSBtaW51dGVzID0gZmVldCwgVSsyMDMyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBQcmltZSAgICAiJiM4MjQzOyI+IDwhLS0gZG91YmxlIHByaW1lID0gc2Vjb25kcyA9IGluY2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMzMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9saW5lICAgICImIzgyNTQ7Ij4gPCEtLSBvdmVybGluZSA9IHNwYWNpbmcgb3ZlcnNjb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzRSBORVcgLS0+Ci08IUVOVElUWSBmcmFzbCAgICAiJiM4MjYwOyI+IDwhLS0gZnJhY3Rpb24gc2xhc2gsIFUrMjA0NCBORVcgLS0+Ci0KLTwhLS0gTGV0dGVybGlrZSBTeW1ib2xzIC0tPgotPCFFTlRJVFkgd2VpZXJwICAgIiYjODQ3MjsiPiA8IS0tIHNjcmlwdCBjYXBpdGFsIFAgPSBwb3dlciBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFdlaWVyc3RyYXNzIHAsIFUrMjExOCBJU09hbXNvIC0tPgotPCFFTlRJVFkgaW1hZ2UgICAgIiYjODQ2NTsiPiA8IS0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgSSA9IGltYWdpbmFyeSBwYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExMSBJU09hbXNvIC0tPgotPCFFTlRJVFkgcmVhbCAgICAgIiYjODQ3NjsiPiA8IS0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgUiA9IHJlYWwgcGFydCBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTFDIElTT2Ftc28gLS0+Ci08IUVOVElUWSB0cmFkZSAgICAiJiM4NDgyOyI+IDwhLS0gdHJhZGUgbWFyayBzaWduLCBVKzIxMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWxlZnN5bSAgIiYjODUwMTsiPiA8IS0tIGFsZWYgc3ltYm9sID0gZmlyc3QgdHJhbnNmaW5pdGUgY2FyZGluYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTM1IE5FVyAtLT4KLTwhLS0gYWxlZiBzeW1ib2wgaXMgTk9UIHRoZSBzYW1lIGFzIGhlYnJldyBsZXR0ZXIgYWxlZiwKLSAgICAgVSswNUQwIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIGNvdWxkIGJlIHVzZWQgdG8gZGVwaWN0IGJvdGggY2hhcmFjdGVycyAtLT4KLQotPCEtLSBBcnJvd3MgLS0+Ci08IUVOVElUWSBsYXJyICAgICAiJiM4NTkyOyI+IDwhLS0gbGVmdHdhcmRzIGFycm93LCBVKzIxOTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgdWFyciAgICAgIiYjODU5MzsiPiA8IS0tIHVwd2FyZHMgYXJyb3csIFUrMjE5MSBJU09udW0tLT4KLTwhRU5USVRZIHJhcnIgICAgICImIzg1OTQ7Ij4gPCEtLSByaWdodHdhcmRzIGFycm93LCBVKzIxOTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZGFyciAgICAgIiYjODU5NTsiPiA8IS0tIGRvd253YXJkcyBhcnJvdywgVSsyMTkzIElTT251bSAtLT4KLTwhRU5USVRZIGhhcnIgICAgICImIzg1OTY7Ij4gPCEtLSBsZWZ0IHJpZ2h0IGFycm93LCBVKzIxOTQgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGNyYXJyICAgICImIzg2Mjk7Ij4gPCEtLSBkb3dud2FyZHMgYXJyb3cgd2l0aCBjb3JuZXIgbGVmdHdhcmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjYXJyaWFnZSByZXR1cm4sIFUrMjFCNSBORVcgLS0+Ci08IUVOVElUWSBsQXJyICAgICAiJiM4NjU2OyI+IDwhLS0gbGVmdHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQwIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoYXQgbEFyciBpcyB0aGUgc2FtZSBhcyB0aGUgJ2lzIGltcGxpZWQgYnknIGFycm93Ci0gICAgYnV0IGFsc28gZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgY2hhcmFjdGVyIGZvciB0aGF0IGZ1bmN0aW9uLiBTbyA/IGxBcnIgY2FuCi0gICAgYmUgdXNlZCBmb3IgJ2lzIGltcGxpZWQgYnknIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSB1QXJyICAgICAiJiM4NjU3OyI+IDwhLS0gdXB3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMSBJU09hbXNhIC0tPgotPCFFTlRJVFkgckFyciAgICAgIiYjODY1ODsiPiA8IS0tIHJpZ2h0d2FyZHMgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFEMiBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGlzIGlzIHRoZSAnaW1wbGllcycgY2hhcmFjdGVyIGJ1dCBkb2VzIG5vdCBoYXZlIAotICAgICBhbm90aGVyIGNoYXJhY3RlciB3aXRoIHRoaXMgZnVuY3Rpb24gc28gPwotICAgICByQXJyIGNhbiBiZSB1c2VkIGZvciAnaW1wbGllcycgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIGRBcnIgICAgICImIzg2NTk7Ij4gPCEtLSBkb3dud2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDMgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGhBcnIgICAgICImIzg2NjA7Ij4gPCEtLSBsZWZ0IHJpZ2h0IGRvdWJsZSBhcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxRDQgSVNPYW1zYSAtLT4KLQotPCEtLSBNYXRoZW1hdGljYWwgT3BlcmF0b3JzIC0tPgotPCFFTlRJVFkgZm9yYWxsICAgIiYjODcwNDsiPiA8IS0tIGZvciBhbGwsIFUrMjIwMCBJU090ZWNoIC0tPgotPCFFTlRJVFkgcGFydCAgICAgIiYjODcwNjsiPiA8IS0tIHBhcnRpYWwgZGlmZmVyZW50aWFsLCBVKzIyMDIgSVNPdGVjaCAgLS0+Ci08IUVOVElUWSBleGlzdCAgICAiJiM4NzA3OyI+IDwhLS0gdGhlcmUgZXhpc3RzLCBVKzIyMDMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVtcHR5ICAgICImIzg3MDk7Ij4gPCEtLSBlbXB0eSBzZXQgPSBudWxsIHNldCA9IGRpYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNSBJU09hbXNvIC0tPgotPCFFTlRJVFkgbmFibGEgICAgIiYjODcxMTsiPiA8IS0tIG5hYmxhID0gYmFja3dhcmQgZGlmZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMDcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGlzaW4gICAgICImIzg3MTI7Ij4gPCEtLSBlbGVtZW50IG9mLCBVKzIyMDggSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5vdGluICAgICImIzg3MTM7Ij4gPCEtLSBub3QgYW4gZWxlbWVudCBvZiwgVSsyMjA5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBuaSAgICAgICAiJiM4NzE1OyI+IDwhLS0gY29udGFpbnMgYXMgbWVtYmVyLCBVKzIyMEIgSVNPdGVjaCAtLT4KLTwhLS0gc2hvdWxkIHRoZXJlIGJlIGEgbW9yZSBtZW1vcmFibGUgbmFtZSB0aGFuICduaSc/IC0tPgotPCFFTlRJVFkgcHJvZCAgICAgIiYjODcxOTsiPiA8IS0tIG4tYXJ5IHByb2R1Y3QgPSBwcm9kdWN0IHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjBGIElTT2Ftc2IgLS0+Ci08IS0tIHByb2QgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTAgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHBpJyB0aG91Z2gKLSAgICAgdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIHN1bSAgICAgICImIzg3MjE7Ij4gPCEtLSBuLWFyeSBzdW1hdGlvbiwgVSsyMjExIElTT2Ftc2IgLS0+Ci08IS0tIHN1bSBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMyAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEnCi0gICAgIHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgbWludXMgICAgIiYjODcyMjsiPiA8IS0tIG1pbnVzIHNpZ24sIFUrMjIxMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgbG93YXN0ICAgIiYjODcyNzsiPiA8IS0tIGFzdGVyaXNrIG9wZXJhdG9yLCBVKzIyMTcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHJhZGljICAgICImIzg3MzA7Ij4gPCEtLSBzcXVhcmUgcm9vdCA9IHJhZGljYWwgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMUEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHByb3AgICAgICImIzg3MzM7Ij4gPCEtLSBwcm9wb3J0aW9uYWwgdG8sIFUrMjIxRCBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW5maW4gICAgIiYjODczNDsiPiA8IS0tIGluZmluaXR5LCBVKzIyMUUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFuZyAgICAgICImIzg3MzY7Ij4gPCEtLSBhbmdsZSwgVSsyMjIwIElTT2Ftc28gLS0+Ci08IUVOVElUWSBhbmQgICAgICAiJiM4NzQzOyI+IDwhLS0gbG9naWNhbCBhbmQgPSB3ZWRnZSwgVSsyMjI3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvciAgICAgICAiJiM4NzQ0OyI+IDwhLS0gbG9naWNhbCBvciA9IHZlZSwgVSsyMjI4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjYXAgICAgICAiJiM4NzQ1OyI+IDwhLS0gaW50ZXJzZWN0aW9uID0gY2FwLCBVKzIyMjkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGN1cCAgICAgICImIzg3NDY7Ij4gPCEtLSB1bmlvbiA9IGN1cCwgVSsyMjJBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbnQgICAgICAiJiM4NzQ3OyI+IDwhLS0gaW50ZWdyYWwsIFUrMjIyQiBJU090ZWNoIC0tPgotPCFFTlRJVFkgdGhlcmU0ICAgIiYjODc1NjsiPiA8IS0tIHRoZXJlZm9yZSwgVSsyMjM0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzaW0gICAgICAiJiM4NzY0OyI+IDwhLS0gdGlsZGUgb3BlcmF0b3IgPSB2YXJpZXMgd2l0aCA9IHNpbWlsYXIgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjNDIElTT3RlY2ggLS0+Ci08IS0tIHRpbGRlIG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgdGhlIHRpbGRlLCBVKzAwN0UsCi0gICAgIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgdG8gcmVwcmVzZW50IGJvdGggIC0tPgotPCFFTlRJVFkgY29uZyAgICAgIiYjODc3MzsiPiA8IS0tIGFwcHJveGltYXRlbHkgZXF1YWwgdG8sIFUrMjI0NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYXN5bXAgICAgIiYjODc3NjsiPiA8IS0tIGFsbW9zdCBlcXVhbCB0byA9IGFzeW1wdG90aWMgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjQ4IElTT2Ftc3IgLS0+Ci08IUVOVElUWSBuZSAgICAgICAiJiM4ODAwOyI+IDwhLS0gbm90IGVxdWFsIHRvLCBVKzIyNjAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVxdWl2ICAgICImIzg4MDE7Ij4gPCEtLSBpZGVudGljYWwgdG8sIFUrMjI2MSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbGUgICAgICAgIiYjODgwNDsiPiA8IS0tIGxlc3MtdGhhbiBvciBlcXVhbCB0bywgVSsyMjY0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBnZSAgICAgICAiJiM4ODA1OyI+IDwhLS0gZ3JlYXRlci10aGFuIG9yIGVxdWFsIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI2NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3ViICAgICAgIiYjODgzNDsiPiA8IS0tIHN1YnNldCBvZiwgVSsyMjgyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXAgICAgICAiJiM4ODM1OyI+IDwhLS0gc3VwZXJzZXQgb2YsIFUrMjI4MyBJU090ZWNoIC0tPgotPCEtLSBub3RlIHRoYXQgbnN1cCwgJ25vdCBhIHN1cGVyc2V0IG9mLCBVKzIyODMnIGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBTeW1ib2wgCi0gICAgIGZvbnQgZW5jb2RpbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC4gU2hvdWxkIGl0IGJlLCBmb3Igc3ltbWV0cnk/Ci0gICAgIEl0IGlzIGluIElTT2Ftc24gIC0tPiAKLTwhRU5USVRZIG5zdWIgICAgICImIzg4MzY7Ij4gPCEtLSBub3QgYSBzdWJzZXQgb2YsIFUrMjI4NCBJU09hbXNuIC0tPgotPCFFTlRJVFkgc3ViZSAgICAgIiYjODgzODsiPiA8IS0tIHN1YnNldCBvZiBvciBlcXVhbCB0bywgVSsyMjg2IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXBlICAgICAiJiM4ODM5OyI+IDwhLS0gc3VwZXJzZXQgb2Ygb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjg3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvcGx1cyAgICAiJiM4ODUzOyI+IDwhLS0gY2lyY2xlZCBwbHVzID0gZGlyZWN0IHN1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTUgSVNPYW1zYiAtLT4KLTwhRU5USVRZIG90aW1lcyAgICImIzg4NTU7Ij4gPCEtLSBjaXJjbGVkIHRpbWVzID0gdmVjdG9yIHByb2R1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjk3IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBwZXJwICAgICAiJiM4ODY5OyI+IDwhLS0gdXAgdGFjayA9IG9ydGhvZ29uYWwgdG8gPSBwZXJwZW5kaWN1bGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjJBNSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2RvdCAgICAgIiYjODkwMTsiPiA8IS0tIGRvdCBvcGVyYXRvciwgVSsyMkM1IElTT2Ftc2IgLS0+Ci08IS0tIGRvdCBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDBCNyBtaWRkbGUgZG90IC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsIC0tPgotPCFFTlRJVFkgbGNlaWwgICAgIiYjODk2ODsiPiA8IS0tIGxlZnQgY2VpbGluZyA9IGFwbCB1cHN0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMwOCBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJjZWlsICAgICImIzg5Njk7Ij4gPCEtLSByaWdodCBjZWlsaW5nLCBVKzIzMDkgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsZmxvb3IgICAiJiM4OTcwOyI+IDwhLS0gbGVmdCBmbG9vciA9IGFwbCBkb3duc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzBBIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmZsb29yICAgIiYjODk3MTsiPiA8IS0tIHJpZ2h0IGZsb29yLCBVKzIzMEIgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsYW5nICAgICAiJiM5MDAxOyI+IDwhLS0gbGVmdC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0gYnJhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMyOSBJU090ZWNoIC0tPgotPCEtLSBsYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNDICdsZXNzIHRoYW4nIAotICAgICBvciBVKzIwMzkgJ3NpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLTwhRU5USVRZIHJhbmcgICAgICImIzkwMDI7Ij4gPCEtLSByaWdodC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0ga2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMyQSBJU090ZWNoIC0tPgotPCEtLSByYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNFICdncmVhdGVyIHRoYW4nIAotICAgICBvciBVKzIwM0EgJ3NpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci0KLTwhLS0gR2VvbWV0cmljIFNoYXBlcyAtLT4KLTwhRU5USVRZIGxveiAgICAgICImIzk2NzQ7Ij4gPCEtLSBsb3plbmdlLCBVKzI1Q0EgSVNPcHViIC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgU3ltYm9scyAtLT4KLTwhRU5USVRZIHNwYWRlcyAgICImIzk4MjQ7Ij4gPCEtLSBibGFjayBzcGFkZSBzdWl0LCBVKzI2NjAgSVNPcHViIC0tPgotPCEtLSBibGFjayBoZXJlIHNlZW1zIHRvIG1lYW4gZmlsbGVkIGFzIG9wcG9zZWQgdG8gaG9sbG93IC0tPgotPCFFTlRJVFkgY2x1YnMgICAgIiYjOTgyNzsiPiA8IS0tIGJsYWNrIGNsdWIgc3VpdCA9IHNoYW1yb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2MyBJU09wdWIgLS0+Ci08IUVOVElUWSBoZWFydHMgICAiJiM5ODI5OyI+IDwhLS0gYmxhY2sgaGVhcnQgc3VpdCA9IHZhbGVudGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzI2NjUgSVNPcHViIC0tPgotPCFFTlRJVFkgZGlhbXMgICAgIiYjOTgzMDsiPiA8IS0tIGJsYWNrIGRpYW1vbmQgc3VpdCwgVSsyNjY2IElTT3B1YiAtLT4KLQotCi08IUVOVElUWSAlIHhodG1sLXNwZWNpYWwKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtc3BlY2lhbC5lbnQiID4KLTwhLS0gU3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAgICAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3BlY2lhbC5lbnQiPgotICAgICAlSFRNTHNwZWNpYWw7Ci0tLT4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aCBhbnkKLSAgICAgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgY2hhcmFjdGVyIG51bWJlcnMKLSAgICAgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiB2YWx1ZXMgYXJlIGRlY2ltYWwKLSAgICAgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZSBkb2N1bWVudAotICAgICBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgVW5pY29kZSBuYW1lcy4gCi0tLT4KLQotPCEtLSBDMCBDb250cm9scyBhbmQgQmFzaWMgTGF0aW4gLS0+Ci08IUVOVElUWSBxdW90ICAgICImIzM0OyI+IDwhLS0gIHF1b3RhdGlvbiBtYXJrID0gQVBMIHF1b3RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMDIyIElTT251bSAtLT4KLTwhRU5USVRZIGFtcCAgICAgIiYjMzg7IzM4OyI+IDwhLS0gIGFtcGVyc2FuZCwgVSswMDI2IElTT251bSAtLT4KLTwhRU5USVRZIGx0ICAgICAgIiYjMzg7IzYwOyI+IDwhLS0gIGxlc3MtdGhhbiBzaWduLCBVKzAwM0MgSVNPbnVtIC0tPgotPCFFTlRJVFkgZ3QgICAgICAiJiM2MjsiPiA8IS0tICBncmVhdGVyLXRoYW4gc2lnbiwgVSswMDNFIElTT251bSAtLT4KLTwhRU5USVRZIGFwb3MJICImIzM5OyI+IDwhLS0gIGFwb3N0cm9waGUgbWFyaywgVSswMDI3IElTT251bSAtLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1BIC0tPgotPCFFTlRJVFkgT0VsaWcgICAiJiMzMzg7Ij4gPCEtLSAgbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBPRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE1MiBJU09sYXQyIC0tPgotPCFFTlRJVFkgb2VsaWcgICAiJiMzMzk7Ij4gPCEtLSAgbGF0aW4gc21hbGwgbGlnYXR1cmUgb2UsIFUrMDE1MyBJU09sYXQyIC0tPgotPCEtLSBsaWdhdHVyZSBpcyBhIG1pc25vbWVyLCB0aGlzIGlzIGEgc2VwYXJhdGUgY2hhcmFjdGVyIGluIHNvbWUgbGFuZ3VhZ2VzIC0tPgotPCFFTlRJVFkgU2Nhcm9uICAiJiMzNTI7Ij4gPCEtLSAgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgUyB3aXRoIGNhcm9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTYwIElTT2xhdDIgLS0+Ci08IUVOVElUWSBzY2Fyb24gICImIzM1MzsiPiA8IS0tICBsYXRpbiBzbWFsbCBsZXR0ZXIgcyB3aXRoIGNhcm9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTYxIElTT2xhdDIgLS0+Ci08IUVOVElUWSBZdW1sICAgICImIzM3NjsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTc4IElTT2xhdDIgLS0+Ci0KLTwhLS0gU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzIC0tPgotPCFFTlRJVFkgY2lyYyAgICAiJiM3MTA7Ij4gPCEtLSAgbW9kaWZpZXIgbGV0dGVyIGNpcmN1bWZsZXggYWNjZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMkM2IElTT3B1YiAtLT4KLTwhRU5USVRZIHRpbGRlICAgIiYjNzMyOyI+IDwhLS0gIHNtYWxsIHRpbGRlLCBVKzAyREMgSVNPZGlhIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBlbnNwICAgICImIzgxOTQ7Ij4gPCEtLSBlbiBzcGFjZSwgVSsyMDAyIElTT3B1YiAtLT4KLTwhRU5USVRZIGVtc3AgICAgIiYjODE5NTsiPiA8IS0tIGVtIHNwYWNlLCBVKzIwMDMgSVNPcHViIC0tPgotPCFFTlRJVFkgdGhpbnNwICAiJiM4MjAxOyI+IDwhLS0gdGhpbiBzcGFjZSwgVSsyMDA5IElTT3B1YiAtLT4KLTwhRU5USVRZIHp3bmogICAgIiYjODIwNDsiPiA8IS0tIHplcm8gd2lkdGggbm9uLWpvaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAwQyBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSB6d2ogICAgICImIzgyMDU7Ij4gPCEtLSB6ZXJvIHdpZHRoIGpvaW5lciwgVSsyMDBEIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIGxybSAgICAgIiYjODIwNjsiPiA8IS0tIGxlZnQtdG8tcmlnaHQgbWFyaywgVSsyMDBFIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHJsbSAgICAgIiYjODIwNzsiPiA8IS0tIHJpZ2h0LXRvLWxlZnQgbWFyaywgVSsyMDBGIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIG5kYXNoICAgIiYjODIxMTsiPiA8IS0tIGVuIGRhc2gsIFUrMjAxMyBJU09wdWIgLS0+Ci08IUVOVElUWSBtZGFzaCAgICImIzgyMTI7Ij4gPCEtLSBlbSBkYXNoLCBVKzIwMTQgSVNPcHViIC0tPgotPCFFTlRJVFkgbHNxdW8gICAiJiM4MjE2OyI+IDwhLS0gbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTggSVNPbnVtIC0tPgotPCFFTlRJVFkgcnNxdW8gICAiJiM4MjE3OyI+IDwhLS0gcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDE5IElTT251bSAtLT4KLTwhRU5USVRZIHNicXVvICAgIiYjODIxODsiPiA8IS0tIHNpbmdsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFBIE5FVyAtLT4KLTwhRU5USVRZIGxkcXVvICAgIiYjODIyMDsiPiA8IS0tIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFDIElTT251bSAtLT4KLTwhRU5USVRZIHJkcXVvICAgIiYjODIyMTsiPiA8IS0tIHJpZ2h0IGRvdWJsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxRCBJU09udW0gLS0+Ci08IUVOVElUWSBiZHF1byAgICImIzgyMjI7Ij4gPCEtLSBkb3VibGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxRSBORVcgLS0+Ci08IUVOVElUWSBkYWdnZXIgICImIzgyMjQ7Ij4gPCEtLSBkYWdnZXIsIFUrMjAyMCBJU09wdWIgLS0+Ci08IUVOVElUWSBEYWdnZXIgICImIzgyMjU7Ij4gPCEtLSBkb3VibGUgZGFnZ2VyLCBVKzIwMjEgSVNPcHViIC0tPgotPCFFTlRJVFkgcGVybWlsICAiJiM4MjQwOyI+IDwhLS0gcGVyIG1pbGxlIHNpZ24sIFUrMjAzMCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbHNhcXVvICAiJiM4MjQ5OyI+IDwhLS0gc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMzkgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSBsc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIHJzYXF1byAgIiYjODI1MDsiPiA8IS0tIHNpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzQSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIHJzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgZXVybyAgICImIzgzNjQ7Ij4gPCEtLSAgZXVybyBzaWduLCBVKzIwQUMgTkVXIC0tPgotCi0KLTwhLS0gZW5kIG9mIHhodG1sLWNoYXJlbnQtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZnJhbWV3b3JrLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gUG9zdC1GcmFtZXdvcmsgUmVkZWNsYXJhdGlvbiBwbGFjZWhvbGRlciAgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gdGhpcyBzZXJ2ZXMgYXMgYSBsb2NhdGlvbiB0byBpbnNlcnQgbWFya3VwIGRlY2xhcmF0aW9ucwotICAgICBpbnRvIHRoZSBEVEQgZm9sbG93aW5nIHRoZSBmcmFtZXdvcmsgZGVjbGFyYXRpb25zLgotLS0+Ci08IUVOVElUWSAlIHhodG1sLXBvc3Rmdy1yZWRlY2wubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1wb3N0ZnctcmVkZWNsLm1vZHVsZTtbCi0leGh0bWwtcG9zdGZ3LXJlZGVjbC5tb2Q7Ci08IS0tIGVuZCBvZiB4aHRtbC1wb3N0ZnctcmVkZWNsLm1vZHVsZSAtLT5dXT4KLQotPCEtLSBUZXh0IE1vZHVsZSAoUmVxdWlyZWQpICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC10ZXh0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXRleHQubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtdGV4dC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFRleHQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtdGV4dC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBUZXh0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC10ZXh0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFRleHQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC10ZXh0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFRleHR1YWwgQ29udGVudAotCi0gICAgIFRoZSBUZXh0IG1vZHVsZSBpbmNsdWRlcyBkZWNsYXJhdGlvbnMgZm9yIGFsbCBjb3JlCi0gICAgIHRleHQgY29udGFpbmVyIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtaW5sc3RydWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHN0cnVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWlubHN0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxzdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFN0cnVjdHVyYWwKLQotICAgICAgICBiciwgc3BhbgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcwotICAgICB1c2VkIHRvIHN1cHBvcnQgaW5saW5lLWxldmVsIHN0cnVjdHVyYWwgbWFya3VwLgotLS0+Ci0KLTwhLS0gYnI6IGZvcmNlZCBsaW5lIGJyZWFrIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYnIuZWxlbWVudDtbCi0KLTwhRU5USVRZICUgYnIuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGJyLnFuYW1lICAiYnIiID4KLTwhRUxFTUVOVCAlYnIucW5hbWU7ICAlYnIuY29udGVudDsgPgotCi08IS0tIGVuZCBvZiBici5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYnIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJyLnFuYW1lOwotICAgICAgJUNvcmUuYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYnIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBzcGFuOiBnZW5lcmljIGlubGluZSBjb250YWluZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc3Bhbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNwYW4uZWxlbWVudDtbCi08IUVOVElUWSAlIHNwYW4uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzcGFuLnFuYW1lICAic3BhbiIgPgotPCFFTEVNRU5UICVzcGFuLnFuYW1lOyAgJXNwYW4uY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3Bhbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNwYW4uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzcGFuLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzcGFuLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzcGFuLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHN0cnVjdC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWlubHBocmFzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHBocmFzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHBocmFzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1pbmxwaHJhcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgUGhyYXNhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxwaHJhcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHBocmFzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBQaHJhc2FsCi0KLSAgICAgICAgYWJiciwgYWNyb255bSwgY2l0ZSwgY29kZSwgZGZuLCBlbSwga2JkLCBxLCBzYW1wLCBzdHJvbmcsIHZhcgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgaW5saW5lLWxldmVsIHBocmFzYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgYWJici5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWFiYnIuZWxlbWVudDtbCi08IUVOVElUWSAlIGFiYnIuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBhYmJyLnFuYW1lICAiYWJiciIgPgotPCFFTEVNRU5UICVhYmJyLnFuYW1lOyAgJWFiYnIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYWJici5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGFiYnIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhYmJyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhYmJyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBhYmJyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgYWNyb255bS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWFjcm9ueW0uZWxlbWVudDtbCi08IUVOVElUWSAlIGFjcm9ueW0uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBhY3JvbnltLnFuYW1lICAiYWNyb255bSIgPgotPCFFTEVNRU5UICVhY3JvbnltLnFuYW1lOyAgJWFjcm9ueW0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgYWNyb255bS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGFjcm9ueW0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhY3JvbnltLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhY3JvbnltLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBhY3JvbnltLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgY2l0ZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNpdGUuZWxlbWVudDtbCi08IUVOVElUWSAlIGNpdGUuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBjaXRlLnFuYW1lICAiY2l0ZSIgPgotPCFFTEVNRU5UICVjaXRlLnFuYW1lOyAgJWNpdGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgY2l0ZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNpdGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjaXRlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjaXRlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjaXRlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgY29kZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNvZGUuZWxlbWVudDtbCi08IUVOVElUWSAlIGNvZGUuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBjb2RlLnFuYW1lICAiY29kZSIgPgotPCFFTEVNRU5UICVjb2RlLnFuYW1lOyAgJWNvZGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgY29kZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNvZGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjb2RlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjb2RlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjb2RlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGZuLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGZuLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkZm4uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBkZm4ucW5hbWUgICJkZm4iID4KLTwhRUxFTUVOVCAlZGZuLnFuYW1lOyAgJWRmbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkZm4uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZm4uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkZm4uYXR0bGlzdDtbCi08IUFUVExJU1QgJWRmbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGZuLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgZW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVlbS5lbGVtZW50O1sKLTwhRU5USVRZICUgZW0uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBlbS5xbmFtZSAgImVtIiA+Ci08IUVMRU1FTlQgJWVtLnFuYW1lOyAgJWVtLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGVtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZW0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVlbS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZW0ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGVtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUga2JkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsla2JkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBrYmQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBrYmQucW5hbWUgICJrYmQiID4KLTwhRUxFTUVOVCAla2JkLnFuYW1lOyAgJWtiZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBrYmQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBrYmQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVrYmQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWtiZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Yga2JkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgcS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXEuZWxlbWVudDtbCi08IUVOVElUWSAlIHEuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBxLnFuYW1lICAicSIgPgotPCFFTEVNRU5UICVxLnFuYW1lOyAgJXEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVxLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVxLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaXRlICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBxLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2FtcC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNhbXAuZWxlbWVudDtbCi08IUVOVElUWSAlIHNhbXAuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzYW1wLnFuYW1lICAic2FtcCIgPgotPCFFTEVNRU5UICVzYW1wLnFuYW1lOyAgJXNhbXAuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2FtcC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNhbXAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzYW1wLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzYW1wLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzYW1wLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Ryb25nLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3Ryb25nLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzdHJvbmcuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzdHJvbmcucW5hbWUgICJzdHJvbmciID4KLTwhRUxFTUVOVCAlc3Ryb25nLnFuYW1lOyAgJXN0cm9uZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzdHJvbmcuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdHJvbmcuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzdHJvbmcuYXR0bGlzdDtbCi08IUFUVExJU1QgJXN0cm9uZy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3Ryb25nLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgdmFyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldmFyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB2YXIuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSB2YXIucW5hbWUgICJ2YXIiID4KLTwhRUxFTUVOVCAldmFyLnFuYW1lOyAgJXZhci5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB2YXIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB2YXIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV2YXIuYXR0bGlzdDtbCi08IUFUVExJU1QgJXZhci5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdmFyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHBocmFzLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYmxrc3RydWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWJsa3N0cnVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ibGtzdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmxrc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJsb2NrIFN0cnVjdHVyYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJsa3N0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmxrc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJsb2NrIFN0cnVjdHVyYWwKLQotICAgICAgICBkaXYsIHAKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGJsb2NrLWxldmVsIHN0cnVjdHVyYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgZGl2LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGl2LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkaXYuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZGl2LnFuYW1lICAiZGl2IiA+Ci08IUVMRU1FTlQgJWRpdi5xbmFtZTsgICVkaXYuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGl2LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGl2LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGl2LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkaXYucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRpdi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotPCFFTlRJVFkgJSBwLnFuYW1lICAicCIgPgotPCFFTEVNRU5UICVwLnFuYW1lOyAgJXAuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVwLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBwLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJsa3N0cnVjdC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWJsa3BocmFzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWJsa3BocmFzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJsa3BocmFzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUGhyYXNhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJsa3BocmFzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJsb2NrIFBocmFzYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJsa3BocmFzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ibGtwaHJhcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBQaHJhc2FsCi0KLSAgICAgICAgYWRkcmVzcywgYmxvY2txdW90ZSwgcHJlLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBwaHJhc2FsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGFkZHJlc3MuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhZGRyZXNzLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhZGRyZXNzLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotPCFFTlRJVFkgJSBhZGRyZXNzLnFuYW1lICAiYWRkcmVzcyIgPgotPCFFTEVNRU5UICVhZGRyZXNzLnFuYW1lOyAgJWFkZHJlc3MuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYWRkcmVzcy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGFkZHJlc3MuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhZGRyZXNzLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhZGRyZXNzLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBhZGRyZXNzLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmxvY2txdW90ZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJsb2NrcXVvdGUuZWxlbWVudDtbCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuY29udGVudAotICAgICAiKCAlQmxvY2subWl4OyApKyIKLT4KLTwhRU5USVRZICUgYmxvY2txdW90ZS5xbmFtZSAgImJsb2NrcXVvdGUiID4KLTwhRUxFTUVOVCAlYmxvY2txdW90ZS5xbmFtZTsgICVibG9ja3F1b3RlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJsb2NrcXVvdGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmxvY2txdW90ZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmxvY2txdW90ZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgYmxvY2txdW90ZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHByZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXByZS5lbGVtZW50O1sKLTwhRU5USVRZICUgcHJlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgfCAldHQucW5hbWU7IHwgJWkucW5hbWU7IHwgJWIucW5hbWU7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICB8ICVzY3JpcHQucW5hbWU7IHwgJW1hcC5xbmFtZTsKLSAgICAgICVJbmxpbmUuZXh0cmE7ICkqIgotPgotPCFFTlRJVFkgJSBwcmUucW5hbWUgICJwcmUiID4KLTwhRUxFTUVOVCAlcHJlLnFuYW1lOyAgJXByZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwcmUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwcmUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwcmUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXByZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgeG1sOnNwYWNlICAgICggcHJlc2VydmUgKSAgICAgICAgICAgICAjRklYRUQgJ3ByZXNlcnZlJwotPgotPCEtLSBlbmQgb2YgcHJlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLiAgSGVhZGluZyBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBIZWFkaW5nLmNvbnRlbnQgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLQotPCFFTlRJVFkgJSBoMS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgxLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMS5xbmFtZSAgImgxIiA+Ci08IUVMRU1FTlQgJWgxLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgxLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDEuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMi5xbmFtZSAgImgyIiA+Ci08IUVMRU1FTlQgJWgyLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgzLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMy5xbmFtZSAgImgzIiA+Ci08IUVMRU1FTlQgJWgzLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDMuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgzLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDMuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNC5xbmFtZSAgImg0IiA+Ci08IUVMRU1FTlQgJWg0LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDQuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg1LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNS5xbmFtZSAgImg1IiA+Ci08IUVMRU1FTlQgJWg1LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg1LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg2LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNi5xbmFtZSAgImg2IiA+Ci08IUVMRU1FTlQgJWg2LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDYuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg2LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDYuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmxrcGhyYXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtdGV4dC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEh5cGVydGV4dCBNb2R1bGUgKHJlcXVpcmVkKSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWh5cGVydGV4dC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1oeXBlcnRleHQubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaHlwZXJ0ZXh0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSHlwZXJ0ZXh0IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWh5cGVydGV4dC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBIeXBlcnRleHQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1oeXBlcnRleHQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSHlwZXJ0ZXh0IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaHlwZXJ0ZXh0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEh5cGVydGV4dAotCi0gICAgICAgIGEKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgYW5jaG9yICgnYScpIGVsZW1lbnQgdHlwZSwgd2hpY2gKLSAgICAgZGVmaW5lcyB0aGUgc291cmNlIG9mIGEgaHlwZXJ0ZXh0IGxpbmsuIFRoZSBkZXN0aW5hdGlvbgotICAgICAob3IgbGluayAndGFyZ2V0JykgaXMgaWRlbnRpZmllZCB2aWEgaXRzICdpZCcgYXR0cmlidXRlCi0gICAgIHJhdGhlciB0aGFuIHRoZSAnbmFtZScgYXR0cmlidXRlIGFzIHdhcyB1c2VkIGluIEhUTUwuCi0tLT4KLQotPCEtLSAuLi4uLi4uLi4uLi4gIEFuY2hvciBFbGVtZW50ICAuLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWEuZWxlbWVudDtbCi08IUVOVElUWSAlIGEuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubE5vQW5jaG9yLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGEucW5hbWUgICJhIiA+Ci08IUVMRU1FTlQgJWEucW5hbWU7ICAlYS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWEuYXR0bGlzdDtbCi08IUFUVExJU1QgJWEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoYXJzZXQgICAgICAlQ2hhcnNldC5kYXRhdHlwZTsgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGhyZWZsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQKLSAgICAgIHJlbCAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHJldiAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaHlwZXJ0ZXh0LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gTGlzdHMgTW9kdWxlIChyZXF1aXJlZCkgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtbGlzdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1saXN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWxpc3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaXN0cyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1saXN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIExpc3RzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWxpc3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGlzdHMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1saXN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExpc3RzCi0KLSAgICAgICAgZGwsIGR0LCBkZCwgb2wsIHVsLCBsaQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBsaXN0LW9yaWVudGVkIGVsZW1lbnQgdHlwZXMKLSAgICAgYW5kIHRoZWlyIGF0dHJpYnV0ZXMuCi0tLT4KLQotPCFFTlRJVFkgJSBkbC5xbmFtZSAgImRsIiA+Ci08IUVOVElUWSAlIGR0LnFuYW1lICAiZHQiID4KLTwhRU5USVRZICUgZGQucW5hbWUgICJkZCIgPgotPCFFTlRJVFkgJSBvbC5xbmFtZSAgIm9sIiA+Ci08IUVOVElUWSAlIHVsLnFuYW1lICAidWwiID4KLTwhRU5USVRZICUgbGkucW5hbWUgICJsaSIgPgotCi08IS0tIGRsOiBEZWZpbml0aW9uIExpc3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkbC5jb250ZW50ICAiKCAlZHQucW5hbWU7IHwgJWRkLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVkbC5xbmFtZTsgICVkbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGwuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGR0OiBEZWZpbml0aW9uIFRlcm0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWR0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkdC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWR0LnFuYW1lOyAgJWR0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGR0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZHQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZHQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGR0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZGQ6IERlZmluaXRpb24gRGVzY3JpcHRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGRkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGQuZWxlbWVudDtbCi08IUVOVElUWSAlIGRkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWRkLnFuYW1lOyAgJWRkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gb2w6IE9yZGVyZWQgTGlzdCAobnVtYmVyZWQgc3R5bGVzKSAuLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG9sLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb2wuZWxlbWVudDtbCi08IUVOVElUWSAlIG9sLmNvbnRlbnQgICIoICVsaS5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlb2wucW5hbWU7ICAlb2wuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb2wuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9sLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygb2wuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB1bDogVW5vcmRlcmVkIExpc3QgKGJ1bGxldCBzdHlsZXMpIC4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV1bC5lbGVtZW50O1sKLTwhRU5USVRZICUgdWwuY29udGVudCAgIiggJWxpLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV1bC5xbmFtZTsgICV1bC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB1bC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHVsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldWwuYXR0bGlzdDtbCi08IUFUVExJU1QgJXVsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB1bC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGxpOiBMaXN0IEl0ZW0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsaS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxpLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBsaS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICVsaS5xbmFtZTsgICVsaS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsaS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxpLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGkuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxpLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBsaS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1saXN0LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gRWRpdCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtZWRpdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1lZGl0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWVkaXQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBFZGl0aW5nIEVsZW1lbnRzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWVkaXQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRWRpdGluZyBFbGVtZW50cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtZWRpdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBFZGl0aW5nIE1hcmt1cCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWVkaXQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRWRpdGluZyBFbGVtZW50cwotCi0gICAgICAgIGlucywgZGVsCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlcyB1c2VkIHRvIGluZGljYXRlCi0gICAgIGluc2VydGVkIGFuZCBkZWxldGVkIGNvbnRlbnQgd2hpbGUgZWRpdGluZyBhIGRvY3VtZW50LgotLS0+Ci0KLTwhLS0gaW5zOiBJbnNlcnRlZCBUZXh0ICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGlucy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWlucy5lbGVtZW50O1sKLTwhRU5USVRZICUgaW5zLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGlucy5xbmFtZSAgImlucyIgPgotPCFFTEVNRU5UICVpbnMucW5hbWU7ICAlaW5zLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGlucy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGlucy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWlucy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaW5zLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaXRlICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkYXRldGltZSAgICAgJURhdGV0aW1lLmRhdGF0eXBlOyAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBpbnMuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBkZWw6IERlbGV0ZWQgVGV4dCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZGVsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGVsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkZWwuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZGVsLnFuYW1lICAiZGVsIiA+Ci08IUVMRU1FTlQgJWRlbC5xbmFtZTsgICVkZWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGVsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGVsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGVsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZWwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNpdGUgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRhdGV0aW1lICAgICAlRGF0ZXRpbWUuZGF0YXR5cGU7ICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGRlbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1lZGl0LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gQklESSBPdmVycmlkZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtYmRvLm1vZHVsZSAiJVhIVE1MLmJpZGk7IiA+Ci08IVsleGh0bWwtYmRvLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJkby5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJJREkgT3ZlcnJpZGUgRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iZG8tMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQkRPIEVsZW1lbnQgTW9kdWxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmRvLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJETyBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmRvLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJpZGlyZWN0aW9uYWwgT3ZlcnJpZGUgKGJkbykgRWxlbWVudAotCi0gICAgIFRoaXMgbW9kdWxlcyBkZWNsYXJlcyB0aGUgZWxlbWVudCAnYmRvJywgdXNlZCB0byBvdmVycmlkZSB0aGUKLSAgICAgVW5pY29kZSBiaWRpcmVjdGlvbmFsIGFsZ29yaXRobSBmb3Igc2VsZWN0ZWQgZnJhZ21lbnRzIG9mIHRleHQuCi0KLSAgICAgREVQRU5ERU5DSUVTOgotICAgICBSZWxpZXMgb24gdGhlIGNvbmRpdGlvbmFsIHNlY3Rpb24ga2V5d29yZCAlWEhUTUwuYmlkaTsgZGVjbGFyZWQKLSAgICAgYXMgIklOQ0xVREUiLiBCaWRpcmVjdGlvbmFsIHRleHQgc3VwcG9ydCBpbmNsdWRlcyBib3RoIHRoZSBiZG8KLSAgICAgZWxlbWVudCBhbmQgdGhlICdkaXInIGF0dHJpYnV0ZS4KLS0tPgotCi08IUVOVElUWSAlIGJkby5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJkby5lbGVtZW50O1sKLTwhRU5USVRZICUgYmRvLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYmRvLnFuYW1lICAiYmRvIiA+Ci08IUVMRU1FTlQgJWJkby5xbmFtZTsgICViZG8uY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmRvLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmRvLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmRvLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViZG8ucW5hbWU7Ci0gICAgICAlQ29yZS5hdHRyaWI7Ci0gICAgICB4bWw6bGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVECi0gICAgICBkaXIgICAgICAgICAgKCBsdHIgfCBydGwgKSAgICAgICAgICAgICNSRVFVSVJFRAotPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJkby0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFJ1YnkgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIFJ1YnkuY29tbW9uLmF0dGxpc3RzICJJTkNMVURFIiA+Ci08IUVOVElUWSAlIFJ1YnkuY29tbW9uLmF0dHJpYiAiJUNvbW1vbi5hdHRyaWI7IiA+Ci08IUVOVElUWSAlIHhodG1sLXJ1YnkubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtcnVieS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ydWJ5Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUnVieSAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3J1YnkveGh0bWwtcnVieS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBSdWJ5IE1vZHVsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ydWJ5LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTktMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotICAgICBUaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiB0aGUgVzNDIFJ1YnkgQW5ub3RhdGlvbiBTcGVjaWZpY2F0aW9uOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL3J1YnkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUnVieSAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIvcnVieS94aHRtbC1ydWJ5LTEubW9kIgotCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gUnVieSBFbGVtZW50cwotCi0gICAgICAgIHJ1YnksIHJiYywgcnRjLCByYiwgcnQsIHJwCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBydWJ5IGFubm90YXRpb24gbWFya3VwLgotLS0+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgZWxlbWVudCB0eXBlIG5hbWVzOgotLS0+Ci08IUVOVElUWSAlIHJ1YnkucW5hbWUgICJydWJ5IiA+Ci08IUVOVElUWSAlIHJiYy5xbmFtZSAgInJiYyIgPgotPCFFTlRJVFkgJSBydGMucW5hbWUgICJydGMiID4KLTwhRU5USVRZICUgcmIucW5hbWUgICJyYiIgPgotPCFFTlRJVFkgJSBydC5xbmFtZSAgInJ0IiA+Ci08IUVOVElUWSAlIHJwLnFuYW1lICAicnAiID4KLQotPCEtLSBycCBmYWxsYmFjayBpcyBpbmNsdWRlZCBieSBkZWZhdWx0LgotLS0+Ci08IUVOVElUWSAlIFJ1YnkuZmFsbGJhY2sgIklOQ0xVREUiID4KLTwhRU5USVRZICUgUnVieS5mYWxsYmFjay5tYW5kYXRvcnkgIklHTk9SRSIgPgotCi08IS0tIENvbXBsZXggcnVieSBpcyBpbmNsdWRlZCBieSBkZWZhdWx0OyBpdCBtYXkgYmUgCi0gICAgIG92ZXJyaWRkZW4gYnkgb3RoZXIgbW9kdWxlcyB0byBpZ25vcmUgaXQuCi0tLT4KLTwhRU5USVRZICUgUnVieS5jb21wbGV4ICJJTkNMVURFIiA+Ci0KLTwhLS0gRnJhZ21lbnRzIGZvciB0aGUgY29udGVudCBtb2RlbCBvZiB0aGUgcnVieSBlbGVtZW50IC0tPgotPCFbJVJ1YnkuZmFsbGJhY2s7WwotPCFbJVJ1YnkuZmFsbGJhY2subWFuZGF0b3J5O1sKLTwhRU5USVRZICUgUnVieS5jb250ZW50LnNpbXBsZSAKLSAgICAgIiggJXJiLnFuYW1lOywgJXJwLnFuYW1lOywgJXJ0LnFuYW1lOywgJXJwLnFuYW1lOyApIgotPgotXV0+Ci08IUVOVElUWSAlIFJ1YnkuY29udGVudC5zaW1wbGUgCi0gICAgICIoICVyYi5xbmFtZTssICggJXJ0LnFuYW1lOyB8ICggJXJwLnFuYW1lOywgJXJ0LnFuYW1lOywgJXJwLnFuYW1lOyApICkgKSIKLT4KLV1dPgotPCFFTlRJVFkgJSBSdWJ5LmNvbnRlbnQuc2ltcGxlICIoICVyYi5xbmFtZTssICVydC5xbmFtZTsgKSIgPgotCi08IVslUnVieS5jb21wbGV4O1sKLTwhRU5USVRZICUgUnVieS5jb250ZW50LmNvbXBsZXggCi0gICAgICJ8ICggJXJiYy5xbmFtZTssICVydGMucW5hbWU7LCAlcnRjLnFuYW1lOz8gKSIKLT4KLV1dPgotPCFFTlRJVFkgJSBSdWJ5LmNvbnRlbnQuY29tcGxleCAiIiA+Ci0KLTwhLS0gQ29udGVudCBtb2RlbHMgb2YgdGhlIHJiIGFuZCB0aGUgcnQgZWxlbWVudHMgYXJlIGludGVuZGVkIHRvCi0gICAgIGFsbG93IG90aGVyIGlubGluZS1sZXZlbCBlbGVtZW50cyBvZiBpdHMgcGFyZW50IG1hcmt1cCBsYW5ndWFnZSwKLSAgICAgYnV0IGl0IHNob3VsZCBub3QgaW5jbHVkZSBydWJ5IGRlc2NlbmRlbnQgZWxlbWVudHMuIFRoZSBmb2xsb3dpbmcKLSAgICAgcGFyYW1ldGVyIGVudGl0eSAlTm9SdWJ5LmNvbnRlbnQ7IGNhbiBiZSB1c2VkIHRvIHJlZGVmaW5lCi0gICAgIHRob3NlIGNvbnRlbnQgbW9kZWxzIHdpdGggbWluaW11bSBlZmZvcnQuICBJdCdzIGRlZmluZWQgYXMKLSAgICAgJyggI1BDREFUQSApJyBieSBkZWZhdWx0LgotLS0+Ci08IUVOVElUWSAlIE5vUnVieS5jb250ZW50ICIoICNQQ0RBVEEgKSIgPgotCi08IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAoTlVNQkVSKSAtLT4KLTwhRU5USVRZICUgTnVtYmVyLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHJ1YnkgZWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBydWJ5LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcnVieS5lbGVtZW50O1sKLTwhRU5USVRZICUgcnVieS5jb250ZW50Ci0gICAgICIoICVSdWJ5LmNvbnRlbnQuc2ltcGxlOyAlUnVieS5jb250ZW50LmNvbXBsZXg7ICkiCi0+Ci08IUVMRU1FTlQgJXJ1YnkucW5hbWU7ICAlcnVieS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBydWJ5LmVsZW1lbnQgLS0+XV0+Ci0KLTwhWyVSdWJ5LmNvbXBsZXg7WwotPCEtLSByYmMgKHJ1YnkgYmFzZSBjb21wb25lbnQpIGVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgcmJjLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcmJjLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSByYmMuY29udGVudAotICAgICAiKCVyYi5xbmFtZTspKyIKLT4KLTwhRUxFTUVOVCAlcmJjLnFuYW1lOyAgJXJiYy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiByYmMuZWxlbWVudCAtLT5dXT4KLQotPCEtLSBydGMgKHJ1YnkgdGV4dCBjb21wb25lbnQpIGVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgcnRjLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcnRjLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBydGMuY29udGVudAotICAgICAiKCVydC5xbmFtZTspKyIKLT4KLTwhRUxFTUVOVCAlcnRjLnFuYW1lOyAgJXJ0Yy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBydGMuZWxlbWVudCAtLT5dXT4KLV1dPgotCi08IS0tIHJiIChydWJ5IGJhc2UpIGVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSByYi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXJiLmVsZW1lbnQ7WwotPCEtLSAlcmIuY29udGVudDsgdXNlcyAlTm9SdWJ5LmNvbnRlbnQ7IGFzIGl0cyBjb250ZW50IG1vZGVsLAotICAgICB3aGljaCBpcyAnKCAjUENEQVRBICknIGJ5IGRlZmF1bHQuIEl0IG1heSBiZSBvdmVycmlkZGVuCi0gICAgIGJ5IG90aGVyIG1vZHVsZXMgdG8gYWxsb3cgb3RoZXIgaW5saW5lLWxldmVsIGVsZW1lbnRzCi0gICAgIG9mIGl0cyBwYXJlbnQgbWFya3VwIGxhbmd1YWdlLCBidXQgaXQgc2hvdWxkIG5vdCBpbmNsdWRlCi0gICAgIHJ1YnkgZGVzY2VuZGVudCBlbGVtZW50cy4KLS0tPgotPCFFTlRJVFkgJSByYi5jb250ZW50ICIlTm9SdWJ5LmNvbnRlbnQ7IiA+Ci08IUVMRU1FTlQgJXJiLnFuYW1lOyAgJXJiLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHJiLmVsZW1lbnQgLS0+XV0+Ci0KLTwhLS0gcnQgKHJ1YnkgdGV4dCkgZWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHJ0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcnQuZWxlbWVudDtbCi08IS0tICVydC5jb250ZW50OyB1c2VzICVOb1J1YnkuY29udGVudDsgYXMgaXRzIGNvbnRlbnQgbW9kZWwsCi0gICAgIHdoaWNoIGlzICcoICNQQ0RBVEEgKScgYnkgZGVmYXVsdC4gSXQgbWF5IGJlIG92ZXJyaWRkZW4KLSAgICAgYnkgb3RoZXIgbW9kdWxlcyB0byBhbGxvdyBvdGhlciBpbmxpbmUtbGV2ZWwgZWxlbWVudHMKLSAgICAgb2YgaXRzIHBhcmVudCBtYXJrdXAgbGFuZ3VhZ2UsIGJ1dCBpdCBzaG91bGQgbm90IGluY2x1ZGUKLSAgICAgcnVieSBkZXNjZW5kZW50IGVsZW1lbnRzLgotLS0+Ci08IUVOVElUWSAlIHJ0LmNvbnRlbnQgIiVOb1J1YnkuY29udGVudDsiID4KLQotPCFFTEVNRU5UICVydC5xbmFtZTsgICVydC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBydC5lbGVtZW50IC0tPl1dPgotCi08IS0tIHJic3BhbiBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgY29tcGxleCBydWJ5IG9ubHkgLi4uLi4uIC0tPgotPCFbJVJ1YnkuY29tcGxleDtbCi08IUVOVElUWSAlIHJ0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcnQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXJ0LnFuYW1lOwotICAgICAgcmJzcGFuICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAiMSIKLT4KLTwhLS0gZW5kIG9mIHJ0LmF0dGxpc3QgLS0+XV0+Ci1dXT4KLQotPCEtLSBycCAocnVieSBwYXJlbnRoZXNpcykgZWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhWyVSdWJ5LmZhbGxiYWNrO1sKLTwhRU5USVRZICUgcnAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVycC5lbGVtZW50O1sKLTwhRU5USVRZICUgcnAuY29udGVudAotICAgICAiKCAjUENEQVRBICkiCi0+Ci08IUVMRU1FTlQgJXJwLnFuYW1lOyAgJXJwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHJwLmVsZW1lbnQgLS0+XV0+Ci1dXT4KLQotPCEtLSBSdWJ5IENvbW1vbiBBdHRyaWJ1dGVzCi0KLSAgICAgVGhlIGZvbGxvd2luZyBvcHRpb25hbCBBVFRMSVNUIGRlY2xhcmF0aW9ucyBwcm92aWRlIGFuIGVhc3kgd2F5Ci0gICAgIHRvIGRlZmluZSBjb21tb24gYXR0cmlidXRlcyBmb3IgcnVieSBlbGVtZW50cy4gIFRoZXNlIGRlY2xhcmF0aW9ucwotICAgICBhcmUgaWdub3JlZCBieSBkZWZhdWx0LgotCi0gICAgIFJ1YnkgZWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGhhdmUgY29tbW9uIGF0dHJpYnV0ZXMgb2YgaXRzCi0gICAgIHBhcmVudCBtYXJrdXAgbGFuZ3VhZ2UuICBGb3IgZXhhbXBsZSwgaWYgYSBtYXJrdXAgbGFuZ3VhZ2UgZGVmaW5lcwotICAgICBjb21tb24gYXR0cmlidXRlcyBhcyBhIHBhcmFtZXRlciBlbnRpdHkgJWF0dHJzOywgeW91IG1heSBhZGQKLSAgICAgdGhvc2UgYXR0cmlidXRlcyBieSBqdXN0IGRlY2xhcmluZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBlbnRpdGllcwotCi0gICAgICAgICA8IUVOVElUWSAlIFJ1YnkuY29tbW9uLmF0dGxpc3RzICAiSU5DTFVERSIgPgotICAgICAgICAgPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRyaWIgICIlYXR0cnM7IiA+Ci0KLSAgICAgYmVmb3JlIGluY2x1ZGluZyB0aGUgUnVieSBtb2R1bGUuCi0tLT4KLQotPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRsaXN0cyAgIklHTk9SRSIgPgotPCFbJVJ1YnkuY29tbW9uLmF0dGxpc3RzO1sKLTwhRU5USVRZICUgUnVieS5jb21tb24uYXR0cmliICAiIiA+Ci0KLTwhLS0gY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJ1YnkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIFJ1YnkuY29tbW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslUnVieS5jb21tb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJXJ1YnkucW5hbWU7Ci0gICAgICAlUnVieS5jb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgUnVieS5jb21tb24uYXR0bGlzdCAtLT5dXT4KLQotPCFbJVJ1YnkuY29tcGxleDtbCi08IS0tIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciByYmMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBSYmMuY29tbW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslUmJjLmNvbW1vbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcmJjLnFuYW1lOwotICAgICAgJVJ1YnkuY29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIFJiYy5jb21tb24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBjb21tb24gYXR0cmlidXRlcyBmb3IgcnRjIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgUnRjLmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJ0Yy5jb21tb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJXJ0Yy5xbmFtZTsKLSAgICAgICVSdWJ5LmNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBSdGMuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci1dXT4KLQotPCEtLSBjb21tb24gYXR0cmlidXRlcyBmb3IgcmIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgUmIuY29tbW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslUmIuY29tbW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVyYi5xbmFtZTsKLSAgICAgICVSdWJ5LmNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBSYi5jb21tb24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBjb21tb24gYXR0cmlidXRlcyBmb3IgcnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgUnQuY29tbW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslUnQuY29tbW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVydC5xbmFtZTsKLSAgICAgICVSdWJ5LmNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBSdC5jb21tb24uYXR0bGlzdCAtLT5dXT4KLQotPCFbJVJ1YnkuZmFsbGJhY2s7WwotPCEtLSBjb21tb24gYXR0cmlidXRlcyBmb3IgcnAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgUnAuY29tbW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslUnAuY29tbW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVycC5xbmFtZTsKLSAgICAgICVSdWJ5LmNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBScC5jb21tb24uYXR0bGlzdCAtLT5dXT4KLV1dPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXJ1YnktMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBQcmVzZW50YXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1wcmVzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXByZXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtcHJlcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1wcmVzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFByZXNlbnRhdGlvbiBNb2R1bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXByZXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtcHJlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBQcmVzZW50YXRpb25hbCBFbGVtZW50cwotCi0gICAgIFRoaXMgbW9kdWxlIGRlZmluZXMgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgZm9yCi0gICAgIHNpbXBsZSBwcmVzZW50YXRpb24tcmVsYXRlZCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1pbmxwcmVzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHByZXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW5scHJlcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1pbmxwcmVzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBQcmVzZW50YXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHByZXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHByZXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFByZXNlbnRhdGlvbmFsIEVsZW1lbnRzCi0KLSAgICAgICAgYiwgYmlnLCBpLCBzbWFsbCwgc3ViLCBzdXAsIHR0Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBpbmxpbmUtbGV2ZWwgcHJlc2VudGF0aW9uYWwgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgYi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWIuZWxlbWVudDtbCi08IUVOVElUWSAlIGIuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBiLnFuYW1lICAiYiIgPgotPCFFTEVNRU5UICViLnFuYW1lOyAgJWIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyViLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBiLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmlnLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYmlnLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiaWcuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBiaWcucW5hbWUgICJiaWciID4KLTwhRUxFTUVOVCAlYmlnLnFuYW1lOyAgJWJpZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBiaWcuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiaWcuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyViaWcuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJpZy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYmlnLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWkuZWxlbWVudDtbCi08IUVOVElUWSAlIGkuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBpLnFuYW1lICAiaSIgPgotPCFFTEVNRU5UICVpLnFuYW1lOyAgJWkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVpLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBpLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc21hbGwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzbWFsbC5lbGVtZW50O1sKLTwhRU5USVRZICUgc21hbGwuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzbWFsbC5xbmFtZSAgInNtYWxsIiA+Ci08IUVMRU1FTlQgJXNtYWxsLnFuYW1lOyAgJXNtYWxsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNtYWxsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc21hbGwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzbWFsbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc21hbGwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHNtYWxsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3ViLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3ViLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzdWIuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzdWIucW5hbWUgICJzdWIiID4KLTwhRUxFTUVOVCAlc3ViLnFuYW1lOyAgJXN1Yi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzdWIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdWIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzdWIuYXR0bGlzdDtbCi08IUFUVExJU1QgJXN1Yi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3ViLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3VwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3VwLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzdXAuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzdXAucW5hbWUgICJzdXAiID4KLTwhRUxFTUVOVCAlc3VwLnFuYW1lOyAgJXN1cC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzdXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdXAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzdXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJXN1cC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3VwLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgdHQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0dC5lbGVtZW50O1sKLTwhRU5USVRZICUgdHQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSB0dC5xbmFtZSAgInR0IiA+Ci08IUVMRU1FTlQgJXR0LnFuYW1lOyAgJXR0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHR0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdHQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0dC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldHQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHR0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHByZXMtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ibGtwcmVzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWJsa3ByZXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrcHJlcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJsa3ByZXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmxvY2sgUHJlc2VudGF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmxrcHJlcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ibGtwcmVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJsb2NrIFByZXNlbnRhdGlvbmFsIEVsZW1lbnRzCi0KLSAgICAgICAgaHIKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGJsb2NrLWxldmVsIHByZXNlbnRhdGlvbmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGhyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaHIuZWxlbWVudDtbCi08IUVOVElUWSAlIGhyLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBoci5xbmFtZSAgImhyIiA+Ci08IUVMRU1FTlQgJWhyLnFuYW1lOyAgJWhyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGhyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaHIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoci5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaHIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGhyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJsa3ByZXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcHJlcy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIExpbmsgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWxpbmsubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbGluay5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1saW5rLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGluayBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxpbmstMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTGluayBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbGluay0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaW5rIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1saW5rLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExpbmsgZWxlbWVudAotCi0gICAgICAgIGxpbmsKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbGluayBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB3aGljaCBjb3VsZCAoaW4gcHJpbmNpcGxlKSBiZSB1c2VkIHRvIGRlZmluZSBkb2N1bWVudC1sZXZlbCBsaW5rcwotICAgICB0byBleHRlcm5hbCByZXNvdXJjZXMgc3VjaCBhczoKLQotICAgICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMsIGUuZy4gc3RhcnQsIGNvbnRlbnRzLAotICAgICAgICBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD0ic3R5bGVzaGVldCIpCi0gICAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9InNjcmlwdCIpCi0gICAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mIGh0bWwgbm9kZXMgYXJlCi0gICAgICAgIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uIChyZWw9ImFsdGVybmF0ZSIgbWVkaWE9InByaW50IikKLS0tPgotCi08IS0tIGxpbms6IE1lZGlhLUluZGVwZW5kZW50IExpbmsgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsaW5rLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGluay5lbGVtZW50O1sKLTwhRU5USVRZICUgbGluay5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgbGluay5xbmFtZSAgImxpbmsiID4KLTwhRUxFTUVOVCAlbGluay5xbmFtZTsgICVsaW5rLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxpbmsuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsaW5rLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGluay5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGluay5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2hhcnNldCAgICAgICVDaGFyc2V0LmRhdGF0eXBlOyAgICAgICAjSU1QTElFRAotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgaHJlZmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgcmVsICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgcmV2ICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgbWVkaWEgICAgICAgICVNZWRpYURlc2MuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbGluay5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1saW5rLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gRG9jdW1lbnQgTWV0YWluZm9ybWF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtbWV0YS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1tZXRhLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW1ldGEubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBNZXRhaW5mb3JtYXRpb24gMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbWV0YS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEb2N1bWVudCBNZXRhaW5mb3JtYXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1tZXRhLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIE1ldGFpbmZvcm1hdGlvbiAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW1ldGEtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTWV0YSBJbmZvcm1hdGlvbgotCi0gICAgICAgIG1ldGEKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbWV0YSBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB1c2VkIHRvIHByb3ZpZGUgZGVjbGFyYXRpdmUgZG9jdW1lbnQgbWV0YWluZm9ybWF0aW9uLgotLS0+Ci0KLTwhLS0gbWV0YTogR2VuZXJpYyBNZXRhaW5mb3JtYXRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG1ldGEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVtZXRhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBtZXRhLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBtZXRhLnFuYW1lICAibWV0YSIgPgotPCFFTEVNRU5UICVtZXRhLnFuYW1lOyAgJW1ldGEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbWV0YS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG1ldGEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVtZXRhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVtZXRhLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgIGh0dHAtZXF1aXYgICBOTVRPS0VOICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIG5hbWUgICAgICAgICBOTVRPS0VOICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNvbnRlbnQgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBzY2hlbWUgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBtZXRhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW1ldGEtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBCYXNlIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1iYXNlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWJhc2UubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmFzZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJhc2UgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2UtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCYXNlIGVsZW1lbnQKLQotICAgICAgICBiYXNlCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGJhc2UgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBkZWZpbmUgYSBiYXNlIFVSSSBhZ2FpbnN0IHdoaWNoIHJlbGF0aXZlIFVSSXMgaW4gdGhlCi0gICAgIGRvY3VtZW50IHdpbGwgYmUgcmVzb2x2ZWQuCi0KLSAgICAgTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGFsc28gcmVkZWNsYXJlcyB0aGUgY29udGVudCBtb2RlbCBmb3IKLSAgICAgdGhlIGhlYWQgZWxlbWVudCB0byBpbmNsdWRlIHRoZSBiYXNlIGVsZW1lbnQuCi0tLT4KLQotPCEtLSBiYXNlOiBEb2N1bWVudCBCYXNlIFVSSSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYmFzZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJhc2UuZWxlbWVudDtbCi08IUVOVElUWSAlIGJhc2UuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGJhc2UucW5hbWUgICJiYXNlIiA+Ci08IUVMRU1FTlQgJWJhc2UucW5hbWU7ICAlYmFzZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBiYXNlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmFzZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJhc2UuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJhc2UucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjUkVRVUlSRUQKLT4KLTwhLS0gZW5kIG9mIGJhc2UuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQKLSAgICAiKCAlSGVhZE9wdHMubWl4OywKLSAgICAgKCAoICV0aXRsZS5xbmFtZTssICVIZWFkT3B0cy5taXg7LCAoICViYXNlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKT8gKQotICAgICB8ICggJWJhc2UucW5hbWU7LCAlSGVhZE9wdHMubWl4OywgKCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApKSkpIgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iYXNlLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gU2NyaXB0aW5nIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtc2NyaXB0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXNjcmlwdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1zY3JpcHQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBTY3JpcHRpbmcgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc2NyaXB0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERvY3VtZW50IFNjcmlwdGluZyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXNjcmlwdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBTY3JpcHRpbmcgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zY3JpcHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gU2NyaXB0aW5nCi0KLSAgICAgICAgc2NyaXB0LCBub3NjcmlwdAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZXMgdXNlZCB0byBwcm92aWRlCi0gICAgIHN1cHBvcnQgZm9yIGV4ZWN1dGFibGUgc2NyaXB0cyBhcyB3ZWxsIGFzIGFuIGFsdGVybmF0ZSBjb250ZW50Ci0gICAgIGNvbnRhaW5lciB3aGVyZSBzY3JpcHRzIGFyZSBub3Qgc3VwcG9ydGVkLgotLS0+Ci0KLTwhLS0gc2NyaXB0OiBTY3JpcHRpbmcgU3RhdGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNjcmlwdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNjcmlwdC5lbGVtZW50O1sKLTwhRU5USVRZICUgc2NyaXB0LmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTlRJVFkgJSBzY3JpcHQucW5hbWUgICJzY3JpcHQiID4KLTwhRUxFTUVOVCAlc2NyaXB0LnFuYW1lOyAgJXNjcmlwdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzY3JpcHQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzY3JpcHQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzY3JpcHQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXNjcmlwdC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICBjaGFyc2V0ICAgICAgJUNoYXJzZXQuZGF0YXR5cGU7ICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNSRVFVSVJFRAotICAgICAgc3JjICAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGVmZXIgICAgICAgICggZGVmZXIgKSAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgeG1sOnNwYWNlICAgICggcHJlc2VydmUgKSAgICAgICAgICAgICAjRklYRUQgJ3ByZXNlcnZlJwotPgotPCEtLSBlbmQgb2Ygc2NyaXB0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbm9zY3JpcHQ6IE5vLVNjcmlwdCBBbHRlcm5hdGUgQ29udGVudCAuLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG5vc2NyaXB0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbm9zY3JpcHQuZWxlbWVudDtbCi08IUVOVElUWSAlIG5vc2NyaXB0LmNvbnRlbnQKLSAgICAgIiggJUJsb2NrLm1peDsgKSsiCi0+Ci08IUVOVElUWSAlIG5vc2NyaXB0LnFuYW1lICAibm9zY3JpcHQiID4KLTwhRUxFTUVOVCAlbm9zY3JpcHQucW5hbWU7ICAlbm9zY3JpcHQuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygbm9zY3JpcHQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBub3NjcmlwdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW5vc2NyaXB0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVub3NjcmlwdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygbm9zY3JpcHQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc2NyaXB0LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gU3R5bGUgU2hlZXRzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXN0eWxlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXN0eWxlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXN0eWxlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgU3R5bGUgU2hlZXRzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXN0eWxlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERvY3VtZW50IFN0eWxlIFNoZWV0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1zdHlsZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgU3R5bGUgU2hlZXRzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3R5bGUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gU3R5bGUgU2hlZXRzCi0KLSAgICAgICAgc3R5bGUKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgc3R5bGUgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBlbWJlZCBzdHlsZXNoZWV0IGluZm9ybWF0aW9uIGluIHRoZSBkb2N1bWVudCBoZWFkIGVsZW1lbnQuCi0tLT4KLQotPCEtLSBzdHlsZTogU3R5bGUgU2hlZXQgSW5mb3JtYXRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHN0eWxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3R5bGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHN0eWxlLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTlRJVFkgJSBzdHlsZS5xbmFtZSAgInN0eWxlIiA+Ci08IUVMRU1FTlQgJXN0eWxlLnFuYW1lOyAgJXN0eWxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN0eWxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3R5bGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzdHlsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3R5bGUucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJXRpdGxlLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI1JFUVVJUkVECi0gICAgICBtZWRpYSAgICAgICAgJU1lZGlhRGVzYy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICB4bWw6c3BhY2UgICAgKCBwcmVzZXJ2ZSApICAgICAgICAgICAgICNGSVhFRCAncHJlc2VydmUnCi0+Ci08IS0tIGVuZCBvZiBzdHlsZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zdHlsZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEltYWdlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWltYWdlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWltYWdlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWltYWdlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW1hZ2VzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWltYWdlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEltYWdlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWltYWdlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSb3Zpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEltYWdlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWltYWdlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEltYWdlcwotCi0gICAgICAgIGltZwotCi0gICAgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hcmt1cCB0byBzdXBwb3J0IGJhc2ljIGltYWdlIGVtYmVkZGluZy4KLS0tPgotCi08IS0tIFRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGV4dC1vbmx5IFVBcyBhcyB3ZWxsIGFzIHRvIG1ha2UKLSAgICAgaW1hZ2UgY29udGVudCB1bmRlcnN0YW5kYWJsZSBhbmQgbmF2aWdhYmxlIHRvIHVzZXJzIG9mCi0gICAgIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlIGEgZGVzY3JpcHRpb24gd2l0aAotICAgICB0aGUgJ2FsdCcgYXR0cmlidXRlLCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcy4KLS0tPgotCi08IUVOVElUWSAlIGltZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWltZy5lbGVtZW50O1sKLTwhRU5USVRZICUgaW1nLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBpbWcucW5hbWUgICJpbWciID4KLTwhRUxFTUVOVCAlaW1nLnFuYW1lOyAgJWltZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpbWcuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpbWcuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpbWcuYXR0bGlzdDtbCi08IUFUVExJU1QgJWltZy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc3JjICAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGFsdCAgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBsb25nZGVzYyAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWlnaHQgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICB3aWR0aCAgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBpbWcuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW1hZ2UtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBDbGllbnQtc2lkZSBJbWFnZSBNYXAgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1jc2lzbWFwLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWNzaXNtYXAubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtY3Npc21hcC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIENsaWVudC1zaWRlIEltYWdlIE1hcHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtY3Npc21hcC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBDbGllbnQtc2lkZSBJbWFnZSBNYXAgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1jc2lzbWFwLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIENsaWVudC1zaWRlIEltYWdlIE1hcHMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1jc2lzbWFwLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIENsaWVudC1zaWRlIEltYWdlIE1hcHMKLQotICAgICAgICBhcmVhLCBtYXAKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB0byBzdXBwb3J0IGNsaWVudC1zaWRlCi0gICAgIGltYWdlIG1hcHMuIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgSW1hZ2UgTW9kdWxlIChvciBhIG1vZHVsZQotICAgICBkZWNsYXJpbmcgdGhlIGltZyBlbGVtZW50IHR5cGUpIGJlIGluY2x1ZGVkIGluIHRoZSBEVEQuCi0KLSAgICAgVGhlc2UgY2FuIGJlIHBsYWNlZCBpbiB0aGUgc2FtZSBkb2N1bWVudCBvciBncm91cGVkIGluIGEKLSAgICAgc2VwYXJhdGUgZG9jdW1lbnQsIGFsdGhvdWdoIHRoZSBsYXR0ZXIgaXNuJ3Qgd2lkZWx5IHN1cHBvcnRlZAotLS0+Ci0KLTwhRU5USVRZICUgYXJlYS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWFyZWEuZWxlbWVudDtbCi08IUVOVElUWSAlIGFyZWEuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGFyZWEucW5hbWUgICJhcmVhIiA+Ci08IUVMRU1FTlQgJWFyZWEucW5hbWU7ICAlYXJlYS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhcmVhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgU2hhcGUuZGF0YXR5cGUgIiggcmVjdCB8IGNpcmNsZSB8IHBvbHkgfCBkZWZhdWx0ICkiPgotPCFFTlRJVFkgJSBDb29yZHMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhRU5USVRZICUgYXJlYS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWFyZWEuYXR0bGlzdDtbCi08IUFUVExJU1QgJWFyZWEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNoYXBlICAgICAgICAlU2hhcGUuZGF0YXR5cGU7ICAgICAgICAgJ3JlY3QnCi0gICAgICBjb29yZHMgICAgICAgJUNvb3Jkcy5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBub2hyZWYgICAgICAgKCBub2hyZWYgKSAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBhbHQgICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNSRVFVSVJFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgYXJlYS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG1vZGlmeSBhbmNob3IgYXR0cmlidXRlIGRlZmluaXRpb24gbGlzdAotICAgICB0byBhbGxvdyBmb3IgY2xpZW50LXNpZGUgaW1hZ2UgbWFwcwotLS0+Ci08IUFUVExJU1QgJWEucW5hbWU7Ci0gICAgICBzaGFwZSAgICAgICAgJVNoYXBlLmRhdGF0eXBlOyAgICAgICAgICdyZWN0JwotICAgICAgY29vcmRzICAgICAgICVDb29yZHMuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIG1vZGlmeSBpbWcgYXR0cmlidXRlIGRlZmluaXRpb24gbGlzdAotICAgICB0byBhbGxvdyBmb3IgY2xpZW50LXNpZGUgaW1hZ2UgbWFwcwotLS0+Ci08IUFUVExJU1QgJWltZy5xbmFtZTsKLSAgICAgIHVzZW1hcCAgICAgICBJRFJFRiAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBtb2RpZnkgZm9ybSBpbnB1dCBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBsaXN0Ci0gICAgIHRvIGFsbG93IGZvciBjbGllbnQtc2lkZSBpbWFnZSBtYXBzCi0tLT4KLTwhQVRUTElTVCAlaW5wdXQucW5hbWU7Ci0gICAgICB1c2VtYXAgICAgICAgSURSRUYgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gbW9kaWZ5IG9iamVjdCBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBsaXN0Ci0gICAgIHRvIGFsbG93IGZvciBjbGllbnQtc2lkZSBpbWFnZSBtYXBzCi0tLT4KLTwhQVRUTElTVCAlb2JqZWN0LnFuYW1lOwotICAgICAgdXNlbWFwICAgICAgIElEUkVGICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotCi08IS0tICd1c2VtYXAnIHBvaW50cyB0byB0aGUgJ2lkJyBhdHRyaWJ1dGUgb2YgYSA8bWFwPiBlbGVtZW50LAotICAgICB3aGljaCBtdXN0IGJlIGluIHRoZSBzYW1lIGRvY3VtZW50OyBzdXBwb3J0IGZvciBleHRlcm5hbAotICAgICBkb2N1bWVudCBtYXBzIHdhcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCBpbiBIVE1MIGFuZCBpcwotICAgICBlbGltaW5hdGVkIGluIFhIVE1MLgotCi0gICAgIEl0IGlzIGNvbnNpZGVyZWQgYW4gZXJyb3IgZm9yIHRoZSBlbGVtZW50IHBvaW50ZWQgdG8gYnkKLSAgICAgYSB1c2VtYXAgSURSRUYgdG8gb2NjdXIgaW4gYW55dGhpbmcgYnV0IGEgPG1hcD4gZWxlbWVudC4KLS0tPgotCi08IUVOVElUWSAlIG1hcC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW1hcC5lbGVtZW50O1sKLTwhRU5USVRZICUgbWFwLmNvbnRlbnQKLSAgICAgIigoICVCbG9jay5taXg7ICkgfCAlYXJlYS5xbmFtZTsgKSsiCi0+Ci08IUVOVElUWSAlIG1hcC5xbmFtZSAgIm1hcCIgPgotPCFFTEVNRU5UICVtYXAucW5hbWU7ICAlbWFwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG1hcC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG1hcC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW1hcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbWFwLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgIGlkICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICAlY2xhc3MuYXR0cmliOwotICAgICAgJXRpdGxlLmF0dHJpYjsKLSAgICAgICVDb3JlLmV4dHJhLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgICVFdmVudHMuYXR0cmliOwotPgotPCEtLSBlbmQgb2YgbWFwLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWNzaXNtYXAtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBTZXJ2ZXItc2lkZSBJbWFnZSBNYXAgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1zc2lzbWFwLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXNzaXNtYXAubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtc3Npc21hcC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFNlcnZlci1zaWRlIEltYWdlIE1hcHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3Npc21hcC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBTZXJ2ZXItc2lkZSBJbWFnZSBNYXAgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1zc2lzbWFwLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFNlcnZlci1zaWRlIEltYWdlIE1hcHMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zc2lzbWFwLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSMyMDAwLTEwLTIyOiBhZGRlZCBkZWNsYXJhdGlvbiBmb3IgJ2lzbWFwJyBvbiA8aW5wdXQ+Ci0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFNlcnZlci1zaWRlIEltYWdlIE1hcHMKLQotICAgICBUaGlzIGFkZHMgdGhlICdpc21hcCcgYXR0cmlidXRlIHRvIHRoZSBpbWcgYW5kIGlucHV0IGVsZW1lbnRzCi0gICAgIHRvIHN1cHBvcnQgc2VydmVyLXNpZGUgcHJvY2Vzc2luZyBvZiBhIHVzZXIgc2VsZWN0aW9uLgotLS0+Ci0KLTwhQVRUTElTVCAlaW1nLnFuYW1lOwotICAgICAgaXNtYXAgICAgICAgICggaXNtYXAgKSAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotCi08IUFUVExJU1QgJWlucHV0LnFuYW1lOwotICAgICAgaXNtYXAgICAgICAgICggaXNtYXAgKSAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zc2lzbWFwLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gUGFyYW0gRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtcGFyYW0ubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtcGFyYW0ubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtcGFyYW0ubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBQYXJhbSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXBhcmFtLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFBhcmFtIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1wYXJhbS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBQYXJhbSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtcGFyYW0tMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gUGFyYW1ldGVycyBmb3IgSmF2YSBBcHBsZXRzIGFuZCBFbWJlZGRlZCBPYmplY3RzCi0KLSAgICAgICAgcGFyYW0KLQotICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBwYXJhbSBlbGVtZW50LAotICAgICB1c2VkIHRvIHByb3ZpZGUgbmFtZWQgcHJvcGVydHkgdmFsdWVzIGZvciB0aGUgYXBwbGV0Ci0gICAgIGFuZCBvYmplY3QgZWxlbWVudHMuCi0tLT4KLQotPCEtLSBwYXJhbTogTmFtZWQgUHJvcGVydHkgVmFsdWUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgcGFyYW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwYXJhbS5lbGVtZW50O1sKLTwhRU5USVRZICUgcGFyYW0uY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIHBhcmFtLnFuYW1lICAicGFyYW0iID4KLTwhRUxFTUVOVCAlcGFyYW0ucW5hbWU7ICAlcGFyYW0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgcGFyYW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwYXJhbS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXBhcmFtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVwYXJhbS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlaWQuYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVldHlwZSAgICAoIGRhdGEgfCByZWYgfCBvYmplY3QgKSAgJ2RhdGEnCi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBwYXJhbS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1wYXJhbS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEVtYmVkZGVkIE9iamVjdCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLW9iamVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1vYmplY3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtb2JqZWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRW1iZWRkZWQgT2JqZWN0IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW9iamVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBFbWJlZGRlZCBPYmplY3QgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1vYmplY3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRW1iZWRkZWQgT2JqZWN0IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtb2JqZWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEVtYmVkZGVkIE9iamVjdHMKLQotICAgICAgICBvYmplY3QKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgb2JqZWN0IGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsIHVzZWQKLSAgICAgdG8gZW1iZWQgZXh0ZXJuYWwgb2JqZWN0cyBhcyBwYXJ0IG9mIFhIVE1MIHBhZ2VzLiBJbiB0aGUgZG9jdW1lbnQsCi0gICAgIHBsYWNlIHBhcmFtIGVsZW1lbnRzIHByaW9yIHRvIG90aGVyIGNvbnRlbnQgd2l0aGluIHRoZSBvYmplY3QgZWxlbWVudC4KLQotICAgICBOb3RlIHRoYXQgdXNlIG9mIHRoaXMgbW9kdWxlIHJlcXVpcmVzIGluc3RhbnRpYXRpb24gb2YgdGhlIFBhcmFtCi0gICAgIEVsZW1lbnQgTW9kdWxlLgotLS0+Ci0KLTwhLS0gb2JqZWN0OiBHZW5lcmljIEVtYmVkZGVkIE9iamVjdCAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG9iamVjdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9iamVjdC5lbGVtZW50O1sKLTwhRU5USVRZICUgb2JqZWN0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgfCAlcGFyYW0ucW5hbWU7ICkqIgotPgotPCFFTlRJVFkgJSBvYmplY3QucW5hbWUgICJvYmplY3QiID4KLTwhRUxFTUVOVCAlb2JqZWN0LnFuYW1lOyAgJW9iamVjdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvYmplY3QuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvYmplY3QuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvYmplY3QuYXR0bGlzdDtbCi08IUFUVExJU1QgJW9iamVjdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgZGVjbGFyZSAgICAgICggZGVjbGFyZSApICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2xhc3NpZCAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgY29kZWJhc2UgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGF0YSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgY29kZXR5cGUgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgYXJjaGl2ZSAgICAgICVVUklzLmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgc3RhbmRieSAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVpZ2h0ICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgd2lkdGggICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygb2JqZWN0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW9iamVjdC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFRhYmxlcyBNb2R1bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXRhYmxlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXRhYmxlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXRhYmxlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgVGFibGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXRhYmxlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFRhYmxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXRhYmxlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFRhYmxlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXRhYmxlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFRhYmxlcwotCi0gICAgICAgIHRhYmxlLCBjYXB0aW9uLCB0aGVhZCwgdGZvb3QsIHRib2R5LCBjb2xncm91cCwgY29sLCB0ciwgdGgsIHRkCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgdGFibGUgbWFya3VwIHNpbWlsYXIgdG8gSFRNTCA0LjAsIGluY2x1ZGluZyBmZWF0dXJlcyB0aGF0IGVuYWJsZQotICAgICBiZXR0ZXIgYWNjZXNzaWJpbGl0eSBmb3Igbm9uLXZpc3VhbCB1c2VyIGFnZW50cy4KLS0tPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIGVsZW1lbnQgdHlwZSBuYW1lczoKLS0tPgotPCFFTlRJVFkgJSB0YWJsZS5xbmFtZSAgInRhYmxlIiA+Ci08IUVOVElUWSAlIGNhcHRpb24ucW5hbWUgICJjYXB0aW9uIiA+Ci08IUVOVElUWSAlIHRoZWFkLnFuYW1lICAidGhlYWQiID4KLTwhRU5USVRZICUgdGZvb3QucW5hbWUgICJ0Zm9vdCIgPgotPCFFTlRJVFkgJSB0Ym9keS5xbmFtZSAgInRib2R5IiA+Ci08IUVOVElUWSAlIGNvbGdyb3VwLnFuYW1lICAiY29sZ3JvdXAiID4KLTwhRU5USVRZICUgY29sLnFuYW1lICAiY29sIiA+Ci08IUVOVElUWSAlIHRyLnFuYW1lICAidHIiID4KLTwhRU5USVRZICUgdGgucW5hbWUgICJ0aCIgPgotPCFFTlRJVFkgJSB0ZC5xbmFtZSAgInRkIiA+Ci0KLTwhLS0gVGhlIGZyYW1lIGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hpY2ggcGFydHMgb2YgdGhlIGZyYW1lIGFyb3VuZAotICAgICB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSAgICAgQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgdmFsaWduIGF0dHJpYnV0ZS4KLS0tPgotPCFFTlRJVFkgJSBmcmFtZS5hdHRyaWIKLSAgICAgImZyYW1lICAgICAgICAoIHZvaWQKLSAgICAgICAgICAgICAgICAgICB8IGFib3ZlCi0gICAgICAgICAgICAgICAgICAgfCBiZWxvdwotICAgICAgICAgICAgICAgICAgIHwgaHNpZGVzCi0gICAgICAgICAgICAgICAgICAgfCBsaHMKLSAgICAgICAgICAgICAgICAgICB8IHJocwotICAgICAgICAgICAgICAgICAgIHwgdnNpZGVzCi0gICAgICAgICAgICAgICAgICAgfCBib3gKLSAgICAgICAgICAgICAgICAgICB8IGJvcmRlciApICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gVGhlIHJ1bGVzIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotICAgICBJZiBydWxlcyBpcyBhYnNlbnQgdGhlbiBhc3N1bWU6Ci0KLSAgICAgICAibm9uZSIgaWYgYm9yZGVyIGlzIGFic2VudCBvciBib3JkZXI9IjAiIG90aGVyd2lzZSAiYWxsIgotLS0+Ci08IUVOVElUWSAlIHJ1bGVzLmF0dHJpYgotICAgICAicnVsZXMgICAgICAgICggbm9uZQotICAgICAgICAgICAgICAgICAgIHwgZ3JvdXBzCi0gICAgICAgICAgICAgICAgICAgfCByb3dzCi0gICAgICAgICAgICAgICAgICAgfCBjb2xzCi0gICAgICAgICAgICAgICAgICAgfCBhbGwgKSAgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMKLS0tPgotPCFFTlRJVFkgJSBDZWxsSEFsaWduLmF0dHJpYgotICAgICAiYWxpZ24gICAgICAgICggbGVmdAotICAgICAgICAgICAgICAgICAgIHwgY2VudGVyCi0gICAgICAgICAgICAgICAgICAgfCByaWdodAotICAgICAgICAgICAgICAgICAgIHwganVzdGlmeQotICAgICAgICAgICAgICAgICAgIHwgY2hhciApICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2hhciAgICAgICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgY2hhcm9mZiAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlIGZvciBjZWxsIGNvbnRlbnRzCi0tLT4KLTwhRU5USVRZICUgQ2VsbFZBbGlnbi5hdHRyaWIKLSAgICAgInZhbGlnbiAgICAgICAoIHRvcAotICAgICAgICAgICAgICAgICAgIHwgbWlkZGxlCi0gICAgICAgICAgICAgICAgICAgfCBib3R0b20KLSAgICAgICAgICAgICAgICAgICB8IGJhc2VsaW5lICkgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gc2NvcGUgaXMgc2ltcGxlciB0aGFuIGF4ZXMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzCi0tLT4KLTwhRU5USVRZICUgc2NvcGUuYXR0cmliCi0gICAgICJzY29wZSAgICAgICAgKCByb3cKLSAgICAgICAgICAgICAgICAgICB8IGNvbAotICAgICAgICAgICAgICAgICAgIHwgcm93Z3JvdXAKLSAgICAgICAgICAgICAgICAgICB8IGNvbGdyb3VwICkgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gdGFibGU6IFRhYmxlIEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRhYmxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGFibGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHRhYmxlLmNvbnRlbnQKLSAgICAgIiggJWNhcHRpb24ucW5hbWU7PywgKCAlY29sLnFuYW1lOyogfCAlY29sZ3JvdXAucW5hbWU7KiApLAotICAgICAgKCggJXRoZWFkLnFuYW1lOz8sICV0Zm9vdC5xbmFtZTs/LCAldGJvZHkucW5hbWU7KyApIHwgKCAldHIucW5hbWU7KyApKSkiCi0+Ci08IUVMRU1FTlQgJXRhYmxlLnFuYW1lOyAgJXRhYmxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRhYmxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGFibGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0YWJsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGFibGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHN1bW1hcnkgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHdpZHRoICAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGJvcmRlciAgICAgICAlUGl4ZWxzLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgICVmcmFtZS5hdHRyaWI7Ci0gICAgICAlcnVsZXMuYXR0cmliOwotICAgICAgY2VsbHNwYWNpbmcgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgY2VsbHBhZGRpbmcgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgdGFibGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBjYXB0aW9uOiBUYWJsZSBDYXB0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgY2FwdGlvbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNhcHRpb24uZWxlbWVudDtbCi08IUVOVElUWSAlIGNhcHRpb24uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICVjYXB0aW9uLnFuYW1lOyAgJWNhcHRpb24uY29udGVudDsgPgotPCEtLSBlbmQgb2YgY2FwdGlvbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNhcHRpb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjYXB0aW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjYXB0aW9uLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjYXB0aW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGhlYWQ6IFRhYmxlIEhlYWRlciAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFVzZSB0aGVhZCB0byBkdXBsaWNhdGUgaGVhZGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgaGVhZGVycyB3aGVuCi0gICAgIHRib2R5IHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0tLT4KLQotPCFFTlRJVFkgJSB0aGVhZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRoZWFkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0aGVhZC5jb250ZW50ICAiKCAldHIucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXRoZWFkLnFuYW1lOyAgJXRoZWFkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRoZWFkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGhlYWQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0aGVhZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGhlYWQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRoZWFkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGZvb3Q6IFRhYmxlIEZvb3RlciAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFVzZSB0Zm9vdCB0byBkdXBsaWNhdGUgZm9vdGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgIHRib2R5IHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0tLT4KLQotPCFFTlRJVFkgJSB0Zm9vdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRmb290LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0Zm9vdC5jb250ZW50ICAiKCAldHIucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXRmb290LnFuYW1lOyAgJXRmb290LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRmb290LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGZvb3QuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0Zm9vdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGZvb3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRmb290LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGJvZHk6IFRhYmxlIEJvZHkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFVzZSBtdWx0aXBsZSB0Ym9keSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICAgYmV0d2VlbiBncm91cHMgb2YgdGFibGUgcm93cy4KLS0tPgotCi08IUVOVElUWSAlIHRib2R5LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGJvZHkuZWxlbWVudDtbCi08IUVOVElUWSAlIHRib2R5LmNvbnRlbnQgICIoICV0ci5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldGJvZHkucW5hbWU7ICAldGJvZHkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGJvZHkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0Ym9keS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRib2R5LmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0Ym9keS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGJvZHkuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBjb2xncm91cDogVGFibGUgQ29sdW1uIEdyb3VwIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gY29sZ3JvdXAgZ3JvdXBzIGEgc2V0IG9mIGNvbCBlbGVtZW50cy4gSXQgYWxsb3dzIHlvdQotICAgICB0byBncm91cCBzZXZlcmFsIHNlbWFudGljYWxseS1yZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLQotPCFFTlRJVFkgJSBjb2xncm91cC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNvbGdyb3VwLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjb2xncm91cC5jb250ZW50ICAiKCAlY29sLnFuYW1lOyApKiIgPgotPCFFTEVNRU5UICVjb2xncm91cC5xbmFtZTsgICVjb2xncm91cC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjb2xncm91cC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNvbGdyb3VwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY29sZ3JvdXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJWNvbGdyb3VwLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzcGFuICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgd2lkdGggICAgICAgICVNdWx0aUxlbmd0aC5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY29sZ3JvdXAuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBjb2w6IFRhYmxlIENvbHVtbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gY29sIGVsZW1lbnRzIGRlZmluZSB0aGUgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yCi0gICAgIGNlbGxzIGluIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSAgICAgVGhlIHdpZHRoIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZQotICAgICBjb2x1bW5zLCBlLmcuCi0KLSAgICAgICB3aWR0aD0iNjQiICAgICAgICB3aWR0aCBpbiBzY3JlZW4gcGl4ZWxzCi0gICAgICAgd2lkdGg9IjAuNSoiICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSAgICAgVGhlIHNwYW4gYXR0cmlidXRlIGNhdXNlcyB0aGUgYXR0cmlidXRlcyBvZiBvbmUKLSAgICAgY29sIGVsZW1lbnQgdG8gYXBwbHkgdG8gbW9yZSB0aGFuIG9uZSBjb2x1bW4uCi0tLT4KLQotPCFFTlRJVFkgJSBjb2wuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjb2wuZWxlbWVudDtbCi08IUVOVElUWSAlIGNvbC5jb250ZW50ICAiRU1QVFkiID4KLTwhRUxFTUVOVCAlY29sLnFuYW1lOyAgJWNvbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjb2wuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2wuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjb2wuYXR0bGlzdDtbCi08IUFUVExJU1QgJWNvbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc3BhbiAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIHdpZHRoICAgICAgICAlTXVsdGlMZW5ndGguZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNvbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRyOiBUYWJsZSBSb3cgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ci5jb250ZW50ICAiKCAldGgucW5hbWU7IHwgJXRkLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV0ci5xbmFtZTsgICV0ci5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ci5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldHIuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0ci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRoOiBUYWJsZSBIZWFkZXIgQ2VsbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSB0aCBpcyBmb3IgaGVhZGVyIGNlbGxzLCB0ZCBmb3IgZGF0YSwKLSAgICAgYnV0IGZvciBjZWxscyBhY3RpbmcgYXMgYm90aCB1c2UgdGQKLS0tPgotCi08IUVOVElUWSAlIHRoLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGguZWxlbWVudDtbCi08IUVOVElUWSAlIHRoLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJXRoLnFuYW1lOyAgJXRoLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRoLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGguYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0aC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGgucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFiYnIgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGF4aXMgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlYWRlcnMgICAgICBJRFJFRlMgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICVzY29wZS5hdHRyaWI7Ci0gICAgICByb3dzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgY29sc3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRoLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGQ6IFRhYmxlIERhdGEgQ2VsbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGQuZWxlbWVudDtbCi08IUVOVElUWSAlIHRkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJXRkLnFuYW1lOyAgJXRkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFiYnIgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGF4aXMgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlYWRlcnMgICAgICBJRFJFRlMgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICVzY29wZS5hdHRyaWI7Ci0gICAgICByb3dzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgY29sc3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXRhYmxlLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gRm9ybXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtZm9ybS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1mb3JtLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWZvcm0ubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBGb3JtcyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1mb3JtLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEZvcm1zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWZvcm0tMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRm9ybXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1mb3JtLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEZvcm1zCi0KLSAgICAgICAgZm9ybSwgbGFiZWwsIGlucHV0LCBzZWxlY3QsIG9wdGdyb3VwLCBvcHRpb24sCi0gICAgICAgIHRleHRhcmVhLCBmaWVsZHNldCwgbGVnZW5kLCBidXR0b24KLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBtYXJrdXAgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBvbmxpbmUKLSAgICAgZm9ybXMsIGJhc2VkIG9uIHRoZSBmZWF0dXJlcyBmb3VuZCBpbiBIVE1MIDQuMCBmb3Jtcy4KLS0tPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIGVsZW1lbnQgdHlwZSBuYW1lczoKLS0tPgotPCFFTlRJVFkgJSBmb3JtLnFuYW1lICAiZm9ybSIgPgotPCFFTlRJVFkgJSBsYWJlbC5xbmFtZSAgImxhYmVsIiA+Ci08IUVOVElUWSAlIGlucHV0LnFuYW1lICAiaW5wdXQiID4KLTwhRU5USVRZICUgc2VsZWN0LnFuYW1lICAic2VsZWN0IiA+Ci08IUVOVElUWSAlIG9wdGdyb3VwLnFuYW1lICAib3B0Z3JvdXAiID4KLTwhRU5USVRZICUgb3B0aW9uLnFuYW1lICAib3B0aW9uIiA+Ci08IUVOVElUWSAlIHRleHRhcmVhLnFuYW1lICAidGV4dGFyZWEiID4KLTwhRU5USVRZICUgZmllbGRzZXQucW5hbWUgICJmaWVsZHNldCIgPgotPCFFTlRJVFkgJSBsZWdlbmQucW5hbWUgICJsZWdlbmQiID4KLTwhRU5USVRZICUgYnV0dG9uLnFuYW1lICAiYnV0dG9uIiA+Ci0KLTwhLS0gJUJsa05vRm9ybS5taXg7IGluY2x1ZGVzIGFsbCBub24tZm9ybSBibG9jayBlbGVtZW50cywKLSAgICAgcGx1cyAlTWlzYy5jbGFzczsKLS0tPgotPCFFTlRJVFkgJSBCbGtOb0Zvcm0ubWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlQmxrUHJlcy5jbGFzczsKLSAgICAgICVUYWJsZS5jbGFzczsKLSAgICAgICVCbG9jay5leHRyYTsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBmb3JtOiBGb3JtIEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZm9ybS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWZvcm0uZWxlbWVudDtbCi08IUVOVElUWSAlIGZvcm0uY29udGVudAotICAgICAiKCAlQmxrTm9Gb3JtLm1peDsKLSAgICAgIHwgJWZpZWxkc2V0LnFuYW1lOyApKyIKLT4KLTwhRUxFTUVOVCAlZm9ybS5xbmFtZTsgICVmb3JtLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGZvcm0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBmb3JtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZm9ybS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZm9ybS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWN0aW9uICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIG1ldGhvZCAgICAgICAoIGdldCB8IHBvc3QgKSAgICAgICAgICAgJ2dldCcKLSAgICAgIGVuY3R5cGUgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKLSAgICAgIGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0cy5kYXRhdHlwZTsgICAgI0lNUExJRUQKLSAgICAgIGFjY2VwdCAgICAgICAlQ29udGVudFR5cGVzLmRhdGF0eXBlOyAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGZvcm0uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBsYWJlbDogRm9ybSBGaWVsZCBMYWJlbCBUZXh0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRWFjaCBsYWJlbCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBPTkUgZmllbGQKLS0tPgotCi08IUVOVElUWSAlIGxhYmVsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGFiZWwuZWxlbWVudDtbCi08IUVOVElUWSAlIGxhYmVsLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlaW5wdXQucW5hbWU7IHwgJXNlbGVjdC5xbmFtZTsgfCAldGV4dGFyZWEucW5hbWU7IHwgJWJ1dHRvbi5xbmFtZTsKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUlubFByZXMuY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgJUlubFNwZWNpYWwuY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOwotICAgICAgJU1pc2MuY2xhc3M7ICkqIgotPgotPCFFTEVNRU5UICVsYWJlbC5xbmFtZTsgICVsYWJlbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsYWJlbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxhYmVsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGFiZWwuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxhYmVsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBmb3IgICAgICAgICAgSURSRUYgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBsYWJlbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGlucHV0OiBGb3JtIENvbnRyb2wgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBpbnB1dC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWlucHV0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpbnB1dC5jb250ZW50ICAiRU1QVFkiID4KLTwhRUxFTUVOVCAlaW5wdXQucW5hbWU7ICAlaW5wdXQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW5wdXQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpbnB1dC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWlucHV0LmF0dGxpc3Q7WwotPCFFTlRJVFkgJSBJbnB1dFR5cGUuY2xhc3MKLSAgICAgIiggdGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyB8IHN1Ym1pdAotICAgICAgfCByZXNldCB8IGZpbGUgfCBoaWRkZW4gfCBpbWFnZSB8IGJ1dHRvbiApIgotPgotPCEtLSBhdHRyaWJ1dGUgJ25hbWUnIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCAmIHJlc2V0Ci0tLT4KLTwhQVRUTElTVCAlaW5wdXQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHR5cGUgICAgICAgICAlSW5wdXRUeXBlLmNsYXNzOyAgICAgICAgJ3RleHQnCi0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjaGVja2VkICAgICAgKCBjaGVja2VkICkgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkaXNhYmxlZCAgICAgKCBkaXNhYmxlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICByZWFkb25seSAgICAgKCByZWFkb25seSApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBzaXplICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBtYXhsZW5ndGggICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBzcmMgICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBhbHQgICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICBhY2NlcHQgICAgICAgJUNvbnRlbnRUeXBlcy5kYXRhdHlwZTsgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBpbnB1dC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHNlbGVjdDogT3B0aW9uIFNlbGVjdG9yIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzZWxlY3QuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzZWxlY3QuZWxlbWVudDtbCi08IUVOVElUWSAlIHNlbGVjdC5jb250ZW50Ci0gICAgICIoICVvcHRncm91cC5xbmFtZTsgfCAlb3B0aW9uLnFuYW1lOyApKyIKLT4KLTwhRUxFTUVOVCAlc2VsZWN0LnFuYW1lOyAgJXNlbGVjdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzZWxlY3QuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzZWxlY3QuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzZWxlY3QuYXR0bGlzdDtbCi08IUFUVExJU1QgJXNlbGVjdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgc2l6ZSAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgbXVsdGlwbGUgICAgICggbXVsdGlwbGUgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGlzYWJsZWQgICAgICggZGlzYWJsZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygc2VsZWN0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gb3B0Z3JvdXA6IE9wdGlvbiBHcm91cCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIG9wdGdyb3VwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb3B0Z3JvdXAuZWxlbWVudDtbCi08IUVOVElUWSAlIG9wdGdyb3VwLmNvbnRlbnQgICIoICVvcHRpb24ucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJW9wdGdyb3VwLnFuYW1lOyAgJW9wdGdyb3VwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9wdGdyb3VwLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb3B0Z3JvdXAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvcHRncm91cC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb3B0Z3JvdXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGRpc2FibGVkICAgICAoIGRpc2FibGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGxhYmVsICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI1JFUVVJUkVECi0+Ci08IS0tIGVuZCBvZiBvcHRncm91cC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9wdGlvbjogU2VsZWN0YWJsZSBDaG9pY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvcHRpb24uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvcHRpb24uZWxlbWVudDtbCi08IUVOVElUWSAlIG9wdGlvbi5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRUxFTUVOVCAlb3B0aW9uLnFuYW1lOyAgJW9wdGlvbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvcHRpb24uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvcHRpb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvcHRpb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJW9wdGlvbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc2VsZWN0ZWQgICAgICggc2VsZWN0ZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGlzYWJsZWQgICAgICggZGlzYWJsZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgbGFiZWwgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygb3B0aW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGV4dGFyZWE6IE11bHRpLUxpbmUgVGV4dCBGaWVsZCAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRleHRhcmVhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGV4dGFyZWEuZWxlbWVudDtbCi08IUVOVElUWSAlIHRleHRhcmVhLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTEVNRU5UICV0ZXh0YXJlYS5xbmFtZTsgICV0ZXh0YXJlYS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ZXh0YXJlYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRleHRhcmVhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGV4dGFyZWEuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRleHRhcmVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICByb3dzICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNSRVFVSVJFRAotICAgICAgY29scyAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGRpc2FibGVkICAgICAoIGRpc2FibGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHJlYWRvbmx5ICAgICAoIHJlYWRvbmx5ICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHRleHRhcmVhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZmllbGRzZXQ6IEZvcm0gQ29udHJvbCBHcm91cCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tICNQQ0RBVEEgaXMgdG8gc29sdmUgdGhlIG1peGVkIGNvbnRlbnQgcHJvYmxlbSwKLSAgICAgcGVyIHNwZWNpZmljYXRpb24gb25seSB3aGl0ZXNwYWNlIGlzIGFsbG93ZWQKLS0tPgotCi08IUVOVElUWSAlIGZpZWxkc2V0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZmllbGRzZXQuZWxlbWVudDtbCi08IUVOVElUWSAlIGZpZWxkc2V0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVsZWdlbmQucW5hbWU7IHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlZmllbGRzZXQucW5hbWU7ICAlZmllbGRzZXQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZmllbGRzZXQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBmaWVsZHNldC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWZpZWxkc2V0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVmaWVsZHNldC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZmllbGRzZXQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBsZWdlbmQ6IEZpZWxkc2V0IExlZ2VuZCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGVnZW5kLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGVnZW5kLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBsZWdlbmQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICVsZWdlbmQucW5hbWU7ICAlbGVnZW5kLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxlZ2VuZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxlZ2VuZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxlZ2VuZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGVnZW5kLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBsZWdlbmQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBidXR0b246IFB1c2ggQnV0dG9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYnV0dG9uLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYnV0dG9uLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBidXR0b24uY29udGVudAotICAgICAiKCAjUENEQVRBCi0gICAgICB8ICVCbGtOb0Zvcm0ubWl4OwotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUlubFByZXMuY2xhc3M7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsgKSoiCi0+Ci08IUVMRU1FTlQgJWJ1dHRvbi5xbmFtZTsgICVidXR0b24uY29udGVudDsgPgotPCEtLSBlbmQgb2YgYnV0dG9uLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYnV0dG9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYnV0dG9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVidXR0b24ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAoIGJ1dHRvbiB8IHN1Ym1pdCB8IHJlc2V0ICkgJ3N1Ym1pdCcKLSAgICAgIGRpc2FibGVkICAgICAoIGRpc2FibGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGJ1dHRvbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1mb3JtLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gTGVnYWN5IE1hcmt1cCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtbGVnYWN5Lm1vZHVsZSAiSUdOT1JFIiA+Ci08IVsleGh0bWwtbGVnYWN5Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWxlZ2FjeS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExlZ2FjeSBNYXJrdXAgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGVnYWN5LTEubW9kIiA+Ci0leGh0bWwtbGVnYWN5Lm1vZDtdXT4KLQotPCEtLSBEb2N1bWVudCBTdHJ1Y3R1cmUgTW9kdWxlIChyZXF1aXJlZCkgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1zdHJ1Y3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtc3RydWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXN0cnVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIERvY3VtZW50IFN0cnVjdHVyZSAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHJ1Y3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgU3RydWN0dXJlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3RydWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIERvY3VtZW50IFN0cnVjdHVyZSAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXN0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBEb2N1bWVudCBTdHJ1Y3R1cmUKLQotICAgICAgICB0aXRsZSwgaGVhZCwgYm9keSwgaHRtbAotCi0gICAgIFRoZSBTdHJ1Y3R1cmUgTW9kdWxlIGRlZmluZXMgdGhlIG1ham9yIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kCi0gICAgIHRoZWlyIGF0dHJpYnV0ZXMuCi0KLSAgICAgTm90ZSB0aGF0IHRoZSBjb250ZW50IG1vZGVsIG9mIHRoZSBoZWFkIGVsZW1lbnQgdHlwZSBpcyByZWRlY2xhcmVkCi0gICAgIHdoZW4gdGhlIEJhc2UgTW9kdWxlIGlzIGluY2x1ZGVkIGluIHRoZSBEVEQuCi0KLSAgICAgVGhlIHBhcmFtZXRlciBlbnRpdHkgY29udGFpbmluZyB0aGUgWE1MIG5hbWVzcGFjZSBVUkkgdmFsdWUgdXNlZAotICAgICBmb3IgWEhUTUwgaXMgJyVYSFRNTC54bWxuczsnLCBkZWZpbmVkIGluIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlLgotLS0+Ci0KLTwhLS0gdGl0bGU6IERvY3VtZW50IFRpdGxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFRoZSB0aXRsZSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotLS0+Ci0KLTwhRU5USVRZICUgdGl0bGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0aXRsZS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGl0bGUuY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVOVElUWSAlIHRpdGxlLnFuYW1lICAidGl0bGUiID4KLTwhRUxFTUVOVCAldGl0bGUucW5hbWU7ICAldGl0bGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGl0bGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0aXRsZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRpdGxlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0aXRsZS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0aXRsZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGhlYWQ6IERvY3VtZW50IEhlYWQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaGVhZC5lbGVtZW50O1sKLTwhRU5USVRZICUgaGVhZC5jb250ZW50Ci0gICAgIiggJUhlYWRPcHRzLm1peDssICV0aXRsZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICkiCi0+Ci08IUVOVElUWSAlIGhlYWQucW5hbWUgICJoZWFkIiA+Ci08IUVMRU1FTlQgJWhlYWQucW5hbWU7ICAlaGVhZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoZWFkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaGVhZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWhlYWQuYXR0bGlzdDtbCi08IS0tIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIHdpdGggZG9jdW1lbnQgcHJvZmlsZXMKLS0tPgotPCFFTlRJVFkgJSBwcm9maWxlLmF0dHJpYgotICAgICAicHJvZmlsZSAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAnJVhIVE1MLnByb2ZpbGU7JyIKLT4KLQotPCFBVFRMSVNUICVoZWFkLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgICVwcm9maWxlLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGhlYWQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBib2R5OiBEb2N1bWVudCBCb2R5IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYm9keS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJvZHkuZWxlbWVudDtbCi08IUVOVElUWSAlIGJvZHkuY29udGVudAotICAgICAiKCAlQmxvY2subWl4OyApKyIKLT4KLTwhRU5USVRZICUgYm9keS5xbmFtZSAgImJvZHkiID4KLTwhRUxFTUVOVCAlYm9keS5xbmFtZTsgICVib2R5LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJvZHkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBib2R5LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYm9keS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYm9keS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYm9keS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGh0bWw6IFhIVE1MIERvY3VtZW50IEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBodG1sLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaHRtbC5lbGVtZW50O1sKLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICAiKCAlaGVhZC5xbmFtZTssICVib2R5LnFuYW1lOyApIiA+Ci08IUVOVElUWSAlIGh0bWwucW5hbWUgICJodG1sIiA+Ci08IUVMRU1FTlQgJWh0bWwucW5hbWU7ICAlaHRtbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBodG1sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaHRtbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWh0bWwuYXR0bGlzdDtbCi08IS0tIHZlcnNpb24gYXR0cmlidXRlIHZhbHVlIGRlZmluZWQgaW4gZHJpdmVyCi0tLT4KLTwhRU5USVRZICUgWEhUTUwudmVyc2lvbi5hdHRyaWIKLSAgICAgInZlcnNpb24gICAgICAlRlBJLmRhdGF0eXBlOyAgICAgICAgICAgI0ZJWEVEICclWEhUTUwudmVyc2lvbjsnIgotPgotCi08IS0tIHNlZSB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZSBmb3IgaW5mb3JtYXRpb24KLSAgICAgb24gaG93IHRvIGV4dGVuZCBYSFRNTCB1c2luZyBYTUwgbmFtZXNwYWNlcwotLS0+Ci08IUFUVExJU1QgJWh0bWwucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJVhIVE1MLnZlcnNpb24uYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaHRtbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgWEhUTUwgMS4xIERURCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc0OGRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1kb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMCA9IFhIVE1MIDEuMCBTdHJpY3QKLWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS4xID0gWEhUTUwgMS4wIFRyYW5zaXRpb25hbAotZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjIgPSBYSFRNTCAxLjAgRnJhbWVzZXQKLWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS4zID0gWEhUTUwgQmFzaWMgMS4wCi1kb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuNCA9IFhIVE1MIDEuMQotZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjUgPSBYSFRNTCBNUCAxLjAKLWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS42ID0gV01MIDEuMwotQnVuZGxlLU5hbWUuMCA9IFN0YW5kYXJkIFNjaGVtYXMgYW5kIERURHMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjE4MjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCi0gICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgIDwhLS0gQ2F0YWxvZyBDb250cmlidXRpb25zICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFJlZ2lzdGVyIHdlbGwga25vd24gV2ViIERURHMgYW5kIFhTRHMgICAgLS0+Ci0gICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0gICAgPCEtLSBuZXcgZm9ybSAtLT4KLQotICAgIDwhLS0gCi0gICAgICAgIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwNDgxCi0gICAgICAgIHlvdSBtYXkgaGF2ZSB0byBjb21tZW50IG91dCBmb2xsb3dpbmcgZXh0ZW5zaW9uIGlmIHVzZWQgCi0gICAgICAgIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAKLSAgICAgICAgCi0gICAgLS0+Ci0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiPgotICAgICAgICA8Y2F0YWxvZ0NvbnRyaWJ1dGlvbiBpZD0iZGVmYXVsdCI+Ci0KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XQVBGT1JVTS8vRFREIFdNTCAxLjEvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy93bWwxMS5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3hodG1sMS1zdHJpY3QuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy94aHRtbDEtZnJhbWVzZXQuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3hodG1sLWJhc2ljMTAtZi5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy94aHRtbDExLWZsYXQuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vV0FQRk9SVU0vL0RURCBYSFRNTCBNb2JpbGUgMS4wLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMveGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQveGh0bWwtbW9iaWxlMTAuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1dBUEZPUlVNLy9EVEQgV01MIDEuMy8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3dtbDEzLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWwxMy5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy9mcmFtZXNldC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9mcmFtZXNldC5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxLy9FTi8vSFRNTCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMvSFRNTGxhdDEuZW50IgotICAgICAgICAgICAgICAgIHdlYlVSTD0iSFRNTGxhdDEuZW50Ij4KLSAgICAgICAgICAgIDwvcHVibGljPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTSIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMvSFRNTHNwZWNpYWwuZW50IgotICAgICAgICAgICAgICAgIHdlYlVSTD0iSFRNTHNwZWNpYWwuZW50Ij4KLSAgICAgICAgICAgIDwvcHVibGljPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRU5USVRJRVMgU3ltYm9scy8vRU4vL0hUTUwiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL0hUTUxzeW1ib2wuZW50IgotICAgICAgICAgICAgICAgIHdlYlVSTD0iSFRNTHN5bWJvbC5lbnQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL2xvb3NlLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLSAgICAgICAgCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3N0cmljdC5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgICAgdXJpPSJ4c2Qvd3NkbC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICAgICB1cmk9InhzZC9zb2FwLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotICAgICAgICAgICAgICAgIHVyaT0ieHNkL2h0dHAueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iCi0gICAgICAgICAgICAgICAgdXJpPSJ4c2Qvd3NkbC1taW1lLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB1cmk9InhzZC9zb2FwZW5jLnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8IS0tIHRoZXNlIGFyZSByZW1vdmVkIGZyb20gdGhlIGNhdGFsb2csIHNpbmNlIHRoZXkgYXJlIC1ub3QtIAotICAgICAgICAgICAgdGhlIHNhbWUgYXMgdGhvc2UgaW4gdGhlIHhzZC51aSBwbHVnaW4sIHdoaWNoIAotICAgICAgICAgICAgcG9pbnQgdG8gdGhlIG9yZy5lY2xpcHNlLnhzZCB2ZXJzaW9ucwotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvWE1MU2NoZW1hLmR0ZCIgLz4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDxzeXN0ZW0KLSAgICAgICAgICAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMveG1sLnhzZCIgLz4KLSAgICAgICAgICAgICAtLT4KLSAgICAgICAgPC9jYXRhbG9nQ29udHJpYnV0aW9uPgotCi0gICAgPC9leHRlbnNpb24+Ci0KLQotCi0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnRUeXBlcyI+Ci0gICAgICAgIDxkb2N1bWVudFR5cGUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lPSJodG1sIgotICAgICAgICAgICAgZGlzcGxheU5hbWU9IiVkb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMCIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgIGlzWEhUTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci0gICAgICAgIDwvZG9jdW1lbnRUeXBlPgotICAgICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjEiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAgICAgZGVmYXVsdFhIVE1MPSJ0cnVlIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9Imh0bWwiCi0gICAgICAgICAgICBkaXNwbGF5TmFtZT0iJWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS4yIgotICAgICAgICAgICAgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgaXNYSFRNTD0idHJ1ZSIKLSAgICAgICAgICAgIGhhc0ZyYW1lc2V0PSJ0cnVlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIj4KLSAgICAgICAgPC9kb2N1bWVudFR5cGU+Ci0gICAgICAgIDxkb2N1bWVudFR5cGUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lPSJodG1sIgotICAgICAgICAgICAgZGlzcGxheU5hbWU9IiVkb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMyIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgIGlzWEhUTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKLSAgICAgICAgICAgIHN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCI+Ci0gICAgICAgIDwvZG9jdW1lbnRUeXBlPgotICAgICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjQiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9Imh0bWwiCi0gICAgICAgICAgICBkaXNwbGF5TmFtZT0iJWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS41IgotICAgICAgICAgICAgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgaXNYSFRNTD0idHJ1ZSIKLSAgICAgICAgICAgIGhhc0ZyYW1lc2V0PSJmYWxzZSIKLSAgICAgICAgICAgIHB1YmxpY0lEPSItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9IndtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjYiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9IiIKLSAgICAgICAgICAgIGlzV01MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1dBUEZPUlVNLy9EVEQgV01MIDEuMy8vRU4iCi0gICAgICAgICAgICBkZWZhdWx0V01MPSJ0cnVlIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWwxMy5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9odHRwLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL2h0dHAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ2NmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL2h0dHAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAKLUNvcHlyaWdodCAyMDAxIC0gMjAwNSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uCi1BbGwgUmlnaHRzIFJlc2VydmVkCi0KLUxpY2Vuc2UgZm9yIFdTREwgU2NoZW1hIEZpbGVzCi0KLVRoZSBBdXRob3JzIGdyYW50IHBlcm1pc3Npb24gdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgV1NETCBTY2hlbWEgCi1GaWxlcyBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBhbmQgCi1saWNlbnNlIGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZW0uICBUaGUgb3JpZ2luYWxzIG9mIHRoZXNlIGZpbGVzIGNhbiAKLWJlIGxvY2F0ZWQgYXQ6Ci0KLWh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC93c2RsLWh0dHAueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLQotICAtLT4gCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyI+Ci0KLQk8aW1wb3J0IG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotCi0gICAJPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgdHlwZT0iaHR0cDphZGRyZXNzVHlwZSIvPgotCi0gICAJPGNvbXBsZXhUeXBlIG5hbWU9ImFkZHJlc3NUeXBlIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQkJCTxzZXF1ZW5jZS8+Ci0KLSAgIAkJCTxhdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLSAgIAk8L2NvbXBsZXhUeXBlPgotCi0gICAJPGVsZW1lbnQgbmFtZT0iYmluZGluZyIgdHlwZT0iaHR0cDpiaW5kaW5nVHlwZSIvPgotICAgCTxjb21wbGV4VHlwZSBuYW1lPSJiaW5kaW5nVHlwZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJPGV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0KLQkJCTxzZXF1ZW5jZS8+Ci0JICAgICAgCQk8YXR0cmlidXRlIG5hbWU9InZlcmIiIHR5cGU9Ik5NVE9LRU4iIHVzZT0icmVxdWlyZWQiLz4KLQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0gICAJPC9jb21wbGV4VHlwZT4KLQotICAgCTxlbGVtZW50IG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0iaHR0cDpvcGVyYXRpb25UeXBlIi8+Ci0gICAJPGNvbXBsZXhUeXBlIG5hbWU9Im9wZXJhdGlvblR5cGUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0KLQkJPGV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0JCQk8c2VxdWVuY2UvPgotCSAgICAgIAkJPGF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0KLSAgIAk8ZWxlbWVudCBuYW1lPSJ1cmxFbmNvZGVkIj4KLSAgICAgIAkJPGNvbXBsZXhUeXBlLz4gIAkJCi0gICAJPC9lbGVtZW50PgotCi0gICAJPGVsZW1lbnQgbmFtZT0idXJsUmVwbGFjZW1lbnQiPgotICAgICAgCQk8Y29tcGxleFR5cGUvPgotICAgICAJPC9lbGVtZW50PgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvc29hcC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmODUyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotIAotQ29weXJpZ2h0IDIwMDEgLSAyMDA1LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KLUFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotTGljZW5zZSBmb3IgV1NETCBTY2hlbWEgRmlsZXMKLQotVGhlIEF1dGhvcnMgZ3JhbnQgcGVybWlzc2lvbiB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBXU0RMIFNjaGVtYSAKLUZpbGVzIGluIGFueSBtZWRpdW0gd2l0aG91dCBmZWUgb3Igcm95YWx0eSBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGFuZCAKLWxpY2Vuc2UgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlbS4gIFRoZSBvcmlnaW5hbHMgb2YgdGhlc2UgZmlsZXMgY2FuIAotYmUgbG9jYXRlZCBhdDoKLQotaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLzIwMDMtMDItMTEueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLS0tPiAKLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiA+Ci0KLSAgPHhzOmltcG9ydCBuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIC8+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW5jb2RpbmdTdHlsZSIgPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAiZW5jb2RpbmdTdHlsZSIgaW5kaWNhdGVzIGFueSBjYW5vbmljYWxpemF0aW9uIGNvbnZlbnRpb25zIGZvbGxvd2VkIGluIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmluZyBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIGluZGljYXRlcyB0aGUgcGF0dGVybiBkZXNjcmliZWQgaW4gU09BUCBzcGVjaWZpY2F0aW9uCi0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotCi0gICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOmFueVVSSSIgLz4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImJpbmRpbmciIHR5cGU9InNvYXA6dEJpbmRpbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0QmluZGluZyIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc3BvcnQiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZSIgdHlwZT0ic29hcDp0U3R5bGVDaG9pY2UiIHVzZT0ib3B0aW9uYWwiIC8+Ci0KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idFN0eWxlQ2hvaWNlIiA+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIgPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJycGMiIC8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRvY3VtZW50IiAvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ic29hcDp0T3BlcmF0aW9uIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idE9wZXJhdGlvbiIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb2FwQWN0aW9uIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3R5bGUiIHR5cGU9InNvYXA6dFN0eWxlQ2hvaWNlIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImJvZHkiIHR5cGU9InNvYXA6dEJvZHkiIC8+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJ0Qm9keUF0dHJpYnV0ZXMiID4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nU3R5bGUiIHR5cGU9InNvYXA6ZW5jb2RpbmdTdHlsZSIgdXNlPSJvcHRpb25hbCIgLz4JICAgCi0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UiIHR5cGU9InNvYXA6dXNlQ2hvaWNlIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0Qm9keSIgPgotCi0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhcnRzIiB0eXBlPSJ4czpOTVRPS0VOUyIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZiA9ICJzb2FwOnRCb2R5QXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIAotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1c2VDaG9pY2UiID4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIiA+Ci0KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGl0ZXJhbCIgLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZW5jb2RlZCIgLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9InNvYXA6dEZhdWx0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEZhdWx0UmVzIiBhYnN0cmFjdD0idHJ1ZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJzb2FwOnRCb2R5IiA+Ci0KLQkgICAgPHhzOmF0dHJpYnV0ZSByZWY9IndzZGw6cmVxdWlyZWQiIHVzZT0ib3B0aW9uYWwiIC8+IAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhcnRzIiB0eXBlPSJ4czpOTVRPS0VOUyIgdXNlPSJwcm9oaWJpdGVkIiAvPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJzb2FwOnRCb2R5QXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4gIAkKLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRGYXVsdCIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ic29hcDp0RmF1bHRSZXMiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLQotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotCi0gIDx4czplbGVtZW50IG5hbWU9ImhlYWRlciIgdHlwZT0ic29hcDp0SGVhZGVyIiAvPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0idEhlYWRlckF0dHJpYnV0ZXMiID4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFydCIgdHlwZT0ieHM6Tk1UT0tFTiIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdHlwZT0ic29hcDp1c2VDaG9pY2UiIHVzZT0icmVxdWlyZWQiIC8+Ci0KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nU3R5bGUiIHR5cGU9InNvYXA6ZW5jb2RpbmdTdHlsZSIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9Im9wdGlvbmFsIiAvPiAgICAgIAotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEhlYWRlciIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ic29hcDpoZWFkZXJmYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLQotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJzb2FwOnRIZWFkZXJBdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJoZWFkZXJmYXVsdCIgdHlwZT0ic29hcDp0SGVhZGVyRmF1bHQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0SGVhZGVyRmF1bHQiID4KLQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJzb2FwOnRIZWFkZXJBdHRyaWJ1dGVzIiAvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImFkZHJlc3MiIHR5cGU9InNvYXA6dEFkZHJlc3MiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0QWRkcmVzcyIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvc29hcGVuYy54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwZW5jLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjODBkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwZW5jLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgPz4KLQotPCEtLSBTY2hlbWEgZm9yIHRoZSBTT0FQLzEuMSBlbmNvZGluZwotCi1Qb3J0aW9ucyDCqSAyMDAxIERldmVsb3BNZW50b3IuIAotwqkgMjAwMSBXM0MgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAKLSAKLVRoaXMgZG9jdW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIFczQyBTb2Z0d2FyZSBMaWNlbnNlIFsxXSBhcyBkZXNjcmliZWQgaW4gdGhlIEZBUSBbMl0uCi1bMV0gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAKLVsyXSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQgCi1CeSBvYnRhaW5pbmcsIHVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywgeW91ICh0aGUgbGljZW5zZWUpIGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbiBBTEwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucywgdGhhdCB5b3UgbWFrZToKLQotMS4gIFRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIHdvcmsuIAotCi0yLiAgQW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zIGFuZCBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCBhIHNob3J0IG5vdGljZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0gKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSBzaG91bGQgYmUgdXNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlOiAiQ29weXJpZ2h0IMKpIDIwMDEgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIiAKLQotMy4gIE5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBXM0MgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZSBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKSAgIAotCi1PcmlnaW5hbCBXM0MgZmlsZXM7IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDYvc29hcC1lbmNvZGluZwotQ2hhbmdlcyBtYWRlOiAKLSAgICAgLSByZXZlcnRlZCBuYW1lc3BhY2UgdG8gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgLSByZXZlcnRlZCByb290IHRvIG9ubHkgYWxsb3cgMCBhbmQgMSBhcyBsZXhpY2FsIHZhbHVlcwotCSAtIHJlbW92ZWQgZGVmYXVsdCB2YWx1ZSBmcm9tIHJvb3QgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0KLVRISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLgotCi1DT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGl0bGUgdG8gY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0IGhvbGRlcnMuCi0KLS0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iID4KLSAgICAgICAgCi0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJyb290IiA+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0JICAgJ3Jvb3QnIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHNlcmlhbGl6YXRpb24gcm9vdHMgZnJvbSBvdGhlcgotICAgICAgIGVsZW1lbnRzIHRoYXQgYXJlIHByZXNlbnQgaW4gYSBzZXJpYWxpemF0aW9uIGJ1dCBhcmUgbm90IHJvb3RzIG9mCi0gICAgICAgYSBzZXJpYWxpemVkIHZhbHVlIGdyYXBoIAotCSA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLQotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6Ym9vbGVhbic+Ci0JICAgPHhzOnBhdHRlcm4gdmFsdWU9JzB8MScgLz4KLQkgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iY29tbW9uQXR0cmlidXRlcyIgPgotICAgIDx4czphbm5vdGF0aW9uPgotCSAgPHhzOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQXR0cmlidXRlcyBjb21tb24gdG8gYWxsIGVsZW1lbnRzIHRoYXQgZnVuY3Rpb24gYXMgYWNjZXNzb3JzIG9yIAotICAgICAgICByZXByZXNlbnQgaW5kZXBlbmRlbnQgKG11bHRpLXJlZikgdmFsdWVzLiAgVGhlIGhyZWYgYXR0cmlidXRlIGlzCi0gICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gYSBtYW5uZXIgbGlrZSBDT05SRUYuICBUaGF0IGlzLCB0aGUgZWxlbWVudAotICAgICAgICBjb250ZW50IHNob3VsZCBiZSBlbXB0eSBpZmYgdGhlIGhyZWYgYXR0cmlidXRlIGFwcGVhcnMKLQkgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJ4czphbnlVUkkiIC8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi0gIDwhLS0gR2xvYmFsIEF0dHJpYnV0ZXMuICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVuZGVkIHRvIGJlIHVzYWJsZSB2aWEgcXVhbGlmaWVkIGF0dHJpYnV0ZSBuYW1lcyBvbiBhbnkgY29tcGxleCB0eXBlIHJlZmVyZW5jaW5nIHRoZW0uIC0tPgotICAgICAgIAotICA8IS0tIEFycmF5IGF0dHJpYnV0ZXMuIE5lZWRlZCB0byBnaXZlIHRoZSB0eXBlIGFuZCBkaW1lbnNpb25zIG9mIGFuIGFycmF5J3MgY29udGVudHMsIGFuZCB0aGUgb2Zmc2V0IGZvciBwYXJ0aWFsbHktdHJhbnNtaXR0ZWQgYXJyYXlzLiAtLT4KLQotICAgCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFycmF5Q29vcmRpbmF0ZSIgPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciIC8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAKLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcnJheVR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvZmZzZXQiIHR5cGU9InRuczphcnJheUNvb3JkaW5hdGUiIC8+Ci0gIAotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iYXJyYXlBdHRyaWJ1dGVzIiA+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczphcnJheVR5cGUiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczpvZmZzZXQiIC8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+ICAgIAotICAKLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwb3NpdGlvbiIgdHlwZT0idG5zOmFycmF5Q29vcmRpbmF0ZSIgLz4gCi0gIAotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iYXJyYXlNZW1iZXJBdHRyaWJ1dGVzIiA+Ci0KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOnBvc2l0aW9uIiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPiAgICAKLQotICA8eHM6Z3JvdXAgbmFtZT0iQXJyYXkiID4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCTwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iQXJyYXkiIHR5cGU9InRuczpBcnJheSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFycmF5IiA+Ci0KLSAgICA8eHM6YW5ub3RhdGlvbj4KLQkgIDx4czpkb2N1bWVudGF0aW9uPgotCSAgICdBcnJheScgaXMgYSBjb21wbGV4IHR5cGUgZm9yIGFjY2Vzc29ycyBpZGVudGlmaWVkIGJ5IHBvc2l0aW9uIAotCSAgPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0bnM6QXJyYXkiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6YXJyYXlBdHRyaWJ1dGVzIiAvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICA8L3hzOmNvbXBsZXhUeXBlPiAKLQotICA8IS0tICdTdHJ1Y3QnIGlzIGEgY29tcGxleCB0eXBlIGZvciBhY2Nlc3NvcnMgaWRlbnRpZmllZCBieSBuYW1lLiAKLSAgICAgICBDb25zdHJhaW50OiBObyBlbGVtZW50IG1heSBiZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYW55IG90aGVyLAotICAgICAgIG5vciBtYXkgYW55IGVsZW1lbnQgaGF2ZSBhIG1heE9jY3VycyA+IDEuIC0tPgotCi0gICAKLSAgPHhzOmVsZW1lbnQgbmFtZT0iU3RydWN0IiB0eXBlPSJ0bnM6U3RydWN0IiAvPgotCi0gIDx4czpncm91cCBuYW1lPSJTdHJ1Y3QiID4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCTwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlN0cnVjdCIgPgotICAgIDx4czpncm91cCByZWY9InRuczpTdHJ1Y3QiIG1pbk9jY3Vycz0iMCIgLz4KLQotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+IAotCi0gIDwhLS0gJ0Jhc2U2NCcgY2FuIGJlIHVzZWQgdG8gc2VyaWFsaXplIGJpbmFyeSBkYXRhIHVzaW5nIGJhc2U2NCBlbmNvZGluZwotICAgICAgIGFzIGRlZmluZWQgaW4gUkZDMjA0NSBidXQgd2l0aG91dCB0aGUgTUlNRSBsaW5lIGxlbmd0aCBsaW1pdGF0aW9uLiAtLT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJiYXNlNjQiID4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YmFzZTY0QmluYXJ5IiAvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8IS0tIEVsZW1lbnQgZGVjbGFyYXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBvZiB0aGUgc2ltcGxlIHR5cGVzIGluIHRoZSAKLSAgICAgIFhNTCBTY2hlbWFzIFNwZWNpZmljYXRpb24uIC0tPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJ0bnM6ZHVyYXRpb24iIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImR1cmF0aW9uIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmR1cmF0aW9uIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImRhdGVUaW1lIiB0eXBlPSJ0bnM6ZGF0ZVRpbWUiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGVUaW1lIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmRhdGVUaW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOT1RBVElPTiIgdHlwZT0idG5zOk5PVEFUSU9OIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk9UQVRJT04iID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6UU5hbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIAotCi0gIDx4czplbGVtZW50IG5hbWU9InRpbWUiIHR5cGU9InRuczp0aW1lIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnRpbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0ZSIgdHlwZT0idG5zOmRhdGUiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGF0ZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnWWVhck1vbnRoIiB0eXBlPSJ0bnM6Z1llYXJNb250aCIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ1llYXJNb250aCIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnWWVhck1vbnRoIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdZZWFyIiB0eXBlPSJ0bnM6Z1llYXIiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdZZWFyIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdZZWFyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdNb250aERheSIgdHlwZT0idG5zOmdNb250aERheSIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ01vbnRoRGF5IiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdNb250aERheSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnRGF5IiB0eXBlPSJ0bnM6Z0RheSIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ0RheSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnRGF5IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdNb250aCIgdHlwZT0idG5zOmdNb250aCIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ01vbnRoIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdNb250aCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgCi0gIDx4czplbGVtZW50IG5hbWU9ImJvb2xlYW4iIHR5cGU9InRuczpib29sZWFuIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYm9vbGVhbiIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJvb2xlYW4iID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYmFzZTY0QmluYXJ5IiB0eXBlPSJ0bnM6YmFzZTY0QmluYXJ5IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYmFzZTY0QmluYXJ5IiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YmFzZTY0QmluYXJ5IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImhleEJpbmFyeSIgdHlwZT0idG5zOmhleEJpbmFyeSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhleEJpbmFyeSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aGV4QmluYXJ5IiA+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJmbG9hdCIgdHlwZT0idG5zOmZsb2F0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZmxvYXQiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpmbG9hdCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkb3VibGUiIHR5cGU9InRuczpkb3VibGUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkb3VibGUiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkb3VibGUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYW55VVJJIiB0eXBlPSJ0bnM6YW55VVJJIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW55VVJJIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW55VVJJIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IlFOYW1lIiB0eXBlPSJ0bnM6UU5hbWUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJRTmFtZSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOlFOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIAotICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InRuczpzdHJpbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzdHJpbmciID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibm9ybWFsaXplZFN0cmluZyIgdHlwZT0idG5zOm5vcm1hbGl6ZWRTdHJpbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub3JtYWxpemVkU3RyaW5nIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bm9ybWFsaXplZFN0cmluZyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0b2tlbiIgdHlwZT0idG5zOnRva2VuIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9rZW4iID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp0b2tlbiIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJsYW5ndWFnZSIgdHlwZT0idG5zOmxhbmd1YWdlIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibGFuZ3VhZ2UiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpsYW5ndWFnZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ0bnM6TmFtZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWUiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5NVE9LRU4iIHR5cGU9InRuczpOTVRPS0VOIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk1UT0tFTiIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5NVE9LRU4iID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iTkNOYW1lIiB0eXBlPSJ0bnM6TkNOYW1lIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTkNOYW1lIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6TkNOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5NVE9LRU5TIiB0eXBlPSJ0bnM6Tk1UT0tFTlMiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOTVRPS0VOUyIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5NVE9LRU5TIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IklEIiB0eXBlPSJ0bnM6SUQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOklEIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IklEUkVGIiB0eXBlPSJ0bnM6SURSRUYiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRFJFRiIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOklEUkVGIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IkVOVElUWSIgdHlwZT0idG5zOkVOVElUWSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVOVElUWSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOkVOVElUWSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJJRFJFRlMiIHR5cGU9InRuczpJRFJFRlMiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRFJFRlMiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpJRFJFRlMiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iRU5USVRJRVMiIHR5cGU9InRuczpFTlRJVElFUyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVOVElUSUVTIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6RU5USVRJRVMiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVjaW1hbCIgdHlwZT0idG5zOmRlY2ltYWwiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkZWNpbWFsIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGVjaW1hbCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnRlZ2VyIiB0eXBlPSJ0bnM6aW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImludGVnZXIiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czppbnRlZ2VyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im5vblBvc2l0aXZlSW50ZWdlciIgdHlwZT0idG5zOm5vblBvc2l0aXZlSW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5vblBvc2l0aXZlSW50ZWdlciIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5vblBvc2l0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJuZWdhdGl2ZUludGVnZXIiIHR5cGU9InRuczpuZWdhdGl2ZUludGVnZXIiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJuZWdhdGl2ZUludGVnZXIiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpuZWdhdGl2ZUludGVnZXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibG9uZyIgdHlwZT0idG5zOmxvbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb25nIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bG9uZyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9InRuczppbnQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJpbnQiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czppbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic2hvcnQiIHR5cGU9InRuczpzaG9ydCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNob3J0IiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c2hvcnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYnl0ZSIgdHlwZT0idG5zOmJ5dGUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJieXRlIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Ynl0ZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiIHR5cGU9InRuczpub25OZWdhdGl2ZUludGVnZXIiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRMb25nIiB0eXBlPSJ0bnM6dW5zaWduZWRMb25nIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRMb25nIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRMb25nIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkSW50IiB0eXBlPSJ0bnM6dW5zaWduZWRJbnQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZEludCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnVuc2lnbmVkSW50IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkU2hvcnQiIHR5cGU9InRuczp1bnNpZ25lZFNob3J0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRTaG9ydCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnVuc2lnbmVkU2hvcnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRCeXRlIiB0eXBlPSJ0bnM6dW5zaWduZWRCeXRlIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRCeXRlIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRCeXRlIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InBvc2l0aXZlSW50ZWdlciIgdHlwZT0idG5zOnBvc2l0aXZlSW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InBvc2l0aXZlSW50ZWdlciIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnBvc2l0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlUeXBlIiAvPgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC93c2RsLW1pbWUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvd3NkbC1taW1lLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3YTUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC93c2RsLW1pbWUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gCi1Db3B5cmlnaHQgMjAwMS0yMDA1LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KLUFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotTGljZW5zZSBmb3IgV1NETCBTY2hlbWEgRmlsZXMKLQotVGhlIEF1dGhvcnMgZ3JhbnQgcGVybWlzc2lvbiB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBXU0RMIFNjaGVtYSAKLUZpbGVzIGluIGFueSBtZWRpdW0gd2l0aG91dCBmZWUgb3Igcm95YWx0eSBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGFuZCAKLWxpY2Vuc2UgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlbS4gIFRoZSBvcmlnaW5hbHMgb2YgdGhlc2UgZmlsZXMgY2FuIAotYmUgbG9jYXRlZCBhdDoKLQotaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLzIwMDQtMDgtMjQueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLSAgLS0+IAotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iPgotCTxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotCTxlbGVtZW50IG5hbWU9ImNvbnRlbnQiIHR5cGU9Im1pbWU6Y29udGVudFR5cGUiLz4KLQk8Y29tcGxleFR5cGUgbmFtZT0iY29udGVudFR5cGUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQkJCQk8c2VxdWVuY2UvPgotCQkJCTxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJPGF0dHJpYnV0ZSBuYW1lPSJwYXJ0IiB0eXBlPSJOTVRPS0VOIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxlbGVtZW50IG5hbWU9Im11bHRpcGFydFJlbGF0ZWQiIHR5cGU9Im1pbWU6bXVsdGlwYXJ0UmVsYXRlZFR5cGUiLz4KLQk8Y29tcGxleFR5cGUgbmFtZT0ibXVsdGlwYXJ0UmVsYXRlZFR5cGUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IHJlZj0ibWltZTpwYXJ0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGVsZW1lbnQgbmFtZT0icGFydCIgdHlwZT0ibWltZTp0UGFydCIvPgotCTxjb21wbGV4VHlwZSBuYW1lPSJ0UGFydCI+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3NlcXVlbmNlPgotCQk8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9Ik5NVE9LRU4iIHVzZT0ib3B0aW9uYWwiLz4KLQk8L2NvbXBsZXhUeXBlPgotICAgCTxlbGVtZW50IG5hbWU9Im1pbWVYbWwiIHR5cGUgPSAibWltZTp0TWltZVhtbCIvPgotICAgCTxjb21wbGV4VHlwZSBuYW1lPSJ0TWltZVhtbCI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotCQkJCTxzZXF1ZW5jZS8+Ci0JCQkJPGF0dHJpYnV0ZSBuYW1lPSJwYXJ0IiB0eXBlPSJOTVRPS0VOIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLSAgIAk8L2NvbXBsZXhUeXBlPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC93c2RsLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3dzZGwueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTgxZDYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3dzZGwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gCi1Db3B5cmlnaHQgMjAwMSAtIDIwMDUsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgotQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1MaWNlbnNlIGZvciBXU0RMIFNjaGVtYSBGaWxlcwotCi1UaGUgQXV0aG9ycyBncmFudCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFdTREwgU2NoZW1hIAotRmlsZXMgaW4gYW55IG1lZGl1bSB3aXRob3V0IGZlZSBvciByb3lhbHR5IGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgYW5kIAotbGljZW5zZSBhcmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGVtLiAgVGhlIG9yaWdpbmFscyBvZiB0aGVzZSBmaWxlcyBjYW4gCi1iZSBsb2NhdGVkIGF0OgotCi1odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzIwMDQtMDgtMjQueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLS0tPiAKLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiID4KLSAgIAotICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiIG5hbWU9InREb2N1bWVudGF0aW9uIiA+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmFueSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0RG9jdW1lbnRlZCIgPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgIGNvbXBvbmVudCB0eXBlcyB0byBhbGxvdyB0aGVtIHRvIGJlIGRvY3VtZW50ZWQKLSAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnRhdGlvbiIgdHlwZT0id3NkbDp0RG9jdW1lbnRhdGlvbiIgbWluT2NjdXJzPSIwIiAvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8IS0tIGltcGxlbWVudGVkIHJlc29sdXRpb24gb2Ygc3dhMTI0IC0tPgotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiBhYnN0cmFjdD0idHJ1ZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgY29tcG9uZW50IHR5cGVzIHRvIGFsbG93IGF0dHJpYnV0ZXMgZnJvbSBvdGhlciBuYW1lc3BhY2VzIHRvIGJlIGFkZGVkLgotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+ICAgCi0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPCEtLSBpbXBsZW1lbnRlZCByZXNvbHV0aW9uIG9mIHN3YTEyNCAtLT4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgYWJzdHJhY3Q9InRydWUiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dERvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgVGhpcyB0eXBlIGlzIGV4dGVuZGVkIGJ5IGNvbXBvbmVudCB0eXBlcyB0byBhbGxvdyBlbGVtZW50cyBmcm9tIG90aGVyIG5hbWVzcGFjZXMgdG8gYmUgYWRkZWQuCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4gICAKLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVmaW5pdGlvbnMiIHR5cGU9IndzZGw6dERlZmluaXRpb25zIiA+Ci0gICAgPHhzOmtleSBuYW1lPSJtZXNzYWdlIiA+Ci0gICAgICA8eHM6c2VsZWN0b3IgeHBhdGg9IndzZGw6bWVzc2FnZSIgLz4KLSAgICAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiIC8+Ci0gICAgPC94czprZXk+Ci0gICAgPHhzOmtleSBuYW1lPSJwb3J0VHlwZSIgPgotICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOnBvcnRUeXBlIiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgICA8eHM6a2V5IG5hbWU9ImJpbmRpbmciID4KLSAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0id3NkbDpiaW5kaW5nIiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgICA8eHM6a2V5IG5hbWU9InNlcnZpY2UiID4KLSAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0id3NkbDpzZXJ2aWNlIiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgICA8eHM6a2V5IG5hbWU9ImltcG9ydCIgPgotICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOmltcG9ydCIgLz4KLSAgICAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWVzcGFjZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpncm91cCBuYW1lPSJhbnlUb3BMZXZlbE9wdGlvbmFsRWxlbWVudCIgPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBbnkgdG9wIGxldmVsIG9wdGlvbmFsIGVsZW1lbnQgYWxsb3dlZCB0byBhcHBlYXIgbW9yZSB0aGVuIG9uY2UgLSBhbnkgY2hpbGQgb2YgZGVmaW5pdGlvbnMgZWxlbWVudCBleGNlcHQgd3NkbDp0eXBlcy4gQW55IGV4dGVuc2liaWxpdHkgZWxlbWVudCBpcyBhbGxvd2VkIGluIGFueSBwbGFjZS4KLSAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImltcG9ydCIgdHlwZT0id3NkbDp0SW1wb3J0IiAvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idHlwZXMiIHR5cGU9IndzZGw6dFR5cGVzIiAvPiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgIHR5cGU9IndzZGw6dE1lc3NhZ2UiID4KLSAgICAgICAgPHhzOnVuaXF1ZSBuYW1lPSJwYXJ0IiA+Ci0gICAgICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOnBhcnQiIC8+Ci0gICAgICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICAgICAgPC94czp1bmlxdWU+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwb3J0VHlwZSIgdHlwZT0id3NkbDp0UG9ydFR5cGUiIC8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiaW5kaW5nIiAgdHlwZT0id3NkbDp0QmluZGluZyIgLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiICB0eXBlPSJ3c2RsOnRTZXJ2aWNlIiA+Ci0gICAgICAgIDx4czp1bmlxdWUgbmFtZT0icG9ydCIgPgotICAgICAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0id3NkbDpwb3J0IiAvPgotICAgICAgICAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiIC8+Ci0gICAgICAgIDwveHM6dW5pcXVlPgotCSAgPC94czplbGVtZW50PgotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotCi0gIDwhLS0gaW1wbGVtZW50ZWQgcmVzb2x1dGlvbiBvZiBlcjAxNSBhbmQgVVBBIGZpeC4gQVNLIC0tPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idERlZmluaXRpb25zIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0id3NkbDphbnlUb3BMZXZlbE9wdGlvbmFsRWxlbWVudCIvPgotICAgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ3c2RsOmFueVRvcExldmVsT3B0aW9uYWxFbGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIgdXNlPQotIm9wdGlvbmFsIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0SW1wb3J0IiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlQXR0cmlidXRlc0RvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idFR5cGVzIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgLz4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRNZXNzYWdlIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFydCIgdHlwZT0id3NkbDp0UGFydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0UGFydCIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4gICAKLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIiAvPiAgICAKLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgCi0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRQb3J0VHlwZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4gICAKLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iIHR5cGU9IndzZGw6dE9wZXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0T3BlcmF0aW9uIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotCSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmNob2ljZT4KLSAgICAgICAgICAgIDx4czpncm91cCByZWY9IndzZGw6cmVxdWVzdC1yZXNwb25zZS1vci1vbmUtd2F5LW9wZXJhdGlvbiIgLz4KLSAgICAgICAgICAgIDx4czpncm91cCByZWY9IndzZGw6c29saWNpdC1yZXNwb25zZS1vci1ub3RpZmljYXRpb24tb3BlcmF0aW9uIiAvPgotICAgICAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXJhbWV0ZXJPcmRlciIgdHlwZT0ieHM6Tk1UT0tFTlMiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIAotICA8eHM6Z3JvdXAgbmFtZT0icmVxdWVzdC1yZXNwb25zZS1vci1vbmUtd2F5LW9wZXJhdGlvbiIgPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImlucHV0IiB0eXBlPSJ3c2RsOnRQYXJhbSIgLz4KLQkgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9JzAnID4KLQkgICAgPHhzOmVsZW1lbnQgbmFtZT0ib3V0cHV0IiB0eXBlPSJ3c2RsOnRQYXJhbSIgLz4KLQkJPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9IndzZGw6dEZhdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotCi0gIDx4czpncm91cCBuYW1lPSJzb2xpY2l0LXJlc3BvbnNlLW9yLW5vdGlmaWNhdGlvbi1vcGVyYXRpb24iID4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXQiIHR5cGU9IndzZGw6dFBhcmFtIiAvPgotCSAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0nMCcgPgotCSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnB1dCIgdHlwZT0id3NkbDp0UGFyYW0iIC8+Ci0JCTx4czplbGVtZW50IG5hbWU9ImZhdWx0IiB0eXBlPSJ3c2RsOnRGYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLSAgICAgICAgCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0UGFyYW0iID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVBdHRyaWJ1dGVzRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRGYXVsdCIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEJpbmRpbmciID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iIHR5cGU9IndzZGw6dEJpbmRpbmdPcGVyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRCaW5kaW5nT3BlcmF0aW9uTWVzc2FnZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZURvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRCaW5kaW5nT3BlcmF0aW9uRmF1bHQiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEJpbmRpbmdPcGVyYXRpb24iID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnB1dCIgdHlwZT0id3NkbDp0QmluZGluZ09wZXJhdGlvbk1lc3NhZ2UiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXQiIHR5cGU9IndzZGw6dEJpbmRpbmdPcGVyYXRpb25NZXNzYWdlIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9IndzZGw6dEJpbmRpbmdPcGVyYXRpb25GYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRTZXJ2aWNlIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icG9ydCIgdHlwZT0id3NkbDp0UG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRQb3J0IiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiaW5kaW5nIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcnJheVR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRFeHRlbnNpYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiID4KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0id3NkbDpyZXF1aXJlZCIgdXNlPSJvcHRpb25hbCIgLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5N2QwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWNvbnRlbnRtb2RlbCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1zZWFyY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtdmFsaWRhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1jYXRhbG9nIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWVtZk1vZGVsU3luY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9kb20vVHJlZVdhbGtlckltcGwiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3Jhbmdlcy9Eb2N1bWVudFJhbmdlIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2UiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3RyYXZlcnNhbC9Eb2N1bWVudFRyYXZlcnNhbCIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vdHJhdmVyc2FsL05vZGVGaWx0ZXIiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3RyYXZlcnNhbC9Ob2RlSXRlcmF0b3IiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3RyYXZlcnNhbC9UcmVlV2Fsa2VyIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2VFeGNlcHRpb24iLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL2ltcGwvWE1MRXJyb3JSZXBvcnRlciIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvcGFyc2Vycy9TdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24iLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9BdWdtZW50YXRpb25zIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvTmFtZXNwYWNlQ29udGV4dCIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL1FOYW1lIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvWE1MQXR0cmlidXRlcyIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL1hNTExvY2F0b3IiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9YTUxSZXNvdXJjZUlkZW50aWZpZXIiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9YTklFeGNlcHRpb24iLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9wYXJzZXIvWE1MRW50aXR5UmVzb2x2ZXIiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9wYXJzZXIvWE1MSW5wdXRTb3VyY2UiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3BhcnNlcnMvU0FYUGFyc2VyIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9wYXJzZXJzL0Fic3RyYWN0U0FYUGFyc2VyIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3M2Y4YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi14bWxtb2RlbC5qYXIKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NmU0ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9Ci1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvZGVidWcvY21kb2N1bWVudG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS9kZWJ1Zy9jbWRvY3VtZW50Y2FjaGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE3NTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDA1MzA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNTYXQgTWFyIDI0IDAyOjE4OjIzIEVEVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTVjNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBOb3YgMTUgMDI6MjY6MTAgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Y2E1YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNXZWQgTm92IDE1IDAyOjEzOjMxIEVTVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2U2NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0lJQotCi0ldGFibGUKLSVwdWJsaWMKLSVmaW5hbAotJWNsYXNzIFhNTDEwTmFtZXMKLSVmdW5jdGlvbiBpc1ZhbGlkWE1MMTBOYW1lCi0ldHlwZSBib29sZWFuCi0ldW5pY29kZQotJWlnbm9yZWNhc2UKLSVidWZmZXIgMjA0OAotJWFwaXByaXZhdGUKLQotUyA9IChceDIwIHwgXHgwOSB8IFx4MEQgfCBceDBBKQotCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdCi0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQotCi1Db21iaW5pbmdDaGFyID0gW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0KLQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0KLQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQotCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pCi0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IC4gfCAtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQotCi1OYW1lID0gKHtMZXR0ZXJ9IHwgXyB8IDogKSAoe05hbWVDaGFyfSkqCi0KLQotCi0lewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0JICovCi0JcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0JCXRoaXMuenpSZWFkZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJeXlyZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoc3RyaW5nVG9DaGVjaykpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotCQl9Ci0JCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIHdpdGggc3RyaW5ncywgYnV0IGlmIG9jY3VycywganVzdCBtZWFucwotCQkJLy8gIm5vdCIKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0lfQotCi0KLQotCi0lJQotCi08WVlJTklUSUFMPgotewotCi0JLy8gZG9uJ3QgbWF0Y2ggaWYgY29udGFpbnMgdHJhaWxpbmcgb3IgZW1iZWRkZWQgc3BhY2UKLQl7TmFtZX0ge1N9KyAgICAgICAgIHtyZXR1cm4gZmFsc2U7fQotCXtOYW1lfSB7U30rIHtOYW1lfSAge3JldHVybiBmYWxzZTt9Ci0KLQl7TmFtZX0gICAgICAgICAgICAgIHtyZXR1cm4gdHJ1ZTt9Ci0KLQkvLyBtYXRjaCBhbnl0aGluZyBzaG91bGQgY29tZSBsYXN0Ci0JLiAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGZhbHNlO30KLQotfQotCi0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+Ci17Ci0Je3JldHVybiBmYWxzZTt9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDViMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLypubHNYWFgqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsNCi0NCi0NCi0lJQ0KLQ0KLSV7DQotDQotDQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsNCi0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7DQotDQotDQotCXB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsNCi0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLw0KLSAgICAgICAgICAgICAgICB6elJlYWRlciA9IGluOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICAgICAgICAgICAgICAgIHp6U3RhdGUgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICAgICAgICAgICAgICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLw0KLSAgICAgICAgICAgICAgICB6elB1c2hiYWNrUG9zID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvcyA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLSAgICAgICAgICAgICAgICB6elN0YXJ0UmVhZCA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgICAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dA0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgenpFbmRSZWFkID0gMDsNCi0NCi0gICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotICAgICAgICAgICAgICAgIHl5bGluZSA9IDA7DQotDQotICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQNCi0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dA0KLSAgICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICAgeXljb2x1bW4gPSAwOw0KLQ0KLSAgICAgICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcNCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lDQotICAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICAgICAgLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7DQotDQotICAgICAgICAgICAgICAgIC8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLw0KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsNCi0NCi0NCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsNCi0NCi0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IHRydWU7DQotICAJCQ0KLSAgCX0NCi0NCi0NCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOw0KLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7DQotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOw0KLQkJCXZhbHVlVGV4dCA9IG51bGw7DQotCQl9IGVsc2Ugew0KLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgew0KLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47DQotCX0NCi0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7DQotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotDQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgew0KLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7DQotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7DQotCX0JDQotDQotJX0NCi0NCi0lZW9mew0KLQloYXNNb3JlPWZhbHNlOw0KLSVlb2Z9DQotDQotJXB1YmxpYw0KLSVjbGFzcyBYTUxIZWFkVG9rZW5pemVyDQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSV1bmljb2RlDQotJWlnbm9yZWNhc2UgDQotLy8lZGVidWcNCi0lc3dpdGNoDQotJWJ1ZmZlciA4MTkyDQotDQotVVRGMTZCRSA9IFx4RkVceEZGDQotVVRGMTZMRSA9IFx4RkZceEZFDQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGDQotDQotLy9TcGFjZUNoYXIgPSBbXHgyMFx4MDldDQotDQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsNCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdDQotDQotLy9CZWdpbkF0dHJpYmVWYWx1ZSA9IHtTfSogXD0ge1N9Kg0KLQ0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG4NCi0NCi0vLyBaIGlzIHRoZSBzaW5nbGUtYnl0ZSB6ZXJvIGNoYXJhY3RlciB0byBiZSB1c2VkIGluIHBhcnNpbmcgZG91YmxlLWJ5dGUgZmlsZXMNCi1aID0gKFx4MDApPw0KLVNfVVRGID0ge1p9e1N9e1p9DQotQmVnaW5BdHRyaWJ1dGVWYWx1ZVVURiA9IHtTX1VURn0qIFw9IHtTX1VURn0qDQotDQotJXN0YXRlIFNUX1hNTERlY2wNCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUNCi0lc3RhdGUgRFFfU1RSSU5HDQotJXN0YXRlIFNRX1NUUklORw0KLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZw0KLQ0KLSUlDQotDQotDQotPFlZSU5JVElBTD4gIA0KLXsNCi0JLy8gZm9yY2UgdG8gc3RhcnQgYXQgYmVnaW5uaW5nIG9mIGxpbmUgKF4pIGFuZCBhdCBiZWdpbm5pbmcgb2YgZmlsZSAoeXljaGFyID09IDApDQotCV57VVRGMTZCRX0gICAJCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9fQ0KLQlee1VURjE2TEV9ICAgCQl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fX0NCi0JXntVVEY4M0J5dGVCT019ICAgCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO319DQotCQ0KLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcw0KLQleIHtTX1VURn0qICh7Wn08e1p9XD97Wn14e1p9bXtafWx7Wn0pe1NfVVRGfSsge2lmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fX0NCi0JDQotfQkNCi0JDQotPFNUX1hNTERlY2w+IA0KLXsNCi0JKHtafXZ7Wn1le1p9cntafXN7Wn1pe1p9b3tafW57Wn0pIHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQ0KLQkoe1p9ZXtafW57Wn1je1p9b3tafWR7Wn1pe1p9bntafWd7Wn0pIHtCZWdpbkF0dHJpYnV0ZVZhbHVlVVRGfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQ0KLQkvLyBub3RlIHRoZSAiZm9yY2VkIGVuZCIgKHZpYSAnaGFzTW9yZT1mYWxzZScpIG9uY2UgdGhlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQNCi0JLy8gVGhpcyBpcyBzaW5jZSBub24tYXNjaWkgY2hhcnMgbWF5IGZvbGxvdyBhbmQgbWF5IGNhdXNlIElPRXhjZXB0aW9ucyB3aGljaCB3b3VsZCBub3Qgb2NjdXIgb25jZSBzdHJlYW0gaXMgDQotCS8vIHJlYWQgd2l0aCBpbmNvcnJlY3QgZW5jb2RpbmcgKHN1Y2ggYXMgaWYgcGxhdGZvcm0gZW5jb2RpbmcgaXMgaW4gZWZmZWN0IHVudGlsIHRydWUgZW5jb2RpbmcgZGV0ZWN0ZWQpLiANCi0JKHtafVw/e1p9PntafSkgICAge3l5YmVnaW4oWVlJTklUSUFMKTsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kO30NCi19CQ0KLQ0KLQkNCi0NCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+DQotew0KLQl7Wn1cIntafSAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0NCi0Je1p9XCd7Wn0JCQl7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQ0KLQkvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcNCi0Je1NfVVRGfSouICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApO30NCi0NCi19CQ0KLQ0KLQ0KLTxEUV9TVFJJTkc+DQotew0KLQ0KLQl7Wn1cIntafSAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0NCi0gIAl7Wn17TGluZVRlcm1pbmF0b3J9e1p9ICAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9XD97Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn08e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0NCi19DQotDQotPFNRX1NUUklORz4NCi17DQotDQotCXtafVwne1p9ICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTt9DQotICAJe1p9e0xpbmVUZXJtaW5hdG9yfXtafSAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafSV7Wn0+e1p9CQkJeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCXtafTx7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0JW15ceDAwXQkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQ0KLQ0KLX0NCi0NCi08VW5EZWxpbWl0ZWRTdHJpbmc+DQotew0KLQ0KLQl7U19VVEZ9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQ0KLSAgCXtafXtMaW5lVGVybWluYXRvcn17Wn0gICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQ0KLQl7Wn1cP3tafT57Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30NCi0Je1p9PHtafQkNCi0JeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9DQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQ0KLQl7Wn1cJ3tafQkJCXsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQ0KLQkNCi0Je1p9XCJ7Wn0JCQl7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30NCi0JDQotCVteXHgwMF0JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0NCi0NCi19DQotDQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZw0KLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpDQotLnxcbgl7aWYoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fX0NCi0NCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdA0KLTw8RU9GPj4gICAgICAgICB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GO30NCi0NCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGROYW1lcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZE5hbWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5NzU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZE5hbWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IlhNTDEwTmFtZXMiPgotCQotCTwhLS0gTm90ZTogZm9yIEVjbGlwc2UgZW52LiwgdGhlIEpGbGV4IDEuNCBqYXIgc2hvdWxkIGJlIGFkZGVkIAotCXRvIHRoZSBhbnQgZ2xvYmFsIGVudHJpZXMgIC0tPgotCTx0YXNrZGVmIGNsYXNzbmFtZT0iSkZsZXguYW50dGFzay5KRmxleFRhc2siIG5hbWU9ImpmbGV4IiAvPgotCQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUwxME5hbWVzLmpGbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iSGVhZFBhcnNlcnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iLi4vc3JjIi8+Ci0JCTwhLS0gdG91Y2ggY2F1c2VzIHRvIGFsd2F5cyBidWlsZCwgcmVtb3ZlIGZvciByZWFsICdtYWtlJyBiZWhhdmlvciAtLT4KLQkJPHRvdWNoIGZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iLz4KLQkJCQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IlhNTDEwTmFtZXMiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amZsZXgKLQkgICAgCWZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iCi0JICAgIAlkZXN0ZGlyPSIke2Rlc3QuZGlyfSIKLQkJCXZlcmJvc2U9InRydWUiCi0JCQlub2Jhaz0idHJ1ZSIKLQkJCXRpbWU9Im9uIgotCSAgICAvPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYxOWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IkhlYWRUb2tlbml6ZXIiPgotCQotCTwhLS0gTm90ZTogZm9yIEVjbGlwc2UgZW52LiwgdGhlIEpGbGV4IDEuNCBqYXIgc2hvdWxkIGJlIGFkZGVkIAotCXRvIHRoZSBhbnQgZ2xvYmFsIGVudHJpZXMgIC0tPgotCTx0YXNrZGVmIGNsYXNzbmFtZT0iSkZsZXguYW50dGFzay5KRmxleFRhc2siIG5hbWU9ImpmbGV4IiAvPgotCQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUxIZWFkVG9rZW5pemVyLmpGbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iSGVhZFBhcnNlcnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iLi4vc3JjIi8+Ci0JCTwhLS0gdG91Y2ggY2F1c2VzIHRvIGFsd2F5cyBidWlsZCwgcmVtb3ZlIGZvciByZWFsICdtYWtlJyBiZWhhdmlvciAtLT4KLQkJPHRvdWNoIGZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iLz4KLQkJCQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IkhlYWRUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amZsZXgKLQkgICAgCWZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iCi0JICAgIAlkZXN0ZGlyPSIke2Rlc3QuZGlyfSIKLQkJCXZlcmJvc2U9InRydWUiCi0JCQlub2Jhaz0idHJ1ZSIKLQkJCXRpbWU9Im9uIgotCSAgICAvPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwMmY4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS40MDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0iWzIuOS4wLDMuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMTAwLDMuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDQsMS4yLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAxLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTsgZXhjbHVkZTo9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTY0NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRIZSBYTUwgc3BlY2lmaWMgbW9kZWwgaW1wbGVtZW50YXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OWEyZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIERldlRpbWVTdXBwb3J0Lwotc291cmNlLi4gPSBzcmMtY2F0YWxvZyxcCi0gICAgICAgICAgIHNyYy1jb250ZW50bW9kZWwvLFwKLSAgICAgICAgICAgc3JjLXZhbGlkYXRpb24vLFwKLSAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgIHNyYy1lbWZNb2RlbFN5bmNoLyxcCi0gICAgICAgICAgIHNyYy1zZWFyY2gvCi0KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNjFlYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlciIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMveG1sL292ZXJ2aWV3Lmh0bWwiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcyIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlhNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnNvdXJjZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5zb3VyY2UiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLnhlcmNlcyIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU0NDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBYTUwgTW9kZWwKLVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBYTUwgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLVhNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YTUwgKElsbGZvcm1lZCkKLSMgY29udGVudG1vZGVsIHN0cmluZ3MKLUNvbnRlbnRfTW9kZWxfRG9jdW1lbnRfRmFjdG9yaWVzX0V4dGVuc2lvbi5uYW1lPUNvbnRlbnQgTW9kZWwgRG9jdW1lbnQgRmFjdG9yaWVzCi1Db250ZW50X01vZGVsX0Fubm90YXRpb25fRmlsZXNfRXh0ZW5zaW9uLm5hbWU9Q29udGVudCBNb2RlbCBBbm5vdGF0aW9uIEZpbGVzCi1Nb2RlbF9RdWVyeV9FeHRlbnNpb24ubmFtZT1Nb2RlbCBRdWVyeSBFeHRlbnNpb24KLVhNTF9DYXRhbG9nX0NvbnRyaWJ1dGlvbnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9WE1MIENhdGFsb2cgQ29udHJpYnV0aW9ucyBFeHRlbnNpb24gUG9pbnQKLVhTTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YU0wKLVhNSV9Db250ZW50X1R5cGU9WE1JCi1YTUxfVmFsaWRhdG9yLm5hbWU9WE1MIFZhbGlkYXRvcgotWE1MX1ZhbGlkYXRpb25fRXJyb3JfQ3VzdG9taXplci5uYW1lPVhNTCBWYWxpZGF0b3IgRXJyb3IgQ3VzdG9taXplciBFeHRlbnNpb24gUG9pbnQKLV92YWxpZGF0aW9uTWFya2VyLm5hbWU9WE1MIFByb2JsZW0KLV90YXNrTWFya2VyLm5hbWU9WE1MIFRhc2sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViYWE2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8IS0tIEFuIGV4dGVuc2lvbiBmb3IgY29udHJpYnV0aW5nIGEgWE1MIHZhbGlkYXRpb24gZXJyb3IgY3VzdG9taXplci4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlcnJvckN1c3RvbWl6ZXIiIG5hbWU9IiVYTUxfVmFsaWRhdGlvbl9FcnJvcl9DdXN0b21pemVyLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2Vycm9yQ3VzdG9taXplci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJZGVmYXVsdD0idHJ1ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvclhNTCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJZGVmYXVsdD0idHJ1ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvclhNTCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmVtYmVkZGVkVHlwZUhhbmRsZXIiPgotCQk8ZW1iZWRkZWRUeXBlSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRYTUwiPgotCQk8L2VtYmVkZGVkVHlwZUhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrcy5YTUxGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzLlhNTEZpbGVUYXNrU2Nhbm5lcjpvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGFza01hcmtlciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2tNYXJrZXIiCi0JCW5hbWU9IiVfdGFza01hcmtlci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50YXNrbWFya2VyIi8+Ci0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci0JIAotICAgPCEtLSBIZXJlIHdlIGRlZmluZSBhIG5ldyBleHRlbnNpb24gcG9pbnQuICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkCi0gICAgICAgIHRvIHByb2dyYW1tYXRpY2FsbHkgY29udHJpYnV0ZSBjYXRhbG9nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNhdGFsb2dDb250cmlidXRpb25zIiBuYW1lPSIlWE1MX0NhdGFsb2dfQ29udHJpYnV0aW9uc19FeHRlbnNpb25fUG9pbnQubmFtZSIgc2NoZW1hPSJzY2hlbWEvY2F0YWxvZ0NvbnRyaWJ1dGlvbnMuZXhzZCIvPgotCi0gICA8IS0tIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGV4dGVuZHMgdGhlIENvbW1vbiBFeHRlbnNiaWxlIFVSSSBSZXNvbHZlciBzbyB0aGF0Ci0gICAgICAgIHRoZSBYTUwgQ2F0YWxvZyBjYW4gcGFydGljaXBhcmUgaW4gcmVzb2x2aW5nIHByb2Nlc3Nlcy4gLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnJlc29sdmVyRXh0ZW5zaW9ucyI+Ci0gICAgICA8cmVzb2x2ZXJFeHRlbnNpb24KLSAgICAgICAgICAgIHN0YWdlPSJwb3N0bm9ybWFsaXphdGlvbiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24iPgotICAgICAgPC9yZXNvbHZlckV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzIgotCQluYW1lPSIlU3RydWN0dXJlZF9YTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzMiIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4c2wiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ieHNsdCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJkYWR4Ij4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249IndzZGwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ibnN0Ij4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InhtaSI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4c2QiPgotCQk8L2ZpbGVUeXBlcz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0UHJvY2Vzc29ycyI+Ci0JCTxwcm9jZXNzb3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLlhNTEZvcm1hdHRlckZvcm1hdFByb2Nlc3NvciIKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPgotCQk8L3Byb2Nlc3Nvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMwODMgLS0+XAotCTwhLS0gIEZZSTogdGhpcyB4bWkgdHlwZSAqc2hvdWxkKiBiZSBkZWZpbmVkIGluIEVNRiwgYnV0LCBzaW5jZSBpc24ndAotCQkJd2Ugd2lsbCBoZXJlLiBJbiBmdXR1cmUgdmVyc2lvbnMgaXMgY291bGQgYmUgcmVtb3ZlZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4bWkiCi0JCQlwcmlvcml0eT0ibG93IgotCQkJbmFtZT0iJVhNSV9Db250ZW50X1R5cGUiCi0JCQlpZD0ieG1pc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJPC9jb250ZW50LXR5cGU+Ci0KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4bWwseHNsLHhzbHQsd3NkbCx4c2QsZXhzZCx4bWkiCi0JCQlwcmlvcml0eT0ibG93IgotCQkJbmFtZT0iJVhNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJ4bWxzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8ZGVzY3JpYmVyIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvclhNTCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4c2wseHNsdCIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJVhTTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJ4c2xzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IlVURi04Ij4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLQotCTwhLS0gaW5pdGlhbGl6ZSB4bWwgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0iZG9jdW1lbnRGYWN0b3JpZXMiIG5hbWU9IiVDb250ZW50X01vZGVsX0RvY3VtZW50X0ZhY3Rvcmllc19FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZCIvPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0ibW9kZWxRdWVyeUV4dGVuc2lvbnMiIG5hbWU9IiVNb2RlbF9RdWVyeV9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZCIvPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbkZpbGVzIiBuYW1lPSIlQ29udGVudF9Nb2RlbF9Bbm5vdGF0aW9uX0ZpbGVzX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uRmlsZXMuZXhzZCIvPgkKLQkJCi0JPGV4dGVuc2lvbiAKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAgY29udGV4dD0iVUkiCi0gICAgICAgICAgICBrZXk9InJlbmRlcmVyRmFjdG9yeSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVtZjJ4bWwuRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSI+Ci0gICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgPC9leHRlbnNpb24+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIFhNTCB2YWxpZGF0b3Igd2l0aCB0aGUgdmFsaWRhdGlvbiAJCS0tPgotCTwhLS0gZnJhbWV3b3JrLiAJCQkJCQkJCQkJICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InZhbGlkYXRpb25NYXJrZXIiCi0gICAgICAgICBuYW1lPSIlX3ZhbGlkYXRpb25NYXJrZXIubmFtZSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIi8+Ci0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIGlkPSJ4bWwiIG5hbWU9IiVYTUxfVmFsaWRhdG9yLm5hbWUiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0idHJ1ZSIKLSAgICAgICAgICAgIHNvdXJjZWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCIKLSAgICAgICAgICAgIHZlcnNpb249IjMiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50bGRzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InhtbCI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9ImdwaCI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9Indkby1jb25uZWN0aW9ucyI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICAgPGV4Y2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0JCQkJPHByb2plY3ROYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiLz4KLQkJCQk8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIi8+Ci0gICAgCQkJPGZpbGUgY2FzZVNlbnNpdGl2ZT0idHJ1ZSIgbmFtZT0iLnByb2plY3QiIHR5cGU9ImZpbGUiLz4KLSAgICAJCQk8ZmlsZSBjYXNlU2Vuc2l0aXZlPSJ0cnVlIiBuYW1lPSIuY2xhc3NwYXRoIiB0eXBlPSJmaWxlIi8+Ci0gICAgCQkJPGZpbGUgY2FzZVNlbnNpdGl2ZT0idHJ1ZSIgbmFtZT0iLnNldHRpbmdzIiAgdHlwZT0iZm9sZGVyIi8+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9leGNsdWRlPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2Fubm90YXRpb25GaWxlcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2Fubm90YXRpb25GaWxlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDE3ZjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uRmlsZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9ImFubm90YXRpb25GaWxlcyIgbmFtZT0iQ29udGVudCBNb2RlbCBBbm5vdGF0aW9uIEZpbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbm5vdGF0aW9uRmlsZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uRmlsZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InB1YmxpY0lkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvY2F0YWxvZ0NvbnRyaWJ1dGlvbnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9jYXRhbG9nQ29udHJpYnV0aW9ucy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2JhZDFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9jYXRhbG9nQ29udHJpYnV0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIiBpZD0iY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiIG5hbWU9IlhNTCBDYXRhbG9nIENvbnRyaWJ1dGlvbnMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0byBzcGVjaWZ5IGVudHJpZXMgZm9yIFhNTCBDYXRhbG9nLiAgQ2F0YWxvZyBlbnRyaWVzIGhhdmUgZm9ybWF0IHNwZWNpZmllZCBpbiAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9kb3dubG9hZC5waHAvMTQwNDEveG1sLWNhdGFsb2dzLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLmh0bWwmbHQ7L2EmZ3Q7LiAgCi1FYWNoIGNhdGFsb2cgZXh0ZW5zaW9uIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGNhdGFsb2dDb250cmlidXRpb24gZWxlbWVudC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNhdGFsb2dDb250cmlidXRpb24iLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRhbG9nQ29udHJpYnV0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgY2F0YWxvZ0NvbnRyaWJ1dGlvbiBlbGVtZW50IG1heSBoYXZlIGlkLCBhbmQgaXQgaXMganVzdCBhIGNvbnRhaW5lciBmb3IgdGhlIGNvbnRyaWJ1dGVkIGNhdGFsb2cgZW50cmllcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHVibGljIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN5c3RlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1cmkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibmV4dENhdGFsb2ciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSBjYXRhbG9nIHRvIHdoaWNoIGVudHJpZXMgd2lsbCBiZSBhZGRlZC4gQ291bGQgYmUgJnF1b3Q7ZGVmYXVsdCZxdW90OywgYW5kIGlmIG9tbWl0ZWQsIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0IHdvcmtzcGFjZSBjYXRhbG9nLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwdWJsaWMiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBwdWJsaWMgZWxlbWVudCBhc3NvY2lhdGVzIGEgVVJJIHJlZmVyZW5jZSB3aXRoIHRoZSBwdWJsaWMgaWRlbnRpdGllciBwb3J0aW9uIG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgZWxlbWVudCwgb3B0aW9uYWwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHVibGljSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHB1YmxpYyBpZGVudGlmaWVyIHBvcnRpb24gb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGNvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHVzZSBwbGF0Zm9ybTovIG9yIGZpbGU6LyBwcm90b2NvbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndlYlVSTCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZSBXZWIgYWRkcmVzcyBmb3IgdGhlIHB1YmxpYyBJRAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzeXN0ZW0iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBzeXN0ZW0gZWxlbWVudHMgYXNzb2NpYXRlcyBhIFVSSSByZWZlcmVuY2Ugd2l0aCB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllcgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWQgb2YgdGhlIGVsZW1lbnQsIG9wdGlvbmFsLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN5c3RlbUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBwb3J0aW9uIG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgdXJpIGF0dHJpYnV0ZSBjb3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcGx1Z2luLnhtbCBmaWxlLCB1c2UgcGxhdGZvcm06LyBvciBmaWxlOi8gcHJvdG9jb2xzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idXJpIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgdXJpIGVsZW1lbnQgYXNzb2NpYXRlcyBhIFVSSSByZWZlcmVuY2Ugd2l0aCB0aGUgYSBVUkkgcmVmZXJlbmNlIHRoYXQgaXMgbm90IHBhcnQgb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSBlbGVtZW50LCBvcHRpb25hbC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGNvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHVzZSBwbGF0Zm9ybTovIG9yIGZpbGU6LyBwcm90b2NvbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBVUkkgcmVmZXJlbmNlIHRoYXQgaXMgbm90IHBhcnQgb2YgYW4gZXh0ZXJuYWwgaWRlbnRpdGllci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibmV4dENhdGFsb2ciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBuZXh0Q2F0YWxvZyBlbGVtZW50cyBpbmRpY2F0ZSBhZGRpdGlvbmFsIGNhdGFsb2cgZW50cnkgZmlsZShzKSB0byBiZSBjb25zaWRlcmVkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiByZXNvbHV0aW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgZWxlbWVudCwgb3B0aW9uYWwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHVyaSBhdHRyaWJ1dGUgY291bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbi54bWwgZmlsZSwgdXNlIHBsYXRmb3JtOi8gb3IgZmlsZTovIHByb3RvY29scy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyZxdW90OyZndDsKLSAgICAgICZsdDtjYXRhbG9nQ29udHJpYnV0aW9uJmd0OyAKLSAgICAgICAgICZsdDtzeXN0ZW0gCi0gICAgICAgICAgICAgICBzeXN0ZW1JZD0mcXVvdDtodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyZxdW90OwotICAgICAgICAgICAgICAgdXJpPSZxdW90O2RhdGEveHNkL3dzZGwueG1sJnF1b3Q7ICZndDsgCi0gICAgICAgICAgICAmbHQ7cHJvcGVydHkgCi0gICAgICAgICAgICAgICAgICBuYW1lPSZxdW90O3dlYlVSTCZxdW90OwotICAgICAgICAgICAgICAgICAgdmFsdWU9JnF1b3Q7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8mcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy9zeXN0ZW0mZ3Q7Ci0gICAgICAgICAmbHQ7dXJpCi0gICAgICAgICAgICAgICBuYW1lPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8mcXVvdDsgCi0gICAgICAgICAgICAgICB1cmk9JnF1b3Q7ZGF0YS94c2Qvc29hcC54c2QmcXVvdDsvJmd0OyAKLSAgICAgICAgICZsdDtwdWJsaWMKLSAgICAgICAgICAgICAgIHB1YmxpY0lkPSZxdW90O2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSZxdW90OwotICAgICAgICAgICAgICAgdXJpPSZxdW90O2RhdGEveHNkL1hTTFNjaGVtYS54c2QmcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7L3B1YmxpYyZndDsKLSAgICAgICAgICZsdDtuZXh0Q2F0YWxvZwotICAgICAgICAgICAgICAgaWQ9JnF1b3Q7bmVzdGVkQ2F0YWxvZyZxdW90OyAKLSAgICAgICAgICAgICAgIGNhdGFsb2c9JnF1b3Q7ZGF0YS9jYXRhbG9nMS54bWwmcXVvdDsvJmd0OyAKLSAgICAgICZsdDsvY2F0YWxvZ0NvbnRyaWJ1dGlvbiZndDsgCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+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+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL21vZGVsUXVlcnlFeHRlbnNpb25zLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyZjk3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIiBpZD0ibW9kZWxRdWVyeUV4dGVuc2lvbnMiIG5hbWU9Ik1vZGVsIFF1ZXJ5IEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGludGVybmFsPSJ0cnVlIiAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2RlbFF1ZXJ5RXh0ZW5zaW9uIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtb2RlbFF1ZXJ5RXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBbGxvd3MgZm9yIHRoZSBjdXN0b21pemF0aW9uIG9mIHJldHVybmVkIHZhdWVzIGZyb20gYSBNb2RlbFF1ZXJ5IG9iamVjdC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb246Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQ29udGVudCBUeXBlcyBmb3Igd2hpY2ggdG8gdXNlIHRoaXMgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNzEzODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotcHVibGljIGNsYXNzIENhdGFsb2cgaW1wbGVtZW50cyBJQ2F0YWxvZwotewotCi0JY2xhc3MgQ2F0YWxvZ0xTCi0JewotCQlwdWJsaWMgdm9pZCBsb2FkKCkKLQkJewotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNhdmUoKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQluZXcgQ2F0YWxvZ1dyaXRlcigpLndyaXRlKENhdGFsb2cudGhpcywgbG9jYXRpb24pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIERlZmF1bHRDYXRhbG9nTFMgZXh0ZW5kcyBDYXRhbG9nTFMKLQl7Ci0JCXB1YmxpYyB2b2lkIGxvYWQoKQotCQl7Ci0JCQlOZXh0Q2F0YWxvZyB1c2VyQ2F0YWxvZ1JlZmVyZW5jZSA9IG5ldyBOZXh0Q2F0YWxvZygpOwotCQkJdXNlckNhdGFsb2dSZWZlcmVuY2Uuc2V0SWQoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQpOwotCQkJdXNlckNhdGFsb2dSZWZlcmVuY2Uuc2V0Q2F0YWxvZ0xvY2F0aW9uKFVTRVJfQ0FUQUxPR19GSUxFKTsKLQkJCWFkZENhdGFsb2dFbGVtZW50KHVzZXJDYXRhbG9nUmVmZXJlbmNlKTsKLQotCQkJTmV4dENhdGFsb2cgc3lzdGVtQ2F0YWxvZ1JlZmVyZW5jZSA9IG5ldyBOZXh0Q2F0YWxvZygpOwotCQkJc3lzdGVtQ2F0YWxvZ1JlZmVyZW5jZS5zZXRJZChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lEKTsKLQkJCXN5c3RlbUNhdGFsb2dSZWZlcmVuY2Uuc2V0Q2F0YWxvZ0xvY2F0aW9uKFNZU1RFTV9DQVRBTE9HX0ZJTEUpOwotCQkJYWRkQ2F0YWxvZ0VsZW1lbnQoc3lzdGVtQ2F0YWxvZ1JlZmVyZW5jZSk7Ci0KLQkJCS8qCi0JCQkgKiBIZXJlIHdlIHNhdmUgdGhlIGZpbGUgaW4gb3JkZXIgdG8gJ3JlZmxlY3QnIHRoZSBjYXRhbG9nIHRoYXQKLQkJCSAqIHdlJ3ZlIGNyZWF0ZWQgZnJvbSBwbHVnLWluIGV4dGVuc2lvbnMgdG8gZGlzay4gVGhlICdkZWZhdWx0JwotCQkJICogY2F0YWxvZyBpcyBvbmx5IGV2ZXIgd3JpdHRlbiB0byBkaXNrIGFuZCBuZXZlciByZWFkIGZyb20gZGlzay4KLQkJCSAqLwotCQkJc2F2ZSgpOwotCQl9Ci0JfQotCi0JY2xhc3MgSW50ZXJuYWxSZXNvbHZlcgotCXsKLQkJcHJvdGVjdGVkIE1hcCBwdWJsaWNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByb3RlY3RlZCBNYXAgc3lzdGVtTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwcm90ZWN0ZWQgTWFwIHVyaU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJSW50ZXJuYWxSZXNvbHZlcigpCi0JCXsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGNhdGFsb2dFbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQl7Ci0JCQkJSUNhdGFsb2dFbGVtZW50IGNhdGFsb2dFbGVtZW50ID0gKElDYXRhbG9nRWxlbWVudCkgaS5uZXh0KCk7Ci0JCQkJaWYgKGNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSkKLQkJCQl7Ci0JCQkJCUlDYXRhbG9nRW50cnkgZW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgY2F0YWxvZ0VsZW1lbnQ7Ci0JCQkJCU1hcCBtYXAgPSBnZXRFbnRyeU1hcChlbnRyeS5nZXRFbnRyeVR5cGUoKSk7Ci0JCQkJCW1hcC5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIE1hcCBnZXRFbnRyeU1hcChpbnQgZW50cnlUeXBlKQotCQl7Ci0JCQlNYXAgbWFwID0gc3lzdGVtTWFwOwotCQkJc3dpdGNoIChlbnRyeVR5cGUpCi0JCQl7Ci0JCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM6Ci0JCQkJbWFwID0gcHVibGljTWFwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOgotCQkJCW1hcCA9IHVyaU1hcDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gbWFwOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwZWRVUkkoTWFwIG1hcCwgU3RyaW5nIGtleSkKLQkJewotCQkJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKENhdGFsb2dFbnRyeSkgbWFwLmdldChrZXkpOwotCQkJaWYoZW50cnkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgdXJpID0gZW50cnkuZ2V0VVJJKCk7Ci0JCQl0cnkKLQkJCXsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIENTIDogZG8gd2UgcmVhbGx5IHdhbnQgdG8gcmVzb2x2ZSB0aGVzZSBoZXJlPwotICAgICAgICAgICAgICAgIC8vIEknbSBndWVzc2luZyB3ZSBzaG91bGQgcmV0dXJuIHRoZSAncGxhdGZvcm06JyBmb3JtIG9mIHRoZSBVUkkKLSAgICAgICAgICAgICAgICAvLyB0byB0aGUgY2FsbGVyLgotICAgICAgICAgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aCgicGxhdGZvcm06IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB7ICAKLQkJCQkgIFVSTCBlbnRyeVVSTCA9IG5ldyBVUkwoZW50cnkuZ2V0QWJzb2x1dGVQYXRoKHVyaSkpOyAgICAgICAgICAgICAgICAKLQkJCQkgIHVyaSA9IFBsYXRmb3JtLnJlc29sdmUoZW50cnlVUkwpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZW5zdXJlIFVSSSdzIGFyZSBvZiBmb3JtICJmaWxlOi8vL0Q6L1hYWCIgYW5kIE5PVCAgCi0gICAgICAgICAgICAgICAgICAvLyAiZmlsZTpEOi9YWFgiLiAgT3RoZXJ3aXNlIHRoZSBFTUYgVVJJIGNsYXNzIGdldHMgY29uZnVzZWQKLSAgICAgICAgICAgICAgICAgIC8vIChzZWUgYnVnIDEwMzYwNykgCi0gICAgICAgICAgICAgICAgICBTdHJpbmcgRklMRV9TQ0hFTUUgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUUpICYmICF1cmkuc3RhcnRzV2l0aChGSUxFX1NDSEVNRSArICIvIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdXJpID0gRklMRV9TQ0hFTUUgKyAiLy8vIiArIHVyaS5zdWJzdHJpbmcoRklMRV9TQ0hFTUUubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICByZXR1cm4gdXJpOyAKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHJlc29sdmVQdWJsaWMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQkJewotCQkJU3RyaW5nIHJlc3VsdCA9IGdldE1hcHBlZFVSSShwdWJsaWNNYXAsIHB1YmxpY0lkKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSBnZXRNYXBwZWRVUkkoc3lzdGVtTWFwLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQkvLyBvdXIgY2xpZW50cyB1c2VkIHRvIHBhc3MgbmFtZXNwYWNlIGluIHBsYWNlIG9mIHB1YmxpYyBpZCwgc28gd2UgbmVlZCB0byBjaGVjayB1cmkgbWFwIGZvciB0aG9zZQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IGdldE1hcHBlZFVSSSh1cmlNYXAsIHB1YmxpY0lkKTsKLQkJCX0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlU3Vib3JkaW5hdGVDYXRhbG9ncygKLQkJCQkJCUlDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyByZXNvbHZlU3lzdGVtKFN0cmluZyBzeXN0ZW1JZCkKLQkJCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCQl7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZ2V0TWFwcGVkVVJJKHN5c3RlbU1hcCwgc3lzdGVtSWQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVTdWJvcmRpbmF0ZUNhdGFsb2dzKAotCQkJCQkJSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSwgbnVsbCwgc3lzdGVtSWQpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgdXJpKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotCQkJCUlPRXhjZXB0aW9uCi0JCXsKLQkJCVN0cmluZyByZXN1bHQgPSBnZXRNYXBwZWRVUkkodXJpTWFwLCB1cmkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVTdWJvcmRpbmF0ZUNhdGFsb2dzKAotCQkJCQkJSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSwgbnVsbCwgdXJpKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQljbGFzcyBTeXN0ZW1DYXRhbG9nTFMgZXh0ZW5kcyBDYXRhbG9nTFMKLQl7Ci0JCXB1YmxpYyB2b2lkIGxvYWQoKQotCQl7Ci0JCQluZXcgQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIoQ2F0YWxvZy50aGlzKS5yZWFkUmVnaXN0cnkoKTsKLQotCQkJLyoKLQkJCSAqIEhlcmUgd2Ugc2F2ZSB0aGUgZmlsZSBpbiBvcmRlciB0byAncmVmbGVjdCcgdGhlIGNhdGFsb2cgdGhhdAotCQkJICogd2UndmUgY3JlYXRlZCBmcm9tIHBsdWdpbiBleHRlbnNpb25zIHRvIGRpc2suIAotCQkJICogVGhlICdzeXN0ZW0nIGNhdGFsb2cgaXMgb25seSBldmVyIHdyaXR0ZW4gdG8gZGlzayBhbmQgbmV2ZXIgcmVhZCBmcm9tIGRpc2suCi0JCQkgKi8KLQkJCXNhdmUoKTsKLQkJfQotCX0KLQotCWNsYXNzIFVzZXJDYXRhbG9nTFMgZXh0ZW5kcyBDYXRhbG9nTFMKLQl7Ci0JCXB1YmxpYyB2b2lkIGxvYWQoKQotCQl7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkKLQkJCXsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0JCQkJaW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotCQkJCWJvb2xlYW4gb2xkTm90aWZpY2F0aW9uRW5hYmxlZCA9IGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCWNsZWFyKCk7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlDYXRhbG9nUmVhZGVyLnJlYWQoQ2F0YWxvZy50aGlzLCBpbnB1dFN0cmVhbSk7Ci0JCQkJfSBmaW5hbGx5Ci0JCQkJewotCQkJCQlzZXROb3RpZmljYXRpb25FbmFibGVkKG9sZE5vdGlmaWNhdGlvbkVuYWJsZWQpOwotCQkJCX0KLQkJCQlub3RpZnlDaGFuZ2VkKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCXsKLQkJCX0gZmluYWxseQotCQkJewotCQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJCXsKLQkJCQkJdHJ5Ci0JCQkJCXsKLQkJCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJCQl7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NBVEFMT0dfRklMRSA9ICJkZWZhdWx0X2NhdGFsb2cueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0NBVEFMT0dfRklMRSA9ICJzeXN0ZW1fY2F0YWxvZy54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0NBVEFMT0dfRklMRSA9ICJ1c2VyX2NhdGFsb2cueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBiYXNlOwotCi0JcHJvdGVjdGVkIExpc3QgY2F0YWxvZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIENhdGFsb2dMUyBjYXRhbG9nTFM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCi0JcHJvdGVjdGVkIEludGVybmFsUmVzb2x2ZXIgaW50ZXJuYWxSZXNvbHZlcjsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZDsKLQotCXByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb247Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ1NldCByZXNvdXJjZVNldDsKLQotCXB1YmxpYyBDYXRhbG9nKENhdGFsb2dTZXQgY2F0YWxvZ1Jlc291cmNlU2V0LCBTdHJpbmcgaWQsIFN0cmluZyBsb2NhdGlvbikKLQl7Ci0JCXRoaXMucmVzb3VyY2VTZXQgPSBjYXRhbG9nUmVzb3VyY2VTZXQ7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCi0JCWlmIChYTUxDb3JlUGx1Z2luLkRFRkFVTFRfQ0FUQUxPR19JRC5lcXVhbHMoaWQpKQotCQl7Ci0JCQljYXRhbG9nTFMgPSBuZXcgRGVmYXVsdENhdGFsb2dMUygpOwotCQl9IGVsc2UgaWYgKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKGlkKSkKLQkJewotCQkJY2F0YWxvZ0xTID0gbmV3IFN5c3RlbUNhdGFsb2dMUygpOwotCQl9IGVsc2UKLQkJewotCQkJY2F0YWxvZ0xTID0gbmV3IFVzZXJDYXRhbG9nTFMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbGVtZW50KQotCXsKLQkJY2F0YWxvZ0VsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJZWxlbWVudC5zZXRPd25lckNhdGFsb2codGhpcyk7Ci0JCWludGVybmFsUmVzb2x2ZXIgPSBudWxsOwotCQlub3RpZnlBZGRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVudHJpZXNGcm9tQ2F0YWxvZyhJQ2F0YWxvZyBjYXRhbG9nKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkKLQkJCXsKLQkJCQlJQ2F0YWxvZ0VsZW1lbnRbXSBlbnRyaWVzID0gKChDYXRhbG9nKWNhdGFsb2cpLmdldENhdGFsb2dFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLQkJCQl7Ci0JCQkJCUNhdGFsb2dFbGVtZW50IGNsb25lID0gKENhdGFsb2dFbGVtZW50KSgoQ2F0YWxvZ0VsZW1lbnQpZW50cmllc1tpXSkuY2xvbmUoKTsKLQkJCQkJYWRkQ2F0YWxvZ0VsZW1lbnQoY2xvbmUpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiYXJndW1lbnQgd2FzIG51bGwgaW4gQ2F0YWxvZy5hZGRFbnRyaWVzRnJvbUNhdGFsb2ciKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGZpbmFsbHkKLQkJewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZCh0cnVlKTsKLQkJfQotCQlpbnRlcm5hbFJlc29sdmVyID0gbnVsbDsKLQkJbm90aWZ5Q2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElDYXRhbG9nTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpCi0JewotCQljYXRhbG9nRWxlbWVudHMuY2xlYXIoKTsKLQkJaW50ZXJuYWxSZXNvbHZlciA9IG51bGw7Ci0JCW5vdGlmeUNoYW5nZWQoKTsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbGVtZW50IGNyZWF0ZUNhdGFsb2dFbGVtZW50KGludCB0eXBlKQotCXsKLQkJc3dpdGNoICh0eXBlKQotCQl7Ci0JCWNhc2UgSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlk6Ci0JCQlyZXR1cm4gbmV3IENhdGFsb2dFbnRyeSgpOwotCQljYXNlIElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRzoKLQkJCXJldHVybiBuZXcgTmV4dENhdGFsb2coKTsKLQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOgotCQkJcmV0dXJuIG5ldyBDYXRhbG9nRW50cnkoSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyk7Ci0JCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTToKLQkJCXJldHVybiBuZXcgQ2F0YWxvZ0VudHJ5KElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU0pOwotCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk6Ci0JCQlyZXR1cm4gbmV3IENhdGFsb2dFbnRyeShJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJKTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBuZXcgQ2F0YWxvZ0VsZW1lbnQodHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2UoKQotCXsKLQkJcmV0dXJuIGJhc2U7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldENhdGFsb2dFbGVtZW50cyhpbnQgdHlwZSkKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJQ2F0YWxvZ0VsZW1lbnRbXSBlbGVtZW50cyA9IChJQ2F0YWxvZ0VsZW1lbnRbXSkgY2F0YWxvZ0VsZW1lbnRzCi0JCQkJLnRvQXJyYXkobmV3IElDYXRhbG9nRWxlbWVudFtjYXRhbG9nRWxlbWVudHMuc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCXsKLQkJCUlDYXRhbG9nRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoZWxlbWVudC5nZXRUeXBlKCkgPT0gdHlwZSkKLQkJCXsKLQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnlbXSBnZXRDYXRhbG9nRW50cmllcygpCi0JewotCQlMaXN0IHJlc3VsdCA9IGdldENhdGFsb2dFbGVtZW50cyhJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSk7Ci0JCXJldHVybiAoSUNhdGFsb2dFbnRyeVtdKSByZXN1bHQKLQkJCQkudG9BcnJheShuZXcgSUNhdGFsb2dFbnRyeVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIENhdGFsb2dTZXQgZ2V0Q2F0YWxvZ1NldCgpCi0JewotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0JewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIElOZXh0Q2F0YWxvZ1tdIGdldE5leHRDYXRhbG9ncygpCi0JewotCQlMaXN0IHJlc3VsdCA9IGdldENhdGFsb2dFbGVtZW50cyhJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0cpOwotCQlyZXR1cm4gKElOZXh0Q2F0YWxvZ1tdKSByZXN1bHQudG9BcnJheShuZXcgSU5leHRDYXRhbG9nW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZXJuYWxSZXNvbHZlciBnZXRPckNyZWF0ZUludGVybmFsUmVzb2x2ZXIoKQotCXsKLQkJaWYgKGludGVybmFsUmVzb2x2ZXIgPT0gbnVsbCkKLQkJewotCQkJaW50ZXJuYWxSZXNvbHZlciA9IG5ldyBJbnRlcm5hbFJlc29sdmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGludGVybmFsUmVzb2x2ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCkKLQl7Ci0JCXJldHVybiBpc05vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJY2F0YWxvZ0xTLmxvYWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBZGRFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbnRyeSkKLQl7Ci0JCWlmIChpc05vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCXsKLQkJCUlDYXRhbG9nRXZlbnQgZXZlbnQgPSBuZXcgQ2F0YWxvZ0V2ZW50KHRoaXMsIGVudHJ5LAotCQkJCQlJQ2F0YWxvZ0V2ZW50LkVMRU1FTlRfQURERUQpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUNoYW5nZWQoKQotCXsKLQkJSUNhdGFsb2dFdmVudCBldmVudCA9IG5ldyBDYXRhbG9nRXZlbnQodGhpcywgbnVsbCwKLQkJCQlJQ2F0YWxvZ0V2ZW50LkNIQU5HRUQpOwotCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhJQ2F0YWxvZ0V2ZW50IGV2ZW50KQotCXsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZEFsbChsaXN0ZW5lckxpc3QpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJSUNhdGFsb2dMaXN0ZW5lciBsaXN0ZW5lciA9IChJQ2F0YWxvZ0xpc3RlbmVyKSBpLm5leHQoKTsKLQkJCWxpc3RlbmVyLmNhdGFsb2dDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVJlbW92ZUVsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQpCi0JewotCQlpZiAoaXNOb3RpZmljYXRpb25FbmFibGVkKQotCQl7Ci0JCQlJQ2F0YWxvZ0V2ZW50IGV2ZW50ID0gbmV3IENhdGFsb2dFdmVudCh0aGlzLCBlbGVtZW50LAotCQkJCQlJQ2F0YWxvZ0V2ZW50LkVMRU1FTlRfUkVNT1ZFRCk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQpCi0JewotCQljYXRhbG9nRWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpOwotCQlpbnRlcm5hbFJlc29sdmVyID0gbnVsbDsKLQkJbm90aWZ5UmVtb3ZlRWxlbWVudChlbGVtZW50KTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNhdGFsb2dMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVB1YmxpYyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLQkJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0T3JDcmVhdGVJbnRlcm5hbFJlc29sdmVyKCkucmVzb2x2ZVB1YmxpYyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZVN1Ym9yZGluYXRlQ2F0YWxvZ3MoaW50IGVudHJ5VHlwZSwgU3RyaW5nIHB1YmxpY0lkLAotCQkJU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGdldE5leHRDYXRhbG9ncygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykKLQkJewotCQkJSU5leHRDYXRhbG9nIG5leHRDYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotCQkJSUNhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQlpZiAoY2F0YWxvZyAhPSBudWxsKQotCQkJewotCQkJCXN3aXRjaCAoZW50cnlUeXBlKQotCQkJCXsKLQkJCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM6Ci0JCQkJCXJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZVB1YmxpYyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU06Ci0JCQkJCXJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZVN5c3RlbShzeXN0ZW1JZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSToKLQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlVVJJKHN5c3RlbUlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVN5c3RlbShTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE9yQ3JlYXRlSW50ZXJuYWxSZXNvbHZlcigpLnJlc29sdmVTeXN0ZW0oc3lzdGVtSWQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgdXJpKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRPckNyZWF0ZUludGVybmFsUmVzb2x2ZXIoKS5yZXNvbHZlVVJJKHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJY2F0YWxvZ0xTLnNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYXNlKFN0cmluZyBiYXNlKQotCXsKLQkJdGhpcy5iYXNlID0gYmFzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpCi0JewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKQotCXsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5vdGlmaWNhdGlvbkVuYWJsZWQoYm9vbGVhbiBiKQotCXsKLQkJaXNOb3RpZmljYXRpb25FbmFibGVkID0gYjsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbGVtZW50W10gZ2V0Q2F0YWxvZ0VsZW1lbnRzKCkKLQl7Ci0JCXJldHVybiAoSUNhdGFsb2dFbGVtZW50W10pIGNhdGFsb2dFbGVtZW50cy50b0FycmF5KG5ldyBJQ2F0YWxvZ0VsZW1lbnRbY2F0YWxvZ0VsZW1lbnRzLnNpemUoKV0pOwotCX0KLQkKLQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwMWM1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImNhdGFsb2dDb250cmlidXRpb25zIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09OVFJJQlVUSU9OID0gImNhdGFsb2dDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0gIC8qCi0gICAqIHRoaXMgaXMgYSBzYW1wbGUgZXhwdGVuc2lvbiAKLSAgICogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4gCi0gICAqIDxjYXRhbG9nQ29udHJpYnV0aW9uPgotICAgKiAgICA8dXJpCi0gICAqICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgKiAgICAgICAgICAgICB1cmk9InhzZC9zb2FwLnhzZCIvPiAKLSAgICogICAJPHB1YmxpYwotICAgKiAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLSAgICogICAgICAgICAgdXJpPSJkdGRzL3hodG1sMTEtZmxhdC5kdGQiLz4gCi0gICAqICAJPG5leHRDYXRhbG9nIGlkPSJuZXN0ZWRDYXRhbG9nIiBjYXRhbG9nPSJkYXRhL2NhdGFsb2cxLnhtbCIvPiAKLSAgICogIDwvY2F0YWxvZ0NvbnRyaWJ1dGlvbj4gCi0gICAqICA8L2V4dGVuc2lvbj4KLSAgICogIAotICAgKi8KLSAgcHJvdGVjdGVkIElDYXRhbG9nIGNhdGFsb2c7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBkZWNsYXJpbmdFeHRlbnNpb25JZDsKLSAgCi0gIHByb3RlY3RlZCBDYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlcihJQ2F0YWxvZyBhQ2F0YWxvZykKLSAgewotICAgIGNhdGFsb2cgPSBhQ2F0YWxvZzsKLSAgfQotCi0gIC8qKgotICAgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlUGF0aChVUkwgcGxhdGZvcm1VUkwsIFN0cmluZyBwYXRoKSAKLSAgeyAgICAgIAotCVN0cmluZyBmaWxlTG9jYXRpb24gPSBwYXRoOwotCWludCBqYXJQYXRoU3RhcnQgPSBwYXRoLmluZGV4T2YoImphcjoiKTsgLy8kTk9OLU5MUy0xJAotCWphclBhdGhTdGFydCA9IGphclBhdGhTdGFydCA8IDAgPyAwIDogamFyUGF0aFN0YXJ0ICsgImphcjoiLmxlbmd0aCgpOyAvLyROT04tTkxTLTEkCi0JaW50IGphclBhdGhFbmQgPSBwYXRoLmluZGV4T2YoIiEiKTsgLy8kTk9OLU5MUy0xJAotCWphclBhdGhFbmQgPSBqYXJQYXRoRW5kIDwgMCA/IHBhdGgubGVuZ3RoKCkgOiBqYXJQYXRoRW5kOwotCWZpbGVMb2NhdGlvbiA9IHBhdGguc3Vic3RyaW5nKGphclBhdGhTdGFydCwgamFyUGF0aEVuZCk7Ci0JCi0JU3RyaW5nIHJlc3VsdCA9IHBhdGg7Ci0JU3RyaW5nIHJlc29sdmVkTG9jYXRpb24gPSBmaWxlTG9jYXRpb247Ci0JVVJMIHJlc29sdmVkVVJMID0gbnVsbDsKLSAgICBpZiAoZmlsZUxvY2F0aW9uLnN0YXJ0c1dpdGgoInBsYXRmb3JtOi9wbHVnaW4iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIC8vIHRoaXMgaXMgdGhlIHNwZWNsaWFsIGNhc2UsIHdoZXJlIHRoZSByZXNvdXJjZSBpcyBsb2NhdGVkIHJlbGF0aXZlIAotICAgICAgLy8gdG8gYW5vdGhlciBwbHVnaW4gKG5vdCB0aGUgb25lIHRoYXQgZGVjbGFyZXMgdGhlIGV4dGVuc2lvbiBwb2ludCkKLSAgICAgIC8vCi0JCXRyeQotCQl7Ci0JCQlyZXNvbHZlZFVSTCA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChmaWxlTG9jYXRpb24pKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJLy8gZG8gbm90aGluZwotCQl9IAotICAgIH0KLSAgICBlbHNlewotICAgIAkgLy8gdGhpcyBpcyB0aGUgdHlwaWNhbCBjYXNlLCB3aGVyZSB0aGUgcmVzb3VyY2UgaXMgbG9jYXRlZCByZWxhdGl2ZQotICAgICAgICAvLyB0byB0aGUgcGx1Z2luIHRoYXQgZGVjbGFyZXMgdGhlIGV4dGVuc2lvbiBwb2ludAotICAgIAkgdHJ5IHsKLSAgICAJICAgICAJcmVzb2x2ZWRVUkwgPSBuZXcgVVJMKFBsYXRmb3JtLnJlc29sdmUocGxhdGZvcm1VUkwpLCBmaWxlTG9jYXRpb24pOwotICAgIAkgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgIAkgICAgCS8vIGRvIG5vdGhpbmcKLSAgICAJIH0KLSAgICB9Ci0gICAKLSAgIGlmKHJlc29sdmVkVVJMICE9IG51bGwpewotICAgIAlyZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZWRVUkwudG9FeHRlcm5hbEZvcm0oKS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlRmlyc3QoZmlsZUxvY2F0aW9uLCByZXNvbHZlZExvY2F0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBVUkwgZ2V0UGxhdGZvcm1VUkwoU3RyaW5nIHBsdWdpbklkKXsKLQkgIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCXsKLQkJCVVSTCBidW5kbGVFbnRyeSA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWlmKGJ1bmRsZUVudHJ5ICE9IG51bGwpewotCQkJCXRyeQotCQkJCXsKLQkJCQkJcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoYnVuZGxlRW50cnkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHJlc29sdmVQYXRoKFN0cmluZyBwYXRoKQotICB7Ci0JICByZXR1cm4gcmVzb2x2ZVBhdGgoZ2V0UGxhdGZvcm1VUkwoZGVjbGFyaW5nRXh0ZW5zaW9uSWQpLCBwYXRoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdHJ5Ci0gICAgewotCSAgZGVjbGFyaW5nRXh0ZW5zaW9uSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBjYXRjaCAoSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKFRBR19DT05UUklCVVRJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSl7Ci0gICAgCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1hcHBpbmdJbmZvRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUFVCTElDKTsKLSAgICAJcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMobWFwcGluZ0luZm9FbGVtZW50TGlzdCk7Ci0gICAgCW1hcHBpbmdJbmZvRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNKTsKLSAgICAJcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMobWFwcGluZ0luZm9FbGVtZW50TGlzdCk7Ci0gICAgCW1hcHBpbmdJbmZvRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJKTsKLSAgICAJcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMobWFwcGluZ0luZm9FbGVtZW50TGlzdCk7Ci0gICAgCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG5leHRDYXRhbG9nRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfTkVYVF9DQVRBTE9HKTsKLSAgICAJcHJvY2Vzc05leHRDYXRhbG9nRWxlbWVudHMobmV4dENhdGFsb2dFbGVtZW50TGlzdCk7Ci0gICAgCQotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzTWFwcGluZ0luZm9FbGVtZW50cyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZEVsZW1lbnRMaXN0KQotICB7Ci0gICAgaWYgKGNhdGFsb2cgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRWxlbWVudExpc3QubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkRWxlbWVudCA9IGNoaWxkRWxlbWVudExpc3RbaV07Ci0gICAgICBTdHJpbmcgbmFtZSA9IGNoaWxkRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICBTdHJpbmcga2V5ID0gbnVsbDsKLQkKLSAgICAgIGludCB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzsKLSAgICAgIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1BVQkxJQy5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpOwotICAgICAgICB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FKTsKLSAgICAgICAgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRy5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHByb2Nlc3NOZXh0Q2F0YWxvZ0VsZW1lbnRzKG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXXtjaGlsZEVsZW1lbnR9KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgU3RyaW5nIGVudHJ5VVJJID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkkpOyAvLyBtYW5kYXRvcnkKLSAgICAgIGlmIChlbnRyeVVSSSA9PSBudWxsIHx8IGVudHJ5VVJJLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZW50cnlfdXJpX25vdF9zZXQpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIElDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQodHlwZSk7Ci0gICAgICBpZiAoY2F0YWxvZ0VsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KQotICAgICAgewotICAgICAgICBJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKElDYXRhbG9nRW50cnkpIGNhdGFsb2dFbGVtZW50OwotICAgICAgICBlbnRyeS5zZXRLZXkoa2V5KTsKLQkJU3RyaW5nIHJlc29sdmVkUGF0aCA9IHJlc29sdmVQYXRoKGVudHJ5VVJJKTsKLQkJZW50cnkuc2V0VVJJKHJlc29sdmVkUGF0aCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpOyAvLyBvcHRpb25hbAotICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgZW50cnkuc2V0SWQoaWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBwcm9jZXNzIGFueSBvdGhlciBhdHRyaWJ1dGVzCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKVtqXTsKLSAgICAgICAgaWYgKCFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX05BTUUpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKQotICAgICAgICAgICAgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRykgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCkKLSAgICAgICAgICAgICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQkFTRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmICFhdHRyVmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhdGFsb2dFbGVtZW50LnNldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChjYXRhbG9nRWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NOZXh0Q2F0YWxvZ0VsZW1lbnRzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkRWxlbWVudExpc3QpCi0gIHsKLSAgICBpZiAoY2F0YWxvZyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRFbGVtZW50TGlzdC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGRFbGVtZW50ID0gY2hpbGRFbGVtZW50TGlzdFtpXTsKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRyk7IC8vIG1hbmRhdG9yeQotICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfbmV4dF9jYXRhbG9nX2xvY2F0aW9uX3VyaV9ub3Rfc2V0KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cgPSBuZXcgTmV4dENhdGFsb2coKTsKLQkgIFN0cmluZyByZXNvbHZlZFBhdGggPSByZXNvbHZlUGF0aChsb2NhdGlvbik7Ci0gICAgICBuZXh0Q2F0YWxvZy5zZXRDYXRhbG9nTG9jYXRpb24ocmVzb2x2ZWRQYXRoKTsKLQkgIFN0cmluZyBpZCA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpOwotCSAgaWYgKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgCi0JCSAgbmV4dENhdGFsb2cuc2V0SWQoaWQpOwotICAgICAgfQotICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChuZXh0Q2F0YWxvZyk7Ci0gICAgfQotICB9Ci0gIAotIAotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTFhMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ0VsZW1lbnQgaW1wbGVtZW50cyBJQ2F0YWxvZ0VsZW1lbnQKLXsKLQlpbnQgdHlwZTsKLQotCVN0cmluZyBpZDsKLQotCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQotCUlDYXRhbG9nIG93bmVyQ2F0YWxvZzsKLQotCXB1YmxpYyBDYXRhbG9nRWxlbWVudChpbnQgYVR5cGUpCi0JewotCQlzdXBlcigpOwotCQl0eXBlID0gYVR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkKLQl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUpCi0JewotCQlyZXR1cm4gKFN0cmluZykgYXR0cmlidXRlcy5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLQl7Ci0JCWF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlcygpCi0JewotCQlDb2xsZWN0aW9uIGMgPSBhdHRyaWJ1dGVzLnZhbHVlcygpOwotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2Muc2l6ZSgpXTsKLQkJYXR0cmlidXRlcy5rZXlTZXQoKS50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpCi0JewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKQotCXsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZyBnZXRPd25lckNhdGFsb2coKQotCXsKLQkJcmV0dXJuIG93bmVyQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lckNhdGFsb2coSUNhdGFsb2cgY2F0YWxvZykKLQl7Ci0JCXRoaXMub3duZXJDYXRhbG9nID0gY2F0YWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBtYWtlQWJzb2x1dGUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIGxvY2F0aW9uKQotCXsKLQkJVVJMIGxvY2FsID0gbnVsbDsKLQkJbG9jYXRpb24gPSBsb2NhdGlvbi5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCXRyeQotCQl7Ci0JCQlVUkwgYmFzZVVSTCA9IG5ldyBVUkwoYmFzZUxvY2F0aW9uKTsKLQkJCWxvY2FsID0gbmV3IFVSTChiYXNlVVJMLCBsb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotCQl7Ci0JCX0KLQotCQlpZiAobG9jYWwgIT0gbnVsbCkKLQkJewotCQkJcmV0dXJuIGxvY2FsLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZQotCQl7Ci0JCQlyZXR1cm4gbG9jYXRpb247Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlVUkkgdXJpID0gbmV3IFVSSShwYXRoKTsKLQkJCWlmICh1cmkuaXNBYnNvbHV0ZSgpKQotCQkJewotCQkJCXJldHVybiBwYXRoOwotCQkJfQotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLQkJewotCQl9Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IHBhdGg7Ci0JCUNhdGFsb2cgY2F0YWxvZyA9IChDYXRhbG9nKSBnZXRPd25lckNhdGFsb2coKTsKLQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkKLQkJewotCQkJU3RyaW5nIGJhc2UgPSBjYXRhbG9nLmdldEJhc2UoKTsKLQkJCWlmIChiYXNlID09IG51bGwgfHwgYmFzZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJYmFzZSA9IGNhdGFsb2cuZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJCXJlc3VsdCA9IG1ha2VBYnNvbHV0ZShiYXNlLCBwYXRoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkgIC8qCi0JICAgKiBTaW5jZSB3ZSBkb24ndCBoYXZlIGV2ZW50cyBub3RpZmljYXRpb25zIGZvciBlbnRyeSBwcm9wZXJ0aWVzLCBjbG9uZSgpCi0JICAgKiBjb3VsZCBhbGxvdyB0byBjb3B5IGFuZCBlZGl0IGVudHJ5IGFuZCB0aGVuIHJlcGxhY2UgaXQgaW4gY2F0YWxvZy4gRW50cnkKLQkgICAqIHJlcGxhY2VtZW50IHdpbGwgc2lnbmFsIElDYXRhbG9nRXZlbnQgQHJldHVybgotCSAgICovCi0JICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLQkgIHsKLQkJSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQgPSBvd25lckNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQodHlwZSk7Ci0JICAgIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKCk7ICAgCi0JICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykKLQkgICAgewotCSAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbaV07Ci0JICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lKTsKLQkgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotCSAgICB9Ci0JCWVsZW1lbnQuc2V0T3duZXJDYXRhbG9nKG93bmVyQ2F0YWxvZyk7Ci0JCWVsZW1lbnQuc2V0SWQoaWQpOwotCSAgICByZXR1cm4gZWxlbWVudDsKLQkgIH0KLQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwYThlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5IGV4dGVuZHMgQ2F0YWxvZ0VsZW1lbnQgaW1wbGVtZW50cyBJQ2F0YWxvZ0VudHJ5LCBDbG9uZWFibGUKLXsKLSAgaW50IGVudHJ5VHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0gIFN0cmluZyBrZXk7Ci0gIFN0cmluZyB1cmk7Ci0KLSAgcHJvdGVjdGVkIENhdGFsb2dFbnRyeShpbnQgYW5FbnRyeVR5cGUpCi0gIHsKLSAgICBzdXBlcihJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSk7Ci0gICAgZW50cnlUeXBlID0gYW5FbnRyeVR5cGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2F0YWxvZ0VudHJ5KCkKLSAgewotICAgIHN1cGVyKElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShpbnQgdmFsdWUpCi0gIHsKLSAgICBlbnRyeVR5cGUgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0RW50cnlUeXBlKCkKLSAgewotICAgIHJldHVybiBlbnRyeVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAga2V5ID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gIHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHVyaSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICBDYXRhbG9nRW50cnkgZW50cnkgPSAoQ2F0YWxvZ0VudHJ5KXN1cGVyLmNsb25lKCk7Ci0JZW50cnkuc2V0RW50cnlUeXBlKGVudHJ5VHlwZSk7Ci0gICAgZW50cnkuc2V0S2V5KGtleSk7Ci0gICAgZW50cnkuc2V0VVJJKHVyaSk7Ci0gICAgcmV0dXJuIGVudHJ5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmJhNjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIENhdGFsb2dFdmVudCBpbXBsZW1lbnRzIElDYXRhbG9nRXZlbnQKLXsKLSAgcHJvdGVjdGVkIElDYXRhbG9nIGNhdGFsb2c7Ci0gIHByb3RlY3RlZCBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQ7Ci0gIHByb3RlY3RlZCBpbnQgZXZlbnRUeXBlOwotCi0gIHB1YmxpYyBDYXRhbG9nRXZlbnQoQ2F0YWxvZyBjYXRhbG9nLCBJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSkKLSAgewotICAgIHRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7Ci0gICAgdGhpcy5jYXRhbG9nRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgdGhpcy5ldmVudFR5cGUgPSBldmVudFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgSUNhdGFsb2cgZ2V0Q2F0YWxvZygpCi0gIHsKLSAgICByZXR1cm4gY2F0YWxvZzsKLSAgfQotCi0gIHB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgZ2V0Q2F0YWxvZ0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGNhdGFsb2dFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGV2ZW50VHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1JlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1JlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI4OGQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENhdGFsb2dSZWFkZXIKLXsKLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlYWQoQ2F0YWxvZyB4bWxDYXRhbG9nLCBJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSwgbmV3IENhdGFsb2dDb250ZW50SGFuZGxlcih4bWxDYXRhbG9nKSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ2F0YWxvZ0NvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotICAgIHByb3RlY3RlZCBDYXRhbG9nIGNhdGFsb2c7Ci0gICAgcHJvdGVjdGVkIFN0YWNrIGJhc2VVUklTdGFjayA9IG5ldyBTdGFjaygpOwotCi0gICAgcHVibGljIENhdGFsb2dDb250ZW50SGFuZGxlcihDYXRhbG9nIHhtbENhdGFsb2cpCi0gICAgewotICAgICAgdGhpcy5jYXRhbG9nID0geG1sQ2F0YWxvZzsKLSAgICAgIFN0cmluZyBiYXNlID0geG1sQ2F0YWxvZy5nZXRCYXNlKCk7Ci0gICAgICBpZihiYXNlID09IG51bGwgfHwgYmFzZSA9PSAiIikgeyAgLy8kTk9OLU5MUy0xJAotICAgIAkgIGJhc2UgPSB4bWxDYXRhbG9nLmdldExvY2F0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBiYXNlVVJJU3RhY2sucHVzaChiYXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAvLyBzZXQgYmFzZQotICAgICAgU3RyaW5nIGJhc2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0JBU0UpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoYmFzZSAhPSBudWxsICYmICFiYXNlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgICBiYXNlVVJJU3RhY2sucHVzaChiYXNlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgCSAgYmFzZVVSSVN0YWNrLnB1c2goYmFzZVVSSVN0YWNrLnBlZWsoKSk7Ci0gICAgICB9Ci0KLQkgIC8vIHByb2Nlc3NpbmcgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgc3RhcnQKLQkgIGlmIChsb2NhbE5hbWUuZXF1YWxzKENvbXBhdGFiaWxpdHlDb25zdGFudHMuVEFHX1VTRVJfRU5UUlkpKQotICAgICAgewotCQlpbnQgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIENvbXBhdGFiaWxpdHlDb25zdGFudHMuQVRUX1RZUEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICh0eXBlTmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHR5cGVOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoIlNZU1RFTSIpID09IDApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJICBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KHR5cGUpOwotCSAgICAgIGlmIChjYXRhbG9nRWxlbWVudCBpbnN0YW5jZW9mIENhdGFsb2dFbnRyeSkKLQkgICAgICB7Ci0JICAgICAgICBDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKENhdGFsb2dFbnRyeSkgY2F0YWxvZ0VsZW1lbnQ7Ci0JCSAgICBTdHJpbmcga2V5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgQ29tcGF0YWJpbGl0eUNvbnN0YW50cy5BVFRfSUQpOyAgIAkJICAgICAvLyROT04tTkxTLTEkCi0JICAgICAgICBjYXRhbG9nRW50cnkuc2V0S2V5KGtleSk7Ci0JICAgICAgICBTdHJpbmcgZW50cnlVcmkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBDb21wYXRhYmlsaXR5Q29uc3RhbnRzLkFUVF9VUkkpOyAgICAvLyROT04tTkxTLTEkCi0JICAgICAgICAKLQkgICAgICAgIC8vIEZvciByZWxhdGl2ZSBVUklzLCB0cnkgdG8gcmVzb2x2ZSB0aGVtIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgVVJJLgotCSAgICAgICAgaWYoVVJJLmNyZWF0ZVVSSShlbnRyeVVyaSkuaXNSZWxhdGl2ZSgpKSB7Ci0JICAgICAgICAJZW50cnlVcmkgPSBVUkkucmVzb2x2ZVJlbGF0aXZlVVJJKGVudHJ5VXJpLCBiYXNlVVJJU3RhY2sucGVlaygpLnRvU3RyaW5nKCkpOwotCSAgICAgICAgfQotCi0JICAgICAgICBjYXRhbG9nRW50cnkuc2V0VVJJKFVSSUhlbHBlci5lbnN1cmVVUklQcm90b2NvbEZvcm1hdChlbnRyeVVyaSkpOyAgCi0JICAgICAgICBTdHJpbmcgd2ViVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgQ29tcGF0YWJpbGl0eUNvbnN0YW50cy5BVFRfV0VCX1VSTCk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICh3ZWJVUkwgIT0gbnVsbCkKLQkJCXsKLQkJCQljYXRhbG9nRW50cnkuc2V0QXR0cmlidXRlVmFsdWUoCi0JCQkJCQlJQ2F0YWxvZ0VudHJ5LkFUVFJfV0VCX1VSTCwgd2ViVVJMKTsKLQkJCX0KLQkgICAgICB9Ci0JCSAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChjYXRhbG9nRWxlbWVudCk7Ci0JCSAgcmV0dXJuOwotICAgICAgfQotCSAgLy8gIHByb2Nlc3NpbmcgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgc3RhcnQKLSAgICAgIAotCSAgaW50IHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOwotCSAgU3RyaW5nIGtleSA9IG51bGw7Ci0JIC8vZHcgU3RyaW5nIGNhdGFsb2dJZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lEKTsKLSAgICAgIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1BVQkxJQy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19TWVNURU0uZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU07Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1VSSS5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5leHRDYXRhbG9nSWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HKTsgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBOZXh0Q2F0YWxvZyBkZWxlZ2F0ZSA9IG5ldyBOZXh0Q2F0YWxvZygpOwotICAgICAgICBkZWxlZ2F0ZS5zZXRDYXRhbG9nTG9jYXRpb24obG9jYXRpb24pOyAgCi0gICAgICAgIGRlbGVnYXRlLnNldElkKG5leHRDYXRhbG9nSWQpOwotICAgICAgICBjYXRhbG9nLmFkZENhdGFsb2dFbGVtZW50KGRlbGVnYXRlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZWxzZXsKLSAgICAJICAvLyBkbyBub3QgaGFuZGxlIG90aGVyIGVudHJpZXMKLSAgICAJICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX2VudHJ5X2tleV9ub3Rfc2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgU3RyaW5nIGVudHJ5VVJJID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJKTsgLy8gbWFuZGF0b3J5IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChlbnRyeVVSSSA9PSBudWxsIHx8IGVudHJ5VVJJLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX2VudHJ5X3VyaV9ub3Rfc2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotIAotICAgICAgSUNhdGFsb2dFbGVtZW50IGNhdGFsb2dFbGVtZW50ID0gY2F0YWxvZy5jcmVhdGVDYXRhbG9nRWxlbWVudCh0eXBlKTsKLSAgICAgIGlmIChjYXRhbG9nRWxlbWVudCBpbnN0YW5jZW9mIENhdGFsb2dFbnRyeSkKLSAgICAgIHsKLSAgICAgICAgQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChDYXRhbG9nRW50cnkpIGNhdGFsb2dFbGVtZW50OwotICAgICAgICBjYXRhbG9nRW50cnkuc2V0S2V5KGtleSk7IAotCi0gICAgICAgIC8vICAgICAgRm9yIHJlbGF0aXZlIFVSSXMsIHRyeSB0byByZXNvbHZlIHRoZW0gdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBVUkkuCi0gICAgICAgIGlmKFVSSS5jcmVhdGVVUkkoZW50cnlVUkkpLmlzUmVsYXRpdmUoKSkgewotICAgICAgICAJZW50cnlVUkkgPSBVUkkucmVzb2x2ZVJlbGF0aXZlVVJJKGVudHJ5VVJJLCBiYXNlVVJJU3RhY2sucGVlaygpLnRvU3RyaW5nKCkpOwotICAgICAgICB9IAotCi0gICAgICAgIGNhdGFsb2dFbnRyeS5zZXRVUkkoVVJJSGVscGVyLmVuc3VyZVVSSVByb3RvY29sRm9ybWF0KGVudHJ5VVJJKSk7ICAgICAKLQotICAgICAgfQotICAgICAgLy8gcHJvY2VzcyBhbnkgb3RoZXIgYXR0cmlidXRlcwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBqKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGopOwotICAgICAgICBpZiAoIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkkpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfTkFNRSkgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9QVUJMSUNfSUQpCi0gICAgICAgICAgICAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRCkgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9DQVRBTE9HKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lEKQotICAgICAgICAgICAgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9CQVNFKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGF0dHJOYW1lKTsKLSAgICAgICAgICBpZiAoYXR0clZhbHVlICE9IG51bGwgJiYgIWF0dHJWYWx1ZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgY2F0YWxvZ0VsZW1lbnQuc2V0QXR0cmlidXRlVmFsdWUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRhbG9nLmFkZENhdGFsb2dFbGVtZW50KGNhdGFsb2dFbGVtZW50KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKGJhc2VVUklTdGFjay5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBiYXNlVVJJU3RhY2sucG9wKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9ICAKLSAgCi0gIC8vIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5Ci0gIGludGVyZmFjZSBDb21wYXRhYmlsaXR5Q29uc3RhbnRzewotCSAgCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSURfWE1MX0NBVEFMT0dfU0VUVElOR1MgPSAiWE1MQ2F0YWxvZ1NldHRpbmdzIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX1VTRVJfRU5UUklFUyA9ICJVc2VyRW50cmllcyI7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19VU0VSX0VOVFJZID0gIlVzZXJFbnRyeSI7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UWVBFID0gIlRZUEUiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiSUQiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVVJJID0gIlVSSSI7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9XRUJfVVJMID0gIldFQl9VUkwiOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmYmQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDYXRhbG9nU2V0IHsKLQlwcm90ZWN0ZWQgTWFwIHVyaVJlc291cmNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgTWFwIGNhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHVibGljIENhdGFsb2dTZXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhIENhdGFsb2cgd2l0aCB0aGUgZ2l2ZW4gSUQuICBJZiBvbmUgaXMgbm90IGZvdW5kLCBjcmVhdGUgb25lIGF0IHRoZSBnaXZlbiBVUkkuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHVyaSAtIHRoZSBVUkksIHRoZSBwYXJlbnQgb2YgdGhpcyBmaWxlIHBhdGggbXVzdCBhbHJlYWR5IGV4aXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDYXRhbG9nIGxvb2t1cE9yQ3JlYXRlQ2F0YWxvZyhTdHJpbmcgaWQsIFN0cmluZyB1cmkpIHsKLQkJQ2F0YWxvZyBjYXRhbG9nID0gZ2V0Q2F0YWxvZyhpZCwgdXJpKTsKLQkJaWYgKGNhdGFsb2cgPT0gbnVsbCkgewotCQkJY2F0YWxvZyA9IG5ldyBDYXRhbG9nKHRoaXMsIGlkLCB1cmkpOwotCQkJdHJ5IHsKLQkJCQljYXRhbG9nLmxvYWQoKTsKLQkJCQl1cmlSZXNvdXJjZU1hcC5wdXQodXJpLCBjYXRhbG9nKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIHdlIGNhdGNoIGFuZCBsb2cgYWxsIGV4Y2VwdGlvbnMsIHRvIGRpc2FsbG93Ci0JCQkJLy8gb25lIGJhZCBleHRlbnNpb24gaW50ZXJmZXJpbmcgd2l0aCBvdGhlcnMKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJlcnJvciBsb2FkaW5nIGNhdGFsb2c6ICIgKyBpZCArICIgIiArIHVyaSwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCXJldHVybiBjYXRhbG9nOwotCX0KLQotCXByaXZhdGUgQ2F0YWxvZyBnZXRDYXRhbG9nKFN0cmluZyBpZCwgU3RyaW5nIHVyaSkgewotCQlyZXR1cm4gKENhdGFsb2cpIHVyaVJlc291cmNlTWFwLmdldCh1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHB1dENhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9uKFN0cmluZyBsb2dpY2FsVVJJLCBTdHJpbmcgYWN0dWFsVVJJKSB7Ci0JCWNhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9ucy5wdXQobG9naWNhbFVSSSwgYWN0dWFsVVJJKTsKLQl9Ci0KLQkvLyBOZXZlciB1c2VkPwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oU3RyaW5nIGlkKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBjYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbnMuZ2V0KGlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDBlMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1dyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogV3JpdGUgT0FTSVMgWE1MIENhdGFsb2cgZm9ybWF0Ci0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENhdGFsb2dXcml0ZXIKLXsKLSAgcHJpdmF0ZSBEb2N1bWVudCBkb2M7Ci0KLSAgcHVibGljIHZvaWQgd3JpdGUoSUNhdGFsb2cgeG1sQ2F0YWxvZywgU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotCU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCXRyeSB7Ci0gICAgICB2aXNpdENhdGFsb2coeG1sQ2F0YWxvZyk7Ci0gICAgICBvdXRwdXRTdHJlYW0gPSBnZXRPdXRwdXRTdHJlYW0odXJpKTsKLSAgICAgIHNlcmlhbGl6ZShvdXRwdXRTdHJlYW0pOwotCX0KLQlmaW5hbGx5IHsKLQkgIGlmKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCSAgfQotCX0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlKElDYXRhbG9nIGNhdGFsb2csIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChjYXRhbG9nICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRDYXRhbG9nKGNhdGFsb2cpOwotICAgICAgc2VyaWFsaXplKG9zKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdmlzaXRDYXRhbG9nKElDYXRhbG9nIHhtbENhdGFsb2cpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBkb2MgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLm5hbWVzcGFjZU5hbWUsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfQ0FUQUxPRyk7Ci0gICAgZG9jLmFwcGVuZENoaWxkKGNhdGFsb2dFbGVtZW50KTsKLSAgICBwcm9jZXNzQ2F0YWxvZ0VudHJpZXMoeG1sQ2F0YWxvZywgY2F0YWxvZ0VsZW1lbnQpOwotICAgIHByb2Nlc3NOZXh0Q2F0YWxvZ3MoeG1sQ2F0YWxvZywgY2F0YWxvZ0VsZW1lbnQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDYXRhbG9nRW50cmllcyhJQ2F0YWxvZyBjYXRhbG9nLCBFbGVtZW50IHBhcmVudCkKLSAgewotICAgIElDYXRhbG9nRW50cnlbXSBjYXRhbG9nRW50cmllcyA9IGNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLSAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRhbG9nRW50cmllcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gY2F0YWxvZ0VudHJpZXNbaV07Ci0gICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBTdHJpbmcgdXJpID0gZW50cnkuZ2V0VVJJKCk7Ci0JICBTdHJpbmcgaWQgPSBlbnRyeS5nZXRJZCgpOwotCSAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotCSAKLSAgICAgc3dpdGNoIChlbnRyeS5nZXRFbnRyeVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDIDoKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19QVUJMSUMpOwotICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1BVQkxJQ19JRCwga2V5KTsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJLCB1cmkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNIDoKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19TWVNURU0pOwotICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1NZU1RFTV9JRCwga2V5KTsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJLCB1cmkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJIDoKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19VUkkpOwotICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX05BTUUsIGtleSk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCSAgaWYoY2hpbGRFbGVtZW50ICE9IG51bGwgJiYgaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKCIiKSl7IC8vJE5PTi1OTFMtMSQKLQkJICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lELCBpZCk7Ci0JICB9Ci0gICAgICAKLSAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ZXMgPSBlbnRyeS5nZXRBdHRyaWJ1dGVzKCk7ICAgCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal07Ci0gICAgICAgIGlmIChhdHRyTmFtZSAhPSBudWxsICYmICFhdHRyTmFtZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLQkJICBTdHJpbmcgYXR0clZhbHVlID0gZW50cnkuZ2V0QXR0cmlidXRlVmFsdWUoYXR0ck5hbWUpOwotICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCAmJiBhdHRyVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc05leHRDYXRhbG9ncyhJQ2F0YWxvZyBjYXRhbG9nLCBFbGVtZW50IHBhcmVudCkKLSAgewotICAgIC8vIGhhbmRsZSBjYXRhbG9nIGVudHJpZXMKLSAgICBJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBjYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgIC8vZHcgU3RyaW5nIGF0dHJWYWx1ZSA9IG51bGw7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSU5leHRDYXRhbG9nIGRlbGVnYXRlID0gbmV4dENhdGFsb2dzW2ldOwotICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfTkVYVF9DQVRBTE9HKTsKLSAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGRlbGVnYXRlLmdldENhdGFsb2dMb2NhdGlvbigpOwotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRywgbG9jYXRpb24pOwotICAgICAgICB9Ci0JCSBTdHJpbmcgaWQgPSBkZWxlZ2F0ZS5nZXRJZCgpOwotCQkgaWYgKGlkICE9IG51bGwpCi0JCSB7Ci0JCQkgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCwgaWQpOwotCQkgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gVW5sZXNzIGEgd2lkdGggaXMgc2V0LCB0aGVyZSB3aWxsIGJlIG9ubHkgbGluZSBicmVha3MgYnV0IG5vCi0gICAgICAvLyBpbmRlbnRhdGlvbi4KLSAgICAgIC8vIFRoZSBJQk0gSkRLIGFuZCB0aGUgU3VuIEpESyBkb24ndCBhZ3JlZSBvbiB0aGUgcHJvcGVydHkgbmFtZSwKLSAgICAgIC8vIHNvIHdlIHNldCB0aGVtIGJvdGguCi0gICAgICAvLwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59aW5kZW50LWFtb3VudCIsICIyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBTdHJpbmcgZW5jb2RpbmcgPSAiVVRGLTgiOyAvLyBUQkQgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsIGVuY29kaW5nKTsKLSAgICAgIH0KLSAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvYyksIG5ldyBTdHJlYW1SZXN1bHQob3V0cHV0U3RyZWFtKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZmlsZVBhdGggPSByZW1vdmVQcm90b2NvbCh1cmkpOwotICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLSAgICBPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmVtb3ZlUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSB1cmk7ICAKLSAgICBTdHJpbmcgcHJvdG9jb2xfcGF0dGVybiA9ICI6IjsgLy8kTk9OLU5MUy0xJAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZihwcm90b2NvbF9wYXR0ZXJuKTsKLSAgICAgIGlmIChpbmRleCA+IDIpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoaW5kZXggKyBwcm90b2NvbF9wYXR0ZXJuLmxlbmd0aCgpKTsgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9OZXh0Q2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvTmV4dENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmNzU1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9OZXh0Q2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIFJhaiBNYW5kYXlhbSwgSUJNCi0gKiAgICAgICAgICAgMTM2NDAwIE5leHRDYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCkgdGFrZXMgYSBsb3Qgb2YgdGltZSBjb21wdXRpbmcgY29uc3RhbnQgaW5mb3JtYXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTmV4dENhdGFsb2cgZXh0ZW5kcyBDYXRhbG9nRWxlbWVudCBpbXBsZW1lbnRzIElOZXh0Q2F0YWxvZwotewotICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLSAgcHJpdmF0ZSBJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZzsKLQotICBwdWJsaWMgTmV4dENhdGFsb2coKQotICB7Ci0gICAgc3VwZXIoSUNhdGFsb2dFbGVtZW50LlRZUEVfTkVYVF9DQVRBTE9HKTsKLSAgfQotICAgIAotICBwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgSUNhdGFsb2cgZ2V0UmVmZXJlbmNlZENhdGFsb2coKQotICB7Ci0gICAgaWYgKHJlZmVyZW5jZWRDYXRhbG9nID09IG51bGwpCi0gICAgewotICAgICAgcmVmZXJlbmNlZENhdGFsb2cgPSAoKENhdGFsb2cpb3duZXJDYXRhbG9nKS5nZXRDYXRhbG9nU2V0KCkubG9va3VwT3JDcmVhdGVDYXRhbG9nKGdldElkKCksIGdldEFic29sdXRlUGF0aChsb2NhdGlvbikpOwotICAgIH0KLSAgICByZXR1cm4gcmVmZXJlbmNlZENhdGFsb2c7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nTG9jYXRpb24oU3RyaW5nIHVyaSkKLSAgewotICAgIGxvY2F0aW9uID0gdXJpOwotICAgIHJlZmVyZW5jZWRDYXRhbG9nID0gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLQlOZXh0Q2F0YWxvZyBuZXh0Q2F0YWxvZyA9IChOZXh0Q2F0YWxvZylzdXBlci5jbG9uZSgpOwotCW5leHRDYXRhbG9nLnNldENhdGFsb2dMb2NhdGlvbihsb2NhdGlvbik7Ci0gICAgcmV0dXJuIG5leHRDYXRhbG9nOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9PQVNJU0NhdGFsb2dDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL09BU0lTQ2F0YWxvZ0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2M1NzhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL09BU0lTQ2F0YWxvZ0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VOYW1lID0gInVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUeXBlcyBvZiB0aGUgY2F0YWxvZyBlbnRyaWVzICovCi0gIC8qKiBUaGUgQ0FUQUxPRyBlbGVtZW50IG5hbWUuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVRBTE9HID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgR1JPVVAgY2F0YWxvZyBlbnRyeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0dST1VQID0gImdyb3VwIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFBVQkxJQyBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFVCTElDID0gInB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBTWVNURU0gY2F0YWxvZyBldG5yeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NZU1RFTSA9ICJzeXN0ZW0iOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgVVJJIGNhdGFsb2cgZW50cnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFJFV1JJVEVfU1lTVEVNIGNhdGFsb2cgZW50cnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVdSSVRFX1NZU1RFTSA9ICJyZXdyaXRlU3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFJFV1JJVEVfVVJJIGNhdGFsb2cgZW50cnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVdSSVRFX1VSSSA9ICJyZXdyaXRlUHVibGljIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1BVQkxJQyBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVMRUdBVEVfUFVCTElDID0gImRlbGVnYXRlUHVibGljIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1NZU1RFTSBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVMRUdBVEVfU1lTVEVNID0gImRlbGVnYXRlU3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1VSSSBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVMRUdBVEVfVVJJID0gImRlbGVnYXRlVXJpIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIE5FWFRfQ0FUQUxPRyBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkVYVF9DQVRBTE9HID0gIm5leHRDYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlcyAqLwotICAvKiogQXR0cmlidXRlIGlkIHVzZWQgaW4gYWxsIGNhdGFsb2cgZW50cmllcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlIGlkIGJhc2UgaW4gYWxsIGNhdGFsb2cgZW50cmllcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0JBU0UgPSAieG1sOmJhc2UiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBBdHRyaWJ1dGUgaWQgcHJlZmVyZSBpbiBjYXRhbG9nIGVudHJpZXM6IENBVEFMT0csIEdST1VQICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJFRkVSRSA9ICJwcmVmZXJlIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFBVQkxJQyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BVQkxJQ19JRCA9ICJwdWJsaWNJZCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBTWVNURU0KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1lTVEVNX0lEID0gInN5c3RlbUlkIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFVSSQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUFVCTElDLCBVUkkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBSRVdSSVRFX1NZU1RFTSwgREVMRUdBVEVfU1lTVEVNCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NZU1RFTV9JRF9TVEFSVF9TVFJJTkcgPSAic3lzdGVtSWRTdGFydFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBSRVdSSVRFX1NZU1RFTSwgUkVXUklURV9VUkkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUkVXUklURV9QUkVGSVggPSAicmV3cml0ZVByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBERUxFR0FURV9QVUJMSUMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFVCTElDX0lEX1NUQVJUX1NUUklORyA9ICJwdWJsaWNJZFN0YXJ0U3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IERFTEVHQVRFX1BVQkxJQywKLSAgICogREVMRUdBVEVfU1lTVEVNLCBERUxFR0FURV9VUkksIE5FWFRfQ0FUQUxPRwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DQVRBTE9HID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUkVXUklURV9VUkksIERFTEVHQVRFX1VSSQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VUklfU1RBUlRfU1RSSU5HID0gInVyaVN0YXJ0U3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0YWYwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5qZWN0IHRoZSBYTUxDYXRhbG9nIHJlc29sdXRpb24gYmVoYXZpb3VyIGludG8gdGhlCi0gKiBDb21tb24gRXh0ZW5zaWJsZSBVUkkgUmVzb2x2ZXIuIFRoaXMgY2xhc3MgaXMgcmVmZXJlbmNlZCBpbiB0aGUgWE1MIENhdGFsb2cKLSAqIHBsdWdpbidzIHBsdWdpbi54bWwgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dVUklSZXNvbHZlckV4dGVuc2lvbiBpbXBsZW1lbnRzIFVSSVJlc29sdmVyRXh0ZW5zaW9uCi17Ci0gIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZShJRmlsZSBmaWxlLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIC8vIGlmIHdlIGhhdmUgY2F0YWxvZyBpbiBhIHByb2plY3Qgd2UgbWF5IGFkZCBpdAotICAgIC8vIHRvIHRoZSBjYXRhbG9nIG1hbmFnZXIgZmlyc3QKLSAgICBJQ2F0YWxvZyBjYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLSAgICBpZiAoY2F0YWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX251bGxfY2F0YWxvZyk7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgU3RyaW5nIHJlc29sdmVkID0gbnVsbDsKLSAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmVzb2x2ZWQgPSBjYXRhbG9nLnJlc29sdmVTeXN0ZW0oc3lzdGVtSWQpOwotICAgICAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc29sdmVkID0gY2F0YWxvZy5yZXNvbHZlVVJJKHN5c3RlbUlkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX3Jlc29sdXRpb25fbWFsZm9ybWVkX3VybCk7Ci0gICAgICAgIHJlc29sdmVkID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpZSkKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX3Jlc29sdXRpb25faW9fZXhjZXB0aW9uKTsKLSAgICAgICAgcmVzb2x2ZWQgPSBudWxsOwotICAgICAgfQotICAgIH0KLSAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gQ1MgOiB0aGlzIGlzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGJ1ZyA5Njc3MgotICAgICAgICAvLwotICAgICAgICAvLyBGb3Igc2NoZW1hcyB3ZSBhbHdheXMgdXNlIGxvY2F0aW9ucyB3aGVyZSBhdmFpbGFibGUgYW5kIG9ubHkgdXNlCi0gICAgICAgIC8vIG5hbWVzcGFjZSB3aGVuIG5vIGxvY2F0aW9uIGlzIHNwZWNpZmllZC4gIEZvciBYTUwgZW50aXRpZXMgKHN1Y2ggYXMgRE9DVFlQRSkgCi0gICAgICAgIC8vIGRlZmF1bHQgYWx3YXlzIHV0aWxpemUgdGhlIHB1YmxpYyBjYXRhbG9nIGVudHJ5LgotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGxhbWUgdGVzdCBiZWxvdyByb3VnaGx5IGRpc2NyaW1pbmF0ZSBiZXR3ZWVuIHNjaGVtYSBhbmQgWE1MIGVudGl0aWVzLgotICAgICAgICAvLyBUT0RPIChidWcgMTAzMjQzKSByZW1vdmUgdGhpcyBsYW1lIHRlc3Qgb25jZSB3ZSBtb3ZlIHRvIHRoZSBuZXcgVVJJUmVzb2x2ZXIgQVBJCi0gICAgICAgIC8vIHNpbmNlIHRoZSBuZXcgQVBJIGlzIGV4cGxpY2l0IGFib3V0IG5hbWVzcGFjZSBhbmQgcHVibGljSWQKLSAgICAgICAgLy8gCi0gICAgICAgIGlmICghKHN5c3RlbUlkICE9IG51bGwgJiYgc3lzdGVtSWQuZW5kc1dpdGgoIi54c2QiKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc29sdmVkID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBjYXRhbG9nLnJlc29sdmVVUkkocHVibGljSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX21hbGZvcm1lZF91cmwpOwotICAgICAgICAgICAgcmVzb2x2ZWQgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaWUpCi0gICAgICAgICAgewotICAgICAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX3Jlc29sdXRpb25faW9fZXhjZXB0aW9uKTsKLSAgICAgICAgICAgIHJlc29sdmVkID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc29sdmVkOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzN2EzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+Jy4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nCi17Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBjYXRhbG9nIGlkIHN0cmluZwotICAgICAqIAotICAgICAqIEByZXR1cm4gY2F0YWxvZyBpZCBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyBjYXRhbG9nIGlkIHN0cmluZwotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCk7Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBhcHBsaWNhYmxlIFBVQkxJQyBvciBTWVNURU0gaWRlbnRpZmllci4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBzZWFyY2hlcyB0aGUgQ2F0YWxvZyBhbmQgcmV0dXJucyB0aGUgc3lzdGVtIGlkZW50aWZpZXIKLSAgICAgKiBzcGVjaWZpZWQgZm9yIHRoZSBnaXZlbiBzeXN0ZW0gb3IgcHVibGljIGlkZW50aWZpZXJzLiBJZiBubyBhcHByb3ByaWF0ZQotICAgICAqIFBVQkxJQyBvciBTWVNURU0gZW50cnkgaXMgZm91bmQgaW4gdGhlIENhdGFsb2csIG51bGwgaXMgcmV0dXJuZWQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBwdWJsaWNJZAotICAgICAqICAgICAgICAgICAgVGhlIHB1YmxpYyBpZGVudGlmaWVyIHRvIGxvY2F0ZSBpbiB0aGUgY2F0YWxvZy4gUHVibGljCi0gICAgICogICAgICAgICAgICBpZGVudGlmaWVycyBhcmUgbm9ybWFsaXplZCBiZWZvcmUgY29tcGFyaXNvbi4KLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBub21pbmFsIHN5c3RlbSBpZGVudGlmaWVyIGZvciB0aGUgZW50aXR5IGluIHF1ZXN0aW9uIChhcwotICAgICAqICAgICAgICAgICAgcHJvdmlkZWQgaW4gdGhlIHNvdXJjZSBkb2N1bWVudCkuCi0gICAgICogCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBUaGUgZm9ybWFsIHN5c3RlbSBpZGVudGlmaWVyIG9mIGEgc3Vib3JkaW5hdGUgY2F0YWxvZyBjYW5ub3QKLSAgICAgKiAgICAgICAgICAgICBiZSB0dXJuZWQgaW50byBhIHZhbGlkIFVSTC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgRXJyb3IgcmVhZGluZyBzdWJvcmRpbmF0ZSBjYXRhbG9nIGZpbGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgc3lzdGVtIGlkZW50aWZpZXIgdG8gdXNlLiBOb3RlIHRoYXQgdGhlIG5vbWluYWwgc3lzdGVtCi0gICAgICogICAgICAgICBpZGVudGlmaWVyIGlzIG5vdCByZXR1cm5lZCBpZiBhIG1hdGNoIGlzIG5vdCBmb3VuZCBpbiB0aGUKLSAgICAgKiAgICAgICAgIGNhdGFsb2csIGluc3RlYWQgbnVsbCBpcyByZXR1cm5lZCB0byBpbmRpY2F0ZSB0aGF0IG5vIG1hdGNoIHdhcwotICAgICAqICAgICAgICAgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyByZXNvbHZlUHVibGljKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGFwcGxpY2FibGUgU1lTVEVNIHN5c3RlbSBpZGVudGlmaWVyLgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIElmIGEgU1lTVEVNIGVudHJ5IGV4aXN0cyBpbiB0aGUgQ2F0YWxvZyBmb3IgdGhlIHN5c3RlbSBJRCBzcGVjaWZpZWQsCi0gICAgICogcmV0dXJuIHRoZSBtYXBwZWQgdmFsdWUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIE9uIFdpbmRvd3MtYmFzZWQgb3BlcmF0aW5nIHN5c3RlbXMsIHRoZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIHN5c3RlbQotICAgICAqIGlkZW50aWZpZXIgcHJvdmlkZWQgYW5kIHRoZSBTWVNURU0gZW50cmllcyBpbiB0aGUgQ2F0YWxvZyBpcwotICAgICAqIGNhc2UtaW5zZW5zaXRpdmUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBzeXN0ZW1JZAotICAgICAqICAgICAgICAgICAgVGhlIHN5c3RlbSBJRCB0byBsb2NhdGUgaW4gdGhlIGNhdGFsb2cuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgcmVzb2x2ZWQgc3lzdGVtIGlkZW50aWZpZXIuCi0gICAgICogCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBUaGUgZm9ybWFsIHN5c3RlbSBpZGVudGlmaWVyIG9mIGEgc3Vib3JkaW5hdGUgY2F0YWxvZyBjYW5ub3QKLSAgICAgKiAgICAgICAgICAgICBiZSB0dXJuZWQgaW50byBhIHZhbGlkIFVSTC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgRXJyb3IgcmVhZGluZyBzdWJvcmRpbmF0ZSBjYXRhbG9nIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyByZXNvbHZlU3lzdGVtKFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBhcHBsaWNhYmxlIFVSSS4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBJZiBhIFVSSSBlbnRyeSBleGlzdHMgaW4gdGhlIENhdGFsb2cgZm9yIHRoZSBVUkkgc3BlY2lmaWVkLCByZXR1cm4gdGhlCi0gICAgICogbWFwcGVkIHZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBVUkkgY29tcGFyaXNvbiBpcyBjYXNlIHNlbnNpdGl2ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgVGhlIFVSSSB0byBsb2NhdGUgaW4gdGhlIGNhdGFsb2cuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgcmVzb2x2ZWQgVVJJLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIGEgc3Vib3JkaW5hdGUgY2F0YWxvZyBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICB0dXJuZWQgaW50byBhIHZhbGlkIFVSTC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgRXJyb3IgcmVhZGluZyBzdWJvcmRpbmF0ZSBjYXRhbG9nIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyB1cmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFkZHMgY2F0YWxvZyBlbGVtZW50IHRvIHRoZSBjb2xsZWN0aW9uIG9mIHRoZSBjYXRhbG9nIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IC0KLSAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgY2F0YWxvZyBlbGVtZW50IGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgdGhlIGNhdGFsb2cgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQgLQotICAgICAqICAgICAgICAgICAgY2F0YWxvZyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjYXRhbG9nIGVsZW1lbnRzIG9mIHR5cGUgSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNhdGFsb2cgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgSUNhdGFsb2dFbnRyeVtdIGdldENhdGFsb2dFbnRyaWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGFsb2cgZWxlbWVudHMgb2YgdHlwZQotICAgICAqIElDYXRhbG9nRWxlbWVudC5UWVBFX0RFTEVHQVRFCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjYXRhbG9nIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIElOZXh0Q2F0YWxvZ1tdIGdldE5leHRDYXRhbG9ncygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBuZXcgY2F0YWxvZyBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCB0eXBlLiBJZiB0aGUgdHlwZSBpcyBvbmUKLSAgICAgKiBvZiBFTEVNRU5UX1RZUEUsIHRoZSByZXN1bHQgZW50cnkgd2lsbCBoYXZlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUNhdGFsb2dFbGVtZW50IGNyZWF0ZUNhdGFsb2dFbGVtZW50KGludCB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpOwotICAgIAotICAgIC8vcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgKiBMb2FkcyBjYXRhbG9nIGZyb20gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gRXhwZWN0aW5nIE9BU0lTIFhNTCBDYXRhbG9nCi0gICAgICogZm9ybWF0Ci0gICAgICogCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIC0KLSAgICAgKiAgICAgICAgICAgIHVyaSBvZiB0aGUgZmlsZSB3aGVyZSBjYXRhbG9nIHdpbGwgYmUgc2F2ZWQKLQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLQotICAgICAqICAgICAgICAgICAgIHByb2JsZW0gbG9hZGluZyBmaWxlCi0gICAgICogCi0gICAgICovCi0gICAgLy9wdWJsaWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIFNhdmVzIGNhdGFsb2cgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpbiBPQVNJUyBYTUwgQ2F0YWxvZyBmb3JtYXQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gLQotICAgICAqICAgICAgICAgICAgdXJpIG9mIHRoZSBmaWxlIHdoZXJlIGNhdGFsb2cgd2lsbCBiZSBzYXZlZAotCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtCi0gICAgICogICAgICAgICAgICAgcHJvYmxlbSBzYXZpbmcgZmlsZQotICAgICAqIAotICAgICAqLwotICAgIC8vcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBjb3BpZXMgYWxsIGNhdGFsb2cgZW50cmllcyBmcm9tIHNvdXJjZSBjYXRhbG9nIHRvIHRoaXMgb25lLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYXRhbG9nIC0KLSAgICAgKiAgICAgICAgICAgIHNvdXJjZSBjYXRhbG9nCi0gICAgICogQHBhcmFtIGluY2x1ZGVOZXN0ZWQgLQotICAgICAqICAgICAgICAgICAgYSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyB3ZXRoZXIgdG8gaW5jbHVkZSBlbnRyaWVzIG9mIHRoZQotICAgICAqICAgICAgICAgICAgc2FtZSB0eXBlIGZyb20gdGhlIG5lc3RlZCBjYXRhbG9ncwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEVudHJpZXNGcm9tQ2F0YWxvZyhJQ2F0YWxvZyBjYXRhbG9nKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBsaXN0ZW5lciBvZiB0aGUgY2F0YWxvZyBldmVudHMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgLQotICAgICAqICAgICAgICAgICAgbGlzdGVuZXIgb2YgdGhlIGNhdGFsb2cgZXZlbnRzCi0gICAgICogQHNlZSBJQ2F0YWxvZ0V2ZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUNhdGFsb2dMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgb2YgdGhlIGNhdGFsb2cgZXZlbnRzCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIC0KLSAgICAgKiAgICAgICAgICAgIGxpc3RlbmVyIG9mIHRoZSBjYXRhbG9nIGV2ZW50cwotICAgICAqIEBzZWUgSUNhdGFsb2dFdmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElDYXRhbG9nTGlzdGVuZXIgbGlzdGVuZXIpOyAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwNTVjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nRWxlbWVudAotewotICAgIC8qKiBUeXBlcyBvZiB0aGUgY2F0YWxvZyBlbnRyaWVzICovCi0gICAgLyoqIFRoZSBQVUJMSUMsIFVSSSBvciBTWVNURU0gQ2F0YWxvZyBFbnRyeS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0VOVFJZID0gMTsKLQotICAgIC8qKiBUaGUgTkVYVF9DQVRBTE9HIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05FWFRfQ0FUQUxPRyA9IDEwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqLwotICAgIGludCBnZXRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdpdGggc3BlY2lmaWVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRoIHNwZWNpZmllZCBuYW1lLgotICAgICAqIEBzZWUgI3NldEF0dHJpYnV0ZVZhbHVlKFN0cmluZykKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHdpbGwgYmUgc2V0Ci0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSBuYW1lZCBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0QXR0cmlidXRlVmFsdWUoKQotICAgICAqLwotICAgIHZvaWQgc2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGF0dHJpYnV0ZSBuYW1lcyBmb3IgYW55IGR5bmFtaWMgYXR0cmlidXRlcyB0aGF0IG1heSBleGlzdAotICAgICAqIAotICAgICAqIEByZXR1cm4gYXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzCi0gICAgICogQHNlZSAjZ2V0QXR0cmlidXRlVmFsdWUoKQotICAgICAqIEBzZWUgI3NldEF0dHJpYnV0ZVZhbHVlKFN0cmluZykKLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBlbGVtZW50J3MgaWQgc3RyaW5nCi0gICAgICogCi0gICAgICogQHJldHVybiBlbGVtZW50J3MgaWQgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgZWxlbWVudCdzIGlkIHN0cmluZwotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0T3duZXJDYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpOwotICAgIAotICAgIHB1YmxpYyBJQ2F0YWxvZyBnZXRPd25lckNhdGFsb2coKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxY2JlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGFsb2dFbnRyeSBleHRlbmRzIElDYXRhbG9nRWxlbWVudAotewotICAgIC8qKiBUaGUgU1lTVEVNIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRSWV9UWVBFX1BVQkxJQyA9IDI7Ci0KLSAgICAvKiogVGhlIFNZU1RFTSBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5UUllfVFlQRV9TWVNURU0gPSAzOwotCi0gICAgLyoqIFRoZSBVUkkgQ2F0YWxvZyBFbnRyeSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVFJZX1RZUEVfVVJJID0gNDsKLQotICAgIC8qKiBBdHRyaWJ1dGUgbmFtZSBmb3IgV2ViIGFkZHJlc3Mgb2YgY2F0YWxvZyBlbnRyeSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfV0VCX1VSTCA9ICJ3ZWJVUkwiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW50cnlUeXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW50cnlUeXBlKGludCBlbnRyeVR5cGUpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RW50cnlUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkkoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0V2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjU3NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi0KLQotLyoqCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2F0YWxvZ0V2ZW50Ci17Ci0gICAgLyoqICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRCA9IDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0FEREVEID0gMTsKLQotICAgIC8qKiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfUkVNT1ZFRCA9IDI7Ci0KLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0NIQU5HRUQgPSAzOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIElDYXRhbG9nIGdldENhdGFsb2coKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUNhdGFsb2dFbGVtZW50IGdldENhdGFsb2dFbGVtZW50KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0xpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2RjMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgY2xpZW50cyBvZiB0aGUgY2F0YWxvZyB0aGF0IHdhbnQgdG8gbGlzdGVuIHRvIGNhdGFsb2cgY2hhbmdlcyBzaG91bGQKLSAqIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIAotICogQHNlZSBJQ2F0YWxvZywgSUNhdGFsb2dFdmVudCwKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyCi17Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRvIHJlYWN0IHRvIGNhdGFsb2cgZXZlbnRzCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IC0KLSAgICAgKiAgICAgICAgICAgIGFuIGV2ZW50IHRoYXQgY2xpZW50IHNob3VsZCByZWFjdCB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKElDYXRhbG9nRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSU5leHRDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JTmV4dENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjOTM5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JTmV4dENhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBuZXh0Q2F0YWxvZyBPQVNJUyBYTUwgY2F0YWxvZyBlbGVtZW50LiBPYmplY3Qgb2YgdGhlCi0gKiBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2Ugd291bGQgc2VydmUgYXMgYSByZWZlcmVuY2UgdG8gdGhlCi0gKiBjYXRhbG9nIG9iamVjdC4KLSAqIAotICogQHNlZSBJQ2F0YWxvZywgSUNhdGFsb2dFbGVtZW50Ci0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGN1cnJlbnRseSBpcyB1c2VkIG9ubHkgYnkgdGhlIGNhdGFsb2cgaXRzZWxmLiBOZWVkIHRvIGZpbmQgaWYKLSAqIHRoZXJlIGFyZSBhbnkgY2xpZW50cyB0aGF0IG5lZWQgaXQuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmV4dENhdGFsb2cgZXh0ZW5kcyBJQ2F0YWxvZ0VsZW1lbnQKLXsKLSAgICAvKioKLSAgICAgKiBTZXQgbG9jYXRpb24gb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpIC0KLSAgICAgKiAgICAgICAgICAgIGxvY2F0aW9uIHVyaSBvZiB0aGUgcmVmZXJlbmNlZCBjYXRhbG9nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0xvY2F0aW9uKFN0cmluZyB1cmkpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGxvY2F0aW9uIHVyaSBvZiB0aGUgcmVmZXJlbmNlZCBjYXRhbG9nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gbG9jYXRpb24gdXJpIG9mIHRoZSByZWZlcmVuY2VkIGNhdGFsb2cKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dMb2NhdGlvbigpOwotICAgIAotICAgIHB1YmxpYyBJQ2F0YWxvZyBnZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCi0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUFueUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUFueUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJhNDcwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BbnlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTUFueUVsZW1lbnQgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01BbnlFbGVtZW50IGV4dGVuZHMgQ01Db250ZW50IHsKLS8qKgotICogZ2V0TmFtZXNwYWNlVVJJIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWY3MThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0gKiBBdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGV4dGVuZHMgQ01Ob2RlIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgICA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEICAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVhFRCAgICAgID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPSElCSVRFRCA9IDQ7Ci0vKioKLSAqIGdldEF0dHJOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRBdHRyTmFtZSgpOwotLyoqCi0gKiBnZXRBdHRyVHlwZSBtZXRob2QKLSAqIEByZXR1cm4gQ01EYXRhVHlwZQotICovCi1DTURhdGFUeXBlIGdldEF0dHJUeXBlKCk7Ci0vKioKLSAqIGdldERlZmF1bHRWYWx1ZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICogQGRlcHJlY2F0ZWQgLS0gdG8gYmUgcmVwbGFjZWQgaW4gZnV0dXJlIHdpdGggYWRkaXRpb25hbCBDTURhdGFUeXBlIG1ldGhvZHMgKGN1cnJlbnRseSBmb3VuZCBvbiBDTURhdGFUeXBlSGVscGVyKQotICovCi1TdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vKioKLSAqIGdldEVudW1BdHRyIG1ldGhvZAotICogQHJldHVybiBqYXZhLnV0aWwuRW51bWVyYXRpb24KLSAqIEBkZXByZWNhdGVkIC0tIHRvIGJlIHJlcGxhY2VkIGluIGZ1dHVyZSB3aXRoIGFkZGl0aW9uYWwgQ01EYXRhVHlwZSBtZXRob2RzIChjdXJyZW50bHkgZm91bmQgb24gQ01EYXRhVHlwZUhlbHBlcikKLSAqLwotRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKTsKLS8qKgotICogZ2V0VXNhZ2UgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICovCi1pbnQgZ2V0VXNhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4YjI5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBDTUNvbnRlbnQgZXh0ZW5kcyBDTU5vZGUKLXsKLS8qKgotICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICoKLSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLSAqLwotaW50IGdldE1heE9jY3VyKCk7Ci0vKioKLSAqIGdldE1pbk9jY3VyIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLSAqLwotaW50IGdldE1pbk9jY3VyKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01EYXRhVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkOWY1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01EYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01EYXRhVHlwZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRGF0YVR5cGUgZXh0ZW5kcyBDTU5vZGUgewotICAgIAotICAvLyB0b2RvLi4uIGF0IHNvbWUgcG9pbnQgd2Ugc2hvdWxkIHJlbW92ZSB0aGVzZSBuYW1lcyB0bwotICAvLyBhdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHZpYSB0aGUgaW50ZXJmYWNlcwotICAvLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEEgPSAiQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJJRCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGID0gIklEUkVGIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gIkVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTID0gIkVOVElUSUVTIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT04gPSAiTk9UQVRJT04iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOID0gIk5NVE9LRU4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOUyA9ICJOTVRPS0VOUyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUiA9ICJOVU1CRVIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBVUkkgPSAiVVJJIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTSA9ICJFTlVNIjsgLy8kTk9OLU5MUy0xJAotCi0gIHN0YXRpYyBmaW5hbCBpbnQgSU1QTElFRF9WQUxVRV9OT05FICAgICAgICAgICAgID0gMTsKLSAgc3RhdGljIGZpbmFsIGludCBJTVBMSUVEX1ZBTFVFX0ZJWEVEICAgICAgICAgICAgPSAyOwotICBzdGF0aWMgZmluYWwgaW50IElNUExJRURfVkFMVUVfREVGQVVMVCAgICAgICAgICA9IDM7Ci0KLS8qKgotICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpOyAgICAKLQotLyoqCi0gKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBSZXR1cm5zIG9uZSBvZiA6Ci0gKiBJTVBMSUVEX1ZBTFVFX05PTkUsIElNUExJRURfVkFMVUVfRklYRUQsIElNUExJRURfVkFMVUVfREVGQVVMVC4KLSAqLyAgICAgIAotCi1pbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpOyAgCi0KLS8qKgotICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgIAotICoKLSAqIFJldHVybnMgdGhlIGltcGxpZWQgdmFsdWUgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLSAqLwotU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpOwotCi0vKioKLSAqIGdldFR5cGVOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLSAqCi0gKi8KLVN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQotLyoqCi0gKiBnZXRUeXBlTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICoKLSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YSB0eXBlIGlzIGNyZWF0ZWQuCi0gKiBUaGlzIHJldHVybnMgbnVsbCBvZiBhIHN1aXRhYmxlIGRlZmF1bHQgaXMgbm90IGF2YWlsYWJsZS4KLSAqLwotU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDdhNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRG9jdW1lbnQgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudCBleHRlbmRzIENNTm9kZSB7Ci0vKioKLSAqIGdldEVsZW1lbnRzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRWxlbWVudERlY2xhcmF0aW9uCi0gKi8KLUNNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCk7Ci0vKioKLSAqIGdldEVudGl0aWVzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRW50aXR5RGVjbGFyYXRpb24KLSAqLwotQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKTsKLS8qKgotICogZ2V0TmFtZXNwYWNlIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVzcGFjZQotICovCi1DTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlNGQ4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTURvY3VtZW50YXRpb24gaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudGF0aW9uIGV4dGVuZHMgQ01Ob2RlIHsgICAgICAgIAotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKTsKLSAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDgwNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTUVsZW1lbnREZWNsYXJhdGlvbiBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBleHRlbmRzIENNQ29udGVudCB7Ci0gIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOWSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFkgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JWEVEID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQ0RBVEEgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENEQVRBID0gNTsgLy8gdG9kby4uLiBjbGFyaWZ5IHRoaXMgb25lCi0vKioKLSAqIGdldEF0dHJpYnV0ZXMgbWV0aG9kCi0gKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0gKgotICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBBdHRyaWJ1dGVEZWNsYXJhdGlvbgotICovCi1DTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCk7Ci0vKioKLSAqIGdldENNQ29udGVudCBtZXRob2QKLSAqIEByZXR1cm4gQ01Db250ZW50Ci0gKgotICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuCi0gKiBUaGlzIGNhbiBiZSBhbiBDTUVsZW1lbnREZWNsYXJhdGlvbiBvciBhIENNR3JvdXAKLSAqLwotQ01Db250ZW50IGdldENvbnRlbnQoKTsKLS8qKgotICogZ2V0Q29udGVudFR5cGUgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICoKLSAqIFJldHVybnMgb25lIG9mIDoKLSAqIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLgotICovCi1wdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCk7Ci0vKioKLSAqIGdldEVsZW1lbnROYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRFbGVtZW50TmFtZSgpOwotCi0vKioKLSAqIGdldERhdGFUeXBlIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLUNNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKTsKLQotLyoqCi0gKiBnZXRMb2NhbEVsZW1lbnRzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgYSBsaXN0IG9mIGxvY2FsbHkgZGVmaW5lZCBlbGVtZW50cy4KLSAqLwotQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRW50aXR5RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVudGl0eURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjU0MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRW50aXR5RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRW50aXR5RGVjbGFyYXRpb24gaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01FbnRpdHlEZWNsYXJhdGlvbiBleHRlbmRzIENNTm9kZSB7Ci0gIAotLyoqCi0gKiBnZXROYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXROYW1lKCk7Ci0vKioKLSAqIGdldFZhbHVlIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDFjYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNR3JvdXAgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Hcm91cCBleHRlbmRzIENNQ29udGVudCB7Ci0gIAotCXN0YXRpYyBmaW5hbCBpbnQgQUxMID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IENIT0lDRSA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBTRVFVRU5DRSA9IDE7Ci0vKioKLSAqIGdldENoaWxkTm9kZXMgbWV0aG9kCi0gKiBAcmV0dXJuIENNTm9kZUxpc3QKLSAqCi0gKiBSZXR1cm5zIGNoaWxkIENNTm9kZUxpc3QsIHdoaWNoIGluY2x1ZGVzIEVsZW1lbnREZWZpbml0aW9uIG9yIENNRWxlbWVudC4KLSAqLwotQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCk7Ci0KLS8qKgotICogZ2V0T3BlcmF0aW9uIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBSZXR1cm5zIG9uZSBvZiA6Ci0gKiBBTE9ORSAoYSksIFNFUVVFTkNFIChhLGIpLCBDSE9JQ0UgKGF8YiksIEFMTCAoYSZiKS4KLSAqLwotaW50IGdldE9wZXJhdG9yKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc5YjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotLyoqCi0gKiBOYW1lZENNTm9kZU1hcAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNTmFtZWROb2RlTWFwIHsKLS8qKgotICogZ2V0TGVuZ3RoIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqLwotaW50IGdldExlbmd0aCgpOwotLyoqCi0gKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0gKiBAcmV0dXJuIENNTm9kZQotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1DTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKTsKLS8qKgotICogaXRlbSBtZXRob2QKLSAqIEByZXR1cm4gQ01Ob2RlCi0gKiBAcGFyYW0gaW5kZXggaW50Ci0gKi8KLUNNTm9kZSBpdGVtKGludCBpbmRleCk7Ci0KLS8qKgotICoKLSAqLwotSXRlcmF0b3IgaXRlcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMGJjYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTU5hbWVzcGFjZSBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTU5hbWVzcGFjZSBleHRlbmRzIENNTm9kZSB7Ci0gIAotLyoqCi0gKiBnZXRQcmVmaXggbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldFByZWZpeCgpOwotLyoqCi0gKiBnZXRVUkkgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldFVSSSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQ5NWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNTm9kZSBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTU5vZGUgeyAgICAgICAgCi0gIAotICBzdGF0aWMgZmluYWwgaW50IEFOWV9FTEVNRU5UICAgICAgICAgICA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVfREVDTEFSQVRJT04gPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgREFUQV9UWVBFICAgICAgICAgICAgID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IERPQ1VNRU5UICAgICAgICAgICAgICA9IDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0RFQ0xBUkFUSU9OICAgPSA1OwotCXN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0RFQ0xBUkFUSU9OICAgID0gNjsKLQlzdGF0aWMgZmluYWwgaW50IEdST1VQICAgICAgICAgICAgICAgICA9IDc7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9TUEFDRSAgICAgICAgICAgID0gODsKLSAgc3RhdGljIGZpbmFsIGludCBET0NVTUVOVEFUSU9OICAgICAgICAgPSA5OwotLyoqCi0gKiBnZXROb2RlTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0Tm9kZU5hbWUoKTsKLS8qKgotICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICoKLSAqIFJldHVybnMgb25lIG9mIDoKLSAqCi0gKi8KLWludCBnZXROb2RlVHlwZSgpOwotCi0vKioKLSAqIHN1cHBvcnRzIG1ldGhvZAotICogQHJldHVybiBib29sZWFuCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLSAqCi0gKi8KLWJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLS8qKgotICogZ2V0UHJvcGVydHkgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLSAqCi0gKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotICoKLSAqLwotT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOyAvL3RvZG8gdGhyb3cgdW5zdXBwb3J0ZWQgcHJvcGVydHkgZXhjZXB0aW9uCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGFkYmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTU5vZGVMaXN0IGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNTm9kZUxpc3QgewotICAKLS8qKgotICogZ2V0TGVuZ3RoIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqLwotaW50IGdldExlbmd0aCgpOwotLyoqCi0gKiBpdGVtIG1ldGhvZAotICogQHJldHVybiBDTU5vZGUKLSAqIEBwYXJhbSBpbmRleCBpbnQKLSAqLwotQ01Ob2RlIGl0ZW0oaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDJiMTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3RvcnkuQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXI7Ci0KLQotLyoqCi0gKiBDb250ZW50TW9kZWxNYW5hZ2VyIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxNYW5hZ2VyIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBwcml2YXRlIHN0YXRpYyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5IGluZmVycmVkR3JhbW1hckZhY3Rvcnk7Ci0JcHJpdmF0ZSBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5IGNtRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb250ZW50TW9kZWxNYW5hZ2VyIGluc3RhbmNlOwotCi0JcHVibGljIENvbnRlbnRNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50TW9kZWxNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQ29udGVudE1vZGVsTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmksIFN0cmluZyByZXNvdXJjZVR5cGUpIHsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBudWxsICYmIHVyaSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzb3VyY2VUeXBlID0gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQl9Ci0KLQkJaWYgKHJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlDTURvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gZ2V0Q01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnkocmVzb3VyY2VUeXBlKTsKLQkJcmV0dXJuIGZhY3RvcnkgIT0gbnVsbCA/IGZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCh1cmkpIDogbnVsbDsKLQl9Ci0KLQotCXByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSBnZXRDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlpZiAoY21Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQljbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5ID0gbmV3IENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCW5ldyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKGNtRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBjbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCi0JcHVibGljIExpc3QgZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KCkuZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MocHVibGljSWQpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeSBnZXRBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KCkgewotCQlpZiAoYW5ub3RhdGlvbkZpbGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5ID0gbmV3IEFubm90YXRpb25GaWxlUmVnaXN0cnkoKTsKLQkJCW5ldyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyKGFubm90YXRpb25GaWxlUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBhM2IzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLSAgICAgICAgIAotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb24KLXsgICAgICAgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOyAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBBbm5vdGF0aW9uKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U3BlYyhTdHJpbmcgc3BlYykKLSAgewotICAgIGhhc2h0YWJsZS5wdXQoInNwZWMiLCBzcGVjKTsgLy8kTk9OLU5MUy0xJAotICB9ICAgICAKLQotICBwdWJsaWMgU3RyaW5nIGdldFNwZWMoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpaGFzaHRhYmxlLmdldCgic3BlYyIpOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgICAgIAotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBoYXNodGFibGUucHV0KG5hbWUsIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgeyAgICAgCi0gICAgcmV0dXJuIChTdHJpbmcpaGFzaHRhYmxlLmdldChwcm9wZXJ0eU5hbWUpOwotICB9ICAgIAotCi0gIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUxpc3QoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7IC8vIHRvZG8KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Fubm90YXRpb24vQW5ub3RhdGlvbk1hcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Fubm90YXRpb24vQW5ub3RhdGlvbk1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkzMDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25NYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUGFyc2VyOwotCi0KLS8qKgotICogQW5ub3RhdGlvbk1hcAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbk1hcCB7Ci0JcHJvdGVjdGVkIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUgPSB0cnVlOwotCi0JcHVibGljIEFubm90YXRpb25NYXAoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgewotCQl0aGlzLmlzQ2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlTdHJpbmcgc3BlYyA9IGFubm90YXRpb24uZ2V0U3BlYygpOwotCQlpZiAoc3BlYyAhPSBudWxsKSB7Ci0JCQlsaXN0LmFkZChhbm5vdGF0aW9uKTsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3BlYywgIltdfFx0XG5cclxmICIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNtTm9kZVNwZWMgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlhZGRBbm5vdGF0aW9uRm9yQ01Ob2RlU3BlYyhjbU5vZGVTcGVjLCBhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25Gb3JDTU5vZGVTcGVjKFN0cmluZyBjbU5vZGVTcGVjLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJU3RyaW5nIGtleSA9IGlzQ2FzZVNlbnNpdGl2ZSA/IGNtTm9kZVNwZWMgOiBjbU5vZGVTcGVjLnRvTG93ZXJDYXNlKCk7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KSBoYXNodGFibGUuZ2V0KGtleSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCWhhc2h0YWJsZS5wdXQoa2V5LCBsaXN0KTsKLQkJfQotCQlsaXN0LmFkZChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBjbU5vZGVTcGVjLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcga2V5ID0gaXNDYXNlU2Vuc2l0aXZlID8gY21Ob2RlU3BlYyA6IGNtTm9kZVNwZWMudG9Mb3dlckNhc2UoKTsKLQkJTGlzdCBhbm5vdGF0aW9uTGlzdCA9IChMaXN0KSBoYXNodGFibGUuZ2V0KGtleSk7Ci0JCWlmIChhbm5vdGF0aW9uTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhbm5vdGF0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgaS5uZXh0KCk7Ci0JCQkJcmVzdWx0ID0gYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KENNTm9kZSBjbU5vZGUsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBjbU5vZGVTcGVjID0gKFN0cmluZykgY21Ob2RlLmdldFByb3BlcnR5KCJzcGVjIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNtTm9kZVNwZWMgPT0gbnVsbCkgewotCQkJY21Ob2RlU3BlYyA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotCQl9Ci0JCWlmIChjbU5vZGVTcGVjICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFByb3BlcnR5KGNtTm9kZVNwZWMsIHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZChTdHJpbmcgdXJpLCBTdHJpbmcgYnVuZGxlSWQpIHRocm93cyBFeGNlcHRpb24gewotCQlBbm5vdGF0aW9uRmlsZVBhcnNlciBwYXJzZXIgPSBuZXcgQW5ub3RhdGlvbkZpbGVQYXJzZXIoKTsKLQkJQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvID0gbmV3IEFubm90YXRpb25GaWxlSW5mbyh1cmksIGJ1bmRsZUlkKTsKLQkJcGFyc2VyLnBhcnNlKHRoaXMsIGZpbGVJbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BbnlFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQW55RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwMGE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BbnlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ01BbnlFbGVtZW50SW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVUkk7ICAKLQotICBwdWJsaWMgQ01BbnlFbGVtZW50SW1wbChTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgbWluT2NjdXIgPSAtMTsKLSAgfSAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTm9kZU5hbWUoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB1cmkgIT0gbnVsbCA/ICgiYW55IyIgKyB1cmkpIDogImFueSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBDTU5vZGUKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY29tcHV0ZU5vZGVOYW1lKG5hbWVzcGFjZVVSSSk7Ci0gIH0KLSAKLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQU5ZX0VMRU1FTlQ7Ci0gIH0gCi0KLSAgLy8gaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkZjRmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uCi17Ci0gIHByb3RlY3RlZCBDTURhdGFUeXBlIGRhdGFUeXBlOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5vZGVOYW1lOyAgICAKLSAgcHJvdGVjdGVkIGludCB1c2FnZTsgIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudCBjbURvY3VtZW50OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmVmaXhRdWFsaWZpY2F0aW9uOwotICBwcm90ZWN0ZWQgTGlzdCB4c2lUeXBlczsKLSAgICAgICAgICAgICAgICAKLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKFN0cmluZyBub2RlTmFtZSwgaW50IHVzYWdlKQotICB7Ci0gICAgdGhpcyhub2RlTmFtZSwgdXNhZ2UsIG51bGwpOwotICB9ICAgICAKLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoU3RyaW5nIG5vZGVOYW1lLCBpbnQgdXNhZ2UsIENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsgICAgICAgIAotICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKLSAgICB0aGlzLnVzYWdlID0gdXNhZ2U7Ci0gICAgdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlOyAKLSAgfSAgICAKLQotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgewotICAgIHJldHVybiBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7ICAgCi0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkNNRG9jdW1lbnQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGNtRG9jdW1lbnQ7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJYU0lUeXBlcyIpKSAvLyROT04tTkxTLTEkCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSB4c2lUeXBlczsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25zUHJlZml4UXVhbGlmaWNhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gcHJlZml4UXVhbGlmaWNhdGlvbiA/ICJxdWFsaWZpZWQiIDogInVucXVhbGlmaWVkIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfSAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcmVmaXhRdWFsaWZpY2F0aW9uKGJvb2xlYW4gcXVhbGlmaWVkKQotICB7Ci0gICAgcHJlZml4UXVhbGlmaWNhdGlvbiA9IHF1YWxpZmllZDsKLSAgfSAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgc2V0WFNJVHlwZXMoTGlzdCBsaXN0KQotICB7Ci0gICAgeHNpVHlwZXMgPSBsaXN0OwotICB9Ci0gICAgIAotICBwdWJsaWMgdm9pZCBzZXRDTURvY3VtZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgewotICAgIHRoaXMuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiBub2RlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVOYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QXR0clR5cGUoQ01EYXRhVHlwZSBkYXRhVHlwZSkKLSAgewotICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkKLSAgewotICAgIHJldHVybiBkYXRhVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0VXNhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHVzYWdlOwotICB9Ci0gICAgICAgICAgIAotICAvKiogQGRlcHJlY2F0ZWQgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0gICAgICAgICAgICAgICAgIAotCi0gIC8qKiBAZGVwcmVjYXRlZCAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Db250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzU3ZWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTUNvbnRlbnRJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNQ29udGVudAotewotICBwcm90ZWN0ZWQgaW50IG1pbk9jY3VyID0gMDsKLSAgcHJvdGVjdGVkIGludCBtYXhPY2N1ciA9IC0xOyAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgLy8gaW1wbGVtZW50cyBDTUNvbnRlbnQKLSAgLy8KLSAgcHVibGljIGludCBnZXRNYXhPY2N1cigpCi0gIHsKLSAgICByZXR1cm4gbWF4T2NjdXI7Ci0gIH0gICAgICAgICAgCi0gCi0gIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKQotICB7Ci0gICAgcmV0dXJuIG1pbk9jY3VyOwotICB9ICAKLSAgICAgCi0gIC8vIGltcGxlbWVudGF0aW9uIHNwZWNpZmljCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHNldE1heE9jY3VyKGludCBuKQotICB7Ci0gICAgbWF4T2NjdXIgPSBuOwotICB9ICAgICAgICAgIAotIAotICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cihpbnQgbikKLSAgewotICAgIG1pbk9jY3VyID0gbjsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRGF0YVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMDQ2MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRGF0YVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNRGF0YVR5cGVJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNRGF0YVR5cGUKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBkYXRhVHlwZU5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBlbnVtZXJhdGVkVmFsdWVzOyAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgaW5zdGFuY2VWYWx1ZTsKLQotICBwdWJsaWMgQ01EYXRhVHlwZUltcGwoU3RyaW5nIGRhdGFUeXBlTmFtZSwgU3RyaW5nIGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICB0aGlzLmRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlTmFtZTsKLSAgICB0aGlzLmluc3RhbmNlVmFsdWUgPSBpbnN0YW5jZVZhbHVlOwotICAgIHRoaXMuZW51bWVyYXRlZFZhbHVlcyA9IG5ldyBTdHJpbmdbMF07Ci0gIH0KLQotICBwdWJsaWMgQ01EYXRhVHlwZUltcGwoU3RyaW5nIGRhdGFUeXBlTmFtZSwgU3RyaW5nW10gZW51bWVyYXRlZFZhbHVlcykKLSAgewotICAgIHRoaXMuZGF0YVR5cGVOYW1lID0gZGF0YVR5cGVOYW1lOwotICAgIHRoaXMuZW51bWVyYXRlZFZhbHVlcyA9IGVudW1lcmF0ZWRWYWx1ZXM7ICAgCi0gICAgdGhpcy5pbnN0YW5jZVZhbHVlID0gZW51bWVyYXRlZFZhbHVlc1swXTsKLSAgfQotCi0KLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGRhdGFUeXBlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpCi0gIHsKLSAgICByZXR1cm4gSU1QTElFRF9WQUxVRV9OT05FOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpCi0gIHsKLSAgICByZXR1cm4gZW51bWVyYXRlZFZhbHVlczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZVZhbHVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Eb2N1bWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURvY3VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc2YThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotCi0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50SW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50Ci17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGVsZW1lbnRzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGxvY2FsRWxlbWVudFBvb2w7Ci0gIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgYW55RWxlbWVudHM7Ci0KLSAgcHVibGljIENNRG9jdW1lbnRJbXBsKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIERPQ1VNRU5UOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotIAotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0gICAgICAgICAgICAgICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50czsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwgZ2V0QW55RWxlbWVudHMoKQotICB7IAotICAgIGlmIChhbnlFbGVtZW50cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGFueUVsZW1lbnRzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgIH0KLSAgICByZXR1cm4gYW55RWxlbWVudHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwgZ2V0TG9jYWxFbGVtZW50UG9vbCgpCi0gIHsgCi0gICAgaWYgKGxvY2FsRWxlbWVudFBvb2wgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBsb2NhbEVsZW1lbnRQb29sID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgIH0gICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBsb2NhbEVsZW1lbnRQb29sOwotICB9Ci0KLSAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkKLSAgewotICAgIHJldHVybiBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzliOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLQotcHVibGljIGNsYXNzIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7ICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudCBjbURvY3VtZW50OwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBsb2NhbEVsZW1lbnRNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gIHByb3RlY3RlZCBDTUNvbnRlbnQgY29udGVudDsKLSAgcHJvdGVjdGVkIENNRGF0YVR5cGUgZGF0YVR5cGU7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzTG9jYWw7Ci0KLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbChDTURvY3VtZW50IGNtRG9jdW1lbnQsIFN0cmluZyBuYW1lKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50ID0gY21Eb2N1bWVudDsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9ICAgICAKLQotICAvLyBpbXBsZW1lbnRzIENNTm9kZQotICAvLwotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0gCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEVMRU1FTlRfREVDTEFSQVRJT047Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7ICAgICAgICAgICAgICAgCi0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uc1ByZWZpeFF1YWxpZmljYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzTG9jYWwgPyAidW5xdWFsaWZpZWQiIDogInF1YWxpZmllZCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0gICAgCi0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiQ01Eb2N1bWVudCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gY21Eb2N1bWVudDsgICAgICAgCi0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgICAgICAgICAgICAgIAotICAvLyBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uCi0gIC8vCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkKLSAgewotICAgIHJldHVybiBhdHRyaWJ1dGVNYXA7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnQ7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBNSVhFRDsKLSAgfSAgICAgICAgICAgIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpCi0gIHsgCi0gICAgcmV0dXJuIGRhdGFUeXBlOwotICB9Ci0KLSAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKQotICB7IAotICAgIHJldHVybiBsb2NhbEVsZW1lbnRNYXA7Ci0gIH0gCi0gICAgCi0gIC8vCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoQ01Db250ZW50IGNtQ29udGVudCkKLSAgewotICAgIGNvbnRlbnQgPSBjbUNvbnRlbnQ7Ci0gIH0gICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldERhdGFUeXBlKENNRGF0YVR5cGUgY21EYXRhVHlwZSkKLSAgewotICAgIGRhdGFUeXBlID0gY21EYXRhVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwgZ2V0QXR0cmlidXRlTWFwKCkKLSAgewotICAgIHJldHVybiBhdHRyaWJ1dGVNYXA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMb2NhbChib29sZWFuIGlzTG9jYWwpCi0gIHsKLSAgICB0aGlzLmlzTG9jYWwgPSBpc0xvY2FsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUVudGl0eURlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWQ5N2ZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUVudGl0eURlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTUVudGl0eURlY2xhcmF0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLSAgcHVibGljIENNRW50aXR5RGVjbGFyYXRpb25JbXBsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEVOVElUWV9ERUNMQVJBVElPTjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLSAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLX0gICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUdyb3VwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzRlY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDTUdyb3VwSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUdyb3VwCi17Ci0gIHByb3RlY3RlZCBDTU5vZGVMaXN0IG5vZGVMaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGludCBvcGVyYXRvcjsgIAotCi0gIHB1YmxpYyBDTUdyb3VwSW1wbChDTU5vZGVMaXN0IG5vZGVMaXN0LCBpbnQgb3BlcmF0b3IpCi0gIHsKLSAgICB0aGlzLm5vZGVMaXN0ID0gbm9kZUxpc3Q7Ci0gICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gR1JPVVA7Ci0gIH0KLSAKLSAgcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpCi0gIHsKLSAgICByZXR1cm4gbm9kZUxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkKLSAgewotICAgIHJldHVybiBvcGVyYXRvcjsKLSAgfSAKLX0gICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5hbWVkTm9kZU1hcEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlNjNkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIAotewotICBwdWJsaWMgc3RhdGljIENNTmFtZWROb2RlTWFwSW1wbCBFTVBUWV9OQU1FRF9OT0RFX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogQ01OYW1lZE5vZGVNYXBJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gICAqLwotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKCkKLSAgewotICAJc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoQ01OYW1lZE5vZGVNYXAgaW5pdGlhbENvbnRlbnRzTWFwKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChpbml0aWFsQ29udGVudHNNYXAgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGluaXRpYWxDb250ZW50c01hcC5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKLQkJCQlwdXQoaW5pdGlhbENvbnRlbnRzTWFwLml0ZW0oaikpOwotCQkJfQotCQl9Ci0JfQotICAvKioKLSAgICogZ2V0TGVuZ3RoIG1ldGhvZAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHVibGljIGludCBnZXRMZW5ndGgoKQotICB7Ci0gIAlyZXR1cm4gdGFibGUuc2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIGdldE5hbWVkSXRlbSBtZXRob2QKLSAgICogQHJldHVybiBDTU5vZGUKLSAgICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgKi8KLSAgcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgCXJldHVybiAoQ01Ob2RlKXRhYmxlLmdldChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBpdGVtIG1ldGhvZAotICAgKiBAcmV0dXJuIENNTm9kZQotICAgKiBAcGFyYW0gaW5kZXggaW50Ci0gICAqLwotICBwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IHNpemUgPSB0YWJsZS5zaXplKCk7Ci0gICAgaWYgKGluZGV4IDwgc2l6ZSkKLSAgICB7Ci0gICAgICBFbnVtZXJhdGlvbiB2YWx1ZXMgPSB0YWJsZS5lbGVtZW50cygpOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8PSBpbmRleDsgaSsrKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoQ01Ob2RlKXZhbHVlcy5uZXh0RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgSGFzaHRhYmxlIGdldEhhc2h0YWJsZSgpCi0gIHsKLSAgICAgICAgICByZXR1cm4gdGFibGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCi0gIHsKLSAgICAgICAgICByZXR1cm4gdGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfSAgICAgICAgCi0gIAotICBwdWJsaWMgdm9pZCBwdXQoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIHRhYmxlLnB1dChjbU5vZGUuZ2V0Tm9kZU5hbWUoKSwgY21Ob2RlKTsKLSAgfQotfQotICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTJlMmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Ob2RlCi17ICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzSW5mZXJyZWQgPSBmYWxzZTsKLSAgIAotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0gCi0gIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gCi0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7ICAgICAgICAgICAgICAKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoImlzSW5mZXJyZWQiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gaXNJbmZlcnJlZCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgcHVibGljIHZvaWQgc2V0SW5mZXJyZWQoYm9vbGVhbiBpc0luZmVycmVkKQotICB7Ci0gICAgdGhpcy5pc0luZmVycmVkID0gaXNJbmZlcnJlZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjYmEzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDTU5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIENNTm9kZUxpc3QgCi17Ci0gIHB1YmxpYyBzdGF0aWMgQ01Ob2RlTGlzdEltcGwgRU1QVFlfTk9ERV9MSVNUID0gbmV3IENNTm9kZUxpc3RJbXBsKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCi0gIHB1YmxpYyBDTU5vZGVMaXN0SW1wbCgpCi0gIHsKLSAgICB0aGlzKG5ldyBWZWN0b3IoKSk7Ci0gIH0KLQotICBwdWJsaWMgQ01Ob2RlTGlzdEltcGwoTGlzdCBsaXN0KQotICB7Ci0gICAgdGhpcy5saXN0ID0gbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBnZXRMZW5ndGggbWV0aG9kCi0gICAqIEByZXR1cm4gaW50Ci0gICAqLwotICBwdWJsaWMgaW50IGdldExlbmd0aCgpCi0gIHsKLSAgICByZXR1cm4gbGlzdC5zaXplKCk7Ci0gIH0KLSAgLyoqCi0gICAqIGl0ZW0gbWV0aG9kCi0gICAqIEByZXR1cm4gQ01Ob2RlCi0gICAqIEBwYXJhbSBpbmRleCBpbnQKLSAgICovCi0gIHB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpCi0gIHsKLSAgICByZXR1cm4gKENNTm9kZSlsaXN0LmdldChpbmRleCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldExpc3QoKQotICB7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhDTU5vZGUgY21Ob2RlKQotICB7Ci0gICAgcmV0dXJuIGxpc3QuY29udGFpbnMoY21Ob2RlKTsKLSAgfSAKLSAgCi0gIHB1YmxpYyB2b2lkIGFkZChDTU5vZGUgY21Ob2RlKQotICB7Ci0gICAgbGlzdC5hZGQoY21Ob2RlKTsKLSAgfSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODRiZTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0vLyB0aGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGJ1aWxkIGEgZ3JhbW1hciBkb2N1bWVudCBnaXZlbiBhIGxvY2FsIGZpbGUgbmFtZQotLy8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudEZhY3RvcnkKLXsgICAKLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MzdiOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IKLXsKLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkVsZW1lbnQ7Ci0gIHByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnkgZmFjdG9yeTsKLQotICBwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnkgZ2V0RmFjdG9yeSgpCi0gIHsKLSAgICBpZiAoZmFjdG9yeSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBmYWN0b3J5ID0gKENNRG9jdW1lbnRGYWN0b3J5KSBmRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBsb2FkaW5nIENNRG9jdW1lbnRGYWN0b3J5IixlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQwM2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5IGluc3RhbmNlOwotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBERUZBVUxUX1JFU09VUkNFX1RZUEUgPSAiKiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBNYXAgcmVzb3VyY2VUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByb3RlY3RlZCBWZWN0b3IgZG9jdW1lbnRCdWlsZGVyTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotCXB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5KCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHB1dEZhY3RvcnkoU3RyaW5nIHJlc291cmNlVHlwZSwgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yIGZhY3RvcnlEZXNjcmlwdG9yKSB7Ci0JCXJlc291cmNlVHlwZU1hcC5wdXQocmVzb3VyY2VUeXBlLCBmYWN0b3J5RGVzY3JpcHRvcik7Ci0JfQotCi0JcHVibGljIENNRG9jdW1lbnRGYWN0b3J5IGdldEZhY3RvcnkoU3RyaW5nIHJlc291cmNlVHlwZSkgewotCQlDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IgZmFjdG9yeURlc2NyaXB0b3IgPSBudWxsOwotCQlpZiAocmVzb3VyY2VUeXBlICE9IG51bGwpIHsKLQkJCWZhY3RvcnlEZXNjcmlwdG9yID0gKENNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvcikgcmVzb3VyY2VUeXBlTWFwLmdldChyZXNvdXJjZVR5cGUpOwotCQl9Ci0JCWlmIChmYWN0b3J5RGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkvLyAoZG13KSBpc3N1ZTogYSBkZWZhdWx0IHR5cGUgb2YgJyonIG1lYW5zIHdoYXQ/IHJlZ2lzdGVyZWQgYXMKLQkJCS8vICcqJyBpcyB0aGUgd2F5IHRoaXMgd29ya3Mgbm93LiBpcyB0aGF0IHRoZSBpbnRlbnQ/IE9yIHNob3VsZCBpdAotCQkJLy8gbWVhbiByZWdpc3RlcmVkIGFzIGFueSBvdGhlciB0eXBlPwotCQkJZmFjdG9yeURlc2NyaXB0b3IgPSAoQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yKSByZXNvdXJjZVR5cGVNYXAuZ2V0KERFRkFVTFRfUkVTT1VSQ0VfVFlQRSk7Ci0JCX0KLQkJcmV0dXJuIGZhY3RvcnlEZXNjcmlwdG9yICE9IG51bGwgPyBmYWN0b3J5RGVzY3JpcHRvci5nZXRGYWN0b3J5KCkgOiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4YjE5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJkb2N1bWVudEZhY3RvcmllcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJ0eXBlIjsgICAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBTdHJpbmcgcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQ7Ci0gIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLSAgCi0gIHB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBTdHJpbmcgYnVuZGxlaWQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoYnVuZGxlaWQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotICAgIHsKLSAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgU3RyaW5nIGZpbGVuYW1lRXh0ZW5zaW9ucyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLSAgICAgIGlmIChmYWN0b3J5Q2xhc3MgIT0gbnVsbCAmJiBmaWxlbmFtZUV4dGVuc2lvbnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IoZWxlbWVudCk7Ci0gICAgICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZpbGVuYW1lRXh0ZW5zaW9ucywgIiwiKTsgc3QuaGFzTW9yZVRva2VucygpOyApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCXJlZ2lzdHJ5LnB1dEZhY3RvcnkodG9rZW4sIGRlc2NyaXB0b3IpOwkKLSAgICAgICAgICB9ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWEzNzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbm5vdGF0aW9uIGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsZUluZm8gewotCXByaXZhdGUgU3RyaW5nIGZBbm5vdGF0aW9uRmlsZUxvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIGZCdW5kbGVJZDsKLQotCXB1YmxpYyBBbm5vdGF0aW9uRmlsZUluZm8oU3RyaW5nIGFubm90YXRpb25GaWxlTG9jYXRpb24sIFN0cmluZyBidW5kbGVJZCkgewotCQlmQW5ub3RhdGlvbkZpbGVMb2NhdGlvbiA9IGFubm90YXRpb25GaWxlTG9jYXRpb247Ci0JCWZCdW5kbGVJZCA9IGJ1bmRsZUlkOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGFubm90YXRpb24gZmlsZSBhcyBvcmlnaW5hbGx5IHNwZWNpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbkZpbGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGZBbm5vdGF0aW9uRmlsZUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYnVuZGxlIGlkIHdoZXJlIHRoZSBhbm5vdGF0aW9uIGZpbGUgaXMgbG9jYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnVuZGxlSWQoKSB7Ci0JCXJldHVybiBmQnVuZGxlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MTkxNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsZVBhcnNlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX0FOTk9UQVRJT05TID0gImFic3RyYWN0R3JhbW1hckFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9BTk5PVEFUSU9OID0gImFubm90YXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX1BST1BFUlRZID0gInByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHBhcnNlIGFuIGFubm90YXRpb24gZmlsZSBhbmQgc3RvcmUgdGhlCi0JICogY29udGVudHMgaW50byBhbiBhbm5vdGF0aW9uTWFwCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlKEFubm90YXRpb25NYXAgYW5ub3RhdGlvbk1hcCwgSW5wdXRTdHJlYW0gaW5wdXQsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG1vdmUgdG8gWGVyY2VzLTIuLi4uIGFkZCAnY29udGV4dENsYXNzTG9hZGVyJyBzdHVmZgotCQlDbGFzc0xvYWRlciBwcmV2Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQl0cnkgewotCQkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCVNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCksIG5ldyBBbm5vdGF0aW9uTWFwQ29udGVudEhhbmRsZXIoYW5ub3RhdGlvbk1hcCwgZmlsZUluZm8pKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZDbGFzc0xvYWRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcGFyc2UgYW4gYW5ub3RhdGlvbiBmaWxlIGFuZCBzdG9yZSB0aGUKLQkgKiBjb250ZW50cyBpbnRvIGFuIGFubm90YXRpb25NYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShBbm5vdGF0aW9uTWFwIG1hcCwgQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJVVJMIHVybCA9IFBsYXRmb3JtLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKGZpbGVJbmZvLmdldEJ1bmRsZUlkKCkpLCBQYXRoLmZyb21PU1N0cmluZyhmaWxlSW5mby5nZXRBbm5vdGF0aW9uRmlsZUxvY2F0aW9uKCkpKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCWlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCQlwYXJzZShtYXAsIGlucHV0U3RyZWFtLCBmaWxlSW5mbyk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl0aHJvdyAoZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBBbm5vdGF0aW9uTWFwQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0JCXByaXZhdGUgQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwOwotCQlwcml2YXRlIEFubm90YXRpb24gY3VycmVudEFubm90YXRpb247Ci0JCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRQcm9wZXJ0eU5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nQnVmZmVyIHByb3BlcnR5VmFsdWVCdWZmZXI7Ci0JCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCXByaXZhdGUgQW5ub3RhdGlvbkZpbGVJbmZvIGZGaWxlSW5mbzsKLQotCQlwdWJsaWMgQW5ub3RhdGlvbk1hcENvbnRlbnRIYW5kbGVyKEFubm90YXRpb25NYXAgYW5ub3RhdGlvbk1hcCwgQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvKSB7Ci0JCQl0aGlzLmFubm90YXRpb25NYXAgPSBhbm5vdGF0aW9uTWFwOwotCQkJdGhpcy5mRmlsZUluZm8gPSBmaWxlSW5mbzsKLQkJfQotCi0JCXByaXZhdGUgVVJMIGdlbmVyYXRlUHJvcGVydGllc0ZpbGVVUkwoQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvLCBTdHJpbmcgcHJvcGVydGllc0xvY2F0aW9uKSB7Ci0JCQlVUkwgcHJvcGVydGllc1VSTCA9IG51bGw7Ci0KLQkJCS8vIHByZXBlbmQgJG5sJCB2YXJpYWJsZSB0byBsb2NhdGlvbgotCQkJSVBhdGggYW5ub3RhdGlvblBhdGggPSBQYXRoLmZyb21PU1N0cmluZygiJG5sJC8iICsgZmlsZUluZm8uZ2V0QW5ub3RhdGlvbkZpbGVMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uLnhtbCBmaWxlCi0JCQlJUGF0aCBhbm5vdGF0aW9uRm9sZGVyID0gYW5ub3RhdGlvblBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJLy8gYXBwZW5kIGxvY2F0aW9uIG9mIHByb3BlcnRpbGVzIGZpbGUKLQkJCUlQYXRoIHByb3BlcnRpZXNGaWxlID0gYW5ub3RhdGlvbkZvbGRlci5hcHBlbmQocHJvcGVydGllc0xvY2F0aW9uKTsKLQkJCS8vIGFwcGVuZCAucHJvcGVydGllcyBleHRlbnNpb24gaWYgbmVlZGVkCi0JCQlpZiAocHJvcGVydGllc0ZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpID09IG51bGwpCi0JCQkJcHJvcGVydGllc0ZpbGUgPSBwcm9wZXJ0aWVzRmlsZS5hZGRGaWxlRXh0ZW5zaW9uKCJwcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGNyZWF0ZSBhIFVSTCBvdXQgb2YgdGhlIHByb3BlcnRpZXMgZmlsZSBsb2NhdGlvbgotCQkJcHJvcGVydGllc1VSTCA9IFBsYXRmb3JtLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKGZpbGVJbmZvLmdldEJ1bmRsZUlkKCkpLCBwcm9wZXJ0aWVzRmlsZSk7Ci0JCQlyZXR1cm4gcHJvcGVydGllc1VSTDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlwcm9wZXJ0eVZhbHVlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0lEX0FOTk9UQVRJT05TKSkgewotCQkJCWludCBhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGkpOwotCQkJCQlTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoInByb3BlcnRpZXNMb2NhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCVVSTCBidW5kbGVVUkwgPSBnZW5lcmF0ZVByb3BlcnRpZXNGaWxlVVJMKGZGaWxlSW5mbywgYXR0cmlidXRlVmFsdWUpOwotCQkJCQkJaWYgKGJ1bmRsZVVSTCAhPSBudWxsKSB7Ci0JCQkJCQkJSW5wdXRTdHJlYW0gYnVuZGxlU3RyZWFtID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlidW5kbGVTdHJlYW0gPSBidW5kbGVVUkwub3BlblN0cmVhbSgpOwotCQkJCQkJCQlyZXNvdXJjZUJ1bmRsZSA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGJ1bmRsZVN0cmVhbSk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoYnVuZGxlU3RyZWFtICE9IG51bGwpCi0JCQkJCQkJCQkJYnVuZGxlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHguZ2V0TWVzc2FnZSgpLCB4KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygiY2FzZVNlbnNpdGl2ZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCWlmIChhdHRyaWJ1dGVWYWx1ZS50cmltKCkuZXF1YWxzKCJmYWxzZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJYW5ub3RhdGlvbk1hcC5zZXRDYXNlU2Vuc2l0aXZlKGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0lEX0FOTk9UQVRJT04pKSB7Ci0JCQkJY3VycmVudEFubm90YXRpb24gPSBudWxsOwotCQkJCVN0cmluZyBzcGVjVmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJzcGVjIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoc3BlY1ZhbHVlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudEFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbigpOwotCQkJCQljdXJyZW50QW5ub3RhdGlvbi5zZXRTcGVjKHNwZWNWYWx1ZSk7Ci0JCQkJfQotCQkJCWFubm90YXRpb25NYXAuYWRkQW5ub3RhdGlvbihjdXJyZW50QW5ub3RhdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JRF9QUk9QRVJUWSkpIHsKLQkJCQlpZiAoY3VycmVudEFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQljdXJyZW50UHJvcGVydHlOYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaWYgKGN1cnJlbnRQcm9wZXJ0eU5hbWUgIT0gbnVsbCAmJiBjdXJyZW50QW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCkgewotCQkJCQlpZiAocHJvcGVydHlWYWx1ZS5zdGFydHNXaXRoKCIlIikgJiYgcmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXByb3BlcnR5VmFsdWUgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcocHJvcGVydHlWYWx1ZS5zdWJzdHJpbmcoMSkpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gaWdub3JlIGFueSBleGNlcHRpb24gdGhhdCBvY2N1cnMgd2hpbGUgdHJ5aW5nCi0JCQkJCQkJLy8gdG8gZmV0Y2ggYSByZXNvdXJjZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnRBbm5vdGF0aW9uLnNldFByb3BlcnR5KGN1cnJlbnRQcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0lEX0FOTk9UQVRJT04pKSB7Ci0JCQkJY3VycmVudEFubm90YXRpb24gPSBudWxsOwotCQkJfQotCQkJZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSURfUFJPUEVSVFkpKSB7Ci0JCQkJY3VycmVudFByb3BlcnR5TmFtZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlpZiAoY3VycmVudFByb3BlcnR5TmFtZSAhPSBudWxsICYmIGN1cnJlbnRBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVZhbHVlQnVmZmVyLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTkxZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYXNzb2NpYXRlIG9uZSBvciBtb3JlIGFubm90YXRpb24gZmlsZXMgd2l0aCBhIGdyYW1tYXIKLSAqIGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25GaWxlUmVnaXN0cnkgewotCXByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeSgpIHsKLQkJbmV3IEFubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIodGhpcykucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdCBnZXRBbm5vdGF0aW9uRmlsZXNJbmZvcyhTdHJpbmcgcHVibGljSWQpIHsKLQkJTGlzdCB0aGVMaXN0ID0gKExpc3QpIG1hcC5nZXQocHVibGljSWQpOwotCQlyZXR1cm4gdGhlTGlzdCAhPSBudWxsID8gdGhlTGlzdCA6IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRmlsZShTdHJpbmcgcHVibGljSWQsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgewotCQlMaXN0IGZpbGVJbmZvcyA9IChMaXN0KSBtYXAuZ2V0KHB1YmxpY0lkKTsKLQkJaWYgKGZpbGVJbmZvcyA9PSBudWxsKSB7Ci0JCQlmaWxlSW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQltYXAucHV0KHB1YmxpY0lkLCBmaWxlSW5mb3MpOwotCQl9Ci0JCWZpbGVJbmZvcy5hZGQoZmlsZUluZm8pOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uRmlsZShTdHJpbmcgcHVibGljSWQsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgewotCQlMaXN0IGZpbGVJbmZvcyA9IChMaXN0KSBtYXAuZ2V0KHB1YmxpY0lkKTsKLQkJaWYgKGZpbGVJbmZvcyAhPSBudWxsKSB7Ci0JCQlmaWxlSW5mb3MucmVtb3ZlKGZpbGVJbmZvKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3YzQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gbWFuaWZlc3RzIGFuZCBhZGRzIGVhY2ggc3BlY2lmaWVkIGdyYW1hbXIKLSAqIGFubm90YXRpb24gZmlsZSB3aXRoIHRoZSBBbm5vdGF0aW9uUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJhbm5vdGF0aW9uRmlsZXMiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiYW5ub3RhdGlvbkZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BVQkxJQ19JRCA9ICJwdWJsaWNJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTE9DQVRJT04gPSAibG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFubm90YXRpb25GaWxlUmVnaXN0cnkgYW5ub3RhdGlvbkZpbGVSZWdpc3RyeTsKLQotCXB1YmxpYyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyKEFubm90YXRpb25GaWxlUmVnaXN0cnkgYW5ub3RhdGlvbkZpbGVSZWdpc3RyeSkgewotCQl0aGlzLmFubm90YXRpb25GaWxlUmVnaXN0cnkgPSBhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3aXRoIGFuIGV4dGVuc2lvbiBsaWtlOgotCSAqIAotCSAqIDxleHRlbnNpb24KLQkgKiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsX2ltcGxlbWVudGF0aW9uIj4KLQkgKiA8dXRpbF9pbXBsZW1lbnRhdGlvbiBjbGFzcyA9Ci0JICogY29yZy5lY2xpcHNlLndzdC5iYXNldXRpbC5DTVV0aWxJbXBsZW1lbnRhdGlvbkltcGwgLz4gPC9leHRlbnNpb24+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCVN0cmluZyBwdWJsaWNJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QVUJMSUNfSUQpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xPQ0FUSU9OKTsKLQkJCWlmIChwdWJsaWNJZCAhPSBudWxsICYmIGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgYnVuZGxlSWQgPSBlbGVtZW50LmdldE5hbWVzcGFjZSgpOwotCQkJCQlBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8gPSBuZXcgQW5ub3RhdGlvbkZpbGVJbmZvKGxvY2F0aW9uLCBidW5kbGVJZCk7Ci0JCQkJCWFubm90YXRpb25GaWxlUmVnaXN0cnkuYWRkQW5ub3RhdGlvbkZpbGUocHVibGljSWQsIGZpbGVJbmZvKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gYWRkaW5nIGFubm90YXRpb24gZmlsZSAiICsgbG9jYXRpb24sIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvblV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25VdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTA4OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvblV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25VdGlsaXR5IHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZEFubm90YXRpb25zRm9yR3JhbW1hcihTdHJpbmcgcHVibGljSWQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkgewotCQlMaXN0IGFubm90YXRpb25GaWxlcyA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uRmlsZXNJbmZvcyhwdWJsaWNJZCk7Ci0JCUFubm90YXRpb25NYXAgbWFwID0gKEFubm90YXRpb25NYXApIGNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImFubm90YXRpb25NYXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGFubm90YXRpb25GaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQl0cnkgewotCQkJCQlBbm5vdGF0aW9uRmlsZUluZm8gYW5ub3RhdGlvbkZpbGVJbmZvID0gKEFubm90YXRpb25GaWxlSW5mbykgaS5uZXh0KCk7Ci0JCQkJCUFubm90YXRpb25GaWxlUGFyc2VyIHBhcnNlciA9IG5ldyBBbm5vdGF0aW9uRmlsZVBhcnNlcigpOwotCQkJCQlwYXJzZXIucGFyc2UobWFwLCBhbm5vdGF0aW9uRmlsZUluZm8pOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9SZXNvdXJjZUJ1bmRsZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlZWJhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9SZXNvdXJjZUJ1bmRsZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVIZWxwZXIKLXsKLSAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkksIExvY2FsZSB0YXJnZXRMb2NhbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCSAgLy8gdHJ5IHRvIGxvYWQgYnVuZGxlIGZyb20gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVzb3VyY2VVUkkKLSAgICAvLyB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHJlc291cmNlVVJJIHBvaW50cyB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KLSAgICAgICAgIAotICAgIGludCBpbmRleCA9IHJlc291cmNlVVJJLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgewotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCByZXNvdXJjZVVSSSIpOyAvLyROT04tTkxTLTEkCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIC8vIEJlbG93IHdlIHNldCAncmVzb3VyY2VEaXJlY3RvcnknIHNvIHRoYXQgaXQgZW5kcyB3aXRoIGEgJy8nLgotICAgIC8vIEhlcmUncyBhbiBleGNlcnB0IGZyb20gdGhlIENsYXNzTG9hZGVyIEphdmFkb2MgLi4uCi0gICAgLy8gQW55IFVSTCB0aGF0IGVuZHMgd2l0aCBhICcvJyBpcyBhc3N1bWVkIHRvIHJlZmVyIHRvIGEgZGlyZWN0b3J5LiBPdGhlcndpc2UsIHRoZSBVUkwgaXMgYXNzdW1lZAotICAgIC8vIHRvIHJlZmVyIHRvIGEgSkFSIGZpbGUgd2hpY2ggd2lsbCBiZSBvcGVuZWQgYXMgbmVlZGVkLiAKLSAgICAvLwotICAgIFN0cmluZyByZXNvdXJjZURpcmVjdG9yeSA9IHJlc291cmNlVVJJLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotICAgIFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUgPSByZXNvdXJjZVVSSS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAKLSAgICAvLyBjcmVhdGUgYSBjbGFzcyBsb2FkZXIgd2l0aCBhIGNsYXNzIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIHJlc291cmNlIGJ1bmRsZSdzIGxvY2F0aW9uCi0gICAgLy8gICAgICAgICAKLSAgICBVUkxbXSBjbGFzc3BhdGggPSBuZXcgVVJMWzFdOwotICAgIGNsYXNzcGF0aFswXSA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChyZXNvdXJjZURpcmVjdG9yeSkpOwotCSAgQ2xhc3NMb2FkZXIgcmVzb3VyY2VMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoY2xhc3NwYXRoLCBudWxsKTsgCi0gICAgICAgCi0gIAlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlTmFtZSwgdGFyZ2V0TG9jYWxlLCByZXNvdXJjZUxvYWRlcik7Ci0JfSAgCi0KLSAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkkpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLQkgIHJldHVybiBnZXRSZXNvdXJjZUJ1bmRsZShyZXNvdXJjZVVSSSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWQ4MTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01BbnlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUVsZW1lbnREZWNsYXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi0gCi0KLXB1YmxpYyBjbGFzcyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEluZmVycmVkR3JhbW1hckZhY3RvcnkoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudEltcGwgY21kb2N1bWVudCA9bmV3IENNRG9jdW1lbnRJbXBsKHVyaSk7Ci0gICAgY21kb2N1bWVudC5zZXRJbmZlcnJlZCh0cnVlKTsKLSAgICByZXR1cm4gY21kb2N1bWVudDsKLSAgfSAgICAKLSAKLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKENNRG9jdW1lbnQgY21Eb2N1bWVudCwgRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGlzTG9jYWwpCi0gIHsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnRJbXBsIGNtRG9jdW1lbnRJbXBsID0gKENNRG9jdW1lbnRJbXBsKWNtRG9jdW1lbnQ7Ci0KLSAgICBDTU5hbWVkTm9kZU1hcEltcGwgZWxlbWVudE1hcCA9IGlzTG9jYWwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENNTmFtZWROb2RlTWFwSW1wbCljbURvY3VtZW50SW1wbC5nZXRMb2NhbEVsZW1lbnRQb29sKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENNTmFtZWROb2RlTWFwSW1wbCljbURvY3VtZW50SW1wbC5nZXRFbGVtZW50cygpOwotCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCllbGVtZW50TWFwLmdldE5hbWVkSXRlbShsb2NhbE5hbWUpOwotICAgIGlmIChlZCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUgZWQgIiArIGxvY2FsTmFtZSk7Ci0gICAgICBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoY21Eb2N1bWVudCwgbG9jYWxOYW1lKTsKLSAgICAgIGVkLnNldEluZmVycmVkKHRydWUpOwotICAgICAgZWQuc2V0TG9jYWwoaXNMb2NhbCk7Ci0gICAgICBlZC5zZXRNYXhPY2N1cigxKTsKLSAgICAgIENNR3JvdXBJbXBsIGdyb3VwID0gbmV3IENNR3JvdXBJbXBsKG5ldyBDTU5vZGVMaXN0SW1wbCgpLCBDTUdyb3VwLkNIT0lDRSk7Ci0gICAgICBncm91cC5zZXRJbmZlcnJlZCh0cnVlKTsKLSAgICAgIGdyb3VwLnNldE1pbk9jY3VyKDApOwotICAgICAgZ3JvdXAuc2V0TWF4T2NjdXIoLTEpOwotICAgICAgZWQuc2V0Q29udGVudChncm91cCk7ICAgICAgICAgICAgCi0gICAgICBlbGVtZW50TWFwLnB1dChlZCk7Ci0gICAgfSAKLQotICAgIC8vIGxvb2t1cCBvciBjcmVhdGUgdGhlIGF0dHJpYnV0ZXMKLSAgICAvLwotICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVNYXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgYXR0cmlidXRlTWFwTGVuZ3RoID0gYXR0cmlidXRlTWFwLmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlTWFwTGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQXR0ciBhdHRyID0gKEF0dHIpYXR0cmlidXRlTWFwLml0ZW0oaSk7Ci0gICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCllZC5nZXRBdHRyaWJ1dGVNYXAoKS5nZXROYW1lZEl0ZW0oYXR0ci5nZXROb2RlTmFtZSgpKTsKLSAgICAgIGlmIChhZCA9PSBudWxsKQotICAgICAgeyAgICAgCi0gICAgICAgIC8vIHRvZG8uLi4gdXNlIGFuIGF0dHJpYnV0ZSBwb29sIHRvIGJlIG1vcmUgZWZmaWNpZW50PwotICAgICAgICBhZCA9IG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbChhdHRyLmdldE5vZGVOYW1lKCksIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotICAgICAgICBhZC5zZXRJbmZlcnJlZCh0cnVlKTsKLSAgICAgICAgZWQuZ2V0QXR0cmlidXRlTWFwKCkucHV0KGFkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVkOwotICB9ICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ01Db250ZW50KENNRG9jdW1lbnQgcGFyZW50Q01Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQsIENNRG9jdW1lbnQgY2hpbGRDTURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZEVkLCBib29sZWFuIGlzTG9jYWwsIFN0cmluZyB1cmkpCi0gIHsKLSAgICAvLyBhZGQgZWxlbWVudCB0byB0aGUgcGFyZW50J3MgY29udGVudAotICAgIC8vIGNvbnNpZGVyIGFsbCBjb250ZW50IHRvIGJlIG9mIHRoZSBmb3JtIChBIHwgQiB8IEMpKiAgICAKLSAgICAvLwotICAgIENNR3JvdXBJbXBsIGdyb3VwID0gKENNR3JvdXBJbXBsKXBhcmVudEVkLmdldENvbnRlbnQoKTsKLSAgICBDTU5vZGVMaXN0SW1wbCBncm91cENoaWxkTm9kZUxpc3QgPSAoQ01Ob2RlTGlzdEltcGwpZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgaWYgKHBhcmVudENNRG9jdW1lbnQgPT0gY2hpbGRDTURvY3VtZW50KQotICAgIHsKLSAgICAgIGlmICghZ3JvdXBDaGlsZE5vZGVMaXN0LmNvbnRhaW5zKGNoaWxkRWQpKQotICAgICAgewotICAgICAgICBncm91cENoaWxkTm9kZUxpc3QuYWRkKGNoaWxkRWQpOwotICAgICAgfQotICAgICAgaWYgKGlzTG9jYWwpCi0gICAgICB7Ci0gICAgICAgIENNTmFtZWROb2RlTWFwSW1wbCBsb2NhbEVsZW1lbnRNYXAgPSAoQ01OYW1lZE5vZGVNYXBJbXBsKXBhcmVudEVkLmdldExvY2FsRWxlbWVudHMoKTsKLSAgICAgICAgbG9jYWxFbGVtZW50TWFwLnB1dChjaGlsZEVkKTsKLSAgICAgIH0KLSAgICB9ICAgICAKLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIENNQW55RWxlbWVudCBjbUFueUVsZW1lbnQgPSBsb29rdXBPckNyZWF0ZUNNQW55RWxlbWVudCgoQ01Eb2N1bWVudEltcGwpcGFyZW50Q01Eb2N1bWVudCwgdXJpKTsKLSAgICAgIGlmICghZ3JvdXBDaGlsZE5vZGVMaXN0LmNvbnRhaW5zKGNtQW55RWxlbWVudCkpCi0gICAgICB7Ci0gICAgICAgIGdyb3VwQ2hpbGROb2RlTGlzdC5hZGQoY21BbnlFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9ICAgICAgCi0gIH0gICAKLQotICBwcm90ZWN0ZWQgQ01BbnlFbGVtZW50IGxvb2t1cE9yQ3JlYXRlQ01BbnlFbGVtZW50KENNRG9jdW1lbnRJbXBsIHBhcmVudENNRG9jdW1lbnQsIFN0cmluZyB1cmkpCi0gIHsKLSAgICBDTU5hbWVkTm9kZU1hcEltcGwgYW55RWxlbWVudE1hcCA9IHBhcmVudENNRG9jdW1lbnQuZ2V0QW55RWxlbWVudHMoKTsKLSAgICBDTUFueUVsZW1lbnRJbXBsIGFueUVsZW1lbnQgPSAoQ01BbnlFbGVtZW50SW1wbClhbnlFbGVtZW50TWFwLmdldE5hbWVkSXRlbShDTUFueUVsZW1lbnRJbXBsLmNvbXB1dGVOb2RlTmFtZSh1cmkpKTsKLSAgICBpZiAoYW55RWxlbWVudCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlIGFueUVsZW1lbnQgIiArIHVyaSk7Ci0gICAgICBhbnlFbGVtZW50ID0gbmV3IENNQW55RWxlbWVudEltcGwodXJpKTsKLSAgICAgIGFueUVsZW1lbnQuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgICBhbnlFbGVtZW50TWFwLnB1dChhbnlFbGVtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIGFueUVsZW1lbnQ7Ci0gIH0gCi0gICAgICAKLQotICBwdWJsaWMgdm9pZCBkZWJ1Z1ByaW50KENvbGxlY3Rpb24gY29sbGVjdGlvbikKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpaXRlci5uZXh0KCk7IAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNtRG9jdW1lbnQgKCIgKyBjbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIikgKyIpIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgQ01OYW1lZE5vZGVNYXBJbXBsIGVsZW1lbnRNYXAgPSAoQ01OYW1lZE5vZGVNYXBJbXBsKWNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICAgIGludCBzaXplID0gZWxlbWVudE1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbillbGVtZW50TWFwLml0ZW0oaSk7Ci0gICAgICAgIENNRGVzY3JpcHRpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIEVMRU1FTlQgIiArIGVkLmdldE5vZGVOYW1lKCkgKyAiID0gIiArIGJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbihlZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkOTQ5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb247Ci0KLS8qKgotICogRGVzY3JpYmVzIGFuIGV4dGVuc2lvbiB0byB0aGUgPGNvZGU+bW9kZWxRdWVyeUV4dGVuc2lvbjwvY29kZT4gZXh0ZW5zaW9uCi0gKiBwb2ludC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9BVFRSSUJVVEUgPSAiY29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfQVRUUklCVVRFID0gIm5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQlVURSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgY29udGVudFR5cGVJZDsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotICBwcml2YXRlIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uOwotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGNvbmZpZ3VyYXRpb24gPSBlbGVtZW50OwotICB9Ci0KLSAgcHVibGljIE1vZGVsUXVlcnlFeHRlbnNpb24gY3JlYXRlTW9kZWxRdWVyeUV4dGVuc2lvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpCi0gICAgeyAgCi0gICAgICBleHRlbnNpb24gPSAoTW9kZWxRdWVyeUV4dGVuc2lvbikgY29uZmlndXJhdGlvbi5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTX0FUVFJJQlVURSk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIGV4dGVuc2lvbjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGVJZCgpCi0gIHsKLSAgICBpZiAoY29udGVudFR5cGVJZCA9PSBudWxsKQotICAgIHsKLSAgICAgIGNvbnRlbnRUeXBlSWQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShDT05URU5UX1RZUEVfQVRUUklCVVRFKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbnRlbnRUeXBlSWQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgfQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjMjhmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0gICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbCBpbXBsZW1lbnRzIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyCi17ICAgICAgICAgICAKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeSBtb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkgPSBuZXcgTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgcHVibGljIExpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAKLSAgICBTdHJpbmcgY29udGVudFR5cGVJZCA9IGdldENvbnRlbnRUeXBlSWQoZWxlbWVudCk7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShjbU5vZGUpOwotICAgIFN0cmluZyBuYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmdldEFwcGxpY2FibGVFeHRlbnNpb25zKGNvbnRlbnRUeXBlSWQsIG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uID0gKE1vZGVsUXVlcnlFeHRlbnNpb24paS5uZXh0KCk7Ci0gICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBudWxsOwotICAgICAgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pCi0gICAgICB7ICAKLSAgICAgICAgdmFsdWVzID0gZXh0ZW5zaW9uLmdldEF0dHJpYnV0ZVZhbHVlcyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXMgPSBleHRlbnNpb24uZ2V0RWxlbWVudFZhbHVlcyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAodmFsdWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgICByZXR1cm4gbGlzdDsgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KExpc3QgY21ub2RlcywgRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotCSAgZmlsdGVyQXZhaWxhYmxlRWxlbWVudENvbnRlbnQoY21ub2RlcywgZWxlbWVudCwgZWQsIE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBmaWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChMaXN0IGNtbm9kZXMsIEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucykKLSAgewotICAgIFN0cmluZyBjb250ZW50VHlwZUlkID0gZ2V0Q29udGVudFR5cGVJZChlbGVtZW50KTsKLSAgICBTdHJpbmcgcGFyZW50TmFtZXNwYWNlID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQotCUxpc3QgbW9kZWxRdWVyeUV4dGVuc2lvbnMgPSBtb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkuZ2V0QXBwbGljYWJsZUV4dGVuc2lvbnMoY29udGVudFR5cGVJZCwgcGFyZW50TmFtZXNwYWNlKTsKLQlpZigoaW5jbHVkZU9wdGlvbnMgJiBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMpID4gMCkKLQl7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBjbW5vZGVzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKWoubmV4dCgpOyAgCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UoY21Ob2RlKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIAotICAgICAgICBib29sZWFuIGluY2x1ZGUgPSB0cnVlOwotICAgICAgICBmb3IoaW50IGsgPSAwOyBrIDwgbW9kZWxRdWVyeUV4dGVuc2lvbnMuc2l6ZSgpICYmIGluY2x1ZGU7IGsrKykgewotICAgICAgICB7Ci0gICAgICAgICAgICBNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChNb2RlbFF1ZXJ5RXh0ZW5zaW9uKW1vZGVsUXVlcnlFeHRlbnNpb25zLmdldChrKTsKLSAgICAgICAgICAgIGluY2x1ZGUgPSBleHRlbnNpb24uaXNBcHBsaWNhYmxlQ2hpbGRFbGVtZW50KGVsZW1lbnQsIG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICAgICAgICBpZiAoIWluY2x1ZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY21Ob2RlIGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgICAgai5yZW1vdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gYWRkIE1RRS1wcm92aWRlZCBjb250ZW50Ci0gICAgZm9yKGludCBrID0gMDsgayA8IG1vZGVsUXVlcnlFeHRlbnNpb25zLnNpemUoKTsgaysrKQotICAgIHsKLSAgICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbnNpb24gPSAoTW9kZWxRdWVyeUV4dGVuc2lvbiltb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5nZXQoayk7Ci0gICAgICAgIGNtbm9kZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZXh0ZW5zaW9uLmdldEF2YWlsYWJsZUVsZW1lbnRDb250ZW50KGVsZW1lbnQsIHBhcmVudE5hbWVzcGFjZSwgaW5jbHVkZU9wdGlvbnMpKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROYW1lc3BhY2UoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWNtTm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgICAgICAgICAgCi0gICAgeyAgICAgCi0gICAgICBuYW1lc3BhY2UgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZUlkKE5vZGUgbm9kZSkKLSAgewotICAgIFN0cmluZyBjb250ZW50VHlwZUlkID0gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKSBub2RlOwotICAgICAgY29udGVudFR5cGVJZCA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLSAgICB9ICAgCi0gICAgcmV0dXJuIGNvbnRlbnRUeXBlSWQ7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjZmNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJtb2RlbFF1ZXJ5RXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAibW9kZWxRdWVyeUV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBMaXN0IGRlc2NyaXB0b3JzOwotCi0gIHB1YmxpYyBMaXN0IGdldEFwcGxpY2FibGVFeHRlbnNpb25zKFN0cmluZyBjb250ZW50VHlwZUlkLCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChjb250ZW50VHlwZUlkICE9IG51bGwpCi0gICAgewotICAgICAgZW5zdXJlRXh0ZW5zaW9uc0xvYWRlZCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKE1vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlSWQuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0Q29udGVudFR5cGVJZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmdldE5hbWVzcGFjZSgpID09IG51bGwgfHwgIGRlc2NyaXB0b3IuZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbnNpb24gPSBkZXNjcmlwdG9yLmNyZWF0ZU1vZGVsUXVlcnlFeHRlbnNpb24oKTsKLSAgICAgICAgICAgICAgbGlzdC5hZGQoZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIGNyZWF0aW5nIG1vZGVsIHF1ZXJ5IGV4dGVuc2lvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIC8qCi0gICAqICBUT0RPIDogY29uc2lkZXIgcHJvdmlkaW5nIGEgbm9uLXBsdWdpbiBtZWFucyBhZGQvcmVtb3ZlIGV4dGVuc2lvbnMKLSAgICogICAKLSAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uKQotICB7ICAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUV4dGVuc2lvbihNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVwcmVjYXRlZCBleHRlbnNpb24pCi0gIHsKLSAgfSovCi0KLSAgLyoqCi0gICAqIFJlYWRzIGFsbCBleHRlbnNpb25zLgotICAgKiA8cD4KLSAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBpbiBvcmRlciB0byByZWxvYWQgZnJvbSBhIGNoYW5nZWQKLSAgICogZXh0ZW5zaW9uIHJlZ2lzdHJ5LgotICAgKiA8L3A+Ci0gICAqLwotICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlbG9hZEV4dGVuc2lvbnMoKQotICB7Ci0gICAgZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIGJ1bmRsZWlkID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQgICAgICAKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKGJ1bmRsZWlkLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvcihlbGVtZW50c1tpXSk7Ci0gICAgICBkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZXMgdGhlIGV4dGVuc2lvbnMgaGF2ZSBiZWVuIGxvYWRlZCBhdCBsZWFzdCBvbmNlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGVuc3VyZUV4dGVuc2lvbnNMb2FkZWQoKQotICB7Ci0gICAgaWYgKGRlc2NyaXB0b3JzID09IG51bGwpCi0gICAgewotICAgICAgcmVsb2FkRXh0ZW5zaW9ucygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01EYXRhVHlwZVZhbHVlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTURhdGFUeXBlVmFsdWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5ZmE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTURhdGFUeXBlVmFsdWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLQotCi1wdWJsaWMgY2xhc3MgQ01EYXRhVHlwZVZhbHVlSGVscGVyCi17Ci0gIHByb3RlY3RlZCBpbnQgaWRDb3VudCA9IDA7Ci0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgICAKLSAgICBpZiAoaXNYU0lUeXBlKGFkKSkgICAgICAgICAKLSAgICB7ICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gZ2V0UXVhbGlmaWVkWFNJVHlwZXMoYWQsIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgIHZhbHVlID0gbGlzdC5zaXplKCkgPiAwID8gKFN0cmluZylsaXN0LmdldCgwKSA6IG51bGw7Ci0gICAgfSAKLQotICAgIC8vIHNoYW1lbGVzcyBoYWNrCi0gICAgLy8KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoYWQuZ2V0QXR0ck5hbWUoKS5lcXVhbHMoInhtbDpsYW5nIikpICAgICAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gIkVOIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBhZC5nZXRBdHRyVHlwZSgpOwotICAgICAgaWYgKGRhdGFUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gZ2V0VmFsdWUoZGF0YVR5cGUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoQ01EYXRhVHlwZSBkYXRhVHlwZSkKLSAgewotICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgdmFsdWUgPSBkYXRhVHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGRhdGFUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLSAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgdmFsdWUgPSB2YWx1ZXNbMF07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgdmFsdWUgPSBkYXRhVHlwZS5nZW5lcmF0ZUluc3RhbmNlVmFsdWUoKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0KLSAgICAvLyBIZXJlIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIGhhbmRsZSBEVEQncyBJRCByZWxhdGVkIGRhdGF0eXBlcy4KLSAgICAvLyBUaGVzZSB2YWx1ZXMgbXVzdCBiZSBnZW5lcmF0ZWQvdmFsaWRhdGUgYnkgY29uc2lkZXJpbmcgdGhlIGVudGlyZSB4bWwgZmlsZQotICAgIC8vIHNvIHdlIGNhbid0IHJlbHkgb24gdGhlICdnZW5lcmF0ZUluc3RhbmNlVmFsdWUnIG1ldGhvZC4KLSAgICAvLwotICAgIC8vIHRvZG8uLi4gZmluZCBhIG5pY2VyIHdheSB0byBoYW5kbGUgdGhpcyAgICAKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZGF0YVR5cGVOYW1lID0gZGF0YVR5cGUuZ2V0RGF0YVR5cGVOYW1lKCk7Ci0gICAgICBpZiAoZGF0YVR5cGVOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChkYXRhVHlwZU5hbWUuZXF1YWxzKCJJRCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9ICJpZHZhbHVlIiArIGlkQ291bnQrKzsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGRhdGFUeXBlTmFtZS5lcXVhbHMoIklEUkVGIikgfHwgZGF0YVR5cGVOYW1lLmVxdWFscygiSURSRUZTIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSAiaWR2YWx1ZTAiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0gCi0gICAgICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRW1wdHlWYWx1ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKQotICB7ICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gYWQuZ2V0QXR0clR5cGUoKTsKLSAgICBpZiAoZGF0YVR5cGUgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSAoU3RyaW5nKWRhdGFUeXBlLmdldFByb3BlcnR5KCJpc1ZhbGlkRW1wdHlWYWx1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAocHJvcGVydHlWYWx1ZSAhPSBudWxsICYmIHByb3BlcnR5VmFsdWUuZXF1YWxzKCJmYWxzZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgfQotICAgIH0gICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1hTSVR5cGUoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgeyAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKGFkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ0eXBlIikpICAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpYWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZU5hbWUgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAobmFtZXNwYWNlTmFtZSAhPSBudWxsICYmIG5hbWVzcGFjZU5hbWUuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgIAotCi0gIHB1YmxpYyBMaXN0IGdldFF1YWxpZmllZFhTSVR5cGVzKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQsIE5hbWVzcGFjZVRhYmxlIHRhYmxlKQotICB7ICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IHhzaVR5cGVzID0gKExpc3QpYWQuZ2V0UHJvcGVydHkoIlhTSVR5cGVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoeHNpVHlwZXMgIT0gbnVsbCAmJiB4c2lUeXBlcy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzaVR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7IAotICAgICAgICBTdHJpbmcgdXJpUXVhbGlmaWVkTmFtZSA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZ1tdIGNvbXBvbmVudHMgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VVJJUXVhbGlmaWVkTmFtZUNvbXBvbmVudHModXJpUXVhbGlmaWVkTmFtZSk7ICAKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHRhYmxlLmdldFByZWZpeEZvclVSSShjb21wb25lbnRzWzBdICE9IG51bGwgPyBjb21wb25lbnRzWzBdIDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgIjoiICsgY29tcG9uZW50c1sxXSA6ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzWzFdOwotICAgICAgICBsaXN0LmFkZCh0eXBlTmFtZSk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL0NNVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWU1MzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL0NNVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTVZpc2l0b3I7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ01WYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdFbGVtZW50Q29udGVudENvbXBhcmF0b3Igc3RyaW5nQ29udGVudENvbXBhcml0b3IgPSBuZXcgU3RyaW5nRWxlbWVudENvbnRlbnRDb21wYXJhdG9yKCk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgZ3JhcGhOb2RlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIEdyYXBoTm9kZQotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBHcmFwaE5vZGUKLSAgewotICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Rlcm1pbmFsOwotICAgIHB1YmxpYyBWZWN0b3IgYXJjTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyBHcmFwaE5vZGUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRBcmMoQXJjIGFyYykKLSAgICB7Ci0gICAgICBhcmNMaXN0LmFkZEVsZW1lbnQoYXJjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIltHcmFwaE5vZGUgIiArIG5hbWUgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIEFyYwotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBBcmMKLSAgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBFQVQgICA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVZfSU4gID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRfTkVYVCA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElOSyAgICAgPSA2OwotCi0gICAgcHVibGljIGludCBraW5kOwotICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKLSAgICBwdWJsaWMgR3JhcGhOb2RlIG5vZGU7Ci0gICAgcHVibGljIENNTm9kZSBjbU5vZGU7Ci0KLSAgICBwdWJsaWMgQXJjKGludCBraW5kLCBHcmFwaE5vZGUgbm9kZSwgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICB0aGlzKGtpbmQsICIiLCBub2RlLCBjbU5vZGUpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIEFyYyhpbnQga2luZCwgU3RyaW5nIG5hbWUsIEdyYXBoTm9kZSBub2RlLCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgICAgIHRoaXMuY21Ob2RlID0gY21Ob2RlOwotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIEdyYXBoR2VuZXJhdG9yCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEdyYXBoR2VuZXJhdG9yIGV4dGVuZHMgQ01WaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgaW50IGluZGVudDsKLSAgICBwdWJsaWMgaW50IGNvdW50OwotICAgIHB1YmxpYyBHcmFwaE5vZGUgc3RhcnRHcmFwaE5vZGU7Ci0gICAgcHVibGljIENvbnRleHQgY29udGV4dDsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ29udGV4dAotICAgIHsKLSAgICAgIEdyYXBoTm9kZSBmcm9tOwotICAgICAgR3JhcGhOb2RlIHRvOwotCi0gICAgICBDb250ZXh0KEdyYXBoTm9kZSBmcm9tLCBHcmFwaE5vZGUgdG8pCi0gICAgICB7Ci0gICAgICAgIHRoaXMuZnJvbSA9IGZyb207Ci0gICAgICAgIHRoaXMudG8gPSB0bzsKLSAgICAgIH0KLQotICAgICAgR3JhcGhOb2RlIGdldExhc3RHcmFwaE5vZGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gKHRvICE9IG51bGwpID8gdG8gOiBmcm9tOwotICAgICAgfQotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIEdyYXBoR2VuZXJhdG9yKCkKLSAgICB7Ci0gICAgICBzdGFydEdyYXBoTm9kZSA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLSAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dChzdGFydEdyYXBoTm9kZSwgbnVsbCk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUdyYXBoKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICAgIHsKLSAgICAgIGludCBjb250ZW50VHlwZSA9IGVkLmdldENvbnRlbnRUeXBlKCk7Ci0KLSAgICAgIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fAotICAgICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0Q01Ob2RlKGVkLmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgICAvLyBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEuLi4gbm8gZ3JhcGggcmVxdWlyZWQKLSAgICAgIC8vIENNRWxlbWVudERlY2xhcmF0aW9uLkFOWS4uLiBubyBncmFwaCByZXF1aXJlZAotICAgICAgY29udGV4dC5nZXRMYXN0R3JhcGhOb2RlKCkuaXNUZXJtaW5hbCA9IHRydWU7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEdyYXBoTm9kZU5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiAibiIgKyBjb3VudCsrOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgR3JhcGhOb2RlIGdldFN0YXJ0R3JhcGhOb2RlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3RhcnRHcmFwaE5vZGU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgICAgICAgICAgICAgICByZXBlYXQKLSAgICAgKiAgICAgICAgICAgICArLS0tLSMtLS0tLSsKLSAgICAgKiAgICAgICAgICAgICB8ICAgICAgICAgIHwKLSAgICAgKiAgICAgICAgICAgICB2ICAgICAgICAgIHwKLSAgICAgKiAgcHJldiAtLSMtPiBpbiAtLSd4Jy0+IG91dCAtLSMtPiBuZXh0Ci0gICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgKiAgKy0tLS0tLS0tLS0tLS0tLS0jLS0tLS0tLS0tLS0tLS0rCi0gICAgICogICAgICAgICAgICAgICAgb3B0aW9uYWwKLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFyY3MoR3JhcGhOb2RlIGluLCBHcmFwaE5vZGUgb3V0LCBDTUNvbnRlbnQgY21Db250ZW50KQotICAgIHsKLSAgICAgIGNyZWF0ZUFyY3MoaW4sIG91dCwgY21Db250ZW50LCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXJjcyhHcmFwaE5vZGUgaW4sIEdyYXBoTm9kZSBvdXQsIENNQ29udGVudCBjbUNvbnRlbnQsIGJvb2xlYW4gaXNBbGxHcm91cCkKLSAgICB7Ci0gICAgICAvL3ByaW50bG4oIitjcmVhdGVBcmNzKCkgIiArIGVkLmdldERlc2NyaXB0aW9uKCkgKyAiICIgKyBlZC5nZXRNaW5PY2N1cigpKTsKLSAgICAgIEdyYXBoTm9kZSBwcmV2ID0gY29udGV4dC5mcm9tOwotICAgICAgR3JhcGhOb2RlIG5leHQgPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0KLSAgICAgIHByZXYuYWRkQXJjKG5ldyBBcmMoQXJjLlBSRVZfSU4sIGluLCBjbUNvbnRlbnQpKTsKLSAgICAgIG91dC5hZGRBcmMobmV3IEFyYyhBcmMuT1VUX05FWFQsIG5leHQsIGNtQ29udGVudCkpOwotCi0gICAgICBpZiAoY29udGV4dC50byAhPSBudWxsKQotICAgICAgewotICAgICAgICBuZXh0LmFkZEFyYyhuZXcgQXJjKEFyYy5MSU5LLCBjb250ZXh0LnRvLCBjbUNvbnRlbnQpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29udGV4dC5mcm9tID0gbmV4dDsKLSAgICAgIH0KLQotICAgICAgaWYgKGNtQ29udGVudC5nZXRNaW5PY2N1cigpID09IDApCi0gICAgICB7Ci0gICAgICAgIC8vIHRvZG8uLi4gc2hvdWxkIHdlIHNlZSBpZiBhbiBvcHRpb25hbCBhcmMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZD8KLSAgICAgICAgcHJldi5hZGRBcmMobmV3IEFyYyhBcmMuT1BUSU9OQUwsIG5leHQsIGNtQ29udGVudCkpOwotICAgICAgfQotCi0gICAgICBpZiAoY21Db250ZW50LmdldE1heE9jY3VyKCkgPT0gLTEgfHwgY21Db250ZW50LmdldE1heE9jY3VyKCkgPiAxIHx8IGlzQWxsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIG91dC5hZGRBcmMobmV3IEFyYyhBcmMuUkVQRUFULCBpbiwgY21Db250ZW50KSk7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNR3JvdXAoQ01Hcm91cCBncm91cCkKLSAgICB7Ci0gICAgICBDb250ZXh0IHByZXZDb250ZXh0ID0gY29udGV4dDsKLSAgICAgIEdyYXBoTm9kZSBpbiA9IG5ldyBHcmFwaE5vZGUoIigiICsgZ2V0R3JhcGhOb2RlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgR3JhcGhOb2RlIG91dCA9IG5ldyBHcmFwaE5vZGUoIikiICsgZ2V0R3JhcGhOb2RlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBpbnQgZ3JvdXBPcGVyYXRvciA9IGdyb3VwLmdldE9wZXJhdG9yKCk7Ci0gICAgICBpZiAoZ3JvdXBPcGVyYXRvciA9PSBDTUdyb3VwLlNFUVVFTkNFKQotICAgICAgewotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQoaW4sIG51bGwpOwotICAgICAgICBzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotICAgICAgICBjb250ZXh0LmZyb20uYWRkQXJjKG5ldyBBcmMoQXJjLkxJTkssIG91dCwgZ3JvdXApKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGdyb3VwT3BlcmF0b3IgPT0gQ01Hcm91cC5DSE9JQ0UgfHwKLSAgICAgICAgICAgICAgIGdyb3VwT3BlcmF0b3IgPT0gQ01Hcm91cC5BTEwpCi0gICAgICB7Ci0gICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dChpbiwgb3V0KTsKLSAgICAgICAgc3VwZXIudmlzaXRDTUdyb3VwKGdyb3VwKTsKLSAgICAgIH0KLQotICAgICAgY29udGV4dCA9IHByZXZDb250ZXh0OwotICAgICAgY3JlYXRlQXJjcyhpbiwgb3V0LCBncm91cCwgZ3JvdXBPcGVyYXRvciA9PSBDTUdyb3VwLkFMTCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICAgIHsKLSAgICAgIEdyYXBoTm9kZSBpbiA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLSAgICAgIEdyYXBoTm9kZSBvdXQgPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0gICAgICBjcmVhdGVBcmNzKGluLCBvdXQsIGVkKTsKLSAgICAgIGluLmFkZEFyYyhuZXcgQXJjKEFyYy5FTEVNRU5ULCBlZC5nZXRFbGVtZW50TmFtZSgpLCBvdXQsIGVkKSk7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gICAgewotICAgICAgR3JhcGhOb2RlIGluID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgR3JhcGhOb2RlIG91dCA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLSAgICAgIGNyZWF0ZUFyY3MoaW4sIG91dCwgYW55RWxlbWVudCk7Ci0gICAgICBpbi5hZGRBcmMobmV3IEFyYyhBcmMuRUxFTUVOVCwgImFueSIsIG91dCwgYW55RWxlbWVudCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgLy8gdG9kby4uIGltcGxlbWVudCBjYWNoZSBzdHJhdGVneSBob29rLCBoYW5kbGUgbmFtZSBzcGFjZXMsIGxvY2FscyBldGMuCi0gIC8vCi0gIHB1YmxpYyBHcmFwaE5vZGUgbG9va3VwT3JDcmVhdGVHcmFwaChDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgT2JqZWN0IGtleSA9IGVsZW1lbnQ7Ci0gICAgR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKWdyYXBoTm9kZVRhYmxlLmdldChrZXkpOwotICAgIGlmIChub2RlID09IG51bGwpCi0gICAgewotICAgICAgbm9kZSA9IGNyZWF0ZUdyYXBoKGVsZW1lbnQpOwotICAgICAgZ3JhcGhOb2RlVGFibGUucHV0KGtleSwgbm9kZSk7Ci0gICAgfQotICAgIHJldHVybiBub2RlOwotICB9Ci0KLSAgcHVibGljIEdyYXBoTm9kZSBjcmVhdGVHcmFwaChDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgR3JhcGhHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IEdyYXBoR2VuZXJhdG9yKCk7Ci0gICAgZ2VuZXJhdG9yLmdlbmVyYXRlR3JhcGgoZWxlbWVudCk7Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5nZXRTdGFydEdyYXBoTm9kZSgpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBwcmludEdyYXBoKEdyYXBoTm9kZSBub2RlLCBWZWN0b3IgbmFtZWRBcmNMaXN0LCBWZWN0b3IgdW5hbWVkQXJjTGlzdCwgaW50IGluZGVudCkKLSAgewotICAgIC8vU3RyaW5nIGRlY29yYXRpb24gPSBub2RlLmlzVGVybWluYWwgPyAiICoiIDogIiI7Ci0gICAgLy9wcmludGxuSW5kZW50ZWQoaW5kZW50LCAiR3JhcGhOb2RlOiIgKyBub2RlLm5hbWUgKyBkZWNvcmF0aW9uKTsKLQotICAgIGluZGVudCArPSAyOwotICAgIGZvciAoRW51bWVyYXRpb24gZSA9IG5vZGUuYXJjTGlzdC5lbGVtZW50cygpIDsgZS5oYXNNb3JlRWxlbWVudHMoKSA7KQotICAgIHsKLSAgICAgIEFyYyBhcmMgPSAoQXJjKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIC8vYm9vbGVhbiB2aXNpdCA9IGZhbHNlOwotICAgICAgLy9wcmludGxuSW5kZW50ZWQoaW5kZW50LCAiQXJjOiIgKyBhcmMubmFtZSArICIgKCIgKyBhcmMua2luZCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICB7Ci0gICAgICAgIC8vdGFibGUuYWRkKGN1cnJlbnRHcmFtbWFyT2JqZWN0LCBhcmMuZ3JhbW1hck9iamVjdCk7Ci0gICAgICAgIGlmICghbmFtZWRBcmNMaXN0LmNvbnRhaW5zKGFyYykpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lZEFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgdW5hbWVkQXJjTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICBwcmludEdyYXBoKGFyYy5ub2RlLCBuYW1lZEFyY0xpc3QsIHVuYW1lZEFyY0xpc3QsIGluZGVudCArIDIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICghdW5hbWVkQXJjTGlzdC5jb250YWlucyhhcmMpKQotICAgICAgICB7Ci0gICAgICAgICAgdW5hbWVkQXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICBwcmludEdyYXBoKGFyYy5ub2RlLCBuYW1lZEFyY0xpc3QsIHVuYW1lZEFyY0xpc3QsIGluZGVudCArIDIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRHcmFwaChHcmFwaE5vZGUgbm9kZSkKLSAgewotICAgIHByaW50R3JhcGgobm9kZSwgbmV3IFZlY3RvcigpLCBuZXcgVmVjdG9yKCksIDApOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUVsZW1lbnRMaXN0KEVsZW1lbnRMaXN0IGxpc3QsIEdyYXBoTm9kZSBub2RlLCBFbGVtZW50Q29udGVudENvbXBhcmF0b3IgY29tcGFyYXRvciwgUmVzdWx0IHJlc3VsdCwgYm9vbGVhbiBsb29wRmxhZykKLSAgewotICAgIC8vcHJpbnRsbigiK3ZhbGlkYXRlRWxlbWVudExpc3QgIiArIG5vZGUgKyAiICIgKyBsaXN0KTsKLSAgICBpZiAobGlzdCA9PSBudWxsICYmIG5vZGUuaXNUZXJtaW5hbCkKLSAgICB7Ci0gICAgICByZXN1bHQuaXNWYWxpZCA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub2RlLmFyY0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgICAgYm9vbGVhbiB0cmF2ZXJzZUFyYyA9IGZhbHNlOwotICAgICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobGlzdCAhPSBudWxsICYmIGNvbXBhcmF0b3IubWF0Y2hlcyhsaXN0LmhlYWQsIGFyYy5jbU5vZGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxvb3BGbGFnID0gZmFsc2U7Ci0gICAgICAgICAgICB0cmF2ZXJzZUFyYyA9IHRydWU7Ci0gICAgICAgICAgICBsaXN0ID0gbGlzdC50YWlsOyAvLyBpbmNyZW1lbnQgb3VyIHBvc2l0aW9uIGluIHRoZSBsaXN0Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5SRVBFQVQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWxvb3BGbGFnKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyYXZlcnNlQXJjID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbG9vcEZsYWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRyYXZlcnNlQXJjID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0cmF2ZXJzZUFyYykKLSAgICAgICAgewotICAgICAgICAgIC8vIHRlc3QgdG8gc2VlIGlmIHdlIGNhbiBwdXNoIHRoaXMgYXJjIGR1ZSB0byBmYWNldCBjb25zdHJhaW50cwotICAgICAgICAgIC8vCi0gICAgICAgICAgaWYgKHJlc3VsdC5jYW5QdXNoKGFyYykpCi0gICAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHNlZSBpZiB0aGlzIGFyYyBsZWFkcyB0byBhIGNvcnJlY3Qgc29sdXRpb24gICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQucHVzaChhcmMpOwotICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50TGlzdChsaXN0LCBhcmMubm9kZSwgY29tcGFyYXRvciwgcmVzdWx0LCBsb29wRmxhZyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0LmlzVmFsaWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LnBvcChhcmMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIEVsZW1lbnRMaXN0IGNyZWF0ZUVsZW1lbnRMaXN0KGludCBjb250ZW50VHlwZSwgTGlzdCB2LCBFbGVtZW50Q29udGVudENvbXBhcmF0b3IgY29tcGFyYXRvciwgUmVzdWx0IHJlc3VsdCkKLSAgewotICAgIEVsZW1lbnRMaXN0IGZpcnN0ID0gbnVsbDsKLSAgICBFbGVtZW50TGlzdCBwcmV2ID0gbnVsbDsKLQotICAgIGludCBzaXplID0gdi5zaXplKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSB2LmdldChpKTsKLSAgICAgIGlmIChvICE9IG51bGwgJiYgIWNvbXBhcmF0b3IuaXNJZ25vcmFibGUobykpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb21wYXJhdG9yLmlzRWxlbWVudChvKSkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnRMaXN0IGxpc3QgPSBuZXcgRWxlbWVudExpc3QoKTsKLSAgICAgICAgICBsaXN0LmhlYWQgPSBvOwotCi0gICAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2LnRhaWwgPSBsaXN0OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZmlyc3QgPSBsaXN0OwotICAgICAgICAgIH0KLSAgICAgICAgICBwcmV2ID0gbGlzdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JJbmRleCA9IGk7Ci0gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZSA9ICJFbGVtZW50IGNhbiBub3QgaW5jbHVkZSBQQ0RBVEEgY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmlyc3Q7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGVsZW1lbnRDb250ZW50LCBFbGVtZW50Q29udGVudENvbXBhcmF0b3IgY29tcGFyYXRvciwgUmVzdWx0IHJlc3VsdCkKLSAgewotICAgIGludCBjb250ZW50VHlwZSA9IGVkLmdldENvbnRlbnRUeXBlKCk7Ci0KLSAgICBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgfHwKLSAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLSAgICB7Ci0gICAgICBFbGVtZW50TGlzdCBlbGVtZW50TGlzdCA9IGNyZWF0ZUVsZW1lbnRMaXN0KGNvbnRlbnRUeXBlLCBlbGVtZW50Q29udGVudCwgY29tcGFyYXRvciwgcmVzdWx0KTsKLSAgICAgIGlmIChyZXN1bHQuaXNWYWxpZCA9PSB0cnVlKQotICAgICAgeyAgCi0gICAgICAgIC8vIGRlZmVjdCAyMjYyMTMgLi4uIGVsZW1lbnRzIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgY2hpbGRyZW4gd2lsbCBjYXVzZSB0aGUgcmVjdXJzaW9uIGJhc2VkIHZhbGlkYXRpb24KLSAgICAgICAgLy8gYWxnb3JpdGhtIHRvIHN0YWNrIG92ZXJmbG93IC4uLiBhcyBhIHF1aWNrIGZpeCBhc3N1bWUgYW55IGVsZW1lbnQgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBjaGlsZHJlbiBpcyB2YWxpZCAgICAgICAgCi0gICAgICAgIGlmIChlbGVtZW50Q29udGVudC5zaXplKCkgPCA1MDApCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIGlzR3JhcGhWYWxpZGF0aW9uTmVlZGVkID0gIShlbGVtZW50TGlzdCA9PSBudWxsICYmIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEKTsKLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAvLyBleGxpY2l0eSBoYW5kbGUgJ0FsbCcgZ3JvdXBzCi0gICAgICAgICAgLy8KLSAgICAgICAgICBDTUNvbnRlbnQgY29udGVudCA9IGVkLmdldENvbnRlbnQoKTsKLSAgICAgICAgICBpZiAoY29udGVudC5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDTUdyb3VwIGdyb3VwID0gKENNR3JvdXApY29udGVudDsKLSAgICAgICAgICAgIGlmIChncm91cC5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc0dyYXBoVmFsaWRhdGlvbk5lZWRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICB2YWxpZGF0QWxsR3JvdXBDb250ZW50KGVsZW1lbnRDb250ZW50LCBjb21wYXJhdG9yLCBncm91cCwgcmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICB9ICAKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoaXNHcmFwaFZhbGlkYXRpb25OZWVkZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhlIGVsZW1lbnRMaXN0IHVzaW5nIGEgZ3JhcGgKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgR3JhcGhOb2RlIG5vZGUgPSBsb29rdXBPckNyZWF0ZUdyYXBoKGVkKTsKLSAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudExpc3QoZWxlbWVudExpc3QsIG5vZGUsIGNvbXBhcmF0b3IsIHJlc3VsdCwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpCi0gICAgewotICAgICAgaW50IHNpemUgPSBlbGVtZW50Q29udGVudC5zaXplKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBlbGVtZW50Q29udGVudC5nZXQoaSk7Ci0gICAgICAgIGlmIChjb21wYXJhdG9yLmlzRWxlbWVudChvKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5pc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgcmVzdWx0LmVycm9ySW5kZXggPSBpOwotICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2UgPSAiRWxlbWVudCBtYXkgb25seSBpbmNsdWRlIFBDREFUQSBjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotICAgIHsKLSAgICAgIGludCBzaXplID0gZWxlbWVudENvbnRlbnQuc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gZWxlbWVudENvbnRlbnQuZ2V0KGkpOwotICAgICAgICBpZiAoIWNvbXBhcmF0b3IuaXNJZ25vcmFibGUobykpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIHJlc3VsdC5lcnJvckluZGV4ID0gaTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlID0gIkVsZW1lbnQgbWF5IG5vdCBjb250YWluIFBDREFUQSBvciBFbGVtZW50IGNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy9lbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpCi0gICAgLy8gewotICAgIC8vICAgYXNzdW1lIGVsZW1lbnRDb250ZW50IHdpbGwgYWx3YXlzIGJlIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotICAgIC8vIH0KLSAgfQotICAgIAotICBzdGF0aWMgY2xhc3MgSXRlbUNvdW50Ci0gIHsKLSAgICBpbnQgY291bnQgPSAwOyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRBbGxHcm91cENvbnRlbnQoTGlzdCBlbGVtZW50Q29udGVudCwgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGNvbXBhcmF0b3IsIENNR3JvdXAgYWxsR3JvdXAsIFJlc3VsdCByZXN1bHQpIAotICB7Ci0gICAgYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLSAgICBib29sZWFuIGlzUGFydGlhbGx5VmFsaWQgPSB0cnVlOwotICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBDTU5vZGVMaXN0IGxpc3QgPSBhbGxHcm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgZm9yIChpbnQgaiA9IGxpc3QuZ2V0TGVuZ3RoKCkgLSAxOyBqID49IDA7IGotLSkKLSAgICB7Ci0gICAgICBDTU5vZGUgbm9kZSA9IGxpc3QuaXRlbShqKTsgICAgICAKLSAgICAgIGlmIChtYXAuZ2V0KG5vZGUpID09IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgbWFwLnB1dChub2RlLCBuZXcgSXRlbUNvdW50KCkpOwotICAgICAgfSAgCi0gICAgfSAgICAKLSAgICBpbnQgdmFsaWRpdGlvbkNvdW50ID0gMDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50Q29udGVudC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgdmFsaWRpdGlvbkNvdW50KyspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsgICAgICAgIAotICAgICAgaWYgKGNvbXBhcmF0b3IuaXNFbGVtZW50KG8pKQotICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgIC8vIHRlc3QgdG8gc2VlIGlmIHRoZSBlbGVtZW50IGlzIGxpc3RlZCBpbiB0aGUgYWxsIGdyb3VwCi0gICAgICAgIC8vCi0gICAgICAgIENNTm9kZSBtYXRjaGluZ0NNTm9kZSA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGogPSBsaXN0LmdldExlbmd0aCgpIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBDTU5vZGUgbm9kZSA9IGxpc3QuaXRlbShqKTsKLSAgICAgICAgICBpZiAoY29tcGFyYXRvci5tYXRjaGVzKG8sIG5vZGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoaW5nQ01Ob2RlID0gbm9kZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gICAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKG1hdGNoaW5nQ01Ob2RlID09IG51bGwpCi0gICAgICAgIHsgICAgIAotICAgICAgICAgIGlzUGFydGlhbGx5VmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICAvLyB0ZXN0IHRvIHNlZSB0aGF0IHRoZSBlbGVtZW50IG9jY3VycyBvbmx5IG9uY2UKLSAgICAgICAgICAvLwotICAgICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KW1hcC5nZXQobWF0Y2hpbmdDTU5vZGUpOwotICAgICAgICAgIGlmIChpdGVtQ291bnQgIT0gbnVsbCkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIGlmIChpdGVtQ291bnQuY291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGFsbG93IHRvbyBtYW55IGVsZW1lbnRzIQotICAgICAgICAgICAgICAvLyB3ZSBjb25zaWRlciAnbm90IGVub3VnaCcgdG8gYmUgcGFydGlhbGx5IHZhbGlkLi4uIGJ1dCBub3QgJ3RvbyBtYW55JwotICAgICAgICAgICAgICBpc1BhcnRpYWxseVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGl0ZW1Db3VudC5jb3VudCsrOwotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0KLSAgICBpZiAoaXNWYWxpZCkKLSAgICB7ICAKLSAgICAgIGZvciAoaW50IGogPSBsaXN0LmdldExlbmd0aCgpIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBub2RlID0gbGlzdC5pdGVtKGopOyAgICAgIAotICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgICB7ICAKLSAgICAgICAgICBDTUNvbnRlbnQgY29udGVudCA9IChDTUNvbnRlbnQpbm9kZTsKLSAgICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudCltYXAuZ2V0KG5vZGUpOwotLy8gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiY29udGVudCAiICsgY29udGVudC5nZXROb2RlTmFtZSgpICsgIiAiICsgY29udGVudC5nZXRNaW5PY2N1cigpKTsKLSAgICAgICAgICBpZiAoaXRlbUNvdW50LmNvdW50IDwgY29udGVudC5nZXRNaW5PY2N1cigpKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgJiYgaXNQYXJ0aWFsbHlWYWxpZCkKLSAgICB7Ci0gICAgICAoKEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0KXJlc3VsdCkuc2V0UGFydGlhbFZhbGlkYXRpb25Db3VudCh2YWxpZGl0aW9uQ291bnQpOwotICAgIH0gIAotICAgIHJlc3VsdC5pc1ZhbGlkID0gaXNWYWxpZDsKLSAgfSAgCi0gIAotICAKLSAgcHVibGljIHZvaWQgZ2V0T3JpZ2luQXJyYXkoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgZWxlbWVudENvbnRlbnQsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBFbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCByZXN1bHQpCi0gIHsKLSAgICBDTU5vZGVbXSBjbU5vZGVBcnJheSA9IG51bGw7Ci0gICAgdmFsaWRhdGUoZWQsIGVsZW1lbnRDb250ZW50LCBjb21wYXJhdG9yLCByZXN1bHQpOwotICAgIGlmIChyZXN1bHQuaXNWYWxpZCkKLSAgICB7Ci0gICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLSAgICAgIGludCBzaXplID0gZWxlbWVudENvbnRlbnQuc2l6ZSgpOwotICAgICAgY21Ob2RlQXJyYXkgPSBuZXcgQ01Ob2RlW3NpemVdOwotICAgICAgVmVjdG9yIG9yaWdpbkxpc3QgPSByZXN1bHQuZ2V0RWxlbWVudE9yaWdpbkxpc3QoKTsKLSAgICAgIGludCBvcmlnaW5MaXN0U2l6ZSA9IG9yaWdpbkxpc3Quc2l6ZSgpOyAKLSAgICAgIGludCBvcmlnaW5MaXN0SW5kZXggPSAwOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gZWxlbWVudENvbnRlbnQuZ2V0KGkpOwotICAgICAgICBpZiAoY29tcGFyYXRvci5pc0VsZW1lbnQobykpCi0gICAgICAgIHsgICAgIAotICAgICAgICAgIGlmIChvcmlnaW5MaXN0SW5kZXggPCBvcmlnaW5MaXN0U2l6ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjbU5vZGVBcnJheVtpXSA9IChDTU5vZGUpb3JpZ2luTGlzdC5nZXQob3JpZ2luTGlzdEluZGV4KTsKLSAgICAgICAgICAgIG9yaWdpbkxpc3RJbmRleCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb21wYXJhdG9yLmlzUENEYXRhKG8pKQotICAgICAgICB7Ci0gICAgICAgICAgY21Ob2RlQXJyYXlbaV0gPSBkYXRhVHlwZTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIHRoZSBDTU5vZGUgYXQgdGhpcyBpbmRleCBpcyBudWxsCi0gICAgICB9Ci0gICAgICByZXN1bHQuc2V0T3JpZ2luQXJyYXkoY21Ob2RlQXJyYXkpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNvbGxlY3ROYW1lZEFyY3MoR3JhcGhOb2RlIG5vZGUsIExpc3QgbmFtZWRBcmNMaXN0LCBpbnQgaW5kZW50KQotICB7Ci0gICAgLy9wcmludGxuSW5kZW50ZWQoaW5kZW50LCAiR3JhcGhOb2RlOiIgKyBub2RlLm5hbWUgKyBkZWNvcmF0aW9uKTsKLSAgICBpbmRlbnQgKz0gMjsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub2RlLmFyY0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCkgOykKLSAgICB7Ci0gICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIkFyYzoiICsgYXJjLm5hbWUgKyAiICgiICsgYXJjLmtpbmQgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgeyAKLSAgICAgICAgaWYgKCFuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVkQXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICBjb2xsZWN0TmFtZWRBcmNzKGFyYy5ub2RlLCBuYW1lZEFyY0xpc3QsIGluZGVudCArIDIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhcmMua2luZCAhPSBBcmMuUkVQRUFUICYmIGFyYy5raW5kICE9IEFyYy5PUFRJT05BTCkKLSAgICAgIHsKLSAgICAgICAgY29sbGVjdE5hbWVkQXJjcyhhcmMubm9kZSwgbmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIAotICBwcml2YXRlIExpc3QgZ2V0TWF0Y2hpbmdBcmNzKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsKLSAgICBMaXN0IGFyY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGxvb2t1cE9yQ3JlYXRlR3JhcGgoZWQpOwotICAgIGlmIChlbGVtZW50TmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIGhlcmUgd2UgYWRkIHRoZSAncm9vdCcgYXJjCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncmFwaE5vZGUuYXJjTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKSA7KQotICAgICAgewotICAgICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5QUkVWX0lOKQotICAgICAgICB7Ci0gICAgICAgICAgYXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7IAotICAgICAgTGlzdCBuYW1lZEFyY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBjb2xsZWN0TmFtZWRBcmNzKGdyYXBoTm9kZSwgbmFtZWRBcmNzLCAwKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVkQXJjcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgICAgaWYgKGFyYy5jbU5vZGUgIT0gbnVsbCAmJiBlbGVtZW50TmFtZS5lcXVhbHMoYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgYXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIGFyY0xpc3Q7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSB2b2lkIGNvbGxlY3ROZXh0U2libGluZ3MoR3JhcGhOb2RlIG5vZGUsIExpc3QgbmV4dFNpYmxpbmdMaXN0LCBMaXN0IG5hbWVkQXJjTGlzdCwgTGlzdCB1bmFtZWRBcmNMaXN0LCBpbnQgaW5kZW50KQotICB7Ci0gICAgLy9wcmludGxuSW5kZW50ZWQoaW5kZW50LCAiR3JhcGhOb2RlOiIgKyBub2RlLm5hbWUgKyBkZWNvcmF0aW9uKTsKLSAgICBpbmRlbnQgKz0gMjsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub2RlLmFyY0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsgICAgICAgCi0gICAgICAgIGlmICghbmFtZWRBcmNMaXN0LmNvbnRhaW5zKGFyYykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXJjLmNtTm9kZSAhPSBudWxsKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgbmV4dFNpYmxpbmdMaXN0LmFkZChhcmMuY21Ob2RlKTsKLSAgICAgICAgICAgIGlmIChhcmMuY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gfHwKLSAgICAgICAgICAgICAgICBhcmMuY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFOWV9FTEVNRU5UKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIG5hbWVkQXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICAgICAgQ01Db250ZW50IGNtTm9kZSA9IChDTUNvbnRlbnQpYXJjLmNtTm9kZTsgCi0gICAgICAgICAgICAgIGlmIChjbU5vZGUuZ2V0TWluT2NjdXIoKSA9PSAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5hbWVkQXJjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBjb2xsZWN0TmV4dFNpYmxpbmdzKGFyYy5ub2RlLCBuZXh0U2libGluZ0xpc3QsIG5hbWVkQXJjTGlzdCwgdW5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIXVuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIHVuYW1lZEFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgY29sbGVjdE5leHRTaWJsaW5ncyhhcmMubm9kZSwgbmV4dFNpYmxpbmdMaXN0LCBuYW1lZEFyY0xpc3QsIHVuYW1lZEFyY0xpc3QsIGluZGVudCArIDIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gIH0KLSAgICAKLSAgcHVibGljIENNTm9kZVtdIGdldE5leHRTaWJsaW5ncyhDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgTGlzdCBhcmNMaXN0ID0gZ2V0TWF0Y2hpbmdBcmNzKGVkLCBlbGVtZW50TmFtZSk7Ci0gICAgTGlzdCBuZXh0U2libGluZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gYXJjTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgY29sbGVjdE5leHRTaWJsaW5ncyhhcmMubm9kZSwgbmV4dFNpYmxpbmdMaXN0LCBuZXcgQXJyYXlMaXN0KCksIG5ldyBBcnJheUxpc3QoKSwgMCk7ICAgICAgCi0gICAgfSAgCi0gICAgQ01Ob2RlW10gcmVzdWx0ID0gbmV3IENNTm9kZVtuZXh0U2libGluZ0xpc3Quc2l6ZSgpXTsKLSAgICBuZXh0U2libGluZ0xpc3QudG9BcnJheShyZXN1bHQpOyAgICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnQoImdldE5leHRTaWJsaW5nKCIgK2VsZW1lbnROYW1lICsgIikiKTsKLSAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotICAgIC8vewotICAgIC8vICBTeXN0ZW0ub3V0LnByaW50KCJbIiArIHJlc3VsdFtpXS5nZXROb2RlTmFtZSgpICsgIl0iKTsKLSAgICAvL30gIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXN1bHQKLSAgewotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotICAgIHB1YmxpYyBpbnQgZXJyb3JJbmRleCA9IC0xOwotICAgIHB1YmxpYyBTdHJpbmcgZXJyb3JNZXNzYWdlOwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVwZWF0VHJhdmVyc2VkOyAvLyBkZXRlY3RzIGlmIGEgcmVwZWF0IGhhcyBiZWVuIHRyYXZlcnNlZAotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuUHVzaChBcmMgYXJjKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwdXNoKEFyYyBhcmMpCi0gICAgewotICAgICAgLy8gb3ZlcmlkZSB0aGlzIG1ldGhvZCB0byByZWNvcmQgdHJhdmVyc2VkIG5vZGVzCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHBvcChBcmMgYXJjKQotICAgIHsKLSAgICAgIC8vIG92ZXJpZGUgdGhpcyBtZXRob2QgdG8gcmVjb3JkIHRyYXZlcnNlZCBub2RlcwotICAgIH0KLSAgICBwdWJsaWMgQ01Ob2RlW10gZ2V0T3JpZ2luQXJyYXkoKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBFbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCBleHRlbmRzIFJlc3VsdAotICB7ICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBhY3RpdmVJdGVtQ291bnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBMaXN0IGluYWN0aXZlSXRlbUNvdW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgCi0gICAgcHJvdGVjdGVkIFZlY3RvciBlbGVtZW50T3JpZ2luU3RhY2sgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJvdGVjdGVkIENNTm9kZVtdIG9yaWdpbkFycmF5ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgaW50IHBhcnRpYWxWYWxpZGF0aW9uQ291bnQgPSAwOwotCi0gICAgCi0gICAgLy8gdGhpcyBtZXRob2QgaXMgdXNlZCB0byBzdXBwb3J0IGZhY2V0IGNvdW50cwotICAgIC8vCi0gICAgcHVibGljIGJvb2xlYW4gY2FuUHVzaChBcmMgYXJjKQotICAgIHsgICAgIAotICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLlJFUEVBVCkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBpZiAoYXJjLmNtTm9kZSBpbnN0YW5jZW9mIENNQ29udGVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDTUNvbnRlbnQgY29udGVudCA9IChDTUNvbnRlbnQpYXJjLmNtTm9kZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIGRvICdzcGVjaWFsJyBmYWNldCBjaGVja2luZyBpZiB0aGUgbWF4T2NjdXJzIGlzID4gMQotICAgICAgICAgICAgLy8gdmFsdWVzIG9mICcwJyBhbmQgJy0xJyAodW5ib3VuZGVkKSB3b3JrICdmb3IgZnJlZScgd2l0aG91dCBhbnkgc3BlY2lhbCBjaGVja2luZwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGlmIChjb250ZW50LmdldE1heE9jY3VyKCkgPiAxKQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KWFjdGl2ZUl0ZW1Db3VudExpc3QuZ2V0KGFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAvLyBoZXJlIHdlIG5lZWQgdG8gY29tcHV0ZSBpZiB3ZSBjYW4gZG8gYW5vdGhlciByZXBlYXQKLSAgICAgICAgICAgICAgLy8gaWYgd2UgaW5jcmVhc2UgdGhlIHJlcGVhdCBjb3VudCBieSAnMScgd2lsbCB0aGlzIHZpb2xhdGUgdGhlIG1heE9jY3VycwotICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICBpZiAoaXRlbUNvdW50LmNvdW50ICsgMSA+PSBjb250ZW50LmdldE1heE9jY3VyKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNhblB1c2ggUkVQRUFUICgiICsgaXRlbUNvdW50LmNvdW50ICsgIikiICsgY29udGVudC5nZXROb2RlTmFtZSgpICsgIiByZXN1bHQ9ICIgKyByZXN1bHQpOyAgICAgICAgICAgIAotICAgICAgICAgIH0gCi0gICAgICAgIH0gICAgICAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICAvL1N5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHB1c2goQXJjIGFyYykKLSAgICB7Ci0gICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wdXNoKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGVsZW1lbnRPcmlnaW5TdGFjay5hZGQoYXJjLmNtTm9kZSk7Ci0gICAgICAgIHBhcnRpYWxWYWxpZGF0aW9uQ291bnQgPSBNYXRoLm1heChlbGVtZW50T3JpZ2luU3RhY2suc2l6ZSgpLCBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5QUkVWX0lOKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcHVzaCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBhY3RpdmVJdGVtQ291bnRMaXN0LmFkZChuZXcgSXRlbUNvdW50KCkpOyAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLk9VVF9ORVhUKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wdXNoKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSArICJbIiArIGFyYyArICJdIik7Ci0gICAgICAgIGludCBzaXplID0gYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCk7Ci0gICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KWFjdGl2ZUl0ZW1Db3VudExpc3QuZ2V0KHNpemUgLSAxKTsKLSAgICAgICAgYWN0aXZlSXRlbUNvdW50TGlzdC5yZW1vdmUoc2l6ZSAtIDEpOwotICAgICAgICBpbmFjdGl2ZUl0ZW1Db3VudExpc3QuYWRkKGl0ZW1Db3VudCk7IAotICAgICAgfSAgICAgIAotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlJFUEVBVCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXB1c2goIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpYWN0aXZlSXRlbUNvdW50TGlzdC5nZXQoYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCkgLSAxKTsKLSAgICAgICAgaXRlbUNvdW50LmNvdW50Kys7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJyZXBlYXQoIiArIGl0ZW1Db3VudC5jb3VudCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICB9ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3AoQXJjIGFyYykKLSAgICB7Ci0gICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wb3AoIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgaW50IHNpemUgPSBlbGVtZW50T3JpZ2luU3RhY2suc2l6ZSgpOwotICAgICAgICBlbGVtZW50T3JpZ2luU3RhY2sucmVtb3ZlKHNpemUgLSAxKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5QUkVWX0lOKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcG9wKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGFjdGl2ZUl0ZW1Db3VudExpc3QucmVtb3ZlKGFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpIC0gMSk7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5PVVRfTkVYVCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXBvcCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBpbnQgc2l6ZSA9IGluYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCk7Ci0gICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KWluYWN0aXZlSXRlbUNvdW50TGlzdC5nZXQoc2l6ZSAtIDEpOwotICAgICAgICBpbmFjdGl2ZUl0ZW1Db3VudExpc3QucmVtb3ZlKHNpemUgLSAxKTsKLSAgICAgICAgYWN0aXZlSXRlbUNvdW50TGlzdC5hZGQoaXRlbUNvdW50KTsgICAgIAotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUkVQRUFUKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcG9wKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KWFjdGl2ZUl0ZW1Db3VudExpc3QuZ2V0KGFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgIGl0ZW1Db3VudC5jb3VudC0tOwotICAgICAgfSAgICAgCi0gICAgfQotCi0gICAgcHVibGljIFZlY3RvciBnZXRFbGVtZW50T3JpZ2luTGlzdCgpCi0gICAgewotICAgICAgcmV0dXJuIGVsZW1lbnRPcmlnaW5TdGFjazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ01Ob2RlW10gZ2V0T3JpZ2luQXJyYXkoKQotICAgIHsKLSAgICAgIHJldHVybiBvcmlnaW5BcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPcmlnaW5BcnJheShDTU5vZGVbXSBvcmlnaW5BcnJheSkKLSAgICB7Ci0gICAgICB0aGlzLm9yaWdpbkFycmF5ID0gb3JpZ2luQXJyYXk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0UGFydGlhbFZhbGlkYXRpb25Db3VudCgpCi0gICAgewotICAgICAgcmV0dXJuIHBhcnRpYWxWYWxpZGF0aW9uQ291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFydGlhbFZhbGlkYXRpb25Db3VudChpbnQgcGFydGlhbFZhbGlkYXRpb25Db3VudCkKLSAgICB7Ci0gICAgICB0aGlzLnBhcnRpYWxWYWxpZGF0aW9uQ291bnQgPSBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50OwotICAgIH0KLSAgfSAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhdGhSZWNvcmRpbmdSZXN1bHQgZXh0ZW5kcyBSZXN1bHQKLSAgewotICAgIHByb3RlY3RlZCBWZWN0b3IgYXJjTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyB2b2lkIHB1c2goQXJjIGFyYykKLSAgICB7Ci0gICAgICBhcmNMaXN0LmFkZChhcmMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcChBcmMgYXJjKQotICAgIHsKLSAgICAgIGludCBzaXplID0gYXJjTGlzdC5zaXplKCk7Ci0gICAgICBhcmNMaXN0LnJlbW92ZShzaXplIC0gMSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QXJjTGlzdCgpCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFyY0xpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEFyYyBhcmMgPSAoQXJjKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoYXJjKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIE1hdGNoTW9kZWxOb2RlIGdldE1hdGNoTW9kZWwoKQotICAgIHsKLSAgICAgIE1hdGNoTW9kZWxOb2RlQnVpbGRlciBidWlsZGVyID0gbmV3IE1hdGNoTW9kZWxOb2RlQnVpbGRlcihhcmNMaXN0KTsKLSAgICAgIGJ1aWxkZXIuYnVpbGRNYXRjaE1vZGVsKCk7Ci0gICAgICByZXR1cm4gYnVpbGRlci5nZXRSb290KCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hdGNoTW9kZWxOb2RlCi0gIHsKLSAgICBwdWJsaWMgQ01Ob2RlIGNtTm9kZTsKLSAgICBwdWJsaWMgTGlzdCBjaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKLSAgICBwdWJsaWMgT2JqZWN0IGRhdGE7Ci0KLSAgICBwdWJsaWMgTWF0Y2hNb2RlbE5vZGUoTWF0Y2hNb2RlbE5vZGUgcGFyZW50LCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIHRoaXMuY21Ob2RlID0gY21Ob2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50TW9kZWwoaW50IGluZGVudCkKLSAgICB7Ci0gICAgICAvL1N0cmluZyBjbU5vZGVOYW1lID0gY21Ob2RlICE9IG51bGwgPyBjbU5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsKLSAgICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIk1hdGNoTW9kZWxOb2RlIDogIiArIGNtTm9kZU5hbWUpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBNYXRjaE1vZGVsTm9kZSBjaGlsZCA9IChNYXRjaE1vZGVsTm9kZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGNoaWxkLnByaW50TW9kZWwoaW5kZW50ICsgMik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXRjaE1vZGVsTm9kZUJ1aWxkZXIKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGFyY0xpc3Q7Ci0gICAgcHJvdGVjdGVkIExpc3Qgc3RhY2sgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJvdGVjdGVkIE1hdGNoTW9kZWxOb2RlIHJvb3Q7Ci0gICAgcHJvdGVjdGVkIE1hdGNoTW9kZWxOb2RlIGN1cnJlbnQ7Ci0KLSAgICBwdWJsaWMgTWF0Y2hNb2RlbE5vZGVCdWlsZGVyKExpc3QgYXJjTGlzdCkKLSAgICB7Ci0gICAgICB0aGlzLmFyY0xpc3QgPSBhcmNMaXN0OwotICAgICAgcm9vdCA9IG5ldyBNYXRjaE1vZGVsTm9kZShudWxsLCBudWxsKTsKLSAgICAgIHB1c2gocm9vdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHVzaChNYXRjaE1vZGVsTm9kZSBub2RlKQotICAgIHsKLSAgICAgIGN1cnJlbnQgPSBub2RlOwotICAgICAgc3RhY2suYWRkKG5vZGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcCgpCi0gICAgewotICAgICAgaW50IHNpemUgPSBzdGFjay5zaXplKCk7Ci0gICAgICBzdGFjay5yZW1vdmUoc2l6ZSAtIDEpOwotICAgICAgY3VycmVudCA9IChNYXRjaE1vZGVsTm9kZSlzdGFjay5nZXQoc2l6ZSAtIDIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ01Hcm91cChDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIHJldHVybiBjbU5vZGUgIT0gbnVsbCAmJiBjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuR1JPVVA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYnVpbGRNYXRjaE1vZGVsKCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXJjTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQXJjIGFyYyA9IChBcmMpaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIGN1cnJlbnQuY2hpbGRyZW4uYWRkKG5ldyBNYXRjaE1vZGVsTm9kZShjdXJyZW50LCBhcmMuY21Ob2RlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlBSRVZfSU4pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNDTUdyb3VwKGFyYy5jbU5vZGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1hdGNoTW9kZWxOb2RlIG5ld01vZGVsTm9kZSA9IG5ldyBNYXRjaE1vZGVsTm9kZShjdXJyZW50LCBhcmMuY21Ob2RlKTsKLSAgICAgICAgICAgIGN1cnJlbnQuY2hpbGRyZW4uYWRkKG5ld01vZGVsTm9kZSk7Ci0gICAgICAgICAgICBwdXNoKG5ld01vZGVsTm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5PVVRfTkVYVCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0NNR3JvdXAoYXJjLmNtTm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5SRVBFQVQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNDTUdyb3VwKGFyYy5jbU5vZGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvcCgpOwotICAgICAgICAgICAgTWF0Y2hNb2RlbE5vZGUgbmV3TW9kZWxOb2RlID0gbmV3IE1hdGNoTW9kZWxOb2RlKGN1cnJlbnQsIGFyYy5jbU5vZGUpOwotICAgICAgICAgICAgY3VycmVudC5jaGlsZHJlbi5hZGQobmV3TW9kZWxOb2RlKTsKLSAgICAgICAgICAgIHB1c2gobmV3TW9kZWxOb2RlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWF0Y2hNb2RlbE5vZGUgZ2V0Um9vdCgpCi0gICAgewotICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yCi0gIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lnbm9yYWJsZShPYmplY3Qgbyk7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNQQ0RhdGEoT2JqZWN0IG8pOwotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudChPYmplY3Qgbyk7Ci0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbywgQ01Ob2RlIGNtTm9kZSk7Ci0gIH0KLQotICAvKioKLSAgICogQSBsaW5rZWQgbGlzdAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBFbGVtZW50TGlzdAotICB7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBoZWFkOwotICAgIHByb3RlY3RlZCBFbGVtZW50TGlzdCB0YWlsOwotCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50TGlzdCBjcmVhdGUoTGlzdCB2KQotICAgIHsKLSAgICAgIEVsZW1lbnRMaXN0IGZpcnN0ID0gbnVsbDsKLSAgICAgIEVsZW1lbnRMaXN0IHByZXYgPSBudWxsOwotCi0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50TGlzdCBsaXN0ID0gbmV3IEVsZW1lbnRMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5oZWFkID0gbzsKLQotICAgICAgICAgIGlmIChwcmV2ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJldi50YWlsID0gbGlzdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0ID0gbGlzdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHJldiA9IGxpc3Q7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmaXJzdDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHJpbmcgPSAiWyIgKyBoZWFkICsgIl0sIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgIGlmICh0YWlsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHN0cmluZyArPSB0YWlsLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBzdHJpbmc7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0cmluZ0VsZW1lbnRDb250ZW50Q29tcGFyYXRvcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdFbGVtZW50Q29udGVudENvbXBhcmF0b3IgaW1wbGVtZW50cyBFbGVtZW50Q29udGVudENvbXBhcmF0b3IKLSAgewotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlKE9iamVjdCBvKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHJpbmcgPSBvLnRvU3RyaW5nKCk7Ci0gICAgICByZXR1cm4gc3RyaW5nLnN0YXJ0c1dpdGgoIiEiKSB8fCBzdHJpbmcuc3RhcnRzV2l0aCgiPyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BDRGF0YShPYmplY3QgbykKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyaW5nID0gby50b1N0cmluZygpOwotICAgICAgcmV0dXJuIHN0cmluZy5zdGFydHNXaXRoKCInIikgfHwgc3RyaW5nLnN0YXJ0c1dpdGgoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudChPYmplY3QgbykKLSAgICB7Ci0gICAgICByZXR1cm4gIWlzSWdub3JhYmxlKG8pICYmICFpc1BDRGF0YShvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBvLCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICBpZiAoY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgICB7IAotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtTm9kZTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBvLnRvU3RyaW5nKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IG5hbWUuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOyAgICAgICAgCi0KLSAgICAgICAgLy8gVE9ETy4uLiBoZXJlJ3Mgd2UgY29uc2lkZXIgc3Vic3RpdHV0aW9uIGdyb3Vwcy4uLiByZXZpc2l0IHRvIHNlZSBpZiB0aGlzIHNob3VsZCBiZSBtb3ZlZCBpbnRvIHZhbGlkYXRvciBjb2RlCi0gICAgICAgIGlmICghcmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgQ01Ob2RlTGlzdCBjbU5vZGVMaXN0ID0gKENNTm9kZUxpc3QpZWxlbWVudC5nZXRQcm9wZXJ0eSgiU3Vic3RpdHV0aW9uR3JvdXAiKTsgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGNtTm9kZUxpc3QgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY21Ob2RlTGlzdExlbmd0aCA9IGNtTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAoY21Ob2RlTGlzdExlbmd0aCA+IDEpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY21Ob2RlTGlzdExlbmd0aDsgaSsrKQotICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gYWx0ZXJuYXRpdmVDTUVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbU5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFsdE5hbWUgPSBhbHRlcm5hdGl2ZUNNRWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGFsdE5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAgCi0gICAgICB9ICAgCi0gICAgICBlbHNlIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQU5ZX0VMRU1FTlQpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIHN0cmluZyA9IG8udG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKHN0cmluZy5lcXVhbHMoIioiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBDTUFueUVsZW1lbnQgYW55RWxlbWVudCA9IChDTUFueUVsZW1lbnQpY21Ob2RlOwotICAgICAgICAgIFN0cmluZyBhbnlFbGVtZW50VVJJID0gYW55RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsgICAgCi0gICAgICAgICAgaWYgKGFueUVsZW1lbnRVUkkgIT0gbnVsbCkKLSAgICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChhbnlFbGVtZW50VVJJLmVxdWFscygiIyNhbnkiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGFueUVsZW1lbnRVUkkuZXF1YWxzKCIjI290aGVyIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsgICAgIAotICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOyAgICAKLSAgICAgICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpYW55RWxlbWVudC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBleGNsdWRlZFVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKGV4Y2x1ZGVkVVJJICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjaWZpZWRVUkkgPSBnZXRVUklGb3JDb250ZW50U3BlY2lmaWNhdGlvbihzdHJpbmcpOwotICAgICAgICAgICAgICAgICAgaWYgKHNwZWNpZmllZFVSSSAhPSBudWxsICYmIGV4Y2x1ZGVkVVJJLmVxdWFscyhzcGVjaWZpZWRVUkkpKQotICAgICAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIGVsc2UgaWYgKGFueUVsZW1lbnRVUkkuZXF1YWxzKCIjI3RhcmdldE5hbWVzcGFjZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWFueUVsZW1lbnQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFN0cmluZyBzcGVjaWZpZWRVUkkgPSBnZXRVUklGb3JDb250ZW50U3BlY2lmaWNhdGlvbihzdHJpbmcpOwotICAgICAgICAgICAgICAgIGlmIChzcGVjaWZpZWRVUkkgIT0gbnVsbCAmJiAhdGFyZ2V0TmFtZXNwYWNlVVJJLmVxdWFscyhzcGVjaWZpZWRVUkkpKQotICAgICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlICAKLSAgICAgICAgICAgIHsgICAgICAgIAotICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICBTdHJpbmcgc3BlY2lmaWVkVVJJID0gZ2V0VVJJRm9yQ29udGVudFNwZWNpZmljYXRpb24oc3RyaW5nKTsKLSAgICAgICAgICAgICAgaWYgKHNwZWNpZmllZFVSSSAhPSBudWxsICYmICFhbnlFbGVtZW50VVJJLmVxdWFscyhzcGVjaWZpZWRVUkkpKQotICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICB9ICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgICAgZWxzZSAKLSAgICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAKLSAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VVJJRm9yQ29udGVudFNwZWNpZmljYXRpb24oU3RyaW5nIHNwZWNpZmljYXRpb24pCi0gICAgeyAgICAgICAgICAgCi0gICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGludCBpbmRleCA9IHNwZWNpZmljYXRpb24uaW5kZXhPZigiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBzcGVjaWZpY2F0aW9uLnN1YnN0cmluZygxLCBpbmRleCk7Ci0gICAgICB9IAotICAgICAgcmV0dXJuIHJlc3VsdDsgIAotICAgIH0KLSAgfSAgICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBjcmVhdGVTdHJpbmdMaXN0KFN0cmluZyBhcmdbXSwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gc3RhcnRJbmRleDsgaSA8IGFyZy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB2LmFkZChhcmdbaV0pOwotICAgIH0KLSAgICByZXR1cm4gdjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvRE9NVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9ET01WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExMWEyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9ET01WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIEEgc3BlY2lhbCBDTVZhbGlkYXRvciB0aGF0IGtub3dzIGFib3V0IERPTXMKLSAqLwotcHVibGljIGNsYXNzIERPTVZhbGlkYXRvciBleHRlbmRzIENNVmFsaWRhdG9yCi17ICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKE5vZGUgbm9kZSkKLSAgeyAgIAotICAgIHJldHVybiBET01OYW1lc3BhY2VIZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKG5vZGUpOwotICAgIC8vcmV0dXJuIG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gIH0KLSAgICAgICAgICAKLQotICAvLwotICAvLyBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2shIQotICAvLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZhbGxiYWNrTmFtZXBhY2VVUkkoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAKLSAgICBTdHJpbmcgZmFsbGJhY2tOYW1lcGFjZVVSSSA9IG51bGw7Ci0gICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgZmFsbGJhY2tOYW1lcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICB9ICAKLSAgICByZXR1cm4gZmFsbGJhY2tOYW1lcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGUgdGhlIEVsZW1lbnQncyBOb2RlTGlzdCBhcyBhIExpc3Qgb2Ygc3RyaW5ncyB0aGF0IHRoZSB2YWxpZGF0b3IgcmVjb2duaXplcwotICAgKi8KLSAgcHVibGljIExpc3QgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGJvb2xlYW4gaXNOYW1lc3BhY2VBd2FyZSA9IGlzTmFtZXNwYWNlQXdhcmUoZWQpOwotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOyAgICAgICAgIAotICAgIGZvciAoTm9kZSBjaGlsZE5vZGUgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGROb2RlICE9IG51bGw7IGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpKQotICAgIHsgCi0gICAgICB2LmFkZChjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbihjaGlsZE5vZGUsIGlzTmFtZXNwYWNlQXdhcmUsIGlzTmFtZXNwYWNlQXdhcmUgPyBnZXRGYWxsYmFja05hbWVwYWNlVVJJKGVkKSA6IG51bGwpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLQotCi0gIHB1YmxpYyBMaXN0IGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChMaXN0IG5vZGVMaXN0LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgeyAgICAgICAgICAgICAKLSAgICBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUgPSBpc05hbWVzcGFjZUF3YXJlKGVkKTsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAgICAKLSAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub2RlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IChOb2RlKWkubmV4dCgpOwotICAgICAgdi5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb24obm9kZSwgaXNOYW1lc3BhY2VBd2FyZSwgZ2V0RmFsbGJhY2tOYW1lcGFjZVVSSShlZCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbmNvZGUgdGhlIE5vZGUgYXMgYSBzdHJpbmcgdGhhdCB0aGUgdmFsaWRhdG9yIHJlY29nbml6ZXMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb24oTm9kZSBub2RlLCBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUsIFN0cmluZyBmYWxsYmFja05hbWVwYWNlVVJJKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICIhIjsgLy8kTk9OLU5MUy0xJAotICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotICAgICAgeyAgCi0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsgIAotICAgICAgICBpZiAobm9kZU5hbWUuc3RhcnRzV2l0aCgianNwOiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsgIAotICAgICAgICAgIHJlc3VsdCA9ICIhIjsgLy8gdHJlYXQgaXQgYXMgYSBjb21tZW50IHNvIHRoYXQgaXQncyBpZ25vcmVkIGJ5IHRoZSB2YWxpZGF0b3IgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc05hbWVzcGFjZUF3YXJlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShub2RlTmFtZSk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gZ2V0TmFtZXNwYWNlVVJJKG5vZGUpOwotICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSAiWyIgKyB1cmkgKyAiXSIgKyByZXN1bHQ7ICAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIGVsc2UgaWYgKGZhbGxiYWNrTmFtZXBhY2VVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gIlsiICsgZmFsbGJhY2tOYW1lcGFjZVVSSSArICJdIiArIHJlc3VsdDsgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9ICAKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbm9kZU5hbWU7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLnByaW50bG4oInJlc3VsdCAiICsgcmVzdWx0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIj8iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICIhIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSAiXCIiICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIFN0cmluZyBkYXRhID0gKChUZXh0KW5vZGUpLmdldERhdGEoKTsKLSAgICAgICAgLy8gaGVyZSB3ZSB0ZXN0IHRvIHNlZSBpZiB0aGUgdGVzdCBub2RlIGlzICdpZ25vcmFibGUnCi0gICAgICAgIGlmIChkYXRhICE9IG51bGwgJiYgZGF0YS50cmltKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gIlwiIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICIhIjsgLy8gdG9kby4uLiB1c2UgYW5vdGhlciBzeW1ib2w/IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgTGlzdCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBzd2l0Y2ggKGNtTm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOgotICAgICAgeyAgICAgICAgIAotICAgICAgICBsaXN0LmFkZChjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkZvckNNRWxlbWVudERlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbiljbU5vZGUpKTsgICAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENNTm9kZS5EQVRBX1RZUEUgOgotICAgICAgewotICAgICAgICBsaXN0LmFkZCgiXCIiICsgY21Ob2RlLmdldE5vZGVOYW1lKCkgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuR1JPVVAgOgotICAgICAgewotICAgICAgICBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3RGb3JDTUdyb3VwKChDTUdyb3VwKWNtTm9kZSwgbGlzdCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuQU5ZX0VMRU1FTlQgOgotICAgICAgewotICAgICAgICBsaXN0LmFkZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdCA6Ci0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKCIhIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgICAgCi0KLSAgLyoqCi0gICAqIAotICAgKi8gICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uRm9yQ01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgIAotICAgIENNRG9jdW1lbnQgZG9jdW1lbnQgPSAoQ01Eb2N1bWVudCllZC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIHVyaSA9IGRvY3VtZW50ICE9IG51bGwgPyAoU3RyaW5nKWRvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIikgOiBudWxsOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIHN0cmluZyA9IGVkLmdldE5vZGVOYW1lKCk7Ci0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAKLSAgICAgIHN0cmluZyA9ICJbIiArIHVyaSArICJdIiArIHN0cmluZzsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIHJldHVybiBzdHJpbmc7Ci0gIH0KLSAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0Rm9yQ01Hcm91cChDTUdyb3VwIGdyb3VwLCBMaXN0IGxpc3QpCi0gIHsgICAgICAgICAKLSAgICBDTUdyb3VwQ29udGVudFZpc2l0b3IgdmlzaXRvciA9IG5ldyBDTUdyb3VwQ29udGVudFZpc2l0b3IoZ3JvdXAsIGxpc3QpOwotICAgIHZpc2l0b3IudmlzaXRDTU5vZGUoZ3JvdXApOwotICB9IAotICAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIENNR3JvdXBDb250ZW50VmlzaXRvciBleHRlbmRzIENNVmlzaXRvcgotICB7ICAKLSAgICBwcm90ZWN0ZWQgQ01Hcm91cCByb290OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotICAgIHB1YmxpYyBDTUdyb3VwQ29udGVudFZpc2l0b3IoQ01Hcm91cCByb290LCBMaXN0IGxpc3QpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMucm9vdCA9IHJvb3Q7ICAgICAgICAKLSAgICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIGlmIChlZC5nZXRNaW5PY2N1cigpID4gMCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25Gb3JDTUVsZW1lbnREZWNsYXJhdGlvbihlZCkpOwotICAgICAgfQotICAgIH0gICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgICB7ICAgCi0gICAgICBsaXN0LmFkZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKGdyb3VwID09IHJvb3QgfHwgZ3JvdXAuZ2V0TWluT2NjdXIoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGludCBvcCA9IGdyb3VwLmdldE9wZXJhdG9yKCk7Ci0gICAgICAgIGlmIChvcCA9PSBDTUdyb3VwLlNFUVVFTkNFKQotICAgICAgICB7Ci0gICAgICAgICAgc3VwZXIudmlzaXRDTUdyb3VwKGdyb3VwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvcCA9PSBDTUdyb3VwLkNIT0lDRSkKLSAgICAgICAgewotICAgICAgICAgIENNTm9kZUxpc3Qgbm9kZUxpc3QgPSBncm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2aXNpdENNTm9kZShub2RlTGlzdC5pdGVtKDApKTsKLSAgICAgICAgICB9ICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7IAotICAgIHJldHVybiBlZCAhPSBudWxsID8gZWQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9pc05hbWVTcGFjZUF3YXJlIikgIT0gbnVsbCA6IGZhbHNlOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBFbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCByZXN1bHQgPSBuZXcgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQoKTsKLSAgICBnZXRPcmlnaW5BcnJheShlZCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGVsZW1lbnQsIGVkKSwgc3RyaW5nQ29udGVudENvbXBhcml0b3IsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdC5nZXRPcmlnaW5BcnJheSgpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIE1hdGNoTW9kZWxOb2RlIGdldE1hdGNoTW9kZWwoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE1hdGNoTW9kZWxOb2RlIG1hdGNoTW9kZWxOb2RlID0gbnVsbDsKLSAgICBQYXRoUmVjb3JkaW5nUmVzdWx0IHJlc3VsdCA9IG5ldyBQYXRoUmVjb3JkaW5nUmVzdWx0KCk7Ci0gICAgdmFsaWRhdGUoZWQsIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChlbGVtZW50LCBlZCksIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIGlmIChyZXN1bHQuaXNWYWxpZCkKLSAgICB7Ci0gICAgICBtYXRjaE1vZGVsTm9kZSA9IHJlc3VsdC5nZXRNYXRjaE1vZGVsKCk7Ci0gICAgfQotICAgIHJldHVybiBtYXRjaE1vZGVsTm9kZTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIExpc3QgY2xvbmUoTGlzdCBsaXN0KQotICB7ICAgCi0gICAgTGlzdCByZXN1bHQgPSBuZXcgVmVjdG9yKGxpc3Quc2l6ZSgpKTsKLSAgICByZXN1bHQuYWRkQWxsKGxpc3QpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbnQgaW5zZXJ0SW5kZXgsIENNTm9kZSBjbU5vZGUpCi0gIHsgICAgICAgICAgIAotICAgIExpc3QgY2xvbmVkTGlzdCA9IGNsb25lKGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgaW5zZXJ0KGNsb25lZExpc3QsIGluc2VydEluZGV4LCBjbU5vZGUpOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gaXNQYXJ0aWFsbHlWYWxpZChlZCwgY2xvbmVkTGlzdCk7ICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbnQgaW5zZXJ0SW5kZXgsIExpc3QgY21Ob2RlTGlzdCkKLSAgeyAgICAgICAgICAgICAgCi0gICAgTGlzdCBjbG9uZWRMaXN0ID0gY2xvbmUoY29udGVudFNwZWNpZmljYXRpb25MaXN0KTsKLSAgICBpbnNlcnQoY2xvbmVkTGlzdCwgaW5zZXJ0SW5kZXgsIGNtTm9kZUxpc3QpOwotICAgIHJldHVybiBpc1ZhbGlkKGVkLCBjbG9uZWRMaXN0KTsKLSAgfSAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbnQgc3RhcnRSZW1vdmVJbmRleCkKLSAgewotICAgIHJldHVybiBjYW5SZW1vdmUoZWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgc3RhcnRSZW1vdmVJbmRleCwgc3RhcnRSZW1vdmVJbmRleCk7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGludCBzdGFydFJlbW92ZUluZGV4LCBpbnQgZW5kUmVtb3ZlSW5kZXgpCi0gIHsKLSAgICBMaXN0IGNsb25lZExpc3QgPSBjbG9uZShjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIHJlbW92ZShjbG9uZWRMaXN0LCBzdGFydFJlbW92ZUluZGV4LCBlbmRSZW1vdmVJbmRleCk7Ci0gICAgcmV0dXJuIGlzVmFsaWQoZWQsIGNsb25lZExpc3QpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5SZXBsYWNlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IHN0YXJ0UmVtb3ZlSW5kZXgsIGludCBlbmRSZW1vdmVJbmRleCwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIExpc3QgY2xvbmVkTGlzdCA9IGNsb25lKGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgcmVtb3ZlKGNsb25lZExpc3QsIHN0YXJ0UmVtb3ZlSW5kZXgsIGVuZFJlbW92ZUluZGV4KTsgCi0gICAgaW5zZXJ0KGNsb25lZExpc3QsIHN0YXJ0UmVtb3ZlSW5kZXgsIGNtTm9kZSk7Ci0gICAgcmV0dXJuIGlzVmFsaWQoZWQsIGNsb25lZExpc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLyAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpCi0gIHsKLSAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQuaXNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUGFydGlhbGx5VmFsaWQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0KQotICB7Ci0gICAgQ01WYWxpZGF0b3IuRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgcmVzdWx0ID0gbmV3IENNVmFsaWRhdG9yLkVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0KCk7Ci0gICAgdmFsaWRhdGUoZWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgc3RyaW5nQ29udGVudENvbXBhcml0b3IsIHJlc3VsdCk7Ci0gICAgaW50IGNvdW50ID0gZ2V0RWxlbWVudENvdW50KGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVsZW1lbnRPcmlnaW5MaXN0ICIgKyByZXN1bHQuZ2V0UGFydGlhbFZhbGlkYXRpb25Db3VudCgpICsgInZzIiArIGNvdW50KTsKLSAgICByZXR1cm4gcmVzdWx0LmdldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQoKSA+PSBjb3VudDsKLSAgfSAgCi0gIAotICBwdWJsaWMgaW50IGdldEVsZW1lbnRDb3VudChMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCkKLSAgewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY29udGVudFNwZWNpZmljYXRpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgaWYgKHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLmlzRWxlbWVudChpLm5leHQoKSkpCi0gICAgICB7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgICByZXR1cm4gY291bnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgUmVzdWx0IHZhbGlkYXRlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoZWxlbWVudCwgZWQpLCBzdHJpbmdDb250ZW50Q29tcGFyaXRvciwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoTGlzdCBzdHJpbmdMaXN0LCBpbnQgc3RhcnRSZW1vdmVJbmRleCwgaW50IGVuZFJlbW92ZUluZGV4KQotICB7Ci0gICAgaWYgKHN0YXJ0UmVtb3ZlSW5kZXggIT0gLTEpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0UmVtb3ZlSW5kZXg7IGkgPD0gZW5kUmVtb3ZlSW5kZXg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nTGlzdC5yZW1vdmUoaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5zZXJ0KExpc3Qgc3RyaW5nTGlzdCwgaW50IGluc2VydEluZGV4LCBDTU5vZGUgY21Ob2RlKQotICB7Ci0gICAgaWYgKGluc2VydEluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIHN0cmluZ0xpc3QuYWRkQWxsKGluc2VydEluZGV4LCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoY21Ob2RlKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5zZXJ0KExpc3Qgc3RyaW5nTGlzdCwgaW50IGluc2VydEluZGV4LCBMaXN0IGNtTm9kZUxpc3QpCi0gIHsKLSAgICBpZiAoaW5zZXJ0SW5kZXggIT0gLTEpCi0gICAgewotICAgICAgaW50IGluc2VydExpc3RTaXplID0gY21Ob2RlTGlzdC5zaXplKCk7Ci0gICAgICBmb3IgKGludCBpID0gaW5zZXJ0TGlzdFNpemUgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGNtTm9kZSA9IChDTU5vZGUpY21Ob2RlTGlzdC5nZXQoaSk7Ci0gICAgICAgIHN0cmluZ0xpc3QuYWRkQWxsKGluc2VydEluZGV4LCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoY21Ob2RlKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiZWUyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLQotCi0vKioKLSAqIFRoZSBDTURvY3VtZW50TWFuYWdlciBjYW4gYmUgdmlzdWFsaXplZCBhcyBhIHRhYmxlIG9mIENNRG9jdW1lbnQKLSAqIHJlZmVyZW5jZXMsIGVhY2ggd2l0aCBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gYSBDTURvY3VtZW50IGNhY2hlLiBUaGUKLSAqIENNRG9jdW1lbnRNYW5hZ2VyIGFsc28gcGVyZm9ybXMgdGhlIHRhc2sgb2YgbG9hZGluZyBDTURvY3VtZW50cyBwcm92aWRpbmcKLSAqIHN1cHBvcnQgZm9yIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgbG9hZGluZy4KLSAqIAotICogcHVibGljSWRUYWJsZSBDTURvY3VtZW50Q2FjaGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCBwdWJsaWNJZCB8IHJlc29sdmVkVVJJIHwgLT4gfAotICogcmVzb2x2ZWRVUkkgfCBzdGF0dXMgfCBDTURvY3VtZW50IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAobnVsbCkgfCBmaWxlOi94LmR0ZCB8IHwKLSAqIGZpbGU6L3guZHRkIHwgbG9hZGluZyB8IChudWxsKSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgaHR0cDovLi4uIHwgZmlsZToveS54c2QgfCB8Ci0gKiBmaWxlOi95LnhzZCB8IGxvYWRlZCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRNYW5hZ2VyIHsKLQkvKioKLQkgKiBUaGlzIHByb3BlcnR5IHNwZWNpZmllcyBXSEVOIENNRG9jdW1lbnRzIGFyZSBsb2FkZWQuIFNldHRpbmcgdGhpcwotCSAqIHByb3BlcnR5IHRvIHRydWUgYWxsb3dzIHRoZSBDTURvY3VtZW50TWFuYWdlciB0byBsb2FkIENNRG9jdW1lbnRzIG9uCi0JICogZGVtYW5kLiBTZXR0aW5ncyB0aGlzIHByb3BlcnR5IGEgZmFsc2UgcHV0cyB0aGUgb251cyBvbiB0aGUgY2xpZW50IHRvCi0JICogY2FsbCBhZGRDTURvY3VtZW50UmVmZXJlbmNlKCkgdG8gZXhwbGljaXR5IHRyaWdnZXIgYSBsb2FkLiBUaGlzIGFsbG93cwotCSAqIHRoZSBjbGllbnQgdG8gY29udHJvbCBleGFjdGx5IHdoZW4gbG9hZGluZyBzaG91bGQgdGFrZSBwbGFjZS4gKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FVVE9fTE9BRCA9ICJhdXRvTG9hZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgc3BlY2lmaWVzIEhPVyBDTURvY3VtZW50cyBhcmUgbG9hZGVkLiBXaGVuIHNldCB0byBmYWxzZSwKLQkgKiB0aGUgZ2V0Q01Eb2N1bWVudCgpIG1ldGhvZCB3aWxsIGxvYWQgdGhlIENNRG9jdW1lbnQgc3luY2hyb25vdXNseSBhbmQKLQkgKiByZXR1cm4gYSBDTURvY3VtZW50IG9iamVjdCB3aGVuIGxvYWRpbmcgaXMgc3VjY2Vzc2Z1bC4gV2hlbiBzZXQgdG8KLQkgKiB0cnVlLCB0aGUgZ2V0Q01Eb2N1bWVudCgpIHdpbGwgbG9hZCB0aGUgQ01Eb2N1bWVudCBhc3luY2hyb25vdXNseSBhbmQKLQkgKiB3aWxsIGltbWVkaWF0ZWx5IHJldHVybiBudWxsLiBXaGVuIGxvYWRpbmcgaXMgY29tcGxldGUsIHRoZQotCSAqIENNRG9jdW1lbnRNYW5hZ2VyIHdpbGwgaW5mb3JtIGl0cyBsaXN0ZW5lcnMgdGhhdCB0aGUgQ01Eb2N1bWVudCBoYXMKLQkgKiBiZWVuIGxvYWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BU1lOQ19MT0FEID0gImFzeW5jTG9hZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1VTRV9DQUNIRURfUkVTT0xWRURfVVJJID0gInVzZUNhY2hlZFJlc292bGVkVVJJIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzYzOTkKLQkgKiBBbGxvd3MgYSBjbGllbnQgdG8gY29udHJvbCB3aGV0aGVyIHRoZSBkb2N1bWVudCBtYW5hZ2VyIGF0dGVtcHRzIHRvIHJlc29sdmUgYQotCSAqIENNIGRvY3VtZW50J3MgVVJJLiBXaGVuIHNldCB0byBmYWxzZSwgdGhlIENNIHN5c3RlbUlEIHdpbGwgYmUgYXNzdW1lZCB0byBwb2ludAotCSAqIHRvIGFuIGFscmVhZHkgcmVzb2x2ZWQgVVJJLiBCeSBkZWZhdWx0IHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUEVSRk9STV9VUklfUkVTT0xVVElPTiA9ICJwZXJmb3JtVVJJUmVzb2x1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgYSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBlbmFibGVkKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyLiBMaXN0ZW5lcnMgc2hvdWxkIGV4cGVjdCB0byByZWNlaXZlIGNhbGwgYmFja3Mgb24gYQotCSAqIHNlY29uZGFyeSB0aHJlYWQgd2hlbiBhc3luY2hyb25vdXNseSBsb2FkaW5nIGlzIHVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBMb29rdXAgb3IgY3JlYXRlIGEgQ01Eb2N1bWVudCAoZGVwZW5kaW5nIG9uIFBST1BFUlRZX0FVVE9fTE9BRCkuCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHBhcmFtIHR5cGUgLQotCSAqICAgICAgICAgICAgJ2R0ZCcsICd4c2QnLCAndGxkJywgZXRjLiBpZiBudWxsIGlzIGdpdmVuIGFzIHRoZSB0eXBlLCB0aGVuCi0JICogICAgICAgICAgICB0aGUgdHlwZSBpcyBjYWxjdWxhdGVkIGFzIGxhc3Qgc2VnbWVudCAoZS5nLiBmaWxlIGV4dGVuc2lvbikKLQkgKiAgICAgICAgICAgIG9mIHRoZSByZXNvbHZlZCBVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogTG9va3VwIGEgQ01Eb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHN0YXR1cyBvZiBhIENNRG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDTURvY3VtZW50U3RhdHVzKFN0cmluZyBwdWJsaWNJZCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgQ01Eb2N1bWVudCBhbmQgYWRkcyB0aGUgYXNzb2NpYXRlZCBDTURvY3VtZW50IHJlZmVyZW5jZQotCSAqIGluZm9ybWF0aW9uIHRvIHRoZSB0YWJsZS4gQ2FsbGluZyB0aGlzIG1ldGhvZCBhbHdheXMgdHJpZ2dlcnMgYQotCSAqIENNRG9jdW1lbnQgbG9hZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDTURvY3VtZW50UmVmZXJlbmNlKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBBZGQgYW4gZXhpc3RpbmdDTURvY3VtZW50IGFuZCB0aGUgcmVmZXJlbmNlIGluZm9ybWF0aW9uIHRvIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpOwotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgQ01Eb2N1bWVudENhY2hlIHRoYXQgaXMgdXNlZCB0byBzdG9yZSBsb2FkZWQgQ01Eb2N1bWVudHMgYW5kCi0JICogYXNzb2NpYXRlZCBzdGF0dXMuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKTsKLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQgZ2l2ZW4gYSByZXNvdWx2ZWRVUkkuIE5vdGUgdGhhdCBubyBlbnRyaWVzIGFyZQotCSAqIGFkZGVkIHRvIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2MDdkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZUxpc3RlbmVyOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBleHRlbmRzIENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lKTsKLX0gICAgICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50UmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNTdmNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRSZWZlcmVuY2UKLXsKLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpOwotICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2RjOGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLSAKLS8qKgotICogVGhlIGludGVyZmFjZSBpcyB1c2VkIHRvIGFic3RyYWN0IHRoZSB0YXNrIG9mIGNvbXB1dGluZyB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBET00KLSAqIG9yIGEgcGFydGljdWxhciBub2RlIHdpdGhpbiB0aGUgRE9NLiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyCi17Ci0gIExpc3QgZ2V0Q01Eb2N1bWVudFJlZmVyZW5jZXMoTm9kZSBub2RlLCBib29sZWFuIGRlZXApOwotICBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDMwMGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBwZXJmb3JtaW5nIGhpZ2hlciBsZXZlbCBxdWVyaWVzIGJhc2VkIG9uCi0gKiBhIHhtbCBtb2RlbCAoRE9NKSBhbmQgb25lIG9yIG1vcmUgYXNzb2NpYXRlZCBjb250ZW50IG1vZGVscyAoQ01Eb2N1bWVudCkuCi0gKgotICogVGhlIHF1ZXJpZXMgcHJvdmlkZWQgY2FuIGJlIG9yZ2FuaXplZCBpbnRvIHRocmVlIGdyb3VwczoKLSAqCi0gKiAxKSBET00gTm9kZSB0byBDTU5vZGUgbWFwcGluZwotICogICAgICBHaXZlbiBhIGdyYW1tYXRpY2FsbHkgdmFsaWQgRE9NIE5vZGUgdGhlIGNvcnJlc3BvbmRpbmcgQ01Ob2RlIGNhbiBiZSBkZXRlcm1pbmVkLgotICogICAgICAoaS5lLiBFbGVtZW50IC0+IENNRWxlbWVudERlY2xhcmF0aW9uLCBBdHRyIC0+IENNQXR0cmlidXRlRGVjbGFyYXRpb24sIENoYXJhY3RlckRhdGEgLT4gQ01EYXRhVHlwZSkKLSAqCi0gKiAyKSBET00gZWRpdGluZyB0ZXN0cyAoIkNhbiBJIGRvIHRoaXM/IikKLSAqICAgICAgUXVlc3Rpb25zIHN1Y2ggYXMgY2FuSW5zZXJ0LCBjYW5SZW1vdmUsIGNhblJlcGxhY2UgY2FuIGFzc2lzdCBpbiB0aGUgZWRpdGluZyBvZiBhIERPTS4KLSAqCi0gKiAgICAgIFRoZSB2YWxpZGl0eUNoZWNraW5nIGFyZ3VtZW50IGRldGVybWluZXMgdGhlIHN0cmljdG5lc3Mgb2YgdGhlIHZhbGlkaXR5IHRlc3RpbmcgdGhhdCBvY2N1cnMuCi0gKgotICogICAgICAtIFZBTElESVRZX05PTkUgICAgOiBUaGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBFbGVtZW50IGlzIGlnbm9yZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgdGhlIGNvbnRlbnQgbW9kZWwgaXMgY29uc2lkZXJlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBtb3N0IHVzZWZ1bCBmb3IgY29kZWFzc2lzdCByZWxhdGVkIHF1ZXJpZXMuCi0gKgotICogICAgICAtIFZBTElESVRZX1NUUklDVCAgOiBUaGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBFbGVtZW50IGlzIGNvbnNpZGVyZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybnMgdHJ1ZSBvbmx5IGlmIHRoZSBvcGVyYXRpb24gcHJlc2VydmVzIGNvbnRlbnQgdmFsaWRpdHkuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIHdoZW4gRE9NIGVkaXRpbmcgbmVlZHMgdG8gYmUgY29uc3RyYWluZWQgdG8gbWFpbnRhaW4gdmFsaWRpdHkuCi0gKgotICogICAgICAtIFZBTElESVRZX1BBUlRJQUwgOiBTb21lIG9wdGltaXplZCBjb21wcm9taXNlIGJldHdlZW4gdGhlIHR3byBvcHRpb25zIGFib3ZlLgotICoKLSAqIDMpIERPTSBlZGl0aW5nIGFjdGlvbnMgKCJXaGF0IGNhbiBJIGRvIGhlcmU/IikKLSAqICAgICAgVGhlc2UgbWV0aG9kcyByZXR1cm4gTW9kZWxRdWVyeUFjdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgYXQgc29tZSBzcGVjaWZpZWQgRE9NIE5vZGUuCi0gKiAgICAgIFRoZSBhY3Rpb25zIGluZGljYXRlIHdoYXQga2luZHMgb2YgRE9NIE5vZGUgY2FuIGJlIGluc2VydGVkIHdoZXJlIChhdCB3aGF0IGluZGV4KS4KLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElESVRZX05PTkUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRElUWV9QQVJUSUFMID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURJVFlfU1RSSUNUID0gMjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0FMTCA9IDB4RkY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfQVRUUklCVVRFUyA9IDB4MDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfQ0hJTERfTk9ERVMgPSAweDAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX1NFUVVFTkNFX0dST1VQUyA9IDB4MDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfVEVYVF9OT0RFUyA9IDB4MDg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfRU5DTE9TSU5HX1JFUExBQ0VfQUNUSU9OUyA9IDB4MTA7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9NT0RFX1VOQ09OU1RSQUlORUQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRElUX01PREVfQ09OU1RSQUlORURfTEVOSUVOVD0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCA9IDI7Ci0KLQotICB2b2lkIHNldEVkaXRNb2RlKGludCBlZGl0TW9kZSk7Ci0KLSAgaW50ICBnZXRFZGl0TW9kZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLgotICAgKiBvciBudWxsIGlmIG5vIENNRG9jdW1lbnQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDTU5vZGUgZm9yIHRoZSBET00gTm9kZQotICAgKiBvciBudWxsIGlmIG5vIENNTm9kZSBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotICAgKi8KLSAgQ01Ob2RlIGdldENNTm9kZShOb2RlIG5vZGUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIENNQXR0cmlidXRlIGZvciB0aGUgRE9NIE5vZGUKLSAgICogb3IgbnVsbCBpZiBubyBDTU5vZGUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIENNQXR0cmlidXRlIGZvciB0aGUgRE9NIE5vZGUKLSAgICogb3IgbnVsbCBpZiBubyBDTU5vZGUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCBpcyB2YWxpZAotICAgKi8KLSAgYm9vbGVhbiBpc0NvbnRlbnRWYWxpZChFbGVtZW50IGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBDTU5vZGUgb2YgdGhlIHBhcmVudCBlbGVtZW50J3MgY29udGVudCBtb2RlbAotICAgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBub2RlCi0gICAqLwotICBDTU5vZGUgZ2V0T3JpZ2luKE5vZGUgbm9kZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgQ01Ob2RlcyBvZiB0aGUgcGFyZW50IGVsZW1lbnQncyBjb250ZW50IG1vZGVsCi0gICAqIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG5vZGUKLSAgICovCi0gIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KEVsZW1lbnQgZWxlbWVudCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBDTU5vZGUgJ21ldGEgZGF0YScgdGhhdCBtYXkgYmUgcG90ZW50aWFsbHkgYWRkZWQgdG8gdGhlIGVsZW1lbnQuCi0gICAqLwotICBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKTsKLQotICAvKioKLSAgICogQ2FuIGEgRE9NIE5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgQ01Ob2RlICdtZXRhIGRhdGEnIGJlIGFkZGVkIHRvIHRoZSBwYXJlbnQKLSAgICovCi0gIGJvb2xlYW4gY2FuSW5zZXJ0KEVsZW1lbnQgcGFyZW50LCBDTU5vZGUgY21Ob2RlLCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICogQ2FuIG11bHRpcGxlIERPTSBOb2RlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXN0IG9mIENNTm9kZSAnbWV0YSBkYXRhJyBiZSBhZGRlZCB0byB0aGUgcGFyZW50Ci0gICAqLwotICBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgTGlzdCBjbU5vZGVMaXN0LCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICogQ2FuIHRoZSBET00gTm9kZSBiZSByZW1vdmVkCi0gICAqLwotICBib29sZWFuIGNhblJlbW92ZShOb2RlIG5vZGUsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICogQ2FuIHRoZSBsaXN0IG9mIERPTSBOb2RlcyBiZSByZW1vdmVkCi0gICAqLwotICBib29sZWFuIGNhblJlbW92ZShMaXN0IG5vZGVMaXN0LCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgY2hpbGRyZW4gd2l0aGluIHRoZSBpbmRpY2F0ZWQgaW5kaWNlcyBiZSByZXBsYWNlZCB3aXRoIGEgRE9NIE5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgQ01Ob2RlICdtZXRhIGRhdGEnCi0gICAqLwotICBib29sZWFuIGNhblJlcGxhY2UoRWxlbWVudCBwYXJlbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIENNTm9kZSBjbU5vZGUsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICogQ2FuIHRoZSBjaGlsZHJlbiB3aXRoaW4gdGhlIGluZGljYXRlZCBpbmRpY2VzIGJlIHJlcGxhY2VkIHdpdGggbXVsdGlwbGUgRE9NIE5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxpc3Qgb2YgQ01Ob2RlICdtZXRhIGRhdGEnCi0gICAqLwotICBib29sZWFuIGNhblJlcGxhY2UoRWxlbWVudCBwYXJlbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIExpc3QgY21Ob2RlTGlzdCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpOwotCi0gIC8qKgotICAgKgotICAgKi8KLSAgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKgotICAgKi8KLSAgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKERvY3VtZW50IHBhcmVudCwgQ01Eb2N1bWVudCBjbURvY3VtZW50LCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIGxpc3Qgb2YgcmVwbGFjZSBhY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgcGFyZW50J3MgY29udGVudAotICAgKi8KLSAgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIGxpc3Qgb2YgcmVwbGFjZSBhY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgc2VsZWN0ZWQgY2hpbGRyZW4gb2YgdGhhdCBwYXJlbnQgCi0gICAqLwotICB2b2lkIGdldFJlcGxhY2VBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBzZWxlY3RlZENoaWxkcmVuLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgLyoqIAotICAgKiAgQGRlcHJlY2F0ZWQgLSB1c2UgZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcygpCi0gICAqLwotICBMaXN0IGdldERhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSk7Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kcyByZXR1cm4gYW4gYXJyYXkgb2YgcG9zc2libGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRhdGF0eXBlIG9mIHRoZSBDTU5vZGUgKGVpdGhlciBhbiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG9yIGEgQ01FbGVtZW50RGVjbGFyYXRpb24pCi0gICAqLwotICBTdHJpbmdbXSBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSk7Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBpZiBhIENNRG9jdW1lbnRNYW5hZ2VyIGlzIG5vdCB1c2VkIGJ5IHRoZSBNb2RlbFF1ZXJ5Ci0gICAqLwotICBDTURvY3VtZW50TWFuYWdlciBnZXRDTURvY3VtZW50TWFuYWdlcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgdGhlIE1vZGVsUXVlcnkgZG9lc24ndCBzdXBwb3J0IHRoZSB1c2Ugb2YgZXh0ZW5zaW9ucwotICAgKi8KLSAgTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXIgZ2V0RXh0ZW5zaW9uTWFuYWdlcigpOyAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTljNGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNFUlQgID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFICA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0UgPSA0OwotCi0gIHB1YmxpYyBpbnQgZ2V0S2luZCgpOwotICAvKioKLSAgICogaWYgc3RhcnQgaW5kZXggPT0gLTEgdGhlbiBubyBpbnNlcnQgaXMgcG9zc2libGUKLSAgICogaWYgc3RhcnQgaW5kZXggIT0gLTEgYW5kIGVuZEluZGV4ID09IC0xIHRoZW4gYW4gaW5zZXJ0IGF0IGFueSBwb3NpdGlvbiBpcyBwb3NzaWJsZQotICAgKi8KLSAgcHVibGljIGludCBnZXRTdGFydEluZGV4KCk7Ci0gIHB1YmxpYyBpbnQgZ2V0RW5kSW5kZXgoKTsKLSAgcHVibGljIE5vZGUgZ2V0UGFyZW50KCk7Ci0gIHB1YmxpYyBDTU5vZGUgZ2V0Q01Ob2RlKCk7Ci0gIHB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoKTsKLSAgcHVibGljIHZvaWQgc2V0VXNlckRhdGEoT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3Nzc1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgTW9kZWxRdWVyeUNNUHJvdmlkZXIKLXsKLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKTsKLSAgcHVibGljIENNRGF0YVR5cGUgZ2V0Q01EYXRhVHlwZShUZXh0IHRleHQpOyAKLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpOwotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGY5MzczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeUNNUHJvdmlkZXIKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIENNRG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgRE9NIE5vZGUuCi0gICAqIG9yIG51bGwgaWYgbm8gQ01Eb2N1bWVudCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotICAgKi8KLSAgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTdmNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9kZWxRdWVyeUV4dGVuc2lvbgoteyAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0ge307Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ01Ob2RlW10gRU1QVFlfQ01OT0RFX0FSUkFZID0ge307Ci0gIAotICAvKioKLSAqIEBwYXJhbSBvd25lckVsZW1lbnQgLSB0aGUgb3duZXIgZWxlbWVudAotICogQHBhcmFtIG5hbWVzcGFjZSAtIHRoZSBhY3RpdmUgbmFtZXNwYWNlCi0gKiBAcGFyYW0gbmFtZSAtIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBub2RlCi0gKiBAcmV0dXJuIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZQotICovCi1wdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlVmFsdWVzKEVsZW1lbnQgb3duZXJFbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBFTVBUWV9TVFJJTkdfQVJSQVk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRFbGVtZW50VmFsdWVzKE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gRU1QVFlfU1RSSU5HX0FSUkFZOwotICB9Ci0gIAotICAvKioKLSAqIEBwYXJhbSBwYXJlbnROb2RlCi0gKiBAcGFyYW0gbmFtZXNwYWNlCi0gKiBAcGFyYW0gbmFtZQotICogQHJldHVybiB3aGV0aGVyIGEgY2hpbGQgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gcGFyZW50Tm9kZSBpcyB2YWxpZCBnaXZlbiB0aGUgYWN0aXZlIG5hbWVzcGFjZQotICovCi1wdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVDaGlsZEVsZW1lbnQoTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAqIEBwYXJhbSBwYXJlbnRFbGVtZW50IC0gdGhlIHBhcmVudCBFbGVtZW50IHdoZW4gYXNraW5nIGZvciBjaGlsZHJlbiwgdGhlIG93bmVyIEVsZW1lbnQgd2hlbiBhc2tpbmcgZm9yIGF0dHJpYnV0ZXMgCi0gKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIGFjdGl2ZSBuYW1lc3BhY2UKLSAqIEBwYXJhbSBpbmNsdWRlT3B0aW9ucyAtIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTIG9yIE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUwotICogQHJldHVybiBhZGRpdGlvbmFsIHZhbGlkIENNQXR0cmlidXRlRGVjbGFyYXRpb25zIG9yIENNRWxlbWVudERlY2xhcmF0aW9ucyAKLSAqLwotcHVibGljIENNTm9kZVtdIGdldEF2YWlsYWJsZUVsZW1lbnRDb250ZW50KEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZSwgaW50IGluY2x1ZGVPcHRpb25zKSAKLSAgewotCSAgcmV0dXJuIEVNUFRZX0NNTk9ERV9BUlJBWTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9leHRlbnNpb24vTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjNDQwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9leHRlbnNpb24vTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyCi17Ci0gIExpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHZvaWQgZmlsdGVyQXZhaWxhYmxlRWxlbWVudENvbnRlbnQoTGlzdCBhdmFpbGFibGVDb250ZW50LCBFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKTsKLQotICB2b2lkIGZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KExpc3QgYXZhaWxhYmxlQ29udGVudCwgRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9CYXNlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0Jhc2VBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjQyZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0Jhc2VBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEJhc2VBc3NvY2lhdGlvblByb3ZpZGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbigoQXR0cilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01EYXRhVHlwZSgoVGV4dClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBDTURhdGFUeXBlIGdldENNRGF0YVR5cGUoVGV4dCB0ZXh0KQotICB7Ci0gICAgQ01EYXRhVHlwZSByZXN1bHQgPSBudWxsOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpcGFyZW50Tm9kZSk7Ci0gICAgICByZXN1bHQgPSBlZC5nZXREYXRhVHlwZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikKLSAgewotICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbillZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA1OTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZVRhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50TG9hZGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnk7Ci0gIHByb3RlY3RlZCBDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlcjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmZlcnJlZEdyYW1tYXJFbmFibGVkID0gdHJ1ZTsgIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudExvYWRpbmdOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZTsKLSAgcHJvdGVjdGVkIGludCBjb3VudCA9IDA7Ci0gICAgCi0gIHB1YmxpYyBDTURvY3VtZW50TG9hZGVyKERvY3VtZW50IGRvY3VtZW50LCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMoZG9jdW1lbnQsIG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDTURvY3VtZW50TG9hZGVyKERvY3VtZW50IGRvY3VtZW50LCBDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlcikKLSAgeyAgIAotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmNtRG9jdW1lbnRNYW5hZ2VyID0gY21Eb2N1bWVudE1hbmFnZXI7ICAJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGxvYWRDTURvY3VtZW50cygpCi0gIHsgICAgICAgICAgCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS1sb2FkQ01Eb2N1bWVudHMgLS0tLS0tLS0tLS0tIik7ICAgICAgICAgIAotICAgIC8vbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgCi0gICAgYm9vbGVhbiB3YWxrRG9jdW1lbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIAotICAgIGNtRG9jdW1lbnRNYW5hZ2VyLnJlbW92ZUFsbFJlZmVyZW5jZXMoKTsKLSAgICAgIAotICAgIFN0cmluZ1tdIGRvY3R5cGVJbmZvID0gWE1MQXNzb2NpYXRpb25Qcm92aWRlci5nZXREb2N0eXBlSW5mbyhkb2N1bWVudCk7Ci0gICAgaWYgKGRvY3R5cGVJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgLy8gbG9hZCB0aGUgZG9jdHlwZSBpZiByZXF1aXJlZAotICAgICAgd2Fsa0RvY3VtZW50ID0gaGFuZGxlR3JhbW1hcihkb2N0eXBlSW5mb1swXSwgZG9jdHlwZUluZm9bMV0sICJEVEQiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBnZXRSb290RWxlbWVudChkb2N1bWVudCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lc3BhY2VUYWJsZSA9IG5ldyBDTURvY3VtZW50TG9hZGluZ05hbWVzcGFjZVRhYmxlKGRvY3VtZW50KTsgICAKLSAgICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZVRhYmxlLmlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKSkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHdhbGtEb2N1bWVudCA9IHRydWU7Ci0gICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImlzTmFtZXNwYWNlQXdhcmUiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2VUYWJsZSA9IG51bGw7Ci0gICAgICAgICAgd2Fsa0RvY3VtZW50ID0gaXNJbmZlcnJlZEdyYW1tYXJFbmFibGVkOwotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpcyBOT1QgbmFtZXNwYWNlQXdhcmUiKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9ICAKLSAgICB9IAotCi0gICAgaWYgKHdhbGtEb2N1bWVudCkKLSAgICB7Ci0gICAgICB2aXNpdE5vZGUoZG9jdW1lbnQpOyAgIAotICAgIH0gCi0KLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tIGVsYXBzZWQgdGltZSAoIiArIGNvdW50ICsgIikgPSAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVHcmFtbWFyKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgdHlwZSkKLSAgeyAgICAgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICBpbnQgc3RhdHVzID0gY21Eb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudFN0YXR1cyhwdWJsaWNJZCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX05PVF9MT0FERUQpCi0gICAgewotICAgICAgY21Eb2N1bWVudE1hbmFnZXIuYWRkQ01Eb2N1bWVudFJlZmVyZW5jZShwdWJsaWNJZCwgc3lzdGVtSWQsIHR5cGUpOwotICAgIH0gICAgICAgICAgICAgICAgIAotICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0gICAgCi0KLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgIAotICAgIHZpc2l0Q2hpbGROb2RlcyhlbGVtZW50KTsKLSAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBoYW5kbGVFbGVtZW50TlMoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsKLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCB2aXNpdE5vZGUoTm9kZSBub2RlKQotICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIGNvdW50Kys7ICAgICAgIAotCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClub2RlOyAgICAKLSAgICAgIGlmIChuYW1lc3BhY2VUYWJsZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBoYW5kbGVFbGVtZW50KGVsZW1lbnQpOyAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlRWxlbWVudE5TKGVsZW1lbnQpOwotICAgICAgfSAgICAgICAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0gICAgewotICAgICAgdmlzaXRDaGlsZE5vZGVzKG5vZGUpOwotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDaGlsZE5vZGVzKE5vZGUgbm9kZSkKLSAgeyAgIAotCSAgZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgCi0gICAgewotCSAgICB2aXNpdE5vZGUoY2hpbGQpOwotICAgIH0KLQl9ICAgICAgICAgICAgIAotCi0KLSAgcHJvdGVjdGVkIGNsYXNzIENNRG9jdW1lbnRMb2FkaW5nTmFtZXNwYWNlVGFibGUgZXh0ZW5kcyBOYW1lc3BhY2VUYWJsZQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IG5ld05hbWVzcGFjZUxpc3Q7Ci0KLSAgICBwdWJsaWMgQ01Eb2N1bWVudExvYWRpbmdOYW1lc3BhY2VUYWJsZShEb2N1bWVudCBkb2N1bWVudCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgc3VwZXIoZG9jdW1lbnQpOyAgICAgCi0gICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgbmV3TmFtZXNwYWNlTGlzdCA9IG51bGw7Ci0gICAgICBzdXBlci5hZGRFbGVtZW50KGVsZW1lbnQpOyAgCi0gICAgICBpZiAobmV3TmFtZXNwYWNlTGlzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuZXdOYW1lc3BhY2VMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgICAgICBoYW5kbGVHcmFtbWFyKGluZm8udXJpLCBpbmZvLmxvY2F0aW9uSGludCwgIlhTRCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKFN0cmluZyBrZXksIE5hbWVzcGFjZUluZm8gaW5mbykKLSAgICB7Ci0gICAgICBzdXBlci5pbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8oa2V5LCBpbmZvKTsgICAgICAgICAgIAotICAgICAgaWYgKG5ld05hbWVzcGFjZUxpc3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmV3TmFtZXNwYWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIH0KLSAgICAgIG5ld05hbWVzcGFjZUxpc3QuYWRkKGluZm8pOyAgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLQotICAKLSAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0Um9vdEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TWFuYWdlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjYmZjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudE1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25VdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudE1hbmFnZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudE1hbmFnZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZTsKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlciBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBWZWN0b3IoKTsgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBwdWJsaWNJZFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgICAgCi0gIHB1YmxpYyBDTURvY3VtZW50TWFuYWdlckltcGwoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSwgQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyIGNtRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmNtRG9jdW1lbnRDYWNoZSA9IGNtRG9jdW1lbnRDYWNoZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIgPSBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXI7Ci0gICAgc2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FVVE9fTE9BRCwgdHJ1ZSk7Ci0gICAgc2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX1VTRV9DQUNIRURfUkVTT0xWRURfVVJJLCBmYWxzZSk7Ci0gICAgc2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX1BFUkZPUk1fVVJJX1JFU09MVVRJT04sIHRydWUpOwotICB9ICAgICAgICAgCi0KLSAgICAgICAKLSAgcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKQotICB7Ci0gICAgcmV0dXJuIGNtRG9jdW1lbnRDYWNoZTsKLSAgfQotCi0gCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHZhbHVlKQotICB7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQocHJvcGVydHlOYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyID0gKENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQodGhpcywgcHJvcGVydHlOYW1lKTsKLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGdldFByb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IHByb3BlcnR5VGFibGUuZ2V0KHByb3BlcnR5TmFtZSk7Ci0gICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIG9iamVjdC5lcXVhbHMoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgY21Eb2N1bWVudENhY2hlLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICAgIGNtRG9jdW1lbnRDYWNoZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAgCi0gICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9va3VwUmVzb2x2ZWRVUkkoU3RyaW5nIHB1YmxpY0lkKQotICB7Ci0gICAgU3RyaW5nIGtleSA9IHB1YmxpY0lkICE9IG51bGwgPyBwdWJsaWNJZCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIChTdHJpbmcpcHVibGljSWRUYWJsZS5nZXQoa2V5KTsKLSAgfQotICAgIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9va3VwT3JDcmVhdGVSZXNvbHZlZFVSSShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsgICAgICAgICAgICAgICAgICAKLQotICAgIFN0cmluZyBrZXkgPSBwdWJsaWNJZCAhPSBudWxsID8gcHVibGljSWQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKGdldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9VU0VfQ0FDSEVEX1JFU09MVkVEX1VSSSkpCi0gICAgewotICAgICAgcmVzb2x2ZWRVUkkgPSAoU3RyaW5nKXB1YmxpY0lkVGFibGUuZ2V0KGtleSk7Ci0gICAgfSAgIAotCi0gICAgaWYgKHJlc29sdmVkVVJJID09IG51bGwpCi0gICAgewotICAgICAgcmVzb2x2ZWRVUkkgPSBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIucmVzb2x2ZUdyYW1tYXJVUkkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgIGlmIChyZXNvbHZlZFVSSSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXNvbHZlZFVSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBwdWJsaWNJZFRhYmxlLnB1dChrZXksIHJlc29sdmVkVVJJKTsgICAgIAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAKLSAgICByZXR1cm4gcmVzb2x2ZWRVUkk7Ci0gIH0KLQotCi0gIHB1YmxpYyBpbnQgZ2V0Q01Eb2N1bWVudFN0YXR1cyhTdHJpbmcgcHVibGljSWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IHN0YXR1cyA9IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRDsgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbG9va3VwUmVzb2x2ZWRVUkkocHVibGljSWQpOwotICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBzdGF0dXMgPSBjbURvY3VtZW50Q2FjaGUuZ2V0U3RhdHVzKHJlc29sdmVkVVJJKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfSAgICAKLSAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IGxvb2t1cFJlc29sdmVkVVJJKHB1YmxpY0lkKTsKLSAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0gY21Eb2N1bWVudENhY2hlLmdldENNRG9jdW1lbnQocmVzb2x2ZWRVUkkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotICAKLQotICAvKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlciNnZXRDTURvY3VtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsKLQotICAgIGlmIChnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVVUT19MT0FEKSkKLSAgICB7Ci0gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNjM5OQotICAgICAgCi0gICAgICBpZiAoZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX1BFUkZPUk1fVVJJX1JFU09MVVRJT04pKQotICAgICAgewotICAgICAgICByZXNvbHZlZFVSSSA9IGxvb2t1cE9yQ3JlYXRlUmVzb2x2ZWRVUkkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzb2x2ZWRVUkkgPSBzeXN0ZW1JZDsKLSAgICAgIH0KLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXNvbHZlZFVSSSA9IGxvb2t1cFJlc29sdmVkVVJJKHB1YmxpY0lkKTsKLSAgICB9IAotCi0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIGludCBzdGF0dXMgPSBjbURvY3VtZW50Q2FjaGUuZ2V0U3RhdHVzKHJlc29sdmVkVVJJKTsKLSAgICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FERUQpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjbURvY3VtZW50ID0gY21Eb2N1bWVudENhY2hlLmdldENNRG9jdW1lbnQocmVzb2x2ZWRVUkkpOwotICAgICAgfSAgIAotICAgICAgZWxzZSBpZiAoc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRCkKLSAgICAgIHsgICAgIAotICAgICAgICBpZiAoZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FVVE9fTE9BRCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjbURvY3VtZW50ID0gbG9hZENNRG9jdW1lbnQocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlLCBnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVNZTkNfTE9BRCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjbURvY3VtZW50OyAgIAotICB9IAotICAKLSAgcHVibGljIHZvaWQgYWRkQ01Eb2N1bWVudFJlZmVyZW5jZShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBsb29rdXBPckNyZWF0ZVJlc29sdmVkVVJJKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwgJiYgcmVzb2x2ZWRVUkkubGVuZ3RoKCkgPiAwKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpbnQgc3RhdHVzID0gY21Eb2N1bWVudENhY2hlLmdldFN0YXR1cyhyZXNvbHZlZFVSSSk7Ci0gICAgICBpZiAoc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGxvYWRDTURvY3VtZW50KHB1YmxpY0lkLCByZXNvbHZlZFVSSSwgdHlwZSwgZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FTWU5DX0xPQUQpKTsKLSAgICAgIH0gICAgICAgICAKLSAgICB9IAotICB9Ci0gICAgIAotCi0gIHB1YmxpYyB2b2lkIGFkZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyByZXNvbHZlZFVSSSwgU3RyaW5nIHR5cGUsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgewotICAgIFN0cmluZyBrZXkgPSBwdWJsaWNJZCAhPSBudWxsID8gcHVibGljSWQgOiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpY0lkVGFibGUucHV0KGtleSwgcmVzb2x2ZWRVUkkpOwotICAgIGNtRG9jdW1lbnRDYWNoZS5wdXRDTURvY3VtZW50KHJlc29sdmVkVVJJLCBjbURvY3VtZW50KTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgbG9hZENNRG9jdW1lbnQoZmluYWwgU3RyaW5nIHB1YmxpY0lkLCBmaW5hbCBTdHJpbmcgcmVzb2x2ZWRVUkksIGZpbmFsIFN0cmluZyB0eXBlLCBib29sZWFuIGFzeW5jKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhYm91dCB0byBidWlsZCBDTURvY3VtZW50KCIgKyBwdWJsaWNJZCArICIsICIgKyB1bnJlc29sdmVkVVJJICsgIiA9ICIgKyByZXNvbHZlZFVSSSArICIpIik7Ci0gICAgaWYgKGFzeW5jKQotICAgIHsgICAgIAotICAgICAgY21Eb2N1bWVudENhY2hlLnNldFN0YXR1cyhyZXNvbHZlZFVSSSwgQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FESU5HKTsKLSAgICAgIC8vVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IEFzeW5jQnVpbGRPcGVyYXRpb24ocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlKSk7Ci0gICAgICAvL3RocmVhZC5zdGFydCgpOwotICAgICAgSm9iIGpvYiA9IG5ldyBKb2IoWE1MQ29yZU1lc3NhZ2VzLmxvYWRpbmcgKyByZXNvbHZlZFVSSSkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IChmYW1pbHkgPT0gQ01Eb2N1bWVudE1hbmFnZXIuY2xhc3MpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIGJ1aWxkQ01Eb2N1bWVudChwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAJICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIGpvYi5zY2hlZHVsZSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IGJ1aWxkQ01Eb2N1bWVudChwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUpOwotICAgIH0gICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotICAgIAotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGNtRG9jdW1lbnRDYWNoZS5zZXRTdGF0dXMocmVzb2x2ZWRVUkksIENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BRElORyk7Ci0gIAotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsgICAgICAgICAKLSAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCAmJiByZXNvbHZlZFVSSS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgLy8gVE9ETy4uLiBwYXNzIHRoZSBUWVBFIHRocnUgdG8gdGhlIENNRG9jdW1lbnRCdWlsZGVyCi0gICAgICByZXN1bHQgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlQ01Eb2N1bWVudChyZXNvbHZlZFVSSSwgdHlwZSk7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7IAotICAgICAgLy8gbG9hZCB0aGUgYW5ub3RhdGlvbiBmaWxlcyBmb3IgdGhlIGRvY3VtZW50IAotICAgICAgaWYgKHB1YmxpY0lkICE9IG51bGwpCi0gICAgICB7ICAgIAotICAgICAgICBBbm5vdGF0aW9uVXRpbGl0eS5sb2FkQW5ub3RhdGlvbnNGb3JHcmFtbWFyKHB1YmxpY0lkLCByZXN1bHQpOwotICAgICAgfQotICAgICAgY21Eb2N1bWVudENhY2hlLnB1dENNRG9jdW1lbnQocmVzb2x2ZWRVUkksIHJlc3VsdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjbURvY3VtZW50Q2FjaGUuc2V0U3RhdHVzKHJlc29sdmVkVVJJLCBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCByZW1vdmVBbGxSZWZlcmVuY2VzKCkKLSAgewotICAgIC8vIFRPRE8uLi4gaW5pdGlhdGUgYSB0aW1lZCByZWxlYXNlIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBDTURvY3VtZW50Q2FjaGUKLSAgICBwdWJsaWNJZFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50UmVmZXJlbmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZWRhYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRSZWZlcmVuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50UmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50UmVmZXJlbmNlCi17ICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JZDsKLSAgcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJZDsKLQotICBwdWJsaWMgQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICB0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBwdWJsaWNJZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gc3lzdGVtSWQ7Ci0gIH0gICAgICAKLSAgCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJbIiArIHB1YmxpY0lkICsgIiwgIiArIHN5c3RlbUlkICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWU3MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0luZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbC5JbmZlcnJlZEdyYW1tYXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyIGV4dGVuZHMgQ01Eb2N1bWVudExvYWRlcgoteyAgICAgCi0gIHByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uOwotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudCBpbmZlcnJlZENNRG9jdW1lbnQ7Ci0gIHByb3RlY3RlZCBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5IGluZmVycmVkR3JhbW1hckZhY3Rvcnk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgY3JlYXRlZENNRG9jdW1lbnRUYWJsZTsKLQotICBwdWJsaWMgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyKERvY3VtZW50IGRvY3VtZW50LCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMoZG9jdW1lbnQsIG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIoRG9jdW1lbnQgZG9jdW1lbnQsIENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzdXBlcihkb2N1bWVudCwgY21Eb2N1bWVudE1hbmFnZXIpOwotICAgIGNyZWF0ZWRDTURvY3VtZW50VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7ICAgICAgICAgICAgIAotICAgIGluZmVycmVkR3JhbW1hckZhY3RvcnkgPSBuZXcgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeSgpOwotICB9ICAgICAKLQotICAgICAKLSAgcHVibGljIHZvaWQgbG9hZENNRG9jdW1lbnRzKCkKLSAgeyAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tbG9hZENNRG9jdW1lbnRzIC0tLS0tLS0tLS0tLSIpOyAgICAgICAgICAKLSAgICBpZiAoaW5mZXJyZWRHcmFtbWFyRmFjdG9yeSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBzdXBlci5sb2FkQ01Eb2N1bWVudHMoKTsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCItLS0gZWxhcHNlZCB0aW1lICgiICsgY291bnQgKyAiKSA9ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSk7Ci0gICAgICAvL2luZmVycmVkR3JhbW1hckZhY3RvcnkuZGVidWdQcmludChjcmVhdGVkQ01Eb2N1bWVudFRhYmxlLnZhbHVlcygpKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgeyAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uID0gaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICAKLSAgICBpZiAoaW5mZXJyZWRDTURvY3VtZW50ID09IG51bGwpCi0gICAgeyAgICAgCi0gICAgICBTdHJpbmcgY2FjaGVLZXkgPSAiaW5mZXJyZWQtZG9jdW1lbnQiOyAgICAgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgaW5mZXJyZWRDTURvY3VtZW50ID0gaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTURvY3VtZW50KCIiKTsgICAvLyROT04tTkxTLTEkCi0gICAgICBjbURvY3VtZW50TWFuYWdlci5hZGRDTURvY3VtZW50KCIiLCAiIiwgY2FjaGVLZXksICJEVEQiLCBpbmZlcnJlZENNRG9jdW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgY3JlYXRlZENNRG9jdW1lbnRUYWJsZS5wdXQoY2FjaGVLZXksIGluZmVycmVkQ01Eb2N1bWVudCk7Ci0gICAgfSAKLQotICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKGluZmVycmVkQ01Eb2N1bWVudCwgZWxlbWVudCwgZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgIAotICAgIGlmIChwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTUNvbnRlbnQoaW5mZXJyZWRDTURvY3VtZW50LCBwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBpbmZlcnJlZENNRG9jdW1lbnQsIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24sIGZhbHNlLCBudWxsKTsKLSAgICB9ICAgICAKLSAgICAgICAKLQotICAgIHZpc2l0Q2hpbGROb2RlcyhlbGVtZW50KTsgICAKLSAgICAgICAgICAgCi0gICAgLy8gcmVzZXQgdGhlICdjdXJyZW50JyBzdGF0ZSB0byBpbml0YWwgdmFsdWVzCi0gICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gIH0KLSAgCi0KLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudE5TKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCBwYXJlbnRJbmZlcnJlZENNRG9jdW1lbnQgPSBpbmZlcnJlZENNRG9jdW1lbnQ7Ci0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gICAgICAgIAotICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IG51bGw7Ci0KLSAgICAvLyBieSBhZGRpbmcgdGhlIGVsZW1lbnQgdG8gdGhlIG5hbWVzcGFjZVRhYmxlLCBoYW5kbGVHcmFtbWFyKCkgd2lsbCBnZXQgY2FsbGVkIGZvciBhbnkgc2NoZW1hIHJlZmVyZW5jZXMKLSAgICBpZiAoZWxlbWVudC5nZXRQYXJlbnROb2RlKCkgIT0gZG9jdW1lbnQpCi0gICAgewotICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICBTdHJpbmcgdXJpID0gbmFtZXNwYWNlVGFibGUuZ2V0VVJJRm9yUHJlZml4KHByZWZpeCk7Ci0KLSAgICBpZiAodXJpID09IG51bGwgJiYgZWxlbWVudC5nZXRQYXJlbnROb2RlKCkgPT0gZG9jdW1lbnQpCi0gICAgewotICAgICAgLy8gd2hlbiB0aGlzIGlzIHRoZSByb290IGVsZW1lbnQKLSAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIGFuIGltcGxpZWQgIm5vIG5hbWVzcGFjZSBzY2hlbWEgbG9jYXRpb24iCi0gICAgICB1cmkgPSAib21taXR0ZWQtbmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotICAgICAgbmFtZXNwYWNlVGFibGUuYWRkTmFtZXNwYWNlSW5mbyhwcmVmaXgsIHVyaSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfSAgCi0KLSAgICAvLyBoZXJlJ3Mgd2hlcmUgd2UgdXBkYXRlIHRoZSBpbmZlcnJlZCBncmFtbWFyIGlmIHJlcXVpcmVkCi0gICAgLy8gCi0gICAgYm9vbGVhbiBjcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbiA9IHRydWU7Ci0gICAgICAgICAgCi0gICAgYm9vbGVhbiBpc0xvY2FsID0gKHVyaSA9PSBudWxsICYmIHByZWZpeCA9PSBudWxsKTsgICAgICAgICAKLSAgICBpZiAoaXNMb2NhbCkKLSAgICB7ICAgICAgICAgIAotICAgICAgaWYgKHBhcmVudEluZmVycmVkQ01Eb2N1bWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyB0aGlzIGlzIGEgbG9jYWwgZWxlbWVudC4uLiBhbmQgdGhlIHBhcmVudCBpcyBub3QgaW5mZXJyZWQgKGUuZykgaXQgaGFzIGEga25vd24gZ3JhbW1hcgotICAgICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhbiBlbGVtZW50IGRlY2xhcmF0aW9uIGZvciB0aGlzIGVsZW1lbnQKLSAgICAgICAgY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24gPSBmYWxzZTsgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdXJpID0gIm9tbWl0dGVkLW5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChjcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7ICAgICAgICAgICAgCi0gICAgICBpZiAoaXNMb2NhbCkKLSAgICAgIHsKLSAgICAgICAgaW5mZXJyZWRDTURvY3VtZW50ID0gcGFyZW50SW5mZXJyZWRDTURvY3VtZW50OwotICAgICAgICBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uID0gaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihpbmZlcnJlZENNRG9jdW1lbnQsIGVsZW1lbnQsIHRydWUpOyAgICAgICAKLSAgICAgIH0gICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gY3JlYXRlQ01Eb2N1bWVudCA9IGZhbHNlOwotCi0gICAgICAgIFN0cmluZyBjYWNoZUtleSA9ICJpbmZlcnJlZC1kb2N1bWVudCIgKyB1cmk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IChDTURvY3VtZW50KWNyZWF0ZWRDTURvY3VtZW50VGFibGUuZ2V0KGNhY2hlS2V5KTsKLQotICAgICAgICBpZiAoaW5mZXJyZWRDTURvY3VtZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGFuIGluZmVycmVkIGRvY3VtZW50IGZvciB0aGlzIHVyaSB5ZXQuLi4gbGV0J3Mgc2VlIG9mIHdlIG5lZWQgb25lCi0gICAgICAgICAgaW50IHN0YXR1cyA9IGNtRG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnRTdGF0dXModXJpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgaWYgKHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX05PVF9MT0FERUQgfHwgc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdGhlIGNhY2hlIGRvZXMgbm90IGNvbnRhaW4gYSAncHJvcGVyJyBDTURvY3VtZW50IGZvciB0aGlzIHVyaQotICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjcmVhdGUgYW4gaW5mZXJyZWQgb25lCi0gICAgICAgICAgICBjcmVhdGVDTURvY3VtZW50ID0gdHJ1ZTsKLSAgICAgICAgICB9IAotICAgICAgICB9IAotICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoY3JlYXRlQ01Eb2N1bWVudCkKLSAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVuY291bnRlcmVkIGVsZW1lbnQgeyIgKyBlbGVtZW50LmdldE5vZGVOYW1lKCkgKyAifSAuLi4gY3JlYXRpbmcgaW5mZXJyZWQgQ01Eb2N1bWVudCBmb3IgIiArIHVyaSk7Ci0gICAgICAgICAgaW5mZXJyZWRDTURvY3VtZW50ID0gaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTURvY3VtZW50KHVyaSk7Ci0gICAgICAgICAgY21Eb2N1bWVudE1hbmFnZXIuYWRkQ01Eb2N1bWVudCh1cmksICIiLCBjYWNoZUtleSwgIlhTRCIsIGluZmVycmVkQ01Eb2N1bWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgIGNyZWF0ZWRDTURvY3VtZW50VGFibGUucHV0KGNhY2hlS2V5LCBpbmZlcnJlZENNRG9jdW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZmVycmVkQ01Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24oaW5mZXJyZWRDTURvY3VtZW50LCBlbGVtZW50LCBmYWxzZSk7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLQotICAgICAgaWYgKHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTUNvbnRlbnQocGFyZW50SW5mZXJyZWRDTURvY3VtZW50LCBwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBpbmZlcnJlZENNRG9jdW1lbnQsIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24sIGlzTG9jYWwsIHVyaSk7Ci0gICAgICB9IAotICAgIH0gICAgICAgICAgICAgICAKLSAgICAgICAgICAKLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7Ci0gICAgICAKLSAgICAvLyByZXNldCB0aGUgJ2N1cnJlbnQnIHN0YXRlIHRvIGluaXRhbCB2YWx1ZXMKLSAgICBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uID0gcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICBpbmZlcnJlZENNRG9jdW1lbnQgPSBwYXJlbnRJbmZlcnJlZENNRG9jdW1lbnQ7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUFjdGlvbkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlBY3Rpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2YTBkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUFjdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLkNNVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFjdGlvbkhlbHBlcgotewotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeUltcGwgbW9kZWxRdWVyeTsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEFjdGlvbiBpbXBsZW1lbnRzIE1vZGVsUXVlcnlBY3Rpb24KLSAgewotICAgIHB1YmxpYyBpbnQga2luZDsKLSAgICBwdWJsaWMgaW50IHN0YXJ0SW5kZXg7Ci0gICAgcHVibGljIGludCBlbmRJbmRleDsKLSAgICBwdWJsaWMgTm9kZSBwYXJlbnQ7Ci0gICAgcHVibGljIENNTm9kZSBjbU5vZGU7Ci0gICAgcHVibGljIE9iamVjdCB1c2VyRGF0YTsKLQotICAgIHB1YmxpYyBBY3Rpb24oaW50IGtpbmQsIE5vZGUgcGFyZW50LCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgIHRoaXMuY21Ob2RlID0gY21Ob2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBBY3Rpb24oaW50IGtpbmQsIE5vZGUgcGFyZW50LCBDTU5vZGUgY21Ob2RlLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICAgIHsKLSAgICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgIHRoaXMuY21Ob2RlID0gY21Ob2RlOwotICAgICAgdGhpcy5zdGFydEluZGV4ID0gc3RhcnRJbmRleDsKLSAgICAgIHRoaXMuZW5kSW5kZXggPSBlbmRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEtpbmQoKQotICAgIHsKLSAgICAgIHJldHVybiBraW5kOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U3RhcnRJbmRleCgpCi0gICAgewotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRFbmRJbmRleCgpCi0gICAgewotICAgICAgcmV0dXJuIGVuZEluZGV4OwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldFBhcmVudCgpCi0gICAgewotICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ01Ob2RlIGdldENNTm9kZSgpCi0gICAgewotICAgICAgcmV0dXJuIGNtTm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKCkKLSAgICB7Ci0gICAgICByZXR1cm4gdXNlckRhdGE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlckRhdGEoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICB1c2VyRGF0YSA9IG9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLQotICBwdWJsaWMgTW9kZWxRdWVyeUFjdGlvbkhlbHBlcihNb2RlbFF1ZXJ5SW1wbCBtb2RlbFF1ZXJ5KQotICB7Ci0gICAgdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgZ2V0QWxsQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgfQotCi0KLSAgLy8gaW5zZXJ0IGFjdGlvbnMKLSAgLy8KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgaWYgKChpbmNsdWRlT3B0aW9ucyAmIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKSAhPSAwKQotICAgIHsKLSAgICAgIGdldEluc2VydEF0dHJpYnV0ZUFjdGlvbnMocGFyZW50LCBlZCwgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gICAgfQotICAgIGluY2x1ZGVPcHRpb25zICY9IH5Nb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUzsKLSAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9uc0F0SW5kZXgocGFyZW50LCBlZCwgaW5kZXgsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9ucyhwYXJlbnQsIGVkLCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGdldEluc2VydEF0dHJpYnV0ZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgLy8gZ2V0IGFjdGlvbnMgZm9yIGVhY2ggaW5zZXJ0YWJsZSBhdHRyaWJ1dGUKLSAgICAvLwotICAgIExpc3QgYXZhaWxhYmxlQXR0cmlidXRlTGlzdCA9IG1vZGVsUXVlcnkuZ2V0QXZhaWxhYmxlQ29udGVudChwYXJlbnQsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdmFpbGFibGVBdHRyaWJ1dGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgaWYgKG1vZGVsUXVlcnkuY2FuSW5zZXJ0KHBhcmVudCwgZWQsIGFkLCAwLCB2YWxpZGl0eUNoZWNraW5nKSkKLSAgICAgIHsKLSAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIHBhcmVudCwgYWQpOwotICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9uc0F0SW5kZXgoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gZ2V0IGFjdGlvbnMgZm9yIGVhY2ggaW5zZXJ0YWJsZSBhdHRyaWJ1dGUKLSAgICAvLwotICAgIGludCBzaXplID0gcGFyZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTsKLSAgICBpZiAoaW5kZXggPD0gc2l6ZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IG1vZGVsUXVlcnkuZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KHBhcmVudCwgZWQpOyAKLSAgICAgIExpc3QgYXZhaWxhYmxlQ2hpbGROb2RlTGlzdCA9IG1vZGVsUXVlcnkuZ2V0QXZhaWxhYmxlQ29udGVudChwYXJlbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0KLSAgICAgIGJvb2xlYW4gaXNTaW1wbGVDaG9pY2UgPSBpc1NpbXBsZUNob2ljZUdyb3VwQ29udGVudE1vZGVsKGVkKTsKLSAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdmFpbGFibGVDaGlsZE5vZGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKWkubmV4dCgpOyAgICAgIAotICAgICAgICBpZiAoaXNTaW1wbGVDaG9pY2UgfHwgbW9kZWxRdWVyeS5jYW5JbnNlcnQocGFyZW50LCBlZCwgY21Ob2RlLCBpbmRleCwgdmFsaWRpdHlDaGVja2luZywgY29udGVudFNwZWNpZmljYXRpb25MaXN0KSkKLSAgICAgICAgewotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJULCBwYXJlbnQsIGNtTm9kZSwgaW5kZXgsIGluZGV4KTsKLSAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgICAgICAgICAgICAgICAKLSAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTaW1wbGVDaG9pY2VHcm91cENvbnRlbnRNb2RlbChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgeyAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIENNTm9kZSBjbU5vZGUgPSBlZC5nZXRDb250ZW50KCk7Ci0gICAgaWYgKGNtTm9kZSAhPSBudWxsICYmIGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUCkKLSAgICB7Ci0gICAgICBDTUdyb3VwIGNtR3JvdXAgPSAoQ01Hcm91cCljbU5vZGU7Ci0gICAgICBpZiAoY21Hcm91cC5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQ0hPSUNFICYmIGNtR3JvdXAuZ2V0TWF4T2NjdXIoKSA9PSAtMSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIENNTm9kZUxpc3QgbGlzdCA9IGNtR3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBpID0gbGlzdC5nZXRMZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGxpc3QuaXRlbShpKS5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGdldEluc2VydENoaWxkTm9kZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBpbnQgc2l6ZSA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCk7Ci0gICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBtb2RlbFF1ZXJ5LmdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChwYXJlbnQsIGVkKTsKLSAgICBMaXN0IGF2YWlsYWJsZUNoaWxkTm9kZUxpc3QgPSBtb2RlbFF1ZXJ5LmdldEF2YWlsYWJsZUNvbnRlbnQocGFyZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCi0gICAgYm9vbGVhbiBpc1NpbXBsZUNob2ljZSA9IGlzU2ltcGxlQ2hvaWNlR3JvdXBDb250ZW50TW9kZWwoZWQpOwotCi0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF2YWlsYWJsZUNoaWxkTm9kZUxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Ob2RlIGNtTm9kZSA9IChDTU5vZGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgZm9yIChpbnQgaSA9IHNpemU7IGkgPj0gMDsgaS0tKQotICAgICAgewotICAgICAgICBpZiAoaXNTaW1wbGVDaG9pY2UgfHwgbW9kZWxRdWVyeS5jYW5JbnNlcnQocGFyZW50LCBlZCwgY21Ob2RlLCBpLCB2YWxpZGl0eUNoZWNraW5nLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpKQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIHBhcmVudCwgY21Ob2RlLCBpLCBpKTsKLSAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhEb2N1bWVudCBwYXJlbnQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICAvLyBnZXQgdGhlIHJvb3QgZWxlbWVudCBhbmQgZG9jdHlwZSBpbmRleCAoaWYgYW55KQotICAgIC8vCi0gICAgaW50IGRvY3R5cGVJbmRleCA9IC0xOwotICAgIERvY3VtZW50VHlwZSBkb2N0eXBlID0gbnVsbDsKLSAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gbnVsbDsKLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgY2hpbGROb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgIGlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcm9vdEVsZW1lbnQgPSAoRWxlbWVudCljaGlsZE5vZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpCi0gICAgICB7Ci0gICAgICAgIGRvY3R5cGUgPSAoRG9jdW1lbnRUeXBlKWNoaWxkTm9kZTsKLSAgICAgICAgZG9jdHlwZUluZGV4ID0gaTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBtYWtlIHN1cmUgdGhhdCByb290IGVsZW1lbnRzIGFyZSBvbmx5IGFkZGVkIGFmdGVyIHRoZSBkb2N0eXBlIChpZiBhbnkpCi0gICAgaWYgKHJvb3RFbGVtZW50ID09IG51bGwgJiYgaW5kZXggPiBkb2N0eXBlSW5kZXgpCi0gICAgewotICAgICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gY21Eb2N1bWVudC5nZXRFbGVtZW50cygpOwotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSBtYXAuaXRlbShpKTsKLQotICAgICAgICBib29sZWFuIGNhbkFkZCA9IHRydWU7Ci0gICAgICAgIGlmICh2YWxpZGl0eUNoZWNraW5nID09IE1vZGVsUXVlcnkuVkFMSURJVFlfU1RSSUNUKQotICAgICAgICB7Ci0gICAgICAgICAgY2FuQWRkID0gZG9jdHlwZSA9PSBudWxsIHx8IGRvY3R5cGUuZ2V0TmFtZSgpLmVxdWFscyhjbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2FuQWRkKQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIHBhcmVudCwgY21Ob2RlLCBpbmRleCwgaW5kZXgpOwotICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9uVGFibGUoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgdmFsaWRpdHlDaGVja2luZywgSGFzaHRhYmxlIGFjdGlvblRhYmxlKQotICB7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGdldFJlcGxhY2VBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUgbWF0Y2hNb2RlbE5vZGUgPSBtb2RlbFF1ZXJ5LmdldFZhbGlkYXRvcigpLmdldE1hdGNoTW9kZWwoZWQsIHBhcmVudCk7Ci0gICAgaWYgKG1hdGNoTW9kZWxOb2RlICE9IG51bGwpCi0gICAgewotICAgICAgTWF0Y2hNb2RlbFZpc2l0b3IgdmlzaXRvciA9IG5ldyBNYXRjaE1vZGVsVmlzaXRvcihwYXJlbnQsIGFjdGlvbkxpc3QpOwotICAgICAgdmlzaXRvci52aXNpdE1hdGNoTW9kZWxOb2RlKG1hdGNoTW9kZWxOb2RlKTsKLSAgICB9ICAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldFJlcGxhY2VBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBzZWxlY3RlZENoaWxkcmVuLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBpbnRbXSByYW5nZSA9IGdldFJhbmdlKHBhcmVudCwgc2VsZWN0ZWRDaGlsZHJlbik7Ci0gICAgaWYgKHJhbmdlICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChpc0NvbnRpZ3VvdXMocGFyZW50LCByYW5nZSwgc2VsZWN0ZWRDaGlsZHJlbikpCi0gICAgICB7Ci0gICAgICAgIExpc3QgdGVtcExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGdldFJlcGxhY2VBY3Rpb25zKHBhcmVudCwgZWQsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCB0ZW1wTGlzdCk7Ci0gICAgICAgIGlmICgoaW5jbHVkZU9wdGlvbnMgJiBNb2RlbFF1ZXJ5LklOQ0xVREVfRU5DTE9TSU5HX1JFUExBQ0VfQUNUSU9OUykgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUFjdGlvbnNOb3RDb250YWluaW5nUmFuZ2UodGVtcExpc3QsIHJhbmdlWzBdLCByYW5nZVsxXSk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlQWN0aW9uc05vdE1hdGNoaW5nUmFuZ2UodGVtcExpc3QsIHJhbmdlWzBdLCByYW5nZVsxXSk7ICAgIAotICAgICAgICB9Ci0gICAgICAgIGFjdGlvbkxpc3QuYWRkQWxsKHRlbXBMaXN0KTsKLSAgICAgIH0KLSAgICB9ICAgCi0gICAgCi0gICAgaWYgKHNlbGVjdGVkQ2hpbGRyZW4uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgTm9kZSBub2RlID0gKE5vZGUpc2VsZWN0ZWRDaGlsZHJlbi5nZXQoMCk7Ci0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsgICAgICAgCi0gICAgICAgIENNTm9kZSBjaGlsZEVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihjaGlsZEVsZW1lbnQpOwotICAgICAgICBpZiAoY2hpbGRFZCAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgCi0KLSAgICAgICAgICBDTU5vZGUgY2hpbGRPcmlnaW49IG1vZGVsUXVlcnkuZ2V0T3JpZ2luKGNoaWxkRWxlbWVudCk7Ci0KLSAgICAgICAgICBDTU5vZGVMaXN0IGNtTm9kZUxpc3QgPSBjaGlsZE9yaWdpbiAhPSBudWxsID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ01Ob2RlTGlzdCljaGlsZE9yaWdpbi5nZXRQcm9wZXJ0eSgiU3Vic3RpdHV0aW9uR3JvdXAiKSA6IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5vZGVMaXN0KWNoaWxkRWQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgIGlmIChjbU5vZGVMaXN0ICE9IG51bGwgJiYgY21Ob2RlTGlzdC5nZXRMZW5ndGgoKSA+IDEpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGludCByZXBsYWNlSW5kZXggPSBnZXRJbmRleChwYXJlbnQsIGNoaWxkRWxlbWVudCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2hpbGRFZE5hbWUgPSBjaGlsZEVkLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNtTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICAgIHsgICAgICAgICAKLSAgICAgICAgICAgICAgQ01Ob2RlIHN1YnN0aXR1dGlvbiA9IGNtTm9kZUxpc3QuaXRlbShpKTsKLSAgICAgICAgICAgICAgaWYgKCFzdWJzdGl0dXRpb24uZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoY2hpbGRFZE5hbWUpICYmICFCb29sZWFuLlRSVUUuZXF1YWxzKHN1YnN0aXR1dGlvbi5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uUkVQTEFDRSwgcGFyZW50LCBjbU5vZGVMaXN0Lml0ZW0oaSksIHJlcGxhY2VJbmRleCwgcmVwbGFjZUluZGV4KTsKLSAgICAgICAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgCi0gICAgfQotICB9ICAgICAKLSAgICAgICAgICAgCi0gIAotICAvLyByZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdGVkIG5vZGVzIGFyZSBjb250aWd1b3VzCi0gIC8vICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb250aWd1b3VzKEVsZW1lbnQgcGFyZW50LCBpbnRbXSByYW5nZSwgTGlzdCBzZWxlY3RlZE5vZGVMaXN0KQotICB7ICAgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkvLyBpc3N1ZTogbm9kZUxpc3RMZW5ndGggd2FzIG5ldmVyIHJlYWQsIGJ1dCBpbiB0aGVvcnksIAotCS8vIG5vZGVsTGlzdC5nZXRMZW5ndGgoKSBtaWdodCBjYXVzZSBzb21lIGNsZWFyaW5nIG9mIGNhY2hlZCAKLQkvLyBkYXRhLCBvciBzb21ldGhpbmcsIHNvIGxlYXZpbmcgaW4gYSBwb3RlbnRpYWwgbWVhbmluZ2xlc3MgY2FsbCwgZm9yIG5vdy4KLSAgICAvL2ludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCW5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSByYW5nZVswXTsgaSA8IHJhbmdlWzFdOyBpKyspCi0gICAgeyAgICAgICAKLSAgICAgIE5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7ICAgIAotICAgICAgaWYgKCFpc1doaXRlc3BhY2VOb2RlKG5vZGUpICYmICFzZWxlY3RlZE5vZGVMaXN0LmNvbnRhaW5zKG5vZGUpKQotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfSAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAKLSAKLSAgcHJvdGVjdGVkIGludFtdIGdldFJhbmdlKEVsZW1lbnQgcGFyZW50LCBMaXN0IGxpc3QpCi0gIHsKLSAgICBpbnRbXSByZXN1bHQgPSBudWxsOwotICAgIGludCBmaXJzdCA9IC0xOwotICAgIGludCBsYXN0ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKQotICAgIHsgICAgICAgCi0gICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOyAgICAKLSAgICAgIGlmIChsaXN0LmNvbnRhaW5zKG5vZGUpKQotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgZmlyc3QgPSAoZmlyc3QgPT0gLTEpID8gaSA6IE1hdGgubWluKGZpcnN0LCBpKTsgICAgICAgIAotICAgICAgICBsYXN0ID0gTWF0aC5tYXgobGFzdCwgaSk7Ci0gICAgICB9ICAgIAotICAgIH0KLSAgIAotICAgIGlmIChmaXJzdCAhPSAtMSAmJiBsYXN0IT0gLTEpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IG5ldyBpbnRbMl07Ci0gICAgICByZXN1bHRbMF0gPSBmaXJzdDsKLSAgICAgIHJlc3VsdFsxXSA9IGxhc3Q7Ci0gICAgfSAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1doaXRlc3BhY2VOb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHJldHVybiBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYKLSAgICAgICAgICAgbm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMDsKLSAgfSAKLQotCi0gIHByb3RlY3RlZCBpbnQgZ2V0SW5kZXgoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkKQotICB7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgaW5kZXggPSAtMTsKLSAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChub2RlTGlzdC5pdGVtKGkpID09IGNoaWxkKQotICAgICAgewotICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0gICAgICAgICAgICAgICAgICAgIAotCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBY3Rpb25Db250YWluaW5nUmFuZ2UoTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24sIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gIHsKLSAgICBpbnQgYWN0aW9uU3RhcnRJbmRleCA9IGFjdGlvbi5nZXRTdGFydEluZGV4KCk7Ci0gICAgaW50IGFjdGlvbkVuZEluZGV4ID0gYWN0aW9uLmdldEVuZEluZGV4KCk7Ci0KLSAgICByZXR1cm4gKGFjdGlvblN0YXJ0SW5kZXggPD0gc3RhcnRJbmRleCAmJgotICAgICAgICAgICAgYWN0aW9uRW5kSW5kZXggPj0gZW5kSW5kZXgpOwotICB9IAotICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjdGlvbk1hdGNoaW5nUmFuZ2UoTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24sIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gIHsKLSAgICBpbnQgYWN0aW9uU3RhcnRJbmRleCA9IGFjdGlvbi5nZXRTdGFydEluZGV4KCk7Ci0gICAgaW50IGFjdGlvbkVuZEluZGV4ID0gYWN0aW9uLmdldEVuZEluZGV4KCk7Ci0gICAgcmV0dXJuIChhY3Rpb25TdGFydEluZGV4ID09IHN0YXJ0SW5kZXggJiYgICAgICAgIAotICAgICAgICAgICAgYWN0aW9uRW5kSW5kZXggPT0gZW5kSW5kZXgpOwotICB9IAotICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBY3Rpb25zTm90Q29udGFpbmluZ1JhbmdlKExpc3QgYWN0aW9uTGlzdCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgewotICAgIGZvciAoaW50IGkgPSBhY3Rpb25MaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIE1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pYWN0aW9uTGlzdC5nZXQoaSk7Ci0gICAgICBpZiAoIWlzQWN0aW9uQ29udGFpbmluZ1JhbmdlKGFjdGlvbiwgc3RhcnRJbmRleCwgZW5kSW5kZXgpKQotICAgICAgewotICAgICAgICBhY3Rpb25MaXN0LnJlbW92ZShpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUFjdGlvbnNOb3RNYXRjaGluZ1JhbmdlKExpc3QgYWN0aW9uTGlzdCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgewotICAgIGZvciAoaW50IGkgPSBhY3Rpb25MaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIE1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pYWN0aW9uTGlzdC5nZXQoaSk7Ci0gICAgICBpZiAoIWlzQWN0aW9uTWF0Y2hpbmdSYW5nZShhY3Rpb24sIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSkKLSAgICAgIHsKLSAgICAgICAgYWN0aW9uTGlzdC5yZW1vdmUoaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hdGNoTW9kZWxWaXNpdG9yCi0gIHsKLSAgICBpbnQgaW5kZW50OwotICAgIGludCBlbGVtZW50SW5kZXg7Ci0gICAgTm9kZSBwYXJlbnQ7Ci0gICAgTGlzdCBhY3Rpb25MaXN0OwotCi0gICAgcHVibGljIE1hdGNoTW9kZWxWaXNpdG9yKE5vZGUgcGFyZW50LCBMaXN0IGFjdGlvbkxpc3QpCi0gICAgewotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmFjdGlvbkxpc3QgPSBhY3Rpb25MaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5kZXhPZk5leHRFbGVtZW50KGludCBzdGFydCkKLSAgICB7Ci0gICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBpbnQgbGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICBpbnQgcmVzdWx0ID0gbGVuZ3RoOwotICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TWF0Y2hNb2RlbE5vZGUoQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUgbWF0Y2hNb2RlbE5vZGUpCi0gICAgewotICAgICAgaW50IHN0YXJ0SW5kZXggPSBpbmRleE9mTmV4dEVsZW1lbnQoZWxlbWVudEluZGV4KTsKLQotICAgICAgLy9TdHJpbmcgY21Ob2RlTmFtZSA9IG1hdGNoTW9kZWxOb2RlLmNtTm9kZSAhPSBudWxsID8gbWF0Y2hNb2RlbE5vZGUuY21Ob2RlLmdldE5vZGVOYW1lKCkgOiAibnVsbCI7Ci0gICAgICAvL3ByaW50SW5kZW50ZWQoaW5kZW50LCAiK01hdGNoTW9kZWxOb2RlIDogIiArIGNtTm9kZU5hbWUgKyAgIiAiICsgc3RhcnRJbmRleCk7Ci0KLSAgICAgIGluZGVudCArPSAyOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hdGNoTW9kZWxOb2RlLmNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSBjaGlsZCA9IChDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0TWF0Y2hNb2RlbE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgaW5kZW50IC09IDI7Ci0KLSAgICAgIGlmIChtYXRjaE1vZGVsTm9kZS5jbU5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IG5vZGVUeXBlID0gbWF0Y2hNb2RlbE5vZGUuY21Ob2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICAgIGlmIChub2RlVHlwZSA9PSBDTU5vZGUuR1JPVVApCi0gICAgICAgIHsKLSAgICAgICAgICBDTUdyb3VwIGdyb3VwID0gKENNR3JvdXApbWF0Y2hNb2RlbE5vZGUuY21Ob2RlOwotICAgICAgICAgIGlmIChncm91cC5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQ0hPSUNFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZFJlcGxhY2VBY3Rpb25zKG1hdGNoTW9kZWxOb2RlLCBncm91cCwgc3RhcnRJbmRleCwgZWxlbWVudEluZGV4IC0gMSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5vZGVUeXBlID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudEluZGV4ID0gc3RhcnRJbmRleCArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgLy9wcmludEluZGVudGVkKGluZGVudCwgIi1NYXRjaE1vZGVsTm9kZSA6ICIgKyBjbU5vZGVOYW1lICsgICIgIiArIChlbGVtZW50SW5kZXggLSAxKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVwbGFjZUFjdGlvbnMoQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUgbWF0Y2hNb2RlbE5vZGUsIENNR3JvdXAgZ3JvdXAsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gICAgewotICAgICAgQ01Ob2RlIGV4Y2x1ZGVDTU5vZGUgPSBudWxsOwotICAgICAgaWYgKG1hdGNoTW9kZWxOb2RlLmNoaWxkcmVuLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlIGNoaWxkID0gKENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlKW1hdGNoTW9kZWxOb2RlLmNoaWxkcmVuLmdldCgwKTsKLSAgICAgICAgZXhjbHVkZUNNTm9kZSA9IGNoaWxkLmNtTm9kZTsKLSAgICAgIH0KLQotICAgICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGdyb3VwLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGFsdGVybmF0aXZlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgICAgaWYgKGFsdGVybmF0aXZlICE9IGV4Y2x1ZGVDTU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLlJFUExBQ0UsIHBhcmVudCwgYWx0ZXJuYXRpdmUsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKLSAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy9wdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRJbmRlbnRlZChpbnQgaW5kZW50LCBTdHJpbmcgc3RyaW5nKQotICAvL3sKLSAgLy8gIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0gIC8vICB7Ci0gIC8vICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiKTsKLSAgLy8gIH0KLSAgLy8gIFN5c3RlbS5vdXQucHJpbnRsbihzdHJpbmcpOwotICAvL30KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNmQ4ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLkNNRGF0YVR5cGVWYWx1ZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuRE9NVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZVRhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBsYXJnZSBwb3J0aW9uIG9mIHRoZSBNb2RlbFF1ZXJ5IGludGVyZmFjZXMuCi0gKiBTb21lIHdvcmsgaXMgZGVsZWdhdGVkIHRvIHRoZSBET01IZWxwZXIsIENNRG9jdW1lbnRNYW5hZ2VyLCBhbmQgRE9NVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUltcGwgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Ci17Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcjsKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlBY3Rpb25IZWxwZXIgbW9kZWxRdWVyeUFjdGlvbkhlbHBlcjsKLSAgcHJvdGVjdGVkIERPTVZhbGlkYXRvciB2YWxpZGF0b3I7ICAgCi0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwgZXh0ZW5zaW9uTWFuYWdlcjsgICAKLSAgcHJvdGVjdGVkIENNRGF0YVR5cGVWYWx1ZUhlbHBlciB2YWx1ZUhlbHBlcjsKLSAgcHJvdGVjdGVkIGludCBlZGl0TW9kZSA9IEVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1Q7Ci0KLSAgcHVibGljIE1vZGVsUXVlcnlJbXBsKE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5tb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciA9IG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIgPSBjcmVhdGVNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKCk7Ci0gICAgdmFsaWRhdG9yID0gbmV3IERPTVZhbGlkYXRvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBleHRlbnNpb25NYW5hZ2VyID0gbmV3IE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbCgpOwotICAgIHZhbHVlSGVscGVyID0gbmV3IENNRGF0YVR5cGVWYWx1ZUhlbHBlcigpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBpbnQgZ2V0RWRpdE1vZGUoKQotICB7Ci0gICAgcmV0dXJuIGVkaXRNb2RlOwotICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBzZXRFZGl0TW9kZShpbnQgZWRpdE1vZGUpCi0gIHsKLSAgICB0aGlzLmVkaXRNb2RlID1lZGl0TW9kZTsKLSAgfQotCi0KLSAgLy8gZmFjdG9yeSBtZXRob2RzCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyIGNyZWF0ZU1vZGVsUXVlcnlBY3Rpb25IZWxwZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKHRoaXMpOwotICB9IAotCi0gIHB1YmxpYyBET01WYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0gIH0KLQotICBwdWJsaWMgQ01Ob2RlIGdldENNTm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q01Ob2RlKG5vZGUpOwotICB9Ci0KLSAgcHVibGljIENNRGF0YVR5cGUgZ2V0Q01EYXRhVHlwZShUZXh0IHRleHQpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q01EYXRhVHlwZSh0ZXh0KTsKLSAgfQotCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gIH0KLQotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICB9Ci0gICAKLSAgcHVibGljIENNRG9jdW1lbnRNYW5hZ2VyIGdldENNRG9jdW1lbnRNYW5hZ2VyKCkKLSAgewotICAgIENNRG9jdW1lbnRNYW5hZ2VyIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB4bWxBc3NvY2lhdGlvblByb3ZpZGVyID0gKFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0gICAgICByZXN1bHQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgICAgCi0KLSAgLyoqCi0gICAqIEBkZXByZWN0ZWQgLSB1c2UgMyBhcmcgdmVyc2lvbiBiZWxvdwotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudExpc3QoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdXJpKQotICB7ICAgICAgICAKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRMaXN0KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgTGlzdCByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgICAKLSAgICAgIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgeG1sQXNzb2NpYXRpb25Qcm92aWRlciA9IChYTUxBc3NvY2lhdGlvblByb3ZpZGVyKW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgICAKLSAgICAgIC8vIHRvZG8uLi4gcmV2aXN0Li4uIGhhbmRsZSBlYWNoICMjdGhpbmcgZXhwbGljaXRseQotICAgICAgLy8gICAgICAgICAgCi0gICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHVyaSA9ICIjI2FueSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0gICAgICAgICAgICAgICAKLQotICAgICAgaWYgKHVyaS5lcXVhbHMoIiMjdGFyZ2V0TmFtZXNwYWNlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICByZXN1bHQuYWRkKGNtRG9jdW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh1cmkuZXF1YWxzKCIjI2FueSIpIHx8IHVyaS5lcXVhbHMoIiMjb3RoZXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgZXhjbHVkZWRVUkkgPSBudWxsOwotICAgICAgICBpZiAodXJpLmVxdWFscygiIyNvdGhlciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCllZC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZXhjbHVkZWRVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGNvbnNpZGVyIGFsbCBvZiB0aGUgc2NoZW1hIHJlbGF0ZWQgdG8gdGhpcyBkb2N1bWVudAotICAgICAgICAvLwotICAgICAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgICAgICBMaXN0IGxpc3QgPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOwotICAgICAgICAgIGlmIChpbmZvLnVyaSAhPSBudWxsICYmICFpbmZvLnVyaS5lcXVhbHMoZXhjbHVkZWRVUkkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNRG9jdW1lbnQgZG9jdW1lbnQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnQoaW5mby51cmksIGluZm8ubG9jYXRpb25IaW50LCAiWFNEIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQuYWRkKGRvY3VtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgIAotICAgICAgICBDTURvY3VtZW50IGRvY3VtZW50ID0geG1sQXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTURvY3VtZW50KGVsZW1lbnQsIHVyaSk7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFkZChkb2N1bWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgCi0KLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB4bWxBc3NvY2lhdGlvblByb3ZpZGVyID0gKFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0gICAgICByZXN1bHQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnQoZWxlbWVudCwgdXJpKTsKLSAgICB9Ci0gICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLnByaW50bG4oIk1vZGVsUXVlcnlJbXBsLmdldENNRG9jdW1lbnQoIiArIGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSArICIsICIgKyB1cmkgKyAiKSA9ICIgKyByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRWYWxpZChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIHJldHVybiBpc0NvbnRlbnRWYWxpZChlZCwgZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRWYWxpZChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAgIAotICAgIGlmIChlZCAhPSBudWxsKQotICAgIHsgCi0gICAgICAvLyBmaXJzdCBjaGVjayB0byBzZWUgaWYgYWxsIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50Ci0gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKW1hcC5pdGVtKGkpOwotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhZCwgZWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIGlmIChhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAKLSAgICAgICAgICAgQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBub3cgY2hlY2sgdG8gc2VlIG9mIHRoZSBjaGlsZHJlbiB2YWxpZGF0ZSBwcm9wZXJseQotICAgICAgLy8KLSAgICAgIGlmIChyZXN1bHQpIAotICAgICAgewotICAgICAgICBDTU5vZGVbXSBvcmlnaW5BcnJheSA9IGdldE9yaWdpbkFycmF5KGVsZW1lbnQpOwotICAgICAgICByZXN1bHQgPSBvcmlnaW5BcnJheSAhPSBudWxsICYmIG9yaWdpbkFycmF5Lmxlbmd0aCA9PSBlbGVtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIENNTm9kZSBnZXRPcmlnaW4oTm9kZSBub2RlKQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgLy8gdG9kby4uLiBtYWtlIHN1cmUgcGFyZW50IGlzIHJpZ2h0Ci0gICAgLy8KLSAgICBOb2RlIHBhcmVudE5vZGUgPSBnZXRQYXJlbnRPck93bmVyTm9kZShub2RlKTsKLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnROb2RlOwotICAgICAgQ01Ob2RlW10gYXJyYXkgPSBnZXRPcmlnaW5BcnJheShwYXJlbnRFbGVtZW50KTsKLSAgICAgIGlmIChhcnJheSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgaW5kZXggPSBnZXRJbmRleE9mTm9kZShwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKSwgbm9kZSk7Ci0gICAgICAgIGlmIChpbmRleCA8IGFycmF5Lmxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGFycmF5W2luZGV4XTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgcmV0dXJuIChlZCAhPSBudWxsKSA/IGdldFZhbGlkYXRvcigpLmdldE9yaWdpbkFycmF5KGVkLCBlbGVtZW50KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEluZGV4T2ZOb2RlKE5vZGVMaXN0IG5vZGVMaXN0LCBOb2RlIG5vZGUpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgaWYgKG5vZGVMaXN0Lml0ZW0oaSkgPT0gbm9kZSkKLSAgICAgICB7Ci0gICAgICAgICByZXN1bHQgPSBpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIENNTm9kZSAnbWV0YSBkYXRhJyB0aGF0IG1heSBiZSBwb3RlbnRpYWxseSBhZGRlZCB0byB0aGUgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKQotICB7Ci0gICAgQXZhaWxhYmxlQ29udGVudENNVmlzaXRvciB2aXNpdG9yID0gbmV3IEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoZWxlbWVudCwgZWQpOwotICAgIExpc3QgbGlzdCA9IHZpc2l0b3IuY29tcHV0ZUF2YWlsYWJsZUNvbnRlbnQoaW5jbHVkZU9wdGlvbnMpOwotICAgIGlmIChleHRlbnNpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBleHRlbnNpb25NYW5hZ2VyLmZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KGxpc3QsIGVsZW1lbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0gIAotCi0KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KEVsZW1lbnQgcGFyZW50LCBDTU5vZGUgY21Ob2RlLCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KTsKLSAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjYW5JbnNlcnQocGFyZW50LCBlZCwgY21Ob2RlLCBpbmRleCwgdmFsaWRpdHlDaGVja2luZyk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIENNTm9kZSBjbU5vZGUsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICByZXR1cm4gY2FuSW5zZXJ0KHBhcmVudCwgZWQsIGNtTm9kZSwgaW5kZXgsIHZhbGlkaXR5Q2hlY2tpbmcsIG51bGwpOwotICB9ICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuSW5zZXJ0KEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgQ01Ob2RlIGNtTm9kZSwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZywgT2JqZWN0IHJldXNlYWJsZURhdGEpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgc3dpdGNoIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04gOgotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbU5vZGUsIHBhcmVudCwgbnVsbCk7Ci0gICAgICAgIHJlc3VsdCA9IHBhcmVudC5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZU5hbWUpID09IG51bGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0gICAgICBjYXNlIENNTm9kZS5HUk9VUCA6Ci0gICAgICB7Ci0gICAgICAgIGlmICh2YWxpZGl0eUNoZWNraW5nID09IFZBTElESVRZX1NUUklDVCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAvLyBjcmVhdGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBudWxsOwotICAgICAgICAgIGlmIChyZXVzZWFibGVEYXRhICE9IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IChMaXN0KXJldXNlYWJsZURhdGE7Ci0gICAgICAgICAgfSAgICAKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IGdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChwYXJlbnQsIGVkKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRhdG9yKCkuY2FuSW5zZXJ0KGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGluZGV4LCBjbU5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuREFUQV9UWVBFIDoKLSAgICAgIHsKLSAgICAgICAgaW50IGNvbnRlbnRUeXBlID0gZWQuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgcmVzdWx0ID0gKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwKLSAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdCA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgTGlzdCBjbU5vZGVMaXN0LCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgLy8gdG9kbwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoTm9kZSBub2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsgICAgICAKLSAgICBpZiAodmFsaWRpdHlDaGVja2luZyA9PSBWQUxJRElUWV9TVFJJQ1QpCi0gICAgewotICAgICAgaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotICAgICAgc3dpdGNoIChub2RlVHlwZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFOgotICAgICAgICB7Ci0gICAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oKEF0dHIpbm9kZSk7Ci0gICAgICAgICAgaWYgKGFkICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gKGFkLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICBpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KXBhcmVudE5vZGU7Ci0gICAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KHBhcmVudEVsZW1lbnQsIGVkKTsKLSAgICAgICAgICAgICAgaW50IGluZGV4ID0gZ2V0SW5kZXhPZk5vZGUocGFyZW50RWxlbWVudC5nZXRDaGlsZE5vZGVzKCksIG5vZGUpOwotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS5jYW5SZW1vdmUoZWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoTGlzdCBub2RlTGlzdCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLSAgICBpZiAodmFsaWRpdHlDaGVja2luZyA9PSBWQUxJRElUWV9TVFJJQ1QpCi0gICAgewotICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gbnVsbDsKLSAgICAgIExpc3QgY2hpbGRMaXN0ID0gbnVsbDsKLQotICAgICAgZm9yIChJdGVyYXRvciBpID0gbm9kZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpaS5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSBnZXRQYXJlbnRPck93bmVyRWxlbWVudChub2RlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnRFbGVtZW50ICE9IGdldFBhcmVudE9yT3duZXJFbGVtZW50KG5vZGUpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBwYXJlbnQgYXJlIHRoZSBzYW1lCi0gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgICAgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWNhblJlbW92ZShub2RlLCB2YWxpZGl0eUNoZWNraW5nKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hpbGRMaXN0ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRMaXN0ID0gbm9kZUxpc3RUb0xpc3QocGFyZW50RWxlbWVudC5nZXRDaGlsZE5vZGVzKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjaGlsZExpc3QucmVtb3ZlKG5vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXN1bHQgJiYgY2hpbGRMaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0gICAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IGdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChjaGlsZExpc3QsIGVkKTsKLSAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS5pc1ZhbGlkKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNhblJlcGxhY2UoRWxlbWVudCBwYXJlbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIENNTm9kZSBjbU5vZGUsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBMaXN0IGNtTm9kZUxpc3QsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gICAgIAotICAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBleHBlcmltZW50YWwuLi4gdXNlIGF0IHlvdXIgb3duIHJpc2sKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGNhbldyYXAoRWxlbWVudCBjaGlsZEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHdyYXBFbGVtZW50LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsgIAotICAgIE5vZGUgcGFyZW50Tm9kZSA9IGNoaWxkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnROb2RlOyAgICAgIAotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLSAgICAgIGlmIChwYXJlbnRFZCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmICh2YWxpZGl0eUNoZWNraW5nID09IFZBTElESVRZX1NUUklDVCkKLSAgICAgICAgewotICAgICAgICAgIGludCBpbmRleCA9IGdldEluZGV4T2ZOb2RlKHBhcmVudEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLCBjaGlsZEVsZW1lbnQpOwotCi0gICAgICAgICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBnZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QocGFyZW50RWxlbWVudCwgcGFyZW50RWQpOwotICAgICAgICAgIExpc3Qgc3ViTGlzdCA9IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdC5zdWJMaXN0KGluZGV4LCBpbmRleCArIDEpOwotICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkYXRvcigpLmNhblJlcGxhY2UocGFyZW50RWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW5kZXgsIGluZGV4LCB3cmFwRWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS5pc1ZhbGlkKHdyYXBFbGVtZW50LCBzdWJMaXN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0gICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydEFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnQsIGVkLCBpbmRleCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhEb2N1bWVudCBwYXJlbnQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldEluc2VydEFjdGlvbnMocGFyZW50LCBjbURvY3VtZW50LCBpbmRleCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldFJlcGxhY2VBY3Rpb25zKHBhcmVudCwgZWQsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGdldFJlcGxhY2VBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBzZWxlY3RlZENoaWxkcmVuLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldFJlcGxhY2VBY3Rpb25zKHBhcmVudCwgZWQsIHNlbGVjdGVkQ2hpbGRyZW4sIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydENoaWxkTm9kZUFjdGlvblRhYmxlKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIEhhc2h0YWJsZSBhY3Rpb25UYWJsZSkKLSAgewotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9uVGFibGUocGFyZW50LCBlZCwgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uVGFibGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0QWN0aW9uVGFibGUoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nLCBIYXNodGFibGUgYWN0aW9uVGFibGUpCi0gIHsKLSAgICAvL21vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0QWxsQWN0aW9ucyhwYXJlbnQsIGVkLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgfQotCi0KLSAgLy8gc29tZSBoZWxwZXIgbWV0aG9kcwotICAvLwotICBwcm90ZWN0ZWQgTm9kZSBnZXRQYXJlbnRPck93bmVyTm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSA/Ci0gICAgICAgICAgICgoQXR0cilub2RlKS5nZXRPd25lckVsZW1lbnQoKSA6Ci0gICAgICAgICAgIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0UGFyZW50T3JPd25lckVsZW1lbnQoTm9kZSBub2RlKQotICB7Ci0gICAgTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnRPck93bmVyTm9kZShub2RlKTsKLSAgICByZXR1cm4gKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSA/IChFbGVtZW50KXBhcmVudCA6IG51bGw7Ci0gIH0KLSAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBMaXN0IG5vZGVMaXN0VG9MaXN0KE5vZGVMaXN0IG5vZGVMaXN0KQotICB7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3Ioc2l6ZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdi5hZGQobm9kZUxpc3QuaXRlbShpKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9ICAgCi0gICAKLSAgLyoqCi0gIHByb3RlY3RlZCBMaXN0IGdldENNTm9kZUxpc3QoTm9kZUxpc3Qgbm9kZUxpc3QpCi0gIHsKLSAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcihzaXplKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2LmFkZChnZXRDTU5vZGUobm9kZUxpc3QuaXRlbShpKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0gICovICAKLQotICBwdWJsaWMgY2xhc3MgQXZhaWxhYmxlQ29udGVudENNVmlzaXRvciBleHRlbmRzIENNVmlzaXRvcgotICB7Ci0gICAgcHVibGljIEhhc2h0YWJsZSBjaGlsZE5vZGVUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwdWJsaWMgSGFzaHRhYmxlIGF0dHJpYnV0ZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHB1YmxpYyBFbGVtZW50IHJvb3RFbGVtZW50OwotICAgIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiByb290RWxlbWVudERlY2xhcmF0aW9uOyAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jvb3RWaXNpdGVkOwotICAgIHByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVTZXF1ZW5jZUdyb3VwczsKLQotICAgIHB1YmxpYyBBdmFpbGFibGVDb250ZW50Q01WaXNpdG9yKEVsZW1lbnQgcm9vdEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMucm9vdEVsZW1lbnQgPSByb290RWxlbWVudDsKLSAgICAgIHRoaXMucm9vdEVsZW1lbnREZWNsYXJhdGlvbiA9IHJvb3RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRLZXkoQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICBTdHJpbmcga2V5ID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgICAgIHsgICAKLSAgICAgICAgICBrZXkgPSAiWyIgKyBuYW1lc3BhY2VVUkkgKyAiXSIgKyBrZXk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4ga2V5OwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb1RhYmxlKEhhc2h0YWJsZSB0YWJsZSwgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbm9kZU5hbWUgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIGlmIChub2RlTmFtZSAhPSBudWxsICYmIG5vZGVOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIHsgIAotICAgICAgICB0YWJsZS5wdXQoZ2V0S2V5KGNtTm9kZSksIGNtTm9kZSk7Ci0gICAgICB9ICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBjb21wdXRlQXZhaWxhYmxlQ29udGVudChpbnQgaW5jbHVkZU9wdGlvbnMpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOyAgCi0KLSAgICAgIGludCBjb250ZW50VHlwZSA9IHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgIGluY2x1ZGVTZXF1ZW5jZUdyb3VwcyA9ICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX1NFUVVFTkNFX0dST1VQUykgIT0gMCk7Ci0gICAgICB2aXNpdENNTm9kZShyb290RWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgIAotICAgICAgaWYgKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfQVRUUklCVVRFUykgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgdi5hZGRBbGwoYXR0cmlidXRlVGFibGUudmFsdWVzKCkpOwotICAgICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG5pbGxhYmxlQXR0cmlidXRlID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pcm9vdEVsZW1lbnREZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25pbGxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKG5pbGxhYmxlQXR0cmlidXRlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB2LmFkZChuaWxsYWJsZUF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotCi0gICAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9DSElMRF9OT0RFUykgIT0gMCkKLSAgICAgIHsgICAgICAKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgdi5hZGRBbGwoY2hpbGROb2RlVGFibGUudmFsdWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSkKLSAgICAgICAgeyAgICAgIAotICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9ICAoQ01Eb2N1bWVudClyb290RWxlbWVudERlY2xhcmF0aW9uLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gY21Eb2N1bWVudC5nZXRFbGVtZW50cygpOyAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdi5hZGQoaS5uZXh0KCkpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fAotICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBIHx8IAotICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKQotICAgICAgICB7Ci0gICAgICAgICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0RGF0YVR5cGUoKTsKLSAgICAgICAgICBpZiAoZGF0YVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2LmFkZChkYXRhVHlwZSk7Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdjsKLSAgICB9ICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgICB7ICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgdXJpID0gYW55RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gZ2V0Q01Eb2N1bWVudExpc3Qocm9vdEVsZW1lbnQsIHJvb3RFbGVtZW50RGVjbGFyYXRpb24sIHVyaSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ01Eb2N1bWVudCBjbWRvY3VtZW50ID0gKENNRG9jdW1lbnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAoY21kb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbWRvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgICAgICAgaW50IHNpemUgPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBDTU5vZGUgZWQgPSBtYXAuaXRlbShpKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGFkZFRvVGFibGUoY2hpbGROb2RlVGFibGUsZWQpOwotICAgICAgICAgIH0gICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhZCk7Ci0gICAgICBhdHRyaWJ1dGVUYWJsZS5wdXQoYWQuZ2V0Tm9kZU5hbWUoKSwgYWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgewotICAgICAgaWYgKGVkID09IHJvb3RFbGVtZW50RGVjbGFyYXRpb24gJiYgIWlzUm9vdFZpc2l0ZWQpCi0gICAgICB7Ci0gICAgICAgIGlzUm9vdFZpc2l0ZWQgPSB0cnVlOwotICAgICAgICBzdXBlci52aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKGVkKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmICghQm9vbGVhbi5UUlVFLmVxdWFscyhlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIGFkZFRvVGFibGUoY2hpbGROb2RlVGFibGUsZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ01Ob2RlTGlzdCBzdWJzdGl0dXRpb25Hcm91cCA9IChDTU5vZGVMaXN0KWVkLmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlU3Vic3RpdHV0aW9uR3JvdXAoc3Vic3RpdHV0aW9uR3JvdXApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVN1YnN0aXR1dGlvbkdyb3VwKENNTm9kZUxpc3Qgc3Vic3RpdHV0aW9uR3JvdXApCi0gICAgewotICAgICAgaW50IHN1YnN0aXR1dGlvbkdyb3VwTGVuZ3RoID0gc3Vic3RpdHV0aW9uR3JvdXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICBpZiAoc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGggPiAxKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnN0aXR1dGlvbkdyb3VwTGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDTU5vZGUgZWQgPSBzdWJzdGl0dXRpb25Hcm91cC5pdGVtKGkpOwotICAgICAgICAgIGlmICghQm9vbGVhbi5UUlVFLmVxdWFscyhlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhZGRUb1RhYmxlKGNoaWxkTm9kZVRhYmxlLGVkKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNR3JvdXAoQ01Hcm91cCBncm91cCkKLSAgICB7Ci0gICAgICBpZiAoaW5jbHVkZVNlcXVlbmNlR3JvdXBzKQotICAgICAgewotICAgICAgICBpZiAoZ3JvdXAuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLlNFUVVFTkNFICYmCi0gICAgICAgICAgICBncm91cC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPiAxICYmCi0gICAgICAgICAgICBpbmNsdWRlc1JlcXVpcmVkQ29udGVudChncm91cCkpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgY2hpbGROb2RlVGFibGUucHV0KGdyb3VwLCBncm91cCk7Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgICAgc3VwZXIudmlzaXRDTUdyb3VwKGdyb3VwKTsKLSAgICB9ICAgCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlc1JlcXVpcmVkQ29udGVudChDTUdyb3VwIGdyb3VwKQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IGdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChncm91cCk7Ci0gICAgICByZXR1cm4gbGlzdC5zaXplKCkgPiAxOwotICAgIH0KLSAgfSAgICAKLQotIAotICAvKioKLSAgICogQGRlcHJlY3RlZCAtIHVzZSBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldERhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhlbGVtZW50LCBjbU5vZGUpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kcyByZXR1cm4gYW4gYXJyYXkgb2YgcG9zc2libGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRhdGF0eXBlIG9mIHRoZSBDTU5vZGUgKGVpdGhlciBhbiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG9yIGEgQ01FbGVtZW50RGVjbGFyYXRpb24pCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChjbU5vZGUgIT0gbnVsbCkKLSAgICB7ICAgICAgIAotICAgICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IG51bGw7Ci0gICAgICBpZiAoY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikKLSAgICAgIHsKLSAgICAgICAgZGF0YVR5cGUgPSAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pY21Ob2RlKS5nZXRBdHRyVHlwZSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgICB7Ci0gICAgICAgIGRhdGFUeXBlID0gKChDTUVsZW1lbnREZWNsYXJhdGlvbiljbU5vZGUpLmdldERhdGFUeXBlKCk7Ci0gICAgICB9ICAgICAgICAgCi0gICAgIAotICAgICAgU3RyaW5nW10gZW51bWVyYXRlZFZhbHVlcyA9IGRhdGFUeXBlICE9IG51bGwgPyBkYXRhVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkgOiBudWxsOyAgICAgIAotICAgICAgaWYgKGVudW1lcmF0ZWRWYWx1ZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtZXJhdGVkVmFsdWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoZW51bWVyYXRlZFZhbHVlc1tpXSk7Ci0gICAgICAgIH0gCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGFkZFZhbHVlc0ZvclhTSVR5cGUoZWxlbWVudCwgY21Ob2RlLCBsaXN0KTsKLSAgICAKLSAgICBpZiAoZXh0ZW5zaW9uTWFuYWdlciAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgbGlzdC5hZGRBbGwoZXh0ZW5zaW9uTWFuYWdlci5nZXREYXRhVHlwZVZhbHVlcyhlbGVtZW50LCBjbU5vZGUpKTsKLSAgICB9ICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IGxpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tsaXN0U2l6ZV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHJlc3VsdFtpXSA9IChTdHJpbmcpbGlzdC5nZXQoaSk7Ci0gICAgfSAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLQotICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVzRm9yWFNJVHlwZShFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUsIExpc3QgbGlzdCkKLSAgeyAgICAgICAgICAgICAgIAotICAgIGlmIChjbU5vZGUgIT0gbnVsbCAmJiBjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKWNtTm9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmICh2YWx1ZUhlbHBlci5pc1hTSVR5cGUoYWQpKQotICAgICAgeyAgICAgICAgICAgICAKLSAgICAgICAgTmFtZXNwYWNlVGFibGUgdGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICB0YWJsZS5hZGRFbGVtZW50TGluZWFnZShlbGVtZW50KTsKLSAgICAgICAgbGlzdC5hZGRBbGwodmFsdWVIZWxwZXIuZ2V0UXVhbGlmaWVkWFNJVHlwZXMoYWQsIHRhYmxlKSk7ICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAKLQotICBwdWJsaWMgTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXIgZ2V0RXh0ZW5zaW9uTWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uTWFuYWdlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1NpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTI0MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1NpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlDTVByb3ZpZGVyIG1vZGVsUXVlcnlDTVByb3ZpZGVyOwotICAgICAgICAgIAotICBwdWJsaWMgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcihNb2RlbFF1ZXJ5Q01Qcm92aWRlciBtb2RlbFF1ZXJ5Q01Qcm92aWRlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLm1vZGVsUXVlcnlDTVByb3ZpZGVyID0gbW9kZWxRdWVyeUNNUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUNNUHJvdmlkZXIuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGVsZW1lbnQpOwotICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgeyAgICAgICAgCi0gICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50LmdldE5vZGVOYW1lKCkpOyAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1hNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9YTUxBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjBiZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1hNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MQXNzb2NpYXRpb25Qcm92aWRlciBleHRlbmRzIEJhc2VBc3NvY2lhdGlvblByb3ZpZGVyIGltcGxlbWVudHMgQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyCi17ICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGU7IAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudE1hbmFnZXJJbXBsIGRvY3VtZW50TWFuYWdlcjsKLQotICBwdWJsaWMgWE1MQXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlKQotICB7Ci0gICAgdGhpcy5jbURvY3VtZW50Q2FjaGUgPSBjbURvY3VtZW50Q2FjaGU7IAotICAgIGRvY3VtZW50TWFuYWdlciA9IG5ldyBDTURvY3VtZW50TWFuYWdlckltcGwoY21Eb2N1bWVudENhY2hlLCB0aGlzKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBDTURvY3VtZW50TWFuYWdlciBnZXRDTURvY3VtZW50TWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gZG9jdW1lbnRNYW5hZ2VyOwotICB9Ci0gCi0gICAgICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXREb2N0eXBlSW5mbyhEb2N1bWVudCBkb2N1bWVudCkKLSAgeyAgIAotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0gICAgRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0KLSAgICAvLyBkZWZlY3QgMjA2ODMzIC4uLiBoZXJlIHdlIHRlc3QgZm9yIERURHMgdGhhdCBhcmUgZGVjbGFyZWQgaW5saW5lCi0gICAgLy8gc2luY2Ugd2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIG1ha2luZyB1c2Ugb2YgaW5saW5lIERURHMgd2UgaW5nb3JlIHRoZW0KLSAgICAvLyBzbyB0aGF0IHRoZSBpbXBsaWN0IERURCAoaWYgYW55KSBjYW4gYmUgdXNlZAotICAgIGlmIChkb2N0eXBlICE9IG51bGwgJiYgKGRvY3R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsIHx8IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgcmVzdWx0WzBdID0gZG9jdHlwZS5nZXRQdWJsaWNJZCgpOwotICAgICAgcmVzdWx0WzFdID0gZG9jdHlwZS5nZXRTeXN0ZW1JZCgpOwotICAgIH0gICAKLSAgICBlbHNlIGlmIChnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAKLQotCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZ2V0SW1wbGljdERvY3R5cGUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgCi0gICAgU3RyaW5nW10gcmVzdWx0ID0gbnVsbDsKLSAgICAvKgotICAgIERPTUV4dGVuc2lvbiBkb21FeHRlbnNpb24gPSBET01FeHRlbnNpb25Qcm92aWRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RE9NRXh0ZW5zaW9uKGRvY3VtZW50KTsKLSAgICBpZiAoZG9tRXh0ZW5zaW9uICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZG9tRXh0ZW5zaW9uLmdldEltcGxpY2l0RG9jdHlwZSgpOwotICAgIH0qLwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpCi0gIHsgICAgICAgIAotICAgIHJldHVybiBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlLCB0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSwgYm9vbGVhbiBnZXREb2N1bWVudEZyb21DTU5vZGUpCi0gIHsgICAgICAgICAgICAKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KW5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgIAotICAgICAgU3RyaW5nW10gZG9jdHlwZUluZm8gPSBnZXREb2N0eXBlSW5mbyhkb2N1bWVudCk7Ci0KLSAgICAgIGlmIChkb2N0eXBlSW5mbyAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRDTURvY3VtZW50KGRvY3R5cGVJbmZvWzBdLCBkb2N0eXBlSW5mb1sxXSwgIkRURCIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvLyBkZWZlY3QgMjExMjM2IC4uLiBpbiBzb21lIGNhc2VzIGNhbGxpbmcgdGhpcyBtZXRob2QgY2FuIHJlc3VsdCBpbiBhIGN5Y2xlCi0gICAgICAvLyB3ZSB1c2UgdGhlIGdldERvY3VtZW50RnJvbUNNTm9kZSBhcyBhIGZsYWcgdG8gYXZvaWQgdGhpcyAKLSAgICAgIC8vIFRPRE8uLi4gc2VlIGlmIHRoZXJlIGlzIGEgd2F5IHRvIHJlLW9yZ2FuaXplIHRvIGF2b2lkIHRoZSBuZWVkIGZvciB0aGlzIGZsYWcKLSAgICAgIGVsc2UgaWYgKGdldERvY3VtZW50RnJvbUNNTm9kZSkKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGNtTm9kZSA9IGdldENNTm9kZShub2RlKTsKLSAgICAgICAgaWYgKGNtTm9kZSAhPSBudWxsKSAgICAgICAKLSAgICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAvLyB0b2RvLi4uIGFkZCBhIGdldENNRG9jdW1lbnQoKSBtZXRob2RzIHRvIENNTm9kZQotICAgICAgICAgIC8vIGZvciBub3cgdXNlIHRoZSBnZXRQcm9wZXJ0eSBpbnRlcmZhY2UKLSAgICAgICAgICByZXN1bHQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gbG9jYXRpbmcgQ01Eb2N1bWVudCBmb3IgIiArIG5vZGUsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVyaSkKLSAgewotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudExpbmVhZ2UoZWxlbWVudCk7Ci0gICAgTmFtZXNwYWNlSW5mbyBuYW1lc3BhY2VJbmZvID0gbmFtZXNwYWNlVGFibGUuZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSSh1cmkpOwotICAgIGlmIChuYW1lc3BhY2VJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudChuYW1lc3BhY2VJbmZvLnVyaSwgbmFtZXNwYWNlSW5mby5sb2NhdGlvbkhpbnQsICJYU0QiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgICAgCi0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gICAgLy9TdHJpbmcgcmVzb2x2ZWRHcmFtbWFyVVJJID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgcmV0dXJuIGRvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50KHB1YmxpY0lkLCBzeXN0ZW1JZCwgdHlwZSk7ICAKLSAgfQotCi0gIC8vcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIC8veyAgICAgICAgICAgICAgICAgICAKLSAgLy8gIC8vU3RyaW5nIHJlc29sdmVkR3JhbW1hclVSSSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAvLyAgcmV0dXJuIGRvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50KHB1YmxpY0lkLCBzeXN0ZW1JZCk7ICAKLSAgLy99Ci0gICAKLSAgcHVibGljIFN0cmluZyByZXNvbHZlR3JhbW1hclVSSShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIHJldHVybiByZXNvbHZlR3JhbW1hclVSSShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICB9Ci0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGluIG9yZGVyIHRvIGltcGxlbWVudCBzcGVjaWFsaXplZCB1cmkgcmVzb2x1dGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlR3JhbW1hclVSSShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICByZXR1cm4gc3lzdGVtSWQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOyAKLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIFN0cmluZ1tdIGRvY3R5cGVJbmZvID0gZ2V0RG9jdHlwZUluZm8oZG9jdW1lbnQpOwotICAgIGlmIChkb2N0eXBlSW5mbyAhPSBudWxsKQotICAgIHsgICAKLSAgICAgIC8vIHdlIGhhdmUgZGV0ZWN0ZWQgZG9jdHlwZSBpbmZvcm1hdGlvbiBzbyB3ZSBhc3N1bWUgdGhhdCB3ZSBjYW4gbG9jYXRlIHRoZSBDTUVsZW1lbnREZWNsYXJhdGlvbiAKLSAgICAgIC8vIGluIHRoZSBDTURvY3VtZW50J3MgdGFibGUgb2YgZ2xvYmFsIGVsZW1lbnRzIAotICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZWxlbWVudCwgZmFsc2UpOwotCi0gICAgICAvLyBUT0RPLi4uIGNvbnNpZGVyIHJlcGxhY2luZyBhYm92ZSB3aXRoIAotICAgICAgLy8gQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudChkb2N1bWVudCwgZG9jdHlwZUluZm9bMF0sIGRvY3R5cGVJbmZvWzFdKTsKLQotICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgIAotICAgICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50LmdldE5vZGVOYW1lKCkpOyAgICAKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIHRoaXMgaXMgYSBoYWNrIHRvIGdldCBvdXIgeHNsIGNvZGUgYXNzaXN0IHdvcmtpbmcuLi4gd2UgbWlnaHQgd2FudCB0byBoYW5kbGUgc2ltaWxhcgotICAgICAgICAvLyBncmFtbWFyIGJlaGF2aW91ciB2aWEgc29tZSBlc3RhYmxpc2hlZCBtb2RlbCBxdWVyeSBzZXR0aW5nIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZ2V0SW1wbGljdERvY3R5cGUoZG9jdW1lbnQpICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAKLSAgICAgICAgICBOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudClwYXJlbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgCi0gICAgZWxzZQotICAgIHsgIAotICAgICAgLy8gaGVyZSB3ZSB1c2UgYSBuYW1lc3BhY2VUYWJsZSB0byBjb25zaWRlciBpZiB0aGUgcm9vdCBlbGVtZW50IGhhcyBhbnkgbmFtZXNwYWNlIGluZm9ybWF0aW9uCi0gICAgICAvLwotICAgICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgTGlzdCBsaXN0ID0gTmFtZXNwYWNlVGFibGUuZ2V0RWxlbWVudExpbmVhZ2UoZWxlbWVudCk7Ci0gICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gKEVsZW1lbnQpbGlzdC5nZXQoMCk7Ci0gICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KHJvb3RFbGVtZW50KTsKLSAgICAgICAgIAotICAgICAgaWYgKG5hbWVzcGFjZVRhYmxlLmlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCB0aGlzIGlzIGFuIFhNTFNjaGVtYSBzdHlsZSBuYW1lc3BhY2UgYXdhcmUgZG9jdW1lbnQKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCwgbGlzdCwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAKLSAgICAgICAgLy8gd2UgYXNzdW1lIHRoYXQgdGhpcyBpcyBhbiBpbmZlcnJlZCBDTURvY3VtZW50IGZvciBhIERURCBzdHlsZSAnbmFtZXNwYWNlbGVzcycgZG9jdW1lbnQKLSAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudCgiIiwgIiIsICJEVEQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbURvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSk7IAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAgICAKLQotICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCB0YXJnZXRFbGVtZW50LCBMaXN0IGxpc3QsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7ICAgICAgICAgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gY3VycmVudEVEID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgIAotICAgICAgaW50IGxpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KWxpc3QuZ2V0KGkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5vZGVOYW1lID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotICAgICAgICBTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUobm9kZU5hbWUpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChub2RlTmFtZSk7Ci0gCi0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbnVsbDsKLSAKLSAgICAgICAgLy8gc2VlIGlmIHRoZSBlbGVtZW50IGlzIGEgbG9jYWwgb2YgdGhlIGN1cnJlbnRFRAotICAgICAgICAvLyAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGN1cnJlbnRFRCAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljdXJyZW50RUQuZ2V0TG9jYWxFbGVtZW50cygpLmdldE5hbWVkSXRlbSh1bnByZWZpeGVkTmFtZSk7Ci0gICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChlZCA9PSBudWxsKSAKLSAgICAgICAgeyAgICAgICAgICAgICAgIAotICAgICAgICAgIE5hbWVzcGFjZUluZm8gbmFtZXNwYWNlSW5mbyA9IG5hbWVzcGFjZVRhYmxlLmdldE5hbWVzcGFjZUluZm9Gb3JQcmVmaXgocHJlZml4KTsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgaWYgKG5hbWVzcGFjZUluZm8gIT0gbnVsbCkgCi0gICAgICAgICAgewotICAgICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudChuYW1lc3BhY2VJbmZvLnVyaSwgbmFtZXNwYWNlSW5mby5sb2NhdGlvbkhpbnQsICJYU0QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0odW5wcmVmaXhlZE5hbWUpOyAgIAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgY3VycmVudEVEID0gZWQ7ICAgICAKLQotICAgICAgICAvLyBoYW5kbGUgWFNJVHlwZSAgICAgCi0gICAgICAgIGlmIChjdXJyZW50RUQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGRlcml2ZWRFRCA9IGdldERlcml2ZWRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50LCBjdXJyZW50RUQsIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgICAgICBpZiAoZGVyaXZlZEVEICE9IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY3VycmVudEVEID0gZGVyaXZlZEVEOwotICAgICAgICAgIH0gICAgCi0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgCi0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gbG9jYXRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgIiArIHRhcmdldEVsZW1lbnQsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgfSAKLSAgCi0gICAgcmV0dXJuIGN1cnJlbnRFRDsKLSAgfSAgCi0gICAgICAKLQotICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVyaXZlZENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgU3RyaW5nIHhzaVByZWZpeCA9IG5hbWVzcGFjZVRhYmxlLmdldFByZWZpeEZvclVSSSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmICh4c2lQcmVmaXggIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgeHNpVHlwZVZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoeHNpUHJlZml4ICsgIjp0eXBlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmICh4c2lUeXBlVmFsdWUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBTdHJpbmcgdHlwZVByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoeHNpVHlwZVZhbHVlKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKHhzaVR5cGVWYWx1ZSk7Ci0gICAgICAgIFN0cmluZyB0eXBlVVJJID0gbmFtZXNwYWNlVGFibGUuZ2V0VVJJRm9yUHJlZml4KHR5cGVQcmVmaXgpOwotICAgICAgICBTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUgPSB0eXBlTmFtZTsKLSAgICAgICAgaWYgKHR5cGVVUkkgIT0gbnVsbCAmJiB0eXBlVVJJLmxlbmd0aCgpID4gMCkgCi0gICAgICAgIHsKLSAgICAgICAgICB1cmlRdWFsaWZpZWRUeXBlTmFtZSA9ICJbIiArICB0eXBlVVJJICsgIl0iICsgdHlwZU5hbWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbillZC5nZXRQcm9wZXJ0eSgiRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbj0iICsgdXJpUXVhbGlmaWVkVHlwZU5hbWUpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAKLQotCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKQotICB7Ci0gICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKWVkLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ci5nZXROYW1lKCkpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gdHJ5IHRvIGdldCB0aGUgdW5wcmVmaXhlZCBuYW1lICAgICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyBuYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICByZXN1bHQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbillZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKG5hbWUpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIHRvZG8uLi4gcGVyaGFwcyB0aGlzIGlzIGEgZ2xvYmFsbHkgZGVmaW5lZCBhdHRyaWJ1dGUuLi4gCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAgICAgIAotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBDTURvY3VtZW50UmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIG5vZGUgb3Igc3VidHJlZQotICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRSZWZlcmVuY2VzKE5vZGUgbm9kZSwgYm9vbGVhbiBkZWVwKQotICB7IAotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOyAgCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyAoRG9jdW1lbnQpbm9kZSA6IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIERvY3VtZW50VHlwZSBkb2N0eXBlID0gZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotICAgIC8vIGRlZmVjdCAyMDY4MzMgLi4uIGhlcmUgd2UgdGVzdCBmb3IgRFREcyB0aGF0IGFyZSBkZWNsYXJlZCBpbmxpbmUKLSAgICAvLyBzaW5jZSB3ZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2YgbWFraW5nIHVzZSBvZiBpbmxpbmUgRFREcyB3ZSBpbmdvcmUgdGhlbQotICAgIC8vIHNvIHRoYXQgdGhlIGltcGxpY3QgRFREIChpZiBhbnkpIGNhbiBiZSB1c2VkCi0gICAgaWYgKGRvY3R5cGUgIT0gbnVsbCAmJiAoZG9jdHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwgfHwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpICE9IG51bGwpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgdXJpID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIGRvY3R5cGUuZ2V0UHVibGljSWQoKSwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgIHJlc3VsdC5hZGQobmV3IENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsKGRvY3R5cGUuZ2V0UHVibGljSWQoKSwgdXJpKSk7Ci0gICAgfSAgIAotICAgIGVsc2UgaWYgKGdldEltcGxpY3REb2N0eXBlKGRvY3VtZW50KSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZ1tdIGltcGxpY2l0RG9jdHlwZSA9IGdldEltcGxpY3REb2N0eXBlKGRvY3VtZW50KTsKLSAgICAgIFN0cmluZyB1cmkgPSByZXNvbHZlR3JhbW1hclVSSShkb2N1bWVudCwgaW1wbGljaXREb2N0eXBlWzBdLCBpbXBsaWNpdERvY3R5cGVbMV0pOwotICAgICAgcmVzdWx0LmFkZChuZXcgQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwoaW1wbGljaXREb2N0eXBlWzBdLCB1cmkpKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZQotICAgIHsgICAKLSAgICAgIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGRvY3VtZW50KTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0JCSAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KChFbGVtZW50KW5vZGUpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChkZWVwKQotICAgICAgewotICAgICAgICBhZGRDaGlsZEVsZW1lbnRzVG9OYW1lc3BhY2VUYWJsZShub2RlLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICB9Ci0JICAgIExpc3QgbGlzdCA9IG5hbWVzcGFjZVRhYmxlLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0JCSAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIAotICAgICAgewotCQkJICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7ICAgIAotICAgICAgICBTdHJpbmcgdXJpID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIGluZm8udXJpLCBpbmZvLmxvY2F0aW9uSGludCk7Ci0gICAgICAgIHJlc3VsdC5hZGQobmV3IENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsKGluZm8udXJpLCB1cmkpKTsKLQkJICB9CQotICAgIH0gCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZENoaWxkRWxlbWVudHNUb05hbWVzcGFjZVRhYmxlKE5vZGUgbm9kZSwgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUpCi0gIHsKLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCSAgaWYgKG5vZGVMaXN0ICE9IG51bGwpIAotICAgIHsKLQkJICBpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspIAotICAgICAgewotCQkJICBOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgIGlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgeyAgIAotICAgICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoKEVsZW1lbnQpY2hpbGROb2RlKTsKLSAgICAgICAgICBhZGRDaGlsZEVsZW1lbnRzVG9OYW1lc3BhY2VUYWJsZShjaGlsZE5vZGUsIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgICAgfQotCQkgIH0KLQkgIH0KLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURlc2NyaXB0aW9uQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyYWIxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURlc2NyaXB0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDTURlc2NyaXB0aW9uQnVpbGRlciBleHRlbmRzIENNVmlzaXRvcgotewotICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHNiOwotICBwcm90ZWN0ZWQgQ01Ob2RlIHJvb3Q7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0gIHB1YmxpYyBTdHJpbmcgYnVpbGREZXNjcmlwdGlvbihDTU5vZGUgbm9kZSkKLSAgewotICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHJvb3QgPSBub2RlOwotICAgIGlzUm9vdFZpc2l0ZWQgPSBmYWxzZTsKLSAgICB2aXNpdENNTm9kZShub2RlKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfSAgICAgICAKLQotICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgewotICAgIHNiLmFwcGVuZCgibmFtZXNwYWNlOnVyaT1cIiIgKyBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTURhdGFUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICBzYi5hcHBlbmQoIiNQQ0RBVEEiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTURvY3VtZW50KENNRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBDTU5hbWVkTm9kZU1hcCBtYXAgPSBkb2N1bWVudC5nZXRFbGVtZW50cygpOwotICAgIGludCBzaXplID0gbWFwLmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Q01Ob2RlKG1hcC5pdGVtKGkpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNR3JvdXAoQ01Hcm91cCBncm91cCkKLSAgewotICAgIGludCBvcCA9IGdyb3VwLmdldE9wZXJhdG9yKCk7Ci0gICAgaWYgKG9wID09IENNR3JvdXAuQUxMKQotICAgIHsKLSAgICAgIHNiLmFwcGVuZCgiYWxsIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBzYi5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgU3RyaW5nIHNlcGFyYXRvciA9ICIsICI7IC8vJE5PTi1OTFMtMSQKLQotICAgIGlmIChvcCA9PSBDTUdyb3VwLkNIT0lDRSkKLSAgICB7Ci0gICAgICBzZXBhcmF0b3IgPSAiIHwgIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgIAotICAgIENNTm9kZUxpc3Qgbm9kZUxpc3QgPSBncm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdENNTm9kZShub2RlTGlzdC5pdGVtKGkpKTsKLSAgICAgIGlmIChpIDwgc2l6ZSAtIDEpCi0gICAgICB7Ci0gICAgICAgIHNiLmFwcGVuZChzZXBhcmF0b3IpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBzYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotICAgIGFkZE9jY3VyZW5jZVN5bWJvbChncm91cCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gICAgaWYgKGVkID09IHJvb3QgJiYgIWlzUm9vdFZpc2l0ZWQpCi0gICAgewotICAgICAgaXNSb290VmlzaXRlZCA9IHRydWU7Ci0gICAgICBDTUNvbnRlbnQgY29udGVudCA9IGVkLmdldENvbnRlbnQoKTsKLSAgICAgIGlmIChjb250ZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb250ZW50LmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkdST1VQKQotICAgICAgICB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB2aXNpdENNTm9kZShjb250ZW50KTsKLSAgICAgICAgICBzYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01Ob2RlKGNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQoZWQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICBhZGRPY2N1cmVuY2VTeW1ib2woZWQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZE9jY3VyZW5jZVN5bWJvbChDTUNvbnRlbnQgY29udGVudCkKLSAgewotICAgIGludCBtaW4gPSBjb250ZW50LmdldE1pbk9jY3VyKCk7Ci0gICAgaW50IG1heCA9IGNvbnRlbnQuZ2V0TWF4T2NjdXIoKTsKLSAgICBpZiAobWluID09IDApCi0gICAgewotICAgICAgaWYgKG1heCA+IDEgfHwgbWF4ID09IC0xKQotICAgICAgewotICAgICAgICBzYi5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzYi5hcHBlbmQoIj8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChtYXggPiAxIHx8IG1heCA9PSAtMSkKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQoIisiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwZmY1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRDYWNoZQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX05PVF9MT0FERUQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTE9BRElORyAgICA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19MT0FERUQgICAgID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0VSUk9SICAgICAgPSA0OwotCi0gIHByb3RlY3RlZCBjbGFzcyBFbnRyeQotICB7Ci0gICAgcHVibGljIFN0cmluZyB1cmk7Ci0gICAgcHVibGljIGludCBzdGF0dXMgPSBTVEFUVVNfTk9UX0xPQURFRDsKLSAgICBwdWJsaWMgZmxvYXQgcHJvZ3Jlc3M7Ci0gICAgcHVibGljIENNRG9jdW1lbnQgY21Eb2N1bWVudDsKLQotICAgIHB1YmxpYyBFbnRyeShTdHJpbmcgdXJpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnVyaSA9IHVyaTsgICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW50cnkoU3RyaW5nIHVyaSwgaW50IHN0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOyAgICAgIAotICAgICAgdGhpcy5jbURvY3VtZW50ID0gY21Eb2N1bWVudDsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGhhc2h0YWJsZTsKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0KLSAgLyoqCi0gICAqIHRlbXBvcmFyaWx5IHB1YmxpYyB1bnRpbCBjYWNoaW5nIHByb2JsZW0gaXMgc29sdmVkCi0gICAqLwotICBwdWJsaWMgQ01Eb2N1bWVudENhY2hlKCkKLSAgewotICAgIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihDTURvY3VtZW50Q2FjaGVMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9ICAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBncmFtbWFyVVJJKQotICB7Ci0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIGlmIChncmFtbWFyVVJJICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSloYXNodGFibGUuZ2V0KGdyYW1tYXJVUkkpOwotICAgICAgaWYgKGVudHJ5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGVudHJ5LmNtRG9jdW1lbnQ7Ci0gICAgICB9ICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0YXR1cyhTdHJpbmcgZ3JhbW1hclVSSSkKLSAgewotICAgIGludCByZXN1bHQgPSBTVEFUVVNfTk9UX0xPQURFRDsKLSAgICBpZiAoZ3JhbW1hclVSSSAhPSBudWxsKQotICAgIHsgIAotICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpaGFzaHRhYmxlLmdldChncmFtbWFyVVJJKTsKLSAgICAgIGlmIChlbnRyeSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBlbnRyeS5zdGF0dXM7Ci0gICAgICB9ICAgICAgCi0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIEVudHJ5IGxvb2t1cE9yQ3JlYXRlKFN0cmluZyBncmFtbWFyVVJJKQotICB7Ci0gICAgRW50cnkgZW50cnkgPSAoRW50cnkpaGFzaHRhYmxlLmdldChncmFtbWFyVVJJKTsKLSAgICBpZiAoZW50cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbnRyeSA9IG5ldyBFbnRyeShncmFtbWFyVVJJKTsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaGFzaHRhYmxlLnB1dChncmFtbWFyVVJJLCBlbnRyeSk7Ci0gICAgfQotICAgIHJldHVybiBlbnRyeTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgcHV0Q01Eb2N1bWVudChTdHJpbmcgZ3JhbW1hclVSSSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGdyYW1tYXJVUkkgIT0gbnVsbCAmJiBjbURvY3VtZW50ICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRW50cnkgZW50cnkgPSBsb29rdXBPckNyZWF0ZShncmFtbWFyVVJJKTsKLSAgICAgIGludCBvbGRTdGF0dXMgPSBlbnRyeS5zdGF0dXM7Ci0gICAgICBlbnRyeS5zdGF0dXMgPSBTVEFUVVNfTE9BREVEOwotICAgICAgZW50cnkuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7ICAKLSAgICAgIG5vdGlmeUNhY2hlVXBkYXRlZChncmFtbWFyVVJJLCBvbGRTdGF0dXMsIGVudHJ5LnN0YXR1cywgZW50cnkuY21Eb2N1bWVudCk7ICAKLSAgICB9Ci0gIH0KLSAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBncmFtbWFyVVJJLCBpbnQgc3RhdHVzKQotICB7Ci0gICAgaWYgKGdyYW1tYXJVUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbnRyeSBlbnRyeSA9IGxvb2t1cE9yQ3JlYXRlKGdyYW1tYXJVUkkpOwotICAgICAgaW50IG9sZFN0YXR1cyA9IGVudHJ5LnN0YXR1czsKLSAgICAgIGVudHJ5LnN0YXR1cyA9IHN0YXR1czsKLSAgICAgIG5vdGlmeUNhY2hlVXBkYXRlZChncmFtbWFyVVJJLCBvbGRTdGF0dXMsIGVudHJ5LnN0YXR1cywgZW50cnkuY21Eb2N1bWVudCk7ICAgCi0gICAgfQotICB9Ci0gICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkKLSAgewotICAgIGhhc2h0YWJsZS5jbGVhcigpOwotICAgIG5vdGlmeUNhY2hlQ2xlYXJlZCgpOwotICB9ICAKLQotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIG5vdGlmeUNhY2hlVXBkYXRlZChTdHJpbmcgdXJpLCBpbnQgb2xkU3RhdHVzLCBpbnQgbmV3U3RhdHVzLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gIHsgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIgbGlzdGVuZXIgPSAoQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5jYWNoZVVwZGF0ZWQodGhpcywgdXJpLCBvbGRTdGF0dXMsIG5ld1N0YXR1cywgY21Eb2N1bWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlDYWNoZUNsZWFyZWQoKQotICB7ICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIgbGlzdGVuZXIgPSAoQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5jYWNoZUNsZWFyZWQodGhpcyk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50cygpCi0gIHsKLSAgCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgIAkKLSAgCWZvciAoSXRlcmF0b3IgaSA9IGhhc2h0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAJewotICAJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KWkubmV4dCgpOwotICAJCWxpc3QuYWRkKGVudHJ5LmNtRG9jdW1lbnQpOwotICAJfQotICAJcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY2ZGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLS8qKgotICogdG9kby4uLiBhZGQgbW9yZSBpbnRlcmZhY2UgbWV0aG9kcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyCi17Ci0gIC8qKiBUZWxscyB0aGUgY2xpZW50IHRoYXQgdGhlIGNhY2hlIGhhcyBiZWVuIGNsZWFyZWQuCi0gICAqICBUaGlzIGdpdmVzIGNsaWVudHMgYW4gb3Bwb3J0dW5pdHkgdG8gZmx1c2ggYW55IHN0YXRlIHRoYXQgZGVwZW5kcyBvbiB0aGUgQ01Eb2N1bWVudAotICAgKiAgc2luY2UgdGhpcyBDTURvY3VtZW50IHdpbGwgYmUgcmVjb21wdXRlZCBvbiBhIHN1YnNlcXVlbnQgJ2xvb2t1cCcgcmVxdWVzdAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSk7IAotCi0gIC8qKiAKLSAgICogIFRlbGxzIHRoZSBjbGllbnQgdGhhdCB0aGUgY2FjaGUgaGFzIGJlZW4gdXBkYXRlZC4gIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YmI5ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgQ01WaXNpdG9yCi17Ci0gIHByb3RlY3RlZCBpbnQgaW5kZW50ID0gMDsKLSAgcHJvdGVjdGVkIFN0YWNrIHZpc2l0ZWRDTUdyb3VwU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotICBwdWJsaWMgdm9pZCB2aXNpdENNTm9kZShDTU5vZGUgbm9kZSkKLSAgewotICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgewotICAgICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLnByaW50bG5JbmRlbnRlZCgidmlzaXRDTU5vZGUgOiAiICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIiAiICsgbm9kZSk7Ci0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIGludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgIHN3aXRjaCAobm9kZVR5cGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgQ01Ob2RlLkFOWV9FTEVNRU5UIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01BbnlFbGVtZW50KChDTUFueUVsZW1lbnQpbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbigoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbilub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5EQVRBX1RZUEUgOgotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTURhdGFUeXBlKChDTURhdGFUeXBlKW5vZGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ01Ob2RlLkRPQ1VNRU5UIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01Eb2N1bWVudCgoQ01Eb2N1bWVudClub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKW5vZGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ01Ob2RlLkdST1VQIDoKLSAgICAgICAgewotICAgICAgICAgIENNR3JvdXAgZ3JvdXAgPSAoQ01Hcm91cClub2RlOwotICAgICAgICAgIAotICAgICAgICAgIC8vIFRoaXMgaXMgdG8gcHJldmVudCByZWN1cnNpb24uCi0gICAgICAgICAgaWYgKHZpc2l0ZWRDTUdyb3VwU3RhY2suY29udGFpbnMoZ3JvdXApKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvLyBQdXNoIHRoZSBjdXJyZW50IGdyb3VwIHRvIGNoZWNrIGxhdGVyIHRvIGF2b2lkIHBvdGVudGlhbCByZWN1cnNpb24KLSAgICAgICAgICB2aXNpdGVkQ01Hcm91cFN0YWNrLnB1c2goZ3JvdXApOwotICAgICAgICAgIAotICAgICAgICAgIHZpc2l0Q01Hcm91cChncm91cCk7Ci0KLSAgICAgICAgICAvLyBQb3AgdGhlIGN1cnJlbnQgZ3JvdXAKLSAgICAgICAgICB2aXNpdGVkQ01Hcm91cFN0YWNrLnBvcCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnQgLT0gMjsKLSAgICB9Ci0gIH0KLSAgICAgIAotICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01EYXRhVHlwZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRG9jdW1lbnQoQ01Eb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGRvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgaW50IHNpemUgPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdmlzaXRDTU5vZGUobWFwLml0ZW0oaSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICB7Ci0gICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGdyb3VwLmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Q01Ob2RlKG5vZGVMaXN0Lml0ZW0oaSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsKLSAgICBDTU5hbWVkTm9kZU1hcCBub2RlTWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotICAgIGludCBzaXplID0gbm9kZU1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdENNTm9kZShub2RlTWFwLml0ZW0oaSkpOwotICAgIH0KLQotICAgIHZpc2l0Q01Ob2RlKGVkLmdldENvbnRlbnQoKSk7Ci0KLSAgICB2aXNpdENNRGF0YVR5cGUoZWQuZ2V0RGF0YVR5cGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NvbnRlbnRCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9Db250ZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQwMmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NvbnRlbnRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi0gICAgICAgICAgICAgICAgICAgCi0vKioKLSAqIFRoaXMgY2xhc3MgbGV0cyB5b3UgdHJhdmVyc2UgYSAnQ00nIG1vZGVsIHByb3ZpZGluZyBjYWxsYmFja3MgdG8gYnVpbGQgY29udGVudC4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRCdWlsZGVyIGV4dGVuZHMgQ01WaXNpdG9yCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX0FMTF9DT05URU5UID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfT05MWV9SRVFVSVJFRF9DT05URU5UID0gMjsKLSAgcHJvdGVjdGVkIGludCBidWlsZFBvbGljeSA9IEJVSUxEX0FMTF9DT05URU5UOwotCi0gIHByb3RlY3RlZCBib29sZWFuIGFsd2F5c1Zpc2l0OwotICBwcm90ZWN0ZWQgVmVjdG9yIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgcHVibGljIENvbnRlbnRCdWlsZGVyKCkKLSAgewotICB9Ci0gICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHNldEJ1aWxkUG9saWN5KGludCBidWlsZFBvbGljeSkKLSAgewotICAgIHRoaXMuYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QnVpbGRQb2xpY3koKQotICB7Ci0gICAgcmV0dXJuIGJ1aWxkUG9saWN5OwotICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW55RWxlbWVudE5vZGUoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVsZW1lbnROb2RlU3RhcnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVsZW1lbnROb2RlRW5kKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXh0Tm9kZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlTm9kZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSkKLSAgewotICB9IAotIAotICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gICAgaW50IGZvcmNlZE1pbiA9IChidWlsZFBvbGljeSA9PSBCVUlMRF9BTExfQ09OVEVOVCB8fCBhbHdheXNWaXNpdCkgPyAxIDogMDsKLSAgICBpbnQgbWluID0gTWF0aC5tYXgoZWQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLSAgICBpZiAobWluID4gMCAmJiAhdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5jb250YWlucyhlZCkpCi0gICAgewotICAgICAgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5hZGQoZWQpOwotICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbWluOyBpKyspCi0gICAgICB7ICAgICAgIAotICAgICAgICBjcmVhdGVFbGVtZW50Tm9kZVN0YXJ0KGVkKTsgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBpbnN0ZWFkIG9mIGNhbGxpbmcgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgICAgIC8vIHdlIGR1cGxpY2F0ZSB0aGUgY29kZSB3aXRoIHNvbWUgbWlub3IgbW9kaWZpY2F0aW9ucwotICAgICAgICBDTU5hbWVkTm9kZU1hcCBub2RlTWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUobm9kZU1hcC5pdGVtKGopKTsKLSAgICAgICAgfQotCi0gICAgICAgIENNQ29udGVudCBjb250ZW50ID0gZWQuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUoY29udGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWQuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpCi0gICAgICAgIHsKLSAgICAgICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLSAgICAgICAgICBpZiAoZGF0YVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2aXNpdENNRGF0YVR5cGUoZGF0YVR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBlbmQgZHVwbGljYXRpb24KLSAgICAgICAgY3JlYXRlRWxlbWVudE5vZGVFbmQoZWQpOyAgCi0gICAgICB9Ci0gICAgICBpbnQgc2l6ZSA9IHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3Quc2l6ZSgpOwotICAgICAgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5yZW1vdmUoc2l6ZSAtIDEpOwotICAgIH0KLSAgfQotICAgIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01EYXRhVHlwZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gICAgY3JlYXRlVGV4dE5vZGUoZGF0YVR5cGUpOyAgIAotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNR3JvdXAoQ01Hcm91cCBlKQotICB7IAotICAgIGludCBmb3JjZWRNaW4gPSAoYnVpbGRQb2xpY3kgPT0gQlVJTERfQUxMX0NPTlRFTlQgfHwgYWx3YXlzVmlzaXQpID8gMSA6IDA7Ci0gICAgaW50IG1pbiA9IE1hdGgubWF4KGUuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLSAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtaW47IGkrKykKLSAgICB7ICAgCi0gICAgICBpZiAoZS5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQ0hPSUNFKQotICAgICAgewotICAgICAgICAvLyBhZGQgb25seSAxIGVsZW1lbnQgZnJvbSB0aGUgZ3JvdXAKLSAgICAgICAgLy8gdG9kby4uLiBwZXJoYXBzIGFkZCBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZmlyc3Qgb25lICAgICAgICAKLSAgICAgICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbSgwKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy8gU0VRVUVOQ0UsIEFMTAotICAgICAgewotICAgICAgICAvLyB2aXNpdCBhbGwgb2YgdGhlIGNvbnRlbnQKLSAgICAgICAgc3VwZXIudmlzaXRDTUdyb3VwKGUpOwotICAgICAgfQotICAgIH0KLSAgfSAKLQotICBwdWJsaWMgdm9pZCB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICAgIGlmIChhbHdheXNWaXNpdCB8fAotICAgICAgICBidWlsZFBvbGljeSA9PSBCVUlMRF9BTExfQ09OVEVOVCB8fAotICAgICAgICBhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpCi0gICAgewotICAgICAgY3JlYXRlQXR0cmlidXRlTm9kZShhZCk7ICAgICAgCi0gICAgfQotICB9ICAgICAgICAgICAgICAgICAgICAgCi0gIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICB7ICAKLSAgICBpbnQgZm9yY2VkTWluID0gKGJ1aWxkUG9saWN5ID09IEJVSUxEX0FMTF9DT05URU5UIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7IAotICAgIGludCBtaW4gPSBNYXRoLm1heChhbnlFbGVtZW50LmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtaW47IGkrKykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGNyZWF0ZUFueUVsZW1lbnROb2RlKGFueUVsZW1lbnQpOwotICAgIH0KLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyMzU3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIERPTUNvbnRlbnRCdWlsZGVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX09QVElPTkFMX0FUVFJJQlVURVMgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9PUFRJT05BTF9FTEVNRU5UUyA9IDE8PDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX0ZJUlNUX0NIT0lDRSA9IDE8PDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX1RFWFRfTk9ERVMgPSAxPDwzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9GSVJTVF9TVUJTVElUVVRJT04gPSAxPDw0OwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgCi0gICAgQlVJTERfT05MWV9SRVFVSVJFRF9DT05URU5UID0KLSAgICAgIEJVSUxEX0ZJUlNUX0NIT0lDRQotICAgICAgfCBCVUlMRF9URVhUX05PREVTOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCAKLSAgICBCVUlMRF9BTExfQ09OVEVOVCA9IAotICAgICAgQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUyAKLSAgICAgIHwgQlVJTERfT1BUSU9OQUxfRUxFTUVOVFMgCi0gICAgICB8IEJVSUxEX0ZJUlNUX0NIT0lDRQotICAgICAgfCBCVUlMRF9URVhUX05PREVTOwotICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0JVSUxEX0JMQU5LX1RFWFRfTk9ERVMgPSAiYnVpbGRCbGFua1RleHROb2RlcyI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEJ1aWxkUG9saWN5KGludCBidWlsZFBvbGljeSk7Ci0gIHB1YmxpYyBpbnQgIGdldEJ1aWxkUG9saWN5KCk7Ci0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCB2YWx1ZSk7Ci0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0gIHB1YmxpYyBMaXN0IGdldFJlc3VsdCgpOwotICBwdWJsaWMgdm9pZCBidWlsZChOb2RlIHBhcmVudCwgQ01Ob2RlIGNoaWxkKTsKLSAgcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uOwotICBwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQoQ01Eb2N1bWVudCBjbURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiByb290Q01FbGVtZW50RGVjbGFyYXRpb24sIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHRocm93cyBFeGNlcHRpb247Ci0gIHB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRDb250ZW50KE5vZGUgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgdGhyb3dzIEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMmE0ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLkNNRGF0YVR5cGVWYWx1ZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiB0b2RvLi4uIGNvbW1vbiB1cCB0aGlzIGNvZGUgd2l0aCAnQ29udGVudEJ1aWxkZXInCi0gKi8KLXB1YmxpYyBjbGFzcyBET01Db250ZW50QnVpbGRlckltcGwgZXh0ZW5kcyBDTVZpc2l0b3IgaW1wbGVtZW50cyBET01Db250ZW50QnVpbGRlciB7Ci0JcHJvdGVjdGVkIGludCBidWlsZFBvbGljeSA9IEJVSUxEX0FMTF9DT05URU5UOwotCXByb3RlY3RlZCBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIExpc3QgcmVzdWx0TGlzdDsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIE5vZGUgY3VycmVudFBhcmVudDsKLQlwcm90ZWN0ZWQgTm9kZSB0b3BQYXJlbnQ7Ci0JcHJvdGVjdGVkIFZlY3RvciB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0ID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBib29sZWFuIGF0dGFjaE5vZGVzVG9QYXJlbnQgPSB0cnVlOwotCXByb3RlY3RlZCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZTsKLQotCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0OwotCXByb3RlY3RlZCBFbGVtZW50IHJvb3RFbGVtZW50OyAvLyB0aGlzIGlzIHVzZWQgb25seSB0ZXBvcmFyaWx5IHZpYQotCQkJCQkJCQkJLy8gY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50Ci0JcHJvdGVjdGVkIEV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgZXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydDsKLQotCXB1YmxpYyBib29sZWFuIHN1cHJlc3NDcmVhdGlvbk9mRG9jdHlwZUFuZFhNTERlY2xhcmF0aW9uOwotCi0JcHJvdGVjdGVkIENNRGF0YVR5cGVWYWx1ZUhlbHBlciB2YWx1ZUhlbHBlciA9IG5ldyBDTURhdGFUeXBlVmFsdWVIZWxwZXIoKTsKLQotCXByb3RlY3RlZCBpbnQgbnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMgPSAxOwotCXByb3RlY3RlZCBTdGFjayBjbUdyb3VwU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotCXB1YmxpYyBpbnRlcmZhY2UgRXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCB7Ci0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0KEV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgZXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCkgewotCQl0aGlzLmV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgPSBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0OwotCX0KLQotCXB1YmxpYyBET01Db250ZW50QnVpbGRlckltcGwoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCQluYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnVpbGRQb2xpY3koaW50IGJ1aWxkUG9saWN5KSB7Ci0JCXRoaXMuYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEJ1aWxkUG9saWN5KCkgewotCQlyZXR1cm4gYnVpbGRQb2xpY3k7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRBbGxDb250ZW50KGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9BTExfQ09OVEVOVCkgPT0gQlVJTERfQUxMX0NPTlRFTlQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRPcHRpb25hbEVsZW1lbnRzKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9PUFRJT05BTF9FTEVNRU5UUykgPT0gQlVJTERfT1BUSU9OQUxfRUxFTUVOVFM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRPcHRpb25hbEF0dHJpYnV0ZXMoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX09QVElPTkFMX0FUVFJJQlVURVMpID09IEJVSUxEX09QVElPTkFMX0FUVFJJQlVURVM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRGaXJzdENob2ljZShpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfRklSU1RfQ0hPSUNFKSA9PSBCVUlMRF9GSVJTVF9DSE9JQ0U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRUZXh0Tm9kZXMoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX1RFWFRfTk9ERVMpID09IEJVSUxEX1RFWFRfTk9ERVM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRGaXJzdFN1YnN0aXR1dGlvbihpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfRklSU1RfU1VCU1RJVFVUSU9OKSA9PSBCVUlMRF9GSVJTVF9TVUJTVElUVVRJT047Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gcmVzdWx0TGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJcHJvcGVydHlUYWJsZS5wdXQocHJvcGVydHlOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBwcm9wZXJ0eVRhYmxlLmdldChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJ1aWxkKE5vZGUgcGFyZW50LCBDTU5vZGUgY2hpbGQpIHsKLQkJcmVzdWx0TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJdG9wUGFyZW50ID0gcGFyZW50OwotCQljdXJyZW50UGFyZW50ID0gcGFyZW50OwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudExpbmVhZ2UoKEVsZW1lbnQpIHBhcmVudCk7Ci0JCX0KLQkJYXR0YWNoTm9kZXNUb1BhcmVudCA9IGZhbHNlOwotCQlhbHdheXNWaXNpdCA9IHRydWU7Ci0JCXZpc2l0Q01Ob2RlKGNoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQoQ01Eb2N1bWVudCBjbURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiByb290Q01FbGVtZW50RGVjbGFyYXRpb24sIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLm5hbWVzcGFjZUluZm9MaXN0ID0gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JCWNyZWF0ZURlZmF1bHRSb290Q29udGVudChjbURvY3VtZW50LCByb290Q01FbGVtZW50RGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRSb290Q29udGVudChDTURvY3VtZW50IGNtRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBncmFtbWFyRmlsZU5hbWUgPSBjbURvY3VtZW50LmdldE5vZGVOYW1lKCk7Ci0JCWlmICghc3VwcmVzc0NyZWF0aW9uT2ZEb2N0eXBlQW5kWE1MRGVjbGFyYXRpb24pIHsKLQkJCS8vIFRPRE8gY3MuLi4gaW52ZXN0aWdhdGUgdG8gc2VlIGlmIHRoaXMgY29kZSBwYXRoIGlzIGV2ZXIgdXNlZCwKLQkJCS8vIGRvZXNuJ3Qgc2VlbSB0byBiZQotCQkJLy8gZm9yIG5vdyBJJ20gc2V0dGluZyB0aGUgZW5jb2RpbmcgdG8gVVRGLTgganVzdCBpbmNhc2UgdGhpcyBjb2RlCi0JCQkvLyBwYXRoIGlzIHVzZWQgc29tZXdoZXJlCi0JCQkvLwotCQkJU3RyaW5nIHBpVmFsdWUgPSAidmVyc2lvbj1cIjEuMFwiIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGVuY29kaW5nID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJcGlWYWx1ZSArPSAiIGVuY29kaW5nPVwiIiArIGVuY29kaW5nICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkICAgICAgCi0JCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkgPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oInhtbCIsIHBpVmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChwaSk7Ci0KLQkJCS8vIGlmIHdlIGhhdmUgYSAnZHRkJyB0aGVuIGFkZCBhIERPQ1RZUEUgdGFnCi0JCQkvLwotCQkJaWYgKGdyYW1tYXJGaWxlTmFtZSAhPSBudWxsICYmIGdyYW1tYXJGaWxlTmFtZS5lbmRzV2l0aCgiZHRkIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsID0gZG9jdW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKLQkJCQlEb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlID0gZG9tSW1wbC5jcmVhdGVEb2N1bWVudFR5cGUocm9vdENNRWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCksIGdyYW1tYXJGaWxlTmFtZSwgZ3JhbW1hckZpbGVOYW1lKTsKLQkJCQlkb2N1bWVudC5hcHBlbmRDaGlsZChkb2N1bWVudFR5cGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgd2UgaGF2ZSBhIHNjaGVtYSBhZGQgYW4geHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotCQkvLwotCQlpZiAoZ3JhbW1hckZpbGVOYW1lICE9IG51bGwgJiYgZ3JhbW1hckZpbGVOYW1lLmVuZHNXaXRoKCJ4c2QiKSAmJiBuYW1lc3BhY2VJbmZvTGlzdCAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCURPTU5hbWVzcGFjZUluZm9NYW5hZ2VyIG1hbmFnZXIgPSBuZXcgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIoKTsKLQkJCVN0cmluZyBuYW1lID0gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uLmdldE5vZGVOYW1lKCk7Ci0JCQlpZiAobmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCk7Ci0JCQkJaWYgKGluZm8ucHJlZml4ICE9IG51bGwgJiYgaW5mby5wcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCW5hbWUgPSBpbmZvLnByZWZpeCArICI6IiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlyb290RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQocm9vdENNRWxlbWVudERlY2xhcmF0aW9uLCBuYW1lLCBkb2N1bWVudCk7Ci0JCQltYW5hZ2VyLmFkZE5hbWVzcGFjZUluZm8ocm9vdEVsZW1lbnQsIG5hbWVzcGFjZUluZm9MaXN0LCB0cnVlKTsKLQkJfQotCQljcmVhdGVEZWZhdWx0Q29udGVudChkb2N1bWVudCwgcm9vdENNRWxlbWVudERlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0Q29udGVudChOb2RlIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkJY3VycmVudFBhcmVudCA9IHBhcmVudDsKLQkJYWx3YXlzVmlzaXQgPSB0cnVlOwotCQl2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKGVkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVOYW1lKENNTm9kZSBjbU5vZGUsIE5vZGUgcGFyZW50KSB7Ci0JCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQlyZXR1cm4gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGNtTm9kZSwgcGFyZW50LCBwcmVmaXgsIG5hbWVzcGFjZVRhYmxlKTsKLQl9Ci0KLQkvLyBvdmVyaWRlIHRoZSBmb2xsb3dpbmcgJ2NyZWF0ZScgbWV0aG9kcyB0byBjb250cm9sIGhvdyBub2RlcyBhcmUgY3JlYXRlZAotCS8vCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgU3RyaW5nIG5hbWUsIE5vZGUgcGFyZW50KSB7Ci0JCXJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBBdHRyIGNyZWF0ZUF0dHJpYnV0ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0Tm9kZShDTURhdGFUeXBlIGRhdGFUeXBlLCBTdHJpbmcgdmFsdWUsIE5vZGUgcGFyZW50KSB7Ci0JCXJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHVzaFBhcmVudChFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQb3BQYXJlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCX0KLQotCS8vIFRoZSByYW5nZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOTkuCi0JcHVibGljIHZvaWQgc2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoaW50IGkpIHsKLQkJbnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMgPSBpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoKSB7Ci0JCXJldHVybiBudW1PZlJlcGVhdGFibGVFbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCWludCBmb3JjZWRNaW4gPSAoYnVpbGRPcHRpb25hbEVsZW1lbnRzKGJ1aWxkUG9saWN5KSB8fCBhbHdheXNWaXNpdCkgPyAxIDogMDsKLQkJaW50IG1pbiA9IE1hdGgubWF4KGVkLmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7Ci0KLQkJLy8gQ29ycmVjdCB0aGUgbWluIHZhbHVlIGlmIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbgotCQkvLyBhIGdyb3VwLgotCQlpZiAoIWNtR3JvdXBTdGFjay5pc0VtcHR5KCkpIHsKLQkJCUNNR3JvdXAgZ3JvdXAgPSAoQ01Hcm91cCkgY21Hcm91cFN0YWNrLnBlZWsoKTsKLQkJCWludCBnbWluID0gZ3JvdXAuZ2V0TWluT2NjdXIoKTsKLQkJCWlmIChnbWluID09IDApCi0JCQkJaWYgKGJ1aWxkT3B0aW9uYWxFbGVtZW50cyhidWlsZFBvbGljeSkpIHsgCi0JCQkJCS8qIGRvIG5vdGhpbmc6IG1pbiA9IG1pbiAqLwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbWluID0gbWluICogZ21pbjsgLy8gbWluID0gMAotCQkJCX0KLQkJCWVsc2UgewotCQkJCW1pbiA9IG1pbiAqIGdtaW47Ci0JCQl9Ci0JCX0KLQotCQlpbnQgbWF4ID0gTWF0aC5taW4oZWQuZ2V0TWF4T2NjdXIoKSwgZ2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoKSk7Ci0JCWlmIChtYXggPCBtaW4pCi0JCQltYXggPSBtaW47Ci0KLQkJYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQotCQkvLyBOb3RlIC0gZWQgbWF5IG5vdCBiZSBhYnN0cmFjdCBidXQgaGFzIHN1YnN0aXR1dGlvbkdyb3VwcwotCQkvLyBpbnZvbHZlZC4KLQkJaWYgKGJ1aWxkRmlyc3RTdWJzdGl0dXRpb24oYnVpbGRQb2xpY3kpIHx8IGlzQWJzdHJhY3QoZWQpKSAvLyBsZWF2ZQotCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGlzCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkvLyBiYWNrd2FyZAotCQkJCQkJCQkJCQkJCQkJCQkvLyBjb21wYXRpYmlsaXR5Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIGZvciBub3cKLQkJewotCQkJLy8gTm90ZSAtIFRvIGNoYW5nZSBzbyB0aGF0IGlmIGVkIGlzIG9wdGlvbmFsLCB3ZSBkbyBub3QKLQkJCS8vIGdlbmVyYXRlIGFueXRoaW5nIGhlcmUuCi0JCQllZCA9IGdldFN1YnN0aXR1dGlvbihlZCk7Ci0KLQkJCS8vIE5vdGUgLSB0aGUgcmV0dXJuZWQgZWQgbWF5IGJlIGFuIGFic3RyYWN0IGVsZW1lbnQgaW4KLQkJCS8vIHdoaWNoIGNhc2UgdGhlIHhtbCB3aWxsIGJlIGludmFsaWQuCi0JCX0KLQotCQlpZiAobWluID4gMCAmJiAhdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5jb250YWlucyhlZCkpIHsKLQkJCXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuYWRkKGVkKTsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQkJLy8gY3JlYXRlIGFuIEVsZW1lbnQgZm9yIGVhY2gKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChyb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnQgPSByb290RWxlbWVudDsKLQkJCQkJcm9vdEVsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoZWQsIGNvbXB1dGVOYW1lKGVkLCBjdXJyZW50UGFyZW50KSwgY3VycmVudFBhcmVudCk7Ci0JCQkJfQotCi0JCQkJLy8gdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBHcmFtbWFyRWxlbWVudAotCQkJCU5vZGUgb2xkUGFyZW50ID0gY3VycmVudFBhcmVudDsKLQkJCQljdXJyZW50UGFyZW50ID0gZWxlbWVudDsKLQkJCQloYW5kbGVQdXNoUGFyZW50KGVsZW1lbnQsIGVkKTsKLQotCQkJCW5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0KLQkJCQlib29sZWFuIG9sZEF0dGFjaE5vZGVzVG9QYXJlbnQgPSBhdHRhY2hOb2Rlc1RvUGFyZW50OwotCQkJCWF0dGFjaE5vZGVzVG9QYXJlbnQgPSB0cnVlOwotCi0JCQkJLy8gaW5zdGVhZCBvZiBjYWxsaW5nIHN1cGVyLnZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oKQotCQkJCS8vIHdlIGR1cGxpY2F0ZSB0aGUgY29kZSB3aXRoIHNvbWUgbWlub3IgbW9kaWZpY2F0aW9ucwotCQkJCUNNTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJaW50IHNpemUgPSBub2RlTWFwLmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJCXZpc2l0Q01Ob2RlKG5vZGVNYXAuaXRlbShqKSk7Ci0JCQkJfQotCi0JCQkJQ01Db250ZW50IGNvbnRlbnQgPSBlZC5nZXRDb250ZW50KCk7Ci0JCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCQl2aXNpdENNTm9kZShjb250ZW50KTsKLQkJCQl9Ci0KLQkJCQlpZiAoZWQuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpIHsKLQkJCQkJQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGVkLmdldERhdGFUeXBlKCk7Ci0JCQkJCWlmIChkYXRhVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQl2aXNpdENNRGF0YVR5cGUoZGF0YVR5cGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGVuZCBkdXBsaWNhdGlvbgotCQkJCWF0dGFjaE5vZGVzVG9QYXJlbnQgPSBvbGRBdHRhY2hOb2Rlc1RvUGFyZW50OwotCQkJCWhhbmRsZVBvcFBhcmVudChlbGVtZW50LCBlZCk7Ci0JCQkJY3VycmVudFBhcmVudCA9IG9sZFBhcmVudDsKLQkJCQlsaW5rTm9kZShlbGVtZW50KTsKLQkJCX0KLQkJCWludCBzaXplID0gdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5zaXplKCk7Ci0JCQl2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnJlbW92ZShzaXplIC0gMSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01EYXRhVHlwZShDTURhdGFUeXBlIGRhdGFUeXBlKSB7Ci0JCVRleHQgdGV4dCA9IG51bGw7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkJLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci0JCS8vIFByZXZpb3VzIGNvZGUgdXNlcyBhIHByb3BlcnR5IHZhbHVlIGJ1dCBuZXcgb25lIHVzZXMKLQkJLy8gYnVpbGRQb2xpY3kuCi0JCWlmIChnZXRQcm9wZXJ0eShQUk9QRVJUWV9CVUlMRF9CTEFOS19URVhUX05PREVTKSAhPSBudWxsICYmIGdldFByb3BlcnR5KFBST1BFUlRZX0JVSUxEX0JMQU5LX1RFWFRfTk9ERVMpLmVxdWFscygidHJ1ZSIpKSAvLyROT04tTkxTLTEkCi0JCQlidWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5IF4gQlVJTERfVEVYVF9OT0RFUzsKLQotCQlpZiAoYnVpbGRUZXh0Tm9kZXMoYnVpbGRQb2xpY3kpKSB7Ci0JCQl2YWx1ZSA9IHZhbHVlSGVscGVyLmdldFZhbHVlKGRhdGFUeXBlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCAmJiBjdXJyZW50UGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJdmFsdWUgPSBjdXJyZW50UGFyZW50LmdldE5vZGVOYW1lKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2YWx1ZSA9ICJwY2RhdGEiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRleHQgPSBjcmVhdGVUZXh0Tm9kZShkYXRhVHlwZSwgdmFsdWUsIGN1cnJlbnRQYXJlbnQpOwotCQlsaW5rTm9kZSh0ZXh0KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGUpIHsKLQkJY21Hcm91cFN0YWNrLnB1c2goZSk7Ci0KLQkJaW50IGZvcmNlZE1pbiA9IChidWlsZE9wdGlvbmFsRWxlbWVudHMoYnVpbGRQb2xpY3kpIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotCQlpbnQgbWluID0gTWF0aC5tYXgoZS5nZXRNaW5PY2N1cigpLCBmb3JjZWRNaW4pOwotCi0JCWludCBtYXggPSAwOwotCQlpZiAoZS5nZXRNYXhPY2N1cigpID09IC0xKSAvLyB1bmJvdW5kZWQKLQkJCW1heCA9IGdldE51bU9mUmVwZWF0YWJsZUVsZW1lbnRzKCk7Ci0JCWVsc2UKLQkJCW1heCA9IE1hdGgubWluKGUuZ2V0TWF4T2NjdXIoKSwgZ2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoKSk7Ci0KLQkJaWYgKG1heCA8IG1pbikKLQkJCW1heCA9IG1pbjsKLQotCQlhbHdheXNWaXNpdCA9IGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAxOyBpIDw9IG1heDsgaSsrKSB7Ci0JCQlpZiAoZS5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQ0hPSUNFICYmIGJ1aWxkRmlyc3RDaG9pY2UoYnVpbGRQb2xpY3kpKSB7Ci0JCQkJQ01Ob2RlIGhpbnROb2RlID0gbnVsbDsKLQotCQkJCS8vIHRvZG8uLi4gdGhlIENNR3JvdXAgc2hvdWxkIHNwZWNpZnkgdGhlIGhpbnQuLi4gYnV0IGl0IHNlZW1zCi0JCQkJLy8gYXMgdGhvdWdoCi0JCQkJLy8gdGhlIFlhbWF0byBndXlzIGFyZSBtYWtpbmcgdGhlIENNRWxlbWVudCBzcGVjaWZ5IHRoZSBoaW50LgotCQkJCS8vIEkgZG8gaXQgdGhhdCB3YXkgZm9yIG5vdyB1bnRpbC4uLiB3ZSBzaG91bGQgZml4IHRoaXMgcG9zdAotCQkJCS8vIEdBCi0JCQkJLy8gICAgCi0JCQkJaW50IGxpc3RTaXplID0gdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5zaXplKCk7Ci0JCQkJaWYgKGxpc3RTaXplID4gMCkgewotCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5nZXQobGlzdFNpemUgLSAxKTsKLQkJCQkJT2JqZWN0IGNvbnRlbnRIaW50ID0gZWQuZ2V0UHJvcGVydHkoImNvbnRlbnRIaW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGNvbnRlbnRIaW50IGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQkJCQloaW50Tm9kZSA9IChDTU5vZGUpIGNvbnRlbnRIaW50OwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2VlIGlmIHRoaXMgaGludCBjb3JyZXNwb25kcyB0byBhIHZhbGlkIGNob2ljZQotCQkJCS8vCi0JCQkJQ01Ob2RlIGNtTm9kZSA9IG51bGw7Ci0KLQkJCQlpZiAoaGludE5vZGUgIT0gbnVsbCkgewotCQkJCQlDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5vZGVMaXN0TGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChoaW50Tm9kZSA9PSBub2RlTGlzdC5pdGVtKGopKSB7Ci0JCQkJCQkJY21Ob2RlID0gaGludE5vZGU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBpZiBubyBjbU5vZGUgaGFzIGJlZW4gZGV0ZXJtaW5lZCBmcm9tIHRoZSBoaW50LCBqdXN0IHVzZQotCQkJCS8vIHRoZSBmaXJzdCBjaG9pY2UKLQkJCQkvLwotCQkJCWlmIChjbU5vZGUgPT0gbnVsbCkgewotCQkJCQlDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJCWNtTm9kZSA9IG5vZGVMaXN0Lml0ZW0oMCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoY21Ob2RlICE9IG51bGwpIHsKLQkJCQkJdmlzaXRDTU5vZGUoY21Ob2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChlLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5BTEwgLy8gQUxMCi0JCQkJCQl8fCBlLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5TRVFVRU5DRSkgLy8gU0VRVUVOQ0UKLQkJCXsKLQkJCQkvLyB2aXNpdCBhbGwgb2YgdGhlIGNvbnRlbnQKLQkJCQlzdXBlci52aXNpdENNR3JvdXAoZSk7Ci0JCQl9Ci0JCX0KLQotCQljbUdyb3VwU3RhY2sucG9wKCk7Ci0JfQotCi0Jc3RhdGljIGludCBjb3VudCA9IDA7Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkgewotCQlpZiAoYWx3YXlzVmlzaXQgfHwgYnVpbGRPcHRpb25hbEF0dHJpYnV0ZXMoYnVpbGRQb2xpY3kpIHx8IGFkLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQkJCVN0cmluZyBuYW1lID0gY29tcHV0ZU5hbWUoYWQsIGN1cnJlbnRQYXJlbnQpOwotCQkJU3RyaW5nIHZhbHVlID0gdmFsdWVIZWxwZXIuZ2V0VmFsdWUoYWQsIG5hbWVzcGFjZVRhYmxlKTsKLQkJCUF0dHIgYXR0ciA9IGNyZWF0ZUF0dHJpYnV0ZShhZCwgbmFtZSwgY3VycmVudFBhcmVudCk7Ci0JCQlhdHRyLnNldFZhbHVlKHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJbGlua05vZGUoYXR0cik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fic3RyYWN0KENNTm9kZSBlZCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJT2JqZWN0IHZhbHVlID0gZWQuZ2V0UHJvcGVydHkoIkFic3RyYWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9ICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldFN1YnN0aXR1dGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBlZDsKLQkJQ01Ob2RlTGlzdCBsID0gKENNTm9kZUxpc3QpIGVkLmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQ01Ob2RlIGNhbmRpZGF0ZSA9IGwuaXRlbShpKTsKLQkJCQlpZiAoIWlzQWJzdHJhY3QoY2FuZGlkYXRlKSAmJiAoY2FuZGlkYXRlIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb24pKSB7Ci0JCQkJCXJlc3VsdCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2FuZGlkYXRlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0UGFyZW50Q01FbGVtZW50RGVjbGFyYXRpb24oKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbnVsbDsKLQkJaW50IGxpc3RTaXplID0gdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5zaXplKCk7Ci0JCWlmIChsaXN0U2l6ZSA+IDApIHsKLQkJCWVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmdldChsaXN0U2l6ZSAtIDEpOwotCQl9Ci0JCXJldHVybiBlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkgewotCQkvLyBpbmdub3JlIGJ1aWxkUG9saWN5IGZvciBBTlkgZWxlbWVudHMuLi4gb25seSBjcmVhdGUgZWxlbWVudHMgaWYKLQkJLy8gYWJzb2x1dGVseSBuZWVkZWQKLQkJLy8KLQkJaW50IGZvcmNlZE1pbiA9IGFsd2F5c1Zpc2l0ID8gMSA6IDA7Ci0JCWludCBtaW4gPSBNYXRoLm1heChhbnlFbGVtZW50LmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7Ci0JCWFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLQkJU3RyaW5nIHVyaSA9IGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVN0cmluZyB0YXJnZXROU1Byb3BlcnR5ID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiOyAvLyROT04tTkxTLTEkCi0JCUNNRG9jdW1lbnQgcGFyZW50Q01Eb2N1bWVudCA9IChDTURvY3VtZW50KSBhbnlFbGVtZW50LmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicGFyZW50Q01Eb2N1bWVudCA9ICIgKyBwYXJlbnRDTURvY3VtZW50KTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQlpZiAocGFyZW50Q01Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodXJpID09IG51bGwgfHwgdXJpLnN0YXJ0c1dpdGgoIiMjIikgfHwgdXJpLmVxdWFscyhwYXJlbnRDTURvY3VtZW50LmdldFByb3BlcnR5KHRhcmdldE5TUHJvcGVydHkpKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWVkID0gZ2V0U3VpdGFibGVFbGVtZW50KGdldFBhcmVudENNRWxlbWVudERlY2xhcmF0aW9uKCksIHBhcmVudENNRG9jdW1lbnQpOwotCQkJfQotCQl9Ci0KLQotCQlpZiAoZWQgPT0gbnVsbCAmJiBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0ICE9IG51bGwgJiYgdXJpICE9IG51bGwgJiYgIXVyaS5zdGFydHNXaXRoKCIjIyIpICYmIGN1cnJlbnRQYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUNNRG9jdW1lbnQgZXh0ZXJuYWxDTURvY3VtZW50ID0gZXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydC5nZXRDTURvY3VtZW50KChFbGVtZW50KSBjdXJyZW50UGFyZW50LCB1cmkpOwotCQkJaWYgKGV4dGVybmFsQ01Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJZWQgPSBnZXRTdWl0YWJsZUVsZW1lbnQobnVsbCwgZXh0ZXJuYWxDTURvY3VtZW50KTsKLQkJCX0KLQkJfQotCi0JCWZvciAoaW50IGkgPSAxOyBpIDw9IG1pbjsgaSsrKSB7Ci0JCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCXZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiQU5ZLUVMRU1FTlQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWxpbmtOb2RlKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldFN1aXRhYmxlRWxlbWVudChDTU5hbWVkTm9kZU1hcCBuYW1lTm9kZU1hcCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCQlpbnQgc2l6ZSA9IG5hbWVOb2RlTWFwLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gY2FuZGlkYXRlID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBuYW1lTm9kZU1hcC5pdGVtKGkpOwotCQkJaWYgKCF2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmNvbnRhaW5zKGNhbmRpZGF0ZSkpIHsKLQkJCQlyZXN1bHQgPSBjYW5kaWRhdGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U3VpdGFibGVFbGVtZW50KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0U3VpdGFibGVFbGVtZW50KGVkLmdldExvY2FsRWxlbWVudHMoKSk7Ci0JCX0KLQotCQlpZiAocmVzdWx0ID09IG51bGwgJiYgY21Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdWl0YWJsZUVsZW1lbnQoY21Eb2N1bWVudC5nZXRFbGVtZW50cygpKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBsaW5rTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKGF0dGFjaE5vZGVzVG9QYXJlbnQgJiYgY3VycmVudFBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkoKEVsZW1lbnQpIGN1cnJlbnRQYXJlbnQpLnNldEF0dHJpYnV0ZU5vZGUoKEF0dHIpIG5vZGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY3VycmVudFBhcmVudC5hcHBlbmRDaGlsZChub2RlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChyZXN1bHRMaXN0ICE9IG51bGwpIHsKLQkJCXJlc3VsdExpc3QuYWRkKG5vZGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRlc3RQb3B1bGF0ZURvY3VtZW50RnJvbUdyYW1tYXJGaWxlKERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZ3JhbW1hckZpbGVOYW1lLCBTdHJpbmcgcm9vdEVsZW1lbnROYW1lLCBib29sZWFuIGhhY2spIHsKLQkJdHJ5IHsKLQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDTURvY3VtZW50KGdyYW1tYXJGaWxlTmFtZSwgbnVsbCk7Ci0JCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50TWFwID0gY21Eb2N1bWVudC5nZXRFbGVtZW50cygpOwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudE1hcC5nZXROYW1lZEl0ZW0ocm9vdEVsZW1lbnROYW1lKTsKLQotCQkJRE9NQ29udGVudEJ1aWxkZXJJbXBsIGNvbnRlbnRCdWlsZGVyID0gbmV3IERPTUNvbnRlbnRCdWlsZGVySW1wbChkb2N1bWVudCk7Ci0JCQljb250ZW50QnVpbGRlci5zdXByZXNzQ3JlYXRpb25PZkRvY3R5cGVBbmRYTUxEZWNsYXJhdGlvbiA9IGhhY2s7Ci0JCQljb250ZW50QnVpbGRlci5jcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQoY21Eb2N1bWVudCwgZWxlbWVudCk7Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQlET01Xcml0ZXIgd3JpdGVyID0gbmV3IERPTVdyaXRlcigpOwotCQkJaWYgKGhhY2spIHsKLQkJCQl3cml0ZXIucHJpbnQoZG9jdW1lbnQsIGdyYW1tYXJGaWxlTmFtZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl3cml0ZXIucHJpbnQoZG9jdW1lbnQpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0Ci0JLy8KLQkvKgotCSAqIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdbXSkgeyBpZiAoYXJnLmxlbmd0aCA+PSAyKSB7IHRyeSB7Ci0JICogQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyQ01Eb2N1bWVudEJ1aWxkZXJXaXRoQ2xhc3NOYW1lKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZmltcGwuQ01Eb2N1bWVudEJ1aWxkZXJJbXBsIik7Ci0JICogCi0JICogU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSA9IGFyZ1swXTsgU3RyaW5nIHJvb3RFbGVtZW50TmFtZSA9IGFyZ1sxXTsKLQkgKiAKLQkgKiBEb2N1bWVudCBkb2N1bWVudCA9Ci0JICogKERvY3VtZW50KUNsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwiKS5uZXdJbnN0YW5jZSgpOwotCSAqIHRlc3RQb3B1bGF0ZURvY3VtZW50RnJvbUdyYW1tYXJGaWxlKGRvY3VtZW50LCBncmFtbWFyRmlsZU5hbWUsCi0JICogcm9vdEVsZW1lbnROYW1lLCB0cnVlKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIkRPTUNvbnRlbnRCdWlsZGVySW1wbCBlcnJvciIpOyBlLnByaW50U3RhY2tUcmFjZSgpOyB9IH0KLQkgKiBlbHNlIHsgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEKLQkgKiBvcmcuZWNsaXBzZS53c3QueG1sLnV0aWwuRE9NQ29udGVudEJ1aWxkaW5nQ01WaXNpdG9yIGdyYW1tYXJGaWxlTmFtZQotCSAqIHJvb3RFbGVtZW50TmFtZSIpOyB9IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTU5hbWVzcGFjZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWQ0NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRE9NTmFtZXNwYWNlSGVscGVyCi17ICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVUklGb3JQcmVmaXgoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4KQotICB7ICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkgIFN0cmluZyBuc0F0dHJOYW1lID0gbnVsbDsKLQkgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSAKLSAgICB7Ci0JCSAgbnNBdHRyTmFtZSA9ICJ4bWxuczoiICsgcHJlZml4OyAvLyROT04tTkxTLTEkCi0JICB9Ci0JICBlbHNlIAotICAgIHsKLQkJICBuc0F0dHJOYW1lID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCSAgfQotICAgICAgICAgICAgCi0gICAgLy8gYXNzdW1lIHRoZSBub2RlIGlzIHF1YWxpZmllZC4uLiBsb29rIHVwIHRoZSBVUkkgYmFzZSBvbiB0aGUgcHJlZml4Ci0gICAgLy8KLQkgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIAotICAgIHsKLQkgICAJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCB0aGVFbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLQkJICAgIEF0dHIgYXR0ciA9IHRoZUVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuc0F0dHJOYW1lKTsKLQkJICAgIGlmIChhdHRyICE9IG51bGwpIAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAgICAgIAotICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBzb21lIGluZm8gZnJvbSBhbiAnaW1wbGljaXQnIG5hbWVzcGFjZQotICAgIC8vCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlVGFibGUgdGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgcmVzdWx0ID0gdGFibGUuZ2V0VVJJRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShOb2RlIG5vZGUpCi0gIHsgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsgICAgICAgICAgICAgICAKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgIHJlc3VsdCA9IGdldFVSSUZvclByZWZpeChlbGVtZW50LCBwcmVmaXgpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICB7ICAgICAgCi0gICAgICBBdHRyIGF0dHIgPSAoQXR0cilub2RlOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGF0dHIuZ2V0UHJlZml4KCk7Ci0gICAgICByZXN1bHQgPSBnZXRVUklGb3JQcmVmaXgoYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgcHJlZml4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAgICAgICAgCi0KLSAgLy8gdG9kby4uLiB0aGlzIGlzIGFuIHVnbHkgaGFjay4uLiBuZWVkcyB0byBiZSBmaXhlZAotICAvLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlUHJlZml4KENNTm9kZSBjbU5vZGUsIE5vZGUgcGFyZW50Tm9kZSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGZvciAoTm9kZSBub2RlID0gcGFyZW50Tm9kZTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpCi0gICAgewotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0UHJlZml4KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgIAotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbnByZWZpeGVkTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQsIFN0cmluZyBwcmVmaXgpCi0gIHsgICAgIAotICAgIHJldHVybiBjb21wdXRlTmFtZShjbU5vZGUsIHBhcmVudCwgcHJlZml4LCBudWxsKTsKLSAgfSAgIAotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQsIFN0cmluZyBwcmVmaXgsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotCi0gICAgLy8gaWYgdGhlIGNtTm9kZSBoYXMgYSBoYXJkIGNvZGVkIHByZWZpeCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLSAgICAvLwotICAgIGlmIChnZXRQcmVmaXgocmVzdWx0KSA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHF1YWxpZmljYXRpb24gPSAoU3RyaW5nKWNtTm9kZS5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25zUHJlZml4UXVhbGlmaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAvLyBzZWUgaWYgd2UgbmVlZCBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgIC8vCi0gICAgICBpZiAocXVhbGlmaWNhdGlvbiAhPSBudWxsICYmIHF1YWxpZmljYXRpb24uZXF1YWxzKCJxdWFsaWZpZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpICAgICAgICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgIC8vIHRvZG8uLi4gYWRkIGdldENNRG9jdW1lbnQoKSBtZXRob2QgdG8gQ01Ob2RlCi0gICAgICAgICAgLy8gZm9yIG5vdyB1c2UgdGhpcyBnZXRQcm9wZXJ0eSgpIGhhY2sKLSAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpICAgICAgICAgIAotICAgICAgICAgIHsgICAgIAotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICB7ICAgCi0gICAgICAgICAgICAgIC8vIHVzZSB0aGUgTmFtZXNwYWNlVGFibGUgdG8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBwcmVmaXggZm9yIHRoaXMgbmFtZXNwYWNlIHVyaQotICAgICAgICAgICAgICAvLyAgICAgIAotICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVGFibGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudExpbmVhZ2UoKEVsZW1lbnQpcGFyZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZXNwYWNlVGFibGUuZ2V0UHJlZml4Rm9yVVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gcHJlZml4ICsgIjoiICsgcmVzdWx0OyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0gICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFVSSVF1YWxpZmllZE5hbWVDb21wb25lbnRzKFN0cmluZyB1cmlRdWFsaWZpZWROYW1lKQotICB7Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICBpbnQgZmlyc3RJbmRleCA9IHVyaVF1YWxpZmllZE5hbWUuaW5kZXhPZigiWyIpOyAvLyROT04tTkxTLTEkCi0gICAgaW50IGxhc3RJbmRleCA9IHVyaVF1YWxpZmllZE5hbWUuaW5kZXhPZigiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGZpcnN0SW5kZXggIT0gLTEgJiYgbGFzdEluZGV4ID4gZmlyc3RJbmRleCkKLSAgICB7Ci0gICAgICByZXN1bHRbMF0gPSB1cmlRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhmaXJzdEluZGV4ICsgMSwgbGFzdEluZGV4KTsKLSAgICAgIHJlc3VsdFsxXSA9IHVyaVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEpOwotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHRbMV0gPSB1cmlRdWFsaWZpZWROYW1lOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VJbmZvTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3ZWZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VJbmZvTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyICAgICAgICAgIAotICoKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNJX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIoKQotICB7Ci0gIH0gICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE5hbWVzcGFjZUluZm9SZWFkZXIgcmVhZGVyID0gbmV3IE5hbWVzcGFjZUluZm9SZWFkZXIoKTsKLSAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZUluZm9MaXN0KGVsZW1lbnQpOwotICB9ICAgICAgICAgICAgCi0gICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlTmFtZXNwYWNlSW5mbyhFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgIAotICAgIE5hbWVzcGFjZUluZm9SZW1vdmVyIHJlbW92ZXIgPSBuZXcgTmFtZXNwYWNlSW5mb1JlbW92ZXIoKTsKLSAgICByZW1vdmVyLnJlbW92ZU5hbWVzcGFjZUluZm8oZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VJbmZvKEVsZW1lbnQgZWxlbWVudCwgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCwgYm9vbGVhbiBuZWVkc1hTSSkKLSAgeyAgCi0gICAgLy8gZmlyc3Qgd2UgY3JlYXRlIGFuIHhtbG5zIGF0dHJpYnV0ZSBmb3IgZWFjaCBuYW1lc3BhY2UKLSAgICAvLyAgICAgICAgICAgICAgICAgICAKLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb25WYWx1ZSA9ICIiOyAgICAgIC8vJE5PTi1OTFMtMSQKLQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IChOYW1lc3BhY2VJbmZvKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5zSW5mby5ub3JtYWxpemUoKTsKLSAgICAgICAgICAgICAgIAotICAgICAgaWYgKG5zSW5mby51cmkgIT0gbnVsbCkgCi0gICAgICB7ICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IG5zSW5mby5wcmVmaXggIT0gbnVsbCA/ICJ4bWxuczoiICsgbnNJbmZvLnByZWZpeCA6ICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBdHRyIG5hbWVzcGFjZUF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoYXR0ck5hbWUpOyAgCi0gICAgICAgIG5hbWVzcGFjZUF0dHIuc2V0VmFsdWUobnNJbmZvLnVyaSk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShuYW1lc3BhY2VBdHRyKTsgICAKLQotICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2UgdXNlIHRoZSBhdHRyaWJ1dGUgInhzaTpzY2hlbWFMb2NhdGlvbiIKLSAgICAgICAgLy8gaGVyZSB3ZSBidWlsZCB1cCBpdHMgdmFsdWUKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKG5zSW5mby5sb2NhdGlvbkhpbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNjaGVtYUxvY2F0aW9uVmFsdWUgKz0gbnNJbmZvLnVyaTsKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvblZhbHVlICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHNjaGVtYUxvY2F0aW9uVmFsdWUgKz0gbnNJbmZvLmxvY2F0aW9uSGludDsKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvblZhbHVlICs9ICIgIjsgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICB9ICAgCi0KLSAgICAgICAgaWYgKG5zSW5mby51cmkuZXF1YWxzKFhTSV9VUkkpKQotICAgICAgICB7Ci0gICAgICAgICAgbmVlZHNYU0kgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSAgICAgCi0gICAgICBlbHNlIGlmIChuc0luZm8ubG9jYXRpb25IaW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB1c2UgdGhlIGF0dHJpYnV0ZSAieHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iCi0gICAgICAgIC8vCi0gICAgICAgIEF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZSgieHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iKTsgICAvLyROT04tTkxTLTEkCi0gICAgICAgIGF0dHIuc2V0VmFsdWUobnNJbmZvLmxvY2F0aW9uSGludCk7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICAgIH0gCi0gICAgfSAKLQotICAgIGlmIChuZWVkc1hTSSkKLSAgICB7Ci0gICAgICAvLyB3ZSBhZGQgYW4geG1sbnM6eHNpIGF0dHJpYnV0ZSB0byBkZWZpbmUgJ3hzaTpzY2hlbWFMb2NhdGlvbicgYXR0cmlidXRlCi0gICAgICAvLyAgIAotICAgICAgQXR0ciBhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCJ4bWxuczp4c2kiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYXR0ci5zZXRWYWx1ZShYU0lfVVJJKTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICB9Ci0KLSAgICBpZiAoc2NoZW1hTG9jYXRpb25WYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgLy8gY3JlYXRlIHRoZSAieHNpOnNjaGVtYUxvY2F0aW9uIiBhdHRyaWJ1dGUKLSAgICAgIC8vCi0gICAgICBBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoInhzaTpzY2hlbWFMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBhdHRyLnNldFZhbHVlKHNjaGVtYUxvY2F0aW9uVmFsdWUpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9IAotICAgICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmFtZXNwYWNlSW5mb1JlYWRlciBleHRlbmRzIE5hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IKLSAgeyAgCi0gICAgcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdChFbGVtZW50IGVsZW1lbnQpCi0gICAgewotICAgICAgdmlzaXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTSU5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gY3JlYXRlTmFtZXNwYWNlSW5mbygpOwotICAgICAgaW5mby5sb2NhdGlvbkhpbnQgPSB2YWx1ZTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQotICAgIHsgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gY3JlYXRlTmFtZXNwYWNlSW5mbygpOwotICAgICAgaW5mby51cmkgPSB1cmk7Ci0gICAgICBpbmZvLnByZWZpeCA9IHByZWZpeDsgICAgICAKLSAgICAgIHN1cGVyLnZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKGF0dHIsIHByZWZpeCwgdXJpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uVmFsdWVQYWlyKFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gICAgeyAgICAKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGdldE5hbWVzcGFjZUluZm9Gb3JVUkkodXJpKTsgICAgICAgICAgICAKLSAgICAgIGlmIChpbmZvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGluZm8ubG9jYXRpb25IaW50ID0gbG9jYXRpb25IaW50OwotICAgICAgfSAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaW5mbyA9IGNyZWF0ZU5hbWVzcGFjZUluZm8oKTsKLSAgICAgICAgaW5mby51cmkgPSB1cmk7Ci0gICAgICAgIGluZm8ubG9jYXRpb25IaW50ID0gbG9jYXRpb25IaW50OwotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSShTdHJpbmcgdXJpKQotICAgIHsgICAgCi0gICAgICBOYW1lc3BhY2VJbmZvIHJlc3VsdCA9IG51bGw7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgICAgaWYgKGluZm8udXJpICE9IG51bGwgJiYgaW5mby51cmkuZXF1YWxzKHVyaSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBpbmZvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgIAotCi0gICAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gY3JlYXRlTmFtZXNwYWNlSW5mbygpCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICAgIG5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvKTsKLSAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLSAgfQotICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmFtZXNwYWNlSW5mb1JlbW92ZXIgZXh0ZW5kcyBOYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgYXR0cmlidXRlc1RvUmVtb3ZlID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTmFtZXNwYWNlSW5mbyhFbGVtZW50IGVsZW1lbnQpCi0gICAgeyAgCi0gICAgICB2aXNpdEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICByZW1vdmVBdHRyaWJ1dGVzKCk7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgIGF0dHJpYnV0ZXNUb1JlbW92ZS5hZGQoYXR0cik7Ci0gICAgfSAgICAgICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICAgIHsgICAKLSAgICAgIGF0dHJpYnV0ZXNUb1JlbW92ZS5hZGQoYXR0cik7Ci0gICAgICBzdXBlci52aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCBuYW1lc3BhY2VQcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNJU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgYXR0cmlidXRlc1RvUmVtb3ZlLmFkZChhdHRyKTsKLSAgICB9ICAgCi0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpaS5uZXh0KCk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgCi0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01WaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDJmN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vLyB0b2RvLi4gbW92ZSB0aGlzIGNsYXNzIHRvIGFub3RoZXIgcGFja2FnZSAocGVyaGFwcyB4bWx1dGlsaXR5KQotLy8KLXB1YmxpYyBjbGFzcyBET01WaXNpdG9yCi17ICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Tm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdEF0dHIoKEF0dHIpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0Q0RBVEFTZWN0aW9uKChDREFUQVNlY3Rpb24pbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0Q29tbWVudCgoQ29tbWVudClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0RG9jdW1lbnQoKERvY3VtZW50KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdERvY3VtZW50VHlwZSgoRG9jdW1lbnRUeXBlKW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotICAgICAgewotICAgICAgICB2aXNpdEVsZW1lbnQoKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0UHJvY2Vzc2luZ0luc3RydWN0aW9uKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0VGV4dCgoVGV4dClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgCi0gIH0gICAgCi0gICAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGRvY3VtZW50KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RG9jdW1lbnRUeXBlKERvY3VtZW50VHlwZSBkb2N0eXBlKQotICB7ICAgICAgICAgCi0KLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgICAgCi0gICAgdmlzaXRBdHRyaWJ1dGVzSGVscGVyKGVsZW1lbnQpOwotICAgIHZpc2l0Q2hpbGROb2Rlc0hlbHBlcihlbGVtZW50KTsKLSAgfSAKLSAKLQotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHIoQXR0ciBhdHRyKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRUZXh0KFRleHQgdGV4dCkKLSAgeyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0Q0RBVEFTZWN0aW9uKENEQVRBU2VjdGlvbiBjZGF0YVNlY3Rpb24pCi0gIHsgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdENvbW1lbnQoQ29tbWVudCBjb21tZW50KQotICB7ICAgICAgICAgICAgICAgICAgIAotICB9ICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKQotICB7ICAgIAotICB9Ci0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDaGlsZE5vZGVzSGVscGVyKE5vZGUgbm9kZSkKLSAgewotICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Tm9kZShjaGlsZHJlbi5pdGVtKGkpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEF0dHJpYnV0ZXNIZWxwZXIoTm9kZSBub2RlKQotICB7Ci0gICAgTmFtZWROb2RlTWFwIG1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmdldExlbmd0aCgpOyBpKysgKQotICAgIHsKLSAgICAgIHZpc2l0Tm9kZShtYXAuaXRlbShpKSk7Ci0gICAgfQotICB9ICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Xcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWExMTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgaGFja2VkIHVwIGRvbSB3cml0ZXIgc3RvbGVuIGZyb20gYSBYZXJjZXMgc2FtcGxlLgotICogSSdkIGxpa2UgdG8gdXNlIGFuIGV4aXNpdG5nICdnZW5lcmljIERPTScgd3JpdGVyCi0gKiBJZiBhbnlvbmUgY2FuIGZpbmQgc3VjaCBhIHRoaW5nIHRoZW4gcGxlYXNlIGdvIGFoZWFkIGFuZCBqdW5rIHRoaXMuCi0gKgotICogQHZlcnNpb24KLSAqLwotcHVibGljIGNsYXNzIERPTVdyaXRlcgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBmb3JtYXR0aW5nRW5hYmxlZCA9IHRydWU7Ci0gICBwcm90ZWN0ZWQgYm9vbGVhbiBvdXRwdXREb2N0eXBlRW5hYmxlZCA9IHRydWU7Ci0gICBwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgb3V0OwotICAgcHJvdGVjdGVkIGludCBpbmRlbnQgPSAwOyAgCi0KLSAgIHB1YmxpYyBET01Xcml0ZXIoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgewotICAgICB0aGlzKFN5c3RlbS5vdXQpOwotICAgfQotCi0gICBwdWJsaWMgRE9NV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXRTdGVhbSkKLSAgIHsKLSAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG91dHB1dFN0ZWFtKTsKLSAgIH0KLQotICAgcHVibGljIERPTVdyaXRlcihXcml0ZXIgd3JpdGVyKQotICAgewotICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgc2V0Rm9ybWF0dGluZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotICAgewotICAgICBmb3JtYXR0aW5nRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICB9Ci0KLSAgIHB1YmxpYyBib29sZWFuIGdldEZvcm1hdHRpbmdFbmFibGVkKCkKLSAgIHsKLSAgICAgcmV0dXJuIGZvcm1hdHRpbmdFbmFibGVkOwotICAgfQotCi0gICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREb2N0eXBlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gICB7Ci0gICAgIG91dHB1dERvY3R5cGVFbmFibGVkID0gZW5hYmxlZDsKLSAgIH0KLQotICAgcHVibGljIGNsYXNzIFhNTFZpc2l0b3IKLSAgIHsKLSAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzID0gZmFsc2U7Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgICAgewotICAgICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgICAgIHsKLSAgICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0QXR0cigoQXR0cilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRDREFUQVNlY3Rpb24oKENEQVRBU2VjdGlvbilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRDb21tZW50KChDb21tZW50KW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXREb2N1bWVudCgoRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0RG9jdW1lbnRUeXBlKChEb2N1bWVudFR5cGUpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0RWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRUZXh0KChUZXh0KW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KQotICAgICB7Ci0gICAgICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGRvY3VtZW50KTsKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0RG9jdW1lbnRUeXBlKERvY3VtZW50VHlwZSBkb2N0eXBlKQotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBpZiAob3V0cHV0RG9jdHlwZUVuYWJsZWQpCi0gICAgICAgewotICAgICAgICAgU3RyaW5nIGRhdGEgPSBnZXREb2N1bWVudFR5cGVEYXRhKGRvY3R5cGUpOwotICAgICAgICAgcHJpbnQoIjwhRE9DVFlQRSAiICsgZGF0YSArICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgIH0KLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgaWYgKCFkb1Nob3coZWxlbWVudCkpCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgICBib29sZWFuIHBhcmVudEVsZW1lbnRIYXNDaGlsZE5vZGVzID0gY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzOwotICAgICAgIGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cyA9IGhhc0NoaWxkRWxlbWVudHMoZWxlbWVudCk7Ci0KLSAgICAgICBwcmludEluZGVudCgpOwotICAgICAgIHByaW50KCI8Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChlbGVtZW50LmdldE5vZGVOYW1lKCkpOwotICAgICAgIHZpc2l0QXR0cmlidXRlc0hlbHBlcihlbGVtZW50KTsKLQotICAgICAgIGJvb2xlYW4gaGFzQ2hpbGROb2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gMDsgICAgICAgICAgICAgICAgCi0gICAgICAgYm9vbGVhbiBpc1Jvb3RFbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREU7Ci0gICAgICAgaWYgKGhhc0NoaWxkTm9kZXMgfHwgaXNSb290RWxlbWVudCkKLSAgICAgICB7Ci0gICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzIHx8IGlzUm9vdEVsZW1lbnQpCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICBwcmludCgiPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICB9Ci0gICAgICAgICBpbmRlbnQgKz0gMjsKLSAgICAgICAgIHZpc2l0Q2hpbGROb2Rlc0hlbHBlcihlbGVtZW50KTsKLSAgICAgICAgIGluZGVudCAtPSAyOwotCi0gICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzIHx8IGlzUm9vdEVsZW1lbnQpCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByaW50SW5kZW50KCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBwcmludCgiPC8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgcHJpbnQoZWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgIHByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgcHJpbnRsbigiLz4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLQotICAgICAgIGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cyA9IHBhcmVudEVsZW1lbnRIYXNDaGlsZE5vZGVzOwotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRBdHRyKEF0dHIgYXR0cikKLSAgICAgewotICAgICAgIHByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChhdHRyLmdldE5vZGVOYW1lKCkpOwotICAgICAgIHByaW50KCI9XCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KGNyZWF0ZVByaW50YWJsZUNoYXJhY3RlckRhdGEoYXR0ci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgcHJpbnQoIlwiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0VGV4dChUZXh0IHRleHQpCi0gICAgIHsKLSAgICAgICBpZiAoY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzKQotICAgICAgIHsKLSAgICAgICAgIHByaW50SW5kZW50KCk7Ci0gICAgICAgICBwcmludChjcmVhdGVQcmludGFibGVDaGFyYWN0ZXJEYXRhKHRleHQuZ2V0Tm9kZVZhbHVlKCkpKTsKLSAgICAgICAgIHByaW50bG4oKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIHByaW50KGNyZWF0ZVByaW50YWJsZUNoYXJhY3RlckRhdGEodGV4dC5nZXROb2RlVmFsdWUoKSkpOwotICAgICAgIH0KLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0Q0RBVEFTZWN0aW9uKENEQVRBU2VjdGlvbiBjZGF0YVNlY3Rpb24pCi0gICAgIHsKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29tbWVudChDb21tZW50IGNvbW1lbnQpCi0gICAgIHsKLSAgICAgICBwcmludEluZGVudCgpOwotICAgICAgIHByaW50KCI8IS0tIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChjb21tZW50LmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICBwcmludGxuKCItLT4iKTsgLy8kTk9OLU5MUy0xJAotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKQotICAgICB7Ci0gICAgICAgcHJpbnRJbmRlbnQoKTsKLSAgICAgICBwcmludCgiPD8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KHBpLmdldE5vZGVOYW1lKCkpOwotICAgICAgIHByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChwaS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgcHJpbnRsbigiPz4iKTsgLy8kTk9OLU5MUy0xJAotICAgICB9Ci0gICAgICAgICAgICAgCi0KLSAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRFbGVtZW50cyhOb2RlIG5vZGUpCi0gICAgIHsKLSAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgIHsKLSAgICAgICAgIGlmIChjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICB7Ci0gICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRDaGlsZE5vZGVzSGVscGVyKE5vZGUgbm9kZSkKLSAgICAgewotICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgIHsKLSAgICAgICAgIHZpc2l0Tm9kZShjaGlsZHJlbi5pdGVtKGkpKTsKLSAgICAgICB9Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZXNIZWxwZXIoTm9kZSBub2RlKQotICAgICB7Ci0gICAgICAgTmFtZWROb2RlTWFwIG1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmdldExlbmd0aCgpOyBpKysgKQotICAgICAgIHsKLSAgICAgICAgIHZpc2l0Tm9kZShtYXAuaXRlbShpKSk7Ci0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgLyoqIGFuIHVnbHkgaGFjayB1bnRpbCBJIHJlc3RydWN0IHRoaXMgY29kZSBhIGxpdHRsZQotICAgKiAgCi0gICAqLyAgCi0gIHByb3RlY3RlZCBib29sZWFuIGRvU2hvdyhFbGVtZW50IGVsZW1lbnQpICAgIAotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiBjb252ZXJ0cyBET00gdGV4dCB2YWx1ZXMgdG8gJ3ByaW50YWJsZScgdmFsdWVzIAotICAgKiAgLSBjb252ZXJ0cyAnJicgdG8gJyZhbXA7JwotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVQcmludGFibGVDaGFyYWN0ZXJEYXRhKFN0cmluZyBzdHJpbmcpCi0gIHsgICAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIGludCBpbmRleCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaW50IGFtcGVyc2FuZEluZGV4ID0gc3RyaW5nLmluZGV4T2YoIiYiLCBpbmRleCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChhbXBlcnNhbmRJbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICs9IHN0cmluZy5zdWJzdHJpbmcoaW5kZXgsIGFtcGVyc2FuZEluZGV4KTsKLSAgICAgICAgcmVzdWx0ICs9ICImYW1wOyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5kZXggPSBhbXBlcnNhbmRJbmRleCArIDE7IAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IAotICAgIHJlc3VsdCArPSBzdHJpbmcuc3Vic3RyaW5nKGluZGV4KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiogUHJpbnRzIHRoZSBzcGVjaWZpZWQgbm9kZSwgcmVjdXJzaXZlbHkuICovCi0gIHB1YmxpYyB2b2lkIHByaW50KE5vZGUgbm9kZSkKLSAgewotICAgIC8vIGlzIHRoZXJlIGFueXRoaW5nIHRvIGRvPwotICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgewotICAgICAgWE1MVmlzaXRvciB2aXNpdG9yID0gbmV3IFhNTFZpc2l0b3IoKTsKLSAgICAgIHZpc2l0b3IudmlzaXROb2RlKG5vZGUpOwotICAgIH0KLSAgICBvdXQuZmx1c2goKTsKLSAgfQotCi0gIC8qKiBhIHRlbXBvcmFyeSBoYWNrIHRvIHdvcmthcm91bmQgb3VyIGluYWJpbGl0eSB0byBjcmVhdGUgYSBEb2N1bWVudFR5cGUgdGFnKi8KLSAgcHVibGljIHZvaWQgcHJpbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBncmFtbWFyVVJMKQotICB7Ci0gICAgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLSAgICBpZiAoZ3JhbW1hclVSTC5lbmRzV2l0aCgiZHRkIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBpbnQgbGFzdFNsYXNoSW5kZXggPSBNYXRoLm1heChncmFtbWFyVVJMLmxhc3RJbmRleE9mKCIvIiksIGdyYW1tYXJVUkwubGFzdEluZGV4T2YoIlxcIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIGlmIChsYXN0U2xhc2hJbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgc3lzdGVtSWQgPSBncmFtbWFyVVJMLnN1YnN0cmluZyhsYXN0U2xhc2hJbmRleCArIDEpOwotICAgICAgfQotICAgIH0KLSAgICBwcmludChkb2N1bWVudCwgIlVURi04IiwgZ3JhbW1hclVSTCwgbnVsbCwgc3lzdGVtSWQpOyAvLyROT04tTkxTLTEkCi0KLSAgfQotCi0gIC8qKiBhIHRlbXBvcmFyeSBoYWNrIHRvIHdvcmthcm91bmQgb3VyIGluYWJpbGl0eSB0byBjcmVhdGUgYSBEb2N1bWVudFR5cGUgdGFnKi8KLSAgcHVibGljIHZvaWQgcHJpbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBvdXQucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIiArICIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCI/PiIpOyAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgaWYgKGdyYW1tYXJGaWxlTmFtZS5lbmRzV2l0aCgiLmR0ZCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgU3RyaW5nIGRvY1R5cGVMaW5lID0gIjwhRE9DVFlQRSAiICsgZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKSArICIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIGRvY1R5cGVMaW5lICs9ICJQVUJMSUMgXCIiICsgcHVibGljSWQgKyAiXCIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZG9jVHlwZUxpbmUgKz0gIlwiIiArIHN5c3RlbUlkICsgIlwiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIGRvY1R5cGVMaW5lICs9ICI+IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBvdXQucHJpbnRsbihkb2NUeXBlTGluZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBkb2NUeXBlTGluZSArPSAiU1lTVEVNIFwiIiArIHN5c3RlbUlkICsgIlwiID4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgb3V0LnByaW50bG4oZG9jVHlwZUxpbmUpOwotICAgICAgfQotICAgIH0KLSAgICBwcmludChkb2N1bWVudCk7Ci0gIH0gIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERvY3VtZW50VHlwZURhdGEoRG9jdW1lbnRUeXBlIGRvY3R5cGUpCi0gIHsKLSAgICBTdHJpbmcgZGF0YSA9IGRvY3R5cGUuZ2V0TmFtZSgpOwotICAgIGlmIChkb2N0eXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkYXRhICs9ICIgUFVCTElDIFwiIiArIGRvY3R5cGUuZ2V0UHVibGljSWQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgU3RyaW5nIHN5c3RlbUlkID0gZG9jdHlwZS5nZXRTeXN0ZW1JZCgpOwotICAgICAgaWYgKHN5c3RlbUlkID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHN5c3RlbUlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGRhdGEgKz0gIiBcIiIgKyBzeXN0ZW1JZCArICJcIiI7ICAgICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkYXRhICs9ICIgU1lTVEVNIFwiIiArIGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICByZXR1cm4gZGF0YTsKLSAgfSAgICAgCi0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigpCi0gIHsKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oc3RyaW5nKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludChzdHJpbmcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50SW5kZW50KCkKLSAgeyAgICAgICAgICAgICAKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAgCi0KLSAgcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHN0cmluZykKLSAgewotICAgIG91dC5wcmludChzdHJpbmcpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhM2M0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8vIHRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gYnVpbGQgYSBncmFtbWFyIGRvY3VtZW50IGdpdmVuIGEgbG9jYWwgZmlsZSBuYW1lCi0vLwotcHVibGljIGludGVyZmFjZSBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5Ci17ICAgCi0gIHB1YmxpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIHVyaSk7IAotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24oQ01Eb2N1bWVudCBjbURvY3VtZW50LCBFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gaXNMb2NhbCk7Ci0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNNQ29udGVudChDTURvY3VtZW50IHBhcmVudENNRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBDTURvY3VtZW50IGNoaWxkQ01Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGRFZCwgYm9vbGVhbiBpc0xvY2FsLCBTdHJpbmcgdXJpKTsKLSAgcHVibGljIHZvaWQgZGVidWdQcmludChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pOyAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkMTkzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMTk4ODA3IC0gYXR0cmlidXRlIG9yZGVyIGRlcGVuZGFuY3kuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NDSEVNQV9JTlNUQU5DRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgeHNpUHJlZml4ID0gInhzaSI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgdm9pZCB2aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyBuYW1lc3BhY2VQcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsgICAKLSAgICBpZiAobmFtZXNwYWNlVVJJLmVxdWFscyhYTUxfU0NIRU1BX0lOU1RBTkNFX1VSSSkpCi0gICAgewotICAgICAgeHNpUHJlZml4ID0gbmFtZXNwYWNlUHJlZml4OwotICAgIH0KLSAgfSAKLQotICBwdWJsaWMgdm9pZCB2aXNpdFhTSU5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WFNJU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlKTsgICAgICAgICAgCi0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgU3RyaW5nIG5zVVJJID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotICAgICAgU3RyaW5nIGxvY2F0aW9uSGludCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsgICAgICAgICAgICAKLSAgICAgIGlmIChuc1VSSSAhPSBudWxsICYmIGxvY2F0aW9uSGludCAhPSBudWxsKQotICAgICAgeyAgICAKLSAgICAgICAgdmlzaXRYU0lTY2hlbWFMb2NhdGlvblZhbHVlUGFpcihuc1VSSSwgbG9jYXRpb25IaW50KTsgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WFNJU2NoZW1hTG9jYXRpb25WYWx1ZVBhaXIoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE5hbWVkTm9kZU1hcCBtYXAgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgbWFwTGVuZ3RoID0gbWFwLmdldExlbmd0aCgpOwotICAgIAotICAgIC8vIEZpcnN0IHJldHJpZXZlIGFsbCB0aGUgbmFtZXNwYWNlcyBzbyB0aGF0IHRoZXkgYXJlIGxvYWRlZCBiZWZvcmUKLSAgICAvLyBkb2luZyBhbnkgc3BlY2lhbCBwcmVmaXggaGFuZGxpbmcuICBUaGlzIGFsbG93cyB0aGUgYXR0cmlidXRlcyB0byBiZQotICAgIC8vIGRlZmluZWQgaW4gYW55IG9yZGVyLCBidXQgdGhlIG5hbWVzcGFjZXMgaGF2ZSB0byBiZSByZXRyaWV2ZWQgZmlyc3QuCi0gICAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBMZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBBdHRyIGF0dHIgPSAoQXR0ciltYXAuaXRlbShpKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIFN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgdW5wcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoInhtbG5zIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKGF0dHIsIHVucHJlZml4ZWROYW1lLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh1bnByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAodW5wcmVmaXhlZE5hbWUuZXF1YWxzKCJ4bWxucyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCAiIiwgYXR0ci5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcExlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKW1hcC5pdGVtKGkpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoYXR0ci5nZXROYW1lKCkpOwotICAgICAgU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiB1bnByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgIAlpZiAocHJlZml4LmVxdWFscyh4c2lQcmVmaXgpICYmIHVucHJlZml4ZWROYW1lLmVxdWFscygic2NoZW1hTG9jYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0lTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShhdHRyLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHByZWZpeC5lcXVhbHMoeHNpUHJlZml4KSAmJiB1bnByZWZpeGVkTmFtZS5lcXVhbHMoIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKGF0dHIsIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhZjkxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm8KLXsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIFN0cmluZyB1cmk7Ci0gIHB1YmxpYyBTdHJpbmcgcHJlZml4OwotICBwdWJsaWMgU3RyaW5nIGxvY2F0aW9uSGludDsKLSAgcHVibGljIGJvb2xlYW4gaXNQcmVmaXhSZXF1aXJlZDsgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgaGFzaHRhYmxlOwotCi0gIHB1YmxpYyBOYW1lc3BhY2VJbmZvKCkKLSAgewotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8oU3RyaW5nIHVyaSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMudXJpID0gdXJpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0gICAgdGhpcy5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7Ci0gIH0gICAKLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyhOYW1lc3BhY2VJbmZvIHRoYXQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMudXJpID0gdGhhdC51cmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnByZWZpeCA9IHRoYXQucHJlZml4OwotICAgIHRoaXMubG9jYXRpb25IaW50ID0gdGhhdC5sb2NhdGlvbkhpbnQ7Ci0gICAgLy8gdG9kby4uLiBzZWUgaWYgd2UgbmVlZCB0byBjbG9uZSB0aGUgaGFzdGFibGUgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKQotICB7Ci0gICAgdXJpID0gZ2V0Tm9ybWFsaXplZFZhbHVlKHVyaSk7Ci0gICAgcHJlZml4ICA9IGdldE5vcm1hbGl6ZWRWYWx1ZShwcmVmaXgpOwotICAgIGxvY2F0aW9uSGludD0gZ2V0Tm9ybWFsaXplZFZhbHVlKGxvY2F0aW9uSGludCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vcm1hbGl6ZWRWYWx1ZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIChzdHJpbmcgIT0gbnVsbCAmJiBzdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDApID8gbnVsbCA6IHN0cmluZzsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmIChoYXNodGFibGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgfQotICAgIGhhc2h0YWJsZS5wdXQocHJvcGVydHksIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmV0dXJuIChoYXNodGFibGUgIT0gbnVsbCkgPyBoYXNodGFibGUuZ2V0KHByb3BlcnR5KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgY2xvbmVOYW1lc3BhY2VJbmZvTGlzdChMaXN0IG9sZExpc3QpCi0gIHsgIAotICAgIExpc3QgbmV3TGlzdCA9IG5ldyBWZWN0b3Iob2xkTGlzdC5zaXplKCkpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgIG5ld0xpc3QuYWRkKG5ldyBOYW1lc3BhY2VJbmZvKG9sZEluZm8pKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG5ld0xpc3Q7Ci0gIH0KLX0gICAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGEyNTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZVRhYmxlIGV4dGVuZHMgTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvcgoteyAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEhhc2h0YWJsZSBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKERvY3VtZW50IGRvY3VtZW50KQotICB7ICAgICAgICAgCi0JICB0aGlzKCk7Ci0gICAgLy9ET01FeHRlbnNpb24gZG9tRXh0ZW5zaW9uID0gRE9NRXh0ZW5zaW9uUHJvdmlkZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERPTUV4dGVuc2lvbihkb2N1bWVudCk7Ci0gICAgLy9pZiAoZG9tRXh0ZW5zaW9uICE9IG51bGwpCi0gICAgLy97ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyAgYWRkTmFtZXNwYWNlSW5mb0xpc3QoZG9tRXh0ZW5zaW9uLmdldEltcGxpY3ROYW1lc3BhY2VJbmZvTGlzdCgpLCB0cnVlKTsKLSAgICAvLyB9Ci0gIH0gICAKLQotICBwcml2YXRlIE5hbWVzcGFjZVRhYmxlKCkKLSAgeyAgICAgICAKLQkgIHN1cGVyKCk7Ci0gIH0gIAotCi0gIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKQotICB7Ci0gICAgcmV0dXJuIGhhc2h0YWJsZS52YWx1ZXMoKS5zaXplKCkgPiAwOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhGb3JVUkkoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgTmFtZXNwYWNlSW5mbyBlbnRyeSA9IGdldE5hbWVzcGFjZUluZm9Gb3JVUkkodXJpLCB0cnVlKTsKLSAgICBpZiAoZW50cnkgIT0gbnVsbCkgCi0gICAgewotICAgICAgcmVzdWx0ID0gZW50cnkucHJlZml4OwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgICAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRVUklGb3JQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgeyAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gZ2V0TmFtZXNwYWNlSW5mb0ZvclByZWZpeChwcmVmaXgpOwotICAgIGlmIChpbmZvICE9IG51bGwpIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGluZm8udXJpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLQotICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hdGNoaW5nU3RyaW5nKFN0cmluZyBhLCBTdHJpbmcgYikKLSAgewotICAgIHJldHVybiAoKGEgPT0gbnVsbCAmJiBiID09IG51bGwpIHx8IChhICE9IG51bGwgJiYgYiAhPSBudWxsICYmIGEuZXF1YWxzKGIpKSk7Ci0gIH0KLSAgIAotCi0gIHB1YmxpYyBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm9Gb3JVUkkoU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGdldE5hbWVzcGFjZUluZm9Gb3JVUkkodXJpLCBmYWxzZSk7Ci0gIH0KLQotCi0gIHB1YmxpYyBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm9Gb3JVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiB0ZXN0SW1wbGllZCkKLSAgewotICAgIE5hbWVzcGFjZUluZm8gcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBoYXNodGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIE5hbWVzcGFjZUluZm8gbnNJbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7IAotICAgICAgaWYgKGlzTWF0Y2hpbmdTdHJpbmcobnNJbmZvLnVyaSwgdXJpKSkKLSAgICAgIHsgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBuc0luZm87Ci0gICAgICAgIGlmICh0ZXN0SW1wbGllZCAmJiBuc0luZm8uZ2V0UHJvcGVydHkoImlzSW1wbGllZCIpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIC8vIGNvbnRpbnVlCi0gICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotCi0gIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uSGludEZvclVSSShTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICB7ICAgICAgCi0gICAvLyBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gaGFzaHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOyAKLSAgICAgIGlmIChpc01hdGNoaW5nU3RyaW5nKG5zSW5mby51cmksIHVyaSkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgbnNJbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAKLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyBnZXROYW1lc3BhY2VJbmZvRm9yUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByZWZpeCA9IHByZWZpeCAhPSBudWxsID8gcHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICByZXR1cm4gKE5hbWVzcGFjZUluZm8paGFzaHRhYmxlLmdldChwcmVmaXgpOwotICB9ICAgCi0KLQotICBwdWJsaWMgdm9pZCB2aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyBuYW1lc3BhY2VQcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7ICAgICAgCi0gICAgbnNJbmZvLnByZWZpeCA9IG5hbWVzcGFjZVByZWZpeDsKLSAgICBuc0luZm8udXJpID0gbmFtZXNwYWNlVVJJOyAgICAgIAotICAgCi0gICAgTmFtZXNwYWNlSW5mbyBtYXRjaGluZ05hbWVzcGFjZUluZm8gPSBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgaWYgKG1hdGNoaW5nTmFtZXNwYWNlSW5mbyAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIG5zSW5mby5sb2NhdGlvbkhpbnQgPSBtYXRjaGluZ05hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50OwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKG5hbWVzcGFjZVByZWZpeCwgbnNJbmZvKTsKLQotICAgIHN1cGVyLnZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKGF0dHIsIG5hbWVzcGFjZVByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgfSAKLSAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0WFNJU2NoZW1hTG9jYXRpb25WYWx1ZVBhaXIoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgewotICAgIHNldExvY2F0aW9uSGludEZvclVSSSh1cmksIGxvY2F0aW9uSGludCk7Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VJbmZvKE5hbWVzcGFjZUluZm8gaW5mbykKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBrZXkgID0gKGluZm8ucHJlZml4ICE9IG51bGwpID8gaW5mby5wcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhrZXksIGluZm8pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKFN0cmluZyBrZXksIE5hbWVzcGFjZUluZm8gaW5mbykKLSAgewotICAgIGhhc2h0YWJsZS5wdXQoa2V5LCBpbmZvKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbGlzdCwgYm9vbGVhbiBpc0ltcGxpZWQpCi0gIHsgICAgICAgCi0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOwotICAgICAgICBOYW1lc3BhY2VJbmZvIGNsb25lID0gbmV3IE5hbWVzcGFjZUluZm8oaW5mbyk7ICAgIAotICAgICAgICBpZiAoaXNJbXBsaWVkKQotICAgICAgICB7Ci0gICAgICAgICAgY2xvbmUuc2V0UHJvcGVydHkoImlzSW1wbGllZCIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIGFkZE5hbWVzcGFjZUluZm8oY2xvbmUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbGlzdCkKLSAgeyAgCi0gICAgYWRkTmFtZXNwYWNlSW5mb0xpc3QobGlzdCwgZmFsc2UpOyAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdFhTSU5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICB7Ci0gICAgYWRkTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbihsb2NhdGlvbkhpbnQpOwotICB9IAotCi0gIHB1YmxpYyB2b2lkIGFkZE5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgewotICAgIE5hbWVzcGFjZUluZm8gbnNJbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsgICAgICAKLSAgICBuc0luZm8ucHJlZml4ID0gbnVsbDsKLSAgICBuc0luZm8udXJpID0gIiI7ICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBuc0luZm8ubG9jYXRpb25IaW50ID0gbG9jYXRpb25IaW50OyAgCi0gICAgaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKCIiLCBuc0luZm8pOyAvLyROT04tTkxTLTEkCi0gIH0gCi0KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlSW5mbyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICB7Ci0gICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOyAgICAgIAotICAgIG5zSW5mby5wcmVmaXggPSBwcmVmaXg7Ci0gICAgbnNJbmZvLnVyaSA9IHVyaTsgICAgICAKLSAgICBuc0luZm8ubG9jYXRpb25IaW50ID0gbG9jYXRpb25IaW50OyAgCi0gICAgaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKHByZWZpeCAhPSBudWxsID8gcHJlZml4IDogIiIsIG5zSW5mbyk7IC8vJE5PTi1OTFMtMSQKLSAgfSAKLQotICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgIAotICAgIHZpc2l0RWxlbWVudChlbGVtZW50KTsgIAotICB9ICAgICAgCi0gICAgICAgICAKLSAgcHVibGljIHZvaWQgYWRkRWxlbWVudExpbmVhZ2UoRWxlbWVudCB0YXJnZXRFbGVtZW50KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gTmFtZXNwYWNlVGFibGUuZ2V0RWxlbWVudExpbmVhZ2UodGFyZ2V0RWxlbWVudCk7ICAgICAgICAgICAgICAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpaS5uZXh0KCk7Ci0gICAgICBhZGRFbGVtZW50KGVsZW1lbnQpOwotICAgIH0gICAgICAgICAgICAKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFbGVtZW50TGluZWFnZShFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgICAgCi0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgICAgICAgIAotICAgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hZGQoMCwgbm9kZSk7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE5hbWVzcGFjZUluZm9Db2xsZWN0aW9uKCkKLSAgeyAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGhhc2h0YWJsZS52YWx1ZXMoKTsKLSAgfSAKLQotICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIGxpc3QuYWRkQWxsKGhhc2h0YWJsZS52YWx1ZXMoKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLX0gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViY2UwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVtZjJ4bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBFTUYyRE9NU1NFQWRhcHRlciBleHRlbmRzIEVNRjJET01BZGFwdGVySW1wbCBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCi0JcHJpdmF0ZSBDbGFzcyByZXNvdXJjZUNsYXNzOwotCXB1YmxpYyBFTUYyRE9NU1NFQWRhcHRlcihOb2RlIG5vZGUsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKG5vZGUsIHJlbmRlcmVyLCB0cmFuc2xhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgRU1GMkRPTVNTRUFkYXB0ZXIoTm90aWZpZXIgb2JqZWN0LCBOb2RlIG5vZGUsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKG9iamVjdCwgbm9kZSwgcmVuZGVyZXIsIHRyYW5zbGF0b3IpOwotCX0KLQotCXB1YmxpYyBFTUYyRE9NU1NFQWRhcHRlcihUcmFuc2xhdG9yUmVzb3VyY2UgcmVzb3VyY2UsIERvY3VtZW50IGRvY3VtZW50LCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlzdXBlcihyZXNvdXJjZSwgZG9jdW1lbnQsIHJlbmRlcmVyLCB0cmFuc2xhdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNhbGNJbmRlbnRTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZS5nZXRQYXJlbnROb2RlKCksICJOb2RlIG11c3QgYmUgY29ubmVjdGVkIGludG8gdGhlIHRyZWUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJU3RyaW5nIGluZGVudFN0cmluZyA9IGdldE5ld2xpbmVTdHJpbmcobm9kZSk7Ci0KLQkJLy8gRmluZCBpbmRlbnRhdGlvbiBzdHJpbmcgZm9yIHRoaXMgbm9kZSBiYXNlZCBvbiBpdHMgc2libGluZyBvcgotCQkvLyBwYXJlbnQKLQkJTm9kZSBwcmV2aW91c1NpYmxpbmcgPSBET01VdGlsaXRpZXMuZ2V0UHJldmlvdXNOb2RlU2libGluZyhub2RlKTsKLQkJaWYgKHByZXZpb3VzU2libGluZyAhPSBudWxsKSB7Ci0JCQlpbmRlbnRTdHJpbmcgPSBwcmltR2V0SW5kZW50U3RyaW5nKHByZXZpb3VzU2libGluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgcGFyZW50SW5kZW50U3RyaW5nID0gcHJpbUdldEluZGVudFN0cmluZyhwYXJlbnQpOwotCQkJaW5kZW50U3RyaW5nID0gcGFyZW50SW5kZW50U3RyaW5nICsgRE9NVXRpbGl0aWVzLklOREVOVF9TVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIGluZGVudFN0cmluZzsKLQl9Ci0KLQkvKgotCSAqIFByaW50cyBvdXQgYSBET00gbm90aWZpY2F0aW9uIGZvciBkZWJ1Z2dpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVidWdET01Ob3RpZnkoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlpZiAoZkRlYnVnKSB7Ci0JCQlTdHJpbmcgbm90aWZUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkFERCA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJBREQiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5SRU1PVkUgOgotCQkJCQlub3RpZlR5cGUgPSAiUkVNT1ZFIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQkJbm90aWZUeXBlID0gIkNIQU5HRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJDT05URU5UX0NIQU5HRUQiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJTVFJVQ1RVUkVfQ0hBTkdFIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJET00gQ2hhbmdlOiAiICsgbm90aWZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIlx0bm90aWZpZXIgICAgICA6ICIgKyBub3RpZmllcik7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJcdGNoYW5nZWRGZWF0dXJlOiAiICsgY2hhbmdlZEZlYXR1cmUpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiXHRvbGRWYWx1ZSAgICAgIDogIiArIG9sZFZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIlx0bmV3VmFsdWUgICAgICA6ICIgKyBuZXdWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2FibGVVbmRvTWFuYWdlbWVudElmTmVjZXNzYXJ5KCkgewotCQlJRE9NTW9kZWwgbW9kZWwgPSBnZXRYTUxNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQltb2RlbC5kaXNhYmxlVW5kb01hbmFnZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVVbmRvTWFuYWdlbWVudCgpIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0WE1MTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJbW9kZWwuZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld2xpbmVTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCS8qCi0JCSAqIFdlIHNob3VsZCBhbHdheXMgaGF2ZSBJRE9NTm9kZSwgYW5kIElTdHJ1Y3R1cmVkRG9jdW1lbnQsIGFuZAotCQkgKiBjb25zcXVlbnRseSBhIHZhbGlkICJwcmVmZXJyZWQiIGxpbmUgZGVsaW1pdGVyLCBidXQganVzdCB0byBiZQotCQkgKiBzYWZlLCB3ZSdsbCBhc3NpZ24gc29tZXRoaW5nIGJ5IGRlZmF1bHQuCi0JCSAqLwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IHhtbE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBkb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIERPTVV0aWxpdGllcy5ORVdMSU5FX1NUUklORzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU1vZGVsIGdldFhNTE1vZGVsKCkgewotCQlpZiAoZ2V0Tm9kZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gKChJRE9NTm9kZSkgZ2V0Tm9kZSgpKS5nZXRNb2RlbCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0WE1MTm9kZSgpIHsKLQkJcmV0dXJuIChJRE9NTm9kZSkgZ2V0Tm9kZSgpOwotCX0KLQotCS8qCi0JICogRG8gbm90aGluZyBmb3IgU1NFLCB3ZSB3aWxsIHRvbGVyYXRlIGFueXRoaW5nIHRoZXkgYWRkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbihGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIERvIG5vdGhpbmcgZm9yIFNTRSwgd2Ugd2lsbCB0b2xlcmF0ZSBhbnl0aGluZyB0aGV5IGFkZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUludmFsaWRNdWx0aU5vZGVzKFN0cmluZyBub2RlTmFtZSkgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5kZW50KE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlLmdldFBhcmVudE5vZGUoKSwgIk5vZGUgbXVzdCBiZSBjb25uZWN0ZWQgaW50byB0aGUgdHJlZSIpOyAvLyROT04tTkxTLTEkCi0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0KLQkJU3RyaW5nIGluZGVudFN0cmluZyA9IGNhbGNJbmRlbnRTdHJpbmcobm9kZSk7Ci0KLQkJLy8gSW5kZW50IGJlZm9yZSB0aGUgc3RhcnQgdGFnCi0JCWluZGVudFN0YXJ0VGFnKGluZGVudFN0cmluZywgbm9kZSwgbWFwKTsKLQotCQkvLyBJbmRlbnQgYmVmb3JlIHRoZSBlbmQgdGFnCi0JCWluZGVudEVuZFRhZyhpbmRlbnRTdHJpbmcsIG5vZGUsIG1hcCk7Ci0JfQotCi0JLyoqCi0JICogSW5kZW50IGJlZm9yZSB0aGUgZW5kIHRhZyBvZiB0aGUgPG5vZGU+cGFzc2VkIGluLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluZGVudEVuZFRhZyhTdHJpbmcgaW5kZW50U3RyaW5nLCBOb2RlIG5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCWlmICghbWFwLnNob3VsZEluZGVudEVuZFRhZyhub2RlKSkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGRvbVBhdGggPSBtYXAuZ2V0RE9NUGF0aCgpOwotCi0JCWlmICgoIW1hcC5pc01hbmFnZWRCeVBhcmVudCgpICYmICFtYXAuaXNET01UZXh0VmFsdWUoKSkgfHwgKG1hcC5pc01hbmFnZWRCeVBhcmVudCgpICYmIGRvbVBhdGgubGVuZ3RoKCkgIT0gMCkgJiYgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFscyhkb21QYXRoKSkgewotCQkJVGV4dCBuZXdXUyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKGdldE5ld2xpbmVTdHJpbmcobm9kZSkgKyBpbmRlbnRTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCQlET01VdGlsaXRpZXMuaW5zZXJ0QmVmb3JlTm9kZShub2RlLCBuZXdXUywgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbmRlbnQgYmVmb3JlIHRoZSBzdGFydCB0YWcgb2YgdGhlIDxub2RlPnBhc3NlZCBpbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbmRlbnRTdGFydFRhZyhTdHJpbmcgaW5kZW50U3RyaW5nLCBOb2RlIG5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCVRleHQgbmV3V1MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShnZXROZXdsaW5lU3RyaW5nKG5vZGUpICsgaW5kZW50U3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlET01VdGlsaXRpZXMuaW5zZXJ0QWZ0ZXJOb2RlKHBhcmVudCwgbmV3V1MsIERPTVV0aWxpdGllcy5nZXRQcmV2aW91c05vZGVTaWJsaW5nKG5vZGUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VtcHR5VGFnKEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiAoKElET01FbGVtZW50KSBwYXJlbnQpLmlzRW1wdHlUYWcoKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBET00gbm9kZSBjaGFuZ2VzLiBJdCBhdHRlbXB0cyB0byB1cGRhdGUKLQkgKiBNT0Ygb2JqZWN0IGJhc2VkIG9uIHRoZSBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCi0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJZGVidWdET01Ob3RpZnkobm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0KLQkJaWYgKG5vdGlmaWVyICE9IGdldE5vZGUoKSAmJiBldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5DSEFOR0UpIHsKLQkJCS8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIG5vdGlmaWNhdGlvbiB3YXMgc2VudCBmcm9tIGEKLQkJCS8vIHN1YiBub2RlLiBVc2UgdGhlIG5vdGlmaWVycyBuYW1lIHRvIGRldGVybWluZSB3aGljaAotCQkJLy8gTU9GIGZlYXR1cmUgdG8gdXBkYXRlLiBOb3RlIHRoYXQgaXMgaXMgYXNzdW1lZCB0aGF0IGlmCi0JCQkvLyB0aGUgZXZlbnRUeXBlIGlzIENIQU5HRSB0aGVuIGl0IGF0dHJpYnV0ZSBvbiBhIHBhdGggbm9kZQotCQkJLy8gY2hhbmdpbmcuIFRoaXMgd2FzIHB1dCBpbiBmb3IgdGhlIEVHTCBncm91cC4KLQkJCWlmIChub3RpZmllciBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJCQlFbGVtZW50IG5vdGlmeWluZ05vZGUgPSAoRWxlbWVudCkgbm90aWZpZXI7Ci0JCQkJCVRyYW5zbGF0b3IgbWFwID0gZmluZFRyYW5zbGF0b3Iobm90aWZ5aW5nTm9kZS5nZXROb2RlTmFtZSgpLCBmYWxzZSk7Ci0JCQkJCWlmIChtYXAgIT0gbnVsbCkKLQkJCQkJCXVwZGF0ZU1PRkZlYXR1cmUobWFwLCBnZXROb2RlKCksIGdldEVPYmplY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gVXBkYXRlIGV2ZXJ5dGhpbmcgb24gU1RSVUNUVVJFX0NIQU5HRSBvciBDT05URU5UX0NIQU5HRS4KLQkJCS8vIE90aGVyIGV2ZW50IHR5cGVzIG9jY3VyIHRvbyBvZnRlbi4KLQkJCWlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQpIHsKLQkJCQl1cGRhdGVNT0YoKTsKLQkJCX0KLQkJCS8vIFVwZGF0ZSBqdXN0IHRoZSBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkLgotCQkJZWxzZSBpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQkJVHJhbnNsYXRvciBtYXAgPSBmaW5kVHJhbnNsYXRvcihjaGFuZ2VkRmVhdHVyZS50b1N0cmluZygpLCB0cnVlKTsKLQkJCQlpZiAobWFwICE9IG51bGwpCi0JCQkJCXVwZGF0ZU1PRkZlYXR1cmUobWFwLCBnZXROb2RlKCksIGdldEVPYmplY3QoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3N0VXBkYXRlRE9NRmVhdHVyZShUcmFuc2xhdG9yIG1hcCwgTm9kZSBub2RlLCBFT2JqZWN0IG1vZk9iamVjdCkgewotCQllbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZVVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJc3VwZXIucHJlVXBkYXRlRE9NRmVhdHVyZShtYXAsIG5vZGUsIG1vZk9iamVjdCk7Ci0JCWRpc2FibGVVbmRvTWFuYWdlbWVudElmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUFkZERPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7Ci0JCSgoSURPTU5vZGUpIGFOb2RlKS5hZGRBZGFwdGVyKChFTUYyRE9NU1NFQWRhcHRlcikgYW5BZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCi0JICovCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIHByaW1DcmVhdGVBZGFwdGVyKEVPYmplY3QgbW9mT2JqZWN0LCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0JCUVsZW1lbnQgbmV3Tm9kZSA9IGNyZWF0ZU5ld05vZGUobW9mT2JqZWN0LCBjaGlsZE1hcCk7Ci0JCXJldHVybiBuZXcgRU1GMkRPTVNTRUFkYXB0ZXIobW9mT2JqZWN0LCBuZXdOb2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWRhcHRlciBmb3IgYSBjaGlsZCBET00gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIFRoZSBub2RlIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciBmb3IuCi0JICovCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIHByaW1DcmVhdGVBZGFwdGVyKE5vZGUgbm9kZSwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VBZGFwdGVyKG5vZGUsIGZSZW5kZXJlciwgY2hpbGRNYXApOwotCX0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb2RlIG5vZGUsIFRyYW5zbGF0b3IgY2hpbGRNYXApIHsKLQotCQkvL0Fzc2VydC5pc05vdE51bGwoY2hpbGRNYXAuZ2V0Q2hpbGRBZGFwdGVyQ2xhc3MoKSk7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZSk7Ci0KLQkJRU1GMkRPTUFkYXB0ZXIgYWRhcHRlciA9IHByaW1HZXRFeGlzdGluZ0FkYXB0ZXIobm9kZSk7Ci0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXIuaXNNT0ZQcm94eSgpIHx8IGFkYXB0ZXIuZ2V0VGFyZ2V0KCkgPT0gbnVsbCkgewotCQkJCXJlbW92ZURPTUFkYXB0ZXIobm9kZSwgYWRhcHRlcik7Ci0JCQkJaWYgKGFkYXB0ZXIuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVyLmdldFRhcmdldCgpLmVBZGFwdGVycygpLnJlbW92ZShhZGFwdGVyKTsKLQkJCQl9Ci0JCQkJYWRhcHRlciA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyID0gcHJpbUNyZWF0ZUFkYXB0ZXIobm9kZSwgY2hpbGRNYXApOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRET01BZGFwdGVyKE5vZGUgY2hpbGROb2RlKSB7Ci0KLQkJLy8gT25seSBhZGQgdGhlIGFkYXB0ZXIgaWYgdGhpcyBpcyBhbiBjaGlsZCBub2RlIHRoYXQgd2lsbCBub3QgYmUKLQkJLy8gYWRhcHRlZC4gRm9yIGluc3RhbmNlIGEgc3VidHJlZSB0aGF0IG1hcHMgdG8gYSBNT0YgYXR0cmlidXRlCi0JCS8vIHNldHRpbmcuCi0JCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRU1GMkRPTUFkYXB0ZXIgYXR0ckFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyKGNoaWxkTm9kZSk7Ci0KLQkJCWlmIChhdHRyQWRhcHRlciA9PSBudWxsIHx8IGF0dHJBZGFwdGVyLmdldE5vZGUoKSAhPSBnZXROb2RlKCkpIHsKLQkJCQkvLyBJZiB0aGUgbm9kZSBpcyBhZGFwdGVkLCBidXQgbm90IGJ5IHRoaXMgYWRhcHRlciB0aGVuIHJlbW92ZQotCQkJCS8vIGl0LiBUaGlzIGhhcHBlbnMgdG8gbm9uLW9iamVjdCBjaGlsZHJlbiB3aGVuIHRoZSBwYXJlbnQgdGFnCi0JCQkJLy8gbmFtZSBpcyBjaGFuZ2VkLgotCQkJCXJlbW92ZURPTUFkYXB0ZXIoY2hpbGROb2RlLCBhdHRyQWRhcHRlcik7Ci0KLQkJCQlpZiAoZkRlYnVnKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0Q0hJTEQ6IEFkZGluZyBET00gYWRhcHRlcjogIiArIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlx0XHR0bzogIiArIGNoaWxkTm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcHJpbUFkZERPTUFkYXB0ZXIoY2hpbGROb2RlLCB0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlKSB7Ci0JCUlOb2RlTm90aWZpZXIgc3NlTm9kZSA9IChJTm9kZU5vdGlmaWVyKSBhTm9kZTsKLQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9IHNzZU5vZGUuZ2V0QWRhcHRlcnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJLy8gRmlyc3QgQ2hlY2sgaWYgaXQncyBhbiBFTUYyRE9NQWRhcHRlcgotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUoRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUykpIHsKLQkJCQkvLyBDYXN0IHRvIEVNRjJET01BZGFwdGVyCi0JCQkJRU1GMkRPTVNTRUFkYXB0ZXIgZTJEQWRhcHRlciA9IChFTUYyRE9NU1NFQWRhcHRlcikgYWRhcHRlcjsKLQkJCQlPYmplY3QgYWRhcHRlclRhcmdldCA9IGUyREFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCQkJCi0JCQkJLy9IYW5kbGUgdGhlIGNhc2VzIHdoZXJlIGVpdGhlciBhZGFwdGVyJ3MgdGFyZ2V0IGlzIG51bGwgCi0JCQkJaWYgKChnZXRUYXJnZXQoKSA9PSBudWxsKSB8fCAoYWRhcHRlclRhcmdldCA9PSBudWxsKSkKLQkJCQkJaWYgKHJlc291cmNlQ2xhc3MgIT0gbnVsbCAmJiByZXNvdXJjZUNsYXNzLmVxdWFscyhlMkRBZGFwdGVyLmdldFJlc291cmNlQ2xhc3MoKSkpCi0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJZWxzZQotCQkJCQkJY29udGludWU7Ci0JCQkJCi0JCQkJCi0JCQkJLy8gQ2hlY2sgaWYgdGFyZ2V0IGlzIGFuIEVNRiByZXNvdXJjZQotCQkJCWlmIChnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIE5vdyBjaGVjayBpZiBpdCdzIHRoZSByaWdodCBvbmUgKE11bHRpcGxlIHJlc291cmNlcwotCQkJCQkgKiBjb3VsZCBiZSBhdHRhY2hlZCkKLQkJCQkJICovCi0JCQkJCWlmIChhZGFwdGVyVGFyZ2V0ICE9IG51bGwgJiYgYWRhcHRlclRhcmdldCA9PSBnZXRUYXJnZXQoKSkgewotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIENoZWNrIGlmIHRhcmdldHMgYXJlIEVPYmplY3RzIHdpdGggdGhlIHNhbWUgcmVzb3VyY2VzCi0JCQkJCUVPYmplY3QgbXlUYXJnZXQgPSAoRU9iamVjdCkgZ2V0VGFyZ2V0KCk7Ci0JCQkJCS8qCi0JCQkJCSAqIE5vdyBjaGVjayBpZiBpdCdzIHRoZSByaWdodCBvbmUgKE11bHRpcGxlIHJlc291cmNlcyBjb3VsZAotCQkJCQkgKiBiZSBhdHRhY2hlZCkKLQkJCQkJICovCi0JCQkJCWlmIChhZGFwdGVyVGFyZ2V0ICE9IG51bGwgJiYgKChFT2JqZWN0KWFkYXB0ZXJUYXJnZXQpLmVSZXNvdXJjZSgpID09IG15VGFyZ2V0LmVSZXNvdXJjZSgpKSB7Ci0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoYWRhcHRlclRhcmdldCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJaWYgKCgoRU9iamVjdCkgZTJEQWRhcHRlci5nZXRUYXJnZXQoKSkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBwcmltR2V0SW5kZW50U3RyaW5nKE5vZGUgbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IGZsYXRNb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpbnQgbm9kZVN0YXJ0T2ZmID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlpbnQgc3RhcnRPZmYgPSBNYXRoLm1heCgwLCBub2RlU3RhcnRPZmYgLSAxMDApOwotCQlpbnQgZW5kT2ZmID0gbm9kZVN0YXJ0T2ZmOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGZsYXRNb2RlbC5nZXQoc3RhcnRPZmYsIGVuZE9mZiAtIHN0YXJ0T2ZmKTsKLQotCQkJaW50IGlueCA9IHRleHQubGVuZ3RoKCkgLSAxOwotCQkJaWYgKGlueCA+PSAwKSB7Ci0JCQkJZm9yICg7IGlueCA+PSAwOyBpbngtLSkgewotCQkJCQljaGFyIGNoID0gdGV4dC5jaGFyQXQoaW54KTsKLQkJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpICYmIGNoICE9ICdcbicgJiYgY2ggIT0gJ1xyJykgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJaW54Kys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZyhpbngpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRE9NQWRhcHRlcihOb2RlIGFOb2RlLCBFTUYyRE9NQWRhcHRlciBhbkFkYXB0ZXIpIHsKLQkJKChJRE9NTm9kZSkgYU5vZGUpLnJlbW92ZUFkYXB0ZXIoKElOb2RlQWRhcHRlcikgYW5BZGFwdGVyKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHJlb3JkZXJET01DaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGROb2RlLCBOb2RlIGluc2VydEJlZm9yZU5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCXN1cGVyLnJlb3JkZXJET01DaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIGluc2VydEJlZm9yZU5vZGUsIG1hcCk7Ci0JCS8vIFNpbmNlIHJlb3JkZXJpbmcgZGVsZXRlcyBhbGwgdGhlIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBub2RlLCB3ZQotCQkvLyBtdXN0IGluZGVudCAuCi0JCWlmIChpbnNlcnRCZWZvcmVOb2RlICE9IG51bGwgJiYgaW5zZXJ0QmVmb3JlTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJaW5kZW50U3RhcnRUYWcoY2FsY0luZGVudFN0cmluZyhpbnNlcnRCZWZvcmVOb2RlKSwgaW5zZXJ0QmVmb3JlTm9kZSwgbWFwKTsKLQkJZWxzZQotCQkJaW5kZW50U3RhcnRUYWcoY2FsY0luZGVudFN0cmluZyhjaGlsZE5vZGUpLCBjaGlsZE5vZGUsIG1hcCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW1wdHlUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCSgoSURPTUVsZW1lbnQpIGVsZW1lbnQpLnNldEVtcHR5VGFnKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZURPTSgpIHsKLQkJaWYgKCFpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWRpc2FibGVVbmRvTWFuYWdlbWVudElmTmVjZXNzYXJ5KCk7Ci0JCQlwcmltVXBkYXRlRE9NKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCQl9Ci0JfQotCi0JcHVibGljIENsYXNzIGdldFJlc291cmNlQ2xhc3MoKSB7Ci0JCXJldHVybiByZXNvdXJjZUNsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDaGlsZFRyYW5zbGF0b3JzKCkgewotCQlpZiAoZlJlbmRlcmVyICE9IG51bGwgJiYgZlJlbmRlcmVyLmdldFJlc291cmNlKCkgIT0gbnVsbCkKLQkJCXJlc291cmNlQ2xhc3MgPSBmUmVuZGVyZXIuZ2V0UmVzb3VyY2UoKS5nZXRDbGFzcygpOwotCQlzdXBlci5pbml0Q2hpbGRUcmFuc2xhdG9ycygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRVJlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyM2UxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbWYyeG1sOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLlJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEVNRjJET01TU0VSZW5kZXJlciBleHRlbmRzIEVNRjJET01SZW5kZXJlciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIsIElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBPYmplY3QgYWJvdXRUb0NoYW5nZU5vZGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCYXRjaENoYW5nZXMgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1NhdmluZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKLQkKLQlwcml2YXRlIENsYXNzIHJlc291cmNlQ2xhc3M7Ci0KLQkvKiogVGhlIFhNTCBET00gbW9kZWwgKi8KLQlwcm90ZWN0ZWQgSURPTU1vZGVsIHhtbE1vZGVsOwotCi0JLyoqIFVzZWQgaW50ZXJuYWxseTsgdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIHhtbCBtb2RlbCAqLwotCXByb3RlY3RlZCBTdHJpbmcgeG1sTW9kZWxJZDsKLQotCXByb3RlY3RlZCBib29sZWFuIHhtbE1vZGVsUmV2ZXJ0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBFTUYyRE9NU1NFUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKLQkJaWYgKCFyZXNvdXJjZS5pc05ldygpKSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRNb2RlbE1hbmFnZXJJZCgpOwotCQkJZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoaWQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yV3JpdGUoKSB7Ci0JCW1vZGVsQWNjZXNzRm9yV3JpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZWUgYmF0Y2hNb2RlbEVuZAotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgYmF0Y2hNb2RlRW5kKCkgewotCQlnZXRYTUxNb2RlbCgpLmNoYW5nZWRNb2RlbCgpOwotCQlzZXRSb290Tm9kZUFkYXB0ZXJOb3RpZmljYXRpb25FbmFibGVkKHRydWUpOwotCQlpc0JhdGNoQ2hhbmdlcyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGJhdGNoTW9kZVN0YXJ0IGFuZCBiYXRjaE1vZGVFbmQgaXMgYSBwYWlyIHRoYXQgY29udHJvbHMgbm90aWZpY2F0aW9ucywKLQkgKiBhbmQgdHJlYWQgYWNjZXNzLiBUaGV5IHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGluIGEgdHJ5L2ZpbmFsbHkgYmxvY2suCi0JICogCi0JICogc2V0QmF0Y2hNb2RlbCBiZWdpbnMgdGhlIHByb2Nlc3Npbmcgd2hlcmUgbm90aWZpY2F0aW9ucyBhcmUgbm90IHNlbnQKLQkgKiBvdXQgb24gZWFjaCBjaGFuZ2UsIGJ1dCBzYXZlZCB1cCB1bnRpbCB0aGUgZW5kQmF0Y2hNb2RlIGNhbGxlZC4KLQkgKiAKLQkgKiBUaGlzIHBhaXIgb2YgY2FsbHMgY2FuIGFsc28sIGluZGlyZWN0bHksICJsb2NrIiB0aGUgRE9NIE1vZGVsIHRvIGFjY2VzcwotCSAqIGZyb20gb25seSBvbmUgdGhyZWFkLCBzbyBpdCBzaG91bGQgbm90IGJlIGxvY2tlZCBmb3IgbG9uZyBwZXJpb2RzIG9mCi0JICogdGltZS4gVGhhdCdzIGFsc28gd2h5IGl0IGlzIGltcG9ydGFudCB0byBoYXZlIHRoZSBlbmRCYXRjaE1vZGUgaW4gYQotCSAqIGZpbmFsbHkgYmxvY2sgdG8gYmUgc3VyZSBpdCBpcyBhbHdheXMgY2FsbGVkLCBvciB0aGUgRE9NIHdpbGwgYmUgbGVmdAotCSAqIGluIGEgbG9ja2VkLCB1bnVzYWJsZSwgc3RhdGUgYW5kIG9ubHkgc2hvcnRseSBhd2F5IGZyb20gc2V2ZXJlcmUKLQkgKiBwcm9ncmFtIGVycm9yLgotCSAqIAotCSAqIDxwcmU+PGNvZGU+Ci0JICogRXhhbXBsZQotCSAqIDwvY29kZT4KLQkgKiAgCi0JICogIHRyeSB7IAotCSAqICAJCWJhdGNoTW9kZWxTdGFydCgpOwotCSAqICAJCS4uLmRvIGEgc29tZSB3b3JrIC4uLgotCSAqICAJCX0KLQkgKiAgCWZpbmFsbHkgewotCSAqICAJCWVuZEJhdGNoTW9kZSgpOwotCSAqICAJCX0KLQkgKiAgCi0JICogIAotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyB2b2lkIGJhdGNoTW9kZVN0YXJ0KCkgewotCQlpc0JhdGNoQ2hhbmdlcyA9IHRydWU7Ci0JCWdldFhNTE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCXNldFJvb3ROb2RlQWRhcHRlck5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCkgewotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCXhtbE1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgRG9jdW1lbnQgZ2l2ZW4KLQkgKiAKLQkgKiBAYVJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50KCkgewotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2UoKTsKLQkJcmVzLnNldERlZmF1bHRzKCk7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBET01VdGlsaXRpZXMuY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0ocmVzLmdldERvY3R5cGUoKSwgcmVzLmdldFB1YmxpY0lkKCksIHJlcy5nZXRTeXN0ZW1JZCgpKTsKLQkJaWYgKGlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCUxpc3QgZm9sZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCQkJd2hpbGUgKG51bGwgIT0gY29udGFpbmVyICYmICFjb250YWluZXIuZXhpc3RzKCkgJiYgY29udGFpbmVyIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQlmb2xkZXJzLmFkZChjb250YWluZXIpOwotCQkJCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCUlGb2xkZXIgZm9sZGVyID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvbGRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJZm9sZGVyID0gKElGb2xkZXIpIGZvbGRlcnMuZ2V0KGkpOwotCQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCX0KLQkJCQlmaWxlLmNyZWF0ZShpcywgdHJ1ZSwgbnVsbCk7Ci0JCQkJZmlsZS5zZXRMb2NhbCh0cnVlLCAxLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobnVsbCAhPSBpcykgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWluaXRpYWxpemVYTUxNb2RlbChmaWxlLCByZXNvdXJjZS5nZXRXcml0ZUNvdW50KCkgIT0gMCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIklXQUUwMDE3RSBVbmV4cGVjdGVkIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBjcmVhdGluZyB4bWwgZG9jdW1lbnQiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChuZWVkc1RvQ3JlYXRlRE9NKQotCQkJY3JlYXRlRE9NVHJlZSgpOwotCX0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVSb290RE9NQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NU1NFQWRhcHRlcihnZXRSZXNvdXJjZSgpLCBkb2N1bWVudCwgdGhpcywgZ2V0UmVzb3VyY2UoKS5nZXRSb290VHJhbnNsYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZVJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCkgewotCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCXhtbE1vZGVsLnJlbW92ZU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVSZWdpc3RlckFzTW9kZWxTdGF0ZUxpc3RlbmVyKCkgewotCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCXhtbE1vZGVsLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVyZWdpc3RlckZyb21YTUxNb2RlbCgpIHsKLQkJCi0JCWRlUmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlkZVJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCk7Ci0JCS8vIFRoaXMgdHJ5L2NhdGNoIGJsb2NrIGlzIGEgaGFjayB0byBmaXggZGVmZWN0IDIwNDExNC4gVGhpcyBvY2N1cnMKLQkJLy8gYmVjYXVzZQotCQkvLyB0aGUgbW9kZWwgbWFuYWdlciBwbHVnaW4gaXMgc2h1dCBkb3duIGFuZCB1bmxvYWRlZCBiZWZvcmUgdGhlIGoyZWUKLQkJLy8gcGx1Z2luLgotCQkvLyBDYWxsaW5nIGdldE1vZGVsTWFuYWdlcigpIGNhbiByZXN1bHQgaW4gYSBjbGFzcyBjYXN0IGV4Y2VwdGlvbiB0aGF0Ci0JCS8vIHNob3VsZAotCQkvLyBiZSBpZ25vcmVkLgotCQkvLyBNb2RlbE1hbmFnZXIgbWdyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWdldE1vZGVsTWFuYWdlcigpOwotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCWludCB3cml0ZUNvdW50ID0gcmVzb3VyY2UuZ2V0V3JpdGVDb3VudCgpOwotCQkJaW50IHJlYWRDb3VudCA9IHJlc291cmNlLmdldFJlYWRDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3cml0ZUNvdW50OyBpKyspCi0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcmVhZENvdW50OyBpaSsrKQotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHJlc291cmNlLmVBZGFwdGVycygpLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlci5yZW1vdmVBZGFwdGVycyhhZGFwdGVyLmdldE5vZGUoKSk7Ci0JCX0KLQkJeG1sTW9kZWwgPSBudWxsOwotCQl4bWxNb2RlbElkID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCWlzU2F2aW5nID0gdHJ1ZTsKLQkJCWlmIChudWxsICE9IG91dHB1dFN0cmVhbSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNob3VsZCBub3QgdXNlIGFuIE91dHB1dFN0cmVhbSBmb3Igc2F2aW5nIik7fSAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKTsKLQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSAoKFByb2plY3RSZXNvdXJjZVNldCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJdHJ5IHsKLQkJCQlzeW5jaHJvbml6ZXIucHJlU2F2ZShhRmlsZSwgcmVzb3VyY2UpOwotCQkJCXhtbE1vZGVsLnNhdmUoYUZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlzeW5jaHJvbml6ZXIucmVtb3ZlRnJvbVJlY2VudGx5U2F2ZWRMaXN0KGFGaWxlKTsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlzU2F2aW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdET01BZGFwdGVyKE5vZGUgbm9kZSkgewotCQkvL0lET01Ob2RlIHhOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkvL3JldHVybiAoRU1GMkRPTVNTRUFkYXB0ZXIpIHhOb2RlLmdldEFkYXB0ZXJGb3IoRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0KLQkJSU5vZGVOb3RpZmllciBzc2VOb2RlID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0JCUNvbGxlY3Rpb24gYWRhcHRlcnMgPSBzc2VOb2RlLmdldEFkYXB0ZXJzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIEZpcnN0IENoZWNrIGlmIGl0J3MgYW4gRU1GMkRPTUFkYXB0ZXIKLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpKSB7Ci0JCQkJLy8gQ2FzdCB0byBFTUYyRE9NU1NFQWRhcHRlcgotCQkJCUVNRjJET01TU0VBZGFwdGVyIGUyREFkYXB0ZXIgPSAoRU1GMkRPTVNTRUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQkJLy9IYW5kbGUgdGhlIGNhc2VzIHdoZXJlIGVpdGhlciBhZGFwdGVyJ3MgdGFyZ2V0IGlzIG51bGwgCi0JCQkJLy9Vc2UgdGhlIHJlc291cmNlQ2xhc3MgdG8gbWFrZSBzdXJlIHRoZSByZXNvdXJjZSB0eXBlIGlzIGlkZW50aWNhbAotCQkJCWlmIChnZXRSZXNvdXJjZSgpID09IG51bGwgfHwgZTJEQWRhcHRlci5nZXRUYXJnZXQoKSA9PSBudWxsKQotCQkJCQlpZihyZXNvdXJjZUNsYXNzLmVxdWFscyhlMkRBZGFwdGVyLmdldFJlc291cmNlQ2xhc3MoKSkpCi0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJZWxzZQotCQkJCQkJY29udGludWU7Ci0JCQkJCi0JCQkJLy8gRmlyc3QgY2hlY2sgaWYgdGFyZ2V0cyBhcmUgcmVzb3VyY2VzCi0JCQkJaWYgKGUyREFkYXB0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCQkvKgotCQkJCQkgKiBOb3cgY2hlY2sgaWYgaXQncyB0aGUgcmlnaHQgb25lIChNdWx0aXBsZSByZXNvdXJjZXMKLQkJCQkJICogY291bGQgYmUgYXR0YWNoZWQpCi0JCQkJCSAqLwotCQkJCQlpZiAoZTJEQWRhcHRlci5nZXRUYXJnZXQoKSA9PSBnZXRSZXNvdXJjZSgpKSB7Ci0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIENoZWNrIGlmIHRhcmdldHMgYXJlIEVPYmplY3RzIHdpdGggdGhlIHNhbWUgcmVzb3VyY2VzCi0JCQkJCVRyYW5zbGF0b3JSZXNvdXJjZSBteVRhcmdldCA9IGdldFJlc291cmNlKCk7Ci0JCQkJCUVPYmplY3QgYWRhcHRlclRhcmdldCA9IChFT2JqZWN0KSBlMkRBZGFwdGVyLmdldFRhcmdldCgpOwotCQkJCQkvKgotCQkJCQkgKiBOb3cgY2hlY2sgaWYgaXQncyB0aGUgcmlnaHQgb25lIChNdWx0aXBsZSByZXNvdXJjZXMgY291bGQKLQkJCQkJICogYmUgYXR0YWNoZWQpCi0JCQkJCSAqLwotCQkJCQlpZiAoYWRhcHRlclRhcmdldC5lUmVzb3VyY2UoKSA9PSBteVRhcmdldCB8fCBhZGFwdGVyVGFyZ2V0LmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBlMkRBZGFwdGVyOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCQotCX0KLQotCXByb3RlY3RlZCBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJaWYgKG1vZGVsTWFuYWdlciA9PSBudWxsKQotCQkJbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaWQgdXNlZCB0byBrZXkgdGhlIFhNTCByZXNvdXJjZSBpbiB0aGUgWE1MIE1vZGVsTWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsTWFuYWdlcklkKCkgewotCQlpZiAoeG1sTW9kZWxJZCA9PSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShnZXRSZXNvdXJjZSgpKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbElkID0gZ2V0TW9kZWxNYW5hZ2VyKCkuY2FsY3VsYXRlSWQoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl4bWxNb2RlbElkID0gcmVzb3VyY2UuZ2V0VVJJKCkgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geG1sTW9kZWxJZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBET00gbW9kZWwgZm9yIHRoaXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIElET01Nb2RlbCBnZXRYTUxNb2RlbCgpIHsKLQkJcmV0dXJuIHhtbE1vZGVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MTW9kZWxJZCgpIHsKLQkJcmV0dXJuIHhtbE1vZGVsSWQ7Ci0JfQkKLQkKLQlwcml2YXRlIElET01Nb2RlbCBpbml0aWFsaXplWE1MTW9kZWwoSUZpbGUgZmlsZSwgYm9vbGVhbiBmb3JXcml0ZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKGZpbGUgPT0gbnVsbCkgPyAibnVsbCIgOiBmaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQlTdHJpbmcgaWQgPSBtYW5hZ2VyLmNhbGN1bGF0ZUlkKGZpbGUpOwkJCQotCQkJaWYgKGZvcldyaXRlKSB7Ci0JCQkJSURPTU1vZGVsIG1vZCA9IChJRE9NTW9kZWwpbWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JCQkJaWYgKG1vZCA9PSBudWxsKQotCQkJCQlzZXRYTUxNb2RlbCgoSURPTU1vZGVsKSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldFhNTE1vZGVsKG1vZCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSURPTU1vZGVsIG1vZCA9IChJRE9NTW9kZWwpbWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZCk7Ci0JCQkJaWYgKG1vZCA9PSBudWxsKQotCQkJCQlzZXRYTUxNb2RlbCgoSURPTU1vZGVsKSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldFhNTE1vZGVsKG1vZCk7Ci0JCQkJfQotCQkJfQotCQkJc2V0WE1MTW9kZWxJZChnZXRYTUxNb2RlbCgpLmdldElkKCkpOwotCQkJbmVlZHNUb0NyZWF0ZURPTSA9IGZhbHNlOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgaWQgPSBnZXRYTUxNb2RlbCgpLmdldElkKCk7Ci0JCXN5bmNSZWZlcmVuY2VDb3VudHMoaWQsIGZvcldyaXRlKTsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQlkb2N1bWVudCA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXJldHVybiB4bWxNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JhdGNoTW9kZSgpIHsKLQkJcmV0dXJuIGlzQmF0Y2hDaGFuZ2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiAoZ2V0WE1MTW9kZWwoKSAhPSBudWxsICYmIGdldFhNTE1vZGVsKCkuaXNEaXJ0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJCi0JCWlmKCB4bWxNb2RlbCA9PSBudWxsKSB7IC8vcmVzb3VyY2UgY291bGQgYmUgaW4gcHJvY2VzcyBvZiBiZWluZyB1bmxvYWRlZCAtIGNoZWNrIHdpdGggbW9kZWwgbWFuYWdlcgotCQkJU3RyaW5nIGlkID0gZ2V0TW9kZWxNYW5hZ2VySWQoKTsKLQkJCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5pc1NoYXJlZChpZCk7Ci0JCX0KLQkJaWYgKGdldFJlc291cmNlU2V0KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHhtbE1vZGVsLmlzU2hhcmVkKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JXcml0ZSgpIHsKLQkJaWYgKGdldFJlc291cmNlU2V0KCkgPT0gbnVsbCB8fCB4bWxNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4geG1sTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERvY3VtZW50KElucHV0U3RyZWFtIGluLCBNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKG51bGwgIT0gaW4pIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNob3VsZCBub3QgdXNlIGFuIElucHV0U3RyZWFtIGZvciBsb2FkaW5nIik7fSAvLyROT04tTkxTLTEkCi0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJaW5pdGlhbGl6ZVhNTE1vZGVsKGZpbGUsIChyZXNvdXJjZS5nZXRXcml0ZUNvdW50KCkgIT0gMCkpOwotCQljYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFuYWdlc0RPTUFkYXB0ZXJzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpICE9IG51bGwpCi0JCQlhYm91dFRvQ2hhbmdlTm9kZSA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXByaXZhdGUgdm9pZCBtb2RlbEFjY2Vzc0ZvcldyaXRlKCkgewotCQlTdHJpbmcgaWQgPSBnZXRNb2RlbE1hbmFnZXJJZCgpOwotCQlnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKGlzQmF0Y2hDaGFuZ2VzKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJaWYgKGFib3V0VG9DaGFuZ2VOb2RlICE9IG51bGwgJiYgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgIT0gbnVsbAotCQkJCQkmJiBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IGFib3V0VG9DaGFuZ2VOb2RlKSB7Ci0JCQkJU3RyaW5nIGlkID0gZ2V0TW9kZWxNYW5hZ2VySWQoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHRlbXBNb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJdGVtcE1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoaWQpOwotCQkJCQl4bWxNb2RlbFJldmVydGVkID0gdHJ1ZTsKLQkJCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKHRlbXBNb2RlbCAhPSBudWxsICYmICh0ZW1wTW9kZWwuZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KCkgPiAwKSkgewotCQkJCQkJdGVtcE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJYWJvdXRUb0NoYW5nZU5vZGUgPSBudWxsOwotCQl9Ci0JfSAKLQkKLQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQlpZiAoIWlzRGlydHkgJiYgcmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7IC8vIFRoZSBYTUxNb2RlbCB3YXMgc2F2ZWQKLQkJCXJlc291cmNlLnNldE1vZGlmaWVkKGZhbHNlKTsKLQkJCWxvbmcgc3RhbXAgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5jb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAocmVzb3VyY2UpOwotCQkJV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuc2V0U3luaHJvbml6YXRpb25TdGFtcChyZXNvdXJjZSwgc3RhbXApOwotCQkJSVByb2plY3QgcHJvaiA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldFByb2plY3QocmVzb3VyY2UpOwotCQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpICgoUHJvamVjdFJlc291cmNlU2V0KSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQocHJvaikpLmdldFN5bmNocm9uaXplcigpOwotCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJCXN5bmNocm9uaXplci5wcmVTYXZlKGFGaWxlLCByZXNvdXJjZSk7Ci0JCX0KLQkJaWYgKGlzRGlydHkpCi0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBqdXN0IHByaW9yIHRvIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgUmVzb3VyY2VTZXQuCi0JICogRW5zdXJlIHRoYXQgYWxsIHJlZmVyZW5jZSBjb3VudHMgdG8gdGhlIFhNTE1vZGVsIGFyZSByZW1vdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHByZURlbGV0ZSgpIHsKLQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpCi0JCQlkZXJlZ2lzdGVyRnJvbVhNTE1vZGVsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJlVW5sb2FkKCkgewotCQlkZXJlZ2lzdGVyRnJvbVhNTE1vZGVsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc1ByZU1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCQlpZiAoIWlzU2F2aW5nKSB7Ci0JCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQpIHsKLQkJCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpLmdldFN5bmNocm9uaXplcigpOwotCQkJCUlGaWxlIGFGaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCQkJc3luY2hyb25pemVyLnByZVNhdmUoYUZpbGUsIHJlc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJBc01vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCXRoaXMueG1sTW9kZWwuYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAxMDo0OTo1MwotCSAqIEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCXRoaXMueG1sTW9kZWwuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVdyaXRlKCkgewotCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7Ci0JCSgoSURPTU5vZGUpIGFOb2RlKS5yZW1vdmVBZGFwdGVyKChFTUYyRE9NU1NFQWRhcHRlcikgYW5BZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi54bWwuRU1GMkRPTVJlbmRlcmVyI3JlcGxhY2VEb2N1bWVudFR5cGUoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZURvY3VtZW50VHlwZShTdHJpbmcgZG9jVHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlEb2N1bWVudFR5cGVJbXBsIGRvY1R5cGUgPSAoRG9jdW1lbnRUeXBlSW1wbCkgZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCQlpZiAoZG9jVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAocHVibGljSWQgPT0gbnVsbCAmJiBzeXN0ZW1JZCA9PSBudWxsKQotCQkJZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jVHlwZSk7Ci0JCWVsc2UgewotCQkJZG9jVHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCQlkb2NUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBiYXRjaE1vZGVTdGFydCBhbmQgQmF0Y2hNb2RlRW5kIGluc3RlYWQgZXZlbiBpZiB5b3UgZG8KLQkgKiAgICAgICAgICAgICBub3QgdXNlIGJhdGNoTW9kZWxTdGFydC9FbmQsIHlvdSBzdGlsbCBuZWVkIHRvIHVzZSB0aGUKLQkgKiAgICAgICAgICAgICB0cnkvZmluYWxseSBwYXR0ZXJuIGRvY3VtZW50ZWQgdGhlcmUuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaE1vZGUoYm9vbGVhbiBpc0JhdGNoKSB7Ci0KLQkJLy8gVGhpcyBpcyBzb21lIGV4dHJhIHByb2Nlc3NpbmcgZm9yIGNsaWVudHMgdG8ga25vdyB0aGV5IG1heSBiZSB1c2luZwotCQkvLyBpbmNvcnJlY3RseQotCQlpZiAoaXNCYXRjaCkgewotCQkJaWYgKGlzQmF0Y2hDaGFuZ2VzKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgInNldEJhdGNoIHdhcyBzZXQgdG8gdHJ1ZSB3aGVuIGl0IHdhcyBhbHJlYWR5IHRydWUuIFRoaXMgY2FuIGJlIGFuIGluZGljYXRpb24gb2YgaW52YWxpZCBjYWxsaW5nIG9yZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0KLQkJaWYgKGlzQmF0Y2gpIHsKLQkJCWJhdGNoTW9kZVN0YXJ0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQliYXRjaE1vZGVFbmQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRSb290Tm9kZUFkYXB0ZXJOb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gYikgewotCQlFT2JqZWN0IHJvb3QgPSByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCWlmIChyb290ICE9IG51bGwpIHsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIocm9vdCwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGIpOwotCQkJCWlmIChiKQotCQkJCQlhZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBET00gbW9kZWwgZm9yIHRoaXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0WE1MTW9kZWwoSURPTU1vZGVsIHhtbE1vZGVsKSB7Ci0JCWRlUmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlkZVJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCk7Ci0JCXRoaXMueG1sTW9kZWwgPSB4bWxNb2RlbDsKLQkJcmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlyZWdpc3RlckFzTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFhNTE1vZGVsSWQoU3RyaW5nIGlkKSB7Ci0JCXhtbE1vZGVsSWQgPSBpZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlZmVyZW5jZUNvdW50cyhTdHJpbmcgaWQsIGJvb2xlYW4gZm9yV3JpdGUpIHsKLQkJaW50IGVkaXRJbmRleCA9IDAsIHJlYWRJbmRleCA9IDA7Ci0JCWlmIChmb3JXcml0ZSkKLQkJCWVkaXRJbmRleCsrOwotCQllbHNlCi0JCQlyZWFkSW5kZXgrKzsKLQkJaW50IHdyaXRlQ291bnQgPSByZXNvdXJjZS5nZXRXcml0ZUNvdW50KCk7Ci0JCWludCByZWFkQ291bnQgPSByZXNvdXJjZS5nZXRSZWFkQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IHdyaXRlQ291bnQ7IGkgPiBlZGl0SW5kZXg7IGktLSkKLQkJCW1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JCWZvciAoaW50IGkgPSByZWFkQ291bnQ7IGkgPiByZWFkSW5kZXg7IGktLSkKLQkJCW1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlU3RyZWFtc0ZvcklPKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKSB7Ci0JCXJldHVybiB4bWxNb2RlbFJldmVydGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzdXBlci5zZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCQkJcmVzb3VyY2VDbGFzcyA9IHJlc291cmNlLmdldENsYXNzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzkxMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5IGV4dGVuZHMgUmVuZGVyZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSgpIHsKLQkJLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCi0JcHVibGljIFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VSZW5kZXJlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9Db21wb25lbnRTZWFyY2hDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL0NvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMWRjZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL0NvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRTZWFyY2hDb250cmlidXRvciAgewotCi0JcHJvdGVjdGVkIEhhc2hNYXAgZGVjbGFyYXRpb25zOwotCi0JcHJvdGVjdGVkIEhhc2hNYXAgcmVmZXJlbmNlczsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBuYW1lc3BhY2VzOwotCi0JcHVibGljIENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuIGdldERlY2xhcmF0aW9uUGF0dGVybihRdWFsaWZpZWROYW1lIGNvbXBvbmVudE5hbWUpIHsKLQkJcmV0dXJuIChYTUxTZWFyY2hQYXR0ZXJuKSBnZXREZWNsYXJhdGlvbnMoKS5nZXQoY29tcG9uZW50TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXREZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChkZWNsYXJhdGlvbnMgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZURlY2xhcmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBkZWNsYXJhdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBnZXRSZWZlcmVuY2VzKCkgewotCQlpZiAocmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplUmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuW10gZ2V0UmVmZXJlbmNlc1BhdHRlcm5zKFF1YWxpZmllZE5hbWUgY29tcG9uZW50TmFtZSkgewotCQlMaXN0IHJlZmVyZW5jZXMgPSAoTGlzdCkgZ2V0UmVmZXJlbmNlcygpLmdldChjb21wb25lbnROYW1lKTsKLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIChYTUxTZWFyY2hQYXR0ZXJuW10pIHJlZmVyZW5jZXMKLQkJCQkJLnRvQXJyYXkobmV3IFhNTFNlYXJjaFBhdHRlcm5bcmVmZXJlbmNlcy5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gbmV3IFhNTFNlYXJjaFBhdHRlcm5bMF07Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFF1YWxpZmllZE5hbWUgY29tcG9uZW50TmFtZSl7Ci0JCXJldHVybiBnZXRSZWZlcmVuY2VzUGF0dGVybnMoY29tcG9uZW50TmFtZSkubGVuZ3RoID4gMCB8fAotCQkJZ2V0RGVjbGFyYXRpb25QYXR0ZXJuKGNvbXBvbmVudE5hbWUpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZE5hbWVzcGFjZXMoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VzOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVEZWNsYXJhdGlvbnMoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVSZWZlcmVuY2VzKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplU3VwcG9ydGVkTmFtZXNwYWNlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1RhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9UYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjFiN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1RhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci0KLXB1YmxpYyBjbGFzcyBUYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuIGV4dGVuZHMgU2VhcmNoUGF0dGVybiB7Ci0JCi0JU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQkKLQlwdWJsaWMgVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybihpbnQgbWF0Y2hSdWxlLCBTdHJpbmcgbmFtZXNwYWNldXJpKSB7Ci0JCXN1cGVyKG1hdGNoUnVsZSk7Ci0JCW5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZXVyaTsKLQl9Ci0JCi0JcHVibGljIFRhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4oU3RyaW5nIG5hbWVzcGFjZXVyaSkgewotCQlzdXBlcigpOwotCQluYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2V1cmk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjQ3NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotcHVibGljIGNsYXNzIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybiBleHRlbmRzIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4gewotCi0JcHVibGljIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUsIGludCBtYXRjaFJ1bGUpIHsKLQkJc3VwZXIobnVsbCwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUsIG1hdGNoUnVsZSk7Ci0JCQotCX0KLQotCXB1YmxpYyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKSB7Ci0JCXN1cGVyKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLQl9Ci0JCi0JcHVibGljIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIobnVsbCwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCX0KLQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OGE4YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuIGV4dGVuZHMgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybnsKLQotCXB1YmxpYyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSwgaW50IG1hdGNoUnVsZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQkJCi0JfQotCi0JcHVibGljIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4oSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKSB7Ci0JCXN1cGVyKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLQkJCi0JfQotCQotCXB1YmxpYyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkgewotCQlzdXBlcihudWxsLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JCQotCX0KLQkKLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmYzMDQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5Db21wb25lbnRTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi0vKioKLSAqIFhNTCBjb21wb25lbnQgc2VhcmNoIHBhdHRlcm4gaXMgYSBjb21wb3NpdGUgcGF0dGVybiB0aGF0IGNvbWJpbmVzIFhNTCBlbGVtZW50IHBhdHRlcm4uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiBleHRlbmRzIENvbXBvbmVudFNlYXJjaFBhdHRlcm4gewotCQotCS8qKgotCSAqIENvbnRhaW5pbmcgZWxlbWVudCBwYXR0ZXJucwotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkcmVuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm5bMF07Ci0JCi0JLyoqCi0JICogQSBtYXAgb2YgWE1MU2VhcmNoUGF0dGVybltdIGJ5IHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2ggcGFydGljaXBhbnR9LgotCSAqLwotCXByb3RlY3RlZCBNYXAgY2hpbGRQYXR0ZXJuc0J5UGFydGljaXBhbnQgPSBuZXcgSGFzaE1hcCgpOwotCQotCXB1YmxpYyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSwgaW50IG1hdGNoUnVsZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQkJCi0JfQotCi0KLQlwdWJsaWMgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIoZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDaGlsZHJlbihTZWFyY2hQYXJ0aWNpcGFudCl9IGluc3RlYWQuCi0JICovCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm5bXSBnZXRDaGlsZHJlbigpewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2FkZENoaWxkcmVuKFNlYXJjaFBhcnRpY2lwYW50LCBYTUxTZWFyY2hQYXR0ZXJuW10pfSBpbnN0ZWFkLgotICAgICAqLwotCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKFhNTFNlYXJjaFBhdHRlcm5bXSBwYXR0ZXJucyl7Ci0JCWNoaWxkcmVuID0gcGF0dGVybnM7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgY2hpbGQgcGF0dGVybnMgY29udHJpYnV0ZWQgYnkgdGhlIGdpdmVuIHNlYXJjaCBwYXJ0aWNpcGFudC4gCi0JICogQHBhcmFtIHNlYXJjaFBhcnRpY2lwYW50IHRoZSB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoIHBhcnRpY2lwYW50fSB0aGF0IGNvbnRyaWJ1dGVkIHRoZSBwYXR0ZXJucy4KLSAgICAgKiBAc2VlIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4jYWRkQ2hpbGRyZW4oU2VhcmNoUGFydGljaXBhbnQsIFhNTFNlYXJjaFBhdHRlcm5bXSkgYWRkQ2hpbGRyZW4KLQkgKiBAcmV0dXJuIGFuIGFycmF5IHdpdGggdGhlIHtAbGluayBYTUxTZWFyY2hQYXR0ZXJuIHBhdHRlcm5zfSBjb250cmlidXRlZCBieSB0aGUge0BsaW5rIFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaCBwYXJ0aWNpcGFudH0uCi0JICovCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm5bXSBnZXRDaGlsZHJlbihTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2hQYXJ0aWNpcGFudCl7Ci0JICBYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRQYXR0ZXJucyA9IGdldENoaWxkcmVuKCk7Ci0JICBpZiAoc2VhcmNoUGFydGljaXBhbnQgIT0gbnVsbCl7Ci0JICAgIGNoaWxkUGF0dGVybnMgPSAoWE1MU2VhcmNoUGF0dGVybltdKWNoaWxkUGF0dGVybnNCeVBhcnRpY2lwYW50LmdldChzZWFyY2hQYXJ0aWNpcGFudCk7Ci0JICAgIGlmIChjaGlsZFBhdHRlcm5zID09IG51bGwpewotCSAgICAgIGNoaWxkUGF0dGVybnMgPSBnZXRDaGlsZHJlbigpOwotCSAgICB9Ci0JICB9Ci0JICByZXR1cm4gY2hpbGRQYXR0ZXJuczsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY2hpbGQgcGF0dGVybnMgY29udHJpYnV0ZWQgYnkgdGhlIGdpdmVuIHNlYXJjaCBwYXJ0aWNpcGFudC4KLQkgKiBAcGFyYW0gc2VhcmNoUGFydGljaXBhbnQgdGhlIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2ggcGFydGljaXBhbnR9IHRoYXQgaXMgY29udHJpYnV0aW5nIHRoZSBjaGlsZCBzZWFyY2ggcGF0dGVybnMuCi0JICogQHBhcmFtIGNoaWxkUGF0dGVybnMgdGhlIGNoaWxkIHBhdHRlcm5zIGNvbnRyaWJ1dGVkIGJ5IHRoZSB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoUGFydGljaXBhbnQgc2VhcmNoIHBhcnRpY2lwYW50fS4KLQkgKiBAc2VlIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4jZ2V0Q2hpbGRyZW4oU2VhcmNoUGFydGljaXBhbnQpIGdldENoaWxkcmVuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRyZW4oU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoUGFydGljaXBhbnQsIFhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zKXsKLQkgIGlmIChzZWFyY2hQYXJ0aWNpcGFudCAhPSBudWxsICYmIGNoaWxkUGF0dGVybnMgIT0gbnVsbCkgewotCSAgICBjaGlsZFBhdHRlcm5zQnlQYXJ0aWNpcGFudC5wdXQoc2VhcmNoUGFydGljaXBhbnQsIGNoaWxkUGF0dGVybnMpOwotCSAgfQotCSAgZWxzZSB7Ci0JICAgIGNoaWxkcmVuID0gY2hpbGRQYXR0ZXJuczsKLQkgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA5ZjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkNvbXBvbmVudERlY2xhcmF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkZpbGVSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLkNvbXBvbmVudFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLkZpbGVSZWZlcmVuY2VQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuQ29udGVudFR5cGVTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuSVhNTFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuWE1MU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuLlhNTFF1aWNrU2NhbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFNlYXJjaFBhcnRpY2lwYW50IGV4dGVuZHMgU2VhcmNoUGFydGljaXBhbnQgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1BlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC9wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBYTUxTZWFyY2hQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkKLQkvKgotIHB1YmxpYyAgYm9vbGVhbiBpbml0aWFsaXplKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nW10gY29udGVudFR5cGVzKXsKLQkJCi0JICAgIHN1cGVyLmluaXRpYWxpemUocGF0dGVybiwgY29udGVudFR5cGVzKTsKLQkJdGhpcy5zdXBwb3J0ZWRDb250ZW50VHlwZXMgPSBjb250ZW50VHlwZXM7Ci0JCQotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybil7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfSovCi0KLQkKLQotCXB1YmxpYyBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKSB7Ci0KLQkJcmV0dXJuIG5ldyBYTUxTZWFyY2hEb2N1bWVudChkb2N1bWVudFBhdGgsIHRoaXMpOwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJYTUwgc2VhcmNoIHBhcnRpY2lwYW50IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaERvY3VtZW50IGRvY3VtZW50LAotCQkJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0gICAgICAgIC8vIFRPRE8uLi4gdXRpbGl6ZSBzZWFyY2ggb3B0aW9ucyAodGhhdCBzaG91bGQgZ2V0IHBhc3NlZCBkb3duIHZpYSB0aGUgU2VhcmNoRW5naW5lKQotICAgICAgICAvLyB0byBzcGVjaWZ5IGlmIGFjY3VyYXRlIHNvdXJjZSBjb29yZGluYXRlcyBhcmUgcmVxJ2QgaWYgbm90LCBzaW1wbHkgdXNlIHRoZSBTQVggcmVzdWx0cwotICAgICAgICAvLwotICAgICAgICBpZiAocGF0dGVybi5nZXRNYXRjaFJ1bGUoKSA9PSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZG9jdW1lbnQuZ2V0UGF0aCgpKSk7Ci0gICAgICAgICAgLy8gVE9ETy4uIGRvbid0IGFzc3VtZSB0aGUgY2F0ZWdvcnkgaXMgQ09NUE9ORU5UX0RFQ0wuLi4gaGFuZGxlIGFueSBhcmJpdGFydHkgY2F0ZWdvcnkKLSAgICAgICAgICBFbnRyeVtdIGVudHJpZXMgPSBkb2N1bWVudC5nZXRFbnRyaWVzKElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX0RFQ0wsIG51bGwsIDApOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPLi4gZG9uJ3QgYXNzdW1lIHRoaXMgaXMganVzdCBhIGNvbXBvbmVudCBkZWNsYXJhdGlvbiBlbnRyeSAgICAgICAgICAgIAotICAgICAgICAgICAgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSBlbnRyeSA9IChDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5KWVudHJpZXNbaV07Ci0gICAgICAgICAgICBTZWFyY2hNYXRjaCBzZWFyY2hNYXRjaCA9IG5ldyBTZWFyY2hNYXRjaChudWxsLCAwLCAwLCBmaWxlKTsKLSAgICAgICAgICAgIHNlYXJjaE1hdGNoLm1hcC5wdXQoIm5hbWUiLCBlbnRyeS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZWFyY2hNYXRjaC5tYXAucHV0KCJtZXRhTmFtZSIsIGVudHJ5LmdldE1ldGFOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVxdWVzdG9yLmFjY2VwdFNlYXJjaE1hdGNoKHNlYXJjaE1hdGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsgIGlmIChkb2N1bWVudC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQkJSURPTUVsZW1lbnQgY29udGV4dE5vZGUgPSAoSURPTUVsZW1lbnQpIGRvbU1vZGVsLmdldERvY3VtZW50KCkKLQkJCQkJLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJRE9NVmlzaXRvciB2aXNpdG9yID0gbmV3IERPTVZpc2l0b3IoZG9jdW1lbnQuZ2V0UGF0aCgpLCBwYXR0ZXJuLAotCQkJCQlyZXF1ZXN0b3IpOwotCQkJdmlzaXRvci52aXNpdChjb250ZXh0Tm9kZSk7Ci0JCX0KLSAgICAgICAgfQotCX0KLQkKLQlwcml2YXRlIFBhdHRlcm5NYXRjaGVyIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKFBhdHRlcm5NYXRjaGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyVHlwZSkgJiYKLQkJCQkoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgWE1MU2VhcmNoUGF0dGVybiB8fAotCQkJCWFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pICkgewotCQkJcmV0dXJuIG5ldyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlcih0aGlzKTsKLQkJfSAKLQkJcmV0dXJuIG51bGw7IAotCX0KLQotCXByaXZhdGUgY2xhc3MgRE9NVmlzaXRvciB7Ci0KLQkJU3RyaW5nIHBhdGg7Ci0JCVNlYXJjaFBhdHRlcm4gcGF0dGVybjsKLQkJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcjsKLQkJUGF0dGVybk1hdGNoZXIgbWF0Y2hlcjsKLQotCQkKLQkJcHJvdGVjdGVkIERPTVZpc2l0b3IoU3RyaW5nIHBhdGgsIFNlYXJjaFBhdHRlcm4gcGF0dGVybiwKLQkJCQlTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0JCQkKLQkJCW1hdGNoZXIgPSAoUGF0dGVybk1hdGNoZXIpcGF0dGVybi5nZXRBZGFwdGVyKFBhdHRlcm5NYXRjaGVyLmNsYXNzKTsKLQkJCWlmKG1hdGNoZXIgPT0gbnVsbCl7Ci0JCQkJbWF0Y2hlciA9IGdldEFkYXB0ZXIocGF0dGVybiwgUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQkJfQotCQkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdmlzaXQoTm9kZSBub2RlKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJbWF0Y2goKEVsZW1lbnQpbm9kZSk7Ci0JCQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJTm9kZSBhTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQkJCXZpc2l0KGFOb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbWF0Y2goRWxlbWVudCBub2RlKSB7Ci0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24oCi0JCQkJCW5ldyBQYXRoKHBhdGgpKTsKLQkJCWlmKG1hdGNoZXIgIT0gbnVsbCl7Ci0JCQkJbWF0Y2hlci5sb2NhdGVNYXRjaGVzKHBhdHRlcm4sIGZpbGUsIG5vZGUsIHJlcXVlc3Rvcik7Ci0JCQl9Ci0KLQkJCQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgU2VhcmNoU2NvcGUgc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTZWFyY2hTY29wZSBzY29wZSwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvKgotCQkgKiBnYXRlICMxOiByZWR1Y2UgdGhlIHNjb3BlIHRvIHRoZSBmaWxlcyB3aXRoIHRoZSBjb250ZW50IHR5cGUgdGhhdAotCQkgKiBjb3VsZCBiZSBzZWFyY2hlZCB1c2luZyB0aGlzIHBhcnRpY2lwYW50Ci0JCSAqLyAKLQkJU3RyaW5nW10gY29udGVudFR5cGVzID0gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVzKCk7CQotCQlpZihjb250ZW50VHlwZXMgIT0gbnVsbCAmJiBjb250ZW50VHlwZXMubGVuZ3RoID4gMCl7Ci0JCQlzY29wZSA9IG5ldyBDb250ZW50VHlwZVNlYXJjaFNjb3BlKHNjb3BlLCBjb250ZW50VHlwZXMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5zZWxlY3REb2N1bWVudExvY2F0aW9ucyhwYXR0ZXJuLCBzY29wZSwgc2VhcmNoT3B0aW9ucywgbW9uaXRvcik7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBDb21wb25lbnRTZWFyY2hDb250cmlidXRvciBnZXRTZWFyY2hDb250cmlidXRvcigpOwotCi0KLQlwdWJsaWMgdm9pZCBiZWdpblNlYXJjaGluZyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE1hcCBzZWFyY2hPcHRpb25zKSB7Ci0JCQotCQlzdXBlci5iZWdpblNlYXJjaGluZyhwYXR0ZXJuLCBzZWFyY2hPcHRpb25zKTsKLQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybil7Ci0JCQlYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4gY29tcG9uZW50UGF0dGVybiA9IChYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4pcGF0dGVybjsKLQkJCVhNTFNlYXJjaFBhdHRlcm4gY2hpbGRQYXR0ZXJuID0gZ2V0U2VhcmNoQ29udHJpYnV0b3IoKS5nZXREZWNsYXJhdGlvblBhdHRlcm4oY29tcG9uZW50UGF0dGVybi5nZXRNZXRhTmFtZSgpKTsKLQkJCWlmKGNoaWxkUGF0dGVybiAhPSBudWxsKXsKLQkJCQkJY2hpbGRQYXR0ZXJuLnNldFNlYXJjaE5hbWUoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TG9jYWxOYW1lKCkpOwotCQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkgICAgIAkJCWNvbXBvbmVudFBhdHRlcm4uYWRkQ2hpbGRyZW4odGhpcywgbmV3IFhNTFNlYXJjaFBhdHRlcm5bXXtjaGlsZFBhdHRlcm59KTsKLQkJCX0KLQkJCQotCQl9Ci0JCWVsc2UgaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4pewotCQkJWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybiBjb21wb25lbnRQYXR0ZXJuID0gKFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4pcGF0dGVybjsKLQkJCVhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zID0gZ2V0U2VhcmNoQ29udHJpYnV0b3IoKS5nZXRSZWZlcmVuY2VzUGF0dGVybnMoY29tcG9uZW50UGF0dGVybi5nZXRNZXRhTmFtZSgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRQYXR0ZXJucy5sZW5ndGg7IGkrKykgewotCQkJCVhNTFNlYXJjaFBhdHRlcm4gY2hpbGRQYXR0ZXJuID0gY2hpbGRQYXR0ZXJuc1tpXTsKLQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZShjb21wb25lbnRQYXR0ZXJuLmdldE5hbWUoKS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQkJY2hpbGRQYXR0ZXJuLnNldFNlYXJjaE5hbWVzcGFjZShjb21wb25lbnRQYXR0ZXJuLmdldE5hbWUoKS5nZXROYW1lc3BhY2UoKSk7CQkJCQotCQkJfQotCQkJY29tcG9uZW50UGF0dGVybi5hZGRDaGlsZHJlbih0aGlzLCBjaGlsZFBhdHRlcm5zKTsKLQkJCQotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIFRoZSBpbnRlbmQgb2YgdGhpcyBtZXRob2QgaXMgdG8gbGltaXQgdGhlIHNlYXJjaCB0byB0aGUgZmlsZXMgdGhhdCBoYXZlIGNvbnRlbnQgCi0JICogd2hpY2ggY2FuIGJlIHNlYXJjaGVkIGZvciB0aGUgZ2l2ZW4gcGF0dGVybi4gSXQgaXMgY2FsbGVkIGZyb20gCi0JICoge0BsaW5rICNzZWxlY3REb2N1bWVudExvY2F0aW9ucyhTZWFyY2hQYXR0ZXJuLCBTZWFyY2hTY29wZSwgSVByb2dyZXNzTW9uaXRvcil9Ci0JICogCi0JICogQHBhcmFtIHBhdHRlcm4gdGhlIHNlYXJjaCBwYXR0ZXJuIHRoYXQgaXMgc2VhcmNoZWQgZm9yCi0JICogQHJldHVybiBjb250ZW50IHR5cGUncyB1bmlxdWUgaWRlbnRpZmllcnMgdGhhdCBjb3VsZCBiZSBzZWFyY2hlZCBmb3IgdGhlIGdpdmVuIHBhdHRlcm4uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldFN1cHBvcnRlZENvbnRlbnRUeXBlcygpOwotCi0JcHVibGljIHZvaWQgcG9wdWxhdGVTZWFyY2hEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuKQotCXsKLQkJUGF0dGVybk1hdGNoZXIgbWF0Y2hlciA9IChQYXR0ZXJuTWF0Y2hlcilwYXR0ZXJuLmdldEFkYXB0ZXIoUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQlpZihtYXRjaGVyID09IG51bGwpewotCQkJbWF0Y2hlciA9IGdldEFkYXB0ZXIocGF0dGVybiwgUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQl9Ci0JCVhNTFF1aWNrU2Nhbi5wb3B1bGF0ZVNlYXJjaERvY3VtZW50KGRvY3VtZW50LCBtYXRjaGVyLCBwYXR0ZXJuKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoRG9jdW1lbnRTZXQgZG9jdW1lbnRTZXQsIFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIE1hcCBzZWFyY2hPcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCi0JCS8vIFRPRE86IHVzZSB0aGUgZmlsZSByZWZlcmVuY2UgZW50cmllcyBpbiB0aGUgZG9jdW1lbnRzIHRvIHJlZHVjZSB0aGUgc2NvcGUgdG8gdGhlIHJlZmVyZW5jZWQgZmlsZXMgb25seQotCQkvLyBTZWFyY2hEb2N1bWVudFtdIGRvY3VtZW50cyA9IGRvY3VtZW50U2V0LmdldFNlYXJjaERvY3VtZW50cyhpZCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2VhcmNoIHBhdHRlcm4gaXMgcXVhbGlmaWVkIGJ5IGEgZmlsZSBsb2NhdGlvbgotICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gd2UgY2FuIHVzZSBmaWxlIHNjb3BpbmcgcnVsZXMgdG8gcHJ1bmUgdGhlIG1hdGNoZXMKLSAgICAgICAgSUZpbGUgdGFyZ2V0RmlsZSA9IG51bGw7Ci0gICAgICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgQ29tcG9uZW50U2VhcmNoUGF0dGVybikKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNlYXJjaFBhdHRlcm4gY29tcG9uZW50U2VhcmNoUGF0dGVybiA9IChDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXBhdHRlcm47Ci0gICAgICAgICAgdGFyZ2V0RmlsZSA9IGNvbXBvbmVudFNlYXJjaFBhdHRlcm4uZ2V0RmlsZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9CQkKLSAgICAgICAgCi0JCS8vIGhlcmUgd2Ugc2hvdWxkIGhhdmUgaW4gc2NvcGUgb25seSByZWZlcmVuY2VkIGZpbGVzCi0JCUlGaWxlW10gZmlsZXMgPSBzY29wZS5lbmNsb3NpbmdGaWxlcygpOyAgCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0JCXsKLQkJCUlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCVN0cmluZyBwYXRoID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQlTZWFyY2hEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50U2V0LmdldFNlYXJjaERvY3VtZW50KHBhdGgsIGlkKTsgCi0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCXsgICAgICAgICAgICAgIAotCQkJRW50cnlbXSBlbnRyaWVzID0gZG9jdW1lbnQuZ2V0RW50cmllcyhnZXRTZWFyY2hFbnRyeUNhdGVnb3J5KHBhdHRlcm4pLCBudWxsLCAwKTsgICAgICAgICAgIAotCQkJaWYgKChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggPiAwKSB8fCAoc2VhcmNoT3B0aW9ucyAhPSBudWxsICYmIHNlYXJjaE9wdGlvbnMuZ2V0KCJzZWFyY2hEaXJ0eUNvbnRlbnQiKSAhPSBudWxsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy9mb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAvLyAgRW50cnkgZW50cnkgPSBlbnRyaWVzW2pdOwotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJlbnRyeSAiICsgZW50cnkuZ2V0Q2F0ZWdvcnkoKSArICIgIiArIGVudHJ5LmdldEtleSgpICsgIiAiICsgZW50cnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIC8vfSAgCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBib29sZWFuIGlzSW5TY29wZSA9IHRydWU7Ci0gICAgICAgICAgICAgIGlmICh0YXJnZXRGaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpc0luU2NvcGUgPSBpc0xpbmtlZChkb2N1bWVudFNldCwgImZpbGU6Ly8vIiArIHBhdGgsICJmaWxlOi8vLyIgKyB0YXJnZXRGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgLy9pZiAocGF0aC5lbmRzV2l0aCgiQ2FuY2VsU2VsZWN0aW9uLndzZGwiKSAgJiYgcGF0aC5pbmRleE9mKCJjbG9uZTEiKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgLy8gIGZpbGVSZWZlcmVuY2VUYWJsZS5kZWJ1ZyhxdWFsaWZpZWRQYXRoLCAwLCA1KTsKLSAgICAgICAgICAgICAgICAgIC8vfSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKGlzSW5TY29wZSkKLSAgICAgICAgICAgICAgeyAKLQkJCSAgICB0aGlzLmxvY2F0ZU1hdGNoZXMocGF0dGVybiwgZG9jdW1lbnQsIHJlcXVlc3Rvciwgc2VhcmNoT3B0aW9ucywgbW9uaXRvcik7Ci0gICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgfQotCQkJfQotCQl9Ci0JCQotCQkKLQkJaWYgKGRlYnVnUGVyZikKLQkJewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBnZXREZXNjcmlwdGlvbigpCi0JCQkJCQkJKyAiOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkgKyAibXMgZm9yIGxvY2F0ZU1hdGNoZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQkKLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGlua2VkKFNlYXJjaERvY3VtZW50U2V0IHNldCwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkKLSAgICB7Ci0gICAgICByZXR1cm4gaXNMaW5rZWQoc2V0LCBzb3VyY2UsIHRhcmdldCwgbmV3IEhhc2hNYXAoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0xpbmtlZChTZWFyY2hEb2N1bWVudFNldCBzZXQsIFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQsIEhhc2hNYXAgdmlzaXRlZCkKLSAgICB7Ci0gICAgICBpZiAoc291cmNlLmVxdWFscyh0YXJnZXQpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIAotICAgICAgU3RyaW5nIGZpbGVQcm90b2NvbCA9ICJmaWxlOi8vLyI7ICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgIAotICAgICAgLy8gRml4IGZvciBidWcgMjA0MTc0IC0gQmVnaW4KLSAgICAgIGlmKHRhcmdldC5jaGFyQXQoZmlsZVByb3RvY29sLmxlbmd0aCgpKSA9PSAnLycpICAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgICAgdGFyZ2V0ID0gZmlsZVByb3RvY29sICsgdGFyZ2V0LnN1YnN0cmluZyhmaWxlUHJvdG9jb2wubGVuZ3RoKCkgKyAxKTsKLSAgICAgIH0KLSAgICAgIC8vIEZpeCBmb3IgYnVnIDIwNDE3NCAtIEVuZAotICAgICAgICAgICAgCi0gICAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoZmlsZVByb3RvY29sKSkKLSAgICAgIHsgICAgCi0gICAgICAgIAotICAgICAgU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQgPSBzZXQuX3RlbXBHZXRTZWFyY2hEb2N1bWV0bihzb3VyY2Uuc3Vic3RyaW5nKGZpbGVQcm90b2NvbC5sZW5ndGgoKSkpOyAgICAgIAotICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOyAgICAgICAgCi0gICAgICAgIEVudHJ5W10gZW50cmllcyA9IGRvY3VtZW50LmdldEVudHJpZXMoSVhNTFNlYXJjaENvbnN0YW50cy5SRUYsIG51bGwsIDApOwotICAgICAgICBTdHJpbmdbXSByZXNvbHZlRW50cnkgPSBuZXcgU3RyaW5nW2VudHJpZXMubGVuZ3RoXTsgICAgICAgIAotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBFbnRyeSBlbnRyeSA9IGVudHJpZXNbal07Ci0gICAgICAgICAgaWYgKGVudHJ5IGluc3RhbmNlb2YgRmlsZVJlZmVyZW5jZUVudHJ5KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVSZWZlcmVuY2VFbnRyeSBmaWxlUmVmZXJlbmNlRW50cnkgPSAoRmlsZVJlZmVyZW5jZUVudHJ5KWVudHJ5OwotICAgICAgICAgICAgLy8gVE9ETy4uIHJlY29yZCBhbiB1dGlsaXplIHRoZSBwdWJsaWMgaWQgZnJvbSB0aGUgZmlsZVJlZmVyZW5jZUVudHJ5Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGZpbGVSZWZlcmVuY2VFbnRyeS5nZXRSZWxhdGl2ZUZpbGVQYXRoKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSB1cmlSZXNvbHZlci5yZXNvbHZlKHNvdXJjZSwgbnVsbCwgZmlsZVJlZmVyZW5jZUVudHJ5LmdldFJlbGF0aXZlRmlsZVBhdGgoKSk7Ci0gICAgICAgICAgICAgIHJlc29sdmVFbnRyeVtqXSA9IHJlc29sdmVkVVJJOwotICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRVUkkuZXF1YWxzKHRhcmdldCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBub3cgc2VlIGlmIHRoZXJlJ3MgYW4gaW5kaXJlY3QgbGluayBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIHRhcmdldAotICAgICAgICAvLyB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBub2RlcyB3ZSd2ZSBhbHJlYWR5IHZpc2l0ZWQgdG8gYXZvaWQgY3ljbGVzCi0gICAgICAgIGlmICh2aXNpdGVkLmdldChzb3VyY2UpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdGVkLnB1dChzb3VyY2UsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IHJlc29sdmVFbnRyeVtqXTsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsICYmIGlzTGlua2VkKHNldCwgcmVzb2x2ZUVudHJ5W2pdLCB0YXJnZXQsIHZpc2l0ZWQpKSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgCi0gICAgICAgICAgfSAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAgICAgICAKLSAgICAgIH0gCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgCi0gICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VhcmNoRW50cnlDYXRlZ29yeShTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pewotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKXsKLQkJCXJldHVybiBJWE1MU2VhcmNoQ29uc3RhbnRzLkNPTVBPTkVOVF9ERUNMOwotCQl9Ci0JCWVsc2UgaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4pewotCQkJcmV0dXJuIElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX1JFRjsKLQkJfQotCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBGaWxlUmVmZXJlbmNlUGF0dGVybil7Ci0JCSAgIHJldHVybiBJWE1MU2VhcmNoQ29uc3RhbnRzLkNPTVBPTkVOVF9SRUY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTFNlYXJjaFBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjU4ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTFNlYXJjaFBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgWE1MU2VhcmNoUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm57Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHNlYXJjaE5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHNlYXJjaE5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgZGVwdGggPSAtMTsKLQotICAgIHB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUsU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotICAgIAl0aGlzKGVsZW1lbnROYW1lc3BhY2UsIHBhcmVudEVsZW1lbnROYW1lLCBlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSwgLTEpOwotICAgIH0KLQkKLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybihTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotICAgICAgIHRoaXMoZWxlbWVudE5hbWVzcGFjZSwgbnVsbCwgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIC0xKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhNTFNlYXJjaFBhdHRlcm4oU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UsIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCBkZXB0aCkgewotICAgIAl0aGlzKGVsZW1lbnROYW1lc3BhY2UsIG51bGwsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCBkZXB0aCk7ICAgICAgIAotICAgIH0KLSAgICAgICAgICAgCi0gICAgcHJpdmF0ZSBYTUxTZWFyY2hQYXR0ZXJuKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUsIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGludCBkZXB0aCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotICAgICAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gICAgICAgIHRoaXMucGFyZW50TmFtZSA9IHBhcmVudEVsZW1lbnROYW1lOwotICAgICAgICB0aGlzLmVsZW1lbnROYW1lc3BhY2UgPSBlbGVtZW50TmFtZXNwYWNlOwotICAgICAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gICAgfQotICAgIAotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuKCl7Ci0JCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoTmFtZSgpIHsKLQkJcmV0dXJuIHNlYXJjaE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWFyY2hOYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBzZWFyY2hOYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoTmFtZShTdHJpbmcgc2VhcmNoTmFtZSkgewotCQl0aGlzLnNlYXJjaE5hbWUgPSBzZWFyY2hOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlYXJjaE5hbWVzcGFjZShTdHJpbmcgc2VhcmNoTmFtZXNwYWNlKSB7Ci0JCXRoaXMuc2VhcmNoTmFtZXNwYWNlID0gc2VhcmNoTmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnROYW1lc3BhY2UoU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UpIHsKLQkJdGhpcy5lbGVtZW50TmFtZXNwYWNlID0gZWxlbWVudE5hbWVzcGFjZTsKLQl9Ci0KLSAgcHVibGljIGludCBnZXREZXB0aCgpCi0gIHsKLSAgICByZXR1cm4gZGVwdGg7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpCi0gIHsKLSAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gIH0KLQotcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewotCXJldHVybiBwYXJlbnROYW1lOwotfQotCi1wdWJsaWMgdm9pZCBzZXRQYXJlbnROYW1lKFN0cmluZyBwYXJlbnROYW1lKSB7Ci0JdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsKLX0KLQkKLQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL0lYTUxTZWFyY2hDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL0lYTUxTZWFyY2hDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2MGQ4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9JWE1MU2VhcmNoQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5pbXBsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxTZWFyY2hDb25zdGFudHMKLXsKLQkJU3RyaW5nIFJFRj0gIm91dExpbmsiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBDT01QT05FTlRfREVDTCA9ICJjb21wb25lbnREZWNsIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQ09NUE9ORU5UX1JFRiA9ICJjb21wb25lbnREZWNsIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWUyMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQkKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQkKLQkvKioKLQkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCi0JICogQHJldHVybiB0aGUgbWFuaXB1bGF0ZWQgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gYmluZChtZXNzYWdlLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAotCSAqIEBwYXJhbSBiaW5kaW5nIHRoZSBvYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gdGhlIG1hbmlwdWxhdGVkIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBiaW5kaW5nKSB7Ci0JCXJldHVybiBiaW5kKG1lc3NhZ2UsIG5ldyBPYmplY3RbXSB7YmluZGluZ30pOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKLQkgKiBAcGFyYW0gYmluZGluZzEgQW4gb2JqZWN0IHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKLQkgKiBAcGFyYW0gYmluZGluZzIgQSBzZWNvbmQgb2JqZWN0IHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgYmluZGluZzEsIE9iamVjdCBiaW5kaW5nMikgewotCQlyZXR1cm4gYmluZChtZXNzYWdlLCBuZXcgT2JqZWN0W10ge2JpbmRpbmcxLCBiaW5kaW5nMn0pOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKLQkgKiBAcGFyYW0gYmluZGluZ3MgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCi0JICogQHJldHVybiB0aGUgbWFuaXB1bGF0ZWQgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0W10gYmluZGluZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIGJpbmRpbmdzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL1hNTFNlYXJjaERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9YTUxTZWFyY2hEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTA4YWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL1hNTFNlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTFNlYXJjaFBhcnRpY2lwYW50OwotCi1wdWJsaWMgY2xhc3MgWE1MU2VhcmNoRG9jdW1lbnQgZXh0ZW5kcyBTZWFyY2hEb2N1bWVudCB7Ci0JCi0JSURPTU1vZGVsIG1vZGVsOwotCU1hcCBlbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsgLy8gY2F0ZWdvcnkgLT4gc2V0IChlbnRyeSkJCi0KLQlwdWJsaWMgWE1MU2VhcmNoRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCwgWE1MU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQkJc3VwZXIoZG9jdW1lbnRQYXRoLCBwYXJ0aWNpcGFudCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbCgpIHsKLQkJaWYobW9kZWwgPT0gbnVsbCl7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRpbmcgRE9NIGZvciAiICsgZ2V0UGF0aCgpKTsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChnZXRQYXRoKCkpKTsKLQkJCWlmKGZpbGUgIT0gbnVsbCl7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSAoSURPTU1vZGVsKVN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIEVudHJ5W10gZ2V0RW50cmllcyhTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBrZXksIGludCBtYXRjaFJ1bGUpCi0JewotCQkvLyBUT0RPIHVzZSBtYXRjaFJ1bGUKLQkJU2V0IHJlc3VsdHMgPSBuZXcgSGFzaFNldCgpOwotCQlpZihjYXRlZ29yeSAhPSBudWxsKXsKLQkJCVNldCB2YWx1ZXMgPSAoU2V0KWVudHJpZXMuZ2V0KGNhdGVnb3J5KTsKLQkJCWlmKHZhbHVlcyA9PSBudWxsKXsKLQkJCQlyZXR1cm4gbmV3IEVudHJ5WzBdOwotCQkJfQotCQkJaWYoa2V5ID09IG51bGwgfHwgIiIuZXF1YWxzKGtleSkgfHwgIioiLmVxdWFscyhrZXkpKXsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLy8gZW50cmllcyB3aXRoIGFueSBrZXkgaW4gdGhlIGdpdmVuIGNhdGVnb3J5Ci0JCQkJcmVzdWx0cy5hZGRBbGwodmFsdWVzKTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJLy8gZW50cmllcyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoZSBnaXZlbiBjYXRlZ29yeQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlFbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmKGtleS5lcXVhbHMoZW50cnkuZ2V0S2V5KCkpKXsKLQkJCQkJCXJlc3VsdHMuYWRkKGVudHJ5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiAoRW50cnlbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBFbnRyeVtyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEVudHJ5IGVudHJ5KQotCXsKLQkJaWYoZW50cnkuZ2V0Q2F0ZWdvcnkoKSAhPSBudWxsKXsKLQkJCVNldCB2YWx1ZXMgPSAoU2V0KWVudHJpZXMuZ2V0KGVudHJ5LmdldENhdGVnb3J5KCkpOwotCQkJaWYodmFsdWVzID09IG51bGwpewotCQkJCWVudHJpZXMucHV0KGVudHJ5LmdldENhdGVnb3J5KCksIHZhbHVlcz1uZXcgSGFzaFNldCgpKTsKLQkJCX0KLQkJCXZhbHVlcy5hZGQoZW50cnkpOwotCQl9Ci0JCQotCX0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsgICAgIAotICAgICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7ICAgICAgICAKLSAgICAgIH0gIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2FlYTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvbWF0Y2hpbmcvUGF0dGVybk1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9QYXR0ZXJuTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTUxOGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9QYXR0ZXJuTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBtYXRjaGluZyBpbXBsZW1lbnRhdGlvbi4gIAotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG9mIHRoZSBQYXR0ZXJuTWF0Y2hlcyBzaG91bGQgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWMgcGF0dGVybiBtYXRjaGluZy4KLSAqIDwvcD4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBvZiB0aGUgUGF0dGVybk1hdGNoZXMgc2hvdWxkIGJlIHNldCBhcyBhZGFwdGVycyBmb3IgdGhlIHBhdHRlcm5zIHRoYXQgdGhleSBtYXRjaC4KLSAqIDwvcD4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50I3NlbGVjdERvY3VtZW50TG9jYXRpb25zKCl9IHdpbGwgY2FsbCAKLSAqIHsgQGxpbmsgUGF0dGVybk1hdGNoZXIjbWF0Y2hlcygpIH0gb24gdGhlIGFkYXB0ZXIgb24gcGF0dGVybiBtYXRjaGVyLgotICogCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCNsb2NhdGVNYXRjaGVzKCl9IHdpbGwgY2FsbCAKLSAqIHsgQGxpbmsgUGF0dGVybk1hdGNoZXIjbG9jYXRlTWF0Y2hlcygpIH0gb24gdGhlIGFkYXB0ZXIgb24gcGF0dGVybiBtYXRjaGVyLgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBhdHRlcm5NYXRjaGVyIHsKLQkKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGRpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uIHRvIHRoZSByZXF1ZXN0b3IgaWYgdGhlcmUgYXJlIG1hdGNoZXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUZpbGUgZmlsZSwgRWxlbWVudCBlbGVtZW50LCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG9ubHkgYW5zd2VycyBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIGVsZW1lbnQsIGl0IGRvZXMgbm90IGdpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE9iamVjdCBlbGVtZW50KTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgU2VhcmNoTWF0Y2ggY3JlYXRlU2VhcmNoTWF0Y2goSUZpbGUgZmlsZSwgQXR0ciBhdHRyaWJ1dGVOb2RlKQotICAgIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgIGlmKGF0dHJpYnV0ZU5vZGUgaW5zdGFuY2VvZiBJRE9NQXR0cil7Ci0gICAgICAgICAgICBJRE9NQXR0ciBkb21BdHRyID0gKElET01BdHRyKWF0dHJpYnV0ZU5vZGU7Ci0gICAgICAgICAgICBzdGFydCA9IGRvbUF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotICAgICAgICAgICAgbGVuZ3RoID0gZG9tQXR0ci5nZXRWYWx1ZVJlZ2lvblRleHQoKS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICBTZWFyY2hNYXRjaCBtYXRjaCA9IG5ldyBTZWFyY2hNYXRjaChhdHRyaWJ1dGVOb2RlLCBzdGFydCwgbGVuZ3RoLCBmaWxlKTsKLSAgICAgICAgcmV0dXJuIG1hdGNoOwotICAgIH0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXRjaChTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElGaWxlIGZpbGUsIEF0dHIgYXR0cmlidXRlTm9kZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWRkTWF0Y2ggIiArIHBhdHRlcm4gKyAiICIgKyBhdHRyaWJ1dGVOb2RlLmdldE5hbWUoKSArICI9IiArIGF0dHJpYnV0ZU5vZGUuZ2V0VmFsdWUoKSk7Ci0JCWlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLQkJCQlTZWFyY2hNYXRjaCBtYXRjaCA9IGNyZWF0ZVNlYXJjaE1hdGNoKGZpbGUsIGF0dHJpYnV0ZU5vZGUpOyAgICAgICAgICAgICAgICAKLQkJCQlpZihyZXF1ZXN0b3IgIT0gbnVsbCl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXF1ZXN0b3IuYWNjZXB0U2VhcmNoTWF0Y2gobWF0Y2gpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vZG8gbm90aGluZwotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9TQVhTZWFyY2hFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvbWF0Y2hpbmcvU0FYU2VhcmNoRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVjNGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9TQVhTZWFyY2hFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotcHVibGljIGNsYXNzIFNBWFNlYXJjaEVsZW1lbnR7Ci0JQXR0cmlidXRlcyBhdHRyaWJ1dGVzOwotCVN0cmluZyBlbGVtZW50TmFtZTsKLQlTdHJpbmcgZWxlbWVudE5hbWVzcGFjZTsKLQlNYXAgbmFtZXNwYWNlTWFwID0gbmV3IEhhc2hNYXAoKTsgLy8gTWFwIG9mIHN0cmluZyBwcmVmaXgga2V5cyBhbmQgbmFtZXNwYWNlCi0JU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIHBhcmVudE5hbWU7Ci0gICAgaW50IGRlcHRoID0gLTE7Ci0JCi0JcHVibGljIFNBWFNlYXJjaEVsZW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnROYW1lc3BhY2U7Ci0JfQotCXB1YmxpYyBNYXAgZ2V0TmFtZXNwYWNlTWFwKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlTWFwOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWVzcGFjZShTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSkgewotCQl0aGlzLmVsZW1lbnROYW1lc3BhY2UgPSBlbGVtZW50TmFtZXNwYWNlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VNYXAoTWFwIG5hbWVzcGFjZU1hcCkgewotCQl0aGlzLm5hbWVzcGFjZU1hcCA9IG5hbWVzcGFjZU1hcDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JfQotICBwdWJsaWMgaW50IGdldERlcHRoKCkKLSAgewotICAgIHJldHVybiBkZXB0aDsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpCi0gIHsKLSAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gIH0KLXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpIHsKLQlyZXR1cm4gcGFyZW50TmFtZTsKLX0KLXB1YmxpYyB2b2lkIHNldFBhcmVudE5hbWUoU3RyaW5nIHBhcmVudE5hbWUpIHsKLQl0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOwotfQotCQotCQotCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9YTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1hNTFNlYXJjaFBhdHRlcm5NYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZWU2MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1hNTFNlYXJjaFBhdHRlcm5NYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MU2VhcmNoUGF0dGVybk1hdGNoZXIgZXh0ZW5kcyBQYXR0ZXJuTWF0Y2hlcnsKLQkKLSAgIC8qKgotICAgICogVGhlIGFjdGl2ZSBzZWFyY2ggcGFydGljaXBhbnQuCi0gICAgKi8KLSAgICBwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaFBhcnRpY2lwYW50OwotICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgcGF0dGVybiBtYXRjaGVyIGdpdmVuIGEgc2VhcmNoIHBhcnRpY2lwYW50LgotICAgICAqIEBwYXJhbSBzZWFyY2hQYXJ0aWNpcGFudCB0aGUgYWN0aXZlIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2ggcGFydGljaXBhbnR9LgotICAgICAqLwotICAgIHB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlcihTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2hQYXJ0aWNpcGFudCkKLSAgICB7Ci0gICAgICB0aGlzLnNlYXJjaFBhcnRpY2lwYW50ID0gc2VhcmNoUGFydGljaXBhbnQ7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZU5hbWVzcGFjZUZvclByZWZpeChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwcmVmaXgpCi0JewotCSAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQ7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKQotCSAgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQl7Ci0JCSAgRWxlbWVudCBlID0gKEVsZW1lbnQpbm9kZTsKLQkJICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSA/ICgieG1sbnM6IiArIHByZWZpeCkgOiAieG1sbnMiOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgcmVzdWx0ID0gZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0JCSAgaWYgKHJlc3VsdCAhPSBudWxsKQotCQkgIHsKLQkJCSBicmVhazsgIAotCQkgIH0JICAKLQkJfQkKLQkgIH0JICAKLQkgIHJldHVybiByZXN1bHQ7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYTUxTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIEVsZW1lbnQgZG9tRWxlbWVudCkgewotCQotCQkJcGF0dGVybi5zZXRFbGVtZW50TmFtZShkb21FbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLQkJCXBhdHRlcm4uc2V0RWxlbWVudE5hbWVzcGFjZShkb21FbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIC8vIFRPRE8gKGNzKSBzZXQgdGhlIGRlcHRoIGF0dHJpYnV0ZSBvbiB0aGUgcGF0dGVybgotICAgICAgICAgICAgLy8KLQkJCVN0cmluZyBhY3R1YWxWYWx1ZSA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKHBhdHRlcm4uZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJCSBpZihhY3R1YWxWYWx1ZSAhPSBudWxsKXsKLQkJCQkJaW50IG4gPSBhY3R1YWxWYWx1ZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYobiA+IDApewotCQkJCQkJU3RyaW5nIHByZWZpeCA9IGFjdHVhbFZhbHVlLnN1YnN0cmluZygwLCBuKTsKLQkJCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZShhY3R1YWxWYWx1ZS5zdWJzdHJpbmcobisxKSk7ICAgICAgCi0JCQkJCQkKLQkJCQkJCVN0cmluZyBuYW1lc3BhY2UgPSBjb21wdXRlTmFtZXNwYWNlRm9yUHJlZml4KGRvbUVsZW1lbnQsIHByZWZpeCk7Ci0JCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkJCQkKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZShhY3R1YWxWYWx1ZSk7Ci0JCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWVzcGFjZShkb21FbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkgICAgfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShYTUxTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNBWFNlYXJjaEVsZW1lbnQgc2F4RWxlbWVudCkgewotCQkKLQkJcGF0dGVybi5zZXRFbGVtZW50TmFtZShzYXhFbGVtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCQlwYXR0ZXJuLnNldEVsZW1lbnROYW1lc3BhY2Uoc2F4RWxlbWVudC5nZXRFbGVtZW50TmFtZXNwYWNlKCkpOwotICAgICAgICBwYXR0ZXJuLnNldERlcHRoKHNheEVsZW1lbnQuZ2V0RGVwdGgoKSk7Ci0gICAgICAgIHBhdHRlcm4uc2V0UGFyZW50TmFtZShzYXhFbGVtZW50LmdldFBhcmVudE5hbWUoKSk7Ci0JCVN0cmluZyBhY3R1YWxWYWx1ZSA9IHNheEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLmdldFZhbHVlKHBhdHRlcm4uZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJIGlmKGFjdHVhbFZhbHVlICE9IG51bGwpewotCQkJCWludCBuID0gYWN0dWFsVmFsdWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYobiA+IDApewotCQkJCQlTdHJpbmcgcHJlZml4ID0gYWN0dWFsVmFsdWUuc3Vic3RyaW5nKDAsIG4pOwotCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWUoYWN0dWFsVmFsdWUuc3Vic3RyaW5nKG4rMSkpOwotCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWVzcGFjZSgoU3RyaW5nKXNheEVsZW1lbnQuZ2V0TmFtZXNwYWNlTWFwKCkuZ2V0KHByZWZpeCkpOwotCQkJCQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lKGFjdHVhbFZhbHVlKTsKLQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2Uoc2F4RWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCQkJfQotCQkgICAgfQotCQotCX0KLQkKLQlYTUxTZWFyY2hQYXR0ZXJuIHNlYXJjaFBhdHRlcm47Ci0JCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyKCkgewotCQlzdXBlcigpOwotCQkKLQl9Ci0KLQkKLQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgZGl2ZSBhY3R1YWwgbWF0Y2ggbG9jYXRpb24gdG8gdGhlIHJlcXVlc3RvciBpZiB0aGVyZSBhcmUgbWF0Y2hlcwotCSAqLwotCQotCXB1YmxpYyB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJRmlsZSBmaWxlLCBFbGVtZW50IGVsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pewotCQkJWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkUGF0dGVybnMgPSAoKFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pcGF0dGVybikuZ2V0Q2hpbGRyZW4oc2VhcmNoUGFydGljaXBhbnQpOwotCQkJaWYgKGNoaWxkUGF0dGVybnMgPT0gbnVsbCl7Ci0JCQkgIHJldHVybjsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRQYXR0ZXJucy5sZW5ndGg7IGkrKykgewotCQkJCVBhdHRlcm5NYXRjaGVyIG1hdGNoZXIgPSAoUGF0dGVybk1hdGNoZXIpY2hpbGRQYXR0ZXJuc1tpXS5nZXRBZGFwdGVyKFBhdHRlcm5NYXRjaGVyLmNsYXNzKTsKLQkJCQlpZihtYXRjaGVyID09IG51bGwpewotCQkJCQltYXRjaGVyID0gdGhpczsKLQkJCQl9Ci0JCQkJaWYobWF0Y2hlciAhPSBudWxsKXsKLQkJCQkJbWF0Y2hlci5sb2NhdGVNYXRjaGVzKGNoaWxkUGF0dGVybnNbaV0sIGZpbGUsIGVsZW1lbnQsIHJlcXVlc3Rvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTFNlYXJjaFBhdHRlcm4pewotCQkJaWYobWF0Y2hlcyhwYXR0ZXJuLCBlbGVtZW50KSl7Ci0JCQkJQXR0ciBhdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoKChYTUxTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQkJYWRkTWF0Y2gocGF0dGVybiwgZmlsZSwgYXR0cmlidXRlLCByZXF1ZXN0b3IpOwotCQkJfQotCQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBvbmx5IGFuc3dlcnMgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyBlbGVtZW50LCBpdCBkb2VzIG5vdCBnaXZlIGFjdHVhbCBtYXRjaCBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBPYmplY3QgZWxlbWVudCl7Ci0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXsKLQkJCVhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zID0gKChYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmdldENoaWxkcmVuKHNlYXJjaFBhcnRpY2lwYW50KTsKLSAgICAgICAgICAgIGlmIChjaGlsZFBhdHRlcm5zID09IG51bGwpewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkUGF0dGVybnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyID0gKFBhdHRlcm5NYXRjaGVyKWNoaWxkUGF0dGVybnNbaV0uZ2V0QWRhcHRlcihQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCQkJaWYobWF0Y2hlciA9PSBudWxsKXsKLQkJCQkJbWF0Y2hlciA9IHRoaXM7Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXIgIT0gbnVsbCl7Ci0JCQkJCWlmKG1hdGNoZXIubWF0Y2hlcyhjaGlsZFBhdHRlcm5zW2ldLCBlbGVtZW50KSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxTZWFyY2hQYXR0ZXJuKXsKLQkJCQotCQkJWE1MU2VhcmNoUGF0dGVybiBwb3NzaWJsZU1hdGNoID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4oKTsKLQkJCXBvc3NpYmxlTWF0Y2guc2V0QXR0cmlidXRlTmFtZSgoKFhNTFNlYXJjaFBhdHRlcm4pcGF0dGVybikuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KXsKLQkJCQlpbml0aWFsaXplKHBvc3NpYmxlTWF0Y2gsIChFbGVtZW50KWVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgU0FYU2VhcmNoRWxlbWVudCl7Ci0JCQkJaW5pdGlhbGl6ZShwb3NzaWJsZU1hdGNoLCAoU0FYU2VhcmNoRWxlbWVudCllbGVtZW50KTsKLQkJCX0KLQkJCXNlYXJjaFBhdHRlcm4gPSAoWE1MU2VhcmNoUGF0dGVybilwYXR0ZXJuOwotCQkJcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKHBvc3NpYmxlTWF0Y2gpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlc1BhdHRlcm4oU2VhcmNoUGF0dGVybiBwYXR0ZXJuKSB7Ci0JCWlmKHNlYXJjaFBhdHRlcm4gIT0gbnVsbCAmJiBwYXR0ZXJuIGluc3RhbmNlb2YgWE1MU2VhcmNoUGF0dGVybil7Ci0JCQlYTUxTZWFyY2hQYXR0ZXJuIGRlY29kZWRQYXR0ZXJuID0gKFhNTFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLSAgICAgICAgICAgIGlmKHNlYXJjaFBhdHRlcm4uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0RWxlbWVudE5hbWUoKSkgJiYgICAgICAgICAgICAgICAgICAgIAotCQkJCQlzZWFyY2hQYXR0ZXJuLmdldEVsZW1lbnROYW1lc3BhY2UoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0RWxlbWVudE5hbWVzcGFjZSgpKSl7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKHNlYXJjaFBhdHRlcm4uZ2V0UGFyZW50TmFtZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICBkZWNvZGVkUGF0dGVybi5nZXRQYXJlbnROYW1lKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICFzZWFyY2hQYXR0ZXJuLmdldFBhcmVudE5hbWUoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0UGFyZW50TmFtZSgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICBpZihzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgiKiIuZXF1YWxzKHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgIGVsc2UgaWYoc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lc3BhY2UoKSA9PSBudWxsKXsKLQkJCQkJcmV0dXJuIHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpLmVxdWFscyhkZWNvZGVkUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkpOwotCQkJCX0KLQkJCQllbHNlewotCQkJCQlyZXR1cm4gc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKSkgJiYKLQkJCQkJc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lc3BhY2UoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0U2VhcmNoTmFtZXNwYWNlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLSAgICAKLSAgICBwcm90ZWN0ZWQgU2VhcmNoTWF0Y2ggY3JlYXRlU2VhcmNoTWF0Y2goSUZpbGUgZmlsZSwgQXR0ciBhdHRyaWJ1dGVOb2RlKQotICAgIHsKLSAgICAgIFNlYXJjaE1hdGNoIG1hdGNoID0gc3VwZXIuY3JlYXRlU2VhcmNoTWF0Y2goZmlsZSwgYXR0cmlidXRlTm9kZSk7Ci0gICAgICAvLyB0b2RvLi4uIHJlbW92ZSB0aGlzIHVnbHkgaGFjayEhCi0gICAgICBpZiAoIm5hbWUiLmVxdWFscyhhdHRyaWJ1dGVOb2RlLmdldE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoInRvZG8tY29tcHV0ZS10YXJnZXROYW1lc3BhY2UiLCBhdHRyaWJ1dGVOb2RlLmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1hdGNoLm1hcC5wdXQoIm5hbWUiLCBxdWFsaWZpZWROYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgLy9FbGVtZW50IGVsZW1lbnQgPSBhdHRyaWJ1dGVOb2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIC8vaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiKSkKLSAgICAgIC8veyAgICAgICAgCi0gICAgICAvL30gIAotICAgICAgcmV0dXJuIG1hdGNoOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL3F1aWNrc2Nhbi9YTUxRdWlja1NjYW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGExNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL3F1aWNrc2Nhbi9YTUxRdWlja1NjYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5xdWlja3NjYW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmcuUGF0dGVybk1hdGNoZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxRdWlja1NjYW4KLXsKLSAgICAvKgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgZnVsbEZpbGVQYXRoKQotCXsKLQkJWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcigpOwotCQlwYXJzZUZpbGUoZnVsbEZpbGVQYXRoLCBoYW5kbGVyKTsKLQkJcmV0dXJuIGhhbmRsZXIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JfSovCi0JCi0JLyoKLQkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IG1hdGNoZXMgZW5jb3VudGVyZWQgYmFzZWQgb24gdGhlIGNyaXRlcmlhCi0JICogcHJvdmlkZWQuCi0JICoKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTWF0Y2goU3RyaW5nIGZ1bGxGaWxlUGF0aCwgUGF0dGVybk1hdGNoZXIgbWF0Y2hlciwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuKQotCXsKLQkJWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcihtYXRjaGVyLCBwYXR0ZXJuKTsKLQkJcGFyc2VGaWxlKGZ1bGxGaWxlUGF0aCwgaGFuZGxlcik7Ci0JCXJldHVybiBoYW5kbGVyLmhhc01hdGNoKCk7Ci0JfSovCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHBvcHVsYXRlU2VhcmNoRG9jdW1lbnQoU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsIFBhdHRlcm5NYXRjaGVyIG1hdGNoZXIsIFNlYXJjaFBhdHRlcm4gcGF0dGVybikKLQl7Ci0JCVhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIoZG9jdW1lbnQsIG1hdGNoZXIsIHBhdHRlcm4pOwotCQlwYXJzZUZpbGUoZG9jdW1lbnQuZ2V0UGF0aCgpLCBoYW5kbGVyKTsKLQkJcmV0dXJuIGhhbmRsZXIuaGFzTWF0Y2goKTsKLQl9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYTUxSZWFkZXIgcmVhZGVyOwotICAgIHByaXZhdGUgc3RhdGljIFhNTFJlYWRlciBnZXRPckNyZWF0ZVJlYWRlcigpCi0gICAgewotICAgICAgIGlmIChyZWFkZXIgPT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgICB0cnkKLSAgICAgICAgIHsKLSAgICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgIHJlYWRlciA9IHBhcnNlci5nZXRYTUxSZWFkZXIoKTsgIAotICAgICAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgcmVhZGVyLnNldEVycm9ySGFuZGxlcihuZXcgSW50ZXJuYWxFcnJvckhhbmRsZXIoKSk7ICAgICAgICAgIAotICAgICAgICAgfQotICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICB9Ci0gICAgICAgfSAKLSAgICAgICByZXR1cm4gcmVhZGVyOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgY2xhc3MgSW50ZXJuYWxFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsgICAgICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgeyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIAotCXByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHBhcnNlRmlsZShTdHJpbmcgZnVsbEZpbGVQYXRoLAotCQkJWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIgaGFuZGxlcikKLQl7Ci0JCUZpbGVJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeQotCQl7ICAgICAgICAgICAgCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoZnVsbEZpbGVQYXRoKSk7Ci0JCQlYTUxSZWFkZXIgcmVhZGVyID0gZ2V0T3JDcmVhdGVSZWFkZXIoKTsKLSAgICAgICAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJwYXJzZUZpbGUiICsgcmVhZGVyICsgIiAoIiArICBmdWxsRmlsZVBhdGggKyAiKSIpOwkJCQotCQkJcmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gc2tpcCB0aGUgZmlsZQotCQl9IAotCQlmaW5hbGx5ewotCQkJaWYoaW5wdXRTdHJlYW0gIT0gbnVsbCl7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGNhbiBub3QgZG8gbXVjaCAKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkODdjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkNvbXBvbmVudERlY2xhcmF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5Db21wb25lbnRSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkZpbGVSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuSVhNTFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmcuU0FYU2VhcmNoRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBTQVggY29udGVudCBoYW5kbGVyLCBpdCBzaG91bGQgYmUgcmVjeWNsZWQgYmVmb3JlIHNjYW5uaW5nIGEgZmlsZSBmb3IgdGhlIG5ldyBTZWFyY2hQYXR0ZXJuLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLXsKLQlwcml2YXRlIE1hcCBuYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOyAvLyBNYXAgb2Ygc3RyaW5nIHByZWZpeCBrZXlzIGFuZCBuYW1lc3BhY2UKLQlwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU2VhcmNoUGF0dGVybiBwYXR0ZXJuOwotCXByaXZhdGUgU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQ7ICAvLyB3ZSdsbCBhZGQgdXNlZnVsIGVudHJpZXMgaW4gdGhlIHNlYXJjaCBkb2N1bWVudCBhcyB3ZSBwYXJzaW5nCi0JcHJpdmF0ZSBTQVhTZWFyY2hFbGVtZW50IHNlYXJjaEVsZW1lbnQgPSBuZXcgU0FYU2VhcmNoRWxlbWVudCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdGFjayBjdXJyZW50UGF0aCA9IG5ldyBTdGFjaygpOwotCXByaXZhdGUgUGF0dGVybk1hdGNoZXIgbWF0Y2hlcjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX05BTUVTUEFDRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7IC8vJE5PTi1OTFMtMSQKLQotCQotCXB1YmxpYyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcihQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJdGhpcy5tYXRjaGVyID0gbWF0Y2hlcjsKLQl9Ci0JCi0JcHVibGljIFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJdGhpcy5tYXRjaGVyID0gbWF0Y2hlcjsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQkKLQlwdWJsaWMgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwKLQkJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotCXsJCi0JCS8vIFNlYXJjaCBmb3IgdGFyZ2V0TmFtZXNwYWNlIGlmIHdlIGhhdmVuJ3QgZW5jb3VudGVyZWQgaXQgeWV0LgotCQlpZiAodGFyZ2V0TmFtZXNwYWNlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJaW50IG5BdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJpYnV0ZXM7IGkrKykKLQkJCXsKLQkJCQlpZiAoInRhcmdldE5hbWVzcGFjZSIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQl0YXJnZXROYW1lc3BhY2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNvbGxlY3QgbGluayBpbmZvCi0gICAgCi0gICAgLy8gVE9ETyBUaGlzIGNvZGUgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gZGVsZWdhdGUgdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi0gICAgLy8gZGV0ZWN0IGxpbmtzIGJldHdlZW4gZmlsZXMgdG8gdGhlIHNlYXJjaCBwcm92aWRlcnMvY29udHJpYnV0b3JzLgotICAgIC8vIFRoZSBjdXJyZW50IGNvZGUgb25seSBoYW5kbGVzIHRoZSBYU0QgYW5kIFdTREwgY2FzZXMuIAotICAgIAotCQlpZigiaW1wb3J0Ii5lcXVhbHMobG9jYWxOYW1lKSAmJiBuYW1lc3BhY2VNYXRjaGVzKHVyaSkpeyAvLyROT04tTkxTLTEkCi0JCQlGaWxlUmVmZXJlbmNlRW50cnkgZG9jdW1lbnRFbnRyeSA9IG5ldyBGaWxlUmVmZXJlbmNlRW50cnkoKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0Q2F0ZWdvcnkoSVhNTFNlYXJjaENvbnN0YW50cy5SRUYpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRLZXkoImltcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZXNwYWNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZXNwYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoZ2V0TG9jYXRpb25BdHRyaWJ1dGVOYW1lKHVyaSkpOyAvLyROT04tTkxTLTEkCi0JCQlkb2N1bWVudEVudHJ5LnNldFB1YmxpY0lkZW50aWZpZXIobmFtZXNwYWNlKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0UmVsYXRpdmVGaWxlUGF0aChsb2NhdGlvbik7ICAgICAgICAgICAgCi0JCQlkb2N1bWVudC5wdXRFbnRyeShkb2N1bWVudEVudHJ5KTsKLQkJfQotCQlpZigoInJlZGVmaW5lIi5lcXVhbHMobG9jYWxOYW1lKXx8ICJpbmNsdWRlIi5lcXVhbHMobG9jYWxOYW1lKSkgJiYgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbmFtZXNwYWNlTWF0Y2hlcyh1cmkpKXsKLQkJCUZpbGVSZWZlcmVuY2VFbnRyeSBkb2N1bWVudEVudHJ5ID0gbmV3IEZpbGVSZWZlcmVuY2VFbnRyeSgpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRDYXRlZ29yeShJWE1MU2VhcmNoQ29uc3RhbnRzLlJFRik7Ci0JCQlkb2N1bWVudEVudHJ5LnNldEtleSgiaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbG9jYXRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGdldExvY2F0aW9uQXR0cmlidXRlTmFtZSh1cmkpKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnRFbnRyeS5zZXRQdWJsaWNJZGVudGlmaWVyKHVyaSk7Ci0JCQlkb2N1bWVudEVudHJ5LnNldFJlbGF0aXZlRmlsZVBhdGgobG9jYXRpb24pOwotCQkJZG9jdW1lbnQucHV0RW50cnkoZG9jdW1lbnRFbnRyeSk7Ci0JCX0KLQkJCi0JCQotICAgICAgICAvLyBpc3N1ZSAoY3MpIHlvdSBtYXkgd2FudCB0byB0cnkgcGVyZiBtZWFzdXJlbWVudHMgdG8gY29tcGF0ZSByZXVzaW5nIHRoZSBzYW1lCi0gICAgICAgIC8vIGluc3RhbmNlIG9mIGEgU0FYU2VhcmNoRWxlbWVudCBpbnN0ZWFkIG9mIG5ld2luZyBvbmUgZWFjaCB0aW1lIAotCQkvL1hNTFNlYXJjaFBhdHRlcm4uU0FYU2VhcmNoRWxlbWVudCBzZWFyY2hFbGVtZW50ID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4uU0FYU2VhcmNoRWxlbWVudCgpOwotCQlzZWFyY2hFbGVtZW50LnNldEVsZW1lbnROYW1lKGxvY2FsTmFtZSk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0RWxlbWVudE5hbWVzcGFjZSh1cmkpOwotCQlzZWFyY2hFbGVtZW50LnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0TmFtZXNwYWNlTWFwKG5hbWVzcGFjZU1hcCk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0JCWlmIChjdXJyZW50UGF0aC5zaXplKCkgPiAwKQotCQl7Ci0JCSAgU3RyaW5nIHBhcmVudE5hbWUgPSAoU3RyaW5nKWN1cnJlbnRQYXRoLnBlZWsoKTsKLQkJICBzZWFyY2hFbGVtZW50LnNldFBhcmVudE5hbWUocGFyZW50TmFtZSk7Ci0JCX0JCQkKLQkKLQotCQlpZihtYXRjaGVyICE9IG51bGwpewotCQkJaWYobWF0Y2hlci5tYXRjaGVzKHBhdHRlcm4sIHNlYXJjaEVsZW1lbnQpKXsKLQkJCQloYXNNYXRjaCA9IHRydWU7Ci0JCQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4pewotCQkJCQlDb21wb25lbnRSZWZlcmVuY2VFbnRyeSBkb2N1bWVudEVudHJ5ID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZUVudHJ5KCk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0Q2F0ZWdvcnkoSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfUkVGKTsKLQkJCQkJUXVhbGlmaWVkTmFtZSBuYW1lID0gbmV3IFF1YWxpZmllZE5hbWUodXJpLCBsb2NhbE5hbWUpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldEtleShuYW1lLnRvU3RyaW5nKCkpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldE5hbWUobmFtZSk7Ci0JCQkJCWRvY3VtZW50LnB1dEVudHJ5KGRvY3VtZW50RW50cnkpOwotCQkJCX0KLQkJCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4pewotCQkJCQlDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5IGRvY3VtZW50RW50cnkgPSBuZXcgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSgpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldENhdGVnb3J5KElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX0RFQ0wpOwotICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1lIG5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZSh0YXJnZXROYW1lc3BhY2UsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKHVyaSwgbG9jYWxOYW1lKTsgICAgICAgICAgICAgICAgICAgIAotCQkJCQlkb2N1bWVudEVudHJ5LnNldEtleShuYW1lLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEVudHJ5LnNldE5hbWUobmFtZSk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0TWV0YU5hbWUobWV0YU5hbWUpOwotCQkJCQlkb2N1bWVudC5wdXRFbnRyeShkb2N1bWVudEVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY3VycmVudFBhdGgucHVzaChsb2NhbE5hbWUpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25BdHRyaWJ1dGVOYW1lKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpZiAoWE1MU0NIRU1BX05BTUVTUEFDRS5lcXVhbHModXJpKSkKLSAgICB7Ci0gICAgICByZXR1cm4gInNjaGVtYUxvY2F0aW9uIjsKLSAgICB9Ci0gICAgCi0gICAgZWxzZSBpZiAoV1NETF9OQU1FU1BBQ0UuZXF1YWxzKHVyaSkpCi0gICAgewotICAgICAgcmV0dXJuICJsb2NhdGlvbiI7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBuYW1lc3BhY2VNYXRjaGVzKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gWE1MU0NIRU1BX05BTUVTUEFDRS5lcXVhbHModXJpKSB8fAotICAgICAgICAgIFdTRExfTkFNRVNQQUNFLmVxdWFscyh1cmkpOwotICB9Ci0JCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewotCQljdXJyZW50UGF0aC5wb3AoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsYmFjayBmb3IgU0FYIHBhcnNlcgotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRQcmVmaXhNYXBwaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewotCQlpZiAoYXJnMCAhPSBudWxsICYmIGFyZzAubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQl0aGlzLm5hbWVzcGFjZU1hcC5wdXQoYXJnMCwgYXJnMSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotCQl0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNYXRjaCgpIHsKLQkJcmV0dXJuIGhhc01hdGNoOwotCX0KLQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRvckhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YzU3OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgdGhlIFhNTCB2YWxpZGF0b3IuCi0gKiAKLSAqIEBhdXRob3IgQ3JhaWcgU2FsdGVyLCBJQk0KLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckhlbHBlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgTGlzdCBuYW1lc3BhY2VVUklMaXN0ID0gbmV3IFZlY3RvcigpOwotICBwdWJsaWMgYm9vbGVhbiBpc0dyYW1tYXJFbmNvdW50ZXJlZCA9IGZhbHNlOyAgICAKLSAgcHVibGljIGJvb2xlYW4gaXNEVERFbmNvdW50ZXJlZCA9IGZhbHNlOwotICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUVuY291bnRlcmVkID0gZmFsc2U7Ci0gIHB1YmxpYyBTdHJpbmcgc2NoZW1hTG9jYXRpb25TdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgaW50IG51bURUREVsZW1lbnRzID0gMDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdG9ySGVscGVyKCkKLSAgewotICB9Ci0gCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gWE1MIFJlYWRlci4KLSAgICogCi0gICAqIEByZXR1cm4gQW4gWE1MIFJlYWRlciBpZiBvbmUgY2FuIGJlIGNyZWF0ZWQgb3IgbnVsbC4KLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBYTUxSZWFkZXIgY3JlYXRlWE1MUmVhZGVyKFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24KLSAgeyAgICAgCi0gICAgWE1MUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgCi0gICAgcmVhZGVyID0gbmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKCk7ICAgICAKLSAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvbm9udmFsaWRhdGluZy9sb2FkLWV4dGVybmFsLWR0ZCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgTXlDb250ZW50SGFuZGxlcih1cmkpKTsKLSAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBJbnRlcm5hbEVycm9ySGFuZGxlcigpKTsgCi0KLSAgICBMZXhpY2FsSGFuZGxlciBsZXhpY2FsSGFuZGxlciA9IG5ldyBMZXhpY2FsSGFuZGxlcigpCi0gICAgeyAgICAgIAotICAgICAgcHVibGljIHZvaWQgc3RhcnREVEQgKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgIHsKLSAgICAgICAgaXNHcmFtbWFyRW5jb3VudGVyZWQgPSB0cnVlOyAgIAotICAgICAgICBpc0RUREVuY291bnRlcmVkID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBzdGFydEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZW5kQ0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0gCi0gICAgICBwdWJsaWMgdm9pZCBjb21tZW50IChjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotICAgIH07Ci0gICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiLCBsZXhpY2FsSGFuZGxlcik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICByZXR1cm4gcmVhZGVyOwotICB9ICAKLQotICAvKioKLSAgICogQW4gZXJyb3IgaGFuZGxlciB0byBzdXBwcmVzcyBlcnJvciBhbmQgd2FybmluZyBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByaXZhdGUgY2xhc3MgSW50ZXJuYWxFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAgewotCXB1YmxpYyBJbnRlcm5hbEVycm9ySGFuZGxlcigpCi0JewotCSAgc3VwZXIoKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLSAgfQotCi0gCi0gIC8qKgotICAgKiBGaWd1cmVzIG91dCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIGZvciB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgQSBoZWxwZXIgdG8gcmVzb2x2ZSBsb2NhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb21wdXRlVmFsaWRhdGlvbkluZm9ybWF0aW9uKFN0cmluZyB1cmksIFJlYWRlciBjaGFyYWN0ZXJTdHJlYW0sIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IGNyZWF0ZVhNTFJlYWRlcih1cmkpOyAgCi0gICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSh1cmkpOwotICAgICAgaW5wdXRTb3VyY2Uuc2V0Q2hhcmFjdGVyU3RyZWFtKGNoYXJhY3RlclN0cmVhbSk7Ci0gICAgICByZWFkZXIucGFyc2UoaW5wdXRTb3VyY2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgeyAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gIH0KLSAgCi0gCi0KLSAgLyoqCi0gICAqIEhhbmRsZSB0aGUgY29udGVudCB3aGlsZSBwYXJzaW5nIHRoZSBmaWxlLgotICAgKi8KLSAgY2xhc3MgTXlDb250ZW50SGFuZGxlciBleHRlbmRzIG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXIKLSAgeyAgICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBib29sZWFuIGlzUm9vdEVsZW1lbnQgPSB0cnVlOwotICAgIFN0cmluZyBiYXNlVVJJOwotICAgIAotICAgIE15Q29udGVudEhhbmRsZXIoU3RyaW5nIHVyaSkKLSAgICB7Ci0gICAgICB0aGlzLmJhc2VVUkkgPSB1cmk7ICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgfQotICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9ICAgIAotICAgICAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFVucHJlZml4ZWROYW1lKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4ZWROYW1lKFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDAgPyBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUgOiBsb2NhbE5hbWU7ICAgICAgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcmF3TmFtZSwgQXR0cmlidXRlcyBhdHRzKQotICAgIHsgICAgICAKLSAgICAgIC8vU3RyaW5nIGV4cGxpY2l0TG9jYXRpb24gPSBudWxsOwotICAgICAgaWYgKGlzUm9vdEVsZW1lbnQpCi0gICAgICB7ICAKLSAgICAgICAgCi0gICAgICAgIGlzUm9vdEVsZW1lbnQgPSBmYWxzZTsgIAotICAgICAgICBpbnQgbkF0dHMgPSBhdHRzLmdldExlbmd0aCgpOyAgICAKLSAgICAgICAgU3RyaW5nIHNjaGVtYUluc3RhbmNlUHJlZml4ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9MDsgaSA8IG5BdHRzOyBpKyspCi0gICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cy5nZXRRTmFtZShpKTsgICAgICAgCi0gICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJ4bWxucyIpIHx8IGF0dHJpYnV0ZU5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCA9IHRydWU7ICAgIAotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cy5nZXRWYWx1ZShpKTsgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cudzMub3JnLyIpICYmIHZhbHVlLmVuZHNXaXRoKCIvWE1MU2NoZW1hLWluc3RhbmNlIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzY2hlbWFJbnN0YW5jZVByZWZpeCA9IGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJ4bWxucyIpID8gIiIgOiBnZXRVbnByZWZpeGVkTmFtZShhdHRyaWJ1dGVOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIH0gICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KHJhd05hbWUpOwotICAgICAgICBTdHJpbmcgcm9vdEVsZW1lbnROYW1lc3BhY2VEZWNsYXJhdGlvbk5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyAieG1sbnM6IiArIHByZWZpeCA6ICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBTdHJpbmcgcm9vdEVsZW1lbnROYW1lc3BhY2UgPSByb290RWxlbWVudE5hbWVzcGFjZURlY2xhcmF0aW9uTmFtZSAhPSBudWxsID8gYXR0cy5nZXRWYWx1ZShyb290RWxlbWVudE5hbWVzcGFjZURlY2xhcmF0aW9uTmFtZSkgOiBudWxsOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLy8gZmlyc3Qgd2UgdXNlIGFueSAneHNpOnNjaGVtYUxvY2F0aW9uJyBvciAneHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24nIGF0dHJpYnV0ZQotICAgICAgICAvLyB0byBkZXRlcm1pbmUgYSBsb2NhdGlvbgotICAgICAgICBpZiAoc2NoZW1hSW5zdGFuY2VQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGxvY2F0aW9uID0gYXR0cy5nZXRWYWx1ZShnZXRQcmVmaXhlZE5hbWUoc2NoZW1hSW5zdGFuY2VQcmVmaXgsICJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAJU3RyaW5nIHNjaGVtYUxvYyA9IGF0dHMuZ2V0VmFsdWUoZ2V0UHJlZml4ZWROYW1lKHNjaGVtYUluc3RhbmNlUHJlZml4LCAic2NoZW1hTG9jYXRpb24iKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBsb2NhdGlvbiA9IGdldFNjaGVtYUxvY2F0aW9uRm9yTmFtZXNwYWNlKHNjaGVtYUxvYywgcm9vdEVsZW1lbnROYW1lc3BhY2UpOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAKLSAgICAgICAgaWYgKHJvb3RFbGVtZW50TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByb290RWxlbWVudE5hbWVzcGFjZSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlVVJJLCByb290RWxlbWVudE5hbWVzcGFjZSwgbG9jYXRpb24pOyAgICAKLSAgICAgICAgbG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKGJhc2VVUkksIHJvb3RFbGVtZW50TmFtZXNwYWNlLCBsb2NhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBsb2NhdGlvbiA9IFVSSUhlbHBlci5hZGRJbXBsaWVkRmlsZVByb3RvY29sKGxvY2F0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIHNjaGVtYUxvY2F0aW9uU3RyaW5nID0gbG9jYXRpb247Ci0gICAgICAgIAotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIGlzR3JhbW1hckVuY291bnRlcmVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAJLy8gRG8gbm90aGluZy4KLSAgICAgICAgICB9Ci0gICAgICAgICAgZmluYWxseQotICAgICAgICAgIHsKLSAgICAgICAgCWlmKGlzICE9IG51bGwpCi0gICAgICAgIAl7Ci0gICAgICAgIAkgIHRyeQotICAgICAgICAJICB7Ci0gICAgICAgIAkgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgCSAgfQotICAgICAgICAJICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgCSAgewotICAgICAgICAJCS8vIERvIG5vdGhpbmcuCi0gICAgICAgIAkgIH0KLSAgICAgICAgCX0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0gICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNlbGVtZW50RGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZWwpIAotICAgIHsKLSAgICAgIG51bURUREVsZW1lbnRzKys7Ci0gICAgfQotICAgIAotICAgIC8vIFRoZSB4c2lTY2hlbWFMb2NhdGlvblZhbHVlIGlzIGEgbGlzdCBvZiBuYW1lc3BhY2UvbG9jYXRpb24gcGFpcnMgdGhhdCBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgCi0gICAgLy8gdGhpcyBtZXRob2Qgd2Fsa3MgdGhlIGxpc3Qgb2YgcGFpcnMgbG9va2luZyBmb3IgdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UgYW5kIHJldHVybnMgdGhlIGFzc29jaWF0ZWQKLSAgICAvLyBsb2NhdGlvbi4KLSAgICAvLyAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb25Gb3JOYW1lc3BhY2UoU3RyaW5nIHhzaVNjaGVtYUxvY2F0aW9uVmFsdWUsIFN0cmluZyBuYW1lc3BhY2UpCi0gICAgeyAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoeHNpU2NoZW1hTG9jYXRpb25WYWx1ZSAhPSBudWxsICYmIG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgewotICAgICAgICAKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih4c2lTY2hlbWFMb2NhdGlvblZhbHVlKTsKLSAgICAgICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoc3QubmV4dFRva2VuKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAgICAKLSAgfSAgIAotICAgICAgIAotICAKLSAgLyoqCi0gICAqIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBpbiB0aGUgc3RyaW5nIG9mIHRoZSBvbGQgcGF0dGVybiB3aXRoIHRoZSBuZXcgcGF0dGVybi4KLSAgICogCi0gICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJucyBpbi4KLSAgICogQHBhcmFtIG9sZFBhdHRlcm4gVGhlIG9sZCBwYXR0ZXJuIHRvIHJlcGxhY2UuCi0gICAqIEBwYXJhbSBuZXdQYXR0ZXJuIFRoZSBwYXR0ZXJuIHVzZWQgZm9yIHJlcGxhY2VtZW50LgotICAgKiBAcmV0dXJuIFRoZSBtb2RpZmllZCBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyYW5jZXMgb2Ygb2xkUGF0dGVybiByZXBsYWNlZCBieSBuZXcgUGF0dGVybi4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIG9sZFBhdHRlcm4sIFN0cmluZyBuZXdQYXR0ZXJuKQotICB7ICAgICAKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBpbmRleCA9IHN0cmluZy5pbmRleE9mKG9sZFBhdHRlcm4sIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdQYXR0ZXJuICsgc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIG9sZFBhdHRlcm4ubGVuZ3RoKCkpOwotICAgICAgICBpbmRleCA9IGluZGV4ICsgb2xkUGF0dGVybi5sZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM1ZTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotCi0KLS8qKgotICogWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBpcyB1c2VkIHRvIHN0b3JlIHN0YXRlIGRhdGEgbmVlZGVkIGR1cmluZyBhbiBYTUwKLSAqIHZhbGlkYXRpb24gc2Vzc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIFhNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQgZXh0ZW5kcyBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0Ci17Ci0gIC8qKgotICAgKiBBIHNldCBvZiBpbmFjY2Vzc2libGUgbG9jYXRpb25zIFVSSXMgKFN0cmluZykuCi0gICAqLwotICBwcml2YXRlIEhhc2hTZXQgaW5hY2Nlc3NpYmxlTG9jYXRpb25VUklzID0gbmV3IEhhc2hTZXQoKTsKLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiBhIGxvY2F0aW9uIFVSSSB3YXMgbWFya2VkIGFzIGluYWNjZXNzaWJsZS4KLSAgICogCi0gICAqIEBwYXJhbSBsb2NhdGlvblVSSQotICAgKiAgICAgICAgICB0aGUgbG9jYXRpb24gVVJJIHRvIHRlc3QuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhIGxvY2F0aW9uIFVSSSB3YXMgbWFya2VkIGFzIGluYWNjZXNzaWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVUklNYXJrZWRJbmFjY2Vzc2libGUoU3RyaW5nIGxvY2F0aW9uVVJJKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uVVJJICE9IG51bGwgJiYgaW5hY2Nlc3NpYmxlTG9jYXRpb25VUklzLmNvbnRhaW5zKGxvY2F0aW9uVVJJKTsKLSAgfQotCi0gIC8qKgotICAgKiBNYXJrcyB0aGUgZ2l2ZW4gbG9jYXRpb24gVVJJIGFzIGluYWNjZXNzaWJsZS4KLSAgICogCi0gICAqIEBwYXJhbSBsb2NhdGlvblVSSQotICAgKiAgICAgICAgICB0aGUgbG9jYXRpb24gVVJJIHRvIG1hcmsgYXMgaW5hY2Nlc3NpYmxlLiBNdXN0IG5vdCBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIHZvaWQgbWFya1VSSUluYWNjZXNzaWJsZShTdHJpbmcgbG9jYXRpb25VUkkpCi0gIHsKLSAgICBpZiAobG9jYXRpb25VUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbmFjY2Vzc2libGVMb2NhdGlvblVSSXMuYWRkKGxvY2F0aW9uVVJJKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjAxYjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBBbiBYTUwgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIGFsbG93cyBzZXR0aW5nIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24KLSAqIGluZm9ybWF0aW9uIGZvciBhIFdUUCBYTUwgdmFsaWRhdGlvbiBydW4uIEFueSBmZWF0dXJlcyBhbmQgcHJvcGVydGllcwotICogc2V0IG9uIHRoaXMgY29uZmlndXJhdGlvbiBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggdGhvc2UgZnJvbQotICogcGFyc2VycyBzdWNoIGFzIFhlcmNlcy4gKFRoaXMgb2JqZWN0IGRvZXMgbm90IGJ5IGRlZmF1bHQgd3JhcCBmZWF0dXJlcwotICogYW5kIHByb3BlcnRpZXMgZnJvbSBzcGVjaWZpYyBwYXJzZXJzLikKLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uIAotewotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5fTk9fR1JBTU1BUiA9ICJXQVJOX05PX0dSQU1NQVIiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElORElDQVRFX05PX0dSQU1NQVIgPSAiSU5ESUNBVEVfTk9fR1JBTU1BUiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBib29sZWFuIHdhcm5fbm9fZ3JhbW1hcl92YWx1ZSA9IGZhbHNlOwotICBwcml2YXRlIGludCBpbmRpY2F0ZV9ub19ncmFtbWFyX3ZhbHVlID0gMTsKLSAgCi0gIC8qKgotICAgKiBTZXQgYSBmZWF0dXJlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgdG8gc2V0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogCQlUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgZmVhdHVyZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoV0FSTl9OT19HUkFNTUFSLmVxdWFscyhmZWF0dXJlKSkKLQkgIHdhcm5fbm9fZ3JhbW1hcl92YWx1ZSA9IHZhbHVlOwotCWVsc2UKLQkgIHRocm93IG5ldyBFeGNlcHRpb24oIkZlYXR1cmUgbm90IHJlY29nbml6ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCBhIGZlYXR1cmUgb2YgdGhpcyBjb25maWd1cmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogCQlUaGUgZmVhdHVyZSB0byBzZXQuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiAJCVRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBmZWF0dXJlLgotICAgKiBAdGhyb3dzIAotICAgKiAJCUFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBpbnQgdmFsdWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCWlmKElORElDQVRFX05PX0dSQU1NQVIuZXF1YWxzKGZlYXR1cmUpKQotCSAgaW5kaWNhdGVfbm9fZ3JhbW1hcl92YWx1ZSA9IHZhbHVlOwotCWVsc2UKLQkgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZlYXR1cmUgbm90IHJlY29nbml6ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGZlYXR1cmUuIElmIHRoZSBmZWF0dXJlIGlzIG5vdCBkZWZpbmVkCi0gICAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogCQlUaGUgZmVhdHVyZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIGZlYXR1cmUncyB2YWx1ZSwgdHJ1ZSBvciBmYWxzZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoV0FSTl9OT19HUkFNTUFSLmVxdWFscyhmZWF0dXJlKSkKLQkgIHJldHVybiB3YXJuX25vX2dyYW1tYXJfdmFsdWU7Ci0JCi0JdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gZmVhdHVyZS4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IGRlZmluZWQKLSAgICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiAJCVRoZSBmZWF0dXJlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgZmVhdHVyZSdzIHZhbHVlLCB0cnVlIG9yIGZhbHNlLgotICAgKiBAdGhyb3dzIAotICAgKiAJCUFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldEludEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCWlmKElORElDQVRFX05PX0dSQU1NQVIuZXF1YWxzKGZlYXR1cmUpKQotCSAgcmV0dXJuIGluZGljYXRlX25vX2dyYW1tYXJfdmFsdWU7Ci0JCi0JdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODhiYzQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcjsKLQotCi0vKioKLSAqIEEgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiBvYmplY3Qgc3BlY2lmaWMgdG8gWE1MIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uSW5mbyBleHRlbmRzIFZhbGlkYXRpb25JbmZvIGltcGxlbWVudHMgWE1MVmFsaWRhdGlvblJlcG9ydAotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBncmFtbWFyRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZHRkRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbmFtZXNwYWNlRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGludCBlbGVtZW50RGVjbENvdW50ID0gMDsKLSAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50RXJyb3JLZXk7Ci0gIHByb3RlY3RlZCBPYmplY3QgbWVzc2FnZUFyZ3VtZW50c1tdID0gbnVsbDsKLSAgcHJvdGVjdGVkIFhNTExvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0gIHByb3RlY3RlZCBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyIGVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIEEgc3RhY2sgb2Ygc3RhcnQgdGFnIGxvY2F0aW9ucywgdXNlZCB0byBtb3ZlIGVycm9ycwotICAgKiByZXBvcnRlZCBhdCB0aGUgY2xvc2UgdGFnIHRvIGJlIHJlcG9ydGVkIGF0IHRoZSBzdGFydCB0YWcuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RhY2sgc3RhcnRFbGVtZW50TG9jYXRpb25zID0gbmV3IFN0YWNrKCk7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhpcyByZXBvcnQgZGVzY3JpYmVzLgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25JbmZvKFN0cmluZyB1cmkpCi0gIHsKLSAgICBzdXBlcih1cmkpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0dyYW1tYXJFbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gZ3JhbW1hckVuY291bnRlcmVkOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHdoZXRoZXIgYSBncmFtbWFyIGhhcyBiZWVuIGVuY291bnRlcmVkIG9yIG5vdC4KLSAgICogCi0gICAqIEBwYXJhbSBncmFtbWFyRW5jb3VudGVyZWQgU2V0IHRydWUgaWYgYSBncmFtbWFyIGhhcyBiZWVuIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRHcmFtbWFyRW5jb3VudGVyZWQoYm9vbGVhbiBncmFtbWFyRW5jb3VudGVyZWQpCi0gIHsKLSAgICB0aGlzLmdyYW1tYXJFbmNvdW50ZXJlZCA9IGdyYW1tYXJFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQoKQotICB7Ci0gICAgcmV0dXJuIGR0ZEVuY291bnRlcmVkICYmIGVsZW1lbnREZWNsQ291bnQgPT0gMDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB3aGV0aGVyIGEgRFREIHdpdGhvdXQgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiB3YXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZHRkV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkIFNldCB0cnVlIGlmIGEgRFREIHdpdGhvdXQgYW4KLSAgICogICAgICAgICBlbGVtZW50IGRlY2xhcmF0aW9uIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RFRERW5jb3VudGVyZWQoYm9vbGVhbiBkdGRFbmNvdW50ZXJlZCkKLSAgewotICAgIHRoaXMuZHRkRW5jb3VudGVyZWQgPSBkdGRFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlRW5jb3VudGVyZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBhIG5hbWVzcGFjZSB3YXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlRW5jb3VudGVyZWQgU2V0IHRydWUgaWYgYSBuYW1lc3BhY2Ugd2FzIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VFbmNvdW50ZXJlZChib29sZWFuIG5hbWVzcGFjZUVuY291bnRlcmVkKQotICB7Ci0gICAgdGhpcy5uYW1lc3BhY2VFbmNvdW50ZXJlZCA9IG5hbWVzcGFjZUVuY291bnRlcmVkOwotICB9Ci0gIAotICAvKioKLSAgICogSW5jcmVhc2UgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gY291bnQgZm9yIERURCBlbGVtZW50cyBieSBvbmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbmNyZWFzZUVsZW1lbnREZWNsYXJhdGlvbkNvdW50KCkKLSAgewotICAgIHRoaXMuZWxlbWVudERlY2xDb3VudCsrOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBudW1iZXIgb2YgRFREIGVsZW1lbnRzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgRFREIGVsZW1lbnRzIGVuY291bnRlcmVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlY2xhcmF0aW9uQ291bnQoaW50IGNvdW50KQotICB7Ci0gIAllbGVtZW50RGVjbENvdW50ID0gY291bnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFhNTCBsb2NhdG9yIGlmIG9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBYTUwgbG9jYXRvciBpZiBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkIG9yIG51bGwuCi0gICAqLwotICBwdWJsaWMgWE1MTG9jYXRvciBnZXRYTUxMb2NhdG9yKCkKLSAgewotICAgIHJldHVybiBsb2NhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBYTUxMb2NhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGxvY2F0b3IgVGhlIFhNTExvY2F0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0WE1MTG9jYXRvcihYTUxMb2NhdG9yIGxvY2F0b3IpCi0gIHsKLSAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IGVycm9yIGtleS4KLSAgICogCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudEVycm9yS2V5LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50RXJyb3JLZXkoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRFcnJvcktleTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgY3VycmVudCBlcnJvciBrZXkuCi0gICAqIAotICAgKiBAcGFyYW0gY3VycmVudEVycm9yS2V5IFRoZSBjdXJyZW50RXJyb3JLZXkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3VycmVudEVycm9yS2V5KFN0cmluZyBjdXJyZW50RXJyb3JLZXkpCi0gIHsKLSAgICB0aGlzLmN1cnJlbnRFcnJvcktleSA9IGN1cnJlbnRFcnJvcktleTsKLSAgfQotCi1wdWJsaWMgT2JqZWN0W10gZ2V0TWVzc2FnZUFyZ3VtZW50cygpIHsKLQlyZXR1cm4gbWVzc2FnZUFyZ3VtZW50czsKLX0KLQotCi1wdWJsaWMgdm9pZCBzZXRNZXNzYWdlQXJndW1lbnRzKE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpIHsKLQl0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0YXJ0IGVsZW1lbnRzIGxvY2F0aW9ucy4KLSAgICogCi0gICAqIEByZXR1cm4gCi0gICAqIAkJQSBzdGFjayBjb250YWluaW5nIHRoZSBzdGFydCBlbGVtZW50IGxvY2F0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCBTdGFjayBnZXRTdGFydEVsZW1lbnRMb2NhdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIHN0YXJ0RWxlbWVudExvY2F0aW9uczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZXJyb3IgY3VzdG9taXphdGlvbiBtYW5hZ2VyIGZvciB0aGlzIHZhbGlkYXRpb24gcnVuLgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJVGhlIGVycm9yIGN1c3RvbWl6YXRpb24gbWFuYWdlciBmb3IgdGhpcyB2YWxpZGF0aW9uIHJ1bi4KLSAgICovCi0gIHByb3RlY3RlZCBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyIGdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKQotICB7Ci0JICBpZihlcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyID09IG51bGwpCi0JICB7Ci0JCSAgZXJyb3JDdXN0b21pemF0aW9uTWFuYWdlciA9IG5ldyBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCk7Ci0JICB9Ci0JICByZXR1cm4gZXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcjsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNVc2VYSW5jbHVkZSgpIHsKLQkgIHJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfWElOQ0xVREUpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkMDhkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBWYWxpZGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi54bWx2YWxpZGF0aW9uIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPQkxFTVNfVkFMSURBVElOR19VTktOT1dOX0hPU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfRklMRV9OT1RfRk9VTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTl9OT19HUkFNTUFSOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTFZhbGlkYXRpb25NZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxWYWxpZGF0aW9uTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblJlcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblJlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTRmMWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotCi0vKioKLSAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpb24gYSB2YWxpZGF0aW9uIHJlcG9ydCBmb3IgWE1MIHZhbGlkYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxWYWxpZGF0aW9uUmVwb3J0IGV4dGVuZHMgVmFsaWRhdGlvblJlcG9ydAotewotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBhIGdyYW1tYXIgd2FzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIGdyYW1tYXIgd2FzIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0dyYW1tYXJFbmNvdW50ZXJlZCgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBhIG5hbWVzcGFjZSB3YXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBuYW1lc3BhY2Ugd2FzIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUVuY291bnRlcmVkKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIGEgRFREIHdpdGhvdXQgZWxlbWVudCBkZWNsYXJhdGlvbnMgd2FzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIGEgRFREIHdpdGhvdXQgZWxlbWVudCBkZWNsYXJhdGlvbnMgd2FzIGVuY291bnRlcmVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMWY4ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBbMjA1OTg5XSAtIFt2YWxpZGF0aW9uXSB2YWxpZGF0ZSBYTUwgYWZ0ZXIgWEluY2x1ZGUgcmVzb2x1dGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFcnJvclJlcG9ydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmltcGwubXNnLlhNTE1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5YSW5jbHVkZUF3YXJlUGFyc2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkxhenlVUkxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGVyZm9ybXMgdmFsaWRhdGlvbiB1c2luZyBhIHhlcmNlcyBzYXggcGFyc2VyLiAgCi0gKiBIZXJlJ3MgYSBxdWljayBvdmVydmlldyBvZiB0aGUgZGV0YWlscyA6IAotICogICAtIGFuIEVycm9ySGFuZGxlciBpcyB1c2VkIHRvIGNvbGxlY3QgZXJyb3JzIGludG8gYSBsaXN0IChzbyB0aGV5IG1heSBiZSBkaXNwbGF5ZWQgYnkgdGhlIFVJKQotICogICAtIGFuIEVudGl0eVJlc29sdmVyIGlzIHVzZWQgYWxvbmcgd2l0aCB0aGUgeGVyY2VzICJleHRlcm5hbC1zY2hlbWFMb2NhdGlvbiIgcHJvcGVydHkgdG8gaW1wbGVtZW50IFhNTCBDYXRhbG9nIHN1cHBvcnQKLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGluZ29yZWRFcnJvcktleVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICBwcm90ZWN0ZWQgU2V0IGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQgPSBuZXcgVHJlZVNldCgpOwotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9BTFdBWVMgPSAiSUdOT1JFX0FMV0FZUyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX0lGX0RURF9XSVRIT1VUX0VMRU1FTlRfREVDTCA9ICJJR05PUkVfSUZfRFREX1dJVEhPVVRfRUxFTUVOVF9ERUNMIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVNQVRVUkVfRU9GID0gIlByZW1hdHVyZUVPRiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9FTEVNRU5UX1RZUEVfTVVTVF9NQVRDSF9ET0NUWVBFREVDTCA9ICJSb290RWxlbWVudFR5cGVNdXN0TWF0Y2hEb2N0eXBlZGVjbCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0VMRU1FTlRfTk9UX0RFQ0xBUkVEID0gIk1TR19FTEVNRU5UX05PVF9ERUNMQVJFRCI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIC8vIFdUUCBYTUwgdmFsaWRhdG9yIHNwZWNpZmljIGtleS4KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fR1JBTU1BUl9GT1VORCA9ICJOT19HUkFNTUFSX0ZPVU5EIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTk9UX0ZPVU5EX0tFWSA9ICJGSUxFX05PVF9GT1VORCI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdG9yKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gSGVyZSB3ZSBhZGQgc29tZSBlcnJvciBrZXlzIHRoYXQgd2UgbmVlZCB0byBmaWx0ZXIgb3V0IHdoZW4gd2UncmUgdmFsaWRhdGlvbiAKLSAgICAvLyBhZ2FpbnN0IGEgRFREIHdpdGhvdXQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb25zLiAgICAgICAKLSAgICBpbmdvcmVkRXJyb3JLZXlUYWJsZS5wdXQoUFJFTUFUVVJFX0VPRiwgSUdOT1JFX0FMV0FZUyk7Ci0gICAgaW5nb3JlZEVycm9yS2V5VGFibGUucHV0KFJPT1RfRUxFTUVOVF9UWVBFX01VU1RfTUFUQ0hfRE9DVFlQRURFQ0wsIElHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wpOwotICAgIGluZ29yZWRFcnJvcktleVRhYmxlLnB1dChNU0dfRUxFTUVOVF9OT1RfREVDTEFSRUQsIElHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wpOwotICAgIAotICAgIC8vIEhlcmUgd2UgYWRkIHNvbWUgZXJyb3Iga2V5cyB0aGF0IHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IuCi0gICAgLy8gVGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRqdXN0ZWQgdG8gcGxhY2UgdGhlIG1lc3NhZ2Ugb24gdGhlIGxpbmUgb2YgdGhlIHN0YXJ0aW5nCi0gICAgLy8gZWxlbWVudCBpbnN0ZWFkIG9mIG9uIHRoZSBsaW5lIG9mIHRoZSBjbG9zaW5nIGVsZW1lbnQuCi0gICAgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5hZGQoIk1TR19DT05URU5UX0lOVkFMSUQiKTsKLSAgICBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmFkZCgiTVNHX0NPTlRFTlRfSU5DT01QTEVURSIpOwotICAgIGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQuYWRkKCJjdmMtY29tcGxleC10eXBlLjIuNC5iIik7Ci0gICAgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5hZGQoImN2Yy1jb21wbGV4LXR5cGUuMi4zIik7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBVUkkgUmVzb2x2ZXIgdG8gdXNlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaVJlc29sdmVyIFRoZSBVUkkgUmVzb2x2ZXIgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpCi0gIHsKLSAgICB0aGlzLnVyaVJlc29sdmVyID0gdXJpUmVzb2x2ZXI7Ci0gICAgLy9lbnRpdHlSZXNvbHZlciA9IG5ldyBNeUVudGl0eVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLSAgfQotCi0gCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gWE1MIFJlYWRlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgWE1MIHJlYWRlciBvciBudWxsIGlmIHVuc3VjY2Vzc2Z1bC4KLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBYTUxSZWFkZXIgY3JlYXRlWE1MUmVhZGVyKGZpbmFsIFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8sIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsgICAgIAotICAgIFhNTFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgIC8vIG1vdmUgdG8gWGVyY2VzLTIuLi4gYWRkIHRoZSBjb250ZXh0Q2xhc3NMb2FkZXIgc3R1ZmYKLSAgICBDbGFzc0xvYWRlciBwcmV2Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uKHZhbGluZm8pOwotICAgICAgcmVhZGVyID0gbmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKGNvbmZpZ3VyYXRpb24pCi0gICAgICB7Ci0gICAgCXByaXZhdGUgWE1MTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLSAgICAJCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkFic3RyYWN0U0FYUGFyc2VyI3N0YXJ0RG9jdW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3IsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5OYW1lc3BhY2VDb250ZXh0LCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9ucykKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3IgdGhlTG9jYXRvciwgamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZywgTmFtZXNwYWNlQ29udGV4dCBuc2NvbnRleHQsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zIGF1Z3MpIAotICAgICAgICB7Ci0gICAgICAgICAgbG9jYXRvciA9IHRoZUxvY2F0b3I7Ci0gICAgICAgICAgdmFsaW5mby5zZXRYTUxMb2NhdG9yKHRoZUxvY2F0b3IpOwotICAgICAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQodGhlTG9jYXRvciwgZW5jb2RpbmcsIG5zY29udGV4dCwgYXVncyk7IAotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuQWJzdHJhY3RTQVhQYXJzZXIjc3RhcnRFbGVtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5RTmFtZSwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTEF0dHJpYnV0ZXMsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFFOYW1lIGFyZzAsIFhNTEF0dHJpYnV0ZXMgYXJnMSwgQXVnbWVudGF0aW9ucyBhcmcyKSB0aHJvd3MgWE5JRXhjZXB0aW9uIAotICAgICAgICB7Ci0gICAgICAgICAgdmFsaW5mby5nZXRTdGFydEVsZW1lbnRMb2NhdGlvbnMoKS5wdXNoKG5ldyBMb2NhdGlvbkNvb3JkaW5hdGUobG9jYXRvci5nZXRMaW5lTnVtYmVyKCksIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKLQkJICBzdXBlci5zdGFydEVsZW1lbnQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JCX0KLSAgICAgICAgCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkFic3RyYWN0U0FYUGFyc2VyI2VuZEVsZW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9ucykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoUU5hbWUgYXJnMCwgQXVnbWVudGF0aW9ucyBhcmcxKSB0aHJvd3MgWE5JRXhjZXB0aW9uIHsKLQkJCXN1cGVyLmVuZEVsZW1lbnQoYXJnMCwgYXJnMSk7Ci0JCQl2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnBvcCgpOwotCQl9Ci0gICAgICB9OwotCi0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHZhbGluZm8uaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdmFsaW5mby5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpOyAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIsIHZhbGluZm8uaXNHcmFtbWFyRW5jb3VudGVyZWQoKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIiwgdmFsaW5mby5pc0dyYW1tYXJFbmNvdW50ZXJlZCgpKTsgLy8kTk9OLU5MUy0xJAotICAgCSAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy94aW5jbHVkZSIsIHZhbGluZm8uaXNVc2VYSW5jbHVkZSgpKTsgLy8kTk9OLU5MUy0xJCAgICAgIAotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBEZWZhdWx0SGFuZGxlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgdmFsaW5mby5nZXRFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCkuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgdmFsaW5mby5nZXRFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCkuZW5kRWxlbWVudCh1cmksIGxvY2FsTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOyAgICAgIAotICAgICAgCi0gICAgICAvLyBNSCBtYWtlIHN1cmUgdmFsaWRhdGlvbiB3b3JrcyBldmVuIHdoZW4gYSBjdXN0b21lciBlbnRpdHlSZXNvbHZlciBpcyBub3RlIHNldCAoaS5lLiB2aWEgc2V0VVJJUmVzb2x2ZXIoKSkKLSAgICAgIGlmIChlbnRpdHlSZXNvbHZlciAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvaW50ZXJuYWwvZW50aXR5LXJlc29sdmVyIiwgZW50aXR5UmVzb2x2ZXIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9ICAKLSAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIG5ldyBNeURlY2xIYW5kbGVyKCkpOyAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICB9IAotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsgCi0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIocHJldkNsYXNzTG9hZGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlYWRlcjsKLSAgfSAgCi0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIGxvY2F0ZWQgYXQgdGhlIGdpdmVuIFVSSS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGFuIFhNTCB2YWxpZGF0aW9uIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdGUodXJpLCBudWxsLCBuZXcgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKSk7ICAKLSAgfQotCi0gIGZpbmFsIFN0cmluZyBjcmVhdGVTdHJpbmdGb3JJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgewotICAgIC8vIEhlcmUgd2UgYXJlIHJlYWRpbmcgdGhlIGZpbGUgYW5kIHN0b3JpbmcgdG8gYSBzdHJpbmdidWZmZXIuCi0gICAgU3RyaW5nQnVmZmVyIGZpbGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaW5wdXRSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0sICJVVEYtOCIpOwotICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlucHV0UmVhZGVyKTsKLSAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzEwMjRdOwotICAgICAgaW50IG51bWJlclJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0gICAgICB3aGlsZSAobnVtYmVyUmVhZCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgZmlsZVN0cmluZy5hcHBlbmQoY2hhcnMsIDAsIG51bWJlclJlYWQpOwotICAgICAgICBudW1iZXJSZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9UT0RPOiBsb2cgZXJyb3IgbWVzc2FnZQotICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gZmlsZVN0cmluZy50b1N0cmluZygpOwotICB9Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgaW5wdXRTdHJlYW0KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHRoZSBpbnB1dFN0cmVhbSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcmV0dXJuIFJldHVybnMgYW4gWE1MIHZhbGlkYXRpb24gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLQlyZXR1cm4gdmFsaWRhdGUodXJpLCBpbnB1dFN0cmVhbSwgbmV3IFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCkpOwotICB9Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgaW5wdXRTdHJlYW0KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgCi0gICAqIAkJVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtCi0gICAqIAkJVGhlIGlucHV0U3RyZWFtIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlCi0gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAqIAkJQSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZhbGlkYXRpb24gc2Vzc2lvbi4KLSAgICogQHJldHVybiAKLSAgICogCQlSZXR1cm5zIGFuIFhNTCB2YWxpZGF0aW9uIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgaW5wdXRTdHJlYW0sIGNvbmZpZ3VyYXRpb24sIG51bGwpOyAgCi0gIH0KLSAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBpbnB1dFN0cmVhbQotICAgKiAKLSAgICogQHBhcmFtIHVyaSAKLSAgICogICAgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtCi0gICAqICAgIFRoZSBpbnB1dFN0cmVhbSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgKiAgICBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmFsaWRhdGlvbiBzZXNzaW9uLgotICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAqICAgIFRoZSB2YWxpZGF0aW9uIHJlc3VsdAotICAgKiBAcmV0dXJuIAotICAgKiAgICBSZXR1cm5zIGFuIFhNTCB2YWxpZGF0aW9uIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCkKLSAgewotCSAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgaW5wdXRTdHJlYW0sIGNvbmZpZ3VyYXRpb24sIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGlucHV0U3RyZWFtCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIAotICAgKiAgICBUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gaW5wdXRzdHJlYW0KLSAgICogICAgVGhlIGlucHV0U3RyZWFtIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlCi0gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAqICAgIEEgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB2YWxpZGF0aW9uIHNlc3Npb24uCi0gICAqIEBwYXJhbSByZXN1bHQKLSAgICogICAgVGhlIHZhbGlkYXRpb24gcmVzdWx0Ci0gICAqIEBwYXJhbSBjb250ZXh0Ci0gICAqICAgIFRoZSB2YWxpZGF0aW9uIGNvbnRleHQgICAKLSAgICogQHJldHVybiAKLSAgICogICAgUmV0dXJucyBhbiBYTUwgdmFsaWRhdGlvbiByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgVmFsaWRhdGlvblJlc3VsdCByZXN1bHQsIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgewotICAgIFN0cmluZyBncmFtbWFyRmlsZSA9ICIiOwotICAgIFJlYWRlciByZWFkZXIxID0gbnVsbDsgLy8gVXNlZCBmb3IgdGhlIHByZXBhcnNlLgotICAgIFJlYWRlciByZWFkZXIyID0gbnVsbDsgLy8gVXNlZCBmb3IgdmFsaWRhdGlvbiBwYXJzZS4KLSAgICAKLSAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIFN0cmluZyBzdHJpbmcgPSBjcmVhdGVTdHJpbmdGb3JJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0gICAgICByZWFkZXIxID0gbmV3IFN0cmluZ1JlYWRlcihzdHJpbmcpOwotICAgICAgcmVhZGVyMiA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyaW5nKTsKLSAgICB9IAotICAgICAgICAKLSAgICBYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvID0gbmV3IFhNTFZhbGlkYXRpb25JbmZvKHVyaSk7Ci0gICAgTXlFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IG5ldyBNeUVudGl0eVJlc29sdmVyKHVyaVJlc29sdmVyLCBjb250ZXh0KTsgCi0gICAgVmFsaWRhdG9ySGVscGVyIGhlbHBlciA9IG5ldyBWYWxpZGF0b3JIZWxwZXIoKTsgCi0gICAgdHJ5Ci0gICAgeyAgCi0gICAgICAgIGhlbHBlci5jb21wdXRlVmFsaWRhdGlvbkluZm9ybWF0aW9uKHVyaSwgcmVhZGVyMSwgdXJpUmVzb2x2ZXIpOwotICAgICAgICB2YWxpbmZvLnNldERUREVuY291bnRlcmVkKGhlbHBlci5pc0RUREVuY291bnRlcmVkKTsKLSAgICAgICAgdmFsaW5mby5zZXRFbGVtZW50RGVjbGFyYXRpb25Db3VudChoZWxwZXIubnVtRFRERWxlbWVudHMpOwotICAgICAgICB2YWxpbmZvLnNldE5hbWVzcGFjZUVuY291bnRlcmVkKGhlbHBlci5pc05hbWVzcGFjZUVuY291bnRlcmVkKTsKLSAgICAgICAgdmFsaW5mby5zZXRHcmFtbWFyRW5jb3VudGVyZWQoaGVscGVyLmlzR3JhbW1hckVuY291bnRlcmVkKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBjcmVhdGVYTUxSZWFkZXIodmFsaW5mbywgZW50aXR5UmVzb2x2ZXIpOwotICAgICAgICBYTUxFcnJvckhhbmRsZXIgZXJyb3JoYW5kbGVyID0gbmV3IFhNTEVycm9ySGFuZGxlcih2YWxpbmZvKTsKLSAgICAgICAgcmVhZGVyLnNldEVycm9ySGFuZGxlcihlcnJvcmhhbmRsZXIpOwotICAgICAgICAKLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLSAgICAgICAgaW5wdXRTb3VyY2Uuc2V0Q2hhcmFjdGVyU3RyZWFtKHJlYWRlcjIpOwotICAgICAgICByZWFkZXIucGFyc2UoaW5wdXRTb3VyY2UpOyAgIAotICAgICAgICBpZihjb25maWd1cmF0aW9uLmdldEludEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSU5ESUNBVEVfTk9fR1JBTU1BUikgPiAwICYmIAotICAgICAgICAJCXZhbGluZm8uaXNWYWxpZCgpICYmICFoZWxwZXIuaXNHcmFtbWFyRW5jb3VudGVyZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZihjb25maWd1cmF0aW9uLmdldEludEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSU5ESUNBVEVfTk9fR1JBTU1BUikgPT0gMSkKLSAgICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1dBUk5fTk9fR1JBTU1BUiwgMSwgMCwgdXJpLCBOT19HUkFNTUFSX0ZPVU5ELCBudWxsKTsKLSAgICAgICAgICBlbHNlIC8vIDIKLSAgICAgICAgICAgICAgdmFsaW5mby5hZGRFcnJvcihYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1dBUk5fTk9fR1JBTU1BUiwgMSwgMCwgdXJpLCBOT19HUkFNTUFSX0ZPVU5ELCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWxwZXIuaXNEVERFbmNvdW50ZXJlZCkKLSAgICAgICAgICBncmFtbWFyRmlsZSA9IGVudGl0eVJlc29sdmVyLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBncmFtbWFyRmlsZSA9IGhlbHBlci5zY2hlbWFMb2NhdGlvblN0cmluZzsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIHNheFBhcnNlRXhjZXB0aW9uKQotICAgIHsKLSAgICAgIC8vIFRoZXNlIGVycm9ycyBhcmUgY2F1Z2h0IGJ5IHRoZSBlcnJvciBoYW5kbGVyLgotICAgICAgLy9hZGRWYWxpZGF0aW9uTWVzc2FnZSh2YWxpbmZvLCBzYXhQYXJzZUV4Y2VwdGlvbik7Ci0gICAgfSAgICAgICAgICAgICAgICAgCi0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uKQotICAgIHsKLSAgICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKHZhbGluZm8sIGlvRXhjZXB0aW9uKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7ICAKLSAgICAJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24pOwotICAgIH0KLQotICAgIC8vIE5vdyBzZXQgdXAgdGhlIGRlcGVuZGVuY2llcwotICAgIC8vIFdyYXAgd2l0aCB0cnkgY2F0Y2ggc28gdGhhdCBpZiBzb21ldGhpbmcgd3JvbmcgaGFwcGVucywgdmFsaWRhdGlvbiBjYW4KLSAgICAvLyBzdGlsbCBwcm9jZWVkIGFzIGJlZm9yZQotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0V29ya3NwYWNlRmlsZUZyb21Mb2NhdGlvbihncmFtbWFyRmlsZSk7Ci0gICAgICAgIEFycmF5TGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICAgICAgICByZXN1bHQuc2V0RGVwZW5kc09uKChJUmVzb3VyY2UgW10pcmVzb3VyY2VzLnRvQXJyYXkobmV3IElSZXNvdXJjZSBbMF0pKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB2YWxpbmZvOwotICAgICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byBhZGQgdGhlIGVycm9yIHRvLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8sIElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgeyAKLSAgICBTdHJpbmcgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBleGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotCVRocm93YWJsZSBjYXVzZSA9IGV4Y2VwdGlvbi5nZXRDYXVzZSgpICE9IG51bGwgPyBleGNlcHRpb24uZ2V0Q2F1c2UoKSA6IGV4Y2VwdGlvbjsKLQl3aGlsZSh2YWxpZGF0aW9uTWVzc2FnZVN0ciA9PSBudWxsICYmIGNhdXNlICE9IG51bGwpewotCQlTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSA9IGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkgICAgY2F1c2UgPSBjYXVzZS5nZXRDYXVzZSgpOwotCSAgICBpZihjYXVzZSA9PSBudWxsICYmIGxvY2FsaXplZE1lc3NhZ2UgIT0gbnVsbCApCi0JICAgIHsKLQkgICAgICB2YWxpZGF0aW9uTWVzc2FnZVN0ciA9IGxvY2FsaXplZE1lc3NhZ2U7Ci0JICAgIH0KLQl9Ci0JCi0JaWYgKHZhbGlkYXRpb25NZXNzYWdlU3RyICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKQotICAgICAgewotICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZVN0ciA9IE5MUy5iaW5kKFhNTFZhbGlkYXRpb25NZXNzYWdlcy5fVUlfUFJPQkxFTVNfVkFMSURBVElOR19GSUxFX05PVF9GT1VORCwgbmV3IE9iamVjdCBbXSB7IHZhbGlkYXRpb25NZXNzYWdlU3RyIH0pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAJdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBOTFMuYmluZChYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfVU5LTk9XTl9IT1NULCBuZXcgT2JqZWN0IFtdIHsgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgfSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKGNhdXNlIGluc3RhbmNlb2YgQ29ubmVjdEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAJdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2VTdHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYTUxMb2NhdG9yIGxvY2F0b3IgPSB2YWxpbmZvLmdldFhNTExvY2F0b3IoKTsKLSAgICAgIHZhbGluZm8uYWRkV2FybmluZyh2YWxpZGF0aW9uTWVzc2FnZVN0ciwgbG9jYXRvciAhPSBudWxsID8gbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgOiAxLCBsb2NhdG9yICE9IG51bGwgPyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpIDogMCwgdmFsaW5mby5nZXRGaWxlVVJJKCksIEZJTEVfTk9UX0ZPVU5EX0tFWSwgbnVsbCk7Ci0gICAgfQotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRvIGFkZCB0aGUgZXJyb3IgdG8uCi0gICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbywgU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKQotICB7IAotICAgIGlmIChleGNlcHRpb24uZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgeyAKLSAgICAgIHZhbGluZm8uYWRkRXJyb3IoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBleGNlcHRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0gICAgfQotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBBIGN1c3RvbSBlbnRpdHkgcmVzb2x2ZXIgdGhhdCB1c2VzIHRoZSBVUkkgcmVzb2x2ZXIgc3BlY2lmaWVkIHRvIHJlc29sdmUgZW50aXRpZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTXlFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyIAotICB7Ci0gICAgcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlSZXNvbHZlcjsKLSAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlZERURExvY2F0aW9uOwotICAgIHByaXZhdGUgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0OwotICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVJlc29sdmVyIFRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlIHdpdGggdGhpcyBlbnRpdHkgcmVzb2x2ZXIuCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIFhNTCB2YWxpZGF0b3IgY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXlFbnRpdHlSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlciwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgIHRoaXMudXJpUmVzb2x2ZXIgPSB1cmlSZXNvbHZlcjsKLSAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByaWQpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYTUxJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IF9pbnRlcm5hbFJlc29sdmVFbnRpdHkodXJpUmVzb2x2ZXIsIHJpZCwgY29udGV4dCk7Ci0gICAgICAgIGlmIChpbnB1dFNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZWREVERMb2NhdGlvbiA9IGlucHV0U291cmNlLmdldFN5c3RlbUlkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlucHV0U291cmNlOwotICAgIH0KLSAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiByZXNvbHZlZERURExvY2F0aW9uOwotICAgIH0KLSAgfQotICAKLSAgLy8gY3MgOiBJJ3ZlIHJlZmFjdG9yZWQgdGhlIGNvbW1vbiBTQVggYmFzZWQgcmVzb2x1dGlvbiBjb2RlIGludG8gdGhpcyBtZXRob2QgZm9yIHVzZSBieSBvdGhlciB2YWxpZGF0b3JzIAotICAvLyAoaS5lLiBYTUwgU2NoZW1hLCBXU0RMIGV0YykuICAgVGhlIG90aGVyIGFwcHJvYWNoIGlzIG1haW50YWluIGEgY29weSBmb3IgZWFjaCB2YWxpZGF0b3IgdGhhdCBoYXMKLSAgLy8gaWRlbnRpY2FsIGNvZGUuICBJbiBhbnkgY2FzZSB3ZSBzaG91bGQgc3RyaXZlIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWxpZGF0b3JzIHBlcmZvcm0gcmVzb2x1dGlvbiBjb25zaXN0ZW50bHkuIAotICBwdWJsaWMgc3RhdGljIFhNTElucHV0U291cmNlIF9pbnRlcm5hbFJlc29sdmVFbnRpdHkoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIsIFhNTFJlc291cmNlSWRlbnRpZmllciByaWQpIHRocm93cyAgSU9FeGNlcHRpb24KLSAgewotICAgIHJldHVybiBfaW50ZXJuYWxSZXNvbHZlRW50aXR5KHVyaVJlc29sdmVyLCByaWQsIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFhNTElucHV0U291cmNlIF9pbnRlcm5hbFJlc29sdmVFbnRpdHkoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIsIFhNTFJlc291cmNlSWRlbnRpZmllciByaWQsIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzICBJT0V4Y2VwdGlvbgotICB7Ci0gICAgWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotICAgIAotICAgIGlmICh1cmlSZXNvbHZlciAhPSBudWxsKQotICAgIHsgICAgICAgICAKLSAgICAgIFN0cmluZyBpZCA9IHJpZC5nZXRQdWJsaWNJZCgpOwotICAgICAgaWYoaWQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWQgPSByaWQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaWQgIT0gbnVsbCB8fCByaWQuZ2V0TGl0ZXJhbFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBsb2NhdGlvbiA9IHVyaVJlc29sdmVyLnJlc29sdmUocmlkLmdldEJhc2VTeXN0ZW1JZCgpLCBpZCwgcmlkLmdldExpdGVyYWxTeXN0ZW1JZCgpKTsKLSAgICAgIH0gIAotICAgICAgCi0gICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBoeXNpY2FsID0gdXJpUmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24ocmlkLmdldEJhc2VTeXN0ZW1JZCgpLCBpZCwgbG9jYXRpb24pOwotCi0gICAgICAgIC8vIGlmIHBoeXNpY2FsIGlzIGFscmVhZHkgYSBrbm93biBiYWQgdXJpLCBqdXN0IGdvIGFoZWFkIGFuZCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBYTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCB4bWxDb250ZXh0ID0gKChYTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0KWNvbnRleHQpOwotCi0gICAgICAgICAgaWYgKHhtbENvbnRleHQuaXNVUklNYXJrZWRJbmFjY2Vzc2libGUocGh5c2ljYWwpKQotICAgICAgICAgIHsKLSAgICAgICAgCSB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHBoeXNpY2FsKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlzID0gbmV3IFhNTElucHV0U291cmNlKHJpZC5nZXRQdWJsaWNJZCgpLCBsb2NhdGlvbiwgbG9jYXRpb24pOwotICAgICAgICAKLSAgICAgICAgLy8gVGhpcyBibG9jayBjaGVja3MgdGhhdCB0aGUgZmlsZSBleGlzdHMuIElmIGl0IGRvZXNuJ3Qgd2UgbmVlZCB0byB0aHJvdwotICAgICAgICAvLyBhbiBleGNlcHRpb24gc28gWGVyY2VzIHdpbGwgcmVwb3J0IGFuIGVycm9yLiBub3RlOiBUaGlzIG1heSBub3QgYmUKLSAgICAgICAgLy8gbmVjZXNzYXJ5IHdpdGggYWxsIHZlcnNpb25zIG9mIFhlcmNlcyBidXQgaGFzIHNwZWNpZmljYWxseSBiZWVuIAotICAgICAgICAvLyBleHBlcmllbmNlZCB3aXRoIHRoZSB2ZXJzaW9uIGluY2x1ZGVkIGluIElCTSdzIDEuNC4yIEpESy4KLSAgICAgICAgSW5wdXRTdHJlYW0gaXNUZW1wID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpc1RlbXAgPSBuZXcgVVJMKHBoeXNpY2FsKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBwaHlzaWNhbCB3YXMgYSBiYWQgdXJsLCBzbyBjYWNoZSBpdCBzbyB3ZSBrbm93IG5leHQgdGltZQotICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYTUxOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IHhtbENvbnRleHQgPSAoKFhNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQpY29udGV4dCk7Ci0gICAgICAgICAgICB4bWxDb250ZXh0Lm1hcmtVUklJbmFjY2Vzc2libGUocGh5c2ljYWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmKGlzVGVtcCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVGVtcC5jbG9zZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpcy5zZXRCeXRlU3RyZWFtKG5ldyBMYXp5VVJMSW5wdXRTdHJlYW0ocGh5c2ljYWwpKTsgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlzOyAgICAKLSAgfSAgICAgIAotICAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGhhbmRsZXIgdG8gY2F0Y2ggZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYTUxFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgRVJST1IgPSAwOwotICAgIHByaXZhdGUgZmluYWwgaW50IFdBUk5JTkcgPSAxOwotICAgIHByaXZhdGUgWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgWE1MIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHVibGljIFhNTEVycm9ySGFuZGxlcihYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICAgIHsKLSAgICAgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uLCBpbnQgc2V2ZXJpdHkpCi0gICAgewotICAgICAgaWYoZXhjZXB0aW9uLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgCQotICAgIAlpbnQgbGluZU51bWJlciA9IGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgCWludCBjb2x1bW5OdW1iZXIgPSBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgCQotICAgIAkvLyBGb3IgdGhlIGZvbGxvd2luZyB0aHJlZSBlcnJvcnMgdGhlIGxpbmUgbnVtYmVyIHdpbGwgYmUgbW9kaWZpZWQgdG8gdXNlIHRoYXQgb2YgdGhlIHN0YXJ0Ci0gICAgCS8vIHRhZyBpbnN0ZWFkIG9mIHRoZSBlbmQgdGFnLgotICAgIAlTdHJpbmcgY3VycmVudEVycm9yS2V5ID0gdmFsaW5mby5jdXJyZW50RXJyb3JLZXk7Ci0gICAgCWlmIChjdXJyZW50RXJyb3JLZXkgIT0gbnVsbCAmJiBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmNvbnRhaW5zKGN1cnJlbnRFcnJvcktleSkpICAKLSAgICAJewotICAgIAkgIExvY2F0aW9uQ29vcmRpbmF0ZSBhZGp1c3RlZENvb3JkaW5hdGVzID0gKExvY2F0aW9uQ29vcmRpbmF0ZSl2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnBlZWsoKTsKLSAgICAJICBsaW5lTnVtYmVyID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgCSAgY29sdW1uTnVtYmVyID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRDb2x1bW5OdW1uZXIoKTsKLSAgICAJfQotICAgIAkKLSAgICAgICAgaWYoc2V2ZXJpdHkgPT0gV0FSTklORykKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmFkZEVycm9yKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlciwgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCksIHZhbGluZm8uZ2V0Q3VycmVudEVycm9yS2V5KCksIHZhbGluZm8uZ2V0TWVzc2FnZUFyZ3VtZW50cygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKGV4Y2VwdGlvbiwgRVJST1IpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoZXhjZXB0aW9uLCBXQVJOSU5HKTsKLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiAKLSAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvdW50IHRoZSBlbGVtZW50RGVjbHMgdGhhdCBhcmUgZW5jb3VudGVyZWQgaW4gYSBEVEQuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTXlEZWNsSGFuZGxlciBpbXBsZW1lbnRzIERlY2xIYW5kbGVyIAotICB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbGluZm8gVGhlIFhNTFZhbGlkYXRpb25JbmZvIG9iamVjdCB0aGF0IHdpbGwgY291bnQgdGhlIGRlY2xhcmF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXlEZWNsSGFuZGxlcigpCi0gICAgewotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjYXR0cmlidXRlRGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZURlY2woU3RyaW5nIGVOYW1lLCBTdHJpbmcgYU5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWVEZWZhdWx0LCBTdHJpbmcgdmFsdWUpIAotICAgIHsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZWxlbWVudERlY2woamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSAKLSAgICB7Ci0gICAgICAvL3ZhbGluZm8uaW5jcmVhc2VFbGVtZW50RGVjbGFyYXRpb25Db3VudCgpOwotICAgIH0KLSAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2V4dGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4dGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIAotICAgIHsKLSAgICB9ICAgICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjaW50ZXJuYWxFbnRpdHlEZWNsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIAotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQSBYSW5jbHVkZUF3YXJlUGFyc2VyQ29uZmlndXJhdGlvbiB0aGF0IGNyZWF0ZXMgYW4gZXJyb3IgcmVwb3J0ZXIgd2hpY2ggY2FuIGlnbm9yZQotICAgKiBEVEQgZXJyb3IgbWVzc2FnZXMgZm9yIERURCdzIHdpdGggbm8gZWxlbWVudHMgZGVmaW5lZC4KLSAgICovCi0KLSAgcHJvdGVjdGVkIGNsYXNzIE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgWEluY2x1ZGVBd2FyZVBhcnNlckNvbmZpZ3VyYXRpb24KLSAgewotICAJWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG51bGw7Ci0gICAgTGlzdCByZXBvcnRlZEV4Y2VwdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7IAotICAJCi0gIAkvKioKLSAgCSAqIENvbnN0cnVjdG9yLgotICAJICogCi0gIAkgKiBAcGFyYW0gdmFsaW5mbyBUaGUgWE1MVmFsaWRhdGlvbkluZm8gb2JqZWN0IHRvIHVzZS4KLSAgCSAqLwotICAJcHVibGljIE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uKFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8pCi0gIAl7Ci0gIAkgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gIAkgIAotICAJICBYTUxFcnJvclJlcG9ydGVyIGVycm9yUmVwb3J0ZXIgPSBjcmVhdGVFcnJvclJlcG9ydGVyKCk7Ci0gICAgICBpZiAoZXJyb3JSZXBvcnRlci5nZXRNZXNzYWdlRm9ybWF0dGVyKFhNTE1lc3NhZ2VGb3JtYXR0ZXIuWE1MX0RPTUFJTikgPT0gbnVsbCkgewotICAgICAgICAgIFhNTE1lc3NhZ2VGb3JtYXR0ZXIgeG1mdCA9IG5ldyBYTUxNZXNzYWdlRm9ybWF0dGVyKCk7Ci0gICAgICAgICAgZXJyb3JSZXBvcnRlci5wdXRNZXNzYWdlRm9ybWF0dGVyKFhNTE1lc3NhZ2VGb3JtYXR0ZXIuWE1MX0RPTUFJTiwgeG1mdCk7Ci0gICAgICAgICAgZXJyb3JSZXBvcnRlci5wdXRNZXNzYWdlRm9ybWF0dGVyKFhNTE1lc3NhZ2VGb3JtYXR0ZXIuWE1MTlNfRE9NQUlOLCB4bWZ0KTsKLSAgICAgIH0gIAkgIAotICAgICAgZkVycm9yUmVwb3J0ZXIgPSBlcnJvclJlcG9ydGVyOwotCSAgc2V0UHJvcGVydHkoRVJST1JfUkVQT1JURVIsIGVycm9yUmVwb3J0ZXIpOwotCSAgZkNvbW1vbkNvbXBvbmVudHMucmVtb3ZlKGZFcnJvclJlcG9ydGVyKTsKLQkgIGZDb21tb25Db21wb25lbnRzLmFkZChmRXJyb3JSZXBvcnRlcik7Ci0gIAl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRURENvbmZpZ3VyYXRpb24jY3JlYXRlRXJyb3JSZXBvcnRlcigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhNTEVycm9yUmVwb3J0ZXIgY3JlYXRlRXJyb3JSZXBvcnRlcigpIAotICAgIHsKLSAgICAJcmV0dXJuIG5ldyBYTUxFcnJvclJlcG9ydGVyKCkKLQkJewotICAgIAkJLyogKG5vbi1KYXZhZG9jKQotICAgIAkJICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXIjcmVwb3J0RXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBzaG9ydCkKLSAgICAJCSAqLwotICAgIAkJcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzLCBzaG9ydCBzZXZlcml0eSkgdGhyb3dzIFhOSUV4Y2VwdGlvbiAKLSAgICAJICAgIHsgICAgICAgICAgICAgICAgICAgIAotCQkgICAgICBib29sZWFuIHJlcG9ydEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgdmFsaW5mby5zZXRDdXJyZW50RXJyb3JLZXkoa2V5KTsgIAotCQkJICB2YWxpbmZvLnNldE1lc3NhZ2VBcmd1bWVudHMoYXJndW1lbnRzKTsKLQkJICAgICAgU3RyaW5nIGlnbm9yZUNvbmRpdGlvbiA9IChTdHJpbmcpaW5nb3JlZEVycm9yS2V5VGFibGUuZ2V0KGtleSk7Ci0JCSAgICAgIGlmIChpZ25vcmVDb25kaXRpb24gIT0gbnVsbCkKLQkJICAgICAgewotCQkgICAgICAgIGlmIChpZ25vcmVDb25kaXRpb24uZXF1YWxzKFhNTFZhbGlkYXRvci5JR05PUkVfSUZfRFREX1dJVEhPVVRfRUxFTUVOVF9ERUNMKSkKLQkJICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKLQkJICAgICAgICAgIGJvb2xlYW4gaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQgPSB2YWxpbmZvLmlzRFREV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkKCk7IAotCQkgICAgICAgICAgcmVwb3J0RXJyb3IgPSAhaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQ7ICAKLQkJICAgICAgICB9Ci0JCSAgICAgICAgZWxzZSAKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICByZXBvcnRFcnJvciA9IGZhbHNlOwotCQkgICAgICAgIH0KLQkJICAgICAgfQotCQkgICAgICBpZiAoInNjaGVtYV9yZWZlcmVuY2UuNCIuZXF1YWxzKGtleSkgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBsb2NhdGlvbiA9IGFyZ3VtZW50c1swXTsgIAotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgICAgaWYocmVwb3J0ZWRFeGNlcHRpb25zLmNvbnRhaW5zKGxvY2F0aW9uKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRFeGNlcHRpb25zLmFkZChsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9ICAgICAgICAgIAotCQkgICAgICBpZiAocmVwb3J0RXJyb3IpCi0JCSAgICAgIHsKLQkJICAgICAgICBzdXBlci5yZXBvcnRFcnJvcihkb21haW4sIGtleSwgYXJndW1lbnRzLCBzZXZlcml0eSk7Ci0JCSAgICAgICAgdmFsaW5mby5nZXRFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCkuY29uc2lkZXJSZXBvcnRlZEVycm9yKHZhbGluZm8sIGtleSwgYXJndW1lbnRzKTsKLQkJICAgICAgfQotCQkgICAgfQotCQl9OwotICAgIH0KLSAgfQotICAKLSAgLyoqIAotICAgKiBBIGxpbmUgYW5kIGNvbHVtbiBudW1iZXIgY29vcmRpbmF0ZS4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBMb2NhdGlvbkNvb3JkaW5hdGUKLSAgewkKLQlwcml2YXRlIGludCBsaW5lTm8gPSAtMTsKLSAgICBwcml2YXRlIGludCBjb2x1bW5ObyA9IC0xOwotICAgIAotICAgIHB1YmxpYyBMb2NhdGlvbkNvb3JkaW5hdGUoaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIpCi0gICAgewotICAgICAgdGhpcy5saW5lTm8gPSBsaW5lTnVtYmVyOwotICAgICAgdGhpcy5jb2x1bW5ObyA9IGNvbHVtbk51bWJlcjsKLSAgICB9Ci0gICAgCQotICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gICAgeyAKLSAgICAgIHJldHVybiB0aGlzLmxpbmVObzsKLSAgICB9Ci0gICAgCQotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtbmVyKCkKLSAgICB7IAotICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTm87Ci0gICAgfSAKLSAgfQotICAKLSAgcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VGaWxlRnJvbUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAvLyBUbyBjYW5vbmljYWxpemUgdGhlIEVNRiBVUkkKLSAgICBJUGF0aCBjYW5vbmljYWxGb3JtID0gbmV3IFBhdGgobG9jYXRpb24pOwotICAgIC8vIE5lZWQgdG8gY29udmVydCB0byBhYnNvbHV0ZSBsb2NhdGlvbi4uLgotICAgIElQYXRoIHBhdGhMb2NhdGlvbiA9IG5ldyBQYXRoKFVSSUhlbHBlci5yZW1vdmVQcm90b2NvbChjYW5vbmljYWxGb3JtLnRvU3RyaW5nKCkpKTsKLSAgICAvLyAuLi50byBmaW5kIHRoZSByZXNvdXJjZSBmaWxlIHRoYXQgaXMgaW4gdGhlIHdvcmtzcGFjZQotICAgIElSZXNvdXJjZSByZXNvdXJjZUZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoTG9jYXRpb24pOwotICAgIC8vIElmIHRoZSByZXNvdXJjZSBpcyByZXNvbHZlZCB0byBhIGZpbGUgZnJvbSBodHRwLCBvciBhIGZpbGUgb3V0c2lkZQotICAgIC8vIHRoZSB3b3Jrc3BhY2UsIHRoZW4gd2Ugd2lsbCBqdXN0IGlnbm9yZSBpdC4KLSAgICByZXR1cm4gcmVzb3VyY2VGaWxlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0Fic3RyYWN0TmVzdGVkVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0Fic3RyYWN0TmVzdGVkVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMmRmYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9BYnN0cmFjdE5lc3RlZFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCB2YWxpZGF0b3IgdGhhdCBhc3Npc3RzIHZhbGlkYXRvcnMgaW4gcnVubmluZyBhbmQgY29udHJpYnV0aW5nCi0gKiBuZXN0ZWQgbWVzc2FnZXMgaW4gdGhlIHZhbGlkYXRpb24gcmVzdWx0cy4gCi0gKiAqbm90ZTogU3ViY2xhc3NlcyBkbyBub3QgbmVlZCB0byBjb250cmlidXRlIG5lc3RlZCBtZXNzYWdlcyBpbiBvcmRlciB0bwotICogYmVuZWZpdCBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBjbGFzcy4gVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIGl0ZXJhdGluZwotICogdGhyb3VnaCByZXN1bHRzIGZvciB2YWxpZGF0b3JzIHRoYXQgdXNlIHRoZSBzdGFuZGFyZCBjb250ZXh0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JKb2IgCi17Ci0gIC8vIExvY2FsbHkgdXNlZCwgbm9uLVVJIHN0cmluZ3MuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfT1BFTiA9ICJyZWZlcmVuY2VkRmlsZUVycm9yKCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfRklMRV9FUlJPUl9DTE9TRSA9ICIpIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTF9OT19TTEFTSCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEdFVF9GSUxFID0gImdldEZpbGUiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEdFVF9QUk9KRUNUX0ZJTEVTID0gImdldEFsbEZpbGVzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBHRVRfSU5QVVRTVFJFQU0gPSAiaW5wdXRTdHJlYW0iOyAvLyROT04tTkxTLTEkCi0gIAotICAvLyBJbnRlcm5hbCBzdHJpbmdzLiBUaGVzZSBzdHJpbmdzIGFyZSBjb21tb24gYWRkaXRpb24gaW5mb3JtYXRpb24gdHlwZXMuCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OVU1CRVJfQVRUUklCVVRFID0gImNvbHVtbk51bWJlciI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSA9ICJzcXVpZ2dsZVNlbGVjdGlvblN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9OQU1FX09SX1ZBTFVFX0FUVFJJQlVURSA9ICJzcXVpZ2dsZU5hbWVPclZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSB2YWxpZGF0aW9uIHVzaW5nIHZlcnNpb24gMiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JICBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7ICAKLQkgIElSZXBvcnRlciByZXBvcnRlciA9IHJlc3VsdC5nZXRSZXBvcnRlcihtb25pdG9yKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKWZpbGUgPSAoSUZpbGUpcmVzb3VyY2U7Ci0JCWlmIChmaWxlICE9IG51bGwpCi0JCXsKLQkJICBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IG5lc3RlZGNvbnRleHQgPSBnZXROZXN0ZWRDb250ZXh0KHN0YXRlLCBmYWxzZSk7Ci0JICAgICAgYm9vbGVhbiB0ZWFyZG93blJlcXVpcmVkID0gZmFsc2U7Ci0JICAgICAgaWYgKG5lc3RlZGNvbnRleHQgPT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICAvLyB2YWxpZGF0aW9uc3RhcnQgd2FzIG5vdCBjYWxsZWQsIHNvIG1hbnVhbGx5IHNldHVwIGFuZCB0ZWFyIGRvd24KLQkgICAgICAgIG5lc3RlZGNvbnRleHQgPSBnZXROZXN0ZWRDb250ZXh0KHN0YXRlLCB0cnVlKTsKLQkgICAgICAgIHNldHVwVmFsaWRhdGlvbihuZXN0ZWRjb250ZXh0KTsKLQkgICAgICAgIHRlYXJkb3duUmVxdWlyZWQgPSB0cnVlOwotCSAgICAgIH0KLQotCQkgIHZhbGlkYXRlKGZpbGUsIG51bGwsIHJlc3VsdCwgcmVwb3J0ZXIsIG5lc3RlZGNvbnRleHQpOwotCi0JICAgICAgaWYgKHRlYXJkb3duUmVxdWlyZWQpCi0JICAgICAgICB0ZWFyZG93blZhbGlkYXRpb24obmVzdGVkY29udGV4dCk7Ci0JCX0KLQkgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotIAotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2IjdmFsaWRhdGVJbkpvYihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIAotICB7Ci0JTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBuZXN0ZWRjb250ZXh0ID0gbmV3IE5lc3RlZFZhbGlkYXRvckNvbnRleHQoKTsKLQlzZXR1cFZhbGlkYXRpb24obmVzdGVkY29udGV4dCk7Ci0JU3RyaW5nW10gZmlsZVVSSXMgPSBjb250ZXh0LmdldFVSSXMoKTsKLQlpZiAoZmlsZVVSSXMgIT0gbnVsbCAmJiBmaWxlVVJJcy5sZW5ndGggPiAwKSAKLQl7Ci0JICBpbnQgbnVtRmlsZXMgPSBmaWxlVVJJcy5sZW5ndGg7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZpbGVzICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIAotCSAgewotCSAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlVVJJc1tpXTsKLQkgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpCi0JICAgIHsgICAgICAgICAgCi0JICAgICAgT2JqZWN0IFtdcGFybXMgPSB7ZmlsZU5hbWV9OwotCi0JICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgY29udGV4dC5sb2FkTW9kZWwoR0VUX0ZJTEUsIHBhcm1zKTsKLQkgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIHNob3VsZFZhbGlkYXRlKGZpbGUpKSAKLQkgICAgICB7IAotCSAgICAJLy8gVGhlIGhlbHBlciBtYXkgbm90IGhhdmUgYSBmaWxlIHN0b3JlZCBpbiBpdCBidXQgbWF5IGhhdmUgYW4gSW5wdXRTdHJlYW0gaWYgYmVpbmcKLQkgICAgCS8vIGNhbGxlZCBmcm9tIGEgc291cmNlIG90aGVyIHRoYW4gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHN1Y2ggYXMgYW4gZWRpdG9yLgotCSAgICAgICAgaWYgKGNvbnRleHQubG9hZE1vZGVsKEdFVF9JTlBVVFNUUkVBTSkgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgewotCSAgICAgICAgICB2YWxpZGF0ZShmaWxlLCAoSW5wdXRTdHJlYW0pY29udGV4dC5sb2FkTW9kZWwoR0VUX0lOUFVUU1RSRUFNKSwgbnVsbCwgcmVwb3J0ZXIsIG5lc3RlZGNvbnRleHQpOyAvL2RvIHdlIG5lZWQgdGhlIGZpbGVOYW1lPyAgd2hhdCBpcyBpbnQgcnVsZUdyb3VwPyAvLyROT04tTkxTLTEkCi0JICAgICAgICB9Ci0JICAgICAgICBlbHNlCi0JICAgICAgICB7Ci0JICAgIAkgIHZhbGlkYXRlKGZpbGUsIG51bGwsIG51bGwsIHJlcG9ydGVyLCBuZXN0ZWRjb250ZXh0KTsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQl9Ci0JLy8gVE9ETzogSXMgdGhpcyBuZWVkZWQ/IFNob3VsZG4ndCB0aGUgZnJhbWV3b3JrIHBhc3MgdGhlIGNvbXBsZXRlIGxpc3Q/IAotCS8vIFNob3VsZCBJIGtub3cgdGhhdCBJJ20gdmFsaWRhdGluZyBhIHByb2plY3QgYXMgb3Bwb3NlZCB0byBmaWxlcz8KLQllbHNlIAotICAgIHsKLSAgICAgIE9iamVjdCBbXXBhcm1zID0ge2dldFZhbGlkYXRvcklEKCl9OwotICAgICAgQ29sbGVjdGlvbiBmaWxlcyA9IChDb2xsZWN0aW9uKSBjb250ZXh0LmxvYWRNb2RlbChHRVRfUFJPSkVDVF9GSUxFUywgcGFybXMpOwotICAgICAgSXRlcmF0b3IgaXRlciA9IGZpbGVzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIAotICAgICAgewotICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgaWYoc2hvdWxkVmFsaWRhdGUoZmlsZSkpCi0gICAgICAgIHsKLQkgICAgICB2YWxpZGF0ZShmaWxlLCBudWxsLCBudWxsLCByZXBvcnRlciwgbmVzdGVkY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0JCi0JdGVhcmRvd25WYWxpZGF0aW9uKG5lc3RlZGNvbnRleHQpOwotCWlmKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpCi0JICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQcm92aWRlcyB0aGUgaWQgb2YgdGhpcyB2YWxpZGF0b3IuIFRoZSBJRCBpcyB1c2VkIGJ5IHRoZSB2YWxpZGF0aW9uCi0gICAqIGZyYW1ld29yay4gSXQgdXN1YWxseSBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAqIGltcGxlbWVudGluZyB0aGUgSVZhbGlkYXRvciBpbnRlcmZhY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIElEIG9mIHRoaXMgdmFsaWRhdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0b3JJRCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBlcmZvcm0gc2V0IHVwIGJlZm9yZSB2YWxpZGF0aW9uIHJ1bnMuIFN1YmNsYXNzZXMgbWF5IGltcGxlbWVudCB0aGlzCi0gICAqIG1ldGhvZCB0byBwZXJmb3JtIHZhbGlkYXRpb24gc3BlY2lmaWMgc2V0IHVwLgotICAgKiAKLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogCQlUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXBWYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgewotCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICB9Ci0gIAotICAvKioKLSAgICogUGVyZm9ybSB0ZWFyIGRvd24gYWZ0ZXIgdmFsaWRhdGlvbiBydW5zLiBTdWJjbGFzc2VzIG1heSBpbXBsZW1lbnQgdGhpcwotICAgKiBtZXRob2QgdG8gcGVyZm9ybSB2YWxpZGF0aW9uIHNwZWNpZmljIHRlYXIgZG93bi4KLSAgICogCi0gICAqIEBwYXJhbSBjb250ZXh0Ci0gICAqIAkJVGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJkb3duVmFsaWRhdGlvbihOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsKLQkvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYiNnZXRTY2hlZHVsaW5nUnVsZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGFyZzApIAotICB7Ci0JLy8gVE9ETyByZXZpZXcgd2hldGhlciByZXR1cm5pbmcgYSBudWxsIHJ1bGUgaXMgY29ycmVjdC4gR2FyeSBoYWQgYSBzdWdnZXN0aW9uIGluIHRoZSBidWcgcmVwb3J0LgotCXJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciNjbGVhbnVwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgYXJnMCkgCi0gIHsKLSAgICAvLyBObyBjbGVhbnVwIHRvIHBlcmZvcm0uIFN1YmNsYXNzZXMgYXJlIGZyZWUgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiAKLSAgeyAgCi0JdmFsaWRhdGVJbkpvYihjb250ZXh0LCByZXBvcnRlcik7Ci0gIH0KLQkKLQkKLSAgLyoqCi0gICAqIERldGVybWluZSBpZiBhIGdpdmVuIGZpbGUgc2hvdWxkIGJlIHZhbGlkYXRlZC4gCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0aGF0IG1heSBiZSB2YWxpZGF0ZWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBzaG91bGQgYmUgdmFsaWRhdGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlKElGaWxlIGZpbGUpIAotICB7Ci0JSVJlc291cmNlIHJlc291cmNlID0gZmlsZTsKLQlkbyAKLQl7Ci0JICBpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8IAotCQkgICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJykgCi0JICB7Ci0JCXJldHVybiBmYWxzZTsKLQkgIH0KLQkgIHJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JfXdoaWxlICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID09IDApOwotCQotCXJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpbGUgYW5kIHVzZSB0aGUgcmVwb3J0ZXIgZm9yIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uIGxvZ2ljIGJ1dCByYXRoZXIgZGVsZWdhdGVzCi0gICAqIHRvIHRoZSB2YWxpZGF0ZSBtZXRob2QgaW4gc3ViY2xhc3NlcyB0byB2YWxpZGF0ZS4gVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUKLSAgICogZm9yIHJlcG9ydGluZyB0aGUgbWVzc2FnZXMgdGhhdCByZXN1bHQgZnJvbSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgCi0gICAqIAkJQW4gSUZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBpbnB1dHN0cmVhbSAKLSAgICogCQlBbiBJbnB1dFN0cmVhbSB0aGF0IHJlcHJlc2VudHMgdGhlIGZpbGUuIFRoZSBJbnB1dFN0cmVhbSBtYXkgYmUgbnVsbAotICAgKiAJCWluIHdoaWNoIGNhc2UgdGhlIGZpbGVzIHNob3VsZCBiZSB2YWxpZGF0ZWQgZnJvbSB0aGUgSUZpbGUuCi0gICAqIEBwYXJhbSByZXN1bHQgLSBUaGUgdmFsaWRhdGlvbiByZXN1bHQKLSAgICogQHBhcmFtIHJlcG9ydGVyIAotICAgKiAJCVRoZSByZXBvcnRlciB3aXRoIHdoaWNoIHRvIHJlcG9ydCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAJCVRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoSUZpbGUgZmlsZSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgeyAgCi0JTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0gICAgCi0JU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gbnVsbDsJCQotCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQlsb2NhdGlvblN0cmluZyA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCX0KLQlpZiAobG9jYXRpb25TdHJpbmcgPT0gbnVsbCAmJiBmaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQlsb2NhdGlvblN0cmluZyA9IGZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCX0KLQlpZiAobG9jYXRpb25TdHJpbmcgPT0gbnVsbCkgewotCQlsb2NhdGlvblN0cmluZyA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCX0KLQlTdHJpbmcgdXJpID0gY3JlYXRlVVJJRm9yRmlsZVBhdGgobG9jYXRpb25TdHJpbmcpOwotCi0JY2xlYXJNYXJrZXJzKGZpbGUsIHRoaXMsIHJlcG9ydGVyKTsKLQkKLQlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IG51bGw7Ci0JaWYgKHJlc3VsdCA9PSBudWxsKQotCSAgdmFscmVwb3J0ID0gdmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29udGV4dCk7Ci0JZWxzZQotCSAgdmFscmVwb3J0ID0gdmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29udGV4dCwgcmVzdWx0KTsKLQkKLQljcmVhdGVNYXJrZXJzKGZpbGUsIHZhbHJlcG9ydC5nZXRWYWxpZGF0aW9uTWVzc2FnZXMoKSwgcmVwb3J0ZXIpOwotCSAgICAgICAgCi0JdHJ5Ci0JewotCSAgZmlsZS5zZXRTZXNzaW9uUHJvcGVydHkoVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1JfTUVTU0FHRV9NQVBfUVVBTElGSUVEX05BTUUsIHZhbHJlcG9ydC5nZXROZXN0ZWRNZXNzYWdlcygpKTsKLQl9Ci0JY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotCXsKLQkgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIHNldCBuZXN0ZWQgbWVzc2FnZXMgcHJvcGVydHkuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gIH0KLQkKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBmaWxlIGFuZCB1c2UgdGhlIHJlcG9ydGVyIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogQ2xpZW50cyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB3aXRoIHRoZWlyIHNwZWNpZmljIHZhbGlkYXRpb24gbG9naWMuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtIAotICAgKiAJCUFuIElucHV0U3RyZWFtIHRoYXQgcmVwcmVzZW50cyB0aGUgZmlsZS4gVGhlIElucHV0U3RyZWFtIG1heSBiZSBudWxsCi0gICAqIAkJaW4gd2hpY2ggY2FzZSB0aGUgZmlsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZCBmcm9tIHRoZSBJRmlsZS4KLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogCQlUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKiBAcmV0dXJuCi0gICAqIAkJQSB2YWxpZGF0aW9uIHJlcG9ydCBzdW1tYXJpemluZyB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpOwotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBmaWxlIGFuZCB1c2UgdGhlIHJlcG9ydGVyIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogQ2xpZW50cyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCB0aGVpciBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljLgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm93IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYWJzdHJhY3QgdmVyc2lvbi4KLSAgICogRGVzaWduIGRlY2lzaW9uIHRvIG5vdCBtYWtlIHRoaXMgYWJzdHJhY3QuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIEBwYXJhbSBpbnB1dHN0cmVhbQotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQsIFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbnRleHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgdGhlIG1hcmtlcnMgb24gdGhlIGdpdmVuIElGaWxlIGZvciBhIHNwZWNpZmllZAotICAgKiB2YWxpZGF0b3IuCi0gICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHN1YmNsYXNzZXMuCi0gICAqIAotICAgKiBAcGFyYW0gaUZpbGUKLSAgICogCQlUaGUgSUZpbGUgZnJvbSB3aGljaCB0byBjbGVhciB0aGUgbWFya2Vycy4KLSAgICogQHBhcmFtIHZhbGlkYXRvcgotICAgKiAJCVRoZSB2YWxpZGF0b3IgZm9yIHdoaWNoIHRvIHJlbW92ZSB0aGUgbWFya2Vycy4KLSAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAqIAkJVGhlIHJlcG9ydGVyIHRoYXQgY2FuIHJlbW92ZSB0aGUgbWFya2Vycy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjbGVhck1hcmtlcnMoSUZpbGUgaUZpbGUsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLQlpZiAoZmlsZUlzQWNjZXNzaWJsZShpRmlsZSkpCi0JewotCSAgcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yLCBpRmlsZSk7Ci0JfQotICB9Ci0JICAKLSAgLyoqCi0gICAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBpcyBhY2Nlc3NpYmxlIGFuZCBtYXkgYmUgdXNlZCBmb3IgdmFsaWRhdGlvbi4gQSBmaWxlIGlzIAotICAgKiBhdmFpbGFibGUgaWYgCi0gICAqIDEuIEl0IGlzIG5vdCBudWxsLgotICAgKiAyLiBJdCBleGlzdHMuIAotICAgKiAzLiBUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSAKLSAgICogCQlUaGUgZmlsZSB0byBjaGVjayB0byBlbnN1cmUgaXQgaXMgYWNjZXNzaWJsZS4KLSAgICogQHJldHVybiAKLSAgICogCQlUcnVlIGlmIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmaWxlSXNBY2Nlc3NpYmxlKElGaWxlIGZpbGUpCi0gIHsKLSAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JewotCSAgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBGb3JtYXQgYSBmaWxlIG5hbWUgaW50byBhIGNvcnJlY3QgVVJJLiAKLSAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc3ViY2xhc3Nlcy4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlbmFtZSAKLSAgICogCQlUaGUgZmlsZSBuYW1lIHRvIGZvcm1hdC4KLSAgICogQHJldHVybiAKLSAgICogCQkKLSAgICogVGhlIGZvcm1hdHRlZCBVUkkuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjcmVhdGVVUklGb3JGaWxlUGF0aChTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLQlpZighZmlsZW5hbWUuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MX05PX1NMQVNIKSkKLQl7Ci0JICB3aGlsZShmaWxlbmFtZS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkgIHsKLQkgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMSk7Ci0JICB9Ci0JICBmaWxlbmFtZSA9IEZJTEVfUFJPVE9DT0wgKyBmaWxlbmFtZTsKLQl9Ci0JcmV0dXJuIGZpbGVuYW1lOwotICB9Ci0JICAKLSAgLyoqCi0gICAqIENyZWF0ZSBtYXJrZXJzIGZvciB0aGUgdmFsaWF0aW9uIG1lc3NhZ2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGlGaWxlCi0gICAqICAgICAgICAgIFRoZSByZXNvdXJjZSB0byBjcmVhdGUgdGhlIG1hcmtlcnMgb24uCi0gICAqIEBwYXJhbSB2YWxtZXNzYWdlcwotICAgKiAgICAgICAgICBUaGUgYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZU1hcmtlcnMoSUZpbGUgaUZpbGUsIFZhbGlkYXRpb25NZXNzYWdlW10gdmFsbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikKLSAgewotICAgIGlmICghZmlsZUlzQWNjZXNzaWJsZShpRmlsZSkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbnVtbWVzc2FnZXMgPSB2YWxtZXNzYWdlcy5sZW5ndGg7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1tZXNzYWdlczsgaSsrKQotICAgIHsKLSAgICAgIFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gdmFsbWVzc2FnZXNbaV07Ci0gICAgICBTdHJpbmcgdXJpID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0VXJpKCk7Ci0KLSAgICAgIExvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgIGlmICh2YWxpZGF0aW9uTWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIAotICAgICAgICAJCXZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSwgaUZpbGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAKLSAgICAgICAgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSwgaUZpbGUpOwotICAgICAgfQotICAgICAgCi0gICAgICBtZXNzYWdlLnNldExpbmVObyh2YWxpZGF0aW9uTWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgYWRkSW5mb1RvTWVzc2FnZSh2YWxpZGF0aW9uTWVzc2FnZSwgbWVzc2FnZSk7Ci0gICAgICAKLSAgICAgIExpc3QgbmVzdGVkZXJyb3JzID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TmVzdGVkTWVzc2FnZXMoKTsKLSAgICAgIGlmIChuZXN0ZWRlcnJvcnMgIT0gbnVsbCAmJiAhbmVzdGVkZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZS5zZXRHcm91cE5hbWUoUkVGRVJFTkNFRF9GSUxFX0VSUk9SX09QRU4gKyB1cmkgKyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfQ0xPU0UpOwotICAgICAgfQotCi0gICAgICByZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCSAgICAgIAotICAgIH0KLSAgfQotCSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGFkZGl0aW9uIG9mIGluZm9ybWF0aW9uIHRvIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLSAgICogQHBhcmFtIHZhbGlkYXRpb25tZXNzYWdlCi0gICAqIAkJVGhlIFZhbGlkYXRpb25NZXNzYWdlIHRvIHJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbiBmcm9tLgotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAJCVRoZSBJTWVzc2FnZSB0byBhZGQgdGhlIGluZm9ybWF0aW9uIHRvLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkSW5mb1RvTWVzc2FnZSAoVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbm1lc3NhZ2UsIElNZXNzYWdlIG1lc3NhZ2UpCi0gIHsgCi0JLy8gVGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbmVzdGVkIHZhbGlkYXRpb24gY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBzdGF0ZQotICAgKiAgICAgICAgICB0aGUgdmFsaWRhdGlvbiBzdGF0ZS4KLSAgICogQHBhcmFtIGNyZWF0ZQotICAgKiAgICAgICAgICB3aGVuIHRydWUsIGEgbmV3IGNvbnRleHQgd2lsbCBiZSBjcmVhdGVkIGlmIG9uZSBpcyBub3QgZm91bmQKLSAgICogQHJldHVybiB0aGUgbmVzdGVkIHZhbGlkYXRpb24gY29udGV4dC4KLSAgICovCi0gIHByb3RlY3RlZCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGdldE5lc3RlZENvbnRleHQoVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBib29sZWFuIGNyZWF0ZSkKLSAgewotICAgIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgaWYgKGNyZWF0ZSkKLSAgICB7Ci0gICAgICBjb250ZXh0ID0gbmV3IE5lc3RlZFZhbGlkYXRvckNvbnRleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbnRleHQ7Ci0gIH0KLQotICAvKioKLSAgICogQSBsb2NhbGl6ZWQgbWVzc2FnZSBpcyBhIHNwZWNpYWxpemVkIHR5cGUgb2YgSU1lc3NhZ2UgdGhhdCBhbGxvd3Mgc2V0dGluZwotICAgKiBhbmQgdXNpbmcgYSBsb2NhbGl6ZWQgbWVzc2FnZSBzdHJpbmcgZm9yIGEgbWVzc2FnZS4KLSAgICovCi0gIGNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIAotICB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOwotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIAotCXsKLQkgIHRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgCi0JewotCSAgdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIChPYmplY3QpIHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIE9iamVjdCB0YXJnZXRPYmplY3QpIAotCXsKLQkgIHN1cGVyKG51bGwsIHNldmVyaXR5LCBudWxsKTsKLQkgIHNldExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVRleHQpOwotCSAgc2V0VGFyZ2V0T2JqZWN0KHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgCi0JewotCSAgX21lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIAotCXsKLQkgIHJldHVybiBfbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSAKLQl7Ci0JICByZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgCi0JewotCSAgcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwpIAotCXsKLQkgIHJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsLCBDbGFzc0xvYWRlciBjbCkgCi0JewotCSAgcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ5N2FmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciB2YWxpZGF0aW9uIGluIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIAotICogQGF1dGhvciBFcm5lc3QgTWFoIChlcm5lc3RAY2EuaWJtLmNvbSkKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIEhlbHBlciBleHRlbmRzIFdvcmtiZW5jaENvbnRleHQKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1BST0pFQ1RfRklMRVMgPSAiZ2V0QWxsRmlsZXMiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9GSUxFID0gImdldEZpbGUiOyAvLyROT04tTkxTLTEkCi0gIC8vZHcgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUNvbnRhaW5lcltdIE5PX0NPTlRBSU5FUlMgPSBuZXcgSUNvbnRhaW5lclswXTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVIgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfT1dORVIgPSAib3duZXIiOyAgIC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgSGVscGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICAvLyB0aGUgZm9sbG93aW5nIHdpbGwgcmVnaXN0ZXIgdGhlIGhlbHBlcidzIHN5bWJvbGljIG1ldGhvZHMKLSAgICBDbGFzcyBbXSBhcmdzID0gbmV3IENsYXNzWzFdIDsKLSAgICBhcmdzWzBdID0gU3RyaW5nLmNsYXNzIDsgIC8vIGEgc3RyaW5nIGFyZ3VtZW50IGRlbm90aW5nIGEgc3BlY2lmaWMgSlNQLgotICAgIAotICAgIHJlZ2lzdGVyTW9kZWwoR0VUX0ZJTEUsICJnZXRGaWxlIiwgYXJncyk7Ly8kTk9OLU5MUy0xJAotICAgIHJlZ2lzdGVyTW9kZWwoR0VUX1BST0pFQ1RfRklMRVMsICJnZXRGaWxlcyIsIGFyZ3MpOy8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIElGaWxlIGZvciB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmV0cmlldmUuCi0gICAqIEByZXR1cm4gQW4gSUZpbGUgcmVwcmVzZW50aW5nIHRoZSBmaWxlIHNwZWNpZmllZCBvciBudWxsIGlmIGl0IGNhbid0IGJlIHJlc29sdmVkLgotICAgKi8KLSAgcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVuYW1lKQotICB7Ci0gICAgLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJmaWxlIG5hbWUgPSAiICsgZmlsZW5hbWUpOwotICAgIElSZXNvdXJjZSByZXMgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihmaWxlbmFtZSwgdHJ1ZSk7IC8vIHRydWUgbWVhbnMgaW5jbHVkZSBwaGFudG9tIHJlc291cmNlcwotICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgCi0gICAgewotICAgICAgcmV0dXJuIChJRmlsZSkgcmVzOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgY29sbGVjdGlvbiBvZiBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0IHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUKLSAgICogdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEByZXR1cm4gVGhlIGNvbGxlY3Rpb24gb2YgZmlsZXMgcmVsZXZhbnQgZm9yIHRoZSB2YWxpZGF0b3IgY2xhc3Mgc3BlY2lmaWVkLgotICAgKi8KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0RmlsZXMoU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkKLSAgewotICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0gICAgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBnZXRGaWxlcyhmaWxlcywgcHJvamVjdCwgdmFsaWRhdG9yQ2xhc3NOYW1lKTsKLSAgICByZXR1cm4gZmlsZXM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb2xsZWN0aW9uIG9mIGZpbGVzIGZyb20gdGhlIHByb2plY3QgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZQotICAgKiB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlcyBUaGUgZmlsZXMgcmVsZXZhbnQgZm9yIHRoZSBjbGFzcyBuYW1lLgotICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIHRvIGxvb2sgZm9yIGZpbGVzIGluLgotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBnZXRGaWxlcyhDb2xsZWN0aW9uIGZpbGVzLCBJQ29udGFpbmVyIHJlc291cmNlLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIFtdIHJlc291cmNlQXJyYXkgPSByZXNvdXJjZS5tZW1iZXJzKGZhbHNlKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxyZXNvdXJjZUFycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgeyAgICAgICAKLSAgICAgICAgaWYgKFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzQXBwbGljYWJsZVRvKHZhbGlkYXRvckNsYXNzTmFtZSwgcmVzb3VyY2VBcnJheVtpXSkpIAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHJlc291cmNlQXJyYXlbaV0gaW5zdGFuY2VvZiBJRmlsZSkgCi0gICAgICAgICAgewotICAgICAgICAgICAgZmlsZXMuYWRkKHJlc291cmNlQXJyYXlbaV0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVzb3VyY2VBcnJheVtpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikKLSAgICAgICAgIGdldEZpbGVzKGZpbGVzLChJQ29udGFpbmVyKXJlc291cmNlQXJyYXlbaV0sIHZhbGlkYXRvckNsYXNzTmFtZSkgOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gIH0KLQotICAKLS8qKgotICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSwgd2l0aG91dCB0aGUgcHJvamVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiAKLSAqIGluIGZyb250LgotICoKLSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgVmFsaWRhdGlvbk9wZXJhdGlvbiB0byBjYWxjdWxhdGUgdGhlIG5vbi1lbnZpcm9ubWVudCAKLSAqIHNwZWNpZmljIG5hbWVzIG9mIHRoZSBmaWxlcy4gT25seSB0aGUgSVdvcmtiZW5jaENvbnRleHQgaW1wbGVtZW50YXRpb24ga25vd3MgaG93IAotICogbXVjaCBpbmZvcm1hdGlvbiB0byBzdHJpcCBvZmYgb2YgdGhlIElSZXNvdXJjZSBuYW1lLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMKLSAqIGFuIEVKQiBQcm9qZWN0IG5hbWVkICJNeUVKQlByb2plY3QiLCBhbmQgaXQgdXNlcyB0aGUgZGVmYXVsdCBuYW1lcyBmb3IgdGhlIAotICogc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycywgInNvdXJjZSIgYW5kICJlamJNb2R1bGUiLCByZXNwZWN0aXZlbHksIHRoZW4gdGhlCi0gKiBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIEVKQiBIZWxwZXIga25vd3MgaG93IG11Y2ggb2YgdGhhdCBzdHJ1Y3R1cmUgaXMgCi0gKiBlY2xpcHNlLXNwZWNpZmljLiAKLSAqCi0gKiBTaW5jZSB0aGUgInNvdXJjZSIgZm9sZGVyIGNvbnRhaW5zIEphdmEgc291cmNlIGZpbGVzLCBhIHBvcnRhYmxlIG5hbWUgd291bGQKLSAqIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcywgd2l0aG91dCB0aGUgZWNsaXBzZS1zcGVjaWZpYwotICogcHJvamVjdCBhbmQgZm9sZGVyIG5hbWVzIGluIGZyb250IG9mIHRoZSBmaWxlIG5hbWUuIFRoZSBFSkJIZWxwZXIga25vd3MgdGhhdCAKLSAqIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlICJzb3VyY2UiIGZvbGRlciwgZm9yIGV4YW1wbGUsIGNhbiBiZSByZW1vdmVkLCBiZWNhdXNlLCAKLSAqIGFjY29yZGluZyB0byB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgRUpCIFByb2plY3QsIGV2ZXJ5dGhpbmcgY29udGFpbmVkCi0gKiBpbiB0aGUgc291cmNlIGZvbGRlciBpcyBqYXZhIHNvdXJjZSBjb2RlLiBTbyBpZiB0aGVyZSBpcyBhbiBJUmVzb3VyY2UgaW4gYW4KLSAqIEVKQiBQcm9qZWN0IG5hbWVkICIvTXlFSkJQcm9qZWN0L3NvdXJjZS9jb20vaWJtL215Y2xhc3Nlcy9NeUphdmFGaWxlLmphdmEiLAotICogdGhpcyBtZXRob2Qgd291bGQgbWFrZSB0aGlzIG5hbWUgcG9ydGFibGUgYnkgc3RyaXBwaW5nIG9mZiB0aGUKLSAqICIvTXlFSkJQcm9qZWN0L3NvdXJjZSIsIGFuZCByZXR1cm5pbmcgImNvbS9pYm0vbXljbGFzc2VzL015SmF2YUZpbGUuamF2YSIuCi0gKgotICogVGhlIG91dHB1dCBvZiB0aGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBWYWxpZGF0aW9uT3BlcmF0aW9uLCB3aGVuIGl0Ci0gKiBpcyBjYWxjdWxhdGluZyB0aGUgbGlzdCBvZiBhZGRlZC9jaGFuZ2VkL2RlbGV0ZWQgZmlsZSBuYW1lcyBmb3IgaW5jcmVtZW50YWwKLSAqIHZhbGlkYXRpb24uIElmIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UpIHJldHVybnMgbnVsbCwgdGhhdCBtZWFucwotICogdGhhdCB0aGUgSVdvcmtiZW5jaENvbnRleHQncyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoYXQgcGFydGljdWxhcgotICogdHlwZSBvZiByZXNvdXJjZSwgYW5kIHRoZSByZXNvdXJjZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBhcnJheSBvZgotICogSUZpbGVEZWx0YSBvYmplY3RzIGluIHRoZSBJVmFsaWRhdG9yJ3MgInZhbGlkYXRlIiBtZXRob2QuIAotICogCi0gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIHRvIGdldCB0aGUgbmFtZSBmcm9tLgotICogQHJldHVybiBUaGUgcG9ydGFibGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkKLSAgewotICAgIC8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0IHBvcnRhYmxlbmFtZSBmb3IgIiArIHJlc291cmNlKTsKLSAgICByZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCk7Ci0gIH0KLQotLyoqCi0gKiBXaGVuIGFuIElWYWxpZGF0b3IgYXNzb2NpYXRlcyBhIHRhcmdldCBvYmplY3Qgd2l0aCBhbiBJTWVzc2FnZSwKLSAqIHRoZSBXb3JrYmVuY2hSZXBvcnRlciBldmVudHVhbGx5IHJlc29sdmVzIHRoYXQgdGFyZ2V0IG9iamVjdAotICogd2l0aCBhbiBJUmVzb3VyY2UuIFNvbWV0aW1lcyBtb3JlIHRoYW4gb25lIHRhcmdldCBvYmplY3QgcmVzb2x2ZXMKLSAqIHRvIHRoZSBzYW1lIElSZXNvdXJjZSAodXN1YWxseSB0aGUgSVByb2plY3QsIHdoaWNoIGlzIHRoZSBkZWZhdWx0Ci0gKiBJUmVzb3VyY2Ugd2hlbiBhbiBJRmlsZSBjYW5ub3QgYmUgZm91bmQpLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQsCi0gKiBieSB0aGUgV29ya2JlbmNoUmVwb3J0ZXIsIHNvIHRoYXQgdGhlIFdvcmtiZW5jaFJlcG9ydGVyIGNhbiAKLSAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIElNZXNzYWdlcyB3aGljaCBhcmUgb24gdGhlIHNhbWUgSVJlc291cmNlLCAKLSAqIGJ1dCByZWZlciB0byBkaWZmZXJlbnQgdGFyZ2V0IG9iamVjdHMuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgCi0gKiByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yLCBPYmplY3QpIG1ldGhvZCwgc28gdGhhdCB3aGVuIG9uZQotICogdGFyZ2V0IG9iamVjdCByZW1vdmVzIGFsbCBvZiBpdHMgbWVzc2FnZXMsIHRoYXQgaXQgZG9lc24ndCByZW1vdmUKLSAqIGFub3RoZXIgdGFyZ2V0IG9iamVjdCdzIG1lc3NhZ2VzLgotICoKLSAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBvbmx5IGlmIG9iamVjdCBpcyBudWxsLiBPdGhlcndpc2UsIGFuCi0gKiBpZCB3aGljaCBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgYSBwYXJ0aWN1bGFyIG9iamVjdCBtdXN0IGJlIHJldHVybmVkLgotICogVGhlIGlkIG5lZWRzIHRvIGJlIHVuaXF1ZSBvbmx5IHdpdGhpbiBvbmUgcGFydGljdWxhciBJVmFsaWRhdG9yLgotICogCi0gKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byBnZXQgdGhlIG5hbWUuCi0gKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgb3IgbnVsbCBpZiB0aGUgb2JqZWN0IGlzIG51bGwuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsKSAKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXQgdGFyZ2V0bmFtZSBmb3IgIiArIG9iamVjdCk7Ci0gICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotICB9Ci0gIAotICAvKioKLSAgICogRGVsZXRlIHRoZSBtYXJrZXJzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBmcm9tIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCi0gICAqIAotICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIHRvIGRlbGV0ZSB0aGUgbWFya2VycyBmcm9tLgotICAgKiBAcGFyYW0gbWFya2VyVHlwZSBUaGUgdHlwZSBvZiBtYXJrZXJzIHRvIGRlbGV0ZSBmcm9tIHRoZSByZXNvdXJjZS4KLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aGljaCB0aGUgbWFya2VycyBtdXN0IGhhdmUgdG8gYmUgZGVsZXRlZC4KLSAgICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGNvcnJlc3BvbmRpbmcgdG8gYXR0cmlidXRlTmFtZSB3aGljaCB0aGUgbWFya2VycyBtdXN0IGhhdmUgdG8gYmUgZGVsZXRlZC4KLSAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtYXJrZXJUeXBlLCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgZmluYWwgT2JqZWN0IGF0dHJpYnV0ZVZhbHVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7ICAgICAgICAgIAotICAgIGZpbmFsIElNYXJrZXJbXSB2NDAwTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgZmluYWwgSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhtYXJrZXJUeXBlLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotICAgIElXb3Jrc3BhY2VSdW5uYWJsZSBvcCA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSAKLSAgICAgewotICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gICAgICAgeyAgICAKLSAgICAgICAgIC8vIHRoaXMgZml4ZXMgZGVmZWN0IDE5MzQwNgotICAgICAgICAgLy8gaGVyZSB3ZSByZW1vdmUgbWFya2VycyB0aGF0IG1heSBoYXZlIGJlZW4gYWRkZWQgYnkgdGhlIHY0MDAgY29kZQotICAgICAgICAgLy8gaG9wZWZ1bGx5IHRoZSAnLm1hcmtlcnMnIG1ldGFkYXRhIGZpbGVzIHdpbGwgYmUgcmVtb3ZlZCBmb3IgdGhlIFY1IGluc3RhbGwKLSAgICAgICAgIC8vIGFuZCB0aGlzIGtsdWRnZSB3aWxsIG5vdCBiZSBuZWVkZWQgdGhlcmUKLSAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdjQwME1hcmtlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsgICAgICAgICAgIAotICAgICAgICAgICBtYXJrZXIuZGVsZXRlKCk7ICAgICAgICAgICAKLSAgICAgICAgIH0KLSAgICAKLSAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgCi0gICAgICAgICB7Ci0gICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLSAgICAgICAgICAgCi0gICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICB2YWx1ZS5lcXVhbHMoYXR0cmlidXRlVmFsdWUpKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIG1hcmtlci5kZWxldGUoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG9wLCBudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgc2V2ZXJpdHkgZm9yIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICogCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgdG8gY29udmVydCB0byB2YWxpZGF0aW9uIGZyYW1ld29yayBzZXZlcml0eS4KLSAgICogQHJldHVybiBUaGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgc2V2ZXJpdHkgZm9yIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICovCi0gIHN0YXRpYyBwdWJsaWMgaW50IGdldFZhbGlkYXRpb25GcmFtZXdvcmtTZXZlcml0eShpbnQgc2V2ZXJpdHkpCi0gIHsKLSAgICBzd2l0Y2ggKHNldmVyaXR5KQotICAgIHsKLSAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0gICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzoKLSAgICAgICAgcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLSAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9JTkZPOgotICAgICAgICByZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotICAgIH0KLSAgICByZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOyAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTGF6eVVSTElucHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0xhenlVUkxJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzRjYjBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTGF6eVVSTElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgYWxsb3dzIElucHV0U3RyZWFtcyB0byBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZCB0byB4ZXJjZXMgd2l0aG91dAotICogYWN0dWFsbHkgb3BlbmluZyBmaWxlIGhhbmRsZXMgb3IgbmV0d29yayBjb25uZWN0aW9ucyB1bnRpbCBpdCBpcyBhYnNvbHV0ZWx5Ci0gKiBuZWNjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgTGF6eVVSTElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0KLXsgIAotICBwcml2YXRlIHN0YXRpYyBpbnQgZGVidWdUb3RhbE9wZW5TdHJlYW1Db3VudCA9IDA7IAotICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5uZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBlcnJvcjsKLSAgYm9vbGVhbiBoYXNNYXJrczsKLSAgYm9vbGVhbiBwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuOwotCi0gIHB1YmxpYyBMYXp5VVJMSW5wdXRTdHJlYW0oU3RyaW5nIHVybCkKLSAgewotICAgIHRoaXMudXJsID0gdXJsOwotCWlubmVyID0gbnVsbDsKLQlwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuID0gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoaW5uZXIgPT0gbnVsbCAmJiAhZXJyb3IpCi0gICAgewotICAgICAgZGVidWdUb3RhbE9wZW5TdHJlYW1Db3VudCsrOwotICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlubmVyID0gbmV3IFVSTCh1cmwpLm9wZW5TdHJlYW0oKTsKLQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IGZhbHNlOwotCQloYXNNYXJrcyA9IGZhbHNlOwotICAgICAgfQotICAgICAgZmluYWxseSAKLSAgICAgIHsKLSAgICAgICAgaWYgKGlubmVyID09IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2VTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW5uZXIgIT0gbnVsbCAmJiAhcHJldGVuZEZpbGVJc1N0aWxsT3BlbikgewotCQkJaW5uZXIuY2xvc2UoKTsKLQkJCXByZXRlbmRGaWxlSXNTdGlsbE9wZW4gPSB0cnVlOwotCQl9Ci0gIAl9Ci0KLSAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gMDsKLQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGlubmVyLmF2YWlsYWJsZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSB7Ci0JCS8vIFN0b3AgYmVoYXZpbmcgYXMgaWYgdGhlIHN0cmVhbSB3ZXJlIHN0aWxsIG9wZW4uCi0JCXByZXRlbmRGaWxlSXNTdGlsbE9wZW4gPSBmYWxzZTsKLQl9IGVsc2UgewotCQlpZiAoaW5uZXIgIT0gbnVsbCkgewotCQkJZGVidWdUb3RhbE9wZW5TdHJlYW1Db3VudC0tOwotCQkJaW5uZXIuY2xvc2UoKTsKLQkJfQotCX0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkKLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm47Ci0JaGFzTWFya3MgPSB0cnVlOwotCXRyeSB7Ci0JCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCQlpbm5lci5tYXJrKHJlYWRsaW1pdCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpCi0gIHsKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIGZhbHNlOwotCXRyeSB7Ci0JCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCQlpZiAoaW5uZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaW5uZXIubWFya1N1cHBvcnRlZCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gLTE7Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCWludCBieXRlc1JlYWQgPSBpbm5lci5yZWFkKCk7Ci0JaWYgKGJ5dGVzUmVhZCA9PSAtMSAmJiAhaGFzTWFya3MpIGNsb3NlU3RyZWFtKCk7Ci0JcmV0dXJuIGJ5dGVzUmVhZDsKLSAgfQotCi0KLQlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gLTE7Ci0JCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCWludCBieXRlc1JlYWQgPSBpbm5lci5yZWFkKGIpOwotCQlpZiAoYnl0ZXNSZWFkID09IC0xICYmICFoYXNNYXJrcykgY2xvc2VTdHJlYW0oKTsKLQkJcmV0dXJuIGJ5dGVzUmVhZDsKLQl9Ci0KLSAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgeyAgICAKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIC0xOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlpbnQgYnl0ZXNSZWFkID0gaW5uZXIucmVhZChiLCBvZmYsIGxlbik7Ci0JaWYgKGJ5dGVzUmVhZCA9PSAtMSAmJiAhaGFzTWFya3MpIGNsb3NlU3RyZWFtKCk7Ci0JcmV0dXJuIGJ5dGVzUmVhZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlpbm5lci5yZXNldCgpOwotICB9Ci0KLSAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7ICAgCi0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAwOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gaW5uZXIuc2tpcChuKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9OZXN0ZWRWYWxpZGF0b3JDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL05lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyNzEwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL05lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi0KLS8qKgotICogQSBjb250ZXh0IGNsYXNzIGZvciB2YWxpZGF0b3JzIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IG9mCi0gKiBnaXZlbiB2YWxpZGF0aW9uIHNlc3Npb24uIEN1cnJlbnRseSB0aGlzIGNsYXNzIGlzIG9ubHkgdXNlZCB0byBpZGVudGlmeQotICogdGhlIHVuaXF1ZSBjb250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCAKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbkluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyZTFhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25NZXNzYWdlczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgbWVzc2FnZXMgZnJvbSBhIHZhbGlkYXRvci4gVGhpcyBjbGFzcyBjYW4gaGFuZGxlCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25JbmZvIGltcGxlbWVudHMgVmFsaWRhdGlvblJlcG9ydAotewotICBwcml2YXRlIGJvb2xlYW4gV1JBUFBFUl9FUlJPUl9TVVBQT1JUX0VOQUJMRUQgPSB0cnVlOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfRVJST1IgPSAwOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfV0FSTklORyA9IDE7Ci0gIAotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0aW5nX2ZpbGVfdXJpID0gbnVsbDsKLSAgcHJpdmF0ZSBVUkwgdmFsaWRhdGluZ19maWxlX3VybCA9IG51bGw7Ci0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0gIHByaXZhdGUgTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBIYXNoTWFwIG5lc3RlZE1lc3NhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgZmlsZSBmb3IgdGhlIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbkluZm8oU3RyaW5nIHVyaSkKLSAgewotICAgIGlmKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRoaXMudmFsaWRhdGluZ19maWxlX3VyaSA9IHVyaTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICB0aGlzLnZhbGlkYXRpbmdfZmlsZV91cmwgPSBuZXcgVVJMKHVyaSk7Ci0gICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRpbmdfZmlsZV91cmk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiB2YWxpZDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICBhZGRFcnJvcihtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIAotICAgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIFN0cmluZyBrZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsgICAgCi0gICAgaWYoYWRkTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgU0VWX0VSUk9SLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpKQotICAgIHsKLSAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBzdHJpbmcgbWVzc2FnZSBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHdhcm5pbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIGFkZFdhcm5pbmcobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBTdHJpbmcga2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7ICAgIAotICAgIGFkZE1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIFNFVl9XQVJOSU5HLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgbWVzc2FnZSB0byB0aGUgbGlzdC4gUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBsaXN0LgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSB0aGUgWGVyY2VzIGVycm9yIGtleSBmb3IgdGhpcyBlcnJvcgotICAgKiBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBlcnJvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG1lc3NhZ2Ugd2FzIHN1Y2Nlc3NmdWxseSBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBrZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsKLSAgICBib29sZWFuIHN1Y2Nlc3NmdWxseUFkZGVkID0gZmFsc2U7Ci0gICAgLy8gSWYgdGhlIG1lc3NhZ2UgaWYgbnVsbCB0aGVyZSBpcyBub3RoaW5nIHRvIGFkZC4KLSAgICBpZihtZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWxseUFkZGVkOwotICAgIH0KLSAgICBTdHJpbmcgZXJyb3JVUkkgPSBub3JtYWxpemUodXJpKTsKLSAgICBVUkwgZXJyb3JVUkwgPSBudWxsOwotICAgIGlmIChlcnJvclVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBlcnJvclVSTCA9IG5ldyBVUkwoZXJyb3JVUkkpOwotICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICAvL2Vycm9yVVJJID0gbm9ybWFsaXplVVJJKGVycm9yVVJJKTsKLSAgICB9Ci0gICAgLy9ib29sZWFuIGRvRGlhbG9nID0gdHJ1ZTsKLSAgICBpZiAoZXJyb3JVUkwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdWNjZXNzZnVsbHlBZGRlZCA9IHRydWU7Ci0gICAgICAvLyBBZGQgdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3QgaWYgbmVzdGVkIGVycm9yIHN1cHBvcnQgaXMgb2ZmIG9yCi0gICAgICAvLyB0aGlzIG1lc3NhZ2UgaXMgZm9yIHRoZSBjdXJyZW50IGZpbGUuCi0gICAgICBpZiAoIVdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEIHx8IHZhbGlkYXRpbmdfZmlsZV91cmwuc2FtZUZpbGUoZXJyb3JVUkwpKQotICAgICAgewotCi0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIHZhbG1lcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBsaW5lLAotICAgICAgICAgICAgY29sdW1uLCB2YWxpZGF0aW5nX2ZpbGVfdXJpLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICAgICAgICBpZiAoc2V2ZXJpdHkgPT0gU0VWX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsbWVzLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9OT1JNQUwpOwotICAgICAgICB9IGVsc2UgaWYgKHNldmVyaXR5ID09IFNFVl9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsbWVzLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpOwotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2VzLmFkZCh2YWxtZXMpOwotICAgICAgfQotICAgICAgLy8gSWYgbmVzdGVkIGVycm9yIHN1cHBvcnQgaXMgZW5hYmxlZCBjcmVhdGUgYSBuZXN0ZWQgZXJyb3IuCi0gICAgICBlbHNlIGlmIChXUkFQUEVSX0VSUk9SX1NVUFBPUlRfRU5BQkxFRCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5lc3RlZHVyaSA9IGVycm9yVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIG5lc3RlZG1lc3MgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgbGluZSwKLSAgICAgICAgICAgIGNvbHVtbiwgbmVzdGVkdXJpLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICAgICAgICBpZihzZXZlcml0eSA9PSBTRVZfV0FSTklORykKLSAgICAgICAgewotICAgICAgICAgIG5lc3RlZG1lc3Muc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTk9STUFMKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIGNvbnRhaW5lciA9IChWYWxpZGF0aW9uTWVzc2FnZSkgbmVzdGVkTWVzc2FnZXMuZ2V0KG5lc3RlZHVyaSk7Ci0gICAgICAgIGlmKGNvbnRhaW5lciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGFpbmVyID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlKE5MUy5iaW5kKFhNTFZhbGlkYXRpb25NZXNzYWdlcy5fVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSwgbmV3IE9iamVjdCBbXSB7IG5lc3RlZHVyaSB9KSwgMSwgMCwgbmVzdGVkdXJpKTsKLSAgICAgICAKLSAgICAgICAgICAvLyBJbml0aWFsbHkgc2V0IHRoZSBuZXN0ZWQgZXJyb3IgdG8gYSB3YXJuaW5nLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjaGFuZ2VkCi0gICAgICAgICAgLy8gdG8gYW4gZXJyb3IgaWYgYSBuZXN0ZWQgbWVzc2FnZSBoYXMgYSBzZXZlcml0eSBvZiBlcnJvci4KLSAgICAgICAgICBjb250YWluZXIuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0gICAgICAgICAgbmVzdGVkTWVzc2FnZXMucHV0KG5lc3RlZHVyaSwgY29udGFpbmVyKTsKLSAgICAgICAgICBtZXNzYWdlcy5hZGQoY29udGFpbmVyKTsKLSAgICAgICAgfQotICAgICAgICBjb250YWluZXIuYWRkTmVzdGVkTWVzc2FnZShuZXN0ZWRtZXNzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN1Y2Nlc3NmdWxseUFkZGVkOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEFkZCBhIG5lc3RlZCBtZXNzYWdlIHRvIHRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHN0cmluZyBtZXNzYWdlIG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGROZXN0ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgaW50IHNldmVyaXR5KQotLy8gIHsKLS8vICAgIFZhbGlkYXRpb25NZXNzYWdlIG5lc3RlZG1lc3MgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmkpOwotLy8gICAgaWYoc2V2ZXJpdHkgPT0gU0VWX1dBUk5JTkcpCi0vLyAgICB7Ci0vLyAgICAgIG5lc3RlZG1lc3Muc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICB7Ci0vLyAgICAgIG5lc3RlZG1lc3Muc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX05PUk1BTCk7Ci0vLyAgICB9Ci0vLyAgICBWYWxpZGF0aW9uTWVzc2FnZSBjb250YWluZXIgPSAoVmFsaWRhdGlvbk1lc3NhZ2UpbmVzdGVkTWVzc2FnZXMuZ2V0KHVyaSk7Ci0vLyAgICBpZihjb250YWluZXIgPT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgY29udGFpbmVyID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlKFhNTENvcmVWYWxpZGF0aW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKF9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFLCB1cmkpLCAxLCAwLCB2YWxpZGF0aW5nX2ZpbGVfdXJpKTsKLS8vICAgICAgLy8gSW5pdGlhbGx5IHNldCB0aGUgbmVzdGVkIGVycm9yIHRvIGEgd2FybmluZy4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2hhbmdlZAotLy8gICAgICAvLyB0byBhbiBlcnJvciBpZiBhIG5lc3RlZCBtZXNzYWdlIGhhcyBhIHNldmVyaXR5IG9mIGVycm9yLgotLy8gICAgICBjb250YWluZXIuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0vLyAgICAgIG5lc3RlZE1lc3NhZ2VzLnB1dCh1cmksIGNvbnRhaW5lcik7Ci0vLyAgICAgIG1lc3NhZ2VzLmFkZChjb250YWluZXIpOwotLy8gICAgfQotLy8gICAgY29udGFpbmVyLmFkZE5lc3RlZE1lc3NhZ2UobmVzdGVkbWVzcyk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydCNnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlW10gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiAoVmFsaWRhdGlvbk1lc3NhZ2VbXSltZXNzYWdlcy50b0FycmF5KG5ldyBWYWxpZGF0aW9uTWVzc2FnZVttZXNzYWdlcy5zaXplKCldKTsKLSAgfQotCi0gIHB1YmxpYyBIYXNoTWFwIGdldE5lc3RlZE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBuZXN0ZWRNZXNzYWdlczsKLSAgfQotICAKLSAgLyoqCi0gICAqIFB1dCB0aGUgVVJJIGluIGEgc3RhbmRhcmQgZm9ybWF0LgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIHB1dCBpbnRvIGEgc3RhbmRhcmQgZm9ybWF0LgotICAgKiBAcmV0dXJuIFRoZSBzdGFuZGFyZCBmb3JtYXQgb2YgdGhlIFVSSS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgdXJpKQotICB7Ci0vLyAgICBpZih1cmkuc3RhcnRzV2l0aCgicGxhdGZvcm06IikpCi0vLyAgICB7Ci0vLyAgICAgIHRyeQotLy8gICAgICB7Ci0vLyAgICAgICAgdXJpID0gUGxhdGZvcm0ucmVzb2x2ZShuZXcgVVJMKHVyaSkpLnRvU3RyaW5nKCk7Ci0vLyAgICAgIH0KLS8vICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0vLyAgICAgIHsKLS8vICAgICAgfQotLy8gICAgfQotICAgIHVyaSA9IHVyaS5yZXBsYWNlQWxsKCIlMjAiLCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHVyaSA9IHVyaS5yZXBsYWNlQWxsKCIlNUUiLCAiXiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB1cmkgPSB1cmkucmVwbGFjZSgnXFwnLCcvJyk7Ci0gICAgCi0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxZGNmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBBIGNsYXNzIGZvciBob2xkaW5nIHZhbGlkYXRpb24gbWVzc2FnZSBpbmZvcm1hdGlvbi4gSG9sZHMgdGhlIG1lc3NhZ2UgYW5kIHRoZQotICogbWVzc2FnZSBsb2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBFUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKCJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24iLCAiZXJyb3JNZXNzYWdlTWFwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0gIHByb3RlY3RlZCBpbnQgbGluZU51bWJlcjsKLSAgcHJvdGVjdGVkIGludCBjb2x1bW5OdW1iZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJpOwotICBwcm90ZWN0ZWQgTGlzdCBuZXN0ZWRFcnJvcnM7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2V5OwotICBwcm90ZWN0ZWQgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50czsKLSAgcHJvdGVjdGVkIGludCBzdGFydE9mZnNldDsKLSAgcHJvdGVjdGVkIGludCBzZXZlcml0eSA9IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLSAgcHVibGljIHN0YXRpYyBpbnQgU0VWX0hJR0ggPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfTk9STUFMID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfTE9XID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKLSAgewotICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCBudWxsKTsKLSAgfQotCi0gIC8qKiAKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW5OdW1iZXIgVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlIGlzIGZvci4KLSAgICovCi0gICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCB1cmksIG51bGwsIG51bGwpOwotICB9Ci0gICAKLSAgIC8qKiAKLSAgICAqIENvbnN0cnVjdG9yLgotICAgICogCi0gICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICAqIEBwYXJhbSBsaW5lTnVtYmVyIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlIGlzIGZvci4KLSAgICAqIEBwYXJhbSBrZXkgYSB1bmlxdWUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3IKLSAgICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIHRoZSBhcmd1bWVudHMgWGVyY2VzIHVzZXMgdG8gY3JlYXRlIHRoZSBtZXNzYWdlCi0gICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgdXJpLCBTdHJpbmcga2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICAgewotICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgICB0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgIHRoaXMua2V5ID0ga2V5OwotCSB0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotICAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gMDsgICAgCi0gICB9Ci0gICAKLQotICAvKioKLSAgICogR2V0IHRoZSBtZXNzYWdlIGZvciB0aGlzIHZhbGlhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb2x1bW4gbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbk51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpbmUgbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gIHsKLSAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHVyaSBmb3IgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVcmkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2UgVGhlIHZhbGlkYXRpb24gbWVzc2FnZSB0byBhZGQgYXMgYSBuZXN0ZWQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5lc3RlZE1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UpCi0gIHsKLSAgICBpZiAobmVzdGVkRXJyb3JzID09IG51bGwpCi0gICAgewotICAgICAgbmVzdGVkRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLSAgICBuZXN0ZWRFcnJvcnMuYWRkKHZhbGlkYXRpb25NZXNzYWdlKTsKLSAgICBpbnQgdmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0gICAgaWYodmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9PSBTRVZfTk9STUFMIHx8IHZhbGlkYWl0b25tZXNzYWdlU2V2ZXJpdHkgPT0gU0VWX0hJR0gpCi0gICAgewotICAgICAgc2V0U2V2ZXJpdHkoU0VWX05PUk1BTCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXROZXN0ZWRNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gbmVzdGVkRXJyb3JzICE9IG51bGwgPyBuZXN0ZWRFcnJvcnMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzZXZlcml0eSBvZiB0aGUgZGVmZWN0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2V2ZXJpdHkgb2YgdGhlIGRlZmVjdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKQotICB7Ci0gIAlyZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHNldiBUaGUgc2V2ZXJpdHkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldikKLSAgewotICAJc2V2ZXJpdHkgPSBzZXY7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBvZmZzZXQpCi0gIHsKLSAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBrZXkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gIHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0TWVzc2FnZUFyZ3VtZW50cygpCi0gIHsKLQkgIHJldHVybiB0aGlzLm1lc3NhZ2VBcmd1bWVudHM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uUmVwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiMTU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhIHZhbGlkYXRpb24gcmVwb3J0LgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblJlcG9ydAotewotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvciB0aGUgZmlsZSB0aGUgcmVwb3J0IHJlZmVycyB0by4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhlIHJlcG9ydCByZWZlcnMgdG8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpbGUgaXMgdmFsaWQuIFRoZSBmaWxlIG1heSBoYXZlIHdhcm5pbmdzIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKTsKLSAgCi0gIHB1YmxpYyBIYXNoTWFwIGdldE5lc3RlZE1lc3NhZ2VzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Db21tYW5kTGluZUxvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0NvbW1hbmRMaW5lTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzhmMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0NvbW1hbmRMaW5lTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLS8qKgotICogQSBsb2dnZXIgdGhhdCB3aWxsIHByaW50IGxvZyBpbmZvIHRvIFN5c3RlbS5vdXQuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lTG9nZ2VyIGltcGxlbWVudHMgSUxvZ2dlcgotewotICBwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IsIFRocm93YWJsZSBleGNlcHRpb24pCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3IpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGNlcHRpb24udG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyB3YXJuaW5nLCBUaHJvd2FibGUgZXhjZXB0aW9uKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHdhcm5pbmcpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGNlcHRpb24udG9TdHJpbmcoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9FY2xpcHNlTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvRWNsaXBzZUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzNjZjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9FY2xpcHNlTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotCi0KLS8qKgotICogQSBsb2dnZXIgdGhhdCB3aWxsIGxvZyB0byB0aGUgbG9nIGZpbGUgaW4gdGhlIGVjbGlwc2UgbWV0YWRhdGEgZGlyZWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIKLXsKLSAgCi0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBlcnJvciwgZXhjZXB0aW9uKSk7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgd2FybmluZywgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuV0FSTklORywgd2FybmluZywgZXhjZXB0aW9uKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFhNDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5sb2dnaW5nOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgc3RhbmRhcmQgbG9nZ2VyLiBBbGxvd3MgZm9yIGxvZ2dpbmcgZXJyb3JzIGFuZCB3YXJuaW5ncy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2dnZXIKLXsKLSAgLyoqCi0gICAqIExvZyBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBtZXNzYWdlIHRvIGxvZy4KLSAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbik7Ci0KLSAgLyoqCi0gICAqIExvZyBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSB3YXJuaW5nIFRoZSB3YXJuaW5nIG1lc3NhZ2UgdG8gbG9nLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgd2FybmluZywgVGhyb3dhYmxlIGV4Y2VwdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvTG9nZ2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0xvZ2dlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1NDllMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvTG9nZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLS8qKgotICogVGhlIGxvZ2dlciBmYWN0b3J5IGFsbG93cyBmb3Igc2ltcGxlIHVzZSBvZiB3aGF0ZXZlciBsb2dnaW5nIG1lY2hhbmlzbSBpcyBpbgotICogcGxhY2UuIFRoZSB0b29sIGNhbiBzcGVjaWZ5IGEgY3VzdG9tIGxvZ2dpbmcgY2xhc3MgYW5kIGNhbiByZXF1ZXN0IHRoZQotICogbG9nZ2VyIGZyb20gdGhpcyBjbGFzcy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICogCi0gKiBAZGVwcmVjYXRlZCAtIG5vdCB1c2VkIGluIFdUUCBvciBieSBhbnkgYWRvcHRlcnMgYXMgb2YgOS8xMi8yMDA3Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXJGYWN0b3J5Ci17Ci0gIHByaXZhdGUgc3RhdGljIElMb2dnZXIgICAgICBsb2dnZXIgICAgICAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyICBjbGFzc2xvYWRlciAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyAgICAgICBsb2dnZXJDbGFzcyAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb21tYW5kbGluZWxvZ2dlciA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5sb2dnaW5nLkNvbW1hbmRMaW5lTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZWNsaXBzZWxvZ2dlciAgICAgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUubG9nZ2luZy5FY2xpcHNlTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgICAgICAgZGVmYXVsdGxvZ2dlciAgICAgPSBjb21tYW5kbGluZWxvZ2dlcjsKLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGxvZ2dlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgbG9nZ2VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJTG9nZ2VyIGdldExvZ2dlckluc3RhbmNlKCkKLSAgewotICAgIGlmKGxvZ2dlciA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmKGxvZ2dlckNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmKGNsYXNzbG9hZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBsYyA9IGNsYXNzbG9hZGVyLmxvYWRDbGFzcyhsb2dnZXJDbGFzcyk7Ci0gICAgICAgICAgICBsb2dnZXIgPSAoSUxvZ2dlcikgbGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYobG9nZ2VyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBsYyA9IExvZ2dlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobG9nZ2VyQ2xhc3MpOwotICAgICAgICAgICAgbG9nZ2VyID0gKElMb2dnZXIpIGxjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZihsb2dnZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDbGFzcyBsYyA9IExvZ2dlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZGVmYXVsdGxvZ2dlcik7Ci0gICAgICAgICAgbG9nZ2VyID0gKElMb2dnZXIpIGxjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTcGVjaWZ5IHRoZSBsb2dnZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZC4KLSAgICogCi0gICAqIEBwYXJhbSBjbGFzc25hbWUKLSAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbG9nZ2VyIGNsYXNzLgotICAgKiBAcGFyYW0gbG9nZ2VyY2xhc3Nsb2FkZXIKLSAgICogICAgICAgICAgICBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIGxvZ2dlci4gSWYgbnVsbCwgdGhlIGRlZmF1bHQKLSAgICogICAgICAgICAgICBjbGFzc2xvYWRlciB3aWxsIGJlIHVzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc3BlY2lmeUxvZ2dlcihTdHJpbmcgY2xhc3NuYW1lLCBDbGFzc0xvYWRlciBsb2dnZXJjbGFzc2xvYWRlcikKLSAgewotICAgIGxvZ2dlckNsYXNzID0gY2xhc3NuYW1lOwotICAgIGNsYXNzbG9hZGVyID0gbG9nZ2VyY2xhc3Nsb2FkZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBkZWZhdWx0IGxvZ2dlciB0byB0aGUgZWNsaXBzZSBsb2dnZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdXNlRWNsaXBzZUxvZ2dlcigpCi0gIHsKLSAgICBkZWZhdWx0bG9nZ2VyID0gZWNsaXBzZWxvZ2dlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE2NDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLkVycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnLWluIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggZXh0ZW5zaW9uCi0gKiBlcnJvciBjdXN0b21pemVyIHdpdGggdGhlIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIgewotCQotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImVycm9yQ3VzdG9taXplciI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZ05hbWUgPSBFWFRFTlNJT05fUE9JTlRfSUQ7Ci0KLQkgIC8qKgotCSAgICogUmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBmb3IgdGhlIGVycm9yY3VzdG9taXplciBleHRlbnNpb24uCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0JICB7Ci0JICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkgICAgaWYgKHBvaW50ICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JICAgICAgewotCSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCi0JICAvKioKLQkgICAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3aXRoIGFuIGV4dGVuc2lvbiBsaWtlOgotCSAgICoKLQkgICAqIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5lcnJvckN1c3RvbWl6ZXIiCi0JICAgKiAgICAgICAgICAgIGlkPSJzcGVjaWZpY0Vycm9yQ3VzdG9taXplciIKLQkgICAqICAgICAgICAgICAgbmFtZT0iU3BlY2lmaWMgRXJyb3IgQ3VzdG9taXplciI+Ci0JICAgKiAgIDxlcnJvckN1c3RvbWl6ZXIKLQkgICAqICAgCQkJbmFtZXNwYWNlPSJodHRwOi8vc3BlY2lmaWNuYW1lc3BhY2UiCi0JICAgKiAgIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuTXlTcGVjaWZpY0Vycm9yQ3VzdG9taXplci8+Ci0JICAgKiA8L2V4dGVuc2lvbj4KLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JICB7Ci0JICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0JICAgIHsKLQkgICAgICBTdHJpbmcgZXJyb3JDdXN0b21pemVyQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRVNQQUNFKTsKLQotCSAgICAgIGlmIChlcnJvckN1c3RvbWl6ZXJDbGFzcyAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHRyeQotCSAgICAgICAgewotCSAgICAgICAgICBCdW5kbGUgcGx1Z2luQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCSAgICAgICAgICBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlKHBsdWdpbkJ1bmRsZSwgZXJyb3JDdXN0b21pemVyQ2xhc3MpOwotCSAgICAgICAgICBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmFkZEVycm9yTWVzc2FnZUN1c3RvbWl6ZXIobmFtZXNwYWNlLCBkZWxlZ2F0ZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICAgICAgICB7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlYWZhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9WQUxJREFUT1JfQ09OVEVYVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudmFsaWRhdG9yQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIGludCBpbmRpY2F0ZU5vR3JhbW1hciA9IDA7Ci0gIAotICAvKioKLSAgICogU2V0IGFueSBwcmVmZXJlbmNlcyBmb3IgWE1MIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3Ijc2V0dXBWYWxpZGF0aW9uKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldHVwVmFsaWRhdGlvbihOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIAotICB7Ci0Jc3VwZXIuc2V0dXBWYWxpZGF0aW9uKGNvbnRleHQpOwotCWluZGljYXRlTm9HcmFtbWFyID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRJQ0FURV9OT19HUkFNTUFSKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29udGV4dCwgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0LCBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCkKLSAgewotICAgIFhNTFZhbGlkYXRvciB2YWxpZGF0b3IgPSBYTUxWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotICAgIFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSU5ESUNBVEVfTk9fR1JBTU1BUiwgaW5kaWNhdGVOb0dyYW1tYXIpOwotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBUT0RPOiBVbmFibGUgdG8gc2V0IHRoZSBwcmVmZXJlbmNlLiBMb2cgdGhpcyBwcm9ibGVtLgotICAgIH0KLSAgICAKLSAgICBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IG51bGw7Ci0gICAgaWYgKGlucHV0c3RyZWFtICE9IG51bGwpCi0gICAgewotICAgICAgdmFscmVwb3J0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbmZpZ3VyYXRpb24sIHJlc3VsdCwgY29udGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YWxyZXBvcnQgPSB2YWxpZGF0b3IudmFsaWRhdGUodXJpLCBudWxsLCBjb25maWd1cmF0aW9uLCByZXN1bHQsIGNvbnRleHQpOwotICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHZhbHJlcG9ydDsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBTdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBtZXNzYWdlIHBhcmFtZXRlcnMuIEZvciBYTUwgdmFsaWRhdGlvbiB0aGVyZQotICAgKiBhcmUgdGhyZWUgYWRkaXRpb25hbCBwaWVjZXMgb2YgaW5mb3JtYXRpb24gdG8gc3RvcmU6Ci0gICAqIHBhcmFtWzBdID0gdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGVycm9yCi0gICAqIHBhcmFtWzFdID0gdGhlICdzcXVpZ2dsZSBzZWxlY3Rpb24gc3RyYXRlZ3knIGZvciB3aGljaCBET00gcGFydCB0byBzcXVpZ2dsZQotICAgKiBwYXJhbVsyXSA9IHRoZSBuYW1lIG9yIHZhbHVlIG9mIHdoYXQgaXMgdG8gYmUgc3F1aWdnbGVkCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjYWRkSW5mb1RvTWVzc2FnZShvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkSW5mb1RvTWVzc2FnZShWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSwgSU1lc3NhZ2UgbWVzc2FnZSkKLSAgeyAKLQlTdHJpbmcga2V5ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0S2V5KCk7Ci0JaWYoa2V5ICE9IG51bGwpCi0JewotICAgICAgWE1MTWVzc2FnZUluZm9IZWxwZXIgbWVzc2FnZUluZm9IZWxwZXIgPSBuZXcgWE1MTWVzc2FnZUluZm9IZWxwZXIoKTsKLSAgICAgIFN0cmluZ1tdIG1lc3NhZ2VJbmZvID0gbWVzc2FnZUluZm9IZWxwZXIuY3JlYXRlTWVzc2FnZUluZm8oa2V5LCB2YWxpZGF0aW9uTWVzc2FnZS5nZXRNZXNzYWdlQXJndW1lbnRzKCkpOwotICAgICAgCi0gICAgICBtZXNzYWdlLnNldEF0dHJpYnV0ZShDT0xVTU5fTlVNQkVSX0FUVFJJQlVURSwgbmV3IEludGVnZXIodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKLSAgICAgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKFNRVUlHR0xFX1NFTEVDVElPTl9TVFJBVEVHWV9BVFRSSUJVVEUsIG1lc3NhZ2VJbmZvWzBdKTsKLSAgICAgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKFNRVUlHR0xFX05BTUVfT1JfVkFMVUVfQVRUUklCVVRFLCBtZXNzYWdlSW5mb1sxXSk7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBuZXN0ZWQgdmFsaWRhdGlvbiBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIHN0YXRlCi0gICAqICAgICAgICAgIHRoZSB2YWxpZGF0aW9uIHN0YXRlLgotICAgKiBAcGFyYW0gY3JlYXRlCi0gICAqICAgICAgICAgIHdoZW4gdHJ1ZSwgYSBuZXcgY29udGV4dCB3aWxsIGJlIGNyZWF0ZWQgaWYgb25lIGlzIG5vdCBmb3VuZAotICAgKiBAcmV0dXJuIHRoZSBuZXN0ZWQgdmFsaWRhdGlvbiBjb250ZXh0LgotICAgKi8KLSAgcHJvdGVjdGVkIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgZ2V0TmVzdGVkQ29udGV4dChWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIGJvb2xlYW4gY3JlYXRlKQotICB7Ci0gICAgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLSAgICBPYmplY3QgbyA9IHN0YXRlLmdldChYTUxfVkFMSURBVE9SX0NPTlRFWFQpOwotICAgIGlmIChvIGluc3RhbmNlb2YgWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICAgIGNvbnRleHQgPSAoWE1MTmVzdGVkVmFsaWRhdG9yQ29udGV4dClvOwotICAgIGVsc2UgaWYgKGNyZWF0ZSkKLSAgICB7Ci0gICAgICBjb250ZXh0ID0gbmV3IFhNTE5lc3RlZFZhbGlkYXRvckNvbnRleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbnRleHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRpb25TdGFydGluZyhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgewotICAgIGlmIChwcm9qZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0ID0gZ2V0TmVzdGVkQ29udGV4dChzdGF0ZSwgZmFsc2UpOwotICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29udGV4dCA9IGdldE5lc3RlZENvbnRleHQoc3RhdGUsIHRydWUpOwotICAgICAgICBzZXR1cFZhbGlkYXRpb24oY29udGV4dCk7Ci0gICAgICAgIHN0YXRlLnB1dChYTUxfVkFMSURBVE9SX0NPTlRFWFQsIGNvbnRleHQpOwotICAgICAgfQotICAgICAgc3VwZXIudmFsaWRhdGlvblN0YXJ0aW5nKHByb2plY3QsIHN0YXRlLCBtb25pdG9yKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gIHsKLSAgICBpZiAocHJvamVjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIHN1cGVyLnZhbGlkYXRpb25GaW5pc2hpbmcocHJvamVjdCwgc3RhdGUsIG1vbml0b3IpOwotICAgICAgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0ID0gZ2V0TmVzdGVkQ29udGV4dChzdGF0ZSwgZmFsc2UpOwotICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGVhcmRvd25WYWxpZGF0aW9uKGNvbnRleHQpOwotICAgICAgICBzdGF0ZS5wdXQoWE1MX1ZBTElEQVRPUl9DT05URVhULCBudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4MjUxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hNTE1lc3NhZ2VJbmZvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotLyoqCi0gKiBUaGUgbWVzc2FnZSBpbmZvIGhlbHBlciBkZXRlcm1pbmVzIHRoZSBzZWxlY3Rpb24gc3RyYXRlZ3kgZm9yIGVsZW1lbnRzCi0gKiBpbiBhIFNTRSBlZGl0b3IuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWE1MTWVzc2FnZUluZm9IZWxwZXIKLXsKLSAgcHVibGljIFhNTE1lc3NhZ2VJbmZvSGVscGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHNob3VsZCBiZSB1bmRlcmxpbmVkIHdpdGggdGhlIHJlZCAic3F1aWdnbGVzIgotICAgKiAgdXNpbmcgdGhlIGVycm9yS2V5LCBhbmQgdGhlIG1lc3NhZ2VBcmd1bWVudHMuCi0gICAqICA8YnI+UG9zaXRpb24gMCBvZiB0aGUgYXJyYXkgcmV0dXJuZWQgY29udGFpbnMgdGhlIHNlbGVjdGlvbiBTdHJhdGVneSwgb3Igd2hhdCBET00gRWxlbWVudCB0byB1bmRlcmxpbmUuICAKLSAgICogIEZvciBleGFtcGxlICJBVFRSSUJVVEVfTkFNRSIgIAotICAgKiAgPGJyPlBvc2l0aW9uIDEgY29udGFpbnMgdGhlIG5hbWUgb3IgdmFsdWUgdG8gc3F1aWdnbGUuCi0gICAqICA8cD5Gb3IgZXhhbXBsZSwgaWYgd2Ugd2FudGVkIHRvIHNxdWlnZ2xlIHRoZSBhdHRyaWJ1dGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgbmFtZQotICAgKiAgZm9vIHRoaXMgbWV0aG9kIHdvdWxkIHJldHVybiB7IkFUVFJJQlVURV9OQU1FIiwgImZvbyJ9Ci0gICAqICA8L3A+Ci0gICAqICBAcGFyYW0gZXJyb3JLZXkgCi0gICAqICAJCVRoZSBlcnJvciBrZXkgZ2l2ZW4gYnkgdGhlIFhlcmNlcyBwYXJzZXIuCi0gICAqICBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyAKLSAgICogIAkJVGhlIGFyZ3VtZW50cyB1c2VkIGJ5IFhlcmNlcyB0byAiZmlsbCBpbiB0aGUgYmxhbmtzIiBvZiB0aGVpciBtZXNzYWdlcy4KLSAgICogIEByZXR1cm4gCi0gICAqICAJCUFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHNxdWlnZ2xlIGluZm9ybWF0aW9uLgotICAgKiAgQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcgotICAgKiAgCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gY3JlYXRlTWVzc2FnZUluZm8oU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7IAotICAgIFN0cmluZyBzZWxlY3Rpb25TdHJhdGVneSA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWVPclZhbHVlID0gbnVsbDsKLSAgICAKLSAgICBpZihlcnJvcktleSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmEiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmQiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmIiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19DT05URU5UX0lOVkFMSUQiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0gICAgICAgIHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQ09OVEVOVF9JTkNPTVBMRVRFIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfUkVRVUlSRURfQVRUUklCVVRFX05PVF9TUEVDSUZJRUQiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuNCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgewotICAgICAgICBzZWxlY3Rpb25TdHJhdGVneSA9ICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy10eXBlLjMuMS4zIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiVEVYVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4yLjMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJGSVJTVF9OT05fV0hJVEVTUEFDRV9URVhUIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtdHlwZS4zLjEuMSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkFMTF9BVFRSSUJVVEVTIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjMuMi4yIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQVRUUklCVVRFX05PVF9ERUNMQVJFRCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JICAgIC8vaW4gdGhpcyBjYXNlIHdlIG5lZWQgbmFtZU9yVmFsdWUgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byB1bmRlcmxpbmUKLQkgICAgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1hdHRyaWJ1dGUuMyIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX0FUVFJJQlVURV9WQUxVRV9OT1RfSU5fTElTVCIpIHx8IGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4zLjEiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIHsJCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9WQUxVRSI7ICAgLy8kTk9OLU5MUy0xJAotCQkvL2luIHRoaXMgY2FzZSB3ZSBuZWVkIG5hbWVPclZhbHVlIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBBdHRyaWJ1dGUKLSAgICAJaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWF0dHJpYnV0ZS4zIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjMuMSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAJeyAKLSAgICAJICBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1sxXTsKLSAgICAJfQotICAgIAllbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIk1TR19BVFRSSUJVVEVfVkFMVUVfTk9UX0lOX0xJU1QiKSkgLy8kTk9OLU5MUy0xJAotICAgIAl7CQotICAgIAkgIG5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzBdOwotICAgIAl9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1lbHQuNC4yIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsJCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5PSJWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQkJLy9pbiB0aGlzIGNhc2Ugd2UgbmVlZCBuYW1lT3JWYWx1ZSB0byBiZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB3ZSB3YW50IHRvIHVuZXJsaW5lCi0gICAgCW5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzFdOwkKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRW50aXR5Tm90RGVjbGFyZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAgCQotICAgIAlzZWxlY3Rpb25TdHJhdGVneT0iVEVYVF9FTlRJVFlfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1swXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRWxlbWVudFVudGVybWluYXRlZCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkVOVElSRV9FTEVNRU5UIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJFVGFnVW50ZXJtaW5hdGVkIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJFVGFnUmVxdWlyZWQiKSkgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiRU5EX1RBRyI7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBTdHJpbmcgbWVzc2FnZUluZm9bXSA9IG5ldyBTdHJpbmdbMl07Ci0gICAgbWVzc2FnZUluZm9bMF0gPSBzZWxlY3Rpb25TdHJhdGVneSAhPSBudWxsPyBzZWxlY3Rpb25TdHJhdGVneTogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBtZXNzYWdlSW5mb1sxXSA9IG5hbWVPclZhbHVlOwotICAgIHJldHVybiBtZXNzYWdlSW5mbzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODEwNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YTUxWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotCi0vKioKLSAqIEFuIFhNTCB2YWxpZGF0b3Igc3BlY2lmaWMgdG8gRWNsaXBzZS4gVGhpcyB2YWxpZGF0b3Igd2lsbCB3cmFwIHRoZSBpbnRlcm5hbAotICogWE1MIHZhbGlkYXRvciBhbmQgcHJvdmlkZSBhdXRvbWF0aWMgVVJJIHJlc29sdXRpb24gc3VwcG9ydC4gVGhpcyBjbGFzcyBhbHNvCi0gKiByZWFkcyBmcm9tIHRoZSBwbHVnLWluIHJlZ2lzdHJ5IGFuZCByZWdpc3RlcnMgYWxsIGVycm9yIGN1c3RvbWl6ZXJzIHdpdGggdGhlCi0gKiByZWdpc3RyeS4KLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRvcgotewotICBwcml2YXRlIHN0YXRpYyBYTUxWYWxpZGF0b3IgaW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBYTUwgdmFsaWRhdG9yLiBUaGUgdmFsaWRhdG9yCi0gICAqIGNhbiBiZSByZXVzZWQgYW5kIGNhbm5vdCBiZSBjdXN0b21pemVkIHNvIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBpbnN0YW5jZSBvZiBpdC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgWE1MIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWE1MVmFsaWRhdG9yIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgWE1MVmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IuIENyZWF0ZSB0aGUgWE1MIHZhbGlkYXRvciwgc2V0IHRoZSBVUkkgcmVzb2x2ZXIgYW5kCi0gICAqIGdldCB0aGUgZXh0ZW5zaW9uIGVycm9yIGN1c3RvbWl6ZXJzIGZyb20gdGhlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTFZhbGlkYXRvcigpCi0gIHsKLSAgICBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpKTsKLSAgICBuZXcgRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0VsZW1lbnRJbmZvcm1hdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0VsZW1lbnRJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDljOTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FbGVtZW50SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIHNpbXBsZSBjbGFzcyB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbmZvcm1hdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIEVsZW1lbnRJbmZvcm1hdGlvbihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgdGhpcy5uYW1lc3BhY2UgPSB1cmk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG5hbWVzcGFjZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLQlyZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsb2NhbCBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgbG9jYWwgbmFtZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2FsbmFtZSgpCi0gIHsKLQlyZXR1cm4gbG9jYWxOYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudC4gVGhlIGxpc3QgY29udGFpbnMKLSAgICogRWxlbWVudEluZm9ybWF0aW9uIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0JcmV0dXJuIGNoaWxkcmVuOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWFjYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRyYWNrcyB0aGUgY29udGV4dCBvZiB0aGUgcGFyc2VkIGRvY3VtZW50IHRvIGhlbHAgaWRlbnRpZnkgZXJyb3IKLSAqIGNvbmRpdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIKLXsKLSAgcHJvdGVjdGVkIFN0YWNrIGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gIHByb3RlY3RlZCBFcnJvck1lc3NhZ2VJbmZvcm1hdGlvbiBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbjsKLQotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgc3RhcnQgZWxlbWVudCBtZXRob2Qgb2YgdGhlIFhNTCB2YWxpZGF0b3IncwotICAgKiBjb250ZW50IGhhbmRsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsgCi0gICAgRWxlbWVudEluZm9ybWF0aW9uIGVsZW1lbnRJbmZvcm1hdGlvbiA9IG5ldyBFbGVtZW50SW5mb3JtYXRpb24odXJpLCBsb2NhbE5hbWUpOwotICAgIGlmIChlbGVtZW50SW5mb3JtYXRpb25TdGFjay5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIEVsZW1lbnRJbmZvcm1hdGlvbiBwYXJlbnQgPSAoRWxlbWVudEluZm9ybWF0aW9uKSBlbGVtZW50SW5mb3JtYXRpb25TdGFjay5wZWVrKCk7Ci0gICAgICBwYXJlbnQuY2hpbGRyZW4uYWRkKGVsZW1lbnRJbmZvcm1hdGlvbik7Ci0gICAgfQotICAgIGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnB1c2goZWxlbWVudEluZm9ybWF0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBlbmQgZWxlbWVudCBtZXRob2Qgb2YgdGhlIFhNTCB2YWxpZGF0b3IncwotICAgKiBjb250ZW50IGhhbmRsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7ICAgCi0gICAgaWYgKGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnNpemUoKSA+IDApCi0gICAgewotICAgICAgRWxlbWVudEluZm9ybWF0aW9uIGVsZW1lbnRJbmZvcm1hdGlvbiA9IChFbGVtZW50SW5mb3JtYXRpb24pZWxlbWVudEluZm9ybWF0aW9uU3RhY2sucG9wKCk7Ci0gICAgICBpZiAobWVzc2FnZUZvckNvbnNpZGVyYXRpb24gIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcltdIGN1c3RvbWl6ZXJzID0gRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDdXN0b21pemVycyhlbGVtZW50SW5mb3JtYXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBpbnQgbnVtQ3VzdG9taXplcnMgPSBjdXN0b21pemVycy5sZW5ndGg7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1DdXN0b21pemVyczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBjdXN0b21pemVyc1tpXS5jdXN0b21pemVNZXNzYWdlKGVsZW1lbnRJbmZvcm1hdGlvbiwgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24ua2V5LCBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbi5hcmd1bWVudHMpOwotICAgICAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgIAltZXNzYWdlRm9yQ29uc2lkZXJhdGlvbi5tZXNzYWdlLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIAlicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zaWRlciB0aGUgcmVwb3J0ZWQgZXJyb3IgZm9yIGN1c3RvbWl6YXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdmFsSW5mbwotICAgKiAJCVRoZSBjdXJyZW50IFZhbGlkYXRpb25JbmZvIG9iamVjdCBjb250YWluaW5nIHZhbGlkYXRpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSBrZXkKLSAgICogCQlUaGUga2V5IHJlbGF0ZWQgdG8gdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBhcmd1bWVudHMKLSAgICogCQlBbnkgbWVzc2FnZSBhcmd1bWVudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb25zaWRlclJlcG9ydGVkRXJyb3IoVmFsaWRhdGlvbkluZm8gdmFsSW5mbywgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzKQotICB7Ci0gICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24gPSBudWxsOwotICAgIFZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMgPSB2YWxJbmZvLmdldFZhbGlkYXRpb25NZXNzYWdlcygpOwotICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPiAwKQotICAgIHsgIAotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24gPSBuZXcgRXJyb3JNZXNzYWdlSW5mb3JtYXRpb24oKTsKLSAgICAgIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLmtleSA9IGtleTsKLSAgICAgIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKLSAgICAgIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLm1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTsgCi0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQSBzaW1wbGUgY2xhc3MgdG8gaG9sZCBlcnJvciBtZXNzYWdlIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIGNsYXNzIEVycm9yTWVzc2FnZUluZm9ybWF0aW9uCi0gIHsKLQlwdWJsaWMgU3RyaW5nIGtleSA9IG51bGw7Ci0JcHVibGljIE9iamVjdFtdIGFyZ3VtZW50cyA9IG51bGw7Ci0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDk0ODc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIGVycm9yIGN1c3RvbWl6YXRpb24gcmVnc2l0cnkgbWFuYWdlcyBhbGwgcmVnaXN0ZXJlZAotICogSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXJzIGJ5IG5hbWVzcGFjZS4KLSAqLwotcHVibGljIGNsYXNzIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5IAotewotICBwcm90ZWN0ZWQgc3RhdGljIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbnVsbDsKLSAgcHJvdGVjdGVkIE1hcCBjdXN0b21pemVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICAvKioKLSAgICogUmVzdHJpY3RlZCBjb25zdHJ1Y3RvciBpbiBrZWVwaW5nIHdpdGggdGhlIHNpbmdsZXRvbiBwYXR0ZXJuLgotICAgKi8KLSAgcHJvdGVjdGVkIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCkKLSAgewotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJCVRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLQlpZihyZWdpc3RyeSA9PSBudWxsKQotCXsKLQkgIHJlZ2lzdHJ5ID0gbmV3IEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCk7Ci0JfQotCXJldHVybiByZWdpc3RyeTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIGN1c3RvbWl6ZXIgdG8gdGhlIHJlZ2lzdHJ5LiAKLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICogCQlUaGUgbmFtZXNwYWNlIHRoZSBjdXN0b21pemVyIHdpbGwgYWN0IG9uLgotICAgKiBAcGFyYW0gY3VzdG9taXplcgotICAgKiAJCVRoZSBlcnJvciBjdXN0b21pemVyIHRvIHJlZ2lzdGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3JNZXNzYWdlQ3VzdG9taXplcihTdHJpbmcgbmFtZXNwYWNlLCBJRXJyb3JNZXNzYWdlQ3VzdG9taXplciBjdXN0b21pemVyKQotICB7Ci0JLy8gVG8gcmVnaXN0ZXIgYSBjdXN0b21pemVyIGZvciB0aGUgbm8gbmFtZXNwYWNlIHVzZSBhbiBlbXB0eSBzdHJpbmcuCi0JaWYobmFtZXNwYWNlID09IG51bGwpCi0JewotCSAgbmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JTGlzdCBjdXN0b21pemVyc0Zvck5TID0gKExpc3QpY3VzdG9taXplcnMuZ2V0KG5hbWVzcGFjZSk7Ci0JaWYoY3VzdG9taXplcnNGb3JOUyA9PSBudWxsKQotCXsKLQkgIGN1c3RvbWl6ZXJzRm9yTlMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICBjdXN0b21pemVycy5wdXQobmFtZXNwYWNlLCBjdXN0b21pemVyc0Zvck5TKTsKLQl9Ci0JaWYoY3VzdG9taXplciAhPSBudWxsKQotCXsKLQkgIGN1c3RvbWl6ZXJzRm9yTlMuYWRkKGN1c3RvbWl6ZXIpOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZXJyb3IgY3VzdG9taXplcnMgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgKiAJCVRoZSBuYW1lc3BhY2UgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBjdXN0b21pemVycy4KLSAgICogQHJldHVybgotICAgKiAJCUFuIGFycmF5IG9mIGN1c3RvbWl6ZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbmFtZXNwYWNlLgotICAgKi8KLSAgcHVibGljIElFcnJvck1lc3NhZ2VDdXN0b21pemVyW10gZ2V0Q3VzdG9taXplcnMoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotCWlmKG5hbWVzcGFjZSA9PSBudWxsKQotCXsKLQkgIG5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCUxpc3QgY3VzdG9taXplcnNGb3JOUyA9IChMaXN0KWN1c3RvbWl6ZXJzLmdldChuYW1lc3BhY2UpOwotCWlmKGN1c3RvbWl6ZXJzRm9yTlMgPT0gbnVsbCkKLQl7Ci0JICBjdXN0b21pemVyc0Zvck5TID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQlyZXR1cm4gKElFcnJvck1lc3NhZ2VDdXN0b21pemVyW10pY3VzdG9taXplcnNGb3JOUy50b0FycmF5KG5ldyBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcltjdXN0b21pemVyc0Zvck5TLnNpemUoKV0pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MTQ3YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQW4gZXJyb3IgbWVzc2FnZSBjdXN0b21pemVyIGRlbGVnYXRlIGlzIHVzZWQgdG8gYWxsb3cgZm9yCi0gKiBsYXp5IGxvYWRpbmcgb2YgZXJyb3IgY3VzdG9taXplcnMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlIGltcGxlbWVudHMgSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIKLXsKLSAgcHJvdGVjdGVkIEJ1bmRsZSBidW5kbGUgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzbmFtZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBJRXJyb3JNZXNzYWdlQ3VzdG9taXplciBjdXN0b21pemVyID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzbmFtZSkKLSAgewotCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCXRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5JRXJyb3JNZXNzYWdlQ3VzdG9taXplciNjdXN0b21pemVNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5FbGVtZW50SW5mb3JtYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY3VzdG9taXplTWVzc2FnZShFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm8sIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gYXJndW1lbnRzKSAKLSAgewotCWlmKGN1c3RvbWl6ZXIgPT0gbnVsbCkKLQl7Ci0JICBsb2FkQ3VzdG9taXplcigpOwotCX0KLQlpZihjdXN0b21pemVyID09IG51bGwpCi0JewotCSAgcmV0dXJuIG51bGw7Ci0JfQotCXJldHVybiBjdXN0b21pemVyLmN1c3RvbWl6ZU1lc3NhZ2UoZWxlbWVudEluZm8sIGVycm9yS2V5LCBhcmd1bWVudHMpOwotICB9Ci0gIAotICAvKioKLSAgICogTG9hZCB0aGUgY3VzdG9taXplciBjbGFzcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGxvYWRDdXN0b21pemVyKCkKLSAgewotCXRyeQotCXsKLQkgIENsYXNzIGN1c3RvbWl6ZXJDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NuYW1lKTsKLQkgIGN1c3RvbWl6ZXIgPSAoSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIpY3VzdG9taXplckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JfQotCWNhdGNoKEV4Y2VwdGlvbiBlKQotCXsKLQkgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZygKLQkJCSAgbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIAotCQkJCQkgICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAKLQkJCQkJICAgICBJU3RhdHVzLk9LLCAKLQkJCQkJICAgICAiVGhlIFhNTCB2YWxpZGF0b3IgZXJyb3IgY3VzdG9taXplciB3YXMgdW5hYmxlIHRvIGxvYWQgY2xhc3MgIiArIGNsYXNzbmFtZSwgZSkpOyAvLyROT04tTkxTLTEkCi0JfQotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9JRXJyb3JNZXNzYWdlQ3VzdG9taXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0lFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNmQxZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0lFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotLyoqCi0gKiBBbiBlcnJvciBtZXNzYWdlIGN1c3RvbWl6ZXIgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIFhNTCB2YWxpZGF0b3IgdG8gY3VzdG9taXplCi0gKiBYTUwgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlLiBUaGUgY3VzdG9taXplciBjYW4gYmUgdXNlZCB0byAKLSAqIGNyZWF0ZSBjbGVhcmVyIGVycm9ycyBmb3Igc3BlY2lmaWMgYXBwbGljYXRpb24gZG9tYWlucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRXJyb3JNZXNzYWdlQ3VzdG9taXplciAKLXsKLSAgLyoqCi0gICAqIFJldHVybiBhIGN1c3RvbWl6ZWQgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIE51bGwgc2hvdWxkIGJlIHJldHVybmVkCi0gICAqIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBub3QgYmUgY3VzdG9taXplZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50SW5mb3JtYXRpb24KLSAgICogCQlUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBlcnJvcktleQotICAgKiAJCVRoZSBrZXkgZm9yIHRoZSBlcnJvciBmb3Igd2hpY2ggdG8gcmVwbGFjZSB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgKiAJCUFyZ3VtZW50cyByZWxhdGVkIHRoZSB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICogQHJldHVybgotICAgKiAJCUEgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIG9yIG51bGwgaWYgdGhpcyBjdXN0b21pemVyIHdpbGwgbm90IGN1c3RvbWl6ZSB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY3VzdG9taXplTWVzc2FnZShFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm8sIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gYXJndW1lbnRzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmYzBjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hLS0gQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotISBVc2FnZToKLSEgICB7MH0gcmVwbGFjZWQgd2l0aCB0aGUgaG9zdCBuYW1lCi0hCi1fVUlfUFJPQkxFTVNfVkFMSURBVElOR19VTktOT1dOX0hPU1QgICAgICAgICAgICAgPSBUaGUgZmlsZSBjYW5ub3QgYmUgdmFsaWRhdGVkIGFzIHRoZSBob3N0ICJ7MH0iIGlzIGN1cnJlbnRseSB1bnJlYWNoYWJsZS4KLQotISBVc2FnZToKLSEgICB7MH0gcmVwbGFjZWQgd2l0aCB0aGUgZmlsZSBuYW1lCi0hCi1fVUlfUFJPQkxFTVNfVkFMSURBVElOR19GSUxFX05PVF9GT1VORCAgICAgICAgICAgPSBUaGUgZmlsZSBjYW5ub3QgYmUgdmFsaWRhdGVkIGFzIHRoZSBYTUwgU2NoZW1hICJ7MH0iIHRoYXQgaXMgc3BlY2lmaWVkIGFzIGRlc2NyaWJpbmcgdGhlIHN5bnRheCBvZiB0aGUgZmlsZSBjYW5ub3QgYmUgbG9jYXRlZC4KLQotX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRCAgICAgICAgICAgICAgICAgID0gVGhlIGZpbGUgY2Fubm90IGJlIHZhbGlkYXRlZCBhcyB0aGVyZSB3YXMgYSBjb25uZWN0aW9uIHByb2JsZW0uCi0KLSEKLSEgUmVmZXJlbmNlZCBGaWxlIERpYWxvZyBSZWxhdGVkIE1lc3NhZ2UKLSEKLV9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFICAgICAgICAgICAgICAgICAgICAgICA9IFJlZmVyZW5jZWQgZmlsZSBjb250YWlucyBlcnJvcnMgKHswfSkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmlnaHQgY2xpY2sgb24gdGhlIG1lc3NhZ2UgYW5kIHNlbGVjdCAiU2hvdyBEZXRhaWxzLi4uIgotCi0jIFdhcm5pbmcgd2hlbiBubyBncmFtbWFyIGlzIGxvY2F0ZWQuCi1fV0FSTl9OT19HUkFNTUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBObyBncmFtbWFyIGNvbnN0cmFpbnRzIChEVEQgb3IgWE1MIHNjaGVtYSkgZGV0ZWN0ZWQgZm9yIHRoZSBkb2N1bWVudC4KLSAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMWMyOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1ub3RlYm9vay5qcGFnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9EZWJ1Z0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0RlYnVnQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2YjgwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0RlYnVnQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotCi1wdWJsaWMgY2xhc3MgRGVidWdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWJ1Z0FkYXB0ZXJGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkgewotCQl0aGlzKElEZWJ1Z0FkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yICBmb3IgRGVidWdBZGFwdGVyRmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZkFkYXB0ZXJLZXkKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqLwotCXByaXZhdGUgRGVidWdBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIGFkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQkvL25vbmUgZXhwZWN0ZWQKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IERlYnVnQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJRXZlcnlOb2RlRGVidWdBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IEV2ZXJ5Tm9kZURlYnVnQWRhcHRlci5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSUFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0KLQkJcmV0dXJuIElEZWJ1Z0FkYXB0ZXIuY2xhc3MgPT0gdHlwZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5I3NldENvbnRyaWJ1dGVkRmFjdG9yaWVzKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMoQXJyYXlMaXN0IGxpc3QpIHsKLQkJLy8gbm9uZSBleHBlY3RlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0V2ZXJ5Tm9kZURlYnVnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWE3MThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0KLS8qKgotICogUHVyZWx5IGZvciB1c2UgaW4gZGVidWdnaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIgaW1wbGVtZW50cyBJRGVidWdBZGFwdGVyIHsKLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRGVidWcucHJpbnRsbigiSWRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZDogIiArIGV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJJZG9jdW1lbnRDaGFuZ2VkOiAiICsgZXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxBYm91dFRvQmVDaGFuZ2VkOiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsQ2hhbmdlZDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VEZWxldGVkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxSZXNvdXJjZURlbGV0ZWQ6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlTW92ZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxSZXNvdXJjZU1vdmVkOiAiICsgIm9sZE1vZGVsOiAiICsgb2xkTW9kZWwgKyAibmV3TW9kZWw6ICIgKyBuZXdNb2RlbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZDogIiArICJzdHJ1Y3R1cmVkTW9kZWw6ICIgKyBzdHJ1Y3R1cmVkTW9kZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbFJlaW5pdGlhbGl6ZWQ6ICIgKyAic3RydWN0dXJlZE1vZGVsOiAiICsgc3RydWN0dXJlZE1vZGVsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSBpbXBsZW1lbnRzIElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkOiAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjbmV3TW9kZWwob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5OZXdEb2N1bWVudENvbnRlbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oInN0cnVjdHVyZWREb2N1bWVudENoYW5nZWQgLSBuZXdNb2RlbDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25vQ2hhbmdlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTm9DaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oInN0cnVjdHVyZWREb2N1bWVudENoYW5nZWQgLSBub0NoYW5nZTogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25vZGVzUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oInN0cnVjdHVyZWREb2N1bWVudENoYW5nZWQgLSBub2Rlc1JlcGxhY2VkOiAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjcmVnaW9uQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gcmVnaW9uQ2hhbmdlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbnNSZXBsYWNlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gcmVnaW9uc1JlcGxhY2VkOiAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyIHNpbmdsZXRvbkluc3RhbmNlOwotCi0JcHVibGljIHN0YXRpYyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChzaW5nbGV0b25JbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzaW5nbGV0b25JbnN0YW5jZSA9IG5ldyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIoKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uSW5zdGFuY2U7Ci0JfQotCi0JSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyIGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXI7Ci0JSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCUludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSBmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlOwotCUludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyID0gbmV3IEludGVybmFsRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlID0gbmV3IEludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSgpOwotCQlmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCk7Ci0JCWZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXRoaXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IElEZWJ1Z0FkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyLAotCSAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlzZXRNb2RlbCgoKElET01Ob2RlKSBub3RpZmllcikuZ2V0TW9kZWwoKSk7Ci0JCX0KLQkJRGVidWcucHJpbnRsbigibm90aWZpZXI6ICIgKyBub3RpZmllciArICIgIiArIElOb2RlTm90aWZpZXIuRVZFTlRfVFlQRV9TVFJJTkdTW2V2ZW50VHlwZV0gKyAiIGNoYW5nZWRGZWF0dXJlOiAiICsgY2hhbmdlZEZlYXR1cmUgKyAiIG9sZFZhbHVlOiAiICsgb2xkVmFsdWUgKyAiIG5ld1ZhbHVlOiAiICsgbmV3VmFsdWUgKyAiIHBvczogIiArIHBvcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRGVidWdBZGFwdGVyI3NldERvY3VtZW50KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWlmIChmTW9kZWwgPT0gc3RydWN0dXJlZE1vZGVsKQotCQkJcmV0dXJuOwotCi0JCWlmIChmTW9kZWwgIT0gbnVsbCkgewotCQkJZk1vZGVsLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQkJLy8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJZk1vZGVsID0gc3RydWN0dXJlZE1vZGVsOwotCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKLQotCQkJZk1vZGVsLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQkJLy8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIoZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9JRGVidWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0lEZWJ1Z0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjNTcxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0lEZWJ1Z0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSURlYnVnQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4YzliYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNWFkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb3JlTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfY2hhcmFjdGVyX2x0X2ZvX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9jaGFyYWN0ZXJfYW1wX2ZvX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2NoYXJhY3Rlcl9fZl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX2VudHJ5X3VyaV9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfbmV4dF9jYXRhbG9nX2xvY2F0aW9uX3VyaV9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfcmVzb2x1dGlvbl9udWxsX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXNvbHV0aW9uX21hbGZvcm1lZF91cmw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbjsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFhNTENvcmVNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjE0OGEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5DYXRhbG9nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFhNTENvcmVQbHVnaW4gcGx1Z2luOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQ0FUQUxPR19JRCA9ICJ1c2VyX2NhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DQVRBTE9HX0lEID0gImRlZmF1bHRfY2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fQ0FUQUxPR19JRCA9ICJzeXN0ZW1fY2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIENhdGFsb2dTZXQgY2F0YWxvZ1NldCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdENhdGFsb2dGaWxlU3RhdGVMb2NhdGlvbjsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkgZGlyZWN0bHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgWE1MQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKFN0cmluZyBmaWxlTmFtZSkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBnZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKGZpbGVOYW1lKS50b1N0cmluZygpOwotCQlTdHJpbmcgZmlsZV9wcm90b2NvbCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgIWxvY2F0aW9uLnN0YXJ0c1dpdGgoZmlsZV9wcm90b2NvbCkpIHsKLQkJCWxvY2F0aW9uID0gZmlsZV9wcm90b2NvbCArIGxvY2F0aW9uOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2cgZ2V0RGVmYXVsdFhNTENhdGFsb2coKSB7Ci0JCWlmIChjYXRhbG9nU2V0ID09IG51bGwpIHsKLQkJCWNhdGFsb2dTZXQgPSBuZXcgQ2F0YWxvZ1NldCgpOwotCi0JCQlkZWZhdWx0Q2F0YWxvZ0ZpbGVTdGF0ZUxvY2F0aW9uID0gZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihDYXRhbG9nLkRFRkFVTFRfQ0FUQUxPR19GSUxFKTsKLQotCQkJY2F0YWxvZ1NldC5wdXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihERUZBVUxUX0NBVEFMT0dfSUQsIGRlZmF1bHRDYXRhbG9nRmlsZVN0YXRlTG9jYXRpb24pOwotCQkJY2F0YWxvZ1NldC5wdXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihTWVNURU1fQ0FUQUxPR19JRCwgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihDYXRhbG9nLlNZU1RFTV9DQVRBTE9HX0ZJTEUpKTsKLQkJCWNhdGFsb2dTZXQucHV0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oVVNFUl9DQVRBTE9HX0lELCBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKENhdGFsb2cuVVNFUl9DQVRBTE9HX0ZJTEUpKTsKLQkJfQotCQlyZXR1cm4gY2F0YWxvZ1NldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coREVGQVVMVF9DQVRBTE9HX0lELCBkZWZhdWx0Q2F0YWxvZ0ZpbGVTdGF0ZUxvY2F0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjMwYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSW52YWxpZF9jaGFyYWN0ZXJfbHRfZm9fRVJST1JfPUludmFsaWQgY2hhcmFjdGVyICgnPCcpIGZvdW5kCi1JbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl89SW52YWxpZCBjaGFyYWN0ZXIgKCc+JykgZm91bmQKLUludmFsaWRfY2hhcmFjdGVyX2FtcF9mb19FUlJPUl89SW52YWxpZCBjaGFyYWN0ZXIgKCcmJykgZm91bmQKLUludmFsaWRfY2hhcmFjdGVyX19mX0VYQ189SW52YWxpZCBjaGFyYWN0ZXIgKCdcIicpIGZvdW5kCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGNvbnRlbnRtb2RlbCBzdHJpbmdzCi1sb2FkaW5nPWxvYWRpbmcgCi0jIGNhdGFsb2cgc3RyaW5ncwotQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldD1DYXRhbG9nIGVudHJ5IGtleSBpcyBub3Qgc2V0Ci1DYXRhbG9nX2VudHJ5X3VyaV9ub3Rfc2V0PUNhdGFsb2cgZW50cnkgdXJpIGlzIG5vdCBzZXQKLUNhdGFsb2dfbmV4dF9jYXRhbG9nX2xvY2F0aW9uX3VyaV9ub3Rfc2V0PU5leHQgY2F0YWxvZyBsb2NhdGlvbiB1cmkgaXMgbm90IHNldAotQ2F0YWxvZ19yZXNvbHV0aW9uX251bGxfY2F0YWxvZz1DYXRhbG9nIHJlc29sdXRpb24gYXR0ZW1wdGVkIHdpdGggbnVsbCBjYXRhbG9nOyBpZ25vcmVkCi1DYXRhbG9nX3Jlc29sdXRpb25fbWFsZm9ybWVkX3VybD1NYWxmb3JtZWQgVVJMIGV4Y2VwdGlvbiB0cnlpbmcgdG8gcmVzb2x2ZQotQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbj1JL08gZXhjZXB0aW9uIHRyeWluZyB0byByZXNvbHZlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyZTk4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlci5YTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cFByb2Nlc3NvclhNTCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0IENsZWFudXBQcmVmZXJlbmNlcwotCQljbGVhbnVwSGFuZGxlci5zZXRDbGVhbnVwUHJlZmVyZW5jZXMoZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBjbGVhbnVwSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkNsZWFudXBQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydFJlcXVpcmVkQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldFF1b3RlQXR0clZhbHVlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEZvcm1hdFNvdXJjZShwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0RU9MQ29kZShwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gbmV3IFhNTEZvcm1hdHRlckZvcm1hdFByb2Nlc3NvcigpOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmOWEyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBOb2RlQ2xlYW51cEhhbmRsZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEUgPSAnXCInOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFUyA9ICJcIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1RBR19DTE9TRSA9ICIvPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHX09QRU4gPSAiPC8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVTID0gIicnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIE5vbi1OTFMgc3RyaW5ncyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBR19PUEVOID0gIjwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIj4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlOb2RlIG5ld05vZGUgPSBjbGVhbnVwQ2hpbGRyZW4obm9kZSk7Ci0JCUlET01Ob2RlIHJlbmFtZWROb2RlID0gbmV3Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlID8gKElET01Ob2RlKSBuZXdOb2RlIDogbnVsbDsKLQotCQkvLyBjYWxsIHF1b3RlQXR0clZhbHVlKCkgZmlyc3Qgc28gaXQgd2lsbCBjbG9zZSBhbnkgdW5jbG9zZWQgYXR0cgotCQkvLyBxdW90ZUF0dHJWYWx1ZSgpIHdpbGwgcmV0dXJuIHRoZSBuZXcgc3RhcnQgdGFnIGlmIHRoZXJlIGlzIGEKLQkJLy8gc3RydWN0dXJlIGNoYW5nZQotCQlyZW5hbWVkTm9kZSA9IHF1b3RlQXR0clZhbHVlKHJlbmFtZWROb2RlKTsKLQotCQkvLyBpbnNlcnQgdGFnIGNsb3NlIGlmIG1pc3NpbmcKLQkJLy8gaWYgbm9kZSBpcyBub3QgY29tbWVudCB0YWcKLQkJLy8gYW5kIG5vdCBpbXBsaWNpdCB0YWcKLQkJaWYgKCFpc0NvbW1lbnRUYWcocmVuYW1lZE5vZGUpICYmICFpc0ltcGxpY2l0VGFnKHJlbmFtZWROb2RlKSkgewotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IHJlbmFtZWROb2RlLmdldE1vZGVsKCk7Ci0KLQkJCS8vIHNhdmUgc3RhcnQgb2Zmc2V0IGJlZm9yZSBpbnNlcnRUYWdDbG9zZSgpCi0JCQkvLyBvciBlbHNlIHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgd2lsbCBiZSB6ZXJvIGlmCi0JCQkvLyByZW5hbWVkTm9kZSByZXBsYWNlZCBieSBpbnNlcnRUYWdDbG9zZSgpCi0JCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCS8vIGZvciBzdGFydCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCS8vIHVwZGF0ZSByZW5hbWVkTm9kZSBhbmQgc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWZ0ZXIKLQkJCS8vIGluc2VydFRhZ0Nsb3NlKCkKLQkJCXJlbmFtZWROb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsKLQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJLy8gZm9yIGVuZCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCWluc2VydFRhZ0Nsb3NlKHN0cnVjdHVyZWRNb2RlbCwgZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCi0JCS8vIGNhbGwgaW5zZXJ0TWlzc2luZ1RhZ3MoKSBuZXh0LCBpdCB3aWxsIGdlbmVyYXRlIGltcGxpY2l0IHRhZ3MgaWYKLQkJLy8gdGhlcmUgYXJlIGFueQotCQkvLyBpbnNlcnRNaXNzaW5nVGFncygpIHdpbGwgcmV0dXJuIHRoZSBuZXcgbWlzc2luZyBzdGFydCB0YWcgaWYgb25lIGlzCi0JCS8vIG1pc3NpbmcKLQkJcmVuYW1lZE5vZGUgPSBpbnNlcnRNaXNzaW5nVGFncyhyZW5hbWVkTm9kZSk7Ci0KLQkJcmVuYW1lZE5vZGUgPSBjb21wcmVzc0VtcHR5RWxlbWVudFRhZyhyZW5hbWVkTm9kZSk7Ci0KLQkJcmVuYW1lZE5vZGUgPSBpbnNlcnRSZXF1aXJlZEF0dHJzKHJlbmFtZWROb2RlKTsKLQotCQlyZXR1cm4gcmVuYW1lZE5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgY2xlYW51cENoaWxkcmVuKE5vZGUgbm9kZSkgewotCQlOb2RlIHBhcmVudE5vZGUgPSBub2RlOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBnZXQgY2xlYW51cCBoYW5kbGVyCi0JCQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGdldENsZWFudXBIYW5kbGVyKGNoaWxkTm9kZSk7Ci0KLQkJCQkvLyBjbGVhbnVwIGVhY2ggY2hpbGQKLQkJCQljaGlsZE5vZGUgPSBjbGVhbnVwSGFuZGxlci5jbGVhbnVwKGNoaWxkTm9kZSk7Ci0KLQkJCQkvLyBnZXQgbmV3IHBhcmVudCBub2RlCi0JCQkJcGFyZW50Tm9kZSA9IGNoaWxkTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkvLyBnZXQgbmV4dCBjaGlsZCBub2RlCi0JCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGNvbXByZXNzRW1wdHlFbGVtZW50VGFnKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQlpZiAoY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzICYmIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAmJiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJLy8gZm9ybWF0IGNoaWxkcmVuIGFuZCBlbmQgdGFnIGlmIG5vdCBlbXB0eSBlbGVtZW50IHRhZwotCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBuZXdOb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQlpZiAoY2hpbGROb2RlcyA9PSBudWxsIHx8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCB8fCAoY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA9PSAxICYmIChjaGlsZE5vZGVzLml0ZW0oMCkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKChjaGlsZE5vZGVzLml0ZW0oMCkpLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkpIHsKLQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5ld05vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBuZXdOb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWludCBvZmZzZXQgPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCi0JCQkJCW9mZnNldCA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgKyBsYXN0UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgMCwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2Ugb3JnLnczYy5kb20uTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBvcmcudzNjLmRvbS5Ob2RlLlRFWFRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0IENsZWFudXBQcmVmZXJlbmNlcwotCQljbGVhbnVwSGFuZGxlci5zZXRDbGVhbnVwUHJlZmVyZW5jZXMoZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBjbGVhbnVwSGFuZGxlcjsKLQl9Ci0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoRG9jdW1lbnQpIG5vZGUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWRBdHRycyhOb2RlIG5vZGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gZ2V0TW9kZWxRdWVyeShub2RlKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRFbmRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCi0JCWlmIChpc0VtcHR5RWxlbWVudChlbGVtZW50KSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCBsYXN0UmVnaW9uLmdldExlbmd0aCgpLCBFTVBUWV9UQUdfQ0xPU0UpOwotCi0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uQmVmb3JlVGFnQ2xvc2UgPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEgLSAxKTsKLQotCQkJCS8vIGluc2VydCBhIHNwYWNlIHNlcGFyYXRvciBiZWZvcmUgdGFnIGNsb3NlIGlmIHRoZSBwcmV2aW91cwotCQkJCS8vIHJlZ2lvbiBkb2VzIG5vdCBoYXZlIGV4dHJhIHNwYWNlcwotCQkJCWlmIChyZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRUZXh0TGVuZ3RoKCkgPT0gcmVnaW9uQmVmb3JlVGFnQ2xvc2UuZ2V0TGVuZ3RoKCkpCi0JCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZyBlbmRUYWcgPSBFTkRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCi0JCQlJRE9NTm9kZSBsYXN0Q2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpbnQgZW5kVGFnU3RhcnRPZmZzZXQgPSAwOwotCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKQotCQkJCS8vIGlmIHRoaXMgbm9kZSBoYXMgY2hpbGRyZW4sIGluc2VydCB0aGUgZW5kIHRhZyBhZnRlciB0aGUKLQkJCQkvLyBsYXN0IGNoaWxkCi0JCQkJZW5kVGFnU3RhcnRPZmZzZXQgPSBsYXN0Q2hpbGQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQllbHNlCi0JCQkJLy8gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhcyBjaGlsZHJlbiwgaW5zZXJ0IHRoZSBlbmQgdGFnCi0JCQkJLy8gYWZ0ZXIgdGhlIHN0YXJ0IHRhZwotCQkJCWVuZFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBlbmRUYWdTdGFydE9mZnNldCwgMCwgZW5kVGFnKTsKLQkJfQotCi0JCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCS8vIG5ldwotCQkvLyBub2RlCi0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRNaXNzaW5nVGFncyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRJbnNlcnRNaXNzaW5nVGFncygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCS8vIGltcGxpY2l0IHN0YXJ0IHRhZzsgZ2VuZXJhdGUgdGFnIGZvciBpdAotCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhub2RlKTsKLQkJCQlzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVRleHRSZWdpb25MaXN0IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucyAhPSBudWxsICYmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblJlZ2lvbnMuZ2V0KHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucy5zaXplKCkgLSAxKSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCi0JCQl9IGVsc2UgewotCQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIHN0YXJ0IHRhZyBtaXNzaW5nCi0JCQkJCWlmIChpc1N0YXJ0VGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0U3RhcnRUYWcobmV3Tm9kZSk7Ci0JCQkJfSBlbHNlIGlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQkvLyBlbmQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzRW5kVGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0RW5kVGFnKG5ld05vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgaW5zZXJ0UmVxdWlyZWRBdHRycyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEluc2VydFJlcXVpcmVkQXR0cnMoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKGluc2VydFJlcXVpcmVkQXR0cnMpIHsKLQkJCUxpc3QgcmVxdWlyZWRBdHRycyA9IGdldFJlcXVpcmVkQXR0cnMobmV3Tm9kZSk7Ci0JCQlpZiAocmVxdWlyZWRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJTmFtZWROb2RlTWFwIGN1cnJlbnRBdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCUxpc3QgaW5zZXJ0QXR0cnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKSA9PSAwKQotCQkJCQlpbnNlcnRBdHRycy5hZGRBbGwocmVxdWlyZWRBdHRycyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWRBdHRycy5zaXplKCk7IGkrKykgewotCQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0ck5hbWUgPSAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJlcXVpcmVkQXR0cnMuZ2V0KGkpKS5nZXRBdHRyTmFtZSgpOwotCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCVN0cmluZyBjdXJyZW50QXR0ck5hbWUgPSBjdXJyZW50QXR0cnMuaXRlbShqKS5nZXROb2RlTmFtZSgpOwotCQkJCQkJCWlmIChyZXF1aXJlZEF0dHJOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoY3VycmVudEF0dHJOYW1lKSA9PSAwKSB7Ci0JCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFmb3VuZCkKLQkJCQkJCQlpbnNlcnRBdHRycy5hZGQocmVxdWlyZWRBdHRycy5nZXQoaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpbnNlcnRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWludCBpbmRleCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCQlpbmRleC0tOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0gZWxzZSBpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJCQlpbmRleCA9IGluZGV4IC0gMjsKLQkJCQkJCWxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCAtIDEpOwotCQkJCQl9Ci0JCQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBpID0gaW5zZXJ0QXR0cnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGluc2VydEF0dHJzLmdldChpKTsKLQkJCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyaWJ1dGVOYW1lID0gYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ckRlY2wuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKQotCQkJCQkJCQlkZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBuYW1lQW5kRGVmYXVsdFZhbHVlID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGkgPT0gMCAmJiBsYXN0UmVnaW9uLmdldExlbmd0aCgpID4gbGFzdFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpCi0JCQkJCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgKz0gcmVxdWlyZWRBdHRyaWJ1dGVOYW1lICsgIj1cIiIgKyBkZWZhdWx0VmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGluZGV4LCBuYW1lQW5kRGVmYXVsdFZhbHVlKSk7Ci0JCQkJCQkJLy8gQlVHMzM4MTogTXVsdGlUZXh0RWRpdCBhcHBsaWVzIGFsbCBjaGlsZAotCQkJCQkJCS8vIFRleHRFZGl0J3MgYmFzaW5nIG9uIG9mZnNldHMKLQkJCQkJCQkvLyAgICAgICAgICBpbiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBmaXJzdCBUZXh0RWRpdCwgbm90Ci0JCQkJCQkJLy8gYWZ0ZXIgZWFjaAotCQkJCQkJCS8vICAgICAgICAgIGNoaWxkIFRleHRFZGl0LiBUaGVyZWZvcmUsIGRvIG5vdCBuZWVkIHRvCi0JCQkJCQkJLy8gYWR2YW5jZSB0aGUgaW5kZXguCi0JCQkJCQkJLy9pbmRleCArPSBuYW1lQW5kRGVmYXVsdFZhbHVlLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQkJbXVsdGlUZXh0RWRpdC5hcHBseShuZXdOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgaW5zZXJ0U3RhcnRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaXNDb21tZW50VGFnKG5vZGUpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnID0gU1RBUlRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRUYWdTdGFydE9mZnNldCwgMCwgc3RhcnRUYWcpOwotCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkvLyBuZXcKLQkJLy8gbm9kZQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnNlcnRUYWdDbG9zZShJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgZmxhdG5vZGVSZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJaWYgKGZsYXRub2RlUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGZsYXRub2RlUmVnaW9ucy5nZXQoZmxhdG5vZGVSZWdpb25zLnNpemUoKSAtIDEpOwotCQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBsYXN0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJaWYgKChyZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgJiYgKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJCS8vIGluc2VydCAiPiIgYWZ0ZXIgbGFzdFJlZ2lvbiBvZiBmbGF0Tm9kZQotCQkJCQkJLy8gYXMgaW4gIjxhPC9hPiIgaWYgZmxhdE5vZGUgaXMgZm9yIHN0YXJ0IHRhZywgb3IgaW4KLQkJCQkJCS8vICI8YT48L2EiIGlmIGZsYXROb2RlIGlzIGZvciBlbmQgdGFnCi0JCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVuYW1lZE5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudFRhZyhOb2RlIHJlbmFtZWROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChyZW5hbWVkTm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSByZW5hbWVkTm9kZTsKLQkJCXJlc3VsdCA9IGVsZW1lbnQuaXNDb21tZW50VGFnKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eUVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kVGFnUmVxdWlyZWQoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbm9kZS5pc0NvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEEgdGFnIGlzIGltcGxpY2l0IGlmIGl0IGhhcyBub3QgY29ycmVzcG9uZGluZyByZWdpb24gaW4gZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlbmFtZWROb2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ltcGxpY2l0VGFnKElET01Ob2RlIHJlbmFtZWROb2RlKSB7Ci0JCXJldHVybiByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVuZCB0YWdzIG9mIEhUTUwgRU1QVFkgY29udGVudCB0eXBlLCBzdWNoIGFzIElNRywgYW5kIEhUTUwKLQkgKiB1bmRlZmluZWQgdGFncyBhcmUgcGFyc2VkIHNlcGFyYXRlbHkgZnJvbSB0aGUgc3RhcnQgdGFncy4gU28gaW5zZXJ0aW5nCi0JICogdGhlIG1pc3Npbmcgc3RhcnQgdGFnIGlzIHVzZWxlc3MgYW5kIGV2ZW4gaGFybWZ1bC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTdGFydFRhZ1JlcXVpcmVkKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG5vZGUuaXNDb250YWluZXIoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUeXBlKElET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwgJiYgc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXREb2N1bWVudCgpOwotCi0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkb2N1bWVudC5pc1hNTFR5cGUoKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBxdW90ZUF0dHJWYWx1ZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCQkvL1hNTEVsZW1lbnQgZWxlbWVudCA9IChYTUxFbGVtZW50KSBub2RlOwotCQlpZiAoaXNDb21tZW50VGFnKG5vZGUpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlib29sZWFuIHF1b3RlQXR0clZhbHVlcyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldFF1b3RlQXR0clZhbHVlcygpOwotCi0JCWlmIChxdW90ZUF0dHJWYWx1ZXMpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbmV3Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJaW50IGF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbm9kZS5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzTGVuZ3RoOyBpKyspIHsKLQkJCQkJYXR0cmlidXRlcyA9IG5ld05vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCQkJSURPTUF0dHIgZWFjaEF0dHIgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJLy9JVGV4dFJlZ2lvbiBvbGRBdHRyVmFsdWVSZWdpb24gPQotCQkJCQkvLyBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCQlTdHJpbmcgb2xkQXR0clZhbHVlID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCWlmIChvbGRBdHRyVmFsdWUgPT0gbnVsbCkgewotCQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChpc1hNTFR5cGUoc3RydWN0dXJlZE1vZGVsKSkgewotCQkJCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSAiXCIiICsgZWFjaEF0dHIuZ2V0TmFtZVJlZ2lvblRleHQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQkJaWYgKGVhY2hBdHRyLmdldEVxdWFsUmVnaW9uKCkgIT0gbnVsbCkKLQkJCQkJCQkJLy8gZXF1YWwgcmVnaW9uIGV4aXN0cwotCQkJCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBlYWNoQXR0ci5nZXRFbmRPZmZzZXQoKSwgMCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCS8vIG5vIGVxdWFsIHJlZ2lvbgotCQkJCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBlYWNoQXR0ci5nZXROYW1lUmVnaW9uVGV4dEVuZE9mZnNldCgpLCAwLCAiPSIuY29uY2F0KG5ld0F0dHJWYWx1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24obm9kZS5nZXRTdGFydE9mZnNldCgpKTsgLy8gc2F2ZQotCQkJCQkJCS8vIG5ldwotCQkJCQkJCS8vIG5vZGUKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vU3RyaW5nIG9sZEF0dHJWYWx1ZSA9IG9sZEF0dHJWYWx1ZVJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQkJCQljaGFyIHF1b3RlID0gU3RyaW5nVXRpbHMuaXNRdW90ZWQob2xkQXR0clZhbHVlKSA/IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCkgOiBET1VCTEVfUVVPVEU7Ci0JCQkJCQlTdHJpbmcgbmV3QXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGVhY2hBdHRyLCBxdW90ZSk7Ci0KLQkJCQkJCS8vIFRoZXJlIGlzIGEgcHJvYmxlbSBpbgotCQkJCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoSVRleHRSZWdpb24pCi0JCQkJCQkvLyB3aGVuIHRoZSByZWdpb24gaXMgaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uLgotCQkJCQkJLy8gV29ya2Fyb3VuZCBmb3Igbm93Li4uCi0JCQkJCQlpZiAob2xkQXR0clZhbHVlLmxlbmd0aCgpID09IDEpIHsKLQkJCQkJCQljaGFyIGZpcnN0Q2hhciA9IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCk7Ci0JCQkJCQkJaWYgKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEUpCi0JCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IFNJTkdMRV9RVU9URVM7Ci0JCQkJCQkJZWxzZSBpZiAoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URSkKLQkJCQkJCQkJbmV3QXR0clZhbHVlID0gRE9VQkxFX1FVT1RFUzsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZS5jb21wYXJlVG8ob2xkQXR0clZhbHVlKSAhPSAwKSB7Ci0JCQkJCQkJCWludCBhdHRyVmFsdWVTdGFydE9mZnNldCA9IGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQkJCQkJaW50IGF0dHJWYWx1ZUxlbmd0aCA9IG9sZEF0dHJWYWx1ZS5sZW5ndGgoKTsKLQkJCQkJCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0LCBhdHRyVmFsdWVMZW5ndGgsIG5ld0F0dHJWYWx1ZSk7Ci0JCQkJCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJCQkJCS8vIG5ldwotCQkJCQkJCQkvLyBub2RlCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWMyMDk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTm9kZUNsZWFudXBIYW5kbGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRGb3JtYXRTb3VyY2UocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcmVmZXJlbmNlcyhJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpIHsKLQotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cFByZWZlcmVuY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNjNDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHJlbmFtZWQgdG8gU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcwotICogCi0gKiBUT0RPIHdpbGwgZGVsZXRlIGluIEM1Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFhNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwgZkluc3RhbmNlOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbCBnZXRJbnN0YW5jZSgpIHsKLQotCQkvLyBhZGRlZCBmb3Igb25lIG1ldGhvZCBpbiBDbGVhbnVwRGlhbG9nIC4uLiBtYXkgYmUgYmV0dGVyIHdheQotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBYTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIGludCBmQXR0ck5hbWVDYXNlOwotCXByaXZhdGUgYm9vbGVhbiBmQ29udmVydEVPTENvZGVzOwotCXByaXZhdGUgU3RyaW5nIGZFT0xDb2RlOwotCXByaXZhdGUgYm9vbGVhbiBmRm9ybWF0U291cmNlOwotCXByaXZhdGUgYm9vbGVhbiBmSW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JLy8gcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlF1b3RlQXR0clZhbHVlczsKLQlwcml2YXRlIGludCBmVGFnTmFtZUNhc2U7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQotCQlyZXR1cm4gZkF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXMoKSB7Ci0KLQkJcmV0dXJuIGZDb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFT0xDb2RlKCkgewotCi0JCXJldHVybiBmRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGb3JtYXRTb3VyY2UoKSB7Ci0KLQkJcmV0dXJuIGZGb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5zZXJ0TWlzc2luZ1RhZ3MoKSB7Ci0KLQkJcmV0dXJuIGZJbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0KLQkJaWYgKGZQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmUHJlZmVyZW5jZXMgPSBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiBmUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0UXVvdGVBdHRyVmFsdWVzKCkgewotCi0JCXJldHVybiBmUXVvdGVBdHRyVmFsdWVzOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZUYWdOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyTmFtZUNhc2UoaW50IGF0dHJOYW1lQ2FzZSkgewotCi0JCWZBdHRyTmFtZUNhc2UgPSBhdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydEVPTENvZGVzKGJvb2xlYW4gY29udmVydEVPTENvZGVzKSB7Ci0KLQkJZkNvbnZlcnRFT0xDb2RlcyA9IGNvbnZlcnRFT0xDb2RlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFT0xDb2RlKFN0cmluZyBFT0xDb2RlKSB7Ci0KLQkJZkVPTENvZGUgPSBFT0xDb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSkgewotCi0JCWZGb3JtYXRTb3VyY2UgPSBmb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0TWlzc2luZ1RhZ3MoYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncykgewotCi0JCWZJbnNlcnRNaXNzaW5nVGFncyA9IGluc2VydE1pc3NpbmdUYWdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VzKFByZWZlcmVuY2VzIHByZWZzKSB7Ci0KLQkJZlByZWZlcmVuY2VzID0gcHJlZnM7Ci0JCXVwZGF0ZU9wdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZUF0dHJWYWx1ZXMoYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMpIHsKLQotCQlmUXVvdGVBdHRyVmFsdWVzID0gcXVvdGVBdHRyVmFsdWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhZ05hbWVDYXNlKGludCB0YWdOYW1lQ2FzZSkgewotCi0JCWZUYWdOYW1lQ2FzZSA9IHRhZ05hbWVDYXNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9wdGlvbnMoKSB7Ci0KLQkJUHJlZmVyZW5jZXMgcCA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCWZUYWdOYW1lQ2FzZSA9IHAuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKTsKLQkJZkF0dHJOYW1lQ2FzZSA9IHAuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSk7Ci0JCWZJbnNlcnRNaXNzaW5nVGFncyA9IHAuZ2V0Qm9vbGVhbihJWE1MUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpOwotCQlmUXVvdGVBdHRyVmFsdWVzID0gcC5nZXRCb29sZWFuKElYTUxQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpOwotCQlmRm9ybWF0U291cmNlID0gcC5nZXRCb29sZWFuKElYTUxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSk7Ci0JCWZDb252ZXJ0RU9MQ29kZXMgPSBwLmdldEJvb2xlYW4oSVhNTFByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUyk7Ci0JCWZFT0xDb2RlID0gcC5nZXRTdHJpbmcoSVhNTFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2YWY1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRFbGVtZW50QWRhcHRlciBpbXBsZW1lbnRzIFRhZ0FkYXB0ZXIgewotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGZFbmRUYWc7Ci0JcHJpdmF0ZSBDb21tZW50RWxlbWVudEhhbmRsZXIgZkhhbmRsZXI7Ci0KLQlwdWJsaWMgQ29tbWVudEVsZW1lbnRBZGFwdGVyKGJvb2xlYW4gaXNFbmRUYWcsIENvbW1lbnRFbGVtZW50SGFuZGxlciBoYW5kbGVyKSB7Ci0JCWZFbmRUYWcgPSBpc0VuZFRhZzsKLQkJZkhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlQ29tbWVudENsb3NlKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50LmlzSlNQVGFnKCkpID8gIi0tJT4iIDogIi0tPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlQ29tbWVudE9wZW4oSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQuaXNKU1BUYWcoKSkgPyAiPCUtLSIgOiAiPCEtLSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBmQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBjb250ZW50ID0gZkhhbmRsZXIuZ2VuZXJhdGVFbmRUYWdDb250ZW50KGVsZW1lbnQpOwotCQlpZiAoY29udGVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50T3BlbihlbGVtZW50KSk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50Q2xvc2UoZWxlbWVudCkpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJJRCgpIHsKLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb24oKS5nZXRIYW5kbGVySUQoKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBmSGFuZGxlci5nZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChlbGVtZW50KTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKGdlbmVyYXRlQ29tbWVudE9wZW4oZWxlbWVudCkpOwotCQlidWZmZXIuYXBwZW5kKGNvbnRlbnQpOwotCQlidWZmZXIuYXBwZW5kKGdlbmVyYXRlQ29tbWVudENsb3NlKGVsZW1lbnQpKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ29tbWVudEVsZW1lbnRBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gVGFnQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiAoIWZIYW5kbGVyLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCXJldHVybiBmRW5kVGFnOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJZkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U4ZTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tZW50RWxlbWVudEhhbmRsZXIgewotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwcmVmaXggb2YgdGhlIGNvbW1lbnQgY29udGVudCBtYXRjaGVzCi0JICogdGhlIHN0cmluZyBzcGVjaWZpZWQgaW4gJmx0O3N0YXJ0c3dpdGggcHJlZml4PSIiLyZndDsgaW4gcGx1Z2luCi0JICogZXh0ZW5zaW9uLiBDb21tZW50IGNvbnRlbnQgaXMgcGFyc2VkIGFuZCBuZXcgRE9NIGVsZW1lbnQgaXMgY3JlYXRlZCBpbgotCSAqIHRoaXMgbWV0aG9kLiBJbXBsZW1lbnRvciBoYXMgdG8gZG8gZm9sbG93aW5nOgotCSAqIDxsaT5Gb3Igc3RhcnQgdGFnIDoKLQkgKiA8dWw+Ci0JICogPGxpPnBhcnNlIGNvbW1lbnQgY29udGVudCBhbmQgY3JlYXRlIG5ldyBlbGVtZW50IGluc3RhbmNlLjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L2xpPgotCSAqIDxsaT5Gb3IgZW5kIHRhZyA6Ci0JICogPHVsPgotCSAqIDxsaT5wYXJzZSBjb21tZW50IGNvbnRlbnQgYW5kIGNyZWF0ZSBuZXcgZWxlbWVudCBpbnN0YW5jZS48L2xpPgotCSAqIDxsaT5tYWtlIGlzRW5kVGFnIGZsYWcgdHJ1ZS48L2xpPgotCSAqIDxsaT5QYXJzZXIgZnJhbWV3b3JrIHNlYXJjaGVzIG1hY2hlZCBzdGFydCB0YWcgZWxlbWVudCBpbnN0YW5jZSBhZnRlcgotCSAqIHRoaXMgY3JlYXRlRWxlbWVudCBjYWxsLCBhbmQgbmV3IGluc3RhbmNlIGlzIGp1c3QgdGhyb3duIGF3YXkuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogPGxpPkZvciBlbXB0eSB0YWcgOgotCSAqIDx1bD4KLQkgKiA8bGk+cGFyc2UgY29tbWVudCBjb250ZW50IGFuZCBjcmVhdGUgbmV3IGVsZW1lbnQgaW5zdGFuY2UuPC9saT4KLQkgKiA8bGk+bWFrZSBpc0VuZFRhZyBmbGFnIHRydWUuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBwYXJlbnQgRE9NIGRvY3VtZW50Ci0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGNvbW1lbnQgY29udGVudC4gY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSksIHN1ZmZpeAotCSAqICAgICAgICAgICAgKC0tJmd0OyBvciAtLSUmZ3Q7KSwgYW5kIHN1cnJvdW5kaW5nIHNwYWNlcyBhcmUgdHJpbW1lZC4KLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGNvbW1lbnQgaXMgSlNQIHN0eWxlIGNvbW1lbnQuIFRoaXMgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIG1heSBiZSByZXF1aXJlZCBieSBoYW5kbGVyIHdoZW4gdGhlIGhhbmRsZXIgYWNjZXB0cyBib3RoIFhNTAotCSAqICAgICAgICAgICAgc3R5bGUgYW5kIEpTUCBzdHlsZSBjb21tZW50IChuYW1lbHksCi0JICogICAgICAgICAgICBjb21tZW50dHlwZT0mcXVvdDtib3RoJnF1b3Q7IGluIHBsdWdpbi54bWwpLgotCSAqIEByZXR1cm4gY29tbWVudCBlbGVtZW50IGluc3RhbmNlIGlmIHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcmlnaHRseQotCSAqICAgICAgICAgcGFyc2VkLiBpZiBwYXJzZSBmYWlsZWQsIHJldHVybnMgbnVsbC4KLQkgKi8KLQlFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgc291cmNlIHRleHQgb2YgdGhlIGVuZCB0YWcgZm9yIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBEbyBub3QgZ2VuZXJhdGUgY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSkgYW5kIHN1ZmZpeAotCSAqICgtLSZndDsgb3IgLS0lJmd0OykuIFhNTEdlbmVyYXRvciB1c2VzIHRoaXMgbWV0aG9kIHRvIGdlbmVyYXRlIFhNTC9IVE1MCi0JICogc291cmNlIGZvciBhIGNvbW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbW1lbnQgZWxlbWVudAotCSAqIEByZXR1cm4gZ2VuZXJhdGVkIHRhZyBzdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBzb3VyY2UgdGV4dCBvZiB0aGUgc3RhcnQgdGFnIGZvciB0aGUgcGFzc2VkCi0JICogZWxlbWVudC4gRG8gbm90IGdlbmVyYXRlIGNvbW1lbnQgcHJlZml4ICgmbHQ7IS0tIG9yICZsdDslLS0pIGFuZCBzdWZmaXgKLQkgKiAoLS0mZ3Q7IG9yIC0tJSZndDspLiBYTUxHZW5lcmF0b3IgdXNlcyB0aGlzIG1ldGhvZCB0byBnZW5lcmF0ZSBYTUwvSFRNTAotCSAqIHNvdXJjZSBmb3IgYSBjb21tZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tZW50IGVsZW1lbnQKLQkgKiBAcmV0dXJuIGdlbmVyYXRlZCB0YWcgc3RyaW5nCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY29tbWVudCBlbGVtZW50IG9yIG5vdAotCSAqLwotCWJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiB3aGV0aGVyIHRoaXMgZWxlbWVudCBjYW4gaGF2ZSBjaGlsZHJlbiBvciBub3QKLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JLy8JU3RyaW5nIGdldEVsZW1lbnRQcmVmaXgoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9CYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjYyMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWwuQ29tbWVudEVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsLlRhZ1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi0KLS8qKgotICovCi1jbGFzcyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlciBpbXBsZW1lbnRzIENvbW1lbnRFbGVtZW50SGFuZGxlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eTsKLQotCXB1YmxpYyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlcihTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gaXNFbXB0eSkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0JCXRoaXMuaXNFbXB0eSA9IGlzRW1wdHk7Ci0JfQotCi0KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQlTdHJpbmcgc3RyID0gZGF0YS50cmltKCk7Ci0JCUNvbW1lbnRFbGVtZW50RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENvbW1lbnRFbGVtZW50RmFjdG9yeShkb2N1bWVudCwgaXNKU1BUYWcsIHRoaXMpOwotCQlpZiAoc3RyLmNoYXJBdCgwKSA9PSAnLycpIHsgLy8gZW5kIHRhZwotCQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoc3RyLCAxKTsgLy8gc2tpcCAnLycKLQkJCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCWVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZShuYW1lLCBDb21tZW50RWxlbWVudEZhY3RvcnkuSVNfRU5EKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gc3RhcnQgdGFnCi0JCQlUYWdTY2FubmVyIHNjYW5uZXIgPSBuZXcgVGFnU2Nhbm5lcihzdHIsIDApOwotCQkJU3RyaW5nIG5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlKG5hbWUsIChpc0VtcHR5KSA/IENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19FTVBUWSA6IENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19TVEFSVCk7Ci0JCQkJLy8gc2V0IGF0dHJpYnV0ZXMKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQkJd2hpbGUgKGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IHNjYW5uZXIubmV4dFZhbHVlKCk7Ci0JCQkJCUF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0JCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkKLQkJCQkJCQkoKElET01BdHRyKSBhdHRyKS5zZXRWYWx1ZVNvdXJjZShhdHRyVmFsdWUpOwotCQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCQl9Ci0JCQkJCWF0dHJOYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGlzRW1wdHkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZWxlbWVudC5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoIiAvIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZWxlbWVudC5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHIgYXR0ciA9IChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyTmFtZShhdHRyKTsKLQkJCWlmIChhdHRyTmFtZSAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyTmFtZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGF0dHIpOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJLy8gYXR0ciBuYW1lIG9ubHkgZm9yIEhUTUwgYm9vbGVhbiBhbmQgSlNQCi0JCQkJYnVmZmVyLmFwcGVuZCgnPScpOwotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0VGFnTmFtZSgpLmVxdWFscyhlbGVtZW50TmFtZSkpID8gdHJ1ZSA6IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBpc0VtcHR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxMzNiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIE1hcCBmQXR0cmlidXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZDdXN0b207Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZFbXB0eTsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50SGFuZGxlciBmSGFuZGxlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZklEID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkpTUENvbW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmUHJlZml4ID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlhNTENvbW1lbnQ7Ci0KLQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCWZFbGVtZW50ID0gZWxlbWVudDsKLQkJZkN1c3RvbSA9IChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJoYW5kbGVyLWN1c3RvbSIpKSA/IHRydWUgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbGxBdHRyaWJ1dGVzKGVsZW1lbnQpOwotCi0JCWZYTUxDb21tZW50ID0gZkpTUENvbW1lbnQgPSBmYWxzZTsKLQkJU3RyaW5nIGNvbW1lbnRUeXBlID0gZ2V0UHJvcGVydHkoImNvbW1lbnR0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbW1lbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoInhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZYTUxDb21tZW50ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjb21tZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3AiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmSlNQQ29tbWVudCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoY29tbWVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiYm90aCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZYTUxDb21tZW50ID0gZkpTUENvbW1lbnQgPSB0cnVlOwotCQl9Ci0JCVN0cmluZyBlbXB0eSA9IGdldFByb3BlcnR5KCJpc2VtcHR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJZkVtcHR5ID0gKGVtcHR5ICE9IG51bGwgJiYgIWVtcHR5LmVxdWFscygiZmFsc2UiKSkgPyB0cnVlIDogZmFsc2U7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRKU1BDb21tZW50KCkgewotCQlyZXR1cm4gZkpTUENvbW1lbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0WE1MQ29tbWVudCgpIHsKLQkJcmV0dXJuIGZYTUxDb21tZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGdldEhhbmRsZXIoKS5jcmVhdGVFbGVtZW50KGRvY3VtZW50LCBkYXRhLCBpc0pTUFRhZyk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCUNvbW1lbnRFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gKENvbW1lbnRFbGVtZW50QWRhcHRlcikgZWxlbWVudC5nZXRBZGFwdGVyRm9yKENvbW1lbnRFbGVtZW50QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5zZXRDb25maWd1cmF0aW9uKHRoaXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsQXR0cmlidXRlcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZkF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJZkF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9IGVsc2UgewotCQkJZkF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJfQotCQlTdHJpbmdbXSBuYW1lcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKTsKLQkJaWYgKG5hbWVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbGVuZ3RoID0gbmFtZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCQkJZkF0dHJpYnV0ZXMucHV0KG5hbWUudG9Mb3dlckNhc2UoKSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbW1lbnRFbGVtZW50SGFuZGxlciBnZXRIYW5kbGVyKCkgewotCQlpZiAoZkhhbmRsZXIgPT0gbnVsbCkgewotCQkJaWYgKGZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoaXNDdXN0b20oKSkgewotCQkJCQkJZkhhbmRsZXIgPSAoQ29tbWVudEVsZW1lbnRIYW5kbGVyKSBmRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBnZXRQcm9wZXJ0eSgiZWxlbWVudG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZkhhbmRsZXIgPSBuZXcgQmFzaWNDb21tZW50RWxlbWVudEhhbmRsZXIoZWxlbWVudE5hbWUsIGZFbXB0eSk7Ci0JCQkJCX0KLQkJCQkJLy8JCQkJCSgoQWJzdHJhY3RDb21tZW50RWxlbWVudEhhbmRsZXIpZkhhbmRsZXIpLnNldEVsZW1lbnRQcmVmaXgoZkVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwcmVmaXgiKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gY2F0Y2ggYW5kIGxvZyAoYW5kIGlnbm9yZSkgQU5ZIGV4Y2VwdGlvbiBjcmVhdGVkCi0JCQkJCS8vIGJ5IGV4ZWN1dGFibGUgZXh0ZW5zaW9uLgotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQlmSGFuZGxlciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZIYW5kbGVyID09IG51bGwpIHsKLQkJCQlmSGFuZGxlciA9IG5ldyBDb21tZW50RWxlbWVudEhhbmRsZXIoKSB7Ci0JCQkJCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0vLyByZW1vdmVkIGluIFJDMiwgcm8gcmVtb3ZlZCAidW51c2VkIiBlcnJvci93YXJuaW5nCi0vLwkJCQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50UHJlZml4KCkgewotLy8JCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkhhbmRsZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIYW5kbGVySUQoKSB7Ci0JCWlmIChmSUQgPT0gbnVsbCkgewotCQkJZklEID0gZ2V0UHJvcGVydHkoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChmSUQgPT0gbnVsbCkgewotCQkJCWlmIChpc0N1c3RvbSgpKSB7Ci0JCQkJCWZJRCA9IGdldFByb3BlcnR5KCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWJ1Zi5hcHBlbmQoZkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkJCQlidWYuYXBwZW5kKCcuJyk7Ci0JCQkJCWJ1Zi5hcHBlbmQoZ2V0UHJvcGVydHkoImVsZW1lbnRuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZJRCA9IGJ1Zi50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZklEOwotCX0KLQotCi0JcHVibGljIFN0cmluZ1tdIGdldFByZWZpeCgpIHsKLQkJaWYgKGZQcmVmaXggPT0gbnVsbCkgewotCQkJaWYgKGZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoaXNDdXN0b20oKSkgeyAvLyBjdXN0b20KLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcHJlZml4ZXMgPSBmRWxlbWVudC5nZXRDaGlsZHJlbigic3RhcnR3aXRoIik7IC8vJE5PTi1OTFMtMSQJCi0JCQkJCWlmIChwcmVmaXhlcyAhPSBudWxsKSB7Ci0JCQkJCQlmUHJlZml4ID0gbmV3IFN0cmluZ1twcmVmaXhlcy5sZW5ndGhdOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWZQcmVmaXhbaV0gPSBwcmVmaXhlc1tpXS5nZXRBdHRyaWJ1dGUoInByZWZpeCIpOyAvLyROT04tTkxTLTEkCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsgLy8gYmFzaWMKLQkJCQkJU3RyaW5nIG5hbWUgPSBnZXRQcm9wZXJ0eSgiZWxlbWVudG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZlByZWZpeCA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCQkJZlByZWZpeFswXSA9IG5hbWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWZQcmVmaXggPSBuZXcgU3RyaW5nWzJdOwotCQkJCQkJCWZQcmVmaXhbMF0gPSBuYW1lOwotCQkJCQkJCWZQcmVmaXhbMV0gPSAnLycgKyBuYW1lOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChmUHJlZml4ID09IG51bGwpIHsKLQkJCWZQcmVmaXggPSBuZXcgU3RyaW5nWzFdOwotCQkJZlByZWZpeFswXSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZQcmVmaXg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKGZBdHRyaWJ1dGVzICE9IG51bGwpID8gKFN0cmluZykgZkF0dHJpYnV0ZXMuZ2V0KG5hbWUpIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDdXN0b20oKSB7Ci0JCXJldHVybiBmQ3VzdG9tOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gZkVtcHR5OwotCX0KLQotCXZvaWQgc2V0dXBDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCWVsZW1lbnQuc2V0Q29tbWVudFRhZyh0cnVlKTsKLQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQ29tbWVudEVsZW1lbnRBZGFwdGVyKGZhbHNlLCBmSGFuZGxlcik7Ci0JCWFkYXB0ZXIuc2V0Q29uZmlndXJhdGlvbih0aGlzKTsKLQkJZWxlbWVudC5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudFJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmQxZjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5IGZJbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY29tbWVudEVsZW1lbnRIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uW10gZkNvbmZpZ3VyYXRpb25zID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29tbWVudEVsZW1lbnRSZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIENvbW1lbnRFbGVtZW50UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltdIGdldENvbmZpZ3VyYXRpb25zKCkgewotCQlpZiAoZkNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZkNvbmZpZ3VyYXRpb25zID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltlbGVtZW50cy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZkNvbmZpZ3VyYXRpb25zW2ldID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbihlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQkJZkNvbmZpZ3VyYXRpb25zID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvblswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb25zOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldHVwQ29tbWVudEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbnNbXSA9IGdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWludCBsZW5ndGggPSBjb25maWd1cmF0aW9ucy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiBjb25mID0gY29uZmlndXJhdGlvbnNbaV07Ci0JCQlib29sZWFuIGlzSlNQID0gZWxlbWVudC5pc0pTUFRhZygpOwotCQkJaWYgKGlzSlNQICYmIGNvbmYuYWNjZXB0SlNQQ29tbWVudCgpIHx8ICFpc0pTUCAmJiBjb25mLmFjY2VwdFhNTENvbW1lbnQoKSkgewotCQkJCUNvbW1lbnRFbGVtZW50SGFuZGxlciBoYW5kbGVyID0gY29uZi5nZXRIYW5kbGVyKCk7Ci0JCQkJaWYgKGhhbmRsZXIuaXNDb21tZW50RWxlbWVudChlbGVtZW50KSkgewotCQkJCQljb25mLnNldHVwQ29tbWVudEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWMyN2JhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9Db21tZW50RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50RWxlbWVudEZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX0VNUFRZID0gNDg2NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU19FTkQgPSAxODA4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNfU1RBUlQgPSAyODAxMTsKLQotCXByaXZhdGUgRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGZIYW5kbGVyOwotCXByaXZhdGUgYm9vbGVhbiBmSlNQVGFnOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbW1lbnRFbGVtZW50RmFjdG9yeS4KLQkgKi8KLQlwcml2YXRlIENvbW1lbnRFbGVtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWVudEVsZW1lbnRGYWN0b3J5KERvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIGlzSlNQVGFnLCBDb21tZW50RWxlbWVudEhhbmRsZXIgaGFuZGxlcikgewotCQl0aGlzKCk7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmSlNQVGFnID0gaXNKU1BUYWc7Ci0JCWZIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGUoU3RyaW5nIG5hbWUsIGludCBub2RlVHlwZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBmRG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbGVtZW50LnNldENvbW1lbnRUYWcodHJ1ZSk7Ci0JCWlmIChub2RlVHlwZSA9PSBJU19FTVBUWSkgewotCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJfQotCQllbGVtZW50LnNldEpTUFRhZyhmSlNQVGFnKTsKLQotCQlDb21tZW50RWxlbWVudEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBDb21tZW50RWxlbWVudEFkYXB0ZXIoKG5vZGVUeXBlID09IElTX0VORCksIGZIYW5kbGVyKTsKLQkJZWxlbWVudC5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9UYWdTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L3V0aWwvVGFnU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDBkNDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9UYWdTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsOwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdTY2FubmVyIHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09ICc9Jyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJyInIHx8IGMgPT0gJ1wnJyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCXByaXZhdGUgaW50IG1lbU9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlwcml2YXRlIGJvb2xlYW4gb25lTGluZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRhZyA9IHRhZzsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubWVtT2Zmc2V0ID0gLTE7Ci0JCWlmICh0YWcgIT0gbnVsbCkKLQkJCXRoaXMubGVuZ3RoID0gdGFnLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQsIGJvb2xlYW4gb25lTGluZSkgewotCQl0aGlzKHRhZywgb2Zmc2V0KTsKLQotCQl0aGlzLm9uZUxpbmUgPSBvbmVMaW5lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TmV4dE9mZnNldCgpIHsKLQkJaW50IGk7Ci0JCWNoYXIgYzsKLQkJZm9yIChpID0gb2Zmc2V0OyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWMgPSB0YWcuY2hhckF0KGkpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzUXVvdGUoYykpIHsKLQkJCQlpKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIWlzU3BhY2UoYykgJiYgIWlzRXF1YWwoYykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm1lbU9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFbmQoY2hhciBjKSB7Ci0JCXJldHVybiAodGhpcy5vbmVMaW5lICYmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdMaW5lKCkgewotCQlpZiAob25lTGluZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJY2hhciBjOwotCQlmb3IgKGludCBpID0gbWVtT2Zmc2V0IC0gMTsgMCA8PSBpOyBpLS0pIHsKLQkJCWMgPSB0YWcuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoIWlzU3BhY2UoYykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNoYXIgbmV4dENoYXIoKSB7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFpc1NwYWNlKGMpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgbmV4dE5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChuZXh0Q2hhcigpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbmFtZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSB8fCBpc1NwYWNlKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzRXF1YWwoYykgJiYgdGhpcy5vZmZzZXQgPiBuYW1lT2Zmc2V0KQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0aGlzLm9mZnNldCA9PSBuYW1lT2Zmc2V0KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdGhpcy5tZW1PZmZzZXQgPSBuYW1lT2Zmc2V0OwotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKG5hbWVPZmZzZXQsIHRoaXMub2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5leHRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudGFnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY2hhciBzZXBlcmF0b3IgPSBuZXh0Q2hhcigpOwotCQlpZiAoIWlzRXF1YWwoc2VwZXJhdG9yKSkKLQkJCXJldHVybiBudWxsOwotCQl0aGlzLm9mZnNldCsrOyAvLyBza2lwICc9JwotCQljaGFyIHF1b3RlID0gbmV4dENoYXIoKTsKLQkJaWYgKHF1b3RlID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGlzUXVvdGUocXVvdGUpKQotCQkJdGhpcy5vZmZzZXQrKzsKLQkJZWxzZQotCQkJcXVvdGUgPSAwOwotCi0JCWludCB2YWx1ZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSkgewotCQkJCXF1b3RlID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChxdW90ZSA9PSAwKSB7Ci0JCQkJaWYgKGlzU3BhY2UoYykpCi0JCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYyA9PSBxdW90ZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHZhbHVlRW5kID0gdGhpcy5vZmZzZXQ7Ci0JCWlmIChxdW90ZSAhPSAwICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGgpCi0JCQl0aGlzLm9mZnNldCsrOwotCQlpZiAodmFsdWVFbmQgPT0gdmFsdWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0aGlzLm1lbU9mZnNldCA9IHZhbHVlT2Zmc2V0OwotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKHZhbHVlT2Zmc2V0LCB2YWx1ZUVuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2JjYmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCi0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gVE9ETzogaWYgZGV0ZWN0ZWRDaGFyc2V0IGFuZCBzcGVjIGRlZmF1bHQgaXMKLQkJLy8gbnVsbCwgbmVlZCB0byB1c2UgIndvcmsKLQkJLy8gYmVuY2ggYmFzZWQiIGRlZmF1bHRzLgotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEBwYXJhbSByZWFzb24KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24pIHsKLQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBlbnN1cmVJbnB1dFNldCgpIHsKLQkJaWYgKGZSZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZSAtLSBpdHMgaGVyZSB3ZSBwaWNrIHVwICJydWxlcyIgZm9yIGNhc2VzCi0JCS8vIHRoYXQgYXJlIG5vdCBldmVuIGluIEphdmEKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2l2ZSBwcmlvcml0eSB0byBqYXZhIGNvbm9uaWNhbCBuYW1lLCBpZiBwcmVzZW50Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCQkvLyBidXQgc3RpbGwgYWxsb3cgb3ZlcnJpZGVzCi0JCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JLy8gdG8gZW5zdXJlIGNvbnNpc3Qgb3ZlcmFsbCBydWxlcyB1c2VkLCB3ZSdsbCBtYXJrIGFzCi0JLy8gZmluYWwsCi0JLy8gYW5kIHJlcXVpcmUgc3ViY2xhc3NlcyB0byBwcm92aWRlIGNlcnRhaW4gcGllY2VzIG9mCi0JLy8gdGhlCi0JLy8gaW1wbGVtZW50YXRpb24KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZQotCQkJLy8gdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcwotCQkJLy8gbm90IHByZXNlbnQuCi0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJaGFuZGxlU3BlY0RlZmF1bHQoKTsKLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkvLyBzYWZ0eSBuZXQKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgTnVsbE1lbWVudG8oKTsKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRvIHJldHVybiBhIGRlZmF1bHQgZW5jb2RpbmcgLS0gYXMgc3BlY2lmaWVkIGJ5IGFuIGluZHVzdHJ5Ci0JICogY29udGVudCB0eXBlIHNwZWMgLS0gd2hlbiBub3QgcHJlc2VudCBpbiB0aGUgc3RyZWFtLCBmb3IgZXhhbXBsZSwgWE1MCi0JICogc3BlY2lmaWVzIFVURi04LCBKU1Agc3BlY2lmaWVzIElTTy04ODU5LTEuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4KLQkgKiBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggInNwZWMgZGVmYXVsdCIuCi0JICovCi0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldFNwZWNEZWZhdWx0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlyZXNldEFsbCgpOwotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGVuYyA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jKTsKLQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3BlY0RlZmF1bHQoKSB7Ci0JCVN0cmluZyBlbmNvZGluZ05hbWU7Ci0JCWVuY29kaW5nTmFtZSA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuY29kaW5nTmFtZSAhPSBudWxsKSB7Ci0JCQkvL2NyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSBrbm93IEJ5dGVSZWFkZXIKLQkJCS8vIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzZXRBbGwoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpU3RvcmFnZS5nZXRDb250ZW50cygpOwotCQlJbnB1dFN0cmVhbSByZXNldHRhYmxlU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJcmVzZXR0YWJsZVN0cmVhbS5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXNldChyZXNldHRhYmxlU3RyZWFtKTsKLQkJLy8gVE9ETyB3ZSdsbCBuZWVkIHRvICJyZW1lbWJlciIgSUZpbGUsIG9yCi0JCS8vIGdldCBpdHMgKG9yIGl0cyBwcm9qZWN0J3MpIHNldHRpbmdzLCBpbiBjYXNlCi0JCS8vIHRob3NlIGFyZSBuZWVkZWQgdG8gaGFuZGxlIGNhc2VzIHdoZW4gdGhlCi0JCS8vIGVuY29kaW5nIGlzIG5vdCBpbiB0aGUgZmlsZSBzdHJlYW0uCi0JfQotCi0JLyoqCi0JICogTm90ZTogdGhpcyBpcyBub3QgcGFydCBvZiBpbnRlcmZhY2UgdG8gaGVscCBhdm9pZCBjb25mdXNpb24gLi4uIGl0Ci0JICogZXhwZWN0ZWQgdGhpcyBSZWFkZXIgaXMgYSB3ZWxsIGZvcm1lZCBjaGFyYWN0ZXIgcmVhZGVyIC4uLiB0aGF0IGlzLCBpdHMKLQkgKiBhbGwgcmVhZHkgYmVlbiBkZXRlcm1pbmVkIHRvIG5vdCBiZSBhIHVuaWNvZGUgbWFya2VkIGlucHV0IHN0cmVhbS4gQW5kLAotCSAqIGl0cyBhc3N1bWVkIHRvIGJlIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uLCBhdCBwb3NpdGlvbiB6ZXJvLCByZWFkeSB0bwotCSAqIHJlYWQgZmlyc3QgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JCWlmICghZlJlYWRlci5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZlJlYWRlcik7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NibGUsIHNpbmNlIHdlIGp1c3QgY2hlY2tlZCBpZiBtYXJrYWJsZQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1MGIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci0KLS8qKgotICogVGhpcyBpcyBhbiAiYWRhcHRlciIgY2xhc3MsIHNpbXBseSB0byBnZXQgaW4gaW5wdXQgc3RyZWFtIHRvIGFjdCBsaWtlIGEKLSAqIHJlYWRlci4gV2UgY291bGQgbm90IHVzZSBJbnB1dFN0cmVhbVJlYWRlciBkaXJlY3RseSBiZWNhdXNlIGl0cyBpbnRlcm5hbAotICogYnVmZmVycyBhcmUgbm90IGNvbnRyb2xsYWJsZSwgYW5kIGl0IHNvbWV0aW1lcyBwdWxscyB0b28gbXVjaCBvdXQgb2YgaW5wdXQKLSAqIHN0cmVhbSAoZXZlbiB3aGVuIGl0IHdhc24ndCBuZWVkZWQgZm9yIG91ciBwdXJwb3NlcykuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBoaWdobHkgc3BlY2lhbGl6ZWQgYW5kIGJ5IG5vdCBtZWFucyBtZWFudCB0byBiZQotICogZ2VuZXJhbCBwdXJwb3NlLiBJdHMgdXNlIGlzIHJlc3RyaWN0ZWQgdG8gdGhvc2UgY2FzZXMgd2hlcmUgdGhlIGlucHV0Ci0gKiBzdHJlYW0gY2FuIGJlIHJlZ2FyZGVkIGFzIGFzY2lpIGp1c3QgbG9uZyBlbm91Z2ggdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHJlYWwKLSAqIGVuY29kaW5nIHNob3VsZCBiZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQnl0ZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gQ29kZWRJTy5NQVhfQlVGX1NJWkU7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHJvdGVjdGVkIEJ5dGVSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKLQkJZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCXJldHVybiAoYjAgJiAweDAwRkYpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsZW5ndGggPiBmQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSBmSW5wdXRTdHJlYW0ucmVhZChmQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTZlNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9yWE1MIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0JLyoqCi0JICogPGNvZGU+cmVzdHJpY3RlZE1vZGU8L2NvZGU+IGlzIHVzZWQganVzdCBmb3IgdGVzdGluZy9leHBlcmltZW50cy4KLQkgKiAKLQkgKiBJZiBpbiByZXN0cmljdGVkTW9kZSwgb3VyICJjdXN0b20iIGNvbnRlbnRUeXBlIGlzIHNlZW4gYXMgdmFsaWQgb25seSBpbgotCSAqIGNhc2VzIHRoYXQgdGhlIHBsYXRmb3JtJ3Mgc3RhbmRhcmQgb25lIGRvZXMgbm90IGNvdmVyLgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gcmVzdHJpY3RlZE1vZGUgPSB0cnVlOwotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQkJcmV0dXJuIG5ldyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uSW5wdXRTdHJlYW0sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uKQotCSAqLwotCXB1YmxpYyBpbnQgZGVzY3JpYmUoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZvciB0aGlzIHNwZWNpYWwgY2FzZSwgYWx3YXlzIGFzc3VtZSBpbnZhbGlkLCB1bmxlc3MKLQkJLy8gb3VyIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyBhcmUgbWV0LgotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5WQUxJRDsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJLy8gcHVyZWx5IHJlcXVlc3QgZm9yIHZhbGlkdHkKLQkJCXJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KHJlc3VsdCwgY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhyZXN1bHQsIGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLlJlYWRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZvciB0aGlzIHNwZWNpYWwgY2FzZSwgYWx3YXlzIGFzc3VtZSBpbnZhbGlkLCB1bmxlc3MKLQkJLy8gb3VyIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyBhcmUgbWV0LgotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5WQUxJRDsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJLy8gcHVyZWx5IHJlcXVlc3QgZm9yIHZhbGlkdHkKLQkJCXJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KHJlc3VsdCwgY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhyZXN1bHQsIGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyI2dldFN1cHBvcnRlZE9wdGlvbnMoKQotCSAqLwotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhpbnQgcmVzdWx0LCBJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJY29udGVudHMucmVzZXQoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQlyZXR1cm5SZXN1bHQgPSBoYW5kbGVDYWxjdWxhdGlvbnMocmVzdWx0LCBkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoaW50IHJlc3VsdCwgSW5wdXRTdHJlYW0gY29udGVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXR1cm5SZXN1bHQgPSByZXN1bHQ7Ci0JCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCWNvbnRlbnRzLnJlc2V0KCk7Ci0JCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCXJldHVyblJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGRldGVjdG9yLCByZXR1cm5SZXN1bHQpOwotCQlyZXR1cm4gcmV0dXJuUmVzdWx0OwotCX0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShpbnQgcmVzdWx0LCBSZWFkZXIgY29udGVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXR1cm5SZXN1bHQgPSByZXN1bHQ7Ci0JCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCWNvbnRlbnRzLnJlc2V0KCk7Ci0JCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCXJldHVyblJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGRldGVjdG9yLCByZXR1cm5SZXN1bHQpOwotCQlyZXR1cm4gcmV0dXJuUmVzdWx0OwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhpbnQgcmVzdWx0LCBSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXR1cm5SZXN1bHQgPSByZXN1bHQ7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQlyZXR1cm5SZXN1bHQgPSBoYW5kbGVDYWxjdWxhdGlvbnMocmVzdWx0LCBkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCS8vIHNpbmNlIGVxdWFsLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCwgYnV0IGlmIG91ciBkZXRlY3RlZCB2ZXJzaW9uIGlzCi0JCS8vIGRpZmZlcmVudCB0aGFuCi0JCS8vIGphdmFDaGFyc2V0LCB0aGVuIHdlIHNob3VsZCBhZGQgaXQuIFRoaXMgd2lsbCBoYXBwZW4sIGZvciBleGFtcGxlLAotCQkvLyBpZiB0aGVyZSdzCi0JCS8vIGRpZmZlcmVuY2VzIGluIGNhc2UsIG9yIGRpZmZlcmVuY2VzIGR1ZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzCi0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gaWYgKCFkZXRlY3RlZENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJLy8gZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsCi0JCQkvLyBkZXRlY3RlZENoYXJzZXQpOwotCQkJLy8gfQotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRldGVjdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgaW50IGhhbmRsZUNhbGN1bGF0aW9ucyhpbnQgcmVzdWx0LCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXR1cm5SZXN1bHQgPSByZXN1bHQ7Ci0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSAoKFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3IpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkJLy8gYnkgdGV4dCB0eXBlLgotCQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LAotCQkJCS8vIG1heQotCQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCQl9Ci0KLQotCQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCQkvLyBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVAotCQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lCi0JCQkJLy8gaWYgaW52YWxpZCBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMKLQkJCQkvLyBhbiAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBlbmNvZGluZ01lbWVudG8uZ2V0SW52YWxpZEVuY29kaW5nKCkpOwotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQkJfQotCi0JCQlPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQotCQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCQlpZiAoamF2YUNoYXJzZXQuZXF1YWxzKGV4aXN0aW5nQ2hhcnNldCkpIHsKLQkJCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQKLQkJCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZGV0ZWN0b3IuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cwotCQkJCQkJLy8gbmVlZCB0byBhZGQuCi0JCQkJCQkvLyBUT0RPOiB0aGlzIGlzIHByb2JhYmx5IGEgZGVhZCBicmFuY2ggaW4gY3VycmVudAotCQkJCQkJLy8gY29kZSwgc2hvdWxkIHJlLWV4YW1pbmUgZm9yIHJlbW92YWwuCi0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVyblJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGRldGVjdG9yLCByZXR1cm5SZXN1bHQpOwotCQlyZXR1cm4gcmV0dXJuUmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciwgaW50IHJldHVyblJlc3VsdCkgewotCQkvLyB3ZSBhbHdheXMgZXhwZWN0IFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciwgYnV0IGp1c3QgdG8gbWFrZSBzYWZlCi0JCS8vIGNhc3QuCi0JCWlmIChkZXRlY3RvciBpbnN0YW5jZW9mIFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgewotCQkJWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIHhtbFJlc291cmNlRGV0ZWN0b3IgPSAoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcjsKLQkJCWlmICh4bWxSZXNvdXJjZURldGVjdG9yLmlzRGVjbERldGVjdGVkKCkpIHsKLQkJCQlpZiAocmVzdHJpY3RlZE1vZGUpIHsKLQkJCQkJLy8gaWYgdGhlcmUgaXMgbm8gaW5pdGlhbCB3aGl0ZXNwYWNlLCB0aGVuIHBsYXRmb3JtJ3MKLQkJCQkJLy8gZGVmYXVsdCBvbmUgd2lsbCBkby4KLQkJCQkJaWYgKHhtbFJlc291cmNlRGV0ZWN0b3IuaGFzSW5pdGlhbFdoaXRlU3BhY2UoKSkgewotCQkJCQkJcmV0dXJuUmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVyblJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0dXJuUmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ1BhcnNlckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ1BhcnNlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDU0MmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cyB7Ci0KLQlmaW5hbCBTdHJpbmcgRU9GID0gIkVPRiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSA9ICJJbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBJbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlID0gIkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIE1BWF9DSEFSU19SRUFDSEVEID0gIk1BWF9DSEFSU19SRUFDSEVEIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBTdHJpbmdWYWx1ZSA9ICJzdHJ2YWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUgPSAiVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFVURjE2QkUgPSAiVVRGMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFVURjE2TEUgPSAiVVRGMTZMRSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIGZpbmFsIFN0cmluZyBVVEY4M0J5dGVCT00gPSAiVVRGODNCeXRlQk9NIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxNGI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDEwNTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKgotICogCi0gKiBBIG5vbi1yZXNpemFibGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciBvZiBqYXZhLnV0aWwuU3RhY2ssIGJ1dAotICogZGlyZWN0bHkgZm9yIHRoZSA8Y29kZT4gaW50ZWdlciA8L2NvZGU+IHByaW1pdGl2ZS4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW50U3RhY2sgewotCXByaXZhdGUgaW50W10gbGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBJbnRTdGFjaygpIHsKLQkJdGhpcygxMDApOwotCX0KLQotCXB1YmxpYyBJbnRTdGFjayhpbnQgbWF4ZGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbGlzdCA9IG5ldyBpbnRbbWF4ZGVwdGhdOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldChpbnQgc2xvdCkgewotCQlyZXR1cm4gbGlzdFtzbG90XTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QubGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmNzQ2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL051bGxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTERlY2xEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQwZmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWE1MRGVjbERldGVjdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRl9TSVpFID0gMTAyNCAqIDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9NQVJLX1NJWkUgPSAxMDI0ICogODsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCXByaXZhdGUgYm9vbGVhbiBmSXNYTUw7Ci0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCS8vcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQkvL2ZVbmljb2RlID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJLy9mVW5pY29kZSA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCS8vZlVuaWNvZGUgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW07Ci0JfQotCi0JZmluYWwgcHJpdmF0ZSB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vcHJpdmF0ZSBTdHJpbmcgZlVuaWNvZGU7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRva2VuaXplci4KLQkgKi8KLQlwcml2YXRlIFhNTEhlYWRUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzWE1MLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCX0KLQkJcmV0dXJuIGZJc1hNTDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVhNTEhlYWRUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJSGVhZFBhcnNlclRva2VuIHRva2VuID0gbnVsbDsKLQkJU3RyaW5nIHRva2VuVHlwZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJZlJlYWRlci5yZXNldCgpOwotCQkJCS8vIHRoaXMgaXMgKG9idmlvdXNseSkgbm90IGFsd2F5cyB0cnVlLgotCQkJCS8vIFRPRE86IG5lZWQgdG8gZml4IHNvIHdlICJyZW1lbWJlciIgb3JpZ2luYWwgaUZpbGUgb3IKLQkJCQkvLyBpbnB1dHN0cmVhbSwgYW5kCi0JCQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIElucHV0U3RyZWFtUmVhZGVyLgotCQkJCS8vIEknbSBub3Qgc3VyZSB3aGF0IHRvIGRvIGZvciB0aGUgc2V0KHJlYWRlcikgY2FzZSAuLi4gaWYgaXRzCi0JCQkJLy8gZXZlbiByZWxldmVudC4KLQkJCQkvLyBwbHVzLCBlbnN1cmUgYWdhaW5zdCBpbmZpbml0ZSBsb29wcyEKLQkJCQlmSXNYTUwgPSB0cnVlOwotCQkJCS8vZlJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmUmVhZGVyLCBmVW5pY29kZSk7Ci0JCQkJLy8gcGFyc2VJbnB1dCgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJZklzWE1MID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmSXNYTUwgPSBmYWxzZTsKLQkJLy9mVW5pY29kZSA9IG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzZXRBbGwoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpRmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBNQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCXNldChyZXNldHRhYmxlU3RyZWFtKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmZiNDBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1MSArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQuMiBvbiA3LzI4LzA4IDk6MjkgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS8iPkpGbGV4PC9hPiAxLjQuMgotICogb24gNy8yOC8wOCA5OjI5IEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PkQ6L3dvcmtzcGFjZXMvd3RwMzAxL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxIZWFkVG9rZW5pemVyIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9CVUZGRVJTSVpFID0gODE5MjsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFFfU1RSSU5HID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FfU1RSSU5HID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNDsKLQotICAvKioKLSAgICogWlpfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWlpfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCA2Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMVwxMVwxMFwwXDFcNlwxXDEwXDJcMFwxXDdcMjJcMFwxXDZcMVwwXDFcMzMiKwotICAgICJcMlwwXDFcMzVcMVwwXDFcMzRcMjRcMFwxXDEzXDFcMTJcMVwzMlwxXDE0XDNcMCIrCi0gICAgIlwxXDI3XDFcMzBcMVwyMVwxXDBcMVwzMVwxXDBcMVwyNFwyXDBcMVwxN1wxXDE2IisKLSAgICAiXDFcMjZcMVwyNVwyXDBcMVwyMlwxXDIzXDJcMFwxXDIwXDFcMFwxXDE1XDEyXDAiKwotICAgICJcMVwyN1wxXDMwXDFcMjFcMVwwXDFcMzFcMVwwXDFcMjRcMlwwXDFcMTdcMVwxNiIrCi0gICAgIlwxXDI2XDFcMjVcMlwwXDFcMjJcMVwyM1wyXDBcMVwyMFwxXDBcMVwxNVwxMDJcMCIrCi0gICAgIlwxXDRcM1wwXDFcNVwxN1wwXDFcM1wxNlwwXDFcMVwyMFwwXDFcM1wxNlwwIisKLSAgICAiXDFcMVwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIFpaX0NNQVAgPSB6elVucGFja0NNYXAoWlpfQ01BUF9QQUNLRUQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBERkEgc3RhdGVzIHRvIGFjdGlvbiBzd2l0Y2ggbGFiZWxzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FDVElPTiA9IHp6VW5wYWNrQWN0aW9uKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9Ci0gICAgIlw3XDBcMTNcMVwyXDJcMVwxXDFcMlwxXDNcMVw0XDFcNSIrCi0gICAgIlwxXDZcMVwxXDFcNVwxXDdcMVwxXDFcNVwxXDEwXDFcMSIrCi0gICAgIlwxXDExXDFcMTJcMVwxM1wxMlwwXDFcMTRcNVwwXDFcMlwxXDMiKwotICAgICJcMVw0XDFcNlwyXDBcMVwxNVwxXDdcMlwwXDFcMTBcMVwxMSIrCi0gICAgIlwxXDE2XDNcMFwxXDE0XDRcMFwxXDJcMVwxNVwxNFwwXDFcMTciKwotICAgICJcNVwwXDFcMTdcNlwwXDFcMjBcM1wwXDFcMjBcMlwwXDFcMjEiKwotICAgICJcMVwwXDFcMjFcMVwwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbMTExXTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1BVU0hCQUNLXzJCSUcgPSAyOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHp6UmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHp6U3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgenpCdWZmZXJbXSA9IG5ldyBjaGFyW1paX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ek1hcmtlZFBvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6Q3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6U3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgenpFbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotLy8gIHByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6RU9GRG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgICAgICAvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gICAgICAgICAgICAgICAgenpSZWFkZXIgPSBpbjsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgICAgICAgICAgICAgICB6elN0YXRlID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAgICAgICAgICAgICAgIC8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLS8vICAgICAgICAgICAgICAgIHp6UHVzaGJhY2tQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpDdXJyZW50UG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6U3RhcnRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgICAgICAgICAgICAqIGZyb20gaW5wdXQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekVuZFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0vLyAgICAgICAgICAgICAgICB5eWxpbmUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gICAgICAgICAgICAgICAgeXljaGFyID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAgICAgICAgICAgICAgICAqLwotLy8gICAgICAgICAgICAgICAgeXljb2x1bW4gPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgKiBvZiBhIGxpbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsKLQotCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIGhhc01vcmUgPSB0cnVlOwotICAJCQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQkKLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQkKLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE1MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkID4gMCkgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gdW5saWtlbHkgYnV0IG5vdCBpbXBvc3NpYmxlOiByZWFkIDAgY2hhcmFjdGVycywgYnV0IG5vdCBhdCBlbmQgb2Ygc3RyZWFtICAgIAotICAgIGlmIChudW1SZWFkID09IDApIHsKLSAgICAgIGludCBjID0genpSZWFkZXIucmVhZCgpOwotICAgICAgaWYgKGMgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB6ekJ1ZmZlclt6ekVuZFJlYWQrK10gPSAoY2hhcikgYzsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSAgICAgCi0gICAgfQotCi0JLy8gbnVtUmVhZCA8IDAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLSAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICogRG9lcyBub3QgY2xvc2UgdGhlIG9sZCByZWFkZXIuCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotICAgIHp6UmVhZGVyID0gcmVhZGVyOwotICAgIHp6QXRCT0wgID0gdHJ1ZTsKLSAgICB6ekF0RU9GICA9IGZhbHNlOwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkID0gMDsKLSAgICB6ekN1cnJlbnRQb3MgPSB6ek1hcmtlZFBvcyA9IDA7Ci0gICAgeXljaGFyID0gMDsKLSAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwgenpNYXJrZWRQb3MtenpTdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgcHVibGljIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHB1YmxpYyB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgenpTY2FuRXJyb3IoWlpfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB6ek1hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6RG9FT0YoKSB7Ci0gICAgaWYgKCF6ekVPRkRvbmUpIHsKLSAgICAgIHp6RU9GRG9uZSA9IHRydWU7Ci0gICAgCWhhc01vcmU9ZmFsc2U7Ci0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0KLSAgICAgIHl5Y2hhcis9IHp6TWFya2VkUG9zTC16elN0YXJ0UmVhZDsKLQotICAgICAgaWYgKHp6TWFya2VkUG9zTCA+IHp6U3RhcnRSZWFkKSB7Ci0gICAgICAgIHN3aXRjaCAoenpCdWZmZXJMW3p6TWFya2VkUG9zTC0xXSkgewotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgIGNhc2UgJ1x1MDAwQic6Ci0gICAgICAgIGNhc2UgJ1x1MDAwQyc6Ci0gICAgICAgIGNhc2UgJ1x1MDA4NSc6Ci0gICAgICAgIGNhc2UgJ1x1MjAyOCc6Ci0gICAgICAgIGNhc2UgJ1x1MjAyOSc6Ci0gICAgICAgICAgenpBdEJPTCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xyJzogCi0gICAgICAgICAgaWYgKHp6TWFya2VkUG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6ekF0Qk9MID0genpCdWZmZXJMW3p6TWFya2VkUG9zTF0gIT0gJ1xuJzsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKQotICAgICAgICAgICAgenpBdEJPTCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgICAgICAgICAgenpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgICAgICAgICBpZiAoZW9mKSAKLSAgICAgICAgICAgICAgenpBdEJPTCA9IGZhbHNlOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgenpBdEJPTCA9IHp6QnVmZmVyTFt6ek1hcmtlZFBvc0xdICE9ICdcbic7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIGlmICh6ekF0Qk9MKQotICAgICAgICB6elN0YXRlID0gWlpfTEVYU1RBVEVbenpMZXhpY2FsU3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHp6U3RhdGUgPSBaWl9MRVhTVEFURVt6ekxleGljYWxTdGF0ZV07Ci0KLQotICAgICAgenpGb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikgewotICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3MgID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zICAgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHp6Q3VycmVudFBvc0wgID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMICAgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCAgICAgID0genpCdWZmZXI7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMICAgICA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHp6SW5wdXQgPSB6ekNNYXBMW3p6SW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB6eklzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHp6Tm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHp6Rm9yTmV4dDogeyBzd2l0Y2ggKHp6U3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDExOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHp6U3RhdGUgPSAzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSAzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gNDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDE4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDE4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDU4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSA2MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDYyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDYzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDY0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDY2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDY4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA3MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA3MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gNzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA3NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDc5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDgwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDc2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gODE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA4MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA4NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA4MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDg1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDg2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDgyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gODg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA4OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA5MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSA4NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDkyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gOTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gOTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA5NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA5NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA5MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDk4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gOTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gOTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gOTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTAwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDk4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMTAxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpTdGF0ZSA9IDEwMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA5NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDEwNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gMTAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6U3RhdGUgPSA5NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpTdGF0ZSA9IDEwMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAxMDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDExMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6elN0YXRlID0gMTAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgZXZlciByZWFjaGVkLCB0aGVyZSBpcyBhIHNlcmlvdXMgYnVnIGluIEpGbGV4Ci0gICAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX1VOS05PV05fRVJST1IpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggenpJc0ZpbmFsICkgewotICAgICAgICAgICAgenpBY3Rpb24gPSB6elN0YXRlOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIGlmICggenpOb0xvb2tBaGVhZCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTg6IGJyZWFrOwotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDIxOiBicmVhazsKLSAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDIyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDIzOiBicmVhazsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IGlmKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDY6IAotICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI1OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgICB7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI3OiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzQ6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgenpEb0VPRigpOwotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmMjNmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MSGVhZFRva2VuaXplckNvbnN0YW50cyBleHRlbmRzIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzIHsKLQotCWZpbmFsIFN0cmluZyBYTUxEZWNsRW5kID0gIlhNTERlY2xFbmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlY2xTdGFydCA9ICJYTUxEZWNsU3RhcnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlbEVuY29kaW5nID0gIlhNTERlbEVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBYTUxEZWNsVmVyc2lvbiA9ICJYTUxEZWNsVmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY5MGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCXByaXZhdGUgWE1MSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCXByaXZhdGUgYm9vbGVhbiBmRGVjbERldGVjdGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbml0aWFsV2hpdGVTcGFjZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbShTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gZmFsc2U7Ci0JCWlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSB8fCB0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQkJYnl0ZVtdIGJvbSA9ICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSkgPyBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZCRSA6IElDb250ZW50RGVzY3JpcHRpb24uQk9NX1VURl8xNkxFOwotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVbmljb2RlU3RyZWFtKHRydWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVbmljb2RlQk9NKGJvbSk7Ci0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9rZW5pemVyLgotCSAqLwotCXByaXZhdGUgWE1MSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gd29yayBvbiAncmVzZXQnIGluIHRva2VuaXplciwgc28gbmV3IGluc3RhbmNlIGlzbid0Ci0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJLy8gaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQlmVG9rZW5pemVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoKTsKLQkJLy8gfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMZWdhbFN0cmluZyhTdHJpbmcgdmFsdWVUb2tlblR5cGUpIHsKLQkJaWYgKHZhbHVlVG9rZW5UeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQotCQkJLy8gaGFuZGxlIHhtbCBjb250ZW50IHR5cGUgZGV0ZWN0aW9uCi0JCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0KSB7Ci0JCQkJZkRlY2xEZXRlY3RlZCA9IHRydWU7Ci0JCQkJU3RyaW5nIGRlY2xUZXh0ID0gdG9rZW4uZ2V0VGV4dCgpOwotCQkJCWlmIChkZWNsVGV4dC5zdGFydHNXaXRoKCI8PyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZkluaXRpYWxXaGl0ZVNwYWNlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaGFuZGxlIGVuY29kaW5nIGRldGVjdGlvbgotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZSBtZW1lbnRvCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodG9rZW5UeXBlKSkgewotCQkJCQkJCVN0cmluZyBlbmMgPSB0b2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlY2xEZXRlY3RlZCgpIHsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQl0cnkgewotCQkJCXBhcnNlSW5wdXQoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCQkJfQotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCX0KLQkJLy8gZkRlY2xEZXRlY3RlZCBpcyBzZXQgYXMgcGFydCBvZiBwYXJzaW5nLgotCQlyZXR1cm4gZkRlY2xEZXRlY3RlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJbml0aWFsV2hpdGVTcGFjZSgpIHsKLQkJcmV0dXJuIGZJbml0aWFsV2hpdGVTcGFjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldEFsbCgpIHsKLQkgICAgc3VwZXIucmVzZXRBbGwoKTsKLQkJZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTBjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BdHRySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTE5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogQXR0ckltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEF0dHJJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBJRE9NQXR0ciB7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIElUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0JcHJpdmF0ZSBFbGVtZW50SW1wbCBvd25lckVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlU291cmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEF0dHJJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEF0dHJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEF0dHJJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEF0dHJJbXBsCi0JICovCi0JcHJvdGVjdGVkIEF0dHJJbXBsKEF0dHJJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQkJdGhpcy52YWx1ZVNvdXJjZSA9IHRoYXQuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUF0dHJJbXBsIGNsb25lZCA9IG5ldyBBdHRySW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGdldE93bmVyRWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZWxlbWVudC5nZXREZWNsYXJhdGlvbigpOwotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudChnZXRPd25lckVsZW1lbnQoKSwgZWxlbWVudERlY2wsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiAmJiBuYW1lLmVxdWFscyhjbW5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJaW50IG9mZnNldCA9IHRoaXMub3duZXJFbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy52YWx1ZVJlZ2lvbi5nZXRFbmQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMuZXF1YWxSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLmVxdWFsUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlpZiAodGhpcy5uYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy5uYW1lUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFcXVhbFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxSZWdpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSB0aGlzLm5hbWUuaW5kZXhPZignOicpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJcmV0dXJuIHRoaXMubmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lUmVnaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lUmVnaW9uU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lUmVnaW9uVGV4dCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCh0aGlzLm5hbWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvblRleHRFbmRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQodGhpcy5uYW1lUmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJU3RyaW5nIG5zQXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAocHJlZml4LmVxdWFscyhJWE1MTmFtZXNwYWNlLlhNTE5TKSkgewotCQkJCS8vIGZpeGVkIFVSSQotCQkJCXJldHVybiBJWE1MTmFtZXNwYWNlLlhNTE5TX1VSSTsKLQkJCX0KLQkJCW5zQXR0ck5hbWUgPSBJWE1MTmFtZXNwYWNlLlhNTE5TX1BSRUZJWCArIHByZWZpeDsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhJWE1MTmFtZXNwYWNlLlhNTE5TKSkgewotCQkJCS8vIGZpeGVkIFVSSQotCQkJCXJldHVybiBJWE1MTmFtZXNwYWNlLlhNTE5TX1VSSTsKLQkJCX0KLQkJCS8vIGRvZXMgbm90IGluaGVyaXQgbmFtZXNwYWNlIGZyb20gb3duZXIgZWxlbWVudAotCQkJLy8gaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHJldHVybgotCQkJLy8gdGhpcy5vd25lckVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUkk7Ci0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXMub3duZXJFbGVtZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuc0F0dHJOYW1lKTsKLQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQkJfQotCi0JCXJldHVybiB0aGlzLm5hbWVzcGFjZVVSSTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBVFRSSUJVVEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE93bmVyRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRPd25lckVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IHRoaXMubmFtZS5pbmRleE9mKCc6Jyk7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiBuYW1lCi0JCWlmICh0aGlzLm5hbWUuY2hhckF0KDApID09ICc8JykKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy5uYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3BlY2lmaWVkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNwZWNpZmllZCgpIHsKLQkJLy8gaWYgdGhlcmUgaXMgbm8gdW5kZXJseWluZyBkb2N1bWVudCByZWdpb24sIAotCQkvLyB0aGVuIHRoaXMgYXR0cmlidXRlcyB2YWx1ZSBoYXMgbm90IHJlYWxseSBiZSBzcGVjaWZpZWQKLQkJLy8geWV0IGluIHRoZSBkb2N1bWVudCwgYW5kIGFueSByZXR1cm5lZCB2YWx1ZXMsIHN1Y2ggYXMgCi0JCS8vIGFuIGVtcHR5IHN0cmluZyBvciBhIGRlZmF1bHQgdmFsdWUgYXJlIGJlaW5nIHN1cHBsaWVkCi0JCS8vIGFzIHBlciBzcGVjLCBub3QgcGVyIHdoYXQncyBpbiB0aGUgdXNlcnMgZG9jdW1lbnQuCi0JCXJldHVybiB0aGlzLnZhbHVlUmVnaW9uICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpbnQgb2Zmc2V0ID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHRoaXMubmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMubmFtZVJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCQlpZiAodGhpcy5lcXVhbFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMuZXF1YWxSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMudmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLnZhbHVlUmVnaW9uLmdldFN0YXJ0KCkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZShnZXRWYWx1ZVNvdXJjZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHZhbHVlIGZvciB0aGUgc291cmNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAoc291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gc291cmNlOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCByZWYgPSBzb3VyY2UuaW5kZXhPZignJicpOwotCQl3aGlsZSAocmVmID49IDApIHsKLQkJCWludCBlbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKGVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgZW5kKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBnZXRDaGFyVmFsdWUobmFtZSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCQkJCQlpZiAocmVmID4gb2Zmc2V0KQotCQkJCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCwgcmVmKSk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodmFsdWUpOwotCQkJCQlvZmZzZXQgPSBlbmQgKyAxOwotCQkJCQlyZWYgPSBlbmQ7Ci0JCQkJfQotCQkJfQotCQkJcmVmID0gc291cmNlLmluZGV4T2YoJyYnLCByZWYgKyAxKTsKLQkJfQotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gc291cmNlOwotCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFZhbHVlUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZVJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogd2hhdCBzaG91bGQgYmVoYXZpb3IgYmUgaWYgdGhpcy52YWx1ZSA9PSBudWxsPyBJdCdzIGFuICJlcnJvciIKLQkgKiB0byBiZSBpbiB0aGF0IHN0YXRlLCBidXQgc2VlbXMgdG8gb2NjdXIgcmVsYXRpdmVseSBlYXNpbHkgLi4uIHByb2JhYmx5Ci0JICogZHVlIHRvIHRocmVhZGluZyBidWdzIC4uLiBidXQgdGhpcyBqdXN0IHNob3dzIGl0cyBuZWVkcyB0byBiZSBzcGVjJ2QuCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIHRoZSB2YWx1ZVJlZ2lvbiAtLSBzaG91bGQgbWFrZSBzbWFydGVyPwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQkvLyBlbnN1cmUgd2UgbmV2ZXIgcGFzcyBudWxsIHRvIGdldFN0YXJ0T2Zmc2V0LgotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRoaXMudmFsdWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVSZWdpb25UZXh0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIGF0dHJpYnV0ZXMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQodGhpcy52YWx1ZVJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpIHsKLQkJaWYgKHRoaXMudmFsdWVTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLnZhbHVlU291cmNlOwotCQkvLyBEVzogNC8xNi8yMDAzIGR1ZSB0byBjaGFuZ2UgaW4gc3RydWN0dXJlZERvY3VtZW50IC4uLiB3ZSBuZWVkIGEKLQkJLy8gZmxhdG5vZGUgdG8KLQkJLy8gZ2V0IGF0IHJlZ2lvbiB2YWx1ZXMuIEZvciBub3cgSSdsbCBhc3N1bWUgdGhpcyBpcyBhbHdheXMgdGhlIGZpcnN0Ci0JCS8vIGZsYXRub2RlIC4uIG1heSBuZWVkIHRvIG1ha2Ugc21hcnRlciBsYXRlciAoZS5nLiB0byBzZWFyY2ggZm9yCi0JCS8vIHRoZSBmbGF0bm9kZSB0aGF0IHRoaXMudmFsdWVSZWdpb24gYmVsb25ncyB0by4KLQkJLy8gRFc6IDQvMzAvMjAwMyBGb3Igc29tZSByZWFzb24sIHRoaXMgbWV0aG9kIGlzIGdldHRpbmcgY2FsbGVkIGEgbG90Ci0JCS8vIE5vdCBzdXJlIGlmIGl0cyBhIHRocmVhZGluZyBwcm9ibGVtLCBvciBhIGZ1bmRhbWVudGFsIGVycm9yCi0JCS8vIGVsc2V3aGVyZS4KLQkJLy8gSXQgbmVlZHMgbW9yZSBpbnZlc3RpZ2F0aW9uLCBidXQgaW4gdGhlIHVzZSBjYXNlcyBJJ3ZlIHNlZW4sCi0JCS8vIGRvZXNuJ3QKLQkJLy8gc2VlbSB0byBodXJ0IHRvIHNpbXBseSByZXR1cm4gbnVsbCBpbiB0aG9zZSBjYXNlcy4gSSBzYXcgdGhpcyBudWxsCi0JCS8vIGNhc2UsCi0JCS8vIHdoZW4gdHJ5aW50IGdvIGZvcm1hdCBhbiBYTUwgZmlsZS4KLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvd25lclJlZ2lvbiA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChvd25lclJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUob3duZXJSZWdpb24sIHRoaXMudmFsdWVSZWdpb24pOwotCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlU291cmNlKEVsZW1lbnRJbXBsIG93bmVyRWxlbWVudCkgewotCQlpZiAodGhpcy52YWx1ZVNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMudmFsdWVTb3VyY2U7Ci0JCS8vIERXOiA0LzE2LzIwMDMgZHVlIHRvIGNoYW5nZSBpbiBzdHJ1Y3R1cmVkRG9jdW1lbnQgLi4uIHdlIG5lZWQgYQotCQkvLyBmbGF0bm9kZSB0bwotCQkvLyBnZXQgYXQgcmVnaW9uIHZhbHVlcy4gRm9yIG5vdyBJJ2xsIGFzc3VtZSB0aGlzIGlzIGFsd2F5cyB0aGUgZmlyc3QKLQkJLy8gZmxhdG5vZGUgLi4gbWF5IG5lZWQgdG8gbWFrZSBzbWFydGVyIGxhdGVyIChlLmcuIHRvIHNlYXJjaCBmb3IKLQkJLy8gdGhlIGZsYXRub2RlIHRoYXQgdGhpcy52YWx1ZVJlZ2lvbiBiZWxvbmdzIHRvLgotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKG93bmVyRWxlbWVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgdGhpcy52YWx1ZVJlZ2lvbik7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHZhbHVlOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaW50IGFtcCA9IHZhbHVlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKGFtcCA+PSAwKSB7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA0KTsKLQkJCWlmIChhbXAgPiBvZmZzZXQpCi0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZS5zdWJzdHJpbmcob2Zmc2V0LCBhbXApKTsKLQkJCWJ1ZmZlci5hcHBlbmQoSVhNTENoYXJFbnRpdHkuQU1QX1JFRik7Ci0JCQlvZmZzZXQgPSBhbXAgKyAxOwotCQkJYW1wID0gdmFsdWUuaW5kZXhPZignJicsIG9mZnNldCk7Ci0JCX0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHZhbHVlOwotCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBBdHRyIGhhcyBKU1AgaW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXN0ZWRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudmFsdWVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEodGhpcy52YWx1ZVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSB0aGlzLnZhbHVlUmVnaW9uKS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IGlzTmVzdGVkTGFuZ3VhZ2VPcGVuaW5nKHJlZ2lvblR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBBdHRyIGhhcyBvbmx5IG5hbWUgYnV0IG5vdCBlcXVhbCBzaWduIG5vciB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05hbWVPbmx5KCkgewotCQlyZXR1cm4gKHRoaXMubmFtZVJlZ2lvbiAhPSBudWxsICYmIHRoaXMuZXF1YWxSZWdpb24gPT0gbnVsbCAmJiB0aGlzLnZhbHVlUmVnaW9uID09IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc1ByZWZpeCgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5uYW1lLmluZGV4T2YoJzonKSA8PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBleGNsdWRlIEpTUCB0YWcgaW4gbmFtZQotCQlpZiAodGhpcy5uYW1lLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlnbm9yZUNhc2UoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5vd25lckVsZW1lbnQuaWdub3JlQ2FzZSgpKSB7Ci0JCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50Lmlnbm9yZUNhc2UoKSkgewotCQkJCS8vIGV2ZW4gaW4gY2FzZSBpbnNlbnNpdGl2ZSBkb2N1bWVudCwgaWYgaGF2aW5nIHByZWZpeCwgaXQncwotCQkJCS8vIGNhc2Ugc2Vuc2l0aXZlCi0JCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWxBdHRyKCkgewotCQlpZiAoaGFzUHJlZml4KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5vd25lckVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1hNTEF0dHIoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMub3duZXJFbGVtZW50LmlzWE1MVGFnKCkpIHsKLQkJCQlyZXR1cm4gaGFzUHJlZml4KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiAhZG9jdW1lbnQuaXNYTUxUeXBlKCkpIHsKLQkJCQkvLyBldmVuIGluIG5vbi1YTUwgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MgWE1MIHRhZwotCQkJCXJldHVybiBoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBtYXRjaE5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAodGhpcy5uYW1lID09IG51bGwpOwotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLm5hbWUubGVuZ3RoKCkgIT0gbmFtZS5sZW5ndGgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMubmFtZS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMubmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpICYmIGlnbm9yZUNhc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlOYW1lQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMub3duZXJFbGVtZW50LmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwubmFtZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMub3duZXJFbGVtZW50LmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwudmFsdWVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZVJlZ2lvbnMgbWV0aG9kCi0JICovCi0Jdm9pZCByZW1vdmVSZWdpb25zKCkgewotCQl0aGlzLm5hbWVSZWdpb24gPSBudWxsOwotCQl0aGlzLnZhbHVlUmVnaW9uID0gbnVsbDsKLQkJdGhpcy5lcXVhbFJlZ2lvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoKSB7Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZSgpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoRWxlbWVudEltcGwgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZShvd25lckVsZW1lbnQpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0Jdm9pZCBzZXRFcXVhbFJlZ2lvbihJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbikgewotCQl0aGlzLmVxdWFsUmVnaW9uID0gZXF1YWxSZWdpb247Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJCXN0YXJ0T2Zmc2V0ID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCXRoaXMub3duZXJFbGVtZW50Lm5vdGlmeShDSEFOR0UsIHRoaXMsIHZhbHVlLCBudWxsLCBzdGFydE9mZnNldCk7Ci0JCX0KLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXRoaXMub3duZXJFbGVtZW50Lm5vdGlmeShDSEFOR0UsIHRoaXMsIG51bGwsIHZhbHVlLCBzdGFydE9mZnNldCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldE5hbWVSZWdpb24oSVRleHRSZWdpb24gbmFtZVJlZ2lvbikgewotCQl0aGlzLm5hbWVSZWdpb24gPSBuYW1lUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRWYWx1ZShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHNldE93bmVyRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJFbGVtZW50KEVsZW1lbnQgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCAmJiAhdGhpcy5vd25lckVsZW1lbnQuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBwcmVmaXhMZW5ndGggPSAocHJlZml4ICE9IG51bGwgPyBwcmVmaXgubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IGdldExvY2FsTmFtZSgpOwotCQlpZiAocHJlZml4TGVuZ3RoID09IDApIHsKLQkJCXNldE5hbWUobG9jYWxOYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobG9jYWxOYW1lID09IG51bGwpCi0JCQlsb2NhbE5hbWUgPSBuZXcgU3RyaW5nKCk7Ci0JCWludCBsb2NhbExlbmd0aCA9IGxvY2FsTmFtZS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocHJlZml4TGVuZ3RoICsgMSArIGxvY2FsTGVuZ3RoKTsKLQkJYnVmZmVyLmFwcGVuZChwcmVmaXgpOwotCQlidWZmZXIuYXBwZW5kKCc6Jyk7Ci0JCWJ1ZmZlci5hcHBlbmQobG9jYWxOYW1lKTsKLQkJc2V0TmFtZShidWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJbm90aWZ5TmFtZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gUmVtZW1iZXI6IGFzIHdlIGFjY291bnQgZm9yICJmbG9hdGVycyIgaW4KLQkJLy8gZnV0dXJlLCByZW1lbWJlciB0aGF0IHNvbWUgYXJlIGNyZWF0ZWQKLQkJLy8gaW4gdGhlIG5hdHVyYWwgcHJvY2VzcyBvZiBpbXBsZW1lbnRpbmcKLQkJLy8gRE9NIGFwaXMuCi0JCS8vIHRoaXMgInNlbGYgbm90aWZpY2F0aW9uIiBvZiBhYm91dC9jaGFuZ2VkLAotCQkvLyBpcyBhZGRlZCBmb3IgdGhpcyBjYXNlLCBiZWNhdXNlIGl0IGtub3duIHRvCi0JCS8vIGJlIGNhbGxlZCBmcm9tIHByb3BlcnRpZXMgcGFnZXMuIFNob3VsZCBiZSBhCi0JCS8vIGFkZGVkIHRvIGFsbCBET00gTW9kaWZpeWluZyBBUElzIGV2ZW50dWFsbHkuCi0JCXRyeSB7Ci0JCQlnZXRNb2RlbCgpLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJc2V0VmFsdWVTb3VyY2UoZ2V0VmFsdWVTb3VyY2UodmFsdWUpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWdldE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldFZhbHVlUmVnaW9uKElUZXh0UmVnaW9uIHZhbHVlUmVnaW9uKSB7Ci0JCXRoaXMudmFsdWVSZWdpb24gPSB2YWx1ZVJlZ2lvbjsKLQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQl0aGlzLnZhbHVlU291cmNlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsICYmICF0aGlzLm93bmVyRWxlbWVudC5pc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJdGhpcy52YWx1ZVNvdXJjZSA9IHNvdXJjZTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZExhbmd1YWdlT3BlbmluZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ0RBVEFTZWN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2M2VlZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogQ0RBVEFTZWN0aW9uSW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ0RBVEFTZWN0aW9uSW1wbCBleHRlbmRzIFRleHRJbXBsIGltcGxlbWVudHMgQ0RBVEFTZWN0aW9uIHsKLQotCS8qKgotCSAqIENEQVRBU2VjdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ0RBVEFTZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDREFUQVNlY3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIENEQVRBU2VjdGlvbkltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ0RBVEFTZWN0aW9uSW1wbChDREFUQVNlY3Rpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDREFUQVNlY3Rpb25JbXBsIGNsb25lZCA9IG5ldyBDREFUQVNlY3Rpb25JbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBpbnN0ZWFkIG9mIHN1cGVyKFRleHRJbXBsKS5nZXREYXRhKCksIGNhbGwgZ2V0Q2hhcmFjdGVyRGF0YSgpCi0JCVN0cmluZyBkYXRhID0gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQlkYXRhID0gZ2V0RGF0YShnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJCWRhdGEgPSBuZXcgU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gY29udGVudFJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb250ZW50UmVnaW9uID09IG51bGwpIHsgLy8gZmlyc3QgY29udGVudAotCQkJCWNvbnRlbnRSZWdpb24gPSByZWdpb247Ci0JCQl9IGVsc2UgeyAvLyBtdWx0aXBsZSBjb250ZW50cwotCQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbikpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCWlmIChjb250ZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dChjb250ZW50UmVnaW9uKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjY2RhdGEtc2VjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDREFUQV9TRUNUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NNTm9kZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ01Ob2RlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTUzM2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ01Ob2RlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDTU5vZGVVdGlsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChBdHRySW1wbCkgYXR0cikuZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChFbGVtZW50SW1wbCkgZWxlbWVudCkuZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJhY3RlckRhdGFJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJhY3RlckRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZjljNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DaGFyYWN0ZXJEYXRhSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQ2hhcmFjdGVyRGF0YUltcGwgY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYXJhY3RlckRhdGFJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBDaGFyYWN0ZXJEYXRhIHsKLQotCXByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyRGF0YUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hhcmFjdGVyRGF0YUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyRGF0YUltcGwoQ2hhcmFjdGVyRGF0YUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRhdGEgPSB0aGF0LmdldERhdGEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGVuZERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSBhcmc7Ci0JCWVsc2UKLQkJCWRhdGEgKz0gYXJnOwotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmIChjb3VudCA8IDAgfHwgb2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChvZmZzZXQgPT0gMCkgewotCQkJaWYgKGNvdW50ID4gbGVuZ3RoKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBuZXcgU3RyaW5nKCk7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGNvdW50KTsKLQkJfSBlbHNlIHsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCWlmIChlbmQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpOwotCQkJZWxzZQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgZGF0YS5zdWJzdHJpbmcoZW5kKTsKLQkJfQotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0Q2hhcmFjdGVyRGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZGF0YS5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGFyZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlkYXRhID0gYXJnOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlkYXRhID0gYXJnICsgZGF0YTsKLQkJfSBlbHNlIHsKLQkJCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKG9mZnNldCA9PSBsZW5ndGgpCi0JCQkJZGF0YSArPSBhcmc7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBhcmcgKyBkYXRhLnN1YnN0cmluZyhvZmZzZXQpOwotCQl9Ci0JCXNldERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BDb250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQQ29udGVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlyZXR1cm4gZWxlbWVudC5pc0pTUENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKGFyZyA9PSBudWxsKSB7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlpbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKGNvdW50ID09IGxlbmd0aCkKLQkJCQlkYXRhID0gYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBhcmcgKyBkYXRhLnN1YnN0cmluZyhjb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCWlmIChlbmQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnICsgZGF0YS5zdWJzdHJpbmcoZW5kKTsKLQkJfQotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQl0aGlzLmRhdGEgPSBnZXREYXRhKCk7Ci0JCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5kYXRhID0gZGF0YTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGVWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0RGF0YShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLmRhdGEgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHN1YnN0cmluZ0RhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHN1YnN0cmluZ0RhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID09IDAgJiYgY291bnQgPT0gbGVuZ3RoKQotCQkJcmV0dXJuIGRhdGE7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJaWYgKGVuZCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGRhdGEuc3Vic3RyaW5nKG9mZnNldCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldE5vZGVOYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RGF0YSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MzQ3NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db21tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBDb21tZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEltcGwgZXh0ZW5kcyBDaGFyYWN0ZXJEYXRhSW1wbCBpbXBsZW1lbnRzIENvbW1lbnQgewotCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQVGFnID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21tZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBDb21tZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21tZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBDb21tZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBDb21tZW50SW1wbChDb21tZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuaXNKU1BUYWcgPSB0aGF0LmlzSlNQVGFnOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDb21tZW50SW1wbCBjbG9uZWQgPSBuZXcgQ29tbWVudEltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBkYXRhID0gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQlkYXRhID0gZ2V0RGF0YShnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJCWRhdGEgPSBuZXcgU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gY29udGVudFJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFIHx8IGlzTmVzdGVkQ29tbWVudE9wZW5DbG9zZShyZWdpb25UeXBlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNvbnRlbnRSZWdpb24gPT0gbnVsbCkgeyAvLyBmaXJzdCBjb250ZW50Ci0JCQkJY29udGVudFJlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0KLQkJCWVsc2UgeyAvLyBtdWx0aXBsZSBjb250ZW50cwotCQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbikpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCWlmIChjb250ZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dChjb250ZW50UmVnaW9uKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjY29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDT01NRU5UX05PREU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UgfHwgaXNOZXN0ZWRDb21tZW50Q2xvc2UocmVnaW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZQotCSAqIEBwYXJhbSByZWdpb25UeXBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudENsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRPcGVuQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JcHVibGljIGJvb2xlYW4gaXNKU1BUYWcoKSB7Ci0JCXJldHVybiB0aGlzLmlzSlNQVGFnOwotCX0KLQotCS8qKgotCSAqIHNldEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKU1BUYWcoYm9vbGVhbiBpc0pTUFRhZykgewotCQlpZiAoaXNKU1BUYWcgPT0gdGhpcy5pc0pTUFRhZykKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGlzSlNQVGFnKSB7Ci0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCAhZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5pc0pTUFRhZyA9IGlzSlNQVGFnOwotCi0JCWlmIChnZXRDb250YWluZXJEb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgaW4gdGhlIHRyZWUsIHVwZGF0ZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JCQlzZXREYXRhKGdldERhdGEoKSk7IC8vIGNhbGxzIG5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01Nb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTQ5YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01Nb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0U3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBYTUxNb2RlbEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERPTU1vZGVsSW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLCBJRE9NTW9kZWwsIERPTUltcGxlbWVudGF0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVFJBQ0VfUEFSU0VSX01BTkFHRU1FTlRfRVhDRVBUSU9OID0gInBhcnNlck1hbmFnZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBPYmplY3QgYWN0aXZlID0gbnVsbDsKLQlwcml2YXRlIERvY3VtZW50SW1wbCBkb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gbnVsbDsKLQlwcml2YXRlIFhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQlwcml2YXRlIFhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFhNTE1vZGVsSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBET01Nb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBpbnRlcm5hbENyZWF0ZURvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGNsaWVudHMgdG8gZGVjbGFyZSB0aGF0IHRoZXkgYXJlIGFib3V0IHRvIG1ha2UgYQotCSAqICJsYXJnZSIgY2hhbmdlIHRvIHRoZSBtb2RlbC4gVGhpcyBjaGFuZ2UgbWlnaHQgYmUgaW4gdGVybXMgb2YgY29udGVudAotCSAqIG9yIGl0IG1pZ2h0IGJlIGluIHRlcm1zIG9mIHRoZSBtb2RlbCBpZCBvciBiYXNlIGxvY2F0aW9uLgotCSAqIAotCSAqIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBlbWJlZGRlZCBjYWxscywgbm90aWZpY2F0aW9uIHRvIGxpc3RuZXJzIGlzCi0JICogc2VudCBvbmx5IG9uY2UuCi0JICogCi0JICogTm90ZSB0aGF0IHRoZSBjbGllbnQgd2hvIGlzIG1ha2luZyB0aGVzZSBjaGFuZ2VzIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkKLQkgKiB0byByZXN0b3JlIHRoZSBtb2RlbHMgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFuZ2VzLiBTZWUKLQkgKiBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuCi0JICogCi0JICogVGhlIG1ldGhvZCBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2hhbmdlTW9kZWwoKSB7Ci0JCXN1cGVyLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkvLyB0ZWNobmljYWxseSwgbm8gbmVlZCB0byBjYWxsIGJlZ2luQ2hhbmdpbmcgc28gb2Z0ZW4sCi0JCS8vIHNpbmNlIGFib3V0VG9DaGFuZ2VNb2RlbCBjYW4gYmUgbmVzdGVkLgotCQkvLyBidXQgd2lsbCBsZWF2ZSBhcyBpcyBmb3IgdGhpcyByZWxlYXNlLgotCQkvLyBzZWUgbW9kZWxDaGFuZ2VkLCBhbmQgYmUgc3VyZSBzdGF5cyBjb29yZGluYXRlZCB0aGVyZS4KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmJlZ2luQ2hhbmdpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhYm91dFRvUmVpbml0aWFsaXplTW9kZWwoKSB7Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCW5vdGlmaWVyLmNhbmNlbFBlbmRpbmcoKTsKLQkJc3VwZXIuYWJvdXRUb1JlaW5pdGlhbGl6ZU1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogYXR0clJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF0dHJSZXBsYWNlZChFbGVtZW50IGVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLnJlcGxhY2VBdHRyKGVsZW1lbnQsIG5ld0F0dHIsIG9sZEF0dHIpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5hdHRyUmVwbGFjZWQoZWxlbWVudCwgbmV3QXR0ciwgb2xkQXR0cik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RuZXJzIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyCi0JICogdG8gYWJvdXRUb0NoYW5nZU1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWJvdXRUb0NoYW5nZU1vZGVsIC4uLgotCSAqIG9yIHNvbWUgbGlzdGVuZXJzIGNvdWxkIGJlIGxlZnQgd2FpdGluZyBpbmRlZmluaXRlbHkgZm9yIHRoZSBjaGFuZ2VkCi0JICogZXZlbnQuIFNvLCBpdHMgc3VnZ2VzdGVkIHRoYXQgY2hhbmdlZE1vZGVsIGFsd2F5cyBiZSBpbiBhIGZpbmFsbHkKLQkgKiBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LgotCSAqIAotCSAqIEluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZWRNb2RlbCgpIHsKLQkJLy8gTk9URTogdGhlIG9yZGVyIG9mICdjaGFuZ2VkTW9kZWwnIGFuZCAnZW5kQ2hhbmdpbmcnIGlzIHNpZ25pZmljYW50LgotCQkvLyBCeSBjYWxsaW5nIGNoYW5nZWRNb2RlbCBmaXJzdCwgdGhpcyBiYXNpY2FsbHkgZGVjcmVtZW50cyB0aGUKLQkJLy8gImlzQ2hhbmdpbmciIGNvdW50ZXIKLQkJLy8gaW4gc3VwZXIgY2xhc3MgYW5kIHdoZW4gemVybyBhbGwgbGlzdGVuZXJzIHRvIG1vZGVsIHN0YXRlIGV2ZW50cwotCQkvLyB3aWxsIGJlIG5vdGlmaWVkCi0JCS8vIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuICdlbmRDaGFuZ2luZycgd2lsbCBub3RpZnkgYWxsCi0JCS8vIGRlZmVycmVkIGFkYXB0ZXJzLgotCQkvLyBTbywgdGhlIHNpZ25pZmljYW5jZSBvZiBvcmRlciBpcyB0aGF0IGFkYXB0ZXJzIChhbmQgbWV0aG9kcyB0aGV5Ci0JCS8vIGNhbGwpCi0JCS8vIGNhbiBjb3VudCBvbiB0aGUgc3RhdGUgb2YgbW9kZWwgImlzQ2hhbmdpbmciIHRvIGJlIGFjY3VyYXRlLgotCQkvLyBCdXQsIHJlbWVtYmVyLCB0aGF0IHRoaXMgbWVhbnMgdGhlICJtb2RlbENoYW5nZWQiIGV2ZW50IGNhbiBiZQotCQkvLyByZWNlaXZlZCBiZWZvcmUgYWxsCi0JCS8vIGFkYXB0ZXJzIGhhdmUgZmluaXNoZWQgdGhlaXIgcHJvY2Vzc2luZy4KLQkJLy8gTk9URSBOT1RFOiBUaGUgYWJvdmUgbm90ZSBpcyBvYnNvbGV0ZSBpbiBmYWN0ICh0aG91Z2ggc3RpbGwgc3RhdGVzCi0JCS8vIGlzc3VlIGNvcnJlY3RseSkuCi0JCS8vIER1ZSB0byBwb3B1bGFyIGRlbWFuZCwgdGhlIG9yZGVyIG9mIHRoZXNlIGNhbGxzIHdlcmUgcmV2ZXJzZWQgYW5kCi0JCS8vIGJlaGF2aW9yCi0JCS8vIGNoYW5nZWQgb24gMDcvMjIvMjAwNC4KLQkJLy8gCi0JCS8vIHNlZSBhbHNvCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MzAyCi0JCS8vIGZvciBtb3RpdmF0aW9uIGZvciB0aGlzICdvbiB2ZXJnZSBvZicgY2FsbC4KLQkJLy8gdGhpcyBjb3VsZCBiZSBpbXByb3ZlZCBpbiBmdXR1cmUgaWYgbm90aWZpZXIgYWxzbyB1c2VkIGNvdW50aW5nCi0JCS8vIGZsYWcgdG8gYXZvaWQgbmVzdGVkIGNhbGxzLiBJZi93aGVuIGNoYW5nZWQgYmUgc3VyZSB0byBjaGVjayBpZgotCQkvLyBhYm91dFRvQ2hhbmdlTW9kZWwgbmVlZHMgYW55IGNoYW5nZXMgdG9vLgotCQlpZiAoaXNNb2RlbENoYW5nZVN0YXRlT25WZXJnZU9mRW5kaW5nKCkpIHsKLQkJCS8vIGVuZCBsb2NrIGJlZm9yZSBub3RpY2lhdGlvbiBsb29wLCBzaW5jZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5Ci0JCQkvLyB3ZSBtYXkgYmUgImNhbGxlZCBmcm9tIGZvcmllZ24gY29kZSIgZHVyaW5nIG5vdGlmaWNhdGlvbi4KLQkJCWVuZExvY2soKTsKLQkJCS8vIHdlIG51bGwgb3V0IGhlcmUgdG8gYXZvaWQgc3B1cmlvdXMid2FybmluZyIgbWVzc2FnZSB3aGlsZSBkZWJ1ZwotCQkJLy8gdHJhY2luZyBpcyBlbmFibGVkCi0JCQlmTG9ja09iamVjdCA9IG51bGw7Ci0JCQkvLyB0aGUgbm90aWZpZXIgaXMgd2hhdCBjb250cm9scyBhZGFwZXIgbm90aWZpY2F0aW9uLCB3aGljaAotCQkJLy8gc2hvdWxkIGJlIHNlbnQgb3V0IGJlZm9yZSB0aGUgJ21vZGVsQ2hhbmdlZCcgZXZlbnQuCi0JCQlnZXRNb2RlbE5vdGlmaWVyKCkuZW5kQ2hhbmdpbmcoKTsKLQkJfQotCQkvLyBjaGFuZ2VkTW9kZWwgaGFuZGxlcyAnbmVzdGluZycsIHNvIG9ubHkgb25lIGV2ZW50IHNlbnQgb3V0Ci0JCS8vIHdoZW4gbXVsaXRwbGUgY2FsbHMgdG8gJ2Fib3V0VG9DaGFuZ2UvQ2hhbmdlZCcuCi0JCXN1cGVyLmNoYW5nZWRNb2RlbCgpOwotCQloYW5kbGVSZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogY2hpbGRSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkUmVwbGFjZWQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLnJlcGxhY2VDaGlsZChwYXJlbnROb2RlLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5jaGlsZFJlcGxhY2VkKHBhcmVudE5vZGUsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBYTUwgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKLQkgKiB3aXRoIGl0cyBkb2N1bWVudCBlbGVtZW50LiBIVE1MLW9ubHkgRE9NIGltcGxlbWVudGF0aW9ucyBkbyBub3QgbmVlZCB0bwotCSAqIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJVGhlCi0JICogICAgICAgICAgICBuYW1lc3BhY2UgVVJJIG9mIHRoZSBkb2N1bWVudCBlbGVtZW50IHRvIGNyZWF0ZS4KLQkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZVRoZQotCSAqICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRvY3VtZW50IGVsZW1lbnQgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gZG9jdHlwZVRoZQotCSAqICAgICAgICAgICAgdHlwZSBvZiBkb2N1bWVudCB0byBiZSBjcmVhdGVkIG9yIDxjb2RlPm51bGw8L2NvZGU+LiBXaGVuCi0JICogICAgICAgICAgICA8Y29kZT5kb2N0eXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIGl0cwotCSAqICAgICAgICAgICAgPGNvZGU+Tm9kZS5vd25lckRvY3VtZW50PC9jb2RlPiBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRoZQotCSAqICAgICAgICAgICAgZG9jdW1lbnQgYmVpbmcgY3JlYXRlZC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkRvY3VtZW50PC9jb2RlPiBvYmplY3QuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZAotCSAqICAgICAgICAgICAgICAgIG5hbWUgY29udGFpbnMgYW4gaWxsZWdhbCBjaGFyYWN0ZXIuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOQU1FU1BBQ0VfRVJSOiBSYWlzZWQgaWYgdGhlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgaXMgbWFsZm9ybWVkLCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaGFzIGEKLQkgKiAgICAgICAgICAgICAgICBwcmVmaXggYW5kIHRoZSA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IGlzCi0JICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIG9yIGlmIHRoZQotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGhhcyBhIHByZWZpeCB0aGF0IGlzICJ4bWwiCi0JICogICAgICAgICAgICAgICAgYW5kIHRoZSA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tICIKLQkgKiAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIC48YnI+Ci0JICogICAgICAgICAgICAgICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZG9jdHlwZTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIHVzZWQgd2l0aCBhIGRpZmZlcmVudCBkb2N1bWVudCBvciB3YXMKLQkgKiAgICAgICAgICAgICAgICBjcmVhdGVkIGZyb20gYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCi0JICogQHNlZSBET00gTGV2ZWwgMgotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4gbm9kZS4gRW50aXR5IGRlY2xhcmF0aW9ucwotCSAqIGFuZCBub3RhdGlvbnMgYXJlIG5vdCBtYWRlIGF2YWlsYWJsZS4gRW50aXR5IHJlZmVyZW5jZSBleHBhbnNpb25zIGFuZAotCSAqIGRlZmF1bHQgYXR0cmlidXRlIGFkZGl0aW9ucyBkbyBub3Qgb2NjdXIuIEl0IGlzIGV4cGVjdGVkIHRoYXQgYSBmdXR1cmUKLQkgKiB2ZXJzaW9uIG9mIHRoZSBET00gd2lsbCBwcm92aWRlIGEgd2F5IGZvciBwb3B1bGF0aW5nIGEKLQkgKiA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+Ljxicj4KLQkgKiBIVE1MLW9ubHkgRE9NIGltcGxlbWVudGF0aW9ucyBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHF1YWxpZmllZE5hbWVUaGUKLQkgKiAgICAgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBkb2N1bWVudCB0eXBlIHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIHB1YmxpY0lkVGhlCi0JICogICAgICAgICAgICBleHRlcm5hbCBzdWJzZXQgcHVibGljIGlkZW50aWZpZXIuCi0JICogQHBhcmFtIHN5c3RlbUlkVGhlCi0JICogICAgICAgICAgICBleHRlcm5hbCBzdWJzZXQgc3lzdGVtIGlkZW50aWZpZXIuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IG5vZGUgd2l0aAotCSAqICAgICAgICAgPGNvZGU+Tm9kZS5vd25lckRvY3VtZW50PC9jb2RlPiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZAotCSAqICAgICAgICAgICAgICAgIG5hbWUgY29udGFpbnMgYW4gaWxsZWdhbCBjaGFyYWN0ZXIuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOQU1FU1BBQ0VfRVJSOiBSYWlzZWQgaWYgdGhlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgaXMgbWFsZm9ybWVkLgotCSAqIEBzZWUgRE9NIExldmVsIDIKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3VtZW50VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlEb2N1bWVudFR5cGVJbXBsIGRvY3VtZW50VHlwZSA9IG5ldyBEb2N1bWVudFR5cGVJbXBsKCk7Ci0JCWRvY3VtZW50VHlwZS5zZXROYW1lKHF1YWxpZmllZE5hbWUpOwotCQlkb2N1bWVudFR5cGUuc2V0UHVibGljSWQocHVibGljSWQpOwotCQlkb2N1bWVudFR5cGUuc2V0U3lzdGVtSWQoc3lzdGVtSWQpOwotCQlyZXR1cm4gZG9jdW1lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvY3VtZW50VHlwZUNoYW5nZWQoKSB7Ci0JCWlmICh0aGlzLnJlZnJlc2gpCi0JCQlyZXR1cm47Ci0JCS8vIHVubGlrZSAncmVzZnJlc2gnLCAncmVpbml0aWFsaXplJyBmaW5pc2hlcyBsb29wCi0JCS8vIGFuZCBmbHVzaGVzIHJlbWFpbmluZyBub3RpZmljYXRpb24gcXVlIGJlZm9yZQotCQkvLyBhY3R1YWxseSByZWluaXRpYWxpemluZy4KLQkJLy8gSVNTVUU6IHNob3VsZCByZWluaXQgYmUgdXNlZCBpbnN0ZWFkIG9mIGhhbmRsZXJlZnJlc2g/Ci0JCS8vIHRoaXMuc2V0UmVpbml0aWFsaXplTmVlZGVkKHRydWUpOwotCQlpZiAodGhpcy5hY3RpdmUgIT0gbnVsbCB8fCBnZXRNb2RlbE5vdGlmaWVyKCkuaXNDaGFuZ2luZygpKQotCQkJcmV0dXJuOyAvLyBkZWZlcgotCQloYW5kbGVSZWZyZXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdGFibGVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlnZXRNb2RlbE5vdGlmaWVyKCkuZWRpdGFibGVDaGFuZ2VkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5kVGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIuY2hhbmdlRW5kVGFnKGVsZW1lbnQpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5lbmRUYWdDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxQYXJzZXIgZ2V0QWN0aXZlUGFyc2VyKCkgewotCQlpZiAodGhpcy5wYXJzZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5wYXJzZXIgIT0gdGhpcy5hY3RpdmUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMucGFyc2VyOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxVcGRhdGVyIGdldEFjdGl2ZVVwZGF0ZXIoKSB7Ci0JCWlmICh0aGlzLnVwZGF0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy51cGRhdGVyICE9IHRoaXMuYWN0aXZlKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aGlzLnVwZGF0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoRG9jdW1lbnQuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJcmV0dXJuIGdldERvY3VtZW50KCk7Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIGdldERvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gWE1MRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSURPTURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVNvdXJjZUdlbmVyYXRvciBnZXRHZW5lcmF0b3IoKSB7Ci0JCWlmICh0aGlzLmdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRvciA9IFhNTEdlbmVyYXRvckltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBzZWFyY2ggaW4gZG9jdW1lbnQgY2hpbGRyZW4KLQkJSURPTU5vZGUgcGFyZW50ID0gbnVsbDsKLQkJaW50IGxlbmd0aCA9IHRoaXMuZG9jdW1lbnQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChvZmZzZXQgKiAyIDwgbGVuZ3RoKSB7Ci0JCQkvLyBzZWFyY2ggZnJvbSB0aGUgZmlyc3QKLQkJCUlET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSB0aGlzLmRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkLmdldEVuZE9mZnNldCgpIDw9IG9mZnNldCkgewotCQkJCQljaGlsZCA9IChJRE9NTm9kZSkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpID4gb2Zmc2V0KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCkgPiBvZmZzZXQpCi0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJfQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSA8PSBvZmZzZXQpCi0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJfQotCQkJCS8vIGRpZyBtb3JlCi0JCQkJcGFyZW50ID0gY2hpbGQ7Ci0JCQkJY2hpbGQgPSAoSURPTU5vZGUpIHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWFyY2ggZnJvbSB0aGUgbGFzdAotCQkJSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIHRoaXMuZG9jdW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpID4gb2Zmc2V0KSB7Ci0JCQkJCWNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChjaGlsZC5nZXRFbmRPZmZzZXQoKSA8PSBvZmZzZXQpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSA+IG9mZnNldCkKLQkJCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpIDw9IG9mZnNldCkKLQkJCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQkJLy8gZGlnIG1vcmUKLQkJCQlwYXJlbnQgPSBjaGlsZDsKLQkJCQljaGlsZCA9IChJRE9NTm9kZSkgcGFyZW50LmdldExhc3RDaGlsZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFhNTE1vZGVsTm90aWZpZXIgZ2V0TW9kZWxOb3RpZmllcigpIHsKLQkJaWYgKHRoaXMubm90aWZpZXIgPT0gbnVsbCkgewotCQkJdGhpcy5ub3RpZmllciA9IG5ldyBYTUxNb2RlbE5vdGlmaWVySW1wbCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLm5vdGlmaWVyOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxQYXJzZXIgZ2V0TW9kZWxQYXJzZXIoKSB7Ci0JCWlmICh0aGlzLnBhcnNlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnBhcnNlciA9IGNyZWF0ZU1vZGVsUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucGFyc2VyOwotCX0KLQotCXByb3RlY3RlZCBYTUxNb2RlbFBhcnNlciBjcmVhdGVNb2RlbFBhcnNlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxNb2RlbFBhcnNlcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFhNTE1vZGVsVXBkYXRlciBnZXRNb2RlbFVwZGF0ZXIoKSB7Ci0JCWlmICh0aGlzLnVwZGF0ZXIgPT0gbnVsbCkgewotCQkJdGhpcy51cGRhdGVyID0gY3JlYXRlTW9kZWxVcGRhdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudXBkYXRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxVcGRhdGVyIGNyZWF0ZU1vZGVsVXBkYXRlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxNb2RlbFVwZGF0ZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlZnJlc2goKSB7Ci0JCWlmICghdGhpcy5yZWZyZXNoKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCWlmICghaXNDaGFuZ2luZykKLQkJCW5vdGlmaWVyLmJlZ2luQ2hhbmdpbmcodHJ1ZSk7Ci0JCVhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IGdldE1vZGVsUGFyc2VyKCk7Ci0JCXNldEFjdGl2ZShwYXJzZXIpOwotCQl0aGlzLmRvY3VtZW50LnJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25MaXN0KCksIG51bGwpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKQotCQkJCW5vdGlmaWVyLmVuZENoYW5naW5nKCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIERPTSBpbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZVRoZQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0IChjYXNlLWluc2Vuc2l0aXZlKS4gVGhlIHZhbHVlcwotCSAqICAgICAgICAgICAgdXNlZCBieSBET00gZmVhdHVyZXMgYXJlIGRlZmluZWQgdGhyb3VnaG91dCB0aGUgRE9NIExldmVsIDIKLQkgKiAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIGFuZCBsaXN0ZWQgaW4gdGhlIHNlY3Rpb24uIFRoZSBuYW1lIG11c3QgYmUKLQkgKiAgICAgICAgICAgIGFuIFhNTCBuYW1lLiBUbyBhdm9pZCBwb3NzaWJsZSBjb25mbGljdHMsIGFzIGEgY29udmVudGlvbiwKLQkgKiAgICAgICAgICAgIG5hbWVzIHJlZmVycmluZyB0byBmZWF0dXJlcyBkZWZpbmVkIG91dHNpZGUgdGhlIERPTQotCSAqICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBzaG91bGQgYmUgbWFkZSB1bmlxdWUgYnkgcmV2ZXJzaW5nIHRoZSBuYW1lIG9mCi0JICogICAgICAgICAgICB0aGUgSW50ZXJuZXQgZG9tYWluIG5hbWUgb2YgdGhlIHBlcnNvbiAob3IgdGhlIG9yZ2FuaXphdGlvbgotCSAqICAgICAgICAgICAgdGhhdCB0aGUgcGVyc29uIGJlbG9uZ3MgdG8pIHdobyBkZWZpbmVzIHRoZSBmZWF0dXJlLAotCSAqICAgICAgICAgICAgY29tcG9uZW50IGJ5IGNvbXBvbmVudCwgYW5kIHVzaW5nIHRoaXMgYXMgYSBwcmVmaXguIEZvcgotCSAqICAgICAgICAgICAgaW5zdGFuY2UsIHRoZSBXM0MgU1ZHIFdvcmtpbmcgR3JvdXAgZGVmaW5lcyB0aGUgZmVhdHVyZQotCSAqICAgICAgICAgICAgIm9yZy53M2MuZG9tLnN2ZyIuCi0JICogQHBhcmFtIHZlcnNpb25UaGlzCi0JICogICAgICAgICAgICBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4gSW4gTGV2ZWwgMiwKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgY2FuIGJlIGVpdGhlciAiMi4wIiBvciAiMS4wIi4gSWYgdGhlIHZlcnNpb24gaXMKLQkgKiAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQsIHN1cHBvcnRpbmcgYW55IHZlcnNpb24gb2YgdGhlIGZlYXR1cmUgY2F1c2VzCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIHRvIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIGltcGxlbWVudGVkIGluIHRoZQotCSAqICAgICAgICAgc3BlY2lmaWVkIHZlcnNpb24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkgewotCQkJaWYgKCF2ZXJzaW9uLmVxdWFscygiMS4wIikgJiYgIXZlcnNpb24uZXF1YWxzKCIyLjAiKSkgeyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAoZmVhdHVyZS5lcXVhbHNJZ25vcmVDYXNlKCJDb3JlIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCWlmIChmZWF0dXJlLmVxdWFsc0lnbm9yZUNhc2UoIlhNTCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudCBpbnRlcm5hbENyZWF0ZURvY3VtZW50KCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnRJbXBsKCk7Ci0JCWRvY3VtZW50LnNldE1vZGVsKHRoaXMpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JYm9vbGVhbiBpc1JlcGFyc2luZygpIHsKLQkJcmV0dXJuIChhY3RpdmUgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogbmFtZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBuYW1lQ2hhbmdlZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIuY2hhbmdlTmFtZShub2RlKTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQkvLyBub3RpZmljYXRpb24gaXMgYWxyZWFkeSBzZW50Ci0JfQotCi0JLyoqCi0JICogbmV3TW9kZWwgbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgZm9yIHRoZSBjYXNlCi0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwgJiYgZlN0cnVjdHVyZWREb2N1bWVudCAhPSBzdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQlpbnRlcm5hbFNldE5ld0RvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsU2V0TmV3RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAoKGZsYXROb2RlcyA9PSBudWxsKSB8fCAoZmxhdE5vZGVzLmdldExlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYmVpbmcgY29uc3RydWN0ZWQKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyAvLyBmb3IgbmV3IG1vZGVsLCB3ZSBtaWdodCBuZWVkIHRvCi0JCQkvLyAvLyByZS1pbml0LCBlLmcuIGlmIHNvbWVvbmUgY2FsbHMgc2V0VGV4dAotCQkJLy8gLy8gb24gYW4gZXhpc3RpbmcgbW9kZWwKLQkJCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJYm9vbGVhbiBpc0NoYW5naW5nID0gbm90aWZpZXIuaXNDaGFuZ2luZygpOwotCQkvLyBjYWxsIGV2ZW4gaWYgY2hhbmdpbmcgdG8gbm90aWZ5IGRvaW5nIG5ldyBtb2RlbAotCQlnZXRNb2RlbE5vdGlmaWVyKCkuYmVnaW5DaGFuZ2luZyh0cnVlKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRoaXMuZG9jdW1lbnQucmVtb3ZlQ2hpbGROb2RlcygpOwotCQl0cnkgewotCQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkvLyBtZWFuaW5nbGVzcyB0byByZWZyZXNoLCBiZWNhdXNlIHRoZSByZXN1bHQgbWlnaHQgYmUgdGhlIHNhbWUKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCWlmICghaXNDaGFuZ2luZykgewotCQkJCWdldE1vZGVsTm90aWZpZXIoKS5lbmRDaGFuZ2luZygpOwotCQkJfQotCQkJLy8gaWdub3JlIHJlZnJlc2gKLQkJCXRoaXMucmVmcmVzaCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBldmVudCkgewotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQkvLyBjbGVhbnVwIHVwZGF0ZXIgc3RhZmZzCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyBJIGd1ZXNzIG5vIGNoYW5hZ2UgbWVhbnMgdGhlIG1vZGVsIGNvdWxkIG5vdCBuZWVkIHJlLWluaXQKLQkJCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBub2Rlc1JlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBldmVudC5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBldmVudC5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlpZiAoZXguZ2V0Q2xhc3MoKS5lcXVhbHMoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbi5jbGFzcykpIHsKLQkJCQkJTG9nZ2VyLnRyYWNlRXhjZXB0aW9uKFRSQUNFX1BBUlNFUl9NQU5BR0VNRU5UX0VYQ0VQVElPTiwgZXgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJfQotCQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJfQotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCWlmICghaXNDaGFuZ2luZykKLQkJCW5vdGlmaWVyLmJlZ2luQ2hhbmdpbmcoKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJaGFuZGxlUmVmcmVzaCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlZ2lvbkNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGV2ZW50LmdldFJlZ2lvbigpOwotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5jaGFuZ2VSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZygpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5jaGFuZ2VSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJaGFuZGxlUmVmcmVzaCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiByZWdpb25zUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucyA9IGV2ZW50LmdldE9sZFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBldmVudC5nZXROZXdSZWdpb25zKCk7Ci0JCWlmIChvbGRSZWdpb25zID09IG51bGwgJiYgbmV3UmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVJlZ2lvbnMoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJfQotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCWlmICghaXNDaGFuZ2luZykKLQkJCW5vdGlmaWVyLmJlZ2luQ2hhbmdpbmcoKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVJlZ2lvbnMoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCWlmICghaXNDaGFuZ2luZykgewotCQkJCW5vdGlmaWVyLmVuZENoYW5naW5nKCk7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21FZGl0KCkgewotCQlpZiAoIWlzU2hhcmVkKCkpIHsKLQkJCS8vIHRoaXMuZG9jdW1lbnQucmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCQkvLyB0aGlzLmRvY3VtZW50LnJlbGVhc2VEb2N1bWVudFR5cGUoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlRnJvbUVkaXQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCWlmICghaXNTaGFyZWQoKSkgewotCQkJLy8gdGhpcy5kb2N1bWVudC5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJCS8vIHRoaXMuZG9jdW1lbnQucmVsZWFzZURvY3VtZW50VHlwZSgpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmUoT2JqZWN0IGFjdGl2ZSkgewotCQl0aGlzLmFjdGl2ZSA9IGFjdGl2ZTsKLQkJLy8gc2lkZSBlZmZlY3QKLQkJLy8gd2hlbiBldmVyIGJlY29tZXMgYWN0aXZlLCBiZXN1cmUgdGFnTmFtZUNhY2hlIGlzIGNsZWFyZWQKLQkJLy8gKGFuZCBub3QgdXNlZCkKLQkJaWYgKGFjdGl2ZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudC5hY3RpdmF0ZVRhZ05hbWVDYWNoZSh0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWRvY3VtZW50LmFjdGl2YXRlVGFnTmFtZUNhY2hlKGZhbHNlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yKElTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsTm90aWZpZXIoWE1MTW9kZWxOb3RpZmllciBub3RpZmllcikgewotCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxQYXJzZXIoWE1MTW9kZWxQYXJzZXIgcGFyc2VyKSB7Ci0JCXRoaXMucGFyc2VyID0gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsVXBkYXRlcihYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlcikgewotCQl0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyOwotCX0KLQotCS8qKgotCSAqIHNldFN0cnVjdHVyZWREb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50KQotCQkJcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWludGVybmFsU2V0TmV3RG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFRhZ0NoYW5nZWQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLmNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5zdGFydFRhZ0NoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogdmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VWYWx1ZShub2RlKTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQlnZXRNb2RlbE5vdGlmaWVyKCkudmFsdWVDaGFuZ2VkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZyYWdtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZyYWdtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU4ODJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGcmFnbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRGcmFnbWVudEltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIGltcGxlbWVudHMgRG9jdW1lbnRGcmFnbWVudCB7Ci0KLQkvKioKLQkgKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEZyYWdtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEZyYWdtZW50SW1wbChEb2N1bWVudEZyYWdtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRG9jdW1lbnRGcmFnbWVudEltcGwgY2xvbmVkID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQkKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjZG9jdW1lbnQtZnJhZ21lbnQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfRlJBR01FTlRfTk9ERTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M4NjJkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8vIGZvciBvcmcuYXBhY2hlLnhlcmNlcyAzLjIuMQotLy8gaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWxzLlhNTENoYXJhY3RlclByb3BlcnRpZXM7Ci0vLyBETVcgbW9kaWZpZWQgZm9yIFhNTDRKIDQuMC4xCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5UcmVlV2Fsa2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsLkNvbW1lbnRFbGVtZW50UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbnRpdHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5Eb2N1bWVudFJhbmdlOwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5SYW5nZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuRG9jdW1lbnRUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuVHJlZVdhbGtlcjsKLQotCi0vKioKLSAqIERvY3VtZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRJbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lciBpbXBsZW1lbnRzIElET01Eb2N1bWVudCwgRG9jdW1lbnRSYW5nZSwgRG9jdW1lbnRUcmF2ZXJzYWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heERvY1R5cGVTZWFyY2ggPSA1MDA7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IG5vTWF4U2VhcmNoID0gLTE7Ci0JLyoqCi0JICogSW50ZXJuYWwtdXNlIG9ubHkgY2xhc3MuIFRoaXMgY2xhc3Mgd2FzIGFkZGVkIHRvIGJldHRlciBhYmxlIHRvIGhhbmRsZQotCSAqIHJlcGV0ZXRpdmUgcmVxdWVzdCBmb3IgZ2V0RWxlbWVudHNCeVRhZ05hbWUuIFRoZSBjYWNoZSBpcyBjbGVhcmVkIHdoZW4KLQkgKiBldmVyIHRoZSBkb2N1bWVudCBjaGFuZ2VzIGF0IGFsbCwgc28gc3RpbGwgbm90IHJlYWwgZWZmaWNpZW50LAotCSAqLwotCWNsYXNzIFRhZ05hbWVDYWNoZSB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGFjdGl2ZSA9IHRydWU7Ci0KLQkJcHJpdmF0ZSBNYXAgY2FjaGU7Ci0KLQkJcHVibGljIFRhZ05hbWVDYWNoZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCQljYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGIKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjdGl2YXRlKGJvb2xlYW4gYikgewotCQkJYWN0aXZlID0gYjsKLQkJCWlmICghYikKLQkJCQljbGVhcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkSXRlbShTdHJpbmcgdGFnbmFtZSwgTm9kZUxpc3RJbXBsIG5vZGVsaXN0KSB7Ci0JCQlpZiAodGFnbmFtZSA9PSBudWxsIHx8IG5vZGVsaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJY2FjaGUucHV0KHRhZ25hbWUsIG5vZGVsaXN0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJY2FjaGUuY2xlYXIoKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlTGlzdEltcGwgZ2V0SXRlbShTdHJpbmcgdGFnTmFtZSkgewotCQkJTm9kZUxpc3RJbXBsIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoYWN0aXZlKSB7Ci0JCQkJcmVzdWx0ID0gKE5vZGVMaXN0SW1wbCkgY2FjaGUuZ2V0KHRhZ05hbWUpOwotCQkJCS8vIGlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudHNCeVRhZ25hbWUgZnJvbSBjYWNoZTogIiArCi0JCQkJLy8gdGFnTmFtZSk7Ci0JCQkJLy8gfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JfQotCi0JLy8gdGhpcyBpcyBhIGNvbnN0YW50IGp1c3QgdG8gZ2l2ZSBjb21waWxlLXRpbWUgY29udHJvbCBvdmVyCi0JLy8gd2hldGhlciBvciBub3QgdG8gdXNlIHRoZSBjYWNoZS4gSWYsIGluIGZ1dHVyZSwgaXRzIGZvdW5kIHRoYXQKLQkvLyB0aGVyZSBhcmUgbm8gKG9yIGZldykgImR1cGxpY2F0ZSByZXF1ZXN0cyIgLi4uIHRoZW4gdGhpcyBjYWNoZQotCS8vIGlzIG5vdCBuZWVkZWQuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2V0YWduYW1lY2FjaGUgPSB0cnVlOwotCi0JLy8gcHJpdmF0ZSBEb2N1bWVudFR5cGVBZGFwdGVyIGRvY3VtZW50VHlwZUFkYXB0ZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBET01Nb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgVGFnTmFtZUNhY2hlIHRhZ05hbWVDYWNoZTsKLQotCS8qKgotCSAqIERvY3VtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh1c2V0YWduYW1lY2FjaGUpIHsKLQkJCXRhZ05hbWVDYWNoZSA9IG5ldyBUYWdOYW1lQ2FjaGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERvY3VtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBEb2N1bWVudEltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRJbXBsKERvY3VtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQlpZiAodXNldGFnbmFtZWNhY2hlKSB7Ci0JCQl0YWdOYW1lQ2FjaGUgPSBuZXcgVGFnTmFtZUNhY2hlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXZvaWQgYWN0aXZhdGVUYWdOYW1lQ2FjaGUoYm9vbGVhbiBiKSB7Ci0JCXRhZ05hbWVDYWNoZS5hY3RpdmF0ZShiKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQ2hhbmdlcyB0aGUgPGNvZGU+b3duZXJEb2N1bWVudDwvY29kZT4gb2YgYSBub2RlLCBpdHMgY2hpbGRyZW4sIGFzCi0JICogd2VsbCBhcyB0aGUgYXR0YWNoZWQgYXR0cmlidXRlIG5vZGVzIGlmIHRoZXJlIGFyZSBhbnkuIElmIHRoZSBub2RlIGhhcwotCSAqIGEgcGFyZW50IGl0IGlzIGZpcnN0IHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50IGNoaWxkIGxpc3QuIFRoaXMKLQkgKiBlZmZlY3RpdmVseSBhbGxvd3MgbW92aW5nIGEgc3VidHJlZSBmcm9tIG9uZSBkb2N1bWVudCB0byBhbm90aGVyLiBUaGUKLQkgKiBmb2xsb3dpbmcgbGlzdCBkZXNjcmliZXMgdGhlIHNwZWNpZmljcyBmb3IgZWFjaCB0eXBlIG9mIG5vZGUuCi0JICogPGRsPgotCSAqIDxkdD5BVFRSSUJVVEVfTk9ERTwvZHQ+Ci0JICogPGRkPlRoZSA8Y29kZT5vd25lckVsZW1lbnQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzZXQgdG8KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBhbmQgdGhlIDxjb2RlPnNwZWNpZmllZDwvY29kZT4gZmxhZyBpcyBzZXQgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBvbiB0aGUgYWRvcHRlZCA8Y29kZT5BdHRyPC9jb2RlPi4gVGhlCi0JICogZGVzY2VuZGFudHMgb2YgdGhlIHNvdXJjZSA8Y29kZT5BdHRyPC9jb2RlPiBhcmUgcmVjdXJzaXZlbHkgYWRvcHRlZC4KLQkgKiA8L2RkPgotCSAqIDxkdD5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFPC9kdD4KLQkgKiA8ZGQ+VGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBzb3VyY2Ugbm9kZSBhcmUgcmVjdXJzaXZlbHkgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5ET0NVTUVOVF9OT0RFPC9kdD4KLQkgKiA8ZGQ+PGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG5vZGVzIGNhbm5vdCBiZSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PkRPQ1VNRU5UX1RZUEVfTk9ERTwvZHQ+Ci0JICogPGRkPjxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4gbm9kZXMgY2Fubm90IGJlIGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+RUxFTUVOVF9OT0RFPC9kdD4KLQkgKiA8ZGQ+U3BlY2lmaWVkIGF0dHJpYnV0ZSBub2RlcyBvZiB0aGUgc291cmNlIGVsZW1lbnQgYXJlIGFkb3B0ZWQsIGFuZAotCSAqIHRoZSBnZW5lcmF0ZWQgPGNvZGU+QXR0cjwvY29kZT4gbm9kZXMuIERlZmF1bHQgYXR0cmlidXRlcyBhcmUKLQkgKiBkaXNjYXJkZWQsIHRob3VnaCBpZiB0aGUgZG9jdW1lbnQgYmVpbmcgYWRvcHRlZCBpbnRvIGRlZmluZXMgZGVmYXVsdAotCSAqIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZWxlbWVudCBuYW1lLCB0aG9zZSBhcmUgYXNzaWduZWQuIFRoZSBkZXNjZW5kYW50cwotCSAqIG9mIHRoZSBzb3VyY2UgZWxlbWVudCBhcmUgcmVjdXJzaXZlbHkgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5FTlRJVFlfTk9ERTwvZHQ+Ci0JICogPGRkPjxjb2RlPkVudGl0eTwvY29kZT4gbm9kZXMgY2Fubm90IGJlIGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+RU5USVRZX1JFRkVSRU5DRV9OT0RFPC9kdD4KLQkgKiA8ZGQ+T25seSB0aGUgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiBub2RlIGl0c2VsZiBpcyBhZG9wdGVkLAotCSAqIHRoZSBkZXNjZW5kYW50cyBhcmUgZGlzY2FyZGVkLCBzaW5jZSB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbgotCSAqIGRvY3VtZW50cyBtaWdodCBoYXZlIGRlZmluZWQgdGhlIGVudGl0eSBkaWZmZXJlbnRseS4gSWYgdGhlIGRvY3VtZW50Ci0JICogYmVpbmcgaW1wb3J0ZWQgaW50byBwcm92aWRlcyBhIGRlZmluaXRpb24gZm9yIHRoaXMgZW50aXR5IG5hbWUsIGl0cwotCSAqIHZhbHVlIGlzIGFzc2lnbmVkLjwvZGQ+Ci0JICogPGR0Pk5PVEFUSU9OX05PREU8L2R0PgotCSAqIDxkZD48Y29kZT5Ob3RhdGlvbjwvY29kZT4gbm9kZXMgY2Fubm90IGJlIGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFLCBURVhUX05PREUsIENEQVRBX1NFQ1RJT05fTk9ERSwKLQkgKiBDT01NRU5UX05PREU8L2R0PgotCSAqIDxkZD5UaGVzZSBub2RlcyBjYW4gYWxsIGJlIGFkb3B0ZWQuIE5vIHNwZWNpZmljcy48L2RkPgotCSAqIFNob3VsZCB0aGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJuIG51bGwgd2hlbiBpdCBmYWlscz8gSG93ICJleGNlcHRpb25hbCIKLQkgKiBpcyBmYWlsdXJlIGZvciB0aGlzIG1ldGhvZD9TdGljayB3aXRoIHJhaXNpbmcgZXhjZXB0aW9ucyBvbmx5IGluCi0JICogZXhjZXB0aW9uYWwgY2lyY3Vtc3RhbmNlcywgcmV0dXJuIG51bGwgb24gZmFpbHVyZSAoRjJGIDE5IEp1biAyMDAwKS5DYW4KLQkgKiBhbiBlbnRpdHkgbm9kZSByZWFsbHkgYmUgYWRvcHRlZD9ObywgbmVpdGhlciBjYW4gTm90YXRpb24gbm9kZXMgKFRlbGNvbgotCSAqIDEzIERlYyAyMDAwKS5Eb2VzIHRoaXMgYWZmZWN0IGtleXMgYW5kIGhhc2hDb2RlJ3Mgb2YgdGhlIGFkb3B0ZWQKLQkgKiBzdWJ0cmVlIG5vZGVzP0lmIHNvLCB3aGF0IGFib3V0IHJlYWRvbmx5LW5lc3Mgb2Yga2V5IGFuZCBoYXNoQ29kZT9pZgotCSAqIG5vdCwgd291bGQgYXBwZW5kQ2hpbGQgYWZmZWN0IGtleXMvaGFzaENvZGVzIG9yIHdvdWxkIGl0IGdlbmVyYXRlCi0JICogZXhjZXB0aW9ucyBpZiBrZXkncyBhcmUgZHVwbGljYXRlPyBVcGRhdGU6IEhhc2hjb2RlcyBoYXZlIGJlZW4gZHJvcHBlZC4KLQkgKiBHaXZlbiB0aGF0IHRoZSBrZXkgaXMgb25seSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQgYW4gYWRvcHRlZCBub2RlCi0JICogbmVlZHMgdG8gYmUgZ2l2ZW4gYSBuZXcga2V5LCBidXQgd2hhdCBkb2VzIGl0IG1lYW4gZm9yIHRoZSBhcHBsaWNhdGlvbj8KLQkgKiAKLQkgKiBUT0RPOiBOZWVkcyB0byBub3RpZnkgVXNlckRhdGFIYW5kbGVycyBmb3IgdGhlIG5vZGUgaWYgYW55Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIG5vZGUgdG8gbW92ZSBpbnRvIHRoaXMgZG9jdW1lbnQuCi0JICogQHJldHVybiBUaGUgYWRvcHRlZCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9wZXJhdGlvbgotCSAqICAgICAgICAgZmFpbHMsIHN1Y2ggYXMgd2hlbiB0aGUgc291cmNlIG5vZGUgY29tZXMgZnJvbSBhIGRpZmZlcmVudAotCSAqICAgICAgICAgaW1wbGVtZW50YXRpb24uCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT1RfU1VQUE9SVEVEX0VSUjogUmFpc2VkIGlmIHRoZSBzb3VyY2Ugbm9kZSBpcyBvZiB0eXBlCi0JICogICAgICAgICAgICAgICAgPGNvZGU+RE9DVU1FTlQ8L2NvZGU+LDxjb2RlPkRPQ1VNRU5UX1RZUEU8L2NvZGU+LgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBzb3VyY2Ugbm9kZQotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBhZG9wdE5vZGUob3JnLnczYy5kb20uTm9kZSBzb3VyY2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrVGFnTmFtZVZhbGlkaXR5KFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICghaXNWYWxpZE5hbWUodGFnTmFtZSkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgY3JlYXRlRE9NRXhjZXB0aW9uTWVzc2FnZShET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSLCB0YWdOYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURvY3VtZW50SW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lZC5pbXBvcnRDaGlsZE5vZGVzKHRoaXMsIHRydWUpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUF0dHJpYnV0ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUF0dHJJbXBsIGF0dHIgPSBuZXcgQXR0ckltcGwoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQXR0ckltcGwgYXR0ciA9IG5ldyBBdHRySW1wbCgpOwotCQlhdHRyLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWF0dHIuc2V0TmFtZShuYW1lKTsKLQkJYXR0ci5zZXROYW1lc3BhY2VVUkkodXJpKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQ0RBVEFTZWN0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ0RBVEFTZWN0aW9uIGNyZWF0ZUNEQVRBU2VjdGlvbihTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIGFsbG93IENEQVRBIHNlY3Rpb24KLQkJLy8gaWYgKCFpc1hNTFR5cGUoKSkgewotCQkvLyB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgbmV3Ci0JCS8vIFN0cmluZygpKTsKLQkJLy8gfQotCQlDREFUQVNlY3Rpb25JbXBsIGNkYXRhID0gbmV3IENEQVRBU2VjdGlvbkltcGwoKTsKLQkJY2RhdGEuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNkYXRhLnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiBjZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ29tbWVudAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudChTdHJpbmcgZGF0YSkgewotCQlDb21tZW50SW1wbCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0JCWNvbW1lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNvbW1lbnQuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIGJvb2xlYW4gaXNKU1BUYWcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmICghaXNKU1BUeXBlKCkgJiYgaXNKU1BUYWcpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBjcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQllbGVtZW50LnNldEpTUFRhZyhpc0pTUFRhZyk7Ci0JCUNvbW1lbnRFbGVtZW50UmVnaXN0cnkgcmVnaXN0cnkgPSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCWlmIChyZWdpc3RyeS5zZXR1cENvbW1lbnRFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlyZXN1bHQgPSBlbGVtZW50OwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIERvY3VtZW50VHlwZSBjcmVhdGVEb2N0eXBlKFN0cmluZyBuYW1lKSB7Ci0JCURvY3VtZW50VHlwZUltcGwgZG9jVHlwZSA9IG5ldyBEb2N1bWVudFR5cGVJbXBsKCk7Ci0JCWRvY1R5cGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZG9jVHlwZS5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gZG9jVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudEZyYWdtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSB7Ci0JCURvY3VtZW50RnJhZ21lbnRJbXBsIGZyYWdtZW50ID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKCk7Ci0JCWZyYWdtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXJldHVybiBmcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVFbGVtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWNoZWNrVGFnTmFtZVZhbGlkaXR5KHRhZ05hbWUpOwotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBuZXcgRWxlbWVudEltcGwoKTsKLQkJZWxlbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQllbGVtZW50LnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnROUyhTdHJpbmcgdXJpLCBTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZE5hbWUodGFnTmFtZSkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCWVsZW1lbnQuc2V0TmFtZXNwYWNlVVJJKHVyaSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUVudGl0eSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVudGl0eQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVudGl0eSBjcmVhdGVFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJRW50aXR5SW1wbCBlbnRpdHkgPSBuZXcgRW50aXR5SW1wbCgpOwotCQllbnRpdHkuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZW50aXR5LnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRW50aXR5UmVmZXJlbmNlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRW50aXR5UmVmZXJlbmNlIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNYTUxUeXBlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJRW50aXR5UmVmZXJlbmNlSW1wbCByZWYgPSBuZXcgRW50aXR5UmVmZXJlbmNlSW1wbCgpOwotCQlyZWYuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJcmVmLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVJdGVyYXRvciBjcmVhdGVOb2RlSXRlcmF0b3IoTm9kZSByb290LCBpbnQgd2hhdFRvU2hvdywgTm9kZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKSB7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyb290ID0gdGhpczsKLQkJcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3JJbXBsKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlTm90YXRpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob3RhdGlvbgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vdGF0aW9uIGNyZWF0ZU5vdGF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCU5vdGF0aW9uSW1wbCBub3RhdGlvbiA9IG5ldyBOb3RhdGlvbkltcGwoKTsKLQkJbm90YXRpb24uc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJbm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKCk7Ci0JCXBpLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXBpLnNldFRhcmdldCh0YXJnZXQpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJcGkuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHBpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBSYW5nZSBjcmVhdGVSYW5nZSgpIHsKLQkJcmV0dXJuIG5ldyBSYW5nZUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVUZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0JCVRleHRJbXBsIHRleHQgPSBuZXcgVGV4dEltcGwoKTsKLQkJdGV4dC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQl0ZXh0LnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiB0cmVlIHdhbGsKLQkgKi8KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Eb2N1bWVudFRyYXZlcnNhbCNjcmVhdGVUcmVlV2Fsa2VyKG9yZy53M2MuZG9tLk5vZGUsCi0JICogICAgICBpbnQsIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBUcmVlV2Fsa2VyIGNyZWF0ZVRyZWVXYWxrZXIoTm9kZSByb290LCBpbnQgd2hhdFRvU2hvdywgTm9kZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKSB7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCVN0cmluZyBtc2cgPSAiUHJvZ3JhbSBFcnJvcjogcm9vdCBub2RlIGNhbiBub3QgYmUgbnVsbCBmb3IgVHJlZVdhbGtlciI7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgbXNnKTsKLQkJfQotCQkvLyBJU1NVRTogd2UganVzdCB1c2UgWGVyY2VzIGltcGxlbWVudGF0aW9uIGZvciBub3csIGJ1dCBsb25nZXIgdGVybSwKLQkJLy8gd2Ugc2hvdWxkIG1ha2UgYQotCQkvLyB0aHJlYWQvam9iIHNhZmUgdmVyc2lvbiAoYXMgd2VsbCBhcyBub3QgcmVseSBvbiBYZXJjZXMgImltcGwiCi0JCS8vIGNsYXNzLgotCQlyZXR1cm4gbmV3IFRyZWVXYWxrZXJJbXBsKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlciwgZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKTsKLQotCX0KLQotCXByaXZhdGUgRG9jdW1lbnRUeXBlIGZpbmREb2N0eXBlKE5vZGUgbm9kZSkgewotCQkKLQkJaW50IGNvdW50U2VhcmNoID0gMDsKLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNvdW50U2VhcmNoKysgPiBtYXhEb2NUeXBlU2VhcmNoKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBET0NVTUVOVF9UWVBFX05PREUgJiYgY2hpbGQgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGUpIHsKLQkJCQlyZXR1cm4gKERvY3VtZW50VHlwZSkgY2hpbGQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IEVMRU1FTlRfTk9ERSAmJiAoKElET01FbGVtZW50KSBjaGlsZCkuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkvLyBzZWFyY2ggRE9DVFlQRSBpbnNpZGUgb2YgZ2VuZXJpYyBjb21tZW50IGVsZW1lbnQKLQkJCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGZpbmREb2N0eXBlKGNoaWxkKTsKLQkJCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkb2NUeXBlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRWxlbWVudCBmaW5kRG9jdW1lbnRFbGVtZW50KFN0cmluZyBkb2NOYW1lLCBOb2RlIG5vZGUsIE5vZGVbXSBmaXJzdEZvdW5kLCBpbnQgbWF4KSB7Ci0JCWludCBjb3VudFNlYXJjaCA9IDA7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQotCQkJLyogCi0JCQkgKiBtYXhEb2NUeXBlU2VhcmNoIGxpbWl0cyBhZGRlZCB2aWEgYnVnIDE1MTkyOQotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTkyOQotCQkJICogYnV0LCBpbiBvdGhlciBjb250ZXh0cywgCi0JCQkgKiBpZiBub01heFNlYXJjaCBpcyBzcGVjaWZpZWQsIHRoZW4gZG8gbm90ICJicmVhayBvdXQiIG9mIGxvbmcgc2VhcmNoZXMgCi0JCQkgKiAqLwotCQkJaWYgKG1heCAhPSBub01heFNlYXJjaCAmJiBjb3VudFNlYXJjaCsrID4gbWF4KSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBjaGlsZDsKLQkJCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZmluZERvY3VtZW50RWxlbWVudChkb2NOYW1lLCBlbGVtZW50LCBmaXJzdEZvdW5kLCBtYXgpOwotCQkJCWlmIChkb2NFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRvY0VsZW1lbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhZGRlZCAnZWxzZSBjb250aW51ZScgdG8gYmV0dGVyIGhhbmRsZSBjYXNlcyB3aGVyZQotCQkJCQkvLyB0aGVyZSBpcyAibW9yZSB0aGFuIG9uZSByb290IiBlbGVtZW50Ci0JCQkJCS8vIGVzcGVjaWFsbHkgY29tcGxpY2F0ZWQgYnkgQ29tbWVudEVsZW1lbnRzLCB3aGljaCBhcmUKLQkJCQkJLy8gc29tZXRpbWVzIHRyZWF0ZWQgYXMgZWxlbWVudHMsIGJ1dCBzaG91bGQKLQkJCQkJLy8gYmUgdHJlYXRlZCBhcyBjb21tZW50cyBpbiB0aGlzIGNvbnRleHQuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIG5vdGU6IHRoZSAibmFtZSIgd29uJ3QgbWF0Y2ggaW4gdGhlIGV2ZW50IG9mIGEganNwIHRhZyAuLi4gYnV0Ci0JCQkvLyBpbmNhc2UKLQkJCS8vIHRoZSBuYW1lIGlzIG51bGwsIHdlIGRvIG5vdCB3YW50IHRoZSBqc3AgZWxlbWVudCByZXR1cm5lZCBhcwotCQkJLy8gZG9jdW1lbnRFbGVtZW50Ci0JCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGRvY05hbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCS8vIHVzZSBsb2NhbCBuYW1lIGZvciBuYW1lc3BhY2UKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGlzWE1MVHlwZSgpKSB7Ci0JCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHMoZG9jTmFtZSkpCi0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGRvY05hbWUpKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJCWlmIChmaXJzdEZvdW5kWzBdID09IG51bGwpCi0JCQkJZmlyc3RGb3VuZFswXSA9IGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2hhclZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGFyVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKG5hbWUuY2hhckF0KDApID09ICcjJykgeyAvLyBjaGFyYWN0ZXIgcmVmZXJlbmNlCi0JCQlpZiAobGVuZ3RoID09IDEpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpbnQgcmFkaXggPSAxMDsKLQkJCVN0cmluZyBzID0gbnVsbDsKLQkJCS8vIG5vdyBhbGxvdyBoZXhhZGVjaW1hbCBhbHNvIGZvciBub24gWE1MIGRvY3VtZW50Ci0JCQlpZiAobmFtZS5jaGFyQXQoMSkgPT0gJ3gnKSB7IC8vIGhleGFkZWNpbWFsCi0JCQkJcmFkaXggPSAxNjsKLQkJCQlzID0gbmFtZS5zdWJzdHJpbmcoMik7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gZGVjaW1hbAotCQkJCXMgPSBuYW1lLnN1YnN0cmluZygxKTsKLQkJCX0KLQkJCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHMuY2hhckF0KDApID09ICctJykKLQkJCQlyZXR1cm4gbnVsbDsgLy8gbm8gbWludXMgYWNjZXB0ZWQKLQkJCWNoYXIgYyA9IDA7Ci0JCQl0cnkgewotCQkJCWMgPSAoY2hhcikgSW50ZWdlci5wYXJzZUludChzLCByYWRpeCk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGMpOwotCQl9Ci0KLQkJLy8gaW1wbGljaXQgY2hhcmFjdGVyIGVudGl0aWVzIGZvciBYTUwKLQkJaWYgKG5hbWUuZXF1YWxzKElYTUxDaGFyRW50aXR5LkxUX05BTUUpKQotCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkxUX1ZBTFVFOwotCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuR1RfTkFNRSkpCi0JCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuR1RfVkFMVUU7Ci0JCWlmIChuYW1lLmVxdWFscyhJWE1MQ2hhckVudGl0eS5BTVBfTkFNRSkpCi0JCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuQU1QX1ZBTFVFOwotCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuUVVPVF9OQU1FKSkKLQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5RVU9UX1ZBTFVFOwotCQlpZiAoaXNYTUxUeXBlKCkpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhJWE1MQ2hhckVudGl0eS5BUE9TX05BTUUpKQotCQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5BUE9TX1ZBTFVFOwotCQl9Ci0KLQkJQ01Eb2N1bWVudCBjbSA9IGdldENNRG9jdW1lbnQoKTsKLQkJaWYgKGNtICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIG1hcCA9IGNtLmdldEVudGl0aWVzKCk7Ci0JCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQlDTUVudGl0eURlY2xhcmF0aW9uIGRlY2wgPSAoQ01FbnRpdHlEZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IGRlY2wuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJaW50IHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCQkJCWlmICh2YWx1ZUxlbmd0aCA+IDEgJiYgdmFsdWUuY2hhckF0KDApID09ICcmJyAmJiB2YWx1ZS5jaGFyQXQoMSkgPT0gJyMnICYmIHZhbHVlLmNoYXJBdCh2YWx1ZUxlbmd0aCAtIDEpID09ICc7JykgewotCQkJCQkJLy8gY2hhcmFjdGVyIHJlZmVyZW5jZQotCQkJCQkJcmV0dXJuIGdldENoYXJWYWx1ZSh2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWVMZW5ndGggLSAxKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkodGhpcyk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZSgpIHsKLQkJcmV0dXJuIGZpbmREb2N0eXBlKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGdldERvY3VtZW50RWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudCBGcm9tIERPTSAyIFNwZWM6IGRvY3VtZW50RWxlbWVudCBvZiB0eXBlCi0JICogICAgICAgICBFbGVtZW50IFtwLjYyXSAsIHJlYWRvbmx5IFRoaXMgaXMgYSBjb252ZW5pZW5jZSBbcC4xMTldCi0JICogICAgICAgICBhdHRyaWJ1dGUgdGhhdCBhbGxvd3MgZGlyZWN0IGFjY2VzcyB0byB0aGUgY2hpbGQgbm9kZSB0aGF0IGlzCi0JICogICAgICAgICB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4gRm9yIEhUTUwgZG9jdW1lbnRzLCB0aGlzIGlzCi0JICogICAgICAgICB0aGUgZWxlbWVudCB3aXRoIHRoZSB0YWdOYW1lICJIVE1MIi4gTm90ZTogd2UgZGlmZmVyIGZyb20gdGhpcwotCSAqICAgICAgICAgZGVmaW5pdGlvbiBhIGxpdHRsZSBpbiB0aGF0IHdlIGRvbid0IG5lY2Vzc2FyaWx5IHRha2UgdGhlIGZpcnN0Ci0JICogICAgICAgICBjaGlsZCBidXQgYWxzbyBsb29rIHRvIG1hdGNoIHRoZSBuYW1lLiBJbiBhIHdlbGwgZm9ybWVkCi0JICogICAgICAgICBkb2N1bWVudCwgb2YgY291cnNlLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lLCBidXQgbm90Ci0JICogICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBpbiBhbiBpbGwtZm9ybWVkIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGdldERvY3VtZW50RWxlbWVudCgpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQluYW1lID0gZG9jVHlwZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlFbGVtZW50IGZpcnN0W10gPSBuZXcgRWxlbWVudFsxXTsKLQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZmluZERvY3VtZW50RWxlbWVudChuYW1lLCB0aGlzLCBmaXJzdCwgbm9NYXhTZWFyY2gpOwotCQlpZiAoZG9jRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlkb2NFbGVtZW50ID0gZmlyc3RbMF07Ci0JCX0KLQotCQlyZXR1cm4gZG9jRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlIGdldERvY3VtZW50VHlwZSgpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZ2V0RG9jdHlwZSgpOwotCQlyZXR1cm4gYWRhcHRlci5nZXREb2N1bWVudFR5cGUoKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlSWQoKSB7Ci0JCURvY3VtZW50VHlwZSBkb2NUeXBlID0gZ2V0RG9jdW1lbnRUeXBlKCk7Ci0JCWlmIChkb2NUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGlkID0gZG9jVHlwZS5nZXRQdWJsaWNJZCgpOwotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCWlkID0gZG9jVHlwZS5nZXRTeXN0ZW1JZCgpOwotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5SWQoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoaWQpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudHNCeVRhZ05hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCU5vZGVMaXN0SW1wbCBlbGVtZW50cyA9IG51bGw7Ci0KLQkJaWYgKHVzZXRhZ25hbWVjYWNoZSkgewotCQkJZWxlbWVudHMgPSB0YWdOYW1lQ2FjaGUuZ2V0SXRlbSh0YWdOYW1lKTsKLQkJfQotCi0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IGludGVybmFsR2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7Ci0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlOb2RlSXRlcmF0b3IgaXQgPSBjcmVhdGVOb2RlSXRlcmF0b3IodGhpcywgTm9kZUZpbHRlci5TSE9XX0FMTCwgbnVsbCwgZmFsc2UpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVMaXN0SW1wbCBlbGVtZW50cyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID09IDEgJiYgdXJpLmNoYXJBdCgwKSA9PSAnKicpIHsKLQkJCXVyaSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQkJaWYgKHRhZ05hbWUubGVuZ3RoKCkgPT0gMSAmJiB0YWdOYW1lLmNoYXJBdCgwKSA9PSAnKicpIHsKLQkJCXRhZ05hbWUgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsIHx8ICFsb2NhbE5hbWUuZXF1YWxzKHRhZ05hbWUpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuc1VSSSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFwcGVuZE5vZGUoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSBlbmNvZGluZwotCSAqIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRJbXBsZW1lbnRhdGlvbigpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIG90aGVyIG5vZGVzIHdpbGwgYmUgcmVmZXJyaW5nIHRvIHRoaXMgb25lIHRvIGdldCB0aGUgb3duaW5nIG1vZGVsCi0JICovCi0JcHVibGljIElET01Nb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2RvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIERPQ1VNRU5UX05PREU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHdoZXRoZXIgdGhpcwotCSAqIGRvY3VtZW50IGlzIHN0YW5kYWxvbmUuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFN0YW5kYWxvbmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcgd2hldGhlciBlcnJvcnMgY2hlY2tpbmcgaXMgZW5mb3JjZWQgb3Igbm90LgotCSAqIFdoZW4gc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gbm90Ci0JICogdGVzdCBldmVyeSBwb3NzaWJsZSBlcnJvciBjYXNlIG5vcm1hbGx5IGRlZmluZWQgb24gRE9NIG9wZXJhdGlvbnMsIGFuZAotCSAqIG5vdCByYWlzZSBhbnkgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPi4gSW4gY2FzZSBvZiBlcnJvciwgdGhlCi0JICogYmVoYXZpb3IgaXMgdW5kZWZpbmVkLiBUaGlzIGF0dHJpYnV0ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiBieQotCSAqIGRlZmF1bHRzLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTdHJpY3RFcnJvckNoZWNraW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVDYXNlKCkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChhZGFwdGVyLmdldFRhZ05hbWVDYXNlKCkgIT0gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW1wb3J0Q2hpbGROb2RlcyhOb2RlIHBhcmVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlOb2RlIGltcG9ydGVkID0gaW1wb3J0Tm9kZShjaGlsZCwgZGVlcCk7Ci0JCQlpZiAoaW1wb3J0ZWQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWFwcGVuZENoaWxkKGltcG9ydGVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBOb2RlIGltcG9ydE5vZGUoTm9kZSBub2RlLCBib29sZWFuIGRlZXApIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVJbXBsIGltcG9ydGVkID0gKE5vZGVJbXBsKSBub2RlLmNsb25lTm9kZShkZWVwKTsKLQkJaWYgKGltcG9ydGVkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy9zdWNjZXNzZnVsIGltcG9ydCwgbm90aWZ5IFVzZXJEYXRhSGFuZGxlcnMgaWYgYW55Ci0JCU5vZGVJbXBsIG5vZGVUb05vdGlmeT0oTm9kZUltcGwpIG5vZGU7Ci0JCW5vZGVUb05vdGlmeS5ub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0lNUE9SVEVELCBudWxsKTsKLQkJaW1wb3J0ZWQuc2V0T3duZXJEb2N1bWVudCh0aGlzLCBkZWVwKTsKLQkJcmV0dXJuIGltcG9ydGVkOwotCX0KLQotCXByaXZhdGUgTm9kZUxpc3RJbXBsIGludGVybmFsR2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50c0J5VGFnbmFtZTogIiArIHRhZ05hbWUpOwotCQlOb2RlSXRlcmF0b3IgaXQgPSBjcmVhdGVOb2RlSXRlcmF0b3IodGhpcywgTm9kZUZpbHRlci5TSE9XX0FMTCwgbnVsbCwgZmFsc2UpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVMaXN0SW1wbCBlbGVtZW50cyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA9PSAxICYmIHRhZ05hbWUuY2hhckF0KDApID09ICcqJykgewotCQkJdGFnTmFtZSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IGl0Lm5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGl0Lm5leHROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKCFlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0JCWlmICh1c2V0YWduYW1lY2FjaGUpIHsKLQkJCXRhZ05hbWVDYWNoZS5hZGRJdGVtKHRhZ05hbWUsIGVsZW1lbnRzKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BEb2N1bWVudCgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFscyhKU1BUYWcuSlNQX1JPT1QpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQVHlwZSgpIHsKLQkJaWYgKHRoaXMubW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gdGhpcy5tb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGlkID0gaGFuZGxlci5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gSVNTVUU6IC0tIGF2b2lkIHRoaXMgaGFyZGNvZGVkIHN0cmluZwotCQlyZXR1cm4gaWQuZXF1YWxzKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gLy8gRE1XOiBtb2RpZmllZCBmb3IgWE1MNEogNC4wLjEKLQkJLy8gaWYgKFhNTENoYXIuaXNWYWxpZE5hbWUobmFtZSkpIHJldHVybiB0cnVlOwotCQlpZiAoTmFtZVZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCS8vIHNwZWNpYWwgZm9yIGludmFsaWQgZGVjbGFyYXRpb24KLQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMSAmJiBuYW1lLmNoYXJBdCgwKSA9PSAnIScpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8gc3BlY2lhbCBmb3IgSlNQIHRhZyBpbiB0YWcgbmFtZQotCQlpZiAobmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGFkYXB0ZXIuaXNYTUxUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcmVsZWFzZURvY3VtZW50VHlwZSgpIHsKLQkvLyBpZiAodGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID09IG51bGwpCi0JLy8gcmV0dXJuOwotCS8vIHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlci5yZWxlYXNlKCk7Ci0JLy8gdGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID0gbnVsbDsKLQkvLyB9Ci0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSBlbmNvZGluZwotCSAqIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZykgewotCX0KLQotCS8qKgotCSAqIHNldE1vZGVsIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgWE1MTW9kZWwKLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElET01Nb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gKERPTU1vZGVsSW1wbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHdoZXRoZXIgdGhpcwotCSAqIGRvY3VtZW50IGlzIHN0YW5kYWxvbmUuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYWxvbmUoYm9vbGVhbiBzdGFuZGFsb25lKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHdoZXRoZXIgZXJyb3JzIGNoZWNraW5nIGlzIGVuZm9yY2VkIG9yIG5vdC4KLQkgKiBXaGVuIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIG5vdAotCSAqIHRlc3QgZXZlcnkgcG9zc2libGUgZXJyb3IgY2FzZSBub3JtYWxseSBkZWZpbmVkIG9uIERPTSBvcGVyYXRpb25zLCBhbmQKLQkgKiBub3QgcmFpc2UgYW55IDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4uIEluIGNhc2Ugb2YgZXJyb3IsIHRoZQotCSAqIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4gVGhpcyBhdHRyaWJ1dGUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gYnkKLQkgKiBkZWZhdWx0cy4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaWN0RXJyb3JDaGVja2luZyhib29sZWFuIHN0cmljdEVycm9yQ2hlY2tpbmcpIHsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIFhNTCBkZWNsYXJhdGlvbiwgdGhlIHZlcnNpb24KLQkgKiBudW1iZXIgb2YgdGhpcyBkb2N1bWVudC4gVGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHVuc3BlY2lmaWVkLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbikgewotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRYbWxTdGFuZGFsb25lKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhtbFN0YW5kYWxvbmUoYm9vbGVhbiB4bWxTdGFuZGFsb25lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhtbFZlcnNpb24oKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0WG1sVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudFVSSSgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFVSSShTdHJpbmcgZG9jdW1lbnRVUkkpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgRE9NQ29uZmlndXJhdGlvbiBnZXREb21Db25maWcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgbm9ybWFsaXplRG9jdW1lbnQoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIE5vZGUgcmVuYW1lTm9kZShOb2RlIG4sIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTY3MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50VHlwZUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCXN0YXRpYyBmaW5hbCBpbnQgTE9XRVJfQ0FTRSA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBTVFJJQ1RfQ0FTRSA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBVUFBFUl9DQVNFID0gMTsKLQotCS8qKgotCSAqLwotCWludCBnZXRBdHRyTmFtZUNhc2UoKTsKLQotCS8qKgotCSAqLwotCURvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKTsKLQotCS8qKgotCSAqLwotCWludCBnZXRUYWdOYW1lQ2FzZSgpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNYTUxUeXBlKCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljM2U5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRUeXBlQWRhcHRlckltcGwgaW1wbGVtZW50cyBEb2N1bWVudFR5cGVBZGFwdGVyIHsKLQotCXByaXZhdGUgSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGVBZGFwdGVySW1wbChJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJdGhpcy5kb2N1bWVudFR5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIFNUUklDVF9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdW1lbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIFNUUklDVF9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkKLQkJCXJldHVybjsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwgfHwgIShub3RpZmllciBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkpCi0JCQlyZXR1cm47Ci0JCXRoaXMuZG9jdW1lbnRUeXBlID0gKChJRE9NRG9jdW1lbnQpIG5vdGlmaWVyKS5nZXREb2N0eXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RG9jdW1lbnRUeXBlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU1vZGVsIG1vZGVsID0gdGhpcy5kb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChET01Nb2RlbEltcGwpIG1vZGVsKS5kb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50VHlwZShEb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlKSB7Ci0JCXRoaXMuZG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OTU0M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBEb2N1bWVudFR5cGUgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50VHlwZUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIElET01Eb2N1bWVudFR5cGUgewotCXByaXZhdGUgU3RyaW5nIGludGVybmFsU3Vic2V0ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBEb2N1bWVudFR5cGVJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRUeXBlSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBEb2N1bWVudFR5cGVJbXBsCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUltcGwoRG9jdW1lbnRUeXBlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRG9jdW1lbnRUeXBlSW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRUeXBlSW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW50aXRpZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludGVybmFsU3Vic2V0KCkgewotCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFN1YnNldDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIERPQ1VNRU5UX1RZUEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb3RhdGlvbnMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldE5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50ZXJuYWxTdWJzZXQoU3RyaW5nIGludGVybmFsU3Vic2V0KSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pbnRlcm5hbFN1YnNldCA9IGludGVybmFsU3Vic2V0OwotCX0KLQotCS8qKgotCSAqIHNldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldE5hbWUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRQdWJsaWNJZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0U3lzdGVtSWQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnQCcpOwotCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGI4MmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgCi0gKiAgICAgVmFsZW50aW4gQmFjaXUgLSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NTUyCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotCi0vKioKLSAqIEVsZW1lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW1wbCBleHRlbmRzIE5vZGVDb250YWluZXIgaW1wbGVtZW50cyBJRE9NRWxlbWVudCB7Ci0KLQlwcml2YXRlIGNsYXNzIEF0dHJpYnV0ZXMgaW1wbGVtZW50cyBOYW1lZE5vZGVNYXAgewotCQlBdHRyaWJ1dGVzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJcmV0dXJuIGF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXROYW1lZEl0ZW1OUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCWlmIChhdHRyTm9kZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBhdHRyTm9kZXMuaXRlbShpbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQkJcmV0dXJuIHJlbW92ZUF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW1OUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gcmVtb3ZlQXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW0oTm9kZSBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQkJcmV0dXJuIHNldEF0dHJpYnV0ZU5vZGUoKEF0dHJJbXBsKSBhcmcpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgc2V0TmFtZWRJdGVtTlMoTm9kZSBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQkJcmV0dXJuIHNldEF0dHJpYnV0ZU5vZGVOUygoQXR0ckltcGwpIGFyZyk7Ci0JCX0KLQl9Ci0KLQlOb2RlTGlzdEltcGwgYXR0ck5vZGVzID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50VGFnID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlUYWcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BUYWcgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBFbGVtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBFbGVtZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW1wbChFbGVtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMudGFnTmFtZSA9IHRoYXQudGFnTmFtZTsKLQkJCXRoaXMuaXNFbXB0eVRhZyA9IHRoYXQuaXNFbXB0eVRhZzsKLQkJCXRoaXMuaXNKU1BUYWcgPSB0aGF0LmlzSlNQVGFnOwotCQkJdGhpcy5pc0NvbW1lbnRUYWcgPSB0aGF0LmlzQ29tbWVudFRhZzsKLQotCQkJLy8gY2xvbmUgYXR0cmlidXRlcwotCQkJdGhhdC5jbG9uZUF0dHJpYnV0ZXModGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGRFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZyhFbGVtZW50IGVuZFRhZykgewotCQlpZiAoZW5kVGFnID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChoYXNFbmRUYWcoKSkKLQkJCXJldHVybjsKLQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSBlbmRUYWc7Ci0KLQkJLy8gbW92ZSB0aGUgZW5kIGZsYXQgbm9kZSBmcm9tIHRoZSBlbmQgdGFnCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbmQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbmQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQlzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIGFwcGVuZEF0dGlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXB1YmxpYyBBdHRyIGFwcGVuZEF0dHJpYnV0ZU5vZGUoQXR0ciBuZXdBdHRyKSB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJaWYgKGF0dHIuZ2V0T3duZXJFbGVtZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQl0aGlzLmF0dHJOb2RlcyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJdGhpcy5hdHRyTm9kZXMuYXBwZW5kTm9kZShhdHRyKTsKLQkJYXR0ci5zZXRPd25lckVsZW1lbnQodGhpcyk7Ci0KLQkJbm90aWZ5QXR0clJlcGxhY2VkKGF0dHIsIG51bGwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZUF0dHJpYnV0ZXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld093bmVyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvbmVBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3T3duZXIpIHsKLQkJaWYgKG5ld093bmVyID09IG51bGwgfHwgbmV3T3duZXIgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdPd25lcjsKLQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVzKCk7Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCUF0dHIgY2xvbmVkID0gKEF0dHIpIG5vZGUuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCWlmIChjbG9uZWQgIT0gbnVsbCkKLQkJCQllbGVtZW50LmFwcGVuZEF0dHJpYnV0ZU5vZGUoY2xvbmVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRWxlbWVudEltcGwgY2xvbmVkID0gbmV3IEVsZW1lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQkKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQlyZXR1cm4gYXR0cjsgLy8gZm91bmQKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbnNVUkkgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gZm91bmQKLQkJCXJldHVybiBhdHRyOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50c0J5VGFnTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlpZiAoIWVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh1cmkgIT0gbnVsbCAmJiB1cmkubGVuZ3RoKCkgPT0gMSAmJiB1cmkuY2hhckF0KDApID09ICcqJykgewotCQkJdXJpID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA9PSAxICYmIHRhZ05hbWUuY2hhckF0KDApID09ICcqJykgewotCQkJdGFnTmFtZSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IGl0Lm5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGl0Lm5leHROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHModGFnTmFtZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5zVVJJID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCQlpZiAobnNVUkkgPT0gbnVsbCB8fCAhbnNVUkkuZXF1YWxzKHVyaSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYXBwZW5kTm9kZShlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCXJldHVybiBzdXBlci5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRTdGFydE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBzdXBlci5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmRUYWdOYW1lKCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkRW5kVGFnKHJlZ2lvblR5cGUpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkRW5kVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJaWYgKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlpZiAodGhpcy50YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gdGhpcy50YWdOYW1lLmluZGV4T2YoJzonKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiB0aGlzLnRhZ05hbWU7Ci0JCXJldHVybiB0aGlzLnRhZ05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCVN0cmluZyBuc0F0dHJOYW1lID0gbnVsbDsKLQkJU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeCgpOwotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJbnNBdHRyTmFtZSA9IElYTUxOYW1lc3BhY2UuWE1MTlNfUFJFRklYICsgcHJlZml4OwotCQl9Ci0JCWVsc2UgewotCQkJbnNBdHRyTmFtZSA9IElYTUxOYW1lc3BhY2UuWE1MTlM7Ci0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5zQXR0ck5hbWUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUYWdOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEVMRU1FTlRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IHRoaXMudGFnTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiB0YWcgbmFtZQotCQlpZiAodGhpcy50YWdOYW1lLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMudGFnTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0RW5kT2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydEVuZE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRFbmQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAoZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWhhc0NoaWxkTm9kZXMoKSkgewotCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMudGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuICh0aGlzLmF0dHJOb2RlcyAhPSBudWxsICYmIHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpID4gMCk7Ci0JfQotCi0JLyoqCi0JICogaGFzRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VuZFRhZygpIHsKLQkJcmV0dXJuICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBoYXNQcmVmaXgoKSB7Ci0JCWlmICh0aGlzLnRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMudGFnTmFtZS5pbmRleE9mKCc6JykgPD0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gZXhjbHVkZSBKU1AgdGFnIGluIHRhZyBuYW1lCi0JCWlmICh0aGlzLnRhZ05hbWUuY2hhckF0KDApID09ICc8JykKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaGFzU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU3RhcnRUYWcoKSB7Ci0JCXJldHVybiAoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaWdub3JlQ2FzZSgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pZ25vcmVDYXNlKCkpIHsKLQkJCS8vIGV2ZW4gaW4gY2FzZSBpbnNlbnNpdGl2ZSBkb2N1bWVudCwgaWYgaGF2aW5nIHByZWZpeCwgaXQncyBjYXNlCi0JCQkvLyBzZW5zaXRpdmUgdGFnCi0JCQlyZXR1cm4gIWhhc1ByZWZpeCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0ciBpbnNlcnRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0ciwgaW50IGluZGV4KSB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJaWYgKGF0dHIuZ2V0T3duZXJFbGVtZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJdGhpcy5hdHRyTm9kZXMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCXRoaXMuYXR0ck5vZGVzLmluc2VydE5vZGUoYXR0ciwgaW5kZXgpOwotCQlhdHRyLnNldE93bmVyRWxlbWVudCh0aGlzKTsKLQotCQlub3RpZnlBdHRyUmVwbGFjZWQoYXR0ciwgbnVsbCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIGluc2VydEJlZm9yZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHNob3VsZCB0aHJvdyBET01FeGNlcHRpb24gaW5zdGVhZCBvZiByZXR1cm4gbnVsbD8KLQkJaWYgKG5ld0NoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFpc0NvbnRhaW5lcigpKSB7IC8vIG5ldmVyIGJlIGNvbnRhaW5lcgotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChuZXdDaGlsZC5nZXROb2RlVHlwZSgpICE9IFRFWFRfTk9ERSkgewotCQkJaWYgKGlzSlNQQ29udGFpbmVyKCkgfHwgaXNDREFUQUNvbnRhaW5lcigpKSB7IC8vIGFjY2VwdHMgb25seQotCQkJCS8vIFRleHQKLQkJCQkvLyBjaGlsZAotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDREFUQUNvbnRhaW5lcigpIHsKLQkJLy8gdXNlIEJsb2NrTWFrZXIgaW5zdGVhZCBvZiBDTUVsZW1lbnREZWNsYXJhdGlvbgotCQkvLyBiZWNhdXNlIDxzdHlsZT4gYW5kIDxzY3JpcHQ+IGluIFhIVE1MIGlzIG5vdCBDREFUQSBjb250ZW50IHR5cGUKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGVycm9yCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gZXJvcgotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpOwotCQlpZiAocGFyc2VyID09IG51bGwgfHwgIShwYXJzZXIgaW5zdGFuY2VvZiBYTUxTb3VyY2VQYXJzZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKCgoWE1MU291cmNlUGFyc2VyKSBwYXJzZXIpLmdldEJsb2NrTWFya2VyKHRoaXMudGFnTmFtZSkgIT0gbnVsbCk7Ci0JCS8qCi0JCSAqIENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXREZWNsYXJhdGlvbigpOyBpZiAoZGVjbCA9PSBudWxsKQotCQkgKiByZXR1cm4gZmFsc2U7IGlmIChkZWNsIGluc3RhbmNlb2YgQ01Ob2RlV3JhcHBlcikgeyBkZWNsID0KLQkJICogKENNRWxlbWVudERlY2xhcmF0aW9uKSgoQ01Ob2RlV3JhcHBlcilkZWNsKS5nZXRPcmlnaW5Ob2RlKCk7IGlmCi0JCSAqIChkZWNsID09IG51bGwpIHJldHVybiBmYWxzZTsgfSBpZiAoZGVjbCBpbnN0YW5jZW9mCi0JCSAqIFRMREVsZW1lbnREZWNsYXJhdGlvbikgeyBTdHJpbmcgY29udGVudCA9Ci0JCSAqICgoVExERWxlbWVudERlY2xhcmF0aW9uKWRlY2wpLmdldEJvZHljb250ZW50KCk7IGlmIChjb250ZW50ID09Ci0JCSAqIG51bGwpIHJldHVybiBmYWxzZTsgcmV0dXJuCi0JCSAqIGNvbnRlbnQuZXF1YWxzKEpTUDExVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQpOyB9IGlmCi0JCSAqICghaXNHbG9iYWxUYWcoKSkgcmV0dXJuIGZhbHNlOyByZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PQotCQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJaWYgKGlzRW1wdHlUYWcoKSB8fCAhaXNDb250YWluZXIoKSkgewotCQkJZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOyAvLyB3aWxsIGJlIGdlbmVyYXRlZAotCQl9Ci0JCWVsc2UgewotCQkJZmxhdE5vZGUgPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsgLy8gbXVzdCBiZSBnZW5lcmF0ZWQKLQkJfQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAoaXNDb21tZW50VGFnKCkpIHsKLQkJCXJldHVybiAoaXNOZXN0ZWRDbG9zZWRDb21tZW50KHJlZ2lvblR5cGUpIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSk7Ci0JCX0KLQkJaWYgKGlzSlNQVGFnKCkpIHsKLQkJCXJldHVybiBpc05lc3RlZENsb3NlZChyZWdpb25UeXBlKTsKLQkJfQotCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ2xvc2VkKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDbG9zZWRDb21tZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb21tZW50VGFnKCkgewotCQlyZXR1cm4gdGhpcy5pc0NvbW1lbnRUYWc7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkgewotCQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoQ29tbWVudEVsZW1lbnRBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKENvbW1lbnRFbGVtZW50QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChhZGFwdGVyLmlzQ29udGFpbmVyKCkpOwotCQkJfQotCQkJcmV0dXJuIChnZXREZWNsYXJhdGlvbigpID09IG51bGwpOwotCQl9Ci0JCWlmIChpc0pTUFRhZygpKSB7Ci0JCQkvLyBleGNsdWRlIEpTUCBkaXJlY3RpdmUKLQkJCXJldHVybiAobWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfU0NSSVBUTEVUKSB8fCBtYXRjaFRhZ05hbWUoSlNQVGFnLkpTUF9ERUNMQVJBVElPTikgfHwgbWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfRVhQUkVTU0lPTikpOwotCQl9Ci0JCWlmICghaXNYTUxUYWcoKSkgeyAvLyBub24tWE1MIHRhZwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsgLy8gdW5kZWZpbmVkIHRhZwotCQkJcmV0dXJuIChkZWNsLmdldENvbnRlbnRUeXBlKCkgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGlzRW1wdHlUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eVRhZygpIHsKLQkJaWYgKGlzSlNQVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFpc1hNTFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5pc0VtcHR5VGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKCkgewotCQlyZXR1cm4gKGhhc0VuZFRhZygpICYmICFoYXNTdGFydFRhZygpICYmICFoYXNDaGlsZE5vZGVzKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsVGFnKCkgewotCQlyZXR1cm4gIWhhc1ByZWZpeCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRUYWcoKSB7Ci0JCWlmIChoYXNTdGFydFRhZygpIHx8IGhhc0VuZFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBtYWtlIHN1cmUgdGhpcyBpcyBpbiB0aGUgZG9jdW1lbnQgdHJlZQotCQkvLyBiZWNhdXNlIGlmIG5vdCBpbiB0aGUgZG9jdW1lbnQgdHJlZSwgbm8gdGFncyBhcmUgZ2VuZXJhdGVkIHlldAotCQlyZXR1cm4gKGdldENvbnRhaW5lckRvY3VtZW50KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BDb250YWluZXIoKSB7Ci0JCXJldHVybiAoaXNKU1BUYWcoKSAmJiAhaXNDb21tZW50VGFnKCkgJiYgaXNDb250YWluZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNKU1BUYWcoKSB7Ci0JCXJldHVybiB0aGlzLmlzSlNQVGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhcnRUYWdDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKGlzTmVzdGVkQ2xvc2VkQ29tbWVudChyZWdpb25UeXBlKSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpOwotCQl9Ci0JCWlmIChpc0pTUFRhZygpKSB7Ci0JCQlpZiAoaXNDb250YWluZXIoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gc3RhcnQgdGFnIGFsd2F5cyBoYXMgYSBzaW5nbGUgcmVnaW9uCi0JCQlyZXR1cm4gaXNDbG9zZWROZXN0ZWREaXJlY3RpdmUocmVnaW9uVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nsb3NlZE5lc3RlZERpcmVjdGl2ZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWE1MVGFnKCkgewotCQlpZiAoaXNKU1BUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmICFkb2N1bWVudC5pc1hNTFR5cGUoKSkgewotCQkJLy8gZXZlbiBpbiBub24tWE1MIGRvY3VtZW50LCBpZiBoYXZpbmcgcHJlZml4LCBpdCdzIFhNTCB0YWcKLQkJCXJldHVybiBoYXNQcmVmaXgoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEVuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGlzSlNQVGFnKCkgJiYgIWlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKGltcGwuaXNKU1BUYWcoKSAmJiAhaW1wbC5pc0NvbW1lbnRUYWcoKSk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoVGFnTmFtZShlbGVtZW50LmdldFRhZ05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogbWF0Y2hUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gKHRoaXMudGFnTmFtZSA9PSBudWxsKTsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWlnbm9yZUNhc2UoKSkKLQkJCXJldHVybiB0aGlzLnRhZ05hbWUuZXF1YWxzKHRhZ05hbWUpOwotCQlyZXR1cm4gdGhpcy50YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5QXR0clJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBdHRyUmVwbGFjZWQoQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5hdHRyUmVwbGFjZWQodGhpcywgbmV3QXR0ciwgb2xkQXR0cik7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUVuZFRhZ0NoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuZW5kVGFnQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlTdGFydFRhZ0NoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuc3RhcnRUYWdDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHByZWZlckVtcHR5VGFnKCkgewotCQlpZiAoaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNKU1BUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWlzWE1MVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXREZWNsYXJhdGlvbigpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQXR0cmlidXRlTm9kZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVBdHRyaWJ1dGVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZShBdHRyIG9sZEF0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAob2xkQXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkgeyAvLyBubyBhdHRyaWJ1dGUKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciAhPSBvbGRBdHRyKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBmb3VuZAotCQkJdGhpcy5hdHRyTm9kZXMucmVtb3ZlTm9kZShpKTsKLQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCi0JCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQlyZXR1cm4gYXR0cjsKLQkJfQotCi0JCS8vIG5vdCBmb3VuZAotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBuZXcgU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciByZW1vdmVBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQljb250aW51ZTsKLQotCQkJLy8gZm91bmQKLQkJCXRoaXMuYXR0ck5vZGVzLnJlbW92ZU5vZGUoaSk7Ci0JCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQotCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbnNVUkkgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gZm91bmQKLQkJCXRoaXMuYXR0ck5vZGVzLnJlbW92ZU5vZGUoaSk7Ci0JCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQotCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZW1vdmVBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVBdHRyaWJ1dGVzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZXMoKSB7Ci0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCQkJCW5vdGlmeUF0dHJSZXBsYWNlZChudWxsLCBhdHRyKTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuYXR0ck5vZGVzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVtb3ZlRW5kVGFnKCkgewotCQlpZiAoIWhhc0VuZFRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVMaXN0SW1wbCBhdHRyTm9kZXMgPSB0aGlzLmF0dHJOb2RlczsKLQkJdGhpcy5hdHRyTm9kZXMgPSBudWxsOyAvLyBub3QgdG8gY29weSBhdHRyaWJ1dGVzCi0JCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgY2xvbmVOb2RlKGZhbHNlKTsKLQkJdGhpcy5hdHRyTm9kZXMgPSBhdHRyTm9kZXM7Ci0JCWlmIChlbmQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIG1vdmUgdGhlIGVuZCBmbGF0IG5vZGUgdG8gdGhlIGVuZCB0YWcKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCWVuZC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVN0YXJ0VGFnKCkgewotCQlyZW1vdmVBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlpZiAodGhpcy5hdHRyTm9kZXMgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJYXR0ci5yZXNldFJlZ2lvbnMoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOyAvLyBmb3IgY2hpbGRyZW4KLQotCQl0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc2V0QXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7IC8vIGNoYW5nZSB2YWx1ZQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbmV3IGF0dHJpYnV0ZQotCQlEb2N1bWVudCBkb2MgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYXR0ciA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCX0KLQotCS8qKgotCSAqIHNldEF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJRWxlbWVudCBvd25lciA9IGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChvd25lciAhPSBudWxsKSB7Ci0JCQlpZiAob3duZXIgPT0gdGhpcykKLQkJCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5VU0VfQVRUUklCVVRFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUF0dHIgb2xkQXR0ciA9IHJlbW92ZUF0dHJpYnV0ZU5vZGUobmV3QXR0ci5nZXROYW1lKCkpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQlyZXR1cm4gb2xkQXR0cjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlTlMoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlFbGVtZW50IG93bmVyID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKG93bmVyICE9IG51bGwpIHsKLQkJCWlmIChvd25lciA9PSB0aGlzKQotCQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlVTRV9BVFRSSUJVVEVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSBuZXdBdHRyLmdldExvY2FsTmFtZSgpOwotCQlTdHJpbmcgdXJpID0gbmV3QXR0ci5nZXROYW1lc3BhY2VVUkkoKTsKLQkJQXR0ciBvbGRBdHRyID0gcmVtb3ZlQXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCWFwcGVuZEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCXJldHVybiBvbGRBdHRyOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB3ZSBzaG91bGQgY2hlY2sgZm9yIGFuZCB0aHJvdyBOQU1FU1BBQ0VfRVJSLCBhY2NvcmRpbmcgdG8gc3BlYy4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChxdWFsaWZpZWROYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTU1MgotCQkvLyBmaXggcHJvdmlkZWQgYnkgVmFsZW50aW4gQmFjaXUKLQkJaW50IGluZGV4ID0gcXVhbGlmaWVkTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCVN0cmluZyBsb2NhbE5hbWUgPSBpbmRleCAhPSAtMSA/IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSkgOiBxdWFsaWZpZWROYW1lOwotCi0JCUF0dHIgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIGxvY2FsTmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCWF0dHIuc2V0VmFsdWUodmFsdWUpOyAvLyBjaGFuZ2UgdmFsdWUKLQkJfQotCQllbHNlIHsKLQotCQkJLy8gbmV3IGF0dHJpYnV0ZQotCQkJRG9jdW1lbnQgZG9jID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJYXR0ciA9IGRvYy5jcmVhdGVBdHRyaWJ1dGVOUyh1cmksIHF1YWxpZmllZE5hbWUpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkJCWFwcGVuZEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudFRhZyhib29sZWFuIGlzQ29tbWVudFRhZykgewotCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuaXNDb21tZW50VGFnID0gaXNDb21tZW50VGFnOwotCX0KLQotCS8qKgotCSAqIHNldEVtcHR5VGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBpc0VtcHR5VGFnCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW1wdHlUYWcoYm9vbGVhbiBpc0VtcHR5VGFnKSB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pc0VtcHR5VGFnID0gaXNFbXB0eVRhZzsKLQl9Ci0KLQkvKioKLQkgKiBzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICovCi0Jdm9pZCBzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQl0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCi0JCU5vZGVDb250YWluZXIgcGFyZW50ID0gKE5vZGVDb250YWluZXIpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuc3luY0NoaWxkRWRpdGFibGVTdGF0ZSh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKU1BUYWcoYm9vbGVhbiBpc0pTUFRhZykgewotCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuaXNKU1BUYWcgPSBpc0pTUFRhZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQl0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQsIGJvb2xlYW4gZGVlcCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQsIGRlZXApOwotCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlhdHRyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IHByZWZpeExlbmd0aCA9IChwcmVmaXggIT0gbnVsbCA/IHByZWZpeC5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gZ2V0TG9jYWxOYW1lKCk7Ci0JCWlmIChwcmVmaXhMZW5ndGggPT0gMCkgewotCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsIHx8IGxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJLy8gaW52YWxpZCBsb2NhbCBuYW1lCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJc2V0VGFnTmFtZShsb2NhbE5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJaW50IGxvY2FsTGVuZ3RoID0gKGxvY2FsTmFtZSAhPSBudWxsID8gbG9jYWxOYW1lLmxlbmd0aCgpIDogMCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXhMZW5ndGggKyAxICsgbG9jYWxMZW5ndGgpOwotCQkJYnVmZmVyLmFwcGVuZChwcmVmaXgpOwotCQkJYnVmZmVyLmFwcGVuZCgnOicpOwotCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQobG9jYWxOYW1lKTsKLQkJCXNldFRhZ05hbWUoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJYm9vbGVhbiBjaGFuZ2VFbmRUYWcgPSBoYXNFbmRUYWcoKTsKLQkJbm90aWZ5U3RhcnRUYWdDaGFuZ2VkKCk7Ci0JCWlmIChjaGFuZ2VFbmRUYWcpCi0JCQlub3RpZnlFbmRUYWdDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICovCi0Jdm9pZCBzZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0VGFnTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgdGFnTmFtZSA9IGdldFRhZ05hbWUoKTsKLQkJaWYgKGhhc1N0YXJ0VGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQlpZiAoaXNFbXB0eVRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCgnLycpOwotCQlpZiAoaGFzRW5kVGFnKCkpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJy8nKTsKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCX0KLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA9PSAwKQotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ0AnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjQ1NDZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLS8qKgotICogRW50aXR5SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5SW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgRW50aXR5IHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIG5vdGF0aW9uTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCS8qKgotCSAqIEVudGl0eUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRpdHlJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEVudGl0eUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5SW1wbChFbnRpdHlJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQkJdGhpcy5wdWJsaWNJZCA9IHRoYXQucHVibGljSWQ7Ci0JCQl0aGlzLnN5c3RlbUlkID0gdGhhdC5zeXN0ZW1JZDsKLQkJCXRoaXMubm90YXRpb25OYW1lID0gdGhhdC5ub3RhdGlvbk5hbWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVudGl0eUltcGwgY2xvbmVkID0gbmV3IEVudGl0eUltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIGVuY29kaW5nCi0JICogb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEVOVElUWV9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldE5vdGF0aW9uTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubm90YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIGdldFB1YmxpY0lkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIGdldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiB0aGlzLnN5c3RlbUlkOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIHZlcnNpb24KLQkgKiBudW1iZXIgb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLCB0aGUgZW5jb2RpbmcKLQkgKiBvZiB0aGlzIGVudGl0eSwgd2hlbiBpdCBpcyBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5LiBUaGlzIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nKSB7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb3RhdGlvbk5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vdGF0aW9uTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uTmFtZShTdHJpbmcgbm90YXRpb25OYW1lKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5ub3RhdGlvbk5hbWUgPSBub3RhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIHRleHQgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZW50aXR5LCB3aGVuIGl0IGlzIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkuIFRoaXMgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKSB7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFhtbFZlcnNpb24oKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eVJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGE4MDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0vKioKLSAqIEVudGl0eVJlZmVyZW5jZSBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5UmVmZXJlbmNlSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgRW50aXR5UmVmZXJlbmNlIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogRW50aXR5UmVmZXJlbmNlSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlSZWZlcmVuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEVudGl0eVJlZmVyZW5jZUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRW50aXR5UmVmZXJlbmNlSW1wbAotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlSZWZlcmVuY2VJbXBsKEVudGl0eVJlZmVyZW5jZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGF0Lm5hbWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVudGl0eVJlZmVyZW5jZUltcGwgY2xvbmVkID0gbmV3IEVudGl0eVJlZmVyZW5jZUltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhM2EwNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiBUaHJvd24gYW4gaW52YWxpZCBjaGFyYWN0ZXIgaXMgc3BlY2lmaWVkIGluIDogWE1MTm9kZSNzZXRTb3VyY2UoU3RyaW5nKQotICovCi1wdWJsaWMgY2xhc3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBjaGFyIGludmFsaWRDaGFyID0gMDsKLQlwcml2YXRlIGludCBvZmZzZXQgPSAtMTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKFN0cmluZyBzLCBjaGFyIGMpIHsKLQkJc3VwZXIocyk7Ci0JCXRoaXMuaW52YWxpZENoYXIgPSBjOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKFN0cmluZyBzLCBjaGFyIGMsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIocyk7Ci0JCXRoaXMuaW52YWxpZENoYXIgPSBjOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRJbnZhbGlkQ2hhcigpIHsKLQkJcmV0dXJuIHRoaXMuaW52YWxpZENoYXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUFRhZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyZGU0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogSlNQVGFnIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFRhZyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0NMT1NFID0gIi0tJT4iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfT1BFTiA9ICI8JS0tIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUNMQVJBVElPTl9UT0tFTiA9ICIhIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfVE9LRU4gPSAiQCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9UT0tFTiA9ICI9IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfREVDTEFSQVRJT04gPSAianNwOmRlY2xhcmF0aW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFID0gImpzcDpkaXJlY3RpdmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OID0gImpzcDpleHByZXNzaW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUk9PVCA9ICJqc3A6cm9vdCI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUID0gImpzcDpzY3JpcHRsZXQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DTE9TRSA9ICIlPiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09QRU4gPSAiPCUiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01vZGVsUGFyc2VyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjdlMTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFBhcnNlckFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpOwotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ29udGFpbihFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpOwotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUltcGxpY2l0RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpOwotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaW5kUm9vdE5hbWUoU3RyaW5nIHRhZ05hbWUpOwotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjUzMTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIE5vZGVDb250YWluZXIgY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVDb250YWluZXIgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIE5vZGUsIE5vZGVMaXN0IHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgY2xhc3MgQ2hpbGROb2Rlc0NhY2hlIGltcGxlbWVudHMgTm9kZUxpc3QgewotCQlwcml2YXRlIE5vZGUgY3VyQ2hpbGQgPSBudWxsOwotCQlwcml2YXRlIGludCBjdXJJbmRleCA9IC0xOwotCQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JCUNoaWxkTm9kZXNDYWNoZSgpIHsKLQkJCWluaXRpYWxpemVDYWNoZSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkvLyBhdG9taWMKLQkJCXJldHVybiB0aGlzLmxlbmd0aDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ2FjaGUoKSB7Ci0JCQkvLyBub3RlIHdlIHVzZSB0aGUgb3V0dGVyIG9iamVjdHMgbG9ja29iamVjdAotCQkJLy8gKHNpbmNlIHdlIGFyZSB1c2luZyB0aGVpciAiY2hpbGRyZW4iLgotCQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQkJZm9yIChOb2RlIGNoaWxkID0gZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCXRoaXMubGVuZ3RoKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJCWlmICh0aGlzLmxlbmd0aCA9PSAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGgpCi0JCQkJCXJldHVybiBudWxsOwotCi0JCQkJaWYgKHRoaXMuY3VySW5kZXggPCAwKSB7IC8vIGZpcnN0IHRpbWUKLQkJCQkJaWYgKGluZGV4ICogMiA+PSB0aGlzLmxlbmd0aCkgeyAvLyBzZWFyY2ggZnJvbSB0aGUgbGFzdAotCQkJCQkJdGhpcy5jdXJJbmRleCA9IHRoaXMubGVuZ3RoIC0gMTsKLQkJCQkJCXRoaXMuY3VyQ2hpbGQgPSBsYXN0Q2hpbGQ7Ci0JCQkJCX0gZWxzZSB7IC8vIHNlYXJjaCBmcm9tIHRoZSBmaXJzdAotCQkJCQkJdGhpcy5jdXJJbmRleCA9IDA7Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gZmlyc3RDaGlsZDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChpbmRleCA9PSB0aGlzLmN1ckluZGV4KQotCQkJCQlyZXR1cm4gdGhpcy5jdXJDaGlsZDsKLQotCQkJCWlmIChpbmRleCA+IHRoaXMuY3VySW5kZXgpIHsKLQkJCQkJd2hpbGUgKGluZGV4ID4gdGhpcy5jdXJJbmRleCkgewotCQkJCQkJdGhpcy5jdXJJbmRleCsrOwotCQkJCQkJdGhpcy5jdXJDaGlsZCA9IHRoaXMuY3VyQ2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7IC8vIGluZGV4IDwgdGhpcy5jdXJJbmRleAotCQkJCQl3aGlsZSAoaW5kZXggPCB0aGlzLmN1ckluZGV4KSB7Ci0JCQkJCQl0aGlzLmN1ckluZGV4LS07Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gdGhpcy5jdXJDaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiB0aGlzLmN1ckNoaWxkOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBOb2RlTGlzdCBjaGlsZE5vZGVzQ2FjaGUgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZDaGlsZEVkaXRhYmxlID0gdHJ1ZTsKLQlOb2RlSW1wbCBmaXJzdENoaWxkID0gbnVsbDsKLQlOb2RlSW1wbCBsYXN0Q2hpbGQgPSBudWxsOwotCi0JT2JqZWN0IGxvY2tPYmplY3QgPSBuZXcgYnl0ZVswXTsKLQotCS8qKgotCSAqIE5vZGVDb250YWluZXIgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlQ29udGFpbmVyIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vZGVDb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lcihOb2RlQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNsb25lQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUNoaWxkTm9kZXMoTm9kZSBuZXdQYXJlbnQsIGJvb2xlYW4gZGVlcCkgewotCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50ID09IHRoaXMpCi0JCQlyZXR1cm47Ci0JCWlmICghKG5ld1BhcmVudCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpKQotCQkJcmV0dXJuOwotCi0JCU5vZGVDb250YWluZXIgY29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIG5ld1BhcmVudDsKLQkJY29udGFpbmVyLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJTm9kZSBjbG9uZWQgPSBjaGlsZC5jbG9uZU5vZGUoZGVlcCk7Ci0JCQlpZiAoY2xvbmVkICE9IG51bGwpCi0JCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5maXJzdENoaWxkOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmxhc3RDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaWYgKHRoaXMuZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJaWYgKHRoaXMuY2hpbGROb2Rlc0NhY2hlID09IG51bGwpCi0JCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBuZXcgQ2hpbGROb2Rlc0NhY2hlKCk7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZE5vZGVzQ2FjaGUuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQl9Ci0KLQkJZm9yIChOb2RlSW1wbCBjaGlsZCA9IGZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gY2hpbGQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogaGFzQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gKHRoaXMuZmlyc3RDaGlsZCAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRCZWZvcmUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZkNoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0JCWlmIChyZWZDaGlsZCAhPSBudWxsICYmIHJlZkNoaWxkLmdldFBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAobmV3Q2hpbGQgPT0gcmVmQ2hpbGQpCi0JCQlyZXR1cm4gbmV3Q2hpbGQ7IC8vIG5vdGhpbmcgdG8gZG8KLQotCQlpZiAobmV3Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7Ci0JCQkvLyBpbnNlcnQgY2hpbGQgbm9kZXMgaW5zdGVhZAotCQkJZm9yIChOb2RlIGNoaWxkID0gbmV3Q2hpbGQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IG5ld0NoaWxkLmdldEZpcnN0Q2hpbGQoKSkgewotCQkJCW5ld0NoaWxkLnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlpbnNlcnRCZWZvcmUoY2hpbGQsIHJlZkNoaWxkKTsKLQkJCX0KLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJfQotCQkvLyBzeW5jaHJvbml6ZWQgaW4gY2FzZSBhbm90aGVyIHRocmVhZCBpcyBnZXR0aW5nIGl0ZW0sIG9yIGxlbmd0aAotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCXRoaXMuY2hpbGROb2Rlc0NhY2hlID0gbnVsbDsgLy8gaW52YWxpZGF0ZSBjaGlsZCBub2RlcyBjYWNoZQotCQl9Ci0KLQkJTm9kZUltcGwgY2hpbGQgPSAoTm9kZUltcGwpIG5ld0NoaWxkOwotCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSByZWZDaGlsZDsKLQkJTm9kZUltcGwgcHJldiA9IG51bGw7Ci0JCU5vZGUgb2xkUGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAob2xkUGFyZW50ICE9IG51bGwpCi0JCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQlpZiAobmV4dCA9PSBudWxsKSB7Ci0JCQlwcmV2ID0gdGhpcy5sYXN0Q2hpbGQ7Ci0JCQl0aGlzLmxhc3RDaGlsZCA9IGNoaWxkOwotCQl9IGVsc2UgewotCQkJcHJldiA9IChOb2RlSW1wbCkgbmV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKGNoaWxkKTsKLQkJfQotCQlpZiAocHJldiA9PSBudWxsKQotCQkJdGhpcy5maXJzdENoaWxkID0gY2hpbGQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotCQljaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0JCWNoaWxkLnNldE5leHRTaWJsaW5nKG5leHQpOwotCQljaGlsZC5zZXRQYXJlbnROb2RlKHRoaXMpOwotCQkvLyBtYWtlIHN1cmUgaGF2aW5nIHRoZSBzYW1lIG93bmVyIGRvY3VtZW50Ci0JCWlmIChjaGlsZC5nZXRPd25lckRvY3VtZW50KCkgPT0gbnVsbCkgewotCQkJaWYgKGdldE5vZGVUeXBlKCkgPT0gRE9DVU1FTlRfTk9ERSkgewotCQkJCWNoaWxkLnNldE93bmVyRG9jdW1lbnQoKERvY3VtZW50KSB0aGlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuc2V0T3duZXJEb2N1bWVudChnZXRPd25lckRvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0KLQkJbm90aWZ5Q2hpbGRSZXBsYWNlZChjaGlsZCwgbnVsbCk7Ci0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFZGl0YWJsZSgpIHsKLQkJaWYgKCFmQ2hpbGRFZGl0YWJsZSkgewotCQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmlzUmVwYXJzaW5nKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNoaWxkRWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAodGhpcy5maXJzdENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAodGhpcy5jaGlsZE5vZGVzQ2FjaGUgPT0gbnVsbCkKLQkJCQl0aGlzLmNoaWxkTm9kZXNDYWNoZSA9IG5ldyBDaGlsZE5vZGVzQ2FjaGUoKTsKLQkJCXJldHVybiB0aGlzLmNoaWxkTm9kZXNDYWNoZS5pdGVtKGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIG5vdGlmeUNoaWxkUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hpbGRSZXBsYWNlZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN5bmNDaGlsZEVkaXRhYmxlU3RhdGUobmV3Q2hpbGQpOwotCi0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5jaGlsZFJlcGxhY2VkKHRoaXMsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvbGRDaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gdGhpcykgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCS8vIHN5bmNocm9uaXplZCBpbiBjYXNlIGFub3RoZXIgdGhyZWFkIGlzIGdldHRpbmcgaXRlbSwgb3IgbGVuZ3RoCi0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBudWxsOyAvLyBpbnZhbGlkYXRlIGNoaWxkIG5vZGVzIGNhY2hlCi0JCX0KLQotCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgb2xkQ2hpbGQ7Ci0JCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCWNoaWxkLnNldEVkaXRhYmxlKHRydWUsIHRydWUpOyAvLyBjbGVhciBSZWFkT25seSBmbGFncwotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZpcnN0Q2hpbGQgPSBuZXh0OwotCQllbHNlCi0JCQlwcmV2LnNldE5leHRTaWJsaW5nKG5leHQpOwotCQlpZiAobmV4dCA9PSBudWxsKQotCQkJdGhpcy5sYXN0Q2hpbGQgPSBwcmV2OwotCQllbHNlCi0JCQluZXh0LnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZShudWxsKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKG51bGwsIGNoaWxkKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGROb2RlcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBuZXh0Q2hpbGQpIHsKLQkJCW5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlyZW1vdmVDaGlsZChjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqIEBwYXJhbSBmaXJzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGxhc3RDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IHJlbW92ZUNoaWxkTm9kZXMoTm9kZSBmaXJzdENoaWxkLCBOb2RlIGxhc3RDaGlsZCkgewotCQlpZiAoIWhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChnZXROb2RlVHlwZSgpID09IERPQ1VNRU5UX05PREUpCi0JCQlkb2N1bWVudCA9IChEb2N1bWVudCkgdGhpczsKLQkJZWxzZQotCQkJZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50RnJhZ21lbnQgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0JCWlmIChmcmFnbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCWZpcnN0Q2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChsYXN0Q2hpbGQgPT0gbnVsbCkKLQkJCWxhc3RDaGlsZCA9IGdldExhc3RDaGlsZCgpOwotCQlOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gbmV4dENoaWxkKSB7Ci0JCQluZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJcmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJaWYgKGNoaWxkID09IGxhc3RDaGlsZCkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBmcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpCi0JCQlpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG9sZENoaWxkKTsKLQkJcmV0dXJuIHJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaWYgKGZDaGlsZEVkaXRhYmxlID09IGVkaXRhYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCU5vZGUgbm9kZTsKLQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQlmb3IgKG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJvYy51bmxvY2tOb2RlKChJRE9NTm9kZSkgbm9kZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJvYy5sb2NrTm9kZSgoSURPTU5vZGUpIG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJZkNoaWxkRWRpdGFibGUgPSBlZGl0YWJsZTsKLQkJbm90aWZ5RWRpdGFibGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0NoaWxkRWRpdGFibGVTdGF0ZShOb2RlIGNoaWxkKSB7Ci0JCVJlYWRPbmx5Q29udHJvbGxlciByb2MgPSBSZWFkT25seUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGZDaGlsZEVkaXRhYmxlKSB7Ci0JCQlyb2MudW5sb2NrTm9kZSgoTm9kZUltcGwpIGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCXJvYy5sb2NrTm9kZSgoTm9kZUltcGwpIGNoaWxkKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxOWNmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3ROb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotLyoqCi0gKiBOb2RlSW1wbCBjbGFzcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUltcGwgZXh0ZW5kcyBBYnN0cmFjdE5vdGlmaWVyIGltcGxlbWVudHMgTm9kZSwgSURPTU5vZGUgewotCS8vIGRlZmluZSBvbmUgZW1wdHkgbm9kZWxpc3QsIGZvciByZXBlYXRlZCB1c2UKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBOb2RlTGlzdCBFTVBUWV9OT0RFX0xJU1QgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkRhdGFFZGl0YWJsZSA9IHRydWU7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIG5leHRTaWJsaW5nID0gbnVsbDsKLQotCXByaXZhdGUgRG9jdW1lbnRJbXBsIG93bmVyRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgcGFyZW50Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlSW1wbCBwcmV2aW91c1NpYmxpbmcgPSBudWxsOwotCQotCXByaXZhdGUgSGFzaHRhYmxlIHVzZXJEYXRhVGFibGU9bnVsbDsKLQotCS8qKgotCSAqIE5vZGVJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vZGVJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vZGVJbXBsCi0JICovCi0JcHJvdGVjdGVkIE5vZGVJbXBsKE5vZGVJbXBsIHRoYXQpIHsKLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5vd25lckRvY3VtZW50ID0gdGhhdC5vd25lckRvY3VtZW50OwotCQl9Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb250YWlucyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAob2Zmc2V0ID49IGdldFN0YXJ0T2Zmc2V0KCkgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVET01FeGNlcHRpb25NZXNzYWdlKHNob3J0IHMsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBUT0RPOiBTaG91bGQgbG9jYWxpemUgdGhlc2UgbWVzc2FnZXMsIGFuZCBwcm92aWRlIC91IGVzY2FwZWQKLQkJLy8gdmVyc2lvbiBvZiB0YWdOYW1lCi0JCXJlc3VsdCA9IGxvb2t1cE1lc3NhZ2UocykgKyAiICIgKyB0YWdOYW1lOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGFyVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZG9jdW1lbnQuZ2V0Q2hhclZhbHVlKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldENoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQkvLyBBcyBwZXIgRE9NIHNwZWMsIGNvcnJlY3QgYmVoYXZpb3IgZm9yIGdldENoaWxkTm9kZXMgaXMgdG8gcmV0dXJuIGEKLQkJLy8gemVybyBsZW5ndGggTm9kZUxpc3QsIG5vdCBudWxsLCB3aGVuIHRoZXJlIGFyZSBubyBjaGlsZHJlbi4KLQkJLy8gV2UnbGwgdXNlIGEgY29tbW9uIGluc3RhbmNlIG9mIGFuIGVtcHR5IG5vZGUgbGlzdCwganVzdCB0byBwcmV2ZW50Ci0JCS8vIGNyZWF0aW5nIGEgdHJpdmFsIG9iamVjdCBtYW55IG1hbnkgdGltZXMuCi0KLQkJcmV0dXJuIEVNUFRZX05PREVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb21tb25BbmNlc3RvciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbW1vbkFuY2VzdG9yKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIG5hID0gbm9kZTsgbmEgIT0gbnVsbDsgbmEgPSBuYS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWZvciAoTm9kZSB0YSA9IHRoaXM7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKQotCQkJCQlyZXR1cm4gdGE7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICogZ2V0Q29udGFpbmVyRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRDb250YWluZXJEb2N1bWVudCgpIHsKLQkJZm9yIChOb2RlIG5vZGUgPSB0aGlzOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlyZXR1cm4gKERvY3VtZW50KSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEVuZE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlOb2RlIG5vZGUgPSB0aGlzOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJfQotCi0JCQlOb2RlIGxhc3QgPSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaWYgKGxhc3QgIT0gbnVsbCkgeyAvLyBkaWcgaW50byB0aGUgbGFzdAotCQkJCW5vZGUgPSBsYXN0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQkJcmV0dXJuIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0KLQkJCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7IC8vIG1vdmUgdG8gdGhlIHByZXZpb3VzCi0JCQkJbm9kZSA9IHByZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlub2RlID0gbnVsbDsKLQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJCX0KLQkJCQlOb2RlIHBhcmVudFByZXYgPSBwYXJlbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJaWYgKHBhcmVudFByZXYgIT0gbnVsbCkgeyAvLyBtb3ZlIHRvIHRoZSBwcmV2aW91cwotCQkJCQlub2RlID0gcGFyZW50UHJldjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUZhY3RvcnlSZWdpc3RyeSByZWcgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0Q2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOyAvLyBlcnJvcgotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCA9PSB0aGlzKQotCQkJCXJldHVybiBpbmRleDsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJcmV0dXJuIC0xOyAvLyBlcnJvcgotCX0KLQotCS8qKgotCSAqIGdldExhc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYW4ganVzdCByZWZlciB0byB0aGUgb3duaW5nIGRvY3VtZW50Ci0JICovCi0JcHVibGljIElET01Nb2RlbCBnZXRNb2RlbCgpIHsKLQkJaWYgKHRoaXMub3duZXJEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBhbGwgYnV0IGF0dHIgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5leHRTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5uZXh0U2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlQXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JTm9kZSBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBwYXJlbnQgPSB0aGlzOwotCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldEVuZE9mZnNldCgpIDw9IG9mZnNldCkgewotCQkJCWNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJfQotCi0JCQkvLyBkaWcgbW9yZQotCQkJcGFyZW50ID0gY2hpbGQ7Ci0JCQljaGlsZCA9IChJRE9NTm9kZSkgcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE93bmVyRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIGdldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJldmlvdXNTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMucHJldmlvdXNTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGUuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0T2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIGdldFByZXZpb3VzU2libGluZygpOwotCQlpZiAocHJldiAhPSBudWxsKQotCQkJcmV0dXJuIHByZXYuZ2V0RW5kT2Zmc2V0KCk7Ci0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChlbGVtZW50Lmhhc1N0YXJ0VGFnKCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCXJldHVybiBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJLy8gZmluYWwgZmFsbGJhY2sgdG8gbG9vayBpbnRvIGZpcnN0IGNoaWxkCi0JCU5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNoaWxkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoY2hpbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQlyZXR1cm4gY2hpbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCX0KLQotCS8qKgotCSAqIEV2ZXJ5IG5vZGUgKGluZGlyZWN0bHkpIGtub3dzIGl0cyBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBnZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5mbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBhbGwgYnV0IGF0dHIgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0VmFsdWVSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoKSB7Ci0JCXJldHVybiBnZXROb2RlVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaGFzQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaGFzUHJvcGVydGllcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0QmVmb3JlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXcgU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBpc0NvbnRhaW5lciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGF0YUVkaXRhYmxlKCkgewotCQlpZiAoIWZEYXRhRWRpdGFibGUpIHsKLQkJCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5pc1JlcGFyc2luZygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZEYXRhRWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWlmICh0aGlzLm93bmVyRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9IHRoaXMub3duZXJEb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQlpZiAoaW1wbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaW1wbC5oYXNGZWF0dXJlKGZlYXR1cmUsIHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxvb2t1cE1lc3NhZ2Uoc2hvcnQgcykgewotCQkvLyBUT0RPOiBtYWtlIGxvY2FsaXplZCB2ZXJzaW9uCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlzd2l0Y2ggKHMpIHsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiA6Ci0JCQkJcmVzdWx0ID0gIklOVkFMSURfQ0hBUkFDVEVSX0VSUiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJcmVzdWx0ID0gbmV3IFN0cmluZygpOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogbm9ybWFsaXplIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLQkJVGV4dEltcGwgcHJldlRleHQgPSBudWxsOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBURVhUX05PREUgOiB7Ci0JCQkJCWlmIChwcmV2VGV4dCA9PSBudWxsKSB7Ci0JCQkJCQlwcmV2VGV4dCA9IChUZXh0SW1wbCkgY2hpbGQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgY2hpbGQ7Ci0JCQkJCXJlbW92ZUNoaWxkKHRleHQpOwotCQkJCQlwcmV2VGV4dC5hcHBlbmRUZXh0KHRleHQpOwotCQkJCQljaGlsZCA9IHByZXZUZXh0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBFTEVNRU5UX05PREUgOiB7Ci0JCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQkJZWxlbWVudC5ub3JtYWxpemUoKTsKLQkJCQkJcHJldlRleHQgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXByZXZUZXh0ID0gbnVsbDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlFZGl0YWJsZUNoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuZWRpdGFibGVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlWYWx1ZUNoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN5bmNEYXRhRWRpdGFibGVTdGF0ZSgpOwotCi0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC52YWx1ZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGROb2RlcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCX0KLQotCS8qKgotCSAqIHJlbW92ZUNoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50Ci0JICogQHBhcmFtIGZpcnN0Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbGFzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgcmVtb3ZlQ2hpbGROb2RlcyhOb2RlIGZpcnN0Q2hpbGQsIE5vZGUgbGFzdENoaWxkKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgY2hpbGRyZW4gdmFsdWVzIGZyb20gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4KLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJZm9yIChOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJY2hpbGQucmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCX0KLQkJdGhpcy5mbGF0Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCS8vIG5vcAotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWlmIChmRGF0YUVkaXRhYmxlID09IGVkaXRhYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChlZGl0YWJsZSkgewotCQkJcm9jLnVubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyb2MubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQotCQlmRGF0YUVkaXRhYmxlID0gZWRpdGFibGU7Ci0KLQkJbm90aWZ5RWRpdGFibGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChkZWVwKSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZS5zZXRFZGl0YWJsZShlZGl0YWJsZSwgZGVlcCk7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0JCXNldENoaWxkRWRpdGFibGUoZWRpdGFibGUpOwotCQlzZXREYXRhRWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIHNldE5leHRTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXh0U2libGluZwotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5leHRTaWJsaW5nKE5vZGUgbmV4dFNpYmxpbmcpIHsKLQkJdGhpcy5uZXh0U2libGluZyA9IChOb2RlSW1wbCkgbmV4dFNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogc2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogc2V0T3duZXJEb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJEb2N1bWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJdGhpcy5vd25lckRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgb3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQsIGJvb2xlYW4gZGVlcCkgewotCQl0aGlzLm93bmVyRG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBvd25lckRvY3VtZW50OwotCi0JCWlmIChkZWVwKSB7Ci0JCQlmb3IgKE5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJY2hpbGQuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50LCBkZWVwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHNldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQYXJlbnROb2RlKE5vZGUgcGFyZW50Tm9kZSkgewotCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHBhcmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIHNldFByZXZpb3VzU2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHJldmlvdXNTaWJsaW5nCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJldmlvdXNTaWJsaW5nKE5vZGUgcHJldmlvdXNTaWJsaW5nKSB7Ci0JCXRoaXMucHJldmlvdXNTaWJsaW5nID0gKE5vZGVJbXBsKSBwcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJdGhpcy5mbGF0Tm9kZSA9IGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJc2V0Tm9kZVZhbHVlKHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0RhdGFFZGl0YWJsZVN0YXRlKCkgewotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChmRGF0YUVkaXRhYmxlKSB7Ci0JCQlyb2MudW5sb2NrRGF0YSh0aGlzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJvYy5sb2NrRGF0YSh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBzdGFydCA9IGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmIChzdGFydCA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAoZW5kID49IDApIHsKLQkJCQlyZXN1bHQgPSBlbmQgLSBzdGFydDsKLQkJCQlpZiAocmVzdWx0IDwgLTEpIHsKLQkJCQkJcmVzdWx0ID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZykgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dENvbnRlbnQoU3RyaW5nIHRleHRDb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgVHlwZUluZm8gZ2V0U2NoZW1hVHlwZUluZm8oKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZCgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgb2JqZWN0IGZvciBhIG5vZGUgYXNzb2NpYXRlZCB0byBhIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IFRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QuCi0JICogQHJldHVybiBvYmplY3QgVGhlIG9iamVjdCBmb3IgdGhpcyBub2RlLCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBwYXNzZWQKLQkgKiBvciBudWxsIGlmIHRoZXJlIHdhcyBub25lIHNldC4KLQkgKgotCSAqIEBzaW5jZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewotCQkKLQkJaWYgKGtleT09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAodXNlckRhdGFUYWJsZSE9bnVsbCkgewotCQkJVXNlckRhdGFBbmRIYW5kbGVyIHVzZXJEYXRhQW5kSGFuZGxlciA9IChVc2VyRGF0YUFuZEhhbmRsZXIpIHVzZXJEYXRhVGFibGUuZ2V0KGtleSk7Ci0JCQlpZiAodXNlckRhdGFBbmRIYW5kbGVyIT1udWxsKSB7Ci0JCQkJcmV0dXJuIHVzZXJEYXRhQW5kSGFuZGxlci5nZXREYXRhKCk7Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBkYXRhIGFuZCBoYW5kbGVyIGZvciBhIGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdC4KLQkgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgZm9yIHRoaXMgbm9kZSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgcGFzc2VkLgotCSAqIE51bGwgcGFzc2VkIHJlbW92ZXMgdGhlIGV4aXN0aW5nIGFzc29jaWF0aW9uIHRvIHRoZSBrZXkuCi0JICogQHBhcmFtIGhhbmRsZXIgVXNlckRhdGFIYW5kbGVyIGZvciB0aGUgdXNlcmRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5Ci0JICogQHJldHVybiBPYmplY3QgVGhlIHByZXZpb3VzIHVzZXJkYXRhIG9iamVjdCBpZiBzZXQsIG51bGwgaWYgaXQgd2FzIG5vbmUuICAKLQkgKiAKLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotCi0JCVVzZXJEYXRhQW5kSGFuZGxlciBwcmV2aW91c0RhdGFBbmRIYW5kbGVyPW51bGw7Ci0JCQotCQkvL3JldHVybiBpbW1lZGlhdGVseSBmb3IgbnVsbCBrZXlzCi0JCWlmIChrZXkgPT1udWxsKSByZXR1cm4gbnVsbDsKLQkJCi0JCS8vcmVtb3ZlIGFzc29jaWF0aW9uIGZvciB0aGUga2V5IGlmIGRhdGEgaXMgbnVsbAotCQlpZiAoZGF0YT09bnVsbCkgewotCQkJaWYgKHVzZXJEYXRhVGFibGU9PW51bGwpIHJldHVybiBudWxsOwotCQkJCi0JCQkvL3NlZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHZhbHVlIHNldAotCQkJcHJldmlvdXNEYXRhQW5kSGFuZGxlciA9IChVc2VyRGF0YUFuZEhhbmRsZXIpIHVzZXJEYXRhVGFibGUuZ2V0KGtleSk7Ci0JCQlpZiAocHJldmlvdXNEYXRhQW5kSGFuZGxlciE9bnVsbCkgewotCQkJCXVzZXJEYXRhVGFibGUucmVtb3ZlKGtleSk7Ci0JCQkJcmV0dXJuIHByZXZpb3VzRGF0YUFuZEhhbmRsZXIuZ2V0RGF0YSgpOwotCQkJfQotCQkJLy90aGVyZSBpcyBubyBwcmV2aW91cyB2YWx1ZSBmb3VuZAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vaWYgZGF0YSBwYXNzZWQgaXMgbm90IG51bGwKLQkJLy90aGUgZmlyc3QgZGF0YSBpbiB0aGUgaGFzaHRhYmxlCi0JCWlmICh1c2VyRGF0YVRhYmxlPT1udWxsKSB7Ci0JCQl1c2VyRGF0YVRhYmxlPW5ldyBIYXNodGFibGUoKTsKLQkJCVVzZXJEYXRhQW5kSGFuZGxlciB1c2VyRGF0YUFuZEhhbmRsZXI9bmV3IFVzZXJEYXRhQW5kSGFuZGxlcihkYXRhLGhhbmRsZXIpOwotCQkJdXNlckRhdGFUYWJsZS5wdXQoa2V5LHVzZXJEYXRhQW5kSGFuZGxlcik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJCS8vdGhlcmUgaXMgYWxyZWFkeSBkYXRhIGluIHRoZSBoYXNodGFibGUKLQkJfSBlbHNlIHsKLQkJCVVzZXJEYXRhQW5kSGFuZGxlciB1c2VyRGF0YUFuZEhhbmRsZXI9bmV3IFVzZXJEYXRhQW5kSGFuZGxlcihkYXRhLGhhbmRsZXIpOwotCQkJcHJldmlvdXNEYXRhQW5kSGFuZGxlcj0oVXNlckRhdGFBbmRIYW5kbGVyKSB1c2VyRGF0YVRhYmxlLnB1dChrZXksdXNlckRhdGFBbmRIYW5kbGVyKTsKLQkJCQotCQkJLy9pZiB3ZSByZXBsYWNlIGEgdmFsdWUKLQkJCWlmIChwcmV2aW91c0RhdGFBbmRIYW5kbGVyIT1udWxsKQotCQkJCXJldHVybiBwcmV2aW91c0RhdGFBbmRIYW5kbGVyLmdldERhdGEoKTsKLQkJCWVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBVc2VyRGF0YUhhbmRsZXJzIG9mIHRoZSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlVc2VyRGF0YUhhbmRsZXJzKHNob3J0IG9wZXJhdGlvbiwgTm9kZSBkZXN0aW5hdGlvbikgewotCQkKLQkJaWYgKG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfQURPUFRFRCAKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVECi0JCQkJJiBvcGVyYXRpb24hPVVzZXJEYXRhSGFuZGxlci5OT0RFX0RFTEVURUQKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfSU1QT1JURUQKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfUkVOQU1FRCkKLQkJCXJldHVybjsgCi0JCQkKLQkJaWYgKHVzZXJEYXRhVGFibGUhPW51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGtleXM9dXNlckRhdGFUYWJsZS5rZXlzKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBrZXk9KFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOyAvL3Nob3VsZCBhbHdheXMgYmUgYSBzdHJpbmcKLQkJCQlVc2VyRGF0YUFuZEhhbmRsZXIgZGF0YUFuZEhhbmRsZXIgPSAoVXNlckRhdGFBbmRIYW5kbGVyKSB1c2VyRGF0YVRhYmxlLmdldChrZXkpOwotCQkJCWlmIChkYXRhQW5kSGFuZGxlciE9bnVsbCkgewotCQkJCQlVc2VyRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXI9ZGF0YUFuZEhhbmRsZXIuZ2V0SGFuZGxlcigpOwotCQkJCQlpZiAoZGF0YUhhbmRsZXIhPW51bGwpIHsKLQkJCQkJCWRhdGFIYW5kbGVyLmhhbmRsZShvcGVyYXRpb24sIGtleSwgZGF0YUFuZEhhbmRsZXIuZ2V0RGF0YSgpLCB0aGlzLCBkZXN0aW5hdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQ2xhc3MgZm9yIHVzZXIgZGF0YSBhbmQgVXNlckRhdGFIYW5kbGVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFVzZXJEYXRhQW5kSGFuZGxlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQkJLyoqCi0JCSAqIEdlbmVyYXRlZCBTZXJpYWwgSUQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ4NjA1MjEyMzczMTU0NDQ4NDBMOwotCQkvKioKLQkJICogR2VuZXJhdGVkIHNlcmlhbGl6YXRpb24gdmVyc2lvbgotCQkgKi8KLQkJCi0JCXByaXZhdGUgT2JqZWN0IGRhdGE7Ci0JCXByaXZhdGUgVXNlckRhdGFIYW5kbGVyIGhhbmRsZXI7Ci0JCQotCQlwdWJsaWMgVXNlckRhdGFBbmRIYW5kbGVyKE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikKLQkJewotCQkJdGhpcy5kYXRhPWRhdGE7Ci0JCQl0aGlzLmhhbmRsZXI9aGFuZGxlcjsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0RGF0YSgpIHsKLQkJCXJldHVybiBkYXRhOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RGF0YShPYmplY3QgZGF0YSkgewotCQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJfQotCi0JCXB1YmxpYyBVc2VyRGF0YUhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLQkJCXJldHVybiBoYW5kbGVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SGFuZGxlcihVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotCQkJdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUl0ZXJhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTI3OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotLyoqCi0gKiBOb2RlSXRlcmF0b3JJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlSXRlcmF0b3JJbXBsIGltcGxlbWVudHMgTm9kZUl0ZXJhdG9yIHsKLQlwcml2YXRlIE5vZGVGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQlwcml2YXRlIE5vZGUgbmV4dE5vZGUgPSBudWxsOwotCi0JcHJpdmF0ZSBOb2RlIHJvb3ROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCB3aGF0VG9TaG93ID0gTm9kZUZpbHRlci5TSE9XX0FMTDsKLQotCS8qKgotCSAqIE5vZGVJdGVyYXRvckltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcm9vdE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlSXRlcmF0b3JJbXBsKE5vZGUgcm9vdE5vZGUsIGludCB3aGF0VG9TaG93LCBOb2RlRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JCXRoaXMubmV4dE5vZGUgPSByb290Tm9kZTsKLQkJdGhpcy53aGF0VG9TaG93ID0gd2hhdFRvU2hvdzsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFjY2VwdE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmICh0aGlzLndoYXRUb1Nob3cgIT0gTm9kZUZpbHRlci5TSE9XX0FMTCkgewotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCXN3aXRjaCAodGhpcy53aGF0VG9TaG93KSB7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfQVRUUklCVVRFIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX1RFWFQgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0VOVElUWSA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVOVElUWV9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuQ09NTUVOVF9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX1RZUEUgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfTk9UQVRJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5OT1RBVElPTl9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICh0aGlzLmZpbHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHRoaXMuZmlsdGVyLmFjY2VwdE5vZGUobm9kZSkgPT0gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRhY2hlcyB0aGUgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBmcm9tIHRoZSBzZXQgd2hpY2ggaXQgaXRlcmF0ZWQKLQkgKiBvdmVyLCByZWxlYXNpbmcgYW55IGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIGFuZCBwbGFjaW5nIHRoZSBpdGVyYXRvciBpbgotCSAqIHRoZSBJTlZBTElEIHN0YXRlLiBBZnRlciA8Y29kZT5kZXRhY2g8L2NvZGU+IGhhcyBiZWVuIGludm9rZWQsIGNhbGxzCi0JICogdG8gPGNvZGU+bmV4dE5vZGU8L2NvZGU+IG9yIDxjb2RlPnByZXZpb3VzTm9kZTwvY29kZT4gd2lsbCByYWlzZQotCSAqIHRoZSBleGNlcHRpb24gSU5WQUxJRF9TVEFURV9FUlIuCi0JICovCi0JcHVibGljIHZvaWQgZGV0YWNoKCkgewotCQl0aGlzLnJvb3ROb2RlID0gbnVsbDsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgZW50aXR5Ci0JICogcmVmZXJlbmNlIG5vZGVzIGFyZSB2aXNpYmxlIHRvIHRoZSBpdGVyYXRvci4gSWYgZmFsc2UsIHRoZXkgYW5kIHRoZWlyCi0JICogZGVzY2VuZGFudHMgd2lsbCBiZSByZWplY3RlZC4gTm90ZSB0aGF0IHRoaXMgcmVqZWN0aW9uIHRha2VzIHByZWNlZGVuY2UKLQkgKiBvdmVyIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGFuZCB0aGUgZmlsdGVyLiBBbHNvIG5vdGUgdGhhdCB0aGlzIGlzCi0JICogY3VycmVudGx5IHRoZSBvbmx5IHNpdHVhdGlvbiB3aGVyZSA8Y29kZT5Ob2RlSXRlcmF0b3JzPC9jb2RlPiBtYXkKLQkgKiByZWplY3QgYSBjb21wbGV0ZSBzdWJ0cmVlIHJhdGhlciB0aGFuIHNraXBwaW5nIGluZGl2aWR1YWwgbm9kZXMuIDxicj4KLQkgKiA8YnI+Ci0JICogVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2VzIGV4cGFuZGVkCi0JICogYW5kIGRvZXMgbm90IGV4cG9zZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGl0c2VsZiwgdXNlIHRoZQotCSAqIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzIHRvIGhpZGUgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBhbmQKLQkgKiBzZXQgPGNvZGU+ZXhwYW5kRW50aXR5UmVmZXJlbmNlczwvY29kZT4gdG8gdHJ1ZSB3aGVuIGNyZWF0aW5nIHRoZQotCSAqIGl0ZXJhdG9yLiBUbyBwcm9kdWNlIGEgdmlldyBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgZW50aXR5IHJlZmVyZW5jZQotCSAqIG5vZGVzIGJ1dCBubyBlbnRpdHkgZXhwYW5zaW9uLCB1c2UgdGhlIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzCi0JICogdG8gc2hvdyB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZCBzZXQKLQkgKiA8Y29kZT5leHBhbmRFbnRpdHlSZWZlcmVuY2VzPC9jb2RlPiB0byBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gdXNlZCB0byBzY3JlZW4gbm9kZXMuCi0JICovCi0JcHVibGljIE5vZGVGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOb2RlIGdldE5leHROb2RlKCkgewotCQlpZiAodGhpcy5uZXh0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgb2xkTmV4dCA9IHRoaXMubmV4dE5vZGU7Ci0JCU5vZGUgY2hpbGQgPSB0aGlzLm5leHROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCXRoaXMubmV4dE5vZGUgPSBjaGlsZDsKLQkJCXJldHVybiBvbGROZXh0OwotCQl9Ci0JCWZvciAoTm9kZSBub2RlID0gdGhpcy5uZXh0Tm9kZTsgbm9kZSAhPSBudWxsICYmIG5vZGUgIT0gdGhpcy5yb290Tm9kZTsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5uZXh0Tm9kZSA9IG5leHQ7Ci0JCQkJcmV0dXJuIG9sZE5leHQ7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCXJldHVybiBvbGROZXh0OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgTm9kZSBnZXRQcmV2aW91c05vZGUoKSB7Ci0JCWlmICh0aGlzLm5leHROb2RlID09IHRoaXMucm9vdE5vZGUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBwcmV2ID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgPT0gbnVsbCkgewotCQkJcHJldiA9IHRoaXMucm9vdE5vZGU7IC8vIG5ldmVyIG51bGwKLQkJfSBlbHNlIHsKLQkJCXByZXYgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCXRoaXMubmV4dE5vZGUgPSB0aGlzLm5leHROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQkJCX0KLQkJfQotCQlOb2RlIGxhc3QgPSBwcmV2LmdldExhc3RDaGlsZCgpOwotCQl3aGlsZSAobGFzdCAhPSBudWxsKSB7Ci0JCQlwcmV2ID0gbGFzdDsKLQkJCWxhc3QgPSBwcmV2LmdldExhc3RDaGlsZCgpOwotCQl9Ci0JCXRoaXMubmV4dE5vZGUgPSBwcmV2OwotCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBub2RlIG9mIHRoZSA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+LCBhcyBzcGVjaWZpZWQgd2hlbiBpdAotCSAqIHdhcyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBOb2RlIGdldFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGRldGVybWluZXMgd2hpY2ggbm9kZSB0eXBlcyBhcmUgcHJlc2VudGVkIHZpYSB0aGUKLQkgKiBpdGVyYXRvci4gVGhlIGF2YWlsYWJsZSBzZXQgb2YgY29uc3RhbnRzIGlzIGRlZmluZWQgaW4gdGhlCi0JICogPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gaW50ZXJmYWNlLiBOb2RlcyBub3QgYWNjZXB0ZWQgYnkKLQkgKiA8Y29kZT53aGF0VG9TaG93PC9jb2RlPiB3aWxsIGJlIHNraXBwZWQsIGJ1dCB0aGVpciBjaGlsZHJlbiBtYXkgc3RpbGwKLQkgKiBiZSBjb25zaWRlcmVkLiBOb3RlIHRoYXQgdGhpcyBza2lwIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZmlsdGVyLCBpZgotCSAqIGFueS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFdoYXRUb1Nob3coKSB7Ci0JCXJldHVybiB0aGlzLndoYXRUb1Nob3c7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV4dCBub2RlIGluIHRoZSBzZXQgYW5kIGFkdmFuY2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUKLQkgKiBpdGVyYXRvciBpbiB0aGUgc2V0LiBBZnRlciBhIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gaXMgY3JlYXRlZCwKLQkgKiB0aGUgZmlyc3QgY2FsbCB0byA8Y29kZT5uZXh0Tm9kZSgpPC9jb2RlPiByZXR1cm5zIHRoZSBmaXJzdCBub2RlIGluCi0JICogdGhlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXh0IDxjb2RlPk5vZGU8L2NvZGU+IGluIHRoZSBzZXQgYmVpbmcgaXRlcmF0ZWQgb3Zlciwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlmb3IgKE5vZGUgbm9kZSA9IGdldE5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGdldE5leHROb2RlKCkpIHsKLQkJCWlmIChhY2NlcHROb2RlKG5vZGUpKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIHNldCBhbmQgbW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotCSAqIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gYmFja3dhcmRzIGluIHRoZSBzZXQuCi0JICogCi0JICogQHJldHVybiBUaGUgcHJldmlvdXMgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZAotCSAqICAgICAgICAgb3Zlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbgotCSAqICAgICAgICAgdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBwcmV2aW91c05vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZm9yIChOb2RlIG5vZGUgPSBnZXRQcmV2aW91c05vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gZ2V0UHJldmlvdXNOb2RlKCkpIHsKLQkJCWlmIChhY2NlcHROb2RlKG5vZGUpKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGJlMWJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogTm9kZUxpc3RJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0KLQlPYmplY3QgbG9ja09iamVjdCA9IG5ldyBieXRlWzBdOwotCi0JcHJpdmF0ZSBMaXN0IG5vZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIE5vZGVMaXN0SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBOb2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCBOb2RlIGFwcGVuZE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXRoaXMubm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMubm9kZXMuYWRkKG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJcmV0dXJuIHRoaXMubm9kZXMuc2l6ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgaW5zZXJ0Tm9kZShOb2RlIG5vZGUsIGludCBpbmRleCkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpIHsKLQkJCXJldHVybiBhcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0JCXRoaXMubm9kZXMuYWRkKGluZGV4LCBub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChOb2RlKSB0aGlzLm5vZGVzLmdldChpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJvdGVjdGVkIE5vZGUgcmVtb3ZlTm9kZShpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBub2RlCi0KLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCi0JCQlOb2RlIHJlbW92ZWQgPSAoTm9kZSkgdGhpcy5ub2Rlcy5yZW1vdmUoaW5kZXgpOwotCQkJcmV0dXJuIHJlbW92ZWQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vdGF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob3RhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiYmZlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vdGF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotLyoqCi0gKiBOb3RhdGlvbkltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE5vdGF0aW9uSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgTm90YXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCS8qKgotCSAqIE5vdGF0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBOb3RhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90YXRpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vdGF0aW9uSW1wbAotCSAqLwotCXByb3RlY3RlZCBOb3RhdGlvbkltcGwoTm90YXRpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQkJdGhpcy5wdWJsaWNJZCA9IHRoYXQucHVibGljSWQ7Ci0JCQl0aGlzLnN5c3RlbUlkID0gdGhhdC5zeXN0ZW1JZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJTm90YXRpb25JbXBsIGNsb25lZCA9IG5ldyBOb3RhdGlvbkltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE5PVEFUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQl0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExNDIwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gewotCXByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0ID0gbnVsbDsKLQotCS8qKgotCSAqIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy50YXJnZXQgPSB0aGF0LnRhcmdldDsKLQkJCXRoaXMuZGF0YSA9IHRoYXQuZ2V0RGF0YSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGNsb25lZCA9IG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKLQkJaWYgKHRoaXMuZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZGF0YTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0KLQkJSVRleHRSZWdpb24gdGFyZ2V0UmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb24gZGF0YVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGNsb3NlUmVnaW9uID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikKLQkJCQljb250aW51ZTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB7Ci0JCQkJY2xvc2VSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAodGFyZ2V0UmVnaW9uID09IG51bGwpCi0JCQkJCXRhcmdldFJlZ2lvbiA9IHJlZ2lvbjsKLQkJCQllbHNlIGlmIChkYXRhUmVnaW9uID09IG51bGwpCi0JCQkJCWRhdGFSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCX0KLQkJaWYgKGRhdGFSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCWludCBvZmZzZXQgPSBkYXRhUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWludCBlbmQgPSBmbGF0Tm9kZS5nZXRMZW5ndGgoKTsKLQkJaWYgKGNsb3NlUmVnaW9uICE9IG51bGwpCi0JCQllbmQgPSBjbG9zZVJlZ2lvbi5nZXRTdGFydCgpOwotCQlTdHJpbmcgc291cmNlID0gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQlyZXR1cm4gc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFRhcmdldCgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0RGF0YSgpOwotCX0KLQotCS8qKgotCSAqIGdldFRhcmdldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLQkJaWYgKHRoaXMudGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlyZXR1cm4gdGhpcy50YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJdGhpcy5kYXRhID0gZ2V0RGF0YSgpOwotCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JfQotCi0JLyoqCi0JICogc2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldERhdGEobm9kZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5kYXRhID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUYXJnZXQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldChTdHJpbmcgdGFyZ2V0KSB7Ci0JCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0VGFyZ2V0KCkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RGF0YSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SYW5nZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmFuZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MDMzNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SYW5nZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20ucmFuZ2VzLlJhbmdlOwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5SYW5nZUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFJhbmdlSW1wbCBpbXBsZW1lbnRzIFJhbmdlIHsKLQlwcml2YXRlIE5vZGUgZW5kQ29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIGludCBlbmRPZmZzZXQgPSAwOwotCi0JcHJpdmF0ZSBOb2RlIHN0YXJ0Q29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIGludCBzdGFydE9mZnNldCA9IDA7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgUmFuZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBSYW5nZUltcGwoUmFuZ2VJbXBsIHRoYXQpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gdGhhdC5zdGFydENvbnRhaW5lcjsKLQkJCXRoaXMuc3RhcnRPZmZzZXQgPSB0aGF0LnN0YXJ0T2Zmc2V0OwotCQkJdGhpcy5lbmRDb250YWluZXIgPSB0aGF0LmVuZENvbnRhaW5lcjsKLQkJCXRoaXMuZW5kT2Zmc2V0ID0gdGhhdC5lbmRPZmZzZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEdXBsaWNhdGVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlCi0JICogCi0JICogQHJldHVybiBBIERvY3VtZW50RnJhZ21lbnQgdGhhdCBjb250YWlucyBjb250ZW50IGVxdWl2YWxlbnQgdG8gdGhpcwotCSAqICAgICAgICAgUmFuZ2UuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiBhIERvY3VtZW50VHlwZSBub2RlCi0JICogICAgICAgICAgICAgICAgd291bGQgYmUgZXh0cmFjdGVkIGludG8gdGhlIG5ldyBEb2N1bWVudEZyYWdtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgY2xvbmVDb250ZW50cygpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFByb2R1Y2VzIGEgbmV3IFJhbmdlIHdob3NlIGJvdW5kYXJ5LXBvaW50cyBhcmUgZXF1YWwgdG8gdGhlCi0JICogYm91bmRhcnktcG9pbnRzIG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBkdXBsaWNhdGVkIFJhbmdlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIFJhbmdlIGNsb25lUmFuZ2UoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSYW5nZUltcGwodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQ29sbGFwc2UgYSBSYW5nZSBvbnRvIG9uZSBvZiBpdHMgYm91bmRhcnktcG9pbnRzCi0JICogCi0JICogQHBhcmFtIHRvU3RhcnRJZgotCSAqICAgICAgICAgICAgVFJVRSwgY29sbGFwc2VzIHRoZSBSYW5nZSBvbnRvIGl0cyBzdGFydDsgaWYgRkFMU0UsCi0JICogICAgICAgICAgICBjb2xsYXBzZXMgaXQgb250byBpdHMgZW5kLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgY29sbGFwc2UoYm9vbGVhbiB0b1N0YXJ0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHRvU3RhcnQpIHsKLQkJCXRoaXMuZW5kQ29udGFpbmVyID0gdGhpcy5zdGFydENvbnRhaW5lcjsKLQkJCXRoaXMuZW5kT2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldDsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc3RhcnRDb250YWluZXIgPSB0aGlzLmVuZENvbnRhaW5lcjsKLQkJCXRoaXMuc3RhcnRPZmZzZXQgPSB0aGlzLmVuZE9mZnNldDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXBhcmUgdGhlIGJvdW5kYXJ5LXBvaW50cyBvZiB0d28gUmFuZ2VzIGluIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGhvd0EKLQkgKiAgICAgICAgICAgIGNvZGUgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIGNvbXBhcmlzb24sIGFzIGRlZmluZWQgYWJvdmUuCi0JICogQHBhcmFtIHNvdXJjZVJhbmdlVGhlCi0JICogICAgICAgICAgICA8Y29kZT5SYW5nZTwvY29kZT4gb24gd2hpY2ggdGhpcyBjdXJyZW50Ci0JICogICAgICAgICAgICA8Y29kZT5SYW5nZTwvY29kZT4gaXMgY29tcGFyZWQgdG8uCi0JICogQHJldHVybiAtMSwgMCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nCi0JICogICAgICAgICBib3VuZGFyeS1wb2ludCBvZiB0aGUgUmFuZ2UgaXMgcmVzcGVjdGl2ZWx5IGJlZm9yZSwgZXF1YWwgdG8sCi0JICogICAgICAgICBvciBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBib3VuZGFyeS1wb2ludCBvZgotCSAqICAgICAgICAgPGNvZGU+c291cmNlUmFuZ2U8L2NvZGU+LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgdGhlIHR3byBSYW5nZXMgYXJlIG5vdCBpbgotCSAqICAgICAgICAgICAgICAgIHRoZSBzYW1lIERvY3VtZW50IG9yIERvY3VtZW50RnJhZ21lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgY29tcGFyZUJvdW5kYXJ5UG9pbnRzKHNob3J0IGhvdywgUmFuZ2Ugc291cmNlUmFuZ2UpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoc291cmNlUmFuZ2UgPT0gbnVsbCkKLQkJCXJldHVybiAoc2hvcnQpIDA7IC8vIGVycm9yCi0KLQkJTm9kZSBjb250YWluZXIxID0gbnVsbDsKLQkJaW50IG9mZnNldDEgPSAwOwotCQlOb2RlIGNvbnRhaW5lcjIgPSBudWxsOwotCQlpbnQgb2Zmc2V0MiA9IDA7Ci0KLQkJc3dpdGNoIChob3cpIHsKLQkJCWNhc2UgU1RBUlRfVE9fU1RBUlQgOgotCQkJCWNvbnRhaW5lcjEgPSB0aGlzLnN0YXJ0Q29udGFpbmVyOwotCQkJCW9mZnNldDEgPSB0aGlzLnN0YXJ0T2Zmc2V0OwotCQkJCWNvbnRhaW5lcjIgPSBzb3VyY2VSYW5nZS5nZXRTdGFydENvbnRhaW5lcigpOwotCQkJCW9mZnNldDIgPSBzb3VyY2VSYW5nZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFSVF9UT19FTkQgOgotCQkJCWNvbnRhaW5lcjEgPSB0aGlzLnN0YXJ0Q29udGFpbmVyOwotCQkJCW9mZnNldDEgPSB0aGlzLnN0YXJ0T2Zmc2V0OwotCQkJCWNvbnRhaW5lcjIgPSBzb3VyY2VSYW5nZS5nZXRFbmRDb250YWluZXIoKTsKLQkJCQlvZmZzZXQyID0gc291cmNlUmFuZ2UuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVORF9UT19FTkQgOgotCQkJCWNvbnRhaW5lcjEgPSB0aGlzLmVuZENvbnRhaW5lcjsKLQkJCQlvZmZzZXQxID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldEVuZENvbnRhaW5lcigpOwotCQkJCW9mZnNldDIgPSBzb3VyY2VSYW5nZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5EX1RPX1NUQVJUIDoKLQkJCQljb250YWluZXIxID0gdGhpcy5lbmRDb250YWluZXI7Ci0JCQkJb2Zmc2V0MSA9IHRoaXMuZW5kT2Zmc2V0OwotCQkJCWNvbnRhaW5lcjIgPSBzb3VyY2VSYW5nZS5nZXRTdGFydENvbnRhaW5lcigpOwotCQkJCW9mZnNldDIgPSBzb3VyY2VSYW5nZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIChzaG9ydCkgMDsgLy8gZXJyb3IKLQkJfQotCi0JCXJldHVybiBjb21wYXJlUG9pbnRzKGNvbnRhaW5lcjEsIG9mZnNldDEsIGNvbnRhaW5lcjIsIG9mZnNldDIpOwotCX0KLQotCS8qCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IGNvbXBhcmVQb2ludHMoTm9kZSBjb250YWluZXIxLCBpbnQgb2Zmc2V0MSwgTm9kZSBjb250YWluZXIyLCBpbnQgb2Zmc2V0MikgewotCQlpZiAoY29udGFpbmVyMSA9PSBudWxsIHx8IGNvbnRhaW5lcjIgPT0gbnVsbCkKLQkJCXJldHVybiAoc2hvcnQpIDA7IC8vIGVycm9yCi0KLQkJaWYgKGNvbnRhaW5lcjEgPT0gY29udGFpbmVyMikgewotCQkJaWYgKG9mZnNldDEgPiBvZmZzZXQyKQotCQkJCXJldHVybiAoc2hvcnQpIDE7Ci0JCQlpZiAob2Zmc2V0MSA8IG9mZnNldDIpCi0JCQkJcmV0dXJuIChzaG9ydCkgLTE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8vIGdldCBub2RlIG9mZnNldHMKLQkJSURPTU5vZGUgbm9kZTEgPSBudWxsOwotCQlpZiAoY29udGFpbmVyMS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCU5vZGUgY2hpbGQgPSBjb250YWluZXIxLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0MTsgaSsrKSB7Ci0JCQkJTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQljaGlsZCA9IG5leHQ7Ci0JCQl9Ci0JCQlub2RlMSA9IChJRE9NTm9kZSkgY2hpbGQ7Ci0JCQlvZmZzZXQxID0gMDsKLQkJfSBlbHNlIHsKLQkJCW5vZGUxID0gKElET01Ob2RlKSBjb250YWluZXIxOwotCQl9Ci0JCWludCBub2RlT2Zmc2V0MSA9IG5vZGUxLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUlET01Ob2RlIG5vZGUyID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lcjIuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlOb2RlIGNoaWxkID0gY29udGFpbmVyMi5nZXRGaXJzdENoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldDI7IGkrKykgewotCQkJCU5vZGUgbmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQkJY2hpbGQgPSBuZXh0OwotCQkJfQotCQkJbm9kZTIgPSAoSURPTU5vZGUpIGNoaWxkOwotCQkJb2Zmc2V0MiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlub2RlMiA9IChJRE9NTm9kZSkgY29udGFpbmVyMTsKLQkJfQotCQlpbnQgbm9kZU9mZnNldDIgPSBub2RlMi5nZXRTdGFydE9mZnNldCgpOwotCi0JCWlmIChub2RlT2Zmc2V0MSA+IG5vZGVPZmZzZXQyKQotCQkJcmV0dXJuIChzaG9ydCkgMTsKLQkJaWYgKG5vZGVPZmZzZXQxIDwgbm9kZU9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAtMTsKLQkJaWYgKG9mZnNldDEgPiBvZmZzZXQyKQotCQkJcmV0dXJuIChzaG9ydCkgMTsKLQkJaWYgKG9mZnNldDEgPCBvZmZzZXQyKQotCQkJcmV0dXJuIChzaG9ydCkgLTE7Ci0JCXJldHVybiAoc2hvcnQpIDA7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgY29udGVudHMgb2YgYSBSYW5nZSBmcm9tIHRoZSBjb250YWluaW5nIGRvY3VtZW50IG9yCi0JICogZG9jdW1lbnQgZnJhZ21lbnQgd2l0aG91dCByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlbW92ZWQgY29udGVudC4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFueSBwb3J0aW9uIG9mCi0JICogICAgICAgICAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGlzIHJlYWQtb25seSBvciBhbnkgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgbm9kZXMgdGhhdCBjb250YWluIGFueSBvZiB0aGUgY29udGVudCBvZiB0aGUgUmFuZ2UgYXJlCi0JICogICAgICAgICAgICAgICAgcmVhZC1vbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQ29udGVudHMoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBSYW5nZSBpcyBubyBsb25nZXIgaW4gdXNlIGFuZCB0aGF0IHRoZQotCSAqIGltcGxlbWVudGF0aW9uIG1heSByZWxpbnF1aXNoIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmFuZ2UuCi0JICogU3Vic2VxdWVudCBjYWxscyB0byBhbnkgbWV0aG9kcyBvciBhdHRyaWJ1dGUgZ2V0dGVycyBvbiB0aGlzIFJhbmdlIHdpbGwKLQkgKiByZXN1bHQgaW4gYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGJlaW5nIHRocm93biB3aXRoIGFuIGVycm9yIGNvZGUKLQkgKiBvZiA8Y29kZT5JTlZBTElEX1NUQVRFX0VSUjwvY29kZT4uCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXRhY2goKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhpcy5zdGFydENvbnRhaW5lciA9IG51bGw7Ci0JCXRoaXMuc3RhcnRPZmZzZXQgPSAwOwotCQl0aGlzLmVuZENvbnRhaW5lciA9IG51bGw7Ci0JCXRoaXMuZW5kT2Zmc2V0ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyB0aGUgY29udGVudHMgb2YgYSBSYW5nZSBmcm9tIHRoZSBjb250YWluaW5nIGRvY3VtZW50IG9yIGRvY3VtZW50Ci0JICogZnJhZ21lbnQgdG8gYSBuZXcgRG9jdW1lbnRGcmFnbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgRG9jdW1lbnRGcmFnbWVudCBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgY29udGVudHMuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBhbnkgcG9ydGlvbiBvZgotCSAqICAgICAgICAgICAgICAgIHRoZSBjb250ZW50IG9mIHRoZSBSYW5nZSBpcyByZWFkLW9ubHkgb3IgYW55IG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIG5vZGVzIHdoaWNoIGNvbnRhaW4gYW55IG9mIHRoZSBjb250ZW50IG9mIHRoZSBSYW5nZSBhcmUKLQkgKiAgICAgICAgICAgICAgICByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiBhIERvY3VtZW50VHlwZSBub2RlCi0JICogICAgICAgICAgICAgICAgd291bGQgYmUgZXh0cmFjdGVkIGludG8gdGhlIG5ldyBEb2N1bWVudEZyYWdtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgZXh0cmFjdENvbnRlbnRzKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVFJVRSBpZiB0aGUgUmFuZ2UgaXMgY29sbGFwc2VkCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb2xsYXBzZWQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuc3RhcnRDb250YWluZXIgPT0gdGhpcy5lbmRDb250YWluZXIgJiYgdGhpcy5zdGFydE9mZnNldCA9PSB0aGlzLmVuZE9mZnNldCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZXBlc3QgY29tbW9uIGFuY2VzdG9yIGNvbnRhaW5lciBvZiB0aGUgUmFuZ2UncyB0d28KLQkgKiBib3VuZGFyeS1wb2ludHMuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRDb21tb25BbmNlc3RvckNvbnRhaW5lcigpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5zdGFydENvbnRhaW5lciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKE5vZGVJbXBsKSB0aGlzLnN0YXJ0Q29udGFpbmVyKS5nZXRDb21tb25BbmNlc3Rvcih0aGlzLmVuZENvbnRhaW5lcik7Ci0JfQotCi0JLyoqCi0JICogTm9kZSB3aXRoaW4gd2hpY2ggdGhlIFJhbmdlIGVuZHMKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldEVuZENvbnRhaW5lcigpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5lbmRDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogT2Zmc2V0IHdpdGhpbiB0aGUgZW5kaW5nIG5vZGUgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZW5kT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIE5vZGUgd2l0aGluIHdoaWNoIHRoZSBSYW5nZSBiZWdpbnMKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldFN0YXJ0Q29udGFpbmVyKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLnN0YXJ0Q29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIE9mZnNldCB3aXRoaW4gdGhlIHN0YXJ0aW5nIG5vZGUgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5zdGFydE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnRzIGEgbm9kZSBpbnRvIHRoZSBEb2N1bWVudCBvciBEb2N1bWVudEZyYWdtZW50IGF0IHRoZSBzdGFydCBvZgotCSAqIHRoZSBSYW5nZS4gSWYgdGhlIGNvbnRhaW5lciBpcyBhIFRleHQgbm9kZSwgdGhpcyB3aWxsIGJlIHNwbGl0IGF0IHRoZQotCSAqIHN0YXJ0IG9mIHRoZSBSYW5nZSAoYXMgaWYgdGhlIFRleHQgbm9kZSdzIHNwbGl0VGV4dCBtZXRob2Qgd2FzCi0JICogcGVyZm9ybWVkIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQpIGFuZCB0aGUgaW5zZXJ0aW9uIHdpbGwgb2NjdXIgYmV0d2VlbgotCSAqIHRoZSB0d28gcmVzdWx0aW5nIFRleHQgbm9kZXMuIEFkamFjZW50IFRleHQgbm9kZXMgd2lsbCBub3QgYmUKLQkgKiBhdXRvbWF0aWNhbGx5IG1lcmdlZC4gSWYgdGhlIG5vZGUgdG8gYmUgaW5zZXJ0ZWQgaXMgYSBEb2N1bWVudEZyYWdtZW50Ci0JICogbm9kZSwgdGhlIGNoaWxkcmVuIHdpbGwgYmUgaW5zZXJ0ZWQgcmF0aGVyIHRoYW4gdGhlIERvY3VtZW50RnJhZ21lbnQKLQkgKiBub2RlIGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZVRoZQotCSAqICAgICAgICAgICAgbm9kZSB0byBpbnNlcnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZQotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW4gYW5jZXN0b3IKLQkgKiAgICAgICAgICAgICAgICBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSBpcyByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5uZXdOb2RlPC9jb2RlPiBhbmQKLQkgKiAgICAgICAgICAgICAgICB0aGUgY29udGFpbmVyIG9mIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2Ugd2VyZSBub3QgY3JlYXRlZAotCSAqICAgICAgICAgICAgICAgIGZyb20gdGhlIHNhbWUgZG9jdW1lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgY29udGFpbmVyIG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBSYW5nZSBpcyBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBhbGxvdwotCSAqICAgICAgICAgICAgICAgIGNoaWxkcmVuIG9mIHRoZSB0eXBlIG9mIDxjb2RlPm5ld05vZGU8L2NvZGU+IG9yIGlmCi0JICogICAgICAgICAgICAgICAgPGNvZGU+bmV3Tm9kZTwvY29kZT4gaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGNvbnRhaW5lci4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPm5ld05vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgaXMgYW4gQXR0ciwgRW50aXR5LCBOb3RhdGlvbiwgb3IgRG9jdW1lbnQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2RlKE5vZGUgbmV3Tm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgbm9kZSBhbmQgaXRzIGNvbnRlbnRzCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVUaGUKLQkgKiAgICAgICAgICAgIG5vZGUgdG8gc2VsZWN0LgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiBhbiBhbmNlc3RvciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGFuIEVudGl0eSwgTm90YXRpb24gb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGUgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0Tm9kZShOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRTdGFydChwYXJlbnQsIGluZGV4KTsKLQkJc2V0RW5kKHBhcmVudCwgaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgdGhlIGNvbnRlbnRzIHdpdGhpbiBhIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZU5vZGUKLQkgKiAgICAgICAgICAgIHRvIHNlbGVjdCBmcm9tCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgb3IgYW4gYW5jZXN0b3Igb2YgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LAotCSAqICAgICAgICAgICAgICAgIE5vdGF0aW9uIG9yIERvY3VtZW50VHlwZSBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0Tm9kZUNvbnRlbnRzKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAocmVmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgcmVmTm9kZTsKLQkJCXNldFN0YXJ0KHJlZk5vZGUsIDApOwotCQkJc2V0RW5kKHJlZk5vZGUsIHRleHQuZ2V0TGVuZ3RoKCkpOwotCQl9IGVsc2UgewotCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IHJlZk5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJaW50IGxlbmd0aCA9IChjaGlsZE5vZGVzICE9IG51bGwgPyBjaGlsZE5vZGVzLmdldExlbmd0aCgpIDogMCk7Ci0JCQlzZXRTdGFydChyZWZOb2RlLCAwKTsKLQkJCXNldEVuZChyZWZOb2RlLCBsZW5ndGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBlbmQgb2YgYSBSYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVRoZQotCSAqICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gdmFsdWUuIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUKLQkgKiAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBvZmZzZXRUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPmVuZE9mZnNldDwvY29kZT4gdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgb3IgYW4gYW5jZXN0b3Igb2YgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LAotCSAqICAgICAgICAgICAgICAgIE5vdGF0aW9uLCBvciBEb2N1bWVudFR5cGUgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcwotCSAqICAgICAgICAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNoaWxkIHVuaXRzIGluCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4uIENoaWxkIHVuaXRzIGFyZSAxNi1iaXQgdW5pdHMgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhIHR5cGUgb2YgQ2hhcmFjdGVyRGF0YSBub2RlCi0JICogICAgICAgICAgICAgICAgKGUuZy4sIGEgVGV4dCBvciBDb21tZW50IG5vZGUpIG9yIGEKLQkgKiAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gbm9kZS4gQ2hpbGQgdW5pdHMgYXJlIE5vZGVzIGluIGFsbAotCSAqICAgICAgICAgICAgICAgIG90aGVyIGNhc2VzLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kKE5vZGUgcmVmTm9kZSwgaW50IG9mZnNldCkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQl0aGlzLmVuZENvbnRhaW5lciA9IHJlZk5vZGU7Ci0JCXRoaXMuZW5kT2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVuZCBvZiBhIFJhbmdlIHRvIGJlIGFmdGVyIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIGVuZHMgYWZ0ZXIgPGNvZGU+cmVmTm9kZTwvY29kZT4uCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kQWZ0ZXIoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gcmVmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gKChOb2RlSW1wbCkgcmVmTm9kZSkuZ2V0SW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJc2V0RW5kKHBhcmVudCwgaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmQgcG9zaXRpb24gdG8gYmUgYmVmb3JlIGEgbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVJhbmdlCi0JICogICAgICAgICAgICBlbmRzIGJlZm9yZSA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRCZWZvcmUoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gcmVmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gKChOb2RlSW1wbCkgcmVmTm9kZSkuZ2V0SW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJc2V0RW5kKHBhcmVudCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlVGhlCi0JICogICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZQotCSAqICAgICAgICAgICAgZGlmZmVyZW50IGZyb20gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIG9mZnNldFRoZQotCSAqICAgICAgICAgICAgPGNvZGU+c3RhcnRPZmZzZXQ8L2NvZGU+IHZhbHVlLgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqICAgICAgICAgICAgICAgIG9yIGFuIGFuY2VzdG9yIG9mIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGFuIEVudGl0eSwKLQkgKiAgICAgICAgICAgICAgICBOb3RhdGlvbiwgb3IgRG9jdW1lbnRUeXBlIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICBuZWdhdGl2ZSBvciBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjaGlsZCB1bml0cyBpbgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+LiBDaGlsZCB1bml0cyBhcmUgMTYtYml0IHVuaXRzIGlmCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYSB0eXBlIG9mIENoYXJhY3RlckRhdGEgbm9kZQotCSAqICAgICAgICAgICAgICAgIChlLmcuLCBhIFRleHQgb3IgQ29tbWVudCBub2RlKSBvciBhCi0JICogICAgICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIG5vZGUuIENoaWxkIHVuaXRzIGFyZSBOb2RlcyBpbiBhbGwKLQkgKiAgICAgICAgICAgICAgICBvdGhlciBjYXNlcy4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE5vZGUgcmVmTm9kZSwgaW50IG9mZnNldCkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gcmVmTm9kZTsKLQkJdGhpcy5zdGFydE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGFydCBwb3NpdGlvbiB0byBiZSBhZnRlciBhIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVJhbmdlCi0JICogICAgICAgICAgICBzdGFydHMgYWZ0ZXIgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50LCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRBZnRlcihOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRTdGFydChwYXJlbnQsIGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhcnQgcG9zaXRpb24gdG8gYmUgYmVmb3JlIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIHN0YXJ0cyBiZWZvcmUgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50LCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24KLQkgKiAgICAgICAgICAgICAgICBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRCZWZvcmUoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gcmVmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGluZGV4ID0gKChOb2RlSW1wbCkgcmVmTm9kZSkuZ2V0SW5kZXgoKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJc2V0U3RhcnQocGFyZW50LCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmVwYXJlbnRzIHRoZSBjb250ZW50cyBvZiB0aGUgUmFuZ2UgdG8gdGhlIGdpdmVuIG5vZGUgYW5kIGluc2VydHMgdGhlCi0JICogbm9kZSBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3UGFyZW50VGhlCi0JICogICAgICAgICAgICBub2RlIHRvIHN1cnJvdW5kIHRoZSBjb250ZW50cyB3aXRoLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW4gYW5jZXN0b3IKLQkgKiAgICAgICAgICAgICAgICBjb250YWluZXIgb2YgZWl0aGVyIGJvdW5kYXJ5LXBvaW50IG9mIHRoZSBSYW5nZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIDxjb2RlPiBuZXdQYXJlbnQ8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgYW5kIHRoZSBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSB3ZXJlIG5vdAotCSAqICAgICAgICAgICAgICAgIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBkb2N1bWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBjb250YWluZXIgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIFJhbmdlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90IGFsbG93Ci0JICogICAgICAgICAgICAgICAgY2hpbGRyZW4gb2YgdGhlIHR5cGUgb2YgPGNvZGU+bmV3UGFyZW50PC9jb2RlPiBvciBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPm5ld1BhcmVudDwvY29kZT4gaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgICAgIG9yIGlmIDxjb2RlPm5vZGU8L2NvZGU+IHdvdWxkIGVuZCB1cCB3aXRoIGEgY2hpbGQgbm9kZQotCSAqICAgICAgICAgICAgICAgIG9mIGEgdHlwZSBub3QgYWxsb3dlZCBieSB0aGUgdHlwZSBvZiA8Y29kZT5ub2RlPC9jb2RlPi4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEJBRF9CT1VOREFSWVBPSU5UU19FUlI6IFJhaXNlZCBpZiB0aGUgUmFuZ2UgcGFydGlhbGx5Ci0JICogICAgICAgICAgICAgICAgc2VsZWN0cyBhIG5vbi10ZXh0IG5vZGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT4gbm9kZTwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICBhbiBBdHRyLCBFbnRpdHksIERvY3VtZW50VHlwZSwgTm90YXRpb24sIERvY3VtZW50LCBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50RnJhZ21lbnQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdXJyb3VuZENvbnRlbnRzKE5vZGUgbmV3UGFyZW50KSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlYWRPbmx5Q29udHJvbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SZWFkT25seUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwZTcxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlYWRPbmx5Q29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLWNsYXNzIFJlYWRPbmx5Q29udHJvbGxlciB7Ci0KLQljbGFzcyBTcGFuIHsKLQkJaW50IGxlbmd0aDsKLQkJaW50IG9mZnNldDsKLQotCQlTcGFuKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBSZWFkT25seUNvbnRyb2xsZXIgZkluc3RhbmNlOwotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBSZWFkT25seUNvbnRyb2xsZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IFJlYWRPbmx5Q29udHJvbGxlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgdm9pZCBsb2NrKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGNhbkluc2VydEJlZm9yZSwgYm9vbGVhbiBjYW5JbnNlcnRBZnRlcikgewotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZG9jIGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpZG9jKS5tYWtlUmVhZE9ubHkob2Zmc2V0LCBsZW5ndGgsIGNhbkluc2VydEJlZm9yZSwgY2FuSW5zZXJ0QWZ0ZXIpOwotCQl9IGVsc2UgewotCQkJZG9jLm1ha2VSZWFkT25seShvZmZzZXQsIGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIGxvY2soSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBib29sZWFuIGNhbkluc2VydEJlZm9yZSwgYm9vbGVhbiBjYW5JbnNlcnRBZnRlcikgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBub2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudClkb2MpLm1ha2VSZWFkT25seShub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0TGVuZ3RoKCksIGNhbkluc2VydEJlZm9yZSwgY2FuSW5zZXJ0QWZ0ZXIpOwotCQl9IGVsc2UgewotCQkJZG9jLm1ha2VSZWFkT25seShub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgdm9pZCB1bmxvY2soSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZG9jLmNsZWFyUmVhZE9ubHkobm9kZS5nZXRTdGFydCgpLCBub2RlLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIFJlYWRPbmx5Q29udHJvbGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFNwYW4gZ2V0RGF0YVNwYW4oSURPTU5vZGUgbm9kZSkgewotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdldERhdGFTcGFuRm9yRWxlbWVudCgoSURPTUVsZW1lbnQpIG5vZGUpOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdldERhdGFTcGFuRm9yVGV4dCgoSURPTVRleHQpIG5vZGUpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3BhbiBnZXREYXRhU3BhbkZvckVsZW1lbnQoSURPTUVsZW1lbnQgbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGRvY1JlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2NSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0KLQkJU3RyaW5nIHN0YXJ0VHlwZTsKLQkJU3RyaW5nIGVuZFR5cGU7Ci0JCWlmIChub2RlLmlzQ29tbWVudFRhZygpKSB7Ci0JCQlzdGFydFR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU47Ci0JCQllbmRUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRTsKLQkJfSBlbHNlIHsKLQkJCXN0YXJ0VHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FOwotCQkJZW5kVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRTsKLQkJfQotCi0JCWludCBzdGFydE9mZnNldCA9IC0xOwotCQlpbnQgZW5kT2Zmc2V0ID0gLTE7Ci0JCUlUZXh0UmVnaW9uIHByZXZSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiByZWdpb247Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBzdGFydFR5cGUpIHsKLQkJCQlzdGFydE9mZnNldCA9IHJlZ2lvbi5nZXRFbmQoKTsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBlbmRUeXBlICYmIHByZXZSZWdpb24gIT0gbnVsbCkgewotCQkJCWVuZE9mZnNldCA9IHByZXZSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJfQotCQkJcHJldlJlZ2lvbiA9IHJlZ2lvbjsKLQkJfQotCi0JCWlmICgwIDw9IHN0YXJ0T2Zmc2V0ICYmIDAgPD0gZW5kT2Zmc2V0KSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgU3BhbigwLCAtMSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNwYW4gZ2V0RGF0YVNwYW5Gb3JUZXh0KElET01UZXh0IG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGRvY1JlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0JCXJldHVybiBuZXcgU3BhbigwLCBkb2NSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZnJvbSBwYXJlbnQncyBzZXRDaGlsZEVkaXRhYmxlKCkKLQkgKiAKLQkgKiBjYXNlIDE6PHBhcmVudD48bm9kZSBhdHRyPSJ2YWx1ZSIvPiA8bm9kZTI+PC9wYXJlbnQ+Ci0JICogeCMjIyMjIyMjIyMjIyMjIyMjIyMjeCBjYXNlIDI6PHBhcmVudD48bm9kZSBhdHRyPSJ2YWx1ZSI+IDxjaGlsZD4KLQkgKiA8L2NoaWxkPiA8L25vZGU+IDwvcGFyZW50PiB4IyMjIyMjIyMjIyMjIyMjIyMjIz8gPyMjIyMjIyN4ICg/IDoKLQkgKiBlZGl0YWJsZSBpZiBub2RlLmlzRWRpdGFibGUoKSA9PSB0cnVlKQotCSAqLwotCXZvaWQgbG9ja0JvdGgoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQlib29sZWFuIGNhbkluc2VydCA9IGZhbHNlOwotCi0JCS8vIGVuZCBub2RlIChlbGVtZW50KQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCWNhbkluc2VydCA9IG5vZGUuaXNDaGlsZEVkaXRhYmxlKCk7Ci0JCQkJbG9jayhmbGF0Tm9kZSwgY2FuSW5zZXJ0LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gc3RhcnQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCWxvY2soZmxhdE5vZGUsIGZhbHNlLCBjYW5JbnNlcnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBsb2NrRGF0YShJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNwYW4gc3BhbiA9IGdldERhdGFTcGFuKG5vZGUpOwotCQlpZiAoMCA8PSBzcGFuLmxlbmd0aCkgewotCQkJbG9jayhub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIHNwYW4ub2Zmc2V0LCBzcGFuLmxlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGxvY2sgaXRzZWxmIGFuZCBhbGwgZGVzY2VuZGFudHMKLQkgKi8KLQl2b2lkIGxvY2tEZWVwKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0KLQkJYm9vbGVhbiBjYW5JbnNlcnQgPSB0cnVlOwotCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJY2FuSW5zZXJ0ID0gZmFsc2U7Ci0JCX0KLQkJbG9jayhub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBvZmZzZXQsIGxlbmd0aCwgY2FuSW5zZXJ0LCBjYW5JbnNlcnQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZnJvbSBwYXJlbnQncyBzZXRDaGlsZEVkaXRhYmxlKCkKLQkgKiAKLQkgKiBjYXNlIDE6PHBhcmVudD48bm9kZSBhdHRyPSJ2YWx1ZSIvPiA8bm9kZTI+PC9wYXJlbnQ+IHgjIyMjIyN4IHgjI3gKLQkgKiBjYXNlIDI6PHBhcmVudD48bm9kZSBhdHRyPSJ2YWx1ZSI+IDxjaGlsZD48L2NoaWxkPiA8L25vZGU+IDwvcGFyZW50PgotCSAqIHgjIyMjIyN4IHgjPyA/IyMjIyMjI3ggKD8gOiBlZGl0YWJsZSBpZiBub2RlLmlzRWRpdGFibGUoKSA9PSB0cnVlKQotCSAqLwotCXZvaWQgbG9ja05vZGUoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCFub2RlLmlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCWxvY2tCb3RoKG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJYm9vbGVhbiBjYW5JbnNlcnQgPSBmYWxzZTsKLQotCQkvLyBlbmQgbm9kZSAoZWxlbWVudCkKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJZmxhdE5vZGUgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQljYW5JbnNlcnQgPSBub2RlLmlzQ2hpbGRFZGl0YWJsZSgpOwotCQkJCWxvY2soZmxhdE5vZGUsIGNhbkluc2VydCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCS8vIHN0YXJ0IG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJCWlmICgwIDw9IHNwYW4ubGVuZ3RoKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmbGF0Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCWludCBvZmZzZXQsIGxlbmd0aDsKLQkJCQlvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJCWxlbmd0aCA9IHNwYW4ub2Zmc2V0OwotCQkJCWxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQkJCQlvZmZzZXQgPSBvZmZzZXQgKyBzcGFuLm9mZnNldCArIHNwYW4ubGVuZ3RoOwotCQkJCWxlbmd0aCA9IGZsYXROb2RlLmdldEVuZCgpIC0gb2Zmc2V0OwotCQkJCWxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgY2FuSW5zZXJ0LCBmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCWxvY2soZmxhdE5vZGUsIGZhbHNlLCBjYW5JbnNlcnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVubG9jayhJU3RydWN0dXJlZERvY3VtZW50IGRvYywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlkb2MuY2xlYXJSZWFkT25seShvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0Jdm9pZCB1bmxvY2tCb3RoKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJLy8gc3RhcnQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCX0KLQkJLy8gZW5kIG5vZGUKLQkJZmxhdE5vZGUgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJfQotCX0KLQotCXZvaWQgdW5sb2NrRGF0YShJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNwYW4gc3BhbiA9IGdldERhdGFTcGFuKG5vZGUpOwotCQlpZiAoMCA8PSBzcGFuLmxlbmd0aCkgewotCQkJdW5sb2NrKG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgc3Bhbi5vZmZzZXQsIHNwYW4ubGVuZ3RoKTsKLQkJfQotCX0KLQotCXZvaWQgdW5sb2NrRGVlcChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBub2RlLmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCi0JCXVubG9jayhub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0Jdm9pZCB1bmxvY2tOb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJLy8gZW5kIG5vZGUKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJZmxhdE5vZGUgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQl1bmxvY2soZmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gc3RhcnQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCQl1bmxvY2soZmxhdE5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlTcGFuIHNwYW4gPSBnZXREYXRhU3Bhbihub2RlKTsKLQkJCQlpZiAoc3Bhbi5sZW5ndGggPD0gMCkgewotCQkJCQl1bmxvY2soZmxhdE5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZmxhdE5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQkJaW50IG9mZnNldCwgbGVuZ3RoOwotCQkJCQlvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJCQlsZW5ndGggPSBzcGFuLm9mZnNldCAtIG9mZnNldDsKLQkJCQkJdW5sb2NrKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgpOwotCQkJCQlvZmZzZXQgPSBzcGFuLm9mZnNldCArIHNwYW4ubGVuZ3RoOwotCQkJCQlsZW5ndGggPSBmbGF0Tm9kZS5nZXRFbmQoKSAtIHNwYW4ub2Zmc2V0OwotCQkJCQl1bmxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Tb3VyY2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU291cmNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZGQ1NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Tb3VyY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTENoYXJFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU291cmNlVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU291cmNlVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlzdXBlcigpOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXRoaXMubm9kZSA9IChOb2RlSW1wbCkgbm9kZTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5ub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQkvLyBzZXR1cCBjb252ZXJzaW9uIGNvbmRpdGlvbnMKLQkJYm9vbGVhbiBhY2NlcHRUYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRDbG9zZSA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdFF1b3RlID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0QW1wZXJzYW5kID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0RW50aXR5UmVmID0gdHJ1ZTsKLQkJYm9vbGVhbiBhY2NlcHRKU1BFbmQgPSB0cnVlOwotCQlTdHJpbmcgZW5kVGFnTmFtZSA9IG51bGw7Ci0JCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCWlmIChhY2NlcHRUYWcpIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgdGhpcy5ub2RlOwotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCWFjY2VwdFRhZyA9IGZhbHNlOwotCQkJfQotCQkJLy8gaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBpbmNsdWRlIHNpbmdsZSBxdW90ZSwKLQkJCS8vIGRvdWJsZSBxdW90ZSBpcyB2YWxpZAotCQkJYWNjZXB0UXVvdGUgPSAoc291cmNlLmluZGV4T2YoJ1wnJykgPCAwKTsKLQkJfSBlbHNlIGlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5ub2RlOwotCQkJaWYgKHRleHQuaXNKU1BDb250ZW50KCkpIHsKLQkJCQlpbnQgaW5kZXggPSBzb3VyY2UuaW5kZXhPZihKU1BUYWcuVEFHX0NMT1NFKTsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm4gc291cmNlOwotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQkJYWNjZXB0Q2xvc2UgPSB0cnVlOwotCQkJCWFjY2VwdFF1b3RlID0gdHJ1ZTsKLQkJCQlhY2NlcHRBbXBlcnNhbmQgPSB0cnVlOwotCQkJCWFjY2VwdEpTUEVuZCA9IGZhbHNlOwotCQkJfSBlbHNlIGlmICh0ZXh0LmlzQ0RBVEFDb250ZW50KCkpIHsKLQkJCQllbmRUYWdOYW1lID0gdGV4dC5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAoZW5kVGFnTmFtZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJCWFjY2VwdENsb3NlID0gdHJ1ZTsKLQkJCQlhY2NlcHRRdW90ZSA9IHRydWU7Ci0JCQkJYWNjZXB0QW1wZXJzYW5kID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCQlpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGU7Ci0JCQl9IGVsc2UgewotCQkJCWRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgdGhpcy5ub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmlzSlNQVHlwZSgpKQotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IGNvcGllZExlbmd0aCA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZWYgPSBudWxsOwotCQkJY2hhciBjID0gc291cmNlLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJzwnIDoKLQkJCQkJaWYgKGFjY2VwdFRhZykgewotCQkJCQkJaWYgKGVuZFRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQkJCWlmICghbWF0Y2hFbmRUYWcoc291cmNlLCBpICsgMSwgZW5kVGFnTmFtZSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpbnQgc2tpcCA9IHNraXBUYWcoc291cmNlLCBpICsgMSk7Ci0JCQkJCQkJaWYgKHNraXAgPj0gMCkgewotCQkJCQkJCQlpICs9IHNraXA7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGludmFsaWQgSlNQIHRhZwotCQkJCQl9Ci0JCQkJCXJlZiA9IElYTUxDaGFyRW50aXR5LkxUX1JFRjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPicgOgotCQkJCQlpZiAoYWNjZXB0Q2xvc2UpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJcmVmID0gSVhNTENoYXJFbnRpdHkuR1RfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICcmJyA6Ci0JCQkJCWlmIChhY2NlcHRBbXBlcnNhbmQpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKGFjY2VwdEVudGl0eVJlZikgewotCQkJCQkJaW50IHNraXAgPSBza2lwRW50aXR5UmVmKHNvdXJjZSwgaSArIDEpOwotCQkJCQkJaWYgKHNraXAgPj0gMCkgewotCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5BTVBfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICciJyA6Ci0JCQkJCWlmIChhY2NlcHRRdW90ZSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5RVU9UX1JFRjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnJScgOgotCQkJCQlpZiAoYWNjZXB0SlNQRW5kKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChzb3VyY2UuY2hhckF0KGkgKyAxKSAhPSAnPicpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaSsrOwotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5HVF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCQkJfQotCQkJCWlmIChpID4gY29waWVkTGVuZ3RoKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhjb3BpZWRMZW5ndGgsIGkpKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWYpOwotCQkJCWNvcGllZExlbmd0aCA9IGkgKyAxOyAvLyBza2lwIHRoaXMgY2hhcmFjdGVyCi0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmIChjb3BpZWRMZW5ndGggPCBsZW5ndGgpIHsKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZS5zdWJzdHJpbmcoY29waWVkTGVuZ3RoLCBsZW5ndGgpKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtYXRjaEVuZFRhZyhTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0LCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQlpZiAoc291cmNlID09IG51bGwgfHwgZW5kVGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoc291cmNlLmNoYXJBdChvZmZzZXQpICE9ICcvJykKLQkJCXJldHVybiBmYWxzZTsKLQkJb2Zmc2V0Kys7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBlbmRUYWdOYW1lLmxlbmd0aCgpOwotCQlpZiAoZW5kID4gbGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZW5kVGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBza2lwRW50aXR5UmVmKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gc291cmNlLmxlbmd0aCgpKQotCQkJcmV0dXJuIC0xOwotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsgLy8gZXJyb3IKLQotCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoJzsnLCBvZmZzZXQpOwotCQlpZiAoZW5kIDwgMCB8fCBlbmQgPT0gb2Zmc2V0KQotCQkJcmV0dXJuIC0xOwotCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8IGRvY3VtZW50LmdldENoYXJWYWx1ZShuYW1lKSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gKGVuZCArIDEgLSBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHNraXBUYWcoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBzb3VyY2UubGVuZ3RoKCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaW50IGVuZCA9IG9mZnNldDsKLQkJaWYgKHNvdXJjZS5jaGFyQXQob2Zmc2V0KSA9PSAnJScpIHsKLQkJCS8vIEpTUCB0YWcKLQkJCWludCBmb3VuZCA9IHNvdXJjZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UsIG9mZnNldCArIDEpOwotCQkJaWYgKGZvdW5kIDwgMCkKLQkJCQlyZXR1cm4gLTE7IC8vIGludmFsaWQgSlNQIHRhZwotCQkJZW5kID0gZm91bmQgKyAyOwotCQl9IGVsc2UgewotCQkJLy8gbm9ybWFsIHRhZwotCQkJaW50IGZvdW5kID0gc291cmNlLmluZGV4T2YoJz4nLCBvZmZzZXQpOwotCQkJaWYgKGZvdW5kIDwgMCkKLQkJCQlyZXR1cm4gLTE7IC8vIGludmFsaWQgdGFnCi0JCQllbmQgPSBmb3VuZCArIDE7Ci0JCX0KLQkJcmV0dXJuIChlbmQgLSBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0aGlzLm5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gZXJyb3IKLQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCi0JCS8vIHNldHVwIHZhbGlkYXRpb24gY29uZGl0aW9ucwotCQlib29sZWFuIGFjY2VwdFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdENsb3NlID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0UXVvdGUgPSB0cnVlOwotCQlib29sZWFuIGFjY2VwdEVudGl0eVJlZiA9IHRydWU7Ci0JCVN0cmluZyBlbmRUYWdOYW1lID0gbnVsbDsKLQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pc0pTUFR5cGUoKSkKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJaWYgKGFjY2VwdFRhZykgewotCQkJCUF0dHIgYXR0ciA9IChBdHRyKSB0aGlzLm5vZGU7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJYWNjZXB0VGFnID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgc291cmNlIGRvZXMgbm90IGluY2x1ZGUgc2luZ2xlIHF1b3RlLAotCQkJLy8gZG91YmxlIHF1b3RlIGlzIHZhbGlkCi0JCQlhY2NlcHRRdW90ZSA9IChzb3VyY2UuaW5kZXhPZignXCcnKSA8IDApOwotCQl9IGVsc2UgaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm5vZGU7Ci0JCQlpZiAodGV4dC5pc0pTUENvbnRlbnQoKSkgewotCQkJCWludCBpbmRleCA9IHNvdXJjZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfZ3RfZm9fRVJST1JfOwotCQkJCXRocm93IG5ldyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKG1lc3NhZ2UsICc+JywgaW5kZXggKyAxKTsKLQkJCX0gZWxzZSBpZiAodGV4dC5pc0NEQVRBQ29udGVudCgpKSB7Ci0JCQkJZW5kVGFnTmFtZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBlcnJvcgotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQkJYWNjZXB0Q2xvc2UgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJfQotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJfQotCi0JCWNoYXIgYyA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWMgPSBzb3VyY2UuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnPCcgOgotCQkJCQlpZiAoYWNjZXB0VGFnKSB7Ci0JCQkJCQlpZiAoZW5kVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtYXRjaEVuZFRhZyhzb3VyY2UsIGkgKyAxLCBlbmRUYWdOYW1lKSkKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBza2lwID0gc2tpcFRhZyhzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gaW52YWxpZCB0YWcKLQkJCQkJfQotCQkJCQltZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX2x0X2ZvX0VSUk9SXzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPicgOgotCQkJCQlpZiAoYWNjZXB0Q2xvc2UpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJbWVzc2FnZSA9IFhNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl87Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyYnIDoKLQkJCQkJaWYgKGFjY2VwdEVudGl0eVJlZikgewotCQkJCQkJaWYgKGVuZFRhZ05hbWUgIT0gbnVsbCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWludCBza2lwID0gc2tpcEVudGl0eVJlZihzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCWlmIChza2lwID49IDApIHsKLQkJCQkJCQlpICs9IHNraXA7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpbnZhbGlkIGVudGl0eSByZWZlcmVuY2UKLQkJCQkJfQotCQkJCQltZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX2FtcF9mb19FUlJPUl87Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInIDoKLQkJCQkJaWYgKGFjY2VwdFF1b3RlKQotCQkJCQkJY29udGludWU7Ci0JCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfX2ZfRVhDXzsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24obWVzc2FnZSwgYywgaSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdjOGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBvbmx5IGZvciBkZWJ1ZyBwdXJwb3NlLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlciB7Ci0JU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlXcml0ZXIgdGVzdFdyaXRlciA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlcihXcml0ZXIgd3JpdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRlc3RXcml0ZXIgPSB3cml0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2hpbGROb2RlcyhOb2RlIG5vZGUpIHsKLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJY2hlY2tOb2RlKGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTW9kZWwoSURPTU1vZGVsIG1vZGVsKSB7Ci0JCWNoZWNrQ2hpbGROb2Rlcyhtb2RlbC5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tOb2RlKE5vZGUgbm9kZSkgewotCQljaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoZWNrQ2hpbGROb2Rlcyhub2RlKTsKLQkJCWNoZWNrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCgoRWxlbWVudEltcGwpIG5vZGUpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IG4gPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoYyA9PSBudWxsKSB7Ci0JCQkJCXJlcG9ydEVycm9yKCJudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWNoZWNrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGMpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKHN0YXJ0IDwgdGhpcy5vZmZzZXQpCi0JCQlyZXBvcnRFcnJvcigib3ZlcndyYXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3RhcnQgPiB0aGlzLm9mZnNldCkKLQkJCXJlcG9ydEVycm9yKCJnYXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgZW5kID0gZmxhdE5vZGUuZ2V0RW5kKCk7Ci0JCXRoaXMub2Zmc2V0ID0gZW5kOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHAgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChwID09IG51bGwpIHsKLQkJCQlyZXBvcnRFcnJvcigibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IHMgPSBwLmdldFN0YXJ0KCk7Ci0JCQlpbnQgZSA9IHAuZ2V0RW5kKCk7Ci0JCQlpZiAocyA+IHN0YXJ0IHx8IGUgPCBlbmQpCi0JCQkJcmVwb3J0RXJyb3IoIm91dCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocyA9PSBzdGFydCAmJiBlID09IGVuZCkKLQkJCQlyZXBvcnRXYXJuaW5nKCJ2YWluIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmcgbXNnID0gIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIgOiBlcnJvciA6ICIgKyBtZXNzYWdlOyAvLyROT04tTkxTLTEkCi0JCWlmICh0ZXN0V3JpdGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdGVzdFdyaXRlci53cml0ZShtc2cgKyBFT0wpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBvcnRXYXJuaW5nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN0cmluZyBtc2cgPSAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlciA6IHdhcm5pbmcgOiAiICsgbWVzc2FnZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVzdFdyaXRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRlc3RXcml0ZXIud3JpdGUobXNnICsgRU9MKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1Mzc4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1jbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQotCXByaXZhdGUgVmVjdG9yIGZsYXROb2RlcyA9IG5ldyBWZWN0b3IoMik7Ci0KLQkvKioKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWlmIChjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKSA+IDApIHsKLQkJCQl0aGlzLmZsYXROb2Rlcy5hZGRBbGwoY29udGFpbmVyLmZsYXROb2Rlcyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmZsYXROb2Rlcy5hZGRFbGVtZW50KGZsYXROb2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXREZWVwZXN0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QgPSBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChsYXN0ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGxhc3QuZ2V0RW5kKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdCgwKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCWludCBzaXplID0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KHNpemUgLSAxKTsKLQl9Ci0KLQkvKiogCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAoZ2V0RW5kKCkgLSBnZXRTdGFydCgpKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0KCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbkNvbnRhaW5lciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRSZWdpb25zKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3QgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3QgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZmlyc3QuZ2V0U3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmaXJzdC5nZXRQYXJlbnREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZmxhdE5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICovCi0JaW50IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaW50IHNpemUgPSB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0IGxlbmd0aCBpcyBlcXVhbCB0byBsZW5ndGggaWYgdGhlcmUgaXMgbm8gd2hpdGUgc3BhY2UgYXQgdGhlCi0JICogZW5kIG9mIGEgcmVnaW9uLiBPdGhlcndpc2UgaXQgaXMgc21hbGxlciB0aGFuIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiAoZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIGludCBpbmRleCkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJaW50IHNpemUgPSB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JCWlmIChpbmRleCA+IHNpemUpCi0JCQlyZXR1cm47Ci0JCWlmIChpbmRleCA9PSBzaXplKSB7Ci0JCQlhcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZmxhdE5vZGVzLmluc2VydEVsZW1lbnRBdChmbGF0Tm9kZSwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5kZWQoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQkJdGhpcy5mbGF0Tm9kZXMucmVtb3ZlRWxlbWVudEF0KGluZGV4KTsKLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGkpOwotCQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCXRoaXMuZmxhdE5vZGVzLnJlbW92ZUVsZW1lbnRBdChpKTsKLQkJCQlyZXR1cm4gZmxhdE5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGluZGV4KTsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmZsYXROb2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQkJdGhpcy5mbGF0Tm9kZXMuc2V0RWxlbWVudEF0KGZsYXROb2RlLCBpbmRleCk7Ci0JCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuZGVkKGJvb2xlYW4gaGFzRW5kKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogdG9TdHJpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgneycpOwotCQlpbnQgY291bnQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWlmIChpICE9IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoIm51bGwiKTsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS50b1N0cmluZygpKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCd9Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUsIFN0cmluZyBjaGFuZ2VzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCgpIHsKLQkJLy8gaWYgc29tZW9uZSAiZ2V0cyIgdGhlc2UgdGVtcCByZWdpb25zIGJ5Ci0JCS8vIGFjY2lkZW50LCB3ZSdsbCBhbHdheXMgcmV0dXJuICJkZWxldGVkIi4KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVkKGJvb2xlYW4gZGVsZXRlZCkgewotCQkvLyBkbyBub3RoaW5nCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGZlY2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCJJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1hbmFnZW1lbnQgZmFpbGVkLiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMTE0NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLWNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5mbGF0Tm9kZSA9IGZsYXROb2RlOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgLT0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXREZWVwZXN0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlpbnQgZmxhdE5vZGVPZmZzZXQgPSAwOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJZmxhdE5vZGVPZmZzZXQgPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBmbGF0Tm9kZU9mZnNldCArIHRoaXMub2Zmc2V0ICsgdGhpcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJcmV0dXJuIGdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0KCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCWludCBnZXRPZmZzZXQoKSB7Ci0JCWludCBmbGF0Tm9kZU9mZnNldCA9IDA7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlmbGF0Tm9kZU9mZnNldCA9IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIGZsYXROb2RlT2Zmc2V0ICsgdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCQkvLyB0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlcgotCQkvLyBiZSBjYWxsZWQiKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlpbnQgZmxhdE5vZGVPZmZzZXQgPSAwOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJZmxhdE5vZGVPZmZzZXQgPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBmbGF0Tm9kZU9mZnNldCArIHRoaXMub2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKiAKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJU3RyaW5nIHRleHQgPSB0aGlzLmZsYXROb2RlLmdldFRleHQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCWludCBlbmQgPSB0aGlzLm9mZnNldCArIHRoaXMubGVuZ3RoOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcodGhpcy5vZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0IGxlbmd0aCBpcyBlcXVhbCB0byBsZW5ndGggaWYgdGhlcmUgaXMgbm8gd2hpdGUgc3BhY2UgYXQgdGhlCi0JICogZW5kIG9mIGEgcmVnaW9uLiBPdGhlcndpc2UgaXQgaXMgc21hbGxlciB0aGFuIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCS8vIEknbGwgYXNzdW1lIG5ldmVyIHJlYWxseSBuZWVkZWQgaGVyZQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZGVkKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVkKGJvb2xlYW4gZGVsZXRlZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuZGVkKGJvb2xlYW4gaGFzRW5kKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaGFkIHRvIG1ha2UgcHVibGljLCBkdWUgdG8gQVBJIHRyYW5zaXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgLT0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgKz0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQl0aGlzLmZsYXROb2RlID0gZmxhdE5vZGU7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLm9mZnNldCAtPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJ1snKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRTdGFydCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQlidWZmZXIuYXBwZW5kKGdldEVuZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnXScpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHRoaXMuZmxhdE5vZGUudG9TdHJpbmcoKSk7Ci0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIm51bGwiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCBzdGFydCwgaW50IGVuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDliODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogUHJvdmlkZXMgY29udmVuaWVudCBmdW5jdGlvbnMgdG8gaGFuZGxlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kCi0gKiBJVGV4dFJlZ2lvbi4KLSAqLwotY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbCB7Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyBjb250ZW50cyBlbmNsb3NlZCB3aXRoIHF1b3Rlcy4gUXVvdGVzIG1heSBiZSBkb3VibGUgb3Igc2luZ2xlLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0QXR0clZhbHVlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHZhbHVlID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiB2YWx1ZTsKLQkJY2hhciBmaXJzdENoYXIgPSB2YWx1ZS5jaGFyQXQoMCk7Ci0JCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQlpZiAobGVuZ3RoID09IDEpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAodmFsdWUuY2hhckF0KGxlbmd0aCAtIDEpID09IGZpcnN0Q2hhcikKLQkJCQlsZW5ndGgtLTsKLQkJCXJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMSwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIG5hbWUgd2l0aG91dCBoZWFkaW5nICcmJyBhbmQgdGFpbGluZyAnOycuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRFbnRpdHlSZWZOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlZiA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJaW50IGxlbmd0aCA9IHJlZi5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIHJlZjsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWlmIChyZWYuY2hhckF0KDApID09ICcmJykKLQkJCW9mZnNldCA9IDE7Ci0JCWlmIChyZWYuY2hhckF0KGxlbmd0aCAtIDEpID09ICc7JykKLQkJCWxlbmd0aC0tOwotCQlpZiAob2Zmc2V0ID49IGxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVmLnN1YnN0cmluZyhvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IHJlZ2lvbi4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEZpcnN0UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJcmV0dXJuIHJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlmbGF0Tm9kZSA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFzdCByZWdpb24uCi0JICovCi0Jc3RhdGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IHJlZ2lvbi4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldExhc3RSZWdpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCXJldHVybiByZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UYWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5ZmY3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ0FkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldEVuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqLwotCVN0cmluZyBnZXRTdGFydFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNFbmRUYWcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiOGU5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotCi0vKioKLSAqIFRleHRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0SW1wbCBleHRlbmRzIENoYXJhY3RlckRhdGFJbXBsIGltcGxlbWVudHMgSURPTVRleHQgewotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTdHJpbmdQYWlyIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZkZpcnN0ID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgZlNlY29uZCA9IG51bGw7Ci0KLQkJU3RyaW5nUGFpcihTdHJpbmcgZmlyc3QsIFN0cmluZyBzZWNvbmQpIHsKLQkJCXRoaXMuZkZpcnN0ID0gZmlyc3Q7Ci0JCQl0aGlzLmZTZWNvbmQgPSBzZWNvbmQ7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0Rmlyc3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mRmlyc3Q7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0U2Vjb25kKCkgewotCQkJcmV0dXJuIHRoaXMuZlNlY29uZDsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZTb3VyY2UgPSBudWxsOwotCi0JLyoqCi0JICogVGV4dEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGV4dEltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgVGV4dEltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEltcGwoVGV4dEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmZTb3VyY2UgPSB0aGF0LmdldFNvdXJjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kRGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kRGF0YShTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGFyZyA9PSBudWxsIHx8IGFyZy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIG5ld1NvdXJjZSA9IGdldFNvdXJjZShhcmcpOwotCQlpZiAobmV3U291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJc2V0VGV4dFNvdXJjZShzb3VyY2UgKyBuZXdTb3VyY2UpOwotCQllbHNlCi0JCQlzZXRUZXh0U291cmNlKG5ld1NvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQlyZXR1cm4gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyKTsKLQkJfQotCi0JCXJldHVybiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kVGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZFRleHQoVGV4dCBuZXdUZXh0KSB7Ci0JCWlmIChuZXdUZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBuZXdUZXh0OwotCQlTdHJpbmcgbmV3U291cmNlID0gdGV4dC5nZXRTb3VyY2UoKTsKLQkJaWYgKG5ld1NvdXJjZSA9PSBudWxsIHx8IG5ld1NvdXJjZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXNldFRleHRTb3VyY2Uoc291cmNlICsgbmV3U291cmNlKTsKLQkJZWxzZQotCQkJc2V0VGV4dFNvdXJjZShuZXdTb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJVGV4dEltcGwgY2xvbmVkID0gbmV3IFRleHRJbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBkZWxldGVEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKGNvdW50IDwgMCB8fCBvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgY291bnQpOwotCQlpZiAocGFpciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzb3VyY2UgPSBudWxsOwotCQlTdHJpbmcgZmlyc3QgPSBwYWlyLmdldEZpcnN0KCk7Ci0JCWlmIChmaXJzdCAhPSBudWxsKQotCQkJc291cmNlID0gZmlyc3Q7Ci0JCVN0cmluZyBzZWNvbmQgPSBwYWlyLmdldFNlY29uZCgpOwotCQlpZiAoc2Vjb25kICE9IG51bGwpIHsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlzb3VyY2UgKz0gc2Vjb25kOwotCQkJZWxzZQotCQkJCXNvdXJjZSA9IHNlY29uZDsKLQkJfQotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7IC8vIGRlbGV0ZSBhbGwKLQkJc2V0VGV4dFNvdXJjZShzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmZTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBnZXREYXRhKHRoaXMuZlNvdXJjZSk7Ci0JCVN0cmluZyBkYXRhID0gc3VwZXIuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIGRhdGE7Ci0JCXJldHVybiBnZXREYXRhKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGxlbmd0aCA9IGNvbnRhaW5lci5nZXRMZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggPCAxNikKLQkJCQlsZW5ndGggPSAxNjsgLy8gZGVmYXVsdAotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoY29udGVudCk7Ci0JCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEVudGl0eVJlZk5hbWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBkb2N1bWVudC5nZXRDaGFyVmFsdWUobmFtZSk7Ci0JCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZGF0YSBmb3IgdGhlIHNvdXJjZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoJzsnLCByZWYgKyAxKTsKLQkJCWlmIChlbmQgPiByZWYgKyAxKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHJlZiArIDEsIGVuZCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gZ2V0Q2hhclZhbHVlKG5hbWUpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoKTsKLQkJCQkJaWYgKHJlZiA+IG9mZnNldCkKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIHJlZikpOwotCQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCQkJb2Zmc2V0ID0gZW5kICsgMTsKLQkJCQkJcmVmID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJCXJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJywgcmVmICsgMSk7Ci0JCX0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZTsKLQkJaWYgKGxlbmd0aCA+IG9mZnNldCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiN0ZXh0IjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFRFWFRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJaWYgKHRoaXMuZlNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZlNvdXJjZTsKLQkJU3RyaW5nIGRhdGEgPSBzdXBlci5nZXREYXRhKCk7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoZGF0YSk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHNvdXJjZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3VyY2UgZm9yIHRoZSBkYXRhCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlKFN0cmluZyBkYXRhKSB7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBtb2RlbC5nZXRHZW5lcmF0b3IoKTsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCXJldHVybiBnZW5lcmF0b3IuZ2VuZXJhdGVUZXh0RGF0YSh0aGlzLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZlNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBoYXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChmbGF0Tm9kZSA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGluc2VydERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydERhdGEoaW50IG9mZnNldCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCB8fCBhcmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlzb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlzZXRUZXh0U291cmNlKHNvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgMCk7Ci0JCWlmIChwYWlyID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZS5sZW5ndGgoKSArIGFyZy5sZW5ndGgoKSk7Ci0JCVN0cmluZyBmaXJzdCA9IHBhaXIuZ2V0Rmlyc3QoKTsKLQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGZpcnN0KTsKLQkJc291cmNlID0gZ2V0U291cmNlKGFyZyk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJU3RyaW5nIHNlY29uZCA9IHBhaXIuZ2V0U2Vjb25kKCk7Ci0JCWlmIChzZWNvbmQgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc2Vjb25kKTsKLQkJc2V0VGV4dFNvdXJjZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBhcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJaWYgKGZsYXROb2RlID09IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIpOwotCQkJcmV0dXJuIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQlyZXR1cm4gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JfQotCi0JLyoqCi0JICogaW5zZXJ0VGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFRleHQoVGV4dCBuZXdUZXh0LCBpbnQgb2Zmc2V0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1RleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbmV3VGV4dDsKLQkJU3RyaW5nIG5ld1NvdXJjZSA9IHRleHQuZ2V0U291cmNlKCk7Ci0JCWlmIChuZXdTb3VyY2UgPT0gbnVsbCB8fCBuZXdTb3VyY2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlzZXRUZXh0U291cmNlKG5ld1NvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgMCk7Ci0JCWlmIChwYWlyID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZS5sZW5ndGgoKSArIG5ld1NvdXJjZS5sZW5ndGgoKSk7Ci0JCVN0cmluZyBmaXJzdCA9IHBhaXIuZ2V0Rmlyc3QoKTsKLQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGZpcnN0KTsKLQkJYnVmZmVyLmFwcGVuZChuZXdTb3VyY2UpOwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzZWNvbmQpOwotCQlzZXRUZXh0U291cmNlKGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBpc0NEQVRBQ29udGVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NEQVRBQ29udGVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlyZXR1cm4gZWxlbWVudC5pc0NEQVRBQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnZhbGlkKCkgewotCQlyZXR1cm4gaXNJbnZhbGlkKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnZhbGlkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGlzSW52YWxpZChjb250ZW50KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJcmV0dXJuIGlzSW52YWxpZChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCX0KLQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCAmJiBpc05vdE5lc3RlZENvbnRlbnQocmVnaW9uVHlwZSkgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFICYmIHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdE5lc3RlZENvbnRlbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNTaGFyaW5nU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChmbGF0Tm9kZSA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRleHQgbm9kZSBjb250YWlucyA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDQvUkVDLXhtbC1pbmZvc2V0LTIwMDQwMjA0I2luZm9pdGVtLmNoYXJhY3Rlcic+Ci0JICogZWxlbWVudCBjb250ZW50IHdoaXRlc3BhY2U8L2E+LCBvZnRlbiBhYnVzaXZlbHkgY2FsbGVkICJpZ25vcmFibGUKLQkgKiB3aGl0ZXNwYWNlIi4gVGhlIHRleHQgbm9kZSBpcyBkZXRlcm1pbmVkIHRvIGNvbnRhaW4gd2hpdGVzcGFjZSBpbgotCSAqIGVsZW1lbnQgY29udGVudCBkdXJpbmcgdGhlIGxvYWQgb2YgdGhlIGRvY3VtZW50IG9yIGlmIHZhbGlkYXRpb24gb2NjdXJzCi0JICogd2hpbGUgdXNpbmcgPGNvZGU+RG9jdW1lbnQubm9ybWFsaXplRG9jdW1lbnQoKTwvY29kZT4uCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkgewotCQlyZXR1cm4gaXNXaGl0ZXNwYWNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKCkgewotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGRhdGEuY2hhckF0KGkpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCS8vIHJlbW92ZWQgd2l0aCBwcm94eQotCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJaWYgKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpID09IDEpIHsKLQkJCQkJCS8vIGdldCBiYWNrIHRvIHNpbmdsZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigwKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkvLyByZW1vdmVkIHdpdGggcHJveHkKLQkJCQkJCWNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgPT0gMSkgewotCQkJCQkJCS8vIGdldCBiYWNrIHRvIHNpbmdsZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oMCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JfQotCi0JLyoqCi0JICogcmVwbGFjZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZURhdGEoaW50IG9mZnNldCwgaW50IGNvdW50LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKGFyZyA9PSBudWxsIHx8IGFyZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlpbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nUGFpciBwYWlyID0gc3Vic3RyaW5nU291cmNlRXhjbHVkZWQoc291cmNlLCBvZmZzZXQsIGNvdW50KTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc291cmNlLmxlbmd0aCgpICsgYXJnLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGZpcnN0ID0gcGFpci5nZXRGaXJzdCgpOwotCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZmlyc3QpOwotCQlzb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzZWNvbmQpOwotCQlzZXRUZXh0U291cmNlKGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCS8vIHByb3h5IG11c3Qgbm90IGJlIG5lc3RlZAotCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCX0KLQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJCQkvLyBwcm94eSBtdXN0IG5vdCBiZSBuZXN0ZWQKLQkJCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCkKLQkJCXRoaXMuZlNvdXJjZSA9IHNvdXJjZTsKLQkJc3VwZXIucmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmZTb3VyY2UgPSBudWxsOwotCQlzdXBlci5zZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB0aHJvd3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU291cmNlVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTb3VyY2VWYWxpZGF0b3IodGhpcyk7Ci0JCWlmICh2YWxpZGF0b3IudmFsaWRhdGVTb3VyY2Uoc291cmNlKSkKLQkJCXNldFRleHRTb3VyY2Uoc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5mU291cmNlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmZTb3VyY2UgPSBzb3VyY2U7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVNvdXJjZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU291cmNlVmFsaWRhdG9yKHRoaXMpOwotCQlzZXRUZXh0U291cmNlKHZhbGlkYXRvci5jb252ZXJ0U291cmNlKHNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIHNwbGl0VGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgVGV4dCBzcGxpdFRleHQoaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gZ2V0TGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAob2Zmc2V0IDwgbGVuZ3RoKSB7Ci0JCQlpbnQgY291bnQgPSBsZW5ndGggLSBvZmZzZXQ7Ci0JCQlzb3VyY2UgPSBzdWJzdHJpbmdTb3VyY2Uob2Zmc2V0LCBjb3VudCk7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQl9Ci0JCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG51bGwpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQl0ZXh0LnNldFRleHRTb3VyY2Uoc291cmNlKTsKLQotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcGFyZW50Lmluc2VydEJlZm9yZSh0ZXh0LCBnZXROZXh0U2libGluZygpKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlUZXh0IHNwbGl0VGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwgfHwgIShmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewotCQkJaWYgKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpID09IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGluZGV4ID49IGNvdW50KSB7Ci0JCQkvLyB0aGlzIGlzIHRoZSBjYXNlIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYSBuZXcKLQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCS8vIHNlYXJjaCBnYXAgYnkgb2Zmc2V0Ci0JCQlpbnQgb2Zmc2V0ID0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGluZGV4KTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpID49IG9mZnNldCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaW5kZXggPj0gY291bnQpCi0JCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQkJaWYgKGluZGV4ID09IDApCi0JCQlyZXR1cm4gdGhpczsgLy8gbm90aGluZyB0byBkbwotCi0JCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCVRleHRJbXBsIG5leHRUZXh0ID0gKFRleHRJbXBsKSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShudWxsKTsKLQkJaWYgKG5leHRUZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlmb3IgKDsgaW5kZXggPCBjb3VudDsgY291bnQtLSkgewotCQkJbmV4dFRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpKTsKLQkJfQotCi0JCS8vIG5vcm1hbGl6ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCWlmIChpbmRleCA9PSAxKSB7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigwKSk7Ci0JCX0KLQotCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5leHRUZXh0LCBnZXROZXh0U2libGluZygpKTsKLQkJcmV0dXJuIG5leHRUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHJ1bnMgZGF0YSBmb3IgdGhlIHJhbmdlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3Vic3RyaW5nRGF0YShTdHJpbmcgZGF0YSwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc3VyZSBvZmZzZXQgYW5kIGNvdW50IGFyZSBub24tbmVnYXRpdmUKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCQlpZiAoZW5kID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlIGZvciB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5OiBvZmZzZXQ6IGRhdGEgb2Zmc2V0IGNvdW50OgotCSAqIGRhdGEgY291bnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdWJzdHJpbmdTb3VyY2UoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc3VyZSBvZmZzZXQgYW5kIGNvdW50IGFyZSBub24tbmVnYXRpdmUKLQkJaWYgKHRoaXMuZlNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHN1YnN0cmluZ1NvdXJjZSh0aGlzLmZTb3VyY2UsIG9mZnNldCwgY291bnQpOwotCi0JCVN0cmluZyBkYXRhID0gc3VwZXIuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlkYXRhID0gc3Vic3RyaW5nRGF0YShkYXRhLCBvZmZzZXQsIGNvdW50KTsKLQkJCWlmIChkYXRhID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoZGF0YSk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJcmV0dXJuIHNvdXJjZTsKLQkJfQotCi0JCXJldHVybiBzdWJzdHJpbmdTb3VyY2UoZ2V0U291cmNlKCksIG9mZnNldCwgY291bnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlIGZvciB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5OiBvZmZzZXQ6IGRhdGEgb2Zmc2V0IGNvdW50OgotCSAqIGRhdGEgY291bnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdWJzdHJpbmdTb3VyY2UoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc3VyZSBvZmZzZXQgYW5kIGNvdW50IGFyZSBub24tbmVnYXRpdmUKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCi0JCS8vIGZpbmQgY2hhcmFjdGVyIHJlZmVyZW5jZQotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpZiAocmVmID49IGVuZCkKLQkJCQlicmVhazsKLQkJCWludCByZWZFbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKHJlZkVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgcmVmRW5kKTsKLQkJCQlpZiAoZ2V0Q2hhclZhbHVlKG5hbWUpICE9IG51bGwpIHsKLQkJCQkJLy8gZm91bmQsIHNoaWZ0IGZvciBzb3VyY2Ugb2Zmc2V0cwotCQkJCQlpbnQgcmVmQ291bnQgPSByZWZFbmQgLSByZWY7Ci0JCQkJCWlmIChyZWYgPCBvZmZzZXQpCi0JCQkJCQlvZmZzZXQgKz0gcmVmQ291bnQ7Ci0JCQkJCWlmIChyZWYgPCBlbmQpCi0JCQkJCQllbmQgKz0gcmVmQ291bnQ7Ci0JCQkJCXJlZiA9IHJlZkVuZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWYgPSBzb3VyY2UuaW5kZXhPZignJicsIHJlZiArIDEpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA+IGxlbmd0aCB8fCBlbmQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlcyBiZWZvcmUgYW5kIGFmdGVyIHRoZSByYW5nZSBzcGVjaWZpZWQgYnk6IG9mZnNldDogZGF0YQotCSAqIG9mZnNldCBjb3VudDogZGF0YSBjb3VudAotCSAqLwotCXByaXZhdGUgU3RyaW5nUGFpciBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzdXJlIG9mZnNldCBhbmQgY291bnQgYXJlIG5vbi1uZWdhdGl2ZQotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCWlmIChvZmZzZXQgPT0gMCAmJiBjb3VudCA9PSAwKQotCQkJCXJldHVybiBuZXcgU3RyaW5nUGFpcihudWxsLCBudWxsKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaW50IGVuZCA9IG9mZnNldCArIGNvdW50OwotCi0JCS8vIGZpbmQgY2hhcmFjdGVyIHJlZmVyZW5jZQotCQlpbnQgcmVmID0gc291cmNlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKHJlZiA+PSAwKSB7Ci0JCQlpZiAocmVmID49IGVuZCkKLQkJCQlicmVhazsKLQkJCWludCByZWZFbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKHJlZkVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgcmVmRW5kKTsKLQkJCQlpZiAoZ2V0Q2hhclZhbHVlKG5hbWUpICE9IG51bGwpIHsKLQkJCQkJLy8gZm91bmQsIHNoaWZ0IGZvciBzb3VyY2Ugb2Zmc2V0cwotCQkJCQlpbnQgcmVmQ291bnQgPSByZWZFbmQgLSByZWY7Ci0JCQkJCWlmIChyZWYgPCBvZmZzZXQpCi0JCQkJCQlvZmZzZXQgKz0gcmVmQ291bnQ7Ci0JCQkJCWlmIChyZWYgPCBlbmQpCi0JCQkJCQllbmQgKz0gcmVmQ291bnQ7Ci0JCQkJCXJlZiA9IHJlZkVuZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWYgPSBzb3VyY2UuaW5kZXhPZignJicsIHJlZiArIDEpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA+IGxlbmd0aCB8fCBlbmQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGZpcnN0ID0gKG9mZnNldCA+IDAgPyBzb3VyY2Uuc3Vic3RyaW5nKDAsIG9mZnNldCkgOiBudWxsKTsKLQkJU3RyaW5nIHNlY29uZCA9IChlbmQgPCBsZW5ndGggPyBzb3VyY2Uuc3Vic3RyaW5nKGVuZCwgbGVuZ3RoKSA6IG51bGwpOwotCQlyZXR1cm4gbmV3IFN0cmluZ1BhaXIoZmlyc3QsIHNlY29uZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaG9sZVRleHQoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IEltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAgICAvKioKLQkgKiBSZXBsYWNlcyB0aGUgdGV4dCBvZiB0aGUgY3VycmVudCBub2RlIGFuZCBhbGwgbG9naWNhbGx5LWFkamFjZW50IHRleHQKLQkgKiBub2RlcyB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dC4gQWxsIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0IG5vZGVzIGFyZQotCSAqIHJlbW92ZWQgaW5jbHVkaW5nIHRoZSBjdXJyZW50IG5vZGUgdW5sZXNzIGl0IHdhcyB0aGUgcmVjaXBpZW50IG9mIHRoZQotCSAqIHJlcGxhY2VtZW50IHRleHQuIDxicj4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBub2RlIHdoaWNoIHJlY2VpdmVkIHRoZSByZXBsYWNlbWVudCB0ZXh0LiBUaGUKLQkgKiByZXR1cm5lZCBub2RlIGlzOgotCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+bnVsbDwvY29kZT4sIHdoZW4gdGhlIHJlcGxhY2VtZW50IHRleHQgaXMgdGhlIGVtcHR5Ci0JICogc3RyaW5nOyA8L2xpPgotCSAqIDxsaT50aGUgY3VycmVudCBub2RlLCBleGNlcHQgd2hlbiB0aGUgY3VycmVudCBub2RlIGlzIHJlYWQtb25seTsgPC9saT4KLQkgKiA8bGk+IGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgb2YgdGhlIHNhbWUgdHlwZSAoCi0JICogPGNvZGU+VGV4dDwvY29kZT4gb3IgPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPikgYXMgdGhlIGN1cnJlbnQKLQkgKiBub2RlIGluc2VydGVkIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwbGFjZW1lbnQuIDwvbGk+Ci0JICogPC91bD4KLQkgKiA8YnI+Ci0JICogRm9yIGluc3RhbmNlLCBpbiB0aGUgYWJvdmUgZXhhbXBsZSBjYWxsaW5nCi0JICogPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4gb24gdGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdAotCSAqIGNvbnRhaW5zICJiYXIiIHdpdGggInlvIiBpbiBhcmd1bWVudCByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmc6IDxicj4KLQkgKiBXaGVyZSB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZCBhcmUgcmVhZC1vbmx5IGRlc2NlbmRhbnRzIG9mIGFuCi0JICogPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiwgdGhlIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4KLQkgKiBtdXN0IGJlIHJlbW92ZWQgaW5zdGVhZCBvZiB0aGUgcmVhZC1vbmx5IG5vZGVzLiBJZiBhbnkKLQkgKiA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IHRvIGJlIHJlbW92ZWQgaGFzIGRlc2NlbmRhbnRzIHRoYXQgYXJlCi0JICogbm90IDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4sIDxjb2RlPlRleHQ8L2NvZGU+LCBvcgotCSAqIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4gbm9kZXMsIHRoZSA8Y29kZT5yZXBsYWNlV2hvbGVUZXh0PC9jb2RlPgotCSAqIG1ldGhvZCBtdXN0IGZhaWwgYmVmb3JlIHBlcmZvcm1pbmcgYW55IG1vZGlmaWNhdGlvbiBvZiB0aGUgZG9jdW1lbnQsCi0JICogcmFpc2luZyBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUgY29kZQotCSAqIDxjb2RlPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjwvY29kZT4uIDxicj4KLQkgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBleGFtcGxlIGJlbG93IGNhbGxpbmcKLQkgKiA8Y29kZT5yZXBsYWNlV2hvbGVUZXh0PC9jb2RlPiBvbiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSB0aGF0Ci0JICogY29udGFpbnMgImJhciIgZmFpbHMsIGJlY2F1c2UgdGhlIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gbm9kZQotCSAqICJlbnQiIGNvbnRhaW5zIGFuIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IG5vZGUgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiAgICAgICAgICAgIFRoZSBjb250ZW50IG9mIHRoZSByZXBsYWNpbmcgPGNvZGU+VGV4dDwvY29kZT4gbm9kZS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICBjb250ZW50LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgb25lIG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzIGJlaW5nIHJlcGxhY2VkIGlzIHJlYWRvbmx5LgotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLSAgICBwdWJsaWMgVGV4dCByZXBsYWNlV2hvbGVUZXh0KFN0cmluZyBjb250ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTEdlbmVyYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MR2VuZXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M3ZWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MR2VuZXJhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTEdlbmVyYXRvckltcGwgaW1wbGVtZW50cyBJU291cmNlR2VuZXJhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfQ0xPU0UgPSAiXV0+IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX09QRU4gPSAiPCFbQ0RBVEFbIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfQ0xPU0UgPSAiLS0+IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfT1BFTiA9ICI8IS0tIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfT1BFTiA9ICI8IURPQ1RZUEUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfQ0xPU0UgPSAiIC8+IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9PUEVOID0gIjwvIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBYTUxHZW5lcmF0b3JJbXBsIGluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQ0xPU0UgPSAiPz4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfT1BFTiA9ICI8PyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfSUQgPSAiUFVCTElDIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9QUkVGSVggPSAic3NpIjsvLyROT04tTkxTLTEkCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0ZFQVRVUkUgPSAiU1NJIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9UT0tFTiA9ICIjIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9JRCA9ICJTWVNURU0iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIj4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIElTb3VyY2VHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgWE1MR2VuZXJhdG9ySW1wbCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JLy9wcml2YXRlIGJvb2xlYW4gaXNDb21tZW50VGFnKFhNTEVsZW1lbnQgZWxlbWVudCkgewotCS8vCWlmIChlbGVtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkvLwlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKWVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCS8vCWlmIChkb2N1bWVudCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JLy8JRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRUeXBlQWRhcHRlcigpOwotCS8vCWlmIChhZGFwdGVyID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkvLwlpZiAoIWFkYXB0ZXIuaGFzRmVhdHVyZShTU0lfRkVBVFVSRSkpIHJldHVybiBmYWxzZTsKLQkvLwlTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLQkvLwlyZXR1cm4gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoU1NJX1BSRUZJWCkpOwotCS8vfQotCS8qKgotCSAqIEhlbHBlciB0byBtb2RpZnkgdGhlIHRhZyBuYW1lIGluIHN1Yi1jbGFzc2VzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRUYWdOYW1lKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCB0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCSgoRWxlbWVudEltcGwpIGVsZW1lbnQpLnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogWE1MTW9kZWxHZW5lcmF0b3IgY29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIFhNTEdlbmVyYXRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUF0dHJOYW1lKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlpZiAoYXR0ck5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoYXR0ck5hbWUuc3RhcnRzV2l0aChKU1BUYWcuVEFHX09QRU4pKSB7Ci0JCQlpZiAoIWF0dHJOYW1lLmVuZHNXaXRoKEpTUFRhZy5UQUdfQ0xPU0UpKSB7Ci0JCQkJLy8gY2xvc2UgSlNQCi0JCQkJcmV0dXJuIChhdHRyTmFtZSArIEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJfQotCQl9Ci0JCWlmICgoKElET01BdHRyKSBhdHRyKS5pc0dsb2JhbEF0dHIoKSAmJiBDTU5vZGVVdGlsLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpICE9IG51bGwpIHsKLQkJCXN3aXRjaCAoZ2V0QXR0ck5hbWVDYXNlKGF0dHIpKSB7Ci0JCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLlVQUEVSX0NBU0UgOgotCQkJCQlhdHRyTmFtZSA9IGF0dHJOYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFIDoKLQkJCQkJYXR0ck5hbWUgPSBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJLy8gQVNJU19DQVNFCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0cikgewotCQlyZXR1cm4gZ2VuZXJhdGVBdHRyVmFsdWUoYXR0ciwgKGNoYXIpIDApOyAvLyBubyBxdW90ZSBwcmVmZXJlbmNlCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShBdHRyIGF0dHIsIGNoYXIgcXVvdGUpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlTb3VyY2VWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNvdXJjZVZhbGlkYXRvcihhdHRyKTsKLQkJU3RyaW5nIHZhbHVlID0gdmFsaWRhdG9yLmNvbnZlcnRTb3VyY2UoKChJRE9NTm9kZSkgYXR0cikuZ2V0VmFsdWVTb3VyY2UoKSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoaXNCb29sZWFuQXR0cihhdHRyKSkgewotCQkJCWlmICgoKEF0dHJJbXBsKSBhdHRyKS5pc1hNTEF0dHIoKSkgewotCQkJCQkvLyBnZW5lcmF0ZSB0aGUgbmFtZSBhcyB2YWx1ZQotCQkJCQl2YWx1ZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIG5vdCB0byBnZW5lcmF0ZSAnPScgYW5kIHZhbHVlIGZvciBIVE1MIGJvb2xlYW4KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBnZW5lcmF0ZUF0dHJWYWx1ZSh2YWx1ZSwgcXVvdGUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoU3RyaW5nIHZhbHVlLCBjaGFyIHF1b3RlKSB7Ci0JCS8vIGFzc3VtZSB0aGUgdmFsaWQgaXMgYWxyZWFkeSB2YWxpZGF0ZWQgbm90IHRvIGluY2x1ZGUgYm90aCBxdW90ZXMKLQkJaWYgKHF1b3RlID09ICciJykgewotCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiAodmFsdWUuaW5kZXhPZignIicpID49IDApKQotCQkJCXF1b3RlID0gJ1wnJzsgLy8gZm9yY2UKLQkJfSBlbHNlIGlmIChxdW90ZSA9PSAnXCcnKSB7Ci0JCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5pbmRleE9mKCdcJycpID49IDApKQotCQkJCXF1b3RlID0gJyInOyAvLyBmb3JjZQotCQl9IGVsc2UgeyAvLyBubyBwcmVmZXJlbmNlCi0JCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5pbmRleE9mKCciJykgPCAwKSkKLQkJCQlxdW90ZSA9ICciJzsKLQkJCWVsc2UKLQkJCQlxdW90ZSA9ICdcJyc7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUubGVuZ3RoKCkpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyAyKTsKLQkJYnVmZmVyLmFwcGVuZChxdW90ZSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZSk7Ci0JCWJ1ZmZlci5hcHBlbmQocXVvdGUpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVDREFUQVNlY3Rpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDREFUQVNlY3Rpb24oQ0RBVEFTZWN0aW9uIGNkYXRhKSB7Ci0JCWlmIChjZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGRhdGEgPSBjZGF0YS5nZXREYXRhKCk7Ci0JCWludCBsZW5ndGggPSAoZGF0YSAhPSBudWxsID8gZGF0YS5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyAxNik7Ci0JCWJ1ZmZlci5hcHBlbmQoQ0RBVEFfT1BFTik7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGRhdGEpOwotCQlidWZmZXIuYXBwZW5kKENEQVRBX0NMT1NFKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQ2hpbGQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFwYXJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IHBhcmVudE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCVN0cmluZyBjaGlsZFNvdXJjZSA9IGdlbmVyYXRlU291cmNlKGNoaWxkKTsKLQkJCWlmIChjaGlsZFNvdXJjZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoY2hpbGRTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQ2xvc2VUYWcoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQkJCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCQlyZXR1cm4gSlNQVGFnLkNPTU1FTlRfQ0xPU0U7Ci0JCQkJCXJldHVybiBDT01NRU5UX0NMT1NFOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJCQlyZXR1cm4gSlNQVGFnLlRBR19DTE9TRTsKLQkJCQlpZiAoZWxlbWVudC5pc0VtcHR5VGFnKCkpCi0JCQkJCXJldHVybiBFTVBUWV9DTE9TRTsKLQkJCQlyZXR1cm4gVEFHX0NMT1NFOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlDb21tZW50SW1wbCBjb21tZW50ID0gKENvbW1lbnRJbXBsKSBub2RlOwotCQkJCWlmIChjb21tZW50LmlzSlNQVGFnKCkpCi0JCQkJCXJldHVybiBKU1BUYWcuQ09NTUVOVF9DTE9TRTsKLQkJCQlyZXR1cm4gQ09NTUVOVF9DTE9TRTsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCXJldHVybiBUQUdfQ0xPU0U7Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQlyZXR1cm4gUElfQ0xPU0U7Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCQlyZXR1cm4gQ0RBVEFfQ0xPU0U7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlQ29tbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDb21tZW50KENvbW1lbnQgY29tbWVudCkgewotCQlpZiAoY29tbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGRhdGEgPSBjb21tZW50LmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9IChkYXRhICE9IG51bGwgPyBkYXRhLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDgpOwotCQlDb21tZW50SW1wbCBpbXBsID0gKENvbW1lbnRJbXBsKSBjb21tZW50OwotCQlpZiAoIWltcGwuaXNKU1BUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUVOVF9PUEVOKTsKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuQ09NTUVOVF9PUEVOKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCWlmICghaW1wbC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZChDT01NRU5UX0NMT1NFKTsKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuQ09NTUVOVF9DTE9TRSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZURvY3R5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRvY1R5cGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVEb2N0eXBlKERvY3VtZW50VHlwZSBkb2NUeXBlKSB7Ci0JCWlmIChkb2NUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IGRvY1R5cGUuZ2V0TmFtZSgpOwotCQlpbnQgbGVuZ3RoID0gKG5hbWUgIT0gbnVsbCA/IG5hbWUubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgMTYpOwotCQlidWZmZXIuYXBwZW5kKERPQ1RZUEVfT1BFTik7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCURvY3VtZW50VHlwZUltcGwgZHQgPSAoRG9jdW1lbnRUeXBlSW1wbCkgZG9jVHlwZTsKLQkJU3RyaW5nIHB1YmxpY0lEID0gZHQuZ2V0UHVibGljSWQoKTsKLQkJU3RyaW5nIHN5c3RlbUlEID0gZHQuZ2V0U3lzdGVtSWQoKTsKLQkJaWYgKHB1YmxpY0lEICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoUFVCTElDX0lEKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJCWJ1ZmZlci5hcHBlbmQocHVibGljSUQpOwotCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJaWYgKHN5c3RlbUlEICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJCWJ1ZmZlci5hcHBlbmQoc3lzdGVtSUQpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChzeXN0ZW1JRCAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJCWJ1ZmZlci5hcHBlbmQoU1lTVEVNX0lEKTsKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJCWJ1ZmZlci5hcHBlbmQoc3lzdGVtSUQpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJCX0KLQkJfQotCQlidWZmZXIuYXBwZW5kKCc+Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVsZW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGlmIGVtcHR5IHRhZyBpcyBwcmVmZXJyYWJsZSwgZ2VuZXJhdGUgYXMgZW1wdHkgdGFnCi0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChpbXBsLnByZWZlckVtcHR5VGFnKCkpCi0JCQlpbXBsLnNldEVtcHR5VGFnKHRydWUpOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBzdGFydFRhZyA9IGdlbmVyYXRlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCWlmIChzdGFydFRhZyAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzdGFydFRhZyk7Ci0JCVN0cmluZyBjaGlsZCA9IGdlbmVyYXRlQ2hpbGQoZWxlbWVudCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChjaGlsZCk7Ci0JCVN0cmluZyBlbmRUYWcgPSBnZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJaWYgKGVuZFRhZyAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotCQkvLyBmaXJzdCBjaGVjayBpZiB0YWcgYWRhcHRlciBleGlzdHMKLQkJVGFnQWRhcHRlciBhZGFwdGVyID0gKFRhZ0FkYXB0ZXIpIGltcGwuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZW5kVGFnID0gYWRhcHRlci5nZXRFbmRUYWcoaW1wbCk7Ci0JCQlpZiAoZW5kVGFnICE9IG51bGwpCi0JCQkJcmV0dXJuIGVuZFRhZzsKLQkJfQotCi0JCWlmIChpbXBsLmlzRW1wdHlUYWcoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWltcGwuaXNDb250YWluZXIoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaW1wbC5pc0pTUFRhZygpKQotCQkJcmV0dXJuIEpTUFRhZy5UQUdfQ0xPU0U7Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCWludCBsZW5ndGggPSAodGFnTmFtZSAhPSBudWxsID8gdGFnTmFtZS5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA0KTsKLQkJYnVmZmVyLmFwcGVuZChFTkRfT1BFTik7Ci0JCWlmICh0YWdOYW1lICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQlidWZmZXIuYXBwZW5kKCc+Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVudGl0eVJlZiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZW50aXR5UmVmCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRW50aXR5UmVmKEVudGl0eVJlZmVyZW5jZSBlbnRpdHlSZWYpIHsKLQkJaWYgKGVudGl0eVJlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBlbnRpdHlSZWYuZ2V0Tm9kZU5hbWUoKTsKLQkJaW50IGxlbmd0aCA9IChuYW1lICE9IG51bGwgPyBuYW1lLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDQpOwotCQlidWZmZXIuYXBwZW5kKCcmJyk7Ci0JCWlmIChuYW1lICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQlidWZmZXIuYXBwZW5kKCc7Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVBJIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBwaQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVBJKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkgewotCQlpZiAocGkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB0YXJnZXQgPSBwaS5nZXRUYXJnZXQoKTsKLQkJU3RyaW5nIGRhdGEgPSBwaS5nZXREYXRhKCk7Ci0JCWludCBsZW5ndGggPSAodGFyZ2V0ICE9IG51bGwgPyB0YXJnZXQubGVuZ3RoKCkgOiAwKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWxlbmd0aCArPSBkYXRhLmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA4KTsKLQkJYnVmZmVyLmFwcGVuZChQSV9PUEVOKTsKLQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCh0YXJnZXQpOwotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGRhdGEpOwotCQlidWZmZXIuYXBwZW5kKFBJX0NMT1NFKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlU291cmNlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVNvdXJjZShOb2RlIG5vZGUpIHsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZUVsZW1lbnQoKEVsZW1lbnQpIG5vZGUpOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlVGV4dCgoVGV4dCkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVDb21tZW50KChDb21tZW50KSBub2RlKTsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZURvY3R5cGUoKERvY3VtZW50VHlwZSkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVQSSgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKTsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZUNEQVRBU2VjdGlvbigoQ0RBVEFTZWN0aW9uKSBub2RlKTsKLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZUVudGl0eVJlZigoRW50aXR5UmVmZXJlbmNlKSBub2RlKTsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIERPQ1VNRU5UCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYXRlQ2hpbGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVTdGFydFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgRWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0KLQkJaWYgKGltcGwuaXNKU1BUYWcoKSkgewotCQkJLy8gY2hlY2sgaWYgSlNQIGNvbnRlbnQgdHlwZSBhbmQgSlNQIERvY3VtZW50Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmlzSlNQVHlwZSgpKSB7Ci0JCQkJaWYgKGRvY3VtZW50LmlzSlNQRG9jdW1lbnQoKSAmJiAhaW1wbC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJaW1wbC5zZXRKU1BUYWcoZmFsc2UpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW1wbC5zZXRKU1BUYWcoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWlmIChpbXBsLmlzQ29tbWVudFRhZygpICYmIGltcGwuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpID09IG51bGwpIHsKLQkJCUNvbW1lbnRFbGVtZW50UmVnaXN0cnkgcmVnaXN0cnkgPSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCQlyZWdpc3RyeS5zZXR1cENvbW1lbnRFbGVtZW50KGltcGwpOwotCQl9Ci0KLQkJLy8gZmlyc3QgY2hlY2sgaWYgdGFnIGFkYXB0ZXIgZXhpc3RzCi0JCVRhZ0FkYXB0ZXIgYWRhcHRlciA9IChUYWdBZGFwdGVyKSBpbXBsLmdldEV4aXN0aW5nQWRhcHRlcihUYWdBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHN0YXJ0VGFnID0gYWRhcHRlci5nZXRTdGFydFRhZyhpbXBsKTsKLQkJCWlmIChzdGFydFRhZyAhPSBudWxsKQotCQkJCXJldHVybiBzdGFydFRhZzsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJaWYgKGltcGwuaXNDb21tZW50VGFnKCkpIHsKLQkJCWlmIChpbXBsLmlzSlNQVGFnKCkpCi0JCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuQ09NTUVOVF9PUEVOKTsKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKENPTU1FTlRfT1BFTik7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfSBlbHNlIGlmIChpbXBsLmlzSlNQVGFnKCkpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoSlNQVGFnLlRBR19PUEVOKTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQkJaWYgKGltcGwuaXNDb250YWluZXIoKSkKLQkJCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7IC8vIEpTUCBjb250YWluZXIKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJzwnKTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBnZW5lcmF0ZUF0dHJOYW1lKGF0dHIpOwotCQkJaWYgKGF0dHJOYW1lICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChhdHRyTmFtZSk7Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gZ2VuZXJhdGVBdHRyVmFsdWUoYXR0cik7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkvLyBhdHRyIG5hbWUgb25seSBmb3IgSFRNTCBib29sZWFuIGFuZCBKU1AKLQkJCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyVmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGNsb3NlVGFnID0gZ2VuZXJhdGVDbG9zZVRhZyhlbGVtZW50KTsKLQkJaWYgKGNsb3NlVGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVRhZ05hbWUoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSURPTUVsZW1lbnQgeGUgPSAoSURPTUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHhlLmlzSlNQVGFnKCkpIHsKLQkJCWlmICh0YWdOYW1lLmVxdWFscyhKU1BUYWcuSlNQX0VYUFJFU1NJT04pKQotCQkJCXJldHVybiBKU1BUYWcuRVhQUkVTU0lPTl9UT0tFTjsKLQkJCWlmICh0YWdOYW1lLmVxdWFscyhKU1BUYWcuSlNQX0RFQ0xBUkFUSU9OKSkKLQkJCQlyZXR1cm4gSlNQVGFnLkRFQ0xBUkFUSU9OX1RPS0VOOwotCQkJaWYgKHRhZ05hbWUuZXF1YWxzKEpTUFRhZy5KU1BfRElSRUNUSVZFKSkKLQkJCQlyZXR1cm4gSlNQVGFnLkRJUkVDVElWRV9UT0tFTjsKLQkJCWlmICh0YWdOYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLkpTUF9ESVJFQ1RJVkUpKSB7Ci0JCQkJaW50IG9mZnNldCA9IEpTUFRhZy5KU1BfRElSRUNUSVZFLmxlbmd0aCgpICsgMTsgLy8gYWZ0ZXIgJy4nCi0JCQkJcmV0dXJuIChKU1BUYWcuRElSRUNUSVZFX1RPS0VOICsgdGFnTmFtZS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gKHhlLmlzQ29tbWVudFRhZygpKSA/IHRhZ05hbWUgOiBudWxsOwotCQl9IGVsc2UgaWYgKHRhZ05hbWUuc3RhcnRzV2l0aChKU1BUYWcuVEFHX09QRU4pKSB7Ci0JCQlpZiAoIXRhZ05hbWUuZW5kc1dpdGgoSlNQVGFnLlRBR19DTE9TRSkpIHsKLQkJCQkvLyBjbG9zZSBKU1AKLQkJCQlyZXR1cm4gKHRhZ05hbWUgKyBKU1BUYWcuVEFHX0NMT1NFKTsKLQkJCX0KLQkJfSBlbHNlIGlmICh4ZS5pc0NvbW1lbnRUYWcoKSkgewotCQkJU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JCQlpZiAocHJlZml4LmVxdWFscyhTU0lfUFJFRklYKSkgewotCQkJCXJldHVybiAoU1NJX1RPS0VOICsgZWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIXhlLmlzSlNQVGFnKCkgJiYgeGUuaXNHbG9iYWxUYWcoKSAmJiAvLyBnbG9iYWwgdGFnCi0JCQkJCQlDTU5vZGVVdGlsLmdldEVsZW1lbnREZWNsYXJhdGlvbih4ZSkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuZXdOYW1lID0gdGFnTmFtZTsKLQkJCQlzd2l0Y2ggKGdldFRhZ05hbWVDYXNlKHhlKSkgewotCQkJCQljYXNlIERvY3VtZW50VHlwZUFkYXB0ZXIuVVBQRVJfQ0FTRSA6Ci0JCQkJCQluZXdOYW1lID0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFIDoKLQkJCQkJCW5ld05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKG5ld05hbWUgIT0gdGFnTmFtZSkgewotCQkJCQl0YWdOYW1lID0gbmV3TmFtZTsKLQkJCQkJc2V0VGFnTmFtZShlbGVtZW50LCB0YWdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVUZXh0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVRleHQoVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVGV4dEltcGwgaW1wbCA9IChUZXh0SW1wbCkgdGV4dDsKLQkJU3RyaW5nIHNvdXJjZSA9IGltcGwuZ2V0VGV4dFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gc291cmNlOwotCQlyZXR1cm4gZ2VuZXJhdGVUZXh0RGF0YSh0ZXh0LCBpbXBsLmdldERhdGEoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVRleHREYXRhKFRleHQgdGV4dCwgU3RyaW5nIGRhdGEpIHsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVRleHRJbXBsIGltcGwgPSAoVGV4dEltcGwpIHRleHQ7Ci0JCWlmIChpbXBsLmlzSlNQQ29udGVudCgpIHx8IGltcGwuaXNDREFUQUNvbnRlbnQoKSkgewotCQkJcmV0dXJuIG5ldyBTb3VyY2VWYWxpZGF0b3IoaW1wbCkuY29udmVydFNvdXJjZShkYXRhKTsKLQkJfQotCQlTdHJpbmcgc291cmNlID0gZGF0YTsKLQotCQkvLyBjb252ZXJ0IHNwZWNpYWwgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgZW50aXRpZXMKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBnZXRDaGFyTmFtZShkYXRhLmNoYXJBdChpKSk7Ci0JCQlpZiAobmFtZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCQlpZiAoaSA+IG9mZnNldCkKLQkJCQlidWZmZXIuYXBwZW5kKGRhdGEuc3Vic3RyaW5nKG9mZnNldCwgaSkpOwotCQkJYnVmZmVyLmFwcGVuZCgnJicpOwotCQkJYnVmZmVyLmFwcGVuZChuYW1lKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJzsnKTsKLQkJCW9mZnNldCA9IGkgKyAxOwotCQl9Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWYgKGxlbmd0aCA+IG9mZnNldCkKLQkJCQlidWZmZXIuYXBwZW5kKGRhdGEuc3Vic3RyaW5nKG9mZnNldCkpOwotCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGludCBnZXRBdHRyTmFtZUNhc2UoQXR0ciBhdHRyKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGF0dHIuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFOwotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFOwotCQlyZXR1cm4gYWRhcHRlci5nZXRBdHRyTmFtZUNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDaGFyTmFtZShjaGFyIGMpIHsKLQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICc8JyA6Ci0JCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkxUX05BTUU7Ci0JCQljYXNlICc+JyA6Ci0JCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkdUX05BTUU7Ci0JCQljYXNlICcmJyA6Ci0JCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkFNUF9OQU1FOwotCQkJY2FzZSAnIicgOgotCQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5RVU9UX05BTUU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VGFnTmFtZUNhc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFOwotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFOwotCQlyZXR1cm4gYWRhcHRlci5nZXRUYWdOYW1lQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0Jvb2xlYW5BdHRyKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGRlY2wgPSBDTU5vZGVVdGlsLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDTURhdGFUeXBlIHR5cGUgPSBkZWNsLmdldEF0dHJUeXBlKCk7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB2YWx1ZXNbXSA9IHR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQlpZiAodmFsdWVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAodmFsdWVzLmxlbmd0aCA9PSAxICYmIHZhbHVlc1swXS5lcXVhbHMoZGVjbC5nZXRBdHRyTmFtZSgpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzk5ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBYTUxNb2RlbENvbnRleHQgY2xhc3MKLSAqLwotY2xhc3MgWE1MTW9kZWxDb250ZXh0IHsKLQlwcml2YXRlIE5vZGUgbmV4dE5vZGUgPSBudWxsOwotCXByaXZhdGUgTm9kZSBwYXJlbnROb2RlID0gbnVsbDsKLQotCS8vCXByaXZhdGUgWE1MTW9kZWxJbXBsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE5vZGUgcm9vdE5vZGUgPSBudWxsOwotCi0JLyoqCi0JICogWE1MTW9kZWxDb250ZXh0IGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHJvb3ROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JWE1MTW9kZWxDb250ZXh0KE5vZGUgcm9vdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogZmluZEVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUVsZW1lbnQgZmluZEVuZFRhZyhTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoTm9kZSBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWJyZWFrOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQlpZiAoZWxlbWVudC5tYXRjaFRhZ05hbWUodGFnTmFtZSkpCi0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCS8vIGlmIGFuY2VzdG9yIGVsZW1lbnQgaGFzIGVuZCB0YWcgc3RvcCBzZWFyY2gKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChlbGVtZW50LmdldE5leHRTaWJsaW5nKCkgIT0gbnVsbCkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCVRleHQgZmluZE5leHRUZXh0KCkgewotCQlOb2RlIG5vZGUgPSB0aGlzLm5leHROb2RlOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSAhPSB0aGlzLm5leHROb2RlICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5vZGU7Ci0JCQkJLy8gc2tpcCBlbXB0eSB0ZXh0Ci0JCQkJaWYgKHRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQl9Ci0JCQlOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCW5vZGUgPSBjaGlsZDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCQlub2RlID0gbmV4dDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBmaW5kUHJldmlvdXNUZXh0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uVGV4dAotCSAqLwotCVRleHQgZmluZFByZXZpb3VzVGV4dCgpIHsKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpCi0JCQlub2RlID0gdGhpcy5uZXh0Tm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJZWxzZQotCQkJbm9kZSA9IHRoaXMucGFyZW50Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChUZXh0KSBub2RlOwotCX0KLQotCS8qKgotCSAqIGZpbmRTdGFydFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUVsZW1lbnQgZmluZFN0YXJ0VGFnKFN0cmluZyB0YWdOYW1lLCBTdHJpbmcgcm9vdE5hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGNoZWNrIHByZXZpb3VzIGZvciBlbXB0eSBjb250ZW50IGVsZW1lbnQKLQkJTm9kZSBwcmV2ID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCXByZXYgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQllbHNlIGlmICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkKLQkJCXByZXYgPSB0aGlzLnBhcmVudE5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwcmV2OwotCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpICYmICFlbGVtZW50LmlzRW1wdHlUYWcoKSAmJiBlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCi0JCWZvciAoTm9kZSBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQlpZiAoZWxlbWVudC5tYXRjaFRhZ05hbWUodGFnTmFtZSkpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQlpZiAocm9vdE5hbWUgIT0gbnVsbCAmJiBlbGVtZW50Lm1hdGNoVGFnTmFtZShyb290TmFtZSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlIGdldE5leHROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRSb290Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlIGdldFJvb3ROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5yb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRMYXN0IG1ldGhvZAotCSAqLwotCXZvaWQgc2V0TGFzdCgpIHsKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIHByZXYgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgPT0gbnVsbCB8fCBwcmV2LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcHJldjsKLQkJCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpIHx8ICFlbGVtZW50LmlzQ29udGFpbmVyKCkgfHwgZWxlbWVudC5pc0VtcHR5VGFnKCkpCi0JCQkJcmV0dXJuOwotCQkJc2V0UGFyZW50Tm9kZShwcmV2KTsKLQkJfQotCi0JCS8vIGZpbmQgbGFzdCBvcGVuIHBhcmVudAotCQlOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKLQkJTm9kZSBsYXN0ID0gcGFyZW50LmdldExhc3RDaGlsZCgpOwotCQl3aGlsZSAobGFzdCAhPSBudWxsKSB7Ci0JCQlpZiAobGFzdC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWJyZWFrOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbGFzdDsKLQkJCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpIHx8ICFlbGVtZW50LmlzQ29udGFpbmVyKCkgfHwgZWxlbWVudC5pc0VtcHR5VGFnKCkpCi0JCQkJYnJlYWs7Ci0JCQlwYXJlbnQgPSBlbGVtZW50OwotCQkJbGFzdCA9IHBhcmVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJfQotCQlpZiAocGFyZW50ICE9IHRoaXMucGFyZW50Tm9kZSkKLQkJCXNldFBhcmVudE5vZGUocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV4dE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHNldE5leHROb2RlKE5vZGUgbmV4dE5vZGUpIHsKLQkJdGhpcy5uZXh0Tm9kZSA9IG5leHROb2RlOwotCQlpZiAobmV4dE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5wYXJlbnROb2RlID0gbmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCX0KLQotCS8qKgotCSAqIHNldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHNldFBhcmVudE5vZGUoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0JCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxOb3RpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhM2UyNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiAKLSAqIFhNTE1vZGVsTm90aWZpZXIgbWFuYWdlcyB0aGUgbm90aWZpY2F0aW9uIHByb2Nlc3MuIENsaWVudHMgc2hvdWxkIG5vdCB1c2UKLSAqIGV4dGVuZCBvciByZWZlcmVuY2UuCi0gKiAKLSAqIElTU1VFOiBzaG91bGQgYmUgaW50ZXJuYWxpemVkLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MTW9kZWxOb3RpZmllciB7Ci0KLQkvKioKLQkgKiBhdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0Jdm9pZCBhdHRyUmVwbGFjZWQoRWxlbWVudCBlbGVtZW50LCBBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cik7Ci0KLQkvKioKLQkgKiBTaWduYWwgdGhhdCBjaGFuZ2luZyBpcyBzdGFydGluZy4KLQkgKiAKLQkgKi8KLQl2b2lkIGJlZ2luQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIFNpZ25hbCB0aGF0IGNoYW5naW5nIGlzIHN0YXJ0aW5nIHdpdGggYSBicmFuZCBuZXcgbW9kZWwuCi0JICogCi0JICovCi0Jdm9pZCBiZWdpbkNoYW5naW5nKGJvb2xlYW4gbmV3TW9kZWwpOwotCi0JLyoqCi0JICogQ2FuY2VsIHBlbmRpbmcgbm90aWZpY2F0aW9ucy4gVGhpcyBpcyBjYWxsZWQgaW4gdGhlIGNvbnRleHQgb2YKLQkgKiAicmVpbml0aWFsaXphdGlvbiIgc28gaXMgYXNzdW1lZCBBTEwgbm90aWZpY2F0aW9ucyBjYW4gYmUgc2FmZWx5Ci0JICogY2FuY2VsZWQsIGFzc3VtaW5nIHRoYXQgb25jZSBmYWN0b3JpZXMgYW5kIGFkYXB0ZXJzIGFyZSByZS1pbml0aWFsaXplZAotCSAqIHRoZXkgd2lsbCBiZSByZS1ub3RpZmllZCBhcyB0ZXh0IGlzIHNldCBpbiBtb2RlbCwgaWYgc3RpbGwgYXBwcm9wcmlhdGUuCi0JICovCi0Jdm9pZCBjYW5jZWxQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBjaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBjaGlsZFJlcGxhY2VkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCk7Ci0KLQkvKioKLQkgKiBFZGl0YWJsZSBzdGF0ZSBjaGFuZ2VkIGZvciBub2RlLgotCSAqIAotCSAqLwotCXZvaWQgZWRpdGFibGVDaGFuZ2VkKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBTaWduYWwgY2hhbmdpbmcgaXMgZmluaXNoZWQuCi0JICogCi0JICovCi0Jdm9pZCBlbmRDaGFuZ2luZygpOwotCi0JLyoqCi0JICogU2lnbmFsIGVuZCB0YWcgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIAotCSAqLwotCXZvaWQgZW5kVGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogVXNlZCB0byByZWZsZWN0IHN0YXRlIG9mIG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBtb2RlbCBoYWQgY2hhbmdlZC4KLQkgKiAKLQkgKi8KLQlib29sZWFuIGhhc0NoYW5nZWQoKTsKLQotCS8qKgotCSAqIFVzZWQgdG8gcmVmbGVjdCBzdGF0ZSBvZiBwYXJzaW5nIHByb2Nlc3MuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIG1vZGVsIGlzIGN1cnJlbnRseSBjaGFuZ2luZy4KLQkgKi8KLQlib29sZWFuIGlzQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIHNpZ25hbCBwcm9wZXJ0eSBjaGFuZ2VkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQl2b2lkIHByb3BlcnR5Q2hhbmdlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogc2lnbmFsIHN0YXJ0IHRhZyBjaGFuZ2VkCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQl2b2lkIHN0YXJ0VGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogc2lnbmFsIHN0cnVjdHVyZWQgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXZvaWQgc3RydWN0dXJlQ2hhbmdlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogdmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCB2YWx1ZUNoYW5nZWQoTm9kZSBub2RlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWY4OWEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxOb3RpZmllckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbE5vdGlmaWVySW1wbCBpbXBsZW1lbnRzIFhNTE1vZGVsTm90aWZpZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm90aWZ5RXZlbnQgewotCQlPYmplY3QgY2hhbmdlZEZlYXR1cmU7Ci0JCWJvb2xlYW4gZGlzY2FyZGVkOwotCQlPYmplY3QgbmV3VmFsdWU7Ci0JCS8vIG5vdGU6IGRvbid0IGluaXRpYWxpemUgaW5zdGFuY2UgdmFyaWFibGVzLCBzaW5jZQotCQkvLyB0aGF0IGNhdXNlcyBkb3VibGUgYXNzaWdubWVudHMsIGFuZCBsb3RzIG9mIHRoZXNlIGFyZSBjcmVhdGVkLgotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyOwotCQlPYmplY3Qgb2xkVmFsdWU7Ci0JCWludCBwb3M7Ci0JCVN0cmluZyByZWFzb247Ci0JCWludCB0eXBlOwotCQlpbnQgaW5kZXg7Ci0KLQkJTm90aWZ5RXZlbnQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IHR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJCXRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLmNoYW5nZWRGZWF0dXJlID0gY2hhbmdlZEZlYXR1cmU7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCQl0aGlzLnBvcyA9IHBvczsKLQkJCXRoaXMucmVhc29uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBRERFRF9USEVOX1JFTU9WRUQgPSAiRGlzY2FyZDogQWRkZWQgdGhlbiByZW1vdmVkIHJ1bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmT3B0aW1pemVEZWZlcnJlZCA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmT3B0aW1pemVEZWZlcnJlZEFjY29yZGluZ1RvUGFyZW50QWRkZWQgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZk9wdGltaXplRGVmZXJyZWRBY2NvcmRpbmdUb1BhcmVudFJlbW92ZWQgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVJFTlRfSVNfQURERUQgPSAiRGlzYXJkZWQ6IFBhcmVudCBoYXMganVzdCBiZWVuIGFkZGVkIjsgLy8kTk9OLU5MUy0xJAotCS8qIHN0YXJ0OiBmb3IgZGVidWdnaW5nIG9ubHkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSRU5UX0lTX1JFTU9WRURfVE9PID0gIkRpc2NhcmQ6IFBhcmVudCB3YXMgcmVtb3ZlZCB0b28iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkVOVF9JU19SRVBBUkVOVEVEID0gIk5vdCBEaXNjYXJkOiBQYXJlbnQgd2FzIHJlbW92ZWQgc28gdGhpcyBpbXBsaWVzIHJlcGFyZW50aW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTm9kZSBjaGFuZ2VkUm9vdCA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdpbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZG9pbmdOZXdNb2RlbCA9IGZhbHNlOwotCXByaXZhdGUgTGlzdCBmRXZlbnRzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZmx1c2hpbmcgPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBYTUxNb2RlbE5vdGlmaWVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIHZvaWQgYXR0clJlcGxhY2VkKEVsZW1lbnQgZWxlbWVudCwgQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQXR0ciBhdHRyID0gbnVsbDsKLQkJU3RyaW5nIG9sZFZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsKLQkJaWYgKG9sZEF0dHIgIT0gbnVsbCkgewotCQkJYXR0ciA9IG9sZEF0dHI7Ci0JCQlvbGRWYWx1ZSA9IG9sZEF0dHIuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyID0gbmV3QXR0cjsKLQkJCW5ld1ZhbHVlID0gbmV3QXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBlbGVtZW50OwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgYXR0ciwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQobm90aWZpZXIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luQ2hhbmdpbmcoKSB7Ci0JCXRoaXMuY2hhbmdpbmcgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luQ2hhbmdpbmcoYm9vbGVhbiBuZXdNb2RlbCkgewotCQliZWdpbkNoYW5naW5nKCk7Ci0JCXRoaXMuZG9pbmdOZXdNb2RlbCA9IG5ld01vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGNhbmNlbFBlbmRpbmcoKSB7Ci0JCS8vIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHRoaXMgYXJyYXksIHNpbmNlCi0JCS8vIHRoZSBhcnJheSBtYXkgYmUgYmVpbmcgcHJvY2Vzc2VkLCBpbiB0aGUgZGVmZXJyZWQgbm90aWZpY2F0aW9uCi0JCS8vIGxvb3AsIGJ1dCB3ZSBjYW4gc2lnbmFsIHRoYXQgYWxsCi0JCS8vIHNob3VsZCBiZSBkaXNjYXJkZWQsIHNvIGFueSByZW1haW5pbmcgb25lcyB3aWxsIGJlIGlnbm9yZWQuCi0JCWlmICh0aGlzLmZFdmVudHMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmRXZlbnRzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIGZFdmVudHMuZ2V0KGkpOwotCQkJCWV2ZW50LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gdGhpcyBjYW5jZWwgaXMgcHJlc3VtYWJseSBiZWluZyBjYWxsZWQgYXMgYSBmdW5jdGlvbiBvZgotCQkvLyAicmVpbml0aWFpbGl6YXRpb24iIHNvIHdlIGNhbiBpZ25vcmUgY2hhbmdlcyB0byB0aGUKLQkJLy8gb2xkIHJvb3QsIGFuZCBjaGFuZ2VzIHRvIHRoZSBuZXcgb25lIHdpbGwgYmUgdHJpZ2dlcmVkIGR1cmluZwotCQkvLyByZWluaXRpYWxpemF0aW9uLgotCQljaGFuZ2VkUm9vdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogY2hpbGRSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIGNoaWxkUmVwbGFjZWQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBwYXJlbnROb2RlOwotCQlpbnQgdHlwZSA9IElOb2RlTm90aWZpZXIuQ0hBTkdFOwotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBJTm9kZU5vdGlmaWVyLlJFTU9WRTsKLQkJZWxzZSBpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBJTm9kZU5vdGlmaWVyLkFERDsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgdHlwZSwgb2xkQ2hpbGQsIG9sZENoaWxkLCBuZXdDaGlsZCwgb2Zmc2V0KTsKLQkJc3RydWN0dXJlQ2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZWRpdGFibGVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBub3RpZmllciA9IChJRE9NTm9kZSkgbm9kZTsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgSU5vZGVOb3RpZmllci5DSEFOR0UsIG51bGwsIG51bGwsIG51bGwsIG9mZnNldCk7Ci0JCXByb3BlcnR5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZW5kQ2hhbmdpbmcoKSB7Ci0JCXRoaXMuZG9pbmdOZXdNb2RlbCA9IGZhbHNlOwotCQlpZiAoIXRoaXMuY2hhbmdpbmcpCi0JCQlyZXR1cm47IC8vIGF2b2lkIG5lc3RpbmcgY2FsbHMKLQkJbm90aWZ5RGVmZXJyZWQoKTsKLQkJaWYgKHRoaXMuY2hhbmdlZFJvb3QgIT0gbnVsbCkgewotCQkJbm90aWZ5U3RydWN0dXJlQ2hhbmdlZCh0aGlzLmNoYW5nZWRSb290KTsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJU3RyaW5nIHAgPSB0aGlzLmNoYW5nZWRSb290LmdldE5vZGVOYW1lKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZWZlcnJlZCBTVFJVQ1RVUkVfQ0hBTkdFRDogIiArIHApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmNoYW5nZWRSb290ID0gbnVsbDsKLQkJfQotCQl0aGlzLmNoYW5naW5nID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZW5kVGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU5vZGUgbm90aWZpZXIgPSAoSURPTU5vZGUpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBudWxsLCBudWxsLCBudWxsLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuICh0aGlzLmZFdmVudHMgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeShJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jaGFuZ2luZyAmJiAhdGhpcy5mbHVzaGluZykgewotCQkJLy8gZGVmZXIgbm90aWZpY2F0aW9uCi0JCQlpZiAodGhpcy5mRXZlbnRzID09IG51bGwpCi0JCQkJdGhpcy5mRXZlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gd2UgZG8gbm90IGRlZmVyIGFueXRoaW5nIGlmIHdlIGFyZSBkb2luZyBhIG5ldyBNb2RlbCwKLQkJCS8vIGV4Y2VwdCBmb3IgdGhlIGRvY3VtZW50IGV2ZW50LCBzaW5jZSBhbGwgb3RoZXJzIGFyZQotCQkJLy8gdHJpdmlhbCBhbmQgbm90IG5lZWRlZCBhdCB0aGF0IGluaXRpYWwgcG9pbnQuCi0JCQkvLyBCdXQgZXZlbiBmb3IgdGhhdCBvbmUgZG9jdW1lbnQgZXZlbnQsIGluIHRoZSBuZXcgbW9kZWwgY2FzZSwKLQkJCS8vIGl0IGlzIHN0aWxsIGltcG9ydGFudCB0byBkZWZlciBpdC4KLQkJCWlmICgoIWRvaW5nTmV3TW9kZWwpIHx8ICgoKE5vZGUpIG5vdGlmaWVyKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCQl0aGlzLmZFdmVudHMuYWRkKG5ldyBOb3RpZnlFdmVudChub3RpZmllciwgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJLy8gSXRzIGltcG9ydGFudCB0byAia2VlcCBnb2luZyIgaWYgZXhjZXB0aW9uIG9jY3Vycywgc2luY2UgdGhpcwotCQkJLy8gbm90aWZpY2F0aW9uCi0JCQkvLyBjb21lcyBpbiBiZXR3ZWVuICJhYm91dCB0byBjaGFuZ2UiIGFuZCAiY2hhbmdlZCIgZXZlbnRzLiBXZSBkbwotCQkJLy8gbG9nLCBob3dldmVyLAotCQkJLy8gc2luY2Ugd291bGQgaW5kaWNhdGUgYSBwcm9ncmFtIGVycm9yLgotCQkJbm90aWZpZXIubm90aWZ5KGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkEgc3RydWN0dXJlZCBtb2RlbCBjbGllbnQgdGhyZXcgZm9sbG93aW5nIGV4Y2VwdGlvbiBkdXJpbmcgYWRhcHRlciBub3RpZmljYXRpb24gKCIgKyBJTm9kZU5vdGlmaWVyLkVWRU5UX1RZUEVfU1RSSU5HU1tldmVudFR5cGVdICsgIiApIiwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeURlZmVycmVkKCkgewotCQlpZiAodGhpcy5mRXZlbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmZsdXNoaW5nKQotCQkJcmV0dXJuOwotCQl0aGlzLmZsdXNoaW5nID0gdHJ1ZTsgLy8gZm9yY2Ugbm90aWZpY2F0aW9uCi0JCWludCBjb3VudCA9IHRoaXMuZkV2ZW50cy5zaXplKCk7Ci0JCQotCQlpZiAoIWRvaW5nTmV3TW9kZWwgJiYgZk9wdGltaXplRGVmZXJyZWQpIHsKLQkJCU1hcCBub3RpZnlFdmVudHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIHRoaXMuZkV2ZW50cy5nZXQoaSk7Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCWV2ZW50LmluZGV4ID0gaTsKLQkJCQlpZihldmVudC50eXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQkJCWFkZFRvTWFwKGV2ZW50Lm9sZFZhbHVlLCBldmVudCwgbm90aWZ5RXZlbnRzKTsKLQkJCQl9Ci0JCQkJaWYoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJCQlhZGRUb01hcChldmVudC5uZXdWYWx1ZSwgZXZlbnQsIG5vdGlmeUV2ZW50cyk7Ci0JCQkJfQotCQkJfQotCQkJSXRlcmF0b3IgaXQgPSBub3RpZnlFdmVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlOb3RpZnlFdmVudFtdIGVzID0gKE5vdGlmeUV2ZW50W10pIGl0Lm5leHQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVzLmxlbmd0aCAtIDE7IGkrKykgewotCQkJCQlOb3RpZnlFdmVudCBldmVudCA9IGVzW2ldOwotCQkJCQlpZihlc1tpXS5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJCQlOb3RpZnlFdmVudCBuZXh0ID0gZXNbaSArIDFdOwotCQkJCQlpZihlc1tpXS50eXBlID09IElOb2RlTm90aWZpZXIuQUREICYmIG5leHQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQkJLy8gQWRkZWQgdGhlbiByZW1vdmVkIGxhdGVyLCBkaXNjYXJkIGJvdGgKLQkJCQkJCWV2ZW50LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQkJCQluZXh0LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIEFEREVEX1RIRU5fUkVNT1ZFRCArICIoc2VlICIgKyBuZXh0LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQluZXh0LnJlYXNvbiA9IG5leHQucmVhc29uICsgQURERURfVEhFTl9SRU1PVkVEICsgIihzZWUgIiArIGV2ZW50LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gKE5vdGlmeUV2ZW50KSB0aGlzLmZFdmVudHMuZ2V0KGkpOwotCQkJCWlmIChldmVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQlpZihldmVudC5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJCWlmIChldmVudC5ub3RpZmllciAhPSBudWxsICYmIGZPcHRpbWl6ZURlZmVycmVkQWNjb3JkaW5nVG9QYXJlbnRBZGRlZCkgewotCQkJCQlpZiAoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJCQkJTm90aWZ5RXZlbnRbXSBlcyA9IChOb3RpZnlFdmVudFtdKW5vdGlmeUV2ZW50cy5nZXQoZXZlbnQubm90aWZpZXIpOwotCQkJCQkJaWYoZXMgIT0gbnVsbCkgZm9yIChpbnQgcCA9IDA7IHAgPCBlcy5sZW5ndGggJiYgZXNbcF0uaW5kZXggPCBldmVudC5pbmRleDsgcCsrKSB7Ci0JCQkJCQkJTm90aWZ5RXZlbnQgcHJldiA9IGVzW3BdOwotCQkJCQkJCWlmIChwcmV2LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUgJiYgcHJldi5vbGRWYWx1ZSA9PSBldmVudC5ub3RpZmllcikgewotCQkJCQkJCQkvLyBwYXJlbnQgaXMgcmVwYXJlbnRlZCwgZG8gbm90IGRpc2NhcmQKLQkJCQkJCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIFBBUkVOVF9JU19SRVBBUkVOVEVEICsgIihzZWUgIiArIHByZXYuaW5kZXggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0gZWxzZSBpZiAocHJldi50eXBlID09IElOb2RlTm90aWZpZXIuQUREICYmIHByZXYubmV3VmFsdWUgPT0gZXZlbnQubm90aWZpZXIpIHsKLQkJCQkJCQkJLy8gcGFyZW50IGhhcyBiZWVuIGFkZGVkLCBkaXNjYXJkIHRoaXMKLQkJCQkJCQkJZXZlbnQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIFBBUkVOVF9JU19BRERFRCArICIoc2VlICIgKyBwcmV2LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9CQkJCQkJCQotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJCWlmKGV2ZW50LmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQkJaWYgKGV2ZW50Lm5vdGlmaWVyICE9IG51bGwgJiYgZk9wdGltaXplRGVmZXJyZWRBY2NvcmRpbmdUb1BhcmVudFJlbW92ZWQpIHsKLQkJCQkJaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJCU5vdGlmeUV2ZW50W10gZXMgPSAoTm90aWZ5RXZlbnRbXSlub3RpZnlFdmVudHMuZ2V0KGV2ZW50Lm5vdGlmaWVyKTsKLQkJCQkJCWlmKGVzICE9IG51bGwpIGZvciAoaW50IG4gPSAwOyBuIDwgZXMubGVuZ3RoOyBuKyspIHsKLQkJCQkJCQlOb3RpZnlFdmVudCBuZXh0ID0gZXNbbl07Ci0JCQkJCQkJaWYobmV4dC5pbmRleCA+IGV2ZW50LmluZGV4ICYmIG5leHQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQkJCQlpZiAobmV4dC5vbGRWYWx1ZSA9PSBldmVudC5ub3RpZmllcikgewotCQkJCQkJCQkJLy8gcGFyZW50IHdpbGwgYmUgcmVtb3ZlZCwgZGlzY2FyZCB0aGlzCi0JCQkJCQkJCQlldmVudC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJCQkJCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQkJCQkJCQlldmVudC5yZWFzb24gPSBldmVudC5yZWFzb24gKyBQQVJFTlRfSVNfUkVNT1ZFRF9UT08gKyAiKHNlZSAiICsgbmV4dC5pbmRleCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQkJCQkJCQotCQkJCX0KLQkJCQlpZihldmVudC5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIHRoaXMuZkV2ZW50cy5nZXQoaSk7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCWlmKGV2ZW50LmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQlub3RpZnkoZXZlbnQubm90aWZpZXIsIGV2ZW50LnR5cGUsIGV2ZW50LmNoYW5nZWRGZWF0dXJlLCBldmVudC5vbGRWYWx1ZSwgZXZlbnQubmV3VmFsdWUsIGV2ZW50LnBvcyk7Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCWZvciAoaW50IGwgPSAwOyBsIDwgY291bnQ7IGwrKykgewotCQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gKE5vdGlmeUV2ZW50KSB0aGlzLmZFdmVudHMuZ2V0KGwpOwotCQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCQlTdHJpbmcgdCA9IG51bGw7Ci0JCQkJaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQpIHsKLQkJCQkJbyA9IGV2ZW50Lm5ld1ZhbHVlOwotCQkJCQl0ID0gIiArICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJbyA9IGV2ZW50Lm9sZFZhbHVlOwotCQkJCQl0ID0gIiAtICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCVN0cmluZyBwID0gKChOb2RlKSBldmVudC5ub3RpZmllcikuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJU3RyaW5nIGMgPSAoKE5vZGUpIG8pLmdldE5vZGVOYW1lKCk7Ci0JCQkJCVN0cmluZyBkID0gKGV2ZW50LmRpc2NhcmRlZCA/ICIhICIgOiAiICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihkICsgcCArIHQgKyBjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhpcy5mbHVzaGluZyA9IGZhbHNlOwotCQl0aGlzLmZFdmVudHMgPSBudWxsOwotCX0KLQotCXZvaWQgYWRkVG9NYXAoT2JqZWN0IG8sIE5vdGlmeUV2ZW50IGV2ZW50LCBNYXAgbWFwKSB7Ci0JCWlmKG8gPT0gbnVsbCkgcmV0dXJuOwotCQlPYmplY3QgeCA9IG1hcC5nZXQobyk7Ci0JCWlmKHggPT0gbnVsbCkgewotCQkJbWFwLnB1dChvLCBuZXcgTm90aWZ5RXZlbnRbXXtldmVudH0pOwotCQl9IGVsc2UgewotCQkJTm90aWZ5RXZlbnRbXSBlcyA9IChOb3RpZnlFdmVudFtdKXg7Ci0JCQlOb3RpZnlFdmVudFtdIGVzMiA9IG5ldyBOb3RpZnlFdmVudFtlcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZXMsIDAsIGVzMiwgMCwgZXMubGVuZ3RoKTsKLQkJCWVzMltlcy5sZW5ndGhdID0gZXZlbnQ7Ci0JCQltYXAucHV0KG8sIGVzMik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5U3RydWN0dXJlQ2hhbmdlZChOb2RlIHJvb3QpIHsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSByb290OwotCQl0cnkgewotCQkJLy8gSXRzIGltcG9ydGFudCB0byAia2VlcCBnb2luZyIgaWYgZXhjZXB0aW9uIG9jY3Vycywgc2luY2UgdGhpcwotCQkJLy8gbm90aWZpY2F0aW9uCi0JCQkvLyBjb21lcyBpbiBiZXR3ZWVuICJhYm91dCB0byBjaGFuZ2UiIGFuZCAiY2hhbmdlZCIgZXZlbnRzLiBXZSBkbwotCQkJLy8gbG9nLCBob3dldmVyLAotCQkJLy8gc2luY2Ugd291bGQgaW5kaWNhdGUgYSBwcm9ncmFtIGVycm9yLgotCQkJbm90aWZpZXIubm90aWZ5KElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQsIG51bGwsIG51bGwsIG51bGwsIC0xKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkEgc3RydWN0dXJlZCBtb2RlbCBjbGllbnQgdGhyZXcgZm9sbG93aW5nIGV4Y2VwdGlvbiBkdXJpbmcgYWRhcHRlciBub3RpZmljYXRpb24gKCIgKyBJTm9kZU5vdGlmaWVyLkVWRU5UX1RZUEVfU1RSSU5HU1tJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEXSArICIgKSIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE5vZGUgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldENvbW1vblJvb3RJZk5lZWRlZChOb2RlIG5vZGUpIHsKLQkJLy8gZGVmZXIgbm90aWZpY2F0aW9uCi0JCWlmICh0aGlzLmNoYW5nZWRSb290ID09IG51bGwpIHsKLQkJCXRoaXMuY2hhbmdlZFJvb3QgPSBub2RlOwotCQl9IGVsc2UgewotCQkJLy8gdGlueSBvcHRpbWl6YXRpb246IGlmIHByZXZpb3VzIGNvbW1vbkFuY2VzdG9yIChjaGFuZ2VkUm9vdCkgaXMKLQkJCS8vIGFscmVhZHkgJ2RvY3VtZW50JywKLQkJCS8vIG9yIGlmIGFscmVhZHkgZXF1YWwgdG8gdGhpcyAnbm9kZScsCi0JCQkvLyB0aGVuIG5vIG5lZWQgdG8gcmUtY2FsY3VsYXRlCi0JCQlpZiAoY2hhbmdlZFJvb3QuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUgJiYgY2hhbmdlZFJvb3QgIT0gbm9kZSkgewotCQkJCU5vZGUgY29tbW9uID0gKChOb2RlSW1wbCkgdGhpcy5jaGFuZ2VkUm9vdCkuZ2V0Q29tbW9uQW5jZXN0b3Iobm9kZSk7Ci0JCQkJaWYgKGNvbW1vbiAhPSBudWxsKQotCQkJCQl0aGlzLmNoYW5nZWRSb290ID0gY29tbW9uOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5jaGFuZ2VkUm9vdCA9IG5vZGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFRhZ0NoYW5nZWQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBlbGVtZW50OwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgbnVsbCwgbnVsbCwgbnVsbCwgb2Zmc2V0KTsKLQkJcHJvcGVydHlDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHN0cnVjdHVyZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0NoYW5naW5nKCkpIHsKLQkJCXNldENvbW1vblJvb3RJZk5lZWRlZChub2RlKTsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJU3RyaW5nIHAgPSB0aGlzLmNoYW5nZWRSb290LmdldE5vZGVOYW1lKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXF1ZXN0ZWQgU1RSVUNUVVJFX0NIQU5HRUQ6ICIgKyBwKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQlTdHJpbmcgcCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU1RSVUNUVVJFX0NIQU5HRUQ6ICIgKyBwKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW5vdGlmeVN0cnVjdHVyZUNoYW5nZWQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogdmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBub3RpZmllciA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIG5vZGU7Ci0JCQlub3RpZmllciA9IChJRE9NTm9kZSkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCS8vIFRPRE9fZG13OiBleHBlcmltZW50YWw6IGNoYW5nZWQgMDYvMjkvMjAwNCB0byBzZW5kICJzdHJ1Y3R1dXJlCi0JCQkvLyBjaGFuZ2VkIiBldmVuIGZvciBhdHRyaWJ1dGUgdmFsdWUgY2hhbmdlcwotCQkJLy8gdGhlcmUgYXJlIHByb3MgYW5kIGNvbnMgdG8gY29uc2lkZXJpbmcgYXR0cmlidXRlIHZhbHVlCi0JCQkvLyAic3RydWN0dXJlIGNoYW5nZWQiLiBXaWxsIChyZSljb25zaWRlcgotCQkJLy8gc2V0Q29tbW9uUm9vdElmTmVlZGVkKG5vdGlmaWVyKTsKLQkJCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCVN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgYXR0ciwgbnVsbCwgdmFsdWUsIG9mZnNldCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RlOiB3ZSBkbyBub3Qgc2VuZCBzdHJ1Y3R1cmVkIGNoYW5nZWQgZXZlbnQgZm9yIGNvbnRlbnQKLQkJCS8vIGNoYW5nZWQKLQkJCW5vdGlmaWVyID0gKElET01Ob2RlKSBub2RlOwotCQkJU3RyaW5nIHZhbHVlID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgbnVsbCwgbnVsbCwgdmFsdWUsIG9mZnNldCk7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJbm90aWZ5KHBhcmVudCwgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQsIG5vZGUsIG51bGwsIHZhbHVlLCBvZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwcm9wZXJ0eUNoYW5nZWQobm90aWZpZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiOTU1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIFhNTE1vZGVsUGFyc2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbFBhcnNlciB7Ci0JcHJpdmF0ZSBYTUxNb2RlbENvbnRleHQgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBET01Nb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFhNTE1vZGVsUGFyc2VyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY2FuQmVJbXBsaWNpdFRhZyhlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmNhbkJlSW1wbGljaXRUYWcoZWxlbWVudCwgY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Db250YWluKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChpbXBsLmlzRW5kVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGludmFsaWQgKGZsb2F0aW5nKSBlbmQgdGFnCi0JCWlmICghaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJaWYgKGltcGwuaXNKU1BDb250YWluZXIoKSB8fCBpbXBsLmlzQ0RBVEFDb250YWluZXIoKSkgewotCQkJCS8vIGFjY2VwdHMgb25seSBUZXh0IGNoaWxkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jYW5Db250YWluKGVsZW1lbnQsIGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0ckVxdWFsKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgZGF0YQotCQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCkgbm9kZTsKLQkJCQlwaS5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBhY3R1YWxseSwgZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJOYW1lIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIG5vZGU7Ci0JCQkJcGkubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLmdldE5hbWVSZWdpb24oKSAhPSByZWdpb24pCi0JCQkJY29udGludWU7Ci0KLQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJYXR0ci5zZXROYW1lKG5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VBdHRyVmFsdWUgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUF0dHJWYWx1ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIG5vZGU7Ci0JCQkJcGkubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLmdldFZhbHVlUmVnaW9uKCkgIT0gcmVnaW9uKQotCQkJCWNvbnRpbnVlOwotCQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgdmFsdWUKLQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZURhdGEgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZURhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5vZGU7Ci0JCQkJaWYgKHRleHQuaXNTaGFyaW5nU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKSkgewotCQkJCQkvLyBoYXMgY29uc2VjdXRpdmUgdGV4dCBzaGFyaW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobm9kZSk7Ci0JCQkJY2xlYW51cFRleHQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCS8vIGNvbW1lbnQgdGFnCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBqdXN0IG5vdGlmeSB0aGUgY2hhbmdlIGluc3RlYWQgb2Ygc2V0dGluZyBkYXRhCi0JCU5vZGVJbXBsIGltcGwgPSAoTm9kZUltcGwpIG5vZGU7Ci0JCWltcGwubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUVuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgY2hhbmdlIGlzIG9ubHkgZm9yIGNsb3NlIHRhZwotCQlpZiAobmV3UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbmV3UmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKQotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIG90aGVyIHJlZ2lvbiBoYXMgY2hhbmdlZAotCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChvbGRSZWdpb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBvbGRSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGFuZ2UgZm9yIGNsb3NlIHRhZyBoYXMgbm8gaW1wYWN0Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKTsKLQotCQkvLyBvcHRpbWl6ZSB0eXBpY2FsIGNhc2VzCi0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfHwgaXNOZXN0ZWRDb250ZW50KHJlZ2lvblR5cGUpKSB7Ci0JCQljaGFuZ2VEYXRhKGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQljaGFuZ2VBdHRyTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWNoYW5nZUF0dHJWYWx1ZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQljaGFuZ2VBdHRyRXF1YWwoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCWNoYW5nZVRhZ05hbWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0KLQkJLy8gY2hlY2sgaWYgY2hhbmdlcyBhcmUgb25seSBmb3IgYXR0cmlidXRlcyBhbmQgY2xvc2UgdGFnCi0JCWJvb2xlYW4gdGFnTmFtZVVuY2hhbmdlZCA9IGZhbHNlOwotCQlpZiAobmV3UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbmV3UmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gY2hhbmdlIGZyb20gZW1wdHkgdGFnIG1heSBoYXZlIGltcGFjdCBvbiBzdHJ1Y3R1cmUKLQkJCQkJaWYgKCFlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCQlTdHJpbmcgb2xkVGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3VGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCQkJaWYgKG9sZFRhZ05hbWUgIT0gbnVsbCAmJiBuZXdUYWdOYW1lICE9IG51bGwgJiYgb2xkVGFnTmFtZS5lcXVhbHMobmV3VGFnTmFtZSkpIHsKLQkJCQkJCS8vIHRoZSB0YWcgbmFtZSBpcyB1bmNoYW5nZWQKLQkJCQkJCXRhZ05hbWVVbmNoYW5nZWQgPSB0cnVlOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBvdGhlciByZWdpb24gaGFzIGNoYW5nZWQKLQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAob2xkUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gb2xkUmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gY2hhbmdlIGZyb20gZW1wdHkgdGFnIG1heSBoYXZlIGltcGFjdCBvbiBzdHJ1Y3R1cmUKLQkJCQkJaWYgKCFlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCQkvLyBpZiBuZXcgdGFnIG5hbWUgaXMgdW5jaGFuZ2VkLCBpdCdzIE9LCi0JCQkJCWlmICh0YWdOYW1lVW5jaGFuZ2VkKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyB1cGRhdGUgYXR0cmlidXRlcwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQkvLyBmaXJzdCByZW1vdmUgYXR0cmlidXRlcwotCQlpbnQgcmVnaW9uSW5kZXggPSAwOwotCQlpbnQgYXR0ckluZGV4ID0gMDsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCXdoaWxlIChhdHRySW5kZXggPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpKSB7Ci0JCQlhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oYXR0ckluZGV4KTsKLQkJCWlmIChhdHRyID09IG51bGwpIHsgLy8gZXJyb3IKLQkJCQlhdHRySW5kZXgrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpIHsgLy8gZXJyb3IKLQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gcmVnaW9uSW5kZXg7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBuYW1lUmVnaW9uKSB7Ci0JCQkJCXJlZ2lvbkluZGV4ID0gaSArIDE7IC8vIG5leHQgcmVnaW9uCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKSB7Ci0JCQkJYXR0ckluZGV4Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbnNlcnQgb3IgdXBkYXRlIGF0dHJpYnV0ZXMKLQkJYXR0ckluZGV4ID0gMDsgLy8gcmVzZXQgdG8gZmlyc3QKLQkJQXR0ckltcGwgbmV3QXR0ciA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIG9sZFZhbHVlUmVnaW9uID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJCQkvLyBpbnNlcnQgZGVmZXJyZWQgbmV3IGF0dHJpYnV0ZQotCQkJCQllbGVtZW50Lmluc2VydEF0dHJpYnV0ZU5vZGUobmV3QXR0ciwgYXR0ckluZGV4KyspOwotCQkJCQluZXdBdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXR0ciAhPSBudWxsICYmIG9sZFZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJLy8gbm90aWZ5IGV4aXN0aW5nIGF0dHJpYnV0ZSB2YWx1ZSByZW1vdmFsCi0JCQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQkJfQotCi0JCQkJb2xkVmFsdWVSZWdpb24gPSBudWxsOwotCQkJCWF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShhdHRySW5kZXgpOwotCQkJCWlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5nZXROYW1lUmVnaW9uKCkgPT0gcmVnaW9uKSB7Ci0JCQkJCS8vIGV4aXN0aW5nIGF0dHJpYnV0ZQotCQkJCQlhdHRySW5kZXgrKzsKLQkJCQkJLy8gY2xlYXIgb3RoZXIgcmVnaW9ucwotCQkJCQlvbGRWYWx1ZVJlZ2lvbiA9IGF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihudWxsKTsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCQlhdHRyID0gKEF0dHJJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIGRlZmVyIGluc2VydGlvbiBvZiBuZXcgYXR0cmlidXRlCi0JCQkJCW5ld0F0dHIgPSBhdHRyOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHIgIT0gbmV3QXR0ciAmJiBvbGRWYWx1ZVJlZ2lvbiAhPSByZWdpb24pIHsKLQkJCQkJCS8vIG5vdGlmeSBleGlzdGluZyBhdHRyaWJ1dGUgdmFsdWUgY2hhbmdlZAotCQkJCQkJYXR0ci5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQkJfQotCQkJCQlvbGRWYWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCS8vIGluc2VydCBkZWZlcnJlZCBuZXcgYXR0cmlidXRlCi0JCQllbGVtZW50LmFwcGVuZEF0dHJpYnV0ZU5vZGUobmV3QXR0cik7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ciAhPSBudWxsICYmIG9sZFZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIG5vdGlmeSBleGlzdGluZyBhdHRyaWJ1dGUgdmFsdWUgcmVtb3ZhbAotCQkJYXR0ci5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzZXR1cENvbnRleHQoZmxhdE5vZGUpOwotCi0JCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGlzIHNldCB0byBkZWVwZXN0IGxldmVsCi0JCS8vIHdoZW4gZW5kIHRhZyBoYXMgYmVlbiByZW1vdmVkCi0JCXRoaXMuY29udGV4dC5zZXRMYXN0KCk7Ci0JCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0KLQkJY2xlYW51cFRleHQoKTsKLQkJY2xlYW51cEVuZFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VUYWdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlTdHJpbmcgbmV3VGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJaWYgKG5ld1RhZ05hbWUgPT0gbnVsbCB8fCAhZWxlbWVudC5tYXRjaFRhZ05hbWUobmV3VGFnTmFtZSkpIHsKLQkJCS8vIHRoZSB0YWcgbmFtZSBpcyBjaGFuZ2VkCi0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gdGhlIHRhZyBuYW1lIGlzIHVuY2hhbmdlZAotCQkvLyB0aGlzIGhhcHBlbnMgd2hlbiB0eXBpbmcgc3BhY2VzIGFmdGVyIHRoZSB0YWcgbmFtZQotCQkvLyBkbyBub3RoaW5nLCBidXQuLi4KLQkJLy8gaWYgaXQncyBub3QgYSBjaGFuZ2UgaW4gdGhlIGVuZCB0YWcgb2YgYW4gZWxlbWVudCB3aXRoIHRoZSBzdGFydAotCQkvLyB0YWcsCi0JCS8vIGFuZCBjYXNlIGhhcyBiZWVuIGNoYW5nZWQsIHNldCB0byBlbGVtZW50IGFuZCBub3RpZnkKLQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgfHwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCWlmICh0YWdOYW1lID09IG51bGwgfHwgIXRhZ05hbWUuZXF1YWxzKG5ld1RhZ05hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXRUYWdOYW1lKG5ld1RhZ05hbWUpOwotCQkJCWVsZW1lbnQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbGVhbnVwQ29udGV4dCBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW51cEVuZFRhZygpIHsKLQkJTm9kZSBwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQlpZiAoZWxlbWVudC5pc0VuZFRhZygpKSB7Ci0JCQkJCQkvLyBmbG9hdGluZyBlbmQgdGFnCi0JCQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQkJCQkJRWxlbWVudEltcGwgc3RhcnQgPSAoRWxlbWVudEltcGwpIHRoaXMuY29udGV4dC5maW5kU3RhcnRUYWcodGFnTmFtZSwgcm9vdE5hbWUpOwotCQkJCQkJaWYgKHN0YXJ0ICE9IG51bGwpIHsKLQkJCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQkJCS8vIG1vdmUgdGhlIGVuZCB0YWcgZnJvbSAnZWxlbWVudCcgdG8gJ3N0YXJ0JwotCQkJCQkJCXN0YXJ0LmFkZEVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQkJCQkJCXBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJbmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBmaXJzdCA9IG5leHQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBmaXJzdDsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSAmJiBlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgZWxlbWVudC5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSB0aGlzLmNvbnRleHQuZmluZEVuZFRhZyh0YWdOYW1lKTsKLQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBtb3ZlIHRoZSBlbmQgdGFnIGZyb20gJ2VuZCcgdG8gJ2VsZW1lbnQnCi0JCQkJCQllbGVtZW50LmFkZEVuZFRhZyhlbmQpOwotCQkJCQkJcmVtb3ZlRW5kVGFnKGVuZCk7Ci0JCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOyAvLyByZXNldCBjb250ZXh0Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJbmV4dCA9IHBhcmVudC5nZXROZXh0U2libGluZygpOwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBUZXh0KCkgewotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBuZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCU5vZGUgcHJldiA9IChuZXh0ID09IG51bGwgPyBwYXJlbnQuZ2V0TGFzdENoaWxkKCkgOiBuZXh0LmdldFByZXZpb3VzU2libGluZygpKTsKLQotCQlUZXh0SW1wbCBuZXh0VGV4dCA9IG51bGw7Ci0JCVRleHRJbXBsIHByZXZUZXh0ID0gbnVsbDsKLQkJaWYgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCW5leHRUZXh0ID0gKFRleHRJbXBsKSBuZXh0OwotCQl9Ci0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlwcmV2VGV4dCA9IChUZXh0SW1wbCkgcHJldjsKLQkJfQotCQlpZiAobmV4dFRleHQgPT0gbnVsbCAmJiBwcmV2VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobmV4dFRleHQgIT0gbnVsbCAmJiBwcmV2VGV4dCAhPSBudWxsKSB7Ci0JCQkvLyBjb25zZWN1dGl2ZSBUZXh0IG5vZGVzIGNyZWF0ZWQgYnkgc2V0dXBDb250ZXh0KCksCi0JCQkvLyBjb25jYXQgdGhlbQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5leHRUZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQkJcHJldlRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCU5vZGUgbmV3TmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXh0KTsKLQkJCW5leHQgPSBudWxsOwotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQl9Ci0KLQkJVGV4dEltcGwgY2hpbGRUZXh0ID0gKHByZXZUZXh0ICE9IG51bGwgPyBwcmV2VGV4dCA6IG5leHRUZXh0KTsKLQkJaWYgKGNoaWxkVGV4dC5nZXROZXh0U2libGluZygpID09IG51bGwgJiYgY2hpbGRUZXh0LmdldFByZXZpb3VzU2libGluZygpID09IG51bGwpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlpZiAoIXBhcmVudEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiAhcGFyZW50RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQlpZiAoY2hpbGRUZXh0LmlzV2hpdGVzcGFjZSgpIHx8IGNoaWxkVGV4dC5pc0ludmFsaWQoKSkgewotCQkJCQkJLy8gaW1wbGljaXQgcGFyZW50IGlzIG5vdCByZXF1aXJlZAotCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBuZXdOZXh0ID0gcGFyZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJbmV3UGFyZW50LnJlbW92ZUNoaWxkKHBhcmVudCk7Ci0JCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkVGV4dCk7Ci0JCQkJCQkJbmV3UGFyZW50Lmluc2VydEJlZm9yZShjaGlsZFRleHQsIG5ld05leHQpOwotCQkJCQkJCWlmIChjaGlsZFRleHQgPT0gbmV4dCkgewotCQkJCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGRUZXh0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAobmV3TmV4dCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld1BhcmVudCk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIHRyeSBhZ2FpbgotCQkJCQkJCWNsZWFudXBUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJvdXRpbmUgY3JlYXRlIGFuIEVsZW1lbnQgZnJvbSBjb21tZW50IGRhdGEgZm9yIGNvbW1lbnQgc3R5bGUKLQkgKiBlbGVtZW50cywgc3VjaCBhcyBTU0kgYW5kIE1FVEFEQVRBCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJU3RyaW5nIHRyaW1tZWREYXRhID0gZGF0YS50cmltKCk7Ci0JCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChpbnQgaUNvbmZpZyA9IDA7IGlDb25maWcgPCBjb25maWdzLmxlbmd0aDsgaUNvbmZpZysrKSB7Ci0JCQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlnc1tpQ29uZmlnXTsKLQkJCWlmICgoaXNKU1BUYWcgJiYgIWNvbmZpZy5hY2NlcHRKU1BDb21tZW50KCkpIHx8ICghaXNKU1BUYWcgJiYgIWNvbmZpZy5hY2NlcHRYTUxDb21tZW50KCkpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBwcmVmaXhlcyA9IGNvbmZpZy5nZXRQcmVmaXgoKTsKLQkJCWZvciAoaW50IGlQcmVmaXggPSAwOyBpUHJlZml4IDwgcHJlZml4ZXMubGVuZ3RoOyBpUHJlZml4KyspIHsKLQkJCQlpZiAodHJpbW1lZERhdGEuc3RhcnRzV2l0aChwcmVmaXhlc1tpUHJlZml4XSkpIHsKLQkJCQkJcmV0dXJuIGNvbmZpZy5jcmVhdGVFbGVtZW50KHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSwgZGF0YSwgaXNKU1BUYWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlQ29tbWVudEVsZW1lbnQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLCBkYXRhLCBpc0pTUFRhZyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByb3V0aW5lIGNyZWF0ZSBhbiBpbXBsaWNpdCBFbGVtZW50IGZvciBnaXZlbiBwYXJlbnQgYW5kIGNoaWxkLAotCSAqIHN1Y2ggYXMgSFRNTCwgQk9EWSwgSEVBRCwgYW5kIFRCT0RZIGZvciBIVE1MIGRvY3VtZW50LgotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUltcGxpY2l0RWxlbWVudChOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlSW1wbGljaXRFbGVtZW50KHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSwgcGFyZW50LCBjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlbW90ZU5vZGVzKE5vZGUgcm9vdCwgTm9kZSBuZXdQYXJlbnQsIE5vZGUgb2xkUGFyZW50LCBOb2RlIG5leHQpIHsKLQkJaWYgKG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuOwotCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0KLQkJLy8gZmluZCBuZXh0Ci0JCXdoaWxlIChuZXh0ID09IG51bGwpIHsKLQkJCWlmIChvbGRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvbGRQYXJlbnQ7Ci0JCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkKLQkJCQlyZXR1cm47Ci0JCQlvbGRQYXJlbnQgPSBvbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQluZXh0ID0gb2xkRWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQlpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCU5vZGUgbmV4dENoaWxkID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQlpZiAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQkJCS8vIGRlbW90ZSBjaGlsZHJlbgotCQkJCQkJbmV4dCA9IG5leHRDaGlsZDsKLQkJCQkJCW9sZFBhcmVudCA9IG5leHRFbGVtZW50OwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV4dEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJCWlmIChuZXh0RWxlbWVudC5tYXRjaEVuZFRhZyhuZXdFbGVtZW50KSkgewotCQkJCQkJCS8vIHN0b3AgYXQgdGhlIG1hdGNoZWQgaW52YWxpZCBlbmQgdGFnCi0JCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCQluZXdFbGVtZW50LmFkZEVuZFRhZyhuZXh0RWxlbWVudCk7Ci0KLQkJCQkJCQlpZiAobmV3RWxlbWVudCA9PSByb290KQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJTm9kZSBwID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgcmVhY2hlZCB0byB0b3AKLQkJCQkJCQlpZiAocCA9PSBudWxsIHx8IHAgPT0gb2xkUGFyZW50IHx8IHAuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHA7Ci0JCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyByZW1vdmUgaW1wbGljaXQgZWxlbWVudAotCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghZG9uZSkgewotCQkJCWlmICghY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQlpZiAobmV3RWxlbWVudCA9PSByb290KQotCQkJCQkJcmV0dXJuOwotCQkJCQlOb2RlIHAgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJLy8gY2hlY2sgaWYgcmVhY2hlZCB0byB0b3AKLQkJCQkJaWYgKHAgPT0gbnVsbCB8fCBwID09IG9sZFBhcmVudCB8fCBwLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHA7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlpbnNlcnROb2RlKG5ld0VsZW1lbnQsIGNoaWxkLCBudWxsKTsKLQkJCQlOb2RlIGNoaWxkUGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChjaGlsZFBhcmVudCAhPSBuZXdFbGVtZW50KSB7Ci0JCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNoaWxkUGFyZW50OwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZmluZCBuZXh0IHBhcmVudCBhbmQgc2libGluZwotCQkJd2hpbGUgKG5leHQgPT0gbnVsbCkgewotCQkJCWlmIChvbGRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJcmV0dXJuOwotCQkJCUVsZW1lbnRJbXBsIG9sZEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG9sZFBhcmVudDsKLQotCQkJCS8vIGR1ZyBwYXJlbnQgbXVzdCBub3QgaGF2ZSBjaGlsZHJlbiBhdCB0aGlzIHBvaW50Ci0JCQkJaWYgKCFvbGRFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSAmJiAhb2xkRWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAob2xkUGFyZW50ID09IG51bGwpCi0JCQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQkJCW5leHQgPSBvbGRFbGVtZW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkKLQkJCQkJcmV0dXJuOwotCQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOyAvLyBlcnJvcgotCQkJCW5leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1vZGVsUGFyc2VyQWRhcHRlciBnZXRQYXJzZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gKE1vZGVsUGFyc2VyQWRhcHRlcikgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmdldEFkYXB0ZXJGb3IoTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5kUm9vdE5hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEZpbmRSb290TmFtZSh0YWdOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSURPTU1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5tb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRDREFUQVNlY3Rpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydENEQVRBU2VjdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNEQVRBU2VjdGlvbkltcGwgY2RhdGEgPSBudWxsOwotCQl0cnkgewotCQkJY2RhdGEgPSAoQ0RBVEFTZWN0aW9uSW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUNEQVRBU2VjdGlvbihudWxsKTsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJaWYgKGNkYXRhID09IG51bGwpIHsgLy8gQ0RBVEEgc2VjdGlvbiBtaWdodCBub3QgYmUgc3VwcG9ydGVkCi0JCQlpbnNlcnRJbnZhbGlkRGVjbChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIGRlY2wKLQkJCXJldHVybjsKLQkJfQotCi0JCWNkYXRhLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoY2RhdGEpOwotCX0KLQotCS8qKgotCSAqIGluc2VydENvbW1lbnQgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydENvbW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IG51bGw7Ci0JCWJvb2xlYW4gaXNKU1BUYWcgPSBmYWxzZTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzTmVzdGVkQ29tbWVudE9wZW4ocmVnaW9uVHlwZSkpIHsKLQkJCQlpc0pTUFRhZyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCBpc05lc3RlZENvbW1lbnRUZXh0KHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJCQlkYXRhID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNyZWF0ZUNvbW1lbnRFbGVtZW50KGRhdGEsIGlzSlNQVGFnKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoIWlzRW5kVGFnKGVsZW1lbnQpKSB7Ci0JCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQlpbnNlcnRTdGFydFRhZyhlbGVtZW50KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIGVuZCB0YWcKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0KLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCVN0cmluZyByb290TmFtZSA9IGdldEZpbmRSb290TmFtZSh0YWdOYW1lKTsKLQkJCQlFbGVtZW50SW1wbCBzdGFydCA9IChFbGVtZW50SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRTdGFydFRhZyh0YWdOYW1lLCByb290TmFtZSk7Ci0JCQkJaWYgKHN0YXJ0ICE9IG51bGwpIHsgLy8gc3RhcnQgdGFnIGZvdW5kCi0JCQkJCWluc2VydEVuZFRhZyhzdGFydCk7Ci0JCQkJCXN0YXJ0LmFkZEVuZFRhZyhlbGVtZW50KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIGludmFsaWQgZW5kIHRhZwotCQkJCWluc2VydE5vZGUoZWxlbWVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJQ29tbWVudEltcGwgY29tbWVudCA9IChDb21tZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUNvbW1lbnQobnVsbCk7Ci0JCWlmIChjb21tZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0pTUFRhZykKLQkJCWNvbW1lbnQuc2V0SlNQVGFnKHRydWUpOwotCQljb21tZW50LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoY29tbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGVjbCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0RGVjbChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWJvb2xlYW4gaXNEb2NUeXBlID0gZmFsc2U7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQkJU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTikgewotCQkJCWlzRG9jVHlwZSA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSkgewotCQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJCW5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKSB7Ci0JCQkJaWYgKHB1YmxpY0lkID09IG51bGwpCi0JCQkJCXB1YmxpY0lkID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKSB7Ci0JCQkJaWYgKHN5c3RlbUlkID09IG51bGwpCi0JCQkJCXN5c3RlbUlkID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbnZhbGlkIGRlY2xhcmF0aW9uCi0JCWlmICghaXNEb2NUeXBlKSB7Ci0JCQlpbnNlcnRJbnZhbGlkRGVjbChmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlEb2N1bWVudFR5cGVJbXBsIGRvY1R5cGUgPSAoRG9jdW1lbnRUeXBlSW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZURvY3R5cGUobmFtZSk7Ci0JCWlmIChkb2NUeXBlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChwdWJsaWNJZCAhPSBudWxsKQotCQkJZG9jVHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCWlmIChzeXN0ZW1JZCAhPSBudWxsKQotCQkJZG9jVHlwZS5zZXRTeXN0ZW1JZChzeXN0ZW1JZCk7Ci0JCWRvY1R5cGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShkb2NUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRFbmRUYWcgbWV0aG9kIGNhbiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMsIGJ1dCBub3Qgb3ZlcnJpZGVkLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0RW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgbmV3UGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChuZXdQYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAoISgoRWxlbWVudEltcGwpIGVsZW1lbnQpLmlzQ29udGFpbmVyKCkpIHsKLQkJCS8vIGp1c3QgdXBkYXRlIGNvbnRleHQKLQkJCU5vZGUgZWxlbWVudE5leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoZWxlbWVudE5leHQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZWxlbWVudE5leHQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld1BhcmVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBwcm9tb3RlIGNoaWxkcmVuCi0JCU5vZGUgbmV3TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJTm9kZSBvbGRQYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAob2xkUGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQlwcm9tb3RlTm9kZXMoZWxlbWVudCwgbmV3UGFyZW50LCBuZXdOZXh0LCBvbGRQYXJlbnQsIG9sZE5leHQpOwotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCS8vIHJlLWNoZWNrIHRoZSBuZXh0IHNpYmxpbmcKLQkJbmV3TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJZWxzZQotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3UGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRFbmRUYWcgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydEVuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJdGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0YWdOYW1lID09IG51bGwpIHsgLy8gaW52YWxpZCBlbmQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQlFbGVtZW50SW1wbCBzdGFydCA9IChFbGVtZW50SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRTdGFydFRhZyh0YWdOYW1lLCByb290TmFtZSk7Ci0JCWlmIChzdGFydCAhPSBudWxsKSB7IC8vIHN0YXJ0IHRhZyBmb3VuZAotCQkJaW5zZXJ0RW5kVGFnKHN0YXJ0KTsKLQkJCXN0YXJ0LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpbnZhbGlkIGVuZCB0YWcKLQkJRWxlbWVudEltcGwgZW5kID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVuZCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChlbmQgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIGVuZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZW5kLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRFbnRpdHlSZWYgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydEVudGl0eVJlZihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQkJbmFtZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0RW50aXR5UmVmTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpIHsgLy8gaW52YWxpZCBlbnRpdHkKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gSVNTVUU6IGF2b2lkIHRoaXMgY2FzdAotCQlTdHJpbmcgdmFsdWUgPSAoKERvY3VtZW50SW1wbCl0aGlzLm1vZGVsLmdldERvY3VtZW50KCkpLmdldENoYXJWYWx1ZShuYW1lKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsgLy8gY2hhcmFjdGVyIGVudGl0eQotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRQcmV2aW91c1RleHQoKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwpIHsgLy8gZXhpc3RpbmcgdGV4dCBmb3VuZAotCQkJCS8vIGRvIG5vdCBhcHBlbmQgZGF0YQotCQkJCXRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkvLyBub3RpZnkgdGhlIGNoYW5nZQotCQkJCXRleHQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBuZXcgdGV4dAotCQkJdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKG51bGwpOwotCQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlpbnNlcnROb2RlKHRleHQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZ2VuZXJhbCBlbnRpdHkgcmVmZXJlbmNlCi0JCUVudGl0eVJlZmVyZW5jZUltcGwgcmVmID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZiA9IChFbnRpdHlSZWZlcmVuY2VJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlRW50aXR5UmVmZXJlbmNlKG5hbWUpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAocmVmID09IG51bGwpIHsgLy8gZW50aXR5IHJlZmVyZW5jZSBtaWdodCBub3QgYmUgc3VwcG9ydGVkCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVmLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRJbnZhbGlkRGVjbCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0SW52YWxpZERlY2woSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCIhIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7IC8vIGludmFsaWQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0JCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0TmVzdGVkVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJTGlzdCBhdHRyTm9kZXMgPSBudWxsOwotCQlib29sZWFuIGlzQ2xvc2VUYWcgPSBmYWxzZTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzTmVzdGVkVGFnT3BlbihyZWdpb25UeXBlKSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCQl0YWdOYW1lID0gY29tcHV0ZU5lc3RlZFRhZyhyZWdpb25UeXBlLCB0YWdOYW1lLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGlzTmVzdGVkVGFnQ2xvc2UocmVnaW9uVHlwZSkpIHsKLQkJCQlpc0Nsb3NlVGFnID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYXR0ciA9IChBdHRySW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0TmFtZVJlZ2lvbihyZWdpb24pOwotCQkJCQlpZiAoYXR0ck5vZGVzID09IG51bGwpCi0JCQkJCQlhdHRyTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWF0dHJOb2Rlcy5hZGQoYXR0cik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihyZWdpb24pOwotCQkJCQlhdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFnTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAoaXNDbG9zZVRhZykgewotCQkJCS8vIGNsb3NlIEpTUCB0YWcKLQkJCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJCWlmIChzdGFydC5pc0pTUENvbnRhaW5lcigpKSB7Ci0JCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQkJc3RhcnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGludmFsaWQgSlNQIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsgLy8gaW52YWxpZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJOb2Rlcy5zaXplKCk7IGkrKykgewotCQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZSgoQXR0cikgYXR0ck5vZGVzLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudC5zZXRKU1BUYWcodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRTdGFydFRhZyhlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ0Nsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdPcGVuKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlLCBTdHJpbmcgdGFnTmFtZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gdGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBjaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnROb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQl3aGlsZSAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChjYW5Db250YWluKGVsZW1lbnQsIG5vZGUpKSB7Ci0JCQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dCA9PSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKSkgewotCQkJCQkvLyBmaXJzdCBjaGlsZCBvZiBpbXBsaWNpdCB0YWcKLQkJCQkJLy8gZGVsZXRlZ2UgdG8gdGhlIHBhcmVudAotCQkJCQlwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQluZXh0ID0gZWxlbWVudDsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIHByb21vdGUgc2libGluZ3MKLQkJCU5vZGUgbmV3TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQlOb2RlIG5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV3TmV4dCk7Ci0JCQkJY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCQl9Ci0KLQkJCS8vIGxlYXZlIHRoZSBvbGQgZW5kIHRhZyB3aGVyZSBpdCBpcwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQlFbGVtZW50IGVuZCA9IGVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoZW5kLCBuZXdOZXh0KTsKLQkJCQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCQkJCW5leHQgPSBlbmQ7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkvLyBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJaWYgKCFlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyB1cGRhdGUgY29udGV4dAotCQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCQluZXh0ID0gbmV3TmV4dDsKLQkJCWlmIChuZXh0ICE9IG51bGwpCi0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCX0KLQotCQlpbnNlcnROb2RlKHBhcmVudCwgbm9kZSwgbmV4dCk7Ci0JCW5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCWlmIChuZXh0ICE9IG51bGwpCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCWVsc2UKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Tm9kZShOb2RlIHBhcmVudCwgTm9kZSBub2RlLCBOb2RlIG5leHQpIHsKLQkJd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIG5leHRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJaWYgKG5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoIWNhbkJlSW1wbGljaXRUYWcobmV4dEVsZW1lbnQsIG5vZGUpKQotCQkJCWJyZWFrOwotCQkJcGFyZW50ID0gbmV4dEVsZW1lbnQ7Ci0JCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl9Ci0JCUVsZW1lbnQgaW1wbGljaXRFbGVtZW50ID0gY3JlYXRlSW1wbGljaXRFbGVtZW50KHBhcmVudCwgbm9kZSk7Ci0JCWlmIChpbXBsaWNpdEVsZW1lbnQgIT0gbnVsbCkKLQkJCW5vZGUgPSBpbXBsaWNpdEVsZW1lbnQ7Ci0JCXBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0UEkgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhcmdldCA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQl0YXJnZXQgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCX0KLQotCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBudWxsKTsKLQkJaWYgKHBpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXBpLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUocGkpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFN0YXJ0VGFnIG1ldGhvZCBjYW4gYmUgdXNlZCBieSBzdWJjbGFzc2VzLCBidXQgbm90IG92ZXJyaWRkZW4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWluc2VydE5vZGUoZWxlbWVudCk7Ci0KLQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKG5ld0VsZW1lbnQuaXNFbXB0eVRhZygpIHx8ICFuZXdFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZGVtb3RlIHNpYmxpbmdzCi0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJZGVtb3RlTm9kZXMoZWxlbWVudCwgZWxlbWVudCwgcGFyZW50LCBuZXh0KTsKLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGZpcnN0Q2hpbGQgIT0gbnVsbCkKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShmaXJzdENoaWxkKTsKLQkJZWxzZQotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0U3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydFN0YXJ0VGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlib29sZWFuIGlzRW1wdHlUYWcgPSBmYWxzZTsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCUxpc3QgYXR0ck5vZGVzID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJdGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJaXNFbXB0eVRhZyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCWF0dHIgPSAoQXR0ckltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldE5hbWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCQkJYXR0ck5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlhdHRyTm9kZXMuYWRkKGF0dHIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJYXR0ciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIHN0YXJ0IHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQkJLy8gdHlwaWNhbGx5IGludmFsaWQgbmFtZQotCQl9Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsgLy8gaW52YWxpZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJOb2Rlcy5zaXplKCk7IGkrKykgewotCQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZSgoQXR0cikgYXR0ck5vZGVzLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzRW1wdHlUYWcpCi0JCQllbGVtZW50LnNldEVtcHR5VGFnKHRydWUpOwotCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0U3RhcnRUYWcoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJaW5zZXJ0U3RhcnRUYWcoZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlpbnNlcnRFbmRUYWcoZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOIHx8IGlzTmVzdGVkQ29tbWVudE9wZW4ocmVnaW9uVHlwZSkpIHsKLQkJCWluc2VydENvbW1lbnQoZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB7Ci0JCQlpbnNlcnRFbnRpdHlSZWYoZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikgewotCQkJaW5zZXJ0RGVjbChmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB7Ci0JCQlpbnNlcnRQSShmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSB7Ci0JCQlpbnNlcnRDREFUQVNlY3Rpb24oZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzTmVzdGVkVGFnKHJlZ2lvblR5cGUpKSB7Ci0JCQlpbnNlcnROZXN0ZWRUYWcoZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudFRleHQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudE9wZW4oU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ05hbWUoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbnRlbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRUZXh0IG1ldGhvZCBDYW4gYmUgY2FsbGVkIGZyb20gc3ViY2xhc3Nlcywgbm90IHRvIGJlIG92ZXJyaWRlZCBvcgotCSAqIHJlLWltcGxlbWVudGVkLgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydFRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLmNvbnRleHQuZmluZFByZXZpb3VzVGV4dCgpOwotCQlpZiAodGV4dCAhPSBudWxsKSB7IC8vIGV4aXN0aW5nIHRleHQgZm91bmQKLQkJCXRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCS8vIG5vdGlmeSB0aGUgY2hhbmdlCi0JCQl0ZXh0Lm5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbmV3IHRleHQKLQkJdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKG51bGwpOwotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUodGV4dCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuaXNFbmRUYWcoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQuaXNFbmRUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvbW90ZU5vZGVzKE5vZGUgcm9vdCwgTm9kZSBuZXdQYXJlbnQsIE5vZGUgbmV3TmV4dCwgTm9kZSBvbGRQYXJlbnQsIE5vZGUgbmV4dCkgewotCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gbnVsbDsKLQkJaWYgKG5ld1BhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCX0KLQotCQlOb2RlIHJvb3RQYXJlbnQgPSByb290LmdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKG9sZFBhcmVudCAhPSByb290UGFyZW50KSB7Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQkJYm9vbGVhbiBlbmRUYWcgPSBmYWxzZTsKLQkJCQlpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIG5leHRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQlpZiAoIW5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJCU5vZGUgbmV4dENoaWxkID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQkJaWYgKG5leHRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gcHJvbW90ZSBjaGlsZHJlbgotCQkJCQkJCW5leHQgPSBuZXh0Q2hpbGQ7Ci0JCQkJCQkJb2xkUGFyZW50ID0gbmV4dEVsZW1lbnQ7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChuZXh0RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQkJCWlmIChuZXh0RWxlbWVudC5tYXRjaEVuZFRhZyhuZXdFbGVtZW50KSkgewotCQkJCQkJCQllbmRUYWcgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIHJlbW92ZSBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICghZG9uZSkgewotCQkJCQlpZiAoIWVuZFRhZyAmJiBuZXdFbGVtZW50ICE9IG51bGwgJiYgIWNhbkNvbnRhaW4obmV3RWxlbWVudCwgbmV4dCkpIHsKLQkJCQkJCW5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsKQotCQkJCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJCQkJCU5vZGUgZWxlbWVudE5leHQgPSBuZXdFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkvLyBwcm9tb3RlIHNpYmxpbmdzCi0JCQkJCQlwcm9tb3RlTm9kZXMobmV3RWxlbWVudCwgbmV3UGFyZW50LCBlbGVtZW50TmV4dCwgbmV3RWxlbWVudCwgbmV3TmV4dCk7Ci0JCQkJCQluZXdOZXh0ID0gbmV3RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJaWYgKG5ld1BhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbmV3RWxlbWVudCA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQlpbnNlcnROb2RlKG5ld1BhcmVudCwgY2hpbGQsIG5ld05leHQpOwotCQkJCQlOb2RlIGNoaWxkUGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAoY2hpbGRQYXJlbnQgIT0gbmV3UGFyZW50KSB7Ci0JCQkJCQluZXdQYXJlbnQgPSBjaGlsZFBhcmVudDsKLQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCW5ld05leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAob2xkUGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuOwotCQkJRWxlbWVudEltcGwgb2xkRWxlbWVudCA9IChFbGVtZW50SW1wbCkgb2xkUGFyZW50OwotCQkJb2xkUGFyZW50ID0gb2xkRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAob2xkUGFyZW50ID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBlcnJvcgotCQkJbmV4dCA9IG9sZEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJaWYgKG9sZEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQlFbGVtZW50IGVuZCA9IG51bGw7Ci0JCQkJaWYgKCFvbGRFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSAmJiAhb2xkRWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChvbGRFbGVtZW50KTsKLQkJCQkJZW5kID0gb2xkRWxlbWVudDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVuZCA9IG9sZEVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJfQotCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQlpbnNlcnROb2RlKG5ld1BhcmVudCwgZW5kLCBuZXdOZXh0KTsKLQkJCQkJTm9kZSBlbmRQYXJlbnQgPSBlbmQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAoZW5kUGFyZW50ICE9IG5ld1BhcmVudCkgewotCQkJCQkJbmV3UGFyZW50ID0gZW5kUGFyZW50OwotCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJbmV3TmV4dCA9IGVuZC5nZXROZXh0U2libGluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAoISgoRWxlbWVudEltcGwpIGVsZW1lbnQpLmlzQ29udGFpbmVyKCkpIHsKLQkJCS8vIGp1c3QgdXBkYXRlIGNvbnRleHQKLQkJCU5vZGUgZWxlbWVudE5leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoZWxlbWVudE5leHQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZWxlbWVudE5leHQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBkZW1vdGUgc2libGluZ3MKLQkJTm9kZSBuZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQkvLyBmaW5kIG5ldyBwYXJlbnQKLQkJZm9yIChOb2RlIGxhc3QgPSBuZXdFbGVtZW50LmdldExhc3RDaGlsZCgpOyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0LmdldExhc3RDaGlsZCgpKSB7Ci0JCQlpZiAobGFzdC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWJyZWFrOwotCQkJRWxlbWVudEltcGwgbGFzdEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQlpZiAobGFzdEVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgbGFzdEVsZW1lbnQuaXNFbXB0eVRhZygpIHx8ICFsYXN0RWxlbWVudC5pc0NvbnRhaW5lcigpKQotCQkJCWJyZWFrOwotCQkJbmV3RWxlbWVudCA9IGxhc3RFbGVtZW50OwotCQl9Ci0JCU5vZGUgbGFzdENoaWxkID0gbmV3RWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJZGVtb3RlTm9kZXMoZWxlbWVudCwgbmV3RWxlbWVudCwgcGFyZW50LCBuZXh0KTsKLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIG5ld05leHQgPSBudWxsOwotCQlpZiAobGFzdENoaWxkICE9IG51bGwpCi0JCQluZXdOZXh0ID0gbGFzdENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCWVsc2UKLQkJCW5ld05leHQgPSBuZXdFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJZWxzZQotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbm9kZSBpZiBpdCBpcyBubyBsb25nZXIgcmVxdWlyZWQgaW1wbGljaXQgdGFnIHdpdGgKLQkgKiByZW1haW5pbmcgY2hpbGQgbm9kZXMgcHJvbW90ZWQuCi0JICovCi0JcHJpdmF0ZSBFbGVtZW50IHJlbW92ZUltcGxpY2l0RWxlbWVudChOb2RlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIG51bGw7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJaWYgKCFlbGVtZW50LmlzSW1wbGljaXRUYWcoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY2FuQmVJbXBsaWNpdFRhZyhlbGVtZW50KSkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgZWxlbWVudFBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAoZWxlbWVudFBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCU5vZGUgZmlyc3RDaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlOb2RlIGNoaWxkID0gZmlyc3RDaGlsZDsKLQkJTm9kZSBlbGVtZW50TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCU5vZGUgbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJZWxlbWVudFBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIGVsZW1lbnROZXh0KTsKLQkJCWNoaWxkID0gbmV4dENoaWxkOwotCQl9Ci0KLQkJLy8gcmVzZXQgY29udGV4dAotCQlpZiAodGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKSA9PSBlbGVtZW50KSB7Ci0JCQlOb2RlIG9sZE5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChvbGROZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUob2xkTmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZWxlbWVudE5leHQgIT0gbnVsbCkgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZWxlbWVudE5leHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZWxlbWVudFBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpID09IGVsZW1lbnQpIHsKLQkJCWlmIChmaXJzdENoaWxkICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZmlyc3RDaGlsZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZWxlbWVudE5leHQgIT0gbnVsbCkgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZWxlbWVudE5leHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZWxlbWVudFBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVOb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJTm9kZSBvbGRQYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAobm9kZSA9PSBvbGRQYXJlbnQpIHsKLQkJCWlmIChuZXh0ICE9IG51bGwpCi0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlOb2RlIG9sZE5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChub2RlID09IG9sZE5leHQpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0KLQkJaWYgKHJlbW92ZUltcGxpY2l0RWxlbWVudChwYXJlbnQpICE9IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZGVtb3RlIHNpYmxpbmcKLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHByZXY7Ci0JCQlpZiAoIW5ld0VsZW1lbnQuaGFzRW5kVGFnKCkgJiYgIW5ld0VsZW1lbnQuaXNFbXB0eVRhZygpICYmIG5ld0VsZW1lbnQuaXNDb250YWluZXIoKSkgewotCQkJCS8vIGZpbmQgbmV3IHBhcmVudAotCQkJCWZvciAoTm9kZSBsYXN0ID0gbmV3RWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCQlpZiAobGFzdC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJYnJlYWs7Ci0JCQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJCQlpZiAobGFzdEVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgbGFzdEVsZW1lbnQuaXNFbXB0eVRhZygpIHx8ICFsYXN0RWxlbWVudC5pc0NvbnRhaW5lcigpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJCQl9Ci0JCQkJTm9kZSBsYXN0Q2hpbGQgPSBuZXdFbGVtZW50LmdldExhc3RDaGlsZCgpOwotCQkJCWRlbW90ZU5vZGVzKHByZXYsIG5ld0VsZW1lbnQsIHBhcmVudCwgbmV4dCk7Ci0KLQkJCQkvLyB1cGRhdGUgY29udGV4dAotCQkJCU5vZGUgbmV3TmV4dCA9IG51bGw7Ci0JCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKQotCQkJCQluZXdOZXh0ID0gbGFzdENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQluZXdOZXh0ID0gbmV3RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVTdGFydFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGZvciBpbXBsaWNpdCB0YWcKLQkJRWxlbWVudEltcGwgb2xkRWxlbWVudCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGNhbkJlSW1wbGljaXRUYWcob2xkRWxlbWVudCkpIHsKLQkJCU5vZGUgbmV3UGFyZW50ID0gbnVsbDsKLQkJCU5vZGUgcHJldiA9IG9sZEVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIHByZXZFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwcmV2OwotCQkJCWlmICghcHJldkVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJaWYgKHByZXZFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgfHwgcHJldkVsZW1lbnQubWF0Y2hUYWdOYW1lKG9sZEVsZW1lbnQuZ2V0VGFnTmFtZSgpKSkgewotCQkJCQkJbmV3UGFyZW50ID0gcHJldkVsZW1lbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3UGFyZW50ID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIGVsZW1lbnQgc2hvdWxkIHN0YXkgYXMgaW1wbGljaXQgdGFnCi0JCQkJLy8ganVzdCByZW1vdmUgYWxsIGF0dHJpYnV0ZXMKLQkJCQlvbGRFbGVtZW50LnJlbW92ZVN0YXJ0VGFnKCk7Ci0KLQkJCQkvLyB1cGRhdGUgY29udGV4dAotCQkJCU5vZGUgY2hpbGQgPSBvbGRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChvbGRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG9sZEVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLy8gZm9yIGNvbW1lbnQgdGFnCi0JCWlmIChvbGRFbGVtZW50LmlzQ29tbWVudFRhZygpKQotCQkJb2xkRWxlbWVudC5yZW1vdmVTdGFydFRhZygpOwotCi0JCS8vIHByb21vdGUgY2hpbGRyZW4KLQkJTm9kZSBlbGVtZW50UGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCU5vZGUgcGFyZW50ID0gZWxlbWVudFBhcmVudDsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIGZpcnN0ID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCU5vZGUgZmlyc3RFbGVtZW50ID0gbnVsbDsgLy8gZm9yIHRoZSBjYXNlIGZpcnN0IGlzIHJlbW92ZWQgYXMgZW5kCi0JCS8vIHRhZwotCQlpZiAoZmlyc3QgIT0gbnVsbCkgewotCQkJLy8gZmluZCBuZXcgcGFyZW50IGZvciBjaGlsZHJlbgotCQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IG51bGw7Ci0JCQlmb3IgKE5vZGUgbGFzdCA9IGVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IGxhc3QgIT0gbnVsbDsgbGFzdCA9IGxhc3QuZ2V0TGFzdENoaWxkKCkpIHsKLQkJCQlpZiAobGFzdC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQlicmVhazsKLQkJCQlFbGVtZW50SW1wbCBsYXN0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbGFzdDsKLQkJCQlpZiAobGFzdEVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgbGFzdEVsZW1lbnQuaXNFbXB0eVRhZygpIHx8ICFsYXN0RWxlbWVudC5pc0NvbnRhaW5lcigpKQotCQkJCQlicmVhazsKLQkJCQluZXdFbGVtZW50ID0gbGFzdEVsZW1lbnQ7Ci0JCQl9Ci0JCQlOb2RlIG5leHQgPSBmaXJzdDsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCWlmICghbmV3RWxlbWVudC5oYXNFbmRUYWcoKSAmJiBuZXdFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQkJCWlmICghbmV4dEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0RWxlbWVudC5oYXNFbmRUYWcoKSAmJiBuZXh0RWxlbWVudC5tYXRjaEVuZFRhZyhuZXdFbGVtZW50KSkgewotCQkJCQkJCS8vIHN0b3AgYXQgdGhlIG1hdGNoZWQgaW52YWxpZCBlbmQgdGFnCi0JCQkJCQkJTm9kZSBlbGVtZW50Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQkJd2hpbGUgKGVsZW1lbnRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQkJCU5vZGUgbmV4dENoaWxkID0gZWxlbWVudENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJCW5leHRFbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnRDaGlsZCk7Ci0JCQkJCQkJCW5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudENoaWxkKTsKLQkJCQkJCQkJZWxlbWVudENoaWxkID0gbmV4dENoaWxkOwotCQkJCQkJCX0KLQotCQkJCQkJCW5leHQgPSBuZXh0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJCW5ld0VsZW1lbnQuYWRkRW5kVGFnKG5leHRFbGVtZW50KTsKLQkJCQkJCQlpZiAobmV4dEVsZW1lbnQgPT0gZmlyc3QpCi0JCQkJCQkJCWZpcnN0RWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0KLQkJCQkJCQlOb2RlIG5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gcGFyZW50KQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJCWJyZWFrOyAvLyBlcnJvcgotCQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWNhbkNvbnRhaW4obmV3RWxlbWVudCwgbmV4dCkpIHsKLQkJCQkJCU5vZGUgbmV3UGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IHBhcmVudCkKLQkJCQkJCQlicmVhazsKLQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCQlicmVhazsgLy8gZXJyb3IKLQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQllbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJfQotCQkJCW5ld0VsZW1lbnQgPSBudWxsOwotCQkJfQotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJfQotCQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJCWlmIChuZXdFbGVtZW50ID09IG51bGwgfHwgY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIGVsZW1lbnQpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlwYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQotCQkJCS8vIHByb21vdGUgc2libGluZ3MKLQkJCQlOb2RlIG5ld05leHQgPSBuZXdFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJTm9kZSBjaGlsZCA9IGVsZW1lbnQ7Ci0JCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQluZXdFbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV3TmV4dCk7Ci0JCQkJCWNoaWxkID0gbmV4dENoaWxkOwotCQkJCX0KLQotCQkJCS8vIGxlYXZlIHRoZSBvbGQgZW5kIHRhZyB3aGVyZSBpdCBpcwotCQkJCWlmIChuZXdFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCUVsZW1lbnQgZW5kID0gbmV3RWxlbWVudC5yZW1vdmVFbmRUYWcoKTsKLQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGVuZCwgbmV3TmV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFuZXdFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJLy8gaW1wbGljaXQgZWxlbWVudAotCQkJCQlpZiAoIW5ld0VsZW1lbnQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQobmV3RWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmV3RWxlbWVudCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTm9kZSBuZXdOZXh0ID0gZWxlbWVudDsKLQkJTm9kZSBzdGFydEVsZW1lbnQgPSBudWxsOyAvLyBmb3IgdGhlIGNhc2UgZWxlbWVudCBpcyByZW1vdmVkIGFzIGVuZAotCQkvLyB0YWcKLQkJaWYgKG9sZEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCS8vIGZpbmQgbmV3IHBhcmVudCBmb3IgaW52YWxpZCBlbmQgdGFnIGFuZCBzaWJsaW5ncwotCQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IG51bGw7Ci0JCQlmb3IgKE5vZGUgbGFzdCA9IGVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IGxhc3QgIT0gbnVsbDsgbGFzdCA9IGxhc3QuZ2V0TGFzdENoaWxkKCkpIHsKLQkJCQlpZiAobGFzdC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQlicmVhazsKLQkJCQlFbGVtZW50SW1wbCBsYXN0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbGFzdDsKLQkJCQlpZiAobGFzdEVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgbGFzdEVsZW1lbnQuaXNFbXB0eVRhZygpIHx8ICFsYXN0RWxlbWVudC5pc0NvbnRhaW5lcigpKQotCQkJCQlicmVhazsKLQkJCQluZXdFbGVtZW50ID0gbGFzdEVsZW1lbnQ7Ci0JCQl9Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gZGVtb3RlIGludmFsaWQgZW5kIHRhZyBhbmQgc2libGluZwotCQkJCU5vZGUgbmV4dCA9IGVsZW1lbnQ7Ci0JCQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJCQlpZiAoIW5ld0VsZW1lbnQuaGFzRW5kVGFnKCkgJiYgbmV3RWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJCQlpZiAoIW5leHRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dEVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgbmV4dEVsZW1lbnQubWF0Y2hFbmRUYWcobmV3RWxlbWVudCkpIHsKLQkJCQkJCQkvLyBzdG9wIGF0IHRoZSBtYXRjaGVkIGludmFsaWQgZW5kIHRhZwotCQkJCQkJCU5vZGUgZWxlbWVudENoaWxkID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQkJCXdoaWxlIChlbGVtZW50Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJCQlOb2RlIG5leHRDaGlsZCA9IGVsZW1lbnRDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQluZXh0RWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50Q2hpbGQpOwotCQkJCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnRDaGlsZCk7Ci0JCQkJCQkJCWVsZW1lbnRDaGlsZCA9IG5leHRDaGlsZDsKLQkJCQkJCQl9Ci0KLQkJCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJCW5ld0VsZW1lbnQuYWRkRW5kVGFnKG5leHRFbGVtZW50KTsKLQkJCQkJCQlpZiAobmV4dEVsZW1lbnQgPT0gbmV3TmV4dCkKLQkJCQkJCQkJc3RhcnRFbGVtZW50ID0gbmV3RWxlbWVudDsKLQotCQkJCQkJCU5vZGUgbmV3UGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gcGFyZW50KQotCQkJCQkJCWJyZWFrOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCWJyZWFrOyAvLyBlcnJvcgotCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCXBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCWlmIChjaGlsZCA9PSBvbGRFbGVtZW50KSB7Ci0JCQkJCQlpZiAoIW9sZEVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkJCQkvLyBjbG9uZSAocmUtY3JlYXRlKSBlbmQgdGFnCi0JCQkJCQkJRWxlbWVudCBlbmQgPSBvbGRFbGVtZW50LnJlbW92ZUVuZFRhZygpOwotCQkJCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQkJCQljaGlsZCA9IGVuZDsKLQkJCQkJCQkJbmV3TmV4dCA9IGVuZDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFvbGRFbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQkJCS8vIGNsb25lIChyZS1jcmVhdGUpIGVuZCB0YWcKLQkJCQkJRWxlbWVudCBlbmQgPSBvbGRFbGVtZW50LnJlbW92ZUVuZFRhZygpOwotCQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoZW5kLCBvbGRFbGVtZW50KTsKLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChvbGRFbGVtZW50KTsKLQkJCQkJCW5ld05leHQgPSBlbmQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdOZXh0ID0gb2xkRWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJcGFyZW50LnJlbW92ZUNoaWxkKG9sZEVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJTm9kZSBvbGRQYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlOb2RlIG9sZE5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJaWYgKGVsZW1lbnQgPT0gb2xkUGFyZW50KSB7Ci0JCQlpZiAob2xkTmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG9sZE5leHQpOyAvLyByZXNldCBmb3IgbmV3IHBhcmVudAotCQkJfQotCQkJZWxzZSBpZiAobmV3TmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50ID09IG9sZE5leHQpIHsKLQkJCWlmIChmaXJzdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKGZpcnN0RWxlbWVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGZpcnN0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXJ0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoc3RhcnRFbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJCX0KLQkJfQotCi0JCXJlbW92ZUltcGxpY2l0RWxlbWVudChlbGVtZW50UGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSBuZXh0LmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCXJlbW92ZU5vZGUobmV4dCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgZm9yIGVtcHR5IFRleHQKLQkJCQkJLy8gcmVtb3ZlIGFuZCBjb250aW51ZQotCQkJCQlyZW1vdmVOb2RlKG5leHQpOwotCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBuZXh0OwotCQkJCWJvb2xlYW4gaXNTaGFyZWQgPSB0ZXh0LmlzU2hhcmluZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCWlmIChpc1NoYXJlZCkgewotCQkJCQkvLyBtYWtlIHN1cmUgdGhlcmUgaXMgbmV4dCBUZXh0IG5vZGUgc2hhcmluZyB0aGlzCi0JCQkJCVRleHRJbXBsIG5leHRUZXh0ID0gKFRleHRJbXBsKSB0aGlzLmNvbnRleHQuZmluZE5leHRUZXh0KCk7Ci0JCQkJCWlmIChuZXh0VGV4dCA9PSBudWxsIHx8ICFuZXh0VGV4dC5oYXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJCQkJaXNTaGFyZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0ZXh0LnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpZiAodGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgcGFydGlhbCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzCi0JCQkJCS8vIHJlbW92ZWQKLQkJCQkJcmVtb3ZlTm9kZSh0ZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdGlmeSB0aGUgY2hhbmdlCi0JCQkJCXRleHQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJCS8vIGlmIHNoYXJlZCwgY29udGludWUgdG8gcmVtb3ZlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkvLyBmcm9tIHRoZW0KLQkJCQlpZiAoaXNTaGFyZWQpCi0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCWlmIChlbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCQkJcmVtb3ZlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCU5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQkvLyBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTm9kZSBwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwgfHwgcGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbmQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJaWYgKGVuZC5oYXNFbmRUYWcoKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVuZC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKCFlbmQuaGFzU3RhcnRUYWcoKSAmJiAhZW5kLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbmQpOwotCQkJCXJlbW92ZU5vZGUoZW5kKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWVuZC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJcmVtb3ZlRW5kVGFnKGVuZCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQluZXh0ID0gKE5vZGVJbXBsKSBlbmQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlwYXJlbnQgPSBlbmQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0JCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VSZWdpb25zIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXdSZWdpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yCi0JICogQHBhcmFtIG9sZFJlZ2lvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IKLQkgKi8KLQl2b2lkIHJlcGxhY2VSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLmNvbnRleHQgPSBuZXcgWE1MTW9kZWxDb250ZXh0KHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJLy8gb3B0aW1pemUgdHlwaWNhbCBjYXNlcwotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGZsYXROb2RlLCBuZXdSZWdpb25zLCBvbGRSZWdpb25zKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJY2hhbmdlRW5kVGFnKGZsYXROb2RlLCBuZXdSZWdpb25zLCBvbGRSZWdpb25zKTsKLQkJfQotCQllbHNlIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBtZXRob2QKLQkgKiAKLQkgKi8KLQl2b2lkIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpIHsKLQkJaWYgKHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLmNvbnRleHQgPSBuZXcgWE1MTW9kZWxDb250ZXh0KHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJaW50IG5ld0NvdW50ID0gKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCA/IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkgOiAwKTsKLQkJaW50IG9sZENvdW50ID0gKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCA/IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkgOiAwKTsKLQotCQlpZiAob2xkQ291bnQgPiAwKSB7Ci0JCQlzZXR1cENvbnRleHQob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKTsKLQkJCS8vIE5vZGUgc3RhcnRQYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZENvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKGkpOwotCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobmV3Q291bnQgPT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlzZXR1cENvbnRleHQobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKTsKLQkJfQotCQkvLyBtYWtlIHN1cmUgdGhlIHBhcmVudCBpcyBzZXQgdG8gZGVlcGVzdCBsZXZlbAotCQkvLyB3aGVuIGVuZCB0YWcgaGFzIGJlZW4gcmVtb3ZlZAotCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCi0JCWlmIChuZXdDb3VudCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3Q291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oaSk7Ci0JCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWNsZWFudXBUZXh0KCk7Ci0JCWNsZWFudXBFbmRUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXR1cENvbnRleHQgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIGRvY3VtZW50Ci0JCQlOb2RlIGNoaWxkID0gcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHJvb3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJLy8gbWlnaHQgYmUgYXQgdGhlIGVuZCBvZiBkb2N1bWVudAotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocm9vdCk7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA9PSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShub2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5vZGU7Ci0JCQlUZXh0IG5leHRUZXh0ID0gdGV4dC5zcGxpdFRleHQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCXRleHQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlpZiAobmV4dFRleHQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dFRleHQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG9mZnNldCA+PSAoKE5vZGVJbXBsKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkpCi0JCQkJY29udGludWU7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5vZGUpOwotCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCX0KLQotCXByb3RlY3RlZCBYTUxNb2RlbENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbFVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlZmMyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIFhNTE1vZGVsVXBkYXRlciBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxVcGRhdGVyIHsKLQlwcml2YXRlIGludCBkaWZmID0gMDsKLQlwcml2YXRlIGludCBnYXBMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGdhcE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBET01Nb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgbmV4dE5vZGUgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgcGFyZW50Tm9kZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxVcGRhdGVyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCQl0aGlzLmdlbmVyYXRvciA9IG1vZGVsLmdldEdlbmVyYXRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlQXR0clZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBhdHRyTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyTmFtZShBdHRyIGF0dHJOb2RlKSB7Ci0JCWlmIChhdHRyTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJOb2RlOwotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQljaGFuZ2VTdGFydFRhZyhlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IG9mZnNldDsKLQkJaW50IGVuZCA9IG9mZnNldDsKLQotCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJbmFtZSA9IG5ldyBTdHJpbmcoKTsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIuZ2V0TmFtZVJlZ2lvbigpOwotCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlzdGFydCArPSBuYW1lUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUgdGFpbGluZyBzcGFjZXMKLQkJZW5kICs9IG5hbWVSZWdpb24uZ2V0VGV4dEVuZCgpOwotCi0JCXJlcGxhY2VTb3VyY2UobmFtZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlQXR0clZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBhdHRyTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyVmFsdWUoQXR0ciBhdHRyTm9kZSkgewotCQlpZiAoYXR0ck5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyTm9kZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQljaGFyIHF1b3RlID0gMDsgLy8gbm8gcXVvdGUgcHJlZmVyZW5jZQotCQkJLy8gRFc6IDQvMTYvMjAwMyBkdWUgdG8gY2hhbmdlIGluIHN0cnVjdHVyZWREb2N1bWVudCAuLi4gd2UgbmVlZCBhCi0JCQkvLyBmbGF0bm9kZSB0bwotCQkJLy8gZ2V0IGF0IHJlZ2lvbiB2YWx1ZXMuIEZvciBub3cgSSdsbCBhc3N1bWUgdGhpcyBpcyBhbHdheXMgdGhlCi0JCQkvLyBmaXJzdAotCQkJLy8gZmxhdG5vZGUgLi4gbWF5IG5lZWQgdG8gbWFrZSBzbWFydGVyIGxhdGVyIChlLmcuIHRvIHNlYXJjaCBmb3IKLQkJCS8vIHRoZSBmbGF0bm9kZSB0aGF0IHRoaXMudmFsdWVSZWdpb24gYmVsb25ncyB0by4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlTdHJpbmcgb2xkVmFsdWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHZhbHVlUmVnaW9uKTsKLQkJCWlmIChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCWNoYXIgZmlyc3RDaGFyID0gb2xkVmFsdWUuY2hhckF0KDApOwotCQkJCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQkJCXF1b3RlID0gZmlyc3RDaGFyOwotCQkJCX0KLQkJCX0KLQotCQkJSVRleHRSZWdpb24gc3RhcnRSZWdpb24gPSB2YWx1ZVJlZ2lvbjsKLQotCQkJdmFsdWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyLCBxdW90ZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXZhbHVlID0gbmV3IFN0cmluZygpOwotCQkJCS8vIHJlbW92ZSBlcXVhbCB0b28KLQkJCQlJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IGF0dHIuZ2V0RXF1YWxSZWdpb24oKTsKLQkJCQlpZiAoZXF1YWxSZWdpb24gIT0gbnVsbCkKLQkJCQkJc3RhcnRSZWdpb24gPSBlcXVhbFJlZ2lvbjsKLQkJCX0KLQkJCWF0dHIuc2V0VmFsdWVSZWdpb24odmFsdWVSZWdpb24pOyAvLyByZXNldCB2YWx1ZQotCi0JCQlzdGFydCArPSBzdGFydFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJLy8gdXNlIGdldFRleHRFbmQoKSBiZWNhdXNlIGdldEVuZCgpIG1heSBpbmNsdWRlIHRoZSB0YWlsaW5nCi0JCQkvLyBzcGFjZXMKLQkJCWVuZCArPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IGF0dHIuZ2V0RXF1YWxSZWdpb24oKTsKLQotCQkJdmFsdWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGVxdWFsUmVnaW9uID09IG51bGwpCi0JCQkJCXJldHVybjsgLy8gbm90aG5nIHRvIGRvCi0JCQkJdmFsdWUgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJLy8gcmVtb3ZlIGVxdWFsCi0JCQkJc3RhcnQgKz0gZXF1YWxSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQllbmQgKz0gZXF1YWxSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGVxdWFsUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJLy8gdXNlIGdldFRleHRFbmQoKSBiZWNhdXNlIGdldEVuZCgpIG1heSBpbmNsdWRlIHRoZQotCQkJCQkvLyB0YWlsaW5nIHNwYWNlcwotCQkJCQlzdGFydCArPSBlcXVhbFJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gYXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0JCQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpCi0JCQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQkJCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUKLQkJCQkJLy8gdGFpbGluZyBzcGFjZXMKLQkJCQkJc3RhcnQgKz0gbmFtZVJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQkJCXZhbHVlID0gJz0nICsgdmFsdWU7Ci0JCQkJfQotCQkJCWVuZCA9IHN0YXJ0OwotCQkJfQotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZSh2YWx1ZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBjaGFuZ2VFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaW50IG9mZnNldCA9IGltcGwuZ2V0RW5kU3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCQlpZiAoaW1wbC5oYXNFbmRUYWcoKSkgewotCQkJZW5kID0gaW1wbC5nZXRFbmRPZmZzZXQoKTsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWltcGwuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCkpOwotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGNoYW5nZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoYW5nZU5hbWUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIHN1cHBvcnQgY2hhbmdpbmcgbmFtZSBvZiBhdHRyaWJ1dGUgZm9yIHNldFByZWZpeCgpCi0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJY2hhbmdlQXR0ck5hbWUoKEF0dHIpIG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm47Ci0JfQotCi0Jdm9pZCBjaGFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIGZ1dHVyZV9UT0RPOiBvcHRpbWl6ZQotCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJdGhpcy5wYXJlbnROb2RlID0gcm9vdDsKLQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJcmVtb3ZlR2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcihmbGF0Tm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIGZhbGxiYWNrIG1ldGhvZCB0byByZWdlbmVyYXRlIHRoZSBzdGFydCB0YWcuCi0JICovCi0Jdm9pZCBjaGFuZ2VTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotCQlpZiAoIWltcGwuaGFzU3RhcnRUYWcoKSAmJiAhaW1wbC5oYXNFbmRUYWcoKSkgewotCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgdGFncwotCQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJlcGxhY2VDaGlsZChwYXJlbnQsIGVsZW1lbnQsIGVsZW1lbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIGVsc2UgZXJyb3IKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlpbnQgb2Zmc2V0ID0gaW1wbC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0JCWlmIChpbXBsLmhhc1N0YXJ0VGFnKCkpIHsKLQkJCWVuZCA9IGltcGwuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCWltcGwuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKSk7Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IG9sZE9mZnNldCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgb2xkRW5kID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlib29sZWFuIGlzRW5kVGFnID0gZmFsc2U7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpbnQgbmV4dE9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKG5leHRPZmZzZXQgPT0gb2xkT2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCWlmICh0ZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWludCBuZXh0RW5kID0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJCWlmIChuZXh0T2Zmc2V0IDwgb2xkRW5kICYmIG5leHRFbmQgPiBvbGRPZmZzZXQpIHsKLQkJCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLm5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMucGFyZW50Tm9kZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJCQlpc0VuZFRhZyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWlmIChlbmRPZmZzZXQgPT0gb2xkT2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJCQlpc0VuZFRhZyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG93bmVyTm9kZS5nZXROb2RlVHlwZSgpOwotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG93bmVyTm9kZTsKLQkJCWlmIChpc0VuZFRhZykgewotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJdXBkYXRlQXR0clJlZ2lvbnMoZWxlbWVudCwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgb3duZXJOb2RlOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQlpbnQgbmV3T2Zmc2V0ID0gb2xkT2Zmc2V0OwotCQkJCWludCBuZXdFbmQgPSBvbGRFbmQ7Ci0JCQkJaWYgKG9sZE9mZnNldCA9PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQluZXdPZmZzZXQgKz0gdGhpcy5kaWZmOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmV3RW5kID0gdGhpcy5nYXBPZmZzZXQ7Ci0JCQkJfQotCQkJCWludCBuZXdMZW5ndGggPSBuZXdFbmQgLSBuZXdPZmZzZXQ7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkobmV3T2Zmc2V0LCBuZXdMZW5ndGgsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCQlpbnQgb2Zmc2V0ID0gcHJveHkuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZCA9IG9mZnNldCArIHByb3h5LmdldExlbmd0aCgpOwotCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCWlmIChvZmZzZXQgPT0gb2xkT2Zmc2V0ICYmIGVuZCA9PSBvbGRFbmQpIHsKLQkJCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoZW5kID4gb2xkRW5kKSB7Ci0JCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9sZEVuZCk7Ci0JCQkJCQkJcHJveHkuc2V0TGVuZ3RoKGVuZCAtIG9sZEVuZCk7Ci0JCQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihwcm94eSk7Ci0JCQkJCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChvZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9mZnNldCArIHRoaXMuZGlmZik7Ci0JCQkJCWVuZCArPSB0aGlzLmRpZmY7Ci0JCQkJfQotCQkJCWlmIChlbmQgPCBvbGRFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCWludCBuZXdPZmZzZXQgPSBvbGRPZmZzZXQ7Ci0JCQkJCQlpbnQgbmV3RW5kID0gb2xkRW5kOwotCQkJCQkJaWYgKG9sZE9mZnNldCA9PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQkJCW5ld09mZnNldCArPSB0aGlzLmRpZmY7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQluZXdFbmQgPSB0aGlzLmdhcE9mZnNldDsKLQkJCQkJCX0KLQkJCQkJCWludCBuZXdMZW5ndGggPSBuZXdFbmQgLSBuZXdPZmZzZXQ7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShuZXdPZmZzZXQsIG5ld0xlbmd0aCwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0KLQkJCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gcHJveHkuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgZW5kID0gb2Zmc2V0ICsgcHJveHkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlpZiAoZW5kIDw9IG9sZE9mZnNldCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKG9mZnNldCA9PSBvbGRPZmZzZXQgJiYgZW5kID09IG9sZEVuZCkgewotCQkJCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaWYgKGVuZCA+IG9sZEVuZCkgewotCQkJCQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9sZEVuZCk7Ci0JCQkJCQkJCQlwcm94eS5zZXRMZW5ndGgoZW5kIC0gb2xkRW5kKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCQkJCQlpZiAoZW5kIDwgb2xkRW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChvZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJCQlwcm94eS5zZXRPZmZzZXQob2Zmc2V0ICsgdGhpcy5kaWZmKTsKLQkJCQkJCQllbmQgKz0gdGhpcy5kaWZmOwotCQkJCQkJfQotCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW93bmVyTm9kZS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VUZXh0RGF0YShUZXh0IHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2UodGV4dCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQotCQlUZXh0SW1wbCBpbXBsID0gKFRleHRJbXBsKSB0ZXh0OwotCQlpbnQgc3RhcnQgPSBpbXBsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBpbXBsLmdldEVuZE9mZnNldCgpOwotCQlpbnQgb2Zmc2V0ID0gc3RhcnQ7Ci0KLQkJLy8gbWFrZSBzdXJlIHByZXZpb3VzIHRhZyBpcyBjbG9zZWQKLQkJTm9kZSBwcmV2ID0gdGV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZVRhZyA9IGdldENsb3NlVGFnKChJRE9NTm9kZSkgcHJldik7Ci0JCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCW9mZnNldCArPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJc291cmNlID0gcHJlVGFnICsgc291cmNlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlTdHJpbmcgcHJlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCQlvZmZzZXQgKz0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlidWZmZXIuYXBwZW5kKHByZVRhZyk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJCQkJaWYgKHRleHQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsICYmICFlbGVtZW50Lmhhc0VuZFRhZygpICYmIChlbGVtZW50LmlzSlNQQ29udGFpbmVyKCkgfHwgZWxlbWVudC5pc0NEQVRBQ29udGFpbmVyKCkpKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBlbmQgdGFnCi0JCQkJCQlTdHJpbmcgcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJaWYgKHBvc3RUYWcgIT0gbnVsbCkgewotCQkJCQkJCWludCBwb3N0TGVuZ3RoID0gcG9zdFRhZy5sZW5ndGgoKTsKLQkJCQkJCQlpZiAocG9zdExlbmd0aCA+IDApIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZChwb3N0VGFnKTsKLQkJCQkJCQkJaW50IHBvc3RPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkocG9zdE9mZnNldCwgcG9zdExlbmd0aCk7Ci0JCQkJCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBpbXBsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJaW1wbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoYW5nZVZhbHVlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQljaGFuZ2VUZXh0RGF0YSgoVGV4dCkgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCWNoYW5nZUF0dHJWYWx1ZSgoQXR0cikgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdGFydFRhZygoRWxlbWVudCkgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2Uobm9kZSk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQotCQlOb2RlSW1wbCBpbXBsID0gKE5vZGVJbXBsKSBub2RlOwotCQlpbnQgc3RhcnQgPSBpbXBsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBpbXBsLmdldEVuZE9mZnNldCgpOwotCi0JCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoc3RhcnQsIGxlbmd0aCk7Ci0JCWltcGwuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0clZhbHVlQ2xvc2UoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsIHx8IHJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsdWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2hlY2sgb3BlbiBKU1AgdGFnCi0JCWJvb2xlYW4gY2xvc2VKU1BUYWcgPSBmYWxzZTsKLQkJaW50IG9mZnNldCA9IHZhbHVlLmluZGV4T2YoSlNQVGFnLlRBR19PUEVOKTsKLQkJd2hpbGUgKG9mZnNldCA+PSAwKSB7Ci0JCQlvZmZzZXQgPSB2YWx1ZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UsIG9mZnNldCArIDIpOwotCQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCQljbG9zZUpTUFRhZyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvZmZzZXQgPSB2YWx1ZS5pbmRleE9mKEpTUFRhZy5UQUdfT1BFTiwgb2Zmc2V0ICsgMik7Ci0JCX0KLQotCQkvLyBjaGVjayBxdW90ZQotCQlib29sZWFuIGNsb3NlUXVvdGUgPSBmYWxzZTsKLQkJY2hhciBmaXJzdENoYXIgPSB2YWx1ZS5jaGFyQXQoMCk7Ci0JCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQlpZiAoY2xvc2VKU1BUYWcgfHwgbGVuZ3RoID09IDEgfHwgdmFsdWUuY2hhckF0KGxlbmd0aCAtIDEpICE9IGZpcnN0Q2hhcikgewotCQkJCWNsb3NlUXVvdGUgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjbG9zZUpTUFRhZyAmJiAhY2xvc2VRdW90ZSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChjbG9zZUpTUFRhZykKLQkJCWJ1ZmZlci5hcHBlbmQoSlNQVGFnLlRBR19DTE9TRSk7Ci0JCWlmIChjbG9zZVF1b3RlKQotCQkJYnVmZmVyLmFwcGVuZChmaXJzdENoYXIpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2F0aGVyIGNsb3NlIHRhZ3MgcmVjdXJzaXZlbHkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xvc2VUYWcoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuaXNDbG9zZWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKG5vZGUpOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCS8vIGVuZCB0YWcgaXMgbm90IGNsb3NlZAotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlQ2xvc2VUYWcoZWxlbWVudCk7Ci0JCX0KLQotCQkvLyBubyBlbmQgdGFnCi0JCWludCBvZmZzZXQgPSBlbGVtZW50LmdldEVuZE9mZnNldCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgZWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKGxhc3RDaGlsZCA9PSBudWxsKSB7Ci0JCQlpZiAoIWVsZW1lbnQuaXNTdGFydFRhZ0Nsb3NlZCgpKSB7Ci0JCQkJaWYgKGVsZW1lbnQucHJlZmVyRW1wdHlUYWcoKSkKLQkJCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJCQlTdHJpbmcgY2xvc2VUYWcgPSBnZXRTdGFydENsb3NlVGFnKGVsZW1lbnQpOwotCQkJCWlmIChjbG9zZVRhZyAhPSBudWxsKSB7Ci0JCQkJCWludCBsZW5ndGggPSBjbG9zZVRhZy5sZW5ndGgoKTsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBjbG9zZVRhZyA9IGdldENsb3NlVGFnKGxhc3RDaGlsZCk7Ci0JCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBjbG9zZVRhZy5sZW5ndGgoKTsKLQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpOwotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTdGFydENsb3NlVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmlzU3RhcnRUYWdDbG9zZWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBhdHRyVmFsdWVDbG9zZSA9IGdldEF0dHJWYWx1ZUNsb3NlKGVsZW1lbnQpOwotCQlpZiAoYXR0clZhbHVlQ2xvc2UgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlQ2xvc2UpOwotCQlTdHJpbmcgY2xvc2VUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQl0aGlzLmdhcE9mZnNldCA9IDA7Ci0JCXRoaXMuZ2FwTGVuZ3RoID0gMDsKLQkJdGhpcy5kaWZmID0gMDsKLQkJdGhpcy5wYXJlbnROb2RlID0gbnVsbDsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKGludCBlbmRPZmZzZXQpIHsKLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpIDwgZW5kT2Zmc2V0KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShpbnQgc3RhcnRPZmZzZXQpIHsKLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpID49IHN0YXJ0T2Zmc2V0KQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IG5ld09mZnNldCA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgbmV3RW5kID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlib29sZWFuIGlzRW5kVGFnID0gZmFsc2U7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgbmV4dE9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKG5leHRPZmZzZXQgPT0gbmV3T2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJaW50IG5leHRFbmQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJCQkJaWYgKG5leHRPZmZzZXQgPCBuZXdFbmQgJiYgbmV4dEVuZCA+IG5ld09mZnNldCkgewotCQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlOb2RlIGNoaWxkID0gdGhpcy5uZXh0Tm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgY2hpbGQ7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMubmV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHRoaXMucGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5wYXJlbnROb2RlOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IGVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpZiAoZW5kT2Zmc2V0ID09IG5ld09mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBvd25lck5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lck5vZGU7Ci0JCQlpZiAoaXNFbmRUYWcpIHsKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXVwZGF0ZUF0dHJSZWdpb25zKGVsZW1lbnQsIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG93bmVyTm9kZTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgb2xkT2Zmc2V0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpbnQgb2xkRW5kID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJaWYgKG9sZE9mZnNldCA9PSBuZXdPZmZzZXQgJiYgb2xkRW5kID09IG5ld0VuZCkgewotCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJaWYgKG9sZE9mZnNldCA9PSBuZXdPZmZzZXQpIHsKLQkJCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IG5ld1Byb3h5ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KCk7Ci0JCQkJCQluZXdQcm94eS5zZXRPZmZzZXQob2xkT2Zmc2V0KTsKLQkJCQkJCW5ld1Byb3h5LnNldExlbmd0aChuZXdFbmQgLSBvbGRPZmZzZXQpOwotCQkJCQkJbmV3UHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1Byb3h5KTsKLQkJCQkJfQotCQkJCQlwcm94eS5zZXRPZmZzZXQobmV3RW5kKTsKLQkJCQkJcHJveHkuc2V0TGVuZ3RoKG9sZEVuZCAtIG5ld0VuZCk7Ci0JCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocHJveHkpOwotCQkJCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCQkJaWYgKG9sZEVuZCA8IG5ld0VuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaW50IG9mZnNldCA9IGNvbnRlbnQuZ2V0U3RhcnQoKTsKLQkJCQkJaW50IGVuZCA9IGNvbnRlbnQuZ2V0RW5kKCk7Ci0JCQkJCWlmIChlbmQgPD0gbmV3T2Zmc2V0KQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChvZmZzZXQgPT0gbmV3T2Zmc2V0ICYmIGVuZCA9PSBuZXdFbmQpIHsKLQkJCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJCWlmIChlbmQgPiBuZXdFbmQpIHsKLQkJCQkJCQlpZiAob2Zmc2V0ID09IG5ld09mZnNldCkgewotCQkJCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBuZXdQcm94eSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSgpOwotCQkJCQkJCQluZXdQcm94eS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQkJCQkJbmV3UHJveHkuc2V0TGVuZ3RoKG5ld0VuZCAtIG9mZnNldCk7Ci0JCQkJCQkJCW5ld1Byb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1Byb3h5LCBpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG5ld0VuZCk7Ci0JCQkJCQkJcHJveHkuc2V0TGVuZ3RoKGVuZCAtIG5ld0VuZCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJaWYgKGVuZCA9PSBuZXdFbmQpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChvbGRFbmQgPCBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlR2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJfQotCQllbHNlIGlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlpZiAoY291bnQgPiAxKQotCQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJZWxzZQotCQkJCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCWlmIChjb3VudCA+IDEpCi0JCQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBnYXBFbmQgPSB0aGlzLmdhcE9mZnNldCArIHRoaXMuZ2FwTGVuZ3RoOwotCQlpbnQgb2xkT2Zmc2V0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWludCBvbGRFbmQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCWlmIChvbGRPZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQgJiYgb2xkRW5kIDw9IGdhcEVuZCkKLQkJCXJldHVybjsgLy8gZG8gbm90aGluZwotCQlpbnQgb2xkTGVuZ3RoID0gb2xkRW5kIC0gb2xkT2Zmc2V0OwotCQlpZiAob2xkT2Zmc2V0ID49IGdhcEVuZCkKLQkJCW9sZE9mZnNldCArPSB0aGlzLmRpZmY7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCUVsZW1lbnRJbXBsIG93bmVyRW5kVGFnID0gbnVsbDsKLQkJVGV4dEltcGwgb3duZXJUZXh0ID0gbnVsbDsKLQkJd2hpbGUgKHRoaXMucGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMubmV4dE5vZGU7Ci0JCQkJCWlmICh0ZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJb3duZXJUZXh0ID0gdGV4dDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLm5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMucGFyZW50Tm9kZTsKLQkJCQlpZiAoZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQlvd25lckVuZFRhZyA9IGVsZW1lbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAob3duZXJUZXh0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBvd25lclRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2xkT2Zmc2V0LCBvbGRMZW5ndGgpOwotCQkJCW93bmVyVGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCX0KLQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJaWYgKGVuZCA8IG9sZEVuZCAmJiAoZW5kIDwgdGhpcy5nYXBPZmZzZXQgfHwgb2xkRW5kID4gZ2FwRW5kKSkgeyAvLyBoYXMKLQkJCQkJLy8gc2hhcmVkCi0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvbGRPZmZzZXQsIG9sZExlbmd0aCk7Ci0JCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCQkJCX0KLQkJCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCAmJiAoZW5kIDwgdGhpcy5nYXBPZmZzZXQgfHwgb2xkRW5kID4gZ2FwRW5kKSkgeyAvLyBoYXMKLQkJCQkJCQkJLy8gc2hhcmVkCi0JCQkJCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9sZE9mZnNldCwgb2xkTGVuZ3RoKTsKLQkJCWlmIChvd25lckVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJb3duZXJFbmRUYWcuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQXR0ciBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXZvaWQgcmVwbGFjZUF0dHIoRWxlbWVudCBvd25lckVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKSB7Ci0JCWlmIChvd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgb3duZXJFbGVtZW50OwotCQlpZiAoIWVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCi0JCWJvb2xlYW4gaW5zZXJ0U3BhY2UgPSBmYWxzZTsKLQkJU3RyaW5nIGF0dHJWYWx1ZUNsb3NlID0gbnVsbDsKLQkJaWYgKG9sZEF0dHIgIT0gbnVsbCkgewotCQkJQXR0ckltcGwgaW1wbCA9IChBdHRySW1wbCkgb2xkQXR0cjsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBpbXBsLmdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGltcGwuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQllbmQgKz0gbGFzdFJlZ2lvbi5nZXRFbmQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxhc3RSZWdpb24gPSBpbXBsLmdldEVxdWFsUmVnaW9uKCk7Ci0JCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCQllbmQgKz0gbGFzdFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVuZCArPSBuYW1lUmVnaW9uLmdldEVuZCgpOwotCQkJCQlsYXN0UmVnaW9uID0gbmFtZVJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjaGVjayB0aGVyZSBhcmUgZXh0cmEgc3BhY2UgYmVmb3JlIHRoZSBsYXN0IGF0dHJpYnV0ZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBuYW1lUmVnaW9uKSB7Ci0JCQkJCWlmIChpID4gMCkgewotCQkJCQkJcHJldlJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkgLSAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVnaW9uID09IGxhc3RSZWdpb24pIHsKLQkJCQkJaWYgKGkgKyAxIDwgcmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJCW5leHRSZWdpb24gPSByZWdpb25zLmdldChpICsgMSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYm9vbGVhbiBpc0xhc3RBdHRyID0gZmFsc2U7Ci0JCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBuZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UgfHwgaXNOZXN0ZWRUYWdDbG9zZShyZWdpb25UeXBlKSkgewotCQkJCQlpc0xhc3RBdHRyID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNMYXN0QXR0ciAmJiBwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydCArPSBwcmV2UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0ICs9IG5hbWVSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCX0KLQotCQkJLy8gaW1wbC5yZXNldFJlZ2lvbnMob3duZXJFbGVtZW50KTsKLQkJCWltcGwucmVzZXRSZWdpb25zKGVsZW1lbnQpOwotCQl9Ci0JCWVsc2UgeyAvLyBhcHBlbmQgYXR0cmlidXRlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCi0JCQlhdHRyVmFsdWVDbG9zZSA9IGdldEF0dHJWYWx1ZUNsb3NlKGVsZW1lbnQpOwotCQkJaWYgKGF0dHJWYWx1ZUNsb3NlICE9IG51bGwgJiYgYXR0clZhbHVlQ2xvc2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW5zZXJ0U3BhY2UgPSB0cnVlOwotCQkJCXN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJZW5kID0gc3RhcnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQkJaW50IGF0dHJTdGFydCA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IHJlZ2lvbnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IGlzTmVzdGVkVGFnQ2xvc2UocmVnaW9uVHlwZSkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaW50IHJlZ2lvbkVuZCA9IHJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJaWYgKHJlZ2lvbkVuZCA9PSByZWdpb24uZ2V0VGV4dEVuZCgpKQotCQkJCQkJaW5zZXJ0U3BhY2UgPSB0cnVlOwotCQkJCQlhdHRyU3RhcnQgPSByZWdpb25FbmQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoYXR0clN0YXJ0ID09IDApCi0JCQkJCXJldHVybjsgLy8gbm90IGZvdW5kLCBtdXN0IG5ldmVyIGhhcHBlbgotCQkJCXN0YXJ0ICs9IGF0dHJTdGFydDsKLQkJCQllbmQgPSBzdGFydDsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IDI7Ci0JCQlpZiAoYXR0clZhbHVlQ2xvc2UgIT0gbnVsbCkKLQkJCQlzaXplICs9IGF0dHJWYWx1ZUNsb3NlLmxlbmd0aCgpOwotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJOYW1lKG5ld0F0dHIpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQlzaXplICs9IG5hbWUubGVuZ3RoKCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShuZXdBdHRyKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCXNpemUgKz0gdmFsdWUubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzaXplKTsKLQkJCWlmIChhdHRyVmFsdWVDbG9zZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlQ2xvc2UpOwotCQkJaWYgKGluc2VydFNwYWNlKQotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCX0KLQkJCXNvdXJjZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHJlcGxhY2VDaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5ld0NoaWxkID09IG51bGwgJiYgb2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGVuZCA9IDA7Ci0JCVN0cmluZyBwcmVUYWcgPSBudWxsOwotCQlTdHJpbmcgcG9zdFRhZyA9IG51bGw7Ci0JCUVsZW1lbnRJbXBsIHBvc3RFbGVtZW50ID0gbnVsbDsKLQkJaWYgKG9sZENoaWxkICE9IG51bGwpIHsKLQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIG9sZENoaWxkOwotCQkJc3RhcnQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQllbmQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG9sZENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl9Ci0JCQlub2RlLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOyAvLyByZXNldCB2YWx1ZXMgZnJvbQotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQl9Ci0JCWVsc2UgewotCQkJTm9kZUltcGwgcHJldiA9IChOb2RlSW1wbCkgbmV3Q2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQkJc3RhcnQgPSBwcmV2LmdldEVuZE9mZnNldCgpOwotCQkJCWVuZCA9IHN0YXJ0OwotCQkJCXByZVRhZyA9IGdldENsb3NlVGFnKHByZXYpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZmlyc3QgY2hpbGQKLQkJCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBuZXdDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQgPSBuZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWVuZCA9IHN0YXJ0OwotCQkJCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlwcmVUYWcgPSBnZXRTdGFydENsb3NlVGFnKChJRE9NRWxlbWVudCkgcGFyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5ld2x5IGhhdmluZyBhIGNoaWxkCi0JCQkJCWlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudE5vZGU7Ci0JCQkJCQlpZiAoZWxlbWVudC5pc0VtcHR5VGFnKCkpIHsgLy8gZW1wdHkgdGFnIGZvcm1hdAotCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MKLQkJCQkJCQllbmQgPSBlbGVtZW50LmdldEVuZE9mZnNldCgpOwotCQkJCQkJCXN0YXJ0ID0gZW5kIC0gMjsgLy8gZm9yICIvPiIKLQkJCQkJCQllbGVtZW50LnNldEVtcHR5VGFnKGZhbHNlKTsKLQkJCQkJCQlwcmVUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQkJCQkJCXBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQlwb3N0RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICghZWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCQkJc3RhcnQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJZW5kID0gc3RhcnQ7Ci0JCQkJCQkJLy8gaW52YWxpZCBlbmQgdGFnIG9yIGltcGxpY2l0IHRhZwotCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IHRhZwotCQkJCQkJCXByZVRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJaWYgKHByZVRhZyAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBsZW5ndGggPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KHN0YXJ0LCBsZW5ndGgpOwotCQkJCQkJCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCQkJCS8vIGltcGxpY2l0IHRhZwotCQkJCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBlbmQgdGFncwotCQkJCQkJCQlwb3N0VGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJCXBvc3RFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzdGFydCA9IGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCQkJCQllbmQgPSBzdGFydDsKLQkJCQkJCQlwcmVUYWcgPSBnZXRTdGFydENsb3NlVGFnKGVsZW1lbnQpOwotCQkJCQkJCWlmIChwcmVUYWcgIT0gbnVsbCAmJiBwcmVUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSAmJiAoZWxlbWVudC5pc0pTUENvbnRhaW5lcigpIHx8IGVsZW1lbnQuaXNDREFUQUNvbnRhaW5lcigpKSkgewotCQkJCQkJCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgZW5kIHRhZwotCQkJCQkJCQkJcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJCQkJcG9zdEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGVsc2UgbWlnaHQgRE9DVU1FTlRfTk9ERSwgc3RhcnQgYW5kIGVuZCBhcmUgMAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAobmV3Q2hpbGQgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBvZmZzZXQgPSBzdGFydDsKLQkJCWlmIChwcmVUYWcgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJYnVmZmVyLmFwcGVuZChwcmVUYWcpOwotCQkJCX0KLQkJCX0KLQotCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgbmV3Q2hpbGQ7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCQlpZiAoZWxlbWVudC5wcmVmZXJFbXB0eVRhZygpKQotCQkJCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCQkJCVN0cmluZyBzdGFydFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChzdGFydFRhZyAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gc3RhcnRUYWcubGVuZ3RoKCk7Ci0JCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoc3RhcnRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIGNvbnRlbnQgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVNvdXJjZShub2RlKTsKLQkJCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJCWNvbnRlbnQgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJCWludCBsZW5ndGggPSBjb250ZW50Lmxlbmd0aCgpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQl9Ci0JCQkJCW5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0KLQkJCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJbm9kZSA9IGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0KLQkJCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChub2RlID09IG5ld0NoaWxkKSB7Ci0JCQkJCQlub2RlID0gbnVsbDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCQkJbm9kZSA9IG5leHQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCW5vZGUgPSAoTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJY29udGludWU7Ci0JCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwb3N0VGFnICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gcG9zdFRhZy5sZW5ndGgoKTsKLQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHBvc3RUYWcpOwotCQkJCQlpZiAocG9zdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQlwb3N0RWxlbWVudC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlpZiAoc3RhcnQgPT0gZW5kICYmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIG5vIHRoaW5nIGNoYW5nZWQKLQkJCXJldHVybjsKLQkJfQotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQl2b2lkIHJlcGxhY2VSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQkvLyBmdXR1cmVfVE9ETzogb3B0aW1pemUKLQotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIoZmxhdE5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCS8qKgotCSAqIFdyYXBzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ucmVwbGFjZVRleHQoKSBhbmQgc2V0cyBjb250ZXh0dWFsCi0JICogaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VTb3VyY2UoU3RyaW5nIHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWludCBpbnNlcnRlZCA9IDA7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJZWxzZQotCQkJaW5zZXJ0ZWQgPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCByZW1vdmVkID0gZW5kIC0gc3RhcnQ7Ci0JCWlmIChpbnNlcnRlZCA9PSAwICYmIHJlbW92ZWQgPT0gMCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmdhcE9mZnNldCA9IHN0YXJ0OwotCQl0aGlzLmdhcExlbmd0aCA9IHJlbW92ZWQ7Ci0JCXRoaXMuZGlmZiA9IGluc2VydGVkIC0gcmVtb3ZlZDsKLQkJLy8gTm90ZTogZHVlIHRvIGJ1ZwotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzYxOQotCQkvLyBmb3Igbm93IGFzc3VtZSAiaWdub3JlIHJlYWRvbmx5IiByZWdpb24gaXMgb2sgLS0gYXNzdW1lIERPTSBpdHNlbGYKLQkJLy8gY2hlY2tzIGlmCi0JCS8vIG9rIHRvIGluc2VydCBvciBub3QuIEluIHJlYWxpdHksIHdlIG1heSBoYXZlIHRvIG1ha2Ugb3IgImNvbnRhaW5zIgotCQkvLyBtZXRob2QgbW9yZQotCQkvLyBiZXR0ZXIuIE9yLCB3ZSBtYXkgaGF2ZSB0byAicGVyY3VsYXRlIHVwIiB0aGUgcGFyYW1ldGVyIGZvciBjbGllbnRzCi0JCS8vIHRvIHRlbGwgdXMgcHJvZ3JhbWF0aWNhbGx5Ci0JCS8vIHRoYXQgaXRzIG9rIHRvIGluc2VydC9mb3JtYXQgaW4gYSByZWFkLW9ubHkgcmVnaW9uLgotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLm1vZGVsLCB0aGlzLmdhcE9mZnNldCwgdGhpcy5nYXBMZW5ndGgsIHNvdXJjZSwgdHJ1ZSk7Ci0JfQotCi0Jdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCUVudW1lcmF0aW9uIGUgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQlFbnVtZXJhdGlvbiBlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCQkJfQotCQkJaWYgKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCQkvLyBtYWtlIHN1cmUgdG8gcmVzdG9yZSBhbGwgYmFja3VwZWQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQotCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCS8vIG1ha2Ugc3VyZSB0byByZXN0b3JlIGFsbCBiYWNrdXBlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcih0aGlzLmdhcE9mZnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQXR0clJlZ2lvbnMoRWxlbWVudCBlbGVtZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0KLQkJLy8gdXBkYXRlIGF0dHJpYnV0ZXMKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9IC0xOwotCQlBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKCsraW5kZXgpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIHJlc2V0IG90aGVyIHJlZ2lvbnMKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihudWxsKTsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3ZjY0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW5kIHBhcnNlcyBmaXJzdCBvZiBYTUwgZmlsZSB0byBnZXQgZW5jb2RpbmcuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvciBleHRlbmRzIFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQkvKioKLQkgKiBYTUxMb2FkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YTUxEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YTUxEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE2YjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW4gWE1MIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIFN0cnVjdHVyZWQgTW9kZWwuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgWE1MRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBkZWxpbWl0ZXIgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJaWYgKGRlbGltaXRlciA9PSBudWxsKQotCQkJZGVsaW1pdGVyID0gc3VwZXIuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihmaWxlKTsKLQkJcmV0dXJuIGRlbGltaXRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllZTcxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyIHsKLQkvKioKLQkgKiBKdXN0IGEgc21hbGwgY29udGFpbmVyIGNsYXNzIHRoYXQgaG9sZHMgYSBET01Ob2RlICYgZG9jdW1lbnRSZWdpb24gdGhhdAotCSAqIHNob3VsZCByZXByZXNlbnQgZWFjaCBvdGhlci4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRE9NUmVnaW9uIHsKLQkJcHVibGljIElET01Ob2RlIGRvbU5vZGU7Ci0JCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBQUkVTRVJWRSA9ICJwcmVzZXJ2ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBDT0xMQVBTRSA9ICJjb2xsYXBzZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBSRVBMQUNFID0gInJlcGxhY2UiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFJFU0VSVkVfUVVPVEVEID0gIlwicHJlc2VydmVcIiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBYTUxfU1BBQ0UgPSAieG1sOnNwYWNlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhTTF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBYU0xfQVRUUklCVVRFID0gImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNMX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLmNtLnByb3BlcnRpZXMvd2hpdGVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzIGZQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3I7Ci0KLQlwcml2YXRlIGludCByZXBsYWNlU3BhY2VzKFRleHRFZGl0IHRleHRFZGl0LCBpbnQgc3BhY2VTdGFydE9mZnNldCwgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCwgU3RyaW5nIHdoaXRlc3BhY2VSdW4pIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKHdoaXRlc3BhY2VSdW4pOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgYnVmZi5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlidWZmLnNldENoYXJBdChpLCAnICcpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nID0gYnVmZi50b1N0cmluZygpOwotCQlpZiAoIXJlcGxhY2VtZW50U3RyaW5nLmVxdWFscyh3aGl0ZXNwYWNlUnVuKSkgewotCQkJUmVwbGFjZUVkaXQgcmVwbGFjZUVkaXQgPSBuZXcgUmVwbGFjZUVkaXQoc3BhY2VTdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSwgcmVwbGFjZW1lbnRTdHJpbmcpOwotCQkJdGV4dEVkaXQuYWRkQ2hpbGQocmVwbGFjZUVkaXQpOwotCQl9Ci0JCXJldHVybiBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotCQotCXByaXZhdGUgaW50IGNvbGxhcHNlU3BhY2VzKFRleHRFZGl0IHRleHRFZGl0LCBpbnQgc3BhY2VTdGFydE9mZnNldCwgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCwgU3RyaW5nIHdoaXRlc3BhY2VSdW4pIHsKLQkJLy8gcHJlZmVyIHRvIHVzZSB1c2UgZXhpc3Rpbmcgd2hpdGVzcGFjZQotCQlpbnQgZXhpc3RpbmdXaGl0ZXNwYWNlT2Zmc2V0ID0gd2hpdGVzcGFjZVJ1bi5pbmRleE9mKCcgJyk7Ci0JCWlmIChleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQgPiAtMSkgewotCQkJLy8gZGVsZXRlIHdoaXRlc3BhY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgZXhpc3Rpbmcgd2hpdGVzcGFjZQotCQkJaWYgKGV4aXN0aW5nV2hpdGVzcGFjZU9mZnNldCA+IDApIHsKLQkJCQlEZWxldGVFZGl0IGRlbGV0ZUVkaXQgPSBuZXcgRGVsZXRlRWRpdChzcGFjZVN0YXJ0T2Zmc2V0LCBleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQpOwotCQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZUVkaXQpOwotCQkJfQotCQkJaWYgKGV4aXN0aW5nV2hpdGVzcGFjZU9mZnNldCA8IHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJaW50IG5leHRPZmZzZXQgPSBleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQgKyAxOwotCQkJCURlbGV0ZUVkaXQgZGVsZXRlRWRpdCA9IG5ldyBEZWxldGVFZGl0KHNwYWNlU3RhcnRPZmZzZXQgKyBuZXh0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpIC0gbmV4dE9mZnNldCk7Ci0JCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZGVsZXRlRWRpdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBkZWxldGUgYWxsIHdoaXRlc3BhY2UgYW5kIGluc2VydCBuZXcgb25lCi0JCQkvLyBjb2xsYXBzZSB3aGl0ZXNwYWNlIGJ5IGRlbGV0aW5nIHdoaXRlc3BhY2UKLQkJCURlbGV0ZUVkaXQgZGVsZXRlRWRpdCA9IG5ldyBEZWxldGVFZGl0KHNwYWNlU3RhcnRPZmZzZXQsIHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkpOwotCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZGVsZXRlRWRpdCk7Ci0JCQkvLyB0aGVuIGluc2VydCBvbmUgc3BhY2UKLQkJCUluc2VydEVkaXQgaW5zZXJ0RWRpdCA9IG5ldyBJbnNlcnRFZGl0KHNwYWNlU3RhcnRPZmZzZXQsIFNQQUNFKTsKLQkJCXRleHRFZGl0LmFkZENoaWxkKGluc2VydEVkaXQpOwotCQl9Ci0JCS8vIHJlbWVtYmVyIHRvIGFjY291bnQgZm9yIHNwYWNlIGFkZGVkCi0JCS0tYXZhaWxhYmxlTGluZVdpZHRoOwotCQlyZXR1cm4gYXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQkKLQlwcml2YXRlIGludCBjb2xsYXBzZUFuZEluZGVudChUZXh0RWRpdCB0ZXh0RWRpdCwgaW50IHNwYWNlU3RhcnRPZmZzZXQsIGludCBhdmFpbGFibGVMaW5lV2lkdGgsIGludCBpbmRlbnRMZXZlbCwgU3RyaW5nIHdoaXRlc3BhY2VSdW4sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbikgewotCQkvLyBOZWVkIHRvIGtlZXAgYmxhbmsgbGluZXMsIGJ1dCBzdGlsbCBjb2xsYXBzZSB0aGUgd2hpdGVzcGFjZQotCQlTdHJpbmcgbGluZURlbGltaXRlcnMgPSBudWxsOwotCQlpZiAoIWdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKSB7Ci0JCQlsaW5lRGVsaW1pdGVycyA9IGV4dHJhY3RMaW5lRGVsaW1pdGVycyh3aGl0ZXNwYWNlUnVuLCBjdXJyZW50UmVnaW9uKTsKLQkJCVN0cmluZyBmb3JtYXR0ZWRMaW5lID0gbGluZURlbGltaXRlcnMgKyBnZXRJbmRlbnRTdHJpbmcoaW5kZW50TGV2ZWwpOwotCQkJaWYobGluZURlbGltaXRlcnMubGVuZ3RoKCkgPiAwICYmICFmb3JtYXR0ZWRMaW5lLmVxdWFscyh3aGl0ZXNwYWNlUnVuKSkgewotCQkJCXRleHRFZGl0LmFkZENoaWxkKG5ldyBSZXBsYWNlRWRpdChzcGFjZVN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpLCBmb3JtYXR0ZWRMaW5lKSk7Ci0JCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0TWF4TGluZVdpZHRoKCkgLSBpbmRlbnRMZXZlbDsKLQkJCX0KLQkJfQotCQlpZiAobGluZURlbGltaXRlcnMgPT0gbnVsbCB8fCBsaW5lRGVsaW1pdGVycy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlhdmFpbGFibGVMaW5lV2lkdGggPSBjb2xsYXBzZVNwYWNlcyh0ZXh0RWRpdCwgc3BhY2VTdGFydE9mZnNldCwgYXZhaWxhYmxlTGluZVdpZHRoLCB3aGl0ZXNwYWNlUnVuKTsKLQkJfQotCQlyZXR1cm4gYXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVUcmFpbGluZ1NwYWNlcyhUZXh0RWRpdCB0ZXh0RWRpdCwgSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudERvY3VtZW50UmVnaW9uKSB7Ci0JCWludCB0ZXh0RW5kID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQlpbnQgdGV4dEVuZE9mZnNldCA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgdGV4dEVuZDsKLQkJaW50IGRpZmZlcmVuY2UgPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRFbmQoKSAtIHRleHRFbmQ7Ci0JCURlbGV0ZUVkaXQgZGVsZXRlRWRpdCA9IG5ldyBEZWxldGVFZGl0KHRleHRFbmRPZmZzZXQsIGRpZmZlcmVuY2UpOwotCQl0ZXh0RWRpdC5hZGRDaGlsZChkZWxldGVFZGl0KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEVkaXQgZm9ybWF0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmb3JtYXQoZG9jdW1lbnQsIHN0YXJ0LCBsZW5ndGgsIG5ldyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSk7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IGZvcm1hdChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCwgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCVRleHRFZGl0IGVkaXQgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZWRpdCA9IGZvcm1hdChtb2RlbCwgc3RhcnQsIGxlbmd0aCwgcHJlZmVyZW5jZXMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0OwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmb3JtYXQobW9kZWwsIHN0YXJ0LCBsZW5ndGgsIG5ldyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSk7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IGZvcm1hdChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQlzZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMocHJlZmVyZW5jZXMpOwotCi0JCVRleHRFZGl0IGVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCS8vIGdldCBpbml0aWFsIGRvY3VtZW50IHJlZ2lvbgotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBkb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCWlmIChjdXJyZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWludCBzdGFydE9mZnNldCA9IGN1cnJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJLy8gZ2V0IGluaXRpYWwgZG9tIG5vZGUKLQkJCUluZGV4ZWRSZWdpb24gY3VycmVudEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCWlmIChjdXJyZW50SW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJLy8gc2V0IHVwIGRvbVJlZ2lvbiB3aGljaCB3aWxsIGNvbnRhaW4gY3VycmVudCByZWdpb24gdG8gYmUKLQkJCQkvLyBmb3JtYXR0ZWQKLQkJCQlJRE9NTm9kZSBjdXJyZW50RE9NTm9kZSA9IChJRE9NTm9kZSkgY3VycmVudEluZGV4ZWRSZWdpb247Ci0JCQkJRE9NUmVnaW9uIGRvbVJlZ2lvbiA9IG5ldyBET01SZWdpb24oKTsKLQkJCQlkb21SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBjdXJyZW50UmVnaW9uOwotCQkJCWRvbVJlZ2lvbi5kb21Ob2RlID0gY3VycmVudERPTU5vZGU7Ci0JCQkJCi0JCQkJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzID0gZ2V0UmVnaW9uQ29uc3RyYWludHMoY3VycmVudERPTU5vZGUpOwotCQkJCQotCQkJCS8qIGlmIHRoZSB3aGl0ZXNwYWNlIHN0cmF0ZWd5IGlzIGRlY2xhcmVkIGFzIGRlZmF1bHQsIGdldCBpdCBmcm9tIHRoZSBwcmVmZXJlbmNlcyAqLwotCQkJCWlmKHBhcmVudENvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUKQotCQkJCQlwYXJlbnRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0RWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneSgpKTsKLQkJCQkKLQkJCQkvLyBUT0RPOiBpbml0aWFsaXplIGluZGVudExldmVsCi0JCQkJLy8gaW5pdGlhbGl6ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCWludCBsaW5lV2lkdGggPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRNYXhMaW5lV2lkdGgoKTsKLQkJCQl0cnkgewotCQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoc3RhcnRPZmZzZXQpOwotCQkJCQlsaW5lV2lkdGggPSBsaW5lV2lkdGggLSAoc3RhcnRPZmZzZXQgLSBsaW5lSW5mby5nZXRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGxpbmVXaWR0aCk7Ci0KLQkJCQkvLyBmb3JtYXQgYWxsIHNpYmxpbmdzIChhbmQgdGhlaXIgY2hpbGRyZW4pIGFzIGxvbmcgdGhleQotCQkJCS8vIG92ZXJsYXAgd2l0aCBzdGFydC9sZW5ndGgKLQkJCQlQb3NpdGlvbiBmb3JtYXRSYW5nZSA9IG5ldyBQb3NpdGlvbihzdGFydCwgbGVuZ3RoKTsKLQkJCQlmb3JtYXRTaWJsaW5ncyhlZGl0LCBkb21SZWdpb24sIHBhcmVudENvbnN0cmFpbnRzLCBmb3JtYXRSYW5nZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB0aGUgZm9ybWF0dGluZyBjb25zdHJhaW50cyBmb3IgYSBzcGVjaWZpZWQgbm9kZSBiYXNlZCBvbgotCSAqIGl0cyBhbmNlc3RvcnMnIGZvcm1hdHRpbmcuIEluIHBhcnRpY3VsYXIsIGlmIGFueSBhbmNlc3RvciBub2RlIGVpdGhlcgotCSAqIGV4cGxpY2l0bHkgZGVmaW5lcyB3aGl0ZXNwYWNlIHByZXNlcnZhdGlvbiBvciBpZ25vcmFuY2UsIHRoYXQKLQkgKiB3aGl0ZXNwYWNlIHN0cmF0ZWd5IHNob3VsZCBiZSB1c2VkIGZvciA8Y29kZT5jdXJyZW50Tm9kZTwvY29kZT4gYW5kIAotCSAqIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMuCi0JICogCi0JICogQHBhcmFtIGN1cnJlbnROb2RlIHRoZSBub2RlIHRvIGludmVzdGlnYXRlIHRoZSBhbmNlc3RyeSBvZiB0byBkZXRlcm1pbmUKLQkgKiBmb3JtYXR0aW5nIGNvbnN0cmFpbnRzCi0JICogCi0JICogQHJldHVybiBmb3JtYXR0aW5nIGNvbnN0cmFpbnRzIGRlZmluZWQgYnkgYW4gYW5jZXN0b3IKLQkgKi8KLQlwcml2YXRlIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBnZXRSZWdpb25Db25zdHJhaW50cyhJRE9NTm9kZSBjdXJyZW50Tm9kZSkgewotCQlJRE9NTm9kZSBpdGVyYXRvciA9IGN1cnJlbnROb2RlOwotCQlYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcmVzdWx0ID0gbmV3IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cygpOwotCQlET01SZWdpb24gcmVnaW9uID0gbmV3IERPTVJlZ2lvbigpOwotCQlYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMgPSBuZXcgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzKCk7Ci0JCWJvb2xlYW4gcGFyZW50ID0gdHJ1ZTsKLQkJCi0JCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYW5jZXN0cnkgdG8gZmluZCBpZiBhbnkgZXhwbGljaXQgd2hpdGVzcGFjZSBzdHJhdGVneSBoYXMKLQkJICogYmVlbiBkZWZpbmVkCi0JCSAqLwotCQl3aGlsZShpdGVyYXRvciAhPSBudWxsICYmIGl0ZXJhdG9yLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlpdGVyYXRvciA9IChJRE9NTm9kZSkgaXRlcmF0b3IuZ2V0UGFyZW50Tm9kZSgpOwotCQkJcmVnaW9uLmRvbU5vZGUgPSBpdGVyYXRvcjsKLQkJCXJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IGl0ZXJhdG9yLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkKLQkJCXVwZGF0ZUZvcm1hdHRpbmdDb25zdHJhaW50cyhudWxsLCBudWxsLCByZXN1bHQsIHJlZ2lvbik7Ci0JCQkKLQkJCS8qIElmIHRoaXMgaXMgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlLCBrZWVwIHRoZSBjb25zdHJhaW50cwotCQkJICogaW4gY2FzZSBubyBvdGhlciBjb25zdHJhaW50cyBhcmUgaWRlbnRpZmllZAotCQkJICovCi0JCQlpZihwYXJlbnQpIHsKLQkJCQlwYXJlbnRDb25zdHJhaW50cy5jb3B5Q29uc3RyYWludHMocmVzdWx0KTsKLQkJCQlwYXJlbnQgPSBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLyogQSBwYXJlbnQgd2hvIGhhcyBkZWZpbmVkIGEgc3BlY2lmaWMgd2hpdGVzcGFjZSBzdHJhdGVneSB3YXMgZm91bmQgKi8KLQkJCWlmKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRSA9PSByZXN1bHQuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkgfHwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkRFRkFVTFQgPT0gcmVzdWx0LmdldFdoaXRlc3BhY2VTdHJhdGVneSgpKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJldHVybiBwYXJlbnRDb25zdHJhaW50czsKLQl9Ci0vLwlwcml2YXRlIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBnZXRSZWdpb25Db25zdHJhaW50cyhJRE9NTm9kZSBjdXJyZW50Tm9kZSkgewotLy8JCUlET01Ob2RlIGl0ZXJhdG9yID0gKElET01Ob2RlKSBjdXJyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0vLwkJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHJlc3VsdCA9IG5ldyBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMoKTsKLS8vCQlET01SZWdpb24gcmVnaW9uID0gbmV3IERPTVJlZ2lvbigpOwotLy8JCQotLy8JCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYW5jZXN0cnkgdG8gZmluZCBpZiBhbnkgZXhwbGljaXQgd2hpdGVzcGFjZSBzdHJhdGVneSBoYXMKLS8vCQkgKiBiZWVuIGRlZmluZWQKLS8vCQkgKi8KLS8vCQl3aGlsZShpdGVyYXRvciAhPSBudWxsICYmIGl0ZXJhdG9yLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0KLS8vCQkJcmVnaW9uLmRvbU5vZGUgPSBpdGVyYXRvcjsKLS8vCQkJcmVnaW9uLmRvY3VtZW50UmVnaW9uID0gaXRlcmF0b3IuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLS8vCQkJCi0vLwkJCXVwZGF0ZUZvcm1hdHRpbmdDb25zdHJhaW50cyhudWxsLCBudWxsLCByZXN1bHQsIHJlZ2lvbik7Ci0vLwkJCQotLy8JCQkvKiBBIHBhcmVudCB3aG8gaGFzIGRlZmluZWQgYSBzcGVjaWZpYyB3aGl0ZXNwYWNlIHN0cmF0ZWd5IHdhcyBmb3VuZCAqLwotLy8JCQlpZihYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUgPT0gcmVzdWx0LmdldFdoaXRlc3BhY2VTdHJhdGVneSgpIHx8IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUID09IHJlc3VsdC5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSkKLS8vCQkJCXJldHVybiByZXN1bHQ7Ci0vLwkJCQotLy8JCQlpdGVyYXRvciA9IChJRE9NTm9kZSkgaXRlcmF0b3IuZ2V0UGFyZW50Tm9kZSgpOwotLy8JCX0KLS8vCQkKLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQkKLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBnaXZlbiB4bWwgY29udGVudCByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEVkaXQKLQkgKiBAcGFyYW0gZm9ybWF0UmFuZ2UKLQkgKiBAcGFyYW0gcGFyZW50Q29uc3RyYWludHMKLQkgKiBAcGFyYW0gY3VycmVudERPTVJlZ2lvbgotCSAqIEBwYXJhbSBwcmV2aW91c1JlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRDb250ZW50KFRleHRFZGl0IHRleHRFZGl0LCBQb3NpdGlvbiBmb3JtYXRSYW5nZSwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBET01SZWdpb24gY3VycmVudERPTVJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c1JlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCQlTdHJpbmcgZnVsbFRleHQgPSBjdXJyZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0KLQkJLy8gY2hlY2sgaWYgaW4gcHJlc2VydmUgc3BhY2UgbW9kZSwgaWYgc28sIGRvbid0IHRvdWNoIGFueXRoaW5nIGJ1dAotCQkvLyBtYWtlIHN1cmUgdG8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCVN0cmluZyB3aGl0ZXNwYWNlTW9kZSA9IHBhcmVudENvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpOwotCQlpZiAod2hpdGVzcGFjZU1vZGUgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFKSB7Ci0JCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gcGFyZW50Q29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0JCQlhdmFpbGFibGVMaW5lV2lkdGggPSB1cGRhdGVMaW5lV2lkdGhXaXRoTGFzdExpbmUoZnVsbFRleHQsIGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0KLQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aCBpbiBjb25zdHJhaW50cwotCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiBjb250ZW50IGlzIGp1c3Qgd2hpdGVzcGFjZSBhbmQgdGhlcmUncyBzb21ldGhpbmcgYWZ0ZXIgaXQKLQkJLy8ganVzdCBza2lwIG92ZXIgdGhpcyByZWdpb24gYmVjYXVzZSByZWdpb24gd2lsbCB0YWtlIGNhcmUgb2YgaXQKLQkJYm9vbGVhbiBpc0FsbFdoaXRlc3BhY2UgPSAoKElET01UZXh0KSBjdXJyZW50RE9NUmVnaW9uLmRvbU5vZGUpLmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJaWYgKGlzQWxsV2hpdGVzcGFjZSkgewotCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGZQcmVmZXJlbmNlcy5nZXRNYXhMaW5lV2lkdGgoKSk7Ci0JCQluZXh0RG9jdW1lbnRSZWdpb24gPSBjdXJyZW50UmVnaW9uLmdldE5leHQoKTsKLQkJCWlmIChuZXh0RG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGlmIHRleHQgZm9sbG93cyBhbiBlbnRpdHkgb3IgY2RhdGEgcmVnaW9uCi0JCWlmICh3aGl0ZXNwYWNlTW9kZSAhPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0UgJiYgcHJldmlvdXNSZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZXZpb3VSZWdpb25UeXBlID0gcHJldmlvdXNSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHByZXZpb3VSZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UgfHwgcHJldmlvdVJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkKLQkJCQl3aGl0ZXNwYWNlTW9kZSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRTsKLQkJfQotCQkvLyBhbHNvLCBzcGVjaWFsIGhhbmRsaW5nIGlmIHRleHQgaXMgYmVmb3JlIGFuIGVudGl0eSBvciBjZGF0YSByZWdpb24KLQkJaWYgKHdoaXRlc3BhY2VNb2RlICE9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRSkgewotCQkJLy8gZ2V0IG5leHQgZG9jdW1lbnQgcmVnaW9uIGlmIGRvbnQgYWxyZWFkeSBoYXZlIGl0Ci0JCQlpZiAobmV4dERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQkJbmV4dERvY3VtZW50UmVnaW9uID0gY3VycmVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQlpZiAobmV4dERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmV4dFJlZ2lvblR5cGUgPSBuZXh0RG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChuZXh0UmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFIHx8IG5leHRSZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpCi0JCQkJCXdoaXRlc3BhY2VNb2RlID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkNPTExBUFNFOwotCQkJfQotCQl9Ci0JCWZvcm1hdFRleHRJbkNvbnRlbnQodGV4dEVkaXQsIHBhcmVudENvbnN0cmFpbnRzLCBjdXJyZW50UmVnaW9uLCBmdWxsVGV4dCwgd2hpdGVzcGFjZU1vZGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmb3JtYXRFbXB0eVN0YXJ0VGFnV2l0aE5vQXR0cihUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCBpbnQgYXZhaWxhYmxlTGluZVdpZHRoLCBTdHJpbmcgaW5kZW50U3RyYXRlZ3ksIFN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3ksIElUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uKSB7Ci0JCS8vIGdldCBwcmVmZXJlbmNlIGlmIHRoZXJlIHNob3VsZCBiZSBhIHNwYWNlIG9yIG5vdCBiZXR3ZWVuIHRhZwotCQkvLyBuYW1lIGFuZCBlbXB0eSB0YWcgY2xvc2UKLQkJLy8gPHRhZ05hbWUgLz4KLQkJYm9vbGVhbiBvbmVTcGFjZUluVGFnTmFtZSA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldFNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZygpOwotCi0JCS8vIGNhbGN1bGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQlpbnQgdGFnTmFtZUxpbmVXaWR0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDM7Ci0JCWlmIChvbmVTcGFjZUluVGFnTmFtZSkgewotCQkJLy8gYWRkIG9uZSBtb3JlIHRvIGFjY291bnQgZm9yIHNwYWNlIGJlZm9yZSBlbXB0eSB0YWcgY2xvc2UKLQkJCSsrdGFnTmFtZUxpbmVXaWR0aDsKLQkJfQotCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQotCQlpZiAoaW5kZW50U3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOTElORSkgewotCQkJLy8gaWYgd2FzIGlubGluaW5nLCBuZWVkIHRvIGNoZWNrIGlmIG91dCBvZiBhdmFpbGFibGUgbGluZQotCQkJLy8gd2lkdGgKLQkJCWlmIChhdmFpbGFibGVMaW5lV2lkdGggPCAwKSB7Ci0JCQkJLy8gbmVlZCB0byBpbmRlbnQgaWYgcG9zc2libGUKLQkJCQlpbnQgbGluZVdpZHRoID0gaW5kZW50SWZQb3NzaWJsZSh0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgdHJ1ZSk7Ci0JCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJaWYgKGxpbmVXaWR0aCA+IDApCi0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIHRhZ05hbWVMaW5lV2lkdGg7Ci0JCQkJZWxzZQotCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vIG5lZWQgdG8gaW5kZW50Ci0JCQkJLy8ganVzdCBtYWtlIHN1cmUgdG8gZGVsZXRlIHByZXZpb3VzIHdoaXRlc3BhY2UgaWYKLQkJCQkvLyBuZWVkZWQKLQkJCQlpZiAoKHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpICYmIChwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbGxhcHNlU3BhY2VzKHRleHRFZGl0LCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGF2YWlsYWJsZUxpbmVXaWR0aCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBkZWxldGUgYW55IHRyYWlsIHNwYWNlcyBhZnRlciB0YWcgbmFtZQotCQlpbnQgdGV4dExlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJaW50IHJlZ2lvbkxlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpOwotCi0JCWJvb2xlYW4gdGhlcmVBcmVTcGFjZXMgPSB0ZXh0TGVuZ3RoIDwgcmVnaW9uTGVuZ3RoOwotCQlpZiAoIW9uZVNwYWNlSW5UYWdOYW1lICYmIHRoZXJlQXJlU3BhY2VzKSB7Ci0JCQlkZWxldGVUcmFpbGluZ1NwYWNlcyh0ZXh0RWRpdCwgY3VycmVudFRleHRSZWdpb24sIGN1cnJlbnREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZihvbmVTcGFjZUluVGFnTmFtZSkgewotCQkJaW5zZXJ0U3BhY2VBbmRDb2xsYXBzZSh0ZXh0RWRpdCwgY3VycmVudERvY3VtZW50UmVnaW9uLCBhdmFpbGFibGVMaW5lV2lkdGgsIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJfQotCQljb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIGFuIGVuZCB0YWcKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEVkaXQKLQkgKiBAcGFyYW0gY3VycmVudFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0UmVnaW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRFbmRUYWcoVGV4dEVkaXQgdGV4dEVkaXQsIFBvc2l0aW9uIGZvcm1hdFJhbmdlLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY29uc3RyYWludHMsIERPTVJlZ2lvbiBjdXJyZW50RE9NUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCi0JCVN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3kgPSBjb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKTsKLQkJU3RyaW5nIGluZGVudFN0cmF0ZWd5ID0gY29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKTsKLQotCQkvLyBkbyBub3QgZm9ybWF0IHNwYWNlIGJlZm9yZSBzdGFydCB0YWcgaWYgcHJlc2VydmluZyBzcGFjZXMKLQkJaWYgKHdoaXRlc3BhY2VTdHJhdGVneSAhPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpIHsKLQkJCS8vIGZvcm1hdCBsaWtlIGluZGVudCBzdHJhdGVneSBzYXlzCi0JCQlpZiAoaW5kZW50U3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVCB8fCBpbmRlbnRTdHJhdGVneSA9PSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuTkVXX0xJTkUpIHsKLQkJCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZQb3NzaWJsZSh0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgZmFsc2UpOwotCQkJCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCQkJfQotCQl9Ci0JCS8vIGZvcm1hdCB0aGUgZW5kIHRhZyBpdHNlbGYKLQkJZm9ybWF0V2l0aGluRW5kVGFnKHRleHRFZGl0LCBjb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBnaXZlbiByZWdpb24gKGFuZCBhbGwgaXRzIGNoaWxkcmVuKSBjb250YWluZWQgaW4gZG9tUmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0Ci0JICogICAgICAgICAgICBlZGl0cyByZXF1aXJlZCB0byBmb3JtYXQKLQkgKiBAcGFyYW0gZm9ybWF0UmFuZ2UKLQkgKiAgICAgICAgICAgIGRvY3VtZW50IHJhbmdlIHRvIGZvcm1hdCAob25seSBmb3JtYXQgY29udGVudCB3aXRoaW4gdGhpcwotCSAqICAgICAgICAgICAgcmFuZ2UpCi0JICogQHBhcmFtIHBhcmVudENvbnN0cmFpbnRzCi0JICogQHBhcmFtIGRvbVJlZ2lvbgotCSAqICAgICAgICAgICAgYXNzdW1lcyBkb20gbm9kZSAmIHJlZ2lvbiBhcmUgbm90IG51bGwKLQkgKiBAcGFyYW0gcHJldmlvdXNSZWdpb24KLQkgKiAgICAgICAgICAgIGNvdWxkIGJlIG51bGwKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxhc3QgcmVnaW9uIGZvcm1hdHRlZAotCSAqLwotCXByaXZhdGUgRE9NUmVnaW9uIGZvcm1hdFJlZ2lvbihUZXh0RWRpdCBlZGl0LCBQb3NpdGlvbiBmb3JtYXRSYW5nZSwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBET01SZWdpb24gZG9tUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzUmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGRvbVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBjdXJyZW50UmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBjdXJyZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlTdHJpbmcgdGV4dFJlZ2lvblR5cGUgPSB0ZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0ZXh0UmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCWRvbVJlZ2lvbiA9IGZvcm1hdFN0YXJ0VGFnKGVkaXQsIGZvcm1hdFJhbmdlLCBwYXJlbnRDb25zdHJhaW50cywgZG9tUmVnaW9uLCBwcmV2aW91c1JlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0UmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQlmb3JtYXRFbmRUYWcoZWRpdCwgZm9ybWF0UmFuZ2UsIHBhcmVudENvbnN0cmFpbnRzLCBkb21SZWdpb24sIHByZXZpb3VzUmVnaW9uKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCWZvcm1hdENvbnRlbnQoZWRpdCwgZm9ybWF0UmFuZ2UsIHBhcmVudENvbnN0cmFpbnRzLCBkb21SZWdpb24sIHByZXZpb3VzUmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkgewotCQkJZm9ybWF0Q29tbWVudChlZGl0LCBmb3JtYXRSYW5nZSwgcGFyZW50Q29uc3RyYWludHMsIGRvbVJlZ2lvbiwgcHJldmlvdXNSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdW5rbm93biwgc28ganVzdCBsZWF2ZSBhbG9uZSBmb3Igbm93IGJ1dCBtYWtlIHN1cmUgdG8gdXBkYXRlCi0JCQkvLyBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJU3RyaW5nIGZ1bGxUZXh0ID0gY3VycmVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQkJaW50IHdpZHRoID0gdXBkYXRlTGluZVdpZHRoV2l0aExhc3RMaW5lKGZ1bGxUZXh0LCBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSk7Ci0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgod2lkdGgpOwotCQl9Ci0JCXJldHVybiBkb21SZWdpb247Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgZG9tUmVnaW9uIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuIGFuZCBzaWJsaW5ncwotCSAqIAotCSAqIEBwYXJhbSBlZGl0Ci0JICogQHBhcmFtIGRvbVJlZ2lvbgotCSAqIEBwYXJhbSBwYXJlbnRDb25zdHJhaW50cwotCSAqIEBwYXJhbSBmb3JtYXRSYW5nZQotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRTaWJsaW5ncyhUZXh0RWRpdCBlZGl0LCBET01SZWdpb24gZG9tUmVnaW9uLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIFBvc2l0aW9uIGZvcm1hdFJhbmdlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBkb21SZWdpb24uZG9jdW1lbnRSZWdpb247Ci0JCUlET01Ob2RlIGN1cnJlbnRET01Ob2RlID0gZG9tUmVnaW9uLmRvbU5vZGU7Ci0JCXdoaWxlIChjdXJyZW50RE9NTm9kZSAhPSBudWxsICYmIGN1cnJlbnRSZWdpb24gIT0gbnVsbCAmJiBmb3JtYXRSYW5nZS5vdmVybGFwc1dpdGgoY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50UmVnaW9uLmdldExlbmd0aCgpKSAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCWRvbVJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IGN1cnJlbnRSZWdpb247Ci0JCQlkb21SZWdpb24uZG9tTm9kZSA9IGN1cnJlbnRET01Ob2RlOwotCi0JCQkvLyBuZWVkIHRvIG1ha2Ugc3VyZSBjdXJyZW50IGRvY3VtZW50IHJlZ2lvbiBhbmQgY3VycmVudAotCQkJLy8gZG9tIG5vZGUgbWF0Y2ggdXAKLQkJCWlmIChjdXJyZW50UmVnaW9uID09IGN1cnJlbnRET01Ob2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCQkvLyBmb3JtYXQgdGhpcyBkb2N1bWVudCByZWdpb24vbm9kZSwgZm9ybWF0UmVnaW9uIHdpbGwKLQkJCQkvLyByZXR1cm4gdGhlIGxhc3Qgbm9kZS9yZWdpb24gZm9ybWF0dGVkCi0JCQkJZG9tUmVnaW9uID0gZm9ybWF0UmVnaW9uKGVkaXQsIGZvcm1hdFJhbmdlLCBwYXJlbnRDb25zdHJhaW50cywgZG9tUmVnaW9uLCBwcmV2aW91c1JlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBUT0RPOiBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBpZiB0aGV5IGRvbid0Ci0JCQkJLy8gbWF0Y2ggdXAKLQkJCX0KLQkJCXByZXZpb3VzUmVnaW9uID0gZG9tUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCQkJLy8gZ2V0IHRoZSBuZXh0IHNpYmxpbmcgaW5mb3JtYXRpb24KLQkJCWlmIChkb21SZWdpb24uZG9tTm9kZSAhPSBudWxsKQotCQkJCWN1cnJlbnRET01Ob2RlID0gKElET01Ob2RlKSBkb21SZWdpb24uZG9tTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJZWxzZQotCQkJCWN1cnJlbnRET01Ob2RlID0gbnVsbDsKLQkJCWN1cnJlbnRSZWdpb24gPSBwcmV2aW91c1JlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIGEgc3RhcnQgdGFnCi0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIGN1cnJlbnRSZWdpb24KLQkgKiBAcGFyYW0gdGV4dFJlZ2lvbnMKLQkgKi8KLQlwcml2YXRlIERPTVJlZ2lvbiBmb3JtYXRTdGFydFRhZyhUZXh0RWRpdCB0ZXh0RWRpdCwgUG9zaXRpb24gZm9ybWF0UmFuZ2UsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgRE9NUmVnaW9uIGN1cnJlbnRET01SZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNEb2N1bWVudFJlZ2lvbikgewotCQkvLyBkZXRlcm1pbmUgcHJvcGVyIGluZGVudCBieSByZWZlcnJpbmcgdG8gcGFyZW50IGNvbnN0cmFpbnRzLAotCQkvLyBwcmV2aW91cyBub2RlLCBhbmQgY3VycmVudCBub2RlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudERvY3VtZW50UmVnaW9uID0gY3VycmVudERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJSURPTU5vZGUgY3VycmVudERPTU5vZGUgPSBjdXJyZW50RE9NUmVnaW9uLmRvbU5vZGU7Ci0KLQkJLy8gY3JlYXRlIGEgY29uc3RyYWludCBmb3IgdGhpcyB0YWcKLQkJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHRoaXNDb25zdHJhaW50cyA9IG5ldyBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMoKTsKLQkJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNoaWxkcmVuQ29uc3RyYWludHMgPSBuZXcgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzKCk7Ci0JCXVwZGF0ZUZvcm1hdHRpbmdDb25zdHJhaW50cyhwYXJlbnRDb25zdHJhaW50cywgdGhpc0NvbnN0cmFpbnRzLCBjaGlsZHJlbkNvbnN0cmFpbnRzLCBjdXJyZW50RE9NUmVnaW9uKTsKLQotCQlpZihjaGlsZHJlbkNvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUKQotCQkJY2hpbGRyZW5Db25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKG5ldyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSkuZ2V0RWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneSgpKTsKLQkJCQotCQlTdHJpbmcgd2hpdGVzcGFjZVN0cmF0ZWd5ID0gdGhpc0NvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpOwotCQlTdHJpbmcgaW5kZW50U3RyYXRlZ3kgPSB0aGlzQ29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKTsKLQkJaW50IGF2YWlsYWJsZUxpbmVXaWR0aCA9IHRoaXNDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQotCQkvLyBmb3JtYXQgc3BhY2UgYmVmb3JlIHN0YXJ0IHRhZwotCQkvLyBkbyBub3QgZm9ybWF0IHNwYWNlIGJlZm9yZSBzdGFydCB0YWcgaWYgcHJlc2VydmluZyBzcGFjZXMKLQkJaWYgKHdoaXRlc3BhY2VTdHJhdGVneSAhPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpIHsKLQkJCS8vIGZvcm1hdCBsaWtlIGluZGVudCBzdHJhdGVneSBzYXlzCi0JCQlpZiAoaW5kZW50U3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVCB8fCBpbmRlbnRTdHJhdGVneSA9PSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuTkVXX0xJTkUpIHsKLQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBpbmRlbnRJZlBvc3NpYmxlKHRleHRFZGl0LCB0aGlzQ29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgdHJ1ZSk7Ci0JCQkJaWYgKGF2YWlsYWJsZUxpbmVXaWR0aCA+IDApCi0JCQkJCXRoaXNDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCX0KLQkJfQotCQkvLyBmb3JtYXQgdGhlIHN0YXJ0IHRhZyBpdHNlbGYKLQkJYm9vbGVhbiB0YWdFbmRlZCA9IGZvcm1hdFdpdGhpblRhZyh0ZXh0RWRpdCwgdGhpc0NvbnN0cmFpbnRzLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pOwotCi0JCS8vIGZvcm1hdCBjaGlsZHJlbgotCQlpZiAoIXRhZ0VuZGVkKSB7Ci0JCQkvLyB1cGRhdGUgY2hpbGRDb25zdHJhaW50cyB3aXRoIHRoaXNDb25zdHJhaW50J3MgaW5kZW50TGV2ZWwgJgotCQkJLy8gYXZhaWxhYmxlTGluZVdpZHRoCi0JCQljaGlsZHJlbkNvbnN0cmFpbnRzLnNldEluZGVudExldmVsKHRoaXNDb25zdHJhaW50cy5nZXRJbmRlbnRMZXZlbCgpKTsKLQkJCWNoaWxkcmVuQ29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKHRoaXNDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSk7Ci0KLQkJCXByZXZpb3VzRG9jdW1lbnRSZWdpb24gPSBjdXJyZW50RG9jdW1lbnRSZWdpb247Ci0JCQlJRE9NTm9kZSBjaGlsZERPTU5vZGUgPSAoSURPTU5vZGUpIGN1cnJlbnRET01Ob2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFJlZ2lvbiA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQlib29sZWFuIHBhc3NlZEZvcm1hdFJhbmdlID0gZmFsc2U7Ci0JCQkvLyBhcyBsb25nIGFzIHRoZXJlIGlzIG9uZSBjaGlsZAotCQkJaWYgKGNoaWxkRE9NTm9kZSAhPSBudWxsICYmIG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJCXdoaWxlIChjaGlsZERPTU5vZGUgIT0gbnVsbCAmJiBuZXh0UmVnaW9uICE9IG51bGwgJiYgIXBhc3NlZEZvcm1hdFJhbmdlICYmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwgfHwgIWZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSkgewotCQkJCQlET01SZWdpb24gY2hpbGRET01SZWdpb24gPSBuZXcgRE9NUmVnaW9uKCk7Ci0JCQkJCWNoaWxkRE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uID0gbmV4dFJlZ2lvbjsKLQkJCQkJY2hpbGRET01SZWdpb24uZG9tTm9kZSA9IGNoaWxkRE9NTm9kZTsKLQkJCQkJaWYgKG5leHRSZWdpb24gPT0gY2hpbGRET01Ob2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCQkJCS8vIGZvcm1hdCBjaGlsZHJlbi4gcGFzcyBpbiBjaGlsZCBjb25zdHJhaW50cwotCQkJCQkJY2hpbGRET01SZWdpb24gPSBmb3JtYXRSZWdpb24odGV4dEVkaXQsIGZvcm1hdFJhbmdlLCBjaGlsZHJlbkNvbnN0cmFpbnRzLCBjaGlsZERPTVJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBUT0RPOiB3aGF0IGhhcHBlbnMgaWYgdGhleSBkb250IG1hdGNoIHVwPwotCQkJCQl9Ci0KLQkJCQkJLy8gdXBkYXRlIGNoaWxkRE9NUmVnaW9uIHdpdGggbmV4dCBkb20vcmVnaW9uIG5vZGUKLQkJCQkJaWYgKGNoaWxkRE9NUmVnaW9uLmRvbU5vZGUgIT0gbnVsbCkgewotCQkJCQkJY2hpbGRET01Ob2RlID0gKElET01Ob2RlKSBjaGlsZERPTVJlZ2lvbi5kb21Ob2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljaGlsZERPTU5vZGUgPSBudWxsOwotCQkJCQl9Ci0JCQkJCXByZXZpb3VzRG9jdW1lbnRSZWdpb24gPSBjaGlsZERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJCQkJbmV4dFJlZ2lvbiA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJcGFzc2VkRm9ybWF0UmFuZ2UgPSAhZm9ybWF0UmFuZ2Uub3ZlcmxhcHNXaXRoKG5leHRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV4dFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhlcmUgd2VyZSBubyBjaGlsZHJlbiwgc28ga2VlcCBlbmQgdGFnIGlubGluZWQKLQkJCQljaGlsZHJlbkNvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0UpOwotCQkJCWNoaWxkcmVuQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOTElORSk7Ci0JCQl9Ci0KLQkJCWlmICghcGFzc2VkRm9ybWF0UmFuZ2UpIHsKLQkJCQkvLyB1cGRhdGUgdGhlIGRvbSByZWdpb24gd2l0aCB0aGUgbGFzdCBmb3JtYXR0ZWQgcmVnaW9uL2RvbQotCQkJCS8vIG5vZGUgc2hvdWxkIGJlIGVuZCB0YWcgYW5kIHRoaXMgdGFnJ3MgRE9NTm9kZQotCQkJCWN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBuZXh0UmVnaW9uOwotCQkJCWN1cnJlbnRET01SZWdpb24uZG9tTm9kZSA9IGN1cnJlbnRET01Ob2RlOwotCi0JCQkJLy8gZW5kIHRhZydzIGluZGVudCBsZXZlbCBzaG91bGQgYmUgc2FtZSBhcyBzdGFydCB0YWcncwotCQkJCWNoaWxkcmVuQ29uc3RyYWludHMuc2V0SW5kZW50TGV2ZWwodGhpc0NvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCkpOwotCQkJCS8vIGZvcm1hdCBlbmQgdGFnCi0JCQkJYm9vbGVhbiBmb3JtYXRFbmRUYWcgPSBmYWxzZTsKLQkJCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsICYmIGN1cnJlbnRET01Ob2RlICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb25MaXN0IHJzID0gbmV4dFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCWlmIChycy5zaXplKCkgPiAxKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiByID0gcnMuZ2V0KDApOwotCQkJCQkJaWYgKHIgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJCQlyID0gcnMuZ2V0KDEpOwotCQkJCQkJCWlmIChyICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJCQkJU3RyaW5nIHRhZ05hbWUgPSBuZXh0UmVnaW9uLmdldFRleHQocik7Ci0JCQkJCQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHMoY3VycmVudERPTU5vZGUuZ2V0Tm9kZU5hbWUoKSkpCi0JCQkJCQkJCQlmb3JtYXRFbmRUYWcgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChmb3JtYXRFbmRUYWcpCi0JCQkJCWZvcm1hdEVuZFRhZyh0ZXh0RWRpdCwgZm9ybWF0UmFuZ2UsIGNoaWxkcmVuQ29uc3RyYWludHMsIGN1cnJlbnRET01SZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pOwotCQkJCWVsc2UgewotCQkJCQkvLyBtaXNzaW5nIGVuZCB0YWcgc28gcmV0dXJuIGxhc3QgZm9ybWF0dGVkIGRvY3VtZW50Ci0JCQkJCS8vIHJlZ2lvbgotCQkJCQljdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBwYXNzZWQgZm9ybWF0IHJhbmdlIGJlZm9yZSBjb3VsZCBmaW5pc2gsIHNvIHVwZGF0ZSBkb20KLQkJCQkvLyByZWdpb24gdG8gbGFzdCBrbm93biBmb3JtYXR0ZWQgcmVnaW9uCi0JCQkJY3VycmVudERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IG5leHRSZWdpb247Ci0JCQkJY3VycmVudERPTVJlZ2lvbi5kb21Ob2RlID0gY2hpbGRET01Ob2RlOwotCQkJfQotCi0JCQkvLyB1cGRhdGUgcGFyZW50IGNvbnN0cmFpbnQgc2luY2UgdGhpcyBpcyB3aGF0IGlzIHBhc3NlZCBiYWNrCi0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoY2hpbGRyZW5Db25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB1cGRhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCXBhcmVudENvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aCh0aGlzQ29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkpOwotCQl9Ci0JCXJldHVybiBjdXJyZW50RE9NUmVnaW9uOwotCX0KLQotCXByaXZhdGUgdm9pZCBmb3JtYXRTdGFydFRhZ1dpdGhOb0F0dHIoVGV4dEVkaXQgdGV4dEVkaXQsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBjb25zdHJhaW50cywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCwgU3RyaW5nIGluZGVudFN0cmF0ZWd5LCBTdHJpbmcgd2hpdGVzcGFjZVN0cmF0ZWd5LCBJVGV4dFJlZ2lvbiBjdXJyZW50VGV4dFJlZ2lvbikgewotCQkvLyBjYWxjdWxhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJaW50IHRhZ05hbWVMaW5lV2lkdGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyAyOwotCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQotCQlpZiAoaW5kZW50U3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOTElORSkgewotCQkJLy8gaWYgd2FzIGlubGluaW5nLCBuZWVkIHRvIGNoZWNrIGlmIG91dCBvZiBhdmFpbGFibGUgbGluZQotCQkJLy8gd2lkdGgKLQkJCWlmIChhdmFpbGFibGVMaW5lV2lkdGggPCAwKSB7Ci0JCQkJLy8gbmVlZCB0byBpbmRlbnQgaWYgcG9zc2libGUKLQkJCQlpbnQgbGluZVdpZHRoID0gaW5kZW50SWZQb3NzaWJsZSh0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgdHJ1ZSk7Ci0JCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJaWYgKGxpbmVXaWR0aCA+IDApCi0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIHRhZ05hbWVMaW5lV2lkdGg7Ci0JCQkJZWxzZQotCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vIG5lZWQgdG8gaW5kZW50Ci0JCQkJLy8ganVzdCBtYWtlIHN1cmUgdG8gZGVsZXRlIHByZXZpb3VzIHdoaXRlc3BhY2UgaWYKLQkJCQkvLyBuZWVkZWQKLQkJCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQkJCQlTdHJpbmcgcHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCQkJCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBjb2xsYXBzZVNwYWNlcyh0ZXh0RWRpdCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBhdmFpbGFibGVMaW5lV2lkdGgsIHByZXZpb3VzRG9jdW1lbnRSZWdpb25UZXh0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGRlbGV0ZSBhbnkgdHJhaWwgc3BhY2VzIGFmdGVyIHRhZyBuYW1lCi0JCWlmIChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgPCBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdCB0aGUgdGV4dCBpbiB4bWwgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RWRpdAotCSAqIEBwYXJhbSBwYXJlbnRDb25zdHJhaW50cwotCSAqIEBwYXJhbSBjdXJyZW50UmVnaW9uCi0JICogQHBhcmFtIGZ1bGxUZXh0Ci0JICogQHBhcmFtIHdoaXRlc3BhY2VNb2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFRleHRJbkNvbnRlbnQoVGV4dEVkaXQgdGV4dEVkaXQsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uLCBTdHJpbmcgZnVsbFRleHQsIFN0cmluZyB3aGl0ZXNwYWNlTW9kZSkgewotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gcGFyZW50Q29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0KLQkJLy8gZGV0ZXJtaW5lIGluZGVudGF0aW9uCi0JCWJvb2xlYW4gZm9yY2VJbml0aWFsSW5kZW50ID0gZmFsc2U7Ci0JCWludCBpbmRlbnRMZXZlbCA9IHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCkgKyAxOwotCQlTdHJpbmcgaW5kZW50TW9kZSA9IHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCk7Ci0JCWlmIChpbmRlbnRNb2RlID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkRFTlQpIHsKLQkJCWZvcmNlSW5pdGlhbEluZGVudCA9IHRydWU7Ci0JCX0KLQkJaWYgKGluZGVudE1vZGUgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLk5FV19MSU5FKSB7Ci0JCQlpbmRlbnRMZXZlbCA9IHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCk7Ci0JCQlmb3JjZUluaXRpYWxJbmRlbnQgPSB0cnVlOwotCQl9Ci0KLQkJaW50IGZ1bGxUZXh0T2Zmc2V0ID0gMDsKLQkJY2hhcltdIGZ1bGxUZXh0QXJyYXkgPSBmdWxsVGV4dC50b0NoYXJBcnJheSgpOwotCQl3aGlsZSAoZnVsbFRleHRPZmZzZXQgPCBmdWxsVGV4dEFycmF5Lmxlbmd0aCkgewotCQkJLy8gZ2F0aGVyIGFsbCB3aGl0ZXNwYWNlcwotCQkJU3RyaW5nIHdoaXRlc3BhY2VSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIHRydWUpOwotCQkJaWYgKHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLy8gb2Zmc2V0IHdoZXJlIHdoaXRlc3BhY2Ugc3RhcnRzCi0JCQkJaW50IHdoaXRlc3BhY2VTdGFydCA9IGZ1bGxUZXh0T2Zmc2V0OwotCQkJCS8vIHVwZGF0ZSBjdXJyZW50IG9mZnNldCBpbiBmdWxsVGV4dAotCQkJCWZ1bGxUZXh0T2Zmc2V0ICs9IHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCk7Ci0KLQkJCQkvLyBnYXRoZXIgZm9sbG93aW5nIHdvcmQKLQkJCQlTdHJpbmcgY2hhcmFjdGVyUnVuID0gZ2V0Q2hhcmFjdGVyUnVuKGZ1bGxUZXh0QXJyYXksIGZ1bGxUZXh0T2Zmc2V0LCBmYWxzZSk7Ci0JCQkJaW50IGNoYXJhY3RlclJ1bkxlbmd0aCA9IGNoYXJhY3RlclJ1bi5sZW5ndGgoKTsKLQkJCQlpZiAoY2hhcmFjdGVyUnVuTGVuZ3RoID4gMCkgewotCQkJCQkvLyBpbmRlbnQgaWYgd29yZCBpcyB0b28gbG9uZyBvciBmb3JjaW5nIGluaXRpYWwKLQkJCQkJLy8gaW5kZW50Ci0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJCS8vIG9mZnNldCB3aGVyZSBpbmRlbnQvY29sbGFwc2Ugd2lsbCBoYXBwZW4KLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgd2hpdGVzcGFjZVN0YXJ0OwotCQkJCQlpZiAoZm9yY2VJbml0aWFsSW5kZW50IHx8IChhdmFpbGFibGVMaW5lV2lkdGggPD0gMCkpIHsKLQkJCQkJCS8vIGluZGVudCBpZiBub3QgYWxyZWFkeSBpbmRlbnRlZAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnRSZWdpb24sIGluZGVudExldmVsLCBzdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bik7Ci0JCQkJCQkvLyByZW1lbWJlciB0byBzdWJ0cmFjdCB3b3JkIGxlbmd0aAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQkJCWZvcmNlSW5pdGlhbEluZGVudCA9IGZhbHNlOyAvLyBpbml0aWFsIGluZGVudCBkb25lCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBqdXN0IGNvbGxhcHNlIHNwYWNlcywgYnV0IGFkanVzdCBmb3IgYW55IGluZGVudGluZyB0aGF0IG1heSByZXN1bHQgZnJvbSBwcmVzZXJ2aW5nIGxpbmUgZGVsaW1pdGVycwotCQkJCQkJaWYgKHdoaXRlc3BhY2VTdGFydCA9PSAwICYmIHdoaXRlc3BhY2VNb2RlID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkVBTkRUUklNKSB7Ci0JCQkJCQkJLy8gaWYgaWdub3JlLCB0cmltCi0JCQkJCQkJRGVsZXRlRWRpdCBkZWxldGVUcmFpbGluZyA9IG5ldyBEZWxldGVFZGl0KHN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpKTsKLQkJCQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChkZWxldGVUcmFpbGluZyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmKHdoaXRlc3BhY2VNb2RlID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5SRVBMQUNFKQotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IHJlcGxhY2VTcGFjZXModGV4dEVkaXQsIHN0YXJ0T2Zmc2V0LCBhdmFpbGFibGVMaW5lV2lkdGgsIHdoaXRlc3BhY2VSdW4pOwotCQkJCQkJZWxzZQotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbGxhcHNlQW5kSW5kZW50KHRleHRFZGl0LCBzdGFydE9mZnNldCwgYXZhaWxhYmxlTGluZVdpZHRoLCBpbmRlbnRMZXZlbCwgd2hpdGVzcGFjZVJ1biwgY3VycmVudFJlZ2lvbik7Ci0JCQkJCX0KLQotCQkJCQlmdWxsVGV4dE9mZnNldCArPSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBoYW5kbGUgdHJhaWxpbmcgd2hpdGVzcGFjZQotCQkJCQlpbnQgd2hpdGVzcGFjZU9mZnNldCA9IGN1cnJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHdoaXRlc3BhY2VTdGFydDsKLQkJCQkJaWYgKHdoaXRlc3BhY2VNb2RlID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5SRVBMQUNFKQotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gcmVwbGFjZVNwYWNlcyh0ZXh0RWRpdCwgd2hpdGVzcGFjZU9mZnNldCwgYXZhaWxhYmxlTGluZVdpZHRoLCB3aGl0ZXNwYWNlUnVuKTsKLQkJCQkJZWxzZSBpZiAod2hpdGVzcGFjZU1vZGUgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRUFORFRSSU0pIHsKLQkJCQkJCS8vIGFsd2F5cyB0cmltCi0JCQkJCQlEZWxldGVFZGl0IGRlbGV0ZVRyYWlsaW5nID0gbmV3IERlbGV0ZUVkaXQod2hpdGVzcGFjZU9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSk7Ci0JCQkJCQl0ZXh0RWRpdC5hZGRDaGlsZChkZWxldGVUcmFpbGluZyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSkgewotCQkJCQkJaWYgKHdoaXRlc3BhY2VNb2RlID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUpIHsKLQkJCQkJCQkvLyBpZiBpZ25vcmUsIHRyaW0KLQkJCQkJCQlEZWxldGVFZGl0IGRlbGV0ZVRyYWlsaW5nID0gbmV3IERlbGV0ZUVkaXQod2hpdGVzcGFjZU9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSk7Ci0JCQkJCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZGVsZXRlVHJhaWxpbmcpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gaWYgY29sbGFwc2UsIGxlYXZlIGEgc3BhY2UuIGJ1dCB3aGF0IGlmIGVuZCB1cAotCQkJCQkJCS8vIHdhbnRpbmcgdG8gYWRkIGluZGVudD8gdGhlbiBuZWVkIHRvIGRlbGV0ZSBzcGFjZQotCQkJCQkJCS8vIGFkZGVkIGFuZCBhZGQgaW5kZW50IGluc3RlYWQKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBjb2xsYXBzZVNwYWNlcyh0ZXh0RWRpdCwgd2hpdGVzcGFjZU9mZnNldCwgYXZhaWxhYmxlTGluZVdpZHRoLCB3aGl0ZXNwYWNlUnVuKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGdhdGhlciB3b3JkCi0JCQkJU3RyaW5nIGNoYXJhY3RlclJ1biA9IGdldENoYXJhY3RlclJ1bihmdWxsVGV4dEFycmF5LCBmdWxsVGV4dE9mZnNldCwgZmFsc2UpOwotCQkJCWludCBjaGFyYWN0ZXJSdW5MZW5ndGggPSBjaGFyYWN0ZXJSdW4ubGVuZ3RoKCk7Ci0JCQkJaWYgKGNoYXJhY3RlclJ1bkxlbmd0aCA+IDApIHsKLQkJCQkJLy8gaW5kZW50IGlmIHdvcmQgaXMgdG9vIGxvbmcgb3IgZm9yY2luZyBpbml0aWFsCi0JCQkJCS8vIGluZGVudAotCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBhdmFpbGFibGVMaW5lV2lkdGggLSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJCWlmICgod2hpdGVzcGFjZU1vZGUgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRSB8fCB3aGl0ZXNwYWNlTW9kZSA9PSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFQU5EVFJJTSkgJiYgKGZvcmNlSW5pdGlhbEluZGVudCB8fCAoYXZhaWxhYmxlTGluZVdpZHRoIDw9IDApKSkgewotCQkJCQkJLy8gaW5kZW50IGlmIG5vdCBhbHJlYWR5IGluZGVudGVkCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZCh0ZXh0RWRpdCwgY3VycmVudFJlZ2lvbiwgaW5kZW50TGV2ZWwsIGN1cnJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgd2hpdGVzcGFjZVJ1bik7Ci0JCQkJCQkvLyByZW1lbWJlciB0byBzdWJ0cmFjdCB3b3JkIGxlbmd0aAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQkJCWZvcmNlSW5pdGlhbEluZGVudCA9IGZhbHNlOyAvLyBpbml0aWFsIGluZGVudCBkb25lCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBqdXN0IGNvbGxhcHNlIHNwYWNlcwotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQkJfQotCi0JCQkJCWZ1bGxUZXh0T2Zmc2V0ICs9IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCXBhcmVudENvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmb3JtYXRXaXRoaW5FbmRUYWcoVGV4dEVkaXQgdGV4dEVkaXQsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBjb25zdHJhaW50cywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNEb2N1bWVudFJlZ2lvbikgewotCQlTdHJpbmcgaW5kZW50U3RyYXRlZ3kgPSBjb25zdHJhaW50cy5nZXRJbmRlbnRTdHJhdGVneSgpOwotCQlTdHJpbmcgd2hpdGVzcGFjZVN0cmF0ZWd5ID0gY29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCk7Ci0JCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSBjb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQkJSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaW50IGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggPSAxOwotCi0JCUlUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGN1cnJlbnRUZXh0UmVnaW9uSW5kZXgpOwotCQlTdHJpbmcgY3VycmVudFR5cGUgPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCS8vIHRhZyBuYW1lIHNob3VsZCBhbHdheXMgYmUgdGhlIGZpcnN0IHRleHQgcmVnaW9uCi0JCWlmIChjdXJyZW50VHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJSVRleHRSZWdpb24gbmV4dFRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCArIDEpOwotCQkJU3RyaW5nIG5leHRUeXBlID0gbmV4dFRleHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKG5leHRUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJCS8vIGNhbGN1bGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCWludCB0YWdOYW1lTGluZVdpZHRoID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMzsKLQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQotCQkJCWlmIChpbmRlbnRTdHJhdGVneSA9PSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5MSU5FKSB7Ci0JCQkJCS8vIGlmIHdhcyBpbmxpbmluZywgbmVlZCB0byBjaGVjayBpZiBvdXQgb2YgYXZhaWxhYmxlIGxpbmUKLQkJCQkJLy8gd2lkdGggLSBXaGl0ZXNwYWNlIG1heSBoYXZlIGJlZW4gY29ycmVjdGVkIGluIHRoZSB0ZXh0IGNvbnRlbnQKLQkJCQkJaWYgKGF2YWlsYWJsZUxpbmVXaWR0aCA8IDAgJiYgd2hpdGVzcGFjZVN0cmF0ZWd5ID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUpIHsKLQkJCQkJCS8vIG5lZWQgdG8gZGVpbmRlbnQgaWYgcG9zc2libGUKLQkJCQkJCWludCBsaW5lV2lkdGggPSBpbmRlbnRJZlBvc3NpYmxlKHRleHRFZGl0LCBjb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCB3aGl0ZXNwYWNlU3RyYXRlZ3ksIGluZGVudFN0cmF0ZWd5LCBmYWxzZSk7Ci0JCQkJCQkvLyB1cGRhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCQkJCWlmIChsaW5lV2lkdGggPiAwKQotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIHRhZ05hbWVMaW5lV2lkdGg7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBubyBuZWVkIHRvIGluZGVudAotCQkJCQkJLy8ganVzdCBtYWtlIHN1cmUgdG8gZGVsZXRlIHByZXZpb3VzIHdoaXRlc3BhY2UgaWYKLQkJCQkJCS8vIG5lZWRlZAotCQkJCQkJaWYgKHByZXZpb3VzRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCWlmIChwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQkJCQkJCVN0cmluZyBwcmV2aW91c0RvY3VtZW50UmVnaW9uVGV4dCA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJCQkJCQkJaWYgKHByZXZpb3VzRG9jdW1lbnRSZWdpb25UZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBjb2xsYXBzZVNwYWNlcyh0ZXh0RWRpdCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBhdmFpbGFibGVMaW5lV2lkdGgsIHByZXZpb3VzRG9jdW1lbnRSZWdpb25UZXh0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBkZWxldGUgYW55IHRyYWlsIHNwYWNlcyBhZnRlciB0YWcgbmFtZQotCQkJCWlmIChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgPCBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQlkZWxldGVUcmFpbGluZ1NwYWNlcyh0ZXh0RWRpdCwgY3VycmVudFRleHRSZWdpb24sIGN1cnJlbnREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gZW5kIHRhZyBoYXMgdW5leHBlY3RlZCBzdHVmZiwgc28ganVzdCBsZWF2ZSBpdCBhbG9uZQotCQl9Ci0JCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGNvbnRlbnRzIHdpdGhpbiBhIHRhZyBsaWtlIHRhZyBuYW1lIGFuZCBhdHRyaWJ1dGVzCi0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIGN1cnJlbnREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0UmVnaW9ucwotCSAqICAgICAgICAgICAgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JICogQHJldHVybiB0cnVlIGlmIHRhZyB3YXMgZW5kZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmb3JtYXRXaXRoaW5UYWcoVGV4dEVkaXQgdGV4dEVkaXQsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBjb25zdHJhaW50cywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNEb2N1bWVudFJlZ2lvbikgewotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gY29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0JCVN0cmluZyBpbmRlbnRTdHJhdGVneSA9IGNvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCk7Ci0JCVN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3kgPSBjb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKTsKLQkJaW50IGluZGVudExldmVsID0gY29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKTsKLQkJSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaW50IGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggPSAxOwotCi0JCUlUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGN1cnJlbnRUZXh0UmVnaW9uSW5kZXgpOwotCQlTdHJpbmcgY3VycmVudFR5cGUgPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCS8vIHRhZyBuYW1lIHNob3VsZCBhbHdheXMgYmUgdGhlIGZpcnN0IHRleHQgcmVnaW9uCi0JCWlmIChjdXJyZW50VHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJSVRleHRSZWdpb24gbmV4dFRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCArIDEpOwotCQkJU3RyaW5nIG5leHRUeXBlID0gKG5leHRUZXh0UmVnaW9uICE9IG51bGwpID8gbmV4dFRleHRSZWdpb24uZ2V0VHlwZSgpIDogbnVsbDsKLQkJCWlmIChuZXh0VHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkvLyBhbHJlYWR5IGF0IHRhZyBjbG9zZQotCQkJCWZvcm1hdFN0YXJ0VGFnV2l0aE5vQXR0cih0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgYXZhaWxhYmxlTGluZVdpZHRoLCBpbmRlbnRTdHJhdGVneSwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAobmV4dFR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJLy8gYWxyZWFkeSBhdCBlbXB0eSB0YWcgY2xvc2UKLQkJCQlmb3JtYXRFbXB0eVN0YXJ0VGFnV2l0aE5vQXR0cih0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgYXZhaWxhYmxlTGluZVdpZHRoLCBpbmRlbnRTdHJhdGVneSwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDIpOwotCQkJCWJvb2xlYW4gYWxpZ25GaW5hbEJyYWNrZXQgPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRBbGlnbkZpbmFsQnJhY2tldCgpOwotCQkJCWJvb2xlYW4gb25lU3BhY2VJblRhZ05hbWUgPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcoKTsKLQkJCQlib29sZWFuIGluZGVudE11bHRpcGxlQXR0cmlidXRlID0gZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0SW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKCk7Ci0JCQkJLy8gaW5kaWNhdGVzIGlmIHRhZyBzcGFubmVkIG1vcmUgdGhhbiBvbmUgbGluZQotCQkJCWJvb2xlYW4gc3Bhbk1vcmVUaGFuMUxpbmUgPSBmYWxzZTsKLQkJCQkvLyBpbmRpY2F0ZXMgaWYgYWxsIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGluZGVudGVkCi0JCQkJYm9vbGVhbiBpbmRlbnRBbGxBdHRyaWJ1dGVzID0gZmFsc2U7Ci0JCQkJaWYgKGluZGVudE11bHRpcGxlQXR0cmlidXRlKSB7Ci0JCQkJCWludCBhdHRyaWJ1dGVzQ291bnQgPSAwOwotCQkJCQlpbnQgaSA9IDI7Ci0JCQkJCXdoaWxlIChpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpICYmIGF0dHJpYnV0ZXNDb3VudCA8IDIpIHsKLQkJCQkJCWlmICh0ZXh0UmVnaW9ucy5nZXQoaSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkKLQkJCQkJCQkrK2F0dHJpYnV0ZXNDb3VudDsKLQkJCQkJfQotCQkJCQlpbmRlbnRBbGxBdHRyaWJ1dGVzID0gKGF0dHJpYnV0ZXNDb3VudCA+IDEpOwotCQkJCX0KLQotCQkJCXdoaWxlICgoY3VycmVudFRleHRSZWdpb25JbmRleCArIDEpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJCW5leHRUZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggKyAxKTsKLQkJCQkJbmV4dFR5cGUgPSBuZXh0VGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChuZXh0VHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCWJvb2xlYW4gaW5kZW50QXR0cmlidXRlID0gaW5kZW50QWxsQXR0cmlidXRlczsKLQkJCQkJCWlmICghaW5kZW50QXR0cmlidXRlKQotCQkJCQkJCWluZGVudEF0dHJpYnV0ZSA9IHNob3VsZEluZGVudEJlZm9yZUF0dHJpYnV0ZShjb25zdHJhaW50cywgdGV4dFJlZ2lvbnMsIGF2YWlsYWJsZUxpbmVXaWR0aCwgY3VycmVudFRleHRSZWdpb25JbmRleCwgY3VycmVudFRleHRSZWdpb24sIG5leHRUZXh0UmVnaW9uKTsKLQkJCQkJCWlmIChpbmRlbnRBdHRyaWJ1dGUpIHsKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZCh0ZXh0RWRpdCwgaW5kZW50TGV2ZWwgKyAxLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQlzcGFuTW9yZVRoYW4xTGluZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvdGhlcndpc2UsIGluc2VydFNwYWNlQW5kQ29sbGFwc2UKLQkJCQkJCQlpbnNlcnRTcGFjZUFuZENvbGxhcHNlKHRleHRFZGl0LCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGF2YWlsYWJsZUxpbmVXaWR0aCwgY3VycmVudFRleHRSZWdpb24pOwotCQkJCQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobmV4dFR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCQkvLyBpZiBuZWVkIHRvIGFsaWduIGJyYWNrZXQgb24gbmV4dCBsaW5lLCBpbmRlbnQKLQkJCQkJCWlmIChhbGlnbkZpbmFsQnJhY2tldCAmJiBzcGFuTW9yZVRoYW4xTGluZSkgewotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmTm90QWxyZWFkeUluZGVudGVkKHRleHRFZGl0LCBpbmRlbnRMZXZlbCwgY3VycmVudERvY3VtZW50UmVnaW9uLCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQkJCQkJLS1hdmFpbGFibGVMaW5lV2lkdGg7IC8vIGZvciB0YWcgY2xvc2UgaXRzZWxmCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvdGhlcndpc2UsIGp1c3QgZGVsZXRlIHNwYWNlIGJlZm9yZSB0YWcgY2xvc2UKLQkJCQkJCQlpZiAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpIDwgY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDEpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIHVwZGF0ZSBsaW5lIHdpZHRoCi0JCQkJCQljb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChuZXh0VHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCWludCB0ZXh0TGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJaW50IHJlZ2lvbkxlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpOwotCi0JCQkJCQlib29sZWFuIHRoZXJlQXJlU3BhY2VzID0gdGV4dExlbmd0aCA8IHJlZ2lvbkxlbmd0aDsKLQkJCQkJCWlmICghb25lU3BhY2VJblRhZ05hbWUgJiYgdGhlcmVBcmVTcGFjZXMpIHsKLQkJCQkJCQkvLyBkZWxldGUgYW55IHRyYWlsIHNwYWNlcyBhZnRlciB0YWcgbmFtZQotCQkJCQkJCWRlbGV0ZVRyYWlsaW5nU3BhY2VzKHRleHRFZGl0LCBjdXJyZW50VGV4dFJlZ2lvbiwgY3VycmVudERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDIpOwotCQkJCQkJfQotCQkJCQkJLy8gaW5zZXJ0IGEgc3BhY2UgYW5kIGNvbGxhcHNlIE9OTFkgSUYgaXQncyBzcGVjaWZpZWQKLQkJCQkJCWVsc2UgaWYgKG9uZVNwYWNlSW5UYWdOYW1lKSB7Ci0JCQkJCQkJaW5zZXJ0U3BhY2VBbmRDb2xsYXBzZSh0ZXh0RWRpdCwgY3VycmVudERvY3VtZW50UmVnaW9uLCBhdmFpbGFibGVMaW5lV2lkdGgsIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDMpOwotCQkJCQkJfQotCQkJCQkJLy8gdXBkYXRlIGxpbmUgd2lkdGgKLQkJCQkJCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoY3VycmVudFR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FICYmIG5leHRUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCQkJaWYgKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSA8IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJCQkJCWRlbGV0ZVRyYWlsaW5nU3BhY2VzKHRleHRFZGl0LCBjdXJyZW50VGV4dFJlZ2lvbiwgY3VycmVudERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSB3aWR0aAotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChjdXJyZW50VHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyAmJiBuZXh0VHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQkJaWYgKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSA8IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJCQkJCWRlbGV0ZVRyYWlsaW5nU3BhY2VzKHRleHRFZGl0LCBjdXJyZW50VGV4dFJlZ2lvbiwgY3VycmVudERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSB3aWR0aAotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvdGhlcndpc2UsIGluc2VydFNwYWNlQW5kQ29sbGFwc2UKLQkJCQkJCQlpbnNlcnRTcGFjZUFuZENvbGxhcHNlKHRleHRFZGl0LCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGF2YWlsYWJsZUxpbmVXaWR0aCwgY3VycmVudFRleHRSZWdpb24pOwotCQkJCQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudFRleHRSZWdpb24gPSBuZXh0VGV4dFJlZ2lvbjsKLQkJCQkJY3VycmVudFR5cGUgPSBuZXh0VHlwZTsKLQkJCQkJKytjdXJyZW50VGV4dFJlZ2lvbkluZGV4OwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyB1cGRhdGUgbGluZSB3aWR0aAotCQljb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBGb3JtYXQgYW4gWE1MIGNvbW1lbnQgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdENvbW1lbnQoVGV4dEVkaXQgdGV4dEVkaXQsIFBvc2l0aW9uIGZvcm1hdFJhbmdlLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIERPTVJlZ2lvbiBjdXJyZW50RE9NUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzUmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb247Ci0JCWludCBsaW5lV2lkdGggPSBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSAtIGN1cnJlbnRSZWdpb24uZ2V0RnVsbFRleHQoKS5sZW5ndGgoKTsKLQkJLy8gRG9uJ3QgZm9ybWF0IGlmIHdlJ3JlIG5vdCBleGNlZWRpbmcgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoLCBvciBpZiB0aGUgd2hpdGVzcGFjZQotCQkvLyBzdHJhdGVneSBpcyB0byBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIC0gQnV0IHVwZGF0ZSBsaW5lIHdpZHRoLgotCQlpZihjdXJyZW50UmVnaW9uID09IG51bGwgfHwJcGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFKSB7Ci0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgobGluZVdpZHRoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gSWYgdGhlcmUgaXMgZW5vdWdoIHJvb20sIGZvcm1hdCB0aGUgc3RhcnQgb2YgdGhlIGNvbW1lbnQgdGFnIGlmIGl0Ci0JCS8vIGlzIG9uIGl0cyBvd24gbGluZQotCQlpZihsaW5lV2lkdGggPj0gMCkgewotCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGxpbmVXaWR0aCk7Ci0JCQlpZihwcmV2aW91c1JlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJCVN0cmluZyBkZWxpbWl0ZXJzID0gZXh0cmFjdExpbmVEZWxpbWl0ZXJzKHByZXZpb3VzUmVnaW9uLmdldEZ1bGxUZXh0KCksIHByZXZpb3VzUmVnaW9uKTsKLQkJCQkvLyBGb3JtYXQgdGhlIGNvbW1lbnQgaWYgaXRzIG9uIGEgbmV3bGluZQotCQkJCWlmKGRlbGltaXRlcnMgIT0gbnVsbCAmJiBkZWxpbWl0ZXJzLmxlbmd0aCgpID4gMCkKLQkJCQkJdGV4dEVkaXQuYWRkQ2hpbGQobmV3IFJlcGxhY2VFZGl0KHByZXZpb3VzUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHByZXZpb3VzUmVnaW9uLmdldExlbmd0aCgpLCBkZWxpbWl0ZXJzICsgZ2V0SW5kZW50U3RyaW5nKHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCkrMSkpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXQgPSBjdXJyZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkvLyBJdGVyYXRlIG92ZXIgZWFjaCB0ZXh0IHJlZ2lvbiBvZiB0aGUgY29tbWVudAotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHQgPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCWZvcm1hdENvbW1lbnRUYWcodGV4dEVkaXQsIHBhcmVudENvbnN0cmFpbnRzLCBjdXJyZW50UmVnaW9uLCB0ZXh0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGZvcm1hdHRpbmcgdmFyaW91cyBwb3J0aW9ucyBvZiBhbiBYTUwgY29tbWVudC4gQmVjYXVzZSB0aGUgWE1MCi0JICogQ29tbWVudCBpcyBjb25zaWRlcmVkIGl0cyBvd24gZG9jdW1lbnQgcmVnaW9uLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUKLQkgKiB0aGUgcHJldmlvdXMgcmVnaW9uIG11c3QgYmUgcmVmZXJyZWQgdG8gZm9yIHByb3BlciBpbmRlbnRhdGlvbgotCSAqIGNvbnNpZGVyYXRpb24uIEJlY2F1c2Ugb2YgdGhpcywgbW9zdCBvZiB0aGUgc3BlY2lhbCBjYXNlcyBhcmUKLQkgKiBjYXRlcmluZyB0byB0aGUgb3BlbmluZyB0ZXh0IHJlZ2lvbiBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RWRpdAotCSAqIEBwYXJhbSBwYXJlbnRDb25zdHJhaW50cwotCSAqIEBwYXJhbSBjdXJyZW50UmVnaW9uCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRDb21tZW50VGFnKFRleHRFZGl0IHRleHRFZGl0LCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQkJaW50IGluZGVudExldmVsID0gcGFyZW50Q29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKSArIDE7Ci0JCWJvb2xlYW4gaW5pdGlhbEluZGVudCA9IGZhbHNlOwotCQkKLQkJLy8gSW5kZW50IHRoZSB0ZXh0IG9mIHRoZSBjb21tZW50IGFuIGFkZGl0aW9uYWwgbGV2ZWwKLQkJaWYocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpIHsKLQkJCWluZGVudExldmVsKys7Ci0JCQlpbml0aWFsSW5kZW50ID0gdHJ1ZTsKLQkJfQotCQkKLQkJaW50IGZ1bGxUZXh0T2Zmc2V0ID0gMDsKLQkJY2hhcltdIGZ1bGxUZXh0QXJyYXkgPSBjdXJyZW50UmVnaW9uLmdldEZ1bGxUZXh0KHJlZ2lvbikudG9DaGFyQXJyYXkoKTsKLQkJd2hpbGUgKGZ1bGxUZXh0T2Zmc2V0IDwgZnVsbFRleHRBcnJheS5sZW5ndGgpIHsKLQkJCS8vIGdhdGhlciBhbGwgd2hpdGVzcGFjZXMKLQkJCVN0cmluZyB3aGl0ZXNwYWNlUnVuID0gbnVsbDsKLQkJCQotCQkJLy8gSWYgdGhlIHJlZ2lvbiBpcyBhIGNvbW1lbnQgb3BlbmluZywgdGhlIHdoaXRlc3BhY2Ugd291bGQgYWN0dWFsbHkgY29tZSBmcm9tIHRoZQotCQkJLy8gcHJldmlvdXMgZG9jdW1lbnQgcmVnaW9uCi0JCQlpZihyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiAmJiBjdXJyZW50UmVnaW9uLmdldFByZXZpb3VzKCkgIT0gbnVsbCkKLQkJCQl3aGl0ZXNwYWNlUnVuID0gZ2V0Q2hhcmFjdGVyUnVuKGN1cnJlbnRSZWdpb24uZ2V0UHJldmlvdXMoKS5nZXRGdWxsVGV4dCgpLnRvQ2hhckFycmF5KCksIDAsIHRydWUpOwotCQkJZWxzZQotCQkJCXdoaXRlc3BhY2VSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIHRydWUpOwotCQkJCi0JCQlpZiAod2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBvZmZzZXQgd2hlcmUgd2hpdGVzcGFjZSBzdGFydHMKLQkJCQlpbnQgd2hpdGVzcGFjZVN0YXJ0ID0gZnVsbFRleHRPZmZzZXQ7Ci0JCQkJLy8gdXBkYXRlIGN1cnJlbnQgb2Zmc2V0IGluIGZ1bGxUZXh0IGZvciBub24gY29tbWVudC1vcGVuaW5nIHJlZ2lvbnMKLQkJCQlpZihyZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikKLQkJCQkJZnVsbFRleHRPZmZzZXQgKz0gd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKTsKLQotCQkJCS8vIGdhdGhlciBmb2xsb3dpbmcgd29yZAotCQkJCVN0cmluZyBjaGFyYWN0ZXJSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIGZhbHNlKTsKLQkJCQlpbnQgY2hhcmFjdGVyUnVuTGVuZ3RoID0gY2hhcmFjdGVyUnVuLmxlbmd0aCgpOwotCQkJCWlmIChjaGFyYWN0ZXJSdW5MZW5ndGggPiAwKSB7Ci0JCQkJCS8vIGluZGVudCBpZiB3b3JkIGlzIHRvbyBsb25nIG9yIGZvcmNpbmcgaW5pdGlhbAotCQkJCQkvLyBpbmRlbnQKLQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQkJLy8gb2Zmc2V0IHdoZXJlIGluZGVudC9jb2xsYXBzZSB3aWxsIGhhcHBlbiAtIGZvciBjb21tZW50LW9wZW5pbmcgcmVnaW9ucywKLQkJCQkJLy8gdGhpcyBvY2N1cnMgaW4gdGhlIHByZXZpb3VzIGRvY3VtZW50IHJlZ2lvbgotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlpZihyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiAmJiBjdXJyZW50UmVnaW9uLmdldFByZXZpb3VzKCkgIT0gbnVsbCkKLQkJCQkJCXN0YXJ0T2Zmc2V0ID0gY3VycmVudFJlZ2lvbi5nZXRQcmV2aW91cygpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXN0YXJ0T2Zmc2V0ID0gY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pICsgd2hpdGVzcGFjZVN0YXJ0OwotCQkJCQkKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOIHx8IGluaXRpYWxJbmRlbnQgfHwgKGF2YWlsYWJsZUxpbmVXaWR0aCA8PSAwKSkgewotCQkJCQkJLy8gaW5kZW50IGlmIG5vdCBhbHJlYWR5IGluZGVudGVkCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZCh0ZXh0RWRpdCwgY3VycmVudFJlZ2lvbiwgaW5kZW50TGV2ZWwsIHN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuKTsKLQkJCQkJCS8vIHJlbWVtYmVyIHRvIHN1YnRyYWN0IHdvcmQgbGVuZ3RoCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQkJLy8gSW5kZW50ZWQgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGNvbW1lbnQKLQkJCQkJCWlmKGluaXRpYWxJbmRlbnQpCi0JCQkJCQkJaW5pdGlhbEluZGVudCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8ganVzdCBjb2xsYXBzZSBzcGFjZXMKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbGxhcHNlU3BhY2VzKHRleHRFZGl0LCBzdGFydE9mZnNldCwgYXZhaWxhYmxlTGluZVdpZHRoLCB3aGl0ZXNwYWNlUnVuKTsKLQkJCQkJfQotCi0JCQkJCWZ1bGxUZXh0T2Zmc2V0ICs9IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGhhbmRsZSB0cmFpbGluZyB3aGl0ZXNwYWNlCi0JCQkJCWludCB3aGl0ZXNwYWNlT2Zmc2V0ID0gY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pICsgd2hpdGVzcGFjZVN0YXJ0OwotCQkJCQlEZWxldGVFZGl0IGRlbGV0ZVRyYWlsaW5nID0gbmV3IERlbGV0ZUVkaXQod2hpdGVzcGFjZU9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSk7Ci0JCQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZVRyYWlsaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBnYXRoZXIgd29yZAotCQkJCVN0cmluZyBjaGFyYWN0ZXJSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIGZhbHNlKTsKLQkJCQlpbnQgY2hhcmFjdGVyUnVuTGVuZ3RoID0gY2hhcmFjdGVyUnVuLmxlbmd0aCgpOwotCQkJCWlmIChjaGFyYWN0ZXJSdW5MZW5ndGggPiAwKSB7Ci0JCQkJCS8vIGluZGVudCBpZiB3b3JkIGlzIHRvbyBsb25nIG9yIGZvcmNpbmcgaW5pdGlhbAotCQkJCQkvLyBpbmRlbnQKLQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gYXZhaWxhYmxlTGluZVdpZHRoIC0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCi0JCQkJCWlmICgocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKSB8fCBpbml0aWFsSW5kZW50IHx8IChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCAmJiBhdmFpbGFibGVMaW5lV2lkdGggPD0gMCkpIHsKLQkJCQkJCS8vIGluZGVudCBpZiBub3QgYWxyZWFkeSBpbmRlbnRlZAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnRSZWdpb24sIGluZGVudExldmVsLCBjdXJyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHdoaXRlc3BhY2VSdW4pOwotCQkJCQkJLy8gcmVtZW1iZXIgdG8gc3VidHJhY3Qgd29yZCBsZW5ndGgKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJCQlpZihpbml0aWFsSW5kZW50KQotCQkJCQkJCWluaXRpYWxJbmRlbnQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGp1c3QgY29sbGFwc2Ugc3BhY2VzCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQl9Ci0JCQkJCWZ1bGxUZXh0T2Zmc2V0ICs9IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCXBhcmVudENvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZWl0aGVyIGEgU3RyaW5nIG9mIHdoaXRlc3BhY2Ugb3IgY2hhcmFjdGVycyBkZXBlbmRpbmcgb24KLQkgKiBmb3JXaGl0ZXNwYWNlCi0JICogCi0JICogQHBhcmFtIGZ1bGxUZXh0QXJyYXkKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGFycmF5IHRvIGxvb2sgaW4KLQkgKiBAcGFyYW0gdGV4dE9mZnNldAotCSAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcKLQkgKiBAcGFyYW0gZm9yV2hpdGVzcGFjZQotCSAqICAgICAgICAgICAgdHJ1ZSBpZiBzaG91bGQgcmV0dXJuIHdoaXRlc3BhY2VzLCBmYWxzZSBvdGhlcndpc2UKLQkgKiBAcmV0dXJuIGEgU3RyaW5nIG9mIGVpdGhlciBhbGwgd2hpdGVzcGFjZSBvciBhbGwgY2hhcmFjdGVycy4gTmV2ZXIKLQkgKiAgICAgICAgIHJldHVybnMgbnVsbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENoYXJhY3RlclJ1bihjaGFyW10gZnVsbFRleHRBcnJheSwgaW50IHRleHRPZmZzZXQsIGJvb2xlYW4gZm9yV2hpdGVzcGFjZSkgewotCQlTdHJpbmdCdWZmZXIgY2hhcmFjdGVyUnVuID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlib29sZWFuIG5vbkNoYXJhY3RlckZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlICh0ZXh0T2Zmc2V0IDwgZnVsbFRleHRBcnJheS5sZW5ndGggJiYgIW5vbkNoYXJhY3RlckZvdW5kKSB7Ci0JCQljaGFyIGMgPSBmdWxsVGV4dEFycmF5W3RleHRPZmZzZXRdOwotCQkJYm9vbGVhbiBpc1doaXRlc3BhY2UgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpOwotCQkJaWYgKChmb3JXaGl0ZXNwYWNlICYmIGlzV2hpdGVzcGFjZSkgfHwgKCFmb3JXaGl0ZXNwYWNlICYmICFpc1doaXRlc3BhY2UpKQotCQkJCWNoYXJhY3RlclJ1bi5hcHBlbmQoYyk7Ci0JCQllbHNlCi0JCQkJbm9uQ2hhcmFjdGVyRm91bmQgPSB0cnVlOwotCQkJKyt0ZXh0T2Zmc2V0OwotCQl9Ci0JCXJldHVybiBjaGFyYWN0ZXJSdW4udG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VHJhaWxpbmdXaGl0ZXNwYWNlKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciB3aGl0ZXNwYWNlUnVuID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgaW5kZXggPSB0ZXh0Lmxlbmd0aCgpIC0gMTsKLQkJd2hpbGUoaW5kZXggPiAwKSB7Ci0JCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpbmRleC0tKTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKQotCQkJCXdoaXRlc3BhY2VSdW4uaW5zZXJ0KDAsIGMpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiB3aGl0ZXNwYWNlUnVuLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKGludCBpbmRlbnRMZXZlbCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgaW5kZW50ID0gZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0T25lSW5kZW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50TGV2ZWw7ICsraSkgewotCQkJaW5kZW50U3RyaW5nLmFwcGVuZChpbmRlbnQpOwotCQl9Ci0JCXJldHVybiBpbmRlbnRTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzIGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZQcmVmZXJlbmNlcyA9PSBudWxsKQotCQkJZlByZWZlcmVuY2VzID0gbmV3IFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gZlByZWZlcmVuY2VzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZvcm1hdHRpbmdQcmVmZXJlbmNlcyhYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJZlByZWZlcmVuY2VzID0gcHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogSW5kZW50IGlmIHdoaXRlc3BhY2VSdW4gZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGFuIGluZGVudAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RWRpdAotCSAqIEBwYXJhbSBpbmRlbnRMZXZlbAotCSAqIEBwYXJhbSBpbmRlbnRTdGFydE9mZnNldAotCSAqIEBwYXJhbSBtYXhBdmFpbGFibGVMaW5lV2lkdGgKLQkgKiBAcGFyYW0gd2hpdGVzcGFjZVJ1bgotCSAqIEByZXR1cm4gbmV3IGF2YWlsYWJsZSBsaW5lIHdpZHRoIHVwIHRvIHdoZXJlIGluZGVudGVkCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQoVGV4dEVkaXQgdGV4dEVkaXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiwgaW50IGluZGVudExldmVsLCBpbnQgaW5kZW50U3RhcnRPZmZzZXQsIFN0cmluZyB3aGl0ZXNwYWNlUnVuKSB7Ci0JCWludCBtYXhBdmFpbGFibGVMaW5lV2lkdGggPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRNYXhMaW5lV2lkdGgoKTsKLQotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoOwotCQlTdHJpbmcgaW5kZW50U3RyaW5nID0gZ2V0SW5kZW50U3RyaW5nKGluZGVudExldmVsKTsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRMaW5lRGVsaW1pdGVyKGN1cnJlbnRSZWdpb24pOwotCQlTdHJpbmcgbmV3TGluZUFuZEluZGVudCA9IGxpbmVEZWxpbWl0ZXIgKyBpbmRlbnRTdHJpbmc7Ci0JCQotCQlUZXh0RWRpdCBpbmRlbnRhdGlvbiA9IG51bGw7Ci0JCQotCQkvLyBpZiBub3QgYWxyZWFkeSBjb3JyZWN0bHkgaW5kZW50ZWQKLQkJaWYgKCFuZXdMaW5lQW5kSW5kZW50LmVxdWFscyh3aGl0ZXNwYWNlUnVuKSkgewotCQkJaWYgKGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKSB7Ci0JCQkJaWYgKHdoaXRlc3BhY2VSdW4gIT0gbnVsbCkgewotCQkJCQkvLyByZXBsYWNlIGV4aXN0aW5nIHdoaXRlc3BhY2UgcnVuCi0JCQkJCWluZGVudGF0aW9uID0gbmV3IFJlcGxhY2VFZGl0KGluZGVudFN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpLCBuZXdMaW5lQW5kSW5kZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGp1c3QgaW5zZXJ0IGNvcnJlY3QgaW5kZW50Ci0JCQkJCWluZGVudGF0aW9uID0gbmV3IEluc2VydEVkaXQoaW5kZW50U3RhcnRPZmZzZXQsIG5ld0xpbmVBbmRJbmRlbnQpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEtlZXAgdGhlIGVtcHR5IGxpbmVzCi0JCQllbHNlIHsKLQkJCQkvLyBqdXN0IGluc2VydCBjb3JyZWN0IGluZGVudAotCQkJCWlmKHdoaXRlc3BhY2VSdW4gPT0gbnVsbCkKLQkJCQkJaW5kZW50YXRpb24gPSBuZXcgSW5zZXJ0RWRpdChpbmRlbnRTdGFydE9mZnNldCwgbmV3TGluZUFuZEluZGVudCk7Ci0JCQkJLy8gTmVlZCB0byBwcmVzZXJ2ZSB0aGUgbnVtYmVyIG9mIGVtcHR5IGxpbmVzLCBidXQgc3RpbGwgaW5kZW50IG9uIHRoZSBjdXJyZW50IGxpbmUgcHJvcGVybHkKLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIGV4aXN0aW5nRGVsaW1pdGVycyA9IGV4dHJhY3RMaW5lRGVsaW1pdGVycyh3aGl0ZXNwYWNlUnVuLCBjdXJyZW50UmVnaW9uKTsKLQkJCQkJaWYoZXhpc3RpbmdEZWxpbWl0ZXJzICE9IG51bGwgJiYgZXhpc3RpbmdEZWxpbWl0ZXJzLmxlbmd0aCgpID4gMCkgewotCQkJCQkJU3RyaW5nIGZvcm1hdHRlZCA9IGV4aXN0aW5nRGVsaW1pdGVycyArIGluZGVudFN0cmluZzsKLQkJCQkJCS8vIERvbid0IHBlcmZvcm0gYSByZXBsYWNlIGlmIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHRoZSBleGlzdGluZyB3aGl0ZXNwYWNlUnVuCi0JCQkJCQlpZighZm9ybWF0dGVkLmVxdWFscyh3aGl0ZXNwYWNlUnVuKSkKLQkJCQkJCQlpbmRlbnRhdGlvbiA9IG5ldyBSZXBsYWNlRWRpdChpbmRlbnRTdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSwgZm9ybWF0dGVkKTsKLQkJCQkJfQotCQkJCQkvLyBObyBibGFuayBsaW5lcyB0byBwcmVzZXJ2ZSAtIGNvcnJlY3QgdGhlIGluZGVudAotCQkJCQllbHNlCi0JCQkJCQlpbmRlbnRhdGlvbiA9IG5ldyBSZXBsYWNlRWRpdChpbmRlbnRTdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSwgbmV3TGluZUFuZEluZGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZihpbmRlbnRhdGlvbiAhPSBudWxsKQotCQkJdGV4dEVkaXQuYWRkQ2hpbGQoaW5kZW50YXRpb24pOwotCQkvLyB1cGRhdGUgbGluZSB3aWR0aAotCQlhdmFpbGFibGVMaW5lV2lkdGggPSBtYXhBdmFpbGFibGVMaW5lV2lkdGggLSBpbmRlbnRTdHJpbmcubGVuZ3RoKCk7Ci0JCXJldHVybiBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQoVGV4dEVkaXQgdGV4dEVkaXQsIGludCBpbmRlbnRMZXZlbCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uKSB7Ci0JCS8vIGluZGVudCBpZiBub3QgYWxyZWFkeSBpbmRlbnRlZAotCQlpbnQgdGV4dExlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJaW50IHJlZ2lvbkxlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpOwotCQlpbnQgaW5kZW50U3RhcnRPZmZzZXQgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCVN0cmluZyBmdWxsVGV4dCA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dChjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCVN0cmluZyB3aGl0ZXNwYWNlUnVuID0gZnVsbFRleHQuc3Vic3RyaW5nKHRleHRMZW5ndGgsIHJlZ2lvbkxlbmd0aCk7Ci0KLQkJLy8gdXBkYXRlIGxpbmUgd2lkdGgKLQkJaW50IGF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmTm90QWxyZWFkeUluZGVudGVkKHRleHRFZGl0LCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGluZGVudExldmVsLCBpbmRlbnRTdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bik7Ci0JCXJldHVybiBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgaW5kZW50SWZQb3NzaWJsZShUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHRoaXNDb25zdHJhaW50cywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSwgU3RyaW5nIGluZGVudFN0cmF0ZWd5LCBib29sZWFuIGFkZEluZGVudCkgewotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gLTE7Ci0JCS8vIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGRvY3VtZW50IHJlZ2lvbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmRlbnQKLQkJLy8gYmVjYXVzZSB3ZSdyZSBhdCBiZWdpbm5pbmcgb2YgZG9jdW1lbnQKLQkJaWYgKHByZXZpb3VzRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBhdmFpbGFibGVMaW5lV2lkdGg7Ci0KLQkJLy8gb25seSBpbmRlbnQgaWYgaWdub3Jpbmcgd2hpdGVzcGFjZSBvciBpZiBjb2xsYXBzaW5nIGFuZAotCQkvLyB0aGVyZSB3YXMgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBiZWZvcmUgdGhpcyByZWdpb24KLQkJYm9vbGVhbiBjYW5JbmRlbnQgPSBmYWxzZTsKLQkJU3RyaW5nIHByZXZpb3VzUmVnaW9uRnVsbFRleHQgPSBudWxsOwotCQlTdHJpbmcgcHJldmlvdXNSZWdpb25UeXBlID0gbnVsbDsKLQotCQlpZiAoKHdoaXRlc3BhY2VTdHJhdGVneSA9PSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFKSB8fCB3aGl0ZXNwYWNlU3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRUFORFRSSU0pIHsKLQkJCS8vIGlmIGlnbm9yaW5nLCBuZWVkIHRvIGNoZWNrIGlmIHByZXZpb3VzIHJlZ2lvbiB3YXMgY2RhdGEKLQkJCXByZXZpb3VzUmVnaW9uVHlwZSA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHByZXZpb3VzUmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKQotCQkJCWNhbkluZGVudCA9IGZhbHNlOwotCQkJZWxzZQotCQkJCWNhbkluZGVudCA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAod2hpdGVzcGFjZVN0cmF0ZWd5ID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRSkgewotCQkJLy8gaWYgY29sbGFwc2luZywgbmVlZCB0byBjaGVjayBpZiBwcmV2aW91cyByZWdpb24gZW5kZWQgaW4gYQotCQkJLy8gd2hpdGVzcGFjZQotCQkJcHJldmlvdXNSZWdpb25UeXBlID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocHJldmlvdXNSZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCQlwcmV2aW91c1JlZ2lvbkZ1bGxUZXh0ID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQkJCWludCBsZW5ndGggPSBwcmV2aW91c1JlZ2lvbkZ1bGxUZXh0Lmxlbmd0aCgpOwotCQkJCWlmIChsZW5ndGggPiAxKQotCQkJCQljYW5JbmRlbnQgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHByZXZpb3VzUmVnaW9uRnVsbFRleHQuY2hhckF0KGxlbmd0aCAtIDEpKTsKLQkJCX0KLQkJfQotCQlpZiAoY2FuSW5kZW50KSB7Ci0JCQlpbnQgaW5kZW50U3RhcnRPZmZzZXQgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCVN0cmluZyB3aGl0ZXNwYWNlUnVuID0gbnVsbDsKLQotCQkJLy8gZ2V0IHByZXZpb3VzIHJlZ2lvbiB0eXBlIGlmIGl0IHdhcyBub3QgcHJldmlvdXNseSByZXRyaWV2ZWQKLQkJCWlmIChwcmV2aW91c1JlZ2lvblR5cGUgPT0gbnVsbCkKLQkJCQlwcmV2aW91c1JlZ2lvblR5cGUgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKTsKLQotCQkJLy8gZ2V0IHByZXZpb3VzIHJlZ2lvbidzIHRleHQgaWYgaXQgd2FzIG5vdCBwcmV2aW91c2x5IHJldHJpZXZlZAotCQkJaWYgKHByZXZpb3VzUmVnaW9uRnVsbFRleHQgPT0gbnVsbCAmJiBwcmV2aW91c1JlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkKLQkJCQlwcmV2aW91c1JlZ2lvbkZ1bGxUZXh0ID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCi0JCQkvLyBpZiBwcmV2aW91cyByZWdpb24gd2FzIG9ubHkgd2hpdGVzcGFjZSwgdGhpcyBtYXkKLQkJCS8vIGFscmVhZHkgYmUgaW5kZW50ZWQsIHNvIG5lZWQgdG8gbWFrZSBzdXJlCi0JCQlpZiAoKHByZXZpb3VzUmVnaW9uRnVsbFRleHQgIT0gbnVsbCkgJiYgKHByZXZpb3VzUmVnaW9uRnVsbFRleHQudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJaW5kZW50U3RhcnRPZmZzZXQgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJd2hpdGVzcGFjZVJ1biA9IHByZXZpb3VzUmVnaW9uRnVsbFRleHQ7Ci0JCQl9Ci0JCQlpZiAoKHByZXZpb3VzUmVnaW9uRnVsbFRleHQgIT0gbnVsbCkgJiYgKHdoaXRlc3BhY2VSdW4gPT0gbnVsbCkgJiYgIWdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKSB7Ci0JCQkJd2hpdGVzcGFjZVJ1biA9IGdldFRyYWlsaW5nV2hpdGVzcGFjZShwcmV2aW91c1JlZ2lvbkZ1bGxUZXh0KTsKLQkJCQlpbmRlbnRTdGFydE9mZnNldCA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpOwotCQkJfQotCi0JCQlpbnQgaW5kZW50TGV2ZWwgPSB0aGlzQ29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKTsKLQkJCWlmIChhZGRJbmRlbnQgJiYgaW5kZW50U3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVCkgewotCQkJCSsraW5kZW50TGV2ZWw7Ci0JCQkJdGhpc0NvbnN0cmFpbnRzLnNldEluZGVudExldmVsKGluZGVudExldmVsKTsKLQkJCX0KLQotCQkJLy8gaW5kZW50IGlmIG5vdCBhbHJlYWR5IGluZGVudGVkCi0JCQlhdmFpbGFibGVMaW5lV2lkdGggPSBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZCh0ZXh0RWRpdCwgY3VycmVudERvY3VtZW50UmVnaW9uLCBpbmRlbnRMZXZlbCwgaW5kZW50U3RhcnRPZmZzZXQsIHdoaXRlc3BhY2VSdW4pOwotCQl9Ci0JCXJldHVybiBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgZXhhY3RseSBvbmUgd2hpdGVzcGFjZSBpbiBjdXJyZW50VGV4dFJlZ2lvbi4gSWYgdGhlcmUgYXJlIG1vcmUsCi0JICogY29sbGFwc2UgdG8gb25lLiBJZiB0aGVyZSBhcmUgbm9uZSwgaW5zZXJ0IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEVkaXQKLQkgKiBAcGFyYW0gY3VycmVudERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGF2YWlsYWJsZUxpbmVXaWR0aAotCSAqIEBwYXJhbSBjdXJyZW50VGV4dFJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTcGFjZUFuZENvbGxhcHNlKFRleHRFZGl0IHRleHRFZGl0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCwgSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24pIHsKLQkJaW50IHRleHRMZW5ndGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCWludCByZWdpb25MZW5ndGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJYm9vbGVhbiB0aGVyZUFyZVNwYWNlcyA9IHRleHRMZW5ndGggPCByZWdpb25MZW5ndGg7Ci0JCWludCBzcGFjZXNTdGFydE9mZnNldCA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChjdXJyZW50VGV4dFJlZ2lvbikgKyB0ZXh0TGVuZ3RoOwotCi0JCWlmICh0aGVyZUFyZVNwYWNlcykgewotCQkJU3RyaW5nIGZ1bGxUYWdOYW1lID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCVN0cmluZyB3aGl0ZXNwYWNlUnVuID0gZnVsbFRhZ05hbWUuc3Vic3RyaW5nKHRleHRMZW5ndGgsIHJlZ2lvbkxlbmd0aCk7Ci0JCQljb2xsYXBzZVNwYWNlcyh0ZXh0RWRpdCwgc3BhY2VzU3RhcnRPZmZzZXQsIGF2YWlsYWJsZUxpbmVXaWR0aCwgd2hpdGVzcGFjZVJ1bik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpbnNlcnQgYSBzcGFjZQotCQkJSW5zZXJ0RWRpdCBpbnNlcnRFZGl0ID0gbmV3IEluc2VydEVkaXQoc3BhY2VzU3RhcnRPZmZzZXQsIFNQQUNFKTsKLQkJCXRleHRFZGl0LmFkZENoaWxkKGluc2VydEVkaXQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZEluZGVudEJlZm9yZUF0dHJpYnV0ZShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY29uc3RyYWludHMsIElUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucywgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCwgaW50IGN1cnJlbnRUZXh0UmVnaW9uSW5kZXgsIElUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXh0VGV4dFJlZ2lvbikgewotCQlib29sZWFuIGluZGVudEF0dHJpYnV0ZSA9IGZhbHNlOwotCi0JCS8vIGxvb2sgYWhlYWQgdG8gc2VlIGlmIGdvaW5nIHRvIGhpdCBtYXggbGluZSB3aWR0aAotCQkvLyBzb21ldGhpbmcgYXR0ck5hbWUKLQkJaW50IGN1cnJlbnRXaWR0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIG5leHRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDE7Ci0JCWlmIChjdXJyZW50V2lkdGggPiBhdmFpbGFibGVMaW5lV2lkdGgpCi0JCQlpbmRlbnRBdHRyaWJ1dGUgPSB0cnVlOwotCQllbHNlIHsKLQkJCWlmICgoY3VycmVudFRleHRSZWdpb25JbmRleCArIDIpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJLy8gc3RpbGwgb2theSwgc28gdHJ5IG5leHQgcmVnaW9uCi0JCQkJLy8gc29tZXRoaW5nIGF0dHJOYW1lPQotCQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCArIDIpOwotCQkJCWlmICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQkrK2N1cnJlbnRXaWR0aDsKLQkJCQkJaWYgKGN1cnJlbnRXaWR0aCA+IGF2YWlsYWJsZUxpbmVXaWR0aCkKLQkJCQkJCWluZGVudEF0dHJpYnV0ZSA9IHRydWU7Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMykgPCB0ZXh0UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJCQkvLyBzdGlsbCBva2F5LCBzbyB0cnkgbmV4dCByZWdpb24KLQkJCQkJCQkvLyBzb21ldGhpbmcgYXR0ck5hbWU9YXR0clZhbHVlCi0JCQkJCQkJdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMyk7Ci0JCQkJCQkJaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQkJY3VycmVudFdpZHRoID0gK3RleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJCQlpZiAoY3VycmVudFdpZHRoID4gYXZhaWxhYmxlTGluZVdpZHRoKQotCQkJCQkJCQkJaW5kZW50QXR0cmlidXRlID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgcHJvdmlkZWQgaW5mb3JtYXRpb24gKHBhcmVudENvbnN0cmFpbnRzICYgY3VycmVudERPTVJlZ2lvbiksCi0JICogdXBkYXRlIHRoZSBmb3JtYXR0aW5nIGNvbnN0cmFpbnRzIChmb3IgdGhpcyAmIGNoaWxkKQotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb25zdHJhaW50cwotCSAqICAgICAgICAgICAgY2FuIGJlIG51bGwKLQkgKiBAcGFyYW0gdGhpc0NvbnN0cmFpbnRzCi0JICogICAgICAgICAgICBjYW4gYmUgbnVsbAotCSAqIEBwYXJhbSBjaGlsZENvbnN0cmFpbnRzCi0JICogICAgICAgICAgICBjYW4gYmUgbnVsbAotCSAqIEBwYXJhbSBjdXJyZW50RE9NUmVnaW9uCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUZvcm1hdHRpbmdDb25zdHJhaW50cyhYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyB0aGlzQ29uc3RyYWludHMsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBjaGlsZENvbnN0cmFpbnRzLCBET01SZWdpb24gY3VycmVudERPTVJlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCQlJRE9NTm9kZSBjdXJyZW50Tm9kZSA9IGN1cnJlbnRET01SZWdpb24uZG9tTm9kZTsKLQotCQkvLyBkZWZhdWx0IHRvIHdoYXRldmVyIHBhcmVudCdzIGNvbnN0cmFpbnQgc2FpZCB0byBkbwotCQlpZiAocGFyZW50Q29uc3RyYWludHMgIT0gbnVsbCkgewotCQkJaWYgKHRoaXNDb25zdHJhaW50cyAhPSBudWxsKSB7Ci0JCQkJdGhpc0NvbnN0cmFpbnRzLmNvcHlDb25zdHJhaW50cyhwYXJlbnRDb25zdHJhaW50cyk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRDb25zdHJhaW50cyAhPSBudWxsKSB7Ci0JCQkJY2hpbGRDb25zdHJhaW50cy5jb3B5Q29uc3RyYWludHMocGFyZW50Q29uc3RyYWludHMpOwotCQkJCS8vIGlmIHdoaXRlc3BhY2Ugc3RyYXRlZ3kgd2FzIG9ubHkgYSBoaW50LCBudWxsIGl0IG91dCBzbwotCQkJCS8vIGRlZmF1bHRzIGFyZSB0YWtlbiBpbnN0ZWFkCi0JCQkJaWYgKHBhcmVudENvbnN0cmFpbnRzLmlzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQoKSkKLQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kobnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgdXAgY29uc3RyYWludHMgZm9yIGRpcmVjdCBjaGlsZHJlbiBvZiBkb2N1bWVudCByb290Ci0JCU5vZGUgcGFyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlpZiAodGhpc0NvbnN0cmFpbnRzICE9IG51bGwpIHsKLQkJCQl0aGlzQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUpOwotCQkJCXRoaXNDb25zdHJhaW50cy5zZXRJbmRlbnRTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuTkVXX0xJTkUpOwotCQkJCXRoaXNDb25zdHJhaW50cy5zZXRJbmRlbnRMZXZlbCgwKTsKLQkJCX0KLQkJCWlmIChjaGlsZENvbnN0cmFpbnRzICE9IG51bGwpIHsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShudWxsKTsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KG51bGwpOwotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50TGV2ZWwoMCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBvdGhlciBjb25kaXRpb25zIHRvIGNoZWNrIHdoZW4gc2V0dGluZyB1cCBjaGlsZCBjb25zdHJhaW50cwotCQlpZiAoY2hpbGRDb25zdHJhaW50cyAhPSBudWxsKSB7Ci0JCQlYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKTsKLQotCQkJLy8gaWYgd2UncmUgYXQgZG9jdW1lbnQgcm9vdCwgY2hpbGQgdGFncyBzaG91bGQgYWx3YXlzIGp1c3Qgc3RhcnQKLQkJCS8vIG9uIGEgbmV3IGxpbmUgYW5kIGhhdmUgYW4gaW5kZW50IGxldmVsIG9mIDAKLQkJCWlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkUpOwotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLk5FV19MSU5FKTsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudExldmVsKDApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gQlVHMTA4MDc0ICYgQlVHODQ2ODggLSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGluIHhzbDp0ZXh0ICYKLQkJCQkvLyB4c2w6YXR0cmlidXRlCi0JCQkJU3RyaW5nIG5vZGVOYW1lc3BhY2VVUkkgPSBjdXJyZW50Tm9kZS5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCQlpZiAoWFNMX05BTUVTUEFDRS5lcXVhbHMobm9kZU5hbWVzcGFjZVVSSSkpIHsKLQkJCQkJU3RyaW5nIG5vZGVOYW1lID0gKChFbGVtZW50KSBjdXJyZW50Tm9kZSkuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJCWlmIChYU0xfQVRUUklCVVRFLmVxdWFscyhub2RlTmFtZSkgfHwgWFNMX1RFWFQuZXF1YWxzKG5vZGVOYW1lKSkgewotCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gc2VhcmNoIHdpdGhpbiBjdXJyZW50IHRhZyBmb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZQotCQkJCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBjdXJyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJaW50IGkgPSAwOwotCQkJCQlib29sZWFuIHhtbFNwYWNlRm91bmQgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiBwcmVzZXJ2ZUZvdW5kID0gZmFsc2U7Ci0JCQkJCXdoaWxlIChpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpICYmICF4bWxTcGFjZUZvdW5kKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJCVN0cmluZyByZWdpb25UZXh0ID0gY3VycmVudFJlZ2lvbi5nZXRUZXh0KHRleHRSZWdpb24pOwotCQkJCQkJCWlmIChYTUxfU1BBQ0UuZXF1YWxzKHJlZ2lvblRleHQpKSB7Ci0JCQkJCQkJCWlmICgoaSArIDEpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJCQkJCQkrK2k7Ci0JCQkJCQkJCQl0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJCQkJaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTICYmICgoaSArIDEpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpKSkgewotCQkJCQkJCQkJCSsraTsKLQkJCQkJCQkJCQl0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJCQkJCXJlZ2lvblRleHQgPSBjdXJyZW50UmVnaW9uLmdldFRleHQodGV4dFJlZ2lvbik7Ci0JCQkJCQkJCQkJaWYgKFBSRVNFUlZFLmVxdWFscyhyZWdpb25UZXh0KSB8fCBQUkVTRVJWRV9RVU9URUQuZXF1YWxzKHJlZ2lvblRleHQpKSB7Ci0JCQkJCQkJCQkJCXByZXNlcnZlRm91bmQgPSB0cnVlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQl4bWxTcGFjZUZvdW5kID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkrK2k7Ci0JCQkJCX0KLQkJCQkJaWYgKHhtbFNwYWNlRm91bmQpIHsKLQkJCQkJCWlmIChwcmVzZXJ2ZUZvdW5kKSB7Ci0JCQkJCQkJLy8gcHJlc2VydmUgd2FzIGZvdW5kIHNvIHNldCB0aGUgc3RyYXRlZ3kKLQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8geG1sOnNwYWNlIHdhcyBmb3VuZCBidXQgaXQgd2FzIG5vdCBjb2xsYXBzZSwgc28KLQkJCQkJCQkvLyB1c2UgZGVmYXVsdCB3aGl0ZXNwYWNlIHN0cmF0ZWd5Ci0JCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkRFRkFVTFQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gaG93IHRvIGhhbmRlIG5vZGVzIHRoYXQgaGF2ZSBub253aGl0ZXNwYWNlIHRleHQKLQkJCQkJCS8vIGNvbnRlbnQKLQkJCQkJCU5vZGVMaXN0IG5vZGVMaXN0ID0gY3VycmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQkJaW50IGxlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCWJvb2xlYW4gdGV4dE5vZGVGb3VuZCA9IGZhbHNlOwotCQkJCQkJLy8gQlVHMjE0NTE2IC0gSWYgdGhlIHBhcmVudCBjb25zdHJhaW50IGlzIHRvIHByZXNlcnZlIHdoaXRlc3BhY2UsIGNoaWxkIGNvbnN0cmFpbnRzIHNob3VsZAotCQkJCQkJLy8gc3RpbGwgcmVmbGVjdCB0aGUgcGFyZW50IGNvbnN0cmFpbnRzCi0JCQkJCQl3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgIXRleHROb2RlRm91bmQgJiYgcGFyZW50Q29uc3RyYWludHMgIT0gbnVsbCAmJiAhWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFLmVxdWFscyhwYXJlbnRDb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSkpIHsKLQkJCQkJCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaW5kZXgpOwotCQkJCQkJCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJCQl0ZXh0Tm9kZUZvdW5kID0gISgoSURPTVRleHQpIGNoaWxkTm9kZSkuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJKytpbmRleDsKLQkJCQkJCX0KLQkJCQkJCWlmICh0ZXh0Tm9kZUZvdW5kKSB7Ci0JCQkJCQkJaWYgKGxlbmd0aCA+IDEpIHsKLQkJCQkJCQkJLy8gbW9yZSBpbiBoZXJlIHRoYW4ganVzdCB0ZXh0LCBzbyBjb25zaWRlcgotCQkJCQkJCQkvLyB0aGlzIG1peGVkIGNvbnRlbnQKLQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0TWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3koKSk7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0TWl4ZWRJbmRlbnRTdHJhdGVneSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIHRoZXJlJ3Mgb25seSB0ZXh0Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldFRleHRXaGl0ZXNwYWNlU3RyYXRlZ3koKSk7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0VGV4dEluZGVudFN0cmF0ZWd5KCkpOwotCQkJCQkJCX0KLQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldElzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQodHJ1ZSk7Ci0JCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJc0luZGVudFN0cmF0ZWd5QUhpbnQodHJ1ZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHRyeSByZWZlcnJpbmcgdG8gY29udGVudCBtb2RlbCBmb3IgaW5mb3JtYXRpb24gb24KLQkJCQkJCS8vIHdoaXRlc3BhY2UgJiBpbmRlbnQgc3RyYXRlZ3kKLQkJCQkJCU1vZGVsUXVlcnlBZGFwdGVyIGFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSURPTURvY3VtZW50KSBjdXJyZW50Tm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBhZGFwdGVyLmdldE1vZGVsUXVlcnkoKS5nZXRDTU5vZGUoY3VycmVudE5vZGUpOwotCQkJCQkJaWYgKGVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gZm9sbG93IHdoaXRlc3BhY2Ugc3RyYXRlZ3kgcHJlZmVyZW5jZSBmb3IKLQkJCQkJCQkvLyBwY2RhdGEgY29udGVudAotCQkJCQkJCWludCBjb250ZW50VHlwZSA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCQkJCQotCQkJCQkJCVN0cmluZyBmYWNldFZhbHVlID0gbnVsbDsKLQkJCQkJCQlpZihlbGVtZW50RGVjbGFyYXRpb24uZ2V0RGF0YVR5cGUoKSAhPSBudWxsKQotCQkJCQkJCQlmYWNldFZhbHVlID0gKFN0cmluZykgZWxlbWVudERlY2xhcmF0aW9uLmdldERhdGFUeXBlKCkuZ2V0UHJvcGVydHkoUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVCk7Ci0JCQkJCQkJaWYoZmFjZXRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmKFBSRVNFUlZFLmVxdWFscyhmYWNldFZhbHVlKSkKLQkJCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRSk7Ci0JCQkJCQkJCS8vIEZvciBYU0QgdHlwZXMsICJjb2xsYXBzZSIgY29ycmVzcG9uZHMgdG8gdGhlIElHTk9SRUFORFRSSU0gc3RyYXRlZ3kKLQkJCQkJCQkJZWxzZSBpZihDT0xMQVBTRS5lcXVhbHMoZmFjZXRWYWx1ZSkpCi0JCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFQU5EVFJJTSk7Ci0JCQkJCQkJCWVsc2UgaWYoUkVQTEFDRS5lcXVhbHMoZmFjZXRWYWx1ZSkpCi0JCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUkVQTEFDRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSAmJiBwYXJlbnRDb25zdHJhaW50cyAhPSBudWxsICYmICFYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUuZXF1YWxzKHBhcmVudENvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpKSkgewotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShwcmVmZXJlbmNlcy5nZXRQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3koKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQgJiYgcGFyZW50Q29uc3RyYWludHMgIT0gbnVsbCAmJiAhWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFLmVxdWFscyhwYXJlbnRDb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSkpIHsKLQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRSk7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVCk7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludCh0cnVlKTsKLQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJc0luZGVudFN0cmF0ZWd5QUhpbnQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBsb29rIGZvciB4bWw6c3BhY2UgaW4gY29udGVudCBtb2RlbAotCQkJCQkJCQlDTU5hbWVkTm9kZU1hcCBjbUF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0QXR0cmlidXRlcygpOwotCi0JCQkJCQkJCS8vIE5vdCBuZWVkZWQgLSB3ZSdyZSBsb29raW5nIGZvciB4bWw6c3BhY2UKLQkJCQkJCQkJLy9DTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoY21BdHRyaWJ1dGVzKTsKLQkJCQkJCQkJLy9MaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShjdXJyZW50Tm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIGN1cnJlbnROb2RlLCBlbGVtZW50RGVjbGFyYXRpb24sIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQkJCQkJLy9mb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCS8vCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCQkJCS8vCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQkJCS8vCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCQkJCQkvLwl9Ci0JCQkJCQkJCS8vfQotCQkJCQkJCQkvL2NtQXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCQkJCQkJLy8gQ2hlY2sgaW1wbGllZCB2YWx1ZXMgZnJvbSB0aGUgRFREIHdheS4KLQkJCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbUF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKFhNTF9TUEFDRSk7Ci0JCQkJCQkJCWlmIChhdHRyaWJ1dGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGZvdW5kLCBjaGVjawotCQkJCQkJCQkJLy8gaXQKLQkJCQkJCQkJCS8vIG91dC4KLQotCQkJCQkJCQkJLy9CVUcyMTQ1MTYvMTk2NTQ0IC0gRml4ZWQgTlBFIHRoYXQgd2FzIGNhdXNlZCBieSBhbiBhdHRyIGhhdmluZwotCQkJCQkJCQkJLy8gYSBudWxsIGF0dHIgdHlwZQotCQkJCQkJCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0JCQkJCQkJCQlDTURhdGFUeXBlIGF0dHJUeXBlID0gYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0QXR0clR5cGUoKTsKLQkJCQkJCQkJCWlmIChhdHRyVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaWYgKChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX05PTkUpICYmIGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpCi0JCQkJCQkJCQkJCWRlZmF1bHRWYWx1ZSA9IGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJCQkJCQkJCWVsc2UgaWYgKChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkgIT0gbnVsbCkgJiYgKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS5sZW5ndGggPiAwKSkgewotCQkJCQkJCQkJCQlkZWZhdWx0VmFsdWUgPSBhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKClbMF07Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkvLyB4bWw6c3BhY2U9InByZXNlcnZlIiBtZWFucyBwcmVzZXJ2ZQotCQkJCQkJCQkJLy8gc3BhY2UsCi0JCQkJCQkJCQkvLyBldmVyeXRoaW5nIGVsc2UgbWVhbnMgYmFjayB0bwotCQkJCQkJCQkJLy8gZGVmYXVsdC4KLQkJCQkJCQkJCWlmIChQUkVTRVJWRS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkKLQkJCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpOwotCQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkvLyBJZiB0aGUgbm9kZSBoYXMgbm8gYXR0cmlidXRlcywgaW5oZXJpdCB0aGUgcGFyZW50cyB3aGl0ZXNwYWNlIHN0cmF0ZWd5Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJaWYgKHBhcmVudENvbnN0cmFpbnRzICE9IG51bGwpCi0JCQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kocGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KG51bGwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gc2V0IGRlZmF1bHQgdmFsdWVzIGFjY29yZGluZyB0byBwcmVmZXJlbmNlcwotCQkJaWYgKGNoaWxkQ29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkgPT0gbnVsbCkgewotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldEVsZW1lbnRXaGl0ZXNwYWNlU3RyYXRlZ3koKSk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRDb25zdHJhaW50cy5nZXRJbmRlbnRTdHJhdGVneSgpID09IG51bGwpIHsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldEVsZW1lbnRJbmRlbnRTdHJhdGVneSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGggZ2l2ZW4gZnVsbFRleHQuCi0JICogCi0JICogQHBhcmFtIGZ1bGxUZXh0Ci0JICogQHBhcmFtIGF2YWlsYWJsZUxpbmVXaWR0aAotCSAqIEBwYXJhbSBtYXhBdmFpbGFibGVMaW5lV2lkdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgdXBkYXRlTGluZVdpZHRoV2l0aExhc3RMaW5lKFN0cmluZyBmdWxsVGV4dCwgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCkgewotCQlpbnQgbWF4QXZhaWxhYmxlTGluZVdpZHRoID0gZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkuZ2V0TWF4TGluZVdpZHRoKCk7Ci0JCWludCBsaW5lV2lkdGggPSBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JCWlmIChmdWxsVGV4dCAhPSBudWxsKSB7Ci0JCQlpbnQgdGV4dExlbmd0aCA9IGZ1bGxUZXh0Lmxlbmd0aCgpOwotCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkvLyBmaW5kIGxhc3QgbmV3bGluZQotCQkJaW50IGxhc3RMRk9mZnNldCA9IGZ1bGxUZXh0Lmxhc3RJbmRleE9mKCdcbicpOwotCQkJaW50IGxhc3RDUk9mZnNldCA9IGZ1bGxUZXh0Lmxhc3RJbmRleE9mKCdccicpOwotCQkJLy8gYWxsIHRleHQgd2FzIG9uIDEgbGluZQotCQkJaWYgKGxhc3RMRk9mZnNldCA9PSAtMSAmJiBsYXN0Q1JPZmZzZXQgPT0gLTEpIHsKLQkJCQkvLyBqdXN0IHN1YnRyYWN0IHRleHQgbGVuZ3RoIGZyb20gY3VycmVudAotCQkJCS8vIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJbGluZVdpZHRoIC09IGZ1bGxUZXh0Lmxlbmd0aCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY2FsY3VsYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9mIGxhc3QgbGluZQotCQkJCWludCBsYXN0TmV3TGluZSA9IE1hdGgubWF4KGxhc3RMRk9mZnNldCwgbGFzdENST2Zmc2V0KTsKLQkJCQlsaW5lV2lkdGggPSBtYXhBdmFpbGFibGVMaW5lV2lkdGggLSAodGV4dExlbmd0aCAtIGxhc3ROZXdMaW5lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGluZVdpZHRoOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gY3VycmVudFJlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpOwotCQlpbnQgbGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQoY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQl0cnkgewotCQkJaWYgKGxpbmUgPiAwKSB7Ci0JCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUgLSAxKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkvLyBCVUcxMTU3MTY6IGlmIGNhbm5vdCBnZXQgbGluZSBkZWxpbWl0ZXIgZnJvbSBjdXJyZW50IGxpbmUsIGp1c3QKLQkJLy8gdXNlIGRlZmF1bHQgbGluZSBkZWxpbWl0ZXIKLQkJaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdExpbmVEZWxpbWl0ZXJzKFN0cmluZyBiYXNlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24pIHsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRMaW5lRGVsaW1pdGVyKGN1cnJlbnRSZWdpb24pOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcihpbnQgaW5kZXggPSAwOyBpbmRleCA8IGJhc2UubGVuZ3RoKCk7KSB7Ci0JCQlpbmRleCA9IGJhc2UuaW5kZXhPZihsaW5lRGVsaW1pdGVyLCBpbmRleCk7Ci0JCQlpZihpbmRleCsrID49IDApCi0JCQkJc2IuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGVyRm9ybWF0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyZWU3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIHRoZSBuZXcgeG1sIGZvcm1hdHRlciBzbyB0aGF0IGl0IGNhbiBiZSBzdGlsbAotICogY29uc2lkZXJlZCBhbiBJU3RydXR1cmVkRm9ybWF0UHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBEZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyIGZGb3JtYXR0ZXIgPSBudWxsOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIGZvcm1hdERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9ybWF0TW9kZWwobW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmKGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLQkJCWZQcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKCIiLCAyKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCURvY3VtZW50UmV3cml0ZVNlc3Npb24gYWN0aXZlUmV3cml0ZVNlc3Npb24gPSAoKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWREb2N1bWVudCkuZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKTsKLQkJYm9vbGVhbiBzdGFydGVkUmV3cml0ZVNlc3Npb24gPSBmYWxzZTsKLQkJaWYgKGFjdGl2ZVJld3JpdGVTZXNzaW9uID09IG51bGwpIHsKLQkJCWFjdGl2ZVJld3JpdGVTZXNzaW9uID0gKChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQkJCXN0YXJ0ZWRSZXdyaXRlU2Vzc2lvbiA9IHRydWU7Ci0JCX0KLQkJZ2V0Rm9ybWF0dGVyKCkuc2V0UHJvZ3Jlc3NNb25pdG9yKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJCQlyZXR1cm4gZlByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIGZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOwotCQkJfQotCQl9KTsKLQkJVGV4dEVkaXQgZWRpdCA9IGdldEZvcm1hdHRlcigpLmZvcm1hdChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQlpZihmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQlmUHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkJCi0JCXRyeSB7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQllZGl0LmFwcGx5KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlpZihmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQkJZlByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc3RhcnRlZFJld3JpdGVTZXNzaW9uICYmIGFjdGl2ZVJld3JpdGVTZXNzaW9uICE9IG51bGwpIHsKLQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWREb2N1bWVudCkuc3RvcFJld3JpdGVTZXNzaW9uKGFjdGl2ZVJld3JpdGVTZXNzaW9uKTsKLQkJCX0KLQkJCXN0cnVjdHVyZWRNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCWlmKGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLQkJCQlmUHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Ob2RlIGRvbU5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQlmb3JtYXRNb2RlbChkb21Ob2RlLmdldE1vZGVsKCksIGRvbU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgZG9tTm9kZS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCXByaXZhdGUgRGVmYXVsdFhNTFBhcnRpdGlvbkZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoKSB7Ci0JCWlmIChmRm9ybWF0dGVyID09IG51bGwpIHsKLQkJCWZGb3JtYXR0ZXIgPSBuZXcgRGVmYXVsdFhNTFBhcnRpdGlvbkZvcm1hdHRlcigpOwotCQl9Ci0JCXJldHVybiBmRm9ybWF0dGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyYTUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi1wdWJsaWMgY2xhc3MgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUkVTRVJWRSA9ICJQUkVTRVJWRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xMQVBTRSA9ICJDT0xMQVBTRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJR05PUkUgPSAiSUdOT1JFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElHTk9SRUFORFRSSU0gPSAiSUdOT1JFQU5EVFJJTSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUID0gIkRFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVQTEFDRSA9ICJSRVBMQUNFIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOREVOVCA9ICJJTkRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX0xJTkUgPSAiTkVXX0xJTkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5MSU5FID0gIklOTElORSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IGZBdmFpbGFibGVMaW5lV2lkdGggPSAwOwotCXByaXZhdGUgaW50IGZJbmRlbnRMZXZlbCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZkluZGVudFN0cmF0ZWd5OwotCXByaXZhdGUgU3RyaW5nIGZXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0luZGVudFN0cmF0ZWd5QUhpbnQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB2YWx1ZXMgaW4gdGhpcyBmb3JtYXR0aW5nIGNvbnN0cmFpbnQgd2l0aCB2YWx1ZXMgZnJvbQotCSAqIGNvbnN0cmFpbnRzCi0JICogCi0JICogQHBhcmFtIGNvbnN0cmFpbnRzCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlDb25zdHJhaW50cyhYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY29uc3RyYWludHMpIHsKLQkJc2V0QXZhaWxhYmxlTGluZVdpZHRoKGNvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpKTsKLQkJc2V0SW5kZW50TGV2ZWwoY29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXNldEluZGVudFN0cmF0ZWd5KGNvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCkpOwotCQlzZXRXaGl0ZXNwYWNlU3RyYXRlZ3koY29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgewotCQlyZXR1cm4gZkF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVMaW5lV2lkdGgoaW50IGxpbmVXaWR0aCkgewotCQlmQXZhaWxhYmxlTGluZVdpZHRoID0gbGluZVdpZHRoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW5kZW50TGV2ZWwoKSB7Ci0JCXJldHVybiBmSW5kZW50TGV2ZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5kZW50TGV2ZWwoaW50IGluZGVudExldmVsKSB7Ci0JCWZJbmRlbnRMZXZlbCA9IGluZGVudExldmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmSW5kZW50U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5kZW50U3RyYXRlZ3koU3RyaW5nIGluZGVudFN0cmF0ZWd5KSB7Ci0JCWZJbmRlbnRTdHJhdGVneSA9IGluZGVudFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZldoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaGl0ZXNwYWNlU3RyYXRlZ3koU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSkgewotCQlmV2hpdGVzcGFjZVN0cmF0ZWd5ID0gd2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5kZW50U3RyYXRlZ3lBSGludCgpIHsKLQkJcmV0dXJuIGZJc0luZGVudFN0cmF0ZWd5QUhpbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNJbmRlbnRTdHJhdGVneUFIaW50KGJvb2xlYW4gaXNJbmRlbnRTdHJhdGVneUFIaW50KSB7Ci0JCWZJc0luZGVudFN0cmF0ZWd5QUhpbnQgPSBpc0luZGVudFN0cmF0ZWd5QUhpbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludCgpIHsKLQkJcmV0dXJuIGZJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQoYm9vbGVhbiBpc1doaXRlc3BhY2VTdHJhdGVneUFIaW50KSB7Ci0JCWZJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50ID0gaXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3MTFkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci0KLXB1YmxpYyBjbGFzcyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRVNFUlZFID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTExBUFNFID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkNPTExBUFNFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElHTk9SRSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkU7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkRFTlQgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5ERU5UOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19MSU5FID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLk5FV19MSU5FOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOTElORSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkxJTkU7Ci0KLQlwcml2YXRlIGludCBmTWF4TGluZVdpZHRoID0gNzI7Ci0JcHJpdmF0ZSBib29sZWFuIGZBbGlnbkZpbmFsQnJhY2tldCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluZGVudE11bHRpcGxlQXR0cmlidXRlcyA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHRJbmRlbnRTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkxJTkU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHRXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnRJbmRlbnRTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkRFTlQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnRXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFOwotCXByaXZhdGUgU3RyaW5nIGZNaXhlZEluZGVudFN0cmF0ZWd5ID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVDsKLQlwcml2YXRlIFN0cmluZyBmTWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFOwotCXByaXZhdGUgU3RyaW5nIGZPbmVJbmRlbnQgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGZDbGVhckFsbEJsYW5rTGluZXMgPSBmYWxzZTsKLQotCXB1YmxpYyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXNldE1heExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQlzZXRJbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQlzZXRBbGlnbkZpbmFsQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCXNldFNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0VfQkVGT1JFX0VNUFRZX0NMT1NFX1RBRykpOwotCQkJCi0JCQlib29sZWFuIHByZXNlcnZlcGNkYXRhID0gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCk7Ci0JCQlpZiAocHJlc2VydmVwY2RhdGEpCi0JCQkJZlBDRGF0YVdoaXRlc3BhY2VTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcy5QUkVTRVJWRTsKLQkJCWVsc2UKLQkJCQlmUENEYXRhV2hpdGVzcGFjZVN0cmF0ZWd5ID0gWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzLkNPTExBUFNFOwotCi0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJfQotCQkJc2V0T25lSW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCXNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1heExpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGZNYXhMaW5lV2lkdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QWxpZ25GaW5hbEJyYWNrZXQoKSB7Ci0JCXJldHVybiBmQWxpZ25GaW5hbEJyYWNrZXQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0U3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKCkgewotCQlyZXR1cm4gZlNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZkluZGVudE11bHRpcGxlQXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBDRGF0YVdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0SW5kZW50U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmVGV4dEluZGVudFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZUZXh0V2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudEluZGVudFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZkVsZW1lbnRJbmRlbnRTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRXaGl0ZXNwYWNlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmRWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKGJvb2xlYW4gc3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKSB7Ci0JCWZTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcgPSBzcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKGJvb2xlYW4gaW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKSB7Ci0JCWZJbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXMgPSBpbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UENEYXRhV2hpdGVzcGFjZVN0cmF0ZWd5KFN0cmluZyBkYXRhV2hpdGVzcGFjZVN0cmF0ZWd5KSB7Ci0JCWZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBkYXRhV2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduRmluYWxCcmFja2V0KGJvb2xlYW4gYWxpZ25GaW5hbEJyYWNrZXQpIHsKLQkJZkFsaWduRmluYWxCcmFja2V0ID0gYWxpZ25GaW5hbEJyYWNrZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNaXhlZEluZGVudFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZk1peGVkSW5kZW50U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWl4ZWRJbmRlbnRTdHJhdGVneShTdHJpbmcgbWl4ZWRJbmRlbnRTdHJhdGVneSkgewotCQlmTWl4ZWRJbmRlbnRTdHJhdGVneSA9IG1peGVkSW5kZW50U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNaXhlZFdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZNaXhlZFdoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaXhlZFdoaXRlc3BhY2VTdHJhdGVneShTdHJpbmcgbWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3kpIHsKLQkJZk1peGVkV2hpdGVzcGFjZVN0cmF0ZWd5ID0gbWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPbmVJbmRlbnQoKSB7Ci0JCXJldHVybiBmT25lSW5kZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1heExpbmVXaWR0aChpbnQgbWF4TGluZVdpZHRoKSB7Ci0JCWZNYXhMaW5lV2lkdGggPSBtYXhMaW5lV2lkdGg7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T25lSW5kZW50KFN0cmluZyBvbmVJbmRlbnQpIHsKLQkJZk9uZUluZGVudCA9IG9uZUluZGVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDbGVhckFsbEJsYW5rTGluZXMoKSB7Ci0JCXJldHVybiBmQ2xlYXJBbGxCbGFua0xpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcykgewotCQlmQ2xlYXJBbGxCbGFua0xpbmVzID0gY2xlYXJBbGxCbGFua0xpbmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjZiNmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTDsKLQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRYTUwgaW1wbGVtZW50cyBFbWJlZGRlZFR5cGVIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIExpc3Qgc3VwcG9ydGVkTWltZVR5cGVzOwotCXB1YmxpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9FbWJlZGRlZFhNTCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY29udGVudHR5cGUuRW1iZWRkZWRYTUwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRW1iZWRkZWRYTUwuCi0JICovCi0JcHVibGljIEVtYmVkZGVkWE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBFbWJlZGRlZENvbnRlbnRUeXBlI2dldEFkYXB0ZXJGYWN0b3JpZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgZmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTCgpKTsKLQkJLy8gZmFjdG9yaWVzLmFkZEFsbChQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3JpZXModGhpcykpOwotCQlyZXR1cm4gZmFjdG9yaWVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNnZXRGYW1pbHlJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGYW1pbHlJZCgpIHsKLQkJcmV0dXJuIE1vZGVsSGFuZGxlckZvclhNTC5Bc3NvY2lhdGVkQ29udGVudFR5cGVJRDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKSB7Ci0JCWlmIChzdXBwb3J0ZWRNaW1lVHlwZXMgPT0gbnVsbCkgewotCQkJc3VwcG9ydGVkTWltZVR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgiYXBwbGljYXRpb24veG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoInRleHQveG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGVkTWltZVR5cGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCS8vVE9ETzogaW5pdGlhbGl6ZQotCX0KLQotCS8qCi0JICogQHNlZSBFbWJlZGRlZENvbnRlbnRUeXBlI2luaXRpYWxpemVQYXJzZXIoUmVnaW9uUGFyc2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYXJzZXIoSlNQQ2FwYWJsZVBhcnNlciBwYXJzZXIpIHsKLQkJLy8gbm90aGluZyB0byBpbml0aWFsaXplIGZvciAicHVyZSIgWE1MCi0JCS8vIGNvbXBhcmUgd2l0aCBYSFRNTAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGVkWE1MKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQkvLyBUT0RPOiBuZWVkIHRvIHVuZG8gYW55dGhpbmcgd2UgZGlkIGluIGluaXRpYWxpemUKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcikgewotCQkvLyBuZWVkIHRvIHVuZG8gYW55dGhpbmcgd2UgZGlkIGluIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKS5jb250YWlucyhtaW1lVHlwZSk7Ci0JCWlmKCFjYW5IYW5kbGUpIHsKLQkJCWNhbkhhbmRsZSA9IG1pbWVUeXBlLmVuZHNXaXRoKCIreG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YmRmM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nLlhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudExvYWRlcjsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGdlbmVyaWMgWE1MIG1vZGVsIGhhbmRsaW5nLiBJdCBpcyBhbHNvIG1hcmtlZCBhcyB0aGUgZGVmYXVsdAotICogY29udGVudCB0eXBlIGhhbmRsZXIuIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIGRlZmF1bHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0Jc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJRCA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5lZWRzIHRvIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4gcmVnaXN0cnkuIEluIGZhY3QsIGNhbiBiZSBvdmVyd3JpdHRlbgotCSAqIGF0IHJ1biB0aW1lIHdpdGggd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyRm9yWE1MKCkgewotCQlzdXBlcigpOwkKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgWE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1hNTE1vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9YTUxNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y5MjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1hNTE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuRGVidWdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyBhbiBYTUwgZmlsZSBhbmQgY3JlYXRlcyBhbiBYTUwgU3RydWN0dXJlZCBNb2RlbC4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsTG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbExvYWRlciB7Ci0KLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSX0VOQ09ESU5HID0gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogWE1MTG9hZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhNTE1vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQkvLyBEb2VzIFhNTCBuZWVkIHByb3BhZ2F0aW5nIGFkYXB0ZXI/IE9yIGp1c3QgSlNQPwotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBYTUxEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBET01Nb2RlbEltcGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJc3VwZXIucHJlTG9hZEFkYXB0KHN0cnVjdHVyZWRNb2RlbCk7Ci0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCi0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cykgewotCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ldyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNWE5YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MIGV4dGVuZHMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTCgpIHsKLQkJc3VwZXIoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVEb2N1bWVudE1hbmFnZXIoQ01Eb2N1bWVudE1hbmFnZXIgbWdyKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZURvY3VtZW50TWFuYWdlcihtZ3IpOwotCQltZ3Iuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FTWU5DX0xPQUQsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBJU1NVRTogdGhpcyAiZm9yY2VzIiBhIG5ldyBvbmUgdG8gYWx3YXlzIGJlIGNyZWF0ZWQvcmV0dXJuZWQsIAotCSAqIG5vdCAiY2FjaGVkIiBvbiB0aGUgbm9kZS4gVGhhdCBzZWVtcyBpbmNvcnJlY3QuIAotCSAqIFNpbXBseSB1c2luZyBzaG91bGRSZWdpc3RlckZhbHNlIHNob3VsZCB3b3JrLCBleGNlcHQsIAotCSAqIHRoZXJlIG1pZ2h0IGhhdmUgYmVlbiBvbmUgdGhlcmUgdGhhdCBzb21lb25lIGVsc2UgYWxyZWFkeSAKLQkgKiBleHBsaWNpdGx5IHB1dCB0aGVyZSwgc28gdGhpcyBpcyBvbmx5IHdheSBJIGtub3cgdG8gCi0JICogb3ZlcnJpZGUgdGhhdC4gRXNwZWNpYWxseSBjb21wbGljYXRlZCBoZXJlIHNpbmNlIGEgbnVtYmVyCi0JICogb2YgYWRhcHRlcnMgYXJlIGZvciBNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcy4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBhZGFwdE5ldyhvYmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiNGFkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQlJU3RydWN0dXJlZE1vZGVsIHN0YXRlTm90aWZpZXIgPSBudWxsOwotCXByaXZhdGUgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MKCkgewotCQl0aGlzKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCWNsYXNzIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJCXN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJc3RhdGVOb3RpZmllciA9IG5ld01vZGVsOwotCQkJdXBkYXRlUmVzb2x2ZXIoc3RhdGVOb3RpZmllcik7Ci0JCQlzdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCXVwZGF0ZVJlc29sdmVyKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJfQotCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvTG9hZENNKCkgewotCQkvLyB1bnRpbCB0aGUgZXhpc3RlbmNlIG9mIGEgQ01Eb2N1bWVudFJlcXVlc3RlckZhY3RvcnkgdG8gY3JlYXRlIHRoZQotCQkvLyBsb2FkIHJlcXVlc3RzLAotCQkvLyByZXR1cm4gdHJ1ZQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVEb2N1bWVudE1hbmFnZXIoQ01Eb2N1bWVudE1hbmFnZXIgbWdyKSB7Ci0JCS8vIHRoaXMgZGVwZW5kcyBvbiB0aGVyZSBiZWluZyBhIENNRG9jdW1lbnRSZXF1ZXN0ZXJGYWN0b3J5IGluc3RhbGxlZAotCQltZ3Iuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FVVE9fTE9BRCwgYXV0b0xvYWRDTSgpKTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCi0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGlzcGxheUluZm8pCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmNyZWF0ZUFkYXB0ZXIiICsgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXJJbXBsID09IG51bGwpIHsKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIHRhcmdldDsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCXN0YXRlTm90aWZpZXIgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0KLQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlciByZXNvbHZlciA9IG1vZGVsLmdldFJlc29sdmVyKCk7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS1Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwuLi4gYmFzZUxvY2F0aW9uIDogIiArIHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCS8qKgotCQkJCSAqIFhNTENhdGFsb2dJZFJlc29sdmVyIGN1cnJlbnRseSByZXF1aXJlcyBhIGZpbGVzeXN0ZW0KLQkJCQkgKiBsb2NhdGlvbiBzdHJpbmcuIEN1c3RvbWFyaWx5IHRoaXMgd2lsbCBiZSB3aGF0IGlzIGluIHRoZQotCQkJCSAqIGRlcHJlY2F0ZWQgU1NFIFVSSVJlc29sdmVyIGFuZCByZXF1aXJlZCBieSB0aGUgQ29tbW9uIFVSSQotCQkJCSAqIFJlc29sdmVyLgotCQkJCSAqLwotCQkJCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0JCQkJCWlkUmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIocmVzb2x2ZXIuZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiAyMDM2NDkgLSB0aGlzIGJsb2NrIG1heSBiZSBuZWNlc3NhcnkgZHVlIHRvIG9yZGVyaW5nIG9mCi0JCQkJCSAqIHNldHRpbmcgdGhlIHJlc29sdmVyIGludG8gdGhlIG1vZGVsCi0JCQkJCSAqLwotCQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJCQkJU3RyaW5nIG1vZGVsc0Jhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCQlpZiAobW9kZWxzQmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBQYXRoKG1vZGVsc0Jhc2VMb2NhdGlvbikudG9GaWxlKCk7Ci0JCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlJUGF0aCBiYXNlUGF0aCA9IG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCQkJCQlJUmVzb3VyY2UgZGVyaXZlZFJlc291cmNlID0gbnVsbDsKLQkJCQkJCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCQkJCQkJCQlkZXJpdmVkUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJZGVyaXZlZFJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCQkJCQkJCUlQYXRoIGRlcml2ZWRQYXRoID0gZGVyaXZlZFJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJaWYgKGRlcml2ZWRQYXRoICE9IG51bGwpIHsKLQkJCQkJCQkJYmFzZUxvY2F0aW9uID0gZGVyaXZlZFBhdGgudG9TdHJpbmcoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCVVSSSB1cmkgPSBkZXJpdmVkUmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkJCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCQkJCQliYXNlTG9jYXRpb24gPSB1cmkudG9TdHJpbmcoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkJYmFzZUxvY2F0aW9uID0gbW9kZWxzQmFzZUxvY2F0aW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlkUmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBudWxsKTsKLQkJCQl9Ci0KLQkJCQlDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlID0gbmV3IENNRG9jdW1lbnRDYWNoZSgpOwotCQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IG5ldyBYTUxNb2RlbFF1ZXJ5SW1wbChjbURvY3VtZW50Q2FjaGUsIGlkUmVzb2x2ZXIpOwotCi0JCQkJLy8gY3MgdG9kby4uLgotCQkJCS8vIGZvciBub3cgd2UgY3JlYXRlIGEgQ01Eb2N1bWVudENhY2hlIG9uIGEgJ3BlciBlZGl0b3InIGJhc2lzCi0JCQkJLy8gaW4gdGhlIGZ1dHVyZSB3ZSBuZWVkIHRvIHN1cHBvcnQgYSBDTURvY3VtZW50Q2FjaGUgdGhhdCBpcwotCQkJCS8vIHNoYXJlZCBiZXR3ZWVuIGVkaXRvcnMKLQkJCQkvLyBuc2QgY29tbWVudDogbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSBkZXBlbmRpbmcgb24KLQkJCQlDTURvY3VtZW50TWFuYWdlciBkb2N1bWVudE1hbmFnZXIgPSBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCWNvbmZpZ3VyZURvY3VtZW50TWFuYWdlcihkb2N1bWVudE1hbmFnZXIpOwotCQkJCX0KLQkJCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwgPSBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKGNtRG9jdW1lbnRDYWNoZSwgbW9kZWxRdWVyeSwgaWRSZXNvbHZlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWlmIChzdGF0ZU5vdGlmaWVyICE9IG51bGwpCi0JCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpKTsKLQkJc3RhdGVOb3RpZmllciA9IG51bGw7Ci0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlckltcGwgIT0gbnVsbCkKLQkJCW1vZGVsUXVlcnlBZGFwdGVySW1wbC5yZWxlYXNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb2x2ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCi0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUZpbGUgYmFzZUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCWlmIChiYXNlRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoYmFzZUxvY2F0aW9uID09IG51bGwgJiYgYmFzZUZpbGUuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJbW9kZWxRdWVyeUFkYXB0ZXJJbXBsLnNldElkUmVzb2x2ZXIobmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbW9kZWwuZ2V0UmVzb2x2ZXIoKSkpOwotCX0KLQotCXByaXZhdGUgZmluYWwgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCWlmIChpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWUzZTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGFzc29jaWF0ZSBNb2RlbFF1ZXJ5IChhbmQgcmVsYXRlZCBkYXRhKSB3aXRoIGEKLSAqIERvY3VtZW50IChvciBJU3RydWN0dXJlZE1vZGVsKS4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZShEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0Q01Eb2N1bWVudENhY2hlKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJUmVzb2x2ZXIgZ2V0SWRSZXNvbHZlcihEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0SWRSZXNvbHZlcigpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsID8gbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmICgoIShtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHx8IG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldE1vZGVsUXVlcnkoKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1vZGVsUXVlcnlBZGFwdGVyIGdldE1vZGVsUXVlcnlBZGFwdGVyKERvY3VtZW50IG5vZGUpIHsKLQkJTW9kZWxRdWVyeUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQkJCXJlc3VsdCA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxDYXRhbG9nSWRSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTENhdGFsb2dJZFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODUyZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTENhdGFsb2dJZFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0vLyBUT0RPIGNzIDogcmVtb3ZlIHRoaXMgY2xhc3MgYW5kIHV0aWxpemUgdGhlIGNvbW1vbiBVUklSZXNvbHZlciBkaXJlY3RseQotLy8gV2UgbmVlZCB0byB1cGRhdGUgc29tZSBvZiB0aGUgTW9kZWxRdWVyeSByZWxhdGVkIGNvZGUgdG8gcGFzcyB0aGUKLS8vICdiYXNlTG9jYXRpb24nIHRocnUKLS8vIGFuZCB0aGVuIHRoZXJlJ2xsIGJlIG5vZGUgbmVlZCBmb3IgdGhpcyBjbGFzcy4KLS8vIAotcHVibGljIGNsYXNzIFhNTENhdGFsb2dJZFJlc29sdmVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlciB7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uOwotCi0JcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaXJlc29sdmVyOwotCi0JcHJpdmF0ZSBYTUxDYXRhbG9nSWRSZXNvbHZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFhNTENhdGFsb2dJZFJlc29sdmVyKFN0cmluZyByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoU3RyaW5nIHJlc291cmNlTG9jYXRpb24sIFVSSVJlc29sdmVyIHVyaXJlc29sdmVyKSB7Ci0JCXRoaXMocmVzb3VyY2VMb2NhdGlvbik7Ci0vLyB0aGlzIGNvbnN0cnVjdG9yIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggdHdvIG51bGwgYXJndW1lbnRzLgotLy8gSWYgc28sIGFuIGFzc2VydCB3aWxsIG9jY3VyIGxhdGVyIHdoZW4gcmVzb2x2ZSBpcyBjYWxsZWQuIAotLy8gU2VlIDExODM3MSBYTUxDYXRhbG9nSWRSZXNvbHZlciNyZXNvbHZlIHRocm93cyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24KLS8vCi0vLyBidXQsIEknbSBub3QgZW5hYmxpbmcgdGhpcyBjaGVjayBub3cgZHVlIHRvIGxhdGVuZXNzIGluIGN5Y2xlLiAJCQotLy8JCWlmIChyZXNvdXJjZUxvY2F0aW9uID09IG51bGwgJiYgdXJpcmVzb2x2ZXIgPT0gbnVsbCkgewotLy8JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJib3RoIGxvY2F0aW9uIGFuZCByZXNvbHZlciBjYW4gbm90IGJlIG51bGwiKTsKLS8vCQl9Ci0JCXRoaXMudXJpcmVzb2x2ZXIgPSB1cmlyZXNvbHZlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlTG9jYXRpb24uCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VMb2NhdGlvbigpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCWlmICh1cmlyZXNvbHZlciAhPSBudWxsKQotCQkJCWxvY2F0aW9uID0gdXJpcmVzb2x2ZXIuZ2V0RmlsZUJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShTdHJpbmcgYmFzZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQotCQlTdHJpbmcgcmVzdWx0ID0gc3lzdGVtSWQ7Ci0JCWlmIChiYXNlID09IG51bGwpIHsKLQkJCWJhc2UgPSBnZXRSZXNvdXJjZUxvY2F0aW9uKCk7Ci0JCQkvLyBidWcgMTE3MzIwLCBlbnN1cmUgYmFzZSBVUkkgaXMgJ3Byb3RvY2FsJyBxdWFsaWZpZWQgYmVmb3JlCi0JCQkvLyBwYXNzaW5nIGl0IHRocnUgdG8gVVJJUmVzb2x2ZXIKLQkJCS8vIGJ1ZyAxMTc0MjQsIHdlIHNob3VsZCBiZSBhYmxlIHRvIGFzc3VtZSB0aGF0IHRoZSBiYXNlIGxvY2F0aW9uCi0JCQkvLyBpcyBub24tbnVsbAotCi0JCQkvKioKLQkJCSAqIFdlIHNob3VsZG4ndCBhc3NlcnQgYSBmYWlsdXJlIGJlY2F1c2UgdGhlIGNhdGFsb2cgZG9lcyBub3QKLQkJCSAqIHJlcXVpcmUgYSBiYXNlIGxvY2F0aW9uIHRvIG9wZXJhdGUgYW5kIGl0IHdpbGwgYmUgY2FsbGVkIGZyb20KLQkJCSAqIG5vbi1maWxlLWJhc2VkIHNjZW5hcmlvcy4KLQkJCSAqIAotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjE3NgotCQkJICovCi0JCQkvLyBBc3NlcnQuaXNOb3ROdWxsKGJhc2UsICJCYXNlIGxvY2F0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIG5vbiBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJYmFzZSA9IFVSSUhlbHBlci5hZGRJbXBsaWVkRmlsZVByb3RvY29sKGJhc2UpOwotCQkJfQotCQl9Ci0JCXJlc3VsdCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgbG9naWNhbExvY2F0aW9uKSB7Ci0JCS8vIFRoaXMgY2xhc3Mgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB0byBwZXJmb3JtIHBoeXNpY2FsIHJlc29sdXRpb24hCi0JCS8vIElmIGl0IGRvZXMgd2Ugc2hvdWxkIGxvZyBpdCBhcyBhbiBlcnJvcgotCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgIlhNTENhdGFsb2dJRFJlc29sdmVyLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKCkgY2FsbGVkIHVuZXhwZWN0ZWRseSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBsb2dpY2FsTG9jYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkMTRhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuWE1MQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyCi0gKiAKLSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdCB3aWxsCi0gKiBjaGFuZ2UgYXMgdGhpcyBmdW5jdGlvbmFsaXR5IGJlY29tZXMgQVBJLiBTZWUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkwODQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxBc3NvY2lhdGlvblByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBVUklSZXNvbHZlciBpZFJlc29sdmVyOwotCi0JcHVibGljIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlzdXBlcihjYWNoZSk7Ci0JCXRoaXMuaWRSZXNvbHZlciA9IGlkUmVzb2x2ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlR3JhbW1hclVSSShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQotCQkvLyBDUyA6IHNwb29reSBjb2RlIGFsZXJ0IQotCQkvLyB0aGlzIGxvb2sgcmVhbGx5IHN0cmFuZ2UgYmVjYXVzZSB3ZSdyZSBwYXNzaW5nIG51bGwgaW4gYXMgdGhlIGZpcnN0Ci0JCS8vIGFyZ3VtZW50Ci0JCS8vIGhvd2V2ZXIgd2UncmUgYXNzdW1pbmcgdGhlIHVzZSBvZiBhICdmdWRnZWQnIFVSSVJlc29sdmVyIHRoYXQga25vd3MKLQkJLy8gdGhlCi0JCS8vIGNvcnJlY3QgYmFzZUxvY2F0aW9uIGFuZCB3aWxsIGNhbGwgdG8gdGhlIFVSSVJlc29sdmVyIGZyYW1ld29yawotCQkvLyBwcm9wZXJseQotCi0JCS8vIENTIDogbm90ZSB0aGF0IHdlIHNob3VsZCBuZXZlciBjYWxsIHJlc29sdmVQaHlzaWNhbCBhdCB0aGlzIHBvaW50LgotCQkvLyBQaHlzaWNhbCByZXNvbHV0aW9uIHNob3VsZCBvbmx5IG9jY3VyIHdoZW4gd2UncmUgaW50ZXJlc3RpbmcgdG8KLQkJLy8gb3BlbmluZyB0aGUgYWN0dWFsIHN0cmVhbS4KLQkJLy8gVGhlIENNRG9jdW1lbnRGYWN0b3J5IGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIHJlc3BvbnNpYmxlIGZvcgotCQkvLyBjYWxsaW5nIHJlc29sdmVQaHlzaWNhbC4KLQkJLy8gQWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyByZXR1cm4gYSAnbG9naWNhbCcgVVJJCi0KLQkJaWYgKGlkUmVzb2x2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaWRSZXNvbHZlci5yZXNvbHZlKG51bGwsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmYTAwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuTW9kZWxRdWVyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb3ZhYmxlTW9kZWxRdWVyeTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxRdWVyeUltcGwgZXh0ZW5kcyBNb2RlbFF1ZXJ5SW1wbCBpbXBsZW1lbnRzIE1vdmFibGVNb2RlbFF1ZXJ5IHsKLQotCXByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgZkNhY2hlID0gbnVsbDsKLQotCXB1YmxpYyBYTUxNb2RlbFF1ZXJ5SW1wbChDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIobmV3IFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKSk7Ci0JCWZDYWNoZSA9IGNhY2hlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW92YWJsZU1vZGVsUXVlcnkjc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpIHsKLQkJbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgPSBuZXcgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoZkNhY2hlLCBuZXdJZFJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9CbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1NGE4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9CbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIEJsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW1wbGVtZW50cyBJQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXJ0aXRpb25UeXBlOwotCi0JLyoqCi0JICogQSBCbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBsaWtlIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkgKiBidXQgaXMgdGhlIHJlc3VsdCBvZiBhICJibG9jayBzY2FuIi4KLQkgKi8KLQlwdWJsaWMgQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKCkgewotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQkvLyBldmVudHVhbGx5IGNhbiBsb29rIHVwIHN1cnJvdW5kaW5nVGFnIG5hbWUKLQkJCS8vIGJ1dCB0aGlzIGZpZWxkIGlzIHByaW1hcmlseSBlbnRlbmRlZCBmb3IgZnV0dXJlCi0JCQkvLyBleHRlbnNpYmlsaXR5LiBUaGlzIG1heSBjaGFuZ2UuCi0JCQkvL3BhcnRpdGlvblR5cGUgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLiIgKyB0YWduYW1lOwotCQl9Ci0JCXJldHVybiBwYXJ0aXRpb25UeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvblR5cGUoU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJdGhpcy5wYXJ0aXRpb25UeXBlID0gcGFydGl0aW9uVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9Db250ZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExM2Y4MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElUZXh0UmVnaW9uQ29udGFpbmVyIHsKLQlwcm90ZWN0ZWQgaW50IGxlbmd0aDsKLQlwcm90ZWN0ZWQgSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudDsKLQlwcm90ZWN0ZWQgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnM7Ci0JcHJvdGVjdGVkIGludCBzdGFydDsKLQlwcm90ZWN0ZWQgaW50IHRleHRMZW5ndGg7Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCi0JcHVibGljIENvbnRleHRSZWdpb25Db250YWluZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiB0aGVzZSAiZGVlcCIgcGFyZW50aW5nIGlzIG5vdCBub3JtYWwsIGJ1dCBqdXN0IGluIGNhc2UuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IF9nZXRQYXJlbnREb2N1bWVudCgpIHsKLQkJLy8gZ28gdXAgZW5vdWdoIHBhcmVudHMgdG8gZ2V0IHRvIGRvY3VtZW50Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCS8vIHdvdWxkIGJlIGFuIGVycm9yIG5vdCB0byBiZSBjb250YWluZXIsIGJ1dAotCQkJLy8gd29uJ3QgY2hlY2sgZm9yIGl0IG5vdwotCQkJcGFyZW50ID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gKChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBwYXJlbnQpLmdldFBhcmVudERvY3VtZW50KCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQotCQlzdGFydCArPSBpOwotCQkvLyBJIGVycm9uZW91c2x5IGFkZGVkIGxlbmd0aCBhbmQgdGV4dExlbmd0aAotCQkvLyBUT0RPOiBtYXkgd2FudCB0byByZW5hbWUgdGhpcyBtZXRob2QgdG8gYWRqdXN0U3RhcnQKLQkJLy9sZW5ndGggKz0gaTsKLQkJLy90ZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJbGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJc3RhcnQgKz0gaTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IGkpIHsKLQotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSA8PSBpICYmIGkgPCBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbikgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGdldEVuZE9mZnNldChjb250YWluZWRSZWdpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gZXF1YXRlIHBvc2l0aW9ucy4gY2xpZW50cyBtYXkgKHdpbGwgcHJvYmFibHkpCi0JICogc3RpbGwgbmVlZCB0byBtYWtlIGNhbGxzIHRvIGVxdWF0ZSByZWdpb25zLCBwYXJlbnQsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJdGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBzdGFydCArIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJLy8gb3VyIHN0YXJ0T2Zmc2V0IHRha2UgaW50byBhY2NvdW50IG91ciBwYXJlbnQsIGFuZCBvdXIgc3RhcnQKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgKyBnZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbikgKyBjb250YWluZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9ucygpLmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0RnVsbFRleHQodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCS8vIE11c3QgYmUgcHJveGllZCBoZXJlIHNpbmNlIGFSZWdpb24gc2hvdWxkIGFsd2F5cyBiZSBhIGNoaWxkIG9mCi0JCS8vICp0aGlzKiBjb250YWluZXIgYW5kIGluZGV4ZWQgZnJvbQotCQkvLyB0aGlzIGNvbnRhaW5lcidzIG9mZnNldAotCQlyZXR1cm4gcGFyZW50LmdldEZ1bGxUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0ICsgYVJlZ2lvbi5nZXRTdGFydCgpLCBzdGFydCArIGFSZWdpb24uZ2V0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9ucygpLmdldChnZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mUmVnaW9ucygpIHsKLQkJcmV0dXJuIGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcmFtZXRlciBvZmZzZXQgcmVmZXJzIHRvIHRoZSBvdmVyYWxsIG9mZnNldCBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJLy8gdHJhbnNmb3JtIHRoZSByZXF1ZXN0ZWQgb2Zmc2V0IHRvIHRoZSAic2NhbGUiIHRoYXQKLQkJCS8vIHJlZ2lvbnMgYXJlIHN0b3JlZCBpbiwgd2hpY2ggYXJlIGFsbCByZWxhdGl2ZSB0byB0aGUKLQkJCS8vIHN0YXJ0IHBvaW50LgotCQkJLy9pbnQgdHJhbnNmb3JtZWRPZmZzZXQgPSBvZmZzZXQgLSBnZXRTdGFydE9mZnNldCgpOwotCQkJLy8KLQkJCWludCBsZW5ndGggPSBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVnaW9uKHMpIGluIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb246OmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0OiAiICsgcmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZXF1ZXN0ZWQgb2Zmc2V0OiAiICsgb2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiIHRyYW5zZm9ybWVkT2Zmc2V0OiAiICsKLQkJCQkJLy8gdHJhbnNmb3JtZWRPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBzdGFydDogIiArIHJlZ2lvbi5nZXRTdGFydCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gZW5kOiAiICsgcmVnaW9uLmdldEVuZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gdHlwZTogIiArIHJlZ2lvbi5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBjbGFzczogIiArIHJlZ2lvbi5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfQotCQkJCWlmICgoZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8PSBvZmZzZXQpICYmIChvZmZzZXQgPCBnZXRFbmRPZmZzZXQocmVnaW9uKSkpIHsKLQkJCQkJcmVzdWx0ID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXJldHVybiByZWdpb25zOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0U3RhcnRPZmZzZXQoKSArIGdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJLy8gaXQgaXMgYW4gZXJyb3IgdG8gcGFzcyBudWxsIHRvIHRoaXMgbWV0aG9kCi0JCS8vIElTU1VFOiBuZWVkIGJldHRlciAic3BlYyIgb24gZXJyb3IgYmVoYXZpb3I6IAotCQkvLyBmb3Igbm93IHdpbGwgcmV0dXJuIHplcm8gYXMgdGhpcyB3aWxsIHJvdWdobHkgCi0JCS8vIHdvcmsgZm9yIHNvbWUgY2FzZXMgKGFuZCBhdm9pZCBOUEUpLgotCQlpZiAoY29udGFpbmVkUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgY29udGFpbmVkUmVnaW9uLmdldFN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogc2FtZSBhcyBnZXRGdWxsVGV4dCBmb3IgdGhpcyByZWdpb24gdHlwZSAuLi4gZG8gd2UgbmVlZCB0byB0YWtlIHdoaXRlCi0JICogc3BhY2Ugb2ZmPwotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcGFyZW50RG9jdW1lbnQgPSBfZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCXJlc3VsdCA9IHBhcmVudERvY3VtZW50LmdldChzdGFydCwgbGVuZ3RoKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvZ3JhbSBlcnJvcjogdW5yZWFjaGFibGUgZXhjZXB0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCS8vIE11c3QgYmUgcHJveGllZCBoZXJlIHNpbmNlIGFSZWdpb24gc2hvdWxkIGFsd2F5cyBiZSBhIGNoaWxkIG9mCi0JCS8vICp0aGlzKiBjb250YWluZXIgYW5kIGluZGV4ZWQgZnJvbQotCQkvLyB0aGlzIGNvbnRhaW5lcidzIG9mZnNldAotCQlyZXR1cm4gcGFyZW50LmdldFRleHQoKS5zdWJzdHJpbmcoc3RhcnQgKyBhUmVnaW9uLmdldFN0YXJ0KCksIHN0YXJ0ICsgYVJlZ2lvbi5nZXRUZXh0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIHN0YXJ0ICsgdGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCS8vIG91ciBzdGFydE9mZnNldCB0YWtlIGludG8gYWNjb3VudCBvdXIgcGFyZW50LCBhbmQgb3VyIHN0YXJ0Ci0JCS8vIChwYSkgMTAvNCBjaGFuZ2VkIHRvIGJlIGJhc2VkIG9uIHRleHQgZW5kCi0JCS8vICAgICAgICAgICBpdCB1c2VkIHRvIHJldHVybiBpbmNvcnJlY3QgdmFsdWUgZm9yIGVtYmVkZGVkIHJlZ2lvbiBjb250YWluZXJzCi0JCS8vCi0KLQkJLy8gVE9ETyBDUklUSUNBTCAtLSBuZWVkIHRvIHJlLXdvcmsgdGhpcyB3b3JrIGFyb3VuZCwgc28gZG9lc24ndAotCQkvLyBkZXBlbmQgb24gWE1MUmVnaW9uQ29udGV4dAotCQkvLwkJLy8gdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIDIyNjgyMy8vLy8vLy8vLy8vCi0JCS8vCQlmb3IgKGludCBpID0gcmVnaW9ucy5zaXplKCkgLSAxOyBpID49IDAgJiYgcmVnaW9uLmdldFR5cGUoKSA9PQotCQkvLyBYTUxSZWdpb25Db250ZXh0LldISVRFX1NQQUNFOyBpLS0pCi0JCS8vCQkJcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKTsKLQkJLy8JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFRleHRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpZiAocmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkJCWlmIChyZWdpb24gPT0gY29udGFpbmVkUmVnaW9uKSB7Ci0JCQkJCXJlc3VsdCA9IGdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgKyByZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiB0ZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBpKSB7Ci0JCWxlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KElUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnRSZWdpb24pIHsKLQkJcGFyZW50ID0gcGFyZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGNvbnRhaW5lZFJlZ2lvbnMpIHsKLQkJcmVnaW9ucyA9IGNvbnRhaW5lZFJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IGkpIHsKLQkJc3RhcnQgPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGV4dExlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXR5cGUgPSBzdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9ICJDb250YWluZXIhISEgIiArIHNob3J0Q2xhc3NOYW1lICsgIi0tPiAiICsgZ2V0VHlwZSgpICsgIjogIiArIGdldFN0YXJ0KCkgKyAiLSIgKyBnZXRUZXh0RW5kKCkgKyAoZ2V0VGV4dEVuZCgpICE9IGdldEVuZCgpID8gKCIvIiArIGdldEVuZCgpKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBGVVRVUkVfVE9fRE86IG5lZWQgdG8gaW1wbGVtZW50IHJlZ2lvbiBsZXZlbCBwYXJzaW5nIGluCi0JCS8vIElUZXh0UmVnaW9uQ29udGFpbmVyOjp1cGRhdGVNb2RlbAotCQkvLyBuZXZlciBiZWluZyBjYWxsZWQ/Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3MTU0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QubGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1JlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1JlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxNWE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9SZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci0KLQotcHVibGljIGNsYXNzIFJlZ2lvbkZhY3RvcnkgewotCi0JcHVibGljIFJlZ2lvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4ocGFyZW50LCBjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oSVRleHRSZWdpb25Db250YWluZXIgcGFyZW50LCBTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIGxhbmcsIFN0cmluZyBzdXJyb3VuZGluZ1RhZykgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBjcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJLy9uZXdSZWdpb24uc2V0UGFyZW50KHBhcmVudCk7Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIGxhbmcsIFN0cmluZyBzdXJyb3VuZGluZ1RhZykgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBuZXcgQ29udGV4dFJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MMTBOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MMTBOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjkxYzYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTDEwTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NSArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQgb24gMi8yNS8wOCAxMDoyNSBBTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDggSUJNIENvcnBvcmF0aW9uLCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAga2IuaHVhbmcgIC0gQnVnIDIxNDQxNiAgRG90IGNoYXIgaXMgbm90IGVzY2FwZWQgaW4gWE1MMTBOYW1lcy5qRmxleAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS8iPkpGbGV4PC9hPiAxLjQKLSAqIG9uIDIvMjUvMDggMTA6MjUgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+WE1MMTBOYW1lcy5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUwxME5hbWVzIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfQlVGRkVSU0laRSA9IDIwNDg7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDEyXDBcMVwzXDQyXDBcMVwyXDFcMlwxXDBcMTJcMlwxXDFcNlwwXDMyXDEiKwotICAgICJcNFwwXDFcMVwxXDBcMzJcMVw3NFwwXDFcMlwxMFwwXDI3XDFcMVwwXDM3XDEiKwotICAgICJcMVwwXDcyXDFcMlwwXDEzXDFcMlwwXDEwXDFcMVwwXDY1XDFcMVwwXDEwNFwxIisKLSAgICAiXDExXDBcNDRcMVwzXDBcMlwxXDRcMFwzNlwxXDcwXDBcMTMxXDFcMjJcMFw3XDEiKwotICAgICJcMTZcMFwyXDJcNTZcMFwxMDZcMlwzMlwwXDJcMlw0NFwwXDFcMVwxXDJcM1wxIisKLSAgICAiXDFcMFwxXDFcMVwwXDI0XDFcMVwwXDU0XDFcMVwwXDdcMVwzXDBcMVwxIisKLSAgICAiXDFcMFwxXDFcMVwwXDFcMVwxXDBcMVwxXDFcMFwyMlwxXDE1XDBcMTRcMSIrCi0gICAgIlwxXDBcMTAyXDFcMVwwXDE0XDFcMVwwXDQ0XDFcMVwwXDRcMlwxMVwwXDY1XDEiKwotICAgICJcMlwwXDJcMVwyXDBcMlwxXDNcMFwzNFwxXDJcMFwxMFwxXDJcMFwyXDEiKwotICAgICJcNjdcMFw0NlwxXDJcMFwxXDFcN1wwXDQ2XDFcMTJcMFwyMVwyXDFcMFwyN1wyIisKLSAgICAiXDFcMFwzXDJcMVwwXDFcMlwxXDBcMlwyXDFcMFwxXDJcMTNcMFwzM1wxIisKLSAgICAiXDVcMFwzXDFcNTZcMFwzMlwxXDVcMFwxXDJcMTJcMVwxMFwyXDE1XDBcMTJcMiIrCi0gICAgIlw2XDBcMVwyXDEwN1wxXDJcMFw1XDFcMVwwXDE3XDFcMVwwXDRcMVwxXDAiKwotICAgICJcMVwxXDE3XDJcMlwxXDJcMlwxXDBcNFwyXDJcMFwxMlwyXHUwMjA3XDBcM1wyIisKLSAgICAiXDFcMFw2NVwxXDJcMFwxXDJcMVwxXDIwXDJcM1wwXDRcMlwzXDBcMTJcMSIrCi0gICAgIlwyXDJcMlwwXDEyXDJcMjFcMFwzXDJcMVwwXDEwXDFcMlwwXDJcMVwyXDAiKwotICAgICJcMjZcMVwxXDBcN1wxXDFcMFwxXDFcM1wwXDRcMVwyXDBcMVwyXDFcMCIrCi0gICAgIlw3XDJcMlwwXDJcMlwyXDBcM1wyXDExXDBcMVwyXDRcMFwyXDFcMVwwIisKLSAgICAiXDNcMVwyXDJcMlwwXDEyXDJcMlwxXDIwXDBcMVwyXDJcMFw2XDFcNFwwIisKLSAgICAiXDJcMVwyXDBcMjZcMVwxXDBcN1wxXDFcMFwyXDFcMVwwXDJcMVwxXDAiKwotICAgICJcMlwxXDJcMFwxXDJcMVwwXDVcMlw0XDBcMlwyXDJcMFwzXDJcMTNcMCIrCi0gICAgIlw0XDFcMVwwXDFcMVw3XDBcMTJcMlwyXDJcM1wxXDE0XDBcM1wyXDFcMCIrCi0gICAgIlw3XDFcMVwwXDFcMVwxXDBcM1wxXDFcMFwyNlwxXDFcMFw3XDFcMVwwIisKLSAgICAiXDJcMVwxXDBcNVwxXDJcMFwxXDJcMVwxXDEwXDJcMVwwXDNcMlwxXDAiKwotICAgICJcM1wyXDIyXDBcMVwxXDVcMFwxMlwyXDIxXDBcM1wyXDFcMFwxMFwxXDJcMCIrCi0gICAgIlwyXDFcMlwwXDI2XDFcMVwwXDdcMVwxXDBcMlwxXDJcMFw0XDFcMlwwIisKLSAgICAiXDFcMlwxXDFcNlwyXDNcMFwyXDJcMlwwXDNcMlwxMFwwXDJcMlw0XDAiKwotICAgICJcMlwxXDFcMFwzXDFcNFwwXDEyXDJcMjJcMFwyXDJcMVwwXDZcMVwzXDAiKwotICAgICJcM1wxXDFcMFw0XDFcM1wwXDJcMVwxXDBcMVwxXDFcMFwyXDFcM1wwIisKLSAgICAiXDJcMVwzXDBcM1wxXDNcMFwxMFwxXDFcMFwzXDFcNFwwXDVcMlwzXDAiKwotICAgICJcM1wyXDFcMFw0XDJcMTFcMFwxXDJcMTdcMFwxMVwyXDIxXDBcM1wyXDFcMCIrCi0gICAgIlwxMFwxXDFcMFwzXDFcMVwwXDI3XDFcMVwwXDEyXDFcMVwwXDVcMVw0XDAiKwotICAgICJcN1wyXDFcMFwzXDJcMVwwXDRcMlw3XDBcMlwyXDExXDBcMlwxXDRcMCIrCi0gICAgIlwxMlwyXDIyXDBcMlwyXDFcMFwxMFwxXDFcMFwzXDFcMVwwXDI3XDFcMVwwIisKLSAgICAiXDEyXDFcMVwwXDVcMVw0XDBcN1wyXDFcMFwzXDJcMVwwXDRcMlw3XDAiKwotICAgICJcMlwyXDdcMFwxXDFcMVwwXDJcMVw0XDBcMTJcMlwyMlwwXDJcMlwxXDAiKwotICAgICJcMTBcMVwxXDBcM1wxXDFcMFwyN1wxXDFcMFwyMFwxXDRcMFw2XDJcMlwwIisKLSAgICAiXDNcMlwxXDBcNFwyXDExXDBcMVwyXDEwXDBcMlwxXDRcMFwxMlwyXDIyMVwwIisKLSAgICAiXDU2XDFcMVwwXDFcMVwxXDJcMlwxXDdcMlw1XDBcNlwxXDFcMlwxMFwyIisKLSAgICAiXDFcMFwxMlwyXDQ3XDBcMlwxXDFcMFwxXDFcMlwwXDJcMVwxXDBcMVwxIisKLSAgICAiXDJcMFwxXDFcNlwwXDRcMVwxXDBcN1wxXDFcMFwzXDFcMVwwXDFcMSIrCi0gICAgIlwxXDBcMVwxXDJcMFwyXDFcMVwwXDJcMVwxXDBcMVwxXDFcMlwyXDEiKwotICAgICJcNlwyXDFcMFwyXDJcMVwxXDJcMFw1XDFcMVwwXDFcMlwxXDBcNlwyIisKLSAgICAiXDJcMFwxMlwyXDc2XDBcMlwyXDZcMFwxMlwyXDEzXDBcMVwyXDFcMFwxXDIiKwotICAgICJcMVwwXDFcMlw0XDBcMlwyXDEwXDFcMVwwXDQxXDFcN1wwXDI0XDJcMVwwIisKLSAgICAiXDZcMlw0XDBcNlwyXDFcMFwxXDJcMVwwXDI1XDJcM1wwXDdcMlwxXDAiKwotICAgICJcMVwyXDM0NlwwXDQ2XDFcMTJcMFw0N1wxXDExXDBcMVwxXDFcMFwyXDFcMVwwIisKLSAgICAiXDNcMVwxXDBcMVwxXDFcMFwyXDFcMVwwXDVcMVw1MVwwXDFcMVwxXDAiKwotICAgICJcMVwxXDFcMFwxXDFcMTNcMFwxXDFcMVwwXDFcMVwxXDBcMVwxXDNcMCIrCi0gICAgIlwyXDFcM1wwXDFcMVw1XDBcM1wxXDFcMFwxXDFcMVwwXDFcMVwxXDAiKwotICAgICJcMVwxXDFcMFwxXDFcM1wwXDJcMVwzXDBcMlwxXDFcMFwxXDFcNTBcMCIrCi0gICAgIlwxXDFcMTFcMFwxXDFcMlwwXDFcMVwyXDBcMlwxXDdcMFwyXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcN1wxXDUwXDBcMVwxXDRcMFwxXDFcMTBcMFwxXDFcdTBjMDZcMCIrCi0gICAgIlwyMzRcMVw0XDBcMTMyXDFcNlwwXDI2XDFcMlwwXDZcMVwyXDBcNDZcMVwyXDAiKwotICAgICJcNlwxXDJcMFwxMFwxXDFcMFwxXDFcMVwwXDFcMVwxXDBcMVwxXDFcMCIrCi0gICAgIlwzN1wxXDJcMFw2NVwxXDFcMFw3XDFcMVwwXDFcMVwzXDBcM1wxXDFcMCIrCi0gICAgIlw3XDFcM1wwXDRcMVwyXDBcNlwxXDRcMFwxNVwxXDVcMFwzXDFcMVwwIisKLSAgICAiXDdcMVwzMjNcMFwxNVwyXDRcMFwxXDJcMTA0XDBcMVwxXDNcMFwyXDFcMlwwIisKLSAgICAiXDFcMVwxMjFcMFwzXDFcdTBlODJcMFwxXDJcMVwwXDFcMVwzMVwwXDExXDFcNlwyIisKLSAgICAiXDFcMFw1XDJcMTNcMFwxMjRcMVw0XDBcMlwyXDJcMFwyXDJcMlwwXDEzMlwxIisKLSAgICAiXDFcMFwzXDJcNlwwXDUwXDFcdTFjZDNcMFx1NTFhNlwxXHUwYzVhXDBcdTJiYTRcMVx1Mjg1Y1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcMVwwXDFcMVwxXDJcMVwzIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBY3Rpb24oWlpfQUNUSU9OX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0FjdGlvbihTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX1JPV01BUCA9IHp6VW5wYWNrUm93TWFwKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX1JPV01BUF9QQUNLRURfMCA9Ci0gICAgIlwwXDBcMFw0XDBcMTBcMFwxNCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrUm93TWFwKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrUm93TWFwKFpaX1JPV01BUF9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tSb3dNYXAoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGhpZ2ggPSBwYWNrZWQuY2hhckF0KGkrKykgPDwgMTY7Ci0gICAgICByZXN1bHRbaisrXSA9IGhpZ2ggfCBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVFJBTlMgW10gPSB7Ci0gICAgMSwgMiwgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAzLCAyLCAKLSAgICAyLCAtMSwgMywgMywgMywgLTEKLSAgfTsKLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9OT19NQVRDSCA9IDE7Ci0vLyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1BVU0hCQUNLXzJCSUcgPSAyOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKioKLSAgICogWlpfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FUVFJJQlVURSA9IHp6VW5wYWNrQXR0cmlidXRlKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FUVFJJQlVURV9QQUNLRURfMCA9Ci0gICAgIlwxXDBcMVwxMVwyXDEiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0F0dHJpYnV0ZSgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0F0dHJpYnV0ZShaWl9BVFRSSUJVVEVfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQXR0cmlidXRlKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHp6UmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHp6U3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgenpCdWZmZXJbXSA9IG5ldyBjaGFyW1paX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ek1hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgenpQdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6Q3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6U3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgenpFbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotLy8gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0vLyAgcHJpdmF0ZSBpbnQgeXljb2x1bW47Ci0KLSAgLyoqIAotICAgKiB6ekF0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLS8vICBwcml2YXRlIGJvb2xlYW4genpBdEJPTCA9IHRydWU7Ci0KLSAgLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0OwotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgWE1MMTBOYW1lcygpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnp6UmVhZGVyID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHl5cmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHN0cmluZ1RvQ2hlY2spKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSB3aXRoIHN0cmluZ3MsIGJ1dCBpZiBvY2N1cnMsIGp1c3QgbWVhbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJub3QiCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MMTBOYW1lcyhqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTDEwTmFtZXMoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTIxOCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6UHVzaGJhY2tQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotLy8gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLS8vICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLS8vCi0vLyAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLS8vICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLS8vICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0vLyAgICB6ekF0Qk9MICA9IHRydWU7Ci0gICAgenpBdEVPRiAgPSBmYWxzZTsKLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zID0gMDsKLS8vICAgIHl5bGluZSA9IHl5Y2hhciA9IHl5Y29sdW1uID0gMDsKLSAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCBpbnQgeXlzdGF0ZSgpIHsKLS8vICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLS8vICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLS8vICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLS8vICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotLy8gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCBpbnQgeXlsZW5ndGgoKSB7Ci0vLyAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1taWl9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLS8vICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSAgewotLy8gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLS8vICAgICAgenpTY2FuRXJyb3IoWlpfUFVTSEJBQ0tfMkJJRyk7Ci0vLwotLy8gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLSAgICBpbnQgW10genpUcmFuc0wgPSBaWl9UUkFOUzsKLSAgICBpbnQgW10genpSb3dNYXBMID0gWlpfUk9XTUFQOwotICAgIGludCBbXSB6ekF0dHJMID0gWlpfQVRUUklCVVRFOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCi0gICAgICB6ekFjdGlvbiA9IC0xOwotCi0gICAgICB6ekN1cnJlbnRQb3NMID0genpDdXJyZW50UG9zID0genpTdGFydFJlYWQgPSB6ek1hcmtlZFBvc0w7Ci0gIAotICAgICAgenpTdGF0ZSA9IHp6TGV4aWNhbFN0YXRlOwotCi0KLSAgICAgIHp6Rm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHp6Q3VycmVudFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpIHsKLSAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgenpDdXJyZW50UG9zICA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvcyAgID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3NMICA9IHp6Q3VycmVudFBvczsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCAgID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgICAgICA9IHp6QnVmZmVyOwotICAgICAgICAgICAgenpFbmRSZWFkTCAgICAgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpbnQgenpOZXh0ID0genpUcmFuc0xbIHp6Um93TWFwTFt6elN0YXRlXSArIHp6Q01hcExbenpJbnB1dF0gXTsKLSAgICAgICAgICBpZiAoenpOZXh0ID09IC0xKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB6elN0YXRlID0genpOZXh0OwotCi0gICAgICAgICAgaW50IHp6QXR0cmlidXRlcyA9IHp6QXR0ckxbenpTdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgMSkgPT0gMSApIHsKLSAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiA4KSA9PSA4ICkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotCi0gICAgICBzd2l0Y2ggKHp6QWN0aW9uIDwgMCA/IHp6QWN0aW9uIDogWlpfQUNUSU9OW3p6QWN0aW9uXSkgewotICAgICAgICBjYXNlIDE6IAotICAgICAgICAgIHsgcmV0dXJuIGZhbHNlOyAvKiBtYXRjaGVkIHdpbGQgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyByZXR1cm4gdHJ1ZTsgLyogZXhhY3QgbmFtZSAqLwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA1OiBicmVhazsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgICB7IHJldHVybiBmYWxzZTsgLyogbW9yZSB0aGFuIG5hbWUgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICAgIHsge3JldHVybiBmYWxzZTsgLyogaGl0IGVuZCB3aXRoIG5vIG1hdGNoICovfSB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU291cmNlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTb3VyY2VQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkYTgxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTb3VyY2VQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUYWdQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5DaGFyU2VxdWVuY2VSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSVJlZ2lvbkNvbXBhcmlibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogVGFrZXMgaW5wdXQgZnJvbSB0aGUgSFRNTFRva2VuaXplciBhbmQgY3JlYXRlcyBhIHRhZyBsaXN0Ci0gKi8KLQotcHVibGljIGNsYXNzIFhNTFNvdXJjZVBhcnNlciBpbXBsZW1lbnRzIFJlZ2lvblBhcnNlciwgQmxvY2tUYWdQYXJzZXIsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciwgSVJlZ2lvbkNvbXBhcmlibGUsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbiB7Ci0JLy8gbWFkZSBwdWJsaWMgdG8gYWlkIGFjY2VzcyBmcm9tIGlubmVyIGNsYXNzZXMgaW4gaGllcmFyY2h5LgotCS8vIFRPRE86IGluIGZ1dHVyZSwgZmlndXJlIG91dCBob3cgdG8gc29sdmUgd2l0aG91dCBleHBvc2luZyBkYXRhLgotCXB1YmxpYyBDaGFyU2VxdWVuY2UgZkNoYXJTZXF1ZW5jZVNvdXJjZSA9IG51bGw7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50SW5wdXQ7Ci0JcHJvdGVjdGVkIGludCBmT2Zmc2V0ID0gMDsKLQkvLyBETVc6IDIvMTIvMDMuIFJlbW92ZWQgc29tZSBzdGF0ZSBkYXRhLCBzaW5jZSBub3QgcmVhbGx5IG5lZWRlZCwKLQkvLyBhbmQgc2luY2UgaXQgYWRkZWQgYSBsb3QgdG8gb3ZlcmhlYWQgKHNpbmNlIHNvIG1hbnkgcmVnaW9ucyBhcmUKLQkvLyBjcmVhdGVkLgotCS8vIHByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZk5vZGVzID0gbnVsbDsKLQkvLyBwcm90ZWN0ZWQgTGlzdCBmUmVnaW9ucyA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIE9iamVjdCBmSW5wdXQgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZlN0cmluZ0lucHV0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnM7Ci0KLQlwcm90ZWN0ZWQgQmxvY2tUb2tlbml6ZXIgZlRva2VuaXplciA9IG51bGw7Ci0JcHJvdGVjdGVkIGxvbmcgc3RhcnRUaW1lOwotCXByb3RlY3RlZCBsb25nIHN0b3BUaW1lOwotCi0JLyoqCi0JICogSFRNTFNvdXJjZVBhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxTb3VyY2VQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgc2ltcGxlIHV0aWxpdHkgdG8gY291bnQgbm9kZXMuIFVzZWQgb25seSBmb3IgZGVidWcKLQkgKiBzdGF0ZW1lbnRzLgotCSAqLwotCXByb3RlY3RlZCBpbnQgX2NvdW50Tm9kZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlcykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBub2RlczsKLQkJd2hpbGUgKGNvdW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQrKzsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZ2V0VG9rZW5pemVyKCkuYWRkQmxvY2tNYXJrZXIobWFya2VyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlcikgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID09IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5hZGQoaGFuZGxlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5CbG9ja1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJZ2V0VG9rZW5pemVyKCkuYmVnaW5CbG9ja1RhZ1NjYW4obmV3VGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZSA9IG51bGw7Ci0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkKLQkJCW5ld05vZGUgPSBYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuWE1MX0JMT0NLKTsKLQkJZWxzZQotCQkJbmV3Tm9kZSA9IFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5YTUwpOwotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZDdXJyZW50Tm9kZSkgewotCQkvKgotCQkgKiBOZXZlciBsZXQgYW4gRXhjZXB0aW9ucyBmcm9tIGZvcmVpZ24gY29kZSBpbnRlcmZlcmUgd2l0aCBjb21wbGV0aW9uCi0JCSAqIG9mIHBhcnNpbmcuIFRvIGdldCBhbiBleGNlcHRpb24gaGVyZSBpcyBkZWZpbml0ZWx5IGEgcHJvZ3JhbSBlcnJvcgotCQkgKiBzb21ld2hlcmUsIGJ1dCB3ZSBjYW4ndCBhZmZvcmQgdG8gaW50ZXJydXB0IHRoZSBmbG93IG9mIGNvbnRyb2wuIG9yCi0JCSAqIGJhY2t3YXJkcyB0eXBpbmcgY2FuIHJlc3VsdCEKLQkJICogCi0JCSAqIFByb3RlY3QgdGhlIHVzZXIncyBkYXRhIGFib3ZlIGV2ZXJ5dGhpbmcuCi0JCSAqLwotCQl0cnkgewotCQkJaWYgKGZDdXJyZW50Tm9kZSAhPSBudWxsICYmIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMuZ2V0KGkpKS5ub2RlUGFyc2VkKGZDdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJFcnJvciBvY2N1cnJlZCB3aGlsZSBmaXJpbmcgTm9kZSBQYXJzZWQgZXZlbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJsb2NrTWFya2VyIGdldEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JCUxpc3QgbWFya2VycyA9IGdldFRva2VuaXplcigpLmdldEJsb2NrTWFya2VycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcikgbWFya2Vycy5nZXQoaSk7Ci0JCQlpZiAobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJaWYgKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ05hbWUpKQotCQkJCQlyZXR1cm4gbWFya2VyOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSkKLQkJCQkJcmV0dXJuIG1hcmtlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7Ci0JCXJldHVybiBnZXRUb2tlbml6ZXIoKS5nZXRCbG9ja01hcmtlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZG5vZGUgPSBudWxsOwotCQlpZiAoaGVhZG5vZGUgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQloZWFkbm9kZSA9IHBhcnNlTm9kZXMoKTsKLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCXN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLS0gY3JlYXRpbmcgbm9kZXMgb2YgSVN0cnVjdHVyZWREb2N1bWVudCAtLSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIFRpbWUgcGFyc2UgYW5kIGluaXQgYWxsIHJlZ2lvbnM6ICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiAobXNlY3MpIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZm9yICIgKyBmUmVnaW9ucy5zaXplKCkgKyAiCi0JCQkJLy8gUmVnaW9ucyIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICBhbmQgIiArIF9jb3VudE5vZGVzKGhlYWRub2RlKSArICIgTm9kZXMiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVhZG5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb24oKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXRUb2tlbml6ZXIoKS5nZXROZXh0VG9rZW4oKTsKLQkJCS8vIERNVzogMi8xMi8wMyBSZW1vdmVkIHN0YXRlCi0JCQkvLyBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZSZWdpb25zLmFkZChyZWdpb24pOwotCQkJLy8gfQotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiBpbnB1dCBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0VG9rZW5pemVyKCkuZ2V0T2Zmc2V0KCksIGUpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSArICIgKCIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICIpIiwgZSk7IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbCBsaXN0IG9mIGtub3duIHJlZ2lvbnMuIFR5cGljYWxseSBnZXROb2RlcyBzaG91bGQgYmUKLQkgKiB1c2VkIGluc3RlYWQgb2YgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCWlmICghZ2V0VG9rZW5pemVyKCkuaXNFT0YoKSkgewotCQkJaGVhZE5vZGUgPSBnZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJCS8vIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBhcnNpbmcgaGFzIG5vdCBmaW5pc2hlZCIpOwotCQl9Ci0JCS8vIGZvciBtZW1vcnkgcmVjb3ZlcnksIHdlIGFzc3VtZSBpZiBzb21lb25lCi0JCS8vIHJlcXVlc3RzIGFsbCByZWdpb25zLCB3ZSBjYW4gcmVzZXQgb3VyIGJpZwotCQkvLyBtZW1vcnkgY29uc3VtaW5nIG9iamVjdHMKLQkJLy8gYnV0IHRoZSBuZXcgImdldFJlZ2lvbnMiIG1ldGhvZCBpcyB0aGVuIG1vcmUgZXhwZW5zaXZlLgotCQkvLyBJIGRvbid0IHRoaW5rIGl0cyB1c2VkIG11Y2gsIHRob3VnaC4KLQkJTGlzdCBsb2NhbFJlZ2lvbnNMaXN0ID0gZ2V0UmVnaW9ucyhoZWFkTm9kZSk7Ci0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gbG9jYWxSZWdpb25zTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0UmVnaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gaGVhZE5vZGUKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUpIHsKLQkJTGlzdCBhbGxSZWdpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gaGVhZE5vZGU7Ci0JCXdoaWxlIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgbm9kZVJlZ2lvbnMgPSBjdXJyZW50Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVSZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWxsUmVnaW9ucy5hZGQobm9kZVJlZ2lvbnMuZ2V0KGkpKTsKLQkJCX0KLQkJCWN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBhbGxSZWdpb25zOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gdXNlIHRoZSBhZGQvcmVtb3ZlIG1ldGhvZHMgaW5zdGVhZAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycygpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9PSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgaW5wdXQuIFRleHQgaXMgb25seSB2YWxpZCBiZWZvcmUKLQkgKiBnZXROb2RlcygpIGhhcyBiZWVuIGNhbGxlZCBhbmQgb25seSB3aGVuIGEgcmF3IFN0cmluZyBvciBEb2N1bWVudFJlYWRlcgotCSAqIGlzIGdpdmVuIGFzIHRoZSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwpIHsKLQkJCWludCBzdGFydCA9IGZPZmZzZXQgKyBvZmZzZXQ7Ci0JCQlpbnQgZW5kID0gc3RhcnQgKyBsZW5ndGg7Ci0JCQl0ZXh0ID0gZkNoYXJTZXF1ZW5jZVNvdXJjZS5zdWJTZXF1ZW5jZShzdGFydCwgZW5kKS50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UgaWYgKGZEb2N1bWVudElucHV0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdGV4dCA9IGZEb2N1bWVudElucHV0LmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGZTdHJpbmdJbnB1dCA9PSBudWxsIHx8IGZTdHJpbmdJbnB1dC5sZW5ndGgoKSA9PSAwIHx8IG9mZnNldCArIGxlbmd0aCA+IGZTdHJpbmdJbnB1dC5sZW5ndGgoKSB8fCBvZmZzZXQgPCAwKSB7Ci0JCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBvZmZzZXQgaXMgZW50aXJlbHkgdmFsaWQgZHVyaW5nIHBhcnNpbmcgYXMgdGhlIHBhcnNlCi0JCQkJLy8gbnVtYmVycyBoYXZlbid0IGJlZW4gYWRqdXN0ZWQuCi0JCQkJdGV4dCA9IGZTdHJpbmdJbnB1dC5zdWJzdHJpbmcob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBCbG9ja1Rva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgWE1MVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlYTUxTb3VyY2VQYXJzZXIgbmV3SW5zdGFuY2UgPSBuZXcgWE1MU291cmNlUGFyc2VyKCk7Ci0JCW5ld0luc3RhbmNlLnNldFRva2VuaXplcihnZXRUb2tlbml6ZXIoKS5uZXdJbnN0YW5jZSgpKTsKLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcnNlTm9kZXMoKSB7Ci0JCS8vIHJlZ2lvbnMgYXJlIGluaXRpYWxseSByZXBvcnRlZCBhcyBjb21wbGV0ZSBvZmZzZXRzIHdpdGhpbiB0aGUKLQkJLy8gc2Nhbm5lZCBpbnB1dAotCQkvLyB0aGV5IGFyZSBhZGp1c3RlZCBoZXJlIHRvIGJlIGluZGV4ZXMgZnJvbSB0aGUgY3VycmVudE5vZGUncyBzdGFydAotCQkvLyBvZmZzZXQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCi0JCXdoaWxlICgocmVnaW9uID0gZ2V0TmV4dFJlZ2lvbigpKSAhPSBudWxsKSB7Ci0JCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIHRoZXNlIHR5cGVzIChtaWdodCkgZGVtYW5kIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmb3IgZWFjaAotCQkJLy8gb2YgdGhlbQotCQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQkJLy8gbXVsdGlwbGUgYmxvY2sgdGV4dHMgaW5kaWNhdGVkIGVtYmVkZGVkIGNvbnRhaW5lcnM7IG5vCi0JCQkJCS8vIG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdCBjb250aW51aW5nIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCQkJLy8gZW5zdXJlIHRoYXQgYW55IGV4aXN0aW5nIG5vZGUgaXMgYXQgbGVhc3QKLQkJCQkJCS8vIHRlcm1pbmF0ZWQKLQkJCQkJCWlmICghY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkJLy8gZkN1cnJlbnROb2RlLnNldFRleHRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLQotCQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCX0KLQkJCQkJCWxhc3ROb2RlID0gY3VycmVudE5vZGU7Ci0JCQkJCX0KLQkJCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCQl9Ci0JCQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgT1BFTiBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJZWxzZSBpZiAoKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuaXNFbmRlZCgpKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKSkgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGVuc3VyZSB0aGF0IGFueSBleGlzdGluZyBub2RlIGlzIGF0IGxlYXN0IHRlcm1pbmF0ZWQKLQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJLy8gZkN1cnJlbnROb2RlLnNldFRleHRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLQotCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQl9Ci0JCQkJCWxhc3ROb2RlID0gY3VycmVudE5vZGU7Ci0JCQkJfQotCQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgbmVpdGhlciBvcGVuIG5vciBjbG9zZQotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsganVzdCBhZGQgdG8gdGhlbQotCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQpKSB7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIGNsb3NlIG9mZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQkvLyBjbGVhbmx5Ci0JCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCS8vIHRoaXMgaXMgZXh0cmVtZWx5IHJhcmUsIGJ1dCB2YWxpZAotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSB7Ci0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKTsKLQkJCQkvLyBwYWNrIHRoZSBlbWJlZGRlZCBjb250YWluZXIgd2l0aCB0aGlzIHJlZ2lvbgotCQkJCWlmIChsYXN0UmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJSVRleHRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKElUZXh0UmVnaW9uQ29udGFpbmVyKSBsYXN0UmVnaW9uOwotCQkJCQljb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChyZWdpb24pOwotCQkJCQkvLyBjb250YWluZXJzIG11c3QgaGF2ZSBwYXJlbnQgc2V0IC4uLgotCQkJCQkvLyBzZXR0aW5nIGZvciBFQUNIIHN1YnJlZ2lvbiBpcyByZWR1bmRlbnQsIGJ1dCBub3Qgc3VyZQotCQkJCQkvLyB3aGVyZSBlbHNlIHRvIGRvLCBzbyB3aWxsIGRvIGhlcmUgZm9yIG5vdy4KLQkJCQkJY29udGFpbmVyLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjb250YWluZXIpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoY29udGFpbmVyLmdldExlbmd0aCgpIC0gcmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBza2lwIG9uIGEgdmVyeS1maXJzdCByZWdpb24gc2l0dWF0aW9uIGFzIHRoZSBkZWZhdWx0Ci0JCQkJLy8gYmVoYXZpb3IgaXMgZ29vZCBlbm91Z2gKLQkJCQkvLyBjb21iaW5lIHdpdGggcHJldmlvdXMgaWYgYWxzbyB1bmRlZmluZWQKLQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCQljdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCQkvLyBwcmV2aW91cyB3YXNuJ3QgdW5kZWZpbmVkCi0JCQkJZWxzZSB7Ci0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiBhbiB1bmtub3duIHR5cGUgaXMgdGhlIGZpcnN0IHJlZ2lvbiBpbiB0aGUgZG9jdW1lbnQsCi0JCQkJLy8gZW5zdXJlIHRoYXQgYSBub2RlIGV4aXN0cwotCQkJCWlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCByZWdpb24gb2Ygbm90IHNwZWNpZmljYWxseSBoYW5kbGVkIHR5cGUgIiArIHJlZ2lvbi5nZXRUeXBlKCkgKyAiIEAgIiArIHJlZ2lvbi5nZXRTdGFydCgpICsgIlsiICsgcmVnaW9uLmdldExlbmd0aCgpICsgIl0iKTsgLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCS8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQkvLyB0aGVzZSByZWdpb25zIGFsc28gZ2V0IHRoZWlyIG93biBub2RlLCBzbyBjbG9zZSB0aGVtIGNsZWFubHkKLQkJCS8vIE5PVEU6IHRoZXNlIHJlZ2lvbnMgaGF2ZSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBjcmVhdGVkCi0JCQkvLyBmb3IgdGhlbSBhYm92ZTsgaXQgbWF5Ci0JCQkvLyBiZSBtb3JlIHJlYWRhYmxlIGlmIHRoYXQgaXMgaGFuZGxlZCBoZXJlIGFzIHdlbGwsIGJ1dCB0aGUKLQkJCS8vIGN1cnJlbnQgbGF5b3V0Ci0JCQkvLyBlbnN1cmVzIHRoYXQgdGhleSBvcGVuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgdGhlIHNhbWUgd2F5Ci0JCQlpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCX0KLQkJfQotCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQl9Ci0JCS8vIGZTdHJpbmdJbnB1dCA9IG51bGw7Ci0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJlc2V0KCkgewotCQkvLyBmTm9kZXMgPSBudWxsOwotCQkvLyBmUmVnaW9ucyA9IG51bGw7Ci0JCS8vIGZJbnB1dCA9IG51bGw7Ci0JCWZTdHJpbmdJbnB1dCA9IG51bGw7Ci0JCWZDaGFyU2VxdWVuY2VTb3VyY2UgPSBudWxsOwotCQlmRG9jdW1lbnRJbnB1dCA9IG51bGw7Ci0JCWZPZmZzZXQgPSAwOwotCQkvLyBmQ3VycmVudE5vZGUgPSBudWxsOwotCQkvLyBETVc6IGFsc28gcmVzZXQgdG9rZW5pemVyIHNvIGl0IGRvZXNuJ3QgaG9sZCBvbgotCQkvLyB0byBsYXJnZSBhcnJheXMKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQobmV3IGNoYXJbMF0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSVJlZ2lvbkNvbXBhcmlibGUjcmVnaW9uTWF0Y2hlcyhpbnQsCi0JICogICAgICBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCS8vIGJ5IGRlZmluaXRpb24KLQkJaWYgKHN0cmluZ1RvQ29tcGFyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwgJiYgZkNoYXJTZXF1ZW5jZVNvdXJjZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQlyZXN1bHQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gb2xkIGZhc2hpb25lZCB3YXlzCi0JCQlTdHJpbmcgdGVzdCA9IG51bGw7Ci0JCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJdGVzdCA9IGZDaGFyU2VxdWVuY2VTb3VyY2Uuc3ViU2VxdWVuY2Uob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmU3RyaW5nSW5wdXQgIT0gbnVsbCkgewotCQkJCXRlc3QgPSBmU3RyaW5nSW5wdXQuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKLQkJCX0KLQkJCXJlc3VsdCA9IHN0cmluZ1RvQ29tcGFyZS5lcXVhbHModGVzdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCS8vIGJ5IGRlZmluaXRpb24KLQkJaWYgKHN0cmluZ1RvQ29tcGFyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwgJiYgZkNoYXJTZXF1ZW5jZVNvdXJjZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQlyZXN1bHQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzSWdub3JlQ2FzZShvZmZzZXQsIGxlbmd0aCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5cwotCQkJU3RyaW5nIHRlc3QgPSBudWxsOwotCQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCkgewotCQkJCXRlc3QgPSBmQ2hhclNlcXVlbmNlU291cmNlLnN1YlNlcXVlbmNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKS50b1N0cmluZygpOwotCQkJfQotCQkJZWxzZSBpZiAoZlN0cmluZ0lucHV0ICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBzdHJpbmdUb0NvbXBhcmUuZXF1YWxzSWdub3JlQ2FzZSh0ZXN0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlnZXRUb2tlbml6ZXIoKS5yZW1vdmVCbG9ja01hcmtlcihtYXJrZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWdldFRva2VuaXplcigpLnJlbW92ZUJsb2NrTWFya2VyKHRhZ05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5jb250YWlucyhoYW5kbGVyKSkKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5yZW1vdmUoaGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBpbnN0cmVhbSkgewotCQlwcmltUmVzZXQoKTsKLQkJLy8gZklucHV0ID0gaW5zdHJlYW07Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KGluc3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotCQlyZXNldChyZWFkZXIsIDApOwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyLCBpbnQgcG9zaXRpb24pIHsKLQkJcHJpbVJlc2V0KCk7Ci0JCWZPZmZzZXQgPSBwb3NpdGlvbjsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQocmVhZGVyLCBwb3NpdGlvbik7Ci0JCWlmIChyZWFkZXIgaW5zdGFuY2VvZiBEb2N1bWVudFJlYWRlcikgewotCQkJSURvY3VtZW50IGRvYyA9ICgoRG9jdW1lbnRSZWFkZXIpIHJlYWRlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2UpIHsKLQkJCQlmQ2hhclNlcXVlbmNlU291cmNlID0gKENoYXJTZXF1ZW5jZSkgZG9jOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gb2xkIGZhc2hpb25lZCBJRG9jdW1lbnQKLQkJCQlmRG9jdW1lbnRJbnB1dCA9ICgoRG9jdW1lbnRSZWFkZXIpIHJlYWRlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UgaWYgKHJlYWRlciBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZVJlYWRlcikgewotCQkJZkNoYXJTZXF1ZW5jZVNvdXJjZSA9ICgoQ2hhclNlcXVlbmNlUmVhZGVyKSByZWFkZXIpLmdldE9yaWdpbmFsU291cmNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LiBVc2UgdGhpcyB2ZXJzaW9uIHRvIGFsbG93IHRleHQgdG8gYmUgcmV0cmlldmVkCi0JICogPGVtPmR1cmluZzwvZW0+IHBhcnNpbmcsIHN1Y2ggYXMgYnkgdGhlCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc291cmNlU3RyaW5nKSB7Ci0JCXJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoc291cmNlU3RyaW5nKSk7Ci0JCWZTdHJpbmdJbnB1dCA9IHNvdXJjZVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LiBVc2UgdGhpcyB2ZXJzaW9uIHRvIGFsbG93IHRleHQgdG8gYmUgcmV0cmlldmVkCi0JICogPGVtPmR1cmluZzwvZW0+IHBhcnNpbmcsIHN1Y2ggYXMgYnkgdGhlCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgc291cmNlU3RyaW5nLCBpbnQgcG9zaXRpb24pIHsKLQkJU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoc291cmNlU3RyaW5nKTsKLQkJcmVzZXQocmVhZGVyLCBwb3NpdGlvbik7Ci0JCWZTdHJpbmdJbnB1dCA9IHNvdXJjZVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldEhhbmRsZXJzKCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcikgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLmdldChpKSkucmVzZXROb2RlcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIExpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyhMaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRva2VuaXplcihCbG9ja1Rva2VuaXplciBuZXdUb2tlbml6ZXIpIHsKLQkJLy8gRE1XOiBjaGFuZ2VkIGZyb20gcHJpdmF0ZSB0byBwcm90ZWN0ZWQsIHNvIHN1YmNsYXNzIGNvdWxkIHVzZSBpbgotCQkvLyBjcmVhdGlvbiBvZiAnbmV3SW5zdGFuY2UnLgotCQlmVG9rZW5pemVyID0gbmV3VG9rZW5pemVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg1NTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JcHVibGljIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmREaXJ0eUVuZChpbnQgZW5kKSB7Ci0JCS8vIENhdXRpb246IGhlcmUncyBvbmUgcGxhY2Ugd2UgaGF2ZSB0byBjYXN0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQpOwotCQkvLyBpZiBub3Qgd2VsbCBmb3JtZWQsIGdldCBvbmUgcGFzdCwgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlCi0JCWlmICgocmVzdWx0ICE9IG51bGwpICYmICghcmVzdWx0LmlzRW5kZWQoKSkpIHsKLQkJCWlmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JCS8vIGFsc28sIGdldCBvbmUgcGFzdCBpZiBleGFjdGx5IGVxdWFsIHRvIHRoZSBlbmQgKHRoaXMgd2FzIG5lZWRlZAotCQkvLyBhcyBhIHNpbXBsZSBmaXggdG8gd2hlbiBhIHdob2xlIGV4YWN0IHJlZ2lvbiBpcyBkZWxldGVkLgotCQkvLyB0aGVyZSdzIHByb2JhYmx5IGEgYmV0dGVyIHdheS4KLQkJaWYgKChyZXN1bHQgIT0gbnVsbCkgJiYgKGVuZCA9PSByZXN1bHQuZ2V0RW5kKCkpKSB7Ci0JCQlpZiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJCX0KLQkJfQotCi0JCS8vIDEyLzYvMjAwMSAtIFNpbmNlIHdlJ3ZlIGNoYW5nZWQgdGhlIHBhcnNlci9zY2FubmVyIHRvIGFsbG93IGEgbG9uZQotCQkvLyAnPCcgd2l0aG91dAotCQkvLyBhbHdheXMgaW50ZXJwcmV0dGluZyBpdCBhcyBzdGFydCBvZiBhIHRhZyBuYW1lLCB3ZSBuZWVkIHRvIGJlIGEKLQkJLy8gbGl0dGxlIGZhbmNpZXIsIGluIG9yZGVyCi0JCS8vIHRvICJza2lwIiBvdmVyIGFueSBwbGFpbiAnb2wgY29udGVudCBiZXR3ZWVuIHRoZSBsb25lICc8JyBhbmQgYW55Ci0JCS8vIHBvdGVudGlhbCBtZWF0aW5nCi0JCS8vIHJlZ2lvbnMgcGFzdCBwbGFpbiAnb2wgY29udGVudC4KLQkJaWYgKGlzTG9uZU9wZW5Gb2xsb3dlZEJ5Q29udGVudChyZXN1bHQpICYmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQl9Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihyZXN1bHQpOwotCQlkaXJ0eUVuZCA9IHJlc3VsdDsKLQotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluZERpcnR5U3RhcnQoaW50IHN0YXJ0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCS8vIGhldXJpc3RpYzogaWYgdGhlIHBvc3Rpb24gaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgc3RhcnQsIHRoZW4KLQkJLy8gZ28gYmFjayBvbmUgbW9yZSwgaWYgaXQgZXhpc3RzLiBUaGlzIHByZXZlbnRzIHByb2JsZW1zIHdpdGgKLQkJLy8gaW5zZXJ0aW9ucwotCQkvLyBvZiB0ZXh0IHRoYXQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBwcmV2aW91cyBub2RlIGluc3RlYWQgb2YKLQkJLy8gc2ltcGx5IGh1bmcKLQkJLy8gb2ZmIG9mIGl0IGFzIGEgc2VwYXJhdGUgbm9kZSAoZXguOiBYTUwgY29udGVudCBpbnNlcnRlZCByaWdodAotCQkvLyBiZWZvcmUgYW4gb3BlbgotCQkvLyBicmFja2V0IHNob3VsZCBiZWNvbWUgcGFydCBvZiB0aGUgcHJldmlvdXMgY29udGVudCBub2RlKQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSByZXN1bHQuZ2V0UHJldmlvdXMoKTsKLQkJCWlmICgocHJldmlvdXMgIT0gbnVsbCkgJiYgKCghKHByZXZpb3VzLmlzRW5kZWQoKSkpIHx8IChzdGFydCA9PSByZXN1bHQuZ2V0U3RhcnQoKSkpKSB7Ci0JCQkJcmVzdWx0ID0gcHJldmlvdXM7Ci0JCQl9Ci0JCQkvLyBJZiB3ZSBhcmUgbm93IGF0IHRoZSBlbmQgb2YgYSAidGFnIGRlcGVuZGVudCIgY29udGVudCBhcmVhIChvcgotCQkJLy8gSlNQIGFyZWEpCi0JCQkvLyB0aGVuIHdlIG5lZWQgdG8gYmFjayB1cCBhbGwgdGhlIHdheSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoYXQuCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBvdGVudGlhbCA9IHJlc3VsdDsKLQkJCXdoaWxlIChpc1BhcnRPZkJsb2NrUmVnaW9uKHBvdGVudGlhbCkpIHsKLQkJCQlwb3RlbnRpYWwgPSBwb3RlbnRpYWwuZ2V0UHJldmlvdXMoKTsKLQkJCX0KLQkJCWlmIChwb3RlbnRpYWwgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHBvdGVudGlhbDsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJZGlydHlTdGFydCA9IHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcnVsZSBpcywgdGhhdCBpcyB3ZSBhcmUgY29udGVudCwgcHJlY2VkZWQgYnkgbG9uZSA8LCB0aGVuIHdlIG5lZWQKLQkgKiB0byBhZHZhbmNlIG9uZSBtb3JlIGZvciBkaXJ0eSBlbmQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb25lT3BlbkZvbGxvd2VkQnlDb250ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSBmbGF0Tm9kZS5nZXRQcmV2aW91cygpOwotCQkJU3RyaW5nIHByZXZpb3VzVHlwZSA9IG51bGw7Ci0JCQlpZiAocHJldmlvdXMgIT0gbnVsbCkgewotCQkJCXByZXZpb3VzVHlwZSA9IHByZXZpb3VzLmdldFR5cGUoKTsKLQkJCX0KLQkJCWlmIChwcmV2aW91c1R5cGUgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IChwcmV2aW91c1R5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJ0T2ZCbG9ja1JlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQlyZXN1bHQgPSAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOThkYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiBBIHNpbXBsZSBjbGFzcyB0byBnZW5lcmF0ZSBpbnN0YW5jZXMgb2YgU3RydWN0dXJlZFJlZ2lvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSlNQX0RJUkVDVElWRSA9IDEwMDM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWE1MID0gMTAwMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBYTUxfQkxPQ0sgPSAxMDAyOwotCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVJlZ2lvbihpbnQgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIFhNTCA6Ci0JCQkJaW5zdGFuY2UgPSBuZXcgWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFhNTF9CTE9DSyA6Ci0JCQkJaW5zdGFuY2UgPSBuZXcgQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFic3RyYWN0UmVnaW9uOjpjcmVhdGVSZWdpb24uIEludmFsaWQgdHlwZS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjA3YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTM3ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEwLzE3LzA3IDQ6MjcgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zLlhNTFBhcnNlclJlZ2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiAxMC8xNy8wNyA0OjI3IEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L2VjbGlwc2Uud3RwL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgWE1MVG9rZW5pemVyIGltcGxlbWVudHMgQmxvY2tUb2tlbml6ZXIsIERPTVJlZ2lvbkNvbnRleHQgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCA9IDIzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UID0gMjc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9UQUdfQ0xPU0UgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFID0gMjE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfRVFVQUxTID0gMTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9UQUdfTkFNRSA9IDE2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID0gMTk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0gPSAyNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9OQU1FID0gMTc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gMjY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OID0gMjI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OID0gMjg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UX0VORCA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX1RFWFQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9UQUdfQ0xPU0UgPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlQgPSAzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9DT05URU5UID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfV1MgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9FTkQgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UID0gMjk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0JMT0NLX1RBR19TQ0FOID0gMzA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9FUVVBTFMgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT04gPSAyMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDID0gMjQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FUVVBTFMgPSAxODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEkgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUgPSA4OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDVcMVwyMlwyXDBcMVwxNFwyMlwwXDFcMTRcMVwyMVwxXDExXDFcNTUiKwotICAgICJcMVwxNlwxXDE3XDFcMTJcMVwxM1wxXDE2XDFcMTZcMVwxNlwxXDE2XDFcMTZcMVw3IisKLSAgICAiXDFcNlwxXDNcMTJcMTVcMVwxMFwxXDYxXDFcMVwxXDQ1XDFcMlwxXDRcMVwxNiIrCi0gICAgIlwxXDM0XDFcNjJcMVwzMlwxXDMzXDFcNTBcMVw1N1wxXDM2XDFcMzZcMVw0MlwxXDM2IisKLSAgICAiXDFcMzZcMVwyN1wxXDI1XDFcNDRcMVw0M1wxXDQ3XDFcMzZcMVw0MFwxXDU2XDFcMzUiKwotICAgICJcMVw2MFwyXDM2XDFcMjNcMVw0NlwxXDM2XDFcMzFcMVwwXDFcMjBcMVwwXDFcMTAiKwotICAgICJcMVwwXDFcNTJcMVw2MlwxXDYzXDFcNTNcMVwzN1wxXDU3XDFcMzZcMVw2NlwxXDQyIisKLSAgICAiXDJcMzZcMVwzMFwxXDI2XDFcNDRcMVw0M1wxXDQ3XDFcMzZcMVw0MFwxXDQxXDFcNTEiKwotICAgICJcMVw2MFwxXDM2XDFcMzZcMVwyNFwxXDU0XDFcMzZcMVwwXDFcMFw3MlwwXDFcNjUiKwotICAgICJcMTBcMFwyN1w2NFwxXDBcMzdcNjRcMVwwXDcyXDY0XDJcMFwxM1w2NFwyXDBcMTBcNjQiKwotICAgICJcMVwwXDY1XDY0XDFcMFwxMDRcNjRcMTFcMFw0NFw2NFwzXDBcMlw2NFw0XDBcMzZcNjQiKwotICAgICJcNzBcMFwxMzFcNjRcMjJcMFw3XDY0XDE2XDBcMlw2NVw1NlwwXDEwNlw2NVwzMlwwXDJcNjUiKwotICAgICJcNDRcMFwxXDY0XDFcNjVcM1w2NFwxXDBcMVw2NFwxXDBcMjRcNjRcMVwwXDU0XDY0IisKLSAgICAiXDFcMFw3XDY0XDNcMFwxXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDFcMFwxXDY0IisKLSAgICAiXDFcMFwyMlw2NFwxNVwwXDE0XDY0XDFcMFwxMDJcNjRcMVwwXDE0XDY0XDFcMFw0NFw2NCIrCi0gICAgIlwxXDBcNFw2NVwxMVwwXDY1XDY0XDJcMFwyXDY0XDJcMFwyXDY0XDNcMFwzNFw2NCIrCi0gICAgIlwyXDBcMTBcNjRcMlwwXDJcNjRcNjdcMFw0Nlw2NFwyXDBcMVw2NFw3XDBcNDZcNjQiKwotICAgICJcMTJcMFwyMVw2NVwxXDBcMjdcNjVcMVwwXDNcNjVcMVwwXDFcNjVcMVwwXDJcNjUiKwotICAgICJcMVwwXDFcNjVcMTNcMFwzM1w2NFw1XDBcM1w2NFw1NlwwXDMyXDY0XDVcMFwxXDY1IisKLSAgICAiXDEyXDY0XDEwXDY1XDE1XDBcMTJcNjVcNlwwXDFcNjVcMTA3XDY0XDJcMFw1XDY0XDFcMCIrCi0gICAgIlwxN1w2NFwxXDBcNFw2NFwxXDBcMVw2NFwxN1w2NVwyXDY0XDJcNjVcMVwwXDRcNjUiKwotICAgICJcMlwwXDEyXDY1XHUwMjA3XDBcM1w2NVwxXDBcNjVcNjRcMlwwXDFcNjVcMVw2NFwyMFw2NSIrCi0gICAgIlwzXDBcNFw2NVwzXDBcMTJcNjRcMlw2NVwyXDBcMTJcNjVcMjFcMFwzXDY1XDFcMCIrCi0gICAgIlwxMFw2NFwyXDBcMlw2NFwyXDBcMjZcNjRcMVwwXDdcNjRcMVwwXDFcNjRcM1wwIisKLSAgICAiXDRcNjRcMlwwXDFcNjVcMVwwXDdcNjVcMlwwXDJcNjVcMlwwXDNcNjVcMTFcMCIrCi0gICAgIlwxXDY1XDRcMFwyXDY0XDFcMFwzXDY0XDJcNjVcMlwwXDEyXDY1XDJcNjRcMjBcMCIrCi0gICAgIlwxXDY1XDJcMFw2XDY0XDRcMFwyXDY0XDJcMFwyNlw2NFwxXDBcN1w2NFwxXDAiKwotICAgICJcMlw2NFwxXDBcMlw2NFwxXDBcMlw2NFwyXDBcMVw2NVwxXDBcNVw2NVw0XDAiKwotICAgICJcMlw2NVwyXDBcM1w2NVwxM1wwXDRcNjRcMVwwXDFcNjRcN1wwXDEyXDY1XDJcNjUiKwotICAgICJcM1w2NFwxNFwwXDNcNjVcMVwwXDdcNjRcMVwwXDFcNjRcMVwwXDNcNjRcMVwwIisKLSAgICAiXDI2XDY0XDFcMFw3XDY0XDFcMFwyXDY0XDFcMFw1XDY0XDJcMFwxXDY1XDFcNjQiKwotICAgICJcMTBcNjVcMVwwXDNcNjVcMVwwXDNcNjVcMjJcMFwxXDY0XDVcMFwxMlw2NVwyMVwwIisKLSAgICAiXDNcNjVcMVwwXDEwXDY0XDJcMFwyXDY0XDJcMFwyNlw2NFwxXDBcN1w2NFwxXDAiKwotICAgICJcMlw2NFwyXDBcNFw2NFwyXDBcMVw2NVwxXDY0XDZcNjVcM1wwXDJcNjVcMlwwIisKLSAgICAiXDNcNjVcMTBcMFwyXDY1XDRcMFwyXDY0XDFcMFwzXDY0XDRcMFwxMlw2NVwyMlwwIisKLSAgICAiXDJcNjVcMVwwXDZcNjRcM1wwXDNcNjRcMVwwXDRcNjRcM1wwXDJcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwwXDJcNjRcM1wwXDJcNjRcM1wwXDNcNjRcM1wwXDEwXDY0XDFcMCIrCi0gICAgIlwzXDY0XDRcMFw1XDY1XDNcMFwzXDY1XDFcMFw0XDY1XDExXDBcMVw2NVwxN1wwIisKLSAgICAiXDExXDY1XDIxXDBcM1w2NVwxXDBcMTBcNjRcMVwwXDNcNjRcMVwwXDI3XDY0XDFcMCIrCi0gICAgIlwxMlw2NFwxXDBcNVw2NFw0XDBcN1w2NVwxXDBcM1w2NVwxXDBcNFw2NVw3XDAiKwotICAgICJcMlw2NVwxMVwwXDJcNjRcNFwwXDEyXDY1XDIyXDBcMlw2NVwxXDBcMTBcNjRcMVwwIisKLSAgICAiXDNcNjRcMVwwXDI3XDY0XDFcMFwxMlw2NFwxXDBcNVw2NFw0XDBcN1w2NVwxXDAiKwotICAgICJcM1w2NVwxXDBcNFw2NVw3XDBcMlw2NVw3XDBcMVw2NFwxXDBcMlw2NFw0XDAiKwotICAgICJcMTJcNjVcMjJcMFwyXDY1XDFcMFwxMFw2NFwxXDBcM1w2NFwxXDBcMjdcNjRcMVwwIisKLSAgICAiXDIwXDY0XDRcMFw2XDY1XDJcMFwzXDY1XDFcMFw0XDY1XDExXDBcMVw2NVwxMFwwIisKLSAgICAiXDJcNjRcNFwwXDEyXDY1XDIyMVwwXDU2XDY0XDFcMFwxXDY0XDFcNjVcMlw2NFw3XDY1IisKLSAgICAiXDVcMFw2XDY0XDFcNjVcMTBcNjVcMVwwXDEyXDY1XDQ3XDBcMlw2NFwxXDBcMVw2NCIrCi0gICAgIlwyXDBcMlw2NFwxXDBcMVw2NFwyXDBcMVw2NFw2XDBcNFw2NFwxXDBcN1w2NCIrCi0gICAgIlwxXDBcM1w2NFwxXDBcMVw2NFwxXDBcMVw2NFwyXDBcMlw2NFwxXDBcMlw2NCIrCi0gICAgIlwxXDBcMVw2NFwxXDY1XDJcNjRcNlw2NVwxXDBcMlw2NVwxXDY0XDJcMFw1XDY0IisKLSAgICAiXDFcMFwxXDY1XDFcMFw2XDY1XDJcMFwxMlw2NVw3NlwwXDJcNjVcNlwwXDEyXDY1IisKLSAgICAiXDEzXDBcMVw2NVwxXDBcMVw2NVwxXDBcMVw2NVw0XDBcMlw2NVwxMFw2NFwxXDAiKwotICAgICJcNDFcNjRcN1wwXDI0XDY1XDFcMFw2XDY1XDRcMFw2XDY1XDFcMFwxXDY1XDFcMCIrCi0gICAgIlwyNVw2NVwzXDBcN1w2NVwxXDBcMVw2NVwzNDZcMFw0Nlw2NFwxMlwwXDQ3XDY0XDExXDAiKwotICAgICJcMVw2NFwxXDBcMlw2NFwxXDBcM1w2NFwxXDBcMVw2NFwxXDBcMlw2NFwxXDAiKwotICAgICJcNVw2NFw1MVwwXDFcNjRcMVwwXDFcNjRcMVwwXDFcNjRcMTNcMFwxXDY0XDFcMCIrCi0gICAgIlwxXDY0XDFcMFwxXDY0XDNcMFwyXDY0XDNcMFwxXDY0XDVcMFwzXDY0XDFcMCIrCi0gICAgIlwxXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDNcMFwyXDY0XDNcMCIrCi0gICAgIlwyXDY0XDFcMFwxXDY0XDUwXDBcMVw2NFwxMVwwXDFcNjRcMlwwXDFcNjRcMlwwIisKLSAgICAiXDJcNjRcN1wwXDJcNjRcMVwwXDFcNjRcMVwwXDdcNjRcNTBcMFwxXDY0XDRcMCIrCi0gICAgIlwxXDY0XDEwXDBcMVw2NFx1MGMwNlwwXDIzNFw2NFw0XDBcMTMyXDY0XDZcMFwyNlw2NFwyXDAiKwotICAgICJcNlw2NFwyXDBcNDZcNjRcMlwwXDZcNjRcMlwwXDEwXDY0XDFcMFwxXDY0XDFcMCIrCi0gICAgIlwxXDY0XDFcMFwxXDY0XDFcMFwzN1w2NFwyXDBcNjVcNjRcMVwwXDdcNjRcMVwwIisKLSAgICAiXDFcNjRcM1wwXDNcNjRcMVwwXDdcNjRcM1wwXDRcNjRcMlwwXDZcNjRcNFwwIisKLSAgICAiXDE1XDY0XDVcMFwzXDY0XDFcMFw3XDY0XDMyM1wwXDE1XDY1XDRcMFwxXDY1XDEwNFwwIisKLSAgICAiXDFcNjRcM1wwXDJcNjRcMlwwXDFcNjRcMTIxXDBcM1w2NFx1MGU4MlwwXDFcNjVcMVwwIisKLSAgICAiXDFcNjRcMzFcMFwxMVw2NFw2XDY1XDFcMFw1XDY1XDEzXDBcMTI0XDY0XDRcMFwyXDY1IisKLSAgICAiXDJcMFwyXDY1XDJcMFwxMzJcNjRcMVwwXDNcNjVcNlwwXDUwXDY0XHUxY2QzXDBcdTUxYTZcNjQiKwotICAgICJcdTBjNWFcMFx1MmJhNFw2NFwxMzRcMFx1MDgwMFwwXHUxZmZlXDBcMlwwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3Jvd01hcCBbXSA9IHsgCi0gICAgICAgIDAsICAgIDU1LCAgIDExMCwgICAxNjUsICAgMjIwLCAgIDI3NSwgICAzMzAsICAgMzg1LCAgIDQ0MCwgICA0OTUsIAotICAgICAgNTUwLCAgIDYwNSwgICA2NjAsICAgNzE1LCAgIDc3MCwgICA4MjUsICAgODgwLCAgIDkzNSwgICA5OTAsICAxMDQ1LCAKLSAgICAgMTEwMCwgIDExNTUsICAxMjEwLCAgMTI2NSwgIDEzMjAsICAxMzc1LCAgMTQzMCwgIDE0ODUsICAxNTQwLCAgMTU5NSwgCi0gICAgIDE2NTAsICAxNzA1LCAgMTc2MCwgIDE4MTUsICAxODcwLCAgMTkyNSwgIDE5ODAsICAxOTI1LCAgMTk4MCwgIDIwMzUsIAotICAgICAxOTI1LCAgMTkyNSwgIDE5ODAsICAyMDkwLCAgMjE0NSwgIDIyMDAsICAyMjU1LCAgMjMxMCwgIDIzNjUsICAyNDIwLCAKLSAgICAgMjQ3NSwgIDE5MjUsICAxOTgwLCAgMjUzMCwgIDI1ODUsICAyNjQwLCAgMTkyNSwgIDI2OTUsICAyNjk1LCAgMjc1MCwgCi0gICAgIDI4MDUsICAyODYwLCAgMjUzMCwgIDE5MjUsICAyOTE1LCAgMjk3MCwgIDE5MjUsICAzMDI1LCAgMzA4MCwgIDMxMzUsIAotICAgICAzMTkwLCAgMzI0NSwgIDMzMDAsICAxOTI1LCAgMzM1NSwgIDM0MTAsICAzNDY1LCAgMzUyMCwgIDE5MjUsICAzNTc1LCAKLSAgICAgMzYzMCwgIDM2ODUsICAzNzQwLCAgMzc5NSwgIDE5MjUsICAzODUwLCAgMzkwNSwgIDM5NjAsICA0MDE1LCAgNDA3MCwgCi0gICAgIDQxMjUsICA0MTgwLCAgNDIzNSwgIDQyMzUsICA0MjkwLCAgNDM0NSwgIDQ0MDAsICA0NDU1LCAgNDQ1NSwgIDQ1MTAsIAotICAgICA0NTY1LCAgNDYyMCwgIDQ2NzUsICA0Njc1LCAgNDczMCwgIDQ3ODUsICA0ODQwLCAgNDg5NSwgIDE5MjUsICA0OTUwLCAKLSAgICAgNDk1MCwgIDUwMDUsICA1MDYwLCAgNTExNSwgIDUxNzAsICAxOTI1LCAgMTkyNSwgIDE5ODAsICAxOTI1LCAgMTkyNSwgCi0gICAgIDUyMjUsICA1MjgwLCAgNTMzNSwgIDUzOTAsICA1NDQ1LCAgNTUwMCwgIDU1NTUsICA1NjEwLCAgMTkyNSwgIDU2NjUsIAotICAgICA1NzIwLCAgNTc3NSwgIDE5MjUsICAxOTI1LCAgMjY5NSwgIDU4MzAsICAyODA1LCAgMTkyNSwgIDU4ODUsICAyODYwLCAKLSAgICAgMjkxNSwgIDMwMjUsICAzMDgwLCAgNTk0MCwgIDMxMzUsICAxOTI1LCAgNTk5NSwgIDMxOTAsICAxOTI1LCAgMzU3NSwgCi0gICAgIDYwNTAsICAzNjg1LCAgMTkyNSwgIDYxMDUsICAzNzQwLCAgNTIyNSwgIDYxNjAsICA2MjE1LCAgNjI3MCwgIDQwMTUsIAotICAgICAxOTI1LCAgNjMyNSwgIDYzODAsICA0MjM1LCAgNjQzNSwgIDQyOTAsICAxOTI1LCAgNjQ5MCwgIDY1NDUsICA2NjAwLCAKLSAgICAgNjYwMCwgIDY2NTUsICA2NzEwLCAgNDQwMCwgIDQyMzUsICA0NDU1LCAgNjc2NSwgIDQ1MTAsICAxOTI1LCAgNjgyMCwgCi0gICAgIDQ1NjUsICA0NjIwLCAgNDQ1NSwgIDQ2NzUsICA2ODc1LCAgNDczMCwgIDE5MjUsICA2OTMwLCAgNjk4NSwgIDcwNDAsIAotICAgICA3MDQwLCAgNzA5NSwgIDcxNTAsICA3MjA1LCAgNDk1MCwgIDcyNjAsICA1MDA1LCAgMTkyNSwgIDczMTUsICA3MzcwLCAKLSAgICAgNzQyNSwgIDc0MjUsICA3NDgwLCAgNzUzNSwgIDc1OTAsICA3NjQ1LCAgNzcwMCwgIDc3NTUsICA3ODEwLCAgMTkyNSwgCi0gICAgIDc4NjUsICA3OTIwLCAgMTkyNSwgIDE5MjUsICAxOTI1LCAgMjI1NSwgIDc5NzUsICA4MDMwLCAgODA4NSwgIDgxNDAsIAotICAgICA4MTk1LCAgODI1MCwgIDgzMDUsICA2NDkwLCAgODM2MCwgIDgzNjAsICA2OTMwLCAgODQxNSwgIDg0MTUsICA4NDcwLCAKLSAgICAgNzMxNSwgIDg1MjUsICA4NTI1LCAgODU4MCwgIDE5MjUsICA4NjM1LCAgODY5MCwgIDE5MjUsICA4NzQ1LCAgODgwMCwgCi0gICAgIDg4NTUsICA4OTEwLCAgODk2NSwgIDkwMjAsICA5MDc1LCAgOTEzMCwgIDY2NTUsICA3MDk1LCAgOTE4NSwgIDc0ODAsIAotICAgICA5MjQwLCAgOTI5NSwgIDkzNTAsICA5NDA1LCAgOTQ2MCwgIDk1MTUsICA5NTcwLCAgOTYyNSwgIDk2ODAsICA5NzM1LCAKLSAgICAgOTc5MCwgIDk4NDUsICA5OTAwLCAgOTk1NSwgMTAwMTAsIDEwMDY1LCAxMDEyMCwgIDE5MjUsICAxOTI1LCAxMDE3NSwgCi0gICAgMTAyMzAsIDEwMjg1LCAxMDM0MCwgMTAzOTUsICAxOTI1LCAgMTkyNSwgIDE5MjUsIDEwNDUwLCAxMDUwNSwgMTA1NjAsIAotICAgIDEwNjE1LCAxMDY3MCwgMTA3MjUsICAxOTI1LCAxMDc4MCwgIDQ4NDAsICA1MTE1LCAxMDgzNSwgMTA4OTAsIDEwOTQ1LCAKLSAgICAxMTAwMCwgIDIyNTUKLSAgfTsKLQotICAvKiogCi0gICAqIFRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXlfcGFja2VkID0gCi0gICAgIlwxXDQwXDFcNDFcMTBcNDBcMVw0Mlw0XDQwXDFcNDNcNDdcNDBcMVw0NCIrCi0gICAgIlwxXDQ1XDY1XDQ0XDFcNDZcMVw0N1wxNlw0NlwxXDUwXDFcNDZcMVw1MSIrCi0gICAgIlw0NFw0NlwxXDUyXDFcNTNcNjVcNTJcMVw0NlwxXDQ3XDVcNDZcMVw1NCIrCi0gICAgIlwxMlw0NlwxXDUxXDQ1XDQ2XDFcNDdcMlw0NlwxXDU1XDFcNTZcMlw0NiIrCi0gICAgIlwxXDU3XDNcNDZcMVw1Nlw1XDQ2XDFcNTZcMVw2MFwxXDYxXDRcNTciKwotICAgICJcMVw0NlwxMFw1N1wxXDYyXDJcNTdcMVw0Nlw3XDU3XDFcNDZcM1w1NyIrCi0gICAgIlwxXDQ2XDNcNTdcMVw0NlwxXDU3XDFcNDZcMVw0N1wyXDQ2XDFcNTUiKwotICAgICJcMVw2M1w2XDQ2XDFcNjNcNVw0NlwxXDYzXDQ0XDQ2XDFcNjRcMVw2NSIrCi0gICAgIlwyXDY0XDFcNjZcMTVcNjRcMVw1MVw0NFw2NFwxXDQ2XDFcNDdcMlw0NiIrCi0gICAgIlwxXDY3XDFcNTZcMlw0NlwxXDcwXDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNlw3MFwxXDQ2XDEzXDcwXDFcNDZcN1w3MFwxXDQ2XDNcNzBcMVw0NiIrCi0gICAgIlwzXDcwXDFcNDZcMVw3MFwxXDQ2XDFcNDdcMlw0NlwxXDY3XDFcNTYiKwotICAgICJcMlw0NlwxXDcwXDNcNDZcMVw1Nlw1XDQ2XDFcNTZcNlw3MFwxXDQ2IisKLSAgICAiXDEzXDcwXDFcNzFcN1w3MFwxXDQ2XDNcNzBcMVw0NlwzXDcwXDFcNDYiKwotICAgICJcMVw3MFwxXDcyXDFcNDdcMVw0NlwxXDczXDFcNzRcMVw1NlwzXDcyIisKLSAgICAiXDFcNzVcMVw3MlwxXDc2XDFcNTZcNVw3MlwxXDU2XDQ0XDcyXDFcNDYiKwotICAgICJcMVw0N1wyXDQ2XDFcNzdcMTVcNDZcMVw1MVw0NVw0NlwxXDQ3XDFcMTAwIisKLSAgICAiXDFcMTAxXDFcNDZcMVw1NlwyXDQ2XDFcMTAyXDNcNDZcMVw1Nlw1XDQ2IisKLSAgICAiXDFcNTZcNlwxMDJcMVw0NlwxM1wxMDJcMVw0Nlw3XDEwMlwxXDQ2XDNcMTAyIisKLSAgICAiXDFcNDZcM1wxMDJcMVw0NlwxXDEwMlwxXDQ2XDFcNDdcMVwxMDBcMVwxMDEiKwotICAgICJcMVw0NlwxXDU2XDJcNDZcMVwxMDJcM1w0NlwxXDU2XDVcNDZcMVw1NiIrCi0gICAgIlw2XDEwMlwxXDQ2XDEzXDEwMlwxXDEwM1w3XDEwMlwxXDQ2XDNcMTAyXDFcNDYiKwotICAgICJcM1wxMDJcMVw0NlwxXDEwMlwxXDEwNFwxXDQ3XDFcMTAwXDFcMTA1XDFcMTA0IisKLSAgICAiXDFcNTZcM1wxMDRcMVwxMDZcMVwxMDRcMVwxMDdcMVw1Nlw1XDEwNFwxXDU2IisKLSAgICAiXDQ0XDEwNFwxXDQ2XDFcNDdcM1w0NlwxXDU2XDZcNDZcMVw1Nlw1XDQ2IisKLSAgICAiXDFcNTZcNDRcNDZcMVwxMTBcMVwxMTFcMVwxMTJcMVwxMTNcNFwxMTBcMVwxMTQiKwotICAgICJcMTJcMTEwXDZcMTE1XDFcMTEwXDEzXDExNVwxXDExMFw3XDExNVwxXDExMFwzXDExNSIrCi0gICAgIlwxXDExMFwzXDExNVwxXDExMFwxXDExNVwxXDQ2XDFcMTExXDFcMTEyXDFcMTEzIisKLSAgICAiXDFcNDZcMVw1NlwyXDQ2XDFcMTE2XDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNlwxMTZcMVw0NlwxM1wxMTZcMVw0Nlw3XDExNlwxXDQ2XDNcMTE2XDFcNDYiKwotICAgICJcM1wxMTZcMVw0NlwxXDExNlwxXDQ2XDFcMTExXDFcMTEyXDFcMTEzXDFcNDYiKwotICAgICJcMVw1NlwyXDQ2XDFcMTE2XDNcNDZcMVw1Nlw1XDQ2XDFcNTZcNlwxMTYiKwotICAgICJcMVw0NlwxM1wxMTZcMVwxMTdcN1wxMTZcMVw0NlwzXDExNlwxXDQ2XDNcMTE2IisKLSAgICAiXDFcNDZcMVwxMTZcMVwxMjBcMVwxMTFcMVwxMTJcMVwxMjFcMVwxMjBcMVw1NiIrCi0gICAgIlwzXDEyMFwxXDEyMlwxXDEyMFwxXDEyM1wxXDU2XDVcMTIwXDFcNTZcNDRcMTIwIisKLSAgICAiXDFcNDZcMVwxMjRcMVwxMjVcMlw0NlwxXDU2XDZcNDZcMVw1Nlw1XDQ2IisKLSAgICAiXDFcNTZcMTBcNDZcMVwxMjZcMVwxMjdcMlw0NlwxXDEzMFwxMFw0NlwxXDEzMCIrCi0gICAgIlwxXDQ2XDFcMTI3XDFcMTI2XDE0XDQ2XDFcNDdcMVwxMjVcMlw0NlwxXDU2IisKLSAgICAiXDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNlw0NlwxXDEzMVwzNlw0NlwxXDQ3IisKLSAgICAiXDFcMTI1XDJcNDZcMVw1NlwyXDQ2XDFcMTMyXDNcNDZcMVw1Nlw1XDQ2IisKLSAgICAiXDFcNTZcNlwxMzJcMVwxMzFcMTNcMTMyXDFcNDZcN1wxMzJcMVw0NlwzXDEzMiIrCi0gICAgIlwxXDQ2XDNcMTMyXDFcNDZcMVwxMzJcMVw0NlwxXDQ3XDFcMTI1XDJcNDYiKwotICAgICJcMVw1Nlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDZcNDZcMVwxMzFcN1w0NiIrCi0gICAgIlwxXDEzM1w1XDQ2XDFcMTM0XDZcNDZcMVwxMzNcMTBcNDZcMVwxMzVcMVw0NyIrCi0gICAgIlwxXDEyNVwxXDEzNlwxXDEzNVwxXDU2XDNcMTM1XDFcMTM3XDFcMTM1XDFcMTQwIisKLSAgICAiXDFcNTZcNVwxMzVcMVw1Nlw2XDEzNVwxXDE0MVwzNVwxMzVcMVwxNDJcMVw0NyIrCi0gICAgIlwxXDEyNVwxXDE0M1wxXDE0MlwxXDU2XDNcMTQyXDFcMTQ0XDFcMTQyXDFcMTQ1IisKLSAgICAiXDFcNTZcNVwxNDJcMVw1Nlw2XDE0MlwxXDE0NlwzNVwxNDJcMVwxNDdcMVw0NyIrCi0gICAgIlwxXDEyNVwxXDE1MFwxXDE0N1wxXDU2XDNcMTQ3XDFcMTUxXDFcMTQ3XDFcMTUyIisKLSAgICAiXDFcNTZcNVwxNDdcMVw1Nlw0NFwxNDdcMVwxNTNcMVwxNTRcMVwxNTVcNjRcMTUzIisKLSAgICAiXDFcMTU2XDFcNDdcMVwxMjVcMVwxNTdcMVwxNTZcMVw1NlwzXDE1NlwxXDE2MCIrCi0gICAgIlwxXDE1NlwxXDE2MVwxXDU2XDVcMTU2XDFcNTZcNDRcMTU2XDFcMTYyXDFcMTYzIisKLSAgICAiXDFcMTY0XDY0XDE2MlwxXDE2NVwxXDE2Nlw2NVwxNjVcMVw0MFwxXDBcMTBcNDAiKwotICAgICJcMVwwXDRcNDBcMVwwXDQ3XDQwXDNcMFwxXDE2N1wxXDE3MFwxNFwwIisKLSAgICAiXDFcMTcxXDUyXDBcMVwxNzJcMlwwXDFcMTczXDNcMFwxXDE3Mlw1XDAiKwotICAgICJcMVwxNzJcNlwxNzNcMVwwXDEzXDE3M1wxXDBcN1wxNzNcMVwxNzRcM1wxNzMiKwotICAgICJcMVwwXDNcMTczXDFcMFwxXDE3M1w1XDBcMVwxNzJcMlwwXDFcMTc1IisKLSAgICAiXDNcMFwxXDE3Mlw1XDBcMVwxNzJcNlwxNzVcMVwwXDEzXDE3NVwxXDAiKwotICAgICJcN1wxNzVcMVwwXDNcMTc1XDFcMFwzXDE3NVwxXDBcMVwxNzVcMTEwXDAiKwotICAgICJcMVwxNzZcNjVcMFwxXDE3N1w1NVwwXDFcMjAwXDYxXDBcMVwyMDFcNzFcMCIrCi0gICAgIlwxXDU2XDZcMFwxXDU2XDVcMFwxXDU2XDUyXDBcM1w1N1w0XDAiKwotICAgICJcMVw1N1w1XDBcNlw1N1wxXDBcMTNcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDJcNTdcMlwyMDJcMlw1N1wxXDBcMTNcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDJcNTdcMVwyMDJcMVwyMDNcMlw1N1wxXDBcMTNcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDJcNTdcMlwyMDRcMlw1N1wxXDBcMTNcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDVcNTdcNVwwXDFcNjNcNlwwXDFcNjMiKwotICAgICJcNVwwXDFcNjNcNDZcMFwxXDIwNVw2NlwwXDFcMjA2XDcyXDBcM1w3MCIrCi0gICAgIlw0XDBcMVw3MFw1XDBcNlw3MFwxXDBcMTNcNzBcMVwwXDdcNzAiKwotICAgICJcMVwwXDNcNzBcMVwwXDVcNzBcMVw3MlwyXDBcMVwyMDdcMVw3MiIrCi0gICAgIlwxXDBcM1w3MlwxXDBcMVw3MlwyXDBcNVw3MlwxXDBcNDVcNzIiKwotICAgICJcMVwwXDFcMjA2XDFcMjA3XDFcNzJcMVwwXDNcNzJcMVwwXDFcNzIiKwotICAgICJcMlwwXDVcNzJcMVwwXDQ0XDcyXDFcNzVcMVwwXDFcMjEwXDFcMjExIisKLSAgICAiXDFcNzVcMVwyMTBcM1w3NVwxXDIxMlwxXDc1XDJcMjEwXDVcNzVcMVwyMTAiKwotICAgICJcNDRcNzVcMVw3NlwxXDBcMVwyMTNcMVwyMTRcMVw3NlwxXDIxM1wzXDc2IisKLSAgICAiXDFcMjEzXDFcNzZcMVwyMTJcMVwyMTNcNVw3NlwxXDIxM1w0NFw3NlwyXDAiKwotICAgICJcMVwxMDBcMVwyMTVcNzFcMFwzXDEwMlw0XDBcMVwxMDJcNVwwXDZcMTAyIisKLSAgICAiXDFcMFwxM1wxMDJcMVwwXDdcMTAyXDFcMFwzXDEwMlwxXDBcNVwxMDIiKwotICAgICJcMVwxMDRcMlwwXDFcMjE2XDFcMTA0XDFcMFwzXDEwNFwxXDBcMVwxMDQiKwotICAgICJcMlwwXDVcMTA0XDFcMFw0NVwxMDRcMVwwXDFcMTAwXDFcMjE3XDFcMTA0IisKLSAgICAiXDFcMFwzXDEwNFwxXDBcMVwxMDRcMlwwXDVcMTA0XDFcMFw0NFwxMDQiKwotICAgICJcMVwxMDZcMVwwXDFcMjIwXDFcMjIxXDFcMTA2XDFcMjIwXDNcMTA2XDFcMjIyIisKLSAgICAiXDFcMTA2XDJcMjIwXDVcMTA2XDFcMjIwXDQ0XDEwNlwxXDEwN1wxXDBcMVwyMjMiKwotICAgICJcMVwyMjRcMVwxMDdcMVwyMjNcM1wxMDdcMVwyMjNcMVwxMDdcMVwyMjJcMVwyMjMiKwotICAgICJcNVwxMDdcMVwyMjNcNDRcMTA3XDFcMTEwXDNcMFwxN1wxMTBcNlwwXDFcMTEwIisKLSAgICAiXDEzXDBcMVwxMTBcN1wwXDFcMTEwXDNcMFwxXDExMFwzXDBcMVwxMTAiKwotICAgICJcNFwwXDFcMTY3XDE1XDBcMVwxNzFcNDdcMFwxXDIyNVw2NFwwXDFcMTEwIisKLSAgICAiXDNcMFwyXDExMFwzXDExNFw0XDExMFwxXDExNFw1XDExMFw2XDExNVwxXDExMCIrCi0gICAgIlwxM1wxMTVcMVwxMTBcN1wxMTVcMVwxMTBcM1wxMTVcMVwxMTBcM1wxMTVcMVwxMTQiKwotICAgICJcMVwxMTVcNlwwXDNcMTE1XDRcMFwxXDExNVw1XDBcNlwxMTVcMVwwIisKLSAgICAiXDEzXDExNVwxXDBcN1wxMTVcMVwwXDNcMTE1XDFcMFw1XDExNVw2XDAiKwotICAgICJcM1wxMTZcNFwwXDFcMTE2XDVcMFw2XDExNlwxXDBcMTNcMTE2XDFcMCIrCi0gICAgIlw3XDExNlwxXDBcM1wxMTZcMVwwXDVcMTE2XDFcMTIwXDJcMFwxXDIyNiIrCi0gICAgIlwxXDEyMFwxXDBcM1wxMjBcMVwwXDFcMTIwXDJcMFw1XDEyMFwxXDAiKwotICAgICJcNDVcMTIwXDFcMFwxXDIyNVwxXDIyNlwxXDEyMFwxXDBcM1wxMjBcMVwwIisKLSAgICAiXDFcMTIwXDJcMFw1XDEyMFwxXDBcNDRcMTIwXDFcMTIyXDFcMFwxXDIyNyIrCi0gICAgIlwxXDIzMFwxXDEyMlwxXDIyN1wzXDEyMlwxXDIzMVwxXDEyMlwyXDIyN1w1XDEyMiIrCi0gICAgIlwxXDIyN1w0NFwxMjJcMVwxMjNcMVwwXDFcMjMyXDFcMjMzXDFcMTIzXDFcMjMyIisKLSAgICAiXDNcMTIzXDFcMjMyXDFcMTIzXDFcMjMxXDFcMjMyXDVcMTIzXDFcMjMyXDQ0XDEyMyIrCi0gICAgIlwzXDBcMVwxNjdcMTVcMFwxXDIzNFwxMTBcMFwxXDIzNVw2MFwwXDFcMjM2IisKLSAgICAiXDEzXDBcMVwyMzZcNDRcMFwyXDIzN1wzNlwwXDIwXDI0MFwxXDI0MVw0NlwyNDAiKwotICAgICJcNlwwXDNcMTMyXDRcMFwxXDEzMlw1XDBcNlwxMzJcMVwwXDEzXDEzMiIrCi0gICAgIlwxXDBcN1wxMzJcMVwwXDNcMTMyXDFcMFw1XDEzMlw0NlwwXDFcMjQyIisKLSAgICAiXDVcMFwxXDI0Mlw3MlwwXDFcMjQzXDZcMFwxXDEzNVwyXDBcMVwyNDQiKwotICAgICJcMVwxMzVcMVwwXDNcMTM1XDFcMFwxXDEzNVwyXDBcNVwxMzVcMVwwIisKLSAgICAiXDQ0XDEzNVwxXDEzN1wxXDBcMVwyNDVcMVwyNDZcMVwxMzdcMVwyNDVcM1wxMzciKwotICAgICJcMVwyNDdcMVwxMzdcMlwyNDVcNVwxMzdcMVwyNDVcNDRcMTM3XDFcMjUwXDFcMCIrCi0gICAgIlwxXDI1MVwxXDI1MlwxXDI1M1wxXDI1MVwzXDI1M1wxXDI1MVwxXDI1MFwxXDI1NCIrCi0gICAgIlwxXDI1NVwzXDI1M1wxXDI1MFwxXDI1M1wxXDI1NVw2XDI1M1wxXDI1MFwzMlwyNTMiKwotICAgICJcMlwyNTBcMVwyNTNcMVwxNDFcMlwyNDBcMVwyNTZcMVwxNDFcMVwyNDBcM1wxNDEiKwotICAgICJcMVwyNDBcMVwxNDFcMlwyNDBcM1wxNDFcMVwyNTdcMVwxNDFcMVwyNDBcNDRcMTQxIisKLSAgICAiXDFcMTQyXDJcMFwxXDI2MFwxXDE0MlwxXDBcM1wxNDJcMVwwXDFcMTQyIisKLSAgICAiXDJcMFw1XDE0MlwxXDBcNDRcMTQyXDFcMTQ0XDJcMjYxXDFcMjYyXDFcMTQ0IisKLSAgICAiXDFcMjYxXDNcMTQ0XDFcMjYzXDFcMTQ0XDJcMjYxXDVcMTQ0XDFcMjYxXDQ0XDE0NCIrCi0gICAgIlwxXDE0NVwyXDI2NFwxXDI2NVwxXDE0NVwxXDI2NFwzXDE0NVwxXDI2NFwxXDE0NSIrCi0gICAgIlwxXDI2M1wxXDI2NFw1XDE0NVwxXDI2NFw0NFwxNDVcMVwxNDZcMlwyNDBcMVwyNjYiKwotICAgICJcMVwxNDZcMVwyNDBcM1wxNDZcMVwyNDBcMVwxNDZcMlwyNDBcM1wxNDZcMVwyNjciKwotICAgICJcMVwxNDZcMVwyNDBcNDRcMTQ2XDFcMTQ3XDJcMFwxXDI3MFwxXDE0N1wxXDAiKwotICAgICJcM1wxNDdcMVwwXDFcMTQ3XDJcMFw1XDE0N1wxXDBcNDRcMTQ3XDFcMTUxIisKLSAgICAiXDFcMFwxXDI3MVwxXDI3MlwxXDE1MVwxXDI3MVwzXDE1MVwxXDI3M1wxXDE1MSIrCi0gICAgIlwyXDI3MVw1XDE1MVwxXDI3MVw0NFwxNTFcMVwyNzRcMVwwXDFcMjc1XDFcMjc2IisKLSAgICAiXDFcMjc3XDFcMjc1XDNcMjc3XDFcMjc1XDFcMjc0XDFcMzAwXDFcMzAxXDNcMjc3IisKLSAgICAiXDFcMjc0XDFcMjc3XDFcMzAxXDZcMjc3XDFcMjc0XDMyXDI3N1wyXDI3NFwxXDI3NyIrCi0gICAgIlwyXDE1M1wxXDBcNjZcMTUzXDFcMFwxNlwxNTNcMVwzMDJcNDVcMTUzXDFcMTU2IisKLSAgICAiXDJcMFwxXDMwM1wxXDE1NlwxXDBcM1wxNTZcMVwwXDFcMTU2XDJcMCIrCi0gICAgIlw1XDE1NlwxXDBcNDRcMTU2XDFcMTYwXDFcMFwxXDMwNFwxXDMwNVwxXDE2MCIrCi0gICAgIlwxXDMwNFwzXDE2MFwxXDMwNlwxXDE2MFwyXDMwNFw1XDE2MFwxXDMwNFw0NFwxNjAiKwotICAgICJcMVwzMDdcMVwwXDFcMzEwXDFcMzExXDFcMzEyXDFcMzEwXDNcMzEyXDFcMzEwIisKLSAgICAiXDFcMzA3XDFcMzEzXDFcMzE0XDNcMzEyXDFcMzA3XDFcMzEyXDFcMzE0XDZcMzEyIisKLSAgICAiXDFcMzA3XDMyXDMxMlwyXDMwN1wxXDMxMlwyXDE2MlwxXDBcNjZcMTYyXDFcMCIrCi0gICAgIlwxNlwxNjJcMVwzMTVcNDVcMTYyXDdcMFwxXDMxNlwyMVwwXDFcMzE3XDQyXDAiKwotICAgICJcMVwxNzJcMlwwXDFcNDBcM1wwXDFcMTcyXDVcMFwxXDE3Mlw2XDQwIisKLSAgICAiXDFcMFwxM1w0MFwxXDBcN1w0MFwxXDBcM1w0MFwxXDBcM1w0MCIrCi0gICAgIlwxXDBcMVw0MFwxXDMyMFwxXDBcM1wzMjBcMVwzMjFcM1wxNzNcMVwzMjAiKwotICAgICJcMVwwXDFcMzIwXDFcMzIxXDFcMTczXDFcMzIwXDFcMFwyXDMyMFwxXDMyMSIrCi0gICAgIlw2XDE3M1wxXDMyMFwxM1wxNzNcMVwzMjBcN1wxNzNcMVwzMjBcM1wxNzNcMVwzMjIiKwotICAgICJcNVwxNzNcMTVcMFwxXDMyM1w2XDBcMVwzMjRcNDJcMFwxXDMyMFwxXDAiKwotICAgICJcM1wzMjBcMVwzMjFcM1wxNzVcMVwzMjBcMVwwXDFcMzIwXDFcMzIxXDFcMTc1IisKLSAgICAiXDFcMzIwXDFcMFwyXDMyMFwxXDMyMVw2XDE3NVwxXDMyMFwxM1wxNzVcMVwzMjAiKwotICAgICJcN1wxNzVcMVwzMjBcM1wxNzVcMVwzMjVcNVwxNzVcMzFcMFwxXDMxN1wzN1wwIisKLSAgICAiXDFcMzI2XDY2XDBcMVwzMjdcNzJcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw0XDU3XDJcMzMwXDFcMFwxM1w1N1wxXDBcN1w1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDBcNFw1NyIrCi0gICAgIlwxXDMzMFwxXDMzMVwxXDBcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTciKwotICAgICJcMVwwXDEzXDU3XDFcMFwxXDU3XDFcMzMyXDVcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDVcNTdcMVwyMTBcMVwwXDdcMjEwXDFcMjEyXDU1XDIxMFwxXDIxMyIrCi0gICAgIlwxXDBcMTFcMjEzXDFcMjEyXDUzXDIxM1wxXDIyMFwxXDBcN1wyMjBcMVwyMjIiKwotICAgICJcNTVcMjIwXDFcMjIzXDFcMFwxMVwyMjNcMVwyMjJcNTNcMjIzXDFcMjI3XDFcMCIrCi0gICAgIlw3XDIyN1wxXDIzMVw1NVwyMjdcMVwyMzJcMVwwXDExXDIzMlwxXDIzMVw1M1wyMzIiKwotICAgICJcMzJcMFwxXDMzM1wzMFwwXDFcMzMzXDQwXDBcMVwzMzRcMTNcMFwxXDMzNCIrCi0gICAgIlw1NFwwXDFcMzM1XDEwXDBcMVwzMzVcNTdcMFwxXDMzNlwxNFwwXDFcMzM2IisKLSAgICAiXDcyXDBcMVwzMzdcNFwwXDFcMjQ1XDFcMFw3XDI0NVwxXDI0N1w1NVwyNDUiKwotICAgICJcMVwyNTBcMVwwXDFcMjUxXDFcMzQwXDFcMjUwXDFcMjUxXDNcMjUwXDFcMjUxIisKLSAgICAiXDFcMjUwXDFcMjQ3XDFcMjUxXDVcMjUwXDFcMjUxXDQ0XDI1MFwxXDI1MVwxXDAiKwotICAgICJcMTFcMjUxXDFcMjQ3XDUzXDI1MVwxXDI1MFwxXDBcMVwyNTFcMVwzNDBcMVwyNTAiKwotICAgICJcMVwyNTFcM1wyNTBcMVwyNTFcMVwyNTBcMVwzNDFcMVwyNTFcNVwyNTBcMVwyNTEiKwotICAgICJcNDRcMjUwXDEzXDBcMVwzNDJcNTNcMFwxXDI1MVwxXDBcMTFcMjUxXDFcMzQxIisKLSAgICAiXDUzXDI1MVwxMVwyNjFcMVwyNjNcNTVcMjYxXDEzXDI2NFwxXDI2M1w1M1wyNjRcMVwyNzEiKwotICAgICJcMVwwXDdcMjcxXDFcMjczXDU1XDI3MVwxXDI3NFwxXDBcMVwyNzVcMVwzNDMiKwotICAgICJcMVwyNzRcMVwyNzVcM1wyNzRcMVwyNzVcMVwyNzRcMVwyNzNcMVwyNzVcNVwyNzQiKwotICAgICJcMVwyNzVcNDRcMjc0XDFcMjc1XDFcMFwxMVwyNzVcMVwyNzNcNTNcMjc1XDFcMjc0IisKLSAgICAiXDFcMFwxXDI3NVwxXDM0M1wxXDI3NFwxXDI3NVwzXDI3NFwxXDI3NVwxXDI3NCIrCi0gICAgIlwxXDM0NFwxXDI3NVw1XDI3NFwxXDI3NVw0NFwyNzRcMTNcMFwxXDM0NVw1M1wwIisKLSAgICAiXDFcMjc1XDFcMFwxMVwyNzVcMVwzNDRcNTNcMjc1XDJcMTUzXDFcMFwyNlwxNTMiKwotICAgICJcMVwzNDZcMzVcMTUzXDFcMzA0XDFcMFw3XDMwNFwxXDMwNlw1NVwzMDRcMVwzMDciKwotICAgICJcMVwwXDFcMzEwXDFcMzQ3XDFcMzA3XDFcMzEwXDNcMzA3XDFcMzEwXDFcMzA3IisKLSAgICAiXDFcMzA2XDFcMzEwXDVcMzA3XDFcMzEwXDQ0XDMwN1wxXDMxMFwxXDBcMTFcMzEwIisKLSAgICAiXDFcMzA2XDUzXDMxMFwxXDMwN1wxXDBcMVwzMTBcMVwzNDdcMVwzMDdcMVwzMTAiKwotICAgICJcM1wzMDdcMVwzMTBcMVwzMDdcMVwzNTBcMVwzMTBcNVwzMDdcMVwzMTBcNDRcMzA3IisKLSAgICAiXDEzXDBcMVwzNTFcNTNcMFwxXDMxMFwxXDBcMTFcMzEwXDFcMzUwXDUzXDMxMCIrCi0gICAgIlwyXDE2MlwxXDBcMjZcMTYyXDFcMzUyXDM1XDE2Mlw3XDBcMVwzNTNcMTExXDAiKwotICAgICJcMVwzNTRcMzRcMFwxXDMyMFwxXDBcMTBcMzIwXDFcMFw0XDMyMFwxXDAiKwotICAgICJcNDFcMzIwXDFcMFw2XDMyMFwxXDBcM1wzMjBcMVwzMjFcNFwzMjBcMVwwIisKLSAgICAiXDFcMzIwXDFcMzIxXDJcMzIwXDFcMFwyXDMyMFwxXDMyMVwzNlwzMjBcMVwzNTUiKwotICAgICJcNVwzMjBcMTVcMFwxXDMyM1w0M1wwXDFcMzU2XDIyXDBcMVwzNTdcMTRcMCIrCi0gICAgIlwzXDM1N1wyXDBcMVwzNTdcMTBcMFwxXDM1N1wxXDBcMlwzNTdcM1wwIisKLSAgICAiXDFcMzU3XDJcMFwyXDM1N1wxMVwwXDFcNTdcMVwzNjBcMVw1N1w0XDAiKwotICAgICJcMVw1N1w1XDBcNlw1N1wxXDBcMTNcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDZcNTdcMVwwXDExXDU3XDFcMzYxXDFcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcMzVcMFwxXDM2MlwxM1wwXDFcMzYyXDQ0XDAiKwotICAgICJcMlwzNjNcNjNcMFwyXDM2NFw3NVwwXDFcMzY1XDEzXDBcMVwzNjVcNDRcMCIrCi0gICAgIlwyXDM2Nlw0MVwwXDJcMzY3XDFcMFwzXDM2N1wyXDBcMVwyNTRcNFwzNjciKwotICAgICJcMVwwXDEwXDM2N1wxXDBcMzJcMzY3XDJcMFwxXDM2N1wzXDBcMlwzNzAiKwotICAgICJcMVwwXDNcMzcwXDJcMFwxXDMwMFw0XDM3MFwxXDBcMTBcMzcwXDFcMCIrCi0gICAgIlwzMlwzNzBcMlwwXDFcMzcwXDJcMTUzXDFcMFwyN1wxNTNcMVwzNzFcMzRcMTUzIisKLSAgICAiXDNcMFwyXDM3MlwxXDBcM1wzNzJcMlwwXDFcMzEzXDRcMzcyXDFcMCIrCi0gICAgIlwxMFwzNzJcMVwwXDMyXDM3MlwyXDBcMVwzNzJcMlwxNjJcMVwwXDI3XDE2MiIrCi0gICAgIlwxXDM3M1wzNFwxNjJcMzNcMFwxXDM3NFwxMTRcMFwxXDM1NVwyMlwwXDFcMzU3IisKLSAgICAiXDE0XDBcM1wzNTdcMlwwXDFcMzU3XDEwXDBcMVwzNTdcMVwwXDJcMzU3IisKLSAgICAiXDNcMFwxXDM1N1wxXDBcMVwzNTZcMlwzNTdcMTFcMFwzXDU3XDRcMCIrCi0gICAgIlwxXDU3XDVcMFw2XDU3XDFcMFw3XDU3XDFcMzc1XDNcNTdcMVwwIisKLSAgICAiXDdcNTdcMVwwXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwIisKLSAgICAiXDFcNTdcNVwwXDZcNTdcMVwwXDZcNTdcMVwzNzZcNFw1N1wxXDAiKwotICAgICJcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1w0NlwwXDFcMzc3XDVcMCIrCi0gICAgIlwxXDM3N1w1NFwwXDFcdTAxMDBcNjNcMFwxXHUwMTAxXDEwXDBcMVx1MDEwMVw1NVwwIisKLSAgICAiXDFcdTAxMDJcMTBcMFwxXHUwMTAyXDYwXDBcMVx1MDEwM1wyNFwwXDJcMTUzXDFcMCIrCi0gICAgIlwzMFwxNTNcMVx1MDEwNFwzM1wxNTNcMlwxNjJcMVwwXDMwXDE2MlwxXHUwMTA1XDMzXDE2MiIrCi0gICAgIlwzNFwwXDFcdTAxMDZcNDBcMFwzXDU3XDRcMFwxXDU3XDVcMFw2XDU3IisKLSAgICAiXDFcMFwxM1w1N1wxXDBcM1w1N1wxXHUwMTA3XDNcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTciKwotICAgICJcMVwwXDNcNTdcMVx1MDEwOFw3XDU3XDFcMFwzXDU3XDFcdTAxMDhcM1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcNVw1N1w0N1wwXDFcdTAxMDlcNjBcMFwxXHUwMTBhIisKLSAgICAiXDE0XDBcMVx1MDEwYVw1NFwwXDFcdTAxMGJcNDdcMFwyXHUwMTBjXDcyXDBcMVx1MDEwZCIrCi0gICAgIlwzMFwwXDFcdTAxMGRcM1wwXDJcMTUzXDFcMFwzMVwxNTNcMVx1MDEwZVwzMlwxNTMiKwotICAgICJcMlwxNjJcMVwwXDMxXDE2MlwxXHUwMTBmXDMyXDE2MlwzNVwwXDFcdTAxMTBcMzdcMCIrCi0gICAgIlwzXDU3XDRcMFwxXDU3XDVcMFw2XDU3XDFcMFwxM1w1N1wxXDAiKwotICAgICJcNlw1N1wxXHUwMTExXDFcMFwzXDU3XDFcMFw1XDU3XDVcMFwxXHUwMTEyIisKLSAgICAiXDNcNTdcM1wwXDFcdTAxMTJcMVw1N1w0XDBcMVx1MDExMlw2XDU3XDFcMCIrCi0gICAgIlwxM1w1N1wxXDBcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1wzN1wwIisKLSAgICAiXDFcdTAxMTNcMTBcMFwxXHUwMTEzXDUzXDBcMVx1MDExNFwxM1wwXDFcdTAxMTRcNTJcMCIrCi0gICAgIlwxXHUwMTE1XDEzXDBcMVx1MDExNVwxNVwwXDJcMTUzXDFcMFwzMlwxNTNcMVx1MDExNiIrCi0gICAgIlwzMVwxNTNcMlwxNjJcMVwwXDMyXDE2MlwxXHUwMTE3XDMxXDE2MlwzNFwwXDFcdTAxMTgiKwotICAgICJcNDBcMFwzXDU3XDRcMFwxXDU3XDVcMFw1XDU3XDFcdTAxMTlcMVwwIisKLSAgICAiXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDVcMCIrCi0gICAgIlwxXHUwMTEyXDZcMFwxXHUwMTEyXDVcMFwxXHUwMTEyXDQ0XDBcMlwxNTNcMVwwIisKLSAgICAiXDMxXDE1M1wxXHUwMTFhXDMyXDE1M1wyXDE2MlwxXDBcMzFcMTYyXDFcdTAxMWJcMzJcMTYyIisKLSAgICAiXDMxXDBcMVx1MDExY1w0M1wwXDNcNTdcNFwwXDFcNTdcNVwwXDZcNTciKwotICAgICJcMVwwXDVcNTdcMVx1MDExZFw1XDU3XDFcMFw3XDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw1XDU3XDJcMTUzXDFcMFwyNlwxNTNcMVx1MDExZVwzNVwxNTNcMlwxNjIiKwotICAgICJcMVwwXDI2XDE2MlwxXHUwMTFmXDM1XDE2Mlw2XDBcM1w1N1w0XDBcMVw1NyIrCi0gICAgIlw1XDBcNlw1N1wxXDBcN1w1N1wxXHUwMTIwXDNcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDZcNTdcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw0XDU3XDFcdTAxMjFcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDZcNTdcMVwwXDVcNTdcMVx1MDEyMlw1XDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw2XDU3XDFcMFw1XDU3XDFcdTAxMjNcNVw1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNlw1N1wxXDBcMTNcNTdcMVwwXDNcNTdcMVx1MDEyNFwzXDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3IjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICA5LCAgOSwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDksICA5LCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDAsICA5LCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAKLSAgICAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDEsIAotICAgICAxLCAgOSwgIDAsICAwLCAgOSwgIDksICA5LCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMSwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgCi0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgIDAsICAwLCAgMCwgIDksICA5LCAgMSwgIDEsICAwLCAKLSAgICAgMSwgIDEsICA5LCAgOSwgIDksICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvLyBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIC8vIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsKLSAKLQkvLyByZXF1aXJlZCBob2xkZXJzIGZvciB3aGl0ZS1zcGFjZSBjb21wYWN0aW5nCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOwotCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBzdGFydCA9IDA7Ci0JcHJpdmF0ZSBpbnQgdGV4dExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCS8vIG9mZnNldCBmb3IgdHJhY2tpbmcgcG9zaXRpb24gc3BlY2lmaWMgYmxvY2sgdGFncwotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOwotCQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBiZWluZyBvcGVuZWQKLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCi0JLy8gdGhlIGxpc3Qgb2YgdGFnIG5hbWUgQmxvY2tNYXJrZXJzCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gbmV3IFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkoKTsKLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkKLQkJcmV0dXJuOwotCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7Ci0JCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQotCQkJCWJsb2Nrcy5yZW1vdmUoKTsKLQkJfQotCX0KLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsKLQlyZXR1cm4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhib29sZWFuIG5ld1ZhbHVlKSB7Ci0JZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gbmV3VmFsdWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dCgpIHsKLQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gbWFya2VyLmdldENvbnRleHQoKTsKLQl9Ci0JcmV0dXJuIEJMT0NLX1RFWFQ7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCXJldHVybiBmQmxvY2tNYXJrZXJzOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOwotfQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoKSB7Ci0JcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgewotCWJlZ2luQmxvY2tNYXJrZXJTY2FuKG5ld1RhZ05hbWUsIEJMT0NLX1RFWFQpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICoKLSAqIFNwZWNpYWwgdG9rZW5pemVyIHNldHVwLiAgQWxsb3dzIHRva2VuaXphdGlvbiB0byBiZSBpbml0aWF0ZWQgYXQgdGhlCi0gKiBzdGFydCBvZiBhIHRleHQgYmxvY2sgd2l0aGluIGEgIm5ld1RhZ05hbWUiIHRhZy4KLSAqCi0gKiBFeGFtcGxlOiAKLSAqCVRva2VuaXplciB0b2tlciA9IG5ldyBUb2tlbml6ZXIoKTsKLSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7Ci0gKgl0b2tlci5yZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoImFmaXVocXdrZWpodGFzaWhnYWxrd2h0cTwvc2NyaXB0ZXI+PC9zY3I+PC9zY3JpcHQ+YXNnZGFzZ2EiKSk7Ci0gKgl0b2tlci5iZWdpbkJsb2NrTWFya2VyU2Nhbigic2NyaXB0IiwgQkxPQ0tfVEVYVCk7Ci0gKgl0b2tlci5nZXRSZWdpb25zKCk7IAotICoKLSAqIFJldHVybnM6Ci0gKglCTE9DS19URVhUOiAwLTQwCi0gKglYTUxfRU5EX1RBR19PUEVOOiA0MS00MgotICoJWE1MX1RBR19OQU1FOiA0My00OAotICoJWE1MX1RBR19DTE9TRTogNDktNDkKLSAqCVhNTF9DT05URU5UOiA1MC01NwotICoKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBibG9ja2NvbnRleHQpIHsKLQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOwotfQotLyoqCi0gKiBNZXRob2QgZG9TY2FuLgotICogCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcgotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcKLSAqIAotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIgotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicKLSAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGNvbnRleHQgb2YgdGhlIHNjYW5uZWQgcmVnaW9uIGlmIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBhYm9ydFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSBzZWFyY2hTdHJpbmcgd2FzIGZvdW5kIGltbWVkaWF0ZWx5Ci0gKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBjb250ZXh0IGZvdW5kOiB0aGUgZGVzaXJlZCBjb250ZXh0IG9uIGEgbm9uLXplcm8gbGVuZ3RoIG1hdGNoLCB0aGUgYWJvcnRDb250ZXh0IG9uIGltbWVkaWF0ZSBzdWNjZXNzCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYm9vbGVhbiBzdGlsbFNlYXJjaGluZyA9IHRydWU7Ci0JLy8gRGlzYWJsZSBmdXJ0aGVyIGJsb2NrIChwcm9iYWJseSkKLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlpbnQgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aCgpOwotCWludCBuID0gMDsKLQljaGFyIGxhc3RDaGVja0NoYXI7Ci0JaW50IGk7Ci0JYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7Ci0JCW4gPSAwOwotCQkvLyBFbnN1cmUgdGhhdCBlbm91Z2ggZGF0YSBmcm9tIHRoZSBpbnB1dCBleGlzdHMgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzZWFyY2ggU3RyaW5nLgotCQluID0geXlfYWR2YW5jZSgpOwotCQl3aGlsZShuICE9IFlZRU9GICYmIHl5X2N1cnJlbnRQb3MgPCBzZWFyY2hTdHJpbmdMZW5ndGgpCi0JCQluID0geXlfYWR2YW5jZSgpOwotCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5LgotCQlpZiAobiA9PSBZWUVPRikgewotCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXNhbWUgPSB0cnVlOwotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQKLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4KLQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyCi0JCQkvLyBhbmQgc2VlIGlmIGl0IG1hdGNoZXMKLQkJCQotCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3NlcyAoeXlfY3VycmVudFBvcyBpcyB0aGUgKmxhc3QqIGNoYXJhY3RlciB3ZSBjYW4gY2hlY2sgYWdhaW5zdCkKLQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCWZvcihpID0gMDsgaSA8IHNlYXJjaFN0cmluZ0xlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmKHNhbWUgJiYgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsKLQkJCQkJZWxzZSBpZihzYW1lICYmICFmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQlzYW1lID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0pID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzZWFyY2hTdHJpbmcuY2hhckF0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBzYWZldHkgY2hlY2sgZmFpbGVkOyBubyBtYXRjaCBpcyBwb3NzaWJsZSByaWdodCBub3cKLQkJCWVsc2UgewotCQkJCXNhbWUgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgY2xvc2UgdGFncyB0byBlbnN1cmUgdGhhdCB0YXJnZXRTdHJpbmc9Ijwvc2NyaXB0IiBkb2Vzbid0IG1hdGNoCi0JCQkJLy8gIjwvc2NyaXB0UyIKLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOwotCQkJCS8vIFN1Y2NlZWQgb24gIjwvc2NyaXB0PiIgYW5kICI8L3NjcmlwdCAiCi0JCQkJaWYobGFzdENoZWNrQ2hhciA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsYXN0Q2hlY2tDaGFyKSkKLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCWlmIChuICE9IFlZRU9GIHx8IHNhbWUpIHsKLQkJLy8gV2UndmUgc3RvcHBlZCBzaG9ydCBvZiB0aGUgZW5kIG9yIGRlZmluaXRlbHkgZm91bmQgYSBtYXRjaAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJLy8gSWYgdGhlIHNlYXJjaFN0cmluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCQlpZiAoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJeXliZWdpbihpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsKLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8vIFdlIHJhbiB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBpbnB1dAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQl5eV9jdXJyZW50UG9zKys7Ci0JfQotCXl5YmVnaW4oZXhpdFN0YXRlKTsKLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCXJldHVybiBzZWFyY2hDb250ZXh0OwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICoKLSAqIEEgZ2VuZXJpYyBsb29rYWhlYWQtbGlrZSBvcGVyYXRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1NjYW4oU3RyaW5nIHRhcmdldCwgU3RyaW5nIHRhcmdldENvbnRleHQsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJldHVybiBkb1NjYW4odGFyZ2V0LCBmYWxzZSwgdGFyZ2V0Q29udGV4dCwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUKLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOwotCXJldHVybiBkb1NjYW4oIjwvIiArIGZDdXJyZW50VGFnTmFtZSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSksIFlZSU5JVElBTCwgWVlJTklUSUFMKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkKLSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlCi0gKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuCi0gKgotICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQotICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZAotICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykKLQlpZiAoZlNob3VsZExvYWRCdWZmZXJlZCkgewotCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCX0KLQllbHNlIHsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJZWxzZQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlzdGFydCA9IHl5Y2hhcjsKLQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCWlmICh5eV9hdEVPRikgewotCQkJZlRva2VuQ291bnQrKzsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuCi0JZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCWlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJZWxzZQotCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCX0KLQllbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQl9Ci0JZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsKLQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCWlmIChmQnVmZmVyZWRDb250ZXh0ID09IFdISVRFX1NQQUNFKSB7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsKLQl9Ci0JaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkvLyBFT0YKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRpc2NvdmVyZWQgIiArIGZUb2tlbkNvdW50ICsgIiB0b2tlbnMuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCWZUb2tlbkNvdW50Kys7Ci0JcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIGZDdXJyZW50VGFnTmFtZSk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFhNTFRva2VuaXplcigpewotCXN1cGVyKCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFhNTFRva2VuaXplcihjaGFyW10gY2hhckFycmF5KXsKLQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXksIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgewotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgbmV3T2Zmc2V0KTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbikgewotCXJlc2V0KGluLCAwKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgKgotICoKLSAqIFJlc2V0IGludGVybmFsIGNvdW50ZXJzIGFuZCB2YXJzIHRvICJuZXdseSBjcmVhdGVkIiB2YWx1ZXMsIGluIHRoZSBob3BlcwotICogdGhhdCByZXNldHRpbmcgYSBwcmUtZXhpc3RpbmcgdG9rZW5pemVyIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4KLSAqCi0gKiBUaGlzIG1ldGhvZCBjb250YWlucyBjb2RlIGJsb2NrcyB0aGF0IHdlcmUgZXNzZW50aWFsbHkgZHVwbGljYXRlZCBmcm9tIHRoZQotICogPGVtPmdlbmVyYXRlZDwvZW0+IG91dHB1dCBvZiB0aGlzIHNwZWNpZmljYXRpb24gYmVmb3JlIHRoaXMgbWV0aG9kIHdhcwotICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuCi0gKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigicmVzZXR0aW5nIHRva2VuaXplciIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZk9mZnNldCA9IG5ld09mZnNldDsKLQotCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQl5eV9yZWFkZXIgPSBpbjsKLQotCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQl5eV9zdGF0ZSA9IDA7Ci0KLQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JeXlfbWFya2VkUG9zID0gMDsKLQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JeXlfY3VycmVudFBvcyA9IDA7Ci0KLQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQl5eV9zdGFydFJlYWQgPSAwOwotCi0JLyoqIAotCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCSAqIGZyb20gaW5wdXQgCi0JICovCi0JeXlfZW5kUmVhZCA9IDA7Ci0KLQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQl5eWxpbmUgPSAwOwotCi0JLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JeXljaGFyID0gMDsKLQotCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQl5eV9hdEVPRiA9IGZhbHNlOwotCi0JLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0JLyogdXNlciB2YXJzOiAqLwotCWZUb2tlbkNvdW50ID0gMDsKLSAKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCWZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQotCWNvbnRleHQgPSBudWxsOwotCXN0YXJ0ID0gMDsKLQl0ZXh0TGVuZ3RoID0gMDsKLQlsZW5ndGggPSAwOwotfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqLwotCXB1YmxpYyBCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpIHsKLQkJWE1MVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IFhNTFRva2VuaXplcigpOwotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIAotCQkvLyBhcmUgbmV2ZXIgZGVzdHJveWVkIChlLmcuICdyZWxlYXNlJykKLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsKLQkJCWlmKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhblhNTENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkvLyAgIFhNTF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfWE1MX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQlyZXR1cm4gZG9TY2FuKCItLT4iLCBmYWxzZSwgWE1MX0NPTU1FTlRfVEVYVCwgU1RfWE1MX0NPTU1FTlRfRU5ELCBTVF9YTUxfQ09NTUVOVF9FTkQpOwotfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB5eV91bnBhY2soU3RyaW5nIHBhY2tlZCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbMTEwNTVdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDM3MzQpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzcyKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcgotICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKGNoYXJbXSBtYXJrZXJUYWdOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgdGFnbmFtZUxlbmd0aCkgewotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWZCbG9ja01hcmtlcnMuZ2V0KGopOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5sZW5ndGgoKSA9PSB0YWduYW1lTGVuZ3RoKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0YWduYW1lTGVuZ3RoICYmIG1hdGNoZXNTb0ZhcjsgaSsrKSB7Ci0JCQkJCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXNTb0ZhcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICoKLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0Ci0JICogTm90ZTogZm9yIHZlcmlmaWNhdGlvbiB1c2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgewotCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJd2hpbGUocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdG9rZW5zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogaW5wdXQgY291bGQgbm90IGJlIHRva2VuaXplZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldE9mZnNldCgpLCBlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU2luY2UgdGhpcyBpcyBjb252ZW5pZW5jZSBtZXRob2QgYW5kIE5PVCB0aGUgcmVjb21tZW5kZWQgCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbm90IGhhbmRsZWQgcmV0cmlldmluZyByZWdpb25zOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wKFN0cmluZyBzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHMgKyAiICgiICsgeXljaGFyICsgIi0iICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkoeXlsZW5ndGgoKSArIHl5Y2hhcikgKyAiKTpcJyIgKy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHl5X2F0RU9GOwotCX0KLS8qIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkICovCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoU3RyaW5nIG1hcmtlclRhZ05hbWUpIHsKLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAvLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYgotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID4gMCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjkxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYU0wgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMjkzOiBicmVhazsKLSAgICAgICAgY2FzZSAyODM6IAotICAgICAgICBjYXNlIDI4NTogCi0gICAgICAgIGNhc2UgMjg2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOwotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyOTU6IGJyZWFrOwotICAgICAgICBjYXNlIDI3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk3OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7Ci0gfQotICAgICAgICBjYXNlIDI5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOwotIH0KLSAgICAgICAgY2FzZSAyOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MzogCi0gICAgICAgIGNhc2UgMjczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DSEFSX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzAyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTU6IAotICAgICAgICBjYXNlIDIxNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMwMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfQ0RBVEFfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAzMDY6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSAzMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MDogCi0gICAgICAgIGNhc2UgMTc0OiAKLSAgICAgICAgY2FzZSAxODI6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsKLSB9Ci0gICAgICAgIGNhc2UgMzA4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDg6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gWE1MX0VNUFRZX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMjogCi0gICAgICAgICAgeyAKLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMxMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMTI6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMDogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMxMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9QSSk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzE0OiBicmVhazsKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE1OiBicmVhazsKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMTY6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE4OiBicmVhazsKLSAgICAgICAgY2FzZSA1MTogCi0gICAgICAgIGNhc2UgNTI6IAotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgICB7IAotCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQKLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7Ci0gfQotICAgICAgICBjYXNlIDMxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7Ci0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIwOiBicmVhazsKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgIGNhc2UgNDc6IAotICAgICAgICBjYXNlIDQ4OiAKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMjE3OiAKLSAgICAgICAgY2FzZSAyMzk6IAotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgIGNhc2UgMjUyOiAKLSAgICAgICAgY2FzZSAyNTM6IAotICAgICAgICBjYXNlIDI2MjogCi0gICAgICAgIGNhc2UgMjcyOiAKLSAgICAgICAgY2FzZSAyODA6IAotICAgICAgICBjYXNlIDI4NDogCi0gICAgICAgIGNhc2UgMjg3OiAKLSAgICAgICAgY2FzZSAyODg6IAotICAgICAgICBjYXNlIDI4OTogCi0gICAgICAgIGNhc2UgMjkwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSAzMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMjM6IGJyZWFrOwotICAgICAgICBjYXNlIDA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICBjYXNlIDEyNDogCi0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgY2FzZSAyMDg6IAotICAgICAgICBjYXNlIDIzNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzI2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMjI5OiAKLSAgICAgICAgY2FzZSAyNDg6IAotICAgICAgICBjYXNlIDI1OTogCi0gICAgICAgIGNhc2UgMjY5OiAKLSAgICAgICAgY2FzZSAyNzc6IAotICAgICAgICBjYXNlIDI4MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzI3OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAxMTQ6IAotICAgICAgICBjYXNlIDIwNDogCi0gICAgICAgIGNhc2UgMjMzOiAKLSAgICAgICAgY2FzZSAyNTA6IAotICAgICAgICBjYXNlIDI2MDogCi0gICAgICAgIGNhc2UgMjcwOiAKLSAgICAgICAgY2FzZSAyNzg6IAotICAgICAgICBjYXNlIDI4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzI5OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgIGNhc2UgNTQ6IAotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDg4OiAKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDkzOiAKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgMTAzOiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgMzMwOiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JU3RyaW5nIGJsb2NrQ29udGV4dCA9IGRvQmxvY2tTY2FuKCJdXT4iLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkCi0JaWYoYmxvY2tDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQotCQl5eWJlZ2luKFNUX0NEQVRBX0VORCk7Ci0JcmV0dXJuIGJsb2NrQ29udGV4dDsKLSB9Ci0gICAgICAgIGNhc2UgMzMxOiBicmVhazsKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzMyOiBicmVhazsKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzMzOiBicmVhazsKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgY2FzZSAxNDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM1OiBicmVhazsKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzM4OiBicmVhazsKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgY2FzZSAxNTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMzk6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzNDA6IGJyZWFrOwotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDM0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTI6IAotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgY2FzZSA5NTogCi0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDE2NjogCi0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgY2FzZSAxNzA6IAotICAgICAgICBjYXNlIDE3MTogCi0gICAgICAgIGNhc2UgMjI0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0gfQotICAgICAgICBjYXNlIDM0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDk5OiAKLSAgICAgICAgY2FzZSAxMDA6IAotICAgICAgICBjYXNlIDEwMTogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0gfQotICAgICAgICBjYXNlIDM0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxMDQ6IAotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgIGNhc2UgMTg2OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgY2FzZSAyMjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzNDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEwODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzNDU6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTExOiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICBjYXNlIDE5NzogCi0gICAgICAgIGNhc2UgMTk4OiAKLSAgICAgICAgY2FzZSAyMDE6IAotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgIGNhc2UgMjMxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzNDY6IGJyZWFrOwotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDM0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzQ4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgICAgeyAKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JIH0KLSAgICAgICAgY2FzZSAzNDk6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlRXF1YWxzUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZUVxdWFsc1JlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZkZDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlRXF1YWxzUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRXF1YWxzUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotCXByaXZhdGUgc2hvcnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBBdHRyaWJ1dGVFcXVhbHNSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIGxlbmd0aDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IChzaG9ydCkgcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlTmFtZVJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzQxNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlTmFtZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQkvLyBzcGVjaWZ5IGNvcnJlY3QgdHlwZQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCXB1YmxpYyBBdHRyaWJ1dGVOYW1lUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVOYW1lUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQl9Ci0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlVmFsdWVSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlVmFsdWVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiYmJiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZVZhbHVlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlVmFsdWVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCi0JcHVibGljIEF0dHJpYnV0ZVZhbHVlUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJZlRleHRMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCX0KLQkJCS8vIHVwZGF0ZSBsZW5ndGggKGFuZCBlbmQpIGFmdGVyIGFib3ZlIGNoZWNrIGZvciB3aGl0ZSBzcGFjZSwKLQkJCS8vIHNpbmNlCi0JCQkvLyBpdCBsb29rcyB0byBkZXRlcm1pbmUgaWYgYXQgZW5kIG9mIHJlZ2lvbi4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VtcHR5VGFnQ2xvc2VSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvRW1wdHlUYWdDbG9zZVJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzlkNjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvRW1wdHlUYWdDbG9zZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBFbXB0eVRhZ0Nsb3NlUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXByaXZhdGUgaW50IGZMZW5ndGggPSAyOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAyOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRTsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBFbXB0eVRhZ0Nsb3NlUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBFbXB0eVRhZ0Nsb3NlUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JCWlmIChmVGV4dExlbmd0aCAhPSB0ZXh0TGVuZ3RoKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgZm9yIHRoaXMgcmVnaW9uIHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9FbmRUYWdPcGVuUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VuZFRhZ09wZW5SZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkNTU0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VuZFRhZ09wZW5SZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEVuZFRhZ09wZW5SZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAyOwotCi0KLQlwdWJsaWMgRW5kVGFnT3BlblJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRW5kVGFnT3BlblJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWlmIChmVGV4dExlbmd0aCAhPSB0ZXh0TGVuZ3RoKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgZm9yIHRoaXMgcmVnaW9uIHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBFbmRUYWdPcGVuUmVnaW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotLy8JCWZUZXh0TGVuZ3RoICs9IDE7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotLy8JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0dlbmVyaWNUZW1wbGF0ZVJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjA2NGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMganVzdCBwcmVzZW50IHRvIHNlcnZlciBhcyBhCi0gKiBnZW5lcmljIHN0YXJ0aW5nIHBvaW50IGZvciBhZGRpbmcgbmV3IHNwZWNpZmljIHJlZ2lvbiB0eXBlcy4KLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljVGVtcGxhdGVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCi0JcHVibGljIEdlbmVyaWNUZW1wbGF0ZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY1RlbXBsYXRlUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25Ub1N0cmluZ1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVG9TdHJpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNzgzZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25Ub1N0cmluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgUmVnaW9uVG9TdHJpbmdVdGlsIHsKLQlzdGF0aWMgcHVibGljIFN0cmluZyB0b1N0cmluZyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHJlZ2lvbi5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSBzaG9ydENsYXNzTmFtZSArICItLT4gIiArIHJlZ2lvbi5nZXRUeXBlKCkgKyAiOiAiICsgcmVnaW9uLmdldFN0YXJ0KCkgKyAiLSIgKyByZWdpb24uZ2V0VGV4dEVuZCgpICsgKHJlZ2lvbi5nZXRUZXh0RW5kKCkgIT0gcmVnaW9uLmdldEVuZCgpID8gKCIvIiArIHJlZ2lvbi5nZXRFbmQoKSkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVXBkYXRlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25VcGRhdGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2QwOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25VcGRhdGVSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHRvIGNlbnRyYWxpemUgJ3JlZ2lvbicgdXBkYXRlLiBOb3RlOiBjYXJlIG11c3QgYmUKLSAqIHRha2VuIHRoYXQgaXMgaXMgbm90IHVzZWQgZm9yIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9yIGNvbnRhaW5lcgotICogcmVnaW9ucywgaXRzIG9ubHkgZm9yICJ0b2tlbiByZWdpb25zIgotICogIAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uVXBkYXRlUnVsZSB7Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gYWxsTGV0dGVyT3JEaWdpdChTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkvLyBUT19ET19GVVRVUkU6IGNoZWNrIHRoYXQgYSBKYXZhIExldHRlciBvciBEaWdpdCBpcwotCQkJLy8gdGhlIHNhbWUgdGhpbmcgYXMgYW4gWE1MIGxldHRlciBvciBkaWdpdAotCQkJaWYgKCEoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaGFuZ2VzLmNoYXJBdChpKSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gYWxsV2hpdGVTcGFjZShTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhbmdlcy5jaGFyQXQoaSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KElUZXh0UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBjYW5IYW5kbGVBc0xldHRlck9yRGlnaXQocmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSBub24td2hpdGUgc3BhY2UgYXJlYQotCQlpZiAoKHJlcXVlc3RTdGFydCA8PSAocGFyZW50LmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkpICYmIChhbGxMZXR0ZXJPckRpZ2l0KGNoYW5nZXMpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVBc0xldHRlck9yRGlnaXQoSVRleHRSZWdpb24gcmVnaW9uLCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgbm9uLXdoaXRlIHNwYWNlIGFyZWEKLQkJaWYgKChyZXF1ZXN0U3RhcnQgPD0gKHJlZ2lvbi5nZXRUZXh0RW5kKCkpKSAmJiAoYWxsTGV0dGVyT3JEaWdpdChjaGFuZ2VzKSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKElUZXh0UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIHdlIGRvbid0IGV4cGxlY3QgYSBudWxsIHBhcmVudCwgYnV0IGp1c3QgaW4gY2FzZSEKLQkJLy8gKGluIHdoaWNoIGNhc2UsIHdlIG11c3QgYmUgZGVhbGluZyB3aXRoIHJlZ2lvbnMgdGhhdCBhcmUKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykuCi0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBjYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKHJlZ2lvbi5nZXRFbmQoKSA+IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gYWRkIG9uZSB0byBlbmQgb2YgdGV4dCwgYXMgd2UgdXNlZCB0bywgc2luY2Ugd2UKLQkJCS8vIGNoYW5nZSBkZWZpbml0aW9uIG9mIGxlbmd0aCB0byBlcXVhdGUgdG8gb2Zmc2V0IHBsdXMgb25lLgotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTg2NgotCQkJLy8gd2F0Y2ggb3V0IGZvciB3aGl0ZXNwYWNlIGF0IGVuZCBvZiB0ZXh0Ci0JCQlpZiAocmVxdWVzdFN0YXJ0ID49IHBhcmVudC5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUFzV2hpdGVTcGFjZShJVGV4dFJlZ2lvbiByZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIHdlIGFyZSBpbiB0aGUgIndoaXRlIHNwYWNlIiBhcmVhIG9mIGEgcmVnaW9uLCB0aGVuCi0JCS8vIHdlIGRvbid0IHdhbnQgdG8gaGFuZGxlLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkvLyB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uIGlzIGNvbnNpZGVyIGFueXdoZXJlIHRoYXQgd291bGQKLQkJLy8gbGVhdmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoaXMgY2hhcmFjdGVyIGFuZCB0aGUgdGV4dCBwYXJ0LgotCQkvLyBhbmQgb2YgY291cnNlLCB3ZSBjYW4gaW5zZXJ0IHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSByZWdpb24KLQkJLy8KLQkJLy8gaWYgdGhlcmUgaXMgbm8gd2hpdGVzcGFjZSBpbiB0aGlzIHJlZ2lvbiwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIKLQkJaWYgKHJlZ2lvbi5nZXRFbmQoKSA+IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gYWRkIG9uZSB0byBlbmQgb2YgdGV4dCwgYXMgd2UgdXNlZCB0bywgc2luY2Ugd2UKLQkJCS8vIGNoYW5nZSBkZWZpbml0aW9uIG9mIGxlbmd0aCB0byBlcXVhdGUgdG8gb2Zmc2V0IHBsdXMgb25lLgotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTg2NgotCQkJLy8gd2F0Y2ggb3V0IGZvciB3aGl0ZXNwYWNlIGF0IGVuZCBvZiB0ZXh0Ci0JCQlpZiAocmVxdWVzdFN0YXJ0ID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBvaywgd2UgYXJlIGluIHRoZSB3aGl0ZXNwYWNlIHJlZ2lvbiwgc28gd2UgY2FuJ3QgaGFuZGxlLAotCQkJCS8vIHVubGVzcwotCQkJCS8vIHdlIGFyZSBqdXN0IGluc2VydGluZyB3aGl0ZXNwYWNlLgotCQkJCWlmIChhbGxXaGl0ZVNwYWNlKGNoYW5nZXMpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gbmVlZCBhbiBhZGp1c3QgdGV4dCBsZW5ndGggQVBJIGJlZm9yZSB0aGlzIGNhbiBiZSB1c2VkCi0Jc3RhdGljIHB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChJVGV4dFJlZ2lvbiByZWdpb24sIE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgcmVnaW9uLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKHJlZ2lvbi5nZXRTdGFydCgpID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IHJlZ2lvbi5nZXRUZXh0RW5kKCkgLSByZWdpb24uZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQlyZWdpb24uYWRqdXN0TGVuZ3RoKGxlbmd0aERpZmZlcmVuY2UpOwotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UocmVnaW9uLCBwYXJlbnQsIGNoYW5nZXMsIHJlZ2lvbi5nZXRTdGFydCgpLCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJLy8JCQkJcmVnaW9uLmFkanVzdFRleHRMZW5ndGgobGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgcmVnaW9uLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyN2FlNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdDbG9zZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBUYWdDbG9zZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRTsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBUYWdDbG9zZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnQ2xvc2VSZWdpb24oaW50IHN0YXJ0KSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdOYW1lUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ05hbWVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiNTljNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ05hbWVSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnTmFtZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRTsKLQlwcml2YXRlIHNob3J0IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgc2hvcnQgZlRleHRMZW5ndGg7Ci0KLQotCXB1YmxpYyBUYWdOYW1lUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUYWdOYW1lUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSAoc2hvcnQpIHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gKHNob3J0KSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gKHNob3J0KSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdPcGVuUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ09wZW5SZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjYjg1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ09wZW5SZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnT3BlblJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTjsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMTsKLQotCi0JcHVibGljIFRhZ09wZW5SZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRhZ09wZW5SZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKHN0YXJ0LCBsZW5ndGgpOwotCQlpZiAoZlRleHRMZW5ndGggIT0gdGV4dExlbmd0aCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgVGFnT3BlblJlZ2lvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLS8vCQlmVGV4dExlbmd0aCArPSAxOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBmb3IgdGhpcyByZWdpb24gdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvV2hpdGVTcGFjZU9ubHlSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvV2hpdGVTcGFjZU9ubHlSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwYmNjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1doaXRlU3BhY2VPbmx5UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFdoaXRlU3BhY2VPbmx5UmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAwOwotCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRTsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnQ7Ci0KLQlwdWJsaWMgV2hpdGVTcGFjZU9ubHlSZWdpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgcG9zaXRpb24pIHsKLQotCQlyZXR1cm4gZlN0YXJ0IDw9IHBvc2l0aW9uICYmIHBvc2l0aW9uIDwgZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0TGVuZ3RoKHNob3J0IGkpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgY2FsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGNhbGwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogRm9yIHRoaXMgSVRleHRSZWdpb24gdHlwZSwgdGhlIHN0YXJ0IG11c3QgaW4gdGVybXMgb2Ygd2hhdCB0aGUgcmVnaW9uCi0JICogZXhwZWN0cyAuLi4gdGhhdCBpcywgaXRzIG5vdCBkb2N1bWVudCBvZmZzZXQsIGJ1dCBzdGFydCByZWxhdGl2ZSB0bwotCSAqIHdoYXQgZXZlciBjb250YWlucyBpdC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCi0JCX0KLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENEYXRhVGV4dFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDRGF0YVRleHRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkYTk4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENEYXRhVGV4dFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTENEYXRhVGV4dFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCi0KLQlwdWJsaWMgWE1MQ0RhdGFUZXh0UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxDRGF0YVRleHRSZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkvLyBUT0RPOiBzaG91bGRuJ3QgY2RhdGEgYmUgbGlrZSBYTUwgQ29udGVudCAuLi4gbGVuZ3RoIGFuZCB0ZXh0Ci0JCS8vIGxlbmd0aAotCQkvLyBhbHdheXMgYmUgdGhlIHNhbWUsIHJlZ2FyZGxlc3Mgb2Ygd2hpdGVzcGFjZT8KLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBhIHByZXR0eSBsYW1lIG1ldGhvZCwgc2luY2UgWE1MIENEYXRhIHJlZ2lvbiBjYW4gaGF2ZQotCQkvLyBhIG11Y2gKLQkJLy8gYmV0dGVyIHJ1bGUgZm9yIHJlZ2lvbiB1cGRhdGUsIGJ1dCB0aGlzIGlzIHdoYXQgcHJldmlvdXMKLQkJLy8gKHVuZmFjdG9yZWQpCi0JCS8vIHZlcnNpb24gaGFkLCBzbyBJJ2xsIGNhcnJ5IGl0IG92ZXIsIG9mIG5vdy4KLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0KLQkJfQotCQlpZiAoY2FuSGFuZGxlKSB7Ci0JCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgcmVnaW9uLiBXZSB3b24ndCBjcmVhdGUgYQotCQkJLy8gbmV3IGluc3RhbmNlLCB3ZSdsbCBqdXN0IHVwZGF0ZSB0aGUgb25lIHdlIGhhdmUsIGJ5IGNoYW5naW5nCi0JCQkvLyBpdHMgZW5kIHBvc3Rpb24sCi0JCQkvLyBUaGUgcGFyZW50IGZsYXRub2RlLCB1cG9uIHJldHVybiwgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IgdXBkYXRpbmcgc2libGluZyByZWdpb25zLgotCQkJLy8gYW5kIGluIHR1cm4sIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXRzZWxmIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yCi0JCQkvLyB1cGRhdGluZyB0aGUgdGV4dCBzdG9yZSBhbmQgZG93biBzdHJlYW0gZmxhdG5vZGVzLgotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2UgaGFuZGxlZCBieSByZWdpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJLy8gTm90ZTogd2UgYWRqdXN0IGJvdGggZW5kIGFuZCB0ZXh0IGVuZCwgYmVjYXVzZSBmb3IgYW55IGNoYW5nZQotCQkJLy8gdGhhdCBpcyBpbiBvbmx5IHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlZ2lvbiwgd2Ugc2hvdWxkIG5vdAotCQkJLy8gZG8gYSBxdWljayBjaGFuZ2UsCi0JCQkvLyBzbyAnY2FuSGFuZGxlJyBzaG91bGQgaGF2ZSBiZWVuIGZhbHNlIGZvciB0aG9zZSBjYXNlLgotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQlmVGV4dExlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJfQotCQkJZkxlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENvbnRlbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ29udGVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTA4OGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ29udGVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UOwotCS8vIGxlbmd0aCBhbmQgdGV4dExlbmd0aCBhcmUgYWx3YXlzIHRoZSBzYW1lIGZvciBjb250ZW50IHJlZ2lvbgotCS8vcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBYTUxDb250ZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxDb250ZW50UmVnaW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBhIHByZXR0eSBsYW1lIG1ldGhvZCwgc2luY2UgWE1MIENvbnRlbnQgY2FuIGhhdmUgYQotCQkvLyBtdWNoCi0JCS8vIGJldHRlciBydWxlIGZvciByZWdpb24gdXBkYXRlLCBidXQgdGhpcyBpcyB3aGF0IHByZXZpb3VzCi0JCS8vICh1bmZhY3RvcmVkKQotCQkvLyB2ZXJzaW9uIGhhZCwgc28gSSdsbCBjYXJyeSBpdCBvdmVyLCBvZiBub3cuCi0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB8fCBSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdCh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCi0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQkvLyBkb24ndCBuZWVkIGZvciBjb250ZW50IHJlZ2lvbgotCQkJLy8JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIGNoYW5nZXMsCi0JCQkvLyBmU3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCS8vCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQkvLwkJCX0KLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGRmM2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIFhNTEhlYWRQYXJzZXJGYWN0b3J5IHsKLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCS8vCQlpZiAoY29udGV4dCA9PSBYTUxSZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCW5ld1JlZ2lvbiA9IG5ldyBYTUxIZWFkUGFyc2VyUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIHRleHQpOwotCQkvLwkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlclJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTE3YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMganVzdCBwcmVzZW50IHRvIHNlcnZlciBhcyBhCi0gKiBnZW5lcmljIHN0YXJ0aW5nIHBvaW50IGZvciBhZGRpbmcgbmV3IHNwZWNpZmljIHJlZ2lvbiB0eXBlcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgWE1MSGVhZFBhcnNlclJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQkvLyBzcGVjaWZ5IGNvcnJlY3QgdHlwZQotCXByaXZhdGUgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0KLQlwdWJsaWMgWE1MSGVhZFBhcnNlclJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MSGVhZFBhcnNlclJlZ2lvbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IGNvbnRleHQ7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JCWZUZXh0ID0gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MWY0NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgcmVnaW9uIGZhY3RvcnkgaXMgdmVyeSBzcGVjaWZpYyB0byB0aGUgcGFyc2VyIG91dHB1dCwgYW5kIHRoZSBzcGVjaWZpYwotICogaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgdmFyaW91cyByZWdpb25zLgotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHBhcmVudCwgY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCS8vIG5ld1JlZ2lvbi5zZXRQYXJlbnQocGFyZW50KTsKLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbGFuZywgU3RyaW5nIHN1cnJvdW5kaW5nVGFnKSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBYTUxDRGF0YVRleHRSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgWE1MQ29udGVudFJlZ2lvbihzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnTmFtZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IEF0dHJpYnV0ZU5hbWVSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJbmV3UmVnaW9uID0gbmV3IEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnT3BlblJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJbmV3UmVnaW9uID0gbmV3IEVuZFRhZ09wZW5SZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBUYWdDbG9zZVJlZ2lvbihzdGFydCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBFbXB0eVRhZ0Nsb3NlUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IFdoaXRlU3BhY2VPbmx5UmVnaW9uKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UKLQkJLy8gcmVtb3ZlZCB0aGlzIGNvbmRpdGlvbiBkdXJpbmcgdHJhbnNpdGlvbiwgYW5kIGltcGxlbWVudGVkIGluCi0JCS8vIHN1YmNsYXNzCi0JCS8vIGlmIChjb250ZXh0ID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCS8vIG5ld1JlZ2lvbiA9IG5ldyBKU1BDb2RlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQkvLyB9IGVsc2UKLQkJaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgRm9yZWlnblJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJCSgoRm9yZWlnblJlZ2lvbikgbmV3UmVnaW9uKS5zZXRTdXJyb3VuZGluZ1RhZyhzdXJyb3VuZGluZ1RhZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgQ29udGV4dFJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzZjNTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgWE1MIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIFhNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gZm9ybWF0dGluZyBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmYWxzZSk7Ci0JCW5vZGUucHV0KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIDEpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUywgZmFsc2UpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCwgZmFsc2UpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QUkVTRVJWRV9DREFUQUNPTlRFTlQsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0VfQkVGT1JFX0VNUFRZX0NMT1NFX1RBRywgdHJ1ZSk7Ci0JCQotCQkvLyBjbGVhbnVwIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUywgZmFsc2UpOwotCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgIlVURi04Iik7Ly8kTk9OLU5MUy0xJAotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sICJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLldBUk5fTk9fR1JBTU1BUiwgdHJ1ZSk7Ci0JCW5vZGUucHV0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ESUNBVEVfTk9fR1JBTU1BUiwgMSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVTRV9YSU5DTFVERSwgZmFsc2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NzJhZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgWE1MIGNvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIFhNTENvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBOZXcgRmlsZQotCSAqIFdpemFyZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gImRlZmF1bHRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgbGluZSBiZWZvcmUgYSBsaW5lIHNwbGl0IGlzIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1dJRFRIID0gImxpbmVXaWR0aCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFsbCBibGFua3MgbGluZXMgc2hvdWxkIGJlIGNsZWFyZWQgZHVyaW5nIGZvcm1hdHRpbmcuCi0JICogQmxhbmsgbGluZXMgd2lsbCBiZSBrZXB0IHdoZW4gZmFsc2UuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTID0gImNsZWFyQWxsQmxhbmtMaW5lcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiAjSU5ERU5UQVRJT05fQ0hBUiBmb3IgMSBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRBVElPTl9TSVpFID0gImluZGVudGF0aW9uU2l6ZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciB1c2VkIGZvciBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VEFCLCBTUEFDRX0KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fQ0hBUiA9ICJpbmRlbnRhdGlvbkNoYXIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjSU5ERU5UQVRJT05fQ0hBUi4gSW5kaWNhdGVzIHRvIHVzZQotCSAqIHRhYiBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1NQQUNFCi0JICogQHNlZSAjSU5ERU5UQVRJT05fQ0hBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICJ0YWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiBzcGFjZSBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1RBQgotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICJzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0YWdzIHdpdGggbXVsdGlwbGUgYXR0cmlidXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkCi0JICogKHNwbGl0dGluZyBlYWNoIGF0dHIgb24gYSBuZXcgbGluZSkuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BMSVRfTVVMVElfQVRUUlMgPSAic3BsaXRNdWx0aUF0dHJzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgY2xlYW51cCBwcm9jZXNzb3Igc2hvdWxkIGZvcm1hdCBzb3VyY2UuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1NPVVJDRSA9ICJmb3JtYXRTb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBlbXB0eSBlbGVtZW50cyBzaG91bGQgYmUgY29tcHJlc3NlZCBkdXJpbmcKLQkgKiBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUyA9ICJjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfUkVRVUlSRURfQVRUUlMgPSAiaW5zZXJ0UmVxdWlyZWRBdHRycyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluc2VydCBtaXNzaW5nIHRhZ3MgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX01JU1NJTkdfVEFHUyA9ICJpbnNlcnRNaXNzaW5nVGFncyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHF1b3RlIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbnZlcnQgYWxsIGxpbmUgZGVsaW1pdGVycyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKiBAZGVwcmVjYXRlZCAtIG5vIGxvbmdlciB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9FT0xfQ09ERVMgPSAiY29udmVydEVPTENvZGVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIGxpbmUgZGVsaW1pdGVyIHRvIHVzZSBkdXJpbmcgY2xlYW51cCBpZiBjb252ZXJ0aW5nIGxpbmUKLQkgKiBkZWxpbWl0ZXJzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtDUiwgQ1JMRiwgTEYsIE5PX1RSQU5TTEFUSU9OfQotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0VPTF9DT0RFID0gImNsZWFudXBFT0xDb2RlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYSB3YXJuaW5nIHNob3VsZCBiZSBwcm9kdWNlZCB3aGVuIHZhbGlkYXRpbmcgYQotCSAqIGZpbGUgdGhhdCBzcGVjaWZpZXMgbm90IGdyYW1tYXIuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtUUlVFLCBGQUxTRX0KLQkgKiA8L3A+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOX05PX0dSQU1NQVIgPSAid2Fybk5vR3JhbW1hciI7Ly8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhIG1lc3NhZ2Ugc2hvdWxkIGJlIHByb2R1Y2VkIHdoZW4gdmFsaWRhdGluZyBhCi0JICogZmlsZSB0aGF0IHNwZWNpZmllcyBub3QgZ3JhbW1hci4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmludGVnZXI8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczogezAsIDEsIDJ9IChub25lLCB3YXJuaW5nLCBlcnJvcikKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ESUNBVEVfTk9fR1JBTU1BUiA9ICJpbmRpY2F0ZU5vR3JhbW1hciI7Ly8kTk9OLU5MUy0xJAotCi0gCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB4aW5jbHVkZXMgc2hvdWxkIGJlIHByb2Nlc3NlZCBiZWZvcmUKLQkgKiB2YWxpZGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VFJVRSwgRkFMU0V9Ci0JICogPC9wPgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9YSU5DTFVERSA9ICJ4aW5jbHVkZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFsbCB3aGl0ZXNwYWNlIGluIHRhZ3Mgd2l0aCBDREFUQSBjb250ZW50IHNob3VsZCBiZQotCSAqIHByZXNlcnZlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRVJWRV9DREFUQUNPTlRFTlQgPSAicHJlc2VydmVDREFUQUNvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBlbmQgYnJhY2tldHMgb2Ygc3RhcnQgdGFncyBzaG91bGQgYmUgcGxhY2VkIG9uIGEgbmV3IGxpbmUKLQkgKiBpZiB0aGUgc3RhcnQgdGFnIHNwYW5zIG1vcmUgdGhhbiBvbmUgbGluZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9FTkRfQlJBQ0tFVCA9ICJhbGlnbkVuZEJyYWNrZXQiOy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgYW4gZW1wdHkgY2xvc2UgdGFnIHNob3VsZCBoYXZlIGEgc3BhY2UgaW5zZXJ0ZWQgYmVmb3JlCi0JICogY2xvc2luZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFX0JFRk9SRV9FTVBUWV9DTE9TRV9UQUcgPSAic3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3NmQ0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotCi0vKioKLSAqIFRoZSBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGlzIHBhcnQgb2YgdGhlICJhZGFwdCBvbiBjcmVhdGUiIG1lY2hhbmlzbS4gQQotICogUHJvcGFnYXRpbmdBZGFwdGVyLCBvbmNlIGFkZGVkIHRvIGEgbm9kZSwgd2lsbCBjYXVzZSBwcm9hZ2F0aW5nIGFkYXB0ZXJzIHRvCi0gKiBiZSBjcmVhdGVkIGZvciBhbGwgY2hpbGQgbm9kZXMuIEEgc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgYQotICogUHJvcGFnYXRpbmdBZGFwdGVyIGZvciBhIG5vZGUgaXMgdGhhdCBpcyBpcyBhbHNvIGNyZWF0ZXMgYWRhcHRlcnMgZm9yIGFuZAotICogYWRhcHRzIHRoZSBOb2RlIGZvciBhbGwgb3RoZXIgcmVnaXN0ZXJlZCAnY3JlYXRlIG9uIGFkYXB0JyBBZGFwdGVycy4gVGhpcwotICogb3RoZXIgYWRhcHRlcnMgYXJlIHJlZ2lzdGVyZWQgYnkgcmVnaXN0ZXJpbmcgdGhlaXIgZmFjdG9yaWVzIHZpYSBwbHVnaW4KLSAqIGV4dGVuc2lvbiBwb2ludC4KLSAqLwotcHVibGljIGNsYXNzIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBQcm9wYWdhdGluZ0FkYXB0ZXIgZkFkYXB0ZXJJbnN0YW5jZTsKLQlwcml2YXRlIExpc3QgZkNvbnRyaWJ1dGVkRmFjdG9yaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwoKSB7Ci0JCXRoaXMoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgeyAvLyAsCi0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlpZiAoZkNvbnRyaWJ1dGVkRmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCWZDb250cmlidXRlZEZhY3Rvcmllcy5hZGQoZmFjdG9yeSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUFkYXB0ZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCS8vIGV2ZXJ5IG5vdGlmaWVyIGdldCdzIG9uZSBvZiB0aGVzZQotCQkvLyAoYW5kIHRoZSBzYW1lIGluc3RhbmNlIG9mIGl0KQotCQlyZXR1cm4gZ2V0QWRhcHRlckluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlckluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFByb3BhZ2F0aW5nQWRhcHRlcgotCSAqLwotCXByaXZhdGUgUHJvcGFnYXRpbmdBZGFwdGVyIGdldEFkYXB0ZXJJbnN0YW5jZSgpIHsKLQkJaWYgKGZBZGFwdGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkFkYXB0ZXJJbnN0YW5jZSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsKCk7Ci0JCQlpZiAoZkNvbnRyaWJ1dGVkRmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZDb250cmlidXRlZEZhY3Rvcmllcy5zaXplKCk7IGkrKykKLQkJCQkJZkFkYXB0ZXJJbnN0YW5jZS5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeSgoUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSkgZkNvbnRyaWJ1dGVkRmFjdG9yaWVzLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZBZGFwdGVySW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZ2l2ZSB0aGUgYWRhcHRlciBpbnN0YW5jZSBhIGNoYW5jZSB0byByZWxlYXNlIGl0cyBmYWN0b3JpZXMKLQkJZ2V0QWRhcHRlckluc3RhbmNlKCkucmVsZWFzZSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMoQXJyYXlMaXN0IGxpc3QpIHsKLQkJZkNvbnRyaWJ1dGVkRmFjdG9yaWVzID0gbGlzdDsKLQotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCVByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkgY2xvbmVkSW5zdGFuY2UgPSBuZXcgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQkJLy8gY2xvbmUgdGhpcyBhZGFwdGVycyBzcGVjaWZpYyBsaXN0IG9mIGFkYXB0ZXIgZmFjdG9yaWVzIHRvbwotCQlpZiAoZkNvbnRyaWJ1dGVkRmFjdG9yaWVzICE9IG51bGwpIHsKLQkJCQotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQ29udHJpYnV0ZWRGYWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkJCWNsb25lZEluc3RhbmNlLnNldENvbnRyaWJ1dGVkRmFjdG9yaWVzKG5ldyBBcnJheUxpc3QoKSk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBleGlzdGluZ0ZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWNsb25lZEluc3RhbmNlLmFkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKGV4aXN0aW5nRmFjdG9yeS5jb3B5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjbG9uZWRJbnN0YW5jZTsKLQl9Ci0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTgxNTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGU7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFByb3BhZ2F0aW5nQWRhcHRlckltcGwgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXIgewotCi0JcHJpdmF0ZSBMaXN0IGFkYXB0T25DcmVhdGVGYWN0b3JpZXMgPSBudWxsOwotCi0JLyoqCi0JICogQWJzdHJhY3RQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFByb3BhZ2F0aW5nQWRhcHRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkYXB0T25DcmVhdGUoSURPTU5vZGUgbm9kZSkgewotCQkvLyBnaXZlIGVhY2ggb2YgdGhlIGZhY3RvcmllcyBhIGNoYW5jZSB0byBhZGFwdCB0aGUgbm9kZSwgaWYgaXQKLQkJLy8gY2hvb3NlcyB0bwotCQlpZiAoYWRhcHRPbkNyZWF0ZUZhY3RvcmllcyAhPSBudWxsKSB7Ci0KLQotCQkJc3luY2hyb25pemVkIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuZ2V0KGkpOwotCQkJCQlmYWN0b3J5LmFkYXB0KG5vZGUpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1lY2hhbmlzbSBjYW4gYmUgbWFkZSAiZWFzaWVyIHRvIHVzZSIgbGF0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCWdldEFkYXB0T25DcmVhdGVGYWN0b3JpZXMoKS5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRPbkNyZWF0ZUZhY3Rvcmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRPbkNyZWF0ZUZhY3RvcmllcygpIHsKLQkJaWYgKGFkYXB0T25DcmVhdGVGYWN0b3JpZXMgPT0gbnVsbCkKLQkJCWFkYXB0T25DcmVhdGVGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBQcm9wYWdhdGluZ0FkYXB0ZXIjaW5pdGlhbGl6ZUZvckZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSwKLQkgKiAgICAgIElOb2RlTm90aWZpZXIpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZvckZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJLy8gSVNTVUU6IHdlIGFyZSBhIERPTSBzcGVjaWZpYyBpbXBsaW1lbnRhdGlvbiwgCi0JCS8vIHdlIHNob3VsZCBub3QgYmUuCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQlwcm9wYWdhdGVUbyh4bWxOb2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnRlcmVzdGluZyhPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIChuZXdWYWx1ZSAhPSBudWxsICYmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgbmV3VmFsdWUgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBuZXdWYWx1ZSBpbnN0YW5jZW9mIERvY3VtZW50VHlwZSkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBJc3N1ZTogV2Ugb25seSBwcm9wYWdhdGUgdG8gRWxlbWVudHMgLi4uCi0JCS8vIG5vdCBhdHRyaWJ1dGVzIHRvbyEgV2Ugc2hvdWxkIGNhcmVmdWwgY29uc2lkZXIgZG9uaW5nIGFsbCB3aGVuCi0JCS8vIHdoZW4gd2UgaW1wcm92ZSAiYWRhcHQgb24gY3JlYXRlIiBkZXNpZ24uCi0JCWlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgJiYgaXNJbnRlcmVzdGluZyhuZXdWYWx1ZSkpIHsKLQkJCXByb3BhZ2F0ZVRvKChJRE9NTm9kZSkgbmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb3BhZ2F0ZVRvKElET01Ob2RlIG5vZGUpIHsKLQkJLy8gZ2V0IGFkYXB0ZXIgdG8gZW5zdXJlIGl0cyBjcmVhdGVkCi0JCW5vZGUuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQlhZGFwdE9uQ3JlYXRlKG5vZGUpOwotCQlwcm9wYWdhdGVUb0NoaWxkcmVuKG5vZGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9wYWdhdGVUb0NoaWxkcmVuKElET01Ob2RlIHBhcmVudCkgewotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCXByb3BhZ2F0ZVRvKChJRE9NTm9kZSkgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBQcm9wYWdhdGluZ0FkYXB0ZXIjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGFkYXB0T25DcmVhdGVGYWN0b3JpZXMgIT0gbnVsbCkgewotCi0JCQlzeW5jaHJvbml6ZWQgKGFkYXB0T25DcmVhdGVGYWN0b3JpZXMpIHsKLQkJCQlpbnQgbGVuZ3RoID0gYWRhcHRPbkNyZWF0ZUZhY3Rvcmllcy5zaXplKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRPbkNyZWF0ZUZhY3Rvcmllcy5nZXQoaSk7Ci0JCQkJCWZhY3RvcnkucmVsZWFzZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxDaGFyRW50aXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxDaGFyRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZmI0ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MQ2hhckVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogWE1MIE5hbWVzcGFjZSBjb25zdGFudHMKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTENoYXJFbnRpdHkgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QX05BTUUgPSAiYW1wIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBTVBfUkVGID0gIiZhbXA7IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBTVBfVkFMVUUgPSAiJiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBPU19OQU1FID0gImFwb3MiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQT1NfUkVGID0gIiZhcG9zOyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBPU19WQUxVRSA9ICInIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHVF9OQU1FID0gImd0IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHVF9SRUYgPSAiJmd0OyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR1RfVkFMVUUgPSAiPiI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMVF9OQU1FID0gImx0IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMVF9SRUYgPSAiJmx0OyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTFRfVkFMVUUgPSAiPCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVF9OQU1FID0gInF1b3QiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RfUkVGID0gIiZxdW90OyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVF9WQUxVRSA9ICJcIiI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiMjI2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIFhNTCBOYW1lc3BhY2UgY29uc3RhbnRzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxOYW1lc3BhY2UgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfUFJFRklYID0gInhtbG5zOiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTFByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ5ZDQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTFByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBLZXlzIHRvIHVzZSBmb3IgcHJlZmVyZW5jZSBzZXR0aW5ncy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJWE1MUHJlZmVyZW5jZU5hbWVzIHsKLQlTdHJpbmcgQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSA9ICJjbGVhbnVwQXR0ck5hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIENMRUFOVVBfRU9MX0NPREUgPSAiY2xlYW51cEVPTENvZGUiOy8vJE5PTi1OTFMtMSQKLQkvLyBjbGVhbnVwIHByZWZlcmVuY2UgbmFtZXMKLQlTdHJpbmcgQ0xFQU5VUF9UQUdfTkFNRV9DQVNFID0gImNsZWFudXBUYWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05WRVJUX0VPTF9DT0RFUyA9ICJjb252ZXJ0RU9MQ29kZXMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRk9STUFUX1NPVVJDRSA9ICJmb3JtYXRTb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5TRVJUX01JU1NJTkdfVEFHUyA9ICJpbnNlcnRNaXNzaW5nVGFncyI7Ly8kTk9OLU5MUy0xJAotCi0JLy8gb3RoZXJzCi0JU3RyaW5nIExBU1RfQUNUSVZFX1BBR0UgPSAibGFzdEFjdGl2ZVBhZ2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUVVPVEVfQVRUUl9WQUxVRVMgPSAicXVvdGVBdHRyVmFsdWVzIjsvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIG5vdCB1c2VkIGZvciBub3cgLy8gaGlnaGxpZ2h0aW5nIHR5cGVzIFN0cmluZyBDT01NRU5UX0JPUkRFUiA9Ci0JICogImNvbW1lbnRCb3JkZXIiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENPTU1FTlRfVEVYVCA9Ci0JICogImNvbW1lbnRUZXh0IjsvLyROT04tTkxTLTEkIFN0cmluZyBDREFUQV9CT1JERVIgPQotCSAqICJjZGF0YUJvcmRlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQ0RBVEFfVEVYVCA9Ci0JICogImNkYXRhVGV4dCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgUElfQk9SREVSID0gInBpQm9yZGVyIjsvLyROT04tTkxTLTEkCi0JICogU3RyaW5nIFBJX0NPTlRFTlQgPSAicGlDb250ZW50IjsvLyROT04tTkxTLTEkIFN0cmluZyBUQUdfQk9SREVSID0KLQkgKiAidGFnQm9yZGVyIjsvLyROT04tTkxTLTEkIFN0cmluZyBUQUdfTkFNRSA9ICJ0YWdOYW1lIjsvLyROT04tTkxTLTEkCi0JICogU3RyaW5nIFRBR19BVFRSSUJVVEVfTkFNRSA9ICJ0YWdBdHRyaWJ1dGVOYW1lIjsvLyROT04tTkxTLTEkIFN0cmluZwotCSAqIFRBR19BVFRSSUJVVEVfVkFMVUUgPSAidGFnQXR0cmlidXRlVmFsdWUiOy8vJE5PTi1OTFMtMSQgU3RyaW5nCi0JICogREVDTF9CT1JERVIgPSAiZGVjbEJvZGVyIjsvLyROT04tTkxTLTEkIFN0cmluZyBET0NUWVBFX05BTUUgPQotCSAqICJkb2N0eXBlTmFtZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRCA9Ci0JICogImRvY3R5cGVFeHRlcm5hbElkIjsvLyROT04tTkxTLTEkIFN0cmluZyBET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiA9Ci0JICogImRvY3R5cGVFeHRlcm5hbFB1YnJlZiI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYgPQotCSAqICJkb2N0eXBlRXh0cmVuYWxTeXNyZWYiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIFhNTF9DT05URU5UID0KLQkgKiAieG1sQ29udGVudCI7Ly8kTk9OLU5MUy0xJCAvLyBoaWdobGlnaHRpbmcgcHJlZmVyZW5jZXMgU3RyaW5nIENPTU1BID0KLQkgKiAiLCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQ09MT1IgPSAiY29sb3IiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIE5BTUUgPQotCSAqICJuYW1lIjsvLyROT04tTkxTLTEkIFN0cmluZyBGT1JFR1JPVU5EID0gImZvcmVncm91bmQiOy8vJE5PTi1OTFMtMSQKLQkgKiBTdHJpbmcgQkFDS0dST1VORCA9ICJiYWNrZ3JvdW5kIjsvLyROT04tTkxTLTEkIFN0cmluZyBCT0xEID0KLQkgKiAiYm9sZCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgSVRBTElDID0gIml0YWxpYyI7Ly8kTk9OLU5MUy0xJAotCSAqLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9OYW1lVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL05hbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2YmViNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL05hbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MMTBOYW1lczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGNvbnNpc3RlbnQgd2F5IHRvIHByZS1jaGVjayBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIFhNTAotICogbmFtZSwgYmVmb3JlLCBmb3IgZXhhbXBsZSwgdHJ5aW5nIHRvIGFjdHVhbGx5IGNyZWF0ZSBhbiBFbGVtZW50IHdpdGggaXQuCi0gKiBBdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBFbGVtZW50IHdpdGggYW4gaW52YWxpZCBuYW1lIHdpbGwgdGhyb3cgdGhlIGFwcHJvcHJpYXRlCi0gKiBET00gRXhjZXB0aW9uLCBidXQgb2Z0ZW4gY2xpZW50cyB3YW50IHRvIGNoZWNrIHRoZSB2YWxpZGl0aW5nIG9mIGEgbmFtZQotICogc3VjaCBhcyBiYXNlZCBvbiBzb21lIHVzZXIgaW5wdXQsIGxvbmcgaW4gYWR2YW5jZSBvZiBhY3R1YWxseSBtYWtpbmcgCi0gKiB0aGUgRE9NIGNhbGwuIEFuZCwgbmF0dWFsbHksIHdhbnQgdG8gZ2l2ZSB0aGUgdXNlciBmZWVkYmFjayBpbiBhIG1vcmUgCi0gKiB0aW1lbHkgZmFzaGlvbi4KLSAqIAotICogSVNTVUU6IGlzICJlbmRuczoiIHJlYWxseSB2YWxpZCB4bWwgbmFtZT8gSSB0aGluayBub3QsIGJ1dCB0aGlzIG1ldGhvZAotICogKGN1cnJlbnRseSkgc2F5cyBpdCBpcy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYW1lVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIFhNTDEwTmFtZXMgeG1sMTBjaGFyQ2hlY2tlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgPGNvZGU+bmFtZTwvY29kZT4gaXMgdmFsaWQgWE1MIG5hbWUgYWNjb3JkaW5nIHRvIFhNTAotCSAqIDEuMCBydWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBuYW1lIGlzIHRoZSBzdHJpbmcgdG8gdGVzdAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZCBuYW1lIGFjY29yZGluZyB0byBYTUwgMS4wIHJ1bGVzLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBuYW1lKSB7Ci0KLQkJaWYgKHhtbDEwY2hhckNoZWNrZXIgPT0gbnVsbCkgewotCQkJeG1sMTBjaGFyQ2hlY2tlciA9IGluaXRpdGFpbGl6ZVhNTDEwTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4geG1sMTBjaGFyQ2hlY2tlci5pc1ZhbGlkWE1MMTBOYW1lKG5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFhNTDEwTmFtZXMgaW5pdGl0YWlsaXplWE1MMTBOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBYTUwxME5hbWVzKChSZWFkZXIpIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE5vdCBpbnRlbnRlZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIE5hbWVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2NUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTURvY1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzZDk1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTURvY1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2NUeXBlIHsKLQkvKioKLQkgKiBDSFRNTCBmaWxlcwotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENIVE1MX0RPQ19UWVBFID0gIkNIVE1MIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSFRNTCBmaWxlcwotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUxfRE9DX1RZUEUgPSAiSFRNTCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEpTUCAxLjEgZmlsZXMgKGN1cnJlbnRseSBpbmNsdWRlcyAxLjIgZWxlbWVudHMgZm9yIGJhY2t3YXJkIGJlaGF2aW9yYWwgY29tcGF0aWJpbGl0eSkKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1AxMV9ET0NfVFlQRSA9ICJKU1AxMSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEpTUCAxLjIgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKU1AxMl9ET0NfVFlQRSA9ICJKU1AxMiI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEpTUCAyLjAgSlNQIGZpbGVzCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNQMjBfRE9DX1RZUEUgPSAiSlNQMjAiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBKU1AgMi4wIFRhZyBmaWxlcwotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRzIwX0RPQ19UWVBFID0gIkpTUDIwLlRBRyI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFRyYWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YmFhNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLS8qKgotICogUG9zaXRpb24gZGVwZW5kZW50IENNRG9jdW1lbnQgdHJhY2tlci4gQSB0cmFja2VyIG1hdGNoZXMgYQotICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB3aXRoIGEgQ01Eb2N1bWVudCB0aGF0IGl0IGVuYWJsZXMgYWxsb3dpbmcgZm9yCi0gKiBwb3NpdGlvbi1kZXBlbmRlbnQgY29udGVudCBtb2RlbHMKLSAqLwotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50VHJhY2tlciB7Ci0KLQlDTURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTc1ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlV3JhcHBlciBleHRlbmRzIENNTm9kZSB7Ci0JQ01Ob2RlIGdldE9yaWdpbk5vZGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2ODExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ29udGVudE1vZGVsQWRhcHRlciBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50TW9kZWxBZGFwdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBnZXRDTURvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Eb2N1bWVudAotCSAqIEBwYXJhbSBub3RpZmVyCi0JICogCi0JICogUmV0dXJucyBDTURvY3VtZW50IGFzc29jaWF0ZWQgdG8gdGhlIGFkYXB0aW5nIG5vZGUuIEZvciBleGFtcGwgOiBIVE1MCi0JICogQ01Eb2N1bWVudCBpcyBhc3NvY2lhdGVkIHRvIEhUTUwgRG9jdW1lbnQgbm9kZSwgRFREIENNRG9jdW1lbnQgaXMKLQkgKiBhc3NvY2lhdGVkIHRvIERvY3VtZW50VHlwZSBub2RlLCBEVEQvU2NoZW1hIENNRG9jdW1lbnQgaXMgYXNzb2NpYXRlZCB0bwotCSAqIEVsZW1lbnQgbm9kZSAoc29tZXRpbWUgd2l0aCBuYW1lc3BhY2UpLCBhbmQgdGFnbGliIENNRG9jdW1lbnQgaXMKLQkgKiBhc3NvY2lhdGVkIHRvIHRhZ2xpYiBkaXJlY3RpdmUgRWxlbWVudCBub2RlLgotCSAqIAotCSAqIElOb2RlTm90aWZpZXIgaXMgcGFzc2VkIGZvciBzdGF0ZWxlc3MgKHNpbmdsZXRvbikgSU5vZGVBZGFwdGVyCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyIG5vdGlmaWVyKTsKLQotCS8qKgotCSAqIGdldERlY2xhcmF0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIG5vdGlmZXIKLQkgKiAKLQkgKiBSZXR1cm5zIEVsZW1lbnREZWZpbml0aW9uIG9yIEF0dHJpYnV0ZURlZmluaXRpb24gZm9yIHRoZSBhZGFwdGluZyBub2RlLgotCSAqIAotCSAqIElOb2RlTm90aWZpZXIgaXMgcGFzc2VkIGZvciBzdGF0ZWxlc3MgKHNpbmdsZXRvbikgSU5vZGVBZGFwdGVyCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JQ01Ob2RlIGdldERlY2xhcmF0aW9uKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyIG5vdGlmaWVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL051bGxDb250ZW50TW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL051bGxDb250ZW50TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyZWU2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9OdWxsQ29udGVudE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBpbnRpYWxpemUgc3BlY2lmaWMgdmFyaWFibGVzIHRoYXQgbmVlZCBhIGNvbnRlbnQKLSAqIG1vZGVsLCB1bnRpbCB0aGUgdHJ1ZSBjb250ZW50IG1vZGVsIGlzIGF2YWlsYWJsZS4gVGhpcyBwcmV2ZW50cyBoYXZpbmcgdG8KLSAqIGRvIGxvdHMgb2YgbnVsbCBjaGVja3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsQ29udGVudE1vZGVsIGltcGxlbWVudHMgQ01Eb2N1bWVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOdWxsQ01OYW1lZE5vZGVNYXAgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgTnVsbEl0ZXJhdG9yKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQkJcHVibGljIE51bGxJdGVyYXRvcigpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IHJlbW92ZSByZWdpb25zIHZpYSBpdGVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0JcHVibGljIE51bGxDb250ZW50TW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gbmV3IE51bGxDTU5hbWVkTm9kZU1hcCgpOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ01OYW1lZE5vZGVNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2MzYTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzLCB3aXRoIGl0cyBmZXcgZmllbGQsIGlzIGEgY29udmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcmluZyB0byBhIGNvbnRlbnRUeXBlIElELiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkCi0gKiBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgZmlsZS4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBDb250ZW50VHlwZUlkRm9yWE1MIHsKLQkvKioKLQkgKiBUaGlzIGNvbnRlbnQgdHlwZSBpcyBhY3R1YWxseSBzdXBwbGllZCBieSBiYXNlIEVjbGlwc2UuIEl0cyBnaXZlbiBoZXJlCi0JICoganVzdCBhcyBkb2N1bWVudGF0aW9uIGZvciBXVFAgYmFzZWQgY2xpZW50cy4gVHlwaWNhbGx5LCBjbGllbnRzIHNob3VsZAotCSAqIHVzZSB0aGUgdmFsdWVzL2NvbnN0YW50cyBzdXBwbGllZCBieSBiYXNlIEVjbGlwc2UuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9YTUwgPSBnZXRDb25zdGFudFN0cmluZzIoKTsKLQkvKioKLQkgKiBUaGlzIHZhbHVlIGlzIHB1YmxpYyBvbmx5IGZvciB0ZXN0aW5nIGFuZCBzcGVjaWFsIGluZnJhc3RydWN0dXJlLiBUaGUKLQkgKiBjb25zdGFudCBub3IgaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGJ5IGNsaWVudHMuCi0JICogCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQKLQkgKiBwcm90ZWN0ZWQgbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9TU0VYTUwgPSBnZXRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcyKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01BdHRyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01BdHRyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTZlMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NQXR0ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGV4dGVuc2lvbnMgdG8gY29ycmVzcG9uZGluZyBET00gaW50ZXJmYWNlIHRvIGVuYWJsZQotICogZnVuY3Rpb25zIGZvciBzb3VyY2UgZWRpdGluZyBhbmQgaW5jcmVtZW50YWwgcGFyc2luZy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NQXR0ciBleHRlbmRzIElET01Ob2RlLCBBdHRyIHsKLQotCS8qKgotCSAqIEdldCdzIHRoZSByZWdpb24gaW4gYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGUgJz0nIHNpZ24uIE1heSBvciBtYXkgbm90Ci0JICogaGF2ZSB3aGl0ZXNwYWNlIHN1cnJvdW5kaW5nIGl0LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gCi0JICogSVNTVUU6IG5lZWQgdG8gY2hhbmdlL3JlbW92ZSB0byBhdm9pZCBleHBvc2luZyAnSVRleHRSZWdpb24nCi0JICogY2hhbmdlIHRvIG9mZnNldCBwYXR0ZXJuLCBhcyBvdGhlcnMuCi0JICogCi0JICogQHJldHVybiBJVGV4dFJlZ2lvbiAtIHRoZSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSBlcXVhbHMgc2lnbiwgb3IgbnVsbAotCSAqICAgICAgICAgaWYgdGhlaXIgaXMgbm8gZXF1YWxzIHNpZ24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0RXF1YWxSZWdpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZSwgaW5jbHVkaW5nCi0JICogd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgYXR0cmlidXRlIG5hbWUsCi0JICogICAgICAgICBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKi8KLQlpbnQgZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBpbnQgLSB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JaW50IGdldE5hbWVSZWdpb25TdGFydE9mZnNldCgpOwotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lUmVnaW9uVGV4dCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lLCBleGNsdWRpbmcKLQkgKiB3aGl0ZXNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gaW50IC0gcmV0dXJucyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZQotCSAqICAgICAgICAgbmFtZSwgZXhjbHVkaW5nIHdoaXRlc3BhY2UuCi0JICovCi0JaW50IGdldE5hbWVSZWdpb25UZXh0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBpbnQgLSByZXR1cm5zIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIHZhbHVlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGJldHRlciBzcGVjIGludGVyYWN0aW9uIHdpdGggcXVvdGUgbWFya3MKLQkgKi8KLQlpbnQgZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHJldHVybnMgdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlUmVnaW9uVGV4dCgpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgQXR0ciBoYXMgYSBuZXN0ZWQgdmFsdWUgKHN1Y2ggYXMgYSBKU1AgZXhwcmVzc2lvbikuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGNvbnRhaW5zIGEgbmVzdGVkIHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JYm9vbGVhbiBoYXNOZXN0ZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgQXR0ciBoYXMgb25seSBuYW1lIGJ1dCBub3QgZXF1YWwgc2lnbiBub3IgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGhhcyBvbmx5IG5hbWUgYnV0IG5vdCBlcXVhbCBzaWduIG5vciB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGhhc05hbWVPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYXR0cmlidXRlIGlzIGRlZmluZWQgZ2xvYmFsbHkgZm9yIGRvY3VtZW50LiBSZXR1cm5zCi0JICogZmFsc2UgaWYgYXR0cmlidXRlIGlzIHByZWNlZWRlZCBieSBhIHByZWZpeCAod2hldGhlciB2YWxpZCBuYW1lIHNwYWNlCi0JICogb3Igbm90KS4gUmV0dXJucyB0cnVlIGlmIGl0cyBvd25pbmcgZWxlbWVudCBpcyBhIGdsb2JhbCBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBnbG9iYWxseSBmb3IgZG9jdW1lbnQuIFJldHVybnMKLQkgKiAgICAgICAgIGZhbHNlIGlmIGF0dHJpYnV0ZSBpcyBwcmVjZWVkZWQgYnkgYSBwcmVmaXggKHdoZXRoZXIgdmFsaWQgbmFtZQotCSAqICAgICAgICAgc3BhY2Ugb3Igbm90KS4gUmV0dXJucyB0cnVlIGlmIGl0cyBvd25pbmcgZWxlbWVudCBpcyBhIGdsb2JhbAotCSAqICAgICAgICAgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIGlzR2xvYmFsQXR0cigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGlzIHhtbCBhdHRyCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gc3BlY2lmeSB0aGlzIG9uZSBpbiBhIG1lYW5pbmdmdWwgd2F5LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiAtIHJldHVybnMgdHJ1ZSBpZiBpcyB4bWwgYXR0cgotCSAqLwotCWJvb2xlYW4gaXNYTUxBdHRyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDY5ZTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBlbmFibGVzIGNyZWF0aW9uIG9mIERPQ1RZUEUgZGVjbGFyYXRpb24gYW5kIHNvbWUgRE9NIExldmVsIDIKLSAqIGludGVyZmFjZXMuIE1heSBiZSByZWZlcmVuY2VkIGJ1dCBub3QgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTURvY3VtZW50IGV4dGVuZHMgTm9kZSwgRG9jdW1lbnQsIElET01Ob2RlIHsKLQotCS8qKgotCSAqIGNyZWF0ZSBjb21tZW50IGVsZW1lbnQuIHRhZ05hbWUgbXVzdCBiZSByZWdpc3RlcmVkIGFzIGNvbW1lbnQgZWxlbWVudAotCSAqIG5hbWUgaW4gcGx1Z2luLnhtbAotCSAqIAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBuYW1lCi0JICogQHBhcmFtIGlzSlNQVGFnCi0JICogICAgICAgICAgICB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIEpTUCBzdHlsZSBjb21tZW50ICgmbHQ7JS0tIC4uLgotCSAqICAgICAgICAgICAgLS0lJmd0OykKLQkgKiBAcmV0dXJuIEVsZW1lbnQgZWxlbWVudCBpbnN0YW5jZQotCSAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgdGhyb3duIGlmIHRoZSBlbGVtZW50IG5hbWUgaXMgcmVnaXN0ZXJlZCBhcyBjb21tZW50IGVsZW1lbnQKLQkgKi8KLQlFbGVtZW50IGNyZWF0ZUNvbW1lbnRFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBib29sZWFuIGlzSlNQVGFnKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIERvY3VtZW50VHlwZSBub2RlCi0JICogCi0JICogSVNTVUU6IEkgYmVsaWV2ZSB0aGlzICduYW1lJyBpcyB0aGUgb25lIHNwZWNpZmljIGluIGRvY3R5cGUgZXh0ZW5zaW9uLAotCSAqIG5lZWQgdG8gdmVyaWZ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIC0KLQkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGRvY3R5cGUKLQkgKiBAcmV0dXJuIERvY3VtZW50VHlwZSAtIHJldHVybnMgYSBkb2N1bWVudCB0eXBlIG5vZGUuCi0JICovCi0JRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3R5cGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRG9jdW1lbnRUeXBlIElELiBVbmxpa2UgdGhlIHN0YW5kYXJkIERPTSBhcHByb2FjaCBvZgotCSAqICJnZXREb2N1bWVudFR5cGUoKS5nZXRQdWJsaWNJZCgpIiwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaWQgZXZlbiBpZgotCSAqIGltcGxpY2l0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERvY3VtZW50VHlwZSBJRAotCSAqLwotCVN0cmluZyBnZXREb2N1bWVudFR5cGVJZCgpOwotCi0JLyoqCi0JICogTk9UIEFQSSAuLi4gbmVlZHMgdG8gYmUgcmVtb3ZlZC9jaGFuZ2VkCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gc3BlY2lmeQotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGlzIEpTUERvY3VtZW50Ci0JICogCi0JICovCi0JYm9vbGVhbiBpc0pTUERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBOT1QgQVBJIC4uLiBuZWVkcyB0byBiZSByZW1vdmVkL2NoYW5nZWQKLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBzcGVjaWZ5Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzSlNQVHlwZSgpOwotCi0JLyoqCi0JICogTk9UIEFQSSAuLi4gbWF5IHJlbW92ZWQvY2hhbmdlZAotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNwZWNpZnkgLS0gY3VycmVudGx5IHVzZWQgdG8gZGVub3RlIGFuIEhUTUwgRE9NIGRvY3VtZW50Ci0JICogaXMgWEhUTUwKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNYTUxUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRG9jdW1lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmM2NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRG9jdW1lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBlbmFibGVzIHNldHRpbmcgb2YgUHVibGljIGFuZCBTeXN0ZW0gSUQgZm9yIERPQ1RZUEUKLSAqIGRlY2xhcmF0aW9uLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NRG9jdW1lbnRUeXBlIGV4dGVuZHMgSURPTU5vZGUsIERvY3VtZW50VHlwZSB7Ci0KLQotCS8qKgotCSAqIFNldHMgZG9jdW1lbnQgdHlwZSdzIHB1YmxpYyBpZCwgYXMgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcgLQotCSAqICAgICAgICAgICAgdGhlIHB1YmxpY0lkCi0JICovCi0Jdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpOwotCi0JLyoqCi0JICogU2V0cyBkb2NtZW50IHR5cGUncyBzeXN0ZW0gaWQsIGFzIHNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIHRoZSBzeXN0ZW1JZAotCSAqLwotCXZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkNzc2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGV4dGVuc2lvbnMgdG8gY29ycmVzcG9uZGluZyBET00gaW50ZXJmYWNlIHRvIGVuYWJsZQotICogZnVuY3Rpb25zIGZvciBzb3VyY2UgZWRpdGluZyBhbmQgaW5jcmVtZW50YWwgcGFyc2luZy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NRWxlbWVudCBleHRlbmRzIElET01Ob2RlLCBFbGVtZW50IHsKLQotCS8qKgotCSAqIFJldHVucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBlbmQgdGFnLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNvcnQgb3V0IG5lZWQgZm9yIHRoaXMKLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGVuZCB0YWcuCi0JICovCi0JaW50IGdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZQotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNvcnQgb3V0IG5lZWQgZm9yIHRoaXMKLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSBzdGFydCB0YWcuCi0JICovCi0JaW50IGdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgaGFzIGFuIGVuZCB0YWcuCi0JICogCi0JICogSW4gb3VyIHNvdXJjZS1vcmllbnRlZCBET00sIHNvbWV0aW1lcyBFbGVtZW50cyBhcmUgImVuZGVkIiwgZXZlbgotCSAqIHdpdGhvdXQgYW4gZXhwbGljaXQgZW5kIHRhZyBpbiB0aGUgc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgYW4gZW5kIHRhZy4KLQkgKi8KLQlib29sZWFuIGhhc0VuZFRhZygpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIGhhcyBhIHN0YXJ0IHRhZy4KLQkgKiAKLQkgKiBJbiBvdXIgc291cmNlLW9yaWVudGVkIERPTSwgYSBsb25lIGVuZCB0YWcgd2lsbCBjYXVzZSBhIG5vZGUgdG8gYmUKLQkgKiBjcmVhdGVkIGluIHRoZSB0cmVlLCB1bmxpa2Ugd2VsbC1mb3JtZWQtb25seSBET01zLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgYSBzdGFydCB0YWcuCi0JICovCi0JYm9vbGVhbiBoYXNTdGFydFRhZygpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBpcyBhIGNvbW1lbnQgZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgYSBjb21tZW50IGVsZW1lbnQKLQkgKi8KLQlib29sZWFuIGlzQ29tbWVudFRhZygpOwotCi0JLyoqCi0JICogaXNFbXB0eVRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIGlzIGVtcHR5IHRhZywgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc0VtcHR5VGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgZmxvYXRpbmcgZW5kIHRhZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmxvYXRpbmcgZW5kIHRhZy4KLQkgKi8KLQlib29sZWFuIGlzRW5kVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgZm9yICJnbG9iYWwgdGFnIiAoYmFzaWNhbGx5LCB3aXRob3V0IHByZWZpeCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgZm9yICJnbG9iYWwgdGFnIiAoYmFzaWNhbGx5LCB3aXRob3V0IHByZWZpeCkKLQkgKi8KLQlib29sZWFuIGlzR2xvYmFsVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgZm9yIG5vIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MgaW4gc291cmNlLgotCSAqIAotCSAqIFByb3ZpZGVkIGZvciBzb21lIHZlcnkgc3BlY2lhbCBjYXNlcyB3aGVuLCBmb3IgZXhhbXBsZSwgYW5kIEhUTUwgdGFnIGlzCi0JICogYXNzdW1lZCBpbiBhbiBIVE1MIGRvY3VtZW50IHRoYXQgZG9lcyBub3QgaGF2ZSBhIGxpdGVyYWwgSFRNTCB0YWcuCi0JICogCi0JICogSVNTVUU6IGNoZWNrIHdpdGggY2xpZW50cyB0byBzZWUgaWYgc3RpbGwgbmVlZGVkCi0JICogCi0JICogQHJldHVybiB0cnVlIG9yIG5vIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MgaW4gc291cmNlLgotCSAqLwotCWJvb2xlYW4gaXNJbXBsaWNpdFRhZygpOwotCi0JLyoqCi0JICogaXNKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogSVNTVUU6IGNoYW5nZSB0byBpc0NvbnRhaW5lckxhbmd1YWdlVGFnKFN0cmluZyB0eXBlKTsKLQkgKi8KLQlib29sZWFuIGlzSlNQVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgc3RhcnQgdGFnIGlzIGNsb3NlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3RhcnQgdGFnIGlzIGNsb3NlZC4KLQkgKi8KLQlib29sZWFuIGlzU3RhcnRUYWdDbG9zZWQoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiBpcyB4bWwgdGFnCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gc3BlYyB0aGlzIGJldHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaXMgeG1sIHRhZwotCSAqLwotCWJvb2xlYW4gaXNYTUxUYWcoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogbm90aWZ5RW5kVGFnQ2hhbmdlZAotCSAqIAotCSAqLwotCXZvaWQgbm90aWZ5RW5kVGFnQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBub3RpZnlTdGFydFRhZ0NoYW5nZWQKLQkgKiAKLQkgKi8KLQl2b2lkIG5vdGlmeVN0YXJ0VGFnQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBTaWduaWZ5IHRoYXQgdGhpcyB0YWcgaXMgYSBjb21tZW50Ci0JICogCi0JICogRm9yIHVzZSBvbmx5IGJ5IHBhcnNlcnMuCi0JICogCi0JICovCi0Jdm9pZCBzZXRDb21tZW50VGFnKGJvb2xlYW4gaXNDb21tZW50VGFnKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogU2lnbmlmeSB0aGF0IHRoaXMgdGFnIGlzIGFuIGVtcHR5IHRhZwotCSAqIAotCSAqIEZvciB1c2Ugb25seSBieSBwYXJzZXJzCi0JICovCi0Jdm9pZCBzZXRFbXB0eVRhZyhib29sZWFuIGlzRW1wdHlUYWcpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBTaWduaWZ5IHRoYXQgdGhpcyB0YWcgaXMgYSBKU1AgdGFnCi0JICogCi0JICogRm9yIHVzZSBvbmx5IGJ5IHBhcnNlcnMKLQkgKiAKLQkgKiBJU1NVRTogSSBoYXZlIGhhZCBvbmUgbm9uLXBhcnNpbmcgY2xpZW50IHdobyBoYXMgaGFkIHRvIHVzZSB0aGlzIC4uLgotCSAqIG5lZWQgdG8gY2hlY2sKLQkgKiAKLQkgKi8KLQl2b2lkIHNldEpTUFRhZyhib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0lkKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIGJvb2xlYW4gaXNJZCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjJlYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURPTUVudGl0eSBleHRlbmRzIEVudGl0eSB7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sVmVyc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNzNlMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBJRE9NSW1wbGVtZW50YXRpb24gewotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBUaGlzIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3BlY2lhbGl6ZWQgb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlCi0JICogc3BlY2lhbGl6ZWQgQVBJcyBvZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgYW5kIHZlcnNpb24sIGFzIHNwZWNpZmllZCBpbiAuCi0JICogVGhlIHNwZWNpYWxpemVkIG9iamVjdCBtYXkgYWxzbyBiZSBvYnRhaW5lZCBieSB1c2luZyBiaW5kaW5nLXNwZWNpZmljCi0JICogY2FzdGluZyBtZXRob2RzIGJ1dCBpcyBub3QgbmVjZXNzYXJpbHkgZXhwZWN0ZWQgdG8sIGFzIGRpc2N1c3NlZCBpbiAuCi0JICogVGhpcyBtZXRob2QgYWxzbyBhbGxvdyB0aGUgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBzcGVjaWFsaXplZAotCSAqIG9iamVjdHMgd2hpY2ggZG8gbm90IHN1cHBvcnQgdGhlIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPgotCSAqIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgcmVxdWVzdGVkLiBOb3RlIHRoYXQgYW55IHBsdXMgc2lnbgotCSAqICAgICAgICAgICAgIisiIHByZXBlbmRlZCB0byB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB3aWxsIGJlIGlnbm9yZWQKLQkgKiAgICAgICAgICAgIHNpbmNlIGl0IGlzIG5vdCBzaWduaWZpY2FudCBpbiB0aGUgY29udGV4dCBvZiB0aGlzIG1ldGhvZC4KLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqICAgICAgICAgICAgVGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYW4gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgdGhlIHNwZWNpYWxpemVkIEFQSXMgb2YgdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgdmVyc2lvbiwgaWYgYW55LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlcmUgaXMgbm8gb2JqZWN0IHdoaWNoIGltcGxlbWVudHMgaW50ZXJmYWNlcyBhc3NvY2lhdGVkCi0JICogICAgICAgICB3aXRoIHRoYXQgZmVhdHVyZS4gSWYgdGhlIDxjb2RlPkRPTU9iamVjdDwvY29kZT4gcmV0dXJuZWQgYnkKLQkgKiAgICAgICAgIHRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPgotCSAqICAgICAgICAgaW50ZXJmYWNlLCBpdCBtdXN0IGRlbGVnYXRlIHRvIHRoZSBwcmltYXJ5IGNvcmUKLQkgKiAgICAgICAgIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPiBhbmQgbm90IHJldHVybiByZXN1bHRzCi0JICogICAgICAgICBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgcHJpbWFyeSBjb3JlCi0JICogICAgICAgICA8Y29kZT5ET01JbXBsZW1lbnRhdGlvbjwvY29kZT4gc3VjaCBhcwotCSAqICAgICAgICAgPGNvZGU+aGFzRmVhdHVyZTwvY29kZT4sIDxjb2RlPmdldEZlYXR1cmU8L2NvZGU+LCBldGMuCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Nb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmZmM3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbE5vdGlmaWVyOwotCi0vKioKLSAqIFByb3ZpZGVzIG1lYW5zIHRvIGdldCB0aGUgWE1MTW9kZWwgZm9ybSBvZiBJU3RydWN1dHJlZE1vZGVsLiBOb3QgdG8gYmUKLSAqIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01Nb2RlbCBleHRlbmRzIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRE9NIERvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERPTSBEb2N1bWVudC4KLQkgKi8KLQlJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIAotCSAqIFJldHVybnMgYW4gc291cmNlIGdlbmVyYXRvciBhcHByb3ByaWF0ZSBmb3IgdGhpcyBtb2RlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZ2VuZXJhdG9yCi0JICovCi0JSVNvdXJjZUdlbmVyYXRvciBnZXRHZW5lcmF0b3IoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogUmV0dXJucyBhbiBYTUxNb2RlbE5vdGlmaWVyLiBDbGllbnRzIHNob3VsZCBub3QgdXNlLgotCSAqIAotCSAqIElTU1VFOiBzaG91bGQgYmUgImludGVybmFsaXplZCIuCi0JICogCi0JICovCi0JWE1MTW9kZWxOb3RpZmllciBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBOT1QgQ0xJRU5UIEFQSQotCSAqCi0JICogU2V0cyB0aGUgbW9kZWwgbm90aWZpZXIgQ2xpZW50cyBzaG91bGQgbm90IHVzZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXZpZXcgd2l0aCBsZWdhY3kgY2xpZW50cy4KLQkgKi8KLQl2b2lkIHNldE1vZGVsTm90aWZpZXIoWE1MTW9kZWxOb3RpZmllciBub3RpZmllcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODg3NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyB0aGUgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSBvZiBvdXIgc291cmNlLW9yaWVudGVkCi0gKiBET00uIEZpcnN0LCBvdXIgbm9kZXMgZXh0ZW5kIHRoZSB3M2MgTm9kZSBpbnRlcmZhY2UsIEluZGV4ZWRSZWdpb24sIGFuZAotICogSU5vZGVOb3RpZmllci4gUGx1cywgaGFzIHRoZSBleHRyYSBtZXRob2RzIGNhbGxlZCBvdXQgaGVyZS4KLSAqIAotICogSVNTVUU6IHRoZSAncmVhZC1vbmx5JyBBUEkgc2hvdWxkIGJlIGJyb2tlbiBvdXQgaW4gdGhlaXIgb3duIGludGVyZmFjZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01Ob2RlIGV4dGVuZHMgSW5kZXhlZFJlZ2lvbiwgSU5vZGVOb3RpZmllciwgTm9kZSB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXNvbHZlIGdldEVuZC9nZXRMYXN0IGNvbmZ1c2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gLSByZXR1cm5zIHRoZSBsYXN0IHN0cnVjdHVyZWQKLQkgKiAgICAgICAgIGRvY3VtZW50IHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGgKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHJlc29sdmUgZ2V0Rmlyc3QvZ2V0U3RhcnQgY29uZnVzaW9uCi0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxhc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHJlc29sdmUgZ2V0RW5kL2dldExhc3QgY29uZnVzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAtIHJldHVybnMgdGhlIGxhc3Qgc3RydWN0dXJlZAotCSAqICAgICAgICAgZG9jdW1lbnQgcmVnaW9uIGFzc29jaWF0ZWQgd2l0aAotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4gUmV0dXJucyBudWxsIGlmIG5vdCBwYXJ0Ci0JICogb2YgYW4gYWN0aXZlIG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gSURPTU1vZGVsIC0gcmV0dXJucyB0aGUgSURPTU1vZGVsIHRoaXMgbm9kZSBpcyBwYXJ0IG9mLgotCSAqLwotCUlET01Nb2RlbCBnZXRNb2RlbCgpOwotCi0JLyoqCi0JICogR2V0J3MgdGhlIHJlZ2lvbiByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBub2RlCi0JICogCi0JICogSVNTVUU6IG9ubHkgaW1wbGVtZW50ZWQvdXNlZCBhdCBhdHRyaWJ1dGUgYW5kIERURE5vZGVzIC0tIHNob3VsZCBtb3ZlLgotCSAqIAotCSAqIEByZXR1cm4gSVRleHRSZWdpb24gLSByZXR1cm5zIHRoZSBJVGV4dFJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcwotCSAqICAgICAgICAgTm9kZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgc291cmNlIHJlcHJlc2VudGluZyB0aGlzIG5vZGUgaW4gc291cmNlIGRvY3VtZW50LgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGZpeCBpbXBsZW1lbnRhdGlvbiB0byBtYXRjaC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXRlcmFsIHNvdXJjZSByZXByZXNlbnRpbmcgdGhpcyBub2RlIGluIHNvdXJjZSBkb2N1bWVudC4KLQkgKi8KLQlTdHJpbmcgZ2V0U291cmNlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gcmVzb2x2ZSBnZXRGaXJzdC9nZXRTdGFydCBjb25mdXNpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCB0aGF0IHVuZGVybGllcyB0aGlzIG5vZGUncyBtb2RlbC4KLQkgKiAKLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhpcyBub2RlIGlzIG5vdCBhY3RpdmVseSBwYXJ0IG9mIGEgc291cmNlIGRvY3VtZW50LiBJbgotCSAqIGNvbnRyYXN0LCBpbiB0aGUgcHVyZSBET00gd29ybGQsICJvd25pbmcgZG9jdW1lbnQiIGlzIG5vdCBudWxsIGV2ZW4KLQkgKiBhZnRlciBhIG5vZGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBET00uCi0JICogCi0JICogSVNTVUU6IHdlIG5lZWQgdG8gZml4IG91ciBpbXBsZW1lbnRhdGlvbiB0byBtYXRjaCB0aGlzIHNwZWMuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JLyoqCi0JICogR2V0J3MgdGhlIHJlZ2lvbiByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgbm9kZSBpZiBvbmx5IG9uZQotCSAqIElUZXh0UmVnaW9uLCBudWxsIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBJU1NVRTogb25seSBpbXBsZW1lbnRlZC91c2VkIGF0IGF0dHJpYnV0ZSBsZXZlbCwgbW92ZSAiZG93biIuCi0JICogCi0JICogQHJldHVybiBJVGV4dFJlZ2lvbiAtIHJldHVybnMgdGhlIElUZXh0UmVnaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0JICogICAgICAgICBOb2RlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JSVRleHRSZWdpb24gZ2V0VmFsdWVSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzb3VyY2Ugb2YgdGhpcyBub2RlLCBidXQgd2l0aAotCSAqIGNoYXJhY3RlciBlbnRpZXMgY29udmVydGVkIChlLmcuICZsdDsgaXMgY29udmVydGVkIHRvICc8JykuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gYmV0dGVyIHNwZWMgZXh0ZW50IG9mIHRoaXMgY29udmVyc2lvbiwgd2UgbWF5IG5vdCBrbm93Ci0JICogYWxsIGNoYXJhY3RlciBlbnRpdGllcy4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBmaXggaW1wbGVtZW50YXRpb24gdG8gbWF0Y2ggc3BlYy4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyAtIGdldCdzIHRoZSBzb3VyY2Ugb2YgdGhpcyBOb2RlLgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpOwotCi0JLyoqCi0JICogVXNlZCB0byBrbm93IHJlYWQtb25seSBzdGF0ZSBvZiBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gV2hldGhlciBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudCBjYW4gYmUgYXBwZW5kZWQgb3IKLQkgKiAgICAgICAgIHJlbW92ZWQuCi0JICovCi0JYm9vbGVhbiBpc0NoaWxkRWRpdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0YWcgaXMgY2xvc2VkIGluIHNvdXJjZS4KLQkgKiAKLQkgKiBJbiBvdXIgc291cmNlIG9yaWVudCBET00gd2Ugc29tZXRpbWVzIGVuZCBhIE5vZGUgd2l0aG91dCBpdCBiZWluZwotCSAqIGV4cGxpY2l0bHkgY2xvc2VkIGluIHNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIG5vZGUgaXMgY2xvc2VkCi0JICovCi0JYm9vbGVhbiBpc0Nsb3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbm9kZSBjYW4gY29udGFpbiBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIHRoaXMgbm9kZSBjYW4gY29udGFpbiBjaGlsZHJlbi4KLQkgKi8KLQlib29sZWFuIGlzQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGtub3cgcmVhZC1vbmx5IHN0YXRlIG9mIGRhdGEuCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0RhdGFFZGl0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0J3MgcmVhZG9ubHkgc3RhdGUgb2YgY2hpbGRyZW4KLQkgKiAKLQkgKi8KLQl2b2lkIHNldENoaWxkRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSk7Ci0KLQkvKioKLQkgKiBTZXQncyByZWFkb25seSBzdGF0ZSBvZiBkYXRhCi0JICogCi0JICovCi0Jdm9pZCBzZXREYXRhRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHJlYWRvbmx5IHN0YXRlIG9mIGRhdGEKLQkgKiAKLQkgKiBmYXN0ZXIgYXBwcm9hY2ggdG8gc2V0IHJlYWQtb25seSBzdGF0ZS4KLQkgKi8KLQl2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUsIGJvb2xlYW4gZGVlcCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgcmF3IHNvdXJjZSB0byB0aGUgVGV4dCBub2RlLiBUaHJvd3MKLQkgKiBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHdoZW4gdGhlIHNwZWNpZmllZCByYXcgc291cmNlIGluY2x1ZGVzCi0JICogaW52YWxpZCBjaGFyYWN0ZXJzLCBzdWNoIGFzLCAnIDwnLCAnPicgYW5kICcmJy4gVmFsaWQgY2hhcmFjdGVyCi0JICogZW50aXRpZXMsIHN1Y2ggYXMsICImYW1wO2x0OyIsIGFyZSBhY2NlcHRlZC4KLQkgKi8KLQl2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB0aHJvd3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgdGhlIHNwZWNpZmllZCByYXcgc291cmNlIHRvIHRoZSBUZXh0IG9yIEF0dHIgbm9kZSdzIHZhbHVlLiBXaGVuCi0JICogdGhlIHNwZWNpZmllZCByYXcgc291cmNlIGluY2x1ZGVzIGludmFsaWQgY2hhcmFjdGVycywgc3VjaCBhcywgJyA8JywKLQkgKiAnPicgYW5kICcmJywgY29udmVydHMgdGhlbS4gVmFsaWQgY2hhcmFjdGVyIGVudGl0aWVzLCBzdWNoIGFzLAotCSAqICImYW1wO2x0OyIsIGFyZSBhY2NlcHRlZC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlU291cmNlKFN0cmluZyBzb3VyY2UpOwotCQotCQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YShTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZyk7Ci0JCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhbWVOb2RlKE5vZGUgb3RoZXIpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBsb29rdXBQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSk7Ci0JCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb247Ci0JCi0JCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01UZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01UZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjNhNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgZXh0ZW5zaW9ucyB0byBjb3JyZXNwb25kaW5nIERPTSBpbnRlcmZhY2UgdG8gZW5hYmxlCi0gKiBmdW5jdGlvbnMgZm9yIHNvdXJjZSBlZGl0aW5nIGFuZCBpbmNyZW1lbnRhbCBwYXJzaW5nLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01UZXh0IGV4dGVuZHMgSURPTU5vZGUsIFRleHQgewotCi0JLyoqCi0JICogTk9UIEFQSSAtIGNhbiBiZSBlbGltaW5hdGVkIG9yIG1vdmVkIHRvIGx0ayBsZXZlbAotCSAqIAotCSAqIEFwcGVuZHMgdGhlIGNvbnRlbnQgb2YgdGhlIHRleHQgbm9kZQotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0IHRvIGFwcGVuZC4KLQkgKi8KLQl2b2lkIGFwcGVuZFRleHQoVGV4dCB0ZXh0KTsKLQotCS8qKgotCSAqIE5PVCBBUEkgLSBjYW4gYmUgZWxpbWluYXRlZCBvciBtb3ZlZCB0byBsdGsgbGV2ZWwKLQkgKiAKLQkgKiBSZXR1cm5zIHRydWUgaWYgaXMgbm90IHZhbGlkLgotCSAqLwotCWJvb2xlYW4gaXNJbnZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgaXMgZW50aXJlbHkgd2hpdGUgc3BhY2UuCi0JICogCi0JICogVGhpcyBpcyBpbnRlbmVkIHRvIGJlIGJldHRlciBwZXJmb3JtaW5nIHRoYXQgYWxsIGNsaWVudHMgZ2V0dGluZyB0aGUKLQkgKiBzb3VyY2UsIGFuZCBjaGVja2luZyB0aGVtc2VsdmVzLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGNsYXJpZnkgaWYgaW1wbGVtZW50YXRpb24gaXMgcHVyZSB0byAid2hpdGUgc3BhY2UiIGFzCi0JICogcGVyIERPTSBzcGVjPyBIZXJlIGlzIHRoZSBET00gc3BlYzoKLQkgKiAKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0ZXh0IG5vZGUgY29udGFpbnMgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy14bWwtaW5mb3NldC0yMDA0MDIwNCNpbmZvaXRlbS5jaGFyYWN0ZXInPgotCSAqIGVsZW1lbnQgY29udGVudCB3aGl0ZXNwYWNlPC9hPiwgb2Z0ZW4gYWJ1c2l2ZWx5IGNhbGxlZCAiaWdub3JhYmxlCi0JICogd2hpdGVzcGFjZSIuIFRoZSB0ZXh0IG5vZGUgaXMgZGV0ZXJtaW5lZCB0byBjb250YWluIHdoaXRlc3BhY2UgaW4KLQkgKiBlbGVtZW50IGNvbnRlbnQgZHVyaW5nIHRoZSBsb2FkIG9mIHRoZSBkb2N1bWVudCBvciBpZiB2YWxpZGF0aW9uIG9jY3VycwotCSAqIHdoaWxlIHVzaW5nIDxjb2RlPkRvY3VtZW50Lm5vcm1hbGl6ZURvY3VtZW50KCk8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaXMgZW50aXJlbHkgd2hpdGUgc3BhY2UuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpOwotCi0JLyoqCi0JICogTk9UIFlFVCBJTVBMRU1URU5URUQgYnV0IGV4aXN0cyBoZXJlIGludGVyZmFjZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NMwotCSAqIAotCSAqIFJldHVybnMgYWxsIHRleHQgb2YgPGNvZGU+VGV4dDwvY29kZT4gbm9kZXMgbG9naWNhbGx5LWFkamFjZW50IHRleHQKLQkgKiBub2RlcyB0byB0aGlzIG5vZGUsIGNvbmNhdGVuYXRlZCBpbiBkb2N1bWVudCBvcmRlci4gPGJyPgotCSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGV4YW1wbGUgYmVsb3cgPGNvZGU+d2hvbGVUZXh0PC9jb2RlPiBvbiB0aGUKLQkgKiA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQgY29udGFpbnMgImJhciIgcmV0dXJucyAiYmFyZm9vIiwgd2hpbGUgb24KLQkgKiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSB0aGF0IGNvbnRhaW5zICJmb28iIGl0IHJldHVybnMgImJhcmZvbyIuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2hvbGVUZXh0KCk7Ci0KLQkvKioKLQkgKiBOT1QgWUVUIElNUExFTVRFTlRFRCBidXQgZXhpc3RzIGhlcmUgaW50ZXJmYWNlIGluIHByZXBhcmF0aW9uIGZvciBET00zCi0JICogCi0JICogUmVwbGFjZXMgdGhlIHRleHQgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0Ci0JICogbm9kZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQuIEFsbCBsb2dpY2FsbHktYWRqYWNlbnQgdGV4dCBub2RlcyBhcmUKLQkgKiByZW1vdmVkIGluY2x1ZGluZyB0aGUgY3VycmVudCBub2RlIHVubGVzcyBpdCB3YXMgdGhlIHJlY2lwaWVudCBvZiB0aGUKLQkgKiByZXBsYWNlbWVudCB0ZXh0LiA8YnI+Ci0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbm9kZSB3aGljaCByZWNlaXZlZCB0aGUgcmVwbGFjZW1lbnQgdGV4dC4gVGhlCi0JICogcmV0dXJuZWQgbm9kZSBpczoKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPm51bGw8L2NvZGU+LCB3aGVuIHRoZSByZXBsYWNlbWVudCB0ZXh0IGlzIHRoZSBlbXB0eQotCSAqIHN0cmluZzsgPC9saT4KLQkgKiA8bGk+dGhlIGN1cnJlbnQgbm9kZSwgZXhjZXB0IHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBpcyByZWFkLW9ubHk7IDwvbGk+Ci0JICogPGxpPiBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIG9mIHRoZSBzYW1lIHR5cGUgKAotCSAqIDxjb2RlPlRleHQ8L2NvZGU+IG9yIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4pIGFzIHRoZSBjdXJyZW50Ci0JICogbm9kZSBpbnNlcnRlZCBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcGxhY2VtZW50LiA8L2xpPgotCSAqIDwvdWw+Ci0JICogPGJyPgotCSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGFib3ZlIGV4YW1wbGUgY2FsbGluZwotCSAqIDxjb2RlPnJlcGxhY2VXaG9sZVRleHQ8L2NvZGU+IG9uIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQKLQkgKiBjb250YWlucyAiYmFyIiB3aXRoICJ5byIgaW4gYXJndW1lbnQgcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOiA8YnI+Ci0JICogV2hlcmUgdGhlIG5vZGVzIHRvIGJlIHJlbW92ZWQgYXJlIHJlYWQtb25seSBkZXNjZW5kYW50cyBvZiBhbgotCSAqIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4sIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+Ci0JICogbXVzdCBiZSByZW1vdmVkIGluc3RlYWQgb2YgdGhlIHJlYWQtb25seSBub2Rlcy4gSWYgYW55Ci0JICogPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiB0byBiZSByZW1vdmVkIGhhcyBkZXNjZW5kYW50cyB0aGF0IGFyZQotCSAqIG5vdCA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+LCA8Y29kZT5UZXh0PC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG5vZGVzLCB0aGUgPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4KLQkgKiBtZXRob2QgbXVzdCBmYWlsIGJlZm9yZSBwZXJmb3JtaW5nIGFueSBtb2RpZmljYXRpb24gb2YgdGhlIGRvY3VtZW50LAotCSAqIHJhaXNpbmcgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIGNvZGUKLQkgKiA8Y29kZT5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI8L2NvZGU+LiA8YnI+Ci0JICogRm9yIGluc3RhbmNlLCBpbiB0aGUgZXhhbXBsZSBiZWxvdyBjYWxsaW5nCi0JICogPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4gb24gdGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdAotCSAqIGNvbnRhaW5zICJiYXIiIGZhaWxzLCBiZWNhdXNlIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG5vZGUKLQkgKiAiZW50IiBjb250YWlucyBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPiBub2RlIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogICAgICAgICAgICBUaGUgY29udGVudCBvZiB0aGUgcmVwbGFjaW5nIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUuCi0JICogQHJldHVybiBUaGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotCSAqICAgICAgICAgY29udGVudC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIG9uZSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5UZXh0PC9jb2RlPiBub2RlcyBiZWluZyByZXBsYWNlZCBpcyByZWFkb25seS4KLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFRleHQgcmVwbGFjZVdob2xlVGV4dChTdHJpbmcgY29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU291cmNlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTb3VyY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczMDQ4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTb3VyY2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiAKLSAqIElTb3VyY2VHZW5lcmF0b3IgYWxsb3dzIERPTSBtb2RlbHMgdG8gZ2VuZXJhdGUgc291cmNlIGFwcHJvcHJpYXRlIGZvciB0aGVpcgotICogcGFyYW1ldGVyLCByZWxhdGl2ZSB0byB0aGUgbW9kZWwgdGhhdCBwcm92aWRlcyB0aGUgc291cmNlIGdlbmVyYXRvci4KLSAqIAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhdHRyaWJ1dGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0ciAtCi0JICogICAgICAgICAgICB0aGUgQXR0cgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyTmFtZShBdHRyIGF0dHIpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVBdHRyVmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gYXR0ciAtCi0JICogICAgICAgICAgICB0aGUgQXR0cgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQXR0clZhbHVlCi0JICogCi0JICogQHBhcmFtIGF0dHIgLQotCSAqICAgICAgICAgICAgdGhlIEF0dHIKLQkgKiBAcGFyYW0gY2hhciAtCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBxdW90ZSBkZXNpcmVkICgnIG9yICIpLgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyLCBjaGFyIHF1b3RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQXR0clZhbHVlCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHZhbHVlCi0JICogQHBhcmFtIGNoYXIgLQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgcXVvdGUgZGVzaXJlZCAoJyBvciAiKS4KLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKFN0cmluZyB2YWx1ZSwgY2hhciBxdW90ZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgQ0RBVEFTZWN0aW9uCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGEpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBwYXJhbSBOb2RlCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNoaWxkKE5vZGUgcGFyZW50Tm9kZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNsb3NlVGFnCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgdGhlIE5vZGUKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQ2xvc2VUYWcoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQ29tbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVDb21tZW50KENvbW1lbnQgY29tbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZURvY3R5cGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGRvY1R5cGUKLQkgKiAgICAgICAgICAgIERvY3VtZW50VHlwZQotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVEb2N0eXBlKERvY3VtZW50VHlwZSBkb2NUeXBlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVudGl0eVJlZiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZW50aXR5UmVmCi0JICogICAgICAgICAgICBFbnRpdHlSZWZlcmVuY2UKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlRW50aXR5UmVmKEVudGl0eVJlZmVyZW5jZSBlbnRpdHlSZWYpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVQSSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGkgLQotCSAqICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVBJKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVNvdXJjZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSAtCi0JICogICAgICAgICAgICB0aGUgTm9kZQotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVTb3VyY2UoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIHRhZyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlVGFnTmFtZShFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVUZXh0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRleHQoVGV4dCB0ZXh0KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlIHRleHQgZGF0YQotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0Ci0JICogQHBhcmFtIGRhdGEgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlVGV4dERhdGEoVGV4dCB0ZXh0LCBTdHJpbmcgZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Db21tZW50Tm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvQ29tbWVudE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwZWQzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Db21tZW50Tm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWVudE5vZGVGb3JtYXR0ZXIgZXh0ZW5kcyBOb2RlRm9ybWF0dGVyIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ1IgPSAiXHIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIExGID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBhZGp1c3RJbmRlbnRhdGlvbnMoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBsaW5lSW5kZW50LCBTdHJpbmcgc2luZ2xlSW5kZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKCk7Ci0KLQkJaW50IGluZGV4T2ZMaW5lRGVsaW1pdGVyID0gU3RyaW5nVXRpbHMuaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZyk7Ci0JCXJlc3VsdCA9IGFTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4T2ZMaW5lRGVsaW1pdGVyKTsKLQkJd2hpbGUgKGluZGV4T2ZMaW5lRGVsaW1pdGVyICE9IC0xKSB7Ci0JCQkvLyBCZWZvcmUgZmluZCB0aGUgbmV4dCBMaW5lRGVsaW1pdGVyLCB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlCi0JCQkvLyBzaXplIG9mIHRoZSBjdXJyZW50IExpbmVEZWxpbWl0ZXIKLQkJCS8vIHNvIHdlIGNhbiBmaWd1cmUgb3V0IGhvdyBtYW55IGJ5dGVzIHRvIHNraXAgYmVmb3JlIGZpbmRpbmcgdGhlCi0JCQkvLyBuZXh0IExpbmVEZWxpbWl0ZXIuCi0JCQkvLyBPdGhlcndpc2UsIHdlIG1heSB0cmVhdCB0aGUgTEYgaW4gQ1JMRiBhcyB0aGUgbmV4dAotCQkJLy8gTGluZURlbGltaXRlci4KLQkJCWludCBsaW5lRGVsaW1pdGVyU2l6ZSA9IDE7Ci0JCQlpZiAoYVN0cmluZy5sZW5ndGgoKSA+PSBpbmRleE9mTGluZURlbGltaXRlciArIDIgJiYgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZkxpbmVEZWxpbWl0ZXIsIGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgMSkuY29tcGFyZVRvKENSKSA9PSAwICYmIGFTdHJpbmcuc3Vic3RyaW5nKGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgMSwgaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyAyKS5jb21wYXJlVG8oTEYpID09IDApCi0JCQkJbGluZURlbGltaXRlclNpemUgPSAyOwotCi0JCQlpbnQgaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyID0gU3RyaW5nVXRpbHMuaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZywgaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyBsaW5lRGVsaW1pdGVyU2l6ZSk7Ci0JCQlpbnQgaW5kZXhPZk5vbmJsYW5rID0gU3RyaW5nVXRpbHMuaW5kZXhPZk5vbmJsYW5rKGFTdHJpbmcsIGluZGV4T2ZMaW5lRGVsaW1pdGVyKTsKLQotCQkJaWYgKGluZGV4T2ZOb25ibGFuayAhPSAtMSkgewotCQkJCWlmIChpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgPT0gLTEpIHsKLQkJCQkJLy8gbGFzdCBsaW5lOyBjb3B5IHRpbGwgdGhlIGVuZAotCQkJCQlyZXN1bHQgKz0gbGluZUluZGVudCArIHNpbmdsZUluZGVudCArIGFTdHJpbmcuc3Vic3RyaW5nKGluZGV4T2ZOb25ibGFuayk7Ci0JCQkJfSBlbHNlIGlmIChpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgIT0gLTEgJiYgaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyIDwgaW5kZXhPZk5vbmJsYW5rKSB7Ci0JCQkJCS8vIGJsYW5rIGxpbmU7IGp1c3QgYWRkIGEgaW5kZW50Ci0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGNvcHkgYWxsIHRleHQgYmV0d2VlbiBpbmRleE9mTm9uYmxhbmsgYW5kCi0JCQkJCS8vIGluZGV4T2ZOZXh0TGluZURlbGltaXRlcgotCQkJCQlyZXN1bHQgKz0gbGluZUluZGVudCArIHNpbmdsZUluZGVudCArIGFTdHJpbmcuc3Vic3RyaW5nKGluZGV4T2ZOb25ibGFuaywgaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyKTsKLQkJCQl9Ci0KLQkJCQlpbmRleE9mTGluZURlbGltaXRlciA9IGluZGV4T2ZOZXh0TGluZURlbGltaXRlcjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGluZGV4T2ZOZXh0TGluZURlbGltaXRlciA9PSAtMSkgewotCQkJCQlyZXN1bHQgKz0gbGluZUluZGVudDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBibGFuayBsaW5lOyBqdXN0IGFkZCBhIGluZGVudAotCQkJCQlyZXN1bHQgKz0gbGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJCQl9Ci0KLQkJCQlpbmRleE9mTGluZURlbGltaXRlciA9IGluZGV4T2ZOZXh0TGluZURlbGltaXRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBsaW5lRGVsaW1pdGVyRm91bmQgbWVhbnMgbXVsdGkgbGluZSBjb21tZW50Ci0JCQlTdHJpbmcgbm9kZVZhbHVlID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCWJvb2xlYW4gbGluZURlbGltaXRlckZvdW5kSW5Db21tZW50ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGVWYWx1ZSk7Ci0KLQkJCWlmIChsaW5lRGVsaW1pdGVyRm91bmRJbkNvbW1lbnQpIHsKLQkJCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYmVmb3JlIG5vZGUKLQkJCQlmb3JtYXRJbmRlbnRhdGlvbkJlZm9yZU5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCQkvLyBhZGp1c3QgaW5kZW50YXRpb25zIGluIG11bHRpIGxpbmUgY29tbWVudAotCQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCQkJCVN0cmluZyBzaW5nbGVJbmRlbnQgPSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldEluZGVudCgpOwotCQkJCVN0cmluZyBuZXdOb2RldmFsdWUgPSBhZGp1c3RJbmRlbnRhdGlvbnMobm9kZVZhbHVlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCwgc2luZ2xlSW5kZW50KTsKLQkJCQlpZiAobm9kZVZhbHVlLmNvbXBhcmVUbyhuZXdOb2RldmFsdWUpICE9IDApCi0JCQkJCW5vZGUuc2V0Tm9kZVZhbHVlKG5ld05vZGV2YWx1ZSk7Ci0JCQl9Ci0KLQkJCWlmICghbm9kZUhhc1NpYmxpbmdzKG5vZGUpIHx8IChub2RlLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwgJiYgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmICFTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVmFsdWUoKSkgJiYgbm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpKSB7Ci0JCQkJLy8gc2luZ2xlIGNoaWxkCi0JCQkJLy8gb3IgaW5saW5lIGNvbW1lbnQgYWZ0ZXIgdGV4dAotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0gZWxzZQotCQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBhZnRlciBub2RlCi0JCQkJZm9ybWF0SW5kZW50YXRpb25BZnRlck5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Eb2N1bWVudE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0RvY3VtZW50Tm9kZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTdkZjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0RvY3VtZW50Tm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIgZXh0ZW5kcyBOb2RlRm9ybWF0dGVyIHsKLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRDaGlsZHJlbihJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQotCQlpZiAobm9kZSAhPSBudWxsICYmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwgfHwgIWZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSkgewotCQkJLy8gbm9ybWFsaXplIG5vZGUgZmlyc3QgdG8gY29tYmluZSBhZGphY2VudCB0ZXh0IG5vZGVzCi0JCQlub2RlLm5vcm1hbGl6ZSgpOwotCi0JCQlJRE9NTm9kZSBuZXh0Q2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJSURPTU5vZGUgZWFjaENoaWxkTm9kZSA9IG5leHRDaGlsZDsKLQkJCQluZXh0Q2hpbGQgPSAoSURPTU5vZGUpIGVhY2hDaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBnZXRGb3JtYXR0ZXIoZWFjaENoaWxkTm9kZSk7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGNoaWxkRm9ybWF0Q29udHJhaW50cyA9IGZvcm1hdHRlci5nZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0JCQkJU3RyaW5nIGNoaWxkSW5kZW50ID0gbGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJCQljaGlsZEZvcm1hdENvbnRyYWludHMuc2V0Q3VycmVudEluZGVudChjaGlsZEluZGVudCk7Ci0JCQkJY2hpbGRGb3JtYXRDb250cmFpbnRzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhmb3JtYXRDb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKTsKLQkJCQljaGlsZEZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChmb3JtYXRDb250cmFpbnRzLmdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKSk7Ci0KLQkJCQkvLyBmb3JtYXQgZWFjaCBjaGlsZAotCQkJCWZvcm1hdHRlci5mb3JtYXQoZWFjaENoaWxkTm9kZSwgY2hpbGRGb3JtYXRDb250cmFpbnRzKTsKLQotCQkJCWlmIChuZXh0Q2hpbGQgIT0gbnVsbCAmJiBuZXh0Q2hpbGQuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpCi0JCQkJCS8vIG5leHROb2RlIGlzIGRlbGV0ZWQgZHVyaW5nIGZvcm1hdAotCQkJCQluZXh0Q2hpbGQgPSAoSURPTU5vZGUpIGVhY2hDaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCWZvcm1hdENoaWxkcmVuKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0VsZW1lbnROb2RlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9FbGVtZW50Tm9kZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWVkOGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0VsZW1lbnROb2RlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0geG1sOnNwYWNlPSdwcmVzZXJ2ZScgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQXR0ckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnROb2RlRm9ybWF0dGVyIGV4dGVuZHMgRG9jdW1lbnROb2RlRm9ybWF0dGVyIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICciJzsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URVMgPSAiXCJcIiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGNoYXIgRVFVQUxfQ0hBUiA9ICc9JzsgLy8gZXF1YWwgc2lnbiROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFBSRVNFUlZFID0gInByZXNlcnZlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFBSRVNFUlZFX1FVT1RFRCA9ICJcInByZXNlcnZlXCIiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBYTUxfU1BBQ0UgPSAieG1sOnNwYWNlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBTUEFDRV9DSEFSID0gJyAnOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhTTF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBYU0xfQVRUUklCVVRFID0gImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNMX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEVuZFRhZyhJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAoIWlzRW5kVGFnTWlzc2luZyhub2RlKSkgewotCQkJLy8gZW5kIHRhZyBleGlzdHMKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQlTdHJpbmcgbm9kZUluZGVudGF0aW9uID0gZ2V0Tm9kZUluZGVudChub2RlKTsKLQkJCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCAmJiBsYXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCWlmIChpc0VuZFRhZ01pc3NpbmcobGFzdENoaWxkKSkgewotCQkJCQkvLyBmaW5kIGRlZXBlc3QgY2hpbGQKLQkJCQkJSURPTU5vZGUgZGVlcGVzdENoaWxkID0gKElET01Ob2RlKSBsYXN0Q2hpbGQuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJCXdoaWxlIChkZWVwZXN0Q2hpbGQgIT0gbnVsbCAmJiBkZWVwZXN0Q2hpbGQuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiBpc0VuZFRhZ01pc3NpbmcoZGVlcGVzdENoaWxkKSkgewotCQkJCQkJbGFzdENoaWxkID0gZGVlcGVzdENoaWxkOwotCQkJCQkJZGVlcGVzdENoaWxkID0gKElET01Ob2RlKSBkZWVwZXN0Q2hpbGQuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZGVlcGVzdENoaWxkICE9IG51bGwpIHsKLQkJCQkJCWlmIChkZWVwZXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJCS8vIFNwZWNpYWwgaW5kZW50YXRpb24gaGFuZGxpbmcgaWYgbGFzdENoaWxkJ3MgZW5kCi0JCQkJCQkJLy8gdGFnIGlzIG1pc3NpbmcgYW5kIGRlZXBlc3RDaGlsZCBpcyBhIHRleHQgbm9kZS4KLQkJCQkJCQlTdHJpbmcgbm9kZVRleHQgPSBkZWVwZXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCk7Ci0KLQkJCQkJCQlpZiAoIW5vZGVUZXh0LmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pKSB7Ci0JCQkJCQkJCW5vZGVUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKG5vZGVUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQkJbm9kZVRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgobm9kZVRleHQsIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJCQkJfQotCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShkZWVwZXN0Q2hpbGQsIG5vZGVUZXh0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJCS8vIGluZGVudCBlbmQgdGFnCi0JCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pOwotCQkJfQotCQkJZWxzZSBpZiAobGFzdENoaWxkID09IG51bGwgJiYgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluc0xpbmVEZWxpbWl0ZXJzKG5vZGUpKSB7Ci0JCQkJLy8gQlVHMTc0MjQzIGRvIG5vdCBpbmRlbnQgZW5kIHRhZyBpZiBub2RlIGhhcyBlbXB0eSBjb250ZW50Ci0JCQkJLy8gKG90aGVyd2lzZSBuZXcgdGV4dCBub2RlIHdvdWxkIGJlIGludHJvZHVjZWQpCi0JCQkJTW9kZWxRdWVyeUFkYXB0ZXIgYWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgKChJRE9NRG9jdW1lbnQpIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpLmdldENNTm9kZShub2RlKTsKLQkJCQlpZiAoKGVsZW1lbnREZWNsYXJhdGlvbiA9PSBudWxsKSB8fCAoZWxlbWVudERlY2xhcmF0aW9uLmdldENvbnRlbnRUeXBlKCkgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpKSB7Ci0JCQkJCS8vIGluZGVudCBlbmQgdGFnCi0JCQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCksIDAsIGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZm9ybWF0IGVuZCB0YWcgbmFtZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQkJSVRleHRSZWdpb24gZW5kVGFnTmFtZVJlZ2lvbiA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCXJlbW92ZVJlZ2lvblNwYWNlcyhub2RlLCBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGVuZFRhZ05hbWVSZWdpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYmVmb3JlIG5vZGUKLQkJCWZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQotCQkJLy8gZm9ybWF0IHN0YXJ0IHRhZwotCQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0JCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0KLQkJCWJvb2xlYW4gY3VycmVudGx5SW5YbWxTcGFjZVByZXNlcnZlID0gZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCk7Ci0JCQlmb3JtYXRTdGFydFRhZyhub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCS8vIHNhdmUgbmV3IG5vZGUKLQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3Tm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCQkvLyBmb3JtYXQgY2hpbGRyZW4gYW5kIGVuZCB0YWcgaWYgbm90IGVtcHR5IHN0YXJ0IHRhZwotCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gZm9ybWF0IGNoaWxkcmVuCi0JCQkJCWZvcm1hdENoaWxkcmVuKG5ld05vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkJCS8vIHNhdmUgbmV3IG5vZGUKLQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7Ci0KLQkJCQkJLy8gZm9ybWF0IGVuZCB0YWcKLQkJCQkJZm9ybWF0RW5kVGFnKG5ld05vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQkJCX0KLQkJCX0KLQotCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGN1cnJlbnRseUluWG1sU3BhY2VQcmVzZXJ2ZSk7Ci0JCQkvLyBvbmx5IGluZGVudCBpZiBub3QgYXQgbGFzdCBub2RlCi0JCQlpZiAobmV3Tm9kZSAhPSBudWxsICYmIG5ld05vZGUuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKQotCQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBhZnRlciBub2RlCi0JCQkJZm9ybWF0SW5kZW50YXRpb25BZnRlck5vZGUobmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBmb3JtYXRzIHRoZSBzdGFydCB0YWcgbmFtZSwgYW5kIGZvcm1hdHMgdGhlIGF0dHJpYnV0ZXMgaWYKLQkgKiBhdmFpbGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0U3RhcnRUYWcoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MIHByZWZlcmVuY2VzID0gKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHNpbmdsZUluZGVudCA9IHByZWZlcmVuY2VzLmdldEluZGVudCgpOwotCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCQlTdHJpbmcgYXR0ckluZGVudCA9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCWJvb2xlYW4gc3BsaXRNdWx0aUF0dHJzID0gcHJlZmVyZW5jZXMuZ2V0U3BsaXRNdWx0aUF0dHJzKCk7Ci0JCWJvb2xlYW4gYWxpZ25FbmRCcmFja2V0ID0gcHJlZmVyZW5jZXMuaXNBbGlnbkVuZEJyYWNrZXQoKTsKLQkJYm9vbGVhbiBzYXdYbWxTcGFjZSA9IGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJLy8gTm90ZTogYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIG51bGwgZXZlbiBpZiB0aGUgbm9kZSBoYXMgbm8KLQkJLy8gYXR0cmlidXRlcy4gSG93ZXZlciwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKSB3aWxsIGJlIDAuIEJ1dCwgY2hlY2sKLQkJLy8gZm9yIG51bGwganVzdCBpbiBjYXNlLgotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkvLyBjb21wdXRlIGN1cnJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCWludCBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gMDsKLQkJCXRyeSB7Ci0JCQkJLy8gMSBpcyBmb3IgIjwiCi0JCQkJaW50IG5vZGVOYW1lT2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpICsgMSArIG5vZGUuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKTsKLQkJCQlpbnQgbGluZU9mZnNldCA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQobm9kZU5hbWVPZmZzZXQpLmdldE9mZnNldCgpOwotCQkJCVN0cmluZyB0ZXh0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQobGluZU9mZnNldCwgbm9kZU5hbWVPZmZzZXQgLSBsaW5lT2Zmc2V0KTsKLQkJCQlpbnQgdXNlZFdpZHRoID0gZ2V0SW5kZW50YXRpb25MZW5ndGgodGV4dCk7Ci0JCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IHByZWZlcmVuY2VzLmdldExpbmVXaWR0aCgpIC0gdXNlZFdpZHRoOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQotCQkJU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCWludCBhdHRyTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCWludCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gMDsKLQkJCWJvb2xlYW4gc3RhcnRUYWdTcGFuc092ZXIxTGluZSA9IGZhbHNlOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJMZW5ndGg7IGkrKykgewotCQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gYXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0JCQkJSVRleHRSZWdpb24gZXF1YWxSZWdpb24gPSBhdHRyLmdldEVxdWFsUmVnaW9uKCk7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0KLQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQlTdHJpbmcgdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBhdHRyLmdldFN0YXJ0T2Zmc2V0KCkgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGF0dHIuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJCS8vIGNoZWNrIGZvciB4bWw6c3BhY2UgYXR0cmlidXRlCi0JCQkJaWYgKGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikuY29tcGFyZVRvKFhNTF9TUEFDRSkgPT0gMCkgewotCQkJCQlpZiAodmFsdWVSZWdpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gWzExMTY3NF0gSWYgbm90aGluZyBoYXMgYmVlbiB3cml0dGVuIHlldCwgdHJlYXQgYXMKLQkJCQkJCS8vIHByZXNlcnZlLCBidXQgb25seSBhcyBoaW50Ci0JCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJCQkvLyBOb3RlIHdlIGRvbid0IHNldCAnc2F3WG1sU3BhY2UnLCBzbyB0aGF0IGRlZmF1bHQgb3IKLQkJCQkJCS8vIGZpeGVkIERURC9YU0QgdmFsdWVzIG1heSBvdmVycmlkZS4KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbm9kZS5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQotCQkJCQkJLy8gVGhlcmUgaXMgYSBwcm9ibGVtIGluCi0JCQkJCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShJVGV4dFJlZ2lvbikKLQkJCQkJCS8vIHdoZW4gdGhlIHJlZ2lvbiBpcyBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24uCi0JCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBub3cuCi0JCQkJCQlpZiAoZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikubGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikuY2hhckF0KDApOwotCQkJCQkJCWlmICgoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URSkgfHwgKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEUpKQotCQkJCQkJCQluZXdBdHRyVmFsdWUgPSBET1VCTEVfUVVPVEVTOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmV3QXR0clZhbHVlLmNvbXBhcmVUbyhQUkVTRVJWRV9RVU9URUQpID09IDApCi0JCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KHRydWUpOwotCQkJCQkJZWxzZQotCQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChmYWxzZSk7Ci0JCQkJCQlzYXdYbWxTcGFjZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoc3BsaXRNdWx0aUF0dHJzICYmIGF0dHJMZW5ndGggPiAxKSB7Ci0JCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQobGluZURlbGltaXRlciArIGF0dHJJbmRlbnQpOwotCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikpOwotCQkJCQlzdGFydFRhZ1NwYW5zT3ZlcjFMaW5lID0gdHJ1ZTsKLQkJCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCQkJdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChlcXVhbFJlZ2lvbikgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQkJCWxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChlcXVhbFJlZ2lvbik7Ci0KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoRVFVQUxfQ0hBUik7Ci0KLQkJCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCQkJdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbikgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQkJCWxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbik7Ci0KLQkJCQkJCS8vIE5vdGU6IHRyaW0oKSBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IKLQkJCQkJCS8vIHZhbHVlUmVnaW9uLmdldFRleHQoKS4gSnVzdCBhIHdvcmthcm91bmQgZm9yIGEKLQkJCQkJCS8vIHByb2JsZW0gZm91bmQgaW4gdmFsdWVSZWdpb24gZm9yIG5vdy4KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikudHJpbSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWludCB0ZXh0TGVuZ3RoID0gMSArIGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikubGVuZ3RoKCkgKyAxICsgZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikubGVuZ3RoKCk7Ci0JCQkJCQlpZiAoaSA9PSBhdHRyTGVuZ3RoIC0gMSkgewotCQkJCQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJCQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCQkJCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkJCQkJCS8vIDMgaXMgZm9yICIgLz4iCi0JCQkJCQkJCQl0ZXh0TGVuZ3RoICs9IDM7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCS8vIDEgaXMgZm9yICI+IgotCQkJCQkJCQkJdGV4dExlbmd0aCsrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPj0gdGV4dExlbmd0aCkgewotCQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoU1BBQ0VfQ0hBUik7Ci0JCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aC0tOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyICsgYXR0ckluZGVudCk7Ci0JCQkJCQkJc3RhcnRUYWdTcGFuc092ZXIxTGluZSA9IHRydWU7Ci0JCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IHByZWZlcmVuY2VzLmdldExpbmVXaWR0aCgpIC0gYXR0ckluZGVudC5sZW5ndGgoKTsKLQkJCQkJCX0KLQotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pKTsKLQotCQkJCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJCQl1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGVxdWFsUmVnaW9uKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGVxdWFsUmVnaW9uKTsKLQotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChFUVVBTF9DSEFSKTsKLQotCQkJCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJCQl1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKTsKLQotCQkJCQkJLy8gTm90ZTogdHJpbSgpIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvcgotCQkJCQkJLy8gdmFsdWVSZWdpb24uZ2V0VGV4dCgpLiBKdXN0IGEgd29ya2Fyb3VuZCBmb3IgYQotCQkJCQkJLy8gcHJvYmxlbSBmb3VuZCBpbiB2YWx1ZVJlZ2lvbiBmb3Igbm93LgotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS50cmltKCkpOwotCi0JCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC09IGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikubGVuZ3RoKCk7Ci0JCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoLS07Ci0JCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC09IGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID49IDEgKyBmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pLmxlbmd0aCgpKSB7Ci0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChTUEFDRV9DSEFSKTsKLQkJCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoLS07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGxpbmVEZWxpbWl0ZXIgKyBhdHRySW5kZW50KTsKLQkJCQkJCQlzdGFydFRhZ1NwYW5zT3ZlcjFMaW5lID0gdHJ1ZTsKLQkJCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0TGluZVdpZHRoKCkgLSBhdHRySW5kZW50Lmxlbmd0aCgpOwotCQkJCQkJfQotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikpOwotCi0JCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC09IGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJU3RyaW5nIHVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgbm9kZS5nZXRFbmRPZmZzZXQoKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCi0JCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkvLyAxIGlzIGZvciAiPCIKLQkJCWludCBvZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyAxICsgbm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpOwotCQkJLy8gMSBpcyBmb3IgIjwiCi0JCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKSAtIDEgLSBub2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCk7Ci0KLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQkJSVRleHRSZWdpb24gZmlyc3RSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQotCQkJCWlmIChmaXJzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKQotCQkJCQkvLyBza2lwIGZvcm1hdHRpbmcgZm9yIGVuZCB0YWdzIGluIHRoaXMgZm9ybWF0OiA8L3RhZ05hbWU+Ci0JCQkJCXJldHVybjsKLQkJCQllbHNlIHsKLQkJCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCBsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpCi0JCQkJCQlsZW5ndGggPSBsZW5ndGggLSBsYXN0UmVnaW9uLmdldExlbmd0aCgpOwotCi0JCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCS8vIGxlYXZlIHNwYWNlIGJlZm9yZSBYTUxfRU1QVFlfVEFHX0NMT1NFOiA8dGFnTmFtZSAvPgotCQkJCQkJLy8gdW5sZXNzIGFscmVhZHkgZ29pbmcgdG8gbW92ZSBlbmQgYnJhY2tldAotCQkJCQkJaWYgKCFzdGFydFRhZ1NwYW5zT3ZlcjFMaW5lIHx8ICFhbGlnbkVuZEJyYWNrZXQpCi0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChTUEFDRV9DSEFSKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHN0YXJ0VGFnU3BhbnNPdmVyMUxpbmUgJiYgYWxpZ25FbmRCcmFja2V0KSB7Ci0JCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyKS5hcHBlbmQobGluZUluZGVudCk7Ci0JCQl9Ci0KLQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCkpOwotCi0JCQkvLyBCVUcxMDgwNzQgJiBCVUc4NDY4OCAtIHByZXNlcnZlIHdoaXRlc3BhY2UgaW4geHNsOnRleHQgJgotCQkJLy8geHNsOmF0dHJpYnV0ZQotCQkJU3RyaW5nIG5vZGVOYW1lc3BhY2VVUkkgPSBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKFhTTF9OQU1FU1BBQ0UuZXF1YWxzKG5vZGVOYW1lc3BhY2VVUkkpKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gKChFbGVtZW50KSBub2RlKS5nZXRMb2NhbE5hbWUoKTsKLQkJCQlpZiAoWFNMX0FUVFJJQlVURS5lcXVhbHMobm9kZU5hbWUpIHx8IFhTTF9URVhULmVxdWFscyhub2RlTmFtZSkpIHsKLQkJCQkJc2F3WG1sU3BhY2UgPSB0cnVlOwotCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBJZiB3ZSBkaWRuJ3Qgc2VlIGEgeG1sOnNwYWNlIGF0dHJpYnV0ZSBhYm92ZSwgd2UnbGwgbG9vayBmb3IKLQkJCS8vIG9uZSBpbiB0aGUgRFRELgotCQkJLy8gV2UgZG8gbm90IGNoZWNrIGZvciBhIGNvbmZsaWN0IGJldHdlZW4gYSBEVEQncyAnZml4ZWQnIHZhbHVlCi0JCQkvLyBhbmQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3VuZCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQsIHdlCi0JCQkvLyBsZWF2ZSB0aGF0IHRvIHRoZSB2YWxpZGF0b3IuCi0JCQlpZiAoIXNhd1htbFNwYWNlKSB7Ci0JCQkJTW9kZWxRdWVyeUFkYXB0ZXIgYWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgKChJRE9NRG9jdW1lbnQpIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpLmdldENNTm9kZShub2RlKTsKLQkJCQlpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJaW50IGNvbnRlbnRUeXBlID0gZWxlbWVudERlY2xhcmF0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCWlmIChwcmVmZXJlbmNlcy5pc1ByZXNlcnZlUENEQVRBQ29udGVudCgpICYmIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSkgewotCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KHRydWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJQ01OYW1lZE5vZGVNYXAgY21BdHRyaWJ1dGVzID0gZWxlbWVudERlY2xhcmF0aW9uLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCS8vIENoZWNrIGltcGxpZWQgdmFsdWVzIGZyb20gdGhlIERURCB3YXkuCi0JCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZURlY2xhcmF0aW9uID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtQXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oWE1MX1NQQUNFKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBmb3VuZCwgY2hlY2sgaXQgb3V0LgotCQkJCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpOwotCi0JCQkJCQkJLy8geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgbWVhbnMgcHJlc2VydmUgc3BhY2UsCi0JCQkJCQkJLy8gZXZlcnl0aGluZyBlbHNlIG1lYW5zIGJhY2sgdG8gZGVmYXVsdC4KLQkJCQkJCQlpZiAoUFJFU0VSVkUuY29tcGFyZVRvKGRlZmF1bHRWYWx1ZSkgPT0gMCkKLQkJCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KHRydWUpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5kZWZpbmVkUmVnaW9ucyhJRE9NTm9kZSBub2RlLCBpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWludCByZWdpb25TdGFydE9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0KLQkJCWlmIChyZWdpb25UeXBlLmNvbXBhcmVUbyhET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgPT0gMCAmJiByZWdpb25TdGFydE9mZnNldCA+PSBzdGFydE9mZnNldCAmJiByZWdpb25TdGFydE9mZnNldCA8IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoKQotCQkJCXJlc3VsdCA9IHJlc3VsdCArIGZsYXROb2RlLmdldEZ1bGxUZXh0KHJlZ2lvbik7Ci0JCX0KLQotCQlpZiAocmVzdWx0Lmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBTUEFDRV9DSEFSICsgcmVzdWx0LnRyaW0oKTsKLQkJZWxzZQotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0Zvcm1hdFByb2Nlc3NvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzk4ZGJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0Zvcm1hdFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRm9ybWF0UHJvY2Vzc29yWE1MIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZGb3JtYXRQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0QWxpZ25FbmRCcmFja2V0KHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldFByZXNlcnZlUENEQVRBQ29udGVudChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUFJFU0VSVkVfQ0RBVEFDT05URU5UKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQkJaWYgKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQkJfQotCQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQkJfQotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoaW5kZW50LnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKE5vZGUgbm9kZSkgewotCQkvLyAyNjIxMzUgLSBOUEUgZHVyaW5nIGZvcm1hdCBvZiBlbXB0eSBkb2N1bWVudAotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IEVsZW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBUZXh0Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9Nb3ZlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBDb21tZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IERvY3VtZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9Nb3ZlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb2RlRm9ybWF0dGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0IGZvbWF0dGVyCi0JCWZvcm1hdHRlci5zZXRGb3JtYXRQcmVmZXJlbmNlcyhnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQkJZm9ybWF0dGVyLnNldFByb2dyZXNzTW9uaXRvcihmUHJvZ3Jlc3NNb25pdG9yKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9Nb3ZlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Ob01vdmVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2OGVjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Ob01vdmVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiBGb3JtYXRzIGVudGl0aWVzIHdoaWNoIHJlYWxseSBuZWVkIG5vIGZvcm1hdHRpbmcuIFRoZXkgYXJlIGp1c3QgbGlrZSB0ZXh0Ci0gKiBub2Rlcy4KLSAqLwotY2xhc3MgTm9Nb3ZlRm9ybWF0dGVyIGV4dGVuZHMgTm9kZUZvcm1hdHRlciB7Ci0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCS8vIG5vZGUgbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEluZGVudGF0aW9uQWZ0ZXJOb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCS8vIHN0aWxsIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Ob2RlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Ob2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGVkMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIHhtbDpzcGFjZT0ncHJlc2VydmUnIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ0RBVEFTZWN0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ2hhcmFjdGVyRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5UYWdOYW1lUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE5vZGVGb3JtYXR0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdHRlciB7Ci0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjaGFyIFNQQUNFX0NIQVIgPSAnICc7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjaGFyIFRBQl9DSEFSID0gJ1x0JzsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmRm9ybWF0Q29udHJhaW50cyA9IG51bGw7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCA9IGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCQlyZXN1bHQgPSBTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UZXh0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0KE5vZGUgbm9kZSkgewotCQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cyA9IGdldEZvcm1hdENvbnRyYWludHMoKTsKLQotCQlmb3JtYXQobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0KE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKGZvcm1hdENvbnRyYWludHMuZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSkKLQkJCWZvcm1hdENvbnRyYWludHMuc2V0Q3VycmVudEluZGVudChnZXRTaWJsaW5nSW5kZW50KG5vZGUpKTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotCQkJZm9ybWF0Tm9kZSgoSURPTU5vZGUpIG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEluZGVudGF0aW9uQWZ0ZXJOb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCS8vIFsxMTE2NzRdIElmIGluc2lkZSB4bWw6c3BhY2U9InByZXNlcnZlIiBlbGVtZW50LCB3ZSBiYWlsCi0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKSkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSURPTU5vZGUgbmV4dFNpYmxpbmcgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUsIGRvYyk7Ci0KLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCQlpZiAobmV4dFNpYmxpbmcgIT0gbnVsbCkKLQkJCQkJCWlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJCWdldEZvcm1hdHRlcihuZXh0U2libGluZykuZm9ybWF0KG5leHRTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCWVsc2UgaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQl9Ci0KLQkJCQllbHNlIGlmIChuZXh0U2libGluZyAhPSBudWxsKQotCQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCWdldEZvcm1hdHRlcihuZXh0U2libGluZykuZm9ybWF0KG5leHRTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJZWxzZSBpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewotCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSURPTU5vZGUgaW5kZW50Tm9kZSA9IGdldFBhcmVudEluZGVudE5vZGUobm9kZSk7Ci0JCQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZ2V0Tm9kZUluZGVudChpbmRlbnROb2RlKTsKLQkJCQkJSURPTU5vZGUgbGFzdENoaWxkID0gZ2V0RGVlcGVzdENoaWxkTm9kZShub2RlKTsKLQkJCQkJYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMgPSBmb3JtYXRDb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpOwotCi0JCQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJaWYgKChsYXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKGxhc3RDaGlsZC5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpKSB7Ci0JCQkJCQkJLy8gdGhpcyB0ZXh0IG5vZGUgYWxyZWFkeSBlbmRzIHdpdGggdGhlIHJlcXVlc3RlZAotCQkJCQkJCS8vIGluZGVudGF0aW9uCi0JCQkJCQl9Ci0KLQkJCQkJCWVsc2UgaWYgKChsYXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKGxhc3RDaGlsZC5nZXROb2RlVmFsdWUoKSAhPSBudWxsICYmIGxhc3RDaGlsZC5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyKSkpCi0JCQkJCQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykgewotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVJbmRlbnQpOwotCQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJCWlmIChsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGFzIGxvbmcgYXMgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQlpZiAoZW5kUmVnaW9uICE9IG51bGwgJiYgZW5kUmVnaW9uLmdldE5leHQoKSAhPSBudWxsKQotCQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCS8vIFsxMTE2NzRdIElmIGluc2lkZSB4bWw6c3BhY2U9InByZXNlcnZlIiBlbGVtZW50LCB3ZSBiYWlsCi0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKSkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSURPTU5vZGUgcHJldmlvdXNTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSwgZG9jKTsKLQotCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQotCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJaWYgKHByZXZpb3VzU2libGluZyAhPSBudWxsKQotCQkJCQkJaWYgKHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJCWdldEZvcm1hdHRlcihwcmV2aW91c1NpYmxpbmcpLmZvcm1hdChwcmV2aW91c1NpYmxpbmcsIGZvcm1hdENvbnRyYWludHMpOwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaW5zZXJ0QmVmb3JlTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nID09IG51bGwgfHwgcHJldmlvdXNTaWJsaW5nLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCS8vIDI2MTk2OCAtIGZvcm1hdHRpbmcgdGFnIHdpdGhvdXQgY2xvc2luZyBicmFja2V0OgotCQkJCQkJLy8gPHQxPjx0MQotCQkJCQkJLy8gMjY1NjczIC0gTnVsbCBwdHIgaW4gZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlCi0JCQkJCQlpbnQgcHJldkVuZE5vZGVPZmZzZXQgPSAtMTsKLQkJCQkJCWludCBwcmV2RW5kUmVnaW9uT2Zmc2V0ID0gLTE7Ci0JCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nICE9IG51bGwpIHsKLQkJCQkJCQlwcmV2RW5kTm9kZU9mZnNldCA9IHByZXZpb3VzU2libGluZy5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IHByZXZpb3VzU2libGluZy5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQkJcHJldkVuZFJlZ2lvbk9mZnNldCA9IGVuZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKChwcmV2aW91c1NpYmxpbmcgPT0gbnVsbCkgfHwgKHByZXZFbmROb2RlT2Zmc2V0ICE9IC0xICYmIHByZXZFbmROb2RlT2Zmc2V0ID09IHByZXZFbmRSZWdpb25PZmZzZXQpKSB7Ci0JCQkJCQkJaW5zZXJ0QmVmb3JlTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCS8vIHJlcGxhY2UKLQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKHByZXZpb3VzU2libGluZywgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJaWYgKCFwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpKSB7Ci0JCQkJCQkJCWlmIChwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpIHsKLQkJCQkJCQkJCWluc2VydEFmdGVyTm9kZShwcmV2aW91c1NpYmxpbmcsIGxpbmVJbmRlbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCWdldEZvcm1hdHRlcihwcmV2aW91c1NpYmxpbmcpLmZvcm1hdChwcmV2aW91c1NpYmxpbmcsIGZvcm1hdENvbnRyYWludHMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2MpIHsKLQkJaW50IGxpbmUgPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJdHJ5IHsKLQkJCWlmIChsaW5lID4gMCkgewotCQkJCWxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcihsaW5lIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJLy8gQlVHMTE1NzE2OiBpZiBjYW5ub3QgZ2V0IGxpbmUgZGVsaW1pdGVyIGZyb20gY3VycmVudCBsaW5lLCBqdXN0Ci0JCS8vIHVzZSBkZWZhdWx0IGxpbmUgZGVsaW1pdGVyCi0JCWlmIChsaW5lRGVsaW1pdGVyID09IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJcmV0dXJuIGxpbmVEZWxpbWl0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsICYmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwgfHwgIWZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSkgewotCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGJlZm9yZSBub2RlCi0JCQlmb3JtYXRJbmRlbnRhdGlvbkJlZm9yZU5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBhZnRlciBub2RlCi0JCQlmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgY29tcHV0ZSB0aGUgY29ycmVjdCBpbmRlbnRhdGlvbiBhZnRlciB0aGlzIG5vZGUKLQkgKiBkZXBlbmRpbmcgb24gdGhlIGluZGVudGF0aW9ucyBvZiBpdHMgc2libGluZyBub2RlcyBhbmQgcGFyZW50IG5vZGUuIE5vdAotCSAqIG5lZWRlZCBhbnltb3JlPwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFRyYWlsaW5nVGV4dChJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBub2RlLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCQlTdHJpbmcgcGFyZW50TGluZUluZGVudCA9IGdldE5vZGVJbmRlbnQobm9kZS5nZXRQYXJlbnROb2RlKCkpOwotCQlib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJSURPTU5vZGUgbmV4dFNpYmxpbmcgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmICgobmV4dFNpYmxpbmcgIT0gbnVsbCkgJiYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKSB7Ci0JCQkJU3RyaW5nIG5leHRTaWJsaW5nVGV4dCA9IG5leHRTaWJsaW5nLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChuZXh0U2libGluZy5nZXROZXh0U2libGluZygpID09IG51bGwpCi0JCQkJCWlmICgobmV4dFNpYmxpbmcuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobmV4dFNpYmxpbmdUZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLQkJCQkJCS8vIGRlbGV0ZSBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQKLQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobmV4dFNpYmxpbmcsIEVNUFRZX1NUUklORyk7Ci0JCQkJCWVsc2UKLQkJCQkJCS8vIHJlcGxhY2UgdGhlIHRleHQgbm9kZSB3aXRoIHBhcmVudCBpbmRlbnRhdGlvbgotCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShuZXh0U2libGluZywgbGluZURlbGltaXRlciArIHBhcmVudExpbmVJbmRlbnQpOwotCQkJCWVsc2UKLQkJCQkJLy8gcmVwbGFjZSB0aGUgdGV4dCBub2RlIHdpdGggaW5kZW50YXRpb24KLQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShuZXh0U2libGluZywgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5leHRTaWJsaW5nID09IG51bGwpIHsKLQkJCQkJbGluZUluZGVudCA9IHBhcmVudExpbmVJbmRlbnQ7Ci0KLQkJCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkpIHsKLQkJCQkJCQkvLyB0aGlzIHRleHQgbm9kZSBhbHJlYWR5IGVuZHMgd2l0aCB0aGUgcmVxdWVzdGVkCi0JCQkJCQkJLy8gaW5kZW50YXRpb24KLQkJCQkJCX0KLQotCQkJCQkJZWxzZSBpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpKQotCQkJCQkJCWlmIChjbGVhckFsbEJsYW5rTGluZXMpCi0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lSW5kZW50KTsKLQkJCQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlpZiAobm9kZS5nZXROb2RlVmFsdWUoKS5sZW5ndGgoKSA9PSAwKQotCQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQlpZiAoIW5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpKQotCQkJCQkJCQlpZiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyKSkKLQkJCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lSW5kZW50KTsKLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkpIHsKLQkJCQkJCS8vIHRoaXMgdGV4dCBub2RlIGFscmVhZHkgZW5kcyB3aXRoIHRoZSByZXF1ZXN0ZWQKLQkJCQkJCS8vIGluZGVudGF0aW9uCi0JCQkJCX0KLQotCQkJCQllbHNlIGlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyKSkpCi0JCQkJCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJZWxzZQotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lSW5kZW50KTsKLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJZWxzZQotCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBnZXREZWVwZXN0Q2hpbGROb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTU5vZGUgcmVzdWx0ID0gbnVsbDsKLQkJSURPTU5vZGUgbGFzdENoaWxkID0gKElET01Ob2RlKSBub2RlLmdldExhc3RDaGlsZCgpOwotCi0JCWlmIChsYXN0Q2hpbGQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG5vZGU7Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZ2V0RGVlcGVzdENoaWxkTm9kZShsYXN0Q2hpbGQpOwotCi0JCQlpZiAoKHJlc3VsdC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFIHx8IHJlc3VsdC5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSAmJiAhaXNFbmRUYWdNaXNzaW5nKG5vZGUpKQotCQkJCXJlc3VsdCA9IG5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZ2V0Rm9ybWF0Q29udHJhaW50cygpIHsKLQkJaWYgKGZGb3JtYXRDb250cmFpbnRzID09IG51bGwpIHsKLQkJCWZGb3JtYXRDb250cmFpbnRzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzKCk7Ci0KLQkJCWZGb3JtYXRDb250cmFpbnRzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpKTsKLQkJfQotCi0JCXJldHVybiBmRm9ybWF0Q29udHJhaW50czsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZGb3JtYXRQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0TGluZVdpZHRoKHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0QWxpZ25FbmRCcmFja2V0KHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldFByZXNlcnZlUENEQVRBQ29udGVudChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUFJFU0VSVkVfQ0RBVEFDT05URU5UKSk7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldENsZWFyQWxsQmxhbmtMaW5lcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQkJaWYgKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQkJfQotCQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQkJfQotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoaW5kZW50LnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKElET01Ob2RlIG5vZGUpIHsKLQkJLy8gMjYyMTM1IC0gTlBFIGR1cmluZyBmb3JtYXQgb2YgZW1wdHkgZG9jdW1lbnQKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXNob3J0IG5vZGVUeXBlID0gKChOb2RlKSBub2RlKS5nZXROb2RlVHlwZSgpOwotCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBFbGVtZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgVGV4dE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vTW92ZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgQ29tbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vTW92ZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW5pdCBmb21hdHRlcgotCQlmb3JtYXR0ZXIuc2V0Rm9ybWF0UHJlZmVyZW5jZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCWZvcm1hdHRlci5zZXRQcm9ncmVzc01vbml0b3IoZlByb2dyZXNzTW9uaXRvcik7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEluZGVudGF0aW9uTGVuZ3RoKFN0cmluZyBpbmRlbnQpIHsKLQkJLy8gVE9ETyBLaXQgOiBUaGUgY2FsY3VsYXRpb24gb2YgSW5kZW50YXRpb25MZW5ndGggaXMgbm90IGNvcnJlY3QKLQkJLy8gaGVyZS4KLQkJLy8gbm9kZUluZGVudGF0aW9uIG1heSBjb250YWluIHRhYnMuIE11bHRpcGx5IGJ5IDQgdGVtcG9yYXJpbHkgdG8gZ2V0Ci0JCS8vIGFwcHJveC4gd2lkdGguCi0JCS8vIE5lZWQgdG8gcmUtd29yay4KLQotCQlpbnQgaW5kZW50YXRpb25MZW5ndGggPSAwOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50Lmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChpbmRlbnQuc3Vic3RyaW5nKGksIGkgKyAxKS5jb21wYXJlVG8oVEFCKSA9PSAwKQotCQkJCWluZGVudGF0aW9uTGVuZ3RoICs9IDQ7Ci0JCQllbHNlCi0JCQkJaW5kZW50YXRpb25MZW5ndGgrKzsKLQkJfQotCi0JCXJldHVybiBpbmRlbnRhdGlvbkxlbmd0aDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBmaW5kIHRoZSBpbmRlbnRhdGlvbiBmb3IgdGhpcyBub2RlLiBJdCB3aWxsIHNlYXJjaAotCSAqIGJhY2t3YXJkcyBzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5vZGUgdW50aWwgYSBjaGFyYWN0ZXIKLQkgKiBvdGhlciB0aGFuIGEgc3BhY2Ugb3IgYSB0YWIgaXMgZm91bmQuIElmIHRoaXMgbm9kZSBpcyBudWxsIG9yIGl0J3MgYQotCSAqIGRvY3VtZW50IG5vZGUgb3IgaXQncyBhIGZpcnN0IGxldmVsIG5vZGUgKG5vZGUncyBwYXJlbnQgaXMgYSBkb2N1bWVudAotCSAqIG5vZGUpIHRoZSBkZWZhdWx0IGVtcHR5IHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSBpbmRlbnRhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5vZGVJbmRlbnQoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJSURPTU5vZGUgc2libGluZ1RleHROb2RlID0gKElET01Ob2RlKSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKChzaWJsaW5nVGV4dE5vZGUgIT0gbnVsbCkgJiYgKHNpYmxpbmdUZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSkgewotCQkJCS8vIGZpbmQgdGhlIGluZGVudGF0aW9uCi0JCQkJU3RyaW5nIHNpYmxpbmdUZXh0ID0gc2libGluZ1RleHROb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCWludCBzaWJsaW5nVGV4dExlbmd0aCA9IHNpYmxpbmdUZXh0Lmxlbmd0aCgpOwotCQkJCWlmICgoc2libGluZ1RleHQgIT0gbnVsbCkgJiYgKHNpYmxpbmdUZXh0TGVuZ3RoID4gMCkgJiYgKChzaWJsaW5nVGV4dC5jaGFyQXQoc2libGluZ1RleHRMZW5ndGggLSAxKSA9PSBTUEFDRV9DSEFSKSB8fCAoc2libGluZ1RleHQuY2hhckF0KHNpYmxpbmdUZXh0TGVuZ3RoIC0gMSkgPT0gVEFCX0NIQVIpKSkgewotCQkJCQlpbnQgc2VhcmNoSW5kZXggPSBzaWJsaW5nVGV4dExlbmd0aCAtIDE7Ci0JCQkJCXdoaWxlICgoc2VhcmNoSW5kZXggPj0gMCkgJiYgKChzaWJsaW5nVGV4dC5jaGFyQXQoc2VhcmNoSW5kZXgpID09IFNQQUNFX0NIQVIpIHx8IChzaWJsaW5nVGV4dC5jaGFyQXQoc2VhcmNoSW5kZXgpID09IFRBQl9DSEFSKSkpCi0JCQkJCQlzZWFyY2hJbmRleC0tOwotCi0JCQkJCWlmIChzZWFyY2hJbmRleCA8IHNpYmxpbmdUZXh0TGVuZ3RoKQotCQkJCQkJcmVzdWx0ID0gc2libGluZ1RleHQuc3Vic3RyaW5nKHNlYXJjaEluZGV4ICsgMSwgc2libGluZ1RleHRMZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROb2RlTmFtZShJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBub2RlLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROb2RlVGV4dChJRE9NTm9kZSBub2RlKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQotCQlpZiAoKG5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhSW1wbCkgJiYgIShub2RlIGluc3RhbmNlb2YgQ29tbWVudEltcGwpICYmICEobm9kZSBpbnN0YW5jZW9mIENEQVRBU2VjdGlvbkltcGwpICYmICFpc0pTUFRhZyhub2RlKSkKLQkJCXRleHQgPSAoKENoYXJhY3RlckRhdGFJbXBsKSBub2RlKS5nZXRTb3VyY2UoKTsKLQkJZWxzZQotCQkJdGV4dCA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIGdldFBhcmVudEluZGVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSByZXN1bHQgPSBudWxsOwotCQlJRE9NTm9kZSBwYXJlbnROb2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCXJlc3VsdCA9IHBhcmVudE5vZGU7Ci0JCWVsc2UgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcGFyZW50Tm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikKLQkJCQlyZXN1bHQgPSBwYXJlbnROb2RlOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IGdldFBhcmVudEluZGVudE5vZGUocGFyZW50Tm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZmluZCB0aGUgaW5kZW50YXRpb24gZm9yIGEgbm9kZSBzaWJsaW5nIHRvIHRoaXMgbm9kZS4KLQkgKiBJdCB3aWxsIHRyeSB0byBmaW5kIGEgc2libGluZyBub2RlIGJlZm9yZSB0aGlzIG5vZGUgZmlyc3QuIElmIHRoZXJlIGlzCi0JICogbm8gc2libGluZyBub2RlIGJlZm9yZSB0aGlzIG5vZGUsIGl0IHdpbGwgdHJ5IHRvIGZpbmQgYSBzaWJsaW5nIG5vZGUKLQkgKiBhZnRlciB0aGlzIG5vZGUuIElmIHN0aWxsIG5vdCBmb3VuZCwgd2Ugd2lsbCBjaGVjayBpZiB0aGlzIG5vZGUgaXMKLQkgKiBhbHJlYWR5IGluZGVudGVkIGZyb20gaXRzIHBhcmVudC4gSWYgeWVzLCB0aGlzIG5vZGUncyBpbmRlbnRhdGlvbiB3aWxsCi0JICogYmUgdXNlZC4gT3RoZXJ3aXNlLCB0aGUgcGFyZW50IG5vZGUncyBpbmRlbnRhdGlvbiBwbHVzIG9uZSBpbmRlbnRhdGlvbgotCSAqIHdpbGwgYmUgdXNlZC4gSWYgdGhpcyBub2RlIGlzIG51bGwgb3IgaXQncyBhIGRvY3VtZW50IG5vZGUgb3IgaXQncyBhCi0JICogZmlyc3QgbGV2ZWwgbm9kZSAobm9kZSdzIHBhcmVudCBpcyBhIGRvY3VtZW50IG5vZGUpIHRoZSBkZWZhdWx0IGVtcHR5Ci0JICogc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgdGhlIGluZGVudGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2libGluZ0luZGVudChOb2RlIG5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpICYmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQkvLyBmaW5kIHRoZSB0ZXh0IG5vZGUgYmVmb3JlIHRoZSBwcmV2aW91cyBub24tdGV4dCBzaWJsaW5nCi0JCQkvLyBpZiB0aGF0J3Mgbm90IGZvdW5kLCB3ZSB3aWxsIHRyeSB0aGUgdGV4dCBub2RlIGJlZm9yZSB0aGUgbmV4dAotCQkJLy8gbm9uLXRleHQgc2libGluZwotCQkJSURPTU5vZGUgc2libGluZyA9IChJRE9NTm9kZSkgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCXdoaWxlICgoc2libGluZyAhPSBudWxsKSAmJiAoc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFIHx8IHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkpIHsKLQkJCQlpZiAoc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFICYmIHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCkgIT0gbnVsbCAmJiBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCkuZ2V0Tm9kZVZhbHVlKCkpKQotCQkJCQlicmVhazsKLQkJCQlzaWJsaW5nID0gKElET01Ob2RlKSBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpOwotCQkJfQotCQkJaWYgKHNpYmxpbmcgPT0gbnVsbCkgewotCQkJCXNpYmxpbmcgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl3aGlsZSAoKHNpYmxpbmcgIT0gbnVsbCkgJiYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpCi0JCQkJCXNpYmxpbmcgPSAoSURPTU5vZGUpIHNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJCVN0cmluZyBzaW5nbGVJbmRlbnQgPSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldEluZGVudCgpOwotCQkJU3RyaW5nIHBhcmVudExpbmVJbmRlbnQgPSBnZXROb2RlSW5kZW50KG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLQotCQkJaWYgKHNpYmxpbmcgIT0gbnVsbCkgewotCQkJCVN0cmluZyBzaWJsaW5nSW5kZW50ID0gZ2V0Tm9kZUluZGVudChzaWJsaW5nKTsKLQkJCQlpZiAoc2libGluZ0luZGVudC5sZW5ndGgoKSA+IDApCi0JCQkJCXJlc3VsdCA9IHNpYmxpbmdJbmRlbnQ7Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBub2RlSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlKTsKLQkJCQkJaWYgKG5vZGVJbmRlbnQubGVuZ3RoKCkgPiBwYXJlbnRMaW5lSW5kZW50Lmxlbmd0aCgpKQotCQkJCQkJLy8gdGhpcyBub2RlIGlzIGluZGVudGVkIGZyb20gaXRzIHBhcmVudCwgaXRzCi0JCQkJCQkvLyBpbmRlbnRhdGlvbiB3aWxsIGJlIHVzZWQKLQkJCQkJCXJlc3VsdCA9IG5vZGVJbmRlbnQ7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlc3VsdCA9IHBhcmVudExpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIG5vZGVJbmRlbnQgPSBnZXROb2RlSW5kZW50KG5vZGUpOwotCQkJCWlmIChub2RlSW5kZW50Lmxlbmd0aCgpID4gcGFyZW50TGluZUluZGVudC5sZW5ndGgoKSkKLQkJCQkJLy8gdGhpcyBub2RlIGlzIGluZGVudGVkIGZyb20gaXRzIHBhcmVudCwgaXRzIGluZGVudGF0aW9uCi0JCQkJCS8vIHdpbGwgYmUgdXNlZAotCQkJCQlyZXN1bHQgPSBub2RlSW5kZW50OwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0ID0gcGFyZW50TGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0QWZ0ZXJOb2RlKElET01Ob2RlIG5vZGUsIFN0cmluZyBzdHJpbmcpIHsKLQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSAwOwotCi0JCS8vIDI2MTk2OCAtIGZvcm1hdHRpbmcgdGFnIHdpdGhvdXQgY2xvc2luZyBicmFja2V0OiA8dDE+PHQxCi0JCWlmIChub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCW9mZnNldCA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJbGVuZ3RoID0gbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQkJfQotCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHN0cmluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0QmVmb3JlTm9kZShJRE9NTm9kZSBub2RlLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBub2RlLmdldFN0YXJ0T2Zmc2V0KCksIDAsIHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhJU3RydWN0dXJlZEZvcm1hdHRlci5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmRUYWdNaXNzaW5nKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpICYmICFpc0pTUFRhZyhub2RlKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpCi0JCQkJc3RhcnRUYWdOYW1lUmVnaW9uID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIGVuZFRhZ05hbWVSZWdpb24gPSBudWxsOwotCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMSkKLQkJCQllbmRUYWdOYW1lUmVnaW9uID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0KLQkJCUlUZXh0UmVnaW9uTGlzdCBzdGFydFRhZ1JlZ2lvbnMgPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlpZiAoc3RhcnRUYWdOYW1lUmVnaW9uID09IGVuZFRhZ05hbWVSZWdpb24gJiYgc3RhcnRUYWdOYW1lUmVnaW9uICE9IG51bGwgJiYgKHN0YXJ0VGFnUmVnaW9ucy5nZXQoMCkpLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gJiYgKHN0YXJ0VGFnUmVnaW9ucy5nZXQoc3RhcnRUYWdSZWdpb25zLnNpemUoKSAtIDEpLmdldFR5cGUoKSkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKQotCQkJCS8vIGVuZCB0YWcgbWlzc2luZwotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG5vZGVIYXNTaWJsaW5ncyhJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSAhPSBudWxsKSB8fCAobm9kZS5nZXROZXh0U2libGluZygpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIE5vZGUgY2hhbmdlZC4gTm8gZm9ybWF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYXV0b21hdGljYWxseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVnaW9uU3BhY2VzKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAoKHJlZ2lvbiAhPSBudWxsKSAmJiAocmVnaW9uIGluc3RhbmNlb2YgQ29udGV4dFJlZ2lvbiB8fCByZWdpb24gaW5zdGFuY2VvZiBUYWdOYW1lUmVnaW9uKSAmJiAoZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPiBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpKSB7Ci0JCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbiksIGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pIC0gZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pLCBFTVBUWV9TVFJJTkcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXBsYWNlIHRoZSBzdHJpbmcgYXQgb2Zmc2V0IGFuZCBsZW5ndGggd2l0aCBhIG5ldwotCSAqIHN0cmluZy4gSWYgdGhlIHN0cmluZyB0byBiZSByZXBsYWNlZCBpcyB0aGUgc2FtZSBhcyB0aGUgbmV3IHN0cmluZywgdGhlCi0JICogc3RyaW5nIHdpbGwgbm90IGJlIHJlcGxhY2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2UoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmcpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJ1Y3R1cmVkRG9jdW1lbnRTdHJpbmcgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRTdHJpbmcuY29tcGFyZVRvKHN0cmluZykgIT0gMCkKLQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSB0aGUgbm9kZSB2YWx1ZSB3aXRoIGEgbmV3IHN0cmluZy4gSWYgdGhlIG5vZGUKLQkgKiB2YWx1ZSB0byBiZSByZXBsYWNlZCBpcyB0aGUgc2FtZSBhcyB0aGUgbmV3IHN0cmluZywgdGhlIG5vZGUgdmFsdWUgd2lsbAotCSAqIG5vdCBiZSByZXBsYWNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlTm9kZVZhbHVlKElET01Ob2RlIG5vZGUsIFN0cmluZyBzdHJpbmcpIHsKLQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWludCBvZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBub2RlLmdldEVuZE9mZnNldCgpIC0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RydWN0dXJlZERvY3VtZW50U3RyaW5nID0gc3RydWN0dXJlZERvY3VtZW50LmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50U3RyaW5nLmNvbXBhcmVUbyhzdHJpbmcpICE9IDApCi0JCQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzdHJpbmcpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0UHJlZmVyZW5jZXMoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcykgewotCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBmb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXIjc2V0UHJvZ3Jlc3NNb25pdG9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFRhZyhOb2RlIG5vZGUpIHsKLQotCQlmaW5hbCBTdHJpbmcgSlNQX0NMT1NFID0gIkpTUF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX0NMT1NFID0gIkpTUF9DT01NRU5UX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9PUEVOID0gIkpTUF9DT01NRU5UX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9URVhUID0gIkpTUF9DT01NRU5UX1RFWFQiOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgU3RyaW5nIEpTUF9DT05URU5UID0gIkpTUF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX0NMT1NFID0gIkpTUF9ESVJFQ1RJVkVfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX05BTUUgPSAiSlNQX0RJUkVDVElWRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElET01Ob2RlKSBub2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJLy8gaW4gc29tZSBjYXNlcywgdGhlIG5vZGVzIGV4aXN0cywgYnV0IGhhc24ndCBiZWVuIGFzc29jaWF0ZWQKLQkJCS8vIHdpdGgKLQkJCS8vIGEgZmxhdG5vZGUgeWV0ICh0aGUgc2NyZWVuIHVwZGF0ZXMgY2FuIGJlIGluaXRpYXRlZCBvbiBhCi0JCQkvLyBkaWZmZXJlbnQgdGhyZWFkLAotCQkJLy8gc28gdGhlIHJlcXVlc3QgZm9yIGEgZmxhdG5vZGUgY2FuIGNvbWUgaW4gYmVmb3JlIHRoZSBub2RlIGlzCi0JCQkvLyBmdWxseSBmb3JtZWQuCi0JCQkvLyBpZiB0aGUgZmxhdG5vZGUgaXMgbnVsbCwgd2UnbGwganVzdCBhbGxvdyB0aGUgZGVmYXVsdHMgdG8KLQkJCS8vIGFwcGx5LgotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmxhdE5vZGVUeXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQkJCS8vIHNob3VsZCBub3QgYmUgbnVsbCwgYnV0IGp1c3QgdG8gYmUgc3VyZQotCQkJCWlmIChmbGF0Tm9kZVR5cGUgIT0gbnVsbCkgewotCQkJCQlpZiAoKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0NPTlRFTlQpKSB8fCAoZmxhdE5vZGVUeXBlLmVxdWFscyhKU1BfRVhQUkVTU0lPTl9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX1NDUklQVExFVF9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RFQ0xBUkFUSU9OX09QRU4pKSB8fCAoZmxhdE5vZGVUeXBlLmVxdWFscyhKU1BfRElSRUNUSVZFX0NMT1NFKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9OQU1FKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0NMT1NFKSkpIHsKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDI0ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCBleHRlbmRzIFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyB7Ci0JcHJpdmF0ZSBib29sZWFuIGZTcGxpdE11bHRpQXR0cnMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZlByZXNlcnZlUENEQVRBQ29udGVudCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmQWxpZ25FbmRCcmFja2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUcnVlIGlmIGZvcm1hdHRlciBzaG91bGQgc3BsaXQgZWxlbWVudHMgd2l0aCBtdWx0aXBsZSBhdHRyaWJ1dGVzIG9udG8KLQkgKiBuZXcgbGluZXMuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3BsaXRNdWx0aUF0dHJzKCkgewotCQlyZXR1cm4gZlNwbGl0TXVsdGlBdHRyczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgb3Igbm90IGZvcm1hdHRlciBzaG91bGQgc3BsaXQgZWxlbWVudHMgd2l0aCBtdWx0aXBsZQotCSAqIGF0dHJpYnV0ZXMgb250byBuZXcgbGluZXMuCi0JICogCi0JICogQHBhcmFtIHNwbGl0TXVsdGlBdHRycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwbGl0TXVsdGlBdHRycyhib29sZWFuIHNwbGl0TXVsdGlBdHRycykgewotCQlmU3BsaXRNdWx0aUF0dHJzID0gc3BsaXRNdWx0aUF0dHJzOwotCX0KLQotCS8qKgotCSAqIFRydWUgaWYgdGFncyB3aXRoIFBDREFUQSBjb250ZW50IHNob3VsZCBub3QgaGF2ZSB0aGVpciB3aGl0ZXNwYWNlCi0JICogbWVzc2VkIHdpdGggd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJlc2VydmVQQ0RBVEFDb250ZW50KCkgewotCQlyZXR1cm4gZlByZXNlcnZlUENEQVRBQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgb3Igbm90IGZvcm1hdHRlciBzaG91bGQgcHJlc2VydmUgd2hpdGVzcGFjZSBpbiB0YWdzIHdpdGgKLQkgKiBQQ0RBVEEgY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlc2VydmVQQ0RBVEFDb250ZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VydmVQQ0RBVEFDb250ZW50KGJvb2xlYW4gcHJlc2VydmVQQ0RBVEFDb250ZW50KSB7Ci0JCWZQcmVzZXJ2ZVBDREFUQUNvbnRlbnQgPSBwcmVzZXJ2ZVBDREFUQUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogVHJ1ZSBpZiBlbmQgYnJhY2tldHMgb2Ygc3RhcnQgdGFncyBzaG91bGQgYmUgcGxhY2VkIG9uIGEgbmV3IGxpbmUgaWYKLQkgKiB0aGUgc3RhcnQgdGFnIHNwYW5zIG1vcmUgdGhhbiBvbmUgbGluZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbGlnbkVuZEJyYWNrZXQoKSB7Ci0JCXJldHVybiBmQWxpZ25FbmRCcmFja2V0OwotCX0KLQotCS8qKgotCSAqIFNldHMgd2hldGhlciBvciBub3QgZm9ybWF0dGVyIHNob3VsZCBhbGlnbiB0aGUgZW5kIGJyYWNrZXQgb2YgYSBzdGFydAotCSAqIHRhZyBvbiBhIG5ldyBsaW5lIGlmIHRoZSBzdGFydCB0YWcgc3BhbnMgbW9yZSB0aGFuIG9uZSBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBhbGlnbkVuZEJyYWNrZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbkVuZEJyYWNrZXQoYm9vbGVhbiBhbGlnbkVuZEJyYWNrZXQpIHsKLQkJZkFsaWduRW5kQnJhY2tldCA9IGFsaWduRW5kQnJhY2tldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9UZXh0Tm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvVGV4dE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczYWI3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9UZXh0Tm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIHhtbDpzcGFjZT0ncHJlc2VydmUnIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgVGV4dE5vZGVGb3JtYXR0ZXIgZXh0ZW5kcyBOb2RlRm9ybWF0dGVyIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ1IgPSAiXHIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIERFTElNSVRFUlMgPSAiIFx0XG5cclxmIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBGRiA9ICJcZiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTEYgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFNQQUNFID0gIiAiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFRBQiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGNvbXByZXNzU3BhY2VzKFN0cmluZyBzdHJpbmcsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCS8qCi0JCSAqIE5vdGUgdGhhdCB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3Igc3VwcG9ydHMgbWl4ZWQgbmV3IGxpbmUKLQkJICogY2hhcmFjdGVycyAoQ1IsIExGLCBDUkxGKSBpbiBvbmUgZmlsZS4gV2UgaGF2ZSB0byBoYW5kbGUgdGhhdCB3aGVuCi0JCSAqIHdlIHRyeSB0byBwcmVzZXJ2ZSBibGFuayBsaW5lcy4KLQkJICovCi0JCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gbnVsbDsKLQkJYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMgPSBmb3JtYXRDb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpOwotCi0JCWlmIChjbGVhckFsbEJsYW5rTGluZXMpCi0JCQlzdHJpbmdBcnJheSA9IFN0cmluZ1V0aWxzLmFzQXJyYXkoc3RyaW5nKTsKLQkJZWxzZQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHN0cmluZywgREVMSU1JVEVSUywgdHJ1ZSk7Ci0KLQkJU3RyaW5nQnVmZmVyIGNvbXByZXNzZWRTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChzdHJpbmdBcnJheS5sZW5ndGggPiAwKSB7Ci0JCQlib29sZWFuIGNyID0gZmFsc2UsIGxmID0gZmFsc2UsIGNyMiA9IGZhbHNlLCBub25TcGFjZSA9IHRydWU7Ci0KLQkJCWlmIChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oQ1IpID09IDApCi0JCQkJY3IgPSB0cnVlOwotCQkJZWxzZSBpZiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKExGKSA9PSAwKQotCQkJCWxmID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oU1BBQ0UpICE9IDApICYmIChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oVEFCKSAhPSAwKSAmJiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKEZGKSAhPSAwKSkgewotCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5WzBdKTsKLQkJCQlub25TcGFjZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc3RyaW5nQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc3RyaW5nQXJyYXlbaV0uY29tcGFyZVRvKENSKSA9PSAwKSB7Ci0JCQkJCWlmIChjciAmJiBsZikgewotCQkJCQkJaWYgKG5vblNwYWNlKSB7Ci0JCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoQ1IgKyBMRik7Ci0JCQkJCQkJbm9uU3BhY2UgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQkJCQkJCWNyMiA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY3IpIHsKLQkJCQkJCWlmIChub25TcGFjZSkgewotCQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKENSKTsKLQkJCQkJCQlub25TcGFjZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCQkJCQkJY3IyID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQljciA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhMRikgPT0gMCkgewotCQkJCQlpZiAoY3IgJiYgbGYgJiYgY3IyKSB7Ci0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVtpXSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobGYpIHsKLQkJCQkJCWlmIChub25TcGFjZSkgewotCQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKExGKTsKLQkJCQkJCQlub25TcGFjZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCWxmID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhTUEFDRSkgIT0gMCkgJiYgKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhUQUIpICE9IDApICYmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oRkYpICE9IDApKSB7Ci0JCQkJCWlmIChjb21wcmVzc2VkU3RyaW5nLmxlbmd0aCgpID4gMCkKLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKFNQQUNFKTsKLQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCi0JCQkJCWNyID0gZmFsc2U7Ci0JCQkJCWxmID0gZmFsc2U7Ci0JCQkJCWNyMiA9IGZhbHNlOwotCQkJCQlub25TcGFjZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvbXByZXNzZWRTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCS8vIFsxMTE2NzRdIElmIGluc2lkZSB4bWw6c3BhY2U9InByZXNlcnZlIiBlbGVtZW50LCB3ZSBiYWlsCi0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKSkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCQlpbnQgbGluZVdpZHRoID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKTsKLQkJCWludCBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gY29tcHV0ZUF2YWlsYWJsZUxpbmVXaWR0aChkb2MsIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgbGluZVdpZHRoKTsKLQotCQkJU3RyaW5nIG5vZGVUZXh0ID0gZ2V0Tm9kZVRleHQobm9kZSk7Ci0JCQlTdHJpbmcgY29tcHJlc3NlZFRleHQgPSBjb21wcmVzc1NwYWNlcyhub2RlVGV4dCwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQlpZiAoKChlbm91Z2hTcGFjZShwYXJlbnROb2RlLCBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoLCBjb21wcmVzc2VkVGV4dCkpICYmIChub1NpYmxpbmdzQW5kTm9Gb2xsb3dpbmdDb21tZW50KG5vZGUpKSAmJiAhZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluc0xpbmVEZWxpbWl0ZXJzKHBhcmVudE5vZGUpKSB8fCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgPT0gMCkgewotCQkJCWhhbmRsZU5vUmVmbG93KG5vZGUsIGRvYywgY29tcHJlc3NlZFRleHQsIHBhcmVudE5vZGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbm90IGVub3VnaCBzcGFjZSwgbmVlZCB0byByZWZsb3cgdGV4dAotCQkJCVN0cmluZyBub2RlSW5kZW50YXRpb24gPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gbGluZVdpZHRoIC0gZ2V0SW5kZW50YXRpb25MZW5ndGgobm9kZUluZGVudGF0aW9uKTsKLQkJCQlMaXN0IHZlY3RvciA9IHJlZmxvd1RleHQoY29tcHJlc3NlZFRleHQsIGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgpOwotCQkJCWludCB2ZWN0b3JTaXplID0gdmVjdG9yLnNpemUoKTsKLQkJCQlTdHJpbmdCdWZmZXIgcmVmbG93ZWRUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0TGluZURlbGltaXRlcihkb2MsIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJLy8gaGFuZGxlIGZpcnN0IGxpbmUgc3BlY2lhbGx5IHRvIGNoZWNrIGZvciBhbGxvd1doaXRlc3BhY2UKLQkJCQlpZiAodmVjdG9yU2l6ZSA+IDApIHsKLQkJCQkJLy8gZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0byBhbGxvdyB3aGl0ZXNwYWNlIGlmIHRoZXJlCi0JCQkJCS8vIGlzIGFuIGVudGl0eSBvciBjZGF0YSBiZWZvcmUgaXQKLQkJCQkJYm9vbGVhbiBhbGxvd1doaXRlc3BhY2UgPSB0cnVlOwotCQkJCQkvLyBbMjA2MDcyXSBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0JCQkJCWlmIChub2RlVGV4dC5sZW5ndGgoKSA9PSAwIHx8ICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5vZGVUZXh0LmNoYXJBdCgwKSkpIHsKLQkJCQkJCU5vZGUgcHJldmlvdXNTaWJsaW5nID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJCWlmIChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCAmJiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgfHwgcHJldmlvdXNTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpKQotCQkJCQkJCWFsbG93V2hpdGVzcGFjZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCVN0cmluZyB0aGVTdHJpbmcgPSAoU3RyaW5nKSB2ZWN0b3IuZ2V0KDApOwotCQkJCQlpZiAoYWxsb3dXaGl0ZXNwYWNlKSB7Ci0JCQkJCQlyZWZsb3dlZFRleHRCdWZmZXIuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJaWYgKHRoZVN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJCXJlZmxvd2VkVGV4dEJ1ZmZlci5hcHBlbmQobm9kZUluZGVudGF0aW9uKS5hcHBlbmQodGhlU3RyaW5nKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlZmxvd2VkVGV4dEJ1ZmZlci5hcHBlbmQodGhlU3RyaW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBkbyB0aGUgcmVzdCBvZiB0aGUgbGluZXMKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IHZlY3RvclNpemU7IGkrKykgewotCQkJCQlTdHJpbmcgdGhlU3RyaW5nID0gKFN0cmluZykgdmVjdG9yLmdldChpKTsKLQkJCQkJaWYgKHRoZVN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJCQkJcmVmbG93ZWRUZXh0QnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyKS5hcHBlbmQobm9kZUluZGVudGF0aW9uKS5hcHBlbmQodGhlU3RyaW5nKTsKLQkJCQkJZWxzZQotCQkJCQkJcmVmbG93ZWRUZXh0QnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIHJlZmxvd2VkVGV4dCA9IHJlZmxvd2VkVGV4dEJ1ZmZlci50b1N0cmluZygpOwotCQkJCWlmIChub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkgewotCQkJCQlpZiAoaXNFbmRUYWdNaXNzaW5nKHBhcmVudE5vZGUpKSB7Ci0JCQkJCQkvLyBkb24ndCBhZGQgaW5kZW50YXRpb24gdG8gZW5kIGlmIHBhcmVudCBlbmQgdGFnIGlzCi0JCQkJCQkvLyBtaXNzaW5nCi0JCQkJCX0KLQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGFkZCBwYXJlbnQncyBpbmRlbnRhdGlvbiB0byBlbmQKLQkJCQkJCW5vZGVJbmRlbnRhdGlvbiA9IGdldE5vZGVJbmRlbnQocGFyZW50Tm9kZSk7Ci0JCQkJCQlpZiAoIXJlZmxvd2VkVGV4dC5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKSkgewotCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICghcmVmbG93ZWRUZXh0LmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pKSB7Ci0JCQkJCQkvLyBub3QgYWxyZWFkeSBlbmRlZCB3aXRoIHRoZSBleHBlY3RlZCBpbmRlbnRhdGlvbgotCQkJCQkJTm9kZSBuZXh0U2libGluZyA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCWlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkJCQkJLy8gYWRkIGluZGVudGF0aW9uIHRvIGVuZCBpZgotCQkJCQkJCS8vIGN1cnJlbnRUZXh0RW5kc1dpdGhMaW5lRGVsaW1pdGVyCi0JCQkJCQkJLy8gb3IgZm9sbG93ZWQgYnkgbXVsdGlMaW5lQ29tbWVudAotCi0JCQkJCQkJaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlciA9IFN0cmluZ1V0aWxzLmluZGV4T2ZMYXN0TGluZURlbGltaXRlcihub2RlVGV4dCk7Ci0JCQkJCQkJYm9vbGVhbiBjdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlciA9IGluZGV4T2ZMYXN0TGluZURlbGltaXRlciAhPSAtMTsKLQkJCQkJCQlpZiAoY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIpIHsKLQkJCQkJCQkJLy8gbm8gbW9yZSBub24gYmxhbmsgY2hhcmFjdGVyIGFmdGVyIHRoZSBsYXN0Ci0JCQkJCQkJCS8vIGxpbmUgZGVsaW1pdGVyCi0JCQkJCQkJCWN1cnJlbnRUZXh0RW5kc1dpdGhMaW5lRGVsaW1pdGVyID0gU3RyaW5nVXRpbHMuaW5kZXhPZk5vbmJsYW5rKG5vZGVUZXh0LCBpbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIpID09IC0xOwotCQkJCQkJCX0KLQotCQkJCQkJCVN0cmluZyBub2RlVmFsdWUgPSBuZXh0U2libGluZy5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQlib29sZWFuIG11bHRpTGluZUNvbW1lbnQgPSBTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIobm9kZVZhbHVlKTsKLQotCQkJCQkJCWlmIChjdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlciB8fCBtdWx0aUxpbmVDb21tZW50KSB7Ci0JCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgfHwgbmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkgewotCQkJCQkJCWludCB0ZXh0TGVuZ3RoID0gbm9kZVRleHQubGVuZ3RoKCk7Ci0JCQkJCQkJaWYgKHRleHRMZW5ndGggPiAwICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2Uobm9kZVRleHQuY2hhckF0KHRleHRMZW5ndGggLSAxKSkpIHsKLQkJCQkJCQkJcmVmbG93ZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKHJlZmxvd2VkVGV4dCwgbGluZURlbGltaXRlcik7Ci0JCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gbm90IGEgY29tbWVudCwganVzdCBhZGQgYWRkIGluZGVudGF0aW9uIHRvIGVuZAotCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIHJlZmxvd2VkVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBLZWVwcyB0ZXh0IGlubGluZSB3aXRoIGl0cyBwYXJlbnQgKG5vIHJlZmxvdyBuZWNlc3NhcnkpCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZG9jCi0JICogQHBhcmFtIGNvbXByZXNzZWRUZXh0Ci0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlTm9SZWZsb3coSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIFN0cmluZyBjb21wcmVzc2VkVGV4dCwgSURPTU5vZGUgcGFyZW50Tm9kZSkgewotCQlTdHJpbmcgbm9kZUluZGVudGF0aW9uOwotCQkvLyBlbm91Z2ggc3BhY2UgYW5kIHRleHQgaGFzIG5vIGxpbmUgZGVsaW1pdGVycyBhbmQgKG5vZGUgaGFzIG5vCi0JCS8vIHNpYmxpbmdzIG9yIGZvbGxvd2VkIGJ5IGlubGluZSBjb21tZW50KSBhbmQKLQkJLy8gcGFyZW50Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluc0xpbmVEZWxpbWl0ZXJzCi0KLQkJaWYgKGlzRW5kVGFnTWlzc2luZyhwYXJlbnROb2RlKSkgewotCQkJcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgcGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl3aGlsZSAoaXNFbmRUYWdNaXNzaW5nKHBhcmVudE5vZGUpKQotCQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkvLyBhZGQgcGFyZW50J3MgaW5kZW50YXRpb24gdG8gZW5kCi0JCQlub2RlSW5kZW50YXRpb24gPSBnZXROb2RlSW5kZW50KHBhcmVudE5vZGUpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRMaW5lRGVsaW1pdGVyKGRvYywgbm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWlmICghY29tcHJlc3NlZFRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQljb21wcmVzc2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChjb21wcmVzc2VkVGV4dCwgbGluZURlbGltaXRlcik7Ci0JCQkJY29tcHJlc3NlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgoY29tcHJlc3NlZFRleHQsIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKHBhcmVudE5vZGUgIT0gbnVsbCkgJiYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID4gMCkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApICYmICgobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsKSB8fCAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpKSkKLQkJCS8vIGRlbGV0ZSBzcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIGRvY3VtZW50Ci0JCQljb21wcmVzc2VkVGV4dCA9IEVNUFRZX1NUUklORzsKLQotCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGNvbXByZXNzZWRUZXh0KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9TaWJsaW5nc0FuZE5vRm9sbG93aW5nQ29tbWVudChJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5leHRTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCXJldHVybiAhbm9kZUhhc1NpYmxpbmdzKG5vZGUpIHx8IChub0xpbmVEZWxpbWl0ZXIobm9kZSkgJiYgaXNDb21tZW50KG5leHRTaWJsaW5nKSAmJiBub0xpbmVEZWxpbWl0ZXIobmV4dFNpYmxpbmcpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50KElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vTGluZURlbGltaXRlcihJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9ICFTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBvbiB0aGUgY3VycmVudCBsaW5lIGZvcgotCSAqIGNvbXByZXNzZWRUZXh0IChhbmQgZm9yIGl0cyBwYXJlbnQgZW5kIHRhZykKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqIEBwYXJhbSBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoCi0JICogQHBhcmFtIGNvbXByZXNzZWRUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBlbm91Z2hTcGFjZShJRE9NTm9kZSBwYXJlbnROb2RlLCBpbnQgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCwgU3RyaW5nIGNvbXByZXNzZWRUZXh0KSB7Ci0JCWludCBwYXJlbnRFbmRUYWdMZW5ndGggPSBwYXJlbnROb2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCkgKyAzOwotCQlyZXR1cm4gY29tcHJlc3NlZFRleHQubGVuZ3RoKCkgPD0gKGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLSBwYXJlbnRFbmRUYWdMZW5ndGgpICYmICFTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIoY29tcHJlc3NlZFRleHQpOwotCX0KLQotCXByb3RlY3RlZCBWZWN0b3IgcmVmbG93VGV4dChTdHJpbmcgdGV4dCwgaW50IGF2YWlsYWJsZVdpZHRoKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ0FycmF5ID0gbnVsbDsKLQkJYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMgPSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldENsZWFyQWxsQmxhbmtMaW5lcygpOwotCi0JCWlmIChjbGVhckFsbEJsYW5rTGluZXMpCi0JCQlzdHJpbmdBcnJheSA9IFN0cmluZ1V0aWxzLmFzQXJyYXkodGV4dCk7Ci0JCWVsc2UKLQkJCXN0cmluZ0FycmF5ID0gU3RyaW5nVXRpbHMuYXNBcnJheSh0ZXh0LCBERUxJTUlURVJTLCB0cnVlKTsKLQotCQlWZWN0b3Igb3V0cHV0ID0gbmV3IFZlY3RvcigpOwotCQlpZiAoKHN0cmluZ0FycmF5ICE9IG51bGwpICYmIChzdHJpbmdBcnJheS5sZW5ndGggPiAwKSkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmIChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oQ1IpICE9IDApCi0JCQkJYnVmZmVyLmFwcGVuZChzdHJpbmdBcnJheVswXSk7Ci0JCQlpbnQgYnVmZmVyTGVuZ3RoID0gc3RyaW5nQXJyYXlbMF0udG9TdHJpbmcoKS5sZW5ndGgoKTsKLQkJCWJvb2xlYW4gY3IgPSBzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oQ1IpID09IDA7Ci0KLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc3RyaW5nQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgZWFjaFN0cmluZyA9IHN0cmluZ0FycmF5W2ldOwotCQkJCWlmICgoZWFjaFN0cmluZy5jb21wYXJlVG8oU1BBQ0UpICE9IDApICYmIChlYWNoU3RyaW5nLmNvbXBhcmVUbyhUQUIpICE9IDApICYmIChlYWNoU3RyaW5nLmNvbXBhcmVUbyhGRikgIT0gMCkpIHsKLQkJCQkJaWYgKChidWZmZXJMZW5ndGggKyAxICsgZWFjaFN0cmluZy5sZW5ndGgoKSA+IGF2YWlsYWJsZVdpZHRoKSB8fCAoZWFjaFN0cmluZy5jb21wYXJlVG8oQ1IpID09IDApIHx8IChlYWNoU3RyaW5nLmNvbXBhcmVUbyhMRikgPT0gMCkpIHsKLQkJCQkJCWlmICgoZWFjaFN0cmluZy5jb21wYXJlVG8oTEYpID09IDApICYmIGNyKSB7Ci0JCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJb3V0cHV0LmFkZChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJCWJ1ZmZlckxlbmd0aCA9IDA7Ci0JCQkJCQl9Ci0JCQkJCQljciA9IGVhY2hTdHJpbmcuY29tcGFyZVRvKENSKSA9PSAwOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGJ1ZmZlci50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoU1BBQ0UpOwotCQkJCQkJYnVmZmVyTGVuZ3RoKys7Ci0JCQkJCX0KLQkJCQkJaWYgKChlYWNoU3RyaW5nLmNvbXBhcmVUbyhDUikgIT0gMCkgJiYgKGVhY2hTdHJpbmcuY29tcGFyZVRvKExGKSAhPSAwKSkgewotCQkJCQkJYnVmZmVyLmFwcGVuZChlYWNoU3RyaW5nKTsKLQkJCQkJCWJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aCArIGVhY2hTdHJpbmcubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlvdXRwdXQuYWRkKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCQllbHNlCi0JCQlvdXRwdXQuYWRkKHRleHQpOwotCi0JCXJldHVybiBvdXRwdXQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGluZURlbGltaXRlcihJU3RydWN0dXJlZERvY3VtZW50IGRvYywgaW50IG5vZGVPZmZzZXQpIHsKLQkJaW50IGxpbmUgPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG5vZGVPZmZzZXQpOwotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAobGluZSA+IDApIHsKLQkJCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIobGluZSAtIDEpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCS8vIEJVRzExNTcxNjogaWYgY2Fubm90IGdldCBsaW5lIGRlbGltaXRlciBmcm9tIGN1cnJlbnQgbGluZSwganVzdAotCQkvLyB1c2UgZGVmYXVsdCBsaW5lIGRlbGltaXRlcgotCQlpZiAobGluZURlbGltaXRlciA9PSBudWxsKQotCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXJldHVybiBsaW5lRGVsaW1pdGVyOwotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVBdmFpbGFibGVMaW5lV2lkdGgoSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIGludCBub2RlT2Zmc2V0LCBpbnQgbGluZVdpZHRoKSB7Ci0JCS8vIGNvbXB1dGUgY3VycmVudCBhdmFpbGFibGUgbGluZSB3aWR0aAotCQlpbnQgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IDA7Ci0JCXRyeSB7Ci0JCQlpbnQgbGluZU9mZnNldCA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChub2RlT2Zmc2V0KS5nZXRPZmZzZXQoKTsKLQkJCVN0cmluZyB0ZXh0ID0gZG9jLmdldChsaW5lT2Zmc2V0LCBub2RlT2Zmc2V0IC0gbGluZU9mZnNldCk7Ci0JCQlpbnQgdXNlZFdpZHRoID0gZ2V0SW5kZW50YXRpb25MZW5ndGgodGV4dCk7Ci0JCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gbGluZVdpZHRoIC0gdXNlZFdpZHRoOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzNjc1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBYTUwuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQKLSAqLwotcHVibGljIGludGVyZmFjZSBJWE1MUGFydGl0aW9ucyB7Ci0JCi0JU3RyaW5nIFhNTF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9DREFUQSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9DREFUQSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX1BJID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX1BJIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfREVDTEFSQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVDTCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0NPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKgotCSAqIFRoaXMgdmFsdWUgaXMgdXNlZCBhcyBhIHByZWZpeCB0byBhbnkgdW5rbm93biBwcm9jZXNzaW5nIGluc3RydWN0aW9ucwotCSAqIHdlIGZpbmQuIFRoZSBwcm9jZXNzb3IgdGFyZ2V0IG5hbWUgaXMgY29udmVydGVkIHRvIHVwcGVyY2FzZSBhbmQKLQkgKiBhcHBlbmRlZCB0byB0aGUgcHJlZml4IHRvIGNyZWF0ZSBhIHVuaXF1ZSBwYXJ0aXRpb24gdHlwZS4KLQkgKi8KLQlTdHJpbmcgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9QUkVGSVggPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNob3VsZCBtYXRjaAotCSAqIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kdGQucGFydGl0aW9uaW5nLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQuU1RfRFREX1NVQlNFVAotCSAqLwotCVN0cmluZyBEVERfU1VCU0VUID0gIm9yZy5lY2xpcHNlLndzdC54bWwuZHRkLmludGVybmFsX3N1YnNldCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01SZWdpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NUmVnaW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTczZDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01SZWdpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRE9NUmVnaW9uQ29udGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS19URVhUID0gIkJMT0NLX1RFWFQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFRklORUQgPSAiVU5ERUZJTkVEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVfU1BBQ0UgPSAiV0hJVEVfU1BBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FUVExJU1RfREVDTF9DTE9TRSA9ICJYTUxfQVRUTElTVF9ERUNMX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVCA9ICJYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FUVExJU1RfREVDTF9OQU1FID0gIlhNTF9BVFRMSVNUX0RFQ0xfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OID0gIlhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DREFUQV9DTE9TRSA9ICJYTUxfQ0RBVEFfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NEQVRBX09QRU4gPSAiWE1MX0NEQVRBX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NEQVRBX1RFWFQgPSAiWE1MX0NEQVRBX1RFWFQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NIQVJfUkVGRVJFTkNFID0gIlhNTF9DSEFSX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9DTE9TRSA9ICJYTUxfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DT01NRU5UX09QRU4gPSAiWE1MX0NPTU1FTlRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9URVhUID0gIlhNTF9DT01NRU5UX1RFWFQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09OVEVOVCA9ICJYTUxfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfREVDTEFSQVRJT05fQ0xPU0UgPSAiWE1MX0RFQ0xBUkFUSU9OX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OX09QRU4gPSAiWE1MX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9ICJYTUxfRE9DVFlQRV9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSA9ICJYTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUMgPSAiWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiA9ICJYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU0gPSAiWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCA9ICJYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfTkFNRSA9ICJYTUxfRE9DVFlQRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UgPSAiWE1MX0VMRU1FTlRfREVDTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQgPSAiWE1MX0VMRU1FTlRfREVDTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSA9ICJYTUxfRUxFTUVOVF9ERUNMX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9ICJYTUxfRUxFTUVOVF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRU1QVFlfVEFHX0NMT1NFID0gIlhNTF9FTVBUWV9UQUdfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VORF9UQUdfT1BFTiA9ICJYTUxfRU5EX1RBR19PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTlRJVFlfUkVGRVJFTkNFID0gIlhNTF9FTlRJVFlfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BFX1JFRkVSRU5DRSA9ICJYTUxfUEVfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QSV9DTE9TRSA9ICJYTUxfUElfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BJX0NPTlRFTlQgPSAiWE1MX1BJX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BJX09QRU4gPSAiWE1MX1BJX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTID0gIlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX0FUVFJJQlVURV9OQU1FID0gIlhNTF9UQUdfQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgPSAiWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19DTE9TRSA9ICJYTUxfVEFHX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfTkFNRSA9ICJYTUxfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX09QRU4gPSAiWE1MX1RBR19PUEVOIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhZDJhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCXB1YmxpYyBDTURvY3VtZW50Q2FjaGUgZ2V0Q01Eb2N1bWVudENhY2hlKCk7Ci0KLQlwdWJsaWMgVVJJUmVzb2x2ZXIgZ2V0SWRSZXNvbHZlcigpOwotCi0JcHVibGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeSgpOwotCi0Jdm9pZCByZWxlYXNlKCk7Ci0KLQl2b2lkIHNldElkUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgbmV3SWRSZXNvbHZlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OGU2NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kZWxRdWVyeUFkYXB0ZXIgewotCXByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlOwotCXByb3RlY3RlZCBVUklSZXNvbHZlciBpZFJlc29sdmVyOwotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckltcGwoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5LCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXRoaXMuY21Eb2N1bWVudENhY2hlID0gY21Eb2N1bWVudENhY2hlOwotCQl0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5OwotCQl0aGlzLmlkUmVzb2x2ZXIgPSBpZFJlc29sdmVyOwotCX0KLQotCXB1YmxpYyBDTURvY3VtZW50Q2FjaGUgZ2V0Q01Eb2N1bWVudENhY2hlKCkgewotCQlyZXR1cm4gY21Eb2N1bWVudENhY2hlOwotCX0KLQotCXB1YmxpYyBVUklSZXNvbHZlciBnZXRJZFJlc29sdmVyKCkgewotCQlyZXR1cm4gaWRSZXNvbHZlcjsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KCkgewotCQlyZXR1cm4gbW9kZWxRdWVyeTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kZWxRdWVyeUFkYXB0ZXIjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZGVsUXVlcnlBZGFwdGVyI3NldElkUmVzb2x2ZXIoVVJJUmVzb2x2ZXIpCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpIHsKLQkJaWRSZXNvbHZlciA9IG5ld0lkUmVzb2x2ZXI7Ci0JCWlmIChtb2RlbFF1ZXJ5IGluc3RhbmNlb2YgTW92YWJsZU1vZGVsUXVlcnkpCi0JCQkoKE1vdmFibGVNb2RlbFF1ZXJ5KSBtb2RlbFF1ZXJ5KS5zZXRJZFJlc29sdmVyKG5ld0lkUmVzb2x2ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb3ZhYmxlTW9kZWxRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vdmFibGVNb2RlbFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZDczMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vdmFibGVNb2RlbFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLQotcHVibGljIGludGVyZmFjZSBNb3ZhYmxlTW9kZWxRdWVyeSBleHRlbmRzIE1vZGVsUXVlcnkgewotCi0Jdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld1VSSVJlc29sdmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGFza3MvWE1MRmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Rhc2tzL1hNTEZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGI4MTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGFza3MvWE1MRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgWE1MRmlsZVRhc2tTY2FubmVyIGV4dGVuZHMgU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lciB7Ci0JcHVibGljIFhNTEZpbGVUYXNrU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHRleHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2YmYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBleHRlbmRzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0KLQlwdWJsaWMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHN1cGVyLmdldFR5cGUoKTsKLQkJLy8gbm9ybWFsbHksIHdlIHdhbnQgdGhlIHNlY29uZCByZWdpb24gYXMgdGhlIGZsYXRub2RlIHR5cGUgLi4uIHNpbmNlCi0JCS8vIHRoZQotCQkvLyBmaXJzdCBvbmUgaXMgdXN1YWxseSBqdXN0ICJvcGVuIHRhZyIuCi0JCWlmICgocmVzdWx0ICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pICYmIChnZXRSZWdpb25zKCkuc2l6ZSgpID4gMSkpIHsKLQkJCXJlc3VsdCA9IGdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzM4NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117SVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQsIElYTUxQYXJ0aXRpb25zLlhNTF9DREFUQSwgSVhNTFBhcnRpdGlvbnMuWE1MX1BJLCBJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04sIElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5ULCBJWE1MUGFydGl0aW9ucy5EVERfU1VCU0VUfTsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUGFydGl0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCXN1cGVyLnNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCWZTdXBwb3J0ZWRUeXBlcyA9IGNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKQotCQkJcmVzdWx0ID0gSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQ7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9DREFUQTsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UKSB7Ci0JCQkvKioKLQkJCSAqIEdyYW1tYXRpY2FsbHksIGl0J3MgaW1wb3NzaWJsZSB0byBnZXQgYSBQSV9DT05URU5UIHJlZ2lvbgotCQkJICogd2l0aG91dCBhIHByZWNlZGluZyBYTUxfVEFHX05BTUUgcmVnaW9uLiBSZWx5aW5nIG9uIHRoaXMsCi0JCQkgKiBleHRyYWN0IHRoZSB0YXJnZXQgcHJvY2Vzc29yIG5hbWUgYW5kIGNyZWF0ZSBhIHBhcnRpdGlvbiB0eXBlCi0JCQkgKiBkeW5hbWljYWxseS4KLQkJCSAqLwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lID0gZG9jUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY1JlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFN0YXJ0KCkgLSAxKTsKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fUFJFRklYICsgZG9jUmVnaW9uLmdldFRleHQobmFtZSkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9QSTsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKQotCQkJcmVzdWx0ID0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUKQotCQkJcmVzdWx0ID0gSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVDsKLQkJZWxzZQotCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIHRlbXAgYWRkZWQganVzdCB0byBkaXMtYW1iaWd1YXRlIGNhbGwgZnJvbSBzdWJjbGFzcwotCQlyZXR1cm4gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4ocHJldmlvdXNOb2RlLCBuZXh0Tm9kZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBpbnN0YW5jZSA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gY29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvbkZyb21CbG9ja2VkVGV4dChJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQsIFN0cmluZyByZXN1bHQpIHsKLQkJLy8gd2FzIG1vdmVkIHRvIHN1YmNsYXNzIGZvciBxdWljayB0cmFuc2l0aW9uCi0JCVN0cmluZyBuZXdSZXN1bHQgPSByZXN1bHQ7Ci0JCS8vIG5zZF9UT0RPOiBEYXZpZCBhbmQgSSBuZWVkIHRvIGRpc2N1c3MsIGRlc2lnbiwgYW5kIGltcGxlbWVudCB0aGlzCi0JCS8vIGZvciBhbGwgYmxvY2sgdGFncyBhbmQgY29tbWVudHMKLQkJLy8gYW5kIG1ha2Ugc3VyZSBpcyBwYXJ0IG9mICJleHRlbnNpYmxlIiBkZXNpZ24gb2YgYmxvY2sgdGFncwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCS8vIGZvciBjb2RlIHNhZmV0eSwgd2UnbGwgYWx3YXlzIGNoZWNrIGluc3RhbmNlb2YsIGJ1dCBJIHRoaW5rCi0JCQkvLyBhbHdheXMgdHJ1ZS4KLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBGb3JlaWduUmVnaW9uKSB7Ci0JCQkJLy8gc3VwZXIgaXMgdXNlZCBiZWxvdyBzbyB3b24ndCBiZSBhbWJpZ3VvdXMKLQkJCQluZXdSZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChGb3JlaWduUmVnaW9uKSByZWdpb24sIG9mZnNldCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gaW5zdGFuY2VvZiBGb3JlaWduUmVnaW9uKSB7Ci0JCQkJbmV3UmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZSgoRm9yZWlnblJlZ2lvbikgcmVnaW9uLCBvZmZzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3UmVzdWx0ID0gZ2V0VW5rbm93bigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9QYXJzZXJTcGVjaWZpY0NoZWNrKGludCBvZmZzZXQsIGJvb2xlYW4gcGFydGl0aW9uRm91bmQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5leHQsIElUZXh0UmVnaW9uIHByZXZpb3VzU3RhcnQpIHsKLQkJLy8gdGhpcyB3YXMgbW92ZWQgZG93biB0byBzdWJjbGFzcyBvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpb25lcgotCQkvLyBmb3IgcXVpY2sgZml4IHRvIHRyYW5zaXRpb24gcHJvYmxlbXMuIEhlaXJhcmNoeSBuZWVkcyBsb3RzIG9mCi0JCS8vIGNsZWFudXAuCi0JCWlmIChwcmV2aW91c1N0YXJ0ICE9IG51bGwgJiYgcHJldmlvdXNTdGFydC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgbmV4dC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlJVGV4dFJlZ2lvbiBwcmV2aW91c05hbWUgPSBwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQocHJldmlvdXNTdGFydCkpOwotCQkJSVRleHRSZWdpb24gbmV4dE5hbWUgPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRFbmRPZmZzZXQobmV4dCkpOwotCQkJaWYgKHByZXZpb3VzTmFtZSAhPSBudWxsICYmIG5leHROYW1lICE9IG51bGwgJiYgcHJldmlvdXNOYW1lLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSAmJiBuZXh0TmFtZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIDAsIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBzZFJlZ2lvbikpOwotCQkJCXBhcnRpdGlvbkZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uRm91bmQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Fic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkZGRhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Fic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uQ29tcG9uZW50IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBWYWxpZGF0aW9uQ29tcG9uZW50IGdldFByb3BhZ2F0ZWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBWYWxpZGF0aW9uQWRhcHRlciBnZXRWYWxpZGF0b3IoKTsKLQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldFZhbGlkYXRvcigpLnZhbGlkYXRlKG5vZGUpOwotCi0JCXByb3BhZ2F0ZVRvQ2hpbGRFbGVtZW50cyhnZXRQcm9wYWdhdGVlKCksIChOb2RlKSBub2RlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvcGFnYXRlVG9DaGlsZEVsZW1lbnRzKFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yLCBOb2RlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNsYXNzIGNsYXp6ID0gdmFsaWRhdG9yLmdldENsYXNzKCk7Ci0KLQkJTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgY2hpbGQ7Ci0JCQkJVmFsaWRhdGlvbkFkYXB0ZXIgdmEgPSAoVmFsaWRhdGlvbkFkYXB0ZXIpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihjbGF6eik7Ci0JCQkJaWYgKHZhID09IG51bGwpIHsKLQkJCQkJbm90aWZpZXIuYWRkQWRhcHRlcih2YWxpZGF0b3IpOwotCQkJCQl2YSA9IHZhbGlkYXRvcjsKLQkJCQl9Ci0JCQkJLy8gYnVnIDE0MzIxMyAtIENhbid0IGJhdGNoIHZhbGlkYXRlIG9wZW4gSFRNTCBmaWxlcyB3aGVuCi0JCQkJLy8gYXMteW91LXR5cGUgdmFsaWRhdGlvbiBpcyBlbmFibGVkCi0JCQkJdmEuc2V0UmVwb3J0ZXIodmFsaWRhdG9yLmdldFJlcG9ydGVyKCkpOwotCQkJCXZhLnZhbGlkYXRlKChJbmRleGVkUmVnaW9uKSBjaGlsZCk7Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJvcGFnYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Qcm9wYWdhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTY1NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Qcm9wYWdhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDIuMCBNNSAtIGlmIHByb3BvZ2F0ZVRvQ2hpbGRFbGVtZW50IGlzIG5lZWRlZCwganVzdCBjb3B5Ci0gKiAgICAgICAgICAgICBtZXRob2QgdG8geW91ciBvd24gY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFByb3BhZ2F0b3IgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByb3BhZ2F0ZVRvQ2hpbGRFbGVtZW50cyhWYWxpZGF0aW9uQ29tcG9uZW50IHZhbGlkYXRvciwgTm9kZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDbGFzcyBjbGF6eiA9IHZhbGlkYXRvci5nZXRDbGFzcygpOwotCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0KLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgY2hpbGQ7Ci0JCQlWYWxpZGF0aW9uQWRhcHRlciB2YSA9IChWYWxpZGF0aW9uQWRhcHRlcikgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKGNsYXp6KTsKLQkJCWlmICh2YSA9PSBudWxsKSB7Ci0JCQkJbm90aWZpZXIuYWRkQWRhcHRlcih2YWxpZGF0b3IpOwotCQkJCXZhID0gdmFsaWRhdG9yOwotCQkJfQotCQkJdmEudmFsaWRhdGUoKEluZGV4ZWRSZWdpb24pIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb3BhZ2F0b3IgaXMganVzdCBhIHBsYWNlaG9sZGVyIG9mIHV0aWxpdGllcy4gRG9uJ3QgaW5zdGFudGlhdGUuCi0JICovCi0JcHJpdmF0ZSBQcm9wYWdhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkNvbXBvbmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDkyMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBWYWxpZGF0aW9uQWRhcHRlciB7Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFZhbGlkYXRpb25Db21wb25lbnQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbkNvbXBvbmVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IFZhbGlkYXRpb25BZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIFYyLgotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQl0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JfQotCi0JVmFsaWRhdGlvblJlcG9ydGVyIGdldFJlcG9ydGVyKCkgewotCQlyZXR1cm4gdGhpcy5yZXBvcnRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvdGV4dC9JWE1MUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRhNzg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvdGV4dC9JWE1MUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0OwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb24gdHlwZXMgZm9yIFhNTC4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJWE1MUGFydGl0aW9ucyB7Ci0JCi0JU3RyaW5nIFhNTF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9DREFUQSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9DREFUQSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX1BJID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX1BJIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfREVDTEFSQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVDTCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0NPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKgotCSAqIFRoaXMgdmFsdWUgaXMgdXNlZCBhcyBhIHByZWZpeCB0byBhbnkgdW5rbm93biBwcm9jZXNzaW5nIGluc3RydWN0aW9ucwotCSAqIHdlIGZpbmQuIFRoZSBwcm9jZXNzb3IgdGFyZ2V0IG5hbWUgaXMgY29udmVydGVkIHRvIHVwcGVyY2FzZSBhbmQKLQkgKiBhcHBlbmRlZCB0byB0aGUgcHJlZml4IHRvIGNyZWF0ZSBhIHVuaXF1ZSBwYXJ0aXRpb24gdHlwZS4KLQkgKi8KLQlTdHJpbmcgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9QUkVGSVggPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNob3VsZCBtYXRjaAotCSAqIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kdGQucGFydGl0aW9uaW5nLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQuU1RfRFREX1NVQlNFVAotCSAqLwotCVN0cmluZyBEVERfU1VCU0VUID0gIm9yZy5lY2xpcHNlLndzdC54bWwuZHRkLmludGVybmFsX3N1YnNldCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDNjMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXZhbGlkYXRpb24iIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLW11bHRpcGFnZSIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtd2l6YXJkcyIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtY2F0YWxvZyIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIgotCQlwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40IiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iCi0JCXBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9WYWxpZGF0aW9uRXhjZXB0aW9uIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0xvY2FsaXplZE1lc3NhZ2UvIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lNZXNzYWdlIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9jb3JlL01lc3NhZ2UiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVJlcG9ydGVyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0aW9uQ29udGV4dCIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9yIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0U2luZ2xlRmlsZURpYWxvZyIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9JTWVzc2FnZUFjY2VzcyIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lWYWxpZGF0b3JKb2IiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy9TZWxlY3RTaW5nbGVGaWxlVmlldyIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BDb21tYW5kIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9EcmFnQW5kRHJvcE1hbmFnZXIiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL09iamVjdFRyYW5zZmVyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9WaWV3ZXJEcmFnQWRhcHRlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJvcEFkYXB0ZXIiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25NYW5hZ2VyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Qcm9qZWN0Q29uZmlndXJhdGlvbiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0b3JNZXRhRGF0YSIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvVmFsaWRhdGlvbkZhY3RvcnkiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvdmlld2Vycy8qIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uQ29uZmlndXJhdGlvbiIgLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIgLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxYzI4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAoteG1sZWRpdG9yLmphcgotb3JnLmVjbGlwc2Uud3N0LnhtbC51aV8xLjAuMC5qYXIKLW9yZy5lY2xpcHNlLndzdC54bWwudWlfMS4wLjAuemlwCi14bWxlZGl0b3JzcmMuemlwCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhY2FlOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9wcm9qZWN0aW9ucGVyZj1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGRjNGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWwudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz48L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxMmRhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1NhdCBNYXIgMjQgMDI6NTk6NDkgRURUIDIwMDcNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWNlN2I1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotI1dlZCBOb3YgMjIgMjM6MjM6MDEgRVNUIDIwMDYKLWNsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPWZhbHNlCi1jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLWNsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotY2xlYW51cC5mb3JtYXRfY29tbWVudD10cnVlCi1jbGVhbnVwLmZvcm1hdF9qYXZhZG9jPXRydWUKLWNsZWFudXAuZm9ybWF0X211bHRpX2xpbmVfY29tbWVudD10cnVlCi1jbGVhbnVwLmZvcm1hdF9zaW5nbGVfbGluZV9jb21tZW50PXRydWUKLWNsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLWNsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD10cnVlCi1jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLWNsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9ZmFsc2UKLWNsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLWNsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLWNsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLWNsZWFudXAudXNlX2Jsb2Nrcz10cnVlCi1jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLWNsZWFudXBfcHJvZmlsZT1fU1NFIFRlYW0gU3R5bGVzCi1jbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0YThiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNXZWQgSnVuIDA0IDIwOjA3OjQ3IEVEVCAyMDA4Ci1jb21waWxlcnMuZi51bnJlc29sdmVkLWZlYXR1cmVzPTEKLWNvbXBpbGVycy5mLnVucmVzb2x2ZWQtcGx1Z2lucz0xCi1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuZGlzY291cmFnZWQtY2xhc3M9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAuaW50ZXJuYWw9MQotY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1pZGVudGlmaWVyPTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy5zLmNyZWF0ZS1kb2NzPWZhbHNlCi1jb21waWxlcnMucy5kb2MtZm9sZGVyPWRvYwotY29tcGlsZXJzLnMub3Blbi10YWdzPTEKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2U0N2U5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhtbC51aSwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5pY29ucy5ldG9vbDUwO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLmljb25zLm9iajE2O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLmljb25zLm92cjE2O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG5kO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kb3VibGVjbGljazt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5lcnJvcmluZm87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3M7YnVuZGxlLXZlcnNpb249IlszLjMuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy44LjEsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjAsNC4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenk7IGV4Y2x1ZGU6PSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5lcnJvcmluZm8iCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTE1ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBleGFtcGxlcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHNyYy1tdWx0aXBhZ2UvLFwKLSAgICAgICAgICAgc3JjLXdpemFyZHMvLFwKLSAgICAgICAgICAgc3JjLWNhdGFsb2cvLFwKLSAgICAgICAgICAgc3JjLXZhbGlkYXRpb24KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9leGFtcGxlcy9FZGl0aW5nQW5kVmFsaWRhdGluZ1hNTC56aXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvZXhhbXBsZXMvRWRpdGluZ0FuZFZhbGlkYXRpbmdYTUwuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjU3NzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9leGFtcGxlcy9FZGl0aW5nQW5kVmFsaWRhdGluZ1hNTC56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvWE1MRmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvWE1MRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZWIxYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL1hNTEZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3NDcyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29sbGFwc2VfYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMGRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9mZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9mZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGNlYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyM2Q1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzN2I3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZF9hbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmRfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyYzE0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZF9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X3htbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxY2ZkZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfeG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvcmxkZ3Jtci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3JsZGdybXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTMyNWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvcmxkZ3Jtci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3ZhbGlkYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjFkMTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvdmFsaWRhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1YmMxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2VfYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODBhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9mZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9mZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYWIwNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyZjljMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmNDUzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZF9hbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNWIyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZF9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X3htbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmI2MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfeG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvcmxkZ3Jtci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3JsZGdybXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDljYWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvcmxkZ3Jtci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwZWViNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2FkZF9jb3JyZWN0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2FkZF9jb3JyZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyZDdlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hZGRfY29ycmVjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hdHRfcmVxX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hdHRfcmVxX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzY2ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0X3JlcV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNDlkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NkYXRhc2VjdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jZGF0YXNlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA4NzJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NkYXRhc2VjdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzYmEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyY2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvcnJlY3Rpb25fY2hhbmdlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvcnJlY3Rpb25fY2hhbmdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4M2M1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jb3JyZWN0aW9uX2NoYW5nZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kb2N0eXBlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2RvY3R5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAwZjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2RvY3R5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwYWNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2NzgxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmZDNkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmOTE0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudW0uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW51bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMGE0ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW51bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lcnJvci1vdmVybGF5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2Vycm9yLW92ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2Vycm9yLW92ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWx2YXJpYWJsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWx2YXJpYWJsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjQ0YjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhZDA4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9vY2N1cm9uZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvb2NjdXJvbmVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiNjVjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9vY2N1cm9uZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvaW5zdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvaW5zdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDQzNmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3Byb2luc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzVkMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZjUxNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLW1hY3JvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1tYWNyby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWY4MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLW1hY3JvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZ19nZW5lcmljX2RlZW1waGFzaXplZF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX2dlbmVyaWNfZGVlbXBoYXNpemVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhY2I0MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX2dlbmVyaWNfZGVlbXBoYXNpemVkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfZ2VuZXJpY19lbXBoYXNpemVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfZ2VuZXJpY19lbXBoYXNpemVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzFkYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX2dlbmVyaWNfZW1waGFzaXplZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhN2EzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjI2ZTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNWY1ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2FybmluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L3N0YWxlX2Vycm9yX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi9zdGFsZV9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjA0NzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L3N0YWxlX2Vycm9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTA3MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvd2Fybl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvdmlldzE2L2F0dGlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3ZpZXcxNi9hdHRpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvdmlldzE2L2F0dGlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3dpemJhbi9nZW5lcmF0ZXhtbF93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2dlbmVyYXRleG1sX3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxN2U0OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2dlbmVyYXRleG1sX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5NmIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6YmFubmVyLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9uZXdTYW1wbGVQcm9qZWN0X3dpemJhbm5lci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzE0NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6YmFubmVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMveG1sZG9jLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy94bWxkb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGViMWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy94bWxkb2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTAwYWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICBEYXZpZCBDYXJ2ZXIgLyBTVEFSIFN0YW5kYXJkcyAtIGFkZGVkIFhNTCBDYXRhbG9nIEltcG9ydC9FeHBvcnQgV2l6YXJkCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZyAxOTI1NjgKLSMgICAgIERhdmlkIENhcnZlciAvIFNUQVIgU3RhbmRhcmRzIC0gYnVnIDIxMjMzMCAtIG1pZ3JhdGUgdG8gb3JnLmVjbGlwc2UudWkubWVudXMgCQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVhNTCBVSSBQbHVnaW4KLVhNTC5uYW1lPVhNTAotWE1MX0ZpbGVzLm5hbWU9WE1MIEZpbGVzCi1YTUxfU291cmNlLm5hbWU9RWRpdG9yCi1YTUxfVGVtcGxhdGVzLm5hbWU9VGVtcGxhdGVzCi1YTUxfU3R5bGVzLm5hbWU9U3R5bGVzCi1YTUxfU3ludGF4X0NvbG9yaW5nPVN5bnRheCBDb2xvcmluZwotWE1MX1R5cGluZz1UeXBpbmcKLVhNTF9FZGl0b3IubmFtZT1YTUwgRWRpdG9yCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1fVUlfV0laQVJEX05FV19YTUw9WE1MCi1fVUlfV0laQVJEX1hNTF9DQVRFR09SWT1YTUwKLWdlbk1lbnVMYWJlbD0mR2VuZXJhdGUKLV9VSV9BQ1RJT05fQ1JFQVRFX1hNTD0mWE1MIEZpbGUuLi4KLV9VSV9DUkVBVEVfTkVXX1hNTF9GSUxFPUNyZWF0ZSBhIG5ldyBYTUwgZmlsZQotX1VJX1dJWkFSRF9JTVBPUlRfRVhQT1JUX1hNTENBVEFMT0c9WE1MIENhdGFsb2cKLV9VSV9JTVBPUlRfWE1MX0NBVEFMT0dfRklMRT1JbXBvcnQgYW4gZXhpc3RpbmcgWE1MIENhdGFsb2cuCi1fVUlfRVhQT1JUX1hNTF9DQVRBTE9HX0ZJTEU9RXhwb3J0IGFuIFhNTCBDYXRhbG9nLgotWE1MRXhhbXBsZS5uYW1lPUVkaXRpbmcgYW5kIHZhbGlkYXRpbmcgWE1MIGZpbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmRlc2NyaXB0aW9uPUNyZWF0ZSBhIHByb2plY3QgY29udGFpbmluZyBYTUwgc2FtcGxlIGZpbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnByb2plY3RuYW1lPVhNTEV4YW1wbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2V0aXRsZT1YTUwgc2FtcGxlIGZpbGVzIGZvciBlZGl0aW5nIGFuZCB2YWxpZGF0aW5nCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2VkZXNjcmlwdGlvbj1DcmVhdGUgYSBwcm9qZWN0IGNvbnRhaW5pbmcgWE1MIHNhbXBsZSBmaWxlcy4KLVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubGFiZWw9JlByb2plY3QgTmFtZToKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFsbF9YTUxfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9QWxsIFhNTAotWE1MX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgWE1MCi1YTUxfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhNTCBUYWcKLVhNTF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9WE1MIEF0dHJpYnV0ZQotWE1MX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YTUwgQXR0cmlidXRlIHZhbHVlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1YTUxfQ2F0YWxvZ19GaWxlX1R5cGVfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9WE1MIENhdGFsb2cgZmlsZSB0eXBlIGV4dGVuc2lvbiBwb2ludAotX1VJX1BSRUZfWE1MX0NBVEFMT0c9WE1MIENhdGFsb2cKLV9VSV9QUkVGX0RURF9GSUxFUz1EVEQgRmlsZXMKLV9VSV9QUkVGX1hTRF9GSUxFUz1YU0QgRmlsZXMKLV9VSV9QUkVGX1RBR0xJQl9ERUZfRklMRVM9VGFnbGliIERlZmluaXRpb24gRmlsZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV9VSV9YTUxfVkFMSURBVE9SICAgICAgICAgICAgICAgICAgID0gWE1MIFZhbGlkYXRvcgotX1VJX1JFRl9GSUxFX1NIT1dfREVUQUlMUyAgICAgICAgICAgPSBTaG93IERldGFpbHMuLi4KLV9VSV9NRU5VX1ZBTElEQVRFX1hNTCAgICAgICAgICAgICAgID0gVmFsaWRhdGUgWE1MIEZpbGUKLSMjCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotIyMKLXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcz1lZGl0b3IgeG1sIGNyZWF0aW5nIHNhdmluZyBmaWxlcyBzdWZmaXggc3BlY2lmaWVkIGVuY29kaW5nIGlhbmEKLXByZWZlcmVuY2VLZXl3b3Jkcy5zb3VyY2U9ZWRpdG9yIHhtbCBzb3VyY2UgZm9ybWF0dGluZyBsaW5lIHdpZHRoIHNwbGl0IG11bHRpcGxlIGF0dHJpYnV0ZXMgbmV3IGNsZWFyIGJsYW5rIGluZGVudCB0YWJzIHNwYWNlcyBzaXplIGNvbnRlbnQgYXNzaXN0IGF1dG9tYXRpY2FsbHkgc3VnZ2VzdGlvbnMgcHJvbXB0IGNoYXJhY3RlcnMgaW5zZXJ0ZWQgc3RyYXRlZ3kgbGF4IHN0cmljdCBncmFtbWFyIGNvbnN0cmFpbnRzIGluZmVycmVkIGFic2VuY2UgZHRkIHNjaGVtYQotcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcz1lZGl0b3IgeG1sIHRlbXBsYXRlcyBzbmlwcGV0IG1hY3JvcwotcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcz1lZGl0b3IgeG1sIHN0eWxlIGN1c3RvbWl6ZSBzeW50YXggaGlnaGxpZ2h0aW5nIHR5cGUgdGV4dCBjb250ZW50IGZvcmVncm91bmQgYmFja2dyb3VuZCBib2xkIGNvbG9yCi1wcmVmZXJlbmNlS2V5d29yZHMueG1sY2F0YWxvZz14bWwgY2F0YWxvZyBlbnRyaWVzCi1wcmVmZXJlbmNlS2V5d29yZHMuc2V2ZXJpdGllcz14bWwgZ3JhbW1hciBlcnJvcnMgd2FybmluZ3MgaWdub3JlIG9wdGlvbnMgc2V2ZXJpdHkgc2V2ZXJpdGllcyBzdXBwcmVzcyBwcm9qZWN0IHNwZWNpZmljIHByb2plY3RzcGVjaWZpYwotCi0jIwotWE1MX1NvdXJjZV90YXJnZXRfbmFtZT1YTUwgU291cmNlCi1YTUxfaHlwZXJsaW5rPVRhZ3MgQW5kIEF0dHJpYnV0ZXMKLSMjCi1EZXNpZ25NZW51X25hbWU9JkRlc2lnbgotUmVsb2FkRGVwZW5kZW5jaWVzX25hbWU9UmVsb2FkIERlcGVuZGVuY2llcwotUmVsb2FkRGVwZW5kZW5jaWVzX2Rlc2NyaXB0aW9uPVJlbG9hZCBEZXBlbmRlbmNpZXMKLVJlbG9hZERlcGVuZGVuY2llc19tbmVtb25pYz1SCi1Db25zdHJhaW50c19uYW1lPVR1cm4gb2ZmIEdyYW1tYXIgQ29uc3RyYWludHMKLUNvbnN0cmFpbnRzX2Rlc2NyaXB0aW9uPVR1cm4gb2ZmIGdyYW1tYXIgQ29uc3RyYWludHMKLUNvbnN0cmFpbnRzX21uZW1vbmljPVQKLUV4cGFuZEFsbF9uYW1lPUV4cGFuZCBBbGwKLUNvbGxhcHNlQWxsX25hbWU9Q29sbGFwc2UgQWxsCi1BY3Rpb25EZWZpbml0aW9uLm5leHRTaWJsaW5nLm5hbWU9TmV4dCBTaWJsaW5nCi1BY3Rpb25EZWZpbml0aW9uLm5leHRTaWJsaW5nLmRlc2NyaXB0aW9uPUdvIHRvIE5leHQgU2libGluZwotQWN0aW9uRGVmaW5pdGlvbi5wcmV2aW91c1NpYmxpbmcubmFtZT1QcmV2aW91cyBTaWJsaW5nCi1BY3Rpb25EZWZpbml0aW9uLnByZXZpb3VzU2libGluZy5kZXNjcmlwdGlvbj1HbyB0byBQcmV2aW91cyBTaWJsaW5nCi1BY3Rpb25EZWZpbml0aW9uLmdvdG9NYXRjaGluZ1RhZy5uYW1lPU1hdGNoaW5nIFRhZwotQWN0aW9uRGVmaW5pdGlvbi5nb3RvTWF0Y2hpbmdUYWcuZGVzY3JpcHRpb249R28gdG8gTWF0Y2hpbmcgVGFnCi1NYXRjaGluZ1RhZ1ByZWZlcmVuY2UubGFiZWw9TWF0Y2hpbmcgVGFncwotCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5uYW1lPUVkaXRpbmcgWE1MIFNvdXJjZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZGVzY3JpcHRpb249RWRpdGluZyBYTUwgU291cmNlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5uYXZpZ2F0aW9uLm5hbWU9WE1MIFNvdXJjZSBOYXZpZ2F0aW9uCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5uYXZpZ2F0aW9uLmRlc2NyaXB0aW9uPVhNTCBTb3VyY2UgTmF2aWdhdGlvbgotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY2xlYW51cC5uYW1lPVhNTCBTb3VyY2UgQ2xlYW51cAotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY2xlYW51cC5kZXNjcmlwdGlvbj1YTUwgU291cmNlIENsZWFudXAKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmNvbW1lbnRzLm5hbWU9WE1MIFNvdXJjZSBDb21tZW50cwotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY29tbWVudHMuZGVzY3JpcHRpb249WE1MIFNvdXJjZSBDb21tZW50cwotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuc2VsZWN0aW9uLm5hbWU9WE1MIFNvdXJjZSBTZWxlY3Rpb24KLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLnNlbGVjdGlvbi5kZXNjcmlwdGlvbj1YTUwgU291cmNlIFNlbGVjdGlvbgotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZGVwZW5kZW5jaWVzLm5hbWU9WE1MIFNvdXJjZSBEZXBlbmRlbmNpZXMKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmRlcGVuZGVuY2llcy5kZXNjcmlwdGlvbj1YTUwgU291cmNlIERlcGVuZGVuY2llcwotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZ3JhbW1hci5uYW1lPVhNTCBTb3VyY2UgR3JhbW1hcgotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZ3JhbW1hci5kZXNjcmlwdGlvbj1YTUwgU291cmNlIEdyYW1tYXIKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmV4cGFuZC5uYW1lPVhNTCBTb3VyY2UgRXhwYW5kL0NvbGxhcHNlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5leHBhbmQuZGVzY3JpcHRpb249WE1MIFNvdXJjZSBFeHBhbmQvQ29sbGFwc2UKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLm9jY3VycmVuY2VzLm5hbWU9WE1MIFNvdXJjZSBPY2N1cnJlbmNlcwotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwub2NjdXJyZW5jZXMuZGVzY3JpcHRpb249WE1MIFNvdXJjZSBPY2N1cnJlbmNlcwotCi1Db2xvcnMudGFnQXR0cmlidXRlTmFtZT1UYWcgQXR0cmlidXRlIE5hbWUKLUNvbG9ycy50YWdBdHRyaWJ1dGVWYWx1ZT1UYWcgQXR0cmlidXRlIFZhbHVlCi1Db2xvcnMuY29tbWVudEJvcmRlcj1Db21tZW50IEJvcmRlcgotQ29sb3JzLmNvbW1lbnRUZXh0PUNvbW1lbnQgVGV4dAotQ29sb3JzLmRlY2xCb3JkZXI9RGVjbGFyYXRpb24gQm9yZGVyCi1Db2xvcnMuZG9jdHlwZU5hbWU9RG9jdHlwZSBOYW1lCi1Db2xvcnMuZG9jdHlwZUV4dGVybmFsUHVicmVmPURvY3R5cGUgRXh0ZXJuYWwgUHVibGljIFJlZmVyZW5jZQotQ29sb3JzLmRvY3R5cGVFeHRlcm5hbElkPURvY3R5cGUgRXh0ZXJuYWwgSWQKLUNvbG9ycy5kb2N0eXBlRXh0cmVuYWxTeXNyZWY9RG9jdHlwZSBFeHRlcm5hbCBTeXN0ZW0gUmVmZXJlbmNlCi1Db2xvcnMudGFnQm9yZGVyPVRhZyBCb3JkZXIKLUNvbG9ycy50YWdOYW1lPVRhZyBOYW1lCi1Db2xvcnMucGlCb3JkZXI9UHJvY2Vzc2luZyBJbnN0cnVjdGlvbiBCb3JkZXIKLUNvbG9ycy5jZGF0YUJvcmRlcj1DREFUQSBCb3JkZXIKLUNvbG9ycy5jZGF0YVRleHQ9Q0RBVEEgVGV4dAotQ29sb3JzLmVudGl0eVJlZmVyZW5jZT1FbnRpdHkgUmVmZXJlbmNlCi0KLSMgTWVudSBjb250cmlidXRpb25zCi1jb21tYW5kLnRvZ2dsZS5jb21tZW50Lm1uZW1vbmljPVQKLWNvbW1hbmQuYWRkLmJsb2NrLmNvbW1lbnQubW5lbW9uaWM9QQotY29tbWFuZC5yZW1vdmUuYmxvY2suY29tbWVudC5tbmVtb25pYz1SClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhM2Q1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjMiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjYXRhbG9nRmlsZVR5cGUiIG5hbWU9IiVYTUxfQ2F0YWxvZ19GaWxlX1R5cGVfRXh0ZW5zaW9uX1BvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NhdGFsb2dGaWxlVHlwZS5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNhdGFsb2dGaWxlVHlwZSI+Ci0JCTxmaWxlVHlwZQotCQkJZXh0ZW5zaW9ucz0iZHRkLCBlbnQsIG1vZCIKLQkJCWRlc2NyaXB0aW9uPSIlX1VJX1BSRUZfRFREX0ZJTEVTIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS51aS5jYXRhbG9nRmlsZVR5cGUuZHRkIj4KLQkJPC9maWxlVHlwZT4KLQkJPGZpbGVUeXBlCi0JCQlleHRlbnNpb25zPSJ4c2QiCi0JCQlkZXNjcmlwdGlvbj0iJV9VSV9QUkVGX1hTRF9GSUxFUyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudWkuY2F0YWxvZ0ZpbGVUeXBlLnhzZCI+Ci0JCTwvZmlsZVR5cGU+Ci0JCTxmaWxlVHlwZQotCQkJZXh0ZW5zaW9ucz0idGxkIgotCQkJZGVzY3JpcHRpb249IiVfVUlfUFJFRl9UQUdMSUJfREVGX0ZJTEVTIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS51aS5jYXRhbG9nRmlsZVR5cGUudGxkIj4KLQkJPC9maWxlVHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS1UaGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSBjb250ZW50IHR5cGUgaXMgb25seSBmb3IKLQkJaGFuZGxpbmcgc29tZSBzcGVjaWFsIGNhc2VzIG9mIGlsbC1mb3JtZWQgeG1sIGluIGEgcmVhc29uYWJsZQotCQltYW5uZXIsIGFuZCBzaG91bGQgbm90IGJlIGVtdWxhdGVkIGJ5IGNsaWVudHMuIFRoZSB0d28gY29udGVudAotCQl0eXBlcyBhcmUgb2Z0ZW4gdXNlZCBpbnRlcmNoYW5nZWFibHkgYnkgdGhlIFhNTCBjb21wb25lbnQsIGJ1dAotCQlwbGVhc2UgdXNlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwgaW5zdGVhZC4gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MuY29udGVudG91dGxpbmUuWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxkb2N1bWVudGF0aW9uVGV4dEhvdmVyCi0gICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvLlhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCI+Ci0gIAkJPC9kb2N1bWVudGF0aW9uVGV4dEhvdmVyPgotICAJCTxkb3VibGVDbGlja1N0cmF0ZWd5Ci0gICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kb3VibGVjbGljay5YTUxEb3VibGVDbGlja1N0cmF0ZWd5IgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIj4KLSAgCQk8L2RvdWJsZUNsaWNrU3RyYXRlZ3k+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InNvdXJjZWVkaXRpbmd0ZXh0dG9vbHMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRleHQuWE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic3RydWN0dXJlZHRleHRmb2xkaW5ncHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uWE1MUXVpY2tBc3Npc3RQcm9jZXNzb3IiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImF1dG9lZGl0c3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdC5TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneVhNTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuc291cmNlLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLmNvbG9ycyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0ic3BlbGxpbmdyZWdpb25zIgotCQkJdmFsdWU9IlhNTF9DT01NRU5UX1RFWFQsIFhNTF9DT05URU5ULCBYTUxfREVGQVVMVCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0iYWN0aXZlY29udGV4dHMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5uYXZpZ2F0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmNsZWFudXAsIG9yZy5lY2xpcHNlLndzdC54bWwuY29tbWVudHMsIG9yZy5lY2xpcHNlLndzdC54bWwuc2VsZWN0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmRlcGVuZGVuY2llcywgb3JnLmVjbGlwc2Uud3N0LnhtbC5ncmFtbWFyLCBvcmcuZWNsaXBzZS53c3QueG1sLmV4cGFuZCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5vY2N1cnJlbmNlcyIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwubmF2aWdhdGlvbi5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwubmF2aWdhdGlvbi5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLm5hdmlnYXRpb24iPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY2xlYW51cC5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY2xlYW51cC5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNsZWFudXAiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY29tbWVudHMubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmNvbW1lbnRzLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29tbWVudHMiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuc2VsZWN0aW9uLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5zZWxlY3Rpb24uZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5zZWxlY3Rpb24iPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZGVwZW5kZW5jaWVzLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5kZXBlbmRlbmNpZXMuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5kZXBlbmRlbmNpZXMiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZ3JhbW1hci5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZ3JhbW1hci5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmdyYW1tYXIiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZXhwYW5kLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5leHBhbmQuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5leHBhbmQiPgotCQk8L2NvbnRleHQ+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwub2NjdXJyZW5jZXMubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLm9jY3VycmVuY2VzLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwub2NjdXJyZW5jZXMiPgotCQk8L2NvbnRleHQ+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgLz4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTwhLS0gVGhlICJ0b3AtbGV2ZWwiIFhNTCBjYXRlZ29yeSAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUwubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVtcHR5RmlsZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sIj4KLQkJPC9wYWdlPgotCQk8IS0tIFRoZSAibG93ZXIgbGV2ZWwiIFhNTCBGaWxlcyBjYXRlZ29yeS9wYWdlIC0tPgotCQk8cGFnZQotCQkJbmFtZT0iJVhNTF9GaWxlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByZWZlcmVuY2VzLnhtbC54bWwiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmZpbGVzIi8+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc2V2ZXJpdGllcyIvPgotICAgICAgICA8L3BhZ2U+Ci0JCTwhLS0gWE1MIFBSRUZFUkVOQ0UgUEFHRVMgLS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlWE1MX1NvdXJjZS5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sLnhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFNvdXJjZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnNvdXJjZSI+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc291cmNlIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUxfVGVtcGxhdGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC50ZW1wbGF0ZXMiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnRlbXBsYXRlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlWE1MX1N5bnRheF9Db2xvcmluZyIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxTeW50YXhDb2xvcmluZ1BhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuY29sb3JzIj4KLSAgICAgICAgIAk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zdHlsZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJV9VSV9QUkVGX1hNTF9DQVRBTE9HIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLlhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkueG1sY2F0YWxvZyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlWE1MX1R5cGluZyIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxUeXBpbmdQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC50eXBpbmciPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBLZXl3b3JkcyBmb3IgcHJlZmVyZW5jZSBhbmQgcHJvcGVydGllcyBwYWdlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmZpbGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zb3VyY2UiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnRlbXBsYXRlcyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuc3R5bGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc3R5bGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy54bWxjYXRhbG9nIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkueG1sY2F0YWxvZyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuc2V2ZXJpdGllcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNldmVyaXRpZXMiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiPjwvcGFydD4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZTIiPjwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiPjwvcGFydD4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZTIiPjwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIFRlbXBsYXRlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUFsbF9YTUxfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZVhNTCIKLQkJCWlkPSJ4bWxfYWxsIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlWE1MX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlWE1MIgotCQkJaWQ9InhtbF9uZXciPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVYTUxfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVYTUwiCi0JCQlpZD0ieG1sX3RhZyI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJVhNTF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZVhNTCIKLQkJCWlkPSJ4bWxfYXR0cmlidXRlIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlWE1MX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlWE1MIgotCQkJaWQ9InhtbF9hdHRyaWJ1dGVfdmFsdWUiPgotCQk8L2NvbnRleHRUeXBlPgotCQk8aW5jbHVkZQotCQkJZmlsZT0idGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnhtbCIKLQkJCXRyYW5zbGF0aW9ucz0iJG5sJC90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyI+Ci0JCTwvaW5jbHVkZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlWE1MX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy94bWxkb2MuZ2lmIgotCQkJY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIgLz4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCi0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI+Ci0JCQk8L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI+Ci0JCQk8L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBDb250cmlidXRlIGEgJ05ldyBXaXphcmQnIGZvciBYTUwgZmlsZXMgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQk8Y2F0ZWdvcnkKLQkJCW5hbWU9IiVfVUlfV0laQVJEX1hNTF9DQVRFR09SWSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiPgotCQk8L2NhdGVnb3J5PgotCQk8d2l6YXJkCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9ORVdfWE1MIgotCQkJaWNvbj0iJG5sJC9pY29ucy9YTUxGaWxlLmdpZiIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hNTFdpemFyZCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuTmV3WE1MV2l6YXJkIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX0NSRUFURV9ORVdfWE1MX0ZJTEU8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCTwvc2VsZWN0aW9uPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIEFsbG93IHRoZSAnTmV3IFhNTCcgd2l6YXJkIHRvIGJlIGFjY2Vzc2VkIHZpYSB0aGUgJ0dlbmVyYXRlJyBtZW51IG9uIGEgWFNEIGZpbGUgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQluYW1lRmlsdGVyPSIqLnhzZCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sd2l6YXJkLmNyZWF0ZVhNTEZyb21YU0QiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iJWdlbk1lbnVMYWJlbCIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9ImdlbmVyYXRlWE1MQXJ0aWZhY3RzIj4KLQkJCQk8c2VwYXJhdG9yIG5hbWU9InhtbCIgLz4KLQkJCTwvbWVudT4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJV9VSV9BQ1RJT05fQ1JFQVRFX1hNTCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLlhNTEltcG9ydEFjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJnZW5lcmF0ZVhNTEFydGlmYWN0cy94bWwiCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbHdpemFyZC5jcmVhdGVYTUxGcm9tWFNEQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLS0tPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQWxsb3cgdGhlICdOZXcgWE1MJyB3aXphcmQgdG8gYmUgYWNjZXNzZWQgdmlhIHRoZSAnR2VuZXJhdGUnIG1lbnUgb24gYSBEVEQgZmlsZSAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQluYW1lRmlsdGVyPSIqLmR0ZCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sd2l6YXJkLmNyZWF0ZVhNTEZyb21EVEQiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iJWdlbk1lbnVMYWJlbCIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9ImdlbmVyYXRlWE1MQXJ0aWZhY3RzIj4KLQkJCQk8c2VwYXJhdG9yIG5hbWU9InhtbCIgLz4KLQkJCTwvbWVudT4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJV9VSV9BQ1RJT05fQ1JFQVRFX1hNTCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLlhNTEltcG9ydEFjdGlvbkRlbGVnYXRlIgotCQkJCW1lbnViYXJQYXRoPSJnZW5lcmF0ZVhNTEFydGlmYWN0cy94bWwiCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbHdpemFyZC5jcmVhdGVYTUxGcm9tRFREQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLS0tPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQ29udHJpYnV0ZSBhIE5ldy0+RXhhbXBsZS4uLiBlbnRyeSBmb3IgRWRpdGluZyBhbmQgVmFsaWRhdGluZyBYTUwgZmlsZXMgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQk8IS0tIGRlZmluZSB0aGUgWE1MU2FtcGxlcyBwcm9qZWN0IHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPGNhdGVnb3J5Ci0JCQluYW1lPSIlX1VJX1dJWkFSRF9ORVdfWE1MIgotCQkJcGFyZW50Q2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuZXhhbXBsZXMiPgotCQk8L2NhdGVnb3J5PgotCQk8d2l6YXJkCi0JCQluYW1lPSIlWE1MRXhhbXBsZS5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzL29yZy5lY2xpcHNlLndzdC54bWwuZXhhbXBsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIgotCQkJcHJvamVjdD0idHJ1ZSIKLQkJCWljb249IiRubCQvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4KLQkJCQklWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5kZXNjcmlwdGlvbgotCQkJPC9kZXNjcmlwdGlvbj4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGNvbmZpZ3VyZSB0aGUgWE1MU2FtcGxlcyBwcm9qZWN0IHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQiCi0JCWlkPSJYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkRXh0ZW5zaW9uIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIKLQkJCWJhbm5lcj0iaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXpiYW5uZXIucG5nIj4KLQkJCTxwcm9qZWN0c2V0dXAKLQkJCQlwYWdldGl0bGU9IiVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2V0aXRsZSIKLQkJCQluYW1lPSIlWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wcm9qZWN0bmFtZSIKLQkJCQlsYWJlbD0iJVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubGFiZWwiCi0JCQkJcGFnZWRlc2NyaXB0aW9uPSIlWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wYWdlZGVzY3JpcHRpb24iCi0JCQkJb3Blbj0icmVhZG1lLmh0bWwiPgotCQkJCTxpbXBvcnQKLQkJCQkJZGVzdD0iIgotCQkJCQlzcmM9ImV4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcCIgLz4KLQkJCTwvcHJvamVjdHNldHVwPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSB4bWwgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InBhcnRpYWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLk1hcmt1cFZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24ubWFya3VwdmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuYW5ub3RhdGlvblR5cGVzIj4KLSAgICAgIDx0eXBlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubWF0Y2hpbmcudGFnIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMubWFya2VyQW5ub3RhdGlvblNwZWNpZmljYXRpb24iPgotICAgICAgPHNwZWNpZmljYXRpb24KLSAgICAgIAkJaW5jbHVkZU9uUHJlZmVyZW5jZVBhZ2U9InRydWUiCi0gICAgICAgICAgICBjb2xvclByZWZlcmVuY2VWYWx1ZT0iMjEyLDIxMiwyMTIiCi0gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5tYXRjaGluZy50YWciCi0gICAgICAgICAgICBjb2xvclByZWZlcmVuY2VLZXk9Im1hdGNoaW5nVGFnSW5kaWNhdGlvbkNvbG9yIgotICAgICAgICAgICAgcHJlc2VudGF0aW9uTGF5ZXI9IjQiCi0gICAgICAgICAgICBsYWJlbD0iJU1hdGNoaW5nVGFnUHJlZmVyZW5jZS5sYWJlbCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIgotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0gICAgICAgICAgICB0ZXh0UHJlZmVyZW5jZUtleT0ibWF0Y2hpbmdUYWdJbmRpY2F0aW9uIgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleT0ibWF0Y2hpbmdUYWdIaWdobGlnaHQiCi0gICAgICAgICAgICBoaWdobGlnaHRQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgICAgICB2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0ibWF0Y2hpbmdUYWdWZXJ0aWNhbFJ1bGVyIgotICAgICAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0gICAgICAgICAgICBvdmVydmlld1J1bGVyUHJlZmVyZW5jZUtleT0ibWF0Y2hpbmdUYWdJbmRpY2F0aW9uSW5PdmVydmlld1J1bGVyIgotICAgICAgICAgICAgb3ZlcnZpZXdSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLSAgICAgICAgICAgIHRleHRTdHlsZVByZWZlcmVuY2VLZXk9Im1hdGNoaW5nVGFnVGV4dFN0eWxlIgotCQkJdGV4dFN0eWxlUHJlZmVyZW5jZVZhbHVlPSJOT05FIj4KLSAgICAgIDwvc3BlY2lmaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBEb2N1bWVudCBwcm92aWRlciBmb3IgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyI+Ci0JCTxwcm92aWRlcgotCQkJaW5wdXRUeXBlcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRGaWxlRG9jdW1lbnRQcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkV4dGVybmFsRmlsZURvY3VtZW50UHJvdmlkZXIiPgotCQk8L3Byb3ZpZGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBUbyBEbzogbWlncmF0ZSB0aGlzIHRvIHRoZSBvcmcuZWNsaXBzZS51aS5tZW51cyBwb3B1cDogZm9ybWF0IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gUG9wLXVwIG1lbnUgYW5kIGFzc29jaWF0ZWQgY29tbWFuZC9oYW5kbGVyIGZvciBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4gICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotICAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnVpLmlkZS5NYXJrZXJzVmlldyI+Ci0gICAgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlZmVyZW5jZWRGaWxlRXJyb3JzIj4KLSAgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucmVmZXJlbmNlZEZpbGVFcnJvcnMiIC8+Ci0gICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KLSAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCTxjb21tYW5kCi0JCQlkZXNjcmlwdGlvbj0iJV9VSV9SRUZfRklMRV9TSE9XX0RFVEFJTFMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWZlcmVuY2VkRmlsZUVycm9ycyIgCi0JCQluYW1lPSIlX1VJX1JFRl9GSUxFX1NIT1dfREVUQUlMUyIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvLlJlZmVyZW5jZWRGaWxlRXJyb3JzSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucmVmZXJlbmNlZEZpbGVFcnJvcnMiPgotICAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWZlcmVuY2VkRmlsZUVycm9ycyIgLz4KLSAgICAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0JICAgPHByb3BlcnR5VGVzdGVyCi0JICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mby5Hcm91cE5hbWVQcm9wZXJ0eVRlc3RlciIKLQkgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5tYXJrZXJHcm91cE5hbWVQcm9wZXJ0eVRlc3RlciIKLQkgICAgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiCi0JICAgICAgICAgcHJvcGVydGllcz0iZ3JvdXBOYW1lUHJlZml4IgotCSAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIiPgotCSAgIDwvcHJvcGVydHlUZXN0ZXI+Ci0JPC9leHRlbnNpb24+Ci0JIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWZlcmVuY2VkRmlsZUVycm9ycyI+Ci0gICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgICA8Y291bnQgdmFsdWU9IjEiIC8+Ci0gICAgICAgICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotICAgICAgICAgICAgICAgICAgICAgIAkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5ncm91cE5hbWVQcmVmaXgiIHZhbHVlPSJyZWZlcmVuY2VkRmlsZUVycm9yIiBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgCQk8L2FkYXB0PgotICAgICAgICAgICAgICAgICAgIAkJPC9pdGVyYXRlPgotICAgICAgICAgICAgICAgIAk8L3dpdGg+Ci0gICAgICAgICAgICAgICAgPC9hbmQ+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4JIAotCi08IS0tCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UuZWRpdG9yQWN0aW9ucyIKLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5DbGVhbnVwQWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iVG9nZ2xlQ29tbWVudCIKLQkJCQlsYWJlbD0iJVRvZ2dsZUNvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVUb2dnbGVDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlRvZ2dsZUNvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJUFkZEJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJUFkZEJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkFkZEJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iUmVtb3ZlQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVtb3ZlQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJGaW5kT2NjdXJyZW5jZXMiCi0JCQkJbGFiZWw9IiVGaW5kT2NjdXJyZW5jZXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaC5YTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iRmluZE9jY3VycmVuY2VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotLS0+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5oeXBlcmxpbmtEZXRlY3RvclRhcmdldHMiPgotCQk8dGFyZ2V0Ci0JCQlpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCW5hbWU9IiVYTUxfU291cmNlX3RhcmdldF9uYW1lIj4KLQkJPC90YXJnZXQ+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JzIj4KLQkJPGh5cGVybGlua0RldGVjdG9yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuWE1MSHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuWE1MSHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQluYW1lPSIlWE1MX2h5cGVybGluayIKLQkJCXRhcmdldElkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJPC9oeXBlcmxpbmtEZXRlY3Rvcj4KLSAgIDwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgPGNhdGVnb3J5Ci0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLSAgICAgICAgICBuYW1lPSIlX1VJX1dJWkFSRF9ORVdfWE1MIj4KLSAgICA8L2NhdGVnb3J5PgotICAgIDx3aXphcmQKLSAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LlhNTENhdGVnb3J5IgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuSW1wb3J0WE1MQ2F0YWxvZ1dpemFyZCIKLSAgICAgICAgICBpY29uPSJpY29ucy94bWxkb2MuZ2lmIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuSW1wb3J0WE1MQ2F0YWxvZ1dpemFyZCIKLSAgICAgICAgICBuYW1lPSIlX1VJX1dJWkFSRF9JTVBPUlRfRVhQT1JUX1hNTENBVEFMT0ciPgotICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAlX1VJX0lNUE9SVF9YTUxfQ0FUQUxPR19GSUxFCi0gICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L3dpemFyZD4KLSA8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgIDxjYXRlZ29yeQotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0gICAgICAgICAgbmFtZT0iJV9VSV9XSVpBUkRfTkVXX1hNTCI+Ci0gICAgPC9jYXRlZ29yeT4KLSAgICA8d2l6YXJkCi0gICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLkV4cG9ydFhNTENhdGFsb2dXaXphcmQiCi0gICAgICAgICAgaWNvbj0iaWNvbnMveG1sZG9jLmdpZiIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLkV4cG9ydFhNTENhdGFsb2dXaXphcmQiCi0gICAgICAgICAgbmFtZT0iJV9VSV9XSVpBUkRfSU1QT1JUX0VYUE9SVF9YTUxDQVRBTE9HIj4KLSAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgJV9VSV9FWFBPUlRfWE1MX0NBVEFMT0dfRklMRQotICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC93aXphcmQ+Ci0gPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCTwhLS0gTmF2aWdhdGUgY29tbWFuZHMgLS0+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlQWN0aW9uRGVmaW5pdGlvbi5uZXh0U2libGluZy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLm5leHRTaWJsaW5nLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5leHRTaWJsaW5nIj4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJUFjdGlvbkRlZmluaXRpb24ucHJldmlvdXNTaWJsaW5nLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJUFjdGlvbkRlZmluaXRpb24ucHJldmlvdXNTaWJsaW5nLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByZXZpb3VzU2libGluZyI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLmdvdG9NYXRjaGluZ1RhZy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLmdvdG9NYXRjaGluZ1RhZy5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5nb3RvTWF0Y2hpbmdUYWciPgotCQk8L2NvbW1hbmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+Ci0gICAgICA8IS0tICB3aW4zMjogIE0xPUNUUkwsICAgIE0yPVNISUZULCBNMz1BTFQsIE00PS0KLSAgICAgICAgICAgIGNhcmJvbjogTTE9Q09NTUFORCwgTTI9U0hJRlQsIE0zPUFMVCwgTTQ9Q1RSTAotICAgICAgICAgICAgZ3RrOiA/IAotICAgICAgLS0+Ci0gICAgICA8IS0tIE5hdmlnYXRlIGNvbW1hbmRzIC0tPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErTTIrQVJST1dfVVAiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmV2aW91c1NpYmxpbmciCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotCQk8a2V5Ci0JCQlwbGF0Zm9ybT0iY2FyYm9uIgotCQkJc2VxdWVuY2U9IkNUUkwrU0hJRlQrQVJST1dfVVAiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmV2aW91c1NpYmxpbmciCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErTTIrQVJST1dfRE9XTiIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5leHRTaWJsaW5nIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLQkJPGtleQotCQkJcGxhdGZvcm09ImNhcmJvbiIKLQkJCXNlcXVlbmNlPSJDVFJMK1NISUZUK0FSUk9XX0RPV04iCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uZXh0U2libGluZyIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMismZ3Q7IgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ290b01hdGNoaW5nVGFnIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLQkJPGtleQotCQkJcGxhdGZvcm09ImNhcmJvbiIKLQkJCXNlcXVlbmNlPSJDVFJMK1NISUZUKy4iCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5nb3RvTWF0Y2hpbmdUYWciCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotCQkJCi0JPC9leHRlbnNpb24+Ci0JCi08IS0tCi0gICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIG5ldyBvcmcuZWNsaXBzZS51aS5tZW51cyBleHRpb25zIHBvaW50cyBhbmQgY29tbWFuZCBoYW5kbGVyCi0gICBkZWZpbml0aW9ucy4KLSAtLT4KLSAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+Ci0JCTwhLS0gVW5hYmxlIHRvIGNvbnRyaWJ1dGUgdG8gU2VhcmNoIG1lbnUgYXQgdGhlIG1vbWVudCBkdWUgdG8gYnVnIDIxMzM4NSAtLT4KLTwhLS0KLQkJPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6b3JnLmVjbGlwc2Uuc2VhcmNoLm1lbnUiPgotLS0+Ci0JICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OmdvVG8/YWZ0ZXI9bWF0Y2hpbmdFbmQiPgotPCEtLQkJCi0JICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5nb3RvTWF0Y2hpbmdUYWciIGlkPSJHb1RvTWF0Y2hpbmdUYWciIGxhYmVsPSIlR29Ub01hdGNoaW5nVGFnX2xhYmVsIiBzdHlsZT0icHVzaCI+Ci0JCQkgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCSAgIDwvdmlzaWJsZVdoZW4+Ci0JICAgICAgIDwvY29tbWFuZD4KLS0tPgkJCi0JICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ29Ub1NpYmxpbmdzQmVnaW4iIHZpc2libGU9InRydWUiPjwvc2VwYXJhdG9yPgotCSAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmV4dFNpYmxpbmciIGlkPSJHb1RvTmV4dFNpYmxpbmciIGxhYmVsPSIlQWN0aW9uRGVmaW5pdGlvbi5uZXh0U2libGluZy5uYW1lIiBzdHlsZT0icHVzaCI+Ci0JCQkgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5hdmlnYXRpb24iPjwvcmVmZXJlbmNlPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JICAgICAgIDwvY29tbWFuZD4KLQkgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByZXZpb3VzU2libGluZyIgaWQ9IkdvVG9QcmV2aW91c1NpYmxpbmciIGxhYmVsPSIlQWN0aW9uRGVmaW5pdGlvbi5wcmV2aW91c1NpYmxpbmcubmFtZSIgc3R5bGU9InB1c2giPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uYXZpZ2F0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+Ci0JICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ29Ub1NpYmxpbmdzRW5kIiB2aXNpYmxlPSJmYWxzZSI+PC9zZXBhcmF0b3I+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpvcmcuZWNsaXBzZS51aS5tYWluLm1lbnU/YmVmb3JlPXdpbmRvdyI+Ci0gICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRlc2lnbk1lbnVJZCIKLSAgICAgICAgICAgICAgbGFiZWw9IiVEZXNpZ25NZW51X25hbWUiPgotICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgIG5hbWU9ImRlc2lnblN0YXJ0Ij4KLSAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kaXNhYmxlLmdyYW1tYXIuY29uc3RyYWludHMiCi0gICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYiCi0gICAgICAgICAgICAgICAgIGlkPSJUb2dnbGVHcmFtbWFyQ29uc3RyYWludHMiCi0gICAgICAgICAgICAgICAgIG1uZW1vbmljPSIlQ29uc3RyYWludHNfbW5lbW9uaWMiCi0gICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLSAgICAgICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgIAkgPGFuZD4KLSAgICAgICAgICAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ3JhbW1hciIvPgotICAgICAgICAgICAgICAgICAgICAgICA8bm90PgotICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICA8L25vdD4KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlbG9hZC5kZXBlbmRlY2llcyIKLSAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L3JsZGdybXIuZ2lmIgotICAgICAgICAgICAgICAgICBpZD0iUmVsb2FkRGVwZW5kZW5jaWVzIgotICAgICAgICAgICAgICAgICBtbmVtb25pYz0iJVJlbG9hZERlcGVuZGVuY2llc19tbmVtb25pYyIKLSAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotICAgICAgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgCTxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRlcGVuZGVuY2llcyIvPgotICAgICAgICAgICAgICAgICAgICAgICA8bm90PgotICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICA8L25vdD4KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICBuYW1lPSJleHBhbmQiCi0gICAgICAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgICAgCi0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ic2VkLnRhYmxldHJlZS5leHBhbmRBbGwiCi0gICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZiIKLSAgICAgICAgICAgICAgICAgaWQ9IkV4cGFuZEFsbCIKLSAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotICAgICAgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmV4cGFuZCIvPgotICAgICAgICAgICAgICAgICAgICAgICA8bm90PgotICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICA8L25vdD4KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJzZWQudGFibGV0cmVlLmNvbGxhcHNlQWxsIgotICAgICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2VfYWxsLmdpZiIKLSAgICAgICAgICAgICAgICAgaWQ9IkNvbGxhcHNlQWxsIgotICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+Ci0gICAgICAgICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZXhwYW5kIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxub3Q+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwvbm90PgotICAgICAgICAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KLSAgICAgICAgICAgPC9jb21tYW5kPgotICAgICAgICAgICAKLSAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICBuYW1lPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICBuYW1lPSJkZXNpZ25FbmQiCi0gICAgICAgICAgICAgICAgIHZpc2libGU9ImZhbHNlIj4KLSAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgIDwvbWVudT4KLSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTplZGl0P2FmdGVyPWFkZGl0aW9ucyI+Ci0JCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmNvbnRlbnRBc3Npc3QucHJvcG9zYWxzIiBpZD0iWE1MQ29udGVudEFzc2lzdCIgc3R5bGU9InB1c2giPgotCQkgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkueG1sU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvdmlzaWJsZVdoZW4+Ci0JCTwvY29tbWFuZD4KLQk8L21lbnVDb250cmlidXRpb24+CQkKLSAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnVpLnBvcHVwLmFueT9hZnRlcj1hZGRpdGlvbnMiPgotICAgICAgICA8bWVudQotICAgICAgICAgICAgICBpZD0iZ2VuZXJhdGVNZW51SWQiCi0gICAgICAgICAgICAgIGxhYmVsPSIlZ2VuTWVudUxhYmVsIj4KLQkgICAgICAgIDxjb21tYW5kCi0JICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZ2VuZXJhdGUueG1sIgotCSAgICAgICAgICAgICAgaWQ9IkdlbmVyYXRlWE1MIgotCSAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotCSAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCSAgICAgICAgICAgICAgPG9yPgotCQkJCQk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0JCQkJCQkJPHRlc3QKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLSAgICAgICAgICAgICAgICAgICAgCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiPgotCQkJCQkJCTwvdGVzdD4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0gICAgICAgICAgICAgICAgICAgIAkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIj4KLQkJCQkJCQk8L3Rlc3Q+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJIDwvb3I+CQotCSAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KLQkgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgPC9tZW51PgotICAgICA8L21lbnVDb250cmlidXRpb24+Ci0gICAgIAotICAgICA8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgICBsb2NhdGlvblVSST0idG9vbGJhcjpvcmcuZWNsaXBzZS51aS5tYWluLnRvb2xiYXI/YWZ0ZXI9YWRkaXRpb25zIj4KLSAgICAgICAgPHRvb2xiYXIKLSAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZGVzaWduLkRlc2lnblRvb2xCYXIiPgotICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgIG5hbWU9InNlZC50YWJsZXRyZWUuc2VwYXJhdG9yLjEiCi0gICAgICAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRpc2FibGUuZ3JhbW1hci5jb25zdHJhaW50cyIKLSAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9uLmdpZiIKLSAgICAgICAgICAgICAgICAgaWQ9IlRvZ2dsZUdyYW1tYXJDb25zdHJhaW50cyIKLSAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVDb25zdHJhaW50c19uYW1lIj4KLQkgICAgICAgICAgIDx2aXNpYmxlV2hlbgotCSAgICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JICAgICAgICAgICAgICA8cmVmZXJlbmNlCi0JICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ3JhbW1hciI+Ci0JICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KLQkgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlbG9hZC5kZXBlbmRlY2llcyIKLSAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L3JsZGdybXIuZ2lmIgotICAgICAgICAgICAgICAgICBpZD0iUmVsb2FkRGVwZW5kZW5jaWVzIgotICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+Ci0JICAgICAgICAgICA8dmlzaWJsZVdoZW4KLQkgICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCSAgICAgICAgICAgICAgPHJlZmVyZW5jZQotCSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRlcGVuZGVuY2llcyI+Ci0JICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KLQkgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICBuYW1lPSJzZWQudGFibGV0cmVlLnNlcGFyYXRvci4yIgotICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ic2VkLnRhYmxldHJlZS5leHBhbmRBbGwiCi0gICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZiIKLSAgICAgICAgICAgICAgICAgaWQ9IkV4cGFuZEFsbCIKLSAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotCSAgICAgICAgICAgPHZpc2libGVXaGVuCi0JICAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLQkgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5leHBhbmQiPgotCSAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0JICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ic2VkLnRhYmxldHJlZS5jb2xsYXBzZUFsbCIKLSAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlX2FsbC5naWYiCi0gICAgICAgICAgICAgICAgIGlkPSJDb2xsYXBzZUFsbCIKLSAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotCSAgICAgICAgICAgICA8dmlzaWJsZVdoZW4KLQkgICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCSAgICAgICAgICAgICAgPHJlZmVyZW5jZQotCSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmV4cGFuZCI+Ci0JICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KLQkgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgPC90b29sYmFyPgotICAgICA8L21lbnVDb250cmlidXRpb24+Ci0gICAgIAotICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTpzb3VyY2VNZW51SWQ/YWZ0ZXI9c291cmNlQmVnaW4iPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJICAgICAgICAgaWQ9IlRvZ2dsZUNvbW1lbnQiCi0JCQkgICAgICAgICBtbmVtb25pYz0iJWNvbW1hbmQudG9nZ2xlLmNvbW1lbnQubW5lbW9uaWMiCi0JCQkgICAgICAgICBzdHlsZT0icHVzaCI+Ci0JCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyIvPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQkgICAgICAgICBpZD0iQWRkQmxvY2tDb21tZW50IgotCQkJICAgICAgICAgbW5lbW9uaWM9IiVjb21tYW5kLmFkZC5ibG9jay5jb21tZW50Lm1uZW1vbmljIgotCQkJICAgICAgICAgc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiLz4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJICAgICAgICAgaWQ9IlJlbW92ZUJsb2NrQ29tbWVudCIKLQkJCSAgICAgICAgIG1uZW1vbmljPSIlY29tbWFuZC5yZW1vdmUuYmxvY2suY29tbWVudC5tbmVtb25pYyIKLQkJCSAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbW1lbnRzIi8+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCQkKLQkJPG1lbnVDb250cmlidXRpb24KLQkgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDpzb3VyY2VQb3B1cE1lbnVJZD9hZnRlcj1zb3VyY2VCZWdpbiI+Ci0JCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IiBpZD0iVG9nZ2xlQ29tbWVudCIgc3R5bGU9InB1c2giPgotCQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyI+PC9yZWZlcmVuY2U+Ci0JCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQkJPC9jb21tYW5kPgotCQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCIgaWQ9IkFkZEJsb2NrQ29tbWVudCIgc3R5bGU9InB1c2giPgotCQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyI+PC9yZWZlcmVuY2U+Ci0JCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQkJPC9jb21tYW5kPgotCQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIgaWQ9IlJlbW92ZUJsb2NrQ29tbWVudCIgc3R5bGU9InB1c2giPgotCQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyI+PC9yZWZlcmVuY2U+Ci0JCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQkJPC9jb21tYW5kPgotCQkJCTxzZXBhcmF0b3IgbmFtZT0iZm9ybWF0IiB2aXNpYmxlPSJ0cnVlIj48L3NlcGFyYXRvcj4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS54bWxTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIi8+Ci0JICAgICAgICAgICA8L2l0ZXJhdGU+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29yZSI+Ci0JCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiLz4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkub2NjdXJyZW5jZXMiPgotICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLm9jY3VycmVuY2VzIi8+Ci0JICAgICAgICAgICA8L2l0ZXJhdGU+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvbW1lbnRzIi8+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNsZWFudXAiPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNsZWFudXAiLz4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmF2aWdhdGlvbiI+Ci0JCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwubmF2aWdhdGlvbiIvPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZWxlY3Rpb24iPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLnNlbGVjdGlvbiIvPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kZXBlbmRlbmNpZXMiPgotCQkJPG9yPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVFZGl0b3JJZCI+Ci0JCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPjwvZXF1YWxzPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5kZXBlbmRlbmNpZXMiLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCTwvb3I+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ3JhbW1hciI+Ci0JCQk8b3I+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUVkaXRvcklkIj4KLQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI+PC9lcXVhbHM+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmdyYW1tYXIiLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCTwvb3I+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZXhwYW5kIj4KLQkJCTxvcj4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlRWRpdG9ySWQiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0Ij48L2VxdWFscz4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwuZXhwYW5kIi8+Ci0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQk8L29yPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0gICAgPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5DbGVhbnVwZG9jdW1lbnRIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50Ij4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLQkJCSA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jbGVhbnVwIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jbGVhbnVwIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5Ub2dnbGVDb21tZW50SGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbW1lbnRzIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5BZGRCbG9ja0NvbW1lbnRIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbW1lbnRzIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLlJlbW92ZUJsb2NrQ29tbWVudEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50Ij4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIj4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc2VsZWN0aW9uIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc2VsZWN0aW9uIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNlbGVjdGlvbiIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNlbGVjdGlvbiIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNlbGVjdGlvbiIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNlbGVjdGlvbiIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZWxlY3Rpb24iLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZWxlY3Rpb24iLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLlhNTEZpbmRPY2N1cmVuY2VzSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5vY2N1cnJlbmNlcyIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm9jY3VycmVuY2VzIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci08IS0tCi0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5Hb1RvTWF0Y2hpbmdUYWdIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5nb3RvTWF0Y2hpbmdUYWciPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uYXZpZ2F0aW9uIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmF2aWdhdGlvbiIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotLS0+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5OZXh0U2libGluZ05hdmlnYXRpb25IYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uZXh0U2libGluZyI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5hdmlnYXRpb24iLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uYXZpZ2F0aW9uIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5QcmV2aW91c1NpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJldmlvdXNTaWJsaW5nIj4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmF2aWdhdGlvbiIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5hdmlnYXRpb24iLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLlJlbG9hZERlcGVuZGVuY2llc0hhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlbG9hZC5kZXBlbmRlY2llcyI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRlcGVuZGVuY2llcyIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRlcGVuZGVuY2llcyIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuVG9nZ2xlRWRpdE1vZGVIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kaXNhYmxlLmdyYW1tYXIuY29uc3RyYWludHMiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5ncmFtbWFyIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ3JhbW1hciIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYTUxIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5nZW5lcmF0ZS54bWwiPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLkV4cGFuZEFsbEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJzZWQudGFibGV0cmVlLmV4cGFuZEFsbCI+Ci0gICAgICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgICAgIDxub3Q+Ci0JCSAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JCQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkgICAgICAgICAgICAgIDxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIvPgotCQkJICAgICAgICAgICA8L2l0ZXJhdGU+Ci0JCSAgICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLkNvbGxhcHNlQWxsSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9InNlZC50YWJsZXRyZWUuY29sbGFwc2VBbGwiPgotICAgICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICAgICA8bm90PgotCQkgICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCQkJICAgICAgICAgICA8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiLz4KLQkJCSAgICAgICAgICAgPC9pdGVyYXRlPgotCQkgICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICAgICAgICAgIDwvbm90PgotICAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAgCi0gICAgPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JICAgIDxjb21tYW5kCi0JICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmdlbmVyYXRlLnhtbCIKLQkgICAgICAgICAgbmFtZT0iJV9VSV9BQ1RJT05fQ1JFQVRFX1hNTCI+Ci0JICAgIDwvY29tbWFuZD4KLQkgICAgPGNvbW1hbmQKLQkgICAgICAgICAgZGVzY3JpcHRpb249IiVSZWxvYWREZXBlbmRlbmNpZXNfZGVzY3JpcHRpb24iCi0JICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlbG9hZC5kZXBlbmRlY2llcyIKLQkgICAgICAgICAgbmFtZT0iJVJlbG9hZERlcGVuZGVuY2llc19uYW1lIj4KLQkgICAgPC9jb21tYW5kPgotCSAgICA8Y29tbWFuZAotCSAgICAgICAgICBkZXNjcmlwdGlvbj0iJUNvbnN0cmFpbnRzX2Rlc2NyaXB0aW9uIgotCSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kaXNhYmxlLmdyYW1tYXIuY29uc3RyYWludHMiCi0JICAgICAgICAgIG5hbWU9IiVDb25zdHJhaW50c19uYW1lIj4KLQkgICAgPC9jb21tYW5kPgotCSAgICA8Y29tbWFuZAotCSAgICAgICAgICBpZD0ic2VkLnRhYmxldHJlZS5leHBhbmRBbGwiCi0JICAgICAgICAgIG5hbWU9IiVFeHBhbmRBbGxfbmFtZSI+Ci0JICAgIDwvY29tbWFuZD4KLQkgICAgPGNvbW1hbmQKLQkgICAgICAgICAgaWQ9InNlZC50YWJsZXRyZWUuY29sbGFwc2VBbGwiCi0JICAgICAgICAgIG5hbWU9IiVDb2xsYXBzZUFsbF9uYW1lIj4KLQkgICAgPC9jb21tYW5kPgotCTwvZXh0ZW5zaW9uPiAKLQkKLQk8IS0tIERlZmluZSB0aGVtZSAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotCQk8dGhlbWUKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS5pZGUuc3lzdGVtRGVmYXVsdCI+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJ0YWdBdHRyaWJ1dGVOYW1lIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0idGFnQXR0cmlidXRlVmFsdWUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJjb21tZW50Qm9yZGVyIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX1NFTEVDVElPTiI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJjb21tZW50VGV4dCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9TRUxFQ1RJT04iPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZGVjbEJvZGVyIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZG9jdHlwZU5hbWUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkb2N0eXBlRXh0ZXJuYWxQdWJyZWYiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkb2N0eXBlRXh0ZXJuYWxJZCIKLQkJCQl2YWx1ZT0iQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1ciPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZG9jdHlwZUV4dHJlbmFsU3lzcmVmIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0idGFnQm9yZGVyIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0idGFnTmFtZSIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9InBpQm9yZGVyIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iY2RhdGFCb3JkZXIiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJjZGF0YVRleHQiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJlbnRpdHlSZWZlcmVuY2UiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCTwvdGhlbWU+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJ0YWdBdHRyaWJ1dGVOYW1lIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy50YWdBdHRyaWJ1dGVOYW1lIgotCQkJdmFsdWU9IjEyNywgMCwgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJ0YWdBdHRyaWJ1dGVWYWx1ZSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMudGFnQXR0cmlidXRlVmFsdWUiCi0JCQl2YWx1ZT0iNDIsIDAsIDI1NSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iY29tbWVudEJvcmRlciIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuY29tbWVudEJvcmRlciIKLQkJCXZhbHVlPSI2MywgOTUsIDE5MSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iY29tbWVudFRleHQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmNvbW1lbnRUZXh0IgotCQkJdmFsdWU9IjYzLCA5NSwgMTkxIj4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkZWNsQm9kZXIiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmRlY2xCb3JkZXIiCi0JCQl2YWx1ZT0iMCwgMTI4LCAxMjgiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImRvY3R5cGVOYW1lIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kb2N0eXBlTmFtZSIKLQkJCXZhbHVlPSIwLCAxMjgsIDEyOCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZG9jdHlwZUV4dGVybmFsUHVicmVmIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kb2N0eXBlRXh0ZXJuYWxQdWJyZWYiCi0JCQl2YWx1ZT0iMCwgMTI4LCAxMjgiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImRvY3R5cGVFeHRlcm5hbElkIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kb2N0eXBlRXh0ZXJuYWxJZCIKLQkJCXZhbHVlPSIxMjgsIDEyOCwgMTI4Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkb2N0eXBlRXh0cmVuYWxTeXNyZWYiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmRvY3R5cGVFeHRyZW5hbFN5c3JlZiIKLQkJCXZhbHVlPSI2MywgMTI3LCA5NSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0idGFnQm9yZGVyIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy50YWdCb3JkZXIiCi0JCQl2YWx1ZT0iMCwgMTI4LCAxMjgiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9InRhZ05hbWUiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLnRhZ05hbWUiCi0JCQl2YWx1ZT0iNjMsIDEyNywgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJwaUJvcmRlciIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMucGlCb3JkZXIiCi0JCQl2YWx1ZT0iMCwgMTI4LCAxMjgiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImNkYXRhQm9yZGVyIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5jZGF0YUJvcmRlciIKLQkJCXZhbHVlPSIwLCAxMjgsIDEyOCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iY2RhdGFUZXh0IgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5jZGF0YVRleHQiCi0JCQl2YWx1ZT0iMCwgMCwgMCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZW50aXR5UmVmZXJlbmNlIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5lbnRpdHlSZWZlcmVuY2UiCi0JCQl2YWx1ZT0iNDIsIDAsIDI1NSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFbmFibGUgdGhlIEZvcm1hdEhhbmRsZXIgZm9yIFhNTCBDb250ZW50IFR5cGUgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotCQk8aGFuZGxlciAKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkZvcm1hdEhhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0Ij4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnhtbENvbnRlbnRUeXBlLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnhtbENvbnRlbnRUeXBlLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gU2V0IHVwIGEgZGVmaW5pdGlvbiBmb3IgWE1MIENvbnRlbnQgVHlwZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnhtbENvbnRlbnRUeXBlLmRlZmluaXRpb24iPgotCQkJPG9yPgotICAgICAgICAgICAgCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiIAotCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIi8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9pdGVyYXRlPgotCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiLz4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L29yPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zY2hlbWEvY2F0YWxvZ0ZpbGVUeXBlLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc2NoZW1hL2NhdGFsb2dGaWxlVHlwZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjI5NjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zY2hlbWEvY2F0YWxvZ0ZpbGVUeXBlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIgaWQ9ImNhdGFsb2dGaWxlVHlwZSIgbmFtZT0iWE1MIENhdGFsb2cgZmlsZSB0eXBlIGV4dGVuc2lvbiBwb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsZVR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmlsZVR5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb25zIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0FkdmFuY2VkT3B0aW9uc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9BZHZhbmNlZE9wdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxZGVjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0FkdmFuY2VkT3B0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RTaW5nbGVGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEFkdmFuY2VkT3B0aW9uc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQotCXB1YmxpYyBBZHZhbmNlZE9wdGlvbnNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMud29ya2luZ1VzZXJDYXRhbG9nID0gd29ya2luZ1VzZXJDYXRhbG9nOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nQXJlYSwgbmV3Ci0JCS8vIENvbnRyb2xDb250ZXh0Q29tcHV0ZXIoZGlhbG9nQXJlYSwKLQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9QUk9KRUNUX0RJQUxPRykpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ESUFMT0dfREVTQ1JJUFRJT04pOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIHBsYWNlSG9sZGVyID0gbmV3IENvbXBvc2l0ZShidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcGxhY2VIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKCkpOwotCi0JCUJ1dHRvbiBpbXBvcnRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCB8IFNXVC5DRU5URVIpOwotCQlpbXBvcnRCdXR0b24uc2V0VGV4dCgiICAiICsgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9JTVBPUlQgKyAiICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJQnV0dG9uIGV4cG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIIHwgU1dULkNFTlRFUik7Ci0JCWV4cG9ydEJ1dHRvbi5zZXRUZXh0KCIgICIgKyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX0VYUE9SVCArICIgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlwbGFjZUhvbGRlciA9IG5ldyBDb21wb3NpdGUoYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBsYWNlSG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIGFkZCBpbXBvcnRCdXR0b24gbGlzdGVuZXIKLQkJU2VsZWN0aW9uTGlzdGVuZXIgaW1wb3J0QnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnZva2VJbXBvcnREaWFsb2coKTsKLQkJCX0KLQkJfTsKLQkJaW1wb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGltcG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBhZGQgZXhwb3J0QnV0dG9uIGxpc3RlbmVyCi0JCVNlbGVjdGlvbkxpc3RlbmVyIGV4cG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW52b2tlRXhwb3J0RGlhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JCWV4cG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihleHBvcnRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIEdyaWREYXRhIGNyZWF0ZUdyaWREYXRhKCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5DRU5URVIpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVI7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSOwotCQlyZXR1cm4gZ2Q7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZva2VJbXBvcnREaWFsb2coKSB7Ci0JCVNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgbnVsbCwgdHJ1ZSk7Ci0JCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7Ii54bWxjYXRhbG9nIiwgIi54bWwifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRpYWxvZy5hZGRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfVElUTEUpOwotCQlkaWFsb2cuc2V0VGl0bGUoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfSEVBRElORyk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9JTVBPUlRfRElBTE9HX01FU1NBR0UpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWludCByYyA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyYyA9PSBXaW5kb3cuT0spIHsKLQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJQ2F0YWxvZ1NldCB0ZW1wUmVzb3VyY2VTZXQgPSBuZXcgQ2F0YWxvZ1NldCgpOwotCQkJCQlJQ2F0YWxvZyBuZXdDYXRhbG9nID0gdGVtcFJlc291cmNlU2V0Lmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZygidGVtcCIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKG5ld0NhdGFsb2cpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETy4uLiBnaXZlIGVycm9yIG1lc3NhZ2UKLQkJCQl9Ci0JCQl9Ci0JCQljbG9zZSgpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZva2VFeHBvcnREaWFsb2coKSB7Ci0JCUlQYXRoIG9yaWdpbmFsRmlsZVBhdGggPSBudWxsOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlpZiAocHJvamVjdHMubGVuZ3RoID4gMCkgewotCQkJb3JpZ2luYWxGaWxlUGF0aCA9IHByb2plY3RzWzBdLmdldEZ1bGxQYXRoKCkuYXBwZW5kKCIueG1sY2F0YWxvZyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTYXZlQXNEaWFsb2cgZGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaGVsbCgpKTsKLQkJaWYgKG9yaWdpbmFsRmlsZVBhdGggIT0gbnVsbCkgewotCQkJSUZpbGUgb3JpZ2luYWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG9yaWdpbmFsRmlsZVBhdGgpOwotCQkJZGlhbG9nLnNldE9yaWdpbmFsRmlsZShvcmlnaW5hbEZpbGUpOwotCQl9Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9FWFBPUlRfRElBTE9HX1RJVExFKTsKLQkJZGlhbG9nLnNldFRpdGxlKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9FWFBPUlRfRElBTE9HX0hFQURJTkcpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19NRVNTQUdFKTsKLQotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWludCByYyA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyYyA9PSBXaW5kb3cuT0spIHsKLQkJCUlQYXRoIHBhdGggPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkkoKS50b1N0cmluZygpOwotCi0JCQkJLy8gaGVyZSB3ZSBzYXZlIHRoZSBjYXRhbG9nIGVudHJpZXMgdG8gdGhlIHNlbGVjdGVkIGZpbGUKLQkJCQl0cnkgewotCQkJCQljcmVhdGVGaWxlSWZSZXF1aXJlZChmaWxlKTsKLQkJCQkJd29ya2luZ1VzZXJDYXRhbG9nLnNldExvY2F0aW9uKGZpbGVOYW1lKTsKLQkJCQkJd29ya2luZ1VzZXJDYXRhbG9nLnNhdmUoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0NBVEFMT0dfU0FWRV9FUlJPUjsKLQkJCQkJCVN0cmluZyBicmllZk1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfQ0FUQUxPR19DT1VMRF9OT1RfQkVfU0FWRUQ7Ci0JCQkJCQlTdHJpbmcgcmVhc29uID0gZmlsZS5pc1JlYWRPbmx5KCkgPyBOTFMuYmluZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRklMRV9JU19SRUFEX09OTFksIGZpbGVOYW1lKSA6IE5MUy5iaW5kKFhNTENhdGFsb2dNZXNzYWdlcy5FUlJPUl9TQVZJTkdfRklMRSwgZmlsZU5hbWUpOwotCQkJCQkJU3RyaW5nIGRldGFpbHMgPSBOTFMuYmluZChYTUxDYXRhbG9nTWVzc2FnZXMuRVJST1JfU0FWSU5HX0ZJTEUsIGZpbGVOYW1lKTsKLQotCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBicmllZk1lc3NhZ2UsIGNyZWF0ZVN0YXR1cyhyZWFzb24sIGRldGFpbHMpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4MikgewotCQkJCQl9Ci0JCQkJfQotCQkJCWNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPLi4uIFRoaXMgd2FzIGNvcGllZCBmcm9tIFdpbmRvd1V0aWxpdHkuIElzIHRoZXJlIGFuIGVhc2llciB3YXkgdG8KLQkvLyBjcmVhdGUgYSBzdGF0dXMgb2JqZWN0PwotCS8vIElmIG5vdCwgd2Ugc2hvdWxkIG9wZW4gYW4gZWNsaXBzZSBidWcgb3IgYWRkIGEgc2ltaWxhciB1dGlsaXR5IHRvCi0JLy8gYmFzZUV4dGVuc2lvbnNVSS4KLQkvLwotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKFN0cmluZyByZWFzb24sIFN0cmluZyBtc2cpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhwbHVnaW5JZCwgMCwgcmVhc29uLCBudWxsKTsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luSWQsIDAsIG1zZywgbnVsbCk7Ci0JCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlSWZSZXF1aXJlZChJRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoKGZpbGUgIT0gbnVsbCkgJiYgIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7Ci0JCQkJZmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOwotCQkJCS8vIGNyZWF0ZUVtcHR5WE1MQ2F0YWxvZyhmaWxlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2NTMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlciBfaW5zdGFuY2U7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0VYVEVOU0lPTlMgPSAiZXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY2F0YWxvZ0ZpbGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJmaWxlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dGaWxlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmhhc2hNYXAudmFsdWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwIGhhc2hNYXA7Ci0KLQlwdWJsaWMgQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXRoaXMuaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJlYWRSZWdpc3RyeSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJWE1MQ2F0YWxvZ0ZpbGVUeXBlIGZpbGVUeXBlID0gKFhNTENhdGFsb2dGaWxlVHlwZSkgaGFzaE1hcC5nZXQoaWQpOwotCQkJCWlmIChmaWxlVHlwZSA9PSBudWxsKSB7Ci0JCQkJCWZpbGVUeXBlID0gbmV3IFhNTENhdGFsb2dGaWxlVHlwZSgpOwotCQkJCQloYXNoTWFwLnB1dChpZCwgZmlsZVR5cGUpOwotCQkJCX0KLQotCQkJCWlmIChmaWxlVHlwZS5kZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERVNDUklQVElPTik7Ci0JCQkJCWZpbGVUeXBlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQkJfQotCi0JCQkJZmlsZVR5cGUuYWRkRXh0ZW5zaW9ucyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRVhURU5TSU9OUykpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJcmVhZFJlZ2lzdHJ5KEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeShTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChYTUxVSVBsdWdpbi5JRCwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvRWRpdENhdGFsb2dFbnRyeURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMmMyOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0U2luZ2xlRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotcHVibGljIGNsYXNzIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgYm9yd3NlSW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL29iajE2L2ZpbGVfZXhwYW5kLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBjYXRhbG9nRW50cnlUb29sQmFySW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL2V0b29sNTAvY2F0YWxvZ0VudHJ5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBuZXh0Q2F0YWxvZ1Rvb2xCYXJJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvZXRvb2w1MC9uZXh0Q2F0YWxvZy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGNsYXNzIENhdGFsb2dFbnRyeVBhZ2UgZXh0ZW5kcyBDYXRhbG9nRWxlbWVudFBhZ2UgewotCi0JCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JCXByb3RlY3RlZCBJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeTsKLQotCQlwcm90ZWN0ZWQgQnV0dG9uIGNoZWNrYm94QnV0dG9uOwotCi0JCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQotCQlwcm90ZWN0ZWQgVGV4dCBrZXlGaWVsZDsKLQotCQlwcm90ZWN0ZWQgQ29tYm8ga2V5VHlwZUNvbWJvOwotCi0JCXByb3RlY3RlZCBUZXh0IHJlc291cmNlTG9jYXRpb25GaWVsZDsKLQotCQlwcm90ZWN0ZWQgQ29tYm8gcmVzb3VyY2VUeXBlQ29tYm87Ci0KLQkJcHJvdGVjdGVkIFRleHQgd2ViQWRkcmVzc0ZpZWxkOwotCQkKLQkJcHJvdGVjdGVkIFN0cmluZyBrZXk7Ci0JCQotCQlwcm90ZWN0ZWQgaW50IHR5cGU7Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCWVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQl3YXJuaW5nTWVzc2FnZSA9IG51bGw7Ci0KLQkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IHJlc291cmNlTG9jYXRpb25GaWVsZC5nZXRUZXh0KCk7Ci0JCQkJaWYgKGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKChmaWxlTmFtZS5pbmRleE9mKCIuLiIpICE9IC0xKSB8fCAoZmlsZU5hbWUuaW5kZXhPZigiLi8iKSAhPSAtMSkgfHwgKGZpbGVOYW1lLmluZGV4T2YoIi8uIikgIT0gLTEpIHx8IChmaWxlTmFtZS5pbmRleE9mKCIuXFwiKSAhPSAtMSkgfHwgKGZpbGVOYW1lLmluZGV4T2YoIlxcLiIpICE9IC0xKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCWVycm9yTWVzc2FnZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9XQVJOSU5HX1VSSV9NVVNUX05PVF9IQVZFX0RPVFM7Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgdXJpID0gZmlsZU5hbWU7Ci0JCQkJCWlmICghVVJJSGVscGVyLmhhc1Byb3RvY29sKHVyaSkpIHsKLQkJCQkJCVVSSUhlbHBlci5pc0Fic29sdXRlKHVyaSk7Ci0JCQkJCQl1cmkgPSAoVVJJSGVscGVyLmlzQWJzb2x1dGUodXJpKSkgPyBVUklIZWxwZXIucHJlcGVuZEZpbGVQcm90b2NvbCh1cmkpIDogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKTsKLQkJCQkJfQotCi0JCQkJCWlmICgoZXJyb3JNZXNzYWdlID09IG51bGwpICYmICFVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCQkJZXJyb3JNZXNzYWdlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9DT0xPTiArIGZpbGVOYW1lOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0aGlzIGFuIGVycm9yIHRoYXQgaXMgbm90IGFjdGF1bGx5Ci0JCQkJCS8vIHJlcG9ydGVkIC4uLiBPSyBpcyBqdXN0IGRpc2FibGVkCi0JCQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBrZXkgaXMgYSBmdWxseSBxdWFsaWZpZWQgVVJJIGluIHRoZSBjYXNlcwotCQkJCS8vIHdoZXJlIHRoZSBrZXkgdHlwZSBpcyAiU3lzdGVtIElEIiBvciAiU2NoZW1hIGxvY2F0aW9uIgotCQkJCWlmICgoa2V5RmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgJiYgKGdldEtleVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNKSkgewotCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShrZXlGaWVsZC5nZXRUZXh0KCkpOwotCQkJCQlpZiAodXJpLnNjaGVtZSgpID09IG51bGwpIHsKLQkJCQkJCXdhcm5pbmdNZXNzYWdlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1dBUk5JTkdfU0hPVUxEX0JFX0ZVTExZX1FVQUxJRklFRF9VUkk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgoZXJyb3JNZXNzYWdlID09IG51bGwpICYmIGNoZWNrYm94QnV0dG9uLmdldFNlbGVjdGlvbigpICYmICh3ZWJBZGRyZXNzRmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCS8vIHRoaXMgYW4gZXJyb3IgdGhhdCBpcyBub3QgYWN0YXVsbHkKLQkJCQkvLyByZXBvcnRlZCAuLi4gT0sgaXMganVzdCBkaXNhYmxlZAotCQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmICgoZXJyb3JNZXNzYWdlID09IG51bGwpICYmIChrZXlGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJLy8gdGhpcyBhbiBlcnJvciB0aGF0IGlzIG5vdCBhY3RhdWxseQotCQkJCS8vIHJlcG9ydGVkIC4uLiBPSyBpcyBqdXN0IGRpc2FibGVkCi0JCQkJZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNhdGFsb2dFbnRyeVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWlmIChlLndpZGdldCA9PSByZXNvdXJjZUxvY2F0aW9uRmllbGQpIHsKLQkJCQkJCWlmIChrZXlGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCVN0cmluZyB1cmkgPSByZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpOwotCQkJCQkJCWlmICh1cmkuZW5kc1dpdGgoInhzZCIpICYmICFVUklIZWxwZXIuaGFzUHJvdG9jb2wodXJpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXVyaSA9IFVSSUhlbHBlci5pc0Fic29sdXRlKHVyaSkgPyBVUklIZWxwZXIucHJlcGVuZEZpbGVQcm90b2NvbCh1cmkpIDogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKTsKLQkJCQkJCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSA9IFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEodXJpKTsKLQkJCQkJCQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlrZXlGaWVsZC5zZXRUZXh0KG5hbWVzcGFjZVVSSSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdXBkYXRlV2lkZ2V0cyhlLndpZGdldCk7Ci0JCQkJfQotCQkJfTsKLQotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUxhYmVsIHJlc291cmNlTG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJcmVzb3VyY2VMb2NhdGlvbkxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0xPQ0FUSU9OX0NPTE9OKTsKLQotCQkJcmVzb3VyY2VMb2NhdGlvbkZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCXJlc291cmNlTG9jYXRpb25GaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJcmVzb3VyY2VMb2NhdGlvbkZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKFVSSVV0aWxzLmNvbnZlcnRVUklUb0xvY2F0aW9uKGdldEVudHJ5KCkuZ2V0VVJJKCkpKSk7Ci0KLQkJCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChyZXNvdXJjZUxvY2F0aW9uRmllbGQsCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1VSSSk7Ci0JCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0KLQkJCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJyb3dzZUJ1dHRvbihncm91cCk7Ci0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoYnJvd3NlQnV0dG9uLAotCQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9FTlRSWV9CUk9XU0UpOwotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKHJlc291cmNlTG9jYXRpb25GaWVsZCkpOwotCi0JCQkvLyBLZXkgVHlwZQotCQkJLy8KLQkJCUxhYmVsIGtleVR5cGVMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJa2V5VHlwZUxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0NPTE9OKTsKLQotCQkJa2V5VHlwZUNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQlrZXlUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQl1cGRhdGVLZXlUeXBlQ29tYm8oZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSk7Ci0JCQlrZXlUeXBlQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGtleVR5cGVDb21ibywKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfS0VZX1RZUEUpOwotCi0JCQkvLyBhIHBsYWNlaG9sZGVyIHRvIGZpbGwgdGhlIDNyZCBjb2x1bW4KLQkJCUJ1dHRvbiBwbGFjZUhvbGRlciA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5OT05FKTsKLQkJCXBsYWNlSG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQkvLyBLZXkKLQkJCS8vIAotCQkJTGFiZWwga2V5VmFsdWVMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJa2V5VmFsdWVMYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9LRVlfQ09MT04pOwotCQkJa2V5RmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGtleUZpZWxkLAotCQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9FTlRSWV9LRVkpOwotCQkJa2V5RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlrZXlGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShnZXRFbnRyeSgpLmdldEtleSgpKSk7Ci0JCQlrZXlGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCUNvbXBvc2l0ZSBncm91cDIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyb3VwMi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyb3VwMi5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJLy8gY2hlY2tib3ggLS0gbm90ZSBwYXJlbnQgaXMgZGlhbG9nQXJlYQotCQkJLy8KLQkJCWNoZWNrYm94QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cDIsIFNXVC5DSEVDSyk7Ci0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2hlY2tib3hCdXR0b24sCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1NQRUNJRllfQUxURVJOQVRJVkUpOwotCQkJY2hlY2tib3hCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfU1BFQ0lGWV9BTFRFUk5BVElWRV9XRUJfVVJMKTsKLQkJCWNoZWNrYm94QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJY2hlY2tib3hCdXR0b24uc2V0U2VsZWN0aW9uKGdldEVudHJ5KCkuZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpICE9IG51bGwpOwotCQkJU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIG5vIGltcGwKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQud2lkZ2V0ID09IGNoZWNrYm94QnV0dG9uKSB7Ci0JCQkJCQl1cGRhdGVXaWRnZXRzKGNoZWNrYm94QnV0dG9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQljaGVja2JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0KLQkJCS8vIFdlYiBBZGRyZXNzIGZpZWxkCi0JCQkvLwotCi0JCQlNb2RpZnlMaXN0ZW5lciB3ZWJBZGRyZXNzRmllbGRMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl3ZWJBZGRyZXNzRmllbGQgPSBuZXcgVGV4dChncm91cDIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh3ZWJBZGRyZXNzRmllbGQsCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1dFQl9BRERSRVNTKTsKLQkJCXdlYkFkZHJlc3NGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXdlYkFkZHJlc3NGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShnZXRFbnRyeSgpLmdldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMKSkpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHdlYkFkZHJlc3NGaWVsZExpc3RlbmVyKTsKLQotCi0JCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChncm91cDIsIFNXVC5OT05FKTsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCXVwZGF0ZVdpZGdldHMobnVsbCk7Ci0JCQkKLQkJCWtleSA9IGdldEVudHJ5KCkuZ2V0S2V5KCk7Ci0JCQl0eXBlID0gZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKTsKLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlmQ29udHJvbCA9IGNyZWF0ZUNhdGFsb2dFbnRyeVBhbmVsKHBhcmVudCk7Ci0KLQkJCXJldHVybiBmQ29udHJvbDsKLQkJfQotCi0KLQkJcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGdldEVudHJ5KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSUNhdGFsb2dFbnRyeSBnZXRFbnRyeSgpIHsKLQkJCWlmIChjYXRhbG9nRW50cnkgPT0gbnVsbCkgewotCQkJCWlmICgoZkNhdGFsb2dFbGVtZW50ICE9IG51bGwpICYmIChmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKSkgewotCQkJCQljYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZkNhdGFsb2dFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNhdGFsb2dFbnRyeTsKLQkJfQotCi0JCXByb3RlY3RlZCBpbnQgZ2V0S2V5VHlwZSgpIHsKLQkJCXN3aXRjaCAoa2V5VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlpZiAoInNjaGVtYSIuZXF1YWxzKGtleVR5cGVDb21iby5nZXREYXRhKCJrZXlUeXBlIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7IC8vIHhzZAotCQkJCQkJCQkJCQkJCQkJCS8vIG5hbWVzcGFjZQotCQkJCQkJCQkJCQkJCQkJCS8vIGlzIFVSSSB0eXBlCi0JCQkJCQkJCQkJCQkJCQkJLy8ga2V5Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU07Ci0JCQkJY2FzZSAyIDoKLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2F2ZURhdGEoKSB7Ci0JCQlpZiAodmFsaWRhdGVEYXRhKCkpIHsKLQkJCQlnZXRFbnRyeSgpLnNldFVSSShVUklVdGlscy5jb252ZXJ0TG9jYXRpb25Ub1VSSShyZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpKSk7Ci0JCQkJZ2V0RW50cnkoKS5zZXRLZXkoa2V5RmllbGQuZ2V0VGV4dCgpKTsKLQkJCQlnZXRFbnRyeSgpLnNldEVudHJ5VHlwZShnZXRLZXlUeXBlKCkpOwotCQkJCWdldEVudHJ5KCkuc2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwsIGNoZWNrYm94QnV0dG9uLmdldFNlbGVjdGlvbigpID8gd2ViQWRkcmVzc0ZpZWxkLmdldFRleHQoKSA6IG51bGwpOwotCQkJCWRhdGFTYXZlZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19EVVBMSUNBVEVfRU5UUlk7Ci0JCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UpOwotCQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJCQlkYXRhU2F2ZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIFZhbGlkYXRlcyB0aGF0IHRoZSBkYXRhIGVudGVyZWQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbiBleGlzdGluZyBlbnRyeSBpbiBlaXRoZXIgY2F0YWxvZy4KLQkJICogQHJldHVybiBUcnVlIGlmIHZhbGlkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVEYXRhKCkgewotCQkKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaWYgKGtleSA9PSBudWxsIHx8ICFrZXkuZXF1YWxzKGtleUZpZWxkLmdldFRleHQoKSkgfHwgdHlwZSAhPSBnZXRLZXlUeXBlKCkpCi0JCQl7Ci0JCQkJLy8gZ2V0IHN5c3RlbSBjYXRhbG9nCi0JCQkJSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZyA9IG51bGw7CQkJCi0JCQkJSUNhdGFsb2cgZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQkJCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotCQkJCQlJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQkJCWlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQkJCXN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQl0cnkgewotCQkJCQlzd2l0Y2goIGdldEtleVR5cGUoKSApCi0JCQkJCXsKLQkJCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOgotCQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKGtleUZpZWxkLmdldFRleHQoKSwgbnVsbCk7CQkKLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJCXJlc3VsdCA9IHN5c3RlbUNhdGFsb2cucmVzb2x2ZVB1YmxpYyhrZXlGaWVsZC5nZXRUZXh0KCksIG51bGwpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTToKLQkJCQkJCXJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZVN5c3RlbShrZXlGaWVsZC5nZXRUZXh0KCkpOwotCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQkJcmVzdWx0ID0gc3lzdGVtQ2F0YWxvZy5yZXNvbHZlU3lzdGVtKGtleUZpZWxkLmdldFRleHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOgotCQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlVVJJKGtleUZpZWxkLmdldFRleHQoKSk7Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCQlyZXN1bHQgPSBzeXN0ZW1DYXRhbG9nLnJlc29sdmVVUkkoa2V5RmllbGQuZ2V0VGV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuIChyZXN1bHQgPT0gbnVsbCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVLZXlUeXBlQ29tYm8oaW50IHR5cGUpIHsKLQkJCWtleVR5cGVDb21iby5yZW1vdmVBbGwoKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmdldFhNTENhdGFsb2dGaWxlVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlYTUxDYXRhbG9nRmlsZVR5cGUgdGhlRmlsZVR5cGUgPSAoWE1MQ2F0YWxvZ0ZpbGVUeXBlKSBpLm5leHQoKTsKLQkJCQlpZiAodGhlRmlsZVR5cGUuZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaiA9IHRoZUZpbGVUeXBlLmV4dGVuc2lvbnMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gKFN0cmluZykgai5uZXh0KCk7Ci0JCQkJCQlpZiAocmVzb3VyY2VMb2NhdGlvbkZpZWxkLmdldFRleHQoKS5lbmRzV2l0aChleHRlbnNpb24pKSB7Ci0JCQkJCQkJaWYgKHRoZUZpbGVUeXBlLmRlc2NyaXB0aW9uLmVxdWFscygiWFNEIEZpbGVzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfUFVCTElDKTsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1NZU1RFTSk7Ci0JCQkJCQkJCWtleVR5cGVDb21iby5zZXREYXRhKCJrZXlUeXBlIiwgInNjaGVtYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAodGhlRmlsZVR5cGUuZGVzY3JpcHRpb24uZXF1YWxzKCJEVEQgRmlsZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUMpOwotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfU1lTVEVNKTsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJCWlmIChrZXlUeXBlQ29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUMpOwotCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU0pOwotCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSSk7Ci0JCQl9Ci0KLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyA6Ci0JCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSA6Ci0JCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSA6IC8vIGhhbmRsZSBYTUwgU2NoZW1hLAotCQkJCQkJCQkJCQkJCS8vIHdoZXJlIG5hbWVzcGFjZSBuYW1lIGlzCi0JCQkJCQkJCQkJCQkJLy8gbWFwcGVkIHRvIFVSSSBzaXR1YXRpb24KLQkJCQkJaWYgKCJzY2hlbWEiLmVxdWFscyhrZXlUeXBlQ29tYm8uZ2V0RGF0YSgia2V5VHlwZSIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMCk7IC8vIG5hbWVzcGFjZSBuYW1lIGFzIFVSSSBrZXkKLQkJCQkJCQkJCQkJCS8vIHR5cGUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMik7IC8vIFVSSSBrZXkgdHlwZQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoa2V5VHlwZUNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgwKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2ViQWRkcmVzc1dpZGdldHMoaW50IGtleVR5cGUpIHsKLQkJCWJvb2xlYW4gaXNQdWJsaWNLZXlUeXBlID0gKGtleVR5cGUgPT0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyk7Ci0JCQljaGVja2JveEJ1dHRvbi5zZXRFbmFibGVkKGlzUHVibGljS2V5VHlwZSk7Ci0JCQl3ZWJBZGRyZXNzRmllbGQuc2V0RW5hYmxlZChpc1B1YmxpY0tleVR5cGUgJiYgY2hlY2tib3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0cyhXaWRnZXQgd2lkZ2V0KSB7Ci0JCQlpZiAod2lkZ2V0ICE9IGtleVR5cGVDb21ibykgewotCQkJCXVwZGF0ZUtleVR5cGVDb21ibyhnZXRLZXlUeXBlKCkpOwotCQkJfQotCQkJdXBkYXRlV2ViQWRkcmVzc1dpZGdldHMoZ2V0S2V5VHlwZSgpKTsKLQkJCWNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKGVycm9yTWVzc2FnZUxhYmVsKTsKLQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIENhdGFsb2dFbGVtZW50UGFnZSB7Ci0KLQkJQ29udHJvbCBmQ29udHJvbDsKLQotCQlwdWJsaWMgQ2F0YWxvZ0VsZW1lbnRQYWdlKCkgewotCQkJc3VwZXIoKTsKLQotCQl9Ci0KLQkJcHVibGljIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQotCQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIGZDb250cm9sOwotCQl9Ci0KLQkJcHVibGljIGFic3RyYWN0IElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCk7Ci0KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZURhdGEoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRmlsdGVyYWJsZVNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgQ29tYm8gZmlsdGVyQ29udHJvbDsKLQotCQlwdWJsaWMgRmlsdGVyYWJsZVNlbGVjdFNpbmdsZUZpbGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJCXN1cGVyKHBhcmVudFNoZWxsLCBudWxsLCB0cnVlKTsKLQkJCXNldEZpbHRlcnMobnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVBbmRPcGVuKCkgewotCQkJdGhpcy5jcmVhdGUoKTsKLQkJCXNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9GSUxFX1NFTEVDVElPTik7Ci0JCQl0aGlzLnNldFRpdGxlKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9TRUxFQ1RfRklMRSk7Ci0JCQl0aGlzLnNldE1lc3NhZ2UoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0NIT09TRV9GSUxFX1RPX0FERF9UT19DQVRBTE9HKTsKLQkJCW9wZW4oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9TRUxFQ1RfRklMRV9GSUxURVJfQ09OVFJPTCk7Ci0KLQkJCWZpbHRlckNvbnRyb2wgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZmlsdGVyQ29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJZmlsdGVyQ29udHJvbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9URVhUX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MKTsKLQkJCWZpbHRlckNvbnRyb2wuYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9URVhUX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuZ2V0WE1MQ2F0YWxvZ0ZpbGVUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJCWlmIChmaWxlVHlwZS5kZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWZpbHRlckNvbnRyb2wuYWRkKGZpbGVUeXBlLmRlc2NyaXB0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZpbHRlckNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRGaWx0ZXJzKFhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSkgewotCQkJaWYgKGZpbGVUeXBlID09IG51bGwpIHsKLQkJCQkvLyBjb21wdXRlIGFsbCB0aGUgc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9ucwotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlci5nZXRYTUxDYXRhbG9nRmlsZVR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVhNTENhdGFsb2dGaWxlVHlwZSB0aGVGaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJCQlpZiAodGhlRmlsZVR5cGUuZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCQkJCQlsaXN0LmFkZEFsbCh0aGVGaWxlVHlwZS5leHRlbnNpb25zKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBBbnkgZmlsZXMgYXJlIG5vdyBzdXBwb3J0ZWQgd2l0aCBSZXNvdXJjZSBVUkkKLQkJCQkvLyBzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRGaWx0ZXJFeHRlbnNpb25zKGNyZWF0ZVN0cmluZ0FycmF5KGxpc3QpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChmaWxlVHlwZS5leHRlbnNpb25zICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0RmlsdGVyRXh0ZW5zaW9ucyhjcmVhdGVTdHJpbmdBcnJheShmaWxlVHlwZS5leHRlbnNpb25zKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyB0ZXh0ID0gZmlsdGVyQ29udHJvbC5nZXRUZXh0KCk7Ci0JCQlYTUxDYXRhbG9nRmlsZVR5cGUgZmlsZVR5cGUgPSBnZXRNYXRjaGluZ0ZpbGVUeXBlKHRleHQpOwotCQkJc2V0RmlsdGVycyhmaWxlVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTmV4dENhdGFsb2dQYWdlIGV4dGVuZHMgQ2F0YWxvZ0VsZW1lbnRQYWdlIHsKLQkJcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQkJcHJvdGVjdGVkIFRleHQgY2F0YWxvZ0xvY2F0aW9uRmllbGQ7Ci0KLQkJcHJvdGVjdGVkIElOZXh0Q2F0YWxvZyBuZXh0Q2F0YWxvZzsKLQotCQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCWVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLQkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGNhdGFsb2dMb2NhdGlvbkZpZWxkLmdldFRleHQoKTsKLQkJCQlpZiAoZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoKGZpbGVOYW1lLmluZGV4T2YoIi4uIikgIT0gLTEpIHx8IChmaWxlTmFtZS5pbmRleE9mKCIuLyIpICE9IC0xKSB8fCAoZmlsZU5hbWUuaW5kZXhPZigiLy4iKSAhPSAtMSkgfHwgKGZpbGVOYW1lLmluZGV4T2YoIi5cXCIpICE9IC0xKSB8fCAoZmlsZU5hbWUuaW5kZXhPZigiXFwuIikgIT0gLTEpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJZXJyb3JNZXNzYWdlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1dBUk5JTkdfVVJJX01VU1RfTk9UX0hBVkVfRE9UUzsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyB1cmkgPSBmaWxlTmFtZTsKLQkJCQkJaWYgKCFVUklIZWxwZXIuaGFzUHJvdG9jb2wodXJpKSkgewotCQkJCQkJdXJpID0gVVJJSGVscGVyLmlzQWJzb2x1dGUodXJpKSA/IFVSSUhlbHBlci5wcmVwZW5kRmlsZVByb3RvY29sKHVyaSkgOiBVUklIZWxwZXIucHJlcGVuZFBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbCh1cmkpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgJiYgIVVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgZmFsc2UpKSB7Ci0JCQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OICsgZmlsZU5hbWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRoaXMgYW4gZXJyb3IgdGhhdCBpcyBub3QgYWN0dWFsbHkKLQkJCQkJLy8gcmVwb3J0ZWQgLi4uIE9LIGlzIGp1c3QgZGlzYWJsZWQKLQkJCQkJZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJZkNvbnRyb2wgPSBjcmVhdGVOZXh0Q2F0YWxvZ1BhbmVsKHBhcmVudCk7Ci0JCQlyZXR1cm4gZkNvbnRyb2w7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVOZXh0Q2F0YWxvZ1BhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCU1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQl1cGRhdGVXaWRnZXRzKGUud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUxhYmVsIHJlc291cmNlTG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJcmVzb3VyY2VMb2NhdGlvbkxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0NBVEFMT0dfVVJJX0NPTE9OKTsKLQotCQkJLy8gZmlsbGVyCi0JCQluZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQotCQkJY2F0YWxvZ0xvY2F0aW9uRmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJY2F0YWxvZ0xvY2F0aW9uRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQljYXRhbG9nTG9jYXRpb25GaWVsZC5zZXRUZXh0KFVSSVV0aWxzLmNvbnZlcnRVUklUb0xvY2F0aW9uKGdldERpc3BsYXlWYWx1ZShnZXROZXh0Q2F0YWxvZygpLmdldENhdGFsb2dMb2NhdGlvbigpKSkpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKHJlc291cmNlTG9jYXRpb25GaWVsZCwKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfVVJJKTsKLQkJCWNhdGFsb2dMb2NhdGlvbkZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnJvd3NlQnV0dG9uKGdyb3VwKTsKLQkJCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcihjYXRhbG9nTG9jYXRpb25GaWVsZCkpOwotCi0JCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXVwZGF0ZVdpZGdldHMobnVsbCk7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGdldE5leHRDYXRhbG9nKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSU5leHRDYXRhbG9nIGdldE5leHRDYXRhbG9nKCkgewotCQkJaWYgKG5leHRDYXRhbG9nID09IG51bGwpIHsKLQkJCQlpZiAoKGZDYXRhbG9nRWxlbWVudCAhPSBudWxsKSAmJiAoZkNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0cpKSB7Ci0JCQkJCW5leHRDYXRhbG9nID0gKElOZXh0Q2F0YWxvZykgZkNhdGFsb2dFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJbmV4dENhdGFsb2cgPSAoSU5leHRDYXRhbG9nKSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV4dENhdGFsb2c7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzYXZlRGF0YSgpIHsKLQkJCWdldE5leHRDYXRhbG9nKCkuc2V0Q2F0YWxvZ0xvY2F0aW9uKFVSSVV0aWxzLmNvbnZlcnRMb2NhdGlvblRvVVJJKGNhdGFsb2dMb2NhdGlvbkZpZWxkLmdldFRleHQoKSkpOwotCQkJZGF0YVNhdmVkID0gdHJ1ZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHMoV2lkZ2V0IHdpZGdldCkgewotCQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoZXJyb3JNZXNzYWdlTGFiZWwpOwotCQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRvb2xCYXJJdGVtU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU9iamVjdCBzZWxlY3Rpb24gPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7Ci0JCQkJaWYgKCFzaG93UGFnZSgoQ2F0YWxvZ0VsZW1lbnRQYWdlKSAoKFRvb2xJdGVtKSBzZWxlY3Rpb24pLmdldERhdGEoKSkpIHsKLQkJCQkJLy8gUGFnZSBmbGlwcGluZyB3YXNuJ3Qgc3VjY2Vzc2Z1bAotCQkJCQkvLyBoYW5kbGVFcnJvcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjcmVhdGVTdHJpbmdBcnJheShMaXN0IGxpc3QpIHsKLQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7IGkrKykgewotCQkJc3RyaW5nQXJyYXlbaV0gPSAoU3RyaW5nKSBsaXN0LmdldChpKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nQXJyYXk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1NsYXNoKFN0cmluZyB1cmkpIHsKLQkJLy8gcmVtb3ZlIGxlYWRpbmcgc2xhc2ggZnJvbSB0aGUgdmFsdWUgdG8gYXZvaWQgdGhlIHdob2xlIGxlYWRpbmcKLQkJLy8gc2xhc2gKLQkJLy8gYW1iaWd1aXR5IHByb2JsZW0KLQkJLy8gICAgICAgCi0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJd2hpbGUgKHVyaS5zdGFydHNXaXRoKCIvIikgfHwgdXJpLnN0YXJ0c1dpdGgoIlxcIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdXJpID0gdXJpLnN1YnN0cmluZygxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCXByb3RlY3RlZCBJQ2F0YWxvZyBjYXRhbG9nOwotCi0JcHJvdGVjdGVkIElDYXRhbG9nRWxlbWVudCBmQ2F0YWxvZ0VsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgd2FybmluZ01lc3NhZ2U7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ0VsZW1lbnRQYWdlIHNlbGVjdGVkUGFnZTsKLQotCS8vIHByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVG9vbEJhciB0b29sQmFyOwotCi0JcHJvdGVjdGVkIENvbG9yIGNvbG9yOwotCXByb3RlY3RlZCBib29sZWFuIGRhdGFTYXZlZDsKLQotCXB1YmxpYyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJQ2F0YWxvZyBhQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuY2F0YWxvZyA9IGFDYXRhbG9nOwotCX0KLQotCXB1YmxpYyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQsIElDYXRhbG9nIGFDYXRhbG9nKSB7Ci0JCXRoaXMocGFyZW50U2hlbGwsIGFDYXRhbG9nKTsKLQkJdGhpcy5mQ2F0YWxvZ0VsZW1lbnQgPSBjYXRhbG9nRWxlbWVudDsKLQkJLy8gVE9ETyBFQjogZml4IGhpcwotCQkvLyBlbnRyeS5zZXRVUkkoVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChlbnRyeS5nZXRVUkkoKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlzZWxlY3RlZFBhZ2Uuc2F2ZURhdGEoKTsKLQkJCWlmICghZGF0YVNhdmVkKSB7CQkJCQotCQkJCS8vIGRvIG5vdCBleGl0IGVkaXQgZGlhbG9nCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2F0YWxvZ0VudHJ5QnV0dG9uKCkgewotCQlDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSA9IG5ldyBDYXRhbG9nRW50cnlQYWdlKCk7Ci0JCXBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJVG9vbEl0ZW0gdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQl0b29sSXRlbS5zZXRJbWFnZShjYXRhbG9nRW50cnlUb29sQmFySW1hZ2UpOwotCQl0b29sSXRlbS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX2NhdGFsb2dFbnRyeUxhYmVsKTsKLQkJdG9vbEl0ZW0uc2V0RGF0YShwYWdlKTsKLQkJdG9vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFRvb2xCYXJJdGVtU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQljb2xvciA9IG5ldyBDb2xvcihkaWFsb2dBcmVhQ29tcG9zaXRlLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZGlhbG9nQXJlYUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2Qud2lkdGhIaW50ID0gNTAwOwotCQlnZC5oZWlnaHRIaW50ID0gMjUwOwotCQlkaWFsb2dBcmVhQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCQljcmVhdGVNYWluQ29tcG9uZW50KGRpYWxvZ0FyZWFDb21wb3NpdGUpOwotCQlyZXR1cm4gdGhpcy5kaWFsb2dBcmVhOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlpZiAoY29sb3IgIT0gbnVsbCkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlTWFpbkNvbXBvbmVudChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChmQ2F0YWxvZ0VsZW1lbnQgIT0gbnVsbCkgLy8gImVkaXQiIGFjdGlvbgotCQl7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlMSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQljb21wb3NpdGUxLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQljb21wb3NpdGUxLnNldExheW91dChsYXlvdXQpOwotCi0JCQlwYWdlQ29udGFpbmVyID0gbmV3IFBhZ2VCb29rKGNvbXBvc2l0ZTEsIFNXVC5OT05FKTsKLQkJCXBhZ2VDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJCWlmIChmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKSB7Ci0JCQkJQ2F0YWxvZ0VsZW1lbnRQYWdlIGVudHJ5UGFnZSA9IG5ldyBDYXRhbG9nRW50cnlQYWdlKCk7Ci0JCQkJZW50cnlQYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0JCQkJc2hvd1BhZ2UoZW50cnlQYWdlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZDYXRhbG9nRWxlbWVudC5nZXRUeXBlKCkgPT0gSUNhdGFsb2dFbGVtZW50LlRZUEVfTkVYVF9DQVRBTE9HKSB7Ci0JCQkJQ2F0YWxvZ0VsZW1lbnRQYWdlIG5leHRDYXRhbG9nUGFnZSA9IG5ldyBOZXh0Q2F0YWxvZ1BhZ2UoKTsKLQkJCQluZXh0Q2F0YWxvZ1BhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJCQlzaG93UGFnZShuZXh0Q2F0YWxvZ1BhZ2UpOwotCQkJfQotCi0JCQlyZXR1cm4gY29tcG9zaXRlMTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlTWFpbkNvbXBvbmVudFdpdGhUb29sYmFyKGNvbXBvc2l0ZSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZU1haW5Db21wb25lbnRXaXRoVG9vbGJhcihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJRm9ybUxheW91dCBmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLQkJZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKLQkJY29tcG9zaXRlLnNldExheW91dChmb3JtTGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5GTEFUIHwgU1dULlZFUlRJQ0FMKTsKLQotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxhYmVsLCAwKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkvLyBkYXRhLmhlaWdodCA9IDI1MDsKLQkJLy8gZGF0YS53aWR0aCA9IDUwOwotCQl0b29sQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZTEgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobGFiZWwsIDApOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbEJhciwgMCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWNvbXBvc2l0ZTEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlMS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGVQYWdlQm9va1BhbmVsKGNvbXBvc2l0ZTEpOwotCQlwYWdlQ29udGFpbmVyID0gbmV3IFBhZ2VCb29rKGNvbXBvc2l0ZTEsIFNXVC5OT05FKTsKLQkJcGFnZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBhZGQgcGFnZXMgZm9yIGVhY2ggdHlwZSBvZiBjYXRhbG9nIGVsZW1lbnQKLQkJY3JlYXRlQ2F0YWxvZ0VudHJ5QnV0dG9uKCk7Ci0JCWNyZWF0ZU5leHRDYXRhbG9nQnV0dG9uKCk7Ci0JCWlmICh0b29sQmFyLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJVG9vbEl0ZW0gaXRlbSA9IHRvb2xCYXIuZ2V0SXRlbSgwKTsKLQkJCXNob3dQYWdlKChDYXRhbG9nRWxlbWVudFBhZ2UpIChpdGVtLmdldERhdGEoKSkpOwotCQl9Ci0JCXJldHVybiBjb21wb3NpdGUxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5leHRDYXRhbG9nQnV0dG9uKCkgewotCQlDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSA9IG5ldyBOZXh0Q2F0YWxvZ1BhZ2UoKTsKLQkJcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQlUb29sSXRlbSB0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCXRvb2xJdGVtLnNldEltYWdlKG5leHRDYXRhbG9nVG9vbEJhckltYWdlKTsKLQkJdG9vbEl0ZW0uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuRWRpdENhdGFsb2dFbnRyeURpYWxvZ19uZXh0Q2F0YWxvZ0xhYmVsKTsKLQkJdG9vbEl0ZW0uc2V0RGF0YShwYWdlKTsKLQkJdG9vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFRvb2xCYXJJdGVtU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2dFbGVtZW50IGdldENhdGFsb2dFbGVtZW50KCkgewotCQlyZXR1cm4gZkNhdGFsb2dFbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ0ZpbGVUeXBlIGdldE1hdGNoaW5nRmlsZVR5cGUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCVhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmdldFhNTENhdGFsb2dGaWxlVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVhNTENhdGFsb2dGaWxlVHlwZSB0aGVGaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJaWYgKCh0aGVGaWxlVHlwZS5kZXNjcmlwdGlvbiAhPSBudWxsKSAmJiB0aGVGaWxlVHlwZS5kZXNjcmlwdGlvbi5lcXVhbHMoZGVzY3JpcHRpb24pKSB7Ci0JCQkJZmlsZVR5cGUgPSB0aGVGaWxlVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1BhZ2UoQ2F0YWxvZ0VsZW1lbnRQYWdlIHBhZ2UpIHsKLQkJaWYgKHBhZ2VDb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJc2VsZWN0ZWRQYWdlID0gcGFnZTsKLQkJcGFnZUNvbnRhaW5lci5zZXRWaXNpYmxlKHRydWUpOwotCQlwYWdlQ29udGFpbmVyLnNob3dQYWdlKHNlbGVjdGVkUGFnZS5nZXRDb250cm9sKCkpOwotCQlmQ2F0YWxvZ0VsZW1lbnQgPSBzZWxlY3RlZFBhZ2UuZ2V0RGF0YSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbCkgewotCQlpZiAoZXJyb3JNZXNzYWdlICE9IG51bGwpIHsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmICh3YXJuaW5nTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KHdhcm5pbmdNZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT0tCdXR0b25TdGF0ZSgpIHsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCcm93c2VCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJLy8gYnJvd3NlQnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLgotCQkvLyBVSV9CVVRUT05fQlJPV1NFIikpOwotCQlicm93c2VCdXR0b24uc2V0SW1hZ2UoYm9yd3NlSW1hZ2UpOwotCQlSZWN0YW5nbGUgciA9IGJvcndzZUltYWdlLmdldEJvdW5kcygpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlpbnQgSU1BR0VfV0lEVEhfTUFSR0lOID0gNjsKLQkJaW50IElNQUdFX0hFSUdIVF9NQVJHSU4gPSA2OwotCQlnZC5oZWlnaHRIaW50ID0gci5oZWlnaHQgKyBJTUFHRV9IRUlHSFRfTUFSR0lOOwotCQlnZC53aWR0aEhpbnQgPSByLndpZHRoICsgSU1BR0VfV0lEVEhfTUFSR0lOOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJcmV0dXJuIGJyb3dzZUJ1dHRvbjsKLQotCX0KLQotCWNsYXNzIERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHJpdmF0ZSBNZW51IG1lbnUgPSBudWxsOwotCQlwcml2YXRlIENvbnRyb2wgY29udHJvbDsKLQotCQlwdWJsaWMgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcihDb250cm9sIGFDb250cm9sKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb250cm9sID0gYUNvbnRyb2w7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLy8gQ3JlYXRlIHRoZSBtZW51IGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKLQkJCWlmIChtZW51ID09IG51bGwpIHsKLQkJCQkvLyBMYXp5IGNyZWF0ZSB0aGUgbWVudS4KLQkJCQltZW51ID0gbmV3IE1lbnUoZ2V0U2hlbGwoKSk7Ci0JCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJCW1lbnVJdGVtLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0UpOwotCQkJCS8qCi0JCQkJICogQWRkIGEgbWVudSBzZWxlY3Rpb24gbGlzdGVuZXIgc28gdGhhdCB0aGUgbWVudSBpcyBoaWRkZW4KLQkJCQkgKiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBmcm9tIHRoZSBkcm9wIGRvd24gbWVudS4KLQkJCQkgKi8KLQkJCQltZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJc2V0TWVudVZpc2libGUoZmFsc2UpOwotCQkJCQkJaW52b2tlV29ya3NwYWNlRmlsZVNlbGVjdGlvbkRpYWxvZygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQltZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQkJbWVudUl0ZW0uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX01FTlVfQlJPV1NFX0ZJTEVfU1lTVEVNKTsKLQkJCQkvKgotCQkJCSAqIEFkZCBhIG1lbnUgc2VsZWN0aW9uIGxpc3RlbmVyIHNvIHRoYXQgdGhlIG1lbnUgaXMgaGlkZGVuCi0JCQkJICogd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0gZnJvbSB0aGUgZHJvcCBkb3duIG1lbnUuCi0JCQkJICovCi0JCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXNldE1lbnVWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCWludm9rZUZpbGVTZWxlY3Rpb25EaWFsb2coKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQl9Ci0KLQkJCS8vIFBvc2l0aW9uIHRoZSBtZW51IGJlbG93IGFuZCB2ZXJ0aWNhbGx5IGFsaWduZWQgd2l0aCB0aGUgdGhlCi0JCQkvLyBkcm9wIGRvd24gdG9vbCBidXR0b24uCi0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCi0JCQkvLyBzZXQgbG9jYXRpb24KLQkJCVBvaW50IHB0QnJvd3NlID0gYnV0dG9uLmdldExvY2F0aW9uKCk7Ci0JCQlSZWN0YW5nbGUgcmNCcm93c2UgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlwdEJyb3dzZS55ICs9IHJjQnJvd3NlLmhlaWdodDsKLQkJCXB0QnJvd3NlID0gYnV0dG9uLmdldFBhcmVudCgpLnRvRGlzcGxheShwdEJyb3dzZSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHB0QnJvd3NlLngsIHB0QnJvd3NlLnkpOwotCi0JCQlzZXRNZW51VmlzaWJsZSh0cnVlKTsKLQotCQl9Ci0KLQkJdm9pZCBzZXRNZW51VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCW1lbnUuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCS8vIHRoaXMudmlzaWJsZSA9IHZpc2libGU7Ci0JCX0KLQotCQl2b2lkIGludm9rZVdvcmtzcGFjZUZpbGVTZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlGaWx0ZXJhYmxlU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsdGVyYWJsZVNlbGVjdFNpbmdsZUZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotCi0JCQlJRmlsZSBmaWxlID0gZGlhbG9nLmdldEZpbGUoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkvLyByZW1vdmUgbGVhZGluZyBzbGFzaCBmcm9tIHRoZSB2YWx1ZSB0byBhdm9pZCB0aGUKLQkJCQkvLyB3aG9sZSBsZWFkaW5nIHNsYXNoIGFtYmlndWl0eSBwcm9ibGVtCi0JCQkJLy8gICAgICAgICAgICAgICAgICAgIAotCQkJCVN0cmluZyB1cmkgPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQl3aGlsZSAodXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdXJpID0gdXJpLnN1YnN0cmluZygxKTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCSgoVGV4dCkgY29udHJvbCkuc2V0VGV4dCh1cmkpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJdm9pZCBpbnZva2VGaWxlU2VsZWN0aW9uRGlhbG9nKCkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuU0lOR0xFKTsKLQkJCVN0cmluZyBmaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmICgoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpICYmIChmaWxlICE9IG51bGwpKSB7Ci0JCQkJKChUZXh0KSBjb250cm9sKS5zZXRUZXh0KGZpbGUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0VsZW1lbnROb2RlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FbGVtZW50Tm9kZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjNjFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0VsZW1lbnROb2RlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWxlbWVudE5vZGVQYWdlIHsKLQotCUNvbnRyb2wgZkNvbnRyb2w7Ci0KLQlwdWJsaWMgRWxlbWVudE5vZGVQYWdlKCkgewotCQlzdXBlcigpOwotCi0JfQotCi0JcHVibGljIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmQ29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlRGF0YSgpOwotCi0JcHVibGljIGFic3RyYWN0IElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0ltYWdlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9JbWFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzOGE3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0ltYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1BfTEVGVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX1JJR0hUID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT01fTEVGVCA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NX1JJR0hUID0gNDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W11bXSBPVkVSTEFZX0NPT1JESU5BVEUgPSB7ezAsIDB9LCB7MCwgMn0sIHsyLCAwfSwgezIsIDJ9fTsKLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VGYWN0b3J5IElOU1RBTkNFID0gbmV3IEltYWdlRmFjdG9yeSgpOwotCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBjb21wb3NpdGVJbWFnZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHVibGljIEltYWdlRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0KLQkJaWYgKGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShnZXRDbGFzcygpLCBpY29uTmFtZSkpOwotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJbWFnZSBjcmVhdGVDb21wb3NpdGVJbWFnZShJbWFnZSBiYXNlLCBJbWFnZSBvdmVybGF5LCBpbnQgb3ZlcmxheVBvc2l0aW9uKSB7Ci0JCVN0cmluZyBrZXkgPSBiYXNlICsgIioiICsgb3ZlcmxheSArICIqIiArIG92ZXJsYXlQb3NpdGlvbjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUltYWdlIHJlc3VsdCA9IChJbWFnZSkgY29tcG9zaXRlSW1hZ2VUYWJsZS5nZXQoa2V5KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3Igb3ZlcmxheXNbXVtdID0gbmV3IEltYWdlRGVzY3JpcHRvclszXVszXTsKLQkJCWludFtdIGNvb3JkID0gT1ZFUkxBWV9DT09SRElOQVRFW292ZXJsYXlQb3NpdGlvbl07Ci0JCQlvdmVybGF5c1tjb29yZFsxXV1bY29vcmRbMF1dID0gbmV3IEltYWdlQmFzZWRJbWFnZURlc2NyaXB0b3Iob3ZlcmxheSk7Ci0JCQlPdmVybGF5SWNvbiBpY29uID0gbmV3IE92ZXJsYXlJY29uKG5ldyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yKGJhc2UpLCBvdmVybGF5cywgbmV3IFBvaW50KDE2LCAxNikpOwotCQkJcmVzdWx0ID0gaWNvbi5jcmVhdGVJbWFnZSgpOwotCQkJY29tcG9zaXRlSW1hZ2VUYWJsZS5wdXQoa2V5LCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3JXcmFwcGVyKEltYWdlIGltYWdlKSB7Ci0JCXJldHVybiBuZXcgSW1hZ2VCYXNlZEltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQW4gT3ZlcmxheUljb24gY29uc2lzdHMgb2YgYSBtYWluIGljb24gYW5kIHNldmVyYWwgYWRvcm5tZW50cy4KLQkgKi8KLQljbGFzcyBPdmVybGF5SWNvbiBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIID0gMjI7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVCA9IDE2OwotCi0JCXByaXZhdGUgUG9pbnQgZlNpemUgPSBudWxsOwotCi0JCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlOwotCi0JCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZPdmVybGF5c1tdW107Ci0KLQkJcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzLCBQb2ludCBzaXplKSB7Ci0JCQlmQmFzZSA9IGJhc2U7Ci0JCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJCWZTaXplID0gc2l6ZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21MZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCQlpbnQgeCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJCWlmICgoaSA8IGxlbmd0aCkgJiYgKG92ZXJsYXlzW2ldICE9IG51bGwpKSB7Ci0JCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCQkJeCArPSBpZC53aWR0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJCWlmIChvdmVybGF5cyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCQlpZiAoKGkgPCBsZW5ndGgpICYmIChvdmVybGF5c1tpXSAhPSBudWxsKSkgewotCQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQkJeCAtPSBpZC53aWR0aDsKLQkJCQkJZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueSAtIGlkLmhlaWdodCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yI2RyYXdDb21wb3NpdGVJbWFnZShpbnQsIGludCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJCUltYWdlRGF0YSBiZzsKLQkJCWlmICgoZkJhc2UgPT0gbnVsbCkgfHwgKChiZyA9IGZCYXNlLmdldEltYWdlRGF0YSgpKSA9PSBudWxsKSkgewotCQkJCWJnID0gREVGQVVMVF9JTUFHRV9EQVRBOwotCQkJfQotCQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQotCQkJaWYgKGZPdmVybGF5cyAhPSBudWxsKSB7Ci0JCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAwKSB7Ci0JCQkJCWRyYXdUb3BSaWdodChmT3ZlcmxheXNbMF0pOwotCQkJCX0KLQotCQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMSkgewotCQkJCQlkcmF3Qm90dG9tUmlnaHQoZk92ZXJsYXlzWzFdKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDIpIHsKLQkJCQkJZHJhd0JvdHRvbUxlZnQoZk92ZXJsYXlzWzJdKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDMpIHsKLQkJCQkJZHJhd1RvcExlZnQoZk92ZXJsYXlzWzNdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQkJaWYgKG92ZXJsYXlzID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQkJaW50IHggPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCQlpZiAoKGkgPCBsZW5ndGgpICYmIChvdmVybGF5c1tpXSAhPSBudWxsKSkgewotCQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCQkJeCArPSBpZC53aWR0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJCWlmIChvdmVybGF5cyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCQlpZiAoKGkgPCBsZW5ndGgpICYmIChvdmVybGF5c1tpXSAhPSBudWxsKSkgewotCQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQkJeCAtPSBpZC53aWR0aDsKLQkJCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZ2V0U2l6ZSgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJCXJldHVybiBmU2l6ZTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLQkJcHJvdGVjdGVkIEltYWdlIGltYWdlOwotCi0JCXB1YmxpYyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yKEltYWdlIGltYWdlKSB7Ci0JCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2VEYXRhIGdldEltYWdlRGF0YSgpIHsKLQkJCXJldHVybiBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvVVJJVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvVVJJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwYzJiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1VSSVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLQotcHVibGljIGNsYXNzIFVSSVV0aWxzIHsKLQkKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9QQVRURVJOID0gIjoiOyAKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6IjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvIjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9GSUxFX1BST1RPQ09MX0ZPUldBUkRfU0xBU0ggPSAiXFxcXFxcIjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9GSUxFX1BST1RPQ09MX0JBQ0tfU0xBU0ggPSAiLy8vIjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgICBQQVRIX1NFUEFSQVRPUl9GT1JXQVJEX1NMQVNIID0gJy8nOwotCSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciAgIFBBVEhfU0VQQVJBVE9SX0JBQ0tfU0xBU0ggPSAnXFwnOwotCSAgCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VVJJVG9Mb2NhdGlvbihTdHJpbmcgdXJpKSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSB1cmk7Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpIHsKLQkJCQkJbG9jYXRpb24gPSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSS5jcmVhdGVVUkkodXJpKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoTE9DQUxfRklMRV9QUk9UT0NPTF9CQUNLX1NMQVNIKQotCQkJCQkJCXx8IGxvY2F0aW9uLnN0YXJ0c1dpdGgoTE9DQUxfRklMRV9QUk9UT0NPTF9GT1JXQVJEX1NMQVNIKSkpIHsKLQkJCQkJCWxvY2F0aW9uID0gbG9jYXRpb24uc3Vic3RyaW5nKExPQ0FMX0ZJTEVfUFJPVE9DT0xfQkFDS19TTEFTSC5sZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKSkgewotCQkJCQlsb2NhdGlvbiA9IHVyaS5zdWJzdHJpbmcoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCSAgfQotCSAgCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0TG9jYXRpb25Ub1VSSShTdHJpbmcgbG9jYXRpb24pIHsKLQkJICBTdHJpbmcgdXJpID0gbG9jYXRpb247Ci0JCQlpZiAoIVVSSUhlbHBlci5oYXNQcm90b2NvbChsb2NhdGlvbikpIHsKLQkJCQl1cmkgPSBVUklIZWxwZXIuaXNBYnNvbHV0ZShsb2NhdGlvbik/IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuVVJJLmNyZWF0ZUZpbGVVUkkobG9jYXRpb24pLnRvU3RyaW5nKCkKLQkJCQkJCTogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wobG9jYXRpb24pOwotCQkJfQotCQkJaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wpICYmIHVyaS5pbmRleE9mKFBST1RPQ09MX1BBVFRFUk4sIEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpICE9IC0xKSB7Ci0JCQkJdXJpID0gVVJJSGVscGVyLmVuc3VyZUZpbGVVUklQcm90b2NvbEZvcm1hdCh1cmkpOwotCQkJfQotCQkJdXJpID0gdXJpLnJlcGxhY2UoUEFUSF9TRVBBUkFUT1JfQkFDS19TTEFTSCwgUEFUSF9TRVBBUkFUT1JfRk9SV0FSRF9TTEFTSCk7Ci0JCQlyZXR1cm4gdXJpOwotCSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyaWVzVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nRW50cmllc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmOGJiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyaWVzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0VudHJpZXNWaWV3IGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0JcHJvdGVjdGVkIFhNTENhdGFsb2dUcmVlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBJQ2F0YWxvZyB3b3JraW5nVXNlckNhdGFsb2c7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhZ2VFbmFibGVkID0gdHJ1ZTsKLQotCXB1YmxpYyBYTUxDYXRhbG9nRW50cmllc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nLCBJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndvcmtpbmdVc2VyQ2F0YWxvZyA9IHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQkJdGhpcy5zeXN0ZW1DYXRhbG9nID0gc3lzdGVtQ2F0YWxvZzsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQl0aGlzLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQl0YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKHRoaXMpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dCgiZHVtbXkiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMjY5MgotCQkvLyBzcGVjaWZpY2FsbHkgc2V0IHNpemUgb2YgdHJlZSBiZWZvcmUgZXhwYW5kaW5nIGl0Ci0JCVBvaW50IGluaXRpYWxTaXplID0gdGFibGVWaWV3ZXIuZ2V0VHJlZSgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IGluaXRpYWxTaXplLng7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBpbml0aWFsU2l6ZS55OwotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQl0YWJsZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCQl0YWJsZVZpZXdlci5yZXZlYWwoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QpOwotCQkKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVXaWRnZXRFbmFibGVkU3RhdGUoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQljcmVhdGVCdXR0b25zKHRoaXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUxlYWRpbmdTbGFzaChTdHJpbmcgdXJpKSB7Ci0JCS8vIHJlbW92ZSBsZWFkaW5nIHNsYXNoIGZyb20gdGhlIHZhbHVlIHRvIGF2b2lkIHRoZSB3aG9sZSBsZWFkaW5nCi0JCS8vIHNsYXNoIGFtYmlndWl0eSBwcm9ibGVtCi0JCS8vICAgICAgIAotCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCXdoaWxlICh1cmkuc3RhcnRzV2l0aCgiLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJcXCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXsKLQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUcmVlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGhlYWRpbmdzW10gPSBuZXcgU3RyaW5nWzJdOwotCQloZWFkaW5nc1swXSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9LRVk7Ci0JCWhlYWRpbmdzWzFdID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VSSTsKLQotCQlYTUxDYXRhbG9nVHJlZVZpZXdlciB0aGVUYWJsZVZpZXdlciA9IG5ldyBYTUxDYXRhbG9nVHJlZVZpZXdlcihwYXJlbnQsIHdvcmtpbmdVc2VyQ2F0YWxvZywgc3lzdGVtQ2F0YWxvZyk7Ci0JCXJldHVybiB0aGVUYWJsZVZpZXdlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luTGVmdCA9IDM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gbmV3QnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1OZXcoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikgewotCQkJCQlwZXJmb3JtRWRpdCgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChlLndpZGdldCA9PSBkZWxldGVCdXR0b24pIHsKLQkJCQkJcGVyZm9ybURlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQkvLyBhZGQgdGhlICJOZXcuLi4iIGJ1dHRvbgotCQkvLwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLQkJbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbmV3QnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9ORVcpOwotCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAobmV3QnV0dG9uLAotCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX01BUFBJTkdfTkVXKTsKLQkJbmV3QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQluZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCS8vIGFkZCB0aGUgIkVkaXQuLi4iIGJ1dHRvbgotCQkvLwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllZGl0QnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9FRElUKTsKLQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGVkaXRCdXR0b24sCi0JCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfTUFQUElOR19FRElUKTsKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJLy8gYWRkIHRoZSAiRGVsZXRlIiBidXR0b24KLQkJLy8KLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkZWxldGVCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX1JFTU9WRSk7Ci0JCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkZWxldGVCdXR0b24sCi0JCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfTUFQUElOR19ERUxFVEUpOwotCQlkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gNDsKLQotCQlCdXR0b24gaGlkZGVuQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaGlkZGVuQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQloaWRkZW5CdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWhpZGRlbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBhIGNydWRkeSBoYWNrIHNvIHRoYXQgdGhlIFByZWZlcmVuY2VEaWFsb2cgZG9lc24ndCBjbG9zZSBldmVyeSB0aW1lCi0JCS8vIHdlIHByZXNzICdlbnRlcicKLQkJLy8KLQkJZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKGhpZGRlbkJ1dHRvbik7Ci0JCXVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsvLyBYTUxDYXRhbG9nVHJlZVZpZXdlci5VU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgaW52b2tlRGlhbG9nKFN0cmluZyB0aXRsZSwgSUNhdGFsb2dFbGVtZW50IGVudHJ5LCBJQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCVNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGRpYWxvZyA9IGVudHJ5ICE9IG51bGwgPyBuZXcgRWRpdENhdGFsb2dFbnRyeURpYWxvZyhzaGVsbCwgZW50cnksIGNhdGFsb2cpIDogbmV3IEVkaXRDYXRhbG9nRW50cnlEaWFsb2coc2hlbGwsIGNhdGFsb2cpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgaW52b2tlRGlhbG9nKFN0cmluZyB0aXRsZSwgSUNhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gaW52b2tlRGlhbG9nKHRpdGxlLCBudWxsLCBjYXRhbG9nKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1OZXcoKSB7Ci0KLQkJLy8gSUNhdGFsb2dFbnRyeSBuZXdFbnRyeSA9Ci0JCS8vIChJQ2F0YWxvZ0VudHJ5KXdvcmtpbmdVc2VyQ2F0YWxvZy5jcmVhdGVDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSk7Ci0JCUVkaXRDYXRhbG9nRW50cnlEaWFsb2cgZGlhbG9nID0gaW52b2tlRGlhbG9nKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ORVdfRElBTE9HX1RJVExFLCB3b3JraW5nVXNlckNhdGFsb2cpOwotCQlJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCA9IGRpYWxvZy5nZXRDYXRhbG9nRWxlbWVudCgpOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCXdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChlbGVtZW50KTsKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KSwgdHJ1ZSk7Ci0JCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRWRpdCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRWxlbWVudCkgewotCQkJSUNhdGFsb2dFbGVtZW50IG9sZEVudHJ5ID0gKElDYXRhbG9nRWxlbWVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlJQ2F0YWxvZ0VsZW1lbnQgbmV3RW50cnkgPSAoSUNhdGFsb2dFbGVtZW50KSAoKENhdGFsb2dFbGVtZW50KSBvbGRFbnRyeSkuY2xvbmUoKTsKLQotCQkJRWRpdENhdGFsb2dFbnRyeURpYWxvZyBkaWFsb2cgPSBpbnZva2VEaWFsb2coWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0VESVRfRElBTE9HX1RJVExFLCBuZXdFbnRyeSwgd29ya2luZ1VzZXJDYXRhbG9nKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCS8vIGRlbGV0ZSB0aGUgb2xkIHZhbHVlIGlmIHRoZSAnbWFwRnJvbScgaGFzIGNoYW5nZWQKLQkJCQkvLwotCQkJCXdvcmtpbmdVc2VyQ2F0YWxvZy5yZW1vdmVDYXRhbG9nRWxlbWVudChvbGRFbnRyeSk7Ci0KLQkJCQkvLyB1cGRhdGUgdGhlIG5ldyBtYXBwaW5nCi0JCQkJLy8KLQkJCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQobmV3RW50cnkpOwotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdFbnRyeSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGV0ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbGVtZW50KSB7Ci0JCQkJCUlDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IChJQ2F0YWxvZ0VsZW1lbnQpIHNlbGVjdGVkT2JqZWN0OwotCQkJCQl3b3JraW5nVXNlckNhdGFsb2cucmVtb3ZlQ2F0YWxvZ0VsZW1lbnQoY2F0YWxvZ0VsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpIHsKLQkJYm9vbGVhbiBpc0VkaXRhYmxlID0gZmFsc2U7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gbXVsdGlwbGVTZWxlY3Rpb24gPSBmYWxzZTsKLQkJaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJaWYoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJbXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlOwotCQkJfQotCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRWxlbWVudCkgewotCQkJCUlDYXRhbG9nRWxlbWVudFtdIGVsZW1lbnRzID0gKChDYXRhbG9nKSB3b3JraW5nVXNlckNhdGFsb2cpLmdldENhdGFsb2dFbGVtZW50cygpOwotCQkJCS8vIGR3IExpc3QgZW50cmllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCQlpc0VkaXRhYmxlID0gc2VsZWN0ZWRPYmplY3QuZXF1YWxzKGVsZW1lbnQpOwotCQkJCQlpZiAoaXNFZGl0YWJsZSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiAoaXNQYWdlRW5hYmxlZCkKLQkJewotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUgJiAhbXVsdGlwbGVTZWxlY3Rpb24pOwotCQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyB2b2lkIHNldFBhZ2VFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeyBpc1BhZ2VFbmFibGVkID0gZW5hYmxlZDsKLQkgKiAKLQkgKiB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChpc1BhZ2VFbmFibGVkKTsKLQkgKiAKLQkgKiBuZXdCdXR0b24uc2V0RW5hYmxlZChpc1BhZ2VFbmFibGVkKTsKLQkgKiBlZGl0QnV0dG9uLnNldEVuYWJsZWQoaXNQYWdlRW5hYmxlZCk7Ci0JICogZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoaXNQYWdlRW5hYmxlZCk7IH0KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVQYWdlKCkgewotCQlyZWZyZXNoKCk7Ci0JCXVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpOwotCX0KLQotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5N2ExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotCi0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyB7Ci0JcHJvdGVjdGVkIFRleHQgZGV0YWlsc1RleHQ7Ci0JcHJvdGVjdGVkIFNjcm9sbEJhciB2ZXJ0aWNhbFNjcm9sbCwgaG9yaXpvbnRhbFNjcm9sbDsKLQotCXB1YmxpYyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbG9yIGNvbG9yID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQotCQlkZXRhaWxzVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhlaWdodEhpbnQgPSA4NTsKLQkJZGV0YWlsc1RleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl2ZXJ0aWNhbFNjcm9sbCA9IGRldGFpbHNUZXh0LmdldFZlcnRpY2FsQmFyKCk7Ci0JCS8vIHZlcnRpY2FsU2Nyb2xsLnNldFZpc2libGUoZmFsc2UpOwotCQlob3Jpem9udGFsU2Nyb2xsID0gZGV0YWlsc1RleHQuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlkZXRhaWxzVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWRldGFpbHNUZXh0LnNldEJhY2tncm91bmQoY29sb3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGFsb2dFbGVtZW50KElDYXRhbG9nRW50cnkgZW50cnkpIHsKLQkJaWYgKGVudHJ5ID09IG51bGwpIHsKLQkJCWRldGFpbHNUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgdmFsdWUgPSBnZXREaXNwbGF5VmFsdWUoZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldFVSSSgpIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lMSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX1VSSV9DT0xPTiArICJcdFx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGxpbmUwOwotCQlpZiAodmFsdWUuc3RhcnRzV2l0aCgiamFyOmZpbGU6IikpIHsKLQkJCVN0cmluZyBqYXJGaWxlID0gVVJJVXRpbHMuY29udmVydFVSSVRvTG9jYXRpb24oVVJJSGVscGVyLmVuc3VyZVVSSVByb3RvY29sRm9ybWF0KHZhbHVlLnN1YnN0cmluZygiamFyOiIubGVuZ3RoKCksIHZhbHVlLmluZGV4T2YoJyEnKSkpKTsKLQkJCVN0cmluZyBpbnRlcm5hbEZpbGUgPSBVUklVdGlscy5jb252ZXJ0VVJJVG9Mb2NhdGlvbihVUklIZWxwZXIuZW5zdXJlVVJJUHJvdG9jb2xGb3JtYXQoImZpbGU6Ly8iICsgdmFsdWUuc3Vic3RyaW5nKHZhbHVlLmluZGV4T2YoJyEnKSArIDEpKSk7Ci0JCQlsaW5lMCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX1VSSV9MT0NBVElPTiArICJcdCIgKyBpbnRlcm5hbEZpbGUgKyAiICIgKyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19JTl9KQVJfRklMRSArICIgIiArIGphckZpbGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZSA9IFVSSVV0aWxzLmNvbnZlcnRVUklUb0xvY2F0aW9uKHZhbHVlKTsKLQkJCWxpbmUwID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFVEFJTFNfVVJJX0xPQ0FUSU9OICsgIlx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCXZhbHVlID0gZW50cnkgIT0gbnVsbCA/IGdldEtleVR5cGVWYWx1ZShlbnRyeSkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTIgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVUQUlMU19DT0xPTiArICJcdCIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotCi0JCXZhbHVlID0gZ2V0RGlzcGxheVZhbHVlKGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRLZXkoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTMgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19LRVlfQ09MT04gKyAiXHRcdCIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBlbnRpcmVTdHJpbmcgPSAiXG4iICsgbGluZTAgKyAiXG4iICsgbGluZTEgKyAiXG4iICsgbGluZTIgKyAiXG4iICsgbGluZTM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWRldGFpbHNUZXh0LnNldFRleHQoZW50aXJlU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRWxlbWVudChJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cpIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0RGlzcGxheVZhbHVlKG5leHRDYXRhbG9nICE9IG51bGwgPyBuZXh0Q2F0YWxvZy5nZXRDYXRhbG9nTG9jYXRpb24oKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTEgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19VUklfQ09MT04gKyAiXHRcdCIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBsaW5lMCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX1VSSV9MT0NBVElPTiArICJcdCIgKyBVUklVdGlscy5jb252ZXJ0VVJJVG9Mb2NhdGlvbih2YWx1ZSk7Ci0KLQkJU3RyaW5nIGVudGlyZVN0cmluZyA9ICJcbiIgKyBsaW5lMCArICJcbiIgKyBsaW5lMTsgLy8kTk9OLU5MUy0xJAotCQlkZXRhaWxzVGV4dC5zZXRUZXh0KGVudGlyZVN0cmluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5VHlwZVZhbHVlKElDYXRhbG9nRW50cnkgZW50cnkpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmICgoZW50cnkuZ2V0VVJJKCkgIT0gbnVsbCkgJiYgZW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoInhzZCIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJlc3VsdCA9IChlbnRyeS5nZXRFbnRyeVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJKSA/IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfUFVCTElDIDogWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1hTRF9TWVNURU07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5VHlwZSgpKSB7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDIDoKLQkJCQkJcmVzdWx0ID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUM7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSA6Ci0JCQkJCXJlc3VsdCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfU1lTVEVNOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmVzdWx0ID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0ZpbGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dGaWxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWRiNzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0ZpbGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIFhNTENhdGFsb2dGaWxlVHlwZSB7Ci0JcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwdWJsaWMgTGlzdCBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCXB1YmxpYyBTdHJpbmcgaWNvbkZpbGVOYW1lOwotCXB1YmxpYyBJbWFnZSBpY29uOwotCi0JcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9ucyhTdHJpbmcgY29udHJpYnV0ZWRFeHRlbnNpb25zKSB7Ci0JCUxpc3QgbGlzdCA9IHBhcnNlRXh0ZW5zaW9ucyhjb250cmlidXRlZEV4dGVuc2lvbnMpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJaWYgKCFleHRlbnNpb25zLmNvbnRhaW5zKGV4dGVuc2lvbikpIHsKLQkJCQlleHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgcGFyc2VFeHRlbnNpb25zKFN0cmluZyBzdHJpbmcpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nLCAiLCAiKTsgc3QuaGFzTW9yZVRva2VucygpOykgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKTsKLQkJCWlmICh0b2tlbiAhPSBudWxsKSB7Ci0JCQkJbGlzdC5hZGQodG9rZW4pOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzdjMTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIEVkaXRvcgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XSVpBUkRfU0NIRU1BX0FORF9OQU1FX1NQQUNFX0lORk87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTkFNRV9TUEFDRV9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTkFNRV9TUEFDRV9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfWFNEX0xPQ0FUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1lTVEVNX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1BVQkxJQ19JRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TRUxFQ1RfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9LRVk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfS0VZX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFNfS0VZX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFNfSU5fSkFSX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfVVJJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0xPQ0FUSU9OX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0NBVEFMT0dfVVJJX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFNfVVJJX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFNfVVJJX0xPQ0FUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0RFVEFJTFNfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1BVQkxJQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfU1lTVEVNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1BFQ0lGWV9BTFRFUk5BVElWRV9XRUJfVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfVVJJX01VU1RfTk9UX0hBVkVfRE9UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9GSUxFX1NFTEVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DSE9PU0VfRklMRV9UT19BRERfVE9fQ0FUQUxPRzsKLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9MT05HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfSU5WQUxJRF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfSU5WQUxJRF9GSUxFX0xPTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19OT19FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfTk9fRUxFTUVOVF9EVERfTE9ORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX05PX0VMRU1FTlRfWFNEX0xPTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19TSE9VTERfQkVfRlVMTFlfUVVBTElGSUVEX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX0RVUExJQ0FURV9FTlRSWTsKLQotCi0JLy8gTmV3TW9kZWxXaXphcmQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9JTlZBTElEX0dSQU1NQVJfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0JST1dTRTsKLQotCS8vIFhNTENhdGFsb2dJZE1hcHBpbmdQYWdlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTUFQX1RPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX01BUF9GUk9NOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9ORVc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0VESVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fUkVNT1ZFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX05FV19ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRURJVF9ESUFMT0dfVElUTEU7Ci0KLQotCS8vIFhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1VTRVJfRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9VU0VSX0VOVFJJRVNfVE9PTF9USVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVNfVE9PTF9USVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0NIQU5HRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TRUxFQ1RfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TUEVDSUZZX1BST0pFQ1RfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19OT19QUk9KRUNUU19DUkVBVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfUFJPSkVDVF9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfUFJPSkVDVF9ET0VTX05PVF9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9QUk9KRUNUX1RPX1VTRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DQVRBTE9HX1NBVkVfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQ0FUQUxPR19DT1VMRF9OT1RfQkVfU0FWRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQURWQU5DRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQURWQU5DRURfWE1MX0NBVEFMT0dfUFJFRlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1BFQ0lGWV9QRVJTSVNURU5DRV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NBVkVfQ0FUQUxPR19ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU0FWRV9DQVRBTE9HX0RJQUxPR19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0JST1dTRV9DQVRBTE9HX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfVVNFUl9TUEVDSUZJRURfRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9QTFVHSU5fU1BFQ0lGSUVEX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfUExBVEZPUk1fUkVTT1VSQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRklMRV9TWVNURU1fUkVTT1VSQ0U7Ci0JLy8gQWR2YW5jZWRPcHRpb25zRGlhbG9nCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0lNUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fRVhQT1JUOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9JTVBPUlRfRElBTE9HX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19NRVNTQUdFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9FWFBPUlRfRElBTE9HX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1NBVklOR19GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0ZJTEVfSVNfUkVBRF9PTkxZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RJQUxPR19ERVNDUklQVElPTjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRDYXRhbG9nRW50cnlEaWFsb2dfY2F0YWxvZ0VudHJ5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdENhdGFsb2dFbnRyeURpYWxvZ19uZXh0Q2F0YWxvZ0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX01FTlVfQlJPV1NFX0ZJTEVfU1lTVEVNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1RFWFRfU0VMRUNUX0ZJTEVfRklMVEVSX0NPTlRST0w7Ci0KLQotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTENhdGFsb2dNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxDYXRhbG9nTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTZlMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyL1NUQVIgU3RhbmRhcmQgLSBkX2FfY2FydmVyQHlhaG9vLmNvbSAtIGJ1ZyAxOTI1NjgKLSAqICAgICAgICAgICAgUmVtb3ZlZCBBZHZhbmNlZCBidXR0b24gLSBGdW5jdGlvbmFsaXR5IGlzIG5vdyBpbiB0aGUKLSAqICAgICAgICAgICAgSW1wb3J0L0V4cG9ydCBYTUwgQ2F0YWxvZyBXaXphcmRzLiAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIElDYXRhbG9nTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dFbnRyaWVzVmlldyBjYXRhbG9nRW50cmllc1ZpZXc7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nOwotCi0JcHJvdGVjdGVkIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2cgdXNlckNhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2cgZGVmYXVsdENhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGFkdmFuY2VkQnV0dG9uOwotCi0JcHVibGljIFhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspIHsKLQkJCUlOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotCQkJSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQlpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkgewotCQkJCWlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQlzeXN0ZW1DYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQl1c2VyQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJd29ya2luZ1VzZXJDYXRhbG9nLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIHZpZXcgaW4gcmVzcG9uY2UgdG8gYW4gZXZlbnQgc2VudCBieSB0aGUgQ2F0YWxvZwotCSAqLwotCXB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKElDYXRhbG9nRXZlbnQgZXZlbnQpIHsKLQkJY2F0YWxvZ0VudHJpZXNWaWV3LnVwZGF0ZVBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyBvbiBkZW1hbmQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBmb3IgdGhlIHByZWZlcmVuY2UgcGFnZQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gd2UgY3JlYXRlIGEgd29ya2luZyBjb3B5IG9mIHRoZSAnVXNlciBTZXR0aW5ncycgZm9yIHRoZSBDYXRhbG9nCi0JCS8vIHRoYXQgd2UgY2FuIG1vZGlmeQotCQlDYXRhbG9nU2V0IHRlbXBDYXRhbG9nU2V0ID0gbmV3IENhdGFsb2dTZXQoKTsKLQkJd29ya2luZ1VzZXJDYXRhbG9nID0gdGVtcENhdGFsb2dTZXQubG9va3VwT3JDcmVhdGVDYXRhbG9nKCJ3b3JraW5nIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBUT0RPOiBhZGQgZW50cmllcyBmcm9tIHRoZSBuZXN0ZWQgY2F0YWxvZ3MgYXMgd2VsbAotCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHVzZXJDYXRhbG9nKTsKLQkJd29ya2luZ1VzZXJDYXRhbG9nLmFkZExpc3RlbmVyKHRoaXMpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXBvc2l0ZSwgbmV3Ci0JCS8vIENvbnRyb2xDb250ZXh0Q29tcHV0ZXIoY29tcG9zaXRlLAotCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0NBVEFMT0dfUEFHRSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNyZWF0ZUNhdGFsb2dFbnRyaWVzVmlldyhjb21wb3NpdGUpOwotCQljcmVhdGVDYXRhbG9nRGV0YWlsc1ZpZXcoY29tcG9zaXRlKTsKLQkJLy9jcmVhdGVBZHZhbmNlZEJ1dHRvbihjb21wb3NpdGUpOwotCQkvLyBjYXRhbG9nRW50cmllc1ZpZXcudXBkYXRlUGFnZSgpOwotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFkdmFuY2VkQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJcGFuZWwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJLy8gVE9ETy4uLiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZXhwYW5kIHRoZSBwYWdlIHdpZHRoPwotCQkvLyBUaGlzIGludmlzaWJsZSBsYWJlbCBpcyBjcmVhdGVkIHRvIGZvcmNlIHRoZSB3aWR0aCBvZiB0aGUgcGFnZSB0bwotCQkvLyBiZQotCQkvLyB3aWRlIGVub3VnaCB0byBzaG93Ci0JCS8vIHRoZSByYXRoZXIgbG9uZyB1cmkgYW5kIGtleSBmaWVsZHMgb2YgYSBjYXRhbG9nIGVudHJ5LgotCQlMYWJlbCB3aWR0aEZ1ZGdlciA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5PTkUpOwotCQlTdHJpbmcgd2lkdGhGdWRnZXJTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IDU1OyBpKyspIHsKLQkJCXdpZHRoRnVkZ2VyU3RyaW5nICs9ICJ4IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXdpZHRoRnVkZ2VyLnNldFRleHQod2lkdGhGdWRnZXJTdHJpbmcpOwotCQl3aWR0aEZ1ZGdlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJQ29tcG9zaXRlIHBsYWNlSG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYW5lbCwgU1dULk5PTkUpOwotCQlwbGFjZUhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJYWR2YW5jZWRCdXR0b24gPSBuZXcgQnV0dG9uKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCWFkdmFuY2VkQnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0FEVkFOQ0VEKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlBZHZhbmNlZE9wdGlvbnNEaWFsb2cgZGlhbG9nID0gbmV3IEFkdmFuY2VkT3B0aW9uc0RpYWxvZyhnZXRTaGVsbCgpLCB3b3JraW5nVXNlckNhdGFsb2cpOwotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9BRFZBTkNFRF9YTUxfQ0FUQUxPR19QUkVGUyk7Ci0JCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFkdmFuY2VkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhbWVGaWxlTmFtZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKChhICE9IG51bGwpICYmIChiICE9IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSBhLmVxdWFscyhiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNhdGFsb2dFbnRyaWVzVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlncm91cC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9VU0VSX0VOVFJJRVMpOwotCQlncm91cC5zZXRUb29sVGlwVGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfVVNFUl9FTlRSSUVTX1RPT0xfVElQKTsKLQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKHVzZXJFbnRyaWVzR3JvdXAsIG5ldwotCQkvLyBDb250cm9sQ29udGV4dENvbXB1dGVyKHVzZXJFbnRyaWVzR3JvdXAsCi0JCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfQ0FUQUxPR19VU0VSX0dST1VQKSk7Ci0JCWNhdGFsb2dFbnRyaWVzVmlldyA9IG5ldyBYTUxDYXRhbG9nRW50cmllc1ZpZXcoZ3JvdXAsIHdvcmtpbmdVc2VyQ2F0YWxvZywgc3lzdGVtQ2F0YWxvZyk7Ci0JCWNhdGFsb2dFbnRyaWVzVmlldy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRhbG9nRGV0YWlsc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBkZXRhaWxzR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWRldGFpbHNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGV0YWlsc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZGV0YWlsc0dyb3VwLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFVEFJTFMpOwotCQlmaW5hbCBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyBkZXRhaWxzVmlldyA9IG5ldyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyhkZXRhaWxzR3JvdXApOwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnNpemUoKSA9PSAxID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotCQkJCQlkZXRhaWxzVmlldy5zZXRDYXRhbG9nRWxlbWVudChlbnRyeSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSU5leHRDYXRhbG9nKSB7Ci0JCQkJCUlOZXh0Q2F0YWxvZyBlbnRyeSA9IChJTmV4dENhdGFsb2cpIHNlbGVjdGVkT2JqZWN0OwotCQkJCQlkZXRhaWxzVmlldy5zZXRDYXRhbG9nRWxlbWVudChlbnRyeSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZXRhaWxzVmlldy5zZXRDYXRhbG9nRWxlbWVudCgoSUNhdGFsb2dFbnRyeSkgbnVsbCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX07Ci0JCWNhdGFsb2dFbnRyaWVzVmlldy5nZXRWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlyZXR1cm4gc3RvcmVWYWx1ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3RvcmVWYWx1ZXMoKSB7Ci0JCS8vIGR3IE9iamVjdCBmaWxlT2JqZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHVwZGF0ZSB0aGUgdXNlckNhdGFsb2cgc28gdGhhdCBpdHMgdGhlIHNhbWUgYXMgdGhlIHdvcmtpbmcKLQkJCS8vIGNhdGFsb2cKLQkJCXVzZXJDYXRhbG9nLmNsZWFyKCk7Ci0JCQkvLyBUT0RPIGFkZCBlbnRyaWVzIGZyb20gdGhlIG5lc3RlZCBjYXRhbG9ncz8KLQkJCXVzZXJDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyh3b3JraW5nVXNlckNhdGFsb2cpOwotCQkJLy8gbm93IHNhdmUgdGhlIHVzZXJDYXRhbG9nCi0JCQl1c2VyQ2F0YWxvZy5zYXZlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTBkNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgRGF2aWQgQ2FydmVyL1NUQVIgU3RhbmRhcmQsIGRfYV9jYXJ2ZXJAeWFob28uY29tLCBidWcgMTkyNTY4Ci0jICAgICAgICAtIEZpeGVkIGdyYW1tYXIgaW4gWE1MIENhdGFsb2cgSW1wb3J0IGRpYWxvZy4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVVJX1dJWkFSRF9TQ0hFTUFfQU5EX05BTUVfU1BBQ0VfSU5GTyA9IFNjaGVtYSBhbmQgTmFtZXNwYWNlIEluZm9ybWF0aW9uCi1VSV9MQUJFTF9OQU1FX1NQQUNFX1BSRUZJWCAgICAgICAgICAgPSBOYW1lc3BhY2UgcHJlZml4OgotVUlfTEFCRUxfTkFNRV9TUEFDRV9VUkkgICAgICAgICAgICAgID0gTmFtZXNwYWNlIFVSSToKLVVJX0xBQkVMX1hTRF9MT0NBVElPTiAgICAgICAgICAgICAgICA9IFNjaGVtYSBsb2NhdGlvbjoKLVVJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT04gICAgICAgICA9IERvY3VtZW50IHR5cGUgaW5mb3JtYXRpb24KLVVJX0xBQkVMX1NZU1RFTV9JRCAgICAgICAgICAgICAgICAgICA9ICZTeXN0ZW0gSUQ6Ci1VSV9MQUJFTF9QVUJMSUNfSUQgICAgICAgICAgICAgICAgICAgPSAmUHVibGljIElEOgotVUlfTEFCRUxfU0VMRUNUX0ZJTEUgICAgICAgICAgICAgICAgID0gU2VsZWN0IEZpbGUKLVVJX0xBQkVMX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICA9IEtleQotVUlfTEFCRUxfS0VZX0NPTE9OICAgICAgICAgICAgICAgICAgID0gJktleToKLVVJX0xBQkVMX0RFVEFJTFNfS0VZX0NPTE9OICAgICAgICAgICA9IEtleToKLVVJX0xBQkVMX0RFVEFJTFNfSU5fSkFSX0ZJTEUJCSA9IGluIGphciBmaWxlCi1VSV9MQUJFTF9VUkkgICAgICAgICAgICAgICAgICAgICAgICAgPSBVUkkKLVVJX0xBQkVMX0xPQ0FUSU9OX0NPTE9OICAgICAgICAgICAgICA9ICZMb2NhdGlvbjogIAotVUlfTEFCRUxfQ0FUQUxPR19VUklfQ09MT04JCSAgICAgID0gTG9jYXRpb24gb2YgYW5vdGhlciBYTUwgQ2F0YWxvZyBmaWxlOgotVUlfTEFCRUxfREVUQUlMU19VUklfQ09MT04gICAgICAgICAgID0gVVJJOiAgIAotVUlfS0VZX1RZUEVfQ09MT04gICAgICAgICAgICAgICAgICAgID0gS2V5ICZUeXBlOgotVUlfS0VZX1RZUEVfREVUQUlMU19DT0xPTiAgICAgICAgICAgID0gS2V5IFR5cGU6Ci1VSV9MQUJFTF9ERVRBSUxTX1VSSV9MT0NBVElPTiAgICAgICAgPSBMb2NhdGlvbjoKLVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1hTRF9QVUJMSUMgICA9IE5hbWVzcGFjZSBOYW1lCi1VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfU1lTVEVNICAgPSBTY2hlbWEgTG9jYXRpb24KLVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUMgICA9IFB1YmxpYyBJRAotVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTSAgID0gU3lzdGVtIElECi1VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkkgICAJCSAgPSBVUkkKLVVJX0xBQkVMX1NQRUNJRllfQUxURVJOQVRJVkVfV0VCX1VSTCA9IFNwZWNpZnkgJmFsdGVybmF0aXZlIHdlYiBhZGRyZXNzCi1VSV9XQVJOSU5HX1VSSV9NVVNUX05PVF9IQVZFX0RPVFMgICAgPSBVUkkgbXVzdCBub3QgaW5jbHVkZWQgJy4nIG9yICcuLicKLVVJX0xBQkVMX1BMQVRGT1JNX1JFU09VUkNFIAkJIAkgPSBXb3Jrc3BhY2UKLVVJX0xBQkVMX0ZJTEVfU1lTVEVNX1JFU09VUkNFCQkgPSBGaWxlIFN5c3RlbQotCi1VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gICAgICAgPSBUaGUgc3BlY2lmaWVkIHJlc291cmNlIGNhbid0IGJlIGxvY2F0ZWQgOgotVUlfV0FSTklOR19TSE9VTERfQkVfRlVMTFlfUVVBTElGSUVEX1VSSSA9IFdhcm5pbmc6IHRoZSBrZXkgdmFsdWUgc2hvdWxkIGJlIGEgZnVsbHkgcXVhbGlmaWVkIFVSSQotVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0xPTkcgICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIGNhbm5vdCBiZSBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBtb3ZlZCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbi4gSWYgdGhlIGZpbGUgaXMgbG9jYXRlZCByZW1vdGVseSwgYSBuZXR3b3JrIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkIHRvIHRoZSByZW1vdGUgbG9jYXRpb24uIAotVUlfV0FSTklOR19JTlZBTElEX0ZJTEUgICAgICAgICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIGlzIGludmFsaWQuCi1VSV9XQVJOSU5HX0lOVkFMSURfRklMRV9MT05HICAgICAgICAgPSBUaGUgc3BlY2lmaWVkIGZpbGUgaXMgaW52YWxpZC4gQSBwcm9wZXIgWE1MIGZpbGUgY2Fubm90IGJlIGdlbmVyYXRlZCBmcm9tIGl0LiBPcGVuIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBlZGl0IGl0IGFzIG5lY2Vzc2FyeSwgdmFsaWRhdGUgaXQgYW5kIHRyeSBhZ2Fpbi4KLVVJX1dBUk5JTkdfTk9fRUxFTUVOVCAgICAgICAgICAgICAgICA9IFRoZSBzcGVjaWZpZWQgZmlsZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVsZW1lbnQgZGVjbGFyYXRpb24uCi1VSV9XQVJOSU5HX05PX0VMRU1FTlRfRFREX0xPTkcgICAgICAgPSBUaGUgc3BlY2lmaWVkIGZpbGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIHJvb3QgZWxlbWVudCBpbiB0aGUgZ2VuZXJhdGVkIFhNTCBmaWxlLgotVUlfV0FSTklOR19OT19FTEVNRU5UX1hTRF9MT05HICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgcm9vdCBlbGVtZW50IGluIHRoZSBnZW5lcmF0ZWQgWE1MIGZpbGUuCi1VSV9XQVJOSU5HX0RVUExJQ0FURV9FTlRSWQkJCSA9IFRoZSBzcGVjaWZpZWQgZW50cnkgaXMgaW52YWxpZC4gQW4gZXhpc3RpbmcgZW50cnkgaGFzIHRoZSBzYW1lIGtleSBhbmQga2V5IHR5cGUuCi0KLQotIU5ld01vZGVsV2l6YXJkCi1VSV9JTlZBTElEX0dSQU1NQVJfRVJST1IgICAgICAgICAgICAgPSBJbnZhbGlkIEdyYW1tYXIKLVVJX0JVVFRPTl9CUk9XU0UgICAgICAgICAgICAgICAgICAgICA9ICZCcm93c2UuLi4KLQotIVhNTENhdGFsb2dJZE1hcHBpbmdQYWdlCi1VSV9MQUJFTF9NQVBfVE8gICAgICAgICAgICAgICAgICAgICAgPSBNYXAgdG86Ci1VSV9MQUJFTF9NQVBfRlJPTSAgICAgICAgICAgICAgICAgICAgPSBNYXAgZnJvbToKLVVJX0JVVFRPTl9ORVcgICAgICAgICAgICAgICAgICAgICAgICA9ICZBZGQuLi4KLVVJX0JVVFRPTl9FRElUICAgICAgICAgICAgICAgICAgICAgICA9ICZFZGl0Li4uCi1VSV9CVVRUT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgPSAmRGVsZXRlCi1VSV9CVVRUT05fUkVNT1ZFICAgICAgICAgICAgICAgICAgICAgPSAmUmVtb3ZlCi1VSV9MQUJFTF9ORVdfRElBTE9HX1RJVExFICAgICAgICAgICAgPSBBZGQgWE1MIENhdGFsb2cgRW50cnkKLVVJX0xBQkVMX0VESVRfRElBTE9HX1RJVExFICAgICAgICAgICA9IEVkaXQgWE1MIENhdGFsb2cgRW50cnkKLQotCi0hWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlCi1VSV9MQUJFTF9VU0VSX0VOVFJJRVMgICAgICAgICAgICAgICAgPSBYTUwgQ2F0YWxvZyBFbnRyaWVzCi1VSV9MQUJFTF9VU0VSX0VOVFJJRVNfVE9PTF9USVAgICAgICAgPSBYTUwgQ2F0YWxvZyBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZCBieSB0aGUgdXNlcgotVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVMgICAgICAgICAgICAgID0gUGx1Zy1pbiBzcGVjaWZpZWQgZW50cmllcwotVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVNfVE9PTF9USVAgICAgID0gWE1MIENhdGFsb2cgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgYnkgYSBwbHVnLWluCi1VSV9CVVRUT05fQ0hBTkdFICAgICAgICAgICAgICAgICAgICAgPSBDaGFuZ2UuLi4KLVVJX0xBQkVMX1NFTEVDVF9QUk9KRUNUICAgICAgICAgICAgICA9IFNlbGVjdCBQcm9qZWN0Ci1VSV9MQUJFTF9TUEVDSUZZX1BST0pFQ1RfREVTQ1JJUFRJT04gPSBTcGVjaWZ5IHRoZSBwcm9qZWN0IHRvIHBlcnNpc3QgdGhlIFhNTCBDYXRhbG9nIGluZm9ybWF0aW9uCi1VSV9XQVJOSU5HX05PX1BST0pFQ1RTX0NSRUFURUQgICAgICAgPSBObyBwcm9qZWN0cyBoYXZlIGJlZW4gY3JlYXRlZCB5ZXQuCi1VSV9XQVJOSU5HX1BST0pFQ1RfTk9UX1NQRUNJRklFRCAgICAgPSBBIHByb2plY3QgbmFtZSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLgotVUlfV0FSTklOR19QUk9KRUNUX0RPRVNfTk9UX0VYSVNUICAgID0gVGhlIHNwZWNpZmllZCBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LgotVUlfTEFCRUxfUFJPSkVDVF9UT19VU0UgICAgICAgICAgICAgID0gUHJvamVjdCB0byB1c2UgdG8gcGVyc2lzdCBYTUwgQ2F0YWxvZyBVc2VyIEVudHJpZXM6IAotVUlfTEFCRUxfQ0FUQUxPR19TQVZFX0VSUk9SICAgICAgICAgID0gWE1MIENhdGFsb2cgU2F2ZSBFcnJvcgotVUlfTEFCRUxfQ0FUQUxPR19DT1VMRF9OT1RfQkVfU0FWRUQgID0gVGhlIFhNTCBDYXRhbG9nIGVudHJ5IGNvdWxkIG5vdCBiZSBzYXZlZC4KLVVJX0xBQkVMX0FEVkFOQ0VEICAgICAgICAgICAgICAgICAgICA9ICZBZHZhbmNlZC4uLgotVUlfTEFCRUxfQURWQU5DRURfWE1MX0NBVEFMT0dfUFJFRlMgID0gQWR2YW5jZWQgWE1MIENhdGFsb2cgUHJlZmVyZW5jZXMgICAKLVVJX0xBQkVMX1NQRUNJRllfUEVSU0lTVEVOQ0VfRklMRSAgICA9ICZTcGVjaWZ5IGEgZmlsZSB0byB1c2UgdG8gcGVyc2lzdCB0aGUgWE1MIENhdGFsb2cgaW5mb3JtYXRpb24uCi1VSV9MQUJFTF9TQVZFX0NBVEFMT0dfRElBTE9HX1RJVExFICAgPSBTYXZlIENoYW5nZXMKLVVJX0xBQkVMX1NBVkVfQ0FUQUxPR19ESUFMT0dfREVTQyAgICA9IFlvdSBoYXZlIG1hZGUgdW5zYXZlZCBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IFhNTCBDYXRhbG9nIHNldHRpbmdzLiBEbyB5b3Ugd2lzaCB0byBzYXZlIHlvdXIgY2hhbmdlcyBiZWZvcmUgbG9hZGluZyB0aGUgbmV3IFhNTCBDYXRhbG9nIHNldHRpbmdzPyAgIAotVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9USVRMRSAgID0gU2VsZWN0IEZvbGRlcgotVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9ERVNDICAgID0gU2VsZWN0IHRoZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgJy54bWxjYXRhbG9nJyBmaWxlLiAgIAotVUlfTEFCRUxfREVUQUlMUyAgICAgICAgICAgICAgICAgICAgID0gRGV0YWlscwotVUlfTEFCRUxfVVNFUl9TUEVDSUZJRURfRU5UUklFUyAgICAgID0gVXNlciBTcGVjaWZpZWQgRW50cmllcwotVUlfTEFCRUxfUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTICAgID0gUGx1Z2luIFNwZWNpZmllZCBFbnRyaWVzCi1VSV9MQUJFTF9GSUxFX1NFTEVDVElPTgkJCQkgPSBGaWxlIFNlbGVjdGlvbgotVUlfTEFCRUxfQ0hPT1NFX0ZJTEVfVE9fQUREX1RPX0NBVEFMT0cJCQkJID0gQ2hvb3NlIGEgZmlsZSB0byBhZGQgdG8gdGhlIFhNTCBDYXRhbG9nCi0gCi0hQWR2YW5jZWRPcHRpb25zRGlhbG9nCi1VSV9MQUJFTF9ESUFMT0dfREVTQ1JJUFRJT04gICAgICAgICAgPSBVc2UgdGhlIGJ1dHRvbnMgYmVsb3cgdG8gaW1wb3J0IG9yIGV4cG9ydCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4KLVVJX0JVVFRPTl9JTVBPUlQgICAgICAgICAgICAgICAgICAgICA9IEltcG9ydC4uLgotVUlfQlVUVE9OX0VYUE9SVCAgICAgICAgICAgICAgICAgICAgID0gRXhwb3J0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19USVRMRSAgICAgICAgID0gSW1wb3J0IFhNTCBDYXRhbG9nIFNldHRpbmdzCi1VSV9MQUJFTF9JTVBPUlRfRElBTE9HX0hFQURJTkcgICAgICAgPSBTcGVjaWZ5IFhNTCBDYXRhbG9nIEZpbGUKLVVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfTUVTU0FHRSAgICAgICA9IFNwZWNpZnkgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbG9hZCB0aGUgWE1MIENhdGFsb2cgU2V0dGluZ3MKLQotVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19USVRMRSAgICAgICAgID0gRXhwb3J0IFhNTCBDYXRhbG9nIFNldHRpbmdzCi1VSV9MQUJFTF9FWFBPUlRfRElBTE9HX0hFQURJTkcgICAgICAgPSBTcGVjaWZ5IFhNTCBDYXRhbG9nIEZpbGUKLVVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfTUVTU0FHRSAgICAgICA9IFNwZWNpZnkgdGhlIGZpbGUgdGhhdCB3aWxsIHVzZWQgdG8gc2F2ZSB0aGUgWE1MIENhdGFsb2cgU2V0dGluZwotRVJST1JfU0FWSU5HX0ZJTEUJCQkJCSA9IEVycm9yIHNhdmluZyBmaWxlICUxCi1VSV9MQUJFTF9GSUxFX0lTX1JFQURfT05MWSAgICAgICAgICAgPSBGaWxlICUxIGlzIHJlYWQgb25seQotCi1FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX2NhdGFsb2dFbnRyeUxhYmVsPUNhdGFsb2cgRW50cnkKLUVkaXRDYXRhbG9nRW50cnlEaWFsb2dfbmV4dENhdGFsb2dMYWJlbD1OZXh0IENhdGFsb2cKLVVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0U9V29ya3NwYWNlLi4uCi1VSV9CVVRUT05fTUVOVV9CUk9XU0VfRklMRV9TWVNURU09RmlsZSBTeXN0ZW0uLi4KLVVJX0xBQkVMX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MPUZpbGVzIG9mIHR5cGU6Ci1VSV9URVhUX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MPUFsbCBTdXBwb3J0ZWQgRmlsZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkNDk1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIgZXh0ZW5kcyBUcmVlVmlld2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHhtbENhdGFsb2dJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYveG1sY2F0YWxvZ19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVycm9ySW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL292cjE2L2Vycm9yLW92ZXJsYXkuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVudHJ5SW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL29iajE2L2VudHJ5X29iai5wbmciKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgbmV4dENhdGFsb2dJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvbmV4dENhdGFsb2dfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBFUlJPUl9TVEFURV9LRVkgPSAiZXJyb3JzdGF0ZWtleSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJQ2F0YWxvZyBmV29ya2luZ1VzZXJDYXRhbG9nOwotCXByb3RlY3RlZCBJQ2F0YWxvZyBmU3lzdGVtQ2F0YWxvZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VTRVJfU1BFQ0lGSUVEX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9QTFVHSU5fU1BFQ0lGSUVEX0VOVFJJRVM7Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nLCBJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXRoaXMuZldvcmtpbmdVc2VyQ2F0YWxvZyA9IHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQkJdGhpcy5mU3lzdGVtQ2F0YWxvZyA9IHN5c3RlbUNhdGFsb2c7Ci0KLQkJc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldExhYmVsUHJvdmlkZXIobmV3IENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXJlc2V0RmlsdGVycygpOwotCQlhZGRGaWx0ZXIobmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JfQotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJvdGVjdGVkIEhhc2hNYXAgaW1hZ2VUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBvYmplY3Q7Ci0JCQkJcmVzdWx0ID0gY2F0YWxvZ0VudHJ5LmdldEtleSgpOwotCQkJCS8vIHJlc3VsdCA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wocmVzdWx0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElOZXh0Q2F0YWxvZykgewotCQkJCUlOZXh0Q2F0YWxvZyBuZXh0Q2F0YWxvZyA9IChJTmV4dENhdGFsb2cpIG9iamVjdDsKLQkJCQkvLyByZXN1bHQgPSBuZXh0Q2F0YWxvZy5nZXRDYXRhbG9nTG9jYXRpb24oKTsKLQkJCQlyZXN1bHQgPSBVUklVdGlscy5jb252ZXJ0VVJJVG9Mb2NhdGlvbihuZXh0Q2F0YWxvZy5nZXRDYXRhbG9nTG9jYXRpb24oKSk7Ci0JCQkJaWYgKG5leHRDYXRhbG9nLmdldENhdGFsb2dMb2NhdGlvbigpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKLQkJCQkJcmVzdWx0ICs9ICIgKCIgKyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRklMRV9TWVNURU1fUkVTT1VSQ0UgKyAiKSI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5leHRDYXRhbG9nLmdldENhdGFsb2dMb2NhdGlvbigpLnN0YXJ0c1dpdGgoInBsYXRmb3JtOiIpKSB7Ci0JCQkJCXJlc3VsdCArPSAiICgiICsgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1BMQVRGT1JNX1JFU09VUkNFICsgIikiOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IG9iamVjdC50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlJbWFnZSBiYXNlID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlyZXN1bHQgPSB4bWxDYXRhbG9nSW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgb2JqZWN0OwotCQkJCVN0cmluZyB1cmkgPSBjYXRhbG9nRW50cnkuZ2V0VVJJKCk7Ci0JCQkJSUVkaXRvclJlZ2lzdHJ5IGVyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBlci5nZXRJbWFnZURlc2NyaXB0b3IodXJpKTsKLQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaW1hZ2VUYWJsZS5nZXQoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQlpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQkJCQlpbWFnZVRhYmxlLnB1dChpbWFnZURlc2NyaXB0b3IsIGltYWdlKTsKLQkJCQl9Ci0JCQkJYmFzZSA9IGltYWdlOwotCi0JCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCQlpZiAoVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCB0cnVlKSkgewotCQkJCQkJcmVzdWx0ID0gYmFzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3VsdCA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVJbWFnZShiYXNlLCBlcnJvckltYWdlLCBJbWFnZUZhY3RvcnkuQk9UVE9NX0xFRlQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSU5leHRDYXRhbG9nKSB7Ci0JCQkJLy8gVE9ETzogYWRkIGltYWdlIHRvIHRoZSBpbWFnZVRhYmxlIGFuZCBhZGQgZXJyb3Igb3ZlcmxheSBpZgotCQkJCS8vIG5leHQgY2F0YWxvZyBVUkkgaXMgbm90IHJlYWRhYmxlCi0JCQkJcmVzdWx0ID0gbmV4dENhdGFsb2dJbWFnZTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGltYWdlVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCSgoSW1hZ2UpIGl0Lm5leHQoKSkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwcm90ZWN0ZWQgT2JqZWN0W10gcm9vdHM7Ci0KLQkJcHVibGljIENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCXJvb3RzID0gbmV3IE9iamVjdFsyXTsKLQkJCXJvb3RzWzBdID0gVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1Q7Ci0JCQlyb290c1sxXSA9IFBMVUdJTl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1Q7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHx8IChvYmplY3QgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gcm9vdHM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0JCQlpZiAocGFyZW50RWxlbWVudCA9PSByb290c1swXSkgewotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKGZXb3JraW5nVXNlckNhdGFsb2cpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCA9PSByb290c1sxXSkgewotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKGZTeXN0ZW1DYXRhbG9nKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpIHsKLQkJCQlJQ2F0YWxvZyBuZXh0Q2F0YWxvZyA9ICgoSU5leHRDYXRhbG9nKSBwYXJlbnRFbGVtZW50KS5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKG5leHRDYXRhbG9nKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0Q2hpbGRyZW5IZWxwZXIoSUNhdGFsb2cgY2F0YWxvZykgewotCQkJLy8gVE9ETyBhZGQgZW50cmllcyBmcm9tIHRoZSBuZXN0ZWQgY2F0YWxvZ3MKLQotCQkJSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQlpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7Ci0JCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQkJaW50IHJlc3VsdCA9IDA7Ci0JCQkJCQlpZiAoKG8xIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgJiYgKG8yIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkpIHsKLQkJCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5MSA9IChJQ2F0YWxvZ0VudHJ5KSBvMTsKLQkJCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5MiA9IChJQ2F0YWxvZ0VudHJ5KSBvMjsKLQkJCQkJCQlyZXN1bHQgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZW50cnkxLmdldEtleSgpLCBlbnRyeTIuZ2V0S2V5KCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQkJCX07Ci0JCQkJQXJyYXlzLnNvcnQoZW50cmllcywgY29tcGFyYXRvcik7Ci0JCQl9Ci0JCQlWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGVudHJpZXMpKTsKLQkJCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGNhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCQlMaXN0IG5leHRDYXRhbG9nc0xpc3QgPSBBcnJheXMuYXNMaXN0KG5leHRDYXRhbG9ncyk7Ci0JCQlyZXN1bHQuYWRkQWxsKG5leHRDYXRhbG9nc0xpc3QpOwotCi0JCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IElDYXRhbG9nRWxlbWVudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSA/IG51bGwgOiBVU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gaXNSb290KGVsZW1lbnQpID8gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMCA6IGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZGlzcG9zZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGQsIE9iamVjdCBuZXdvYmopIHsKLQkJCS8vIElTU1VFOiBzZWVtcyB3ZSBzaG91bGQgZG8gc29tZXRoaW5nIGhlcmUKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImhlbGxvIikgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJydW4hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0KLQljbGFzcyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCQlwcm90ZWN0ZWQgU3RyaW5nW10gZXh0ZW5zaW9uczsKLQotCQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMxKSB7Ci0JCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZWxlbWVudDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeS5nZXRVUkkoKS5lbmRzV2l0aChleHRlbnNpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZWxlbWVudC5lcXVhbHMoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCkgfHwgZWxlbWVudC5lcXVhbHMoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MUXVpY2tTY2FuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTFF1aWNrU2Nhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjM1MzlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MUXVpY2tTY2FuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTFF1aWNrU2NhbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKFN0cmluZyB1cmkpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotCQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotCQkJcmVzdWx0ID0gWE1MUXVpY2tTY2FuLmdldFRhcmdldE5hbWVzcGFjZVVSSUZvclNjaGVtYShpbnB1dFN0cmVhbSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEoSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJVGFyZ2V0TmFtZXNwYWNlVVJJQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUYXJnZXROYW1lc3BhY2VVUklDb250ZW50SGFuZGxlcigpOwotCQlDbGFzc0xvYWRlciBwcmV2Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQl0cnkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoWE1MUXVpY2tTY2FuLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCQkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCVNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCksIGhhbmRsZXIpOwotCQl9Ci0JCWNhdGNoIChTdG9wUGFyc2VFeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBpcyBhIG5vcm1hbCBleGNlcHRpb24gdG8gc3RvcCBwYXJzaW5nIGVhcmx5LAotCQkJLy8gd2hlbiBpbmZvIGlzIGZvdW5kLCBzbyB3ZSBjYW4gc2FmZWx5IGlnbm9yZQotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIocHJldkNsYXNzTG9hZGVyKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlci50YXJnZXROYW1lc3BhY2VVUkk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9wIHBhcnNpbmcgd2hlbiByZXF1aXJlZAotCSAqIGluZm9ybWF0aW9uIGlzIGZvdW5kLgotCSAqLwotCXN0YXRpYyBjbGFzcyBTdG9wUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gewotCQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yIFN0b3BQYXJzZUV4Y2VwdGlvbi4KLQkJICovCi0JCVN0b3BQYXJzZUV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCJ0YXJnZXRuYW1lc3BhY2UgZm91bmQsIG5vIG5lZWQgdG8gY29udGludWUgdGhlIHBhcnNlIik7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlVVJJQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0JCXB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVVJJOwotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlpZiAobG9jYWxOYW1lLmVxdWFscygic2NoZW1hIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlpbnQgbkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJpYnV0ZXM7IGkrKykgewotCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSkuZXF1YWxzKCJ0YXJnZXROYW1lc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQl0YXJnZXROYW1lc3BhY2VVUkkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgU3RvcFBhcnNlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvY2F0YWxvZ0VudHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9jYXRhbG9nRW50cnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjViMjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9jYXRhbG9nRW50cnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL25leHRDYXRhbG9nLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9uZXh0Q2F0YWxvZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOTM0YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL25leHRDYXRhbG9nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZW50cnlfb2JqLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZW50cnlfb2JqLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3MTQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2VudHJ5X29iai5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfZXhwYW5kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZmlsZV9leHBhbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY5YmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZmlsZV9leHBhbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9maWxlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxMTYxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvbmV4dENhdGFsb2dfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvbmV4dENhdGFsb2dfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRiZmU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L25leHRDYXRhbG9nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L3htbGNhdGFsb2dfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYveG1sY2F0YWxvZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE0NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYveG1sY2F0YWxvZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vdnIxNi9lcnJvci1vdmVybGF5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb3ZyMTYvZXJyb3Itb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vdnIxNi9lcnJvci1vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0RPTVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0RPTVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlYmI3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9ET01Qcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIQUNLID0gImhhY2siOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSgpIHsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVBdHRyaWJ1dGVQcm9wZXJ0eURlc2NyaXB0b3IoQXR0ciBhdHRyKSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGF0dHIuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IG1xLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCQlpZiAoYWQgIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHZhbHVlc0FycmF5ID0gbXEuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhhdHRyLmdldE93bmVyRWxlbWVudCgpLCBhZCk7Ci0JCQkJaWYgKCh2YWx1ZXNBcnJheSAhPSBudWxsKSAmJiAodmFsdWVzQXJyYXkubGVuZ3RoID4gMCkpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSwgdmFsdWVzQXJyYXkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUNEQVRBU2VjdGlvblByb3BlcnR5RGVzY3JpcHRvcihDREFUQVNlY3Rpb24gY2RhdGFTZWN0aW9uKSB7Ci0JCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKEhBQ0spOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUNvbW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoQ29tbWVudCBjb21tZW50KSB7Ci0JCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKEhBQ0spOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJVGV4dFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURvY3VtZW50VHlwZVByb3BlcnR5RGVzY3JpcHRvcihEb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlKSB7Ci0JCXJldHVybiBudWxsOyAvLyBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihIQUNLLCBIQUNLKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVFbnRpdHlSZWZlcmVuY2VQcm9wZXJ0eURlc2NyaXB0b3IoRW50aXR5UmVmZXJlbmNlIGVudGl0eVJlZmVyZW5jZSkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKSB7Ci0JCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKEhBQ0spOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCQlpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVBdHRyaWJ1dGVQcm9wZXJ0eURlc2NyaXB0b3IoKEF0dHIpIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlQ0RBVEFTZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKChDREFUQVNlY3Rpb24pIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlQ29tbWVudFByb3BlcnR5RGVzY3JpcHRvcigoQ29tbWVudCkgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVEb2N1bWVudFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoKERvY3VtZW50VHlwZSkgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKChFbGVtZW50KSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUVudGl0eVJlZmVyZW5jZVByb3BlcnR5RGVzY3JpcHRvcigoRW50aXR5UmVmZXJlbmNlKSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvblByb3BlcnR5RGVzY3JpcHRvcigoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZVRleHRQcm9wZXJ0eURlc2NyaXB0b3IoKFRleHQpIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFRleHQgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmU5N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotcHVibGljIGludGVyZmFjZSBJRGVzaWduVmlld2VyIHsKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLQlTdHJpbmcgZ2V0VGl0bGUoKTsKLQotCXZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KTsKLQotCUlTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExYTNmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JcHVibGljIHZvaWQgaW5pdFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9ucyhJQWN0aW9uQmFycyBiYXJzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9Tb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTlmZmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBpbXBsZW1lbnRzIElFeHRlbmRlZENvbnRyaWJ1dG9yIHsKLQotCXByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgPSBudWxsOwotCXByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Igc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBudWxsOwotCXByb3RlY3RlZCBNdWx0aVBhZ2VFZGl0b3JQYXJ0IG11bHRpUGFnZUVkaXRvciA9IG51bGw7Ci0KLQkvLyBFZGl0b3JFeHRlbnNpb24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElFeHRlbmRlZENvbnRyaWJ1dG9yIGV4dGVuZGVkQ29udHJpYnV0b3I7Ci0KLQlwdWJsaWMgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBuZXcgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0KLQkJLy8gUmVhZCBhY3Rpb24gZXh0ZW5zaW9ucy4KLQkJRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyKCk7Ci0JCWV4dGVuZGVkQ29udHJpYnV0b3IgPSBidWlsZGVyLnJlYWRBY3Rpb25FeHRlbnNpb25zKEVESVRPUl9JRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmluaXQoYWN0aW9uQmFycyk7Ci0KLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKGFjdGlvbkJhcnMpOwotCQkJaW5pdFNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKGFjdGlvbkJhcnMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmluaXQoYWN0aW9uQmFycywgZ2V0UGFnZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5pbml0KGFjdGlvbkJhcnMsIGdldFBhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudSk7Ci0KLQkJLy9hZGRUb01lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9NZW51KG1lbnUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRXh0ZW5kZWRDb250cmlidXRvciNjb250cmlidXRlVG9Qb3B1cE1lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCi0JCWFkZFRvUG9wdXBNZW51KG1lbnUpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvUG9wdXBNZW51KG1lbnUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9Qb3B1cE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0KLQkJYWRkVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0KLQkJYWRkVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSUV4dGVuZGVkQ29udHJpYnV0b3IjdXBkYXRlVG9vbGJhckFjdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xiYXJBY3Rpb25zKCkgewotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCS8vIHNhdmUgbXVsdGlQYWdlRWRpdG9yIGJlZm9yZSBjYWxsaW5nCi0JCS8vIHN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpCi0JCS8vIHN1cGVyLnNldEFjdGl2ZUVkaXRvciB3aWxsIGNhbGwgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydAotCQkvLyBhY3RpdmVFZGl0b3IpCi0JCS8vIG11bHRpUGFnZUVkaXRvciBpcyBuZWVkZWQgaW4gc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydAotCQkvLyBhY3RpdmVFZGl0b3IpCi0JCWlmICh0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JQYXJ0KSB7Ci0JCQltdWx0aVBhZ2VFZGl0b3IgPSAoTXVsdGlQYWdlRWRpdG9yUGFydCkgdGFyZ2V0RWRpdG9yOwotCQl9Ci0KLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0KLQkJdXBkYXRlVG9vbGJhckFjdGlvbnMoKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJLy8gVGhpcyBjb250cmlidXRvciBpcyBkZXNpZ25lZCBmb3IgU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0LgotCQkvLyBUbyBzYWZlLWd1YXJkIHRoaXMgZnJvbSBwcm9ibGVtcyBjYXVzZWQgYnkgdW5leHBlY3RlZCB1c2FnZSBieQotCQkvLyBvdGhlciBlZGl0b3JzLCB0aGUgZm9sbG93aW5nCi0JCS8vIGNoZWNrIGlzIGFkZGVkLgotCQlpZiAobXVsdGlQYWdlRWRpdG9yICE9IG51bGwpIHsKLQkJCWlmICgoYWN0aXZlRWRpdG9yICE9IG51bGwpICYmIChhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikpIHsKLQkJCQlhY3RpdmF0ZVNvdXJjZVBhZ2UoYWN0aXZlRWRpdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFjdGl2YXRlRGVzaWduUGFnZShhY3RpdmVFZGl0b3IpOwotCQkJfQotCQl9Ci0KLQkJdXBkYXRlVG9vbGJhckFjdGlvbnMoKTsKLQotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOwotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0JCQkvLyB1cGRhdGUgbWVudSBiYXIgYW5kIHRvb2wgYmFyCi0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlRGVzaWduUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKSAmJiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJfQotCi0JCWlmICgoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJLy8gaWYgZGVzaWduIHBhZ2UgaXMgbm90IHJlYWxseSBhbiBJRWRpdG9yUGFydCwgYWN0aXZlRWRpdG9yID09Ci0JCQkvLyBudWxsLCBzbyBwYXNzIGluIG11bHRpUGFnZUVkaXRvciBpbnN0ZWFkIChkMjgyNDE0KQotCQkJaWYgKGFjdGl2ZUVkaXRvciA9PSBudWxsKSB7Ci0JCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQkJCX0KLQkJCSgoSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcikuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVNvdXJjZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmICgoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCX0KLQotCQlpZiAoKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwpICYmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikpIHsKLQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQkJKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9Tb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDFlMjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTDsKLQotCi0vKioKLSAqIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGZvciBtdWx0aSBwYWdlIGVkaXRvcidzIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yLgotICogCi0gKiBVc2UgWE1MRWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNpbmdsZSBwYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yWE1MIHsKLQotCXByaXZhdGUgSUFjdGlvbkJhcnMgZkJhcnM7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYWxsczoKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb01lbnU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIG1lbnUKLQkgKiBtYW5hZ2VyPC9saT4KLQkgKiA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvVG9vbEJhcjwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgdG9vbAotCSAqIGJhciBtYW5hZ2VyPC9saT4KLQkgKiA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvU3RhdHVzTGluZTwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicKLQkgKiBzdGF0dXMgbGluZSBtYW5hZ2VyPC9saT4KLQkgKiA8L3VsPgotCSAqIFRoZSBnaXZlbiBhY3Rpb24gYmFycyBhcmUgYWxzbyByZW1lbWJlcmVkIGFuZCBtYWRlIGFjY2Vzc2libGUgdmlhCi0JICogPGNvZGU+Z2V0QWN0aW9uQmFyczwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGJhcnMKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gYmFycwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycykgewotCQlmQmFycyA9IGJhcnM7Ci0JCWNvbnRyaWJ1dGVUb01lbnUoYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJY29udHJpYnV0ZVRvVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCQljb250cmlidXRlVG9TdGF0dXNMaW5lKGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGNvbnRyaWJ1dG9yJ3MgYWN0aW9uIGJhcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgYWN0aW9uIGJhcnMKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKLQkJcmV0dXJuIGZCYXJzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVDb250ZW50SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9UcmVlQ29udGVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWE0ZGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVDb250ZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogVGhpcyBwZXJmb3JtcyB0aGUgd29yayBvZiB0YWtpbmcgYSBET00gdHJlZSBhbmQgY29udmVydGluZyBpdCB0byBhCi0gKiBkaXNwbGF5YWJsZSAnVUknIHRyZWUuCi0gKiAKLSAqIEZvciBleGFtcGxlIDogLSB3aGl0ZSBzcGFjZSB0ZXh0IG5vZGVzIGFyZSBvbW1pdGVkIGZyb20gdGhlICdVSScgdHJlZSAtCi0gKiBhZGphY2VudCBUZXh0IGFuZCBFbnRpdHlSZWZlcmVuY2Ugbm9kZXMgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgJ1VJJwotICogbm9kZSAtIEVsZW1lbnRzIHdpdGggJ3RleHQgb25seScgY2hpbGRyZW4gYXJlIGRpcGxheWVkIHdpdGhvdXQgY2hpbGRyZW4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVHJlZUNvbnRlbnRIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElERV9XSElURV9TUEFDRV9URVhUX05PREVTID0gODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01CSU5FX0FESkFDRU5UX1RFWFRfQU5EX0VOVElUWV9SRUZFUkVOQ0VTID0gMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElERV9FTEVNRU5UX0NISUxEX1RFWFRfTk9ERVMgPSAzMjsKLQotCXByb3RlY3RlZCBpbnQgc3R5bGUgPSBISURFX1dISVRFX1NQQUNFX1RFWFRfTk9ERVMgfCBDT01CSU5FX0FESkFDRU5UX1RFWFRfQU5EX0VOVElUWV9SRUZFUkVOQ0VTIHwgSElERV9FTEVNRU5UX0NISUxEX1RFWFRfTk9ERVM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdHlsZUZsYWcoaW50IGZsYWcpIHsKLQkJcmV0dXJuIChzdHlsZSAmIGZsYWcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWJvb2xlYW4gdGV4dENvbnRlbnRPbmx5ID0gdHJ1ZTsKLQotCQkJTmFtZWROb2RlTWFwIG1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJaW50IGxlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCWxpc3QuYWRkKG1hcC5pdGVtKGkpKTsKLQkJCQkJdGV4dENvbnRlbnRPbmx5ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlOb2RlIHByZXZJbmNsdWRlZE5vZGUgPSBudWxsOwotCQkJZm9yIChOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZE5vZGUgIT0gbnVsbDsgY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpbnQgY2hpbGROb2RlVHlwZSA9IGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpOwotCQkJCWJvb2xlYW4gaW5jbHVkZU5vZGUgPSB0cnVlOwotCi0JCQkJaWYgKGluY2x1ZGVOb2RlICYmIGhhc1N0eWxlRmxhZyhISURFX1dISVRFX1NQQUNFX1RFWFRfTk9ERVMpKSB7Ci0JCQkJCWlmIChpc0lnbm9yYWJsZVRleHQoY2hpbGROb2RlKSkgewotCQkJCQkJLy8gZmlsdGVyIG91dCB0aGUgaWdub3JhYmxlIHRleHQgbm9kZQotCQkJCQkJaW5jbHVkZU5vZGUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChpbmNsdWRlTm9kZSAmJiBoYXNTdHlsZUZsYWcoQ09NQklORV9BREpBQ0VOVF9URVhUX0FORF9FTlRJVFlfUkVGRVJFTkNFUykpIHsKLQkJCQkJaWYgKGlzVGV4dE9yRW50aXR5UmVmZXJlbmNlTm9kZShjaGlsZE5vZGUpICYmIChwcmV2SW5jbHVkZWROb2RlICE9IG51bGwpICYmIGlzVGV4dE9yRW50aXR5UmVmZXJlbmNlTm9kZShwcmV2SW5jbHVkZWROb2RlKSkgewotCQkJCQkJLy8gd2Ugb25seSBzaG93IHRoZSBmaXJzdCBvZiBhIGxpc3Qgb2YgYWRqYWNlbnQgdGV4dAotCQkJCQkJLy8gb3IgZW50aXR5IHJlZmVyZW5jZSBub2RlIGluIHRoZSB0cmVlCi0JCQkJCQkvLyBzbyB3ZSBmaWx0ZXIgb3V0IHRoaXMgc3Vic2VxdWVudCBvbmUKLQkJCQkJCWluY2x1ZGVOb2RlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaGFzU3R5bGVGbGFnKEhJREVfRUxFTUVOVF9DSElMRF9URVhUX05PREVTKSkgewotCQkJCQlpZiAoKGNoaWxkTm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUpICYmIChjaGlsZE5vZGVUeXBlICE9IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSkgewotCQkJCQkJdGV4dENvbnRlbnRPbmx5ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaW5jbHVkZU5vZGUpIHsKLQkJCQkJbGlzdC5hZGQoY2hpbGROb2RlKTsKLQkJCQkJcHJldkluY2x1ZGVkTm9kZSA9IGNoaWxkTm9kZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChoYXNTdHlsZUZsYWcoSElERV9FTEVNRU5UX0NISUxEX1RFWFRfTk9ERVMpICYmIHRleHRDb250ZW50T25seSkgewotCQkJCXJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBsaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVGV4dE9yRW50aXR5UmVmZXJlbmNlTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHx8IChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlVGV4dChOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJU3RyaW5nIGRhdGEgPSAoKFRleHQpIG5vZGUpLmdldERhdGEoKTsKLQkJCXJlc3VsdCA9ICgoZGF0YSA9PSBudWxsKSB8fCAoZGF0YS50cmltKCkubGVuZ3RoKCkgPT0gMCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21iaW5lZFRleHROb2RlKE5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlOb2RlIG5leHROb2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJaWYgKG5leHROb2RlICE9IG51bGwpIHsKLQkJCQlpZiAobmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb21iaW5lZFRleHROb2RlTGlzdChOb2RlIHRoZU5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotCQlib29sZWFuIHByZXZJc0VudGl0eSA9IGZhbHNlOwotCQlmb3IgKE5vZGUgbm9kZSA9IHRoZU5vZGU7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJcHJldklzRW50aXR5ID0gdHJ1ZTsKLQkJCQlsaXN0LmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKHByZXZJc0VudGl0eSB8fCAobm9kZSA9PSB0aGVOb2RlKSkpIHsKLQkJCQlwcmV2SXNFbnRpdHkgPSBmYWxzZTsKLQkJCQlsaXN0LmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHRWYWx1ZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBsaXN0ID0gX2dldEVsZW1lbnRUZXh0Q29udGVudChlbGVtZW50KTsKLQkJcmV0dXJuIGxpc3QgIT0gbnVsbCA/IGdldFZhbHVlRm9yVGV4dENvbnRlbnQobGlzdCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRUZXh0VmFsdWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdmFsdWUpIHsKLQkJc2V0RWxlbWVudE5vZGVWYWx1ZShlbGVtZW50LCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IF9nZXRFbGVtZW50VGV4dENvbnRlbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQotCQlmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB8fCAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSkgewotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJfQotCQkJCXJlc3VsdC5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBudWxsOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGVsZW1lbnQgaXMgaGFzICd0ZXh0IG9ubHknIGNvbnRlbnQgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlCi0JICogbGlzdCBvZiBlbGVtZW50cyB0aGF0IGNvbXBvc2UgdGhlIHRleHQgb25seSBjb250ZW50Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RWxlbWVudFRleHRDb250ZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKLQkJCXJlc3VsdCA9IF9nZXRFbGVtZW50VGV4dENvbnRlbnQoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKE5vZGUgbm9kZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gKChBdHRyKSBub2RlKS5nZXRWYWx1ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCXJlc3VsdCA9ICgoQ2hhcmFjdGVyRGF0YSkgbm9kZSkuZ2V0RGF0YSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSBnZXREb2N1bWVudFR5cGVWYWx1ZSgoRG9jdW1lbnRUeXBlKSBub2RlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gZ2V0RWxlbWVudE5vZGVWYWx1ZSgoRWxlbWVudCkgbm9kZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gZ2V0VGV4dE5vZGVWYWx1ZShub2RlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpLmdldERhdGEoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShOb2RlIG5vZGUsIFN0cmluZyB2YWx1ZSkgewotCQlpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCXRyeSB7Ci0JCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCQkoKEF0dHIpIG5vZGUpLnNldFZhbHVlKHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCQkvLyBkcm9wIHRocnUKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQkoKENoYXJhY3RlckRhdGEpIG5vZGUpLnNldERhdGEodmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQkJc2V0RWxlbWVudE5vZGVWYWx1ZSgoRWxlbWVudCkgbm9kZSwgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0JCQkJCS8vIGRyb3AgdGhydQotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCXNldFRleHROb2RlVmFsdWUobm9kZSwgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpLnNldERhdGEodmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQlEaXNwbGF5IGQgPSBnZXREaXNwbGF5KCk7Ci0JCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJZC5iZWVwKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERvY3VtZW50VHlwZVZhbHVlKERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUpIHsKLQkJcmV0dXJuIERPTVdyaXRlci5nZXREb2N1bWVudFR5cGVEYXRhKGRvY3VtZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50Tm9kZVZhbHVlKEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJTGlzdCBsaXN0ID0gZ2V0RWxlbWVudFRleHRDb250ZW50KGVsZW1lbnQpOwotCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRWYWx1ZUZvclRleHRDb250ZW50KGxpc3QpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudE5vZGVWYWx1ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2YWx1ZSkgewotCQlMaXN0IGxpc3QgPSBnZXRFbGVtZW50VGV4dENvbnRlbnQoZWxlbWVudCk7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCXNldFZhbHVlRm9yVGV4dENvbnRlbnQobGlzdCwgdmFsdWUpOwotCQl9Ci0JCWVsc2UgewotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCVRleHQgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKLQkJCWVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHROb2RlVmFsdWUoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBudWxsOwotCQlpZiAoaXNDb21iaW5lZFRleHROb2RlKG5vZGUpKSB7Ci0JCQlsaXN0ID0gZ2V0Q29tYmluZWRUZXh0Tm9kZUxpc3Qobm9kZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJbGlzdC5hZGQobm9kZSk7Ci0JCX0KLQkJcmVzdWx0ID0gZ2V0VmFsdWVGb3JUZXh0Q29udGVudChsaXN0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0Tm9kZVZhbHVlKE5vZGUgbm9kZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCUxpc3QgbGlzdCA9IG51bGw7Ci0JCWlmIChpc0NvbWJpbmVkVGV4dE5vZGUobm9kZSkpIHsKLQkJCWxpc3QgPSBnZXRDb21iaW5lZFRleHROb2RlTGlzdChub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCWxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQlsaXN0LmFkZChub2RlKTsKLQkJfQotCQlzZXRWYWx1ZUZvclRleHRDb250ZW50KGxpc3QsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dCBnZXRFZmZlY3RpdmVUZXh0Tm9kZUZvckNvbWJpbmVkTm9kZUxpc3QoTGlzdCBsaXN0KSB7Ci0JCVRleHQgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlyZXN1bHQgPSAoVGV4dCkgbm9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWVGb3JUZXh0Q29udGVudChMaXN0IGxpc3QpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChsaXN0LnNpemUoKSA+IDApIHsKLQkJCUlET01Ob2RlIGZpcnN0ID0gKElET01Ob2RlKSBsaXN0LmdldCgwKTsKLQkJCUlET01Ob2RlIGxhc3QgPSAoSURPTU5vZGUpIGxpc3QuZ2V0KGxpc3Quc2l6ZSgpIC0gMSk7Ci0JCQlJRE9NTW9kZWwgbW9kZWwgPSBmaXJzdC5nZXRNb2RlbCgpOwotCQkJaW50IHN0YXJ0ID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBlbmQgPSBsYXN0LmdldEVuZE9mZnNldCgpOwotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJLy8gd2UgdHJpbSB0aGUgY29udGVudCBzbyB0aGF0IGl0IGxvb2tzIG5pY2Ugd2hlbiB2aWV3ZWQKLQkJLy8gd2UgbmVlZCB0byBiZSBjYXJmdWxsIHRvIHByZXNlcnZlIHRoZSAndHJpbW1lZCcgdGV4dCB3aGVuIHRoZSB2YWx1ZQotCQkvLyBpcyBzZXQgKHNlZSBzZXRWYWx1ZUZvclRleHRDb250ZW50KQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHJlc3VsdC50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZUZvclRleHRDb250ZW50KExpc3QgbGlzdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCS8vIFN0cmluZyBvbGRWYWx1ZSA9IGdldFZhbHVlRm9yVGV4dENvbnRlbnQoKTsKLQkJLy8gd2Ugd29ycnkgYWJvdXQgcHJlc2VydmluZyB0cmltbWVkIHRleHQKLQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotCQkJSURPTU5vZGUgZmlyc3QgPSAoSURPTU5vZGUpIGxpc3QuZ2V0KDApOwotCQkJSURPTU5vZGUgbGFzdCA9IChJRE9NTm9kZSkgbGlzdC5nZXQobGlzdC5zaXplKCkgLSAxKTsKLQkJCWludCBzdGFydCA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kID0gbGFzdC5nZXRFbmRPZmZzZXQoKTsKLQkJCWZpcnN0LmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgc3RhcnQsIGVuZCAtIHN0YXJ0LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKE5vZGUgbm9kZSkgewotCQlpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0JCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCS8vIGRyb3AgdGhydQotCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0JCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gKGdldEVsZW1lbnRUZXh0Q29udGVudCgoRWxlbWVudCkgbm9kZSkgIT0gbnVsbCkgfHwgKG5vZGUuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID09IDApOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4MzJjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9UcmVlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBUcmVlRXh0ZW5zaW9uIGltcGxlbWVudHMgUGFpbnRMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgVHJlZSBmVHJlZTsKLQlwcm90ZWN0ZWQgRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXI7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGZDb2x1bW5Qcm9wZXJ0aWVzOwotCXByb3RlY3RlZCBJQ2VsbE1vZGlmaWVyIGNlbGxNb2RpZmllcjsKLQlwcm90ZWN0ZWQgaW50IGNvbHVtblBvc2l0aW9uID0gMzAwOwotCXByb3RlY3RlZCBpbnQgY29sdW1uSGl0V2lkdGggPSA1OwotCXByb3RlY3RlZCBDb2xvciB0YWJsZUxpbmVDb2xvcjsKLQlwcm90ZWN0ZWQgaW50IGNvbnRyb2xXaWR0aDsKLQlwcm90ZWN0ZWQgRGVsYXllZERyYXdUaW1lciBkZWxheWVkRHJhd1RpbWVyOwotCXByaXZhdGUgYm9vbGVhbiBmaXNVbnN1cHBvcnRlZElucHV0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgVHJlZUV4dGVuc2lvbihUcmVlIHRyZWUpIHsKLQkJdGhpcy5mVHJlZSA9IHRyZWU7Ci0JCUludGVybmFsTW91c2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnRlcm5hbE1vdXNlTGlzdGVuZXIoKTsKLQkJdHJlZS5hZGRNb3VzZU1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRyZWUuYWRkTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRyZWUuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLQkJZWRpdE1hbmFnZXIgPSBuZXcgRWRpdE1hbmFnZXIodHJlZSk7Ci0JCWRlbGF5ZWREcmF3VGltZXIgPSBuZXcgRGVsYXllZERyYXdUaW1lcih0cmVlKTsKLQotCQl0YWJsZUxpbmVDb2xvciA9IHRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTElHSFRfU0hBRE9XKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0YWJsZUxpbmVDb2xvci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgbW9kaWZpZXIpIHsKLQkJY2VsbE1vZGlmaWVyID0gbW9kaWZpZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRDYWNoZWREYXRhKCkgewotCQkvLyB0b2RvOiBzdXJlIHNlZW1zIHdlIHNob3VsZCByZXNldCBzb21ldGhpbmc/Ci0JfQotCi0JcHVibGljIElDZWxsTW9kaWZpZXIgZ2V0Q2VsbE1vZGlmaWVyKCkgewotCQlyZXR1cm4gY2VsbE1vZGlmaWVyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEl0ZW1MaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCWdldEl0ZW1MaXN0SGVscGVyKGZUcmVlLmdldEl0ZW1zKCksIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZXRJdGVtTGlzdEhlbHBlcihUcmVlSXRlbVtdIGl0ZW1zLCBMaXN0IGxpc3QpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJbGlzdC5hZGQoaXRlbSk7Ci0JCQlnZXRJdGVtTGlzdEhlbHBlcihpdGVtLmdldEl0ZW1zKCksIGxpc3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVJdGVtIGdldFRyZWVJdGVtT25Sb3coaW50IHB4LCBpbnQgcHkpIHsKLQkJVHJlZUl0ZW0gcmVzdWx0ID0gbnVsbDsKLQkJTGlzdCBsaXN0ID0gZ2V0SXRlbUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGkubmV4dCgpOwotCQkJUmVjdGFuZ2xlIHIgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJaWYgKChyICE9IG51bGwpICYmIChweCA+PSByLngpICYmIChweSA+PSByLnkpICYmIChweSA8PSByLnkgKyByLmhlaWdodCkpIHsKLQkJCQlyZXN1bHQgPSBpdGVtOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEludGVybmFsTW91c2VMaXN0ZW5lciBleHRlbmRzIE1vdXNlQWRhcHRlciBpbXBsZW1lbnRzIE1vdXNlTW92ZUxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIGludCBjb2x1bW5EcmFnZ2VkID0gLTE7Ci0JCXByb3RlY3RlZCBib29sZWFuIGlzRG93biA9IGZhbHNlOwotCQlwcm90ZWN0ZWQgaW50IHByZXZYID0gLTE7Ci0JCXByb3RlY3RlZCBDdXJzb3IgY3Vyc29yID0gbnVsbDsKLQotCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCQlpZiAoKGUueCA+IGNvbHVtblBvc2l0aW9uIC0gY29sdW1uSGl0V2lkdGgpICYmIChlLnggPCBjb2x1bW5Qb3NpdGlvbiArIGNvbHVtbkhpdFdpZHRoKSkgewotCQkJCWlmIChjdXJzb3IgPT0gbnVsbCkgewotCQkJCQljdXJzb3IgPSBuZXcgQ3Vyc29yKGZUcmVlLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9TSVpFV0UpOwotCQkJCQlmVHJlZS5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoY3Vyc29yICE9IG51bGwpIHsKLQkJCQkJZlRyZWUuc2V0Q3Vyc29yKG51bGwpOwotCQkJCQljdXJzb3IuZGlzcG9zZSgpOwotCQkJCQljdXJzb3IgPSBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNvbHVtbkRyYWdnZWQgIT0gLTEpIHsKLQkJCQkvLyB1c2luZyB0aGUgZGVsYXkgdGltZXIgd2lsbCBtYWtlIHJlZHJhd3MgbGVzcyBmbGlja2VyeQotCQkJCWlmIChlLnggPiAyMCkgewotCQkJCQljb2x1bW5Qb3NpdGlvbiA9IGUueDsKLQkJCQkJZGVsYXllZERyYXdUaW1lci5yZXNldCgyMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJLy8gaGVyZSB3ZSBoYW5kbGUgdGhlIGNvbHVtbiByZXNpemluZyBieSBkZXRlY3QgaWYgdGhlIHVzZXIgaGFzCi0JCQkvLyBjbGljayBvbiBhIGNvbHVtbiBzZXBhcmF0b3IKLQkJCS8vCi0JCQljb2x1bW5EcmFnZ2VkID0gLTE7Ci0JCQllZGl0TWFuYWdlci5kZWFjdGl2YXRlQ2VsbEVkaXRvcigpOwotCi0JCQlpZiAoKGUueCA+IGNvbHVtblBvc2l0aW9uIC0gY29sdW1uSGl0V2lkdGgpICYmIChlLnggPCBjb2x1bW5Qb3NpdGlvbiArIGNvbHVtbkhpdFdpZHRoKSkgewotCQkJCWNvbHVtbkRyYWdnZWQgPSAwOwotCQkJfQotCi0JCQkvLyBoZXJlIHdlIGhhbmRsZSBzZWxlY3RpbmcgdHJlZSBpdGVtcyB3aGVuIGFueSB0aGluZyBvbiB0aGUgJ3JvdycKLQkJCS8vIGlzIGNsaWNrZWQKLQkJCS8vCi0JCQlUcmVlSXRlbSBpdGVtID0gZlRyZWUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQlpdGVtID0gZ2V0VHJlZUl0ZW1PblJvdyhlLngsIGUueSk7Ci0JCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtWzFdOwotCQkJCQlpdGVtc1swXSA9IGl0ZW07Ci0JCQkJCWZUcmVlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCWNvbHVtbkRyYWdnZWQgPSAtMTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZkNvbHVtblByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uUHJvcGVydGllcyhTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXRoaXMuZkNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5Qcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCVJlY3RhbmdsZSB0cmVlQm91bmRzID0gZlRyZWUuZ2V0Qm91bmRzKCk7Ci0KLQkJY29udHJvbFdpZHRoID0gdHJlZUJvdW5kcy53aWR0aDsKLQkJQ29sb3IgYmcgPSBmVHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbG9yIGJnMiA9IGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pOwotCi0JCWdjLnNldEJhY2tncm91bmQoYmcyKTsKLQotCQkvLyAvLyBUaGlzIG5leHQgcGFydCBjYXVzZXMgcHJvYmxlbXMgb24gTElOVVgsIHNvIGxldCdzIG5vdCBkbyBpdAotCQkvLyB0aGVyZQotCQkvLyBpZiAoQjJCSGFja3MuSVNfVU5JWCA9PSBmYWxzZSkgewotCQkvLyBUcmVlSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkvLyBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRJdGVtcy5sZW5ndGg7IGkrKykgewotCQkvLyBUcmVlSXRlbSBpdGVtID0gc2VsZWN0ZWRJdGVtc1tpXTsKLQkJLy8gUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCS8vIGlmIChib3VuZHMgIT0gbnVsbCkgewotCQkvLyBnYy5maWxsUmVjdGFuZ2xlKGJvdW5kcy54ICsgYm91bmRzLndpZHRoLCBib3VuZHMueSwgY29udHJvbFdpZHRoLAotCQkvLyBib3VuZHMuaGVpZ2h0KTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwotCQlpZiAoIWZpc1Vuc3VwcG9ydGVkSW5wdXQpIHsKLQkJCVRyZWVJdGVtW10gaXRlbXMgPSBmVHJlZS5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKHRhYmxlTGluZUNvbG9yKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJnKTsKLQotCQkJCWdjLmZpbGxSZWN0YW5nbGUoY29sdW1uUG9zaXRpb24sIHRyZWVCb3VuZHMueCwgdHJlZUJvdW5kcy53aWR0aCwgdHJlZUJvdW5kcy5oZWlnaHQpOwotCi0JCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBpdGVtc1swXS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgaGVpZ2h0ID0gY29tcHV0ZVRyZWVJdGVtSGVpZ2h0KCk7Ci0KLQkJCQlpZiAoaXRlbUJvdW5kcyAhPSBudWxsKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEJvdW5kcyB3aWxsIGJlIGZvciB0aGUgZmlyc3QgaXRlbSwgd2hpY2ggd2lsbCBlaXRoZXIgYmUKLQkJCQkJICogdmlzaWJsZSBhdCB0aGUgdG9wIG9mIHRoZSBUcmVlLCBvciBzY3JvbGxlZCBvZmYgd2l0aAotCQkJCQkgKiBuZWdhdGl2ZSB2YWx1ZXMKLQkJCQkJICovCi0JCQkJCWludCBzdGFydFkgPSBpdGVtQm91bmRzLnk7Ci0KLQkJCQkJLyogT25seSBkcmF3IGxpbmVzIHdpdGhpbiB0aGUgVHJlZSBib3VuZGFyaWVzICovCi0JCQkJCWZvciAoaW50IGkgPSBzdGFydFk7IGkgPCB0cmVlQm91bmRzLmhlaWdodDsgaSArPSBoZWlnaHQpIHsKLQkJCQkJCWlmIChpID49IHRyZWVCb3VuZHMueSkgewotCQkJCQkJCWdjLmRyYXdMaW5lKDAsIGksIHRyZWVCb3VuZHMud2lkdGgsIGkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWdjLmRyYXdMaW5lKGNvbHVtblBvc2l0aW9uLCAwLCBjb2x1bW5Qb3NpdGlvbiwgdHJlZUJvdW5kcy5oZWlnaHQpOwotCQkJCXBhaW50SXRlbXMoZ2MsIGl0ZW1zLCB0cmVlQm91bmRzKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWRkRW1wdHlUcmVlTWVzc2FnZShnYyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRVbmFibGVUb1BvcHVsYXRlVHJlZU1lc3NhZ2UoZ2MpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludCBjb21wdXRlVHJlZUl0ZW1IZWlnaHQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQotCQkvKgotCQkgKiBPbiBHVEsgdHJlZS5nZXRJdGVtSGVpZ2h0KCkgc2VlbXMgdG8gbGllIHRvIHVzLiBJdCByZXBvcnRzIHRoYXQgdGhlCi0JCSAqIHRyZWUgaXRlbSBvY2N1cGllcyBhIGZldyBwaXhsZXMgbGVzcyB2ZXJ0aWNhbCBzcGFjZSB0aGFuIGl0IHNob3VsZAotCQkgKiAocG9zc2libHkgYmVjYXVzZSBvZiB0aGUgaW1hZ2UgaGVpZ2h0IHZzLiB0aGUgdGV4dCBoZWlnaHQ/KS4gVGhpcwotCQkgKiBmb2lscyBvdXIgY29kZSB0aGF0IGRyYXdzIHRoZSAncm93JyBsaW5lcyBzaW5jZSB3ZSBhc3N1bWUgdGhhdAotCQkgKiBsaW5lcyBzaG91bGQgYmUgZHJhd24gYXQgJ2l0ZW1IZWlnaHQnIGluY3JlbWVudHMuIERvbid0IHRydXN0Ci0JCSAqIGdldEl0ZW1IZWlnaHQoKSB0byBjb21wdXRlIHRoZSBpbmNyZW1lbnQuLi4gaW5zdGVhZCBjb21wdXRlIHRoZQotCQkgKiB2YWx1ZSBiYXNlZCBvbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBUcmVlSXRlbXMsIGFuZCB0aGVuIHVzZSB0aGUKLQkJICogbGFyZ2VyIHZhbHVlLgotCQkgKiAKLQkJICogVGhpcyBzdHJhdGVneSBvbmx5IHdvcmtzIG9uIHRyZWVzIHdoZXJlIHRoZSBpdGVtcyBhcmUgb2YgZXZlbgotCQkgKiBoZWlnaHQsIGhvd2V2ZXIgYnVnCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTcyMDEgaW5kaWNhdGVzIHRoYXQKLQkJICogdGhpcyBpcyBubyBsb25nZXIgcHJvbWlzZWQsIGF0IGxlYXN0IG9uIHdpbjMyIGFuZCBsaWtlbHkgb24gb3RoZXIKLQkJICogcGxhdGZvcm1zIHNvb24uCi0JCSAqLwotCQlpZiAoZlRyZWUuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zID0gZlRyZWUuZ2V0SXRlbXMoKTsKLQkJCVJlY3RhbmdsZSBpdGVtQm91bmRzID0gaXRlbXNbMF0uZ2V0Qm91bmRzKCk7Ci0KLQkJCWlmIChpdGVtc1swXS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQkJVHJlZUl0ZW1bXSBjaGlsZHJlbiA9IGl0ZW1zWzBdLmdldEl0ZW1zKCk7Ci0JCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCQkJcmVzdWx0ID0gY2hpbGRyZW5bMF0uZ2V0Qm91bmRzKCkueSAtIGl0ZW1Cb3VuZHMueTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpdGVtcy5sZW5ndGggPiAxKSB7Ci0JCQkJcmVzdWx0ID0gaXRlbXNbMV0uZ2V0Qm91bmRzKCkueSAtIGl0ZW1Cb3VuZHMueTsKLQkJCX0KLQkJfQotCi0JCXJlc3VsdCA9IE1hdGgubWF4KGZUcmVlLmdldEl0ZW1IZWlnaHQoKSwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eVRyZWVNZXNzYWdlKEdDIGdjKSB7Ci0JCS8vIG5vdGhpbmcgdG8gYWRkIGhlcmUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVW5hYmxlVG9Qb3B1bGF0ZVRyZWVNZXNzYWdlKEdDIGdjKSB7Ci0JCS8vIGhlcmUgd2UgcHJpbnQgYSBtZXNzYWdlIHdoZW4gdGhlIGRvY3VtZW50IGNhbm5vdCBiZSBkaXNwbGF5ZWQganVzdAotCQkvLyB0byBnaXZlIHRoZQotCQkvLyB1c2VyIGEgdmlzdWFsIGN1ZQotCQkvLyBzbyB0aGF0IHRoZXkga25vdyBob3cgdG8gcHJvY2VlZCB0byBlZGl0IHRoZSBibGFuayB2aWV3Ci0JCWdjLnNldEZvcmVncm91bmQoZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCWdjLmRyYXdTdHJpbmcoWE1MRWRpdG9yTWVzc2FnZXMuVHJlZUV4dGVuc2lvbl8wLCAxMCwgMTApOwotCX0KLQotCXZvaWQgc2V0SXNVbnN1cHBvcnRlZElucHV0KGJvb2xlYW4gaXNVbnN1cHBvcnRlZCkgewotCQlmaXNVbnN1cHBvcnRlZElucHV0ID0gaXNVbnN1cHBvcnRlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYWludEl0ZW1zKEdDIGdjLCBUcmVlSXRlbVtdIGl0ZW1zLCBSZWN0YW5nbGUgdHJlZUJvdW5kcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJCQlpZiAoYm91bmRzICE9IG51bGwpIHsKLQkJCQkJCWlmICh0cmVlQm91bmRzLmludGVyc2VjdHMoYm91bmRzKSkgewotCQkJCQkJCXBhaW50SXRlbShnYywgaXRlbSwgYm91bmRzKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIGRlZmVjdCAyNDEwMzkKLQkJCQkJLy8KLQkJCQkJaWYgKGl0ZW0uZ2V0RXhwYW5kZWQoKSkgewotCQkJCQkJcGFpbnRJdGVtcyhnYywgaXRlbS5nZXRJdGVtcygpLCB0cmVlQm91bmRzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhaW50SXRlbShHQyBnYywgVHJlZUl0ZW0gaXRlbSwgUmVjdGFuZ2xlIGJvdW5kcykgewotCQkvLyBub3RoaW5nIHRvIHBhaW50Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBJQ2VsbEVkaXRvclByb3ZpZGVyIHsKLQkJQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBvLCBpbnQgY29sKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW1wcm92ZSBkcmF3aW5nIGR1cmluZyBhIGNvbHVtbiByZXNpemUuCi0JICovCi0JcHVibGljIGNsYXNzIERlbGF5ZWREcmF3VGltZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByb3RlY3RlZCBDb250cm9sIGNvbnRyb2w7Ci0KLQkJcHVibGljIERlbGF5ZWREcmF3VGltZXIoQ29udHJvbCBjb250cm9sMSkgewotCQkJdGhpcy5jb250cm9sID0gY29udHJvbDE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldChpbnQgbWlsbGlzZWNvbmRzKSB7Ci0JCQlnZXREaXNwbGF5KCkudGltZXJFeGVjKG1pbGxpc2Vjb25kcywgdGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQljb250cm9sLnJlZHJhdygpOwotCQl9Ci0JfQotCi0JRGlzcGxheSBnZXREaXNwbGF5KCkgewotCi0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0TWFuYWdlcgotCSAqLwotCXB1YmxpYyBjbGFzcyBFZGl0TWFuYWdlciB7Ci0JCXByb3RlY3RlZCBUcmVlIGZUcmVlMTsKLQkJcHJvdGVjdGVkIENvbnRyb2wgY2VsbEVkaXRvckhvbGRlcjsKLQkJcHJvdGVjdGVkIENlbGxFZGl0b3JTdGF0ZSBjZWxsRWRpdG9yU3RhdGU7Ci0KLQkJcHVibGljIEVkaXRNYW5hZ2VyKFRyZWUgdHJlZSkgewotCQkJdGhpcy5mVHJlZTEgPSB0cmVlOwotCQkJdGhpcy5jZWxsRWRpdG9ySG9sZGVyID0gbmV3IENvbXBvc2l0ZSh0cmVlLCBTV1QuTk9ORSk7Ci0KLQkJCWZpbmFsIFRyZWUgdGhlVHJlZSA9IHRyZWU7Ci0KLQkJCU1vdXNlQWRhcHRlciB0aGVNb3VzZUFkYXB0ZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQotCQkJCQlpZiAoZS54ID4gY29sdW1uUG9zaXRpb24gKyBjb2x1bW5IaXRXaWR0aCkgewotCQkJCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRoZVRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkvLyBObyBlZGl0IGlmIG1vcmUgdGhhbiBvbmUgcm93IGlzIHNlbGVjdGVkLgotCQkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW1zWzBdLmdldEJvdW5kcygpOwotCQkJCQkJCWlmICgoYm91bmRzICE9IG51bGwpICYmIChlLnkgPj0gYm91bmRzLnkpICYmIChlLnkgPD0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSkgewotCQkJCQkJCQlpbnQgY29sdW1uVG9FZGl0ID0gMTsKLQkJCQkJCQkJYWN0aXZhdGVDZWxsRWRpdG9yKGl0ZW1zWzBdLCBjb2x1bW5Ub0VkaXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWFwcGx5Q2VsbEVkaXRvclZhbHVlKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlhcHBseUNlbGxFZGl0b3JWYWx1ZSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUtleUxpc3RlbmVyIGtleUxpc3RlbmVyID0gbmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkJCWRlYWN0aXZhdGVDZWxsRWRpdG9yKCk7Ci0JCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdGhlVHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMSkgewotCQkJCQkJCWFjdGl2YXRlQ2VsbEVkaXRvcihpdGVtc1swXSwgMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCi0JCQl0cmVlLmFkZE1vdXNlTGlzdGVuZXIodGhlTW91c2VBZGFwdGVyKTsKLQkJCXRyZWUuYWRkS2V5TGlzdGVuZXIoa2V5TGlzdGVuZXIpOwotCQkJU2Nyb2xsQmFyIGhCYXIgPSB0cmVlLmdldEhvcml6b250YWxCYXIoKTsKLQkJCWlmIChoQmFyICE9IG51bGwpIHsKLQkJCQloQmFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCX0KLQkJCVNjcm9sbEJhciB2QmFyID0gdHJlZS5nZXRWZXJ0aWNhbEJhcigpOwotCQkJaWYgKHZCYXIgIT0gbnVsbCkgewotCQkJCXZCYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdG9yQWN0aXZlKCkgewotCQkJcmV0dXJuIGNlbGxFZGl0b3JTdGF0ZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYXBwbHlDZWxsRWRpdG9yVmFsdWUoKSB7Ci0JCQlpZiAoKGNlbGxFZGl0b3JTdGF0ZSAhPSBudWxsKSAmJiAoY2VsbE1vZGlmaWVyICE9IG51bGwpKSB7Ci0JCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBjZWxsRWRpdG9yU3RhdGUuZlRyZWVJdGVtOwotCi0JCQkJLy8gVGhlIGFyZWEgYmVsb3cgdGhlIGNlbGwgZWRpdG9yIG5lZWRzIHRvIGJlIGV4cGxpY2l0eQotCQkJCS8vIHJlcGFpbnRlZCBvbiBMaW51eAotCQkJCS8vCi0JCQkJLy8gUmVjdGFuZ2xlIHIgPSBCMkJIYWNrcy5JU19VTklYID8gdHJlZUl0ZW0uZ2V0Qm91bmRzKCkgOgotCQkJCS8vIG51bGw7Ci0KLQkJCQlPYmplY3QgdmFsdWUgPSBjZWxsRWRpdG9yU3RhdGUuZkNlbGxFZGl0b3IuZ2V0VmFsdWUoKTsKLQkJCQlTdHJpbmcgcHJvcGVydHkgPSBjZWxsRWRpdG9yU3RhdGUuZlByb3BlcnR5OwotCi0JCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQotCQkJCWNlbGxNb2RpZmllci5tb2RpZnkodHJlZUl0ZW0sIHByb3BlcnR5LCB2YWx1ZSk7Ci0KLQkJCQkvLyBpZiAociAhPSBudWxsKSB7Ci0JCQkJLy8gdHJlZS5yZWRyYXcoci54LCByLnksIHRyZWUuZ2V0Qm91bmRzKCkud2lkdGgsIHIuaGVpZ2h0LAotCQkJCS8vIGZhbHNlKTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlQ2VsbEVkaXRvcigpIHsKLQkJCS8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotCQkJaWYgKGNlbGxFZGl0b3JTdGF0ZSAhPSBudWxsKSB7Ci0JCQkJY2VsbEVkaXRvclN0YXRlLmRlYWN0aXZhdGUoKTsKLQkJCQljZWxsRWRpdG9yU3RhdGUgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWN0aXZhdGVDZWxsRWRpdG9yKFRyZWVJdGVtIHRyZWVJdGVtLCBpbnQgY29sdW1uKSB7Ci0JCQlpZiAoY2VsbE1vZGlmaWVyIGluc3RhbmNlb2YgSUNlbGxFZGl0b3JQcm92aWRlcikgewotCQkJCUlDZWxsRWRpdG9yUHJvdmlkZXIgY2VsbEVkaXRvclByb3ZpZGVyID0gKElDZWxsRWRpdG9yUHJvdmlkZXIpIGNlbGxNb2RpZmllcjsKLQkJCQlPYmplY3QgZGF0YSA9IHRyZWVJdGVtLmdldERhdGEoKTsKLQkJCQlpZiAoZkNvbHVtblByb3BlcnRpZXMubGVuZ3RoID4gY29sdW1uKSB7Ci0JCQkJCVN0cmluZyBwcm9wZXJ0eSA9IGZDb2x1bW5Qcm9wZXJ0aWVzW2NvbHVtbl07Ci0JCQkJCWlmIChjZWxsTW9kaWZpZXIuY2FuTW9kaWZ5KGRhdGEsIHByb3BlcnR5KSkgewotCQkJCQkJQ2VsbEVkaXRvciBuZXdDZWxsRWRpdG9yID0gY2VsbEVkaXRvclByb3ZpZGVyLmdldENlbGxFZGl0b3IoZGF0YSwgY29sdW1uKTsKLQkJCQkJCWlmIChuZXdDZWxsRWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCQkvLyBUaGUgY29udHJvbCB0aGF0IHdpbGwgYmUgdGhlIGVkaXRvciBtdXN0IGJlIGEKLQkJCQkJCQkvLyBjaGlsZCBvZiB0aGUgY29sdW1uUG9zaXRpb24KLQkJCQkJCQlDb250cm9sIGNvbnRyb2wgPSBuZXdDZWxsRWRpdG9yLmdldENvbnRyb2woKTsKLQkJCQkJCQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQkJCWNlbGxFZGl0b3JTdGF0ZSA9IG5ldyBDZWxsRWRpdG9yU3RhdGUobmV3Q2VsbEVkaXRvciwgY29udHJvbCwgdHJlZUl0ZW0sIGNvbHVtbiwgcHJvcGVydHkpOwotCQkJCQkJCQljZWxsRWRpdG9yU3RhdGUuYWN0aXZhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogdGhpcyBjbGFzcyBob2xkcyB0aGUgc3RhdGUgdGhhdCBpcyBuZWVkIG9uIGEgcGVyIGNlbGwgZWRpdG9yCi0JCSAqIGludm9jYXRpb24gYmFzaXMKLQkJICovCi0JCXB1YmxpYyBjbGFzcyBDZWxsRWRpdG9yU3RhdGUgaW1wbGVtZW50cyBJQ2VsbEVkaXRvckxpc3RlbmVyLCBGb2N1c0xpc3RlbmVyIHsKLQkJCXB1YmxpYyBDZWxsRWRpdG9yIGZDZWxsRWRpdG9yOwotCQkJcHVibGljIENvbnRyb2wgZkNvbnRyb2w7Ci0JCQlwdWJsaWMgVHJlZUl0ZW0gZlRyZWVJdGVtOwotCQkJcHVibGljIGludCBmQ29sdW1uTnVtYmVyOwotCQkJcHVibGljIFN0cmluZyBmUHJvcGVydHk7Ci0KLQkJCXB1YmxpYyBDZWxsRWRpdG9yU3RhdGUoQ2VsbEVkaXRvciBjZWxsRWRpdG9yLCBDb250cm9sIGNvbnRyb2wsIFRyZWVJdGVtIHRyZWVJdGVtLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQl0aGlzLmZDZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJCQl0aGlzLmZDb250cm9sID0gY29udHJvbDsKLQkJCQl0aGlzLmZUcmVlSXRlbSA9IHRyZWVJdGVtOwotCQkJCXRoaXMuZkNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLQkJCQl0aGlzLmZQcm9wZXJ0eSA9IHByb3BlcnR5OwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGZUcmVlSXRlbS5nZXREYXRhKCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gY2VsbE1vZGlmaWVyLmdldFZhbHVlKGVsZW1lbnQsIGZQcm9wZXJ0eSkudG9TdHJpbmcoKTsKLQkJCQlpZiAoZkNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KSBmQ29udHJvbDsKLQkJCQkJaW50IHJlcXVpcmVkU2l6ZSA9IHZhbHVlLmxlbmd0aCgpICsgMTAwOwotCQkJCQlpZiAodGV4dC5nZXRUZXh0TGltaXQoKSA8IHJlcXVpcmVkU2l6ZSkgewotCQkJCQkJdGV4dC5zZXRUZXh0TGltaXQocmVxdWlyZWRTaXplKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlSZWN0YW5nbGUgciA9IGZUcmVlSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJCWZDb250cm9sLnNldEJvdW5kcyhjb2x1bW5Qb3NpdGlvbiArIDUsIHIueSArIDEsIGZUcmVlMS5nZXRDbGllbnRBcmVhKCkud2lkdGggLSAoY29sdW1uUG9zaXRpb24gKyA1KSwgci5oZWlnaHQgLSAxKTsKLQkJCQkJZkNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZkNlbGxFZGl0b3Iuc2V0VmFsdWUodmFsdWUpOwotCQkJCQlmQ2VsbEVkaXRvci5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJZkNlbGxFZGl0b3Iuc2V0Rm9jdXMoKTsKLQkJCQkJZkNvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCQkJZkNlbGxFZGl0b3IucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZkNvbnRyb2wucmVtb3ZlRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJCQlmQ2VsbEVkaXRvci5kZWFjdGl2YXRlKCk7Ci0JCQkJZlRyZWUxLmZvcmNlRm9jdXMoKTsKLQkJCX0KLQotCQkJLy8gSUNlbGxFZGl0b3JMaXN0ZW5lciBtZXRob2RzCi0JCQkvLwotCQkJcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpIHsKLQkJCQlhcHBseUNlbGxFZGl0b3JWYWx1ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjYW5jZWxFZGl0b3IoKSB7Ci0JCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSwgYm9vbGVhbiBuZXdWYWxpZFN0YXRlKSB7Ci0JCQkJLy8gbm90aGluZywgZm9yIG5vdwotCQkJfQotCi0JCQkvLyBGb2N1c0xpc3RlbmVyIG1ldGhvZHMKLQkJCS8vCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlhcHBseUNlbGxFZGl0b3JWYWx1ZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1ZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZmQyM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhwYW5kQWN0aW9uOwotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCXB1YmxpYyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbihib29sZWFuIGlzRXhwYW5kQWN0aW9uKSB7Ci0JCXRoaXMuaXNFeHBhbmRBY3Rpb24gPSBpc0V4cGFuZEFjdGlvbjsKLQkJaWYgKGlzRXhwYW5kQWN0aW9uKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZV9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0VYUEFOREFMTCk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZF9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0VYUEFOREFMTCk7Ci0KLQkJCXNldEltYWdlRGVzY3JpcHRvcihlX2ltYWdlRGVzY3JpcHRvcik7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihkX2ltYWdlRGVzY3JpcHRvcik7Ci0JCQlzZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9JTkZPX0VYUEFORF9BTEwpOwotCQl9Ci0JCWVsc2UgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGVfaW1hZ2VEZXNjcmlwdG9yID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9DT0xMQVBTRUFMTCk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZF9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0NPTExBUFNFQUxMKTsKLQotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGVfaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGRfaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCXNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0lORk9fQ09MTEFQU0VfQUxMKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlcihBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkvLyB0ZW1wb3JhcmlseSBzZXQgdGhlIHZpc2liaWxpdHkgdG8gZmFsc2UKLQkJCS8vIHRoaXMgaGFzIGEgSFVHRSBwZXJmb3JtYW5jZSBiZW5lZml0Ci0JCQlib29sZWFuIGlzVmlzaWJsZSA9IHZpZXdlci5nZXRDb250cm9sKCkuZ2V0VmlzaWJsZSgpOwotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJaWYgKGlzRXhwYW5kQWN0aW9uKSB7Ci0JCQkJdmlld2VyLmV4cGFuZEFsbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCQl9Ci0KLQkJCS8vIHJlc3RvcmUgdGhlIHByZXZpb3VzIHZpc2liaWxpdHkgc3RhdGUKLQkJCS8vIAotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMzgwY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi0KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBkZWZpbml0aW9ucyBpZHMgZm9yIHRoZSBYTUwgZWRpdG9yIGFjdGlvbnMuCi0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudXRpbC5BY3Rpb25EZWZpbml0aW9uSWRzCi0gKiAgICAgICAgICAgICBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xFQU5VUF9ET0NVTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuY2xlYW51cC5kb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVF9ET0NVTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuZm9ybWF0LmRvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9QRU5fRklMRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkub3Blbi5maWxlLmZyb20uc291cmNlIjsvLyROT04tTkxTLTEkCi0JLy8gcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5GT1JNQVRJT04gPQotCS8vICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuc2hvdy50b29sdGlwLmluZm9ybWF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5GT1JNQVRJT04gPSAib3JnLmVjbGlwc2UuamR0LnVpLmVkaXQudGV4dC5qYXZhLnNob3cuamF2YWRvYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuYWRkLmJyZWFrcG9pbnRzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFOQUdFX0JSRUFLUE9JTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5tYW5hZ2UuYnJlYWtwb2ludHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTkFCTEVfQlJFQUtQT0lOVFMgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnVpLmVuYWJsZS5icmVha3BvaW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJU0FCTEVfQlJFQUtQT0lOVFMgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnVpLmRpc2FibGUuYnJlYWtwb2ludHMiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvck1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDQ3MWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBFZGl0b3IKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTEVkaXRvclJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlVmlld2VyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MTXVsdGlQYWdlRWRpdG9yUGFydF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRyZWVFeHRlbnNpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUcmVlRXh0ZW5zaW9uXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHJlZUV4dGVuc2lvbl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRyZWVFeHRlbnNpb25fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbjFfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlX19kb2VzX25vdF9leGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfY291bGRfbm90X2JlX29wZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJlZUV4dGVuc2lvbl8wOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTEVkaXRvck1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNTEVkaXRvck1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkhPTERfT0xELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5IT0xEX09MRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNhY2MwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkhPTERfT0xELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBwbHVnaW4gaGFzIGNvbWJpbmVkIHdpdGggdGhlIG9yZy5lY2xpcHNlLndzdC54bWwudWkKLSAqICAgICAgICAgICAgIHBsdWdpbi4gVXNlIFhNTFVJUGx1Z2luIGluc3RlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxVSVBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCi0JCS8vIHJlZmVyZW5jZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSBzbwotCQkvLyBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlKSBpcwotCQkvLyBjYWxsZWQKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQxMWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBYTUxVSVBsdWdpbi5JRDsKLQlwcml2YXRlIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLyBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkgewotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTklELCBpbWFnZUZpbGVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChpbWFnZUZpbGVQYXRoLCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1ZjAwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgWE1MIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgWE1MRWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09MTEFQU0UgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQ09MTEFQU0UgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09MTEFQU0VBTEwgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlX2FsbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTExBUFNFQUxMID0gImljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9FWFBBTkQgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0VYUEFORCA9ICJpY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfRVhQQU5EQUxMID0gImljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmRfYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfRVhQQU5EQUxMID0gImljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfTkVXX1hNTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvbmV3X3htbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX05FV19YTUwgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L25ld194bWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjMTczNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JSZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVhNTFRhYmxlVHJlZVZpZXdlcl8wPURlc2lnbgotWE1MTXVsdGlQYWdlRWRpdG9yUGFydF8wPVNvdXJjZQotWE1MVHJlZUV4dGVuc2lvbl8wPVN0cnVjdHVyZQotWE1MVHJlZUV4dGVuc2lvbl8xPVZhbHVlCi1YTUxUcmVlRXh0ZW5zaW9uXzM9VGhlIGRvY3VtZW50IGlzIGVtcHR5LgotWE1MVHJlZUV4dGVuc2lvbl80PVJpZ2h0IG1vdXNlIGNsaWNrIGhlcmUgdG8gaW5zZXJ0IGNvbnRlbnQuCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8wPSZYTUwKLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzE9JkV4cGFuZCBBbGwKLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzI9JkNvbGxhcHNlIEFsbAotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMz1UdXJuIEdyYW1tYXIgQ29uc3RyYWludHMgT2ZmCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl80PSZUdXJuIEdyYW1tYXIgQ29uc3RyYWludHMgT2ZmCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81PVR1cm4gR3JhbW1hciBDb25zdHJhaW50cyBPbgotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNj0mVHVybiBHcmFtbWFyIENvbnN0cmFpbnRzIE9uCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl83PVJlbG9hZCBEZXBlbmRlbmNpZXMKLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzg9JlJlbG9hZCBEZXBlbmRlbmNpZXMKLSMjCi1Bbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbjFfRVJST1JfPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGVuIGluaXRpYWxpemluZyB0aGUgaW5wdXQgZm9yIHRoZSB0aGUgZWRpdG9yJ3Mgc291cmNlIHBhZ2UuCi1SZXNvdXJjZV9fZG9lc19ub3RfZXhpc3Q9UmVzb3VyY2UgezB9IGRvZXMgbm90IGV4aXN0LgotRWRpdG9yX2NvdWxkX25vdF9iZV9vcGVuPUVkaXRvciBjb3VsZCBub3QgYmUgb3BlbiBvbiB7MH0KLVRyZWVFeHRlbnNpb25fMD1DYW5ub3QgZGlzcGxheSBkb2N1bWVudCBjb250ZW50cy4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDRlZTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQotcHVibGljIGNsYXNzIFhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRzTXVsdGlJbml0ID0gdHJ1ZTsKLQotCXB1YmxpYyBYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoYWN0aW9uQmFycyk7Ci0KLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJCSgoSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikuaW5pdFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9ucyhhY3Rpb25CYXJzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlRGVzaWduUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSAmJiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpKSB7Ci0JCQkvLyBpZiBkZXNpZ24gcGFnZSBpcyBub3QgcmVhbGx5IGFuIElFZGl0b3JQYXJ0LCBhY3RpdmVFZGl0b3IgPT0KLQkJCS8vIG51bGwsIHNvIHBhc3MgaW4gbXVsdGlQYWdlRWRpdG9yIGluc3RlYWQgKGQyODI0MTQpCi0JCQlpZiAoYWN0aXZlRWRpdG9yID09IG51bGwpIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQkJfQotCQkJKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCWlmICgoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCQkoKElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVNvdXJjZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmICgoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCQkoKElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJaWYgKChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSAmJiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpKSB7Ci0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQkJCSgoSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcikuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMpOwotCQluZWVkc011bHRpSW5pdCA9IHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0QWN0aXZlRWRpdG9yKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJaWYgKG5lZWRzTXVsdGlJbml0KSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciA9IG5ldyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKGdldEFjdGlvbkJhcnMoKSk7Ci0JCQluZWVkc011bHRpSW5pdCA9IGZhbHNlOwotCQl9Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2I0MTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0IGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydCB7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBwYXJ0IGFjdGl2YXRpb24gbGlzdGVuZXIsIGNvcGllZCBmcm9tIEFic3RyYWN0VGV4dEVkaXRvcgotCSAqLwotCWNsYXNzIEFjdGl2YXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIsIElXaW5kb3dMaXN0ZW5lciB7Ci0KLQkJLyoqIENhY2hlIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHBhcnQuICovCi0JCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZkFjdGl2ZVBhcnQ7Ci0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0JCS8qKgotCQkgKiBUaGUgcGFydCBzZXJ2aWNlLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHJpdmF0ZSBJUGFydFNlcnZpY2UgZlBhcnRTZXJ2aWNlOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLQkJICogCi0JCSAqIEBwYXJhbSBwYXJ0U2VydmljZQotCQkgKiAgICAgICAgICAgIHRoZSBwYXJ0IHNlcnZpY2Ugb24gd2hpY2ggdG8gYWRkIHRoZSBwYXJ0IGxpc3RlbmVyCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyBBY3RpdmF0aW9uTGlzdGVuZXIoSVBhcnRTZXJ2aWNlIHBhcnRTZXJ2aWNlKSB7Ci0JCQlmUGFydFNlcnZpY2UgPSBwYXJ0U2VydmljZTsKLQkJCWZQYXJ0U2VydmljZS5hZGRQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERpc3Bvc2VzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLQkJICogCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmUGFydFNlcnZpY2UucmVtb3ZlUGFydExpc3RlbmVyKHRoaXMpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5yZW1vdmVXaW5kb3dMaXN0ZW5lcih0aGlzKTsKLQkJCWZQYXJ0U2VydmljZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBwYXJ0OwotCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRCcm91Z2h0VG9Ub3Aob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydERlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWZBY3RpdmVQYXJ0ID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiB0cmlnZ2VyaW5nIGEgZWxlbWVudCBzdGF0ZSBjaGVjayBpbiB0aGUKLQkJICogZWRpdG9yLgotCQkgKi8KLQkJdm9pZCBoYW5kbGVBY3RpdmF0aW9uKCkgewotCQkJaWYgKGZJc0hhbmRsaW5nQWN0aXZhdGlvbiB8fCAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZkFjdGl2ZVBhcnQgPT0gWE1MTXVsdGlQYWdlRWRpdG9yUGFydC50aGlzKSB7Ci0JCQkJZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gdHJ1ZTsKLQkJCQl0cnkgewotCQkJCQlnZXRUZXh0RWRpdG9yKCkuc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZShnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCWlmICh3aW5kb3cgPT0gZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGRlc2NyaWJlZCBpbgotCQkJCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzEgV2lsbCBiZQotCQkJCSAqIHJlbW92ZWQgd2hlbiBTV1QgaGFzIHNvbHZlZCB0aGUgcHJvYmxlbS4KLQkJCQkgKi8KLQkJCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dEZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVucyBmb3Igc2VsZWN0aW9uIGZyb20gdGhlIHNvdXJjZSBwYWdlLCBhcHBseWluZyBpdCB0byB0aGUgZGVzaWduCi0JICogdmlld2VyLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGV4dEVkaXRvclBvc3RTZWxlY3Rpb25BZGFwdGVyIGV4dGVuZHMgVUlKb2IgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJYm9vbGVhbiBmb3JjZVBvc3RTZWxlY3Rpb24gPSBmYWxzZTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JCXB1YmxpYyBUZXh0RWRpdG9yUG9zdFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlzdXBlcihnZXRUaXRsZSgpKTsKLQkJCXNldFVzZXIodHJ1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJaWYgKChmRGVzaWduVmlld2VyICE9IG51bGwpICYmICgoZ2V0QWN0aXZlUGFnZSgpICE9IGZEZXNpZ25QYWdlSW5kZXgpIHx8ICFYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMuZXF1YWxzKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlUGFydCgpKSkpIHsKLQkJCQlpZiAoZm9yY2VQb3N0U2VsZWN0aW9uKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCQlzY2hlZHVsZSgyMDApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgUGFnZUluaXRpYWxpemF0aW9uRGF0YSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBmRWxlbWVudDsKLQkJU3RyaW5nIGZQcm9wZXJ0eU5hbWU7Ci0JCU9iamVjdCBmRGF0YTsKLQotCQlQYWdlSW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgewotCQkJc3VwZXIoKTsKLQkJCWZFbGVtZW50ID0gY2ZpZzsKLQkJCWZQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JCQlmRGF0YSA9IGRhdGE7Ci0JCX0KLQkJdm9pZCBzZW5kSW5pdGlhbGl6YXRpb25EYXRhKElFeGVjdXRhYmxlRXh0ZW5zaW9uIGV4ZWN1dGFibGVFeHRlbnNpb24pIHsKLQkJCXRyeSB7Ci0JCQkJZXhlY3V0YWJsZUV4dGVuc2lvbi5zZXRJbml0aWFsaXphdGlvbkRhdGEoZkVsZW1lbnQsIGZQcm9wZXJ0eU5hbWUsIGZEYXRhKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBJUHJvcGVydHlMaXN0ZW5lcgotCSAqLwotCWNsYXNzIFByb3BlcnR5TGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgc291cmNlLCBpbnQgcHJvcElkKSB7Ci0JCQlzd2l0Y2ggKHByb3BJZCkgewotCQkJCS8vIGhhZCB0byBpbXBsZW1lbnQgaW5wdXQgY2hhbmdlZCAibGlzdGVuZXIiIHNvIHRoYXQKLQkJCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBjb3VsZCB0ZWxsIGl0IGNvbnRhaW5pbmcgZWRpdG9yIHRoYXQKLQkJCQkvLyB0aGUgaW5wdXQgaGFzIGNoYW5nZSwgd2hlbiBhICdyZXNvdXJjZSBtb3ZlZCcgZXZlbnQgaXMKLQkJCQkvLyBmb3VuZC4KLQkJCQljYXNlIElFZGl0b3JQYXJ0LlBST1BfSU5QVVQgOiB7Ci0JCQkJICBpZiAoc291cmNlID09IGdldFRleHRFZGl0b3IoKSAmJiBmRGVzaWduVmlld2VyIGluc3RhbmNlb2YgWE1MVGFibGVUcmVlVmlld2VyKSB7Ci0JCQkJICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJCSAgICB0cnkgewotCQkJCSAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCSAgICAgICAgSURPTURvY3VtZW50IG1vZGVsRG9jdW1lbnQgPSAoKElET01Nb2RlbCltb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkgICAgICAgICAgICAgICAgICAgIE9iamVjdCBkZXNpZ25JbnB1dCA9ICgoWE1MVGFibGVUcmVlVmlld2VyKWZEZXNpZ25WaWV3ZXIpLmdldElucHV0KCk7Ci0JCQkJICAgICAgICBpZiAobW9kZWxEb2N1bWVudCAhPSBkZXNpZ25JbnB1dCkKLQkJCQkgICAgICAgICAgc2V0SW5wdXQoZ2V0VGV4dEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgfSBmaW5hbGx5IHsKLQkJCQkgICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkgICAgICAgIG1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCSAgICB9Ci0JCQkJICB9Ci0JCQkJfQotCQkJCWNhc2UgSUVkaXRvclBhcnQuUFJPUF9ESVJUWSA6IHsKLQkJCQkJaWYgKHNvdXJjZSA9PSBnZXRUZXh0RWRpdG9yKCkpIHsKLQkJCQkJCWlmIChnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSAhPSBnZXRFZGl0b3JJbnB1dCgpKSB7Ci0JCQkJCQkJc2V0SW5wdXQoZ2V0VGV4dEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQkJCS8qCi0JCQkJCQkJICogdGl0bGUgc2hvdWxkIGFsd2F5cyBjaGFuZ2Ugd2hlbiBpbnB1dCBjaGFuZ2VzLgotCQkJCQkJCSAqIGNyZWF0ZSBydW5uYWJsZSBmb3IgZm9sbG93aW5nIHBvc3QgY2FsbAotCQkJCQkJCSAqLwotCQkJCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlfZmlyZVByb3BlcnR5Q2hhbmdlKElXb3JrYmVuY2hQYXJ0LlBST1BfVElUTEUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfTsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIFVwZGF0ZSBpcyBqdXN0IHRvIHBvc3QgdGhpbmdzIG9uIHRoZSBkaXNwbGF5Ci0JCQkJCQkJICogcXVldWUgKHRocmVhZCkuIFdlIGhhdmUgdG8gZG8gdGhpcyB0byBnZXQgdGhlCi0JCQkJCQkJICogZGlydHkgcHJvcGVydHkgdG8gZ2V0IHVwZGF0ZWQgYWZ0ZXIgb3RoZXIKLQkJCQkJCQkgKiB0aGluZ3Mgb24gdGhlIHF1ZXVlIGFyZSBleGVjdXRlZC4KLQkJCQkJCQkgKi8KLQkJCQkJCQkoKENvbnRyb2wpIGdldFRleHRFZGl0b3IoKS5nZXRBZGFwdGVyKENvbnRyb2wuY2xhc3MpKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBJV29ya2JlbmNoUGFydC5QUk9QX1RJVExFIDogewotCQkJCQkvLyB1cGRhdGUgdGhlIGlucHV0IGlmIHRoZSB0aXRsZSBpcyBjaGFuZ2VkCi0JCQkJCWlmIChzb3VyY2UgPT0gZ2V0VGV4dEVkaXRvcigpKSB7Ci0JCQkJCQlpZiAoZ2V0VGV4dEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkgewotCQkJCQkJCXNldElucHV0KGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVmYXVsdCA6IHsKLQkJCQkJLy8gcHJvcGFnYXRlIGNoYW5nZXMuIElzIHRoaXMgbmVlZGVkPyBBbnN3ZXI6IFllcy4KLQkJCQkJaWYgKHNvdXJjZSA9PSBnZXRUZXh0RWRpdG9yKCkpIHsKLQkJCQkJCV9maXJlUHJvcGVydHlDaGFuZ2UocHJvcElkKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCWNsYXNzIFRleHRJbnB1dExpc3RlbmVyIGltcGxlbWVudHMgSVRleHRJbnB1dExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCQlpZiAoKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCkgJiYgKG5ld0lucHV0ICE9IG51bGwpKSB7Ci0JCQkJZkRlc2lnblZpZXdlci5zZXREb2N1bWVudChuZXdJbnB1dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBTdGF0dXNMaW5lTGFiZWxQcm92aWRlciBleHRlbmRzIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBlbGVtZW50OwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJcmV0dXJuIGdldFRleHQoKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKSk7Ci0JCQl9Ci0KLQkJCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQl3aGlsZSAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCXMuaW5zZXJ0KDAsIGFkYXB0ZXIuZ2V0TGFiZWxUZXh0KG5vZGUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJCXMuaW5zZXJ0KDAsIElQYXRoLlNFUEFSQVRPUik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJTm9kZSBub2RlID0gKE5vZGUpIGVsZW1lbnQ7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQlyZXR1cm4gZ2V0SW1hZ2UoKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKiogVGhlIGRlc2lnbiBwYWdlIGluZGV4LiAqLwotCXByaXZhdGUgaW50IGZEZXNpZ25QYWdlSW5kZXg7Ci0KLQkvKiogVGhlIGRlc2lnbiB2aWV3ZXIgKi8KLQlJRGVzaWduVmlld2VyIGZEZXNpZ25WaWV3ZXI7Ci0KLQlwcml2YXRlIEFjdGl2YXRpb25MaXN0ZW5lciBmQWN0aXZhdGlvbkxpc3RlbmVyOwotCi0JSVByb3BlcnR5TGlzdGVuZXIgZlByb3BlcnR5TGlzdGVuZXIgPSBudWxsOwotCi0JLyoqIFRoZSBzb3VyY2UgcGFnZSBpbmRleC4gKi8KLQlpbnQgZlNvdXJjZVBhZ2VJbmRleDsKLQotCS8qKiBUaGUgdGV4dCBlZGl0b3IuICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBmVGV4dEVkaXRvcjsKLQotCXByaXZhdGUgVGV4dEVkaXRvclBvc3RTZWxlY3Rpb25BZGFwdGVyIGZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgUGFnZUluaXRpYWxpemF0aW9uRGF0YSBmUGFnZUluaXRpYWxpemVyOwotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhNTE11bHRpUGFnZUVkaXRvclBhcnQoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTdGF0dXNMaW5lTGFiZWxQcm92aWRlciA9IG5ldyBTdGF0dXNMaW5lTGFiZWxQcm92aWRlcigpOwotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2QgaXMganVzdCB0byBtYWtlIGZpcmVQcm9wZXJ0eUNoYW5nZWQgYWNjZXNzaWJsZSBmcm9tIHNvbWUKLQkgKiAoYW5vbm9tb3VzKSBpbm5lciBjbGFzc2VzLgotCSAqLwotCXZvaWQgX2ZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHkpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBzb3VyY2UgcGFnZSBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFNvdXJjZVBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlmU291cmNlUGFnZUluZGV4ID0gYWRkUGFnZShmVGV4dEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCXNldFBhZ2VUZXh0KGZTb3VyY2VQYWdlSW5kZXgsIFhNTEVkaXRvck1lc3NhZ2VzLlhNTE11bHRpUGFnZUVkaXRvclBhcnRfMCk7Ci0KLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfVElUTEUpOwotCi0JCS8vIENoYW5nZXMgdG8gdGhlIFRleHQgVmlld2VyJ3MgZG9jdW1lbnQgaW5zdGFuY2Ugc2hvdWxkIGFsc28KLQkJLy8gZm9yY2UgYW4KLQkJLy8gaW5wdXQgcmVmcmVzaAotCQlmVGV4dEVkaXRvci5nZXRUZXh0Vmlld2VyKCkuYWRkVGV4dElucHV0TGlzdGVuZXIobmV3IFRleHRJbnB1dExpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIENvbm5lY3RzIHRoZSBkZXNpZ24gdmlld2VyIHdpdGggdGhlIHZpZXdlciBzZWxlY3Rpb24gbWFuYWdlci4gU2hvdWxkIGJlCi0JICogZG9uZSBhZnRlciBjcmVhdGVTb3VyY2VQYWdlKCkgaXMgZG9uZSBiZWNhdXNlIHdlIG5lZWQgdG8gZ2V0IHRoZQotCSAqIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgZnJvbSB0aGUgVGV4dEVkaXRvci4gc2V0TW9kZWwgaXMgYWxzbyBkb25lIGhlcmUKLQkgKiBiZWNhdXNlIGdldE1vZGVsKCkgbmVlZHMgdG8gcmVmZXJlbmNlIHRoZSBUZXh0RWRpdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25uZWN0RGVzaWduUGFnZSgpIHsKLQkJaWYgKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCkgewotCQkJZkRlc2lnblZpZXdlci5zZXREb2N1bWVudChnZXREb2N1bWVudCgpKTsKLQkJfQotCi0JCS8qCi0JCSAqIENvbm5lY3Qgc2VsZWN0aW9uIGZyb20gdGhlIERlc2lnbiBwYWdlIHRvIHRoZSBzZWxlY3Rpb24gcHJvdmlkZXIKLQkJICogZm9yIHRoZSBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0IHNvIHRoYXQgc2VsZWN0aW9uIGNoYW5nZXMgaW4gdGhlCi0JCSAqIERlc2lnbiBwYWdlIHdpbGwgcHJvcG9nYXRlIGFjcm9zcyB0aGUgd29ya2JlbmNoCi0JCSAqLwotCQlpZiAoZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJKChNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcikgZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmZpcmVQb3N0U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJKChNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcikgZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmZpcmVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQkJLyoKLQkJICogQ29ubmVjdCBzZWxlY3Rpb24gZnJvbSB0aGUgRGVzaWduIHBhZ2UgdG8gdGhlIHNlbGVjdGlvbiBwcm92aWRlciBvZgotCQkgKiB0aGUgU291cmNlIHBhZ2Ugc28gdGhhdCBzZWxlY3Rpb24gaW4gdGhlIERlc2lnbiBwYWdlIHdpbGwgZHJpdmUKLQkJICogc2VsZWN0aW9uIGluIHRoZSBTb3VyY2UgcGFnZS4gUHJlZmVyIHBvc3Qgc2VsZWN0aW9uLgotCQkgKi8KLQkJaWYgKGZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSBpbnN0YW5jZW9mIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8qCi0JCQkJCSAqIE9ubHkgZm9yY2Ugc2VsZWN0aW9uIHVwZGF0ZSBpZiBzb3VyY2UgcGFnZSBpcyBub3QKLQkJCQkJICogYWN0aXZlCi0JCQkJCSAqLwotCQkJCQlpZiAoZ2V0QWN0aXZlUGFnZSgpICE9IGZTb3VyY2VQYWdlSW5kZXgpIHsKLQkJCQkJCWdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIHsKLQkJCWZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJLyoKLQkJCQkJICogT25seSBmb3JjZSBzZWxlY3Rpb24gdXBkYXRlIGlmIHNvdXJjZSBwYWdlIGlzIG5vdAotCQkJCQkgKiBhY3RpdmUKLQkJCQkJICovCi0JCQkJCWlmIChnZXRBY3RpdmVQYWdlKCkgIT0gZlNvdXJjZVBhZ2VJbmRleCkgewotCQkJCQkJZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCQkvKiBCdWcgMjEwNDgxIC0gUmVtb3ZlZCBjYWxsIHRvIHVwZGF0ZVN0YXR1c0xpbmUgYmVjYXVzZSB0aGlzIGlzIGFscmVhZHkKLQkJCQkJICogaGFuZGxlZCBieSB0aGUgc2VsZWN0aW9uIGluIHRoZSBzb3VyY2UgcGFnZSAqLwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJLyoKLQkJICogSGFuZGxlIGRvdWJsZS1jbGljayBpbiB0aGUgRGVzaWduIHBhZ2UgYnkgc2VsZWN0aW5nIHRoZQotCQkgKiBjb3JyZXNwb25kaW5nIGFtb3VudCBvZiB0ZXh0IGluIHRoZSBTb3VyY2UgcGFnZS4KLQkJICovCi0JCWZEZXNpZ25WaWV3ZXIuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCWludCBzdGFydCA9IC0xOwotCQkJCWludCBsZW5ndGggPSAtMTsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJLyoKLQkJCQkJICogc2VsZWN0aW9uIGdvZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IG9iamVjdCB0bwotCQkJCQkgKiB0aGUgZW5kIG9mIHRoZSBsYXN0Ci0JCQkJCSAqLwotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJCU9iamVjdCBvID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJT2JqZWN0IG8yID0gbnVsbDsKLQkJCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJbzIgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLnRvQXJyYXkoKVtzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSAtIDFdOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbzIgPSBvOwotCQkJCQl9Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlsZW5ndGggPSAoKEluZGV4ZWRSZWdpb24pIG8yKS5nZXRFbmRPZmZzZXQoKSAtIHN0YXJ0OwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG8yIGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCXN0YXJ0ID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0U3RhcnQoKTsKLQkJCQkJCWxlbmd0aCA9ICgoSVRleHRSZWdpb24pIG8yKS5nZXRFbmQoKSAtIHN0YXJ0OwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJCXN0YXJ0ID0gKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKTsKLQkJCQkJbGVuZ3RoID0gKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRMZW5ndGgoKTsKLQkJCQl9Ci0JCQkJaWYgKChzdGFydCA+IC0xKSAmJiAobGVuZ3RoID4gLTEpKSB7Ci0JCQkJCWdldFRleHRFZGl0b3IoKS5zZWxlY3RBbmRSZXZlYWwoc3RhcnQsIGxlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvKgotCQkgKiBDb25uZWN0IHNlbGVjdGlvbiBmcm9tIHRoZSBTb3VyY2UgcGFnZSB0byB0aGUgc2VsZWN0aW9uIHByb3ZpZGVyIG9mCi0JCSAqIHRoZSBEZXNpZ24gcGFnZSBzbyB0aGF0IHNlbGVjdGlvbiBpbiB0aGUgU291cmNlIHBhZ2Ugd2lsbCBkcml2ZQotCQkgKiBzZWxlY3Rpb24gaW4gdGhlIERlc2lnbiBwYWdlLiBQcmVmZXIgcG9zdCBzZWxlY3Rpb24uCi0JCSAqLwotCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJaWYgKGZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBUZXh0RWRpdG9yUG9zdFNlbGVjdGlvbkFkYXB0ZXIoKTsKLQkJfQotCQlpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQlmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyLmZvcmNlUG9zdFNlbGVjdGlvbiA9IGZhbHNlOwotCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBwcm92aWRlcikuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCWZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIuZm9yY2VQb3N0U2VsZWN0aW9uID0gdHJ1ZTsKLQkJCXByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbmQgQWRkIHRoZSBEZXNpZ24gUGFnZSB1c2luZyBhIHJlZ2lzdGVyZWQgZmFjdG9yeQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVBbmRBZGREZXNpZ25QYWdlKCkgewotCQlJRGVzaWduVmlld2VyIGRlc2lnblZpZXdlciA9IGNyZWF0ZURlc2lnblBhZ2UoKTsKLQotCQlmRGVzaWduVmlld2VyID0gZGVzaWduVmlld2VyOwotCQkvLyBub3RlOiBCeSBhZGRpbmcgdGhlIGRlc2lnbiBwYWdlIGFzIGEgQ29udHJvbCBpbnN0ZWFkIG9mIGFuCi0JCS8vIElFZGl0b3JQYXJ0LCBwYWdlIHN3aXRjaGVzIHdpbGwgaW5kaWNhdGUKLQkJLy8gYSAibnVsbCIgYWN0aXZlIGVkaXRvciB3aGVuIHRoZSBkZXNpZ24gcGFnZSBpcyBtYWRlIGFjdGl2ZQotCQlmRGVzaWduUGFnZUluZGV4ID0gYWRkUGFnZShkZXNpZ25WaWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJc2V0UGFnZVRleHQoZkRlc2lnblBhZ2VJbmRleCwgZGVzaWduVmlld2VyLmdldFRpdGxlKCkpOwotCX0KLQotCXByb3RlY3RlZCBJRGVzaWduVmlld2VyIGNyZWF0ZURlc2lnblBhZ2UoKSB7Ci0JCVhNTFRhYmxlVHJlZVZpZXdlciB0YWJsZVRyZWVWaWV3ZXIgPSBuZXcgWE1MVGFibGVUcmVlVmlld2VyKGdldENvbnRhaW5lcigpKTsKLQkJLy8gU2V0IHRoZSBkZWZhdWx0IGluZm9wb3AgZm9yIFhNTCBkZXNpZ24gdmlld2VyLgotCQlYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRhYmxlVHJlZVZpZXdlci5nZXRDb250cm9sKCksIFhNTFRhYmxlVHJlZUhlbHBDb250ZXh0SWRzLlhNTF9ERVNJR05fVklFV19IRUxQSUQpOwotCQlyZXR1cm4gdGFibGVUcmVlVmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoaXMgbXVsdGktcGFnZSBlZGl0b3IuCi0JICogPHA+Ci0JICogU3ViY2xhc3NlcyBvZiA8Y29kZT5NdWx0aVBhZ2VFZGl0b3I8L2NvZGU+IG11c3QgaW1wbGVtZW50IHRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhZ2VzKCkgewotCQl0cnkgewotCQkJLy8gc291cmNlIHBhZ2UgTVVTVCBiZSBjcmVhdGVkIGJlZm9yZSBkZXNpZ24gcGFnZSwgbm93Ci0JCQljcmVhdGVTb3VyY2VQYWdlKCk7Ci0KLQkJCWNyZWF0ZUFuZEFkZERlc2lnblBhZ2UoKTsKLQkJCWFkZFNvdXJjZVBhZ2UoKTsKLQkJCWNvbm5lY3REZXNpZ25QYWdlKCk7Ci0KLQkJCS8vIHNldCB0aGUgYWN0aXZlIGVkaXRvciBpbiB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvciBmaXJzdAotCQkJLy8gYmVmb3JlIHNldGFjdGl2ZXBhZ2UgY2FsbHMgYWN0aW9uIGJhciBjb250cmlidXRvcidzCi0JCQkvLyBzZXRhY3RpdmVwYWdlIChidWcxNDEwMTMgLSByZW1vdmUgd2hlbiBidWcxNTE0ODggaXMgZml4ZWQpCi0JCQlJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSBnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCWlmIChjb250cmlidXRvciBpbnN0YW5jZW9mIE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQkJKChNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgY29udHJpYnV0b3IpLnNldEFjdGl2ZUVkaXRvcih0aGlzKTsKLQkJCX0KLQotCQkJaW50IGFjdGl2ZVBhZ2VJbmRleCA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludChJWE1MUHJlZmVyZW5jZU5hbWVzLkxBU1RfQUNUSVZFX1BBR0UpOwotCQkJaWYgKChhY3RpdmVQYWdlSW5kZXggPj0gMCkgJiYgKGFjdGl2ZVBhZ2VJbmRleCA8IGdldFBhZ2VDb3VudCgpKSkgewotCQkJCXNldEFjdGl2ZVBhZ2UoYWN0aXZlUGFnZUluZGV4KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldEFjdGl2ZVBhZ2UoZlNvdXJjZVBhZ2VJbmRleCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2NyZWF0ZVNpdGUob3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JTaXRlIGNyZWF0ZVNpdGUoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlFZGl0b3JTaXRlIHNpdGUgPSBudWxsOwotCQlpZiAoZWRpdG9yID09IGZUZXh0RWRpdG9yKSB7Ci0JCQlzaXRlID0gbmV3IE11bHRpUGFnZUVkaXRvclNpdGUodGhpcywgZWRpdG9yKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGUjZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCQkJCUlFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IHN1cGVyLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCQkJCUlFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBtdWx0aUNvbnRyaWJ1dG9yID0gWE1MTXVsdGlQYWdlRWRpdG9yUGFydC50aGlzLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJCQlpZiAobXVsdGlDb250cmlidXRvciBpbnN0YW5jZW9mIFhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQkJCQljb250cmlidXRvciA9ICgoWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIG11bHRpQ29udHJpYnV0b3IpLnNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yOwotCQkJCQl9Ci0JCQkJCXJldHVybiBjb250cmlidXRvcjsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCQkvLyBzZXRzIHRoaXMgaWQgc28gbmVzdGVkIGVkaXRvciBpcyBjb25zaWRlcmVkIHhtbCBzb3VyY2UKLQkJCQkJLy8gcGFnZQotCQkJCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCArICIuc291cmNlIjsgLy8kTk9OLU5MUy0xJDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWVsc2UgewotCQkJc2l0ZSA9IHN1cGVyLmNyZWF0ZVNpdGUoZWRpdG9yKTsKLQkJfQotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzb3VyY2UgcGFnZSBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWZUZXh0RWRpdG9yID0gY3JlYXRlVGV4dEVkaXRvcigpOwotCQlmVGV4dEVkaXRvci5zZXRFZGl0b3JQYXJ0KHRoaXMpOwotCQkKLQkJLyoKLQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzNDMwMSAtIFhNTCBlZGl0b3IKLQkJICogZG9lcyBub3QgcmVtZW1iZXIgZm9udCBzZXR0aW5ncwotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNnZXRTeW1ib2xpY0ZvbnROYW1lKCkKLQkJICovCi0JCWZQYWdlSW5pdGlhbGl6ZXIuc2VuZEluaXRpYWxpemF0aW9uRGF0YShmVGV4dEVkaXRvcik7Ci0KLQkJaWYgKGZQcm9wZXJ0eUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eUxpc3RlbmVyID0gbmV3IFByb3BlcnR5TGlzdGVuZXIoKTsKLQkJfQotCQlmVGV4dEVkaXRvci5hZGRQcm9wZXJ0eUxpc3RlbmVyKGZQcm9wZXJ0eUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlVGV4dEVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cnVjdHVyZWRUZXh0RWRpdG9yCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBjcmVhdGVUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0RWRpdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3REZXNpZ25QYWdlKCkgewotCQlpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKSB7Ci0JCQlmRGVzaWduVmlld2VyLnNldERvY3VtZW50KG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlhNTE11bHRpUGFnZUVkaXRvclBhcnQ6OmRpc3Bvc2UgZW50cnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZGlzY29ubmVjdERlc2lnblBhZ2UoKTsKLQotCQlpZiAoZkFjdGl2YXRpb25MaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlmQWN0aXZhdGlvbkxpc3RlbmVyLmRpc3Bvc2UoKTsKLQkJCWZBY3RpdmF0aW9uTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKChmVGV4dEVkaXRvciAhPSBudWxsKSAmJiAoZlByb3BlcnR5TGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCWZUZXh0RWRpdG9yLnJlbW92ZVByb3BlcnR5TGlzdGVuZXIoZlByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gbW92ZWQgdG8gbGFzdCB3aGVuIGFkZGVkIHdpbmRvdyAuLi4gc2VlbXMgbGlrZQotCQkvLyB3ZSdkIGJlIGluIGRhbmdlciBvZiBsb3Npbmcgc29tZSBkYXRhLCBsaWtlIHNpdGUsCi0JCS8vIG9yIHNvbWV0aGluZy4KLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dE11bHRpUGFnZUVkaXRvclBhcnQ6OmRpc3Bvc2UgZXhpdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmVGV4dEVkaXRvci5kb1NhdmUobW9uaXRvcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJZlRleHRFZGl0b3IuZG9TYXZlQXMoKTsKLQkJLyoKLQkJICogVXBkYXRlIHRoZSBkZXNpZ24gdmlld2VyIHNpbmNlIHRoZSBlZGl0b3IgaW5wdXQgd291bGQgaGF2ZSBjaGFuZ2VkCi0JCSAqIHRvIHRoZSBuZXcgZmlsZS4KLQkJICovCi0JCWlmIChmRGVzaWduVmlld2VyICE9IG51bGwpIHsKLQkJCWZEZXNpZ25WaWV3ZXIuc2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gd2UgZXh0ZW5kIHN1cGVyY2xhc3MsIG5vdCBvdmVycmlkZSBpdCwgc28gYWxsb3cgaXQgZmlyc3QKLQkJLy8gY2hhbmNlIHRvIHNhdGlzZnkgcmVxdWVzdC4KLQkJcmVzdWx0ID0gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJaWYgKGtleSA9PSBJRGVzaWduVmlld2VyLmNsYXNzKSB7Ci0JCQkJcmVzdWx0ID0gZkRlc2lnblZpZXdlcjsKLQotCQkJfQotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKLQkJCQlyZXN1bHQgPSBuZXcgSUdvdG9NYXJrZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJCQkJCVhNTE11bHRpUGFnZUVkaXRvclBhcnQudGhpcy5nb3RvTWFya2VyKG1hcmtlcik7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBETVc6IEknbSBidWxsZXQtcHJvb2ZpbmcgdGhpcyBiZWNhdXNlIGl0cyBiZWVuIHJlcG9ydGVkIChvbgotCQkJCSAqIHZlcnkgZWFybHkgdmVyc2lvbnMpIGEgbnVsbCBwb2ludGVyIHNvbWV0aW1lcyBoYXBwZW5zIGhlcmUKLQkJCQkgKiBvbiBzdGFydHVwLCB3aGVuIGFuIGVkaXRvciBoYXMgYmVlbiBsZWZ0IG9wZW4gd2hlbgotCQkJCSAqIHdvcmtiZW5jaCBzaHV0ZG93bi4KLQkJCQkgKi8KLQkJCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBmVGV4dEVkaXRvci5nZXRBZGFwdGVyKGtleSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChmVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNnZXRUaXRsZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkJaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RWRpdG9ySW5wdXQoKSAhPSBudWxsKSB7Ci0JCQkJdGl0bGUgPSBnZXRFZGl0b3JJbnB1dCgpLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRpdGxlID0gZ2V0VGV4dEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JCX0KLQkJaWYgKHRpdGxlID09IG51bGwpIHsKLQkJCXRpdGxlID0gZ2V0UGFydE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0Jdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCXNldEFjdGl2ZVBhZ2UoZlNvdXJjZVBhZ2VJbmRleCk7Ci0JCUlERS5nb3RvTWFya2VyKGZUZXh0RWRpdG9yLCBtYXJrZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkJLy8gd2Ugd2FudCB0byBsaXN0ZW4gZm9yIG91ciBvd24gYWN0aXZhdGlvbgotCQkJZkFjdGl2YXRpb25MaXN0ZW5lciA9IG5ldyBBY3RpdmF0aW9uTGlzdGVuZXIoc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBpbml0aWFsaXppbmcgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gKGZUZXh0RWRpdG9yICE9IG51bGwpICYmIGZUZXh0RWRpdG9yLmlzU2F2ZUFzQWxsb3dlZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVPbkNsb3NlTmVlZGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVPbkNsb3NlTmVlZGVkKCkgewotCQkvLyBvdmVycmlkaW5nIHN1cGVyIGNsYXNzIHNpbmNlIGl0IGRvZXMgYSBsb3dseSBpc0RpcnR5IQotCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZUZXh0RWRpdG9yLmlzU2F2ZU9uQ2xvc2VOZWVkZWQoKTsKLQkJfQotCQlyZXR1cm4gaXNEaXJ0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I3BhZ2VDaGFuZ2UoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotCQlzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0JCXNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KG5ld1BhZ2VJbmRleCk7Ci0KLQkJaWYgKG5ld1BhZ2VJbmRleCA9PSBmRGVzaWduUGFnZUluZGV4KSB7Ci0JCQkvLyBkZXNpZ24gcGFnZSBpc24ndCBhbiBJRWRpdG9yUGFydCwgdGhlcmVmb3JlIHdlIGhhdmUgdG8gc2VuZAotCQkJLy8gc2VsZWN0aW9uIGNoYW5nZXMgb3Vyc2VsdmVzCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJCQkoKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCSgoTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIpIGdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5maXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KGludCBuZXdQYWdlSW5kZXgpIHsKLQkJLy8gc2F2ZSB0aGUgbGFzdCBhY3RpdmUgcGFnZSBpbmRleCB0byBwcmVmZXJlbmNlIG1hbmFnZXIKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSVhNTFByZWZlcmVuY2VOYW1lcy5MQVNUX0FDVElWRV9QQUdFLCBuZXdQYWdlSW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNmaWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB7Ci0JCXN1cGVyLnNldEluaXRpYWxpemF0aW9uRGF0YShjZmlnLCBwcm9wZXJ0eU5hbWUsIGRhdGEpOwotCQlmUGFnZUluaXRpYWxpemVyID0gbmV3IFBhZ2VJbml0aWFsaXphdGlvbkRhdGEoY2ZpZywgcHJvcGVydHlOYW1lLCBkYXRhKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCS8qCi0JCSAqIElmIGRyaXZlbiBmcm9tIHRoZSBTb3VyY2UgcGFnZSwgaXQncyAibW9kZWwiIG1heSBub3QgYmUgdXAgdG8gZGF0ZQotCQkgKiB3aXRoIChvciBldmVuIGV4aXN0IGZvcikgdGhlIGlucHV0IGp1c3QgeWV0LiBMYXRlciBub3RpZmljYXRpb24KLQkJICogZnJvbSB0aGUgVGV4dFZpZXdlciBjb3VsZCBzZXQgdXMgc3RyYWlnaHQsIGFsdGhvdWdoIGl0J3Mgbm90Ci0JCSAqIGd1YXJhbnRlZWQgdG8gaGFwcGVuIGFmdGVyIHRoZSBtb2RlbCBoYXMgYmVlbiBjcmVhdGVkLgotCQkgKi8KLQkJc3VwZXIuc2V0SW5wdXQoaW5wdXQpOwotCQlpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKSB7Ci0JCQlmRGVzaWduVmlld2VyLnNldERvY3VtZW50KGdldERvY3VtZW50KCkpOwotCQl9Ci0JCXNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JfQotCi0Jdm9pZCB1cGRhdGVTdGF0dXNMaW5lKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJaWYgKGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlciAhPSBudWxsICYmIHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCUltYWdlIGltYWdlID0gbnVsbDsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCU9iamVjdCBmaXJzdEVsZW1lbnQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChmaXJzdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyLmdldFRleHQoZmlyc3RFbGVtZW50KTsKLQkJCQkJaW1hZ2UgPSBmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoKGZpcnN0RWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSh0ZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoaW1hZ2UsIHRleHQpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGExZmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIGJ1ZyAyMTIzMzAgLSBtaWdyYXRlIHRvIG9yZy5lY2xpcHNlLnVpLm1lbnVzIGV4dGVuc2lvbiBwb2ludAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuQ01Eb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLkluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5TaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzFfSUQgPSAic2VkLnRhYmxldHJlZS5zZXBhcmF0b3IuMSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERVNJR05fVklFV0VSX1NFUEFSQVRPUl8yX0lEID0gInNlZC50YWJsZXRyZWUuc2VwYXJhdG9yLjIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfWE1MX0lEID0gInNlZC50YWJsZXRyZWUudmFsaWRhdGVYTUwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMT0FEX0dSQU1NQVJfSUQgPSAic2VkLnRhYmxldHJlZS5yZWxvYWRHcmFtbWFyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRPR0dMRV9FRElUX01PREVfSUQgPSAic2VkLnRhYmxldHJlZS50b2dnbGVFZGl0TW9kZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBFWFBBTkRfQUxMX0lEID0gInNlZC50YWJsZXRyZWUuZXhwYW5kQWxsIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTExBUFNFX0FMTF9JRCA9ICJzZWQudGFibGV0cmVlLmNvbGxhcHNlQWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFRvZ2dsZUVkaXRNb2RlQWN0aW9uIHRvZ2dsZUFjdGlvbjsKLQlwcm90ZWN0ZWQgUmVsb2FkR3JhbW1hckFjdGlvbiByZWxvYWRHcmFtbWFyQWN0aW9uOwotCS8vIHByb3RlY3RlZCBWYWxpZGF0ZVhNTEFjdGlvbiB2YWxpZGF0ZVhNTEFjdGlvbjsKLQlwcm90ZWN0ZWQgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24gZXhwYW5kQWN0aW9uOwotCXByb3RlY3RlZCBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbiBjb2xsYXBzZUFjdGlvbjsKLQlwcm90ZWN0ZWQgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24geG1sTWVudUV4cGFuZEFjdGlvbjsKLQlwcm90ZWN0ZWQgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24geG1sTWVudUNvbGxhcHNlQWN0aW9uOwotCi0JcHVibGljIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbnRyaWJ1dGlvbnMoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlcikgewotLyoJCXRyeSB7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBERVNJR05fVklFV0VSX1NFUEFSQVRPUl8xX0lEKTsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIERFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzJfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgVkFMSURBVEVfWE1MX0lEKTsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIFJFTE9BRF9HUkFNTUFSX0lEKTsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIFRPR0dMRV9FRElUX01PREVfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgRVhQQU5EX0FMTF9JRCk7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBDT0xMQVBTRV9BTExfSUQpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0qLwkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9SZW1vdmUoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIGlkKSB7Ci0vKgkJdHJ5IHsKLQkJCWlmIChtYW5hZ2VyLmZpbmQoaWQpICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnJlbW92ZShpZCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLSovCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlpbml0KGJhcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycykgewotLy8JCUlUb29sQmFyTWFuYWdlciB0Ym0gPSBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0KLS8qCQlJTWVudU1hbmFnZXIgeG1sTWVudSA9IGJhcnMuZ2V0TWVudU1hbmFnZXIoKS5maW5kTWVudVVzaW5nUGF0aCgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5kZXNpZ24ueG1sbWVudSIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHhtbE1lbnUgPT0gbnVsbCkgewotCQkJeG1sTWVudSA9IG5ldyBNZW51TWFuYWdlcihYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8wLCAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5kZXNpZ24ueG1sbWVudSIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBGb3IgUkNQIHVzYWdlCi0JCQlpZiAoYmFycy5nZXRNZW51TWFuYWdlcigpLmZpbmQoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX1dJTkRPVykgIT0gbnVsbCkgewotCQkJCWJhcnMuZ2V0TWVudU1hbmFnZXIoKS5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX1dJTkRPVywgeG1sTWVudSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVDb250cmlidXRpb25zKHhtbE1lbnUpOwotCQl9Ci0KLQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCJERVNJR05fVklFV0VSX1NFUEFSQVRPUl8xX0lEIikpOyAvLyROT04tTkxTLTEkCi0qLwotCQkvLyBUb2dnbGVFZGl0TW9kZUFjdGlvbgotCQkvLyAgICAgICAgICAgCi0vKgkJdG9nZ2xlQWN0aW9uID0gbmV3IFRvZ2dsZUVkaXRNb2RlQWN0aW9uKCk7Ci0JCXRvZ2dsZUFjdGlvbi5zZXRJZChUT0dHTEVfRURJVF9NT0RFX0lEKTsKLQkJeG1sTWVudS5hZGQodG9nZ2xlQWN0aW9uKTsKLQkJdGJtLmFkZCh0b2dnbGVBY3Rpb24pOwotKi8KLQkJLy8gUmVsb2FkR3JhbW1hckFjdGlvbgotCQkvLwotLyoJCXJlbG9hZEdyYW1tYXJBY3Rpb24gPSBuZXcgUmVsb2FkR3JhbW1hckFjdGlvbigpOwotCQlyZWxvYWRHcmFtbWFyQWN0aW9uLnNldElkKFJFTE9BRF9HUkFNTUFSX0lEKTsKLQkJdGJtLmFkZChyZWxvYWRHcmFtbWFyQWN0aW9uKTsKLQkJeG1sTWVudS5hZGQocmVsb2FkR3JhbW1hckFjdGlvbik7Ci0KLQkJeG1sTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSovCi0JCS8vIEV4cGFuZENvbGxhcHNlQWN0aW9uCi0JCS8vCi0vKgkJeG1sTWVudUV4cGFuZEFjdGlvbiA9IG5ldyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbih0cnVlKTsKLQkJeG1sTWVudUV4cGFuZEFjdGlvbi5zZXRJZChFWFBBTkRfQUxMX0lEKTsKLQkJeG1sTWVudUV4cGFuZEFjdGlvbi5zZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzEpOwotCQl4bWxNZW51LmFkZCh4bWxNZW51RXhwYW5kQWN0aW9uKTsKLQotCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24gPSBuZXcgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24oZmFsc2UpOwotCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0SWQoQ09MTEFQU0VfQUxMX0lEKTsKLQkJeG1sTWVudUNvbGxhcHNlQWN0aW9uLnNldElkKEVYUEFORF9BTExfSUQpOwotCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8yKTsKLQkJeG1sTWVudS5hZGQoeG1sTWVudUNvbGxhcHNlQWN0aW9uKTsKLSovCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25XaXRoSWQoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBBY3Rpb24gYWN0aW9uLCBTdHJpbmcgaWQpIHsKLQkJYWN0aW9uLnNldElkKGlkKTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9ucyhJQWN0aW9uQmFycyBiYXJzKSB7Ci0vKgkJSVRvb2xCYXJNYW5hZ2VyIHRibSA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKERFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzJfSUQpKTsKLQotCQlleHBhbmRBY3Rpb24gPSBuZXcgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24odHJ1ZSk7Ci0JCWV4cGFuZEFjdGlvbi5zZXRJZChFWFBBTkRfQUxMX0lEKTsKLQkJdGJtLmFkZChleHBhbmRBY3Rpb24pOwotCi0JCWNvbGxhcHNlQWN0aW9uID0gbmV3IFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uKGZhbHNlKTsKLQkJY29sbGFwc2VBY3Rpb24uc2V0SWQoQ09MTEFQU0VfQUxMX0lEKTsKLQkJdGJtLmFkZChjb2xsYXBzZUFjdGlvbik7Ci0qLwkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLS8qCQlpZiAoZXhwYW5kQWN0aW9uICE9IG51bGwpIHsKLQkJCWV4cGFuZEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJeG1sTWVudUV4cGFuZEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0KLQkJaWYgKGNvbGxhcHNlQWN0aW9uICE9IG51bGwpIHsKLQkJCWNvbGxhcHNlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotKi8JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZWRpdG9yUGFydCA9IHRhcmdldEVkaXRvcjsKLQotLy8JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBnZXRNb2RlbEZvckVkaXRvclBhcnQodGFyZ2V0RWRpdG9yKTsKLS8qCQlyZWxvYWRHcmFtbWFyQWN0aW9uLnNldE1vZGVsKG1vZGVsKTsKLQkJdG9nZ2xlQWN0aW9uLnNldE1vZGVsUXVlcnkoTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShtb2RlbCkpOwotCi0JCVhNTFRhYmxlVHJlZVZpZXdlciB0YWJsZVRyZWVWaWV3ZXIgPSBnZXRUYWJsZVRyZWVWaWV3ZXJGb3JFZGl0b3JQYXJ0KGVkaXRvclBhcnQpOwotCQlpZiAodGFibGVUcmVlVmlld2VyICE9IG51bGwpIHsKLQkJCWV4cGFuZEFjdGlvbi5zZXRWaWV3ZXIodGFibGVUcmVlVmlld2VyKTsKLQkJCWNvbGxhcHNlQWN0aW9uLnNldFZpZXdlcih0YWJsZVRyZWVWaWV3ZXIpOwotCi0JCQl4bWxNZW51RXhwYW5kQWN0aW9uLnNldFZpZXdlcih0YWJsZVRyZWVWaWV3ZXIpOwotCQkJeG1sTWVudUNvbGxhcHNlQWN0aW9uLnNldFZpZXdlcih0YWJsZVRyZWVWaWV3ZXIpOwotCQl9Ci0qLwotCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIFhNTE11bHRpUGFnZUVkaXRvclBhcnQpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gZWRpdG9yUGFydC5nZXRTaXRlKCk7Ci0JCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIElFZGl0b3JTaXRlKSB7Ci0JCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9ICgoWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkgZWRpdG9yUGFydCkuZ2V0VGV4dEVkaXRvcigpOwotCQkJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSAoKElFZGl0b3JTaXRlKSBzaXRlKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKSk7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8sIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBUT0RPLi4uIHVuY29tbWVudCB0aGlzIGFuZCBpbnZlc3RpZ2F0ZSBOUEUKLQkJLy8KLQkJLy8gYWRkIHRoZSBjdXQvY29weS9wYXN0ZSBmb3IgdGV4dCBmaWVsZHMKLQkJLy8gQWN0aW9uSGFuZGxlclBsdWdpbi5jb25uZWN0UGFydChlZGl0b3JQYXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSUFjdGlvbiBnZXRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgYWN0aW9uSWQpIHsKLQkJcmV0dXJuIChlZGl0b3IgPT0gbnVsbCA/IG51bGwgOiBlZGl0b3IuZ2V0QWN0aW9uKGFjdGlvbklkKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkgewotCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgdGV4dEVkaXRvciA9ICgoWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkgdGFyZ2V0RWRpdG9yKS5nZXRUZXh0RWRpdG9yKCk7Ci0JCQlyZXN1bHQgPSAodGV4dEVkaXRvciAhPSBudWxsKSA/IHRleHRFZGl0b3IuZ2V0TW9kZWwoKSA6IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MVGFibGVUcmVlVmlld2VyIGdldFRhYmxlVHJlZVZpZXdlckZvckVkaXRvclBhcnQoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCVhNTFRhYmxlVHJlZVZpZXdlciByZXN1bHQgPSBudWxsOwotCQlPYmplY3Qgb2JqZWN0ID0gdGFyZ2V0RWRpdG9yLmdldEFkYXB0ZXIoSURlc2lnblZpZXdlci5jbGFzcyk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBYTUxUYWJsZVRyZWVWaWV3ZXIpIHsKLQkJCXJlc3VsdCA9IChYTUxUYWJsZVRyZWVWaWV3ZXIpIG9iamVjdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBjbGFzcyBUb2dnbGVFZGl0TW9kZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3Igb25JbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRVRPT0xfQ09OU1RSQUlOT04pOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIG9mZkltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19FVE9PTF9DT05TVFJBSU5PRkYpOwotCQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotCi0JCXB1YmxpYyBUb2dnbGVFZGl0TW9kZUFjdGlvbigpIHsKLQkJCXNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJCWludCBuZXdTdGF0ZSA9IGdldE5leHRTdGF0ZShtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCkpOwotCQkJCW1vZGVsUXVlcnkuc2V0RWRpdE1vZGUobmV3U3RhdGUpOwotCQkJCXNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShuZXdTdGF0ZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRNb2RlbFF1ZXJ5KE1vZGVsUXVlcnkgbmV3TW9kZWxRdWVyeSkgewotCQkJbW9kZWxRdWVyeSA9IG5ld01vZGVsUXVlcnk7Ci0JCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJc2V0QXBwZWFyYW5jZUZvckVkaXRNb2RlKG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRBcHBlYXJhbmNlRm9yRWRpdE1vZGUoaW50IGVkaXRNb2RlKSB7Ci0JCQlpZiAoZWRpdE1vZGUgPT0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUKSB7Ci0JCQkJc2V0VG9vbFRpcFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMyk7Ci0JCQkJc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl80KTsKLQkJCQlzZXRJbWFnZURlc2NyaXB0b3Iob25JbWFnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRUb29sVGlwVGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81KTsKLQkJCQlzZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzYpOwotCQkJCXNldEltYWdlRGVzY3JpcHRvcihvZmZJbWFnZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5leHRTdGF0ZShpbnQgZWRpdE1vZGUpIHsKLQkJCWludCByZXN1bHQgPSAtMTsKLQkJCWlmIChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpIHsKLQkJCQlyZXN1bHQgPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9VTkNPTlNUUkFJTkVEOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBjbGFzcyBSZWxvYWRHcmFtbWFyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkJcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWw7Ci0KLQkJcHVibGljIFJlbG9hZEdyYW1tYXJBY3Rpb24oKSB7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZURlc2NyaXB0b3IoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX0RUT09MX1JMREdSTVIpKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZURlc2NyaXB0b3IoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX0VUT09MX1JMREdSTVIpKTsKLQkJCXNldFRvb2xUaXBUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzcpOwotCQkJc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl84KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJCXRoaXMubW9kZWwgPSBuZXdNb2RlbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShtb2RlbCk7Ci0JCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJaWYgKChtb2RlbFF1ZXJ5ICE9IG51bGwpICYmIChtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkgIT0gbnVsbCkpIHsKLQkJCQkJbW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpLmdldENNRG9jdW1lbnRDYWNoZSgpLmNsZWFyKCk7Ci0JCQkJCS8vIFRPRE8uLi4gbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBhY2Nlc3MgdGhlCi0JCQkJCS8vIERPTU9ic2VydmVyIHZpYSBNb2RlbFF1ZXJ5Ci0JCQkJCS8vIC4uLndoeT8KLQkJCQkJQ01Eb2N1bWVudExvYWRlciBsb2FkZXIgPSBuZXcgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyKGRvY3VtZW50LCBtb2RlbFF1ZXJ5KTsKLQkJCQkJbG9hZGVyLmxvYWRDTURvY3VtZW50cygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxMzMyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIsIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIENNRG9jdW1lbnRNYW5hZ2VyIGRvY3VtZW50TWFuYWdlcjsKLQotCVN0cnVjdHVyZWRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0KLQlwcml2YXRlIFRyZWVDb250ZW50SGVscGVyIHRyZWVDb250ZW50SGVscGVyID0gbmV3IFRyZWVDb250ZW50SGVscGVyKCk7Ci0KLQlwdWJsaWMgWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vCi0JLy8gSUxhYmVsUHJvdmlkZXIgc3R1ZmYKLQkvLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gc2luY2Ugd2UgYWx3YXlzIHJldHVybiAnZmFsc2UnIGZvciAiaXNMYWJlbFByb3BlcnR5IiwKLQkJLy8gbm90IG5lZWQgdG8gbGlzdGVuLiBNYXliZSB0aGF0IHNob3VsZCBjaGFuZ2Ugc29tZSBkYXk/Ci0JfQotCi0JLy8gQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcgotCS8vCi0JcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSkgewotCQlkb0RlbGF5ZWRSZWZyZXNoRm9yVmlld2VycygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNhY2hlVXBkYXRlZChDTURvY3VtZW50Q2FjaGUgY2FjaGUsIGZpbmFsIFN0cmluZyB1cmksIGludCBvbGRTdGF0dXMsIGludCBuZXdTdGF0dXMsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkgewotCQlpZiAoKG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0xPQURFRCkgfHwgKG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKSkgewotCQkJZG9EZWxheWVkUmVmcmVzaEZvclZpZXdlcnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvRGVsYXllZFJlZnJlc2hGb3JWaWV3ZXJzKCkgewotCQlpZiAoKGZWaWV3ZXIgIT0gbnVsbCkgJiYgIWZWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJZlZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoKGZWaWV3ZXIgIT0gbnVsbCkgJiYgIWZWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJZlZpZXdlci5yZWZyZXNoKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQl9Ci0JCXJldHVybiB0cmVlQ29udGVudEhlbHBlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiAoY29sdW1uSW5kZXggPT0gMCkgPyBnZXRJbWFnZShvYmplY3QpIDogbnVsbDsKLQl9Ci0KLQkvLwotCS8vIElUYWJsZUxhYmVsUHJvdmlkZXIgc3R1ZmYKLQkvLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoY29sdW1uID09IDApIHsKLQkJCXJlc3VsdCA9IGdldFRleHQob2JqZWN0KTsKLQkJfQotCQllbHNlIGlmICgoY29sdW1uID09IDEpICYmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmVzdWx0ID0gdHJlZUNvbnRlbnRIZWxwZXIuZ2V0Tm9kZVZhbHVlKChOb2RlKSBvYmplY3QpOwotCQl9Ci0JCXJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJKChJTm9kZU5vdGlmaWVyKSBvYmplY3QpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQl9Ci0KLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfQVRUUklCVVRFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9DREFUQVNFQ1RJT04pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0NPTU1FTlQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0RPQ1RZUEUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0VMRU1FTlQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfVFhURVhUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9FTlRJVFlfUkVGRVJFTkNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJLy8gSW1hZ2UgbWFya2VyT3ZlcmxheUltYWdlID0KLQkJCS8vIG92ZXJsYXlJY29uTWFuYWdlci5nZXRPdmVybGF5SW1hZ2VGb3JPYmplY3Qobm9kZSk7Ci0JCQkvLyBpZiAobWFya2VyT3ZlcmxheUltYWdlICE9IG51bGwpIHsKLQkJCS8vIGltYWdlID0gaW1hZ2VGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZUltYWdlKGltYWdlLAotCQkJLy8gbWFya2VyT3ZlcmxheUltYWdlLCBJbWFnZUZhY3RvcnkuQk9UVE9NX0xFRlQpOwotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCSgoSU5vZGVOb3RpZmllcikgbykuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCX0KLQotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgbzsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCXJlc3VsdCA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBudWxsOwotCi0JCWZvciAoTm9kZSBjaGlsZE5vZGUgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkTm9kZSAhPSBudWxsOyBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcm9vdEVsZW1lbnQgPSAoRWxlbWVudCkgY2hpbGROb2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByb290RWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJKChJTm9kZU5vdGlmaWVyKSBvYmplY3QpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQl9Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9ICJET0NUWVBFIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpLmdldFRhcmdldCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy8gcmVtb3ZlIG91ciBsaXN0ZW5lcnMgdG8gdGhlIG9sZCBzdGF0ZQotCQlpZiAob2xkSW5wdXQgIT0gbnVsbCkgewotCQkJRG9jdW1lbnQgZG9tRG9jID0gKERvY3VtZW50KSBvbGRJbnB1dDsKLQkJCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvbURvYyk7Ci0JCQlpZiAobXEgIT0gbnVsbCkgewotCQkJCWRvY3VtZW50TWFuYWdlciA9IG1xLmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKG9sZElucHV0ICE9IG51bGwpICYmIChvbGRJbnB1dCBpbnN0YW5jZW9mIElET01Ob2RlKSkgewotCQkJSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KSAoKElET01Ob2RlKSBvbGRJbnB1dCkuZ2V0TW9kZWwoKS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5Rm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlmYWN0b3J5LnJlbW92ZUxpc3RlbmVyKHZpZXdlcik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcjsKLQkJfQotCi0JCWlmICgobmV3SW5wdXQgIT0gbnVsbCkgJiYgKG5ld0lucHV0IGluc3RhbmNlb2YgSURPTU5vZGUpKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSURPTU5vZGUpIG5ld0lucHV0KS5nZXRNb2RlbCgpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuZXdJbnB1dCAhPSBudWxsKSB7Ci0JCQlEb2N1bWVudCBkb21Eb2MgPSAoRG9jdW1lbnQpIG5ld0lucHV0OwotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9tRG9jKTsKLQotCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQlkb2N1bWVudE1hbmFnZXIgPSBtcS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlkb2N1bWVudE1hbmFnZXIuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FTWU5DX0xPQUQsIHRydWUpOwotCQkJCQlkb2N1bWVudE1hbmFnZXIuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JfQotCi0JLy8gdGhlIGZvbGxvd2luZyBtZXRob2RzIGhhbmRsZSBmaWx0ZXJpbmcgYXNwZWN0cyBvZiB0aGUgdmlld2VyCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlVGV4dChOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlTdHJpbmcgZGF0YSA9ICgoVGV4dCkgbm9kZSkuZ2V0RGF0YSgpOwotCQkJCXJlc3VsdCA9ICgoZGF0YSA9PSBudWxsKSB8fCAoZGF0YS50cmltKCkubGVuZ3RoKCkgPT0gMCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoY21Eb2N1bWVudE1hbmFnZXIuZ2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FVVE9fTE9BRCkpIHsKLQkJCWRvRGVsYXllZFJlZnJlc2hGb3JWaWV3ZXJzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIHNpbmNlIHdlIGFsd2F5cyByZXR1cm4gJ2ZhbHNlJyBmb3IgImlzTGFiZWxQcm9wZXJ0eSIsCi0JCS8vIG5vdCBuZWVkIHRvIGxpc3Rlbi4gTWF5YmUgdGhhdCBzaG91bGQgY2hhbmdlIHNvbWUgZGF5PwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGJjNGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0KLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgVGFibGVUcmVlIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MVGFibGVUcmVlSGVscENvbnRleHRJZHMgewotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gWE1MVUlQbHVnaW4uSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFhNTCBEZXNpZ24gVmlldwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ERVNJR05fVklFV19IRUxQSUQgPSBQUkVGSVggKyAieG1sbTMwMDAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjliNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlRleHRQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgWE1MVGFibGVUcmVlUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSBleHRlbmRzIERPTVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkgewotCi0JcHJvdGVjdGVkIFRyZWVDb250ZW50SGVscGVyIHRyZWVDb250ZW50SGVscGVyID0gbmV3IFRyZWVDb250ZW50SGVscGVyKCk7Ci0KLQlwdWJsaWMgWE1MVGFibGVUcmVlUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JIZWxwZXIoU3RyaW5nIG5hbWUsIEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSkgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0KLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlTdHJpbmdbXSB2YWx1ZXNBcnJheSA9IG51bGw7Ci0JCWlmIChtcSAhPSBudWxsKSB7Ci0JCQl2YWx1ZXNBcnJheSA9IG1xLmdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoZWxlbWVudCwgY21Ob2RlKTsKLQkJfQotCQlpZiAoKHZhbHVlc0FycmF5ICE9IG51bGwpICYmICh2YWx1ZXNBcnJheS5sZW5ndGggPiAwKSkgewotCQkJcmVzdWx0ID0gbmV3IEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgbmFtZSwgdmFsdWVzQXJyYXkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihuYW1lKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcihUZXh0IHRleHQpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCQlOb2RlIHBhcmVudE5vZGUgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKChwYXJlbnROb2RlICE9IG51bGwpICYmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpKSB7Ci0JCQlFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHRleHQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbnVsbDsKLQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJZWQgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9ySGVscGVyKEhBQ0ssIHBhcmVudEVsZW1lbnQsIGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IocGFyZW50RWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSywgSEFDSyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUF0dHJpYnV0ZVByb3BlcnR5RGVzY3JpcHRvcihBdHRyIGF0dHIpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCi0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGF0dHIuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gbnVsbDsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCWFkID0gbXEuZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLQkJfQotCQlpZiAoYWQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9ySGVscGVyKGF0dHJpYnV0ZU5hbWUsIGF0dHIuZ2V0T3duZXJFbGVtZW50KCksIGFkKTsKLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQkJTGlzdCBsaXN0ID0gdHJlZUNvbnRlbnRIZWxwZXIuZ2V0RWxlbWVudFRleHRDb250ZW50KGVsZW1lbnQpOwotCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQlUZXh0IHRleHQgPSB0cmVlQ29udGVudEhlbHBlci5nZXRFZmZlY3RpdmVUZXh0Tm9kZUZvckNvbWJpbmVkTm9kZUxpc3QobGlzdCk7Ci0JCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcih0ZXh0KTsKLQkJCX0KLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSywgSEFDSyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzFmMmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ob2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuWE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kbmQuRHJhZ05vZGVDb21tYW5kOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWE1MVGFibGVUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciBpbXBsZW1lbnRzIElEZXNpZ25WaWV3ZXIgewotCi0JY2xhc3MgTm9kZUFjdGlvbk1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkvLyB1c2VkIHRvIGRpc2FibGUgTm9kZVNlbGVjdGlvbiBsaXN0ZW5pbmcgd2hpbGUgcnVubmluZwotCQkJLy8gTm9kZUFjdGlvbgotCQkJWE1MTm9kZUFjdGlvbk1hbmFnZXIgbm9kZUFjdGlvbk1hbmFnZXIgPSBuZXcgWE1MTm9kZUFjdGlvbk1hbmFnZXIoKChJRE9NRG9jdW1lbnQpIGdldElucHV0KCkpLmdldE1vZGVsKCksIFhNTFRhYmxlVHJlZVZpZXdlci50aGlzKSB7Ci0JCQkJcHVibGljIHZvaWQgYmVnaW5Ob2RlQWN0aW9uKE5vZGVBY3Rpb24gYWN0aW9uKSB7Ci0JCQkJCXN1cGVyLmJlZ2luTm9kZUFjdGlvbihhY3Rpb24pOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGVuZE5vZGVBY3Rpb24oTm9kZUFjdGlvbiBhY3Rpb24pIHsKLQkJCQkJc3VwZXIuZW5kTm9kZUFjdGlvbihhY3Rpb24pOwotCQkJCX0KLQkJCX07Ci0JCQlub2RlQWN0aW9uTWFuYWdlci5maWxsQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIGdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFNlbGVjdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSVBvc3RTZWxlY3Rpb25Qcm92aWRlciB7Ci0KLQkJcHVibGljIHZvaWQgYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJWE1MVGFibGVUcmVlVmlld2VyLnRoaXMucmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJWE1MVGFibGVUcmVlVmlld2VyLnRoaXMuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJCXJldHVybiBYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlib29sZWFuIHNlbGVjdGlvblNldCA9IGZhbHNlOwotCQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJCQotCQkJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkJCUlET01Ob2RlIGRvbU5vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGRvbU5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQlJVGV4dFJlZ2lvbiBtYXRjaGluZ1JlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQkJCQlpbnQgYWxsb3dlZEl0ZXJhdGlvbnMgPSA0MDsKLQkJCQkJCQkJd2hpbGUgKG1hdGNoaW5nUmVnaW9uICE9IG51bGwgJiYgIW1hdGNoaW5nUmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSAmJiBhbGxvd2VkSXRlcmF0aW9ucyA+IDApIHsKLQkJCQkJCQkJCW1hdGNoaW5nUmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobWF0Y2hpbmdSZWdpb24pIC0gMSk7Ci0JCQkJCQkJCQlhbGxvd2VkSXRlcmF0aW9ucy0tOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChtYXRjaGluZ1JlZ2lvbiAhPSBudWxsICYmIG1hdGNoaW5nUmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJCQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChtYXRjaGluZ1JlZ2lvbik7Ci0JCQkJCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGRvbU5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBhdHRyTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCQlOb2RlIGF0dHIgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQkJCQkJCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlzZWxlY3Rpb25TZXQgPSB0cnVlOwotCQkJCQkJCQkJCQlYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYXR0cikpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghc2VsZWN0aW9uU2V0KSB7Ci0JCQkJWE1MVGFibGVUcmVlVmlld2VyLnRoaXMuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JcHJvdGVjdGVkIFhNTFRyZWVFeHRlbnNpb24gdHJlZUV4dGVuc2lvbjsKLQkKLQlwcml2YXRlIElTZWxlY3Rpb25Qcm92aWRlciBmU2VsZWN0aW9uUHJvdmlkZXIgPSBuZXcgU2VsZWN0aW9uUHJvdmlkZXIoKTsKLQotCXB1YmxpYyBYTUxUYWJsZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0KLQkJLy8gc2V0IHVwIHByb3ZpZGVycwotCQl0aGlzLnRyZWVFeHRlbnNpb24gPSBuZXcgWE1MVHJlZUV4dGVuc2lvbihnZXRUcmVlKCkpOwotCi0JCVhNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIoKTsKLQkJc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0KLQkJY3JlYXRlQ29udGV4dE1lbnUoKTsKLQotCQlEcmFnU291cmNlIGRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShnZXRDb250cm9sKCksIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFKTsKLQkJZHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIoY3JlYXRlRHJhZ1NvdXJjZUxpc3RlbmVyKCkpOwotCQlkcmFnU291cmNlLnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCl9KTsKLQkJRHJvcFRhcmdldCBkcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoZ2V0Q29udHJvbCgpLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSk7Ci0JCWRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKGNyZWF0ZURyb3BUYXJnZXRMaXN0ZW5lcigpKTsKLQkJZHJvcFRhcmdldC5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbXSB7TG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbAotCSAqIHJlZ2lzdGVyaW5nIHRoZSBtZW51IGZvciBleHRlbnNpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBOb2RlQWN0aW9uTWVudUxpc3RlbmVyKCkpOwotCQlNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudShnZXRDb250cm9sKCkpOwotCQlnZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQl9Ci0KLQlwcml2YXRlIERyYWdTb3VyY2VMaXN0ZW5lciBjcmVhdGVEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCUxvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLnNldFNlbGVjdGlvbihnZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBEcm9wVGFyZ2V0TGlzdGVuZXIgY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERyb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQub3BlcmF0aW9ucyAhPSBETkQuRFJPUF9OT05FICYmIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCWRyYWdPdmVyKGV2ZW50KTsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBldmVudC5pdGVtICE9IG51bGwgJiYgZXZlbnQuaXRlbS5nZXREYXRhKCkgIT0gbnVsbCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIHRoZSBjb21tYW5kIHVzZXMgdGhlc2UgbnVtYmVycyBpbnN0ZWFkIG9mIHRoZQotCQkJCQkJICogZmVlZGJhY2sgY29uc3RhbnRzIChldmVuIHRob3VnaCBpdCBjb252ZXJ0cyBpbgotCQkJCQkJICogdGhlIG90aGVyIGRpcmVjdGlvbiBhcyB3ZWxsKQotCQkJCQkJICovCi0JCQkJCQlmbG9hdCBmZWVkYmFja0Zsb2F0ID0gZ2V0SGVpZ2h0SW5JdGVtKGV2ZW50KTsKLQotCQkJCQkJZmluYWwgRHJhZ05vZGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgRHJhZ05vZGVDb21tYW5kKGV2ZW50Lml0ZW0uZ2V0RGF0YSgpLCBmZWVkYmFja0Zsb2F0LCBldmVudC5vcGVyYXRpb25zLCBldmVudC5kZXRhaWwsIHNlbGVjdGlvbi50b0xpc3QoKSwgWE1MVGFibGVUcmVlVmlld2VyLnRoaXMpOwotCQkJCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBjb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCVNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQkJZmxvYXQgZmVlZGJhY2tGbG9hdCA9IGdldEhlaWdodEluSXRlbShldmVudCk7Ci0JCQkJaWYgKGZlZWRiYWNrRmxvYXQgPiAwLjc1KSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZmVlZGJhY2tGbG9hdCA8IDAuMjUpIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLQkJCQl9Ci0JCQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX0VYUEFORCB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgZmxvYXQgZ2V0SGVpZ2h0SW5JdGVtKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlmKGV2ZW50Lml0ZW0gPT0gbnVsbCkgcmV0dXJuIC41ZjsKLQkJCQlpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0JCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCQlDb250cm9sIGNvbnRyb2wgPSB0cmVlSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQkJUG9pbnQgcG9pbnQgPSBjb250cm9sLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJCXJldHVybiAoZmxvYXQpIChwb2ludC55IC0gYm91bmRzLnkpIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCX0KLQkJCQllbHNlIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotCQkJCQlDb250cm9sIGNvbnRyb2wgPSB0YWJsZUl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCVBvaW50IHBvaW50ID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYmxlSXRlbS5nZXRCb3VuZHMoMCk7Ci0JCQkJCXJldHVybiAoZmxvYXQpIChwb2ludC55IC0gYm91bmRzLnkpIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIDAuMEY7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2goT2JqZWN0IG8sIGJvb2xlYW4gZnJvbURlbGF5ZWQpIHsKLQkJdHJlZUV4dGVuc2lvbi5yZXNldENhY2hlZERhdGEoKTsKLQkJc3VwZXIucmVmcmVzaChvKTsKLQl9Ci0KLQlwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIGdldFNlbGVjdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gZlNlbGVjdGlvblByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVWaWV3ZXJfMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEaXNwb3NlKERpc3Bvc2VFdmVudCBldmVudCkgewotCQlzdXBlci5oYW5kbGVEaXNwb3NlKGV2ZW50KTsKLQkJdHJlZUV4dGVuc2lvbi5kaXNwb3NlKCk7Ci0JCXNldERvY3VtZW50KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyZWVFeHRlbnNpb24ucmVzZXRDYWNoZWREYXRhKCk7Ci0JCXN1cGVyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBvKSB7Ci0JCXRyZWVFeHRlbnNpb24ucmVzZXRDYWNoZWREYXRhKCk7Ci0JCXN1cGVyLnJlZnJlc2gobyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaChib29sZWFuIHVwZGF0ZUxhYmVscykgewotCQl0cmVlRXh0ZW5zaW9uLnJlc2V0Q2FjaGVkRGF0YSgpOwotCQlzdXBlci5yZWZyZXNoKHVwZGF0ZUxhYmVscyk7Ci0JCWdldENvbnRyb2woKS5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBlbGVtZW50LCBib29sZWFuIHVwZGF0ZUxhYmVscykgewotCQl0cmVlRXh0ZW5zaW9uLnJlc2V0Q2FjaGVkRGF0YSgpOwotCQlzdXBlci5yZWZyZXNoKGVsZW1lbnQsIHVwZGF0ZUxhYmVscyk7Ci0JCWdldENvbnRyb2woKS5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLyoKLQkJICogbGV0IHRoZSB0ZXh0IGVkaXRvciB0byBiZSB0aGUgb25lIHRoYXQgbWFuYWdlcyB0aGUgbW9kZWwncyBsaWZldGltZQotCQkgKi8KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCi0JCQlpZiAoKG1vZGVsICE9IG51bGwpICYmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHsKLQkJCQlEb2N1bWVudCBkb21Eb2MgPSBudWxsOwotCQkJCWRvbURvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlzZXRJbnB1dChkb21Eb2MpOwotCQkJCXRyZWVFeHRlbnNpb24uc2V0SXNVbnN1cHBvcnRlZElucHV0KGZhbHNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRyZWVFeHRlbnNpb24uc2V0SXNVbnN1cHBvcnRlZElucHV0KHRydWUpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVHJlZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVHJlZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmNmYzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRyZWVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRGVzY3JpcHRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhNTFRyZWVFeHRlbnNpb24gZXh0ZW5kcyBUcmVlRXh0ZW5zaW9uIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUlVDVFVSRV9QUk9QRVJUWSA9IFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRyZWVFeHRlbnNpb25fMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxVRV9QUk9QRVJUWSA9IFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRyZWVFeHRlbnNpb25fMTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLQlwcm90ZWN0ZWQgTXlDZWxsTW9kaWZpZXIgbW9kaWZpZXI7Ci0JcHJvdGVjdGVkIFhNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkgcHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeTsKLQlwcm90ZWN0ZWQgQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZGVjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQlwcm90ZWN0ZWQgVHJlZUNvbnRlbnRIZWxwZXIgdHJlZUNvbnRlbnRIZWxwZXIgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKTsKLQotCXByb3RlY3RlZCBDb2xvciBmMSwgZjIsIGIxLCBiMjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYWNoZWREYXRhSXNWYWxpZCA9IHRydWU7Ci0KLQlwdWJsaWMgWE1MVHJlZUV4dGVuc2lvbihUcmVlIHRyZWUpIHsKLQkJc3VwZXIodHJlZSk7Ci0JCWNvbnRyb2wgPSB0cmVlOwotCQltb2RpZmllciA9IG5ldyBNeUNlbGxNb2RpZmllcigpOwotCQlzZXRDZWxsTW9kaWZpZXIobW9kaWZpZXIpOwotCQlTdHJpbmdbXSBwcm9wZXJ0aWVzID0ge1NUUlVDVFVSRV9QUk9QRVJUWSwgVkFMVUVfUFJPUEVSVFl9OwotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCi0JCS8qIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODU4NTEgLSBVc2VkIHRvIGJlIGhhcmRjb2RlZCBhcyBDT0xPUl9CTEFDSyAqLwotCQlmMSA9IHRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotCQlDb2xvciBiYWNrZ3JvdW5kID0gdHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0KLQkJaW50IHIgPSBNYXRoLmFicyhiYWNrZ3JvdW5kLmdldFJlZCgpIC0gMTI1KTsKLQkJaW50IGcgPSBNYXRoLmFicyhiYWNrZ3JvdW5kLmdldEdyZWVuKCkgLSA4NSk7Ci0JCWludCBiID0gTWF0aC5hYnMoYmFja2dyb3VuZC5nZXRCbHVlKCkgLSAxMDUpOwotCi0JCWYyID0gbmV3IENvbG9yKHRyZWUuZ2V0RGlzcGxheSgpLCByLCBnLCBiKTsKLQkJYjEgPSB0cmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pOwotCQliMiA9IGJhY2tncm91bmQ7Ci0KLQkJcHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSA9IG5ldyBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlmMi5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRDYWNoZWREYXRhKCkgewotCQljYWNoZWREYXRhSXNWYWxpZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50SXRlbXMoR0MgZ2MsIFRyZWVJdGVtW10gaXRlbXMsIFJlY3RhbmdsZSB0cmVlQm91bmRzKSB7Ci0JCXN1cGVyLnBhaW50SXRlbXMoZ2MsIGl0ZW1zLCB0cmVlQm91bmRzKTsKLQkJY2FjaGVkRGF0YUlzVmFsaWQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3RbXSBjb21wdXRlVHJlZUV4dGVuc2lvbkRhdGEoT2JqZWN0IG9iamVjdCkgewotCQlDb2xvciBjb2xvciA9IGYxOwotCQlTdHJpbmcgc3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdHJpbmcgPSAoU3RyaW5nKSBtb2RpZmllci5nZXRWYWx1ZShvYmplY3QsIFZBTFVFX1BST1BFUlRZKTsKLQkJCWNvbG9yID0gZjE7Ci0JCX0KLQkJaWYgKChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgJiYgKG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7Ci0JCQlzdHJpbmcgPSBnZXRFbGVtZW50VmFsdWVIZWxwZXIoKEVsZW1lbnQpIG9iamVjdCk7Ci0JCQljb2xvciA9IGYyOwotCQl9Ci0JCU9iamVjdFtdIGRhdGEgPSBuZXcgT2JqZWN0WzJdOwotCQlkYXRhWzBdID0gc3RyaW5nOwotCQlkYXRhWzFdID0gY29sb3I7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhaW50SXRlbShHQyBnYywgVHJlZUl0ZW0gaXRlbSwgUmVjdGFuZ2xlIGJvdW5kcykgewotCQlzdXBlci5wYWludEl0ZW0oZ2MsIGl0ZW0sIGJvdW5kcyk7Ci0JCU9iamVjdFtdIGRhdGEgPSBjb21wdXRlVHJlZUV4dGVuc2lvbkRhdGEoaXRlbS5nZXREYXRhKCkpOwotCQlpZiAoKGRhdGEgIT0gbnVsbCkgJiYgKGRhdGEubGVuZ3RoID09IDIpKSB7Ci0JCQlnYy5zZXRDbGlwcGluZyhjb2x1bW5Qb3NpdGlvbiwgYm91bmRzLnkgKyAxLCBjb250cm9sV2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQkJZ2Muc2V0Rm9yZWdyb3VuZCgoQ29sb3IpIGRhdGFbMV0pOwotCQkJZ2MuZHJhd1N0cmluZygoU3RyaW5nKSBkYXRhWzBdLCBjb2x1bW5Qb3NpdGlvbiArIDUsIGJvdW5kcy55ICsgMSk7Ci0JCQlnYy5zZXRDbGlwcGluZygoUmVjdGFuZ2xlKSBudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5VHJlZU1lc3NhZ2UoR0MgZ2MpIHsKLQkJLy8gaGVyZSB3ZSBwcmludCBhIG1lc3NhZ2Ugd2hlbiB0aGUgZG9jdW1lbnQgaXMgZW1wdHkganVzdCB0byBnaXZlIHRoZQotCQkvLyB1c2VyIGEgdmlzdWFsIGN1ZQotCQkvLyBzbyB0aGF0IHRoZXkga25vdyBob3cgdG8gcHJvY2VlZCB0byBlZGl0IHRoZSBibGFuayB2aWV3Ci0JCWdjLnNldEZvcmVncm91bmQoZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCWdjLmRyYXdTdHJpbmcoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVHJlZUV4dGVuc2lvbl8zLCAxMCwgMTApOwotCQlnYy5kcmF3U3RyaW5nKFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRyZWVFeHRlbnNpb25fNCwgMTAsIDEwICsgZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50VmFsdWVIZWxwZXIoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKChyZXN1bHQgPT0gbnVsbCkgJiYgKG1xICE9IG51bGwpKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKChlZCAhPSBudWxsKSAmJiAhQm9vbGVhbi5UUlVFLmVxdWFscyhlZC5nZXRQcm9wZXJ0eSgiaXNJbmZlcnJlZCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gZGVjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbihlZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTXlDZWxsTW9kaWZpZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyLCBUcmVlRXh0ZW5zaW9uLklDZWxsRWRpdG9yUHJvdmlkZXIgewotCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTm9kZSkgewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBlbGVtZW50OwotCQkJCXJlc3VsdCA9IChwcm9wZXJ0eSA9PSBWQUxVRV9QUk9QRVJUWSkgJiYgdHJlZUNvbnRlbnRIZWxwZXIuaXNFZGl0YWJsZShub2RlKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJCXJlc3VsdCA9IHRyZWVDb250ZW50SGVscGVyLmdldE5vZGVWYWx1ZSgoTm9kZSkgb2JqZWN0KTsKLQkJCX0KLQkJCXJldHVybiAocmVzdWx0ICE9IG51bGwpID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCS8vIGVuYWJsZU5vZGVTZWxlY3Rpb25MaXN0ZW5lcihmYWxzZSk7Ci0JCQlJdGVtIGl0ZW0gPSAoSXRlbSkgZWxlbWVudDsKLQkJCVN0cmluZyBvbGRWYWx1ZSA9IHRyZWVDb250ZW50SGVscGVyLmdldE5vZGVWYWx1ZSgoTm9kZSkgaXRlbS5nZXREYXRhKCkpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJCWlmICgobmV3VmFsdWUgIT0gbnVsbCkgJiYgIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQl0cmVlQ29udGVudEhlbHBlci5zZXROb2RlVmFsdWUoKE5vZGUpIGl0ZW0uZ2V0RGF0YSgpLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJCX0KLQkJCS8vIGVuYWJsZU5vZGVTZWxlY3Rpb25MaXN0ZW5lcih0cnVlKTsKLQkJfQotCi0JCXB1YmxpYyBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IG8sIGludCBjb2wpIHsKLQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBwcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihvKTsKLQkJCXJldHVybiBwZCAhPSBudWxsID8gcGQuY3JlYXRlUHJvcGVydHlFZGl0b3IoY29udHJvbCkgOiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNiZWEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgVmFsaWRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24ueG1sdmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGX0ZJTEVfRVJST1JfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRl9GSUxFX0VSUk9SX0RFVEFJTFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFVEFJTFNfSU5GT1JNQVRJT05fVU5BVkFJTEFCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFVEFJTFNfSU5GT19SRVZBTElEQVRFX1RPX1JFR0VORVJBVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NBVkVfRElSVFlfRklMRV9NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TQVZFX0RJUlRZX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RUYWJsZVZpZXdlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0VGFibGVWaWV3ZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdFRhYmxlVmlld2VyXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RUYWJsZVZpZXdlcl8zOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9Hcm91cE5hbWVQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9Hcm91cE5hbWVQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzNlOWJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vR3JvdXBOYW1lUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotCi0KLS8qKgotICogQ3VzdG9tIHByb3BlcnR5IHRlc3RlciB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZ3JvdXBOYW1lIGF0dHJpYnV0ZSBpcwotICogcHJlc2VudCBvbiBhIG1hcmtlciBhbmQgdGhhdCBpdHMgdmFsdWUgc3RhcnRzIHdpdGggYSBnaXZlbiBleHBlY3RlZCB2YWx1ZS4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwTmFtZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIKLXsKLSAgLyoqCi0gICAqIFRoZSBncm91cCBuYW1lIHByZWZpeCBwcm9wZXJ0eSBuYW1lLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX05BTUVfUFJFRklYID0gImdyb3VwTmFtZVByZWZpeCI7IC8vJE5PTi1OTFMtMSQgIAotCi0gIC8qKgotICAgKiBUaGUgZ3JvdXAgbmFtZSBtYXJrZXIgYXR0cmlidXRlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX05BTUUgPSAiZ3JvdXBOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKQotICB7Ci0gICAgaWYgKEdST1VQX05BTUVfUFJFRklYLmVxdWFscyhwcm9wZXJ0eSkpCi0gICAgewotICAgICAgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSU1hcmtlcikKLSAgICAgIHsKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcilyZWNlaXZlcjsKLQotICAgICAgICBTdHJpbmcgZ3JvdXBOYW1lID0gbWFya2VyLmdldEF0dHJpYnV0ZShHUk9VUF9OQU1FLCBudWxsKTsKLQotICAgICAgICBib29sZWFuIHRlc3RWYWx1ZSA9IGdyb3VwTmFtZSAhPSBudWxsICYmIGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZ3JvdXBOYW1lLnN0YXJ0c1dpdGgoKFN0cmluZylleHBlY3RlZFZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRlc3RWYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzlmMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvblVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBUYXNrTGlzdFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBMaXN0IGVycm9yTGlzdDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcmtlZFVwRGV0YWlsc01lc3NhZ2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0RmlsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmVyZW5jZWRGaWxlOwotCXByb3RlY3RlZCBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0JcHJvdGVjdGVkIFRleHQgZnVsbEZpbGVOYW1lRmllbGQ7Ci0KLQlwdWJsaWMgUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTGlzdCBlcnJvckxpc3QsIFN0cmluZyBjb250ZXh0RmlsZSwgU3RyaW5nIHJlZmVyZW5jZWRGaWxlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQotCQlpbnQgc3R5bGVCaXRzID0gZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRTsKLQkJc3R5bGVCaXRzICY9IH5TV1QuQVBQTElDQVRJT05fTU9EQUw7Ci0KLQkJc2V0U2hlbGxTdHlsZShzdHlsZUJpdHMpOwotCQl0aGlzLmVycm9yTGlzdCA9IGVycm9yTGlzdDsKLQotCQl0aGlzLnJlZmVyZW5jZWRGaWxlID0gcmVmZXJlbmNlZEZpbGU7Ci0JCXRoaXMuY29udGV4dEZpbGUgPSBjb250ZXh0RmlsZTsKLQkJdGhpcy5tYXJrZWRVcERldGFpbHNNZXNzYWdlID0gZ2V0TWFya2VkVXBEZXRhaWxzTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpIHsKLQkJY3JlYXRlKCk7Ci0JCWdldFNoZWxsKCkuc2V0VGV4dChYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5fVUlfUkVGX0ZJTEVfRVJST1JfREVUQUlMUyk7Ci0KLQkJc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotCQlyZXR1cm4gb3BlbigpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWZ1bGxGaWxlTmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZ1bGxGaWxlTmFtZUZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlmdWxsRmlsZU5hbWVGaWVsZC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCQlmdWxsRmlsZU5hbWVGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJc3VwZXIuY3JlYXRlQnV0dG9uQmFyKGNvbXBvc2l0ZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWRpYWxvZ0FyZWEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEodHJ1ZSwgLTEsIDIwMCkpOwotCi0JCXN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChjLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JCXN0eWxlZFRleHQuc2V0QmFja2dyb3VuZChjLmdldEJhY2tncm91bmQoKSk7Ci0JCXNldFN0eWxlZFRleHQoc3R5bGVkVGV4dCwgbWFya2VkVXBEZXRhaWxzTWVzc2FnZSk7Ci0JCXN0eWxlZFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlzdHlsZWRUZXh0LnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEoZmFsc2UsIDY1MCwgLTEpKTsKLQotCQlNb3VzZUxpc3RlbmVyIG1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lcigpOwotCQlzdHlsZWRUZXh0LmFkZE1vdXNlTW92ZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotCi0JCXRhYmxlVmlld2VyID0gbmV3IFRhc2tMaXN0VGFibGVWaWV3ZXIoYywgMTApOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChlcnJvckxpc3QpOwotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IEludGVybmFsU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKHRydWUsIDcwMCwgLTEpKTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JU3RyaW5nIGdldEZ1bGxVUkkoaW50IG9mZnNldCkgewotCQlTdHJpbmcgdXJpID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGluZGV4ID0gZ2V0SW5kZXgob2Zmc2V0KTsKLQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQlpZiAoKGluZGV4ID09IDApIHx8IChpbmRleCA9PSAyKSB8fCAoaW5kZXggPT0gMykpIHsKLQkJCQl1cmkgPSByZWZlcmVuY2VkRmlsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXVyaSA9IGNvbnRleHRGaWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0SW5kZXgoaW50IG9mZnNldCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCVN0eWxlUmFuZ2VbXSByYW5nZSA9IHN0eWxlZFRleHQuZ2V0U3R5bGVSYW5nZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZS5sZW5ndGg7IGkrKykgewotCQkJaW50IGwgPSByYW5nZVtpXS5zdGFydDsKLQkJCWludCByID0gbCArIHJhbmdlW2ldLmxlbmd0aDsKLQkJCWlmICgobCA8PSBvZmZzZXQpICYmIChyID49IG9mZnNldCkpIHsKLQkJCQlyZXN1bHQgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JY2xhc3MgTW91c2VMaXN0ZW5lciBpbXBsZW1lbnRzIE1vdXNlTW92ZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyB0b29sVGlwVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCi0JCQkJaW50IG9mZnNldCA9IHN0eWxlZFRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCXRvb2xUaXBUZXh0ID0gZ2V0RnVsbFVSSShvZmZzZXQpOwotCi0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nLgotCQkJfQotCQkJc3R5bGVkVGV4dC5zZXRUb29sVGlwVGV4dCh0b29sVGlwVGV4dCk7Ci0JCQlpZiAoKHRvb2xUaXBUZXh0ICE9IG51bGwpICYmICh0b29sVGlwVGV4dC5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJZnVsbEZpbGVOYW1lRmllbGQuc2V0VGV4dCh0b29sVGlwVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNYXJrZWRVcERldGFpbHNNZXNzYWdlKCkgewotCQlTdHJpbmcgZGV0YWlsc01lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBUT0RPLi4uIG5lZWQgdG8gbW92ZSAnX1VJX1JFRl9GSUxFX0VSUk9SX0RFU0NSSVBUSU9OJyB0byB0aGlzCi0JCS8vIHBsdWdpbidzIHByb3BlcnRpZXMgZmlsZQotCQkvLwkJCQotCQlTdHJpbmcgc3RyaW5nID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuX1VJX1JFRl9GSUxFX0VSUk9SX0RFU0NSSVBUSU9OOwotCQkvLyBUT0RPLi4uIG5lZWQgdG8gZWRpdCB0aGUgcHJvcGVydGllcyBmaWxlIHRvIHJlbW92ZSAiJyIgY2hhcmFjdGVycwotCQkvLyBmcm9tIHRoZSBzdHJpbmcKLQkJLy8gSSdtIHVzaW5nIHRoZXNlIGNoYXJhY3RlcnMgdG8gbWFya3VwIHRoZSBib2xkIGZvbnQuIEl0J3Mgc2FmZXIgaWYgSQotCQkvLyBhZGQgdGhlc2UgcHJvZ3JhbXRpY2FsbHkuCi0JCS8vCi0JCXN0cmluZyA9IHJlbW92ZVBhdHRlcm4oc3RyaW5nLCAiJyIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGMgPSAiJyIgKyBnZXRMYXN0U2VnbWVudChjb250ZXh0RmlsZSkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmcgciA9ICInIiArIGdldExhc3RTZWdtZW50KHJlZmVyZW5jZWRGaWxlKSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZGV0YWlsc01lc3NhZ2UgPSBOTFMuYmluZChzdHJpbmcsIG5ldyBPYmplY3RbXXtyLCBjLCByLCBjfSk7Ci0JCXJldHVybiBkZXRhaWxzTWVzc2FnZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZW1vdmVQYXR0ZXJuKFN0cmluZyBzdHJpbmcsIFN0cmluZyBwYXR0ZXJuKSB7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihwYXR0ZXJuKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCXN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIHBhdHRlcm4ubGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U3R5bGVkVGV4dChTdHlsZWRUZXh0IHN0eWxlZFRleHQsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyB2aXNpYmxlTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihtYXJrZWRVcERldGFpbHNNZXNzYWdlLCAiJyIsIGZhbHNlKTsgc3QuaGFzTW9yZVRva2VucygpOykgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKTsKLQkJCXZpc2libGVNZXNzYWdlICs9IHRva2VuOwotCQl9Ci0KLQkJc3R5bGVkVGV4dC5zZXRUZXh0KHZpc2libGVNZXNzYWdlKTsKLQkJLy8gZHcgRm9udCBmb250ID0gc3R5bGVkVGV4dC5nZXRGb250KCk7Ci0KLQkJYm9vbGVhbiBpblF1b3RlID0gZmFsc2U7Ci0JCWludCBwb3NpdGlvbiA9IDA7Ci0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihtYXJrZWRVcERldGFpbHNNZXNzYWdlLCAiJyIsIHRydWUpOyBzdC5oYXNNb3JlVG9rZW5zKCk7KSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotCi0JCQlpZiAodG9rZW4uZXF1YWxzKCInIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlpblF1b3RlID0gIWluUXVvdGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoaW5RdW90ZSkgewotCQkJCQl0cnkgewotCi0JCQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UocG9zaXRpb24sIHRva2VuLmxlbmd0aCgpLCBzdHlsZWRUZXh0LmdldEZvcmVncm91bmQoKSwgc3R5bGVkVGV4dC5nZXRCYWNrZ3JvdW5kKCksIFNXVC5CT0xEKTsKLQkJCQkJCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXBvc2l0aW9uID0gcG9zaXRpb24gKyB0b2tlbi5sZW5ndGgoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEdyaWREYXRhIGNyZWF0ZUdyaWREYXRhKGJvb2xlYW4gZmlsbEJvdGgsIGludCB3LCBpbnQgaCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShmaWxsQm90aCA/IEdyaWREYXRhLkZJTExfQk9USCA6IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IHc7Ci0JCWdkLmhlaWdodEhpbnQgPSBoOwotCQlyZXR1cm4gZ2Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExhc3RTZWdtZW50KFN0cmluZyB1cmkpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHVyaTsKLQkJaW50IGluZGV4ID0gTWF0aC5tYXgodXJpLmxhc3RJbmRleE9mKCIvIiksIHVyaS5sYXN0SW5kZXhPZigiXFwiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCXJlc3VsdCA9IHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSA9IChWYWxpZGF0aW9uTWVzc2FnZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmICh2YWxpZGF0aW9uTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB1cmlzdHJpbmcgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRVcmkoKTsKLQkJCQkJUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkub3BlbkVkaXRvckFuZEdvdG9FcnJvcih1cmlzdHJpbmcsIHZhbGlkYXRpb25NZXNzYWdlLmdldExpbmVOdW1iZXIoKSwgdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q29sdW1uTnVtYmVyKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4ZWU4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRWRpdG9yQW5kR290b0Vycm9yKFN0cmluZyB1cmlzdHJpbmcsIGZpbmFsIGludCBsaW5lLCBmaW5hbCBpbnQgY29sdW1uKSB7Ci0JCWlmICh1cmlzdHJpbmcgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlVUkwgdXJpID0gbmV3IFVSTCh1cmlzdHJpbmcpOwotCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQlpZiAoImZpbGUiLmVxdWFscyh1cmkuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSB1cmkuZ2V0UGF0aCgpOwotCQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHBhdGhTdHJpbmcpOwotCQkJCQkJU3RyaW5nIGRldmljZSA9IHBhdGguZ2V0RGV2aWNlKCk7Ci0JCQkJCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiBkZXZpY2Uuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJcGF0aCA9IHBhdGguc2V0RGV2aWNlKGRldmljZS5zdWJzdHJpbmcoMSkpOwotCQkJCQkJfQotCQkJCQkJZmluYWwgSUZpbGUgaUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCQkJCWlmICgoaUZpbGUgIT0gbnVsbCkgJiYgaUZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkvLyBPcGVuIHRoZSBlZGl0b3IgZm9yIHRoaXMgZmlsZS4KLQkJCQkJCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCQkJCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLQkJCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGlGaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCQkJCQkJSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZ2lzdHJ5ID0gd29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQkJCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gaUZpbGUuZ2V0TmFtZSgpOwotCQkJCQkJCQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBlZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGVOYW1lLCBjb250ZW50VHlwZSk7Ci0JCQkJCQkJCQkJU3RyaW5nIGVkaXRvcklkOwotCQkJCQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJZWRpdG9ySWQgPSBkZXNjcmlwdG9yLmdldElkKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQlkZXNjcmlwdG9yID0gZWRpdG9yUmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlTmFtZSArICIudHh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJZWRpdG9ySWQgPSBkZXNjcmlwdG9yLmdldElkKCk7IAotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkKLQkJCQkJCQkJCQlpZiAoZWRpdG9ySWQgIT0gbnVsbCkKLQkJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJICBGaWxlRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KGlGaWxlKTsKLQkJCQkJCQkJCQkgIElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJCQkJCSAgYWN0aXZlUGFnZS5vcGVuRWRpdG9yKGVkaXRvcklucHV0LCBlZGl0b3JJZCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQkJCUxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VySW5zdGFuY2UoKS5sb2dFcnJvcigiRXhjZXB0aW9uIGVuY291bnRlcmVkIHdoZW4gYXR0ZW1wdGluZyB0byBvcGVuIGZpbGU6ICIgKyBpRmlsZSArICJcblxuIiwgZXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCi0JCQkJCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkJCQkJZ290b0Vycm9yKGVkaXRvclBhcnQsIGxpbmUsIGNvbHVtbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9OwotCQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBEbyBub3RoaW5nLgotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIHZvaWQgZ290b0Vycm9yKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIGludCBsaW5lLCBpbnQgY29sdW1uKSB7Ci0JCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwpIHsKLQkJCVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChUZXh0RWRpdG9yKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSURvY3VtZW50UHJvdmlkZXIgZHAgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCQkJSURvY3VtZW50IGRvY3VtZW50ID0gKGRwICE9IG51bGwpID8gZHAuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSA6IG51bGw7Ci0JCQkJCXRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKGRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSAtIDEpICsgY29sdW1uIC0gMSwgMCk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIG1hcmtlciByZWZlcnMgdG8gaW52YWxpZCB0ZXh0IHBvc2l0aW9uIC0+IGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiNjI0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5tYXJrZXJzLk1hcmtlclZpZXdIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzOwotCi0KLS8qKgotICogSGFuZGxlciBmb3IgdGhlIHJlZmVyZW5jZWQgZmlsZSBlcnJvcnMgY29tbWFuZC4gVGhpcyBjbGFzcyByZXBsYWNlcyB0aGUgb2xkCi0gKiBSZWZlcmVuY2VkRmlsZUVycm9yQWN0aW9uRGVsZWdhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkRmlsZUVycm9yc0hhbmRsZXIgZXh0ZW5kcyBNYXJrZXJWaWV3SGFuZGxlcgotewotICBwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIGZpbmFsIElNYXJrZXJbXSBzZWxlY3RlZE1hcmtlcnMgPSBnZXRTZWxlY3RlZE1hcmtlcnMoZXZlbnQpOwotCi0gICAgSU1hcmtlciBzZWxlY3RlZE1hcmtlciA9IHNlbGVjdGVkTWFya2Vyc1swXTsKLQotICAgIGlmIChzZWxlY3RlZE1hcmtlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotCi0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHNlbGVjdGVkTWFya2VyLmdldFJlc291cmNlKCk7Ci0gICAgICAgIE1hcCBtYXAgPSAoTWFwKXJlc291cmNlLmdldFNlc3Npb25Qcm9wZXJ0eShWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSk7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpbmZvVW5hdmFpbGFibGUgPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5fVUlfREVUQUlMU19JTkZPUk1BVElPTl9VTkFWQUlMQUJMRTsKLSAgICAgICAgICBTdHJpbmcgcmV2YWxpZGF0ZVRvUmVnZW5lcmF0ZUVycm9ycyA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLl9VSV9ERVRBSUxTX0lORk9fUkVWQUxJREFURV9UT19SRUdFTkVSQVRFOwotICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIGluZm9VbmF2YWlsYWJsZSwgcmV2YWxpZGF0ZVRvUmVnZW5lcmF0ZUVycm9ycyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHVyaSA9IG51bGw7Ci0KLSAgICAgICAgICBTdHJpbmcgZ3JvdXBOYW1lID0gKFN0cmluZylzZWxlY3RlZE1hcmtlci5nZXRBdHRyaWJ1dGUoImdyb3VwTmFtZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGdyb3VwTmFtZS5zdGFydHNXaXRoKCJyZWZlcmVuY2VkRmlsZUVycm9yIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaW5kZXgxID0gZ3JvdXBOYW1lLmluZGV4T2YoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaW50IGluZGV4MiA9IGdyb3VwTmFtZS5sYXN0SW5kZXhPZigiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoKGluZGV4MSAhPSAtMSkgJiYgKGluZGV4MiA+IGluZGV4MSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVyaSA9IGdyb3VwTmFtZS5zdWJzdHJpbmcoaW5kZXgxICsgMSwgaW5kZXgyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAodXJpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgTGlzdCBsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotICAgICAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IChWYWxpZGF0aW9uTWVzc2FnZSltYXAuZ2V0KHVyaSk7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsaXN0ID0gbWVzc2FnZS5nZXROZXN0ZWRNZXNzYWdlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJUGF0aCByZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJlc291cmNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRlZEZpbGVVUkkgPSByZXNvdXJjZUxvY2F0aW9uLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgICAgdmFsaWRhdGVkRmlsZVVSSSA9ICJmaWxlOi8iICsgdmFsaWRhdGVkRmlsZVVSSTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgIFJlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cgZGlhbG9nID0gbmV3IFJlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2coCi0gICAgICAgICAgICAgICAgSGFuZGxlclV0aWwuZ2V0QWN0aXZlU2hlbGwoZXZlbnQpLAotICAgICAgICAgICAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVkRmlsZVVSSSwKLSAgICAgICAgICAgICAgICB1cmkpOwotICAgICAgICAgICAgICBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdGhpczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vVGFza0xpc3RUYWJsZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9UYXNrTGlzdFRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzM2VkZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9UYXNrTGlzdFRhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvblVJTWVzc2FnZXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVGFza0xpc3RUYWJsZVZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSUNPTiA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0RFU0NSSVBUSU9OID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fUkVTT1VSQ0UgPSAzOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9MT0NBVElPTiA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9JQ09OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9ERVNDUklQVElPTiA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLlRhc2tMaXN0VGFibGVWaWV3ZXJfMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9SRVNPVVJDRSA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLlRhc2tMaXN0VGFibGVWaWV3ZXJfMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9MT0NBVElPTiA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLlRhc2tMaXN0VGFibGVWaWV3ZXJfMjsKLQotCXByb3RlY3RlZCBpbnQgdmlzaWJsZVJvd3MgPSAtMTsKLQotCXByb3RlY3RlZCBpbnQgZ2V0Q29sdW1uV2lkdGgoaW50IGNvbHVtbikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCWNhc2UgQ09MVU1OX0lDT04gOiB7Ci0JCQkJcmVzdWx0ID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQ09MVU1OX0RFU0NSSVBUSU9OIDogewotCQkJCXJlc3VsdCA9IDIwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBDT0xVTU5fUkVTT1VSQ0UgOiB7Ci0JCQkJcmVzdWx0ID0gMzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQ09MVU1OX0xPQ0FUSU9OIDogewotCQkJCXJlc3VsdCA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgVGFza0xpc3RUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgdmlzaWJsZVJvd3MpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIsIHZpc2libGVSb3dzKTsKLQl9Ci0KLQlwdWJsaWMgVGFza0xpc3RUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGludCB2aXNpYmxlUm93cykgewotCQlzdXBlcihuZXcgVGFibGUocGFyZW50LCBzdHlsZSkpOwotCQlnZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQlQcm92aWRlciBwcm92aWRlciA9IG5ldyBQcm92aWRlcigpOwotCQlzZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQlzZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotCQlTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkgPSB7TEFCRUxfSUNPTiwgTEFCRUxfREVTQ1JJUFRJT04sIExBQkVMX0xPQ0FUSU9OfTsKLQkJc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkpOwotCi0JCVRhYmxlIHRhYmxlID0gZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzQXJyYXlbaV0pOwotCQkJY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YShnZXRDb2x1bW5XaWR0aChpKSwgdHJ1ZSkpOwotCQl9Ci0KLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdGhpcy52aXNpYmxlUm93cyA9IHZpc2libGVSb3dzOwotCX0KLQotCS8qKgotCSAqIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciwgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlWaWV3ZXIgdmlld2VyOwotCQlJbWFnZSBlcnJvckltYWdlOwotCQlJbWFnZSB3YXJuSW1hZ2U7Ci0KLQkJcHVibGljIFByb3ZpZGVyKCkgewotCQkJZXJyb3JJbWFnZSA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spOwotCi0JCQl3YXJuSW1hZ2UgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfV0FSTl9UU0spOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0JCQlyZXR1cm4gbGlzdCAhPSBudWxsID8gbGlzdC50b0FycmF5KCkgOiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UgPSAoVmFsaWRhdGlvbk1lc3NhZ2UpIG9iamVjdDsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCWludCBzZXZlcml0eSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0JCQkJaWYgKChzZXZlcml0eSA9PSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZKSB8fCAoc2V2ZXJpdHkgPT0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKSkgewotCQkJCQlyZXN1bHQgPSBlcnJvckltYWdlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gd2FybkltYWdlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbikgewotCQkJVmFsaWRhdGlvbk1lc3NhZ2UgZXJyb3JNZXNzYWdlID0gKFZhbGlkYXRpb25NZXNzYWdlKSBvYmplY3Q7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXN3aXRjaCAoY29sdW1uKSB7Ci0JCQkJY2FzZSBDT0xVTU5fREVTQ1JJUFRJT04gOiB7Ci0JCQkJCXJlc3VsdCA9IGVycm9yTWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIENPTFVNTl9MT0NBVElPTiA6IHsKLQkJCQkJcmVzdWx0ID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuVGFza0xpc3RUYWJsZVZpZXdlcl8zICsgZXJyb3JNZXNzYWdlLmdldExpbmVOdW1iZXIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24veG1sdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNWM4NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotIwotIyBSZWZlcmVuY2VkIEZpbGUgRGlhbG9nIFJlbGF0ZWQgTWVzc2FnZQotIwotX1VJX1JFRl9GSUxFX0VSUk9SX0RFU0NSSVBUSU9OICAgICAgPSBUaGUgZXJyb3JzIGJlbG93IHdlcmUgZGV0ZWN0ZWQgd2hlbiB2YWxpZGF0aW5nIHRoZSBmaWxlICJ7MH0iIHZpYSB0aGUgZmlsZSAiezF9Ii4gIEluIG1vc3QgY2FzZXMgdGhlc2UgZXJyb3JzIGNhbiBiZSBkZXRlY3RlZCBieSB2YWxpZGF0aW5nICJ7Mn0iIGRpcmVjdGx5LiAgSG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IGVycm9ycyB3aWxsIG9ubHkgb2NjdXIgd2hlbiB7Mn0gaXMgdmFsaWRhdGVkIGluIHRoZSBjb250ZXh0IG9mIHszfS4KLV9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCByaWdodCBjbGljayBvbiB0aGUgbWVzc2FnZSBhbmQgc2VsZWN0ICJTaG93IERldGFpbHMuLi4iCi1fVUlfUkVGX0ZJTEVfRVJST1JfREVUQUlMUyAgICAgICAgICA9IFJlZmVyZW5jZWQgRmlsZSBFcnJvciBEZXRhaWxzCi0KLV9VSV9ERVRBSUxTX0lORk9STUFUSU9OX1VOQVZBSUxBQkxFICAgICAgID0gRGV0YWlscyBJbmZvcm1hdGlvbiBVbmF2YWlsYWJsZQotX1VJX0RFVEFJTFNfSU5GT19SRVZBTElEQVRFX1RPX1JFR0VORVJBVEUgPSBEZXRhaWxzIGluZm9ybWF0aW9uIGN1cnJlbnRseSB1bmF2YWlsYWJsZS4gIFBsZWFzZSByZXZhbGlkYXRlIHRoZSBmaWxlIHRvIHJlZ2VuZXJhdGUgdGhlIGVycm9yIGRldGFpbHMuCi0KLSMKLSMgRGlydHkgRmlsZSBEaWFsb2cgUmVsYXRlZCBNZXNzYWdlcwotIwotVGFza0xpc3RUYWJsZVZpZXdlcl8wPURlc2NyaXB0aW9uCi1UYXNrTGlzdFRhYmxlVmlld2VyXzE9UmVzb3VyY2UKLVRhc2tMaXN0VGFibGVWaWV3ZXJfMj1Mb2NhdGlvbgotVGFza0xpc3RUYWJsZVZpZXdlcl8zPWxpbmUgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDgwOWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JbXBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZWxlbWVudFRvT3BlbjsKLQotCXByaXZhdGUgSU92ZXJ3cml0ZVF1ZXJ5IG92ZXJ3cml0ZVF1ZXJ5OwotCi0JcHJpdmF0ZSBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZVtdIHBhZ2VzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbihFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZVtdIG15UGFnZXMsIElPdmVyd3JpdGVRdWVyeSBteU92ZXJ3cml0ZVF1ZXJ5KSB7Ci0JCWVsZW1lbnRUb09wZW4gPSBudWxsOwotCQlwYWdlcyA9IG15UGFnZXM7Ci0JCW92ZXJ3cml0ZVF1ZXJ5ID0gbXlPdmVyd3JpdGVRdWVyeTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGNvbmZpZ05ld1Byb2plY3QoSVdvcmtzcGFjZVJvb3Qgcm9vdCwgU3RyaW5nIG5hbWUsIFN0cmluZ1tdIG5hdHVyZUlkcywgSVByb2plY3RbXSByZWZlcmVuY2VkUHJvamVjdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChuYW1lKTsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQkJfQotCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJcHJvamVjdC5vcGVuKG51bGwpOwotCQkJfQotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJZGVzYy5zZXRMb2NhdGlvbihudWxsKTsKLQkJCWRlc2Muc2V0TmF0dXJlSWRzKG5hdHVyZUlkcyk7Ci0JCQlkZXNjLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZlcmVuY2VkUHJvamVjdHMpOwotCi0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCi0JCQlyZXR1cm4gcHJvamVjdDsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0KElXb3Jrc3BhY2VSb290IHJvb3QsIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIHBhZ2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlc2MgPSBwYWdlLmdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaW1wb3J0cyA9IGRlc2MuZ2V0Q2hpbGRyZW4oImltcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG5hdHVyZXMgPSBkZXNjLmdldENoaWxkcmVuKCJuYXR1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSByZWZlcmVuY2VzID0gZGVzYy5nZXRDaGlsZHJlbigicmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCWludCBuSW1wb3J0cyA9IChpbXBvcnRzID09IG51bGwpID8gMCA6IGltcG9ydHMubGVuZ3RoOwotCQlpbnQgbk5hdHVyZXMgPSAobmF0dXJlcyA9PSBudWxsKSA/IDAgOiBuYXR1cmVzLmxlbmd0aDsKLQkJaW50IG5SZWZlcmVuY2VzID0gKHJlZmVyZW5jZXMgPT0gbnVsbCkgPyAwIDogcmVmZXJlbmNlcy5sZW5ndGg7Ci0KLQkJbW9uaXRvci5iZWdpblRhc2soWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzY19wcm9qLCBuSW1wb3J0cyArIDEpOwotCi0JCVN0cmluZyBuYW1lID0gcGFnZS5nZXRQcm9qZWN0TmFtZSgpOwotCi0JCVN0cmluZ1tdIG5hdHVyZUlkcyA9IG5ldyBTdHJpbmdbbk5hdHVyZXNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5OYXR1cmVzOyBpKyspIHsKLQkJCW5hdHVyZUlkc1tpXSA9IG5hdHVyZXNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVByb2plY3RbXSByZWZlcmVuY2VkUHJvamVjdHMgPSBuZXcgSVByb2plY3RbblJlZmVyZW5jZXNdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZWZlcmVuY2VzOyBpKyspIHsKLQkJCXJlZmVyZW5jZWRQcm9qZWN0c1tpXSA9IHJvb3QuZ2V0UHJvamVjdChyZWZlcmVuY2VzW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlQcm9qZWN0IHByb2ogPSBjb25maWdOZXdQcm9qZWN0KHJvb3QsIG5hbWUsIG5hdHVyZUlkcywgcmVmZXJlbmNlZFByb2plY3RzLCBtb25pdG9yKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5JbXBvcnRzOyBpKyspIHsKLQkJCWRvSW1wb3J0cyhwcm9qLCBpbXBvcnRzW2ldLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJfQotCi0JCVN0cmluZyBvcGVuID0gZGVzYy5nZXRBdHRyaWJ1dGUoIm9wZW4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoKG9wZW4gIT0gbnVsbCkgJiYgKG9wZW4ubGVuZ3RoKCkgPiAwKSkgewotCQkJSVJlc291cmNlIGZpbGVUb09wZW4gPSBwcm9qLmZpbmRNZW1iZXIobmV3IFBhdGgob3BlbikpOwotCQkJaWYgKGZpbGVUb09wZW4gIT0gbnVsbCkgewotCQkJCWVsZW1lbnRUb09wZW4gPSBmaWxlVG9PcGVuOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9JbXBvcnRzKElQcm9qZWN0IHByb2plY3QsIElDb25maWd1cmF0aW9uRWxlbWVudCBjdXJyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBkZXN0UGF0aDsKLQkJCVN0cmluZyBuYW1lID0gY3Vyci5nZXRBdHRyaWJ1dGUoImRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJZGVzdFBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKG5hbWUpOwotCQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJCWRlc3RQYXRoID0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgaW1wb3J0UGF0aCA9IGN1cnIuZ2V0QXR0cmlidXRlKCJzcmMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGltcG9ydFBhdGggPT0gbnVsbCkgewotCQkJCWltcG9ydFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAicHJvamVjdHNldHVwIGRlc2NyaXB0b3I6IGltcG9ydCBtaXNzaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVppcEZpbGUgemlwRmlsZSA9IGdldFppcEZpbGVGcm9tUGx1Z2luRGlyKGltcG9ydFBhdGgsIGdldENvbnRyaWJ1dGluZ1BsdWdpbihjdXJyKSk7Ci0JCQlpbXBvcnRGaWxlc0Zyb21aaXAoemlwRmlsZSwgZGVzdFBhdGgsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udHJpYnV0aW5nUGx1Z2luKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCkgewotCQlPYmplY3QgcGFyZW50ID0gY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFeHRlbnNpb24pIHsKLQkJCQlyZXR1cm4gKChJRXh0ZW5zaW9uKSBwYXJlbnQpLmdldE5hbWVzcGFjZSgpOwotCQkJfQotCQkJcGFyZW50ID0gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHBhcmVudCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRFbGVtZW50VG9PcGVuKCkgewotCQlyZXR1cm4gZWxlbWVudFRvT3BlbjsKLQl9Ci0KLQlwcml2YXRlIFppcEZpbGUgZ2V0WmlwRmlsZUZyb21QbHVnaW5EaXIoU3RyaW5nIHBsdWdpblJlbGF0aXZlUGF0aCwgU3RyaW5nIHN5bWJvbGljTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShzeW1ib2xpY05hbWUpOwotCQkJVVJMIHN0YXJ0ZXJVUkwgPSBuZXcgVVJMKGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwbHVnaW5SZWxhdGl2ZVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFppcEZpbGUoUGxhdGZvcm0uYXNMb2NhbFVSTChzdGFydGVyVVJMKS5nZXRGaWxlKCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IHBsdWdpblJlbGF0aXZlUGF0aCArICI6ICIgKyBlLmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWE1MVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRGaWxlc0Zyb21aaXAoWmlwRmlsZSBzcmNaaXBGaWxlLCBJUGF0aCBkZXN0UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSBuZXcgWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyKHNyY1ppcEZpbGUpOwotCQlJbXBvcnRPcGVyYXRpb24gb3AgPSBuZXcgSW1wb3J0T3BlcmF0aW9uKGRlc3RQYXRoLCBzdHJ1Y3R1cmVQcm92aWRlci5nZXRSb290KCksIHN0cnVjdHVyZVByb3ZpZGVyLCBvdmVyd3JpdGVRdWVyeSk7Ci0JCW9wLnJ1bihtb25pdG9yKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjLCBwYWdlcy5sZW5ndGgpOwotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQljcmVhdGVQcm9qZWN0KHJvb3QsIHBhZ2VzW2ldLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2OGM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Jlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCi0JcHJpdmF0ZSBjbGFzcyBJbXBvcnRPdmVyd3JpdGVRdWVyeSBpbXBsZW1lbnRzIElPdmVyd3JpdGVRdWVyeSB7Ci0KLQkJcHJpdmF0ZSBpbnQgb3BlbkRpYWxvZyhmaW5hbCBTdHJpbmcgZmlsZSkgewotCQkJZmluYWwgaW50W10gcmVzdWx0ID0ge0lEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEfTsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX292ZXJ3cml0ZXF1ZXJ5X3RpdGxlOwotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3ZlcndyaXRlcXVlcnlfbWVzc2FnZSwgZmlsZSk7Ci0JCQkJCVN0cmluZ1tdIG9wdGlvbnMgPSB7SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUwsIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9OwotCQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBudWxsLCBtc2csIE1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIG9wdGlvbnMsIDApOwotCQkJCQlyZXN1bHRbMF0gPSBkaWFsb2cub3BlbigpOwotCQkJCX0KLQkJCX0pOwotCQkJcmV0dXJuIHJlc3VsdFswXTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIGZpbGUpIHsKLQkJCVN0cmluZ1tdIHJldHVybkNvZGVzID0ge1lFUywgTk8sIEFMTCwgQ0FOQ0VMfTsKLQkJCWludCByZXR1cm5WYWwgPSBvcGVuRGlhbG9nKGZpbGUpOwotCQkJcmV0dXJuIHJldHVyblZhbCA8IDAgPyBDQU5DRUwgOiByZXR1cm5Db2Rlc1tyZXR1cm5WYWxdOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgd2l6YXJkQ29uZmlnRWxlbWVudDsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBleGFtcGxlQ29uZmlnRWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nIEVYQU1QTEVfV0laQVJEX1hQX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuZXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VbXSBwYWdlczsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIFdFQl9CUk9XU0VSX0lEID0gIm9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuZWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERpYWxvZ1NldHRpbmdzKFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpKTsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgV2l6YXJkI2FkZFBhZ2VzCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0KLQkJaWYgKGV4YW1wbGVDb25maWdFbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGV4YW1wbGVDb25maWdFbGVtZW50LmdldENoaWxkcmVuKCJwcm9qZWN0c2V0dXAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoKGNoaWxkcmVuID09IG51bGwpIHx8IChjaGlsZHJlbi5sZW5ndGggPT0gMCkpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiZGVzY3JpcHRvciBtdXN0IGNvbnRhaW4gb25lIG9yZSBtb3JlIHByb2plY3RzZXR1cCB0YWdzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXBhZ2VzID0gbmV3IEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlW2NoaWxkcmVuLmxlbmd0aF07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJcGFnZXNbaV0gPSBuZXcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UoaSwgY2hpbGRyZW5baV0pOwotCQkJYWRkUGFnZShwYWdlc1tpXSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uKSB7Ci0JCWlmIChleGFtcGxlQ29uZmlnRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYmFubmVyID0gZXhhbXBsZUNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJiYW5uZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJhbm5lciAhPSBudWxsKSB7Ci0JCQkJVVJMIGltYWdlVVJMID0gUGxhdGZvcm0uZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoZXhhbXBsZUNvbmZpZ0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkpLCBuZXcgUGF0aChiYW5uZXIpKTsKLQkJCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLQkJCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRFeHRlbmRlZENvbmZpZ3VyYXRpb25FbGVtZW50cygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4YW1wbGVXaXphcmRYUCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KEVYQU1QTEVfV0laQVJEX1hQX0lEKTsKLQkJaWYgKGV4YW1wbGVXaXphcmRYUCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElDb25maWd1cmF0aW9uRWxlbWVudFswXTsKLQkJfQotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4YW1wbGVXaXphcmRYUC5nZXRFeHRlbnNpb24oZ2V0V2l6YXJkRXh0ZW5zaW9uSWQoKSk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBleGFtcGxlV2l6YXJkQ0VzID0gZXhhbXBsZVdpemFyZFhQLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlyZXR1cm4gZXhhbXBsZVdpemFyZENFczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0YXJnZXQpIHsKLQkJU3RyaW5nIHRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3BfZXJyb3JfdGl0bGU7Ci0JCVN0cmluZyBtZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3BfZXJyb3JfbWVzc2FnZTsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSB0YXJnZXQpLmdldFN0YXR1cygpOwotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMpOwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgdGl0bGUsIHRhcmdldC5nZXRNZXNzYWdlKCkpOwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbih0YXJnZXQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5SZXNvdXJjZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKGFjdGl2ZVBhZ2UsIChJRmlsZSkgcmVzb3VyY2UsIFdFQl9CUk9XU0VSX0lELCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5zZWxlY3RBbmRSZXZlYWwocmVzb3VyY2UsIGFjdGl2ZVBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFdpemFyZCNwZXJmb3JtRmluaXNoCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiBydW5uYWJsZSA9IG5ldyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKHBhZ2VzLCBuZXcgSW1wb3J0T3ZlcndyaXRlUXVlcnkoKSk7Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeURlbGVnYXRpbmdPcGVyYXRpb24ocnVubmFibGUpOwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCB0cnVlLCBvcCk7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQmFzaWNOZXdQcm9qZWN0UmVzb3VyY2VXaXphcmQudXBkYXRlUGVyc3BlY3RpdmUod2l6YXJkQ29uZmlnRWxlbWVudCk7Ci0JCUlSZXNvdXJjZSByZXMgPSBydW5uYWJsZS5nZXRFbGVtZW50VG9PcGVuKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJb3BlblJlc291cmNlKHJlcyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZm9yIHRoZSB3aXphcmQuIFRoZSBjb25maWcgZWxlbWVudAotCSAqIHdpbGwgYmUgdXNlZCBpbiA8Y29kZT5wZXJmb3JtRmluaXNoPC9jb2RlPiB0byBzZXQgdGhlIHJlc3VsdAotCSAqIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHsKLQkJd2l6YXJkQ29uZmlnRWxlbWVudCA9IGNmaWc7Ci0JCVN0cmluZyB0aXRsZSA9IHdpemFyZENvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRpdGxlICE9IG51bGwpIHsKLQkJCXNldFdpbmRvd1RpdGxlKHRpdGxlKTsKLQkJfQotCQlTdHJpbmcgd2l6YXJkSWQgPSBnZXRXaXphcmRFeHRlbnNpb25JZCgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBleGFtcGxlV2l6YXJkQ0VzID0gZ2V0RXh0ZW5kZWRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGFtcGxlV2l6YXJkQ0VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGV4YW1wbGVXaXphcmRDRXNbaV07Ci0JCQlTdHJpbmcgZXh0V2l6YXJkSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCh3aXphcmRJZCAhPSBudWxsKSAmJiAoZXh0V2l6YXJkSWQgIT0gbnVsbCkgJiYgd2l6YXJkSWQuZXF1YWxzKGV4dFdpemFyZElkKSkgewotCQkJCWV4YW1wbGVDb25maWdFbGVtZW50ID0gZWxlbWVudDsKLQkJCX0KLQkJfQotCQkvLyBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gd2l6YXJkQ29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxM2IzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZTsKLQotcHVibGljIGNsYXNzIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudDsKLQotCXB1YmxpYyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZShpbnQgcGFnZU51bWJlciwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0pIHsKLQotCQlzdXBlcigicGFnZSIgKyBwYWdlTnVtYmVyKTsgLy8kTk9OLU5MUy0xJAotCQljb25maWd1cmF0aW9uRWxlbWVudCA9IGVsZW07Ci0KLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoZWxlbSwgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbml0aWFsUHJvamVjdE5hbWUoY2FsY3VsYXRlSW5pdGlhbFByb2plY3ROYW1lKG5hbWUpKTsKLQotCQlzZXREZXNjcmlwdGlvbihnZXRBdHRyaWJ1dGUoY29uZmlndXJhdGlvbkVsZW1lbnQsICJwYWdlZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoZ2V0QXR0cmlidXRlKGNvbmZpZ3VyYXRpb25FbGVtZW50LCAicGFnZXRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvKgotCSAqIFNldCB0aGUgZGVmYXVsdCBwcm9qZWN0IG5hbWUgdGhhdCBpcyB0byBhcHBlYXIgb24gdGhlIGluaXRpYWxQYWdlIHBhZ2UKLQkgKiBvZiB0aGlzIHdpemFyZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNhbGN1bGF0ZUluaXRpYWxQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJSVByb2plY3QgcHJvamVjdEhhbmRsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmICghcHJvamVjdEhhbmRsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIHByb2plY3ROYW1lOwotCQl9Ci0JCS8vIENoYW5nZSB0aGUgbmFtZSB1bnRpbCBpdCBkb2Vzbid0IGV4aXN0cy4gVHJ5IDkgdGltZXMgYW5kIHRoZW4KLQkJLy8gZ2l2ZSB1cC4KLQkJZm9yIChpbnQgaSA9IDE7IGkgPCAxMDsgaSsrKSB7Ci0JCQlwcm9qZWN0SGFuZGxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lICsgaSk7Ci0JCQlpZiAoIXByb2plY3RIYW5kbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gcHJvamVjdE5hbWUgKyBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9qZWN0TmFtZSArICI5IjsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtLCBTdHJpbmcgdGFnKSB7Ci0JCVN0cmluZyByZXMgPSBlbGVtLmdldEF0dHJpYnV0ZSh0YWcpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJldHVybiAnIScgKyB0YWcgKyAnISc7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IG9mIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBJQ29uZmlndXJhdGlvbkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UjdmFsaWRhdGVQYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFByb2plY3ROYW1lKCk7Ci0JCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJV2l6YXJkIHdpemFyZCA9IGdldFdpemFyZCgpOwotCQlpZiAod2l6YXJkIGluc3RhbmNlb2YgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCkgewotCQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IHdpemFyZC5nZXRQYWdlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICgocGFnZXNbaV0gIT0gdGhpcykgJiYgKHBhZ2VzW2ldIGluc3RhbmNlb2YgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UpKSB7Ci0JCQkJCWlmIChwcm9qZWN0TmFtZS5lcXVhbHMoKChFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZSkgcGFnZXNbaV0pLmdldFByb2plY3ROYW1lKCkpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlX2Vycm9yX2FscmVhZHlleGlzdHMpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeHBvcnRYTUxDYXRhbG9nV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4cG9ydFhNTENhdGFsb2dXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4ZDQ1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4cG9ydFhNTENhdGFsb2dXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIChTVEFSKSBhbmQKLSAqIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyL1NUQVIgLSBkY2FydmVyQHN0YXJzdGFuZGFyZC5vcmcvZF9hX2NhcnZlckB5YWhvby5jb20gLSBidWcgMTkyNTY4Ci0gKiAgICAgICAgICAgIEluaXRpYWwgQVBJIC0gVGhpcyBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZQotICogICAgICAgICAgICBvbGQgRXhwb3J0IERpYWxvZyBmb3IgdGhlIFhNTCBDYXRhbG9nLiAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlLkJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotcHVibGljIGNsYXNzIEV4cG9ydFhNTENhdGFsb2dXaXphcmQgZXh0ZW5kcyBCYXNpY05ld0ZpbGVSZXNvdXJjZVdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewotCi0JcHJvdGVjdGVkIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgZXhwb3J0UGFnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZyA9IG51bGw7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHVzZXJDYXRhbG9nID0gbnVsbDsKLQkKLQlwdWJsaWMgRXhwb3J0WE1MQ2F0YWxvZ1dpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfVElUTEUpOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX0dFTkVSQVRFWE1MKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCUlDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCUlDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQlpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCXVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUNhdGFsb2dTZXQgdGVtcENhdGFsb2dTZXQgPSBuZXcgQ2F0YWxvZ1NldCgpOwotCQl3b3JraW5nVXNlckNhdGFsb2cgPSB0ZW1wQ2F0YWxvZ1NldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coIndvcmtpbmciLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHVzZXJDYXRhbG9nKTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLQkJU3RyaW5nIHdvcmtzcGFjZVBhdGggPSB3b3Jrc3BhY2VSb290LmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlTdHJpbmcgZnVsbFBhdGggPSB3b3Jrc3BhY2VQYXRoICsgZXhwb3J0UGFnZS5nZXRDb250YWluZXJGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKTsKLQkJU3RyaW5nIHJlcXVpcmVkU3RyaW5nPWZ1bGxQYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBleHBvcnRQYWdlLmdldEZpbGVOYW1lKCk7Ci0JCXRyeSB7Ci0JCQlJRmlsZSBmaWxlID0gZXhwb3J0UGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl3b3JraW5nVXNlckNhdGFsb2cuc2V0TG9jYXRpb24ocmVxdWlyZWRTdHJpbmcpOwotCQkJd29ya2luZ1VzZXJDYXRhbG9nLnNhdmUoKTsKLQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlleHBvcnRQYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoIlhNTCBDYXRhbG9nIEV4cG9ydCIsICBnZXRTZWxlY3Rpb24oKSk7Ci0JCWV4cG9ydFBhZ2Uuc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfVElUTEUpOwotCQlleHBvcnRQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfRElBTE9HX1hNTENBVEFMT0dfRVhQT1JUX0RFU0NSSVBUSU9OKTsKLQkJZXhwb3J0UGFnZS5zZXRGaWxlRXh0ZW5zaW9uKCJ4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJYWRkUGFnZShleHBvcnRQYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbikgewotCQlzdXBlci5pbml0KHdvcmtiZW5jaCwgY3VycmVudFNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfRElBTE9HX1hNTENBVEFMT0dfRVhQT1JUX1RJVExFKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9HRU5FUkFURVhNTCk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0lYTUxXaXphcmRIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQyZWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIHhtbCB3aXphcmQuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICovCi1pbnRlcmZhY2UgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFhNTFVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZSByYWRpbwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMV9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzAxMDEiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYSBmaWxlIHJhZGlvIGJ1dHRvbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMl9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzAxMDIiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gc2NyYXRjaCByYWRpbyBidXR0b24KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX0NSRUFURVhNTDNfSEVMUElEID0gUFJFRklYICsgInhtbGMwMTAzIjsgLy8kTk9OLU5MUy0xJAotCS8vIFNlbGVjdCBTb3VyY2UgZmlsZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05FV1dJWkFSRF9TRUxFQ1RTT1VSQ0VfSEVMUElEID0gUFJFRklYICsgInhtbGMwNTAwIjsgLy8kTk9OLU5MUy0xJAotCS8vIFJvb3QgZWxlbWVudCBmb3IgYm90aCBEVEQgYW5kIFhNTCBzY2hlbWEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgT3B0aW9uYWwgQXR0cmlidXRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQxX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQ0MSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgT3B0aW9uYWwgRWxlbWVudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UMl9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzA0NDIiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UM19IRUxQSUQgPSBQUkVGSVggKyAieG1sYzA0NDMiOyAvLyROT04tTkxTLTEkCi0JLy8gRmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlIHdpdGggZGF0YQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ0X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQ0NCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBTeXN0ZW0gSUQgZm9yIERURAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ1X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDIxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBQdWJsaWMgSUQgZm9yIERURAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ2X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDIyMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlMzQ0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0ltcG9ydFhNTENhdGFsb2dQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCAoU1RBUikgYW5kCi0gKiBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlci9TVEFSIC0gZGNhcnZlckBzdGFyc3RhbmRhcmQub3JnL2RfYV9jYXJ2ZXJAeWFob28uY29tIC0gYnVnIDE5MjU2OAotICogICAgICAgICAgICBJbml0aWFsIEFQSSAtIFRoaXMgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUKLSAqICAgICAgICAgICAgb2xkIEltcG9ydCBEaWFsb2cgZm9yIHRoZSBYTUwgQ2F0YWxvZy4gCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldzsKLQotcHVibGljIGNsYXNzIEltcG9ydFhNTENhdGFsb2dQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0U2luZ2xlRmlsZVZpZXcgc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQotCXB1YmxpYyBJbXBvcnRYTUxDYXRhbG9nUGFnZSgpIHsKLQkJc3VwZXIoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19JTVBPUlRfVElUTEUpOwotCQlzZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9USVRMRSk7Ci0JCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3ID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVWaWV3KHNlbGVjdGlvbiwgZmFsc2UpIHsKLQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJCUltcG9ydFhNTENhdGFsb2dQYWdlLnRoaXMuY3JlYXRlRmlsdGVyQ29udHJvbChjb21wb3NpdGUpOwotCQkJfQotCQl9OwotCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCWdkLmhlaWdodEhpbnQgPSAzNTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsgIi54bWxjYXRhbG9nIiwgIi54bWwiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5jcmVhdGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldFZpc2libGVIZWxwZXIodHJ1ZSk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LmFkZFNlbGVjdGlvbkNoYW5nZWRUcmVlTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UudGhpcy5zZXRQYWdlQ29tcGxldGUoc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpICE9IG51bGwpOwotCQkJfQotCQl9KTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSW1wb3J0WE1MQ2F0YWxvZ1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9JbXBvcnRYTUxDYXRhbG9nV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjAwYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9JbXBvcnRYTUxDYXRhbG9nV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCAoU1RBUikgYW5kCi0gKiBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlci9TVEFSIC0gZGNhcnZlckBzdGFyc3RhbmRhcmQub3JnL2RfYV9jYXJ2ZXJAeWFob28uY29tIC0gYnVnIDE5MjU2OAotICogICAgICAgICAgICBJbml0aWFsIEFQSSAtIFRoaXMgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUKLSAqICAgICAgICAgICAgb2xkIEltcG9ydCBEaWFsb2cgZm9yIHRoZSBYTUwgQ2F0YWxvZy4gCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxDYXRhbG9nV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UgaW1wb3J0UGFnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZyA9IG51bGw7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHVzZXJDYXRhbG9nID0gbnVsbDsKLQkKLQlwdWJsaWMgSW1wb3J0WE1MQ2F0YWxvZ1dpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19JTVBPUlRfVElUTEUpOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX0dFTkVSQVRFWE1MKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCUlDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCUlDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQlpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCXVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQ2F0YWxvZ1NldCB0ZW1wQ2F0YWxvZ1NldCA9IG5ldyBDYXRhbG9nU2V0KCk7Ci0JCXdvcmtpbmdVc2VyQ2F0YWxvZyA9IHRlbXBDYXRhbG9nU2V0Lmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZygid29ya2luZyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRFbnRyaWVzRnJvbUNhdGFsb2codXNlckNhdGFsb2cpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBpbXBvcnRQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSUZpbGUgZmlsZSA9IGltcG9ydFBhZ2UuZ2V0RmlsZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkkoKS50b1N0cmluZygpOwotCQkJdHJ5IHsKLQkJCQlDYXRhbG9nU2V0IHRlbXBSZXNvdXJjZVNldCA9IG5ldyBDYXRhbG9nU2V0KCk7Ci0JCQkJSUNhdGFsb2cgbmV3Q2F0YWxvZyA9IHRlbXBSZXNvdXJjZVNldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coInRlbXAiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKG5ld0NhdGFsb2cpOwotCQkJCXVzZXJDYXRhbG9nLmNsZWFyKCk7Ci0JCQkJdXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHdvcmtpbmdVc2VyQ2F0YWxvZyk7Ci0JCQkJdXNlckNhdGFsb2cuc2F2ZSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlpbXBvcnRQYWdlID0gbmV3IEltcG9ydFhNTENhdGFsb2dQYWdlKCk7Ci0JCWltcG9ydFBhZ2Uuc2V0VGl0bGUoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfSEVBRElORyk7Ci0JCWltcG9ydFBhZ2Uuc2V0RGVzY3JpcHRpb24oWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19JTVBPUlRfREVTQ1JJUFRJT04pOwotCQlpbXBvcnRQYWdlLnNldE1lc3NhZ2UoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfTUVTU0FHRSk7Ci0JCWFkZFBhZ2UoaW1wb3J0UGFnZSk7Ci0JCWltcG9ydFBhZ2Uuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZWVkODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm9Db250ZW50QnVpbGRlciBleHRlbmRzIENvbnRlbnRCdWlsZGVyIHsKLQlwcm90ZWN0ZWQgaW50IGNvdW50ID0gMTsKLQlwdWJsaWMgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkJaWYgKGVkLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbkluZm8iKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXN1cGVyLnZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW55RWxlbWVudE5vZGUoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpIHsKLQkJU3RyaW5nIHVyaSA9IGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCWlmICgodXJpICE9IG51bGwpICYmICF1cmkuc3RhcnRzV2l0aCgiIyMiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlpZiAodGFibGUuZ2V0KHVyaSkgPT0gbnVsbCkgewotCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0JCQkJaW5mby51cmkgPSB1cmk7Ci0JCQkJaW5mby5wcmVmaXggPSAicCIgKyBjb3VudCsrOyAvLyROT04tTkxTLTEkCi0JCQkJdGFibGUucHV0KHVyaSwgaW5mbyk7Ci0JCQkJbGlzdC5hZGQoaW5mbyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld01vZGVsV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld01vZGVsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmNkMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdNb2RlbFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLQotcHVibGljIGNsYXNzIE5ld01vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaCBmV29ya2JlbmNoOwotCXByb3RlY3RlZCBTdHJpbmcgZkN1cnJlbnREaXJlY3Rvcnk7Ci0KLQlwdWJsaWMgTmV3TW9kZWxXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuZldvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJdGhpcy5mU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IChXaXphcmRQYWdlKSBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQlpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3VycmVudFBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHNob3dGaWxlRGlhbG9nCi0JICovCi0JcHVibGljIEZpbGVEaWFsb2cgc2hvd0ZpbGVEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBkZWZhdWx0RGlyZWN0b3J5LCBTdHJpbmcgZGVmYXVsdEZpbGUsIFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpIHsKLQkJRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQotCQkvLyBHZXQgdGhlIGxhc3QgdmlzaXQgZGlyZWN0b3J5IGlmIHdlIGhhdmVuJ3QgZGVmaW5lZCBhIHBhcnRpY3VsYXIgb25lCi0JCS8vIGhlcmUuCi0JCWlmICgoZGVmYXVsdERpcmVjdG9yeSA9PSBudWxsKSB8fCAoZGVmYXVsdERpcmVjdG9yeS5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVmYXVsdERpcmVjdG9yeSA9Ci0JCQkvLyBMb2NhdGUuaW5zdGFuY2UodGhpcykuZ2V0TGFzdFNlbGVjdGVkRGlyZWN0b3J5KGdldFJlc291cmNlUGF0aCgpKTsKLQkJfQotCi0JCWlmICgoZGVmYXVsdERpcmVjdG9yeSAhPSBudWxsKSAmJiAoZGVmYXVsdERpcmVjdG9yeS5sZW5ndGgoKSAhPSAwKSkgewotCQkJZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKGRlZmF1bHREaXJlY3RvcnkpOwotCQl9Ci0KLQkJZmlsZURpYWxvZy5zZXRGaWxlTmFtZShkZWZhdWx0RmlsZSk7Ci0JCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQotCQlmaWxlRGlhbG9nLm9wZW4oKTsKLQotCQlyZXR1cm4gZmlsZURpYWxvZzsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnREaXJlY3RvcnkoU3RyaW5nIGN1cnJlbnREaXJlY3RvcnkxKSB7Ci0JCXRoaXMuZkN1cnJlbnREaXJlY3RvcnkgPSBjdXJyZW50RGlyZWN0b3J5MTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVdvcmtiZW5jaFJlc291cmNlKElDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJSVBhdGggcGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpOwotCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQlJRmlsZSBmaWxlID0gY29udGFpbmVyLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZS5jcmVhdGUobnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gWE1MQnVpbGRlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRW5jb3VudGVyZWQKLQkJCQkvLyBleGNlcHRpb24gY3JlYXRpbmcgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0UGFnZQotCSAqLwotCXB1YmxpYyBjbGFzcyBTdGFydFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgaW50IHNlbGVjdGVkQnV0dG9uOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gcmFkaW9CdXR0b25MYWJlbDsKLQkJcHJvdGVjdGVkIEJ1dHRvbltdIHJhZGlvQnV0dG9uOwotCi0JCXB1YmxpYyBTdGFydFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmdbXSByYWRpb0J1dHRvbkxhYmVsKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCQl0aGlzLnJhZGlvQnV0dG9uTGFiZWwgPSByYWRpb0J1dHRvbkxhYmVsOwotCQkJcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uW3JhZGlvQnV0dG9uTGFiZWwubGVuZ3RoXTsKLQkJfQotCi0JCXB1YmxpYyBCdXR0b24gZ2V0UmFkaW9CdXR0b25BdEluZGV4KGludCBpKSB7Ci0JCQlCdXR0b24gcmVzdWx0ID0gbnVsbDsKLQkJCWlmICgoaSA+PSAwKSAmJiAoaSA8IHJhZGlvQnV0dG9uLmxlbmd0aCkpIHsKLQkJCQlyZXN1bHQgPSByYWRpb0J1dHRvbltpXTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFNlbGVjdGVkUmFkaW9CdXR0b25JbmRleCgpIHsKLQkJCWludCByZXN1bHQgPSAtMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9CdXR0b24ubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocmFkaW9CdXR0b25baV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJcmVzdWx0ID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgYmFzZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQliYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkJLy8gcmFkaW8gYnV0dG9ucycgY29udGFpbmVyCi0JCQlDb21wb3NpdGUgcmFkaW9CdXR0b25zR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGJhc2UsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQotCQkJcmFkaW9CdXR0b25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ2QuaGVpZ2h0SGludCA9IDMwMDsKLQkJCWdkLndpZHRoSGludCA9IDQwMDsKLQkJCXJhZGlvQnV0dG9uc0dyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvQnV0dG9uTGFiZWwubGVuZ3RoOyBpKyspIHsKLQkJCQlyYWRpb0J1dHRvbltpXSA9IG5ldyBCdXR0b24ocmFkaW9CdXR0b25zR3JvdXAsIFNXVC5SQURJTyk7Ci0JCQkJcmFkaW9CdXR0b25baV0uc2V0VGV4dChyYWRpb0J1dHRvbkxhYmVsW2ldKTsKLQkJCQlyYWRpb0J1dHRvbltpXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQkvLyByYWRpb0J1dHRvbltpXS5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJCX0KLQkJCXNldENvbnRyb2woYmFzZSk7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogTmV3RmlsZVBhZ2UKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTmV3RmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQkJcHVibGljIFN0cmluZyBkZWZhdWx0TmFtZSA9ICJOZXdGaWxlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRGaWxlRXh0ZW5zaW9uID0gIi50eHQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zID0geyIqLnR4dCJ9OyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCQlwdWJsaWMgTmV3RmlsZVBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlzdXBlcigiIiwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkgewotCQkJaW50IGNvdW50ID0gMDsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgZGVmYXVsdEZpbGVFeHRlbnNpb247Ci0JCQlJUGF0aCBjb250YWluZXJGdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCQlpZiAoY29udGFpbmVyRnVsbFBhdGggIT0gbnVsbCkgewotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQkJCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMocGF0aCkpIHsKLQkJCQkJCWNvdW50Kys7Ci0JCQkJCQlmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgY291bnQgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0KLQkJLy8gcmV0dXJucyB0cnVlIGlmIGZpbGUgb2Ygc3BlY2lmaWVkIG5hbWUgZXhpc3RzIGluIGFueSBjYXNlIGZvcgotCQkvLyBzZWxlY3RlZCBjb250YWluZXIKLQkJcHJvdGVjdGVkIFN0cmluZyBleGlzdHNGaWxlQW55Q2FzZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCWlmICgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZS5jb21wYXJlVG8oIiIpICE9IDApKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJLy8gbG9vayB0aHJvdWdoIGFsbCByZXNvdXJjZXMgYXQgdGhlIHNwZWNpZmllZCBjb250YWluZXIgLQotCQkJCS8vIGNvbXBhcmUgaW4gdXBwZXIgY2FzZQotCQkJCUlSZXNvdXJjZSBwYXJlbnQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcGFyZW50OwotCQkJCQl0cnkgewotCQkJCQkJSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQkJCQlTdHJpbmcgZW50ZXJlZEZpbGVVcHBlciA9IGZpbGVOYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlTdHJpbmcgcmVzb3VyY2VVcHBlck5hbWUgPSBtZW1iZXJzW2ldLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwotCQkJCQkJCWlmIChyZXNvdXJjZVVwcGVyTmFtZS5lcXVhbHMoZW50ZXJlZEZpbGVVcHBlcikpIHsKLQkJCQkJCQkJcmV0dXJuIG1lbWJlcnNbaV0uZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQkJU3RyaW5nIGZ1bGxGaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZnVsbEZpbGVOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxXaXphcmRzTWVzc2FnZXMuX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04sIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlRXh0ZW5zaW9uLCBsZXQncyBjaGVjayBmb3IgdGhpcyBmaWxlIHdpdGggZGVmYXVsdCBmaWxlCi0JCQkvLyBleHRlbnNpb24KLQkJCWZ1bGxGaWxlTmFtZSArPSBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLQkJCWlmICgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChnZXRGaWxlTmFtZSgpLmNvbXBhcmVUbygiIikgIT0gMCkpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlQYXRoIGZ1bGxQYXRoID0gbmV3IFBhdGgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS50b1N0cmluZygpICsgJy8nICsgZnVsbEZpbGVOYW1lKTsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZnVsbFBhdGgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShYTUxXaXphcmRzTWVzc2FnZXMuX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBmb3IgZmlsZSBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZQotCQkJU3RyaW5nIHNhbWVOYW1lID0gZXhpc3RzRmlsZUFueUNhc2UoZnVsbEZpbGVOYW1lKTsKLQkJCWlmIChzYW1lTmFtZSAhPSBudWxsKSB7Ci0JCQkJLy8gSVNTVUU6IGlzIHF1YWxpdGlmZWRGaWxlTmFtZSBub3QgbmVlZGVkLCBvciBpcyBpdCBzdXBwb3NlZAotCQkJCS8vIHRvIGJlIHVzZWQgaW4gZXJyb3IgbWVzc2FnZT8KLQkJCQkvLyBTdHJpbmcgcXVhbGlmaWVkRmlsZU5hbWUgPQotCQkJCS8vIGdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICcvJyArIGZ1bGxGaWxlTmFtZTsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoWE1MV2l6YXJkc01lc3NhZ2VzLl9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTICsgIiAiICsgc2FtZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXR1cm4gc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCS8vIGluaGVyaXQgZGVmYXVsdCBjb250YWluZXIgYW5kIG5hbWUgc3BlY2lmaWNhdGlvbiB3aWRnZXRzCi0JCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCQl0aGlzLnNldEZpbGVOYW1lKGNvbXB1dGVEZWZhdWx0RmlsZU5hbWUoKSk7Ci0JCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIFhNTCBDb250ZW50IHR5cGUKLQkJICogCi0JCSAqIEByZXR1cm4gTGlzdAotCQkgKi8KLQkJTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQkJfQotCQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JCX0KLQotCQkvKioKLQkJICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlCi0JCSAqIGNvbnRlbnQgdHlwZSBpbnRvIGNvbnNpZGVyYXRpb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkJICogQHJldHVybiB0cnVlIGlmIGV4dGVuc2lvbiBpcyB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLQkJICovCi0JCWJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhbiBleHRlbnNpb24KLQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudAotCQkJCS8vIGV4dGVuc2lvbgotCQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQkJaW50IGkgPSAwOwotCQkJCXdoaWxlICgoaSA8IHR5cGVzLmxlbmd0aCkgJiYgIXZhbGlkKSB7Ci0JCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJCSsraTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2YWxpZCA9IHRydWU7IC8vIG5vIGV4dGVuc2lvbiBzbyB2YWxpZAotCQkJfQotCQkJcmV0dXJuIHZhbGlkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNmE0MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTmV3WE1MR2VuZXJhdG9yIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ3JhbW1hclVSSTsKLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBjbURvY3VtZW50OwotCXByb3RlY3RlZCBpbnQgYnVpbGRQb2xpY3k7Ci0JcHJvdGVjdGVkIFN0cmluZyByb290RWxlbWVudE5hbWU7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2dFbnRyeSB4bWxDYXRhbG9nRW50cnk7Ci0KLQkvLyBpbmZvIGZvciBkdGQKLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U3lzdGVtSWQ7Ci0KLQkvLyBpbmZvIGZvciB4c2QKLQlwdWJsaWMgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLQotCXB1YmxpYyBOZXdYTUxHZW5lcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5ld1hNTEdlbmVyYXRvcihTdHJpbmcgZ3JhbW1hclVSSSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCXRoaXMuZ3JhbW1hclVSSSA9IGdyYW1tYXJVUkk7Ci0JCXRoaXMuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpLCBTdHJpbmdbXSBlcnJvckluZm8pIHsKLQkJU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQlMaXN0IGVycm9yTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gbnVsbDsKLQotCQlpZiAoVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCB0cnVlKSkgewotCQkJLy8gKGNzKSBhc3N1bWUgdGhlIHVyaSBoYXMgYmVlbiBwcm92aWRlZCBpbiBhIG5vcm1hbGl6ZWQgZm9ybQotCQkJY21Eb2N1bWVudCA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDTURvY3VtZW50KHVyaSwgbnVsbCk7Ci0KLQkJCWlmICh1cmkuZW5kc1dpdGgoIi5kdGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGVycm9yTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJCXRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9JTlZBTElEX0dSQU1NQVJfRVJST1I7Ci0JCQkJCW1lc3NhZ2UgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX0VSUk9SX0RURF9JTlZBTElEX0lORk87Ci0JCQkJfQotCQkJfQotCQkJZWxzZSAvLyAiLnhzZCIKLQkJCXsKLQkJCQkvLyBUbyBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHNjaGVtYSBlZGl0b3IgdmFsaWRhdGlvbgotCQkJCVhNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyIHZhbGlkYXRvciA9IG5ldyBYTUxTY2hlbWFWYWxpZGF0aW9uQ2hlY2tlcigpOwotCQkJCWlmICghdmFsaWRhdG9yLmlzVmFsaWQodXJpKSkgewotCQkJCQl0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SOwotCQkJCQltZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9FUlJPUl9TQ0hFTUFfSU5WQUxJRF9JTkZPOwotCQkJCX0KLQkJCQllbHNlIGlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJaW50IGdsb2JhbEVsZW1lbnRDb3VudCA9IGNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKTsKLQkJCQkJaWYgKGdsb2JhbEVsZW1lbnRDb3VudCA9PSAwKSB7Ci0JCQkJCQl0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19USVRMRV9OT19ST09UX0VMRU1FTlRTOwotCQkJCQkJbWVzc2FnZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19NU0dfTk9fUk9PVF9FTEVNRU5UUzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX1RJVExFX05PX1JPT1RfRUxFTUVOVFM7Ci0JCQltZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gKyAiICIgKyB1cmk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllcnJvckluZm9bMF0gPSB0aXRsZTsKLQkJZXJyb3JJbmZvWzFdID0gbWVzc2FnZTsKLQotCQlyZXR1cm4gY21Eb2N1bWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYXBwbHlMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSwgbmV3IElTY29wZUNvbnRleHRbXSB7bmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSksIG5ldyBJbnN0YW5jZVNjb3BlKCkgfSk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UodGV4dCwgIlxyXG4iLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxyIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcbiIsIGxpbmVEZWxpbWl0ZXIpOwotCQlyZXR1cm4gY29udmVydGVkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlVGVtcGxhdGVYTUxEb2N1bWVudChJRmlsZSwgU3RyaW5nKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRW1wdHlYTUxEb2N1bWVudChJRmlsZSBuZXdGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNoYXJTZXQgPSBnZXRVc2VyUHJlZmVycmVkQ2hhcnNldCgpOwotCQlTdHJpbmcgY29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGNoYXJTZXQgKyAiXCI/PiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQljcmVhdGVUZW1wbGF0ZVhNTERvY3VtZW50KG5ld0ZpbGUsIGNvbnRlbnRzKTsKLQl9Ci0JCi0Jdm9pZCBjcmVhdGVUZW1wbGF0ZVhNTERvY3VtZW50KElGaWxlIG5ld0ZpbGUsIFN0cmluZyBjb250ZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2hhclNldCA9IGdldFVzZXJQcmVmZXJyZWRDaGFyc2V0KCk7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQotCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KSk7Ci0JCQljb250ZW50cyA9IGFwcGx5TGluZURlbGltaXRlcihuZXdGaWxlLCBjb250ZW50cyk7Ci0JCQl3cml0ZXIucHJpbnRsbihjb250ZW50cyk7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJbmV3RmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VXNlclByZWZlcnJlZENoYXJzZXQoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJcmV0dXJuIGNoYXJTZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlWE1MRG9jdW1lbnQoU3RyaW5nIHhtbEZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKHhtbEZpbGVOYW1lKTsKLQkJU3RyaW5nIGNoYXJzZXQgPSBudWxsOwotCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJY2hhcnNldCA9IGNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0KCk7Ci0JCX0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IGNyZWF0ZVhNTERvY3VtZW50KHhtbEZpbGVOYW1lLCBjaGFyc2V0KTsKLQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh4bWxGaWxlTmFtZSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCW91dHB1dFN0cmVhbS53cml0ZVRvKGZvcyk7Ci0JCWZvcy5jbG9zZSgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgY3JlYXRlWE1MRG9jdW1lbnQoSUZpbGUgbmV3RmlsZSwgU3RyaW5nIHhtbEZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNoYXJzZXQgPSBuZXdGaWxlLmdldENoYXJzZXQoKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IGNyZWF0ZVhNTERvY3VtZW50KHhtbEZpbGVOYW1lLCBjaGFyc2V0KTsKLQotCQlTdHJpbmcgY29udGVudHMgPSBvdXRwdXRTdHJlYW0udG9TdHJpbmcoY2hhcnNldCk7Ci0JCWNvbnRlbnRzID0gYXBwbHlMaW5lRGVsaW1pdGVyKG5ld0ZpbGUsIGNvbnRlbnRzKTsKLQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50cy5nZXRCeXRlcyhjaGFyc2V0KSk7Ci0JCW5ld0ZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCi0JcHVibGljIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBjcmVhdGVYTUxEb2N1bWVudChTdHJpbmcgeG1sRmlsZU5hbWUsIFN0cmluZyBjaGFyc2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGNoYXJzZXQgPT0gbnVsbCkgewotCQkJY2hhcnNldCA9IGdldFVzZXJQcmVmZXJyZWRDaGFyc2V0KCk7Ci0JCQlpZiAoY2hhcnNldCA9PSBudWxsKSB7Ci0JCQkJY2hhcnNldCA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBnZXRDTURvY3VtZW50KCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjbURvY3VtZW50KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChnZXRSb290RWxlbWVudE5hbWUoKSk7Ci0KLQkJLy8gY3JlYXRlIHRoZSB4bWwgbW9kZWwKLQkJQ01OYW1lZE5vZGVNYXAgbmFtZU5vZGVNYXAgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBuYW1lTm9kZU1hcC5nZXROYW1lZEl0ZW0oZ2V0Um9vdEVsZW1lbnROYW1lKCkpOwotCi0JCURvY3VtZW50IHhtbERvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCURPTUNvbnRlbnRCdWlsZGVySW1wbCBjb250ZW50QnVpbGRlciA9IG5ldyBET01Db250ZW50QnVpbGRlckltcGwoeG1sRG9jdW1lbnQpOwotCi0JCS8vIHRoaXMgJ3VnbHlUZW1wSGFjaycgZmxhZyBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBzdXByZXNzIHRoZQotCQkvLyBjcmVhdGlvbiBhIGRlZmF1bHQgZW5jb2RpbmcKLQkJLy8gd2UnbGwgaGFuZGxlIHRoaXMgbGF0ZXIgaW4gdGhlIGRvbVdyaXRlci5wcmludCgpIG1ldGhvZCB1c2VkIGJlbG93Ci0JCS8vCi0JCWNvbnRlbnRCdWlsZGVyLnN1cHJlc3NDcmVhdGlvbk9mRG9jdHlwZUFuZFhNTERlY2xhcmF0aW9uID0gdHJ1ZTsKLQkJY29udGVudEJ1aWxkZXIuc2V0QnVpbGRQb2xpY3koYnVpbGRQb2xpY3kpOwotCQljb250ZW50QnVpbGRlci5zZXRFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0KG5ldyBNeUV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQobmFtZXNwYWNlSW5mb0xpc3QsIHhtbEZpbGVOYW1lKSk7Ci0JCWNvbnRlbnRCdWlsZGVyLmNyZWF0ZURlZmF1bHRSb290Q29udGVudChjbURvY3VtZW50LCBjbUVsZW1lbnREZWNsYXJhdGlvbiwgbmFtZXNwYWNlSW5mb0xpc3QpOwotCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgY2hhcnNldCk7Ci0KLQkJRE9NV3JpdGVyIGRvbVdyaXRlciA9IG5ldyBET01Xcml0ZXIob3V0cHV0U3RyZWFtV3JpdGVyKTsKLQotCQkvLyBUT0RPLi4uIGluc3RlYWQgb2YgcmVseWluZyBvbiBmaWxlIGV4dGVuc2lvbnMsIHdlIG5lZWQgdG8ga2VlcAotCQkvLyB0cmFjayBvZiB0aGUgZ3JhbW1hciB0eXBlCi0JCS8vIGJldHRlciB5ZXQgd2Ugc2hvdWxkIHJlYXRlIGFuIFNTRSBkb2N1bWVudCBzbyB0aGF0IHdlIGNhbiBmb3JtYXQgaXQKLQkJLy8gbmljZWx5IGJlZm9yZSBzYXZpbmcKLQkJLy8gdGhlbiB3ZSB3b24ndCBuZWVkIHRoZSBET01Xcml0ZXIgYXQgYWxsCi0JCS8vCi0JCWRvbVdyaXRlci5wcmludCh4bWxEb2N1bWVudCwgY2hhcnNldCwgY21Eb2N1bWVudC5nZXROb2RlTmFtZSgpLCBnZXROb25XaGl0ZXNwYWNlU3RyaW5nKGdldFB1YmxpY0lkKCkpLCBnZXROb25XaGl0ZXNwYWNlU3RyaW5nKGdldFN5c3RlbUlkKCkpKTsKLQkJb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0JCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCi0JCXJldHVybiBvdXRwdXRTdHJlYW07Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVOYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IChMaXN0KSBjbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvY29tcGxldGVOYW1lc3BhY2VJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gcmVzdWx0LnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgcmVzdWx0LmdldChpKTsKLQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJU3RyaW5nIGxvY2F0aW9uSW5mbyA9IG51bGw7Ci0JCQkJCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5ICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5LmdldEVudHJ5VHlwZSgpID09IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMpIHsKLQkJCQkJCQkJbG9jYXRpb25JbmZvID0geG1sQ2F0YWxvZ0VudHJ5LmdldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWxvY2F0aW9uSW5mbyA9IHhtbENhdGFsb2dFbnRyeS5nZXRLZXkoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobG9jYXRpb25JbmZvID09IG51bGwpIHsKLQkJCQkJCQlsb2NhdGlvbkluZm8gPSBkZWZhdWx0U3lzdGVtSWQ7Ci0JCQkJCQl9Ci0JCQkJCQlpbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSW5mbzsKLQkJCQkJCWluZm8uc2V0UHJvcGVydHkoImxvY2F0aW9uSGludC1yZWFkT25seSIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJaW5mby5zZXRQcm9wZXJ0eSgidXJpLXJlYWRPbmx5IiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlpbmZvLnNldFByb3BlcnR5KCJ1bnJlbW92YWJsZSIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9IGVsc2UgewotCQkJCQkJaW5mby5sb2NhdGlvbkhpbnQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlOYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBOYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIoKTsKLQkJCWJ1aWxkZXIuc2V0QnVpbGRQb2xpY3koQ29udGVudEJ1aWxkZXIuQlVJTERfT05MWV9SRVFVSVJFRF9DT05URU5UKTsKLQkJCWJ1aWxkZXIudmlzaXRDTU5vZGUoY21Eb2N1bWVudCk7Ci0JCQlyZXN1bHQuYWRkQWxsKGJ1aWxkZXIubGlzdCk7Ci0JCX0KLQkJbmFtZXNwYWNlSW5mb0xpc3QgPSByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc01pc3NpbmdOYW1lc3BhY2VMb2NhdGlvbigpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5sb2NhdGlvbkhpbnQgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXROYW1lc3BhY2VJbmZvRXJyb3JzKCkgewotCQlTdHJpbmdbXSBlcnJvckxpc3QgPSBudWxsOwotCi0vLyBObyB3YXJuaW5ncyBzaG91bGQgYmUgZ2l2ZW4gd2hlbiBuYW1lc3BhY2VzIGVudHJpZXMgaGF2ZSBtaXNzaW5nIGxvY2F0aW9uIGhpbnRzCi0vLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTEyOAkJCi0vLwkJaWYgKChuYW1lc3BhY2VJbmZvTGlzdCAhPSBudWxsKSAmJiBpc01pc3NpbmdOYW1lc3BhY2VMb2NhdGlvbigpKSB7Ci0vLwkJCVN0cmluZyB0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfTk9fTE9DQVRJT05fSElOVDsKLS8vCQkJU3RyaW5nIG1lc3NhZ2UgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMSArICIgIiArIFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8yICsgIlxuXG4iICsgWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8KLS8vCQkJZXJyb3JMaXN0ID0gbmV3IFN0cmluZ1syXTsKLS8vCQkJZXJyb3JMaXN0WzBdID0gdGl0bGU7Ci0vLwkJCWVycm9yTGlzdFsxXSA9IG1lc3NhZ2U7Ci0vLwkJfQotCQlyZXR1cm4gZXJyb3JMaXN0OwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0WE1MQ2F0YWxvZ0VudHJ5KElDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5KSB7Ci0JCXhtbENhdGFsb2dFbnRyeSA9IGNhdGFsb2dFbnRyeTsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCXJldHVybiB4bWxDYXRhbG9nRW50cnk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgcG9saWN5KSB7Ci0JCWJ1aWxkUG9saWN5ID0gcG9saWN5OwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFN5c3RlbUlkKFN0cmluZyBzeXNJZCkgewotCQlkZWZhdWx0U3lzdGVtSWQgPSBzeXNJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRTeXN0ZW1JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzSWQpIHsKLQkJc3lzdGVtSWQgPSBzeXNJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YklkKSB7Ci0JCXB1YmxpY0lkID0gcHViSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHB1YmxpY0lkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYW1tYXJVUkkoU3RyaW5nIGdyYW1VUkkpIHsKLQkJZ3JhbW1hclVSSSA9IGdyYW1VUkk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRHcmFtbWFyVVJJKCkgewotCQlyZXR1cm4gZ3JhbW1hclVSSTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDTURvY3VtZW50KENNRG9jdW1lbnQgY21Eb2MpIHsKLQkJY21Eb2N1bWVudCA9IGNtRG9jOwotCX0KLQotCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBjbURvY3VtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3RFbGVtZW50TmFtZShTdHJpbmcgcm9vdE5hbWUpIHsKLQkJcm9vdEVsZW1lbnROYW1lID0gcm9vdE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSb290RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiByb290RWxlbWVudE5hbWU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0IGltcGxlbWVudHMgRE9NQ29udGVudEJ1aWxkZXJJbXBsLkV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgewotCQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDE7Ci0JCXByb3RlY3RlZCBVUklSZXNvbHZlciBpZFJlc29sdmVyOwotCQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlTG9jYXRpb247Ci0KLQkJcHJvdGVjdGVkIE15RXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydChMaXN0IG5hbWVzcGFjZUluZm9MaXN0UGFyYW0sIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCQl0aGlzLm5hbWVzcGFjZUluZm9MaXN0MSA9IG5hbWVzcGFjZUluZm9MaXN0UGFyYW07Ci0JCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQkJaWRSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQkJaWYgKChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVVSSS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCVN0cmluZyBsb2NhdGlvbkhpbnQgPSBudWxsOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0MS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJCQlpZiAobmFtZXNwYWNlVVJJLmVxdWFscyhpbmZvLnVyaSkpIHsKLQkJCQkJCWxvY2F0aW9uSGludCA9IGluZm8ubG9jYXRpb25IaW50OwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxvY2F0aW9uSGludCAhPSBudWxsKSB7Ci0JCQkJCWdyYW1tYXJVUkkgPSBpZFJlc29sdmVyLnJlc29sdmUocmVzb3VyY2VMb2NhdGlvbiwgbG9jYXRpb25IaW50LCBsb2NhdGlvbkhpbnQpOwotCQkJCQlyZXN1bHQgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlQ01Eb2N1bWVudChnZXRHcmFtbWFyVVJJKCksIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IGNtRG9jdW1lbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9uV2hpdGVzcGFjZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RyaW5nICE9IG51bGwpIHsKLQkJCWlmIChzdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCXJlc3VsdCA9IHN0cmluZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzI2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMjEyMzMwCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdYTUxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE5ld1hNTEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gCUhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdyhldmVudCk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd29ya2JlbmNoV2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gZ2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLQkJaWYgKChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElGaWxlKSAmJiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBzZWxlY3RlZE9iamVjdDsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCXRyeSB7Ci0JCQkJTmV3WE1MV2l6YXJkLnNob3dEaWFsb2cod29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksIGZpbGUsIHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IAotCi0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlJdGVyYXRvciBpID0gZXMuaXRlcmF0b3IoKTsKLQkJCWlmIChpLmhhc05leHQoKSkgewotCQkJCXJlc3VsdCA9IGkubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5YTAxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTDsKLQotLyoqCi0gKiBUZW1wbGF0ZXMgcGFnZSBpbiBuZXcgZmlsZSB3aXphcmQuIEFsbG93cyB1c2VycyB0byBzZWxlY3QgYSBuZXcgZmlsZQotICogdGVtcGxhdGUgdG8gYmUgYXBwbGllZCBpbiBuZXcgZmlsZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgdGVtcGxhdGVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJLyoqIFRoZSB0ZW1wbGF0ZSBzdG9yZS4gKi8KLQkJcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZTdG9yZTsKLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlN0b3JlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGVtcGxhdGVzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgZWxlbWVudDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqIExhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUgbmFtZSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWU7Ci0JLyoqIFRoZSB2aWV3ZXIgZGlzcGxheXMgdGhlIHBhdHRlcm4gb2Ygc2VsZWN0ZWQgdGVtcGxhdGUuICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlBhdHRlcm5WaWV3ZXI7Ci0JLyoqIFRoZSB0YWJsZSBwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JLyoqIFRlbXBsYXRlIHN0b3JlIHVzZWQgYnkgdGhpcyB3aXphcmQgcGFnZSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkvKiogQ2hlY2tib3ggZm9yIHVzaW5nIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoIk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UiLCBYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgWE1MIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbmFibGVUZW1wbGF0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgVGVtcGxhdGVzIHRhYmxlCi0JCUNvbXBvc2l0ZSBpbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgaW5uZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbm5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaW5uZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJaW5uZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXQoaW5uZXJMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBDcmVhdGUgbGlua2VkIHRleHQgdG8ganVzdCB0byB0ZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMyk7Ci0KLQkJZlRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlbXBsYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZlRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkgewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJU291cmNlVmlld2VyIHZpZXdlciA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCQl2aWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCUNvbnRyb2wgY29udHJvbCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGluIHBhZ2UgYmFzZWQgb24gZlVzZVRlbXBsYXRlQnV0dG9uJ3MgY3VycmVudAotCSAqIHN0YXRlLgotCSAqLwotCXZvaWQgZW5hYmxlVGVtcGxhdGVzKCkgewotCQlib29sZWFuIGVuYWJsZWQgPSBmVXNlVGVtcGxhdGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKCFlbmFibGVkKSB7Ci0JCQkvLyBzYXZlIGxhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IHhtbCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBYTUwgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICgodGVtcGxhdGVOYW1lID09IG51bGwpIHx8ICh0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBYTUwgRmlsZSB3aXphcmQuCi0JICovCi0Jdm9pZCBzYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSB0ZW1wbGF0ZSBpbiB0aGUgdGFibGUgdmlld2VyIGdpdmVuIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZgotCSAqIHRlbXBsYXRlIG5hbWUgY2Fubm90IGJlIGZvdW5kIG9yIHRlbXBsYXRlTmFtZSBpcyBudWxsLCBqdXN0IHNlbGVjdAotCSAqIGZpcnN0IGl0ZW0gaW4gdGFibGUuIElmIG5vIGl0ZW1zIGluIHRhYmxlIHNlbGVjdCBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCU9iamVjdCB0ZW1wbGF0ZSA9IG51bGw7Ci0KLQkJaWYgKCh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCkgJiYgKHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkvLyBwaWNrIHRoZSBsYXN0IHVzZWQgdGVtcGxhdGUKLQkJCXRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQl9Ci0KLQkJLy8gbm8gcmVjb3JkIG9mIGxhc3QgdXNlZCB0ZW1wbGF0ZSBzbyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQlpZiAodGVtcGxhdGUgPT0gbnVsbCkgewotCQkJLy8ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJCXRlbXBsYXRlID0gZlRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZW1wbGF0ZSk7Ci0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwYXR0ZXJuIHZpZXdlci4KLQkgKi8KLQl2b2lkIHVwZGF0ZVZpZXdlcklucHV0KCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFmODE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCSAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Jlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQuQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi1wdWJsaWMgY2xhc3MgTmV3WE1MV2l6YXJkIGV4dGVuZHMgTmV3TW9kZWxXaXphcmQgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENSRUFURV9GUk9NX0RURCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFX0ZST01fWFNEID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfRlJPTV9TQ1JBVENIID0gMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gY3JlYXRlRnJvbVJhZGlvQnV0dG9uTGFiZWwgPSB7WE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9SQURJT19YTUxfRlJPTV9EVEQsIFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfUkFESU9fWE1MX0ZST01fU0NIRU1BLCBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1JBRElPX1hNTF9GUk9NX1NDUkFUQ0h9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmaWxlUGFnZUZpbHRlckV4dGVuc2lvbnMgPSB7Ii54bWwifTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gYnJvd3NlWFNERmlsdGVyRXh0ZW5zaW9ucyA9IHsiLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBicm93c2VEVERGaWx0ZXJFeHRlbnNpb25zID0geyIuZHRkIn07IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBOZXdGaWxlUGFnZSBuZXdGaWxlUGFnZTsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBjbGllbnRzIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0byBjaGFuZ2Ugc3RhcnQgcGFnZQotCSAqLwotCXByb3RlY3RlZCBTdGFydFBhZ2Ugc3RhcnRQYWdlOwotCXByaXZhdGUgU3RhcnRQYWdlIGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZTsKLQlwcm90ZWN0ZWQgU2VsZWN0R3JhbW1hckZpbGVQYWdlIHNlbGVjdEdyYW1tYXJGaWxlUGFnZTsKLQlwcm90ZWN0ZWQgU2VsZWN0Um9vdEVsZW1lbnRQYWdlIHNlbGVjdFJvb3RFbGVtZW50UGFnZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgY21Eb2N1bWVudEVycm9yTWVzc2FnZTsKLQotCXByb3RlY3RlZCBOZXdYTUxHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCXByaXZhdGUgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZTsKLQotCi0JcHVibGljIE5ld1hNTFdpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfQ1JFQVRFX05FV19USVRMRSk7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19XSVpCQU5fR0VORVJBVEVYTUwpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJZ2VuZXJhdG9yID0gbmV3IE5ld1hNTEdlbmVyYXRvcigpOwotCX0KLQotCi0JcHVibGljIE5ld1hNTFdpemFyZChJRmlsZSBmaWxlLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJdGhpcygpOwotCi0JCWdlbmVyYXRvci5zZXRHcmFtbWFyVVJJKFVSSUhlbHBlci5nZXRQbGF0Zm9ybVVSSShmaWxlKSk7Ci0JCWdlbmVyYXRvci5zZXRDTURvY3VtZW50KGNtRG9jdW1lbnQpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNob3dEaWFsb2coU2hlbGwgc2hlbGwsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJU3RyaW5nW10gZXJyb3JJbmZvID0gbmV3IFN0cmluZ1syXTsKLQkJLy8gKGNzKSB0aGUgVVJJIGFyZ3VtZW50IHRvIGNyZWF0ZUNNRG9jdW1lbnQgbmVlZHMgdG8gYmUgYSBmdWxseQotCQkvLyBxdWFsaWZpZWQgVVJJCi0JCS8vCi0JCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IE5ld1hNTEdlbmVyYXRvci5jcmVhdGVDTURvY3VtZW50KFVSSUhlbHBlci5nZXRQbGF0Zm9ybVVSSShmaWxlKSwgZXJyb3JJbmZvKTsKLQkJaWYgKGVycm9ySW5mb1swXSA9PSBudWxsKSB7Ci0JCQlOZXdYTUxXaXphcmQgd2l6YXJkID0gbmV3IE5ld1hNTFdpemFyZChmaWxlLCBjbURvY3VtZW50KTsKLQkJCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJd2l6YXJkLnNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfRElBTE9HX05FV19USVRMRSk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JCWVsc2UgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIGVycm9ySW5mb1swXSwgZXJyb3JJbmZvWzFdKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTdHJpbmcgZ3JhbW1hclVSSSA9IGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCk7Ci0JCQotCQkvLyBuZXcgZmlsZSBwYWdlCi0JCW5ld0ZpbGVQYWdlID0gbmV3IE5ld0ZpbGVQYWdlKGZTZWxlY3Rpb24pOwotCQluZXdGaWxlUGFnZS5zZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfSEVBRElORyk7Ci0JCW5ld0ZpbGVQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9FWFBMKTsKLQkJbmV3RmlsZVBhZ2UuZGVmYXVsdE5hbWUgPSAoZ3JhbW1hclVSSSAhPSBudWxsKSA/IFVSSUhlbHBlci5yZW1vdmVGaWxlRXh0ZW5zaW9uKFVSSUhlbHBlci5nZXRMYXN0U2VnbWVudChncmFtbWFyVVJJKSkgOiAiTmV3RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJbmV3RmlsZVBhZ2UuZGVmYXVsdEZpbGVFeHRlbnNpb24gPSAiLiIgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZVBhZ2UuZmlsdGVyRXh0ZW5zaW9ucyA9IGZpbGVQYWdlRmlsdGVyRXh0ZW5zaW9uczsKLQkJYWRkUGFnZShuZXdGaWxlUGFnZSk7Ci0KLQkJaWYgKGdyYW1tYXJVUkkgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHhtbCBmcm9tIHBhZ2UKLQkJCWZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZSA9IG5ldyBTdGFydFBhZ2UoIlN0YXJ0UGFnZSIsIGNyZWF0ZUZyb21SYWRpb0J1dHRvbkxhYmVsKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQkJCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCQlnZXRSYWRpb0J1dHRvbkF0SW5kZXgoZ2V0Q3JlYXRlTW9kZSgpKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCWdldFJhZGlvQnV0dG9uQXRJbmRleChnZXRDcmVhdGVNb2RlKCkpLnNldEZvY3VzKCk7Ci0KLQkJCQkJLy8gU2V0IHRoZSBoZWxwIGNvbnRleHQgZm9yIGVhY2ggYnV0dG9uCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlLmdldFJhZGlvQnV0dG9uQXRJbmRleCgwKSwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMV9IRUxQSUQpOwotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZS5nZXRSYWRpb0J1dHRvbkF0SW5kZXgoMSksIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX0NSRUFURVhNTDJfSEVMUElEKTsKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2UuZ2V0UmFkaW9CdXR0b25BdEluZGV4KDIpLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9DUkVBVEVYTUwzX0hFTFBJRCk7Ci0JCQkJfQotCQkJfTsKLQotCi0JCQlmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2Uuc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9IRUFESU5HKTsKLQkJCWZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZS5zZXREZXNjcmlwdGlvbihYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0VYUEwpOwotCQkJYWRkUGFnZShmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2UpOwotCQl9Ci0KLQkJLy8gc2VsZWN0R3JhbW1hckZpbGVQYWdlCi0JCXNlbGVjdEdyYW1tYXJGaWxlUGFnZSA9IG5ldyBTZWxlY3RHcmFtbWFyRmlsZVBhZ2UoKTsKLQkJYWRkUGFnZShzZWxlY3RHcmFtbWFyRmlsZVBhZ2UpOwotCi0JCS8vIHNlbGVjdCByb290IGVsZW1lbnQgcGFnZQotCQlzZWxlY3RSb290RWxlbWVudFBhZ2UgPSBuZXcgU2VsZWN0Um9vdEVsZW1lbnRQYWdlKCk7Ci0JCXNlbGVjdFJvb3RFbGVtZW50UGFnZS5zZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9IRUFESU5HKTsKLQkJc2VsZWN0Um9vdEVsZW1lbnRQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9ST09UX0VYUEwpOwotCQlhZGRQYWdlKHNlbGVjdFJvb3RFbGVtZW50UGFnZSk7Ci0KLQkJLy8gZnJvbSAic2NyYXRjaCIKLQkJZk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UgPSBuZXcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKGZOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlKTsKLQl9Ci0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTdGFydGluZ1BhZ2UoKSB7Ci0JCVdpemFyZFBhZ2UgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHN0YXJ0UGFnZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBzdGFydFBhZ2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXdGaWxlUGFnZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGludCBnZXRDcmVhdGVNb2RlKCkgewotCQlTdHJpbmcgZ3JhbW1hclVSSSA9IGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCk7Ci0KLQkJaW50IHJlc3VsdCA9IENSRUFURV9GUk9NX1NDUkFUQ0g7Ci0JCWlmIChncmFtbWFyVVJJICE9IG51bGwpIHsKLQkJCWlmIChncmFtbWFyVVJJLmVuZHNXaXRoKCIuZHRkIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlyZXN1bHQgPSBDUkVBVEVfRlJPTV9EVEQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChncmFtbWFyVVJJLmVuZHNXaXRoKCIueHNkIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlyZXN1bHQgPSBDUkVBVEVfRlJPTV9YU0Q7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlICE9IG51bGwpIHsKLQkJCWludCBzZWxlY3RlZEluZGV4ID0gZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlLmdldFNlbGVjdGVkUmFkaW9CdXR0b25JbmRleCgpOwotCQkJaWYgKHNlbGVjdGVkSW5kZXggIT0gLTEpIHsKLQkJCQlyZXN1bHQgPSBzZWxlY3RlZEluZGV4OwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgY3VycmVudFBhZ2UpIHsKLQkJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0JCWlmIChjdXJyZW50UGFnZSA9PSBzdGFydFBhZ2UpIHsKLQkJCW5leHRQYWdlID0gbmV3RmlsZVBhZ2U7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFBhZ2UgPT0gbmV3RmlsZVBhZ2UpIHsKLQkJCWlmIChnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpID09IG51bGwpCi0JCQkJbmV4dFBhZ2UgPSBmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2U7Ci0JCQllbHNlCi0JCQkJbmV4dFBhZ2UgPSBzZWxlY3RSb290RWxlbWVudFBhZ2U7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFBhZ2UgPT0gZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlKSB7Ci0JCQlpZiAoZ2V0Q3JlYXRlTW9kZSgpID09IENSRUFURV9GUk9NX1NDUkFUQ0gpIHsKLQkJCQluZXh0UGFnZSA9IGZOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlOwotCQkJfQotCQkJZWxzZSBpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSA9PSBudWxsKSB7Ci0JCQkJbmV4dFBhZ2UgPSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXh0UGFnZSA9IHNlbGVjdFJvb3RFbGVtZW50UGFnZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjdXJyZW50UGFnZSA9PSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2UpIHsKLQkJCW5leHRQYWdlID0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlOwotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCk7Ci0JCS8vIGNhbiBmaW5pc2ggb246IG5ldyBmaWxlIHBhZ2UsIGNyZWF0ZSBmcm9tICYgdGVtcGxhdGUgcGFnZSBpZiBjcmVhdGluZyBmcm9tIHNjcmF0Y2gsIHNlbGVjdCByb290IGVsZW1lbnQgcGFnZQotCQlpZiAoKGN1cnJlbnRQYWdlID09IG5ld0ZpbGVQYWdlICYmIGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkgPT0gbnVsbCkgfHwgKGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZSAhPSBudWxsICYmIGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZS5nZXRTZWxlY3RlZFJhZGlvQnV0dG9uSW5kZXgoKSA9PSBDUkVBVEVfRlJPTV9TQ1JBVENIKSB8fCAoY3VycmVudFBhZ2UgPT0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlKSkgewotCQkJcmVzdWx0ID0gY3VycmVudFBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtRmluaXNoKCk7Ci0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZS5zYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQkJCi0JCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCVN0cmluZ1tdIG5hbWVzcGFjZUVycm9ycyA9IGdlbmVyYXRvci5nZXROYW1lc3BhY2VJbmZvRXJyb3JzKCk7Ci0JCQlpZiAobmFtZXNwYWNlRXJyb3JzICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBuYW1lc3BhY2VFcnJvcnNbMF07Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBuYW1lc3BhY2VFcnJvcnNbMV07Ci0JCQkJcmVzdWx0ID0gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCQkJfQotCi0JCQlpZiAocmVzdWx0KSB7Ci0JCQkJZmlsZU5hbWUgPSBuZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQkJCWlmICgobmV3IFBhdGgoZmlsZU5hbWUpKS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkgewotCQkJCQluZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShmaWxlTmFtZS5jb25jYXQobmV3RmlsZVBhZ2UuZGVmYXVsdEZpbGVFeHRlbnNpb24pKTsKLQkJCQl9Ci0KLQkJCQlJRmlsZSBuZXdGaWxlID0gbmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCQkJCVN0cmluZyB4bWxGaWxlTmFtZSA9IG5ld0ZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0KLQkJCQlpZiAoZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBzZWxlY3RSb290RWxlbWVudFBhZ2UpIHsKLQotCQkJCQlnZW5lcmF0b3IuY3JlYXRlWE1MRG9jdW1lbnQobmV3RmlsZSwgeG1sRmlsZU5hbWUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gcHV0IHRlbXBsYXRlIGNvbnRlbnRzIGludG8gZmlsZQotCQkJCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBmTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJCQlnZW5lcmF0b3IuY3JlYXRlVGVtcGxhdGVYTUxEb2N1bWVudChuZXdGaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJfQotCi0JCQkJbmV3RmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0KLQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5zZWxlY3RBbmRSZXZlYWwobmV3RmlsZSwgd29ya2JlbmNoV2luZG93KTsKLQkJCQlvcGVuRWRpdG9yKG5ld0ZpbGUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIGNvbXBsZXRpbmcgTmV3IFhNTCB3aXphcmQgIiArIGZpbGVOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihJRmlsZSBmaWxlKSB7Ci0JCS8vIE9wZW4gZWRpdG9yIG9uIG5ldyBmaWxlLgotCQlTdHJpbmcgZWRpdG9ySWQgPSBudWxsOwotCQl0cnkgewotCQkJSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwgZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKS5nZXRDb250ZW50VHlwZSgpKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCWVkaXRvcklkID0gZWRpdG9yLmdldElkKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCS8vIGVkaXRvciBpZCBjb3VsZCBub3QgYmUgcmV0cmlldmVkLCBzbyB3ZSBjYW4gbm90IG9wZW4gZWRpdG9yCi0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtiZW5jaFdpbmRvdyBkdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZHcgIT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBkdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQlwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZWRpdG9ySWQsIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJLy8gZWRpdG9yIGNhbiBub3Qgb3BlbiBmb3Igc29tZSByZWFzb24KLQkJCXJldHVybjsKLQkJfQotCi0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsKLQkJU3RyaW5nIHJlbGF0aXZlUGF0aCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvIiArIG5ld0ZpbGVQYWdlLmdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICIvZHVtbXkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpLCByZWxhdGl2ZVBhdGgpOwotCX0KLQotCi0JLyoqCi0JICogU2VsZWN0R3JhbW1hckZpbGVQYWdlCi0JICovCi0JY2xhc3MgU2VsZWN0R3JhbW1hckZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0JCXByb3RlY3RlZCBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbCBwYW5lbDsKLQotCQlTZWxlY3RHcmFtbWFyRmlsZVBhZ2UoKSB7Ci0JCQlzdXBlcigiU2VsZWN0R3JhbW1hckZpbGVQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUU09VUkNFX0hFTFBJRCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCQlwYW5lbCA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbChjb21wb3NpdGUpOwotCQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJCVNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKSB7Ci0JCQkJCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQkJCX0KLQkJCX07Ci0JCQlwYW5lbC5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCWlmICh2aXNpYmxlKSB7Ci0JCQkJaWYgKGdldENyZWF0ZU1vZGUoKSA9PSBDUkVBVEVfRlJPTV9EVEQpIHsKLQkJCQkJc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX1RJVExFKTsKLQkJCQkJc2V0RGVzY3JpcHRpb24oWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX0RFU0MpOwotCQkJCQlwYW5lbC5zZXRGaWx0ZXJFeHRlbnNpb25zKGJyb3dzZURUREZpbHRlckV4dGVuc2lvbnMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX1RJVExFKTsKLQkJCQkJc2V0RGVzY3JpcHRpb24oWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX0RFU0MpOwotCQkJCQlwYW5lbC5zZXRGaWx0ZXJFeHRlbnNpb25zKGJyb3dzZVhTREZpbHRlckV4dGVuc2lvbnMpOwotCQkJCX0KLQkJCQlnZW5lcmF0b3Iuc2V0R3JhbW1hclVSSShudWxsKTsKLQkJCQlnZW5lcmF0b3Iuc2V0Q01Eb2N1bWVudChudWxsKTsKLQkJCQljbURvY3VtZW50RXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCX0KLQkJCXBhbmVsLnNldFZpc2libGVIZWxwZXIodmlzaWJsZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCVN0cmluZyB1cmkgPSBwYW5lbC5nZXRYTUxDYXRhbG9nVVJJKCk7Ci0JCQlpZiAodXJpID09IG51bGwpIHsKLQkJCQlJRmlsZSBmaWxlID0gcGFuZWwuZ2V0RmlsZSgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJdXJpID0gVVJJSGVscGVyLmdldFBsYXRmb3JtVVJJKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB1cmk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJCXJldHVybiAoZ2V0VVJJKCkgIT0gbnVsbCkgJiYgKGdldEVycm9yTWVzc2FnZSgpID09IG51bGwpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRYTUxDYXRhbG9nSWQoKSB7Ci0JCQlyZXR1cm4gcGFuZWwuZ2V0WE1MQ2F0YWxvZ0lkKCk7Ci0JCX0KLQotCQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCQlyZXR1cm4gcGFuZWwuZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCVN0cmluZyB1cmkgPSBnZXRVUkkoKTsKLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCWlmICghVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCBmYWxzZSkpIHsKLQkJCQkJZXJyb3JNZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9FUlJPUl9DQVRBTE9HX0VOVFJZX0lOVkFMSUQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQkJfQotCi0KLQkJcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IGNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZWxlY3RSb290RWxlbWVudFBhZ2UKLQkgKi8KLQljbGFzcyBTZWxlY3RSb290RWxlbWVudFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgQ29tYm8gY29tYm87Ci0JCXByb3RlY3RlZCBCdXR0b25bXSByYWRpb0J1dHRvbjsKLQkJcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotCQlwcm90ZWN0ZWQgWFNET3B0aW9uc1BhbmVsIHhzZE9wdGlvbnNQYW5lbDsKLQkJcHJvdGVjdGVkIERURE9wdGlvbnNQYW5lbCBkdGRPcHRpb25zUGFuZWw7Ci0KLQotCQlTZWxlY3RSb290RWxlbWVudFBhZ2UoKSB7Ci0JCQlzdXBlcigiU2VsZWN0Um9vdEVsZW1lbnRQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJLy8gY29udGFpbmVyIGdyb3VwCi0JCQlDb21wb3NpdGUgY29udGFpbmVyR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250YWluZXJHcm91cCwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlRfSEVMUElEKTsKLQkJCWNvbnRhaW5lckdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWNvbnRhaW5lckdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJc2V0Q29udHJvbChjb250YWluZXJHcm91cCk7Ci0KLQkJCS8vIHNlbGVjdCByb290IGVsZW1lbnQKLQkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lckdyb3VwLCBTV1QuTk9ORSk7Ci0JCQljb250YWluZXJMYWJlbC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UKTsKLQkJCWNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lckdyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCQkvLyBPcHRpb25zCi0JCQl7Ci0JCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyR3JvdXAsIFNXVC5OT05FKTsKLQkJCQlncm91cC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NPTlRFTlRfT1BUSU9OUyk7Ci0KLQkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlyYWRpb0J1dHRvbiA9IG5ldyBCdXR0b25bNF07Ci0KLQkJCQlyYWRpb0J1dHRvblswXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUxfQVRUUklCVVRFUyk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzBdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDFfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzFdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblsxXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9PUFRJT05BTF9FTEVNRU5UUyk7Ci0JCQkJcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkJcmFkaW9CdXR0b25bMV0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzFdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDJfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzJdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblsyXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9GSVJTVF9DSE9JQ0UpOwotCQkJCXJhZGlvQnV0dG9uWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzJdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzJdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDNfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzNdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblszXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVMpOwotCQkJCXJhZGlvQnV0dG9uWzNdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzNdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzNdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDRfSEVMUElEKTsKLQkJCQkvKgotCQkJCSAqIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvblsyXTsKLQkJCQkgKiAKLQkJCQkgKiByYWRpb0J1dHRvblswXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCQkJICogcmFkaW9CdXR0b25bMF0uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRCIpKTsKLQkJCQkgKiByYWRpb0J1dHRvblswXS5zZXRMYXlvdXREYXRhKG5ldwotCQkJCSAqIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCSAqIHJhZGlvQnV0dG9uWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkgKiBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFkaW9CdXR0b25bMF0sCi0JCQkJICogWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19DUkVBVEVfUkVRVUlSRURfT05MWSk7Ci0JCQkJICogCi0JCQkJICogcmFkaW9CdXR0b25bMV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJCSAqIHJhZGlvQnV0dG9uWzFdLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLmdldFN0cmluZygiX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUwiKSk7Ci0JCQkJICogcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcKLQkJCQkgKiBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQkgKiBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFkaW9CdXR0b25bMV0sCi0JCQkJICogWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19DUkVBVEVfUkVRVUlSRURfQU5EX09QVElPTik7Ci0JCQkJICovCi0JCQl9Ci0KLQkJCS8vIGFkZCB0aGUgZ3JhbW1hciBzcGVjaWZpYyBnZW5lcmF0aW9uIG9wdGlvbnMKLQkJCS8vCi0JCQl7Ci0JCQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyR3JvdXAsIFNXVC5OT05FKTsKLQkJCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCQl4c2RPcHRpb25zUGFuZWwgPSBuZXcgWFNET3B0aW9uc1BhbmVsKHRoaXMsIHBhZ2VCb29rKTsKLQkJCQlkdGRPcHRpb25zUGFuZWwgPSBuZXcgRFRET3B0aW9uc1BhbmVsKHRoaXMsIHBhZ2VCb29rKTsKLQkJCQlwYWdlQm9vay5zaG93UGFnZSh4c2RPcHRpb25zUGFuZWwpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gKGluZGV4ICE9IC0xKSA/IGNvbWJvLmdldEl0ZW0oaW5kZXgpIDogbnVsbDsKLQkJCWdlbmVyYXRvci5zZXRSb290RWxlbWVudE5hbWUocm9vdEVsZW1lbnROYW1lKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLQkJCWlmICh2aXNpYmxlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkgPT0gbnVsbCkgewotCQkJCQkJZ2VuZXJhdG9yLnNldEdyYW1tYXJVUkkoc2VsZWN0R3JhbW1hckZpbGVQYWdlLmdldFVSSSgpKTsKLQkJCQkJCWdlbmVyYXRvci5zZXRYTUxDYXRhbG9nRW50cnkoc2VsZWN0R3JhbW1hckZpbGVQYWdlLmdldFhNTENhdGFsb2dFbnRyeSgpKTsKLQkJCQkJfQotCQkJCQlBc3NlcnQuaXNOb3ROdWxsKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkpOwotCi0JCQkJCWlmIChnZW5lcmF0b3IuZ2V0Q01Eb2N1bWVudCgpID09IG51bGwpIHsKLQkJCQkJCWZpbmFsIFN0cmluZ1tdIGVycm9ySW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJCQlmaW5hbCBDTURvY3VtZW50W10gY21kb2NzID0gbmV3IENNRG9jdW1lbnRbMV07Ci0JCQkJCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJY21kb2NzWzBdID0gTmV3WE1MR2VuZXJhdG9yLmNyZWF0ZUNNRG9jdW1lbnQoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSwgZXJyb3JJbmZvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgcik7Ci0KLQkJCQkJCWdlbmVyYXRvci5zZXRDTURvY3VtZW50KGNtZG9jc1swXSk7Ci0JCQkJCQljbURvY3VtZW50RXJyb3JNZXNzYWdlID0gZXJyb3JJbmZvWzFdOwotCQkJCQl9Ci0KLQkJCQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJCWlmICgoZ2VuZXJhdG9yLmdldENNRG9jdW1lbnQoKSAhPSBudWxsKSAmJiAoY21Eb2N1bWVudEVycm9yTWVzc2FnZSA9PSBudWxsKSkgewotCQkJCQkJQ01OYW1lZE5vZGVNYXAgbmFtZU5vZGVNYXAgPSBnZW5lcmF0b3IuZ2V0Q01Eb2N1bWVudCgpLmdldEVsZW1lbnRzKCk7Ci0JCQkJCQlWZWN0b3IgbmFtZU5vZGVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZU5vZGVNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBuYW1lTm9kZU1hcC5pdGVtKGkpOwotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGNtRWxlbWVudERlY2xhcmF0aW9uLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHZhbHVlICE9IEJvb2xlYW4uVFJVRSkgewotCQkJCQkJCQluYW1lTm9kZVZlY3Rvci5hZGQoY21FbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlPYmplY3RbXSBuYW1lTm9kZUFycmF5ID0gbmFtZU5vZGVWZWN0b3IudG9BcnJheSgpOwotCQkJCQkJaWYgKG5hbWVOb2RlQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQkJCUFycmF5cy5zb3J0KG5hbWVOb2RlQXJyYXksIENvbGxhdG9yLmdldEluc3RhbmNlKCkpOwotCQkJCQkJfQotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFJvb3ROYW1lID0gKFN0cmluZykgKGdlbmVyYXRvci5nZXRDTURvY3VtZW50KCkpLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmYXVsdFJvb3ROYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWludCBkZWZhdWx0Um9vdEluZGV4ID0gLTE7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVOb2RlQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSAoU3RyaW5nKSBuYW1lTm9kZUFycmF5W2ldOwotCi0JCQkJCQkJY29tYm8uYWRkKGVsZW1lbnROYW1lKTsKLQkJCQkJCQlpZiAoKGRlZmF1bHRSb290TmFtZSAhPSBudWxsKSAmJiBkZWZhdWx0Um9vdE5hbWUuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCQkJCQlkZWZhdWx0Um9vdEluZGV4ID0gaTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChuYW1lTm9kZUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQkJCQlkZWZhdWx0Um9vdEluZGV4ID0gZGVmYXVsdFJvb3RJbmRleCAhPSAtMSA/IGRlZmF1bHRSb290SW5kZXggOiAwOwotCQkJCQkJCWNvbWJvLnNlbGVjdChkZWZhdWx0Um9vdEluZGV4KTsKLQkJCQkJCQlnZW5lcmF0b3Iuc2V0Um9vdEVsZW1lbnROYW1lKGNvbWJvLmdldEl0ZW0oZGVmYXVsdFJvb3RJbmRleCkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkuZW5kc1dpdGgoInhzZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCXBhZ2VCb29rLnNob3dQYWdlKHhzZE9wdGlvbnNQYW5lbCk7Ci0JCQkJCQlnZW5lcmF0b3Iuc2V0RGVmYXVsdFN5c3RlbUlkKGdldERlZmF1bHRTeXN0ZW1JZCgpKTsKLQkJCQkJCWdlbmVyYXRvci5jcmVhdGVOYW1lc3BhY2VJbmZvTGlzdCgpOwotCi0JCQkJCQkvLyBQcm92aWRlIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeCBpZiBub25lCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJCU5hbWVzcGFjZUluZm8gbnNpbmZvID0gKE5hbWVzcGFjZUluZm8pIGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdC5nZXQoaSk7Ci0JCQkJCQkJaWYgKCgobnNpbmZvLnByZWZpeCA9PSBudWxsKSB8fCAobnNpbmZvLnByZWZpeC50cmltKCkubGVuZ3RoKCkgPT0gMCkpICYmICgobnNpbmZvLnVyaSAhPSBudWxsKSAmJiAobnNpbmZvLnVyaS50cmltKCkubGVuZ3RoKCkgIT0gMCkpKSB7Ci0JCQkJCQkJCW5zaW5mby5wcmVmaXggPSBnZXREZWZhdWx0UHJlZml4KGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJeHNkT3B0aW9uc1BhbmVsLnNldE5hbWVzcGFjZUluZm9MaXN0KGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKS5lbmRzV2l0aCgiZHRkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoZHRkT3B0aW9uc1BhbmVsKTsKLQkJCQkJCWR0ZE9wdGlvbnNQYW5lbC51cGRhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gWE1MQnVpbGRlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZUN1cnJlbnRUaHJlYWQoKTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKCk7IGlmCi0JCQkJICogKGVycm9yTWVzc2FnZSA9PSBudWxsKSBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCSAqLwotCi0JCQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJlZml4KExpc3QgbnNJbmZvTGlzdCkgewotCQkJU3RyaW5nIGRlZmF1bHRQcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuc0luZm9MaXN0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdFByZWZpeDsKLQkJCX0KLQotCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5zSW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlOYW1lc3BhY2VJbmZvIG5zaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuc0luZm9MaXN0LmdldChpKTsKLQkJCQlpZiAobnNpbmZvLnByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCXYuYWRkRWxlbWVudChuc2luZm8ucHJlZml4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICh2LmNvbnRhaW5zKGRlZmF1bHRQcmVmaXgpKSB7Ci0JCQkJU3RyaW5nIHMgPSBkZWZhdWx0UHJlZml4OwotCQkJCWZvciAoaW50IGogPSAwOyB2LmNvbnRhaW5zKHMpOyBqKyspIHsKLQkJCQkJcyA9IGRlZmF1bHRQcmVmaXggKyBJbnRlZ2VyLnRvU3RyaW5nKGopOwotCQkJCX0KLQkJCQlyZXR1cm4gczsKLQkJCX0KLQkJCXJldHVybiBkZWZhdWx0UHJlZml4OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCQlib29sZWFuIGNvbXBsZXRlID0gKChnZW5lcmF0b3IuZ2V0Um9vdEVsZW1lbnROYW1lKCkgIT0gbnVsbCkgJiYgKGdlbmVyYXRvci5nZXRSb290RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA+IDApKSAmJiAoZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCk7Ci0KLQkJCWlmIChjb21wbGV0ZSkgewotCQkJCS8qCi0JCQkJICogaW50IGJ1aWxkUG9saWN5ID0gcmFkaW9CdXR0b25bMF0uZ2V0U2VsZWN0aW9uKCkgPwotCQkJCSAqIERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCA6Ci0JCQkJICogRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfQUxMX0NPTlRFTlQ7Ci0JCQkJICovCi0JCQkJaW50IGJ1aWxkUG9saWN5ID0gMDsKLQkJCQlpZiAocmFkaW9CdXR0b25bMF0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeSB8IERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09QVElPTkFMX0FUVFJJQlVURVM7Ci0JCQkJfQotCQkJCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlidWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5IHwgRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfT1BUSU9OQUxfRUxFTUVOVFM7Ci0JCQkJfQotCQkJCWlmIChyYWRpb0J1dHRvblsyXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlidWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5IHwgRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfRklSU1RfQ0hPSUNFIHwgRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfRklSU1RfU1VCU1RJVFVUSU9OOwotCQkJCX0KLQkJCQlpZiAocmFkaW9CdXR0b25bM10uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeSB8IERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX1RFWFRfTk9ERVM7Ci0JCQkJfQotCi0JCQkJZ2VuZXJhdG9yLnNldEJ1aWxkUG9saWN5KGJ1aWxkUG9saWN5KTsKLQkJCX0KLQotCQkJcmV0dXJuIGNvbXBsZXRlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLQkJCWlmIChjbURvY3VtZW50RXJyb3JNZXNzYWdlICE9IG51bGwpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBjbURvY3VtZW50RXJyb3JNZXNzYWdlOwotCQkJfQotCQkJZWxzZSBpZiAoKGdlbmVyYXRvci5nZXRSb290RWxlbWVudE5hbWUoKSA9PSBudWxsKSB8fCAoZ2VuZXJhdG9yLmdldFJvb3RFbGVtZW50TmFtZSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JCX0KLQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwpIHsKLQkJCQlpZiAoeHNkT3B0aW9uc1BhbmVsLmlzVmlzaWJsZSgpKSB7Ci0KLQkJCQkJZXJyb3JNZXNzYWdlID0geHNkT3B0aW9uc1BhbmVsLmNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZHRkT3B0aW9uc1BhbmVsLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSA9IGR0ZE9wdGlvbnNQYW5lbC5jb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQkJfQotCQkJfQotCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vL0VuZCBTZWxlY3RSb290RWxlbWVudFBhZ2UKLQotCi0KLQlwdWJsaWMgc3RhdGljIEdyaWRMYXlvdXQgY3JlYXRlT3B0aW9uc1BhbmVsTGF5b3V0KCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCXJldHVybiBncmlkTGF5b3V0OwotCX0KLQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQljbGFzcyBYU0RPcHRpb25zUGFuZWwgZXh0ZW5kcyBDb21wb3NpdGUgewotCQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCXByb3RlY3RlZCBTZWxlY3RSb290RWxlbWVudFBhZ2UgcGFyZW50UGFnZTsKLQkJcHJvdGVjdGVkIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nIGVkaXROYW1lc3BhY2VzOwotCQlwcml2YXRlIElQYXRoIGN1cnJlbnRQYXRoID0gbnVsbDsKLQotCQlwdWJsaWMgWFNET3B0aW9uc1BhbmVsKFNlbGVjdFJvb3RFbGVtZW50UGFnZSBwYXJlbnRQYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXRoaXMucGFyZW50UGFnZSA9IHBhcmVudFBhZ2U7Ci0KLQkJCXNldExheW91dChjcmVhdGVPcHRpb25zUGFuZWxMYXlvdXQoKSk7Ci0JCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBnZXRFZGl0TmFtZXNwYWNlcygpIHsKLQkJCWlmIChlZGl0TmFtZXNwYWNlcyA9PSBudWxsKSB7Ci0JCQkJQ29tcG9zaXRlIGNvID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCQkJY28uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJCVN0cmluZyB0YWJsZVRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfSU5GT1JNQVRJT047Ci0JCQkJZWRpdE5hbWVzcGFjZXMgPSBuZXcgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coY28sIG51bGwsIHRhYmxlVGl0bGUsIHRydWUsIHRydWUpOwotCQkJCXRoaXMubGF5b3V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZWRpdE5hbWVzcGFjZXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpIHsKLQkJCUNvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nIGVkaXREaWFsb2cgPSBnZXRFZGl0TmFtZXNwYWNlcygpOwotCQkJCi0JCSAgICBpZiAobmV3RmlsZVBhZ2UgIT0gbnVsbCkgewotCQkgICAgICBJUGF0aCBuZXdQYXRoID0gbmV3RmlsZVBhZ2UuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJICAgICAgaWYgKG5ld1BhdGggIT0gbnVsbCkgewotCQkgICAgICAgIGlmICghbmV3UGF0aC5lcXVhbHMoY3VycmVudFBhdGgpKSB7Ci0JICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVVSSSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgbmV3UGF0aC50b1N0cmluZygpICsgIi9kdW1teSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRQYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZShyZXNvdXJjZVVSSSwgbnVsbCwgbnVsbCk7Ci0JICAgICAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IFVSSUhlbHBlci5yZW1vdmVQcm90b2NvbChyZXNvbHZlZFBhdGgpOwotCSAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBuZXcgUGF0aChyZXNvbHZlZFBhdGgpOwotCSAgICAgICAgICAgICAgICBlZGl0RGlhbG9nLnNldFJlc291cmNlUGF0aChjdXJyZW50UGF0aCk7Ci0JCSAgICAgICAgfQotCQkgICAgICB9Ci0JCSAgICB9Ci0JCSAgICBlZGl0RGlhbG9nLnNldE5hbWVzcGFjZUluZm9MaXN0KGxpc3QpOwotCQkgICAgZWRpdERpYWxvZy51cGRhdGVFcnJvck1lc3NhZ2UobGlzdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgewotCQkJTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIoKTsKLQkJCWVycm9yTWVzc2FnZSA9IGhlbHBlci5jb21wdXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0LCBudWxsKTsKLQkJCXBhcmVudFBhZ2UudXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCX0KLQotCi0JCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBjbGFzcyBEVERPcHRpb25zUGFuZWwgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBHcm91cCBncm91cDsKLQkJcHJvdGVjdGVkIFRleHQgc3lzdGVtSWRGaWVsZDsKLQkJcHJvdGVjdGVkIFRleHQgcHVibGljSWRGaWVsZDsKLQkJcHJvdGVjdGVkIFNlbGVjdFJvb3RFbGVtZW50UGFnZSBwYXJlbnRQYWdlOwotCi0JCXB1YmxpYyBEVERPcHRpb25zUGFuZWwoU2VsZWN0Um9vdEVsZW1lbnRQYWdlIHBhcmVudFBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQkJdGhpcy5wYXJlbnRQYWdlID0gcGFyZW50UGFnZTsKLQkJCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQlzZXRMYXlvdXQoY3JlYXRlT3B0aW9uc1BhbmVsTGF5b3V0KCkpOwotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT04pOwotCi0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQlMYWJlbCBwdWJsaWNJZExhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlwdWJsaWNJZExhYmVsLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9QVUJMSUNfSUQpOwotCQkJcHVibGljSWRGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlwdWJsaWNJZEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJcHVibGljSWRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHVibGljSWRGaWVsZCwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ1X0hFTFBJRCk7Ci0KLQkJCUxhYmVsIHN5c3RlbUlkTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCXN5c3RlbUlkTGFiZWwuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX1NZU1RFTV9JRCk7Ci0JCQlzeXN0ZW1JZEZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCXN5c3RlbUlkRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlzeXN0ZW1JZEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzeXN0ZW1JZEZpZWxkLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDZfSEVMUElEKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJCVN0cmluZyB0aGVQdWJsaWNJZCA9IG51bGw7Ci0JCQlTdHJpbmcgdGhlU3lzdGVtSWQgPSBudWxsOwotCQkJSUNhdGFsb2dFbnRyeSB4bWxDYXRhbG9nRW50cnkgPSBnZW5lcmF0b3IuZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0KLQkJCWlmICh4bWxDYXRhbG9nRW50cnkgIT0gbnVsbCkgewotCQkJCWlmICh4bWxDYXRhbG9nRW50cnkuZ2V0RW50cnlUeXBlKCkgPT0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQykgewotCQkJCQl0aGVQdWJsaWNJZCA9IHhtbENhdGFsb2dFbnRyeS5nZXRLZXkoKTsKLQkJCQkJdGhlU3lzdGVtSWQgPSB4bWxDYXRhbG9nRW50cnkuZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpOwotCQkJCQlpZiAodGhlU3lzdGVtSWQgPT0gbnVsbCkgewotCQkJCQkJdGhlU3lzdGVtSWQgPSBnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpLnN0YXJ0c1dpdGgoImh0dHA6IikgPyBnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpIDogVVJJSGVscGVyLmdldExhc3RTZWdtZW50KGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRoZVN5c3RlbUlkID0geG1sQ2F0YWxvZ0VudHJ5LmdldEtleSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoZVN5c3RlbUlkID0gZ2V0RGVmYXVsdFN5c3RlbUlkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpY0lkRmllbGQuc2V0VGV4dCh0aGVQdWJsaWNJZCAhPSBudWxsID8gdGhlUHVibGljSWQgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN5c3RlbUlkRmllbGQuc2V0VGV4dCh0aGVTeXN0ZW1JZCAhPSBudWxsID8gdGhlU3lzdGVtSWQgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJZ2VuZXJhdG9yLnNldFN5c3RlbUlkKHN5c3RlbUlkRmllbGQuZ2V0VGV4dCgpKTsKLQkJCWdlbmVyYXRvci5zZXRQdWJsaWNJZChwdWJsaWNJZEZpZWxkLmdldFRleHQoKSk7Ci0JCQlwYXJlbnRQYWdlLnVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkyM2M0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLy8gVE9ETyBjcy4uLiByZW5hbWUgdGhpcyBjbGFzcyBOZXdYTUxBY3Rpb25EZWxlZ2F0ZQotLy8gd2UgbmVlZCB0byByZS1hZGQgcHJlLXZhbGlkYXRpb24gdXNpbmcgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIEFQSSdzCi0vLyBzaW5jZSB3ZSBhbHNvIG5lZWQgdG8gYWRkIHZhbGlkYXRpb24gdG8gdGhlICdOZXcgWE1MJyBjYXNlLCB0aGlzCi0vLyBwcmV2YWxpZGF0aW9uCi0vLyBmdW5jdGlvbiBzaG91bGQgcmVhbGx5IGdvIGludG8gdGhlIE5ld1dpemFyZCBzb21ld2hlcmUKLS8vCi1wdWJsaWMgY2xhc3MgWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUgewotCS8qKgotCSAqIENoZWNrcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIHJ1bnMgdGhlIHNlcGFyYXRlIGJyb3dzZXIgdG8gc2hvdyB0aGUKLQkgKiBjb250ZW50IG9mIHRoZSBSZWFkbWUgZmlsZS4gVGhpcyBjb2RlIHNob3dzIGhvdyB0byBsYXVuY2ggc2VwYXJhdGUKLQkgKiBicm93c2VycyB0aGF0IGFyZSBub3QgVkEvQmFzZSBkZXNrdG9wIHBhcnRzLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gdGhhdCB3YXMgcGVyZm9ybWVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB3b3JrYmVuY2hXaW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBnZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQotCQlpZiAoKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHNlbGVjdGVkT2JqZWN0OwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJdHJ5IHsKLQkJCQlOZXdYTUxXaXphcmQuc2hvd0RpYWxvZyh3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgZmlsZSwgc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHVudXNlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHVudXNlZAotCX0KLQotCS8vIHNjYW1tZWQgZnJvbSBXaW5kb3dVdGlsaXR5Ci0JLy8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBlcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJSXRlcmF0b3IgaSA9IGVzLml0ZXJhdG9yKCk7Ci0JCQlpZiAoaS5oYXNOZXh0KCkpIHsKLQkJCQlyZXN1bHQgPSBpLm5leHQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MU2NoZW1hVmFsaWRhdGlvbkNoZWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MU2NoZW1hVmFsaWRhdGlvbkNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2YTNkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWE1MU2NoZW1hVmFsaWRhdGlvbkNoZWNrZXIgewotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoSUZpbGUgaWZpbGUpIHsKLQkJU3RyaW5nIHhzZEZpbGVOYW1lID0gaWZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlyZXR1cm4gaXNWYWxpZCh4c2RGaWxlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoaXMgYmUgaW1wbGVtZW50ZWQgYXMgYSBWYWxpZGF0b3IgYW5kIHNpbXBseSBjYWxsZWQgYXMgc3VjaAotCSAqIHdpdGggYSByZXBvcnRlciB0aGF0IG9ubHkgY2hlY2tzIHRoZSByZXN1bHRzIGZvciBzZXZlcml0eSA9IGVycm9yPyBPcgotCSAqIHNob3VsZCB0aGUgWGVyY2VzIHJlcXVpcmVtZW50IGJlIGJyb2tlbiB1c2luZyBhIHBsdWctaW4gZXh0ZW5zaW9uPwotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgeHNkRmlsZU5hbWUpIHsKLQkJLy8gRE9NQVNCdWlsZGVySW1wbCBidWlsZGVyID0gbmV3IERPTUFTQnVpbGRlckltcGwoKTsKLQkJLy8gRE9NRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBET01FcnJvckhhbmRsZXIoKTsKLQkJLy8gYnVpbGRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKLQkJdHJ5IHsKLQkJCS8vIFN0cmluZyB1cmkgPQotCQkJVVJJSGVscGVyLmdldFVSSUZvckZpbGVQYXRoKHhzZEZpbGVOYW1lKTsKLQkJCS8vIEFTTW9kZWwgbW9kZWwgPSBidWlsZGVyLnBhcnNlQVNVUkkodXJpKTsKLQkJCS8vIGlmIChlcnJvckhhbmRsZXIuaGFzRXJyb3IoKSkKLQkJCS8vIHJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIC8vIGludmFsaWQgc2NoZW1hCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIGlubmVyIGNsYXNzCi0JY2xhc3MgRE9NRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGhhc0Vycm9yID0gZmFsc2U7Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKSB7Ci0JCQlyZXR1cm4gaGFzRXJyb3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlcnIpIHsKLQkJCWhhc0Vycm9yID0gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWhhc0Vycm9yID0gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIG5vdCBhbiBlcnJvcgotCQl9Ci0JfSAvLyBlbmQgRE9NRXJyb3JIYW5kbGVySW1wbAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlYTVkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgWE1MV2l6YXJkIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFhNTFdpemFyZCBpbnN0YW5jZSA9IG5ldyBYTUxXaXphcmQoKTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhNTFdpemFyZCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBYTUxXaXphcmQoKSB7Ci0JCWluc3RhbmNlID0gdGhpczsKLQotCX0KLQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC54bWwudWkiKS5nZXRFbnRyeSgiLyIpLCBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxXaXphcmRzTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MV2l6YXJkc01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTAxYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxXaXphcmRzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogRGF2aWQgQ2FydmVyL1NUQVIgU3RhbmRhcmQgLSBkX2FfY2FydmVyQHlhaG9vLmNvbSAtIGJ1ZyAxOTI1NjgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgV2l6YXJkcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFdpemFyZHNNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy53aXphcmRSZXNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19USVRMRV9JTlZBTElEX0dSQU1NQVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19NRVNTQUdFX0lOVkFMSURfR1JBTU1BUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NSRUFURV9ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX1hNTF9GUk9NX0RURDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fWE1MX0ZST01fU0NIRU1BOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SQURJT19YTUxfRlJPTV9TQ1JBVENIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9FWFBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9GSUxFX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfRVhQTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1NFTEVDVF9EVERfRklMRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfWFNEX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfU0VMRUNUX1JPT1RfRVhQTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUk9PVF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1RJVExFX05PX1JPT1RfRUxFTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTVNHX05PX1JPT1RfRUxFTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PX0xPQ0FUSU9OX0hJTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DT05URU5UX09QVElPTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfUkVRVUlSRUQ7Ly8gY29tbWVudGVkIG91dAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMOy8vIGNvbW1lbnRlZCBvdXQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NSRUFURV9PUFRJT05BTF9BVFRSSUJVVEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0VMRU1FTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX0ZJUlNUX0NIT0lDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUFVCTElDX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lOVkFMSURfR1JBTU1BUl9FUlJPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfUk9PVF9FTEVNRU5UX01VU1RfQkVfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FUlJPUl9TQ0hFTUFfSU5WQUxJRF9JTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FUlJPUl9EVERfSU5WQUxJRF9JTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FUlJPUl9DQVRBTE9HX0VOVFJZX0lOVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVTUEFDRV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX1BsdWdpbnNfVW5hdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbl9jYW5ub3RfYmVfcGVyZm9ybWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uX29wX2Rlc2NfcHJvajsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3BfZXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3ZlcndyaXRlcXVlcnlfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlX2Vycm9yX2FscmVhZHlleGlzdHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX1hNTENBVEFMT0dfRVhQT1JUX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9ERVNDUklQVElPTjsKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MV2l6YXJkc01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNTFdpemFyZHNNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL3dpemFyZFJlc291cmNlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL3dpemFyZFJlc291cmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDdiYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy93aXphcmRSZXNvdXJjZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgRGF2aWQgQ2FydmVyL1NUQVIgU3RhbmRhcmQgLSBkX2FfY2FydmVyQHlhaG9vLmNvbSAtIGJ1ZyAxOTI1NjgKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEgUHJvcGVydGllcyBmaWxlIGZvciBjb21wb25lbnQ6IFhNTCBUb29scyAtICBOZXcgWE1MIFdpemFyZAotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLSFYTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZQotX1VJX0RJQUxPR19ORVdfVElUTEUgICAgICAgID0gTmV3IFhNTCBGaWxlCi1fVUlfRElBTE9HX1RJVExFX0lOVkFMSURfR1JBTU1BUiA9IEludmFsaWQgR3JhbW1hcgotX1VJX0RJQUxPR19NRVNTQUdFX0lOVkFMSURfR1JBTU1BUiA9IFRoZSBncmFtbWFyIGZpbGUgY29udGFpbnMgZXJyb3JzLiBJZiB5b3UgcHJvY2VlZCwgYW4gaW5jb3JyZWN0IHJlc3VsdCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIU5ld1hNTEJXaXphcmQKLV9VSV9XSVpBUkRfQ1JFQVRFX05FV19USVRMRSAgICAgICAgICAgPSBOZXcgWE1MIEZpbGUKLV9VSV9SQURJT19YTUxfRlJPTV9EVEQgICAgICAgICAgICAgICAgPSBDcmVhdGUgWE1MIGZpbGUgZnJvbSBhICZEVEQgZmlsZQotX1VJX1JBRElPX1hNTF9GUk9NX1NDSEVNQSAgICAgICAgICAgICA9IENyZWF0ZSBYTUwgZmlsZSBmcm9tIGFuICZYTUwgc2NoZW1hIGZpbGUKLV9VSV9SQURJT19YTUxfRlJPTV9TQ1JBVENIICAgICAgICAgICAgPSBDcmVhdGUgWE1MIGZpbGUgZnJvbSBhbiBYTUwgJnRlbXBsYXRlCi1fVUlfV0laQVJEX0NSRUFURV9YTUxfSEVBRElORyAgICAgICAgID0gQ3JlYXRlIFhNTCBGaWxlIEZyb20KLV9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9FWFBMICAgICAgICAgICAgPSBTZWxlY3QgaG93IHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSB5b3VyIFhNTCBmaWxlLgotX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfSEVBRElORyAgICA9IFhNTCBGaWxlCi1fVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9FWFBMICAgICAgID0gQ3JlYXRlIGEgbmV3IFhNTCBmaWxlLgotX1VJX1dJWkFSRF9TRUxFQ1RfRFREX0ZJTEVfREVTQyAgICAgICA9IFNlbGVjdCB0aGUgRFREIGZpbGUgdG8gY3JlYXRlIHRoZSBYTUwgZmlsZS4KLV9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX1RJVExFICAgICAgPSBTZWxlY3QgRFREIEZpbGUKLV9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX0RFU0MgICAgICAgPSBTZWxlY3QgdGhlIHNjaGVtYSBmaWxlIHRvIGNyZWF0ZSB0aGUgWE1MIGZpbGUuCi1fVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9USVRMRSAgICAgID0gU2VsZWN0IFhNTCBTY2hlbWEgRmlsZQotX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9IRUFESU5HICAgICAgICA9IFNlbGVjdCBSb290IEVsZW1lbnQKLV9VSV9XSVpBUkRfU0VMRUNUX1JPT1RfRVhQTCAgICAgICAgICAgPSBTZWxlY3QgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgWE1MIGZpbGUuCi1fVUlfTEFCRUxfUk9PVF9FTEVNRU5UICAgICAgICAgICAgICAgID0gUm9vdCBlbGVtZW50OgotX1VJX1dBUk5JTkdfVElUTEVfTk9fUk9PVF9FTEVNRU5UUyAgICA9IE5vIFJvb3QgRWxlbWVudHMKLV9VSV9XQVJOSU5HX01TR19OT19ST09UX0VMRU1FTlRTICAgICAgPSBObyByb290IGVsZW1lbnQgZXhpc3RzIHNpbmNlIHRoZSBzY2hlbWEgcHJvdmlkZWQgaGFzIG5vIGdsb2JhbCBlbGVtZW50cy4KLV9VSV9MQUJFTF9OT19MT0NBVElPTl9ISU5UICAgICAgICAgICAgPSBVbnNwZWNpZmllZCBOYW1lc3BhY2UgTG9jYXRpb24KLV9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzEgICAgPSBZb3UgaGF2ZSBub3Qgc3BlY2lmaWVkIGEgbG9jYXRpb24gaGludCBmb3Igb25lIG9yIG1vcmUgbmFtZXNwYWNlIGVudHJpZXMuCi1fVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8yICAgID0gRWxlbWVudHMgZnJvbSB0aGVzZSBuYW1lc3BhY2VzIHdpbGwgbm90IGJlIGdlbmVyYXRlZC4gVGhpcyBtYXkgbGVhZCB0byBhbiBpbnZhbGlkIGdlbmVyYXRlZCBkb2N1bWVudC4KLV9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzMgICAgPSBDbGljayBZZXMgdG8gY29udGludWUsIENsaWNrIE5vIHRvIGdvIGJhY2sgYW5kIHNwZWNpZnkgdGhlIGxvY2F0aW9uIGhpbnRzLgotX1VJX1dJWkFSRF9DT05URU5UX09QVElPTlMgICAgICAgICAgICA9IENvbnRlbnQgb3B0aW9ucwotCi1fVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRCAgICAgICAgICAgID0gJkNyZWF0ZSByZXF1aXJlZCBjb250ZW50IG9ubHkKLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMICAgICAgICAgICAgPSBDcmVhdGUgcmVxdWlyZWQgYW5kICZvcHRpb25hbCBjb250ZW50Ci0KLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0FUVFJJQlVURVMgPSBDcmVhdGUgb3B0aW9uYWwgJmF0dHJpYnV0ZXMKLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0VMRU1FTlRTICAgPSBDcmVhdGUgb3B0aW9uYWwgZSZsZW1lbnRzCi1fVUlfV0laQVJEX0NSRUFURV9GSVJTVF9DSE9JQ0UgICAgICAgID0gQ3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCAmY2hvaWNlCi1fVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVMgPSBGaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggJmRhdGEKLQotX1VJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT04gICAgICAgICA9IERvY3VtZW50IHR5cGUgaW5mb3JtYXRpb24KLV9VSV9MQUJFTF9TWVNURU1fSUQgICAgICAgICAgICAgICAgICAgPSAmU3lzdGVtIElEOgotX1VJX0xBQkVMX1BVQkxJQ19JRCAgICAgICAgICAgICAgICAgICA9ICZQdWJsaWMgSUQ6Ci0KLV9VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gICAgICAgPSBUaGUgc3BlY2lmaWVkIHJlc291cmNlIGNhbm5vdCBiZSBsb2NhdGVkIDoKLQotIU5ld01vZGVsV2l6YXJkCi1fVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SICAgICAgICAgICAgID0gSW52YWxpZCBHcmFtbWFyCi0KLSFOZXdNb2RlbFdpemFyZAotX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04gICAgICAgICA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uCi1fRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyAgICAgICAgICAgID0gVGhlIHNhbWUgZmlsZSBhbHJlYWR5IGV4aXN0cy4KLV9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQgPSBBIHJvb3QgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4KLV9VSV9MQUJFTF9FUlJPUl9TQ0hFTUFfSU5WQUxJRF9JTkZPICAgPSBUaGUgc2NoZW1hIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciBmb3IgZGV0YWlscy4KLV9VSV9MQUJFTF9FUlJPUl9EVERfSU5WQUxJRF9JTkZPICAgICAgPSBUaGUgRFREIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBEVEQgZWRpdG9yIGZvciBkZXRhaWxzLgotCi1fVUlfTEFCRUxfRVJST1JfQ0FUQUxPR19FTlRSWV9JTlZBTElEID0gVGhlIHNlbGVjdGVkIGNhdGFsb2cgZW50cnkgc3BlY2lmaWVzIGEgVVJJIHRoYXQgY2FuIG5vdCBiZSBsb2NhdGVkLgotCi1fVUlfTEFCRUxfTkFNRVNQQUNFX0lORk9STUFUSU9OPU5hbWVzcGFjZSBJbmZvcm1hdGlvbgotCi1WYWxpZGF0aW9uX1BsdWdpbnNfVW5hdmFpbGFibGU9VmFsaWRhdGlvbiBQbHVnaW5zIFVuYXZhaWxhYmxlCi1WYWxpZGF0aW9uX2Nhbm5vdF9iZV9wZXJmb3JtZWQ9VmFsaWRhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlIHZhbGlkYXRpb24gcGx1Z2lucyB3ZXJlIGRpc2FibGVkIG9yIG5vdCBmb3VuZC4gIFRoZSBnZW5lcmF0ZWQgZmlsZSBtYXkgYmUgaW52YWxpZC4gIERvIHlvdSB3aXNoIHRvIGNvbnRpbnVlPwotCi0hSW1wb3J0WE1MQ2F0YWxvZ1dpemFyZAotX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9USVRMRSAgICA9IEltcG9ydCBYTUwgQ2F0YWxvZwotX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9ERVNDUklQVElPTiA9IEltcG9ydCBhbGwgZW50cmllcyBmcm9tIGFuIGV4aXN0aW5nIFhNTCBDYXRhbG9nIGludG8gdGhlIFVzZXIgQ2F0YWxvZy4KLQotIUV4cG9ydFhNTENhdGFsb2dXaXphcmQKLV9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfVElUTEUgICAgPSBFeHBvcnQgRXhpc3RpbmcgWE1MIENhdGFsb2cKLV9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfREVTQ1JJUFRJT04gPSBFeHBvcnQgYWxsIGV4aXN0aW5nIFVzZXIgQ2F0YWxvZyBlbnRyaWVzLgotIwotIyBFeGFtcGxlUHJvamVjdAotRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjPUNyZWF0aW5nIGV4YW1wbGUgcHJvamVjdHMuLi4KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzY19wcm9qPUNvbmZpZ3VyaW5nIHByb2plY3QuLi4KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfdGl0bGU9TmV3IEV4YW1wbGUgUHJvamVjdAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl90aXRsZT1Qcm9qZWN0IENyZWF0aW9uIEZhaWxlZAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl9tZXNzYWdlPVByb2plY3QgY291bGQgbm90IGJlIGNyZWF0ZWQuCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX292ZXJ3cml0ZXF1ZXJ5X3RpdGxlPU92ZXJ3cml0ZQotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV9tZXNzYWdlPURvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB7MH0/Ci1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZV9lcnJvcl9hbHJlYWR5ZXhpc3RzPVByb2plY3QgYWxyZWFkeSBleGlzdHMuCi0KLU5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgWE1MIFRlbXBsYXRlCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBYTUwgcGFnZS4KLU5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgWE1MIFRlbXBsYXRlCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzU9UHJldmlldzoKLU5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgWE1MJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPlhNTCBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkZDVhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLk11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdC5BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFiczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3IgYSBzb3VyY2Ugdmlld2VyIHdoaWNoIHNob3dzIFhNTCBjb250ZW50LgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gewotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uIGJlY2F1c2Ugbm90IHNvdXJjZXZpZXdlci1zcGVjaWZpYyBhbmQKLQkgKiBpdCdzIGEgU3RyaW5nIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MOwotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgYWxsU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdXBlclN0cmF0ZWdpZXMgPSBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhbGxTdHJhdGVnaWVzLmFkZChzdXBlclN0cmF0ZWdpZXNbaV0pOwotCQl9Ci0KLQkJLy8gYmUgc3VyZSB0aGlzIGlzIGxhc3QsIHNvIGl0IGNhbiBtb2RpZnkgYW55IHJlc3VsdHMgZm9ybSBwcmV2aW91cwotCQkvLyBjb21tYW5kcyB0aGF0IG1pZ2h0IG9uIG9uIHNhbWUgcGFydGlpb24gdHlwZS4KLQkJLy8gYWRkIGF1dG8gZWRpdCBzdHJhdGVneSB0aGF0IGhhbmRsZXMgd2hlbiB0YWIga2V5IGlzIHByZXNzZWQKLQkJYWxsU3RyYXRlZ2llcy5hZGQobmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzKCkpOwotCi0JCXJldHVybiAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0KLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCVN0cmluZ1tdIHhtbFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbeG1sVHlwZXMubGVuZ3RoICsgMl07Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlc1swXSA9IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTjsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzWzFdID0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCVN5c3RlbS5hcnJheWNvcHkoeG1sVHlwZXMsIDAsIGZDb25maWd1cmVkQ29udGVudFR5cGVzLCBpbmRleCArPSAyLCB4bWxUeXBlcy5sZW5ndGgpOwotCQl9Ci0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gbnVsbDsKLQotCQlpZiAoKHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkpIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTikgewotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBOb1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRGb3JtYXR0ZXIgZ2V0Q29udGVudEZvcm1hdHRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlJQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBzdXBlci5nZXRDb250ZW50Rm9ybWF0dGVyKHNvdXJjZVZpZXdlcik7Ci0JCS8vIHN1cGVyIHdhcyB1bmFibGUgdG8gY3JlYXRlIGEgZm9ybWF0dGVyLCBwcm9iYWJseSBiZWNhdXNlCi0JCS8vIHNvdXJjZVZpZXdlciBkb2VzIG5vdCBoYXZlIGRvY3VtZW50IHNldCB5ZXQsIHNvIGp1c3QgY3JlYXRlIGEKLQkJLy8gZ2VuZXJpYyBvbmUKLQkJaWYgKCEoZm9ybWF0dGVyIGluc3RhbmNlb2YgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikpCi0JCQlmb3JtYXR0ZXIgPSBuZXcgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcihnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpOwotCQkoKE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpIGZvcm1hdHRlcikuc2V0TWFzdGVyU3RyYXRlZ3kobmV3IFhNTEZvcm1hdHRpbmdTdHJhdGVneSgpKTsJCQotLy8JCSgoTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikgZm9ybWF0dGVyKS5zZXRNYXN0ZXJTdHJhdGVneShuZXcgU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneShuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCkpKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRJbmRlbnRQcmVmaXhlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJLy8gcHJlZml4WzBdIGlzIGVpdGhlciAnXHQnIG9yICcgJyB4IHRhYldpZHRoLCBkZXBlbmRpbmcgb24gcHJlZmVyZW5jZQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQlib29sZWFuIHVzZVNwYWNlcyA9IFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UuZXF1YWxzKGluZGVudENoYXJQcmVmKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCVN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlib29sZWFuIGFwcGVuZFRhYiA9IGZhbHNlOwotCi0JCQlpZiAodXNlU3BhY2VzKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogKyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaisrKSB7Ci0JCQkJCXByZWZpeC5hcHBlbmQoJyAnKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaSAhPSAwKSB7Ci0JCQkJCWFwcGVuZFRhYiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCQkJCX0KLQotCQkJCWlmIChpICE9IGluZGVudGF0aW9uV2lkdGgpIHsKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChhcHBlbmRUYWIpIHsKLQkJCQlwcmVmaXguYXBwZW5kKCdcdCcpOwotCQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQkJCS8vIHJlbW92ZSB0aGUgdGFiIHNvIHRoYXQgaW5kZW50YXRpb24gLSB0YWIgaXMgYWxzbyBhbiBpbmRlbnQKLQkJCQkvLyBwcmVmaXgKLQkJCQlwcmVmaXguZGVsZXRlQ2hhckF0KHByZWZpeC5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQkJdmVjdG9yLmFkZChwcmVmaXgudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQl2ZWN0b3IuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAoU3RyaW5nW10pIHZlY3Rvci50b0FycmF5KG5ldyBTdHJpbmdbdmVjdG9yLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCWlmICgocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfUEkpKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvclhNTCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvclhNTCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvclhNTCA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MOwotCX0KLQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZTdGF0dXNMaW5lTGFiZWxQcm92aWRlciA9IG5ldyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBlbGVtZW50OwotCQkJCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJCXMuaW5zZXJ0KDAsIHN1cGVyLmdldFRleHQobm9kZSkpOwotCQkJCQkJfQotCQkJCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQkJcy5pbnNlcnQoMCwgSVBhdGguU0VQQVJBVE9SKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gcy50b1N0cmluZygpOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCU1hcCB0YXJnZXRzID0gc3VwZXIuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKHNvdXJjZVZpZXdlcik7Ci0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwsIG51bGwpOwotCQlyZXR1cm4gdGFyZ2V0czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvRE9NT2JzZXJ2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9ET01PYnNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc2MDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9ET01PYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5DTURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBvYnNlcnZlIGNoYW5nZXMgaW4gdGhlIERPTSBhbmQgcGVyZm9ybQotICogb2NjYXNpb25hbCdzY2FucycgdG8gZGVkdWNlIGluZm9ybWF0aW9uLiBXZSB1c2UgYSBkZWxheSB0aW1lciBtZWNoYW5pc20gdG8KLSAqIGVuc3VyZSBzY2FucyBhcmUgbWFkZSBldmVyeSBjb3VwbGUgb2Ygc2Vjb25kcyB0byBhdm9pZCBwZXJmb3JtYW5jZQotICogcHJvYmxlbXMuIEN1cnJlbnRseSB0aGlzIGNsYXNzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiByZWZlcmVuY2VkIGdyYW1tYXIKLSAqIHVyaSdzIHdpdGhpbiB0aGUgZG9jdW1lbnQgZW5zdXJlIHRoYXQgdGhleSBhcmUgbG9hZGVkIGJ5IHRoZQotICogQ01Eb2N1bWVudE1hbmFnZXIuIFdlIG1pZ2h0IHdhbnQgdG8gZ2VuZXJhbGl6ZSB0aGlzIGNsYXNzIHRvIHBlcmZvcm0gb3RoZXIKLSAqIHN1cGxpbWVudGFsIGluZm9ybWF0aW9uIGdhdGhlcmluZyB0aGF0IGlzIHN1aXRhYmxlIGZvciAndGltZSBkZWxheWVkJwotICogY29tcHV0YXRpb24gKGVycm9yIGhpbnRzIGV0Yy4pLgotICovCi0vLyBUT0RPOiBXaGVyZSBzaG91bGQgdGhpcyBjbGFzcyBnbz8KLXB1YmxpYyBjbGFzcyBET01PYnNlcnZlciB7Ci0KLQotCS8vIEFuIGFic3RyYWN0IGFkYXB0ZXIgdGhhdCBlbnN1cmVzIHRoYXQgdGhlIGNoaWxkcmVuIG9mIGEgbmV3IE5vZGUgYXJlCi0JLy8gYWxzbyBhZGFwdGVkCi0JLy8KLQlhYnN0cmFjdCBjbGFzcyBEb2N1bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCQlwdWJsaWMgRG9jdW1lbnRBZGFwdGVyKCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29ubmVjdChEb2N1bWVudCBkb2N1bWVudCkgewotCQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuYWRkQWRhcHRlcih0aGlzKTsKLQkJCWFkYXB0KGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpY2Nvbm5lY3QoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCSgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLnJlbW92ZUFkYXB0ZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGFwdChFbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRFeGlzdGluZ0FkYXB0ZXIodGhpcykgPT0gbnVsbCkgewotCQkJCQkoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmFkZEFkYXB0ZXIodGhpcyk7Ci0KLQkJCQkJZm9yIChOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCQlhZGFwdCgoRWxlbWVudCkgY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIHR5cGUgPT0gdGhpczsKLQkJfQotCi0JCWFic3RyYWN0IHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY2xhc3MgbGlzdGVucyB0byB0aGUgY2hhbmdlcyBpbiB0aGUgQ01Eb2N1bWVudCBhbmQgdHJpZ2dlcnMgYQotCSAqIENNRG9jdW1lbnQgbG9hZAotCSAqLwotCWNsYXNzIE15RG9jdW1lbnRBZGFwdGVyIGV4dGVuZHMgRG9jdW1lbnRBZGFwdGVyIHsKLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5BREQgOiB7Ci0JCQkJCWlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQUREICh0byAiICsKLQkJCQkJCS8vICgoTm9kZSlub3RpZmllcikuZ2V0Tm9kZU5hbWUoKSArICIpICIgKwotCQkJCQkJLy8gKChFbGVtZW50KW5ld1ZhbHVlKS5nZXROb2RlTmFtZSgpICsgIiBvbGQgIiArCi0JCQkJCQkvLyBvbGRWYWx1ZSk7Ci0JCQkJCQlhZGFwdCgoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkJLy8gY2FzZSBJTm9kZU5vdGlmaWVyLlJFTU9WRToKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgOgotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQgOiB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBub3RpZmllcjsKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQkJCQljYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgOiB7Ci0JCQkJCQkJCS8vIHN0cnVjdHVyZSBjaGFuZ2UKLQkJCQkJCQkJaW52b2tlRGVsYXllZENNRG9jdW1lbnRMb2FkKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEIDogewotCQkJCQkJCQkvLyBzb21lIGNvbnRlbnQgY2hhbmdlZAotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJaW52b2tlRGVsYXllZENNRG9jdW1lbnRMb2FkKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZW50aW9uYWxseSBsZWZ0IHZpc2libGUgdG8gdGhlIHVzZXIKLQkgKi8KLQljbGFzcyBUaW1lckpvYiBleHRlbmRzIEpvYiB7Ci0JCXB1YmxpYyBUaW1lckpvYigpIHsKLQkJCXN1cGVyKFNTRVVJTWVzc2FnZXMuTG9hZGluZ1JlZmVyZW5jZWRHcmFtbWFycyk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZKTsKLQkJCWludm9rZUNNRG9jdW1lbnRMb2FkKCk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBKb2IgdGltZXIgPSBuZXcgVGltZXJKb2IoKTsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBib29sZWFuIGlzR3JhbW1hckluZmVyZW5jZUVuYWJsZWQ7Ci0KLQlwdWJsaWMgRE9NT2JzZXJ2ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlmRG9jdW1lbnQgPSAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpID8gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpIDogbnVsbDsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIGhlcmUgd2UgY3JlYXRlIGFuZCBpbml0IGFuIGFkYXB0ZXIgdGhhdCB3aWxsIGxpc3RlbiB0bwotCQkJLy8gY2hhbmdlcyB0byB0aGUgZG9jdW1lbnQgYW5kIGNvbnRhaW5lZCBlbGVtZW50cwotCQkJTXlEb2N1bWVudEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNeURvY3VtZW50QWRhcHRlcigpOwotCQkJYWRhcHRlci5jb25uZWN0KGZEb2N1bWVudCk7Ci0KLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZkRvY3VtZW50KTsKLQkJCWlmICgobW9kZWxRdWVyeSAhPSBudWxsKSAmJiAobW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpICE9IG51bGwpKSB7Ci0JCQkJQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIgPSBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJY21Eb2N1bWVudE1hbmFnZXIuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FVVE9fTE9BRCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJLy8gQ1M6IHdlIHNlZW0gdG8gZXhwb3NlIGFuIFhTRCBpbml0aWFsaXphdGlvbiBwcm9ibGVtIHdoZW4gd2UgZG8gdGhpcwotCQkvLyBpbW1lZGlhdGVseQotCQkvLyB2ZXJ5IG5hc3R5Li4uIEkgbmVlZCB0byByZXZpc3QgdGhpcyBwcm9ibGVtIHdpdGggRWQgTWVya3MKLQkJLy8KLQkJdGltZXIuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnZva2VDTURvY3VtZW50TG9hZCgpIHsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShmRG9jdW1lbnQpOwotCQlpZiAoKG1vZGVsUXVlcnkgIT0gbnVsbCkgJiYgKG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSkgewotCQkJQ01Eb2N1bWVudExvYWRlciBsb2FkZXIgPSBpc0dyYW1tYXJJbmZlcmVuY2VFbmFibGVkID8gbmV3IEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcihmRG9jdW1lbnQsIG1vZGVsUXVlcnkpIDogbmV3IENNRG9jdW1lbnRMb2FkZXIoZkRvY3VtZW50LCBtb2RlbFF1ZXJ5KTsKLQkJCWxvYWRlci5sb2FkQ01Eb2N1bWVudHMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGludm9rZURlbGF5ZWRDTURvY3VtZW50TG9hZCgpIHsKLQkJdGltZXIuc2NoZWR1bGUoMjAwMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhbW1hckluZmVyZW5jZUVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKLQkJaXNHcmFtbWFySW5mZXJlbmNlRW5hYmxlZCA9IGlzRW5hYmxlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OGU3YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoKGxldmVsID09IE9LX0RFQlVHKSB8fCAobGV2ZWwgPT0gSU5GT19ERUJVRykgfHwgKGxldmVsID09IFdBUk5JTkdfREVCVUcpIHx8IChsZXZlbCA9PSBFUlJPUl9ERUJVRykpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0MzJlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MRm9ybWF0dGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdTdHJhdGVneUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlci5EZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyOwotCi1wdWJsaWMgY2xhc3MgWE1MRm9ybWF0dGluZ1N0cmF0ZWd5IGV4dGVuZHMgQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUZvcm1hdHRpbmdTdHJhdGVneUV4dGVuc2lvbiB7Ci0KLQkvKiogRG9jdW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZEb2N1bWVudHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCS8qKiBQYXJ0aXRpb25zIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZQYXJ0aXRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIERlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IERlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBmb3JtYXRQcm9jZXNzb3IKLQkgKi8KLQlwdWJsaWMgWE1MRm9ybWF0dGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoKSB7Ci0JCXN1cGVyLmZvcm1hdCgpOwotCi0JCWZpbmFsIElEb2N1bWVudCBkb2N1bWVudCA9IChJRG9jdW1lbnQpIGZEb2N1bWVudHMucmVtb3ZlRmlyc3QoKTsKLQkJZmluYWwgVHlwZWRQb3NpdGlvbiBwYXJ0aXRpb24gPSAoVHlwZWRQb3NpdGlvbikgZlBhcnRpdGlvbnMucmVtb3ZlRmlyc3QoKTsKLQotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBwYXJ0aXRpb24gIT0gbnVsbCAmJiBmUmVnaW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJVGV4dEVkaXQgZWRpdCA9IGZvcm1hdHRlci5mb3JtYXQobW9kZWwsIGZSZWdpb24uZ2V0T2Zmc2V0KCksIGZSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCQkJCQkJZWRpdC5hcHBseShkb2N1bWVudCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RhcnRzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdGFydHMoZmluYWwgSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIuZm9ybWF0dGVyU3RhcnRzKGNvbnRleHQpOwotCi0JCWZQYXJ0aXRpb25zLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9QQVJUSVRJT04pKTsKLQkJZkRvY3VtZW50cy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfTUVESVVNKSk7Ci0JCWZSZWdpb24gPSAoSVJlZ2lvbikgY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9SRUdJT04pOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RvcHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0b3BzKCkgewotCQlzdXBlci5mb3JtYXR0ZXJTdG9wcygpOwotCi0JCWZQYXJ0aXRpb25zLmNsZWFyKCk7Ci0JCWZEb2N1bWVudHMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1MGExNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlCi0gKiBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgVUkKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhbXBsZV9YTUxfZG9jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1lbnRfRGVsaW1pdGVyc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF9Db250ZW50X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfRGVsaW1pdGVyc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX05hbWVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfTmFtZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9WYWx1ZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlY2xhcmF0aW9uX0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENEQVRBX0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENEQVRBX0NvbnRlbnRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fRGVsX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzaW5nX0luc3RydWN0aW9uX0Nvbl9VSV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ1RZUEVfTmFtZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DVFlQRV9TWVNURU1fUFVCTElDX0tleXdfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ1RZUEVfUHVibGljX1JlZmVyZW5jZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DVFlQRV9TeXN0ZW1fUmVmZXJlbmNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlfUmVmZXJlbmNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0FGVEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0JFRk9SRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfQ0hJTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUkVNT1ZFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1JFUExBQ0VfV0lUSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX0RPQ1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1VORE9fUkVQTEFDRV9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRURJVF9ET0NUWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTkZPX0VYUEFORF9BTEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lORk9fQ09MTEFQU0VfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX1NDSEVNQV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9OQU1FU1BBQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT05fVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0VESVRfU0NIRU1BX0lORk9STUFUSU9OX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX05FV19BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfTkVXX0FUVFJJQlVURV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX0FUVFJJQlVURV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9ORVdfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9ORVdfRUxFTUVOVF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9SRU5BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUkVOQU1FX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5UX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0NPTU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0NEQVRBX1NFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX1BDREFUQTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQ0RBVEFfU0VDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9QQ0RBVEE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DT01NRU5UX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QSV9UQVJHRVRfVkFMVUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BJX0RBVEFfVkFMVUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JPT1RfRUxFTUVOVF9WQUxVRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVEFSR0VUX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EQVRBX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ST09UX0VMRU1FTlRfTkFNRV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUFVCTElDX0lEX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TWVNURU1fSURfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0JST1dTRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VMRUNUX1hNTF9DQVRBTE9HX0VOVFJZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TUEVDSUZZX1NZU1RFTV9JRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VMRUNUX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0tFWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVVJJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9YTUxfQ0FUQUxPR19DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRVNQQUNFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0xPQ0FUSU9OX0hJTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRVNQQUNFX05BTUVfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0xPQ0FUSU9OX0hJTlRfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BSRUZJWF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTk9fTkFNRVNQQUNFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05PX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfWE1MX1NDSEVNQV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVkFMVUVfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9ORVc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9FRElUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ORVdfTkFNRVNQQUNFX0lORk9STUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SQURJT19CVVRUT05fU0VMRUNUX0ZST01fV09SS1NQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SQURJT19CVVRUT05fU0VMRUNUX0ZST01fQ0FUQUxPRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfU0NIRU1BX0NBTl9OT1RfQkVfTE9DQVRFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19MT0NBVElPTl9ISU5UX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTkFNRVNQQUNFX05BTUVfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19QUkVGSVhfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfU1lTVEVNX0lEX01VU1RfQkVfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTlZBTElEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VOVEVSX1JFUV9QUkVGSVhfQU5EX05BTUVTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU0VMRUNUX1JFR0lTVEVSRURfTkFNRVNQQUNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU1BFQ0lGWV9ORVdfTkFNRVNQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TRUxFQ1RfTkFNRVNQQUNFX1RPX0FERDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUREX05BTUVTUEFDRV9ERUNMQVJBVElPTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RBUkdFVF9OQU1FU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1hNTF9BVFRSSUJVVEVfQUxSRUFEWV9FWElTVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuY29kaW5nU2V0dGluZ3NfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZ1NldHRpbmdzXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHJhZ05vZGVDb21tYW5kXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHJhZ05vZGVDb21tYW5kXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2dfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKRmFjZU5vZGVBZGFwdGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8xNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5nc18wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hvdXRsaW5lXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3RhZ19oYXNfYXR0cmlidXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfX2lzX21pc3NpbmdfYV92YWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfX2hhc19ub192YWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX2VuZF90YWdfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3Npbmdfc3RhcnRfdGFnXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3dpdGhfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFVkVSRV9pbnRlcm5hbF9lcnJvcl9vY2N1X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19rbm93bl9hdHRyaWJ1dGVfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudF9faXNfdW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2Vfd2l0aF9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF93aXRoX187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2Vfd2l0aF9fXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbG9zZV93aXRoX19fXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfSGFzX25vX2F2YWlsYWJsZV9jaGlsZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19rbm93bl9jaGlsZF90YWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX19IYXNfbm9fa25vd25fY2hpbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fa25vd25fY2hpbGRfdGFnX25hbWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRoZV9kb2N1bWVudF9lbGVtZW50X187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fZGVmaW5pdGlvbl9mb3JfaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fZGVmaW5pdGlvbl9mb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fY29udGVudF9tb2RlbF9mb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fY29udGVudF9tb2RlbF9mb3VuZF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcHJlc3NfZW1wdHlfZWxlbWVudF90YWdzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0X21pc3NpbmdfdGFnc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X3NvdXJjZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydF9FT0xfY29kZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9XaW5kb3dzX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9Vbml4X1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9NYWNfVUk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19vcl9zYXZpbmdfZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX29mX2xpbmVfY29kZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF9vZl9saW5lX2NvZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX1dpbmRvd3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX1VuaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX01hYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfTm9UcmFuc2xhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudF9hc3Npc3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY2FsbHlfbWFrZV9zdWdnZXN0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9tcHRfd2hlbl90aGVzZV9jaGFyYWN0ZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0dGluZ19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGluZV93aWR0aF9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNwbGl0X211bHRpcGxlX2F0dHJpYnV0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWxpZ25fZmluYWxfYnJhY2tldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVzZXJ2ZV9QQ0RBVEFfQ29udGVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTcGFjZV9iZWZvcmVfZW1wdHlfY2xvc2VfdGFnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ190YWJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ19zcGFjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50YXRpb25fc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplX3RpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhcl9hbGxfYmxhbmtfbGluZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdyYW1tYXJfQ29uc3RyYWludHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlX2luZmVycmVkX2dyYW1tYXJfaW5fYWJzZW5jZV9vZjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdWdnZXN0aW9uX1N0cmF0ZWd5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1Z2dlc3Rpb25fU3RyYXRlZ3lfTGF4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1Z2dlc3Rpb25fU3RyYXRlZ3lfU3RyaWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRfX19fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X01vZGVsX19fXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX19fXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YV9UeXBlX19fXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW51bWVyYXRlZF9WYWx1ZXNfX19fNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1lbnRfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1lbnRfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5jb21tZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmNvbW1lbnRfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5jb21tZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRPY2N1cnJlbmNlc19sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRmlsZUZyb21Tb3VyY2VfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUeXBpbmdfQXV0b19Db21wbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUeXBpbmdfQXV0b19SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHlwaW5nX0NvbXBsZXRlX0NvbW1lbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFR5cGluZ19Db21wbGV0ZV9FbmRfVGFnczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUeXBpbmdfUmVtb3ZlX0VuZF9UYWdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfWE1MX1ZBTElEQVRJT05fTUVTU0FHRV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW5nX2ZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtcHR5RmlsZVByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnb3RvTWF0Y2hpbmdUYWdfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ290b01hdGNoaW5nVGFnX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5leHRTaWJsaW5nX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5leHRTaWJsaW5nX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpb3VzU2libGluZ19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aW91c1NpYmxpbmdfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlX1hJbmNsdWRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9TT1JUOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTFVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgWE1MVUlNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZThmMTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUw7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIFhNTFVJUGx1Z2luIGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgWE1MVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhNTFVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIHhtbCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgeG1sIGVkaXRvci4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0KLQlwdWJsaWMgWE1MVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgeG1sIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSB4bWwgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLCBYTUxVSVByZWZlcmVuY2VOYW1lcy5URU1QTEFURVNfS0VZKTsKLQotCQkJdHJ5IHsKLQkJCQlmVGVtcGxhdGVTdG9yZS5sb2FkKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIHhtbCBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgeG1sIHBsdWdpbgotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlpZiAoZkNvbnRleHRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFMTCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLk5FVyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLlRBRyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFUVFJJQlVURSk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFUVFJJQlVURV9WQUxVRSk7Ci0KLQkJCWZDb250ZXh0VHlwZVJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCX0KLQotCQlyZXR1cm4gZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFuIGltYWdlIGZyb20gdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqICpUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSByZWZlcmVuY2luZ2ZpbGUgZGlhbG9nIGFuZCBzaG91bGQgYmUKLQkgKiByZW1vdmVkIHdoZW4gdGhlIGRpYWxvZyBpcyBtb3ZlZCB0byBhbm90aGVyY29tcG9uZW50LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBpbWFnZS4KLQkgKiBAcmV0dXJuIFRoZSBpbWFnZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gbmFtZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGltYWdlTmFtZSkgewotCQlyZXR1cm4gZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoaW1hZ2VOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTUwYTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlCi0jICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhIHNhbXBsZSBYTUwgZG9jdW1lbnQuICBQbGVhc2UgdHJhbnNsYXRlIG9ubHkgdGhlIGZvbGxvd2luZyBwYXJ0czoKLSMjIGJlZ2luIGNvbG9yIGRlZmluaXRpb25zCi0jIyBOb3JtYWwgdGV4dCBjb250ZW50LgotU2FtcGxlX1hNTF9kb2M9PD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbjw/Y3VzdG9tUHJvY2Vzc2luZ0luc3RydWN0aW9uXG5cdFhNTCBwcm9jZXNzb3Igc3BlY2lmaWNcblx0Y29udGVudCA/PlxuPCFET0NUWVBFIGNvbG9yc1xuXHRQVUJMSUMgXCIvL0lCTS9YTUwvQ09MT1JTL1wiIFwiY29sb3JzLmR0ZFwiPlxuPGNvbG9ycz5cblx0PCEtLSBiZWdpbiBjb2xvciBkZWZpbml0aW9ucyAtLT5cblx0PGNvbG9yIG5hbWU9XCJwbGFpbnRleHRcIiBmb3JlZ3JvdW5kPVwiIzAwMDAwMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNENEQwQzhcIiAvPlxuXHQ8Y29sb3IgbmFtZT1cImJvbGRcIiBmb3JlZ3JvdW5kPVwiIzAwMDAwMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNCM0FDQTBcIiAvPlxuXHQ8IVtDREFUQVs8MTIzNDU2Nzg5Pl1dPlxuXHROb3JtYWwgdGV4dCBjb250ZW50LlxuXHQ9PT0mZ3Q7bG9vayBhdCBtZSEmbHQ7PT09XG5cdDxjb2xvciBuYW1lPVwiaW52ZXJzZVwiIGZvcmVncm91bmQ9XCIjRjBGMEYwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0Q0RDBDOFwiIC8+XG5cbjwvY29sb3JzPlxuCi1Db21tZW50X0RlbGltaXRlcnNfVUlfPUNvbW1lbnQgRGVsaW1pdGVycwotQ29tbWVudF9Db250ZW50X1VJXz1Db21tZW50IENvbnRlbnQKLVRhZ19EZWxpbWl0ZXJzX1VJXz1UYWcgRGVsaW1pdGVycwotVGFnX05hbWVzX1VJXz1UYWcgTmFtZXMKLUF0dHJpYnV0ZV9OYW1lc19VSV89QXR0cmlidXRlIE5hbWVzCi1BdHRyaWJ1dGVfVmFsdWVzX1VJXz1BdHRyaWJ1dGUgVmFsdWVzCi1EZWNsYXJhdGlvbl9EZWxpbWl0ZXJzX1VJXz1EZWNsYXJhdGlvbiBEZWxpbWl0ZXJzCi1Db250ZW50X1VJXz1Db250ZW50Ci1FbnRpdHlfUmVmZXJlbmNlX1VJXz1FbnRpdHkgUmVmZXJlbmNlcwotIyMgb24gdGhlIGZvbGxvd2luZyAyIGxpbmVzLCBkbyBub3QgdHJhbnNsYXRlIENEQVRBCi1DREFUQV9EZWxpbWl0ZXJzX1VJXz1DREFUQSBEZWxpbWl0ZXJzCi1DREFUQV9Db250ZW50X1VJXz1DREFUQSBDb250ZW50Ci1Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0RlbF9VSV89UHJvY2Vzc2luZyBJbnN0cnVjdGlvbiBEZWxpbWl0ZXJzCi1Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0Nvbl9VSV9fVUlfPVByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gQ29udGVudAotIyMgb24gdGhlIGZvbGxvd2luZyBsaW5lIHNvbGVseSB0cmFuc2xhdGU6ICBOYW1lCi1ET0NUWVBFX05hbWVfVUlfPURPQ1RZUEUgTmFtZQotIyMgb24gdGhlIGZvbGxvd2luZyBsaW5lIHNvbGVseSB0cmFuc2xhdGU6ICBLZXl3b3JkCi1ET0NUWVBFX1NZU1RFTV9QVUJMSUNfS2V5d19VSV89RE9DVFlQRSBTWVNURU0vUFVCTElDIEtleXdvcmQKLSMjIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBzb2xlbHkgdHJhbnNsYXRlOiAgUHVibGljIFJlZmVyZW5jZQotRE9DVFlQRV9QdWJsaWNfUmVmZXJlbmNlX1VJXz1ET0NUWVBFIFB1YmxpYyBSZWZlcmVuY2UKLSMjIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBzb2xlbHkgdHJhbnNsYXRlOiAgU3lzdGVtIFJlZmVyZW5jZQotRE9DVFlQRV9TeXN0ZW1fUmVmZXJlbmNlX1VJXz1ET0NUWVBFIFN5c3RlbSBSZWZlcmVuY2UKLSMgWE1MIENvbW1vbiBVSQotIyBDb25zdGFudHMgZm9yIHN0cmluZ3MKLQotREVMRVRFPVJlbW92ZQotQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT049QWRkIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLQotX1VJX01FTlVfQUREX0FGVEVSPUFkZCAmQWZ0ZXIKLV9VSV9NRU5VX0FERF9BVFRSSUJVVEU9QWRkIEEmdHRyaWJ1dGUKLV9VSV9NRU5VX0FERF9CRUZPUkU9QWRkICZCZWZvcmUKLV9VSV9NRU5VX0FERF9DSElMRD1BZGQgJkNoaWxkCi1fVUlfTUVOVV9SRU1PVkU9UmUmbW92ZQotX1VJX01FTlVfUkVQTEFDRV9XSVRIPVJlJnBsYWNlIFdpdGgKLV9VSV9NRU5VX0VESVRfRE9DVFlQRT1FZGl0IERPQ1RZUEUuLi4KLV9VSV9MQUJFTF9VTkRPX1JFUExBQ0VfREVTQ1JJUFRJT049UmVwbGFjZQotX1VJX0xBQkVMX0VESVRfRE9DVFlQRT1FZGl0IERPQ1RZUEUKLV9VSV9JTkZPX0VYUEFORF9BTEw9RXhwYW5kIEFsbAotX1VJX0lORk9fQ09MTEFQU0VfQUxMPUNvbGxhcHNlIEFsbAotCi1fVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OPUFkZCBEVEQgSW5mb3JtYXRpb24uLi4KLV9VSV9NRU5VX0FERF9TQ0hFTUFfSU5GT1JNQVRJT049QWRkIFNjaGVtYSBJbmZvcm1hdGlvbi4uLgotX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OPUVkaXQgUHJvY2VzcyZpbmcgSW5zdHJ1Y3Rpb24uLi4KLV9VSV9NRU5VX0VESVRfTkFNRVNQQUNFUz1FZGl0ICZOYW1lc3BhY2VzLi4uCi0KLV9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT05fVElUTEU9QWRkIERURCBJbmZvcm1hdGlvbgotX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1RJVExFPUVkaXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbgotX1VJX01FTlVfRURJVF9TQ0hFTUFfSU5GT1JNQVRJT05fVElUTEU9RWRpdCBTY2hlbWEgSW5mb3JtYXRpb24KLQotX1VJX01FTlVfTkVXX0FUVFJJQlVURT0mTmV3IEF0dHJpYnV0ZS4uLgotX1VJX01FTlVfTkVXX0FUVFJJQlVURV9USVRMRT1OZXcgQXR0cmlidXRlCi1fVUlfTUVOVV9FRElUX0FUVFJJQlVURT1FZGl0IEF0dHJpYnV0ZS4uLgotX1VJX01FTlVfRURJVF9BVFRSSUJVVEVfVElUTEU9RWRpdCBBdHRyaWJ1dGUKLV9VSV9NRU5VX05FV19FTEVNRU5UPU5ldyAmRWxlbWVudC4uLgotX1VJX01FTlVfTkVXX0VMRU1FTlRfVElUTEU9TmV3IEVsZW1lbnQKLV9VSV9NRU5VX1JFTkFNRT1SJmVuYW1lCi1fVUlfTUVOVV9SRU5BTUVfVElUTEU9UmVuYW1lCi1fVUlfTEFCRUxfRUxFTUVOVF9OQU1FPUVsZW1lbnQgbmFtZToKLQotX1VJX01FTlVfQUREX0NPTU1FTlQ9QWRkIENvbW1lbnQKLV9VSV9NRU5VX0FERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OPUFkZCBQcm9jZXNzaW5nIEluc3RydWN0aW9uCi1fVUlfTUVOVV9BRERfQ0RBVEFfU0VDVElPTj1BZGQgQ0RBVEEgU2VjdGlvbgotX1VJX01FTlVfQUREX1BDREFUQT1BZGQgI1BDREFUQTsKLQotX1VJX01FTlVfQ09NTUVOVD1DJm9tbWVudAotX1VJX01FTlVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTj1QJnJvY2Vzc2luZyBJbnN0cnVjdGlvbgotX1VJX01FTlVfQ0RBVEFfU0VDVElPTj1DREFUQSBTZWN0aW9uCi1fVUlfTUVOVV9QQ0RBVEE9I1BDJkRBVEE7Ci0KLV9VSV9NRU5VX0FERD1BZGQKLQotX1VJX0NPTU1FTlRfVkFMVUU9Y29tbWVudAotX1VJX1BJX1RBUkdFVF9WQUxVRT10YXJnZXQKLV9VSV9QSV9EQVRBX1ZBTFVFPWRhdGEKLV9VSV9MQUJFTF9ST09UX0VMRU1FTlRfVkFMVUU9Um9vdEVsZW1lbnQKLQotX1VJX0xBQkVMX1RBUkdFVF9DT0xPTj1UYXJnZXQ6Ci1fVUlfTEFCRUxfREFUQV9DT0xPTj1EYXRhOgotX1VJX0xBQkVMX1JPT1RfRUxFTUVOVF9OQU1FX0NPTE9OPVJvb3QgZWxlbWVudCBuYW1lOgotX1VJX0xBQkVMX1BVQkxJQ19JRF9DT0xPTj1QdWJsaWMgSUQ6Ci1fVUlfTEFCRUxfU1lTVEVNX0lEX0NPTE9OPVN5c3RlbSBJRDoKLV9VSV9MQUJFTF9CUk9XU0U9QnJvd3NlLi4uCi1fVUlfTEFCRUxfU0VMRUNUX1hNTF9DQVRBTE9HX0VOVFJZPVNlbGVjdCBYTUwgQ2F0YWxvZyBFbnRyeQotX1VJX0xBQkVMX1NQRUNJRllfU1lTVEVNX0lEPVNwZWNpZnkgU3lzdGVtIElECi1fVUlfTEFCRUxfU0VMRUNUX0ZJTEU9U2VsZWN0IEZpbGUKLQotX1VJX0xBQkVMX0tFWT1LZXkKLV9VSV9MQUJFTF9VUkk9VVJJOgotX1VJX0xBQkVMX1hNTF9DQVRBTE9HX0NPTE9OPVhNTCBDYXRhbG9nCi1fVUlfTEFCRUxfTkFNRVNQQUNFX05BTUU9TmFtZXNwYWNlIE5hbWUKLV9VSV9MQUJFTF9MT0NBVElPTl9ISU5UPUxvY2F0aW9uIEhpbnQKLV9VSV9MQUJFTF9QUkVGSVg9UHJlZml4Ci1fVUlfTEFCRUxfTkFNRVNQQUNFX05BTUVfQ09MT049TmFtZXNwYWNlIE5hbWU6Ci1fVUlfTEFCRUxfTE9DQVRJT05fSElOVF9DT0xPTj1Mb2NhdGlvbiBIaW50OgotX1VJX0xBQkVMX1BSRUZJWF9DT0xPTj1QcmVmaXg6Ci1fVUlfTk9fTkFNRVNQQUNFX05BTUU9PG5vIG5hbWVzcGFjZSBuYW1lPgotX1VJX05PX1BSRUZJWD08bm8gcHJlZml4PgotCi1fVUlfTEFCRUxfWE1MX1NDSEVNQV9JTkZPUk1BVElPTj1YTUwgU2NoZW1hIEluZm9ybWF0aW9uCi0KLV9VSV9MQUJFTF9OQU1FX0NPTE9OPU5hbWU6Ci1fVUlfTEFCRUxfVkFMVUVfQ09MT049VmFsdWU6Ci0KLV9VSV9CVVRUT05fREVMRVRFPURlbGV0ZQotX1VJX0JVVFRPTl9ORVc9TmV3Li4uCi1fVUlfQlVUVE9OX0VESVQ9RWRpdC4uLgotCi1fVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTj1OZXcgTmFtZXNwYWNlIEluZm9ybWF0aW9uCi0KLSMgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQotCi1fVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX1dPUktTUEFDRT1TZWxlY3QgZmlsZSBmcm9tIFdvcmtzcGFjZQotX1VJX1JBRElPX0JVVFRPTl9TRUxFQ1RfRlJPTV9DQVRBTE9HPVNlbGVjdCBYTUwgQ2F0YWxvZyBlbnRyeQotCi1fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhfTkFNRT1Nb3JlIHRoYW4gb25lIG5hbWVzcGFjZSBoYXMgYmVlbiBzcGVjaWZpZWQgd2l0aCB0aGUgbmFtZXNwYWNlIG5hbWUgOgotX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX05BTUU9TW9yZSB0aGFuIG9uZSBzY2hlbWEgaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGhvdXQgYSBuYW1lc3BhY2UgbmFtZQotX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX1BSRUZJWD1Nb3JlIHRoYW4gb25lIG5hbWVzcGFjZSBoYXMgYmVlbiBzcGVjaWZpY2VkIHdpdGhvdXQgYSBwcmVmaXgKLV9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9QUkVGSVg9TW9yZSB0aGFuIG9uZSBuYW1lc3BhY2UgaGFzIGJlZW4gc3BlY2lmaWVkIHdpdGggdGhlIHByZWZpeCA6Ci1fVUlfV0FSTklOR19TQ0hFTUFfQ0FOX05PVF9CRV9MT0NBVEVEPVRoZSBzcGVjaWZpZWQgc2NoZW1hIGNhbiBub3QgYmUgbG9jYXRlZCA6Ci1fVUlfV0FSTklOR19MT0NBVElPTl9ISU5UX05PVF9TUEVDSUZJRUQ9QSBsb2NhdGlvbiBoaW50IGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgZm9yIHRoZSBuYW1lc3BhY2Ugd2l0aCBuYW1lCi1fVUlfV0FSTklOR19OQU1FU1BBQ0VfTkFNRV9OT1RfU1BFQ0lGSUVEPUEgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlIG5hbWVzcGFjZSB3aXRoIHByZWZpeCA6Ci1fVUlfV0FSTklOR19QUkVGSVhfTk9UX1NQRUNJRklFRD1BIHByZWZpeCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlIG5hbWVzcGFjZSBuYW1lZCA6Ci1fVUlfV0FSTklOR19ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQ9QSByb290IGVsZW1lbnQgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLV9VSV9XQVJOSU5HX1NZU1RFTV9JRF9NVVNUX0JFX1NQRUNJRklFRD1BIHN5c3RlbSBJRCBtdXN0IGJlIHNwZWNpZmllZC4KLQotX1VJX0lOVkFMSURfTkFNRT1JbnZhbGlkIG5hbWUKLQotIyBTdHJpbmcgdXNlZCBmb3IgZWRpdGluZyBuYW1lc3BhY2VzIChvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5zZWRpdCkKLV9VSV9FTlRFUl9SRVFfUFJFRklYX0FORF9OQU1FU1BBQ0U9RW50ZXIgdGhlIHJlcXVpcmVkIHByZWZpeCBhbmQgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbi4KLV9VSV9TRUxFQ1RfUkVHSVNURVJFRF9OQU1FU1BBQ0VTPVNlbGVjdCBGcm9tIFJlZ2lzdGVyZWQgTmFtZXNwYWNlcwotX1VJX1NQRUNJRllfTkVXX05BTUVTUEFDRT1TcGVjaWZ5IE5ldyBOYW1lc3BhY2UKLV9VSV9TRUxFQ1RfTkFNRVNQQUNFX1RPX0FERD1TZWxlY3QgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgdG8gYWRkLgotX1VJX0FERF9OQU1FU1BBQ0VfREVDTEFSQVRJT05TPUFkZCBOYW1lc3BhY2UgRGVjbGFyYXRpb25zCi1fVUlfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OUz1OYW1lc3BhY2UgRGVjbGFyYXRpb25zCi1fVUlfVEFSR0VUX05BTUVTUEFDRT1UYXJnZXQgTmFtZXNwYWNlCi0KLV9FUlJPUl9YTUxfQVRUUklCVVRFX0FMUkVBRFlfRVhJU1RTPVRoZSBlbGVtZW50IGFscmVhZHkgaGFzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoaXMgbmFtZS4KLQotIwotZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmU9ZXJyb3IgbWVzc2FnZSBnb2VzIGhlcmUKLVN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsXzA9U3Vycm91bmQgd2l0aCBuZXcgZWxlbWVudAotU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMT1TdXJyb3VuZCB3aXRoIG5ldyBlbGVtZW50Ci1SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzA9TGluayBhbGwgcmVmZXJlbmNlcyBmb3IgYSByZW5hbWUgaW4gZmlsZSAoZG9lcyBub3QgY2hhbmdlIHJlZmVyZW5jZXMgaW4gb3RoZXIgZmlsZXMpCi1SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzE9UmVuYW1lIGluIGZpbGUKLUluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzA9SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMKLUluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzE9SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMKLUVuY29kaW5nU2V0dGluZ3NfMD1JQU5BOgotRW5jb2RpbmdTZXR0aW5nc18xPUVuY29kaW5nOgotRHJhZ05vZGVDb21tYW5kXzA9TW92ZQotRHJhZ05vZGVDb21tYW5kXzE9Q29weQotQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2dfMD1BZGQuLi4KLUpGYWNlTm9kZUFkYXB0ZXJfMT1SZWZyZXNoIFByb3BlcnR5IFNoZWV0Ci1RdWlja0ZpeFByb2Nlc3NvclhNTF8wPVJlbW92ZSBlbXB0eSB0YWcKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzE9Q2hhbmdlIHRvIGVtcHR5LWVsZW1lbnQgdGFnCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8yPVJlbW92ZSB0aGlzIHRhZwotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMz1JbnNlcnQgZW5kIHRhZyBiZWZvcmUgZmlyc3QgY2hpbGQgZWxlbWVudAotUXVpY2tGaXhQcm9jZXNzb3JYTUxfND1JbnNlcnQgZW5kIHRhZyBhdCBlbmQgb2YgZWxlbWVudAotUXVpY2tGaXhQcm9jZXNzb3JYTUxfNT1SZW1vdmUgYXR0cmlidXRlcyBpbiBlbmQgdGFnCi1RdWlja0ZpeFByb2Nlc3NvclhNTF82PUluc2VydCBkZWZhdWx0IGF0dHJpYnV0ZSB2YWx1ZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfNz1SZW1vdmUgdGhpcyBhdHRyaWJ1dGUKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzg9UmVtb3ZlIHNwYWNlcyBiZWZvcmUgdGFnIG5hbWUKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzk9UmVtb3ZlIHNwYWNlcyBiZWZvcmUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTA9UmVtb3ZlIG5hbWVzcGFjZSBpbiBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8xMT1SZW1vdmUgdGhpcyBlbGVtZW50Ci1RdWlja0ZpeFByb2Nlc3NvclhNTF8xMj1SZW1vdmUgdGhpcyBhdHRyaWJ1dGUgdmFsdWUKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzEzPUluc2VydCByZXF1aXJlZCBhdHRyaWJ1dGUKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzE0PVF1b3RlIGF0dHJpYnV0ZSB2YWx1ZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTU9SW5zZXJ0IGNsb3NpbmcgYnJhY2tldAotWE1MUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA9QXR0cmlidXRlcwotCi1Xb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5nc18wPVVzZSB3b3Jrc3BhY2UgZW5jb2RpbmcKLXJlZnJlc2hvdXRsaW5lXzA9UmVmcmVzaGluZyBPdXRsaW5lCi1DcmVhdGluZ19maWxlc19lbmNvZGluZz1DcmVhdGluZyBmaWxlcyBlbmNvZGluZyBwcmVmZXJlbmNlCi0jIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXAKLUVuZF90YWdfaGFzX2F0dHJpYnV0ZXM9RW5kIHRhZyBoYXMgYXR0cmlidXRlcwotQXR0cmlidXRlX19pc19taXNzaW5nX2FfdmFsdWU9QXR0cmlidXRlIFwiezB9XCIgaXMgbWlzc2luZyBhIHZhbHVlCi1BdHRyaWJ1dGVfX2hhc19ub192YWx1ZT1BdHRyaWJ1dGUgXCJ7MH1cIiAgaGFzIG5vIHZhbHVlCi1NaXNzaW5nX3N0YXJ0X3RhZ189TWlzc2luZyBzdGFydCB0YWcgXCJ7MH1cIgotTWlzc2luZ19lbmRfdGFnXz1NaXNzaW5nIGVuZCB0YWcgXCJ7MH1cIgotUmVjb25jaWxlU3RlcEZvck1hcmt1cF8wPU1pc3NpbmcgY2xvc2luZyBxdW90ZQotUmVjb25jaWxlU3RlcEZvck1hcmt1cF8xPU1pc3NpbmcgcXVvdGVzIGZvciBhdHRyaWJ1dGUgdmFsdWUKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMj1BIHRhZ25hbWUgY2Fubm90IHN0YXJ0IHdpdGggYSBzcGFjZQotUmVjb25jaWxlU3RlcEZvck1hcmt1cF8zPUVtcHR5IHRhZ3MgYXJlIG5vdCBhbGxvd2VkCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzQ9TmFtZXNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gYSBQcm9jZXNzaW5nIEluc3RydWN0aW9uIHRhcmdldAotUmVjb25jaWxlU3RlcEZvck1hcmt1cF81PVNwYWNlcyBhcmUgbm90IGFsbG93ZWQgYmVmb3JlIGEgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbgotUmVjb25jaWxlU3RlcEZvck1hcmt1cF82PVRhZyBtaXNzaW5nIGNsb3NpbmcgYnJhY2tldCAnPicKLSMgQ29udGVudCBBc3Npc3QKLUVuZF93aXRoXz1FbmQgd2l0aCB7MH0+Ci1TRVZFUkVfaW50ZXJuYWxfZXJyb3Jfb2NjdV9VSV89U0VWRVJFIGludGVybmFsIGVycm9yIG9jY3VycmVkCi1Ob19rbm93bl9hdHRyaWJ1dGVfX1VJXz1ObyBrbm93biBhdHRyaWJ1dGUKLUNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXz1Db250ZW50IEFzc2lzdCBub3QgYXZhaWxhYmxlIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uCi1FbGVtZW50X19pc191bmtub3duPUVsZW1lbnQgPHswfT4gaXMgdW5rbm93bi4KLUNvbW1lbnRfXz1jb21tZW50IHswfQotQ2xvc2Vfd2l0aF9fPUNsb3NlIHdpdGggezB9Ci1FbmRfd2l0aF9fPUVuZCB3aXRoIFwiPC97MH0+XCIKLUNsb3NlX3dpdGhfX189Q2xvc2Ugd2l0aCBcInswfVwiCi1DbG9zZV93aXRoX19fXz1DbG9zZSB3aXRoIFwiPjwvezB9PlwiCi1fSGFzX25vX2F2YWlsYWJsZV9jaGlsZD17MH0gaGFzIG5vIGF2YWlsYWJsZSBjaGlsZCB0YWdzLgotTm9fa25vd25fY2hpbGRfdGFnPU5vIGtub3duIGNoaWxkIHRhZyBuYW1lcyBvZiA8ezB9PiBiZWdpbiB3aXRoIFwiezF9XCIuCi1fX0hhc19ub19rbm93bl9jaGlsZD08ezB9PiBoYXMgbm8ga25vd24gY2hpbGQgdGFncy4KLU5vX2tub3duX2NoaWxkX3RhZ19uYW1lcz1ObyBrbm93biBjaGlsZCB0YWcgbmFtZXMgb2YgPHswfT4gYmVnaW4gd2l0aCBcInsxfVwiCi1UaGVfZG9jdW1lbnRfZWxlbWVudF9fPVRoZSBkb2N1bWVudCBlbGVtZW50IDx7MH0+IGlzIGFscmVhZHkgcHJlc2VudC4KLU5vX2RlZmluaXRpb25fZm9yX2luPU5vIGRlZmluaXRpb24gd2FzIGZvdW5kIGZvciBlbGVtZW50IDx7MH0+IGluIHsxfQotTm9fZGVmaW5pdGlvbl9mb3I9Tm8gZGVmaW5pdGlvbiB3YXMgZm91bmQgZm9yIGVsZW1lbnQgPHswfT4KLU5vX2NvbnRlbnRfbW9kZWxfZm9yPU5vIGNvbnRlbnQgbW9kZWwgZm91bmQgZm9yIHswfS4KLU5vX2NvbnRlbnRfbW9kZWxfZm91bmRfVUlfPU5vIGNvbnRlbnQgbW9kZWwgZm91bmQKLSMjIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcmUgZm9yIHRoZSBYTUwgQ2xlYW51cCBkaWFsb2cKLUNsZWFudXBfVUlfPUNsZWFudXAKLUNvbXByZXNzX2VtcHR5X2VsZW1lbnRfdGFnc19VSV89JkNvbXByZXNzIGVtcHR5IGVsZW1lbnQgdGFncwotSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfPUluc2VydCAmcmVxdWlyZWQgYXR0cmlidXRlcwotSW5zZXJ0X21pc3NpbmdfdGFnc19VSV89Jkluc2VydCBtaXNzaW5nIHRhZ3MKLVF1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfVUlfPSZRdW90ZSBhdHRyaWJ1dGUgdmFsdWVzCi1Gb3JtYXRfc291cmNlX1VJXz0mRm9ybWF0IHNvdXJjZQotQ29udmVydF9FT0xfY29kZXNfVUlfPUNvbnZlcnQgbGluZSAmZGVsaW1pdGVycyB0bwotRU9MX1dpbmRvd3NfVUk9JldpbmRvd3MKLUVPTF9Vbml4X1VJPVUmTklYCi1FT0xfTWFjX1VJPSZNYWMKLSMjIFhNTCBGaWxlcyBwcmVmZXJlbmNlIHBhZ2UKLUNyZWF0aW5nX2ZpbGVzPUNyZWF0aW5nIGZpbGVzCi1FbmNvZGluZ19kZXNjPVRoZSBmb2xsb3dpbmcgZW5jb2Rpbmcgd2lsbCBhcHBseToKLUVuY29kaW5nPUVuJmNvZGluZzoKLUNyZWF0aW5nX29yX3NhdmluZ19maWxlcz1DcmVhdGluZyBvciBzYXZpbmcgZmlsZXMKLUVuZF9vZl9saW5lX2NvZGVfZGVzYz1UaGUgZm9sbG93aW5nIGxpbmUgZGVsaW1pdGVyIHdpbGwgYXBwbHk6Ci1FbmRfb2ZfbGluZV9jb2RlPSZMaW5lIGRlbGltaXRlcjoKLUVPTF9XaW5kb3dzPVdpbmRvd3MKLUVPTF9Vbml4PVVOSVgKLUVPTF9NYWM9TWFjCi1FT0xfTm9UcmFuc2xhdGlvbj1ObyB0cmFuc2xhdGlvbgotVmFsaWRhdGluZ19maWxlcz1WYWxpZGF0aW5nIGZpbGVzCi1JbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZD1JbmRpY2F0ZSB3aGVuIG5vIGdyYW1tYXIgaXMgc3BlY2lmaWVkOgotSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllcz1FcnJvcixXYXJuaW5nLElnbm9yZQotWE1MRmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbD1BZGQgdGhpcyBzdWZmaXggKGlmIG5vdCBzcGVjaWZpZWQpOgotWE1MRmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25FcnJvcj1TdWZmaXggbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB7MH0uCi0jIyBYTUwgU291cmNlIHByZWZlcmVuY2UgcGFnZQotQ29udGVudF9hc3Npc3RfVUlfPUNvbnRlbnQgYXNzaXN0Ci1BdXRvbWF0aWNhbGx5X21ha2Vfc3VnZ2VzdF9VSV89QXV0b21hdGljYWxseSBtYSZrZSBzdWdnZXN0aW9ucwotUHJvbXB0X3doZW5fdGhlc2VfY2hhcmFjdGVfVUlfPVAmcm9tcHQgd2hlbiB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDoKLUZvcm1hdHRpbmdfVUlfPUZvcm1hdHRpbmcKLUxpbmVfd2lkdGhfX1VJXz1MaW5lICZ3aWR0aDoKLVNwbGl0X211bHRpcGxlX2F0dHJpYnV0ZXM9U3BsaXQgJm11bHRpcGxlIGF0dHJpYnV0ZXMgZWFjaCBvbiBhIG5ldyBsaW5lCi1BbGlnbl9maW5hbF9icmFja2V0PSZBbGlnbiBmaW5hbCBicmFja2V0IGluIG11bHRpLWxpbmUgZWxlbWVudCB0YWdzCi1QcmVzZXJ2ZV9QQ0RBVEFfQ29udGVudD0mUHJlc2VydmUgd2hpdGVzcGFjZSBpbiB0YWdzIHdpdGggUENEQVRBIGNvbnRlbnQKLVNwYWNlX2JlZm9yZV9lbXB0eV9jbG9zZV90YWc9SW5zJmVydCB3aGl0ZXNwYWNlIGJlZm9yZSBjbG9zaW5nIGVtcHR5IGVuZC10YWdzCi1JbmRlbnRfdXNpbmdfdGFicz0mSW5kZW50IHVzaW5nIHRhYnMKLUluZGVudF91c2luZ19zcGFjZXM9SSZuZGVudCB1c2luZyBzcGFjZXMKLUluZGVudGF0aW9uX3NpemU9SW4mZGVudGF0aW9uIHNpemU6Ci1JbmRlbnRhdGlvbl9zaXplX3RpcD1JbmRlbnRhdGlvbiBzaXplCi1DbGVhcl9hbGxfYmxhbmtfbGluZXNfVUlfPUNsZWFyIGFsbCAmYmxhbmsgbGluZXMKLUdyYW1tYXJfQ29uc3RyYWludHM9R3JhbW1hciBDb25zdHJhaW50cwotVXNlX2luZmVycmVkX2dyYW1tYXJfaW5fYWJzZW5jZV9vZj0mVXNlIGluZmVycmVkIGdyYW1tYXIgaW4gYWJzZW5jZSBvZiBEVEQvU2NoZW1hCi1TdWdnZXN0aW9uX1N0cmF0ZWd5PSZTdWdnZXN0aW9uIHN0cmF0ZWd5OgotU3VnZ2VzdGlvbl9TdHJhdGVneV9MYXg9TGF4Ci1TdWdnZXN0aW9uX1N0cmF0ZWd5X1N0cmljdD1TdHJpY3QKLSMjIHRhZyBpbmZvCi1FbGVtZW50X19fXzE9RWxlbWVudCA6Ci1Db250ZW50X01vZGVsX19fXzI9Q29udGVudCBNb2RlbCA6Ci1BdHRyaWJ1dGVfX19fMz1BdHRyaWJ1dGUgOgotRGF0YV9UeXBlX19fXzQ9RGF0YSBUeXBlIDoKLUVudW1lcmF0ZWRfVmFsdWVzX19fXzU9RW51bWVyYXRlZCBWYWx1ZXMgOgotIyMgY29waWVkIGZyb20gc3NlLnVpCi1Tb3VyY2VNZW51X2xhYmVsPSZTb3VyY2UKLUNvbW1lbnRfbGFiZWw9Q28mbW1lbnQKLUNvbW1lbnRfdG9vbHRpcD1Db21tZW50Ci1Db21tZW50X2Rlc2NyaXB0aW9uPUNvbW1lbnQKLVVuY29tbWVudF9sYWJlbD0mVW5jb21tZW50Ci1VbmNvbW1lbnRfdG9vbHRpcD1VbmNvbW1lbnQKLVVuY29tbWVudF9kZXNjcmlwdGlvbj1VbmNvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb249Q2xlYW51cCBEb2N1bWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLU9wZW5GaWxlRnJvbVNvdXJjZV9sYWJlbD1PcCZlbiBTZWxlY3Rpb24KLU9wZW5GaWxlRnJvbVNvdXJjZV90b29sdGlwPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi1PcGVuRmlsZUZyb21Tb3VyY2VfZGVzY3JpcHRpb249T3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGxpbmsKLVhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8wPVNob3cgQXR0cmlidXRlcwotWE1MVHlwaW5nX0F1dG9fQ29tcGxldGU9QXV0b21hdGljYWxseSBjbG9zZQotWE1MVHlwaW5nX0F1dG9fUmVtb3ZlPUF1dG9tYXRpY2FsbHkgcmVtb3ZlCi1YTUxUeXBpbmdfQ29tcGxldGVfQ29tbWVudHM9JkNvbW1lbnRzCi1YTUxUeXBpbmdfQ29tcGxldGVfRW5kX1RhZ3M9JkVuZCB0YWdzCi1YTUxUeXBpbmdfUmVtb3ZlX0VuZF9UYWdzPUUmbmQgdGFncyB3aGVuIGNyZWF0aW5nIGVtcHR5IHNlbGYtY2xvc2luZyB0YWdzCi1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw9RW5jbG9zaW5nIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbD1OZXh0IEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1NRVNTQUdFX1hNTF9WQUxJREFUSU9OX01FU1NBR0VfVUlfPVhNTCBWYWxpZGF0b3IgdmFsaWRhdGluZyB7MH0KLVN5bnRheENvbG9yaW5nUGFnZV8wPVN5bnRheCBFbGVtZW50OgotU3ludGF4Q29sb3JpbmdQYWdlXzI9RW5hYmxlCi1TeW50YXhDb2xvcmluZ1BhZ2VfMz0mQm9sZAotU3ludGF4Q29sb3JpbmdQYWdlXzQ9Jkl0YWxpYwotU3ludGF4Q29sb3JpbmdQYWdlXzU9JlN0cmlrZS10aHJvdWdoCi1TeW50YXhDb2xvcmluZ1BhZ2VfNj0mVW5kZXJsaW5lCi1FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wPUV4cGFuZCB0aGUgdHJlZSB0byBlZGl0IHByZWZlcmVuY2VzIGZvciBhIHNwZWNpZmljIGZlYXR1cmUuCi1fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LPVhNTCBlZGl0aW5nIHByZWZlcmVuY2VzLiAgTm90ZSB0aGF0IHNvbWUgcHJlZmVyZW5jZXMgbWF5IGJlIHNldCBvbiB0aGUgPGE+ezB9PC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi1Vc2VfWEluY2x1ZGU9UHJvY2VzcyBYTUwgSW5jbHVzaW9ucwotbmV4dFNpYmxpbmdfbGFiZWw9TmV4dCBTaWJsaW5nCi1uZXh0U2libGluZ19kZXNjcmlwdGlvbj1HbyB0byBOZXh0IFNpYmxpbmcKLXByZXZpb3VzU2libGluZ19sYWJlbD1QcmV2aW91cyBTaWJsaW5nCi1wcmV2aW91c1NpYmxpbmdfZGVzY3JpcHRpb249R28gdG8gUHJldmlvdXMgU2libGluZwotZ290b01hdGNoaW5nVGFnX2xhYmVsPU1hdGNoaW5nIFRhZwotZ290b01hdGNoaW5nVGFnX2Rlc2NyaXB0aW9uPUdvIFRvIE1hdGNoaW5nIFRhZwotT3Blbj1PcGVuICd7MH0nCi1fVUlfQlVUVE9OX1NPUlQ9U29ydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGIyOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEFic3RyYWN0IGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9ycwotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfQ09NTUVOVCA9ICItLT4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0NPTU1FTlQgPSAiPCEtLSI7IC8vJE5PTi1OTFMtMSQKLQotCUlFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBmRWRpdG9yOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0Q3VycmVudFNlbGVjdGlvbigpOwotCQkJCWlmICh0ZXh0U2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJcHJvY2Vzc0FjdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBJVGV4dFNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoKElUZXh0RWRpdG9yKSBmRWRpdG9yKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBUZXh0U2VsZWN0aW9uLmVtcHR5U2VsZWN0aW9uKCk7Ci0JfQotCi0JYWJzdHJhY3Qgdm9pZCBwcm9jZXNzQWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbik7Ci0KLQl2b2lkIHJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0cnkgewotCQkJaW50IGFkanVzdGVkX2xlbmd0aCA9IGxlbmd0aDsKLQotCQkJLy8gcmVtb3ZlIG9wZW4gY29tbWVudHMKLQkJCVN0cmluZyBzdHJpbmcgPSBkb2N1bWVudC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJaW50IGluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKE9QRU5fQ09NTUVOVCk7Ci0JCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCQlkb2N1bWVudC5yZXBsYWNlKG9mZnNldCArIGluZGV4LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKE9QRU5fQ09NTUVOVCwgaW5kZXggLSAxKTsKLQkJCQlhZGp1c3RlZF9sZW5ndGggLT0gT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgY2xvc2UgY29tbWVudHMKLQkJCXN0cmluZyA9IGRvY3VtZW50LmdldChvZmZzZXQsIGFkanVzdGVkX2xlbmd0aCk7Ci0JCQlpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihDTE9TRV9DT01NRU5UKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCWRvY3VtZW50LnJlcGxhY2Uob2Zmc2V0ICsgaW5kZXgsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKENMT1NFX0NPTU1FTlQsIGluZGV4IC0gMSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4ZDU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRGVzY3JpcHRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuQ01JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb25NYW5hZ2VyIHsKLQotCi0JLyoqCi0JICogQWRkTm9kZUFjdGlvbgotCSAqLwotCXB1YmxpYyBjbGFzcyBBZGROb2RlQWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0JCXByb3RlY3RlZCBDTU5vZGUgY21ub2RlOwotCQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlwcm90ZWN0ZWQgaW50IGluZGV4OwotCQlwcm90ZWN0ZWQgaW50IG5vZGVUeXBlOwotCQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0JCXByb3RlY3RlZCBTdHJpbmcgdW5kb0Rlc2NyaXB0aW9uOwotCi0KLQkJcHVibGljIEFkZE5vZGVBY3Rpb24oQ01Ob2RlIGNtbm9kZSwgTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQkJdGhpcy5jbW5vZGUgPSBjbW5vZGU7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQotCQkJU3RyaW5nIHRleHQgPSBnZXRMYWJlbChwYXJlbnQsIGNtbm9kZSk7Ci0JCQlzZXRUZXh0KHRleHQpOwotCQkJZGVzY3JpcHRpb24gPSB0ZXh0OwotCQkJdW5kb0Rlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BREQgKyAiICIgKyB0ZXh0OyAvLyROT04tTkxTLTEkIAotCQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBDTUltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKTsKLQkJCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlkZXNjcmlwdG9yID0gaW1hZ2VEZXNjcmlwdG9yQ2FjaGUuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNtbm9kZSk7Ci0JCQl9Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCX0KLQotCi0JCXB1YmxpYyBBZGROb2RlQWN0aW9uKGludCBub2RlVHlwZSwgTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQkJdGhpcy5ub2RlVHlwZSA9IG5vZGVUeXBlOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0KLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQ09NTUVOVDsKLQkJCQkJdW5kb0Rlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfQ09NTUVOVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCQkJCQl1bmRvRGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJZGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0NEQVRBX1NFQ1RJT047Ci0JCQkJCXVuZG9EZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0NEQVRBX1NFQ1RJT047Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUENEQVRBOwotCQkJCQl1bmRvRGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9QQ0RBVEE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXNldFRleHQoZGVzY3JpcHRpb24pOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihuZXcgSW50ZWdlcihub2RlVHlwZSkpKTsKLQkJfQotCi0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkTm9kZUZvckNNTm9kZSgpIHsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCWluc2VydChwYXJlbnQsIGNtbm9kZSwgaW5kZXgpOwotCQkJfQotCQl9Ci0KLQotCQlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlRm9yTm9kZVR5cGUoKSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCU5vZGUgbmV3Q2hpbGROb2RlID0gbnVsbDsKLQkJCWJvb2xlYW4gZm9ybWF0ID0gdHJ1ZTsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KFhNTFVJTWVzc2FnZXMuX1VJX0NPTU1FTlRfVkFMVUUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFhNTFVJTWVzc2FnZXMuX1VJX1BJX1RBUkdFVF9WQUxVRSwgWE1MVUlNZXNzYWdlcy5fVUlfUElfREFUQV9WQUxVRSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlmb3JtYXQgPSBmYWxzZTsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFyZW50LmdldE5vZGVOYW1lKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdDaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBWZWN0b3IoMSk7Ci0JCQkJbGlzdC5hZGQobmV3Q2hpbGROb2RlKTsKLQkJCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBsaXN0LCBpbmRleCwgZm9ybWF0KTsKLQkJCX0KLQkJfQotCi0KLQkJcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gdW5kb0Rlc2NyaXB0aW9uOwotCQl9Ci0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQliZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0JCQlpZiAoY21ub2RlICE9IG51bGwpIHsKLQkJCQlhZGROb2RlRm9yQ01Ob2RlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGROb2RlRm9yTm9kZVR5cGUoKTsKLQkJCX0KLQkJCWVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERlbGV0ZUFjdGlvbgotCSAqLwotCXB1YmxpYyBjbGFzcyBEZWxldGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotCQlwdWJsaWMgRGVsZXRlQWN0aW9uKExpc3QgbGlzdCkgewotCQkJc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFTU9WRSk7Ci0JCQl0aGlzLmxpc3QgPSBsaXN0OwotCQl9Ci0KLQkJcHVibGljIERlbGV0ZUFjdGlvbihOb2RlIG5vZGUpIHsKLQkJCXNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9SRU1PVkUpOwotCQkJbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCWxpc3QuYWRkKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5ERUxFVEU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQliZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGkubmV4dCgpOwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgbm9kZTsKLQkJCQkJYXR0ci5nZXRPd25lckVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQlOb2RlIHByZXZpb3VzU2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQlpZiAoKHByZXZpb3VzU2libGluZyAhPSBudWxsKSAmJiBpc1doaXRlc3BhY2VUZXh0Tm9kZShwcmV2aW91c1NpYmxpbmcpKSB7Ci0JCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKHByZXZpb3VzU2libGluZyk7Ci0JCQkJCQl9Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci0KLQotCWNsYXNzIEltYWdlRGVzY3JpcHRvckNhY2hlIHsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBhdHRyaWJ1dGVJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgYXR0cmlidXRlUmVxSW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRfUkVRX09CSik7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgY2RhdGFTZWN0aW9uSW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DREFUQVNFQ1RJT04pOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGNvbW1lbnRJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NPTU1FTlQpOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGVsZW1lbnRJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIHBpSW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04pOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIHRleHRJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RYVEVYVCk7Ci0KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG9iamVjdDsKLQkJCQlzd2l0Y2ggKGNtbm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCWNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6IHsKLQkJCQkJCXJlc3VsdCA9IENNSW1hZ2VVdGlsLmdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpOwotCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKCgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21ub2RlKS5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJCQkJcmVzdWx0ID0gYXR0cmlidXRlUmVxSW1hZ2U7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlyZXN1bHQgPSBhdHRyaWJ1dGVJbWFnZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENNTm9kZS5EQVRBX1RZUEUgOiB7Ci0JCQkJCQlyZXN1bHQgPSB0ZXh0SW1hZ2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDogewotCQkJCQkJcmVzdWx0ID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNtbm9kZSk7Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCQlyZXN1bHQgPSBlbGVtZW50SW1hZ2U7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENNTm9kZS5HUk9VUCA6IHsKLQkJCQkJCXJlc3VsdCA9IGVsZW1lbnRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCUludGVnZXIgaW50ZWdlciA9IChJbnRlZ2VyKSBvYmplY3Q7Ci0JCQkJc3dpdGNoIChpbnRlZ2VyLmludFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IGNvbW1lbnRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCQlyZXN1bHQgPSBwaUltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IGNkYXRhU2VjdGlvbkltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IHRleHRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCS8vIFRPRE8uLi4gcmVtb3ZlIHRoaXMgY2xhc3MuIEknbSBwcmV0dHkgc3VyZSBpdCBpcyBubyBsb25nZXIgdXNlZCBieQotCS8vIGFueW9uZS4KLQkvKioKLQkgKiBAZGVwcmFjYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBJbnNlcnRBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJcHJvdGVjdGVkIGludCBpbmRleDsKLQkJcHJvdGVjdGVkIGludCBub2RlVHlwZTsKLQkJcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCi0JCXB1YmxpYyBJbnNlcnRBY3Rpb24oaW50IG5vZGVUeXBlLCBOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCQl0aGlzLm5vZGVUeXBlID0gbm9kZVR5cGU7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQ09NTUVOVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJZGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0NEQVRBX1NFQ1RJT047Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUENEQVRBOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlzZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXRJbWFnZURlc2NyaXB0b3IobmV3IEludGVnZXIobm9kZVR5cGUpKSk7Ci0JCX0KLQotCQlwdWJsaWMgSW5zZXJ0QWN0aW9uKGludCBub2RlVHlwZSwgTm9kZSBwYXJlbnQsIGludCBpbmRleCwgU3RyaW5nIHRpdGxlKSB7Ci0JCQl0aGlzLm5vZGVUeXBlID0gbm9kZVR5cGU7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCWRlc2NyaXB0aW9uID0gdGl0bGU7Ci0JCQlzZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXRJbWFnZURlc2NyaXB0b3IobmV3IEludGVnZXIobm9kZVR5cGUpKSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERCArICIgIiArIGRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkIAotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCi0JCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCU5vZGUgbmV3Q2hpbGROb2RlID0gbnVsbDsKLQkJCWJvb2xlYW4gZm9ybWF0ID0gdHJ1ZTsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KFhNTFVJTWVzc2FnZXMuX1VJX0NPTU1FTlRfVkFMVUUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFhNTFVJTWVzc2FnZXMuX1VJX1BJX1RBUkdFVF9WQUxVRSwgWE1MVUlNZXNzYWdlcy5fVUlfUElfREFUQV9WQUxVRSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlmb3JtYXQgPSBmYWxzZTsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFyZW50LmdldE5vZGVOYW1lKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdDaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBWZWN0b3IoMSk7Ci0JCQkJbGlzdC5hZGQobmV3Q2hpbGROb2RlKTsKLQkJCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBsaXN0LCBpbmRleCwgZm9ybWF0KTsKLQkJCX0KLQotCQkJZW5kTm9kZUFjdGlvbih0aGlzKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogUmVwbGFjZU5vZGVBY3Rpb24KLQkgKi8KLQlwdWJsaWMgY2xhc3MgUmVwbGFjZU5vZGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIENNTm9kZSBjbW5vZGU7Ci0JCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCXByb3RlY3RlZCBpbnQgZW5kSW5kZXg7Ci0JCXByb3RlY3RlZCBOb2RlIHBhcmVudDsKLQkJcHJvdGVjdGVkIGludCBzdGFydEluZGV4OwotCi0KLQkJcHVibGljIFJlcGxhY2VOb2RlQWN0aW9uKE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMuY21ub2RlID0gY21ub2RlOwotCQkJdGhpcy5zdGFydEluZGV4ID0gc3RhcnRJbmRleDsKLQkJCXRoaXMuZW5kSW5kZXggPSBlbmRJbmRleDsKLQotCQkJc2V0VGV4dChnZXRMYWJlbChwYXJlbnQsIGNtbm9kZSkpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQkJU3RyaW5nIHJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1VORE9fUkVQTEFDRV9ERVNDUklQVElPTjsKLQkJCXJlc3VsdCArPSAiICIgKyBnZXRMYWJlbChwYXJlbnQsIGNtbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQliZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0KLQkJCWlmICgocGFyZW50ICE9IG51bGwpICYmIChjbW5vZGUgIT0gbnVsbCkpIHsKLQkJCQlyZW1vdmUocGFyZW50LCBzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0JCQkJaW5zZXJ0KHBhcmVudCwgY21ub2RlLCBzdGFydEluZGV4KTsKLQkJCX0KLQkJCWVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yQ2FjaGUgaW1hZ2VEZXNjcmlwdG9yQ2FjaGUgPSBuZXcgSW1hZ2VEZXNjcmlwdG9yQ2FjaGUoKTsKLQlwcm90ZWN0ZWQgVmlld2VyIGZWaWV3ZXI7Ci0KLQlwdWJsaWMgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnksIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobW9kZWwsIG1vZGVsUXVlcnkpOwotCQl0aGlzLmZWaWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBiZWdpbk5vZGVBY3Rpb24oTm9kZUFjdGlvbiBhY3Rpb24pIHsKLQkJZk1vZGVsLmJlZ2luUmVjb3JkaW5nKGFjdGlvbiwgYWN0aW9uLmdldFVuZG9EZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQXR0cmlidXRlQWN0aW9uKEVsZW1lbnQgcGFyZW50LCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBudWxsOwotCQlpZiAoYWQgPT0gbnVsbCkgewotCQkJYWN0aW9uID0gbmV3IEVkaXRBdHRyaWJ1dGVBY3Rpb24odGhpcywgcGFyZW50LCBudWxsLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19BVFRSSUJVVEUsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfTkVXX0FUVFJJQlVURV9USVRMRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhY3Rpb24gPSBuZXcgQWRkTm9kZUFjdGlvbihhZCwgcGFyZW50LCAtMSk7Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQ0RhdGFTZWN0aW9uQWN0aW9uKE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBBZGROb2RlQWN0aW9uKE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFLCBwYXJlbnQsIGluZGV4KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQ29tbWVudEFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQWRkTm9kZUFjdGlvbihOb2RlLkNPTU1FTlRfTk9ERSwgcGFyZW50LCBpbmRleCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZERvY3R5cGVBY3Rpb24oRG9jdW1lbnQgZG9jdW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEVkaXREb2N0eXBlQWN0aW9uKGZNb2RlbCwgZG9jdW1lbnQsIGZNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkRWxlbWVudEFjdGlvbihOb2RlIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCkgewotCQlBY3Rpb24gYWN0aW9uID0gbnVsbDsKLQkJaWYgKGVkID09IG51bGwpIHsKLQkJCWFjdGlvbiA9IG5ldyBFZGl0RWxlbWVudEFjdGlvbih0aGlzLCBwYXJlbnQsIGluZGV4LCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19FTEVNRU5ULCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19FTEVNRU5UX1RJVExFKTsKLQkJfQotCQllbHNlIHsKLQkJCWFjdGlvbiA9IG5ldyBBZGROb2RlQWN0aW9uKGVkLCBwYXJlbnQsIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRQQ0RhdGFBY3Rpb24oTm9kZSBwYXJlbnQsIENNRGF0YVR5cGUgZGF0YVR5cGUsIGludCBpbmRleCkgewotCQlBY3Rpb24gYWN0aW9uID0gbnVsbDsKLQkJaWYgKGRhdGFUeXBlID09IG51bGwpIHsKLQkJCWFjdGlvbiA9IG5ldyBBZGROb2RlQWN0aW9uKE5vZGUuVEVYVF9OT0RFLCBwYXJlbnQsIGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCWFjdGlvbiA9IG5ldyBBZGROb2RlQWN0aW9uKGRhdGFUeXBlLCBwYXJlbnQsIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQlOb2RlIHJlZkNoaWxkID0gZ2V0UmVmQ2hpbGROb2RlQXRJbmRleChwYXJlbnQsIGluZGV4KTsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKHRoaXMsIHBhcmVudCwgcmVmQ2hpbGQsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04sIFhNTFVJTWVzc2FnZXMuQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04pOwotCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihuZXcgSW50ZWdlcihOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkpKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkU2NoZW1hSW5mb0FjdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBFZGl0U2NoZW1hSW5mb0FjdGlvbih0aGlzLCBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgZk1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9TQ0hFTUFfSU5GT1JNQVRJT04pOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oTGlzdCBzZWxlY3Rpb24pIHsKLQkJRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oc2VsZWN0aW9uKTsKLQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoc2VsZWN0aW9uLnNpemUoKSA+IDApOwotCQlyZXR1cm4gZGVsZXRlQWN0aW9uOwotCX0KLQotCi0JcHVibGljIERPTUNvbnRlbnRCdWlsZGVyIGNyZWF0ZURPTUNvbnRlbnRCdWlsZGVyKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURPTUNvbnRlbnRCdWlsZGVySW1wbCBidWlsZGVyID0gbmV3IERPTUNvbnRlbnRCdWlsZGVySW1wbChkb2N1bWVudCk7Ci0JCXJldHVybiBidWlsZGVyOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0QXR0cmlidXRlQWN0aW9uKEF0dHIgYXR0ciwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkgewotCQlyZXR1cm4gbmV3IEVkaXRBdHRyaWJ1dGVBY3Rpb24odGhpcywgYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgYXR0ciwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX0FUVFJJQlVURSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX0FUVFJJQlVURV9USVRMRSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXREb2N0eXBlQWN0aW9uKERvY3VtZW50VHlwZSBkb2N0eXBlKSB7Ci0JCXJldHVybiBuZXcgRWRpdERvY3R5cGVBY3Rpb24oZk1vZGVsLCBkb2N0eXBlLCBmTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCksIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9ET0NUWVBFKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpIHsKLQkJcmV0dXJuIG5ldyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKHRoaXMsIHBpLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT05fVElUTEUpOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0U2NoZW1hSW5mb0FjdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBFZGl0U2NoZW1hSW5mb0FjdGlvbih0aGlzLCBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgZk1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfTkFNRVNQQUNFUyk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZVJlbmFtZUFjdGlvbihOb2RlIG5vZGUpIHsKLQkJQWN0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmVzdWx0ID0gbmV3IEVkaXRFbGVtZW50QWN0aW9uKHRoaXMsIChFbGVtZW50KSBub2RlLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFTkFNRSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9SRU5BTUVfVElUTEUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZVJlcGxhY2VBY3Rpb24oTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBSZXBsYWNlTm9kZUFjdGlvbihwYXJlbnQsIGNtbm9kZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZE5vZGVBY3Rpb24oTm9kZUFjdGlvbiBhY3Rpb24pIHsKLQkJZk1vZGVsLmVuZFJlY29yZGluZyhhY3Rpb24pOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0cnkgewotCQkJTGlzdCBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gZXMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoaS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJY29udHJpYnV0ZUFjdGlvbnMobWVudU1hbmFnZXIsIHNlbGVjdGlvbkxpc3QpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICI/IiArIGNtbm9kZSArICI/IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChjbW5vZGUgIT0gbnVsbCkgewotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTgwMAotCQkJcmVzdWx0ID0gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlpZihyZXN1bHQgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IChTdHJpbmcpIGNtbm9kZS5nZXRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUCkgewotCQkJCQlDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQkJCQkJcmVzdWx0ID0gZGVzY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24oY21ub2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbW5vZGUsIHBhcmVudCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQotCXB1YmxpYyBTaGVsbCBnZXRXb3JrYmVuY2hXaW5kb3dTaGVsbCgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluc2VydChOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSwgaW50IGluZGV4KSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlET01Db250ZW50QnVpbGRlciBidWlsZGVyID0gY3JlYXRlRE9NQ29udGVudEJ1aWxkZXIoZG9jdW1lbnQpOwotCQlidWlsZGVyLnNldEJ1aWxkUG9saWN5KERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCk7Ci0JCWJ1aWxkZXIuYnVpbGQocGFyZW50LCBjbW5vZGUpOwotCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBidWlsZGVyLmdldFJlc3VsdCgpLCBpbmRleCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2Rlc0F0SW5kZXgoTm9kZSBwYXJlbnQsIExpc3QgbGlzdCwgaW50IGluZGV4KSB7Ci0JCWluc2VydE5vZGVzQXRJbmRleChwYXJlbnQsIGxpc3QsIGluZGV4LCB0cnVlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluc2VydE5vZGVzQXRJbmRleChOb2RlIHBhcmVudCwgTGlzdCBsaXN0LCBpbnQgaW5kZXgsIGJvb2xlYW4gZm9ybWF0KSB7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlpbmRleCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQl9Ci0JCU5vZGUgcmVmQ2hpbGQgPSAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkgPyBub2RlTGlzdC5pdGVtKGluZGV4KSA6IG51bGw7Ci0KLQkJLy8gaGVyZSB3ZSBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB0aGUgcHJldmlvdXMgbm9kZSBpcyBhICd3aGl0ZQotCQkvLyBzcGFjZScgVGV4dCBub2RlCi0JCS8vIHdlIHNob3VsZCByZWFsbHkgZG8gdGhlIGluc2VydCBiZWZvcmUgdGhpcyBub2RlCi0JCS8vCi0JCWludCBwcmV2SW5kZXggPSBpbmRleCAtIDE7Ci0JCU5vZGUgcHJldkNoaWxkID0gKHByZXZJbmRleCA8IG5vZGVMaXN0LmdldExlbmd0aCgpKSA/IG5vZGVMaXN0Lml0ZW0ocHJldkluZGV4KSA6IG51bGw7Ci0JCWlmIChpc1doaXRlc3BhY2VUZXh0Tm9kZShwcmV2Q2hpbGQpKSB7Ci0JCQlyZWZDaGlsZCA9IHByZXZDaGlsZDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5ld05vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0KLQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJcGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKChBdHRyKSBuZXdOb2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmQ2hpbGQpOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBmb3JtYXREZWVwID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5ld05vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJZm9ybWF0RGVlcCA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChmb3JtYXQpIHsKLQkJCQlyZWZvcm1hdChuZXdOb2RlLCBmb3JtYXREZWVwKTsKLQkJCX0KLQkJfQotCi0JCXNldFZpZXdlclNlbGVjdGlvbihsaXN0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGFic3RyYWN0IHNpbmNlIGN1cnJlbnRseSwgdGhlIHNlZCBlZGl0b3IgaXMgcmVxdWlyZWQgdG8KLQkgKiBwZXJmb3JtIGZvcm1hdGluZyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoZSBzZWQKLQkgKiBlZGl0b3IuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVmb3JtYXQoTm9kZSBwYXJlbnQsIGJvb2xlYW4gZGVlcCk7Ci0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShOb2RlIHBhcmVudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSBlbmRJbmRleDsgaSA+PSBzdGFydEluZGV4OyBpLS0pIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTZWxlY3Rpb24oTGlzdCBsaXN0KSB7Ci0JCWlmIChmVmlld2VyICE9IG51bGwpIHsKLQkJCWZWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpLCB0cnVlKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uKE5vZGUgbm9kZSkgewotCQlpZiAoZlZpZXdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihub2RlKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uQ29udHJpYnV0b3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmODI4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBYTUxFZGl0b3JBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvclhNTCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSIsICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZTIiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT19UT19NQVRDSElOR19UQUdfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5nb3RvTWF0Y2hpbmdUYWciOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ2xlYW51cERvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDb21tZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDb250ZW50QXNzaXN0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGaW5kT2NjdXJyZW5jZXMgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGb3JtYXREb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmT3BlbkZpbGVBY3Rpb24gPSBudWxsOyAvLyBvcGVuIGZpbGUKLQotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlVuY29tbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBHb1RvTWF0Y2hpbmdUYWdBY3Rpb24gZkdvVG9NYXRjaGluZ1RhZ0FjdGlvbjsKLQotCXB1YmxpYyBBY3Rpb25Db250cmlidXRvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQotCQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFhNTFVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQotCQlmQ29udGVudEFzc2lzdCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmQ29udGVudEFzc2lzdC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX1BST1BPU0FMUyk7Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCWZDbGVhbnVwRG9jdW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkNsZWFudXBEb2N1bWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5DTEVBTlVQX0RPQ1VNRU5UKTsKLQotCQlmRm9ybWF0RG9jdW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkZvcm1hdERvY3VtZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZPUk1BVF9ET0NVTUVOVCk7Ci0KLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKTsKLQotCQkvLyBuYXZpZ2F0ZSBjb21tYW5kcwotCQlmT3BlbkZpbGVBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZk9wZW5GaWxlQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLk9QRU5fRklMRSk7Ci0KLQkJZkZpbmRPY2N1cnJlbmNlcyA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmRmluZE9jY3VycmVuY2VzLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZJTkRfT0NDVVJSRU5DRVMpOwotCi0JCWZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24gPSBuZXcgR29Ub01hdGNoaW5nVGFnQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiZ290b01hdGNoaW5nVGFnXyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEdPX1RPX01BVENISU5HX1RBR19JRCk7Ci0JCWZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24uc2V0SWQoR09fVE9fTUFUQ0hJTkdfVEFHX0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gbmF2aWdhdGUgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudSA9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKLQkJaWYgKG5hdmlnYXRlTWVudSAhPSBudWxsKSB7Ci0JCQluYXZpZ2F0ZU1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk9QRU5fRVhULCBmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJbmF2aWdhdGVNZW51LmFwcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5PUEVOX0VYVCwgZk9wZW5GaWxlQWN0aW9uKTsKLQotCQkJSU1lbnVNYW5hZ2VyIGdvdG9Hcm91cCA9IG5hdmlnYXRlTWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdPX1RPKTsKLQkJCWlmIChnb3RvR3JvdXAgIT0gbnVsbCkgewotCQkJCWdvdG9Hcm91cC5hcHBlbmRUb0dyb3VwKCJtYXRjaGluZ0JlZ2luIiwgZkdvVG9NYXRjaGluZ1RhZ0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotLyoKLQkJLy8gZWRpdCBjb21tYW5kcwotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbnRlbnRBc3Npc3QpOwotCQkJZWRpdE1lbnUuYWRkKGZNZW51QWRkaXRpb25zR3JvdXBNYXJrZXIpOwotCQl9Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCVN0cmluZyBzb3VyY2VNZW51TGFiZWwgPSBYTUxVSU1lc3NhZ2VzLlNvdXJjZU1lbnVfbGFiZWw7Ci0JCVN0cmluZyBzb3VyY2VNZW51SWQgPSAic291cmNlTWVudUlkIjsgLy8kTk9OLU5MUy0xJAotCQlJTWVudU1hbmFnZXIgc291cmNlTWVudSA9IG5ldyBNZW51TWFuYWdlcihzb3VyY2VNZW51TGFiZWwsIHNvdXJjZU1lbnVJZCk7Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQsIHNvdXJjZU1lbnUpOwotCQlpZiAoc291cmNlTWVudSAhPSBudWxsKSB7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJc291cmNlTWVudS5hZGQoZlRvZ2dsZUNvbW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZkFkZEJsb2NrQ29tbWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmUmVtb3ZlQmxvY2tDb21tZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdFJpZ2h0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdExlZnQpOwotCQkJc291cmNlTWVudS5hZGQoZkNsZWFudXBEb2N1bWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmRm9ybWF0RG9jdW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZkZvcm1hdEFjdGl2ZUVsZW1lbnRzKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmRmluZE9jY3VycmVuY2VzKTsKLQkJfQotCi0JCS8vIG5hdmlnYXRlIGNvbW1hbmRzCi0JCUlNZW51TWFuYWdlciBuYXZpZ2F0ZU1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9OQVZJR0FURSk7Ci0JCWlmIChuYXZpZ2F0ZU1lbnUgIT0gbnVsbCkgewotCQkJbmF2aWdhdGVNZW51LmFwcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5PUEVOX0VYVCwgZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCW5hdmlnYXRlTWVudS5hcHBlbmRUb0dyb3VwKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQsIGZPcGVuRmlsZUFjdGlvbik7Ci0KLQkJCUlNZW51TWFuYWdlciBnb3RvR3JvdXAgPSBuYXZpZ2F0ZU1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5HT19UTyk7Ci0JCQlpZiAoZ290b0dyb3VwICE9IG51bGwpIHsKLQkJCQlnb3RvR3JvdXAuYWRkKGZHb3RvTWF0Y2hpbmdCcmFja2V0QWN0aW9uKTsKLQkJCQlnb3RvR3JvdXAuYWRkKGZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24pOwotCQkJCWdvdG9Hcm91cC5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCX0KLQkJfQotKi8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51dGlsLkFjdGlvbkNvbnRyaWJ1dG9yI2dldEV4dGVuc2lvbklEcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKGdldEFjdGl2ZUVkaXRvclBhcnQoKSA9PSBhY3RpdmVFZGl0b3IpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOwotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0JCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UobnVsbCk7Ci0JCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJfQotCQl9Ci0KLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldFRleHRFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotCQlmQ29udGVudEFzc2lzdC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTKSk7Ci0KLQkJZkNsZWFudXBEb2N1bWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NMRUFOVVBfRE9DVU1FTlQpKTsKLQkJZkZvcm1hdERvY3VtZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5UKSk7Ci0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMpKTsKLQkJZkNsZWFudXBEb2N1bWVudC5zZXRFbmFibGVkKCh0ZXh0RWRpdG9yICE9IG51bGwpICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQkJZkZvcm1hdERvY3VtZW50LnNldEVuYWJsZWQoKHRleHRFZGl0b3IgIT0gbnVsbCkgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0RW5hYmxlZCgodGV4dEVkaXRvciAhPSBudWxsKSAmJiB0ZXh0RWRpdG9yLmlzRWRpdGFibGUoKSk7Ci0KLQkJZk9wZW5GaWxlQWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFKSk7Ci0KLQkJZkZpbmRPY2N1cnJlbmNlcy5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZJTkRfT0NDVVJSRU5DRVMpKTsKLQotCQlmR29Ub01hdGNoaW5nVGFnQWN0aW9uLnNldEVkaXRvcih0ZXh0RWRpdG9yKTsKLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJdGV4dEVkaXRvci5zZXRBY3Rpb24oR09fVE9fTUFUQ0hJTkdfVEFHX0lELCBmR29Ub01hdGNoaW5nVGFnQWN0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZkNvbnRlbnRBc3Npc3Quc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gY2xlYW51cCBhbmQgZm9ybWF0IGRvY3VtZW50IGFjdGlvbnMgZG8gbm90IHJlbHkgb24gc291cmNlIHZpZXdlcgotCQkvLyBiZWluZyBlbmFibGVkCi0JCS8vIGZDbGVhbnVwRG9jdW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gZkZvcm1hdERvY3VtZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZPcGVuRmlsZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmRmluZE9jY3VycmVuY2VzLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZkdvVG9NYXRjaGluZ1RhZ0FjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmR290b01hdGNoaW5nQnJhY2tldEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM4Mzc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBBZGQgYmxvY2sgY29tbWVudCBhY3Rpb24gZGVsZWdhdGUgZm9yIFhNTCBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIEFkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQWRkQmxvY2tDb21tZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCi0JCQkJaWYgKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwpICYmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID4gMCkpIHsKLQkJCQkJc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCQl9Ci0JCQkJaWYgKHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0KLQotCQkJCWlmICgodGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA9PSAwKSAmJiAoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIDAsIE9QRU5fQ09NTUVOVCk7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCAwLCBDTE9TRV9DT01NRU5UKTsKLQkJCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQmFzZU5vZGVBY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyOWEyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb2RlQWN0aW9uTWFuYWdlciB7Ci0KLQotCS8qKgotCSAqIE15TWVudU1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE15TWVudU1hbmFnZXIgZXh0ZW5kcyBNZW51TWFuYWdlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQkJcHVibGljIE15TWVudU1hbmFnZXIoU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQkJdGl0bGUgPSBzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJcmV0dXJuICFpc0VtcHR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRpdGxlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZShOb2RlIG5vZGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyAoRG9jdW1lbnQpIG5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJcmV0dXJuIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVudUJ1aWxkZXIgbWVudUJ1aWxkZXIgPSBuZXcgTWVudUJ1aWxkZXIoKTsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWw7Ci0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLQotCXByb3RlY3RlZCBCYXNlTm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KSB7Ci0JCXRoaXMuZk1vZGVsID0gbW9kZWw7Ci0JCXRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25IZWxwZXIoSU1lbnVNYW5hZ2VyIG1lbnUsIExpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QpIHsKLQkJTGlzdCBhY3Rpb25MaXN0ID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtb2RlbFF1ZXJ5QWN0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pIGkubmV4dCgpOwotCQkJaWYgKGFjdGlvbi5nZXRDTU5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaW50IGNtTm9kZVR5cGUgPSBhY3Rpb24uZ2V0Q01Ob2RlKCkuZ2V0Tm9kZVR5cGUoKTsKLQkJCQlpZiAoYWN0aW9uLmdldEtpbmQoKSA9PSBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCkgewotCQkJCQlzd2l0Y2ggKGNtTm9kZVR5cGUpIHsKLQkJCQkJCWNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6IHsKLQkJCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVBZGRBdHRyaWJ1dGVBY3Rpb24oKEVsZW1lbnQpIGFjdGlvbi5nZXRQYXJlbnQoKSwgKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGFjdGlvbi5nZXRDTU5vZGUoKSkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6IHsKLQkJCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVBZGRFbGVtZW50QWN0aW9uKGFjdGlvbi5nZXRQYXJlbnQoKSwgKENNRWxlbWVudERlY2xhcmF0aW9uKSBhY3Rpb24uZ2V0Q01Ob2RlKCksIGFjdGlvbi5nZXRTdGFydEluZGV4KCkpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChhY3Rpb24uZ2V0S2luZCgpID09IE1vZGVsUXVlcnlBY3Rpb24uUkVQTEFDRSkgewotCQkJCQlpZiAoKGFjdGlvbi5nZXRQYXJlbnQoKSAhPSBudWxsKSAmJiAoYWN0aW9uLmdldENNTm9kZSgpICE9IG51bGwpKSB7Ci0JCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVSZXBsYWNlQWN0aW9uKGFjdGlvbi5nZXRQYXJlbnQoKSwgYWN0aW9uLmdldENNTm9kZSgpLCBhY3Rpb24uZ2V0U3RhcnRJbmRleCgpLCBhY3Rpb24uZ2V0RW5kSW5kZXgoKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1lbnVCdWlsZGVyLnBvcHVsYXRlTWVudShtZW51LCBhY3Rpb25MaXN0LCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUFjdGlvbihJTWVudU1hbmFnZXIgbWVudSwgQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCW1lbnUuYWRkKGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IHNlbGVjdGlvbikgewotCQlpbnQgZWRpdE1vZGUgPSBtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCk7Ci0JCWludCBpYyA9IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLQkJaW50IHZjID0gKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgPyBNb2RlbFF1ZXJ5LlZBTElESVRZX1NUUklDVCA6IE1vZGVsUXVlcnkuVkFMSURJVFlfTk9ORTsKLQotCQlMaXN0IGltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gbnVsbDsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCWltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gZ2V0U2VsZWN0ZWROb2RlcyhzZWxlY3Rpb24sIHRydWUpOwotCi0JCQkvLyBjb250cmlidXRlIGRlbGV0ZSBhY3Rpb25zCi0JCQljb250cmlidXRlRGVsZXRlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBzZWxlY3Rpb24uZ2V0KDApOwotCi0JCQkvLyBjb250cmlidXRlIGVkaXQgYWN0aW9ucwotCQkJY29udHJpYnV0ZUVkaXRBY3Rpb25zKG1lbnUsIG5vZGUpOwotCi0JCQkvLyBjb250cmlidXRlIGFkZCBjaGlsZCBhY3Rpb25zCi0JCQljb250cmlidXRlQWRkQ2hpbGRBY3Rpb25zKG1lbnUsIG5vZGUsIGljLCB2Yyk7Ci0KLQkJCS8vIGNvbnRyaWJ1dGUgYWRkIGJlZm9yZSBhY3Rpb25zCi0JCQljb250cmlidXRlQWRkU2libGluZ0FjdGlvbnMobWVudSwgbm9kZSwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJLy8gY29udHJpYnV0ZSByZXBsYWNlIGFjdGlvbnMKLQkJCWNvbnRyaWJ1dGVSZXBsYWNlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDApIHsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIGZNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCWNvbnRyaWJ1dGVBZGREb2N1bWVudENoaWxkQWN0aW9ucyhtZW51LCBkb2N1bWVudCwgaWMsIHZjKTsKLQkJCWNvbnRyaWJ1dGVFZGl0R3JhbW1hckluZm9ybWF0aW9uQWN0aW9ucyhtZW51LCBkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGRDaGlsZEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIE5vZGUgbm9kZSwgaW50IGljLCBpbnQgdmMpIHsKLQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCi0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJLy8gJ0FkZCBDaGlsZC4uLicgYW5kICdBZGQgQXR0cmlidXRlLi4uJyBhY3Rpb25zCi0JCQkvLwotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0KLQkJCUlNZW51TWFuYWdlciBhZGRBdHRyaWJ1dGVNZW51ID0gbmV3IE15TWVudU1hbmFnZXIoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfQVRUUklCVVRFKTsKLQkJCUlNZW51TWFuYWdlciBhZGRDaGlsZE1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9DSElMRCk7Ci0JCQltZW51LmFkZChhZGRBdHRyaWJ1dGVNZW51KTsKLQkJCW1lbnUuYWRkKGFkZENoaWxkTWVudSk7Ci0KLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRkIGluc2VydCBhdHRyaWJ1dGUgYWN0aW9ucwotCQkJCS8vCi0JCQkJTGlzdCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZWxlbWVudCwgZWQsIC0xLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQlhZGRBY3Rpb25IZWxwZXIoYWRkQXR0cmlidXRlTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCi0JCQkJLy8gYWRkIGluc2VydCBjaGlsZCBub2RlIGFjdGlvbnMKLQkJCQkvLwotCQkJCW1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhlbGVtZW50LCBlZCwgLTEsIGljLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRDaGlsZE1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCX0KLQotCQkJLy8gYWRkIFBJIGFuZCBDT01NRU5UCi0JCQljb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhhZGRDaGlsZE1lbnUsIGVsZW1lbnQsIGVkLCAtMSk7Ci0KLQkJCS8vIGFkZCBQQ0RBVEEsIENEQVRBX1NFQ1RJT04KLQkJCWNvbnRyaWJ1dGVUZXh0Tm9kZUFjdGlvbnMoYWRkQ2hpbGRNZW51LCBlbGVtZW50LCBlZCwgLTEpOwotCi0JCQkvLyBhZGQgTkVXIEVMRU1FTlQKLQkJCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihhZGRDaGlsZE1lbnUsIGVsZW1lbnQsIGVkLCAtMSk7Ci0KLQkJCS8vIGFkZCBBVFRSSUJVVEUKLQkJCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQXR0cmlidXRlQWN0aW9ucyhhZGRBdHRyaWJ1dGVNZW51LCBlbGVtZW50LCBlZCk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGREb2N1bWVudENoaWxkQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRG9jdW1lbnQgZG9jdW1lbnQsIGludCBpYywgaW50IHZjKSB7Ci0JCUlNZW51TWFuYWdlciBhZGRDaGlsZE1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9DSElMRCk7Ci0JCW1lbnUuYWRkKGFkZENoaWxkTWVudSk7Ci0KLQkJLy8gYWRkIFBJIGFuZCBDT01NRU5UCi0JCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZENoaWxkTWVudSwgZG9jdW1lbnQsIC0xKTsKLQotCQkvLyBhZGQgTkVXIEVMRU1FTlQKLQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZENoaWxkTWVudSwgZG9jdW1lbnQsIC0xKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGRTaWJsaW5nQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTm9kZSBub2RlLCBpbnQgaWMsIGludCB2YykgewotCQlJTWVudU1hbmFnZXIgYWRkQmVmb3JlTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0JFRk9SRSk7Ci0JCUlNZW51TWFuYWdlciBhZGRBZnRlck1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9BRlRFUik7Ci0JCW1lbnUuYWRkKGFkZEJlZm9yZU1lbnUpOwotCQltZW51LmFkZChhZGRBZnRlck1lbnUpOwotCi0JCU5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBnZXRJbmRleChwYXJlbnROb2RlLCBub2RlKTsKLQkJCWlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFRCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0JCQkJaWYgKHBhcmVudEVEICE9IG51bGwpIHsKLQkJCQkJLy8gJ0FkZCBCZWZvcmUuLi4nIGFuZCAnQWRkIEFmdGVyLi4uJyBhY3Rpb25zCi0JCQkJCS8vCi0JCQkJCUxpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXgsIGljLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCQlhZGRBY3Rpb25IZWxwZXIoYWRkQmVmb3JlTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCi0JCQkJCW1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMocGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4ICsgMSwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRBZnRlck1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQl9Ci0KLQkJCQkvLyBhZGQgQ09NTUVOVCBhbmQgUEkgYmVmb3JlIGFuZCBhZnRlcgotCQkJCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZEJlZm9yZU1lbnUsIHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCk7Ci0JCQkJY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoYWRkQWZ0ZXJNZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXggKyAxKTsKLQotCQkJCS8vIGFkZCBQQ0RBVEEsIENEQVRBX1NFQ1RJT04gYmVmb3JlIGFuZCBhZnRlcgotCQkJCWNvbnRyaWJ1dGVUZXh0Tm9kZUFjdGlvbnMoYWRkQmVmb3JlTWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4KTsKLQkJCQljb250cmlidXRlVGV4dE5vZGVBY3Rpb25zKGFkZEFmdGVyTWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4ICsgMSk7Ci0KLQkJCQkvLyBhZGQgTkVXIEVMRU1FTlQgYmVmb3JlIGFuZCBhZnRlcgotCQkJCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihhZGRCZWZvcmVNZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXgpOwotCQkJCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihhZGRBZnRlck1lbnUsIHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCArIDEpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KSBwYXJlbnROb2RlOwotCQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQocGFyZW50Tm9kZSk7Ci0JCQkJaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkvLyBhZGQgcG9zc2libGUgcm9vdCBlbGVtZW50IGluc2VydGlvbnMKLQkJCQkJLy8gICAgICAgIAotCQkJCQlMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZG9jdW1lbnQsIGNtRG9jdW1lbnQsIGluZGV4LCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQkJYWRkQWN0aW9uSGVscGVyKGFkZEFmdGVyTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCi0JCQkJCW1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZG9jdW1lbnQsIGNtRG9jdW1lbnQsIGluZGV4ICsgMSwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRBZnRlck1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQl9Ci0KLQkJCQkvLyBhZGQgQ09NTUVOVCBhbmQgUEkgYmVmb3JlIGFuZCBhZnRlcgotCQkJCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZEJlZm9yZU1lbnUsIGRvY3VtZW50LCBpbmRleCk7Ci0JCQkJY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoYWRkQWZ0ZXJNZW51LCBkb2N1bWVudCwgaW5kZXggKyAxKTsKLQotCQkJCS8vIGFkZCBFTEVNRU5UIGJlZm9yZSBhbmQgYWZ0ZXIKLQkJCQljb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oYWRkQmVmb3JlTWVudSwgZG9jdW1lbnQsIGluZGV4KTsKLQkJCQljb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oYWRkQWZ0ZXJNZW51LCBkb2N1bWVudCwgaW5kZXggKyAxKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVEZWxldGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IGxpc3QsIGludCBpYywgaW50IHZjKSB7Ci0JCWJvb2xlYW4gY2FuUmVtb3ZlID0gbW9kZWxRdWVyeS5jYW5SZW1vdmUobGlzdCwgdmMpOwotCi0KLQkJLy8gYSBkZWxldGUgYWN0aW9uIHdpdGggYW4gZW1wdHkgbGlzdCB3aWxsIHByb2R1Y2UgYSBkaXNhYmxlZCBtZW51Ci0JCS8vIGl0ZW0KLQkJLy8KLQkJTGlzdCByZXN1bHRMaXN0ID0gY2FuUmVtb3ZlID8gbGlzdCA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlRGVsZXRlQWN0aW9uKHJlc3VsdExpc3QpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVFZGl0QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTm9kZSBub2RlKSB7Ci0JCWNvbnRyaWJ1dGVFZGl0R3JhbW1hckluZm9ybWF0aW9uQWN0aW9ucyhtZW51LCBub2RlKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSkpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXRBdHRyaWJ1dGVBY3Rpb24oKEF0dHIpIG5vZGUsIG51bGwpKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUVkaXRHcmFtbWFySW5mb3JtYXRpb25BY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0KLQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBnZXREb2N0eXBlKG5vZGUpOwotCQlpZiAoZG9jdHlwZSA9PSBudWxsKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZERvY3R5cGVBY3Rpb24oZG9jdW1lbnQsIC0xKSk7Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXREb2N0eXBlQWN0aW9uKChEb2N1bWVudFR5cGUpIG5vZGUpKTsKLQkJfQotCi0JCWlmICgoZG9jdHlwZSA9PSBudWxsKSAmJiAoZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpICE9IG51bGwpKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXRTY2hlbWFJbmZvQWN0aW9uKGdldFJvb3RFbGVtZW50KGRvY3VtZW50KSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIERvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJLy8gdGVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW5kZXggaXNuJ3QgYmVmb3JlIHRoZSBYTUwgZGVjbGFyYXRpb24KLQkJLy8gCi0JCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkQ29tbWVudEFjdGlvbihkb2N1bWVudCwgaW5kZXgpKTsKLQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oZG9jdW1lbnQsIGluZGV4KSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgaW50IGluZGV4KSB7Ci0JCWlmICgocGFyZW50RWQgPT0gbnVsbCkgfHwgaXNDb21tZW50QWxsb3dlZChwYXJlbnRFZCkpIHsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkQ29tbWVudEFjdGlvbihwYXJlbnRFbGVtZW50LCBpbmRleCkpOwotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24ocGFyZW50RWxlbWVudCwgaW5kZXgpKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVJlcGxhY2VBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IHNlbGVjdGVkTm9kZUxpc3QsIGludCBpYywgaW50IHZjKSB7Ci0JCS8vICdSZXBsYWNlIFdpdGguLi4nIGFjdGlvbnMKLQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCUlNZW51TWFuYWdlciByZXBsYWNlV2l0aE1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFUExBQ0VfV0lUSCk7Ci0JCW1lbnUuYWRkKHJlcGxhY2VXaXRoTWVudSk7Ci0KLQkJaWYgKChtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCkgPT0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUKSAmJiAoc2VsZWN0ZWROb2RlTGlzdC5zaXplKCkgPiAwKSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHNlbGVjdGVkTm9kZUxpc3QuZ2V0KDApOwotCQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoKHBhcmVudE5vZGUgIT0gbnVsbCkgJiYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkpIHsKLQkJCQlFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFRCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0JCQkJaWYgKHBhcmVudEVEICE9IG51bGwpIHsKLQkJCQkJTGlzdCByZXBsYWNlQWN0aW9uTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJbW9kZWxRdWVyeS5nZXRSZXBsYWNlQWN0aW9ucyhwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgc2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjLCByZXBsYWNlQWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihyZXBsYWNlV2l0aE1lbnUsIHJlcGxhY2VBY3Rpb25MaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVGV4dE5vZGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBpbnQgaW5kZXgpIHsKLQkJaWYgKChwYXJlbnRFZCA9PSBudWxsKSB8fCBpc1RleHRBbGxvd2VkKHBhcmVudEVkKSkgewotCQkJQ01EYXRhVHlwZSBkYXRhVHlwZSA9IHBhcmVudEVkICE9IG51bGwgPyBwYXJlbnRFZC5nZXREYXRhVHlwZSgpIDogbnVsbDsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkUENEYXRhQWN0aW9uKHBhcmVudEVsZW1lbnQsIGRhdGFUeXBlLCBpbmRleCkpOwotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRDRGF0YVNlY3Rpb25BY3Rpb24ocGFyZW50RWxlbWVudCwgaW5kZXgpKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKElNZW51TWFuYWdlciBtZW51LCBEb2N1bWVudCBkb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JCWlmIChpc1VuY29uc3RyYWluZWRBY3Rpb25BbGxvd2VkKCkpIHsKLQkJCWlmIChnZXRSb290RWxlbWVudChkb2N1bWVudCkgPT0gbnVsbCkgewotCQkJCWludCB4bWxEZWNsYXJhdGlvbkluZGV4ID0gLTE7Ci0JCQkJaW50IGRvY3R5cGVJbmRleCA9IC0xOwotCQkJCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykgewotCQkJCQlOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJCQlpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCQkJZG9jdHlwZUluZGV4ID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlOwotCQkJCQkJaWYgKHBpLmdldFRhcmdldCgpLmVxdWFsc0lnbm9yZUNhc2UoInhtbCIpICYmICh4bWxEZWNsYXJhdGlvbkluZGV4ID09IC0xKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJeG1sRGVjbGFyYXRpb25JbmRleCA9IGk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoKCh4bWxEZWNsYXJhdGlvbkluZGV4ID09IC0xKSB8fCAoaW5kZXggPiB4bWxEZWNsYXJhdGlvbkluZGV4KSkgJiYgKChkb2N0eXBlSW5kZXggPT0gLTEpIHx8IChpbmRleCA+IGRvY3R5cGVJbmRleCkpKSB7Ci0JCQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkRWxlbWVudEFjdGlvbihkb2N1bWVudCwgbnVsbCwgaW5kZXgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgaW50IGluZGV4KSB7Ci0JCWlmIChpc1VuY29uc3RyYWluZWRBY3Rpb25BbGxvd2VkKCkpIHsKLQkJCWlmICgocGFyZW50RWQgPT0gbnVsbCkgfHwgKHBhcmVudEVkLmdldFByb3BlcnR5KCJpc0luZmVycmVkIikgPT0gQm9vbGVhbi5UUlVFKSB8fCAoKG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKSAhPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpICYmIGlzRWxlbWVudEFsbG93ZWQocGFyZW50RWQpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRFbGVtZW50QWN0aW9uKHBhcmVudEVsZW1lbnQsIG51bGwsIGluZGV4KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQXR0cmlidXRlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCkgewotCQlpZiAoaXNVbmNvbnN0cmFpbmVkQWN0aW9uQWxsb3dlZCgpKSB7Ci0JCQlpZiAoKHBhcmVudEVkID09IG51bGwpIHx8IChwYXJlbnRFZC5nZXRQcm9wZXJ0eSgiaXNJbmZlcnJlZCIpID09IEJvb2xlYW4uVFJVRSkgfHwgKG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKSAhPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZEF0dHJpYnV0ZUFjdGlvbihwYXJlbnRFbGVtZW50LCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZEF0dHJpYnV0ZUFjdGlvbihFbGVtZW50IHBhcmVudCwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZENEYXRhU2VjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQ29tbWVudEFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkRG9jdHlwZUFjdGlvbihEb2N1bWVudCBwYXJlbnQsIGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZEVsZW1lbnRBY3Rpb24oTm9kZSBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRQQ0RhdGFBY3Rpb24oTm9kZSBwYXJlbnQsIENNRGF0YVR5cGUgZGF0YVR5cGUsIGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkU2NoZW1hSW5mb0FjdGlvbihFbGVtZW50IGVsZW1lbnQpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oTGlzdCBzZWxlY3Rpb24pOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0QXR0cmlidXRlQWN0aW9uKEF0dHIgYXR0cmlidXRlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdERvY3R5cGVBY3Rpb24oRG9jdW1lbnRUeXBlIGRvY3R5cGUpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXRTY2hlbWFJbmZvQWN0aW9uKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZVJlbmFtZUFjdGlvbihOb2RlIG5vZGUpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVSZXBsYWNlQWN0aW9uKE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KTsKLQotCi0JcHVibGljIGludCBnZXRJbmRleChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGQpIHsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAobm9kZUxpc3QuaXRlbShpKSA9PSBjaGlsZCkgewotCQkJCWluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0KLQlwdWJsaWMgTm9kZSBnZXRSZWZDaGlsZE5vZGVBdEluZGV4KE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlOb2RlIHJlZkNoaWxkID0gKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkpID8gbm9kZUxpc3QuaXRlbShpbmRleCkgOiBudWxsOwotCQlyZXR1cm4gcmVmQ2hpbGQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRWxlbWVudCBnZXRSb290RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCkgewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXJlc3VsdCA9IChFbGVtZW50KSBub2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKExpc3QgbGlzdCwgYm9vbGVhbiBpbmNsdWRlVGV4dE5vZGVzKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCWlmIChpbmNsdWRlVGV4dE5vZGVzKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdC5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRBbGxvd2VkKENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkKSB7Ci0JCWludCBjb250ZW50VHlwZSA9IHBhcmVudEVkLmdldENvbnRlbnRUeXBlKCk7Ci0JCXJldHVybiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkgfHwgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRWxlbWVudEFsbG93ZWQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQpIHsKLQkJaW50IGNvbnRlbnRUeXBlID0gcGFyZW50RWQuZ2V0Q29udGVudFR5cGUoKTsKLQkJcmV0dXJuIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQpIHx8IChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUZXh0QWxsb3dlZChDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCkgewotCQlpbnQgY29udGVudFR5cGUgPSBwYXJlbnRFZC5nZXRDb250ZW50VHlwZSgpOwotCQlyZXR1cm4gKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVW5jb25zdHJhaW5lZEFjdGlvbkFsbG93ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXaGl0ZXNwYWNlVGV4dE5vZGUoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwQWN0aW9uWE1MRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxYTgxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwQWN0aW9uWE1MRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNsZWFudXAuQ2xlYW51cFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQ2xlYW51cCBhY3Rpb24gZGVsZWdhdGUgZm9yIENTUyBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIENsZWFudXBBY3Rpb25YTUxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQkJCURpYWxvZyBjbGVhbnVwRGlhbG9nID0gbmV3IENsZWFudXBEaWFsb2dYTUwoZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCWlmIChjbGVhbnVwRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkvLyBzZXR1cCBydW5uYWJsZQotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciA9IGdldENsZWFudXBQcm9jZXNzb3IoKTsKLQkJCQkJCWlmIChjbGVhbnVwUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJY2xlYW51cFByb2Nlc3Nvci5jbGVhbnVwTW9kZWwobW9kZWwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJLy8gVE9ETzogbWFrZSBpbmRlcGVuZGVudCBvZiAnbW9kZWwnLgotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBiZWdpbiByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZkVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIHJ1bm5hYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnCi0JCQkJCQkvLyBtb2RlbAotCQkJCQkJLy8gY2hhbmdlCi0JCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQotCQkJCQkJLy8gZW5kIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZDbGVhbnVwUHJvY2Vzc29yID0gbmV3IENsZWFudXBQcm9jZXNzb3JYTUwoKTsKLQkJfQotCi0JCXJldHVybiBmQ2xlYW51cFByb2Nlc3NvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwRGlhbG9nWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwRGlhbG9nWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YjcxOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cERpYWxvZ1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cERpYWxvZ1hNTCBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFnczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveENvbnZlcnRFT0xDb2RlczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveEZvcm1hdFNvdXJjZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRyczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveFF1b3RlQXR0clZhbHVlczsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWwgPSBudWxsOwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBmUHJlZmVyZW5jZXMgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXg7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93czsKLQotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VBc2lzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXI7Ci0KLQlwdWJsaWMgQ2xlYW51cERpYWxvZ1hNTChTaGVsbCBzaGVsbCkgewotCi0JCXN1cGVyKHNoZWxsKTsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlnZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5DbGVhbnVwX1VJXyk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljcmVhdGVEaWFsb2dBcmVhSW5Db21wb3NpdGUoY29tcG9zaXRlKTsKLQkJaW5pdGlhbGl6ZU9wdGlvbnMoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEaWFsb2dBcmVhSW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuQ0xFQU5VUF9YTUxfSEVMUElEKTsgLy8gdXNlCi0JCS8vIFhNTAotCQkvLyBzcGVjaWZpYwotCQkvLyBoZWxwCi0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gQ29tcHJlc3MgZW1wdHkgZWxlbWVudCB0YWdzCi0JCWZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3Muc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNvbXByZXNzX2VtcHR5X2VsZW1lbnRfdGFnc19VSV8pOwotCQlmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gSW5zZXJ0IG1pc3NpbmcgcmVxdWlyZWQgYXR0cnMKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLnNldFRleHQoWE1MVUlNZXNzYWdlcy5JbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV8pOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIEluc2VydCBtaXNzaW5nIGJlZ2luL2VuZCB0YWdzCi0JCWZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLnNldFRleHQoWE1MVUlNZXNzYWdlcy5JbnNlcnRfbWlzc2luZ190YWdzX1VJXyk7Ci0JCWZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIFF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXMKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV8pOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gRm9ybWF0IHNvdXJjZQotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2UgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Gb3JtYXRfc291cmNlX1VJXyk7Ci0JCWZDaGVja0JveEZvcm1hdFNvdXJjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBDb252ZXJ0IEVPTCBjb2RlCi0JCWZDaGVja0JveENvbnZlcnRFT0xDb2RlcyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNvbnZlcnRfRU9MX2NvZGVzX1VJXyk7Ci0JCWZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJQ29tcG9zaXRlIEVPTENvZGVzID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBoTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJRU9MQ29kZXMuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cyA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldFRleHQoWE1MVUlNZXNzYWdlcy5FT0xfV2luZG93c19VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peCA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldFRleHQoWE1MVUlNZXNzYWdlcy5FT0xfVW5peF9VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuRU9MX01hY19VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlRU9MQ29kZVJhZGlvcyhib29sZWFuIGVuYWJsZSkgewotCi0JCWlmICgoZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MgIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4ICE9IG51bGwpICYmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjICE9IG51bGwpKSB7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWlmICghZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MuZ2V0U2VsZWN0aW9uKCkgJiYgIWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LmdldFNlbGVjdGlvbigpICYmICFmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcHRpb25zKCkgewotCi0JCWZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3Muc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUykpOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTKSk7Ci0JCVN0cmluZyBFT0xDb2RlID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpOwotCQlpZiAoRU9MQ29kZS5jb21wYXJlVG8oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpID09IDApIHsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbHNlIGlmIChFT0xDb2RlLmNvbXBhcmVUbyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUikgPT0gMCkgewotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJZW5hYmxlRU9MQ29kZVJhZGlvcyhmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQotCQlzdG9yZU9wdGlvbnMoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCi0JCWZNb2RlbCA9IG1vZGVsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlT3B0aW9ucygpIHsKLQotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MsIGZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUywgZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MsIGZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIGZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTLCBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKTsKLQkJfQotCQllbHNlIGlmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKTsKLQkJfQotCQkvLyBleHBsaWNpdGx5IHNhdmUgcGx1Z2luIHByZWZlcmVuY2VzIHNvIHZhbHVlcyBhcmUgc3RvcmVkCi0JCVhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCgoKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIgIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkpIHx8ICgoZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIgIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpIHx8IGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKSkgfHwgZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuZ2V0U2VsZWN0aW9uKCkgfHwgZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLmdldFNlbGVjdGlvbigpIHx8IGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSB8fCBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkgfHwgKChmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peCAhPSBudWxsKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSB8fCBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5nZXRTZWxlY3Rpb24oKSkpKTsKLQkJaWYgKGUud2lkZ2V0ID09IGZDaGVja0JveENvbnZlcnRFT0xDb2RlcykgewotCQkJZW5hYmxlRU9MQ29kZVJhZGlvcyhmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEF0dHJpYnV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEF0dHJpYnV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE4YWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRBdHRyaWJ1dGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0QXR0cmlidXRlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0QXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXR0ciBhdHRyOwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIEVsZW1lbnQgb3duZXJFbGVtZW50OwotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQlwdWJsaWMgRWRpdEF0dHJpYnV0ZUFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIEVsZW1lbnQgb3duZXJFbGVtZW50LCBBdHRyIGF0dHIsIFN0cmluZyBhY3Rpb25MYWJlbCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmF0dHIgPSBhdHRyOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXNldFRleHQoYWN0aW9uTGFiZWwpOwotCQkvLyBhc3N1bWUgaWYgYXR0ciBpcyBudWxsIHRoZW4gdGhpcyBpcyBhbiAnQWRkJyB0aGF0IHJlcXVpcmVzIGFjdGlvbgotCQkvLyBhbiBpY29ucy4uLiBvdGhlcndpc2UgdGhpcyBpcyBhbiBlZGl0Ci0JCWlmIChhdHRyID09IG51bGwpIHsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihjcmVhdGVJbWFnZURlc2NyaXB0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbWFuYWdlci5iZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0JCVNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlFZGl0QXR0cmlidXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0QXR0cmlidXRlRGlhbG9nKHNoZWxsLCBvd25lckVsZW1lbnQsIGF0dHIpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJb3duZXJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IG93bmVyRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlBdHRyIG5ld0F0dHJpYnV0ZSA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShkaWFsb2cuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJCW5ld0F0dHJpYnV0ZS5zZXRWYWx1ZShkaWFsb2cuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0JCQlvd25lckVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShuZXdBdHRyaWJ1dGUpOwotCQkJbWFuYWdlci5zZXRWaWV3ZXJTZWxlY3Rpb24obmV3QXR0cmlidXRlKTsKLQkJfQotCQltYW5hZ2VyLmVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdERvY3R5cGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXREb2N0eXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzAwNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdERvY3R5cGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0RG9jdHlwZURpYWxvZzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEVkaXREb2N0eXBlQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0RG9jdHlwZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBkb2N0eXBlOwotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgZG9jdHlwZS4KLQkgKi8KLQlwdWJsaWMgRWRpdERvY3R5cGVBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGl0bGUpIHsKLQkJc2V0VGV4dCh0aXRsZSk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIGVkaXQgYW4gZXhpc2l0bmcgZG9jdHlwZS4KLQkgKi8KLQlwdWJsaWMgRWRpdERvY3R5cGVBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRG9jdW1lbnRUeXBlIGRvY3R5cGUsIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGl0bGUpIHsKLQkJc2V0VGV4dCh0aXRsZSk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5kb2N0eXBlID0gZG9jdHlwZTsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBjcmVhdGVEb2N0eXBlKEVkaXREb2N0eXBlRGlhbG9nIGRpYWxvZywgRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRG9jdW1lbnRUeXBlIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIERvY3VtZW50SW1wbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50SW1wbCA9IChJRE9NRG9jdW1lbnQpIGRvY3VtZW50OwotCQkJSURPTURvY3VtZW50VHlwZSBkb2N0eXBlSW1wbCA9IChJRE9NRG9jdW1lbnRUeXBlKSBkb2N1bWVudEltcGwuY3JlYXRlRG9jdHlwZShkaWFsb2cuZ2V0TmFtZSgpKTsKLQkJCWRvY3R5cGVJbXBsLnNldFB1YmxpY0lkKGRpYWxvZy5nZXRQdWJsaWNJZCgpKTsKLQkJCWRvY3R5cGVJbXBsLnNldFN5c3RlbUlkKGRpYWxvZy5nZXRTeXN0ZW1JZCgpKTsKLQkJCXJlc3VsdCA9IGRvY3R5cGVJbXBsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSb290RWxlbWVudE5hbWUoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRWxlbWVudCByb290RWxlbWVudCA9IG51bGw7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlyb290RWxlbWVudCA9IChFbGVtZW50KSBjaGlsZE5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RFbGVtZW50ICE9IG51bGwgPyByb290RWxlbWVudC5nZXROb2RlTmFtZSgpIDogWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UX1ZBTFVFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnREb2N0eXBlKERvY3VtZW50VHlwZSBkb2N0eXBlLCBEb2N1bWVudCBkb2N1bWVudCkgewotCQlOb2RlIHJlZkNoaWxkID0gbnVsbDsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCWlmICgoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHx8IChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkpIHsKLQkJCQkvLyBjb250aW51ZSBvbiB0byB0aGUgbmV4dE5vZGUKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlZkNoaWxkID0gY2hpbGROb2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKGRvY3R5cGUsIHJlZkNoaWxkKTsKLQkJLy8gbWFuYWdlci5yZWZvcm1hdChkb2N0eXBlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRVbmRvRGVzY3JpcHRpb24oKSk7Ci0JCS8vIFNoZWxsIHNoZWxsID0KLQkJLy8gWE1MQ29tbW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlTaGVsbCBzaGVsbCA9IGdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlFZGl0RG9jdHlwZURpYWxvZyBkaWFsb2cgPSBzaG93RWRpdERvY3R5cGVEaWFsb2coc2hlbGwpOwotCi0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCXVwZGF0ZURvY3R5cGUoZGlhbG9nLCBkb2N0eXBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGNyZWF0ZURvY3R5cGUoZGlhbG9nLCBkb2N1bWVudCk7Ci0JCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCQlpbnNlcnREb2N0eXBlKGRvY3R5cGUsIGRvY3VtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0RG9jdHlwZURpYWxvZyBzaG93RWRpdERvY3R5cGVEaWFsb2coU2hlbGwgc2hlbGwpIHsKLQkJRWRpdERvY3R5cGVEaWFsb2cgZGlhbG9nID0gbnVsbDsKLQotCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQlkaWFsb2cgPSBuZXcgRWRpdERvY3R5cGVEaWFsb2coc2hlbGwsIGRvY3R5cGUpOwotCQkJaWYgKHRpdGxlID09IG51bGwpIHsKLQkJCQl0aXRsZSA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0VESVRfRE9DVFlQRTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gZ2V0Um9vdEVsZW1lbnROYW1lKGRvY3VtZW50KTsKLQkJCWRpYWxvZyA9IG5ldyBFZGl0RG9jdHlwZURpYWxvZyhzaGVsbCwgcm9vdEVsZW1lbnROYW1lLCAiIiwgcm9vdEVsZW1lbnROYW1lICsgIi5kdGQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAodGl0bGUgPT0gbnVsbCkgewotCQkJCXRpdGxlID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OX1RJVExFOwotCQkJfQotCQl9Ci0KLQkJZGlhbG9nLnNldENvbXB1dGVTeXN0ZW1JZCgoZG9jdHlwZSA9PSBudWxsKSB8fCAoZG9jdHlwZS5nZXRTeXN0ZW1JZCgpID09IG51bGwpIHx8IChkb2N0eXBlLmdldFN5c3RlbUlkKCkudHJpbSgpLmxlbmd0aCgpID09IDApKTsKLQotCQlkaWFsb2cuc2V0RXJyb3JDaGVja2luZyhmYWxzZSk7Ly8gIW1vZGVsLmdldFR5cGUoKS5lcXVhbHMoSVN0cnVjdHVyZWRNb2RlbC5IVE1MKSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24obmV3IFBhdGgocmVzb3VyY2VMb2NhdGlvbikpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEb2N0eXBlKEVkaXREb2N0eXBlRGlhbG9nIGRpYWxvZywgRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJaWYgKGRvY3R5cGUgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnRUeXBlKSB7Ci0JCQlJRE9NRG9jdW1lbnRUeXBlIGRvY3R5cGVJbXBsID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3R5cGU7Ci0JCQlpZiAoZG9jdHlwZUltcGwuZ2V0TmFtZSgpLmVxdWFscyhkaWFsb2cuZ2V0TmFtZSgpKSkgewotCQkJCWRvY3R5cGVJbXBsLnNldFB1YmxpY0lkKGRpYWxvZy5nZXRQdWJsaWNJZCgpKTsKLQkJCQlkb2N0eXBlSW1wbC5zZXRTeXN0ZW1JZChkaWFsb2cuZ2V0U3lzdGVtSWQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHJlbW92ZSB0aGUgb2xkCi0JCQkJLy8gICAgICAgICAgICAgICAgICAKLQkJCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY3R5cGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCURvY3VtZW50VHlwZSBuZXdEb2N0eXBlID0gY3JlYXRlRG9jdHlwZShkaWFsb2csIGRvY3VtZW50KTsKLQkJCQlkb2N1bWVudC5pbnNlcnRCZWZvcmUobmV3RG9jdHlwZSwgZG9jdHlwZSk7Ci0JCQkJZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jdHlwZSk7Ci0JCQkJLy8gbWFuYWdlci5yZWZvcm1hdChuZXdEb2N0eXBlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0NDI2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRFbGVtZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0RWxlbWVudEFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgaW50IGluc2VydGlvbkluZGV4ID0gLTE7Ci0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlcjsKLQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCXB1YmxpYyBFZGl0RWxlbWVudEFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgZGlhbG9nVGl0bGUpIHsKLQkJdGhpcyhtYW5hZ2VyLCBlbGVtZW50LmdldFBhcmVudE5vZGUoKSwgLTEsIGVsZW1lbnQsIGFjdGlvbkxhYmVsLCBkaWFsb2dUaXRsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRFbGVtZW50QWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgTm9kZSBwYXJlbnQsIGludCBpbmRleCwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyB0aXRsZSkgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5pbnNlcnRpb25JbmRleCA9IGluZGV4OwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXNldFRleHQoYWN0aW9uTGFiZWwpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIEVkaXRFbGVtZW50QWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgTm9kZSBwYXJlbnQsIGludCBpbmRleCwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcyhtYW5hZ2VyLCBwYXJlbnQsIGluZGV4LCBudWxsLCBhY3Rpb25MYWJlbCwgdGl0bGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQltYW5hZ2VyLmJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUVkaXRFbGVtZW50RGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0RWxlbWVudERpYWxvZyhzaGVsbCwgZWxlbWVudCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIGhlcmUgd2UgbmVlZCB0byBkbyBhIHJlbmFtZS4uLiB3aGljaCBzZWVtcyB0byBiZSBxdWl0ZSBoYXJkCi0JCQkJLy8gdG8gZG8gOi0oCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgewotCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50SW1wbCA9IChJRE9NRWxlbWVudCkgZWxlbWVudDsKLQkJCQkJSURPTU1vZGVsIG1vZGVsID0gZWxlbWVudEltcGwuZ2V0TW9kZWwoKTsKLQkJCQkJU3RyaW5nIG9sZE5hbWUgPSBlbGVtZW50SW1wbC5nZXROb2RlTmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGRpYWxvZy5nZXRFbGVtZW50TmFtZSgpOwotCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbGVtZW50TmFtZShtb2RlbCwgZWxlbWVudEltcGwuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVsZW1lbnROYW1lKG1vZGVsLCBlbGVtZW50SW1wbC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRWxlbWVudCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkaWFsb2cuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQkJCU5vZGUgcmVmQ2hpbGQgPSAoaW5zZXJ0aW9uSW5kZXggPCBub2RlTGlzdExlbmd0aCkgJiYgKGluc2VydGlvbkluZGV4ID49IDApID8gbm9kZUxpc3QuaXRlbShpbnNlcnRpb25JbmRleCkgOiBudWxsOwotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobmV3RWxlbWVudCwgcmVmQ2hpbGQpOwotCQkJCW1hbmFnZXIucmVmb3JtYXQobmV3RWxlbWVudCwgZmFsc2UpOwotCQkJCW1hbmFnZXIuc2V0Vmlld2VyU2VsZWN0aW9uKG5ld0VsZW1lbnQpOwotCQkJfQotCQl9Ci0JCW1hbmFnZXIuZW5kTm9kZUFjdGlvbih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbGVtZW50TmFtZShJRE9NTW9kZWwgbW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKG9sZE5hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJaW5kZXggKz0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBpbmRleCwgb2xkTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWMzMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLS8qKgotICogRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCXByb3RlY3RlZCBOb2RlIGNoaWxkUmVmOwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCXByb3RlY3RlZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGk7Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBhZGQgYSBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICovCi0JcHVibGljIEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZFJlZiwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgdGl0bGUpIHsKLQkJc2V0VGV4dChhY3Rpb25MYWJlbCk7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmNoaWxkUmVmID0gY2hpbGRSZWY7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gZWRpdCBhIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqLwotCXB1YmxpYyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpLCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyB0aXRsZSkgewotCQlzZXRUZXh0KGFjdGlvbkxhYmVsKTsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5waSA9IHBpOwotCQl0aGlzLnBhcmVudCA9IHBpLmdldFBhcmVudE5vZGUoKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQltYW5hZ2VyLmJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0KLQkJRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZyBkaWFsb2cgPSBudWxsOwotCQlpZiAocGkgIT0gbnVsbCkgewotCQkJZGlhbG9nID0gbmV3IEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2coc2hlbGwsIHBpKTsKLQkJfQotCQllbHNlIHsKLQkJCWRpYWxvZyA9IG5ldyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nKHNoZWxsLCBYTUxVSU1lc3NhZ2VzLl9VSV9QSV9UQVJHRVRfVkFMVUUsIFhNTFVJTWVzc2FnZXMuX1VJX1BJX0RBVEFfVkFMVUUpOwotCQl9Ci0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJaWYgKHBpICE9IG51bGwpIHsKLQkJCQljaGlsZFJlZiA9IHBpOwotCQkJfQotCi0JCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCU5vZGUgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihkaWFsb2cuZ2V0VGFyZ2V0KCksIGRpYWxvZy5nZXREYXRhKCkpOwotCQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCBjaGlsZFJlZik7Ci0KLQkJCWlmIChwaSAhPSBudWxsKSB7Ci0JCQkJcGFyZW50LnJlbW92ZUNoaWxkKHBpKTsKLQkJCX0KLQotCQkJbWFuYWdlci5yZWZvcm1hdChuZXdOb2RlLCBmYWxzZSk7Ci0JCQltYW5hZ2VyLnNldFZpZXdlclNlbGVjdGlvbihuZXdOb2RlKTsKLQkJfQotCQltYW5hZ2VyLmVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFNjaGVtYUluZm9BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRTY2hlbWFJbmZvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTQ5MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFNjaGVtYUluZm9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0U2NoZW1hSW5mb0RpYWxvZzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogRWRpdERvY3R5cGVBY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEVkaXRTY2hlbWFJbmZvQWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlcjsKLQlwcm90ZWN0ZWQgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIgbmFtZXNwYWNlSW5mb01hbmFnZXIgPSBuZXcgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIoKTsKLQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JcHVibGljIEVkaXRTY2hlbWFJbmZvQWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgTm9kZSBub2RlLCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JCXNldFRleHQodGl0bGUpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBjcmVhdGVQcmVmaXhNYXBwaW5nKExpc3Qgb2xkTGlzdCwgTGlzdCBuZXdMaXN0KSB7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJSGFzaHRhYmxlIG9sZFVSSVRvUHJlZml4VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlvbGRVUklUb1ByZWZpeFRhYmxlLnB1dChvbGRJbmZvLnVyaSwgb2xkSW5mbyk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBuZXdMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBuZXdJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG9sZFVSSVRvUHJlZml4VGFibGUuZ2V0KG5ld0luZm8udXJpICE9IG51bGwgPyBuZXdJbmZvLnVyaSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJCS8vIGlmIG9sZEluZm8gaXMgbm9uIG51bGwgLi4uIHRoZXJlJ3MgYSBtYXRjaGluZyBVUkkgaW4gdGhlIG9sZAotCQkJLy8gc2V0Ci0JCQkvLyB3ZSBjYW4gdXNlIGl0cyBwcmVmaXggdG8gZGV0ZW1pbmUgb3V0IG1hcHBpbmcKLQkJCS8vCi0JCQkvLyBpZiBvbGRJbmZvIGlzIG51bGwgLi4uIHdlIHVzZSB0aGUgJ29sZENvcHknIHdlIHN0YXNoZWQgYXdheQotCQkJLy8gYXNzdW1pbmcgdGhhdCB0aGUgdXNlciBjaGFuZ2VkIHRoZSBVUkkgYW5kIHRoZSBwcmVmaXgKLQkJCWlmIChvbGRJbmZvID09IG51bGwpIHsKLQkJCQlvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG5ld0luZm8uZ2V0UHJvcGVydHkoIm9sZENvcHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAob2xkSW5mbyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5ld1ByZWZpeCA9IG5ld0luZm8ucHJlZml4ICE9IG51bGwgPyBuZXdJbmZvLnByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG9sZFByZWZpeCA9IG9sZEluZm8ucHJlZml4ICE9IG51bGwgPyBvbGRJbmZvLnByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFvbGRQcmVmaXguZXF1YWxzKG5ld1ByZWZpeCkpIHsKLQkJCQkJbWFwLnB1dChvbGRQcmVmaXgsIG5ld1ByZWZpeCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudChOb2RlIG5vZGUpIHsKLQkJRWxlbWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlyZXN1bHQgPSAoRWxlbWVudCkgbm9kZTsKLQkJfQotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXN1bHQgPSBnZXRSb290RWxlbWVudCgoRG9jdW1lbnQpIG5vZGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgRWxlbWVudCBnZXRSb290RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCkgewotCQlFbGVtZW50IHJvb3RFbGVtZW50ID0gbnVsbDsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXJvb3RFbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkTm9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdEVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCW1hbmFnZXIuYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCi0JCS8vIHRvZG8uLi4gY2hhbmdlIGNvbnN0cnVjdG9yIHRvIHRha2UgYW4gZWxlbWVudAotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KG5vZGUpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJCUVkaXRTY2hlbWFJbmZvRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0U2NoZW1hSW5mb0RpYWxvZyhzaGVsbCwgbmV3IFBhdGgocmVzb3VyY2VMb2NhdGlvbikpOwotCi0JCQlMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmFtZXNwYWNlSW5mb01hbmFnZXIuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoZWxlbWVudCk7Ci0JCQlMaXN0IG9sZE5hbWVzcGFjZUluZm9MaXN0ID0gTmFtZXNwYWNlSW5mby5jbG9uZU5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQkJLy8gaGVyZSB3ZSBzdG9yZSBhIGNvcHkgb2YgdGhlIG9sZCBpbmZvIGZvciBlYWNoIE5hbWVzcGFjZUluZm8KLQkJCS8vIHRoaXMgaW5mbyB3aWxsIGJlIHVzZWQgaW4gY3JlYXRlUHJlZml4TWFwcGluZygpIHRvIGZpZ3VyZSBvdXQKLQkJCS8vIGhvdyB0byB1cGRhdGUgdGhlIGRvY3VtZW50Ci0JCQkvLyBpbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2VzCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQkJTmFtZXNwYWNlSW5mbyBvbGRDb3B5ID0gbmV3IE5hbWVzcGFjZUluZm8oaW5mbyk7Ci0JCQkJaW5mby5zZXRQcm9wZXJ0eSgib2xkQ29weSIsIG9sZENvcHkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWRpYWxvZy5zZXROYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkvLyBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDUwMCwgMzAwKTsKLQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX1NDSEVNQV9JTkZPUk1BVElPTl9USVRMRSk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCi0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlMaXN0IG5ld0luZm9MaXN0ID0gZGlhbG9nLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0JCQkJbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLQkJCQluYW1lc3BhY2VJbmZvTWFuYWdlci5hZGROYW1lc3BhY2VJbmZvKGVsZW1lbnQsIG5ld0luZm9MaXN0LCB0cnVlKTsKLQotCQkJCS8vIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmFtZSBhbnkgcHJlZml4ZXMKLQkJCQlNYXAgcHJlZml4TWFwcGluZyA9IGNyZWF0ZVByZWZpeE1hcHBpbmcob2xkTmFtZXNwYWNlSW5mb0xpc3QsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCQlpZiAocHJlZml4TWFwcGluZy5zaXplKCkgPiAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltYW5hZ2VyLmdldE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJCQlSZXBsYWNlUHJlZml4QWN0aW9uIHJlcGxhY2VQcmVmaXhBY3Rpb24gPSBuZXcgUmVwbGFjZVByZWZpeEFjdGlvbihtYW5hZ2VyLCBlbGVtZW50LCBwcmVmaXhNYXBwaW5nKTsKLQkJCQkJCXJlcGxhY2VQcmVmaXhBY3Rpb24ucnVuKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQltYW5hZ2VyLmdldE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbWFuYWdlci5lbmROb2RlQWN0aW9uKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0dvVG9NYXRjaGluZ1RhZ0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvR29Ub01hdGNoaW5nVGFnQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyM2NkNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvR29Ub01hdGNoaW5nVGFnQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCB0YWcgaWYgaXQgaXMgaW4gYSBzdGFydCB0YWcsIGFuZCB2aWNlIHZlcnNhLgotICogQWxzbyB1cGRhdGVzIHRoZSBtYXRjaGluZyB0YWcgYW5ub3RhdGlvbiBpbiB0aGUgYWN0aXZlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBuaXRpbgotICogCi0gKi8KLWNsYXNzIEdvVG9NYXRjaGluZ1RhZ0FjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gewotCi0JcHJpdmF0ZSBjbGFzcyBVcGRhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJdXBkYXRlRm9yKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX1RZUEUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5tYXRjaGluZy50YWciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGZVcGRhdGVMaXN0ZW5lciA9IG51bGw7Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogQHBhcmFtIGVkaXRvcgotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCUdvVG9NYXRjaGluZ1RhZ0FjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBwcmVmaXgsIElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQkJZlVwZGF0ZUxpc3RlbmVyID0gbmV3IFVwZGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0Jdm9pZCByZW1vdmVBbm5vdGF0aW9uKGJvb2xlYW4gYWxsTWF0Y2hpbmcpIHsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldFRleHRFZGl0b3IoKTsKLQkJaWYgKHRleHRFZGl0b3IgPT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJubyBlZGl0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlEb2N1bWVudFByb3ZpZGVyIGRvY3VtZW50UHJvdmlkZXIgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJaWYgKGRvY3VtZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJubyBkb2N1bWVudCBwcm92aWRlciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBkb2N1bWVudFByb3ZpZGVyLmdldEFubm90YXRpb25Nb2RlbCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlpZiAoYW5ub3RhdGlvbk1vZGVsID09IG51bGwpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm8gYW5ub3RhdGlvbiBtb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJdGVyYXRvciBhbm5vdGF0aW9uSXRlcmF0b3IgPSBhbm5vdGF0aW9uTW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCUxpc3Qgb2xkQW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChhbm5vdGF0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgYW5ub3RhdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChBTk5PVEFUSU9OX1RZUEUuZXF1YWxzKGFubm90YXRpb24uZ2V0VHlwZSgpKSkgewotCQkJCWFubm90YXRpb24ubWFya0RlbGV0ZWQodHJ1ZSk7Ci0JCQkJLyoqCi0JCQkJICogU29tZXRpbWVzIGl0IGlzIHN1cHBvcnRlZCwgc29tZXRpbWUncyBpdCBpcyBub3QuIENvbmZ1c2luZy4KLQkJCQkgKi8KLQkJCQl0cnkgewotCQkJCQlhbm5vdGF0aW9uSXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCW9sZEFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVtb3ZlZCAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKCFhbGxNYXRjaGluZykKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFvbGRBbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCWludCBzaXplID0gb2xkQW5ub3RhdGlvbnMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlhbm5vdGF0aW9uTW9kZWwucmVtb3ZlQW5ub3RhdGlvbigoQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbnMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLnJ1bldpdGhFdmVudChldmVudCk7Ci0JCWlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1hdGNoUmVnaW9uID0gbnVsbDsKLQkJCQlpZiAoKChOb2RlKSBvKS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkJbyA9ICgoQXR0cikgbykuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJfQotCi0JCQkJaW50IHRhcmdldE9mZnNldCA9IC0xOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbzsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJCQkJbWF0Y2hSZWdpb24gPSAoKElET01Ob2RlKSBvKS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCWlmIChtYXRjaFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJCXRhcmdldE9mZnNldCA9IG1hdGNoUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgKyAyOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJCQkJbWF0Y2hSZWdpb24gPSAoKElET01Ob2RlKSBvKS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJCWlmIChtYXRjaFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJCQl0YXJnZXRPZmZzZXQgPSBtYXRjaFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgMTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICh0YXJnZXRPZmZzZXQgPj0gMCkgewotCQkJCQlnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obmV3IFRleHRTZWxlY3Rpb24odGFyZ2V0T2Zmc2V0LCAwKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb24jc2V0RWRpdG9yKG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yKElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gZ2V0VGV4dEVkaXRvcigpOwotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlyZW1vdmVBbm5vdGF0aW9uKHRydWUpOwotCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBzZWxlY3Rpb25Qcm92aWRlcikucmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmVXBkYXRlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNldEVkaXRvcihlZGl0b3IpOwotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgc2VsZWN0aW9uUHJvdmlkZXIpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlVwZGF0ZUxpc3RlbmVyKTsKLQkJCX0KLQotCQkJdXBkYXRlRm9yKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQotCX0KLQotCXZvaWQgdXBkYXRlRm9yKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKCk7Ci0JCWlmICh0ZXh0RWRpdG9yID09IG51bGwpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm8gZWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJRG9jdW1lbnRQcm92aWRlciBkb2N1bWVudFByb3ZpZGVyID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWlmIChkb2N1bWVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm8gZG9jdW1lbnQgcHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZG9jdW1lbnRQcm92aWRlci5nZXRBbm5vdGF0aW9uTW9kZWwodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJaWYgKGFubm90YXRpb25Nb2RlbCA9PSBudWxsIHx8ICEoYW5ub3RhdGlvbk1vZGVsIGluc3RhbmNlb2YgSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm8gYW5ub3RhdGlvbiBtb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IG9sZEFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJSXRlcmF0b3IgYW5ub3RhdGlvbkl0ZXJhdG9yID0gYW5ub3RhdGlvbk1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQl3aGlsZSAoYW5ub3RhdGlvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGFubm90YXRpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoQU5OT1RBVElPTl9UWVBFLmVxdWFscyhhbm5vdGF0aW9uLmdldFR5cGUoKSkpIHsKLQkJCQlhbm5vdGF0aW9uLm1hcmtEZWxldGVkKHRydWUpOwotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbW92aW5nICIgKyBhbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlvbGRBbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlNYXAgbmV3QW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1hdGNoUmVnaW9uID0gbnVsbDsKLQkJCQlpZiAoKChOb2RlKSBvKS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkJbyA9ICgoQXR0cikgbykuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJfQotCi0JCQkJUG9zaXRpb24gcFN0YXJ0ID0gbnVsbDsKLQkJCQlQb3NpdGlvbiBwRW5kID0gbnVsbDsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG87Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpIHsKLQkJCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQkJCQlwU3RhcnQgPSBuZXcgUG9zaXRpb24oc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbiksIG5hbWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJCW1hdGNoUmVnaW9uID0gKChJRE9NTm9kZSkgbykuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQlpZiAobWF0Y2hSZWdpb24gIT0gbnVsbCAmJiBtYXRjaFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpIHsKLQkJCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbWF0Y2hSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQkJCQlwRW5kID0gbmV3IFBvc2l0aW9uKG1hdGNoUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgewotCQkJCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJCQkJCXBFbmQgPSBuZXcgUG9zaXRpb24oZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCW1hdGNoUmVnaW9uID0gKChJRE9NTm9kZSkgbykuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQlpZiAobWF0Y2hSZWdpb24gIT0gbnVsbCAmJiBtYXRjaFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpIHsKLQkJCQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG1hdGNoUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJCQkJCXBTdGFydCA9IG5ldyBQb3NpdGlvbihtYXRjaFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocFN0YXJ0ICE9IG51bGwgJiYgcEVuZCAhPSBudWxsKSB7Ci0JCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uKGZhbHNlKTsKLQkJCQkJYW5ub3RhdGlvbi5zZXRUeXBlKEFOTk9UQVRJT05fVFlQRSk7Ci0JCQkJCW5ld0Fubm90YXRpb25zLnB1dChhbm5vdGF0aW9uLCBwU3RhcnQpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nICIgKyBhbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uKGZhbHNlKTsKLQkJCQkJYW5ub3RhdGlvbi5zZXRUeXBlKEFOTk9UQVRJT05fVFlQRSk7Ci0JCQkJCW5ld0Fubm90YXRpb25zLnB1dChhbm5vdGF0aW9uLCBwRW5kKTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkoKElBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24pIGFubm90YXRpb25Nb2RlbCkucmVwbGFjZUFubm90YXRpb25zKChBbm5vdGF0aW9uW10pIG9sZEFubm90YXRpb25zLnRvQXJyYXkobmV3IEFubm90YXRpb25bb2xkQW5ub3RhdGlvbnMuc2l6ZSgpXSksIG5ld0Fubm90YXRpb25zKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9NZW51QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvTWVudUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmM2NlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9NZW51QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLQotCi1wdWJsaWMgY2xhc3MgTWVudUJ1aWxkZXIgewotCi0KLQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGdldFNvcnRLZXkobzEpLCBnZXRTb3J0S2V5KG8yKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvcnRLZXkoT2JqZWN0IG8pIHsKLQkJCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG8gaW5zdGFuY2VvZiBJQWN0aW9uKSB7Ci0JCQkJSUFjdGlvbiBhY3Rpb24gPSAoSUFjdGlvbikgbzsKLQkJCQlyZXN1bHQgPSBhY3Rpb24uZ2V0VGV4dCgpOwotCQkJfQotCQkJLy8gZWxzZSBpZiAobyBpbnN0YW5jZW9mIE1lbnVEYXRhKQotCQkJLy8gewotCQkJLy8gcmVzdWx0ID0gInoiICsgKChNZW51RGF0YSlvKS5uYW1lOwotCQkJLy8gfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX07Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFscGhlYmV0aWNhbEdyb3VwaW5nKElNZW51TWFuYWdlciBtZW51LCBMaXN0IGFjdGlvbkxpc3QpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBhY3Rpb25MaXN0LnRvQXJyYXkoKTsKLQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJfQotCi0JCWludCBncm91cFNpemUgPSAxNTsKLQkJaW50IG1pbkdyb3VwU2l6ZSA9IDU7Ci0JCWludCBudW1iZXJPZkdyb3VwcyA9IChhcnJheS5sZW5ndGggLyBncm91cFNpemUpICsgKChhcnJheS5sZW5ndGggJSBncm91cFNpemUgPiBtaW5Hcm91cFNpemUpID8gMSA6IDApOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZHcm91cHM7IGkrKykgewotCQkJYm9vbGVhbiBpc0xhc3RHcm91cCA9IChpID09IChudW1iZXJPZkdyb3VwcyAtIDEpKTsKLQkJCWludCBmaXJzdEluZGV4ID0gaSAqIGdyb3VwU2l6ZTsKLQkJCWludCBsYXN0SW5kZXggPSBpc0xhc3RHcm91cCA/IGFycmF5Lmxlbmd0aCAtIDEgOiBpICogZ3JvdXBTaXplICsgZ3JvdXBTaXplIC0gMTsKLQkJCUFjdGlvbiBmaXJzdEFjdGlvbiA9IChBY3Rpb24pIGFycmF5W2ZpcnN0SW5kZXhdOwotCQkJQWN0aW9uIGxhc3RBY3Rpb24gPSAoQWN0aW9uKSBhcnJheVtsYXN0SW5kZXhdOwotCQkJTWVudU1hbmFnZXIgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcihmaXJzdEFjdGlvbi5nZXRUZXh0KCkgKyAiIC0gIiArIGxhc3RBY3Rpb24uZ2V0VGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudS5hZGQoc3VibWVudSk7Ci0JCQlmb3IgKGludCBqID0gZmlyc3RJbmRleDsgaiA8PSBsYXN0SW5kZXg7IGorKykgewotCQkJCXN1Ym1lbnUuYWRkKChBY3Rpb24pIGFycmF5W2pdKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgcG9wdWxhdGVNZW51KElNZW51TWFuYWdlciBtZW51LCBMaXN0IGFjdGlvbkxpc3QsIGJvb2xlYW4gY3JlYXRlVGllcmVkKSB7Ci0JCS8vIHNvcnQgdGhlIGFjdGlvbnMKLQkJaWYgKGFjdGlvbkxpc3Quc2l6ZSgpIDwgMjUpIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gYWN0aW9uTGlzdC50b0FycmF5KCk7Ci0JCQlpZiAoYXJyYXkubGVuZ3RoID4gMCkgewotCQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQltZW51LmFkZCgoQWN0aW9uKSBhcnJheVtpXSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQljcmVhdGVBbHBoZWJldGljYWxHcm91cGluZyhtZW51LCBhY3Rpb25MaXN0KTsKLQkJfQotCX0KLQotCS8qCi0JICogcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvcGVydHlHcm91cGluZyhJTWVudU1hbmFnZXIgbWVudSwgTGlzdAotCSAqIGFjdGlvbkxpc3QpIHsgTWVudURhdGFUYWJsZSBtZW51RGF0YVRhYmxlID0gbmV3IE1lbnVEYXRhVGFibGUoKTsKLQkgKiAKLQkgKiBmb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsgU3RyaW5nCi0JICogZ3JvdXBOYW1lID0gbnVsbDsgQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24paS5uZXh0KCk7IGlmIChhY3Rpb24KLQkgKiBpbnN0YW5jZW9mIE5vZGVBY3Rpb24pIHsgZ3JvdXBOYW1lID0KLQkgKiAoKE5vZGVBY3Rpb24pYWN0aW9uKS5nZXRHcm91cE5hbWUoKTsgfSBpZiAoZ3JvdXBOYW1lID09IG51bGwpIHsKLQkgKiBncm91cE5hbWUgPSAiIjsgfSBNZW51RGF0YSBtZW51RGF0YSA9Ci0JICogbWVudURhdGFUYWJsZS5sb29rdXBPckNyZWF0ZShncm91cE5hbWUsICIiKTsKLQkgKiBtZW51RGF0YS5jaGlsZExpc3QuYWRkKGFjdGlvbik7IH0gcG9wdWxhdGVNZW51KG1lbnUsCi0JICogbWVudURhdGFUYWJsZS5nZXRSb290KCkpOyB9Ci0JICogCi0JICogCi0JICogcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNZW51KE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBNZW51RGF0YSBtZW51RGF0YSkgewotCSAqIGZvciAoSXRlcmF0b3IgaSA9IG1lbnVEYXRhLmNoaWxkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JICogT2JqZWN0IG8gPSBpLm5leHQoKTsgaWYgKG8gaW5zdGFuY2VvZiBBY3Rpb24pIHsKLQkgKiBtZW51TWFuYWdlci5hZGQoKEFjdGlvbilvKTsgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgTWVudURhdGEpIHsKLQkgKiBNZW51RGF0YSBjaGlsZE1lbnVEYXRhID0gKE1lbnVEYXRhKW87IE1lbnVNYW5hZ2VyIGNoaWxkTWVudU1hbmFnZXIgPQotCSAqIG5ldyBNZW51TWFuYWdlcihjaGlsZE1lbnVEYXRhLm5hbWUpOyBtZW51TWFuYWdlci5hZGQoY2hpbGRNZW51TWFuYWdlcik7Ci0JICogcG9wdWxhdGVNZW51KGNoaWxkTWVudU1hbmFnZXIsIGNoaWxkTWVudURhdGEpOyB9IH0gfQotCSAqIAotCSAqIAotCSAqIHB1YmxpYyBNZW51RGF0YVRhYmxlIHsgcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkgKiBwcm90ZWN0ZWQgTWVudURhdGEgcm9vdDsKLQkgKiAKLQkgKiBwdWJsaWMgTWVudURhdGFUYWJsZSgpIHsgcm9vdCA9IGxvb2t1cE9yQ3JlYXRlTWVudURhdGEobnVsbCwgbnVsbCk7IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgTWVudURhdGEgbG9va3VwTWVudURhdGEoU3RyaW5nIG5hbWUpIHsgU3RyaW5nIGtleSA9IG5hbWUgIT0KLQkgKiBudWxsID8gbmFtZSA6ICIiOyByZXR1cm4gKE1lbnVEYXRhKW1lbnVEYXRhVGFibGUuZ2V0KGtleSk7IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgTWVudURhdGEgbG9va3VwT3JDcmVhdGVNZW51RGF0YShTdHJpbmcgbmFtZSwgU3RyaW5nCi0JICogcGFyZW50TmFtZSkgeyBTdHJpbmcga2V5ID0gbmFtZSAhPSBudWxsID8gbmFtZSA6ICIiOyBNZW51RGF0YSBtZW51RGF0YSA9Ci0JICogKE1lbnVEYXRhKW1lbnVEYXRhVGFibGUuZ2V0KGtleSk7IGlmIChtZW51RGF0YSA9PSBudWxsKSB7IG1lbnVEYXRhID0KLQkgKiBuZXcgTWVudURhdGEobmFtZSwgcGFyZW50TmFtZSk7IG1lbnVEYXRhVGFibGUucHV0KGtleSwgbWVudURhdGEpOyB9Ci0JICogcmV0dXJuIG1lbnVEYXRhOyB9Ci0JICogCi0JICogcHVibGljIE1lbnVEYXRhIGdldFJvb3QoKSB7IHJldHVybiByb290OyB9IH0KLQkgKiAKLQkgKiAKLQkgKiBwcm90ZWN0ZWQgY2xhc3MgTWVudURhdGEgeyBwdWJsaWMgU3RyaW5nIG5hbWU7IHB1YmxpYyBTdHJpbmcKLQkgKiBwYXJlbnROYW1lOyBwdWJsaWMgTGlzdCBjaGlsZExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JICogCi0JICogTWVudURhdGEoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJlbnROYW1lKSB7IHRoaXMubmFtZSA9IG5hbWU7Ci0JICogdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsgfQotCSAqIAotCSAqIHByb3RlY3RlZCB2b2lkIHNvcnQoKSB7IE9iamVjdFtdIGFycmF5ID0gY2hpbGRMaXN0LnRvQXJyYXkoKTsgaWYKLQkgKiAoYXJyYXkubGVuZ3RoID4gMCApIHsgQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOyB9IGNoaWxkTGlzdCA9Ci0JICogQXJyYXlzLmFzTGlzdChhcnJheSk7Ci0JICogCi0JICogZm9yIChJdGVyYXRvciBpID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsgT2JqZWN0IG8gPQotCSAqIGkubmV4dCgpOyBpZiAobyBpbnN0YW5jZW9mIE1lbnVEYXRhKSB7ICgoTWVudURhdGEpbykuc29ydCgpOyB9IH0gfSB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Ob2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Ob2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NzRlOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNvcnRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvUmVtb3ZlQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczZTVmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogUmVtb3ZlIGJsb2NrIGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlIHsKLQotCXZvaWQgcHJvY2Vzc0FjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJCQlpZiAoKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9PSBudWxsKSB8fCAoc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9PSBudWxsKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBPUEVOX0NPTU1FTlQubGVuZ3RoKCkgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpOwotCi0JCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgWE1MVUlNZXNzYWdlcy5SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCk7Ci0JCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQl0cnkgewotCQkJCQlpZiAodGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpIHsKLQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0KLQkJCQkJCWlmIChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpIHsKLQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLlJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLlJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXBsYWNlUHJlZml4QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXBsYWNlUHJlZml4QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NzE5YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvUmVwbGFjZVByZWZpeEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVByZWZpeEFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCi0JY2xhc3MgTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yIGV4dGVuZHMgRE9NVmlzaXRvciB7Ci0JCXB1YmxpYyBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmVmaXhDaGFuZ2VkTmVlZGVkKE5vZGUgbm9kZSkgewotCQkJU3RyaW5nIGtleSA9IG5vZGUuZ2V0UHJlZml4KCkgIT0gbnVsbCA/IG5vZGUuZ2V0UHJlZml4KCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHByZWZpeE1hcHBpbmcuZ2V0KGtleSkgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHZpc2l0QXR0cihBdHRyIGF0dHIpIHsKLQkJCS8qCi0JCQkgKiBpZiAoaXNQcmVmaXhDaGFuZ2VkTmVlZGVkKGVsZW1lbnQpKSB7IGxpc3QuYWRkKGF0dHIpOyB9Ci0JCQkgKi8KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQkJCWlmIChpc1ByZWZpeENoYW5nZWROZWVkZWQoZWxlbWVudCkpIHsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcjsKLQlwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIE1hcCBwcmVmaXhNYXBwaW5nOwotCi0JcHVibGljIFJlcGxhY2VQcmVmaXhBY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBFbGVtZW50IGVsZW1lbnQsIE1hcCBwcmVmaXhNYXBwaW5nKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucHJlZml4TWFwcGluZyA9IHByZWZpeE1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yIHZpc2l0b3IgPSBuZXcgTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yKCk7Ci0JCXZpc2l0b3IudmlzaXROb2RlKGVsZW1lbnQpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSB2aXNpdG9yLmxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gbm9kZS5nZXRQcmVmaXgoKSAhPSBudWxsID8gbm9kZS5nZXRQcmVmaXgoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmV3UHJlZml4ID0gKFN0cmluZykgcHJlZml4TWFwcGluZy5nZXQoa2V5KTsKLQkJCWlmIChuZXdQcmVmaXggIT0gbnVsbCkgewotCQkJCW5vZGUuc2V0UHJlZml4KG5ld1ByZWZpeCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TaWJsaW5nTmF2aWdhdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvU2libGluZ05hdmlnYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4YjQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TaWJsaW5nTmF2aWdhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFByb3ZpZGVzIG5hdmlnYXRpb24gdG8gbmV4dC9wcmV2aW91cyBET00gc2libGluZyBOb2RlcwotICogCi0gKiBAYXV0aG9yIG5pdGluCi0gKiAKLSAqLwotY2xhc3MgU2libGluZ05hdmlnYXRpb25BY3Rpb24gZXh0ZW5kcyBUZXh0RWRpdG9yQWN0aW9uIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmRm9yd2FyZDsKLQotCS8qKgotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCVNpYmxpbmdOYXZpZ2F0aW9uQWN0aW9uKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHByZWZpeCwgSVRleHRFZGl0b3IgZWRpdG9yLCBib29sZWFuIGZvcndhcmQpIHsKLQkJc3VwZXIoYnVuZGxlLCBwcmVmaXgsIGVkaXRvcik7Ci0JCWZGb3J3YXJkID0gZm9yd2FyZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotCQlzdXBlci5ydW5XaXRoRXZlbnQoZXZlbnQpOwotCQlpZiAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlOb2RlIHNpYmxpbmcgPSBudWxsOwotCi0JCQkJaWYgKCgoTm9kZSkgbykuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJCW8gPSAoKEF0dHIpIG8pLmdldE93bmVyRWxlbWVudCgpOwotCQkJCX0KLQkJCQlpZiAoZkZvcndhcmQpIHsKLQkJCQkJc2libGluZyA9ICgoTm9kZSkgbykuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgc2libGluZy5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCQlpZiAoc2libGluZyA9PSBudWxsKSB7Ci0JCQkJCQlzaWJsaW5nID0gKChOb2RlKSBvKS5nZXRQYXJlbnROb2RlKCkuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgc2libGluZy5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBzaWJsaW5nLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlzaWJsaW5nID0gc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJfQotCQkJCQlpZiAoc2libGluZyA9PSBudWxsKSB7Ci0JCQkJCQlzaWJsaW5nID0gKChOb2RlKSBvKS5nZXRQYXJlbnROb2RlKCkuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBzaWJsaW5nLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUaGUgb25seSBjaGlsZCBpcyBhIFRleHQgTm9kZSwgZ28gdG8gdGhlIHBhcmVudCBOb2RlCi0JCQkJaWYgKCgoTm9kZSkgbykuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBvLmVxdWFscyhzaWJsaW5nKSkgewotCQkJCQlzaWJsaW5nID0gKChOb2RlKSBvKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCi0KLQkJCQlpZiAoc2libGluZyAhPSBudWxsKSB7Ci0JCQkJCWdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzaWJsaW5nKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb24jdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1RvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ4MWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1RvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogVG9nZ2xlIGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdENvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5Ub2dnbGVDb21tZW50X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCS8vIGdldCB0ZXh0IHNlbGVjdGlvbiBsaW5lcyBpbmZvCi0JCWludCBzZWxlY3Rpb25TdGFydExpbmUgPSB0ZXh0U2VsZWN0aW9uLmdldFN0YXJ0TGluZSgpOwotCQlpbnQgc2VsZWN0aW9uRW5kTGluZSA9IHRleHRTZWxlY3Rpb24uZ2V0RW5kTGluZSgpOwotCQl0cnkgewotCQkJaW50IHNlbGVjdGlvbkVuZExpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHNlbGVjdGlvbkVuZExpbmUpOwotCQkJaW50IHNlbGVjdGlvbkVuZE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCQkvLyBhZGp1c3Qgc2VsZWN0aW9uIGVuZCBsaW5lCi0JCQlpZiAoKHNlbGVjdGlvbkVuZExpbmUgPiBzZWxlY3Rpb25TdGFydExpbmUpICYmIChzZWxlY3Rpb25FbmRMaW5lT2Zmc2V0ID09IHNlbGVjdGlvbkVuZE9mZnNldCkpIHsKLQkJCQlzZWxlY3Rpb25FbmRMaW5lLS07Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJLy8gc2F2ZSB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uIHNpbmNlIGl0IHdpbGwgYmUgY2hhbmdpbmcKLQkJUG9zaXRpb24gc2VsZWN0aW9uUG9zaXRpb24gPSBudWxsOwotCQlib29sZWFuIHVwZGF0ZVN0YXJ0T2Zmc2V0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25Qb3NpdGlvbiA9IG5ldyBQb3NpdGlvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCWRvY3VtZW50LmFkZFBvc2l0aW9uKHNlbGVjdGlvblBvc2l0aW9uKTsKLQotCQkJLy8gZXh0cmEgY2hlY2sgaWYgY29tbWVudGluZyBmcm9tIGJlZ2lubmluZyBvZiBsaW5lCi0JCQlpbnQgc2VsZWN0aW9uU3RhcnRMaW5lT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzZWxlY3Rpb25TdGFydExpbmUpOwotCQkJaWYgKCh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID4gMCkgJiYgKHNlbGVjdGlvblN0YXJ0TGluZU9mZnNldCA9PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKSAmJiAhaXNDb21tZW50TGluZShkb2N1bWVudCwgc2VsZWN0aW9uU3RhcnRMaW5lKSkgewotCQkJCXVwZGF0ZVN0YXJ0T2Zmc2V0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJcHJvY2Vzc0FjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uU3RhcnRMaW5lLCBzZWxlY3Rpb25FbmRMaW5lKTsKLQotCQl1cGRhdGVDdXJyZW50U2VsZWN0aW9uKHNlbGVjdGlvblBvc2l0aW9uLCBkb2N1bWVudCwgdXBkYXRlU3RhcnRPZmZzZXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IHNlbGVjdGlvblN0YXJ0TGluZSwgaW50IHNlbGVjdGlvbkVuZExpbmUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLlRvZ2dsZUNvbW1lbnRfdG9vbHRpcCk7Ci0JCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gc2VsZWN0aW9uU3RhcnRMaW5lOyBpIDw9IHNlbGVjdGlvbkVuZExpbmU7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGRvY3VtZW50LmdldExpbmVMZW5ndGgoaSkgPiAwKSB7Ci0JCQkJCQkJaWYgKGlzQ29tbWVudExpbmUoZG9jdW1lbnQsIGkpKSB7Ci0JCQkJCQkJCWludCBsaW5lT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChpKTsKLQkJCQkJCQkJSVJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJCQkJCVN0cmluZyBzdHJpbmcgPSBkb2N1bWVudC5nZXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCQlpbnQgb3BlbkNvbW1lbnRPZmZzZXQgPSBsaW5lT2Zmc2V0ICsgc3RyaW5nLmluZGV4T2YoT1BFTl9DT01NRU5UKTsKLQkJCQkJCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IGxpbmVPZmZzZXQgKyBzdHJpbmcuaW5kZXhPZihDTE9TRV9DT01NRU5UKSAtIE9QRU5fQ09NTUVOVC5sZW5ndGgoKTsKLQkJCQkJCQkJdW5jb21tZW50KGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCwgY2xvc2VDb21tZW50T2Zmc2V0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoaSk7Ci0JCQkJCQkJCWludCBsaW5lRGVsaW1pdGVyTGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKSA9PSBudWxsID8gMCA6IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoaSkubGVuZ3RoKCk7Ci0JCQkJCQkJCWludCBjbG9zZUNvbW1lbnRPZmZzZXQgPSBvcGVuQ29tbWVudE9mZnNldCArIGRvY3VtZW50LmdldExpbmVMZW5ndGgoaSkgLSBsaW5lRGVsaW1pdGVyTGVuZ3RoICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJCQkJCQljb21tZW50KGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCwgY2xvc2VDb21tZW50T2Zmc2V0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRMaW5lKElEb2N1bWVudCBkb2N1bWVudCwgaW50IGxpbmUpIHsKLQkJYm9vbGVhbiBpc0NvbW1lbnQgPSBmYWxzZTsKLQotCQl0cnkgewotCQkJSVJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obGluZSk7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZG9jdW1lbnQuZ2V0KHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKS50cmltKCk7Ci0JCQlpc0NvbW1lbnQgPSAoc3RyaW5nLmxlbmd0aCgpID49IE9QRU5fQ09NTUVOVC5sZW5ndGgoKSArIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpICYmIHN0cmluZy5zdGFydHNXaXRoKE9QRU5fQ09NTUVOVCkgJiYgc3RyaW5nLmVuZHNXaXRoKENMT1NFX0NPTU1FTlQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGlzQ29tbWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tbWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvcGVuQ29tbWVudE9mZnNldCwgaW50IGNsb3NlQ29tbWVudE9mZnNldCkgewotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgMCwgT1BFTl9DT01NRU5UKTsKLQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCAwLCBDTE9TRV9DT01NRU5UKTsKLQkJCXJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgY2xvc2VDb21tZW50T2Zmc2V0IC0gb3BlbkNvbW1lbnRPZmZzZXQgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuY29tbWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvcGVuQ29tbWVudE9mZnNldCwgaW50IGNsb3NlQ29tbWVudE9mZnNldCkgewotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb24oUG9zaXRpb24gc2VsZWN0aW9uUG9zaXRpb24sIElEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiB1cGRhdGVTdGFydE9mZnNldCkgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkvLyB1cGRhdGUgdGhlIHNlbGVjdGlvbiBpZiB0ZXh0IHNlbGVjdGlvbiBjaGFuZ2VkCi0JCQlpZiAoc2VsZWN0aW9uUG9zaXRpb24gIT0gbnVsbCkgewotCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJaWYgKHVwZGF0ZVN0YXJ0T2Zmc2V0KSB7Ci0JCQkJCXNlbGVjdGlvbiA9IG5ldyBUZXh0U2VsZWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRPZmZzZXQoKSAtIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0TGVuZ3RoKCkgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24oZG9jdW1lbnQsIHNlbGVjdGlvblBvc2l0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9ICgoSVRleHRFZGl0b3IpIGZFZGl0b3IpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcHJvdmlkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJCWRvY3VtZW50LnJlbW92ZVBvc2l0aW9uKHNlbGVjdGlvblBvc2l0aW9uKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDE2Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBdXRvRWRpdFN0cmF0ZWd5IHRvIGhhbmRsZSBjaGFyYWN0ZXJzIGluc2VydGVkIHdoZW4gVGFiIGtleSBpcyBwcmVzc2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUQUJfQ0hBUkFDVEVSID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gaWYgbm90IGluIHNtYXJ0IGluc2VydCBtb2RlIGp1c3QgaWdub3JlCi0JCWlmICghaXNTbWFydEluc2VydE1vZGUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gc3BhY2VzIGZvciB0YWIgY2hhcmFjdGVyCi0JCWlmICgoY29tbWFuZC5sZW5ndGggPT0gMCkgJiYgKGNvbW1hbmQudGV4dCAhPSBudWxsKSAmJiAoY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCkgJiYgKGNvbW1hbmQudGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpICE9IC0xKSkgewotCQkJc21hcnRJbnNlcnRGb3JUYWIoY29tbWFuZCwgZG9jdW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHNwYWNlcyBmb3IgdGFicwotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yVGFiKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gdGFiIGtleSB3YXMgcHJlc3NlZC4gbm93IGNoZWNrIHByZWZlcmVuY2VzIHRvIHNlZSBpZiBuZWVkIHRvIGluc2VydAotCQkvLyBzcGFjZXMgaW5zdGVhZCBvZiB0YWIKLQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBnZXRJbmRlbnRhdGlvbldpZHRoKCk7Ci0JCWlmIChpbmRlbnRhdGlvbldpZHRoID4gLTEpIHsKLQkJCVN0cmluZyBvcmlnaW5hbFRleHQgPSBjb21tYW5kLnRleHQ7Ci0JCQlTdHJpbmdCdWZmZXIgbmV3VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIob3JpZ2luYWxUZXh0KTsKLQotCQkJLy8gZGV0ZXJtaW5lIHdoZXJlIGluIGxpbmUgdGhpcyBjb21tYW5kIGJlZ2lucwotCQkJaW50IGxpbmVPZmZzZXQgPSAtMTsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGNvbW1hbmQub2Zmc2V0KTsKLQkJCQlsaW5lT2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgLSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCi0JCQlJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBnZXRMaW5lVHJhY2tlcihkb2N1bWVudCwgb3JpZ2luYWxUZXh0KTsKLQotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJaW50IGluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudFN0cmluZyhpbmRlbnRhdGlvbldpZHRoLCBsaW5lT2Zmc2V0LCBsaW5lVHJhY2tlciwgaW5kZXgpOwotCi0JCQkJLy8gcmVwbGFjZSBcdCBjaGFyYWN0ZXIgd2l0aCBzcGFjZXMKLQkJCQluZXdUZXh0LnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSwgaW5kZW50KTsKLQkJCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZVRyYWNrZXIucmVwbGFjZShpbmRleCwgMSwgaW5kZW50KTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCByZXBsYWNpbmcgdGV4dCwganVzdAotCQkJCQkJLy8gcmVzZXQgdG8gY3VycmVudCBzdHJpbmcKLQkJCQkJCWxpbmVUcmFja2VyLnNldChuZXdUZXh0LnRvU3RyaW5nKCkpOwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3RhcnRJbmRleCA9IGluZGV4ICsgaW5kZW50Lmxlbmd0aCgpOwotCQkJCWluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIsIHN0YXJ0SW5kZXgpOwotCQkJfQotCQkJY29tbWFuZC50ZXh0ID0gbmV3VGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIG51bWJlciBvZiBzcGFjZXMgZm9yIG5leHQgdGFiIHN0b3AKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudGF0aW9uV2lkdGgsIGludCBsaW5lT2Zmc2V0LCBJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIsIGludCBpbmRleCkgewotCQlpbnQgaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGg7Ci0JCWludCBvZmZzZXRJbkxpbmUgPSAtMTsKLQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGxpbmVUcmFja2VyLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGluZGV4KTsKLQkJCQlpZiAoKGxpbmVJbmZvLmdldE9mZnNldCgpID09IDApICYmIChsaW5lT2Zmc2V0ID4gLTEpKSB7Ci0JCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW9mZnNldEluTGluZSA9IGluZGV4IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobGluZU9mZnNldCA+IC0xKSB7Ci0JCQkJb2Zmc2V0SW5MaW5lID0gbGluZU9mZnNldCArIGluZGV4OwotCQkJfQotCQl9Ci0JCWlmICgob2Zmc2V0SW5MaW5lID4gLTEpICYmIChpbmRlbnRhdGlvbldpZHRoID4gMCkpIHsKLQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCQkJaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGggLSByZW1haW5kZXI7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudFNpemU7IGkrKykgewotCQkJaW5kZW50LmFwcGVuZCgnICcpOwotCQl9Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYSBsaW5lIHRyYWNrZXIgZm9yIHRleHQgd2l0aGluIGNvbW1hbmQgaWYgdGV4dCBpcyBtdWx0aS1saW5lCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0TGluZVRyYWNrZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgb3JpZ2luYWxUZXh0KSB7Ci0JCUNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gbnVsbDsKLQkJaW50W10gZGVsaW1zID0gVGV4dFV0aWxpdGllcy5pbmRleE9mKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgb3JpZ2luYWxUZXh0LCAwKTsKLQkJaWYgKChkZWxpbXNbMF0gIT0gLTEpIHx8IChkZWxpbXNbMV0gIT0gLTEpKSB7Ci0JCQlsaW5lVHJhY2tlciA9IG5ldyBDb25maWd1cmFibGVMaW5lVHJhY2tlcihkb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkpOwotCQkJbGluZVRyYWNrZXIuc2V0KG9yaWdpbmFsVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIGxpbmVUcmFja2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFjdGl2ZSBlZGl0b3IgaXMgaW4gc21hcnQgaW5zZXJ0IG1vZGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSgpIHsKLQkJYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSA9IGZhbHNlOwotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBzbWFydCBpbnNlcnQgbW9kZQotCQlpZiAoKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMpICYmICgoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKSB7Ci0JCQlpc1NtYXJ0SW5zZXJ0TW9kZSA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGlzU21hcnRJbnNlcnRNb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5kZW50YXRpb24gd2lkdGggaWYgdXNpbmcgc3BhY2VzIGZvciBpbmRlbnRhdGlvbiwgLTEgb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwcml2YXRlIGludCBnZXRJbmRlbnRhdGlvbldpZHRoKCkgewotCQlpbnQgd2lkdGggPSAtMTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCXdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCX0KLQotCQlyZXR1cm4gd2lkdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5WE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2MTllNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQXV0b21hdGljYWxseSBpbnNlcnRzIGNsb3NpbmcgY29tbWVudCB0YWcgb3IgZW5kIHRhZyB3aGVuIGFwcHJvcHJpYXRlLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUwgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JLyoKLQkgKiBOT1RFOiBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdHMgaW4KLQkgKiBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmF1dG9lZGl0Ci0JICogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlPYmplY3QgdGV4dEVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKCEoKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMpICYmICgoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoY29tbWFuZC50ZXh0ICE9IG51bGwpIHsKLQkJCQkJc21hcnRJbnNlcnRGb3JDb21tZW50KGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJCXNtYXJ0SW5zZXJ0Rm9yRW5kVGFnKGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJCXNtYXJ0UmVtb3ZlRW5kVGFnKGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNQcmVmZXJlbmNlRW5hYmxlZChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoa2V5ICE9IG51bGwgJiYgWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKChub2RlICE9IG51bGwpICYmIChub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpICYmICgoSURPTUVsZW1lbnQpIG5vZGUpLmlzQ29tbWVudFRhZygpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSk7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gY2xlYW4gdXAgYW4gZW5kLXRhZyBpZiBhIHN0YXJ0LXRhZyBpcyBjb252ZXJ0ZWQgaW50byBhbiBlbXB0eS1lbGVtZW50Ci0JICogdGFnIChlLmcuLCA8bm9kZSAvPikgYW5kIHRoZSBvcmlnaW5hbCBlbGVtZW50IHdhcyBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZCB0aGUgZG9jdW1lbnQgY29tbWFuZCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRoYXQgd2lsbCBiZSBjaGFuZ2VkCi0JICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCBiYXNlZCBvbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRSZW1vdmVFbmRUYWcoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJLy8gQW4gb3BlbmluZyB0YWcgaXMgbm93IGEgc2VsZi10ZXJtaW5hdGVkIGVuZC10YWcKLQkJCWlmICgiLyIuZXF1YWxzKGNvbW1hbmQudGV4dCkgJiYgIj4iLmVxdWFscyhkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQsIDEpKSAmJiBpc1ByZWZlcmVuY2VFbmFibGVkKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQpOwotCQkJCWlmIChub2RlICE9IG51bGwgJiYgIW5vZGUuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmlzRW5kZWQoKSkKLQkJCQkJCWRvY3VtZW50LnJlcGxhY2UocmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yQ29tbWVudChEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiLSIpICYmIChkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSAzKSAmJiBkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQgLSAzLCAzKS5lcXVhbHMoIjwhLSIpICYmIGlzUHJlZmVyZW5jZUVuYWJsZWQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQljb21tYW5kLnRleHQgKz0gIiAgLS0+IjsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbW1hbmQuc2hpZnRzQ2FyZXQgPSBmYWxzZTsKLQkJCQljb21tYW5kLmNhcmV0T2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgKyAyOwotCQkJCWNvbW1hbmQuZG9pdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JFbmRUYWcoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIi8iKSAmJiAoZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPj0gMSkgJiYgZG9jdW1lbnQuZ2V0KGNvbW1hbmQub2Zmc2V0IC0gMSwgMSkuZXF1YWxzKCI8IikgJiYgaXNQcmVmZXJlbmNlRW5hYmxlZChYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpICgoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQgLSAxKSkuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChpc0NvbW1lbnROb2RlKHBhcmVudE5vZGUpKSB7Ci0JCQkJCS8vIGxvb3AgYW5kIGZpbmQgbm9uIGNvbW1lbnQgbm9kZSBwYXJlbnQKLQkJCQkJd2hpbGUgKChwYXJlbnROb2RlICE9IG51bGwpICYmIGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFpc0RvY3VtZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkvLyBvbmx5IGFkZCBlbmQgdGFnIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9yIGlmCi0JCQkJCS8vIGFkZCAnLycgZG9lcyBub3QgY3JlYXRlIG9uZSBhbHJlYWR5Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcGFyZW50Tm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgdG9BZGQgPSBuZXcgU3RyaW5nQnVmZmVyKHBhcmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQlpZiAodG9BZGQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdG9BZGQuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgc3VmZml4ID0gdG9BZGQudG9TdHJpbmcoKTsKLQkJCQkJCQlpZiAoKGRvY3VtZW50LmdldExlbmd0aCgpIDwgY29tbWFuZC5vZmZzZXQgKyBzdWZmaXgubGVuZ3RoKCkpIHx8ICghc3VmZml4LmVxdWFscyhkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQsIHN1ZmZpeC5sZW5ndGgoKSkpKSkgewotCQkJCQkJCQljb21tYW5kLnRleHQgKz0gc3VmZml4OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWN0aXZlVGV4dEVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJfQotCQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiB0ZXh0RWRpdG9yOwotCQkJCQl9Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDRhZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkF0dHJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuQ01JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvLk1hcmt1cFRhZ0luZm9Qcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IsIElSZWxlYXNhYmxlIHsKLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX0NMT1NFID0gIkpTUF9ESVJFQ1RJVkVfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX05BTUUgPSAiSlNQX0RJUkVDVElWRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMRVJST1IgPSBYTUxVSU1lc3NhZ2VzLlNFVkVSRV9pbnRlcm5hbF9lcnJvcl9vY2N1X1VJXzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0FUVFIgPSBYTUxVSU1lc3NhZ2VzLk5vX2tub3duX2F0dHJpYnV0ZV9fVUlfOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fQ09OVEVYVCA9IFhNTFVJTWVzc2FnZXMuQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfOwotCXByb3RlY3RlZCBjaGFyIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQlwcm90ZWN0ZWQgY2hhciBjb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnNbXSA9IG51bGw7Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlciBmQXR0cmlidXRlSW5mb1Byb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciBmQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBmR2VuZXJhdG9yOwotCS8vIHByb3RlY3RlZCBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCXByb3RlY3RlZCBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZkluZm9Qcm92aWRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIElUZXh0Vmlld2VyIGZUZXh0Vmlld2VyID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBzaG93VmFsdWVzID0gdHJ1ZTsKLQotCXB1YmxpYyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIHJldHJpZXZlIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihub2RlKTsKLQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyaWJ1dGVzKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgbm9kZSwgZWxlbWVudERlY2wsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCVN0cmluZyBtYXRjaFN0cmluZyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCk7Ci0KLQkJCS8vIGNoZWNrIHdoZXRoZXIgYW4gYXR0cmlidXRlIHJlYWxseSBleGlzdHMgZm9yIHRoZSByZXBsYWNlbWVudAotCQkJLy8gb2Zmc2V0cyBBTkQgaWYgaXQgcG9zc2Vzc2VzIGEgdmFsdWUKLQkJCWJvb2xlYW4gYXR0ckF0TG9jYXRpb25IYXNWYWx1ZSA9IGZhbHNlOwotCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlBdHRySW1wbCBleGlzdGluZ0F0dHIgPSAoQXR0ckltcGwpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJSVRleHRSZWdpb24gbmFtZSA9IGV4aXN0aW5nQXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0KLQkJCQlpZiAoKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpIDw9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKSAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSkgKyBuYW1lLmdldExlbmd0aCgpID49IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICsgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSkgJiYgKGV4aXN0aW5nQXR0ci5nZXRWYWx1ZVJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQkJCWF0dHJBdExvY2F0aW9uSGFzVmFsdWUgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9ubHkgYWRkIHByb3Bvc2FscyBmb3IgdGhlIGF0dHJpYnV0ZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aAotCQkJLy8gdGhlIG1hdGNoc3RyaW5nCi0JCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0KLQkJCQkJaW50IGlzUmVxdWlyZWQgPSAwOwotCQkJCQlpZiAoYXR0ckRlY2wuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCQlpc1JlcXVpcmVkID0gWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfUkVRVUlSRUQ7Ci0JCQkJCX0KLQotCQkJCQlib29sZWFuIHNob3dBdHRyaWJ1dGUgPSB0cnVlOwotCQkJCQlzaG93QXR0cmlidXRlID0gc2hvd0F0dHJpYnV0ZSAmJiBiZWdpbnNXaXRoKGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCksIG1hdGNoU3RyaW5nLnRyaW0oKSk7Ci0JCQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpKTsKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIgIT0gbnVsbCA/IGF0dHIuZ2V0TmFtZVJlZ2lvbigpIDogbnVsbDsKLQkJCQkJLy8gbmFtZVJlZ2lvbi5nZXRFbmRPZmZzZXQoKSArIDEgaXMgcmVxdWlyZWQgdG8gYWxsb3cgZm9yCi0JCQkJCS8vIG1hdGNoZXMgYWdhaW5zdCB0aGUgZnVsbCBuYW1lIG9mIGFuIGV4aXN0aW5nIEF0dHIKLQkJCQkJc2hvd0F0dHJpYnV0ZSA9IHNob3dBdHRyaWJ1dGUgJiYgKChhdHRyID09IG51bGwpIHx8ICgobmFtZVJlZ2lvbiAhPSBudWxsKSAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbikgPD0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpICYmIChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSArIG5hbWVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgKyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpKSkpOwotCQkJCQlpZiAoc2hvd0F0dHJpYnV0ZSkgewotCQkJCQkJSW1hZ2UgYXR0ckltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoYXR0ckRlY2wpOwotCQkJCQkJaWYgKGF0dHJJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKGlzUmVxdWlyZWQgPiAwKSB7Ci0JCQkJCQkJCWF0dHJJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUX1JFUV9PQkopOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJYXR0ckltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dHJEZWNsKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJCQkvLyBhdHRyaWJ1dGUgaXMgYXQgdGhpcyBsb2NhdGlvbiBhbmQgYWxyZWFkeSBleGlzdHMKLQkJCQkJCWlmIChhdHRyQXRMb2NhdGlvbkhhc1ZhbHVlKSB7Ci0JCQkJCQkJLy8gb25seSBwcm9wb3NlIHRoZSBuYW1lCi0JCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKTsKLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBhdHRySW1hZ2UsIHByb3Bvc2VkVGV4dCwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX05BTUUgKyBpc1JlcXVpcmVkLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCS8vIG5vIGF0dHJpYnV0ZSBleGlzdHMgb3IgaXMgZWxzZXdoZXJlLCBnZW5lcmF0ZQotCQkJCQkJLy8gbWluaW1hbGx5Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlBdHRyIGV4aXN0aW5nQXR0ck5vZGUgPSAoQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCkpOwotCQkJCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCQkJCQkJaWYgKGV4aXN0aW5nQXR0ck5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQl2YWx1ZSA9IGV4aXN0aW5nQXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkVGV4dChub2RlLCBhdHRyRGVjbCk7Ci0JCQkJCQkJfQotCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBhdHRyRGVjbC5nZXROb2RlTmFtZSgpLmxlbmd0aCgpICsgMiwgYXR0ckltYWdlLAotCQkJCQkJCS8vIGlmIHRoZSB2YWx1ZSBpc24ndCBlbXB0eSAobm8gZW1wdHkgc2V0IG9mCi0JCQkJCQkJCQkJLy8gcXVvdGVzKSwgc2hvdyBpdAotCQkJCQkJCS8vIEJVRyAyMDM0OTQsIGNvbnRlbnQgc3RyaW5ncyBtYXkgaGF2ZSAiIiwgYnV0IG5vdCBiZSBlbXB0eQotCQkJCQkJCS8vIEFuIGVtcHR5IHN0cmluZyBpcyB3aGVuIHRoZXJlJ3Mgbm8gY29udGVudCBiZXR3ZWVuIGRvdWJsZSBxdW90ZXMKLQkJCQkJCQkvLyBhbmQgdGhlcmUgaXMgbm8gc2luZ2xlIHF1b3RlIHRoYXQgbWF5IGJlIGVuY2FzaW5nIGEgZG91YmxlIHF1b3RlCi0JCQkJCQkJCQkJKHNob3dWYWx1ZXMgJiYgKHByb3Bvc2VkVGV4dC5sYXN0SW5kZXhPZignXCInKSAtIHByb3Bvc2VkVGV4dC5pbmRleE9mKCdcIicpID09ICAxICYmIHByb3Bvc2VkVGV4dC5pbmRleE9mKCdcJycpID09IC0xKSkgPyBnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpIDogcHJvcG9zZWRUZXh0LAotCQkJCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9OQU1FICsgaXNSZXF1aXJlZCk7Ci0JCQkJCQl9Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbGVtZW50X19pc191bmtub3duLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCi0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQotCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgcmVnaW9uIGFuZCBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZAotCQkvLyBoYXZlIGEgdmFsdWUgcHJvcG9zZWQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpKTsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIHRoZSBuYW1lIHJlZ2lvbiBpcyBSRVFVSVJFRCB0byBkbyBhbnl0aGluZyB1c2VmdWwKLQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gUmV0cmlldmUgdGhlIGRlY2xhcmF0aW9uCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCi0JCQkvLyBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG5hbWVSZWdpb24uZ2V0VGV4dCgpOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBvcGVuLmdldFRleHQobmFtZVJlZ2lvbik7Ci0KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBudWxsOwotCi0JCQkvLyBObyBDTUVsZW1lbnREZWNsYXJhdGlvbiBtZWFucyBubyBhdHRyaWJ1dGUgbWV0YWRhdGEsIGJ1dAotCQkJLy8gcmV0cmlldmUgdGhlCi0JCQkvLyBkZWNsYXJhdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZSBvdGhlcndpc2UKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyaWJ1dGVzKSB7Ci0JCQkJCXByaXZhdGUgTWFwIGNhc2VJbnNlbnNpdGl2ZTsKLQkJCQkJCi0JCQkJCXByaXZhdGUgTWFwIGdldENhc2VJbnNlbnNpdGl2ZU1hcCgpIHsKLQkJCQkJCWlmKGNhc2VJbnNlbnNpdGl2ZSA9PSBudWxsKQotCQkJCQkJCWNhc2VJbnNlbnNpdGl2ZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlyZXR1cm4gY2FzZUluc2Vuc2l0aXZlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCQkJCUNNTm9kZSBub2RlID0gc3VwZXIuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCQkJCW5vZGUgPSAoQ01Ob2RlKSBnZXRDYXNlSW5zZW5zaXRpdmVNYXAoKS5nZXQobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBub2RlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcHV0KENNTm9kZSBjbU5vZGUpIHsKLQkJCQkJCXN1cGVyLnB1dChjbU5vZGUpOwotCQkJCQkJZ2V0Q2FzZUluc2Vuc2l0aXZlTWFwKCkucHV0KGNtTm9kZS5nZXROb2RlTmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyksIGNtTm9kZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCQlTdHJpbmcgbm9wcmVmaXhOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJpYnV0ZU5hbWUpOwotCQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0obm9wcmVmaXhOYW1lKTsKLQkJCQkJaWYgKGF0dHJEZWNsID09IG51bGwpIHsKLQkJCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChhdHRyRGVjbCA9PSBudWxsKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShVTktOT1dOX0FUVFIsIGF0dHJpYnV0ZU5hbWUpOwotCQkJCX0KLQkJCX0KLQotCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKTsKLQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBudWxsOwotCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShhdHRyRGVjbCk7Ci0JCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCWlmICgoYXR0ckRlY2wgIT0gbnVsbCkgJiYgKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkpIHsKLQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVF9SRVFfT0JKKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKChhdHRyRGVjbCAhPSBudWxsKSAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSkgewotCQkJCS8vIGF0dHJpYnV0ZSBpcyBrbm93biwgcHJvbXB0IHdpdGggdmFsdWVzIGZyb20gdGhlIGRlY2xhcmF0aW9uCi0JCQkJcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dHJEZWNsKTsKLQkJCQlMaXN0IHBvc3NpYmxlVmFsdWVzID0gZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhub2RlLCBhdHRyRGVjbCk7Ci0JCQkJaWYgKHBvc3NpYmxlVmFsdWVzLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gRU5VTUVSQVRFRCBWQUxVRVMKLQkJCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKTsKLQkJCQkJaWYgKG1hdGNoU3RyaW5nID09IG51bGwpIHsKLQkJCQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoKG1hdGNoU3RyaW5nLmxlbmd0aCgpID4gMCkgJiYgKG1hdGNoU3RyaW5nLnN0YXJ0c1dpdGgoIlwiIikgfHwgbWF0Y2hTdHJpbmcuc3RhcnRzV2l0aCgiJyIpKSkgewotCQkJCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBjdXJyZW50VmFsaWQgPSBmYWxzZTsKLQotCQkJCQkvLyBkMjEwODU4LCBpZiB0aGUgcmVnaW9uJ3MgYSBjb250YWluZXIsIGRvbid0IHN1Z2dlc3QgdGhlCi0JCQkJCS8vIGVudW1lcmF0ZWQgdmFsdWVzIGFzIHRoZXkgcHJvYmFibHkgd29uJ3QgaGVscAotCQkJCQlib29sZWFuIGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSA9IChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSAhPSBudWxsKSAmJiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcik7Ci0JCQkJCWlmICghZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGogPSBwb3NzaWJsZVZhbHVlcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLQkJCQkJCQlTdHJpbmcgcG9zc2libGVWYWx1ZSA9IChTdHJpbmcpIGoubmV4dCgpOwotCQkJCQkJCWN1cnJlbnRWYWxpZCA9IGN1cnJlbnRWYWxpZCB8fCBwb3NzaWJsZVZhbHVlLmVxdWFscyhjdXJyZW50VmFsdWUpOwotCQkJCQkJCWlmICgobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCkgfHwgcG9zc2libGVWYWx1ZS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkgewotCi0JCQkJCQkJCVN0cmluZyByU3RyaW5nID0gIlwiIiArIHBvc3NpYmxlVmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpbnQgck9mZnNldCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQkJCQkJCQlpbnQgckxlbmd0aCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCQkJCQkJCWludCBjdXJzb3JBZnRlciA9IHBvc3NpYmxlVmFsdWUubGVuZ3RoKCkgKyAxOwotCQkJCQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9ICJcIiIgKyBwb3NzaWJsZVZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJTdHJpbmcsIHJPZmZzZXQsIHJMZW5ndGgsIGN1cnNvckFmdGVyLCBpbWFnZSwgZGlzcGxheVN0cmluZywgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgoKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5GSVhFRCkgfHwgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0SW1wbGllZFZhbHVlS2luZCgpID09IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCkpICYmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpKSB7Ci0JCQkJCS8vIEZJWEVEIHZhbHVlcwotCQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCQlTdHJpbmcgclZhbHVlID0gIlwiIiArIHZhbHVlICsgIlwiIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChyVmFsdWUsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCByVmFsdWUubGVuZ3RoKCkgKyAxLCBpbWFnZSwgclZhbHVlLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJaWYgKChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiAwKSAmJiAhdmFsdWUuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpIHsKLQkJCQkJCQlyVmFsdWUgPSAiXCIiICsgY3VycmVudFZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoclZhbHVlLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgclZhbHVlLmxlbmd0aCgpICsgMSwgaW1hZ2UsIHJWYWx1ZSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB1bmtub3duIGF0dHJpYnV0ZSwgc28gc3VwcGx5IG5pY2UgZW1wdHkgdmFsdWVzCi0JCQkJcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWxlbWVudERlY2wpOwotCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJaWYgKChjdXJyZW50VmFsdWUgIT0gbnVsbCkgJiYgKGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCVN0cmluZyByVmFsdWUgPSAiXCIiICsgY3VycmVudFZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJWYWx1ZSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIDEsIGltYWdlLCByVmFsdWUsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoVU5LTk9XTl9DT05URVhUKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbW1lbnRQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI8IS0tICAtLT4iLCAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCA1LCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NPTU1FTlQpLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfXywgKG5ldyBPYmplY3RbXXsiIDwhLS0gIC0tPiJ9KSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ09NTUVOVCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgb2YgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGludCB0aGUgQ01Db250ZW50IG9iamVjdCBpbnRvIG9uZQotCSAqIGJpZyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnQoTGlzdCBjb250ZW50TGlzdCwgQ01Db250ZW50IGNvbnRlbnQpIHsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cCkgewotCQkJQ01Ob2RlTGlzdCBjaGlsZHJlbiA9ICgoQ01Hcm91cCkgY29udGVudCkuZ2V0Q2hpbGROb2RlcygpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlDTU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCWNvbnRlbnRMaXN0LmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuR1JPVVApIHsKLQkJCQkJCWFkZENvbnRlbnQoY29udGVudExpc3QsIChDTUNvbnRlbnQpIGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY29udGVudCBjaGlsZDogIiArIGNoaWxkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJY29udGVudExpc3QuYWRkKGNvbnRlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRG9jVHlwZVByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGlmIGEgRG9jdW1lbnRFbGVtZW50IGV4aXN0cywgdXNlIHRoYXQgZm9yIHRoZSByb290IEVsZW1lbnQgbmFtZQotCQlTdHJpbmcgcm9vdG5hbWUgPSAidW5zcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCkuZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpICE9IG51bGwpIHsKLQkJCXJvb3RuYW1lID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXROb2RlTmFtZSgpOwotCQl9Ci0KLQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9ICI8IURPQ1RZUEUgIiArIHJvb3RuYW1lICsgIiBQVUJMSUMgXCIvL1VOS05PV04vXCIgXCJ1bmtub3duLmR0ZFwiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAxMCwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9ET0NUWVBFKSwgIjwhRE9DVFlQRSAuLi4gPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRE9DVFlQRSk7Ci0JCS8vIFRPRE8gcHJvdmlkZSBzcGVjaWFsIGRvY3VtZW50YXRpb24gb24gZG9jIHR5cGUKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgcHJvcG9zYWxzIGZvciBhIGNvbXBsZXRlbHkgZW1wdHkgZG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHByb3Bvc2FscyBmb3IgdGhlIG5hbWUgaW4gYW4gZW5kIHRhZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKSA8IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKSB7Ci0JCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIDEsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfXywgKG5ldyBPYmplY3RbXXsiICc+JyJ9KSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUdfTkFNRSk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCU5vZGUgYU5vZGUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQkJaWYgKG1hdGNoU3RyaW5nLnN0YXJ0c1dpdGgoIjwvIikpIHsKLQkJCQltYXRjaFN0cmluZyA9IG1hdGNoU3RyaW5nLnN1YnN0cmluZygyKTsKLQkJCX0KLQkJCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGFOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJaWYgKGFOb2RlLmdldE5vZGVOYW1lKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZykpIHsKLQkJCQkJCUlET01Ob2RlIGFYTUxOb2RlID0gKElET01Ob2RlKSBhTm9kZTsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgYU5vZGUpOwotCQkJCQkJaWYgKChhWE1MTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSAmJiAoKGVkID09IG51bGwpIHx8IChlZC5nZXRDb250ZW50VHlwZSgpICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKSkpIHsKLQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gYU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gKGVkICE9IG51bGwpID8gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWQpIDogbnVsbDsKLQkJCQkJCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgIWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpKSB7Ci0JCQkJCQkJCXByb3Bvc2VkVGV4dCArPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbnVsbDsKLQkJCQkJCQkvLyBkb3VibGUgY2hlY2sgdG8gc2VlIGlmIHRoZSByZWdpb24gYWN0ZWQgdXBvbiBpcwotCQkJCQkJCS8vIGEgdGFnIG5hbWU7IHJlcGxhY2UgaXQgaWYgc28KLQkJCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVkKTsKLQkJCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFN0YXJ0T2Zmc2V0KCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBpbWFnZSwgcHJvcG9zZWRUZXh0LCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUdfTkFNRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiciICsgcHJvcG9zZWRUZXh0ICsgIicifSkpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHX05BTUUpOwotCQkJCQkJCX0KLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYU5vZGUgPSBhTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHQgZm9yIGVuZCB0YWdzIHRvIGEgbm9uLWVtcHR5IE5vZGUgdGhhdCBoYXNuJ3QgZW5kZWQgSGFuZGxlcyB0aGVzZQotCSAqIGNhc2VzOiA8YnI+Ci0JICogPHRhZ09wZW4+fCA8YnI+Ci0JICogPHRhZ09wZW4+PCB8PGJyPgotCSAqIDx0YWdPcGVuPjwvIHwKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCk7Ci0KLQkJaWYgKGlzQ29tbWVudE5vZGUobm9kZSkpIHsKLQkJCS8vIGxvb3AgYW5kIGZpbmQgbm9uIGNvbW1lbnQgbm9kZSBwYXJlbnQKLQkJCXdoaWxlICgobm9kZSAhPSBudWxsKSAmJiBpc0NvbW1lbnROb2RlKG5vZGUpKSB7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBub2RlIGlzIGFscmVhZHkgY2xvc2VkCi0JCWlmIChub2RlLmlzQ2xvc2VkKCkpIHsKLQkJCS8vIGxvb3AgYW5kIGZpbmQgbm9uIGNvbW1lbnQgdW5jbG9zZSBub2RlIHBhcmVudAotCQkJd2hpbGUgKChub2RlICE9IG51bGwpICYmIG5vZGUuaXNDbG9zZWQoKSkgewotCQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCS8vIHRoZXJlIHdlcmUgbm8gdW5jbG9zZWQgdGFncwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBkYXRhIHRvIGNyZWF0ZSBhIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbAotCQlTdHJpbmcgcmVwbGFjZVRleHQgPSBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHJlcGxhY2VCZWdpbiA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQlpbnQgcmVwbGFjZUxlbmd0aCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCWludCBjdXJzb3JPZmZzZXQgPSBub2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCkgKyAxOwotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwcm9wb3NlZEluZm8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZSBpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJYm9vbGVhbiBhZGRQcm9wb3NhbCA9IGZhbHNlOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZUZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHhtbEVuZFRhZ09wZW4gPSBzRG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKTsKLQkJCS8vIHNraXAgYmFja3dhcmQgdG8gIjwiLCAiPC8iLCBvciB0aGUgKHVuY2xvc2VkKSBzdGFydCB0YWcsIG51bGwKLQkJCS8vIGlmIG5vdCBmb3VuZAotCQkJU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKCh4bWxFbmRUYWdPcGVuICE9IG51bGwpICYmICgodHlwZSA9IHhtbEVuZFRhZ09wZW4uZ2V0VHlwZSgpKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pICYmICh0eXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgJiYgIW5lZWRzRW5kVGFnKHhtbEVuZFRhZ09wZW4pICYmICh0eXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSkgewotCQkJCXhtbEVuZFRhZ09wZW4gPSB4bWxFbmRUYWdPcGVuLmdldFByZXZpb3VzKCk7Ci0JCQl9Ci0KLQkJCWlmICh4bWxFbmRUYWdPcGVuID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHhtbEVuZFRhZ09wZW4uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlub2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJaWYgKGlzU3RhcnRUYWcoeG1sRW5kVGFnT3BlbikpIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIGZvciBhIHN0YXJ0IHRhZyB3L291dCBlbmQgdGFnCi0JCQkJLy8gZWc6Ci0JCQkJLy8gPHA+Ci0JCQkJLy8gPCUgU3RyaW5nIHRlc3QgPSAidGVzdCI7ICU+Ci0JCQkJLy8gfAotCQkJCWlmIChuZWVkc0VuZFRhZyh4bWxFbmRUYWdPcGVuKSkgewotCQkJCQlTdHJpbmcgdGFnTmFtZSA9IGdldFRhZ05hbWUoeG1sRW5kVGFnT3Blbik7Ci0JCQkJCXhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCQlyZXBsYWNlTGVuZ3RoID0gMDsKLQkJCQkJcmVwbGFjZVRleHQgPSAiPC8iICsgdGFnTmFtZSArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkICROT04tTkxTLTIkCi0JCQkJCS8vIHJlcGxhY2VUZXh0ID0gIjwvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsKLQkJCQkJLy8gLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAotCQkJCQljdXJzb3JPZmZzZXQgPSB0YWdOYW1lLmxlbmd0aCgpICsgMzsKLQkJCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfXywgKG5ldyBPYmplY3RbXXt0YWdOYW1lfSkpOwotCQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIGZvcjogPHRhZz4gPC8gfAotCQkJCS8vIHBvc3NpYmx5IDx0YWc+IDwvIHw8YW5vdGhlclRhZz4KLQkJCQkvLyBzaG91bGQgb25seSBiZSByZXBsYWNpbmcgd2hpdGUgc3BhY2UuLi4KLQkJCQlyZXBsYWNlTGVuZ3RoID0gKHJlcGxhY2VCZWdpbiA+IHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpKSA/IHJlcGxhY2VCZWdpbiAtIHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpIDogMDsKLQkJCQlyZXBsYWNlVGV4dCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJAotCQkJCWN1cnNvck9mZnNldCA9IHJlcGxhY2VUZXh0Lmxlbmd0aCgpOwotCQkJCXJlcGxhY2VCZWdpbiA9IHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCWRpc3BsYXlTdHJpbmcgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXtub2RlLmdldE5vZGVOYW1lKCl9KSk7Ci0JCQkJYWRkUHJvcG9zYWwgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgZm9yOiA8dGFnPiA8IHwKLQkJCQlyZXBsYWNlVGV4dCA9ICIvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkICROT04tTkxTLTIkCi0JCQkJY3Vyc29yT2Zmc2V0ID0gcmVwbGFjZVRleHQubGVuZ3RoKCk7Ci0JCQkJLy8gcmVwbGFjZVRleHQgPSAiLyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAkTk9OLU5MUy0yJAotCQkJCS8vIHNob3VsZCBvbmx5IGJlIHJlcGxhY2luZyB3aGl0ZSBzcGFjZS4uLgotCQkJCXJlcGxhY2VMZW5ndGggPSAocmVwbGFjZUJlZ2luID4geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCkpID8gcmVwbGFjZUJlZ2luIC0geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCkgOiAwOwotCQkJCXJlcGxhY2VCZWdpbiA9IHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCWRpc3BsYXlTdHJpbmcgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXsiLyIgKyBub2RlLmdldE5vZGVOYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vIHNvbWV0aW1lcyB0aGUgbm9kZSBpcyBub3QgbnVsbCwgYnV0Ci0JCS8vIGdldE5vZGVWYWx1ZSgpIGlzIG51bGwsIHB1dCBpbiBhIG51bGwgY2hlY2sKLQkJZWxzZSBpZiAoKG5vZGUuZ2V0Tm9kZVZhbHVlKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuaW5kZXhPZigiPC8iKSAhPSAtMSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gdGhlIGNhc2Ugd2hlcmUgIjwvIiBpcyBzdGFydGVkLCBidXQgdGhlIG5vZGVzIGNvbWVzIGluIGFzIGEKLQkJCS8vIHRleHQgbm9kZSAoaW5zdGVhZCBvZiBlbGVtZW50KQotCQkJLy8gbGlrZSB0aGlzOiA8dGFnPiA8L3wKLQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJCXJlcGxhY2VUZXh0ID0gcGFyZW50LmdldE5vZGVOYW1lKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljdXJzb3JPZmZzZXQgPSByZXBsYWNlVGV4dC5sZW5ndGgoKTsKLQkJCQlkaXNwbGF5U3RyaW5nID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF9fLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpfSkpOwotCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXNldEVycm9yTWVzc2FnZShVTktOT1dOX0NPTlRFWFQpOwotCQl9Ci0JCWlmIChhZGRQcm9wb3NhbCA9PSB0cnVlKSB7Ci0JCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJlcGxhY2VUZXh0LCByZXBsYWNlQmVnaW4sIHJlcGxhY2VMZW5ndGgsIGN1cnNvck9mZnNldCwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBRyk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnRpdHlQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gZXBzID0gY29tcHV0ZUVudGl0eVJlZmVyZW5jZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSk7Ci0JCWZvciAoaW50IGkgPSAwOyAoZXBzICE9IG51bGwpICYmIChpIDwgZXBzLmxlbmd0aCk7IGkrKykgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwoZXBzW2ldKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudGl0eVByb3Bvc2FscyhWZWN0b3IgcHJvcG9zYWxzLCBQcm9wZXJ0aWVzIG1hcCwgU3RyaW5nIGtleSwgaW50IG5vZGVPZmZzZXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24pIHsKLQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGVudGl0eU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZW50aXR5VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZSBlbnRpdHlJY29uID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlRJVFlfUkVGRVJFTkNFKTsKLQkJU3RyaW5nIHJlcGxhY2VtZW50VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJRW51bWVyYXRpb24ga2V5cyA9IG1hcC5rZXlzKCk7Ci0KLQkJd2hpbGUgKChrZXlzICE9IG51bGwpICYmIGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWVudGl0eU5hbWUgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQllbnRpdHlWYWx1ZSA9IG1hcC5nZXRQcm9wZXJ0eShlbnRpdHlOYW1lKTsKLQkJCS8vIGZpbHRlciBiYXNlZCBvbiBwYXJ0aWFsIGVudGl0eSBzdHJpbmcuLi4KLQkJCWlmIChlbnRpdHlOYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChrZXkudG9Mb3dlckNhc2UoKSkgfHwga2V5LnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJLy8gZmlndXJlIG91dCBzZWxlY3Rpb24uLi5pZiB0ZXh0IGlzIHNlbGVjdGVkLCBhZGQgaXQgdG8KLQkJCQkvLyBzZWxlY3Rpb24gbGVuZ3RoCi0JCQkJaW50IHNlbGVjdGlvbkxlbmd0aCA9IG5vZGVPZmZzZXQ7Ci0JCQkJaWYgKGZUZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uTGVuZ3RoICs9IGZUZXh0Vmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKS55OwotCQkJCX0KLQkJCQkvLyBjcmVhdGUgYSBuZXcgcHJvcG9zYWwgZm9yIGVudGl0eSBzdHJpbmcuLi4KLQkJCQlyZXBsYWNlbWVudFRleHQgPSAiJiIgKyBlbnRpdHlOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJZGlzcGxheVN0cmluZyA9ICImIiArIGVudGl0eU5hbWUgKyAiOyAoIiArIGVudGl0eVZhbHVlICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgY3AgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJlcGxhY2VtZW50VGV4dCwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIHNlbGVjdGlvbkxlbmd0aCwgcmVwbGFjZW1lbnRUZXh0Lmxlbmd0aCgpLCBlbnRpdHlJY29uLCBkaXNwbGF5U3RyaW5nLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTlRJVFkpOwotCQkJCWlmIChjcCAhPSBudWxsKSB7Ci0JCQkJCXByb3Bvc2Fscy5hZGQoY3ApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPCFbQ0RBVEFbXV0+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgOSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DREFUQVNFQ1RJT04pLCAiQ0RBVEEgU2VjdGlvbiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0RBVEEpOwotCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0KLQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKG5vZGVOYW1lLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgbm9kZU5hbWUubGVuZ3RoKCksIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUKSwgIiNQQ0RBVEEiLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NEQVRBKTsKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJTm9kZSBhTm9kZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQkJYm9vbGVhbiB4bWxwaUZvdW5kID0gZmFsc2U7Ci0JCURvY3VtZW50IG93bmluZ0RvY3VtZW50ID0gYU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkvLyA9PT4gLy8gaW50IHhtbHBpTm9kZVBvc2l0aW9uID0gLTE7Ci0KLQkJLy8gbWFrZSBzdXJlIHhtbHBpIGlzIHJvb3QgZWxlbWVudAotCQkvLyBkb24ndCB3YW50IGRvY3R5cGUgcHJvcG9zYWwgaWYgWE1MUEkgaXNuJ3QgZmlyc3QgZWxlbWVudC4uLgotCQlOb2RlIGZpcnN0ID0gb3duaW5nRG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlib29sZWFuIHhtbHBpSXNGaXJzdEVsZW1lbnQgPSAoKGZpcnN0ICE9IG51bGwpICYmIChmaXJzdC5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSk7Ci0JCWJvb2xlYW4gaW5zZXJ0RG9jdHlwZSA9IHhtbHBpSXNGaXJzdEVsZW1lbnQ7Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gb3duaW5nRG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWJvb2xlYW4geG1scGkgPSAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXhtbHBpRm91bmQgPSB4bWxwaUZvdW5kIHx8IHhtbHBpOwotCQkJaWYgKHhtbHBpRm91bmQpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkvLyA9PT4gLy8gaW50IHhtbHBpTm9kZVBvc2l0aW9uID0KLQkJCQkJLy8gKChYTUxOb2RlKWNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQkJLy8gc2tpcCB3aGl0ZSBzcGFjZSBhbmQgdGV4dAotCQkJCXdoaWxlICgoKGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgIT0gbnVsbCkgJiYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKSB7Ci0JCQkJCS8vIGp1c3Qgc2tpcHBpbmcKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgaWYgdGhlcmVzIGEgbm9kZSBpbmJldHdlZW4gWE1MUEkgYW5kIGN1cnNvciBwb3NpdGlvbgotCQkJCWlmICgoY2hpbGQgIT0gbnVsbCkgJiYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpKSB7Ci0JCQkJCWlmICgoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgPj0gKChJRE9NTm9kZSkgY2hpbGQpLmdldEVuZE9mZnNldCgpKSB8fCAheG1scGlJc0ZpcnN0RWxlbWVudCkgewotCQkJCQkJaW5zZXJ0RG9jdHlwZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHhtbHBpRm91bmQgJiYgKG93bmluZ0RvY3VtZW50LmdldERvY3R5cGUoKSA9PSBudWxsKSAmJiBpc0N1cnNvckFmdGVyWE1MUEkoY29udGVudEFzc2lzdFJlcXVlc3QpICYmIGluc2VydERvY3R5cGUpIHsKLQkJCWFkZERvY1R5cGVQcm9wb3NhbChjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbiB1bmNsb3NlZCBzdGFydCB0YWcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdDbG9zZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQYXJlbnQoKTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IChlbGVtZW50RGVjbCAhPSBudWxsKSA/IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVsZW1lbnREZWNsKSA6IG51bGw7Ci0JCQlpbnQgY29udGVudFR5cGUgPSAoZWxlbWVudERlY2wgIT0gbnVsbCkgPyBlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpIDogQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCQkJLy8gaWYgaXQncyBYTUwgYW5kIGNvbnRlbnQgZG9lc24ndCBIQVZFIHRvIGJlIGVsZW1lbnQsIGFkZCAiLz4iCi0JCQkvLyBwcm9wb3NhbC4KLQkJCWJvb2xlYW4gZW5kV2l0aFNsYXNoQnJhY2tldCA9IChnZXRYTUwobm9kZSkgJiYgKGNvbnRlbnRUeXBlICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpKTsKLQotCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlbGVtZW50RGVjbCk7Ci0JCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQl9Ci0KLQkJCS8vIGlzIHRoZSBzdGFydCB0YWcgZW5kZWQgcHJvcGVybHk/Ci0JCQlpZiAoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCkgPT0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSAmJiAhKG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkuaXNFbmRlZCgpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCS8vIElzIHRoaXMgc3VwcG9zZWQgdG8gYmUgYW4gZW1wdHkgdGFnPyBOb3RlIHRoYXQgaWYgd2UgY2FuJ3QKLQkJCQkvLyB0ZWxsLCB3ZSBhc3N1bWUgaXQncyBub3QuCi0JCQkJaWYgKChlbGVtZW50RGVjbCAhPSBudWxsKSAmJiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkpIHsKLQkJCQkJLy8gcHJvbXB0IHdpdGggYSBzZWxmLWNsb3NpbmcgZW5kIGNoYXJhY3RlciBpZiBuZWVkZWQKLQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0U3RhcnRUYWdDbG9zZShub2RlLCBlbGVtZW50RGVjbCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0aGUgZmV3IHRpbWVzIHRvIGlnbm9yZSB0aGUgbGVuZ3RoIC0tCi0JCQkJCQkJCS8vIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJLy8gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkJMCwgZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFN0YXJ0VGFnQ2xvc2Uobm9kZSwgZWxlbWVudERlY2wpLmxlbmd0aCgpLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX19fLCAobmV3IE9iamVjdFtde2dldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRTdGFydFRhZ0Nsb3NlKG5vZGUsIGVsZW1lbnREZWNsKX0pKSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DTE9TRV9UQUcpOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBwcm9tcHQgd2l0aCBhIGNsb3NlIGZvciB0aGUgc3RhcnQgdGFnCi0JCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0aGUgZmV3IHRpbWVzIHRvIGlnbm9yZSB0aGUKLQkJCQkJCQkJLy8gbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJLy8gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkJMCwgMSwgaW1hZ2UsIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ2xvc2Vfd2l0aF9fLCAobmV3IE9iamVjdFtdeyIgJz4nIn0pKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQotCQkJCQkvLyBwcm9tcHQgd2l0aCB0aGUgY2xvc2VyIGZvciB0aGUgc3RhcnQgdGFnIGFuZCBhbiBlbmQgdGFnCi0JCQkJCS8vIGlmIG9uZSBpcyBub3QgcHJlc2VudAotCQkJCQlpZiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBtYWtlIHN1cmUgdGFnIG5hbWUgaXMgYWN0dWFsbHkgd2hhdCBpdCB0aGlua3MgaXQKLQkJCQkJCS8vIGlzLi4uKGVnLiA8JUAgdnMuIDxqc3A6ZGlyZWN0aXZlKQotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJU3RyaW5nIG9wZW5pbmdUYWdUZXh0ID0gKHNkciAhPSBudWxsKSA/IHNkci5nZXRGdWxsVGV4dCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICgob3BlbmluZ1RhZ1RleHQgIT0gbnVsbCkgJiYgKG9wZW5pbmdUYWdUZXh0LmluZGV4T2Yobm9kZS5nZXROb2RlTmFtZSgpKSAhPSAtMSkpIHsKLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIj48LyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiIsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0bwotCQkJCQkJCQkJCS8vIGlnbm9yZSB0aGUgbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJCQkvLyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLAotCQkJCQkJCQkJCTAsIDEsIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfX19fLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DTE9TRV9UQUcpOwotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBwcm9tcHQgd2l0aCBzbGFzaCBicmFja2V0ICIvPiIgaW5jYXNlIGlmIGl0J3MgYSBzZWxmCi0JCQkJCS8vIGVuZGluZyB0YWcKLQkJCQkJaWYgKGVuZFdpdGhTbGFzaEJyYWNrZXQpIHsKLQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiLz4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkJCS8vIHRoaXMgaXMgb25lIG9mIHRoZSBmZXcgdGltZXMgdG8gaWdub3JlCi0JCQkJCQkJCQkvLyB0aGUgbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJCQkwLCAyLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiBcIi8+XCIifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyArIDEpOyAvLyArMQotCQkJCQkJLy8gdG8KLQkJCQkJCS8vIGJyaW5nCi0JCQkJCQkvLyB0bwotCQkJCQkJLy8gdG9wCi0JCQkJCQkvLyBvZgotCQkJCQkJLy8gbGlzdAotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCkgPT0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpICYmICFub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJLy8gcHJvbXB0IHdpdGggYSBjbG9zaW5nIGVuZCBjaGFyYWN0ZXIgZm9yIHRoZSBlbmQgdGFnCi0JCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0aGUgZmV3IHRpbWVzIHRvIGlnbm9yZSB0aGUKLQkJCQkJCQkvLyBsZW5ndGggLS0gYWx3YXlzIGluc2VydAotCQkJCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJMCwgMSwgaW1hZ2UsIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ2xvc2Vfd2l0aF9fLCAobmV3IE9iamVjdFtdeyIgJz4nIn0pKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0xPU0VfVEFHKTsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCUxpc3QgY21ub2RlcyA9IG51bGw7Ci0JCU5vZGUgcGFyZW50ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCk7Ci0JCVN0cmluZyBlcnJvciA9IG51bGw7Ci0KLQkJLy8gKG5zZCkgVGhpcyBpcyBvbmx5IHZhbGlkIGF0IHRoZSBkb2N1bWVudCBlbGVtZW50IGxldmVsCi0JCS8vIG9ubHkgdmFsaWQgaWYgaXQncyBYTUwgKGNoZWNrIGFkZGVkIDIvMTcvMjAwNCkKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKChJRE9NRG9jdW1lbnQpIHBhcmVudCkuaXNYTUxUeXBlKCkgJiYgIWlzQ3Vyc29yQWZ0ZXJYTUxQSShjb250ZW50QXNzaXN0UmVxdWVzdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBvbmx5IHdhbnQgcHJvcG9zYWxzIGlmIGN1cnNvciBpcyBhZnRlciBkb2N0eXBlLi4uCi0JCWlmICghaXNDdXJzb3JBZnRlckRvY3R5cGUoY29udGVudEFzc2lzdFJlcXVlc3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBmaXggZm9yIG1ldGEtaW5mbyBjb21tZW50IG5vZGVzLi4gdGhleSBjdXJyZW50bHkgImhpZGUiIG90aGVyCi0JCS8vIHByb3Bvc2FscyBiZWNhdXNlIHRoZSBkb24ndAotCQkvLyBoYXZlIGEgY29udGVudCBtb2RlbCAoc28gY2FuJ3QgcHJvcG9zZSBhbnkgY2hpbGRyZW4uLikKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIElET01Ob2RlKSAmJiBpc0NvbW1lbnROb2RlKChJRE9NTm9kZSkgcGFyZW50KSkgewotCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCBub2RlPwotCQkJd2hpbGUgKChwYXJlbnQgIT0gbnVsbCkgJiYgaXNDb21tZW50Tm9kZSgoSURPTU5vZGUpIHBhcmVudCkpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KTsKLQkJCWlmIChwYXJlbnREZWNsICE9IG51bGwpIHsKLQkJCQkvLyBYU0Qtc3BlY2lmaWMgYWJpbGl0eSAtIG5vIGZpbHRlcmluZwotCQkJCUNNRGF0YVR5cGUgY2hpbGRUeXBlID0gcGFyZW50RGVjbC5nZXREYXRhVHlwZSgpOwotCQkJCWlmIChjaGlsZFR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmdbXSBjaGlsZFN0cmluZ3MgPSBjaGlsZFR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJCQlpZiAoY2hpbGRTdHJpbmdzICE9IG51bGwpIHsKLQkJCQkJCS8vIHRoZSBjb250ZW50IHN0cmluZyBpcyB0aGUgc29sZSB2YWxpZCBjaGlsZC4uLnNvCi0JCQkJCQkvLyByZXBsYWNlIHRoZSByZXN0Ci0JCQkJCQlpbnQgYmVnaW4gPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJCQkJCWludCBsZW5ndGggPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCQkJaWYgKCgoSURPTU5vZGUpIHBhcmVudCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9ICgoSURPTU5vZGUpIHBhcmVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJCQkJCQliZWdpbiA9ICgoSURPTU5vZGUpIHBhcmVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQkJbGVuZ3RoID0gKChJRE9NTm9kZSkgcGFyZW50KS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSAtIGJlZ2luOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhwYXJlbnREZWNsLCBjaGlsZFR5cGUpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgdGV4dFByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChjaGlsZFN0cmluZ3NbaV0sIGJlZ2luLCBsZW5ndGgsIGNoaWxkU3RyaW5nc1tpXS5sZW5ndGgoKSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlVNKSwgY2hpbGRTdHJpbmdzW2ldLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19JTlNFUlRJT04pOwotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHRleHRQcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoKHBhcmVudERlY2wgIT0gbnVsbCkgJiYgKHBhcmVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpKSB7Ci0JCQkJYWRkUENEQVRBUHJvcG9zYWwocGFyZW50RGVjbC5nZXROb2RlTmFtZSgpLCBjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyByZXRyaWV2ZSB0aGUgbGlzdCBvZiBhbGwgcG9zc2libGUgY2hpbGRyZW4gd2l0aGluIHRoaXMKLQkJCQkvLyBwYXJlbnQgY29udGV4dAotCQkJCWNtbm9kZXMgPSBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoKEVsZW1lbnQpIHBhcmVudCwgY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQpOwotCi0JCQkJLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgdGhlIHBvc3NpYmxlIGNoaWxkcmVuIHdpdGhpbiB0aGlzCi0JCQkJLy8gcGFyZW50IGNvbnRleHQgYW5kIGF0IHRoaXMgaW5kZXgKLQkJCQlMaXN0IHN0cmljdENNTm9kZVN1Z2dlc3Rpb25zID0gbnVsbDsKLQkJCQlpZiAoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9TVFJJQ1QuZXF1YWxzKFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1kpKSkgewotCQkJCQlzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucyA9IGdldFZhbGlkQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKChFbGVtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24sIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJUKTsKLQkJCQl9Ci0JCQkJSXRlcmF0b3Igbm9kZUl0ZXJhdG9yID0gY21ub2Rlcy5pdGVyYXRvcigpOwotCQkJCWlmICghbm9kZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlpZiAoZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KSAhPSBudWxsKSB7Ci0JCQkJCQllcnJvciA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuX0hhc19ub19hdmFpbGFibGVfY2hpbGQsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQllcnJvciA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRWxlbWVudF9faXNfdW5rbm93biwgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQkJCS8vIGNob3Agb2ZmIGFueSBsZWFkaW5nIDwncyBhbmQgd2hpdGVzcGFjZSBmcm9tIHRoZQotCQkJCS8vIG1hdGNoc3RyaW5nCi0JCQkJd2hpbGUgKChtYXRjaFN0cmluZy5sZW5ndGgoKSA+IDApICYmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG1hdGNoU3RyaW5nLmNoYXJBdCgwKSkgfHwgYmVnaW5zV2l0aChtYXRjaFN0cmluZywgIjwiKSkpIHsKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQltYXRjaFN0cmluZyA9IG1hdGNoU3RyaW5nLnN1YnN0cmluZygxKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKG5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSBub2RlSXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIENNRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbzsKLQkJCQkJCS8vIG9ubHkgYWRkIHByb3Bvc2FscyBmb3IgdGhlIGNoaWxkIGVsZW1lbnQncyB0aGF0Ci0JCQkJCQkvLyBiZWdpbiB3aXRoIHRoZSBtYXRjaHN0cmluZwotCQkJCQkJU3RyaW5nIHRhZ25hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0JCQkJCQlib29sZWFuIGlzU3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbiA9IHN0cmljdENNTm9kZVN1Z2dlc3Rpb25zICE9IG51bGwgPyBzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucy5jb250YWlucyhlbGVtZW50RGVjbCkgOiBmYWxzZTsKLQotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlbGVtZW50RGVjbCk7Ci0KLQkJCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKHN0cmljdENNTm9kZVN1Z2dlc3Rpb25zICE9IG51bGwpIHsKLQkJCQkJCQkJaW1hZ2UgPSBpc1N0cmljdENNTm9kZVN1Z2dlc3Rpb24gPyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDX0VNUEhBU0laRUQpIDogWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQ19ERUVNUEhBU0laRUQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQotCQkJCQkJLy8gaW50IG1hcmt1cEFkanVzdG1lbnQgPQotCQkJCQkJLy8gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChwYXJlbnQsCi0JCQkJCQkvLyBlbGVtZW50RGVjbCk7Ci0JCQkJCQlpZiAoYmVnaW5zV2l0aCh0YWduYW1lLCBtYXRjaFN0cmluZykpIHsKLQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWRUZXh0KHBhcmVudCwgZWxlbWVudERlY2wpOwotCi0JCQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5ODExCi0JCQkJCQkJLy8gcGxhY2UgY3Vyc29yIGluIGZpcnN0IGVtcHR5IHF1b3RlcwotCQkJCQkJCWludCBtYXJrdXBBZGp1c3RtZW50ID0gZ2V0Q3Vyc29yUG9zaXRpb25Gb3JQcm9wb3NlZFRleHQocHJvcG9zZWRUZXh0KTsKLQotCQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhwYXJlbnREZWNsLCBlbGVtZW50RGVjbCk7Ci0JCQkJCQkJaW50IHJlbGV2YW5jZSA9IGlzU3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbiA/IFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1NUUklDVExZX1ZBTElEX1RBR19JTlNFUlRJT04gOiBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfSU5TRVJUSU9OOwotCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgbWFya3VwQWRqdXN0bWVudCwgaW1hZ2UsIHRhZ25hbWUsIG51bGwsIHByb3Bvc2VkSW5mbywgcmVsZXZhbmNlKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpICE9IG51bGwpICYmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk5vX2tub3duX2NoaWxkX3RhZywgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKX0pKSk7Ci0JCQkJCQkvLyROT04tTkxTLTEkID0gIk5vIGtub3duIGNoaWxkIHRhZyBuYW1lcyBvZiA8ezB9PiBiZWdpbiB3aXRoIFwiezF9XCIuIgotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuX19IYXNfbm9fa25vd25fY2hpbGQsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJLy8gQ2FuIG9ubHkgcHJvbXB0IHdpdGggZWxlbWVudHMgaWYgdGhlIGN1cnNvciBwb3NpdGlvbiBpcyBwYXN0Ci0JCQkvLyB0aGUgWE1MIHByb2Nlc3NpbmcKLQkJCS8vIGluc3RydWN0aW9uIGFuZCBET0NUWVBFIGRlY2xhcmF0aW9uCi0JCQlib29sZWFuIHhtbHBpRm91bmQgPSBmYWxzZTsKLQkJCWJvb2xlYW4gZG9jdHlwZUZvdW5kID0gZmFsc2U7Ci0JCQlpbnQgbWluaW11bU9mZnNldCA9IC0xOwotCi0JCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQotCQkJCWJvb2xlYW4geG1scGkgPSAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlib29sZWFuIGRvY3R5cGUgPSBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOwotCQkJCWlmICh4bWxwaSB8fCAoZG9jdHlwZSAmJiAobWluaW11bU9mZnNldCA8IDApKSkgewotCQkJCQltaW5pbXVtT2Zmc2V0ID0gKChJRE9NTm9kZSkgY2hpbGQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSArICgoSURPTU5vZGUpIGNoaWxkKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKTsKLQkJCQl9Ci0JCQkJeG1scGlGb3VuZCA9IHhtbHBpRm91bmQgfHwgeG1scGk7Ci0JCQkJZG9jdHlwZUZvdW5kID0gZG9jdHlwZUZvdW5kIHx8IGRvY3R5cGU7Ci0JCQl9Ci0KLQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSA+PSBtaW5pbXVtT2Zmc2V0KSB7Ci0JCQkJTGlzdCBjaGlsZERlY2xzID0gZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKChEb2N1bWVudCkgcGFyZW50LCBjaGlsZFBvc2l0aW9uKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRGVjbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkRGVjbHMuZ2V0KGkpOwotCQkJCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlZCk7Ci0JCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWRUZXh0KHBhcmVudCwgZWQpOwotCQkJCQkJU3RyaW5nIHRhZ25hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlZCk7Ci0JCQkJCQkvLyBhY2NvdW50IGZvciB0aGUgJmx0OyBhbmQgJmd0OwotCQkJCQkJaW50IG1hcmt1cEFkanVzdG1lbnQgPSBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0TWluaW1hbFN0YXJ0VGFnTGVuZ3RoKHBhcmVudCwgZWQpOwotCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVkKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgbWFya3VwQWRqdXN0bWVudCwgaW1hZ2UsIHRhZ25hbWUsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX0lOU0VSVElPTik7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlMaXN0IGNtbm9kZXMgPSBudWxsOwotCQlOb2RlIHBhcmVudCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFBhcmVudCgpOwotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCVN0cmluZyBlcnJvciA9IG51bGw7Ci0JCVN0cmluZyBtYXRjaFN0cmluZyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCk7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgY2hpbGRyZW4KLQkJCS8vIHZhbGlkQWN0aW9ucyA9IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleCgoRWxlbWVudCkgcGFyZW50LAotCQkJLy8gY2hpbGRQb3NpdGlvbik7Ci0JCQljbW5vZGVzID0gZ2V0QXZhaWxhYmxlQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKChFbGVtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24sIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJUKTsKLQkJCUl0ZXJhdG9yIG5vZGVJdGVyYXRvciA9IGNtbm9kZXMuaXRlcmF0b3IoKTsKLQkJCS8vIGNob3Agb2ZmIGFueSBsZWFkaW5nIDwncyBhbmQgd2hpdGVzcGFjZSBmcm9tIHRoZSBtYXRjaHN0cmluZwotCQkJd2hpbGUgKChtYXRjaFN0cmluZy5sZW5ndGgoKSA+IDApICYmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG1hdGNoU3RyaW5nLmNoYXJBdCgwKSkgfHwgYmVnaW5zV2l0aChtYXRjaFN0cmluZywgIjwiKSkpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCQlpZiAoIW5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQllcnJvciA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuX19IYXNfbm9fa25vd25fY2hpbGQsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSk7Ci0JCQl9Ci0JCQl3aGlsZSAobm9kZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUNNTm9kZSBlbGVtZW50RGVjbCA9IChDTU5vZGUpIG5vZGVJdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQkJLy8gb25seSBhZGQgcHJvcG9zYWxzIGZvciB0aGUgY2hpbGQgZWxlbWVudCdzIHRoYXQgYmVnaW4KLQkJCQkJLy8gd2l0aCB0aGUgbWF0Y2hzdHJpbmcKLQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IG51bGw7Ci0JCQkJCWludCBjdXJzb3JBZGp1c3RtZW50ID0gMDsKLQotCQkJCQkvLyBkbyBhIGNoZWNrIHRvIHNlZSBpZiBwYXJ0aWFsIGF0dHJpYnV0ZXMgb2YgcGFydGlhbCB0YWcKLQkJCQkJLy8gbmFtZXMgYXJlIGluIGxpc3QKLQkJCQkJaWYgKCgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpID4gMCkgJiYgYXR0cmlidXRlSW5MaXN0KG5vZGUsIHBhcmVudCwgZWxlbWVudERlY2wpKSB8fCAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgJiYgbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkpIHsKLQotCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWxlbWVudERlY2wpOwotCQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKTsKLQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCk7Ci0JCQkJCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50RGVjbDsKLQkJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODk4MTEKLQkJCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKHBhcmVudCwgZWQsIHNiKTsKLQkJCQkJCQkvLyBzaW5jZSBpdCdzIGEgbmFtZSBwcm9wb3NhbCwgYXNzdW1lICc8JyBpcwotCQkJCQkJCS8vIGFscmVhZHkgdGhlcmUKLQkJCQkJCQkvLyBvbmx5IHJldHVybiB0aGUgcmVzdCBvZiB0aGUgdGFnCi0JCQkJCQkJcHJvcG9zZWRUZXh0ID0gc2IudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSk7Ci0JCQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KHByb3Bvc2VkVGV4dCk7Ci0KLQkJCQkJCQkvLyBjdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0Lmxlbmd0aCgpICsKLQkJCQkJCQkvLyAxOwotCQkJCQkJCS8vIHByb3Bvc2VkVGV4dCArPSAiPjwvIiArCi0JCQkJCQkJLy8gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWxlbWVudERlY2wpICsgIj4iOwotCQkJCQkJCS8vIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGJlZ2luc1dpdGgocHJvcG9zZWRUZXh0LCBtYXRjaFN0cmluZykpIHsKLQkJCQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWxlbWVudERlY2wpOwotCQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCksIGVsZW1lbnREZWNsKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgY3Vyc29yQWRqdXN0bWVudCwgaW1hZ2UsIGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfTkFNRSk7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuc2l6ZSgpID09IDApIHsKLQkJCQlpZiAoZXJyb3IgIT0gbnVsbCkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJCX0KLQkJCQllbHNlIGlmICgoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKSAhPSBudWxsKSAmJiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk5vX2tub3duX2NoaWxkX3RhZ19uYW1lcywgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKX0pKSk7Ci0JCQkJCS8vJE5PTi1OTFMtMSQgPSAiTm8ga25vd24gY2hpbGQgdGFnIG5hbWVzIG9mIDx7MH0+IGJlZ2luIHdpdGggXCJ7MX1cIiIKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLl9fSGFzX25vX2tub3duX2NoaWxkLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpfSkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlMaXN0IGNoaWxkRWxlbWVudHMgPSBnZXRBdmFpbGFibGVSb290Q2hpbGRyZW4oKERvY3VtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ01Ob2RlIGVkID0gKENNTm9kZSkgY2hpbGRFbGVtZW50cy5nZXQoaSk7Ci0JCQkJaWYgKGVkID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBudWxsOwotCQkJCWludCBjdXJzb3JBZGp1c3RtZW50ID0gMDsKLQkJCQlpZiAoZWQgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQkvLyBwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlZCk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKHBhcmVudCwgKENNRWxlbWVudERlY2xhcmF0aW9uKSBlZCwgc2IpOwotCQkJCQkvLyB0YWcgc3RhcnRzIHcvICc8JywgYnV0IHdlIHdhbnQgdG8gY29tcGFyZSB0byBuYW1lCi0JCQkJCXByb3Bvc2VkVGV4dCA9IHNiLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpOwotCi0JCQkJCWlmICghYmVnaW5zV2l0aChwcm9wb3NlZFRleHQsIG1hdGNoU3RyaW5nKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQljdXJzb3JBZGp1c3RtZW50ID0gZ2V0Q3Vyc29yUG9zaXRpb25Gb3JQcm9wb3NlZFRleHQocHJvcG9zZWRUZXh0KTsKLQotCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWQpOwotCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVkKTsKLQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQkJCX0KLQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBjdXJzb3JBZGp1c3RtZW50LCBpbWFnZSwgZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWQpLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19OQU1FKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgdGhlIHBvc2l0aW9uIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGluIGFmdGVyIHRoZSBwcm9wb3NhbCBpcwotCSAqIGFwcGxpZWQKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcG9zZWRUZXh0Ci0JICogQHJldHVybiB0aGUgcG9zaXRpb24gdGhlIGN1cnNvciBzaG91bGQgYmUgaW4gYWZ0ZXIgdGhlIHByb3Bvc2FsIGlzCi0JICogICAgICAgICBhcHBsaWVkCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0Q3Vyc29yUG9zaXRpb25Gb3JQcm9wb3NlZFRleHQoU3RyaW5nIHByb3Bvc2VkVGV4dCkgewotCQlpbnQgY3Vyc29yQWRqdXN0bWVudDsKLQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5pbmRleE9mKCJcIlwiIikgKyAxOyAvLyROT04tTkxTLTEkCi0JCS8vIG90aGVyd2lzZSwgYWZ0ZXIgdGhlIGZpcnN0IHRhZwotCQlpZiAoY3Vyc29yQWRqdXN0bWVudCA9PSAwKSB7Ci0JCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0LmluZGV4T2YoJz4nKSArIDE7Ci0JCX0KLQkJaWYgKGN1cnNvckFkanVzdG1lbnQgPT0gMCkgewotCQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5sZW5ndGgoKSArIDE7Ci0JCX0KLQotCQlyZXR1cm4gY3Vyc29yQWRqdXN0bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBYTUwgcHJvcG9zYWwgaXMgYWRkZWQgdmlhIHhtbCBkZWNsYXJhdGlvbiB0ZW1wbGF0ZSBpbnN0ZWFkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWE1MUHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiICsgQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFVzZXJQcmVmZXJyZWRDaGFyc2V0TmFtZShDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKSArICJcIj8+IjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTiksIHByb3Bvc2VkVGV4dCwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0RFQ0xBUkFUSU9OKTsKLQkJLy8gVE9ETyBhZGQgc3BlY2lhbCBYTUwgcHJvcG9zYWwgaW5mbwotCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyBpZiBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIHByb3Bvc2VkIFhNTE5vZGUKLQkgKiBub2RlLCBhcmUgcG9zc2libGUgdmFsdWVzIG9mIGF0dHJpYnV0ZXMgZnJvbSBwb3NzaWJsZSBFbGVtZW50cyBhdCB0aGlzCi0JICogcG9pbnQgaW4gdGhlIGRvY3VtZW50IGFjY29yZGluZyB0byB0aGUgQ29udGVudCBNb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGVzIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdGVzdCBpZgotCSAqICAgICAgICAgICAgYXJlIHBvc3NpYmxlIGZvciBwb3NzaWJsZSBFbGVtZW50cyBhdCB0aGlzIHBvaW50Ci0JICogQHBhcmFtIGNtbm9kZQotCSAqICAgICAgICAgICAgcG9zc2libGUgZWxlbWVudCBhdCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCAoZGVwZW5kaW5nIG9uCi0JICogICAgICAgICAgICB3aGF0ICdub2RlJyBpcykgdHJ1ZSBpZiBhbnkgYXR0cmlidXRlcyBvZiAnbm9kZScgbWF0Y2ggYW55Ci0JICogICAgICAgICAgICBwb3NzaWJsZSBhdHRyaWJ1dGVzIGZyb20gJ2Ntbm9kZXMnIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXR0cmlidXRlSW5MaXN0KElET01Ob2RlIG5vZGUsIE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlKSB7Ci0JCWlmICgobm9kZSA9PSBudWxsKSB8fCAocGFyZW50ID09IG51bGwpIHx8IChjbW5vZGUgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZWxlbWVudE1hdGNoU3RyaW5nID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgY21ub2RlTmFtZSA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGNtbm9kZSk7Ly8gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJTmFtZWROb2RlTWFwIG1hcCA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0QXR0cmlidXRlcygpOwotCQkJU3RyaW5nIGF0dHJNYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlDTU5hbWVkTm9kZU1hcCBjbWF0dHJNYXAgPSBudWxsOwotCQkJLy8gaXRlcmF0ZSBhdHRyaWJ1dGUgcG9zc2liaWxpdGllcyBmb3IgcGFydGlhbGx5IHN0YXJ0ZWQgbm9kZQotCQkJZm9yIChpbnQgaSA9IDA7IChtYXAgIT0gbnVsbCkgJiYgKGkgPCBtYXAuZ2V0TGVuZ3RoKCkpOyBpKyspIHsKLQkJCQlhdHRyTWF0Y2hTdHJpbmcgPSBtYXAuaXRlbShpKS5nZXROb2RlTmFtZSgpOwotCQkJCS8vIGZpbHRlciBvbiB3aGF0ZXZlciB1c2VyIHR5cGVkIGZvciBlbGVtZW50IG5hbWUgYWxyZWFkeQotCQkJCWlmIChiZWdpbnNXaXRoKGNtbm9kZU5hbWUsIGVsZW1lbnRNYXRjaFN0cmluZykpIHsKLQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQljbWF0dHJNYXAgPSAoKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbW5vZGUpLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGNtYXR0ck1hcCk7Ci0JCQkJCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgbm9kZSwgKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbW5vZGUsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQlDTU5vZGUgYWRub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCQkJCWlmIChhZG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGFkbm9kZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY21hdHRyTWFwID0gYWxsQXR0cmlidXRlczsKLQkJCQkJCQotCQkJCQkJLy8gaXRlcmF0ZSBwb3NzaWJsZSBhdHRyaWJ1dGVzIGZyb20gYSBjbW5vZGUgaW4KLQkJCQkJCS8vIHByb3Bvc2FsIGxpc3QKLQkJCQkJCWZvciAoaW50IGsgPSAwOyAoY21hdHRyTWFwICE9IG51bGwpICYmIChrIDwgY21hdHRyTWFwLmdldExlbmd0aCgpKTsgaysrKSB7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgbmFtZSBtYXRjaGVzCi0JCQkJCQkJaWYgKGNtYXR0ck1hcC5pdGVtKGspLmdldE5vZGVOYW1lKCkuZXF1YWxzKGF0dHJNYXRjaFN0cmluZykpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiZWdpbnNXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCWlmICgoYVN0cmluZyA9PSBudWxsKSB8fCAocHJlZml4ID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyAocGEpIG1hdGNoaW5nIGluZGVwZW5kZW50IG9mIGNhc2UgdG8gYmUgY29uc2lzdGFudCB3aXRoIEphdmEKLQkJLy8gZWRpdG9yIENBCi0JCXJldHVybiBhU3RyaW5nLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChwcmVmaXgudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJLy8gc2V0dXAgdG8gaW5zZXJ0IG5ldyBhdHRyaWJ1dGVzCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFNldHVwIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgYXR0cmlidXRlIG5hbWUKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRMZW5ndGgoMCk7Ci0JCWlmICgobm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmICghbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkpIHsKLQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlpZiAoKGRvY3VtZW50UG9zaXRpb24gPiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpKSAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSAhPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkvLyBzZXR1cCB0byBhZGQgYSBuZXcgYXR0cmlidXRlIGF0IHRoZSBkb2N1bWVudFBvc2l0aW9uCi0JCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCWlmICgoYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmICFhY3R1YWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpKSB7Ci0JCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2V0dXAgdG8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgdmFsdWUKLQkJCWlmICghbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpICYmIChkb2N1bWVudFBvc2l0aW9uIDwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpKSB7Ci0JCQkJLy8gaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXNuJ3QgY2xvc2VkIGFuZCB0aGUKLQkJCQkvLyBjdXJzb3IgaXMgaW4gZnJvbnQgb2YgdGhlIHZhbHVlLCBhZGQKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUsIElET01Ob2RlIHhtbG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCi0JCS8vIEhhbmRsZSB0aGUgbW9zdCBjb21tb24gYW5kIGJlc3Qgc3VwcG9ydGVkIGNhc2VzCi0JCWlmICgoeG1sbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB8fCAoeG1sbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlVGFnT3BlblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZVRhZ05hbWVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlRXF1YWxzUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSAmJiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KCkpICYmIChzZFJlZ2lvbi5nZXRUZXh0KGNvbXBsZXRpb25SZWdpb24pLmVuZHNXaXRoKCJcIiIpIHx8IHNkUmVnaW9uLmdldFRleHQoY29tcGxldGlvblJlZ2lvbikuZW5kc1dpdGgoIlwnIikpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXsKLQkJCQkvLyB0aGlzIGlzIGZvciB3aGVuIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgY2xvc2luZwotCQkJCS8vIHF1b3RlIGZvciBhbiBhdHRyaWJ1dGUuLgotCQkJCUlET01Ob2RlIGFjdHVhbE5vZGUgPSAoSURPTU5vZGUpIHhtbG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKTsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB8fCAocmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX0NMT1NFKSkpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVUYWdDbG9zZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVFbmRUYWdPcGVuUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUEVfUkVGRVJFTkNFKSkgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUNvbnRlbnRQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQotCQkJLy8gVGhlc2UgSVRleHRSZWdpb24gdHlwZXMgYmVnaW4gRE9NIEVsZW1lbnRzIGFzIHdlbGwgYW5kIGFsdGhvdWdoCi0JCQkvLyBpbnRlcm5hbGx5IGhhcmRlciB0byBhc3Npc3QsCi0JCQkvLyB0ZXh0IGluc2VydGlvbnMgZGlyZWN0bHkgYmVmb3JlIHRoZW0gY2FuIGJlIG1hZGUKLQkJCWVsc2UgaWYgKChkb2N1bWVudFBvc2l0aW9uID09IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSAmJiAocmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfQ09NTUVOVF9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ESVJFQ1RJVkVfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSkpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHRyZWVOb2RlLCB4bWxub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkodHJlZU5vZGUpKTsKLQkJCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJfQotCQkvLyBOb3QgYSBEb2N1bWVudCBvciBFbGVtZW50PyAob2RkIGNhc2VzIGdvIGhlcmUgZm9yIG5vdykKLQkJZWxzZSBpZiAoaXNDbG9zZVJlZ2lvbihjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh0cmVlTm9kZSwgeG1sbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCksIDAsIG1hdGNoU3RyaW5nKTsKLQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeSh0cmVlTm9kZSkgKyAxKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgJiYgKHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0NPTU1FTlRfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfU0NSSVBUTEVUX09QRU4pIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikpKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHRyZWVOb2RlLCB4bWxub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeSh0cmVlTm9kZSkpOwotCQkJYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIENPTlRFTlQgQVNTSVNUIFNUQVJUUyBIRVJFCi0JICogCi0JICogUmV0dXJuIGEgbGlzdCBvZiBwcm9wb3NlZCBjb2RlIGNvbXBsZXRpb25zIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0LWVkaXRvciBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24gLQotCSAqICAgICAgICAgICAgdGhlIGN1cnNvciBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogCi0JICogYW4gYXJyYXkgb2YgSUNvbXBsZXRpb25Qcm9wb3NhbHMKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCWZUZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQotCQlJbmRleGVkUmVnaW9uIHRyZWVOb2RlID0gQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgdHJlZU5vZGU7Ci0JCXdoaWxlICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkpIHsKLQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlJRE9NTm9kZSB4bWxub2RlID0gKElET01Ob2RlKSBub2RlOwotCi0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uID0gZ2V0Q29tcGxldGlvblJlZ2lvbihkb2N1bWVudFBvc2l0aW9uLCBub2RlKTsKLQotCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBnZXRNYXRjaFN0cmluZyhzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gSGFuZGxlIGVtcHR5IERvY3VtZW50cwotCQlpZiAoY29tcGxldGlvblJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlpZiAoKCh0cmVlTm9kZSA9PSBudWxsKSB8fCAoKChOb2RlKSB0cmVlTm9kZSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpKSAmJiAoY29tcGxldGlvblJlZ2lvbiA9PSBudWxsKSAmJiAoKHhtbG5vZGUgPT0gbnVsbCkgfHwgKHhtbG5vZGUuZ2V0Q2hpbGROb2RlcygpID09IG51bGwpIHx8ICh4bWxub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkpIHsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodGV4dFZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCUlET01Eb2N1bWVudCBkb2NOb2RlID0gKChJRE9NTW9kZWwpIHNNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoZG9jTm9kZSwgZG9jTm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG51bGwpOwotCQkJCQkJYWRkRW1wdHlEb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicHJvYmxlbSBnZXR0aW5nIG1vZGVsIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJCX0KLQkJCS8vIE1BU1NJVkUgRVJST1IgQ09ORElUSU9OCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbXBsZXRpb24gcmVnaW9uIHdhcyBudWxsIikpOyAvLyROT04tTkxTLTEkCi0JCQlzZXRFcnJvck1lc3NhZ2UoSU5URVJOQUxFUlJPUik7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KChOb2RlKSB0cmVlTm9kZSwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCX0KLQotCi0JCS8vIGNhdGNoIGRvY3VtZW50cyB3aGVyZSBubyByZWdpb24gY2FuIGJlIGRldGVybWluZWQKLQkJaWYgKCh4bWxub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAoKGNvbXBsZXRpb25SZWdpb24gPT0gbnVsbCkgfHwgKHhtbG5vZGUuZ2V0Q2hpbGROb2RlcygpID09IG51bGwpIHx8ICh4bWxub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkpIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZVN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIChJRE9NTm9kZSkgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJfQotCi0JCS8vIGNvbXB1dGUgbm9ybWFsIHByb3Bvc2FscwotCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCAoSURPTU5vZGUpIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID09IG51bGwpIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoKE5vZGUpIHRyZWVOb2RlLCBub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVTktOT1dOX0NPTlRFWFQgKyAiICIgKyBjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSArICJAIiArIGRvY3VtZW50UG9zaXRpb24pOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JCX0KLQotCQkvKiAKLQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzg5MgotCQkgKiBPbmx5IHNldCB0aGlzIGVycm9yIG1lc3NhZ2UgaWYgbm90aGluZyBlbHNlIHdhcyBhbHJlYWR5IHNldCAKLQkJICoqLwotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuc2l6ZSgpID09IDAgJiYgZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Q29tcGxldGlvblByb3Bvc2FscygpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29udGVudFByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCi0JCS8vIHNldHVwIHRvIGFkZCBjaGlsZHJlbiBhdCB0aGUgY29udGVudCBub2RlJ3MgcG9zaXRpb24KLQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKSwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpICYmICgoKERvY3VtZW50KSBub2RlKS5nZXREb2N0eXBlKCkgPT0gbnVsbCkpIHsKLQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQl9Ci0JCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShub2RlQXRPZmZzZXQpKTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQkJLy8gZW50aXRpZXM/Ci0JCWFkZEVudGl0eVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZG9jdW1lbnRQb3NpdGlvbiwgY29tcGxldGlvblJlZ2lvbiwgbm9kZSk7Ci0JCS8vIGFkZEVudGl0eVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHBvc3NpYmxlIGNvbnRleHRzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcG9zc2libGUKLQkgKiAgICAgICAgICAgIGNvbnRleHRzIGFuIGFycmF5IG9mIGNvbnRleHQgaW5mb3JtYXRpb24gb2JqZWN0cyBvcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY29udGV4dCBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlpZiAoZkF0dHJpYnV0ZUluZm9Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlSW5mb1Byb3ZpZGVyID0gbmV3IEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyKChJU3RydWN0dXJlZERvY3VtZW50KSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKSwgKEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcikgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkpOwotCQl9Ci0JCXJldHVybiBmQXR0cmlidXRlSW5mb1Byb3ZpZGVyLmdldEF0dHJpYnV0ZUluZm9ybWF0aW9uKGRvY3VtZW50T2Zmc2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUVuZFRhZ09wZW5Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaW50IGNvbXBsZXRpb25SZWdpb25TdGFydCA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pOwotCQlpbnQgY29tcGxldGlvblJlZ2lvbkxlbmd0aCA9IGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb25BdENvbXBsZXRpb25PZmZzZXQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbXBsZXRpb25SZWdpb25TdGFydCArIGNvbXBsZXRpb25SZWdpb25MZW5ndGgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb25BdEVuZE9mQ29tcGxldGlvbiA9IHNkUmVnaW9uQXRDb21wbGV0aW9uT2Zmc2V0LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbXBsZXRpb25SZWdpb25TdGFydCArIGNvbXBsZXRpb25SZWdpb25MZW5ndGgpOwotCi0JCWlmICgoZG9jdW1lbnRQb3NpdGlvbiAhPSBjb21wbGV0aW9uUmVnaW9uU3RhcnQpICYmIChyZWdpb25BdEVuZE9mQ29tcGxldGlvbiAhPSBudWxsKSAmJiAocmVnaW9uQXRFbmRPZkNvbXBsZXRpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSkgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IHJlZ2lvbkF0RW5kT2ZDb21wbGV0aW9uOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGVBdE9mZnNldC5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChub2RlQXRPZmZzZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBzZFJlZ2lvbikgewotCQkJCS8vIGFibm9ybWFsIGNhc2UsIHRoaXMgdW5tYXRjaGVkIGVuZCB0YWcgd2lsbCBiZSBhIHNpYmxpbmcKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZUF0T2Zmc2V0LmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vcm1hbCBjYXNlLCB0aGlzIGVuZCB0YWcgaXMgdGhlIHBhcmVudAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlQXRPZmZzZXQsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKwotCQkvLyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJLy8gZWxzZQotCQlpZiAoY29tcGxldGlvblJlZ2lvblN0YXJ0ID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCS8vIHBvc2l0aW9uZWQgYXQgc3RhcnQgb2YgZW5kIHRhZwotCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIHJldHVybiBhbGwgcG9zc2libGUgRW50aXR5UmVmZXJlbmNlUHJvcG9zYWxzIChhY2NvcmRpbmcgdG8gY3VycmVudAotCSAqIHBvc2l0aW9uIGluIGRvYykKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVFbnRpdHlSZWZlcmVuY2VQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCS8vIG9ubHkgaGFuZGxlIFhNTCBjb250ZW50IGZvciBub3cKLQkJVmVjdG9yIHByb3Bvc2FscyA9IG5ldyBWZWN0b3IoKTsgLy8gSUNvbXBsZXRpb25Qcm9wb3NhbHMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKChjb21wbGV0aW9uUmVnaW9uICE9IG51bGwpICYmIChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSkgewotCQkJaW50IG5vZGVPZmZzZXQgPSBkb2N1bWVudFBvc2l0aW9uIC0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbik7Ci0JCQlTdHJpbmcgcmVnaW9uVGV4dCA9IHNkUmVnaW9uLmdldEZ1bGxUZXh0KGNvbXBsZXRpb25SZWdpb24pOwotCi0JCQkvLyBpZiBkaXJlY3RseSB0byB0aGUgcmlnaHQgb2YgYSAmLCByZWdpb24gd2lsbCBiZSBudWxsLCBuZWVkIHRvCi0JCQkvLyBtb3ZlIHRvCi0JCQkvLyB0aGUgcHJldmlvdXMgcmVnaW9uLi4udGhlcmUgbWlnaHQgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMKLQkJCWlmICgocmVnaW9uVGV4dCAhPSBudWxsKSAmJiByZWdpb25UZXh0LnRyaW0oKS5lcXVhbHMoIiIpICYmIChkb2N1bWVudFBvc2l0aW9uID4gMCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldiA9IHRyZWVOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24gLSAxKTsKLQkJCQlpZiAoKHByZXYgIT0gbnVsbCkgJiYgcHJldi5nZXRUZXh0KCkuZXF1YWxzKCImIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA2NjgwCi0JCQkJCS8vIGV4YW1pbmUgcHJldmlvdXMgcmVnaW9uCi0JCQkJCXNkUmVnaW9uID0gcHJldjsKLQkJCQkJY29tcGxldGlvblJlZ2lvbiA9IHByZXYuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCQlyZWdpb25UZXh0ID0gcHJldi5nZXRGdWxsVGV4dCgpOwotCQkJCQlub2RlT2Zmc2V0ID0gMTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHN0cmluZyBtdXN0IHN0YXJ0IHcvICYKLQkJCWlmICgocmVnaW9uVGV4dCAhPSBudWxsKSAmJiByZWdpb25UZXh0LnN0YXJ0c1dpdGgoIiYiKSkgeyAvLyROT04tTkxTLTEkCQkJCQkJIAkJCi0JCQkJU3RyaW5nIGtleSA9IChub2RlT2Zmc2V0ID4gMCkgPyByZWdpb25UZXh0LnN1YnN0cmluZygxLCBub2RlT2Zmc2V0KSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvLyBnZXQgZW50aXR5IHByb3Bvc2FscywgcGFzc2luZyBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhcnQKLQkJCQkvLyBzdHJpbmcKLQkJCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoKE5vZGUpIHRyZWVOb2RlKS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJCUNNRG9jdW1lbnQgeG1sRG9jID0gbXEuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQodHJlZU5vZGUpOwotCQkJCQlDTU5hbWVkTm9kZU1hcCBjbW1hcCA9IG51bGw7Ci0JCQkJCVByb3BlcnRpZXMgZW50aXRpZXMgPSBudWxsOwotCQkJCQlpZiAoeG1sRG9jICE9IG51bGwpIHsKLQkJCQkJCWNtbWFwID0geG1sRG9jLmdldEVudGl0aWVzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNtbWFwICE9IG51bGwpIHsKLQkJCQkJCWVudGl0aWVzID0gbWFwVG9Qcm9wZXJ0aWVzKGNtbWFwKTsKLQkJCQkJfQotCQkJCQllbHNlIC8vIDIyNDc4NyBpbiBhYnNlbmNlIG9mIGNvbnRlbnQgbW9kZWwsIGp1c3QgdXNlCi0JCQkJCS8vIG1pbmltYWwgNSBlbnRpdGllcwotCQkJCQl7Ci0JCQkJCQllbnRpdGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJCQllbnRpdGllcy5wdXQoInF1b3QiLCAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllbnRpdGllcy5wdXQoImFwb3MiLCAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgiYW1wIiwgIiYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllbnRpdGllcy5wdXQoImx0IiwgIjwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllbnRpdGllcy5wdXQoImd0IiwgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJCQkJZW50aXRpZXMucHV0KCJuYnNwIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQkJCQkJCi0JCQkJCX0KLQkJCQkJYWRkRW50aXR5UHJvcG9zYWxzKHByb3Bvc2FscywgZW50aXRpZXMsIGtleSwgbm9kZU9mZnNldCwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgKChwcm9wb3NhbHMuc2l6ZSgpID4gMCkgPyBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSkgOiBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUVxdWFsc1Byb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQlpZiAoKHZhbHVlUmVnaW9uICE9IG51bGwpICYmICh2YWx1ZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgJiYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSA8PSBkb2N1bWVudFBvc2l0aW9uKSkgewotCQkJLy8gcmVwbGFjZSB0aGUgYWRqYWNlbnQgYXR0cmlidXRlIHZhbHVlCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIHZhbHVlUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbiksIHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gYXBwZW5kIGFuIGF0dHJpYnV0ZSB2YWx1ZSBhZnRlciB0aGUgJz0nCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJfQotCQlhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCS8vIHNldHVwIGZvciBhIG5vbi1lbXB0eSBkb2N1bWVudCwgYnV0IG9uZSB0aGF0IGhhc24ndCBiZWVuIGZvcm1hbGx5Ci0JCS8vIHN0YXJ0ZWQKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVUYWdDbG9zZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCi0JCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgfHwgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpKSB7Ci0JCQkvLyB0aGlzIGlzIGEgY29udGVudCByZXF1ZXN0IGFzIHRoZSBkb2N1bWVudFBvc2l0aW9uIGlzIEFGVEVSIHRoZQotCQkJLy8gZW5kIG9mIHRoZSBjbG9zaW5nIHJlZ2lvbgotCQkJaWYgKChub2RlID09IG5vZGVBdE9mZnNldCkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpKSB7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShub2RlQXRPZmZzZXQpKTsKLQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkpIHsKLQkJCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gYXQgdGhlIHN0YXJ0IG9mIHRoZSB0YWcncyBjbG9zZSBvciB3aXRoaW4gaXQKLQkJCUlUZXh0UmVnaW9uIGNsb3NlUmVnaW9uID0gc2RSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQkJYm9vbGVhbiBpbnNpZGVUYWcgPSAhc2RSZWdpb24uaXNFbmRlZCgpIHx8IChkb2N1bWVudFBvc2l0aW9uIDw9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNsb3NlUmVnaW9uKSk7Ci0JCQlpZiAoaW5zaWRlVGFnKSB7Ci0JCQkJLy8gdGhpcyBpcyBhIHJlcXVlc3QgZm9yIGNvbXBsZXRpb25zIHdpdGhpbiBhIHRhZwotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCX0KLQkJCQlpZiAoc2RSZWdpb24gPT0gbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudExlbmd0aCgwKTsKLQkJCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ05hbWVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQotCQlpZiAoc2RSZWdpb24gIT0gbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCS8vIGNvbXBsZXRpbmcgdGhlICpmaXJzdCogdGFnIGluICI8dGFnbmFtZTEgfDx0YWduYW1lMiIKLQkJCUlET01Ob2RlIGFjdHVhbE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKTsKLQkJCWlmIChhY3R1YWxOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IHNkUmVnaW9uKSB7Ci0JCQkJCS8vIHN0YXJ0IHRhZwotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQkJLy8gaXQncyBhdHRyaWJ1dGVzCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uIC0gbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCQlpZiAobm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSAtIDEpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pIC0gMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCQl9Ci0JCQkJCQlhZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBpdCdzIG5hbWUKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uIC0gbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCQlhZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KGFjdHVhbE5vZGUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJCQkvLyBpbnNlcnQgbmFtZQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHJlcGxhY2UgbmFtZQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkJCS8vIHVuY2xvc2VkIHRhZyB3aXRoIG9ubHkgYSBuYW1lOyBzaG91bGQgcHJvbXB0IGZvciBhdHRyaWJ1dGVzCi0JCQkJLy8gYW5kIGEgY2xvc2UgaW5zdGVhZAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiAtIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZy5sZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCWFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDApLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaW50IHJlcGxhY2VMZW5ndGggPSBkb2N1bWVudFBvc2l0aW9uIC0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbik7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZSwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgcmVwbGFjZUxlbmd0aCwgbWF0Y2hTdHJpbmcpOwotCQkJCQlhZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KG5vZGVBdE9mZnNldCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSURPTU5vZGUgYWN0dWFsTm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCWlmIChhY3R1YWxOb2RlICE9IG51bGwpIHsKLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpIHsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJYWRkRW5kVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlVGFnT3BlblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlpZiAoc2RSZWdpb24gIT0gbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCS8vIGNvbXBsZXRpbmcgdGhlICpmaXJzdCogWE1MX1RBR19PUEVOIGluICI8PHRhZ25hbWUiCi0JCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSk7Ci0JCQlpZiAoYWN0dWFsTm9kZSAhPSBudWxsKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KGFjdHVhbE5vZGUpKTsKLQkJCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOyAvLyAocGEpIDIyMDg1MAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCS8vIGF0IHRoZSBzdGFydCBvZiBhbiBleGlzdGluZyB0YWcsIHJpZ2h0IGJlZm9yZSB0aGUgJzwnCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KG5vZGVBdE9mZnNldCkpOwotCQkJCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCS8vIGF0IHRoZSBvcGVuaW5nIG9mIHRoZSBWRVJZIGZpcnN0IHRhZyB3aXRoIGEgJzwnCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3aXRoaW4gdGhlIHdoaXRlIHNwYWNlCi0JCQkJSVRleHRSZWdpb24gbmFtZSA9IGdldE5hbWVSZWdpb24obm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQkvLyAocGEpIElUZXh0UmVnaW9uIHJlZmFjdG9yCi0JCQkJLy8gaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmNvbnRhaW5zT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pKQotCQkJCS8vIHsKLQkJCQlpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lKSA8PSBkb2N1bWVudFBvc2l0aW9uKSAmJiAoc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KG5hbWUpID49IGRvY3VtZW50UG9zaXRpb24pKSkgewotCQkJCQkvLyByZXBsYWNlIHRoZSBleGlzdGluZyBuYW1lCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZSwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lKSwgbmFtZS5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGluc2VydCBhIHZhbGlkIG5ldyBuYW1lLCBvciBwb3NzaWJseSBhbiBlbmQgdGFnCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCAoKE5vZGUpIG5vZGVBdE9mZnNldCkuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50TGVuZ3RoKDApOwotCQkJCX0KLQkJCQlhZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KG5vZGVBdE9mZnNldCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgY21ub2RlJ3MgZG9jdW1lbnRhdGlvbiB0byBkaXNwbGF5IGluIHRoZSBjb21wbGV0aW9uCi0JICogcHJvcG9zYWwncyBhZGRpdGlvbmFsIGluZm8uIElmIG5vIGRvY3VtZW50YXRpb24gZXhpc3RzIGZvciBjbW5vZGUsIHRyeQotCSAqIGRpc3BsYXlpbmcgcGFyZW50T3JPd25lcidzIGRvY3VtZW50YXRpb24KLQkgKiAKLQkgKiBTdHJpbmcgYW55IGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gdG8gZGlzcGxheSBmb3IgY21ub2RlLgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcGxheS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFkZGl0aW9uYWxJbmZvKENNTm9kZSBwYXJlbnRPck93bmVyLCBDTU5vZGUgY21ub2RlKSB7Ci0JCVN0cmluZyBhZGRsSW5mbyA9IG51bGw7Ci0KLQkJaWYgKGNtbm9kZSA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBkZWNsYXJhdGlvbiEiKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlhZGRsSW5mbyA9IGdldEluZm9Qcm92aWRlcigpLmdldEluZm8oY21ub2RlKTsKLQkJaWYgKChhZGRsSW5mbyA9PSBudWxsKSAmJiAocGFyZW50T3JPd25lciAhPSBudWxsKSkgewotCQkJYWRkbEluZm8gPSBnZXRJbmZvUHJvdmlkZXIoKS5nZXRJbmZvKHBhcmVudE9yT3duZXIpOwotCQl9Ci0JCXJldHVybiBhZGRsSW5mbzsKLQl9Ci0KLQkvLyByZXR1cm5zIGEgbGlzdCBvZiBNb2RlbFF1ZXJ5QWN0aW9ucwotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleChFbGVtZW50IHBhcmVudCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotCQlpZiAocGFyZW50RGVjbCAhPSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJLy8gdGFrZW4gZnJvbSBBY3Rpb25NYW5hZ2VycwotCQkJLy8gaW50IGVkaXRNb2RlID0gbW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpOwotCQkJaW50IGVkaXRNb2RlID0gTW9kZWxRdWVyeS5FRElUX01PREVfVU5DT05TVFJBSU5FRDsKLQkJCWludCBpYyA9IChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpID8gTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTIHwgTW9kZWxRdWVyeS5JTkNMVURFX1NFUVVFTkNFX0dST1VQUyA6IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnQsIHBhcmVudERlY2wsIGluZGV4LCBpYywgdmFsaWRpdHlDaGVja2luZywgbGlzdCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLy8gcmV0dXJucyBhIGxpc3Qgb2YgQ01FbGVtZW50RGVjbGFyYXRpb25zCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKERvY3VtZW50IGRvY3VtZW50LCBpbnQgY2hpbGRJbmRleCkgewotCQlMaXN0IGxpc3QgPSBudWxsOwotCi0JCS8vIGV4dHJhY3QgdGhlIHZhbGlkICdyb290JyBub2RlIG5hbWUgZnJvbSB0aGUgRG9jdW1lbnRUeXBlIE5vZGUKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCVN0cmluZyByb290TmFtZSA9IG51bGw7Ci0JCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCXJvb3ROYW1lID0gZG9jVHlwZS5nZXROb2RlTmFtZSgpOwotCQl9Ci0JCWlmIChyb290TmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQkJfQotCi0JCWZvciAoTm9kZSBjaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkvLyBtYWtlIHN1cmUgdGhlICJyb290IiBFbGVtZW50IGlzbid0IGFscmVhZHkgcHJlc2VudAotCQkJLy8gaXMgaXQgcmVxdWlyZWQgdG8gYmUgYW4gRWxlbWVudD8KLQkJCWlmICgoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgc3RyaW5nc0VxdWFsKGNoaWxkLmdldE5vZGVOYW1lKCksIHJvb3ROYW1lKSkgewotCQkJCS8vIGlmIHRoZSBub2RlIGlzIG1pc3NpbmcgZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgdGFnLCBkb24ndAotCQkJCS8vIGNvdW50IGl0IGFzIHByZXNlbnQKLQkJCQlpZiAoKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpICYmICgoKChJRE9NTm9kZSkgY2hpbGQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgfHwgKCgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocm9vdE5hbWUgKyAiIGFscmVhZHkgcHJlc2VudCEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5UaGVfZG9jdW1lbnRfZWxlbWVudF9fLCAobmV3IE9iamVjdFtde3Jvb3ROYW1lfSkpKTsKLQkJCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQkJCX0KLQkJfQotCi0JCWxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01Eb2N1bWVudCBjbWRvYyA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJaWYgKGNtZG9jICE9IG51bGwpIHsKLQkJCQlpZiAocm9vdE5hbWUgIT0gbnVsbCkgewotCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByb290RGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21kb2MuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0ocm9vdE5hbWUpOwotCQkJCQlpZiAocm9vdERlY2wgIT0gbnVsbCkgewotCQkJCQkJbGlzdC5hZGQocm9vdERlY2wpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gc3VwcGx5IHRoZSBnaXZlbiBkb2N1bWVudCBuYW1lIGFueXdheSwgZXZlbiBpZiBpdAotCQkJCQkJLy8gaXMgYW4gZXJyb3IKLQkJCQkJCWxpc3QuYWRkKG5ldyBTaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbihyb290TmFtZSkpOwotCQkJCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvIHx8IERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gZGVmaW5pdGlvbiBmb3VuZCBmb3IgIiArIHJvb3ROYW1lICsgIiBpbiAiICsgZG9jVHlwZS5nZXRQdWJsaWNJZCgpICsgIi8iICsgZG9jVHlwZS5nZXRTeXN0ZW1JZCgpKTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbG9jYXRpb24gPSAiIiArIChkb2NUeXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCA/IGRvY1R5cGUuZ2V0UHVibGljSWQoKSArICIvIiA6ICIiKSArIChkb2NUeXBlLmdldFN5c3RlbUlkKCkgIT0gbnVsbCA/IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGxvY2F0aW9uLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk5vX2RlZmluaXRpb25fZm9yX2luLCAobmV3IE9iamVjdFtde3Jvb3ROYW1lLCBsb2NhdGlvbn0pKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19kZWZpbml0aW9uX2ZvciwgKG5ldyBPYmplY3RbXXtyb290TmFtZX0pKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoRGVidWcuZGlzcGxheUluZm8gfHwgRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gY29udGVudCBtb2RlbCBmb3VuZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBsb2NhdGlvbiA9ICIiICsgKGRvY1R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsID8gZG9jVHlwZS5nZXRQdWJsaWNJZCgpICsgIi8iIDogIiIpICsgKGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsID8gZG9jVHlwZS5nZXRTeXN0ZW1JZCgpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCS8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobG9jYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk5vX2NvbnRlbnRfbW9kZWxfZm9yLCAobmV3IE9iamVjdFtde2xvY2F0aW9ufSkpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShYTUxVSU1lc3NhZ2VzLk5vX2NvbnRlbnRfbW9kZWxfZm91bmRfVUlfKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oTm9kZSBub2RlKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgcG9zc2libGUgY29tcGxldGlvbnMuCi0JICogCi0JICogdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0Q29tcGxldGlvblJlZ2lvbihpbnQgb2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA9PSBvZmZzZXQpIHsKLQkJCS8vIFRoZSBvZmZzZXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVnaW9uCi0JCQlpZiAoKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSkgJiYgKHNkUmVnaW9uLmdldFByZXZpb3VzKCkgIT0gbnVsbCkgJiYgKCFzZFJlZ2lvbi5nZXRQcmV2aW91cygpLmlzRW5kZWQoKSkpIHsKLQkJCQkvLyBJcyB0aGUgcmVnaW9uIGFsc28gdGhlIHN0YXJ0IG9mIHRoZSBub2RlPyBJZiBzbywgdGhlCi0JCQkJLy8gcHJldmlvdXMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcwotCQkJCS8vIHdoZXJlIHRvIGxvb2sgZm9yIGEgdXNlZnVsIHJlZ2lvbi4KLQkJCQlyZWdpb24gPSBzZFJlZ2lvbi5nZXRQcmV2aW91cygpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCAtIDEpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gSXMgdGhlcmUgbm8gc2VwYXJhdGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIHByZXZpb3VzIHJlZ2lvbj8KLQkJCQkvLyBJZiBub3QsCi0JCQkJLy8gdGhlbiB0aGF0IHJlZ2lvbiBpcyB0aGUgaW1wb3J0YW50IG9uZQotCQkJCUlUZXh0UmVnaW9uIHByZXZpb3VzUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0IC0gMSk7Ci0JCQkJaWYgKChwcmV2aW91c1JlZ2lvbiAhPSBudWxsKSAmJiAocHJldmlvdXNSZWdpb24gIT0gcmVnaW9uKSAmJiAocHJldmlvdXNSZWdpb24uZ2V0VGV4dExlbmd0aCgpID09IHByZXZpb3VzUmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJCQlyZWdpb24gPSBwcmV2aW91c1JlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUaGUgb2Zmc2V0IGlzIE5PVCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWdpb24KLQkJCWlmIChvZmZzZXQgPiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pICsgcmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkJCS8vIElzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSB3aGl0ZXNwYWNlIGFmdGVyIHRoZSB0ZXh0IGluIHRoaXMKLQkJCQkvLyByZWdpb24/Ci0JCQkJLy8gSWYgc28sIHVzZSB0aGUgbmV4dCByZWdpb24KLQkJCQlJVGV4dFJlZ2lvbiBuZXh0UmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZWdpb24gPSBuZXh0UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIElzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBpbXBvcnRhbnQgdGV4dCBmb3IgdGhpcyByZWdpb24/Ci0JCQkJLy8gSWYgc28sIHRoZW4gd2UndmUgYWxyZWFkeSBnb3QgdGhlIHJpZ2h0IG9uZS4KLQkJCX0KLQkJfQotCi0JCS8vIHZhbGlkIFdISVRFX1NQQUNFIHJlZ2lvbiBoYW5kbGVyICgjMTc5OTI0KQotCQlpZiAoKHJlZ2lvbiAhPSBudWxsKSAmJiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSkgewotCQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pIC0gMSk7Ci0JCQlpZiAocHJldmlvdXNSZWdpb24gIT0gbnVsbCkgewotCQkJCXJlZ2lvbiA9IHByZXZpb3VzUmVnaW9uOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lvbiB3aG9zZSBjb250ZW50J3MgcmVxdWlyZSBjb21wbGV0aW9uLiBUaGlzIGlzIHNvbWV0aGluZwotCSAqIG9mIGEgbWlzbm9tZXIgYXMgc29tZXRpbWVzIHRoZSB1c2VyIHdhbnRzIHRvIGJlIHByb21wdGVkIGZvciBjb250ZW50cwotCSAqIG9mIGEgbm9uLWV4aXN0YW50IElUZXh0UmVnaW9uLCBzdWNoIGFzIGZvciBlbnVtZXJhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMKLQkgKiBmb2xsb3dpbmcgYW4gJz0nIHNpZ24uCi0JICovCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldENvbXBsZXRpb25SZWdpb24oaW50IGRvY3VtZW50UG9zaXRpb24sIE5vZGUgZG9tbm9kZSkgewotCQlpZiAoZG9tbm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSBkb2N1bWVudFBvc2l0aW9uOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZG9tbm9kZTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQl3aGlsZSAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlvZmZzZXQtLTsKLQkJCQlyZXN1bHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZyA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJLy8gRGV0ZXJtaW5lIGlmIHRoZSBvZmZzZXQgaXMgd2l0aGluIHRoZSBzdGFydAotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBlbmQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgb3IKLQkJLy8gc29tZXdoZXJlIHdpdGhpbiB0aGUgTm9kZSdzIFhNTCBjb250ZW50LgotCQlpZiAoKHN0YXJ0VGFnICE9IG51bGwpICYmIChzdGFydFRhZy5nZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCkgJiYgKG9mZnNldCA8IHN0YXJ0VGFnLmdldFN0YXJ0T2Zmc2V0KCkgKyBzdGFydFRhZy5nZXRMZW5ndGgoKSkpIHsKLQkJCWZsYXROb2RlID0gc3RhcnRUYWc7Ci0JCX0KLQkJZWxzZSBpZiAoKGVuZFRhZyAhPSBudWxsKSAmJiAoZW5kVGFnLmdldFN0YXJ0T2Zmc2V0KCkgPD0gb2Zmc2V0KSAmJiAob2Zmc2V0IDwgZW5kVGFnLmdldFN0YXJ0T2Zmc2V0KCkgKyBlbmRUYWcuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlmbGF0Tm9kZSA9IGVuZFRhZzsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkvLyB0aGUgb2Zmc2V0IGlzIGRlZmluaXRlbHkgd2l0aGluIHRoZSBzdGFydCBvciBlbmQgdGFnLCBjb250aW51ZQotCQkJLy8gb24gYW5kIGZpbmQgdGhlIHJlZ2lvbgotCQkJcmVnaW9uID0gZ2V0Q29tcGxldGlvblJlZ2lvbihvZmZzZXQsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRoZSBkb2NQb3NpdGlvbiBpcyBuZWl0aGVyIHdpdGhpbiB0aGUgc3RhcnQgbm9yIHRoZSBlbmQsIHNvIGl0Ci0JCQkvLyBtdXN0IGJlIGNvbnRlbnQKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJLy8gKHBhKSBJVGV4dFJlZ2lvbiByZWZhY3RvcgotCQkJLy8gaWYgKGZsYXROb2RlLmNvbnRhaW5zKGRvY3VtZW50UG9zaXRpb24pKSB7Ci0JCQlpZiAoKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPD0gZG9jdW1lbnRQb3NpdGlvbikgJiYgKGZsYXROb2RlLmdldEVuZE9mZnNldCgpID49IGRvY3VtZW50UG9zaXRpb24pKSB7Ci0JCQkJLy8gd2UncmUgaW50ZXJlc3RpbmcgaW4gY29tcGxldGluZy9leHRlbmRpbmcgdGhlIHByZXZpb3VzCi0JCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpZiB0aGUgY3VycmVudAotCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXNuJ3QgcGxhaW4gY29udGVudCBvciBpZiBpdCdzCi0JCQkJLy8gcHJlY2VkZWQgYnkgYW4gb3JwaGFuICc8JwotCQkJCWlmICgob2Zmc2V0ID09IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpICYmIChmbGF0Tm9kZS5nZXRQcmV2aW91cygpICE9IG51bGwpICYmICgoKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pICE9IG51bGwpICYmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkpIHx8IChmbGF0Tm9kZS5nZXRQcmV2aW91cygpLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8IChmbGF0Tm9kZS5nZXRQcmV2aW91cygpLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSkpIHsKLQkJCQkJLy8gSXMgdGhlIHJlZ2lvbiBhbHNvIHRoZSBzdGFydCBvZiB0aGUgbm9kZT8gSWYgc28sIHRoZQotCQkJCQkvLyBwcmV2aW91cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzCi0JCQkJCS8vIHdoZXJlIHRvIGxvb2sgZm9yIGEgdXNlZnVsIHJlZ2lvbi4KLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UHJldmlvdXMoKS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZsYXROb2RlLmdldEVuZE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBjYXRjaCBlbmQgb2YgZG9jdW1lbnQgcG9zaXRpb25zIHdoZXJlIHRoZSBkb2NQb3NpdGlvbiBpc24ndAotCQkJCS8vIGluIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldExhc3RSZWdpb24oKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZWQgYnkgZGVmYXVsdC4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgd2l0aCB0aGVpciBvd24KLQkgKiBpbXBsZW1lbnRhdGlvbnMuCi0JICogCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGVudEdlbmVyYXRvcigpCi0JICovCi0JcHVibGljIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBnZXRDb250ZW50R2VuZXJhdG9yKCkgewotCQlpZiAoZkdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlmR2VuZXJhdG9yID0gbmV3IFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcigpOwotCQl9Ci0JCXJldHVybiBmR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQgaW5mb3JtYXRpb24gb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dAotCSAqIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZSBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIGEgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCWlmIChmQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyID09IG51bGwpIHsKLQkJCWZDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgPSBuZXcgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRFbGVtZW50UG9zaXRpb24oTm9kZSBjaGlsZCkgewotCQlOb2RlIHBhcmVudCA9IGNoaWxkLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBjb3VudCA9IDA7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW4uaXRlbShpKSA9PSBjaGlsZCkgewotCQkJCXJldHVybiBjb3VudDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlmIChjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KE5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRQb3NpdGlvbihjaGlsZCk7Ci0JCS8vIHJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlYXNvbiB3aHkgY29tcHV0ZVByb3Bvc2FscyB3YXMgbm90IGFibGUgdG8gZmluZCBhbnkKLQkgKiBjb21wbGV0aW9ucy4KLQkgKiAKLQkgKiBhbiBlcnJvciBtZXNzYWdlIG9yIG51bGwgaWYgbm8gZXJyb3Igb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlSZXNvdXJjZQotCSAqLwotCS8vIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVJlc291cmNlIGlSZXNvdXJjZSkgewotCS8vIHRoaXMucmVzb3VyY2UgPSBpUmVzb3VyY2U7Ci0JLy8gfQotCS8qKgotCSAqIEdldHMgdGhlIGluZm9Qcm92aWRlci4KLQkgKiAKLQkgKiBmSW5mb1Byb3ZpZGVyIGFuZCBpZiBmSW5mb1Byb3ZpZGVyIHdhcyA8Y29kZT5udWxsPC9jb2RlPiBjcmVhdGUgYSBuZXcKLQkgKiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZ2V0SW5mb1Byb3ZpZGVyKCkgewotCQlpZiAoZkluZm9Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmSW5mb1Byb3ZpZGVyID0gbmV3IE1hcmt1cFRhZ0luZm9Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5mb1Byb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWF0Y2hTdHJpbmcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIElUZXh0UmVnaW9uIGFSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJaWYgKChhUmVnaW9uID09IG51bGwpIHx8IGlzQ2xvc2VSZWdpb24oYVJlZ2lvbikpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBtYXRjaFN0cmluZyA9IG51bGw7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gYVJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8IChvZmZzZXQgPiBwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbikgKyBhUmVnaW9uLmdldFRleHRMZW5ndGgoKSkpIHsKLQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWlmICgocGFyZW50LmdldFRleHQoYVJlZ2lvbikubGVuZ3RoKCkgPiAwKSAmJiAocGFyZW50LmdldFN0YXJ0T2Zmc2V0KGFSZWdpb24pIDwgb2Zmc2V0KSkgewotCQkJCW1hdGNoU3RyaW5nID0gcGFyZW50LmdldFRleHQoYVJlZ2lvbikuc3Vic3RyaW5nKDAsIG9mZnNldCAtIHBhcmVudC5nZXRTdGFydE9mZnNldChhUmVnaW9uKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hdGNoU3RyaW5nOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUl0ZXJhdG9yIHJlZ2lvbkxpc3QgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJlZ2lvbkxpc3QuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbkxpc3QubmV4dCgpOwotCQkJaWYgKGlzTmFtZVJlZ2lvbihyZWdpb24pKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgYWxsIG9mIHRoZSBwb3NzaWJsZSB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlCi0JICogZGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKE5vZGUgbm9kZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkgewotCQlMaXN0IGxpc3QgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCVN0cmluZ1tdIGRhdGFUeXBlVmFsdWVzID0gbnVsbDsKLQkJCS8vIFRoZSBNb2RlbFF1ZXJ5IG1heSBub3QgYmUgYXZhaWxhYmxlIGlmIHRoZSBjb3JyZXNwb25kaW5nCi0JCQkvLyBhZGFwdGVyCi0JCQkvLyBpcyBhYnNlbnQKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJCWRhdGFUeXBlVmFsdWVzID0gbW9kZWxRdWVyeS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKGVsZW1lbnQsIGFkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChhZC5nZXRBdHRyVHlwZSgpICE9IG51bGwpIHsKLQkJCQkJZGF0YVR5cGVWYWx1ZXMgPSBhZC5nZXRBdHRyVHlwZSgpLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGF0YVR5cGVWYWx1ZXMgIT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KGRhdGFUeXBlVmFsdWVzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhVHlwZVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCQlsaXN0LmFkZChkYXRhVHlwZVZhbHVlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWROYW1lKE5vZGUgcGFyZW50T3JPd25lciwgQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoKGNtbm9kZSA9PSBudWxsKSB8fCAocGFyZW50T3JPd25lciA9PSBudWxsKSkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgZGVjbGFyYXRpb24hIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0UmVxdWlyZWROYW1lKHBhcmVudE9yT3duZXIsIGNtbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFRleHQoTm9kZSBwYXJlbnRPck93bmVyLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsKSB7Ci0JCWlmIChhdHRyRGVjbCA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb24hIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2VuZXJhdGVSZXF1aXJlZEF0dHJpYnV0ZShwYXJlbnRPck93bmVyLCBhdHRyRGVjbCwgYnVmZik7Ci0JCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFRleHQoTm9kZSBwYXJlbnRPck93bmVyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgYXR0cmlidXRlIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKHBhcmVudE9yT3duZXIsIGVsZW1lbnREZWNsLCBidWZmKTsKLQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBtdXN0IGJlIHNldCBiZWZvcmUgdXNpbmcgdGhpcy4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IHBvcykgewotCQkvLyAocGEpIElUZXh0UmVnaW9uIHJlZmFjdG9yIGRlZmVjdCAyNDUxOTAKLQkJLy8gcmV0dXJuCi0JCS8vIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKUNvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKWZUZXh0Vmlld2VyLAotCQkvLyBwb3MpOwotCQlyZXR1cm4gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmVGV4dFZpZXdlciwgcG9zKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUYWdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmFtZSA9IHNkUmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvLyByZXR1cm5zIGEgbGlzdCBvZiBDTU5vZGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBwYXJlbnQgY29udGV4dAotCS8vIEdpdmVuIHRoZSBncmFtbWFyIHNob3duIGJlbG93IGFuZCBhIHNuaXBwZXQgb2YgWE1MIGNvZGUgKHdoZXJlIHRoZSAnfCcKLQkvLyBpbmRpY2F0ZWQgdGhlIGN1cnNvciBwb3NpdGlvbikKLQkvLyB0aGUgbGlzdCB3b3VsZCByZXR1cm4gYWxsIG9mIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9ucyB0aGF0IGFyZQotCS8vIHBvdGVudGlhbCBjaGlsZCBlbGVtZW50cyBvZiBGb28uCi0JLy8KLQkvLyBncmFtbWFyIDogRm9vIC0+IChBLCBCLCBDKQotCS8vIHNuaXBwZXQgOiA8Rm9vPjxBPnwKLQkvLyByZXN1bHQgOiB7QSwgQiwgQ30KLQkvLyAKLQkvLyBUT0RPIGNzLi4uIGRvIHdlIG5lZWQgdG8gcGFzcyBpbiB0aGUgJ2tpbmRPZkFjdGlvbic/IFNlZW1zIHRvIG1lIHdlCi0JLy8gY291bGQgYXNzdW1lIGl0J3MgYWx3YXlzIGFuIGluc2VydC4KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoRWxlbWVudCBwYXJlbnQsIGludCBjaGlsZFBvc2l0aW9uLCBpbnQga2luZE9mQWN0aW9uKSB7Ci0JCUxpc3QgbW9kZWxRdWVyeUFjdGlvbnMgPSBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgocGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5LlZBTElESVRZX05PTkUpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsUXVlcnlBY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCUxpc3QgY21ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKChjaGlsZFBvc2l0aW9uIDwgMCkgfHwgKCgoYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSA8PSBjaGlsZFBvc2l0aW9uKSAmJiAoY2hpbGRQb3NpdGlvbiA8PSBhY3Rpb24uZ2V0RW5kSW5kZXgoKSkpICYmIChhY3Rpb24uZ2V0S2luZCgpID09IGtpbmRPZkFjdGlvbikpKSB7Ci0JCQkJQ01Ob2RlIGFjdGlvbkNNTm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLQkJCQlpZiAoKGFjdGlvbkNNTm9kZSAhPSBudWxsKSAmJiAhY21ub2Rlcy5jb250YWlucyhhY3Rpb25DTU5vZGUpKSB7Ci0JCQkJCWNtbm9kZXMuYWRkKGFjdGlvbkNNTm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjbW5vZGVzOwotCX0KLQotCS8vIHJldHVybnMgYSBsaXN0IG9mIENNTm9kZXMgdGhhdCBjYW4gYmUgdmFsaWRseSBpbnNlcnRlZCBhdCB0aGlzCi0JLy8gY2hpbGRQb3NpdGlvbgotCS8vIEdpdmVuIHRoZSBncmFtbWFyIHNob3duIGJlbG93IGFuZCBhIHNuaXBwZXQgb2YgWE1MIGNvZGUgKHdoZXJlIHRoZSAnfCcKLQkvLyBpbmRpY2F0ZWQgdGhlIGN1cnNvciBwb3NpdGlvbikKLQkvLyB0aGUgbGlzdCB3b3VsZCByZXR1cm4gb25seSB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgY2FuIGJlIGluc2VydGVkCi0JLy8gd2hpbGUgbWFpbnRhaW5nIHZhbGlkaXR5IG9mIHRoZSBjb250ZW50LgotCS8vCi0JLy8gZ3JhbW1hciA6IEZvbyAtPiAoQSwgQiwgQykKLQkvLyBzbmlwcGV0IDogPEZvbz48QT58Ci0JLy8gcmVzdWx0IDoge0J9Ci0JLy8gICAgCi0JcHJvdGVjdGVkIExpc3QgZ2V0VmFsaWRDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoRWxlbWVudCBwYXJlbnQsIGludCBjaGlsZFBvc2l0aW9uLCBpbnQga2luZE9mQWN0aW9uKSB7Ci0JCUxpc3QgbW9kZWxRdWVyeUFjdGlvbnMgPSBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgocGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5LlZBTElESVRZX1NUUklDVCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxRdWVyeUFjdGlvbnMuaXRlcmF0b3IoKTsKLQkJTGlzdCBjbW5vZGVzID0gbmV3IFZlY3RvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoKGNoaWxkUG9zaXRpb24gPCAwKSB8fCAoKChhY3Rpb24uZ2V0U3RhcnRJbmRleCgpIDw9IGNoaWxkUG9zaXRpb24pICYmIChjaGlsZFBvc2l0aW9uIDw9IGFjdGlvbi5nZXRFbmRJbmRleCgpKSkgJiYgKGFjdGlvbi5nZXRLaW5kKCkgPT0ga2luZE9mQWN0aW9uKSkpIHsKLQkJCQlDTU5vZGUgYWN0aW9uQ01Ob2RlID0gYWN0aW9uLmdldENNTm9kZSgpOwotCQkJCWlmICgoYWN0aW9uQ01Ob2RlICE9IG51bGwpICYmICFjbW5vZGVzLmNvbnRhaW5zKGFjdGlvbkNNTm9kZSkpIHsKLQkJCQkJY21ub2Rlcy5hZGQoYWN0aW9uQ01Ob2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNtbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogU2ltaWxhciB0byB0aGUgY2FsbCBpbiBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci4gUGFzcyBpbiBhIG5vZGUsIGl0Ci0JICogdGVsbHMgeW91IGlmIHRoZSBkb2N1bWVudCBpcyBYTUwgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFhNTChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJZG9jID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpID8gbm9kZS5nZXRPd25lckRvY3VtZW50KCkgOiAoKERvY3VtZW50KSBub2RlKTsKLQotCQlyZXR1cm4gKGRvYyBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgJiYgKChJRE9NRG9jdW1lbnQpIGRvYykuaXNYTUxUeXBlKCk7Ci0JfQotCi0JLy8gSW5pdGlhbGl6ZSBsb2NhbCBzZXR0aW5ncwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIGltcGxlbWVudCBpbiBzdWJjbGFzc2VzCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4gKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0FUVExJU1RfREVDTF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9DTE9TRSkpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIHRvIGRldGVybWluZSBpZiBhIHRhZyBpcyBhIHNwZWNpYWwgbWV0YS1pbmZvIGNvbW1lbnQgdGFnIHRoYXQKLQkgKiBzaG93cyB1cCBhcyBhbiBFTEVNRU5UCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKChub2RlICE9IG51bGwpICYmIChub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpICYmICgoSURPTUVsZW1lbnQpIG5vZGUpLmlzQ29tbWVudFRhZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgY3Vyc29yIHBvc2l0aW9uIGlzIGFmdGVyIGRvY3R5cGUgdGFnLi4uCi0JICogCi0JICogQHBhcmFtIGNhcgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ3Vyc29yQWZ0ZXJEb2N0eXBlKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNhcikgewotCQlOb2RlIGFOb2RlID0gY2FyLmdldE5vZGUoKTsKLQkJRG9jdW1lbnQgcGFyZW50ID0gYU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpbnQgeG1sZG9jdHlwZU5vZGVQb3NpdGlvbiA9IC0xOwotCQlib29sZWFuIGlzQWZ0ZXJEb2N0eXBlID0gdHJ1ZTsKLQotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOyAvLyBibGFuayBkb2N1bWVudCBjYXNlCi0JCX0KLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkJeG1sZG9jdHlwZU5vZGVQb3NpdGlvbiA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJaXNBZnRlckRvY3R5cGUgPSAoY2FyLmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpID49IHhtbGRvY3R5cGVOb2RlUG9zaXRpb24pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzQWZ0ZXJEb2N0eXBlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBjaGVjayBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIHRoZSBYTUxQSQotCSAqIAotCSAqIEBwYXJhbSBjYXIKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckFmdGVyWE1MUEkoQ29udGVudEFzc2lzdFJlcXVlc3QgY2FyKSB7Ci0JCU5vZGUgYU5vZGUgPSBjYXIuZ2V0Tm9kZSgpOwotCQlib29sZWFuIHhtbHBpRm91bmQgPSBmYWxzZTsKLQkJRG9jdW1lbnQgcGFyZW50ID0gYU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpbnQgeG1scGlOb2RlUG9zaXRpb24gPSAtMTsKLQkJYm9vbGVhbiBpc0FmdGVyWE1MUEkgPSBmYWxzZTsKLQotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOyAvLyBibGFuayBkb2N1bWVudCBjYXNlCi0JCX0KLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWJvb2xlYW4geG1scGkgPSAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXhtbHBpRm91bmQgPSB4bWxwaUZvdW5kIHx8IHhtbHBpOwotCQkJaWYgKHhtbHBpRm91bmQpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQl4bWxwaU5vZGVQb3NpdGlvbiA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJaXNBZnRlclhNTFBJID0gKGNhci5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSA+PSB4bWxwaU5vZGVQb3NpdGlvbik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc0FmdGVyWE1MUEk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYW1lUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCXJldHVybiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9BVFRMSVNUX0RFQ0xfTkFNRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfUk9PVF9UQUdfTkFNRSkgfHwgdHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX05BTUUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1F1b3RlKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIHRyaW1tZWQgPSBzdHJpbmcudHJpbSgpOwotCQlpZiAodHJpbW1lZC5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiAodHJpbW1lZC5jaGFyQXQoMCkgPT0gJ1wnJykgfHwgKHRyaW1tZWQuY2hhckF0KDApID09ICciJyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1NlbGZDbG9zZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZykgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnLmdldFJlZ2lvbnMoKTsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChzZFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJSVRleHRSZWdpb24gciA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JCQlyZXN1bHQgPSAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pICYmIHNkUmVnaW9uLmlzRW5kZWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0aWVzIG1hcFRvUHJvcGVydGllcyhDTU5hbWVkTm9kZU1hcCBtYXApIHsKLQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJQ01FbnRpdHlEZWNsYXJhdGlvbiBkZWNsID0gKENNRW50aXR5RGVjbGFyYXRpb24pIG1hcC5pdGVtKGkpOwotCQkJcC5wdXQoZGVjbC5nZXROYW1lKCksIGRlY2wuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29ycmVzcG9uZGluZyBYTUxOb2RlLCBhbmQgY2hlY2tzIGlmIGl0J3MgY2xvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydFRhZwotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBuZWVkc0VuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmVGV4dFZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJdHJ5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnLmdldFN0YXJ0KCkpOwotCQkJCWlmICghaXNTdGFydFRhZyhzdGFydFRhZykpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGlzU2VsZkNsb3NlZChzdGFydFRhZykpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF4bWxOb2RlLmlzQ29udGFpbmVyKCkpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSB4bWxOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KE5vZGUgbm9kZSwgTm9kZSBwb3NzaWJsZVBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3Qobm9kZSwgcG9zc2libGVQYXJlbnQsIGRvY3VtZW50UmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBiZWdpbiwgbGVuZ3RoLCBmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZHZW5lcmF0b3IgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCWZFcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55Ci0JICogY29tcGxldGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UsIFN0cmluZyBhcHBlbmQpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSArIGFwcGVuZCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55Ci0JICogY29tcGxldGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UsIFN0cmluZyBwcmVwZW5kLCBTdHJpbmcgYXBwZW5kKSB7Ci0JCXNldEVycm9yTWVzc2FnZShwcmVwZW5kICsgZXJyb3JNZXNzYWdlICsgYXBwZW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpbmdzRXF1YWwoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCS8vIChwYSkgMjIxMTkwIG1hdGNoaW5nIGluZGVwZW5kZW50IG9mIGNhc2UgdG8gYmUgY29uc2lzdGFudCB3aXRoIEphdmEKLQkJLy8gZWRpdG9yIENBCi0JCXJldHVybiBhLmVxdWFsc0lnbm9yZUNhc2UoYik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODQ0ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb250ZW50TW9kZWxHZW5lcmF0b3IgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdlbmVyYXRlQ2hpbGRyZW4gPSBmYWxzZTsKLQotCXB1YmxpYyBBYnN0cmFjdENvbnRlbnRNb2RlbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUF0dHJpYnV0ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKTsKLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQXR0cmlidXRlcyhDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWdlbmVyYXRlQXR0cmlidXRlKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLml0ZW0oaSksIGJ1ZmZlcik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlRW5kVGFnKFN0cmluZyB0YWdOYW1lLCBOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKTsKLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlUmVxdWlyZWRDaGlsZHJlbihOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmIChnZW5lcmF0ZUNoaWxkcmVuKSB7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlU3RhcnRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpOwotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVUYWcoTm9kZSBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmICgoZWxlbWVudERlY2wgPT0gbnVsbCkgfHwgKGJ1ZmZlciA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0KLQkJZ2VuZXJhdGVTdGFydFRhZyh0YWdOYW1lLCBwYXJlbnQsIGVsZW1lbnREZWNsLCBidWZmZXIpOwotCQlnZW5lcmF0ZVJlcXVpcmVkQ2hpbGRyZW4ocGFyZW50LCBlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJZ2VuZXJhdGVFbmRUYWcodGFnTmFtZSwgcGFyZW50LCBlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWluaW1hbFN0YXJ0VGFnTGVuZ3RoKE5vZGUgbm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpOwotCi0JcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZE5hbWUoTm9kZSBvd25lck5vZGUsIENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKG93bmVyTm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGNtbm9kZSwgb3duZXJOb2RlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNBdHRyaWJ1dGVzKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5pdGVtKGkpKS5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlNTE0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbkV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIElDb250ZXh0SW5mb3JtYXRpb24uIEFkZHMga25vd2xlZGdlIGFib3V0IHRoZSBpbmZvcm1hdGlvbgotICogZGlzcGxheSBzdHJpbmcgc3VjaCBhcyByZXF1aXJlZCBhdHRyaWJ1dGVzIGZvciB0aGlzIGNvbnRleHQuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24gaW1wbGVtZW50cyBJQ29udGV4dEluZm9ybWF0aW9uLCBJQ29udGV4dEluZm9ybWF0aW9uRXh0ZW5zaW9uIHsKLQlwcml2YXRlIEhhc2hNYXAgZkF0dHIyUmFuZ2VNYXA7Ci0JLyoqIFRoZSBuYW1lIG9mIHRoZSBjb250ZXh0ICovCi0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRleHREaXNwbGF5U3RyaW5nOwotCS8qKiBUaGUgaW1hZ2UgdG8gYmUgZGlzcGxheWVkICovCi0JcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0JLyoqIFRoZSBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQgKi8KLQlwcml2YXRlIFN0cmluZyBmSW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nOwotCXByaXZhdGUgaW50IGZQb3NpdGlvbiA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IGluZm9ybWF0aW9uIHdpdGggYW4gaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gZGlzcGxheSB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKiBAcGFyYW0gY29udGV4dERpc3BsYXlTdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgdXNlZCB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbnRleHQKLQkgKiBAcGFyYW0gaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZCB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbnRleHQKLQkgKiAgICAgICAgICAgIGluZm9ybWF0aW9uLCBtYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbihJbWFnZSBpbWFnZSwgU3RyaW5nIGNvbnRleHREaXNwbGF5U3RyaW5nLCBTdHJpbmcgaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nLCBIYXNoTWFwIGF0dHIyUmFuZ2VNYXApIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcsICJpbGxlZ2FsIGFyZ3VtZW50OiBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmSW1hZ2UgPSBpbWFnZTsKLQkJZkNvbnRleHREaXNwbGF5U3RyaW5nID0gY29udGV4dERpc3BsYXlTdHJpbmc7Ci0JCWZJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcgPSBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmc7Ci0JCWZBdHRyMlJhbmdlTWFwID0gYXR0cjJSYW5nZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW5mb3JtYXRpb24gd2l0aG91dCBhbiBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dERpc3BsYXlTdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgdXNlZCB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbnRleHQKLQkgKiBAcGFyYW0gaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZCB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbnRleHQKLQkgKiAgICAgICAgICAgIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbihTdHJpbmcgY29udGV4dERpc3BsYXlTdHJpbmcsIFN0cmluZyBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcsIEhhc2hNYXAgYXR0cjJSYW5nZU1hcCkgewotCQl0aGlzKG51bGwsIGNvbnRleHREaXNwbGF5U3RyaW5nLCBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcsIGF0dHIyUmFuZ2VNYXApOwotCX0KLQotCS8qKgotCSAqIE1hcHMgKFN0cmluZyAtPiBQb3NpdGlvbikuIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgVGV4dCBwb3NpdGlvbi4KLQkgKiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSGFzaE1hcCBnZXRBdHRyMlJhbmdlTWFwKCkgewotCQlyZXR1cm4gZkF0dHIyUmFuZ2VNYXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRDb250ZXh0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZXh0RGlzcGxheVN0cmluZygpIHsKLQkJaWYgKGZDb250ZXh0RGlzcGxheVN0cmluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZkNvbnRleHREaXNwbGF5U3RyaW5nOwotCQl9Ci0JCXJldHVybiBmSW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25FeHRlbnNpb24jZ2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZkltYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24jZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIGZJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7Ci0JCWZQb3NpdGlvbiA9IHBvc2l0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDY2MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogUmVzcG9uc2libGUgZm9yIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRleHQgaW5mbyBwb3B1cC4gVGhpcyBpbmNsdWRlcwotICogdGV4dCBzdHlsZSwgYW5kIHdoZW4gdGhlIHdpbmRvdyBzaG91bGQgY2xvc2UuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgaW1wbGVtZW50cyBJQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyLCBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHsKLQlwcml2YXRlIGludCBmRG9jdW1lbnRQb3NpdGlvbiA9IC0xOwotCi0JcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uIGZJbmZvID0gbnVsbDsKLQlwcml2YXRlIENvbnRleHRJbmZvTW9kZWxVdGlsIGZNb2RlbFV0aWwgPSBudWxsOwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0KLQlwdWJsaWMgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaW5zdGFsbChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbywgSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlmSW5mbyA9IGluZm87Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZEb2N1bWVudFBvc2l0aW9uID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJZk1vZGVsVXRpbCA9IG5ldyBDb250ZXh0SW5mb01vZGVsVXRpbCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZlZpZXdlci5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2lzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJLy8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoaXMgY29udGV4dCBpbmZvIHNob3VsZCBzdGlsbCBiZQotCQkvLyBzaG93aW5nLi4uCi0JCS8vIGlmIGN1cnNvciBzdGlsbCB3aXRoaW4gdGhlIGVsZW1lbnQgaXQncyB2YWxpZC4uLgotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZk1vZGVsVXRpbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0gZk1vZGVsVXRpbC5nZXRYTUxOb2RlKGZEb2N1bWVudFBvc2l0aW9uKS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW50IHN0YXJ0ID0gc3RhcnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBlbmQgPSBzdGFydFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCXJlc3VsdCA9IChkb2N1bWVudFBvc2l0aW9uIDwgZW5kKSAmJiAoZG9jdW1lbnRQb3NpdGlvbiA+IHN0YXJ0ICsgMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyI3VwZGF0ZVByZXNlbnRhdGlvbihpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlUHJlc2VudGF0aW9uKGludCBkb2N1bWVudFBvc2l0aW9uLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCQlwcmVzZW50YXRpb24uY2xlYXIoKTsKLQotCQlpZiAoIShmSW5mbyBpbnN0YW5jZW9mIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGl0ZXJhdGUgZXhpc3RpbmcgYXR0cmlidXRlcyBmcm9tIGN1cnJlbnQgbm9kZQotCQlJRE9NTm9kZSB4bWxOb2RlID0gZk1vZGVsVXRpbC5nZXRYTUxOb2RlKGRvY3VtZW50UG9zaXRpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0geG1sTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCU9iamVjdCB0ZW1wID0gbnVsbDsKLQkJUG9zaXRpb24gcCA9IG51bGw7Ci0JCUhhc2hNYXAgbWFwID0gKChBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24pIGZJbmZvKS5nZXRBdHRyMlJhbmdlTWFwKCk7Ci0KLQkJLy8gc28gd2UgY2FuIGFkZCByYW5nZXMgaW4gb3JkZXIKLQkJU3R5bGVSYW5nZVtdIHNvcnRlZCA9IG5ldyBTdHlsZVJhbmdlW2ZJbmZvLmdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpLmxlbmd0aCgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJYXR0ck5hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCXRlbXAgPSBtYXAuZ2V0KGF0dHJOYW1lKTsKLQkJCQlpZiAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCXAgPSAoUG9zaXRpb24pIHRlbXA7Ci0JCQkJCXNvcnRlZFtwLm9mZnNldF0gPSBuZXcgU3R5bGVSYW5nZShwLm9mZnNldCwgcC5sZW5ndGgsIG51bGwsIG51bGwsIFNXVC5CT0xEKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gc3R5bGUgcmFuZ2VzIG5lZWQgdG8gYmUgYWRkZWQgaW4gb3JkZXIKLQkJU3R5bGVSYW5nZSBzciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlzciA9IHNvcnRlZFtpXTsKLQkJCWlmIChzciAhPSBudWxsKSB7Ci0JCQkJcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2Uoc3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU5MDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIENhbGN1bGF0ZXMgYXR0cmlidXRlIGNvbnRleHQgaW5mb3JtYXRpb24gYmFzZWQgb24gYSBTdHJ1Y3R1ZWREb2N1bWVudCBhbmQKLSAqIGRvY3VtZW50IHBvc2l0aW9uLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1jbGFzcyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBJQ29udGV4dEluZm9ybWF0aW9uW10gRU1QVFlfQ09OVEVYVF9JTkZPID0gbmV3IElDb250ZXh0SW5mb3JtYXRpb25bMF07Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIGZDb21wYXJhdG9yOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBDb250ZXh0SW5mb01vZGVsVXRpbCBmTW9kZWxVdGlsID0gbnVsbDsKLQotCXB1YmxpYyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlcihJU3RydWN0dXJlZERvY3VtZW50IGRvYywgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlcikgewotCQlmRG9jdW1lbnQgPSBkb2M7Ci0JCWZNb2RlbFV0aWwgPSBuZXcgQ29udGV4dEluZm9Nb2RlbFV0aWwoZkRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2RSZWdpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUHJvcG9zZUluZm8oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlpZiAoKHNkUmVnaW9uICE9IG51bGwpICYmIGlzRW5kVGFnKHNkUmVnaW9uKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGdldEF0dHJpYnV0ZUluZm9ybWF0aW9uKGludCBvZmZzZXQpIHsKLQkJLyoKLQkJICogbmVlZCB0byB0YWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlcyB3LyBhbWJpZ3VvdXMgcmVnaW9ucyA8dGFnPnwKLQkJICogPC90YWc+IGFsc28gZW5kIHRhZ3MuLgotCQkgKi8KLQkJSUNvbnRleHRJbmZvcm1hdGlvbltdIHJlc3VsdHMgPSBFTVBUWV9DT05URVhUX0lORk87Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGZNb2RlbFV0aWwuZ2V0RG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQlpZiAoIWNhblByb3Bvc2VJbmZvKHNkUmVnaW9uKSkgewotCQkJcmV0dXJuIEVNUFRZX0NPTlRFWFRfSU5GTzsKLQkJfQotCi0JCUlET01Ob2RlIG5vZGUgPSBmTW9kZWxVdGlsLmdldFhNTE5vZGUob2Zmc2V0KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQkJcmVzdWx0cyA9IGdldEluZm9Gb3JFbGVtZW50KG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQkvLyBmdXR1cmUuLi4KLQkJCQkvLyBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQkvLyByZXN1bHRzID0gZ2V0SW5mb0ZvclRleHQobm9kZSk7Ci0JCQkJLy8gYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbXBhcmF0b3IgdGhhdCBjb21wYXJlcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG5hbWVzLgotCSAqIAotCSAqIHRoZSBjb21wYXJhdG9yCi0JICovCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGdldENNQXR0cmlidXRlQ29tcGFyYXRvcigpIHsKLQkJaWYgKGZDb21wYXJhdG9yID09IG51bGwpIHsKLQkJCWZDb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCXJldHVybiAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG8xKS5nZXRBdHRyTmFtZSgpLmNvbXBhcmVUbygoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG8yKS5nZXRBdHRyTmFtZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBmQ29tcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqIAotCSAqLwotCXByaXZhdGUgSUNvbnRleHRJbmZvcm1hdGlvbltdIGdldEluZm9Gb3JFbGVtZW50KElET01Ob2RlIG5vZGUpIHsKLQkJSUNvbnRleHRJbmZvcm1hdGlvbltdIHJlc3VsdHMgPSBFTVBUWV9DT05URVhUX0lORk87Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBmTW9kZWxVdGlsLmdldE1vZGVsUXVlcnkoKS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBkZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGF0dHJpYnV0ZXMpOwotCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGRlY2wsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJYXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0JCQkKLQkJCVN0cmluZyBhdHRyQ29udGV4dFN0cmluZyA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZ0J1ZmZlciBhdHRySW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJSGFzaE1hcCBhdHRyUG9zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWludCBwb3MgPSAwOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlpbnQgbnVtUGVyTGluZSA9IDg7Ci0KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb25bXSBzb3J0ZWRBdHRycyA9IGdldFNvcnRlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkQXR0cnMubGVuZ3RoOyBpKyspIHsKLQkJCQluYW1lID0gc29ydGVkQXR0cnNbaV0uZ2V0QXR0ck5hbWUoKTsKLQkJCQlsZW5ndGggPSBuYW1lLmxlbmd0aCgpOwotCQkJCXBvcyA9IGF0dHJJbmZvLmxlbmd0aCgpOwotCi0JCQkJYXR0ckluZm8uYXBwZW5kKG5hbWUpOwotCi0JCQkJaWYgKHNvcnRlZEF0dHJzW2ldLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQlhdHRySW5mby5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsZW5ndGgrKzsKLQkJCQl9Ci0JCQkJaWYgKGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpIC0gMSkgewotCQkJCQlhdHRySW5mby5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoKGkgIT0gMCkgJiYgKGkgJSBudW1QZXJMaW5lID09IDApKSB7Ci0JCQkJCQlhdHRySW5mby5hcHBlbmQoIlxuICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0clBvc01hcC5wdXQobmFtZSwgbmV3IFBvc2l0aW9uKHBvcywgbGVuZ3RoKSk7Ci0JCQl9Ci0JCQlpZiAoIWF0dHJJbmZvLnRvU3RyaW5nKCkudHJpbSgpLmVxdWFscygiIikpIHsKLQkJCQlyZXR1cm4gbmV3IElDb250ZXh0SW5mb3JtYXRpb25bXXtuZXcgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uKGF0dHJDb250ZXh0U3RyaW5nLCBhdHRySW5mby50b1N0cmluZygpLCBhdHRyUG9zTWFwKX07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKiAKLQkgKi8KLQlJQ29udGV4dEluZm9ybWF0aW9uW10gZ2V0SW5mb0ZvclRleHQoSURPTU5vZGUgbm9kZSkgewotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlTdHJpbmcgY29udGV4dFN0cmluZyA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIGluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGZNb2RlbFV0aWwuZ2V0TW9kZWxRdWVyeSgpLmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBwYXJlbnQpOwotCQkJQ01Db250ZW50IGNvbnRlbnQgPSBkZWNsLmdldENvbnRlbnQoKTsKLQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cCkgewotCQkJCUNNR3JvdXAgY21Hcm91cCA9IChDTUdyb3VwKSBjb250ZW50OwotCQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSBjbUdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQkJCQlDTU5vZGUgY21Ob2RlID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJY21Ob2RlID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJY29udGV4dFN0cmluZyA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQlpZiAoY29udGV4dFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCQlpbmZvLmFwcGVuZCgiPCIgKyBjbU5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJaWYgKGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKSAtIDEpIHsKLQkJCQkJCQlpbmZvLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFpbmZvLnRvU3RyaW5nKCkudHJpbSgpLmVxdWFscygiIikpIHsKLQkJCXJldHVybiBuZXcgSUNvbnRleHRJbmZvcm1hdGlvbltde25ldyBDb250ZXh0SW5mb3JtYXRpb24oY29udGV4dFN0cmluZywgaW5mby50b1N0cmluZygpKX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ09OVEVYVF9JTkZPOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3J0ZWQgYXJyYXkgb2YgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENNQXR0cmlidXRlRGVjbGFyYXRpb25bXSBnZXRTb3J0ZWRBdHRyaWJ1dGVzKENNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMpIHsKLQkJTGlzdCBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlzb3J0ZWQuYWRkKGF0dHJpYnV0ZXMuaXRlbShpKSk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChzb3J0ZWQsIGdldENNQXR0cmlidXRlQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uW10pIHNvcnRlZC50b0FycmF5KG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uW3NvcnRlZC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2RSZWdpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMWQzYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENvbnRlbnRBc3Npc3RSZXF1ZXN0IHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3QgbWFjcm9zID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBTdHJpbmcgbWF0Y2hTdHJpbmc7Ci0JcHJvdGVjdGVkIE5vZGUgbm9kZSA9IG51bGw7Ci0JcHJvdGVjdGVkIE5vZGUgcGFyZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdCBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCByZXBsYWNlbWVudEJlZ2luUG9zaXRpb247Ci0JcHJvdGVjdGVkIGludCByZXBsYWNlbWVudExlbmd0aDsKLQotCS8vIHByaXZhdGUgQm9vbGVhbiBzZXBhcmF0ZSA9IG51bGw7IC8vIChwYSkgbm90IHVzZWQKLQkvLyBwcml2YXRlIEJvb2xlYW4gc29ydCA9IG51bGw7IC8vIChwYSkgbm90IHVzZWQKLQkvKioKLQkgKiBYTUxDb250ZW50QXNzaXN0UmVxdWVzdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb250ZW50QXNzaXN0UmVxdWVzdChOb2RlIG5vZGUsIE5vZGUgcGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBpbnQgYmVnaW4sIGludCBsZW5ndGgsIFN0cmluZyBmaWx0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJc2V0Tm9kZShub2RlKTsKLQkJc2V0UGFyZW50KHBhcmVudCk7Ci0JCXNldERvY3VtZW50UmVnaW9uKGRvY3VtZW50UmVnaW9uKTsKLQkJc2V0UmVnaW9uKGNvbXBsZXRpb25SZWdpb24pOwotCQlzZXRNYXRjaFN0cmluZyhmaWx0ZXIpOwotCQlzZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oYmVnaW4pOwotCQlzZXRSZXBsYWNlbWVudExlbmd0aChsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1hY3JvKElDb21wbGV0aW9uUHJvcG9zYWwgbmV3UHJvcG9zYWwpIHsKLQkJbWFjcm9zLmFkZChuZXdQcm9wb3NhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvcG9zYWwoSUNvbXBsZXRpb25Qcm9wb3NhbCBuZXdQcm9wb3NhbCkgewotCQlwcm9wb3NhbHMuYWRkKG5ld1Byb3Bvc2FsKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldENvbXBsZXRpb25Qcm9wb3NhbHMoKSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgcmVzdWx0c1tdID0gbnVsbDsKLQkJaWYgKChnZXRQcm9wb3NhbHMoKS5zaXplKCkgPiAwKSB8fCAoZ2V0TWFjcm9zKCkuc2l6ZSgpID4gMCkpIHsKLQkJCUxpc3QgYWxsUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKCFzaG91bGRTZXBhcmF0ZSgpKSB7Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChnZXRQcm9wb3NhbHMoKSk7Ci0JCQkJLy8gc2hvdWxkIGJlIGVtcHR5LCBhcyBhbGwgbWFjcm9zIHNob3VsZCBoYXZlIGdvbmUgaW50byB0aGUKLQkJCQkvLyBwcm9wb3NhbCBsaXN0Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChnZXRNYWNyb3MoKSk7Ci0JCQkJYWxsUHJvcG9zYWxzID0gc29ydFByb3Bvc2FscyhhbGxQcm9wb3NhbHMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChzb3J0UHJvcG9zYWxzKGdldFByb3Bvc2FscygpKSk7Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChzb3J0UHJvcG9zYWxzKGdldE1hY3JvcygpKSk7Ci0JCQl9Ci0KLQkJCXJlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFthbGxQcm9wb3NhbHMuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUHJvcG9zYWxzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVzdWx0c1tpXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSBhbGxQcm9wb3NhbHMuZ2V0KGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBkb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldE1hY3JvcygpIHsKLQkJcmV0dXJuIG1hY3JvczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNYXRjaFN0cmluZygpIHsKLQkJcmV0dXJuIG1hdGNoU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFByb3Bvc2FscygpIHsKLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uKCkgewotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudEJlZ2luUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlcGxhY2VtZW50TGVuZ3RoKCkgewotCQlyZXR1cm4gcmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaWYgKChnZXREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmIChnZXRSZWdpb24oKSAhPSBudWxsKSkgewotCQkJcmV0dXJuICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBnZXREb2N1bWVudFJlZ2lvbigpKS5nZXRTdGFydE9mZnNldChnZXRSZWdpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKChnZXREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmIChnZXRSZWdpb24oKSAhPSBudWxsKSkgewotCQkJcmV0dXJuICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBnZXREb2N1bWVudFJlZ2lvbigpKS5nZXRUZXh0KGdldFJlZ2lvbigpKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCWlmICgoZ2V0RG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAoZ2V0UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCXJldHVybiAoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgZ2V0RG9jdW1lbnRSZWdpb24oKSkuZ2V0VGV4dEVuZE9mZnNldChnZXRSZWdpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWdpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlkb2N1bWVudFJlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3TWF0Y2hTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXRjaFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIG5ld01hdGNoU3RyaW5nKSB7Ci0JCW1hdGNoU3RyaW5nID0gbmV3TWF0Y2hTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlKG9yZy53M2MuZG9tLk5vZGUgbmV3Tm9kZSkgewotCQlub2RlID0gbmV3Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UGFyZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KG9yZy53M2MuZG9tLk5vZGUgbmV3UGFyZW50KSB7Ci0JCXBhcmVudCA9IG5ld1BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UmVnaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVnaW9uKElUZXh0UmVnaW9uIG5ld1JlZ2lvbikgewotCQlyZWdpb24gPSBuZXdSZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1JlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbgotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGludCBuZXdSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24pIHsKLQkJcmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uID0gbmV3UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UmVwbGFjZW1lbnRMZW5ndGgoaW50IG5ld1JlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCXJlcGxhY2VtZW50TGVuZ3RoID0gbmV3UmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkU2VwYXJhdGUoKSB7Ci0JCS8qCi0JCSAqIGlmIChzZXBhcmF0ZSA9PSBudWxsKSB7IFByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIgPQotCQkgKiBnZXRQcmVmZXJlbmNlTWFuYWdlcigpOyBpZihtYW5hZ2VyID09IG51bGwpIHsgc2VwYXJhdGUgPQotCQkgKiBCb29sZWFuLkZBTFNFOyB9IGVsc2UgeyBFbGVtZW50IGNhU2V0dGluZ3MgPQotCQkgKiBtYW5hZ2VyLmdldEVsZW1lbnQoUHJlZmVyZW5jZU5hbWVzLkNPTlRFTlRfQVNTSVNUKTsgc2VwYXJhdGUgPSBuZXcKLQkJICogQm9vbGVhbihjYVNldHRpbmdzLmdldEF0dHJpYnV0ZShQcmVmZXJlbmNlTmFtZXMuU0VQQVJBVEUpLmVxdWFscyhQcmVmZXJlbmNlTmFtZXMuVFJVRSkpOyB9IH0KLQkJICogcmV0dXJuIHNlcGFyYXRlLmJvb2xlYW5WYWx1ZSgpOwotCQkgKi8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IHNvcnRQcm9wb3NhbHMoTGlzdCBwcm9wb3NhbHNJbikgewotCQlDb2xsZWN0aW9ucy5zb3J0KHByb3Bvc2Fsc0luLCBuZXcgUHJvcG9zYWxDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gcHJvcG9zYWxzSW47Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJOb2RlOiAiICsgZ2V0Tm9kZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5QYXJlbnQ6ICIgKyBnZXRQYXJlbnQoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlxuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOiAiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldERvY3VtZW50UmVnaW9uKCkudG9TdHJpbmcoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcblJlZ2lvbjogIiArIGdldFJlZ2lvbigpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5NYXRjaCBzdHJpbmc6ICciICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldE1hdGNoU3RyaW5nKCkpICsgIiciIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCSsgIlxuT2Zmc2V0czogWyIgKyBnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSArICItIiArIChnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSArIGdldFJlcGxhY2VtZW50TGVuZ3RoKCkpICsgIl1cbiI7IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGV4dEluZm9Nb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRleHRJbmZvTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OGU3NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGV4dEluZm9Nb2RlbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0SW5mb01vZGVsVXRpbCB7Ci0JSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCi0JQ29udGV4dEluZm9Nb2RlbFV0aWwoSVN0cnVjdHVyZWREb2N1bWVudCBkb2MpIHsKLQkJZkRvY3VtZW50ID0gZG9jOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoKSB7Ci0JCU1vZGVsUXVlcnkgbXEgPSBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHhtbE1vZGVsKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1xOwotCX0KLQotCXB1YmxpYyBJRE9NTm9kZSBnZXRYTUxOb2RlKGludCBvZmZzZXQpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCUlET01Ob2RlIHhtbE5vZGUgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJeG1sTm9kZSA9IChJRE9NTm9kZSkgeG1sTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHhtbE5vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTlkZDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotLyoqCi0gKiBQdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gbWFrZSB0aGUgYWRkaXRpb25hbCBwcm9wb3NhbCBpbmZvIGludG8gY29udGVudAotICogZml0IGZvciBhbiBIVE1MIHZpZXdlciAoYnkgZXNjYXBpbmcgY2hhcmFjdGVycykKLSAqLwotY2xhc3MgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCBleHRlbmRzIFRlbXBsYXRlUHJvcG9zYWwgaW1wbGVtZW50cyBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0KLQlwdWJsaWMgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBJbWFnZSBpbWFnZSwgaW50IHJlbGV2YW5jZSkgewotCQlzdXBlcih0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBpbWFnZSwgcmVsZXZhbmNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJcmV0dXJuIFN0cmluZ1V0aWxzLmNvbnZlcnRUb0hUTUxDb250ZW50KGFkZGl0aW9uYWxJbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc0NGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci0KLQotLyoqCi0gKiBDb250ZW50QXNzaXN0UHJvY2Vzc29yIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGluIGNvbnRlbnQgYXNzaXN0IHdoZXJlIHRoZQotICogcGFydGl0aW9uZXIgY2Fubm90IGRldGVybWluZSBhIHBhcnRpdGlvbiB0eXBlIGF0IHRoZSBjdXJyZW50IGN1cnNvcgotICogcG9zaXRpb24gKHVzdWFsbHkgYXQgRU9GKS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJUmVsZWFzYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGNoYXIgY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBudWxsOwotCXByb3RlY3RlZCBjaGFyIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIEVNUFRZX1BST1BPU0FMX1NFVCA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZOYW1lVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCi0JcHVibGljIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoU3RyaW5nIGtleSwgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWFkZFByb2Nlc3NvcihnZXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpLCBrZXksIHByb2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb2Nlc3NvcihTdHJpbmcga2V5LCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJYWRkUHJvY2Vzc29yKGdldE5hbWVUb1Byb2Nlc3Nvck1hcCgpLCBrZXksIHByb2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldFBhcnRpdGlvblByb2Nlc3NvcihTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGdldFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyByZWxlYXNlIGlmIGl0J3MgYSBkdXBsaWNhdGUgcGFydGl0aW9uIHR5cGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFByb2Nlc3NvcihIYXNoTWFwIG1hcCwgU3RyaW5nIGtleSwgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCU9iamVjdCBvID0gbWFwLnJlbW92ZShrZXkpOwotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKSB7Ci0JCQkJKChJUmVsZWFzYWJsZSkgbykucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCW1hcC5wdXQoa2V5LCBwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEZpZ3VyZXMgb3V0IHdoYXQgdGhlIGNvcnJlY3QgSUNvbXBsZXRpb25Qcm9wb3NhbFByb2Nlc3NvciBpcyBhbmQKLQkgKiBjb21wdXRlc0NvbXBsZXRpb25Qcm9wb3NhbHMgb24gdGhhdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IG51bGw7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gRU1QVFlfUFJPUE9TQUxfU0VUOwotCi0JCXAgPSBndWVzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3Iodmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBwLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCQl9Ci0KLQkJcmV0dXJuIChyZXN1bHRzICE9IG51bGwpID8gcmVzdWx0cyA6IEVNUFRZX1BST1BPU0FMX1NFVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCS8vIGdldCBjb250ZXh0IGluZm8gZnJvbSBwcm9jZXNzb3IgdGhhdCB3ZSBlbmQgdXAgdXNpbmcuLi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQkvLyByZXR1cm4gdGhlIHZhbGlkYXRvciBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciB0aGF0IHdlCi0JCS8vIHVzZWQuLi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0RXJyb3JNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCQotCXByaXZhdGUgSGFzaE1hcCBnZXROYW1lVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCWlmIChmTmFtZVRvUHJvY2Vzc29yTWFwID09IG51bGwpIHsKLQkJCWZOYW1lVG9Qcm9jZXNzb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJaW5pdE5hbWVUb1Byb2Nlc3Nvck1hcCgpOwotCQl9Ci0JCXJldHVybiBmTmFtZVRvUHJvY2Vzc29yTWFwOwotCX0KLQkKLQlwcml2YXRlIEhhc2hNYXAgZ2V0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCWlmIChmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPT0gbnVsbCkgewotCQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCQl9Ci0JCXJldHVybiBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXA7Ci0JfQotCi0JLyoqCi0JICogR2l2ZXMgeW91IHRoZSBkb2N1bWVudCBwYXJ0aXRpb24gdHlwZSAoU3RyaW5nKSBmb3IgdGhlIGdpdmVuCi0JICogU3RydWN0dXJlZFRleHRWaWV3ZXIgYW5kIGRvY3VtZW50UG9zaXRpb24uCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBudWxsOwotCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnRpdGlvbiA9IGRvY3VtZW50LmdldFBhcnRpdGlvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJCXBhcnRpdGlvblR5cGUgPSBwYXJ0aXRpb24uZ2V0VHlwZSgpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlwYXJ0aXRpb25UeXBlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHdWVzc2VzIGEgQ29udGVudEFzc2lzdFByb2Nlc3NvciBiYXNlZCBvbiB0aGUgVGV4dFZpZXdlciBhbmQKLQkgKiBkb2N1bWVudE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0Ci0JICovCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGd1ZXNzQ29udGVudEFzc2lzdFByb2Nlc3NvcihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQkvLyBtYXBwaW5nIGxvZ2ljIGhlcmUuLi4KLQkJLy8gbG9vayBAIHByZXZpb3VzIHJlZ2lvbgotCQkvLyBsb29rIEAgcHJldmlvdXMgZG9jIHBhcnRpdGlvbiB0eXBlCi0JCS8vIGxvb2sgQCBwYWdlIGxhbmd1YWdlCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJaWYgKHNkUmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBjdXJyZW50UmVnaW9uVHlwZSA9IHNkUmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY3VycmVudCByZWdpb24gdHlwZSBpcyA+PiAiICsKLQkJCS8vIGN1cnJlbnRSZWdpb25UeXBlKTsKLQkJCWlmIChjdXJyZW50UmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RQcmV2ID0gc2RSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCQlpZiAoc2RQcmV2ICE9IG51bGwpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTdHJpbmcgcHJldlJlZ2lvblR5cGUgPSBzZFByZXYuZ2V0VHlwZSgpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcmV2aW91cyByZWdpb24gdHlwZSBpcyA+PiAiICsgcHJldlJlZ2lvblR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gd29ya2luZyB3LyB2aWV3ZXIgJiBkb2N1bWVudCBwYXJ0aXRpb24KLQkJaWYgKChwID09IG51bGwpICYmICh2aWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQlTdHJpbmcgcHJldlBhcnRpdGlvblR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudE9mZnNldCAtIDEpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcmV2aW91cyBwYXJ0aXRpb24gdHlwZSBpcyA+ICIgKwotCQkJLy8gcHJldlBhcnRpdGlvblR5cGUpOwotCQkJcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZ2V0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKS5nZXQocHJldlBhcnRpdGlvblR5cGUpOwotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIEluaXRzIG1hcCBmb3IgZXh0cmEgQ29udGVudEFzc2lzdFByb2Nlc3NvcnMgKHVzZUJlYW4sIGdldC9zZXRQcm9wZXJ0eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQkvLyBub3RoaW5nIHRvIGRvIGluIHRoaXMgY2FzZQotCX0KLQotCS8qKgotCSAqIEFkZHMgYWxsIHJlbGV2ZW50IENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzIHRvIHRoZSBwYXJ0aXRpb24gdG8gcHJvY2Vzc29yCi0JICogbWFwIChqdXN0IFhNTCBoZXJlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciB4bWxQcm9jZXNzb3IgPSBuZXcgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQcm9jZXNzb3IoZ2V0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQsIHhtbFByb2Nlc3Nvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJcmVsZWFzZVBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JCXJlbGVhc2VOYW1lVG9Qcm9jZXNzb3JNYXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTWFwKEhhc2hNYXAgbWFwKSB7Ci0JCWlmICgobWFwICE9IG51bGwpICYmICFtYXAuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJT2JqZWN0IGtleSA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJa2V5ID0gaXQubmV4dCgpOwotCQkJCWlmIChtYXAuZ2V0KGtleSkgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkgewotCQkJCQkoKElSZWxlYXNhYmxlKSBtYXAuZ2V0KGtleSkpLnJlbGVhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQltYXAuY2xlYXIoKTsKLQkJCW1hcCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQlyZWxlYXNlTWFwKGZOYW1lVG9Qcm9jZXNzb3JNYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJcmVsZWFzZU1hcChmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGEzOTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb24gewotCi0JcHJvdGVjdGVkIENNTm9kZSBjbW5vZGUgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZW5kSW5kZXggPSAwOwotCXByb3RlY3RlZCBpbnQga2luZCA9IElOU0VSVDsKLQlwcm90ZWN0ZWQgaW50IHN0YXJ0SW5kZXggPSAwOwotCXByb3RlY3RlZCBPYmplY3QgdXNlckRhdGEgPSBudWxsOwotCi0JLyoqCi0JICogTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24oQ01Ob2RlIG5ld0NoaWxkLCBpbnQgbmV3S2luZCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3RW5kLCBPYmplY3QgbmV3VXNlckRhdGEpIHsKLQkJc3VwZXIoKTsKLQkJY21ub2RlID0gbmV3Q2hpbGQ7Ci0JCWtpbmQgPSBuZXdLaW5kOwotCQlzdGFydEluZGV4ID0gbmV3U3RhcnQ7Ci0JCWVuZEluZGV4ID0gbmV3RW5kOwotCQl1c2VyRGF0YSA9IG5ld1VzZXJEYXRhOwotCX0KLQotCS8qKgotCSAqIGdldENNTm9kZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgZ2V0Q01Ob2RlKCkgewotCQlyZXR1cm4gY21ub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRJbmRleCgpIHsKLQkJcmV0dXJuIGVuZEluZGV4OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRJbmRleCgpIHsKLQkJcmV0dXJuIHN0YXJ0SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0VXNlckRhdGEgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcGVyZm9ybUFjdGlvbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIHNldENNTm9kZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDTU5vZGUob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgbmV3Tm9kZSkgewotCQljbW5vZGUgPSBuZXdOb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdFbmRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5kSW5kZXgoaW50IG5ld0VuZEluZGV4KSB7Ci0JCWVuZEluZGV4ID0gbmV3RW5kSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0tpbmQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEtpbmQoaW50IG5ld0tpbmQpIHsKLQkJa2luZCA9IG5ld0tpbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1N0YXJ0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN0YXJ0SW5kZXgoaW50IG5ld1N0YXJ0SW5kZXgpIHsKLQkJc3RhcnRJbmRleCA9IG5ld1N0YXJ0SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogc2V0VXNlckRhdGEgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckRhdGEoT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBhY3Rpb25OYW1lID0gbnVsbDsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElOU0VSVCA6Ci0JCQkJYWN0aW9uTmFtZSA9ICJJTlNFUlQiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVNT1ZFIDoKLQkJCQlhY3Rpb25OYW1lID0gIlJFTU9WRSI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFIDoKLQkJCQlhY3Rpb25OYW1lID0gIlJFUExBQ0UiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWFjdGlvbk5hbWUgPSAiVU5LTk9XTiBBQ1RJT04gIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIG5vZGVOYW1lID0gKGNtbm9kZSAhPSBudWxsKSA/IGdldENNTm9kZSgpLmdldE5vZGVOYW1lKCkgOiAiKHVua25vd24pIjsvLyROT04tTkxTLTEkCi0JCXJldHVybiBhY3Rpb25OYW1lICsgIj0iICsgbm9kZU5hbWUgKyAiKCIgKyBzdGFydEluZGV4ICsgIi4uLiIgKyBlbmRJbmRleCArICIpIjsvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUHJvcG9zYWxDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Qcm9wb3NhbENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2ZThlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Qcm9wb3NhbENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotCi1wdWJsaWMgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlpbnQgcmVsZXZhbmNlID0gMDsKLQkJaWYgKChvMSBpbnN0YW5jZW9mIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpICYmIChvMiBpbnN0YW5jZW9mIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpKSB7Ci0JCQkvLyBzb3J0IGJhc2VkIG9uIHJlbGV2YW5jZQotCQkJSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCBjcDEgPSAoSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCkgbzE7Ci0JCQlJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIGNwMiA9IChJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsKSBvMjsKLQotCQkJcmVsZXZhbmNlID0gY3AyLmdldFJlbGV2YW5jZSgpIC0gY3AxLmdldFJlbGV2YW5jZSgpOwotCi0JCQkvLyBpZiBzYW1lIHJlbGV2YW5jZSwgc2Vjb25kYXJ5IHNvcnQgKGxleGlncmFwaGljYWxseSkKLQkJCWlmICgocmVsZXZhbmNlID09IDApICYmIChvMSBpbnN0YW5jZW9mIElDb21wbGV0aW9uUHJvcG9zYWwpICYmIChvMiBpbnN0YW5jZW9mIElDb21wbGV0aW9uUHJvcG9zYWwpKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gKChJQ29tcGxldGlvblByb3Bvc2FsKSBvMSkuZ2V0RGlzcGxheVN0cmluZygpOwotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9ICgoSUNvbXBsZXRpb25Qcm9wb3NhbCkgbzIpLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJCQlpZiAoKGRpc3BsYXlTdHJpbmcxICE9IG51bGwpICYmIChkaXNwbGF5U3RyaW5nMiAhPSBudWxsKSkgewotCQkJCQkvLyByZWxldmFuY2UgPSBkaXNwbGF5U3RyaW5nMS5jb21wYXJlVG8oZGlzcGxheVN0cmluZzIpOwotCQkJCQkvLyAvLyB0aGlzIGRpZG4ndCBtaXggY2FwcyB3LyBsb3dlcmNhc2UKLQkJCQkJcmVsZXZhbmNlID0gY29tLmlibS5pY3UudGV4dC5Db2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gb3RoZXJ3aXNlIGlmIGl0J3Mgbm90IElTRURSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwsIGRvbid0IHNvcnQKLQkJcmV0dXJuIHJlbGV2YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MTQ5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci0KLS8qKgotICogSnVzdCBsaWtlIERvY3VtZW50VGVtcGxhdGVDb250ZXh0IGV4Y2VwdCBpZiBhbiBpbnNlcnQgb2Zmc2V0IGlzIHBhc3NlZCBpbiwKLSAqIGR1cmluZyBldmFsdWF0aW9uLCB0aGUgInByZWZpeCIgYmVmb3JlIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIGNoZWNrZWQgdG8gc2VlCi0gKiBpZiBpdCBtYXRjaGVzIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZiBzbywgb3ZlcndyaXRlIHRoZSB0ZW1wbGF0ZSBuYW1lLgotICogT3RoZXJ3aXNlLCBqdXN0IGluc2VydCB0aGUgdGVtcGxhdGUgYXQgdGhlIGluc2VydCBvZmZzZXQgbG9jYXRpb24gKGJ5IG5vdAotICogb3ZlcndyaXRpbmcgdGhlIHByZWZpeCB0ZXh0KQotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQgZXh0ZW5kcyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCB7Ci0JcHJpdmF0ZSBpbnQgZkluc2VydE9mZnNldCA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aGlzKHR5cGUsIGRvY3VtZW50LCBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4gVGhlIHN1cHBsaWVkIDxjb2RlPlBvc2l0aW9uPC9jb2RlPgotCSAqIHdpbGwgYmUgcXVlcmllZCB0byBjb21wdXRlIHRoZSA8Y29kZT5nZXRTdGFydDwvY29kZT4gYW5kCi0JICogPGNvZGU+Z2V0RW5kPC9jb2RlPiBtZXRob2RzLCB3aGljaCB3aWxsIHRoZXJlZm9yZSBhbnN3ZXIgdXBkYXRlZAotCSAqIHBvc2l0aW9uIGRhdGEgaWYgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gZGVzY3JpYmluZyB0aGUgYXJlYSBvZiB0aGUgZG9jdW1lbnQgd2hpY2ggZm9ybXMKLQkgKiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBjb250ZXh0Ci0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJc3VwZXIodHlwZSwgZG9jdW1lbnQsIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGluc2VydE9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uIHdoZXJlIGluc2VydCB3YXMKLQkgKiAgICAgICAgICAgIG9yaWdpbmFsbHkgcmVxdWVzdGVkCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5zZXJ0T2Zmc2V0KSB7Ci0JCXRoaXModHlwZSwgZG9jdW1lbnQsIG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOwotCQlmSW5zZXJ0T2Zmc2V0ID0gaW5zZXJ0T2Zmc2V0OwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQjZXZhbHVhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGUpCi0JICovCi0JcHVibGljIFRlbXBsYXRlQnVmZmVyIGV2YWx1YXRlKFRlbXBsYXRlIHRlbXBsYXRlKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIFRlbXBsYXRlRXhjZXB0aW9uIHsKLQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gc3VwZXIuZXZhbHVhdGUodGVtcGxhdGUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmICgoZkluc2VydE9mZnNldCA+IC0xKSAmJiAoZkluc2VydE9mZnNldCA+IGdldFN0YXJ0KCkpKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGdldERvY3VtZW50KCkuZ2V0KGdldFN0YXJ0KCksIGZJbnNlcnRPZmZzZXQgLSBnZXRTdGFydCgpKTsKLQkJCQlpZiAoIXRlbXBsYXRlLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQkJLy8gZ2VuZXJhdGUgYSBuZXcgYnVmZmVyIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhlCi0JCQkJCS8vIHRleHQgdGhhdCB3YXMgZ29pbmcgdG8gYmUgb3ZlcndyaXR0ZW4KLQkJCQkJYnVmZmVyID0gbmV3IFRlbXBsYXRlQnVmZmVyKHByZWZpeCArIGJ1ZmZlci5nZXRTdHJpbmcoKSwgYnVmZmVyLmdldFZhcmlhYmxlcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhNjA3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uIHsKLQotCVN0cmluZyBmTm9kZU5hbWU7Ci0KLQkvKioKLQkgKiBTaW1wbGVDTUVMZW1lbnREZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE5vZGVOYW1lKG5vZGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKiAKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEF0dHJpYnV0ZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q01Db250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Db250ZW50Ci0JICogCi0JICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuIFRoaXMgY2FuIGJlIGFuCi0JICogQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldENvbnRlbnRUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogUmV0dXJucyBvbmUgb2YgOiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMb2NhbEVsZW1lbnRzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKiAKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGx5IGRlZmluZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLiBJZiAxLCBpdCdzIFJFUVVJUkVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZk5vZGVOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqIAotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3Tm9kZU5hbWUpIHsKLQkJZk5vZGVOYW1lID0gbmV3Tm9kZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Tb3VyY2VFZGl0b3JJbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU291cmNlRWRpdG9ySW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxNjc3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Tb3VyY2VFZGl0b3JJbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBpbnRlcm5hbCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBvciBleHRlcm5hbAotICogICAgICAgICAgICAgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGVhZAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlRWRpdG9ySW1hZ2VIZWxwZXIgewotCi0JcHVibGljIFNvdXJjZUVkaXRvckltYWdlSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oWE1MVUlQbHVnaW4uSUQsIHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCUpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTJjMDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUw7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElSZXNvdXJjZSBmUmVzb3VyY2UgPSBudWxsOwotCXByaXZhdGUgWE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGZUZW1wbGF0ZVByb2Nlc3NvciA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZUZW1wbGF0ZUNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuQVRUUklCVVRFKTsKLQkJc3VwZXIuYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFUVFJJQlVURV9WQUxVRSk7Ci0JCXN1cGVyLmFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQlzdXBlci5hZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5UQUcpOwotCQlzdXBlci5hZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNoaWxkUG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0ZW1wbGF0ZXMgdG8gdGhlIGxpc3Qgb2YgcHJvcG9zYWxzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGVtcGxhdGVzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0T2Zmc2V0KSB7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiBhbHJlYWR5IGFkZGluZyB0ZW1wbGF0ZSBwcm9wb3NhbHMgZm9yIGEgY2VydGFpbiBjb250ZXh0IHR5cGUsIGRvCi0JCS8vIG5vdCBhZGQgYWdhaW4KLQkJaWYgKCFmVGVtcGxhdGVDb250ZXh0cy5jb250YWlucyhjb250ZXh0KSkgewotCQkJZlRlbXBsYXRlQ29udGV4dHMuYWRkKGNvbnRleHQpOwotCQkJYm9vbGVhbiB1c2VQcm9wb3NhbExpc3QgPSAhY29udGVudEFzc2lzdFJlcXVlc3Quc2hvdWxkU2VwYXJhdGUoKTsKLQotCQkJaWYgKGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpICE9IG51bGwpIHsKLQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShjb250ZXh0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZlRleHRWaWV3ZXIsIHN0YXJ0T2Zmc2V0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlpZiAodXNlUHJvcG9zYWxMaXN0KSB7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbHNbaV0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkTWFjcm8ocHJvcG9zYWxzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSwgSURPTU5vZGUgeG1sbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0ID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJLy8gYnVnMTE1OTI3IHVzZSBvcmlnaW5hbCBkb2N1bWVudCBwb3NpdGlvbiBmb3IgYWxsL2FueSByZWdpb24KLQkJLy8gdGVtcGxhdGVzCi0JCWFkZFRlbXBsYXRlcyhyZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFMTCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCXJldHVybiByZXF1ZXN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJZlRlbXBsYXRlQ29udGV4dHMuY2xlYXIoKTsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgPT0gbnVsbCkgewotCQkJZlByZWZlcmVuY2VTdG9yZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJfQotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmVGVtcGxhdGVQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlUHJvY2Vzc29yID0gbmV3IFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVQcm9jZXNzb3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJcmVpbml0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCi0JCWlmICgocHJvcGVydHkuY29tcGFyZVRvKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSkgPT0gMCkgfHwgKHByb3BlcnR5LmNvbXBhcmVUbyhYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSkgPT0gMCkpIHsKLQkJCXJlaW5pdCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVpbml0KCkgewotCQlTdHJpbmcga2V5ID0gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFOwotCQlib29sZWFuIGRvQXV0byA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KTsKLQkJaWYgKGRvQXV0bykgewotCQkJa2V5ID0gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREU7Ci0JCQljb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoa2V5KS50b0NoYXJBcnJheSgpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTRiMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU2NyaXB0TGFuZ3VhZ2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzIGV4dGVuZHMgQ29udGVudEFzc2lzdFV0aWxzIHsKLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NMT1NFID0gIkpTUF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVCA9ICJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfU0NSSVBUX1RZUEUgPSAiQ29udGVudC1TY3JpcHQtVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFEID0gIkhFQUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTCA9ICJIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfRVFVSVYgPSAiSFRUUC1FUVVJViI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBID0gIk1FVEEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgY2xvc2luZyBwcm9wb3NhbCBnaXZlbiB0aGUKLQkgKiBjb250ZW50cyAoSW5kZXhlZFJlZ2lvbikgb2YgYSB0YWcgdGhhdCBpcyBzdGFydGVkLCBidXQgcG9zc2libHkgbm90Ci0JICogZW5kZWQKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdGV4dCB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgdmlld2VyCi0JICogQHBhcmFtIGluZGV4ZWROb2RlCi0JICogICAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIHRhZyB0aGF0IGlzIHN0YXJ0ZWQgYnV0IHBvc3NpYmx5IG5vdAotCSAqICAgICAgICAgICAgZW5kZWQKLQkgKiBAcGFyYW0gcGFyZW50VGFnTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhZyBvbiB3aGljaCB5b3UgYXJlIGNoZWNraW4gZm9yIGFuIGVuZGluZyB0YWcKLQkgKiBAcGFyYW0gaW1hZ2VQYXRoCi0JICogICAgICAgICAgICBjb250ZW50IGFzc2lzdCBpbWFnZSByZWxhdGl2ZSBwYXRoCi0JICogQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsIGNvbXB1dGVKU1BFbmRUYWdQcm9wb3NhbChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlLCBTdHJpbmcgcGFyZW50VGFnTmFtZSwgU3RyaW5nIGltYWdlUGF0aCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsIHAgPSBudWxsOwotCi0JCS8vIGNoZWNrIGlmIHRhZyBpcyBjbG9zZWQKLQkJYm9vbGVhbiBoYXNFbmRUYWcgPSB0cnVlOwotCQlib29sZWFuIGlzSlNQVGFnID0gZmFsc2U7Ci0JCUlET01Ob2RlIHhub2RlID0gbnVsbDsKLQkJU3RyaW5nIHRhZ05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJeG5vZGUgPSAoKElET01Ob2RlKSBpbmRleGVkTm9kZSk7Ci0JCQkvLyBpdCdzIGVuZGVkIGFscmVhZHkuLi4KLQkJCWlmICh4bm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlJRE9NTm9kZSBvcGVuTm9kZSA9IG51bGw7Ci0JCQlpZiAoIXhub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShwYXJlbnRUYWdOYW1lKSkgewotCQkJCW9wZW5Ob2RlID0gKElET01Ob2RlKSB4bm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlpZiAob3Blbk5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChvcGVuTm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQkJCWlzSlNQVGFnID0gKChJRE9NRWxlbWVudCkgb3Blbk5vZGUpLmlzSlNQVGFnKCk7Ci0JCQkJfQotCQkJCXRhZ05hbWUgPSBvcGVuTm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCWhhc0VuZFRhZyA9IChvcGVuTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKTsKLQkJCX0KLQkJfQotCi0JCS8vIGl0J3MgY2xvc2VkLCBkb24ndCBhZGQgY2xvc2UgdGFnIHByb3Bvc2FsCi0JCWlmICghaGFzRW5kVGFnICYmICFpc0pTUFRhZykgewotCi0JCQkvLyBjcmVhdGUgYXBwcm9wcmlhdGUgY2xvc2UgdGFnIHRleHQKLQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSAiPC8iICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZpZXdlclRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKTsKLQkJCWlmICgodmlld2VyVGV4dC5sZW5ndGgoKSA+PSBkb2N1bWVudFBvc2l0aW9uKSAmJiAodmlld2VyVGV4dC5sZW5ndGgoKSA+PSAyKSAmJiAoZG9jdW1lbnRQb3NpdGlvbiA+PSAyKSkgewotCQkJCVN0cmluZyBsYXN0MmNoYXJzID0gdmlld2VyVGV4dC5zdWJzdHJpbmcoZG9jdW1lbnRQb3NpdGlvbiAtIDIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCWlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8LyIpKSB7Ci0JCQkJCXByb3Bvc2VkVGV4dCA9IHRhZ05hbWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGxhc3QyY2hhcnMuZW5kc1dpdGgoIjwiKSkgewotCQkJCQlwcm9wb3NlZFRleHQgPSAiLyIgKyB0YWdOYW1lOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBjcmVhdGUgcHJvcG9zYWwKLQkJCXAgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCArICI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZG9jdW1lbnRQb3NpdGlvbiwgMCwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpICsgMSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVBhdGgpLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXtwcm9wb3NlZFRleHR9KSksIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUcpOwotCQl9Ci0JCWVsc2UgaWYgKCFoYXNFbmRUYWcgJiYgaXNKU1BUYWcpIHsKLQotCQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIGNsb3NlIHRhZyB0ZXh0Ci0JCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gIiUiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmlld2VyVGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpOwotCi0JCQkvLyBUT0RPIChwYSkgbWFrZSBpdCBzbWFydGVyIHRvIGFkZCAiJT4iIG9yIGp1c3QgIj4iIGlmICUgaXMKLQkJCS8vIGFscmVhZHkgdGhlcmUuLi4KLQkJCWlmICgodmlld2VyVGV4dC5sZW5ndGgoKSA+PSBkb2N1bWVudFBvc2l0aW9uKSAmJiAodmlld2VyVGV4dC5sZW5ndGgoKSA+PSAyKSkgewotCQkJCVN0cmluZyBsYXN0MmNoYXJzID0gdmlld2VyVGV4dC5zdWJzdHJpbmcoZG9jdW1lbnRQb3NpdGlvbiAtIDIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCVN0cmluZyBsYXN0Y2hhciA9IHZpZXdlclRleHQuc3Vic3RyaW5nKGRvY3VtZW50UG9zaXRpb24gLSAxLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpZiAobGFzdGNoYXIuZXF1YWxzKCIlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8JSIpKSB7Ci0JCQkJCQlwcm9wb3NlZFRleHQgPSAiJSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXByb3Bvc2VkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSBwcm9wb3NhbAotCQkJcCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0ICsgIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQlkb2N1bWVudFBvc2l0aW9uLCAwLCBwcm9wb3NlZFRleHQubGVuZ3RoKCkgKyAxLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlUGF0aCksIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfLCAobmV3IE9iamVjdFtde3Byb3Bvc2VkVGV4dH0pKSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBRyk7Ci0JCX0KLQotCQlyZXR1cm4gcDsKLQl9Ci0KLQotCS8qKgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBjbG9zaW5nIHByb3Bvc2FsIGdpdmVuIHRoZQotCSAqIGNvbnRlbnRzIChJbmRleGVkUmVnaW9uKSBvZiBhIHRhZyB0aGF0IGlzIHN0YXJ0ZWQsIGJ1dCBwb3NzaWJseSBub3QKLQkgKiBlbmRlZAotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gaW5kZXhlZE5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgdGFnIHRoYXQgaXMgc3RhcnRlZCBidXQgcG9zc2libHkgbm90Ci0JICogICAgICAgICAgICBlbmRlZAotCSAqIEBwYXJhbSBwYXJlbnRUYWdOYW1lCi0JICogICAgICAgICAgICB0aGUgdGFnIG9uIHdoaWNoIHlvdSBhcmUgY2hlY2tpbiBmb3IgYW4gZW5kaW5nIHRhZwotCSAqIEBwYXJhbSBpbWFnZVBhdGgKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgYXNzaXN0IHJlbGF0aXZlIGltYWdlIHBhdGgKLQkgKiBAcmV0dXJuIElDb21wbGV0aW9uUHJvcG9zYWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWwgY29tcHV0ZVhNTEVuZFRhZ1Byb3Bvc2FsKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24sIEluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUsIFN0cmluZyBwYXJlbnRUYWdOYW1lLCBTdHJpbmcgaW1hZ2VQYXRoKSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgcCA9IG51bGw7Ci0KLQkJLy8gY2hlY2sgaWYgdGFnIGlzIGNsb3NlZAotCQlib29sZWFuIGhhc0VuZFRhZyA9IHRydWU7Ci0JCUlET01Ob2RlIHhub2RlID0gbnVsbDsKLQkJU3RyaW5nIHRhZ05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJeG5vZGUgPSAoKElET01Ob2RlKSBpbmRleGVkTm9kZSk7Ci0JCQkvLyBpdCdzIGVuZGVkIGFscmVhZHkuLi4KLQkJCWlmICh4bm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlJRE9NTm9kZSBzdHlsZU5vZGUgPSBudWxsOwotCQkJaWYgKCF4bm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocGFyZW50VGFnTmFtZSkpIHsKLQkJCQlzdHlsZU5vZGUgPSAoSURPTU5vZGUpIHhub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWlmIChzdHlsZU5vZGUgIT0gbnVsbCkgewotCQkJCXRhZ05hbWUgPSBzdHlsZU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQloYXNFbmRUYWcgPSAoc3R5bGVOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpOwotCQkJfQotCQl9Ci0KLQkJLy8gaXQncyBjbG9zZWQsIGRvbid0IGFkZCBjbG9zZSB0YWcgcHJvcG9zYWwKLQkJaWYgKCFoYXNFbmRUYWcpIHsKLQotCQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIGNsb3NlIHRhZyB0ZXh0Ci0JCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gIjwvIiArIHRhZ05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB2aWV3ZXJUZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0JCQlpZiAoKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gZG9jdW1lbnRQb3NpdGlvbikgJiYgKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gMikgJiYgKGRvY3VtZW50UG9zaXRpb24gPj0gMikpIHsKLQkJCQlTdHJpbmcgbGFzdDJjaGFycyA9IHZpZXdlclRleHQuc3Vic3RyaW5nKGRvY3VtZW50UG9zaXRpb24gLSAyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpZiAobGFzdDJjaGFycy5lbmRzV2l0aCgiPC8iKSkgewotCQkJCQlwcm9wb3NlZFRleHQgPSB0YWdOYW1lOwotCQkJCX0KLQkJCQllbHNlIGlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8IikpIHsKLQkJCQkJcHJvcG9zZWRUZXh0ID0gIi8iICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gY3JlYXRlIHByb3Bvc2FsCi0JCQlwID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQgKyAiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50UG9zaXRpb24sIDAsIHByb3Bvc2VkVGV4dC5sZW5ndGgoKSArIDEsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VQYXRoKSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF8sIChuZXcgT2JqZWN0W117cHJvcG9zZWRUZXh0fSkpLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHKTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YVNjcmlwdFR5cGUoRG9jdW1lbnQgZG9jKSB7Ci0JCS8vIENhbiBub3QganVzdCBkbyBhIERvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZykgYXMgdGhpcwotCQkvLyBuZWVkcwotCQkvLyB0byBiZSByZWxhdGl2ZWx5IGZhc3QuCi0JCUxpc3QgbWV0YXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGNoZWNrIGZvciBNRVRBIHRhZ3MgdW5kZXIgdGhlIERvY3VtZW50Ci0JCU5vZGUgaHRtbCA9IG51bGw7Ci0JCU5vZGUgaGVhZCA9IG51bGw7Ci0JCU5vZGUgY2hpbGQgPSBudWxsOwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIChwYSkgMjAwMjEyMTcKLQkJLy8gY212YyBkZWZlY3QgMjM1NTU0Ci0JCS8vIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50OiB1c2luZyBjaGlsZC5nZXROZXh0U2libGluZygpIHJhdGhlciB0aGFuCi0JCS8vIG5vZGVMaXN0KGl0ZW0pIGZvciBPKG4pIHZzLiBPKG4qbikKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JCWZvciAoY2hpbGQgPSBkb2MuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKSB7Ci0JCQkJbWV0YXMuYWRkKGNoaWxkKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIVE1MKSkgewotCQkJCWh0bWwgPSBjaGlsZDsKLQkJCX0KLQkJfQotCQkvLyBOb2RlTGlzdCBjaGlsZHJlbiA9IGRvYy5nZXRDaGlsZE5vZGVzKCk7Ci0JCS8vIGZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCS8vIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJLy8gaWYoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJLy8gY29udGludWU7Ci0JCS8vIGlmKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkKLQkJLy8gbWV0YXMuYWRkKGNoaWxkKTsKLQkJLy8gZWxzZSBpZihjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRNTCkpCi0JCS8vIGh0bWwgPSBjaGlsZDsKLQkJLy8gfQotCi0JCS8vIGNoZWNrIGZvciBNRVRBIHRhZ3MgdW5kZXIgSEVBRAotCQlpZiAoaHRtbCAhPSBudWxsKSB7Ci0JCQlmb3IgKGNoaWxkID0gaHRtbC5nZXRGaXJzdENoaWxkKCk7IChjaGlsZCAhPSBudWxsKSAmJiAoaGVhZCA9PSBudWxsKTsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSEVBRCkpIHsKLQkJCQkJaGVhZCA9IGNoaWxkOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNoaWxkcmVuID0gaHRtbC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgJiYgaGVhZCA9PSBudWxsOyBpKyspIHsKLQkJCS8vIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCS8vIGlmKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkvLyBjb250aW51ZTsKLQkJCS8vIGlmKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIRUFEKSkKLQkJCS8vIGhlYWQgPSBjaGlsZDsKLQkJCS8vIH0KLQkJfQotCi0JCWlmIChoZWFkICE9IG51bGwpIHsKLQkJCWZvciAoaGVhZC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKSB7Ci0JCQkJCW1ldGFzLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2hpbGRyZW4gPSBoZWFkLmdldENoaWxkTm9kZXMoKTsKLQkJCS8vIGZvcihpbnQgaSA9IDAgOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJLy8gY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJLy8gaWYoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCS8vIGNvbnRpbnVlOwotCQkJLy8gaWYoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKQotCQkJLy8gbWV0YXMuYWRkKGNoaWxkKTsKLQkJCS8vIH0KLQkJfQotCi0JCXJldHVybiBnZXRNZXRhU2NyaXB0VHlwZShtZXRhcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1ldGFTY3JpcHRUeXBlKExpc3QgbWV0YU5vZGVMaXN0KSB7Ci0JCU5vZGUgbWV0YSA9IG51bGw7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbnVsbDsKLQkJYm9vbGVhbiBodHRwRXF1aXYgPSBmYWxzZTsKLQkJU3RyaW5nIGNvbnRlbnRTY3JpcHRUeXBlID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gbWV0YU5vZGVMaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQltZXRhID0gKE5vZGUpIG1ldGFOb2RlTGlzdC5nZXQoaSk7Ci0JCQlhdHRyaWJ1dGVzID0gbWV0YS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlodHRwRXF1aXYgPSBmYWxzZTsKLQkJCWNvbnRlbnRTY3JpcHRUeXBlID0gbnVsbDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJaWYgKGF0dHJpYnV0ZXMuaXRlbShqKS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRUUF9FUVVJVikpIHsKLQkJCQkJaHR0cEVxdWl2ID0gYXR0cmlidXRlcy5pdGVtKGopLmdldE5vZGVWYWx1ZSgpLmVxdWFsc0lnbm9yZUNhc2UoQ09OVEVOVF9TQ1JJUFRfVFlQRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGF0dHJpYnV0ZXMuaXRlbShqKS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoQ09OVEVOVCkpIHsKLQkJCQkJY29udGVudFNjcmlwdFR5cGUgPSBhdHRyaWJ1dGVzLml0ZW0oaikuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGh0dHBFcXVpdiAmJiAoY29udGVudFNjcmlwdFR5cGUgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gY29udGVudFNjcmlwdFR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIHRoZSBzY3JpcHROb2RlIGlzIGluIEN1cnJlbnRseSByZXR1cm5zCi0JICogamF2YXNjcmlwdCB1bmxlc3Mgc29tZSB1bmtub3duIHR5cGUgb3IgbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkLiBUaGVuIHRoZQotCSAqIHVua25vd24gdHlwZS9sYW5ndWFnZSBpcyByZXR1cm5lZAotCSAqIAotCSAqIEBwYXJhbSBzY3JpcHROb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2NyaXB0TGFuZ3VhZ2UoTm9kZSBzY3JpcHROb2RlKSB7Ci0JCU5vZGUgYXR0ciA9IG51bGw7Ci0KLQkJYm9vbGVhbiBzcGVjaWZpZWQgPSBmYWxzZTsKLQkJLy8gdHJ5IHRvIGZpbmQgYSBzY3JpcHRpbmcgYWRhcHRlciBmb3IgJ3R5cGUnCi0JCWlmICgoc2NyaXB0Tm9kZSA9PSBudWxsKSB8fCAoc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJYXR0ciA9IHNjcmlwdE5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgidHlwZSIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJc3BlY2lmaWVkID0gdHJ1ZTsKLQkJCVN0cmluZyB0eXBlID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCXJldHVybiBsb29rdXBTY3JpcHRUeXBlKHR5cGUpOwotCQl9Ci0JCS8vIG5vdyB0cnkgdG8gZmluZCBhIHNjcmlwdGluZyBhZGFwdGVyIGZvciAnbGFuZ3VhZ2UnIChkZXByZWNhdGVkIGJ5Ci0JCS8vIEhUTUwgc3BlY2lmaWNhdGlvbnMpCi0JCWF0dHIgPSBzY3JpcHROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImxhbmd1YWdlIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlzcGVjaWZpZWQgPSB0cnVlOwotCQkJU3RyaW5nIGxhbmd1YWdlID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCXJldHVybiBsb29rdXBTY3JpcHRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCX0KLQkJLy8gY2hlY2sgaWYgb25lIGlzIHNwZWNpZmllZCBieSBhIE1FVEEgdGFnIGF0IHRoZSByb290IGxldmVsIG9yIGluc2lkZQotCQkvLyBvZiBIRUFECi0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJaWYgKCFzcGVjaWZpZWQpIHsKLQkJCXR5cGUgPSBnZXRNZXRhU2NyaXB0VHlwZShzY3JpcHROb2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCX0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJc3BlY2lmaWVkID0gdHJ1ZTsKLQkJCXJldHVybiBsb29rdXBTY3JpcHRUeXBlKHR5cGUpOwotCQl9Ci0JCS8vIHJldHVybiBkZWZhdWx0Ci0JCWlmICghc3BlY2lmaWVkKSB7Ci0JCQlyZXR1cm4gU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBmbGF0bm9kZSBpcyB0aGUgJT4gZGVsaW1pdGVyCi0JICogCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUENsb3NlRGVsaW1pdGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4pIHsKLQkJaWYgKGZuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gaXNKU1BDbG9zZURlbGltaXRlcihmbi5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BDbG9zZURlbGltaXRlcihTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICh0eXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9DTE9TRSkgfHwgdHlwZS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSk7Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBmbGF0bm9kZSBpcyB0aGUgSlNQIHJlZ2lvbiA8JSU+LCA8JT0lPiwgPCUhJT4KLQkgKiAKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQRGVsaW1pdGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4pIHsKLQkJYm9vbGVhbiBpc0RlbGltaXRlciA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IGZuLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaXNEZWxpbWl0ZXIgPSBpc0pTUERlbGltaXRlcih0eXBlKTsKLQkJfQotCQlyZXR1cm4gaXNEZWxpbWl0ZXI7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUERlbGltaXRlcihTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIChpc0pTUE9wZW5EZWxpbWl0ZXIodHlwZSkgfHwgaXNKU1BDbG9zZURlbGltaXRlcih0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBmbGF0bm9kZSBpcyA8JSwgPCU9LCBvciA8JSEgSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YKLQkgKiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzIHdheSBmb3IgZXhwZWRlbmN5LgotCSAqIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24gIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUE9wZW5EZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbikgewotCQlpZiAoZm4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBpc0pTUE9wZW5EZWxpbWl0ZXIoZm4uZ2V0VHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQT3BlbkRlbGltaXRlcihTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICh0eXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgdHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgdHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRVhQUkVTU0lPTl9PUEVOKSk7Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBmbGF0bm9kZSBpcyB0aGUgPGpzcDpzY3JpcHRsZXQ+LCA8anNwOmV4cHJlc3Npb24+LCBvcgotCSAqIDxqc3A6ZGVjbGFyYXRpb24+dGFnCi0JICogCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hNTEpTUERlbGltaXRlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuKSB7Ci0JCWJvb2xlYW4gaXNEZWxpbWl0ZXIgPSBmYWxzZTsKLQkJaWYgKChmbiAhPSBudWxsKSAmJiAoZm4gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCU9iamVjdFtdIHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBmbikuZ2V0UmVnaW9ucygpLnRvQXJyYXkoKTsKLQkJCUlUZXh0UmVnaW9uIHRlbXAgPSBudWxsOwotCQkJU3RyaW5nIHJlZ2lvblRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgcmVnaW9uc1tpXTsKLQkJCQlpZiAodGVtcC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJcmVnaW9uVGV4dCA9IGZuLmdldFRleHQodGVtcCk7Ci0JCQkJCWlmIChyZWdpb25UZXh0LmVxdWFsc0lnbm9yZUNhc2UoImpzcDpzY3JpcHRsZXQiKSB8fCByZWdpb25UZXh0LmVxdWFsc0lnbm9yZUNhc2UoImpzcDpleHByZXNzaW9uIikgfHwgcmVnaW9uVGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGVjbGFyYXRpb24iKSkgewotCQkJCQkJaXNEZWxpbWl0ZXIgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0RlbGltaXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zICJqYXZhc2NyaXB0IiBpZiBsYW5ndWFnZSBhdHRyaWJ1dGUgaXMgc29tZSBmb3JtIG9mIGphdmFzY3JpcHQsCi0JICogImphdmEiIGlmIGxhbmd1YWdlIGF0dHJpYnV0ZSBpcyBzb21lIGZvcm0gb2YgamF2YS4gT3RoZXJ3aXNlLCBqdXN0Ci0JICogcmV0dXJucyB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBsYW5ndWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvb2t1cFNjcmlwdExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTW2ldLmVxdWFsc0lnbm9yZUNhc2UobGFuZ3VhZ2UpKSB7Ci0JCQkJcmV0dXJuIFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFfTEFOR1VBR0VfS0VZUy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBX0xBTkdVQUdFX0tFWVNbaV0uZXF1YWxzSWdub3JlQ2FzZShsYW5ndWFnZSkpIHsKLQkJCQlyZXR1cm4gU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhbmd1YWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgImphdmFzY3JpcHQiIGlmIHR5cGUgKHVzZWQgaW4gPHNjcmlwdCB0eXBlPSJ4eHgiPiBpcyBhY3R1YWxseQotCSAqIGphdmFzY3JpcHQgdHlwZS4gT3RoZXJ3aXNlLCBqdXN0IHJldHVybnMgdHlwZQotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9va3VwU2NyaXB0VHlwZShTdHJpbmcgdHlwZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX01JTUVfVFlQRV9LRVlTLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFRfTUlNRV9UWVBFX0tFWVNbaV0uZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODk2NDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yIHsKLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQXR0cmlidXRlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKChhdHRyRGVjbCA9PSBudWxsKSB8fCAoYnVmZmVyID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IHVzYWdlID0gYXR0ckRlY2wuZ2V0VXNhZ2UoKTsKLQkJaWYgKHVzYWdlID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2VuZXJhdGVSZXF1aXJlZEF0dHJpYnV0ZShudWxsLCBhdHRyRGVjbCwgYnVmZmVyKTsgLy8gdG9kbyBwYXNzCi0JCQkvLyBvd25lck5vZGUgYXMKLQkJCS8vIDFzdCBwYXJhbQotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUVuZFRhZyhTdHJpbmcgdGFnTmFtZSwgTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI8LyIgKyB0YWdOYW1lICsgIj4iKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlcXVpcmVkQXR0cmlidXRlKE5vZGUgb3duZXJOb2RlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmICgoYXR0ckRlY2wgPT0gbnVsbCkgfHwgKGJ1ZmZlciA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYXR0cmlidXRlIG5hbWUKLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBnZXRSZXF1aXJlZE5hbWUob3duZXJOb2RlLCBhdHRyRGVjbCk7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gbnVsbDsKLQkJLy8gPSBzaWduCi0JCWJ1ZmZlci5hcHBlbmQoYXR0cmlidXRlTmFtZSArICI9Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYXR0cmlidXRlIHZhbHVlCi0JCWlmIChhdHRyVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBpbnNlcnQgYW55IHZhbHVlIHRoYXQgaXMgaW1wbGllZAotCQkJaWYgKChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX05PTkUpICYmIChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKSkgewotCQkJCWRlZmF1bHRWYWx1ZSA9IGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJfQotCQkJLy8gb3RoZXJ3aXNlLCBpZiBhbiBlbnVtZXJhdGVkIGxpc3Qgb2YgdmFsdWVzIGV4aXN0cywgdXNlIHRoZQotCQkJLy8gZmlyc3QgdmFsdWUKLQkJCWVsc2UgaWYgKChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkgIT0gbnVsbCkgJiYgKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS5sZW5ndGggPiAwKSkgewotCQkJCWRlZmF1bHRWYWx1ZSA9IGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKVswXTsKLQkJCX0KLQkJfQotCQkKLQkJY2hhciBhdHRyUXVvdGUgPSAnXCInOwotCQkvLyBGb3VuZCBhIGRvdWJsZSBxdW90ZSwgd3JhcCB0aGUgYXR0cmlidXRlIGluIHNpbmdsZSBxdW90ZXMKLQkJaWYoZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgZGVmYXVsdFZhbHVlLmluZGV4T2YoYXR0clF1b3RlKSA+PSAwKSB7Ci0JCQlhdHRyUXVvdGUgPSAnXCcnOwotCQl9Ci0JCQotCQlidWZmZXIuYXBwZW5kKGF0dHJRdW90ZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoKChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiAiIikpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoYXR0clF1b3RlKTsKLQkJcmV0dXJuOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU3RhcnRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKChlbGVtZW50RGVjbCA9PSBudWxsKSB8fCAoYnVmZmVyID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiPCIgKyB0YWdOYW1lKTsvLyROT04tTkxTLTEkCi0JCWdlbmVyYXRlQXR0cmlidXRlcyhlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRTdGFydFRhZ0Nsb3NlKHBhcmVudE5vZGUsIGVsZW1lbnREZWNsKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChOb2RlIG5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKSB7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAocmVxdWlyZXNBdHRyaWJ1dGVzKGVsZW1lbnREZWNsKSkgewotCQkJcmV0dXJuIGdldFJlcXVpcmVkTmFtZShub2RlLCBlbGVtZW50RGVjbCkubGVuZ3RoKCkgKyAyOyAvLyA8ICsKLQkJCS8vIG5hbWUgKwotCQkJLy8gc3BhY2UKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAxICsgZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGVsZW1lbnREZWNsKS5sZW5ndGgoKSArIGdldFN0YXJ0VGFnQ2xvc2Uobm9kZSwgZWxlbWVudERlY2wpLmxlbmd0aCgpOyAvLyA8ICsKLQkJCS8vIG5hbWUKLQkJCS8vICsKLQkJCS8vIGFwcHJvcHJpYXRlCi0JCQkvLyBjbG9zZQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdGhlckNsb3NlKE5vZGUgbm90QVRhZ05vZGUpIHsKLQkJaWYgKG5vdEFUYWdOb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9ICgoSURPTU5vZGUpIG5vdEFUYWdOb2RlKS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgJiYgbm9kZS5nZXRSZWdpb25zKCkuZ2V0KDApLmdldFR5cGUoKS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX09QRU4pKSB7Ci0JCQkJcmV0dXJuICIlPiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnQ2xvc2UoTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlTdHJpbmcgb3RoZXIgPSBnZXRPdGhlckNsb3NlKHBhcmVudE5vZGUpOwotCQlpZiAob3RoZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIG90aGVyOwotCQl9Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIj4iOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJcmV0dXJuICIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxSZWxldmFuY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5OTA3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxSZWxldmFuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbnN0YW50czsKLQotCi0KLS8qKgotICogc29tZSByZWxldmFuY2UgY29uc3RhbnRzIGZvciBjb250ZW50IGFzc2lzdCBoaWdoZXIgcmVsZXZhbmNlIG1lYW5zIGl0IHNob3dzCi0gKiB1cCBoaWdoZXIgb24gdGhlIGxpc3QKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxSZWxldmFuY2VDb25zdGFudHMgZXh0ZW5kcyBJUmVsZXZhbmNlQ29uc3RhbnRzIHsKLQotCWludCBSX0NEQVRBID0gNDAwOwotCWludCBSX0NMT1NFX1RBRyA9IDE1MDA7Ci0KLQlpbnQgUl9DT01NRU5UID0gMTAwOwotCi0JLy8gbW92ZWQgdGhpcyBhYm92ZSBtYWNyb3MKLQlpbnQgUl9ET0NUWVBFID0gNjAwOwotCWludCBSX0VORF9UQUcgPSAxNDAwOwotCWludCBSX0VORF9UQUdfTkFNRSA9IDExMDA7Ci0JaW50IFJfRU5USVRZID0gMTAwMDsKLQlpbnQgUl9KU1AgPSA1MDA7Ci0KLQlpbnQgUl9KU1BfQVRUUklCVVRFX1ZBTFVFID0gNzAwOwotCi0JLy8gKHBhKSBtYWtlIHRoZXNlIHRoZSBzYW1lIHJlbGV2YW5jZSBzbyBwcm9wb3NhbHMgYXJlIHNhbWUgb3JkZXIgZm9yIFY1MDEKLQlpbnQgUl9NQUNSTyA9IDUwMDsKLQotCS8vIGFkZCB0aGlzIG9udG8gInJlcXVpcmVkIiBhdHRycywgZWxlbWVudHMsIGV0YyB0byBidWJibGUgdGhlbSB1cCBvbgotCS8vIHNvcnRpbmcuLi4KLQkvLyBDTVZDIDI0NjYxOAotCWludCBSX1JFUVVJUkVEID0gMTA7Ci0JaW50IFJfVEFHX0lOU0VSVElPTiA9IDUwMDsKLQlpbnQgUl9TVFJJQ1RMWV9WQUxJRF9UQUdfSU5TRVJUSU9OID0gNjAwOwotCWludCBSX1RBR19OQU1FID0gMTIwMDsKLQlpbnQgUl9YTUxfQVRUUklCVVRFX05BTUUgPSA5MDA7Ci0JaW50IFJfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDgwMDsKLQlpbnQgUl9YTUxfREVDTEFSQVRJT04gPSAxMzAwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmOWFkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotLyoqCi0gKiBDb21wbGV0aW9uIHByb2Nlc3NvciBmb3IgWE1MIFRlbXBsYXRlcy4gTW9zdCBvZiB0aGUgd29yayBpcyBhbHJlYWR5IGRvbmUgYnkKLSAqIHRoZSBYTUwgQ29udGVudCBBc3Npc3QgcHJvY2Vzc29yLCBzbyBieSB0aGUgdGltZSB0aGUKLSAqIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBpcyBhc2tlZCBmb3IgY29udGVudCBhc3Npc3QgcHJvcG9zYWxzLCB0aGUKLSAqIFhNTCBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgaGFzIGFscmVhZHkgc2V0IHRoZSBjb250ZXh0IHR5cGUgZm9yCi0gKiB0ZW1wbGF0ZXMuCi0gKi8KLWNsYXNzIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuICgoVGVtcGxhdGVQcm9wb3NhbCkgbzIpLmdldFJlbGV2YW5jZSgpIC0gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMSkuZ2V0UmVsZXZhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGZnUHJvcG9zYWxDb21wYXJhdG9yID0gbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCS8qCi0JICogQ29waWVkIGZyb20gc3VwZXIgY2xhc3MgZXhjZXB0IGluc3RlYWQgb2YgY2FsbGluZyBjcmVhdGVDb250ZXh0KHZpZXdlciwKLQkgKiByZWdpb24pIGNhbGwgY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCi0JCS8vIGFkanVzdCBvZmZzZXQgdG8gZW5kIG9mIG5vcm1hbGl6ZWQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPT0gb2Zmc2V0KSB7Ci0JCQlvZmZzZXQgPSBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQlTdHJpbmcgcHJlZml4ID0gZXh0cmFjdFByZWZpeCh2aWV3ZXIsIG9mZnNldCk7Ci0JCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKG9mZnNldCAtIHByZWZpeC5sZW5ndGgoKSwgcHJlZml4Lmxlbmd0aCgpKTsKLQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KHZpZXdlciwgcmVnaW9uLCBvZmZzZXQpOwotCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCX0KLQotCQkvLyBuYW1lIG9mIHRoZSBzZWxlY3Rpb24gdmFyaWFibGVzIHtsaW5lLCB3b3JkfV9zZWxlY3Rpb24KLQkJY29udGV4dC5zZXRWYXJpYWJsZSgic2VsZWN0aW9uIiwgc2VsZWN0aW9uLmdldFRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZVtdIHRlbXBsYXRlcyA9IGdldFRlbXBsYXRlcyhjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSk7Ci0KLQkJTGlzdCBtYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSB0ZW1wbGF0ZXNbaV07Ci0JCQl0cnkgewotCQkJCWNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS52YWxpZGF0ZSh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQkJfQotCQkJY2F0Y2ggKFRlbXBsYXRlRXhjZXB0aW9uIGUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0ZW1wbGF0ZS5tYXRjaGVzKHByZWZpeCwgY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLmdldElkKCkpKSB7Ci0JCQkJbWF0Y2hlcy5hZGQoY3JlYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIChJUmVnaW9uKSByZWdpb24sIGdldFJlbGV2YW5jZSh0ZW1wbGF0ZSwgcHJlZml4KSkpOwotCQkJfQotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChtYXRjaGVzLCBmZ1Byb3Bvc2FsQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIG1hdGNoZXMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFttYXRjaGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb25jcmV0ZSB0ZW1wbGF0ZSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gcmVnaW9uIGluIHRoZQotCSAqIGRvY3VtZW50LiBUaGlzIGludm9sdmVzIGZpbmRpbmcgb3V0IHdoaWNoIGNvbnRleHQgdHlwZSBpcyB2YWxpZCBhdCB0aGUKLQkgKiBnaXZlbiBsb2NhdGlvbiwgYW5kIHRoZW4gY3JlYXRpbmcgYSBjb250ZXh0IG9mIHRoaXMgdHlwZS4gVGhlIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgPGNvZGU+U21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0PC9jb2RlPiBmb3IKLQkgKiB0aGUgY29udGV4dCB0eXBlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gVGhpcyB0YWtlcyB0aGUgb2Zmc2V0IGF0IHdoaWNoCi0JICogY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgZm9yIHdoaWNoIHRoZSBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIGludG8gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+IGZvciB3aGljaCB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBvZmZzZXQgd2hlcmUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQKLQkgKiBAcmV0dXJuIGEgdGVtcGxhdGUgY29udGV4dCB0aGF0IGNhbiBoYW5kbGUgdGVtcGxhdGUgaW5zZXJ0aW9uIGF0IHRoZQotCSAqICAgICAgICAgZ2l2ZW4gbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZUNvbnRleHQgY3JlYXRlQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIHByZXR0eSBtdWNoIHNhbWUgY29kZSBhcyBzdXBlci5jcmVhdGVDb250ZXh0IGV4Y2VwdCBjcmVhdGUKLQkJLy8gU21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBnZXRDb250ZXh0VHlwZSh2aWV3ZXIsIHJlZ2lvbik7Ci0JCWlmIChjb250ZXh0VHlwZSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybiBuZXcgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBnZXRJbWFnZSh0ZW1wbGF0ZSksIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotCQkJdHlwZSA9IHJlZ2lzdHJ5LmdldENvbnRleHRUeXBlKGZDb250ZXh0VHlwZUlkKTsKLQkJfQotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgewotCQkvLyBqdXN0IHJldHVybiB0aGUgc2FtZSBpbWFnZSBmb3Igbm93Ci0JCXJldHVybiBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19NQUNSTyk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlW10gZ2V0VGVtcGxhdGVzKFN0cmluZyBjb250ZXh0VHlwZUlkKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlc1tdID0gbnVsbDsKLQotCQlUZW1wbGF0ZVN0b3JlIHN0b3JlID0gZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb250ZXh0VHlwZShTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlmQ29udGV4dFR5cGVJZCA9IGNvbnRleHRUeXBlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMWM0NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLkNNSW1hZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEFkYXB0cyBhIERPTSBub2RlIHRvIGEgSkZhY2Ugdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlciBpbXBsZW1lbnRzIElKRmFjZU5vZGVBZGFwdGVyIHsKLQotCWZpbmFsIHN0YXRpYyBDbGFzcyBBREFQVEVSX0tFWSA9IElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzOwotCi0JLyoqCi0JICogZGVidWcgLm9wdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBnZXREZWJ1Z1ZhbHVlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGdldERlYnVnVmFsdWUoKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL291dGxpbmUiKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHJlc3VsdCA9ICh2YWx1ZSAhPSBudWxsKSAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBSZWZyZXNoU3RydWN0dXJlSm9iIGZSZWZyZXNoSm9iID0gbnVsbDsKLQotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZkFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGNyZWF0ZUltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTEVNRU5UKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsgLy8gYWN0dWFsbHksIFRFWFQgc2hvdWxkIG5ldmVyIGJlIHNlZW4gaW4KLQkJCQkvLyB0aGUgdHJlZQotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RYVEVYVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NEQVRBU0VDVElPTik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCWNhc2UgTm9kZS5FTlRJVFlfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlRJVFkpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT01NRU5UKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOiB7Ci0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRE9DVFlQRSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuTk9UQVRJT05fTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9OT1RBVElPTik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZVJlc291cmNlTmFtZSkgewotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVJlc291cmNlTmFtZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQotCQkvLyAocGEpIDIwMDIxMjE3Ci0JCS8vIGNtdmMgZGVmZWN0IDIzNTU1NAotCQkvLyBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudDogdXNpbmcgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSByYXRoZXIgdGhhbgotCQkvLyBub2RlTGlzdChpdGVtKSBmb3IgTyhuKSB2cy4gTyhuKm4pCi0JCS8vCi0JCUFycmF5TGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlOb2RlIG4gPSBjaGlsZDsKLQkJCQlpZiAobi5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCXYuYWRkKG4pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdi50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiB3aXRoIHRoZSBlbGVtZW50cyBiZWxvbmdpbmcgdG8gdGhlIHBhc3NlZAotCSAqIGVsZW1lbnQuIFRoZXNlIGFyZSB0aGUgdG9wIGxldmVsIGl0ZW1zIGluIGEgbGlzdCwgdHJlZSwgdGFibGUsIGV0Yy4uLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4obm9kZSk7Ci0JfQotCi0JLyoqCi0JICogRmV0Y2hlcyB0aGUgbGFiZWwgaW1hZ2Ugc3BlY2lmaWMgdG8gdGhpcyBvYmplY3QgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IG5vZGUpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCWltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoQ01JbWFnZVV0aWwuZ2V0RGVjbGFyYXRpb24oKE5vZGUpIG5vZGUpKTsKLQkJCWlmICgoaW1hZ2UgPT0gbnVsbCkgJiYgKEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKSAhPSBudWxsKSkgewotCQkJCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBnZXROb2RlTmFtZShub2RlKTsKLQkJCQlpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KG5vZGVOYW1lKTsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQlpbWFnZSA9IGNyZWF0ZUltYWdlKG5vZGUpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQkJaW1hZ2VSZWdpc3RyeS5wdXQobm9kZU5hbWUsIGltYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogRmV0Y2hlcyB0aGUgbGFiZWwgdGV4dCBzcGVjaWZpYyB0byB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dChPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9kZU5hbWUoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmdCdWZmZXIgbm9kZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJbm9kZU5hbWUuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0KLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQlub2RlTmFtZS5pbnNlcnQoMCwgIkRPQ1RZUEU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBub2RlTmFtZS50b1N0cmluZygpOwotCX0KLQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCXJldHVybiBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBSZWZyZXNoU3RydWN0dXJlSm9iIGdldFJlZnJlc2hKb2IoKSB7Ci0JCWlmIChmUmVmcmVzaEpvYiA9PSBudWxsKSB7Ci0JCQlmUmVmcmVzaEpvYiA9IG5ldyBSZWZyZXNoU3RydWN0dXJlSm9iKCk7Ci0JCX0KLQkJcmV0dXJuIGZSZWZyZXNoSm9iOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyAocGEpIDIwMDIxMjE3Ci0JCS8vIGNtdmMgZGVmZWN0IDIzNTU1NCA+IHVzZSBjaGlsZC5nZXROZXh0U2libGluZygpIGluc3RlYWQgb2YKLQkJLy8gbm9kZUxpc3QoaXRlbSkgZm9yIE8obikgdnMuIE8obipuKQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0eXBlLmVxdWFscyhBREFQVEVSX0tFWSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBvYmplY3QgYmVpbmcgYWRhcHRlciAodGhlIG5vdGlmaWVyKSB3aGVuIHNvbWV0aGluZyBoYXMKLQkgKiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBmdXR1cmVfVE9ETzogdGhlICd1aWpvYnMnIHVzZWQgaW4gdGhpcyBtZXRob2Qgd2VyZSBhZGRlZCB0byBzb2x2ZQotCQkvLyB0aHJlYWRpbmcgcHJvYmxlbXMgd2hlbiB0aGUgZG9tCi0JCS8vIGlzIHVwZGF0ZWQgaW4gdGhlIGJhY2tncm91bmQgd2hpbGUgdGhlIGVkaXRvciBpcyBvcGVuLiBUaGV5IG1heSBiZQotCQkvLyBhIGJpdCBvdmVya2lsbCBhbmQgbm90IHRoYXQgdXNlZnVsLgotCQkvLyAoVGhhdCBpcywgbWF5IGJlIGJlIHdvcnRoeSBvZiBqb2IgbWFuYWdlciBtYW5hZ2VtZW50KS4gSWYgdGhleSBhcmUKLQkJLy8gZm91bmQgdG8gYmUgaW1wb3J0YW50IGVub3VnaCB0byBsZWF2ZSBpbiwKLQkJLy8gdGhlcmUncyBwcm9iYWJseSBzb21lIG9wdGltaXphdGlvbiB0aGF0IGNhbiBiZSBkb25lLgotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3RlbmVycyA9IGZBZGFwdGVyRmFjdG9yeS5nZXRMaXN0ZW5lcnMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0KLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwNjM3Ci0JCQkJLy8gaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZSAmJiAobGlzdGVuZXIgaW5zdGFuY2VvZgotCQkJCS8vIFN0cnVjdHVyZWRWaWV3ZXIpICYmIChldmVudFR5cGUgPT0KLQkJCQkvLyBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIHx8IChldmVudFR5cGUgPT0KLQkJCQkvLyBJTm9kZU5vdGlmaWVyLkNIQU5HRSAmJiBjaGFuZ2VkRmVhdHVyZSA9PSBudWxsKSkpIHsKLQkJCQlpZiAoKGxpc3RlbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgJiYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgfHwgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCkgfHwgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKRmFjZU5vZGVBZGFwdGVyIG5vdGlmaWVkIG9uIGV2ZW50IHR5cGUgPiAiICsgZXZlbnRUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJLy8gcmVmcmVzaCBvbiBzdHJ1Y3R1cmFsIGFuZCAidW5rbm93biIgY2hhbmdlcwotCQkJCQlTdHJ1Y3R1cmVkVmlld2VyIHN0cnVjdHVyZWRWaWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgbGlzdGVuZXI7Ci0JCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MjMwCi0JCQkJCWlmIChzdHJ1Y3R1cmVkVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsKSB7Ci0JCQkJCQlnZXRSZWZyZXNoSm9iKCkucmVmcmVzaChzdHJ1Y3R1cmVkVmlld2VyLCAoTm9kZSkgbm90aWZpZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3N2NhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLS8qKgotICogQW4gYWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZSBKRmFjZU5vZGVBZGFwdGVycy4gVXNlIHRoaXMgYWRhcHRlciBmYWN0b3J5Ci0gKiB3aXRoIGEgSkZhY2VBZGFwdGVyQ29udGVudFByb3ZpZGVyIHRvIGRpc3BsYXkgRE9NIG5vZGVzIGluIGEgdHJlZS4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIGNsYXNzIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQkJcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgZmluYWwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCQlpZiAoKG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0xPQURFRCkgfHwgKG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKSkgewotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChjbURvY3VtZW50TWFuYWdlci5nZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FEKSkgewotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVmcmVzaFZpZXdlcnMoKSB7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkJCWZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQkJSm9iIHJlZnJlc2ggPSBuZXcgVUlKb2IoWE1MVUlNZXNzYWdlcy5yZWZyZXNob3V0bGluZV8wKSB7Ci0JCQkJCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJCUNvbnRyb2wgcmVmcmVzaENvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJCQkJCWlmICgocmVmcmVzaENvbnRyb2wgIT0gbnVsbCkgJiYgIXJlZnJlc2hDb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQl2aWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXJlZnJlc2guc2V0U3lzdGVtKHRydWUpOwotCQkJCQlyZWZyZXNoLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQkJCXJlZnJlc2guc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgVmlld2VyKSB7Ci0JCQkJCWZpbmFsIFZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJCUpvYiByZWZyZXNoID0gbmV3IFVJSm9iKFhNTFVJTWVzc2FnZXMucmVmcmVzaG91dGxpbmVfMCkgewotCQkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCQlDb250cm9sIHJlZnJlc2hDb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJCQkJCQlpZiAoKHJlZnJlc2hDb250cm9sICE9IG51bGwpICYmICFyZWZyZXNoQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXJlZnJlc2guc2V0U3lzdGVtKHRydWUpOwotCQkJCQlyZWZyZXNoLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQkJCXJlZnJlc2guc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyOwotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBudWxsOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBTZXQgZkxpc3RlbmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIHNpbmdsZXRvbkFkYXB0ZXI7Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXRoaXMoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgSkZhY2UgYWRhcHRlciBmb3IgdGhlIERPTSBub2RlIHBhc3NlZCBpbgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXIodGhpcyk7Ci0JCQlpbml0QWRhcHRlcihzaW5nbGV0b25BZGFwdGVyLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIHJldHVybnMgImNvcHkiIHNvIG5vIG9uZSBjYW4gbW9kaWZ5IG91ciBsaXN0LiBJdCBpcyBhIHNoYWxsb3cgY29weS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIENvbGxlY3Rpb24gZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChmTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlciwgSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCS8vIHJlZ2lzdGVyIGZvciBDTURvY3VtZW50TWFuYWdlciBldmVudHMKLQkJTW9kZWxRdWVyeUFkYXB0ZXIgbXFhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSBub2RlLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAobXFhZGFwdGVyICE9IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgbXF1ZXJ5ID0gbXFhZGFwdGVyLmdldE1vZGVsUXVlcnkoKTsKLQkJCWlmICgobXF1ZXJ5ICE9IG51bGwpICYmIChtcXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSkgewotCQkJCWNtRG9jdW1lbnRNYW5hZ2VyID0gbXF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwoKTsKLQkJCQljbURvY3VtZW50TWFuYWdlci5hZGRMaXN0ZW5lcihmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZXJlZ2lzdGVyIGZyb20gQ01Eb2N1bWVudE1hbmFnZXIgZXZlbnRzCi0JCWlmICgoY21Eb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgJiYgKGZDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQljbURvY3VtZW50TWFuYWdlci5yZW1vdmVMaXN0ZW5lcihmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcik7Ci0JCX0KLQkJZkxpc3RlbmVycy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNTQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLS8qKgotICogQW4gSVRyZWVDb250ZW50UHJvdmlkZXIgZm9yIGEgVHJlZVZpZXdlcnMgdXNlZCB0byBkaXNwbGF5IERPTSBub2Rlcy4gVGhpcwotICogY29udGVudCBwcm92aWRlciB0YWtlcyBhbiBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIEpGYWNlIGFkYXB0ZXJzIGZvciB0aGUKLSAqIG5vZGVzIGluIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHVibGljIEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmlzdWFsIHBhcnQgdGhhdCBpcyB1c2luZyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWJvdXQgdG8gYmUKLQkgKiBkaXNwb3NlZC4gRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRmFjZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRhYmxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGFwdGVyIGZvcgotCSAqLwotCXByb3RlY3RlZCBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikgewotCQkJCXJldHVybiAoSUpGYWNlTm9kZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVGhlIHJvb3QgaXMgdXN1YWxseSBhbiBpbnN0YW5jZSBvZiBhbiBYTUxTdHJ1Y3R1cmVkTW9kZWwgaW4KLQkJLy8gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGV4dHJhY3QgdGhlIGRvY3VtZW50LgotCQlPYmplY3QgdG9wTm9kZSA9IG9iamVjdDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJdG9wTm9kZSA9ICgoSURPTU1vZGVsKSBvYmplY3QpLmdldERvY3VtZW50KCk7Ci0JCX0KLQotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcih0b3BOb2RlKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRFbGVtZW50cyh0b3BOb2RlKTsKLQkJfQotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAoKG9sZElucHV0ICE9IG51bGwpICYmIChvbGRJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgb2xkSW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCQlpZiAoKG5ld0lucHV0ICE9IG51bGwpICYmIChuZXdJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgbmV3SW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTY4ZGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotCi0vKioKLSAqIEEgKGNvbHVtbikgbGFiZWwgcHJvdmlkZXIgYmFja2VkIGJ5IEpGYWNlTm9kZUFkYXB0ZXJzLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkZhY2VOb2RlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRmFjZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRhYmxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGFwdGVyIGZvcgotCSAqLwotCXByb3RlY3RlZCBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikgewotCQkJCXJldHVybiAoSUpGYWNlTm9kZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TGFiZWxJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TGFiZWxUZXh0KGVsZW1lbnQpOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1JlZnJlc2hTdHJ1Y3R1cmVKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9SZWZyZXNoU3RydWN0dXJlSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OGMwOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1JlZnJlc2hTdHJ1Y3R1cmVKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBqb2IgaG9sZHMgYSBxdWV1ZSBvZiB1cGRhdGVzIChhZmZlY3RlZCBub2RlcykgZm9yIG11bHRpcGxlIHN0cnVjdHVyZWQKLSAqIHZpZXdlcnMuIFdoZW4gYSBuZXcgcmVxdWVzdCBjb21lcyBpbiwgdGhlIGN1cnJlbnQgcnVuIGlzIGNhbmNlbGxlZCwgdGhlIG5ldwotICogcmVxdWVzdCBpcyBhZGRlZCB0byB0aGUgcXVldWUsIHRoZW4gdGhlIGpvYiBpcyByZS1zY2hlZHVsZWQuIFN1cHBvcnQgZm9yCi0gKiBtdWx0aXBsZSBzdHJ1Y3R1cmVkIHZpZXdlcnMgaXMgcmVxdWlyZWQgYmVjYXVzZSByZWZyZXNoIHVwZGF0ZXMgYXJlIHVzdWFsbHkKLSAqIHRyaWdnZXJlZCBieSBtb2RlbCBjaGFuZ2VzLCBhbmQgdGhlIG1vZGVsIG1heSBiZSB2aXNpYmxlIGluIG1vcmUgdGhhbiBvbmUKLSAqIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotY2xhc3MgUmVmcmVzaFN0cnVjdHVyZUpvYiBleHRlbmRzIEpvYiB7Ci0KLQkvKiogZGVidWcgZmxhZyAqLwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX0RFTEFZID0gMzAwOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL3JlZnJlc2hTdHJ1Y3R1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9ICh2YWx1ZSAhPSBudWxsKSAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqIExpc3Qgb2YgcmVmcmVzaCByZXF1ZXN0cyAoTm9kZXMpICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGZSZWZyZXNoZXM7Ci0JLyoqIExpc3Qgb2YgdXBkYXRlIHJlcXVlc3RzIChOb2RlcykgKi8KLQlwcml2YXRlIGZpbmFsIExpc3QgZlVwZGF0ZXM7Ci0JLyoqIExpc3Qgb2YgdXBkYXRlIHJlcXVlc3RzIChOb2RlcykgKi8KLQlwcml2YXRlIGZpbmFsIExpc3QgZlVwZGF0ZVByb3BlcnRpZXM7Ci0JLyoqIHRoZSBzdHJ1Y3R1cmVkIHZpZXdlcnMgKi8KLQlTZXQgZlJlZnJlc2hWaWV3ZXJzID0gbmV3IEhhc2hTZXQoMyk7Ci0JU2V0IGZVcGRhdGVWaWV3ZXJzID0gbmV3IEhhc2hTZXQoMyk7Ci0KLQlwdWJsaWMgUmVmcmVzaFN0cnVjdHVyZUpvYigpIHsKLQkJc3VwZXIoWE1MVUlNZXNzYWdlcy5yZWZyZXNob3V0bGluZV8wKTsKLQkJc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCWZSZWZyZXNoZXMgPSBuZXcgQXJyYXlMaXN0KDUpOwotCQlmVXBkYXRlcyA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCWZVcGRhdGVQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdCg1KTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFVwZGF0ZVJlcXVlc3QoTm9kZSBuZXdOb2RlUmVxdWVzdCwgU3RyaW5nW10gdXBkYXRlUHJvcGVydGllcykgewotCQkvKgotCQkgKiBJZiB3ZSBnZXQgdG8gaGVyZSwgZWl0aGVyIGZyb20gZXhpc3RpbmcgcmVxdWVzdCBsaXN0IGJlaW5nIHplcm8KLQkJICogbGVuZ3RoLCBvciBubyBleGlzaXRuZyByZXF1ZXN0cyAibWF0Y2hlZCIgbmV3IHJlcXVlc3QsIHRoZW4gYWRkIHRoZQotCQkgKiBuZXcgcmVxdWVzdC4KLQkJICovCi0JCWZVcGRhdGVzLmFkZChuZXdOb2RlUmVxdWVzdCk7Ci0JCWZVcGRhdGVQcm9wZXJ0aWVzLmFkZCh1cGRhdGVQcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFVwZGF0ZVZpZXdlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlmVXBkYXRlVmlld2Vycy5hZGQodmlld2VyKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlZnJlc2hSZXF1ZXN0KE5vZGUgbmV3Tm9kZVJlcXVlc3QpIHsKLQkJLyoKLQkJICogbm90ZTogdGhlIGNhbGxlciBtdXN0IE5PVCBwYXNzIGluIG51bGwgbm9kZSByZXF1ZXN0ICh3aGljaCwgc2luY2UKLQkJICogcHJpdmF0ZSBtZXRob2QsIHdlIGRvIG5vdCBuZWVkIHRvIGdhdXJkIGFnYWluc3QgaGVyZSwgYXMgbG9uZyBhcyB3ZQotCQkgKiBnYXVyZCBhZ2FpbnN0IGl0IGluIGNhbGxpbmcgbWV0aG9kLgotCQkgKi8KLQkJaW50IHNpemUgPSBmUmVmcmVzaGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU5vZGUgZXhpc3RpbmdOb2RlUmVxdWVzdCA9IChOb2RlKSBmUmVmcmVzaGVzLmdldChpKTsKLQkJCS8qCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NDI3IElmIHdlCi0JCQkgKiBhbHJlYWR5IGhhdmUgYSByZXF1ZXN0IHdoaWNoIGVxdWFscyB0aGUgbmV3IHJlcXVlc3QsIGRpc2NhcmQKLQkJCSAqIHRoZSBuZXcgcmVxdWVzdAotCQkJICovCi0JCQlpZiAoZXhpc3RpbmdOb2RlUmVxdWVzdC5lcXVhbHMobmV3Tm9kZVJlcXVlc3QpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLyoKLQkJCSAqIElmIHdlIGFscmVhZHkgaGF2ZSBhIHJlcXVlc3Qgd2hpY2ggY29udGFpbnMgdGhlIG5ldyByZXF1ZXN0LAotCQkJICogZGlzY2FyZCB0aGUgbmV3IHJlcXVlc3QKLQkJCSAqLwotCQkJaWYgKGNvbnRhaW5zKGV4aXN0aW5nTm9kZVJlcXVlc3QsIG5ld05vZGVSZXF1ZXN0KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8qCi0JCQkgKiBJZiBuZXcgcmVxdWVzdCBjb250YWlucyBhbnkgZXhpc3RpbmcgcmVxdWVzdHMsIHJlcGxhY2UgaXQgd2l0aAotCQkJICogbmV3IHJlcXVlc3QuIElTU1VFOiB0ZWNobmljYWxseSwgd2Ugc2hvdWxkIHJlcGxhY2UgQUxMCi0JCQkgKiBjb250YWluZWQsIGV4aXN0aW5nIHJlcXVlc3RzIChzdWNoIGFzIGlmIG1hbnkgc2libGluZ3MgYWxyZWFkeQotCQkJICogcXVlJ2QgdXAgd2hlbiB0aGVpciBjb21tb24gcGFyZW50IGlzIHRoZW4gcmVxdWVzdGVkLCBidXQsIEknbQotCQkJICogbm90IHN1cmUgaWYgdGhhdCBvY2N1cnMgbXVjaCwgaW4gcHJhY3RpY2UsIG9yIGlmIHRoZXJlJ3MgYW4KLQkJCSAqIGFsZ29yaXRobSB0byBxdWlja2x5IGZpbmQgdGhlbSBhbGwuIEFjdHVhbGx5LCBJIGd1ZXNzIHdlIGNvdWxkCi0JCQkgKiBqdXN0IGdvIHRocm91Z2ggdGhlIF9yZXN0XyBvZiB0aGUgbGlzdCAoaSsxIHRvIHNpemUpIGFuZCByZW1vdmUKLQkJCSAqIGFueSB0aGF0IGFyZSBjb250YWluZWQgYnkgbmV3IHJlcXVlc3QgLi4uIGluIGZ1dHVyZSA6KSAuCi0JCQkgKi8KLQkJCWlmIChjb250YWlucyhuZXdOb2RlUmVxdWVzdCwgZXhpc3RpbmdOb2RlUmVxdWVzdCkpIHsKLQkJCQlmUmVmcmVzaGVzLnNldChpLCBuZXdOb2RlUmVxdWVzdCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8qCi0JCSAqIElmIHdlIGdldCB0byBoZXJlLCBlaXRoZXIgZnJvbSBleGlzdGluZyByZXF1ZXN0IGxpc3QgYmVpbmcgemVybwotCQkgKiBsZW5ndGgsIG9yIG5vIGV4aXNpdG5nIHJlcXVlc3RzICJtYXRjaGVkIiBuZXcgcmVxdWVzdCwgdGhlbiBhZGQgdGhlCi0JCSAqIG5ldyByZXF1ZXN0LgotCQkgKi8KLQkJZlJlZnJlc2hlcy5hZGQobmV3Tm9kZVJlcXVlc3QpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkUmVmcmVzaFZpZXdlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlmUmVmcmVzaFZpZXdlcnMuYWRkKHZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogU2ltcGxlIGhpZXJhcmNoaWNhbCBjb250YWlubWVudCByZWxhdGlvbnNoaXAuIE5vdGUsIHRoaXMgbWV0aG9kIHJldHVybnMKLQkgKiAiZmFsc2UiIGlmIHRoZSB0d28gbm9kZXMgYXJlIGVxdWFsIQotCSAqIAotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybiBpZiB0aGUgcm9vdCBpcyBwYXJlbnQgb2YgcG9zc2libGUsIHJldHVybiB0cnVlLCBvdGhlcndpc2UKLQkgKiAgICAgICAgIHJldHVybiBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhOb2RlIHJvb3QsIE5vZGUgcG9zc2libGUpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVjdXJzaXZlIGNhbGwgdy8gcm9vdDogIiArIHJvb3QuZ2V0Tm9kZU5hbWUoKSArICIgYW5kIHBvc3NpYmxlOiAiICsgcG9zc2libGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyBjaGVja3MgYXJlIGltcG9ydGFudAotCQkvLyAjZG9jdW1lbnQgbm9kZSB3aWxsIGJyZWFrIHRoZSBhbGdvcml0aG0gb3RoZXJ3aXNlCi0KLQkJLy8gY2FuJ3QgY29udGFpbiB0aGUgY2hpbGQgaWYgaXQncyBudWxsCi0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmV0dXJuaW5nIGZhbHNlOiByb290IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIG5vdGhpbmcgY2FuIGJlIHBhcmVudCBvZiBEb2N1bWVudCBub2RlCi0JCWlmIChwb3NzaWJsZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyBmYWxzZTogcG9zc2libGUgaXMgRG9jdW1lbnQgbm9kZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gZG9jdW1lbnQgY29udGFpbnMgZXZlcnl0aGluZwotCQlpZiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyB0cnVlOiByb290IGlzIERvY3VtZW50IG5vZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBjaGVjayBwYXJlbnRhZ2UKLQkJTm9kZSBjdXJyZW50ID0gcG9zc2libGU7Ci0JCS8vIGxvb3AgcGFyZW50cwotCQl3aGlsZSAoKGN1cnJlbnQgIT0gbnVsbCkgJiYgKGN1cnJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQkvLyBmb3VuZCBpdAotCQkJaWYgKHJvb3QuZXF1YWxzKGN1cnJlbnQpKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgISEhIGZvdW5kOiAiICsgcG9zc2libGUuZ2V0Tm9kZU5hbWUoKSArICIgaW4gc3ViZWxlbWVudCBvZjogIiArIHJvb3QuZ2V0Tm9kZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWN1cnJlbnQgPSBjdXJyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQkvLyBuZXZlciBmb3VuZCBpdAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBtdXN0IGJlIG9uIFVJIHRocmVhZCBiZWNhdXNlIGl0J3Mgb24gYSBTV1Qgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVmcmVzaCBvbjogWyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZpZXdlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCF2aWV3ZXJzW2ldLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQkJdmlld2Vyc1tpXS5yZWZyZXNoKHRydWUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdmlld2Vyc1tpXS5yZWZyZXNoKG5vZGUsIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAhISEgc2tpcHBlZCByZWZyZXNoaW5nIGRpc3Bvc2VkIHZpZXdlcjogIiArIHZpZXdlcnNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBtdXN0IGJlIG9uIFVJIHRocmVhZCBiZWNhdXNlIGl0J3Mgb24gYSBTV1Qgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvVXBkYXRlKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzLCBmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIFN0cmluZ1tdIHByb3BlcnRpZXMpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWZyZXNoIG9uOiBbIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlld2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIXZpZXdlcnNbaV0uZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJdmlld2Vyc1tpXS51cGRhdGUobm9kZSwgcHJvcGVydGllcyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICEhISBza2lwcGVkIHJlZnJlc2hpbmcgZGlzcG9zZWQgdmlld2VyOiAiICsgdmlld2Vyc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWxzbyBzeW5jaHJvbml6ZWQgYmVjYXVzZSBpdCBhY2Nlc3NlcyB0aGUgZlJlZnJlc2hlcyBxdWV1ZQotCSAqIGFuZCBmUmVmcmVzaFZpZXdlcnMgbGlzdAotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbmQgYXJyYXkgb2YgdGhlIGN1cnJlbnRseSByZXF1ZXN0ZWQgTm9kZXMKLQkgKiAgICAgICAgIHRvIHJlZnJlc2ggYW5kIHRoZSB2aWV3ZXJzIGluIHdoaWNoIHRvIHJlZnJlc2ggdGhlbQotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIE9iamVjdFtdIGdldFJlZnJlc2hSZXF1ZXN0cygpIHsKLQkJTm9kZVtdIHRvUmVmcmVzaCA9IChOb2RlW10pIGZSZWZyZXNoZXMudG9BcnJheShuZXcgTm9kZVtmUmVmcmVzaGVzLnNpemUoKV0pOwotCQlmUmVmcmVzaGVzLmNsZWFyKCk7Ci0KLQkJU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMgPSAoU3RydWN0dXJlZFZpZXdlcltdKSBmUmVmcmVzaFZpZXdlcnMudG9BcnJheShuZXcgU3RydWN0dXJlZFZpZXdlcltmUmVmcmVzaFZpZXdlcnMuc2l6ZSgpXSk7Ci0JCWZSZWZyZXNoVmlld2Vycy5jbGVhcigpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0W117dG9SZWZyZXNoLCB2aWV3ZXJzfTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhbHNvIHN5bmNocm9uaXplZCBiZWNhdXNlIGl0IGFjY2Vzc2VzIHRoZSBmVXBkYXRlcyBxdWV1ZQotCSAqIGFuZCBmVXBkYXRlVmlld2VycyBsaXN0Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFuZCBhcnJheSBvZiB0aGUgY3VycmVudGx5IHJlcXVlc3RlZCBOb2RlcwotCSAqICAgICAgICAgdG8gcmVmcmVzaCBhbmQgdGhlIHZpZXdlcnMgaW4gd2hpY2ggdG8gcmVmcmVzaCB0aGVtCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0VXBkYXRlUmVxdWVzdHMoKSB7Ci0JCU5vZGVbXSB0b1VwZGF0ZSA9IChOb2RlW10pIGZVcGRhdGVzLnRvQXJyYXkobmV3IE5vZGVbZlVwZGF0ZXMuc2l6ZSgpXSk7Ci0JCWZVcGRhdGVzLmNsZWFyKCk7Ci0KLQkJU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMgPSAoU3RydWN0dXJlZFZpZXdlcltdKSBmVXBkYXRlVmlld2Vycy50b0FycmF5KG5ldyBTdHJ1Y3R1cmVkVmlld2VyW2ZVcGRhdGVWaWV3ZXJzLnNpemUoKV0pOwotCQlmVXBkYXRlVmlld2Vycy5jbGVhcigpOwotCi0JCVN0cmluZ1tdW10gcHJvcGVydGllcyA9IChTdHJpbmdbXVtdKSBmVXBkYXRlUHJvcGVydGllcy50b0FycmF5KG5ldyBTdHJpbmdbZlVwZGF0ZVByb3BlcnRpZXMuc2l6ZSgpXVtdKTsKLQkJZlVwZGF0ZVByb3BlcnRpZXMuY2xlYXIoKTsKLQotCQlyZXR1cm4gbmV3IE9iamVjdFtde3RvVXBkYXRlLCB2aWV3ZXJzLCBwcm9wZXJ0aWVzfTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgYSByZWZyZXNoIG9uIHRoZSB2aWV3ZXIgb24gdGhlIGdpdmVuIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyLCBOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYWRkUmVmcmVzaFZpZXdlcih2aWV3ZXIpOwotCQlhZGRSZWZyZXNoUmVxdWVzdChub2RlKTsKLQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgYSByZWZyZXNoIG9uIHRoZSB2aWV3ZXIgb24gdGhlIGdpdmVuIG5vZGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsIE5vZGUgbm9kZSwgU3RyaW5nW10gcHJvcGVydGllcykgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlhZGRVcGRhdGVWaWV3ZXIodmlld2VyKTsKLQkJYWRkVXBkYXRlUmVxdWVzdChub2RlLCBwcm9wZXJ0aWVzKTsKLQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJdHJ5IHsKLQkJCXBlcmZvcm1VcGRhdGVzKCk7Ci0JCQkKLQkJCXBlcmZvcm1SZWZyZXNoZXMobW9uaXRvcik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtUmVmcmVzaGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBSZXRyaWV2ZSBCT1RIIHZpZXdlcnMgYW5kIE5vZGVzIG9uIG9uZSBibG9jawotCQlPYmplY3RbXSByZXF1ZXN0cyA9IGdldFJlZnJlc2hSZXF1ZXN0cygpOwotCQlOb2RlW10gbm9kZXMgPSAoTm9kZVtdKSByZXF1ZXN0c1swXTsKLQkJU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMgPSAoU3RydWN0dXJlZFZpZXdlcltdKSByZXF1ZXN0c1sxXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWRvUmVmcmVzaChub2Rlc1tpXSwgdmlld2Vycyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybVVwZGF0ZXMoKSB7Ci0JCS8vIFJldHJpZXZlIEJPVEggdmlld2VycyBhbmQgTm9kZXMgb24gb25lIGJsb2NrCi0JCU9iamVjdFtdIHJlcXVlc3RzID0gZ2V0VXBkYXRlUmVxdWVzdHMoKTsKLQkJTm9kZVtdIG5vZGVzID0gKE5vZGVbXSkgcmVxdWVzdHNbMF07Ci0JCVN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzID0gKFN0cnVjdHVyZWRWaWV3ZXJbXSkgcmVxdWVzdHNbMV07Ci0JCVN0cmluZ1tdW10gcHJvcGVydGllcyA9IChTdHJpbmdbXVtdKSByZXF1ZXN0c1syXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkb1VwZGF0ZSh2aWV3ZXJzLCBub2Rlc1tpXSwgcHJvcGVydGllc1tpXSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9YTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1hNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTgwNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1hNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MTm9kZUFjdGlvbk1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIHsKLQlwdWJsaWMgWE1MTm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihtb2RlbCwgTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShtb2RlbCksIHZpZXdlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmb3JtYXQoTm9kZSBuZXdFbGVtZW50LCBib29sZWFuIGRlZXApIHsKLQkJdHJ5IHsKLQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0JCQlmTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCS8vIGZvcm1hdCBzZWxlY3RlZCBub2RlCi0JCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShuZXdFbGVtZW50KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotCQkJZk1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQlmTW9kZWwgPSBuZXdNb2RlbDsKLQkJc2V0TW9kZWxRdWVyeShNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5ld01vZGVsKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWxRdWVyeShNb2RlbFF1ZXJ5IG5ld01vZGVsUXVlcnkpIHsKLQkJbW9kZWxRdWVyeSA9IG5ld01vZGVsUXVlcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxMTA0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLkNvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLQotLyoqCi0gKiBDb3JyZWN0aW9uIGFzc2lzdGFudCBmb3IgWE1MCi0gKiAKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDIuMCBSQzAgVXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLSAqLwotcHVibGljIGNsYXNzIENvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlclhNTCBleHRlbmRzIENvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlciB7Ci0KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29ycmVjdGlvbkFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlJQ29udGVudEFzc2lzdGFudCBjYSA9IG51bGw7Ci0KLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0KLQkJCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNvcnJlY3Rpb25Qcm9jZXNzb3IgPSBuZXcgQ29ycmVjdGlvblByb2Nlc3NvclhNTChzb3VyY2VWaWV3ZXIpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5UKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04pOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9QSSk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVCk7Ci0JCQl9Ci0JCQljYSA9IGFzc2lzdGFudDsKLQkJfQotCi0JCXJldHVybiBjYTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Qcm9jZXNzb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Qcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlNzNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uUHJvY2Vzc29yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5JUXVpY2tGaXhQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLlN0cnVjdHVyZWRDb3JyZWN0aW9uUHJvY2Vzc29yOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDIuMCBSQzAgVXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLSAqLwotcHVibGljIGNsYXNzIENvcnJlY3Rpb25Qcm9jZXNzb3JYTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElRdWlja0Fzc2lzdFByb2Nlc3NvciBmUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0JcHJvdGVjdGVkIElRdWlja0ZpeFByb2Nlc3NvciBmUXVpY2tGaXhQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgQ29ycmVjdGlvblByb2Nlc3NvclhNTChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlzdXBlcihzb3VyY2VWaWV3ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgZ2V0UXVpY2tBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWlmIChmUXVpY2tBc3Npc3RQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlF1aWNrQXNzaXN0UHJvY2Vzc29yID0gbmV3IFF1aWNrQXNzaXN0UHJvY2Vzc29yWE1MKCk7Ci0JCX0KLQotCQlyZXR1cm4gZlF1aWNrQXNzaXN0UHJvY2Vzc29yOwotCX0KLQotCXByb3RlY3RlZCBJUXVpY2tGaXhQcm9jZXNzb3IgZ2V0UXVpY2tGaXhQcm9jZXNzb3IoKSB7Ci0JCWlmIChmUXVpY2tGaXhQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlF1aWNrRml4UHJvY2Vzc29yID0gbmV3IFF1aWNrRml4UHJvY2Vzc29yWE1MKCk7Ci0JCX0KLQotCQlyZXR1cm4gZlF1aWNrRml4UHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0luc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk0N2VkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0luc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotcHVibGljIGNsYXNzIEluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIgewotCXByaXZhdGUgZmluYWwgTGlzdCBmUmVxdWlyZWRBdHRyczsKLQotCS8qKgotCSAqIEBwYXJhbSByZXF1aXJlZEF0dHJzCi0JICovCi0JcHVibGljIEluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsKExpc3QgcmVxdWlyZWRBdHRycykgewotCQlmUmVxdWlyZWRBdHRycyA9IHJlcXVpcmVkQXR0cnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNhcHBseShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gbm90IGltcGxlbWVudGVkPwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBjaGFyLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaW50IGluZGV4ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMYXN0UmVnaW9uKCk7Ci0JCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCWluZGV4LS07Ci0JCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJfQotCQllbHNlIGlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCWluZGV4ID0gaW5kZXggLSAyOwotCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCX0KLQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlcXVpcmVkQXR0cnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGZSZXF1aXJlZEF0dHJzLmdldChpKTsKLQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyaWJ1dGVOYW1lID0gYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKTsKLQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ckRlY2wuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCWRlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCVN0cmluZyBuYW1lQW5kRGVmYXVsdFZhbHVlID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKChpID09IDApICYmIChsYXN0UmVnaW9uLmdldExlbmd0aCgpID4gbGFzdFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpKSB7Ci0JCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQluYW1lQW5kRGVmYXVsdFZhbHVlICs9IHJlcXVpcmVkQXR0cmlidXRlTmFtZSArICI9XCIiICsgZGVmYXVsdFZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGluZGV4LCBuYW1lQW5kRGVmYXVsdFZhbHVlKSk7Ci0JCQkJLy8gQlVHMzM4MTogTXVsdGlUZXh0RWRpdCBhcHBsaWVzIGFsbCBjaGlsZCBUZXh0RWRpdCdzIGJhc2luZwotCQkJCS8vIG9uIG9mZnNldHMKLQkJCQkvLyBpbiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBmaXJzdCBUZXh0RWRpdCwgbm90IGFmdGVyIGVhY2gKLQkJCQkvLyBjaGlsZCBUZXh0RWRpdC4gVGhlcmVmb3JlLCBkbyBub3QgbmVlZCB0byBhZHZhbmNlIHRoZQotCQkJCS8vIGluZGV4LgotCQkJCS8vIGluZGV4ICs9IG5hbWVBbmREZWZhdWx0VmFsdWUubGVuZ3RoKCk7Ci0JCQl9Ci0JCQltdWx0aVRleHRFZGl0LmFwcGx5KHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nLCBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCB0aGVyZSdzIHJlYXNvbnMgd2h5IHdlIGdldCBzb21lCi0JCQkvLyBoZXJlLgotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLkluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRDb250ZXh0SW5mb3JtYXRpb24oKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLkluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkvLyByZXR1cm4gSmF2YVBsdWdpbkltYWdlcy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfQ09SUkVDVElPTl9MT0NBTCk7Ci0JCXJldHVybiBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FERF9DT1JSRUNUSU9OKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNzZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIsIGJvb2xlYW4gc21hcnRUb2dnbGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiN1bnNlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgdW5zZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiN2YWxpZGF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUHJvYmxlbUlEc1hNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUHJvYmxlbUlEc1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGZhZTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1Byb2JsZW1JRHNYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFByb2JsZW1JRHNYTUwgewotCWludCBBdHRyc0luRW5kVGFnID0gMzsKLQlpbnQgQXR0clZhbHVlTm90UXVvdGVkID0gMTM7Ci0JaW50IEVtcHR5VGFnID0gMTsKLQlpbnQgSW52YWxpZEF0dHJWYWx1ZSA9IDExOwotCWludCBNaXNzaW5nQXR0clZhbHVlID0gNDsKLQlpbnQgTWlzc2luZ0Nsb3NpbmdCcmFja2V0ID0gMTQ7Ci0JaW50IE1pc3NpbmdFbmRUYWcgPSAyOwotCWludCBNaXNzaW5nUmVxdWlyZWRBdHRyID0gMTI7Ci0JaW50IE1pc3NpbmdTdGFydFRhZyA9IDE1OwotCWludCBOYW1lc3BhY2VJblBJID0gODsKLQlpbnQgTm9BdHRyVmFsdWUgPSA1OwotCWludCBTcGFjZXNCZWZvcmVQSSA9IDc7Ci0JaW50IFNwYWNlc0JlZm9yZVRhZ05hbWUgPSA2OwotCWludCBVbmNsYXNzaWZpZWQgPSAwOwotCWludCBVbmtub3duQXR0ciA9IDEwOwotCWludCBVbmtub3duRWxlbWVudCA9IDk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0Fzc2lzdFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUXVpY2tBc3Npc3RQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4ZGI4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0Fzc2lzdFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDIuMCBSQzAgVXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLSAqLwotcHVibGljIGNsYXNzIFF1aWNrQXNzaXN0UHJvY2Vzc29yWE1MIGltcGxlbWVudHMgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29ycmVjdGlvbi5JUXVpY2tBc3Npc3RQcm9jZXNzb3IjY2FuQXNzaXN0KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQXNzaXN0KFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcG9zYWxzCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKEFycmF5TGlzdCBwcm9wb3NhbHMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSAmJiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJSURPTU5vZGUgY3Vyc29yTm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCQkJTGlzdCByZXF1aXJlZEF0dHJzID0gZ2V0UmVxdWlyZWRBdHRycyhjdXJzb3JOb2RlKTsKLQkJCQlpZiAocmVxdWlyZWRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCU5hbWVkTm9kZU1hcCBjdXJyZW50QXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJTGlzdCBpbnNlcnRBdHRycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlpbnNlcnRBdHRycy5hZGRBbGwocmVxdWlyZWRBdHRycyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVkQXR0cnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyTmFtZSA9ICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgcmVxdWlyZWRBdHRycy5nZXQoaSkpLmdldEF0dHJOYW1lKCk7Ci0JCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3VycmVudEF0dHJzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQkJU3RyaW5nIGN1cnJlbnRBdHRyTmFtZSA9IGN1cnJlbnRBdHRycy5pdGVtKGopLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJCWlmIChyZXF1aXJlZEF0dHJOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoY3VycmVudEF0dHJOYW1lKSA9PSAwKSB7Ci0JCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCQkJCWluc2VydEF0dHJzLmFkZChyZXF1aXJlZEF0dHJzLmdldChpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChpbnNlcnRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBJbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbChpbnNlcnRBdHRycykpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3Bvc2FscwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2V0TG9jYWxSZW5hbWVRdWlja0Fzc2lzdFByb3Bvc2FsKEFycmF5TGlzdCBwcm9wb3NhbHMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUgPT0gbnVsbCA/IG51bGwgOiBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZSA9PSBudWxsID8gbnVsbCA6IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaW50IHJlZ2lvblRleHRFbmRPZmZzZXQgPSAwOwotCQlpZiAoKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCXJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlyZWdpb25UZXh0RW5kT2Zmc2V0ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgJiYgZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCXJlZ2lvbiA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJcmVnaW9uVGV4dEVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQotCQlpZiAoKHJlZ2lvbiAhPSBudWxsKSAmJiAoKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8IChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpICYmIChvZmZzZXQgPD0gcmVnaW9uVGV4dEVuZE9mZnNldCkpIHsKLQkJCXByb3Bvc2Fscy5hZGQobmV3IFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoKERvY3VtZW50KSBub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb3JyZWN0aW9uLklRdWlja0Fzc2lzdFByb2Nlc3NvciNnZXRQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscyhTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlnZXRMb2NhbFJlbmFtZVF1aWNrQXNzaXN0UHJvcG9zYWwocHJvcG9zYWxzLCB2aWV3ZXIsIG9mZnNldCk7Ci0JCWdldFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsKHByb3Bvc2Fscywgdmlld2VyLCBvZmZzZXQpOwotCQlnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByb3Bvc2Fscywgdmlld2VyLCBvZmZzZXQpOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWRBdHRycyhOb2RlIG5vZGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gZ2V0TW9kZWxRdWVyeShub2RlKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyTWFwKTsKLQkJCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudClub2RlLCBlbGVtZW50RGVjbCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0ck1hcCA9IGFsbEF0dHJpYnV0ZXM7Ci0JCQkJCi0JCQkJSXRlcmF0b3IgaXQgPSBhdHRyTWFwLml0ZXJhdG9yKCk7Ci0JCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWF0dHIgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaXQubmV4dCgpOwotCQkJCQlpZiAoYXR0ci5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJCXJlc3VsdC5hZGQoYXR0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIG9mZnNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdldFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsKEFycmF5TGlzdCBwcm9wb3NhbHMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJcHJvcG9zYWxzLmFkZChuZXcgU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUXVpY2tGaXhQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlYWVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uSVF1aWNrRml4UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBjbGFzcyBRdWlja0ZpeFByb2Nlc3NvclhNTCBpbXBsZW1lbnRzIElRdWlja0ZpeFByb2Nlc3NvciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29ycmVjdGlvbi5JUXVpY2tGaXhQcm9jZXNzb3IjY2FuRml4KGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaXgoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRlbXBBbm5vdGF0aW9uID0gKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm90YXRpb247Ci0JCQlpbnQgcHJvYmxlbUlEID0gdGVtcEFubm90YXRpb24uZ2V0UHJvYmxlbUlEKCk7Ci0JCQlzd2l0Y2ggKHByb2JsZW1JRCkgewotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5FbXB0eVRhZyA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyc0luRW5kVGFnIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0F0dHJWYWx1ZSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlVGFnTmFtZSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25FbGVtZW50IDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkF0dHIgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5JbnZhbGlkQXR0clZhbHVlIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ1JlcXVpcmVkQXR0ciA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkF0dHJWYWx1ZU5vdFF1b3RlZCA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCA6Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gcmV0dXJuCi0JCS8vIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fQ0hBTkdFKTsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ09SUkVDVElPTl9DSEFOR0UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb3JyZWN0aW9uLklRdWlja0ZpeFByb2Nlc3NvciNnZXRQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbikKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscyhBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGVtcEFubm90YXRpb24gPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgYW5ub3RhdGlvbjsKLQkJCWludCBwcm9ibGVtSUQgPSB0ZW1wQW5ub3RhdGlvbi5nZXRQcm9ibGVtSUQoKTsKLQkJCXN3aXRjaCAocHJvYmxlbUlEKSB7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkVtcHR5VGFnIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzAsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJCQlTdHJpbmcgdGFnTmFtZSA9IChTdHJpbmcpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzBdOwotCQkJCQlTdHJpbmcgdGFnQ2xvc2UgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVsxXTsKLQkJCQkJaW50IHRhZ0Nsb3NlT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVsyXSkuaW50VmFsdWUoKTsKLQkJCQkJaW50IHN0YXJ0VGFnRW5kT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVszXSkuaW50VmFsdWUoKTsKLQkJCQkJaW50IGZpcnN0Q2hpbGRTdGFydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbNF0pLmludFZhbHVlKCk7Ci0JCQkJCWludCBlbmRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzVdKS5pbnRWYWx1ZSgpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwodGFnQ2xvc2UsIHRhZ0Nsb3NlT2Zmc2V0LCAwLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzEsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgc3RhcnRUYWdFbmRPZmZzZXQgLSB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzIsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCI8LyIgKyB0YWdOYW1lICsgIj4iLCBmaXJzdENoaWxkU3RhcnRPZmZzZXQsIDAsIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPC8iICsgdGFnTmFtZSArICI+IiwgZW5kT2Zmc2V0LCAwLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzQsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuQXR0cnNJbkVuZFRhZyA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF81LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nQXR0clZhbHVlIDoKLQkJCQkJU3RyaW5nIGRlZmF1bHRBdHRyVmFsdWUgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVswXTsKLQkJCQkJaW50IGluc2VydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMV0pLmludFZhbHVlKCk7Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgZGVmYXVsdEF0dHJWYWx1ZSArICJcIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCkgKyB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpICsgaW5zZXJ0T2Zmc2V0LCAwLCBkZWZhdWx0QXR0clZhbHVlLmxlbmd0aCgpICsgMiwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF82LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzcsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCQkJZGVmYXVsdEF0dHJWYWx1ZSA9IChTdHJpbmcpIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCk7Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPVwiIiArIGRlZmF1bHRBdHRyVmFsdWUgKyAiXCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpICsgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZGVmYXVsdEF0dHJWYWx1ZS5sZW5ndGgoKSArIDMsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNiwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF83LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVUYWdOYW1lIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzgsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzksIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5hbWVzcGFjZUluUEkgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTAsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25FbGVtZW50IDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsKHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCksIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTEpKTsKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25BdHRyIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzcsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkludmFsaWRBdHRyVmFsdWUgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTIsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdSZXF1aXJlZEF0dHIgOgotCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyID0gKFN0cmluZykgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMF07Ci0JCQkJCWluc2VydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMV0pLmludFZhbHVlKCk7Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbChyZXF1aXJlZEF0dHIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCkgKyBpbnNlcnRPZmZzZXQsIDAsIHJlcXVpcmVkQXR0ci5sZW5ndGgoKSwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkF0dHJWYWx1ZU5vdFF1b3RlZCA6Ci0JCQkJCVN0cmluZyBhdHRyVmFsdWUgPSAoU3RyaW5nKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIGF0dHJWYWx1ZSArICJcIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIGF0dHJWYWx1ZS5sZW5ndGgoKSArIDIsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTQsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0Nsb3NpbmdCcmFja2V0IDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCI+IiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSArIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIDEsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTUsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1JlbW92ZVVua25vd25FbGVtZW50UXVpY2tGaXhQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4N2EyYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIgewotCXByaXZhdGUgT2JqZWN0IGZBZGRpdGlvbmFsRml4SW5mbyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlTdHJpbmc7Ci0JcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0JcHJpdmF0ZSBQb2ludCBmU2VsZWN0aW9uOyAvLyBpbml0aWFsaXplZCBieSBhcHBseSgpCi0KLQlwdWJsaWMgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsKE9iamVjdCBhZGRpdGlvbmFsRml4SW5mbywgSW1hZ2UgaW1hZ2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0JCWZBZGRpdGlvbmFsRml4SW5mbyA9IGFkZGl0aW9uYWxGaXhJbmZvOwotCQlmSW1hZ2UgPSBpbWFnZTsKLQkJZkRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIG5vdCBpbXBsZW1lbnRlZD8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNhcHBseShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgY2hhciwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLQkJaW50IHN0YXJ0VGFnT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzBdKS5pbnRWYWx1ZSgpOwotCQlpbnQgc3RhcnRUYWdMZW5ndGggPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMV0pLmludFZhbHVlKCk7Ci0JCWludCBlbmRUYWdPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMl0pLmludFZhbHVlKCk7Ci0JCWludCBlbmRUYWdMZW5ndGggPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbM10pLmludFZhbHVlKCk7Ci0KLQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJaWYgKGVuZFRhZ09mZnNldCAhPSAtMSkgewotCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgRGVsZXRlRWRpdChlbmRUYWdPZmZzZXQsIGVuZFRhZ0xlbmd0aCkpOwotCQkJZlNlbGVjdGlvbiA9IG5ldyBQb2ludChlbmRUYWdPZmZzZXQsIDApOwotCQl9Ci0JCWlmIChzdGFydFRhZ09mZnNldCAhPSAtMSkgewotCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgRGVsZXRlRWRpdChzdGFydFRhZ09mZnNldCwgc3RhcnRUYWdMZW5ndGgpKTsKLQkJCWZTZWxlY3Rpb24gPSBuZXcgUG9pbnQoc3RhcnRUYWdPZmZzZXQsIDApOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCW11bHRpVGV4dEVkaXQuYXBwbHkodmlld2VyLmdldERvY3VtZW50KCkpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3MgZmluZCByZWFzb25zIG5vdCB0by4KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbnMgbm90IHRvLgotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlpZiAoZkRpc3BsYXlTdHJpbmcgPT0gbnVsbCkgewotCQkJZkRpc3BsYXlTdHJpbmcgPSBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzExOwotCQl9Ci0KLQkJcmV0dXJuIGZEaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGZJbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gZlNlbGVjdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNzZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIsIGJvb2xlYW4gc21hcnRUb2dnbGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiN1bnNlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgdW5zZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiN2YWxpZGF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTViMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkUG9zaXRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IubGluay5FZGl0b3JMaW5rZWRNb2RlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotcHVibGljIGNsYXNzIFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsLCBJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiB7Ci0JcHJvdGVjdGVkIElSZWdpb24gZlNlbGVjdGVkUmVnaW9uOyAvLyBpbml0aWFsaXplZCBieSBhcHBseSgpCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBjaGFyLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJTGlua2VkUG9zaXRpb25Hcm91cCBncm91cCA9IG5ldyBMaW5rZWRQb3NpdGlvbkdyb3VwKCk7Ci0JCXRyeSB7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSA/IG51bGwgOiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgKyByZWdpb24uZ2V0U3RhcnQoKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSwgMCkpOwotCi0JCQkJCWlmICgocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgJiYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCQkJCXJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCWdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFN0YXJ0KCksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIDEpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlyZWdpb24gPSAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpID8gbnVsbCA6IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWlmICgocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgJiYgKG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSkgewotCQkJCQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnTmFtZVJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpICsgc3RhcnRUYWdOYW1lUmVnaW9uLmdldFN0YXJ0KCksIHN0YXJ0VGFnTmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIDApKTsKLQkJCQkJCQkJZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpLCAxKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpLCAwKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUT0RPIENvbXBsZXRpb25Qcm9wb3NhbFBvcHVwI2luc2VydFByb3Bvc2FsKCkgY2FsbHMKLQkJCQkvLyBJUmV3cml0ZVRhcmdldC5iZWdpbkNvbXBvdW5kQ2hhbmdlKCkKLQkJCQkvLyB3aGljaCBkaXNhYmxlcyByZWRyYXcgaW4gSVRleHRWaWV3ZXIuIFdvcmthcm91bmQgZm9yIG5vdy4KLQkJCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLnNldFJlZHJhdyh0cnVlKTsKLQkJCX0KLQotCQkJTGlua2VkTW9kZU1vZGVsIGxpbmtlZE1vZGVNb2RlbCA9IG5ldyBMaW5rZWRNb2RlTW9kZWwoKTsKLQkJCWxpbmtlZE1vZGVNb2RlbC5hZGRHcm91cChncm91cCk7Ci0JCQlsaW5rZWRNb2RlTW9kZWwuZm9yY2VJbnN0YWxsKCk7Ci0KLQkJCUxpbmtlZE1vZGVVSSB1aSA9IG5ldyBFZGl0b3JMaW5rZWRNb2RlVUkobGlua2VkTW9kZU1vZGVsLCB2aWV3ZXIpOwotCQkJdWkuc2V0RXhpdFBvc2l0aW9uKHZpZXdlciwgb2Zmc2V0LCAwLCBMaW5rZWRQb3NpdGlvbkdyb3VwLk5PX1NUT1ApOwotCQkJdWkuZW50ZXIoKTsKLQotCQkJZlNlbGVjdGVkUmVnaW9uID0gdWkuZ2V0U2VsZWN0ZWRSZWdpb24oKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRDb250ZXh0SW5mb3JtYXRpb24oKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIHJldHVybiBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0xPQ0FMKTsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfTE9DQUxfVkFSSUFCTEUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoZlNlbGVjdGVkUmVnaW9uLmdldE9mZnNldCgpLCBmU2VsZWN0ZWRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3NlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlciwgYm9vbGVhbiBzbWFydFRvZ2dsZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3Vuc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFmZmM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbCBleHRlbmRzIFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGNoYXIsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgc3RhcnRUYWdPZmZzZXQgPSBvZmZzZXQ7Ci0JCQlpbnQgZW5kVGFnT2Zmc2V0ID0gb2Zmc2V0ICsgdmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKS55OwotCi0JCQkvLyBzdXJyb3VuZCB0aGUgbm9kZSBpZiBubyBzZWxlY3Rpb24KLQkJCWlmIChzdGFydFRhZ09mZnNldCA9PSBlbmRUYWdPZmZzZXQpIHsKLQkJCQlJRE9NTm9kZSBjdXJzb3JOb2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJCQkvLyB1c2UgcGFyZW50IG5vZGUgaWYgdGV4dCBub2RlIGlzIGVtcHR5Ci0JCQkJaWYgKChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCQljdXJzb3JOb2RlID0gKElET01Ob2RlKSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0KLQkJCQlzdGFydFRhZ09mZnNldCA9IGN1cnNvck5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQllbmRUYWdPZmZzZXQgPSBjdXJzb3JOb2RlLmdldEVuZE9mZnNldCgpOwotCQkJfQotCi0JCQkvLyBpbnNlcnQgbmV3IGVsZW1lbnQKLQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQkvLyBlbGVtZW50IHRhZyBuYW1lIGNhbm5vdCBiZSBEQkNTLCBkbyBub3QgdHJhbnNsYXRlICI8ZWxlbWVudD4iCi0JCQkvLyBhbmQgIjwvZWxlbWVudD4iCi0JCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KHN0YXJ0VGFnT2Zmc2V0LCAiPGVsZW1lbnQ+IikpOyAvLyROT04tTkxTLTEkCi0JCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGVuZFRhZ09mZnNldCwgIjwvZWxlbWVudD4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW11bHRpVGV4dEVkaXQuYXBwbHkodmlld2VyLmdldERvY3VtZW50KCkpOwotCi0JCQkvLyBnZXQgbmV3IGVsZW1lbnQgbm9kZQotCQkJSURPTU5vZGUgbmV3RWxlbWVudE5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBzdGFydFRhZ09mZnNldCk7Ci0KLQkJCS8vIGZvcm1hdCBuZXcgZWxlbWVudAotCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkJZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUobmV3RWxlbWVudE5vZGUpOwotCi0JCQkvLyByZW5hbWUgbmV3IGVsZW1lbnQKLQkJCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBuZXdFbGVtZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgMSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbF8wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbF8xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fTE9DQUwpOwotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfQ09SUkVDVElPTik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vWE1MUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1hNTFF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDllOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vWE1MUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhNTFF1aWNrQXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKLQotCXB1YmxpYyBib29sZWFuIGNhbkFzc2lzdChJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaXgoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVRdWlja0Fzc2lzdFByb3Bvc2FscyhJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCkgewotCQlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlnZXRMb2NhbFJlbmFtZVF1aWNrQXNzaXN0UHJvcG9zYWwocHJvcG9zYWxzLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRTb3VyY2VWaWV3ZXIoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCkpOwotCQlnZXRTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbChwcm9wb3NhbHMsIGludm9jYXRpb25Db250ZXh0LmdldFNvdXJjZVZpZXdlcigpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSk7Ci0JCWdldEluc2VydFJlcXVpcmVkQXR0cnMocHJvcG9zYWxzLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRTb3VyY2VWaWV3ZXIoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKExpc3QgcHJvcG9zYWxzLCBJU291cmNlVmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQlJRE9NTm9kZSBjdXJzb3JOb2RlID0gKElET01Ob2RlKSBnZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQkJCUxpc3QgcmVxdWlyZWRBdHRycyA9IGdldFJlcXVpcmVkQXR0cnMoY3Vyc29yTm9kZSk7Ci0JCQkJaWYgKHJlcXVpcmVkQXR0cnMuc2l6ZSgpID4gMCkgewotCQkJCQlOYW1lZE5vZGVNYXAgY3VycmVudEF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCUxpc3QgaW5zZXJ0QXR0cnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJaW5zZXJ0QXR0cnMuYWRkQWxsKHJlcXVpcmVkQXR0cnMpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEF0dHJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0ck5hbWUgPSAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJlcXVpcmVkQXR0cnMuZ2V0KGkpKS5nZXRBdHRyTmFtZSgpOwotCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJCVN0cmluZyBjdXJyZW50QXR0ck5hbWUgPSBjdXJyZW50QXR0cnMuaXRlbShqKS5nZXROb2RlTmFtZSgpOwotCQkJCQkJCQlpZiAocmVxdWlyZWRBdHRyTmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKGN1cnJlbnRBdHRyTmFtZSkgPT0gMCkgewotCQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFmb3VuZCkgewotCQkJCQkJCQlpbnNlcnRBdHRycy5hZGQocmVxdWlyZWRBdHRycy5nZXQoaSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoaW5zZXJ0QXR0cnMuc2l6ZSgpID4gMCkgewotCQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWwoaW5zZXJ0QXR0cnMpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRMb2NhbFJlbmFtZVF1aWNrQXNzaXN0UHJvcG9zYWwoTGlzdCBwcm9wb3NhbHMsIElTb3VyY2VWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlID09IG51bGwgPyBudWxsIDogbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUgPT0gbnVsbCA/IG51bGwgOiBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWludCByZWdpb25UZXh0RW5kT2Zmc2V0ID0gMDsKLQkJaWYgKChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSAmJiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQlyZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJcmVnaW9uVGV4dEVuZE9mZnNldCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICgoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpICYmIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQlyZWdpb24gPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCXJlZ2lvblRleHRFbmRPZmZzZXQgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pOwotCQl9Ci0KLQkJaWYgKChyZWdpb24gIT0gbnVsbCkgJiYgKChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB8fCAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSAmJiAob2Zmc2V0IDw9IHJlZ2lvblRleHRFbmRPZmZzZXQpKSB7Ci0JCQlwcm9wb3NhbHMuYWRkKG5ldyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoRG9jdW1lbnQpIG5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJlcXVpcmVkQXR0cnMoTm9kZSBub2RlKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IGdldE1vZGVsUXVlcnkobm9kZSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJCUNNTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoYXR0ck1hcCk7Ci0JCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBub2Rlcy5zaXplKCk7IGsrKykgewotCQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQkJYWxsQXR0cmlidXRlcy5wdXQoY21ub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlhdHRyTWFwID0gYWxsQXR0cmlidXRlczsKLQkJCQkKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsKExpc3QgcHJvcG9zYWxzLCBJU291cmNlVmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlwcm9wb3NhbHMuYWRkKG5ldyBTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsb3Nlc3QgSW5kZXhlZFJlZ2lvbiBmb3IgdGhlIG9mZnNldCBhbmQgdmlld2VyIGFsbG93aW5nCi0JICogZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gdmlld2VyIG9mZnNldHMgYW5kIG1vZGVsIHBvc2l0aW9ucy4gbm90ZTogdGhpcwotCSAqIG1ldGhvZCByZXR1cm5zIGFuIEluZGV4ZWRSZWdpb24gZm9yIHJlYWQgb25seQotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRPZmZzZXQKLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb21wbGV0aW9ucyBzaG91bGQKLQkgKiAgICAgICAgICAgIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBJbmRleGVkUmVnaW9uCi0JICovCi0JcHJpdmF0ZSBJbmRleGVkUmVnaW9uIGdldE5vZGVBdChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQkvLyBjb3BpZWQgZnJvbSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KCkKLQkJaWYgKHZpZXdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBub2RlID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtbSA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAobW0gIT0gbnVsbCkKLQkJCW1vZGVsID0gbW0uZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodmlld2VyLmdldERvY3VtZW50KCkpOwotCQl0cnkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlpbnQgbGFzdE9mZnNldCA9IGRvY3VtZW50T2Zmc2V0OwotCQkJCW5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50T2Zmc2V0KTsKLQkJCQl3aGlsZSAobm9kZSA9PSBudWxsICYmIGxhc3RPZmZzZXQgPj0gMCkgewotCQkJCQlsYXN0T2Zmc2V0LS07Ci0JCQkJCW5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRBdHRyaWJ1dGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRBdHRyaWJ1dGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk1YWY4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0QXR0cmlidXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0QXR0cmlidXRlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBBdHRyIGF0dHJpYnV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7Ci0JcHJvdGVjdGVkIFRleHQgYXR0cmlidXRlTmFtZUZpZWxkOwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0JcHJvdGVjdGVkIFRleHQgYXR0cmlidXRlVmFsdWVGaWVsZDsKLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgRWxlbWVudCBvd25lckVsZW1lbnQ7Ci0KLQlwdWJsaWMgRWRpdEF0dHJpYnV0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRWxlbWVudCBvd25lckVsZW1lbnQsIEF0dHIgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7Ci0JCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlhdHRyaWJ1dGVOYW1lID0gZ2V0TW9kZWxWYWx1ZShhdHRyaWJ1dGVOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJCWF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWVGaWVsZC5nZXRUZXh0KCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJYXR0cmlidXRlTmFtZUZpZWxkLmZvcmNlRm9jdXMoKTsKLQkJYXR0cmlidXRlTmFtZUZpZWxkLnNlbGVjdEFsbCgpOwotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQXJlYSwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfQVRUUklCVVRFX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vCi0JCS8vIFN0eWxlIGNvbnZlbmllbmNlIGNvbnN0YW50cwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgYXR0cmlidXRlTmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdHRyaWJ1dGVOYW1lTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FX0NPTE9OKTsKLQotCQlhdHRyaWJ1dGVOYW1lRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQlhdHRyaWJ1dGVOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShhdHRyaWJ1dGUgIT0gbnVsbCA/IGF0dHJpYnV0ZS5nZXROYW1lKCkgOiAiIikpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCQlMYWJlbCBhdHRyaWJ1dGVWYWx1ZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdHRyaWJ1dGVWYWx1ZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfVkFMVUVfQ09MT04pOwotCi0JCVN0cmluZyB2YWx1ZSA9IGF0dHJpYnV0ZSAhPSBudWxsID8gYXR0cmlidXRlLmdldFZhbHVlKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgc3R5bGUgPSBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUjsKLQkJaWYgKHZhbHVlLmluZGV4T2YoIlxuIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGUgPSBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMOwotCQl9Ci0KLQkJYXR0cmlidXRlVmFsdWVGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgc3R5bGUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAzMDA7Ci0JCWF0dHJpYnV0ZVZhbHVlRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWF0dHJpYnV0ZVZhbHVlRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoYXR0cmlidXRlICE9IG51bGwgPyBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSA6ICIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBlcnJvciBtZXNzYWdlCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyMDA7Ci0JCWdkLmhlaWdodEhpbnQgPSBNYXRoLm1heCgzMCwgZXJyb3JNZXNzYWdlTGFiZWwuY29tcHV0ZVNpemUoMCwgMCwgZmFsc2UpLnkgKiAyKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgIT0gbnVsbCA/IHN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2RlbFZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmICgoc3RyaW5nICE9IG51bGwpICYmIChzdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLQkJCXJlc3VsdCA9IHN0cmluZzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZU5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCUF0dHIgbWF0Y2hpbmdBdHRyaWJ1dGUgPSBvd25lckVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJCWlmICgobWF0Y2hpbmdBdHRyaWJ1dGUgIT0gbnVsbCkgJiYgKG1hdGNoaW5nQXR0cmlidXRlICE9IGF0dHJpYnV0ZSkpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBYTUxVSU1lc3NhZ2VzLl9FUlJPUl9YTUxfQVRUUklCVVRFX0FMUkVBRFlfRVhJU1RTOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gVE9ETyBnZXQgY2hlY2tOYW1lIGZyb20gTW9kZWwKLQkJCQkvLyBlcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTE5hbWUobmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQllcnJvck1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQllcnJvck1lc3NhZ2VMYWJlbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdERvY3R5cGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXREb2N0eXBlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMDcxYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdERvY3R5cGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoJICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuWE1MQ29tbW9uVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLQotcHVibGljIGNsYXNzIEVkaXREb2N0eXBlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wdXRlU3lzdGVtSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGRvY3R5cGVEYXRhOwotCXByb3RlY3RlZCBib29sZWFuIGVycm9yQ2hlY2tpbmc7Ci0JcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaWNJZEJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgVGV4dCBwdWJsaWNJZEZpZWxkOwotCXByb3RlY3RlZCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uOwotCXByb3RlY3RlZCBUZXh0IHJvb3RFbGVtZW50TmFtZUZpZWxkOwotCXByb3RlY3RlZCBCdXR0b24gc3lzdGVtSWRCcm93c2VCdXR0b247Ci0JcHJvdGVjdGVkIFRleHQgc3lzdGVtSWRGaWVsZDsKLQotCXB1YmxpYyBFZGl0RG9jdHlwZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZG9jdHlwZS5nZXROYW1lKCksIGRvY3R5cGUuZ2V0UHVibGljSWQoKSwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdERvY3R5cGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCWRvY3R5cGVEYXRhID0gbmV3IFN0cmluZ1szXTsKLQkJZG9jdHlwZURhdGFbMF0gPSBuYW1lOwotCQlkb2N0eXBlRGF0YVsxXSA9IHB1YmxpY0lkOwotCQlkb2N0eXBlRGF0YVsyXSA9IHN5c3RlbUlkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWRvY3R5cGVEYXRhWzBdID0gZ2V0TW9kZWxWYWx1ZShyb290RWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCQlkb2N0eXBlRGF0YVsxXSA9IGdldE1vZGVsVmFsdWUocHVibGljSWRGaWVsZC5nZXRUZXh0KCkpOwotCQlkb2N0eXBlRGF0YVsyXSA9IGdldE1vZGVsVmFsdWUoc3lzdGVtSWRGaWVsZC5nZXRUZXh0KCkpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0NvbnRyb2wgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQ29udHJvbCwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfRE9DVFlQRV9ESUFMT0cpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0NvbnRyb2wsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0KLQkJTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gc3lzdGVtSWRGaWVsZCkgewotCQkJCQljb21wdXRlU3lzdGVtSWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gcm93IDEKLQkJLy8KLQkJTGFiZWwgcm9vdEVsZW1lbnROYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJvb3RFbGVtZW50TmFtZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UX05BTUVfQ09MT04pOwotCi0JCXJvb3RFbGVtZW50TmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocm9vdEVsZW1lbnROYW1lRmllbGQsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0RPQ1RZUEVfUk9PVCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDIwMDsKLQkJcm9vdEVsZW1lbnROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJvb3RFbGVtZW50TmFtZUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGRvY3R5cGVEYXRhWzBdKSk7Ci0JCXJvb3RFbGVtZW50TmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBwbGFjZUhvbGRlciA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcGxhY2VIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJLy8gcm93IDIKLQkJLy8KLQkJTGFiZWwgcHVibGljSWRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHVibGljSWRMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BVQkxJQ19JRF9DT0xPTik7Ci0KLQkJcHVibGljSWRGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHB1YmxpY0lkRmllbGQsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0RPQ1RZUEVfUFVCTElDKTsKLQkJcHVibGljSWRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHVibGljSWRGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShkb2N0eXBlRGF0YVsxXSkpOwotCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRWRpdEVudGl0eUhlbHBlciBoZWxwZXIgPSBuZXcgRWRpdEVudGl0eUhlbHBlcigpOwotCQkJCWlmIChlLndpZGdldCA9PSBwdWJsaWNJZEJyb3dzZUJ1dHRvbikgewotCQkJCQloZWxwZXIucGVyZm9ybUJyb3dzZUZvclB1YmxpY0lkKGdldFNoZWxsKCksIHB1YmxpY0lkRmllbGQsIGNvbXB1dGVTeXN0ZW1JZCA/IHN5c3RlbUlkRmllbGQgOiBudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gc3lzdGVtSWRCcm93c2VCdXR0b24pIHsKLQkJCQkJaGVscGVyLnBlcmZvcm1Ccm93c2VGb3JTeXN0ZW1JZChnZXRTaGVsbCgpLCBzeXN0ZW1JZEZpZWxkLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHVibGljSWRCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwdWJsaWNJZEJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0JST1dTRSk7Ci0JCXB1YmxpY0lkQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyByb3cgMwotCQlMYWJlbCBzeXN0ZW1JZExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzeXN0ZW1JZExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU1lTVEVNX0lEX0NPTE9OKTsKLQotCQlzeXN0ZW1JZEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3lzdGVtSWRGaWVsZCwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfRE9DVFlQRV9TWVNURU0pOwotCQlzeXN0ZW1JZEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGRvY3R5cGVEYXRhWzJdKSk7Ci0JCXN5c3RlbUlkRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0KLQkJc3lzdGVtSWRCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzeXN0ZW1JZEJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0JST1dTRSk7Ci0JCXN5c3RlbUlkQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBlcnJvciBtZXNzYWdlCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0NvbnRyb2wsIFNXVC5OT05FKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gZGlhbG9nQ29udHJvbDsKLQl9Ci0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkvLyBsYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgIT0gbnVsbCA/IHN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RXJyb3JDaGVja2luZygpIHsKLQkJcmV0dXJuIGVycm9yQ2hlY2tpbmc7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsVmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKChzdHJpbmcgIT0gbnVsbCkgJiYgKHN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJcmVzdWx0ID0gc3RyaW5nOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZG9jdHlwZURhdGFbMF07Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIGRvY3R5cGVEYXRhWzFdOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiBkb2N0eXBlRGF0YVsyXTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wdXRlU3lzdGVtSWQoYm9vbGVhbiBjb21wdXRlU3lzdGVtSWQpIHsKLQkJdGhpcy5jb21wdXRlU3lzdGVtSWQgPSBjb21wdXRlU3lzdGVtSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JDaGVja2luZyhib29sZWFuIGVycm9yQ2hlY2tpbmcpIHsKLQkJdGhpcy5lcnJvckNoZWNraW5nID0gZXJyb3JDaGVja2luZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvY2F0aW9uKElQYXRoIHBhdGgpIHsKLQkJcmVzb3VyY2VMb2NhdGlvbiA9IHBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQlpZiAoZXJyb3JDaGVja2luZykgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQlpZiAoZ2V0TW9kZWxWYWx1ZShzeXN0ZW1JZEZpZWxkLmdldFRleHQoKSkgPT0gbnVsbCkgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfU1lTVEVNX0lEX01VU1RfQkVfU1BFQ0lGSUVEOwotCQkJfQotCQkJZWxzZSBpZiAoZ2V0TW9kZWxWYWx1ZShyb290RWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkpID09IG51bGwpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX1JPT1RfRUxFTUVOVF9NVVNUX0JFX1NQRUNJRklFRDsKLQkJCX0KLQotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RWxlbWVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEVsZW1lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhZDM4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RWxlbWVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEVkaXRFbGVtZW50RGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50TmFtZTsKLQlwcm90ZWN0ZWQgVGV4dCBlbGVtZW50TmFtZUZpZWxkOwotCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JcHVibGljIEVkaXRFbGVtZW50RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQllbGVtZW50TmFtZSA9IGdldE1vZGVsVmFsdWUoZWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJZWxlbWVudE5hbWVGaWVsZC5mb3JjZUZvY3VzKCk7Ci0JCWVsZW1lbnROYW1lRmllbGQuc2VsZWN0QWxsKCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2dBcmVhLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9FTEVNRU5UX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgZWxlbWVudE5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZWxlbWVudE5hbWVMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0VMRU1FTlRfTkFNRSk7Ci0KLQkJZWxlbWVudE5hbWVGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyMDA7Ci0JCWVsZW1lbnROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWVsZW1lbnROYW1lRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC5nZXROb2RlTmFtZSgpIDogIiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbGVtZW50TmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIGVycm9yIG1lc3NhZ2UKLQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5lcnJvcl9tZXNzYWdlX2dvZXNfaGVyZSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsVmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKChzdHJpbmcgIT0gbnVsbCkgJiYgKHN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJcmVzdWx0ID0gc3RyaW5nOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gZWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCS8vIFN0cmluZyBuYW1lID0gZWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIFRPRE8gdXNlIGNoZWNrTmFtZSBmcm9tIG1vZGVsIGxldmVsCi0JCQkvLyBlcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTE5hbWUobmFtZSk7Ci0JCQlpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKSkgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuX1VJX0lOVkFMSURfTkFNRTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbnRpdHlIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbnRpdHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlYjY0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RW50aXR5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRWRpdEVudGl0eUhlbHBlciB7Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQnJvd3NlRm9yUHVibGljSWQoU2hlbGwgcGFyZW50U2hlbGwsIFRleHQgcHVibGljSWRGaWVsZCkgewotCQlwZXJmb3JtQnJvd3NlRm9yUHVibGljSWQocGFyZW50U2hlbGwsIHB1YmxpY0lkRmllbGQsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1Ccm93c2VGb3JQdWJsaWNJZChTaGVsbCBwYXJlbnRTaGVsbCwgVGV4dCBwdWJsaWNJZEZpZWxkLCBUZXh0IHN5c3RlbUlkRmllbGQpIHsKLQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsiZHRkIiwgInR4dCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cocGFyZW50U2hlbGwsIGV4dGVuc2lvbnMpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX1hNTF9DQVRBTE9HX0VOVFJZKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCVN0cmluZyBpZCA9IGRpYWxvZy5nZXRJZCgpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlwdWJsaWNJZEZpZWxkLnNldFRleHQoaWQpOwotCQkJCWlmICgoc3lzdGVtSWRGaWVsZCAhPSBudWxsKSAmJiAoZGlhbG9nLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkpIHsKLQkJCQkJc3lzdGVtSWRGaWVsZC5zZXRUZXh0KGRpYWxvZy5nZXRTeXN0ZW1JZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQnJvd3NlRm9yU3lzdGVtSWQoU2hlbGwgcGFyZW50U2hlbGwsIFRleHQgc3lzdGVtSWRGaWVsZCwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikgewotCQlTdHJpbmdbXSBleHRlbnNpb25zID0geyJkdGQifTsgLy8kTk9OLU5MUy0xJAotCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyhwYXJlbnRTaGVsbCwgZXh0ZW5zaW9ucywgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9TUEVDSUZZX1NZU1RFTV9JRCk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlTdHJpbmcgaWQgPSBkaWFsb2cuZ2V0SWQoKTsKLQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQoaWQpOwotCQkJfQotCQkJZWxzZSBpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQkJaWYgKHJlc291cmNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQl1cmkgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZmlsZS5nZXRMb2NhdGlvbigpLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXVyaSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXN5c3RlbUlkRmllbGQuc2V0VGV4dCh1cmkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXROYW1lc3BhY2VJbmZvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NGFjNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwdWJsaWMgc3RhdGljIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlLCBOYW1lc3BhY2VJbmZvIGluZm8sIElQYXRoIHJlc291cmNlTG9jYXRpb24pIHsKLQkJRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nKHNoZWxsLCBpbmZvKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0UmVzb3VyY2VMb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQlwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mbyBmSW5mbzsKLQlwcm90ZWN0ZWQgVGV4dCBsb2NhdGlvbkhpbnRGaWVsZDsKLQotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIFRleHQgcHJlZml4RmllbGQ7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFRleHQgdXJpRmllbGQ7Ci0KLQlwdWJsaWMgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE5hbWVzcGFjZUluZm8gaW5mbykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuZkluZm8gPSBpbmZvOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlmSW5mby51cmkgPSB1cmlGaWVsZC5nZXRUZXh0KCk7Ci0JCQlmSW5mby5wcmVmaXggPSBwcmVmaXhGaWVsZC5nZXRUZXh0KCk7Ci0JCQlmSW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnRGaWVsZC5nZXRUZXh0KCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCQl1cGRhdGVXaWRnZXRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dzdWJBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ3N1YkFyZWEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX05BTUVTUEFDRV9ESUFMT0cpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ3N1YkFyZWEsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXVwZGF0ZVdpZGdldHMoKTsKLQkJCX0KLQkJfTsKLQotCi0JCS8vIHJvdyAxCi0JCS8vCi0JCUxhYmVsIHVyaUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmlMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FX0NPTE9OKTsKLQotCQl1cmlGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdXJpRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXVyaUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGZJbmZvLnVyaSkpOwotCQl1cmlGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCXVyaUZpZWxkLnNldEVuYWJsZWQoZkluZm8uZ2V0UHJvcGVydHkoInVyaS1yZWFkT25seSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbmV2ZXIgcmVhZAotCQlMYWJlbCBwbGFjZUhvbGRlcjEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBsYWNlSG9sZGVyMS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHJvdyAyCi0JCS8vCi0JCUxhYmVsIHByZWZpeExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwcmVmaXhMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BSRUZJWF9DT0xPTik7Ci0KLQkJcHJlZml4RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXByZWZpeEZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQlwcmVmaXhGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShmSW5mby5wcmVmaXgpKTsKLQkJcHJlZml4RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlwcmVmaXhGaWVsZC5zZXRFbmFibGVkKGZJbmZvLmdldFByb3BlcnR5KCJwcmVmaXgtcmVhZE9ubHkiKSA9PSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIG5ldmVyIHJlYWQKLQkJTGFiZWwgcGxhY2VIb2xkZXIyID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwbGFjZUhvbGRlcjIuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyByb3cgMwotCQkvLwotCQlMYWJlbCBsb2NhdGlvbkhpbnRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbG9jYXRpb25IaW50TGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBVElPTl9ISU5UX0NPTE9OKTsKLQotCQlsb2NhdGlvbkhpbnRGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbG9jYXRpb25IaW50RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxvY2F0aW9uSGludEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGZJbmZvLmxvY2F0aW9uSGludCkpOwotCQlsb2NhdGlvbkhpbnRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWxvY2F0aW9uSGludEZpZWxkLnNldEVuYWJsZWQoZkluZm8uZ2V0UHJvcGVydHkoImxvY2F0aW9uSGludC1yZWFkT25seSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwZXJmb3JtQnJvd3NlKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfQlJPV1NFKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQobG9jYXRpb25IaW50RmllbGQuZ2V0RW5hYmxlZCgpKTsKLQotCQkvLyBlcnJvciBtZXNzYWdlCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ3N1YkFyZWEsIFNXVC5OT05FKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLmVycm9yX21lc3NhZ2VfZ29lc19oZXJlKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ3N1YkFyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1Ccm93c2UoKSB7Ci0JCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7Ii54c2QifTsgLy8kTk9OLU5MUy0xJAotCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyhnZXRTaGVsbCgpLCBleHRlbnNpb25zKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1NFTEVDVF9GSUxFKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJU3RyaW5nIGdyYW1tYXJVUkkgPSBudWxsOwotCQkJSUZpbGUgZmlsZSA9IGRpYWxvZy5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgaWQgPSBkaWFsb2cuZ2V0SWQoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCQlpZiAocmVzb3VyY2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJdXJpID0gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKGZpbGUuZ2V0TG9jYXRpb24oKSwgbG9jYXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkgIHVyaSA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShmaWxlLmdldExvY2F0aW9uKCksIHJlc291cmNlTG9jYXRpb24pOwotCQkJCQl9Ci0JCQkJCWdyYW1tYXJVUkkgPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdXJpID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQkJZ3JhbW1hclVSSSA9IHVyaTsKLQkJCQl9Ci0JCQkJbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dCh1cmkpOwotCQkJfQotCQkJZWxzZSBpZiAoaWQgIT0gbnVsbCkgewotCQkJCWxvY2F0aW9uSGludEZpZWxkLnNldFRleHQoaWQpOwotCQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsKLQkJCQlncmFtbWFyVVJJID0gcmVzb2x2ZXIucmVzb2x2ZShudWxsLCBpZCwgaWQpOwotCQkJfQotCi0KLQkJCUNNRG9jdW1lbnQgZG9jdW1lbnQgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlQ01Eb2N1bWVudChVUklIZWxwZXIuZ2V0VVJJRm9yRmlsZVBhdGgoZ3JhbW1hclVSSSksICJ4c2QiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCUxpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSAoTGlzdCkgZG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uYW1lc3BhY2VJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihuYW1lc3BhY2VJbmZvTGlzdCAhPSBudWxsKSB7Ci0JCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCk7Ci0JCQkJCWlmKGluZm8gIT0gbnVsbCkgewotCQkJCQkJaWYgKCh1cmlGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApICYmIChpbmZvLnVyaSAhPSBudWxsKSkgewotCQkJCQkJCXVyaUZpZWxkLnNldFRleHQoaW5mby51cmkpOwotCQkJCQkJfQotCQkJCQkJaWYgKChwcmVmaXhGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApICYmIChpbmZvLnByZWZpeCAhPSBudWxsKSkgewotCQkJCQkJCXByZWZpeEZpZWxkLnNldFRleHQoaW5mby5wcmVmaXgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VMb2NhdGlvbihJUGF0aCBwYXRoKSB7Ci0JCXJlc291cmNlTG9jYXRpb24gPSBwYXRoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKCkgewotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT0tCdXR0b25TdGF0ZSgpIHsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmICgodXJpRmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiAocHJlZml4RmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiAobG9jYXRpb25IaW50RmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRzKCkgewotCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKCk7Ci0JCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDI4NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIFN0cmluZyBkYXRhOwotCXByb3RlY3RlZCBUZXh0IGRhdGFGaWVsZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldDsKLQlwcm90ZWN0ZWQgVGV4dCB0YXJnZXRGaWVsZDsKLQotCXB1YmxpYyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgcGkuZ2V0VGFyZ2V0KCksIHBpLmdldERhdGEoKSk7Ci0JfQotCi0JcHVibGljIEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJdGFyZ2V0ID0gZ2V0TW9kZWxWYWx1ZSh0YXJnZXRGaWVsZC5nZXRUZXh0KCkpOwotCQlkYXRhID0gZ2V0TW9kZWxWYWx1ZShkYXRhRmllbGQuZ2V0VGV4dCgpKTsKLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWExID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ0FyZWExLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9QUk9DRVNTSU5HX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYTEsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjUwOwotCi0JCUxhYmVsIHRhcmdldExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0YXJnZXRMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1RBUkdFVF9DT0xPTik7Ci0KLQkJdGFyZ2V0RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJdGFyZ2V0RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRhcmdldEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKHRhcmdldCkpOwotCi0JCUxhYmVsIGRhdGFMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGF0YUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfREFUQV9DT0xPTik7Ci0KLQkJZGF0YUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWRhdGFGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGF0YUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGRhdGEpKTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTE7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCS8vIGxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsVmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKChzdHJpbmcgIT0gbnVsbCkgJiYgKHN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJcmVzdWx0ID0gc3RyaW5nOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0U2NoZW1hSW5mb0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0NTgwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0U2NoZW1hSW5mb0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0U2NoZW1hSW5mb0RpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFVwZGF0ZUxpc3RlbmVyIHsKLQkvLyBwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mb1RhYmxlIG5hbWVzcGFjZUluZm9UYWJsZTsKLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0KLQlwdWJsaWMgRWRpdFNjaGVtYUluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElQYXRoIHJlc291cmNlTG9jYXRpb24pIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ0FyZWEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX1NDSEVNQV9JTkZPX0RJQUxPRyk7Ci0KLQkJQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgZWRpdE5hbWVzcGFjZXNDb250cm9sID0gbmV3IENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nKGRpYWxvZ0FyZWEsIHJlc291cmNlTG9jYXRpb24sIFhNTFVJTWVzc2FnZXMuX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlMsIGZhbHNlLCB0cnVlKTsKLQkJZWRpdE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wudXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXREaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbGlzdCkgewotCQluYW1lc3BhY2VJbmZvTGlzdCA9IGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIoKTsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IGhlbHBlci5jb21wdXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0LCBudWxsKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU9jY3VyZWQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGFyZykgewotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKExpc3QpIGFyZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwZGY5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm9FcnJvckhlbHBlciB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBlcnJvckxpc3Q7Ci0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyKCkgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZShMaXN0IG5hbWVzcGFjZUluZm9MaXN0LCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlIYXNodGFibGUgcHJlZml4VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCUhhc2h0YWJsZSB1cmlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gbnNJbmZvID0gKE5hbWVzcGFjZUluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW5zSW5mby5ub3JtYWxpemUoKTsKLQotCQkJU3RyaW5nIHVyaWtleSA9IG5zSW5mby51cmkgIT0gbnVsbCA/IG5zSW5mby51cmkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJTmFtZXNwYWNlSW5mbyBuc0luZm8yID0gbnVsbDsKLQkJCWlmICgobnNJbmZvMiA9IChOYW1lc3BhY2VJbmZvKSB1cmlUYWJsZS5nZXQodXJpa2V5KSkgIT0gbnVsbCkgewotCQkJCWlmICgobnNJbmZvLnVyaSAhPSBudWxsKSAmJiBuc0luZm8udXJpLmVxdWFscyhuc0luZm8yLnVyaSkpIHsKLQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhfTkFNRSArICInIiArIG5zSW5mby51cmkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX05BTUU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdXJpVGFibGUucHV0KHVyaWtleSwgbnNJbmZvKTsKLQkJCX0KLQotCQkJaWYgKG5zSW5mby51cmkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBrZXkgPSBuc0luZm8ucHJlZml4ICE9IG51bGwgPyBuc0luZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocHJlZml4VGFibGUuZ2V0KGtleSkgIT0gbnVsbCkgewotCQkJCQlpZiAobnNJbmZvLnByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9QUkVGSVggKyAiJyIgKyBuc0luZm8ucHJlZml4ICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX1BSRUZJWDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwcmVmaXhUYWJsZS5wdXQoa2V5LCBuc0luZm8pOwotCQkJCX0KLQotCQkJCWlmICgobnNJbmZvLmxvY2F0aW9uSGludCAhPSBudWxsKSAmJiAoaWRSZXNvbHZlciAhPSBudWxsKSkgewotCQkJCQlTdHJpbmcgZ3JhbW1hclVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBuc0luZm8ubG9jYXRpb25IaW50LCBuc0luZm8ubG9jYXRpb25IaW50KTsKLQkJCQkJaWYgKCFVUklIZWxwZXIuaXNSZWFkYWJsZVVSSShncmFtbWFyVVJJLCBmYWxzZSkpIHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfU0NIRU1BX0NBTl9OT1RfQkVfTE9DQVRFRCArICIgJyIgKyBuc0luZm8ubG9jYXRpb25IaW50ICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoKGlkUmVzb2x2ZXIgIT0gbnVsbCkgJiYgKG5zSW5mby5sb2NhdGlvbkhpbnQgPT0gbnVsbCkgJiYgIW5zSW5mby51cmkuZXF1YWxzKERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyLlhTSV9VUkkpKSB7Ci0JCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTE9DQVRJT05fSElOVF9OT1RfU1BFQ0lGSUVEICsgIiAnIiArIG5zSW5mby51cmkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5zSW5mby5wcmVmaXggIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX05BTUVTUEFDRV9OQU1FX05PVF9TUEVDSUZJRUQgKyAiICciICsgbnNJbmZvLnByZWZpeCArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkaXRpb25hbCB0ZXN0cwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbykgaXRlcmF0b3IubmV4dCgpOwotCQkJCW5zSW5mby5ub3JtYWxpemUoKTsKLQkJCQlpZiAoKG5zSW5mby51cmkgIT0gbnVsbCkgJiYgbnNJbmZvLmlzUHJlZml4UmVxdWlyZWQgJiYgKG5zSW5mby5wcmVmaXggPT0gbnVsbCkpIHsKLQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19QUkVGSVhfTk9UX1NQRUNJRklFRCArICIgJyIgKyBuc0luZm8udXJpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvTmFtZXNwYWNlSW5mb1RhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0MzhkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlSW5mb1RhYmxlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCS8qKgotCSAqIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbikgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG9iamVjdDsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQljYXNlIDAgOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8udXJpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxIDogewotCQkJCQlyZXN1bHQgPSBpbmZvLnByZWZpeDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMiA6IHsKLQkJCQkJcmVzdWx0ID0gaW5mby5sb2NhdGlvbkhpbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXN1bHQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJY2FzZSAwIDogewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfTk9fTkFNRVNQQUNFX05BTUU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIDEgOiB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9OT19QUkVGSVg7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0RGVmYXVsdFByZWZpeCgpIHsKLQkJCVN0cmluZyBkZWZhdWx0UHJlZml4ID0gInAiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobmFtZXNwYWNlSW5mb0xpc3QgPT0gbnVsbCkgewotCQkJCXJldHVybiBkZWZhdWx0UHJlZml4OwotCQkJfQotCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBuc2luZm8gPSAoTmFtZXNwYWNlSW5mbykgbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KGkpOwotCQkJCWlmIChuc2luZm8ucHJlZml4ICE9IG51bGwpIHsKLQkJCQkJdi5hZGRFbGVtZW50KG5zaW5mby5wcmVmaXgpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh2LmNvbnRhaW5zKGRlZmF1bHRQcmVmaXgpKSB7Ci0JCQkJU3RyaW5nIHMgPSBkZWZhdWx0UHJlZml4OwotCQkJCWZvciAoaW50IGogPSAwOyB2LmNvbnRhaW5zKHMpOyBqKyspIHsKLQkJCQkJcyA9IGRlZmF1bHRQcmVmaXggKyBJbnRlZ2VyLnRvU3RyaW5nKGopOwotCQkJCX0KLQkJCQlyZXR1cm4gczsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBkZWZhdWx0UHJlZml4OwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBuYW1lc3BhY2VJbmZvTGlzdC50b0FycmF5KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0hJTlQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBVElPTl9ISU5UOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUkkgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9QUkVGSVg7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZHVtbXlSb3dzUmVtb3ZlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLQlwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlciBwcm92aWRlcjsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJvdGVjdGVkIFVwZGF0ZUxpc3RlbmVyIHVwZGF0ZUxpc3RlbmVyOwotCXByb3RlY3RlZCBpbnQgdmlzaWJsZVJvd3MgPSAtMTsKLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzKHBhcmVudCwgLTEsIC0xLCAtMSk7Ci0JfQotCi0JcHVibGljIE5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgdmlzaWJsZVJvd3MpIHsKLQkJdGhpcyhwYXJlbnQsIC0xLCAtMSwgdmlzaWJsZVJvd3MpOwotCX0KLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQpIHsKLQkJdGhpcyhwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgLTEpOwotCX0KLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCB2aXNpYmxlUm93cykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2V0TGF5b3V0KGNyZWF0ZUdyaWRMYXlvdXQoKSk7Ci0JCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcm91cCBuYW1lc3BhY2VJbmZvR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotCQluYW1lc3BhY2VJbmZvR3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9YTUxfU0NIRU1BX0lORk9STUFUSU9OKTsKLQkJbmFtZXNwYWNlSW5mb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJaWYgKHdpZHRoSGludCAhPSAtMSkgewotCQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl9Ci0JCWlmIChoZWlnaHRIaW50ICE9IC0xKSB7Ci0JCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJfQotCQluYW1lc3BhY2VJbmZvR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChuYW1lc3BhY2VJbmZvR3JvdXAsIG5ldwotCQkvLyBDb250cm9sQ29udGV4dENvbXB1dGVyKG5hbWVzcGFjZUluZm9Hcm91cCwKLQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19OQU1FU1BBQ0VfR1JPVVApKTsKLQkJU3RyaW5nW10gdGl0bGVBcnJheSA9IHtOQU1FU1BBQ0VfVVJJLCBQUkVGSVgsIExPQ0FUSU9OX0hJTlR9OwotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihuYW1lc3BhY2VJbmZvR3JvdXAsIFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXByb3ZpZGVyID0gbmV3IE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0JCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXModGl0bGVBcnJheSk7Ci0JCVRhYmxlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWludFtdIHdpZHRoQXJyYXkgPSB7NTAsIDIwLCAzMH07Ci0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRpdGxlQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQljb2x1bW4uc2V0VGV4dCh0aXRsZUFycmF5W2ldKTsKLQkJCWNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEod2lkdGhBcnJheVtpXSwgdHJ1ZSkpOwotCQl9Ci0JCXRoaXMudmlzaWJsZVJvd3MgPSB2aXNpYmxlUm93czsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlUm93czsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgiIyMjIyMjIyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW3RpdGxlQXJyYXkubGVuZ3RoXTsKLQkJY2VsbEVkaXRvcnNbMV0gPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCQljZWxsRWRpdG9yc1syXSA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQkJTW91c2VBZGFwdGVyIG1vdXNlQWRhcHRlciA9IG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmICh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSkgIT0gbnVsbCkgewotCQkJCQlwZXJmb3JtRWRpdCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGFibGUuYWRkTW91c2VMaXN0ZW5lcihtb3VzZUFkYXB0ZXIpOwotCQljcmVhdGVCdXR0b25zKG5hbWVzcGFjZUluZm9Hcm91cCk7Ci0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUJ1dHRvbkVuYWJsZWRTdGF0ZSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJQnV0dG9uIGhpZGRlbkJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWhpZGRlbkJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJaGlkZGVuQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQloaWRkZW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0ID09IG5ld0J1dHRvbikgewotCQkJCQlwZXJmb3JtTmV3KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGUud2lkZ2V0ID09IGVkaXRCdXR0b24pIHsKLQkJCQkJcGVyZm9ybUVkaXQoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVsZXRlQnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1EZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB0aHJlZSBidXR0b25zCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWJ1dHRvbkdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWJ1dHRvbkdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25HcmlkTGF5b3V0KTsKLQkJLy8gYWRkIHRoZSBOZXcgYnV0dG9uCi0JCS8vCi0JCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW5ld0J1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9ORVcpOwotCQluZXdCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCS8vIGFkZCB0aGUgRWRpdCBidXR0b24KLQkJLy8KLQkJZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVkaXRCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fRURJVCk7Ci0JCWVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkvLyBhZGQgdGhlIERlbGV0ZSBidXR0b24KLQkJLy8KLQkJZGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGVsZXRlQnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfQlVUVE9OX0RFTEVURSk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgR3JpZExheW91dCBjcmVhdGVHcmlkTGF5b3V0KCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCXJldHVybiBncmlkTGF5b3V0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkgewotCQlyZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gZ2V0VGFyZ2V0TmFtZXNwYWNlSW5mbygpIHsKLQkJcmV0dXJuICgobmFtZXNwYWNlSW5mb0xpc3QgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKSA+IDApKSA/IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCkgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBpbnZva2VEaWFsb2coU3RyaW5nIHRpdGxlLCBOYW1lc3BhY2VJbmZvIGluZm8pIHsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyhzaGVsbCwgaW5mbyk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKSB7Ci0JCVJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdXBkYXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCWdldERpc3BsYXkoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0JCWlmICh1cGRhdGVMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCW5hbWVzcGFjZUluZm9MaXN0LnJlbW92ZShzZWxlY3RlZE9iamVjdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTmFtZXNwYWNlSW5mbykgewotCQkJaW52b2tlRGlhbG9nKFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT04sIChOYW1lc3BhY2VJbmZvKSBzZWxlY3RlZE9iamVjdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybU5ldygpIHsKLQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLQkJRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gaW52b2tlRGlhbG9nKFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT04sIGluZm8pOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCW5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvKTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IG5hbWVzcGFjZUluZm9MaXN0KSB7Ci0JCXRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTGlzdDsKLQkJdXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VMb2NhdGlvbihJUGF0aCByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlTGlzdGVuZXIoVXBkYXRlTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXIpIHsKLQkJdGhpcy51cGRhdGVMaXN0ZW5lciA9IHVwZGF0ZUxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJdXBkYXRlSGVscGVyKG5hbWVzcGFjZUluZm9MaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVCdXR0b25FbmFibGVkU3RhdGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIHNlbGVjdGVkT2JqZWN0OwotCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoaW5mbyAhPSBudWxsKTsKLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoKGluZm8gIT0gbnVsbCkgJiYgKGluZm8uZ2V0UHJvcGVydHkoInVucmVtb3ZhYmxlIikgPT0gbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlSGVscGVyKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJaWYgKCh2aXNpYmxlUm93cyAhPSAtMSkgJiYgIWR1bW15Um93c1JlbW92ZWQpIHsKLQkJCWR1bW15Um93c1JlbW92ZWQgPSB0cnVlOwotCQkJdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5yZW1vdmVBbGwoKTsKLQkJfQotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlpZiAobmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCkpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2Y2Y3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIGludCBjYXRhbG9nRW50cnlUeXBlOwotCXByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCXByb3RlY3RlZCBJRmlsZSBmaWxlOwotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwgcGFuZWw7Ci0KLQlwdWJsaWMgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXRoaXMocGFyZW50U2hlbGwsIGV4dGVuc2lvbnMsIDApOwotCX0KLQotCXB1YmxpYyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZ1tdIGV4dGVuc2lvbnMsIGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQkJdGhpcy5jYXRhbG9nRW50cnlUeXBlID0gY2F0YWxvZ0VudHJ5VHlwZTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlmaWxlID0gcGFuZWwuZ2V0RmlsZSgpOwotCQkJaWQgPSBwYW5lbC5nZXRYTUxDYXRhbG9nSWQoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlwYW5lbCA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbChkaWFsb2dBcmVhKTsKLQkJcGFuZWwuc2V0Q2F0YWxvZ0VudHJ5VHlwZShjYXRhbG9nRW50cnlUeXBlKTsKLQkJcGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJcGFuZWwuc2V0VmlzaWJsZUhlbHBlcih0cnVlKTsKLQkJU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCkgewotCQkJCXVwZGF0ZUJ1dHRvblN0YXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCXBhbmVsLnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvblN0YXRlKCkgewotCQlva0J1dHRvbi5zZXRFbmFibGVkKChwYW5lbC5nZXRGaWxlKCkgIT0gbnVsbCkgfHwgKHBhbmVsLmdldFhNTENhdGFsb2dJZCgpICE9IG51bGwpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4N2IwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbCBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRPRE86IENoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGludGVyZmFjZTsgIkxpc3RlbmVyIiBpcyB1c2VkIGJ5IFNXVC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKLQkJdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIE15U2VsZWN0U2luZ2xlRmlsZVZpZXcgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlVmlldyBpbXBsZW1lbnRzIFNlbGVjdFNpbmdsZUZpbGVWaWV3Lkxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIENvbnRyb2wgY29udHJvbDsKLQotCQlwdWJsaWMgTXlTZWxlY3RTaW5nbGVGaWxlVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihudWxsLCB0cnVlKTsKLQkJCS8vIFN0cmluZ1tdIGV4dCA9IHsiLmR0ZCJ9OwotCQkJLy8gYWRkRmlsdGVyRXh0ZW5zaW9ucyhleHQpOwotCQkJY29udHJvbCA9IGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlNeVNlbGVjdFNpbmdsZUZpbGVWaWV3LnRoaXMuc2V0TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIGNvbnRyb2w7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb250cm9sQ29tcGxldGUoYm9vbGVhbiBpc0NvbXBsZXRlKSB7Ci0JCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGVIZWxwZXIoaXNWaXNpYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uW10gcmFkaW9CdXR0b247Ci0JcHJvdGVjdGVkIE15U2VsZWN0U2luZ2xlRmlsZVZpZXcgc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0JcHJvdGVjdGVkIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsOwotCi0JcHVibGljIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJLy8gY29udGFpbmVyIGdyb3VwCi0JCXNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDQwMDsKLQkJZ2Qud2lkdGhIaW50ID0gNDAwOwotCQlzZXRMYXlvdXREYXRhKGdkKTsKLQotCQlyYWRpb0J1dHRvbiA9IG5ldyBCdXR0b25bMl07Ci0JCXJhZGlvQnV0dG9uWzBdID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvblswXS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX1JBRElPX0JVVFRPTl9TRUxFQ1RfRlJPTV9XT1JLU1BBQ0UpOwotCQlyYWRpb0J1dHRvblswXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmFkaW9CdXR0b25bMF0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyYWRpb0J1dHRvblswXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlyYWRpb0J1dHRvblsxXSA9IG5ldyBCdXR0b24odGhpcywgU1dULlJBRElPKTsKLQkJcmFkaW9CdXR0b25bMV0uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9SQURJT19CVVRUT05fU0VMRUNUX0ZST01fQ0FUQUxPRyk7Ci0JCXJhZGlvQnV0dG9uWzFdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyYWRpb0J1dHRvblsxXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayh0aGlzLCBTV1QuTk9ORSk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3ID0gbmV3IE15U2VsZWN0U2luZ2xlRmlsZVZpZXcocGFnZUJvb2spOwotCi0JCUlDYXRhbG9nIHhtbENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCA9IG5ldyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChwYWdlQm9vaywgeG1sQ2F0YWxvZyk7Ci0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFRhYmxlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcGFnZUJvb2suc2hvd1BhZ2Uoc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0Q29udHJvbCgpKTsKLQotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlJRmlsZSByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMF0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFNpbmdsZUZpbGVWaWV3LmdldEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VudHJ5IGdldFhNTENhdGFsb2dFbnRyeSgpIHsKLQkJSUNhdGFsb2dFbnRyeSByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFhNTENhdGFsb2dFbnRyeSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYTUxDYXRhbG9nSWQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTENhdGFsb2dVUkkoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFVSSSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VudHJ5VHlwZShpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5zZXRDYXRhbG9nRW50cnlUeXBlKGNhdGFsb2dFbnRyeVR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykgewotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5yZXNldEZpbHRlcnMoKTsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRUYWJsZVZpZXdlcigpLnNldEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0VmlzaWJsZUhlbHBlcihpc1Zpc2libGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpIHsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWxpc3RlbmVyLmNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gcmFkaW9CdXR0b25bMF0pIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdFNpbmdsZUZpbGVWaWV3LmdldENvbnRyb2woKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYWdlQm9vay5zaG93UGFnZShzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCk7Ci0JCX0KLQkJdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0Yzk2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZXh0ZW5zaW9uczsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCXByb3RlY3RlZCBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBwYW5lbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7Ci0KLQlwdWJsaWMgU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHBhbmVsLmdldFRhYmxlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0KLQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotCQkJCXB1YmxpY0lkID0gbWFwcGluZ0luZm8uZ2V0S2V5KCk7Ci0JCQkJc3lzdGVtSWQgPSBjb21wdXRlRGVmYXVsdFN5c3RlbUlkKG1hcHBpbmdJbmZvKTsKLQkJCX0KLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVEZWZhdWx0U3lzdGVtSWQoSUNhdGFsb2dFbnRyeSBtYXBwaW5nSW5mbykgewotCQlTdHJpbmcgcmVzdWx0ID0gbWFwcGluZ0luZm8uZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpOwotCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAobWFwcGluZ0luZm8uZ2V0VVJJKCkgIT0gbnVsbCkpIHsKLQkJCWludCBpbmRleCA9IG1hcHBpbmdJbmZvLmdldFVSSSgpLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBsYXN0U2VnbWVudCA9IGluZGV4ICE9IC0xID8gbWFwcGluZ0luZm8uZ2V0VVJJKCkuc3Vic3RyaW5nKGluZGV4ICsgMSkgOiBtYXBwaW5nSW5mby5nZXRVUkkoKTsKLQkJCXJlc3VsdCA9IGxhc3RTZWdtZW50OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQXJlYSwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfQ0FUQUxPR19ESUFMT0cpOwotCi0JCUlDYXRhbG9nIHhtbENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQlwYW5lbCA9IG5ldyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChkaWFsb2dBcmVhLCB4bWxDYXRhbG9nKTsKLQotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUJ1dHRvblN0YXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCXBhbmVsLmdldFRhYmxlVmlld2VyKCkuc2V0RmlsdGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJcGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHB1YmxpY0lkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiBzeXN0ZW1JZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25TdGF0ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBwYW5lbC5nZXRUYWJsZVZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKCFzZWxlY3Rpb24uaXNFbXB0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhOWU4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIGludCBjYXRhbG9nRW50cnlUeXBlOwotCXByb3RlY3RlZCBib29sZWFuIGRvVGFibGVTaXplSGFjayA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcm90ZWN0ZWQgSUNhdGFsb2cgZlhtbENhdGFsb2c7Ci0KLQlwdWJsaWMgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgeG1sQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy5mWG1sQ2F0YWxvZyA9IHhtbENhdGFsb2c7Ci0KLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJdGhpcy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWdkLndpZHRoSGludCA9IDcwMDsKLQkJdGhpcy5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfWE1MX0NBVEFMT0dfQ09MT04pOwotCi0JCXRhYmxlVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIodGhpcyk7Ci0JCXRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoImR1bW15Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGhlYWRpbmdzW10gPSBuZXcgU3RyaW5nWzJdOwotCQloZWFkaW5nc1swXSA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0tFWTsKLQkJaGVhZGluZ3NbMV0gPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9VUkk7Ci0KLQkJWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIHRoZVRhYmxlVmlld2VyID0gbmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlcihwYXJlbnQsIGhlYWRpbmdzKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGFkZFhNTENhdGFsb2dFbnRyaWVzKExpc3QgbGlzdCwgSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkJCWlmIChjYXRhbG9nRW50cnlUeXBlID09IDApIHsKLQkJCQkJCWxpc3QuYWRkKGVudHJ5KTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjYXRhbG9nRW50cnlUeXBlID09IGVudHJ5LmdldEVudHJ5VHlwZSgpKSB7Ci0JCQkJCQlsaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dFbnRyaWVzKCkgewotCQkJCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQotCQkJCWlmICgoZlhtbENhdGFsb2cgPT0gbnVsbCkgfHwgZG9UYWJsZVNpemVIYWNrKSB7Ci0JCQkJCS8vIHRoaXMgbGV0cyB1cyBjcmVhdGUgYSB0YWJsZSB3aXRoIGFuIGluaXRpYWwgaGVpZ2h0IG9mCi0JCQkJCS8vIDEwIHJvd3MKLQkJCQkJLy8gb3RoZXJ3aXNlIHdlIGdldCBzdHVjayB3aXRoIDAgcm93IGhlaWdoIHRhYmxlLi4uIHRoYXQncwotCQkJCQkvLyB0b28gc21hbGwKLQkJCQkJZG9UYWJsZVNpemVIYWNrID0gZmFsc2U7Ci0JCQkJCXJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJCQkJCXJlc3VsdC5hZGQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZlhtbENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCQkJCUlDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCQkJCQlhZGRYTUxDYXRhbG9nRW50cmllcyhyZXN1bHQsIHN5c3RlbUNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCQkJCUlDYXRhbG9nIHVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJCQkJCWFkZFhNTENhdGFsb2dFbnRyaWVzKHJlc3VsdCwgdXNlckNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIHRoZVRhYmxlVmlld2VyOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldFhNTENhdGFsb2dFbnRyeSgpOwotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldEtleSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgZW50cnkgPSBnZXRYTUxDYXRhbG9nRW50cnkoKTsKLQkJcmV0dXJuIGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRVUkkoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnkgZ2V0WE1MQ2F0YWxvZ0VudHJ5KCkgewotCQlJQ2F0YWxvZ0VudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJcmVzdWx0ID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VudHJ5VHlwZShpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQl0aGlzLmNhdGFsb2dFbnRyeVR5cGUgPSBjYXRhbG9nRW50cnlUeXBlOwotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvVXBkYXRlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1VwZGF0ZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzI3MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvVXBkYXRlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVwZGF0ZUxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU9jY3VyZWQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGFyZyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9YTUxDYXRhbG9nVGFibGVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGE4NzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlciB7Ci0KLQotCXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnlDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJT2JqZWN0W10gYXJyYXkgPSBnZXRYTUxDYXRhbG9nRW50cmllcygpLnRvQXJyYXkoKTsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlpbnQgcmVzdWx0ID0gMDsKLQkJCQkJaWYgKChvMSBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpICYmIChvMiBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpKSB7Ci0JCQkJCQlJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvMSA9IChJQ2F0YWxvZ0VudHJ5KSBvMTsKLQkJCQkJCUlDYXRhbG9nRW50cnkgbWFwcGluZ0luZm8yID0gKElDYXRhbG9nRW50cnkpIG8yOwotCQkJCQkJcmVzdWx0ID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKG1hcHBpbmdJbmZvMS5nZXRLZXkoKSwgbWFwcGluZ0luZm8yLmdldEtleSgpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX07Ci0JCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCUltYWdlIGJhc2UgPSBudWxsOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQkJU3RyaW5nIHVyaSA9IGNhdGFsb2dFbnRyeS5nZXRVUkkoKTsKLQkJCQkJaWYgKHVyaS5lbmRzV2l0aCgiZHRkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYmFzZSA9IGR0ZEZpbGVJbWFnZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh1cmkuZW5kc1dpdGgoInhzZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJhc2UgPSB4c2RGaWxlSW1hZ2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQliYXNlID0gdW5rbm93bkZpbGVJbWFnZTsKLQkJCQkJfQotCi0JCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJCWlmIChVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCQkJCXJlc3VsdCA9IGJhc2U7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBUT0RPLi4uIFNTRSBwb3J0Ci0JCQkJCQkJcmVzdWx0ID0gYmFzZTsvLyBpbWFnZUZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlSW1hZ2UoYmFzZSwKLQkJCQkJCQkvLyBlcnJvckltYWdlLAotCQkJCQkJCS8vIEltYWdlRmFjdG9yeS5CT1RUT01fTEVGVCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQlyZXN1bHQgPSBjb2x1bW5JbmRleCA9PSAwID8gY2F0YWxvZ0VudHJ5LmdldEtleSgpIDogY2F0YWxvZ0VudHJ5LmdldFVSSSgpOwotCQkJCXJlc3VsdCA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wocmVzdWx0KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCWNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCi0JCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZWxlbWVudDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeS5nZXRVUkkoKS5lbmRzV2l0aChleHRlbnNpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZHRkRmlsZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9EVERGSUxFKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEVSUk9SX1NUQVRFX0tFWSA9ICJlcnJvcnN0YXRla2V5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZXJyb3JJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PVlJfRVJST1IpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSB1bmtub3duRmlsZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UWFRFWFQpOwotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgeHNkRmlsZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9YU0RGSUxFKTsKLQotCS8vIHByb3RlY3RlZCBJbWFnZUZhY3RvcnkgaW1hZ2VGYWN0b3J5ID0gbmV3IEltYWdlRmFjdG9yeSgpOwotCi0JcHVibGljIFhNTENhdGFsb2dUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCWNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dFbnRyaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImhlbGxvIikgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJydW4hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXJlc2V0RmlsdGVycygpOwotCQlhZGRGaWx0ZXIobmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kbmQvRHJhZ05vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNWM2NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRHJhZ05vZGVDb21tYW5kIGV4dGVuZHMgRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCB7Ci0JcHJpdmF0ZSBMaXN0IGZTZWxlY3Rpb25zOwotCXByaXZhdGUgVHJlZVZpZXdlciBmVHJlZVZpZXdlcjsKLQotCXB1YmxpYyBEcmFnTm9kZUNvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlzdXBlcih0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZXMpOwotCQlmVHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0JCWZTZWxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpbk1vZGVsQ2hhbmdlKE5vZGUgbm9kZSwgYm9vbGVhbiBiYXRjaFVwZGF0ZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IGdldFN0cnVjdHVyZWRNb2RlbChub2RlKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdW5kb0Rlc2MgPSBuZXcgU3RyaW5nKCk7Ci0JCQlpZiAoZ2V0T3BlcmF0aW9uKCkgPT0gRE5ELkRST1BfTU9WRSkgewotCQkJCXVuZG9EZXNjID0gWE1MVUlNZXNzYWdlcy5EcmFnTm9kZUNvbW1hbmRfMDsKLQkJCX0KLQkJCWVsc2UgaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX0NPUFkpIHsKLQkJCQl1bmRvRGVzYyA9IFhNTFVJTWVzc2FnZXMuRHJhZ05vZGVDb21tYW5kXzE7Ci0JCQl9Ci0KLQkJCXN0cnVjdHVyZWRNb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCB1bmRvRGVzYyk7Ci0JCQlpZiAoYmF0Y2hVcGRhdGUpIHsKLQkJCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZXhlY3V0ZUhlbHBlcih0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZG9Nb2RpZnkoTm9kZSBzb3VyY2UsIE5vZGUgcGFyZW50Tm9kZSwgTm9kZSByZWZDaGlsZCwgYm9vbGVhbiB0ZXN0T25seSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoc291cmNlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJQXR0ciBzb3VyY2VBdHRyaWJ1dGUgPSAoQXR0cikgc291cmNlOwotCQkJRWxlbWVudCBzb3VyY2VBdHRyaWJ1dGVPd25lckVsZW1lbnQgPSBzb3VyY2VBdHRyaWJ1dGUuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQlpZiAoKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgKHNvdXJjZUF0dHJpYnV0ZU93bmVyRWxlbWVudCAhPSBwYXJlbnROb2RlKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJaWYgKCF0ZXN0T25seSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX01PVkUpIHsKLQkJCQkJCQlFbGVtZW50IHRhcmdldEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCQkJCQlzb3VyY2VBdHRyaWJ1dGVPd25lckVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShzb3VyY2VBdHRyaWJ1dGUpOwotCQkJCQkJCXRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLnNldE5hbWVkSXRlbShzb3VyY2VBdHRyaWJ1dGUpOwotCQkJCQkJCWZTZWxlY3Rpb25zLmFkZChzb3VyY2VBdHRyaWJ1dGUpOwotCQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX0NPUFkpIHsKLQkJCQkJCQlBdHRyIGNsb25lQXR0cmlidXRlID0gKEF0dHIpIHNvdXJjZUF0dHJpYnV0ZS5jbG9uZU5vZGUoZmFsc2UpOwotCQkJCQkJCUVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotCQkJCQkJCXRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLnNldE5hbWVkSXRlbShjbG9uZUF0dHJpYnV0ZSk7Ci0JCQkJCQkJZlNlbGVjdGlvbnMuYWRkKGNsb25lQXR0cmlidXRlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICgoKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgfHwgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpKSAmJiAhKHJlZkNoaWxkIGluc3RhbmNlb2YgQXR0cikpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCi0JCQkJaWYgKCF0ZXN0T25seSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGlzQW5jZXN0b3Ioc291cmNlLCBwYXJlbnROb2RlKSkgewotCQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2FuIG5vdCBwZXJmb3JtIHRoaXMgZHJhZyBkcm9wCi0JCQkJCQkJLy8gb3BlcmF0aW9uLi4uLiB0b2RvLi4uIHBvcCB1cCBkaWFsb2ciKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGRlZmVjdCAyMjEwNTUgdGhpcyB0ZXN0IGlzIHJlcXVpcmVkIG9yIGVsc2UgdGhlCi0JCQkJCQkJLy8gbm9kZSB3aWxsCi0JCQkJCQkJLy8gYmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlIGFuZCB0aGUgaW5zZXJ0IHdpbGwgZmFpbAotCQkJCQkJCWlmIChzb3VyY2UgIT0gcmVmQ2hpbGQpIHsKLQkJCQkJCQkJaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX01PVkUpIHsKLQkJCQkJCQkJCU5vZGUgb2xkUGFyZW50ID0gc291cmNlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQkJCU5vZGUgb2xkU2libGluZyA9IHNvdXJjZS5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKHNvdXJjZSk7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCXBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNvdXJjZSwgcmVmQ2hpbGQpOwotCQkJCQkJCQkJfSBjYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBidWcxNTE2OTIgLSBpZiB1bmFibGUgdG8gbW92ZSBub2RlIHRvIG5ldyBsb2NhdGlvbiwgcmVpbnNlcnQgYmFjayB0byBvbGQgbG9jYXRpb24KLQkJCQkJCQkJCQlvbGRQYXJlbnQuaW5zZXJ0QmVmb3JlKHNvdXJjZSwgb2xkU2libGluZyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlmU2VsZWN0aW9ucy5hZGQoc291cmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmIChnZXRPcGVyYXRpb24oKSA9PSBETkQuRFJPUF9DT1BZKSB7Ci0JCQkJCQkJCQlOb2RlIG5vZGVDbG9uZSA9IHNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7Ci0JCQkJCQkJCQlwYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlQ2xvbmUsIHJlZkNoaWxkKTsKLQkJCQkJCQkJCWZTZWxlY3Rpb25zLmFkZChub2RlQ2xvbmUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZE1vZGVsQ2hhbmdlKE5vZGUgbm9kZSwgYm9vbGVhbiBiYXRjaFVwZGF0ZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IGdldFN0cnVjdHVyZWRNb2RlbChub2RlKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJaWYgKGJhdGNoVXBkYXRlKSB7Ci0JCQkJLy8gc3RydWN0dXJlZE1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZXhlY3V0ZUhlbHBlcihmYWxzZSk7Ci0KLQkJLy8gTWFrZSBvdXIgc2VsZWN0aW9uIGlmIHRoZSB0cmVlVmlld2VyICE9IG51bGwKLQkJaWYgKGZUcmVlVmlld2VyICE9IG51bGwpIHsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZTZWxlY3Rpb25zKTsKLQkJCWZUcmVlVmlld2VyLnNldFNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleGVjdXRlSGVscGVyKGJvb2xlYW4gdGVzdE9ubHkpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSB0YXJnZXROb2RlID0gKE5vZGUpIHRhcmdldDsKLQkJCU5vZGUgcGFyZW50Tm9kZSA9IGdldFBhcmVudEZvckRyb3BQb3NpdGlvbih0YXJnZXROb2RlKTsKLQkJCU5vZGUgcmVmQ2hpbGQgPSBnZXRSZWZDaGlsZCh0YXJnZXROb2RlKTsKLQotCQkJVmVjdG9yIHNvdXJjZXNMaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJc291cmNlc0xpc3QuYWRkQWxsKHNvdXJjZXMpOwotCi0JCQlyZW1vdmVNZW1iZXJEZXNjZW5kYW50cyhzb3VyY2VzTGlzdCk7Ci0JCQlib29sZWFuIHBlcmZvcm1CYXRjaFVwZGF0ZSA9IHNvdXJjZXNMaXN0LnNpemUoKSA+IDU7Ci0KLQkJCWlmICghdGVzdE9ubHkpIHsKLQkJCQliZWdpbk1vZGVsQ2hhbmdlKHRhcmdldE5vZGUsIHBlcmZvcm1CYXRjaFVwZGF0ZSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VzTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgc291cmNlID0gaS5uZXh0KCk7Ci0JCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJaWYgKCEoKHJlZkNoaWxkID09IG51bGwpICYmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgQXR0cikpKSB7Ci0JCQkJCQlyZXN1bHQgPSBkb01vZGlmeSgoTm9kZSkgc291cmNlLCBwYXJlbnROb2RlLCByZWZDaGlsZCwgdGVzdE9ubHkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCF0ZXN0T25seSkgewotCQkJCWVuZE1vZGVsQ2hhbmdlKHRhcmdldE5vZGUsIHBlcmZvcm1CYXRjaFVwZGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGludCBnZXRGZWVkYmFjaygpIHsKLQkJaW50IHJlc3VsdCA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCWlmIChsb2NhdGlvbiA+IDAuNzUpIHsKLQkJCXJlc3VsdCA9IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCX0KLQkJZWxzZSBpZiAobG9jYXRpb24gPCAwLjI1KSB7Ci0JCQlyZXN1bHQgPSBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTm9kZSBnZXRQYXJlbnRGb3JEcm9wUG9zaXRpb24oTm9kZSBub2RlKSB7Ci0JCU5vZGUgcmVzdWx0ID0gbnVsbDsKLQotCQlpbnQgZmVlZGJhY2sgPSBnZXRGZWVkYmFjaygpOwotCQlpZiAoZmVlZGJhY2sgPT0gRE5ELkZFRURCQUNLX1NFTEVDVCkgewotCQkJcmVzdWx0ID0gbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGdldFBhcmVudE9yT3duZXIobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByaXZhdGUgTm9kZSBnZXRQYXJlbnRPck93bmVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSA/ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkgOiBub2RlLmdldFBhcmVudE5vZGUoKTsKLQl9Ci0KLQotCXByaXZhdGUgTm9kZSBnZXRSZWZDaGlsZChOb2RlIG5vZGUpIHsKLQkJTm9kZSByZXN1bHQgPSBudWxsOwotCi0JCWludCBmZWVkYmFjayA9IGdldEZlZWRiYWNrKCk7Ci0KLQkJaWYgKGZlZWRiYWNrID09IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFKSB7Ci0JCQlyZXN1bHQgPSBub2RlOwotCQl9Ci0JCWVsc2UgaWYgKGZlZWRiYWNrID09IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVIpIHsKLQkJCXJlc3VsdCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRTdHJ1Y3R1cmVkTW9kZWwoTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJcmVzdWx0ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHJldHVybnMgdHJ1ZSBpZiBhIGlzIGFuIGFuY2VzdG9yZSBvZiBiCi0JLy8KLQlwcml2YXRlIGJvb2xlYW4gaXNBbmNlc3RvcihOb2RlIGEsIE5vZGUgYikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlmb3IgKE5vZGUgcGFyZW50ID0gYjsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChwYXJlbnQgPT0gYSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgbWVtYmVycyBvZiB0aGUgbGlzdCB0aGF0IGhhdmUgYW5jZXN0b3JzIHRoYXQgYXJlCi0JICogYWxzbyBtZW1iZXJzIG9mIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVNZW1iZXJEZXNjZW5kYW50cyhMaXN0IGxpc3QpIHsKLQkJSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5vZGUgPSBpLm5leHQoKTsKLQkJCXRhYmxlLnB1dChub2RlLCBub2RlKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSBsaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgbGlzdC5nZXQoaSk7Ci0JCQlmb3IgKE5vZGUgcGFyZW50ID0gZ2V0UGFyZW50T3JPd25lcihub2RlKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IGdldFBhcmVudE9yT3duZXIocGFyZW50KSkgewotCQkJCWlmICh0YWJsZS5nZXQocGFyZW50KSAhPSBudWxsKSB7Ci0JCQkJCWxpc3QucmVtb3ZlKGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG5kL1hNTERyYWdBbmREcm9wTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9YTUxEcmFnQW5kRHJvcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwOTdhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG5kL1hNTERyYWdBbmREcm9wTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRyYWdBbmREcm9wTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5PYmplY3RUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyIGltcGxlbWVudHMgRHJhZ0FuZERyb3BNYW5hZ2VyIHsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgZlZpZXdlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGREcmFnQW5kRHJvcFN1cHBvcnQoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW117T2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyb3BBZGFwdGVyKHZpZXdlciwgbmV3IFhNTERyYWdBbmREcm9wTWFuYWdlcih2aWV3ZXIpKSk7Ci0JfQotCi0JcHVibGljIFhNTERyYWdBbmREcm9wTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIERyYWdBbmREcm9wQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2UpIHsKLQkJRHJhZ0FuZERyb3BDb21tYW5kIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXN1bHQgPSBuZXcgRHJhZ05vZGVDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlLCBmVmlld2VyKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kb3VibGVjbGljay9YTUxEb3VibGVDbGlja1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG91YmxlY2xpY2svWE1MRG91YmxlQ2xpY2tTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMwOTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kb3VibGVjbGljay9YTUxEb3VibGVDbGlja1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG91YmxlY2xpY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRUZXh0RG91YmxlQ2xpY2tTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxEb3VibGVDbGlja1N0cmF0ZWd5IGV4dGVuZHMgRGVmYXVsdFRleHREb3VibGVDbGlja1N0cmF0ZWd5IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFID0gJ1wiJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU1BBQ0UgPSAnICc7Ci0JcHJvdGVjdGVkIGludCBmQ2FyZXRQb3NpdGlvbiA9IC0xOwotCXByb3RlY3RlZCBpbnQgZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCXByb3RlY3RlZCBOb2RlIGZOb2RlID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXIgZlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBmVGV4dFJlZ2lvbiA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBkb3VibGVDbGlja2VkKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJaWYgKHRleHRWaWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgewotCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyID0gKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB0ZXh0Vmlld2VyOwotCQkJdHJ5IHsKLQkJCQlmU3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmU3RydWN0dXJlZFRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWludCBjYXJldFBvc2l0aW9uID0gdGV4dFZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueDsKLQkJCQkJaWYgKGNhcmV0UG9zaXRpb24gPCAwKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlmTm9kZSA9IChOb2RlKSBmU3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oY2FyZXRQb3NpdGlvbik7Ci0JCQkJCWlmIChmTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQl1cGRhdGVEb3VibGVDbGlja0NvdW50KGNhcmV0UG9zaXRpb24pOwotCQkJCQl1cGRhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJdXBkYXRlVGV4dFJlZ2lvbigpOwotCi0JCQkJCWlmIChmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQlwcm9jZXNzVGV4dERvdWJsZUNsaWNrZWQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXByb2Nlc3NFbGVtZW50RG91YmxlQ2xpY2tlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCQlmU3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRXb3JkKFN0cmluZyBzdHJpbmcsIGludCBjdXJzb3IpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCB3b3JkU3RhcnQgPSAwOwotCQlpbnQgd29yZEVuZCA9IHN0cmluZy5sZW5ndGgoKTsKLQotCQl3b3JkU3RhcnQgPSBzdHJpbmcubGFzdEluZGV4T2YoU1BBQ0UsIGN1cnNvciAtIDEpOwotCQlpbnQgdGVtcCA9IHN0cmluZy5sYXN0SW5kZXhPZihTSU5HTEVfUVVPVEUsIGN1cnNvciAtIDEpOwotCQl3b3JkU3RhcnQgPSBNYXRoLm1heCh3b3JkU3RhcnQsIHRlbXApOwotCQl0ZW1wID0gc3RyaW5nLmxhc3RJbmRleE9mKERPVUJMRV9RVU9URSwgY3Vyc29yIC0gMSk7Ci0JCXdvcmRTdGFydCA9IE1hdGgubWF4KHdvcmRTdGFydCwgdGVtcCk7Ci0JCWlmICh3b3JkU3RhcnQgPT0gLTEpIHsKLQkJCXdvcmRTdGFydCA9IGN1cnNvcjsKLQkJfQotCQllbHNlIHsKLQkJCXdvcmRTdGFydCsrOwotCQl9Ci0KLQkJd29yZEVuZCA9IHN0cmluZy5pbmRleE9mKFNQQUNFLCBjdXJzb3IpOwotCQlpZiAod29yZEVuZCA9PSAtMSkgewotCQkJd29yZEVuZCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJfQotCQl0ZW1wID0gc3RyaW5nLmluZGV4T2YoU0lOR0xFX1FVT1RFLCBjdXJzb3IpOwotCQlpZiAodGVtcCA9PSAtMSkgewotCQkJdGVtcCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJfQotCQl3b3JkRW5kID0gTWF0aC5taW4od29yZEVuZCwgdGVtcCk7Ci0JCXRlbXAgPSBzdHJpbmcuaW5kZXhPZihET1VCTEVfUVVPVEUsIGN1cnNvcik7Ci0JCWlmICh0ZW1wID09IC0xKSB7Ci0JCQl0ZW1wID0gc3RyaW5nLmxlbmd0aCgpOwotCQl9Ci0JCXdvcmRFbmQgPSBNYXRoLm1pbih3b3JkRW5kLCB0ZW1wKTsKLQkJaWYgKHdvcmRFbmQgPT0gc3RyaW5nLmxlbmd0aCgpKSB7Ci0JCQl3b3JkRW5kID0gY3Vyc29yOwotCQl9Ci0KLQkJaWYgKCh3b3JkU3RhcnQgPT0gd29yZEVuZCkgJiYgIWlzUXVvdGVkKHN0cmluZykpIHsKLQkJCXdvcmRTdGFydCA9IDA7Ci0JCQl3b3JkRW5kID0gc3RyaW5nLmxlbmd0aCgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBQb2ludCh3b3JkU3RhcnQsIHdvcmRFbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUXVvdGVkKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKChzdHJpbmcgPT0gbnVsbCkgfHwgKHN0cmluZy5sZW5ndGgoKSA8IDIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpbnQgbGFzdEluZGV4ID0gc3RyaW5nLmxlbmd0aCgpIC0gMTsKLQkJY2hhciBmaXJzdENoYXIgPSBzdHJpbmcuY2hhckF0KDApOwotCQljaGFyIGxhc3RDaGFyID0gc3RyaW5nLmNoYXJBdChsYXN0SW5kZXgpOwotCi0JCXJldHVybiAoKChmaXJzdENoYXIgPT0gU0lOR0xFX1FVT1RFKSAmJiAobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFKSkgfHwgKChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKSAmJiAobGFzdENoYXIgPT0gRE9VQkxFX1FVT1RFKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50QXR0ckVxdWFsc0RvdWJsZUNsaWNrZWQyVGltZXMoKSB7Ci0JCWludCBwcmV2UmVnaW9uT2Zmc2V0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbikgLSAxOwotCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwcmV2UmVnaW9uT2Zmc2V0KTsKLQkJaW50IG5leHRSZWdpb25PZmZzZXQgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChmVGV4dFJlZ2lvbik7Ci0JCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5leHRSZWdpb25PZmZzZXQpOwotCi0JCWlmICgocHJldlJlZ2lvbiAhPSBudWxsKSAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSAmJiAobmV4dFJlZ2lvbiAhPSBudWxsKSAmJiAobmV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJldlJlZ2lvbiksIG5leHRSZWdpb24uZ2V0VGV4dEVuZCgpIC0gcHJldlJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50QXR0ck5hbWVEb3VibGVDbGlja2VkMlRpbWVzKCkgewotCQlpbnQgbmV4dFJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KGZUZXh0UmVnaW9uKTsKLQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV4dFJlZ2lvbk9mZnNldCk7Ci0KLQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJbmV4dFJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KG5leHRSZWdpb24pOwotCQkJbmV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV4dFJlZ2lvbk9mZnNldCk7Ci0JCQlpZiAoKG5leHRSZWdpb24gIT0gbnVsbCkgJiYgKG5leHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIG5leHRSZWdpb24uZ2V0VGV4dEVuZCgpIC0gZlRleHRSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlCi0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpLCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQlmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQoKSB7Ci0JCVN0cmluZyByZWdpb25UZXh0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KGZUZXh0UmVnaW9uKTsKLQotCQlpZiAoZkRvdWJsZUNsaWNrQ291bnQgPT0gMSkgewotCQkJUG9pbnQgd29yZCA9IGdldFdvcmQocmVnaW9uVGV4dCwgZkNhcmV0UG9zaXRpb24gLSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSk7Ci0JCQlpZiAod29yZC54ID09IHdvcmQueSkgeyAvLyBubyB3b3JkIGZvdW5kOyBzZWxlY3Qgd2hvbGUgcmVnaW9uCi0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIHJlZ2lvblRleHQubGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSArIHdvcmQueCwgd29yZC55IC0gd29yZC54KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAyKSB7Ci0JCQlpZiAoaXNRdW90ZWQocmVnaW9uVGV4dCkpIHsKLQkJCQkvLyA9PT4gLy8gUG9pbnQgd29yZCA9IGdldFdvcmQocmVnaW9uVGV4dCwgZkNhcmV0UG9zaXRpb24gLQotCQkJCS8vIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pKTsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSwgcmVnaW9uVGV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQyVGltZXMoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAzKSB7Ci0JCQlpZiAoaXNRdW90ZWQocmVnaW9uVGV4dCkpIHsKLQkJCQlwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQyVGltZXMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBmRG91YmxlQ2xpY2tDb3VudCA9PSA0Ci0JCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnRBdHRyVmFsdWVEb3VibGVDbGlja2VkMlRpbWVzKCkgewotCQlpbnQgcHJldlJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pIC0gMTsKLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldlJlZ2lvbk9mZnNldCk7Ci0KLQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCkgewotCQkJcHJldlJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJldlJlZ2lvbikgLSAxOwotCQkJcHJldlJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldlJlZ2lvbk9mZnNldCk7Ci0JCQlpZiAoKHByZXZSZWdpb24gIT0gbnVsbCkgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHByZXZSZWdpb24pLCBmVGV4dFJlZ2lvbi5nZXRUZXh0RW5kKCkgLSBwcmV2UmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnREb3VibGVDbGlja2VkKCkgewotCQlpZiAoZlRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCXByb2Nlc3NFbGVtZW50QXR0clZhbHVlRG91YmxlQ2xpY2tlZCgpOyAvLyBzcGVjaWFsIGhhbmRsaW5nIGZvcgotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDEpIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgKyBmVGV4dFJlZ2lvbi5nZXRTdGFydCgpLCBmVGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSBpZiAoZkRvdWJsZUNsaWNrQ291bnQgPT0gMikgewotCQkJCWlmIChmVGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCXByb2Nlc3NFbGVtZW50QXR0ck5hbWVEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQlwcm9jZXNzRWxlbWVudEF0dHJFcXVhbHNEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQlmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7IC8vIGZEb3VibGVDbGlja0NvdW50ID09IDMKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NUZXh0RG91YmxlQ2xpY2tlZCgpIHsKLQkJaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDEpIHsKLQkJCXN1cGVyLmRvdWJsZUNsaWNrZWQoZlN0cnVjdHVyZWRUZXh0Vmlld2VyKTsKLQotCQkJUG9pbnQgc2VsZWN0ZWRSYW5nZSA9IGZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpZiAoKHNlbGVjdGVkUmFuZ2UueCA9PSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSkgJiYgKHNlbGVjdGVkUmFuZ2UueSA9PSBmVGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpKSB7Ci0JCQkJLy8gb25seSBvbmUgd29yZCBpbiByZWdpb24sIHNraXAgb25lIGxldmVsIG9mIGRvdWJsZSBjbGljawotCQkJCS8vIHNlbGVjdGlvbgotCQkJCWZEb3VibGVDbGlja0NvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZkRvdWJsZUNsaWNrQ291bnQgPT0gMikgewotCQkJaWYgKGZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGlzUXVvdGVkKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoZlRleHRSZWdpb24pKSkgewotCQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSArIDEsIGZUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSAtIDIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIGZUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKChmRG91YmxlQ2xpY2tDb3VudCA9PSAzKSAmJiBpc1F1b3RlZChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KGZUZXh0UmVnaW9uKSkpIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSwgZlRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICgoZkRvdWJsZUNsaWNrQ291bnQgPT0gMykgJiYgaXNRdW90ZWQoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQpKSB7Ci0JCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSArIDEsIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkgLSAyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlmU3RydWN0dXJlZE1vZGVsID0gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURvdWJsZUNsaWNrQ291bnQoaW50IGNhcmV0UG9zaXRpb24pIHsKLQkJaWYgKGZDYXJldFBvc2l0aW9uID09IGNhcmV0UG9zaXRpb24pIHsKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlmRG91YmxlQ2xpY2tDb3VudCsrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAxOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZkNhcmV0UG9zaXRpb24gPSBjYXJldFBvc2l0aW9uOwotCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAxOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZlN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmQ2FyZXRQb3NpdGlvbik7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UZXh0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUZXh0UmVnaW9uKCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlmVGV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZkNhcmV0UG9zaXRpb24pOwotCQkJLy8gaWYgZlRleHRSZWdpb24gaXMgbnVsbCwgaXQgbWVhbnMgd2UgYXJlIGF0IGp1c3QgcGFzdCB0aGUgbGFzdAotCQkJLy8gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkJCS8vIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZG9jdW1lbnQsIHNvIHdlJ2xsIHVzZSB0aGUgbGFzdCB0ZXh0Ci0JCQkvLyByZWdpb24gaW4gdGhlIGRvY3VtZW50Ci0JCQlpZiAoZlRleHRSZWdpb24gPT0gbnVsbCkgewotCQkJCWZUZXh0UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmQ2FyZXRQb3NpdGlvbiAtIDEpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZlRleHRSZWdpb24gPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9DTUltYWdlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9DTUltYWdlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDMyMGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvQ01JbWFnZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIG5zZAotICovCi1wdWJsaWMgY2xhc3MgQ01JbWFnZVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU01BTExfSUNPTl9VUkwgPSAic21hbGwtaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgQ01Ob2RlIGdldERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlDTU5vZGUgZGVjbCA9IG51bGw7Ci0JCU1vZGVsUXVlcnkgbXEgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCW1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoKEF0dHIpIG5vZGUpLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJZGVjbCA9IG1xLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oKEF0dHIpIG5vZGUpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQltcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCWRlY2wgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShDTU5vZGUgY21ub2RlKSB7Ci0JCWlmIChjbW5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpOwotCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIGNhY2hlIENNLXNwZWNpZmllZCBpbWFnZXMgd2l0aCB0aGUgWE1MIFVJIHBsdWdpbgotCQlTdHJpbmcgaW1hZ2VVUkxTdHJpbmcgPSAoU3RyaW5nKSBjbW5vZGUuZ2V0UHJvcGVydHkoU01BTExfSUNPTl9VUkwpOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmICgoaW1hZ2VVUkxTdHJpbmcgIT0gbnVsbCkgJiYgKGltYWdlVVJMU3RyaW5nLmxlbmd0aCgpID4gMCkpIHsKLQkJCWRlc2NyaXB0b3IgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGltYWdlVVJMU3RyaW5nKTsKLQkJCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGltYWdlVVJMU3RyaW5nKTsKLQkJCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gaW1hZ2VVUkwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkJY29ubmVjdGlvbi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQkJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YShpbnB1dFN0cmVhbSk7Ci0JCQkJCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21JbWFnZURhdGEoZGF0YSk7Ci0JCQkJCQlYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoaW1hZ2VVUkxTdHJpbmcsIGRlc2NyaXB0b3IpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIFRoZXJlIHdhcyBhIHByb2JsZW0gbG9hZGluZyBpbWFnZSBmcm9tIHN0cmVhbQotCQkJCQkJICogKGNvcnJ1cHQsIG1pc3NpbmcsIGV0Yy4pCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWRlc2NyaXB0b3IgPSBudWxsOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlkZXNjcmlwdG9yID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDTUltYWdlVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0MDA0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgWE1MIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFhNTFVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gWE1MIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCArIl9zb3VyY2VfSGVscElkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gWE1MIEZpbGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QUkVGV0VCWF9GSUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNjAiOyAvLyROT04tTkxTLTEkCi0JLy8gWE1MIFNvdXJjZSBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUFJFRldFQlhfU09VUkNFX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA2MSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBYTUwgU3R5bGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDYyIjsgLy8kTk9OLU5MUy0xJAotCS8vIFhNTCBUZW1wbGF0ZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNjMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBYTUwgQ2xlYW51cCBkaWFsb2cKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX1hNTF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEyMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBYTUwgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gUFJFRklYICsgInhtbHcwMDEwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjliNmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICogCi0gKiBOT1RFOiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEZvciBpbWFnZXMgdXNlZCBleHRlcm5hbGx5LCBwbGVhc2UgdXNlIHRoZQotICogU2hhcmVkKioqSW1hZ2VIZWxwZXIgY2xhc3MgaW5zdGVhZC4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvLyBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBMVUdJTklEID0gWE1MVUlQbHVnaW4uSUQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUKLQkgKiBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZQotCQkJLy8gcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpIHsKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTM0MDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBYTUwgU291cmNlIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgWE1MRWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9DT05TVFJBSU5PRkYgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9mZi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0NPTlNUUkFJTk9OID0gImljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX1JMREdSTVIgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L3JsZGdybXIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9WQUxJREFURSA9ICJpY29ucy9mdWxsL2R0b29sMTYvdmFsaWRhdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT05TVFJBSU5PRkYgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9mZi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTlNUUkFJTk9OID0gImljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1JMREdSTVIgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L3JsZGdybXIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9WQUxJREFURSA9ICJpY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQUREX0NPUlJFQ1RJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9hZGRfY29ycmVjdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BVFRfUkVRX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2F0dF9yZXFfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQVRUUklCVVRFID0gImljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DREFUQVNFQ1RJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9jZGF0YXNlY3Rpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ09NTUVOVCA9ICJpY29ucy9mdWxsL29iajE2L2NvbW1lbnRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NPUlJFQ1RJT05fQ0hBTkdFID0gImljb25zL2Z1bGwvb2JqMTYvY29ycmVjdGlvbl9jaGFuZ2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRE9DVFlQRSA9ICJpY29ucy9mdWxsL29iajE2L2RvY3R5cGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRFRERklMRSA9ICJpY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VMRU1FTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9FTlRJVFkgPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRU5USVRZX1JFRkVSRU5DRSA9ICJpY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRU5VTSA9ICJpY29ucy9mdWxsL29iajE2L2VudW0uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfTE9DQUxfVkFSSUFCTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9OT1RBVElPTiA9ICJpY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTiA9ICJpY29ucy9mdWxsL29iajE2L3Byb2luc3Rfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NPUlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0dFTkVSSUNfREVFTVBIQVNJWkVEID0gImljb25zL2Z1bGwvb2JqMTYvdGFnX2dlbmVyaWNfZGVlbXBoYXNpemVkX29iai5naWYiOyAvLyROT04tTkxTLTEkICAgIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0dFTkVSSUNfRU1QSEFTSVpFRCA9ICJpY29ucy9mdWxsL29iajE2L3RhZ19nZW5lcmljX2VtcGhhc2l6ZWRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQgICAgICAgIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX01BQ1JPID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLW1hY3JvLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RYVEVYVCA9ICJpY29ucy9mdWxsL29iajE2L3RleHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfV0FSTklOR19PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9YU0RGSUxFID0gImljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT1ZSX0VSUk9SID0gImljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT1ZSX1NUQUxFX0VSUk9SID0gImljb25zL2Z1bGwvb3ZyMTYvc3RhbGVfZXJyb3Jfb3ZyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT1ZSX1dBUk4gPSAiaWNvbnMvZnVsbC9vdnIxNi93YXJuX292ci5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX0dFTkVSQVRFWE1MID0gImljb25zL2Z1bGwvd2l6YmFuL2dlbmVyYXRleG1sX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQWJzdHJhY3RTaWJsaW5nTmF2aWdhdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA1NjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogUHJvdmlkZXMgbmF2aWdhdGlvbiB0byBuZXh0L3ByZXZpb3VzIERPTSBzaWJsaW5nIE5vZGVzCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgc2libGluZyA9IG51bGw7Ci0KLQkJCQkJaWYgKCgoTm9kZSkgbykuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJCQlvID0gKChBdHRyKSBvKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCQlpZiAobW92ZUZvcndhcmQoKSkgewotCQkJCQkJc2libGluZyA9ICgoTm9kZSkgbykuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIHNpYmxpbmcuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlzaWJsaW5nID0gc2libGluZy5nZXROZXh0U2libGluZygpOwotCQkJCQkJfQotCQkJCQkJaWYgKHNpYmxpbmcgPT0gbnVsbCkgewotCQkJCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFBhcmVudE5vZGUoKS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgc2libGluZy5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQlzaWJsaW5nID0gc2libGluZy5nZXROZXh0U2libGluZygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgc2libGluZy5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQkJfQotCQkJCQkJaWYgKHNpYmxpbmcgPT0gbnVsbCkgewotCQkJCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFBhcmVudE5vZGUoKS5nZXRMYXN0Q2hpbGQoKTsKLQkJCQkJCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBzaWJsaW5nLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIFRoZSBvbmx5IGNoaWxkIGlzIGEgVGV4dCBOb2RlLCBnbyB0byB0aGUgcGFyZW50IE5vZGUKLQkJCQkJaWYgKCgoTm9kZSkgbykuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBvLmVxdWFscyhzaWJsaW5nKSkgewotCQkJCQkJc2libGluZyA9ICgoTm9kZSkgbykuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0KLQotCQkJCQlpZiAoc2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQl0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNpYmxpbmcpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlRm9yd2FyZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0FkZEJsb2NrQ29tbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9BZGRCbG9ja0NvbW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NWYzN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0FkZEJsb2NrQ29tbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ29tbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQWRkQmxvY2tDb21tZW50SGFuZGxlciBleHRlbmRzIENvbW1lbnRIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCi0JcHVibGljIEFkZEJsb2NrQ29tbWVudEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jdm9pZCBwcm9jZXNzQWN0aW9uKElUZXh0RWRpdG9yIHRleHRFZGl0b3IsIElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQotCQkJCWlmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICgoc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9PSBudWxsKSAmJiAodGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQkJCXNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMSk7Ci0JCQkJfQotCQkJCWlmIChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBjbG9zZUNvbW1lbnRPZmZzZXQgPSBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCi0JCQkJaWYgKCh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID09IDApICYmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhNTFVJTWVzc2FnZXMuQWRkQmxvY2tDb21tZW50X3Rvb2x0aXApOwotCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJdHJ5IHsKLQkJCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgMCwgT1BFTl9DT01NRU5UKTsKLQkJCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIDAsIENMT1NFX0NPTU1FTlQpOwotCQkJCQlzdXBlci5yZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhkb2N1bWVudCwgb3BlbkNvbW1lbnRPZmZzZXQgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCksIGNsb3NlQ29tbWVudE9mZnNldCAtIG9wZW5Db21tZW50T2Zmc2V0IC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ2xlYW51cGRvY3VtZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NsZWFudXBkb2N1bWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0NmEwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ2xlYW51cGRvY3VtZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLSBidWcgMjEyMzMwIC0KLSAqICAgICAgICAgICAgICAgICAgICBCYXNlZCBvZmYgQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNsZWFudXBQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkNsZWFudXBEaWFsb2dYTUw7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwZG9jdW1lbnRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGZpbmFsVGV4dEVkaXRvciA9IHRleHRFZGl0b3I7Ci0JCQlEaWFsb2cgY2xlYW51cERpYWxvZyA9IG5ldyBDbGVhbnVwRGlhbG9nWE1MKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGZpbmFsVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZmluYWxUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQkJCWNsZWFudXBQcm9jZXNzb3IuY2xlYW51cE1vZGVsKG1vZGVsKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCS8vIFRPRE86IG1ha2UgaW5kZXBlbmRlbnQgb2YgJ21vZGVsJy4KLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQodGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBiZWdpbiByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCi0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnCi0JCQkJCQkvLyBtb2RlbCBjaGFuZ2UKLQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJCQkvLyBydW4KLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHRleHRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBydW5uYWJsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZwotCQkJCQkJLy8gbW9kZWwKLQkJCQkJCS8vIGNoYW5nZQotCQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0KLQkJCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGdldENsZWFudXBQcm9jZXNzb3IoKSB7Ci0JCWlmIChmQ2xlYW51cFByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmQ2xlYW51cFByb2Nlc3NvciA9IG5ldyBDbGVhbnVwUHJvY2Vzc29yWE1MKCk7Ci0JCX0KLQotCQlyZXR1cm4gZkNsZWFudXBQcm9jZXNzb3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NvbGxhcHNlQWxsSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NvbGxhcHNlQWxsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGM2NDRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Db2xsYXBzZUFsbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBDb2xsYXBzZUFsbEhhbmRsZXIgZXh0ZW5kcyBFeHBhbmRDb2xsYXBzZUFsbEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29sbGFwc2VBbGxIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yKGV2ZW50KTsKLQkJCi0JCXZpZXdlciA9IGdldFRhYmxlVHJlZVZpZXdlckZvckVkaXRvclBhcnQoZWRpdG9yUGFydCk7Ci0JCQotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCS8vIHRlbXBvcmFyaWx5IHNldCB0aGUgdmlzaWJpbGl0eSB0byBmYWxzZQotCQkJLy8gdGhpcyBoYXMgYSBIVUdFIHBlcmZvcm1hbmNlIGJlbmVmaXQKLQkJCWJvb2xlYW4gaXNWaXNpYmxlID0gdmlld2VyLmdldENvbnRyb2woKS5nZXRWaXNpYmxlKCk7Ci0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoZmFsc2UpOwotCQkJdmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0KLQkJCS8vIHJlc3RvcmUgdGhlIHByZXZpb3VzIHZpc2liaWxpdHkgc3RhdGUKLQkJCS8vIAotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NvbW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ29tbWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4OGRiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ29tbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMjEyMzMwCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi1wdWJsaWMgY2xhc3MgQ29tbWVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDTE9TRV9DT01NRU5UID0gIi0tPiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fQ09NTUVOVCA9ICI8IS0tIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIENvbW1lbnRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0Q3VycmVudFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlpZiAodGV4dFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHJvY2Vzc0FjdGlvbih0ZXh0RWRpdG9yLCBkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKTsKLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvciwgSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCS8vIEltcGxlbWVudGF0aW9ucyB0byBvdmVyIHJpZGUuCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgYWRqdXN0ZWRfbGVuZ3RoID0gbGVuZ3RoOwotCi0JCQkvLyByZW1vdmUgb3BlbiBjb21tZW50cwotCQkJU3RyaW5nIHN0cmluZyA9IGRvY3VtZW50LmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCQlpbnQgaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoT1BFTl9DT01NRU5UKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCWRvY3VtZW50LnJlcGxhY2Uob2Zmc2V0ICsgaW5kZXgsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoT1BFTl9DT01NRU5ULCBpbmRleCAtIDEpOwotCQkJCWFkanVzdGVkX2xlbmd0aCAtPSBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBjbG9zZSBjb21tZW50cwotCQkJc3RyaW5nID0gZG9jdW1lbnQuZ2V0KG9mZnNldCwgYWRqdXN0ZWRfbGVuZ3RoKTsKLQkJCWluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKENMT1NFX0NPTU1FTlQpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJZG9jdW1lbnQucmVwbGFjZShvZmZzZXQgKyBpbmRleCwgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoQ0xPU0VfQ09NTUVOVCwgaW5kZXggLSAxKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0V4cGFuZEFsbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9FeHBhbmRBbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTEzOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0V4cGFuZEFsbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxUYWJsZVRyZWVWaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHBhbmRBbGxIYW5kbGVyIGV4dGVuZHMgRXhwYW5kQ29sbGFwc2VBbGxIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBYTUxUYWJsZVRyZWVWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBFeHBhbmRBbGxIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCQotCQl2aWV3ZXIgPSBnZXRUYWJsZVRyZWVWaWV3ZXJGb3JFZGl0b3JQYXJ0KGVkaXRvclBhcnQpOwotCQkKLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkvLyB0ZW1wb3JhcmlseSBzZXQgdGhlIHZpc2liaWxpdHkgdG8gZmFsc2UKLQkJCS8vIHRoaXMgaGFzIGEgSFVHRSBwZXJmb3JtYW5jZSBiZW5lZml0Ci0JCQlib29sZWFuIGlzVmlzaWJsZSA9IHZpZXdlci5nZXRDb250cm9sKCkuZ2V0VmlzaWJsZSgpOwotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXZpZXdlci5leHBhbmRBbGwoKTsKLQotCQkJLy8gcmVzdG9yZSB0aGUgcHJldmlvdXMgdmlzaWJpbGl0eSBzdGF0ZQotCQkJLy8gCi0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLQkJfQkJCi0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRXhwYW5kQ29sbGFwc2VBbGxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRXhwYW5kQ29sbGFwc2VBbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDQwZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0V4cGFuZENvbGxhcHNlQWxsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYnVnIDIxMjMzMAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JRWxlbWVudFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubWVudXMuVUlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLklEZXNpZ25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MVGFibGVUcmVlVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kQ29sbGFwc2VBbGxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUVsZW1lbnRVcGRhdGVyIHsKLQotCXByb3RlY3RlZCBYTUxUYWJsZVRyZWVWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbW1hbmQgaGFuZGxlciBmb3IgaGFuZGxpbmcgRXhwYW5kIGFuZCBDb2xsYXBzZSBmb3IgVHJlZSBWaWV3ZXIgCi0JICovCi0JcHVibGljIEV4cGFuZENvbGxhcHNlQWxsSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlciNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gSW1wbGVtZW50b3JzIHRvIHB1dCB0aGVpciBjb2RlIGhlcmUuCi0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhNTFRhYmxlVHJlZVZpZXdlciBnZXRUYWJsZVRyZWVWaWV3ZXJGb3JFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlYTUxUYWJsZVRyZWVWaWV3ZXIgcmVzdWx0ID0gbnVsbDsKLQkJT2JqZWN0IG9iamVjdCA9IHRhcmdldEVkaXRvci5nZXRBZGFwdGVyKElEZXNpZ25WaWV3ZXIuY2xhc3MpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgWE1MVGFibGVUcmVlVmlld2VyKSB7Ci0JCQlyZXN1bHQgPSAoWE1MVGFibGVUcmVlVmlld2VyKSBvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChVSUVsZW1lbnQgZWxlbWVudCwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvTmV4dFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL05leHRTaWJsaW5nTmF2aWdhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1OTUxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvTmV4dFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1wdWJsaWMgY2xhc3MgTmV4dFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U2libGluZ05hdmlnYXRpb25IYW5kbGVyIHsKLQotCXByb3RlY3RlZCBib29sZWFuIG1vdmVGb3J3YXJkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9QcmV2aW91c1NpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1ByZXZpb3VzU2libGluZ05hdmlnYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDJhOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1ByZXZpb3VzU2libGluZ05hdmlnYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLXB1YmxpYyBjbGFzcyBQcmV2aW91c1NpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U2libGluZ05hdmlnYXRpb25IYW5kbGVyIHsKLQotCXByb3RlY3RlZCBib29sZWFuIG1vdmVGb3J3YXJkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvUmVsb2FkRGVwZW5kZW5jaWVzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1JlbG9hZERlcGVuZGVuY2llc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MWExOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvUmVsb2FkRGVwZW5kZW5jaWVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYnVnIDIxMjMzMAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLkNNRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5JbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFJlbG9hZERlcGVuZGVuY2llc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVsb2FkRGVwZW5kZW5jaWVzSGFuZGxlcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlciNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yKGV2ZW50KTsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvcjsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgbyA9IGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCWlmIChvICE9IG51bGwpCi0JCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgbzsKLQkJfQotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCQlEb2N1bWVudCBkb21Eb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlpZiAoKG1vZGVsUXVlcnkgIT0gbnVsbCkgJiYgKG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSkgewotCQkJCQltb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkuZ2V0Q01Eb2N1bWVudENhY2hlKCkuY2xlYXIoKTsKLQkJCQkJLy8gVE9ETy4uLiBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGFjY2VzcyB0aGUKLQkJCQkJLy8gRE9NT2JzZXJ2ZXIgdmlhIE1vZGVsUXVlcnkKLQkJCQkJLy8gLi4ud2h5PwotCQkJCQlDTURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG5ldyBJbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIoZG9tRG9jdW1lbnQsIG1vZGVsUXVlcnkpOwotCQkJCQlsb2FkZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9SZW1vdmVCbG9ja0NvbW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvUmVtb3ZlQmxvY2tDb21tZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA4MGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9SZW1vdmVCbG9ja0NvbW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMjEyMzMwCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQmxvY2tDb21tZW50SGFuZGxlciBleHRlbmRzIENvbW1lbnRIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCi0JcHVibGljIFJlbW92ZUJsb2NrQ29tbWVudEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jdm9pZCBwcm9jZXNzQWN0aW9uKElUZXh0RWRpdG9yIHRleHRFZGl0b3IsIElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQotCQkJCWlmICgoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uID09IG51bGwpIHx8IChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpbnQgb3BlbkNvbW1lbnRPZmZzZXQgPSBzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgY2xvc2VDb21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCk7Ci0KLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLlJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWlmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID09IDApIHsKLQkJCQkJCWlmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSB7Ci0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQotCQkJCQkJaWYgKHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhkb2N1bWVudCwgb3BlbkNvbW1lbnRPZmZzZXQgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCksIGNsb3NlQ29tbWVudE9mZnNldCAtIG9wZW5Db21tZW50T2Zmc2V0IC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQzYjZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlciB7Ci0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCWN1cnNvck5vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChjdXJzb3JOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlpbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQkJfQotCQkJfQotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQotCQkJaWYgKChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSkgewotCQkJCU5vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2Nzg5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdE5leHRYTUxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3ROZXh0WE1MSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJaW50IG9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMTsKLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCW9mZnNldCA9IDA7Ci0JCX0KLQotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCBvZmZzZXQpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmICgoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAoY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJCX0KLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpbnQgY3VycmVudE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgY3VycmVudEVuZE9mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJaWYgKChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0KSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkpIHsKLQkJCQluZXdSZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24yKGluZGV4ZWRSZWdpb24sIHRleHRTZWxlY3Rpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBzZXBhcmF0ZWQgb3V0IGZyb20gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uMiBiZWNhdXNlIHRoZQotCSAqIGNvZGUgaW4gaGVyZSBpcyBhbGxvd2VkIHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhlZFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0U2VsZWN0aW9uCi0JICogQHJldHVybiBuZXcgcmVnaW9uIHRvIHNlbGVjdCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24yKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQkJCU5vZGUgbmV3Tm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQluZXdOb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbjIobmV3SW5kZXhlZFJlZ2lvbiwgbmV3IFRleHRTZWxlY3Rpb24obmV3UmVnaW9uLmdldE9mZnNldCgpLCBuZXdSZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU3NDQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmICgoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAoY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJCX0KLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCWlmICgoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpIHsKLQkJCQlOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQkJbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCi0JCQkJCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkJbmV3UmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24sIG5ldyBUZXh0U2VsZWN0aW9uKG5ld1JlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3UmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvVG9nZ2xlQ29tbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Ub2dnbGVDb21tZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzRmNjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Ub2dnbGVDb21tZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBUb2dnbGVDb21tZW50SGFuZGxlciBleHRlbmRzIENvbW1lbnRIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCXB1YmxpYyBUb2dnbGVDb21tZW50SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIGdldCBjdXJyZW50IHRleHQgc2VsZWN0aW9uCi0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IGdldEN1cnJlbnRTZWxlY3Rpb24odGV4dEVkaXRvcik7Ci0JCQkJaWYgKHRleHRTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXByb2Nlc3NBY3Rpb24odGV4dEVkaXRvciwgZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXZvaWQgcHJvY2Vzc0FjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gZ2V0IHRleHQgc2VsZWN0aW9uIGxpbmVzIGluZm8KLQkJaW50IHNlbGVjdGlvblN0YXJ0TGluZSA9IHRleHRTZWxlY3Rpb24uZ2V0U3RhcnRMaW5lKCk7Ci0JCWludCBzZWxlY3Rpb25FbmRMaW5lID0gdGV4dFNlbGVjdGlvbi5nZXRFbmRMaW5lKCk7Ci0JCXRyeSB7Ci0JCQlpbnQgc2VsZWN0aW9uRW5kTGluZU9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoc2VsZWN0aW9uRW5kTGluZSk7Ci0JCQlpbnQgc2VsZWN0aW9uRW5kT2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCS8vIGFkanVzdCBzZWxlY3Rpb24gZW5kIGxpbmUKLQkJCWlmICgoc2VsZWN0aW9uRW5kTGluZSA+IHNlbGVjdGlvblN0YXJ0TGluZSkgJiYgKHNlbGVjdGlvbkVuZExpbmVPZmZzZXQgPT0gc2VsZWN0aW9uRW5kT2Zmc2V0KSkgewotCQkJCXNlbGVjdGlvbkVuZExpbmUtLTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQkvLyBzYXZlIHRoZSBzZWxlY3Rpb24gcG9zaXRpb24gc2luY2UgaXQgd2lsbCBiZSBjaGFuZ2luZwotCQlQb3NpdGlvbiBzZWxlY3Rpb25Qb3NpdGlvbiA9IG51bGw7Ci0JCWJvb2xlYW4gdXBkYXRlU3RhcnRPZmZzZXQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXNlbGVjdGlvblBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJZG9jdW1lbnQuYWRkUG9zaXRpb24oc2VsZWN0aW9uUG9zaXRpb24pOwotCi0JCQkvLyBleHRyYSBjaGVjayBpZiBjb21tZW50aW5nIGZyb20gYmVnaW5uaW5nIG9mIGxpbmUKLQkJCWludCBzZWxlY3Rpb25TdGFydExpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHNlbGVjdGlvblN0YXJ0TGluZSk7Ci0JCQlpZiAoKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPiAwKSAmJiAoc2VsZWN0aW9uU3RhcnRMaW5lT2Zmc2V0ID09IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmICFpc0NvbW1lbnRMaW5lKGRvY3VtZW50LCBzZWxlY3Rpb25TdGFydExpbmUpKSB7Ci0JCQkJdXBkYXRlU3RhcnRPZmZzZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlwcm9jZXNzQWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb25TdGFydExpbmUsIHNlbGVjdGlvbkVuZExpbmUpOwotCi0JCXVwZGF0ZUN1cnJlbnRTZWxlY3Rpb24odGV4dEVkaXRvciwgc2VsZWN0aW9uUG9zaXRpb24sIGRvY3VtZW50LCB1cGRhdGVTdGFydE9mZnNldCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NBY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc2VsZWN0aW9uU3RhcnRMaW5lLCBpbnQgc2VsZWN0aW9uRW5kTGluZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhNTFVJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCWZvciAoaW50IGkgPSBzZWxlY3Rpb25TdGFydExpbmU7IGkgPD0gc2VsZWN0aW9uRW5kTGluZTsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnQuZ2V0TGluZUxlbmd0aChpKSA+IDApIHsKLQkJCQkJCQlpZiAoaXNDb21tZW50TGluZShkb2N1bWVudCwgaSkpIHsKLQkJCQkJCQkJaW50IGxpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGkpOwotCQkJCQkJCQlJUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQkJCQkJU3RyaW5nIHN0cmluZyA9IGRvY3VtZW50LmdldChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IGxpbmVPZmZzZXQgKyBzdHJpbmcuaW5kZXhPZihPUEVOX0NPTU1FTlQpOwotCQkJCQkJCQlpbnQgY2xvc2VDb21tZW50T2Zmc2V0ID0gbGluZU9mZnNldCArIHN0cmluZy5pbmRleE9mKENMT1NFX0NPTU1FTlQpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJCQkJCQl1bmNvbW1lbnQoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0LCBjbG9zZUNvbW1lbnRPZmZzZXQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChpKTsKLQkJCQkJCQkJaW50IGxpbmVEZWxpbWl0ZXJMZW5ndGggPSBkb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKGkpID09IG51bGwgPyAwIDogZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKS5sZW5ndGgoKTsKLQkJCQkJCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IG9wZW5Db21tZW50T2Zmc2V0ICsgZG9jdW1lbnQuZ2V0TGluZUxlbmd0aChpKSAtIGxpbmVEZWxpbWl0ZXJMZW5ndGggKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0JCQkJCQkJCWNvbW1lbnQoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0LCBjbG9zZUNvbW1lbnRPZmZzZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudExpbmUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgbGluZSkgewotCQlib29sZWFuIGlzQ29tbWVudCA9IGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlJUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsaW5lKTsKLQkJCVN0cmluZyBzdHJpbmcgPSBkb2N1bWVudC5nZXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpLnRyaW0oKTsKLQkJCWlzQ29tbWVudCA9IChzdHJpbmcubGVuZ3RoKCkgPj0gT1BFTl9DT01NRU5ULmxlbmd0aCgpICsgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSkgJiYgc3RyaW5nLnN0YXJ0c1dpdGgoT1BFTl9DT01NRU5UKSAmJiBzdHJpbmcuZW5kc1dpdGgoQ0xPU0VfQ09NTUVOVCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gaXNDb21tZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21tZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9wZW5Db21tZW50T2Zmc2V0LCBpbnQgY2xvc2VDb21tZW50T2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCAwLCBPUEVOX0NPTU1FTlQpOwotCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIDAsIENMT1NFX0NPTU1FTlQpOwotCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5jb21tZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9wZW5Db21tZW50T2Zmc2V0LCBpbnQgY2xvc2VDb21tZW50T2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ3VycmVudFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yLCBQb3NpdGlvbiBzZWxlY3Rpb25Qb3NpdGlvbiwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIHVwZGF0ZVN0YXJ0T2Zmc2V0KSB7Ci0JCS8vIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIGlmIHRleHQgc2VsZWN0aW9uIGNoYW5nZWQKLQkJaWYgKHNlbGVjdGlvblBvc2l0aW9uICE9IG51bGwpIHsKLQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JCQlpZiAodXBkYXRlU3RhcnRPZmZzZXQpIHsKLQkJCQlzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0T2Zmc2V0KCkgLSBPUEVOX0NPTU1FTlQubGVuZ3RoKCksIHNlbGVjdGlvblBvc2l0aW9uLmdldExlbmd0aCgpICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlbGVjdGlvbiA9IG5ldyBUZXh0U2VsZWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlwcm92aWRlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCX0KLQkJCWRvY3VtZW50LnJlbW92ZVBvc2l0aW9uKHNlbGVjdGlvblBvc2l0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Ub2dnbGVFZGl0TW9kZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Ub2dnbGVFZGl0TW9kZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlNGY1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvVG9nZ2xlRWRpdE1vZGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYnVnIDIxMjMzMAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUNvbW1hbmRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklFbGVtZW50VXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5VSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc2VydmljZXMuSVNlcnZpY2VTY29wZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTEVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5TaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLQotcHVibGljIGNsYXNzIFRvZ2dsZUVkaXRNb2RlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIElFbGVtZW50VXBkYXRlciB7Ci0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBvbkltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19FVE9PTF9DT05TVFJBSU5PTik7Ci0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBvZmZJbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRVRPT0xfQ09OU1RSQUlOT0ZGKTsKLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotCi0JcHVibGljIFRvZ2dsZUVkaXRNb2RlSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJCWludCBuZXdTdGF0ZSA9IGdldE5leHRTdGF0ZShtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCkpOwotCQkJCQltb2RlbFF1ZXJ5LnNldEVkaXRNb2RlKG5ld1N0YXRlKTsKLQotCQkJCQkvLyBGb3JjZSBhIFJlZnJlc2ggb24gdGhpcyBjb21tYW5kIHNvIHRoYXQgdGhlIGltYWdlIGNhbgotCQkJCQkvLyBiZQotCQkJCQkvLyB1cGRhdGVkLgotCQkJCQlJQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2UgPSAoSUNvbW1hbmRTZXJ2aWNlKSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coZXZlbnQpLmdldFNlcnZpY2UoSUNvbW1hbmRTZXJ2aWNlLmNsYXNzKTsKLQkJCQkJTWFwIGZpbHRlciA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCWZpbHRlci5wdXQoSVNlcnZpY2VTY29wZXMuV0lORE9XX1NDT1BFLCBIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coZXZlbnQpKTsKLQkJCQkJY29tbWFuZFNlcnZpY2UucmVmcmVzaEVsZW1lbnRzKGV2ZW50LmdldENvbW1hbmQoKS5nZXRJZCgpLCBmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmV4dFN0YXRlKGludCBlZGl0TW9kZSkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWlmIChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpIHsKLQkJCXJlc3VsdCA9IE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vIEhhbmRsZXJzIHRoYXQgbmVlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSB1aSB0aGF0IHRoZSBjb21tYW5kIGNhbWUgZnJvbQotCS8vIG5lZWQgdG8gdXNlIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KFVJRWxlbWVudCBlbGVtZW50LCBNYXAgcGFyYW1ldGVycykgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJCXNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCksIGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShpbnQgZWRpdE1vZGUsIFVJRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpIHsKLQkJCWVsZW1lbnQuc2V0VG9vbHRpcChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zKTsKLQkJCWVsZW1lbnQuc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zKTsKLQkJCWVsZW1lbnQuc2V0SWNvbihvbkltYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCWVsZW1lbnQuc2V0VG9vbHRpcChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81KTsKLQkJCWVsZW1lbnQuc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81KTsKLQkJCWVsZW1lbnQuc2V0SWNvbihvZmZJbWFnZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvWE1MRmluZE9jY3VyZW5jZXNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvWE1MRmluZE9jY3VyZW5jZXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YzI4YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1hNTEZpbmRPY2N1cmVuY2VzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLSBidWcgMjEyMzMwIC0KLSAqICAgICAgICAgICAgICAgICAgICBCYXNlZCBvZmYgQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaC5YTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci0KLXB1YmxpYyBjbGFzcyBYTUxGaW5kT2NjdXJlbmNlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJYm9vbGVhbiBva2F5ID0gZmFsc2U7Ci0KLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IGdldFRleHRTZWxlY3Rpb24odGV4dEVkaXRvcik7Ci0JCQkJRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGZpbmRPY2N1cnJlbmNlUHJvY2Vzc29yID0gZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCQkJaWYgKGZpbmRPY2N1cnJlbmNlUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJaWYgKHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQkJCUlGaWxlIGZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotCQkJCQkJb2theSA9IGZpbmRPY2N1cnJlbmNlUHJvY2Vzc29yLmZpbmRPY2N1cnJlbmNlcyhkb2N1bWVudCwgdGV4dFNlbGVjdGlvbiwgZmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG9rYXkpIHsKLQkJCS8vIGNsZWFyIHN0YXR1cyBtZXNzYWdlCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFNTRVVJTWVzc2FnZXMuRmluZE9jY3VycmVuY2VzQWN0aW9uUHJvdmlkZXJfMDsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29yCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKiBAcGFyYW0gdGV4dFNlbGVjdGlvbgotCSAqIEByZXR1cm4gRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yCi0JICovCi0JcHJpdmF0ZSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gdGhhdCdzIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb24gPSB0ciAhPSBudWxsID8gdHIuZ2V0VHlwZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpdCA9IGdldFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgYWN0aW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYWN0aW9uID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJLy8gd2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IGFjdGlvbiB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJaWYgKGFjdGlvbi5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKHRleHRTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZWdpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJlZ2lvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElUZXh0U2VsZWN0aW9uIGdldFRleHRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiB0ZXh0U2VsZWN0aW9uOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVhNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBodG1sUHJvY2Vzc29yID0gbmV3IFhNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotCQkJZlByb2Nlc3NvcnMuYWRkKGh0bWxQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0NhdGFsb2dFbnRyeUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9DYXRhbG9nRW50cnlIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2ZjEwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0NhdGFsb2dFbnRyeUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuVVJMSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLWNsYXNzIENhdGFsb2dFbnRyeUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCi0JcHJpdmF0ZSBJUmVnaW9uIGZIeXBlcmxpbmtSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSUNhdGFsb2dFbnRyeSBmRW50cnkgPSBudWxsOwotCi0JLyoqCi0JICogQHBhcmFtIGh5cGVybGlua1JlZ2lvbgotCSAqIEBwYXJhbSBlbnRyeQotCSAqLwotCUNhdGFsb2dFbnRyeUh5cGVybGluayhJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiwgSUNhdGFsb2dFbnRyeSBlbnRyeSkgewotCQlzdXBlcigpOwotCQlmSHlwZXJsaW5rUmVnaW9uID0gaHlwZXJsaW5rUmVnaW9uOwotCQlmRW50cnkgPSBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJSHlwZXJsaW5rIGdldEh5cGVybGluaygpIHsKLQkJaWYgKGZFbnRyeS5nZXRVUkkoKS5zdGFydHNXaXRoKCJmaWxlOiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGZIeXBlcmxpbmtSZWdpb24sIG5ldyBGaWxlKGZFbnRyeS5nZXRVUkkoKS5zdWJzdHJpbmcoNSkpKTsKLQkJfQotCQllbHNlIGlmIChmRW50cnkuZ2V0VVJJKCkuc3RhcnRzV2l0aCgicGxhdGZvcm06L3Jlc291cmNlLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmRW50cnkuZ2V0VVJJKCkuc3Vic3RyaW5nKDIwKSk7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQkJcmV0dXJuIG5ldyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKGZIeXBlcmxpbmtSZWdpb24sIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFVSTEh5cGVybGluayhmSHlwZXJsaW5rUmVnaW9uLCBmRW50cnkuZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtSZWdpb24oKQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZIeXBlcmxpbmtSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJSUh5cGVybGluayBsaW5rID0gZ2V0SHlwZXJsaW5rKCk7Ci0JCWlmIChsaW5rICE9IG51bGwpCi0JCQlyZXR1cm4gbGluay5nZXRIeXBlcmxpbmtUZXh0KCk7Ci0JCXJldHVybiBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk9wZW4sIGZFbnRyeS5nZXRLZXkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IGdldEh5cGVybGluaygpOwotCQlpZiAobGluayAhPSBudWxsKQotCQkJcmV0dXJuIGxpbmsuZ2V0VHlwZUxhYmVsKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBnZXRIeXBlcmxpbmsoKTsKLQkJaWYgKGxpbmsgIT0gbnVsbCkKLQkJCWxpbmsub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlODVkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogRWRpdG9ySW5wdXQgZm9yIGV4dGVybmFsIGZpbGVzLiBDb3BpZWQgZnJvbQotICogb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZWRpdG9ycy50ZXh0LkphdmFGaWxlRWRpdG9ySW5wdXQKLSAqLwotY2xhc3MgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQsIElMb2NhdGlvblByb3ZpZGVyIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQkvKioKLQkgKiBUaGUgd29ya2JlbmNoIGFkYXB0ZXIgd2hpY2ggc2ltcGx5IHByb3ZpZGVzIHRoZSBsYWJlbC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFdvcmtiZW5jaEFkYXB0ZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7Ci0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldEltYWdlRGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gKChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgbykuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgRmlsZSBmRmlsZTsKLQlwcml2YXRlIFdvcmtiZW5jaEFkYXB0ZXIgZldvcmtiZW5jaEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoQWRhcHRlcigpOwotCi0JcHVibGljIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KEZpbGUgZmlsZSkgewotCQlzdXBlcigpOwotCQlmRmlsZSA9IGZpbGU7Ci0JCWZXb3JrYmVuY2hBZGFwdGVyID0gbmV3IFdvcmtiZW5jaEFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gZkZpbGUuZXhpc3RzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKLQkgKi8KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUxvY2F0aW9uUHJvdmlkZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlpZiAoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gZldvcmtiZW5jaEFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyI2dldFBhdGgoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBQYXRoLmZyb21PU1N0cmluZyhpbnB1dC5mRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQjZ2V0UGF0aCgpCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCX0KLQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChvIGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvOwotCQkJcmV0dXJuIGZGaWxlLmVxdWFscyhpbnB1dC5mRmlsZSk7Ci0JCX0KLQotCQlpZiAobyBpbnN0YW5jZW9mIElQYXRoRWRpdG9ySW5wdXQpIHsKLQkJCUlQYXRoRWRpdG9ySW5wdXQgaW5wdXQgPSAoSVBhdGhFZGl0b3JJbnB1dCkgbzsKLQkJCXJldHVybiBnZXRQYXRoKCkuZXF1YWxzKGlucHV0LmdldFBhdGgoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmRmlsZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTM1ZmMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgZXh0ZXJuYWwgZmlsZXMuCi0gKi8KLWNsYXNzIEV4dGVybmFsRmlsZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQotCXByaXZhdGUgSVJlZ2lvbiBmSHlwZXJsaW5rUmVnaW9uOwotCXByaXZhdGUgRmlsZSBmSHlwZXJsaW5rRmlsZTsKLQotCXB1YmxpYyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIEZpbGUgZmlsZSkgewotCQlmSHlwZXJsaW5rRmlsZSA9IGZpbGU7Ci0JCWZIeXBlcmxpbmtSZWdpb24gPSByZWdpb247Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZkh5cGVybGlua1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlTdHJpbmcgcGF0aCA9IGZIeXBlcmxpbmtGaWxlLmdldFBhdGgoKTsKLQkJaWYgKHBhdGgubGVuZ3RoKCkgPiA1NSkgewotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIDI1KSArICIuLi4iICsgcGF0aC5zdWJzdHJpbmcocGF0aC5sZW5ndGgoKSAtIDI1LCBwYXRoLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5PcGVuLCBwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZkh5cGVybGlua0ZpbGUgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEV4dGVybmFsRmlsZUVkaXRvcklucHV0KGZIeXBlcmxpbmtGaWxlKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCksIHRydWUpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDIxMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIGZpbGVzIHdpdGhpbiB0aGUgd29ya3NwYWNlLiAoQXMgbG9uZyBhcyB0aGVyZSBpcyBhbiBJRmlsZSwKLSAqIHRoaXMgY2FuIGJlIHVzZWQpIE9wZW5zIHRoZSBkZWZhdWx0IGVkaXRvciBmb3IgdGhlIGZpbGUuCi0gKi8KLWNsYXNzIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIElGaWxlIGZGaWxlOwotCXByaXZhdGUgSVJlZ2lvbiBmSGlnaGxpZ2h0UmFuZ2U7Ci0KLQlwdWJsaWMgV29ya3NwYWNlRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUZpbGUgZmlsZSkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRmlsZSA9IGZpbGU7Ci0JfQotCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUsIElSZWdpb24gcmFuZ2UpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCQlmSGlnaGxpZ2h0UmFuZ2UgPSByYW5nZTsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5PcGVuLCBmRmlsZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmICgoZkZpbGUgIT0gbnVsbCkgJiYgZkZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZGaWxlLCB0cnVlKTsKLQkJCQkvLyBoaWdobGlnaHQgcmFuZ2UgaW4gZWRpdG9yIGlmIHBvc3NpYmxlCi0JCQkJaWYgKChmSGlnaGxpZ2h0UmFuZ2UgIT0gbnVsbCkgJiYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSkgewotCQkJCQkoKElUZXh0RWRpdG9yKSBlZGl0b3IpLnNldEhpZ2hsaWdodFJhbmdlKGZIaWdobGlnaHRSYW5nZS5nZXRPZmZzZXQoKSwgZkhpZ2hsaWdodFJhbmdlLmdldExlbmd0aCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWFiZGMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBEZXRlY3RzIGh5cGVybGlua3MgaW4gWE1MIHRhZ3MuIEluY2x1ZGVzIGRldGVjdGlvbiBpbiBET0NUWVBFIGFuZCBhdHRyaWJ1dGUKLSAqIHZhbHVlcy4gUmVzb2x2ZXMgcmVmZXJlbmNlcyB0byBzY2hlbWFzLCBkdGRzLCBldGMgdXNpbmcgdGhlIENvbW1vbiBVUkkKLSAqIFJlc29sdmVyLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3IgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIE5PX05BTUVTUEFDRV9TQ0hFTUFfTE9DQVRJT04gPSAibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNJX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGh5cGVybGluawotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcGFyYW0gaHlwZXJsaW5rUmVnaW9uCi0JICogQHJldHVybiBJSHlwZXJsaW5rCi0JICovCi0JcHJpdmF0ZSBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhTdHJpbmcgdXJpU3RyaW5nLCBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiwgSURvY3VtZW50IGRvY3VtZW50LCBOb2RlIG5vZGUpIHsKLQkJSUh5cGVybGluayBsaW5rID0gbnVsbDsKLQotCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZ2V0Q2F0YWxvZ0VudHJ5KHVyaVN0cmluZyk7Ci0JCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQlsaW5rID0gbmV3IENhdGFsb2dFbnRyeUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIGVudHJ5KTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJRmlsZSBzeXN0ZW1GaWxlID0gZ2V0RmlsZUZyb21VcmlTdHJpbmcodXJpU3RyaW5nKTsKLQkJCWlmIChzeXN0ZW1GaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc3lzdGVtUGF0aCA9IHN5c3RlbUZpbGUuZ2V0UGF0aCgpOwotCQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHN5c3RlbVBhdGgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyBhIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBleGlzdHMgaW4KLQkJCQkJLy8gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgV29ya3NwYWNlRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIGZpbGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGhpcyBpcyBhbiBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBkb2VzIG5vdAotCQkJCQkvLyBleGlzdCBpbiB3b3Jrc3BhY2UKLQkJCQkJbGluayA9IG5ldyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBzeXN0ZW1GaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsKLQkJLy8gZm9yIG5vdywgb25seSBjYXBhYmxlIG9mIGNyZWF0aW5nIDEgaHlwZXJsaW5rCi0JCUxpc3QgaHlwZXJsaW5rcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJaWYgKChyZWdpb24gIT0gbnVsbCkgJiYgKHRleHRWaWV3ZXIgIT0gbnVsbCkpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCU5vZGUgY3VycmVudE5vZGUgPSBnZXRDdXJyZW50Tm9kZShkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaVN0cmluZyA9IG51bGw7Ci0JCQkJaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkJLy8gZG9jdHlwZSBub2RlcwotCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudE5vZGUsIGRvY3VtZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkvLyBlbGVtZW50IG5vZGVzCi0JCQkJCUF0dHIgY3VycmVudEF0dHIgPSBnZXRDdXJyZW50QXR0ck5vZGUoY3VycmVudE5vZGUsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCWlmIChjdXJyZW50QXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0cnkgdG8gZmluZCBsaW5rIGZvciBjdXJyZW50IGF0dHJpYnV0ZQotCQkJCQkJLy8gcmVzb2x2ZSBhdHRyaWJ1dGUgdmFsdWUKLQkJCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50QXR0ciwgZG9jdW1lbnQpOwotCQkJCQkJLy8gdmVyaWZ5IHZhbGlkaXR5IG9mIHVyaSBzdHJpbmcKLQkJCQkJCWlmICgodXJpU3RyaW5nID09IG51bGwpIHx8ICFpc1ZhbGlkVVJJKHVyaVN0cmluZykpIHsKLQkJCQkJCQkvLyByZXNldCBjdXJyZW50IGF0dHJpYnV0ZQotCQkJCQkJCWN1cnJlbnRBdHRyID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoY3VycmVudEF0dHIgPT0gbnVsbCkgewotCQkJCQkJLy8gdHJ5IHRvIGZpbmQgYSBsaW5rYWJsZSBhdHRyaWJ1dGUgd2l0aGluIGVsZW1lbnQKLQkJCQkJCWN1cnJlbnRBdHRyID0gZ2V0TGlua2FibGVBdHRyKChFbGVtZW50KSBjdXJyZW50Tm9kZSk7Ci0JCQkJCQlpZiAoY3VycmVudEF0dHIgIT0gbnVsbCkgewotCQkJCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50QXR0ciwgZG9jdW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnROb2RlID0gY3VycmVudEF0dHI7Ci0JCQkJfQotCQkJCS8vIHRyeSB0byBjcmVhdGUgaHlwZXJsaW5rIGZyb20gaW5mb3JtYXRpb24gZ2F0aGVyZWQKLQkJCQlpZiAoKHVyaVN0cmluZyAhPSBudWxsKSAmJiAoY3VycmVudE5vZGUgIT0gbnVsbCkgJiYgaXNWYWxpZFVSSSh1cmlTdHJpbmcpKSB7Ci0JCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKGN1cnJlbnROb2RlKTsKLQkJCQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBjcmVhdGVIeXBlcmxpbmsodXJpU3RyaW5nLCBoeXBlcmxpbmtSZWdpb24sIGRvY3VtZW50LCBjdXJyZW50Tm9kZSk7Ci0JCQkJCWlmIChoeXBlcmxpbmsgIT0gbnVsbCkgewotCQkJCQkJaHlwZXJsaW5rcy5hZGQoaHlwZXJsaW5rKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaHlwZXJsaW5rcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwgKGxvY2FsIGZpbGUgc3lzdGVtKQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEJhc2VMb2NhdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJCi0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHJlc3VsdCk7Ci0JCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsICYmIGZpbGUuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQkJCQkJYmFzZUxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoYmFzZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJCXJlc3VsdCA9IGJhc2VMb2NhdGlvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZm9yIGFuIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0KLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJZWQgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG5vZGUgd2l0aGluIG5vZGUgYXQgb2Zmc2V0Ci0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBBdHRyCi0JICovCi0JcHJpdmF0ZSBBdHRyIGdldEN1cnJlbnRBdHRyTm9kZShOb2RlIG5vZGUsIGludCBvZmZzZXQpIHsKLQkJaWYgKChub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5jb250YWlucyhvZmZzZXQpICYmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJLy8gZ28gdGhyb3VnaCBlYWNoIGF0dHJpYnV0ZSBpbiBub2RlIGFuZCBpZiBhdHRyaWJ1dGUgY29udGFpbnMKLQkJCS8vIG9mZnNldCwgcmV0dXJuIHRoYXQgYXR0cmlidXRlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyArK2kpIHsKLQkJCQkvLyBhc3N1bXB0aW9uIHRoYXQgaWYgcGFyZW50IG5vZGUgaXMgb2YgdHlwZSBJbmRleGVkUmVnaW9uLAotCQkJCS8vIHRoZW4gaXRzIGF0dHJpYnV0ZXMgd2lsbCBhbHNvIGJlIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbgotCQkJCUluZGV4ZWRSZWdpb24gYXR0UmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGF0dHJzLml0ZW0oaSk7Ci0JCQkJaWYgKGF0dFJlZ2lvbi5jb250YWlucyhvZmZzZXQpKSB7Ci0JCQkJCXJldHVybiAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbm9kZSB0aGUgY3Vyc29yIGlzIGN1cnJlbnRseSBvbiBpbiB0aGUgZG9jdW1lbnQuIG51bGwgaWYgbm8KLQkgKiBub2RlIGlzIHNlbGVjdGVkCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gTm9kZSBlaXRoZXIgZWxlbWVudCwgZG9jdHlwZSwgdGV4dCwgb3IgbnVsbAotCSAqLwotCXByaXZhdGUgTm9kZSBnZXRDdXJyZW50Tm9kZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJLy8gZ2V0IHRoZSBjdXJyZW50IG5vZGUgYXQgdGhlIG9mZnNldCAocmV0dXJucyBlaXRoZXI6IGVsZW1lbnQsCi0JCS8vIGRvY3R5cGUsIHRleHQpCi0JCUluZGV4ZWRSZWdpb24gaW5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQkJCQlpZiAoaW5vZGUgPT0gbnVsbCkgewotCQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCAtIDEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiAoTm9kZSkgaW5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBJRmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgaWYgcG9zc2libGUsIG51bGwgaWYgY2Fubm90IGZpbmQKLQkgKiBmaWxlIGZyb20gdXJpLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICogICAgICAgICAgICBmaWxlIHN5c3RlbSBwYXRoCi0JICogQHJldHVybiByZXR1cm5zIElGaWxlIGlmIGZpbGVTdHJpbmcgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0KLQkJaWYgKGZpbGVTdHJpbmcgIT0gbnVsbCkgewotCQkJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGZpbGVTdHJpbmcpOwotCQkJaWYgKGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMSAmJiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQl9Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihmaWxlUGF0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgKGkgPCBmaWxlcy5sZW5ndGgpICYmIChmaWxlID09IG51bGwpOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0uZXhpc3RzKCkpIHsKLQkJCQkJZmlsZSA9IGZpbGVzW2ldOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyB1cmlTdHJpbmcgaXMgbm90IGh0dHA6Ly8KLQkgKiBAcmV0dXJuIEZpbGUgY3JlYXRlZCBmcm9tIHVyaVN0cmluZyBpZiBwb3NzaWJsZSwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIEZpbGUgZ2V0RmlsZUZyb21VcmlTdHJpbmcoU3RyaW5nIHVyaVN0cmluZykgewotCQlGaWxlIGZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZmlyc3QganVzdCB0cnkgdG8gY3JlYXRlIGEgZmlsZSBkaXJlY3RseSBmcm9tIHVyaVN0cmluZyBhcwotCQkJLy8gZGVmYXVsdCBpbiBjYXNlIGNyZWF0ZSBmaWxlIGZyb20gdXJpIGRvZXMgbm90IHdvcmsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmlTdHJpbmcpOwotCi0JCQkvLyB0cnkgdG8gY3JlYXRlIGZpbGUgZnJvbSB1cmkKLQkJCVVSSSB1cmkgPSBuZXcgVVJJKHVyaVN0cmluZyk7Ci0JCQlmaWxlID0gbmV3IEZpbGUodXJpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpbGUgdHJ5aW5nIHRvIGNyZWF0ZSBGaWxlIGp1c3QgaWdub3JlCi0JCQkvLyBhbmQgZmlsZSB3aWxsIGJlIG51bGwKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcml2YXRlIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKE5vZGUgbm9kZSkgewotCQlJUmVnaW9uIGh5cGVyUmVnaW9uID0gbnVsbDsKLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCQkJSURPTU5vZGUgZG9jTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24oZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpLCBkb2NOb2RlLmdldEVuZE9mZnNldCgpIC0gZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGVzCi0JCQkJSURPTUF0dHIgYXR0ID0gKElET01BdHRyKSBub2RlOwotCQkJCS8vIGRvIG5vdCBpbmNsdWRlIHF1b3RlcyBpbiBhdHRyaWJ1dGUgdmFsdWUgcmVnaW9uCi0JCQkJaW50IHJlZ09mZnNldCA9IGF0dC5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHQuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgcmVnTGVuZ3RoID0gdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlTdHJpbmcgYXR0VmFsdWUgPSBhdHQuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCWlmIChTdHJpbmdVdGlscy5pc1F1b3RlZChhdHRWYWx1ZSkpIHsKLQkJCQkJCSsrcmVnT2Zmc2V0OwotCQkJCQkJcmVnTGVuZ3RoID0gcmVnTGVuZ3RoIC0gMjsKLQkJCQkJfQotCQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24ocmVnT2Zmc2V0LCByZWdMZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaHlwZXJSZWdpb247Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gZmluZCBhbiBhdHRyaWJ1dGUgd2l0aGluIGVsZW1lbnQgdGhhdCBpcyBvcGVuYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gQXR0ciBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBmb3Igb3BlbiBvbiwgbnVsbCBpZiBubwotCSAqICAgICAgICAgYXR0cmlidXRlIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBBdHRyIGdldExpbmthYmxlQXR0cihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbm9kZQotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGlzIGF0dHJpYnV0ZSBpcyAib3Blbk9uLWFibGUiCi0JCQlBdHRyIGF0dCA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKGlzTGlua2FibGVBdHRyKGF0dCwgZWQpKSB7Ci0JCQkJcmV0dXJuIGF0dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSBsb2NhdGlvbiBoaW50IGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlVVJJIGlmIGl0IGV4aXN0cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Tm9kZSAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIGxvY2F0aW9uIGhpbnQgKHN5c3RlbUlkKSBpZiBpdCB3YXMgZm91bmQsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25IaW50KEVsZW1lbnQgZWxlbWVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJQXR0ciBzY2hlbWFMb2NOb2RlID0gZWxlbWVudE5vZGUuZ2V0QXR0cmlidXRlTm9kZU5TKFhTSV9OQU1FU1BBQ0VfVVJJLCBTQ0hFTUFfTE9DQVRJT04pOwotCQlpZiAoc2NoZW1hTG9jTm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNjaGVtYUxvY05vZGUuZ2V0VmFsdWUoKSk7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHB1YmxpY0lkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCVN0cmluZyBzeXN0ZW1JZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkvLyBmb3VuZCBsb2NhdGlvbiBoaW50Ci0JCQkJaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHNJZ25vcmVDYXNlKHB1YmxpY0lkKSkgewotCQkJCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSSSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VVJJU3RyaW5nKE5vZGUgbm9kZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyByZXNvbHZlZFVSSSA9IG51bGw7Ci0JCS8vIG5lZWQgdGhlIGJhc2UgbG9jYXRpb24sIHB1YmxpY0lkLCBhbmQgc3lzdGVtSWQgZm9yIFVSSVJlc29sdmVyCi0JCVN0cmluZyBiYXNlTG9jID0gbnVsbDsKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQkJU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQliYXNlTG9jID0gZ2V0QmFzZUxvY2F0aW9uKGRvY3VtZW50KTsKLQkJCXB1YmxpY0lkID0gKChEb2N1bWVudFR5cGUpIG5vZGUpLmdldFB1YmxpY0lkKCk7Ci0JCQlzeXN0ZW1JZCA9ICgoRG9jdW1lbnRUeXBlKSBub2RlKS5nZXRTeXN0ZW1JZCgpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZQotCQkJQXR0ciBhdHRyTm9kZSA9IChBdHRyKSBub2RlOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ck5vZGUuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGF0dHJOb2RlLmdldFZhbHVlKCk7Ci0JCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChhdHRyVmFsdWUpOwotCQkJaWYgKChhdHRyVmFsdWUgIT0gbnVsbCkgJiYgKGF0dHJWYWx1ZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJYmFzZUxvYyA9IGdldEJhc2VMb2NhdGlvbihkb2N1bWVudCk7Ci0KLQkJCQkvLyBoYW5kbGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JCQkJU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoYXR0ck5hbWUpOwotCQkJCVN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyTmFtZSk7Ci0JCQkJaWYgKChYTUxOUy5lcXVhbHMocHJlZml4KSkgfHwgKFhNTE5TLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQkJCXB1YmxpY0lkID0gYXR0clZhbHVlOwotCQkJCQlzeXN0ZW1JZCA9IGdldExvY2F0aW9uSGludChhdHRyTm9kZS5nZXRPd25lckVsZW1lbnQoKSwgcHVibGljSWQpOwotCQkJCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkgewotCQkJCQkJc3lzdGVtSWQgPSBhdHRyVmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKFhTSV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhET01OYW1lc3BhY2VIZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKGF0dHJOb2RlKSkpICYmIChTQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpIHsKLQkJCQkJLy8gZm9yIG5vdyBqdXN0IHVzZSB0aGUgZmlyc3QgcGFpcgotCQkJCQkvLyBuZWVkIHRvIGxvb2sgaW50byBiZWluZyBtb3JlIHByZWNpc2UKLQkJCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUpOwotCQkJCQlwdWJsaWNJZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkJc3lzdGVtSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJCS8vIGVsc2UgY2hlY2sgaWYgeG1sbnMgcHVibGljSWQgPSB2YWx1ZQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3lzdGVtSWQgPSBhdHRyVmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmVzb2x2ZWRVUkkgPSByZXNvbHZlVVJJKGJhc2VMb2MsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCXJldHVybiByZXNvbHZlZFVSSTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaXMgb3BlbmFibGUuIEF0dHJpYnV0ZSBpcyBvcGVuYWJsZQotCSAqIGlmIGl0IGlzIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZSBvciBpZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzCi0JICogb2YgdHlwZSBVUkkuCi0JICogCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHBhcmFtIGNtRWxlbWVudAotCSAqICAgICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgKGNhbiBiZQotCSAqICAgICAgICAgICAgbnVsbCkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgIm9wZW5Pbi1hYmxlIiBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNMaW5rYWJsZUF0dHIoQXR0ciBhdHRyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjbUVsZW1lbnQpIHsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCVN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHJOYW1lKTsKLQkJU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJOYW1lKTsKLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSBpcyBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLQkJaWYgKChYTUxOUy5lcXVhbHMocHJlZml4KSkgfHwgKFhNTE5TLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgY29udGFpbnMgc2NoZW1hIGxvY2F0aW9uCi0JCWlmICgoWFNJX05BTUVTUEFDRV9VUkkuZXF1YWxzKERPTU5hbWVzcGFjZUhlbHBlci5nZXROYW1lc3BhY2VVUkkoYXR0cikpKSAmJiAoKFNDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSB8fCAoTk9fTkFNRVNQQUNFX1NDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSB2YWx1ZSBpcyBvZiB0eXBlIFVSSQotCQlpZiAoY21FbGVtZW50ICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGF0dHJEZWNscyA9IGNtRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoYXR0ckRlY2xzKTsKLQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGF0dHIuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KGF0dHIuZ2V0T3duZXJFbGVtZW50KCksIGNtRWxlbWVudCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBub2Rlcy5zaXplKCk7IGsrKykgewotCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJYWxsQXR0cmlidXRlcy5wdXQoY21ub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhdHRyRGVjbHMgPSBhbGxBdHRyaWJ1dGVzOwotCi0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJEZWNscy5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQkJaWYgKChhdHRyRGVjbCAhPSBudWxsKSAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSAmJiAoQ01EYXRhVHlwZS5VUkkuZXF1YWxzKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RGF0YVR5cGVOYW1lKCkpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdXJpU3RyaW5nIGlzIHJlYWxseSBwb2ludGluZyB0byBhIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRVUkkoU3RyaW5nIHVyaVN0cmluZykgewotCQlib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKLQotCQlpZiAoZ2V0Q2F0YWxvZ0VudHJ5KHVyaVN0cmluZykgIT0gbnVsbCkgewotCQkJaXNWYWxpZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRGaWxlRnJvbVVyaVN0cmluZyh1cmlTdHJpbmcpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCWlzVmFsaWQgPSBmaWxlLmlzRmlsZSgpOwotCQkJfQotCQkJaWYoIWlzVmFsaWQpIHsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJQ2F0YWxvZ0VudHJ5IGdldENhdGFsb2dFbnRyeShTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCUlDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJaWYgKGRlZmF1bHRDYXRhbG9nICE9IG51bGwpIHsKLQkJCS8vIFByb2Nlc3MgZGVmYXVsdCBjYXRhbG9nCi0JCQlJQ2F0YWxvZ0VudHJ5W10gZW50cmllcyA9IGRlZmF1bHRDYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQlmb3IgKGludCBlbnRyeSA9IDA7IGVudHJ5IDwgZW50cmllcy5sZW5ndGg7IGVudHJ5KyspIHsKLQkJCQlpZiAodXJpU3RyaW5nLmVxdWFscyhlbnRyaWVzW2VudHJ5XS5nZXRLZXkoKSl8fHVyaVN0cmluZy5lcXVhbHMoZW50cmllc1tlbnRyeV0uZ2V0VVJJKCkpKSB7Ci0JCQkJCXJldHVybiBlbnRyaWVzW2VudHJ5XTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFByb2Nlc3MgZGVjbGFyZWQgT0FTSVMgbmV4dENhdGFsb2dzIGNhdGFsb2cKLQkJCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQkJZm9yIChpbnQgbmV4dENhdGFsb2cgPSAwOyBuZXh0Q2F0YWxvZyA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IG5leHRDYXRhbG9nKyspIHsKLQkJCQlJQ2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW25leHRDYXRhbG9nXS5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJCUlDYXRhbG9nRW50cnlbXSBlbnRyaWVzMiA9IGNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQkJCQlmb3IgKGludCBlbnRyeSA9IDA7IGVudHJ5IDwgZW50cmllczIubGVuZ3RoOyBlbnRyeSsrKSB7Ci0JCQkJCWlmICh1cmlTdHJpbmcuZXF1YWxzKGVudHJpZXMyW2VudHJ5XS5nZXRLZXkoKSl8fHVyaVN0cmluZy5lcXVhbHMoZW50cmllczJbZW50cnldLmdldFVSSSgpKSkKLQkJCQkJCXJldHVybiBlbnRyaWVzMltlbnRyeV07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkkgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUxvY2F0aW9uCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHJldHVybiBTdHJpbmcgcmVzb2x2ZWQgdXJpLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJLy8gZG9udCByZXNvbHZlIGlmIHRoZXJlJ3Mgbm90aGluZyB0byByZXNvbHZlCi0JCWlmICgoYmFzZUxvY2F0aW9uID09IG51bGwpICYmIChwdWJsaWNJZCA9PSBudWxsKSAmJiAoc3lzdGVtSWQgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4MmM0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25BZGROYW1lc3BhY2VzQ29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCWNsYXNzIEVkaXROYW1lc3BhY2VDb250cm9sIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQkJcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JCVRleHQgbG9jYXRpb25IaW50RmllbGQ7Ci0JCVRleHQgcHJlZml4RmllbGQ7Ci0JCVRleHQgdXJpRmllbGQ7Ci0KLQkJLy8gcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gaW5mbzsKLQotCQlwdWJsaWMgRWRpdE5hbWVzcGFjZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7IC8vIEJPUkRFUik7Ci0JCQlzZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9FTlRFUl9SRVFfUFJFRklYX0FORF9OQU1FU1BBQ0UpOwotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCS8vIHJvdyAxCi0JCQkvLwotCQkJTGFiZWwgcHJlZml4TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlwcmVmaXhMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BSRUZJWF9DT0xPTik7Ci0KLQkJCXByZWZpeEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlwcmVmaXhGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCS8vIHByZWZpeEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGluZm8ucHJlZml4KSk7Ci0JCQkvLyBwcmVmaXhGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQkvLyBwcmVmaXhGaWVsZC5zZXRFbmFibGVkKGluZm8uZ2V0UHJvcGVydHkoInByZWZpeC1yZWFkT25seSIpID09Ci0JCQkvLyBudWxsKTsKLQkJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQkJLy8gcm93IDIKLQkJCS8vCi0JCQlMYWJlbCB1cmlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCXVyaUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRVNQQUNFX05BTUVfQ09MT04pOwotCi0JCQl1cmlGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJdXJpRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkvLyB1cmlGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShpbmZvLnVyaSkpOwotCQkJLy8gdXJpRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJLy8gdXJpRmllbGQuc2V0RW5hYmxlZChpbmZvLmdldFByb3BlcnR5KCJ1cmktcmVhZE9ubHkiKSA9PSBudWxsKTsKLQotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCQkvLyByb3cgMwotCQkJLy8KLQkJCUxhYmVsIGxvY2F0aW9uSGludExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbG9jYXRpb25IaW50TGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBVElPTl9ISU5UX0NPTE9OKTsKLQotCQkJbG9jYXRpb25IaW50RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWxvY2F0aW9uSGludEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJLy8gbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoaW5mby5sb2NhdGlvbkhpbnQpKTsKLQkJCS8vIGxvY2F0aW9uSGludEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCS8vIGxvY2F0aW9uSGludEZpZWxkLnNldEVuYWJsZWQoaW5mby5nZXRQcm9wZXJ0eSgibG9jYXRpb25IaW50LXJlYWRPbmx5IikKLQkJCS8vID09IG51bGwpOwotCi0JCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcGVyZm9ybUJyb3dzZSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlicm93c2VCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9CUk9XU0UpOwotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGxvY2F0aW9uSGludEZpZWxkLmdldEVuYWJsZWQoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQnJvd3NlKCkgewotCQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsiLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0JCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyhnZXRTaGVsbCgpLCBleHRlbnNpb25zKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX0ZJTEUpOwotCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gU3RyaW5nIGdyYW1tYXJVUkkgPSBudWxsOwotCQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJCVN0cmluZyBpZCA9IGRpYWxvZy5nZXRJZCgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQkJCWlmIChyZXNvdXJjZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJSVBhdGggbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCXVyaSA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShmaWxlLmdldExvY2F0aW9uKCksIGxvY2F0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLQkgICAgICAgICAgICAgICAgICAgICAgdXJpID0gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKGZpbGUuZ2V0TG9jYXRpb24oKSwgcmVzb3VyY2VMb2NhdGlvbik7Ci0JICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJCQkvLyBncmFtbWFyVVJJID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVyaSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJCQkvLyBncmFtbWFyVVJJID0gdXJpOwotCQkJCQl9Ci0JCQkJCWxvY2F0aW9uSGludEZpZWxkLnNldFRleHQodXJpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaWQgIT0gbnVsbCkgewotCQkJCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRUZXh0KGlkKTsKLQkJCQkJLy8gVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPQotCQkJCQlVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQkJCQkvLyBncmFtbWFyVVJJID0gcmVzb2x2ZXIucmVzb2x2ZShudWxsLCBpZCwgaWQpOwotCQkJCX0KLQotCQkJCXRyeSB7Ci0JCQkJCS8vIFRPRE8gQ01Eb2N1bWVudCBkb2N1bWVudCA9Ci0JCQkJCS8vIENNRG9jdW1lbnRCdWlsZGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5idWlsZENNRG9jdW1lbnQoZ3JhbW1hclVSSSk7Ci0JCQkJCS8vIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPQotCQkJCQkvLyAoTGlzdClkb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25hbWVzcGFjZUluZm8iKTsKLQkJCQkJLy8gTmFtZXNwYWNlSW5mbyBpbmZvID0KLQkJCQkJLy8gKE5hbWVzcGFjZUluZm8pbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApOwotCQkJCQkvLyBpZiAodXJpRmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwICYmIGluZm8udXJpCi0JCQkJCS8vICE9IG51bGwpCi0JCQkJCS8vIHsKLQkJCQkJLy8gdXJpRmllbGQuc2V0VGV4dChpbmZvLnVyaSk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gaWYgKHByZWZpeEZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCAmJgotCQkJCQkvLyBpbmZvLnByZWZpeCAhPSBudWxsKQotCQkJCQkvLyB7Ci0JCQkJCS8vIHByZWZpeEZpZWxkLnNldFRleHQoaW5mby5wcmVmaXgpOwotCQkJCQkvLyB9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgRWRpdE5hbWVzcGFjZUNvbnRyb2wgZWRpdE5hbWVzcGFjZUNvbnRyb2w7Ci0JcHJvdGVjdGVkIGludCBoZWlnaHRIaW50ID0gMjUwOwotCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBCdXR0b24gbmV3QnV0dG9uOwotCXByb3RlY3RlZCBQYWdlQm9vayBwYWdlQm9vazsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJhZGlvMTsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJhZGlvMjsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHRhYmxlU2VjdGlvbjsKLQlwcm90ZWN0ZWQgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBpbnQgd2lkdGhIaW50ID0gNTAwOwotCi0KLQlwdWJsaWMgQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpZiAod2lkdGhIaW50ICE9IC0xKSB7Ci0JCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCX0KLQkJaWYgKGhlaWdodEhpbnQgIT0gLTEpIHsKLQkJCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQl9Ci0JCXNldExheW91dERhdGEoZ2QpOwotCQlzZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJcmFkaW8xID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlyYWRpbzEuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9TRUxFQ1RfUkVHSVNURVJFRF9OQU1FU1BBQ0VTKTsKLQkJcmFkaW8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXJhZGlvMiA9IG5ldyBCdXR0b24odGhpcywgU1dULlJBRElPKTsKLQkJcmFkaW8yLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfU1BFQ0lGWV9ORVdfTkFNRVNQQUNFKTsKLQkJcmFkaW8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCS8vIEdyb3VwIG5hbWVzcGFjZUluZm9Hcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuTk9ORSk7Ci0JCS8vIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRUZXh0KCJOYW1lc3BhY2UgRGVjbGFyYXRpb25zIik7Ci0JCS8vIC8vWE1MQ29tbW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9MQUJFTF9YTUxfU0NIRU1BX0lORk9STUFUSU9OIikpOwotCQkvLyBuYW1lc3BhY2VJbmZvR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCS8vIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQl0YWJsZVNlY3Rpb24gPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0JCXRhYmxlU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRhYmxlU2VjdGlvbiwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX1NFTEVDVF9OQU1FU1BBQ0VfVE9fQUREKTsKLQotCQl0YWJsZVZpZXdlciA9IG5ldyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUodGFibGVTZWN0aW9uLCBTV1QuQ0hFQ0ssIDYpOwotCQllZGl0TmFtZXNwYWNlQ29udHJvbCA9IG5ldyBFZGl0TmFtZXNwYWNlQ29udHJvbChwYWdlQm9vayk7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKHRhYmxlU2VjdGlvbik7Ci0KLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotCX0KLQotCi0KLQlwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocmFkaW8xLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJCWlmIChpdGVtLmdldENoZWNrZWQoKSkgewotCQkJCQlsaXN0LmFkZChpdGVtLmdldERhdGEoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLQkJCWluZm8ucHJlZml4ID0gZWRpdE5hbWVzcGFjZUNvbnRyb2wucHJlZml4RmllbGQuZ2V0VGV4dCgpOwotCQkJaW5mby51cmkgPSBlZGl0TmFtZXNwYWNlQ29udHJvbC51cmlGaWVsZC5nZXRUZXh0KCk7Ci0JCQlpbmZvLmxvY2F0aW9uSGludCA9IGVkaXROYW1lc3BhY2VDb250cm9sLmxvY2F0aW9uSGludEZpZWxkLmdldFRleHQoKTsKLQkJCWxpc3QuYWRkKGluZm8pOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbGlzdCkgewotCQluYW1lc3BhY2VJbmZvTGlzdCA9IGxpc3Q7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHJhZGlvMSkgewotCQkJcGFnZUJvb2suc2hvd1BhZ2UodGFibGVTZWN0aW9uKTsKLQkJfQotCQllbHNlIGlmIChlLndpZGdldCA9PSByYWRpbzIpIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKGVkaXROYW1lc3BhY2VDb250cm9sKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTExM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIENvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sIGFkZE5hbWVzcGFjZXNDb250cm9sOwotCXByb3RlY3RlZCBMaXN0IGV4aXN0aW5nTmFtZXNwYWNlczsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCXByb3RlY3RlZCBIYXNoTWFwIHByZWZlcnJlZFByZWZpeFRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JcHVibGljIENvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbiwgTGlzdCBleGlzdGluZ05hbWVzcGFjZXMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZXhpc3RpbmdOYW1lc3BhY2VzID0gZXhpc3RpbmdOYW1lc3BhY2VzOwotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwgIndzZGwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIsICJzb2FwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iLCAiaHR0cCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiwgIm1pbWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLCAic29hcGVuYyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJzb2FwZW52Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJ4c2QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQnVpbHRJbk5hbWVzcGFjZXMoTGlzdCBsaXN0KSB7Ci0JCVN0cmluZyB4c2lOYW1lc3BhY2UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB4c2ROYW1lc3BhY2UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JCWlmICghaXNBbHJlYWR5RGVjbGFyZWQoeHNpTmFtZXNwYWNlKSkgewotCQkJbGlzdC5hZGQobmV3IE5hbWVzcGFjZUluZm8oImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKCFpc0FscmVhZHlEZWNsYXJlZCh4c2ROYW1lc3BhY2UpKSB7Ci0JCQlsaXN0LmFkZChuZXcgTmFtZXNwYWNlSW5mbygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAieHNkIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENhdGFsb2dNYXBUb0xpc3QoSUNhdGFsb2cgY2F0YWxvZywgTGlzdCBsaXN0KSB7Ci0JCUlDYXRhbG9nRW50cnlbXSBlbnRyaWVzID0gY2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDYXRhbG9nRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJaWYgKChlbnRyeS5nZXRFbnRyeVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDKSAmJiBlbnRyeS5nZXRVUkkoKS5lbmRzV2l0aCgiLnhzZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIWlzQWxyZWFkeURlY2xhcmVkKGVudHJ5LmdldEtleSgpKSkgewotCQkJCQlOYW1lc3BhY2VJbmZvIG5hbWVzcGFjZUluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbyhlbnRyeS5nZXRLZXkoKSwgInh4IiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbGlzdC5hZGQobmFtZXNwYWNlSW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCW5hbWVzcGFjZUluZm9MaXN0ID0gYWRkTmFtZXNwYWNlc0NvbnRyb2wuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21wdXRlQWRkYWJsZVByZWZpeGVzKExpc3QgYWRkYWJsZUxpc3QsIExpc3QgZXhpc2l0aW5nTGlzdCkgewotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGV4aXNpdGluZ0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5wcmVmaXggIT0gbnVsbCkgewotCQkJCW1hcC5wdXQoaW5mby5wcmVmaXgsIGluZm8pOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGFkZGFibGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJaWYgKGluZm8udXJpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgcHJlZmVycmVkUHJlZml4VGFibGUuZ2V0KGluZm8udXJpKTsKLQkJCQlpbmZvLnByZWZpeCA9IGdldFVuaXF1ZVByZWZpeChtYXAsIHByZWZpeCwgaW5mby51cmkpOwotCQkJCW1hcC5wdXQoaW5mby5wcmVmaXgsIGluZm8pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkgewotCQljcmVhdGUoKTsKLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRTaGVsbCgpLmdldEJvdW5kcygpOwotCQlnZXRTaGVsbCgpLnNldEJvdW5kcyhyLnggKyA4MCwgci55ICsgODAsIHIud2lkdGgsIHIuaGVpZ2h0KTsKLQkJc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXJldHVybiBvcGVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJYWRkTmFtZXNwYWNlc0NvbnRyb2wgPSBuZXcgQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2woZGlhbG9nQXJlYSwgU1dULk5PTkUsIHJlc291cmNlTG9jYXRpb24pOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJYWRkQnVpbHRJbk5hbWVzcGFjZXMobGlzdCk7Ci0JCUlDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCUlDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQlpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCUlDYXRhbG9nIHVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJCWFkZENhdGFsb2dNYXBUb0xpc3QodXNlckNhdGFsb2csIGxpc3QpOwotCi0JCQkJfQotCQkJCWVsc2UgaWYgKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCUlDYXRhbG9nIHN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkJYWRkQ2F0YWxvZ01hcFRvTGlzdChzeXN0ZW1DYXRhbG9nLCBsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQljb21wdXRlQWRkYWJsZVByZWZpeGVzKGxpc3QsIGV4aXN0aW5nTmFtZXNwYWNlcyk7Ci0KLQkJYWRkTmFtZXNwYWNlc0NvbnRyb2wuc2V0TmFtZXNwYWNlSW5mb0xpc3QobGlzdCk7Ci0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkgewotCQlyZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlyZXR1cm4gKFN0cmluZykgcHJlZmVycmVkUHJlZml4VGFibGUuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlUHJlZml4KEhhc2hNYXAgcHJlZml4TWFwLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCkgewotCQkJaW50IGxhc3RJbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGxhc3RJbmRleCA9PSB1cmkubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJdXJpID0gdXJpLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpOwotCQkJCWxhc3RJbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotCQkJfQotCQkJcHJlZml4ID0gdXJpLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxKTsKLQkJCWlmICgocHJlZml4Lmxlbmd0aCgpID4gMjApIHx8IChwcmVmaXguaW5kZXhPZignOicpICE9IC0xKSkgewotCQkJCXByZWZpeCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0JCQlwcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocHJlZml4TWFwLmdldChwcmVmaXgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBiYXNlID0gcHJlZml4OwotCQkJZm9yIChpbnQgY291bnQgPSAwOyBwcmVmaXhNYXAuZ2V0KHByZWZpeCkgIT0gbnVsbDsgY291bnQrKykgewotCQkJCXByZWZpeCA9IGJhc2UgKyBjb3VudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWxyZWFkeURlY2xhcmVkKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpID0gZXhpc3RpbmdOYW1lc3BhY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBuYW1lc3BhY2VJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMobmFtZXNwYWNlSW5mby51cmkpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNThjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0TmFtZXNwYWNlSW5mb0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgewotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tbW9uQ29tcG9zaXRlOwotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdEJ1dHRvbjsKLQotCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQlwcm90ZWN0ZWQgaW50IGhlaWdodEhpbnQgPSAyNTA7Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG93TG9jYXRpb25UZXh0ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZUxhYmVsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlIHRhYmxlVmlld2VyOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB0b3BDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlR3JvdXA7Ci0JcHJvdGVjdGVkIGludCB3aWR0aEhpbnQgPSA1MDA7Ci0KLQlwdWJsaWMgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coQ29tcG9zaXRlIHBhcmVudCwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIHN0cmluZ1RhYmxlTGFiZWwpIHsKLQkJdGhpcyhwYXJlbnQsIHJlc291cmNlTG9jYXRpb24sIHN0cmluZ1RhYmxlTGFiZWwsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nKENvbXBvc2l0ZSBwYXJlbnQsIElQYXRoIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyBzdHJpbmdUYWJsZUxhYmVsLCBib29sZWFuIHVzZUdyb3VwLCBib29sZWFuIHNob3dMb2NUZXh0KSB7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCXRhYmxlTGFiZWwgPSBzdHJpbmdUYWJsZUxhYmVsOwotCQl0aGlzLnVzZUdyb3VwID0gdXNlR3JvdXA7Ci0JCXNob3dMb2NhdGlvblRleHQgPSBzaG93TG9jVGV4dDsKLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpZiAod2lkdGhIaW50ICE9IC0xKSB7Ci0JCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCX0KLQkJaWYgKGhlaWdodEhpbnQgIT0gLTEpIHsKLQkJCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQl9Ci0KLQkJLy8gU2V0IEdyaWREYXRhIGFuZCBHcmlkTGF5b3V0IGZvciB0aGUgcGFyZW50IENvbXBvc2l0ZQotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSB0b3AgQ29tcG9zaXRlCi0JCXRvcENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIHRvcERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdG9wRGF0YS5oZWlnaHRIaW50ID0gMDsKLQkJdG9wQ29tcG9zaXRlLnNldExheW91dERhdGEodG9wRGF0YSk7Ci0JCXRvcENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSAnY29tbW9uJy9taWRkbGUgQ29tcG9zaXRlCi0JCWlmICh1c2VHcm91cCkgewotCQkJY29tbW9uQ29tcG9zaXRlID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tbW9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJfQotCQljb21tb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbW1vbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQkvLyBBZGQgdGhlIGVycm9yIE1lc3NhZ2UgTGFiZWwKLQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJY3JlYXRlQ29udHJvbEFyZWEoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCA9PSBuZXdCdXR0b24pIHsKLQkJCQkJcGVyZm9ybU5ldygpOwotCQkJCX0KLQkJCQllbHNlIGlmIChlLndpZGdldCA9PSBlZGl0QnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1FZGl0KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGUud2lkZ2V0ID09IGRlbGV0ZUJ1dHRvbikgewotCQkJCQlwZXJmb3JtRGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB0aHJlZSBidXR0b25zCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShjcmVhdGVIb3Jpem9udGFsRmlsbCgpKTsKLQkJR3JpZExheW91dCBidXR0b25HcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJLy8gYnV0dG9uR3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJLy8gYnV0dG9uR3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkdyaWRMYXlvdXQpOwotCi0JCS8vIGFkZCB0aGUgTmV3IGJ1dHRvbgotCQkvLwotCQluZXdCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkvLyBuZXdCdXR0b24uc2V0VGV4dCgiICIgKwotCQkvLyBYTUxDb21tb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX0JVVFRPTl9ORVciKSArICIgIik7Ci0JCW5ld0J1dHRvbi5zZXRUZXh0KCIgICAiICsgWE1MVUlNZXNzYWdlcy5Db21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZ18wICsgIiAgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCW5ld0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsgLy8gVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0JCW5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJLy8gYWRkIHRoZSBFZGl0IGJ1dHRvbgotCQkvLwotCQkvLyBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkvLyBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gZ2QuRklMTDsKLQkJLy8gZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLQkJZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVkaXRCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fRURJVCk7Ci0JCWVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IC8vIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsKCkpOwotCQllZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBhZGQgdGhlIERlbGV0ZSBidXR0b24KLQkJLy8KLQkJLy8gZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJLy8gZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IGdkLkZJTEw7Ci0JCS8vIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0JCWRlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9ERUxFVEUpOwotCQlkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IC8vIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsKCkpOwotCQlkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9sQXJlYSgpIHsKLQkJaWYgKHVzZUdyb3VwKSB7Ci0JCQkoKEdyb3VwKSBjb21tb25Db21wb3NpdGUpLnNldFRleHQodGFibGVMYWJlbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21tb25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodGFibGVMYWJlbCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKGZhbHNlLCAzKSk7Ci0JCX0KLQotCQl0YWJsZVZpZXdlciA9IG5ldyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoY29tbW9uQ29tcG9zaXRlLCA2LCBzaG93TG9jYXRpb25UZXh0KTsKLQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEodHJ1ZSwgMikpOwotCQljcmVhdGVCdXR0b25zKGNvbW1vbkNvbXBvc2l0ZSk7Ci0KLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotCQl1cGRhdGVCdXR0b25FbmFibGVkU3RhdGUoKTsKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uRW5hYmxlZFN0YXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBHcmlkRGF0YSBjcmVhdGVHcmlkRGF0YShib29sZWFuIGJvdGgsIGludCBzcGFuKSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGJvdGggPyBHcmlkRGF0YS5GSUxMX0JPVEggOiBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXJldHVybiBnZDsKLQl9Ci0KLQlwcml2YXRlIEdyaWREYXRhIGNyZWF0ZUhvcml6b250YWxGaWxsKCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXJldHVybiBnZDsKLQl9Ci0KLQotCi0JcHVibGljIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mbyhTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCU5hbWVzcGFjZUluZm8gcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlpZiAoKGluZm8udXJpICE9IG51bGwpICYmIGluZm8udXJpLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0JCQkJcmVzdWx0ID0gaW5mbzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gZXMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUl0ZXJhdG9yIGkgPSBlcy5pdGVyYXRvcigpOwotCQkJaWYgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJcmVzdWx0ID0gaS5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFVzZSB0aGUgcmV0dXJuZWQgQ29tcG9zaXRlIHRvIGFkZCBjb250ZW50IGFib3ZlIHRoZSAnY29tbW9uIGNvbnRlbnRzJy4KLQkgKiBOb3RlOiBUaGUgR3JpZERhdGEgZm9yIHRoZSByZXR1cm5lZCBDb21wb3NpdGUgaGFzIGEgaGVpZ2h0SGludCA9IDAuCi0JICogVGhpcyBtZWFucyB3aGVuIHVzaW5nIHRoZSByZXR1cm5lZCBDb21wb3NpdGUsIHRoZSBHcmlkRGF0YSBtdXN0IGJlCi0JICogcmVzZXQsIGVsc2UgdGhlIENvbXBvc2l0ZSBhbmQgaXQncyBjb250ZW50cyB3aWxsIG5vdCBhcHBlYXIuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZXRUb3BDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0b3BDb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbykgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nKHNoZWxsLCBpbmZvKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0UmVzb3VyY2VMb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVsYXllZFVwZGF0ZSgpIHsKLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkvKgotCQkgKiBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCSAqIHRhYmxlVmlld2VyLnJlZnJlc2goKTsgfSB9OwotCQkgKiBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0JCSAqLwotCQkvLyBpZiAodXBkYXRlTGlzdGVuZXIgIT0gbnVsbCkKLQkJLy8gewotCQkvLyB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJLy8gfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJbmFtZXNwYWNlSW5mb0xpc3QucmVtb3ZlQWxsKHN0cnVjdHVyZWRTZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdCgpIHsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJaW52b2tlRGlhbG9nKFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT04sIChOYW1lc3BhY2VJbmZvKSBzZWxlY3Rpb24pOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtTmV3KCkgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZyBkaWFsb2cgPSBuZXcgQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZyhzaGVsbCwgWE1MVUlNZXNzYWdlcy5fVUlfQUREX05BTUVTUEFDRV9ERUNMQVJBVElPTlMsIHJlc291cmNlTG9jYXRpb24sIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQluYW1lc3BhY2VJbmZvTGlzdC5hZGRBbGwoZGlhbG9nLmdldE5hbWVzcGFjZUluZm9MaXN0KCkpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpIHsKLQkJbmFtZXNwYWNlSW5mb0xpc3QgPSBsaXN0OwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQnV0dG9uRW5hYmxlZFN0YXRlKCkgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIHNlbGVjdGlvbjsKLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGluZm8gIT0gbnVsbCk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKChpbmZvICE9IG51bGwpICYmIChpbmZvLmdldFByb3BlcnR5KCJ1bnJlbW92YWJsZSIpID09IG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZShMaXN0IG5hbWVzcGFjZUluZm9MaXN0KSB7Ci0JCU5hbWVzcGFjZUluZm9FcnJvckhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyKCk7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBoZWxwZXIuY29tcHV0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCwgbnVsbCk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VQYXRoKElQYXRoIHBhdGgpIHsKLQkgIHJlc291cmNlTG9jYXRpb24gPSBwYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNmQ4NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKgotICogVGhpcyBjbGFzcyBpcyBhbiBleHRlbnNpb24gb2YgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cuIFRoaXMgY2xhc3MgYWRkcwotICogdGhlIHRhcmdldCBuYW1lc3BhY2VzIGRpYWxvZyBmaWVsZC4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2cgZXh0ZW5kcyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyB7Ci0KLQljbGFzcyBUYXJnZXROYW1lc3BhY2VNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQkJdGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlRmllbGQuZ2V0VGV4dCgpOwotCQkJdXBkYXRlVGFyZ2V0TmFtZXNwYWNlQW5kTmFtZXNwYWNlSW5mbyhvbGRUYXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLQlwcm90ZWN0ZWQgVGV4dCB0YXJnZXROYW1lc3BhY2VGaWVsZDsKLQotCXB1YmxpYyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nKENvbXBvc2l0ZSBwYXJlbnQsIElQYXRoIHJlc291cmNlTG9jYXRpb24xKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VMb2NhdGlvbjEsIFhNTFVJTWVzc2FnZXMuX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlMpOwotCi0JCUNvbXBvc2l0ZSB0YXJnZXRDb21wID0gZ2V0VG9wQ29tcG9zaXRlKCk7Ci0JCXRhcmdldENvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJTGFiZWwgdGFyZ2V0TmFtZXNwYWNlTGFiZWwgPSBuZXcgTGFiZWwodGFyZ2V0Q29tcCwgU1dULk5PTkUpOwotCQl0YXJnZXROYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFyZ2V0TmFtZXNwYWNlTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9UQVJHRVRfTkFNRVNQQUNFKTsKLQotCQl0YXJnZXROYW1lc3BhY2VGaWVsZCA9IG5ldyBUZXh0KHRhcmdldENvbXAsIFNXVC5CT1JERVIpOwotCQl0YXJnZXROYW1lc3BhY2VGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGFyZ2V0TmFtZXNwYWNlRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IFRhcmdldE5hbWVzcGFjZU1vZGlmeUxpc3RlbmVyKCkpOwotCi0JCS8vIGNyZWF0ZUNvbnRyb2xBcmVhKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoKSB7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZWRpdFRhcmdldE5hbWVzcGFjZSA9IGZhbHNlOwotCQkJTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbykgc2VsZWN0aW9uOwotCQkJaWYgKGdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhuc0luZm8udXJpKSkgewotCQkJCWVkaXRUYXJnZXROYW1lc3BhY2UgPSB0cnVlOwotCQkJfQotCi0JCQlpbnZva2VEaWFsb2coWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTiwgbnNJbmZvKTsKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCi0JCQlpZiAoZWRpdFRhcmdldE5hbWVzcGFjZSkgewotCQkJCXRhcmdldE5hbWVzcGFjZUZpZWxkLnNldFRleHQobnNJbmZvLnVyaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRoZVRhcmdldE5hbWVzcGFjZSkgewotCQl0YXJnZXROYW1lc3BhY2UgPSB0aGVUYXJnZXROYW1lc3BhY2UgIT0gbnVsbCA/IHRoZVRhcmdldE5hbWVzcGFjZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCXRhcmdldE5hbWVzcGFjZUZpZWxkLnNldFRleHQodGFyZ2V0TmFtZXNwYWNlKTsKLQkJLy8gdXBkYXRlVGFyZ2V0TmFtZXNwYWNlQW5kTmFtZXNwYWNlSW5mbyh0YXJnZXROYW1lc3BhY2UpOwotCX0KLQotCXZvaWQgdXBkYXRlVGFyZ2V0TmFtZXNwYWNlQW5kTmFtZXNwYWNlSW5mbyhTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCU5hbWVzcGFjZUluZm8gaW5mbyA9IGdldE5hbWVzcGFjZUluZm8obmV3VGFyZ2V0TmFtZXNwYWNlKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJaW5mbyA9IGdldE5hbWVzcGFjZUluZm8ob2xkVGFyZ2V0TmFtZXNwYWNlKTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQlpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8obmV3VGFyZ2V0TmFtZXNwYWNlLCAidG5zIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbmZvLnVyaSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJCX0KLQkJfQotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25OYW1lc3BhY2VJbmZvVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTYyZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25OYW1lc3BhY2VJbmZvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlIGV4dGVuZHMgVGFibGVWaWV3ZXIgewotCi0JLyoqCi0JICogTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCVZpZXdlciB2aWV3ZXI7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQkJCWludCBjb2x1bW5Db2RlID0gZ2V0Q29sdW1uQ29kZShjb2x1bW5JbmRleCk7Ci0JCQlpZiAoY29sdW1uQ29kZSA9PSBDT0xVTU5fTE9DQVRJT05fSElOVCkgewotCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvYmplY3Q7Ci0JCQkJaWYgKChpbmZvLmxvY2F0aW9uSGludCA9PSBudWxsKSB8fCBpbmZvLmxvY2F0aW9uSGludC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIENvbW1lbnQgdGhpcyBvdXQgdW50aWwgd2Ugc29sdmUgdGhlIGFsaWdubWVudC8oc3BhY2UKLQkJCQkJLy8gZm9yIGltYWdlIGJlaW5nIGFsbG9jYXRlZAotCQkJCQkvLyB0byBwcmVmaXggY29sdW1uKSAuLi4uLi4KLQkJCQkJLy8gcmVzdWx0ID0KLQkJCQkJLy8gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9XQVJOSU5HX09CSik7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW4pIHsKLQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvYmplY3Q7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWludCBjb2x1bW5Db2RlID0gZ2V0Q29sdW1uQ29kZShjb2x1bW4pOwotCQkJc3dpdGNoIChjb2x1bW5Db2RlKSB7Ci0JCQkJY2FzZSBDT0xVTU5fUFJFRklYIDogewotCQkJCQlyZXN1bHQgPSBpbmZvLnByZWZpeDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ09MVU1OX05BTUVTUEFDRV9VUkkgOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8udXJpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBDT0xVTU5fQ0hFQ0tCT1ggOiB7Ci0JCQkJCXJlc3VsdCA9ICIiOyAvLyBpbmZvLmxvY2F0aW9uSGludDsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBDT0xVTU5fTE9DQVRJT05fSElOVCA6IHsKLQkJCQkJcmVzdWx0ID0gaW5mby5sb2NhdGlvbkhpbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXN1bHQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3dpdGNoIChjb2x1bW5Db2RlKSB7Ci0JCQkJCWNhc2UgQ09MVU1OX1BSRUZJWCA6IHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX05PX1BSRUZJWDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ09MVU1OX05BTUVTUEFDRV9VUkkgOiB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9OT19OQU1FU1BBQ0VfTkFNRTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0JCQlyZXR1cm4gbGlzdCAhPSBudWxsID8gbGlzdC50b0FycmF5KCkgOiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJfQotCX0KLQotCWNsYXNzIFRhYmxlSXRlbUNoZWNrZXIgZXh0ZW5kcyBNb3VzZUFkYXB0ZXIgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGdldFRhYmxlKCkuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvYmo7Ci0JCQkJCVRhYmxlQ29sdW1uIGNvbCA9IGdldFRhYmxlKCkuZ2V0Q29sdW1uKDApOwotCQkJCQlpZiAoZS54IDwgY29sLmdldFdpZHRoKCkpIC8vIGlmIHRoZSBwb2ludCBmYWxscyB3aXRoaW4KLQkJCQkJCQkJCQkJCS8vIHRoZQotCQkJCQkvLyBTZWxlY3QgY29sdW1uIHRoZW4gcGVyZm9ybQotCQkJCQkvLyBjaGVjay91bmNoZWNrCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBjdXJyZW50U3RhdGUgPSAoU3RyaW5nKSBpbmZvLmdldFByb3BlcnR5KCJjaGVja2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3VycmVudFN0YXRlIiArIGN1cnJlbnRTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICgoY3VycmVudFN0YXRlID09IG51bGwpIHx8IGN1cnJlbnRTdGF0ZS5lcXVhbHMoImZhbHNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQlpbmZvLnNldFByb3BlcnR5KCJjaGVja2VkIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpbmZvLnNldFByb3BlcnR5KCJjaGVja2VkIiwgImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NIRUNLQk9YID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTE9DQVRJT05fSElOVCA9IDQ7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX05BTUVTUEFDRV9VUkkgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9QUkVGSVggPSAzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfQ0hFQ0tCT1ggPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0xPQ0FUSU9OX0hJTlQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBVElPTl9ISU5UOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX05BTUVTUEFDRV9VUkkgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9QUkVGSVggPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9QUkVGSVg7Ci0JcHJvdGVjdGVkIExpc3QgY2hlY2tlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgaW50W10gY29sdW1uSW5kZXhNYXA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0NoZWNrQm94ZXMgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBzaG93TG9jYXRpb25UZXh0ID0gZmFsc2U7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByb3RlY3RlZCBpbnQgdmlzaWJsZVJvd3MgPSAtMTsKLQotCXB1YmxpYyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzKSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSLCB2aXNpYmxlUm93cywgZmFsc2UpOwotCX0KLQotCS8vIHByb3RlY3RlZCBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoaW50IGNvbHVtbikKLQkvLyB7Ci0JLy8gcmV0dXJuIChjb2x1bW4gPT0gQ09MVU1OX0NIRUNLQk9YKSA/IGNoZWNrQm94Q2VsbEVkaXRvciA6Ci0JLy8gdGV4dENlbGxFZGl0b3I7Ci0JLy8gfQotCi0JcHVibGljIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgdmlzaWJsZVJvd3MsIGJvb2xlYW4gc2hvd0xvY2F0aW9uVGV4dCkgewotCQl0aGlzKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiwgdmlzaWJsZVJvd3MsIHNob3dMb2NhdGlvblRleHQpOwotCX0KLQotCXB1YmxpYyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgdmlzaWJsZVJvd3MpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBzdHlsZSwgdmlzaWJsZVJvd3MsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IHZpc2libGVSb3dzLCBib29sZWFuIHNob3dMb2NhdGlvblRleHQpIHsKLQkJc3VwZXIobmV3IFRhYmxlKHBhcmVudCwgc3R5bGUpKTsKLQkJZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRoaXMuc2hvd0NoZWNrQm94ZXMgPSAoc3R5bGUgJiBTV1QuQ0hFQ0spICE9IDA7Ci0JCWNvbHVtbkluZGV4TWFwID0gY3JlYXRlQ29sdW1uSW5kZXhNYXAoKTsKLQkJdGhpcy5zaG93TG9jYXRpb25UZXh0ID0gc2hvd0xvY2F0aW9uVGV4dDsKLQotCQlQcm92aWRlciBwcm92aWRlciA9IG5ldyBQcm92aWRlcigpOwotCQlzZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQlzZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotCQlTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkgPSBjcmVhdGVDb2x1bW5Qcm9wZXJ0aWVzQXJyYXkoKTsKLQkJc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkpOwotCi0JCXRhYmxlID0gZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQlpZiAoKGNvbHVtblByb3BlcnRpZXNBcnJheVtpXSkuZXF1YWxzKExBQkVMX0xPQ0FUSU9OX0hJTlQpKSB7Ci0JCQkJaWYgKHNob3dMb2NhdGlvblRleHQpIHsKLQkJCQkJY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc0FycmF5W2ldKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIENvbW1lbnQgdGhpcyBvdXQgdW50aWwgd2Ugc29sdmUgdGhlIGFsaWdubWVudC8oc3BhY2UKLQkJCQkJLy8gZm9yIGltYWdlIGJlaW5nIGFsbG9jYXRlZAotCQkJCQkvLyB0byBwcmVmaXggY29sdW1uKSAuLi4uLi4KLQkJCQkJLy8gY29sdW1uLnNldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc0FycmF5W2ldKTsKLQkJCX0KLQkJCWNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoZ2V0Q29sdW1uV2lkdGgoaSksIHRydWUpKTsKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0aGlzLnZpc2libGVSb3dzID0gdmlzaWJsZVJvd3M7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZVJvd3M7IGkrKykKLQkJLy8gewotCQkvLyBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJLy8gaXRlbS5zZXRUZXh0KCIjIyMjIyMjIik7Ci0JCS8vIH0KLQkJLy8gY2hlY2tCb3hDZWxsRWRpdG9yID0gbmV3IE5hbWVzcGFjZUluZm9DaGVja2JveENlbGxFZGl0b3IodGFibGUpOwotCQkvLyB0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0KLQkJLyoKLQkJICogQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3Ci0JCSAqIENlbGxFZGl0b3JbY29sdW1uUHJvcGVydGllc0FycmF5Lmxlbmd0aF07IGZvciAoaW50IGkgPSAwOyBpIDwKLQkJICogY29sdW1uUHJvcGVydGllc0FycmF5Lmxlbmd0aDsgaSsrKSB7IGNlbGxFZGl0b3JzW2ldID0KLQkJICogZ2V0Q2VsbEVkaXRvcihpKTsgfSBzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JCSAqLwotCQkvLyBpZiAoc2hvd0NoZWNrQm94ZXMpCi0JCS8vIHsKLQkJLy8gZ2V0VGFibGUoKS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBUYWJsZUl0ZW1DaGVja2VyKCkpOwotCQkvLyB9Ci0JfQotCi0JLy8gcHJvdGVjdGVkIENlbGxFZGl0b3IgY2hlY2tCb3hDZWxsRWRpdG9yOwotCS8vIHByb3RlY3RlZCBDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yOwotCi0JcHJvdGVjdGVkIGludFtdIGNyZWF0ZUNvbHVtbkluZGV4TWFwKCkgewotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W3Nob3dDaGVja0JveGVzID8gNCA6IDNdOwotCQlpbnQgaSA9IDA7Ci0JCWlmIChzaG93Q2hlY2tCb3hlcykgewotCQkJcmVzdWx0W2krK10gPSBDT0xVTU5fQ0hFQ0tCT1g7Ci0JCX0KLQkJcmVzdWx0W2krK10gPSBDT0xVTU5fUFJFRklYOwotCQlyZXN1bHRbaSsrXSA9IENPTFVNTl9OQU1FU1BBQ0VfVVJJOwotCQlpZiAoIXNob3dDaGVja0JveGVzKSB7Ci0JCQlyZXN1bHRbaSsrXSA9IENPTFVNTl9MT0NBVElPTl9ISU5UOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNyZWF0ZUNvbHVtblByb3BlcnRpZXNBcnJheSgpIHsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1szXTsKLQkJaW50IGkgPSAwOwotCQlpZiAoc2hvd0NoZWNrQm94ZXMpIHsKLQkJCXJlc3VsdFtpKytdID0gTEFCRUxfQ0hFQ0tCT1g7Ci0JCX0KLQkJcmVzdWx0W2krK10gPSBMQUJFTF9QUkVGSVg7Ci0JCXJlc3VsdFtpKytdID0gTEFCRUxfTkFNRVNQQUNFX1VSSTsKLQkJaWYgKCFzaG93Q2hlY2tCb3hlcykgewotCQkJcmVzdWx0W2krK10gPSBMQUJFTF9MT0NBVElPTl9ISU5UOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRDb2x1bW5Db2RlKGludCBjb2x1bW4pIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChjb2x1bW4gPCBjb2x1bW5JbmRleE1hcC5sZW5ndGgpIHsKLQkJCXJlc3VsdCA9IGNvbHVtbkluZGV4TWFwW2NvbHVtbl07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldENvbHVtbldpZHRoKGludCBjb2x1bW4pIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCXN3aXRjaCAoZ2V0Q29sdW1uQ29kZShjb2x1bW4pKSB7Ci0JCQljYXNlIENPTFVNTl9QUkVGSVggOiB7Ci0JCQkJcmVzdWx0ID0gNTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQ09MVU1OX05BTUVTUEFDRV9VUkkgOiB7Ci0JCQkJLy8gU2l6ZSBjb2x1bW5zIGRpZmZlcmVudGx5IHdoZW4gbG9jYXRpb24gaGludCB0ZXh0IGxhYmVsIGlzCi0JCQkJLy8gZGlzcGxheWVkCi0JCQkJaWYgKHNob3dMb2NhdGlvblRleHQpIHsKLQkJCQkJcmVzdWx0ID0gMTA7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSAyMDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIENPTFVNTl9DSEVDS0JPWCA6IHsKLQkJCQlyZXN1bHQgPSAxOyAvLyBpbmZvLmxvY2F0aW9uSGludDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQ09MVU1OX0xPQ0FUSU9OX0hJTlQgOiB7Ci0JCQkJLy8gU2l6ZSBjb2x1bW5zIGRpZmZlcmVudGx5IHdoZW4gbG9jYXRpb24gaGludCB0ZXh0IGxhYmVsIGlzCi0JCQkJLy8gZGlzcGxheWVkCi0JCQkJaWYgKHNob3dMb2NhdGlvblRleHQpIHsKLQkJCQkJcmVzdWx0ID0gMTA7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSAyOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKgotCSAqIHByb3RlY3RlZCBjbGFzcyBOYW1lc3BhY2VJbmZvQ2VsbE1vZGlmaWVyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllciB7Ci0JICogcHVibGljIE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIoKSB7IH0KLQkgKiAKLQkgKiBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeyBpZgotCSAqIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfQ0hFQ0tCT1gpKSB7IHJldHVybiB0cnVlOyB9IGVsc2UgaWYKLQkgKiAocHJvcGVydHkuZXF1YWxzKExBQkVMX1BSRUZJWCkpIHsgcmV0dXJuIHRydWU7IH0gcmV0dXJuIGZhbHNlOyB9Ci0JICogCi0JICogcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7IGludCBjb2x1bW4gPQotCSAqIDA7IGlmIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfQ0hFQ0tCT1gpKSB7IGNvbHVtbiA9IDA7IH0gZWxzZSBpZgotCSAqIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfUFJFRklYKSkgeyBjb2x1bW4gPSAxOyB9IGVsc2UgaWYKLQkgKiAocHJvcGVydHkuZXF1YWxzKExBQkVMX05BTUVTUEFDRV9VUkkpKSB7IGNvbHVtbiA9IDI7IH0KLQkgKiAKLQkgKiAvL2lmIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KSAvL3sgLy8gcmV0dXJuCi0JICogcHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlbGVtZW50LCBjb2x1bW4pOyAvL30gLy9lbHNlIC8veyAvLyByZXR1cm4gbnVsbDsgLy8gfQotCSAqIHJldHVybiAiaGVsbG8iOyB9Ci0JICogCi0JICogcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgeyB9IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb0NoZWNrYm94Q2VsbEVkaXRvciBleHRlbmRzCi0JICogQ2hlY2tib3hDZWxsRWRpdG9yIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lciB7IHB1YmxpYwotCSAqIE5hbWVzcGFjZUluZm9DaGVja2JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgeyBzdXBlcihwYXJlbnQpOyB9Ci0JICogCi0JICogcHJvdGVjdGVkIHZvaWQgZG9TZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsgfQotCSAqIAotCSAqIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgeyBzdXBlci5hY3RpdmF0ZSgpOyBkZWFjdGl2YXRlKCk7Ci0JICogRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Rm9jdXNDb250cm9sKCkucmVkcmF3KCk7IH0KLQkgKiAKLQkgKiBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7IGlmIChnZXRUYWJsZSgpLmdldEl0ZW0obmV3Ci0JICogUG9pbnQoZS54LCBlLnkpKSAhPSBudWxsKSB7IH0gfSBwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQKLQkgKiBlKSB7IH0gcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsgfSB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODcwNjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVtcHR5RmlsZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wOyAKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJLy8gc29tZSB0aGVtZXMgb24gR1RLIGhhdmUgZGlmZmVyZW50IGJhY2tncm91bmQgY29sb3JzIGZvciBUZXh0IGFuZCBMYWJlbHMKLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQl0ZXh0LnNldFRleHQoZGVzY3JpcHRpb24pOwotCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBzY3JvbGxiYXJzIGZvciB0aGlzIHBhcmVudCB3aGVuIG5lZWRlZAotCQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlzYzEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUoc2MxLCAxKTsKLQkJc2MxLnNldENvbnRlbnQoY29tcG9zaXRlKTsKLQotCQkvLyBub3QgY2FsbGluZyBzZXRTaXplIGZvciBjb21wb3NpdGUgd2lsbCByZXN1bHQgaW4gYSBibGFuayBjb21wb3NpdGUsCi0JCS8vIHNvIGNhbGxpbmcgaXQgaGVyZSBpbml0aWFsbHkKLQkJLy8gc2V0U2l6ZSBhY3R1YWxseSBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGNvbnRyb2xzIGFyZSBjcmVhdGVkLAotCQkvLyBzbyBzY3JvbGxlZENvbXBvc2l0ZQotCQkvLyBoYXMgY29ycmVjdCBtaW5TaXplCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJCS8vIE5vdGU6IFRoZSBmb250IGlzIHNldCBoZXJlIGluIGFudGljaXBhdGlvbiB0aGF0IHRoZSBjbGFzcyBpbmhlcml0aW5nCi0JCQkvLyAgICAgICB0aGlzIGJhc2UgY2xhc3MgbWF5IGFkZCB3aWRnZXRzIHRvIHRoZSBkaWFsb2cuICAgc2V0U2l6ZQotCQkJLy8gICAgICAgaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQganVzdCBiZWZvcmUgd2UgZ28gbGl2ZS4KLQkJCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkJUG9pbnQgbWluU2l6ZSA9IGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJY29tcG9zaXRlLnNldFNpemUobWluU2l6ZSk7Ci0JCQkvLyBzZXQgc2Nyb2xsYmFyIGNvbXBvc2l0ZSdzIG1pbiBzaXplIHNvIHBhZ2UgaXMgZXhwYW5kYWJsZSBidXQKLQkJCS8vIGhhcyBzY3JvbGxiYXJzIHdoZW4gbmVlZGVkCi0JCQlpZiAoY29tcG9zaXRlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsKLQkJCQlTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSAoU2Nyb2xsZWRDb21wb3NpdGUpIGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQkJCQlzYzEuc2V0TWluU2l6ZShtaW5TaXplKTsKLQkJCQlzYzEuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkJCQlzYzEuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW5jb2RpbmdTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VuY29kaW5nU2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiYmQ1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW5jb2RpbmdTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEVuY29kaW5nU2V0dGluZ3MgaXMgYSBjb21wb3NpdGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBzZXQgb2YKLSAqIGVuY29kaW5nIHZhbHVlcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIuIFRoZSBsaXN0IG9mIGVuY29kaW5nIHZhbHVlcwotICogaXMgYmFzZWQgb2ZmIHRoZSBTdXBwb3J0ZWRKYXZhRW5jb2RpbmcgY2xhc3MuIEFzIHRoZSB1c2VyIHNlbGVjdHMgYW4KLSAqIGVuY29kaW5nIGZyb20gdGhlIGNvbWJvIGJveCwgdGhlIHJlYWRvbmx5IGZpZWxkIGJlbG93IGl0IGNoYW5nZXMgdG8gc2hvdwotICogdGhlIElBTkEgdGFnIGZvciB0aGF0IHBhcnRpY3VsYXIgZW5jb2RpbmcgZGVzY3JpcHRpb24uIFRoZSBsYWJlbHMgZm9yIHRoZQotICogd2lkZ2V0cyBhcmUgY29uZmlndXJhYmxlIGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyIGNhbgotICogYmUgc2V0IHVzaW5nIHRoZSBzZXRJQU5BVGFnKCkuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW50cnkncyBJQU5BIHRhZyBjYW4KLSAqIGJlIHJldHJpZXZlZCB3aXRoIGdldElBTkFUYWcoKS4gRW50cmllcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgY2FuIGJlIGFkZGVkCi0gKiBhbmQgcmVtb3ZlZC4KLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nU2V0dGluZ3MgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JcHJpdmF0ZSBjbGFzcyBDb21ib0xpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWludCBpID0gZW5jb2RpbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJaWYgKChpID49IDApICYmIChpIDwgaWFuYVZlY3Rvci5zaXplKCkpKSB7Ci0JCQkJaWFuYVRleHQuc2V0VGV4dCgoU3RyaW5nKSAoaWFuYVZlY3Rvci5lbGVtZW50QXQoZW5jb2RpbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEVOQ09ESU5HX0xBQkVMID0gWE1MVUlNZXNzYWdlcy5FbmNvZGluZ1NldHRpbmdzXzE7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUFOQV9MQUJFTCA9IFhNTFVJTWVzc2FnZXMuRW5jb2RpbmdTZXR0aW5nc18wOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyID0gbmV3IENvbWJvTGlzdGVuZXIoKTsKLQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdDb21ibzsKLQlwcm90ZWN0ZWQgTGFiZWwgZW5jb2RpbmdMYWJlbCwgaWFuYUxhYmVsOwotCXByb3RlY3RlZCBUZXh0IGlhbmFUZXh0OwotCXByb3RlY3RlZCBWZWN0b3IgaWFuYVZlY3RvcjsKLQotCS8qKgotCSAqIE1ldGhvZCBFbmNvZGluZ1NldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdTZXR0aW5ncyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlpbml0KElBTkFfTEFCRUwsIEVOQ09ESU5HX0xBQkVMKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgRW5jb2RpbmdTZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVuY29kaW5nTGFiZWwgLQotCSAqICAgICAgICAgICAgdGV4dCBsYWJlbCB0byB1c2UgYmVzaWRlIHRoZSBsb2NhbGUgc2Vuc2l0aXZlIGRlc2NyaXB0aW9uIG9mCi0JICogICAgICAgICAgICB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVuY29kaW5nCi0JICovCi0JcHVibGljIEVuY29kaW5nU2V0dGluZ3MoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGVuY29kaW5nTGFiZWwpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWluaXQoSUFOQV9MQUJFTCwgZW5jb2RpbmdMYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIEVuY29kaW5nU2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBpYW5hTGFiZWwgPQotCSAqICAgICAgICAgICAgdGV4dCBsYWJlbCB0byB1c2UgYmVzaWRlIHRoZSBkaXNwbGF5IG9ubHkgSUFOQSBmaWVsZAotCSAqIEBwYXJhbSBlbmNvZGluZ0xhYmVsIC0KLQkgKiAgICAgICAgICAgIHRleHQgbGFiZWwgdG8gdXNlIGJlc2lkZSB0aGUgbG9jYWxlIHNlbnNpdGl2ZSBkZXNjcmlwdGlvbiBvZgotCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbmNvZGluZwotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1NldHRpbmdzKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBpYW5hTGFiZWwsIFN0cmluZyBlbmNvZGluZ0xhYmVsKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlpbml0KGlhbmFMYWJlbCwgZW5jb2RpbmdMYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFkZEVudHJ5LiBBZGQgYW4gZW50cnkgdG8gdGhlIGVuZCBvZiB0aGUgRW5jb2RpbmcgQ29tYm9ib3gKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gLQotCSAqICAgICAgICAgICAgZW5jb2RpbmcgZGVzY3JpcHRpb24gdG8gZGlzcGxheQotCSAqIEBwYXJhbSBpYW5hVGFnIC0KLQkgKiAgICAgICAgICAgIElBTkEgdGFnIGZvciB0aGUgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBpYW5hVGFnKSB7Ci0JCWVuY29kaW5nQ29tYm8uYWRkKGRlc2NyaXB0aW9uKTsKLQkJaWFuYVZlY3Rvci5hZGQoaWFuYVRhZyk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFkZEVudHJ5LiBBZGQgYW4gZW50cnkgdG8gdGhlIEVuY29kaW5nIENvbWJvYm94IGF0IGluZGV4IGluZGV4Ci0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIC0KLQkgKiAgICAgICAgICAgIGVuY29kaW5nIGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkKLQkgKiBAcGFyYW0gaWFuYVRhZyAtCi0JICogICAgICAgICAgICBJQU5BIHRhZyBmb3IgdGhlIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGluZGV4IC0KLQkgKiAgICAgICAgICAgIGluZGV4IGludG8gdGhlIGNvbWJvIHRvIGFkZCB0bwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIGlhbmFUYWcsIGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPT0gaWFuYVZlY3Rvci5zaXplKCkpIHsKLQkJCS8vIGp1c3QgYWRkIHRvIHRoZSBlbmQKLQkJCWFkZEVudHJ5KGRlc2NyaXB0aW9uLCBpYW5hVGFnKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgoMCA8PSBpbmRleCkgJiYgKGluZGV4IDwgaWFuYVZlY3Rvci5zaXplKCkpKSB7Ci0JCQllbmNvZGluZ0NvbWJvLmFkZChkZXNjcmlwdGlvbiwgaW5kZXgpOwotCQkJaWFuYVZlY3Rvci5hZGQoaW5kZXgsIGlhbmFUYWcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQlpbnQgc3R5bGUgPSBpc1JlYWRPbmx5ID09IHRydWUgPyBTV1QuUkVBRF9PTkxZIDogU1dULkRST1BfRE9XTjsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBsYWJlbHMuCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgpIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZW5jb2RpbmdDb21iby5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsQ29tYm8oKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdbXSBpYW5hVGFncyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRDb21tb25DaGFyc2V0TmFtZXMoKTsKLQkJCWludCB0b3RhbE51bSA9IGlhbmFUYWdzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxOdW07IGkrKykgewotCQkJCVN0cmluZyBpYW5hID0gaWFuYVRhZ3NbaV07Ci0JCQkJU3RyaW5nIGVuYyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXREaXNwbGF5U3RyaW5nKGlhbmEpOwotCi0JCQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQkJCWVuY29kaW5nQ29tYm8uYWRkKGVuYyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQ29tbW9uQ2hhcnNldE5hbWVzLmdldERpc3BsYXlTdHJpbmcoIiArIGlhbmEgKyAiKSByZXR1cm5lZCBudWxsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQllbmNvZGluZ0NvbWJvLmFkZChpYW5hKTsKLQkJCQl9Ci0JCQkJaWFuYVZlY3Rvci5hZGQoaWFuYSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJLy8gTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIlJlc291cmNlIGV4Y2VwdGlvbiIsCi0JCQkvLyAiVW5hYmxlIHRvIG9idGFpbiBlbmNvZGluZyBzdHJpbmdzLiBDaGVjayByZXNvdXJjZSBmaWxlIik7Ci0JCQkvLyBYTUxFbmNvZGluZ1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZShlLnRvU3RyaW5nKCkpOwotCQkJLy8gWE1MRW5jb2RpbmdQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGVDdXJyZW50VGhyZWFkKCk7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5nZXRFbmNvZGluZzwvY29kZT4gR2V0IHRoZSBkZXNjcmlwdGl2ZSBlbmNvZGluZyBuYW1lIHRoYXQgd2FzCi0JICogc2VsZWN0ZWQuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gZW5jb2RpbmdDb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldEVuY29kaW5nQ29tYm8uIFJldHVybnMgdGhlIGNvbWJvIHVzZWQgdG8gZGlzcGxheSB0aGUgZW5jb2RpbmcKLQkgKiBkZXNjcmlwdGlvbnMuCi0JICogCi0JICogQHJldHVybiBDb21ibwotCSAqLwotCXB1YmxpYyBDb21ibyBnZXRFbmNvZGluZ0NvbWJvKCkgewotCQlyZXR1cm4gZW5jb2RpbmdDb21ibzsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5nZXRJQU5BVGFnPC9jb2RlPiBHZXQgdGhlIElBTkEgdGFnIGVxdWl2YWxlbnQgb2YgdGhlIHNlbGVjdGVkCi0JICogZGVzY3JpcHRpdmUgZW5jb2RpbmcgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJQU5BVGFnKCkgewotCQlpbnQgaSA9IGVuY29kaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJcmV0dXJuIChTdHJpbmcpIChpYW5hVmVjdG9yLmVsZW1lbnRBdChpKSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChTdHJpbmcgaWFuYUxhYmVsU3RyLCBTdHJpbmcgZW5jb2RpbmdMYWJlbFN0cikgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZW5jb2RpbmdMYWJlbCA9IGNyZWF0ZUxhYmVsKHRoaXMsIGVuY29kaW5nTGFiZWxTdHIpOwotCQllbmNvZGluZ0NvbWJvID0gY3JlYXRlQ29tYm9Cb3godGhpcywgdHJ1ZSk7Ci0JCWlhbmFMYWJlbCA9IGNyZWF0ZUxhYmVsKHRoaXMsIGlhbmFMYWJlbFN0cik7Ci0JCWlhbmFUZXh0ID0gY3JlYXRlVGV4dEZpZWxkKHRoaXMsIDIwKTsKLQkJaWFuYVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQotCQlmaWxsQ29tYm8oKTsKLQkJcmVzZXRUb0RlZmF1bHRFbmNvZGluZygpOwotCQllbmNvZGluZ0NvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmlzRW5jb2RpbmdJbkxpc3Q8L2NvZGU+IENoZWNrcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBuYW1lIGlzIGluCi0JICogdGhlIGNvbWJvCi0JICogCi0JICogQHBhcmFtIGVuYwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBUaGUgZW5jb2RpbmcgbmFtZS4KLQkgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuIFRSVUUgaWYgZW5jb2RpbmcgaXMgaW4gbGlzdC4KLQkgKiAgICAgICAgIEZBTFNFIGlmIGVuY29kaW5nIGlzIG5vdCBpbiBsaXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5jb2RpbmdJbkxpc3QoU3RyaW5nIGVuYykgewotCQlpbnQgaSA9IGVuY29kaW5nQ29tYm8uaW5kZXhPZihlbmMpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+aXNJQU5BVGFnSW5MaXN0PC9jb2RlPiBDaGVja3Mgd2hldGhlciB0aGUgSUFOQSB0YWcgaXMgaW4gdGhlCi0JICogY29tYm8KLQkgKiAKLQkgKiBAcGFyYW0gaWFuYVRhZwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBUaGUgSUFOQSB0YWcuCi0JICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLiBUUlVFIGlmIHRhZyBpcyBpbiBsaXN0LiBGQUxTRQotCSAqICAgICAgICAgaWYgdGFnIGlzIG5vdCBpbiBsaXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSUFOQVRhZ0luTGlzdChTdHJpbmcgaWFuYVRhZykgewotCQlpbnQgaSA9IGlhbmFWZWN0b3IuaW5kZXhPZihpYW5hVGFnKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCByZW1vdmVFbnRyeS4gUmVtb3ZlcyBib3RoIHRoZSBkZXNjcmlwdGlvbiBhbmQgdGhlIElBTkEgdGFnIGF0Ci0JICogdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5KGludCBpbmRleCkgewotCQlpZiAoKDAgPD0gaW5kZXgpICYmIChpbmRleCA8IGlhbmFWZWN0b3Iuc2l6ZSgpKSkgewotCQkJZW5jb2RpbmdDb21iby5yZW1vdmUoaW5kZXgpOwotCQkJaWFuYVZlY3Rvci5yZW1vdmUoaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHJlc2V0VG9EZWZhdWx0RW5jb2RpbmcuIFJlc2V0IHRoZSBjb250cm9sIHRvIHRoZSBkZWZhdWx0Ci0JICogZW5jb2RpbmcuIEN1cnJlbnRseSBVVEYtOAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0VG9EZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCVN0cmluZyBkZWZhdWx0SUFOQVRhZyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJaWFuYVRleHQuc2V0VGV4dChkZWZhdWx0SUFOQVRhZyk7Ci0JCXNldElBTkFUYWcoZGVmYXVsdElBTkFUYWcpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZXRFbmFibGVkLiBFbmFibGUvZGlzYWJsZSB0aGUgRW5jb2RpbmdTZXR0aW5ncyBjb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQllbmNvZGluZ0NvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWVuY29kaW5nTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJaWFuYUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWlhbmFUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+c2V0RW5jb2Rpbmc8L2NvZGU+IFNldCB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb21ibyB0byB0aGUKLQkgKiBkZXNjcmlwdGl2ZSBlbmNvZGluZyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBlbmMKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+c3RyaW5nPC9jb2RlPiB2YWx1ZS4gTm90ZSB0aGlzIGlzIG5vdCB0aGUgSUFOQQotCSAqICAgICAgICAgICAgdGFnLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmMpIHsKLQkJZW5jb2RpbmdDb21iby5zZXRUZXh0KGVuYyk7Ci0JCWVuY29kaW5nQ29tYm8uc2VsZWN0KGVuY29kaW5nQ29tYm8uaW5kZXhPZihlbmMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5zZXRJQU5BVGFnPC9jb2RlPiBTZXQgdGhlIElBTkEgdGFnIGZvciB0aGUgY29tYm8KLQkgKiAKLQkgKiBAcGFyYW0gaWFuYVRhZwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBUaGUgSUFOQSB0YWcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUFOQVRhZyhTdHJpbmcgaWFuYVRhZykgewotCQlpbnQgaSA9IGlhbmFWZWN0b3IuaW5kZXhPZihpYW5hVGFnKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJZW5jb2RpbmdDb21iby5zZWxlY3QoaSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Xb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1dvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTMwZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1dvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzIGlzIGFuIGV4dGVuc2lvbiBvZiBFbmNvZGluZ1NldHRpbmdzLiBUaGlzCi0gKiBjb21wb3NpdGUgY29udGFpbnMgRW5jb2RpbmdTZXR0aW5ncyBmb3IgdXNlcnMgdG8gc2VsZWN0IHRoZSBlbmNvZGluZyB0aGV5Ci0gKiBkZXNpcmUgYXMgd2VsbCBhcyBhIGNoZWNrYm94IGZvciB1c2VycyB0byBzZWxlY3QgdG8gdXNlIHRoZSBkZWZhdWx0Ci0gKiB3b3JrYmVuY2ggZW5jb2RpbmcgaW5zdGVhZC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVuY29kaW5nU2V0dGluZ3MKLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBJTkRFTlQgPSAxNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0JFTkNIX0RFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRW5jb2RpbmdTZXR0aW5ncyBmRW5jb2RpbmdTZXR0aW5nczsKLQlwcml2YXRlIFN0cmluZyBmTm9uRGVmYXVsdElBTkEgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGZVc2VEZWZhdWx0QnV0dG9uOwotCi0JcHVibGljIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNyZWF0ZUNvbnRyb2xzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRyb2xzKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGRlZmF1bHRFbmNvZGluZ0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkZWZhdWx0RW5jb2RpbmdDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRlZmF1bHRFbmNvZGluZ0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZVc2VEZWZhdWx0QnV0dG9uID0gbmV3IEJ1dHRvbihkZWZhdWx0RW5jb2RpbmdDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZVc2VEZWZhdWx0QnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Xb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5nc18wKTsKLQotCQlmVXNlRGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVVc2VEZWZhdWx0QnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZkVuY29kaW5nU2V0dGluZ3MgPSBuZXcgRW5jb2RpbmdTZXR0aW5ncyh0aGlzKTsKLQkJKChHcmlkTGF5b3V0KSBmRW5jb2RpbmdTZXR0aW5ncy5nZXRMYXlvdXQoKSkubWFyZ2luV2lkdGggPSAwOwotCQkoKEdyaWREYXRhKSBmRW5jb2RpbmdTZXR0aW5ncy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxJbmRlbnQgPSBJTkRFTlQ7Ci0KLQl9Ci0KLQlwcml2YXRlIENvbWJvIGdldEVuY29kaW5nQ29tYm8oKSB7Ci0JCXJldHVybiBmRW5jb2RpbmdTZXR0aW5ncy5nZXRFbmNvZGluZ0NvbWJvKCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Z2V0SUFOQVRhZzwvY29kZT4gR2V0IHRoZSBJQU5BIHRhZyBlcXVpdmFsZW50IG9mIHRoZSBzZWxlY3RlZAotCSAqIGRlc2NyaXB0aXZlIGVuY29kaW5nIG5hbWUuIFJldHVybnMgZW1wdHkgc3RyaW5nIGlmIHVzaW5nIHdvcmtiZW5jaAotCSAqIGVuY29kaW5nLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJQU5BVGFnKCkgewotCQlpZiAoIWlzRGVmYXVsdCgpKSB7Ci0JCQlyZXR1cm4gZkVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpOwotCQl9Ci0JCXJldHVybiBXT1JLQkVOQ0hfREVGQVVMVDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRXb3JrYmVuY2hFbmNvZGluZygpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCX0KLQotCXZvaWQgaGFuZGxlVXNlRGVmYXVsdEJ1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoZlVzZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWZOb25EZWZhdWx0SUFOQSA9IGZFbmNvZGluZ1NldHRpbmdzLmdldElBTkFUYWcoKTsKLQkJCVN0cmluZyB3b3JrYmVuY2hWYWx1ZSA9IGdldFdvcmtiZW5jaEVuY29kaW5nKCk7Ci0JCQl3b3JrYmVuY2hWYWx1ZSA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRJYW5hUHJlZmVycmVkQ2hhcnNldE5hbWUod29ya2JlbmNoVmFsdWUpOwotCQkJZkVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyh3b3JrYmVuY2hWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZk5vbkRlZmF1bHRJQU5BICE9IG51bGwpIHsKLQkJCWZFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoZk5vbkRlZmF1bHRJQU5BKTsKLQkJfQotCQlnZXRFbmNvZGluZ0NvbWJvKCkuc2V0RW5hYmxlZCghZlVzZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlmRW5jb2RpbmdTZXR0aW5ncy5zZXRFbmFibGVkKCFmVXNlRGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGZVc2VEZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPnNldEVuY29kaW5nPC9jb2RlPiBTZXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29tYm8gdG8gdGhlCi0JICogZGVzY3JpcHRpdmUgZW5jb2RpbmcgbmFtZS4gU2VsZWN0cyB1c2Ugd29ya2JlbmNoIGVuY29kaW5nIGlmIGlhbmFUYWcgaXMKLQkgKiBudWxsIG9yIGVtcHR5IHN0cmluZy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJQU5BVGFnKFN0cmluZyBpYW5hVGFnKSB7Ci0JCWlmICgoaWFuYVRhZyA9PSBudWxsKSB8fCBpYW5hVGFnLmVxdWFscyhXT1JLQkVOQ0hfREVGQVVMVCkpIHsKLQkJCWZVc2VEZWZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWhhbmRsZVVzZURlZmF1bHRCdXR0b25TZWxlY3RlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZlVzZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWhhbmRsZVVzZURlZmF1bHRCdXR0b25TZWxlY3RlZCgpOwotCQkJaWYgKCFpc0RlZmF1bHQoKSkgewotCQkJCWZFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoaWFuYVRhZyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjlkNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb2xvclBhZ2UgZXh0ZW5kcyBBYnN0cmFjdENvbG9yUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCSgoR3JpZERhdGEpIHBhZ2VDb21wb25lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCi0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhZ2VDb21wb25lbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsIElIZWxwQ29udGV4dElkcy5YTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQkJSXRlcmF0b3IgaSA9IHN0eWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTYW1wbGVUZXh0KCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5TYW1wbGVfWE1MX2RvYzsgLy8gPSAiPD94bWwKLQkJLy8gdmVyc2lvbj1cIjEuMFwiPz5cbjw/Y3VzdG9tUHJvY2Vzc2luZ0luc3RydWN0aW9uXG5cdFhNTAotCQkvLyBwcm9jZXNzb3IKLQkJLy8gc3BlY2lmaWNcblx0Y29udGVudAotCQkvLyA/PlxuPCFET0NUWVBFCi0JCS8vIGNvbG9yc1xuXHRQVUJMSUMKLQkJLy8gXCIvL0lCTS9YTUwvQ09MT1JTL1wiCi0JCS8vIFwiY29sb3JzLmR0ZFwiPlxuPGNvbG9ycz5cblx0PCEtLQotCQkvLyBiZWdpbiBjb2xvciBkZWZpbml0aW9ucwotCQkvLyAtLT5cblx0PGNvbG9yCi0JCS8vIG5hbWU9XCJwbGFpbnRleHRcIgotCQkvLyBmb3JlZ3JvdW5kPVwiIzAwMDAwMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNENEQwQzhcIi8+XG5cdDxjb2xvcgotCQkvLyBuYW1lPVwiYm9sZFwiCi0JCS8vIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0IzQUNBMFwiPlxuXHQ8IVtDREFUQVs8MTIzNDU2Nzg5Pl1dPlxuXHROb3JtYWwKLQkJLy8gdGV4dCBjb250ZW50LlxuXHQ8Y29sb3IKLQkJLy8gbmFtZT1cImludmVyc2VcIgotCQkvLyBmb3JlZ3JvdW5kPVwiI0YwRjBGMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNENEQwQzhcIi8+XG5cbjwvY29sb3JzPlxuIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29tbW9uQ29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QRV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbW1vbkRlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbnMgZm9yIGhpbGlnaHRpbmcgdHlwZXMKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIFhNTFVJTWVzc2FnZXMuQ29tbWVudF9EZWxpbWl0ZXJzX1VJXyk7IC8vID0KLQkJLy8gIkNvbW1lbnQKLQkJLy8gRGVsaW1pdGVycyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfQ29udGVudF9VSV8pOyAvLyA9Ci0JCS8vICJDb21tZW50Ci0JCS8vIENvbnRlbnQiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIFhNTFVJTWVzc2FnZXMuVGFnX0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQkvLyAiVGFnCi0JCS8vIERlbGltaXRlcnMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLCBYTUxVSU1lc3NhZ2VzLlRhZ19OYW1lc19VSV8pOyAvLyA9Ci0JCS8vICJUYWcKLQkJLy8gTmFtZXMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfTmFtZXNfVUlfKTsgLy8gPQotCQkvLyAiQXR0cmlidXRlCi0JCS8vIE5hbWVzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9WYWx1ZXNfVUlfKTsgLy8gPQotCQkvLyAiQXR0cmlidXRlCi0JCS8vIFZhbHVlcyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIsIFhNTFVJTWVzc2FnZXMuRGVjbGFyYXRpb25fRGVsaW1pdGVyc19VSV8pOyAvLyA9Ci0JCS8vICJEZWNsYXJhdGlvbgotCQkvLyBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCwgWE1MVUlNZXNzYWdlcy5Db250ZW50X1VJXyk7IC8vID0KLQkJLy8gIkNvbnRlbnQiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UsIFhNTFVJTWVzc2FnZXMuRW50aXR5X1JlZmVyZW5jZV9VSV8pOyAvLyROT04tTkxTLTEkID0gIkVudGl0eSBSZWZlcmVuY2VzIgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb21tb25TdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQotCQkvLyBsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJLy8gbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQkvLyBsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJLy8gbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCi0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJaW5pdENvbW1vbkNvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlpbml0RG9jVHlwZUNvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5ULCBJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCi0JCWluaXRDb21tb25EZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJaW5pdERvY1R5cGVEZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNEQVRBX0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQkvLyAiQ0RBVEEKLQkJLy8gRGVsaW1pdGVycyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCwgWE1MVUlNZXNzYWdlcy5DREFUQV9Db250ZW50X1VJXyk7IC8vID0KLQkJLy8gIkNEQVRBCi0JCS8vIENvbnRlbnQiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0RlbF9VSV8pOyAvLyA9Ci0JCS8vICJQcm9jZXNzaW5nCi0JCS8vIEluc3RydWN0aW9uCi0JCS8vIERlbGltaXRlcnMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQsIFhNTFVJTWVzc2FnZXMuUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9Db25fVUlfX1VJXyk7IC8vID0KLQkJLy8gIlByb2Nlc3NpbmcKLQkJLy8gSW5zdHJ1Y3Rpb24KLQkJLy8gQ29udGVudCIKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RG9jVHlwZUNvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUMsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREb2NUeXBlRGVzY3JpcHRpb25zKERpY3Rpb25hcnkgZGVzY3JpcHRpb25zKSB7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9ucyBmb3IgaGlsaWdodGluZyB0eXBlcyBmb3IgRE9DVFlQRSByZWxhdGVkIGl0ZW1zCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX05hbWVfVUlfKTsgLy8gPQotCQkvLyAiRE9DVFlQRQotCQkvLyBOYW1lIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfU1lTVEVNX1BVQkxJQ19LZXl3X1VJXyk7IC8vID0KLQkJLy8gIkRPQ1RZUEUKLQkJLy8gU1lTVEVNL1BVQkxJQwotCQkvLyBLZXl3b3JkIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1B1YmxpY19SZWZlcmVuY2VfVUlfKTsgLy8gPQotCQkvLyAiRE9DVFlQRQotCQkvLyBQdWJsaWMKLQkJLy8gUmVmZXJlbmNlIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1N5c3RlbV9SZWZlcmVuY2VfVUlfKTsgLy8gPQotCQkvLyAiRE9DVFlQRQotCQkvLyBTeXN0ZW0KLQkJLy8gUmVmZXJlbmNlIgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREb2NUeXBlU3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0KLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0JCWluaXRDb21tb25TdHlsZUxpc3QobGlzdCk7Ci0JCWluaXREb2NUeXBlU3R5bGVMaXN0KGxpc3QpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJLy8gcmVxdWlyZWQgc2luY2UgdGhlIHN1cGVyY2xhc3MgKnJlbW92ZXMqIGV4aXN0aW5nIHByZWZlcmVuY2VzIGJlZm9yZQotCQkvLyBzYXZpbmcgaXRzIG93bgotCQlzdXBlci5wZXJmb3JtT2soKTsKLQotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldHVwUGlja2VyKFN0eWxlZFRleHRDb2xvclBpY2tlciBwaWNrZXIpIHsKLQkJSU1vZGVsTWFuYWdlciBtbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXBpY2tlci5zZXRQYXJzZXIobW1hbmFnZXIuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpLmdldFBhcnNlcigpKTsKLQotCQlEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCi0JCURpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCXBpY2tlci5zZXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJcGlja2VyLnNldERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlwaWNrZXIuc2V0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmM2NjMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBbMjA1OTg5XSAtIFt2YWxpZGF0aW9uXSB2YWxpZGF0ZSBYTUwgYWZ0ZXIgWEluY2x1ZGUgcmVzb2x1dGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi1wdWJsaWMgY2xhc3MgWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgewotCXByb3RlY3RlZCBFbmNvZGluZ1NldHRpbmdzIGZFbmNvZGluZ1NldHRpbmdzID0gbnVsbDsKLQotCXByaXZhdGUgQ29tYm8gZkRlZmF1bHRTdWZmaXggPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQlwcml2YXRlIENvbWJvIGZJbmRpY2F0ZU5vR3JhbW1hciA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZlVzZVhpbmNsdWRlID0gbnVsbDsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQgCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gaXRlbXMpIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIHRydWUpOwotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCQljcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JWYWxpZGF0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgY3JlYXRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWNyZWF0aW5nR3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNyZWF0aW5nX2ZpbGVzKTsKLQotCQkvLyBEZWZhdWx0IGV4dGVuc2lvbiBmb3IgTmV3IGZpbGUgV2l6YXJkCi0JCWNyZWF0ZUxhYmVsKGNyZWF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbCk7Ci0JCWZEZWZhdWx0U3VmZml4ID0gY3JlYXRlRHJvcERvd25Cb3goY3JlYXRpbmdHcm91cCk7Ci0JCVN0cmluZ1tdIHZhbGlkRXh0ZW5zaW9ucyA9IChTdHJpbmdbXSkgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQkJQXJyYXlzLnNvcnQodmFsaWRFeHRlbnNpb25zKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0SXRlbXModmFsaWRFeHRlbnNpb25zKTsKLQkJZkRlZmF1bHRTdWZmaXguYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbChjcmVhdGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkVuY29kaW5nX2Rlc2MpOwotCQkoKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkVuY29kaW5nU2V0dGluZ3MgPSBuZXcgRW5jb2RpbmdTZXR0aW5ncyhjcmVhdGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkVuY29kaW5nKTsKLQkJKChHcmlkRGF0YSkgZkVuY29kaW5nU2V0dGluZ3MuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JWYWxpZGF0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCB2YWxpZGF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQkoKEdyaWRMYXlvdXQpIHZhbGlkYXRpbmdHcm91cC5nZXRMYXlvdXQoKSkubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0JCXZhbGlkYXRpbmdHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuVmFsaWRhdGluZ19maWxlcyk7Ci0KLQkJaWYgKGZJbmRpY2F0ZU5vR3JhbW1hciA9PSBudWxsKSB7Ci0JCQljcmVhdGVMYWJlbCh2YWxpZGF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWQpOwotCQkJZkluZGljYXRlTm9HcmFtbWFyID0gY3JlYXRlQ29tYm8odmFsaWRhdGluZ0dyb3VwLCBTdHJpbmdVdGlscy51bnBhY2soWE1MVUlNZXNzYWdlcy5JbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZF9zZXZlcml0aWVzKSk7Ci0JCX0KLQkJaWYgKGZVc2VYaW5jbHVkZSA9PSBudWxsKSB7Ci0JCQlmVXNlWGluY2x1ZGUgPSBjcmVhdGVDaGVja0JveCh2YWxpZGF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuVXNlX1hJbmNsdWRlKTsKLQkJfQotCQkKLQkJbmV3IExhYmVsKHZhbGlkYXRpbmdHcm91cCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZEZWZhdWx0U3VmZml4LnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJvdGVjdGVkIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI2dldE1vZGVsUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0aWFsaXplVmFsdWVzRm9yQ3JlYXRpbmdHcm91cCgpOwotCQlpbml0aWFsaXplVmFsdWVzRm9yVmFsaWRhdGluZ0dyb3VwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCQlmRGVmYXVsdFN1ZmZpeC5zZXRUZXh0KHN1ZmZpeCk7Ci0KLQkJU3RyaW5nIGVuY29kaW5nID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJZkVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyhlbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvclZhbGlkYXRpbmdHcm91cCgpIHsKLQkJaW50IGluZGljYXRlTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWQgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ESUNBVEVfTk9fR1JBTU1BUik7Ci0JCWJvb2xlYW4gdXNlWEluY2x1ZGVCdXR0b25TZWxlY3RlZCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVNFX1hJTkNMVURFKTsKLQotCQlpZiAoZkluZGljYXRlTm9HcmFtbWFyICE9IG51bGwpIHsKLQkJCWZJbmRpY2F0ZU5vR3JhbW1hci5zZWxlY3QoMiAtIGluZGljYXRlTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWQpOwotCQkJZkluZGljYXRlTm9HcmFtbWFyLnNldFRleHQoU3RyaW5nVXRpbHMudW5wYWNrKFhNTFVJTWVzc2FnZXMuSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllcylbMi1pbmRpY2F0ZU5vR3JhbW1hckJ1dHRvblNlbGVjdGVkXSk7Ci0JCX0KLQkJaWYgKGZVc2VYaW5jbHVkZSAhPSBudWxsKSB7Ci0JCQlmVXNlWGluY2x1ZGUuc2V0U2VsZWN0aW9uKHVzZVhJbmNsdWRlQnV0dG9uU2VsZWN0ZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwZXJmb3JtRGVmYXVsdHNGb3JDcmVhdGluZ0dyb3VwKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvclZhbGlkYXRpbmdHcm91cCgpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckNyZWF0aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0VGV4dChzdWZmaXgpOwotCi0JCVN0cmluZyBlbmNvZGluZyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQotCQlmRW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKGVuY29kaW5nKTsKLQkJLy8gZkVuY29kaW5nU2V0dGluZ3MucmVzZXRUb0RlZmF1bHRFbmNvZGluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvclZhbGlkYXRpbmdHcm91cCgpIHsKLQkJaW50IGluZGljYXRlTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWQgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklORElDQVRFX05PX0dSQU1NQVIpOwotCQlib29sZWFuIHVzZVhJbmNsdWRlQnV0dG9uU2VsZWN0ZWQgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfWElOQ0xVREUpOwotCQkKLQkJaWYgKGZJbmRpY2F0ZU5vR3JhbW1hciAhPSBudWxsKSB7Ci0JCQlmSW5kaWNhdGVOb0dyYW1tYXIuc2V0U2VsZWN0aW9uKG5ldyBQb2ludChpbmRpY2F0ZU5vR3JhbW1hckJ1dHRvblNlbGVjdGVkLCAyIC0gaW5kaWNhdGVOb0dyYW1tYXJCdXR0b25TZWxlY3RlZCkpOwotCQkJZkluZGljYXRlTm9HcmFtbWFyLnNldFRleHQoU3RyaW5nVXRpbHMudW5wYWNrKFhNTFVJTWVzc2FnZXMuSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllcylbaW5kaWNhdGVOb0dyYW1tYXJCdXR0b25TZWxlY3RlZF0pOwotCQl9Ci0JCWlmIChmVXNlWGluY2x1ZGUgIT0gbnVsbCkgewotCQkJZlVzZVhpbmNsdWRlLnNldFNlbGVjdGlvbih1c2VYSW5jbHVkZUJ1dHRvblNlbGVjdGVkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdG9yZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKTsKLQkJc3RvcmVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCBzdWZmaXgpOwotCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZkVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvclZhbGlkYXRpbmdHcm91cCgpIHsKLQkJaWYgKGZJbmRpY2F0ZU5vR3JhbW1hciAhPSBudWxsKSB7Ci0JCQlpbnQgd2Fybk5vR3JhbW1hckJ1dHRvblNlbGVjdGVkID0gMiAtIGZJbmRpY2F0ZU5vR3JhbW1hci5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ESUNBVEVfTk9fR1JBTU1BUiwgd2Fybk5vR3JhbW1hckJ1dHRvblNlbGVjdGVkKTsKLQkJfQotCQlpZiAoZlVzZVhpbmNsdWRlICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gdXNlWEluY2x1ZGVCdXR0b25TZWxlY3RlZCA9IGZVc2VYaW5jbHVkZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVTRV9YSU5DTFVERSwgdXNlWEluY2x1ZGVCdXR0b25TZWxlY3RlZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRWYWxpZEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkgJiYgIWlzVmFsaWQpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlzVmFsaWQgPSBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRWYWxpZCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTEzMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIFhNTFNvdXJjZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciwgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIGZpbmFsIGludCBNSU5fSU5ERU5UQVRJT05fU0laRSA9IDA7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0lOREVOVEFUSU9OX1NJWkUgPSAxNjsKLQotCS8vIENvbnRlbnQgQXNzaXN0Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQXV0b1Byb3Bvc2U7Ci0JcHJvdGVjdGVkIExhYmVsIGZBdXRvUHJvcG9zZUxhYmVsOwotCXByb3RlY3RlZCBUZXh0IGZBdXRvUHJvcG9zZVRleHQ7Ci0JcHJpdmF0ZSBDb21ibyBmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm87Ci0JcHJpdmF0ZSBWZWN0b3IgZlN1Z2dlc3Rpb25TdHJhdGVnaWVzID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0KLQkvLyBGb3JtYXR0aW5nCi0JcHJvdGVjdGVkIExhYmVsIGZMaW5lV2lkdGhMYWJlbDsKLQlwcm90ZWN0ZWQgVGV4dCBmTGluZVdpZHRoVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZTcGxpdE11bHRpQXR0cnM7Ci0JcHJpdmF0ZSBCdXR0b24gZkluZGVudFVzaW5nVGFiczsKLQlwcml2YXRlIEJ1dHRvbiBmSW5kZW50VXNpbmdTcGFjZXM7Ci0JcHJpdmF0ZSBTcGlubmVyIGZJbmRlbnRhdGlvblNpemU7Ci0JcHJpdmF0ZSBCdXR0b24gZlByZXNlcnZlUENEQVRBQ29udGVudDsKLQlwcml2YXRlIEJ1dHRvbiBmQWxpZ25FbmRCcmFja2V0OwotCS8vIEJVRzE5NTI2NCAtIFN1cHBvcnQgZm9yIHJlbW92aW5nL2FkZGluZyBhIHNwYWNlIGJlZm9yZSBlbXB0eSBjbG9zZSB0YWdzCi0JcHJpdmF0ZSBCdXR0b24gZlNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZzsKLQotCS8vIGdyYW1tYXIgY29uc3RyYWludHMKLQlwcm90ZWN0ZWQgQnV0dG9uIGZVc2VJbmZlcnJlZEdyYW1tYXI7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5YTUxfUFJFRldFQlhfU09VUkNFX0hFTFBJRCk7Ci0KLQkJbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiLCBYTUxVSU1lc3NhZ2VzLl9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTkssLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotCQljcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGNvbnRlbnRBc3Npc3RHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWNvbnRlbnRBc3Npc3RHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQ29udGVudF9hc3Npc3RfVUlfKTsKLQotCQlmQXV0b1Byb3Bvc2UgPSBjcmVhdGVDaGVja0JveChjb250ZW50QXNzaXN0R3JvdXAsIFhNTFVJTWVzc2FnZXMuQXV0b21hdGljYWxseV9tYWtlX3N1Z2dlc3RfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkF1dG9Qcm9wb3NlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQXV0b1Byb3Bvc2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZkF1dG9Qcm9wb3NlTGFiZWwgPSBjcmVhdGVMYWJlbChjb250ZW50QXNzaXN0R3JvdXAsIFhNTFVJTWVzc2FnZXMuUHJvbXB0X3doZW5fdGhlc2VfY2hhcmFjdGVfVUlfKTsKLQkJZkF1dG9Qcm9wb3NlVGV4dCA9IGNyZWF0ZVRleHRGaWVsZChjb250ZW50QXNzaXN0R3JvdXApOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRlbnRBc3Npc3RHcm91cCwgWE1MVUlNZXNzYWdlcy5TdWdnZXN0aW9uX1N0cmF0ZWd5KTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvID0gbmV3IENvbWJvKGNvbnRlbnRBc3Npc3RHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWZTdWdnZXN0aW9uU3RyYXRlZ2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uYWRkKFhNTFVJTWVzc2FnZXMuU3VnZ2VzdGlvbl9TdHJhdGVneV9MYXgpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWdpZXMuYWRkKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfTEFYKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLmFkZChYTUxVSU1lc3NhZ2VzLlN1Z2dlc3Rpb25fU3RyYXRlZ3lfU3RyaWN0KTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVnaWVzLmFkZChYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX1NUUklDVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JGb3JtYXR0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBmb3JtYXR0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQlmb3JtYXR0aW5nR3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkZvcm1hdHRpbmdfVUlfKTsKLQotCQlmTGluZVdpZHRoTGFiZWwgPSBjcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuTGluZV93aWR0aF9fVUlfKTsKLQkJZkxpbmVXaWR0aFRleHQgPSBuZXcgVGV4dChmb3JtYXR0aW5nR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlnRGF0YS53aWR0aEhpbnQgPSAyNTsKLQkJZkxpbmVXaWR0aFRleHQuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCWZMaW5lV2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JCWZTcGxpdE11bHRpQXR0cnMgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuU3BsaXRfbXVsdGlwbGVfYXR0cmlidXRlcyk7Ci0JCSgoR3JpZERhdGEpIGZTcGxpdE11bHRpQXR0cnMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZBbGlnbkVuZEJyYWNrZXQgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuQWxpZ25fZmluYWxfYnJhY2tldCk7Ci0JCSgoR3JpZERhdGEpIGZBbGlnbkVuZEJyYWNrZXQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZQcmVzZXJ2ZVBDREFUQUNvbnRlbnQgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuUHJlc2VydmVfUENEQVRBX0NvbnRlbnQpOwotCQkoKEdyaWREYXRhKSBmUHJlc2VydmVQQ0RBVEFDb250ZW50LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJBbGxCbGFua0xpbmVzID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkNsZWFyX2FsbF9ibGFua19saW5lc19VSV8pOwotCQkoKEdyaWREYXRhKSBmQ2xlYXJBbGxCbGFua0xpbmVzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLlNwYWNlX2JlZm9yZV9lbXB0eV9jbG9zZV90YWcpOwotCQkoKEdyaWREYXRhKSBmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQkJZkluZGVudFVzaW5nVGFicyA9IGNyZWF0ZVJhZGlvQnV0dG9uKGZvcm1hdHRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5JbmRlbnRfdXNpbmdfdGFicyk7Ci0JCSgoR3JpZERhdGEpIGZJbmRlbnRVc2luZ1RhYnMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJZkluZGVudFVzaW5nU3BhY2VzID0gY3JlYXRlUmFkaW9CdXR0b24oZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkluZGVudF91c2luZ19zcGFjZXMpOwotCQkoKEdyaWREYXRhKSBmSW5kZW50VXNpbmdTcGFjZXMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJY3JlYXRlTGFiZWwoZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkluZGVudGF0aW9uX3NpemUpOwotCQlmSW5kZW50YXRpb25TaXplID0gbmV3IFNwaW5uZXIoZm9ybWF0dGluZ0dyb3VwLCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLkluZGVudGF0aW9uX3NpemVfdGlwKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRNaW5pbXVtKE1JTl9JTkRFTlRBVElPTl9TSVpFKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRNYXhpbXVtKE1BWF9JTkRFTlRBVElPTl9TSVpFKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0UGFnZUluY3JlbWVudCg0KTsKLQkJZkluZGVudGF0aW9uU2l6ZS5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JhbW1hckNvbnN0cmFpbnRzR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDEpOwotCQlncmFtbWFyQ29uc3RyYWludHNHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuR3JhbW1hcl9Db25zdHJhaW50cyk7Ci0JCWdyYW1tYXJDb25zdHJhaW50c0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCi0JCWZVc2VJbmZlcnJlZEdyYW1tYXIgPSBjcmVhdGVDaGVja0JveChncmFtbWFyQ29uc3RyYWludHNHcm91cCwgWE1MVUlNZXNzYWdlcy5Vc2VfaW5mZXJyZWRfZ3JhbW1hcl9pbl9hYnNlbmNlX29mKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gZWRpdG9yCi0JCVhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVZhbHVlcygpIHsKLQkJaWYgKGZBdXRvUHJvcG9zZSAhPSBudWxsKSB7Ci0JCQlpZiAoZkF1dG9Qcm9wb3NlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZkF1dG9Qcm9wb3NlTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQXV0b1Byb3Bvc2VMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZQotCSAqIAotCSAqIEByZXR1cm4gYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGNvbnN0YW50IGZyb20gWE1MVUlQcmVmZXJlbmNlTmFtZXMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50U3VnZ2VzdGlvblN0cmF0ZWd5KCkgewotCQlpbnQgaSA9IGZTdWdnZXN0aW9uU3RyYXRlZ3lDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgKGZTdWdnZXN0aW9uU3RyYXRlZ2llcy5lbGVtZW50QXQoaSkpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCQlpbml0aWFsaXplVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBDb250ZW50IEFzc2lzdAotCQlmQXV0b1Byb3Bvc2Uuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFKSk7Ci0JCWZBdXRvUHJvcG9zZVRleHQuc2V0VGV4dChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpKTsKLQkJU3RyaW5nIHN1Z2dlc3Rpb25TdHJhdGVneSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZKTsKLQkJaWYgKHN1Z2dlc3Rpb25TdHJhdGVneS5sZW5ndGgoKSA+IDApIHsKLQkJCXNldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koc3VnZ2VzdGlvblN0cmF0ZWd5KTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9MQVgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCWZTcGxpdE11bHRpQXR0cnMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJZkFsaWduRW5kQnJhY2tldC5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQlmQ2xlYXJBbGxCbGFua0xpbmVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCQlmUHJlc2VydmVQQ0RBVEFDb250ZW50LnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCkpOwotCQlmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFX0JFRk9SRV9FTVBUWV9DTE9TRV9UQUcpKTsKLQkJCi0JCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQotCQlmSW5kZW50YXRpb25TaXplLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpIHsKLQkJZlVzZUluZmVycmVkR3JhbW1hci5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpOwotCi0JCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCWVuYWJsZVZhbHVlcygpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gQ29udGVudCBBc3Npc3QKLQkJZkF1dG9Qcm9wb3NlLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UpKTsKLQkJZkF1dG9Qcm9wb3NlVGV4dC5zZXRUZXh0KGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpKTsKLQkJU3RyaW5nIHN1Z2dlc3Rpb25TdHJhdGVneSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWSk7Ci0JCWlmIChzdWdnZXN0aW9uU3RyYXRlZ3kubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzZXRDdXJyZW50U3VnZ2VzdGlvblN0cmF0ZWd5KHN1Z2dlc3Rpb25TdHJhdGVneSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRDdXJyZW50U3VnZ2VzdGlvblN0cmF0ZWd5KFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfTEFYKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQlmU3BsaXRNdWx0aUF0dHJzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQlmQWxpZ25FbmRCcmFja2V0LnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQlmQ2xlYXJBbGxCbGFua0xpbmVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQkJZlByZXNlcnZlUENEQVRBQ29udGVudC5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUFJFU0VSVkVfQ0RBVEFDT05URU5UKSk7Ci0JCS8vIEJVRzE5NTI2NCAtIFN1cHBvcnQgZm9yIHJlbW92aW5nL2FkZGluZyBhIHNwYWNlIGJlZm9yZSBlbXB0eSBjbG9zZSB0YWdzCi0JCWZTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFX0JFRk9SRV9FTVBUWV9DTE9TRV9UQUcpKTsKLQkJCi0JCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKCkgewotCQlmVXNlSW5mZXJyZWRHcmFtbWFyLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUikpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNldCBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaW4gc3VnZ2VzdGlvbiBzdHJhdGVneSBjb21ibyBib3gKLQkgKiAKLQkgKiBAcGFyYW0gc3RyYXRlZ3kKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudFN1Z2dlc3Rpb25TdHJhdGVneShTdHJpbmcgc3RyYXRlZ3kpIHsKLQkJLy8gQ2xlYXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0KLQkJaW50IGkgPSBmU3VnZ2VzdGlvblN0cmF0ZWdpZXMuaW5kZXhPZihzdHJhdGVneSk7Ci0JCWlmIChpID49IDApIHsKLQkJCWZTdWdnZXN0aW9uU3RyYXRlZ3lDb21iby5zZWxlY3QoaSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJc3RvcmVWYWx1ZXNGb3JDb250ZW50QXNzaXN0R3JvdXAoKTsKLQkJc3RvcmVWYWx1ZXNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBDb250ZW50IEFzc2lzdAotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIGZBdXRvUHJvcG9zZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCBmQXV0b1Byb3Bvc2VUZXh0LmdldFRleHQoKSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1ksIGdldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgZkxpbmVXaWR0aFRleHQuZ2V0VGV4dCgpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMsIGZTcGxpdE11bHRpQXR0cnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCwgZkFsaWduRW5kQnJhY2tldC5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUywgZkNsZWFyQWxsQmxhbmtMaW5lcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCwgZlByZXNlcnZlUENEQVRBQ29udGVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCS8vIEJVRzE5NTI2NCAtIFN1cHBvcnQgZm9yIHJlbW92aW5nL2FkZGluZyBhIHNwYWNlIGJlZm9yZSBlbXB0eSBjbG9zZSB0YWdzCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFX0JFRk9SRV9FTVBUWV9DTE9TRV9UQUcsIGZTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcuZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJaWYgKGZJbmRlbnRVc2luZ1RhYnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCKTsKLQkJfQotCQllbHNlIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UpOwotCQl9Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIGZJbmRlbnRhdGlvblNpemUuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlVTRV9JTkZFUlJFRF9HUkFNTUFSLCBmVXNlSW5mZXJyZWRHcmFtbWFyLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc0Vycm9yID0gZmFsc2U7Ci0JCVN0cmluZyB3aWR0aFRleHQgPSBudWxsOwotCi0JCWlmIChmTGluZVdpZHRoVGV4dCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXdpZHRoVGV4dCA9IGZMaW5lV2lkdGhUZXh0LmdldFRleHQoKTsKLQkJCQlpbnQgZm9ybWF0dGluZ0xpbmVXaWR0aCA9IEludGVnZXIucGFyc2VJbnQod2lkdGhUZXh0KTsKLQkJCQlpZiAoKGZvcm1hdHRpbmdMaW5lV2lkdGggPCBXSURUSF9WQUxJREFUSU9OX0xPV0VSX0xJTUlUKSB8fCAoZm9ybWF0dGluZ0xpbmVXaWR0aCA+IFdJRFRIX1ZBTElEQVRJT05fVVBQRVJfTElNSVQpKSB7Ci0JCQkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZXhjKSB7Ci0JCQkJc2V0SW52YWxpZElucHV0TWVzc2FnZSh3aWR0aFRleHQpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQlpc0Vycm9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWludCBpbmRlbnRTaXplID0gMDsKLQkJaWYgKGZJbmRlbnRhdGlvblNpemUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbmRlbnRTaXplID0gZkluZGVudGF0aW9uU2l6ZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKGluZGVudFNpemUgPCBNSU5fSU5ERU5UQVRJT05fU0laRSkgfHwgKGluZGVudFNpemUgPiBNQVhfSU5ERU5UQVRJT05fU0laRSkpIHsKLQkJCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZleGMpIHsKLQkJCQlzZXRJbnZhbGlkSW5wdXRNZXNzYWdlKEludGVnZXIudG9TdHJpbmcoaW5kZW50U2l6ZSkpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQlpc0Vycm9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmICghaXNFcnJvcikgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MU3ludGF4Q29sb3JpbmdQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NGZlZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFN5bnRheENvbG9yaW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBBIHByZWZlcmVuY2UgcGFnZSB0byBjb25maWd1cmUgb3VyIFhNTCBzeW50YXggY29sb3IuIEl0IHJlc2VtYmxlcyB0aGUgSkRUCi0gKiBhbmQgQ0RUIHBhZ2VzIGZhciBtb3JlIHRoYW4gb3VyIG9yaWdpbmFsIGNvbG9yIHBhZ2Ugd2hpbGUgcmV0YWluaW5nIHRoZQotICogZXh0cmEgImNsaWNrLXRvLWZpbmQiIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxTeW50YXhDb2xvcmluZ1BhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQm9sZDsKLQlwcml2YXRlIExhYmVsIGZGb3JlZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBmQmFja2dyb3VuZExhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZDbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGZDb250ZXh0VG9TdHlsZU1hcDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gZkl0YWxpYzsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmU3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlN0eWxlVG9EZXNjcmlwdGlvbk1hcDsKLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVuZGVybGluZTsKLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBmRGVmYXVsdEZvcmVncm91bmQ7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSBmRGVmYXVsdEJhY2tncm91bmQ7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0xpbmspOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24ocGFyZW50LmdldFNoZWxsKCksIGUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50PSAxNTA7IC8vIG9ubHkgZXhwYW5kIGZ1cnRoZXIgaWYgYW55b25lIGVsc2UgcmVxdWlyZXMgaXQKLQkJbGluay5zZXRMYXlvdXREYXRhKGxpbmtEYXRhKTsKLQotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCVNhc2hGb3JtIGVkaXRvciA9IG5ldyBTYXNoRm9ybShwYWdlQ29tcG9uZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJU2FzaEZvcm0gdG9wID0gbmV3IFNhc2hGb3JtKGVkaXRvciwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3R5bGVFZGl0b3IgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luUmlnaHQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMDsKLQkJY3JlYXRlTGFiZWwoc3R5bGVFZGl0b3IsIFhNTFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzApOwotCQlmU3R5bGVzVmlld2VyID0gY3JlYXRlU3R5bGVzVmlld2VyKHN0eWxlRWRpdG9yKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heChncmlkRGF0YS53aWR0aEhpbnQsIGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKS5sZW5ndGgoKSkpOwotCQl9Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlmU3R5bGVzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgZWRpdGluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJY3JlYXRlTGFiZWwoZWRpdGluZ0NvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1dHRvbiBlbmFibGVyID0gY3JlYXRlQ2hlY2tib3goZWRpdGluZ0NvbXBvc2l0ZSwgWE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMik7Ci0JCWVuYWJsZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVuYWJsZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlDb21wb3NpdGUgZWRpdENvbnRyb2xzID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRpbmdDb21wb3NpdGUsIDIpOwotCQkoKEdyaWRMYXlvdXQpIGVkaXRDb250cm9scy5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDIwOwotCi0JCWZGb3JlZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuRm9yZWdyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmRm9yZWdyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkZvcmVncm91bmRDb2xvciA9IGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmRm9yZWdyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuQmFja2dyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQmFja2dyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkJhY2tncm91bmRDb2xvciA9IGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmQmFja2dyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBYTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8zKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZCb2xkLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBYTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV80KTsKLQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZkl0YWxpYy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlN0cmlrZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgWE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNSk7Ci0JCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZTdHJpa2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZVbmRlcmxpbmUgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIFhNTFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzYpOwotCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmVW5kZXJsaW5lLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJTdHlsZSA9IG5ldyBCdXR0b24oZWRpdGluZ0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmQ2xlYXJTdHlsZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuUmVzdG9yZV9EZWZhdWx0X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUmVzdG9yZSBEZWZhdWx0IgotCQlmQ2xlYXJTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKSk7Ci0JCSgoR3JpZERhdGEpIGZDbGVhclN0eWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgc2FtcGxlQXJlYSA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0b3IsIDEpOwotCi0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gNTsKLQkJY3JlYXRlTGFiZWwoc2FtcGxlQXJlYSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihzYW1wbGVBcmVhLCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YTMgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEzLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWdyaWREYXRhMy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZ3JpZERhdGEzLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTMpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihnZXRUZXh0S2V5TGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkTW91c2VMaXN0ZW5lcihnZXRUZXh0TW91c2VMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihnZXRUcmF2ZXJzZUxpc3RlbmVyKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZUZXh0LCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOwotCQlmRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJZkRvY3VtZW50LnNldChnZXRFeGFtcGxlVGV4dCgpKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGZEb2N1bWVudCk7Ci0KLQkJdG9wLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJZWRpdG9yLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCWZTdHlsZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpKTsKLQotCQlhcHBseVN0eWxlcygpOwotCi0JCWZTdHlsZXNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1swXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1swXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1sxXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1syXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkl0YWxpYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZTdHJpa2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1s0XTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZlN0cmlrZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s0XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmVW5kZXJsaW5lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNV07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZVbmRlcmxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFRvRGVmYXVsdChuYW1lZFN0eWxlKTsKLQkJCQlhcHBseVN0eWxlcygpOwotCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExpc3Qgdmlld2VyIHdoZXJlIHdlIHNlZSB0aGUgdmFyaW91cyBzeW50YXggZWxlbWVudCBkaXNwbGF5Ci0JICogbmFtZXMtLXdvdWxkIGl0IGV2ZXIgYmUgYSBUcmVlIGxpa2UgSkRUJ3M/Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlU3R5bGVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RydWN0dXJlZFZpZXdlciBzdHlsZXNWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdCBkZXNjcmlwdGlvbiA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0eWxlc1ZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlNhbXBsZV9YTUxfZG9jOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVkU3R5bGVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCS8vIGVuc3VyZSB0aGUgb2Zmc2V0IGlzIGNsZWFuCi0JCWlmIChvZmZzZXQgPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldChmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJZWxzZSBpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKGRvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWRvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbidzIENvbnRleHQgYXQgdGhpcyBvZmZzZXQKLQkJCUlUZXh0UmVnaW9uIGludGVyZXN0ID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGRvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChyZWdpb25Db250ZXh0KTsKLQkJCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmFtZWRTdHlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZ2V0T3ZlcmxheVN0b3JlKCkgewotCQlyZXR1cm4gZk92ZXJsYXlTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpIHsKLQkJaWYgKGZTdHlsZVByZWZlcmVuY2VLZXlzID09IG51bGwpIHsKLQkJCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCQlmU3R5bGVQcmVmZXJlbmNlS2V5cyA9IHN0eWxlczsKLQkJfQotCQlyZXR1cm4gZlN0eWxlUHJlZmVyZW5jZUtleXM7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmF2ZXJzZUxpc3RlbmVyIGdldFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIja2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWlmICgoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB8fCAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykpCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb24pOwotCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKTsKLQkJaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCk7Ci0KLQkJZk92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKSB7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQywgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QRV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFN0eWxlVG9EZXNjcmlwdGlvbk1hcCgpIHsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5DREFUQV9EZWxpbWl0ZXJzX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhULCBYTUxVSU1lc3NhZ2VzLkNEQVRBX0NvbnRlbnRfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0RlbF9VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCwgWE1MVUlNZXNzYWdlcy5Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0Nvbl9VSV9fVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfRGVsaW1pdGVyc19VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfQ29udGVudF9VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5UYWdfRGVsaW1pdGVyc19VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIFhNTFVJTWVzc2FnZXMuVGFnX05hbWVzX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX05hbWVzX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9WYWx1ZXNfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkRlY2xhcmF0aW9uX0RlbGltaXRlcnNfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULCBYTUxVSU1lc3NhZ2VzLkNvbnRlbnRfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX05hbWVfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9TWVNURU1fUFVCTElDX0tleXdfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfUHVibGljX1JlZmVyZW5jZV9VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9TeXN0ZW1fUmVmZXJlbmNlX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFLCBYTUxVSU1lc3NhZ2VzLkVudGl0eV9SZWZlcmVuY2VfVUlfKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5sb2FkRGVmYXVsdHMoKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCWFjdGl2YXRlKG51bGwpOwotCQlmVGV4dC5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnByb3BhZ2F0ZSgpOwotCi0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q29sb3JBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5hbWVkU3R5bGUpKTsKLQkJCWZTdHlsZXNWaWV3ZXIucmV2ZWFsKG5hbWVkU3R5bGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhbGx5IHNldCB0aGUgcmVwb3J0aW5nIG5hbWUgb2YgYSBjb250cm9sIGZvciBhY2Nlc3NpYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2libGUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgbiA9IG5hbWU7Ci0JCWNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBiNTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBYTUwgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0KLQljbGFzcyBYTUxFZGl0VGVtcGxhdGVEaWFsb2cgZXh0ZW5kcyBFZGl0VGVtcGxhdGVEaWFsb2cgewotCQlwdWJsaWMgWE1MRWRpdFRlbXBsYXRlRGlhbG9nKFNoZWxsIHBhcmVudCwgVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlLCBDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCByZWdpc3RyeSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwoKTsKLQotCQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSBuZXcgQ29udGVudEFzc2lzdGFudCgpOwotCQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0FjdGl2YXRpb24odHJ1ZSk7Ci0JCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvSW5zZXJ0KHRydWUpOwotCQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihnZXRUZW1wbGF0ZVByb2Nlc3NvcigpLCBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQkJCQlyZXR1cm4gYXNzaXN0YW50OwotCQkJCX0KLQkJCX07Ci0JCQlyZXR1cm4gZG9DcmVhdGVWaWV3ZXIocGFyZW50LCBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBYTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlYTUxVSVBsdWdpbiB4bWxFZGl0b3JQbHVnaW4gPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKHhtbEVkaXRvclBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldFRlbXBsYXRlU3RvcmUoeG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoeG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKGFuY2VzdG9yKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gdmlld2VyQ29uZmlndXJhdGlvbikgewotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MOwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUodmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdCBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLQkgKiBhIGN1c3RvbSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIGVkaXQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgZWRpdGFibGUKLQkgKiBAcGFyYW0gaXNOYW1lTW9kaWZpYWJsZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9yIG1vZGlmaWVkIHRlbXBsYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGVkaXRpb24gZmFpbGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZSBlZGl0VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlKSB7Ci0JCUVkaXRUZW1wbGF0ZURpYWxvZyBkaWFsb2cgPSBuZXcgWE1MRWRpdFRlbXBsYXRlRGlhbG9nKGdldFNoZWxsKCksIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCBnZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KCkpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiBkaWFsb2cuZ2V0VGVtcGxhdGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpIHsKLQkJLy8gdGVtcGxhdGUgZm9ybWF0dGluZyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFR5cGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwYTdkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0gCi1wdWJsaWMgY2xhc3MgWE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGZDbG9zZUNvbW1lbnQ7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsb3NlRW5kVGFnOwotCXByaXZhdGUgQnV0dG9uIGZSZW1vdmVFbmRUYWc7Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0JCQotCQljcmVhdGVBdXRvQ29tcGxldGUoY29tcG9zaXRlKTsKLQkJY3JlYXRlQXV0b1JlbW92ZShjb21wb3NpdGUpOwotCQkKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBdXRvQ29tcGxldGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCQotCQlncm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuWE1MVHlwaW5nX0F1dG9fQ29tcGxldGUpOwotCQkKLQkJZkNsb3NlQ29tbWVudCA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19Db21wbGV0ZV9Db21tZW50cyk7Ci0JCSgoR3JpZERhdGEpIGZDbG9zZUNvbW1lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQlmQ2xvc2VFbmRUYWcgPSBjcmVhdGVDaGVja0JveChncm91cCwgWE1MVUlNZXNzYWdlcy5YTUxUeXBpbmdfQ29tcGxldGVfRW5kX1RhZ3MpOwotCQkoKEdyaWREYXRhKSBmQ2xvc2VFbmRUYWcuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXV0b1JlbW92ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJCi0JCWdyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5YTUxUeXBpbmdfQXV0b19SZW1vdmUpOwotCQkKLQkJZlJlbW92ZUVuZFRhZyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19SZW1vdmVfRW5kX1RhZ3MpOwotCQkoKEdyaWREYXRhKSBmUmVtb3ZlRW5kVGFnLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCQotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0Q2hlY2tib3goZkNsb3NlQ29tbWVudCwgWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTKTsKLQkJaW5pdENoZWNrYm94KGZDbG9zZUVuZFRhZywgWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTKTsKLQkJaW5pdENoZWNrYm94KGZSZW1vdmVFbmRUYWcsIFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWRlZmF1bHRDaGVja2JveChmQ2xvc2VDb21tZW50LCBYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlRW5kVGFnLCBYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MpOwotCQlkZWZhdWx0Q2hlY2tib3goZlJlbW92ZUVuZFRhZywgWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX1JFTU9WRV9FTkRfVEFHUyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0Q2hlY2tib3goQnV0dG9uIGJveCwgU3RyaW5nIGtleSkgewotCQlpZihib3ggIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCkKLQkJCWJveC5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihrZXkpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlZmF1bHRDaGVja2JveChCdXR0b24gYm94LCBTdHJpbmcga2V5KSB7Ci0JCWlmKGJveCAhPSBudWxsICYmIGtleSAhPSBudWxsKQotCQkJYm94LnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihrZXkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9DT01NRU5UUywgKGZDbG9zZUNvbW1lbnQgIT0gbnVsbCkgPyBmQ2xvc2VDb21tZW50LmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MsIChmQ2xvc2VFbmRUYWcgIT0gbnVsbCkgPyBmQ2xvc2VFbmRUYWcuZ2V0U2VsZWN0aW9uKCkgOiBmYWxzZSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MsIChmUmVtb3ZlRW5kVGFnICE9IG51bGwpID8gZlJlbW92ZUVuZFRhZy5nZXRTZWxlY3Rpb24oKSA6IGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyOTRiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEJlbmphbWluIE11c2thbGxhLCBiLm11c2thbGxhQGdteC5uZXQgLSBbMTU4NjYwXSBjaGFyYWN0ZXIgZW50aXRpZXMgc2hvdWxkIGhhdmUgdGhlaXIgb3duIHN5bnRheCBoaWdobGlnaHRpbmcgcHJlZmVyZW5jZSAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIFhNTCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0KLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCAiPD06Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDk0NgotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1ksIFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfU1RSSUNUKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUiwgdHJ1ZSk7Ci0KLQkJLy8gWE1MIFN0eWxlIFByZWZlcmVuY2VzCi0JCVN0cmluZyBOT0JBQ0tHUk9VTkRCT0xEID0gIiB8IG51bGwgfCBmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEpVU1RJVEFMSUMgPSAiIHwgbnVsbCB8IGZhbHNlIHwgdHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCAxMjcsIDAsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgNDIsIDAsIDI1NSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgc3R5bGVWYWx1ZSk7IC8vIHNwZWNpZmllZAotCQkvLyB2YWx1ZQotCQkvLyBpcwotCQkvLyBibGFjazsKLQkJLy8gbGVhdmluZwotCQkvLyBhcwotCQkvLyB3aWRnZXQKLQkJLy8gZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIDYzLCA5NSwgMTkxKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQsIDYzLCA5NSwgMTkxKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUiwgMCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLCAwLCAwLCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLCBzdHlsZVZhbHVlKTsKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgMCwgMCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQsIDEyOCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgNjMsIDEyNywgOTUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULCBzdHlsZVZhbHVlKTsgLy8gc3BlY2lmaWVkCi0JCS8vIHZhbHVlCi0JCS8vIGlzCi0JCS8vIGJsYWNrOwotCQkvLyBsZWF2aW5nCi0JCS8vIGFzCi0JCS8vIHdpZGdldAotCQkvLyBkZWZhdWx0Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSLCAwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLCA2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLCAwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQsIHN0eWxlVmFsdWUpOyAvLyBzcGVjaWZpZWQKLQkJLy8gdmFsdWUKLQkJLy8gaXMKLQkJLy8gYmxhY2s7Ci0JCS8vIGxlYXZpbmcKLQkJLy8gYXMKLQkJLy8gd2lkZ2V0Ci0JCS8vIGRlZmF1bHQKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgMCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQsIDAsIDAsIDApICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFLCA0MiwgMCwgMjU1KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UsIHN0eWxlVmFsdWUpOwotCQkKLQkJLy8gc2V0IGRlZmF1bHQgbmV3IHhtbCBmaWxlIHRlbXBsYXRlIHRvIHVzZSBpbiBuZXcgZmlsZSB3aXphcmQKLQkJLyoKLQkJICogTmVlZCB0byBmaW5kIHRlbXBsYXRlIG5hbWUgdGhhdCBnb2VzIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBpZCAobmFtZQotCQkgKiBtYXkgY2hhbmdlIGZvciBkaWZmZXJudCBsYW5ndWFnZSkKLQkJICovCi0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCkuZmluZFRlbXBsYXRlQnlJZCgib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCQkKLQkJLy8gRGVmYXVsdHMgZm9yIHRoZSBUeXBpbmcgcHJlZmVyZW5jZSBwYWdlCi0JCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MsIHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxZmYxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIFhNTCBVSQotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlQcmVmZXJlbmNlTmFtZXMgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9MQVggPSAiTGF4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfU1RSSUNUID0gIlN0cmljdCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiBjb2RlIGFzc2lzdCBnZXRzIGF1dG8gYWN0aXZhdGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRSA9IGdldEF1dG9Qcm9wb3NlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2UiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY2hhcmFjdGVycyB0aGF0IGF1dG8gYWN0aXZhdGUgY29kZQotCSAqIGFzc2lzdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEFsbCBjaGFyYWN0ZXJzIHRoYXQgdHJpZ2dlcgotCSAqIGF1dG8gY29kZSBhc3Npc3QuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRV9DT0RFID0gZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCkgewotCQlyZXR1cm4gImF1dG9Qcm9wb3NlQ29kZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gZ2V0VGVtcGxhdGVzS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcGxhdGVzS2V5KCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyB3aGV0aGVyIG9yIGdyYW1tYXIgc2hvdWxkIGJlIGluZmVycmVkCi0JICogb3Igbm90LgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9JTkZFUlJFRF9HUkFNTUFSID0gZ2V0VXNlSW5mZXJyZWRHcmFtbWFyS2V5KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE9VVExJTkVfQkVIQVZJT1IgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX05PREUgPSAib3V0bGluZS1iZWhhdmlvci5lbGVtZW50LW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9OT0RFID0gIm91dGxpbmUtYmVoYXZpb3IuYXR0cmlidXRlLW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTk9ERSA9ICJvdXRsaW5lLWJlaGF2aW9yLnRleHQtbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfU0VDVElPTl9OT0RFID0gIm91dGxpbmUtYmVoYXZpb3IuY2RhdGEtc2VjdGlvbi1ub2RlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfUkVGRVJFTkNFX05PREUgPSAib3V0bGluZS1iZWhhdmlvci5lbnRpdHktcmVmZXJlbmNlLW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9OT0RFID0gIm91dGxpbmUtYmVoYXZpb3IuZW50aXR5LW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA9ICJvdXRsaW5lLWJlaGF2aW9yLmluc3RydWN0aW9uLW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfTk9ERSA9ICJvdXRsaW5lLWJlaGF2aW9yLmNvbW1lbnQtbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfTk9ERSA9ICJvdXRsaW5lLWJlaGF2aW9yLmRvY3VtZW50LW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1RZUEVfTk9ERSA9ICJvdXRsaW5lLWJlaGF2aW9yLmRvY3VtZW50LXR5cGUtbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9ICJvdXRsaW5lLWJlaGF2aW9yLmRvY3VtZW50LWZyYWdtZW50LW5vZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX05PREUgPSAib3V0bGluZS1iZWhhdmlvci5ub3RhdGlvbi1ub2RlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VXNlSW5mZXJyZWRHcmFtbWFyS2V5KCkgewotCQlyZXR1cm4gInVzZUluZmVycmVkR3JhbW1hciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY2hhcmFjdGVycyB0aGF0IGF1dG8gYWN0aXZhdGUgY29kZQotCSAqIGFzc2lzdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEFsbCBjaGFyYWN0ZXJzIHRoYXQgdHJpZ2dlcgotCSAqIGF1dG8gY29kZSBhc3Npc3QuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVR0dFU1RJT05fU1RSQVRFR1kgPSBnZXRTdWdnZXN0aW9uU3RyYXRlZ2V5S2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3VnZ2VzdGlvblN0cmF0ZWdleUtleSgpIHsKLQkJcmV0dXJuICJzdWdnZXN0aW9uU3RyYXRlZ3kiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgRFREIGZpbGUgd2l6YXJkLgotCSAqIFRlbXBsYXRlIG5hbWUgaXMgc3RvcmVkIGluc3RlYWQgb2YgdGVtcGxhdGUgaWQgYmVjYXVzZSB1c2VyLWNyZWF0ZWQKLQkgKiB0ZW1wbGF0ZXMgZG8gbm90IGhhdmUgdGVtcGxhdGUgaWRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJuZXdGaWxlVGVtcGxhdGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIGNvbW1lbnRzIHdoaWxlCi0JICogdHlwaW5nLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUElOR19DT01QTEVURV9DT01NRU5UUyA9ICJjb21wbGV0ZUNvbW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIGVuZC10YWdzIGFmdGVyIGVudGVyaW5nCi0JICogPGNvZGU+Jmx0Oy88L2NvZGU+Ci0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTID0gImNvbXBsZXRlRW5kVGFncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBvcHRpb24gZm9yIHJlbW92aW5nIGFuIGVuZC10YWcgaWYgdGhlIHN0YXJ0IHRhZyBpcwotCSAqIGNvbnZlcnRlZCB0byBhbiBlbXB0eS10YWcuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX1JFTU9WRV9FTkRfVEFHUyA9ICJyZW1vdmVFbmRUYWdzIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDE1ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb250YWlucyBhIHNldCBvZiBwcm9qZWN0aW9uIG1vZGVsIGFkZGl0aW9ucy9kZWxldGlvbnMvbW9kaWZpY2F0aW9ucwotICovCi1jbGFzcyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JcHJpdmF0ZSBOb2RlIGZOb2RlOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZEZWxldGlvbnM7Ci0JcHJpdmF0ZSBNYXAgZkFkZGl0aW9uczsKLQlwcml2YXRlIEFubm90YXRpb25bXSBmTW9kaWZpY2F0aW9uczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZkRlbGV0aW9ucyA9IGRlbGV0aW9uczsKLQkJZkFkZGl0aW9ucyA9IGFkZGl0aW9uczsKLQkJZk1vZGlmaWNhdGlvbnMgPSBtb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0QWRkaXRpb25zKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlbGV0aW9ucygpIHsKLQkJcmV0dXJuIGZEZWxldGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRNb2RpZmljYXRpb25zKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMDJmNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogTGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24KLQkgKiBtb2RlbCBub2RlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZlByb2plY3Rpb25WaWV3ZXJzOwotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCgpIHsKLQkJc3VwZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTCBhZGFwdGVyID0gbnVsbDsKLQotCQkvLyBjcmVhdGUgYWRhcHRlciBmb3IgZXZlcnkgZWxlbWVudCB0YWcKLQkJaWYgKChpc0FjdGl2ZSgpKSAmJiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgJiYgKCgoTm9kZSkgdGFyZ2V0KS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSkgewotCQkJYWRhcHRlciA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTCh0aGlzKTsKLQkJCWFkYXB0ZXIudXBkYXRlQWRhcHRlcigoTm9kZSkgdGFyZ2V0KTsKLQkJfQotCi0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgZmFjdG9yeSBpcyBjdXJyZW50bHkgYWN0aXZlbHkgbWFuYWdpbmcgcHJvamVjdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gKChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgJiYgIWZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCXF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgZm9yIGEgc3BlY2lmaWMgcHJvamVjdGlvbiB2aWV3ZXIgaWYKLQkgKiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4gT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZAotCSAqIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGVsZXRpb25zCi0JICogQHBhcmFtIGFkZGl0aW9ucwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25zCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIGNyZWF0ZSBhIGNoYW5nZSBvYmplY3QgZm9yIGxhdGVzdCBjaGFuZ2UgYW5kIGFkZCB0byBxdWV1ZQotCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UgPSBuZXcgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgZlByb2plY3Rpb25WaWV3ZXJzLmdldCh2aWV3ZXIpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpbmZvcy5oYXNOZXh0KCkpIHsKLQkJCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJCWluZm8ucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZ28gdGhyb3VnaCBldmVyeSBwcm9qZWN0aW9udmlld2VyIGFuZCBjYWxsCi0JCS8vIHJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgaW5mb3MubmV4dCgpOwotCQkJCWluZm8uZGlzcG9zZSgpOwotCQkJCWluZm9zLnJlbW92ZSgpOwotCQkJfQotCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbnVsbDsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB2aWV3ZXIgdG8gbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcyBmYWN0b3J5IGlzIGFzc29jaWF0ZWQKLQkgKiB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIHZpZXdlcidzIGRvY3VtZW50IGFuZCBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkgKiAgICAgICAgICAgIGFyZSBub3QgbnVsbAotCSAqLwotCXZvaWQgYWRkUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyByZW1vdmUgb2xkIGVudHJ5IGlmIGl0IGV4aXN0cwotCQlyZW1vdmVQcm9qZWN0aW9uVmlld2VyKHZpZXdlcik7Ci0KLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyA9PSBudWxsKSB7Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIG5ldyBvYmplY3QgY29udGFpbmluZyBwcm9qZWN0aW9uIHZpZXdlciBhbmQgaXRzIGluZm8KLQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSBuZXcgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKHZpZXdlcik7Ci0JCWZQcm9qZWN0aW9uVmlld2Vycy5wdXQodmlld2VyLCBpbmZvKTsKLQkJaW5mby5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdmlld2VyIGZyb20gdGhlIGxpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIHRoaXMKLQkgKiBmYWN0b3IgaXMgYXNzb2NpYXRlZCB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3Qgb2Ygdmlld2VycwotCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMucmVtb3ZlKHZpZXdlcik7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkvLyBpZiByZW1vdmluZyBsYXN0IHByb2plY3Rpb24gdmlld2VyLCBjbGVhciBvdXQgZXZlcnl0aGluZwotCQkJaWYgKGZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpIHsKLQkJCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZTM3OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCB3aXRoIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgZm9yIHRoaXMKLSAqIGFkYXB0ZXIgbm9kZSdzIGNoaWxkcmVuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTCBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC54bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBjbGFzcyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleHRlbmRzIFByb2plY3Rpb25Bbm5vdGF0aW9uIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc1Zpc2libGUgPSBmYWxzZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJcHJpdmF0ZSBOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihOb2RlIG5vZGUsIGJvb2xlYW4gaXNDb2xsYXBzZWQpIHsKLQkJCXN1cGVyKGlzQ29sbGFwc2VkKTsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKSB7Ci0JCQkJc3VwZXIubWFya0NvbGxhcHNlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGZBZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIE1hcCBmVGFnQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCBmYWN0b3J5KSB7Ci0JCWZBZGFwdGVyRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJvamVjdGlvbiBwb3NpdGlvbiBmcm9tIHRoZSBnaXZlbiBub2RlLiBBYmxlIHRvIGdldAotCSAqIHByb2plY3Rpb24gcG9zaXRpb24gaWYgbm9kZSBpc05vZGVQcm9qZWN0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gbnVsbCBpZiBubyBwcm9qZWN0aW9uIHBvc2l0aW9uIHBvc3NpYmxlLCBhIFBvc2l0aW9uIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgUG9zaXRpb24gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKE5vZGUgbm9kZSkgewotCQlQb3NpdGlvbiBwb3MgPSBudWxsOwotCQlpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkgJiYgKG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSkgewotCQkJLy8gSURvY3VtZW50IGRvY3VtZW50ID0KLQkJCS8vIGZBZGFwdGVyRmFjdG9yeS5nZXRQcm9qZWN0aW9uVmlld2VyKCkuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGlub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKChzdGFydCA+PSAwKSAmJiAoc3RhcnQgPCBlbmQpKSB7Ci0JCQkJLy8gcmVnaW9uLWJhc2VkCi0JCQkJLy8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IG5vIHJlZ2lvbiBpbmNyZWFzZSB3aGVuIGFkZAotCQkJCS8vIG5ld2xpbmUKLQkJCQlwb3MgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCQkvLyB0cnkgewotCQkJCS8vIC8vIGxpbmUtYmFzZWQKLQkJCQkvLyAvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uIGluY3JlYXNlIHdoZW4KLQkJCQkvLyBhZGQgbmV3bGluZQotCQkJCS8vIElSZWdpb24gc3RhcnRMaW5lUmVnaW9uID0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gSVJlZ2lvbiBlbmRMaW5lUmVnaW9uID0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChlbmQpOwotCQkJCS8vIGludCBzdGFydE9mZnNldCA9IHN0YXJ0TGluZVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkvLyBpbnQgZW5kT2Zmc2V0ID0gZW5kTGluZVJlZ2lvbi5nZXRPZmZzZXQoKSArCi0JCQkJLy8gZW5kTGluZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkvLyBpZiAoZW5kT2Zmc2V0ID4gc3RhcnRPZmZzZXQpIHsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24oc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gbm8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IHJlZ2lvbiBpbmNyZWFzZSB3aGVuCi0JCQkJLy8gYWRkIG5ld2xpbmUKLQkJCQkvLyBpbnQgc3RhcnRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBpbnQgZW5kTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChlbmQpOwotCQkJCS8vIGlmIChlbmRMaW5lICsgMSA8IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKSkgewotCQkJCS8vIGludCBvZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHN0YXJ0TGluZSk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoZW5kTGluZSArIDEpOwotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihvZmZzZXQsIGVuZE9mZnNldCAtIG9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCS8vIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIG51bGwsIHgpOwotCQkJCS8vIH0KLQkJCX0KLQkJCS8vIH0KLQkJfQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qKgotCSAqIEZpbmQgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZm9yIG5vZGUgaW4gdGhlIGN1cnJlbnQgbGlzdCBvZiBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbnMgZm9yIHRoaXMgYWRhcHRlcgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbgotCSAqLwotCXByaXZhdGUgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKE5vZGUgbm9kZSkgewotCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vID0gbnVsbDsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSkgewotCQkJSXRlcmF0b3IgaXQgPSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkgJiYgKGFubm8gPT0gbnVsbCkpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJTm9kZSBuID0gYS5nZXROb2RlKCk7Ci0JCQkJaWYgKG5vZGUuZXF1YWxzKG4pKSB7Ci0JCQkJCWFubm8gPSBhOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYW5ubzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGEgbm9kZSB0eXBlIGFibGUgdG8gZm9sZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgbm9kZSBpcyBwcm9qZWN0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTm9kZVByb2plY3RhYmxlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGNoZWNrIGlmIGZvbGRpbmcgaXMgZXZlbiBlbmFibGVkLCBpZiBub3QsIGp1c3QgaWdub3JlIG5vdGlmeUNoYW5nZWQKLQkJLy8gZXZlbnRzCi0JCWlmICghZkFkYXB0ZXJGYWN0b3J5LmlzQWN0aXZlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQpICYmIChub3RpZmllciBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQl1cGRhdGVBZGFwdGVyKChOb2RlKSBub3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBvZiBhbGwgdGhlIG5vZGVzIHRoYXQgYXJlIGNoaWxkcmVuIG9mCi0JICogbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0Jdm9pZCB1cGRhdGVBZGFwdGVyKE5vZGUgbm9kZSkgewotCQl1cGRhdGVBZGFwdGVyKG5vZGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlIGFuZCBhZGRzIGFsbCBwcm9qZWN0aW9uIGFubm90YXRpb25zIHRvIHZpZXdlciAoZm9yIG5ld2x5IGFkZGVkCi0JICogdmlld2VycykKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJTWFwIGFkZGl0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGdvIHRocm91Z2ggaW1tZWRpYXRlIGNoaWxkIG5vZGVzIGFuZCBmaWd1cmUgb3V0IHByb2plY3Rpb24KLQkJLy8gbW9kZWwgYW5ub3RhdGlvbnMKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCVBvc2l0aW9uIG5ld1BvcyA9IGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihjaGlsZE5vZGUpOwotCQkJCWlmIChuZXdQb3MgIT0gbnVsbCkgewotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gbmV3IFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKGNoaWxkTm9kZSwgZmFsc2UpOwotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleGlzdGluZyA9IGdldEV4aXN0aW5nQW5ub3RhdGlvbihjaGlsZE5vZGUpOwotCQkJCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGFkZAotCQkJCQkJYWRkaXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChleGlzdGluZywgbmV3UG9zKTsKLQkJCQkJCS8vIHJlbW92ZSBmcm9tIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGRlbGV0ZQotCQkJCQkJZlRhZ0Fubm90YXRpb25zLnJlbW92ZShleGlzdGluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIGluIHRoZSBlbmQsIHdhbnQgdG8gZGVsZXRlIGFueXRoaW5nIGxlZnRvdmVyIGluIG9sZCBsaXN0LCBhZGQKLQkJCS8vIGV2ZXJ5dGhpbmcgaW4gYWRkaXRpb25zLCBhbmQgdXBkYXRlIGV2ZXJ5dGhpbmcgaW4KLQkJCS8vIHByb2plY3Rpb25Bbm5vdGF0aW9ucwotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBvbGRMaXN0ID0gbnVsbDsKLQkJCWlmICghZlRhZ0Fubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW9sZExpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgZlRhZ0Fubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uW10gbW9kaWZ5TGlzdCA9IG51bGw7Ci0JCQlpZiAoIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQltb2RpZnlMaXN0ID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uW10pIHByb2plY3Rpb25Bbm5vdGF0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvblswXSk7Ci0JCQl9Ci0KLQkJCS8vIHNwZWNpZmljYWxseSBhZGQgYWxsIGFubm90YXRpb25zIHRvIHZpZXdlcgotCQkJaWYgKCh2aWV3ZXIgIT0gbnVsbCkgJiYgIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG51bGwsIHByb2plY3Rpb25Bbm5vdGF0aW9ucywgbnVsbCwgdmlld2VyKTsKLQkJCX0KLQotCQkJLy8gb25seSB1cGRhdGUgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gdXBkYXRlCi0JCQlpZiAoKChvbGRMaXN0ICE9IG51bGwpICYmIChvbGRMaXN0Lmxlbmd0aCA+IDApKSB8fCAoIWFkZGl0aW9ucy5pc0VtcHR5KCkpIHx8ICgobW9kaWZ5TGlzdCAhPSBudWxsKSAmJiAobW9kaWZ5TGlzdC5sZW5ndGggPiAwKSkpIHsKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG9sZExpc3QsIGFkZGl0aW9ucywgbW9kaWZ5TGlzdCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzYXZlIG5ldyBsaXN0IG9mIGFubm90YXRpb25zCi0JCWZUYWdBbm5vdGF0aW9ucyA9IHByb2plY3Rpb25Bbm5vdGF0aW9uczsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN0cmluZyBub2RlTmFtZSA9IG5vZGUgIT0gbnVsbCA/IG5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC51cGRhdGVBZGFwdGVyICgiICsgbm9kZU5hbWUgKyAiKToiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjY2ZmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdGlvbiB2aWV3ZXIgYW5kIGFsc28gbWFuYWdlcyB1cGRhdGluZwotICogdGhlIHZpZXdlcidzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotICovCi1jbGFzcyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JLyoqCi0JICogTGlzdGVucyB0byBkb2N1bWVudCB0byBiZSBhd2FyZSBvZiB3aGVuIHRvIHVwZGF0ZSB0aGUgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyByZWdpc3RlciBhIHBvc3Qgbm90aWZpY2F0aW9uIHJlcGxhY2Ugc28gdGhhdCBwcm9qZWN0aW9uCi0JCQkvLyBhbm5vdGF0aW9uIG1vZGVsIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBhbGwgZG9jdW1lbnRDaGFuZ2VkCi0JCQkvLyBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJaWYgKChkb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbikgJiYgKGZJbmZvLmdldERvY3VtZW50KCkgPT0gZG9jdW1lbnQpKSB7Ci0JCQkJaWYgKGZJbmZvLmhhc0NoYW5nZXNRdWV1ZWQoKSkgewotCQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbikgZG9jdW1lbnQpLnJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UodGhpcywgbmV3IFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW5mbykpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVzc2VudGlhbGx5IGEgcG9zdCBkb2N1bWVudCBjaGFuZ2VkIGxpc3RlbmVyIGJlY2F1c2UgaXQgaXMgY2FsbGVkIGFmdGVyCi0JICogZG9jdW1lbnRjaGFuZ2VkIGhhcyBiZWVuIGZpcmVkLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHsKLQkJcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gZkluZm87Ci0KLQkJcHVibGljIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGVyZm9ybShJRG9jdW1lbnQgZG9jdW1lbnQsIElEb2N1bWVudExpc3RlbmVyIG93bmVyKSB7Ci0JCQlmSW5mby5hcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY3VycmVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uCi0JICogdmlld2VyCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsIGZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsOwotCS8qKgotCSAqIERvY3VtZW50IGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uIHZpZXdlcgotCSAqLwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQkvKioKLQkgKiBMaXN0ZW5lciB0byBmUHJvamVjdGlvblZpZXdlcidzIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBmRG9jdW1lbnRMaXN0ZW5lcjsKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZG9jdW1lbnQgaXMgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmSXNEb2N1bWVudENoYW5naW5nID0gZmFsc2U7Ci0JLyoqCi0JICogTGlzdCBvZiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0aGF0IG5lZWQgdG8gYmUgYXBwbGllZAotCSAqLwotCXByaXZhdGUgTGlzdCBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWZEb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCA9IHZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCk7Ci0JfQotCi0JSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpIHsKLQkJaWYgKGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9PSBudWxsKSB7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlczsKLQl9Ci0KLQl2b2lkIHNldElzRG9jdW1lbnRDaGFuZ2luZyhib29sZWFuIGNoYW5naW5nKSB7Ci0JCWZJc0RvY3VtZW50Q2hhbmdpbmcgPSBjaGFuZ2luZzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudENoYW5naW5nKCkgewotCQlyZXR1cm4gZklzRG9jdW1lbnRDaGFuZ2luZzsKLQl9Ci0KLQkvKioKLQkgKiBBcHBsaWVzIHRoZSBwZW5kaW5nIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjaGFuZ2VzIHRvIHRoZQotCSAqIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQl2b2lkIGFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpIHsKLQkJTGlzdCBxdWV1ZWRDaGFuZ2VzID0gZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKTsKLQkJLy8gZ28gdGhyb3VnaCBhbGwgdGhlIHBlbmRpbmcgYW5ub3RhdGlvbiBjaGFuZ2VzIGFuZCBhcHBseQotCQkvLyB0aGVtIHRvCi0JCS8vIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkJd2hpbGUgKCFxdWV1ZWRDaGFuZ2VzLmlzRW1wdHkoKSkgewotCQkJUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgY2hhbmdlcyA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcykgcXVldWVkQ2hhbmdlcy5yZW1vdmUoMCk7Ci0JCQl0cnkgewotCQkJCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsLm1vZGlmeUFubm90YXRpb25zKGNoYW5nZXMuZ2V0RGVsZXRpb25zKCksIGNoYW5nZXMuZ2V0QWRkaXRpb25zKCksIGNoYW5nZXMuZ2V0TW9kaWZpY2F0aW9ucygpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGxvZyBpdCBiZSBjb250aW51ZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW5ub3RhdGlvbiBjaGFuZ2VzIHF1ZXVlZCB1cCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNDaGFuZ2VzUXVldWVkKCkgewotCQlyZXR1cm4gIWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgbmV3Q2hhbmdlKSB7Ci0JCS8qCi0JCSAqIGZ1dHVyZV9UT0RPOiBtYXliZSBpbXByb3ZlIGJ5IGNoZWNraW5nIGlmIGFubm90YXRpb24gcHJvamVjdGlvbgotCQkgKiBtb2RlbCBjaGFuZ2UgYWxyZWFkeSBleGlzdHMgZm9yIG5vZGUuIGlmIHNvLCB0aHJvdyBvdXQgb2xkIGNoYW5nZS4KLQkJICovCi0JCWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuYWRkKG5ld0NoYW5nZSk7Ci0KLQkJLy8gaWYgZG9jdW1lbnQgaXNuJ3QgY2hhbmdpbmcsIGdvIGFoZWFkIGFuZCBhcHBseSBpdAotCQlpZiAoIWlzRG9jdW1lbnRDaGFuZ2luZygpKSB7Ci0JCQlhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGFkZCBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlnZXREb2N1bWVudCgpLmFkZERvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIHJlbW92ZSBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZ2V0RG9jdW1lbnQoKS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBsaXN0IG9mIHF1ZXVlZCBjaGFuZ2VzIHNpbmNlIGl0IG1heSBubyBsb25nZXIKLQkJLy8gYmUgYWNjdXJhdGUKLQkJaWYgKGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyAhPSBudWxsKSB7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMuY2xlYXIoKTsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwNDdiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHRoZSBwcm9qZWN0aW9uIG1vZGVsIG9mIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgWE1MLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIsIElQcm9qZWN0aW9uTGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC54bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkvKioKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBjaGlsZCBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvciBwZXJmb3JtYW5jZQotCSAqIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0NISUxEUkVOID0gMTA7Ci0JLyoqCi0JICogTWF4aW11bSBudW1iZXIgb2Ygc2libGluZyBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvcgotCSAqIHBlcmZvcm1hbmNlIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NJQkxJTkdTID0gMTAwMDsKLQotCS8qKgotCSAqIEFkZHMgYW4gYWRhcHRlciB0byBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBjaGlsZExldmVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihOb2RlIG5vZGUsIGludCBjaGlsZExldmVsKSB7Ci0JCS8vIHN0b3AgYWRkaW5nIGluaXRpYWwgYWRhcHRlcnMgTUFYX0NISUxEUkVOIGxldmVscyBkZWVwIGZvcgotCQkvLyBwZXJmb3JtYW5jZSBzYWtlCi0JCWlmICgobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpICYmIChjaGlsZExldmVsIDwgTUFYX0NISUxEUkVOKSkgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBub2RlOwotCi0JCQkvLyB0cnkgYW5kIGdldCB0aGUgYWRhcHRlciBmb3IgdGhlIGN1cnJlbnQgbm9kZSBhbmQgdXBkYXRlIHRoZQotCQkJLy8gYWRhcHRlciB3aXRoIHByb2plY3Rpb24gaW5mb3JtYXRpb24KLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MIGFkYXB0ZXIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci51cGRhdGVBZGFwdGVyKG5vZGUsIGZWaWV3ZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCBjYWxsIGdldGFkYXB0ZXIgc28gdGhlIGFkYXB0ZXIgaXMgY3JlYXRlZCBhbmQKLQkJCQkvLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkCi0JCQkJbm90aWZpZXIuZ2V0QWRhcHRlckZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC5jbGFzcyk7Ci0JCQl9Ci0JCQlpbnQgc2libGluZ0xldmVsID0gMDsKLQkJCU5vZGUgbmV4dENoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoKG5leHRDaGlsZCAhPSBudWxsKSAmJiAoc2libGluZ0xldmVsIDwgTUFYX1NJQkxJTkdTKSkgewotCQkJCU5vZGUgY2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGNoaWxkTm9kZSwgY2hpbGRMZXZlbCArIDEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIGFkZHMgYW4gYWRhcHRlciBvbnRvIGVhY2ggZm9yIHRyYWNraW5nCi0JICogcHVycG9zZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCWludCBzaWJsaW5nTGV2ZWwgPSAwOwotCQkJCQkJTm9kZSBuZXh0U2libGluZyA9IChOb2RlKSBzdGFydE5vZGU7Ci0JCQkJCQl3aGlsZSAoKG5leHRTaWJsaW5nICE9IG51bGwpICYmIChzaWJsaW5nTGV2ZWwgPCBNQVhfU0lCTElOR1MpKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCWFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihjdXJyZW50Tm9kZSwgMCk7Ci0JCQkJCQkJKytzaWJsaW5nTGV2ZWw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwuYWRkQWxsQWRhcHRlcnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwgdG8gdXNlIHdpdGggdGhpcyBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTAotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGdldEFkYXB0ZXJGYWN0b3J5KGJvb2xlYW4gY3JlYXRlSWZOZWVkZWQpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHNNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCQkJCQkvLyBnZXR0aW5nIHRoZSBwcm9qZWN0aW9ubW9kZWxub2RlYWRhcHRlciBmb3IgdGhlIGZpcnN0Ci0JCQkJCS8vIHRpbWUKLQkJCQkJLy8gc28gZG8gc29tZSBpbml0aWFsaXppbmcKLQkJCQkJaWYgKCFmYWN0b3J5UmVnaXN0cnkuY29udGFpbnMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MpICYmIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCQkJCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwgbmV3RmFjdG9yeSA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwoKTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gZmFjdG9yeSByZWdpc3RyeQotCQkJCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkobmV3RmFjdG9yeSk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIHByb3BvZ2F0aW5nIGFkYXB0ZXIKLQkJCQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHNNb2RlbDsKLQkJCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAocHJvcGFnYXRpbmdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3RmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyB0cnkgYW5kIGdldCB0aGUgZmFjdG9yeQotCQkJCQlmYWN0b3J5ID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCkgZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MLmdldEFkYXB0ZXJGYWN0b3J5OiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIGNsZWFyIG91dCBvbGQgaW5mbwotCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQlmRG9jdW1lbnQgPSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0KLQkJLy8gc2V0IHByb2plY3Rpb24gdmlld2VyIG9uIG5ldyBkb2N1bWVudCdzIGFkYXB0ZXIgZmFjdG9yeQotCQlpZiAoZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSh0cnVlKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlmYWN0b3J5LmFkZFByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgzMDQKLQkJCQkvLyBkaXNhYmxlIHJlZHJhdyB3aGlsZSBhZGRpbmcgYWxsIGFkYXB0ZXJzCi0JCQkJZlZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCWFkZEFsbEFkYXB0ZXJzKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlmVmlld2VyLnNldFJlZHJhdyh0cnVlKTsKLQkJCX0KLQkJfQotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwuaW5pdGlhbGl6ZTogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGUgYSBQcm9qZWN0aW9uVmlld2VyIHdpdGggdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHVuaW5zdGFsbCBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbGwgbmV3IHZpZXdlcgotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJdW5pbnN0YWxsKCk7Ci0JCX0KLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJZlZpZXdlci5hZGRQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5zdGFsbGVkKCkgewotCQlyZXR1cm4gZlZpZXdlciAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeShmYWxzZSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCWZhY3RvcnkucmVtb3ZlUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBhbGwgYW5ub3RhdGlvbnMKLQkJaWYgKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpIHsKLQkJCWZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpLnJlbW92ZUFsbEFubm90YXRpb25zKCk7Ci0JCX0KLQotCQlyZW1vdmVBbGxBZGFwdGVycygpOwotCi0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbiBhZGFwdGVyIGZyb20gbm9kZSBhbmQgaXRzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWRhcHRlckZyb21Ob2RlQW5kQ2hpbGRyZW4oTm9kZSBub2RlLCBpbnQgbGV2ZWwpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0KLQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBhZGFwdGVyIGZvciB0aGUgY3VycmVudCBub2RlIGFuZCByZW1vdmUgaXQKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlub3RpZmllci5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJfQotCi0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJTm9kZSBjaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQlyZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihjaGlsZE5vZGUsIGxldmVsICsgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgcmVtb3ZlcyBhZGFwdGVyIGZyb20gZWFjaCBmb3IgY2xlYW51cAotCSAqIHB1cnBvc2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG5leHRTaWJsaW5nID0gKE5vZGUpIHN0YXJ0Tm9kZTsKLQkJCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCXJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MLnJlbW92ZUFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoKGZEb2N1bWVudCAhPSBudWxsKSAmJiAoZkRvY3VtZW50ICE9IG5ld0lucHV0KSkgewotCQkJLy8gZGlzYWJsZSBwcm9qZWN0aW9uIGFuZCBkaXNjb25uZWN0IGV2ZXJ5dGhpbmcKLQkJCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIHByb2plY3Rpb24gd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBiZWZvcmUgaW5wdXQgZG9jdW1lbnQgY2hhbmdlZAotCQkvLyBhbmQgbmV3IGRvY3VtZW50IGlzIGRpZmZlcmVudCB0aGFuIG9sZCBkb2N1bWVudAotCQlpZiAoZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkICYmIChmRG9jdW1lbnQgPT0gbnVsbCkgJiYgKG5ld0lucHV0ICE9IG51bGwpKSB7Ci0JCQlwcm9qZWN0aW9uRW5hYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIGZyb20gcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQkJZlZpZXdlci5yZW1vdmVQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyLnJlbW92ZVRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9FbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9FbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YmQ5ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGZvciBwcm9wZXJ0aWVzIHdoaWNoIHJlcXVpcmUgYSBjb21ibyBib3ggY2VsbAotICogZWRpdG9yIGFuZCB3aG9zZSB2YWx1ZXMgY29uc2lzdCBvZiBhIGxpc3Qgb2YgZW51bWVyYXRlZCBzdHJpbmdzLgotICovCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvciBleHRlbmRzIFByb3BlcnR5RGVzY3JpcHRvciB7Ci0JcHJvdGVjdGVkIFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvciBmRWRpdG9yOwotCXByb3RlY3RlZCBDb21wb3NpdGUgZlBhcmVudDsKLQotCS8qKgotCSAqIFRoZSBlbnVtZXJhdGVkIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGRlc2NyaWJlZCBwcm9wZXJ0eQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZlZhbHVlc1tdID0gbnVsbDsKLQotCXB1YmxpYyBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBpZCwgU3RyaW5nIG5ld0Rpc3BsYXlOYW1lLCBTdHJpbmdbXSB2YWx1ZXNBcnJheSkgewotCQlzdXBlcihpZCwgbmV3RGlzcGxheU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKSBpZCk7Ci0JCWZWYWx1ZXMgPSB2YWx1ZXNBcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGNlbGwgZWRpdG9yIGZvciBlZGl0aW5nIHRoaXMgcHJvcGVydHkuCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGVkaXRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgd2lkZ2V0IGZvciB0aGUgY2VsbCBlZGl0b3IKLQkgKiBAcmV0dXJuIHRoZSBjZWxsIGVkaXRvciBmb3IgdGhpcyBwcm9wZXJ0eSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoaXMgcHJvcGVydHkgY2Fubm90IGJlIGVkaXRlZAotCSAqLwotCXB1YmxpYyBDZWxsRWRpdG9yIGNyZWF0ZVByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIENlbGwgRWRpdG9yIHdpdGggYSB2YWxpZCBDb250cm9sCi0JCS8vIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0JCS8vIElmIGFueSBvZiB0aGF0J3Mgbm90IHRydWUsIGNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IENlbGwgRWRpdG9yCi0JCWlmICgoZkVkaXRvciA9PSBudWxsKSB8fCAoZkVkaXRvci5nZXRDb250cm9sKCkgPT0gbnVsbCkgfHwgZkVkaXRvci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpIHx8IChwYXJlbnQgIT0gZlBhcmVudCkpIHsKLQkJCWZFZGl0b3IgPSBuZXcgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yKHBhcmVudCwgZlZhbHVlcyk7Ci0JCX0KLQkJZlBhcmVudCA9IHBhcmVudDsKLQkJcmV0dXJuIGZFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVmFsdWVzKFN0cmluZyBuZXdWYWx1ZXNbXSkgewotCQlpZiAoQXJyYXlzLmVxdWFscyhmVmFsdWVzLCBuZXdWYWx1ZXMpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZlZhbHVlcyA9IG5ld1ZhbHVlczsKLQkJaWYgKGZFZGl0b3IgIT0gbnVsbCkgewotCQkJZkVkaXRvci5zZXRJdGVtcyhuZXdWYWx1ZXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TdHJpbmdDb21ib0JveENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1MzZiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TdHJpbmdDb21ib0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIEFuIGV4dGVuZGVkIENvbWJvQm94Q2VsbEVkaXRvciB0aGF0IHNlbGVjdHMgYW5kIHJldHVybnMgU3RyaW5ncwotICovCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdDb21ib0JveENlbGxFZGl0b3IgZXh0ZW5kcyBDb21ib0JveENlbGxFZGl0b3IgewotCXByaXZhdGUgYm9vbGVhbiBmU2V0dGluZ1ZhbHVlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCXN1cGVyKHBhcmVudCwgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGl0ZW1zLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBpdGVtcywgc3R5bGUpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZG9HZXRWYWx1ZSgpIHsKLQkJLy8gb3RoZXJ3aXNlIGxpbWl0cyB0byBzZXQgb2YgdmFsaWQgdmFsdWVzCi0JCU9iamVjdCBpbmRleCA9IHN1cGVyLmRvR2V0VmFsdWUoKTsKLQkJaW50IHNlbGVjdGlvbiA9IC0xOwotCQlpZiAoaW5kZXggaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQlzZWxlY3Rpb24gPSAoKEludGVnZXIpIGluZGV4KS5pbnRWYWx1ZSgpOwotCQl9Ci0JCWlmIChzZWxlY3Rpb24gPj0gMCkgewotCQkJcmV0dXJuIGdldEl0ZW1zKClbc2VsZWN0aW9uXTsKLQkJfQotCQllbHNlIGlmIChnZXRDb250cm9sKCkgaW5zdGFuY2VvZiBDQ29tYm8pIHsKLQkJCS8vIHJldHJpZXZlIHRoZSBhY3R1YWwgdGV4dCBhcyB0aGUgbGlzdCBvZiB2YWxpZCBpdGVtcyBkb2Vzbid0Ci0JCQkvLyBjb250YWluIHRoZSB2YWx1ZQotCQkJcmV0dXJuICgoQ0NvbWJvKSBnZXRDb250cm9sKCkpLmdldFRleHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZlNldHRpbmdWYWx1ZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZTZXR0aW5nVmFsdWUgPSB0cnVlOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQlzdXBlci5kb1NldFZhbHVlKHZhbHVlKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlpbnQgc2VsZWN0aW9uID0gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdldEl0ZW1zKCkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZ2V0SXRlbXMoKVtpXS5lcXVhbHMoc3RyaW5nVmFsdWUpKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IGk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNlbGVjdGlvbiA+PSAwKSB7Ci0JCQkJc3VwZXIuZG9TZXRWYWx1ZShuZXcgSW50ZWdlcihzZWxlY3Rpb24pKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN1cGVyLmRvU2V0VmFsdWUobmV3IEludGVnZXIoLTEpKTsKLQkJCQlpZiAoKGdldENvbnRyb2woKSBpbnN0YW5jZW9mIENDb21ibykgJiYgIXN0cmluZ1ZhbHVlLmVxdWFscygoKENDb21ibykgZ2V0Q29udHJvbCgpKS5nZXRUZXh0KCkpKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgVGV4dCB3aWRnZXQKLQkJCQkJKChDQ29tYm8pIGdldENvbnRyb2woKSkuc2V0VGV4dChzdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZTZXR0aW5nVmFsdWUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBuZXdJdGVtcykgewotCQlpZiAoKGdldENvbnRyb2woKSA9PSBudWxsKSB8fCBnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkF0dGVtcHRlZCB0byB1cGRhdGUgaXRlbSBsaXN0IGZvciBkaXNwb3NlZCBjZWxsIGVkaXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBrZWVwIHNlbGVjdGlvbiBpZiBwb3NzaWJsZQotCQlPYmplY3QgcHJldmlvdXNTZWxlY3RlZFZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJc3VwZXIuc2V0SXRlbXMobmV3SXRlbXMpOwotCQlpZiAoKHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSAhPSBudWxsKSAmJiAoZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgQ0NvbWJvKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChuZXdJdGVtc1tpXS5lcXVhbHMocHJldmlvdXNTZWxlY3RlZFZhbHVlKSkgewotCQkJCQlzZXRWYWx1ZShwcmV2aW91c1NlbGVjdGVkVmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2JhNzNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQW4gSVByb3BlcnR5U291cmNlIGltcGxlbWVudGF0aW9uIGZvciBhIEpGYWNlIHZpZXdlciB1c2VkIHRvIGRpc3BsYXkKLSAqIHByb3BlcnRpZXMgb2YgRE9NIG5vZGVzLgotICovCi1wdWJsaWMgY2xhc3MgWE1MUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UsIElQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbiwgSVByb3BlcnR5U291cmNlMiB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfQVRUUklCVVRFUyA9IFhNTFVJTWVzc2FnZXMuWE1MUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGZTZXRFeHBlcnRGaWx0ZXIgPSBmYWxzZTsKLQotCS8qKgotCSAqIGRlcml2ZSBjYXRlZ29yaWVzIGZyb20gQ01EYXRhVHlwZXM7IGRpc2FibGVkIHVudGlsIGRpc3BsYXkgc3RyaW5ncyBjYW4KLQkgKiBiZSBwbGFubmVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmU2hvdWxkRGVyaXZlQ2F0ZWdvcmllcyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmU29ydEVudW1lcmF0ZWRWYWx1ZXMgPSB0cnVlOwotCi0JLyoqCi0JICogTm90ZTogd2Ugd2FudCB0aGUgZGVmYXVsdCBmQ2FzZVNlbnNpdGl2ZSB0byBiZSB0cnVlLCBidXQsIHRvIGF2b2lkCi0JICogbWVhbmluZ2xlc3MgZG91YmxlIGluaXRpYWxpemF0aW9uLCB3ZSBsZWF2ZSBkZWZhdWx0IGhlcmUsIGFuZCBzZXQgaW4KLQkgKiBjb25zdHJ1Y3RvciBvbmx5LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmQ2FzZVNlbnNpdGl2ZTsKLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBmRGVzY3JpcHRvcnMgPSBudWxsOwotCXByaXZhdGUgTm9kZSBmTm9kZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0YWNrIGZWYWx1ZXNCZWluZ1NldCA9IG5ldyBTdGFjaygpOwotCi0JcHVibGljIFhNTFByb3BlcnR5U291cmNlKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZOb2RlID0gaW5pdE5vZGUodGFyZ2V0KTsKLQkJZkNhc2VTZW5zaXRpdmUgPSBpbml0Q2FzZVNlbnNpdGl2ZShmTm9kZSk7Ci0KLQl9Ci0KLQkvKiogc2VwZXJhdGUgbWV0aG9kIGp1c3QgdG8gaXNvbGF0ZSBlcnJvciBwcm9jZXNzaW5nICovCi0JcHJpdmF0ZSBOb2RlIGluaXROb2RlKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlub2RlID0gKE5vZGUpIHRhcmdldDsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlhNTFByb3BlcnR5U291cmNlIGlzIG9ubHkgZm9yIE5vZGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5pdENhc2VTZW5zaXRpdmUoTm9kZSBub2RlKSB7Ci0JCS8vIGFsbW9zdCBhbGwgdGFncyBhcmUgY2FzZSBzZW5zdGl2ZSwgZXhjZXB0IHRoYXQgb2xkIEhUTUwKLQkJYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJYWRhcHRlciA9IGdldERvY1R5cGVGcm9tRE9NTm9kZShub2RlKTsKLQkJfQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQljYXNlU2Vuc2l0aXZlID0gKGFkYXB0ZXIuZ2V0VGFnTmFtZUNhc2UoKSA9PSBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFKTsKLQkJfQotCQlyZXR1cm4gY2FzZVNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBieSAiaW50ZXJuYWwgc3BlYyIgdGhlIERPQ1RZUEUgYWRhcHRlciBpcyBvbmx5IGF2YWlsYWJsZSBmcm9tIERvY3VtZW50Ci0JICogTm9kZQotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rIERvY3VtZW50VHlwZUFkYXB0ZXJ9Ci0JICovCi0JcHJpdmF0ZSBEb2N1bWVudFR5cGVBZGFwdGVyIGdldERvY1R5cGVGcm9tRE9NTm9kZShOb2RlIG5vZGUpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJRG9jdW1lbnQgb3duZXJEb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAob3duZXJEb2N1bWVudCA9PSBudWxsKSB7Ci0JCQkvLyBpZiBvd25lckRvY3VtZW50IGlzIG51bGwsIHRoZW4gZk5vZGUgbXVzdCBiZSB0aGUgRG9jdW1lbnQgTm9kZQotCQkJLy8gW29sZCwgb2xkIGNvbW1lbnRdCi0JCQkvLyBobW1tbSwgZ3Vlc3Mgbm90LiBTZWUKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzAyMzMKLQkJCS8vIGd1ZXNzIHRoaXMgaXMgdXNlZCBmb3IgbWFueSBJTm9kZU5vdGlmaWVycywgbm90IGp1c3QgWE1MLgotCQkJLy8gKGFuZCBEVEQncyB1c2UgSURPTU5vZGU/IC4uLiB0aGF0IGRvZXNuJ3Qgc291bmQgcXVpdGUgcmlnaHQKLQkJCS8vIC4uLiBidXQsIG1heWJlIGEgc2VwYXJhdGUgaXNzdWUpLgotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJCW93bmVyRG9jdW1lbnQgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKG93bmVyRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIG93bmVyRG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIF9nZXRWYWxpZEZpeGVkU3RyaW5ncyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIGhlbHBlcikgewotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCVN0cmluZyBpbXBsaWVkVmFsdWUgPSBoZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCWlmIChpbXBsaWVkVmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWVzLmFkZChpbXBsaWVkVmFsdWUpOwotCQl9Ci0JCWJvb2xlYW4gY2hlY2tJZkN1cnJlbnRWYWx1ZUlzSW5jbHVkZWQgPSAoKGZOb2RlLmdldEF0dHJpYnV0ZXMoKSAhPSBudWxsKSAmJiAoZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKSAhPSBudWxsKSAmJiAoZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKSAhPSBudWxsKSk7Ci0JCWlmIChjaGVja0lmQ3VycmVudFZhbHVlSXNJbmNsdWRlZCkgewotCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCQljdXJyZW50VmFsdWUgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpOwotCQkJaWYgKCFjdXJyZW50VmFsdWUuZXF1YWxzKGltcGxpZWRWYWx1ZSkpIHsKLQkJCQl2YWx1ZXMuYWRkKGN1cnJlbnRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gdmFsaWRTdHJpbmdzID0gbmV3IFN0cmluZ1t2YWx1ZXMuc2l6ZSgpXTsKLQkJdmFsaWRTdHJpbmdzID0gKFN0cmluZ1tdKSB2YWx1ZXMudG9BcnJheSh2YWxpZFN0cmluZ3MpOwotCQlyZXR1cm4gdmFsaWRTdHJpbmdzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gX2dldFZhbGlkU3RyaW5ncyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIHZhbHVlc0hlbHBlcikgewotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWJvb2xlYW4gY3VycmVudFZhbHVlS25vd24gPSBmYWxzZTsKLQkJYm9vbGVhbiBjaGVja0lmQ3VycmVudFZhbHVlSXNLbm93biA9ICgoZk5vZGUuZ2V0QXR0cmlidXRlcygpICE9IG51bGwpICYmIChmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpICE9IG51bGwpICYmIChmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpICE9IG51bGwpKTsKLQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCWlmIChjaGVja0lmQ3VycmVudFZhbHVlSXNLbm93bikgewotCQkJY3VycmVudFZhbHVlID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKTsKLQkJfQotCi0JCWlmICgodmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZUtpbmQoKSA9PSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQpICYmICh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkpIHsKLQkJCS8vIEZJWEVEIHZhbHVlCi0JCQljdXJyZW50VmFsdWVLbm93biA9IChjdXJyZW50VmFsdWUgIT0gbnVsbCkgJiYgdmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpLmVxdWFscyhjdXJyZW50VmFsdWUpOwotCQkJdmFsdWVzLmFkZCh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gRU5VTUVSQVRFRCB2YWx1ZXMKLQkJCVN0cmluZ1tdIHZhbHVlU3RyaW5ncyA9IG51bGw7Ci0JCQkvLyB2YWx1ZVN0cmluZ3MgPSB2YWx1ZXNIZWxwZXIuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShmTm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKChtb2RlbFF1ZXJ5ICE9IG51bGwpICYmIChmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSkgewotCQkJCXZhbHVlU3RyaW5ncyA9IG1vZGVsUXVlcnkuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcygoRWxlbWVudCkgZk5vZGUsIGF0dHJEZWNsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZhbHVlU3RyaW5ncyA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJfQotCQkJaWYgKHZhbHVlU3RyaW5ncyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZVN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNoZWNrSWZDdXJyZW50VmFsdWVJc0tub3duICYmIHZhbHVlU3RyaW5nc1tpXS5lcXVhbHMoY3VycmVudFZhbHVlKSkgewotCQkJCQkJY3VycmVudFZhbHVlS25vd24gPSB0cnVlOwotCQkJCQl9Ci0JCQkJCXZhbHVlcy5hZGQodmFsdWVTdHJpbmdzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FKSAmJiAodmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpKSB7Ci0JCQlpZiAoIXZhbHVlcy5jb250YWlucyh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpKSB7Ci0JCQkJdmFsdWVzLmFkZCh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNoZWNrSWZDdXJyZW50VmFsdWVJc0tub3duICYmICFjdXJyZW50VmFsdWVLbm93biAmJiAoY3VycmVudFZhbHVlICE9IG51bGwpICYmIChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJdmFsdWVzLmFkZChjdXJyZW50VmFsdWUpOwotCQl9Ci0JCVN0cmluZ1tdIHZhbGlkU3RyaW5ncyA9IG5ldyBTdHJpbmdbdmFsdWVzLnNpemUoKV07Ci0JCXZhbGlkU3RyaW5ncyA9IChTdHJpbmdbXSkgdmFsdWVzLnRvQXJyYXkodmFsaWRTdHJpbmdzKTsKLQkJcmV0dXJuIHZhbGlkU3RyaW5nczsKLQl9Ci0KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGJvb2xlYW4gaGlkZU9uRmlsdGVyKSB7Ci0JCS8vIFRoZSBkZXNjcmlwdG9yIGNsYXNzIHVzZWQgaGVyZSBpcyBhbHNvIHVzZWQgaW4KLQkJLy8gdXBkYXRlUHJvcGVydHlEZXNjcmlwdG9ycygpCi0JCVRleHRQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KG51bGwpKTsKLQkJZGVzY3JpcHRvci5zZXREZXNjcmlwdGlvbihhdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKGhpZGVPbkZpbHRlciAmJiBmU2V0RXhwZXJ0RmlsdGVyKSB7Ci0JCQlkZXNjcmlwdG9yLnNldEZpbHRlckZsYWdzKG5ldyBTdHJpbmdbXXtJUHJvcGVydHlTaGVldEVudHJ5LkZJTFRFUl9JRF9FWFBFUlR9KTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgYW4gYXR0cmlidXRlIHdpdGggRU5VTUVSQVRFRCB2YWx1ZXMgLQotCSAqIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwgYW4gZWRpdGFibGUgY29tYm8gYm94IGlzIHJldHVybmVkIC0gaWYgdGhlCi0JICogdmFsdWUgZXhpc3RzIGJ1dCBpcyBub3Qgb25lIGluIHRoZSBlbnVtZXJhdGVkIGxpc3Qgb2YgdmFsdWUsIGEgY29tYm8KLQkgKiBib3ggZmVhdHVyaW5nIHRoZSBjdXJyZW50IGFuZCBjb3JyZWN0IHZhbHVlcyBpcyByZXR1cm5lZCAtIGlmIHRoZSB2YWx1ZQotCSAqIGV4aXN0cyBhbmQgaXQgaXMgYSB2YWxpZCB2YWx1ZSwgYSBjb21ibyBib3ggZmVhdHVyaW5nIHRoZSBjb3JyZWN0Ci0JICogdmFsdWVzIHdpdGggdGhlIGN1cnJlbnQgb25lIHZpc2libGUgaXMgcmV0dXJuZWQKLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRW51bWVyYXRlZFByb3BlcnR5RGVzY3JpcHRvcihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIHZhbHVlc0hlbHBlcikgewotCQkvLyB0aGUgZGlzcGxheU5hbWUgTVVTVCBiZSBzZXQKLQkJU3RyaW5nIGF0dHJOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGF0dHJEZWNsLCBmTm9kZSwgbnVsbCk7Ci0JCUVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJOYW1lLCBhdHRyTmFtZSwgX2dldFZhbGlkU3RyaW5ncyhhdHRyRGVjbCwgdmFsdWVzSGVscGVyKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoZ2V0Q2F0ZWdvcnkoYXR0ckRlY2wpKTsKLQkJZGVzY3JpcHRvci5zZXREZXNjcmlwdGlvbihhdHRyTmFtZSk7Ci0JCWlmICgoYXR0ckRlY2wuZ2V0VXNhZ2UoKSAhPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSAmJiBmU2V0RXhwZXJ0RmlsdGVyKSB7Ci0JCQlkZXNjcmlwdG9yLnNldEZpbHRlckZsYWdzKG5ldyBTdHJpbmdbXXtJUHJvcGVydHlTaGVldEVudHJ5LkZJTFRFUl9JRF9FWFBFUlR9KTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgYW4gYXR0cmlidXRlIHdpdGggYSBGSVhFRCB2YWx1ZSAtIGlmCi0JICogdGhlIHZhbHVlIGRvZXMgbm90IGV4aXN0LCBhbiBlZGl0YWJsZSBjb21ibyBib3ggaXMgcmV0dXJuZWQgLSBpZiB0aGUKLQkgKiB2YWx1ZSBleGlzdHMgYnV0IGlzIG5vdCB0aGUgZml4ZWQvZGVmYXVsdCB2YWx1ZSwgYSBjb21ibyBib3ggZmVhdHVyaW5nCi0JICogdGhlIGN1cnJlbnQgYW5kIGNvcnJlY3QgdmFsdWUgaXMgcmV0dXJuZWQgLSBpZiB0aGUgdmFsdWUgZXhpc3RzIGFuZCBpdAotCSAqIGlzIHRoZSBmaXhlZC9kZWZhdWx0IHZhbHVlLCBubyBjZWxsIGVkaXRvciBpcyBwcm92aWRlZCAibG9ja2luZyIgdGhlCi0JICogdmFsdWUgaW4KLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRml4ZWRQcm9wZXJ0eURlc2NyaXB0b3IoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCwgQ01EYXRhVHlwZSBoZWxwZXIpIHsKLQkJLy8gdGhlIGRpc3BsYXlOYW1lIE1VU1QgYmUgc2V0Ci0JCVN0cmluZyBhdHRyTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQlFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcihhdHRyTmFtZSwgYXR0ck5hbWUsIF9nZXRWYWxpZEZpeGVkU3RyaW5ncyhhdHRyRGVjbCwgaGVscGVyKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoZ2V0Q2F0ZWdvcnkoYXR0ckRlY2wpKTsKLQkJZGVzY3JpcHRvci5zZXREZXNjcmlwdGlvbihET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoYXR0ckRlY2wsIGZOb2RlLCBudWxsKSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsKSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCi0JCWlmIChhdHRyVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBoYW5kbGUgZGVjbGFyYXRpb25zIHRoYXQgcHJvdmlkZSBGSVhFRC9FTlVNRVJBVEVEIHZhbHVlcwotCQkJaWYgKChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkgIT0gbnVsbCkgJiYgKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS5sZW5ndGggPiAwKSkgewotCQkJCWRlc2NyaXB0b3IgPSBjcmVhdGVFbnVtZXJhdGVkUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLCBhdHRyVHlwZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgoKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5GSVhFRCkgfHwgKGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSA9PSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQpKSAmJiAoYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkpIHsKLQkJCQlkZXNjcmlwdG9yID0gY3JlYXRlRml4ZWRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wsIGF0dHJUeXBlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHBsYWluIHRleHQKLQkJCQlkZXNjcmlwdG9yID0gY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBubyBleHRyYSBpbmZvcm1hdGlvbiBnaXZlbgotCQkJZGVzY3JpcHRvciA9IGNyZWF0ZVRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB2YWxpZCBkZXNjcmlwdG9ycy4KLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gbnVsbDsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXREZWNsYXJhdGlvbigpOwotCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShmTm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIGZOb2RlLCBlZCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBub2Rlcy5zaXplKCk7IGsrKykgewotCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJYWxsQXR0cmlidXRlcy5wdXQoY21ub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhdHRyTWFwID0gYWxsQXR0cmlidXRlczsKLQkJfQotCi0JCUxpc3QgZGVzY3JpcHRvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gbnVsbDsKLQotCQkvLyBhZGQgZGVzY3JpcHRvcnMgZm9yIGV4aXN0aW5nIGF0dHJpYnV0ZXMKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkvLyBpZiBtZXRhaW5mbyBpcyBwcmVzZW50IGZvciB0aGlzIGF0dHJpYnV0ZSwgdXNlIHRoZQotCQkJCS8vIENNQXR0cmlidXRlRGVjbGFyYXRpb24gdG8gZGVyaXZlIGEgZGVzY3JpcHRvcgotCQkJCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCQkJCWlmIChmQ2FzZVNlbnNpdGl2ZSkgewotCQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ck1hcC5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYXR0ckRlY2wgPSBudWxsOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyTWFwLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQlpZiAoIWZDYXNlU2Vuc2l0aXZlICYmIGF0dHJNYXAuaXRlbShqKS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJNYXAuaXRlbShqKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGJlIGNvbnNpc3RlbnQ6IGlmIHRoZXJlJ3MgbWV0YWluZm8sIHVzZSAqdGhhdCogYXMgdGhlCi0JCQkJLy8gZGVzY3JpcHRvciBJRAotCQkJCWRlc2NyaXB0b3IgPSBudWxsOwotCQkJCWlmIChhdHRyRGVjbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRyTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQkJCQlpZiAoIW5hbWVzLmNvbnRhaW5zKGF0dHJOYW1lKSkgewotCQkJCQkJZGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJCQkJCW5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICghbmFtZXMuY29udGFpbnMoYXR0ci5nZXROYW1lKCkpKSB7Ci0JCQkJCQlkZXNjcmlwdG9yID0gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyLmdldE5hbWUoKSk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJCQkJCW5hbWVzLmFkZChhdHRyLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlkZXNjcmlwdG9yTGlzdC5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIGRlc2NyaXB0b3JzIGZyb20gdGhlIG1ldGFpbmZvIHRoYXQgYXJlIG5vdCB5ZXQgbGlzdGVkCi0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck1hcC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ck1hcC5pdGVtKGkpOwotCQkJCVN0cmluZyBhdHRyTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQkJCWlmICghbmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgaG9sZERlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJCQlpZiAoaG9sZERlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJbmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJCWRlc2NyaXB0b3JMaXN0LmFkZChob2xkRGVzY3JpcHRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgTVFFLWJhc2VkIGRlc2NyaXB0b3JzCi0JCWlmIChlZCAhPSBudWxsICYmIGZOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgZk5vZGUsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQkJCVN0cmluZyBhdHRyTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQkJCQlpZiAoIW5hbWVzLmNvbnRhaW5zKGF0dHJOYW1lKSkgewotCQkJCQkJSVByb3BlcnR5RGVzY3JpcHRvciBob2xkRGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCQkJCQlpZiAoaG9sZERlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCW5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCQkJZGVzY3JpcHRvckxpc3QuYWRkKGhvbGREZXNjcmlwdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJSVByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbZGVzY3JpcHRvckxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJZGVzY3JpcHRvcnNbaV0gPSAoSVByb3BlcnR5RGVzY3JpcHRvcikgZGVzY3JpcHRvckxpc3QuZ2V0KGkpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsKSB7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQlUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihhdHRyTmFtZSwgYXR0ck5hbWUpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KGF0dHJEZWNsKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRpb24oYXR0ck5hbWUpOwotCQlpZiAoKGF0dHJEZWNsLmdldFVzYWdlKCkgIT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgJiYgZlNldEV4cGVydEZpbHRlcikgewotCQkJZGVzY3JpcHRvci5zZXRGaWx0ZXJGbGFncyhuZXcgU3RyaW5nW117SVByb3BlcnR5U2hlZXRFbnRyeS5GSUxURVJfSURfRVhQRVJUfSk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2F0ZWdvcnkoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgewotCQlpZiAoYXR0ckRlY2wgIT0gbnVsbCkgewotCQkJaWYgKGF0dHJEZWNsLnN1cHBvcnRzKCJjYXRlZ29yeSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gKFN0cmluZykgYXR0ckRlY2wuZ2V0UHJvcGVydHkoImNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmU2hvdWxkRGVyaXZlQ2F0ZWdvcmllcyAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXROb2RlTmFtZSgpICE9IG51bGwpICYmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldE5vZGVOYW1lKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCXJldHVybiBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBDQVRFR09SWV9BVFRSSUJVVEVTOwotCX0KLQotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCWlmICgoZk5vZGUgPT0gbnVsbCkgfHwgKGZOb2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCXJldHVybiBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBmTm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWx1ZSBmb3IgdGhpcyBOb2RlIHRoYXQgY2FuIGJlIGVkaXR0ZWQgaW4gYSBwcm9wZXJ0eSBzaGVldC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmFsdWUgdGhhdCBjYW4gYmUgZWRpdHRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gYWxsIHZhbGlkIGRlc2NyaXB0b3JzLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJaWYgKChmRGVzY3JpcHRvcnMgPT0gbnVsbCkgfHwgKGZEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkpIHsKLQkJCWZEZXNjcmlwdG9ycyA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQlyZXR1cm4gZkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBuYW1lZCBwcm9wZXJ0eS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWVPYmplY3QpIHsKLQkJU3RyaW5nIG5hbWUgPSBuYW1lT2JqZWN0LnRvU3RyaW5nKCk7Ci0JCVN0cmluZyByZXR1cm5lZFZhbHVlID0gbnVsbDsKLQkJTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCU5vZGUgYXR0cmlidXRlID0gYXR0ck1hcC5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0cmlidXRlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJcmV0dXJuZWRWYWx1ZSA9ICgoSURPTU5vZGUpIGF0dHJpYnV0ZSkuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybmVkVmFsdWUgPSBhdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXR1cm5lZFZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybmVkVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXR1cm5lZFZhbHVlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VmFsaWRWYWx1ZXMoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgewotCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQotCQlTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IG51bGw7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQlpZiAoYXR0clR5cGUgIT0gbnVsbCkgewotCQkJdmFsaWRWYWx1ZXMgPSBfZ2V0VmFsaWRTdHJpbmdzKGF0dHJEZWNsLCBhdHRyVHlwZSk7Ci0JCQlpZiAoZlNvcnRFbnVtZXJhdGVkVmFsdWVzKSB7Ci0JCQkJQXJyYXlzLnNvcnQodmFsaWRWYWx1ZXMpOwotCQkJfQotCQl9Ci0JCWlmICh2YWxpZFZhbHVlcyA9PSBudWxsKSB7Ci0JCQl2YWxpZFZhbHVlcyA9IG5ldyBTdHJpbmdbMF07Ci0JCX0KLQkJcmV0dXJuIHZhbGlkVmFsdWVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlSZW1vdmFibGUoT2JqZWN0IGlkKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlSZXNldHRhYmxlKE9iamVjdCBpZCkgewotCQlib29sZWFuIHJlc2V0dGFibGUgPSBmYWxzZTsKLQkJU3RyaW5nIHByb3BlcnR5ID0gaWQudG9TdHJpbmcoKTsKLQkJQ01OYW1lZE5vZGVNYXAgYXR0ckRlY2xzID0gbnVsbDsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlhdHRyRGVjbHMgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoYXR0ckRlY2xzKTsKLQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgZk5vZGUsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJEZWNscyA9IGFsbEF0dHJpYnV0ZXM7Ci0JCX0KLQotCQlpZiAoYXR0ckRlY2xzICE9IG51bGwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ckRlY2xzLmdldE5hbWVkSXRlbShwcm9wZXJ0eSk7Ci0JCQlpZiAoYXR0ckRlY2wgIT0gbnVsbCkgewotCQkJCWlmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpIHsKLQkJCQkJQ01EYXRhVHlwZSBoZWxwZXIgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQkJCQlpZiAoKGhlbHBlci5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX05PTkUpICYmIChoZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkpIHsKLQkJCQkJCXJlc2V0dGFibGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNldHRhYmxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvcGVydHkgdmFsdWUgaGFzIGNoYW5nZWQgZnJvbSB0aGUgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcwotCSAqICAgICAgICAgY2hhbmdlZCBmcm9tIGl0cyBvcmlnaW5hbCBkZWZhdWx0IHZhbHVlOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBwcm9wZXJ0eU9iamVjdCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpOwotCi0JCU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYXR0ck1hcC5nZXROYW1lZEl0ZW0ocHJvcGVydHkpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZ2l2ZW4gYXR0cmlidXRlIGZyb20gdGhlIE5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShPYmplY3QgcHJvcGVydHlPYmplY3QpIHsKLQkJTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCU5vZGUgYXR0cmlidXRlID0gYXR0ck1hcC5nZXROYW1lZEl0ZW0ocHJvcGVydHlPYmplY3QudG9TdHJpbmcoKSk7Ci0JCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlhdHRyTWFwLnJlbW92ZU5hbWVkSXRlbShwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChlLmNvZGUgIT0gRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUikgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5J3MgdmFsdWUgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wZXJ0eU9iamVjdCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpOwotCQlDTU5hbWVkTm9kZU1hcCBhdHRyRGVjbHMgPSBudWxsOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0RGVjbGFyYXRpb24oKTsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCWF0dHJEZWNscyA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyRGVjbHMpOwotCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZk5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KChFbGVtZW50KSBmTm9kZSwgZWQsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJYXR0ckRlY2xzID0gYWxsQXR0cmlidXRlczsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0ckRlY2xzICE9IG51bGwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ckRlY2xzLmdldE5hbWVkSXRlbShwcm9wZXJ0eSk7Ci0JCQlTdHJpbmcgZGVmVmFsdWUgPSBudWxsOwotCQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJCUNNRGF0YVR5cGUgaGVscGVyID0gYXR0ckRlY2wuZ2V0QXR0clR5cGUoKTsKLQkJCQkJaWYgKChoZWxwZXIuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FKSAmJiAoaGVscGVyLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpKSB7Ci0JCQkJCQlkZWZWYWx1ZSA9IGhlbHBlci5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgoZGVmVmFsdWUgIT0gbnVsbCkgJiYgKGRlZlZhbHVlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkoKEF0dHIpIGF0dHJNYXAuZ2V0TmFtZWRJdGVtKHByb3BlcnR5KSkuc2V0VmFsdWUoZGVmVmFsdWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYXR0ck1hcC5yZW1vdmVOYW1lZEl0ZW0ocHJvcGVydHkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJYXR0ck1hcC5yZW1vdmVOYW1lZEl0ZW0ocHJvcGVydHkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZWQgcHJvcGVydHkgdG8gdGhlIGdpdmVuIHZhbHVlLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWVPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQkvLyBBdm9pZCBjeWNsaW5nIC0gY2FuIGhhcHBlbiBpZiBhIGNsb3NpbmcgY2VsbCBlZGl0b3IgY2F1c2VzIGEKLQkJLy8gcmVmcmVzaAotCQkvLyBvbiB0aGUgUHJvcGVydHlTaGVldCBwYWdlIGFuZCB0aGUgc2V0SW5wdXQgYWdhaW4gYXNrcyB0aGUgZWRpdG9yIHRvCi0JCS8vIGNsb3NlOyBiZXNpZGVzLCB3aHkgYXBwbHkgdGhlIHNhbWUgdmFsdWUgdHdpY2U/Ci0JCWlmICghZlZhbHVlc0JlaW5nU2V0LmlzRW1wdHkoKSAmJiAoZlZhbHVlc0JlaW5nU2V0LnBlZWsoKSA9PSBuYW1lT2JqZWN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZWYWx1ZXNCZWluZ1NldC5wdXNoKG5hbWVPYmplY3QpOwotCQlTdHJpbmcgbmFtZSA9IG5hbWVPYmplY3QudG9TdHJpbmcoKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gbnVsbDsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJfQotCQlOYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJdHJ5IHsKLQkJCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0ck1hcC5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQkvLyBFWElTVElORyBWQUxVRQotCQkJCQkvLyBwb3RlbnRpYWwgb3V0IG9mIGNvbnRyb2wgbG9vcCBpZiB1cGRhdGluZyB0aGUgdmFsdWUKLQkJCQkJLy8gdHJpZ2dlcnMgYSB2aWV3ZXIgdXBkYXRlLCBmb3JjaW5nIHRoZQotCQkJCQkvLyBhY3RpdmUgY2VsbCBlZGl0b3IgdG8gc2F2ZSBpdHMgdmFsdWUgYW5kIGNhdXNpbmcgdGhlCi0JCQkJCS8vIGxvb3AgdG8gY29udGludWUKLQkJCQkJaWYgKChhdHRyLmdldFZhbHVlKCkgPT0gbnVsbCkgfHwgIWF0dHIuZ2V0VmFsdWUoKS5lcXVhbHModmFsdWVTdHJpbmcpKSB7Ci0JCQkJCQlpZiAoYXR0ciBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCQkJKChJRE9NTm9kZSkgYXR0cikuc2V0VmFsdWVTb3VyY2UodmFsdWVTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZVN0cmluZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIE5FVyg/KSB2YWx1ZQotCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeyAvLyBuZXZlciBjcmVhdGUgYW4gZW1wdHkgYXR0cmlidXRlCi0JCQkJCQlBdHRyIG5ld0F0dHIgPSBmTm9kZS5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCQkJaWYgKG5ld0F0dHIgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkJCSgoSURPTU5vZGUpIG5ld0F0dHIpLnNldFZhbHVlU291cmNlKHZhbHVlU3RyaW5nKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW5ld0F0dHIuc2V0VmFsdWUodmFsdWVTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJYXR0ck1hcC5zZXROYW1lZEl0ZW0obmV3QXR0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZk5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCSgoRWxlbWVudCkgZk5vZGUpLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZVN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZSkgewotCQkJRGlzcGxheSBkID0gZ2V0RGlzcGxheSgpOwotCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCWQuYmVlcCgpOwotCQkJfQotCQl9Ci0JCWZWYWx1ZXNCZWluZ1NldC5wb3AoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlpZiAoKGZEZXNjcmlwdG9ycyA9PSBudWxsKSB8fCAoZkRlc2NyaXB0b3JzLmxlbmd0aCA9PSAwKSkgewotCQkJLy8gTm90aGluZyB0byB1cGRhdGUKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIExpc3Qgb2YgYWxsIG5hbWVzIGVuY291bnRlcmVkIGluIHRoZSB0YWcgYW5kIGRlZmluZWQgYnkgdGhlIGVsZW1lbnQKLQkJTGlzdCBkZWNsYXJlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBOZXcgZGVzY3JpcHRvciBsaXN0IHRoYXQgd2lsbCBiZWNvbWUgZkRlc2NyaXB0b3JzIGFmdGVyIGFsbAotCQkvLyBwcm9jZXNzaW5nIGlzIGRvbmUKLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gTmFtZXMgb2YgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSBhYm92ZSBMaXN0Ci0JCUxpc3QgZGVzY3JpcHRvck5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIFVwZGF0ZSBhbnkgZGVzY3JpcHRvcnMgZGVyaXZlZCBmcm9tIHRoZSBtZXRhaW5mbwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCUNNTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBudWxsOwotCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJYXR0ck1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyTWFwKTsKLQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgZk5vZGUsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJNYXAgPSBhbGxBdHRyaWJ1dGVzOwotCQl9Ci0JCS8vIFVwZGF0ZSBleGl0aW5nIGRlc2NyaXB0b3JzOyBub3QgYWRkZWQgdG8gdGhlIGZpbmFsIGxpc3QgaGVyZQotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQkvLyBVcGRhdGUgZXhpc3RpbmcgZGVzY3JpcHRvciB0eXBlcyBiYXNlZCBvbiBtZXRhaW5mbwotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJNYXAuaXRlbShpKTsKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoYXR0ckRlY2wsIGZOb2RlLCBudWxsKTsKLQkJCQlpZiAoIWRlY2xhcmVkTmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCWRlY2xhcmVkTmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmRGVzY3JpcHRvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJYm9vbGVhbiBzYW1lTmFtZSA9IChmQ2FzZVNlbnNpdGl2ZSAmJiBmRGVzY3JpcHRvcnNbal0uZ2V0SWQoKS5lcXVhbHMoYXR0ckRlY2wuZ2V0Tm9kZU5hbWUoKSkpIHx8ICghZkNhc2VTZW5zaXRpdmUgJiYgYXR0ckRlY2wuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZkRlc2NyaXB0b3JzW2pdLmdldElkKCkudG9TdHJpbmcoKSkpOwotCQkJCQlpZiAoc2FtZU5hbWUpIHsKLQkJCQkJCVN0cmluZ1tdIHZhbGlkVmFsdWVzID0gZ2V0VmFsaWRWYWx1ZXMoYXR0ckRlY2wpOwotCQkJCQkJLy8gVXBkYXRlIHRoZSBkZXNjcmlwdG9yIGZvciB0aGlzCi0JCQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIChvbmx5IGVudW1lcmF0ZWQgdmFsdWVzIGdldAotCQkJCQkJLy8gdXBkYXRlZCBmb3Igbm93KQotCQkJCQkJaWYgKGZEZXNjcmlwdG9yc1tqXSBpbnN0YW5jZW9mIEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IpIHsKLQkJCQkJCQkoKEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IpIGZEZXNjcmlwdG9yc1tqXSkudXBkYXRlVmFsdWVzKHZhbGlkVmFsdWVzKTsKLQkJCQkJCX0KLQkJCQkJCS8vIFJlcGxhY2Ugd2l0aCBiZXR0ZXIgZGVzY3JpcHRvcgotCQkJCQkJZWxzZSBpZiAoKHZhbGlkVmFsdWVzICE9IG51bGwpICYmICh2YWxpZFZhbHVlcy5sZW5ndGggPiAwKSkgewotCQkJCQkJCWZEZXNjcmlwdG9yc1tqXSA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBVcGRhdGUgZXhpc3RpbmcgZGVzY3JpcHRvcnMgYmFzZWQgb24gbm90IGhhdmluZyBhbnkgbWV0YWluZm8KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZkRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJLy8gUmVwbGFjZSB3aXRoIGJhc2ljIGRlc2NyaXB0b3IKLQkJCQlpZiAoIShmRGVzY3JpcHRvcnNbal0gaW5zdGFuY2VvZiBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKSkgewotCQkJCQlmRGVzY3JpcHRvcnNbal0gPSBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKChTdHJpbmcpIGZEZXNjcmlwdG9yc1tqXS5nZXRJZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkvLyBSZW1vdmUgZGVzY3JpcHRvcnMgZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgcHJlc2VudCBBTkQgYXJlbid0Ci0JCS8vIGtub3duIHRocm91Z2ggbWV0YWluZm8sCi0JCS8vIGRvIHRoaXMgYnkgb25seSByZXVzaW5nIGV4aXN0aW5nIGRlc2NyaXB0b3JzIGZvciBhdHRyaWJ1dGVzIHRoYXQKLQkJLy8gYXJlIHByZXNlbnQgb3IgZGVjbGFyZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmRGVzY3JpcHRvcnNbaV0gIT0gbnVsbCkgewotCQkJCVN0cmluZyBkZXNjcmlwdG9yTmFtZSA9IGZEZXNjcmlwdG9yc1tpXS5nZXRJZCgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKChkZWNsYXJlZE5hbWVzLmNvbnRhaW5zKGRlc2NyaXB0b3JOYW1lKSB8fCAoYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oZGVzY3JpcHRvck5hbWUpICE9IG51bGwpKSAmJiAhZGVzY3JpcHRvck5hbWVzLmNvbnRhaW5zKGRlc2NyaXB0b3JOYW1lKSkgewotCQkJCQlkZXNjcmlwdG9yTmFtZXMuYWRkKGRlc2NyaXB0b3JOYW1lKTsKLQkJCQkJZGVzY3JpcHRvcnMuYWRkKGZEZXNjcmlwdG9yc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIGRlc2NyaXB0b3JzIGZvciBkZWNsYXJlZCBhdHRyaWJ1dGVzIHRoYXQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZQotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQkvLyBVcGRhdGUgZXhpc3RpbmcgZGVzY3JpcHRvciB0eXBlcyBiYXNlZCBvbiBtZXRhaW5mbwotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJNYXAuaXRlbShpKTsKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoYXR0ckRlY2wsIGZOb2RlLCBudWxsKTsKLQkJCQlpZiAoZkNhc2VTZW5zaXRpdmUpIHsKLQkJCQkJaWYgKCFkZXNjcmlwdG9yTmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yTmFtZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCWV4aXN0cyA9IChkZXNjcmlwdG9yTmFtZXMuZ2V0KGopLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHx8IGV4aXN0czsKLQkJCQkJfQotCQkJCQlpZiAoIWV4aXN0cykgewotCQkJCQkJZGVzY3JpcHRvck5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIEFkZCBkZXNjcmlwdG9ycyBmb3IgZXhpc3RpbmcgYXR0cmlidXRlcyB0aGF0IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQkJCWlmIChmQ2FzZVNlbnNpdGl2ZSkgewotCQkJCQlpZiAoIWRlc2NyaXB0b3JOYW1lcy5jb250YWlucyhhdHRyTmFtZSkpIHsKLQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJZGVzY3JpcHRvcnMuYWRkKGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ck5hbWUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yTmFtZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCWV4aXN0cyA9IChkZXNjcmlwdG9yTmFtZXMuZ2V0KGopLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHx8IGV4aXN0czsKLQkJCQkJfQotCQkJCQlpZiAoIWV4aXN0cykgewotCQkJCQkJZGVzY3JpcHRvck5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCQlkZXNjcmlwdG9ycy5hZGQoY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyTmFtZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gVXBkYXRlIGZEZXNjcmlwdG9ycwotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gbmV3RGVzY3JpcHRvcnMgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltkZXNjcmlwdG9ycy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0Rlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQluZXdEZXNjcmlwdG9yc1tpXSA9IChJUHJvcGVydHlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoaSk7Ci0JCX0KLQkJZkRlc2NyaXB0b3JzID0gbmV3RGVzY3JpcHRvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxOGIwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50Lk5vZGVMb2NhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGV4dGVuZHMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgewotCS8qKgotCSAqIFJldHVybnMgYSBXM0MgRE9NIGRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiBEb2N1bWVudCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgY29ycmVzcG9uZGluZwotCSAqICAgICAgICAgZG9jdW1lbnQgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlEb2N1bWVudCBnZXRET01Eb2N1bWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVzNDIERPTSBOb2RlIGF0IHRoZSBnaXZlbiBvZmZzZXQKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgSURvY3VtZW50Ci0JICogQHJldHVybiBhIE5vZGUgYXQgdGhhdCBsb2NhdGlvbiwgaWYgb25lIGlzIHByZXNlbnQKLQkgKiAKLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgZm9yIGludmFsaWQgb2Zmc2V0cwotCSAqLwotCU5vZGUgZ2V0Tm9kZShpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTm9kZUxvY2F0aW9uIG9iamVjdCBkZXNjcmliaW5nIHRoZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBvZgotCSAqIHRoZSBOb2RlJ3Mgc3RhcnQgYW5kIGVuZCB0YWdzLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBUaGUgTm9kZUxvY2F0aW9uIGZvciB0aGlzIE5vZGUsIG51bGwgZm9yIHVuc3VwcG9ydGVkIE5vZGUKLQkgKiAgICAgICAgIGluc3RhbmNlcy4KLQkgKi8KLQlOb2RlTG9jYXRpb24gZ2V0Tm9kZUxvY2F0aW9uKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlcnZlci1zaWRlIHBhZ2UgbGFuZ3VhZ2UgZm9yIHRoZSBEb2N1bWVudCBvZiB0aGUKLQkgKiBnaXZlbiBOb2RlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNlcnZlci1zaWRlIHBhZ2UgbGFuZ3VhZ2UgZm9yIHRoaXMgbm9kZW0gbnVsbCBmb3IgTm9kZXMKLQkgKiAgICAgICAgIHdpdGhpbiB1bnN1cHBvcnRlZCBEb2N1bWVudHMuCi0JICovCi0JU3RyaW5nIGdldFBhZ2VMYW5ndWFnZShOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogUmV0dXJucyBzdGFydCBvZmZzZXQgb2YgZ2l2ZW4gTm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdzNjIDxjb2RlPk5vZGU8L2NvZGU+IG9iamVjdCB0byBjaGVjawotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mZnNldCBvciAtMSBmb3IgdW5zdXBwb3J0ZWQgTm9kZXMKLQkgKi8KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvWE1MU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2EzMzdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuTm9kZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGludGVyZmFjZQotICovCi1wdWJsaWMgY2xhc3MgWE1MU291cmNlRWRpdGluZ1RleHRUb29scyBpbXBsZW1lbnRzIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLCBJTm9kZUFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIGNsYXNzIE5vZGVMb2NhdGlvbkltcGwgaW1wbGVtZW50cyBOb2RlTG9jYXRpb24gewotCQlwcml2YXRlIElET01Ob2RlIG5vZGU7Ci0KLQkJcHVibGljIE5vZGVMb2NhdGlvbkltcGwoSURPTU5vZGUgeG1sbm9kZSkgewotCQkJc3VwZXIoKTsKLQkJCW5vZGUgPSB4bWxub2RlOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRFbmRUYWdFbmRPZmZzZXQoKSB7Ci0JCQlpZiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEVuZFRhZ1N0YXJ0T2Zmc2V0KCkgewotCQkJaWYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFN0YXJ0VGFnRW5kT2Zmc2V0KCkgewotCQkJaWYgKG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U3RhcnRUYWdTdGFydE9mZnNldCgpIHsKLQkJCWlmIChub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGZUZXh0RWRpdG9yID0gbnVsbDsKLQotCXB1YmxpYyBpbnQgZ2V0Q2FyZXRPZmZzZXQoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0Vmlld2VyIHN0diA9IGZUZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKChzdHYgIT0gbnVsbCkgJiYgKHN0di5nZXRUZXh0V2lkZ2V0KCkgIT0gbnVsbCkgJiYgIXN0di5nZXRUZXh0V2lkZ2V0KCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gc3R2LndpZGdldE9mZnNldDJNb2RlbE9mZnNldChzdHYuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldERPTURvY3VtZW50KCkgewotCQlyZXR1cm4gKERvY3VtZW50KSBmVGV4dEVkaXRvci5nZXRNb2RlbCgpLmdldEFkYXB0ZXIoRG9jdW1lbnQuY2xhc3MpOwotCX0KLQotCS8qCi0JICogSWYgc2ltaWxhciBmdW5jdGlvbiBpcyBuZWVkZWQsIGNvbXBvc2l0ZSBpdCBhcm91bmQgdGhlIHRleHQgZWRpdG9yJ3MKLQkgKiBpbnN0YW5jZS4gUmVtb3ZlZCBhbHNvIGJlY2F1c2UgaXQgcmV0dXJucyBhbiBhbHJlYWQtcmVsZWFzZWQgbW9kZWwKLQkgKiAKLQkgKiBwdWJsaWMgRG9jdW1lbnQgZ2V0RE9NRG9jdW1lbnQoSU1hcmtlciBtYXJrZXIpIHsgaWYgKG1hcmtlciA9PSBudWxsKQotCSAqIHJldHVybiBudWxsOwotCSAqIAotCSAqIElSZXNvdXJjZSByZXMgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsgaWYgKHJlcyA9PSBudWxsIHx8ICEocmVzCi0JICogaW5zdGFuY2VvZiBJRmlsZSkpIHJldHVybiBudWxsOwotCSAqIAotCSAqIElNb2RlbE1hbmFnZXIgbW0gPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCSAqIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOyB0cnkgeyBtb2RlbCA9Ci0JICogbW0uZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoKElGaWxlKSByZXMpOyBpZiAobW9kZWwgPT0gbnVsbCB8fCAhKG1vZGVsCi0JICogaW5zdGFuY2VvZiBJRE9NTW9kZWwpKSByZXR1cm4gbnVsbDsKLQkgKiAKLQkgKiByZXR1cm4gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOyB9IGZpbmFsbHkgeyBpZiAobW9kZWwgIT0KLQkgKiBudWxsKSBtb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsgfSB9Ci0JICovCi0KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpIHsKLQkJcmV0dXJuIGZUZXh0RWRpdG9yLmdldEVkaXRvclBhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXROb2RlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmICgoMCA8PSBvZmZzZXQpICYmIChvZmZzZXQgPD0gZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSkpIHsKLQkJCW5vZGUgPSAoTm9kZSkgZlRleHRFZGl0b3IuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzI2dldE5vZGVMb2NhdGlvbihvcmcudzNjLmRvbS5Ob2RlKQotCSAqLwotCXB1YmxpYyBOb2RlTG9jYXRpb24gZ2V0Tm9kZUxvY2F0aW9uKE5vZGUgbm9kZSkgewotCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkpIHsKLQkJCXJldHVybiBuZXcgTm9kZUxvY2F0aW9uSW1wbCgoSURPTU5vZGUpIG5vZGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUxhbmd1YWdlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIElFeHRlbmRlZE1hcmt1cEVkaXRvciBtZXRob2QKLQkgKi8KLQkvLyBwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKCkgewotCS8vIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgdnNtID0gZ2V0Vmlld2VyU2VsZWN0aW9uTWFuYWdlcigpOwotCS8vIHJldHVybiAodnNtICE9IG51bGwpID8gdnNtLmdldFNlbGVjdGVkTm9kZXMoKSA6IG51bGw7Ci0JLy8gfQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoTm9kZSBub2RlKSB7Ci0JCWlmICgobm9kZSA9PSBudWxsKSB8fCAhKG5vZGUgaW5zdGFuY2VvZiBJRE9NVGV4dCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm5vZGUgPSAoKElET01UZXh0KSBub2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlyZXR1cm4gZm5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jb3JlLklOb2RlQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuY2xhc3MuZXF1YWxzKHR5cGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvcmUuSU5vZGVBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvcmUuSU5vZGVOb3RpZmllciwKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRFZGl0b3IoU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCWZUZXh0RWRpdG9yID0gZWRpdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzk0YTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5ET01PYnNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxVSVByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JYTUwgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJLy8gYWRkIHRoZSBub3JtYWwgY29udGVudCBiYXNlZCBmYWN0b3JpZXMgdG8gbW9kZWwncyByZWdpc3RyeQotCQlhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHN0cnVjdHVyZWRNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5UmVnaXN0cnksICJQcm9ncmFtIEVycm9yOiBjbGllbnQgY2FsbGVyIG11c3QgZW5zdXJlIG1vZGVsIGhhcyBmYWN0b3J5IHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotCQlmYWN0b3J5ID0gZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCi0JCS8vIGNzLi4uIGFkZGVkIGZvciBpbmZlcnJlZCBncmFtbWFyIHN1cHBvcnQKLQkJLy8KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gbW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCQlib29sZWFuIHVzZUluZmVycmVkR3JhbW1hciA9IChzdG9yZSAhPSBudWxsKSA/IHN0b3JlLmdldEJvb2xlYW4oWE1MVUlQcmVmZXJlbmNlTmFtZXMuVVNFX0lORkVSUkVEX0dSQU1NQVIpIDogdHJ1ZTsKLQotCQkJCQlkb2N1bWVudE1hbmFnZXIuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FTWU5DX0xPQUQsIHRydWUpOwotCQkJCQlkb2N1bWVudE1hbmFnZXIuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FVVE9fTE9BRCwgZmFsc2UpOwotCQkJCQlkb2N1bWVudE1hbmFnZXIuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX1VTRV9DQUNIRURfUkVTT0xWRURfVVJJLCB0cnVlKTsKLQkJCQkJRE9NT2JzZXJ2ZXIgZG9tT2JzZXJ2ZXIgPSBuZXcgRE9NT2JzZXJ2ZXIoc3RydWN0dXJlZE1vZGVsKTsKLQkJCQkJZG9tT2JzZXJ2ZXIuc2V0R3JhbW1hckluZmVyZW5jZUVuYWJsZWQodXNlSW5mZXJyZWRHcmFtbWFyKTsKLQkJCQkJZG9tT2JzZXJ2ZXIuaW5pdCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2lzRm9yKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIChjb250ZW50VHlwZURlc2NyaXB0aW9uIGluc3RhbmNlb2YgTW9kZWxIYW5kbGVyRm9yWE1MKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gbm90aGluZyB0byBkbywgc2luY2Ugbm8gZW1iZWRkZWQgdHlwZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmMmVjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VhcmNoL1hNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2V0cyB1cCBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBmb3IgeG1sIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29ycwotICovCi1wdWJsaWMgY2xhc3MgWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvY2Vzc29ycygpIHsKLQkJaWYgKGZQcm9jZXNzb3JzID09IG51bGwpIHsKLQkJCWZQcm9jZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VhcmNoL1hNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjEyZmVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi0vKioKLSAqIENvbmZpZ3VyZXMgYSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3Igd2l0aCBYTUwgcGFydGl0aW9ucyBhbmQgcmVnaW9ucwotICovCi1wdWJsaWMgY2xhc3MgWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVH07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJlZ2lvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUV9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNThiZTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmICgoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAoY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJCX0KLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCWlmICgoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpIHsKLQkJCQlOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDg4YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCWludCBvZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSAtIDE7Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQlvZmZzZXQgPSAwOwotCQl9Ci0KLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgb2Zmc2V0KTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBjdXJzb3JOb2RlID0gKE5vZGUpIGluZGV4ZWRSZWdpb247Ci0KLQkJCS8vIHVzZSBwYXJlbnQgbm9kZSBmb3IgZW1wdHkgdGV4dCBub2RlCi0JCQlpZiAoKGN1cnNvck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKGN1cnNvck5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJY3Vyc29yTm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKGN1cnNvck5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCWluZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgY3Vyc29yTm9kZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmICgoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0KSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0KSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY3VycmVudE9mZnNldCkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpKSB7Ci0JCQkJbmV3UmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uMihpbmRleGVkUmVnaW9uLCB0ZXh0U2VsZWN0aW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBzZXBhcmF0ZWQgb3V0IGZyb20gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uMiBiZWNhdXNlIHRoZQotCSAqIGNvZGUgaW4gaGVyZSBpcyBhbGxvd2VkIHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhlZFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0U2VsZWN0aW9uCi0JICogQHJldHVybiBuZXcgcmVnaW9uIHRvIHNlbGVjdCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24yKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQkJCU5vZGUgbmV3Tm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQluZXdOb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbjIobmV3SW5kZXhlZFJlZ2lvbiwgbmV3IFRleHRTZWxlY3Rpb24obmV3UmVnaW9uLmdldE9mZnNldCgpLCBuZXdSZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkzOWMzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmICgoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAoY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJCX0KLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCWlmICgoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpIHsKLQkJCQlOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQkJbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCi0JCQkJCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkJbmV3UmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24sIG5ldyBUZXh0U2VsZWN0aW9uKG5ld1JlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3UmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c1hNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTA1NWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlICAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZTsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgc3ltYm9saWMgbmFtZSBvZiBzdHlsZXMgdXNlZCBieSBMaW5lU3R5bGVQcm92aWRlciwKLSAqIENvbG9yTWFuYWdlciwgYW5kIGFueSBvdGhlcnMgd2hvIG1heSBiZSBpbnRlcmVzdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzWE1MIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLR1JPVU5EID0gImJhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfQk9SREVSID0gImNkYXRhQm9yZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfVEVYVCA9ICJjZGF0YVRleHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0JPUkRFUiA9ICJjb21tZW50Qm9yZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9URVhUID0gImNvbW1lbnRUZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTF9CT1JERVIgPSAiZGVjbEJvZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRCA9ICJkb2N0eXBlRXh0ZXJuYWxJZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGID0gImRvY3R5cGVFeHRlcm5hbFB1YnJlZiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGID0gImRvY3R5cGVFeHRyZW5hbFN5c3JlZiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfTkFNRSA9ICJkb2N0eXBlTmFtZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORCA9ICJmb3JlZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0JPUkRFUiA9ICJwaUJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0NPTlRFTlQgPSAicGlDb250ZW50IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUklCVVRFX0VRVUFMUyA9ICJ0YWdBdHRyaWJ1dGVFcXVhbHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJJQlVURV9OQU1FID0gInRhZ0F0dHJpYnV0ZU5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUklCVVRFX1ZBTFVFID0gInRhZ0F0dHJpYnV0ZVZhbHVlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0JPUkRFUiA9ICJ0YWdCb3JkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJ0YWdOYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTlRFTlQgPSAieG1sQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9SRUZFUkVOQ0UgPSAiZW50aXR5UmVmZXJlbmNlIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTg0NTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8qKgotCQkgKiBhIG1ldGhvZCB0byBjZW50cmFsaXplIGFsbCB0aGUgImZvcm1hdCBydWxlcyIgZm9yIHJlZ2lvbnMKLQkJICogc3BlY2lmaWNhbGx5IGFzc29jaWF0ZWQgZm9yIGhvdyB0byAib3BlbiIgdGhlIHJlZ2lvbi4KLQkJICovCi0JCS8vIG5vdCBzdXJlIHdoeSB0aGlzIGlzIGNvbWluZyB0aHJvdWdoIG51bGwsIGJ1dCBqdXN0IHRvIGNhdGNoIGl0Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJfQotCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJfQotCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX05BTUUpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BFX1JFRkVSRU5DRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQl9Ci0JCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUMpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSB7Ci0JCQkvLyB3aGl0ZSBzcGFjZSBpcyBub3JtYWxsIG5vdCBvbiBpdHMgb3duIC4uLiBidXQgd2hlbiBpdCBpcywgd2UnbGwKLQkJCS8vIHRyZWF0IGFzIGNvbnRlbnQKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGRlZmF1bHQsIHJldHVybiBudWxsIHRvIHNpZ25hbCAibm90IGhhbmRsZWQiCi0JCQkvLyBpbiB3aGljaCBjYXNlLCBvdGhlciBmYWN0b3JpZXMgc2hvdWxkIGJlIHRyaWVkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVDsKLQkJCX0KLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0ZXh0IGF0dHJpYnV0ZXMgaW50byBtYXAuIE1ha2Ugc3VyZSBtYXAgaXMgY2xlYXJlZCBiZWZvcmUgY2FsbGluZwotCSAqIHRoaXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL01hcmt1cFRhZ0luZm9Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vTWFya3VwVGFnSW5mb1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTEzZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vTWFya3VwVGFnSW5mb1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogUHJvdmlkZXMgYmFzaWMgdGFnIGluZm9ybWF0aW9uIHN1Y2ggYXMgZWxlbWVudC9hdHRyaWJ1dGUgbmFtZSwgZGF0YSB0eXBlLAotICogYW5kIHRhZyBpbmZvL2RvY3VtZW50YXRpb24gZm9yIENNTm9kZXMuIFVzZXMgSFRNTCB0byBlbmhhbmNlIHByZXNlbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE1hcmt1cFRhZ0luZm9Qcm92aWRlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQk9MRF9FTkQgPSAiPC9iPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBCT0xEX1NUQVJUID0gIjxiPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBIRUFESU5HX0VORCA9ICI8L2g1PiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBIRUFESU5HX1NUQVJUID0gIjxoNT4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9CRUdJTiA9ICI8dWw+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfRUxFTUVOVCA9ICI8bGk+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19MSU5FID0gIjxkbD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQUdSQVBIX0VORCA9ICI8L3A+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFHUkFQSF9TVEFSVCA9ICI8cD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1BBQ0UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgYmFzaWMgdGFnIGluZm9ybWF0aW9uIGZvciBkaXNwbGF5IGdpdmVuIGEgQ01Ob2RlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm8oQ01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyB3ZSBhc3N1bWUgdGhhdCBpZiB0aGVyZSBpcyB0YWdJbmZvIHByZXNlbnQsIG9ubHkgZGlzcGxheSB0YWdJbmZvCi0JCXByaW50VGFnSW5mbyhzYiwgbm9kZSk7Ci0KLQkJLy8gbm8gdGFnSW5mbyBwcmVzZW50LCBzbyB0cnkgdG8gZGlzcGxheSB0YWcgZGVzY3JpcHRpb24KLQkJaWYgKHNiLmxlbmd0aCgpID09IDApIHsKLQkJCXByaW50RGVzY3JpcHRpb24oc2IsIG5vZGUpOwotCQl9Ci0KLQkJLy8gbm8gdGFnIGRlc2NyaXB0aW9uIHByZXNlbnQgZWl0aGVyLCBzbyBkaXNwbGF5IGRlZmF1bHQgaW5mbwotCQlpZiAoc2IubGVuZ3RoKCkgPT0gMCkgewotCQkJcHJpbnREZWZhdWx0SW5mbyhub2RlLCBzYik7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGRhdGFUeXBlJ3MgZGF0YSB0eXBlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgZW51bWVyYXRlZCB0eXBlIHZhbHVlcwotCSAqIHRvIHN0cmluZyBidWZmZXIsIHNiCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnREYXRhVHlwZUluZm8oU3RyaW5nQnVmZmVyIHNiLCBDTURhdGFUeXBlIGRhdGFUeXBlKSB7Ci0JCVN0cmluZyBkYXRhVHlwZU5hbWUgPSBkYXRhVHlwZS5nZXROb2RlTmFtZSgpOwotCQlpZiAoKGRhdGFUeXBlTmFtZSAhPSBudWxsKSAmJiAoZGF0YVR5cGVOYW1lLmxlbmd0aCgpID4gMCkpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5EYXRhX1R5cGVfX19fNCArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJc2IuYXBwZW5kKGRhdGFUeXBlTmFtZSk7Ci0JCQlzYi5hcHBlbmQoUEFSQUdSQVBIX0VORCk7Ci0JCX0KLQkJU3RyaW5nW10gZW51bWVyYXRlZFZhbHVlID0gZGF0YVR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQlpZiAoKGVudW1lcmF0ZWRWYWx1ZSAhPSBudWxsKSAmJiAoZW51bWVyYXRlZFZhbHVlLmxlbmd0aCA+IDApKSB7Ci0JCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgQk9MRF9TVEFSVCArIFhNTFVJTWVzc2FnZXMuRW51bWVyYXRlZF9WYWx1ZXNfX19fNSArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJc2IuYXBwZW5kKExJU1RfQkVHSU4pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtZXJhdGVkVmFsdWUubGVuZ3RoOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQoTElTVF9FTEVNRU5UICsgZW51bWVyYXRlZFZhbHVlW2ldKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGRlZmF1bHQgaW5mbyAoZWxlbWVudCBuYW1lLCBjb250ZW50IG1vZGVsLCBkYXRhIHR5cGUpIG9mCi0JICogQ01Ob2RlIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVmYXVsdEluZm8oQ01Ob2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzYikgewotCQl7Ci0KLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbm9kZTsKLQkJCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgQk9MRF9TVEFSVCArIFhNTFVJTWVzc2FnZXMuRWxlbWVudF9fX18xICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQkJc2IuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9FTkQpOwotCQkJCXByaW50RG9jdW1lbnRhdGlvbihzYiwgbm9kZSk7Ci0JCQkJaWYgKGVkLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB7Ci0JCQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSBlZC5nZXREYXRhVHlwZSgpOwotCQkJCQlpZiAoZGF0YVR5cGUgIT0gbnVsbCkgewotCQkJCQkJcHJpbnREYXRhVHlwZUluZm8oc2IsIGRhdGFUeXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJQ01EZXNjcmlwdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBDTURlc2NyaXB0aW9uQnVpbGRlcigpOwotCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBidWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24obm9kZSk7Ci0JCQkJCWlmICgoZGVzY3JpcHRpb24gIT0gbnVsbCkgJiYgKGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5Db250ZW50X01vZGVsX19fXzIgKyBTUEFDRSArIEJPTERfRU5EKTsKLQkJCQkJCXNiLmFwcGVuZChkZXNjcmlwdGlvbiArIFBBUkFHUkFQSF9FTkQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIEJPTERfU1RBUlQgKyBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9fX18zICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQkJc2IuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9FTkQpOwotCQkJCXByaW50RG9jdW1lbnRhdGlvbihzYiwgbm9kZSk7Ci0JCQkJQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGFkLmdldEF0dHJUeXBlKCk7Ci0JCQkJaWYgKGRhdGFUeXBlICE9IG51bGwpIHsKLQkJCQkJcHJpbnREYXRhVHlwZUluZm8oc2IsIGRhdGFUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkRBVEFfVFlQRSkgewotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5EYXRhX1R5cGVfX19fNCArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJCXNiLmFwcGVuZChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJCQlwcmludERvY3VtZW50YXRpb24oc2IsIG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIENNTm9kZSB0byB0aGUgc3RyaW5nIGJ1ZmZlciwgc2IKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlc2NyaXB0aW9uKFN0cmluZ0J1ZmZlciBzYiwgQ01Ob2RlIG5vZGUpIHsKLQkJU3RyaW5nIHRhZ0luZm8gPSAoU3RyaW5nKSBub2RlLmdldFByb3BlcnR5KCJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YWdJbmZvICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyB0YWdJbmZvLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgdGFnIGRvY3VtZW50YXRpb24gcHJvcGVydHkgb2YgdGhlIENNTm9kZSB0byB0aGUgc3RyaW5nIGJ1ZmZlciwKLQkgKiBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RG9jdW1lbnRhdGlvbihTdHJpbmdCdWZmZXIgc2IsIENNTm9kZSBub2RlKSB7Ci0JCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSAoQ01Ob2RlTGlzdCkgbm9kZS5nZXRQcm9wZXJ0eSgiZG9jdW1lbnRhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgobm9kZUxpc3QgIT0gbnVsbCkgJiYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUNNRG9jdW1lbnRhdGlvbiBkb2N1bWVudGF0aW9uID0gKENNRG9jdW1lbnRhdGlvbikgbm9kZUxpc3QuaXRlbShpKTsKLQkJCQlTdHJpbmcgZG9jID0gZG9jdW1lbnRhdGlvbi5nZXRWYWx1ZSgpOwotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgZG9jLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZChORVdfTElORSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSB0YWcgaW5mbyBwcm9wZXJ0eSBvZiB0aGUgQ01Ob2RlIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50VGFnSW5mbyhTdHJpbmdCdWZmZXIgc2IsIENNTm9kZSBub2RlKSB7Ci0JCVN0cmluZyB0YWdJbmZvID0gKFN0cmluZykgbm9kZS5nZXRQcm9wZXJ0eSgidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YWdJbmZvICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyB0YWdJbmZvLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vWE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vWE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTc2YTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIFhNTCB0YWdzIChTaG93cyB0b29sdGlwIGRlc2NyaXB0aW9uKQotICogCi0gKiBAZGVwcmVjYXRlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgIGluZm9ybWF0aW9uIHByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxJbmZvcm1hdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSUluZm9ybWF0aW9uUHJvdmlkZXIsIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uIHsKLQotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQotCXB1YmxpYyBYTUxJbmZvcm1hdGlvblByb3ZpZGVyKCkgewotCQlmVGV4dEhvdmVyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uI2dldEluZm9ybWF0aW9uMihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyI2dldFN1YmplY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRTdWJqZWN0KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9YTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzI3NmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLkFic3RyYWN0SG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGhvdmVyIGhlbHAgZG9jdW1lbnRhdGlvbiBmb3IgeG1sIHRhZ3MKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIKLSAqLwotcHVibGljIGNsYXNzIFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0SG92ZXJQcm9jZXNzb3IgewotCXByb3RlY3RlZCBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZkluZm9Qcm92aWRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgWE1MVGV4dEhvdmVyUHJvY2Vzc29yLgotCSAqLwotCXB1YmxpYyBYTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKSB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgZG9jdW1lbnRhdGlvbiB0byBkaXNwbGF5IGluIHRoZSBob3ZlciBoZWxwIHBvcHVwLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGFueSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcGxheS4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVIb3ZlckhlbHAoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmICh0cmVlTm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgdHJlZU5vZGU7Ci0KLQkJd2hpbGUgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSkgewotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgdGV4dFZpZXdlci5nZXREb2N1bWVudCgpKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gY29tcHV0ZVJlZ2lvbkhlbHAodHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaG92ZXJoZWxwIGJhc2VkIG9uIHJlZ2lvbgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGhvdmVyaGVscAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVJlZ2lvbkhlbHAoSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVUYWdOYW1lSGVscCgoSURPTU5vZGUpIHRyZWVOb2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVRhZ0F0dE5hbWVIZWxwKChJRE9NTm9kZSkgdHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVRhZ0F0dFZhbHVlSGVscCgoSURPTU5vZGUpIHRyZWVOb2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVUYWdBdHROYW1lSGVscChJRE9NTm9kZSB4bWxub2RlLCBJRE9NTm9kZSBwYXJlbnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbih4bWxub2RlKTsKLQkJU3RyaW5nIGF0dE5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0RGVjbCA9IGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oeG1sbm9kZSwgZWxlbWVudERlY2wsIGF0dE5hbWUpOwotCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dERlY2wpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgYXR0cmlidXRlIHZhbHVlICh0aGlzIGlzIHRoZSBzYW1lIGFzCi0JICogdGhlIGF0dHJpYnV0ZSBuYW1lJ3MgaGVscCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVUYWdBdHRWYWx1ZUhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sbm9kZSk7Ci0JCUlUZXh0UmVnaW9uIGF0dHJOYW1lUmVnaW9uID0gZ2V0QXR0ck5hbWVSZWdpb24oeG1sbm9kZSwgcmVnaW9uKTsKLQotCQlTdHJpbmcgYXR0TmFtZSA9IGZsYXROb2RlLmdldFRleHQoYXR0ck5hbWVSZWdpb24pOwotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dERlY2wgPSBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKHhtbG5vZGUsIGVsZW1lbnREZWNsLCBhdHROYW1lKTsKLQkJcmV0dXJuIGdldEFkZGl0aW9uYWxJbmZvKGVsZW1lbnREZWNsLCBhdHREZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaG92ZXIgaGVscCBmb3IgdGhlIHRhZyBuYW1lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlVGFnTmFtZUhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sbm9kZSk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudE5vZGUpOwotCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8ocGVsZW1lbnREZWNsLCBlbGVtZW50RGVjbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmVzIGNtbm9kZSdzIGRvY3VtZW50YXRpb24gdG8gZGlzcGxheSBpbiB0aGUgaG92ZXIgaGVscCBwb3B1cC4gSWYKLQkgKiBubyBkb2N1bWVudGF0aW9uIGV4aXN0cyBmb3IgY21ub2RlLCB0cnkgZGlzcGxheWluZyBwYXJlbnRPck93bmVyJ3MKLQkgKiBkb2N1bWVudGF0aW9uCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgYW55IGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gdG8gZGlzcGxheSBmb3IgY21ub2RlLgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm90aGluZyB0byBkaXNwbGF5LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oQ01Ob2RlIHBhcmVudE9yT3duZXIsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIGFkZGxJbmZvID0gbnVsbDsKLQotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWFkZGxJbmZvID0gZ2V0SW5mb1Byb3ZpZGVyKCkuZ2V0SW5mbyhjbW5vZGUpOwotCQlpZiAoKGFkZGxJbmZvID09IG51bGwpICYmIChwYXJlbnRPck93bmVyICE9IG51bGwpKSB7Ci0JCQlhZGRsSW5mbyA9IGdldEluZm9Qcm92aWRlcigpLmdldEluZm8ocGFyZW50T3JPd25lcik7Ci0JCX0KLQkJcmV0dXJuIGFkZGxJbmZvOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIHJlZ2lvbiBvZiB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUKLQkgKiByZWdpb24KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0QXR0ck5hbWVSZWdpb24oSURPTU5vZGUgbm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZCBoYXZlIGEgdmFsdWUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKHJlZ2lvbik7Ci0JCWlmIChpIDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZVJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbmRpY2F0ZWQgYnkgYXR0cmlidXRlIG5hbWUgd2l0aGluCi0JICogZWxlbWVudERlY2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKElET01Ob2RlIG5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmcgYXR0TmFtZSkgewotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQotCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGF0dHJpYnV0ZXMpOwotCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJpYnV0ZXMgPSBhbGxBdHRyaWJ1dGVzOwotCi0JCQlTdHJpbmcgbm9wcmVmaXhOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dE5hbWUpOwotCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKG5vcHJlZml4TmFtZSk7Ci0JCQkJaWYgKGF0dHJEZWNsID09IG51bGwpIHsKLQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyRGVjbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgQ01FbGVtZW50RGVjbGFyYXRpb24gZm9yIGdpdmVuIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uIC0gQ01FbGVtZW50RGVjbGFyYXRpb24gb2Ygbm9kZSBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHBvc3NpYmxlCi0JICovCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQlpZiAoKGhvdmVyUmVnaW9uID09IG51bGwpIHx8ICh2aWV3ZXIgPT0gbnVsbCkgfHwgKHZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBkaXNwbGF5VGV4dCA9IG51bGw7Ci0JCWludCBkb2N1bWVudE9mZnNldCA9IGhvdmVyUmVnaW9uLmdldE9mZnNldCgpOwotCQlkaXNwbGF5VGV4dCA9IGNvbXB1dGVIb3ZlckhlbHAodmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0KLQkJcmV0dXJuIGRpc3BsYXlUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lvbiB0byBob3ZlciB0aGUgdGV4dCBvdmVyIGJhc2VkIG9uIHRoZSBvZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogCi0JICogQHJldHVybiBJUmVnaW9uIHJlZ2lvbiB0byBob3ZlciBvdmVyIGlmIG9mZnNldCBpcyB3aXRoaW4gdGFnIG5hbWUsCi0JICogICAgICAgICBhdHRyaWJ1dGUgbmFtZSwgb3IgYXR0cmlidXRlIHZhbHVlIGFuZCBpZiBvZmZzZXQgaXMgbm90IG92ZXIKLQkgKiAgICAgICAgIGludmFsaWQgd2hpdGVzcGFjZS4gb3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgodGV4dFZpZXdlciA9PSBudWxsKSB8fCAodGV4dFZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJfQotCi0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gb25seSBzdXBwbHkgaG92ZXJoZWxwIGZvciB0YWcgbmFtZSwgYXR0cmlidXRlIG5hbWUsIG9yCi0JCQkvLyBhdHRyaWJ1dGUgdmFsdWUKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGNoZWNrIGlmIHdlIGFyZSBhdCB3aGl0ZXNwYWNlIGJlZm9yZSBvciBhZnRlciBsaW5lCi0JCQkJCUlSZWdpb24gbGluZSA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCQkJCQlpZiAoKG9mZnNldCA+IChsaW5lLmdldE9mZnNldCgpKSkgJiYgKG9mZnNldCA8IChsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSkpKSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB3ZSBhcmUgaW4gcmVnaW9uJ3MgdHJhaWxpbmcgd2hpdGVzcGFjZQotCQkJCQkJLy8gKHdoaXRlc3BhY2UgYWZ0ZXIgcmVsZXZhbnQgaW5mbykKLQkJCQkJCWlmIChvZmZzZXQgPCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpZiBlbmFibGVkIGZsYWcgaXMgZmFsc2UsIGRvbnQgY2FsbCBnZXRIb3ZlclJlZ2lvbiBpbiB0aGUKLQkgKiAgICAgICAgICAgICBmaXJzdCBwbGFjZSBpZiB0cnVlLCB1c2UgZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0LCBib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKCghZW5hYmxlZCkgfHwgKHRleHRWaWV3ZXIgPT0gbnVsbCkgfHwgKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJU3RydWN0dXJlZERvY3VtZW50KSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCX0KLQotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIG9ubHkgc3VwcGx5IGhvdmVyaGVscCBmb3IgdGFnIG5hbWUsIGF0dHJpYnV0ZSBuYW1lLCBvcgotCQkJLy8gYXR0cmlidXRlIHZhbHVlCi0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBjaGVjayBpZiB3ZSBhcmUgYXQgd2hpdGVzcGFjZSBiZWZvcmUgb3IgYWZ0ZXIgbGluZQotCQkJCQlJUmVnaW9uIGxpbmUgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQob2Zmc2V0KTsKLQkJCQkJaWYgKChvZmZzZXQgPiAobGluZS5nZXRPZmZzZXQoKSkpICYmIChvZmZzZXQgPCAobGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkpKSkgewotCQkJCQkJLy8gY2hlY2sgaWYgd2UgYXJlIGluIHJlZ2lvbidzIHRyYWlsaW5nIHdoaXRlc3BhY2UKLQkJCQkJCS8vICh3aGl0ZXNwYWNlIGFmdGVyIHJlbGV2YW50IGluZm8pCi0JCQkJCQlpZiAob2Zmc2V0IDwgZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSB7Ci0JCQkJCQkJcmV0dXJuIG5ldyBSZWdpb24oZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5mb1Byb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBmSW5mb1Byb3ZpZGVyIGFuZCBpZiBmSW5mb1Byb3ZpZGVyIHdhcwotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gc2V0IGZJbmZvUHJvdmlkZXIgdG8gRGVmYXVsdEluZm9Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZ2V0SW5mb1Byb3ZpZGVyKCkgewotCQlpZiAoZkluZm9Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmSW5mb1Byb3ZpZGVyID0gbmV3IE1hcmt1cFRhZ0luZm9Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5mb1Byb3ZpZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5YjA0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCBleHRlbmRzIFNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RZUEUgPSBnZXRFbmNvZGluZ1R5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCgpIHsKLQkJc3VwZXIoRU5DT0RJTkdfVFlQRSwgWE1MVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlc19lbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5OTNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gZ2V0QWxsKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEUgPSBnZXRBdHRyaWJ1dGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRSA9IGdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSBnZXROZXcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IGdldFRhZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFsbCgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hbGwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZV92YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3KCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX25ldyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGFnKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX3RhZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2NjZjIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkdsb2JhbFRlbXBsYXRlVmFyaWFibGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgWE1MIHRlbXBsYXRlIGNvbnRleHQgdHlwZXMuIFRlbXBsYXRlcyBvZiB0aGlzIGNvbnRleHQgdHlwZQotICogYXBwbHkgdG8gYW55IHBsYWNlIHdpdGhpbiBYTUwgY29udGVudCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZVhNTCBleHRlbmRzIFRlbXBsYXRlQ29udGV4dFR5cGUgewotCi0JcHVibGljIFRlbXBsYXRlQ29udGV4dFR5cGVYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRG9sbGFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlllYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGV4dC9YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGV4dC9YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWZkOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RleHQvWE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkRlZmF1bHRDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGV4dGVuZHMgRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gUEFJUlMgPSB7J3snLCAnfScsICcoJywgJyknLCAnWycsICddJywnIicsJyInLCdcJycsJ1wnJ307Ci0KLQlwdWJsaWMgWE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4sIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlR9LCBuZXcgRGVmYXVsdENoYXJhY3RlclBhaXJNYXRjaGVyKFBBSVJTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1NoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODEyNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9DT05TVFJBSU5PRkYgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0NPTlNUUkFJTk9GRjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09OU1RSQUlOT04gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0NPTlNUUkFJTk9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9STERHUk1SID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9STERHUk1SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9WQUxJREFURSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfVkFMSURBVEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTlNUUkFJTk9GRiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQ09OU1RSQUlOT0ZGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT05TVFJBSU5PTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQ09OU1RSQUlOT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1JMREdSTVIgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX1JMREdSTVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1ZBTElEQVRFID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9WQUxJREFURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FUVFJJQlVURSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NEQVRBU0VDVElPTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NEQVRBU0VDVElPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NPTU1FTlQgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRE9DVFlQRSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0RPQ1RZUEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9FTEVNRU5UID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVElUWSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVElUWV9SRUZFUkVOQ0UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlRJVFlfUkVGRVJFTkNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfTk9UQVRJT04gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9OT1RBVElPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfTUFDUk8gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfTUFDUk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UWFRFWFQgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UWFRFWFQ7Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSB4bWwgc291cmNlIGVkaXRvciBwbHVnaW4ncyBpbWFnZQotCSAqIHJlZ2lzdHJ5LiBOb3RlOiBUaGUgcmV0dXJuZWQgPGNvZGU+SW1hZ2U8L2NvZGU+IGlzIG1hbmFnZWQgYnkgdGhlCi0JICogd29ya2JlbmNoOyBjbGllbnRzIG11c3QgPGI+bm90IDwvYj4gZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQgaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIHN5bWJvbGljTmFtZQotCSAqICAgICAgICAgICAgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhlIGltYWdlOyB0aGVyZSBhcmUgY29uc3RhbnRzIGRlY2xhcmVkCi0JICogICAgICAgICAgICBpbiB0aGlzIGNsYXNzIGZvciBidWlsZC1pbiBpbWFnZXMgdGhhdCBjb21lIHdpdGggdGhlIHhtbAotCSAqICAgICAgICAgICAgc291cmNlIGVkaXRvcgotCSAqIEByZXR1cm4gdGhlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2Uoc3ltYm9saWNOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSB4bWwgc291cmNlCi0JICogZWRpdG9yIHBsdWdpbidzIGltYWdlIHJlZ2lzdHJ5LiBVbmxpa2UgPGNvZGU+SW1hZ2U8L2NvZGU+cywgaW1hZ2UKLQkgKiBkZXNjcmlwdG9ycyB0aGVtc2VsdmVzIGRvIG5vdCBuZWVkIHRvIGJlIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzeW1ib2xpY05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBpbWFnZTsgdGhlcmUgYXJlIGNvbnN0YW50cyBkZWNsYXJlZAotCSAqICAgICAgICAgICAgaW4gdGhpcyBpbnRlcmZhY2UgZm9yIGJ1aWxkLWluIGltYWdlcyB0aGF0IGNvbWUgd2l0aCB0aGUgeG1sCi0JICogICAgICAgICAgICBzb3VyY2UgZWRpdG9yCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKHN5bWJvbGljTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uUmVzb3VyY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdXRpbC9YTUxDb21tb25SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiYTBiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdXRpbC9YTUxDb21tb25SZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIFhNTFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCkgaW5zdGVhZAotICovCi0vKioKLSAqIFRoaXMgY2xhc3MgZXhpc3RzIHRlbXBvcmFyaWx5IHVudGlsIHRoZSBwcm9wZXJ0aWVzIGZpbGVzIGNhbiBiZQotICogcmUtb3JnYW5pemVkIGFuZCB0aGUgdmFyaW91cyByZXNvdXJjZSByZWZlcmVuY2VzIGNhbiBiZSB1cGRhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb21tb25SZXNvdXJjZXMgewotCXByb3RlY3RlZCBzdGF0aWMgWE1MQ29tbW9uUmVzb3VyY2VzIGluc3RhbmNlOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MQ29tbW9uUmVzb3VyY2VzIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgWE1MQ29tbW9uUmVzb3VyY2VzKFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgWE1MVUlQbHVnaW4gZWRpdG9yUGx1Z2luOwotCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCXB1YmxpYyBYTUxDb21tb25SZXNvdXJjZXMoWE1MVUlQbHVnaW4gZWRpdG9yUGx1Z2luKSB7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJdGhpcy5lZGl0b3JQbHVnaW4gPSBlZGl0b3JQbHVnaW47Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFRPRE8uLi4gbG9nIGFuIGVycm9yIG1lc3NhZ2UKLQkJCS8vIEIyQlV0aWxQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoQjJCVXRpbFBsdWdpbi5nZXRHVUlTdHJpbmcoIl9XQVJOX1BMVUdJTl9QUk9QRVJUSUVTX01JU1NJTkciKQotCQkJLy8gKyBkZXNjcmlwdG9yLmdldExhYmVsKCkpOwotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JSW1hZ2VEZXNjcmlwdG9yIF9nZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGljb25OYW1lKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oWE1MVUlQbHVnaW4uSUQsIGljb25OYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czF9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBhbmQgZG9lcyB0d28gc3Vic3RpdHV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMSwgczJ9KTsKLQl9Ci0KLQlwdWJsaWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiBlZGl0b3JQbHVnaW4uZ2V0V29ya2JlbmNoKCk7Ci0JfQotCS8qCi0JICogcHVibGljIEltYWdlRmFjdG9yeSBnZXRJbWFnZUZhY3RvcnkoKSB7IHJldHVybiBpbWFnZUZhY3Rvcnk7IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1hNTENvbW1vblVJQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uVUlDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2M2Q1MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uVUlDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbDsKLQotLyoqCi0gKiBDb250ZXh0IGhlbHAgaWQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTENvbW1vblVJQ29udGV4dElkcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTA1MDAgZm9yIEVkaXQgQXR0cmlidXRlIEluc3RydWN0aW9uIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfQVRUUklCVVRFX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDUwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTA0MDAgZm9yIFNlbGVjdCBYTUwgQ2F0YWxvZyBJRCBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0NBVEFMT0dfRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwNDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRHMgZm9yIFhNTCBDb21tb24gVUkgdXNlIHhjdWl4eHggY29udGV4dCBJRHMgKi8KLQotCS8qIENPTlRFWFRfSUQgeGN1aTAwMTAgZm9yIEVkaXQgRG9jdHlwZSBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0RPQ1RZUEVfRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8qIENPTlRFWFRfSUQgeGN1aTAwMzAgZm9yIFB1YmxpYyBJRCBUZXh0IEVkaXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0RPQ1RZUEVfUFVCTElDID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDMwIjsgLy8kTk9OLU5MUy0xJAotCS8qIENPTlRFWFRfSUQgeGN1aTAwMjAgZm9yIFJvb3QgRWxlbWVudCBOYW1lIFRleHQgRWRpdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfRE9DVFlQRV9ST09UID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDIwIjsgLy8kTk9OLU5MUy0xJAotCS8qIENPTlRFWFRfSUQgeGN1aTAwNDAgZm9yIFN5c3RlbSBJRCBUZXh0IEVkaXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0RPQ1RZUEVfU1lTVEVNID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDUwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDMwMCBmb3IgRWRpdCBFbGVtZW50IEluc3RydWN0aW9uIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfRUxFTUVOVF9ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTA2MDAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwMjAwIGZvciBFZGl0IE5hbWVzcGFjZSBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX05BTUVTUEFDRV9ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTAyMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwMzAwIGZvciBFZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gRGlhbG9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9QUk9DRVNTSU5HX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDMwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTAxMDAgZm9yIEVkaXQgU2NoZW1hIEluZm9ybWF0aW9uIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfU0NIRU1BX0lORk9fRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMTAwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTczYmFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JTWVzc2FnZUFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEEgRGVsZWdhdGluZ1JlY29uY2lsZVZhbGlkYXRvciBjYWxscyBpdHMgZGVsZWdhdGUgdmFsaWRhdG9yIHRvIGdldCBhIGxpc3QKLSAqIG9mIHZhbGlkYXRpb24gZXJyb3IgSU1lc3NhZ2VzLiBVc2luZyBpbmZvcm1hdGlvbiBpbiB0aGlzIElNZXNzYWdlIHRoZQotICogRGVsZWdhdGluZ1JlY29uY2lsZVZhbGlkYXRvciB1cGRhdGVzIHRoZSBJTWVzc2FnZSB3aXRoIGFuIG9mZnNldCBhbmQgbGVuZ3RoCi0gKiB0byBnaXZlIGEgZ29vZCByYW5nZSB0byBiZSAic3F1aWdnbGVkIiBhbmQgYWRkcyB0aGUgbWVzc2FnZXMgdG8gdGhlCi0gKiBJUmVwb3J0ZXIKLSAqIAotICogQGF1dGhvciBNYXJrIEh1dGNoaW5zb24KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCS8vIHRoZSBzZWxlY3Rpb24gc3RyYXRlZ2llczoKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfQVRUUklCVVRFUyA9ICJBTExfQVRUUklCVVRFUyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9ICJBVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSAiQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBRyA9ICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJURVhUIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX05PTl9XSElURVNQQUNFX1RFWFQgPSAiRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VOVElUWV9SRUZFUkVOQ0UgPSAiVEVYVF9FTlRJVFlfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFID0gIlZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9UQUcgPSAiRU5EX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgY29uc3RhbnQgc3BlY2lmaWVzIHRoZSBhdHRyaWJ1dGUgbmFtZSB0aGF0IHNwZWNpZmllcyB0aGUgc2lkZSBvZgotCSAqIHRoZSAnc3RhcnQgdGFnJyB0aGF0IHRoZSB2YWxpZGF0b3IgaGFzIHVzZWQgdG8gcmVwb3J0IGFuIGVycm9yLiBBCi0JICogdmFsaWRhdG9yIG1heSBjaG9vc2UgdG8gcmVwb3J0IGEgbWVzc2FnZSBhdCB0aGUgbGVmdCAodGhlIHN0YXJ0IG9mIHRoZQotCSAqIHN0YXJ0IHRhZylvciBhdCB0aGUgcmlnaHQgKHRoZSBlbmQgb2YgdGhlIHN0YXJ0IHRhZykuIFdoZW4gdGhpcwotCSAqIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkIGVycm9yIEVSUk9SX1NJREVfTEVGVCBpcyB0aGUgZGVmYXVsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9TSURFID0gIkVSUk9SX1NJREUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBXaGVuIHRoZSBFUlJPUl9TSURFIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIEVSUk9SX1NJREVfTEVGVCB2YWx1ZSBpdCBpcwotCSAqIGFzc3VtZWQgdGhhdCB0aGUgbWVzc2FnZSBzcGVjaWZpZXMgYSBsb2NhdGlvbiB0byB0aGUgbGVmdCBvZiB0aGUgc3RhcnQKLQkgKiB0YWcKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9TSURFX0xFRlQgPSAiRVJST1JfU0lERV9MRUZUIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFdoZW4gdGhlIEVSUk9SX1NJREUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgRVJST1JfU0lERV9SSUdIVCB2YWx1ZSBpdAotCSAqIGlzIGFzc3VtZWQgdGhhdCB0aGUgbWVzc2FnZSBzcGVjaWZpZXMgYSBsb2NhdGlvbiB0byB0aGUgcmlnaHQgb2YgdGhlCi0JICogc3RhcnQgdGFnCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfU0lERV9SSUdIVCA9ICJFUlJPUl9TSURFX1JJR0hUIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OVU1CRVJfQVRUUklCVVRFID0gImNvbHVtbk51bWJlciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFID0gInNxdWlnZ2xlU2VsZWN0aW9uU3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUgPSAic3F1aWdnbGVOYW1lT3JWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOyAvLyBjb25zdHJ1Y3RvcgotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIGFyZzApIHsgLy8gZG9uJ3QgbmVlZCB0byBpbXBsZW1lbnQKLQl9Ci0KLQkvLyBNeSBJbXBsZW1lbnRhdGlvbiBvZiBJSGVscGVyCi0JY2xhc3MgTXlIZWxwZXIgaW1wbGVtZW50cyBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IHsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07Ci0KLQkJSUZpbGUgZmlsZTsKLQotCQlwdWJsaWMgTXlIZWxwZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElGaWxlIGZpbGUpIHsKLQkJCXRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEJ1aWxkS2luZCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgT2JqZWN0W10gcGFybXMpIHsKLQkJCWlmIChzeW1ib2xpY05hbWUuZXF1YWxzKCJnZXRGaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCQlpZiAoc3ltYm9saWNOYW1lLmVxdWFscygiaW5wdXRTdHJlYW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGlucHV0U3RyZWFtOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VVJJcygpIHsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfTsKLQkJCX0KLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvLyBNeSBJbXBsZW1lbnRhdGlvbiBvZiBJUmVwb3J0ZXIKLQljbGFzcyBNeVJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyBNeVJlcG9ydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciBvcmlnaW4sIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJCWxpc3QuYWRkKG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIElNZXNzYWdlQWNjZXNzIGdldE1lc3NhZ2VBY2Nlc3MoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4sIE9iamVjdCBvYmplY3QpIHsgLy8gZG8KLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4pIHsKLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgey8vIGRvCi0JCQkvKiBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgKi8KLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVZhbGlkYXRvciBnZXREZWxlZ2F0ZVZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogQ2FsbHMgYSBkZWxlZ2F0ZSB2YWxpZGF0b3IgZ2V0dGluZyBhbmQgdXBkYXRlcyBpdCdzIGxpc3Qgb2YKLQkgKiBWYWxpZGF0aW9uTWVzc2FnZXMgd2l0aCBhIGdvb2Qgc3F1aWdnbGUgb2Zmc2V0IGFuZCBsZW5ndGguCi0JICogCi0JICogQHBhcmFtIGhlbHBlcgotCSAqICAgICAgICAgICAgbG9hZHMgYW4gb2JqZWN0LgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqICAgICAgICAgICAgSXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IKLQkgKiAgICAgICAgICAgIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIGRlbHRhID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKGRlbHRhLmxlbmd0aCA+IDApIHsKLQkJCS8vIGdldCB0aGUgZmlsZSwgbW9kZWwgYW5kIGRvY3VtZW50OgotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoZGVsdGFbMF0pOwotCQkJSURPTU1vZGVsIHhtbE1vZGVsID0gZ2V0TW9kZWxGb3JSZXNvdXJjZShmaWxlKTsKLQkJCXRyeSB7Ci0JCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCS8vIHN0b3JlIHRoZSB0ZXh0IGluIGEgYnl0ZSBhcnJheTsgbWFrZSBhIGZ1bGwgY29weSB0byBlYXNlCi0JCQkJLy8gYW55IHRocmVhZGluZyBwcm9ibGVtcwotCQkJCWJ5dGVbXSBieXRlQXJyYXk7Ci0JCQkJdHJ5IHsKLQkJCQkJYnl0ZUFycmF5ID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0JCQkJfQotCQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gTm90IGxpa2VseSB0byBoYXBwZW4KLQkJCQkJYnl0ZUFycmF5ID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCkuZ2V0Qnl0ZXMoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoZmlsZSkpIHsKLQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXREZWxlZ2F0ZVZhbGlkYXRvcigpOwotCQkJCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJCS8vIFZhbGlkYXRlIHRoZSBmaWxlOgotCQkJCQkJSVZhbGlkYXRpb25Db250ZXh0IHZIZWxwZXIgPSBuZXcgTXlIZWxwZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheSksIGZpbGUpOwotCQkJCQkJTXlSZXBvcnRlciB2UmVwb3J0ZXIgPSBuZXcgTXlSZXBvcnRlcigpOwotCQkJCQkJaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IpIHsKLQkJCQkJCQkoKElWYWxpZGF0b3JKb2IpIHZhbGlkYXRvcikudmFsaWRhdGVJbkpvYih2SGVscGVyLCB2UmVwb3J0ZXIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHZIZWxwZXIsIHZSZXBvcnRlcik7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IG1lc3NhZ2VzID0gdlJlcG9ydGVyLmxpc3Q7Ci0KLQkJCQkJCS8vIHNldCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGgKLQkJCQkJCXVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlcyhtZXNzYWdlcywgZG9jdW1lbnQsIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCi0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRlcyB0aHJvdWdoIHRoZSBtZXNzYWdlcyBhbmQgY2FsY3VsYXRlcyBhICJiZXR0ZXIiIG9mZnNldCBhbmQKLQkgKiBsZW5ndGgKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZXMgLQotCSAqICAgICAgICAgICAgYSBMaXN0IG9mIElNZXNzYWdlcwotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQKLQkgKiBAcGFyYW0gcmVwb3J0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIHJlcG9ydGVyIHRoZSBtZXNzYWdlcyBhcmUgdG8gYmUgYWRkZWQgdG8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWYWxpZGF0aW9uTWVzc2FnZXMoTGlzdCBtZXNzYWdlcywgSURPTURvY3VtZW50IGRvY3VtZW50LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5zaXplKCk7IGkrKykgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IChJTWVzc2FnZSkgbWVzc2FnZXMuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlpZiAobWVzc2FnZS5nZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUpICE9IG51bGwpIHsKLQkJCQkJaW50IGNvbHVtbiA9ICgoSW50ZWdlcikgbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUpKS5pbnRWYWx1ZSgpOwotCQkJCQlTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3kgPSAoU3RyaW5nKSBtZXNzYWdlLmdldEF0dHJpYnV0ZShTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFKTsKLQkJCQkJU3RyaW5nIG5hbWVPclZhbHVlID0gKFN0cmluZykgbWVzc2FnZS5nZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUpOwotCi0JCQkJCS8vIGNvbnZlcnQgdGhlIGxpbmUgYW5kIENvbHVtbiBudW1iZXJzIHRvIGFuIG9mZnNldDoKLQkJCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChtZXNzYWdlLmdldExpbmVOdW1iZXIoKSAtIDEpICsgY29sdW1uIC0gMTsKLQotCQkJCQkvLyBjYWxjdWxhdGUgdGhlICJiZXR0ZXIiIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0OgotCQkJCQlpbnRbXSByZXN1bHQgPSBjb21wdXRlU3RhcnRBbmRFbmRMb2NhdGlvbihzdGFydCwgc2VsZWN0aW9uU3RyYXRlZ3ksIGdldEVycm9yU2lkZShtZXNzYWdlKSwgbmFtZU9yVmFsdWUsIGRvY3VtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChyZXN1bHRbMF0pOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgocmVzdWx0WzFdIC0gcmVzdWx0WzBdKTsKLQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeyAvLyB0aGlzIGV4Y2VwdGlvbiBzaG91bGQgbm90Ci0JCQkJLy8gb2NjdXIgLSBpdCBpcyB0aHJvd24gaWYKLQkJCQkvLyB0cnlpbmcgdG8gY29udmVydCBhbgotCQkJCS8vIGludmFsaWQgbGluZSBudW1iZXIgdG8gYW5kCi0JCQkJLy8gb2Zmc2V0Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWx0YQotCSAqICAgICAgICAgICAgdGhlIElGaWxlRGVsdGEgY29udGFpbmluZyB0aGUgZmlsZSBuYW1lIHRvIGdldAotCSAqIEByZXR1cm4gdGhlIElGaWxlCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGRlbHRhKSB7Ci0JCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZGVsdGEpKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotCQkgIHJldHVybiBmaWxlOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gZ2V0IHRoZSBtb2RlbCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBmaWxlJ3MgWE1MTW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgSURPTU1vZGVsIGdldE1vZGVsRm9yUmVzb3VyY2UoSUZpbGUgZmlsZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCS8vIFRPRE8uLiBIVE1MIHZhbGlkYXRvciB0cmllcyBhZ2FpbiB0byBnZXQgYSBtb2RlbCBhIDJuZCB3YXkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwgPyAoSURPTU1vZGVsKSBtb2RlbCA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNvbXB1dGVTdGFydEVuZExvY2F0aW9uKGludCBzdGFydE9mZnNldCwgU3RyaW5nCi0JICogICAgICAgICAgICAgZXJyb3JNZXNzYWdlLCBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3ksIGJvb2xlYW4gbGVmdEVycm9yLAotCSAqICAgICAgICAgICAgIFN0cmluZyBuYW1lT3JWYWx1ZSwgSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIGludFtdIGNvbXB1dGVTdGFydEVuZExvY2F0aW9uKGludCBzdGFydE9mZnNldCwgU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIHNlbGVjdGlvblN0cmF0ZWd5LCBTdHJpbmcgbmFtZU9yVmFsdWUsIElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gY29tcHV0ZVN0YXJ0QW5kRW5kTG9jYXRpb24oc3RhcnRPZmZzZXQsIHNlbGVjdGlvblN0cmF0ZWd5LCBFUlJPUl9TSURFX1JJR0hULCBuYW1lT3JWYWx1ZSwgZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlICJiZXR0ZXIiIG9mZnNldHMuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgZ2l2ZW4gYnkgWGVyY2VzCi0JICogQHBhcmFtIGVycm9yTWVzc2FnZSAtCi0JICogICAgICAgICAgICB0aGUgWGVyY2VzIGVycm9yIE1lc3NhZ2UKLQkgKiBAcGFyYW0gc2VsZWN0aW9uU3RyYXRlZ3kgLQotCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGlvblN0cmF0ZWd5Ci0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudAotCSAqIEByZXR1cm4gaW50W10gLSBwb3NpdGlvbiAwIGhhcyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBzcXVpZ2dsZSByYW5nZSwKLQkgKiAgICAgICAgIHBvc2l0aW9uIDEgaGFzIHRoZSBlbmRPZmZzZXQKLQkgKi8KLQkvKgotCSAqIFRoZSB3YXkgdGhlIG9mZnNldHMgaXMgY2FsY3VsYXRlZCBpczogLSBmaW5kIHRoZSBpbmRleGVkIHJlZ2lvbgotCSAqIChlbGVtZW50KSBjbG9zZXN0IHRvIHRoZSBnaXZlbiBvZmZzZXQgLSBpZiB3ZSBhcmUgYmV0d2VlbiB0d28gZWxlbWVudHMsCi0JICogY2hvb3NpbmcgbGVmdCBvciByaWdodCBlbGVtZW50IHdpbGwgZGVwZW5kIG9uIHBhcmFtZXRlciAnZXJyb3JTaWRlJyAtCi0JICogYmFzZWQgb24gdGhlIHNlbGVjdGlvblN0cmF0ZWd5IGNob29zZSB0aGUgdW5kZXJsaW5pbmcgc3RyYXRlZ3kgKGVnCi0JICogU1RBUlRfVEFHIG1lYW5zIHVuZGVybGluZSB0aGUgc3RhcnQgdGFnIG9mIHRoYXQgZWxlbWVudCkgLSB1c2UKLQkgKiBpbmZvcm1hdGlvbiBmcm9tIG5hbWVPclZhbHVlIGFuZCB0aGUgRE9NIHRvIGdldCBiZXR0ZXIgb2Zmc2V0cwotCSAqIAotCSAqLwotCXByb3RlY3RlZCBpbnRbXSBjb21wdXRlU3RhcnRBbmRFbmRMb2NhdGlvbihpbnQgc3RhcnRPZmZzZXQsIFN0cmluZyBzZWxlY3Rpb25TdHJhdGVneSwgU3RyaW5nIGVycm9yU2lkZSwgU3RyaW5nIG5hbWVPclZhbHVlLCBJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWludCBzdGFydEVuZFBvc2l0aW9uc1tdID0gbmV3IGludFsyXTsKLQotCQkJSW5kZXhlZFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc3RhcnRPZmZzZXQpOwotCQkJSW5kZXhlZFJlZ2lvbiBwcmV2UmVnaW9uID0gZG9jdW1lbnQuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0IC0gMSk7Ci0KLQkJCWlmIChwcmV2UmVnaW9uICE9IHJlZ2lvbikgewotCQkJCS8vIGlmIGJldHdlZW4gdHdvIHJlZ2lvbnMgd2UgdXNlIHRoZSAnZXJyb3JTaWRlJyB0byB1bmRlcnN0YW5kCi0JCQkJLy8gd2hpY2gKLQkJCQkvLyBlbGVtZW50IGlzIGFwcGxpY2FibGUuIGlmIHdlIGtub3cgdGhlIGVycm9yIGhhcyBiZWVuCi0JCQkJLy8gcmVwb3J0ZWQgdG8gdGhlCi0JCQkJLy8gcmlnaHQgb2YgdGhlIHRhZywgdGhlbiB3ZSBjYW4gYXNzdW1lIHdlIG5lZWQgdG8gc3RlcCBiYWNrCi0JCQkJLy8gdG8gdGhlIHByZXZpb3VzCi0JCQkJLy8gcmVnaW9uIHRvIGxhbmQgYXQgdGhlICdjb3JyZWN0IGxvY2F0aW9uLiBPdGhlcndpc2UgYXNzdW1lCi0JCQkJLy8gd2UncmUKLQkJCQkvLyBleGFjdGx5IHdoZXJlIHdlIG5lZWQgdG8gYmUuCi0JCQkJaWYgKEVSUk9SX1NJREVfTEVGVC5lcXVhbHMoZXJyb3JTaWRlKSkgewotCQkJCQlyZWdpb24gPSBwcmV2UmVnaW9uOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaW5pdGlhbGl6ZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyB0byBiZSB0aGUgc3RhcnQgcG9zaXRpb25zCi0JCQkvLyB0aGlzIG1lYW5zIGlmIHRoZQotCQkJLy8gc3BlY2lhbCBjYXNlIGlzIG5vdCB0YWtlbiBjYXJlIG9mIGJlbG93IHRoZSBzdGFydCBhbmQgZW5kCi0JCQkvLyBvZmZzZXQgYXJlIHNldCB0byBiZQotCQkJLy8gdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gd2hlcmUgdGhlIGVycm9yIHdhcwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdOwotCQkJfQotCQkJZWxzZSB7IC8vIHRoaXMgd2lsbCBtZXNzYWdlIHdpbGwgbm90IGdldCBhZGRlZCB0byB0aGUgSVJlcG9ydGVyCi0JCQkJLy8gc2luY2UgdGhlIGxlbmd0aCBpcyAwCi0JCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSAwOwotCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gMDsKLQkJCX0KLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIHJlZ2lvbjsKLQotCQkJCWlmIChTVEFSVF9UQUcuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgey8vIHRoZW4gd2Ugd2FudCB0bwotCQkJCQkvLyB1bmRlcmxpbmUgdGhlIG9wZW5pbmcgdGFnCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKSArIDE7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdICsgZWxlbWVudC5nZXRUYWdOYW1lKCkubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoRU5EX1RBRy5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ly8gdGhlbiB3ZSB3YW50IHRvCi0JCQkJCS8vIHVuZGVybGluZSB0aGUgZW5kIHRhZwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBlbGVtZW50LmdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IGVsZW1lbnQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoQVRUUklCVVRFX05BTUUuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgeyAvLyBpbgotCQkJCQkvLyB1bmRlcmxpbmUgdGhlIGF0dHJpYnV0ZSdzIG5hbWUKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCQkJCUlET01Ob2RlIGF0dHJpYnV0ZU5vZGUgPSAoSURPTU5vZGUpIChlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobmFtZU9yVmFsdWUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHJpYnV0ZU5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IGF0dHJpYnV0ZU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIG5hbWVPclZhbHVlLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEFUVFJJQlVURV9WQUxVRS5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ci0JCQkJCS8vIHVuZGVybGluZSB0aGUgYXR0cmlidXRlJ3MgdmFsdWUKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCQkJCUlET01BdHRyIGF0dHJpYnV0ZU5vZGUgPSAoSURPTUF0dHIpIChlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobmFtZU9yVmFsdWUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHJpYnV0ZU5vZGUuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gc3RhcnRFbmRQb3NpdGlvbnNbMF0gKyBhdHRyaWJ1dGVOb2RlLmdldFZhbHVlUmVnaW9uVGV4dCgpLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEFMTF9BVFRSSUJVVEVTLmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gdW5kZXJsaW5lIGFsbCBhdHRyaWJ1dGVzCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCQkJCUlET01Ob2RlIGZpcnN0ID0gKElET01Ob2RlKSBhdHRyaWJ1dGVzLml0ZW0oMCk7Ci0JCQkJCQkJSURPTU5vZGUgbGFzdCA9IChJRE9NTm9kZSkgYXR0cmlidXRlcy5pdGVtKGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCQkJCQlpZiAoKGZpcnN0ICE9IG51bGwpICYmIChsYXN0ICE9IG51bGwpKSB7Ci0JCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBsYXN0LmdldEVuZE9mZnNldCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChURVhULmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gdW5kZXJsaW5lIHRoZSB0ZXh0IGJldHdlZW4gdGhlIHRhZ3MKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJSURPTVRleHQgdGV4dE5vZGUgPSAoSURPTVRleHQpIG5vZGU7Ci0JCQkJCQlpbnQgc3RhcnQgPSB0ZXh0Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJU3RyaW5nIHZhbHVlID0gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJY2hhciBjdXJDaGFyID0gdmFsdWUuY2hhckF0KGluZGV4KTsKLQkJCQkJCS8vIGhlcmUgd2UgYXJlIGZpbmRpbmcgc3RhcnQgb2Zmc2V0IGJ5IHNraXBwaW5nIG92ZXIKLQkJCQkJCS8vIHdoaXRlc3BhY2U6Ci0JCQkJCQl3aGlsZSAoKGN1ckNoYXIgPT0gJ1xuJykgfHwgKGN1ckNoYXIgPT0gJ1x0JykgfHwgKGN1ckNoYXIgPT0gJ1xyJykgfHwgKGN1ckNoYXIgPT0gJyAnKSkgewotCQkJCQkJCWN1ckNoYXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpOwotCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCQkJaW5kZXgtLTsKLQotCQkJCQkJfQotCQkJCQkJc3RhcnQgPSBzdGFydCArIGluZGV4OwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBzdGFydCArIGluZGV4OwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydCArIHZhbHVlLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkJCUlET01Ob2RlIHhtbENoaWxkID0gKChJRE9NTm9kZSkgY2hpbGQpOwotCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0geG1sQ2hpbGQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHhtbENoaWxkLmdldEVuZE9mZnNldCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEZJUlNUX05PTl9XSElURVNQQUNFX1RFWFQuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgewotCQkJCQkvLyBzZWFyY2ggdGhyb3VnaCBhbGwgY2hpbGQgbm9kZXMgYW5kIHJldHVybiByYW5nZSBvZgotCQkJCQkvLyBmaXJzdCBub24td2hpdGVzcGFjZQotCQkJCQkvLyB0ZXh0IG5vZGUKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJTm9kZUxpc3Qgbm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCU5vZGUgY3VycmVudE5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJCQkJCWlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkJCS8vIFRPRE8gKFRydW5nKSBJIGRvbid0IHRoaW5rIHdlIHNob3VsZCBjYWxsCi0JCQkJCQkJCS8vIGdldE5vZGVWYWx1ZSgpLCB0cmltKCksIGxlbmd0aCgpCi0JCQkJCQkJCS8vIHJlcGVhdGVkbHkuCi0JCQkJCQkJCS8vIFRoaXMgaXMgaW5lZmZpY2llbnQsIHRvIGltcHJvdmUgdXNlIGxvY2FsCi0JCQkJCQkJCS8vIHZhcmlhYmxlcyB0byBzdG9yZSB2YWx1ZXMuCi0JCQkJCQkJCUlET01UZXh0IHRleHROb2RlID0gKElET01UZXh0KSBjdXJyZW50Tm9kZTsKLQkJCQkJCQkJaWYgKHRleHROb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCVN0cmluZyB2YWx1ZSA9IHRleHROb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCQkJCWludCBzdGFydCA9IHRleHROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJCQljaGFyIGN1ckNoYXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpOwotCQkJCQkJCQkJLy8gaGVyZSB3ZSBhcmUgZmluZGluZyBzdGFydCBvZmZzZXQgYnkKLQkJCQkJCQkJCS8vIHNraXBwaW5nIG92ZXIgd2hpdGVzcGFjZToKLQkJCQkJCQkJCXdoaWxlICgoY3VyQ2hhciA9PSAnXG4nKSB8fCAoY3VyQ2hhciA9PSAnXHQnKSB8fCAoY3VyQ2hhciA9PSAnXHInKSB8fCAoY3VyQ2hhciA9PSAnICcpKSB7Ci0JCQkJCQkJCQkJY3VyQ2hhciA9IHZhbHVlLmNoYXJBdChpbmRleCk7Ci0JCQkJCQkJCQkJaW5kZXgrKzsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJCQkJCQlpbmRleC0tOwotCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlzdGFydCA9IHN0YXJ0ICsgaW5kZXg7Ci0JCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IHN0YXJ0OwotCQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydCArIHZhbHVlLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQllbHNlIGlmIChURVhUX0VOVElUWV9SRUZFUkVOQ0UuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgewotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSByZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogSW4gdGhpcyBjYXNlIHRoZSB1bmRlY2xhcmVkIGVudGl0eSBtaWdodCBiZSBpbiBvbmUKLQkJCQkJCSAqIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWVzLiBTZWFyY2ggdGhyb3VnaCB0aGUKLQkJCQkJCSAqIGF0dHJpYnV0ZXMgdG8gZmluZCB0aGUgcmFuZ2Ugb2YgdGhlIHVuZGVjbGFyZWQKLQkJCQkJCSAqIGVudGl0eS4KLQkJCQkJCSAqLwotCQkJCQkJU3RyaW5nIGVudGl0eSA9ICImIiArIG5hbWVPclZhbHVlICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCUlET01BdHRyIGF0dHIgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCQlTdHJpbmcgbm9kZVZhbHVlID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQlpbnQgaW5kZXggPSBub2RlVmFsdWUuaW5kZXhPZihlbnRpdHkpOwotCQkJCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgaW5kZXggKyAxOwotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdICsgZW50aXR5Lmxlbmd0aCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJCWVsc2UgaWYgKFZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFLmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gVE9ETyAoVHJ1bmcpIGRvIHdlIHJlYWxseSBuZWVkIHRoaXMgc3RyYXRlZ3kgPwotCQkJCQkvLyBJZiB3ZSBrbm93IHRoZSBuYW1lIG9mIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHdlCi0JCQkJCS8vIGNhbiByZXRyaWV2ZSBpdHMgdmFsdWUuCi0JCQkJCS8vIEhlbmNlLCB3ZSBjYW4gaW5jb3BlcmF0ZSB0aGlzIHN0cmF0ZWd5IHdpdGgKLQkJCQkJLy8gQVRUUklCVVRFX1ZBTFVFID8KLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJLy8gaGVyZSB3ZSB3aWxsIHNlYXJjaCB0aHJvdWdoIGFsbCBhdHRyaWJ1dGVzIGZvciB0aGUKLQkJCQkJCS8vIG9uZSB3aXRoIHRoZQotCQkJCQkJLy8gd2l0aCB0aGUgdmFsdWUgd2Ugd2FudDoKLQkJCQkJCS8vIFRPRE8gKFRydW5nKSBJIHNlZSBhIHBvdGVudGlhbCBwcm9ibGVtIGhlcmUuCi0JCQkJCQkvLyBXaGF0IGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBhbm90aGVyIGF0dHJpYnV0ZSBoYXZpbmcKLQkJCQkJCS8vIHRoZSBzYW1lIHZhbHVlCi0JCQkJCQkvLyB3aXRoIHRoaXMgYXR0cmlidXRlJ3MgYnVnZ3kgdmFsdWUgPwotCQkJCQkJLy8gTmVlZCB0byBzb2x2ZSB3aGVuIHRpbWUgcGVybWl0cy4KLQkJCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCUlET01BdHRyIGF0dHIgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCQlTdHJpbmcgbm9kZVZhbHVlID0gYXR0ci5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0JCQkJCQkJaWYgKG5vZGVWYWx1ZS5lcXVhbHMobmFtZU9yVmFsdWUpKSB7Ci0JCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gYXR0ci5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOwotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdICsgbm9kZVZhbHVlLmxlbmd0aCgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhcnRFbmRQb3NpdGlvbnM7Ci0JCX0KLQkJLy8gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IC8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCS8vIH0KLQkJZmluYWxseSB7Ci0JCX0KLQkJLy8gcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGRlbGVnYXRlIHZhbGlkYXRvciBpcyBlbmFibGVkIGJhc2VkIG9uIFZhbGlkYXRpb24KLQkgKiBwcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBmYWxzZSBpZiBkZWxlZ2F0ZSB2YWxpZGF0b3IgaXMgbm90IGVuYWJsZWQgYmFzZWQgb24gVmFsaWRhdG9pbgotCSAqICAgICAgICAgcHJlZmVyZW5jZXMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yU2lkZShJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCS8vIG5vdGUgdGhhdCBpZiB0aGUgRVJST1JfU0lERSBpcyB1bnNwZWNpZmllZCB3ZSByZXR1cm4gdGhlIGRlZmF1bHQKLQkJLy8gdmFsdWUgRVJST1JfU0lERV9MRUZUCi0JCU9iamVjdCB2YWx1ZSA9IG1lc3NhZ2UuZ2V0QXR0cmlidXRlKEVSUk9SX1NJREUpOwotCQlyZXR1cm4gRVJST1JfU0lERV9SSUdIVC5lcXVhbHModmFsdWUpID8gRVJST1JfU0lERV9SSUdIVCA6IEVSUk9SX1NJREVfTEVGVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNGE4NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgcGVyZm9ybXMgYXMgeW91IHR5cGUgdmFsaWRhdGlvbiBmb3IgWE1MIGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MIGV4dGVuZHMgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcgotewotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSWQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIFZhbGlkYXRvciBfdmFsaWRhdG9yOwotCi0gIHB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MKCkKLSAgewotICB9Ci0KLSAgcHJpdmF0ZSBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIGlmIChfdmFsaWRhdG9yID09IG51bGwpCi0gICAgICBfdmFsaWRhdG9yID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9yKElkKTsKLSAgICByZXR1cm4gX3ZhbGlkYXRvcjsKLSAgfQotCi0gIHByb3RlY3RlZCBJVmFsaWRhdG9yIGdldERlbGVnYXRlVmFsaWRhdG9yKCkKLSAgewotICAgIFZhbGlkYXRvciB2ID0gZ2V0VmFsaWRhdG9yKCk7Ci0gICAgaWYgKHYgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIHJldHVybiB2LmFzSVZhbGlkYXRvcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoSUZpbGUgZmlsZSkKLSAgewotICAgIFZhbGlkYXRvciB2ID0gZ2V0VmFsaWRhdG9yKCk7Ci0gICAgaWYgKHYgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIXYuc2hvdWxkVmFsaWRhdGUoZmlsZSwgZmFsc2UsIGZhbHNlKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdi5pc0J1aWxkVmFsaWRhdGlvbigpIHx8IHYuaXNNYW51YWxWYWxpZGF0aW9uKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL01hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGM4NzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL01hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uUHJvYmxlbUlEc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotLyoqCi0gKiBRdWljayBhc3Npc3QgcHJvY2Vzc29yIGZvciBwcm9ibGVtcyBmb3VuZCBieSB0aGUgbWFya3VwIHZhbGlkYXRvcgotICovCi1jbGFzcyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElRdWlja0Fzc2lzdFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBpbnQgZlByb2JsZW1JZDsKLQlwcml2YXRlIE9iamVjdCBmQWRkaXRpb25hbEZpeEluZm8gPSBudWxsOwotCi0JcHVibGljIGJvb2xlYW4gY2FuQXNzaXN0KElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaXgoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJc3dpdGNoIChmUHJvYmxlbUlkKSB7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuRW1wdHlUYWcgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLkF0dHJzSW5FbmRUYWcgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdBdHRyVmFsdWUgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVUYWdOYW1lIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVQSSA6Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSA6Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkVsZW1lbnQgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25BdHRyIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5JbnZhbGlkQXR0clZhbHVlIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nUmVxdWlyZWRBdHRyIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyVmFsdWVOb3RRdW90ZWQgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCA6Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlUXVpY2tBc3Npc3RQcm9wb3NhbHMoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpIHsKLQkJQXJyYXlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlzd2l0Y2ggKGZQcm9ibGVtSWQpIHsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5FbXB0eVRhZyA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJCVN0cmluZyB0YWdOYW1lID0gKFN0cmluZykgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVswXTsKLQkJCQlTdHJpbmcgdGFnQ2xvc2UgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzFdOwotCQkJCWludCB0YWdDbG9zZU9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVsyXSkuaW50VmFsdWUoKTsKLQkJCQlpbnQgc3RhcnRUYWdFbmRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbM10pLmludFZhbHVlKCk7Ci0JCQkJaW50IGZpcnN0Q2hpbGRTdGFydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVs0XSkuaW50VmFsdWUoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzVdKS5pbnRWYWx1ZSgpOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCh0YWdDbG9zZSwgdGFnQ2xvc2VPZmZzZXQsIDAsIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMSwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBzdGFydFRhZ0VuZE9mZnNldCAtIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzIsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIjwvIiArIHRhZ05hbWUgKyAiPiIsIGZpcnN0Q2hpbGRTdGFydE9mZnNldCwgMCwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8zLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIjwvIiArIHRhZ05hbWUgKyAiPiIsIGVuZE9mZnNldCwgMCwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF80LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyc0luRW5kVGFnIDoKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF81LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0F0dHJWYWx1ZSA6Ci0JCQkJU3RyaW5nIGRlZmF1bHRBdHRyVmFsdWUgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzBdOwotCQkJCWludCBpbnNlcnRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMV0pLmludFZhbHVlKCk7Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyBkZWZhdWx0QXR0clZhbHVlICsgIlwiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCkgKyBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSArIGluc2VydE9mZnNldCwgMCwgZGVmYXVsdEF0dHJWYWx1ZS5sZW5ndGgoKSArIDIsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNiwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCQlkZWZhdWx0QXR0clZhbHVlID0gKFN0cmluZykgZkFkZGl0aW9uYWxGaXhJbmZvOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPVwiIiArIGRlZmF1bHRBdHRyVmFsdWUgKyAiXCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSArIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCAwLCBkZWZhdWx0QXR0clZhbHVlLmxlbmd0aCgpICsgMywgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF82LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF83LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlVGFnTmFtZSA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfOCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJIDoKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF85LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTAsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Vbmtub3duRWxlbWVudCA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsKGZBZGRpdGlvbmFsRml4SW5mbywgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMSkpOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkF0dHIgOgotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzcsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLkludmFsaWRBdHRyVmFsdWUgOgotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzEyLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ1JlcXVpcmVkQXR0ciA6Ci0JCQkJU3RyaW5nIHJlcXVpcmVkQXR0ciA9IChTdHJpbmcpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMF07Ci0JCQkJaW5zZXJ0T2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzFdKS5pbnRWYWx1ZSgpOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbChyZXF1aXJlZEF0dHIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpICsgaW5zZXJ0T2Zmc2V0LCAwLCByZXF1aXJlZEF0dHIubGVuZ3RoKCksIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTMsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuQXR0clZhbHVlTm90UXVvdGVkIDoKLQkJCQlTdHJpbmcgYXR0clZhbHVlID0gKFN0cmluZykgZkFkZGl0aW9uYWxGaXhJbmZvOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgYXR0clZhbHVlICsgIlwiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCBhdHRyVmFsdWUubGVuZ3RoKCkgKyAyLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzE0LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nQ2xvc2luZ0JyYWNrZXQgOgotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpICsgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIDEsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTUsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT1JSRUNUSU9OX0NIQU5HRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbUlkKGludCBwcm9ibGVtSWQpIHsKLQkJZlByb2JsZW1JZCA9IHByb2JsZW1JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsRml4SW5mbyhPYmplY3QgZml4SW5mbykgewotCQlmQWRkaXRpb25hbEZpeEluZm8gPSBmaXhJbmZvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL01hcmt1cFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjNjN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlJlY29uY2lsZUFubm90YXRpb25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLkFubm90YXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JbmNyZW1lbnRhbFJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkxvY2FsaXplZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Qcm9ibGVtSURzWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQmFzaWMgWE1MIHN5bnRheCBjaGVja2luZyBzdGVwLgotICovCi1wdWJsaWMgY2xhc3MgTWFya3VwVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yLCBJU291cmNlVmFsaWRhdG9yIHsKLQlwcml2YXRlIFN0cmluZyBEUVVPVEUgPSAiXCIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgU1FVT1RFID0gIiciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUVVJQ0tBU1NJU1RQUk9DRVNTT1IgPSBJUXVpY2tBc3Npc3RQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZlJvb3RDb250ZW50VHlwZSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGludCBTRVZFUklUWV9BVFRSSUJVVEVfSEFTX05PX1ZBTFVFID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQlwcml2YXRlIGludCBTRVZFUklUWV9FTkRfVEFHX1dJVEhfQVRUUklCVVRFUyA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JcHJpdmF0ZSBpbnQgU0VWRVJJVFlfSU5WQUxJRF9XSElURVNQQUNFX0JFRk9SRV9UQUdOQU1FID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQlwcml2YXRlIGludCBTRVZFUklUWV9NSVNTSU5HX0NMT1NJTkdfQlJBQ0tFVCA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JcHJpdmF0ZSBpbnQgU0VWRVJJVFlfTUlTU0lOR19DTE9TSU5HX1FVT1RFID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQlwcml2YXRlIGludCBTRVZFUklUWV9NSVNTSU5HX0VORF9UQUcgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IFNFVkVSSVRZX01JU1NJTkdfU1RBUlRfVEFHID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQlwcml2YXRlIGludCBTRVZFUklUWV9NSVNTSU5HX1FVT1RFUyA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JcHJpdmF0ZSBpbnQgU0VWRVJJVFlfTkFNRVNQQUNFX0lOX1BJX1RBUkdFVCA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JcHJpdmF0ZSBpbnQgU0VWRVJJVFlfVEFHX05BTUVfTUlTU0lORyA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JcHJpdmF0ZSBpbnQgU0VWRVJJVFlfV0hJVEVTUEFDRV9BVF9TVEFSVCA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0gICAgICAgIAotCXByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGVFcnJvcihTdHJpbmcgbWVzc2FnZVRleHQsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZVRleHQsIGludCBzdGFydCwgaW50IGxlbmd0aCwgaW50IHByb2JsZW1JZCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBpbnQgbWVzc2FnZVNldmVyaXR5KSB7Ci0KLQkJaWYgKHNkUmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0JCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VTZXZlcml0eSwgbWVzc2FnZVRleHQpOwotCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0KLQotCQlpZiAocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSB7Ci0JCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCXByb2Nlc3Nvci5zZXRQcm9ibGVtSWQocHJvYmxlbUlkKTsKLQkJCXByb2Nlc3Nvci5zZXRBZGRpdGlvbmFsRml4SW5mbyhhdHRyaWJ1dGVWYWx1ZVRleHQpOwotCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0JCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKSByZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQXR0cmlidXRlc0luRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpbnQgZXJyb3JDb3VudCA9IDA7Ci0JCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpKSAmJiAoZXJyb3JDb3VudCA8IEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LkVMRU1FTlRfRVJST1JfTElNSVQpICYmICFzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCWlmICgodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHx8ICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSkgewotCQkJCWlmIChzdGFydCA+IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0ZXh0UmVnaW9uKSkgewotCQkJCQlzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0ZXh0UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZW5kID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCh0ZXh0UmVnaW9uKTsKLQkJCQllcnJvckNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlIG9uZSBlcnJvciBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIGVuZCB0YWcKLQkJaWYgKGVycm9yQ291bnQgPiAwKSB7Ci0JCQkvLyBQb3NpdGlvbiBwID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxVSU1lc3NhZ2VzLkVuZF90YWdfaGFzX2F0dHJpYnV0ZXM7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShTRVZFUklUWV9FTkRfVEFHX1dJVEhfQVRUUklCVVRFUywgbWVzc2FnZVRleHQpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgoZW5kIC0gc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMaW5lTm8oZ2V0TGluZU51bWJlcihzdGFydCkpOwotCi0JCQlpZiAocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSB7Ci0JCQkJTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLkF0dHJzSW5FbmRUYWcpOwotCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjaGVja0Nsb3NpbmdCcmFja2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCByZWdpb25zLnNpemUoKSkgJiYgIXN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkpIHsKLQkJCQljbG9zZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICghY2xvc2VkKSB7Ci0KLQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF82OwotCi0JCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKTsKLQkJCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQotCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoU0VWRVJJVFlfTUlTU0lOR19DTE9TSU5HX0JSQUNLRVQgLCBtZXNzYWdlVGV4dCk7Ci0JCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQotCQkJaWYgKHJlcG9ydGVyIGluc3RhbmNlb2YgSW5jcmVtZW50YWxSZXBvcnRlcikgewotCQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCXByb2Nlc3Nvci5zZXRQcm9ibGVtSWQoUHJvYmxlbUlEc1hNTC5NaXNzaW5nQ2xvc2luZ0JyYWNrZXQpOwotCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tFbXB0eVRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbmF2aWdhdGUgdG8gbmFtZQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zLnNpemUoKSA9PSAyKSB7Ci0JCQkvLyBtaXNzaW5nIG5hbWUgcmVnaW9uCi0JCQlpZiAoKHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgJiYgKHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzM7Ci0JCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0KLQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShTRVZFUklUWV9UQUdfTkFNRV9NSVNTSU5HICwgbWVzc2FnZVRleHQpOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0KLQkJCQlpZiAocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSB7Ci0JCQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCQlwcm9jZXNzb3Iuc2V0UHJvYmxlbUlkKFByb2JsZW1JRHNYTUwuRW1wdHlUYWcpOwotCQkJCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLQotCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0TGluZU51bWJlcihpbnQgc3RhcnQpIHsKLQkJaW50IGxpbmVObyA9IC0xOwotCQl0cnkgewotCQkJbGluZU5vID0gZ2V0RG9jdW1lbnQoKS5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpICsgMTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbGluZU5vOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0ZvckF0dHJpYnV0ZVZhbHVlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgZm9yIGF0dHJpYnV0ZXMgd2l0aG91dCBhIHZhbHVlCi0JCS8vIHRyYWNrIHRoZSBhdHRyaWJ1dGUvZXF1YWxzL3ZhbHVlIHNlcXVlbmNlIHVzaW5nIGEgc3RhdGUgb2YgMCwgMSAsMgotCQkvLyByZXByZXNlbnRpbmcgdGhlIG5hbWUsID0sIGFuZCB2YWx1ZSwgcmVzcGVjdGl2ZWx5Ci0JCWludCBhdHRyU3RhdGUgPSAwOwotCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkvLyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9IGNyZWF0ZUtleShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sCi0JCS8vIGdldFNjb3BlKCkpOwotCi0JCWludCBlcnJvckNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpKSAmJiAoZXJyb3JDb3VudCA8IEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LkVMRU1FTlRfRVJST1JfTElNSVQpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgfHwgaXNUYWdDbG9zZVRleHRSZWdpb24odGV4dFJlZ2lvbikpIHsKLQkJCQkvLyBkYW5nbGluZyBuYW1lIGFuZCAnPScKLQkJCQlpZiAoKGF0dHJTdGF0ZSA9PSAyKSAmJiAoaSA+PSAyKSkgewotCQkJCQkvLyBjcmVhdGUgYW5ub3RhdGlvbgotCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkgLSAyKTsKLQkJCQkJaWYgKCEobmFtZVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCQkJT2JqZWN0W10gYXJncyA9IHtzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChuYW1lUmVnaW9uKX07Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9faXNfbWlzc2luZ19hX3ZhbHVlLCBhcmdzKTsKLQotCQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJCQkJaW50IGVuZCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQkJCQkJCWludCB0ZXh0TGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQobmFtZVJlZ2lvbikudHJpbSgpLmxlbmd0aCgpOwotCi0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShTRVZFUklUWV9BVFRSSUJVVEVfSEFTX05PX1ZBTFVFICwgbWVzc2FnZVRleHQpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgodGV4dExlbmd0aCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCi0JCQkJCQkvLyBxdWljayBmaXggaW5mbwotCQkJCQkJSVRleHRSZWdpb24gZXF1YWxzUmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkgLSAyICsgMSk7Ci0JCQkJCQlpbnQgaW5zZXJ0T2Zmc2V0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoZXF1YWxzUmVnaW9uKSAtIGVuZDsKLQkJCQkJCU9iamVjdFtdIGFkZGl0aW9uYWxGaXhJbmZvID0ge3N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pLCBuZXcgSW50ZWdlcihpbnNlcnRPZmZzZXQpfTsKLQotCQkJCQkJaWYgKHJlcG9ydGVyIGluc3RhbmNlb2YgSW5jcmVtZW50YWxSZXBvcnRlcikgewotCQkJCQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCQkJCXByb2Nlc3Nvci5zZXRQcm9ibGVtSWQoUHJvYmxlbUlEc1hNTC5NaXNzaW5nQXR0clZhbHVlKTsKLQkJCQkJCQlwcm9jZXNzb3Iuc2V0QWRkaXRpb25hbEZpeEluZm8oYWRkaXRpb25hbEZpeEluZm8pOwotCQkJCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQkJCQl9Ci0JCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gbmFtZSBidXQgbm8gJz0nIChYTUwgb25seSkKLQkJCQllbHNlIGlmICgoYXR0clN0YXRlID09IDEpICYmIChpID49IDEpKSB7Ci0JCQkJCS8vIGNyZWF0ZSBhbm5vdGF0aW9uCi0JCQkJCUlUZXh0UmVnaW9uIHByZXZpb3VzUmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkgLSAxKTsKLQkJCQkJaWYgKCEocHJldmlvdXNSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7c3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocHJldmlvdXNSZWdpb24pfTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX19oYXNfbm9fdmFsdWUsIGFyZ3MpOwotCQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHByZXZpb3VzUmVnaW9uKTsKLQkJCQkJCWludCB0ZXh0TGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocHJldmlvdXNSZWdpb24pLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQotCQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoU0VWRVJJVFlfQVRUUklCVVRFX0hBU19OT19WQUxVRSwgbWVzc2FnZVRleHQpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgodGV4dExlbmd0aCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCi0JCQkJCQlpZiAocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSB7Ci0JCQkJCQkJTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlKTsKLQkJCQkJCQlwcm9jZXNzb3Iuc2V0QWRkaXRpb25hbEZpeEluZm8oc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocHJldmlvdXNSZWdpb24pKTsKLQkJCQkJCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLQotCQkJCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSk7Ci0JCQkJCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKSByZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkJfQotCi0JCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0clN0YXRlID0gMTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJYXR0clN0YXRlID0gMjsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlhdHRyU3RhdGUgPSAwOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tGb3JTcGFjZUJlZm9yZU5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBzZFJlZ2lvblRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJaWYgKHNkUmVnaW9uVGV4dC5zdGFydHNXaXRoKCIgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQkJLy8gdGhpcyBpcyBwb3NzaWJseSB0aGUgY2FzZSBvZiAiPCB0YWciCi0JCQkJaWYgKChwcmV2LmdldFJlZ2lvbnMoKS5zaXplKCkgPT0gMSkgJiYgaXNTdGFydFRhZyhwcmV2KSkgewotCQkJCQkvLyBhZGQgdGhlIGVycm9yIGZvciBwcmVjZWRpbmcgc3BhY2UgaW4gdGFnIG5hbWUKLQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzI7Ci0JCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkvLyBmaW5kIGxlbmd0aCBvZiB3aGl0ZXNwYWNlCi0JCQkJCWludCBsZW5ndGggPSBzZFJlZ2lvblRleHQudHJpbSgpLmVxdWFscygiIikgPyBzZFJlZ2lvblRleHQubGVuZ3RoKCkgOiBzZFJlZ2lvblRleHQuaW5kZXhPZihzZFJlZ2lvblRleHQudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKFNFVkVSSVRZX0lOVkFMSURfV0hJVEVTUEFDRV9CRUZPUkVfVEFHTkFNRSAsIG1lc3NhZ2VUZXh0KTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0KLQkJCQkJaWYgKHJlcG9ydGVyIGluc3RhbmNlb2YgSW5jcmVtZW50YWxSZXBvcnRlcikgewotCQkJCQkJTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCQlwcm9jZXNzb3Iuc2V0UHJvYmxlbUlkKFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlVGFnTmFtZSk7Ci0JCQkJCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLQotCQkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja05vTmFtZXNwYWNlSW5QSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbmF2aWdhdGUgdG8gbmFtZQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlpbnQgZXJyb3JDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHJlZ2lvbnMuc2l6ZSgpKSAmJiAoZXJyb3JDb3VudCA8IEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LkVMRU1FTlRfRVJST1JfTElNSVQpICYmICFzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCk7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJU3RyaW5nIHBpVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCWludCBpbmRleCA9IHBpVGV4dC5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzQ7Ci0JCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIGluZGV4OwotCQkJCQlpbnQgbGVuZ3RoID0gcGlUZXh0LnRyaW0oKS5sZW5ndGgoKSAtIGluZGV4OwotCi0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKFNFVkVSSVRZX05BTUVTUEFDRV9JTl9QSV9UQVJHRVQgLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8oZ2V0TGluZU51bWJlcihzdGFydCkpOwotCi0JCQkJCWlmIChyZXBvcnRlciBpbnN0YW5jZW9mIEluY3JlbWVudGFsUmVwb3J0ZXIpIHsKLQkJCQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLk5hbWVzcGFjZUluUEkpOwotCQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0KLQkJCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSk7Ci0JCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQkJCX0KLQotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUXVvdGVzRm9yQXR0cmlidXRlVmFsdWVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJWYWx1ZVRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgZXJyb3JDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHJlZ2lvbnMuc2l6ZSgpKSAmJiAoZXJyb3JDb3VudCA8IEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LkVMRU1FTlRfRVJST1JfTElNSVQpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWF0dHJWYWx1ZVRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyKTsKLQkJCS8vIGF0dHJpYnV0ZSB2YWx1ZSBpbmNsdWRlcyBxdW90ZXMgaW4gdGhlIHN0cmluZwotCQkJLy8gc3BsaXQgdXAgYXR0cmlidXRlIHZhbHVlIG9uIHF1b3RlcwotCQkJLyoKLQkJCSAqIFdPUktBUk9VTkQgdGlsbAotCQkJICogaHR0cDovL2Rldi5pY3UtcHJvamVjdC5vcmcvY2dpLWJpbi9pY3UtYnVncy9pbmNvbWluZz9maW5kaWQ9NTIwNwotCQkJICogaXMgZml4ZWQuIChBbHNvIHNlZSBCVUcxNDM2MjgpCi0JCQkgKi8KLQotCQkJamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZVRleHQsICJcIiciLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotCQkJLy8gZ2V0IHRoZSBwaWVjZXMgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCQkJU3RyaW5nIG9uZSA9ICIiLCB0d28gPSAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoc2l6ZSA+IDApIHsKLQkJCQlvbmUgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCX0KLQkJCWlmIChzaXplID4gMSkgewotCQkJCXR3byA9IHN0Lm5leHRUb2tlbigpOwotCQkJfQotCQkJaWYgKHNpemUgPiAyKSB7Ci0JCQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgcGFyc2luZy4uLgotCQkJCS8vIGFzIGluIHdlIGNhbid0IGhhdmUgYW4gYXR0cmlidXRlIHZhbHVlIGxpa2U6IDxlbGVtZW50Ci0JCQkJLy8gYXR0cj0iYSJiImMiLz4KLQkJCQkvLyBhbmQgPGVsZW1lbnQgYXR0cj0nYSJiImMnIC8+IGlzIGxlZ2FsCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQotCQkJaWYgKHNpemUgPT0gMSkgewotCQkJCWlmIChvbmUuZXF1YWxzKERRVU9URSkgfHwgb25lLmVxdWFscyhTUVVPVEUpKSB7Ci0JCQkJCS8vIG1pc3NpbmcgY2xvc2luZyBxdW90ZQotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8wOwotCQkJCQlhZGRBdHRyaWJ1dGVFcnJvcihtZXNzYWdlLCBhdHRyVmFsdWVUZXh0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIGF0dHJWYWx1ZVRleHQudHJpbSgpLmxlbmd0aCgpLCBQcm9ibGVtSURzWE1MLlVuY2xhc3NpZmllZCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlciwgU0VWRVJJVFlfTUlTU0lOR19DTE9TSU5HX1FVT1RFKTsKLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbWlzc2luZyBib3RoCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzE7Ci0JCQkJCWFkZEF0dHJpYnV0ZUVycm9yKG1lc3NhZ2UsIGF0dHJWYWx1ZVRleHQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSwgYXR0clZhbHVlVGV4dC50cmltKCkubGVuZ3RoKCksIFByb2JsZW1JRHNYTUwuQXR0clZhbHVlTm90UXVvdGVkLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyLCBTRVZFUklUWV9NSVNTSU5HX1FVT1RFUyk7Ci0JCQkJCWVycm9yQ291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChzaXplID09IDIpIHsKLQkJCQlpZiAoKG9uZS5lcXVhbHMoU1FVT1RFKSAmJiAhdHdvLmVxdWFscyhTUVVPVEUpKSB8fCAob25lLmVxdWFscyhEUVVPVEUpICYmICF0d28uZXF1YWxzKERRVU9URSkpKSB7Ci0JCQkJCS8vIG1pc3NpbmcgY2xvc2luZyBxdW90ZQotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8wOwotCQkJCQlhZGRBdHRyaWJ1dGVFcnJvcihtZXNzYWdlLCBhdHRyVmFsdWVUZXh0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIGF0dHJWYWx1ZVRleHQudHJpbSgpLmxlbmd0aCgpLCBQcm9ibGVtSURzWE1MLlVuY2xhc3NpZmllZCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlciwgU0VWRVJJVFlfTUlTU0lOR19DTE9TSU5HX1FVT1RFKTsKLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBlbmQgb2YgcmVnaW9uIGZvciBsb29wCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RhcnRFbmRUYWdQYWlycyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc2RSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGNoZWNrIHN0YXJ0L2VuZCB0YWcgcGFpcnMKLQkJSURPTU5vZGUgeG1sTm9kZSA9IGdldFhNTE5vZGUoc2RSZWdpb24pOwotCi0JCWlmICh4bWxOb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gc2VsZkNsb3NlZCA9IGZhbHNlOwotCQlTdHJpbmcgdGFnTmFtZSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIEZvciB0YWdzIHRoYXQgYXJlbid0IG1lYW50IHRvIGJlIEVNUFRZLCBtYWtlIHN1cmUgaXQncyBlbXB0eSBvciBoYXMgYW4gZW5kIHRhZwotCQkgKi8KLQkJaWYgKHhtbE5vZGUuaXNDb250YWluZXIoKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSB4bWxOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGVuZFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFJlZ2lvbiA9IHhtbE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRSZWdpb24gIT0gbnVsbCAmJiAhc3RhcnRSZWdpb24uaXNEZWxldGVkKCkgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4uZXF1YWxzKHN0YXJ0UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpKSkgewotCQkJCQkvLyBhbmFseXplIHRoZSB0YWcgKGNoZWNrIHNlbGYgY2xvc2luZykKLQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJCQlpbnQgc3RhcnQgPSBzZFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gc2RSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJCXRhZ05hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkJCXN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocik7Ci0JCQkJCQkJbGVuZ3RoID0gci5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCQlzZWxmQ2xvc2VkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0KLQkJCQkJaWYgKCFzZWxmQ2xvc2VkICYmICh0YWdOYW1lICE9IG51bGwpKSB7Ci0JCQkJCQlPYmplY3RbXSBhcmdzID0ge3RhZ05hbWV9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5NaXNzaW5nX2VuZF90YWdfLCBhcmdzKTsKLQotCQkJCQkJaW50IGxpbmVOdW1iZXIgPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKFNFVkVSSVRZX01JU1NJTkdfRU5EX1RBRyAsIG1lc3NhZ2VUZXh0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTnVtYmVyKTsKLQotCQkJCQkJaWYgKHJlcG9ydGVyIGluc3RhbmNlb2YgSW5jcmVtZW50YWxSZXBvcnRlcikgewotCQkJCQkJCU9iamVjdFtdIGFkZGl0aW9uYWxGaXhJbmZvID0gZ2V0U3RhcnRFbmRGaXhJbmZvKHhtbE5vZGUsIHRhZ05hbWUsIHIpOwotCi0JCQkJCQkJTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcpOwotCQkJCQkJCXByb2Nlc3Nvci5zZXRBZGRpdGlvbmFsRml4SW5mbyhhZGRpdGlvbmFsRml4SW5mbyk7Ci0JCQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0KLQkJCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCi0JCQkJCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKSByZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFJlZ2lvbiA9IHhtbE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRSZWdpb24gPT0gbnVsbCB8fCBzdGFydFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJCQkvLyBhbmFseXplIHRoZSB0YWcgKGNoZWNrIHNlbGYgY2xvc2luZykKLQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBlbmRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJCQkJaW50IHN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaW50IGxlbmd0aCA9IHNkUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJCQl0YWdOYW1lID0gc2RSZWdpb24uZ2V0VGV4dChyKTsKLQkJCQkJCQlzdGFydCA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpOwotCQkJCQkJCWxlbmd0aCA9IHIuZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0W10gYXJncyA9IHt0YWdOYW1lfTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuTWlzc2luZ19zdGFydF90YWdfLCBhcmdzKTsKLQotCQkJCQkJaW50IGxpbmVOdW1iZXIgPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQotCQkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKFNFVkVSSVRZX01JU1NJTkdfU1RBUlRfVEFHLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU51bWJlcik7Ci0KLQkJCQkJCWlmIChyZXBvcnRlciBpbnN0YW5jZW9mIEluY3JlbWVudGFsUmVwb3J0ZXIpIHsKLQkJCQkJCQlPYmplY3RbXSBhZGRpdGlvbmFsRml4SW5mbyA9IGdldFN0YXJ0RW5kRml4SW5mbyh4bWxOb2RlLCB0YWdOYW1lLCByKTsKLQotCQkJCQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCQkJCXByb2Nlc3Nvci5zZXRQcm9ibGVtSWQoUHJvYmxlbUlEc1hNTC5NaXNzaW5nU3RhcnRUYWcpOwotCQkJCQkJCXByb2Nlc3Nvci5zZXRBZGRpdGlvbmFsRml4SW5mbyhhZGRpdGlvbmFsRml4SW5mbyk7Ci0JCQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0KLQkJCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCi0JCQkJCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKSByZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJLyoKLQkJICogQ2hlY2sgZm9yIGFuIGVuZCB0YWcgdGhhdCBoYXMgbm8gc3RhcnQgdGFnCi0JCSAqLwotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRSZWdpb24gPSB4bWxOb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRSZWdpb24gPT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0geG1sTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoIWVuZFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJCQkvLyBnZXQgbmFtZQotCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGVuZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJCXRhZ05hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKCFzZWxmQ2xvc2VkICYmICh0YWdOYW1lICE9IG51bGwpKSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBTdHJpbmdVdGlscy51bnBhY2soWE1MVUlNZXNzYWdlcy5JbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZF9zZXZlcml0aWVzKVswXTsKLQotCQkJCQkJaW50IHN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJCWludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0KLQkJCQkJCS8vIFNFVkVSSVRZX1NUUlVDVFVSRSA9PSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZCi0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgoc2RSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVOdW1iZXIpOwotCi0JCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRTdGFydEVuZEZpeEluZm8oSURPTU5vZGUgeG1sTm9kZSwgU3RyaW5nIHRhZ05hbWUsIElUZXh0UmVnaW9uIHIpIHsKLQkJLy8gcXVpY2sgZml4IGluZm8KLQkJU3RyaW5nIHRhZ0Nsb3NlID0gIi8+IjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgdGFnQ2xvc2VPZmZzZXQgPSB4bWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmICgociAhPSBudWxsKSAmJiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJdGFnQ2xvc2UgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCXRhZ0Nsb3NlT2Zmc2V0LS07Ci0JCX0KLQkJSURPTU5vZGUgZmlyc3RDaGlsZCA9IChJRE9NTm9kZSkgeG1sTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlICgoZmlyc3RDaGlsZCAhPSBudWxsKSAmJiAoZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSkgewotCQkJZmlyc3RDaGlsZCA9IChJRE9NTm9kZSkgZmlyc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCWludCBlbmRPZmZzZXQgPSB4bWxOb2RlLmdldEVuZE9mZnNldCgpOwotCQlpbnQgZmlyc3RDaGlsZFN0YXJ0T2Zmc2V0ID0gZmlyc3RDaGlsZCA9PSBudWxsID8gZW5kT2Zmc2V0IDogZmlyc3RDaGlsZC5nZXRTdGFydE9mZnNldCgpOwotCQlPYmplY3RbXSBhZGRpdGlvbmFsRml4SW5mbyA9IHt0YWdOYW1lLCB0YWdDbG9zZSwgbmV3IEludGVnZXIodGFnQ2xvc2VPZmZzZXQpLCBuZXcgSW50ZWdlcih4bWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCkpLCAvLyBzdGFydFRhZ0VuZE9mZnNldAotCQkJCQluZXcgSW50ZWdlcihmaXJzdENoaWxkU3RhcnRPZmZzZXQpLCAvLyBmaXJzdENoaWxkU3RhcnRPZmZzZXQKLQkJCQkJbmV3IEludGVnZXIoZW5kT2Zmc2V0KX07IC8vIGVuZE9mZnNldAotCQlyZXR1cm4gYWRkaXRpb25hbEZpeEluZm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RhcnRpbmdTcGFjZUZvclBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXYgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJaWYgKChwcmV2ICE9IG51bGwpICYmIHByZXYuZ2V0U3RhcnRPZmZzZXQoKSA9PSAwKSB7Ci0JCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF81OwotCQkJCWludCBzdGFydCA9IHByZXYuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGVuZ3RoID0gcHJldi5nZXRMZW5ndGgoKTsKLQotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKFNFVkVSSVRZX1dISVRFU1BBQ0VfQVRfU1RBUlQgLCBtZXNzYWdlVGV4dCk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8oZ2V0TGluZU51bWJlcihzdGFydCkpOwotCi0JCQkJaWYgKHJlcG9ydGVyIGluc3RhbmNlb2YgSW5jcmVtZW50YWxSZXBvcnRlcikgewotCQkJCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJKTsKLQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0JCi0JCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSk7Ci0JCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJLy8gUG9zaXRpb24gcCA9IG5ldyBQb3NpdGlvbihzdGFydCwgbGVuZ3RoKTsKLQkJCQkvLwkJCQkKLQkJCQkvLyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9Ci0JCQkJLy8gY3JlYXRlS2V5KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0U2NvcGUoKSk7Ci0JCQkJLy8gVGVtcG9yYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IFRlbXBvcmFyeUFubm90YXRpb24ocCwKLQkJCQkvLyBTRVZFUklUWV9TWU5UQVhfRVJST1IsIG1lc3NhZ2UsIGtleSwKLQkJCQkvLyBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJKTsKLQkJCQkvLyByZXN1bHRzLmFkZChhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUw7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBnZXRYTUxOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQotCQlpZiAoc2RSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIHhNb2RlbCA9IG51bGw7Ci0JCUlET01Ob2RlIHhtbE5vZGUgPSBudWxsOwotCQkvLyBnZXQvcmVsZWFzZSBtb2RlbHMgc2hvdWxkIGFsd2F5cyBiZSBpbiBhIHRyeS9maW5hbGx5IGJsb2NrCi0JCXRyeSB7Ci0JCQl4TW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJLy8geE1vZGVsIGlzIHNvbWV0aW1lIG51bGwsIHdoZW4gY2xvc2luZyBlZGl0b3IsIGZvciBleGFtcGxlCi0JCQlpZiAoeE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxOb2RlID0gKElET01Ob2RlKSB4TW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4TW9kZWwgIT0gbnVsbCkgewotCQkJCXhNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geG1sTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYSBYTUwgImVuZCB0YWciCi0JICogc2luY2UgdGhleSdyZSBub3QgYWxsb3dlZCB0byBoYXZlIGF0dHJpYnV0ZSBJVGV4dFJlZ2lvbnMKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmICgoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHx8IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYW4gWE1MIFByb2Nlc3NpbmcKLQkgKiBJbnN0cnVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU47Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGEgWE1MICJzdGFydCB0YWciCi0JICogc2luY2UgdGhleSBuZWVkIHRvIGJlIGNoZWNrZWQgZm9yIHByb3BlciBYTUwgYXR0cmlidXRlIHJlZ2lvbiBzZXF1ZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU3RhcnRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTjsKLQl9Ci0KLQkvLyBCZWNhdXNlIHdlIGNoZWNrIHRoZSAicHJvcGVyIiBjbG9zaW5nIHNlcGFyYXRlbHkgZnJvbSBhdHRyaWJ1dGUKLQkvLyBzZXF1ZW5jaW5nLCB3ZSBuZWVkIHRvIGtub3cgd2hhdCdzCi0JLy8gYW4gYXBwcm9wcmlhdGUgY2xvc2UuCi0JcHJpdmF0ZSBib29sZWFuIGlzVGFnQ2xvc2VUZXh0UmVnaW9uKElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgWE1MIENvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MQ29udGVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJZkRvY3VtZW50ID0gZG9jOwotCX0KLQotCXByaXZhdGUgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldERvY3VtZW50KGRvY3VtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXREb2N1bWVudChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUmVnaW9uIGRpcnR5UmVnaW9uLCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKHJlcG9ydGVyIGluc3RhbmNlb2YgSW5jcmVtZW50YWxSZXBvcnRlcikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShnZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHJlbW92ZSBvbGQgbWVzc2FnZXMKLQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHJlZ2lvbnMgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSwgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXZhbGlkYXRlKHJlZ2lvbnNbaV0sIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChpc1N0YXJ0VGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCS8vIGNoZWNrIGZvciBhdHRyaWJ1dGVzIHdpdGhvdXQgYSB2YWx1ZQotCQkJY2hlY2tGb3JBdHRyaWJ1dGVWYWx1ZShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCS8vIGNoZWNrIGlmIHN0YXJ0ZWQgdGFnIGlzIGVuZGVkCi0JCQljaGVja1N0YXJ0RW5kVGFnUGFpcnMoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayBlbXB0eSB0YWcgPD4KLQkJCWNoZWNrRW1wdHlUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayB0aGF0IGVhY2ggYXR0cmlidXRlIGhhcyBxdW90ZXMKLQkJCWNoZWNrUXVvdGVzRm9yQXR0cmlidXRlVmFsdWVzKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgdGhhdCB0aGUgY2xvc2luZyAnPicgaXMgdGhlcmUKLQkJCWNoZWNrQ2xvc2luZ0JyYWNrZXQoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXNFbmRUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJLy8gY2hlY2sgaWYgZW5kaW5nIHRhZyB3YXMgc3RhcnRlZAotCQkJY2hlY2tTdGFydEVuZFRhZ1BhaXJzKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgZm9yIGF0dHJpYnV0ZXMgaW4gYW4gZW5kIHRhZwotCQkJY2hlY2tBdHRyaWJ1dGVzSW5FbmRUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayB0aGF0IHRoZSBjbG9zaW5nICc+JyBpcyB0aGVyZQotCQkJY2hlY2tDbG9zaW5nQnJhY2tldChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJfQotCQllbHNlIGlmIChpc1BJKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCS8vIGNoZWNrIHZhbGlkaXR5IG9mIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLQkJCWNoZWNrU3RhcnRpbmdTcGFjZUZvclBJKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJY2hlY2tOb05hbWVzcGFjZUluUEkoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXNYTUxDb250ZW50KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCWNoZWNrRm9yU3BhY2VCZWZvcmVOYW1lKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGlzWE1MRG9jdHlwZURlY2xhcmF0aW9uKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCWNoZWNrRG9jdW1lbnRUeXBlUmVmZXJlbmNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gcmVwb3J0ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tEb2N1bWVudFR5cGVSZWZlcmVuY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1hNTERvY3R5cGVEZWNsYXJhdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4gJiYgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gdXJpcyA9IGhlbHBlci5nZXRVUklzKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHdzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWlmICh1cmlzLmxlbmd0aCA+IDApIHsKLQkJCUlGaWxlIGN1cnJlbnRGaWxlID0gbnVsbDsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJLy8gbWlnaHQgYmUgY2FsbGVkIHdpdGgganVzdCBwcm9qZWN0IHBhdGg/Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVyaXNbaV0pOwotCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQljdXJyZW50RmlsZSA9IHdzUm9vdC5nZXRGaWxlKHBhdGgpOwotCQkJCQlpZiAoc2hvdWxkVmFsaWRhdGUoY3VycmVudEZpbGUsIHRydWUpKSB7Ci0JCQkJCQl2YWxpZGF0ZVYxRmlsZShjdXJyZW50RmlsZSwgcmVwb3J0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHVyaXMubGVuZ3RoID09IDEpIHsKLQkJCQkJdmFsaWRhdGVWMVByb2plY3QoaGVscGVyLCByZXBvcnRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkYXRlVjFQcm9qZWN0KGhlbHBlciwgcmVwb3J0ZXIpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSVJlc291cmNlUHJveHkgcHJveHkpIHsKLQkJaWYocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb3h5LmdldE5hbWUoKTsKLQkJCWlmKG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lbmRzV2l0aCgiLnhtbCIpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3VsZFZhbGlkYXRlKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJUmVzb3VyY2UgZmlsZSwgYm9vbGVhbiBjaGVja0V4dGVuc2lvbikgewotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpIHx8IGZpbGUuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY2hlY2tFeHRlbnNpb24pIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAieG1sIi5lbmRzV2l0aChleHRlbnNpb24udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50RGVzY3JpcHRpb24gPSAoKElGaWxlKSBmaWxlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCXJldHVybiBjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCAmJiBjb250ZW50VHlwZS5pc0tpbmRPZihnZXRYTUxDb250ZW50VHlwZSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVjFQcm9qZWN0KElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIGZpbmFsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBpZiB1cmlzW10gbGVuZ3RoIDAgLT4gdmFsaWRhdGUoKSBnZXRzIGNhbGxlZCBmb3IgZWFjaCBwcm9qZWN0Ci0JCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQkJSVJlc291cmNlUHJveHlWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChzaG91bGRWYWxpZGF0ZShwcm94eSkpIHsKLQkJCQkJCXZhbGlkYXRlVjFGaWxlKChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCksIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9OwotCQkJdHJ5IHsKLQkJCQkvLyBjb2xsZWN0IGFsbCBqc3AgZmlsZXMgZm9yIHRoZSBwcm9qZWN0Ci0JCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogQHBhcmFtIGN1cnJlbnRGaWxlCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVjFGaWxlKElGaWxlIGN1cnJlbnRGaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBjdXJyZW50RmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsKLQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soTWFya3VwVmFsaWRhdG9yLnRoaXMsIG1lc3NhZ2UpOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChjdXJyZW50RmlsZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJZG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQljb25uZWN0KGRvY3VtZW50KTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHZhbGlkYXRpb25SZWdpb24gPSBkb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCXdoaWxlICh2YWxpZGF0aW9uUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdmFsaWRhdGUodmFsaWRhdGlvblJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJCQl2YWxpZGF0aW9uUmVnaW9uID0gdmFsaWRhdGlvblJlZ2lvbi5nZXROZXh0KCk7Ci0JCQkJfQotCQkJCWRpc2Nvbm5lY3QoZG9jdW1lbnQpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0WE1MQ29udGVudFR5cGUoKSB7Ci0JCWlmIChmUm9vdENvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZSb290Q29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZSgib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIpOwotCQl9Ci0JCXJldHVybiBmUm9vdENvbnRlbnRUeXBlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSwgaW50LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGUsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlJUmVwb3J0ZXIgcmVwb3J0ZXIgPSByZXN1bHQuZ2V0UmVwb3J0ZXIobW9uaXRvcik7Ci0JCXZhbGlkYXRlVjFGaWxlKChJRmlsZSkgcmVzb3VyY2UsIHJlcG9ydGVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvQWJzdHJhY3RYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9BYnN0cmFjdFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTM2Mjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9BYnN0cmFjdFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG5kLkRyYWdOb2RlQ29tbWFuZDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEJhc2ljIE91dGxpbmUgQ29uZmlndXJhdGlvbiBmb3IgZ2VuZXJpYyBYTUwgc3VwcG9ydC4gIEV4cGVjdHMgdGhhdCB0aGUgdmlld2VyJ3MKLSAqIGlucHV0IHdpbGwgYmUgdGhlIERPTSBNb2RlbCwgYW5kIHByb3ZpZGVzIGJhc2ljIGxhYmVsIGFuZCBjb250ZW50IHByb3ZpZGVycy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgY2xhc3MgQWN0aW9uTWFuYWdlck1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIsIElSZWxlYXNhYmxlIHsKLQkJcHJpdmF0ZSBYTUxOb2RlQWN0aW9uTWFuYWdlciBmQWN0aW9uTWFuYWdlcjsKLQkJcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCi0JCXB1YmxpYyBBY3Rpb25NYW5hZ2VyTWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCQlmVHJlZVZpZXdlciA9IHZpZXdlcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCWlmIChmQWN0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0JCQkJZkFjdGlvbk1hbmFnZXIgPSBjcmVhdGVOb2RlQWN0aW9uTWFuYWdlcihmVHJlZVZpZXdlcik7Ci0JCQl9Ci0JCQlpZiAoZkFjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJCWZBY3Rpb25NYW5hZ2VyLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyLCBmVHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGUjcmVsZWFzZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkJZlRyZWVWaWV3ZXIgPSBudWxsOwotCQkJaWYgKGZBY3Rpb25NYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlmQWN0aW9uTWFuYWdlci5zZXRNb2RlbChudWxsKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0dXNMaW5lTGFiZWxQcm92aWRlciBleHRlbmRzIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgewotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBudWxsOwotCi0JCXB1YmxpYyBTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQkJdHJlZVZpZXdlciA9IHZpZXdlcjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJTm9kZSBub2RlID0gKE5vZGUpIGVsZW1lbnQ7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJcy5pbnNlcnQoMCwgc3VwZXIuZ2V0VGV4dChub2RlKSk7Ci0JCQkJfQotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJcy5pbnNlcnQoMCwgSVBhdGguU0VQQVJBVE9SKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcy50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBBY3Rpb25NYW5hZ2VyTWVudUxpc3RlbmVyIGZDb250ZXh0TWVudUZpbGxlciA9IG51bGw7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCWJvb2xlYW4gZlNob3dBdHRyaWJ1dGVzID0gZmFsc2U7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZTaW1wbGVMYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBOb2RlQWN0aW9uTWFuYWdlciB0byB1c2UgZm9yIHRoZSBnaXZlbiB0cmVlVmlld2VyLgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0cmVlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIG5vZGUgYWN0aW9uIG1hbmFnZXIgZm9yIHVzZSB3aXRoIHRoaXMgdHJlZSB2aWV3ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MTm9kZUFjdGlvbk1hbmFnZXIgY3JlYXRlTm9kZUFjdGlvbk1hbmFnZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgWE1MTm9kZUFjdGlvbk1hbmFnZXIoKElTdHJ1Y3R1cmVkTW9kZWwpIHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSwgdHJlZVZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRDb250ZW50UHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkNvbnRlbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmQ29udGVudFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmQ29udGVudFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0TGFiZWxQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRNZW51TGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJTWVudUxpc3RlbmVyIGdldE1lbnVMaXN0ZW5lcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkNvbnRleHRNZW51RmlsbGVyID09IG51bGwpIHsKLQkJCWZDb250ZXh0TWVudUZpbGxlciA9IG5ldyBBY3Rpb25NYW5hZ2VyTWVudUxpc3RlbmVyKHZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0TWVudUZpbGxlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKGZTaW1wbGVMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZTaW1wbGVMYWJlbFByb3ZpZGVyID0gbmV3IFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKHRyZWVWaWV3ZXIpOwotCQl9Ci0JCXJldHVybiBmU2ltcGxlTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKGZpbmFsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlpZiAoZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzID0gbmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW117bmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuc2V0U2VsZWN0aW9uKG51bGwpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLnNldFNlbGVjdGlvbih0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0JCQkJCXJldHVybiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCk7Ci0JCQkJfQotCQkJfX07Ci0JCX0KLQotCQlyZXR1cm4gZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzKGZpbmFsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlpZiAoZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzID0gbmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW117bmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLQkJCQkJZmxvYXQgZmVlZGJhY2tGbG9hdCA9IGdldEhlaWdodEluSXRlbShldmVudCk7Ci0JCQkJCWlmIChmZWVkYmFja0Zsb2F0ID4gMC43NSkgewotCQkJCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGZlZWRiYWNrRmxvYXQgPCAwLjI1KSB7Ci0JCQkJCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotCQkJCQl9Ci0JCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19FWFBBTkQgfCBETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC5vcGVyYXRpb25zICE9IERORC5EUk9QX05PTkUgJiYgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpICE9IG51bGwgJiYgIUxvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIGV2ZW50Lml0ZW0gIT0gbnVsbCAmJiBldmVudC5pdGVtLmdldERhdGEoKSAhPSBudWxsKSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiB0aGUgY29tbWFuZCB1c2VzIHRoZXNlIG51bWJlcnMgaW5zdGVhZCBvZiB0aGUKLQkJCQkJCQkgKiBmZWVkYmFjayBjb25zdGFudHMgKGV2ZW4gdGhvdWdoIGl0IGNvbnZlcnRzIGluCi0JCQkJCQkJICogdGhlIG90aGVyIGRpcmVjdGlvbiBhcyB3ZWxsKQotCQkJCQkJCSAqLwotCQkJCQkJCWZsb2F0IGZlZWRiYWNrRmxvYXQgPSBnZXRIZWlnaHRJbkl0ZW0oZXZlbnQpOwotCi0JCQkJCQkJZmluYWwgRHJhZ05vZGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgRHJhZ05vZGVDb21tYW5kKGV2ZW50Lml0ZW0uZ2V0RGF0YSgpLCBmZWVkYmFja0Zsb2F0LCBldmVudC5vcGVyYXRpb25zLCBldmVudC5kZXRhaWwsIHNlbGVjdGlvbi50b0xpc3QoKSwgdHJlZVZpZXdlcik7Ci0JCQkJCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBjb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCQlTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0KLQkJCQlwcml2YXRlIGZsb2F0IGdldEhlaWdodEluSXRlbShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGV2ZW50Lml0ZW0gPT0gbnVsbCkKLQkJCQkJCXJldHVybiAuNWY7Ci0JCQkJCWlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCQkJQ29udHJvbCBjb250cm9sID0gdHJlZUl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCQlQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJCQlyZXR1cm4gKGZsb2F0KSAocG9pbnQueSAtIGJvdW5kcy55KSAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQkJCUNvbnRyb2wgY29udHJvbCA9IHRhYmxlSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQkJCVBvaW50IHBvaW50ID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCQkJCQkJcmV0dXJuIChmbG9hdCkgKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gMC4wRjsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXB1YmxpYyBUcmFuc2ZlciBnZXRUcmFuc2ZlcigpIHsKLQkJCQkJcmV0dXJuIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJldHVybiBnZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpOwotCQkJCX0KLQkJCX19OwotCQl9Ci0JCXJldHVybiBmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jdW5jb25maWd1cmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKHZpZXdlcik7Ci0JCWZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPSBudWxsOwotCQlmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzID0gbnVsbDsKLQkJaWYgKGZDb250ZXh0TWVudUZpbGxlciAhPSBudWxsKSB7Ci0JCQlmQ29udGV4dE1lbnVGaWxsZXIucmVsZWFzZSgpOwotCQkJZkNvbnRleHRNZW51RmlsbGVyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzZjE1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogTW9yZSBhZHZhbmNlZCBPdXRsaW5lIENvbmZpZ3VyYXRpb24gZm9yIFhNTCBzdXBwb3J0LiAgRXhwZWN0cyB0aGF0IHRoZSB2aWV3ZXIncwotICogaW5wdXQgd2lsbCBiZSB0aGUgRE9NIE1vZGVsLgotICogCi0gKiBAc2VlIEFic3RyYWN0WE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsKLQotCXByaXZhdGUgY2xhc3MgQXR0cmlidXRlU2hvd2luZ0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgbykgewotCQkJU3RyaW5nQnVmZmVyIHRleHQgPSBudWxsOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIG87Ci0JCQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpICYmIGZTaG93QXR0cmlidXRlcykgewotCQkJCQl0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5nZXRUZXh0KG8pKTsKLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NDQ0Ci0JCQkJCWlmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkgewotCQkJCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJTm9kZSBpZFR5cGVkQXR0cmlidXRlID0gbnVsbDsKLQkJCQkJCU5vZGUgcmVxdWlyZWRBdHRyaWJ1dGUgPSBudWxsOwotCQkJCQkJYm9vbGVhbiBoYXNJZCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiBoYXNOYW1lID0gZmFsc2U7Ci0JCQkJCQlOb2RlIHNob3duQXR0cmlidXRlID0gbnVsbDsKLQotCQkJCQkJLy8gdHJ5IHRvIGdldCBjb250ZW50IG1vZGVsIGVsZW1lbnQKLQkJCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG51bGw7Ci0JCQkJCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJCQlpZiAobXEgIT0gbnVsbCkgewotCQkJCQkJCWVsZW1lbnREZWNsID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBmaW5kIGFuIGF0dHJpYnV0ZSBvZiB0eXBlIChvciBqdXN0IG5hbWVkKQotCQkJCQkJLy8gSUQKLQkJCQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJCQkJaW50IGkgPSAwOwotCQkJCQkJCXdoaWxlICgoaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkpICYmIChpZFR5cGVkQXR0cmlidXRlID09IG51bGwpKSB7Ci0JCQkJCQkJCU5vZGUgYXR0ciA9IGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOwotCQkJCQkJCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVEZWNsYXJhdGlvbk1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCQkJCi0JCQkJCQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyaWJ1dGVEZWNsYXJhdGlvbk1hcCk7Ci0JCQkJCQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYXR0cmlidXRlRGVjbGFyYXRpb25NYXAgPSBhbGxBdHRyaWJ1dGVzOwotCi0JCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlRGVjbGFyYXRpb25NYXAuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJCQkJCQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICgoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSAmJiAoQ01EYXRhVHlwZS5JRC5lcXVhbHMoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSkpKSB7Ci0JCQkJCQkJCQkJaWRUeXBlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmICgoYXR0ckRlY2wuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSAmJiAocmVxdWlyZWRBdHRyaWJ1dGUgPT0gbnVsbCkpIHsKLQkJCQkJCQkJCQkvLyBhcyBhIGJhY2t1cCwga2VlcCB0YWJzIG9uCi0JCQkJCQkJCQkJLy8gYW55IHJlcXVpcmVkCi0JCQkJCQkJCQkJLy8gYXR0cmlidXRlcwotCQkJCQkJCQkJCXJlcXVpcmVkQXR0cmlidXRlID0gYXR0cjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCWhhc0lkID0gaGFzSWQgfHwgYXR0ck5hbWUuZXF1YWxzKEFUVFJfSUQpOwotCQkJCQkJCQkJCWhhc05hbWUgPSBoYXNOYW1lIHx8IGF0dHJOYW1lLmVxdWFscyhBVFRSX05BTUUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCSsraTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBJZiBubyBzdWl0YWJsZSBhdHRyaWJ1dGUgd2FzIGZvdW5kLCB0cnkgdXNpbmcgYQotCQkJCQkJICogcmVxdWlyZWQgYXR0cmlidXRlLCBpZiBub25lLCB0aGVuIHByZWZlciAiaWQiIG9yCi0JCQkJCQkgKiAibmFtZSIsIG90aGVyd2lzZSBqdXN0IHVzZSBmaXJzdCBhdHRyaWJ1dGUKLQkJCQkJCSAqLwotCQkJCQkJaWYgKGlkVHlwZWRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQkJCXNob3duQXR0cmlidXRlID0gaWRUeXBlZEF0dHJpYnV0ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHJlcXVpcmVkQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQkJCQlzaG93bkF0dHJpYnV0ZSA9IHJlcXVpcmVkQXR0cmlidXRlOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoaGFzSWQpIHsKLQkJCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKEFUVFJfSUQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoaGFzTmFtZSkgewotCQkJCQkJCXNob3duQXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oQVRUUl9OQU1FKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChzaG93bkF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLml0ZW0oMCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGRpc3BsYXkgdGhlIGF0dHJpYnV0ZSBhbmQgdmFsdWUgKHdpdGhvdXQgcXVvdGVzKQotCQkJCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBzaG93bkF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpOwotCQkJCQkJaWYgKChhdHRyaWJ1dGVOYW1lICE9IG51bGwpICYmIChhdHRyaWJ1dGVOYW1lLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCQl0ZXh0LmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJdGV4dC5hcHBlbmQoYXR0cmlidXRlTmFtZSk7Ci0JCQkJCQkJU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gc2hvd25BdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJaWYgKChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsKSAmJiAoYXR0cmlidXRlVmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJCQl0ZXh0LmFwcGVuZCgiPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXRleHQuYXBwZW5kKFN0cmluZ1V0aWxzLnN0cmlwKGF0dHJpYnV0ZVZhbHVlKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5nZXRUZXh0KG8pKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsTGFiZWxQcm92aWRlciNnZXRUb29sVGlwVGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJc3dpdGNoICgoKE5vZGUpIGVsZW1lbnQpLmdldE5vZGVUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0JCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJCVN0cmluZyBub2RlVmFsdWUgPSAoKE5vZGUpIGVsZW1lbnQpLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLQkJCQkJCXJldHVybiBwcmVwYXJlVGV4dChub2RlVmFsdWUpOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJCQkvLyBzaG93IHRoZSBwcmVjZWRpbmcgY29tbWVudCdzIHRvb2x0aXAgaW5mb3JtYXRpb24KLQkJCQkJCU5vZGUgcHJldmlvdXMgPSAoKE5vZGUpIGVsZW1lbnQpLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQkJaWYgKHByZXZpb3VzICE9IG51bGwgJiYgcHJldmlvdXMuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlwcmV2aW91cyA9IHByZXZpb3VzLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQkJaWYgKHByZXZpb3VzICE9IG51bGwgJiYgcHJldmlvdXMuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkKLQkJCQkJCQlyZXR1cm4gZ2V0VG9vbFRpcFRleHQocHJldmlvdXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldFRvb2xUaXBUZXh0KGVsZW1lbnQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSBsZWFkaW5nIGluZGVudGF0aW9uIGZyb20gZWFjaCBsaW5lIGluIHRoZSBnaXZlIHN0cmluZy4KLQkJICogQHBhcmFtIHRleHQKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgcHJlcGFyZVRleHQoU3RyaW5nIHRleHQpIHsKLQkJCVN0cmluZ0J1ZmZlciBub2RlVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJY2hhciBjID0gdGV4dC5jaGFyQXQoaSk7Ci0JCQkJaWYgKGMgIT0gJ1xyJyAmJiBjICE9ICdcbicpIHsKLQkJCQkJbm9kZVRleHQuYXBwZW5kKGMpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSB7Ci0JCQkJCW5vZGVUZXh0LmFwcGVuZCgnXG4nKTsKLQkJCQkJd2hpbGUgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykgJiYgaSA8IHRleHQubGVuZ3RoKCkpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWMgPSB0ZXh0LmNoYXJBdChpKTsKLQkJCQkJfQotCQkJCQlub2RlVGV4dC5hcHBlbmQoYyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5vZGVUZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGUgYWN0aW9uIGZvciB3aGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IGVsZW1lbnQncyBmaXJzdCBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRvZ2dsZVNob3dBdHRyaWJ1dGVBY3Rpb24gZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiB7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODQ0NAotCQlwcml2YXRlIFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0KLQkJcHVibGljIFRvZ2dsZVNob3dBdHRyaWJ1dGVBY3Rpb24oSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2UsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQkJc3VwZXIoWE1MVUlNZXNzYWdlcy5YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMCwgc3RvcmUsIHByZWZlcmVuY2UsIHRydWUpOwotCQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJCS8vIGltYWdlcyBuZWVkZWQKLQkJCS8vIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFNZTkNFRF9EKTsKLQkJCS8vIChuc2QpIHRlbXBvcmFyaWx5IHJlLXVzZSBQcm9wZXJ0aWVzIHZpZXcgaW1hZ2UKLQkJCXNldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QUk9QX1BTKSk7Ci0JCQlmVHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlI3VwZGF0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlzdXBlci51cGRhdGUoKTsKLQkJCWZTaG93QXR0cmlidXRlcyA9IGlzQ2hlY2tlZCgpOwotCi0JCQkvLyBub3RpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNoYW5nZQotCQkJZW5hYmxlU2hvd0F0dHJpYnV0ZXMoZlNob3dBdHRyaWJ1dGVzLCBmVHJlZVZpZXdlcik7Ci0KLQkJCS8vIHJlZnJlc2ggdGhlIG91dGxpbmUgdmlldwotCQkJZlRyZWVWaWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZBdHRyaWJ1dGVTaG93aW5nTGFiZWxQcm92aWRlcjsKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0KLQlib29sZWFuIGZTaG93QXR0cmlidXRlcyA9IGZhbHNlOwotCi0JLyoKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3IgU2hvdyBBdHRyaWJ1dGVzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9TSE9XX0FUVFJJQlVURV9QUkVGID0gIm91dGxpbmUtc2hvdy1hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFNldCB1cCBvdXIgcHJlZmVyZW5jZSBzdG9yZSBoZXJlLiBUaGlzIGlzIGRvbmUgc28gdGhhdCBzdWJjbGFzc2VzCi0JCSAqIGFyZW4ndCByZXF1aXJlZCB0byBzZXQgdGhlaXIgb3duIHZhbHVlcywgYWx0aG91Z2ggaWYgdGhleSBoYXZlLAotCQkgKiB0aG9zZSB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KLQkJICovCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKHN0b3JlLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5ET0NVTUVOVF9OT0RFKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkRPQ1VNRU5UX05PREUsICIxLCB0cnVlIik7Ci0JCWlmIChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSwgIjIsIHRydWUiKTsKLQkJaWYgKHN0b3JlLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5ET0NVTUVOVF9UWVBFX05PREUpLmxlbmd0aCgpID09IDApCi0JCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuRE9DVU1FTlRfVFlQRV9OT0RFLCAiMywgdHJ1ZSIpOwotCQlpZiAoc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpLmxlbmd0aCgpID09IDApCi0JCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSwgIjQsIHRydWUiKTsKLQkJaWYgKHN0b3JlLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5DT01NRU5UX05PREUpLmxlbmd0aCgpID09IDApCi0JCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuQ09NTUVOVF9OT0RFLCAiNSwgdHJ1ZSIpOwotCQlpZiAoc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkFUVFJJQlVURV9OT0RFKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkFUVFJJQlVURV9OT0RFLCAiNiwgZmFsc2UiKTsKLQkJaWYgKHN0b3JlLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5FTEVNRU5UX05PREUpLmxlbmd0aCgpID09IDApCi0JCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuRUxFTUVOVF9OT0RFLCAiNywgdHJ1ZSIpOwotCQlpZiAoc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkubGVuZ3RoKCkgPT0gMCkKLQkJCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5FTlRJVFlfUkVGRVJFTkNFX05PREUsICI4LCB0cnVlIik7Ci0JCWlmIChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuQ0RBVEFfU0VDVElPTl9OT0RFKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5PVVRMSU5FX0JFSEFWSU9SLkNEQVRBX1NFQ1RJT05fTk9ERSwgIjksIHRydWUiKTsKLQkJaWYgKHN0b3JlLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5FTlRJVFlfTk9ERSkubGVuZ3RoKCkgPT0gMCkKLQkJCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5FTlRJVFlfTk9ERSwgIjEwLCB0cnVlIik7Ci0JCWlmIChzdG9yZS5nZXREZWZhdWx0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuTk9UQVRJT05fTk9ERSkubGVuZ3RoKCkgPT0gMCkKLQkJCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5OT1RBVElPTl9OT0RFLCAiMTEsIHRydWUiKTsKLQkJaWYgKHN0b3JlLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuT1VUTElORV9CRUhBVklPUi5URVhUX05PREUpLmxlbmd0aCgpID09IDApCi0JCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLk9VVExJTkVfQkVIQVZJT1IuVEVYVF9OT0RFLCAiMTIsIGZhbHNlIik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNjcmVhdGVNZW51Q29udHJpYnV0aW9ucyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtW10gY3JlYXRlTWVudUNvbnRyaWJ1dGlvbnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtczsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NDQ0Ci0JCUlDb250cmlidXRpb25JdGVtIHNob3dBdHRyaWJ1dGVJdGVtID0gbmV3IFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShuZXcgVG9nZ2xlU2hvd0F0dHJpYnV0ZUFjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKSwgT1VUTElORV9TSE9XX0FUVFJJQlVURV9QUkVGLCB2aWV3ZXIpKTsKLQotCQlpdGVtcyA9IHN1cGVyLmNyZWF0ZU1lbnVDb250cmlidXRpb25zKHZpZXdlcik7Ci0JCWlmIChpdGVtcyA9PSBudWxsKSB7Ci0JCQlpdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVtde3Nob3dBdHRyaWJ1dGVJdGVtfTsKLQkJfQotCQllbHNlIHsKLQkJCUlDb250cmlidXRpb25JdGVtW10gY29tYmluZWRJdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVtpdGVtcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaXRlbXMsIDAsIGNvbWJpbmVkSXRlbXMsIDAsIGl0ZW1zLmxlbmd0aCk7Ci0JCQljb21iaW5lZEl0ZW1zW2l0ZW1zLmxlbmd0aF0gPSBzaG93QXR0cmlidXRlSXRlbTsKLQkJCWl0ZW1zID0gY29tYmluZWRJdGVtczsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBjb25maWd1cmF0aW9uIHRoYXQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QKLQkgKiB0byBzaG93IGF0dHJpYnV0ZSB2YWx1ZXMgaW4gdGhlIHRyZWUgdmlld2VyIGhhcyBjaGFuZ2VkLiBUaGUgdHJlZQotCSAqIHZpZXdlciBpcyBhdXRvbWF0aWNhbGx5IHJlZnJlc2hlZCBhZnRlcndhcmRzIHRvIHVwZGF0ZSB0aGUgbGFiZWxzLgotCSAqIAotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLCBidXQgcmF0aGVyIHNob3VsZCByZWFjdCB0byBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hvd0F0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBzaG93IGF0dHJpYnV0ZSB2YWx1ZXMgaW4KLQkgKiAgICAgICAgICAgIHRoZSB0cmVlIHZpZXdlcgotCSAqIEBwYXJhbSB0cmVlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlU2hvd0F0dHJpYnV0ZXMoYm9vbGVhbiBzaG93QXR0cmlidXRlcywgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCS8vIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldENvbnRlbnRQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZDb250ZW50UHJvdmlkZXIgPSBuZXcgSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZW50UHJvdmlkZXI7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RmlsdGVyZWROb2RlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCS8vIHJlcGxhY2UgYXR0cmlidXRlIG5vZGUgaW4gc2VsZWN0aW9uIHdpdGggaXRzIHBhcmVudAotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQlub2RlID0gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCX0KLQkJCS8vIGFueXRoaW5nIGVsc2Ugbm90IHZpc2libGUsIHJlcGxhY2Ugd2l0aCBwYXJlbnQgbm9kZQotCQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0RmlsdGVyZWROb2RlcyhPYmplY3RbXSBmaWx0ZXJlZE5vZGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyZWROb2Rlcy5sZW5ndGg7IGkrKykgewotCQkJZmlsdGVyZWROb2Rlc1tpXSA9IGdldEZpbHRlcmVkTm9kZShmaWx0ZXJlZE5vZGVzW2ldKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyZWROb2RlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldExhYmVsUHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQXR0cmlidXRlU2hvd2luZ0xhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkF0dHJpYnV0ZVNob3dpbmdMYWJlbFByb3ZpZGVyID0gbmV3IEF0dHJpYnV0ZVNob3dpbmdMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZBdHRyaWJ1dGVTaG93aW5nTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKFRyZWVWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJU2VsZWN0aW9uIGZpbHRlcmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIGZpbHRlcmVkTm9kZXMgPSBnZXRGaWx0ZXJlZE5vZGVzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9BcnJheSgpKTsKLQkJCWZpbHRlcmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsdGVyZWROb2Rlcyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcmVkU2VsZWN0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmE1NDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSBzaGVldCBwYWdlIHdoaWNoIHNob3dzIFhNTCBjb250ZW50LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiB7Ci0JcHJpdmF0ZSBjbGFzcyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVySW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjYWNoZUNsZWFyZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjYWNoZVVwZGF0ZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBmaW5hbCBTdHJpbmcgdXJpLCBpbnQgb2xkU3RhdHVzLCBpbnQgbmV3U3RhdHVzLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJCWlmICgobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BREVEKSB8fCAobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpKSB7Ci0JCQkJcmVmcmVzaFBhZ2VzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChjbURvY3VtZW50TWFuYWdlci5nZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FEKSkgewotCQkJCXJlZnJlc2hQYWdlcygpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlZnJlc2hQYWdlcygpIHsKLQkJCWdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkuYWRkUHJvcGVydHlTaGVldFBhZ2UoZlByb3BlcnR5U2hlZXRQYWdlKTsKLQkJCWdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkuc2NoZWR1bGUoUHJvcGVydGllc1JlZnJlc2hKb2IuVVBEQVRFX0RFTEFZKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydGllc1JlZnJlc2hKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ERUxBWSA9IDIwMDsKLQotCQlwcml2YXRlIFNldCBwcm9wZXJ0eVNoZWV0UGFnZXMgPSBudWxsOwotCi0JCXB1YmxpYyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpIHsKLQkJCXN1cGVyKFhNTFVJTWVzc2FnZXMuSkZhY2VOb2RlQWRhcHRlcl8xKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMgPSBuZXcgSGFzaFNldCgxKTsKLQkJfQotCi0JCXZvaWQgYWRkUHJvcGVydHlTaGVldFBhZ2UoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZXMuYWRkKHBhZ2UpOwotCQkJCXNjaGVkdWxlKFVQREFURV9ERUxBWSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJT2JqZWN0W10gcGFnZXMgPSBwcm9wZXJ0eVNoZWV0UGFnZXMudG9BcnJheSgpOwotCQkJcHJvcGVydHlTaGVldFBhZ2VzLmNsZWFyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKFByb3BlcnR5U2hlZXRQYWdlKSBwYWdlc1tpXTsKLQkJCQlpZiAoKHBhZ2UgIT0gbnVsbCkgJiYgKHBhZ2UuZ2V0Q29udHJvbCgpICE9IG51bGwpICYmICFwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgWE1MUHJvcGVydHlTaGVldFJlZnJlc2hBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyIHsKLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCQlpZiAoZlByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQlnZXRQcm9wZXJ0aWVzUmVmcmVzaEpvYigpLmFkZFByb3BlcnR5U2hlZXRQYWdlKGZQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFhNTFByb3BlcnR5U291cmNlUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2VQcm92aWRlciB7Ci0JCXByaXZhdGUgSVByb3BlcnR5U291cmNlIGZQcm9wZXJ0eVNvdXJjZSA9IG51bGw7Ci0JCXByaXZhdGUgSU5vZGVOb3RpZmllciBmU291cmNlID0gbnVsbDsKLQotCQlwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmICgoZlNvdXJjZSAhPSBudWxsKSAmJiBvYmplY3QuZXF1YWxzKGZTb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJZlNvdXJjZSA9IChJTm9kZU5vdGlmaWVyKSBvYmplY3Q7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gKElQcm9wZXJ0eVNvdXJjZSkgZlNvdXJjZS5nZXRBZGFwdGVyRm9yKElQcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JCQkJaWYgKGZQcm9wZXJ0eVNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCWZQcm9wZXJ0eVNvdXJjZSA9IG5ldyBYTUxQcm9wZXJ0eVNvdXJjZSgoSU5vZGVOb3RpZmllcikgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU291cmNlID0gbnVsbDsKLQkJCQlmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwoKTsKLQlwcml2YXRlIFByb3BlcnRpZXNSZWZyZXNoSm9iIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG51bGw7Ci0JSVByb3BlcnR5U2hlZXRQYWdlIGZQcm9wZXJ0eVNoZWV0UGFnZSA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXIgZlJlZnJlc2hBZGFwdGVyID0gbmV3IFhNTFByb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlcigpOwotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJbXSBmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnMgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJbMF07Ci0JcHJpdmF0ZSBJTm9kZU5vdGlmaWVyW10gZlNlbGVjdGVkTm90aWZpZXJzID0gbmV3IElOb2RlTm90aWZpZXJbMF07Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5wdXRTZWxlY3Rpb24oSVdvcmtiZW5jaFBhcnQgc2VsZWN0aW5nUGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZTZWxlY3RlZE5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCWZTZWxlY3RlZE5vdGlmaWVyc1tpXS5yZW1vdmVBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQl9Ci0JCQlmU2VsZWN0ZWROb3RpZmllcnMgPSBudWxsOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnNbaV0ucmVtb3ZlTGlzdGVuZXIoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0KLQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCQkvKgotCQkJICogT24gQXR0ciBub2Rlcywgc2VsZWN0IHRoZSBvd25lciBFbGVtZW50LiBPbiBUZXh0IG5vZGVzLCBzZWxlY3QKLQkJCSAqIHRoZSBwYXJlbnQgRWxlbWVudC4KLQkJCSAqLwotCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gbmV3IE9iamVjdFtzdHJ1Y3R1cmVkU2VsLnNpemUoKV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cnVjdHVyZWRTZWwudG9BcnJheSgpLCAwLCBzZWxlY3RlZE9iamVjdHMsIDAsIHNlbGVjdGVkT2JqZWN0cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgaW5vZGUgPSBzZWxlY3RlZE9iamVjdHNbaV07Ci0JCQkJaWYgKGlub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5vZGU7Ci0JCQkJCS8vIHJlcGxhY2UgQXR0cmlidXRlIE5vZGUgd2l0aCBpdHMgb3duZXIKLQkJCQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQkJRWxlbWVudCBvd25lckVsZW1lbnQgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJCQkJc2VsZWN0ZWRPYmplY3RzW2ldID0gb3duZXJFbGVtZW50OwotCQkJCQl9Ci0JCQkJCS8vIHJlcGxhY2UgVGV4dCBOb2RlIHdpdGggaXRzIHBhcmVudAotCQkJCQllbHNlIGlmICgoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgfHwgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkpICYmIChwYXJlbnROb2RlICE9IG51bGwpKSB7Ci0JCQkJCQlzZWxlY3RlZE9iamVjdHNbaV0gPSBwYXJlbnROb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQlTZXQgbWFuYWdlcnMgPSBuZXcgSGFzaFNldCgxKTsKLQkJCQlTZXQgc2VsZWN0ZWROb3RpZmllcnMgPSBuZXcgSGFzaFNldCgxKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoKE5vZGUpIHNlbGVjdGVkT2JqZWN0c1tpXSkuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJCQkJQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gcXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQkJCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQkJCQkJbWFuYWdlcnMuYWRkKG1ncik7Ci0JCQkJCQkJCW1nci5hZGRMaXN0ZW5lcihmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIEFkZCBVSSByZWZyZXNoIGFkYXB0ZXJzIGFuZCByZW1lbWJlciBub3RpZmllcnMgZm9yCi0JCQkJCSAqIGxhdGVyIHJlbW92YWwKLQkJCQkJICovCi0JCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCQlzZWxlY3RlZE5vdGlmaWVycy5hZGQoc2VsZWN0ZWRPYmplY3RzW2ldKTsKLQkJCQkJCSgoSU5vZGVOb3RpZmllcikgc2VsZWN0ZWRPYmplY3RzW2ldKS5hZGRBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzID0gKENNRG9jdW1lbnRNYW5hZ2VyW10pIG1hbmFnZXJzLnRvQXJyYXkobmV3IENNRG9jdW1lbnRNYW5hZ2VyW21hbmFnZXJzLnNpemUoKV0pOwotCQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IChJTm9kZU5vdGlmaWVyW10pIHNlbGVjdGVkTm90aWZpZXJzLnRvQXJyYXkobmV3IElOb2RlTm90aWZpZXJbc2VsZWN0ZWROb3RpZmllcnMuc2l6ZSgpXSk7Ci0JCQl9Ci0KLQotCQkJcHJlZmVycmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRPYmplY3RzKTsKLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkU2VsZWN0aW9uOwotCX0KLQotCVByb3BlcnRpZXNSZWZyZXNoSm9iIGdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQlpZiAoZlByb3BlcnRpZXNSZWZyZXNoSm9iID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG5ldyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydGllc1JlZnJlc2hKb2I7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJaWYgKGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IHBhZ2U7Ci0JCQlmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9IG5ldyBYTUxQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCX0KLQotCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnNbaV0ucmVtb3ZlTGlzdGVuZXIoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0JCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3RlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3RlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUxNzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UZW1wbGF0ZXMuY29tbWVudC5uYW1lPWNvbW1lbnQKLVRlbXBsYXRlcy5jb21tZW50LmRlc2M9eG1sIGNvbW1lbnQKLVRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbi5uYW1lPXhtbCBkZWNsYXJhdGlvbgotVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2M9eG1sIGRlY2xhcmF0aW9uCi1UZW1wbGF0ZXMueHNscGkubmFtZT1YU0wgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotVGVtcGxhdGVzLnhzbHBpLmRlc2M9WFNMIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLVRlbXBsYXRlcy54c2luc3AubmFtZT14c2luc3AKLVRlbXBsYXRlcy54c2luc3AuZGVzYz1YTUwgU2NoZW1hIG5hbWUgc3BhY2UKLVRlbXBsYXRlcy5zY2hlbWFMb2MubmFtZT1zY2hlbWFMb2MKLVRlbXBsYXRlcy5zY2hlbWFMb2MuZGVzYz1YTUwgU2NoZW1hIGxvY2F0aW9uIGF0dHJpYnV0ZQotVGVtcGxhdGVzLm5vc2NoZW1hTG9jLm5hbWU9bm9zY2hlbWFMb2MKLVRlbXBsYXRlcy5ub3NjaGVtYUxvYy5kZXNjPU5vIE5hbWVzcGFjZSBTY2hlbWEgTG9jYXRpb24KLVRlbXBsYXRlcy5kZWZhdWx0bnNwLm5hbWU9ZGVmYXVsdCBuYW1lc3BhY2UKLVRlbXBsYXRlcy5kZWZhdWx0bnNwLmRlc2M9RGVmYXVsdCBOYW1lc3BhY2UgQXR0cmlidXRlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvdGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzMwY2IyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gYWRkZWQgdGVtcGxhdGVzIGZvciB4c2kgbmFtZXNwYWNlLCBzY2hlbWFMb2NhdGlvbiwgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBuYW1lc3BhY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLSAgPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24ubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24uZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uIiBjb250ZXh0PSJ4bWxfbmV3IiBlbmFibGVkPSJ0cnVlIj4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSI/Jmd0OzwvdGVtcGxhdGU+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmNvbW1lbnQubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuY29tbWVudC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuY29tbWVudCIgY29udGV4dD0ieG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+Jmx0OyEtLSAke2N1cnNvcn0gLS0mZ3Q7PC90ZW1wbGF0ZT4KLSAgPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueHNscGkubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMueHNscGkuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLnhzbHBpIiBjb250ZXh0PSJ4bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4mbHQ7P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIke2N1cnNvcn0iPyZndDs8L3RlbXBsYXRlPgotICA8dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy54c2luc3AubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMueHNpbnNwLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy54c2luc3AiIGNvbnRleHQ9InhtbF9hdHRyaWJ1dGUiIGVuYWJsZWQ9InRydWUiPnhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPC90ZW1wbGF0ZT4KLSAgPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuc2NoZW1hTG9jLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnNjaGVtYUxvYy5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuc2NoZW1hTG9jIiBjb250ZXh0PSJ4bWxfYXR0cmlidXRlIiBlbmFibGVkPSJ0cnVlIj54c2k6c2NoZW1hTG9jYXRpb249IntuYW1lc3BhY2V9IHtsb2NhdGlvbn0iPC90ZW1wbGF0ZT4KLSAgPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMubm9zY2hlbWFMb2MubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMubm9zY2hlbWFMb2MuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLm5vc2NoZW1hTG9jIiBjb250ZXh0PSJ4bWxfYXR0cmlidXRlIiBlbmFibGVkPSJ0cnVlIj54c2k6c2NoZW1hTG9jYXRpb249IntuYW1lc3BhY2V9IHtsb2NhdGlvbn0iPC90ZW1wbGF0ZT4KLSAgPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuZGVmYXVsdG5zcC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5kZWZhdWx0bnNwLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5kZWZhdWx0bnNwIiBjb250ZXh0PSJ4bWxfYXR0cmlidXRlIiBlbmFibGVkPSJ0cnVlIj54bWxucz0iZGVmYXVsdCBuYW1lc3BhY2UiPC90ZW1wbGF0ZT4KLTwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTBjNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1jb250ZW50bW9kZWwiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXZhbGlkYXRpb24iIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iCi0JCXBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL2ltcGwvQ29uc3RhbnRzIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9wYXJzZXJzL1hNTEdyYW1tYXJQcmVwYXJzZXIiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3V0aWwvWE1MR3JhbW1hclBvb2xJbXBsIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvWE1MUmVzb3VyY2VJZGVudGlmaWVyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvWE5JRXhjZXB0aW9uIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvZ3JhbW1hcnMvWE1MR3JhbW1hckRlc2NyaXB0aW9uIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvcGFyc2VyL1hNTEVudGl0eVJlc29sdmVyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvcGFyc2VyL1hNTEVycm9ySGFuZGxlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL3BhcnNlci9YTUxJbnB1dFNvdXJjZSIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL3BhcnNlci9YTUxQYXJzZUV4Y2VwdGlvbiIgLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iCi0JCXBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZSIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvZGVsZWdhdGVzL0RlbGVnYXRpbmdWYWxpZGF0b3IiIC8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iIC8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2RkN2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1ZjhlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2QuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1NTU4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jU2F0IE1hciAyNCAwMjoxOToxMiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzA5ODVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jV2VkIE5vdiAxNSAwMjoxMzoxMCBFU1QgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODJjNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlX1VJX1BMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS40MDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwuWFNEQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlO3gtaW50ZXJuYWw6PXRydWUgCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS54c2Q7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmU1NzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKLW91dHB1dC4uID0gYmluLwotc291cmNlLi4gPSBzcmMtY29udGVudG1vZGVsLyxcCi0gICAgICAgICAgIHNyYy12YWxpZGF0aW9uLyxcCi0gICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjU5MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBQcm9wZXJ0aWVzIGZpbGUgZm9yIGNvbXBvbmVudDogWE1MIFNjaGVtYSBWYWxpZGF0b3IKLQotIQotISBQbHVnaW4KLSEKLV9VSV9QTFVHSU5fTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gWFNEIENvcmUgUGx1Z2luCi1YU0RfQ29udGVudF9UeXBlPVhTRAotCi1fVUlfWE1MX1NDSEVNQV9WQUxJREFUT1IgICAgICAgICAgICAgICAgICA9IFhNTCBTY2hlbWEgVmFsaWRhdG9yCi1fVUlfWEVSQ0VTX1ZBTElEQVRPUl9ERUxFR0FURSAgICAgICAJICA9IFhlcmNlcy1iYXNlZCBYTUwgU2NoZW1hIFZhbGlkYXRvcgotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzFhMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJVhTRF9Db250ZW50X1R5cGUiCi0JCQlpZD0ieHNkc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCIKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ieHNkIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50RmFjdG9yaWVzIj4KLQkJPGZhY3RvcnkKLQkJCXR5cGU9InhzZCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5DTURvY3VtZW50RmFjdG9yeVhTRCI+Ci0JCTwvZmFjdG9yeT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFJlZ2lzdGVyIHRoZSBYU0QgdmFsaWRhdG9yIHdpdGggdGhlIHZhbGlkYXRpb24gCQktLT4KLQk8IS0tIGZyYW1ld29yay4gCQkJCQkJCQkJCSAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tCi0JPGV4dGVuc2lvbgotCQlpZD0ieHNkVmFsaWRhdG9yIgotCQluYW1lPSIlX1VJX1hNTF9TQ0hFTUFfVkFMSURBVE9SIgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLQkJPHZhbGlkYXRvcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0JCQkJbmFtZUZpbHRlcj0iKi54c2QiPgotCQkJPC9maWx0ZXI+Ci0JCQkKLQkJCTxoZWxwZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5IZWxwZXIiPgotCQkJPC9oZWxwZXI+Ci0JCQkKLQkJCTxydW4KLSAgICAgICAgIGFzeW5jPSJ0cnVlIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuWFNERGVsZWdhdGluZ1ZhbGlkYXRvciIKLSAgICAgICAgIGVuYWJsZWQ9InRydWUiCi0gICAgICAgICBmdWxsQnVpbGQ9InRydWUiCi0gICAgICAgICBpbmNyZW1lbnRhbD0idHJ1ZSI+Ci0JCQk8L3J1bj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JLS0+Ci0JCi0gICA8ZXh0ZW5zaW9uIGlkPSJ4c2QiIG5hbWU9IiVfVUlfWE1MX1NDSEVNQV9WQUxJREFUT1IiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlhTRERlbGVnYXRpbmdWYWxpZGF0b3IiCi0gICAgICAgICAgICBtYW51YWw9InRydWUiCi0gICAgICAgICAgICBzb3VyY2VpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QiCi0gICAgICAgICAgICB2ZXJzaW9uPSIyIgotICAgICAgICAgICAgbWFya2VySWQ9Im9yZy5lY2xpcHNlLnhzZC5kaWFnbm9zdGljIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0ieHNkIj48L2ZpbGVleHQ+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yRGVsZWdhdGVzIj4KLSAgICAJPGRlbGVnYXRlCi0gICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3IiCi0JCQluYW1lPSIlX1VJX1hFUkNFU19WQUxJREFUT1JfREVMRUdBVEUiCi0gICAgICAgIAl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuWFNERGVsZWdhdGluZ1ZhbGlkYXRvciIvPgotCSA8L2V4dGVuc2lvbj4KLSAJIAotCSA8IS0tIGluaXRpYWxpemUgeG1sIGNvcmUgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhTRENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIEFkZCBzY2hlbWFzIHRvIFhNTCBDYXRhbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiPgotCQk8Y2F0YWxvZ0NvbnRyaWJ1dGlvbiBpZD0iZGVmYXVsdCI+Ci0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQkJdXJpPSJwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLnhzZC9jYWNoZS93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLnhzZCIgLz4KLQkJCTxzeXN0ZW0KLQkJCQlzeXN0ZW1JZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIgotCQkJCXVyaT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS54c2QvY2FjaGUvd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4JCQkJCi0JCTwvY2F0YWxvZ0NvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL0NNRG9jdW1lbnRGYWN0b3J5WFNELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL0NNRG9jdW1lbnRGYWN0b3J5WFNELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMjYwODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTURvY3VtZW50RmFjdG9yeVhTRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3RvcnkuQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEUGFja2FnZUltcGw7Ci0KLS8qKgotICogIFRoaXMgYnVpbGRlciBoYW5kbGVzIGJ1aWxkaW5nIC5kdGQgLyAueHNkIGdyYW1tYXIgZmlsZXMKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRGYWN0b3J5WFNEIGltcGxlbWVudHMgQ01Eb2N1bWVudEZhY3RvcnkKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX0ZJTEVfVFlQRSA9ICJYU0QiOwotCi0gIHB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVhTRCgpIAotICB7ICAKLSAgICAvLyBoZXJlIHdlIGNhbGwgaW5pdCBvbiB0aGUgWFNEIGFuZCBEVEQgcGFja2FnZXMgdG8gYXZvaWQgc3RyYW5nZSBpbml0aWFsaXphdGlvbiBidWdzCi0gICAgLy8KLSAgICBYU0RQYWNrYWdlSW1wbC5pbml0KCk7Ci0gICAgWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNERmFjdG9yeSgpOyAgCi0gIH0KLQotIAotICBwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAJCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBYU0RJbXBsLmJ1aWxkQ01Eb2N1bWVudCh1cmkpOyAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmY2E1NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNTm9kZUltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIENNTm9kZQotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OID0gImRvY3VtZW50YXRpb24iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX1NPVVJDRSA9ICJkb2N1bWVudGF0aW9uU291cmNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9MQU5HVUFHRSA9ICJkb2N1bWVudGF0aW9uTGFuZ3VhZ2UiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9NT0ZfTk9USUZJRVIgPSAia2V5IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZpbml0aW9uSW5mbyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRklOSVRJT04gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2RlZmluaXRpb24iOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7Ci0KLSAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUik7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvYmplY3QpCi0gIHsKLQkgIC8vbm8gcHJvcGVydHllcyBzdXBwb3J0ZWQ/IAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRENNTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RDTU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2MWE1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRENNTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBYU0RDTU1hbmFnZXIgZXh0ZW5kcyBQbHVnaW4gCi17Ci0gIHByaXZhdGUgc3RhdGljIFhTRENNTWFuYWdlciBpbnN0YW5jZTsKLSAgCi0gIHB1YmxpYyBYU0RDTU1hbmFnZXIoKSAKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgWFNEQ01NYW5hZ2VyIGdldEluc3RhbmNlKCkgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBYU0RDTU1hbmFnZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzdGFydHVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gIHsKLSAgICBYU0RUeXBlVXRpbC5pbml0aWFsaXplKCk7Ci0gICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0SW5mZXJyZWRHcmFtbWFyRmFjdG9yeShuZXcgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeUltcGwoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNESW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ODY1MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAxNTcyNTQgLSByZWZlcmVuY2VkIEF0dHJpYnV0ZXMgYW5kIEVsZW1lbnRzCi0gKiAgICAgICAgd2VyZSBub3QgYmVpbmcgY2hlY2tlZCB0byBzZWUgaWYgdGhleSBoYWQgdGhlIGFubm90YXRpb25zIGlmCi0gKiAgICAgICAgbm9uZSB3ZXJlIGRlZmluZWQgbG9jYWxseS4gKEluaXRpYWwgZml4IG1vZGlmaWVkIC0gc2VlIGJ1ZykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTURhdGFUeXBlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01FbnRpdHlEZWNsYXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUdyb3VwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBidWlsZCBjbW5vZGVzIGZyb20gWE1MIFNjaGVtYSBub2Rlcy4gVGhlIFhNTCBTY2hlbWEgbW9kZWwgaXMKLSAqIGZvdW5kIGluIHRoZSBvcmcuZWNsaXBzZS54c2QgcGx1Z2luLgotICogCi0gKiBUT0RPOiBnZXROYW1lc3BhY2VVUkkoKWN1cnJlbnRseSBhbHdheXMgcmV0dXJucyAnIyNhbnknLgotICovCi1wdWJsaWMgY2xhc3MgWFNESW1wbAotewotICAvKgotICAgKiBwcm9wZXJ0aWVzIGNvbW1vbiB0byBhbGwgY21ub2RlcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZGVmaW5lZCBpbgotICAgKiBDTU5vZGVJbXBsIGNsYXNzOiBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OIFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fU09VUkNFCi0gICAqIFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fTEFOR1VBR0UgUFJPUEVSVFlfTU9GX05PVElGSUVSCi0gICAqIFBST1BFUlRZX0RFRklOSVRJT05fSU5GTyBQUk9QRVJUWV9ERUZJTklUSU9OCi0gICAqIAotICAgKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLCBYU0RJbXBsOgotICAgKiBQUk9QRVJUWV9DTURPQ1VNRU5UIFBST1BFUlRZX1VTRVNfTE9DQUxfRUxFTUVOVF9ERUNMQVJBVElPTlMKLSAgICogUFJPUEVSVFlfSVNfTkFNRV9TUEFDRV9BV0FSRSBQUk9QRVJUWV9OU19QUkVGSVhfUVVBTElGSUNBVElPTgotICAgKiBQUk9QRVJUWV9OSUxMQUJMRSBQUk9QRVJUWV9TUEVDCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9DTURPQ1VNRU5UID0gIkNNRG9jdW1lbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9VU0VTX0xPQ0FMX0VMRU1FTlRfREVDTEFSQVRJT05TID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy91c2VzTG9jYWxFbGVtZW50RGVjbGFyYXRpb25zIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfSVNfTkFNRV9TUEFDRV9BV0FSRSA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvaXNOYW1lU3BhY2VBd2FyZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05TX1BSRUZJWF9RVUFMSUZJQ0FUSU9OID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uc1ByZWZpeFF1YWxpZmljYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OSUxMQUJMRSA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbmlsbGFibGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TUEVDID0gInNwZWMiOwotICAvKgotICAgKiBwcm9wZXJ0aWVzIGNvbW1vbiB0byBhbGwgQ01Eb2N1bWVudCBub2RlczogUFJPUEVSVFlfVEFSR0VUX05BTUVTUEFDRV9VUkkKLSAgICogUFJPUEVSVFlfSU1QT1JURURfTkFNRVNQQUNFX0lORk8gUFJPUEVSVFlfTkFNRVNQQUNFX0lORk8KLSAgICogUFJPUEVSVFlfRUxFTUVOVF9GT1JNX0RFRkFVTFQgUFJPUEVSVFlfQU5OT1RBVElPTl9NQVAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RBUkdFVF9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JTVBPUlRFRF9OQU1FU1BBQ0VfSU5GTyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvaW1wb3J0ZWROYW1lc3BhY2VJbmZvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRVNQQUNFX0lORk8gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25hbWVzcGFjZUluZm8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FTEVNRU5UX0ZPUk1fREVGQVVMVCA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZWxlbWVudEZvcm1EZWZhdWx0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQU5OT1RBVElPTl9NQVAgPSAiYW5ub3RhdGlvbk1hcCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NPTVBMRVRFX05BTUVTUEFDRV9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9jb21wbGV0ZU5hbWVzcGFjZUluZm8iOwotICAvKgotICAgKiBwcm9wZXJ0aWVzIGNvbW1vbiB0byBhbGwgQ01FbGVtZW50RGVjbGFyYXRpb24gbm9kZXM6IFBST1BFUlRZX1hTSVRZUEVTCi0gICAqIFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTiBQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVAKLSAgICogUFJPUEVSVFlfQUJTVFJBQ1QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1hTSVRZUEVTID0gIlhTSVR5cGVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVSSVZFRF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gIkRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVAgPSAiU3Vic3RpdHV0aW9uR3JvdXAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVBfVkFMVUUgPSAiU3Vic3RpdHV0aW9uR3JvdXBWYWx1ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FCU1RSQUNUID0gIkFic3RyYWN0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLmNtLnByb3BlcnRpZXMvd2hpdGVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIERlZmluaXRpb24gaW5mbyBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZJTklUSU9OX0lORk9fR0xPQkFMID0gImdsb2JhbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRklOSVRJT05fSU5GT19MT0NBTCA9ICJsb2NhbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9MQU5HX0FUVFJJQlVURSA9ICJ4bWw6bGFuZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1BST1RPQ09MID0gInBsYXRmb3JtOiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgWFNEQWRhcHRlckZhY3RvcnlJbXBsIHhzZEFkYXB0ZXJGYWN0b3J5SW1wbCA9IG5ldyBYU0RBZGFwdGVyRmFjdG9yeUltcGwoKTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBYU0lEb2N1bWVudCB4c2lEb2N1bWVudCA9IG5ldyBYU0lEb2N1bWVudCgpOwotCi0gIC8qKgotICAgKiBHaXZlbiB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQsIHBhcnNlIHRoZSBkb2N1bWVudCBhbmQgYnVpbGQKLSAgICogY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0KLSAgICogICAgICAgICAgdGhlIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudAotICAgKiBAcGFyYW0gZ3JhbW1hckVycm9yQ2hlY2tpbmcgLQotICAgKiAgICAgICAgICBncmFtbWFyIGVycm9yIGNoZWNraW5nIGZsYWcKLSAgICogQHBhcmFtIGVycm9yTGlzdCAtCi0gICAqICAgICAgICAgIHRoZSByZXN1bHRpbmcgZXJyb3IgbGlzdAotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICogQGRlcHJlY2F0ZWQgLS0gdXNlIGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgdXJpKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgdXJpLCBpbnQgZ3JhbW1hckVycm9yQ2hlY2tpbmcsIExpc3QgZXJyb3JMaXN0KQotICB7Ci0gICAgcmV0dXJuIGJ1aWxkQ01Eb2N1bWVudCh1cmkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudCwgcGFyc2UgdGhlIGRvY3VtZW50IGFuZCBidWlsZAotICAgKiBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgLQotICAgKiAgICAgICAgICB0aGUgdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50Ci0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgdXJpKQotICB7Ci0gICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gbnVsbDsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYnVpbGRYU0RNb2RlbCh1cmkpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNtRG9jdW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50LCBwYXJzZSB0aGUgZG9jdW1lbnQgYW5kIGJ1aWxkCi0gICAqIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSAtCi0gICAqICAgICAgICAgIHRoZSB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQKLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFhTRFNjaGVtYSBidWlsZFhTRE1vZGVsKFN0cmluZyB1cmlTdHJpbmcpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gbnVsbDsKLSAKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBpZiBYTUwgU2NoZW1hIGZvciBTY2hlbWEgaXMgcmVxdWVzdGVkLCBnZXQgaXQgdGhyb3VnaCBzY2hlbWEgbW9kZWwgCi0gICAgICBpZiAodXJpU3RyaW5nLmVuZHNXaXRoKCIyMDAxL1hNTFNjaGVtYS54c2QiKSkKLSAgICAgIHsKLSAgICAgIAl4c2RTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwkJCQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAJCi0gICAgICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotICAgICAgICAvL3Jlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5KCkpOwotICAgICAgICAgIAotICAgICAgICBVUkkgdXJpID0gY3JlYXRlVVJJKHVyaVN0cmluZyk7ICAgCi0gICAgICAgIAotICAgICAgICAvLyBDUyA6IGJ1ZyAxMTM1MzcgZW5zdXJlIHdlIHBlcmZvcm0gcGh5c2ljYWwgcmVzb2x1dGlvbiBiZWZvcmUgb3BlbmluZyBhIHN0cmVhbSBmb3IgdGhlIHJlc291cmNlCi0gICAgICAgIC8vCi0gICAgICAgIFN0cmluZyBwaHlzaWNhbExvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigiIiwgIiIsIHVyaVN0cmluZyk7ICAgICAgIAotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkocGh5c2ljYWxMb2NhdGlvbikpOwotICAgICAgICBYU0RSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoWFNEUmVzb3VyY2VJbXBsKXJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIioueHNkIikpOwotICAgICAgICByZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgICAgICAgcmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgbnVsbCk7ICAgICAgICAgCi0gICAgICAgIHhzZFNjaGVtYSA9IHJlc291cmNlLmdldFNjaGVtYSgpOyAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0gIAotICAvLyBUT0RPIC4uLiBsb29rcyBsaWtlIHdlIGNhbiByZW1vdmUgdGhpcyBjbGFzcz8KLSAgLy8KLSAgc3RhdGljIGNsYXNzIEludGVybmFsVVJJQ29udmVydGVyIGV4dGVuZHMgVVJJQ29udmVydGVySW1wbAotICB7Ci0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGNyZWF0ZVVSTElucHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmICgiaHR0cCIuZXF1YWxzKHVyaS5zY2hlbWUoKSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0aGVVUkkgPSB1cmkudG9TdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIG1hcHBlZCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZSh0aGVVUkksIHRoZVVSSSwgdGhlVVJJKTsKLSAgICAgICAgaWYgKG1hcHBlZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdXJpID0gY3JlYXRlVVJJKG1hcHBlZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBzdXBlci5jcmVhdGVVUkxJbnB1dFN0cmVhbSh1cmkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFwcHJvcHJpYXRlIFVSSSBiYXNlZCBvbiBhIHVyaSBzdHJpbmcuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpU3RyaW5nIC0KLSAgICogICAgICAgICAgYSB1cmkgc3RyaW5nLgotICAgKiBAcmV0dXJuIGFuIGFwcHJvcHJpYXRlIFVSSSBiYXNlZCBvbiBhIHVyaSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIHVyaVN0cmluZykKLSAgewotICAgIGlmIChoYXNQcm90b2NvbCh1cmlTdHJpbmcpKQotICAgICAgcmV0dXJuIFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkodXJpU3RyaW5nKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzUHJvdG9jb2woU3RyaW5nIHVyaSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKCI6Iik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggPiAyKSAvLyBhc3N1bWUgcHJvdG9jb2wgd2l0aCBiZSBsZW5ndGggMyBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUnQycgaW4gJ0M6LycgaXMgbm90IGludGVycHJldGVkIGFzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RvY29sCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHN0cmluZyBiZWdpbnMgd2l0aCBwbGF0Zm9ybSBwcm90b2NvbC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlTdHJpbmcgLQotICAgKiAgICAgICAgICBhIHVyaSBzdHJpbmcuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBzdHJpbmcgYmVnaW5zIHdpdGggcGxhdGZvcm0gcHJvdG9jb2wuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gd2l0aFBsYXRmb3JtUHJvdG9jb2woU3RyaW5nIHVyaVN0cmluZykKLSAgewotICAgIHJldHVybiB1cmlTdHJpbmcuc3RhcnRzV2l0aChQTEFURk9STV9QUk9UT0NPTCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIxIi4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wb25lbnQgLQotICAgKiAgICAgICAgICBhIGNvbmNyZXRlIGNvbXBvbmVudC4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRNaW5PY2N1cnMoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgaW50IG1pbk9jY3VyID0gMTsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBjb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBpZiAoKChYU0RQYXJ0aWNsZSkgbykuaXNTZXRNaW5PY2N1cnMoKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbk9jY3VyID0gKChYU0RQYXJ0aWNsZSkgbykuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5PY2N1ciA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtaW5PY2N1cjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgKiAKLSAgICogQHBhcmFtIGNvbXBvbmVudCAtCi0gICAqICAgICAgICAgIGEgY29uY3JldGUgY29tcG9uZW50LgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldE1heE9jY3VycyhYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpbnQgbWF4T2NjdXIgPSAxOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTRFBhcnRpY2xlKSBvKS5pc1NldE1heE9jY3VycygpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWF4T2NjdXIgPSAoKFhTRFBhcnRpY2xlKSBvKS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heE9jY3VyID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1heE9jY3VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAgICogCi0gICAqIEBwYXJhbSB0eXBlIC0KLSAgICogICAgICAgICAgYSB0eXBlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUWVBFX05BTUVfQk9PTEVBTiA9ICJib29sZWFuIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9WQUxVRV9UUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUWVBFX1ZBTFVFX0ZBTFNFPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclR5cGUoWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIFNlZSBidWcgMjE0ODA0IC0gQ29udGVudCBhc3Npc3Qgbm90IHNob3dpbmcgdmFsaWQgdmFsdWVzIHdoZW4gaXQncyBhIGNvbXBsZXgKLSAgICAvLyB0eXBlIHdpdGggc2ltcGxlIGNvbnRlbnQKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB0eXBlID0gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdHlwZSkuZ2V0U2ltcGxlVHlwZSgpOwotICAgIH0KLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsgICAgICAgICAKLSAgICAgIGlmIChUWVBFX05BTUVfQk9PTEVBTi5lcXVhbHModHlwZS5nZXROYW1lKCkpICYmIHR5cGUuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkgPT0gdHlwZS5nZXRTY2hlbWEoKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFkZChUWVBFX1ZBTFVFX1RSVUUpOwotICAgICAgICByZXN1bHQuYWRkKFRZUEVfVkFMVUVfRkFMU0UpOwotICAgICAgfSAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gU2ltcGxlIHR5cGVzIGNhbiBiZSBvbmUgb2Y6IGF0b21pYywgbGlzdCBvciB1bmlvbi4KLSAgICAgICAgaW50IHZhcmlldHlUeXBlID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0VmFyaWV0eSgpLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgc3dpdGNoICh2YXJpZXR5VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGNhc2UgWFNEVmFyaWV0eS5BVE9NSUM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gdHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhKHR5cGUuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkgPT0gYmFzZVR5cGUuZ2V0U2NoZW1hKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclNpbXBsZVR5cGUoYmFzZVR5cGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclNpbXBsZVR5cGUodHlwZSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBYU0RWYXJpZXR5LkxJU1Q6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGl0ZW1UeXBlRGVmaW5pdGlvbiA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHR5cGUpLmdldEl0ZW1UeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yU2ltcGxlVHlwZShpdGVtVHlwZURlZmluaXRpb24sIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFhTRFZhcmlldHkuVU5JT046Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIExpc3QgbWVtYmVyVHlwZXMgPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlKS5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgICAgICAgaWYgKG1lbWJlclR5cGVzICE9IG51bGwgJiYgbWVtYmVyVHlwZXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBtZW1iZXJUeXBlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JUeXBlKHNpbXBsZVR5cGUpOwotICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAJICBpZihyZXN1bHQuaW5kZXhPZih2YWx1ZXNbal0pID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgCQkgIHJlc3VsdC5hZGQodmFsdWVzW2pdKTsKLSAgICAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIFN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXTsKLSAgICByZXN1bHQudG9BcnJheShhcnJheSk7Ci0gICAgcmV0dXJuIGFycmF5OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yU2ltcGxlVHlwZShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlLCBMaXN0IHJlc3VsdCkKLSAgewotICAgIExpc3QgZW51bWVyYXRpb25GYWNldHMgPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlKS5nZXRFbnVtZXJhdGlvbkZhY2V0cygpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGVudW1lcmF0aW9uRmFjZXRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBpLm5leHQoKTsKLSAgICAgIExpc3QgdmFsdWVzID0gZW51bUZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSB2YWx1ZXMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGoubmV4dCgpOwotICAgICAgICBpZiAobyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFyZXN1bHQuY29udGFpbnMobykpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFkZChvLnRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMgZnJvbSB0aGUgZ2l2ZW4gYW5ub3RhdGlvbi4gV29ya2luZwotICAgKiB3aXRoIGRvY3VtZW50YXRpb24gZWxlbWVudHMgcmVxdWlyZXMgZHJvcHBpbmcgZG93biBpbnRvIHRoZSBET00gbW9kZWwuCi0gICAqIAotICAgKiBAcGFyYW0gYW5ub3RhdGlvbiAtCi0gICAqICAgICAgICAgIGFuIFhTREFubm90YXRpb24gbm9kZS4KLSAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9ucyhYU0RBbm5vdGF0aW9uIGFubm90YXRpb24pCi0gIHsKLSAgICBDTU5vZGVMaXN0SW1wbCBkb2N1bWVudGF0aW9ucyA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBkb2N1bWVudGF0aW9uc0VsZW1lbnRzID0gYW5ub3RhdGlvbi5nZXRVc2VySW5mb3JtYXRpb24oKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRvY3VtZW50YXRpb25zRWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBkb2N1bWVudGF0aW9ucy5nZXRMaXN0KCkuYWRkKG5ldyBEb2N1bWVudGF0aW9uSW1wbCgoRWxlbWVudCkgaS5uZXh0KCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRvY3VtZW50YXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkYXB0ZWQgZnJvbSBwdWJsaWMgc3RhdGljIExpc3QgZmluZFR5cGVzRGVyaXZlZEZyb20oWFNEU2NoZW1hIHNjaGVtYSwKLSAgICogU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkgaW4gY2xhc3MgWFNEU2NoZW1hUXVlcnlUb29scyBmb3VuZCBpbgotICAgKiBvcmcuZWNsaXBzZS54c2QgcGx1Z2luLgotICAgKiAKLSAgICogRmluZCB0eXBlRGVmaW5pdGlvbnMgdGhhdCBkZXJpdmUgZnJvbSBhIGdpdmVuIHR5cGUuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZQotICAgKiAgICAgICAgICB0aGUgdHlwZSBkZXJpdmVkIGZyb20KLSAgICogQHJldHVybiBMaXN0IG9mIGFueSBYU0RUeXBlRGVmaW5pdGlvbnMgZm91bmQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBmaW5kVHlwZXNEZXJpdmVkRnJvbShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgQXJyYXlMaXN0IHR5cGVzRGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gdHlwZS5nZXRTY2hlbWEoKTsKLSAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgIGlmICgobnVsbCAhPSBzY2hlbWEpICYmIChudWxsICE9IGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIC8vIEEgaGFuZHkgY29udmVuaWVuY2UgbWV0aG9kIHF1aWNrbHkgZ2V0cyBhbGwKLSAgICAgICAgLy8gdHlwZURlZmluaXRpb25zIHdpdGhpbiBvdXIgc2NoZW1hOyBub3RlIHRoYXQKLSAgICAgICAgLy8gd2hldGhlciBvciBub3QgdGhpcyByZXR1cm5zIHR5cGVzIGluIGluY2x1ZGVkLAotICAgICAgICAvLyBpbXBvcnRlZCwgb3IgcmVkZWZpbmVkIHNjaGVtYXMgaXMgc3ViamVjdCB0byBjaGFuZ2UKLSAgICAgICAgTGlzdCB0eXBlZGVmcyA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWRlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZWRlZiA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgaWYgKHR5cGVkZWYgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV2FsayB0aGUgYmFzZVR5cGVzIGZyb20gdGhpcyB0eXBlZGVmIHNlZWluZyBpZiBhbnkKLSAgICAgICAgICAgIC8vIG9mIHRoZW0gbWF0Y2ggdGhlIHJlcXVlc3RlZCBvbmUKLSAgICAgICAgICAgIGlmIChpc1R5cGVEZXJpdmVkRnJvbSh0eXBlZGVmLCBuYW1lc3BhY2UsIGxvY2FsTmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGl0LCByZXR1cm4gdGhlIG9yaWdpbmFsIG9uZSBhbmQgY29udGludWUKLSAgICAgICAgICAgICAgdHlwZXNEZXJpdmVkRnJvbS5hZGQodHlwZWRlZik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHlwZXNEZXJpdmVkRnJvbTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGFwdGVkIGZyb20gcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzVHlwZURlcml2ZWRGcm9tKFhTRFR5cGVEZWZpbml0aW9uCi0gICAqIHR5cGVkZWYsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpIGluIGNsYXNzIFhTRFNjaGVtYVF1ZXJ5VG9vbHMKLSAgICogZm91bmQgaW4gb3JnLmVjbGlwc2UueHNkIHBsdWdpbi4KLSAgICogCi0gICAqIFJlY3Vyc2l2ZSB3b3JrZXIgbWV0aG9kIHRvIGZpbmQgdHlwZURlZmluaXRpb25zIHRoYXQgZGVyaXZlIGZyb20gYSBuYW1lZAotICAgKiB0eXBlLgotICAgKiAKLSAgICogQHNlZSAjZmluZFR5cGVzRGVyaXZlZEZyb20oWFNEU2NoZW1hLCBTdHJpbmcsIFN0cmluZykKLSAgICogQHBhcmFtIHR5cGVEZWYKLSAgICogICAgICAgICAgdG8gc2VlIGlmIGl0J3MgZGVyaXZlZCBmcm9tCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICogICAgICAgICAgZm9yIHRoZSB0eXBlIGRlcml2ZWQgZnJvbQotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqICAgICAgICAgIGZvciB0aGUgdHlwZSBkZXJpdmVkIGZyb20KLSAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzOyBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1R5cGVEZXJpdmVkRnJvbShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlZGVmLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgLy8gV2FsayB0aGUgYmFzZVR5cGVzIGZyb20gdGhpcyB0eXBlZGVmIHNlZWluZyBpZiBhbnkKLSAgICAvLyBvZiB0aGVtIG1hdGNoIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSB0eXBlZGVmLmdldEJhc2VUeXBlKCk7Ci0gICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAJewotICAgICAgLy8gdHlwZWRlZiBpcyBhIHJvb3QgdHlwZSBsaWtlIHhzZDphbnlUeXBlLCBzbyBpdCBoYXMgbm8gYmFzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvLyBBcyB0aGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpZiBvdXIgcGFyYW1ldGVycyBtYXRjaAotICAgIGlmIChiYXNlVHlwZS5oYXNOYW1lQW5kVGFyZ2V0TmFtZXNwYWNlKGxvY2FsTmFtZSwgbmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcm9vdFR5cGUgPSB0eXBlZGVmLmdldFJvb3RUeXBlKCk7Ci0KLSAgICBpZiAocm9vdFR5cGUgPT0gYmFzZVR5cGUpCi0gICAgewotICAgICAgLy8gSWYgd2UndmUgaGl0IHRoZSByb290LCB3ZSBhcmVuJ3QgZGVyaXZlZCBmcm9tIGl0Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSBiYXNlIHR5cGUgaXMgcmVkZWZpbmVkL2NpcmN1bGFyCi0gICAgICAvLyBvdGhlcndpc2UgdGhpcyB3aWxsIGJlIGFuIGVuZGxlc3MgcmVjdXJzaXZlIGNhbGwuCi0gICAgICAvLyBNb3ZlZC4gIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEzNTQzCi0gICAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCAgICAgWFNEQ29uc3RhbnRzLmlzT3JJc0Rlcml2ZWRGcm9tKGJhc2VUeXBlLCBsb2NhbE5hbWUsIG5hbWVzcGFjZSk7Ci0gICAgICBpZiAocm9vdFR5cGUuaXNDaXJjdWxhcigpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIC8vIE90aGVyd2lzZSBjb250aW51ZSB0byB0cmF2ZXJzZSB1cHdhcmRzCi0gICAgICByZXR1cm4gaXNUeXBlRGVyaXZlZEZyb20oYmFzZVR5cGUsIG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBjbW5vZGUgb2YgdGhlIHNwZWNpZmllZCBYTUwgU2NoZW1hIG5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gdGFyZ2V0IC0KLSAgICogICAgICAgICAgYW4gWE1MIFNjaGVtYSBub2RlCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgY21ub2RlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDTU5vZGUgZ2V0QWRhcHRlcihOb3RpZmllciBvKQotICB7Ci0gICAgcmV0dXJuIChDTU5vZGUpIHhzZEFkYXB0ZXJGYWN0b3J5SW1wbC5hZGFwdChvKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGFwdGVkIGZyb20gcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5zLCBib29sZWFuIHdpdGhDb2xvbikgaW4gY2xhc3MKLSAgICogVHlwZXNIZWxwZXIgZm91bmQgaW4gb3JnLmVjbGlwc2Uud3N0LnhzZC5lZGl0b3IgcGx1Z2luLgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYSAtCi0gICAqICAgICAgICAgIHRoZSByZWxldmFudCBzY2hlbWEKLSAgICogQHBhcmFtIG5zIC0KLSAgICogICAgICAgICAgdGhlIHJlbGV2YW50IG5hbWVzcGFjZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBucykKLSAgewotICAgIFN0cmluZyBrZXkgPSAiIjsKLSAgICBpZiAoKHNjaGVtYSAhPSBudWxsKSAmJiAobnMgIT0gbnVsbCkpCi0gICAgewotICAgICAgTWFwIG1hcCA9IHNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBJdGVyYXRvciBpdGVyID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBrZXlPYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFwLmdldChrZXlPYmopOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmVxdWFscyhucykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoa2V5T2JqICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAga2V5ID0ga2V5T2JqLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrZXkgPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotICAvKioKLSAgICogVGhlIEZhY3RvcnkgZm9yIHRoZSBYU0QgYWRhcHRlciBtb2RlbC4gSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoCi0gICAqIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTREFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotICB7Ci0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpCi0gICAgewotICAgICAgWFNEU3dpdGNoIHhzZFN3aXRjaCA9IG5ldyBYU0RTd2l0Y2goKQotICAgICAgewotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RXaWxkY2FyZChYU0RXaWxkY2FyZCBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhTRFdpbGRjYXJkQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNETW9kZWxHcm91cEFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYShYU0RTY2hlbWEgb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RTY2hlbWFBZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICBPYmplY3QgbyA9IHhzZFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLSAgICAgIEFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEFkYXB0ZXIpIG87Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0KQotICAgIHsKLSAgICAgIHJldHVybiBhZGFwdCh0YXJnZXQsIHRoaXMpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNEQmFzZUFkYXB0ZXIgLS0gYW4gYWJzdHJhY3QgYmFzZSBub2RlIGluIHRoZSBtb2RlbC4gQWxsIG90aGVyIG1vZGVsIG5vZGVzCi0gICAqIGFyZSBkZXJpdmVkIGZyb20gaXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFhTREJhc2VBZGFwdGVyIGV4dGVuZHMgQ01Ob2RlSW1wbAotICB7Ci0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3RJbXBsIGRvY3VtZW50YXRpb24gPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgZ2l2ZW4gZmFjdG9yeSBpcyB0aGUgZmFjdG9yeSBmb3IgdGhpcyBYU0QgYWRhcHRlcgotICAgICAqIG1vZGVsLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlIC0KLSAgICAgKiAgICAgICAgICBhIGZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaXMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhpcyBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IHhzZEFkYXB0ZXJGYWN0b3J5SW1wbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05TX1BSRUZJWF9RVUFMSUZJQ0FUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05JTExBQkxFKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1VTRVNfTE9DQUxfRUxFTUVOVF9ERUNMQVJBVElPTlMpCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fU09VUkNFKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fTEFOR1VBR0UpCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQ01ET0NVTUVOVCkKLSAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0lTX05BTUVfU1BBQ0VfQVdBUkUpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfU1BFQykgfHwgc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ05pbGxhYmxlJyBhdHRyaWJ1dGUuIFRoaXMgcmVwcmVzZW50cyB0aGUKLSAgICAgKiBuaWxsYWJsZSBpbmZvc2V0IHByb3BlcnR5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gQWxsIGRlcml2ZWQKLSAgICAgKiBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ05pbGxhYmxlJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuIFRoZSBkZWZhdWx0Ci0gICAgICogdmFsdWUgaXMgbnVsbDsgQWxsIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8KLSAgICAgKiBub3Qgd2FudCB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eQotICAgICAqIENNTm9kZUxpc3Q7IEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdAotICAgICAqIHdhbnQgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuIFJldHVybnMgbnVsbCBpZiB0aGUKLSAgICAgKiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9DTURPQ1VNRU5UKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RG9jdW1lbnRhdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9VU0VTX0xPQ0FMX0VMRU1FTlRfREVDTEFSQVRJT05TKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQm9vbGVhbi5UUlVFOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9JU19OQU1FX1NQQUNFX0FXQVJFKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQm9vbGVhbi5UUlVFOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OU19QUkVGSVhfUVVBTElGSUNBVElPTikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OSUxMQUJMRSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGlzTmlsbGFibGUoKSA/IHhzaURvY3VtZW50Lm5pbEF0dHJpYnV0ZSA6IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldEtleSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TUEVDKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0U3BlYygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgICAgICB7Ci0gICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudCgpOwotICAgICAgICAgIGlmIChjbURvY3VtZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uTWFwIG1hcCA9ICgoWFNEU2NoZW1hQWRhcHRlcikgY21Eb2N1bWVudCkuYW5ub3RhdGlvbk1hcDsKLSAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHNwZWMgPSBnZXRTcGVjKCk7Ci0gICAgICAgICAgICAgIGlmIChzcGVjICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBtYXAuZ2V0UHJvcGVydHkoZ2V0U3BlYygpLCBwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAgICAKLQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBbYXR0cmlidXRlXSB3aGljaCBhZmZlY3RzIHRoZSB0YXJnZXQKLSAgICAgKiBuYW1lc3BhY2Ugb2YgbG9jYWxseSBzY29wZWQgZmVhdHVyZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwuIEFsbAotICAgICAqIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlIGRlZmF1bHQKLSAgICAgKiB2YWx1ZS4gQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gW2F0dHJpYnV0ZV0uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBnZW5lcmFsIFhQYXRoIGV4cHJlc3Npb24gZm9yIHRoZSBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBnZW5lcmFsIFhQYXRoIGV4cHJlc3Npb24gZm9yIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlYygpCi0gICAgewotICAgICAgcmV0dXJuICIvLyIgKyBnZXROb2RlTmFtZSgpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNEU2NoZW1hQWRhcHRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnQuIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsCi0gICAqIG9iamVjdCAnU2NoZW1hJy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEU2NoZW1hQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01Eb2N1bWVudAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gICAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBuYW1lZE5vZGVNYXA7Ci0gICAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBlbnRpdHlOb2RlTWFwOwotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotICAgIHByb3RlY3RlZCBIYXNodGFibGUgc3Vic3RpdHV0aW9uR3JvdXBUYWJsZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RTY2hlbWEgLQotICAgICAqICAgICAgICAgIHRoZSBzY2hlbWEgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFNEU2NoZW1hQWRhcHRlcihYU0RTY2hlbWEgeHNkU2NoZW1hKQotICAgIHsKLSAgICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWxlbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICAvLyBTZWUgYnVpbGRDTURvY3VtZW50KCkgYWJvdmUuCi0gICAgICByZXR1cm4geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9UQVJHRVRfTkFNRVNQQUNFX1VSSSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9JTVBPUlRFRF9OQU1FU1BBQ0VfSU5GTykgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OQU1FU1BBQ0VfSU5GTykKLSAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0VMRU1FTlRfRk9STV9ERUZBVUxUKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0FOTk9UQVRJT05fTUFQKSB8fCBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIHByZWZpeCBpcyBnbG9iYWxseSByZXF1aXJlZCBmb3IgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhzZFNjaGVtYSAtCi0gICAgICogICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgcHJlZml4IGlzIGdsb2JhbGx5IHJlcXVpcmVkIGZvciBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByZWZpeFJlcXVpcmVkKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gICAgewotICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgICAgaWYgKHhzZFNjaGVtYS5pc1NldEVsZW1lbnRGb3JtRGVmYXVsdCgpKQotICAgICAgICByZXN1bHQgPSAhKHhzZFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKS5nZXRWYWx1ZSgpID09IFhTREZvcm0uUVVBTElGSUVEKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLiBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICogcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfVEFSR0VUX05BTUVTUEFDRV9VUkkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0lNUE9SVEVEX05BTUVTUEFDRV9JTkZPKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBnZXRJbXBvcnRlZE5hbWVzcGFjZUluZm8oeHNkU2NoZW1hLCBsaXN0KTsKLSAgICAgICAgcmVzdWx0ID0gbGlzdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTkFNRVNQQUNFX0lORk8pKQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICAgIGluZm8udXJpID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpbmZvLnByZWZpeCA9IGdldFByZWZpeCh4c2RTY2hlbWEsIGluZm8udXJpKTsKLSAgICAgICAgaW5mby5sb2NhdGlvbkhpbnQgPSBudWxsOyAvLyBub3RlIHRoYXQgdGhpcyBsb2NhdGlvbkhpbnQgaW5mbyBpcyBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSByb290IHhzZCBmaWxlCi0gICAgICAgIGluZm8uaXNQcmVmaXhSZXF1aXJlZCA9IGlzUHJlZml4UmVxdWlyZWQoeHNkU2NoZW1hKTsKLSAgICAgICAgbGlzdC5hZGQoaW5mbyk7Ci0gICAgICAgIGdldEltcG9ydGVkTmFtZXNwYWNlSW5mbyh4c2RTY2hlbWEsIGxpc3QpOwotICAgICAgICByZXN1bHQgPSBsaXN0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9DT01QTEVURV9OQU1FU1BBQ0VfSU5GTykpCi0gICAgICB7Ci0gICAgCSAgcmVzdWx0ID0gZ2V0QWxsTmFtZXNwYWNlSW5mbygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9FTEVNRU5UX0ZPUk1fREVGQVVMVCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0FOTk9UQVRJT05fTUFQKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gYW5ub3RhdGlvbk1hcDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImFsbEVsZW1lbnRzIikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldEFsbEVsZW1lbnRzKCk7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCJnZXRFbGVtZW50Rm9yVHlwZSMiKSkKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gcHJvcGVydHlOYW1lLmluZGV4T2YoIiMiKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIHByb3BlcnR5TmFtZS5sZW5ndGgoKSk7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0geHNkU2NoZW1hLnJlc29sdmVUeXBlRGVmaW5pdGlvbih0eXBlTmFtZSk7Ci0gICAgICAgIGlmICh0ZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTG9jYWxFbGVtZW50VmlzaXRvciBsb2NhbEVsZW1lbnRWaXNpdG9yID0gbmV3IExvY2FsRWxlbWVudFZpc2l0b3IoKTsKLSAgICAgICAgICBsb2NhbEVsZW1lbnRWaXNpdG9yLnZpc2l0VHlwZURlZmluaXRpb24odGQpOwotICAgICAgICAgIHJlc3VsdCA9IGxvY2FsRWxlbWVudFZpc2l0b3IuZ2V0Q01OYW1lZE5vZGVNYXAoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHYXRoZXIgaW5mb3JtYXRpb24gb24gbmFtZXNwYWNlcyB1c2VkIGluIGV4dGVybmFsIHJlZmVyZW5jZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRoZVhTRFNjaGVtYSAtCi0gICAgICogICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUKLSAgICAgKiBAcGFyYW0gbGlzdCAtCi0gICAgICogICAgICAgICAgdGhlIGxpc3Qgb2YgaW1wb3J0ZWQgbmFtZXNwYWNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRJbXBvcnRlZE5hbWVzcGFjZUluZm8oWFNEU2NoZW1hIHRoZVhTRFNjaGVtYSwgTGlzdCBsaXN0KQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGVYU0RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICAgICAgewotICAgICAgICAgIFhTREltcG9ydCB4SW1wb3J0ID0gKFhTREltcG9ydCkgY29udGVudDsKLSAgICAgICAgICBYU0RTY2hlbWEgaW1wb3J0ZWRYU0RTY2hlbWEgPSB4SW1wb3J0LmdldFJlc29sdmVkU2NoZW1hKCk7Ci0gICAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICAgICAgICBpbmZvLnVyaSA9IHhJbXBvcnQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgaW5mby5wcmVmaXggPSBnZXRQcmVmaXgoaW1wb3J0ZWRYU0RTY2hlbWEsIGluZm8udXJpKTsKLSAgICAgICAgICBpbmZvLmxvY2F0aW9uSGludCA9IHhJbXBvcnQuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgICBpZiAoaW1wb3J0ZWRYU0RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvLmlzUHJlZml4UmVxdWlyZWQgPSBpc1ByZWZpeFJlcXVpcmVkKGltcG9ydGVkWFNEU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbGlzdC5hZGQoaW5mbyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHNldCBvZiBuYW1lZCAodG9wLWxldmVsKSBlbGVtZW50IGRlY2xhcmF0aW9ucyBmb3IgdGhpcyBzY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzZXQgb2YgbmFtZWQgKHRvcC1sZXZlbCkgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICBpZiAobmFtZWROb2RlTWFwID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVkTm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGUgdGhhdCBpZiB3ZSBjYWxsIHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkKLSAgICAgICAgLy8gd2UgZ2V0ICdtb3JlJyBlbGVtZW50cyB0aGFuIHdlIHJlYWxseSB3YW50IHNpbmNlIHdlIGFsc28KLSAgICAgICAgLy8gZ2V0ICdpbXBvcnRlZCcgZWxlbWVudHMuICBCZWxvdyB3ZSB0ZXN0IHRvIGVuc3VyZSB0aGUgZWxlbWVudHMKLSAgICAgICAgLy8gYWN0dWFsbHkgaGF2ZSB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBzY2hlbWEuCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSkgOiBlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBnZXRBZGFwdGVyKGVkKTsKLSAgICAgICAgICAgIG5hbWVkTm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoYWRhcHRlci5nZXROb2RlTmFtZSgpLCBhZGFwdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lZE5vZGVNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYnVpbHQtaW4gZW50aXR5IGRlY2xhcmF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBidWlsdC1pbiBlbnRpdHkgZGVjbGFyYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpCi0gICAgewotICAgICAgaWYgKGVudGl0eU5vZGVNYXAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZW50aXR5Tm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICAgICAgLy8gYWRkIHRoZSBidWlsdCBpbiBlbnRpdHkgZGVjbGFyYXRpb25zCi0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJhbXAiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImFtcCIsICImIikpOwotICAgICAgICBlbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgibHQiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImx0IiwgIjwiKSk7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJndCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiZ3QiLCAiPiIpKTsKLSAgICAgICAgZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoInF1b3QiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoInF1b3QiLCAiXCIiKSk7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJhcG9zIiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJhcG9zIiwgIiciKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZW50aXR5Tm9kZU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBET0NVTUVOVDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgbnVsbC4gISEhIFdoeSBhcmUgd2Ugbm90IGltcGxlbWVudGluZyB0aGlzPz8/PyBAcmV0dXJuIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEFsbEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICBDTU5hbWVkTm9kZU1hcEltcGwgbWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgbWFwLnB1dChlZCk7ICAgICAgICAgICAKLSAgICAgICAgYWRkTG9jYWxFbGVtZW50RGVmaW5pdGlvbnMobWFwLCBlZCk7ICAgICAgICAgICAgICAKLSAgICAgIH0gICAgIAotICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTG9jYWxFbGVtZW50RGVmaW5pdGlvbnMoQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIENNTmFtZWROb2RlTWFwIGxvY2FsRWxlbWVudE1hcCA9IHBhcmVudEVsZW1lbnREZWNsYXJhdGlvbi5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsb2NhbEVsZW1lbnRNYXAuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24paS5uZXh0KCk7Ci0gICAgICAgIGlmIChtYXAuZ2V0TmFtZWRJdGVtKGVkLmdldE5vZGVOYW1lKCkpID09IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIG1hcC5wdXQoZWQpOyAgICAgICAgCi0gICAgICAgICAgYWRkTG9jYWxFbGVtZW50RGVmaW5pdGlvbnMobWFwLCBlZCk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgICAgICAgIAotICAgIH0gCi0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgTGlzdCBvZiBOYW1lc3BhY2VJbmZvIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgZ2l2ZW4gc2NoZW1hIAotICAgICAqIGFuZCB0aGUgdGFyZ2V0IG5hbWVzcGFjZXMgb2YgYWxsIGl0cyByZWN1cnNpdmVseSBpbXBvcnRlZC9pbmNsdWRlZCByZWZlcmVuY2VkIHNjaGVtYXMuIEFsbCBuYW1lc3BhY2UKLSAgICAgKiBwcmVmaXhlcyBpbiB0aGUgbGlzdCBhcmUgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUuIFByZWZpeCBjb2xsaXRpb25zIGFyZSByZXNvbHZlZCBieSBjb25jYXRlbmF0aW5nCi0gICAgICogaW50ZWdlciBudW1iZXJzIHRvIGVhY2ggcmVwZWF0ZWQgcHJlZml4IGZvdW5kIGkuZS4gdG5zLCB0bnMxLCB0bnMyLi4uCi0gICAgICogQWxsIHNjaGVtYSBsb2NhdGlvbnMgaW4gdGhlIGxpc3QgYXJlIGZvcm1hdGVkIGFzIGVuY29kZWQgVVJJcyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gc2NoZW1hLgotICAgICAqIFNjaGVtYXMgdGhhdCBhcmUgaW1wb3J0ZWQvaW5jbHVkZWQgYnV0IG5vdCByZWZlcmVuY2VkIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgbGlzdC4KLSAgICAgKiBAcmV0dXJuIExpc3Qgb2YgTmFtZXNwYWNlSW5mbyBvYmplY3RzCi0gICAgICogCi0gICAgICovCi0JcHVibGljIExpc3QgZ2V0QWxsTmFtZXNwYWNlSW5mbygpIHsKLQkJTGlzdCBuYW1lc3BhY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHJlc291cmNlcyAgPSB4c2RTY2hlbWEuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJSXRlcmF0b3IgaSA9IHJlc291cmNlcy5pdGVyYXRvcigpOwotCQl3aGlsZShpLmhhc05leHQoKSkgewotCQkJWFNEUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKFhTRFJlc291cmNlSW1wbCkgaS5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJWFNEU2NoZW1hIHNjaGVtYSA9IHJlc291cmNlLmdldFNjaGVtYSgpOwotCQkJCWlmKCFpc0RhdGFJbk5hbWVzcGFjZUxpc3QobmFtZXNwYWNlTGlzdCwgMCwgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgewotCQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotCQkJCQlpbmZvLnVyaSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCQkJaW5mby5pc1ByZWZpeFJlcXVpcmVkID0gaXNQcmVmaXhSZXF1aXJlZChzY2hlbWEpOwotCQkJCQlpbmZvLnByZWZpeCA9IGdldFByZWZpeChzY2hlbWEsc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCQkJaWYoImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIuZXF1YWxzKGluZm8udXJpKSkgewotICAgIAkJCQkJaW5mby5wcmVmaXggPSAieG1sIjsKLSAgICAJCQkJfSBlbHNlIGlmKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zIi5lcXVhbHMoaW5mby51cmkpKSB7Ci0gICAgCQkJCQlpbmZvLnByZWZpeCA9ICJ4bWxucyI7Ci0gICAgCQkJCX0gZWxzZSB7Ci0gICAgCQkJCQlpZihpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpICE9ICIiKSB7Ci0JICAgIAkJCQkJaW50IG4gPSAxOwotCSAgICAJICAgIAkJCWlmKGluZm8ucHJlZml4ID09IG51bGwgfHwgaW5mby5wcmVmaXguZXF1YWxzKCIiKSkgewotCSAgICAJICAgIAkJCQlpbmZvLnByZWZpeCA9ICJwIjsKLQkgICAgCSAgICAJCQl9Ci0JICAgIAkgICAgCQkJU3RyaW5nIHByZWZpeCA9IGluZm8ucHJlZml4OwotCSAgICAJICAgIAkJCXdoaWxlKGlzRGF0YUluTmFtZXNwYWNlTGlzdChuYW1lc3BhY2VMaXN0LCAxLCBpbmZvLnByZWZpeCkpIHsKLQkgICAgCSAgICAJCQkJaW5mby5wcmVmaXggPSBwcmVmaXggKyBuKys7Ci0JICAgIAkgICAgCQkJfQotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0JICAgIAkJCVVSSSByZWxhdGl2ZSA9IFVSSS5jcmVhdGVVUkkoeHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCksIHRydWUpOwotCQkJCQlVUkkgYWJzb2x1dGUgPSBVUkkuY3JlYXRlVVJJKHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpLCB0cnVlKTsKLQkJCQkJVVJJIHJlc29sdmVkUmVsYXRpdmUgPSBhYnNvbHV0ZS5kZXJlc29sdmUocmVsYXRpdmUpOwotCQkJCQlpbmZvLmxvY2F0aW9uSGludCA9IHJlc29sdmVkUmVsYXRpdmUudG9TdHJpbmcoKTsKLQkgICAgCQkJbmFtZXNwYWNlTGlzdC5hZGQoaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lc3BhY2VMaXN0OwkKLQl9Ci0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIGZvciBhIGdpdmVuIHZhbHVlIGluIGEgbGlzdCBvZiBuYW1lc3BhY2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VMaXN0OglMaXN0IG9mIE5hbWVzcGFjZUluZm8gb2JqZWN0cwotICAgICAqIEBwYXJhbSBkYXRhOgkJCQlpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgZGF0YSBpbiB0aGUgbmFtZXNwYWNlIGFzIGZvbGxvd3M6Ci0gICAgICogCQkJCQkJCQkwOgl1cmkKLSAgICAgKiAJCQkJCQkJCTE6CXByZWZpeAotICAgICAqIAkJCQkJCQkJMjoJbG9jYXRpb25IaW50Ci0gICAgICogQHBhcmFtIHZhbHVlCQkJCVN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZSBmb3Igc2VhcmNoCi0gICAgICogQHJldHVybgkJCQkJdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RhdGFJbk5hbWVzcGFjZUxpc3QoTGlzdCBuYW1lc3BhY2VMaXN0LCBpbnQgZGF0YSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChuYW1lc3BhY2VMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlOYW1lc3BhY2VJbmZvIG5hbWVzcGFjZUluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQkJc3dpdGNoKGRhdGEpIHsKLQkJCQkJY2FzZSAwOglpZiAobmFtZXNwYWNlSW5mby51cmkgIT0gbnVsbCAmJiBuYW1lc3BhY2VJbmZvLnVyaS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQljYXNlIDE6CWlmIChuYW1lc3BhY2VJbmZvLnByZWZpeCAhPSBudWxsICYmIG5hbWVzcGFjZUluZm8ucHJlZml4LmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCWNhc2UgMjoJaWYgKG5hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50ICE9IG51bGwgJiYgbmFtZXNwYWNlSW5mby5sb2NhdGlvbkhpbnQuZXF1YWxzKHZhbHVlKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNEQXR0cmlidXRlVXNlQWRhcHRlciBpbXBsZW1lbnRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24uIEEgcmVwcmVzZW50YXRpb24KLSAgICogb2YgdGhlIG1vZGVsIG9iamVjdCAnQXR0cmlidXRlIFVzZScuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24KLSAgewotICAgIC8vIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgWE1MIFNjaGVtYSBub2RlCi0gICAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGVVc2U7Ci0gICAgLy8gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICBwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IG5ldyBEYXRhVHlwZUltcGwoKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RBdHRyaWJ1dGVVc2UgLQotICAgICAqICAgICAgICAgIHRoZSBYTUwgU2NoZW1hIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIoWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZVVzZSkKLSAgICB7Ci0gICAgICB0aGlzLnhzZEF0dHJpYnV0ZVVzZSA9IHhzZEF0dHJpYnV0ZVVzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RBdHRyaWJ1dGVVc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGdlbmVyYWwgWFBhdGggZXhwcmVzc2lvbiBmb3IgdGhlIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGdlbmVyYWwgWFBhdGggZXhwcmVzc2lvbiBmb3IgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTcGVjKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIi8vQCIgKyBnZXRBdHRyTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEFUVFJJQlVURV9ERUNMQVJBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub2RlLiBTaW1pbGFyIHRvIGdldEF0dHJOYW1lKCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0QXR0ck5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRFbnVtQXR0ciBtZXRob2QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5FbnVtZXJhdGlvbgotICAgICAqIEBkZXByZWNhdGVkIC0tIHRvIGJlIHJlcGxhY2VkIGluIGZ1dHVyZSB3aXRoIGFkZGl0aW9uYWwgQ01EYXRhVHlwZQotICAgICAqICAgICAgICAgICAgIG1ldGhvZHMgKGN1cnJlbnRseSBmb3VuZCBvbiBDTURhdGFUeXBlSGVscGVyKQotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpCi0gICAgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuIFNpbWlsYXIgdG8gZ2V0Tm9kZU5hbWUoKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIGRhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpCi0gICAgewotICAgICAgcmV0dXJuIGRhdGFUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzYWdlIGNvbnN0cmFpbnQgZm9yIHRoaXMgYXR0cmlidXRlLiBUaGUgdXNhZ2VzIGFyZSBkZWZpbmVkCi0gICAgICogaW4gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBjbGFzcyAoT1BUSU9OQUwsIFJFUVVJUkVELCBGSVhFRCBvcgotICAgICAqIFBST0hJQklURUQpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVzYWdlIGNvbnN0cmFpbnQgZm9yIHRoaXMgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VXNhZ2UoKQotICAgIHsKLSAgICAgIGludCB1c2VLaW5kID0gT1BUSU9OQUw7Ci0gICAgICBzd2l0Y2ggKHhzZEF0dHJpYnV0ZVVzZS5nZXRVc2UoKS5nZXRWYWx1ZSgpKQotICAgICAgewotICAgICAgICBjYXNlIFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Lk9QVElPTkFMIDogewotICAgICAgICAgIHVzZUtpbmQgPSBPUFRJT05BTDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5LlBST0hJQklURUQgOiB7Ci0gICAgICAgICAgdXNlS2luZCA9IFBST0hJQklURUQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5SRVFVSVJFRCA6IHsKLSAgICAgICAgICB1c2VLaW5kID0gUkVRVUlSRUQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB1c2VLaW5kOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gW2F0dHJpYnV0ZV0gd2hpY2ggYWZmZWN0cyB0aGUgdGFyZ2V0Ci0gICAgICogbmFtZXNwYWNlIG9mIGxvY2FsbHkgc2NvcGVkIGZlYXR1cmVzLiBJZiB0aGUgZm9ybSBpcyBub3Qgc2V0IG9uIHRoaXMKLSAgICAgKiBhdHRyaWJ1dGUsIHRoZW4gc2VlIGlmIHRoZXJlIGlzIGEgZ2xvYmFsbHkgZGVmaW5lZCBkZWZhdWx0LiBAcmV0dXJuIHRoZQotICAgICAqIHZhbHVlIG9mIHRoZSBmb3JtIFthdHRyaWJ1dGVdLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZm9ybSA9IG51bGw7Ci0gICAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmdldENvbnRlbnQoKSAhPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSkKLSAgICAgIHsKLSAgICAgIAlmb3JtID0gICJxdWFsaWZpZWQiOwotICAgICAgfQkKLSAgICAgIGVsc2UgaWYgKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb250ZW50KCkuaXNTZXRGb3JtKCkpCi0gICAgICB7Ci0gICAgICAgIGZvcm0gPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0Q29udGVudCgpLmdldEZvcm0oKS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICBmb3JtID0gc2NoZW1hLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkuZ2V0TmFtZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZvcm07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZSBmaXJzdAotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlUmVmID0geHNkQXR0cmlidXRlVXNlLmdldENvbnRlbnQoKTsKLSAgICAgIGlmICh4c2RBdHRyaWJ1dGVSZWYgIT0gbnVsbCAmJiB4c2RBdHRyaWJ1dGVSZWYuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgewotICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaXQgaGFzIGFubm90YXRpb25zCi0gICAgICAgIGJvb2xlYW4gcmVmSGFzRG9jdW1lbnRhdGlvbiA9IGZhbHNlOwotICAgICAgICBYU0RBbm5vdGF0aW9uIHJlZkFubm90YXRpb24gPSB4c2RBdHRyaWJ1dGVSZWYuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgICBpZiAocmVmQW5ub3RhdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGRvY3VtZW50YXRpb24KLSAgICAgICAgICBpZiAoIXJlZkFubm90YXRpb24uZ2V0VXNlckluZm9ybWF0aW9uKCkuaXNFbXB0eSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlZkhhc0RvY3VtZW50YXRpb24gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVmSGFzRG9jdW1lbnRhdGlvbikKLSAgICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMocmVmQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIE90aGVyd2lzZSBwcm9jZWVkIHdpdGggZ2V0dGluZyB0aGUgZG9jdW1lbnRhdGlvbiBhcyB1c3VhbAotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlRGVjbGFyYXRpb24gPSAgeHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7ICAgICAgCi0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoeHNkQXR0cmlidXRlVXNlLmdldFNjaGVtYSgpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogWFNEQXR0cmlidXRlVXNlQWRhcHRlci5EYXRhVHlwZUltcGwgQW4gaW5uZXIgY2xhc3MgdG8gaG9sZCB0eXBlCi0gICAgICogaW5mb3JtYXRpb24gZm9yIHRoaXMgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBEYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlCi0gICAgewotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLiBTYW1lIGFzIGdldERhdGFUeXBlTmFtZSgpLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXREYXRhVHlwZU5hbWUoKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgICAqIAotICAgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkLgotICAgICAgICovCi0gICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgICAgewotICAgIAkgIHJldHVybiAoUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVC5lcXVhbHMocHJvcGVydHlOYW1lKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLiBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICAgKiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgICogCi0gICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAgICovCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICB7Ci0gICAgCSAgaWYoUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVC5lcXVhbHMocHJvcGVydHlOYW1lKSkKLQkJICAJcmV0dXJuIGdldFdoaXRlU3BhY2VGYWNldFZhbHVlKCk7Ci0gICAgCSAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuIFNhbWUgYXMgZ2V0Tm9kZU5hbWUoKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2MgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBzYy5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiB0eXBlTmFtZSAhPSBudWxsID8gdHlwZU5hbWUgOiAic3RyaW5nIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGNvbnN0cmFpbnQ6IG5vbmUsIGRlZmF1bHQgb3IgZml4ZWQuIFRoZSBraW5kcyBhcmUKLSAgICAgICAqIGRlZmluZWQgaW4gQ01EYXRhVHlwZSBjbGFzcyAoSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVEIG9yCi0gICAgICAgKiBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQpLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBraW5kIG9mIGNvbnN0cmFpbnQ6IG5vbmUsIGRlZmF1bHQgb3IgZml4ZWQuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpCi0gICAgICB7Ci0gICAgICAgIGludCByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0gICAgICAgIGlmICh4c2RBdHRyaWJ1dGVVc2UuaXNTZXRDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmdldENvbnN0cmFpbnQoKS5nZXRWYWx1ZSgpID09IFhTRENvbnN0cmFpbnQuREVGQVVMVCkKLSAgICAgICAgICAgIHJlc3VsdCA9IElNUExJRURfVkFMVUVfREVGQVVMVDsKLSAgICAgICAgICBlbHNlIGlmICh4c2RBdHRyaWJ1dGVVc2UuZ2V0Q29uc3RyYWludCgpLmdldFZhbHVlKCkgPT0gWFNEQ29uc3RyYWludC5GSVhFRCkKLSAgICAgICAgICAgIHJlc3VsdCA9IElNUExJRURfVkFMVUVfRklYRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmlzU2V0Q29uc3RyYWludCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0geHNkQXR0cmlidXRlVXNlLmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIHRoZSBhdHRyaWJ1dGUgdHlwZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIHRoZSBhdHRyaWJ1dGUgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclR5cGUoZ2V0WFNEVHlwZSgpKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBHZW5lcmF0ZSBhIHZhbGlkIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIGJhc2VkIG9uIGl0cyB0eXBlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIGEgdmFsaWQgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgYmFzZWQgb24gaXRzIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICByZXR1cm4gWFNEVHlwZVV0aWwuZ2V0SW5zdGFuY2VWYWx1ZShhdHRyLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAgICovCi0gICAgICBwcm90ZWN0ZWQgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZSgpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qKgotICAgICAgICogT2J0YWlucyB0aGUgd2hpdGVzcGFjZSBmYWNldCBvZiB0aGUgWFNEIHNpbXBsZSB0eXBlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIFRoZSB3aGl0ZXNwYWNlIGZhY2V0IGZvciB0aGUgWFNEIHR5cGUuIElmIG5vbmUgaXMKLSAgICAgICAqIGRlZmluZWQsIG9yIGl0IGlzIGEgY29tcGxleCB0eXBlLCBudWxsLgotICAgICAgICovCi0gICAgICBwcml2YXRlIFN0cmluZyBnZXRXaGl0ZVNwYWNlRmFjZXRWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGRlZiA9IGdldFhTRFR5cGUoKS5nZXRTaW1wbGVUeXBlKCk7Ci0gICAgICAgIHJldHVybiAoZGVmICE9IG51bGwgJiYgZGVmLmdldEVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCgpICE9IG51bGwpID8gZGVmLmdldEVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCgpLmdldExleGljYWxWYWx1ZSgpIDogbnVsbCA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbCBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uLiBUaGlzIGlzIHRoZQotICAgKiBiYXNlIGNsYXNzIGZvciBYU0RFbGVtZW50RGVjbGFyYXRpb24gYW5kIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsLgotICAgKiAKLSAgICogQWJzdHJhY3QgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZTogcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRLZXkoKTsgcHVibGljCi0gICAqIGFic3RyYWN0IE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKTsgcHVibGljIGFic3RyYWN0Ci0gICAqIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsgcHVibGljIGFic3RyYWN0Ci0gICAqIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKTsgcHVibGljIGFic3RyYWN0IExpc3QgZ2V0WFNJVHlwZXMoKTsgcHVibGljCi0gICAqIGFic3RyYWN0IENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nCi0gICAqIHVyaVF1YWxpZmllZFR5cGVOYW1lKTsgcHVibGljIGFic3RyYWN0IENNTm9kZSBnZXREZWZpbml0aW9uKCk7IHB1YmxpYwotICAgKiBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmaW5pdGlvbkluZm8oKTsgcHVibGljIGFic3RyYWN0IENNTm9kZUxpc3RJbXBsCi0gICAqIGdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEVsZW1lbnREZWNsYXJhdGlvbkJhc2VJbXBsIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbgotICB7Ci0gICAgcHJvdGVjdGVkIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBuZXcgRGF0YVR5cGVJbXBsKCk7Ci0gICAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwIG5hbWVkTm9kZU1hcDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEVMRU1FTlRfREVDTEFSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gVGhlIHNhbWUgYXMgZ2V0RWxlbWVudE5hbWUoKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRFbGVtZW50TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50LiBUaGUgc2FtZSBhcyBnZXROb2RlTmFtZSgpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKQotICAgIHsKLSAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfWFNJVFlQRVMpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVSSVZFRF9FTEVNRU5UX0RFQ0xBUkFUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1NVQlNUSVRVVElPTl9HUk9VUCkKLSAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0FCU1RSQUNUKSB8fCBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldEtleSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpCi0gICAgewotICAgICAgQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEVHlwZSgpOwotICAgICAgZ2V0QXR0cmlidXRlcyhtYXAsIHRkKTsKLSAgICAgIGFkZFhTSVR5cGVBdHRyaWJ1dGUobWFwKTsKLSAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2F0aGVyIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1hcCAtCi0gICAgICogICAgICAgICAgdXNlZCBmb3IgcmV0dXJuaW5nIHRoZSBzZXQgb2YgYXR0cmlidXRlcy4KLSAgICAgKiBAcGFyYW0geHNkVHlwZURlZmluaXRpb24gLQotICAgICAqICAgICAgICAgIHRoZSB0eXBlIGRlZmluaXRpb24gZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRBdHRyaWJ1dGVzKENNTmFtZWROb2RlTWFwSW1wbCBtYXAsIFhTRFR5cGVEZWZpbml0aW9uIHhzZFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGlmICh4c2RUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ZCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHhzZFR5cGVEZWZpbml0aW9uOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjdGQuZ2V0QXR0cmlidXRlVXNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKSBpLm5leHQoKTsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQXR0cmlidXRlVXNlQWRhcHRlcikgZ2V0QWRhcHRlcih4c2RBdHRyaWJ1dGVVc2UpOwotICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5nZXROb2RlTmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWFwLmdldEhhc2h0YWJsZSgpLnB1dChhZGFwdGVyLmdldE5vZGVOYW1lKCksIGFkYXB0ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkKLSAgICB7Ci0gICAgICBDTUNvbnRlbnQgcmVzdWx0ID0gbnVsbDsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEVHlwZSgpOwotICAgICAgaWYgKHRkIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBEZXJpdmVkQ2hpbGRWaXNpdG9yIGRjdiA9IG5ldyBEZXJpdmVkQ2hpbGRWaXNpdG9yKHRkKTsKLSAgICAgICAgZGN2LnZpc2l0VHlwZURlZmluaXRpb24odGQpOwotICAgICAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZGN2LmdldENoaWxkTm9kZUxpc3QoKTsKLSAgICAgICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBDTUdyb3VwSW1wbChub2RlTGlzdCwgQ01Hcm91cC5TRVFVRU5DRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gKENNQ29udGVudCkgbm9kZUxpc3QuaXRlbSgwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGUgb2YgdGhpcyBlbGVtZW50LiBUaGUgY29udGVudCB0eXBlIGlzIGRlZmluZWQgaW4KLSAgICAgKiBDTUVsZW1lbnREZWNsYXJhdGlvbiAoQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSBvciBDREFUQSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCB0eXBlIG9mIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkKLSAgICB7Ci0gICAgICBpbnQgY29udGVudFR5cGUgPSBFTVBUWTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEVHlwZSgpOwotICAgICAgaWYgKHRkIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IHRkLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKHR5cGVOYW1lICE9IG51bGwgJiYgdHlwZU5hbWUuZXF1YWxzKCJhbnlUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250ZW50VHlwZSA9IEFOWTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjb250ZW50VHlwZSA9IFBDREFUQTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodGQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdGQpLmdldENvbnRlbnRUeXBlQ2F0ZWdvcnkoKTsKLSAgICAgICAgaWYgKGNhdGVnb3J5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzd2l0Y2ggKGNhdGVnb3J5LmdldFZhbHVlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBYU0RDb250ZW50VHlwZUNhdGVnb3J5LkVMRU1FTlRfT05MWSA6Ci0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gRUxFTUVOVDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkuRU1QVFkgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IEVNUFRZOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWFNEQ29udGVudFR5cGVDYXRlZ29yeS5NSVhFRCA6Ci0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gTUlYRUQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYU0RDb250ZW50VHlwZUNhdGVnb3J5LlNJTVBMRSA6Ci0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gUENEQVRBOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkKLSAgICB7Ci0gICAgICBDTURhdGFUeXBlIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpbnQgY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotICAgICAgYm9vbGVhbiBoYXNEYXRhVHlwZSA9IGNvbnRlbnRUeXBlID09IFBDREFUQSB8fCBjb250ZW50VHlwZSA9PSBNSVhFRDsKLSAgICAgIGlmIChoYXNEYXRhVHlwZSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZGF0YVR5cGU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWluT2NjdXJzKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAgICAgKiAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhPY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1heE9jY3VycyhnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IGRlY2xhcmF0aW9uIGlmIHRoaXMgaXMgYW4gZWxlbWVudAotICAgICAqIHJlZmVyZW5jZS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgaXRzZWxmLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ01Ob2RlIGdldERlZmluaXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGdsb2JhbCBvcgotICAgICAqIGxvY2FsLiBSZXR1cm5zIG51bGwgaWYgdGhpcyBpcyBhbiBlbGVtZW50IHJlZmVyZW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiAgICAgICAgIGxvY2FsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmaW5pdGlvbkluZm8oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnRzIGxvY2FsIHRvIHRoaXMgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50cyBsb2NhbCB0byB0aGlzIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKQotICAgIHsKLSAgICAgIGlmIChuYW1lZE5vZGVNYXAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTG9jYWxFbGVtZW50VmlzaXRvciBsb2NhbEVsZW1lbnRWaXNpdG9yID0gbmV3IExvY2FsRWxlbWVudFZpc2l0b3IoKTsKLSAgICAgICAgbG9jYWxFbGVtZW50VmlzaXRvci52aXNpdFR5cGVEZWZpbml0aW9uKGdldFhTRFR5cGUoKSk7Ci0gICAgICAgIG5hbWVkTm9kZU1hcCA9IGxvY2FsRWxlbWVudFZpc2l0b3IuZ2V0Q01OYW1lZE5vZGVNYXAoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lZE5vZGVNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLiBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICogcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RGVmaW5pdGlvbkluZm8oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldERlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfWFNJVFlQRVMpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRYU0lUeXBlcygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoUFJPUEVSVFlfREVSSVZFRF9FTEVNRU5UX0RFQ0xBUkFUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gcHJvcGVydHlOYW1lLmluZGV4T2YoIj0iKTsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgIHJlc3VsdCA9IGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24odXJpUXVhbGlmaWVkVHlwZU5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1NVQlNUSVRVVElPTl9HUk9VUCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVBfVkFMVUUpKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0U3Vic3RpdHV0aW9uR3JvdXBWYWx1ZSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9BQlNUUkFDVCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRBYnN0cmFjdCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ05pbGxhYmxlJyBhdHRyaWJ1dGUuIFRoaXMgcmVwcmVzZW50cyB0aGUKLSAgICAgKiBuaWxsYWJsZSBpbmZvc2V0IHByb3BlcnR5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ05pbGxhYmxlJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpCi0gICAgewotICAgICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzU2V0TmlsbGFibGUoKSkKLSAgICAgICAgcmV0dXJuIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzTmlsbGFibGUoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzdWJzdGl0dXRpb25Hcm91cCBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgc3Vic3RpdHV0aW9uR3JvdXAgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWJzdGl0dXRpb25Hcm91cFZhbHVlKCkKLSAgICB7Ci0gICAgCVhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIAlpZih4c2RFbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCkKLSAgICAJewotICAgIAkJRWxlbWVudCBlbGVtZW50ID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnQoKTsKLSAgICAJCWlmKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAJCXsKLSAgICAJCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzICdBYnN0cmFjdCcuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGlzICdBYnN0cmFjdCcuCi0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gZ2V0QWJzdHJhY3QoKQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc0Fic3RyYWN0KCk7Ci0gICAgICAvLyBUT0RPLi4uIGhvdyBkbyB3ZSBoYW5kbGUgZWxlbWVudHMgd2l0aCBhYnN0cmFjdCB0eXBlJ3MgPwotICAgICAgcmV0dXJuIHJlc3VsdCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgIFhTREFubm90YXRpb24gYW5ub3RhdGlvbiA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICAKLSAgICAgIC8vIE5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4gIEp1c3QgYmVjYXVzZQotICAgICAgLy8gdGhlcmUgaXMgYW4gYW5ub3RhdGlvbiBlbGVtZW50IGRvZXNuJ3QgbWVhbiB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQgaXMKLSAgICAgIC8vIGFsc28gdGhlcmUsIGFzIGl0IGNvdWxkIGNvbnRhaW4ganVzdCBhcHBpbmZvIGVsZW1lbnRzLgotICAgICAgCi0gICAgICBib29sZWFuIGhhc0RvY3VtZW50YXRpb24gPSBmYWxzZTsKLSAgICAgIAotICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgIAkgIGlmICghYW5ub3RhdGlvbi5nZXRVc2VySW5mb3JtYXRpb24oKS5pc0VtcHR5KCkpIHsKLSAgICAJCSAgaGFzRG9jdW1lbnRhdGlvbiA9IHRydWU7Ci0gICAgCSAgfQotICAgICAgfQotCi0gICAgICAvLyBUaGUgZWxlbWVudCBtYXkgbm90IGhhdmUgYW5ub3RhdGlvbiBhbmQgaWYgaXQgaXMgcmVmZXJlbmNlZAotICAgICAgLy8gY2hlY2sgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIGZvciB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICBpZiAoaGFzRG9jdW1lbnRhdGlvbiA9PSBmYWxzZSkgewotICAgICAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkgewotICAgICAgICAJICBhbm5vdGF0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25zKGFubm90YXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0eXBlIG5hbWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0IGdldFhTSVR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdXJpIHF1YWxpZmllZAotICAgICAqIHR5cGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpUXVhbGlmaWVkVHlwZU5hbWUgLQotICAgICAqICAgICAgICAgIGEgdXJpIHF1YWxpZmllZCB0eXBlIG5hbWUKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFhTSVR5cGVBdHRyaWJ1dGUoQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBnZXRYU0lUeXBlcygpOwotICAgICAgaW50IGxpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgICBpZiAobGlzdFNpemUgPiAxKQotICAgICAgewotICAgICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gbmV3IENNRGF0YVR5cGVJbXBsKCJ0eXBlTmFtZXMiLCAoU3RyaW5nKSBudWxsKTsKLSAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgYXR0cmlidXRlID0gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKCJ0eXBlIiwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCwgZGF0YVR5cGUpOwotICAgICAgICBhdHRyaWJ1dGUuc2V0Q01Eb2N1bWVudCh4c2lEb2N1bWVudCk7Ci0gICAgICAgIGF0dHJpYnV0ZS5zZXRQcmVmaXhRdWFsaWZpY2F0aW9uKHRydWUpOwotICAgICAgICBhdHRyaWJ1dGUuc2V0WFNJVHlwZXMobGlzdCk7Ci0KLSAgICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjU0NDcKLSAgICAgICAgLy8gRm9yIG5vdywgZG9uJ3QgY2xvYmJlciB0aGUgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgJ3R5cGUnIG5hbWUgZGVmaW5lZCBpbiB0aGUgZ3JhbW1hcgotICAgICAgICAvLyB3aXRoIHRoZSB4c2k6dHlwZSBhdHRyaWJ1dGUuICBUaGUgaW1wYWN0IG9mIHRoaXMgY2hhbmdlIHdpbGwgYmUgdGhhdCBmb3IgY29udGVudCBhc3Npc3QsIHRoZSBub24teHNpCi0gICAgICAgIC8vIHR5cGUgYXR0cmlidXRlIHdpbGwgYmUgcHJlc2VudGVkOyB0aGUgZ2VuZXJhdGVkIFhNTCBmcm9tIFhTRCB3aWxsIGhhdmUgdGhpcyBhdHRyaWJ1dGUgY3JlYXRlZCwgYW5kCi0gICAgICAgIC8vIG5vdCB0aGUgeHNpOnR5cGUgYXR0cmlidXRlLgotICAgICAgICBIYXNodGFibGUgaGFzaFRhYmxlID0gbWFwLmdldEhhc2h0YWJsZSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpOwotICAgICAgICBpZiAoIWhhc2hUYWJsZS5jb250YWluc0tleShuYW1lKSkKLSAgICAgICAgICBoYXNoVGFibGUucHV0KG5hbWUsIGF0dHJpYnV0ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgeyAgICAgIAotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCk7Ci0gICAgICBpZiAoc2NoZW1hID09IG51bGwpCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgZWxzZSAgCi0gICAgICAgIHJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcihzY2hlbWEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LiBUaGUgZ3JvdXAgY29uc2lzdHMgb2Y6Ci0gICAgICogMS4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXRzZWxmIDIuIGFuZCBhbnkgZWxlbWVudCBkZWNsYXJhdGlvbiB0aGF0IGhhcwotICAgICAqIGEge3N1YnN0aXR1dGlvbiBncm91cCBhZmZpbGlhdGlvbn0gaW4gdGhlIGdyb3VwCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IENNTm9kZUxpc3RJbXBsIGdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0gICAgLyoKLSAgICAgKiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLkRhdGFUeXBlSW1wbCBBbiBpbm5lciBjbGFzcyB0byBob2xkIHR5cGUKLSAgICAgKiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBEYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlCi0gICAgewotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4gU2FtZSBhcyBnZXREYXRhVHlwZU5hbWUoKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGNsYXNzLgotICAgICAgICogCi0gICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoUFJPUEVSVFlfV0hJVEVTUEFDRV9GQUNFVC5lcXVhbHMocHJvcGVydHlOYW1lKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLiBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICAgKiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgICogCi0gICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAgICovCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICB7Ci0gICAgICAgIGlmKFBST1BFUlRZX1dISVRFU1BBQ0VfRkFDRVQuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0gICAgICAgIAlyZXR1cm4gZ2V0V2hpdGVTcGFjZUZhY2V0VmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLiBTYW1lIGFzIGdldE5vZGVOYW1lKCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKQotICAgICAgewotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdGQgPSBnZXRYU0RUeXBlKCkuZ2V0U2ltcGxlVHlwZSgpOwotICAgICAgICBpZiAoc3RkICE9IG51bGwpCi0gICAgICAgICAgdHlwZU5hbWUgPSBzdGQuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gdHlwZU5hbWUgIT0gbnVsbCA/IHR5cGVOYW1lIDogInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGNvbnN0cmFpbnQ6IG5vbmUsIGRlZmF1bHQgb3IgZml4ZWQuIFRoZSBraW5kcyBhcmUKLSAgICAgICAqIGRlZmluZWQgaW4gQ01EYXRhVHlwZSBjbGFzcyAoSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVEIG9yCi0gICAgICAgKiBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQpLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBraW5kIG9mIGNvbnN0cmFpbnQ6IG5vbmUsIGRlZmF1bHQgb3IgZml4ZWQuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpCi0gICAgICB7Ci0gICAgICAgIGludCByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0gICAgICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc1NldENvbnN0cmFpbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRDb25zdHJhaW50KCkuZ2V0VmFsdWUoKSA9PSBYU0RDb25zdHJhaW50LkRFRkFVTFQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQ7Ci0gICAgICAgICAgZWxzZSBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0Q29uc3RyYWludCgpLmdldFZhbHVlKCkgPT0gWFNEQ29uc3RyYWludC5GSVhFRCkKLSAgICAgICAgICAgIHJlc3VsdCA9IElNUExJRURfVkFMVUVfRklYRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuaXNTZXRDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JUeXBlKGdldFhTRFR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTRFR5cGVVdGlsLmdldEluc3RhbmNlVmFsdWUoZ2V0WFNEVHlwZSgpKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgICAgewotICAgICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgICAgfQotICAgICAgCi0gICAgICAvKioKLSAgICAgICAqIE9idGFpbnMgdGhlIHdoaXRlc3BhY2UgZmFjZXQgb2YgdGhlIFhTRCBzaW1wbGUgdHlwZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiBUaGUgd2hpdGVzcGFjZSBmYWNldCBmb3IgdGhlIFhTRCB0eXBlLiBJZiBub25lIGlzCi0gICAgICAgKiBkZWZpbmVkLCBvciBpdCBpcyBhIGNvbXBsZXggdHlwZSwgbnVsbC4KLSAgICAgICAqLwotICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V2hpdGVTcGFjZUZhY2V0VmFsdWUoKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRYU0RUeXBlKCkuZ2V0U2ltcGxlVHlwZSgpOwotICAgICAgICByZXR1cm4gKGRlZiAhPSBudWxsICYmIGRlZi5nZXRFZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQoKSAhPSBudWxsKSA/IGRlZi5nZXRFZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQoKS5nZXRMZXhpY2FsVmFsdWUoKSA6IG51bGwgOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uLiBBCi0gICAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJ0VsZW1lbnQgRGVjbGFyYXRpb24nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGV4dGVuZHMgRWxlbWVudERlY2xhcmF0aW9uQmFzZUltcGwKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25zID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgTGlzdCB4c2lUeXBlcyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3RJbXBsIHN1YnN0aXR1dGlvbkdyb3VwOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhzZEVsZW1lbnREZWNsYXJhdGlvbiAtCi0gICAgICogICAgICAgICAgdGhlIFhNTCBTY2hlbWEgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcihYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIHRoaXMueHNkRWxlbWVudERlY2xhcmF0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZGVjbGFyYXRpb24gaWYgdGhpcyBpcyBhbiBlbGVtZW50Ci0gICAgICogcmVmZXJlbmNlLiBPdGhlcndpc2UgaXQgcmV0dXJucyBpdHNlbGYuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIGdldEFkYXB0ZXIoeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGdsb2JhbCBvcgotICAgICAqIGxvY2FsLiBSZXR1cm5zIG51bGwgaWYgdGhpcyBpcyBhbiBlbGVtZW50IHJlZmVyZW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiAgICAgICAgIGxvY2FsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmaW5pdGlvbkluZm8oKQotICAgIHsKLSAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICBlbHNlIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNHbG9iYWwoKSkKLSAgICAgICAgcmV0dXJuIERFRklOSVRJT05fSU5GT19HTE9CQUw7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBERUZJTklUSU9OX0lORk9fTE9DQUw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKQotICAgIHsKLSAgICAgIFN0cmluZyBmb3JtID0gbnVsbDsKLSAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgIHsKLSAgICAgICAgZm9ybSA9ICJxdWFsaWZpZWQiOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzU2V0Rm9ybSgpKQotICAgICAgICB7Ci0gICAgICAgICAgZm9ybSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRGb3JtKCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAgICAgZm9ybSA9IHNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmb3JtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0eXBlIG5hbWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldFhTSVR5cGVzKCkKLSAgICB7Ci0gICAgICBpZiAoeHNpVHlwZXMgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tcHV0ZURlcml2ZWRUeXBlSW5mbygpOwotICAgICAgfQotICAgICAgcmV0dXJuIHhzaVR5cGVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVEZXJpdmVkVHlwZUluZm8oKQotICAgIHsKLSAgICAgIHhzaVR5cGVzID0gbmV3IFZlY3RvcigpOwotICAgICAgZGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBjb21wdXRlRGVyaXZlZFR5cGVJbmZvSGVscGVyKGdldFhTRFR5cGUoKSwgeHNpVHlwZXMsIGRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25zKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRGVyaXZlZFR5cGVJbmZvSGVscGVyKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUsIExpc3QgdHlwZU5hbWVMaXN0LCBMaXN0IGVkTGlzdCkKLSAgICB7Ci0gICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgTGlzdCBkZXJpdmVkVHlwZXMgPSBmaW5kVHlwZXNEZXJpdmVkRnJvbSh0eXBlKTsKLSAgICAgICAgQXJyYXlMaXN0IGluY2x1c2l2ZURlcml2ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW5jbHVzaXZlRGVyaXZlZFR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgaWYgKChkZXJpdmVkVHlwZXMgIT0gbnVsbCkgJiYgKGRlcml2ZWRUeXBlcy5zaXplKCkgPiAwKSkKLSAgICAgICAgewotICAgICAgICAgIGluY2x1c2l2ZURlcml2ZWRUeXBlcy5hZGRBbGwoZGVyaXZlZFR5cGVzKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpbmNsdXNpdmVEZXJpdmVkVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gZGVyaXZlZFR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBkZXJpdmVkVHlwZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZGVyaXZlZFR5cGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmFtZSA9IHVyaSAhPSBudWxsID8gKCJbIiArIHVyaSArICJdIiArIG5hbWUpIDogbmFtZTsKLSAgICAgICAgICAgICAgdHlwZU5hbWVMaXN0LmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSBuZXcgRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwodGhpcywgZGVyaXZlZFR5cGUsIG5hbWUpOwotICAgICAgICAgICAgICBlZExpc3QuYWRkKGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdXJpIHF1YWxpZmllZAotICAgICAqIHR5cGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpUXVhbGlmaWVkVHlwZU5hbWUgLQotICAgICAqICAgICAgICAgIGEgdXJpIHF1YWxpZmllZCB0eXBlIG5hbWUKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUpCi0gICAgewotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucyA9PSBudWxsKQotICAgICAgewotICAgICAgICBjb21wdXRlRGVyaXZlZFR5cGVJbmZvKCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gKERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKChlZCAhPSBudWxsKSAmJiAoZWQudXJpUXVhbGlmaWVkVHlwZU5hbWUgIT0gbnVsbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZWQudXJpUXVhbGlmaWVkVHlwZU5hbWUuZXF1YWxzKHVyaVF1YWxpZmllZFR5cGVOYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBlZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4gVGhlIGdyb3VwIGNvbnNpc3RzIG9mOgotICAgICAqIDEuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGl0c2VsZiAyLiBhbmQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBoYXMKLSAgICAgKiBhIHtzdWJzdGl0dXRpb24gZ3JvdXAgYWZmaWxpYXRpb259IGluIHRoZSBncm91cAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBnZXRTdWJzdGl0dXRpb25Hcm91cCgpCi0gICAgewotICAgICAgaWYgKHN1YnN0aXR1dGlvbkdyb3VwID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHN1YnN0aXR1dGlvbkdyb3VwID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0gICAgICAgIExpc3Qgc2dyb3VwID0gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZ3JvdXAuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7ICAKLSAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cC5hZGQoZ2V0QWRhcHRlcihlZCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3Vic3RpdHV0aW9uR3JvdXA7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCBleHRlbmRzIEVsZW1lbnREZWNsYXJhdGlvbkJhc2VJbXBsCi0gICAqICAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbAotICB7Ci0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgb3duZXI7Ci0gICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIHhzZFR5cGU7Ci0gICAgcHVibGljIFN0cmluZyB1cmlRdWFsaWZpZWRUeXBlTmFtZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvd25lciAtCi0gICAgICogQHBhcmFtIHhzZFR5cGUgLQotICAgICAqIEBwYXJhbSB1cmlRdWFsaWZpZWRUeXBlTmFtZSAtCi0gICAgICovCi0gICAgcHVibGljIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgb3duZXIsIFhTRFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIFN0cmluZyB1cmlRdWFsaWZpZWRUeXBlTmFtZSkKLSAgICB7Ci0gICAgICB0aGlzLm93bmVyID0gb3duZXI7Ci0gICAgICB0aGlzLnhzZFR5cGUgPSB4c2RUeXBlOwotICAgICAgdGhpcy51cmlRdWFsaWZpZWRUeXBlTmFtZSA9IHVyaVF1YWxpZmllZFR5cGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIChYU0RFbGVtZW50RGVjbGFyYXRpb24pIG93bmVyLmdldEtleSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIG93bmVyLmdldEtleSgpKS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldEtleSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0eXBlIG5hbWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldFhTSVR5cGVzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3duZXIuZ2V0WFNJVHlwZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdXJpIHF1YWxpZmllZAotICAgICAqIHR5cGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpUXVhbGlmaWVkVHlwZU5hbWUgLQotICAgICAqICAgICAgICAgIGEgdXJpIHF1YWxpZmllZCB0eXBlIG5hbWUKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24odXJpUXVhbGlmaWVkVHlwZU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkZWNsYXJhdGlvbiBpZiB0aGlzIGlzIGFuIGVsZW1lbnQKLSAgICAgKiByZWZlcmVuY2UuIE90aGVyd2lzZSBpdCByZXR1cm5zIGl0c2VsZi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZSBnZXREZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiBsb2NhbC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgYW4gZWxlbWVudCByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogICAgICAgICBsb2NhbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3duZXIuZ2V0RGVmaW5pdGlvbkluZm8oKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmb3JtIFthdHRyaWJ1dGVdIHdoaWNoIGFmZmVjdHMgdGhlIHRhcmdldAotICAgICAqIG5hbWVzcGFjZSBvZiBsb2NhbGx5IHNjb3BlZCBmZWF0dXJlcy4gQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZvcm0KLSAgICAgKiBbYXR0cmlidXRlXS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LiBUaGUgZ3JvdXAgY29uc2lzdHMgb2Y6Ci0gICAgICogMS4gdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXRzZWxmIDIuIGFuZCBhbnkgZWxlbWVudCBkZWNsYXJhdGlvbiB0aGF0IGhhcwotICAgICAqIGEge3N1YnN0aXR1dGlvbiBncm91cCBhZmZpbGlhdGlvbn0gaW4gdGhlIGdyb3VwCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3RJbXBsIGdldFN1YnN0aXR1dGlvbkdyb3VwKCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3duZXIuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTRFdpbGRjYXJkQWRhcHRlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RXaWxkY2FyZEFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNQW55RWxlbWVudAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRFdpbGRjYXJkIHhzZFdpbGRjYXJkOwotCi0gICAgcHVibGljIFhTRFdpbGRjYXJkQWRhcHRlcihYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICB0aGlzLnhzZFdpbGRjYXJkID0geHNkV2lsZGNhcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkV2lsZGNhcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gQU5ZX0VMRU1FTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nIHZhbHVlLgotICAgICAqIEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZQotICAgICAqIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gImFueSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICAgIHsKLSAgICAgIFN0cmluZyB1cmkgPSB4c2RXaWxkY2FyZC5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKTsKLSAgICAgIHJldHVybiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCkgPyB1cmkgOiAiIyNhbnkiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWluT2NjdXJzKHhzZFdpbGRjYXJkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAgICAgKiAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhPY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1heE9jY3Vycyh4c2RXaWxkY2FyZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZFdpbGRjYXJkLmdldFNjaGVtYSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0geHNkV2lsZGNhcmQuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25zKGFubm90YXRpb24pOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNETW9kZWxHcm91cEFkYXB0ZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNETW9kZWxHcm91cEFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNR3JvdXAKLSAgewotICAgIHByb3RlY3RlZCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXA7Ci0KLSAgICBwdWJsaWMgWFNETW9kZWxHcm91cEFkYXB0ZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWFNETW9kZWxHcm91cEFkYXB0ZXIoWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIHRoaXMueHNkTW9kZWxHcm91cCA9IHhzZE1vZGVsR3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gR1JPVVA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkTW9kZWxHcm91cDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBncm91cC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkKLSAgICB7Ci0gICAgICBDTU5vZGVMaXN0SW1wbCBub2RlTGlzdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgICAgaWYgKHhzZE1vZGVsR3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0geHNkTW9kZWxHcm91cC5nZXRQYXJ0aWNsZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgWFNEUGFydGljbGVDb250ZW50IGNvbnRlbnQgPSBwYXJ0aWNsZS5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgQ01Ob2RlIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGNvbnRlbnQpOwotICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChhZGFwdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub2RlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcgdmFsdWUuCi0gICAgICogQWxsIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlCi0gICAgICogZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIENNRGVzY3JpcHRpb25CdWlsZGVyIGRlc2NyaXB0aW9uQnVpbGRlciA9IG5ldyBDTURlc2NyaXB0aW9uQnVpbGRlcigpOwotICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uQnVpbGRlci5idWlsZERlc2NyaXB0aW9uKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWluT2NjdXJzKHhzZE1vZGVsR3JvdXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotICAgICAqICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1heE9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKHhzZE1vZGVsR3JvdXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBvcGVyYXRvciBvZiB0aGlzIGdyb3VwIC0tIENIT0lDRSwgU0VRVUVOQ0Ugb3IgQUxMIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9wZXJhdG9yIG9mIHRoaXMgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRPcGVyYXRvcigpCi0gICAgewotICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICAvL3RvZG8uLi4gaGFuZGxlIEFMT05FIGNhc2UgYnkgY2hlY2tpZyBpZiBjaGlsZCBjb3VudCA9PSAxCi0gICAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKHhzZE1vZGVsR3JvdXAuZ2V0Q29tcG9zaXRvcigpLmdldFZhbHVlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIFhTRENvbXBvc2l0b3IuQ0hPSUNFIDogewotICAgICAgICAgICAgcmVzdWx0ID0gQ0hPSUNFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5TRVFVRU5DRSA6IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFNFUVVFTkNFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5BTEwgOiB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBTEw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKQotICAgIHsKLSAgICAgIFhTREFubm90YXRpb24gYW5ub3RhdGlvbiA9IHhzZE1vZGVsR3JvdXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25zKGFubm90YXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcih4c2RNb2RlbEdyb3VwLmdldFNjaGVtYSgpKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNR3JvdXAKLSAgewotICAgIHByb3RlY3RlZCBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLQotICAgIHB1YmxpYyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIoWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgdGhpcy54c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEdST1VQOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGdyb3VwLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKQotICAgIHsKLSAgICAgIENNTm9kZUxpc3RJbXBsIG5vZGVMaXN0ID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0TW9kZWxHcm91cCgpOwotICAgICAgaWYgKG1vZGVsR3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG1vZGVsR3JvdXApOwotICAgICAgICBub2RlTGlzdC5hZGQoYWRhcHRlcik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nIHZhbHVlLgotICAgICAqIEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZQotICAgICAqIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICBDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLSAgICAgIHJldHVybiBkZXNjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1pbk9jY3Vycyh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNYXhPY2N1cnMoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBvcGVyYXRvciBvZiB0aGlzIGdyb3VwIC0tIENIT0lDRSwgU0VRVUVOQ0Ugb3IgQUxMIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9wZXJhdG9yIG9mIHRoaXMgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRPcGVyYXRvcigpCi0gICAgewotICAgICAgcmV0dXJuIFhTRENvbXBvc2l0b3IuU0VRVUVOQ0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKQotICAgIHsKLSAgICAgIFhTREFubm90YXRpb24gYW5ub3RhdGlvbiA9IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldEFubm90YXRpb24oKTsKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0U2NoZW1hKCkpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogRG9jdW1lbnRhdGlvbkltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50YXRpb24uIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gICAqIGRvY3VtZW50YXRpb24gZWxlbWVudCBwYXJ0IG9mIHRoZSAnVXNlciBJbmZvcm1hdGlvbicgZmVhdHVyZS4gV29ya2luZyB3aXRoCi0gICAqIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQgcmVxdWlyZXMgZHJvcHBpbmcgZG93biBpbnRvIHRoZSBET00gbW9kZWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIERvY3VtZW50YXRpb25JbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudGF0aW9uCi0gIHsKLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBkb2N1bWVudGF0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRvY3VtZW50YXRpb24gLQotICAgICAqICAgICAgICAgIGEgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudGF0aW9uSW1wbChFbGVtZW50IGRvY3VtZW50YXRpb24pCi0gICAgewotICAgICAgdGhpcy5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGZhbHNlLiBUaGlzIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgYW55IHByb3BlcnRpZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIG51bGwuIFRoaXMgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBhbnkgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgU3RyaW5nIGNvbnRlbnQgPSAiIjsKLSAgICAgIGJvb2xlYW4gY29udGVudEZvdW5kID0gZmFsc2U7Ci0gICAgICBOb2RlTGlzdCBub2RlcyA9IGRvY3VtZW50YXRpb24uZ2V0Q2hpbGROb2RlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250ZW50Rm91bmQgPSB0cnVlOwotICAgICAgICAgIGNvbnRlbnQgKz0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGNvbnRlbnRGb3VuZCA/IGNvbnRlbnQgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uLmhhc0F0dHJpYnV0ZU5TKFhTRENvbnN0YW50cy5YTUxfTkFNRVNQQUNFX1VSSV8xOTk4LCBYTUxfTEFOR19BVFRSSUJVVEUpID8gZG9jdW1lbnRhdGlvbi5nZXRBdHRyaWJ1dGVOUyhYU0RDb25zdGFudHMuWE1MX05BTUVTUEFDRV9VUklfMTk5OCwgWE1MX0xBTkdfQVRUUklCVVRFKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc291cmNlIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpCi0gICAgewotICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb24uaGFzQXR0cmlidXRlTlMobnVsbCwgWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUpID8gZG9jdW1lbnRhdGlvbi5nZXRBdHRyaWJ1dGVOUyhudWxsLCBYU0RDb25zdGFudHMuU09VUkNFX0FUVFJJQlVURSkgOiBudWxsOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNJRG9jdW1lbnQgZXh0ZW5kcyBDTURvY3VtZW50SW1wbC4gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGhvbGQgdGhvc2UKLSAgICogYXR0cmlidXRlcyB0aGF0IGFyZSBmb3IgZGlyZWN0IHVzZSBpbiBhbnkgWE1MIGRvY3VtZW50cy4gVGhlc2UgYXR0cmlidXRlcwotICAgKiBhcmUgaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlLCB3aGljaCBoYXMgdGhlIG5hbWVzcGFjZSBuYW1lCi0gICAqIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlLiBBdHRyaWJ1dGVzIGluIHRoaXMgbmFtZXNwYWNlCi0gICAqIGluY2x1ZGU6IHhzaTp0eXBlIHhzaTpuaWwgeHNpOnNjaGVtYUxvY2F0aW9uIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTSURvY3VtZW50IGV4dGVuZHMgQ01Eb2N1bWVudEltcGwKLSAgewotICAgIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBuaWxBdHRyaWJ1dGU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlcyB0aGUgJ3hzaTpuaWwnCi0gICAgICovCi0gICAgcHVibGljIFhTSURvY3VtZW50KCkKLSAgICB7Ci0gICAgICBzdXBlcihYU0RDb25zdGFudHMuU0NIRU1BX0lOU1RBTkNFX1VSSV8yMDAxKTsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgJ25pbGwnIGF0dHJpYnV0ZQotICAgICAgU3RyaW5nW10gdmFsdWVzID0geyJmYWxzZSIsICJ0cnVlIn07Ci0gICAgICBuaWxBdHRyaWJ1dGUgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoIm5pbCIsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQsIG5ldyBDTURhdGFUeXBlSW1wbCgiYm9vbGVhbiIsIHZhbHVlcykpOwotICAgICAgbmlsQXR0cmlidXRlLnNldFByZWZpeFF1YWxpZmljYXRpb24odHJ1ZSk7Ci0gICAgICBuaWxBdHRyaWJ1dGUuc2V0Q01Eb2N1bWVudCh0aGlzKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIE5vdGUgdGhpcyBYU0QgbW9kZWwgdmlzaXRvciBkaWZmZXJzIGZyb20gdGhlIFhTRCBtb2RlbCB2aXNpdG9yIGluCi0gICAqIG9yZy5lY2xpcHNlLndzdC54c2QuZWRpdG9yIHBsdWdpbi4gSW4gdmlzaXRNb2RlbEdyb3VwIG1ldGhvZCB3ZSBjYWxsCi0gICAqIGdldFBhcnRpY2xlcygpIGluc3RlYWQgb2YgZ2V0Q29udGVudHMoKS4gVGhpcyBnYXRoZXJzIGFsbCBvZiB0aGUgY29udGVudCBvZgotICAgKiBhIGRlcml2ZWQgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEQ01WaXNpdG9yIGV4dGVuZHMgWFNEVmlzaXRvcgotICB7Ci0gICAgcHVibGljIHZvaWQgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlKQotICAgIHsKLSAgICAgIFhTRFBhcnRpY2xlIGN0ZCA9IHR5cGUuZ2V0Q29tcGxleFR5cGUoKTsKLSAgICAgIGlmIChjdGQgIT0gbnVsbCkKLSAgICAgICAgdmlzaXRQYXJ0aWNsZShjdGQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gICAgewotICAgICAgaWYgKG1vZGVsR3JvdXAuZ2V0UGFydGljbGVzKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsR3JvdXAuZ2V0UGFydGljbGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgdmlzaXRQYXJ0aWNsZShwYXJ0aWNsZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWYpCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gbW9kZWxHcm91cERlZi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0TW9kZWxHcm91cCgpOwotICAgICAgaWYgKG1vZGVsR3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXApOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKioKLSAgICogQSB2aXNpdG9yIGNsYXNzIHRoYXQgd2Fsa3MgdGhlIHhzZCBtb2RlbCBhbmQgY29tcHV0ZXMgdGhlIGxpc3Qgb2YgY2hpbGRyZW4KLSAgICogdGhhdCBiZWxvbmcgdG8gdGhlIGluaXRpYWxseSB2aXNpdGVkIGVsZW1lbnQgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVyaXZlZENoaWxkVmlzaXRvciBleHRlbmRzIFhTRENNVmlzaXRvcgotICB7Ci0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3RJbXBsIGNoaWxkTm9kZUxpc3QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLSAgICBwcm90ZWN0ZWQgTGlzdCBiYXNlVHlwZUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgT2JqZWN0IHJvb3Q7Ci0KLSAgICBEZXJpdmVkQ2hpbGRWaXNpdG9yKE9iamVjdCByb290KQotICAgIHsKLSAgICAgIHRoaXMucm9vdCA9IHJvb3Q7Ci0gICAgfQotCi0gICAgcHVibGljIENNTm9kZUxpc3RJbXBsIGdldENoaWxkTm9kZUxpc3QoKQotICAgIHsKLSAgICAgIHJldHVybiBjaGlsZE5vZGVMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0V2lsZGNhcmQoWFNEV2lsZGNhcmQgd2lsZGNhcmQpCi0gICAgewotICAgICAgY2hpbGROb2RlTGlzdC5nZXRMaXN0KCkuYWRkKGdldEFkYXB0ZXIod2lsZGNhcmQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgICB7Ci0gICAgICBjaGlsZE5vZGVMaXN0LmdldExpc3QoKS5hZGQoZ2V0QWRhcHRlcihlbGVtZW50KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBjaGlsZE5vZGVMaXN0LmdldExpc3QoKS5hZGQoZ2V0QWRhcHRlcihtb2RlbEdyb3VwKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjaGlsZE5vZGVMaXN0LmdldExpc3QoKS5hZGQoZ2V0QWRhcHRlcihtb2RlbEdyb3VwRGVmaW5pdGlvbikpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogQSB2aXNpdG9yIGNsYXNzIHRoYXQgZ2F0aGVycyBhbGwgb2YgdGhlIGVsZW1lbnRzIHdpdGhpbiBhIHR5cGUgZGVmaW5pdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTG9jYWxFbGVtZW50VmlzaXRvciBleHRlbmRzIFhTRENNVmlzaXRvcgotICB7Ci0gICAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBuYW1lZE5vZGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gICAgcHJvdGVjdGVkIExpc3QgYmFzZVR5cGVMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpIGdldEFkYXB0ZXIoZWxlbWVudCk7Ci0gICAgICBuYW1lZE5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KGFkYXB0ZXIuZ2V0Tm9kZU5hbWUoKSwgYWRhcHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldENNTmFtZWROb2RlTWFwKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmFtZWROb2RlTWFwOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RUeXBlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RUeXBlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTg2N2EzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVHlwZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGdlbmVyYXRlIHZhbGlkIHZhbHVlcyBmb3IgYnVpbHQtaW4gc2ltcGxlIHR5cGVzLgotICovCi0KLXB1YmxpYyBjbGFzcyBYU0RUeXBlVXRpbAotewotICBwcm90ZWN0ZWQgc3RhdGljIE1hcCBkZWZhdWx0VmFsdWUgPSBuZXcgSGFzaE1hcCgpOwotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkKLSAgewotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImFueVNpbXBsZVR5cGUiLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJhbnlUeXBlIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYW55VVJJIiwgImh0dHA6Ly90ZW1wdXJpLm9yZyIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImJhc2U2NEJpbmFyeSIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYm9vbGVhbiIsICJ0cnVlIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYnl0ZSIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZGF0ZSIsICIyMDAxLTAxLTAxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZGF0ZVRpbWUiLCAiMjAwMS0xMi0zMVQxMjowMDowMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImRlY2ltYWwiLCAiMC4wIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZG91YmxlIiwgIjAuMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImR1cmF0aW9uIiwgIlAxRCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIkVOVElUWSIsICJlbnRpdHkiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJFTlRJVElFUyIsICJlbnRpdGllcyIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImZsb2F0IiwgIjAuMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImdEYXkiLCAiLS0tMDEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJnTW9udGgiLCAiLS0wMS0tIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZ01vbnRoRGF5IiwgIi0tMDEtMDEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJnWWVhciIsICIyMDAxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZ1llYXJNb250aCIsICIyMDAxLTAxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiaGV4QmluYXJ5IiwgIjBGMDAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJJRCIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIklEUkVGIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiSURSRUZTIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiaW50IiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJpbnRlZ2VyIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJsYW5ndWFnZSIsICJFTiIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImxvbmciLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIk5hbWUiLCAiTmFtZSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIk5DTmFtZSIsICJOQ05hbWUiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJuZWdhdGl2ZUludGVnZXIiLCAiLTEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJOTVRPS0VOIiwgIk5NVE9LRU4iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJOTVRPS0VOUyIsICJOTVRPS0VOUyIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIm5vbk5lZ2F0aXZlSW50ZWdlciIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibm9uUG9zaXRpdmVJbnRlZ2VyIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJub3JtYWxpemVkU3RyaW5nIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiTk9UQVRJT04iLCAiTk9UQVRJT04iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJwb3NpdGl2ZUludGVnZXIiLCAiMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIlFOYW1lIiwgIlFOYW1lIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgic2hvcnQiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInN0cmluZyIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInRpbWUiLCAiMTI6MDA6MDAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ0b2tlbiIsICJ0b2tlbiIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInVuc2lnbmVkQnl0ZSIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidW5zaWduZWRJbnQiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInVuc2lnbmVkTG9uZyIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidW5zaWduZWRTaG9ydCIsICIwIik7Ci0gIH0KLQotCi0gIC8qCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBidWlsdC1pbi4KLSAgICogQHBhcmFtIHR5cGUgLSBhbiBYU0RUeXBlRGVmaW5pdGlvbiBvYmplY3QuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBidWlsdC1pbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0J1aWx0SW4oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgeyAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgU3RyaW5nIG5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAgZGVmYXVsdFZhbHVlLmNvbnRhaW5zS2V5KG5hbWUpOyAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgYSB2YWxpZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc2ltcGxlIHR5cGUuCi0gICAqIEBwYXJhbSB0eXBlIC0gYSBzaW1wbGUgYnVpbHQtaW4gdHlwZS4KLSAgICogQHJldHVybiBhIHZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzaW1wbGUgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluc3RhbmNlVmFsdWUoWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlzQnVpbHRJbih0eXBlKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVJRCA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gKFN0cmluZylkZWZhdWx0VmFsdWUuZ2V0KG5hbWVJRCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2V0eXBlID0gdHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICBpZiAoYmFzZXR5cGUgIT0gdHlwZSkgcmV0dXJuIGdldEluc3RhbmNlVmFsdWUoYmFzZXR5cGUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWY1ODM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROb3RhdGlvbkRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RWaXNpdG9yCi17Ci0gIHB1YmxpYyBYU0RWaXNpdG9yKCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJvdGVjdGVkIFN0YWNrIHBhcnRpY2xlU3RhY2sgPSBuZXcgU3RhY2soKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKGlkZW50aXR5Q29uc3RyYWludCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKG1vZGVsR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXROb3RhdGlvbkRlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETm90YXRpb25EZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0Tm90YXRpb25EZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXR5cGUpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgaWYgKCFtb2RlbEdyb3VwRGVmLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oWFNETm90YXRpb25EZWNsYXJhdGlvbiBub3RhdGlvbikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZS5nZXRDb250ZW50VHlwZSgpICE9IG51bGwpCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhDb250ZW50ID0gdHlwZS5nZXRDb250ZW50VHlwZSgpOwotICAgICAgaWYgKGNvbXBsZXhDb250ZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWNvbXBsZXhDb250ZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXBsZXhDb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0UGFydGljbGUoKFhTRFBhcnRpY2xlKSBjb21wbGV4Q29udGVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnRpY2xlKFhTRFBhcnRpY2xlIHBhcnRpY2xlKQotICB7Ci0gICAgdmlzaXRQYXJ0aWNsZUNvbnRlbnQocGFydGljbGUuZ2V0Q29udGVudCgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZUNvbnRlbnQoWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCkKLSAgewotICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBwYXJ0aWNsZUNvbnRlbnQ7Ci0KLSAgICAgIGlmIChwYXJ0aWNsZVN0YWNrLmNvbnRhaW5zKG1vZGVsR3JvdXBEZWYpKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAgIAotICAgICAgcGFydGljbGVTdGFjay5wdXNoKG1vZGVsR3JvdXBEZWYpOwotICAgICAgCi0gICAgICB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKG1vZGVsR3JvdXBEZWYpOwotICAgICAgCi0gICAgICBwYXJ0aWNsZVN0YWNrLnBvcCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cCgoWFNETW9kZWxHcm91cClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICB2aXNpdFdpbGRjYXJkKChYU0RXaWxkY2FyZClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIGlmIChtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0UGFydGljbGUocGFydGljbGUpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzA5ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYUxvY2F0b3JJbXBsIHNjaGVtYUxvY2F0b3IgPSBuZXcgWFNEU2NoZW1hTG9jYXRvckltcGwoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRvci5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBzY2hlbWFMb2NhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZjAxODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdG9ySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hTG9jYXRvcgotewotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvciNsb2NhdGVTY2hlbWEob3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYSwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFhTRFNjaGVtYSBsb2NhdGVTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHJhd1NjaGVtYUxvY2F0aW9uVVJJLCBTdHJpbmcgcmVzb2x2ZWRTY2hlbWFMb2NhdGlvblVSSSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgcmVzdWx0ID0gbnVsbDsKLSAgICAgIFN0cmluZyBiYXNlTG9jYXRpb24gPSB4c2RTY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKTsgICAgICAKLSAgICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZVVSSSwgcmF3U2NoZW1hTG9jYXRpb25VUkkpOyAKLSAgICAgIGlmIChyZXNvbHZlZFVSSSA9PSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgcmVzb2x2ZWRVUkkgPSByZXNvbHZlZFNjaGVtYUxvY2F0aW9uVVJJOyAgICAgICAKLSAgICAgIH0KLSAgICAgIHRyeQotICAgICAgeyAgICAgICAgCi0gICAgICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0geHNkU2NoZW1hLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0gICAgICAgIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHJlc29sdmVkVVJJKTsKLSAgICAgICAgUmVzb3VyY2UgciA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOyAKLSAgICAgICAgWFNEUmVzb3VyY2VJbXBsIHJlc29sdmVkUmVzb3VyY2UgPSBudWxsOwotICAgICAgICBpZiAociBpbnN0YW5jZW9mIFhTRFJlc291cmNlSW1wbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2UgPSAoWFNEUmVzb3VyY2VJbXBsKXI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgICAgICAgCi0gICAgICAgIHsgIAotICAgICAgICAgIFN0cmluZyBwaHlzaWNhbExvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihiYXNlTG9jYXRpb24sIG5hbWVzcGFjZVVSSSwgcmVzb2x2ZWRVUkkpOyAgICAgCi0gICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKHBoeXNpY2FsTG9jYXRpb24pKTsKLSAgICAgICAgICByZXNvbHZlZFJlc291cmNlID0gKFhTRFJlc291cmNlSW1wbClyZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLnhzZCIpKTsKLSAgICAgICAgICByZXNvbHZlZFJlc291cmNlLnNldFVSSSh1cmkpOwotICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgbnVsbCk7ICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IHJlc29sdmVkUmVzb3VyY2UuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKQotICAgICAgewotICAgICAgICAvLyBJdCBpcyBnZW5lcmFsbHkgbm90IGFuIGVycm9yIHRvIGZhaWwgdG8gcmVzb2x2ZS4KLSAgICAgICAgLy8gSWYgYSByZXNvdXJjZSBpcyBhY3R1YWxseSBjcmVhdGVkLCAKLSAgICAgICAgLy8gd2hpY2ggaGFwcGVucyBvbmx5IHdoZW4gd2UgY2FuIGNyZWF0ZSBhbiBpbnB1dCBzdHJlYW0sCi0gICAgICAgIC8vIHRoZW4gaXQncyBhbiBlcnJvciBpZiBpdCdzIG5vdCBhIGdvb2Qgc2NoZW1hCi0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhdHBlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRvci5jbGFzczsKLSAgICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTU3Zjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciwgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsLCBidWcgMTE0NzAzMwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKioKLSAqIEFuIFhTRCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gYWxsb3dzIHNldHRpbmcgc3BlY2lmaWMgY29uZmlndXJhdGlvbgotICogaW5mb3JtYXRpb24gZm9yIGEgV1RQIFhTRCB2YWxpZGF0aW9uIHJ1bi4gQW55IGZlYXR1cmVzIGFuZCBwcm9wZXJ0aWVzCi0gKiBzZXQgb24gdGhpcyBjb25maWd1cmF0aW9uIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCB0aG9zZSBmcm9tCi0gKiBwYXJzZXJzIHN1Y2ggYXMgWGVyY2VzLiAoVGhpcyBvYmplY3QgZG9lcyBub3QgYnkgZGVmYXVsdCB3cmFwIGZlYXR1cmVzCi0gKiBhbmQgcHJvcGVydGllcyBmcm9tIHNwZWNpZmljIHBhcnNlcnMuKQotICovCi1wdWJsaWMgY2xhc3MgWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyA9ICJIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZVTExfU0NIRU1BX0NPTkZPUk1BTkNFID0gIkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGJvb2xlYW4gaG9ub3VyX2FsbF9zY2hlbWFfbG9jYXRpb25zID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBmdWxsU2NoZW1hQ29uZm9ybWFuY2UgPSB0cnVlOwotICAKLSAgLyoqCi0gICAqIFNldCBhIGZlYXR1cmUgb2YgdGhpcyBjb25maWd1cmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogCQlUaGUgZmVhdHVyZSB0byBzZXQuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiAJCVRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBmZWF0dXJlLgotICAgKiBAdGhyb3dzIAotICAgKiAJCUFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBib29sZWFuIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQlpZihIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMuZXF1YWxzKGZlYXR1cmUpKQotCSAgaG9ub3VyX2FsbF9zY2hlbWFfbG9jYXRpb25zID0gdmFsdWU7Ci0JZWxzZSBpZiAoRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UuZXF1YWxzKGZlYXR1cmUpKQotCQlmdWxsU2NoZW1hQ29uZm9ybWFuY2UgPSB2YWx1ZTsKLQllbHNlCi0JICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGZWF0dXJlIG5vdCByZWNvZ25pemVkLiIpOyAvLyROT04tTkxTLTEkCi0JCi0gIH0KLSAgCi0gIAotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBmZWF0dXJlLiBJZiB0aGUgZmVhdHVyZSBpcyBub3QgZGVmaW5lZAotICAgKiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybgotICAgKiAJCVRoZSBmZWF0dXJlJ3MgdmFsdWUsIHRydWUgb3IgZmFsc2UuCi0gICAqIEB0aHJvd3MgCi0gICAqIAkJQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgZmVhdHVyZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCWlmKEhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUy5lcXVhbHMoZmVhdHVyZSkpCi0JICByZXR1cm4gaG9ub3VyX2FsbF9zY2hlbWFfbG9jYXRpb25zOwotCWVsc2UgaWYgKEZVTExfU0NIRU1BX0NPTkZPUk1BTkNFLmVxdWFscyhmZWF0dXJlKSkKLSAgICAgIHJldHVybiBmdWxsU2NoZW1hQ29uZm9ybWFuY2U7Ci0JCi0JdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNmI1ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIsIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCwgYnVnIDExNDcwMzMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuWE1MR3JhbW1hclByZXBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTEdyYW1tYXJQb29sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLlhNTEdyYW1tYXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FcnJvcjsKLQotLyoqCi0gKiBUaGUgWFNEVmFsaWRhdG9yIHdpbGwgdmFsaWRhdGUgWFNEIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgWFNEVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBVUklSZXNvbHZlciB1cmlyZXNvbHZlciA9IG51bGw7Ci0KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB2YWxpZGF0ZSh1cmksIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgewotCXJldHVybiB2YWxpZGF0ZSh1cmksIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIFhTRCBmaWxlIHNwZWNpZmllZCBieSB0aGUgVVJJLgotICAgKiAKLSAgICogQHBhcmFtIHVyaQotICAgKiAJCVRoZSBVUkkgb2YgdGhlIFhTRCBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gCi0gICAqIAkJQW4gaW5wdXQgc3RyZWFtIHJlcHJlc2VudGluZyB0aGUgWFNEIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAqIAkJQSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZhbGlkYXRpb24gcnVuLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gIHsKLQlpZihjb25maWd1cmF0aW9uID09IG51bGwpCi0JewotCSAgY29uZmlndXJhdGlvbiA9IG5ldyBYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpOwotCX0KLQlWYWxpZGF0aW9uSW5mbyB2YWxpbmZvID0gbmV3IFZhbGlkYXRpb25JbmZvKHVyaSk7Ci0JWFNERXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBYU0RFcnJvckhhbmRsZXIodmFsaW5mbyk7Ci0JdHJ5Ci0JewotCSAgWE1MR3JhbW1hclByZXBhcnNlciBncmFtbWFyUHJlcGFyc2VyID0gbmV3IFhNTEdyYW1tYXJQcmVwYXJzZXIoKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIucmVnaXN0ZXJQcmVwYXJzZXIoWE1MR3JhbW1hckRlc2NyaXB0aW9uLlhNTF9TQ0hFTUEsbnVsbC8qc2NoZW1hTG9hZGVyKi8pOwotCQkgIAotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRQcm9wZXJ0eShDb25zdGFudHMuWEVSQ0VTX1BST1BFUlRZX1BSRUZJWCArIENvbnN0YW50cy5YTUxHUkFNTUFSX1BPT0xfUFJPUEVSVFksIG5ldyBYTUxHcmFtbWFyUG9vbEltcGwoKSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5DT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUl9GRUFUVVJFLCBmYWxzZSk7Ci0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5OQU1FU1BBQ0VTX0ZFQVRVUkUsIHRydWUpOwotICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuTkFNRVNQQUNFX1BSRUZJWEVTX0ZFQVRVUkUsIHRydWUpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuVkFMSURBVElPTl9GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLlNDSEVNQV9WQUxJREFUSU9OX0ZFQVRVUkUsIHRydWUpOwotCi0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5FWFRFUk5BTF9HRU5FUkFMX0VOVElUSUVTX0ZFQVRVUkUsIHRydWUpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuRVhURVJOQUxfUEFSQU1FVEVSX0VOVElUSUVTX0ZFQVRVUkUsIHRydWUpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuV0FSTl9PTl9EVVBMSUNBVEVfQVRUREVGX0ZFQVRVUkUsIHRydWUpOwotCSAgICAgCi0JICBpZihjb25maWd1cmF0aW9uLmdldEZlYXR1cmUoWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TKSkKLQkgIHsKLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArICJob25vdXItYWxsLXNjaGVtYUxvY2F0aW9ucyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCSAgICB7Ci0JICAgICAgLy8gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgaWdub3JlCi0JICAgIH0KLQkgIH0KLQkgIAotCSAgaWYoY29uZmlndXJhdGlvbi5nZXRGZWF0dXJlKFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFKSkgewotCQl0cnkKLQkJewotCQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLlNDSEVNQV9GVUxMX0NIRUNLSU5HLCB0cnVlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIGlnbm9yZSBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIHNldCBpdCBvciBjYW4ndC4KLQkJfQotCQkKLQkgIH0KLQkgICAgICAKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcik7Ci0JICBpZiAodXJpcmVzb2x2ZXIgIT0gbnVsbCkKLQkgIHsKLQkgICAgWFNERW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgWFNERW50aXR5UmVzb2x2ZXIodXJpcmVzb2x2ZXIsIHVyaSk7Ci0JICAgIGlmIChyZXNvbHZlciAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihyZXNvbHZlcik7Ci0JICAgIH0KLQkgIH0KLQotCSAgdHJ5Ci0JICB7Ci0JICAJWE1MSW5wdXRTb3VyY2UgaXMgPSBuZXcgWE1MSW5wdXRTb3VyY2UobnVsbCwgdXJpLCB1cmksIGlucHV0U3RyZWFtLCBudWxsKTsKLQkgICAgZ3JhbW1hclByZXBhcnNlci5nZXRMb2FkZXIoWE1MR3JhbW1hckRlc2NyaXB0aW9uLlhNTF9TQ0hFTUEpOwotCQlncmFtbWFyUHJlcGFyc2VyLnByZXBhcnNlR3JhbW1hcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSxpcyk7Ci0JICB9Ci0JICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICB7Ci0JICAgIC8vcGFyc2VyIHdpbGwgcmV0dXJuIG51bGwgcG9pbnRlciBleGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIHN0cnVjdHVyYWxseSBpbnZhbGlkCi0JCS8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2UKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICB9Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkKLQl7Ci0gICAgICAvLyBUT0RPOiBsb2cgZXJyb3IuCi0JICAvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLQl9Ci0JcmV0dXJuIHZhbGluZm87Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlIHdpdGggWFNEIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdXJpcmVzb2x2ZXIKLSAgICogICAgICAgICAgVGhlIFVSSSByZXNvbHZlciB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlyZXNvbHZlcikKLSAgewotICAgIHRoaXMudXJpcmVzb2x2ZXIgPSB1cmlyZXNvbHZlcjsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgWFNERXJyb3JIYW5kbGVyIGhhbmRsZSBYZXJjZXMgcGFyc2luZyBlcnJvcnMgYW5kIHB1dHMgdGhlIGVycm9ycwotICAgKiBpbnRvIHRoZSBnaXZlbiBWYWxpZGF0aW9uSW5mbyBvYmplY3QuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgWFNERXJyb3JIYW5kbGVyIGltcGxlbWVudHMgWE1MRXJyb3JIYW5kbGVyCi0gIHsKLQkgIAotICAgIHByaXZhdGUgZmluYWwgVmFsaWRhdGlvbkluZm8gdmFsaW5mbzsKLQotICAgIHB1YmxpYyBYU0RFcnJvckhhbmRsZXIoVmFsaWRhdGlvbkluZm8gdmFsaW5mbykKLSAgICB7Ci0gICAgICB0aGlzLnZhbGluZm8gPSB2YWxpbmZvOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVycm9yS2V5IFRoZSBYZXJjZXMgZXJyb3Iga2V5LgotICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIGVycm9yS2V5LCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24sIGludCBzZXZlcml0eSkKLSAgICB7IAotICAgICAgU3RyaW5nIHN5c3RlbUlkID0gZXhjZXB0aW9uLmdldEV4cGFuZGVkU3lzdGVtSWQoKTsKLSAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoc2V2ZXJpdHkgPT0gRE9NRXJyb3IuU0VWRVJJVFlfV0FSTklORykKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIHN5c3RlbUlkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmFkZEVycm9yKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKSwgc3lzdGVtSWQsIGVycm9yS2V5LCBudWxsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyI3dhcm5pbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotCXsKLSAgICAJYWRkVmFsaWRhdGlvbk1lc3NhZ2Uoa2V5LCBleGNlcHRpb24sIERPTUVycm9yLlNFVkVSSVRZX1dBUk5JTkcpOwotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyI2Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gICAgewotICAgIAlhZGRWYWxpZGF0aW9uTWVzc2FnZShrZXksIGV4Y2VwdGlvbiwgRE9NRXJyb3IuU0VWRVJJVFlfRVJST1IpOwotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotCXsKLSAgICAJYWRkVmFsaWRhdGlvbk1lc3NhZ2Uoa2V5LCBleGNlcHRpb24sIERPTUVycm9yLlNFVkVSSVRZX0ZBVEFMX0VSUk9SKTsKLQl9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIFhTREVudGl0eVJlc29sdmVyIHdyYXBzIGFuIGlkcmVzb2x2ZXIgdG8gcHJvdmlkZSBlbnRpdHkgcmVzb2x1dGlvbiB0bwotICAgKiB0aGUgWFNEIHZhbGlkYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYU0RFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi0gIHsKLSAgICBwcml2YXRlIFVSSVJlc29sdmVyIHVyaXJlc29sdmVyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZHJlc29sdmVyCi0gICAgICogICAgICAgICAgVGhlIGlkcmVzb2x2ZXIgdGhpcyBlbnRpdHkgcmVzb2x2ZXIgd3JhcHMuCi0gICAgICogQHBhcmFtIGJhc2Vsb2NhdGlvbiBUaGUgYmFzZSBsb2NhdGlvbiB0byByZXNvbHZlIHdpdGguCi0gICAgICovCi0gICAgcHVibGljIFhTREVudGl0eVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaXJlc29sdmVyLCBTdHJpbmcgYmFzZWxvY2F0aW9uKQotICAgIHsKLSAgICAgIHRoaXMudXJpcmVzb2x2ZXIgPSB1cmlyZXNvbHZlcjsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXIpCi0gICAgICovCi0gICAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJlc291cmNlSWRlbnRpZmllcikgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICBTdHJpbmcgbGl0ZXJhbFN5c3RlbUlkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldExpdGVyYWxTeXN0ZW1JZCgpOwotICAgICAgaWYobGl0ZXJhbFN5c3RlbUlkICE9IG51bGwpCi0gICAgICB7Ci0gICAgCXJlc291cmNlSWRlbnRpZmllci5zZXRMaXRlcmFsU3lzdGVtSWQobGl0ZXJhbFN5c3RlbUlkLnJlcGxhY2UoJ1xcJywnLycpKTsKLSAgICAgIH0KLSAgICAgICAgLy8gVE9ETyBjczogSW4gcmV2aXNpb24gMS4xIHdlIGV4cGxpY2l0bHkgb3BlbmVkIGEgc3RyZWFtIHRvIGVuc3VyZQotICAgICAgICAvLyBmaWxlIEkvTyBwcm9ibGVtcyBwcm9kdWNlZCBtZXNzYWdlcy4gSSd2ZSByZW1vdmUgdGhpcyBmdWRnZSBmb3Igbm93Ci0gICAgICAgIC8vIHNpbmNlIEkgY2FuJ3Qgc2VlbSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gaXQgd2FzIGludGVuZGVkIHRvIGZpeC4KLSAgICAgICAgLy8gSSdtIGhvcGluZyB0aGUgbmV3ZXIgWGVyY2VzIGNvZGUgYmFzZSBoYXMgZml4ZWQgdGhpcyBwcm9ibGVtIGFuZCB0aGUgZnVkZ2UgaXMgZGVmdW5jdC4KLSAgICAgICAgcmV0dXJuIFhNTFZhbGlkYXRvci5faW50ZXJuYWxSZXNvbHZlRW50aXR5KHVyaXJlc29sdmVyLCByZXNvdXJjZUlkZW50aWZpZXIpOwotICAgICAgCi0gICAgfQotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4OTgwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwsIGJ1ZyAxMTQ3MDMzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLlhTRENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhTRENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdE5lc3RlZFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgSGFzaE1hcCB4c2RDb25maWd1cmF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNzZXR1cFZhbGlkYXRpb24ob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXBWYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgCi0gIHsKLQlYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCk7Ci0JYm9vbGVhbiBob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMgPSBYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMpOwotCWJvb2xlYW4gZnVsbFNjaGVtYUNvbmZvcm1hbmNlID0gWFNEQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhTRENvcmVQcmVmZXJlbmNlTmFtZXMuRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UpOwotCXRyeQotCXsKLQkgIGNvbmZpZ3VyYXRpb24uc2V0RmVhdHVyZShYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMsIGhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucyk7Ci0JICBjb25maWd1cmF0aW9uLnNldEZlYXR1cmUoWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UsIGZ1bGxTY2hlbWFDb25mb3JtYW5jZSk7Ci0JfQotCWNhdGNoKEV4Y2VwdGlvbiBlKQotCXsKLQkgIC8vIFVuYWJsZSB0byBzZXQgdGhlIGhvbm91ciBhbGwgc2NoZW1hIGxvY2F0aW9ucyBvcHRpb24uIERvIG5vdGhpbmcuCi0JfQotCXhzZENvbmZpZ3VyYXRpb25zLnB1dChjb250ZXh0LCBjb25maWd1cmF0aW9uKTsKLQkKLQlzdXBlci5zZXR1cFZhbGlkYXRpb24oY29udGV4dCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciN0ZWFyZG93blZhbGlkYXRpb24ob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhcmRvd25WYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgCi0gIHsKLQl4c2RDb25maWd1cmF0aW9ucy5yZW1vdmUoY29udGV4dCk7Ci0JCi0Jc3VwZXIudGVhcmRvd25WYWxpZGF0aW9uKGNvbnRleHQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5pby5JbnB1dFN0cmVhbSwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgeyAgCi0JWFNEVmFsaWRhdG9yIHZhbGlkYXRvciA9IFhTRFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOwotCQotCVhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24peHNkQ29uZmlndXJhdGlvbnMuZ2V0KGNvbnRleHQpOwotCi0JVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBudWxsOwotCQotCXZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmksIGlucHV0c3RyZWFtLCBjb25maWd1cmF0aW9uKTsKLQkJICAgICAgICAKLQlyZXR1cm4gdmFscmVwb3J0OwotICB9Ci0JICAKLSAgLyoqCi0gICAqIFN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIG1lc3NhZ2UgcGFyYW1ldGVycy4gRm9yIFhTRCB2YWxpZGF0aW9uIHRoZXJlCi0gICAqIGFyZSB0aHJlZSBhZGRpdGlvbmFsIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB0byBzdG9yZToKLSAgICogcGFyYW1bMF0gPSB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXJyb3IKLSAgICogcGFyYW1bMV0gPSB0aGUgJ3NxdWlnZ2xlIHNlbGVjdGlvbiBzdHJhdGVneScgZm9yIHdoaWNoIERPTSBwYXJ0IHRvIHNxdWlnZ2xlCi0gICAqIHBhcmFtWzJdID0gdGhlIG5hbWUgb3IgdmFsdWUgb2Ygd2hhdCBpcyB0byBiZSBzcXVpZ2dsZWQKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNhZGRJbmZvVG9NZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvVG9NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlLCBJTWVzc2FnZSBtZXNzYWdlKQotICB7IAotCVN0cmluZyBrZXkgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRLZXkoKTsKLQlpZihrZXkgIT0gbnVsbCkKLQl7Ci0JICBYU0RNZXNzYWdlSW5mb0hlbHBlciBtZXNzYWdlSW5mb0hlbHBlciA9IG5ldyBYU0RNZXNzYWdlSW5mb0hlbHBlcigpOwotCSAgU3RyaW5nW10gbWVzc2FnZUluZm8gPSBtZXNzYWdlSW5mb0hlbHBlci5jcmVhdGVNZXNzYWdlSW5mbyhrZXksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSk7Ci0KLQkgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKENPTFVNTl9OVU1CRVJfQVRUUklCVVRFLCBuZXcgSW50ZWdlcih2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSkpOwotCSAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSwgbWVzc2FnZUluZm9bMF0pOwotCSAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUsIG1lc3NhZ2VJbmZvWzFdKTsKLQl9Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNnZXRWYWxpZGF0b3JJRCgpCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRvcklEKCkKLSAgewotICAgIC8vIEJlY2F1c2UgdGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgZGVsZWdhdGUsIHJldHVybiB0aGUgaWQgb2YgdGhlIHZhbGlkYXRvcgotICAgIC8vIHdoaWNoIGRlbGVnYXRlcyB0byB0aGlzIGNsYXNzLgotCi0gICAgcmV0dXJuIFhTRERlbGVnYXRpbmdWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRERlbGVnYXRpbmdWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNERGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjYxNWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNERGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzLkRlbGVnYXRpbmdWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lIChjbGFzcyBuYW1lKSB3aGljaCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsKLSAqIHdpbGwgdXNlIHRvIGlkZW50aWZ5IHRoZSBYU0QgdmFsaWRhdG9yLiBUaGUgYWN0dWFsIGRlbGVnYXRpbmcgdmFsaWRhdG9yCi0gKiBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5IHRoZSBiYXNlIGNsYXNzLiBUaGUgYWN0dWFsIHZhbGlkYXRpb24KLSAqIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgYnkgdGhlIGRlbGVnYXRlcyByZWdpc3RlcmVkIHdpdGggdGhpcyBjbGFzcyBhcwotICogdGhlaXIgdGFyZ2V0LgotICovCi1wdWJsaWMgY2xhc3MgWFNERGVsZWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIERlbGVnYXRpbmdWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgWFNERGVsZWdhdGluZ1ZhbGlkYXRvcigpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RNZXNzYWdlSW5mb0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RNZXNzYWdlSW5mb0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGUzMjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNETWVzc2FnZUluZm9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLQotLyoqCi0gKiBUaGUgWFNETWVzc2FnZUluZm9IZWxwZXIgY3JlYXRlcyBhIHN0cmluZyB3aXRoIHRoZQotICovCi1wdWJsaWMgY2xhc3MgWFNETWVzc2FnZUluZm9IZWxwZXIKLXsKLSAgcHVibGljIFhTRE1lc3NhZ2VJbmZvSGVscGVyKCkKLSAgeyBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGNyZWF0ZU1lc3NhZ2VJbmZvKFN0cmluZyBlcnJvcktleSwgU3RyaW5nIGVycm9yTWVzc2FnZSkKLSAgeyAKLSAgICAvL05vdyBtYXAgdGhlIGVycm9yIGtleSB0byB3aGF0IHdlIHdvdWxkIHdhbnQgdG8gdW5kZXJsaW5lOgotICAgIFN0cmluZyBuYW1lT3JWYWx1ZSA9ICIiOwotICAgIFN0cmluZyBzZWxlY3Rpb25TdHJhdGVneSA9ICIiOwotICAgIGlmKGVycm9yS2V5ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVycm9yS2V5LmVxdWFscygiczRzLWVsdC1pbnZhbGlkLWNvbnRlbnQuMSIpIHx8IGVycm9yS2V5LmVxdWFscygiczRzLWVsdC1tdXN0LW1hdGNoLjEiKSB8fCAKLSAgICAJCSAgZXJyb3JLZXkuZXF1YWxzKCJzNHMtYXR0LW11c3QtYXBwZWFyIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJzNHMtZWx0LWludmFsaWQtY29udGVudC4yIikpICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkICAvLyROT04tTkxTLTMkICAvLyROT04tTkxTLTQkCi0gICAgICB7IAotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoInM0cy1hdHQtbm90LWFsbG93ZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG5hbWVPclZhbHVlID0gZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuU2luZ2xlUXVvdGVzKGVycm9yTWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoInM0cy1hdHQtaW52YWxpZC12YWx1ZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7IAotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJBVFRSSUJVVEVfVkFMVUUiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG5hbWVPclZhbHVlID0gZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuU2luZ2xlUXVvdGVzKGVycm9yTWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoInM0cy1lbHQtY2hhcmFjdGVyIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIlRFWFQiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoInNyYy1yZXNvbHZlLjQuMiIpIHx8IGVycm9yS2V5LmVxdWFscygic3JjLXJlc29sdmUiKSkgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLSAgICAgIHsgCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIlZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuYW1lT3JWYWx1ZSA9IGdldEZpcnN0U3RyaW5nQmV0d2VlblNpbmdsZVF1b3RlcyhlcnJvck1lc3NhZ2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJFcVJlcXVpcmVkSW5BdHRyaWJ1dGUiKSB8fCBlcnJvcktleS5lcXVhbHMoIk9wZW5RdW90ZUV4cGVjdGVkIikgfHwgCi0gICAgCQkgIGVycm9yS2V5LmVxdWFscygiTGVzc3RoYW5JbkF0dFZhbHVlIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICB7Ci0gICAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG5hbWVPclZhbHVlID0gZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuUXVvdGVzKGVycm9yTWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVsZW1lbnRVbnRlcm1pbmF0ZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBzZWxlY3Rpb25TdHJhdGVneSA9ICJFTlRJUkVfRUxFTUVOVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRVRhZ1VudGVybWluYXRlZCIpIHx8IGVycm9yS2V5LmVxdWFscygiRVRhZ1JlcXVpcmVkIikpIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiRU5EX1RBRyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgU3RyaW5nIG1lc3NhZ2VJbmZvW10gPSBuZXcgU3RyaW5nWzJdOwotICAgIG1lc3NhZ2VJbmZvWzBdID0gc2VsZWN0aW9uU3RyYXRlZ3k7Ci0gICAgbWVzc2FnZUluZm9bMV0gPSBuYW1lT3JWYWx1ZTsKLSAgICByZXR1cm4gbWVzc2FnZUluZm87ICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSB2YWx1ZSBiZXR3ZWVuIHRoZSBmaXJzdCBwYWlyIG9mIHNpbmdsZSBxdW90ZXMKLSAgICogSXQgaXMgdXNlZCB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gdGhlIGVycm9yIE1lc3NhZ2UgKGZvciBleGFtcGxlCi0gICAqIGFuIGF0dHJpYnV0ZSBuYW1lKQotICAgKiAKLSAgICogQHBhcmFtIHMKLSAgICogCQlUaGUgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0U3RyaW5nQmV0d2VlblNpbmdsZVF1b3RlcyhTdHJpbmcgcykKLSAgewotICAgIHJldHVybiBnZXRGaXJzdFN0cmluZ0JldHdlZW5EZWxpbWl0ZXJzKHMsICdcJycpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSB2YWx1ZSBiZXR3ZWVuIHRoZSBmaXJzdCBwYWlyIG9mIHF1b3RlcwotICAgKiBJdCBpcyB1c2VkIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgZXJyb3IgTWVzc2FnZSAoZm9yIGV4YW1wbGUKLSAgICogYW4gYXR0cmlidXRlIG5hbWUpCi0gICAqIAotICAgKiBAcGFyYW0gcwotICAgKiAJCVRoZSBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuUXVvdGVzKFN0cmluZyBzKQotICB7Ci0gICAgcmV0dXJuIGdldEZpcnN0U3RyaW5nQmV0d2VlbkRlbGltaXRlcnMocywgJ1wiJyk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHZhbHVlIGJldHdlZW4gdGhlIGZpcnN0IHN0YXJ0IGFuZCBlbmQgb2NjdXJyZW5jZXMgb2YgdGhlIGdpdmVuIGRlbGltaXRlciBjaGFyYWN0ZXIuCi0gICAqIAotICAgKiBAcGFyYW0gcwotICAgKiAJCVRoZSBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KLSAgICogQHBhcmFtIGRlbGltaXRlciAKLSAgICogCQlUaGUgc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXIKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuRGVsaW1pdGVycyhTdHJpbmcgcywgY2hhciBkZWxpbWl0ZXIpCi0gIHsKLSAgICBpbnQgZmlyc3QgPSBzLmluZGV4T2YoZGVsaW1pdGVyKTsKLSAgICBpbnQgc2Vjb25kID0gcy5pbmRleE9mKGRlbGltaXRlciwgZmlyc3QgKyAxKTsKLSAgICBTdHJpbmcgc3RyaW5nQmV0d2VlbkRlbGltaXRlcnMgPSBudWxsOwotICAgIGlmIChmaXJzdCAhPSAtMSAmJiBzZWNvbmQgIT0gLTEpCi0gICAgeyAKLSAgICAgIHN0cmluZ0JldHdlZW5EZWxpbWl0ZXJzID0gcy5zdWJzdHJpbmcoZmlyc3QgKyAxLCBzZWNvbmQpOwotICAgIH0KLSAgICByZXR1cm4gc3RyaW5nQmV0d2VlbkRlbGltaXRlcnM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNEVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmUxYTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNEVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci0KLQotLyoqCi0gKiBBbiBYU0QgdmFsaWRhdG9yIHNwZWNpZmljIHRvIEVjbGlwc2UuIFRoaXMgdmFsaWRhdG9yIHdpbGwgd3JhcCB0aGUgaW50ZXJuYWwKLSAqIFhTRCB2YWxpZGF0b3IgYW4gcHJvdmlkZSBhdXRvbWF0aWMgVVJJIHJlc29sdXRpb24gc3VwcG9ydC4KLSAqIFVzaW5nIHRoaXMgY2xhc3MgaXMgZXF1aXZhbGVudCB0byB1c2luZyB0aGUgaW50ZXJuYWwgWFNEIHZhbGlkYXRvciBhbmQgcmVnaXN0ZXJpbmcKLSAqIHRoZSBVUkkgcmVzb2x2ZXIgZnJvbSB0aGUgVVJJIHJlc29sdXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgWFNEVmFsaWRhdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWFNEVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgc3RhdGljIFhTRFZhbGlkYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIFhTRCB2YWxpZGF0b3IuIFRoZSB2YWxpZGF0b3IKLSAgICogY2FuIGJlIHJldXNlZCBhbmQgY2Fubm90IGJlIGN1c3RvbWl6ZWQgc28gdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIGluc3RhbmNlIG9mIGl0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBYU0QgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYU0RWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBYU0RWYWxpZGF0b3IoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlIHRoZSBYU0QgdmFsaWRhdG9yIGFuZCBzZXQgdGhlIFVSSSByZXNvbHZlci4KLSAgICovCi0gIHByb3RlY3RlZCBYU0RWYWxpZGF0b3IoKQotICB7Ci0gICAgdGhpcy5zZXRVUklSZXNvbHZlcihVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9YU0RDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL1hTRENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzMGYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL1hTRENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5YU0RDTU1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgWFNEQ29yZVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBYU0RDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgIFhTRENNTWFuYWdlci5nZXRJbnN0YW5jZSgpLnN0YXJ0dXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhTRENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkYjRlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLlhTRENvcmVQbHVnaW47Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgWFNEIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIFhTRENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQotCQkvLyBWYWxpZGF0aW9uIHByZWZlcmVuY2VzLgotCQlub2RlLnB1dEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMsIGZhbHNlKTsKLQotCQkvLyBJbiBvcmRlciB0byBwcm92aWRlIHRoZSBiZXN0IGNvbXBhdGliaWxpdHkgYW5kIGNvbmZvcm1hbmNlIHRvIHRoZSBYTUwgU2NoZW1hCi0JCS8vIHNwZWNpZmljYXRpb24gaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGlzIGJlIGRlZmF1bHRlZCB0byB0cnVlLgotCQlub2RlLnB1dEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5GVUxMX1NDSEVNQV9DT05GT1JNQU5DRSwgdHJ1ZSk7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTljYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSBYU0QgY29yZQotICovCi1wdWJsaWMgY2xhc3MgWFNEQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBYU0RDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYWxsIHNjaGVtYSBsb2NhdGlvbnMgc2hvdWxkIGJlIGhvbm91cmVkCi0JICogZHVyaW5nIFhTRCB2YWxpZGF0aW9uLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VFJVRSwgRkFMU0V9Ci0JICogPC9wPgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyA9ICJob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX1NDSEVNQV9DT05GT1JNQU5DRSA9ICJmdWxsU2NoZW1hQ29uZm9ybWFuY2UiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmI1MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtcmVmYWN0b3IiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtYWR0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWFkdC14c2QiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtY29tbW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWFkdC14c2QtdHlwZXZpeiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1zZWFyY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ij4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwMGU0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi14c2RlZGl0b3IuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3QueHNkLnVpXzEuMC4wLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWIzODI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2QudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjODgyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1R1ZSBKYW4gMTYgMTc6NDg6MzAgRVNUIDIwMDcNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3ODJlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1R1ZSBKYW4gMTYgMTc6MDQ6MTMgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9dXNlcgotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MWNkNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNg0KLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MA0KLWNvbXBpbGVycy5wLmJ1aWxkPTANCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MA0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTANCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NTIzZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJV9VSV9QTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzZC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjIwMy5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpejt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5sYXlvdXRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMucHJvdmlkZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b207eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLmljb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uYXZpZ2F0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjQwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmdlZjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQ7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS54c2QuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmOTY2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy1zZWFyY2gvLFwKLSAgICAgICAgICAgc3JjLXJlZmFjdG9yLyxcCi0gICAgICAgICAgIHNyYy1hZHQvLFwKLSAgICAgICAgICAgc3JjLWFkdC14c2QvLFwKLSAgICAgICAgICAgc3JjLWFkdC14c2QtdHlwZXZpei8sXAotICAgICAgICAgICBzcmMtY29tbW9uLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCi1vdXRwdXQuLiA9IGJpbi8KLWphdmFjU291cmNlPTEuNAotamF2YWNUYXJnZXQ9MS40Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDQ0M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiCi0JbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhzZCI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbglpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvWFNERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvWFNERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDBmMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL1hTREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2JsYW5rLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ibGFuay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzZlMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2JsYW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGFlNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvY29sbGFwc2VfYXR0ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvY29sbGFwc2VfYXR0ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzJiZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2NvbGxhcHNlX2F0dHIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RlbGV0ZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RlbGV0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjkyMmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kZWxldGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kbGNsMTYvc2NoZW1hdmlld19jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY3OTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kbGNsMTYvc2NoZW1hdmlld19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NGZmMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvY2FwdHVyZXNjcmVlbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3MGM5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kdG9vbDE2L2hlbHBfY29udGVudHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvaGVscF9jb250ZW50cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YmY2MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvaGVscF9jb250ZW50cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0ZmYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2VsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9lbGNsMTYvc2NoZW1hdmlld19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDdmMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2VsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9lbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9lbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjMTlhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZWxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzY4MzBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvaGVscF9jb250ZW50cy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9oZWxwX2NvbnRlbnRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MDMwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9oZWxwX2NvbnRlbnRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGMxOWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi96b29tbWludXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvem9vbW1pbnVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyYzkyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi96b29tbWludXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvem9vbXBsdXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvem9vbXBsdXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjZkNzU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3pvb21wbHVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9leHBhbmRfYXR0ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXhwYW5kX2F0dHIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzI4N2U5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9leHBhbmRfYXR0ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZmlsdGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9maWx0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmU2ZjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9maWx0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREFueUF0dHJpYnV0ZWRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQW55QXR0cmlidXRlZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0MGEyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQW55QXR0cmlidXRlZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBbnlkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREFueWRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZGE3NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREFueWRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4ZGY3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzFkYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZmRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBSZWZkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWRjNThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZmRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4MTY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZVJlZmRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlUmVmZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwYWY1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlUmVmZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZWRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMWQxOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZWRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleENvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhDb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwYzEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleENvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhUeXBlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGI5NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4VHlwZWRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleFR5cGVkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQxYjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4VHlwZWRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNERWxlbWVudFJlZmRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNERWxlbWVudFJlZmRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYmQzYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREVsZW1lbnRSZWZkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREVsZW1lbnRkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREVsZW1lbnRkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjU2ODY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RFbGVtZW50ZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjJjMmQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBSZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4OTg3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwUmVmZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cFJlZmRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTdlOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwUmVmZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cGRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGRmN2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cGRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEU2ltcGxlQ29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEU2ltcGxlQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTgxMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRFNpbXBsZUNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2FsbF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2FsbF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTM3ZmJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbGxfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbGxkaXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbGxkaXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1NDg0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYWxsZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYW5ub3RhdGlvbnNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Fubm90YXRpb25zaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmYjY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYW5ub3RhdGlvbnNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2F0dHJpYnV0ZWdyb3Vwc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlZ3JvdXBzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwOTJmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlZ3JvdXBzaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hdHRyaWJ1dGVzaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hdHRyaWJ1dGVzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1NDg3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvY2hvaWNlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvY2hvaWNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjU4M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Nob2ljZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Nob2ljZWRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Nob2ljZWRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWNjNGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9jaG9pY2VkaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9kaXJlY3RpdmVzaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9kaXJlY3RpdmVzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwMGNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZGlyZWN0aXZlc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZWxlbWVudHNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2VsZW1lbnRzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmNzIwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZWxlbWVudHNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Vycm9yX21hcmtlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXJyb3JfbWFya2VyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlMWUyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXJyb3JfbWFya2VyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lcnJvcl90c2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Vycm9yX3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMDQ4ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Vycm9yX3Rzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXh0bnNuX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXh0bnNuX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNGE5NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2V4dG5zbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2V4dG5zbmRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2V4dG5zbmRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDNjZDBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9leHRuc25kaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9ncm91cHNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2dyb3Vwc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTExY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2dyb3Vwc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvaW5kZXguZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2luZGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmOWFjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvaW5kZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L25vdGF0aW9uc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvbm90YXRpb25zaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1YzY0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvbm90YXRpb25zaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zZXF1ZW5jZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NlcXVlbmNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Yjg2MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NlcXVlbmNlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2VxdWVuY2VkaXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zZXF1ZW5jZWRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDk3MmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zZXF1ZW5jZWRpc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NpbXBsZXR5cGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zaW1wbGV0eXBlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNzQ0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NpbXBsZXR5cGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zaW1wbGV0eXBlZGlzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2ltcGxldHlwZWRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA5NzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zaW1wbGV0eXBlZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9saXN0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9saXN0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNTE4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfbGlzdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfbGlzdGRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfbGlzdGRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODM4MjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX2xpc3RkaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3Jlc3RyaWN0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmE5YWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3Jlc3RyaWN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdGRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfcmVzdHJpY3RkaXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2NzY2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdGRpc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfdW5pb25fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3VuaW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTMxNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfdW5pb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3VuaW9uZGlzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF91bmlvbmRpc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTcyMDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3VuaW9uZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvdHlwZXNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3R5cGVzaGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2NzU0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvdHlwZXNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2F0dHJpYnV0ZW92ZXJsYXkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2F0dHJpYnV0ZW92ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTMxZjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9hdHRyaWJ1dGVvdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9lcnJvcl9vdnIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2Vycm9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2Vycm9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXh0bnNuX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXh0bnNuX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNDQyMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2V4dG5zbl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2V4dG5zbmRpc19vdnIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2V4dG5zbmRpc19vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGViNzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9leHRuc25kaXNfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi90ZXh0b3ZlcmxheS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvdGV4dG92ZXJsYXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDU1YzJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi90ZXh0b3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MTgzNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODU0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTVNDSCAtIFhNTCBUb29scyAtICBYTUwgU2NoZW1hIEVkaXRvcgotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLSEKLSEgUGx1Z2luCi0hCi1fVUlfUExVR0lOX05BTUUgICAgICAgICAgICAgPSBYTUwgU2NoZW1hIEVkaXRvcgotX1VJX0VESVRPUl9OQU1FICAgICAgICAgICAgID0gWE1MIFNjaGVtYSBFZGl0b3IKLQotX1VJX0FDVElPTl9FWFRfR0VORVJBVEUgICAgICA9ICZHZW5lcmF0ZQotX1VJX0FDVElPTl9FWFRfR0VORVJBVEVfRERMICA9ICZEREwuLi4KLV9VSV9BQ1RJT05fRVhUX0dFTkVSQVRFX0RURCAgPSBEJlRELi4uCi1fVUlfQUNUSU9OX0VYVF9HRU5FUkFURV9KQVZBID0gJkphdmEgQmVhbnMuLi4KLQotX1VJX0FDVElPTl9FWFRfR0VORVJBVEVfWFNEID0gJkdlbmVyYXRlIFhNTCBTY2hlbWEKLV9VSV9XSVpBUkRfTkFNRV9ORVdfWFNEICAgICA9IFhNTCBTY2hlbWEKLQotX1VJX1hNTF9UT09MU19QUkVGRVJFTkNFX1BBR0UgID0gWE1MCi1fVUlfWE1MX1NDSEVNQV9QUkVGRVJFTkNFICAgICAgPSBYTUwgU2NoZW1hIEZpbGVzCi0KLV9VSV9XSVpBUkRfTkVXX1hTRCAgICAgICAgICAgICA9IFhNTCBTY2hlbWEKLV9VSV9DUkVBVEVfQV9ORVdfU0NIRU1BICAgICAgICA9IENyZWF0ZSBhIG5ldyBYTUwgc2NoZW1hIGZpbGUKLQotISBOZXcgcHJvcGVydHkgdGFicwotX1VJX0xBQkVMX0dFTkVSQUwgICAgICAgICAgPSBHZW5lcmFsCi1fVUlfTEFCRUxfQVRUUklCVVRFUyAgICAgICA9IEF0dHJpYnV0ZXMKLV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OICAgID0gRG9jdW1lbnRhdGlvbgotX1VJX0xBQkVMX1RZUEVfQ09OU1RSQUlOVFMgPSBDb25zdHJhaW50cwotX1VJX0xBQkVMX0FQUExJQ0FUSU9OX0lORk8gPSBBcHBsaWNhdGlvbiBJbmZvCi1fVUlfTEFCRUxfRVhURU5TSU9OUyAgICAgICA9IEV4dGVuc2lvbnMKLV9VSV9MQUJFTF9GQUNFVFMgICAgICAgICAgID0gRmFjZXRzCi1fVUlfTEFCRUxfRU5VTUVSQVRJT05TICAgICA9IEVudW1lcmF0aW9ucwotX1VJX0xBQkVMX05BTUVTUEFDRSAgICAgICAgPSBOYW1lc3BhY2UKLV9VSV9MQUJFTF9BRFZBTkNFRCAgICAgICAgID0gQWR2YW5jZWQKLQotX1VJX0xBQkVMX1JFQURfT05MWSAgICAgPSByZWFkLW9ubHkKLV9VSV9MQUJFTF9LSU5EICAgICAgICAgID0gS2luZDoKLV9VSV9MQUJFTF9WQVJJRVRZICAgICAgID0gVmFyaWV0eToKLQotX1VJX0xBQkVMX0FQUF9JTkZPICAgICAgPSBBcHAgSW5mbwotCi0hCi0hIFNjaGVtYSBGaWxlIFdpbmRvdwotIQotX1VJX0xBQkVMX0ZJTEVfTkFNRSAgICAgICAgICAgICAgPSBGaWxlIG5hbWU6Ci1fVUlfTEFCRUxfVkVSU0lPTiAgICAgICAgICAgICAgICA9IFZlcnNpb246Ci1fVUlfVE9PTFRJUF9WRVJTSU9OICAgICAgICAgICAgICA9IENvbnZlbmllbnQgYXR0cmlidXRlIHRvIHN0b3JlIHZlcnNpb24gbnVtYmVyCi1fVUlfTEFCRUxfTEFOR1VBR0UgICAgICAgICAgICAgICA9IExhbmd1YWdlOgotX1VJX1RPT0xUSVBfTEFOR1VBR0UgICAgICAgICAgICAgPSBSZXByZXNlbnRzIG5hdHVyYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMKLV9VSV9HUk9VUF9OQU1FU1BBQ0UgICAgICAgICAgICAgID0gTmFtZXNwYWNlCi1fVUlfTEFCRUxfU0NIRU1BX1BSRUZJWCAgICAgICAgICA9IFByZWZpeDoKLV9VSV9UT09MVElQX1NDSEVNQV9QUkVGSVggICAgICAgID0gVGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbmFtZXNwYWNlLgotX1VJX0xBQkVMX1RBUkdFVF9OQU1FX1NQQUNFICAgICAgPSBUYXJnZXQgbmFtZXNwYWNlOgotX1VJX1RPT0xUSVBfVEFSR0VUX05BTUVfU1BBQ0UgICAgPSBUaGUgbmFtZXNwYWNlIGZvciB0aGlzIHNjaGVtYS4KLV9VSV9CVVRUT05fQVBQTFkgICAgICAgICAgICAgICAgID0gQXBwbHkKLV9VSV9MQUJFTF9BVFRSSUJVVEVfRk9STV9ERUZBVUxUID0gQXR0cmlidXRlIGZvcm0gZGVmYXVsdDoKLV9VSV9UT09MVElQX0FUVFJJQlVURV9GT1JNICAgICAgID0gSW5kaWNhdGVzIGlmIGFsbCBhdHRyaWJ1dGVzIGluIGEgc2NoZW1hIG11c3QgYmUgcXVhbGlmaWVkIG9yIG5vdCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9MQUJFTF9FTEVNRU5UX0ZPUk1fREVGQVVMVCAgID0gRWxlbWVudCBmb3JtIGRlZmF1bHQ6Ci1fVUlfVE9PTFRJUF9FTEVNRU5UX0ZPUk1fREVGQVVMVCA9IEluZGljYXRlcyBpZiBhbGwgZWxlbWVudHMgaW4gYSBzY2hlbWEgbXVzdCBiZSBxdWFsaWZpZWQgb3Igbm90IGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudAotX1VJX0xBQkVMX0JMT0NLX0RFRkFVTFQgICAgICAgICAgPSBCbG9jayBkZWZhdWx0OgotX1VJX1RPT0xUSVBfQkxPQ0tfREVGQVVMVCAgICAgICAgPSBDb250cm9sIGRlcml2YXRpb25zIGZvciBldmVyeSB0eXBlIGFuZCBlbGVtZW50IGluIHRoZSBzY2hlbWEKLV9VSV9MQUJFTF9GSU5BTF9ERUZBVUxUICAgICAgICAgID0gRmluYWwgZGVmYXVsdDoKLV9VSV9UT09MVElQX0ZJTkFMX0RFRkFVTFQgICAgICAgID0gQ29udHJvbCBkZXJpdmF0aW9ucyBmb3IgZXZlcnkgdHlwZSBhbmQgZWxlbWVudCBpbiB0aGUgc2NoZW1hCi1fVUlfQUNUSU9OX0RFTEVURV9JTkNMVURFICAgICAgICA9IERlbGV0ZQotX1VJX0FDVElPTl9ERUxFVEVfTk9ERVMgICAgICAgICAgPSBEZWxldGUgTm9kZXMKLSEgTm90ZSB0byB0cmFuc2xhdG9yczogVGhlIGZvbGxvd2luZyBpcyB0aGUgYWNyb255bSBmb3IgVW5pZm9ybSBSZXNvdXJjZSBJbmRpY2F0b3IKLV9VSV9MQUJFTF9VUkkgICAgICAgICAgICAgICAgICAgID0gVVJJOgotCi0KLV9VSV9MQUJFTF9BREQgICAgICAgICAgICAgID0gQWRkLi4uCi1fVUlfTEFCRUxfRURJVCAgICAgICAgICAgICA9IEVkaXQuLi4KLV9VSV9MQUJFTF9QQVRURVJOUyAgICAgICAgID0gUGF0dGVybnMKLV9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTID0gVGhlIGZpbGUgbmFtZSBhbHJlYWR5IGV4aXN0czogezB9Ci0KLSEKLSEgQW55IFNlY3Rpb24KLSEKLSEgTm90ZSB0byB0cmFuc2xhdG9ycyAtIHRyYW5zbGF0ZSBvbmx5IHRoZSB3b3JkIGFuZAotX1VJX0xBQkVMX05BTUVTUEFDRV9BTkRfUFJPQ0VTU19DT05URU5UUyA9IG5hbWVzcGFjZSBhbmQgcHJvY2Vzc0NvbnRlbnRzCi0KLSEKLSEgbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMgc2VjdGlvbgotIQotISBOb3RlIHRvIHRyYW5zbGF0b3JzIC0gdHJhbnNsYXRlIG9ubHkgdGhlIHdvcmQgYW5kCi1fVUlfTEFCRUxfTUlOT0NDVVJTX0FORF9NQVhPQ0NVUlMgPSBtaW5PY2N1cnMgYW5kIG1heE9jY3VycwotCi0hCi0hIFZhbHVlIEluZm9ybWF0aW9uIFNlY3Rpb24KLSEKLV9VSV9MQUJFTF9WQUxVRV9JTkZPUk1BVElPTiAgID0gVmFsdWUgSW5mb3JtYXRpb24KLQotIQotISBOb3RhdGlvbiB3aW5kb3cKLSEKLV9VSV9OT1RBVElPTl9OQU1FICAgICAgICAgICAgICAgID0gTmFtZToKLV9VSV9OT1RBVElPTl9QVUJMSUMgICAgICAgICAgICAgID0gUHVibGljOgotX1VJX05PVEFUSU9OX1NZU1RFTSAgICAgICAgICAgICAgPSBTeXN0ZW06Ci1fVUlfVE9PTFRJUF9QVUJMSUMgICAgICAgICAgICAgICA9IEFuIG9wdGlvbmFsIHB1YmxpYyBpZGVudGlmaWVyCi1fVUlfVE9PTFRJUF9TWVNURU0gICAgICAgICAgICAgICA9IEFuIG9wdGlvbmFsIFVSSSByZWZlcmVuY2UKLQotIQotISBDb21wbGV4IFR5cGUgV2luZG93Ci0hCi1fVUlfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICA9IE5hbWU6Ci1fVUlfQUJTVFJBQ1QgICAgICAgICAgICAgICAgICAgICA9IEFic3RyYWN0OgotX1VJX01JWEVEICAgICAgICAgICAgICAgICAgICAgICAgPSBNaXhlZDoKLV9VSV9CTE9DSyAgICAgICAgICAgICAgICAgICAgICAgID0gQmxvY2s6Ci1fVUlfRklOQUwgICAgICAgICAgICAgICAgICAgICAgICA9IEZpbmFsOgotCi1fVUlfQ1RfVE9PTFRJUF9NSVhFRCAgICAgICAgICAgICA9IEluZGljYXRlcyBpZiB0eXBlIG1heSBjb250YWluIG1peGVkIGNvbnRlbnQKLV9VSV9DVF9UT09MVElQX0FCU1RSQUNUICAgICAgICAgID0gV2hlbiBhIGNvbXBsZXggdHlwZSBpcyBkZWNsYXJlZCBhYnN0cmFjdCwgaXQgY2Fubm90IGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9DVF9UT09MVElQX0ZJTkFMICAgICAgICAgICAgID0gWW91IGNhbiB1c2UgdGhpcyB0byBwcmV2ZW50IGZ1cnRoZXIgZGVyaXZhdGlvbnMKLV9VSV9DVF9UT09MVElQX0JMT0NLICAgICAgICAgICAgID0gWW91IGNhbiB1c2UgdGhpcyB0byBibG9jayBhbnkgZGVyaXZhdGlvbnMKLQotIQotISBTaW1wbGVDb250ZW50IGFuZCBDb21wbGV4Q29udGVudCBXaW5kb3cKLSEgCi1fVUlfTEFCRUxfREVSSVZFRF9CWSAgICAgICAgICAgID0gRGVyaXZlZCBieToKLV9VSV9UT09MVElQX0RFUklWRURfQlkgICAgICAgICAgPSBEZXJpdmUgYnkgZXh0ZW5zaW9uIHRvIGluaGVyaXQgZnJvbSBhIGJhc2UgdHlwZSBjb250ZW50IG1vZGVsIGFuZCBhZGQgdG8gaXQuIERlcml2ZSBieSByZXN0cmljdGlvbiB0byByZXN0cmljdCB0aGUgY29udGVudCBtb2RlbCBvZiBhbiBleGlzdGluZyB0eXBlLgotCi0hCi0hIENvbWJvIGJveCBpdGVtcyAtIG5vIG5lZWQgdG8gdHJhbnNsYXRlCi0hCi1fVUlfQ09NQk9fUkVTVFJJQ1RJT04gICAgICAgICAgID0gcmVzdHJpY3Rpb24KLV9VSV9DT01CT19FWFRFTlNJT04gICAgICAgICAgICAgPSBleHRlbnNpb24KLQotIQotISBFbGVtZW50ICYgRWxlbWVudCBSZWYgV2luZG93Ci0hCi1fVUlfRUxFTUVOVF9OQU1FICAgICAgICAgICAgICAgICA9IE5hbWU6Ci1fVUlfQ0hFQ0tCT1hfTklMTEFCTEUgICAgICAgICAgICA9IE5pbGxhYmxlCi1fVUlfQ0hFQ0tCT1hfQUJTVFJBQ1QgICAgICAgICAgICA9IEFic3RyYWN0Ci1fVUlfU1VCU1RJVFVUSU9OICAgICAgICAgICAgICAgICA9IFN1YnN0aXR1dGlvbiBncm91cDoKLV9VSV9NSU5JTVVNICAgICAgICAgICAgICAgICAgICAgID0gTWluaW11bToKLV9VSV9NQVhJTVVNICAgICAgICAgICAgICAgICAgICAgID0gTWF4aW11bToKLV9VSV9SRUZFUkVOQ0VfTkFNRSAgICAgICAgICAgICAgID0gUmVmZXJlbmNlIG5hbWU6Ci0KLV9VSV9UT09MVElQX0VMRU1FTlRfTUlOSU1VTSAgICAgID0gQSBub24tbmVnYXRpdmUgaW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgbWluaW11bSBudW1iZXIgb2YgdGltZXMgYW4gZWxlbWVudCBjYW4gb2NjdXIuCi1fVUlfVE9PTFRJUF9FTEVNRU5UX01BWElNVU0gICAgICA9IEEgbm9uLW5lZ2F0aXZlIGludGVnZXIgb3IgdW5ib3VuZGVkIGlmIHRoZXJlIGlzIG5vIHVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIG9jY3VyLgotX1VJX1RPT0xUSVBfRUxFTUVOVF9BQlNUUkFDVCAgICAgPSBXaGVuIGFuIGVsZW1lbnQgaXMgZGVjbGFyZWQgYWJzdHJhY3QsIGEgbWVtYmVyIG9mIGl0cyBlcXVpdmFsZW50IGNsYXNzIG11c3QgYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCwKLV9VSV9UT09MVElQX0VMRU1FTlRfTklMICAgICAgICAgID0gSWYgc2VsZWN0ZWQsIGFuIGF0dHJpYnV0ZSBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGEgbmlsIHZhbHVlLgotX1VJX1RPT0xUSVBfRUxFTUVOVF9TVUJTVElUVVRJT04gPSBTZWxlY3QgdGhlIGVsZW1lbnQgdGhhdCBjYW4gYmUgc3Vic3RpdHV0ZWQgYnkgdGhpcyBlbGVtZW50Ci1fVUlfVE9PTFRJUF9FTEVNRU5UX0ZPUk0gICAgICAgICA9IEluZGljYXRlcyBpZiB0aGUgZWxlbWVudCBpcyBxdWFsaWZlZCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9UT09MVElQX0VMRU1FTlRfVkFMVUUgICAgICAgID0gUHJvdmlkZXMgYSBkZWZhdWx0IG9yIGZpeGVkIHZhbHVlIGZvciB0aGUgZWxlbWVudC4KLQotCi0hCi0hIEF0dHJpYnV0ZSBXaW5kb3cKLSEgICAgX1VJX0NPTUJPX0JPWCBzdHJpbmdzIGFyZSB1c2VkIGluIGNvZGUgZ2VuZXJhdGlvbi4gCi0hICAgIFByb2JhYmx5IGRvbid0IG5lZWQgdG8gYmUgdHJhbnNsYXRlZAotIQotX1VJX0NPTUJPX0JPWF9SRVFVSVJFRCAgICAgICAgICAgPSByZXF1aXJlZAotX1VJX0NPTUJPX0JPWF9PUFRJT05BTCAgICAgICAgICAgPSBvcHRpb25hbAotX1VJX0NPTUJPX0JPWF9QUk9ISUJJVEVEICAgICAgICAgPSBwcm9oaWJpdGVkCi0KLV9VSV9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgID0gRml4ZWQKLV9VSV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgID0gRGVmYXVsdAotX1VJX0FUVFJJQlVURV9OQU1FICAgICAgICAgICAgICAgPSBBdHRyaWJ1dGUgbmFtZToKLV9VSV9VU0FHRSAgICAgICAgICAgICAgICAgICAgICAgID0gVXNhZ2U6Ci1fVUlfRk9STSAgICAgICAgICAgICAgICAgICAgICAgICA9IEZvcm0gcXVhbGlmaWNhdGlvbjoKLV9VSV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgID0gVmFsdWUKLQotX1VJX0xBQkVMX09USEVSX0FUVFJJQlVURVMgICAgICAgPSBPdGhlciBBdHRyaWJ1dGVzCi0KLV9VSV9UT09MVElQX0FUVFJJQlVURV9VU0UgICAgICAgID0gSW5kaWNhdGVzIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQsIG9wdGlvbmFsLCBvciBwcm9oaWJpdGVkCi1fVUlfVE9PTFRJUF9BVFRSSUJVVEVfRk9STSAgICAgICA9IEluZGljYXRlcyBpZiB0aGUgYXR0cmlidXRlIGlzIHF1YWxpZmVkIG9yIG5vdCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9UT09MVElQX0FUVFJJQlVURV9WQUxVRSAgICAgID0gUHJvdmlkZXMgZGVmYXVsdCBvciBmaXhlZCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4gRGVmYXVsdCB2YWx1ZSBvbmx5IHZhbGlkIGlmIFVzYWdlIHZhbHVlIGlzIHNldCB0byBvcHRpb25hbC4KLQotX1VJX1BST0NFU1NfQ09OVEVOVFMgICAgICAgICAgICAgPSBQcm9jZXNzIGNvbnRlbnRzOgotCi0hCi0hIEFubm90YXRpb24gLSBEb2MgJiBBcHBJbmZvIFdpbmRvdwotIQotX1VJX0NPTU1FTlQgICAgICAgICAgICAgICAgICAgICAgPSBDb21tZW50Ci1fVUlfVE9PTFRJUF9DT01NRU5UICAgICAgICAgICAgICA9IEluZm9ybWF0aW9uIHVzZWZ1bCB0byB0aGUgdXNlciBvciBhcHBsaWNhdGlvbgotX1VJX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgPSBTb3VyY2U6Ci1fVUlfVE9PTFRJUF9TT1VSQ0UgICAgICAgICAgICAgICA9IEFuIG9wdGlvbmFsIFVSSSByZWZlcmVuY2UgdG8gc3VwcGxlbWVudCB0aGUgbG9jYWwgaW5mb3JtYXRpb24KLV9VSV9MQU5HVUFHRSAgICAgICAgICAgICAgICAgICAgID0gTGFuZ3VhZ2U6Ci1fVUlfVE9PTFRJUF9MQU5HVUFHRV9BTk5PVEFUSU9OICA9IEluZGljYXRlIHRoZSBsYW5ndWFnZSBpbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBleHByZXNzZWQKLQotIQotISBHcm91cAotISAKLV9VSV9DT05URU5UX01PREVMICAgICAgICAgICAgICAgPSBDb250ZW50IG1vZGVsCi1fVUlfU0VRVUVOQ0UgICAgICAgICAgICAgICAgICAgID0gU2VxdWVuY2UKLV9VSV9DSE9JQ0UgICAgICAgICAgICAgICAgICAgICAgPSBDaG9pY2UKLV9VSV9BTEwgICAgICAgICAgICAgICAgICAgICAgICAgPSBBbGwKLQotCi0hCi0hIFNpbXBsZSBUeXBlIFJlbGF0ZWQgRmFjZXRzICAtIGFwcGVhciBhcyBlbnRyaWVzIGluIGEgdGFibGUgLSByZXN0cmljdGlvbiBvbiBzaW1wbGUgdHlwZQotIQotX1VJX0dST1VQX0ZBQ0VUUyAgICAgICAgICAgICAgICA9IEZhY2V0cwotX1VJX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICA9IExlbmd0aAotX1VJX01JTklNVU1fTEVOR1RIICAgICAgICAgICAgICA9IE1pbmltdW0gTGVuZ3RoCi1fVUlfTUFYSU1VTV9MRU5HVEggICAgICAgICAgICAgID0gTWF4aW11bSBMZW5ndGgKLV9VSV9NSU5JTVVNX0lOQ0xVU0lWRSAgICAgICAgICAgPSBNaW5pbXVtIEluY2x1c2l2ZQotX1VJX01BWElNVU1fSU5DTFVTSVZFICAgICAgICAgICA9IE1heGltdW0gSW5jbHVzaXZlCi1fVUlfTUlOSU1VTV9FWENMVVNJVkUgICAgICAgICAgID0gTWluaW11bSBFeGNsdXNpdmUKLV9VSV9NQVhJTVVNX0VYQ0xVU0lWRSAgICAgICAgICAgPSBNYXhpbXVtIEV4Y2x1c2l2ZQotX1VJX1RPVEFMX0RJR0lUUyAgICAgICAgICAgICAgICA9IFRvdGFsIERpZ2l0cwotX1VJX0ZSQUNUSU9OX0RJR0lUUyAgICAgICAgICAgICA9IEZyYWN0aW9uIERpZ2l0cwotX1VJX1dISVRFX1NQQUNFICAgICAgICAgICAgICAgICA9IFdoaXRlIFNwYWNlCi1fVUlfRkFDRVRfTkFNRSAgICAgICAgICAgICAgICAgID0gTmFtZQotX1VJX0ZBQ0VUX1ZBTFVFICAgICAgICAgICAgICAgICA9IFZhbHVlCi1fVUlfRkFDRVRfRklYRUQgICAgICAgICAgICAgICAgID0gRml4ZWQKLQotX1VJX1RPT0xUSVBfTEVOR1RIICAgICAgICAgICAgICA9IFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgbGVuZ3RoLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuCi1fVUlfVE9PTFRJUF9NSU5fTEVOICAgICAgICAgICAgID0gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHVuaXRzIG9mIGxlbmd0aC4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLgotX1VJX1RPT0xUSVBfTUFYX0xFTiAgICAgICAgICAgICA9IFRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml0cyBvZiBsZW5ndGguIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KLV9VSV9UT09MVElQX01BWF9JTkNMVVNJVkUgICAgICAgPSBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHZhbHVlIHNwYWNlLiBUaGUgdmFsdWUgaXMgaXRzZWxmIGluY2x1ZGVkLgotX1VJX1RPT0xUSVBfTUFYX0VYQ0xVU0lWRSAgICAgICA9IFRoZSB1cHBlciBib3VuZCBvZiB0aGUgdmFsdWUgc3BhY2UuIFRoZSB2YWx1ZSBpcyBpdHNlbGYgZXhjbHVkZWQuCi1fVUlfVE9PTFRJUF9NSU5fSU5DTFVTSVZFICAgICAgID0gVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSB2YWx1ZSBzcGFjZS4gVGhlIHZhbHVlIGlzIGl0c2VsZiBpbmNsdWRlZC4KLV9VSV9UT09MVElQX01JTl9FWENMVVNJVkUgICAgICAgPSBUaGUgbG93ZXIgYm91bmQgb2YgdGhlIHZhbHVlIHNwYWNlLiBUaGUgdmFsdWUgaXMgaXRzZWxmIGV4Y2x1ZGVkLgotX1VJX1RPT0xUSVBfVE9UQUxfRElHSVRTICAgICAgICA9IFRoZSBtYXhpbXVtIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cy4gTXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuCi1fVUlfVE9PTFRJUF9GUkFDVElPTl9ESUdJVFMgICAgID0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGluIHRoZSBmcmFjdGlvbmFsIHBhcnQuIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KLV9VSV9UT09MVElQX1dISVRFX1NQQUNFICAgICAgICAgPSBJbmRpY2F0ZXMgaWYgd2hpdGUgc3BhY2Ugc2hvdWxkIGJlIHByZXNlcnZlZCwgcmVwbGFjZWQgb3IgY29sbGFwc2VkLiAKLQotX1VJX1RPT0xUSVBfUEFUVEVSTiAgICAgICAgICAgICA9IENvbnN0cmFpbnMgdGhlIHZhbHVlIHRvIG1hdGNoIGEgc3BlY2lmaWMgcGF0dGVybi4gVGhlIHBhdHRlcm4gbXVzdCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gCi1fVUlfVE9PTFRJUF9FTlVNICAgICAgICAgICAgICAgID0gQ29uc3RyYWlucyB0aGUgdmFsdWUgdG8gYSBzcGVjaWZpZWQgc2V0IG9mIHZhbHVlcy4gCi0KLSEKLSEgU2ltcGxlL0NvbXBsZXggVHlwZSBTZWxlY3Rpb24gCi0hCi1fVUlfTEFCRUxfVFlQRV9JTkZPUk1BVElPTiAgICAgICAgICA9IFR5cGUgaW5mb3JtYXRpb24KLV9VSV9MQUJFTF9CQVNFX1RZUEUgICAgICAgICAgICAgICAgID0gQmFzZSB0eXBlCi1fVUlfTEFCRUxfQkFTRV9UWVBFX1dJVEhfQ09MT04gICAgICA9IEJhc2UgdHlwZToKLV9VSV9MQUJFTF9TRVRfQkFTRV9UWVBFICAgICAgICAgICAgID0gU2V0IEJhc2UgVHlwZQotX1VJX0FDVElPTl9TRVRfQkFTRV9UWVBFICAgICAgICAgICAgPSBTZXQgQmFzZSBUeXBlLi4uCi1fVUlfUkFESU9fTk9ORSAgICAgICAgICAgICAgICAgICAgICA9IE5vbmUKLV9VSV9SQURJT19CVUlMVF9JTl9TSU1QTEVfVFlQRSAgICAgID0gQnVpbHQtaW4gc2ltcGxlIHR5cGUKLV9VSV9SQURJT19VU0VSX0RFRklORURfU0lNUExFX1RZUEUgID0gVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlCi1fVUlfUkFESU9fVVNFUl9ERUZJTkVEX0NPTVBMRVhfVFlQRSA9IFVzZXItZGVmaW5lZCBjb21wbGV4IHR5cGUKLV9VSV9MQUJFTF9ORVdfQ09NUExFWF9UWVBFICAgICAgICAgID0gTmV3IENvbXBsZXggVHlwZQotX1VJX0xBQkVMX05FV19TSU1QTEVfVFlQRSAgICAgICAgICAgPSBOZXcgU2ltcGxlIFR5cGUKLV9VSV9MQUJFTF9TRVRfVFlQRQkJCQkgICAgPSBTZXQgVHlwZQotX1VJX0xBQkVMX1NFVF9FWElTVElOR19UWVBFIAkJPSBTZXQgRXhpc3RpbmcgVHlwZS4uLgotX1VJX05PX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgPSAqKm5vbmUqKgotX1VJX0xBQkVMX0NPTVBPTkVOVFMJCQkJPSBDb21wb25lbnRzOgotX1VJX0xBQkVMX1FVQUxJRklFUgkJCQkJPSBRdWFsaWZpZXI6Ci0KLV9VSV9MQUJFTF9DT01QT05FTlRfTkFNRQkJCSAgID0gQ29tcG9uZW50IE5hbWU6Ci1fVUlfTEFCRUxfTUFUQ0hJTkdfQ09NUE9ORU5UUwkJICAgPSBNYXRjaGluZyBDb21wb25lbnRzOgotX1VJX0xBQkVMX01BVENISU5HX1RZUEVTCQkgICAJICAgPSBNYXRjaGluZyBUeXBlczoKLV9VSV9MQUJFTF9UWVBFX05BTUUJCQkJCSAgID0gVHlwZSBOYW1lOgotX1VJX0xBQkVMX1NQRUNJRklFRF9GSUxFCQkJICAgPSBTcGVjaWZpZWQgRmlsZQotX1VJX0xBQkVMX0VOQ0xPU0lOR19QUk9KRUNUCQkJICAgPSBFbmNsb3NpbmcgUHJvamVjdAotX1VJX0xBQkVMX1dPUktTUEFDRQkJCQkJICAgPSBXb3Jrc3BhY2UKLV9VSV9MQUJFTF9DVVJSRU5UX1JFU09VUkNFCQkJICAgPSBDdXJyZW50IFJlc291cmNlCi1fVUlfTEFCRUxfU0VBUkNIX1NDT1BFCQkJCSAgID0gU2VhcmNoIFNjb3BlCi1fVUlfTEFCRUxfTkFSUk9XX1NFQVJDSF9TQ09QRV9SRVNPVVJDRSA9IFVzZSByZXNvdXJjZSB2aWV3IHRvIG5hcnJvdyBzZWFyY2ggc2NvcGUKLV9VSV9MQUJFTF9BVkFJTEFCTEVfVFlQRVMJCQkgICA9IEF2YWlsYWJsZSBUeXBlcwotCi0KLSEKLSEgQ29tYm8tYm94IHZhbHVlIAotISBOT1RFIFRPIFRSQU5TTEFUT1I6IERvIG5vdCB0cmFuc2xhdGUgZm9sbG93aW5nIGxpbmUKLV9VSV9ERUZBVUxUX0FOT05ZTU9VUyAgICAgICAgICAgICAgID0gKiphbm9ueW1vdXMqKgotCi0hCi0hIFVuaXF1ZSwgS2V5IGFuZCBLZXlSZWYgd2luZG93Ci0hCi1fVUlfUkVGRVJFTkNFX0tFWSAgICAgICAgICAgICAgICAgICA9IFJlZmVyZW5jZSBrZXkKLV9VSV9TRUxFQ1RPUiAgICAgICAgICAgICAgICAgICAgICAgID0gU2VsZWN0b3IKLV9VSV9GSUVMRFMgICAgICAgICAgICAgICAgICAgICAgICAgID0gRmllbGRzCi0KLV9VSV9UT09MVElQX1NFTEVDVE9SX1RFWFQgICAgICAgICAgID0gU3BlY2lmaWVzIGFuIFhQYXRoIGV4cHJlc3Npb24gcmVsYXRpdmUgdG8gaW5zdGFuY2VzIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQKLV9VSV9UT09MVElQX0ZJRUxEX1RFWFQgICAgICAgICAgICAgID0gU3BlY2lmaWVzIGFuIFhQYXRoIGV4cHJlc3Npb24gcmVsYXRpdmUgdG8gZWFjaCBlbGVtZW50IHNlbGVjdGVkIGJ5IHRoZSBzZWxlY3RvcgotCi1fVUlfQUREX0JVVFRPTiAgICAgICAgICAgICAgICAgICAgICA9IEFkZD4+Ci1fVUlfUkVNT1ZFX0JVVFRPTiAgICAgICAgICAgICAgICAgICA9IDw8UmVtb3ZlCi0KLSEKLSEgSW5jbHVkZSAmIEltcG9ydHMKLSEKLV9VSV9MQUJFTF9QUkVGSVggICAgICAgICAgICAgICAgPSBQcmVmaXg6Ci1fVUlfTEFCRUxfTkFNRVNQQUNFICAgICAgICAgICAgID0gTmFtZXNwYWNlOgotCi1fVUlfU0NIRU1BX0lOQ0xVREVfREVTQyAgICAgICAgID0gU2VsZWN0IGEgc2NoZW1hIGZpbGUgc28gdGhhdCB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNjaGVtYSBmaWxlIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBjdXJyZW50IHNjaGVtYS4KLV9VSV9MQUJFTF9TQ0hFTUFfSU1QT1JUX0RFU0MgICAgPSBTZWxlY3QgYSBzY2hlbWEgZmlsZSBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZSBzbyB0aGF0IGl0cyBkZWZpbml0aW9ucyBjYW4gYmUgcmVmZXJlbmNlZCBieSB0aGUgY3VycmVudCBzY2hlbWEuIFlvdSBtdXN0IGFzc29jaWF0ZSBhIHByZWZpeCB3aXRoIHRoZSBuZXcgbmFtZXNwYWNlIGZvciB1c2UgaW4gdGhlIGN1cnJlbnQgc2NoZW1hLgotCi1fVUlfTEFCRUxfU0NIRU1BX0xPQ0FUSU9OICAgICAgICA9IFNjaGVtYSBsb2NhdGlvbjoKLV9VSV9CVVRUT05fU0VMRUNUICAgICAgICAgICAgICAgID0gU2VsZWN0Ci1fVUlfRklMRURJQUxPR19TRUxFQ1RfWE1MX1NDSEVNQSA9IFNlbGVjdCBYTUwgc2NoZW1hIGZpbGUKLV9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfREVTQyAgID0gU2VsZWN0IGFuIFhNTCBzY2hlbWEgZmlsZSBmcm9tIHRoZSBXb3JrYmVuY2ggcHJvamVjdHMKLV9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfVVJMICAgID0gU2VsZWN0IGFuIFhNTCBzY2hlbWEgZmlsZSBmcm9tIEhUVFAKLQotX1VJX0xBQkVMX0xPQURJTkdfWE1MX1NDSEVNQSAgICAgPSBMb2FkaW5nIFhNTCBTY2hlbWEKLV9VSV9MQUJFTF9GSU5JU0hfTE9BRElORyAgICAgICAgID0gRmluaXNoIExvYWRpbmcKLV9VSV9MQUJFTF9OT19MT0NBVElPTl9TUEVDSUZJRUQgID0gTm8gTG9jYXRpb24gU3BlY2lmaWVkCi0KLSEKLSEgWFNEIEVkaXRvcgotIQotX1VJX1RBQl9TT1VSQ0UgICAgICAgICAgICAgICAgICA9IFNvdXJjZQotX1VJX1RBQl9ERVNJR04gICAgICAgICAgICAgICAgICA9IERlc2lnbgotISAgTm90ZSB0byB0cmFuc2xhdG9yczogR3JhcGggaXMgdGhlIGdyYXBoaWMgdmlldyBvZiB0aGUgWE1MIHNjaGVtYQotX1VJX1RBQl9HUkFQSCAgICAgICAgICAgICAgICAgICA9IEdyYXBoCi1fVUlfTUVOVV9VTkRPICAgICAgICAgICAgICAgICAgID0gJlVuZG8gQEN0cmwrWgotX1VJX01FTlVfUkVETyAgICAgICAgICAgICAgICAgICA9ICZSZWRvIEBDdHJsK1kKLQotIQotISBUYXNrIExpc3QgUmVsYXRlZCBNZXNzYWdlCi0hCi1fVUlfUkVGX0ZJTEVfRVJST1JfREVTQ1JJUFRJT04gICAgICA9IFRoZSBlcnJvcnMgYmVsb3cgd2VyZSBkZXRlY3RlZCB3aGVuIHZhbGlkYXRpbmcgdGhlIGZpbGUgInswfSIgdmlhIHRoZSBmaWxlICJ7MX0iLiAgSW4gbW9zdCBjYXNlcyB0aGVzZSBlcnJvcnMgY2FuIGJlIGRldGVjdGVkIGJ5IHZhbGlkYXRpbmcgInsyfSIgZGlyZWN0bHkuICBIb3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgZXJyb3JzIHdpbGwgb25seSBvY2N1ciB3aGVuIHsyfSBpcyB2YWxpZGF0ZWQgaW4gdGhlIGNvbnRleHQgb2YgezN9LgotX1VJX1JFRl9GSUxFX0VSUk9SX1BVU0hfSEVMUCAgICAgICAgPSBQdXNoIHRoZSBoZWxwIGJ1dHRvbiBiZWxvdyB0byByZWFkIG1vcmUuCi1fVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSAgICAgICAgICA9IFJlZmVyZW5jZWQgZmlsZSBjb250YWlucyBlcnJvcnMgKHswfSkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmlnaHQgY2xpY2sgb24gdGhlIG1lc3NhZ2UgYW5kIHNlbGVjdCAiU2hvdyBEZXRhaWxzLi4uIgotX1VJX1JFRl9GSUxFX1NIT1dfREVUQUlMUyAgICAgICAgICAgPSBTaG93IERldGFpbHMuLi4KLQotCi0hCi0hIFhTREVkaXRvciBNZW51IGJhciBjb250cmlidXRvcgotIQotX1VJX01FTlVfR0VORVJBVEVfSkFWQSAgICAgICAgICAgICAgPSBHZW5lcmF0ZSAmSmF2YSBCZWFucy4uLgotX1VJX01FTlVfR0VORVJBVEVfRFREICAgICAgICAgICAgICAgPSBHZW5lcmF0ZSAmRFRELi4uCi1fVUlfTUVOVV9HRU5FUkFURV9TQU1QTEVfWE1MICAgICAgICA9IEdlbmVyYXRlIFhNJkwuLi4KLV9VSV9NRU5VX1hTRF9FRElUT1IgICAgICAgICAgICAgICAgID0gJlhTRAotX1VJX01FTlVfVkFMSURBVEVfWE1MICAgICAgICAgICAgICAgPSAmVmFsaWRhdGUgWE1MIFNjaGVtYQotX1VJX01FTlVfVkFMSURBVEVfWE1MX1RPT0xUSVAgICAgICAgPSBWYWxpZGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIFNjaGVtYQotX1VJX01FTlVfR0VORVJBVEVfSkFWQV9UT09MVElQICAgICAgPSBHZW5lcmF0ZSBKYXZhIGJlYW5zIGZvciB0aGUgWE1MIFNjaGVtYQotX1VJX01FTlVfR0VORVJBVEVfRFREX1RPT0xUSVAgICAgICAgPSBHZW5lcmF0ZSBhIERURCBmcm9tIHRoZSBYTUwgU2NoZW1hCi1fVUlfTUVOVV9HRU5FUkFURV9TQU1QTEVfWE1MX1RPT0xUSVAgPSBHZW5lcmF0ZSBhbiBYTUwgZnJvbSB0aGUgWE1MIFNjaGVtYQotX1VJX01FTlVfUkVMT0FEX0RFUEVOREVOQ0lFU19UT09MVElQID0gUmVsb2FkIERlcGVuZGVuY2llcwotX1VJX01FTlVfUkVMT0FEX0RFUEVOREVOQ0lFUyA9ICZSZWxvYWQgRGVwZW5kZW5jaWVzCi0KLSEKLSEgUHJlZmVyZW5jZSBQYWdlCi0hCi1fVUlfVEVYVF9JTkRFTlRfTEFCRUwgICAgICAgICAgICAgICAgID0gSW5kZW50YXRpb24KLV9VSV9URVhUX0lOREVOVF9TUEFDRVNfTEFCRUwgICAgICAgICAgPSAmTnVtYmVyIG9mIHNwYWNlczogCi1fVUlfVEVYVF9YU0RfTkFNRVNQQUNFX1BSRUZJWCAgICAgICAgID0gWE1MIHNjaGVtYSBsYW5ndWFnZQotX1VJX1RFWFRfWFNEX0RFRkFVTFRfUFJFRklYICAgICAgICAgICA9IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyAmcHJlZml4OgotX1VJX1FVQUxJRllfWFNEICAgICAgICAgICAgICAgICAgICAgICA9ICZRdWFsaWZ5IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cwotX1VJX1NFUEFSQVRFX0RFU0lHTl9BTkRfU09VUkNFX1ZJRVcgICA9IFNlcGFyYXRlIFNvdXJjZSwgRGVzaWduIGFuZCBHcmFwaCB2aWV3Ci1fVUlfQ09NQklORURfREVTSUdOX0FORF9TT1VSQ0VfVklFVyAgID0gQ29tYmluZWQgU291cmNlIG9yIEdyYXBoIHZpZXcgd2l0aCBEZXNpZ24gdmlldyAKLV9VSV9MQUJFTF9FRElUT1JfTEFZT1VUICAgICAgICAgICAgICAgPSBFZGl0b3IgTGF5b3V0Ci1fVUlfUFJFRl9ERVNJR05fVklFV19MQVlPVVQgICAgICAgICAgID0gRGVzaWduIFZpZXcgTG9jYXRpb24KLV9VSV9QUkVGX0RFU0lHTl9CT1RUT00gICAgICAgICAgICAgICAgPSBCZWxvdwotX1VJX1BSRUZfREVTSUdOX1JJR0hUICAgICAgICAgICAgICAgICA9IFJpZ2h0Ci1fVUlfVEVYVF9YU0RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFID0gRGVmYXVsdCBUYXJnZXQgTmFtZXNwYWNlOgotCi0hCi0hIENvbnRlbnQgT3V0bGluZSBWaWV3IGFjdGlvbgotISBOT1RFIFRPIFRSQU5TTEFUT1I6IERvIG5vdCB0cmFuc2xhdGUgdGhlIHdvcmQocykgZm9sbG93aW5nICJBZGQiIG9uIGVhY2ggbGluZSBpbgotISAgIHRoaXMgc2VjdGlvbiBpLmUuIEFubm90YXRpb24sIERvY3VtZW50YXRpb24sIEFwcEluZm8gIFRoZXNlIHdvcmRzIGFyZSBYTUwgU2NoZW1hIGtleXdvcmRzLgotX1VJX0FDVElPTl9ERUxFVEUgICAgICAgICAgICAgICAgICA9IEQmZWxldGUKLV9VSV9BQ1RJT05fQUREX0FOTk9UQVRJT04gICAgICAgICAgPSBBZGQgJkFubm90YXRpb24KLV9VSV9BQ1RJT05fQUREX0RPQyAgICAgICAgICAgICAgICAgPSBBZGQgJkRvY3VtZW50YXRpb24KLV9VSV9BQ1RJT05fQUREX0FQUF9JTkZPICAgICAgICAgICAgPSBBZGQgQSZwcEluZm8KLV9VSV9BQ1RJT05fQUREX0dMT0JBTF9FTEVNRU5UICAgICAgPSBBZGQgR2xvYiZhbCBFbGVtZW50Ci1fVUlfQUNUSU9OX0FERF9LRVkgICAgICAgICAgICAgICAgID0gQWRkICZLZXkKLV9VSV9BQ1RJT05fQUREX0tFWV9SRUYgICAgICAgICAgICAgPSBBZGQgS2V5IFJlJmYKLV9VSV9BQ1RJT05fQUREX1VOSVFVRSAgICAgICAgICAgICAgPSBBZGQgVW5pJnF1ZQotX1VJX0FDVElPTl9BRERfR1JPVVAgICAgICAgICAgICAgICA9IEFkZCBHJnJvdXAKLV9VSV9BRERfR1JPVVBfUkVGICAgICAgICAgICAgICAgICAgPSBBZGQgR3Imb3VwIFJlZgotX1VJX0FDVElPTl9BRERfQ09OVEVOVF9NT0RFTCAgICAgICA9IEFkZCBDb250ZW50ICZNb2RlbAotX1VJX0FDVElPTl9BRERfRUxFTUVOVCAgICAgICAgICAgICA9IEFkZCAmRWxlbWVudAotX1VJX0FDVElPTl9BRERfRUxFTUVOVF9SRUYgICAgICAgICA9IEFkZCBFJmxlbWVudCBSZWYKLV9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFICAgICAgICAgPSBBZGQgJlNpbXBsZSBUeXBlCi1fVUlfQUNUSU9OX0FERF9QQVRURVJOICAgICAgICAgICAgID0gQWRkICZQYXR0ZXJuCi1fVUlfQUNUSU9OX0FERF9FTlVNICAgICAgICAgICAgICAgID0gQWRkIEVuJnVtZXJhdGlvbgotX1VJX0FDVElPTl9BRERfRU5VTVMgICAgICAgICAgICAgICA9IEFkZCBFbnUmbWVyYXRpb25zLi4uCi1fVUlfQUNUSU9OX0FERF9DT01QTEVYX1RZUEUgICAgICAgID0gQWRkIENvbXBsZXggJlR5cGUKLV9VSV9BQ1RJT05fQUREX0NPTVBMRVhfQ09OVEVOVCAgICAgPSBBZGQgQ29tcGxlJnggQ29udGVudAotX1VJX0FDVElPTl9BRERfU0lNUExFX0NPTlRFTlQgICAgICA9IEFkZCBTaW1wbGUgJkNvbnRlbnQKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSAgICAgICAgICAgPSBBZGQgQXR0cmkmYnV0ZQotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQICAgICA9IEFkZCBBdHRyJmlidXRlIEdyb3VwCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGID0gQWRkIEEmdHRyaWJ1dGUgR3JvdXAgUmVmCi1fVUlfQUNUSU9OX0FERF9JTkNMVURFICAgICAgICAgICAgID0gQWRkIEluJmNsdWRlCi1fVUlfQUNUSU9OX0FERF9JTVBPUlQgICAgICAgICAgICAgID0gQWRkICZJbXBvcnQKLV9VSV9BQ1RJT05fQUREX1JFREVGSU5FICAgICAgICAgICAgPSBBZGQgUmUmZGVmaW5lCi1fVUlfQUNUSU9OX0FERF9OT1RBVElPTiAgICAgICAgICAgID0gQWRkICZOb3RhdGlvbgotX1VJX0FDVElPTl9BRERfQU5ZX0VMRU1FTlQgICAgICAgICA9IEFkZCBBbiZ5Ci1fVUlfQUNUSU9OX0FERF9BTllfQVRUUklCVVRFICAgICAgID0gQWRkICZBbnkgQXR0cmlidXRlCi1fVUlfQUNUSU9OX0FERF9HTE9CQUxfQVRUUklCVVRFICAgID0gQWRkICZHbG9iYWwgQXR0cmlidXRlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGRVJFTkNFID0gQWRkIEF0dHJpYiZ1dGUgUmVmCi1fVUlfQUNUSU9OX0FERF9SRVNUUklDVElPTiAgICAgICAgID0gQWRkIFJlJnN0cmljdGlvbgotX1VJX0FDVElPTl9BRERfVU5JT04gICAgICAgICAgICAgICA9IEFkZCBVJm5pb24KLV9VSV9BQ1RJT05fQUREX0xJU1QgICAgICAgICAgICAgICAgPSBBZGQgJkxpc3QKLV9VSV9BQ1RJT05fREVMRVRFX0dST1VQX1NDT1BFICAgICAgPSBEJmVsZXRlCi1fVUlfQUNUSU9OX0FERF9DSE9JQ0UgICAgICAgICAgICAgID0gQWRkICZDaG9pY2UKLV9VSV9BQ1RJT05fQUREX1NFUVVFTkNFICAgICAgICAgICAgPSBBZGQgU2UmcXVlbmNlCi1fVUlfQUNUSU9OX0FERF9BTEwgICAgICAgICAgICAgICAgID0gQWRkICZBbGwKLV9VSV9BQ1RJT05fQUREX0VYVEVOU0lPTiAgICAgICAgICAgPSBBZGQgRSZ4dGVuc2lvbgotX1VJX0FDVElPTl9BRERfU0VMRUNUT1IgICAgICAgICAgICA9IEFkZCAmU2VsZWN0b3IKLV9VSV9BQ1RJT05fQUREX0ZJRUxEICAgICAgICAgICAgICAgPSBBZGQgJkZpZWxkCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogVHJhbnNsYXRlIEFkZCBhbmQgTm9kZQotX1VJX0FDVElPTl9BRERfU0NIRU1BX05PREUgICAgICAgICA9IEFkZCAmU2NoZW1hIE5vZGUKLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBUUkFOU0xBVEUgQWRkIGFuZCBMb2NhbAotX1VJX0FDVElPTl9BRERfTE9DQUxfU0lNUExFX1RZUEUgICA9IEFkZCBMb2NhbCAmU2ltcGxlIFR5cGUKLV9VSV9BQ1RJT05fQUREX0xPQ0FMX0NPTVBMRVhfVFlQRSAgPSBBZGQgTG9jYWwgJkNvbXBsZXggVHlwZQotX1VJX0FDVElPTl9CQUNLX1RPX1NDSEVNQV9WSUVXICAgICA9IEJhY2sgVG8gU2NoZW1hCi1fVUlfSE9WRVJfQkFDS19UT19TQ0hFTUFfVklFVyAgICAgPSBCYWNrIHRvIHNjaGVtYQotCi1fVUlfQUNUSU9OX01BS0VfQU5PTllNT1VTX1RZUEVfR0xPQkFMID0gTWFrZSBBbm9ueW1vdXMgVHlwZSBHbG9iYWwKLV9VSV9BQ1RJT05fT1BFTl9TQ0hFTUEgICAgICAgICAgICAgICAgPSBPcGVuIFNjaGVtYQotCi1fVUlfQUNUSU9OX0lOU0VSVF9CRUZPUkUgICAgICAgICAgID0gSW5zZXJ0IEJlZm9yZQotX1VJX0FDVElPTl9JTlNFUlRfQUZURVIgICAgICAgICAgICA9IEluc2VydCBBZnRlcgotCi1fVUlfT1VUTElORV9TT1JUICAgICAgICAgICAgICAgICAgID0gU29ydCBhbHBoYWJldGljYWxseQotX1VJX09VVExJTkVfRE9fTk9UX1NPUlQgICAgICAgICAgICA9IERvIG5vdCBzb3J0IGFscGhhYmV0aWNhbGx5Ci0KLV9VSV9PVVRMSU5FX1NIT1dfQ09NUExFWF9UWVBFICAgICAgPSBTaG93IENvbXBsZXggVHlwZXMgT25seQotX1VJX09VVExJTkVfU0hPV19TSU1QTEVfVFlQRSAgICAgICA9IFNob3cgU2ltcGxlIFR5cGVzIE9ubHkKLV9VSV9PVVRMSU5FX1NIT1dfQVRUUklCVVRFX0dST1VQICAgPSBTaG93IEF0dHJpYnV0ZSBHcm91cHMgT25seQotX1VJX09VVExJTkVfU0hPV19HUk9VUCAgICAgICAgICAgICA9IFNob3cgR3JvdXBzIE9ubHkKLV9VSV9PVVRMSU5FX1NIT1dfR0xPQkFMX0VMRU1FTlQgICAgPSBTaG93IEdsb2JhbCBFbGVtZW50cyBPbmx5Ci1fVUlfT1VUTElORV9TSE9XX1JFRkVSRU5DRVMgICAgICAgID0gU2hvdyBSZWZlcmVuY2UgQ29udGVudAotX1VJX09VVExJTkVfU0hPV19JTkhFUklURUQgICAgICAgICA9IFNob3cgSW5oZXJpdGVkIENvbnRlbnQKLQotX1VJX0FDVElPTl9TRVRfTVVMVElQTElDSVRZCQkgICA9IFNldCBNdWx0aXBsaWNpdHkKLQotIQotISBOZXcgWE1MIFNjaGVtYSBXaXphcmQKLSEKLV9VSV9XSVpBUkRfQ1JFQVRFX1hTRF9NT0RFTF9USVRMRSAgICA9IENyZWF0ZSBYTUwgU2NoZW1hCi0KLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIGZvbGxvd2luZyBsaW5lCi1fVUlfQ1JFQVRFWFNEICAgICAgICAgICAgICAgICAgICAgICAgPSBjcmVhdGVYU0QKLV9VSV9ORVdfWE1MX1NDSEVNQV9USVRMRSAgICAgICAgICAgICA9IE5ldyBYTUwgU2NoZW1hCi1fVUlfQ1JFQVRFX0FfTkVXX1hNTF9TQ0hFTUFfREVTQyAgICAgPSBDcmVhdGUgYSBuZXcgWE1MIHNjaGVtYS4KLQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IERvIG5vdCB0cmFuc2xhdGUgZm9sbG93aW5nIGxpbmUKLV9VSV9ORVdfWE1MX1NDSEVNQV9GSUxFTkFNRSAgICAgICAgICA9IE5ld1hNTFNjaGVtYS54c2QKLQotIQotISBYU0QgRnJvbSBSREIgU2NoZW1hIFdpemFyZAotIQotX1VJX1dJWkFSRF9DUkVBVEVfWFNEX0ZST01fUkRCX1RJVExFID0gQ3JlYXRlIFhTRCBmcm9tIFJEQiBUYWJsZQotCi0KLSEKLSEgUmVndWxhciBFeHByZXNzaW9uIFdpemFyZAotIQotX1VJX1JFR0VYX1dJWkFSRF9DUkVBVEVfQlVUVE9OID0gQ3JlYXRlIFJlZ3VsYXIgRXhwcmVzc2lvbi4uLgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0JVVFRPTiA9IExhdW5jaCB0aGUgUmVndWxhciBFeHByZXNzaW9uIFdpemFyZAotX1VJX1JFR0VYX1dJWkFSRF9USVRMRSA9IFJlZ3VsYXIgRXhwcmVzc2lvbiBXaXphcmQKLV9VSV9SRUdFWF9XSVpBUkRfQ09NUE9TSVRJT05fUEFHRV9USVRMRSA9IENvbXBvc2UgUmVndWxhciBFeHByZXNzaW9uCi1fVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfREVTQ1JJUFRJT04gPSBUbyBhZGQgYSB0b2tlbiwgc3BlY2lmeSBpdHMgY29udGVudHMgYW5kIG9jY3VycmVuY2UsIHRoZW4gY2xpY2sgQWRkLgotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFR0VYX0VSUk9SX1BSRUZJWCA9IFRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBub3QgdmFsaWQuICBSZWFzb246ICAKLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9UT0tFTl9FUlJPUl9QUkVGSVggPSBUaGUgY3VycmVudCB0b2tlbiBpcyBub3QgdmFsaWQuICBSZWFzb246ICAKLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9SRUdFWF9FUlJPUiA9IFRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBub3QgdmFsaWQuCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfVE9LRU5fRVJST1IgPSBUaGUgY3VycmVudCB0b2tlbiBpcyBub3QgdmFsaWQuCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfTUlOX0VSUk9SX1NVRkZJWCA9IEludmFsaWQgbWluaW11bSByYW5nZSB2YWx1ZS4gIFRoZSB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBsZXNzIHRoYW4gdGhlIG1heGltdW0gdmFsdWUuCi1fVUlfUkVHRVhfV0laQVJEX01JU1NJTkdfTUlOX0VSUk9SX1NVRkZJWCA9IEludmFsaWQgbWluaW11bSByYW5nZSB2YWx1ZS4gIEEgbWluaW11bSByYW5nZSBtdXN0IGJlIHNwZWNpZmllZCBpZiBhIG1heGltdW0gcmFuZ2UgaXMgc3BlY2lmaWVkLgotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX01BWF9FUlJPUl9TVUZGSVggPSBJbnZhbGlkIG1heGltdW0gcmFuZ2UgdmFsdWUuICBUaGUgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlLgotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFUEVBVF9FUlJPUl9TVUZGSVggPSBJbnZhbGlkIHJlcGVhdCB2YWx1ZS4gIFRoZSB2YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9TRUxFQ1RJT05fRVJST1IgPSBOb3RoaW5nIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4gIEVpdGhlciBtYWtlIGEgc2VsZWN0aW9uIG9yIGNob29zZSBhIGRpZmZlcmVudCB0b2tlbi4gCi1fVUlfUkVHRVhfV0laQVJEX1RPS0VOX0xBQkVMID0gVG9rZW4gY29udGVudHM6Ci1fVUlfUkVHRVhfV0laQVJEX0FVVE9fRVNDQVBFX0NIRUNLQk9YX0xBQkVMID0gQXV0byBlc2NhcGUKLV9VSV9SRUdFWF9XSVpBUkRfT0NDVVJFTkNFX0xBQkVMID0gT2NjdXJyZW5jZQotISBJbnN0cnVjdGlvbnMgZm9yIHRyYW5zbGF0b3JzOiBUaGUgZm9sbG93aW5nIGxhYmVsIGlzIHVzZWQgaW4gYSBwaHJhc2UgdG8gaWRlbnRpZnkgYSByYW5nZSBvZiB2YWx1ZXMuCi0hIEZvciBleGFtcGxlOiAgNSB0byAxMC4KLSEgVGhlIHZhbHVlcyBhcmUgdGV4dCBmaWVsZHMgdGhhdCBhcmUgaW5pdGlhbGx5IGJsYW5rIHNvIHRoZSB1c2VyIGhhcyB0byBlbnRlciBpbiB2YWx1ZXMKLSEgRm9yIGV4YW1wbGU6ICAgX19fX19fXyB0byBfX19fX19fXwotX1VJX1JFR0VYX1dJWkFSRF9UT19MQUJFTCA9IHRvCi1fVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwgPSBBZGQgCi1fVUlfUkVHRVhfV0laQVJEX0NVUlJFTlRfUkVHRVhfTEFCRUwgPSBDdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbjoKLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9URVJNUyA9IENvbnRlbnQgb2YgbmV3IHRva2VuCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQVVUT19FU0NBUEVfQ0hFQ0tCT1ggPSBJbnNlcnQgZXNjYXBlIGNoYXJhY3RlcnMgdG8gbWF0Y2ggbWV0YWNoYXJhY3RlciBsaXRlcmFscyAoZS5nLiBjb252ZXJ0cyBcIipcIiB0byBcIlxcKlwiKQotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0FERF9CVVRUT04gPSBBZGQgdGhpcyB0b2tlbiB0byB0aGUgcmVndWxhciBleHByZXNzaW9uCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQ1VSUkVOVF9SRUdFWCA9IFRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX1JFUEVBVCA9IFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgdG9rZW4gbXVzdCBvY2N1ci4KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9NSU4gPSBUaGUgbWluaW11bSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgdG9rZW4gY2FuIG9jY3VyLgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX01BWCA9IFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSB0b2tlbiBjYW4gb2NjdXIuCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQ0FSRVRfTEFCRUwgPSBUaGUgbG9jYXRpb24gd2hlcmUgdGhlIG5ldyB0b2tlbiB3aWxsIGJlIGluc2VydGVkLgotX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfVElUTEUgPSBUZXN0IFJlZ3VsYXIgRXhwcmVzc2lvbgotX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfREVTQ1JJUFRJT04gPSBUbyB0ZXN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGVudGVyIHNhbXBsZSB0ZXh0IHRoYXQgeW91IHdpc2ggdG8gbWF0Y2guICBUaGUgc3VjY2VzcyBvZiB0aGUgbWF0Y2ggd2lsbCBiZSBpbmRpY2F0ZWQgYWJvdmUuCi1fVUlfUkVHRVhfV0laQVJEX1JFR0VYX0xBQkVMID0gUmVndWxhciBleHByZXNzaW9uOiAKLV9VSV9SRUdFWF9XSVpBUkRfU0FNUExFX1RFWFQgPSAgU2FtcGxlIHRleHQ6IAotX1VJX1JFR0VYX1dJWkFSRF9NQVRDSEVTID0gVGhlIHRleHQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLgotX1VJX1JFR0VYX1dJWkFSRF9ET0VTX05PVF9NQVRDSCA9IFRoZSB0ZXh0IGRvZXMgbm90IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fQU5ZX0NIQVIgPSBBbnkgY2hhcmFjdGVyCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fQUxQSEFOVU1FUklDX0NIQVIgPSBBbHBoYW51bWVyaWMgY2hhcmFjdGVyCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fV0hJVEVTUEFDRSA9IFdoaXRlc3BhY2UKLV9VSV9SRUdFWF9XSVpBUkRfVEVSTV9ESUdJVCA9IERpZ2l0Ci1fVUlfUkVHRVhfV0laQVJEX1RFUk1fVVBQRVIgPSBVcHBlciBjYXNlCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fTE9XRVIgPSBMb3dlciBjYXNlCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fU0VMRUNUSU9OID0gQ3VycmVudCBzZWxlY3Rpb24KLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9TSU5HTEUgPSBKdXN0IG9uY2UKLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9TVEFSID0gWmVybyBvciBtb3JlCi1fVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUExVUyA9IE9uZSBvciBtb3JlCi1fVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfT1BUSU9OQUwgPSBPcHRpb25hbAotX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1JFUEVBVCA9IFJlcGVhdAotX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1JBTkdFID0gUmFuZ2UKLQotIQotISBTZWxlY3QgSW5jbHVkZSBGaWxlIFdpemFyZAotX1VJX0xBQkVMX0lOQ0xVREVfVVJMX0ZJTEUgICAgPSBTZWxlY3Qgc2NoZW1hIGZyb206Ci1fVUlfUkFESU9fVVJMICAgICAgICAgICAgICAgICA9IEhUVFAKLV9VSV9SQURJT19GSUxFICAgICAgICAgICAgICAgID0gV29ya2JlbmNoIHByb2plY3RzCi1fVUlfV0laQVJEX0lOQ0xVREVfRklMRV9USVRMRSA9IEluY2x1ZGUgQW5vdGhlciBTY2hlbWEKLV9VSV9XSVpBUkRfSU5DTFVERV9GSUxFX0RFU0MgID0gU2VsZWN0IGFub3RoZXIgc2NoZW1hIGZyb20gd29ya2JlbmNoIHByb2plY3RzIG9yIGZyb20gSFRUUC4KLV9VSV9MQUJFTF9VUkwgICAgICAgICAgICAgICAgID0gVVJMOgotX1VJX1VSTF9TVEFSVF9XSVRIICAgICAgICAgICAgPSBUaGUgVVJMIG11c3Qgc3RhcnQgd2l0aCBodHRwOi8vCi1fVUlfU1BFQ0lGWV9VUkwgICAgICAgICAgICAgICA9IFBsZWFzZSBzcGVjaWZ5IGEgVVJMCi0KLSEKLSEgRW51bWVyYXRpb25zIERpYWxvZwotX1VJX0VOVU1FUkFUSU9OU19ESUFMT0dfVElUTEUgPSBBZGQgRW51bWVyYXRpb25zCi1fVUlfTEFCRUxfREVMSU1JVEVSX0NIQVIgICAgICA9ICZEZWxpbWl0ZXIgY2hhcmFjdGVyczoKLV9VSV9MQUJFTF9QUkVTRVJWRV9XSElURVNQQUNFID0gJlByZXNlcnZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLQotX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT04gPSBEZWxldGUgRW51bWVyYXRpb24KLQotIQotISBWYWxpZGF0ZSBTY2hlbWEgCi0hCi1fVUlfRElBTE9HX1hNTF9TQ0hFTUFfSU5WQUxJRF9USVRMRSAgICAgICA9IFZhbGlkYXRpb24gRmFpbGVkCi1fVUlfRElBTE9HX1hNTF9TQ0hFTUFfVkFMSURfVElUTEUgICAgICAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1fVUlfRElBTE9HX1hNTF9TQ0hFTUFfVkFMSURfVEVYVCAgICAgICAgICA9IFRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgdmFsaWQuCi1fVUlfRElBTE9HX1hNTF9TQ0hFTUFfVkFMSURfV0lUSF9XQVJOSU5HUyA9IFRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgdmFsaWQgaG93ZXZlciB3YXJuaW5ncyBoYXZlIGJlZW4gaXNzdWVkLiBTZWUgdGhlIFByb2JsZW1zIHZpZXcgZm9yIHRoZSB3YXJuaW5nIG1lc3NhZ2VzLgotX1VJX0RJQUxPR19YTUxfU0NIRU1BX0lOVkFMSURfVEVYVCAgICAgICAgPSBUaGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdCB2YWxpZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciB0aGUgZXJyb3IgbWVzc2FnZXMuCi0KLSEKLSEgQ29tYm8tYm94IGNob2ljZXMgCi0hCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSBmb2xsb3dpbmcgMTAgbGluZXMKLV9VSV9DT01CT19RVUFMSUZJRUQgICAgICAgICAgICAgPSBxdWFsaWZpZWQKLV9VSV9DT01CT19VTlFVQUxJRklFRCAgICAgICAgICAgPSB1bnF1YWxpZmllZAotX1VJX0NPTUJPX0VYVEVOU0lPTiAgICAgICAgICAgICA9IGV4dGVuc2lvbgotX1VJX0NPTUJPX1JFU1RSSUNUSU9OICAgICAgICAgICA9IHJlc3RyaWN0aW9uCi1fVUlfQ09NQk9fQUxMICAgICAgICAgICAgICAgICAgID0gYWxsCi1fVUlfQ09NQk9fVFJVRSAgICAgICAgICAgICAgICAgID0gdHJ1ZQotX1VJX0NPTUJPX0ZBTFNFICAgICAgICAgICAgICAgICA9IGZhbHNlCi1fVUlfQ09NQk9fTEFYICAgICAgICAgICAgICAgICAgID0gbGF4Ci1fVUlfQ09NQk9fU0tJUCAgICAgICAgICAgICAgICAgID0gc2tpcAotX1VJX0NPTUJPX1NUUklDVCAgICAgICAgICAgICAgICA9IHN0cmljdAotCi0hIEdlbmVyYXRlIERURCAtIHBhc3MgYXMgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGZvciB3aXphcmQgcGFnZQotX1VJX0dFTkVSQVRFX0RURF9USVRMRSAgICAgICAgICA9IEdlbmVyYXRlIERURAotX1VJX0dFTkVSQVRFX0RURF9ERVNDUklQVElPTiAgICA9IEdlbmVyYXRlIGEgRFREIGZyb20gdGhlIHNlbGVjdGVkIFhNTCBzY2hlbWEgZmlsZS4KLQotISBHZW5lcmF0ZSBEREwgLSBwYXNzIGFzIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBmb3Igd2l6YXJkIHBhZ2UKLV9VSV9HRU5FUkFURV9ERExfVElUTEUgICAgICAgICAgPSBHZW5lcmF0ZSBEREwKLV9VSV9HRU5FUkFURV9ERExfREVTQ1JJUFRJT04gICAgPSBHZW5lcmF0ZSBEREwgZnJvbSB0aGUgc2VsZWN0ZWQgWE1MIHNjaGVtYSBmaWxlLgotCi1fVUlfWE1MX1NDSEVNQV9WQUxJREFUT1IgICAgICAgICAgICA9IFhNTCBTY2hlbWEgVmFsaWRhdG9yCi0KLSEgR2VuZXJhdGlvbiBmcm9tIHRoZSBTY2hlbWEgbW9kZWwgLSBwcmUtY29uZGl0aW9uIGNoZWNrCi1fVUlfRElBTE9HX1RJVExFX0dSQU1NQVJfRVJST1IgICAgICA9IEludmFsaWQgR3JhbW1hcgotX1VJX0RJQUxPR19JTkZPX1NDSEVNQV9JTlZBTElEICAgICAgPSBUaGUgc2NoZW1hIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBYTUwgU2NoZW1hIGVkaXRvciBhbmQgdmFsaWRhdGUgaXQgZm9yIGRldGFpbHMuCi1fVUlfRElBTE9HX1RJVExFX05PX0dMT0JBTF9FTEVNRU5UUyA9IE5vIEdsb2JhbCBFbGVtZW50cwotX1VJX0RJQUxPR19JTkZPX05PX0dMT0JBTF9FTEVNRU5UUyAgPSBUaGUgc2VsZWN0ZWQgc2NoZW1hIGhhcyBubyBnbG9iYWwgZWxlbWVudHMuIEdsb2JhbCBlbGVtZW50cyBhcmUgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYW55dGhpbmcgZnJvbSBhbiBYTUwgc2NoZW1hLgotCi0hIFNlY3Rpb24gdGl0bGUgZm9yIG90aGVyIGF0dHJpYnV0ZXMKLV9VSV9TRUNUSU9OX0FEVkFOQ0VEX0FUVFJJQlVURVMgICA9IEFkdmFuY2VkCi0KLSEgRm9yIHVuZG8gYWN0aW9uIG1lbnVzCi0hIE5vdGUgdG8gVHJhbnNsYXRvcnM6IEZvciB0aGUgZm9sbG93aW5nICJDaGFuZ2UiIHBocmFzZXMsCi0hIG1heE9jY3VycywgbWluT2NjdXJzLCBsYW5nLCB4cGF0aCBhcmUga2V5d29yZHMgc28gcGxlYXNlCi0hIGRvIG5vIHRyYW5zbGF0ZSB0aGVtLiAgVGhlc2UgYXJlIGZvciB0aGUgdW5kbyBhY3Rpb24gbWVudXMuCi0hIEZvciBleGFtcGxlLCBpZiB0aGUgdXNlciBtYWtlcyBhIGNoYW5nZSBpbiB0aGUgbmFtZSBvZiBhbgotISBlbGVtZW50LCB0aGVuIHRoZSB1bmRvIGFjdGlvbiB3b3VsZCBiZSBVbmRvIEVsZW1lbnQgTmFtZSBDaGFuZ2UKLV9VSV9OQU1FU1BBQ0VfQ0hBTkdFICAgICAgICAgICA9IE5hbWVzcGFjZSBDaGFuZ2UKLV9VSV9QUk9DRVNTQ09OVEVOVFNfQ0hBTkdFICAgICA9IFByb2Nlc3MgQ29udGVudHMgQ2hhbmdlCi1fVUlfTUFYT0NDVVJTX0NIQU5HRSAgICAgICAgICAgPSBtYXhPY2N1cnMgQ2hhbmdlCi1fVUlfTUlOT0NDVVJTX0NIQU5HRSAgICAgICAgICAgPSBtaW5PY2N1cnMgQ2hhbmdlCi1fVUlfU09VUkNFX0FUVFJJQlVURV9DSEFOR0UgICAgPSBTb3VyY2UgQ2hhbmdlCi1fVUlfQ09NTUVOVF9DSEFOR0UgICAgICAgICAgICAgPSBDb21tZW50IENoYW5nZQotX1VJX1BSRUZJWF9DSEFOR0UgICAgICAgICAgICAgID0gUHJlZml4IENoYW5nZQotX1VJX0FUVFJJQlVURUdST1VQX1JFRl9DSEFOR0UgID0gQXR0cmlidXRlIEdyb3VwIFJlZmVyZW5jZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVHUk9VUF9OQU1FX0NIQU5HRSA9IEF0dHJpYnV0ZSBHcm91cCBOYW1lIENoYW5nZQotX1VJX0FUVFJJQlVURV9GSVhFRF9DSEFOR0UgICAgID0gQXR0cmlidXRlIEZpeGVkIENoYW5nZQotX1VJX0FUVFJJQlVURV9ERUZBVUxUX0NIQU5HRSAgID0gQXR0cmlidXRlIERlZmF1bHQgQ2hhbmdlCi1fVUlfQVRUUklCVVRFX05BTUVfQ0hBTkdFICAgICAgPSBBdHRyaWJ1dGUgTmFtZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVfVkFMVUVfQ0hBTkdFICAgICA9IEF0dHJpYnV0ZSBWYWx1ZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVfVVNFX0NIQU5HRSAgICAgICA9IEF0dHJpYnV0ZSBVc2UgQ2hhbmdlCi1fVUlfQVRUUklCVVRFX0ZPUk1fQ0hBTkdFICAgICAgPSBBdHRyaWJ1dGUgRm9ybSBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9OQU1FX0NIQU5HRSAgICA9IENvbXBsZXggVHlwZSBOYW1lIENoYW5nZQotX1VJX0NPTVBMRVhUWVBFX0FCU1RSQUNUX0NIQU5HRSA9IENvbXBsZXggVHlwZSBBYnN0cmFjdCBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9NSVhFRF9DSEFOR0UgICA9IENvbXBsZXggVHlwZSBNaXhlZCBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9CTE9DS19DSEFOR0UgICA9IENvbXBsZXggVHlwZSBCbG9jayBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9GSU5BTF9DSEFOR0UgICA9IENvbXBsZXggVHlwZSBGaW5hbCBDaGFuZ2UKLV9VSV9ET0NVTUVOVEFUSU9OX1NPVVJDRV9DSEFOR0UgPSBEb2N1bWVudGF0aW9uIFNvdXJjZSBDaGFuZ2UKLV9VSV9ET0NVTUVOVEFUSU9OX0xBTkdfQ0hBTkdFICAgPSBEb2N1bWVudGF0aW9uIGxhbmcgQ2hhbmdlCi1fVUlfRE9DVU1FTlRBVElPTl9DT01NRU5UX0NIQU5HRSA9IERvY3VtZW50YXRpb24gQ29tbWVudCBDaGFuZ2UKLV9VSV9FTEVNRU5UX05BTUVfQ0hBTkdFICAgICAgICAgID0gRWxlbWVudCBOYW1lIENoYW5nZQotX1VJX0VMRU1FTlRfVkFMVUVfQ0hBTkdFICAgICAgICAgPSBFbGVtZW50IFZhbHVlIENoYW5nZQotX1VJX0VMRU1FTlRfVFlQRV9DSEFOR0UgICAgICAgICAgPSBFbGVtZW50IFR5cGUgQ2hhbmdlCi1fVUlfRU5VTV9WQUxVRV9DSEFOR0UgICAgICAgICAgICA9IEVudW0gVmFsdWUgQ2hhbmdlCi1fVUlfRklFTERfWFBBVEhfQ0hBTkdFICAgICAgICAgICA9IEZpZWxkIHhwYXRoIENoYW5nZQotX1VJX0dST1VQX1JFRl9DSEFOR0UgICAgICAgICAgICAgPSBHcm91cCBSZWZlcmVuY2UgQ2hhbmdlCi1fVUlfR1JPVVBfU0NPUEVfQ0hBTkdFICAgICAgICAgICA9IENvbnRlbnQgTW9kZWwgQ2hhbmdlCi1fVUlfR1JPVVBfTkFNRV9DSEFOR0UgICAgICAgICAgICA9IEdyb3VwIE5hbWUgQ2hhbmdlCi1fVUlfSU1QT1JUX0NIQU5HRSAgICAgICAgICAgICAgICA9IEltcG9ydCBDaGFuZ2UKLV9VSV9LRVlfTkFNRV9DSEFOR0UgICAgICAgICAgICAgID0gS2V5IE5hbWUgQ2hhbmdlCi1fVUlfS0VZUkVGX05BTUVfQ0hBTkdFICAgICAgICAgICA9IEtleSBSZWZlcmVuY2UgTmFtZSBDaGFuZ2UKLSEgTm90ZSB0byB0cmFuc2xhdG9ycwotISBGb3IgdGhlIGZvbGxvd2luZyBpdGVtLCBSZWZlciBpcyB0aGUga2V5cmVmIGF0dHJpYnV0ZSB0byByZWZlciB0byBzb21lIG90aGVyIGtleQotX1VJX0tFWVJFRl9SRUZFUl9DSEFOR0UgICAgICAgICAgPSBLZXkgUmVmZXJlbmNlIFJlZmVyIENoYW5nZQotX1VJX05PVEFUSU9OX05BTUVfQ0hBTkdFICAgICAgICAgPSBOb3RhdGlvbiBOYW1lIENoYW5nZQotX1VJX05PVEFUSU9OX1BVQkxJQ19DSEFOR0UgICAgICAgPSBOb3RhdGlvbiBQdWJsaWMgQ2hhbmdlCi1fVUlfTk9UQVRJT05fU1lTVEVNX0NIQU5HRSAgICAgICA9IE5vdGF0aW9uIFN5c3RlbSBDaGFuZ2UKLV9VSV9QQVRURVJOX1ZBTFVFX0NIQU5HRSAgICAgICAgID0gUGF0dGVybiBWYWx1ZSBDaGFuZ2UKLV9VSV9TQ0hFTUFfVkVSU0lPTl9DSEFOR0UgICAgICAgID0gU2NoZW1hIFZlcnNpb24gQ2hhbmdlCi1fVUlfU0NIRU1BX0xBTkdfQ0hBTkdFICAgICAgICAgICA9IFNjaGVtYSBsYW5nIENoYW5nZQotX1VJX1NFTEVDVE9SX1hQQVRIX0NIQU5HRSAgICAgICAgPSBTZWxlY3RvciB4cGF0aCBDaGFuZ2UKLV9VSV9UWVBFX0NIQU5HRSAgICAgICAgICAgICAgICAgID0gVHlwZSBDaGFuZ2UKLV9VSV9ERVJJVkVEQllfQ0hBTkdFICAgICAgICAgICAgID0gRGVyaXZhdGlvbiBDaGFuZ2UKLV9VSV9GQUNFVF9DSEFOR0UgICAgICAgICAgICAgICAgID0gRmFjZXQgQ2hhbmdlCi1fVUlfU0lNUExFVFlQRV9OQU1FX0NIQU5HRSAgICAgICA9IFNpbXBsZVR5cGUgTmFtZSBDaGFuZ2UKLV9VSV9VTklRVUVfTkFNRV9DSEFOR0UgICAgICAgICAgID0gVW5pcXVlIE5hbWUgQ2hhbmdlCi1fVUlfU0NIRU1BX0FUVFJJQlVURUZPUk1ERUZBVUxUX0NIQU5HRSA9IEF0dHJpYnV0ZSBGb3JtIERlZmF1bHQgQ2hhbmdlCi1fVUlfU0NIRU1BX0VMRU1FTlRGT1JNREVGQVVMVF9DSEFOR0UgPSBFbGVtZW50IEZvcm0gRGVmYXVsdCBDaGFuZ2UKLV9VSV9TQ0hFTUFfQkxPQ0tERUZBVUxUX0NIQU5HRSAgID0gQmxvY2sgRGVmYXVsdCBDaGFuZ2UKLV9VSV9TQ0hFTUFfRklOQUxERUZBVUxUX0NIQU5HRSAgID0gRmluYWwgRGVmYXVsdCBDaGFuZ2UKLV9VSV9FTEVNRU5UX1NVQlNUSVRVVElPTkdST1VQX0NIQU5HRSA9IFN1YnN0aXR1dGlvbiBHcm91cCBDaGFuZ2UKLV9VSV9FTEVNRU5UX0ZPUk1fQ0hBTkdFICAgICAgICAgID0gRm9ybSBDaGFuZ2UKLV9VSV9FTEVNRU5UX0JMT0NLX0NIQU5HRSAgICAgICAgID0gQmxvY2sgQ2hhbmdlCi1fVUlfRUxFTUVOVF9GSU5BTF9DSEFOR0UgICAgICAgICA9IEZpbmFsIENoYW5nZQotX1VJX0VMRU1FTlRfQUJTVFJBQ1RfQ0hBTkdFICAgICAgPSBBYnN0cmFjdCBDaGFuZ2UKLV9VSV9FTEVNRU5UX05JTExBQkxFX0NIQU5HRSAgICAgID0gTmlsbGFibGUgQ2hhbmdlCi1fVUlfVEFSR0VUTkFNRVNQQUNFX0NIQU5HRSAgICAgICA9IFRhcmdldCBOYW1lc3BhY2UgQ2hhbmdlCi0KLSEgV2luZG93IEhlYWRpbmdzIGZvciBGbGF0IFZpZXcKLV9VSV9QQUdFX0hFQURJTkdfQU5ZQVRUUklCVVRFID0gQW55IEF0dHJpYnV0ZQotX1VJX1BBR0VfSEVBRElOR19BTllFTEVNRU5UICAgPSBBbnkgRWxlbWVudAotX1VJX1BBR0VfSEVBRElOR19BUFBJTkZPICAgICAgICAgICAgPSBBcHBJbmZvCi1fVUlfUEFHRV9IRUFESU5HX0FUVFJJQlVURUdST1VQX1JFRiA9IEF0dHJpYnV0ZSBHcm91cCBSZWZlcmVuY2UKLV9VSV9QQUdFX0hFQURJTkdfQVRUUklCVVRFR1JPVVAgICAgID0gQXR0cmlidXRlIEdyb3VwCi1fVUlfUEFHRV9IRUFESU5HX0FUVFJJQlVURV9SRUYgICAgICA9IEF0dHJpYnV0ZSBSZWZlcmVuY2UKLV9VSV9QQUdFX0hFQURJTkdfQVRUUklCVVRFICAgICAgICAgID0gQXR0cmlidXRlCi1fVUlfUEFHRV9IRUFESU5HX0NPTVBMRVhUWVBFICAgICAgICA9IENvbXBsZXggVHlwZQotX1VJX1BBR0VfSEVBRElOR19ET0NVTUVOVEFUSU9OICAgICAgPSBEb2N1bWVudGF0aW9uCi1fVUlfUEFHRV9IRUFESU5HX0VMRU1FTlQgICAgID0gRWxlbWVudAotX1VJX1BBR0VfSEVBRElOR19FTEVNRU5UX1JFRiA9IEVsZW1lbnQgUmVmZXJlbmNlCi1fVUlfUEFHRV9IRUFESU5HX0VOVU0gICAgICAgID0gRW51bWVyYXRpb24KLV9VSV9QQUdFX0hFQURJTkdfRklFTEQgICAgICAgPSBGaWVsZAotX1VJX1BBR0VfSEVBRElOR19HUk9VUF9SRUYgICA9IEdyb3VwIFJlZmVyZW5jZQotX1VJX1BBR0VfSEVBRElOR19DT05URU5UTU9ERUwgID0gQ29udGVudCBNb2RlbAotX1VJX1BBR0VfSEVBRElOR19HUk9VUCAgICAgICAgID0gR3JvdXAKLV9VSV9QQUdFX0hFQURJTkdfSU1QT1JUICAgICAgICA9IEltcG9ydAotX1VJX1BBR0VfSEVBRElOR19JTkNMVURFICAgICAgID0gSW5jbHVkZQotX1VJX1BBR0VfSEVBRElOR19LRVlSRUYgICAgICAgID0gS2V5IFJlZmVyZW5jZQotX1VJX1BBR0VfSEVBRElOR19LRVkgICAgICAgICAgID0gS2V5Ci1fVUlfUEFHRV9IRUFESU5HX05PVEFUSU9OICAgICAgPSBOb3RhdGlvbgotX1VJX1BBR0VfSEVBRElOR19QQVRURVJOICAgICAgID0gUGF0dGVybgotX1VJX1BBR0VfSEVBRElOR19SRURFRklORSAgICAgID0gUmVkZWZpbmUKLV9VSV9QQUdFX0hFQURJTkdfU0NIRU1BICAgICAgICA9IFNjaGVtYQotX1VJX1BBR0VfSEVBRElOR19TRUxFQ1RPUiAgICAgID0gU2VsZWN0b3IKLV9VSV9QQUdFX0hFQURJTkdfTElTVCAgICAgICAgICA9IExpc3QKLV9VSV9QQUdFX0hFQURJTkdfVU5JT04gICAgICAgICA9IFVuaW9uCi1fVUlfUEFHRV9IRUFESU5HX1NJTVBMRUNPTlRFTlQgPSBTaW1wbGUgQ29udGVudAotX1VJX1BBR0VfSEVBRElOR19DT01QTEVYQ09OVEVOVCA9IENvbXBsZXggQ29udGVudAotX1VJX1BBR0VfSEVBRElOR19SRVNUUklDVElPTiAgID0gUmVzdHJpY3Rpb24KLV9VSV9QQUdFX0hFQURJTkdfRVhURU5TSU9OICAgICA9IEV4dGVuc2lvbgotX1VJX1BBR0VfSEVBRElOR19TSU1QTEVUWVBFICAgID0gU2ltcGxlIFR5cGUKLV9VSV9QQUdFX0hFQURJTkdfVU5JUVVFICAgICAgICA9IFVuaXF1ZQotX1VJX1BBR0VfSEVBRElOR19SRUZFUkVOQ0UgICAgID0gcmVmZXJlbmNlCi0KLSEKLSEgR3JhcGggcGFnZQotIQotX1VJX0dSQVBIX1NJTVBMRV9UWVBFUyAgICAgICAgID0gU2ltcGxlIFR5cGVzCi1fVUlfR1JBUEhfQ09NUExFWF9UWVBFUyAgICAgICAgPSBDb21wbGV4IFR5cGVzCi1fVUlfR1JBUEhfR1JPVVBTICAgICAgICAgICAgICAgPSBHcm91cHMKLV9VSV9HUkFQSF9HTE9CQUxfQVRUUklCVVRFUyAgICA9IEdsb2JhbCBBdHRyaWJ1dGVzCi1fVUlfR1JBUEhfR0xPQkFMX0VMRU1FTlRTICAgICAgPSBHbG9iYWwgRWxlbWVudHMKLV9VSV9HUkFQSF9YU0RTQ0hFTUEgICAgICAgICAgICA9IFNjaGVtYQotX1VJX0dSQVBIX1hTRFNDSEVNQV9OT19OQU1FU1BBQ0UgPSAobm8gdGFyZ2V0IG5hbWVzcGFjZSBzcGVjaWZpZWQpCi1fVUlfR1JBUEhfWFNEQ09NUExFWFRZUEVERUZJTklUSU9OID0gWFNEIENvbXBsZXggVHlwZSBEZWZpbml0aW9uOgotX1VJX0dSQVBIX1hTRE1PREVMR1JPVVAgICAgICAgID0gWFNEIE1vZGVsIEdyb3VwCi1fVUlfR1JBUEhfWFNEUEFSVElDTEUgICAgICAgICAgPSBYU0QgUGFydGljbGUKLV9VSV9HUkFQSF9WSUVXX05PVF9BVkFJTEFCTEUgICA9IFZpZXcgaXMgbm90IGF2YWlsYWJsZSBmb3Igc2VsZWN0ZWQgb2JqZWN0LgotX1VJX0dSQVBIX1VOS05PV05fT0JKRUNUICAgICAgID0gVW5rbm93biBvYmplY3QKLQotISBBZGRpdGlvbmFsIENhdGVnb3JpZXMKLV9VSV9HUkFQSF9UWVBFUyAgICAgICAgICAgICAgICA9IFR5cGVzCi1fVUlfR1JBUEhfRUxFTUVOVFMgICAgICAgICAgICAgPSBFbGVtZW50cwotX1VJX0dSQVBIX0FUVFJJQlVURVMgICAgICAgICAgID0gQXR0cmlidXRlcwotX1VJX0dSQVBIX0FUVFJJQlVURV9HUk9VUFMgICAgID0gQXR0cmlidXRlIEdyb3VwcwotX1VJX0dSQVBIX05PVEFUSU9OUyAgICAgICAgICAgID0gTm90YXRpb25zCi1fVUlfR1JBUEhfSURFTlRJVFlfQ09OU1RSQUlOVFMgPSBJZGVudGl0eSBDb25zdHJhaW50cwotX1VJX0dSQVBIX0FOTk9UQVRJT05TICAgICAgICAgID0gQW5ub3RhdGlvbnMKLV9VSV9HUkFQSF9ESVJFQ1RJVkVTICAgICAgICAgICA9IERpcmVjdGl2ZXMKLQotISBGb3IgVW5pb24gTWVtYmVyVHlwZXMgRGlhbG9nCi1fVUlfTEFCRUxfU0VMRUNUX01FTUJFUlRZUEVTICAgPSBTZWxlY3QgZnJvbSB0aGUgYXZhaWxhYmxlIHR5cGVzIGFuZCBhZGQgdG8gdGhlIG1lbWJlclR5cGVzIGxpc3QKLV9VSV9MQUJFTF9NRU1CRVJUWVBFU19DSEFOR0UgICA9IE1lbWJlciBUeXBlcyBDaGFuZ2UKLV9VSV9MQUJFTF9NRU1CRVJUWVBFU19WQUxVRSAgICA9IE1lbWJlciBUeXBlcyBWYWx1ZToKLV9VSV9MQUJFTF9NRU1CRVJUWVBFUyAgICAgICAgICA9IE1lbWJlciB0eXBlczoKLQotX1VJX0xBQkVMX1ZBUklFVFlfQ0hBTkdFICAgICAgID0gVmFyaWV0eSBDaGFuZ2UKLQotX1VJX0xBQkVMX0ZJWEVET1JERUZBVUxUX1ZBTFVFID0gRml4ZWQvRGVmYXVsdCBWYWx1ZQotCi1fVUlfTEFCRUxfSVRFTV9UWVBFX0NIQU5HRSAgICAgPSBJdGVtIFR5cGUgQ2hhbmdlCi0KLV9VSV9MQUJFTF9BVkFJTEFCTEVfVFlQRVMgICAgICA9IEF2YWlsYWJsZSBUeXBlcwotCi1fVUlfTEFCRUxfSU5DTFVERV9DSEFOR0UgICAgICAgPSBJbmNsdWRlIENoYW5nZQotCi1fVUlfTEFCRUxfSVRFTV9UWVBFICAgICAgICAgICAgPSBJdGVtIHR5cGU6Ci1fVUlfTEFCRUxfQkFTRV9UWVBFICAgICAgICAgICAgPSBCYXNlIFR5cGUKLV9VSV9MQUJFTF9UWVBFICAgICAgICAgICAgICAgICA9IFR5cGUKLV9VSV9MQUJFTF9NT0RFTF9HUk9VUCAgICAgICAgICA9IE1vZGVsIEdyb3VwCi0KLV9VSV9MQUJFTF9BQlNFTlQgICAgICAgICAgICAgICA9IGFic2VudAotCi1fVUlfV0FSTklOR19SRVNFVF9BVFRSR1JQX1JFRiAgPSBSZXNldCBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIDx7MH0+Ci1fVUlfV0FSTklOR19SRU1PVkVfQVRUUkdSUF9SRUYgPSBSZW1vdmUgYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSA8ezB9PgotX1VJX1dBUk5JTkdfUkVTRVRfQVRUUl9SRUYgICAgID0gUmVzZXQgYXR0cmlidXRlIHJlZmVyZW5jZSA8ezB9PgotX1VJX1dBUk5JTkdfUkVNT1ZFX0FUVFJfUkVGICAgID0gUmVtb3ZlIGF0dHJpYnV0ZSByZWZlcmVuY2UgPHswfT4KLQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0hCi0hIEhlcmUgaXMgdGhlIGxpc3Qgb2YgRXJyb3Igc3RyaW5nIHRoYXQgaGF2ZSBtZXNzYWdlIElEcyAtIG1ha2Ugc3VyZSB0aGV5IGFyZSB1bmlxdWUKLQotIQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0hIFRoZXNlIHRocmVlIGVycm9ycyBhcHBlYXIgaW4gdGhlIHNlbGVjdCBpbmNsdWRlIHdpemFyZAotISBUaGUgbmFtZSBvZiB0aGUgZmlsZSB3aWxsIGJlIHN1YnN0aXR1dGVkIGluCi1fVUlfRElGRkVSRU5UX05BTUVfU1BBQ0UgID0gezB9IGlzIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSAKLV9VSV9TQU1FX05BTUVfU1BBQ0UgICAgICAgPSB7MH0gaXMgaW4gdGhlIHNhbWUgbmFtZXNwYWNlCi1fVUlfSU5DT1JSRUNUX1hNTF9TQ0hFTUEgID0gezB9IGlzIGFuIGludmFsaWQgWE1MIHNjaGVtYSBmaWxlCi0KLV9FUlJPUl9TQ0hFTUFfTk9UX0VYSVNUICAgICAgICAgPSBEb2VzIG5vdCBleGlzdC4KLV9FUlJPUl9MQUJFTF9JTlZBTElEX1BSRUZJWCAgICAgPSBJbnZhbGlkIHByZWZpeC4gQSBwcmVmaXggbXVzdCBub3QgYmUgZW1wdHkgb3IgY29udGFpbiBhbnkgc3BhY2UuCi0KLSEgVGhlIG5hbWUgb2YgdGhlIGZpbGUgd2lsbCBiZSBzdWJzdGl0dXRlZCBpbgotX0VSUk9SX1NDSEVNQV9OQU1FX1RIRV9TQU1FICA9IHswfSBpcyB0aGUgY3VycmVudCBzY2hlbWEuIEEgc2NoZW1hIGNhbm5vdCBpbmNsdWRlIGl0c2VsZi4gUmVzZXQgdG8gdGhlIGxhc3QgdmFsaWQgc2NoZW1hLgotCi1fRVJST1JfWFNEX0dFTkVSQVRJT04gICAgICAgICAgICAgICAgPSBFcnJvciBnZW5lcmF0aW5nIFhNTCBzY2hlbWEKLV9FUlJPUl9OT19DT05UQUlORVIgICAgICAgICAgICAgICAgICA9IE5vIGZvbGRlciBzZWxlY3RlZAotX0VSUk9SX05PX0ZJTEVfTkFNRSAgICAgICAgICAgICAgICAgID0gTm8gZmlsZSBuYW1lIHByb3ZpZGVkCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfWFNEICAgICAgICAgPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIC54c2QKLQotCi0hCi0hIEZvciBzY2hlbWEgdGhhdCBoYXMgdG9vIG1hbnkgZXJyb3JzLCBhbiBleHRlbmRlZCBtZXNzYWdlLiAKLSEKLV9FUlJPUl9ESUFMT0dfWE1MX1NDSEVNQV9JTlZBTElEX1RFWFQgID0gVGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBub3QgdmFsaWQuICAKLV9FUlJPUl9NT1JFX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgPSBUaGVyZSBhcmUgbW9yZSBlcnJvcnMgaW4gdGhlIHNjaGVtYSB0aGFuIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIFRhc2tzIHZpZXcuICBDb3JyZWN0IHRoZSBmaXJzdCB7MH0gZXJyb3JzIGFuZCByZS12YWxpZGF0ZSB0aGUgc2NoZW1hIGZpbGUuCi0KLSEgRERMIEdlbmVyYXRpb24gRmFpbGVkIERpYWxvZwotX1VJX0RJQUxPR19ERExfR0VOX0ZBSUxFRF9USVRMRSAgICAgPSBEREwgR2VuZXJhdGlvbiBGYWlsZWQKLV9FUlJPUl9ESUFMT0dfRERMX05PVF9HRU5FUkVBVEVEICAgID0gRERMIGhhcyBub3QgYmVlbiBnZW5lcmF0ZWQKLV9VSV9ESUFMT0dfRERMX0dFTl9GQUlMRURfUkVBU09OICAgID0gVGhlIHNlbGVjdGVkIHNjaGVtYSBoYXMgbm8gZ2xvYmFsIGVsZW1lbnRzCi1fVUlfRElBTE9HX0RETF9HRU5fRkFJTEVEX1JFQVNPTjIgICA9IE5vbmUgb2YgdGhlIGdsb2JhbCBlbGVtZW50cyBpbiB0aGUgc2NoZW1hIGhhdmUgYSBjb21wbGV4IHR5cGUgb3IgdGhleSByZWZlcmVuY2UgY29tcGxleCB0eXBlcyB0aGF0IGNhbm5vdCBiZSBmb3VuZC4KLQotX0VYQ19PUEVOX1hTRCA9IENhbm5vdCBvcGVuIFhNTCBTY2hlbWEgZWRpdG9yCi0KLV9FUlJPUl9MQUJFTF9QUkVGSVhfRVhJU1RTICAgICA9IFByZWZpeCBhbHJlYWR5IGV4aXN0cwotCi1fRVJST1JfUkVNT1ZFX0xPQ0FMX1NJTVBMRVRZUEUgID0gUmVtb3ZlIGxvY2FsIHNpbXBsZSB0eXBlIGZyb20gZXh0ZW5zaW9uCi0KLV9XQVJOX0lOVkFMSURfVEFSR0VUX05BTUVTUEFDRSA9IFRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzIG5vdCB3ZWxsLWZvcm1lZAotCi1fRVJST1JfVEFSR0VUX05BTUVTUEFDRV9BTkRfUFJFRklYID0gQSB0YXJnZXQgbmFtZXNwYWNlIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcHJlZml4Ci0KLQotX1VJX0NPTlRBSU5NRU5UID0gQ29udGFpbm1lbnQKLV9VSV9JTkhFUklUQU5DRSA9IEluaGVyaXRhbmNlCi1fVUlfU1VCU1RJVFVUSU9OX0dST1VQUyA9IFN1YnN0aXR1dGlvbiBHcm91cHMKLV9VSV9BTk9OWU1PVVMgPSAqKmFub255bW91cyoqCi1fVUlfVkFMVUUgPSBWYWx1ZQotX1VJX0FOWV9FTEVNRU5UID0gQW55IEVsZW1lbnQKLV9VSV9TT1JUID0gU29ydAotCi1fVUlfQUNUSU9OX0VESVRfTkFNRVNQQUNFUyA9IEVkaXQgTmFtZXNwYWNlcy4uLgotCi0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0ID0gezB9Ci1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDIgPSB7MX0gezB9Ci1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlCi1fVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgY2hpbGQgb2YgdHlwZSB7MH0gZm9yIHRoZSB7MX0gZmVhdHVyZSBvZiB0aGUgc2VsZWN0ZWQgezJ9LgotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgc2libGluZyBvZiB0eXBlIHswfSBmb3IgdGhlIHNlbGVjdGVkIHsyfSwgdW5kZXIgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZWlyIHBhcmVudC4KLQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0hCi0hIFVzZWQgYnkgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVWaWV3Ci0hCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLV9VSV9MQUJFTF9TT1VSQ0VfRklMRVMgICA9IFdvcmtiZW5jaCBGaWxlcwotX1VJX0xBQkVMX1NFTEVDVEVEX0ZJTEVTID0gU2VsZWN0ZWQgRmlsZXMKLQotX1VJX0lNUE9SVF9CVVRUT04gICAgICAgICAgPSBJbXBvcnQgRmlsZXMuLi4KLV9VSV9JTVBPUlRfQlVUVE9OX1RPT0xfVElQID0gSW1wb3J0IGZpbGVzIGZyb20gZmlsZSBzeXN0ZW0KLQotCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSEKLSEgcmVmYWN0b3JpbmcKLSEKLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotcmVmYWN0b3JpbmdBY3Rpb25TZXQubGFiZWw9UmVmYWN0b3IKLXJlZmFjdG9yaW5nQWN0aW9uU2V0LmRlc2NyaXB0aW9uPVhTRCBFZGl0b3IgcmVmYWN0b3JpbmcgYWN0aW9ucwotcmVmYWN0b3JpbmcubWVudS5sYWJlbD1SZWZhY3RvcgotcmVmYWN0b3JpbmcucmVuYW1lQWN0aW9uLmxhYmVsPVJlJm5hbWUuLi4KLWNvbnRleHQudGV4dC5lZGl0b3IueHNkLm5hbWU9RWRpdGluZyBYU0QgY29udGV4dAotY29tbWFuZC54c2QucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQubmFtZT1SZW5hbWUgWFNEIGVsZW1lbnQKLWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50LmRlc2NyaXB0aW9uPVJlbmFtZSBYU0QgZWxlbWVudAotY29tbWFuZC54c2QucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwuZWxlbWVudC5uYW1lPU1ha2UgbG9jYWwgZWxlbWVudCBnbG9iYWwKLWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQuZGVzY3JpcHRpb249UHJvbW90ZXMgbG9jYWwgZWxlbWVudCB0byBnbG9iYWwgbGV2ZWwgYW5kIHJlcGxhY2VzIGl0cyByZWZlcmVuY2VzCi1jb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50Lm5hbWU9TWFrZSBhbm9ueW1vdXMgdHlwZSBnbG9iYWwKLWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsLmVsZW1lbnQuZGVzY3JpcHRpb249UHJvbW90ZXMgYW5vbnltb3VzIHR5cGUgdG8gZ2xvYmFsIGxldmVsIGFuZCByZXBsYWNlcyBpdHMgcmVmZXJlbmNlcwotY29tbWFuZC54c2QucmVmYWN0b3IucmVuYW1lVGFyZ2V0TmFtZXNwYWNlLm5hbWU9UmVuYW1lIFRhcmdldCBOYW1lc3BhY2UKLWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZVRhcmdldE5hbWVzcGFjZS5kZXNjcmlwdGlvbj1DaGFuZ2VzIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEKLXhzZC5yZXNvdXJjZS5yZW5hbWUucGFydGljaXBhbnQubmFtZT1SZW5hbWUgWFNEIENvbXBvbmVudAotRXh0ZW5zaW9uc1NjaGVtYXNEZXNjcmlwdGlvbj1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkLCB1c2UgZXh0ZW5zaW9uQ2F0ZWdvcmllcwotRXh0ZW5zaW9uQ2F0ZWdvcmllc0Rlc2NyaXB0aW9uPUV4dGVuc2lvbiBwb2ludCBmb3IgY29udHJpYnV0aW5nIHRvIHRoZSAnYnVpbHQgaW4nIGNhdGVnb3JpZXMgb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIGZvciBYTUwgU2NoZW1hCi1YU0RFZGl0b3JFeHRlbnNpb25Db25maWd1cmF0aW9uPVRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQsIHVzZSBpbnRlcm5hbEVkaXRvckNvbmZpZ3VyYXRpb24KLUludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbj1FeHRlbnNpb24gcG9pbnQgZm9yIGV4dGVuZGluZyB0aGUgWE1MIFNjaGVtYSBFZGl0b3IKLQotISBDb3BpZWQgZnJvbSBzc2UKLTIzY29uY2F0X0VYQ189UmVzb3VyY2UgezB9IGRvZXMgbm90IGV4aXN0LgotMzJjb25jYXRfRVhDXz1FZGl0b3IgY291bGQgbm90IGJlIG9wZW4gb24gezB9Ci1Bbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbjFfRVJST1JfPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGVuIGluaXRpYWxpemluZyB0aGUgaW5wdXQgZm9yIHRoZSB0aGUgZWRpdG9yJ3Mgc291cmNlIHBhZ2UuCi1PcGVuRmlsZUZyb21Tb3VyY2UubGFiZWw9T3AmZW4gU2VsZWN0aW9uCi1PcGVuRmlsZUZyb21Tb3VyY2UudG9vbHRpcD1PcGVuIGFuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgbGluawotT3BlbkZpbGVGcm9tU291cmNlLmltYWdlPQotT3BlbkZpbGVGcm9tU291cmNlLmRlc2NyaXB0aW9uPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi0KLUFkZFRhc2subGFiZWw9QWRkICZUYXNrLi4uCi1BZGRUYXNrLnRvb2x0aXA9QWRkIFRhc2suLi4KLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrLnRvb2x0aXA9QWRkIEJvb2ttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLQotX1pFUk9fT1JfTU9SRSA9IFplcm8gb3IgTW9yZQotX1pFUk9fT1JfT05FICA9IFplcm8gb3IgT25lCi1fT05FX09SX01PUkUgID0gT25lIG9yIE1vcmUKLQotIyBGb3IgdHJhbnNsYXRvcnMsIGFzIGluIHN0cnVjdHVyZWQgRE9NIHRyZWUKLV9VSV9MQUJFTF9TVFJVQ1RVUkVEICAgICAgICAgICA9IFN0cnVjdHVyZWQKLQotX1VJX0xBQkVMX01PVkUgICAJCQkJICAgICAgID0gTW92ZQotX1VJX0xBQkVMX1JFTkFNRSAJCQkJICAgICAgID0gUmVuYW1lCi1fVUlfTEFCRUxfVEFSR0VUTkFNRVNQQUNFX0NIQU5HRSAgICAgICA9IFRhcmdldCBOYW1lc3BhY2UgQ2hhbmdlCi1fSU5GT19SRVNFVF9BVFRSSUJVVEVfR1JPVVBfUkVGRVJFTkNFICA9IFJlc2V0IGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UKLV9JTkZPX1JFTU9WRV9BVFRSSUJVVEVfR1JPVVBfUkVGRVJFTkNFID0gUmVtb3ZlIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UKLQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLXNlYXJjaC5kZWNsYXJhdGlvbnMubGFiZWwgPSBEZWNsYXJhdGlvbnMKLXNlYXJjaC5yZWZlcmVuY2VzLmxhYmVsID0gUmVmZXJlbmNlcwotCi0hIGV4dGVuc2lvbiBwb2ludHMgCi1FeHRlbnNpb25Ob2RlQ3VzdG9taXphdGlvbnNEZXNjcmlwdGlvbiA9IEV4dGVuc2lvbiBOb2RlIEN1c3RvbWl6YXRpb25zCi1YTUxTY2hlbWFFZGl0b3JNb2RlcyA9IFhNTCBTY2hlbWEgRWRpdG9yIE1vZGVzCi0jIwotWFNEX1NvdXJjZV90YXJnZXRfbmFtZT1YTUwgU2NoZW1hIFNvdXJjZQotWFNEX2h5cGVybGluaz1YTUwgU2NoZW1hIENvbnRlbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTg1OWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVfVUlfRURJVE9SX05BTUUiCi0JCQlpY29uPSJpY29ucy9YU0RGaWxlLmdpZiIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIj4KLSAgICAgICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYU0RXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9ORVdfWFNEIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYU0RXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LlhNTENhdGVnb3J5IgotCQkJaWNvbj0iaWNvbnMvWFNERmlsZS5naWYiPgotCQkJPGRlc2NyaXB0aW9uPiVfVUlfQ1JFQVRFX0FfTkVXX1NDSEVNQTwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVfVUlfWE1MX1NDSEVNQV9QUkVGRVJFTkNFIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RQcmVmZXJlbmNlUGFnZSI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJwcmVmZXJlbmNlcGFnZXMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RQcmVmZXJlbmNlUGFnZSIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSIgLz4KLSAgIAkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0QiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdXBwb3J0IGhlbHAgb24gdGhlIHRhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tICAgPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uRmlsZXMiPgotCQk8YW5ub3RhdGlvbkZpbGUKLQkJbG9jYXRpb249Ii93M2Mvc2NoZW1hRm9yQ29kZUFzc2lzdC1hbm5vdGF0aW9ucy54bWwiCi0JCXB1YmxpY0lkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0JCTwvYW5ub3RhdGlvbkZpbGU+Ci0JCTwvZXh0ZW5zaW9uPgotCS0tPgotCQotCQotICAgPGV4dGVuc2lvbiAKLSAgIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5Q29udHJpYnV0b3IiPgotICAgICA8cHJvcGVydHlDb250cmlidXRvcgotICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvciIKLSAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5wcm92aWRlcnMuWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIiPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkgY2F0ZWdvcnk9IkdlbmVyYWwiLz4KLSAgIAkJIDxwcm9wZXJ0eUNhdGVnb3J5IGNhdGVnb3J5PSJEb2N1bWVudGF0aW9uIi8+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeSBjYXRlZ29yeT0iQWR2YW5jZWQiLz4KLSAgICAgPC9wcm9wZXJ0eUNvbnRyaWJ1dG9yPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gCi0gICAgCXBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVRhYnMiPgotICAgICAgPHByb3BlcnR5VGFicyAKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yIj4KLQkJCTxwcm9wZXJ0eVRhYgotCQkJCWxhYmVsPSIlX1VJX0xBQkVMX0dFTkVSQUwiCi0JCQkJY2F0ZWdvcnk9IkdlbmVyYWwiCi0JCQkJaWQ9InByb3BlcnR5LnRhYi5nZW5lcmFsIj4KLQkJCTwvcHJvcGVydHlUYWI+Ci0JCQk8cHJvcGVydHlUYWIKLQkJCQlsYWJlbD0iJV9VSV9MQUJFTF9UWVBFX0NPTlNUUkFJTlRTIgotCQkJCWNhdGVnb3J5PSJHZW5lcmFsIgotCQkJCWFmdGVyVGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIKLQkJCQlpZD0icHJvcGVydHkudGFiLnR5cGVjb25zdHJhaW50cyI+Ci0JCQk8L3Byb3BlcnR5VGFiPgotCQkJPHByb3BlcnR5VGFiCi0JCQkJbGFiZWw9IiVfVUlfTEFCRUxfRU5VTUVSQVRJT05TIgotCQkJCWNhdGVnb3J5PSJHZW5lcmFsIgotCQkJCWFmdGVyVGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIKLQkJCQlpZD0icHJvcGVydHkudGFiLmVudW1lcmF0aW9ucyI+Ci0JCQk8L3Byb3BlcnR5VGFiPgotCQkJPHByb3BlcnR5VGFiCi0JCQkJbGFiZWw9IiVfVUlfTEFCRUxfQURWQU5DRUQiCi0JCQkJY2F0ZWdvcnk9IkFkdmFuY2VkIgotCQkJCWFmdGVyVGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIKLQkJCQlpZD0icHJvcGVydHkudGFiLmFkdmFuY2VkIj4KLQkJCTwvcHJvcGVydHlUYWI+CQkJCi0JCQk8cHJvcGVydHlUYWIKLQkJCQlsYWJlbD0iJV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OIgotCQkJCWNhdGVnb3J5PSJEb2N1bWVudGF0aW9uIgotCQkJCWFmdGVyVGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIKLQkJCQlpZD0icHJvcGVydHkudGFiLmRvY3VtZW50YXRpb24iPgotCQkJPC9wcm9wZXJ0eVRhYj4KLQkJCTxwcm9wZXJ0eVRhYgotCQkJCWxhYmVsPSIlX1VJX0xBQkVMX0VYVEVOU0lPTlMiCi0JCQkJY2F0ZWdvcnk9IkRvY3VtZW50YXRpb24iCi0JCQkJYWZ0ZXJUYWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIgotCQkJCWlkPSJwcm9wZXJ0eS50YWIuZXh0ZW5zaW9ucyI+Ci0JCQk8L3Byb3BlcnR5VGFiPgotICAgIDwvcHJvcGVydHlUYWJzPgotIDwvZXh0ZW5zaW9uPgotCi0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5U2VjdGlvbnMiPgotICAgPHByb3BlcnR5U2VjdGlvbnMgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IiPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RTY2hlbWFTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRFNjaGVtYVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYSI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5TY2hlbWFMb2NhdGlvblNlY3Rpb24iIAotCSAJaWQ9InByb3Auc2VjdGlvbi5TY2hlbWFMb2NhdGlvblNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbXBvc2l0b3IiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEQ29tcGxleFR5cGVTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRENvbXBsZXhUeXBlU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuYWR2YW5jZWQiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+CQkgCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREVsZW1lbnREZWNsYXJhdGlvblNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuYWR2YW5jZWQiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RFbGVtZW50RGVjbGFyYXRpb25BZHZhbmNlZFNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNERWxlbWVudERlY2xhcmF0aW9uQWR2YW5jZWRTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb24iPgotCSAgICA8L2lucHV0PiAgIAotCSA8L3Byb3BlcnR5U2VjdGlvbj4gCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uU2VjdGlvbiIKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25TZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNETW9kZWxHcm91cFNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNETW9kZWxHcm91cFNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXAiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNETW9kZWxHcm91cERlZmluaXRpb25TZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb24iPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEU2ltcGxlVHlwZVNlY3Rpb24iCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRFNpbXBsZVR5cGVTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmFkdmFuY2VkIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEU2ltcGxlVHlwZUFkdmFuY2VkU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RTaW1wbGVUeXBlQWR2YW5jZWRTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLnR5cGVjb25zdHJhaW50cyIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREZhY2V0U2VjdGlvbiIKLSAgICAgICAgZmlsdGVyPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREZhY2V0U2VjdGlvbkZpbHRlciIKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNERmFjZXRTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudCI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmRvY3VtZW50YXRpb24iIAotCSAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuQW5ub3RhdGlvblNlY3Rpb24iIAotCSAJaWQ9InByb3Auc2VjdGlvbi5Bbm5vdGF0aW9uU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5leHRlbnNpb25zIiAKLQkgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLkV4dGVuc2lvbnNTZWN0aW9uIiAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uRXh0ZW5zaW9uc1NlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50Ij4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0JIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RBbnlFbGVtZW50Q29udGVudHNTZWN0aW9uIiAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uZ2VuZXJhbCI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLQkgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTREltcG9ydFNlY3Rpb24iIAotCSAJaWQ9InByb3Auc2VjdGlvbi5nZW5lcmFsIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgPC9wcm9wZXJ0eVNlY3Rpb25zPgotPC9leHRlbnNpb24+Ci0KLSAgPCEtLSB0aGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkLCB1c2UgZXh0ZW5zaW9uQ2F0ZWdvcmllcyAtLT4KLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iRXh0ZW5zaW9uc1NjaGVtYXNEZXNjcmlwdGlvbiIgbmFtZT0iJUV4dGVuc2lvbnNTY2hlbWFzRGVzY3JpcHRpb24iLz4gIAotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHRlbnNpb25DYXRlZ29yaWVzIiBuYW1lPSIlRXh0ZW5zaW9uQ2F0ZWdvcmllc0Rlc2NyaXB0aW9uIi8+Ci0KLSAgPCEtLSB0aGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkLCB1c2UgaW50ZXJuYWxFZGl0b3JDb25maWd1cmF0aW9uIC0tPiAgCi0gIDxleHRlbnNpb24tcG9pbnQgaWQ9IlhTREVkaXRvckV4dGVuc2lvbkNvbmZpZ3VyYXRpb24iIG5hbWU9IiVYU0RFZGl0b3JFeHRlbnNpb25Db25maWd1cmF0aW9uIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbiIgbmFtZT0iJUludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbiIvPgotICAKLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5zaWJpbGl0eU5vZGVDdXN0b21pemF0aW9ucyIgbmFtZT0iJUV4dGVuc2lvbk5vZGVDdXN0b21pemF0aW9uc0Rlc2NyaXB0aW9uIi8+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVkaXRvck1vZGVzIiBuYW1lPSIlWE1MU2NoZW1hRWRpdG9yTW9kZXMiLz4KLQotCTwhLS0gaW50aWFsaXplIHhzZCByZWNvbmNpbGUgdmFsaWRhdG9yIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRCI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0Ci0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS50ZXh0LmVkaXRvci5jb250ZXh0IgotCQkJbmFtZT0iJWNvbnRleHQudGV4dC5lZGl0b3IueHNkLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2UudWkudGV4dEVkaXRvclNjb3BlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSB0aGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGF1Z21lbnQgdGhlIE1vZGVsUXVlcnkgdG8gcHJvdmlkZSBzY2hlbWEgc3BlY2lmaWMgZ3VpZGVkIGVkaXRpbmcgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVsUXVlcnlFeHRlbnNpb25zIj4KLQkJPG1vZGVsUXVlcnlFeHRlbnNpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQuWFNETW9kZWxRdWVyeUV4dGVuc2lvbiIKLQkJCWNvbnRlbnRUeXBlPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIj4KLQkJPC9tb2RlbFF1ZXJ5RXh0ZW5zaW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBSZWdpc3RlciB0aGUgWFNEU2VhcmNoUGFydGljcGFudCBhZ2FpbnN0IGZvciBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJucyAJCS0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgkKLQkgPGV4dGVuc2lvbiAgIAotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaFBhcnRpY2lwYW50cyI+Ci0JCTxzZWFyY2hQYXJ0aWNpcGFudAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2Quc2VhcmNoLlhTRFNlYXJjaFBhcnRpY2lwYW50IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLlhTRFNlYXJjaFBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJICAgPG9yPgotCQkJICAgICAgPHdpdGggdmFyaWFibGU9InBhdHRlcm4iPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuIi8+CQkJICAgCi0JCQkJICA8L3dpdGg+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9zZWFyY2hQYXJ0aWNpcGFudD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgkgCi0gICAgPCEtLSBSZWdpc3RlciBhICdyZW5hbWUnIHBhcnRpY2lwYW50IHRoaXMgZW5hYmxlcyB1cyB0byBwcm92aWRlIHJlZmFjdG9yaW5nIGZvciAgICAgLS0+IAotICAgIDwhLS0gcmVuYW1lZCBYTUwgU2NoZW1hIGNvbXBvbmVudHMgKGUuZy4gZWxlbWVudHMsIHR5cGVzIGV0Yy4pICAgICAgICAgICAgICAgICAgICAgIC0tPiAKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JIAotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnJlbmFtZVBhcnRpY2lwYW50cyI+Ci0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJXhzZC5yZXNvdXJjZS5yZW5hbWUucGFydGljaXBhbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnJlZmFjdG9yaW5nLlhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQiPgotCQkJCQk8L2luc3RhbmNlb2Y+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JIAotICAgIDwhLS0gUmVnaXN0ZXIgYSAncmVuYW1lJyBwYXJ0aWNpcGFudCB0aGlzIGVuYWJsZXMgdXMgdG8gcHJvdmlkZSByZWZhY3RvcmluZyBmb3IgICAgIC0tPiAKLSAgICA8IS0tIHJlbmFtZWQgcmVzb3VyY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CSAKLTwhLS0KLSAgICA8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiV4c2QucmVzb3VyY2UucmVuYW1lLnBhcnRpY2lwYW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnJlZmFjdG9yaW5nLlhTRFJlc291cmNlUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCTwvZXh0ZW5zaW9uPgotCS0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFJlZ2lzdGVyIHRoZSAgJ1JlZmFjdG9yJywgJ1JlZmVyZW5jZXMnIGFuZCAnRGVjbGFyYXRpb25zJyBpdGVtcyB0byB0aGUgZGVzaWduIHZpZXcJICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgkgICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JpbmcubWVudS5vYmplY3RDb250cmliIiAKLSAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyIj4gIAotICAgICAgICAgPCEtLSAKLSAgICAgICAgIGNzIDogZGVjbGFyYXRpb24gc2VhcmNoIGlzbid0IGZ1bGx5IGltcGxlbWVudGVkIHlldCwgcmVtb3ZpbmcgdGhpcyBtZW51IGFjdGlvbiBmb3Igbm93Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5zZWFyY2guZGVjbGFyYXRpb25zLmFjdGlvbiIgCi0gICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgICAgICAgbWVudWJhclBhdGg9InNlYXJjaC1zbG90IgotICAgICAgICAgICAgbGFiZWw9IiVzZWFyY2guZGVjbGFyYXRpb25zLmxhYmVsIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnMuWFNEU2VhcmNoRGVjbGFyYXRpb25zR3JvdXBBY3Rpb25EZWxlZ2F0ZSI+IAotICAgICAgICAgPC9hY3Rpb24+ICAgICAgICAgIAotICAgICAgICAgLS0+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5zZWFyY2gucmVmZXJlbmNlcy5hY3Rpb24iIAotICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgIHN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJzZWFyY2gtc2xvdCIKLSAgICAgICAgICAgIGxhYmVsPSIlc2VhcmNoLnJlZmVyZW5jZXMubGFiZWwiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9ucy5YU0RTZWFyY2hSZWZlcmVuY2VzR3JvdXBBY3Rpb25EZWxlZ2F0ZSI+IAotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvcmluZy5tZW51LnJlZmFjdG9yR3JvdXAub2JqZWN0IiAKLSAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICBzdHlsZT0icHVsbGRvd24iCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0icmVmYWN0b3Jpbmctc2xvdCIKLSAgICAgICAgICAgIGxhYmVsPSIlcmVmYWN0b3JpbmdBY3Rpb25TZXQubGFiZWwiIAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5YU0RSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUiPiAKLSAgICAgICAgIDwvYWN0aW9uPiAgIAotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgICAgCi0gICAgICA8IS0tIGhlcmUgd2UgYWRkIHRoZSAncmVmYWN0b3InIG1lbnUgaXRlbSB0byB0aGUgc291cmNlIHZpZXcgLS0+Ci0gICAgICA8dmlld2VyQ29udHJpYnV0aW9uCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yaW5nLm1lbnUuc291cmNlIgotICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZS5zb3VyY2UuRWRpdG9yQ29udGV4dCI+Ci0JICAgIDxhY3Rpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JpbmcubWVudS5yZWZhY3Rvckdyb3VwLnNvdXJjZSIKLSAgICAgICAJCXN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICBsYWJlbD0iJXJlZmFjdG9yaW5nLm1lbnUubGFiZWwiIAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5YU0RSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUiPiAKLSAgCSAgICA8L2FjdGlvbj4KLSAgICAgICA8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0KLSAgICAgPC9leHRlbnNpb24+Ci0KLQkKLQk8IS0tIAotCQlUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiB0byB0aGUgZmlsZSBjb250ZXh0IG1lbnUgaXMgdGVtcG9yYXJ5IHVudGlsIHJlc291cmNlIAotCQluYXZpZ2F0b3Igd2lsbCBwcm92aWRlIGFsbG93IHRvIGV4dGVuZCByZWZhY3RvciBtZW51ICAgICAgICAKLQktLT4KLQkKLQk8IS0tZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkgPG9iamVjdENvbnRyaWJ1dGlvbgotCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCW5hbWVGaWx0ZXI9IioueHNkIgotCQlpZD0ib3JnLndzdC54c2QudWkucmVuYW1lIj4KLQkJPG1lbnUgaWQ9InJlZmFjdG9yWFNEUmVzb3VyY2UiIHBhdGg9ImFkZGl0aW9ucyIgbGFiZWw9IiVyZWZhY3RvcmluZy5tZW51LmxhYmVsIj4KLQkJICA8c2VwYXJhdG9yIG5hbWU9InJlZmFjdG9yIi8+Ci0JCTwvbWVudT4KLQk8YWN0aW9uCi0JCWxhYmVsPSIlcmVmYWN0b3JpbmcucmVuYW1lQWN0aW9uLmxhYmVsIgotCQltZW51YmFyUGF0aD0icmVmYWN0b3JYU0RSZXNvdXJjZS9yZWZhY3RvciIKLQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5SZW5hbWVSZXNvdXJjZUFjdGlvbkRlbGVnYXRlIgotCQllbmFibGVzRm9yPSIxIgotCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvcmluZy5hY3Rpb25zLlJlbmFtZVJlc291cmNlIj4KLQkgPC9hY3Rpb24+Ci0JIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uLS0+CQotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50Ij4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwuZWxlbWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsLmVsZW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC54c2QucmVmYWN0b3IucmVuYW1lVGFyZ2V0TmFtZXNwYWNlLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZVRhcmdldE5hbWVzcGFjZS5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWVUYXJnZXROYW1lc3BhY2UiPgotCQk8L2NvbW1hbmQ+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzIj4KLQkJPHRhcmdldAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiCi0JCQluYW1lPSIlWFNEX1NvdXJjZV90YXJnZXRfbmFtZSI+Ci0JCTwvdGFyZ2V0PgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycyI+Ci0JCTxoeXBlcmxpbmtEZXRlY3RvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREh5cGVybGlua0RldGVjdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREh5cGVybGlua0RldGVjdG9yIgotCQkJbmFtZT0iJVhTRF9oeXBlcmxpbmsiCi0JCQl0YXJnZXRJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSI+Ci0JCTwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9UeXBlVml6RWRpdG9yTW9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9UeXBlVml6RWRpdG9yTW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDhkMTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovVHlwZVZpekVkaXRvck1vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpejsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5FZGl0b3JNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuQURUQ29udGVudE91dGxpbmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLlR5cGVWaXpGaWd1cmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RFZGl0UGFydEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlVml6RWRpdG9yTW9kZSBleHRlbmRzIEVkaXRvck1vZGUKLXsKLSAgcHJpdmF0ZSBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5OwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnR5cGV2aXoiOwotICAKLSAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotICB7Ci0gICAgcmV0dXJuICJBZHZhbmNlZCI7Ci0gIH0KLQotICBwdWJsaWMgRWRpdFBhcnRGYWN0b3J5IGdldEVkaXRQYXJ0RmFjdG9yeSgpCi0gIHsKLSAgICBpZiAoZWRpdFBhcnRGYWN0b3J5ID09IG51bGwpCi0gICAgewotICAgICAgZWRpdFBhcnRGYWN0b3J5ID0gbmV3IFhTREVkaXRQYXJ0RmFjdG9yeShuZXcgVHlwZVZpekZpZ3VyZUZhY3RvcnkoKSk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIGVkaXRQYXJ0RmFjdG9yeTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuIElEOwotICB9Ci0KLSAgcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0T3V0bGluZVByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBuZXcgQURUQ29udGVudE91dGxpbmVQcm92aWRlcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0JveEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Cb3hGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhOTA0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0JveEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmxheW91dHMuQ29sdW1uRGF0YTsKLQotcHVibGljIGNsYXNzIEJveEZpZ3VyZSBleHRlbmRzIEZpZ3VyZQotewotICBwcm90ZWN0ZWQgQ29sdW1uRGF0YSBjb2x1bW5EYXRhID0gbmV3IENvbHVtbkRhdGEoKTsgIAotICBwdWJsaWMgSGVhZGluZ0ZpZ3VyZSBoZWFkaW5nRmlndXJlOwotICBwcm90ZWN0ZWQgRmlndXJlIGNvbnRlbnRQYW5lOwotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCA9IGZhbHNlOwotCi0gIHB1YmxpYyBCb3hGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAKLSAgICBib29sZWFuIGhpZ2hDb250cmFzdCA9IGZhbHNlOwotICAgIHRyeQotICAgIHsKLSAgICAgIGhpZ2hDb250cmFzdCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBpZiAoIWhpZ2hDb250cmFzdCkKLSAgICB7Ci0gICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIH0KLSAgICAKLSAgICBoZWFkaW5nRmlndXJlID0gbmV3IEhlYWRpbmdGaWd1cmUoKTsgICAKLSAgICBhZGQoaGVhZGluZ0ZpZ3VyZSk7Ci0KLSAgICBjb250ZW50UGFuZSA9IG5ldyBGaWd1cmUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGdyYXBoaWNzKQotICAgICAgewotICAgICAgICBncmFwaGljcy5maWxsUmVjdGFuZ2xlKGdldEJvdW5kcygpKTsKLSAgICAgICAgc3VwZXIucGFpbnQoZ3JhcGhpY3MpOwotICAgICAgICBib29sZWFuIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGlzRmlyc3QpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShyLngsIHIueSArIDEsIHIueCArIHIud2lkdGgsIHIueSArIDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgY29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgVG9vbGJhckxheW91dCgpKTsKLSAgICBhZGQoY29udGVudFBhbmUpOwotICAgIGhlYWRpbmdGaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBncmFwaGljcykKLSAgewotICAgIHN1cGVyLnBhaW50KGdyYXBoaWNzKTsKLSAgICAvKgotICAgIC8vIEZpbGwgZm9yIHRoZSBoZWFkZXIgc2VjdGlvbgotICAgIC8vCi0gICAgUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmRhcmtHcmF5KTsKLSAgICBDb2xvciBncmFkaWVudDEgPSBDb2xvckNvbnN0YW50cy5saWdodEdyYXk7Ci0gICAgaWYgKGlzU2VsZWN0ZWQpCi0gICAgewotICAgICAgZ3JhZGllbnQxID0gQ29sb3JDb25zdGFudHMubGlnaHRCbHVlOwotICAgIH0KLSAgICBDb2xvciBncmFkaWVudDIgPSBDb2xvckNvbnN0YW50cy53aGl0ZTsKLSAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoZ3JhZGllbnQxKTsKLSAgICBncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoZ3JhZGllbnQyKTsKLSAgICBncmFwaGljcy5maWxsR3JhZGllbnQoci54ICsgMSwgci55ICsgMSwgci53aWR0aCAtIDIsIG5vZGVOYW1lTGFiZWwuZ2V0Qm91bmRzKCkuaGVpZ2h0IC0gMSwgdHJ1ZSk7Ci0gICAgbm9kZU5hbWVMYWJlbC5wYWludChncmFwaGljcyk7Ci0gICAgKi8KLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBjb250ZW50UGFuZTsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKTsKLSAgfQotICAKLSAgcHVibGljIEhlYWRpbmdGaWd1cmUgZ2V0SGVhZGluZ0ZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gaGVhZGluZ0ZpZ3VyZTsKLSAgfQotICAKLSAgcHVibGljIENvbHVtbkRhdGEgZ2V0Q29sdW1uRGF0YSgpCi0gIHsKLSAgICByZXR1cm4gY29sdW1uRGF0YTsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0NvbXBhcnRtZW50RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0NvbXBhcnRtZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMTlhZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Db21wYXJ0bWVudEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlN0cnVjdHVyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JU3RydWN0dXJlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmxheW91dHMuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuR2VuZXJpY0dyb3VwRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgQ29tcGFydG1lbnRGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgaW1wbGVtZW50cyBJQ29tcGFydG1lbnRGaWd1cmUKLXsKLSAgcHVibGljIExhYmVsIG5vZGVOYW1lTGFiZWw7Ci0gIHByb3RlY3RlZCBGaWd1cmUgY29udGVudFBhbmU7Ci0gIHByb3RlY3RlZCBGaWd1cmUgYW5ub3RhdGlvbkFyZWE7Ci0gIHB1YmxpYyBGaWd1cmUgcm93RmlndXJlOwotCi0gIHB1YmxpYyBDb21wYXJ0bWVudEZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigpOwotCi0gICAgcm93RmlndXJlID0gbmV3IEZpZ3VyZSgpOwotICAgIGFkZChyb3dGaWd1cmUpOwotCi0gICAgYW5ub3RhdGlvbkFyZWEgPSBuZXcgRmlndXJlKCkgewotICAgICAgCi0gICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBncmFwaGljcykKLSAgICAgIHsKLSAgICAgICAgc3VwZXIucGFpbnQoZ3JhcGhpY3MpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGdyYXBoaWNzLnB1c2hTdGF0ZSgpOyAgCi0gICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsdWUpOwotICAgICAgICAgIGdyYXBoaWNzLnNldEZvbnQoRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50cy5zbWFsbEZvbnQpOwotICAgICAgICAgIExpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRmlndXJlIG9iamVjdCA9IChGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICB0cmF2ZXJzZShvYmplY3QsIGdyYXBoaWNzKTsgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKEZpZ3VyZSBmaWd1cmUsIEdyYXBoaWNzIGdyYXBoaWNzKQotICAgICAgewotICAgICAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBGaWd1cmUgb2JqZWN0ID0gKEZpZ3VyZSlpLm5leHQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgR2VuZXJpY0dyb3VwRmlndXJlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBmaWcgPSAoR2VuZXJpY0dyb3VwRmlndXJlKSBvYmplY3Q7Ci0gICAgICAgICAgICBpZiAoZmlnLmhhc1RleHQoKSkKLSAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd1RleHQoZmlnLmdldFRleHQoKSwgZmlnLmdldFRleHRDb29yZGluYXRlcygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdHJhdmVyc2Uob2JqZWN0LCBncmFwaGljcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICB9OwotICAgIFRvb2xiYXJMYXlvdXQgYW5ub3RhdGlvbkxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICBhbm5vdGF0aW9uTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgYW5ub3RhdGlvbkFyZWEuc2V0TGF5b3V0TWFuYWdlcihhbm5vdGF0aW9uTGF5b3V0KTsKLQotICAgIC8vIE5lZWQgdGhpcyB0byBzaG93IGNvbnRlbnQgbW9kZWwgc3RydWN0dXJlIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGZpZ3VyZQotICAgIHJvd0ZpZ3VyZS5hZGQoYW5ub3RhdGlvbkFyZWEpOwotCi0gICAgY29udGVudFBhbmUgPSBuZXcgRmlndXJlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBncmFwaGljcykKLSAgICAgIHsKLSAgICAgICAgc3VwZXIucGFpbnQoZ3JhcGhpY3MpOwotICAgICAgICBncmFwaGljcy5wdXNoU3RhdGUoKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIGlzRmlyc3QgPSB0cnVlOwotICAgICAgICAgIENvbG9yIG9sZENvbG9yID0gZ3JhcGhpY3MuZ2V0Rm9yZWdyb3VuZENvbG9yKCk7Ci0gICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgRmlndXJlIGZpZ3VyZSA9IChGaWd1cmUpIGkubmV4dCgpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0vLyAgICAgICAgICAgIGlmIChmaWd1cmUgaW5zdGFuY2VvZiBGaWVsZEZpZ3VyZSkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICBSZWN0YW5nbGUgckNoaWxkID0gKChGaWVsZEZpZ3VyZSlmaWd1cmUpLmdldE5hbWVGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLS8vICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUockNoaWxkLnJpZ2h0KCksIHJDaGlsZC55LCByQ2hpbGQucmlnaHQoKSwgckNoaWxkLmJvdHRvbSgpKTsKLS8vICAgICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmRhcmtHcmF5KTsKLS8vICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzRmlyc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLS8vICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUoci54LCByLnksIHIueCwgci55ICsgci5oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgICAgICAgICAgICBncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBncmFwaGljcy5maWxsR3JhZGllbnQoci54LCByLnksIHIud2lkdGgsIDEsIGZhbHNlKTsgICAgCi0vLyAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUoci54LCByLnksIHIueCArIHIud2lkdGgsIHIueSk7Ci0vLyAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHIueCwgci55LCByLngsIHIueSArIHIuaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKG9sZENvbG9yKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5wb3BTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBjb250ZW50UGFuZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotICAgIHJvd0ZpZ3VyZS5hZGQoY29udGVudFBhbmUpOwotCi0gICAgUm93TGF5b3V0IHJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLSAgICByb3dGaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihyb3dMYXlvdXQpOwotICAgIHJvd0xheW91dC5zZXRDb25zdHJhaW50KGFubm90YXRpb25BcmVhLCAiYW5ub3RhdGlvbiIpOwotICAgIHJvd0xheW91dC5zZXRDb25zdHJhaW50KGNvbnRlbnRQYW5lLCAiY29udGVudFBhbmUiKTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBjb250ZW50UGFuZTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldEFubm90YXRpb25QYW5lKCkKLSAgewotICAgIHJldHVybiBhbm5vdGF0aW9uQXJlYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZWRpdFBhcnRBdHRhY2hlZChFZGl0UGFydCBvd25lcikKLSAgeyAgIAotICAgIFN0cnVjdHVyZUVkaXRQYXJ0IHN0cnVjdHVyZUVkaXRQYXJ0ID0gbnVsbDsKLSAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IG93bmVyLmdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgc3RydWN0dXJlRWRpdFBhcnQgPSAoU3RydWN0dXJlRWRpdFBhcnQpIHBhcmVudDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIFJvd0xheW91dCByb3dMYXlvdXQgPSAoUm93TGF5b3V0KXJvd0ZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCk7Ci0gICAgSVN0cnVjdHVyZUZpZ3VyZSB0eXBlRmlndXJlID0gc3RydWN0dXJlRWRpdFBhcnQuZ2V0U3RydWN0dXJlRmlndXJlKCk7ICAgIAotICAgIEFzc2VydC5pc1RydWUodHlwZUZpZ3VyZSBpbnN0YW5jZW9mIFN0cnVjdHVyZUZpZ3VyZSwgIkV4cGVjdGVkIG9iamVjdCBvZiB0eXBlIFN0cnVjdHVyZUZpZ3VyZSIpOyAgICAKLSAgICByb3dMYXlvdXQuc2V0Q29sdW1uRGF0YSgoKFN0cnVjdHVyZUZpZ3VyZSl0eXBlRmlndXJlKS5nZXRDb2x1bW5EYXRhKCkpOyAgICAgICAgICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uRmVlZGJhY2soKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgfSAgIAotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaFZpc3VhbHMoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0ZpZWxkRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0ZpZWxkRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZDg3Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9GaWVsZEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlN0cnVjdHVyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklGaWVsZEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JU3RydWN0dXJlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmxheW91dHMuUm93TGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgRmllbGRGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgaW1wbGVtZW50cyBJRmllbGRGaWd1cmUKLXsKLSAgLy8gVE9ETzogcHV0IHRoaXMgY29sb3IgaXMgc29tZSBjb21tb24gY2xhc3MKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBjZWxsQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMjI0LCAyMzMsIDI0Nik7Ci0KLS8vIEZvciBmaXggdG8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MTk0MAotLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgbGVmdE91dGVyQm9yZGVyQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMjUzLCAxOTYsIDg4KTsKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIGxlZnRJbm5lckJvcmRlckNvbG9yID0gbmV3IENvbG9yKG51bGwsIDI1MywgMjI2LCAxNzIpOwotLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgcmlnaHRPdXRlckJvcmRlckNvbG9yID0gbmV3IENvbG9yKG51bGwsIDE1MCwgMTc5LCAyMjQpOwotLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgcmlnaHRJbm5lckJvcmRlckNvbG9yID0gbmV3IENvbG9yKG51bGwsIDQ5LCAxMDYsIDE5Nyk7Ci0gIAotICAvLyBGb3JtYXR0aW5nIGNvbnN0cmFpbnRzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUF9NQVJHSU4gPSAyOyAvLyBwaXhlbHMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NX01BUkdJTiA9IFRPUF9NQVJHSU4gKyAxOyAvLyBleHRyYSBwaXhlbCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9vdGVyIGxpbmUKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9NQVJHSU4gPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9NQVJHSU4gPSBMRUZUX01BUkdJTjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfU0lERV9QQURESU5HID0gNjsKLQotICAvLyBTdGF0ZXMgcmVxdWlyaW5nIGRlY29yYXRvcnMsIGFuZCB0aGVpciBpY29ucwotICAvLyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEltYWdlIGVycm9ySWNvbiA9IElDT05fRVJST1I7Ci0KLSAgLy8gTGFiZWxzIHdoaWNoIGhhbmRsZSBwcmVzZW50YXRpb24gb2YgbmFtZSBhbmQgdHlwZQotICBwdWJsaWMgRmlndXJlIHJvd0ZpZ3VyZTsKLSAgcHJvdGVjdGVkIExhYmVsIG5hbWVMYWJlbDsKLSAgcHJvdGVjdGVkIExhYmVsIG5hbWVBbm5vdGF0aW9uTGFiZWw7ICAvLyBmb3Igb2NjdXJyZW5jZSB0ZXh0LCBvciBlcnJvciBpY29ucwotICBwcm90ZWN0ZWQgTGFiZWwgdHlwZUxhYmVsOwotICBwcm90ZWN0ZWQgTGFiZWwgdHlwZUFubm90YXRpb25MYWJlbDsgIC8vIGZvciBvY2N1cnJlbmNlIHRleHQsIG9yIGVycm9yIGljb25zCi0gIHByb3RlY3RlZCBMYWJlbCB0b29sVGlwTGFiZWw7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cyA9IGZhbHNlOwotICAKLSAgcHVibGljIEZpZWxkRmlndXJlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0TGF5b3V0TWFuYWdlcihuZXcgVG9vbGJhckxheW91dCgpKTsKLSAgICByb3dGaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgUm93TGF5b3V0IHJvd0xheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsKLSAgICByb3dGaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihyb3dMYXlvdXQpOwotCi0gICAgYWRkKHJvd0ZpZ3VyZSk7Ci0KLSAgICBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgICBuYW1lTGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMywgNSwgMywgNSkpOwotICAgIG5hbWVMYWJlbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLSAgICBuYW1lTGFiZWwuc2V0T3BhcXVlKHRydWUpOwotICAgIHJvd0ZpZ3VyZS5hZGQobmFtZUxhYmVsKTsKLSAgICAKLSAgICBuYW1lQW5ub3RhdGlvbkxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgbmFtZUFubm90YXRpb25MYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzLCA1LCAzLCA1KSk7Ci0gICAgbmFtZUFubm90YXRpb25MYWJlbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLSAgICBuYW1lQW5ub3RhdGlvbkxhYmVsLnNldE9wYXF1ZSh0cnVlKTsKLSAgICByb3dGaWd1cmUuYWRkKG5hbWVBbm5vdGF0aW9uTGFiZWwpOwotICAgIAotICAgIHRvb2xUaXBMYWJlbCA9IG5ldyBMYWJlbCgpOwotLy8gIERvbid0IHNob3cgdG9vbHRpcCBmb3Igbm93LiAgQW5ub3lpbmcgdmVydGljYWwgbGluZSBzaG93cyB1cC4gIFNhZmUgZml4LgotLy8gICAgbmFtZUxhYmVsLnNldFRvb2xUaXAodG9vbFRpcExhYmVsKTsKLSAgICB0eXBlTGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgICAKLSAgICAvLyBjcyA6IHdlIG5lZWQgdG8gYWRkIHNvbWUgYWRkaXRpb25hbCBwYWRkaW5nIHRvIHRoZSByaWdodAotICAgIC8vIHNvIHRoYXQgd2hlbiB3ZSBlZGl0IHRoZSBmaWVsZCB0aGVyZSdzIHJvb20gZm9yIHRoZSBjb21ib2JveCdzIGFycm93Ci0gICAgLy8gYW5kIHRoZSB0eXBlIG5hbWUgd29uJ3QgYmUgcGFydGlhbGx5IG9ic2N1cmVkCi0gICAgLy8KLSAgICB0eXBlTGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMywgNSwgMywgMjApKTsKLSAgICB0eXBlTGFiZWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0gICAgdHlwZUxhYmVsLnNldE9wYXF1ZSh0cnVlKTsKLSAgICByb3dGaWd1cmUuYWRkKHR5cGVMYWJlbCk7Ci0KLSAgICB0eXBlQW5ub3RhdGlvbkxhYmVsID0gbmV3IExhYmVsKCkgewotICAgICAgCi0gICAgICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChnZXRUZXh0KCkgPT0gbnVsbCB8fCBnZXRUZXh0KCkuZXF1YWxzKCIiKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKDAsIDApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRQcmVmZXJyZWRTaXplKHdIaW50LCBoSGludCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICB0eXBlQW5ub3RhdGlvbkxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMsIDUsIDMsIDUpKTsKLSAgICB0eXBlQW5ub3RhdGlvbkxhYmVsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotICAgIHR5cGVBbm5vdGF0aW9uTGFiZWwuc2V0T3BhcXVlKHRydWUpOwotICAgIHJvd0ZpZ3VyZS5hZGQodHlwZUFubm90YXRpb25MYWJlbCk7Ci0vLyBEb24ndCBzaG93IHRvb2x0aXAgZm9yIG5vdy4gIEFubm95aW5nIHZlcnRpY2FsIGxpbmUgc2hvd3MgdXAuICBTYWZlIGZpeC4KLS8vICAgIHR5cGVBbm5vdGF0aW9uTGFiZWwuc2V0VG9vbFRpcCh0b29sVGlwTGFiZWwpOwotICAgIAotICAgIHJvd0xheW91dC5zZXRDb25zdHJhaW50KG5hbWVMYWJlbCwgIm5hbWUiKTsKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludChuYW1lQW5ub3RhdGlvbkxhYmVsLCAibmFtZUFubm90YXRpb24iKTsKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludCh0eXBlTGFiZWwsICJ0eXBlIik7Ci0gICAgcm93TGF5b3V0LnNldENvbnN0cmFpbnQodHlwZUFubm90YXRpb25MYWJlbCwgInR5cGVBbm5vdGF0aW9uIik7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSAibmFtZSIgc3RyaW5nIHVzZWQgYnkgdGhpcyBmaWd1cmUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVMYWJlbC5nZXRUZXh0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmaWd1cmUgcmVwcmVzZW50aW5nIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgKi8KLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gbmFtZUxhYmVsOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgInR5cGUiIHN0cmluZyB1c2VkIGJ5IHRoaXMgZmlndXJlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiB0eXBlTGFiZWwuZ2V0VGV4dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmlndXJlIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlJ3MgdHlwZQotICAgKi8KLSAgcHVibGljIExhYmVsIGdldFR5cGVMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gdHlwZUxhYmVsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBuYW1lCi0gICAqICAgICAgICAgIFNldCB0aGUgIm5hbWUiIHN0cmluZyB1c2VkIGJ5IHRoaXMgZmlndXJlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIG5hbWVMYWJlbC5zZXRUZXh0KG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlCi0gICAqICAgICAgICAgIFNldCB0aGUgInR5cGUiIHN0cmluZyB1c2VkIGJ5IHRoaXMgZmlndXJlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIHR5cGVMYWJlbC5zZXRUZXh0KHR5cGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUeXBlVG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXApCi0gIHsKLSAgICBzZXROYW1lVG9vbFRpcFRleHQodG9vbFRpcCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lVG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXApCi0gIHsKLSAgICBpZiAodG9vbFRpcC5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgbmFtZUxhYmVsLnNldFRvb2xUaXAodG9vbFRpcExhYmVsKTsKLSAgICAgIHRvb2xUaXBMYWJlbC5zZXRUZXh0KHRvb2xUaXApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbmFtZUxhYmVsLnNldFRvb2xUaXAobnVsbCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lQW5ub3RhdGlvbkxhYmVsKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgbmFtZUFubm90YXRpb25MYWJlbC5zZXRUZXh0KHRleHQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZUFubm90YXRpb25MYWJlbEljb24oSW1hZ2UgaWNvbikKLSAgewotICAgIG5hbWVBbm5vdGF0aW9uTGFiZWwuc2V0SWNvbihpY29uKTsKLSAgfQotICAKLSAgcHVibGljIExhYmVsIGdldE5hbWVBbm5vdGF0aW9uTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVBbm5vdGF0aW9uTGFiZWw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVBbm5vdGF0aW9uTGFiZWwoU3RyaW5nIHRleHQpCi0gIHsKLSAgICB0eXBlQW5ub3RhdGlvbkxhYmVsLnNldFRleHQodGV4dCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUeXBlQW5ub3RhdGlvbkxhYmVsSWNvbihJbWFnZSBpY29uKQotICB7Ci0gICAgdHlwZUFubm90YXRpb25MYWJlbC5zZXRJY29uKGljb24pOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldFR5cGVBbm5vdGF0aW9uTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVBbm5vdGF0aW9uTGFiZWw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlY29tcHV0ZUxheW91dCgpCi0gIHsKLSAgICBSb3dMYXlvdXQgbGF5b3V0ID0gKFJvd0xheW91dClyb3dGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpOwotICAgIGlmIChsYXlvdXQgIT0gbnVsbCAmJiBsYXlvdXQuZ2V0Q29sdW1uRGF0YSgpICE9IG51bGwpCi0gICAgewotICAgICAgbGF5b3V0LmdldENvbHVtbkRhdGEoKS5jbGVhckNvbHVtbldpZHRocygpOwotICAgIH0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVkaXRQYXJ0QXR0YWNoZWQoRWRpdFBhcnQgb3duZXIpCi0gIHsKLSAgICBTdHJ1Y3R1cmVFZGl0UGFydCBzdHJ1Y3R1cmVFZGl0UGFydCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBvd25lci5nZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgU3RydWN0dXJlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHN0cnVjdHVyZUVkaXRQYXJ0ID0gKFN0cnVjdHVyZUVkaXRQYXJ0KSBwYXJlbnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBSb3dMYXlvdXQgcm93TGF5b3V0ID0gKFJvd0xheW91dClyb3dGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpOwotICAgIElTdHJ1Y3R1cmVGaWd1cmUgdHlwZUZpZ3VyZSA9IHN0cnVjdHVyZUVkaXRQYXJ0LmdldFN0cnVjdHVyZUZpZ3VyZSgpOyAgICAKLSAgICBBc3NlcnQuaXNUcnVlKHR5cGVGaWd1cmUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVGaWd1cmUsICJFeHBlY3RlZCBvYmplY3Qgb2YgdHlwZSBTdHJ1Y3R1cmVGaWd1cmUiKTsgICAgCi0gICAgcm93TGF5b3V0LnNldENvbHVtbkRhdGEoKChTdHJ1Y3R1cmVGaWd1cmUpdHlwZUZpZ3VyZSkuZ2V0Q29sdW1uRGF0YSgpKTsgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uRmVlZGJhY2soKQotICB7Ci0gICAgYm9vbGVhbiBoaWdoQ29udHJhc3QgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBoaWdoQ29udHJhc3QgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRIaWdoQ29udHJhc3QoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaWYgKGhpZ2hDb250cmFzdCkKLSAgICB7Ci0gICAgICByb3dGaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotICAgICAgcm93RmlndXJlLnNldEJhY2tncm91bmRDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJvd0ZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoY2VsbENvbG9yKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICAgIGJvb2xlYW4gaGlnaENvbnRyYXN0ID0gZmFsc2U7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGlmIChoaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgcm93RmlndXJlLnNldEZvcmVncm91bmRDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQpKTsKLSAgICAgIHJvd0ZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByb3dGaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKGdldEJhY2tncm91bmRDb2xvcigpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKE9iamVjdCBtb2RlbCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBncmFwaGljcykKLSAgewotICAgIHN1cGVyLnBhaW50KGdyYXBoaWNzKTsKLSAgICBpZiAoaGFzRm9jdXMpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotICAgICAgICBSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpOwotICAgICAgICBncmFwaGljcy5zZXRYT1JNb2RlKHRydWUpOwotICAgICAgICBncmFwaGljcy5kcmF3Rm9jdXMoci54LCByLnkgKyAxLCByLndpZHRoIC0gMSwgci5oZWlnaHQgLSAyKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgZ3JhcGhpY3MucG9wU3RhdGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvSGVhZGluZ0ZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9IZWFkaW5nRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjc1ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9IZWFkaW5nRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotcHVibGljIGNsYXNzIEhlYWRpbmdGaWd1cmUgZXh0ZW5kcyBGaWd1cmUKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBoZWFkZXJDb2xvciA9IG5ldyBDb2xvcihudWxsLCAyMjQsIDIzMywgMjQ2KTsKLSAgTGFiZWwgbGFiZWw7Ci0gIENvbG9yW10gZ3JhZGllbnRDb2xvciA9IHtDb2xvckNvbnN0YW50cy53aGl0ZSwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JDb25zdGFudHMubGlnaHRHcmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JDb25zdGFudHMubGlnaHRCbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JDb25zdGFudHMuZ3JheX07Ci0gIGJvb2xlYW4gaXNTZWxlY3RlZCA9IGZhbHNlOwotICBib29sZWFuIGlzUmVhZE9ubHkgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBIZWFkaW5nRmlndXJlKCkKLSAgewotICAgIGxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMikpOwotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICB0b29sYmFyTGF5b3V0LnNldE1pbm9yQWxpZ25tZW50KFRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLSAgICBzZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotICAgIGFkZChsYWJlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdyYWRpZW50Q29sb3JzKENvbG9yW10gY29sb3JzKQotICB7Ci0gICAgdGhpcy5ncmFkaWVudENvbG9yID0gY29sb3JzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIGlzU2VsZWN0ZWQpCi0gIHsKLSAgICB0aGlzLmlzU2VsZWN0ZWQgPSBpc1NlbGVjdGVkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNSZWFkT25seShib29sZWFuIGlzUmVhZE9ubHkpCi0gIHsKLSAgICB0aGlzLmlzUmVhZE9ubHkgPSBpc1JlYWRPbmx5OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBncmFwaGljcykKLSAgewotICAgIHN1cGVyLnBhaW50KGdyYXBoaWNzKTsKLSAgICAKLSAgICBncmFwaGljcy5wdXNoU3RhdGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBGaWxsIGZvciB0aGUgaGVhZGVyIHNlY3Rpb24KLSAgICAgIC8vCi0gICAgICBSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICAgIGdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotICAKLSAgICAgIENvbG9yIGdyYWRpZW50MSA9IGlzUmVhZE9ubHkgPyBncmFkaWVudENvbG9yWzFdIDogaGVhZGVyQ29sb3I7Ci0gICAgICBpZiAoaXNTZWxlY3RlZCAmJiBpc1JlYWRPbmx5KSBncmFkaWVudDEgPSBncmFkaWVudENvbG9yWzNdOwotICAgICAgZWxzZSBpZiAoaXNTZWxlY3RlZCAmJiAhaXNSZWFkT25seSkgZ3JhZGllbnQxID0gZ3JhZGllbnRDb2xvclsyXTsKLSAgICAgIENvbG9yIGdyYWRpZW50MiA9IGdyYWRpZW50Q29sb3JbMF07Ci0gICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoZ3JhZGllbnQxKTsKLSAgICAgIGdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihncmFkaWVudDIpOwotICAgICAgUmVjdGFuZ2xlIGxhYmVsQm91bmRzID0gbGFiZWwuZ2V0Qm91bmRzKCk7Ci0gICAgICBncmFwaGljcy5maWxsR3JhZGllbnQoci54KzEsIHIueSsxLCByLndpZHRoLTIsIGxhYmVsQm91bmRzLmhlaWdodCAtIDIsIHRydWUpOyAgICAKLSAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5kYXJrR3JheSk7Ci0gICAgICBsYWJlbC5wYWludChncmFwaGljcyk7ICAgIAotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZ3JhcGhpY3MucG9wU3RhdGUoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvUm91bmRlZExpbmVCb3JkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvUm91bmRlZExpbmVCb3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlODBmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLXB1YmxpYyBjbGFzcyBSb3VuZGVkTGluZUJvcmRlciBleHRlbmRzIExpbmVCb3JkZXIKLXsKLSAgcHJvdGVjdGVkIGludCBhcmNMZW5ndGg7ICAgCi0gIHByb3RlY3RlZCBpbnQgbGluZVN0eWxlID0gR3JhcGhpY3MuTElORV9TT0xJRDsKLQotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoQ29sb3IgYywgaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoKQotICB7Ci0gICAgc3VwZXIoYywgd2lkdGgpOyAgICAgCi0gICAgdGhpcy5hcmNMZW5ndGggPSBhcmNMZW5ndGg7Ci0gIH0KLQotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoKQotICB7Ci0gICAgc3VwZXIod2lkdGgpOyAgICAgCi0gICAgdGhpcy5hcmNMZW5ndGggPSBhcmNMZW5ndGg7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSb3VuZGVkTGluZUJvcmRlcihDb2xvciBjLCBpbnQgd2lkdGgsIGludCBhcmNMZW5ndGgsIGludCBsaW5lU3R5bGUpCi0gIHsKLSAgICBzdXBlcihjLCB3aWR0aCk7Ci0gICAgdGhpcy5hcmNMZW5ndGggPSBhcmNMZW5ndGg7Ci0gICAgdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0gIH0KLQotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoLCBpbnQgbGluZVN0eWxlKQotICB7Ci0gICAgc3VwZXIod2lkdGgpOwotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICAgIHRoaXMubGluZVN0eWxlID0gbGluZVN0eWxlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFpbnQoSUZpZ3VyZSBmaWd1cmUsIEdyYXBoaWNzIGdyYXBoaWNzLCBJbnNldHMgaW5zZXRzKQotICB7Ci0gICAgaW50IHJsYldpZHRoID0gZ2V0V2lkdGgoKTsKLSAgICB0ZW1wUmVjdC5zZXRCb3VuZHMoZ2V0UGFpbnRSZWN0YW5nbGUoZmlndXJlLCBpbnNldHMpKTsKLSAgICBpZiAocmxiV2lkdGglMiA9PSAxKQotICAgIHsKLSAgICAgIHRlbXBSZWN0LndpZHRoLS07Ci0gICAgICB0ZW1wUmVjdC5oZWlnaHQtLTsKLSAgICB9Ci0gICAgdGVtcFJlY3Quc2hyaW5rKHJsYldpZHRoLzIscmxiV2lkdGgvMik7Ci0gICAgZ3JhcGhpY3Muc2V0TGluZVdpZHRoKHJsYldpZHRoKTsKLSAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUobGluZVN0eWxlKTsKLSAgICBpZiAoZ2V0Q29sb3IoKSAhPSBudWxsKQotICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGdldENvbG9yKCkpOwotICAgIGdyYXBoaWNzLmRyYXdSb3VuZFJlY3RhbmdsZSh0ZW1wUmVjdCwgYXJjTGVuZ3RoLCBhcmNMZW5ndGgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1N0cnVjdHVyZUZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9TdHJ1Y3R1cmVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwZjY0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1N0cnVjdHVyZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLQotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlRmlndXJlIGV4dGVuZHMgQm94RmlndXJlIGltcGxlbWVudHMgSVN0cnVjdHVyZUZpZ3VyZQotewotICBwdWJsaWMgdm9pZCBlZGl0UGFydEF0dGFjaGVkKEVkaXRQYXJ0IG93bmVyKQotICB7Ci0gICAgLy8gbm90aGluZyB0byBkbyBoZXJlIDotKQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uRmVlZGJhY2soKQotICB7Ci0gICAgTGluZUJvcmRlciBib3hGaWd1cmVMaW5lQm9yZGVyID0gKExpbmVCb3JkZXIpZ2V0Qm9yZGVyKCk7Ci0gICAgYm94RmlndXJlTGluZUJvcmRlci5zZXRXaWR0aCgyKTsKLSAgICAvLyBUT0RPIChjcykgbmVlZCB0byBmaXggdGhpcwotICAgIC8vYm94RmlndXJlTGluZUJvcmRlci5zZXRDb2xvcihnZXRDb21wbGV4VHlwZSgpLmlzUmVhZE9ubHkoKSA/IENvbG9yQ29uc3RhbnRzLmRhcmtHcmF5IDogQ29sb3JDb25zdGFudHMuZGFya0JsdWUpOyAgCi0gICAgZ2V0SGVhZGluZ0ZpZ3VyZSgpLnNldFNlbGVjdGVkKHRydWUpOwotICAgIHJlcGFpbnQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICAgIExpbmVCb3JkZXIgYm94RmlndXJlTGluZUJvcmRlciA9IChMaW5lQm9yZGVyKWdldEJvcmRlcigpOwotICAgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0V2lkdGgoMSk7Ci0gICAgZ2V0SGVhZGluZ0ZpZ3VyZSgpLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICByZXBhaW50KCk7Ci0gIH0gIAotICAKLSAgcHVibGljIGJvb2xlYW4gaGl0VGVzdEhlYWRlcihQb2ludCBsb2NhdGlvbikKLSAgewotICAgIElGaWd1cmUgdGFyZ2V0ID0gZ2V0SGVhZGluZ0ZpZ3VyZSgpOwotICAgIFJlY3RhbmdsZSBiID0gdGFyZ2V0LmdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICB0YXJnZXQudHJhbnNsYXRlVG9BYnNvbHV0ZShiKTsgIAotICAgIHJldHVybiBiLmNvbnRhaW5zKGxvY2F0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaFZpc3VhbHMoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgSVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSAoSVN0cnVjdHVyZSltb2RlbDsKLSAgICBnZXROYW1lTGFiZWwoKS5zZXRUZXh0KHN0cnVjdHVyZS5nZXROYW1lKCkpOwotICAgIGdldEhlYWRpbmdGaWd1cmUoKS5zZXRJc1JlYWRPbmx5KHN0cnVjdHVyZS5pc1JlYWRPbmx5KCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1R5cGVWaXpGaWd1cmVGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1R5cGVWaXpGaWd1cmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MjYwZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9UeXBlVml6RmlndXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklFeHRlbmRlZEZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5JTW9kZWxHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLk1vZGVsR3JvdXBGaWd1cmU7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlVml6RmlndXJlRmFjdG9yeSBpbXBsZW1lbnRzIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkKLXsgIAotICBwdWJsaWMgSVN0cnVjdHVyZUZpZ3VyZSBjcmVhdGVTdHJ1Y3R1cmVGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgU3RydWN0dXJlRmlndXJlIGZpZ3VyZSA9IG5ldyBTdHJ1Y3R1cmVGaWd1cmUoKTsKLSAgICBmaWd1cmUuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKDEpKTsgICAgCi0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLSAgICB0b29sYmFyTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7Ci0KLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpCi0gICAgewotICAgICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldEljb24oKChJVHJlZUVsZW1lbnQpbW9kZWwpLmdldEltYWdlKCkpOwotICAgIH0gICAgCi0gICAgLy9maWd1cmUuZ2V0SGVhZGluZ0ZpZ3VyZSgpLnNldElzUmVhZE9ubHkoZ2V0Q29tcGxleFR5cGUoKS5pc1JlYWRPbmx5KCkpOwotICAgIC8vIHdlIHNob3VsZCBvcmdhbml6ZSBJVHJlZUVsZW1lbnQgYW5kIGludGVncmF0ZSBpdCB3aXRoIHRoZSBmYWNhZGUgICAgCi0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotCi0gIHB1YmxpYyBJRmllbGRGaWd1cmUgY3JlYXRlRmllbGRGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBuZXcgRmllbGRGaWd1cmUoKTsKLSAgfQotICAKLSAgcHVibGljIElDb21wYXJ0bWVudEZpZ3VyZSBjcmVhdGVDb21wYXJ0bWVudEZpZ3VyZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBDb21wYXJ0bWVudEZpZ3VyZSBmaWd1cmUgPSBuZXcgQ29tcGFydG1lbnRGaWd1cmUoKTsKLSAgICBmaWd1cmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMSkpOwotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICB0b29sYmFyTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfSAgCi0gIAotICBwdWJsaWMgSU1vZGVsR3JvdXBGaWd1cmUgY3JlYXRlTW9kZWxHcm91cEZpZ3VyZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG5ldyBNb2RlbEdyb3VwRmlndXJlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2xheW91dHMvQ29sdW1uRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vbGF5b3V0cy9Db2x1bW5EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTlkYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vbGF5b3V0cy9Db2x1bW5EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24ubGF5b3V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIENvbHVtbkRhdGEKLXsKLSAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAKLSAgY2xhc3MgRW50cnkKLSAgewotICAgIGludCB3aWR0aCA9IDA7Ci0gICAgaW50IHdlaWdodCA9IDE7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNsZWFyQ29sdW1uV2lkdGhzKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpaS5uZXh0KCk7Ci0gICAgICBlbnRyeS53aWR0aCA9IDA7Ci0gICAgfSAgCi0gIH0gIAotICAKLSAgcHJpdmF0ZSBFbnRyeSBsb29rdXBPckNyZWF0ZUNvbHVtbkVudHJ5KFN0cmluZyBpZGVudGlmaWVyKQotICB7Ci0gICAgRW50cnkgZW50cnkgPSAoRW50cnkpbWFwLmdldChpZGVudGlmaWVyKTsKLSAgICBpZiAoZW50cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbnRyeSA9IG5ldyBFbnRyeSgpOwotICAgICAgbWFwLnB1dChpZGVudGlmaWVyLCBlbnRyeSk7Ci0gICAgfSAgCi0gICByZXR1cm4gZW50cnk7IAotICB9ICAKLSAgCi0gIHZvaWQgc3RyZXRjaENvbHVtbldpZHRoSWZOZWVkZWQoU3RyaW5nIGlkZW50aWZpZXIsIGludCB3aWR0aCkKLSAgewotICAgIEVudHJ5IGVudHJ5ID0gbG9va3VwT3JDcmVhdGVDb2x1bW5FbnRyeShpZGVudGlmaWVyKTsKLSAgICBlbnRyeS53aWR0aCA9IE1hdGgubWF4KGVudHJ5LndpZHRoLCB3aWR0aCk7Ci0gIH0KLSAgCi0gIGludCBnZXRDb2x1bW5XaWR0aChTdHJpbmcgaWRlbnRpZmllcikKLSAgewotICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KW1hcC5nZXQoaWRlbnRpZmllcik7Ci0gICAgaWYgKGVudHJ5ICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGVudHJ5LndpZHRoOwotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gMDsvL2htbSBzaG91bGQgd2UgcmV0dXJuIC0xID8KLSAgICB9ICAKLSAgfQotICAKLSAgaW50IGdldENvbHVtbldlaWdodChTdHJpbmcgaWRlbnRpZmllcikKLSAgewotICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KW1hcC5nZXQoaWRlbnRpZmllcik7Ci0gICAgaWYgKGVudHJ5ICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGVudHJ5LndlaWdodDsKLSAgICB9ICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbHVtbldlaWdodChTdHJpbmcgaWRlbnRpZmllciwgaW50IHdlaWdodCkKLSAgewotICAgIEVudHJ5IGVudHJ5ID0gbG9va3VwT3JDcmVhdGVDb2x1bW5FbnRyeShpZGVudGlmaWVyKTsKLSAgICBlbnRyeS53ZWlnaHQgPSB3ZWlnaHQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9sYXlvdXRzL1Jvd0xheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vbGF5b3V0cy9Sb3dMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5MDY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9sYXlvdXRzL1Jvd0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5sYXlvdXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotcHVibGljIGNsYXNzIFJvd0xheW91dCBleHRlbmRzIEFic3RyYWN0TGF5b3V0Ci17Ci0gIC8vIGxheW91dCBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJlbnQgY29udGV4dAotICAvLyBhbnkgbGF5b3V0IG1hbmFnZXIgdW5kZXIgdGhlIHBhcmVudCBjb250ZXh0IGlzIGNvbm5lY3RlZAotICAvLyBjb2x1bW4gcm93cyBhcmUgbWFpbnRhaW5lZCBhY2Nyb3NzIGNvbnRhaW5lciBib3VuZGFyaWVzICAKLSAgcHJvdGVjdGVkIENvbHVtbkRhdGEgY29sdW1uRGF0YTsKLSAgcHJvdGVjdGVkIEhhc2hNYXAgZmlndXJlVG9Db250c3RyYWludE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICBwdWJsaWMgUm93TGF5b3V0KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0KLSAgLy8gdGhpcyBtZXRob2QgY29tcHV0ZXMgdGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZCB0byBkaXNwbGF5IHRoZSBmaWd1cmVzCi0gIC8vCi0gIHByaXZhdGUgRGltZW5zaW9uIGNhbGN1bGF0ZUNoaWxkcmVuU2l6ZShJRmlndXJlIGNvbnRhaW5lciwgTGlzdCBjaGlsZHJlbiwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gcHJlZmVycmVkKQotICB7Ci0gICAgRGltZW5zaW9uIGNoaWxkU2l6ZTsKLSAgICBJRmlndXJlIGNoaWxkOwotICAgIGludCBoZWlnaHQgPSAwOwotICAgIGludCB3aWR0aCA9IDA7Ci0gICAgCi0gICAgLy9JUm93RmlndXJlIGZpZ3VyZSA9IChJUm93RmlndXJlKWNvbnRhaW5lcjsKLSAgICAKLSAgICAvLyBmb3IgZWFjaCBjZWxsIGluIHRoZSByb3cKLSAgICAvLwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgU3RyaW5nIGNvbHVtbklkZW5pZmllciA9IChTdHJpbmcpZ2V0Q29uc3RyYWludChjaGlsZCk7Ci0gICAgICAgICAgICAgCi0gICAgICAvLyBmaXJzdCB3ZSBjb21wdXRlIHRoZSBjaGlsZCBzaXplIHdpdGhvdXQgcmVnYXJkIGZvciBjb2x1bW5EYXRhCi0gICAgICAvLwotICAgICAgY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOy8vIDogY2hpbGQuZ2V0TWluaW11bVNpemUod0hpbnQsIGhIaW50KTsKLSAgICAgICAgCi0gICAgICAvLyBub3cgdGhhdCB0aGUgY29sdW1uRGF0YSBoYXMgYmVlbiBwb3B1bGF0ZWQgd2UgY2FuIGNvbnNpZGVyIGlmIHRoZSByb3cgbmVlZHMgdG8gYmUgbGFyZ2VyCi0gICAgICAvLwotICAgICAgaW50IGVmZmVjdGl2ZVdpZHRoID0gY2hpbGRTaXplLndpZHRoOwotICAgICAgaWYgKGNvbHVtbklkZW5pZmllciAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIGNvbHVtbkRhdGEuc3RyZXRjaENvbHVtbldpZHRoSWZOZWVkZWQoY29sdW1uSWRlbmlmaWVyLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgICBlZmZlY3RpdmVXaWR0aCA9IGNvbHVtbkRhdGEuZ2V0Q29sdW1uV2lkdGgoY29sdW1uSWRlbmlmaWVyKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoY2hpbGRTaXplLmhlaWdodCwgaGVpZ2h0KTsKLSAgICAgIHdpZHRoICs9IGVmZmVjdGl2ZVdpZHRoOwotICAgIH0gIAotICAgIHJldHVybiBuZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICB9Ci0gIAotICAKLSAgCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIGNvbnRhaW5lciwgaW50IHdIaW50LCBpbnQgaEhpbnQpCi0gIHsgICAgCi0gICAgTGlzdCBjaGlsZHJlbiA9IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpOwotICAgIERpbWVuc2lvbiBwcmVmU2l6ZSA9IGNhbGN1bGF0ZUNoaWxkcmVuU2l6ZShjb250YWluZXIsIGNoaWxkcmVuLCB3SGludCwgaEhpbnQsIHRydWUpOwotICAgIHJldHVybiBwcmVmU2l6ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIHBhcmVudCkKLSAgewotICAgIC8vIGxheW91dCBhIHRhYmxlIHdpdGggdGhlIGNvbHVtbnMgYWxpZ25lZCAgICAgIAotICAgIC8vSVJvd0ZpZ3VyZSByb3dGaWd1cmUgPSAoSVJvd0ZpZ3VyZSlwYXJlbnQ7ICAgIAotICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsgICAKLSAgICBMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gICAgUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKCk7Ci0gICAgci54ID0gY2xpZW50QXJlYS54OwotICAgIHIueSA9IGNsaWVudEFyZWEueTsKLSAgICByLmhlaWdodCA9IGNsaWVudEFyZWEuaGVpZ2h0OwotICAgIAotICAgIGludCBjaGlsZHJlblNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgUmVjdGFuZ2xlW10gYm91bmRzID0gbmV3IFJlY3RhbmdsZVtjaGlsZHJlblNpemVdOwotICAgIAotICAgIC8vIGZvciBlYWNoIGNlbGwgaW4gdGhlIHJvdwotICAgIC8vCi0gICAgaW50IHJlcXVpcmVkV2lkdGggPSAwOwotICAgIGludCB0b3RhbENvbHVtbldlaWdodCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblNpemU7IGkrKykKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpIGNoaWxkcmVuLmdldChpKTsKLSAgICAgIC8vU3RyaW5nIGNvbHVtbklkZW5pZmllciA9IGZpZ3VyZS5nZXRDb2x1bW5JZGVudGlmaWVyKGNoaWxkKTsgICAgICAgICAgICAgCi0gICAgICAvLyBmaXJzdCB3ZSBjb21wdXRlIHRoZSBjaGlsZCBzaXplIHdpdGhvdXQgcmVnYXJkIGZvciBjb2x1bW5EYXRhCi0gICAgICAvLwotICAgICAgRGltZW5zaW9uIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoLTEsIC0xKTsKLSAgICAgIAotICAgICAgaW50IGNvbHVtbldpZHRoID0gLTE7Ci0gICAgICAvL1N0cmluZyBjb2x1bW5JZGVudGlmaWVyID0gcm93RmlndXJlLmdldENvbHVtbklkZW50aWZpZXIoY2hpbGQpOwotICAgICAgU3RyaW5nIGNvbHVtbklkZW50aWZpZXIgPSAoU3RyaW5nKWdldENvbnN0cmFpbnQoY2hpbGQpOwotICAgICAgaWYgKGNvbHVtbklkZW50aWZpZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9jb2x1bW5EYXRhLnN0cmV0Y2hDb2x1bW5XaWR0aElmTmVlZGVkKGNvbHVtbklkZW50aWZpZXIsIGNoaWxkU2l6ZS53aWR0aCk7ICAgICAgICAKLSAgICAgICAgY29sdW1uV2lkdGggPSBjb2x1bW5EYXRhLmdldENvbHVtbldpZHRoKGNvbHVtbklkZW50aWZpZXIpOwotICAgICAgICB0b3RhbENvbHVtbldlaWdodCArPSBjb2x1bW5EYXRhLmdldENvbHVtbldlaWdodChjb2x1bW5JZGVudGlmaWVyKTsKLSAgICAgIH0gIAotICAgICAgci53aWR0aCA9IE1hdGgubWF4KGNoaWxkU2l6ZS53aWR0aCwgY29sdW1uV2lkdGgpOwotICAgICAgcmVxdWlyZWRXaWR0aCArPSByLndpZHRoOwotICAgICAgYm91bmRzW2ldID0gbmV3IFJlY3RhbmdsZShyKTsgICAgICAKLSAgICAgIHIueCArPSByLndpZHRoOwotICAgIH0gICAgICAgICAgCi0gICAgaWYgKHRvdGFsQ29sdW1uV2VpZ2h0IDwgMSkKLSAgICB7Ci0gICAgICB0b3RhbENvbHVtbldlaWdodCA9IDE7Ci0gICAgfQotICAgIGludCBleHRyYVdpZHRoID0gTWF0aC5tYXgoY2xpZW50QXJlYS53aWR0aCAtIHJlcXVpcmVkV2lkdGgsIDApOyAgICAKLSAgICBpbnQgZXh0cmFXaWR0aEFsbG9jYXRlZCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblNpemU7IGkrKykKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpIGNoaWxkcmVuLmdldChpKTsgICAgICAKLSAgICAgIFJlY3RhbmdsZSBiID0gYm91bmRzW2ldOyAgICAKLSAgICAgIGlmIChleHRyYVdpZHRoID4gMCkKLSAgICAgIHsgIAotICAgICAgICBTdHJpbmcgY29sdW1uSWRlbnRpZmllciA9IChTdHJpbmcpZ2V0Q29uc3RyYWludChjaGlsZCk7Ci0gICAgICAgIGlmIChjb2x1bW5JZGVudGlmaWVyICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgIAotICAgICAgICAgIGludCB3ZWlnaHQgPSBjb2x1bW5EYXRhLmdldENvbHVtbldlaWdodChjb2x1bW5JZGVudGlmaWVyKTsKLSAgICAgICAgICBmbG9hdCBmcmFjdGlvbiA9IChmbG9hdCl3ZWlnaHQgLyAoZmxvYXQpdG90YWxDb2x1bW5XZWlnaHQ7Ci0gICAgICAgICAgaW50IGV4dHJhV2lkdGhGb3JDaGlsZCA9IChpbnQpKGV4dHJhV2lkdGggKiBmcmFjdGlvbik7Ci0gICAgICAgCi0gICAgICAgICAgYi53aWR0aCArPSBleHRyYVdpZHRoRm9yQ2hpbGQ7ICAgICAgICAKLSAgICAgICAgICBiLnggKz0gZXh0cmFXaWR0aEFsbG9jYXRlZDsKLSAgICAgICAgICBleHRyYVdpZHRoQWxsb2NhdGVkICs9IGV4dHJhV2lkdGhGb3JDaGlsZDsKLSAgICAgICAgfSAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGIueCArPSBleHRyYVdpZHRoQWxsb2NhdGVkOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjaGlsZC5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZShiKSk7ICAKLSAgICB9ICAKLSAgfQotCi0gIHB1YmxpYyBDb2x1bW5EYXRhIGdldENvbHVtbkRhdGEoKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbkRhdGE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5EYXRhKENvbHVtbkRhdGEgY29sdW1uRGF0YSkKLSAgewotICAgIHRoaXMuY29sdW1uRGF0YSA9IGNvbHVtbkRhdGE7Ci0gIH0gICAgCi0gIAotICBwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnQoSUZpZ3VyZSBjaGlsZCkKLSAgewotICAgIHJldHVybiBmaWd1cmVUb0NvbnRzdHJhaW50TWFwLmdldChjaGlsZCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbnN0cmFpbnQoSUZpZ3VyZSBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpCi0gIHsKLSAgICBmaWd1cmVUb0NvbnRzdHJhaW50TWFwLnB1dChjaGlsZCwgY29uc3RyYWludCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKQotICB7Ci0gICAgLy9maWd1cmVUb0NvbnRzdHJhaW50TWFwLmNsZWFyKCk7Ci0gICAgLy90aGlzLmNvbHVtbkRhdGEuY2xlYXJDb2x1bW5XaWR0aHMoKTsKLSAgICBzdXBlci5pbnZhbGlkYXRlKCk7Ci0gICAKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWYzYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvQ3JlYXRlRWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkFic3RyYWN0RWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8vIGlzc3VlIChjcykgY2FuIHdlIHJlbW92ZSB0aGlzPwotLy8KLXB1YmxpYyBjbGFzcyBDcmVhdGVFbGVtZW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0gIHByb3RlY3RlZCBFbGVtZW50IHBhcmVudE5vZGU7Ci0KLSAgcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0KLSAgcHJvdGVjdGVkIE9iamVjdCBzb3VyY2VDb250ZXh0OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlRWxlbWVudEFjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBDcmVhdGVFbGVtZW50QWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVFbGVtZW50QWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKi8KLSAgcHVibGljIENyZWF0ZUVsZW1lbnRBY3Rpb24oU3RyaW5nIHRleHQpCi0gIHsKLSAgICBzdXBlcih0ZXh0KTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZUVsZW1lbnRBY3Rpb24uCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqIEBwYXJhbSBpbWFnZQotICAgKi8KLSAgcHVibGljIENyZWF0ZUVsZW1lbnRBY3Rpb24oU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkKLSAgewotICAgIHN1cGVyKHRleHQsIGltYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFhTRFNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMuc2VsZWN0aW9uUHJvdmlkZXIgPSBzZWxlY3Rpb25Qcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNvdXJjZUNvbnRleHQoT2JqZWN0IHNvdXJjZUNvbnRleHQpCi0gIHsKLSAgICB0aGlzLnNvdXJjZUNvbnRleHQgPSBzb3VyY2VDb250ZXh0OwotICB9Ci0gIAotICAvKioKLSAgICogR2V0cyB0aGUgcGFyZW50Tm9kZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgRWxlbWVudAotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0UGFyZW50Tm9kZSgpCi0gIHsKLSAgICByZXR1cm4gcGFyZW50Tm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBwYXJlbnROb2RlLgotICAgKiBAcGFyYW0gcGFyZW50Tm9kZSBUaGUgcGFyZW50Tm9kZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBhcmVudE5vZGUoRWxlbWVudCBwYXJlbnROb2RlKQotICB7Ci0gICAgdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLSAgfQotCi0gIGJvb2xlYW4gaXNHbG9iYWwgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldElzR2xvYmFsKGJvb2xlYW4gaXNHbG9iYWwpCi0gIHsKLSAgICB0aGlzLmlzR2xvYmFsID0gaXNHbG9iYWw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldElzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBpc0dsb2JhbDsKLSAgfQotCi0gIHByb3RlY3RlZCBOb2RlIHJlbGF0aXZlTm9kZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50VGFnOwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50VGFnKFN0cmluZyBlbGVtZW50VGFnKQotICB7Ci0gICAgdGhpcy5lbGVtZW50VGFnID0gZWxlbWVudFRhZzsKLSAgfQotICAKLSAgcHVibGljIERvY3VtZW50SW1wbCBnZXREb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gKERvY3VtZW50SW1wbCkgZ2V0UGFyZW50Tm9kZSgpLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICBnZXREb2N1bWVudCgpLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZGVzY3JpcHRpb24pOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoKQotICB7Ci0gICAgRG9jdW1lbnRJbXBsIGRvYyA9IGdldERvY3VtZW50KCk7Ci0gICAgCi0gICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOyAgICAKLSAgfQotICAKLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlQW5kQWRkTmV3Q2hpbGRFbGVtZW50KCkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBwYXJlbnROb2RlLmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBFbGVtZW50IGNoaWxkTm9kZSA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgcHJlZml4ICsgZWxlbWVudFRhZyk7Ci0gICAgaWYgKGdldEF0dHJpYnV0ZXMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRE9NQXR0cmlidXRlIGF0dHIgPSAoRE9NQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgY2hpbGROb2RlLnNldEF0dHJpYnV0ZShhdHRyLmdldE5hbWUoKSwgYXR0ci5nZXRWYWx1ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGdldFJlbGF0aXZlTm9kZSgpID09IG51bGwpCi0gICAgewotICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2RlLGdldFJlbGF0aXZlTm9kZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGlzR2xvYmFsICYmIGdldFJlbGF0aXZlTm9kZSgpID09IG51bGwpCi0gICAgewotICAgICAgVGV4dCB0ZXh0Tm9kZSA9IGdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlzR2xvYmFsICYmIGdldFJlbGF0aXZlTm9kZSgpICE9IG51bGwpCi0gICAgewotICAgICAgVGV4dCB0ZXh0Tm9kZSA9IGdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGV4dE5vZGUsIGdldFJlbGF0aXZlTm9kZSgpKTsKLSAgICB9Ci0KLSAgICBmb3JtYXRDaGlsZChjaGlsZE5vZGUpOwotICAgIAotICAgIHJldHVybiBjaGlsZE5vZGU7Ci0gIH0gICAgCi0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGZvcm1hdENoaWxkKEVsZW1lbnQgY2hpbGQpCi0gIHsKLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKWNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgICAgICAKLQkgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCSAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qCi0gICAqIEBzZWUgSUFjdGlvbiNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGJlZ2luUmVjb3JkaW5nKGdldERlc2NyaXB0aW9uKCkpOwotICAgIGZpbmFsIEVsZW1lbnQgY2hpbGQgPSBjcmVhdGVBbmRBZGROZXdDaGlsZEVsZW1lbnQoKTsKLSAgICBlbmRSZWNvcmRpbmcoKTsKLQotICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGZpbmFsIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChjaGlsZCk7Ci0vLyAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wKSk7Ci0gICAgICAKLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGlmICgoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKWNvbXApLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wLmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcC5nZXRDb250YWluZXIoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY29tcC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjaGlsZCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcC5nZXRDb250YWluZXIoKSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChzb3VyY2VDb250ZXh0IGluc3RhbmNlb2YgQWJzdHJhY3RFZGl0UGFydFZpZXdlcikKLSAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gKEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpc291cmNlQ29udGV4dDsKLSAgICAgICAgICAKLS8vICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHZpZXdlci5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLSAgICAgICAgICAgIAotLy8gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW0gPSAoKEVsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0KW9iaikuZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIWVsZW0uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLS8vICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgKChFbGVtZW50RGVjbGFyYXRpb25FZGl0UGFydClvYmopLmRvRWRpdE5hbWUoKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydCkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBncm91cCA9ICgoTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydClvYmopLmdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIWdyb3VwLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLS8vICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgKChNb2RlbEdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KW9iaikuZG9FZGl0TmFtZSgpOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb21wbGV4VHlwZURlZmluaXRpb25FZGl0UGFydCkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoKENvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0KW9iaikuZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0vLyAgICAgICAgICAgICAgICBpZiAoY3QuZ2V0TmFtZSgpICE9IG51bGwpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICgoQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQpb2JqKS5kb0VkaXROYW1lKCk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgKChUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KW9iaikuZG9FZGl0TmFtZSgpOwotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAscnVubmFibGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSByZWxhdGl2ZU5vZGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBOb2RlIGdldFJlbGF0aXZlTm9kZSgpCi0gIHsKLSAgICByZXR1cm4gcmVsYXRpdmVOb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlbGF0aXZlTm9kZS4KLSAgICogQHBhcmFtIHJlbGF0aXZlTm9kZSBUaGUgcmVsYXRpdmVOb2RlIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVsYXRpdmVOb2RlKE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0gICAgdGhpcy5yZWxhdGl2ZU5vZGUgPSByZWxhdGl2ZU5vZGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZGVzY3JpcHRpb24uCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0VGV4dCgpOwotICAgIH0KLSAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBhdHRyaWJ1dGVzOwotICAvKioKLSAgICogR2V0cyB0aGUgbmFtZUF0dHJpYnV0ZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVzKCkKLSAgewotICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGF0dHJpYnV0ZXMuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVzIFRoZSBhdHRyaWJ1dGVzIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhMaXN0IGF0dHJpYnV0ZXMpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0RPTUF0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9ET01BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0ZjM1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0RPTUF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLS8vIGlzc3VlIChjcykgcmVtb3ZlIHRoaXMKLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgRE9NQXR0cmlidXRlCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgRE9NQXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIERPTUF0dHJpYnV0ZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIERPTUF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBET01BdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSwgdmFsdWU7Ci0gIC8qKgotICAgKiBHZXRzIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgewotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZS4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuYW1lLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBuYW1lLgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvSVhTRFRvb2xiYXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvSVhTRFRvb2xiYXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxOTlmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0lYU0RUb29sYmFyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTRFRvb2xiYXJBY3Rpb24gZXh0ZW5kcyBJQWN0aW9uCi17Ci0gIHB1YmxpYyB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RBdHRyaWJ1dGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZVhTREF0dHJpYnV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjlhMmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZVhTREF0dHJpYnV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24gZXh0ZW5kcyBNb3ZlWFNEQmFzZUFjdGlvbgotewotICBwcml2YXRlIHN0YXRpYyBpbnQgSU5TRVJUX0JFRk9SRSA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGludCBJTlNFUlRfQUZURVIgPSAxOwotICBwcml2YXRlIHN0YXRpYyBpbnQgSU5TRVJUX0RJUkVDVCA9IDI7Ci0gIHByb3RlY3RlZCBMaXN0IHNlbGVjdGVkTm9kZXM7Ci0gIHByb3RlY3RlZCBOb2RlIHBhcmVudE5vZGU7Ci0gIHByb3RlY3RlZCBOb2RlIHByZXZpb3VzUmVmQ2hpbGQsIG5leHRSZWZDaGlsZDsKLSAgaW50IGluc2VydFR5cGU7Ci0KLSAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50Q29tcG9uZW50OwotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZCwgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQ7Ci0gIGJvb2xlYW4gaW5zZXJ0QXRFbmQgPSB0cnVlOwotICAKLSAgcHVibGljIE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24oWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50Q29tcG9uZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZCwgWFNEQ29uY3JldGVDb21wb25lbnQgcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgbmV4dFJlZkNoaWxkQ29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLnBhcmVudENvbXBvbmVudCA9IHBhcmVudENvbXBvbmVudDsKLSAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7Ci0gICAgdGhpcy5wcmV2aW91c1JlZkNvbXBvbmVudCA9IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQ7Ci0gICAgdGhpcy5uZXh0UmVmQ29tcG9uZW50ID0gbmV4dFJlZkNoaWxkQ29tcG9uZW50OwotCi0gICAgaWYgKHBhcmVudENvbXBvbmVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIHBhcmVudE5vZGUgPSBwYXJlbnRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgIG5leHRSZWZDaGlsZCA9IG5leHRSZWZDaGlsZENvbXBvbmVudCAhPSBudWxsID8gbmV4dFJlZkNoaWxkQ29tcG9uZW50LmdldEVsZW1lbnQoKSA6IG51bGw7Ci0gICAgcHJldmlvdXNSZWZDaGlsZCA9IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQgIT0gbnVsbCA/IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQuZ2V0RWxlbWVudCgpIDogbnVsbDsKLQotICAgIGlmIChuZXh0UmVmQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKG5leHRSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCkgPT0gcGFyZW50Q29tcG9uZW50KQotICAgICAgewotICAgICAgICBpbnNlcnRUeXBlID0gSU5TRVJUX0JFRk9SRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHByZXZpb3VzUmVmQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHByZXZpb3VzUmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpID09IHBhcmVudENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgaW5zZXJ0VHlwZSA9IElOU0VSVF9BRlRFUjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5leHRSZWZDaGlsZENvbXBvbmVudCA9PSBudWxsICYmIHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnNlcnRUeXBlID0gSU5TRVJUX0RJUkVDVDsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudENvbXBvbmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IG5leHRSZWZDaGlsZENvbXBvbmVudCwgYm9vbGVhbiBpbnNlcnRBdEVuZCkKLSAgewotICAgIHRoaXMocGFyZW50Q29tcG9uZW50LCBzZWxlY3RlZCwgcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCwgbmV4dFJlZkNoaWxkQ29tcG9uZW50KTsKLSAgICB0aGlzLmluc2VydEF0RW5kID0gaW5zZXJ0QXRFbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNhbk1vdmUoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgCi0gICAgaWYgKG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgcHJldmlvdXNSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgcGFyZW50Q29tcG9uZW50ID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBJQWN0aW9uI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaWYgKHBhcmVudENvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBtb3ZlVW5kZXJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50Q29tcG9uZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50Q29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG1vdmVVbmRlclhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnRDb21wb25lbnQpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIG1vdmVVbmRlclhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gcGFyZW50R3JvdXApCi0gIHsKLSAgICBpbnQgb3JpZ2luYWxJbmRleCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0cmlidXRlR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKGF0dHJpYnV0ZUdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlID0gKChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJpYnV0ZUdyb3VwQ29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAoYXR0cmlidXRlID09IHNlbGVjdGVkKQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKS5yZW1vdmUoYXR0cmlidXRlLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgb3JpZ2luYWxJbmRleCsrOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGJvb2xlYW4gYWRkZWRCYWNrID0gZmFsc2U7Ci0gICAgaWYgKGluc2VydFR5cGUgPT0gSU5TRVJUX0RJUkVDVCkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb250YWluZXIgPSBzZWxlY3RlZC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGluc2VydEF0RW5kKQotICAgICAgICAgICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnRDb21wb25lbnQpLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGVudHMoKS5hZGQoY29udGFpbmVyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnRDb21wb25lbnQpLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGVudHMoKS5hZGQoMCwgY29udGFpbmVyKTsKLSAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMaXN0IGF0dHJpYnV0ZUdyb3VwQ29udGVudHMgPSBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhdHRyaWJ1dGVHcm91cENvbnRlbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJpYnV0ZUdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChhdHRyaWJ1dGVHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9ICgoWFNEQXR0cmlidXRlVXNlKSBhdHRyaWJ1dGVHcm91cENvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICAgICAgaWYgKGluc2VydFR5cGUgPT0gSU5TRVJUX0JFRk9SRSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbmV4dFJlZkNvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLmFkZChpbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc2VsZWN0ZWQgPT0gbmV4dFJlZkNvbXBvbmVudCAmJiBvcmlnaW5hbEluZGV4ID09IGluZGV4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGluc2VydFR5cGUgPT0gSU5TRVJUX0FGVEVSKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBwcmV2aW91c1JlZkNvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLmFkZChpbmRleCArIDEsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNlbGVjdGVkID09IHByZXZpb3VzUmVmQ29tcG9uZW50ICYmIG9yaWdpbmFsSW5kZXggPT0gaW5kZXgpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGV4Kys7Ci0gICAgfQotICAgIGlmIChhdHRyaWJ1dGVHcm91cENvbnRlbnRzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFhZGRlZEJhY2spCi0gICAgewotICAgICAgcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKS5hZGQob3JpZ2luYWxJbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIG1vdmVVbmRlclhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUpCi0gIHsKLSAgICBpbnQgb3JpZ2luYWxJbmRleCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0cmlidXRlR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKGF0dHJpYnV0ZUdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlID0gKChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJpYnV0ZUdyb3VwQ29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAoYXR0cmlidXRlID09IHNlbGVjdGVkKQotICAgICAgICB7Ci0gICAgICAgICAgY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5yZW1vdmUoYXR0cmlidXRlLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgb3JpZ2luYWxJbmRleCsrOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGJvb2xlYW4gYWRkZWRCYWNrID0gZmFsc2U7Ci0gICAgTGlzdCBhdHRyaWJ1dGVHcm91cENvbnRlbnRzID0gY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXR0cmlidXRlR3JvdXBDb250ZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyaWJ1dGVHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAoYXR0cmlidXRlR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSAoKFhTREF0dHJpYnV0ZVVzZSkgYXR0cmlidXRlR3JvdXBDb250ZW50KS5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9BRlRFUikKLSAgICAgICAgewotICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gcHJldmlvdXNSZWZDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQoaW5kZXggKyAxLCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGluc2VydFR5cGUgPT0gSU5TRVJUX0JFRk9SRSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbmV4dFJlZkNvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmFkZChpbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZXgrKzsKLSAgICB9Ci0gICAgaWYgKGF0dHJpYnV0ZUdyb3VwQ29udGVudHMuc2l6ZSgpID09IDApCi0gICAgewotICAgICAgY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQoc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWFkZGVkQmFjaykKLSAgICB7Ci0gICAgICBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmFkZChvcmlnaW5hbEluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZVhTREJhc2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZVhTREJhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkOTkwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RCYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBNb3ZlWFNEQmFzZUFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotCi0gIHB1YmxpYyBNb3ZlWFNEQmFzZUFjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuTW92ZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RFbGVtZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNzNmZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNERWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgTW92ZVhTREVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBNb3ZlWFNEQmFzZUFjdGlvbgotewotICBwcml2YXRlIHN0YXRpYyBpbnQgSU5TRVJUX0JFRk9SRSA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGludCBJTlNFUlRfQUZURVIgPSAxOwotICBwcml2YXRlIHN0YXRpYyBpbnQgSU5TRVJUX0RJUkVDVCA9IDI7Ci0gIHByb3RlY3RlZCBMaXN0IHNlbGVjdGVkTm9kZXM7Ci0gIHByb3RlY3RlZCBOb2RlIHBhcmVudE5vZGU7Ci0gIHByb3RlY3RlZCBOb2RlIHByZXZpb3VzUmVmQ2hpbGQsIG5leHRSZWZDaGlsZDsKLSAgaW50IGluc2VydFR5cGU7Ci0KLSAgWFNETW9kZWxHcm91cCBwYXJlbnRNb2RlbEdyb3VwOwotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZCwgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQ7Ci0gIGJvb2xlYW4gaW5zZXJ0QXRFbmQgPSB0cnVlOwotCi0gIHB1YmxpYyBNb3ZlWFNERWxlbWVudEFjdGlvbihYU0RNb2RlbEdyb3VwIHBhcmVudENvbXBvbmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IG5leHRSZWZDaGlsZENvbXBvbmVudCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5wYXJlbnRNb2RlbEdyb3VwID0gcGFyZW50Q29tcG9uZW50OwotICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKLSAgICB0aGlzLnByZXZpb3VzUmVmQ29tcG9uZW50ID0gcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudDsKLSAgICB0aGlzLm5leHRSZWZDb21wb25lbnQgPSBuZXh0UmVmQ2hpbGRDb21wb25lbnQ7Ci0KLSAgICBpZiAocGFyZW50Q29tcG9uZW50ID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgcGFyZW50Tm9kZSA9IHBhcmVudENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgbmV4dFJlZkNoaWxkID0gbmV4dFJlZkNoaWxkQ29tcG9uZW50ICE9IG51bGwgPyBuZXh0UmVmQ2hpbGRDb21wb25lbnQuZ2V0RWxlbWVudCgpIDogbnVsbDsKLSAgICBwcmV2aW91c1JlZkNoaWxkID0gcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCAhPSBudWxsID8gcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudC5nZXRFbGVtZW50KCkgOiBudWxsOwotCi0gICAgaWYgKG5leHRSZWZDb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAobmV4dFJlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSA9PSBwYXJlbnRNb2RlbEdyb3VwKQotICAgICAgewotICAgICAgICBpbnNlcnRUeXBlID0gSU5TRVJUX0JFRk9SRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHByZXZpb3VzUmVmQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHByZXZpb3VzUmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpID09IHBhcmVudE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIGluc2VydFR5cGUgPSBJTlNFUlRfQUZURVI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChuZXh0UmVmQ2hpbGRDb21wb25lbnQgPT0gbnVsbCAmJiBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgaW5zZXJ0VHlwZSA9IElOU0VSVF9ESVJFQ1Q7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIE1vdmVYU0RFbGVtZW50QWN0aW9uKFhTRE1vZGVsR3JvdXAgcGFyZW50Q29tcG9uZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZCwgWFNEQ29uY3JldGVDb21wb25lbnQgcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgbmV4dFJlZkNoaWxkQ29tcG9uZW50LCBib29sZWFuIGluc2VydEF0RW5kKQotICB7Ci0gICAgdGhpcyhwYXJlbnRDb21wb25lbnQsIHNlbGVjdGVkLCBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LCBuZXh0UmVmQ2hpbGRDb21wb25lbnQpOwotICAgIHRoaXMuaW5zZXJ0QXRFbmQgPSBpbnNlcnRBdEVuZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gY2FuTW92ZSgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAKLSAgICBpZiAobmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHx8IHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gfHwgcGFyZW50TW9kZWxHcm91cCA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSUFjdGlvbiNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGludCBvcmlnaW5hbEluZGV4ID0gMDsKLSAgICBmb3IgKEl0ZXJhdG9yIHBhcnRpY2xlcyA9IHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBwYXJ0aWNsZXMuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgcGFydGljbGVzLm5leHQoKTsKLSAgICAgIFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQgPSBwYXJ0aWNsZS5nZXRDb250ZW50KCk7Ci0gICAgICBpZiAocGFydGljbGVDb250ZW50ID09IHNlbGVjdGVkKQotICAgICAgewotICAgICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKHBhcnRpY2xlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBvcmlnaW5hbEluZGV4Kys7Ci0gICAgfQotICAgIGludCBpbmRleCA9IDA7Ci0gICAgYm9vbGVhbiBhZGRlZEJhY2sgPSBmYWxzZTsKLSAgICBpZiAoaW5zZXJ0VHlwZSA9PSBJTlNFUlRfRElSRUNUKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbnRhaW5lciA9IHNlbGVjdGVkLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb250YWluZXIyID0gY29udGFpbmVyLmdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAoY29udGFpbmVyMiBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgIHsKLSAgICAgICAgICAoKFhTRE1vZGVsR3JvdXApIGNvbnRhaW5lcjIpLmdldENvbnRlbnRzKCkucmVtb3ZlKGNvbnRhaW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluc2VydEF0RW5kKQotICAgICAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoY29udGFpbmVyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoMCwgY29udGFpbmVyKTsKLSAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMaXN0IHBhcnRpY2xlcyA9IHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFydGljbGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQgPSBwYXJ0aWNsZS5nZXRDb250ZW50KCk7Ci0gICAgICBpZiAoaW5zZXJ0VHlwZSA9PSBJTlNFUlRfQkVGT1JFKQotICAgICAgewotICAgICAgICBpZiAocGFydGljbGVDb250ZW50ID09IG5leHRSZWZDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0ZWQgPT0gbmV4dFJlZkNvbXBvbmVudCAmJiBvcmlnaW5hbEluZGV4ID09IGluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChpbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGluc2VydFR5cGUgPT0gSU5TRVJUX0FGVEVSKQotICAgICAgewotICAgICAgICBpZiAocGFydGljbGVDb250ZW50ID09IHByZXZpb3VzUmVmQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChpbmRleCArIDEsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RlZCA9PSBwcmV2aW91c1JlZkNvbXBvbmVudCAmJiBvcmlnaW5hbEluZGV4ID09IGluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChpbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGV4Kys7Ci0gICAgfQotICAgIGlmIChwYXJ0aWNsZXMuc2l6ZSgpID09IDApCi0gICAgewotICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICghYWRkZWRCYWNrKQotICAgIHsKLSAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQob3JpZ2luYWxJbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9YU0RFZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9YU0RFZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWZmMmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvWFNERWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlJlcGxhY2VQcmVmaXhBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQuU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLm5zZWRpdC5UYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0cy5YU0RFZGl0U2NoZW1hSW5mb0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhTREVkaXROYW1lc3BhY2VzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uOwotCXByaXZhdGUgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgICBwcml2YXRlIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyIG5hbWVzcGFjZUluZm9NYW5hZ2VyID0gbmV3IERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCk7Ci0JCi0JcHVibGljIFhTREVkaXROYW1lc3BhY2VzQWN0aW9uKFN0cmluZyBsYWJlbCwgRWxlbWVudCBlbGVtZW50LCBOb2RlIG5vZGUpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGV4dChsYWJlbCk7Ci0JCQotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8gVGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkLi4uLgotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSAiZHVtbXkiOwkJCi0JfQotCQotCXB1YmxpYyBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbihTdHJpbmcgbGFiZWwsIEVsZW1lbnQgZWxlbWVudCwgTm9kZSBub2RlLCBYU0RTY2hlbWEgc2NoZW1hKSB7Ci0JCXRoaXMgKGxhYmVsLCBlbGVtZW50LCBub2RlKTsKLQkJeHNkU2NoZW1hID0gc2NoZW1hOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpCi0JCXsgICAKLQkJICAgICAgU2hlbGwgc2hlbGwgPSBYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQkgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsKLQkJICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKSB7Ci0JCSAgICAgIAl0YXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCSAgICAgIH0KLQkJICAgICAgWFNERWRpdFNjaGVtYUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IFhTREVkaXRTY2hlbWFJbmZvRGlhbG9nKHNoZWxsLCBuZXcgUGF0aChyZXNvdXJjZUxvY2F0aW9uKSwgdGFyZ2V0TmFtZXNwYWNlKTsgCi0KLQkJICAgICAgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUluZm9NYW5hZ2VyLmdldE5hbWVzcGFjZUluZm9MaXN0KGVsZW1lbnQpOwotCQkgICAgICBMaXN0IG9sZE5hbWVzcGFjZUluZm9MaXN0ID0gTmFtZXNwYWNlSW5mby5jbG9uZU5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQkgICAgICAvLyBoZXJlIHdlIHN0b3JlIGEgY29weSBvZiB0aGUgb2xkIGluZm8gZm9yIGVhY2ggTmFtZXNwYWNlSW5mbwotCQkgICAgICAvLyB0aGlzIGluZm8gd2lsbCBiZSB1c2VkIGluIGNyZWF0ZVByZWZpeE1hcHBpbmcoKSB0byBmaWd1cmUgb3V0IGhvdyB0byB1cGRhdGUgdGhlIGRvY3VtZW50IAotCQkgICAgICAvLyBpbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2VzCi0JCSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCSAgICAgIHsKLQkJICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLQkJICAgICAgICBOYW1lc3BhY2VJbmZvIG9sZENvcHkgPSBuZXcgTmFtZXNwYWNlSW5mbyhpbmZvKTsKLQkJICAgICAgICBpbmZvLnNldFByb3BlcnR5KCJvbGRDb3B5Iiwgb2xkQ29weSk7IC8vJE5PTi1OTFMtMSQKLQkJICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyBjdXJyZW50RWxlbWVudEZvcm1RdWFsaWZpZWQgPSAiIjsKLSAgICAgICAgICBTdHJpbmcgY3VycmVudEF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQgPSAiIjsKLSAgICAgICAgICAKLSAgICAgICAgICBib29sZWFuIGhhc0VsZW1lbnRGb3JtID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkVMRU1FTlRGT1JNREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgIGlmIChoYXNFbGVtZW50Rm9ybSkgY3VycmVudEVsZW1lbnRGb3JtUXVhbGlmaWVkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkVMRU1FTlRGT1JNREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgIAotICAgICAgICAgIGJvb2xlYW4gaGFzQXR0cmlidXRlRm9ybSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5BVFRSSUJVVEVGT1JNREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGVGb3JtKSBjdXJyZW50QXR0cmlidXRlRm9ybVF1YWxpZmllZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5BVFRSSUJVVEVGT1JNREVGQVVMVF9BVFRSSUJVVEUpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJICAgICAgZGlhbG9nLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsgICAKLQkJICAgICAgZGlhbG9nLmNyZWF0ZSgpOyAgICAgIAotCQkgICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDUwMCwgNDAwKTsKLQkJICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9NRU5VX0VESVRfU0NIRU1BX0lORk9STUFUSU9OX1RJVExFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgZGlhbG9nLnNldElzRWxlbWVudFF1YWxpZmllZChjdXJyZW50RWxlbWVudEZvcm1RdWFsaWZpZWQpOwotICAgICAgICAgIGRpYWxvZy5zZXRJc0F0dHJpYnV0ZVF1YWxpZmllZChjdXJyZW50QXR0cmlidXRlRm9ybVF1YWxpZmllZCk7Ci0JCSAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJICAgICAgZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICBTdHJpbmcgeHNkUHJlZml4ID0gIiI7ICAgICAvLyROT04tTkxTLTEkCi0KLQkJICAgICAgaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKQotCQkgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IHhzZFNjaGVtYUVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIHhzZFNjaGVtYUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBMaXN0IG5ld0luZm9MaXN0ID0gZGlhbG9nLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0KLQkJICAgICAgICAvLyBzZWUgaWYgd2UgbmVlZCB0byByZW5hbWUgYW55IHByZWZpeGVzCi0JCSAgICAgICAgTWFwIHByZWZpeE1hcHBpbmcgPSBjcmVhdGVQcmVmaXhNYXBwaW5nKG9sZE5hbWVzcGFjZUluZm9MaXN0LCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1hcCBtYXAyID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbmV3SW5mb0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTmFtZXNwYWNlSW5mbyBuaSA9IChOYW1lc3BhY2VJbmZvKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICBTdHJpbmcgcHJlZiA9IG5pLnByZWZpeDsKLSAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5pLnVyaTsKLSAgICAgICAgICAgICAgaWYgKHByZWYgPT0gbnVsbCkgcHJlZiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgdXJpID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgaWYgKFhTRENvbnN0YW50cy5pc1NjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSh1cmkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkUHJlZml4ID0gcHJlZjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtYXAyLnB1dChwcmVmLCB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAKLQkJICAgICAgICBpZiAobWFwMi5zaXplKCkgPiAwKQotCQkgICAgICAgIHsKLQkJICAgICAgICAJdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTkFNRVNQQUNFX0NIQU5HRSIpKTsKLQotICAgICAgICAgICAgICAgIGlmICh4c2RQcmVmaXggIT0gbnVsbCAmJiB4c2RQcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0VGFyZ2V0TmFtZXNwYWNlKGRpYWxvZy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNjaGVtYVByZWZpeENoYW5nZUhhbmRsZXIgc3BjaCA9IG5ldyBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyKHhzZFNjaGVtYSwgeHNkUHJlZml4KTsKLSAgICAgICAgICAgICAgICBzcGNoLnJlc29sdmUoKTsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEudXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnNldEluY3JlbWVudGFsVXBkYXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VJbmZvTWFuYWdlci5yZW1vdmVOYW1lc3BhY2VJbmZvKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUluZm9NYW5hZ2VyLmFkZE5hbWVzcGFjZUluZm8oZWxlbWVudCwgbmV3SW5mb0xpc3QsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0SW5jcmVtZW50YWxVcGRhdGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBkb24ndCBuZWVkIHRoZXNlIGFueSBtb3JlPwotCQkJICAgICAgICAgIFJlcGxhY2VQcmVmaXhBY3Rpb24gcmVwbGFjZVByZWZpeEFjdGlvbiA9IG5ldyBSZXBsYWNlUHJlZml4QWN0aW9uKG51bGwsIGVsZW1lbnQsIHByZWZpeE1hcHBpbmcpOwotCQkJICAgICAgICAgIHJlcGxhY2VQcmVmaXhBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciB0YXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIoeHNkU2NoZW1hLCB0YXJnZXROYW1lc3BhY2UsIGRpYWxvZy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5yZXNvbHZlKCk7Ci0JCQkJICAgIAl9Ci0gICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgeyAKLS8vICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCSAgICAgCQl9Ci0JCSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlRm9ybVF1YWxpZmllZCA9IGRpYWxvZy5nZXRBdHRyaWJ1dGVGb3JtUXVhbGlmaWVkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudEZvcm1RdWFsaWZpZWQgPSBkaWFsb2cuZ2V0RWxlbWVudEZvcm1RdWFsaWZpZWQoKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBlbGVtZW50Rm9ybUNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgYm9vbGVhbiBhdHRyaWJ1dGVGb3JtQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudEZvcm1RdWFsaWZpZWQuZXF1YWxzKGN1cnJlbnRFbGVtZW50Rm9ybVF1YWxpZmllZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVsZW1lbnRGb3JtQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQuZXF1YWxzKGN1cnJlbnRBdHRyaWJ1dGVGb3JtUXVhbGlmaWVkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXR0cmlidXRlRm9ybUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50Rm9ybUNoYW5nZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9TQ0hFTUFfRUxFTUVOVEZPUk1ERUZBVUxUX0NIQU5HRSIpKTsKLSAgICAgICAgICAgICAgaWYgKGVsZW1lbnRGb3JtUXVhbGlmaWVkLmVxdWFscyhYU0RGb3JtLlFVQUxJRklFRF9MSVRFUkFMLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0RWxlbWVudEZvcm1EZWZhdWx0KFhTREZvcm0uUVVBTElGSUVEX0xJVEVSQUwpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnRGb3JtUXVhbGlmaWVkLmVxdWFscyhYU0RGb3JtLlVOUVVBTElGSUVEX0xJVEVSQUwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5zZXRFbGVtZW50Rm9ybURlZmF1bHQoWFNERm9ybS5VTlFVQUxJRklFRF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBNb2RlbCBzaG91bGQgYWxsb3cgdXMgdG8gcmVtb3ZlIHRoZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRUxFTUVOVEZPUk1ERUZBVUxUX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZUZvcm1DaGFuZ2VkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU0NIRU1BX0FUVFJJQlVURUZPUk1ERUZBVUxUX0NIQU5HRSIpKTsKLSAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQuZXF1YWxzKFhTREZvcm0uUVVBTElGSUVEX0xJVEVSQUwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5zZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYU0RGb3JtLlFVQUxJRklFRF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyaWJ1dGVGb3JtUXVhbGlmaWVkLmVxdWFscyhYU0RGb3JtLlVOUVVBTElGSUVEX0xJVEVSQUwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5zZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYU0RGb3JtLlVOUVVBTElGSUVEX0xJVEVSQUwpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE1vZGVsIHNob3VsZCBhbGxvdyB1cyB0byByZW1vdmUgdGhlIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5nZXRFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5BVFRSSUJVVEVGT1JNREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0gICAgICAgICAgICB9Ci0JCSAgIH0gICAgICAKLSAgICAgICAgICAKLQkJfQotCX0KLQkKLQkgcHJvdGVjdGVkIE1hcCBjcmVhdGVQcmVmaXhNYXBwaW5nKExpc3Qgb2xkTGlzdCwgTGlzdCBuZXdMaXN0KQotCSAgeyAgICAgICAgICAKLQkgICAgTWFwIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCSAgICBIYXNodGFibGUgb2xkVVJJVG9QcmVmaXhUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkgICAgZm9yIChJdGVyYXRvciBpID0gb2xkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCSAgICB7ICAgIAotCSAgICAgIE5hbWVzcGFjZUluZm8gb2xkSW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgb2xkVVJJVG9QcmVmaXhUYWJsZS5wdXQob2xkSW5mby51cmksIG9sZEluZm8pOwotCSAgICB9Ci0JICAgIAotCSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuZXdMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JICAgIHsKLQkgICAgICBOYW1lc3BhY2VJbmZvIG5ld0luZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLQkgICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbylvbGRVUklUb1ByZWZpeFRhYmxlLmdldChuZXdJbmZvLnVyaSAhPSBudWxsID8gbmV3SW5mby51cmkgOiAiIik7ICAvLyROT04tTkxTLTEkCi0KLQotCSAgICAgIC8vIGlmIG9sZEluZm8gaXMgbm9uIG51bGwgLi4uIHRoZXJlJ3MgYSBtYXRjaGluZyBVUkkgaW4gdGhlIG9sZCBzZXQKLQkgICAgICAvLyB3ZSBjYW4gdXNlIGl0cyBwcmVmaXggdG8gZGV0ZW1pbmUgb3V0IG1hcHBpbmcKLQkgICAgICAvLwotCSAgICAgIC8vIGlmIG9sZEluZm8gaXMgbnVsbCAuLi4gIHdlIHVzZSB0aGUgJ29sZENvcHknIHdlIHN0YXNoZWQgYXdheSAKLQkgICAgICAvLyBhc3N1bWluZyB0aGF0IHRoZSB1c2VyIGNoYW5nZWQgdGhlIFVSSSBhbmQgdGhlIHByZWZpeAotCSAgICAgIGlmIChvbGRJbmZvID09IG51bGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgICAgICB7Ci0JICAgICAgICBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pbmV3SW5mby5nZXRQcm9wZXJ0eSgib2xkQ29weSIpOyAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLQkgICAgICB9IAotCi0JICAgICAgaWYgKG9sZEluZm8gIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gbmV3SW5mby5wcmVmaXggIT0gbnVsbCA/IG5ld0luZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIFN0cmluZyBvbGRQcmVmaXggPSBvbGRJbmZvLnByZWZpeCAhPSBudWxsID8gb2xkSW5mby5wcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgaWYgKCFvbGRQcmVmaXguZXF1YWxzKG5ld1ByZWZpeCkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIG1hcC5wdXQob2xkUHJlZml4LCBuZXdQcmVmaXgpOyAgICAKLQkgICAgICAgIH0KLQkgICAgICB9ICAgICAgCi0JICAgIH0gICAgICAgIAotCSAgICByZXR1cm4gbWFwOwotCSAgfQotICAgCi0vLyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQWxsTm9kZXMoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4KQotLy8gICAgewotLy8gICAgICBlbGVtZW50LnNldFByZWZpeChwcmVmaXgpOwotLy8gICAgICBOb2RlTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0vLyAgICAgIGlmIChsaXN0ICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0vLyAgICAgICAgewotLy8gICAgICAgICAgTm9kZSBjaGlsZCA9IGxpc3QuaXRlbShpKTsKLS8vICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgY2hpbGQuc2V0UHJlZml4KHByZWZpeCk7Ci0vLyAgICAgICAgICAgIGlmIChjaGlsZC5oYXNDaGlsZE5vZGVzKCkpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICB1cGRhdGVBbGxOb2RlcygoRWxlbWVudCljaGlsZCwgcHJlZml4KTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgfSAgIAotLy8gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9DYXRlZ29yeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL0NhdGVnb3J5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmI0ZjQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL0NhdGVnb3J5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JTW9kZWxQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElNb2RlbFByb3h5LCBJQWN0aW9uUHJvdmlkZXIsIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7Ci0gIHByb3RlY3RlZCBJbWFnZSBpbWFnZTsKLSAgcHJvdGVjdGVkIE9iamVjdCBwYXJlbnQ7Ci0gIHByb3RlY3RlZCBpbnQgZ3JvdXBUeXBlOwotICBDb2xsZWN0aW9uIGNoaWxkcmVuLCBhbGxDaGlsZHJlbjsgIC8vIGNoaWxkcmVuIGZyb20gY3VycmVudCBzY2hlbWEsIGNoaWxkcmVuIGZyb20gY3VycmVudCBzY2hlbWEgYW5kIGluY2x1ZGVzCi0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0KLSAgcHVibGljIENhdGVnb3J5QWRhcHRlcihTdHJpbmcgbGFiZWwsIEltYWdlIGltYWdlLCBDb2xsZWN0aW9uIGNoaWxkcmVuLCBYU0RTY2hlbWEgeHNkU2NoZW1hLCBpbnQgZ3JvdXBUeXBlKQotICB7Ci0gICAgdGhpcy50ZXh0ID0gbGFiZWw7Ci0gICAgdGhpcy5pbWFnZSA9IGltYWdlOwotICAgIHRoaXMucGFyZW50ID0geHNkU2NoZW1hOwotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICAgIHRoaXMudGFyZ2V0ID0geHNkU2NoZW1hOwotICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLSAgICB0aGlzLmdyb3VwVHlwZSA9IGdyb3VwVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURVMgPSAxOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTEVNRU5UUyA9IDI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRZUEVTID0gMzsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgR1JPVVBTID0gNTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRElSRUNUSVZFUyA9IDY7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5PVEFUSU9OUyA9IDc7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURV9HUk9VUFMgPSA4OwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJREVOVElUWV9DT05TVFJBSU5UUyA9IDk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFOTk9UQVRJT05TID0gMTA7Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRYU0RTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0R3JvdXBUeXBlKCkKLSAgewotICAgIHJldHVybiBncm91cFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIGltYWdlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGNoaWxkcmVuLnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRBbGxDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBhbGxDaGlsZHJlbi50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oQ29sbGVjdGlvbiBsaXN0KQotICB7Ci0gICAgY2hpbGRyZW4gPSBsaXN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWxsQ2hpbGRyZW4oQ29sbGVjdGlvbiBsaXN0KQotICB7Ci0gICAgYWxsQ2hpbGRyZW4gPSBsaXN0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgewotCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7ICAgIAotICAgIENvbGxlY3Rpb24gYWN0aW9uSURzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHN3aXRjaCAoZ3JvdXBUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgVFlQRVMgOiB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uLklEKTsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbi5JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBFTEVNRU5UUyA6IHsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RFbGVtZW50QWN0aW9uLklEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEdST1VQUyA6IHsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5NT0RFTEdST1VQREVGSU5JVElPTl9JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBBVFRSSUJVVEVTIDogewotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLklEKTsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24uSUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQVRUUklCVVRFX0dST1VQUyA6IHsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24uSUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgRElSRUNUSVZFUyA6IHsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uSU5DTFVERV9JRCk7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uLklNUE9SVF9JRCk7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uLlJFREVGSU5FX0lEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGFjdGlvbklEcy5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICByZXR1cm4gKFN0cmluZyBbXSlhY3Rpb25JRHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGlmIChnZXRUZXh0KCkuZXF1YWxzKHByb3BlcnR5KSkKLSAgICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBwcm9wZXJ0eSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIChJTW9kZWwpWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RTY2hlbWEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5YjUxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotICBwcm90ZWN0ZWQgc3RhdGljIFhTREFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlOwotICAKLSAgcHVibGljIHN0YXRpYyBYU0RBZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBmaXJzdCB1c2UgdGhlIG9uZSBkZWZpbmVkIGJ5IHRoZSBjb25maWd1cmF0aW9uCi0gICAgICBpbnN0YW5jZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLSAgICAgIC8vIGlmIHRoZXJlIGlzbid0IG9uZSwgdGhlbiB1c2UgdGhlIGRlZmF1bHQKLSAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgICAgICBpbnN0YW5jZSA9IG5ldyBYU0RBZGFwdGVyRmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICB7Ci0gICAgWFNEU3dpdGNoIHhzZFN3aXRjaCA9IG5ldyBYU0RTd2l0Y2goKQotICAgIHsKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYURpcmVjdGl2ZShYU0RTY2hlbWFEaXJlY3RpdmUgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRFdpbGRjYXJkQWRhcHRlcigpOwotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFBhcnRpY2xlKFhTRFBhcnRpY2xlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RQYXJ0aWNsZUFkYXB0ZXIoKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIC8vIHdlIGRvbid0IGxpa2UgZXhwb3NpbmcgdGhlICdhbnlUeXBlJyB0eXBlIGFzIGEgdmlzaWJsZSBjb21wbGV4IHR5cGUKLSAgICAgICAgLy8gc28gd2UgYWRhcHQgaXQgaW4gYSBzcGVjaWFsaXplZCB3YXkgc28gdGhhdCBpdCdzIHRyZWF0ZWQgYXMgc2ltcGxlIHR5cGUKLSAgICAgICAgLy8gdGhhdCB3YXkgaXQgZG9lc24ndCBzaG93IHVwIGFzIGEgcmVmZXJlbmNlIGZyb20gYSBmaWVsZAotICAgICAgICAvLwotICAgICAgICBpZiAoImFueVR5cGUiLmVxdWFscyhvYmplY3QuZ2V0TmFtZSgpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RBbnlUeXBlRGVmaW5pdGlvbkFkYXB0ZXIoKTsgCi0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsgICAgICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRE1vZGVsR3JvdXBBZGFwdGVyKCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYShYU0RTY2hlbWEgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRFNjaGVtYUFkYXB0ZXIoKTsKLSAgICAgIH0gICAgICAgICAKLSAgICB9OwotICAgIE9iamVjdCBvID0geHNkU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotICAgIEFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAobyBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgewotICAgICAgcmVzdWx0ID0gKEFkYXB0ZXIpIG87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0vLyAgICAgIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCkKLSAgewotICAgIHJldHVybiBhZGFwdCh0YXJnZXQsIHRoaXMpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQW55VHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBbnlUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U4ZGM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBbnlUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFhTREFueVR5cGVEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTRFR5cGVEZWZpbml0aW9uQWRhcHRlcgotewotICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXhUeXBlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLQlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKChYU0RDb25jcmV0ZUNvbXBvbmVudCl0YXJnZXQpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzNDFmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQXR0cmlidXRlQWRhcHRlciBpbXBsZW1lbnRzIElBY3Rpb25Qcm92aWRlcgotewotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbil0YXJnZXQ7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWE7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTAwOAotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7ICAgIAotICAgIGlmKCFpc0dsb2JhbCgpKQotICAgIHsgICAgCSAgICAJCi0gICAgCUxpc3QgZGVmYXVsdEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCWRlZmF1bHRBY3Rpb25zID0gQXJyYXlzLmFzTGlzdChzdXBlci5nZXRBY3Rpb25zKG9iamVjdCkpOwotICAgIAkKLSAgICAJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCWxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRCArIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSk7Ci0gICAgCWxpc3QuYWRkKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLkJFRk9SRV9TRUxFQ1RFRF9JRCk7Ci0gICAgCWxpc3QuYWRkKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lEKTsKLSAgICAJbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7Ci0gICAgCQotICAgIAlpbnQgbGVuID0gZGVmYXVsdEFjdGlvbnMuc2l6ZSgpOwotICAgIAlmb3IoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgCXsKLSAgICAJCWlmIChkZWZhdWx0QWN0aW9ucy5nZXQoaSkuZXF1YWxzKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLklEKSkKLSAgICAJCXsKLSAgICAJCSAgY29udGludWU7Ci0gICAgCQl9Ci0gICAgCQlsaXN0LmFkZChkZWZhdWx0QWN0aW9ucy5nZXQoaSkpOwotICAgIAl9Ci0gICAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgCXJldHVybiBzdXBlci5nZXRBY3Rpb25zKG9iamVjdCk7Ci0gICAgfSAgICAKLSAgfSAgCi0gIAotICAKLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGlzR2xvYmFsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVRdWFsaWZpZXIoKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICBpZiAoIWlzR2xvYmFsKCkpCi0gICAgewotICAgICAgcmV0dXJuIGdldEdsb2JhbFhTRENvbnRhaW5lcihnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3ZGE1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlLCBJQWN0aW9uUHJvdmlkZXIsIElHcmFwaEVsZW1lbnQsIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFUVFJJQlVURV9HUk9VUF9SRUZfSUNPTl9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBVFRSSUJVVEVfR1JPVVBfUkVGX0RJU0FCTEVEX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQXR0cmlidXRlR3JvdXBSZWZkaXMuZ2lmIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQVRUUklCVVRFX0dST1VQX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQXR0cmlidXRlR3JvdXAuZ2lmIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQVRUUklCVVRFX0dST1VQX0RJU0FCTEVEX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQXR0cmlidXRlR3JvdXBkaXMuZ2lmIik7Ci0JICAKLSAgcHJvdGVjdGVkIExpc3QgZmllbGRzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3Qgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbnVsbDsKLQotICBwdWJsaWMgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBnZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIGlmICh4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gaXNSZWFkT25seSgpID8gQVRUUklCVVRFX0dST1VQX1JFRl9ESVNBQkxFRF9JQ09OX0lNQUdFIDogQVRUUklCVVRFX0dST1VQX1JFRl9JQ09OX0lNQUdFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGlzUmVhZE9ubHkoKSA/IEFUVFJJQlVURV9HUk9VUF9ESVNBQkxFRF9JQ09OX0lNQUdFIDogQVRUUklCVVRFX0dST1VQX0lDT05fSU1BR0U7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpID8geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFFOYW1lKCkgOiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNFTlQgOiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEF0dHJpYnV0ZUdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHhzZEF0dHJpYnV0ZUdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgICAgCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgCU9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotICAgIAlpZiAobyBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAJewotICAgIAkJbGlzdC5hZGQoKChYU0RBdHRyaWJ1dGVVc2UpbykuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgCX0KLSAgICAJZWxzZQotICAgIAl7Ci0gICAgCQlsaXN0LmFkZChvKTsKLSAgICAJfQotICAgIH0KLSAgICBYU0RXaWxkY2FyZCB3aWxkY2FyZCA9IHhzZEF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCgpOwotICAgIGlmICh3aWxkY2FyZCAhPSBudWxsKQotICAgIHsKLSAgICAJbGlzdC5hZGQod2lsZGNhcmQpOwotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKERlbGV0ZUFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIE9iamVjdCBzY2hlbWEgPSBnZXRFZGl0b3JTY2hlbWEoKTsKLSAgICBpZiAoZ2V0WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChnZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRDb250YWluZXIoKSA9PSBzY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0QWRkTmV3RmllbGRDb21tYW5kKFN0cmluZyBmaWVsZEtpbmQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZChnZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRGaWVsZHMoKQotICB7Ci0gICAgaWYgKGZpZWxkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIFhTRFZpc2l0b3JGb3JGaWVsZHMgdmlzaXRvciA9IG5ldyBYU0RWaXNpdG9yRm9yRmllbGRzKCk7Ci0gICAgICB2aXNpdG9yLnZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpKTsKLSAgICAgIHBvcHVsYXRlQWRhcHRlckxpc3QodmlzaXRvci5jb25jcmV0ZUNvbXBvbmVudExpc3QsIGZpZWxkcyk7Ci0gICAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3IudGhpbmdzV2VOZWVkVG9MaXN0ZW5Ubywgb3RoZXJUaGluZ3NUb0xpc3RlblRvKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG90aGVyVGhpbmdzVG9MaXN0ZW5Uby5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgSUFEVE9iamVjdCBhZHRPYmplY3QgPSAoSUFEVE9iamVjdCkgYWRhcHRlcjsKLSAgICAgICAgICBhZHRPYmplY3QucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmllbGRzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2xlYXJGaWVsZHMoKQotICB7Ci0gICAgaWYgKG90aGVyVGhpbmdzVG9MaXN0ZW5UbyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG90aGVyVGhpbmdzVG9MaXN0ZW5Uby5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgSUFEVE9iamVjdCBhZHRPYmplY3QgPSAoSUFEVE9iamVjdCkgYWRhcHRlcjsKLSAgICAgICAgICBhZHRPYmplY3QudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZpZWxkcyA9IG51bGw7Ci0gICAgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgLi4uIHJldmlldyB0aGlzCi0gICAgcmV0dXJuIGdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgaWYgKHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cERlZiA9IGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgIGlmIChhdHRyR3JvdXBEZWYuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICByZXR1cm4gdGhpczsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGF0dHJHcm91cERlZik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsKLSAgICBjbGVhckZpZWxkcygpOwotICAgIHN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGNsZWFyRmllbGRzKCk7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIG51bGwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVVc2VBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVVc2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODM2NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQXR0cmlidXRlVXNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQXR0cmlidXRlQWRhcHRlciBpbXBsZW1lbnRzIElBY3Rpb25Qcm92aWRlcgotewotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldFhTREF0dHJpYnV0ZVVzZSgpLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVVc2UgZ2V0WFNEQXR0cmlidXRlVXNlKCkKLSAgewotICAgIHJldHVybiAoWFNEQXR0cmlidXRlVXNlKXRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgcmV0dXJuIGdldFRleHRGb3JBdHRyaWJ1dGVVc2UoZ2V0WFNEQXR0cmlidXRlVXNlKCksIHRydWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0Rm9yQXR0cmlidXRlVXNlKFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UsIGJvb2xlYW4gc2hvd1R5cGUpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgcmVzdWx0LmFwcGVuZChnZXRUZXh0Rm9yQXR0cmlidXRlKGFkLCBzaG93VHlwZSkpOwotICAgIC8qCi0gICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5pc1NldENvbnN0cmFpbnQoKSkKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpICE9IDApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7Ci0gICAgICB9Ci0gICAgICByZXN1bHQuYXBwZW5kKCc8Jyk7Ci0gICAgICByZXN1bHQuYXBwZW5kKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb25zdHJhaW50KCkpOwotICAgICAgcmVzdWx0LmFwcGVuZCgiPVwiIik7Ci0gICAgICByZXN1bHQuYXBwZW5kKHhzZEF0dHJpYnV0ZVVzZS5nZXRMZXhpY2FsVmFsdWUoKSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKCJcIj4iKTsKLSAgICB9Ci0gICAgKi8KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldEdsb2JhbFhTRENvbnRhaW5lcihnZXRYU0RBdHRyaWJ1dGVVc2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEQXR0cmlidXRlVXNlKCkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQmFzZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyZmY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQmFzZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElBRFRPYmplY3QsIElUcmVlRWxlbWVudAoteyAgCi0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gIHsKLSAgICByZXR1cm4gdHlwZSA9PSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUFkYXB0ZXJMaXN0KExpc3Qgbm90aWZpZXJMaXN0LCBMaXN0IGFkYXB0ZXJMaXN0KQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbm90aWZpZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqOwotICAgICAgICBhZGFwdGVyTGlzdC5hZGQoWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChjb21wb25lbnQpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYWRhcHRlckxpc3QuYWRkKG9iaik7Ci0gICAgICB9Ci0gICAgfQotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgaWYgKCFsaXN0ZW5lckxpc3QuY29udGFpbnMobGlzdGVuZXIpKQotICAgIHsKLSAgICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsKLSAgICBzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIG51bGwpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoT2JqZWN0IGNoYW5nZWRPYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIExpc3QgY2xvbmVkTGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGNsb25lZExpc3RlbmVyTGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjbG9uZWRMaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIgPSAoSUFEVE9iamVjdExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKHRoaXMsIHByb3BlcnR5KTsKLSAgICB9ICAgICAgCi0gIH0KLSAgICAKLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIElUcmVlRWxlbWVudCBnZXRQYXJlbnQoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkKLSAgewotICAgIGlmIChnZXRDaGlsZHJlbigpICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGdldENoaWxkcmVuKCkubGVuZ3RoID4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotCi0gIC8qKgotICAgKiBJbXBsZW1lbnRzIElGaWVsZCBnZXRDb250YWluZXJUeXBlLiAgR2V0IHBhcmVudCBDb21wbGV4IFR5cGUgY29udGFpbmluZyB0aGUgZmllbGQKLSAgICogQHJldHVybiBJQ29tcGxleFR5cGUKLSAgICovCi0gIHB1YmxpYyBJQ29tcGxleFR5cGUgZ2V0Q29udGFpbmVyVHlwZSgpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgdGFyZ2V0OwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IG51bGw7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gbnVsbDsKLSAgICBmb3IgKHBhcmVudCA9IHhzZENvbmNyZXRlQ29tcG9uZW50LmdldENvbnRhaW5lcigpOyBwYXJlbnQgIT0gbnVsbDsgKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilwYXJlbnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcGFyZW50ID0gcGFyZW50LmdldENvbnRhaW5lcigpOwotICAgIH0KLSAgICBpZiAoY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gKElDb21wbGV4VHlwZSlYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBpZiAod2luZG93ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdG9yUGFydCA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCl0YXJnZXQpLmdldFNjaGVtYSgpOwotICAgICAgfQotICAgICAgaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbGxCYWNrQ2hlY2tJc1JlYWRPbmx5KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFhTRFNjaGVtYSBlZGl0b3JTY2hlbWEgPSAoWFNEU2NoZW1hKWVkaXRvclBhcnQuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsICYmIHhzZFNjaGVtYSA9PSBlZGl0b3JTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbGxCYWNrQ2hlY2tJc1JlYWRPbmx5KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGZhbGxCYWNrQ2hlY2tJc1JlYWRPbmx5KCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpdGFyZ2V0KS5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZQotICAgICAgICB8fCBlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudEltcGwpCi0gICAgewotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgT2JqZWN0IGdldEVkaXRvclNjaGVtYSgpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgcmV0dXJuIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSUFEVE9iamVjdCBnZXRHbG9iYWxYU0RDb250YWluZXIoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgYyA9IGNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAvLyBXZSB3YW50IHRoZSB0b3AgbW9zdCBzdHJ1Y3R1cmFsIGNvbXBvbmVudAotICAgIHdoaWxlIChjICE9IG51bGwgJiYgCi0gICAgICAgICAgICEoYy5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkgJiYgCi0gICAgICAgICAgICEoYyBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgJiYKLSAgICAgICAgICAgIShjIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pICYmCi0gICAgICAgICAgICEoYyBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSAmJgotICAgICAgICAgICAhKGMgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pKQotICAgIHsKLSAgICAgIGMgPSBjLmdldENvbnRhaW5lcigpOwotICAgIH0KLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGMpOwotICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgIHJldHVybiAoSUFEVE9iamVjdClhZGFwdGVyOwotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQXR0cmlidXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQmFzZUF0dHJpYnV0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4NDA3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQXR0cmlidXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotLy8gYSBiYXNlIGFkYXB0ZXIgZm9yIHJldXNlIGJ5IGFuIEF0dHJpYnV0ZVVzZSBhbmQgQXR0cmlidXRlRGVjbGFyYXRpb24KLS8vCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNEQmFzZUF0dHJpYnV0ZUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElGaWVsZCwgSUdyYXBoRWxlbWVudAotewotICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgcHJvdGVjdGVkIGFic3RyYWN0IFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQotICBwdWJsaWMgWFNEQmFzZUF0dHJpYnV0ZUFkYXB0ZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKCFpc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLklEKTsKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIGlmIChnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRDb250YWluZXIoKSA9PSBzY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgcmV0dXJuIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUc7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIC0zOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNaW5PY2N1cnMoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiAtMzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiByZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uID0gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgIFN0cmluZyBuYW1lID0gcmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgcmV0dXJuIChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIHJldHVybiAodGQgIT0gbnVsbCkgPyAoSVR5cGUpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQodGQpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgSVR5cGUgdHlwZSA9IGdldFR5cGUoKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoYXR0ci5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBhdHRyLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNYXhPY2N1cnNDb21tYW5kKGludCBtYXhPY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNaW5PY2N1cnNDb21tYW5kKGludCBtaW5PY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBuZXcgVXBkYXRlTmFtZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfTkFNRSwgZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLCBuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudCNnZXRJbWFnZSgpCi0gICAqLwotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlRGVjbGFyYXRpb24gPSBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOyAgLy8gZG9uJ3Qgd2FudCB0aGUgcmVzb2x2ZWQgYXR0cmlidXRlCi0gICAgaWYgKHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREF0dHJpYnV0ZVJlZmRpcy5naWYiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZVJlZi5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RBdHRyaWJ1dGVkaXMuZ2lmIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50I2dldFRleHQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiBnZXRUZXh0Rm9yQXR0cmlidXRlKGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKSwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHRGb3JBdHRyaWJ1dGUoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYWQsIGJvb2xlYW4gc2hvd1R5cGUpCi0gIHsKLSAgICBhZCA9IGFkLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICBTdHJpbmcgbmFtZSA9IGFkLmdldE5hbWUoKTsKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZCgiICIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfQUJTRU5UICsgIiAiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICB9Ci0gICAgaWYgKGFkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCAmJiBhZC5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vIHJlc3VsdC5hcHBlbmQocmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpLmdldFFOYW1lKHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uKSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKGFkLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9ICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQ2hpbGRVdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RDaGlsZFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxMTEwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RDaGlsZFV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIFhTRENoaWxkVXRpbGl0eQoteyAgICAgICAgICAgICAgCi0gIHN0YXRpYyBwdWJsaWMgTGlzdCBnZXRNb2RlbENoaWxkcmVuKE9iamVjdCBtb2RlbCkKLSAgewotICAgIFhTRENoaWxkVmlzaXRvciB2aXNpdG9yID0gbmV3IFhTRENoaWxkVmlzaXRvcihtb2RlbCk7Ci0gICAgdmlzaXRvci52aXNpdFhTRE9iamVjdChtb2RlbCk7Ci0gICAgcmV0dXJuIHZpc2l0b3IubGlzdDsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgTGlzdCBnZXRJbW1lZGlhdGVEZXJpdmVkVHlwZXMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlKQotICB7Ci0gICAgQXJyYXlMaXN0IHR5cGVzRGVyaXZlZEZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvLyBBIGhhbmR5IGNvbnZlbmllbmNlIG1ldGhvZCBxdWlja2x5IGdldHMgYWxsIAotICAgIC8vIHR5cGVEZWZpbml0aW9ucyB3aXRoaW4gb3VyIHNjaGVtYTsgbm90ZSB0aGF0IAotICAgIC8vIHdoZXRoZXIgb3Igbm90IHRoaXMgcmV0dXJucyB0eXBlcyBpbiBpbmNsdWRlZCwgCi0gICAgLy8gaW1wb3J0ZWQsIG9yIHJlZGVmaW5lZCBzY2hlbWFzIGlzIHN1YmplY3QgdG8gY2hhbmdlCi0gICAgTGlzdCB0eXBlZGVmcyA9IGNvbXBsZXhUeXBlLmdldFNjaGVtYSgpLmdldFR5cGVEZWZpbml0aW9ucygpOwotCi0gICAgZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWRlZnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlZGVmID0gKFhTRFR5cGVEZWZpbml0aW9uKWl0ZXIubmV4dCgpOwotICAgICAgLy8gV2FsayB0aGUgYmFzZVR5cGVzIGZyb20gdGhpcyB0eXBlZGVmIHNlZWluZyBpZiBhbnkgCi0gICAgICAvLyBvZiB0aGVtIG1hdGNoIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgICBpZiAoY29tcGxleFR5cGUuZXF1YWxzKHR5cGVkZWYuZ2V0QmFzZVR5cGUoKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIFdlIGZvdW5kIGl0LCByZXR1cm4gdGhlIG9yaWdpbmFsIG9uZSBhbmQgY29udGludWUKLSAgICAgICAgdHlwZXNEZXJpdmVkRnJvbS5hZGQodHlwZWRlZik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0eXBlc0Rlcml2ZWRGcm9tOwotICB9Ci0gIC8vIFRPRE8uLi4gdXNlIHRoZSBYU0RWaXNpdG9yIGRlZmluZWQgaW4geHNkZWRpdG9yLnV0aWwgaW5zdGVhZAotICAvLyAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RDaGlsZFZpc2l0b3IgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBPYmplY3Qgcm9vdDsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgWFNEQ2hpbGRWaXNpdG9yKE9iamVjdCByb290KQotICAgIHsKLSAgICAgIHRoaXMucm9vdCA9IHJvb3Q7Ci0gICAgfSAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSByb290KQotICAgICAgewotICAgICAgICBsaXN0LmFkZCh4c2RNb2RlbEdyb3VwKTsgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTRE1vZGVsR3JvdXAoeHNkTW9kZWxHcm91cCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpZiAoeHNkTW9kZWxHcm91cERlZmluaXRpb24gIT0gcm9vdCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbih4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uICE9IHJvb3QpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHhzZEVsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgICAgIAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24oeHNkRWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGlmICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24gIT0gcm9vdCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCB8fCBnZXRNb2RlbENoaWxkcmVuKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLnZpc2l0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgeHNkV2lsZENhcmQpCi0gICAgewotICAgICAgaWYgKHhzZFdpbGRDYXJkICE9IHJvb3QpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGxpc3QuYWRkKHhzZFdpbGRDYXJkKTsgICAgICAgIAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRYU0RXaWxkY2FyZCh4c2RXaWxkQ2FyZCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRFZpc2l0b3IKLSAgeyAKLSAgICBpbnQgaW5kZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RPYmplY3QoT2JqZWN0IG9iamVjdCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBYU0RTd2l0Y2ggdGhlU3dpdGNoID0gbmV3IFhTRFN3aXRjaCgpCi0gICAgICB7ICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24ob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAKLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNEQXR0cmlidXRlVXNlKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNERWxlbWVudERlY2xhcmF0aW9uKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHN1cGVyLmNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNETW9kZWxHcm91cChvYmplY3QpOwotICAgICAgICAgIHJldHVybiBzdXBlci5jYXNlWFNETW9kZWxHcm91cChvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEUGFydGljbGUoWFNEUGFydGljbGUgb2JqZWN0KQotICAgICAgICB7IAotICAgICAgICAgIHZpc2l0WFNEUGFydGljbGUob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAKLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTY2hlbWEoWFNEU2NoZW1hIG9iamVjdCkKLSAgICAgICAgeyAKLSAgICAgICAgICB2aXNpdFhTRFNjaGVtYShvYmplY3QpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IAotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFdpbGRjYXJkKFhTRFdpbGRjYXJkIG9iamVjdCkKLSAgICAgICAgeyAKLSAgICAgICAgICB2aXNpdFhTRFdpbGRjYXJkKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gCi0gICAgICB9OwotICAgICAgdGhlU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KW9iamVjdCk7Ci0gICAgfQotICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZVVzZSkKLSAgICB7ICAKLS8vICAgICAgcHJpbnRJbmRlbnRlZCgiQCIgKyB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gICAgeyAgICAgICAgIAotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0geHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgeyAgICAgIAotICAgICAgaW5kZW50ICs9IDI7ICAgICAgICAgCi0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgaWYgKHRkID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRkID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHZpc2l0WFNET2JqZWN0KHRkKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlVXNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoaS5uZXh0KCkpOwotICAgICAgfQotICAgICAgdmlzaXRYU0RPYmplY3QoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldENvbnRlbnQoKSk7Ci0gICAgICBpbmRlbnQgLT0gMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGluZGVudCArPSAyOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgIH0gCi0gICAgICBpbmRlbnQgLT0gMjsKLSAgICB9ICAgICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNETW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICB2aXNpdFhTRE9iamVjdCh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEUGFydGljbGUoWFNEUGFydGljbGUgeHNkUGFydGljbGUpCi0gICAgewotICAgICAgaW5kZW50ICs9IDI7ICAgICAgICAgICAgICAgICAKLSAgICAgIGlmICh4c2RQYXJ0aWNsZS5nZXRDb250ZW50KCkgIT0gbnVsbCkKLSAgICAgICAgdmlzaXRYU0RPYmplY3QoeHNkUGFydGljbGUuZ2V0Q29udGVudCgpKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0gCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRFdpbGRjYXJkKFhTRFdpbGRjYXJkIG9iamVjdCkKLSAgICB7IAotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRJbmRlbnRlZChTdHJpbmcgc3RyaW5nKQotICAgIHsgCi0gICAgICAvL1N0cmluZyBzcGFjZXMgPSAiIjsKLSAgICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgICAgIC8vewotICAgICAgLy8gIHNwYWNlcyArPSAiICI7Ci0gICAgICAvL30gICAgICAgICAgICAgICAKLSAgICAgCi0gICAgfQotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDIzZDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55RWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRE1vZGVsR3JvdXBBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNERWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuU3BhY2VGaWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEVHlwZURlZmluaXRpb25BZGFwdGVyIGltcGxlbWVudHMgSUNvbXBsZXhUeXBlLCBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIExpc3QgZmllbGRzID0gbnVsbDsKLSAgcHJvdGVjdGVkIExpc3Qgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbnVsbDsKLQotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIElUeXBlIGdldFN1cGVyVHlwZSgpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0QmFzZVR5cGUoKTsKLQotICAgIC8vIHRlc3QgdG8gZmlsdGVyIG91dCB0aGUgJ2FueVR5cGUnIHR5cGUgLi4uIGRvbid0IHdhbnQgdG8gc2VlIHRoYXQKLSAgICAvLwotICAgIGlmICh0ZCAhPSBudWxsICYmICF0ZC5nZXROYW1lKCkuZXF1YWxzKCJhbnlUeXBlIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXR1cm4gKElUeXBlKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHRkKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjbGVhckZpZWxkcygpCi0gIHsKLSAgICBpZiAob3RoZXJUaGluZ3NUb0xpc3RlblRvICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBJQURUT2JqZWN0IGFkdE9iamVjdCA9IChJQURUT2JqZWN0KSBhZGFwdGVyOwotICAgICAgICAgIGFkdE9iamVjdC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZmllbGRzID0gbnVsbDsKLSAgICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RmllbGRzKCkKLSAgewotICAgIGlmIChmaWVsZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgIFhTRFZpc2l0b3JGb3JGaWVsZHMgdmlzaXRvciA9IG5ldyBYU0RWaXNpdG9yRm9yRmllbGRzV2l0aFNwYWNlRmlsbGVycygpOwotICAgICAgdmlzaXRvci52aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKSk7Ci0gICAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3IuY29uY3JldGVDb21wb25lbnRMaXN0LCBmaWVsZHMpOwotICAgICAgcG9wdWxhdGVBZGFwdGVyTGlzdCh2aXNpdG9yLnRoaW5nc1dlTmVlZFRvTGlzdGVuVG8sIG90aGVyVGhpbmdzVG9MaXN0ZW5Ubyk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvdGhlclRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIElBRFRPYmplY3QgYWR0T2JqZWN0ID0gKElBRFRPYmplY3QpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWR0T2JqZWN0LnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZpZWxkczsKLSAgfQotCi0gIGNsYXNzIFhTRFZpc2l0b3JGb3JGaWVsZHNXaXRoU3BhY2VGaWxsZXJzIGV4dGVuZHMgWFNEVmlzaXRvckZvckZpZWxkcwotICB7Ci0gICAgcHVibGljIFhTRFZpc2l0b3JGb3JGaWVsZHNXaXRoU3BhY2VGaWxsZXJzKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgbzsKLSAgICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBvOwotICAgICAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHJHcm91cCk7Ci0gICAgICAgICAgaWYgKGF0dHJHcm91cC5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJHcm91cCA9IGF0dHJHcm91cC5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgaWYgKGF0dHJHcm91cC5nZXRDb250ZW50cygpLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKG5ldyBTcGFjZUZpbGxlcigiYXR0cmlidXRlIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyR3JvdXApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gICAgewotICAgICAgaW50IG51bU9mQ2hpbGRyZW4gPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuc2l6ZSgpOwotICAgICAgaWYgKG51bU9mQ2hpbGRyZW4gPT0gMCkKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChuZXcgU3BhY2VGaWxsZXIoImVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIHN1cGVyLnZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNb2RlbEdyb3VwcygpCi0gIHsKLSAgICBMaXN0IGdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBncm91cHMuYWRkQWxsKFhTRENoaWxkVXRpbGl0eS5nZXRNb2RlbENoaWxkcmVuKGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpKSk7Ci0gICAgcmV0dXJuIGdyb3VwczsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUdyb3VwQ29udGVudCgpCi0gIHsKLSAgICBFTGlzdCBhdHRyQ29udGVudCA9IGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCk7Ci0gICAgTGlzdCBhdHRyVXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0ckNvbnRlbnQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0Lm5leHQoKTsKLQotICAgICAgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBhdHRyR3JvdXBDb250ZW50OwotICAgICAgICBsaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikpOwotICAgICAgICBnZXRBdHRyaWJ1dGVVc2VzKGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiwgYXR0clVzZXMpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBhdHRyVXNlcy5hZGQoYXR0ckdyb3VwQ29udGVudCk7Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIodGhpcykpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsKLSAgICBjbGVhckZpZWxkcygpOwotICAgIHN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgcmV0dXJuIG5ldyBVcGRhdGVOYW1lQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9OQU1FLCBnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKSwgbmV3TmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRBZGROZXdGaWVsZENvbW1hbmQoU3RyaW5nIGZpZWxkS2luZCkKLSAgewotICAgIHJldHVybiBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRklFTEQsIGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBBZGROZXdGaWVsZENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCi0gIHsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lOwotICAgIHByb3RlY3RlZCBTdHJpbmcgZmllbGRLaW5kOwotCi0gICAgQWRkTmV3RmllbGRDb21tYW5kKFN0cmluZyBkZWZhdWx0TmFtZSwgU3RyaW5nIGZpZWxkS2luZCkKLSAgICB7Ci0gICAgICB0aGlzLmRlZmF1bHROYW1lID0gZGVmYXVsdE5hbWU7Ci0gICAgICB0aGlzLmZpZWxkS2luZCA9IGZpZWxkS2luZDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIE9iamVjdCBzY2hlbWEgPSBnZXRFZGl0b3JTY2hlbWEoKTsKLSAgICAKLSAgICBsaXN0LmFkZChBZGRYU0RFbGVtZW50QWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChBZGRYU0RFbGVtZW50QWN0aW9uLlJFRl9JRCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNEQW55RWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5SRUZfSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbi5SRUZfSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uU0VRVUVOQ0VfSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQ0hPSUNFX0lEKTsKLSAgICBsaXN0LmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLkFMTF9JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKERlbGV0ZUFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGlmIChnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKS5nZXRTY2hlbWEoKSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgaWYgKGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpLmdldENvbnRhaW5lcigpID09IHNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGNsZWFyRmllbGRzKCk7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIG51bGwpOwotICB9Ci0KLSAgY2xhc3MgQm9ndXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLSAgewotICAgIEJvZ3VzQWN0aW9uKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgc3VwZXIucnVuKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkKLSAgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSBnZXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLy8gQWRkIGF0dHJpYnV0ZXMKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoKChYU0RBdHRyaWJ1dGVVc2Upb2JqKS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgZ2V0QXR0cmlidXRlVXNlcygoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBvYmosIGxpc3QpOwotICAgICAgfQotICAgIH0KLSAgICBYU0RXaWxkY2FyZCBhbnlBdHRyID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZVdpbGRjYXJkKCk7Ci0gICAgaWYgKGFueUF0dHIgIT0gbnVsbCkKLSAgICAgIGxpc3QuYWRkKGFueUF0dHIpOwotICAgIC8vIGdldCBpbW1lZGlhdGUgWFNEIE1vZGVsIEdyb3VwIG9mIHRoaXMgY29tcGxleCB0eXBlCi0gICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRDb250ZW50KCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgeHNkQ29tcGxleFR5cGVDb250ZW50ID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldENvbnRlbnQoKTsKLSAgICAgIGlmICh4c2RDb21wbGV4VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCA9ICgoWFNEUGFydGljbGUpIHhzZENvbXBsZXhUeXBlQ29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHBhcnRpY2xlQ29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gZ2V0IGluaGVyaXRlZCBYU0QgTW9kZWwgR3JvdXAgb2YgdGhpcyBjb21wbGV4IHR5cGUKLSAgICBib29sZWFuIHNob3dJbmhlcml0ZWRDb250ZW50ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFNob3dJbmhlcml0ZWRDb250ZW50KCk7Ci0gICAgaWYgKHNob3dJbmhlcml0ZWRDb250ZW50KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAodHlwZURlZiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGJhc2VDVCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHR5cGVEZWY7Ci0gICAgICAgIGlmIChiYXNlQ1QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiAhYmFzZUNULmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJhc2VDVC5nZXRDb250ZW50KCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgeHNkQ29tcGxleFR5cGVDb250ZW50ID0gYmFzZUNULmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmICh4c2RDb21wbGV4VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCA9ICgoWFNEUGFydGljbGUpIHhzZENvbXBsZXhUeXBlQ29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKHBhcnRpY2xlQ29udGVudCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBhZGFwdGVyTGlzdC50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIGlmIChpc1JlYWRPbmx5KCkpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RDb21wbGV4VHlwZWRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTRENvbXBsZXhUeXBlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHRhcmdldDsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICByZXN1bHQuYXBwZW5kKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgPT0gbnVsbCA/ICJsb2NhbCB0eXBlIiA6IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZURlZmluaXRpb24gPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIGJhc2VUeXBlRGVmaW5pdGlvbiAhPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0Q29udGVudCgpICYmIGJhc2VUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCAmJiAhWFNEQ29uc3RhbnRzLmlzVVJUeXBlKGJhc2VUeXBlRGVmaW5pdGlvbikpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlc3VsdC5hcHBlbmQoYmFzZVR5cGVEZWZpbml0aW9uLmdldFFOYW1lKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEF0dHJpYnV0ZVVzZXMoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiwgTGlzdCBsaXN0KQotICB7Ci0gICAgSXRlcmF0b3IgaSA9IGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLQotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGkubmV4dCgpOwotCi0gICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgZ2V0QXR0cmlidXRlVXNlcygoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBhdHRyR3JvdXBDb250ZW50LCBsaXN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhdHRyR3JvdXBDb250ZW50KSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIHJldHVybiAhKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiB0aGlzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZmJjNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLlRleHRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLklBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0VHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIFhTRFBhcnRpY2xlQWRhcHRlciBpbXBsZW1lbnRzIElGaWVsZCwgSUFjdGlvblByb3ZpZGVyLCBJQW5ub3RhdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50Ci17Ci0gIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICByZXR1cm4gKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWU7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgSVR5cGUgdHlwZSA9IGdldFR5cGUoKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVRdWFsaWZpZXIoKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAvL2lmICh0ZCAhPSBudWxsICYmCi0gICAgLy8gICAgdGQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiB0ZC5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuICh0ZCAhPSBudWxsKSA/IChJVHlwZSkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh0ZCkgOiBudWxsOwotICB9Ci0gCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgdGFyZ2V0OwotICAgIAotICAgIGlmICgheHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RFbGVtZW50ZGlzLmdpZiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERWxlbWVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RFbGVtZW50UmVmZGlzLmdpZiIpOwotICAgICAgfSAgICAgICAgCi0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50UmVmLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB0YXJnZXQ7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgLy9TdHJpbmcgbmFtZSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbiAhPSByZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiA/IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRRTmFtZSgpIDogeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKTsKLSAgICBTdHJpbmcgbmFtZSA9IHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNFTlQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAoIXhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgICBib29sZWFuIGhhc01pbk9jY3VycyA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgIGJvb2xlYW4gaGFzTWF4T2NjdXJzID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpOwotCi0gICAgICBpZiAoaGFzTWluT2NjdXJzIHx8IGhhc01heE9jY3VycykKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIFsiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoaGFzTWluT2NjdXJzKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250YWluZXIoKSkuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgaWYgKG1pbiA9PSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkpLmdldE1pbk9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWluKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhhc01heE9jY3VycykKLSAgICAgICAgewotICAgICAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobWF4ID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0KLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24uZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsICYmIHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gcmVzdWx0LmFwcGVuZChyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpLmdldFFOYW1lKHhzZEVsZW1lbnREZWNsYXJhdGlvbikpOwotICAgICAgcmVzdWx0LmFwcGVuZChyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHRleHQgPSByZXN1bHQudG9TdHJpbmcoKTsKLSAgICBTdHJpbmcgcHJvY2Vzc2VkU3RyaW5nID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHRleHQsICI6Iik7Ci0gICAgcmV0dXJuIHByb2Nlc3NlZFN0cmluZzsKLQotICB9Ci0KLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB0YXJnZXQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSBudWxsOwotICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0eXBlID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHR5cGUgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHR5cGUgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwgJiYgIXR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHR5cGU7Ci0gICAgICBpZiAoY3RUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNHbG9iYWwoKSkKLSAgICAgICAgICBsaXN0LmFkZChjdFR5cGUpOwotICAgICAgfQotICAgIH0KLQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgYWRhcHRlckxpc3QudG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgcmV0dXJuICJlbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpCi0gIHsKLQkgIHJldHVybiAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgdGFyZ2V0KS5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTWF4T2NjdXJzQ29tbWFuZChpbnQgbWF4T2NjdXJzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTWluT2NjdXJzQ29tbWFuZChpbnQgbWluT2NjdXJzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX05BTUUsIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCksIG5hbWUpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlVHlwZU5hbWVDb21tYW5kKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHF1YWlsaWZpZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKCFpc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9TVEFSVF9JRCArIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VMRU1FTlQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5CRUZPUkVfU0VMRUNURURfSUQpOwotICAgICAgbGlzdC5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5BRlRFUl9TRUxFQ1RFRF9JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLSAgICB9Ci0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9UWVBFKTsKLSAgICBsaXN0LmFkZChTZXRUeXBlQWN0aW9uLlNFVF9ORVdfVFlQRV9JRCk7Ci0gICAgbGlzdC5hZGQoU2V0VHlwZUFjdGlvbi5TRUxFQ1RfRVhJU1RJTkdfVFlQRV9JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7Ci0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFkpOwotICAgIGxpc3QuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5SRVFVSVJFRF9JRCk7Ci0gICAgbGlzdC5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfT05FX0lEKTsKLSAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9NT1JFX0lEKTsKLSAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uT05FX09SX01PUkVfSUQpOyAgICAKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLQotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBPYmplY3Qgc2NoZW1hID0gZ2V0RWRpdG9yU2NoZW1hKCk7Ci0gICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0Q29udGFpbmVyKCkgPT0gc2NoZW1hKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChTZXRJbnB1dFRvR3JhcGhWaWV3LklEKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxpc3QuYWRkKE9wZW5Jbk5ld0VkaXRvci5JRCk7Ci0gICAgfQotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgIHJldHVybiAoU3RyaW5nIFtdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotICAKLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGlzR2xvYmFsKCk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgaWYgKCFpc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLSAgICByZXR1cm4gdGhpczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERW1wdHlGaWVsZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREVtcHR5RmllbGRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWI4ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERW1wdHlGaWVsZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgbm90IHVzZWQKLSAqLwotcHVibGljIGNsYXNzIFhTREVtcHR5RmllbGRBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJRmllbGQKLXsKLSAgU3RyaW5nIGtpbmQ7Ci0gIHB1YmxpYyBYU0RFbXB0eUZpZWxkQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRLaW5kKCkKLSAgewotICAgIHJldHVybiBraW5kOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZVF1YWxpZmllcigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoaW50IG1heE9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRE1vZGVsR3JvdXBBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNGFjZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55RWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLk1vZGVsR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxHcm91cEFkYXB0ZXIgZXh0ZW5kcyBYU0RQYXJ0aWNsZUFkYXB0ZXIgaW1wbGVtZW50cyBJQWN0aW9uUHJvdmlkZXIsIElHcmFwaEVsZW1lbnQKLXsKLSAgWFNETW9kZWxHcm91cCBnZXRYU0RNb2RlbEdyb3VwKCkKLSAgewotICAgIHJldHVybiAoWFNETW9kZWxHcm91cCkgdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXBBZGFwdGVyKCkKLSAgewotCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50I2dldEltYWdlKCkKLSAgICovCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwKCk7Ci0gICAgaWYgKFhTRENvbXBvc2l0b3IuQ0hPSUNFX0xJVEVSQUwgPT0geHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCkpCi0gICAgewotICAgICAgcmV0dXJuIE1vZGVsR3JvdXBGaWd1cmUuQ0hPSUNFX0lDT05fSU1BR0U7Ci0gICAgfQotICAgIGVsc2UgaWYgKFhTRENvbXBvc2l0b3IuQUxMX0xJVEVSQUwgPT0geHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCkpCi0gICAgewotICAgICAgcmV0dXJuIE1vZGVsR3JvdXBGaWd1cmUuQUxMX0lDT05fSU1BR0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gTW9kZWxHcm91cEZpZ3VyZS5TRVFVRU5DRV9JQ09OX0lNQUdFOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQjZ2V0VGV4dCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gZ2V0WFNETW9kZWxHcm91cCgpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBTdHJpbmcgbmFtZSA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29tcG9zaXRvcigpLmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQobmFtZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCBlbGVtZW50ID0geHNkTW9kZWxHcm91cC5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGJvb2xlYW4gaGFzTWluT2NjdXJzID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgYm9vbGVhbiBoYXNNYXhPY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0KLSAgICAgIGlmIChoYXNNaW5PY2N1cnMgfHwgaGFzTWF4T2NjdXJzKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgWyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChoYXNNaW5PY2N1cnMpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWluID0gKChYU0RQYXJ0aWNsZSkgeHNkTW9kZWxHcm91cC5nZXRDb250YWluZXIoKSkuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgaWYgKG1pbiA9PSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKSB4c2RNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoYXNNYXhPY2N1cnMpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSkgeHNkTW9kZWxHcm91cC5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChtYXggPT0gWFNEUGFydGljbGUuVU5CT1VOREVEKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtYXgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAvLyBwcmludCBkZWZhdWx0Ci0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKCIuLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaW50IG1heCA9ICgoWFNEUGFydGljbGUpIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgICBPYmplY3Qgb2JqZWN0ID0gaS5uZXh0KCk7Ci0gICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlID0gKChYU0RQYXJ0aWNsZSlvYmplY3QpLmdldENvbnRlbnQoKTsKLSAgICAgICBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgewotICAgICAgICAgbGlzdC5hZGQocGFydGljbGUpOwotICAgICAgIH0KLSAgICAgICBlbHNlIGlmIChwYXJ0aWNsZSBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgIHsKLSAgICAgICAgIGxpc3QuYWRkKHBhcnRpY2xlKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZSBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgIHsKLSAgICAgICAgIGxpc3QuYWRkKHBhcnRpY2xlKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZSBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICB7IAotICAgIAkgLy9saXN0LmFkZCgoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKXBhcnRpY2xlKS5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkpOwotICAgIAkgbGlzdC5hZGQocGFydGljbGUpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50IFtdKSBhZGFwdGVyTGlzdC50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgZWxlbWVudCA9IChYU0RNb2RlbEdyb3VwKSBvYmplY3Q7Ci0gICAgcmV0dXJuIGVsZW1lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyI2dldEFjdGlvbnMoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgQ29sbGVjdGlvbiBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5SRUZfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTREFueUVsZW1lbnRBY3Rpb24uSUQpOwotICAgICAvLyBBZGQgRWxlbWVudCBSZWYKLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5TRVFVRU5DRV9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5DSE9JQ0VfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQUxMX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24uTU9ERUxHUk9VUERFRklOSVRJT05SRUZfSUQpOwotLy8gICAgIGFjdGlvbklEcy5hZGQoQWRkRmllbGRBY3Rpb24uSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgLy8gQWRkIEFueQotCi0gICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEICsgTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfTVVMVElQTElDSVRZKTsKLSAgICAgYWN0aW9uSURzLmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uUkVRVUlSRURfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5aRVJPX09SX09ORV9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfTU9SRV9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLk9ORV9PUl9NT1JFX0lEKTsgICAgCi0gICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7Ci0gICAgCi0gICAgIGlmICghKGdldFBhcmVudCh0YXJnZXQpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pKQotICAgICB7Ci0gICAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICAgYWN0aW9uSURzLmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgICB9ICAgIAotICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgICAgICAKLSAgICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKGdldFhTRE1vZGVsR3JvdXAoKSk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWluT2NjdXJzKGdldFhTRE1vZGVsR3JvdXAoKSk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gZ2V0WFNETW9kZWxHcm91cCgpOwotICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoeHNkTW9kZWxHcm91cCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNETW9kZWxHcm91cCgpKTsJCi0gIH0KLSAgCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RNb2RlbEdyb3VwKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3N2EwMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEUGFydGljbGVBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZSwgSUFjdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50LCBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBNT0RFTF9HUk9VUF9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREdyb3VwLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgTU9ERUxfR1JPVVBfRElTQUJMRURfSUNPTiA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RHcm91cGRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIE1PREVMX0dST1VQX1JFRl9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREdyb3VwUmVmLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgTU9ERUxfR1JPVVBfUkVGX0RJU0FCTEVEX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNER3JvdXBSZWZkaXMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotICBwcm90ZWN0ZWQgTGlzdCBmaWVsZHMgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotICAKLSAgcHVibGljIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotCi0gICAgaWYgKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gTU9ERUxfR1JPVVBfUkVGX0RJU0FCTEVEX0lDT047Ci0gICAgICB9Ci0gICAgICByZXR1cm4gTU9ERUxfR1JPVVBfUkVGX0lDT047Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gTU9ERUxfR1JPVVBfRElTQUJMRURfSUNPTjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBNT0RFTF9HUk9VUF9JQ09OOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIFN0cmluZyByZXN1bHQgPSB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkgPyB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRRTmFtZSgpIDogeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNFTlQgOiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHRhcmdldCkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgbGlzdC5hZGQoeHNkTW9kZWxHcm91cCk7Ci0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXIjZ2V0QWN0aW9ucyhqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIENvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmICghZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKS5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgbGlzdC5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RFbGVtZW50QWN0aW9uLlJFRl9JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLlNFUVVFTkNFX0lEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQ0hPSUNFX0lEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQUxMX0lEKTsKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICB9Ci0gICAgCi0gICAgbGlzdC5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICAKLSAgICBpZiAoZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKS5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX1NUQVJUX0lEICsgTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfTVVMVElQTElDSVRZKTsKLSAgICAgIGxpc3QuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5SRVFVSVJFRF9JRCk7Ci0gICAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9PTkVfSUQpOwotICAgICAgbGlzdC5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfTU9SRV9JRCk7Ci0gICAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uT05FX09SX01PUkVfSUQpOyAgICAKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9FTkRfSUQpOyAKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIE9iamVjdCBzY2hlbWEgPSBnZXRFZGl0b3JTY2hlbWEoKTsKLSAgICBpZiAoZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRTY2hlbWEoKSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgaWYgKGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGFpbmVyKCkgPT0gc2NoZW1hKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChTZXRJbnB1dFRvR3JhcGhWaWV3LklEKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxpc3QuYWRkKE9wZW5Jbk5ld0VkaXRvci5JRCk7Ci0gICAgfQotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotCi0gICAgcmV0dXJuIChTdHJpbmcgW10pbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0QWRkTmV3RmllbGRDb21tYW5kKFN0cmluZyBmaWVsZEtpbmQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZChnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIC8vIFRPRE8gQ29tbW9uIHRoaXMgdXAgd2l0aCBYU0RDb21wbGV4VHlwZSdzLiAgU2VlIGFsc28gZ2V0RmllbGRzIAotICBwcm90ZWN0ZWQgdm9pZCBjbGVhckZpZWxkcygpCi0gIHsKLSAgICBpZiAob3RoZXJUaGluZ3NUb0xpc3RlblRvICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBJQURUT2JqZWN0IGFkdE9iamVjdCA9IChJQURUT2JqZWN0KSBhZGFwdGVyOwotICAgICAgICAgIGFkdE9iamVjdC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZmllbGRzID0gbnVsbDsKLSAgICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RmllbGRzKCkKLSAgewotICAgIExpc3QgZmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBYU0RWaXNpdG9yRm9yRmllbGRzIHZpc2l0b3IgPSBuZXcgWFNEVmlzaXRvckZvckZpZWxkcygpOwotICAgIHZpc2l0b3IudmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3IuY29uY3JldGVDb21wb25lbnRMaXN0LCBmaWVsZHMpOwotICAgIAotICAgIC8vIFRPRE8gKGNzKSBjb21tb24gYSBiYXNlIGNsYXNzIGZvciBhIHN0cnVjdHVyZSB0aGluZ2VlCi0gICAgLy8KLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3IudGhpbmdzV2VOZWVkVG9MaXN0ZW5Ubywgb3RoZXJUaGluZ3NUb0xpc3RlblRvKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvdGhlclRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpLm5leHQoKTsKLSAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgSUFEVE9iamVjdCBhZHRPYmplY3QgPSAoSUFEVE9iamVjdCkgYWRhcHRlcjsKLSAgICAgICAgYWR0T2JqZWN0LnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWVsZHM7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgaWYgKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7IAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBjbGVhckZpZWxkcygpOwotICAgIG5vdGlmeUxpc3RlbmVycyh0aGlzLCBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRNYXhPY2N1cnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE1heE9jY3VycyhnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXJzKCkKLSAgewotICAgIHJldHVybiBnZXRNaW5PY2N1cnMoZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgIGlmIChncm91cC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgIHJldHVybiB0aGlzOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoZ3JvdXApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RQYXJ0aWNsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFBhcnRpY2xlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjY2NDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFBhcnRpY2xlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLklBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLQotcHVibGljIGNsYXNzIFhTRFBhcnRpY2xlQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUFubm90YXRpb25Qcm92aWRlcgotewotICBwdWJsaWMgWFNEUGFydGljbGVBZGFwdGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgdGFyZ2V0KTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXJzKCkKLSAgewotICAgIHJldHVybiBnZXRNaW5PY2N1cnMoKFhTRENvbmNyZXRlQ29tcG9uZW50KSB0YXJnZXQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWluT2NjdXJzKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGludCBtaW5PY2N1ciA9IC0yOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTRFBhcnRpY2xlKSBvKS5pc1NldE1pbk9jY3VycygpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWluT2NjdXIgPSAoKFhTRFBhcnRpY2xlKSBvKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1pbk9jY3VyOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4T2NjdXJzKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGludCBtYXhPY2N1ciA9IC0yOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTRFBhcnRpY2xlKSBvKS5pc1NldE1heE9jY3VycygpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWF4T2NjdXIgPSAoKFhTRFBhcnRpY2xlKSBvKS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1heE9jY3VyOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lQW5ub3RhdGlvblN0cmluZygpCi0gIHsKLSAgICByZXR1cm4gYnVpbGRBbm5vdGF0aW9uU3RyaW5nKHRydWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lQW5ub3RhdGlvblRvb2xUaXBTdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIGJ1aWxkQW5ub3RhdGlvblN0cmluZyhmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVBbm5vdGF0aW9uU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlQW5ub3RhdGlvblRvb2xUaXBTdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQW5ub3RhdGlvblN0cmluZyhib29sZWFuIGlzRm9yTGFiZWwpCi0gIHsKLSAgICBTdHJpbmcgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyB0b29sVGlwRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vIFRPRE86IHNldCBpbnQgdmFsdWVzIGFzIGRlZmluZWQgY29uc3RhbnRzCi0gICAgLy8gLTIgbWVhbnMgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgKHNvIHRoZSBkZWZhdWx0IGlzIDEpCi0gICAgaW50IG1pbk9jY3VycyA9IGdldE1pbk9jY3VycygpOwotICAgIGludCBtYXhPY2N1cnMgPSBnZXRNYXhPY2N1cnMoKTsKLQotICAgIC8vIFRoaXMgaXMgZm9yIHRoZSBhdHRyaWJ1dGUgZmllbGQgY2FzZSwgd2hpY2ggaGFzIG5vCi0gICAgLy8gb2NjdXJyZW5jZSBhdHRyaWJ1dGVzCi0gICAgaWYgKG1pbk9jY3VycyA9PSAtMyAmJiBtYXhPY2N1cnMgPT0gLTMpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlIGlmIChtaW5PY2N1cnMgPT0gMCAmJiAobWF4T2NjdXJzID09IC0yIHx8IG1heE9jY3VycyA9PSAxKSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICJbMC4uMV0iOyAvLyROT04tTkxTLTEkCi0gICAgICB0b29sVGlwRGVzY3JpcHRpb24gPSBNZXNzYWdlcy5fVUlfTEFCRUxfT1BUSU9OQUw7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1pbk9jY3VycyA9PSAwICYmIG1heE9jY3VycyA9PSAtMSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICJbMC4uKl0iOyAvLyROT04tTkxTLTEkCi0gICAgICB0b29sVGlwRGVzY3JpcHRpb24gPSBNZXNzYWdlcy5fVUlfTEFCRUxfWkVST19PUl9NT1JFOwotICAgIH0KLSAgICBlbHNlIGlmICgobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IC0xKSB8fCAobWluT2NjdXJzID09IC0yICYmIG1heE9jY3VycyA9PSAtMSkpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiWzEuLipdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgdG9vbFRpcERlc2NyaXB0aW9uID0gTWVzc2FnZXMuX1VJX0xBQkVMX09ORV9PUl9NT1JFOwotICAgIH0KLSAgICBlbHNlIGlmICgobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IDEpIHx8IChtaW5PY2N1cnMgPT0gLTIgJiYgbWF4T2NjdXJzID09IDEpIHx8IChtaW5PY2N1cnMgPT0gMSAmJiBtYXhPY2N1cnMgPT0gLTIpKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIlsxLi4xXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRvb2xUaXBEZXNjcmlwdGlvbiA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9SRVFVSVJFRDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluT2NjdXJzID09IC0yICYmIG1heE9jY3VycyA9PSAtMikKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAvLyBub25lIHNwZWNpZmllZCwgc28gZG9uJ3QgaGF2ZSBhbnkgdG9vbFRpcCBkZXNjcmlwdGlvbgotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKG1heE9jY3VycyA9PSAtMikKLSAgICAgICAgbWF4T2NjdXJzID0gMTsKLSAgICAgIFN0cmluZyBtYXhTeW1ib2wgPSBtYXhPY2N1cnMgPT0gLTEgPyAiKiIgOiAiIiArIG1heE9jY3VyczsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBTdHJpbmcgbWluU3ltYm9sID0gbWluT2NjdXJzID09IC0yID8gIjEiIDogIiIgKyBtaW5PY2N1cnM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiWyIgKyBtaW5TeW1ib2wgKyAiLi4iICsgbWF4U3ltYm9sICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgdG9vbFRpcERlc2NyaXB0aW9uID0gTWVzc2FnZXMuX1VJX0xBQkVMX0FSUkFZOwotICAgIH0KLQotICAgIGlmIChpc0ZvckxhYmVsKQotICAgIHsKLSAgICAgIHJldHVybiBvY2N1cmVuY2VEZXNjcmlwdGlvbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiB0b29sVGlwRGVzY3JpcHRpb247Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNjaGVtYUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNjaGVtYUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkOGUyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTY2hlbWFBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRhZGEgVGFrYXRvc2hpIC8gRnVqaXRzdSAtIGJ1ZyAyNDU0ODAgLSBwcm92aWRlZCBpbml0aWFsIHBhdGNoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyLCBJTW9kZWwsIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgTGlzdCB0eXBlcyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IGNoaWxkcmVuLCBhbGxDaGlsZHJlbjsKLQotICBwcm90ZWN0ZWQgQ2F0ZWdvcnlBZGFwdGVyIGZEaXJlY3RpdmVzQ2F0ZWdvcnk7Ci0gIHByb3RlY3RlZCBDYXRlZ29yeUFkYXB0ZXIgZkVsZW1lbnRzQ2F0ZWdvcnk7Ci0gIHByb3RlY3RlZCBDYXRlZ29yeUFkYXB0ZXIgZkF0dHJpYnV0ZXNDYXRlZ29yeTsKLSAgcHJvdGVjdGVkIENhdGVnb3J5QWRhcHRlciBmVHlwZXNDYXRlZ29yeTsKLSAgcHJvdGVjdGVkIENhdGVnb3J5QWRhcHRlciBmR3JvdXBzQ2F0ZWdvcnk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbGwgdGhlIGNhdGVnb3J5IGFkYXB0ZXJzCi0gICAqIAotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRlZ29yeUFkYXB0ZXJzKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBMaXN0IGRpcmVjdGl2ZXNMaXN0ID0gZ2V0RGlyZWN0aXZlcyh4c2RTY2hlbWEpOwotICAgIExpc3QgZWxlbWVudHNMaXN0ID0gZ2V0R2xvYmFsRWxlbWVudHMoeHNkU2NoZW1hKTsKLSAgICBMaXN0IGF0dHJpYnV0ZXNMaXN0ID0gZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEpOwotICAgIExpc3QgZ3JvdXBzID0gZ2V0R3JvdXBzKHhzZFNjaGVtYSk7Ci0gICAgTGlzdCB0eXBlcyA9IGdldENvbXBsZXhUeXBlcyh4c2RTY2hlbWEpOwotICAgIHR5cGVzLmFkZEFsbChnZXRTaW1wbGVUeXBlcyh4c2RTY2hlbWEpKTsKLQotICAgIGZEaXJlY3RpdmVzQ2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnlBZGFwdGVyKE1lc3NhZ2VzLl9VSV9HUkFQSF9ESVJFQ1RJVkVTLCBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEljb25JbWFnZSgib2JqMTYvZGlyZWN0aXZlc2hlYWRlciIpLCBkaXJlY3RpdmVzTGlzdCwgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuRElSRUNUSVZFUyk7IC8vJE5PTi1OTFMtMSQKLSAgICBmRGlyZWN0aXZlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGRpcmVjdGl2ZXNMaXN0KTsKLSAgICByZWdpc3Rlckxpc3RlbmVyKGZEaXJlY3RpdmVzQ2F0ZWdvcnkpOwotCi0gICAgZkVsZW1lbnRzQ2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnlBZGFwdGVyKE1lc3NhZ2VzLl9VSV9HUkFQSF9FTEVNRU5UUywgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJY29uSW1hZ2UoIm9iajE2L2VsZW1lbnRzaGVhZGVyIiksIGVsZW1lbnRzTGlzdCwgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuRUxFTUVOVFMpOyAgLy8kTk9OLU5MUy0xJAotICAgIGZFbGVtZW50c0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoZkVsZW1lbnRzQ2F0ZWdvcnkpOwotCi0gICAgZkF0dHJpYnV0ZXNDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeUFkYXB0ZXIoTWVzc2FnZXMuX1VJX0dSQVBIX0FUVFJJQlVURVMsIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWNvbkltYWdlKCJvYmoxNi9hdHRyaWJ1dGVzaGVhZGVyIiksIGF0dHJpYnV0ZXNMaXN0LCB4c2RTY2hlbWEsIENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKTsgICAvLyROT04tTkxTLTEkCi0gICAgZkF0dHJpYnV0ZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihhdHRyaWJ1dGVzTGlzdCk7Ci0gICAgcmVnaXN0ZXJMaXN0ZW5lcihmQXR0cmlidXRlc0NhdGVnb3J5KTsKLQotICAgIGZUeXBlc0NhdGVnb3J5ID0gbmV3IENhdGVnb3J5QWRhcHRlcihNZXNzYWdlcy5fVUlfR1JBUEhfVFlQRVMsIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWNvbkltYWdlKCJvYmoxNi90eXBlc2hlYWRlciIpLCB0eXBlcywgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpOyAgLy8kTk9OLU5MUy0xJAotICAgIGZUeXBlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGdldFR5cGVzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoZlR5cGVzQ2F0ZWdvcnkpOwotCi0gICAgZkdyb3Vwc0NhdGVnb3J5ID0gbmV3IENhdGVnb3J5QWRhcHRlcihNZXNzYWdlcy5fVUlfR1JBUEhfR1JPVVBTLCBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEljb25JbWFnZSgib2JqMTYvZ3JvdXBzaGVhZGVyIiksIGdyb3VwcywgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKTsgLy8kTk9OLU5MUy0xJAotICAgIGZHcm91cHNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihncm91cHMpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoZkdyb3Vwc0NhdGVnb3J5KTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFR5cGVzKCkKLSAgewotICAgIGlmICh0eXBlcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIHRhcmdldDsKLSAgICAgIExpc3QgY29uY3JldGVDb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIGkubmV4dCgpOwotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHBvcHVsYXRlQWRhcHRlckxpc3QoY29uY3JldGVDb21wb25lbnRMaXN0LCB0eXBlcyk7Ci0gICAgfQotICAgIHJldHVybiB0eXBlczsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTYW1lTmFtZXNwYWNlKFN0cmluZyBuczEsIFN0cmluZyBuczIpCi0gIHsKLSAgICBpZiAobnMxID09IG51bGwpIG5zMSA9ICIiOwotICAgIGlmIChuczIgPT0gbnVsbCkgbnMyID0gIiI7Ci0gICAgCi0gICAgaWYgKG5zMS5lcXVhbHMobnMyKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudCNnZXRDaGlsZHJlbigpCi0gICAqLwotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpIGdldFRhcmdldCgpOwotCi0gICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvLyBqdXN0IHNldCBjYXRlZ29yeWFkYXB0ZXJzJyBjaGlsZHJlbiBpZiBjYXRlZ29yeSBhZGFwdGVycyBhcmUKLSAgICAvLyBhbHJlYWR5IGNyZWF0ZWQKLSAgICBpZiAoZkRpcmVjdGl2ZXNDYXRlZ29yeSAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgZGlyZWN0aXZlc0xpc3QgPSBnZXREaXJlY3RpdmVzKHhzZFNjaGVtYSk7Ci0gICAgICBMaXN0IGVsZW1lbnRzTGlzdCA9IGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSk7Ci0gICAgICBMaXN0IGF0dHJpYnV0ZXNMaXN0ID0gZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEpOwotICAgICAgTGlzdCBncm91cHMgPSBnZXRHcm91cHMoeHNkU2NoZW1hKTsKLSAgICAgIExpc3QgdHlwZXMgPSBnZXRDb21wbGV4VHlwZXMoeHNkU2NoZW1hKTsKLSAgICAgIHR5cGVzLmFkZEFsbChnZXRTaW1wbGVUeXBlcyh4c2RTY2hlbWEpKTsKLQotICAgICAgZkRpcmVjdGl2ZXNDYXRlZ29yeS5zZXRDaGlsZHJlbihkaXJlY3RpdmVzTGlzdCk7Ci0gICAgICBmRGlyZWN0aXZlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGRpcmVjdGl2ZXNMaXN0KTsKLSAgICAgIGZFbGVtZW50c0NhdGVnb3J5LnNldENoaWxkcmVuKGVsZW1lbnRzTGlzdCk7Ci0gICAgICBmRWxlbWVudHNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRHbG9iYWxFbGVtZW50cyh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICAgIGZBdHRyaWJ1dGVzQ2F0ZWdvcnkuc2V0Q2hpbGRyZW4oYXR0cmlidXRlc0xpc3QpOwotICAgICAgZkF0dHJpYnV0ZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRBdHRyaWJ1dGVMaXN0KHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgZlR5cGVzQ2F0ZWdvcnkuc2V0Q2hpbGRyZW4odHlwZXMpOwotICAgICAgZlR5cGVzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oZ2V0VHlwZXMoeHNkU2NoZW1hLCB0cnVlKSk7Ci0gICAgICBmR3JvdXBzQ2F0ZWdvcnkuc2V0Q2hpbGRyZW4oZ3JvdXBzKTsKLSAgICAgIGZHcm91cHNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRHcm91cHMoeHNkU2NoZW1hLCB0cnVlKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjcmVhdGVDYXRlZ29yeUFkYXB0ZXJzKHhzZFNjaGVtYSk7Ci0gICAgfQotCi0gICAgY2hpbGRyZW4uYWRkKGZEaXJlY3RpdmVzQ2F0ZWdvcnkpOwotICAgIGNoaWxkcmVuLmFkZChmRWxlbWVudHNDYXRlZ29yeSk7Ci0gICAgY2hpbGRyZW4uYWRkKGZBdHRyaWJ1dGVzQ2F0ZWdvcnkpOwotICAgIGNoaWxkcmVuLmFkZChmVHlwZXNDYXRlZ29yeSk7Ci0gICAgY2hpbGRyZW4uYWRkKGZHcm91cHNDYXRlZ29yeSk7Ci0KLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKQotICB7Ci0gICAgY2xhc3MgQ2F0ZWdvcnlOb3RpZmljYXRpb24gZXh0ZW5kcyBOb3RpZmljYXRpb25JbXBsCi0gICAgewotICAgICAgcHJvdGVjdGVkIE9iamVjdCBjYXRlZ29yeTsKLQotICAgICAgcHVibGljIENhdGVnb3J5Tm90aWZpY2F0aW9uKE9iamVjdCBjYXRlZ29yeSkKLSAgICAgIHsKLSAgICAgICAgc3VwZXIobXNnLmdldEV2ZW50VHlwZSgpLCBtc2cuZ2V0T2xkVmFsdWUoKSwgbXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXRQb3NpdGlvbigpKTsKLSAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldE5vdGlmaWVyKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNhdGVnb3J5OwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoKQotICAgICAgewotICAgICAgICByZXR1cm4gbXNnLmdldEZlYXR1cmUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRDaGlsZHJlbigpOwotICAgIH0KLSAgICAKLSAgICBPYmplY3QgbmV3VmFsdWUgPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLSAgICAKLSAgICBPYmplY3Qgb2xkVmFsdWUgPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLSAgICAvLyBCdWcgMjQ1NDgwIC0gRGVsZXRpb24gb2YgSW5jbHVkZSwgSW1wb3J0IGFuZCBSZWRlZmluZSBpcyBub3QgcmVmbGVjdGVkIGluIHRoZSBPdXRsaW5lIHZpZXcKLSAgICAvLyBXZSBvbmx5IHdhbnQgdG8gcmVmcmVzaCB0aGUgRGlyZWN0aXZlcyBmb2xkZXIgZm9yIGFueSBjaGFuZ2VzIHRvIFhTRERpcmVjdGl2ZXMuICBUaGUgZmlyc3QgY2FzZSBjb3ZlcnMKLSAgICAvLyBjaGFuZ2VzIHRvIG9uZSBkaXJlY3RpdmUsIHdoZXJlYXMgdGhlIG1pc3NpbmcgY2FzZSBhcyByZXBvcnRlZCBpbiBidWcgMjQ1NDgwIGNvdmVycyBjaGFuZ2VzIHRvIGEgbGlzdAotICAgIC8vIG9mIGRpcmVjdGl2ZXMuCi0gICAgYm9vbGVhbiB1cGRhdGVEaXJlY3RpdmVzQ2F0ZWdvcnkgPSBmYWxzZTsKLSAgICBpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgewotICAgICAgdXBkYXRlRGlyZWN0aXZlc0NhdGVnb3J5ID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDb2xsZWN0aW9uKSBvbGRWYWx1ZSkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGF0IGxlYXN0IG9uZSBkaXJlY3RpdmUsIHRoZW4gd2Ugc2hvdWxkIHJlZnJlc2ggdGhlIGZvbGRlcgotICAgICAgICAgIHVwZGF0ZURpcmVjdGl2ZXNDYXRlZ29yeSA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgWFNESW5jbHVkZSB8fCBuZXdWYWx1ZSBpbnN0YW5jZW9mIFhTREltcG9ydCB8fCBuZXdWYWx1ZSBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lIHx8Ci0gICAgICAgIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9Db250ZW50cygpICYmIHVwZGF0ZURpcmVjdGl2ZXNDYXRlZ29yeSkgfHwgLy8gaGFuZGxlIHRoZSBjYXNlIGZvciBkZWxldGUgZGlyZWN0aXZlCi0gICAgICAgICBtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9JbmNvcnBvcmF0ZWRWZXJzaW9ucygpKSAvLyB1cGRhdGVzIHRvIHRoZSBpbXBvcnRzL2luY2x1ZGVzCi0gICAgewotICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSBnZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuRElSRUNUSVZFUyk7Ci0gICAgICBBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYWRhcHRlci5nZXRYU0RTY2hlbWEoKTsKLSAgICAgIGFkYXB0ZXIuc2V0Q2hpbGRyZW4oZ2V0RGlyZWN0aXZlcyh4c2RTY2hlbWEpKTsKLSAgICAgIGFkYXB0ZXIuc2V0QWxsQ2hpbGRyZW4oZ2V0RGlyZWN0aXZlcyh4c2RTY2hlbWEpKTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhuZXcgQ2F0ZWdvcnlOb3RpZmljYXRpb24oYWRhcHRlciksIGFkYXB0ZXIuZ2V0VGV4dCgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfRWxlbWVudERlY2xhcmF0aW9ucygpKQotICAgIHsKLSAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkVMRU1FTlRTKTsKLSAgICAgIEFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBhZGFwdGVyLmdldFhTRFNjaGVtYSgpOwotICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbihnZXRHbG9iYWxFbGVtZW50cyh4c2RTY2hlbWEpKTsKLSAgICAgIGFkYXB0ZXIuc2V0QWxsQ2hpbGRyZW4oZ2V0R2xvYmFsRWxlbWVudHMoeHNkU2NoZW1hLCB0cnVlKSk7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpLCBhZGFwdGVyLmdldFRleHQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX0F0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHx8Ci0gICAgICAgICAgICAgbXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfQXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpKQotICAgIHsKLSAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVMpOwotICAgICAgQXNzZXJ0LmlzVHJ1ZShhZGFwdGVyICE9IG51bGwpOwotICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGFkYXB0ZXIuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICBhZGFwdGVyLnNldENoaWxkcmVuKGdldEF0dHJpYnV0ZUxpc3QoeHNkU2NoZW1hKSk7Ci0gICAgICBhZGFwdGVyLnNldEFsbENoaWxkcmVuKGdldEF0dHJpYnV0ZUxpc3QoeHNkU2NoZW1hLCB0cnVlKSk7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpLCBhZGFwdGVyLmdldFRleHQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX1R5cGVEZWZpbml0aW9ucygpKQotICAgIHsKLSAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKTsKLSAgICAgIEFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBhZGFwdGVyLmdldFhTRFNjaGVtYSgpOwotICAgICAgTGlzdCB0eXBlcyA9IGdldENvbXBsZXhUeXBlcyh4c2RTY2hlbWEpOwotICAgICAgdHlwZXMuYWRkQWxsKGdldFNpbXBsZVR5cGVzKHhzZFNjaGVtYSkpOwotCi0gICAgICBhZGFwdGVyLnNldENoaWxkcmVuKHR5cGVzKTsKLSAgICAgIGFkYXB0ZXIuc2V0QWxsQ2hpbGRyZW4oZ2V0VHlwZXMoeHNkU2NoZW1hLCB0cnVlKSk7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpLCBhZGFwdGVyLmdldFRleHQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX01vZGVsR3JvdXBEZWZpbml0aW9ucygpKQotICAgIHsKLSAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkdST1VQUyk7Ci0gICAgICBBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYWRhcHRlci5nZXRYU0RTY2hlbWEoKTsKLSAgICAgIGFkYXB0ZXIuc2V0Q2hpbGRyZW4oZ2V0R3JvdXBzKHhzZFNjaGVtYSkpOwotICAgICAgYWRhcHRlci5zZXRBbGxDaGlsZHJlbihnZXRHcm91cHMoeHNkU2NoZW1hLCB0cnVlKSk7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpLCBhZGFwdGVyLmdldFRleHQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX0Fubm90YXRpb25zKCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9TY2hlbWFMb2NhdGlvbigpKQotICAgIHsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhtc2csIG51bGwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICB0eXBlcyA9IG51bGw7Ci0gICAgZ2V0VHlwZXMoKTsKLQotICAgIHN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdXBkYXRlQ2F0ZWdvcmllcygpCi0gIHsKLSAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMKLSAgICBnZXRDaGlsZHJlbigpOwotICB9Ci0gIAotICBwdWJsaWMgQ2F0ZWdvcnlBZGFwdGVyIGdldENhdGVnb3J5KGludCBjYXRlZ29yeSkKLSAgewotICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB1cGRhdGVDYXRlZ29yaWVzKCk7IC8vIGluaXQgY2F0ZWdvcmllcwotICAgIGludCBsZW5ndGggPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgYWRhcHRlciA9IChDYXRlZ29yeUFkYXB0ZXIpIGNoaWxkcmVuLmdldChpKTsKLSAgICAgIGlmIChhZGFwdGVyLmdldEdyb3VwVHlwZSgpID09ICBjYXRlZ29yeSkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0RGlyZWN0aXZlcyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKG8pOwotICAgICAgfQotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0R2xvYmFsRWxlbWVudHMoWFNEU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBzaG93RnJvbUluY2x1ZGVzKQotICB7Ci0gICAgTGlzdCBlbGVtZW50cyA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbSA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKGlzU2FtZU5hbWVzcGFjZShlbGVtLmdldFRhcmdldE5hbWVzcGFjZSgpLHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkgJiYgKGVsZW0uZ2V0Um9vdENvbnRhaW5lcigpID09IHNjaGVtYSB8fCBzaG93RnJvbUluY2x1ZGVzKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZWxlbSk7Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0R2xvYmFsRWxlbWVudHMoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHJldHVybiBnZXRHbG9iYWxFbGVtZW50cyhzY2hlbWEsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2NoZW1hCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldENvbXBsZXhUeXBlcyhYU0RTY2hlbWEgc2NoZW1hLCBib29sZWFuIHNob3dGcm9tSW5jbHVkZXMpCi0gIHsKLSAgICBMaXN0IGFsbFR5cGVzID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhbGxUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKHRkIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0ZDsKLSAgICAgICAgaWYgKGlzU2FtZU5hbWVzcGFjZShjdC5nZXRUYXJnZXROYW1lc3BhY2UoKSxzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIChjdC5nZXRSb290Q29udGFpbmVyKCkgPT0gc2NoZW1hIHx8IHNob3dGcm9tSW5jbHVkZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoY3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0Q29tcGxleFR5cGVzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29tcGxleFR5cGVzKHNjaGVtYSwgZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRUeXBlcyhYU0RTY2hlbWEgc2NoZW1hLCBib29sZWFuIHNob3dGcm9tSW5jbHVkZXMpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBnZXRDb21wbGV4VHlwZXMoc2NoZW1hLCBzaG93RnJvbUluY2x1ZGVzKTsKLSAgICBsaXN0LmFkZEFsbChnZXRTaW1wbGVUeXBlcyhzY2hlbWEsIHNob3dGcm9tSW5jbHVkZXMpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlR3JvdXBMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEsIGJvb2xlYW4gc2hvd0Zyb21JbmNsdWRlcykKLSAgewotICAgIExpc3QgYXR0cmlidXRlR3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChpc1NhbWVOYW1lc3BhY2UoYXR0ckdyb3VwLmdldFRhcmdldE5hbWVzcGFjZSgpLCB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIChhdHRyR3JvdXAuZ2V0Um9vdENvbnRhaW5lcigpID09IHhzZFNjaGVtYSB8fCBzaG93RnJvbUluY2x1ZGVzKSkKLSAgICAgIHsKLSAgICAgICAgYXR0cmlidXRlR3JvdXBMaXN0LmFkZChhdHRyR3JvdXApOwotICAgICAgfQotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QoYXR0cmlidXRlR3JvdXBMaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVHcm91cExpc3QoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGVHcm91cExpc3QoeHNkU2NoZW1hLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEsIGJvb2xlYW4gc2hvd0Zyb21JbmNsdWRlcykKLSAgewotICAgIExpc3QgYXR0cmlidXRlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgbzsKLSAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhdHRyLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoYXR0ci5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9JTlNUQU5DRV9VUklfMjAwMSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoaXNTYW1lTmFtZXNwYWNlKGF0dHIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkgJiYgKGF0dHIuZ2V0Um9vdENvbnRhaW5lcigpID09IHhzZFNjaGVtYSB8fCBzaG93RnJvbUluY2x1ZGVzKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNMaXN0LmFkZChhdHRyKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzU2FtZU5hbWVzcGFjZShhdHRyLmdldFRhcmdldE5hbWVzcGFjZSgpLCB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIChhdHRyLmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEgfHwgc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGF0dHJpYnV0ZXNMaXN0LmFkZChhdHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgYXR0cmlidXRlc0xpc3QuYWRkQWxsKGdldEF0dHJpYnV0ZUdyb3VwTGlzdCh4c2RTY2hlbWEsIHNob3dGcm9tSW5jbHVkZXMpKTsKLSAgICAKLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QoYXR0cmlidXRlc0xpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gYWRhcHRlckxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUxpc3QoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGVMaXN0KHhzZFNjaGVtYSwgZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0U2ltcGxlVHlwZXMoWFNEU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBzaG93RnJvbUluY2x1ZGVzKQotICB7Ci0gICAgTGlzdCBhbGxUeXBlcyA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gYWxsVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdGQ7Ci0gICAgICAgIGlmIChpc1NhbWVOYW1lc3BhY2Uoc3QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSAmJiAoc3QuZ2V0Um9vdENvbnRhaW5lcigpID09IHNjaGVtYSB8fCBzaG93RnJvbUluY2x1ZGVzKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0U2ltcGxlVHlwZXMoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHJldHVybiBnZXRTaW1wbGVUeXBlcyhzY2hlbWEsIGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEdyb3VwcyhYU0RTY2hlbWEgc2NoZW1hLCBib29sZWFuIHNob3dGcm9tSW5jbHVkZXMpCi0gIHsKLSAgICBMaXN0IGdyb3VwcyA9IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ3JvdXBzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBncm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBpZiAoaXNTYW1lTmFtZXNwYWNlKGdyb3VwLmdldFRhcmdldE5hbWVzcGFjZSgpLHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkgJiYgKGdyb3VwLmdldFJvb3RDb250YWluZXIoKSA9PSBzY2hlbWEgfHwgc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gYWRhcHRlckxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEdyb3VwcyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgcmV0dXJuIGdldEdyb3VwcyhzY2hlbWEsIGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgQ29sbGVjdGlvbiBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uLklEKTsKLQotICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgICByZXR1cm4gKFN0cmluZyBbXSlhY3Rpb25JRHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBub3RpZnlMaXN0ZW5lcnMob2JqZWN0LCBwcm9wZXJ0eSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RGaWxlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwNDcwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJQWN0aW9uUHJvdmlkZXIsIElHcmFwaEVsZW1lbnQKLXsKLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBvYmplY3QgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSB0YXJnZXQ7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RJbXBvcnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RJbmNsdWRlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFJlZGVmaW5lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSB0YXJnZXQ7Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gICAgU3RyaW5nIGxvY2F0aW9uID0gZGlyZWN0aXZlLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24uZXF1YWxzKCIiKSApCi0gICAgewotICAgICAgcmVzdWx0ID0gIigiICsgTWVzc2FnZXMuX1VJX0xBQkVMX05PX0xPQ0FUSU9OX1NQRUNJRklFRCArICIpIjsgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBsb2NhdGlvbjsKLSAgICB9ICAKLQotICAgIC8vIG9ubHkgc2hvdyB0aGUgbmFtZXNwYWNlIHdoZW4gdGhlIGRpcmVjdGlhdmUgaXMgYW4gaW1wb3J0Ci0gICAgLy8gKG90aGVyd2lzZSB0aGUgbmFtZXNwYWNlIGlzIG9idmlvdXNseSB0aGUgc2FtZSBhcyB0aGUgY29udGFpbmluZyBzY2hlbWEncykKLSAgICBpZiAoZGlyZWN0aXZlIGluc3RhbmNlb2YgWFNESW1wb3J0KQotICAgIHsKLSAgICAgIFhTREltcG9ydCBpbXBvcnRPYmogPSAoWFNESW1wb3J0KSBkaXJlY3RpdmU7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gaW1wb3J0T2JqLmdldE5hbWVzcGFjZSgpOwotICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCArPSAiICB7IiArIG5hbWVzcGFjZSArICJ9IjsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIHsKLSAgICAgIFhTRFJlZGVmaW5lIHJlZGVmaW5lID0gKFhTRFJlZGVmaW5lKSB0YXJnZXQ7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZWRlZmluZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEUmVkZWZpbmVDb250ZW50IHJlZGVmaW5lQ29udGVudCA9IChYU0RSZWRlZmluZUNvbnRlbnQpIGkubmV4dCgpOwotICAgICAgICBpZiAocmVkZWZpbmVDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHx8Ci0gICAgICAgIAlyZWRlZmluZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHJlZGVmaW5lQ29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocmVkZWZpbmVDb250ZW50IGluc3RhbmNlb2YgWFNEUmVkZWZpbmFibGVDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCBjb21wID0gKFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50KSByZWRlZmluZUNvbnRlbnQ7Ci0gICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gfHwKLSAgICAgICAgICAgICAgY29tcCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHx8Ci0gICAgICAgICAgICAgIGNvbXAgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gfHwKLSAgICAgICAgICAgICAgY29tcCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKGNvbXApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChyZWRlZmluZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChyZWRlZmluZUNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJlZGVmaW5lQ29udGVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQocmVkZWZpbmVDb250ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgYWRhcHRlckxpc3QudG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIGxpc3QuYWRkKERlbGV0ZUFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmcgW10pbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICBYU0RTY2hlbWFEaXJlY3RpdmUgb2JqZWN0ID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkgdGFyZ2V0OwotICAgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZChvYmplY3QpOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBYU0RTY2hlbWEgb2JqZWN0ID0gKChYU0RTY2hlbWFEaXJlY3RpdmUpIHRhcmdldCkuZ2V0U2NoZW1hKCk7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChvYmplY3QpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgLy8gVGhlcmUgaXMgY3VycmVudGx5IG5vIGRyaWxsLWRvd24gZGV0YWlscyB2aWV3IG9mIGRpcmVjdGl2ZXMKLSAgICAvLyBUaGUgdG9wIGxldmVsIGNvbnRhaW5lciBpcyB0aGUgc2NoZW1hCi0gICAgcmV0dXJuIGdldE1vZGVsKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmYmFlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RWYXJpZXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTRFR5cGVEZWZpbml0aW9uQWRhcHRlcgotewotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L3NpbXBsZXR5cGVkaXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvc2ltcGxldHlwZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiBnZXRUZXh0KHRydWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KGJvb2xlYW4gc2hvd1R5cGUpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIHJlc3VsdC5hcHBlbmQoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpID09IG51bGwgPyBNZXNzYWdlcy5fVUlfTEFCRUxfTE9DQUxfVFlQRSA6IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICBpZiAoc2hvd1R5cGUpCi0gICAgewotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYmFzZVR5cGVEZWZpbml0aW9uID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoYmFzZVR5cGVEZWZpbml0aW9uICE9IG51bGwgJiYgWFNEVmFyaWV0eS5BVE9NSUNfTElURVJBTCA9PSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRWYXJpZXR5KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChiYXNlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpICE9IG51bGwgJiYgIXhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldENvbnRlbnRzKCkuY29udGFpbnMoYmFzZVR5cGVEZWZpbml0aW9uKSAmJiAhWFNEQ29uc3RhbnRzLmlzQW55U2ltcGxlVHlwZShiYXNlVHlwZURlZmluaXRpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKGJhc2VUeXBlRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbikpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGl0ZW1UeXBlRGVmaW5pdGlvbiA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEl0ZW1UeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBpZiAoaXRlbVR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXRlbVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiA6ICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGl0ZW1UeXBlRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IG1lbWJlclR5cGVEZWZpbml0aW9ucyA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpOwotICAgICAgICAgIGlmICghbWVtYmVyVHlwZURlZmluaXRpb25zLmlzRW1wdHkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbWVtYmVycyA9IG1lbWJlclR5cGVEZWZpbml0aW9ucy5pdGVyYXRvcigpOyBtZW1iZXJzLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIG1lbWJlclR5cGVEZWZpbml0aW9uID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBtZW1iZXJzLm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKG1lbWJlclR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiA6ICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIHwgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChtZW1iZXJUeXBlRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbikpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoTWVzc2FnZXMuX1VJX0xBQkVMX0FCU0VOVCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXhUeXBlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgaWYgKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBpc0Fub255bW91cygpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBPYmplY3Qgc2NoZW1hID0gZ2V0RWRpdG9yU2NoZW1hKCk7Ci0gICAgaWYgKGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChnZXRYU0RUeXBlRGVmaW5pdGlvbigpLmdldENvbnRhaW5lcigpID09IHNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICAKLSAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIHJldHVybiAhKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0WFNEVHlwZURlZmluaXRpb24oKSk7CQotICB9Ci0gIAotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIChJTW9kZWwpYWRhcHRlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE0MWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTRFR5cGVEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSVR5cGUsIElBY3Rpb25Qcm92aWRlciwgSUdyYXBoRWxlbWVudAotewotICBwdWJsaWMgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZURlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChYU0RUeXBlRGVmaW5pdGlvbil0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgaWYgKGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsgIAotICAgICAgcmV0dXJuIGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIEVPYmplY3QgbyA9IGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZUNvbnRhaW5lcigpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IGVkID0gKFhTRE5hbWVkQ29tcG9uZW50KW87Ci0gICAgICAgICByZXR1cm4gIigiICsgZWQuZ2V0TmFtZSgpICsgIlR5cGUpIjsgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0U3VwZXJUeXBlKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXRCYXNlVHlwZSgpOwotICAgIHJldHVybiB0ZCAhPSBudWxsID8gKElUeXBlKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQodGQpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTQxZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTRFZpc2l0b3IKLXsKLSAgcHVibGljIFhTRFZpc2l0b3IoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCA9IChYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oaWRlbnRpdHlDb25zdHJhaW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0cmlidXRlR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE5vdGF0aW9uRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNETm90YXRpb25EZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgaWYgKCFtb2RlbEdyb3VwRGVmLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpbzsKLSAgICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyVXNlLmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilvOwotICAgICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyR3JvdXAuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oWFNETm90YXRpb25EZWNsYXJhdGlvbiBub3RhdGlvbikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZUNvbnRlbnQoWFNEU2ltcGxlVHlwZURlZmluaXRpb24gY29udGVudCkKLSAgewotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlLmdldENvbnRlbnQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4Q29udGVudCA9IHR5cGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGNvbXBsZXhDb250ZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHZpc2l0Q29tcGxleFR5cGVDb250ZW50KChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb21wbGV4Q29udGVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICB2aXNpdFBhcnRpY2xlKChYU0RQYXJ0aWNsZSkgY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZShYU0RQYXJ0aWNsZSBwYXJ0aWNsZSkKLSAgewotICAgIHZpc2l0UGFydGljbGVDb250ZW50KHBhcnRpY2xlLmdldENvbnRlbnQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGVDb250ZW50KFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQpCi0gIHsKLSAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbigoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwKChYU0RNb2RlbEdyb3VwKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIHZpc2l0V2lsZGNhcmQoKFhTRFdpbGRjYXJkKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICB7Ci0gICAgaWYgKG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZShwYXJ0aWNsZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkKFhTRFdpbGRjYXJkIHdpbGRjYXJkKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFZpc2l0b3JGb3JGaWVsZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFZpc2l0b3JGb3JGaWVsZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyNmU5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RWaXNpdG9yRm9yRmllbGRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgWFNEVmlzaXRvckZvckZpZWxkcyBleHRlbmRzIFhTRFZpc2l0b3IKLXsKLSAgcHVibGljIFhTRFZpc2l0b3JGb3JGaWVsZHMoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBjb25jcmV0ZUNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHB1YmxpYyBMaXN0IHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KWl0ZXIubmV4dCgpOwotICAgICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSlhdHRyR3JvdXBDb250ZW50OwotICAgICAgICAgIAotICAgICAgICAgIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0clVzZS5nZXRDb250ZW50KCkpOwotCi0vLyAgICAgICAgICBpZiAoYXR0clVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpICE9IGF0dHJVc2UuZ2V0Q29udGVudCgpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHJVc2UuZ2V0Q29udGVudCgpKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoYXR0clVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLS8vICAgICAgICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChhdHRyVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotLy8gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilhdHRyR3JvdXBDb250ZW50OwotICAgICAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHJHcm91cCk7Ci0gICAgICAgICAgaWYgKGF0dHJHcm91cC5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJHcm91cCA9IGF0dHJHcm91cC5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0ckdyb3VwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlV2lsZGNhcmQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKHR5cGUuZ2V0QXR0cmlidXRlV2lsZGNhcmQoKSk7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKHR5cGUuZ2V0QXR0cmlidXRlV2lsZGNhcmQoKSk7Ci0gICAgfQotICAgIHN1cGVyLnZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlQ29udGVudChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBjb250ZW50KQotICB7Ci0gICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoY29udGVudCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZUNvbnRlbnQoY29udGVudCk7ICAgCi0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgaWYgKG1vZGVsR3JvdXBEZWYuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIC8vIGlmIGl0J3MgYSByZWZlcmVuY2Ugd2UgbmVlZCB0byBsaXN0ZW4gdG8gdGhlIHJlZmVyZW5jZSBpbmNhc2UgaXQgY2hhbmdlcwotICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQobW9kZWxHcm91cERlZik7ICAgICAgCi0gICAgfSAgICAKLSAgICAvLyBsaXN0ZW4gdG8gZGVmaW5pdGlvbiBpbmNhc2UgaXQgY2hhbmdlcwotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHJlc29sdmVkTW9kZWxHcm91cERlZiA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKHJlc29sdmVkTW9kZWxHcm91cERlZik7Ci0gICAgc3VwZXIudmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwRGVmKTsgICAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIHN1cGVyLnZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChtb2RlbEdyb3VwKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKW87Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoYXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilvOwotICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyR3JvdXApOwotICAgICAgICBpZiAoYXR0ckdyb3VwLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyR3JvdXAgPSBhdHRyR3JvdXAuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyR3JvdXApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIFhTRFdpbGRjYXJkIGFueUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCgpOwotICAgIGlmIChhbnlBdHRyaWJ1dGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGFueUF0dHJpYnV0ZSk7Ci0gICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhbnlBdHRyaWJ1dGUpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZShYU0RQYXJ0aWNsZSBwYXJ0aWNsZSkKLSAgewotICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKHBhcnRpY2xlKTsKLSAgICBzdXBlci52aXNpdFBhcnRpY2xlKHBhcnRpY2xlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgewotICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQod2lsZGNhcmQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGVsZW1lbnQpOwotICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgIC8vIG5vdywgYWRkIHRoZSByZWZlcmVuY2UgYXMgYSBmaWVsZAotICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChlbGVtZW50KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgIC8vIG5vdGUuLi4gd2UgaW50ZW50aW9uYWxseSBvbW1pdCB0aGUgY2FsbCB0byBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgICAvLyBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGRlbHZlIGRvd24gZGVlcGVyIHRoYW4gdGhlIGVsZW1lbnQgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikKLSAgewotICAgIGlmIChhdHRyLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyKTsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoYXR0cik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RXaWxkY2FyZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFdpbGRjYXJkQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDljMTQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFdpbGRjYXJkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRFdpbGRjYXJkQWRhcHRlciBleHRlbmRzIFhTRFBhcnRpY2xlQWRhcHRlciBpbXBsZW1lbnRzIElGaWVsZCwgSUFjdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50Ci17Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBTllFTEVNRU5UX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQW55LmdpZiIpOyAvLyROT04tTkxTLTEkCi0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBTllFTEVNRU5UX0RJU0FCTEVEX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQW55LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgWFNEV2lsZGNhcmRBZGFwdGVyKCkKLSAgewotCi0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZCA9IChYU0RXaWxkY2FyZCkgdGFyZ2V0OwotICAgIAotICAgIGlmICh4c2RXaWxkY2FyZC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREFueWRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQW55LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREFueUF0dHJpYnV0ZWRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTRFdpbGRjYXJkIHhzZFdpbGRjYXJkID0gKFhTRFdpbGRjYXJkKSB0YXJnZXQ7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZFdpbGRjYXJkLmdldEVsZW1lbnQoKTsKLQotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChlbGVtZW50LmdldE5vZGVOYW1lKCkpOwotICAgICAgYm9vbGVhbiBoYXNNaW5PY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUlOT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICBib29sZWFuIGhhc01heE9jY3VycyA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLQotICAgICAgaWYgKGhhc01pbk9jY3VycyB8fCBoYXNNYXhPY2N1cnMpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBbIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGhhc01pbk9jY3VycykKLSAgICAgICAgewotCi0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZFdpbGRjYXJkLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICBpZiAobWluID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWluKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZFdpbGRjYXJkLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoYXNNYXhPY2N1cnMpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSkgeHNkV2lsZGNhcmQuZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobWF4ID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKSB4c2RXaWxkY2FyZC5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtYXgpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIHRhcmdldDsKLSAgICByZXR1cm4geHNkV2lsZGNhcmQuZ2V0Q29udGFpbmVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotCSAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKChYU0RXaWxkY2FyZCkgdGFyZ2V0KTsJCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIHRhcmdldDsKLSAgICBpZiAoeHNkV2lsZGNhcmQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgewotICAgICAgcmV0dXJuICJlbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gImF0dHJpYnV0ZSI7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIFhTRFdpbGRjYXJkIHhzZFdpbGRjYXJkID0gKFhTRFdpbGRjYXJkKSB0YXJnZXQ7Ci0gICAgaWYgKHhzZFdpbGRjYXJkLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgIHsKLSAgICAgIHJldHVybiAiYW55IjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gImFueUF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIElUeXBlIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZVF1YWxpZmllcigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNYXhPY2N1cnNDb21tYW5kKGludCBtYXhPY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNaW5PY2N1cnNDb21tYW5kKGludCBtaW5PY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmFtZSkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIENvbGxlY3Rpb24gYWN0aW9uSURzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGFjdGlvbklEcy5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBhY3Rpb25JRHMuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldEdsb2JhbFhTRENvbnRhaW5lcigoWFNEV2lsZGNhcmQpIHRhcmdldCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0Jhc2VEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0Jhc2VEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRhOGVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9CYXNlRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUm91bmRlZFJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuTW92ZVhTREJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkJhc2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5Db25uZWN0YWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RCYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgQUJPVkVfSVNfQ0xPU0VSID0gMDsKLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgQkVMT1dfSVNfQ0xPU0VSID0gMTsKLSAgCi0gIHByb3RlY3RlZCBFZGl0UGFydFZpZXdlciB2aWV3ZXI7ICAgIAotICBwcm90ZWN0ZWQgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FeGVjdXRlOwotICBwcm90ZWN0ZWQgR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0OwotICAKLSAgcHJvdGVjdGVkIEdyYXBoaWNhbEVkaXRQYXJ0IGxlZnRTaWJsaW5nRWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBHcmFwaGljYWxFZGl0UGFydCByaWdodFNpYmxpbmdFZGl0UGFydDsKLSAgcHJvdGVjdGVkIFBvaW50IGxvY2F0aW9uOwotCi0gIHByb3RlY3RlZCBDb25uZWN0YWJsZUVkaXRQYXJ0IHBhcmVudEVkaXRQYXJ0OwotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgcHJldmlvdXNSZWZDb21wb25lbnQgPSBudWxsLCBuZXh0UmVmQ29tcG9uZW50ID0gbnVsbCwgeHNkQ29tcG9uZW50VG9EcmFnOwotICBwcm90ZWN0ZWQgWFNEQmFzZUZpZWxkRWRpdFBhcnQgaXRlbVRvRHJhZzsKLSAgcHJvdGVjdGVkIFJlY3RhbmdsZSBvcmlnaW5hbExvY2F0aW9uOwotICBwcm90ZWN0ZWQgUG9seWxpbmUgcG9seUxpbmU7Ci0gIAotICBwcm90ZWN0ZWQgTW92ZVhTREJhc2VBY3Rpb24gYWN0aW9uOwotICBwcm90ZWN0ZWQgTGlzdCB0YXJnZXRTcGFjZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgaW50IGNsb3NlclNpYmxpbmc7Ci0gIAotICBwdWJsaWMgQmFzZURyYWdBbmREcm9wQ29tbWFuZChFZGl0UGFydFZpZXdlciB2aWV3ZXIsIENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOyAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0dXAoKTsKLSAKLSAgcHVibGljIFBvaW50TGlzdCBnZXRDb25uZWN0aW9uUG9pbnRzKFJlY3RhbmdsZSBkcmFnZ2VkRmlndXJlQm91bmRzKQotICB7Ci0gICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IG51bGw7Ci0gICAgaWYgKHRhcmdldCAhPSBudWxsICYmIGl0ZW1Ub0RyYWcgIT0gbnVsbCAmJiBwYXJlbnRFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIHBvaW50TGlzdCA9IGdldENvbm5lY3Rpb25Qb2ludHMocGFyZW50RWRpdFBhcnQsIGl0ZW1Ub0RyYWcsIGRyYWdnZWRGaWd1cmVCb3VuZHMpOwotICAgIH0KLSAgICByZXR1cm4gcG9pbnRMaXN0ICE9IG51bGwgPyBwb2ludExpc3QgOiBuZXcgUG9pbnRMaXN0KCk7Ci0gIH0KLSAgCi0gIC8vIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHRoZSBwcmV2aWV3IGNvbm5lY3Rpb24gbGluZSBmdW5jdGlvbiByZWxhdGVkIHRvIGRyYWcgYW5kIGRyb3AKLSAgLy8gICAgIAotICBwdWJsaWMgUG9pbnRMaXN0IGdldENvbm5lY3Rpb25Qb2ludHMoQ29ubmVjdGFibGVFZGl0UGFydCBwYXJlbnRFZGl0UGFydCwgQmFzZUZpZWxkRWRpdFBhcnQgY2hpbGRSZWZFZGl0UGFydCwgUmVjdGFuZ2xlIGRyYWdnZWRGaWd1cmVCb3VuZHMpCi0gIHsgICAgICAgICAgIAotICAgIFBvaW50TGlzdCBwb2ludExpc3QgPSBuZXcgUG9pbnRMaXN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGludFtdIGRhdGEgPSBuZXcgaW50WzFdOwotICAgIFBvaW50IGEgPSBnZXRDb25uZWN0aW9uUG9pbnQocGFyZW50RWRpdFBhcnQsIGNoaWxkUmVmRWRpdFBhcnQsIGRhdGEpOwotICAgIGlmIChhICE9IG51bGwpCi0gICAgeyAgIAotICAgICAgaW50IGRyYWdnZWRGaWd1cmVCb3VuZHNZID0gZHJhZ2dlZEZpZ3VyZUJvdW5kcy55ICsgZHJhZ2dlZEZpZ3VyZUJvdW5kcy5oZWlnaHQvMjsKLQotICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KGEpOyAKLSAgICAgIAotICAgICAgaWYgKGRhdGFbMF0gPT0gMCkgLy8gaW5zZXJ0IGJldHdlZW4gMiBpdGVtcwotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCB4ID0gYS54ICsgNTsKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludCh4LCBhLnkpKTsKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludCh4LCBkcmFnZ2VkRmlndXJlQm91bmRzWSkpOyAgICAgICAgCi0gICAgICAgIHBvaW50TGlzdC5hZGRQb2ludChuZXcgUG9pbnQoZHJhZ2dlZEZpZ3VyZUJvdW5kcy54LCBkcmFnZ2VkRmlndXJlQm91bmRzWSkpOwotICAgICAgfQotICAgICAgZWxzZSAvLyBpbnNlcnQgYXQgZmlyc3Qgb3IgbGFzdCBwb3NpdGlvbgotICAgICAgewotICAgICAgICBwb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KGEueCwgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kpKTsgICAKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludChkcmFnZ2VkRmlndXJlQm91bmRzLngsIGRyYWdnZWRGaWd1cmVCb3VuZHNZKSk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAKLSAgICByZXR1cm4gcG9pbnRMaXN0OwotICB9Ci0KLSAgLy8gVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIHByZXZpZXcgY29ubmVjdGlvbiBsaW5lIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gZHJhZyBhbmQgZHJvcAotICAvLyAgICAgCi0gIHByb3RlY3RlZCBQb2ludCBnZXRDb25uZWN0aW9uUG9pbnQoQ29ubmVjdGFibGVFZGl0UGFydCBwYXJlbnRFZGl0UGFydCwgQmFzZUZpZWxkRWRpdFBhcnQgY2hpbGRSZWZFZGl0UGFydCwgaW50W10gZGF0YSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBQb2ludCBwb2ludCA9IG51bGw7ICAgICAKLSAgICBMaXN0IGNoaWxkTGlzdCA9IHBhcmVudEVkaXRQYXJ0LmdldENoaWxkcmVuKCk7ICAgICAgICAgCi0gICAgaWYgKHBhcmVudEVkaXRQYXJ0LmdldEZpZ3VyZSgpIGluc3RhbmNlb2YgR2VuZXJpY0dyb3VwRmlndXJlICYmIGNoaWxkTGlzdC5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIHBvaW50ID0gbmV3IFBvaW50KCk7Ci0KLSAgICAgIFJlY3RhbmdsZSByID0gZ2V0Q29ubmVjdGVkRWRpdFBhcnRDb25uZWN0aW9uQm91bmRzKHBhcmVudEVkaXRQYXJ0KTsgIAotICAgICAgcG9pbnQueCA9IHIueCArIHIud2lkdGg7Ci0gICAgICBwb2ludC55ID0gci55ICsgci5oZWlnaHQvMjsKLSAgICB9ICAgIAotICAgIHJldHVybiBwb2ludDsKLSAgfQotCi0gIHByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0Q29ubmVjdGVkRWRpdFBhcnRDb25uZWN0aW9uQm91bmRzKENvbm5lY3RhYmxlRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0Wm9vbWVkQm91bmRzKCgoR2VuZXJpY0dyb3VwRmlndXJlKWVkaXRQYXJ0LmdldEZpZ3VyZSgpKS5nZXRJY29uRmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHJlZG8oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBpZiAoY2FuRXhlY3V0ZSkKLSAgICB7Ci0gICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLSAgewotICAgIHJldHVybiBjYW5FeGVjdXRlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjb21tb25TZXR1cChMaXN0IHNpYmxpbmdzLCBHcmFwaGljYWxFZGl0UGFydCBtb3ZpbmdFZGl0UGFydCkKLSAgewotICAgIGNsb3NlclNpYmxpbmcgPSBBQk9WRV9JU19DTE9TRVI7Ci0gICAgaW50IHBvaW50ZXJZTG9jYXRpb24gPSBsb2NhdGlvbi55OwotICAgIGludCBpbmRleDsKLSAgICAKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzaWJsaW5ncy5zaXplKCk7IGluZGV4KyspCi0gICAgewotICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgc2libGluZyA9IChHcmFwaGljYWxFZGl0UGFydCkgc2libGluZ3MuZ2V0KGluZGV4KTsKLSAgICAgIGlmIChzaWJsaW5nIGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGludCBzaWJsaW5nWUxvY2F0aW9uID0gZ2V0Wm9vbWVkQm91bmRzKHNpYmxpbmcuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkpLmdldENlbnRlcigpLnk7Ci0KLSAgICAgICAgaWYgKHNpYmxpbmdZTG9jYXRpb24gPiBwb2ludGVyWUxvY2F0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgcmlnaHRTaWJsaW5nRWRpdFBhcnQgPSBzaWJsaW5nOwotICAgICAgICAgIGlmIChpbmRleCA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgbGVmdFNpYmxpbmdFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgc2libGluZ3MuZ2V0KGluZGV4IC0gMSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgIT0gbnVsbCAmJiBNYXRoLmFicyhnZXRab29tZWRCb3VuZHMobGVmdFNpYmxpbmdFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSkuZ2V0Q2VudGVyKCkueSAtIHBvaW50ZXJZTG9jYXRpb24pID4gTWF0aC5hYnMoc2libGluZ1lMb2NhdGlvbiAtIHBvaW50ZXJZTG9jYXRpb24pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNsb3NlclNpYmxpbmcgPSBCRUxPV19JU19DTE9TRVI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc0hhbmRsZWQgPSBoYW5kbGVGaXJzdEFuZExhc3REcm9wVGFyZ2V0cyhpbmRleCwgc2libGluZ3MpOwotICAgIGlmICghaXNIYW5kbGVkKQotICAgICAgaGFuZGxlT3RoZXJUYXJnZXRzKGluZGV4KTsKLQotICAgIGNhbGN1bGF0ZUxlZnRBbmRSaWdodFhTRENvbXBvbmVudHMoKTsKLSAgICAKLSAgICB4c2RDb21wb25lbnRUb0RyYWcgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpIGl0ZW1Ub0RyYWcuZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjYWxjdWxhdGVMZWZ0QW5kUmlnaHRYU0RDb21wb25lbnRzKCkKLSAgewotICAgIGlmIChsZWZ0U2libGluZ0VkaXRQYXJ0IGluc3RhbmNlb2YgWFNEQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgewotICAgICAgT2JqZWN0IGxlZnRNb2RlbCA9ICgoWFNEQmFzZUZpZWxkRWRpdFBhcnQpIGxlZnRTaWJsaW5nRWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0gICAgICBwcmV2aW91c1JlZkNvbXBvbmVudCA9IG51bGw7Ci0gICAgICBpZiAobGVmdE1vZGVsIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIFhTREJhc2VBZGFwdGVyIGxlZnRBZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKSBsZWZ0TW9kZWw7Ci0gICAgICAgIHByZXZpb3VzUmVmQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBsZWZ0QWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmlnaHRTaWJsaW5nRWRpdFBhcnQgaW5zdGFuY2VvZiBYU0RCYXNlRmllbGRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBPYmplY3QgcmlnaHRNb2RlbCA9ICgoWFNEQmFzZUZpZWxkRWRpdFBhcnQpIHJpZ2h0U2libGluZ0VkaXRQYXJ0KS5nZXRNb2RlbCgpOwotICAgICAgbmV4dFJlZkNvbXBvbmVudCA9IG51bGw7Ci0gICAgICBpZiAocmlnaHRNb2RlbCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBYU0RCYXNlQWRhcHRlciByaWdodEFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpIHJpZ2h0TW9kZWw7Ci0gICAgICAgIG5leHRSZWZDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIHJpZ2h0QWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZUZpcnN0QW5kTGFzdERyb3BUYXJnZXRzKGludCBpbmRleCwgTGlzdCBzaWJsaW5ncykKLSAgewotICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIHlvdSBkcm9wIHRvIGZpcnN0IHBvc2l0aW9uCi0gICAgaWYgKGluZGV4ID09IDAgJiYgc2libGluZ3Muc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBsZWZ0U2libGluZ0VkaXRQYXJ0ID0gbnVsbDsKLSAgICAgIHJpZ2h0U2libGluZ0VkaXRQYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoMCk7Ci0gICAgICBjbG9zZXJTaWJsaW5nID0gQkVMT1dfSVNfQ0xPU0VSOwotICAgIH0KLSAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSB5b3UgZHJvcCB0byBsYXN0IHBvc2l0aW9uCi0gICAgZWxzZSBpZiAoaW5kZXggPiAwICYmIGluZGV4ID09IHNpYmxpbmdzLnNpemUoKSkKLSAgICB7Ci0gICAgICBsZWZ0U2libGluZ0VkaXRQYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXggLSAxKTsKLSAgICAgIHJpZ2h0U2libGluZ0VkaXRQYXJ0ID0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlT3RoZXJUYXJnZXRzKGludCBpbmRleCkKLSAgewotICAgIGludCBpbiA9IDA7Ci0gICAgQ29ubmVjdGFibGVFZGl0UGFydCBwcmV2aW91c01vZGVsRWRpdFBhcnQgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHRhcmdldFNwYWNlc0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBwcmV2aW91c01vZGVsRWRpdFBhcnQgPSBwYXJlbnRFZGl0UGFydDsKLSAgICAgIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQgc3AgPSAoVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkgbzsKLSAgICAgIGlmIChzcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIENvbm5lY3RhYmxlRWRpdFBhcnQpCi0gICAgICAgIHBhcmVudEVkaXRQYXJ0ID0gKENvbm5lY3RhYmxlRWRpdFBhcnQpc3AuZ2V0UGFyZW50KCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHBhcmVudEVkaXRQYXJ0ID0gbnVsbDsKLSAgICAgIGluKys7Ci0gICAgICBpZiAoaW4gPiBpbmRleCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNsb3NlclNpYmxpbmcgPT0gQUJPVkVfSVNfQ0xPU0VSKQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50RWRpdFBhcnQgPSBwcmV2aW91c01vZGVsRWRpdFBhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgY2FsY3VsYXRlRmllbGRFZGl0UGFydHMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gdGFyZ2V0LmdldFBhcmVudCgpLmdldENoaWxkcmVuKCk7Ci0gICAgTGlzdCBsaXN0T2ZGaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGxpc3RPZkZpZWxkcy5hZGQobyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0T2ZGaWVsZHM7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBQb2ludExpc3QgZHJhd0xpbmVzKFBvbHlsaW5lIHBvbHlMaW5lKQotICB7Ci0gICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IG5ldyBQb2ludExpc3QoKTsKLQotICAgIGlmIChsZWZ0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgUmVjdGFuZ2xlIGxlZnRSZWN0YW5nbGUgPSBnZXRab29tZWRCb3VuZHMobGVmdFNpYmxpbmdFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0gICAgICBpbnQgeENvb3JkID0gbGVmdFJlY3RhbmdsZS54OwotICAgICAgaW50IHlDb29yZCA9IGxlZnRSZWN0YW5nbGUueTsKLSAgICAgIGludCBoZWlnaHQgPSBsZWZ0UmVjdGFuZ2xlLmhlaWdodDsKLSAgICAgIGludCB3aWR0aCA9IGxlZnRSZWN0YW5nbGUud2lkdGg7Ci0KLSAgICAgIC8vIERyYXcgbGVmdCBlbmQgbGluZQotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0ICsgMywgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQgLSAzKTsKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCAtIDMsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0KTsKLQotICAgICAgLy8gRHJhdyBob3Jpem9udGFsIGxpbmUKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIGhlaWdodCk7Ci0KLSAgICAgIC8vIERyYXcgcmlnaHQgZW5kIGxpbmUKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0LCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0IC0gMyk7Ci0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIGhlaWdodCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIGhlaWdodCArIDMpOwotICAgIH0KLSAgICBlbHNlIGlmIChyaWdodFNpYmxpbmdFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIFJlY3RhbmdsZSByaWdodFJlY3RhbmdsZSA9IGdldFpvb21lZEJvdW5kcyhyaWdodFNpYmxpbmdFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0gICAgICBpbnQgeENvb3JkID0gcmlnaHRSZWN0YW5nbGUueDsKLSAgICAgIGludCB5Q29vcmQgPSByaWdodFJlY3RhbmdsZS55OwotICAgICAgaW50IHdpZHRoID0gcmlnaHRSZWN0YW5nbGUud2lkdGg7Ci0KLSAgICAgIC8vIERyYXcgbGVmdCBlbmQgbGluZQotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgMywgeENvb3JkLCB5Q29vcmQgLSAzKTsKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCAtIDMsIHhDb29yZCwgeUNvb3JkKTsKLQotICAgICAgLy8gRHJhdyBob3Jpem9udGFsIGxpbmUKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQsIHlDb29yZCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCk7Ci0KLSAgICAgIC8vIERyYXcgcmlnaHQgZW5kIGxpbmUKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkIC0gMyk7Ci0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkICsgd2lkdGgsIHlDb29yZCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIDMpOwotICAgIH0KLQotICAgIHJldHVybiBwb2ludExpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgUG9seWxpbmUgYWRkTGluZVRvUG9seWxpbmUoUG9seWxpbmUgcG9seWxpbmUsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikKLSAgewotICAgIHBvbHlsaW5lLmFkZFBvaW50KG5ldyBQb2ludCh4MSwgeTEpKTsKLSAgICBwb2x5bGluZS5hZGRQb2ludChuZXcgUG9pbnQoeDIsIHkyKSk7Ci0KLSAgICByZXR1cm4gcG9seWxpbmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldEZlZWRiYWNrRmlndXJlKCkKLSAgewotICAgIEZpZ3VyZSBwYW5lbCA9IG5ldyBGaWd1cmUoKTsKLSAgICBwYW5lbC5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGcmVlZm9ybUxheW91dCgpKTsKLSAgICBwYW5lbC5zZXRPcGFxdWUoZmFsc2UpOwotCi0gICAgUG9seWxpbmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUG9seWxpbmUoKTsKLSAgICBmZWVkYmFja0ZpZ3VyZS5zZXRMaW5lV2lkdGgoMik7Ci0gICAgZHJhd0xpbmVzKGZlZWRiYWNrRmlndXJlKTsKLSAgICBvcmlnaW5hbExvY2F0aW9uID0gbmV3IFJlY3RhbmdsZShmZWVkYmFja0ZpZ3VyZS5nZXRCb3VuZHMoKSk7Ci0gICAgcGFuZWwuYWRkKGZlZWRiYWNrRmlndXJlKTsKLQotICAgIHBvbHlMaW5lID0gbmV3IFBvbHlsaW5lKCk7Ci0gICAgcG9seUxpbmUuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfREFTSERPVCk7Ci0gICAgcG9seUxpbmUuc2V0TGluZVdpZHRoKDEpOwotICAgIHBhbmVsLmFkZChwb2x5TGluZSk7Ci0gICAgCi0gICAgcGFuZWwuc2V0Qm91bmRzKG9yaWdpbmFsTG9jYXRpb24pOwotICAgIAotICAgIGFkZENvbm5lY3RvclRvUGFyZW50KHBhbmVsKTsKLQotICAgIGlmIChwYXJlbnRFZGl0UGFydCAhPSBudWxsICYmIHBhcmVudEVkaXRQYXJ0LmdldEZpZ3VyZSgpIGluc3RhbmNlb2YgR2VuZXJpY0dyb3VwRmlndXJlKQotICAgIHsKLSAgICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBmaWcgPSAoR2VuZXJpY0dyb3VwRmlndXJlKXBhcmVudEVkaXRQYXJ0LmdldEZpZ3VyZSgpOwotICAgICAgUmVjdGFuZ2xlIGljb25Cb3VuZHMgPSBnZXRab29tZWRCb3VuZHMoZmlnLmdldEljb25GaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0gICAgICBSb3VuZGVkUmVjdGFuZ2xlIHJvdW5kZWRSZWN0YW5nbGUgPSBuZXcgUm91bmRlZFJlY3RhbmdsZSgpOwotICAgICAgcm91bmRlZFJlY3RhbmdsZS5zZXRGaWxsKGZhbHNlKTsKLSAgICAgIHJvdW5kZWRSZWN0YW5nbGUuc2V0T3BhcXVlKHRydWUpOwotLy8gICAgICByb3VuZGVkUmVjdGFuZ2xlLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKGljb25Cb3VuZHMueCwgaWNvbkJvdW5kcy55LCBpY29uQm91bmRzLndpZHRoIC0gMSwgaWNvbkJvdW5kcy5oZWlnaHQgLSAxKSk7Ci0gICAgICByb3VuZGVkUmVjdGFuZ2xlLnNldEJvdW5kcyhpY29uQm91bmRzKTsKLSAgICAgIHBhbmVsLmFkZChyb3VuZGVkUmVjdGFuZ2xlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhbmVsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0b3JUb1BhcmVudChJRmlndXJlIHApCi0gIHsKLSAgICBSZWN0YW5nbGUgciA9IG9yaWdpbmFsTG9jYXRpb24uZ2V0Q29weSgpOwotICAgIFJlY3RhbmdsZSBwQm91bmRzID0gci5nZXRDb3B5KCk7Ci0gICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IGdldENvbm5lY3Rpb25Qb2ludHMocik7Ci0KLSAgICBpZiAocG9pbnRMaXN0ICE9IG51bGwgJiYgcG9pbnRMaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgcG9seUxpbmUuc2V0UG9pbnRzKHBvaW50TGlzdCk7Ci0gICAgICBQb2ludCBmaXJzdFBvaW50ID0gcG9pbnRMaXN0LmdldEZpcnN0UG9pbnQoKTsKLSAgICAgIGlmIChmaXJzdFBvaW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHBCb3VuZHMgPSBwQm91bmRzLmdldFVuaW9uKG5ldyBSZWN0YW5nbGUoZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnksIDEsIDEpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocGFyZW50RWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBHZW5lcmljR3JvdXBGaWd1cmUpCi0gICAgICB7Ci0gICAgICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBmaWcgPSAoR2VuZXJpY0dyb3VwRmlndXJlKXBhcmVudEVkaXRQYXJ0LmdldEZpZ3VyZSgpOwotICAgICAgICBSZWN0YW5nbGUgaWNvbkJvdW5kcyA9IGdldFpvb21lZEJvdW5kcyhmaWcuZ2V0SWNvbkZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLSAgICAgICAgcEJvdW5kcyA9IHBCb3VuZHMuZ2V0VW5pb24oaWNvbkJvdW5kcyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcC5zZXRCb3VuZHMocEJvdW5kcyk7Ci0gICAgcC52YWxpZGF0ZSgpOwotICB9Ci0gIAotICBwdWJsaWMgUG9pbnQgZ2V0Wm9vbWVkUG9pbnQoUG9pbnQgcCkKLSAgewotICAgIGRvdWJsZSBmYWN0b3IgPSAoKFNjYWxhYmxlUm9vdEVkaXRQYXJ0KXZpZXdlci5nZXRSb290RWRpdFBhcnQoKSkuZ2V0Wm9vbU1hbmFnZXIoKS5nZXRab29tKCk7Ci0KLSAgICBpbnQgeCA9IChpbnQpTWF0aC5yb3VuZChwLnggKiBmYWN0b3IpOwotICAgIGludCB5ID0gKGludClNYXRoLnJvdW5kKHAueSAqIGZhY3Rvcik7Ci0KLSAgICByZXR1cm4gbmV3IFBvaW50KHgsIHkpOwotICB9Ci0gIAotICBwdWJsaWMgUmVjdGFuZ2xlIGdldFpvb21lZEJvdW5kcyhSZWN0YW5nbGUgcikKLSAgewotICAgIGRvdWJsZSBmYWN0b3IgPSAoKFNjYWxhYmxlUm9vdEVkaXRQYXJ0KXZpZXdlci5nZXRSb290RWRpdFBhcnQoKSkuZ2V0Wm9vbU1hbmFnZXIoKS5nZXRab29tKCk7Ci0KLSAgICBpbnQgeCA9IChpbnQpTWF0aC5yb3VuZChyLnggKiBmYWN0b3IpOwotICAgIGludCB5ID0gKGludClNYXRoLnJvdW5kKHIueSAqIGZhY3Rvcik7Ci0gICAgaW50IHdpZHRoID0gKGludClNYXRoLnJvdW5kKHIud2lkdGggKiBmYWN0b3IpOwotICAgIGludCBoZWlnaHQgPSAoaW50KU1hdGgucm91bmQoci5oZWlnaHQgKiBmYWN0b3IpOwotCi0gICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVLZXlib2FyZERyYWdBbmREcm9wKFhTREJhc2VGaWVsZEVkaXRQYXJ0IGxlZnRGaWVsZCwgWFNEQmFzZUZpZWxkRWRpdFBhcnQgcmlnaHRGaWVsZCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIHRhcmdldCA9IGxlZnRGaWVsZDsKLSAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKQotICAgIHsKLSAgICAgIGlmIChpdGVtVG9EcmFnID09IHRhcmdldCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgdGFyZ2V0ID0gcmlnaHRGaWVsZDsKLSAgICB9Ci0gICAgdGhpcy5sb2NhdGlvbiA9IG51bGw7Ci0gICAgaWYgKHRhcmdldCAhPSBudWxsKQotICAgICAgdGhpcy5sb2NhdGlvbiA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9YU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MGRmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9YU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLk1vdmVYU0RBdHRyaWJ1dGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RXaWxkY2FyZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Db21wbGV4VHlwZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5BdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEQXR0cmlidXRlc0ZvckFubm90YXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBCYXNlRHJhZ0FuZERyb3BDb21tYW5kCi17Ci0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsIEdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldCwgWFNEQmFzZUZpZWxkRWRpdFBhcnQgaXRlbVRvRHJhZywgUG9pbnQgbG9jYXRpb24pCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIsIHJlcXVlc3QpOwotICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICAgIHRoaXMuaXRlbVRvRHJhZyA9IGl0ZW1Ub0RyYWc7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICAgIHNldHVwKCk7Ci0gIH0KLQotICBwdWJsaWMgWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kKFhTREJhc2VGaWVsZEVkaXRQYXJ0IGl0ZW1Ub0RyYWcsIFhTREJhc2VGaWVsZEVkaXRQYXJ0IGxlZnRGaWVsZCwgWFNEQmFzZUZpZWxkRWRpdFBhcnQgcmlnaHRGaWVsZCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIHN1cGVyKGl0ZW1Ub0RyYWcuZ2V0Vmlld2VyKCksIG51bGwpOyAKLSAgICB0aGlzLml0ZW1Ub0RyYWcgPSBpdGVtVG9EcmFnOwotICAgIGNhbkV4ZWN1dGUgPSBmYWxzZTsKLSAgICBoYW5kbGVLZXlib2FyZERyYWdBbmREcm9wKGxlZnRGaWVsZCwgcmlnaHRGaWVsZCwgZGlyZWN0aW9uKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlS2V5Ym9hcmREcmFnQW5kRHJvcChYU0RCYXNlRmllbGRFZGl0UGFydCBsZWZ0RmllbGQsIFhTREJhc2VGaWVsZEVkaXRQYXJ0IHJpZ2h0RmllbGQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5oYW5kbGVLZXlib2FyZERyYWdBbmREcm9wKGxlZnRGaWVsZCwgcmlnaHRGaWVsZCwgZGlyZWN0aW9uKTsKLSAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKQotICAgIHsKLSAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gcmlnaHRGaWVsZDsKLSAgICAgICAgdGhpcy5sb2NhdGlvbiA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRUb3AoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCEobGVmdEZpZWxkLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgICAgICAgIHx8IGxlZnRGaWVsZC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEV2lsZGNhcmRBZGFwdGVyKQotICAgICAgewotICAgICAgICB0YXJnZXQgPSByaWdodEZpZWxkOwotICAgICAgICB0aGlzLmxvY2F0aW9uID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldFRvcCgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuOwotICAgIHNldHVwKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldHVwKCkKLSAgewotICAgIGNhbkV4ZWN1dGUgPSBmYWxzZTsKLQotICAgIC8vIERyb3AgdGFyZ2V0IGlzIGF0dHJpYnV0ZSBncm91cCByZWYKLSAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgewotICAgICAgcGFyZW50RWRpdFBhcnQgPSAoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIHRhcmdldDsKLSAgICAgIGlmICgoKEdlbmVyaWNHcm91cEZpZ3VyZSkgcGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCkpLmdldEljb25GaWd1cmUoKS5nZXRCb3VuZHMoKS5jb250YWlucyhsb2NhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHhzZENvbXBvbmVudFRvRHJhZyA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIpIGl0ZW1Ub0RyYWcuZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKCgoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIHBhcmVudEVkaXRQYXJ0KS5nZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKSwgeHNkQ29tcG9uZW50VG9EcmFnLCBudWxsLCBudWxsKTsKLSAgICAgICAgY2FuRXhlY3V0ZSA9IGFjdGlvbi5jYW5Nb3ZlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJhc2VGaWVsZEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIHRhcmdldFNwYWNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAvLyBDYWxjdWxhdGUgdGhlIGxpc3Qgb2YgYWxsIHNpYmxpbmcgZmllbGQgZWRpdCBwYXJ0czsKLSAgICAgIExpc3QgdGFyZ2V0RWRpdFBhcnRTaWJsaW5ncyA9IGNhbGN1bGF0ZUZpZWxkRWRpdFBhcnRzKCk7Ci0gICAgICBjYWxjdWxhdGVBdHRyaWJ1dGVHcm91cExpc3QoKTsKLQotICAgICAgLy8gR2V0ICdsZWZ0JyBhbmQgJ3JpZ2h0JyBzaWJsaW5ncwotICAgICAgZG9Ecm9wKHRhcmdldEVkaXRQYXJ0U2libGluZ3MsIGl0ZW1Ub0RyYWcpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvRHJvcChMaXN0IHNpYmxpbmdzLCBHcmFwaGljYWxFZGl0UGFydCBtb3ZpbmdFZGl0UGFydCkKLSAgewotICAgIGNvbW1vblNldHVwKHNpYmxpbmdzLCBtb3ZpbmdFZGl0UGFydCk7Ci0KLSAgICBpZiAoKHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gfHwgcHJldmlvdXNSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkgCi0gICAgICAgICYmIChuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gfHwgbmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKSkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBwcmV2aW91c1JlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChjbG9zZXJTaWJsaW5nID09IEJFTE9XX0lTX0NMT1NFUikKLSAgICAgIHsKLSAgICAgICAgcGFyZW50ID0gbmV4dFJlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLSAgICAgIH0KLSAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByZXZpb3VzUmVmQ29tcG9uZW50ID09IG51bGwgJiYgKG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB8fCBuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IG5leHRSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY2xvc2VyU2libGluZyA9PSBBQk9WRV9JU19DTE9TRVIpCi0gICAgICB7Ci0gICAgICAgIGlmIChsZWZ0U2libGluZ0VkaXRQYXJ0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihwYXJlbnQsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudEVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihwYXJlbnRFZGl0UGFydC5nZXRYU0RDb25jcmV0ZUNvbXBvbmVudCgpLCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihwYXJlbnQsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uICYmIG5leHRSZWZDb21wb25lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBwcmV2aW91c1JlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChjbG9zZXJTaWJsaW5nID09IEFCT1ZFX0lTX0NMT1NFUikKLSAgICAgIHsKLSAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24ocGFyZW50LCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHJpZ2h0U2libGluZ0VkaXRQYXJ0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihwYXJlbnQsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICBjYW5FeGVjdXRlID0gYWN0aW9uLmNhbk1vdmUoKTsKLSAgfQotCi0gIAotICAvLyBBdHRyaWJ1dGUgR3JvdXAgcmVsYXRlZCBoZWxwZXIgbWV0aG9kIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgY2FsY3VsYXRlQXR0cmlidXRlR3JvdXBMaXN0KCkKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gdGFyZ2V0OwotICAgIHdoaWxlIChlZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbXBsZXhUeXBlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IGNoaWxkID0gaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29tcGFydG1lbnRFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IGNvbXBhcnRtZW50TGlzdCA9ICgoQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29tcGFydG1lbnRMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNEQXR0cmlidXRlc0ZvckFubm90YXRpb25FZGl0UGFydCBncm91cHMgPSAoWFNEQXR0cmlidXRlc0ZvckFubm90YXRpb25FZGl0UGFydCkgb2JqOwotICAgICAgICAgICAgICAgIExpc3QgZ3JvdXBMaXN0ID0gZ3JvdXBzLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ3JvdXBMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBPYmplY3QgZ3JvdXBDaGlsZCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwQ2hpbGQgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXRTcGFjZXNMaXN0LmFkZChncm91cENoaWxkKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGdyb3VwQ2hpbGQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0QXR0cmlidXRlR3JvdXBFZGl0UGFydHMoKEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KSBncm91cENoaWxkKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0gICAgfQotCi0gIH0KLQotICAvLyBBdHRyaWJ1dGUgR3JvdXAgcmVsYXRlZCBoZWxwZXIgbWV0aG9kCi0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRBdHRyaWJ1dGVHcm91cEVkaXRQYXJ0cyhBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCBhdHRyaWJ1dGVHcm91cEVkaXRQYXJ0KQotICB7Ci0gICAgTGlzdCBncm91cExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBsaXN0ID0gYXR0cmlidXRlR3JvdXBFZGl0UGFydC5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBpLm5leHQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICB0YXJnZXRTcGFjZXNMaXN0LmFkZChvYmplY3QpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0IGdyb3VwUmVmID0gKEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KSBvYmplY3Q7Ci0gICAgICAgIExpc3QgZ3JvdXBSZWZDaGlsZHJlbiA9IGdyb3VwUmVmLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBncm91cFJlZkNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0U3BhY2VzTGlzdC5hZGQobyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCBhR3JvdXAgPSAoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIG87Ci0gICAgICAgICAgICBncm91cExpc3QuYWRkKGFHcm91cCk7Ci0gICAgICAgICAgICBncm91cExpc3QuYWRkQWxsKGdldEF0dHJpYnV0ZUdyb3VwRWRpdFBhcnRzKGFHcm91cCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZ3JvdXBMaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9YU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9YU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTc0OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuTW92ZVhTREVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEV2lsZGNhcmRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29tcGxleFR5cGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlN0cnVjdHVyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5Nb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5Nb2RlbEdyb3VwRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlhTREJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQmFzZURyYWdBbmREcm9wQ29tbWFuZAotewotICBwcm90ZWN0ZWQgTW9kZWxHcm91cEVkaXRQYXJ0IHRvcE1vc3RHcm91cDsKLQotICBwdWJsaWMgWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZChFZGl0UGFydFZpZXdlciB2aWV3ZXIsIENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwgR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0LCBYU0RCYXNlRmllbGRFZGl0UGFydCBpdGVtVG9EcmFnLCBQb2ludCBsb2NhdGlvbikKLSAgewotICAgIHN1cGVyKHZpZXdlciwgcmVxdWVzdCk7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgdGhpcy5pdGVtVG9EcmFnID0gaXRlbVRvRHJhZzsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgc2V0dXAoKTsKLSAgfQotICAKLSAgcHVibGljIFhTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQoWFNEQmFzZUZpZWxkRWRpdFBhcnQgaXRlbVRvRHJhZywgWFNEQmFzZUZpZWxkRWRpdFBhcnQgbGVmdEZpZWxkLCBYU0RCYXNlRmllbGRFZGl0UGFydCByaWdodEZpZWxkLCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgc3VwZXIoaXRlbVRvRHJhZy5nZXRWaWV3ZXIoKSwgbnVsbCk7IAotICAgIHRoaXMuaXRlbVRvRHJhZyA9IGl0ZW1Ub0RyYWc7Ci0gICAgY2FuRXhlY3V0ZSA9IGZhbHNlOwotICAgIGhhbmRsZUtleWJvYXJkRHJhZ0FuZERyb3AobGVmdEZpZWxkLCByaWdodEZpZWxkLCBkaXJlY3Rpb24pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVLZXlib2FyZERyYWdBbmREcm9wKFhTREJhc2VGaWVsZEVkaXRQYXJ0IGxlZnRGaWVsZCwgWFNEQmFzZUZpZWxkRWRpdFBhcnQgcmlnaHRGaWVsZCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIHN1cGVyLmhhbmRsZUtleWJvYXJkRHJhZ0FuZERyb3AobGVmdEZpZWxkLCByaWdodEZpZWxkLCBkaXJlY3Rpb24pOwotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgewotICAgICAgaWYgKHRhcmdldCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0YXJnZXQgPSByaWdodEZpZWxkOwotICAgICAgICB0aGlzLmxvY2F0aW9uID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldFRvcCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIShsZWZ0RmllbGQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgICAgICAgIHx8IGxlZnRGaWVsZC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEV2lsZGNhcmRBZGFwdGVyKQotICAgICAgewotICAgICAgICB0YXJnZXQgPSByaWdodEZpZWxkOwotICAgICAgICB0aGlzLmxvY2F0aW9uID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldFRvcCgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgcmV0dXJuOwotICAgIHNldHVwKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cCgpCi0gIHsKLSAgICBjYW5FeGVjdXRlID0gZmFsc2U7Ci0KLSAgICAvLyBEcm9wIHRhcmdldCBpcyBtb2RlbCBncm91cAotICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRWRpdFBhcnQpCi0gICAgewotICAgICAgcGFyZW50RWRpdFBhcnQgPSAoTW9kZWxHcm91cEVkaXRQYXJ0KSB0YXJnZXQ7Ci0gICAgICBpZiAoKChHZW5lcmljR3JvdXBGaWd1cmUpIHBhcmVudEVkaXRQYXJ0LmdldEZpZ3VyZSgpKS5nZXRJY29uRmlndXJlKCkuZ2V0Qm91bmRzKCkuY29udGFpbnMobG9jYXRpb24pKQotICAgICAgewotICAgICAgICB4c2RDb21wb25lbnRUb0RyYWcgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikgaXRlbVRvRHJhZy5nZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RFbGVtZW50QWN0aW9uKCgoTW9kZWxHcm91cEVkaXRQYXJ0KSB0YXJnZXQpLmdldFhTRE1vZGVsR3JvdXAoKSwgeHNkQ29tcG9uZW50VG9EcmFnLCBudWxsLCBudWxsKTsKLSAgICAgICAgY2FuRXhlY3V0ZSA9IGFjdGlvbi5jYW5Nb3ZlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJhc2VGaWVsZEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIHRhcmdldFNwYWNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAvLyBDYWxjdWxhdGUgdGhlIGxpc3Qgb2YgYWxsIHNpYmxpbmcgZmllbGQgZWRpdCBwYXJ0czsKLSAgICAgIExpc3QgdGFyZ2V0RWRpdFBhcnRTaWJsaW5ncyA9IGNhbGN1bGF0ZUZpZWxkRWRpdFBhcnRzKCk7Ci0gICAgICBjYWxjdWxhdGVNb2RlbEdyb3VwTGlzdCgpOwotCi0gICAgICBkb0Ryb3AodGFyZ2V0RWRpdFBhcnRTaWJsaW5ncywgaXRlbVRvRHJhZyk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9Ecm9wKExpc3Qgc2libGluZ3MsIEdyYXBoaWNhbEVkaXRQYXJ0IG1vdmluZ0VkaXRQYXJ0KQotICB7Ci0gICAgY29tbW9uU2V0dXAoc2libGluZ3MsIG1vdmluZ0VkaXRQYXJ0KTsKLQotICAgIC8vIENhbiBjb21tb24gdGhpcyBjb2RlIHVwIHdpdGggWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kLi4uIAotICAgIGlmICgocHJldmlvdXNSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgcHJldmlvdXNSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICAgICAgJiYgKG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgbmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKSkgCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApIHByZXZpb3VzUmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKHBhcmVudEVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgIG1vZGVsR3JvdXAgPSAoKE1vZGVsR3JvdXBFZGl0UGFydCkgcGFyZW50RWRpdFBhcnQpLmdldFhTRE1vZGVsR3JvdXAoKTsKLSAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNERWxlbWVudEFjdGlvbihtb2RlbEdyb3VwLCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJldmlvdXNSZWZDb21wb25lbnQgPT0gbnVsbCAmJiAobmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCBuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpKQotICAgIHsKLSAgICAgIGlmIChjbG9zZXJTaWJsaW5nID09IEFCT1ZFX0lTX0NMT1NFUikKLSAgICAgIHsKLSAgICAgICAgaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNERWxlbWVudEFjdGlvbih0b3BNb3N0R3JvdXAuZ2V0WFNETW9kZWxHcm91cCgpLCB4c2RDb21wb25lbnRUb0RyYWcsIG51bGwsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnRFZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RFbGVtZW50QWN0aW9uKCgoTW9kZWxHcm91cEVkaXRQYXJ0KSBwYXJlbnRFZGl0UGFydCkuZ2V0WFNETW9kZWxHcm91cCgpLCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCkgbmV4dFJlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLSAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RFbGVtZW50QWN0aW9uKG1vZGVsR3JvdXAsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgocHJldmlvdXNSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgcHJldmlvdXNSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkgIAotICAgICAgICAmJiBuZXh0UmVmQ29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApcHJldmlvdXNSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAocGFyZW50RWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgbW9kZWxHcm91cCA9ICgoTW9kZWxHcm91cEVkaXRQYXJ0KSBwYXJlbnRFZGl0UGFydCkuZ2V0WFNETW9kZWxHcm91cCgpOwotICAgICAgaWYgKGNsb3NlclNpYmxpbmcgPT0gQUJPVkVfSVNfQ0xPU0VSKQotICAgICAgewotICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24obW9kZWxHcm91cCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChyaWdodFNpYmxpbmdFZGl0UGFydCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RFbGVtZW50QWN0aW9uKHRvcE1vc3RHcm91cC5nZXRYU0RNb2RlbEdyb3VwKCksIHhzZENvbXBvbmVudFRvRHJhZywgbnVsbCwgbnVsbCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RFbGVtZW50QWN0aW9uKG1vZGVsR3JvdXAsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgICAgY2FuRXhlY3V0ZSA9IGFjdGlvbi5jYW5Nb3ZlKCk7Ci0gIH0KLQotICAvKioKLSAgICogb3ZlcnJpZGVzIGJhc2UKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZUZpcnN0QW5kTGFzdERyb3BUYXJnZXRzKGludCBpbmRleCwgTGlzdCBzaWJsaW5ncykKLSAgewotICAgIC8vIFRoaXMgYm9vbGVhbiBpcyB0byBoYW5kbGUgdGhlIFRvcCBhbmQgQm90dG9tIGRyb3AgdGFyZ2V0cyBmb3Igd2hpY2ggd2Ugd2FudCB0byBkcm9wCi0gICAgLy8gdG8gdGhlIHRvcCBtb3N0IG1vZGVsIGdyb3VwCi0gICAgLy8gVE9ETzogSSBuZWVkIHRvIHJlYXJyYW5nZSB0aGlzIGNvZGUgYmV0dGVyCi0gICAgYm9vbGVhbiBpc0hhbmRsZWQgPSBmYWxzZTsKLSAgICBpbnQgcG9pbnRlcllMb2NhdGlvbiA9IGxvY2F0aW9uLnk7Ci0gICAgLy8gV2UgbmVlZCB0byBmaW5kIHRoZSBwYXJlbnQgZWRpdHBhcnQsIHdoaWNoIGlzIHRoZSBtb2RlbCBncm91cAotICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIHlvdSBkcm9wIHRvIGZpcnN0IHBvc2l0aW9uCi0gICAgaWYgKGluZGV4ID09IDAgJiYgc2libGluZ3Muc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBsZWZ0U2libGluZ0VkaXRQYXJ0ID0gbnVsbDsKLSAgICAgIHJpZ2h0U2libGluZ0VkaXRQYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoMCk7Ci0gICAgICBpbnQgc2libGluZ1lMb2NhdGlvbiA9IGdldFpvb21lZEJvdW5kcyhyaWdodFNpYmxpbmdFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSkuZ2V0Q2VudGVyKCkueTsKLSAgICAgIGNsb3NlclNpYmxpbmcgPSBCRUxPV19JU19DTE9TRVI7Ci0gICAgICBpZiAoTWF0aC5hYnMocG9pbnRlcllMb2NhdGlvbiAtIHNpYmxpbmdZTG9jYXRpb24pID4gZ2V0Wm9vbWVkQm91bmRzKHJpZ2h0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKS5oZWlnaHQgLyA0KQotICAgICAgewotICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwotICAgICAgICBwYXJlbnRFZGl0UGFydCA9IHRvcE1vc3RHcm91cDsKLSAgICAgICAgaWYgKHRvcE1vc3RHcm91cCAhPSBudWxsKQotICAgICAgICAgIGNsb3NlclNpYmxpbmcgPSBBQk9WRV9JU19DTE9TRVI7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIHlvdSBkcm9wIHRvIGxhc3QgcG9zaXRpb24KLSAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4ID09IHNpYmxpbmdzLnNpemUoKSkKLSAgICB7Ci0gICAgICBsZWZ0U2libGluZ0VkaXRQYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXggLSAxKTsKLSAgICAgIGludCBzaWJsaW5nWUxvY2F0aW9uID0gZ2V0Wm9vbWVkQm91bmRzKGxlZnRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkpLmdldENlbnRlcigpLnk7Ci0gICAgICBpZiAoTWF0aC5hYnMocG9pbnRlcllMb2NhdGlvbiAtIHNpYmxpbmdZTG9jYXRpb24pID4gZ2V0Wm9vbWVkQm91bmRzKGxlZnRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkpLmhlaWdodCAvIDQpCi0gICAgICB7Ci0gICAgICAgIGlzSGFuZGxlZCA9IHRydWU7Ci0gICAgICAgIHBhcmVudEVkaXRQYXJ0ID0gdG9wTW9zdEdyb3VwOwotICAgICAgICBpZiAodG9wTW9zdEdyb3VwICE9IG51bGwpCi0gICAgICAgICAgY2xvc2VyU2libGluZyA9IEJFTE9XX0lTX0NMT1NFUjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlzSGFuZGxlZDsKLSAgfQotCi0gIC8vIE1ldGhvZHMgc3BlY2lmaWMgdG8gZWxlbWVudCBhcyBkcmFnIHNvdXJjZQotICAKLSAgLy8gTW9kZWwgR3JvdXAgcmVsYXRlZCBoZWxwZXIgbWV0aG9kCi0gIHByb3RlY3RlZCB2b2lkIGNhbGN1bGF0ZU1vZGVsR3JvdXBMaXN0KCkKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gdGFyZ2V0OwotICAgIHdoaWxlIChlZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgZ2V0TW9kZWxHcm91cEVkaXRQYXJ0cygoTW9kZWxHcm91cEVkaXRQYXJ0KSBlZGl0UGFydCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbXBsZXhUeXBlRWRpdFBhcnQgfHwgZWRpdFBhcnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZFRvcCA9IGZhbHNlOwotICAgICAgICBMaXN0IGxpc3QgPSBlZGl0UGFydC5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGkubmV4dCgpOwotICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIENvbXBhcnRtZW50RWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgTGlzdCBjb21wYXJ0bWVudExpc3QgPSAoKENvbXBhcnRtZW50RWRpdFBhcnQpIGNoaWxkKS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbXBhcnRtZW50TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0IGdyb3VwcyA9IChYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQpIG9iajsKLSAgICAgICAgICAgICAgICBMaXN0IGdyb3VwTGlzdCA9IGdyb3Vwcy5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdyb3VwTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgT2JqZWN0IGdyb3VwQ2hpbGQgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgIGlmIChncm91cENoaWxkIGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kVG9wKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgZm91bmRUb3AgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgIHRvcE1vc3RHcm91cCA9IChNb2RlbEdyb3VwRWRpdFBhcnQpIGdyb3VwQ2hpbGQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZ2V0TW9kZWxHcm91cEVkaXRQYXJ0cygoTW9kZWxHcm91cEVkaXRQYXJ0KSBncm91cENoaWxkKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTW9kZWwgR3JvdXAgcmVsYXRlZCBoZWxwZXIgbWV0aG9kCi0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbEdyb3VwRWRpdFBhcnRzKE1vZGVsR3JvdXBFZGl0UGFydCBtb2RlbEdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBMaXN0IG1vZGVsR3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIExpc3QgbGlzdCA9IG1vZGVsR3JvdXBFZGl0UGFydC5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBpLm5leHQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICB0YXJnZXRTcGFjZXNMaXN0LmFkZChvYmplY3QpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCBncm91cFJlZiA9IChNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0KSBvYmplY3Q7Ci0gICAgICAgIExpc3QgZ3JvdXBSZWZDaGlsZHJlbiA9IGdyb3VwUmVmLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBncm91cFJlZkNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1vZGVsR3JvdXBFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBnZXRNb2RlbEdyb3VwRWRpdFBhcnRzKChNb2RlbEdyb3VwRWRpdFBhcnQpIG8pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBnZXRNb2RlbEdyb3VwRWRpdFBhcnRzKChNb2RlbEdyb3VwRWRpdFBhcnQpIG9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtb2RlbEdyb3VwTGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9BdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9BdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2M0ZmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCBleHRlbmRzIENvbm5lY3RhYmxlRWRpdFBhcnQKLXsKLSAgcHVibGljIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgICByZXR1cm4gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgYWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICB9Ci0vLyAgICBlbHNlIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotLy8gICAgewotLy8gICAgICByZXR1cm4gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgZ2V0TW9kZWwoKTsKLS8vICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLQotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBmaWd1cmUgPSBuZXcgR2VuZXJpY0dyb3VwRmlndXJlKCk7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgZmlndXJlLmdldEljb25GaWd1cmUoKS5pbWFnZSA9IGFkYXB0ZXIuZ2V0SW1hZ2UoKTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0TW9kZWwoKTsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uID0gYWRhcHRlci5nZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICBJdGVyYXRvciBpID0gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCi0gICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaS5uZXh0KCk7Ci0KLSAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGF0dHJHcm91cENvbnRlbnQpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIoKFhTREJhc2VBZGFwdGVyKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKChYU0RBdHRyaWJ1dGVVc2UpYXR0ckdyb3VwQ29udGVudCkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSkpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcigoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAobGlzdC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcigoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkpOwotICAgIH0KLQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLQotICBwdWJsaWMgUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKEJhc2VFZGl0UGFydCBjaGlsZCkKLSAgewotICAgIFJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBSZWZlcmVuY2VDb25uZWN0aW9uKCk7Ci0KLSAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKCgoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpKS5nZXRJY29uRmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5SSUdIVCwgMCwgMCkpOwotCi0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcigoKEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KSBjaGlsZCkuZ2V0VGFyZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAwKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICB7Ci0vLyAgICAgIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQgZWxlbSA9IChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSBjaGlsZDsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoKChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAwKSk7Ci0gICAgfQotCi0gICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvQ2F0ZWdvcnlFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9DYXRlZ29yeUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjMxMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9DYXRlZ29yeUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNjcm9sbFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlZpZXdwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5WaWV3cG9ydExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5IZWFkaW5nRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuUm91bmRlZExpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLkNvbnRhaW5lckxheW91dDsKLQotcHVibGljIGNsYXNzIENhdGVnb3J5RWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeTsKLSAgRmlndXJlIG91dGVyUGFuZTsKLSAgSGVhZGluZ0ZpZ3VyZSBoZWFkaW5nRmlndXJlOwotICBwcm90ZWN0ZWQgU2Nyb2xsUGFuZSBzY3JvbGxwYW5lOwotICBwcm90ZWN0ZWQgaW50IG1pbmltdW1IZWlnaHQgPSA0MDA7Ci0KLSAgcHVibGljIGludCBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiAoKENhdGVnb3J5QWRhcHRlcikgZ2V0TW9kZWwoKSkuZ2V0R3JvdXBUeXBlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgb3V0ZXJQYW5lID0gbmV3IEZpZ3VyZSgpOwotICAgIG91dGVyUGFuZS5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKDEsIDYpKTsKLQotICAgIGhlYWRpbmdGaWd1cmUgPSBuZXcgSGVhZGluZ0ZpZ3VyZSgpOwotICAgIG91dGVyUGFuZS5hZGQoaGVhZGluZ0ZpZ3VyZSk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldFRleHQoKChDYXRlZ29yeUFkYXB0ZXIpIGdldE1vZGVsKCkpLmdldFRleHQoKSk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldEljb24oKChDYXRlZ29yeUFkYXB0ZXIpIGdldE1vZGVsKCkpLmdldEltYWdlKCkpOwotCi0gICAgaW50IG1pbkhlaWdodCA9IFNXVC5ERUZBVUxUOwotICAgIHN3aXRjaCAoZ2V0VHlwZSgpKQotICAgIHsKLSAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTOgotICAgIHsKLSAgICAgIG1pbkhlaWdodCA9IDgwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVM6Ci0gICAgY2FzZSBDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTOgotICAgIHsKLSAgICAgIG1pbkhlaWdodCA9IDEwMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICB9Ci0KLSAgICBmaW5hbCBpbnQgdGhlTWluSGVpZ2h0ID0gbWluSGVpZ2h0OwotICAgICAKLSAgICBUb29sYmFyTGF5b3V0IG91dGVyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpCi0gICAgewotICAgICAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gICAgICB7Ci0gICAgICAgIERpbWVuc2lvbiBkID0gc3VwZXIuY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShwYXJlbnQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBkLnVuaW9uKG5ldyBEaW1lbnNpb24oMjUwLCB0aGVNaW5IZWlnaHQpKTsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBvdXRlckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIG91dGVyUGFuZS5zZXRMYXlvdXRNYW5hZ2VyKG91dGVyTGF5b3V0KTsKLQotICAgIFJlY3RhbmdsZUZpZ3VyZSBsaW5lID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpCi0gICAgewotICAgICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KQotICAgICAgewotICAgICAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmdldFByZWZlcnJlZFNpemUod0hpbnQsIGhIaW50KTsKLSAgICAgICAgZC53aWR0aCArPSAyMDsKLSAgICAgICAgZC5oZWlnaHQgPSAxOwotICAgICAgICByZXR1cm4gZDsKLSAgICAgIH0KLSAgICB9OwotICAgIFRvb2xiYXJMYXlvdXQgbGluZUxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICBsaW5lTGF5b3V0LnNldFZlcnRpY2FsKHRydWUpOwotICAgIGxpbmVMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICBsaW5lLnNldExheW91dE1hbmFnZXIobGluZUxheW91dCk7Ci0gICAgb3V0ZXJQYW5lLmFkZChsaW5lKTsKLQotICAgIHNjcm9sbHBhbmUgPSBuZXcgU2Nyb2xsUGFuZSgpOwotICAgIHNjcm9sbHBhbmUuc2V0VmVydGljYWxTY3JvbGxCYXJWaXNpYmlsaXR5KFNjcm9sbFBhbmUuQVVUT01BVElDKTsgLy8gU2Nyb2xsUGFuZS5BTFdBWVMpOwotICAgIG91dGVyUGFuZS5hZGQoc2Nyb2xscGFuZSk7Ci0KLSAgICBGaWd1cmUgcGFuZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBwYW5lLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDUsIDgsIDUsIDgpKTsKLSAgICBDb250YWluZXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnRhaW5lckxheW91dCgpOwotICAgIGxheW91dC5zZXRIb3Jpem9udGFsKGZhbHNlKTsKLSAgICBsYXlvdXQuc2V0U3BhY2luZygwKTsKLSAgICBwYW5lLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQotICAgIFZpZXdwb3J0IHZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KCk7Ci0gICAgdmlld3BvcnQuc2V0Q29udGVudHNUcmFja3NIZWlnaHQodHJ1ZSk7Ci0gICAgVmlld3BvcnRMYXlvdXQgdmlld3BvcnRMYXlvdXQgPSBuZXcgVmlld3BvcnRMYXlvdXQoKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgICAgewotICAgICAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmNhbGN1bGF0ZVByZWZlcnJlZFNpemUocGFyZW50LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKHRoZU1pbkhlaWdodCA+IDApCi0gICAgICAgICAgZC5oZWlnaHQgPSBNYXRoLm1pbihkLmhlaWdodCwgdGhlTWluSGVpZ2h0KTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZG91YmxlIGZhY3RvciA9IGdldFpvb21NYW5hZ2VyKCkuZ2V0Wm9vbSgpOwotICAgICAgICAgIGludCBzY2FsZWRIZWlnaHQgPSAoaW50KU1hdGgucm91bmQoKGdldFZpZXdlcigpLmdldENvbnRyb2woKS5nZXRCb3VuZHMoKS5oZWlnaHQgLSBtaW5pbXVtSGVpZ2h0KSAvIGZhY3Rvcik7IC8vIGFkanVzdCBmb3Igb3RoZXIgY2F0ZWdvcmllcyBhbmQgc3BhY2VzCi0gICAgICAgICAgZC5oZWlnaHQgPSBNYXRoLm1heCgyNTAsIHNjYWxlZEhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgZC53aWR0aCA9IE1hdGgubWluKGQud2lkdGgsIDMwMCk7Ci0gICAgICAgIHJldHVybiBkOwotICAgICAgfQotICAgIH07Ci0gICAgdmlld3BvcnQuc2V0TGF5b3V0TWFuYWdlcih2aWV3cG9ydExheW91dCk7Ci0KLSAgICBzY3JvbGxwYW5lLnNldFZpZXdwb3J0KHZpZXdwb3J0KTsKLSAgICBzY3JvbGxwYW5lLnNldENvbnRlbnRzKHBhbmUpOwotCi0gICAgcmV0dXJuIG91dGVyUGFuZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0KLSAgICBSb3VuZGVkTGluZUJvcmRlciBib3JkZXIgPSAoUm91bmRlZExpbmVCb3JkZXIpIG91dGVyUGFuZS5nZXRCb3JkZXIoKTsKLSAgICBib3JkZXIuc2V0V2lkdGgoaXNTZWxlY3RlZCA/IDIgOiAxKTsKLSAgICBoZWFkaW5nRmlndXJlLnNldFNlbGVjdGVkKGlzU2VsZWN0ZWQpOwotICAgIG91dGVyUGFuZS5yZXBhaW50KCk7Ci0KLSAgICBoZWFkaW5nRmlndXJlLmdldExhYmVsKCkuc2V0VGV4dCgoKENhdGVnb3J5QWRhcHRlcikgZ2V0TW9kZWwoKSkuZ2V0VGV4dCgpKTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBzY3JvbGxwYW5lLmdldENvbnRlbnRzKCk7Ci0gIH0KLQotICBwdWJsaWMgTGFiZWwgZ2V0TmFtZUxhYmVsKCkKLSAgewotICAgIHJldHVybiBoZWFkaW5nRmlndXJlLmdldExhYmVsKCk7Ci0gIH0KLQotICBwdWJsaWMgSGVhZGluZ0ZpZ3VyZSBnZXRIZWFkaW5nRmlndXJlKCkKLSAgewotICAgIHJldHVybiBoZWFkaW5nRmlndXJlOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gbmV3IFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQoKTsKLSAgICBlZGl0UGFydC5zZXRNb2RlbChtb2RlbCk7Ci0gICAgZWRpdFBhcnQuc2V0UGFyZW50KHRoaXMpOwotICAgIHJldHVybiBlZGl0UGFydDsKLSAgfQotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7IAotICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpCi0gICAgewotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0TmV4dFNpYmxpbmcoZWRpdFBhcnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXRQcmV2U2libGluZyhlZGl0UGFydCk7Ci0gICAgICB9ICAgICAgCi0gICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNjcm9sbFRvKChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0KTsKLSAgICAgIH0gIAotICAgIH0gICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKEJhc2VFZGl0UGFydClnZXRQYXJlbnQoKSkuZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgLy8gY3MgOiBvZGRseSBhcnJvd2luZyB1cCBhbmQgZG93biB0cnVlIGl0ZW1zIGluIHRoZSBsaXN0IGlzIG5vdCBoYW5kbGVkIG5pY2VseQotICAgIC8vIGJ5IHRoZSBjYW5uZWQgR0VGIEdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIgc28gdGhpcyBuYXZpZ2F0aW9uIHBvbGljeSBpcyBuZWVkIHRvIGZpeCB0aGF0ICAgIAotICAgIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoYWRhcHRlci5nZXRBbGxDaGlsZHJlbigpKSk7Ci0gICAgcmV0dXJuIGNoaWxkcmVuOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2Nyb2xsVG8oQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB0b3BMZXZlbCkKLSAgewotICAgIFJlY3RhbmdsZSB0b3BMZXZlbEJvdW5kcyA9IHRvcExldmVsLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotICAgIFJlY3RhbmdsZSBjYXRlZ29yeUJvdW5kcyA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLSAgICBpbnQgc2Nyb2xsVmFsdWUgPSBzY3JvbGxwYW5lLmdldFZlcnRpY2FsU2Nyb2xsQmFyKCkuZ2V0VmFsdWUoKTsKLSAgICBpbnQgbG9jYXRpb24gPSB0b3BMZXZlbEJvdW5kcy55ICsgc2Nyb2xsVmFsdWUgLSBjYXRlZ29yeUJvdW5kcy55OwotICAgIHNjcm9sbHBhbmUuc2Nyb2xsVmVydGljYWxUbyhsb2NhdGlvbiAtIGNhdGVnb3J5Qm91bmRzLmhlaWdodCAvIDIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtSGVpZ2h0KGludCBtaW5pbXVtSGVpZ2h0KQotICB7Ci0gICAgdGhpcy5taW5pbXVtSGVpZ2h0ID0gbWluaW11bUhlaWdodDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Db25uZWN0YWJsZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0Nvbm5lY3RhYmxlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzMjkzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0Nvbm5lY3RhYmxlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5DZW50ZXJlZEljb25GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbm5lY3RhYmxlRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIEFycmF5TGlzdCBjb25uZWN0aW9uRmlndXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHB1YmxpYyBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGdldEV4dGVuZGVkRmlndXJlRmFjdG9yeSgpCi0gIHsKLSAgICBFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSA9IGdldFZpZXdlcigpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIEFzc2VydC5pc1RydWUoZmFjdG9yeSBpbnN0YW5jZW9mIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnksICJFZGl0UGFydEZhY3RvcnkgbXVzdCBiZSBhbiBpbnN0YW5jZW9mIG9mIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkiKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICByZXR1cm4gKElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkpZmFjdG9yeTsgCi0gIH0KLSAgCi0gIHB1YmxpYyBDb25uZWN0YWJsZUVkaXRQYXJ0KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlndXJlID0gbmV3IEdlbmVyaWNHcm91cEZpZ3VyZSgpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0WFNEQ29uY3JldGVDb21wb25lbnQoKQotICB7Ci0gICAgcmV0dXJuIChYU0RDb25jcmV0ZUNvbXBvbmVudCkoKFhTREJhc2VBZGFwdGVyKWdldE1vZGVsKCkpLmdldFRhcmdldCgpOwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRDb25uZWN0aW9uRmlndXJlcygpCi0gIHsKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCBSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoQmFzZUVkaXRQYXJ0IGNoaWxkKTsKLSAgCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUNvbm5lY3Rpb24oKQotICB7Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmVzID09IG51bGwpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZpZ3VyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIEJhc2VFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQmFzZUVkaXRQYXJ0IGcgPSAoQmFzZUVkaXRQYXJ0KSBvOwotICAgICAgICBSZWZlcmVuY2VDb25uZWN0aW9uIGZpZ3VyZSA9IGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoZyk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmVzLmFkZChmaWd1cmUpOwotICAgICAgICBmaWd1cmUuc2V0UG9pbnRzKGZpZ3VyZS5nZXRQb2ludHMoKSk7Ci0KLSAgICAgICAgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikuYWRkKGZpZ3VyZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgICBkZWFjdGl2YXRlQ29ubmVjdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZGVhY3RpdmF0ZUNvbm5lY3Rpb24oKQotICB7Ci0gICAgLy8gaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24sIHJlbW92ZSBpdAotICAgIFJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZTsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZXMgIT0gbnVsbCAmJiAhY29ubmVjdGlvbkZpZ3VyZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbm5lY3Rpb25GaWd1cmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IChSZWZlcmVuY2VDb25uZWN0aW9uKSBpLm5leHQoKTsKLQotICAgICAgICBpZiAoZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikuZ2V0Q2hpbGRyZW4oKS5jb250YWlucyhjb25uZWN0aW9uRmlndXJlKSkKLSAgICAgICAgewotICAgICAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpLnJlbW92ZShjb25uZWN0aW9uRmlndXJlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY29ubmVjdGlvbkZpZ3VyZXMgPSBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIHJlZnJlc2hDb25uZWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAoIWlzQWN0aXZlKCkpCi0gICAgICByZXR1cm47Ci0KLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZXMgPT0gbnVsbCB8fCBjb25uZWN0aW9uRmlndXJlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkZWFjdGl2YXRlQ29ubmVjdGlvbigpOwotICAgICAgYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmU7Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmVzICE9IG51bGwgJiYgIWNvbm5lY3Rpb25GaWd1cmVzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25uZWN0aW9uRmlndXJlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUgPSAoUmVmZXJlbmNlQ29ubmVjdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KHRydWUpOwotICAgICAgfQotICAgIH0KLSAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlndXJlID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnNldE1vZGUoQ2VudGVyZWRJY29uRmlndXJlLlNFTEVDVEVEKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnJlZnJlc2goKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlOwotICAgIGlmIChjb25uZWN0aW9uRmlndXJlcyAhPSBudWxsICYmICFjb25uZWN0aW9uRmlndXJlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29ubmVjdGlvbkZpZ3VyZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gKFJlZmVyZW5jZUNvbm5lY3Rpb24pIGkubmV4dCgpOwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBmaWd1cmUgPSAoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpOwotICAgIGZpZ3VyZS5nZXRJY29uRmlndXJlKCkuc2V0TW9kZShDZW50ZXJlZEljb25GaWd1cmUuTk9STUFMKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnJlZnJlc2goKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlndXJlID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnJlZnJlc2goKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KQotICB7Ci0gICAgSUZpZ3VyZSBjaGlsZCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpOwotICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGNoaWxkLCBpbmRleCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KQotICB7Ci0gICAgSUZpZ3VyZSBjaGlsZCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpOwotICAgIGdldENvbnRlbnRQYW5lKCkucmVtb3ZlKGNoaWxkKTsKLSAgfQotICAKLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuICgoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpKS5nZXRDb250ZW50RmlndXJlKCk7Ci0gIH0KLQotICBwdWJsaWMgRmlndXJlIGdldFRhcmdldEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gKChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCkpLmdldFRhcmdldEZpZ3VyZSgpOwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpCi0gICAgewotICAgICAgaWYgKGdldFBhcmVudCgpIGluc3RhbmNlb2YgQ29ubmVjdGFibGVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0UGFyZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHRoaXM7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKQotICAgIHsgICAgCi0gICAgICByZXN1bHQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuZ2V0KDApOwotICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCB0YXJnZXQgPSBudWxsOwotICAgICAgYm9vbGVhbiBmb3VuZFNlbGVjdGFibGVHcm91cCA9IGZhbHNlOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSkKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kU2VsZWN0YWJsZUdyb3VwID0gdHJ1ZTsKLSAgICAgICAgICByZXN1bHQgPSBjaGlsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSByZXN1bHQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIWZvdW5kU2VsZWN0YWJsZUdyb3VwICYmIHRhcmdldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICAgICAgd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQ29tcGFydG1lbnRFZGl0UGFydCkpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpIGkubmV4dCgpOwotICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEJhc2VGaWVsZEVkaXRQYXJ0ICYmICEoY2hpbGQgaW5zdGFuY2VvZiBTcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEJhc2VGaWVsZEVkaXRQYXJ0IGZpZWxkID0gKEJhc2VGaWVsZEVkaXRQYXJ0KSBjaGlsZDsKLSAgICAgICAgICAgIGlmIChmaWVsZC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS55IDwgdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmJvdHRvbSgpICYmCi0gICAgICAgICAgICAgICAgZmllbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkueSA+IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlZGl0UGFydDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuSU5fVE9fRklSU1RfQ0hJTEQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydC5nZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Nb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ4ZTZlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5DZW50ZXJlZENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5HZW5lcmljR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCBleHRlbmRzIENvbm5lY3RhYmxlRWRpdFBhcnQKLXsKLSAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZ3VyZTsKLSAgCi0gIHB1YmxpYyBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgZmlndXJlID0gbmV3IEdlbmVyaWNHcm91cEZpZ3VyZSgpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKWdldE1vZGVsKCk7Ci0gICAgZmlndXJlLmdldEljb25GaWd1cmUoKS5pbWFnZSA9IGFkYXB0ZXIuZ2V0SW1hZ2UoKTsKLQotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBncm91cEZpZ3VyZSA9IChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gICAgU3RyaW5nIG5vZGVOYW1lID0gIiI7Ci0gICAgCi0gICAgLy8gVE9ETzogY29tbW1vbiB0aGlzIHVwIHdpdGggTW9kZWxHcm91cEVkaXRQYXJ0LCBYU0RQYXJ0aWNsZUFkYXB0ZXIncyBjb2RlCi0gICAgCi0gICAgLy8gLTIgbWVhbnMgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgKHNvIHRoZSBkZWZhdWx0IGlzIDEpCi0gICAgaW50IG1pbk9jY3VycyA9IGFkYXB0ZXIuZ2V0TWluT2NjdXJzKCk7Ci0gICAgaW50IG1heE9jY3VycyA9IGFkYXB0ZXIuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgU3RyaW5nIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBpZiAobWluT2NjdXJzID09IC0zICYmIG1heE9jY3VycyA9PSAtMykKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lOwotICAgICAgZ3JvdXBGaWd1cmUuc2V0VGV4dChudWxsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluT2NjdXJzID09IDAgJiYgKG1heE9jY3VycyA9PSAtMiB8fCBtYXhPY2N1cnMgPT0gMSkpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZSArICIgWzAuLjFdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgZ3JvdXBGaWd1cmUuc2V0VGV4dCgiMC4uMSIpOwotICAgIH0KLSAgICBlbHNlIGlmICgobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IDEpIHx8Ci0gICAgICAgICAgICAgKG1pbk9jY3VycyA9PSAtMiAmJiBtYXhPY2N1cnMgPT0gMSkgfHwKLSAgICAgICAgICAgICAobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IC0yKSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lICsgIiBbMS4uMV0iOyAvLyROT04tTkxTLTEkCi0gICAgICBncm91cEZpZ3VyZS5zZXRUZXh0KCIxLi4xIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1pbk9jY3VycyA9PSAtMiAmJiBtYXhPY2N1cnMgPT0gLTIpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZTsKLSAgICAgIGdyb3VwRmlndXJlLnNldFRleHQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobWF4T2NjdXJzID09IC0yKSBtYXhPY2N1cnMgPSAxOwotICAgICAgU3RyaW5nIG1heFN5bWJvbCA9IG1heE9jY3VycyA9PSAtMSA/ICIqIiA6ICIiICsgbWF4T2NjdXJzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIAotICAgICAgU3RyaW5nIG1pblN5bWJvbCA9IG1pbk9jY3VycyA9PSAtMiA/ICIxIiA6ICIiICsgbWluT2NjdXJzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWUgKyAiIFsiICsgbWluU3ltYm9sICsgIi4uIiArIG1heFN5bWJvbCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGdyb3VwRmlndXJlLnNldFRleHQobWluU3ltYm9sICsgIi4uIiArIG1heFN5bWJvbCk7Ci0gICAgfQotCi0gICAgZ3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnNldFRvb2xUaXBUZXh0KG9jY3VyZW5jZURlc2NyaXB0aW9uKTsKLSAgICBncm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkucmVwYWludCgpOwotCi0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpOwotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGFkYXB0ZXIuZ2V0VGFyZ2V0KCkpLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgaWYgKHhzZE1vZGVsR3JvdXAgIT0gbnVsbCkKLSAgICAgIGxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkTW9kZWxHcm91cCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIFJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZShCYXNlRWRpdFBhcnQgY2hpbGQpCi0gIHsKLSAgICBSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmUgPSBuZXcgUmVmZXJlbmNlQ29ubmVjdGlvbigpOwotCi0gICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRTb3VyY2VBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcigoKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKSkuZ2V0SWNvbkZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuUklHSFQsIDAsIDApKTsKLQotICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBFZGl0UGFydCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKCgoTW9kZWxHcm91cEVkaXRQYXJ0KSBjaGlsZCkuZ2V0VGFyZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAwKSk7Ci0gICAgfQotICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Nb2RlbEdyb3VwRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvTW9kZWxHcm91cEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMDNmMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Nb2RlbEdyb3VwRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RNb2RlbEdyb3VwQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLk1vZGVsR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxHcm91cEVkaXRQYXJ0IGV4dGVuZHMgQ29ubmVjdGFibGVFZGl0UGFydAotewotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGdldEV4dGVuZGVkRmlndXJlRmFjdG9yeSgpLmNyZWF0ZU1vZGVsR3JvdXBGaWd1cmUoZ2V0TW9kZWwoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RQYXJ0aWNsZSBnZXRYU0RQYXJ0aWNsZSgpCi0gIHsKLSAgICBPYmplY3QgbyA9IGdldFhTRE1vZGVsR3JvdXAoKS5nZXRDb250YWluZXIoKTsKLSAgICByZXR1cm4gKG8gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkgPyAoWFNEUGFydGljbGUpIG8gOiBudWxsOwotICB9Ci0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXAgZ2V0WFNETW9kZWxHcm91cCgpCi0gIHsKLSAgICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBBZGFwdGVyKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBBZGFwdGVyIGFkYXB0ZXIgPSAoWFNETW9kZWxHcm91cEFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgICByZXR1cm4gKFhTRE1vZGVsR3JvdXApIGFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotLy8gICAgZWxzZSBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0vLyAgICB7Ci0vLyAgICAgIHJldHVybiAoWFNETW9kZWxHcm91cCkgZ2V0TW9kZWwoKTsKLS8vICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLQotICB9Ci0KLSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBib29sZWFuIGlzUmVhZE9ubHkgPSBmYWxzZTsKLSAgICBHZW5lcmljR3JvdXBGaWd1cmUgbW9kZWxHcm91cEZpZ3VyZSA9IChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gICAgCi0gICAgWFNETW9kZWxHcm91cEFkYXB0ZXIgYWRhcHRlciA9IChYU0RNb2RlbEdyb3VwQWRhcHRlcikgZ2V0TW9kZWwoKTsKLSAgICBpc1JlYWRPbmx5ID0gYWRhcHRlci5pc1JlYWRPbmx5KCk7Ci0gICAgCi0gICAgU3RyaW5nIG5vZGVOYW1lID0gIiI7Ci0gICAgSW1hZ2UgaW1hZ2U7Ci0gICAgc3dpdGNoIChnZXRYU0RNb2RlbEdyb3VwKCkuZ2V0Q29tcG9zaXRvcigpLmdldFZhbHVlKCkpCi0gICAgewotICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLkFMTDoKLSAgICAgIHsKLSAgICAgICAgaW1hZ2UgPSBpc1JlYWRPbmx5ID8gTW9kZWxHcm91cEZpZ3VyZS5BTExfSUNPTl9ESVNBQkxFRF9JTUFHRSA6TW9kZWxHcm91cEZpZ3VyZS5BTExfSUNPTl9JTUFHRTsKLSAgICAgICAgbW9kZWxHcm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkuaW1hZ2UgPSBYU0RDb21tb25VSVV0aWxzLmdldFVwZGF0ZWRJbWFnZSgoWFNEQ29uY3JldGVDb21wb25lbnQpYWRhcHRlci5nZXRUYXJnZXQoKSwgaW1hZ2UsIGlzUmVhZE9ubHkpOwotICAgICAgICBub2RlTmFtZSA9IFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUc7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLkNIT0lDRToKLSAgICAgIHsKLSAgICAgICAgaW1hZ2UgPSBpc1JlYWRPbmx5ID8gTW9kZWxHcm91cEZpZ3VyZS5DSE9JQ0VfSUNPTl9ESVNBQkxFRF9JTUFHRSA6IE1vZGVsR3JvdXBGaWd1cmUuQ0hPSUNFX0lDT05fSU1BR0U7Ci0gICAgICAgIG1vZGVsR3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLmltYWdlID0gWFNEQ29tbW9uVUlVdGlscy5nZXRVcGRhdGVkSW1hZ2UoKFhTRENvbmNyZXRlQ29tcG9uZW50KWFkYXB0ZXIuZ2V0VGFyZ2V0KCksIGltYWdlLCBpc1JlYWRPbmx5KTsgCi0gICAgICAgIG5vZGVOYW1lID0gWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFhTRENvbXBvc2l0b3IuU0VRVUVOQ0U6Ci0gICAgICB7Ci0gICAgICAgIGltYWdlID0gaXNSZWFkT25seSA/IE1vZGVsR3JvdXBGaWd1cmUuU0VRVUVOQ0VfSUNPTl9ESVNBQkxFRF9JTUFHRSA6IE1vZGVsR3JvdXBGaWd1cmUuU0VRVUVOQ0VfSUNPTl9JTUFHRTsKLSAgICAgICAgbW9kZWxHcm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkuaW1hZ2UgPSBYU0RDb21tb25VSVV0aWxzLmdldFVwZGF0ZWRJbWFnZSgoWFNEQ29uY3JldGVDb21wb25lbnQpYWRhcHRlci5nZXRUYXJnZXQoKSwgaW1hZ2UsIGlzUmVhZE9ubHkpOyAKLSAgICAgICAgbm9kZU5hbWUgPSBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUc7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLS8vICAgIFN0cmluZyBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IGFkYXB0ZXIuZ2V0TmFtZUFubm90YXRpb25Ub29sVGlwU3RyaW5nKCk7Ci0vLyAgICBtb2RlbEdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5zZXRUb29sVGlwKG9jY3VyZW5jZURlc2NyaXB0aW9uKTsKLQotICAgIC8vIFRPRE86IGNvbW1tb24gdGhpcyB1cCB3aXRoIFhTRFBhcnRpY2xlQWRhcHRlcidzIGNvZGUKLSAgICAKLSAgICAvLyAtMiBtZWFucyB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSAoc28gdGhlIGRlZmF1bHQgaXMgMSkKLSAgICBpbnQgbWluT2NjdXJzID0gYWRhcHRlci5nZXRNaW5PY2N1cnMoKTsKLSAgICBpbnQgbWF4T2NjdXJzID0gYWRhcHRlci5nZXRNYXhPY2N1cnMoKTsKLSAgICBTdHJpbmcgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIGlmIChtaW5PY2N1cnMgPT0gLTMgJiYgbWF4T2NjdXJzID09IC0zKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWU7Ci0gICAgICBtb2RlbEdyb3VwRmlndXJlLnNldFRleHQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1pbk9jY3VycyA9PSAwICYmIChtYXhPY2N1cnMgPT0gLTIgfHwgbWF4T2NjdXJzID09IDEpKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWUgKyAiIFswLi4xXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG1vZGVsR3JvdXBGaWd1cmUuc2V0VGV4dCgiMC4uMSIpOwotICAgIH0KLSAgICBlbHNlIGlmICgobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IDEpIHx8Ci0gICAgICAgICAgICAgKG1pbk9jY3VycyA9PSAtMiAmJiBtYXhPY2N1cnMgPT0gMSkgfHwKLSAgICAgICAgICAgICAobWluT2NjdXJzID09IDEgJiYgbWF4T2NjdXJzID09IC0yKSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lICsgIiBbMS4uMV0iOyAvLyROT04tTkxTLTEkCi0gICAgICBtb2RlbEdyb3VwRmlndXJlLnNldFRleHQoIjEuLjEiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluT2NjdXJzID09IC0yICYmIG1heE9jY3VycyA9PSAtMikKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lOwotICAgICAgbW9kZWxHcm91cEZpZ3VyZS5zZXRUZXh0KG51bGwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKG1heE9jY3VycyA9PSAtMikgbWF4T2NjdXJzID0gMTsKLSAgICAgIFN0cmluZyBtYXhTeW1ib2wgPSBtYXhPY2N1cnMgPT0gLTEgPyAiKiIgOiAiIiArIG1heE9jY3VyczsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAKLSAgICAgIFN0cmluZyBtaW5TeW1ib2wgPSBtaW5PY2N1cnMgPT0gLTIgPyAiMSIgOiAiIiArIG1pbk9jY3VyczsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lICsgIiBbIiArIG1pblN5bWJvbCArICIuLiIgKyBtYXhTeW1ib2wgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICBtb2RlbEdyb3VwRmlndXJlLnNldFRleHQobWluU3ltYm9sICsgIi4uIiArIG1heFN5bWJvbCk7Ci0gICAgfQotCi0gICAgbW9kZWxHcm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkuc2V0VG9vbFRpcFRleHQob2NjdXJlbmNlRGVzY3JpcHRpb24pOwotICAgIG1vZGVsR3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnJlcGFpbnQoKTsKLQotICAgIHJlZnJlc2hDb25uZWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotLy8gICAgWFNETW9kZWxHcm91cEFkYXB0ZXIgbW9kZWxHcm91cEFkYXB0ZXIgPSAoWFNETW9kZWxHcm91cEFkYXB0ZXIpZ2V0TW9kZWwoKTsKLS8vICAgIEFycmF5TGlzdCBjaCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgIElUcmVlRWxlbWVudCBbXSB0cmVlID0gbW9kZWxHcm91cEFkYXB0ZXIuZ2V0Q2hpbGRyZW4oKTsKLS8vICAgIGludCBsZW5ndGggPSB0cmVlLmxlbmd0aDsKLS8vICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0vLyAgICB7Ci0vLyAgICAgIGNoLmFkZCh0cmVlW2ldKTsKLS8vICAgIH0KLQotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0geHNkTW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZSBuZXh0ID0gKFhTRFBhcnRpY2xlKSBpLm5leHQoKTsKLSAgICAgIGlmIChuZXh0LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIG5leHQuZ2V0Q29udGVudCgpOwotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIoKFhTREJhc2VBZGFwdGVyKWFkYXB0ZXIpKTsKLSAgICAgIH0KLSAgICAgIGlmIChuZXh0LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBkZWYgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIG5leHQuZ2V0Q29udGVudCgpOwotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGRlZik7Ci0gICAgICAgIGxpc3QuYWRkKGFkYXB0ZXIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobmV4dC5nZXRUZXJtKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCkgbmV4dC5nZXRUZXJtKCk7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQobW9kZWxHcm91cCk7Ci0gICAgICAgIGxpc3QuYWRkKGFkYXB0ZXIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobmV4dC5nZXRUZXJtKCkgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICAgIHsKLSAgICAgICAgWFNEV2lsZGNhcmQgd2lsZENhcmQgPSAoWFNEV2lsZGNhcmQpbmV4dC5nZXRUZXJtKCk7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQod2lsZENhcmQpOwotICAgICAgICBsaXN0LmFkZChuZXcgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKChYU0RCYXNlQWRhcHRlcilhZGFwdGVyKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGxpc3Quc2l6ZSgpID09IDApCi0gICAgICBsaXN0LmFkZChuZXcgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKG51bGwpKTsKLQotICAgIHJldHVybiBsaXN0OwotLy8gICAgcmV0dXJuIGNoOwotICB9Ci0KLSAgcHVibGljIFJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZShCYXNlRWRpdFBhcnQgY2hpbGQpCi0gIHsKLSAgICBSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmUgPSBuZXcgUmVmZXJlbmNlQ29ubmVjdGlvbigpOwotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBtb2RlbEdyb3VwRmlndXJlID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgCi0gICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRTb3VyY2VBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihtb2RlbEdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLlJJR0hULCAwLCAwKSk7Ci0KLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRWRpdFBhcnQpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcigoKE1vZGVsR3JvdXBFZGl0UGFydCkgY2hpbGQpLmdldFRhcmdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuTEVGVCwgMCwgMCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgewotICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCBlbGVtID0gKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpIGNoaWxkOwotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihlbGVtLmdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuTEVGVCwgMCwgMSkpOwotICAgIH0KLSAgICBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQpCi0gICAgewotICAgICAgTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCBlbGVtID0gKE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQpIGNoaWxkOwotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihlbGVtLmdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuTEVGVCwgMCwgMSkpOwotICAgIH0KLSAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvUmVmZXJlbmNlQ29ubmVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9SZWZlcmVuY2VDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjNkYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9SZWZlcmVuY2VDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZUNvbm5lY3Rpb24gZXh0ZW5kcyBQb2x5bGluZUNvbm5lY3Rpb24KLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGlnaGxpZ2h0ID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xvciBhY3RpdmVDb25uZWN0aW9uID0gQ29sb3JDb25zdGFudHMuYmxhY2s7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgaW5hY3RpdmVDb25uZWN0aW9uID0gbmV3IENvbG9yKG51bGwsIDE5OCwgMTk1LCAxOTgpOwotCi0gIHB1YmxpYyBSZWZlcmVuY2VDb25uZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0Q29ubmVjdGlvblJvdXRlcihuZXcgWFNETW9kZWxHcm91cFJvdXRlcigpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Sb3V0ZXIoQ29ubmVjdGlvblJvdXRlciBjcikKLSAgewotICAgIGlmIChjciAhPSBudWxsICYmIGdldENvbm5lY3Rpb25Sb3V0ZXIoKSAhPSBudWxsICYmICEoZ2V0Q29ubmVjdGlvblJvdXRlcigpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cFJvdXRlcikpCi0gICAgICBzdXBlci5zZXRDb25uZWN0aW9uUm91dGVyKGNyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzSGlnaGxpZ2h0ZWQoKQotICB7Ci0gICAgcmV0dXJuIGhpZ2hsaWdodDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhpZ2hsaWdodChib29sZWFuIGhpZ2hsaWdodCkKLSAgewotICAgIHRoaXMuaGlnaGxpZ2h0ID0gaGlnaGxpZ2h0OwotICAgIAotICAgIGJvb2xlYW4gaGlnaENvbnRyYXN0ID0gZmFsc2U7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGlmIChoaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgc2V0Rm9yZWdyb3VuZENvbG9yKGhpZ2hsaWdodCA/IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCkgOiBDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0Rm9yZWdyb3VuZENvbG9yKGhpZ2hsaWdodCA/IGFjdGl2ZUNvbm5lY3Rpb24gOiBpbmFjdGl2ZUNvbm5lY3Rpb24pOwotICAgIH0KLSAgICBzZXRPcGFxdWUoaGlnaGxpZ2h0KTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1NwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9TcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmNDRlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1NwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUZpZWxkRWRpdFBhcnQKLXsKLSAgTGFiZWwgc3BhY2U7Ci0gIHB1YmxpYyBTcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBzcGFjZSA9IG5ldyBMYWJlbCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBzcGFjZS5zZXRJY29uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvRG90LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHNwYWNlLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMsIDAsIDMsIDApKTsKLSAgICByZXR1cm4gc3BhY2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1RhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQxYThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuU3BhY2luZ0ZpZ3VyZTsKLQotcHVibGljIGNsYXNzIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHVibGljIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIFNwYWNpbmdGaWd1cmUgZmlndXJlOwotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBmaWd1cmUgPSBuZXcgU3BhY2luZ0ZpZ3VyZSgpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Ub3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1RvcExldmVsQ29tcG9uZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0ZjkwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1RvcExldmVsQ29tcG9uZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5JTmFtZWRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlJvb3RDb250ZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JRmVlZGJhY2tIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5JQURUVXBkYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLlNpbXBsZURpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5GaWVsZEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuVG9wTGV2ZWxDb21wb25lbnRMYWJlbENlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llcy5Ub3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkh5cGVyTGlua0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHMuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWxzLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNESW1wb3J0SW1wbDsKLQotcHVibGljIGNsYXNzIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgaW1wbGVtZW50cyBJRmVlZGJhY2tIYW5kbGVyLCBJTmFtZWRFZGl0UGFydAotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0gIC8vIHByb3RlY3RlZCBMYWJlbCBhcnJvd0xhYmVsOwotICBwcm90ZWN0ZWQgRmlndXJlIGxhYmVsSG9sZGVyID0gbmV3IEZpZ3VyZSgpOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotICBwcm90ZWN0ZWQgQURURGlyZWN0RWRpdFBvbGljeSBhZHREaXJlY3RFZGl0UG9saWN5ID0gbmV3IEFEVERpcmVjdEVkaXRQb2xpY3koKTsKLSAgcHJvdGVjdGVkIFNpbXBsZURpcmVjdEVkaXRQb2xpY3kgc2ltcGxlRGlyZWN0RWRpdFBvbGljeSA9IG5ldyBTaW1wbGVEaXJlY3RFZGl0UG9saWN5KCk7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHk7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0ZWQ7Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEZpZ3VyZSB0eXBlR3JvdXAgPSBuZXcgRmlndXJlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBncmFwaGljcykKLSAgICAgIHsKLSAgICAgICAgc3VwZXIucGFpbnQoZ3JhcGhpY3MpOwotICAgICAgICBpZiAoaGFzRm9jdXMpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBncmFwaGljcy5wdXNoU3RhdGUoKTsKLSAgICAgICAgICAgIFJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgICBncmFwaGljcy5zZXRYT1JNb2RlKHRydWUpOwotICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0ZvY3VzKHIueCwgci55ICsgMSwgci53aWR0aCAtIDEsIHIuaGVpZ2h0IC0gMik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBncmFwaGljcy5wb3BTdGF0ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLSAgICB9OwotICAgIHR5cGVHcm91cC5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotCi0gICAgbGFiZWxIb2xkZXIgPSBuZXcgRmlndXJlKCk7Ci0gICAgRmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKLSAgICBsYWJlbEhvbGRlci5zZXRMYXlvdXRNYW5hZ2VyKGZpbGxMYXlvdXQpOwotICAgIHR5cGVHcm91cC5hZGQobGFiZWxIb2xkZXIpOwotCi0gICAgbGFiZWwgPSBuZXcgSHlwZXJMaW5rTGFiZWwoKTsKLSAgICBsYWJlbC5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMSwgMiwgMiwgNSkpOwotICAgIGlmICghaXNIaWdoQ29udHJhc3QpCi0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIGxhYmVsSG9sZGVyLmFkZChsYWJlbCk7Ci0KLSAgICByZXR1cm4gdHlwZUdyb3VwOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLSAgICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBYU0RCYXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgaXNSZWFkT25seSA9IGFkYXB0ZXIuaXNSZWFkT25seSgpOwotICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbXB1dGVMYWJlbENvbG9yKCkpOwotICAgICAgbGFiZWwuc2V0VGV4dChhZGFwdGVyLmdldFRleHQoKSk7Ci0gICAgICBJbWFnZSBpbWFnZSA9IGFkYXB0ZXIuZ2V0SW1hZ2UoKTsKLSAgICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsYWJlbC5zZXRJY29uKFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgYWRhcHRlci5nZXRUYXJnZXQoKSwgaW1hZ2UsIGlzUmVhZE9ubHkpKTsKLSAgICAgIH0KLSAgICAgIC8vIGFycm93TGFiZWwuc2V0VmlzaWJsZShCb29sZWFuLlRSVUUuZXF1YWxzKGFkYXB0ZXIuZ2V0UHJvcGVydHkoZ2V0TW9kZWwoKSwKLSAgICAgIC8vICJkcmlsbERvd24iKSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfR1JBUEhfVU5LTk9XTl9PQkpFQ1QgKyBnZXRNb2RlbCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIC8vIGFycm93TGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgfQotCi0gICAgaWYgKHJlc2VsZWN0KQotICAgIHsKLSAgICAgIGdldFZpZXdlcigpLnNlbGVjdCh0aGlzKTsKLSAgICAgIHNldFJlc2VsZWN0KGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgcmV0dXJuICgoQmFzZUVkaXRQYXJ0KXRoaXMuZ2V0UGFyZW50KCkpLmRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICAvLyBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcKLSAgICAvLyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkpOwotICAgIC8vIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIC8vIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsCi0gICAgLy8gc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpOwotCi0gICAgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHBvbGljeSA9IG5ldyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBwb2xpY3kpOwotCi0gICAgU2VsZWN0aW9uRWRpdFBvbGljeSBmZWVkQmFja1NlbGVjdGlvbkVkaXRQb2xpY3kgPSBuZXcgU2VsZWN0aW9uRWRpdFBvbGljeSgpCi0gICAgewotICAgICAgcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKSBlZGl0UGFydCkucmVtb3ZlRmVlZGJhY2soKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRIb3N0KCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAoKElGZWVkYmFja0hhbmRsZXIpIGVkaXRQYXJ0KS5hZGRGZWVkYmFjaygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBmZWVkQmFja1NlbGVjdGlvbkVkaXRQb2xpY3kpOwotCi0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBhZHREaXJlY3RFZGl0UG9saWN5KTsKLSAgfQotCi0gIHB1YmxpYyBDb2xvciBjb21wdXRlTGFiZWxDb2xvcigpCi0gIHsKLSAgICBDb2xvciBjb2xvciA9IENvbG9yQ29uc3RhbnRzLmJsYWNrOwotICAgIGlmIChpc0hpZ2hDb250cmFzdCkKLSAgICB7IAotICAgICAgY29sb3IgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQpOwotICAgIH0KLQotICAgIGlmIChpc1NlbGVjdGVkKQotICAgIHsKLSAgICAgIGlmIChpc0hpZ2hDb250cmFzdCkKLSAgICAgIHsKLSAgICAgICAgY29sb3IgPSBDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29sb3IgPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb2xvciA9IENvbG9yQ29uc3RhbnRzLmdyYXk7Ci0gICAgfQotICAgIHJldHVybiBjb2xvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIGlzU2VsZWN0ZWQgPSB0cnVlOwotCi0gICAgaWYgKGlzSGlnaENvbnRyYXN0KQotICAgIHsKLSAgICAgIGxhYmVsSG9sZGVyLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5saXN0Rm9yZWdyb3VuZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsYWJlbEhvbGRlci5zZXRCYWNrZ3JvdW5kQ29sb3IoRmllbGRGaWd1cmUuY2VsbENvbG9yKTsKLSAgICB9Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbXB1dGVMYWJlbENvbG9yKCkpOwotICAgIC8vIGxhYmVsSG9sZGVyLnNldEZpbGwodHJ1ZSk7Ci0KLSAgICBpZiAoZG9TY3JvbGwpCi0gICAgewotICAgICAgQ2F0ZWdvcnlFZGl0UGFydCBjYXRlZ29yeUVQID0gKENhdGVnb3J5RWRpdFBhcnQpIGdldFBhcmVudCgpOwotICAgICAgY2F0ZWdvcnlFUC5zY3JvbGxUbyh0aGlzKTsKLSAgICAgIHNldFNjcm9sbChmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGRvU2Nyb2xsID0gZmFsc2U7Ci0KLSAgcHVibGljIHZvaWQgc2V0U2Nyb2xsKGJvb2xlYW4gZG9TY3JvbGwpCi0gIHsKLSAgICB0aGlzLmRvU2Nyb2xsID0gZG9TY3JvbGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gICAgbGFiZWxIb2xkZXIuc2V0QmFja2dyb3VuZENvbG9yKG51bGwpOwotICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihjb21wdXRlTGFiZWxDb2xvcigpKTsKLSAgICAvLyBsYWJlbEhvbGRlci5zZXRGaWxsKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIC8vIERvIG5vdCBvcGVuIG9uIG9yIHNldCBmb2N1cyBvbiBkaXJlY3QgZWRpdCB0eXBlIAotICAgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsKLQotICAgICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKElHcmFwaEVsZW1lbnQpbW9kZWwpLmlzRm9jdXNBbGxvd2VkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0ID0gKExvY2F0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLSAgICAgICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQotICAgICAgICAgICAgaWYgKGhpdFRlc3QobGFiZWxIb2xkZXIsIHApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwZXJmb3JtRHJpbGxEb3duQWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KQotICAgICAgICB7Ci0gICAgICAgICAgTG9jYXRpb25SZXF1ZXN0IGxvY2F0aW9uUmVxdWVzdCA9IChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0gICAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCi0gICAgICAgICAgaWYgKGhpdFRlc3QobGFiZWxIb2xkZXIsIHApKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBkaXIgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSgoWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlciltb2RlbCkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSAiIjsKLSAgICAgICAgICAgIC8vIGZvcmNlIGxvYWQgb2YgaW1wb3J0ZWQgc2NoZW1hCi0gICAgICAgICAgICBpZiAoZGlyIGluc3RhbmNlb2YgWFNESW1wb3J0SW1wbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKChYU0RJbXBvcnRJbXBsKWRpcikuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGlyLmdldFJlc29sdmVkU2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKGRpci5nZXRSZXNvbHZlZFNjaGVtYSgpLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9wZW5PblNlbGVjdGlvbkhlbHBlci5vcGVuWFNERWRpdG9yKGRpci5nZXRSZXNvbHZlZFNjaGVtYSgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGl0VGVzdChJRmlndXJlIHRhcmdldCwgUG9pbnQgbG9jYXRpb24pCi0gIHsKLSAgICBSZWN0YW5nbGUgYiA9IHRhcmdldC5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgdGFyZ2V0LnRyYW5zbGF0ZVRvQWJzb2x1dGUoYik7Ci0gICAgcmV0dXJuIGIuY29udGFpbnMobG9jYXRpb24pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURyaWxsRG93bkFjdGlvbigpCi0gIHsKLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoKEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpIGdldFZpZXdlcigpKS5nZXRSb290RWRpdFBhcnQoKS5nZXRDb250ZW50cygpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBSb290Q29udGVudEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IGdldEVkaXRvclBhcnQoKTsKLS8vICAgICAgICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKEFjdGlvblJlZ2lzdHJ5KSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoQWN0aW9uUmVnaXN0cnkuY2xhc3MpOwotLy8gICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0vLyAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gICAgICAgICAgaWYgKHJlZ2lzdHJ5ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvRWRpdE5hbWUoYm9vbGVhbiBhZGRGcm9tRGVzaWduKQotICB7Ci0gICAgaWYgKCFhZGRGcm9tRGVzaWduKSByZXR1cm47Ci0gICAgCi0vLyAgICByZW1vdmVGZWVkYmFjaygpOwotCi0gICAgT2JqZWN0IG9iamVjdCA9ICgoWFNEQmFzZUFkYXB0ZXIpIGdldE1vZGVsKCkpLmdldFRhcmdldCgpOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICB7Ci0gICAgICBQb2ludCBwID0gbGFiZWwuZ2V0TG9jYXRpb24oKTsKLSAgICAgIFRvcExldmVsTmFtZURpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgVG9wTGV2ZWxOYW1lRGlyZWN0RWRpdE1hbmFnZXIoVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydC50aGlzLCBuZXcgVG9wTGV2ZWxDb21wb25lbnRMYWJlbENlbGxFZGl0b3JMb2NhdG9yKFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQudGhpcywgcCksIChYU0ROYW1lZENvbXBvbmVudCkgb2JqZWN0KTsKLSAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKHdyYXBwZXIpOwotICAgICAgbWFuYWdlci5zaG93KCk7Ci0gICAgfQotICB9Ci0gIAotICBjbGFzcyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgZXh0ZW5kcyBDb21tYW5kIGltcGxlbWVudHMgSUFEVFVwZGF0ZUNvbW1hbmQKLSAgewotICAgIENvbW1hbmQgY29tbWFuZDsKLSAgICBwcm90ZWN0ZWQgRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdDsKLSAgICAKLSAgICBwdWJsaWMgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyKCkKLSAgICB7Ci0gICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9OQU1FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgewotICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgewotICAgICAgWFNEQmFzZUFkYXB0ZXIgYWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcilnZXRNb2RlbCgpOwotICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKTsKLSAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZyluZXdWYWx1ZSkubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBVcGRhdGVOYW1lQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX05BTUUsIChYU0ROYW1lZENvbXBvbmVudClhZGFwdGVyLmdldFRhcmdldCgpLCAoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgIH0KLSAgICAgfQotICB9Ci0KLSAgc3RhdGljIGJvb2xlYW4gcmVzZWxlY3QgPSBmYWxzZTsKLQotICBwdWJsaWMgdm9pZCBzZXRSZXNlbGVjdChib29sZWFuIHN0YXRlKQotICB7Ci0gICAgcmVzZWxlY3QgPSBzdGF0ZTsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWxGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgY3Vyc29yTG9jYXRpb24pCi0gIHsKLSAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChpbnQgdmFsdWUpCi0gIHsKLSAgICAvLyBpZiBpdCBpcyBzZWxlY3RlZCwgd2Ugd2FudCB0byBzY3JvbGwgdG8gaXQKLSAgICBpZiAoZG9TY3JvbGwpCi0gICAgICBzZXRTY3JvbGwodHJ1ZSk7Ci0gICAgc3VwZXIuc2V0U2VsZWN0ZWQodmFsdWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Rm9jdXMoYm9vbGVhbiBiKQotICB7Ci0gICAgc3VwZXIuc2V0Rm9jdXMoYik7Ci0gICAgaGFzRm9jdXMgPSBiOwotICAgIGdldEZpZ3VyZSgpLnJlcGFpbnQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiNGRkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0IGV4dGVuZHMgU2VjdGlvbkVkaXRQYXJ0Ci17Ci0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIElTdHJ1Y3R1cmUgc3RydWN0dXJlID0gICgoQW5ub3RhdGlvbilnZXRNb2RlbCgpKS5nZXRPd25lcigpOwotICAgIGlmIChzdHJ1Y3R1cmUgaW5zdGFuY2VvZiBJQ29tcGxleFR5cGUpCi0gICAgeyAgCi0gICAgICBjb21wbGV4VHlwZSA9IChJQ29tcGxleFR5cGUpc3RydWN0dXJlOwotICAgICAgaWYgKGNvbXBsZXhUeXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpIGNvbXBsZXhUeXBlOwotICAgICAgICByZXR1cm4gYWRhcHRlci5nZXRBdHRyaWJ1dGVHcm91cENvbnRlbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEQmFzZUZpZWxkRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEQmFzZUZpZWxkRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkYWM5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREJhc2VGaWVsZEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5BdHRyaWJ1dGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5FbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxDZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LlJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUZpZWxkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5GaWVsZEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLkRyYWdBbmREcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFhTREJhc2VGaWVsZEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUZpZWxkRWRpdFBhcnQKLXsKLQotICBwdWJsaWMgWFNEQmFzZUZpZWxkRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0I3JlZnJlc2hWaXN1YWxzKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIElGaWVsZEZpZ3VyZSBmaWd1cmUgPSBnZXRGaWVsZEZpZ3VyZSgpOwotICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGdldE1vZGVsKCk7Ci0gICAgCi0gICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldFRleHQoZmllbGQuZ2V0TmFtZSgpKTsKLSAgICBmaWd1cmUuZ2V0VHlwZUxhYmVsKCkuc2V0VGV4dChmaWVsZC5nZXRUeXBlTmFtZSgpKTsKLSAgICBmaWd1cmUucmVmcmVzaFZpc3VhbHMoZ2V0TW9kZWwoKSk7Ci0gICAgaWYgKGZpZWxkLmlzUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgICBmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmRhcmtHcmF5KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc0hpZ2hDb250cmFzdCkKLSAgICAgIHsKLSAgICAgICAgZmlndXJlLnNldEZvcmVncm91bmRDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQpKTsKLSAgICAgICAgZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7ICAgICAKLSAgICB9Ci0KLSAgICBTdHJpbmcgb2NjdXJyZW5jZURlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBJQW5ub3RhdGlvblByb3ZpZGVyKQotICAgIHsKLSAgICAgIG9jY3VycmVuY2VEZXNjcmlwdGlvbiA9ICgoSUFubm90YXRpb25Qcm92aWRlcilmaWVsZCkuZ2V0TmFtZUFubm90YXRpb25TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmVmcmVzaEljb24oKTsKLSAgICBmaWd1cmUuZ2V0TmFtZUFubm90YXRpb25MYWJlbCgpLnNldFRleHQob2NjdXJyZW5jZURlc2NyaXB0aW9uKTsKLSAgICAKLSAgICBmaWd1cmUucmVjb21wdXRlTGF5b3V0KCk7Ci0KLQotICAgIGlmIChnZXRSb290KCkgIT0gbnVsbCkKLSAgICAgICgoR3JhcGhpY2FsRWRpdFBhcnQpZ2V0Um9vdCgpKS5nZXRGaWd1cmUoKS5pbnZhbGlkYXRlVHJlZSgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoSWNvbigpICAKLSAgewotICAgIElGaWVsZEZpZ3VyZSBmaWd1cmUgPSBnZXRGaWVsZEZpZ3VyZSgpOyAgIAotICAgIC8vIG91ciBtb2RlbCBpbXBsZW1lbnRzIElUcmVlRWxlbWVudAotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgSW1hZ2UgaW1hZ2UgPSAoKFhTREJhc2VBZGFwdGVyKWdldE1vZGVsKCkpLmdldEltYWdlKCk7Ci0gICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSAoKFhTREJhc2VBZGFwdGVyKWdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKTsKLSAgICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRJY29uKGltYWdlKTsKLSAgICAgIAotICAgICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRJY29uKFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKGNvbXAsIGltYWdlLCBpc1JlYWRPbmx5KSk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZE5vdGlmeSgpCi0gIHsKLSAgICBzdXBlci5hZGROb3RpZnkoKTsKLSAgICBnZXRGaWVsZEZpZ3VyZSgpLmVkaXRQYXJ0QXR0YWNoZWQodGhpcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpOwotICAgIGlmICghaXNGaWxlUmVhZE9ubHkoKSkKLSAgICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsIG5ldyBEcmFnQW5kRHJvcEVkaXRQb2xpY3koZ2V0Vmlld2VyKCksIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRpcmVjdEVkaXROYW1lRmllbGQoKQotICB7Ci0gICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICBJRmllbGRGaWd1cmUgZmllbGRGaWd1cmUgPSBnZXRGaWVsZEZpZ3VyZSgpOwotICAgIGlmICggbW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpIAotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIG1vZGVsOwotICAgICAgaWYgKGZpZWxkLmlzUmVmZXJlbmNlKCkpCi0gICAgICB7Ci0gICAgICAgIFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOwotICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgbWFuYWdlciA9IG5ldyBFbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoKElGaWVsZCkgbW9kZWwsIHRoaXMsIGZpZWxkRmlndXJlLmdldE5hbWVMYWJlbCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChmaWVsZCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgewotICAgICAgICAgIG1hbmFnZXIgPSBuZXcgQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoKElGaWVsZCkgbW9kZWwsIHRoaXMsIGZpZWxkRmlndXJlLmdldE5hbWVMYWJlbCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUmVmZXJlbmNlVXBkYXRlQ29tbWFuZCBlbGVtZW50VXBkYXRlQ29tbWFuZCA9IG5ldyBSZWZlcmVuY2VVcGRhdGVDb21tYW5kKCk7Ci0gICAgICAgICAgZWxlbWVudFVwZGF0ZUNvbW1hbmQuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0gICAgICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKGVsZW1lbnRVcGRhdGVDb21tYW5kKTsKLSAgICAgICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBMYWJlbEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTGFiZWxFZGl0TWFuYWdlcih0aGlzLCBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcih0aGlzLCBudWxsKSk7Ci0gICAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQod3JhcHBlcik7Ci0gICAgICAgIG1hbmFnZXIuc2hvdygpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Rm9jdXMoYm9vbGVhbiBmb2N1cykKLSAgewotICAgIHN1cGVyLnNldEZvY3VzKGZvY3VzKTsKLSAgICBoYXNGb2N1cyA9IGZvY3VzOwotICAgICgoRmllbGRGaWd1cmUpZ2V0RmlndXJlKCkpLmhhc0ZvY3VzID0gaGFzRm9jdXM7Ci0gICAgZ2V0RmlndXJlKCkucmVwYWludCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RFZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExYjc4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RNb2RlbEdyb3VwQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNjaGVtYUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5BRFRFZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Db2x1bW5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuVHlwZVZpekZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuSUV4dGVuZGVkRmlndXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklNb2RlbEdyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0UGFydEZhY3RvcnkgZXh0ZW5kcyBBRFRFZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5Ci17Ci0gIHByb3RlY3RlZCBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGRlbGVnYXRlOwotICAKLSAgcHVibGljIFhTREVkaXRQYXJ0RmFjdG9yeSgpCi0gIHsKLSAgICBkZWxlZ2F0ZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkuZ2V0RmlndXJlRmFjdG9yeSgpOwotICAgIGlmIChkZWxlZ2F0ZSA9PSBudWxsKQotICAgICAgZGVsZWdhdGUgPSBuZXcgVHlwZVZpekZpZ3VyZUZhY3RvcnkoKTsKLSAgfQotICAKLSAgcHVibGljIFhTREVkaXRQYXJ0RmFjdG9yeShJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGZpZ3VyZUZhY3RvcnkpCi0gIHsKLSAgICBkZWxlZ2F0ZSA9IGZpZ3VyZUZhY3Rvcnk7Ci0gIH0KLSAgCi0KLSAgcHVibGljIEVkaXRQYXJ0IGRvQ3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgRWRpdFBhcnQgY2hpbGQgPSBudWxsOwotICAgIC8vIE92ZXJyaWRlIGVkaXQgcGFydCB3aGVyZSBkZXNpcmVkCi0gICAgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkKQotICAgIHsKLSAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFNwYWNlRmlsbGVyKQotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBTcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEVkaXRQYXJ0KQotICAgICAgeyAgCi0gICAgICAgIGNoaWxkID0gbmV3IFhTREJhc2VGaWVsZEVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEU2NoZW1hQWRhcHRlcikKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBYU0RTY2hlbWFFZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBDYXRlZ29yeUVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IFhTRFNpbXBsZVR5cGVFZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBBZGFwdGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IE1vZGVsR3JvdXBFZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgewotICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIG1vZGVsOwotICAgICAgU3RyaW5nIGtpbmQgPSBhbm5vdGF0aW9uLmdldENvbXBhcnRtZW50KCkuZ2V0S2luZCgpOwotICAgICAgaWYgKGtpbmQuZXF1YWxzKCJlbGVtZW50IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgY2hpbGQgPSBuZXcgWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChraW5kLmVxdWFscygiYXR0cmlidXRlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgY2hpbGQgPSBuZXcgWFNEQXR0cmlidXRlc0ZvckFubm90YXRpb25FZGl0UGFydCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBDb2x1bW5FZGl0UGFydCkpCi0gICAgeyAgIAotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKQotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgY2hpbGQgPSBuZXcgTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCgpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lhbHppZWQgWFNEIGVkaXQgcGFydCB0byBjcmVhdGUKLSAgICAvLyB0aGVuIHdlIHNpbXBseSBjYWxsIHRoZSBzdXBlciBjbGFzcyB0byBjcmVhdGUgYSBnZW5lcmljIEFEVCBlZGl0IHBhcnQKLSAgICAvLwotICAgIGlmIChjaGlsZCA9PSBudWxsKQotICAgIHsKLSAgICAgIGNoaWxkID0gc3VwZXIuZG9DcmVhdGVFZGl0UGFydChjb250ZXh0LCBtb2RlbCk7Ci0gICAgfQotCi0gICAgLy8gaWYgYXQgdGhpcyB0aGlzIHBvaW50IHdlIGhhdmUgbm90IGNyZWF0ZWQgYW4gZWRpdCBwYXJ0IHdlIHNpbXBseQotICAgIC8vIGNyZWF0ZSBhIHBsYWNlaG9sZGVyIGVkaXQgcGFydCB0byBwcm92aWRlIHRoZSBtb3N0IHJvYnVzdCBiZWhhdmlvdXIgcG9zc2libGUKLSAgICAvLyAgICAKLSAgICBpZiAoY2hpbGQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBUT0RPIChjcykgbG9nIGFuIGVycm9yIG1lc3NhZ2UgaGVyZSwgc2luY2Ugd2Ugc2hvdWxkbid0IHJlYWxseSBnZXQgaGVyZSAKLSAgICAgIGNoaWxkID0gbmV3IFNwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydCgpOwotICAgIH0gIAotICAgIHJldHVybiBjaGlsZDsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcGFydG1lbnRGaWd1cmUgY3JlYXRlQ29tcGFydG1lbnRGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZUNvbXBhcnRtZW50RmlndXJlKG1vZGVsKTsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmVGaWd1cmUgY3JlYXRlU3RydWN0dXJlRmlndXJlKE9iamVjdCBtb2RlbCkKLSAgewotICAgIElTdHJ1Y3R1cmVGaWd1cmUgZmlndXJlID0gZGVsZWdhdGUuY3JlYXRlU3RydWN0dXJlRmlndXJlKG1vZGVsKTsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSAoKFhTREJhc2VBZGFwdGVyKW1vZGVsKS5nZXRUYXJnZXQoKTsKLSAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICgoWFNEQmFzZUFkYXB0ZXIpbW9kZWwpLmlzUmVhZE9ubHkoKTsKLSAgICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRJY29uKFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKCBjb21wLCAoKFhTREJhc2VBZGFwdGVyKW1vZGVsKS5nZXRJbWFnZSgpLCBpc1JlYWRPbmx5KSk7Ci0gICAgfQotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0gIAotCi0gIHB1YmxpYyBJRmllbGRGaWd1cmUgY3JlYXRlRmllbGRGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZUZpZWxkRmlndXJlKG1vZGVsKTsKLSAgfQotICAKLSAgcHVibGljIElNb2RlbEdyb3VwRmlndXJlIGNyZWF0ZU1vZGVsR3JvdXBGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZU1vZGVsR3JvdXBGaWd1cmUobW9kZWwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2NWIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0IGV4dGVuZHMgU2VjdGlvbkVkaXRQYXJ0Ci17Ci0gIHB1YmxpYyBYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCB4c2RNb2RlbEdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIElTdHJ1Y3R1cmUgc3RydWN0dXJlID0gICgoQW5ub3RhdGlvbilnZXRNb2RlbCgpKS5nZXRPd25lcigpOwotICAgIGlmIChzdHJ1Y3R1cmUgaW5zdGFuY2VvZiBJQ29tcGxleFR5cGUpCi0gICAgeyAgCi0gICAgICBjb21wbGV4VHlwZSA9IChJQ29tcGxleFR5cGUpc3RydWN0dXJlOwotICAgICAgaWYgKGNvbXBsZXhUeXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpIGNvbXBsZXhUeXBlOwotICAgICAgICB4c2RNb2RlbEdyb3VwTGlzdCA9IGFkYXB0ZXIuZ2V0TW9kZWxHcm91cHMoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0geHNkTW9kZWxHcm91cExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgIGFkYXB0ZXJMaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KChYU0RNb2RlbEdyb3VwKW9iaikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgYWRhcHRlckxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKW9iaikpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cnVjdHVyZSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpIHN0cnVjdHVyZTsKLSAgICAgIFhTRE1vZGVsR3JvdXAgZ3JvdXAgPSBhZGFwdGVyLmdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0TW9kZWxHcm91cCgpOwotICAgICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGFkYXB0ZXJMaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdyb3VwKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RNb2RlbEdyb3VwUm91dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRE1vZGVsR3JvdXBSb3V0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NTc4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRE1vZGVsR3JvdXBSb3V0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Um91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLy8gVE9ETyBNYW5oYXR0YW4gY29ubmVjdGlvbiByb3V0ZXIgaXMgZmluYWwKLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEdyb3VwUm91dGVyIGV4dGVuZHMgQWJzdHJhY3RSb3V0ZXIKLXsKLSAgcHVibGljIFhTRE1vZGVsR3JvdXBSb3V0ZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICBwcml2YXRlIE1hcCByb3dzVXNlZCA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByaXZhdGUgTWFwIGNvbHNVc2VkID0gbmV3IEhhc2hNYXAoKTsKLQotICBwcml2YXRlIE1hcCByZXNlcnZlZEluZm8gPSBuZXcgSGFzaE1hcCgpOwotCi0gIHByaXZhdGUgY2xhc3MgUmVzZXJ2ZWRJbmZvIHsKLSAgICBwdWJsaWMgTGlzdCByZXNlcnZlZFJvd3MgPSBuZXcgQXJyYXlMaXN0KDIpOwotICAgIHB1YmxpYyBMaXN0IHJlc2VydmVkQ29scyA9IG5ldyBBcnJheUxpc3QoMik7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBSYXkgIFVQICAgID0gbmV3IFJheSgwLCAtMSksCi0gICAgICAgICAgICAgIERPV04gID0gbmV3IFJheSgwLCAxKSwKLSAgICAgICAgICAgICAgTEVGVCAgPSBuZXcgUmF5KC0xLCAwKSwKLSAgICAgICAgICAgICAgUklHSFQgPSBuZXcgUmF5KDEsIDApOwotCi0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Sb3V0ZXIjaW52YWxpZGF0ZShDb25uZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgaW52YWxpZGF0ZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICByZW1vdmVSZXNlcnZlZExpbmVzKGNvbm5lY3Rpb24pOwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgZ2V0Q29sdW1uTmVhcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGludCByLCBpbnQgbiwgaW50IHgpIHsKLSAgICBpbnQgbWluID0gTWF0aC5taW4obiwgeCksCi0gICAgICBtYXggPSBNYXRoLm1heChuLCB4KTsKLSAgICBpZiAobWluID4gcikgewotICAgICAgbWF4ID0gbWluOwotICAgICAgbWluID0gciAtIChtaW4gLSByKTsKLSAgICB9Ci0gICAgaWYgKG1heCA8IHIpIHsKLSAgICAgIG1pbiA9IG1heDsKLSAgICAgIG1heCA9IHIgKyAociAtIG1heCk7Ci0gICAgfQotICAgIGludCBwcm94aW1pdHkgPSAwOwotICAgIGludCBkaXJlY3Rpb24gPSAtMTsKLSAgICBpZiAociAlIDIgPT0gMSkKLSAgICAgIHItLTsKLSAgICBJbnRlZ2VyIGk7Ci0gICAgd2hpbGUgKHByb3hpbWl0eSA8IHIpIHsKLSAgICAgIGkgPSBuZXcgSW50ZWdlcihyICsgcHJveGltaXR5ICogZGlyZWN0aW9uKTsKLSAgICAgIGlmICghY29sc1VzZWQuY29udGFpbnNLZXkoaSkpIHsKLSAgICAgICAgY29sc1VzZWQucHV0KGksIGkpOwotICAgICAgICByZXNlcnZlQ29sdW1uKGNvbm5lY3Rpb24sIGkpOwotICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOwotICAgICAgfQotICAgICAgaW50IGogPSBpLmludFZhbHVlKCk7Ci0gICAgICBpZiAoaiA8PSBtaW4pCi0gICAgICAgIHJldHVybiBqICsgMjsKLSAgICAgIGlmIChqID49IG1heCkKLSAgICAgICAgcmV0dXJuIGogLSAyOwotICAgICAgaWYgKGRpcmVjdGlvbiA9PSAxKQotICAgICAgICBkaXJlY3Rpb24gPSAtMTsKLSAgICAgIGVsc2UgewotICAgICAgICBkaXJlY3Rpb24gPSAxOwotICAgICAgICBwcm94aW1pdHkgKz0gMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGlyZWN0aW9uIHRoZSBwb2ludCA8aT5wPC9pPiBpcyBpbiByZWxhdGlvbiB0byB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLgotICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlIExFRlQgKC0xLDApLCBSSUdIVCAoMSwwKSwgVVAgKDAsLTEpIGFuZCBET1dOICgwLDEpLgotICAgKiAKLSAgICogQHBhcmFtIHIgdGhlIHJlY3RhbmdsZQotICAgKiBAcGFyYW0gcCB0aGUgcG9pbnQKLSAgICogQHJldHVybiB0aGUgZGlyZWN0aW9uIGZyb20gPGk+cjwvaT4gdG8gPGk+cDwvaT4KLSAgICovCi0gIHByb3RlY3RlZCBSYXkgZ2V0RGlyZWN0aW9uKFJlY3RhbmdsZSByLCBQb2ludCBwKSB7Ci0gICAgaW50IGksIGRpc3RhbmNlID0gTWF0aC5hYnMoci54IC0gcC54KTsKLSAgICBSYXkgZGlyZWN0aW9uOwotICAgIAotICAgIGRpcmVjdGlvbiA9IExFRlQ7Ci0KLSAgICBpID0gTWF0aC5hYnMoci55IC0gcC55KTsKLSAgICBpZiAoaSA8PSBkaXN0YW5jZSkgewotICAgICAgZGlzdGFuY2UgPSBpOwotICAgICAgZGlyZWN0aW9uID0gVVA7Ci0gICAgfQotCi0gICAgaSA9IE1hdGguYWJzKHIuYm90dG9tKCkgLSBwLnkpOwotICAgIGlmIChpIDw9IGRpc3RhbmNlKSB7Ci0gICAgICBkaXN0YW5jZSA9IGk7Ci0gICAgICBkaXJlY3Rpb24gPSBET1dOOwotICAgIH0KLQotICAgIGkgPSBNYXRoLmFicyhyLnJpZ2h0KCkgLSBwLngpOwotICAgIGlmIChpIDwgZGlzdGFuY2UpIHsKLSAgICAgIGRpc3RhbmNlID0gaTsKLSAgICAgIGRpcmVjdGlvbiA9IFJJR0hUOwotICAgIH0KLQotICAgIHJldHVybiBkaXJlY3Rpb247Ci0gIH0KLQotICBwcm90ZWN0ZWQgUmF5IGdldEVuZERpcmVjdGlvbihDb25uZWN0aW9uIGNvbm4pIHsKLSAgICBDb25uZWN0aW9uQW5jaG9yIGFuY2hvciA9IGNvbm4uZ2V0VGFyZ2V0QW5jaG9yKCk7Ci0gICAgUG9pbnQgcCA9IGdldEVuZFBvaW50KGNvbm4pOwotICAgIFJlY3RhbmdsZSByZWN0OwotICAgIGlmIChhbmNob3IuZ2V0T3duZXIoKSA9PSBudWxsKQotICAgICAgcmVjdCA9IG5ldyBSZWN0YW5nbGUocC54IC0gMSwgcC55IC0gMSwgMiwgMik7Ci0gICAgZWxzZSB7Ci0gICAgICByZWN0ID0gY29ubi5nZXRUYXJnZXRBbmNob3IoKS5nZXRPd25lcigpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICAgIGNvbm4uZ2V0VGFyZ2V0QW5jaG9yKCkuZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotICAgIH0KLSAgICByZXR1cm4gZ2V0RGlyZWN0aW9uKHJlY3QsIHApOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBnZXRSb3dOZWFyKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgaW50IHIsIGludCBuLCBpbnQgeCkgewotICAgIGludCBtaW4gPSBNYXRoLm1pbihuLCB4KSwKLSAgICAgIG1heCA9IE1hdGgubWF4KG4sIHgpOwotICAgIGlmIChtaW4gPiByKSB7Ci0gICAgICBtYXggPSBtaW47Ci0gICAgICBtaW4gPSByIC0gKG1pbiAtIHIpOwotICAgIH0KLSAgICBpZiAobWF4IDwgcikgewotICAgICAgbWluID0gbWF4OwotICAgICAgbWF4ID0gciArIChyIC0gbWF4KTsKLSAgICB9Ci0KLSAgICBpbnQgcHJveGltaXR5ID0gMDsKLSAgICBpbnQgZGlyZWN0aW9uID0gLTE7Ci0gICAgaWYgKHIgJSAyID09IDEpCi0gICAgICByLS07Ci0gICAgSW50ZWdlciBpOwotICAgIHdoaWxlIChwcm94aW1pdHkgPCByKSB7Ci0gICAgICBpID0gbmV3IEludGVnZXIociArIHByb3hpbWl0eSAqIGRpcmVjdGlvbik7Ci0gICAgICBpZiAoIXJvd3NVc2VkLmNvbnRhaW5zS2V5KGkpKSB7Ci0gICAgICAgIHJvd3NVc2VkLnB1dChpLCBpKTsKLSAgICAgICAgcmVzZXJ2ZVJvdyhjb25uZWN0aW9uLCBpKTsKLSAgICAgICAgcmV0dXJuIGkuaW50VmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGludCBqID0gaS5pbnRWYWx1ZSgpOwotICAgICAgaWYgKGogPD0gbWluKQotICAgICAgICByZXR1cm4gaiArIDI7Ci0gICAgICBpZiAoaiA+PSBtYXgpCi0gICAgICAgIHJldHVybiBqIC0gMjsKLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gMSkKLSAgICAgICAgZGlyZWN0aW9uID0gLTE7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgZGlyZWN0aW9uID0gMTsKLSAgICAgICAgcHJveGltaXR5ICs9IDI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByOwotICB9Ci0KLSAgcHJvdGVjdGVkIFJheSBnZXRTdGFydERpcmVjdGlvbihDb25uZWN0aW9uIGNvbm4pIHsKLSAgICBDb25uZWN0aW9uQW5jaG9yIGFuY2hvciA9IGNvbm4uZ2V0U291cmNlQW5jaG9yKCk7Ci0gICAgUG9pbnQgcCA9IGdldFN0YXJ0UG9pbnQoY29ubik7Ci0gICAgUmVjdGFuZ2xlIHJlY3Q7Ci0gICAgaWYgKGFuY2hvci5nZXRPd25lcigpID09IG51bGwpCi0gICAgICByZWN0ID0gbmV3IFJlY3RhbmdsZShwLnggLSAxLCBwLnkgLSAxLCAyLCAyKTsKLSAgICBlbHNlIHsKLSAgICAgIHJlY3QgPSBjb25uLmdldFNvdXJjZUFuY2hvcigpLmdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgY29ubi5nZXRTb3VyY2VBbmNob3IoKS5nZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0gICAgfQotICAgIHJldHVybiBnZXREaXJlY3Rpb24ocmVjdCwgcCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUG9zaXRpb25zKFJheSBzdGFydCwgUmF5IGVuZCwgTGlzdCBwb3NpdGlvbnMsIAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhvcml6b250YWwsIENvbm5lY3Rpb24gY29ubikgewotICAgIHJlbW92ZVJlc2VydmVkTGluZXMoY29ubik7Ci0KLSAgICBpbnQgcG9zW10gPSBuZXcgaW50W3Bvc2l0aW9ucy5zaXplKCkgKyAyXTsKLSAgICBpZiAoaG9yaXpvbnRhbCkKLSAgICAgIHBvc1swXSA9IHN0YXJ0Lng7Ci0gICAgZWxzZQotICAgICAgcG9zWzBdID0gc3RhcnQueTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcG9zaXRpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICBwb3NbaSArIDFdID0gKChJbnRlZ2VyKXBvc2l0aW9ucy5nZXQoaSkpLmludFZhbHVlKCk7Ci0gICAgfQotICAgIGlmIChob3Jpem9udGFsID09IChwb3NpdGlvbnMuc2l6ZSgpICUgMiA9PSAxKSkKLSAgICAgIHBvc1srK2ldID0gZW5kLng7Ci0gICAgZWxzZQotICAgICAgcG9zWysraV0gPSBlbmQueTsKLQotICAgIFBvaW50TGlzdCBwb2ludHMgPSBuZXcgUG9pbnRMaXN0KCk7Ci0gICAgcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChzdGFydC54LCBzdGFydC55KSk7Ci0gICAgUG9pbnQgcDsKLSAgICBpbnQgY3VycmVudCwgcHJldiwgbWluLCBtYXg7Ci0gICAgYm9vbGVhbiBhZGp1c3Q7Ci0gICAgZm9yIChpID0gMjsgaSA8IHBvcy5sZW5ndGggLSAxOyBpKyspIHsKLSAgICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLSAgICAgIHByZXYgPSBwb3NbaSAtIDFdOwotICAgICAgY3VycmVudCA9IHBvc1tpXTsKLQotICAgICAgYWRqdXN0ID0gKGkgIT0gcG9zLmxlbmd0aCAtIDIpOwotICAgICAgaWYgKGhvcml6b250YWwpIHsKLSAgICAgICAgaWYgKGFkanVzdCkgewotICAgICAgICAgIG1pbiA9IHBvc1tpIC0gMl07Ci0gICAgICAgICAgbWF4ID0gcG9zW2kgKyAyXTsKLSAgICAgICAgICBwb3NbaV0gPSBjdXJyZW50ID0gZ2V0Um93TmVhcihjb25uLCBjdXJyZW50LCBtaW4sIG1heCk7Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IG5ldyBQb2ludChwcmV2LCBjdXJyZW50KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhZGp1c3QpIHsKLSAgICAgICAgICBtaW4gPSBwb3NbaSAtIDJdOwotICAgICAgICAgIG1heCA9IHBvc1tpICsgMl07Ci0gICAgICAgICAgcG9zW2ldID0gY3VycmVudCA9IGdldENvbHVtbk5lYXIoY29ubiwgY3VycmVudCwgbWluLCBtYXgpOwotICAgICAgICB9Ci0gICAgICAgIHAgPSBuZXcgUG9pbnQoY3VycmVudCwgcHJldik7Ci0gICAgICB9Ci0gICAgICBwb2ludHMuYWRkUG9pbnQocCk7Ci0gICAgfQotICAgIHBvaW50cy5hZGRQb2ludChuZXcgUG9pbnQoZW5kLngsIGVuZC55KSk7Ci0gICAgY29ubi5zZXRQb2ludHMocG9pbnRzKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uUm91dGVyI3JlbW92ZShDb25uZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgIHJlbW92ZVJlc2VydmVkTGluZXMoY29ubmVjdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNlcnZlZExpbmVzKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgIFJlc2VydmVkSW5mbyBySW5mbyA9IChSZXNlcnZlZEluZm8pIHJlc2VydmVkSW5mby5nZXQoY29ubmVjdGlvbik7Ci0gICAgaWYgKHJJbmZvID09IG51bGwpIAotICAgICAgcmV0dXJuOwotICAgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgckluZm8ucmVzZXJ2ZWRSb3dzLnNpemUoKTsgaSsrKSB7Ci0gICAgICByb3dzVXNlZC5yZW1vdmUockluZm8ucmVzZXJ2ZWRSb3dzLmdldChpKSk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgckluZm8ucmVzZXJ2ZWRDb2xzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBjb2xzVXNlZC5yZW1vdmUockluZm8ucmVzZXJ2ZWRDb2xzLmdldChpKSk7Ci0gICAgfQotICAgIHJlc2VydmVkSW5mby5yZW1vdmUoY29ubmVjdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZXNlcnZlQ29sdW1uKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgSW50ZWdlciBjb2x1bW4pIHsKLSAgICBSZXNlcnZlZEluZm8gaW5mbyA9IChSZXNlcnZlZEluZm8pIHJlc2VydmVkSW5mby5nZXQoY29ubmVjdGlvbik7Ci0gICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgaW5mbyA9IG5ldyBSZXNlcnZlZEluZm8oKTsKLSAgICAgIHJlc2VydmVkSW5mby5wdXQoY29ubmVjdGlvbiwgaW5mbyk7Ci0gICAgfQotICAgIGluZm8ucmVzZXJ2ZWRDb2xzLmFkZChjb2x1bW4pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVzZXJ2ZVJvdyhDb25uZWN0aW9uIGNvbm5lY3Rpb24sIEludGVnZXIgcm93KSB7Ci0gICAgUmVzZXJ2ZWRJbmZvIGluZm8gPSAoUmVzZXJ2ZWRJbmZvKSByZXNlcnZlZEluZm8uZ2V0KGNvbm5lY3Rpb24pOwotICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgIGluZm8gPSBuZXcgUmVzZXJ2ZWRJbmZvKCk7Ci0gICAgICByZXNlcnZlZEluZm8ucHV0KGNvbm5lY3Rpb24sIGluZm8pOwotICAgIH0KLSAgICBpbmZvLnJlc2VydmVkUm93cy5hZGQocm93KTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uUm91dGVyI3JvdXRlKENvbm5lY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCByb3V0ZShDb25uZWN0aW9uIGNvbm4pIHsKLSAgICBpZiAoKGNvbm4uZ2V0U291cmNlQW5jaG9yKCkgPT0gbnVsbCkgfHwgKGNvbm4uZ2V0VGFyZ2V0QW5jaG9yKCkgPT0gbnVsbCkpIAotICAgICAgcmV0dXJuOwotICAgIGludCBpOwotICAgIFBvaW50IHN0YXJ0UG9pbnQgPSBnZXRTdGFydFBvaW50KGNvbm4pOwotICAgIGNvbm4udHJhbnNsYXRlVG9SZWxhdGl2ZShzdGFydFBvaW50KTsKLSAgICBQb2ludCBlbmRQb2ludCA9IGdldEVuZFBvaW50KGNvbm4pOwotICAgIGNvbm4udHJhbnNsYXRlVG9SZWxhdGl2ZShlbmRQb2ludCk7Ci0KLSAgICBSYXkgc3RhcnQgPSBuZXcgUmF5KHN0YXJ0UG9pbnQpOwotICAgIFJheSBlbmQgPSBuZXcgUmF5KGVuZFBvaW50KTsKLSAgICBSYXkgYXZlcmFnZSA9IG5ldyBSYXkoc3RhcnRQb2ludC54ICsgNCwgc3RhcnRQb2ludC55KTsgLy8gc3RhcnQuZ2V0QXZlcmFnZWQoZW5kKTsKLQotICAgIFJheSBkaXJlY3Rpb24gPSBuZXcgUmF5KHN0YXJ0LCBlbmQpOwotICAgIFJheSBzdGFydE5vcm1hbCA9IGdldFN0YXJ0RGlyZWN0aW9uKGNvbm4pOwotICAgIFJheSBlbmROb3JtYWwgICA9IGdldEVuZERpcmVjdGlvbihjb25uKTsKLQotICAgIExpc3QgcG9zaXRpb25zID0gbmV3IEFycmF5TGlzdCg1KTsKLSAgICBib29sZWFuIGhvcml6b250YWwgPSBzdGFydE5vcm1hbC5pc0hvcml6b250YWwoKTsKLSAgICBpZiAoaG9yaXpvbnRhbCkgCi0gICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKHN0YXJ0LnkpKTsKLSAgICBlbHNlCi0gICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKHN0YXJ0LngpKTsKLSAgICBob3Jpem9udGFsID0gIWhvcml6b250YWw7Ci0KLSAgICBpZiAoc3RhcnROb3JtYWwuZG90UHJvZHVjdChlbmROb3JtYWwpID09IDApIHsKLSAgICAgIGlmICgoc3RhcnROb3JtYWwuZG90UHJvZHVjdChkaXJlY3Rpb24pID49IDApIAotICAgICAgICAmJiAoZW5kTm9ybWFsLmRvdFByb2R1Y3QoZGlyZWN0aW9uKSA8PSAwKSkgewotICAgICAgICAvLyAwCi0gICAgICB9IGVsc2UgewotICAgICAgICAvLyAyCi0gICAgICAgIGlmIChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPCAwKQotICAgICAgICAgIGkgPSBzdGFydE5vcm1hbC5zaW1pbGFyaXR5KHN0YXJ0LmdldEFkZGVkKHN0YXJ0Tm9ybWFsLmdldFNjYWxlZCgxMCkpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKGhvcml6b250YWwpIAotICAgICAgICAgICAgaSA9IGF2ZXJhZ2UueTsKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgaSA9IGF2ZXJhZ2UueDsKLSAgICAgICAgfQotICAgICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgaG9yaXpvbnRhbCA9ICFob3Jpem9udGFsOwotCi0gICAgICAgIGlmIChlbmROb3JtYWwuZG90UHJvZHVjdChkaXJlY3Rpb24pID4gMCkKLSAgICAgICAgICBpID0gZW5kTm9ybWFsLnNpbWlsYXJpdHkoZW5kLmdldEFkZGVkKGVuZE5vcm1hbC5nZXRTY2FsZWQoMTApKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmIChob3Jpem9udGFsKSAKLSAgICAgICAgICAgIGkgPSBhdmVyYWdlLnk7Ci0gICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgIGkgPSBhdmVyYWdlLng7Ci0gICAgICAgIH0KLSAgICAgICAgcG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihpKSk7Ci0gICAgICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHN0YXJ0Tm9ybWFsLmRvdFByb2R1Y3QoZW5kTm9ybWFsKSA+IDApIHsKLSAgICAgICAgLy8xCi0gICAgICAgIGlmIChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPj0gMCkKLSAgICAgICAgICBpID0gc3RhcnROb3JtYWwuc2ltaWxhcml0eShzdGFydC5nZXRBZGRlZChzdGFydE5vcm1hbC5nZXRTY2FsZWQoMTApKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpID0gZW5kTm9ybWFsLnNpbWlsYXJpdHkoZW5kLmdldEFkZGVkKGVuZE5vcm1hbC5nZXRTY2FsZWQoMTApKSk7Ci0gICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICBob3Jpem9udGFsID0gIWhvcml6b250YWw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLzMgb3IgMQotICAgICAgICBpZiAoc3RhcnROb3JtYWwuZG90UHJvZHVjdChkaXJlY3Rpb24pIDwgMCkgewotICAgICAgICAgIGkgPSBzdGFydE5vcm1hbC5zaW1pbGFyaXR5KHN0YXJ0LmdldEFkZGVkKHN0YXJ0Tm9ybWFsLmdldFNjYWxlZCgxMCkpKTsKLSAgICAgICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgICBob3Jpem9udGFsID0gIWhvcml6b250YWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaG9yaXpvbnRhbCkgCi0gICAgICAgICAgaSA9IGF2ZXJhZ2UueTsKLSAgICAgICAgZWxzZSAKLSAgICAgICAgICBpID0gYXZlcmFnZS54OwotICAgICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgaG9yaXpvbnRhbCA9ICFob3Jpem9udGFsOwotCi0gICAgICAgIGlmIChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPCAwKSB7Ci0gICAgICAgICAgaSA9IGVuZE5vcm1hbC5zaW1pbGFyaXR5KGVuZC5nZXRBZGRlZChlbmROb3JtYWwuZ2V0U2NhbGVkKDEwKSkpOwotICAgICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoaG9yaXpvbnRhbCkgCi0gICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGVuZC55KSk7Ci0gICAgZWxzZSAKLSAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoZW5kLngpKTsKLSAgICAKLSAgICBwcm9jZXNzUG9zaXRpb25zKHN0YXJ0LCBlbmQsIHBvc2l0aW9ucywgc3RhcnROb3JtYWwuaXNIb3Jpem9udGFsKCksIGNvbm4pOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEU2NoZW1hRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEU2NoZW1hRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwYWQ3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRFNjaGVtYUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuVGV4dFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTY2hlbWFBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkhlYWRpbmdGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24ubGF5b3V0cy5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotCi0gIHByb3RlY3RlZCBGaWd1cmUgb3V0ZXIsIGNvbnRlbnRGaWd1cmU7Ci0gIHByb3RlY3RlZCBIZWFkaW5nRmlndXJlIGhlYWRpbmdGaWd1cmU7Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRGaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgb3V0ZXIgPSBuZXcgRmlndXJlKCk7Ci0gICAgb3V0ZXIuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKDEpKTsKLQotICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDQpOwotICAgIG91dGVyLnNldExheW91dE1hbmFnZXIoZmlsbExheW91dCk7Ci0KLSAgICBoZWFkaW5nRmlndXJlID0gbmV3IEhlYWRpbmdGaWd1cmUoKTsKLSAgICBvdXRlci5hZGQoaGVhZGluZ0ZpZ3VyZSk7Ci0KLSAgICBSZWN0YW5nbGVGaWd1cmUgbGluZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKQotICAgIHsKLSAgICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkKLSAgICAgIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5nZXRQcmVmZXJyZWRTaXplKHdIaW50LCBoSGludCk7Ci0gICAgICAgIGQuaGVpZ2h0ID0gMTsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBUb29sYmFyTGF5b3V0IGxpbmVMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgbGluZUxheW91dC5zZXRWZXJ0aWNhbCh0cnVlKTsKLSAgICBsaW5lTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgbGluZS5zZXRMYXlvdXRNYW5hZ2VyKGxpbmVMYXlvdXQpOwotICAgIG91dGVyLmFkZChsaW5lKTsKLQotICAgIGNvbnRlbnRGaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgY29udGVudEZpZ3VyZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig0KSk7Ci0gICAgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDQpOwotICAgIGNvbnRlbnRGaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihmaWxsTGF5b3V0KTsKLQotICAgIG91dGVyLmFkZChjb250ZW50RmlndXJlKTsKLSAgICByZXR1cm4gb3V0ZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIFhTRFNjaGVtYUFkYXB0ZXIgc2NoZW1hQWRhcHRlciA9IChYU0RTY2hlbWFBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotLy8gQnVnIDEwMzg3MDogdW5kbyBibGFua3Mgb3V0IHNjaGVtYSB2aWV3ICAgIAotLy8gICAgc2NoZW1hQWRhcHRlci51cGRhdGVDYXRlZ29yaWVzKCk7Ci0KLSAgICBMaXN0IHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHRlbXBsaXN0LmFkZChzY2hlbWFBZGFwdGVyLmdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTKSk7Ci0gICAgSG9sZGVyIGhvbGRlciA9IG5ldyBIb2xkZXIodGVtcGxpc3QpOwotICAgIGxpc3QuYWRkKGhvbGRlcik7Ci0KLSAgICB0ZW1wbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB0ZW1wbGlzdC5hZGQoc2NoZW1hQWRhcHRlci5nZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuRUxFTUVOVFMpKTsKLSAgICB0ZW1wbGlzdC5hZGQoc2NoZW1hQWRhcHRlci5nZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpKTsKLSAgICBob2xkZXIgPSBuZXcgSG9sZGVyKHRlbXBsaXN0KTsKLSAgICBsaXN0LmFkZChob2xkZXIpOwotCi0gICAgdGVtcGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdGVtcGxpc3QuYWRkKHNjaGVtYUFkYXB0ZXIuZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVMpKTsKLSAgICB0ZW1wbGlzdC5hZGQoc2NoZW1hQWRhcHRlci5nZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKSk7Ci0gICAgaG9sZGVyID0gbmV3IEhvbGRlcih0ZW1wbGlzdCk7Ci0gICAgbGlzdC5hZGQoaG9sZGVyKTsKLQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkKLSAgewotICAgIENhdGVnb3J5Um93RWRpdFBhcnQgcmVzdWx0ID0gbmV3IENhdGVnb3J5Um93RWRpdFBhcnQoKTsKLSAgICByZXN1bHQuc2V0TW9kZWwobW9kZWwpOwotICAgIHJlc3VsdC5zZXRQYXJlbnQodGhpcyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgCi0gICAgTGluZUJvcmRlciBib3JkZXIgPSAoTGluZUJvcmRlcikgb3V0ZXIuZ2V0Qm9yZGVyKCk7Ci0gICAgYm9yZGVyLnNldFdpZHRoKGlzU2VsZWN0ZWQgPyAyIDogMSk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5zZXRTZWxlY3RlZChpc1NlbGVjdGVkKTsKLQotICAgIFhTRFNjaGVtYUFkYXB0ZXIgc2NoZW1hQWRhcHRlciA9IChYU0RTY2hlbWFBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIEltYWdlIGltYWdlID0gc2NoZW1hQWRhcHRlci5nZXRJbWFnZSgpOwotICAgIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKS5zZXRJY29uKGltYWdlKTsKLSAgICBpZiAoaW1hZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoZWFkaW5nRmlndXJlLmdldExhYmVsKCkuc2V0SWNvbihYU0RDb21tb25VSVV0aWxzLmdldFVwZGF0ZWRJbWFnZSgoWFNEQ29uY3JldGVDb21wb25lbnQpIHNjaGVtYUFkYXB0ZXIuZ2V0VGFyZ2V0KCksIGltYWdlLCBmYWxzZSkpOwotICAgIH0KLSAgICBvdXRlci5yZXBhaW50KCk7Ci0gICAgCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZVZhbHVlID0gKChYU0RTY2hlbWEpICgoWFNEU2NoZW1hQWRhcHRlcikgZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCkpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIHRhcmdldE5hbWVzcGFjZVZhbHVlID0gVGV4dFByb2Nlc3Nvci5wcm9jZXNzKHRhcmdldE5hbWVzcGFjZVZhbHVlKTsKLQotICAgIGlmICh0YXJnZXROYW1lc3BhY2VWYWx1ZSA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZVZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgdGFyZ2V0TmFtZXNwYWNlVmFsdWUgPSBNZXNzYWdlcy5fVUlfR1JBUEhfWFNEU0NIRU1BX05PX05BTUVTUEFDRTsKLSAgICB9Ci0gICAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldFRleHQoTWVzc2FnZXMuX1VJX0dSQVBIX1hTRFNDSEVNQSArICIgOiAiICsgdGFyZ2V0TmFtZXNwYWNlVmFsdWUpOyAgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2F0ZWdvcnlFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKWVkaXRQYXJ0LmdldE1vZGVsKCk7ICAgIAotICAgICAgICBzd2l0Y2ggKGFkYXB0ZXIuZ2V0R3JvdXBUeXBlKCkpCi0gICAgICAgIHsgCi0gICAgICAgICAgY2FzZSBDYXRlZ29yeUFkYXB0ZXIuRElSRUNUSVZFUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRDYXRlZ29yeUVkaXRQYXJ0KENhdGVnb3J5QWRhcHRlci5FTEVNRU5UUyk7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5FTEVNRU5UUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRDYXRlZ29yeUVkaXRQYXJ0KENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgIAotICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRDYXRlZ29yeUVkaXRQYXJ0KENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeUFkYXB0ZXIuVFlQRVM6Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Q2F0ZWdvcnlFZGl0UGFydChDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgIAotICAgICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRDYXRlZ29yeUVkaXRQYXJ0KENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBicmVhazsgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTOiAgICAgIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLkVMRU1FTlRTKTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAgCi0gICAgICAgICAgY2FzZSBDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTOiAgICAgIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLlRZUEVTKTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfSAKLSAgICAgIGVsc2UgaWYgKGVkaXRQYXJ0ID09IHRoaXMpCi0gICAgICB7ICAgICAgIAotICAgICAgICBpZiAoZGlyZWN0aW9uID09IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuSU5fVE9fRklSU1RfQ0hJTEQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoKENhdGVnb3J5Um93RWRpdFBhcnQpZ2V0Q2hpbGRyZW4oKS5nZXQoMCkpLmRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsgICAgICAgIAotICAgICAgICB9ICAgICAgICAgIAotICAgICAgfSAgCi0gICAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZ2V0Q2F0ZWdvcnlFZGl0UGFydChpbnQga2luZCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaiA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkgICAgICAKLSAgICB7ICAgIAotICAgICAgRWRpdFBhcnQgcm93ID0gKEVkaXRQYXJ0KWoubmV4dCgpOyAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJvdy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXRlZ29yeUVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgQ2F0ZWdvcnlFZGl0UGFydCBjYXRlZ29yeUVkaXRQYXJ0ID0gKENhdGVnb3J5RWRpdFBhcnQpZWRpdFBhcnQ7Ci0gICAgICAgICAgQ2F0ZWdvcnlBZGFwdGVyIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKWNhdGVnb3J5RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgICAgICAgICBpZiAoYWRhcHRlci5nZXRHcm91cFR5cGUoKSA9PSBraW5kKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlZGl0UGFydDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwoKSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIEhvbGRlcgotICB7Ci0gICAgTGlzdCBsaXN0OwotCi0gICAgcHVibGljIEhvbGRlcihMaXN0IGxpc3QpCi0gICAgewotICAgICAgdGhpcy5saXN0ID0gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRMaXN0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgQ2F0ZWdvcnlSb3dFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gICAgcHJvdGVjdGVkIEZpZ3VyZSBjb250ZW50UGFuZTsKLQotICAgIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gICAgewotICAgICAgRmlndXJlIGNvbnRhaW5lckZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICAgIGNvbnRhaW5lckZpZ3VyZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig0LCA0LCA0LCA0KSk7Ci0gICAgICAvLyBjb250YWluZXJGaWd1cmUuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKDEpKTsKLSAgICAgIC8vIGNvbnRhaW5lckZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuZ3JlZW4pOwotCi0gICAgICBGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCg0KTsKLSAgICAgIGZpbGxMYXlvdXQuc2V0SG9yaXpvbnRhbCh0cnVlKTsKLSAgICAgIGNvbnRhaW5lckZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKGZpbGxMYXlvdXQpOwotICAgICAgCi0gICAgICByZXR1cm4gY29udGFpbmVyRmlndXJlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhdGVnb3J5RWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5PVVRfVE9fUEFSRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGdldFBhcmVudCgpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgICAgZWxzZSBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LklOX1RPX0ZJUlNUX0NISUxEKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIChFZGl0UGFydClnZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICAgIHJldHVybiAoKFhTRFNjaGVtYUVkaXRQYXJ0KWdldFBhcmVudCgpKS5kb0dldFJlbGF0aXZlRWRpdFBhcnQoZWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQjZ2V0Q29udGVudFBhbmUoKQotICAgICAqLwotICAgIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgICB7Ci0gICAgICBIb2xkZXIgaG9sZGVyID0gKEhvbGRlcikgZ2V0TW9kZWwoKTsKLSAgICAgIHJldHVybiBob2xkZXIuZ2V0TGlzdCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gICAgewotICAgICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZSgpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRFNpbXBsZVR5cGVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RTaW1wbGVUeXBlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1MmFkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRFNpbXBsZVR5cGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hbmhhdHRhbkNvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbHVtbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFREaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklTdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuSGVhZGluZ0ZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLlJvdW5kZWRMaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuU3RydWN0dXJlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZVR5cGVFZGl0UGFydCBleHRlbmRzIEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBTdHJ1Y3R1cmVGaWd1cmUgZmlndXJlOwotICBwcm90ZWN0ZWQgQURURGlyZWN0RWRpdFBvbGljeSBhZHREaXJlY3RFZGl0UG9saWN5ID0gbmV3IEFEVERpcmVjdEVkaXRQb2xpY3koKTsKLSAgCi0gIHB1YmxpYyBYU0RTaW1wbGVUeXBlRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHVibGljIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgZmlndXJlID0gbmV3IFN0cnVjdHVyZUZpZ3VyZSgpOwotICAgIGZpZ3VyZS5zZXRCb3JkZXIobmV3IFJvdW5kZWRMaW5lQm9yZGVyKDEsIDEwKSk7ICAgIAotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KCk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpOwotICAgIFN0cmluZyBuYW1lID0gYWRhcHRlci5nZXREaXNwbGF5TmFtZSgpOwotICAgIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZSA9IGZpZ3VyZS5nZXRIZWFkaW5nRmlndXJlKCk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5zZXRJc1JlYWRPbmx5KGFkYXB0ZXIuaXNSZWFkT25seSgpKTsKLSAgICBMYWJlbCBsYWJlbCA9IGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKTsKLSAgICBsYWJlbC5zZXRUZXh0KG5hbWUpOwotICAgIGxhYmVsLnNldEljb24oWFNEQ29tbW9uVUlVdGlscy5nZXRVcGRhdGVkSW1hZ2UoYWRhcHRlci5nZXRYU0RUeXBlRGVmaW5pdGlvbigpLCBhZGFwdGVyLmdldEltYWdlKCksIGFkYXB0ZXIuaXNSZWFkT25seSgpKSk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZUZpZ3VyZSBnZXRTdHJ1Y3R1cmVGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIChJU3RydWN0dXJlRmlndXJlKWdldEZpZ3VyZSgpOwotICB9Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGdldFN0cnVjdHVyZUZpZ3VyZSgpLmdldENvbnRlbnRQYW5lKCk7Ci0gIH0KLSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIGFkdERpcmVjdEVkaXRQb2xpY3kpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgZ2V0U3RydWN0dXJlRmlndXJlKCkuYWRkU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgICBzdXBlci5hZGRGZWVkYmFjaygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5yZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpOwotICAgIHN1cGVyLnJlbW92ZUZlZWRiYWNrKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIFJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZShCYXNlRWRpdFBhcnQgY2hpbGQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlID0gbnVsbDsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0TW9kZWwoKTsKLSAgICBJVHlwZSBzdXBlclR5cGUgPSBhZGFwdGVyLmdldFN1cGVyVHlwZSgpOwotCi0gICAgaWYgKHN1cGVyVHlwZSAhPSBudWxsKQotICAgIHsgICAgICAKLSAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVmZXJlbmNlVHlwZVBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClnZXRUYXJnZXRFZGl0UGFydChzdXBlclR5cGUpOwotICAgICAgCi0gICAgICBpZiAocmVmZXJlbmNlVHlwZVBhcnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbih0cnVlKTsKLSAgICAgICAgLy8gZHJhdyBhIGxpbmUgb3V0IGZyb20gdGhlIHRvcCAgICAgICAgIAotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKGdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuVE9QLCAxKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPIChjcykgbmVlZCB0byBkcmF3IHRoZSB0YXJnZXQgYW5jaG9yIHRvIGxvb2sgbGlrZSBhIFVNTCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXAKLSAgICAgICAgLy8gYWRkaW5nIGEgbGFiZWwgdG8gdGhlIGNvbm5lY3Rpb24gd291bGQgaGVscCB0bwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKHJlZmVyZW5jZVR5cGVQYXJ0LmdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuQk9UVE9NLCAwLCAwKSk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0Q29ubmVjdGlvblJvdXRlcihuZXcgTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcigpKTsKLSAgICAgICAgKChDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IpY29ubmVjdGlvbkZpZ3VyZS5nZXRTb3VyY2VBbmNob3IoKSkuc2V0T3RoZXIoKENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciljb25uZWN0aW9uRmlndXJlLmdldFRhcmdldEFuY2hvcigpKTsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotCi0gICAgICB9Ci0gICAgfSAgICAKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KElUeXBlIHR5cGUpCi0gIHsKLSAgICBDb2x1bW5FZGl0UGFydCBjb2x1bW5FZGl0UGFydCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBlZGl0UGFydCA9IHRoaXM7IGVkaXRQYXJ0ICE9IG51bGw7IGVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCkpCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29sdW1uRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGNvbHVtbkVkaXRQYXJ0ID0gKENvbHVtbkVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICBicmVhazsKLSAgICAgIH0gIAotICAgIH0gICAgIAotICAgIGlmIChjb2x1bW5FZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbHVtbkVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChjaGlsZC5nZXRNb2RlbCgpID09IHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAgICAgIH0gICAgICAgICAKLSAgICAgIH0gIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgCi0gICAgaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotICAgICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KQotICAgICAgewotICAgICAgICBMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0ID0gKExvY2F0aW9uUmVxdWVzdClyZXF1ZXN0OwotICAgICAgICBQb2ludCBwID0gbG9jYXRpb25SZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAKLSAgICAgICAgaWYgKGdldFN0cnVjdHVyZUZpZ3VyZSgpLmhpdFRlc3RIZWFkZXIocCkpCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgLy8gVE9ETzogISEhIFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBhZHQteHNkIHBhY2thZ2UKLSAgICAgICAgICAvLyAKLSAgICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpICAgICAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpbW9kZWw7Ci0gICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilhZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIE9iamVjdCBzY2hlbWEgPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLSAgICAgICAgICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0RWRpdG9yQWN0aW9uUmVnaXN0cnkoZWRpdG9yUGFydCk7Ci0gICAgICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHNjaGVtYSA9PSBzdC5nZXRTY2hlbWEoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeShJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICByZXR1cm4gKEFjdGlvblJlZ2lzdHJ5KSBlZGl0b3IuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREcmF3Q29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIElUeXBlKQotICAgIHsKLSAgICAgIGlmICgoKElUeXBlKWdldE1vZGVsKCkpLmdldFN1cGVyVHlwZSgpICE9IG51bGwpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1NwYWNlRmlsbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1NwYWNlRmlsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlODQ3ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9TcGFjZUZpbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIER1bW15IGNsYXNzIHRvIGFkZCBzcGFjZSB0byBmaWVsZCBsaXN0Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU3BhY2VGaWxsZXIgaW1wbGVtZW50cyBJRmllbGQKLXsKLSAgU3RyaW5nIGtpbmQ7Ci0gIHB1YmxpYyBTcGFjZUZpbGxlcihTdHJpbmcga2luZCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBpZiAoa2luZC5lcXVhbHMoImF0dHJpYnV0ZSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQXR0cmlidXRlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgcmV0dXJuIGtpbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEtpbmQoU3RyaW5nIGtpbmQpCi0gIHsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBsZXhUeXBlIGdldENvbnRhaW5lclR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJVHlwZSBnZXRUeXBlKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXJzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXJzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoaW50IG1heE9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1RhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2VhZTVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyIGltcGxlbWVudHMgSUFEVE9iamVjdAotewotICBwcml2YXRlIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXI7Ci0gIAotICBwdWJsaWMgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKFhTREJhc2VBZGFwdGVyIGFkYXB0ZXIpCi0gIHsKLSAgICB0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIFhTREJhc2VBZGFwdGVyIGdldEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIGFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvRHJhZ0FuZERyb3BFZGl0UG9saWN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL0RyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDJlM2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvRHJhZ0FuZERyb3BFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZUNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBdHRyaWJ1dGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkJhc2VEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5YU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5YU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RCYXNlRmllbGRFZGl0UGFydDsKLQotCi1wdWJsaWMgY2xhc3MgRHJhZ0FuZERyb3BFZGl0UG9saWN5IGV4dGVuZHMgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxFZGl0UG9saWN5Ci17IAotICBwcm90ZWN0ZWQgRWRpdFBhcnRWaWV3ZXIgdmlld2VyOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotCi0gIHB1YmxpYyBEcmFnQW5kRHJvcEVkaXRQb2xpY3koRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpCi0gIHsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB0aGlzLnNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXEpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIAotICBwdWJsaWMgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgICAgICAgICAgICAgCi0gICAgQmFzZURyYWdBbmREcm9wQ29tbWFuZCBjb21tYW5kID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDaGFuZ2VCb3VuZHNSZXF1ZXN0KQotICAgIHsKLSAgICAgIENoYW5nZUJvdW5kc1JlcXVlc3QgY2hhbmdlQm91bmRzUmVxdWVzdCA9IChDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICBQb2ludCBsb2NhdGlvbiA9IGNoYW5nZUJvdW5kc1JlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgIAotICAgICAgR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KXZpZXdlci5maW5kT2JqZWN0QXQobG9jYXRpb24pOwotICAgICAgbG9jYXRpb24gPSBnZXRQb2ludGVyTG9jYXRpb24oY2hhbmdlQm91bmRzUmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLSAgICAgICgoR3JhcGhpY2FsRWRpdFBhcnQpdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGxvY2F0aW9uKTsKLQotICAgICAgTGlzdCBsaXN0ID0gY2hhbmdlQm91bmRzUmVxdWVzdC5nZXRFZGl0UGFydHMoKTsKLSAgICAgIC8vIGFsbG93IGRyYWcgYW5kIGRyb3Agb2Ygb25seSBvbmUgc2VsZWN0ZWQgb2JqZWN0Ci0gICAgICBpZiAobGlzdC5zaXplKCkgPT0gMSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGl0ZW1Ub0RyYWcgPSBsaXN0LmdldCgwKTsKLSAgICAgICAgaWYgKGl0ZW1Ub0RyYWcgaW5zdGFuY2VvZiBYU0RCYXNlRmllbGRFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIFhTREJhc2VGaWVsZEVkaXRQYXJ0IHNlbGVjdGVkID0gKFhTREJhc2VGaWVsZEVkaXRQYXJ0KSBpdGVtVG9EcmFnOwotICAgICAgICAgIGlmIChzZWxlY3RlZC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21tYW5kID0gbmV3IFhTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQodmlld2VyLCAoQ2hhbmdlQm91bmRzUmVxdWVzdClyZXF1ZXN0LCB0YXJnZXQsIHNlbGVjdGVkLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeS5zZXREcmFnQW5kRHJvcENvbW1hbmQoY29tbWFuZCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHNlbGVjdGVkLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RCYXNlQXR0cmlidXRlQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21tYW5kID0gbmV3IFhTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZCh2aWV3ZXIsIChDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3QsIHRhcmdldCwgc2VsZWN0ZWQsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5LnNldERyYWdBbmREcm9wQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IAotICAgIHJldHVybiBjb21tYW5kOyAgICAgICAgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIHByb3RlY3RlZCBQb2ludCBnZXRQb2ludGVyTG9jYXRpb24oUG9pbnQgb3JpZ1BvaW50ZXJMb2NhdGlvbikKLSAgewotICAgICBQb2ludCBjb21wZW5zYXRlZExvY2F0aW9uID0gb3JpZ1BvaW50ZXJMb2NhdGlvbjsKLSAgICAgRmlndXJlQ2FudmFzIGZpZ3VyZUNhbnZhcyA9IChGaWd1cmVDYW52YXMpIHZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgIGludCB5T2Zmc2V0ID0gZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0VmVydGljYWxSYW5nZU1vZGVsKCkuZ2V0VmFsdWUoKTsKLSAgICAgaW50IHhPZmZzZXQgPSBmaWd1cmVDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRIb3Jpem9udGFsUmFuZ2VNb2RlbCgpLmdldFZhbHVlKCk7Ci0gICAgIGNvbXBlbnNhdGVkTG9jYXRpb24ueSA9IGNvbXBlbnNhdGVkTG9jYXRpb24ueSArIHlPZmZzZXQ7Ci0gICAgIGNvbXBlbnNhdGVkTG9jYXRpb24ueCA9IGNvbXBlbnNhdGVkTG9jYXRpb24ueCArIHhPZmZzZXQ7Ci0gICAgIHJldHVybiBjb21wZW5zYXRlZExvY2F0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL0dyYXBoTm9kZURyYWdUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL0dyYXBoTm9kZURyYWdUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOGIzMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9HcmFwaE5vZGVEcmFnVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnRWRpdFBhcnRzVHJhY2tlcjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLXB1YmxpYyBjbGFzcyBHcmFwaE5vZGVEcmFnVHJhY2tlciBleHRlbmRzIERyYWdFZGl0UGFydHNUcmFja2VyIAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGVkaXRQYXJ0OyAKLSAgICAgICAgICAgCi0gIHB1YmxpYyBHcmFwaE5vZGVEcmFnVHJhY2tlcihFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHN1cGVyKGVkaXRQYXJ0KTsKLSAgICB0aGlzLmVkaXRQYXJ0ID0gZWRpdFBhcnQ7Ci0gIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDb21tYW5kIGdldENvbW1hbmQoKSAKLSAgeyAKLQlSZXF1ZXN0IHJlcXVlc3QgPSBnZXRUYXJnZXRSZXF1ZXN0KCk7Ci0gICAgcmV0dXJuIGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7IAotICB9Ci19IApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjBiMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5CYXNlRHJhZ0FuZERyb3BDb21tYW5kOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsCWV4dGVuZHMgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5Ci17Ci0gIHByb3RlY3RlZCBJRmlndXJlIGZlZWRiYWNrOwotICBwcm90ZWN0ZWQgUmVjdGFuZ2xlIG9yaWdpbmFsTG9jYXRpb247Ci0gIHByb3RlY3RlZCBCYXNlRHJhZ0FuZERyb3BDb21tYW5kIGRyYWdBbmREcm9wQ29tbWFuZDsKLSAgcHJvdGVjdGVkIFBvbHlsaW5lIHBvbHlMaW5lOwotICBwcm90ZWN0ZWQgUmVjdGFuZ2xlRmlndXJlIGdob3N0U2hhcGU7Ci0KLSAgcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgaWYgKFJFUV9NT1ZFLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpCi0gICAgeyAgCi0gICAgICByZXN1bHQgPSBmYWxzZTsgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci51bmRlcnN0YW5kc1JlcXVlc3QocmVxdWVzdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBudWxsOyAgCi0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBzZXREcmFnQW5kRHJvcENvbW1hbmQoQmFzZURyYWdBbmREcm9wQ29tbWFuZCBkcmFnQW5kRHJvcENvbW1hbmQpCi0gIHsKLSAgICB0aGlzLmRyYWdBbmREcm9wQ29tbWFuZCA9IGRyYWdBbmREcm9wQ29tbWFuZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgICAKLSAgICAgIGVyYXNlQ2hhbmdlQm91bmRzRmVlZGJhY2sobnVsbCk7Ci0gICAgICBpZiAoZHJhZ0FuZERyb3BDb21tYW5kICE9IG51bGwgJiYgZHJhZ0FuZERyb3BDb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotICAgICAgICBpZiAoUkVRX01PVkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSB8fCBSRVFfQURELmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpIHsKLSAgICAgICAgICBpZiAoZHJhZ0FuZERyb3BDb21tYW5kICE9IG51bGwgJiYgZHJhZ0FuZERyb3BDb21tYW5kLmdldEZlZWRiYWNrRmlndXJlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZmVlZGJhY2sgPSBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0RmVlZGJhY2tGaWd1cmUoKTsKLSAgICAgICAgICAgIGFkZEZlZWRiYWNrKGZlZWRiYWNrKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0JICBpZiAoZmVlZGJhY2sgIT0gbnVsbCkKLSAgICB7Ci0JCSAgcmVtb3ZlRmVlZGJhY2soZmVlZGJhY2spOwotCQkgIGZlZWRiYWNrID0gbnVsbDsKLQkgIH0KLQkgIGhpZGVGb2N1cygpOwotCSAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVyYXNlIGZlZWRiYWNrIGluZGljYXRpbmcgdGhhdCB0aGUgcmVjZWl2ZXIgb2JqZWN0IGlzIAotICAgKiBiZWluZyBkcmFnZ2VkLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBkcmFnIGlzCi0gICAqIGNvbXBsZXRlZCBvciBjYW5jZWxsZWQgb24gdGhlIHJlY2VpdmVyIG9iamVjdC4KLSAgICogQHBhcmFtIGRyYWdUcmFja2VyIG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnVHJhY2tlciBUaGUgZHJhZyB0cmFja2VyIG9mIHRoZSB0b29sIHBlcmZvcm1pbmcgdGhlIGRyYWcuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBlcmFzZUNoYW5nZUJvdW5kc0ZlZWRiYWNrKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgCi0gIHsKLQkgIGlmIChmZWVkYmFjayAhPSBudWxsKSAKLSAgICB7CQkgICAgICAKLQkJICByZW1vdmVGZWVkYmFjayhmZWVkYmFjayk7Ci0JICB9Ci0JICBmZWVkYmFjayA9IG51bGw7Ci0JICBvcmlnaW5hbExvY2F0aW9uID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBFcmFzZSBmZWVkYmFjayBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlY2VpdmVyIG9iamVjdCBpcyAKLSAgICogYmVpbmcgZHJhZ2dlZC4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgZHJhZyBpcwotICAgKiBjb21wbGV0ZWQgb3IgY2FuY2VsbGVkIG9uIHRoZSByZWNlaXZlciBvYmplY3QuCi0gICAqIEBwYXJhbSBkcmFnVHJhY2tlciBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRHJhZ1RyYWNrZXIgVGhlIGRyYWcgdHJhY2tlciBvZiB0aGUgdG9vbCBwZXJmb3JtaW5nIHRoZSBkcmFnLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXJhc2VTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIAotICB7Ci0gICAgaWYgKFJFUV9NT1ZFLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkgfHwgIFJFUV9BREQuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkKLSAgICB7Ci0JCSAgZXJhc2VDaGFuZ2VCb3VuZHNGZWVkYmFjaygoQ2hhbmdlQm91bmRzUmVxdWVzdClyZXF1ZXN0KTsKLSAgICB9Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1RvcExldmVsQ29tcG9uZW50TGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9Ub3BMZXZlbENvbXBvbmVudExhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5NGE1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1RvcExldmVsQ29tcG9uZW50TGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxDZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLklOYW1lZEVkaXRQYXJ0OwotCi1wdWJsaWMgY2xhc3MgVG9wTGV2ZWxDb21wb25lbnRMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGV4dGVuZHMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcgotewotICBwdWJsaWMgVG9wTGV2ZWxDb21wb25lbnRMYWJlbENlbGxFZGl0b3JMb2NhdG9yKElOYW1lZEVkaXRQYXJ0IG5hbWVkRWRpdFBhcnQsIFBvaW50IGN1cnNvckxvY2F0aW9uKQotICB7Ci0gICAgc3VwZXIobmFtZWRFZGl0UGFydCwgY3Vyc29yTG9jYXRpb24pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCi0gICAgTGFiZWwgbGFiZWwgPSBuYW1lZEVkaXRQYXJ0LmdldE5hbWVMYWJlbEZpZ3VyZSgpOwotICAgIAotICAgIGlmICh0ZXh0LmdldEJvdW5kcygpLnggPD0gMCkKLSAgICB7Ci0gICAgICBzdXBlci5yZWxvY2F0ZShjZWxsZWRpdG9yKTsgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50IHNlbCA9IHRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQgcHJlZiA9IHRleHQuY29tcHV0ZVNpemUoLTEsIC0xKTsKLSAgICAgIFJlY3RhbmdsZSByZWN0ID0gbGFiZWwuZ2V0VGV4dEJvdW5kcygpLmdldENvcHkoKTsKLSAgICAgIGxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0gICAgICB0ZXh0LnNldEJvdW5kcyhyZWN0LngsIHJlY3QueS0xLCByZWN0LndpZHRoLCBwcmVmLnkrMSk7Ci0gICAgICB0ZXh0LnNldFNlbGVjdGlvbigwKTsKLSAgICAgIHRleHQuc2V0U2VsZWN0aW9uKHNlbCk7IAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9Ub3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9Ub3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDkyNDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvVG9wTGV2ZWxOYW1lRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSU5hbWVkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgVG9wTGV2ZWxOYW1lRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlcgotewotICBwcm90ZWN0ZWQgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50OwotICBwcml2YXRlIElBY3Rpb25CYXJzIGFjdGlvbkJhcnM7Ci0gIHByaXZhdGUgQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIgYWN0aW9uSGFuZGxlcjsKLSAgcHJpdmF0ZSBJQWN0aW9uIGNvcHksIGN1dCwgcGFzdGUsIHVuZG8sIHJlZG8sIGZpbmQsIHNlbGVjdEFsbCwgZGVsZXRlOwotICBwcml2YXRlIEZvbnQgc2NhbGVkRm9udDsKLQotICBwdWJsaWMgVG9wTGV2ZWxOYW1lRGlyZWN0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBDZWxsRWRpdG9yTG9jYXRvciBsb2NhdG9yLCBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcihzb3VyY2UsIG51bGwsIGxvY2F0b3IpOwotICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oKQotICB7Ci0gICAgaWYgKGFjdGlvbkhhbmRsZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhY3Rpb25IYW5kbGVyLmRpc3Bvc2UoKTsKLSAgICAgIGFjdGlvbkhhbmRsZXIgPSBudWxsOwotICAgIH0KLSAgICBpZiAoYWN0aW9uQmFycyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3RvcmVTYXZlZEFjdGlvbnMoYWN0aW9uQmFycyk7Ci0gICAgICBhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICAgIGFjdGlvbkJhcnMgPSBudWxsOwotICAgIH0KLQotICAgIEZvbnQgZGlzcG9zZUZvbnQgPSBzY2FsZWRGb250OwotICAgIHNjYWxlZEZvbnQgPSBudWxsOwotICAgIHN1cGVyLmJyaW5nRG93bigpOwotICAgIGlmIChkaXNwb3NlRm9udCAhPSBudWxsKQotICAgICAgZGlzcG9zZUZvbnQuZGlzcG9zZSgpOwotCi0gICAgaWYgKGdldEVkaXRQYXJ0KCkgaW5zdGFuY2VvZiBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgIE9iamVjdCBhZGFwdGVyID0gZWRpdG9yLmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElTZWxlY3Rpb25Qcm92aWRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsID0gKElTZWxlY3Rpb25Qcm92aWRlcikgYWRhcHRlcjsKLSAgICAgICAgICAgIHNlbC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzaG93RmVlZGJhY2soKQotICB7Ci0gICAgc3VwZXIuc2hvd0ZlZWRiYWNrKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICAgIHJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULldSQVApOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0gICAgTGFiZWwgbGFiZWwgPSAoKElOYW1lZEVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXROYW1lTGFiZWxGaWd1cmUoKTsKLQotICAgIGlmIChsYWJlbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHNjYWxlZEZvbnQgPSBsYWJlbC5nZXRGb250KCk7Ci0KLSAgICAgIENvbG9yIGNvbG9yID0gbGFiZWwuZ2V0QmFja2dyb3VuZENvbG9yKCk7Ci0gICAgICB0ZXh0LnNldEJhY2tncm91bmQoY29sb3IpOwotCi0gICAgICBTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICBnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzY2FsZWRGb250ID0gbGFiZWwuZ2V0UGFyZW50KCkuZ2V0Rm9udCgpOwotICAgICAgdGV4dC5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldFBhcmVudCgpLmdldEJhY2tncm91bmRDb2xvcigpKTsKLSAgICB9Ci0KLSAgICBGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotICAgIERpbWVuc2lvbiBmb250U2l6ZSA9IG5ldyBEaW1lbnNpb24oMCwgZGF0YS5nZXRIZWlnaHQoKSk7Ci0gICAgbGFiZWwuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0gICAgZGF0YS5zZXRIZWlnaHQoZm9udFNpemUuaGVpZ2h0KTsKLSAgICBzY2FsZWRGb250ID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0KLSAgICB0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0gICAgLy8gdGV4dC5zZWxlY3RBbGwoKTsKLQotICAgIC8vIEhvb2sgdGhlIGNlbGwgZWRpdG9yJ3MgY29weS9wYXN0ZSBhY3Rpb25zIHRvIHRoZSBhY3Rpb25CYXJzIHNvIHRoYXQgdGhleQotICAgIC8vIGNhbgotICAgIC8vIGJlIGludm9rZWQgdmlhIGtleWJvYXJkIHNob3J0Y3V0cy4KLSAgICBhY3Rpb25CYXJzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLSAgICBzYXZlQ3VycmVudEFjdGlvbnMoYWN0aW9uQmFycyk7Ci0gICAgYWN0aW9uSGFuZGxlciA9IG5ldyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcihhY3Rpb25CYXJzKTsKLSAgICBhY3Rpb25IYW5kbGVyLmFkZENlbGxFZGl0b3IoZ2V0Q2VsbEVkaXRvcigpKTsKLSAgICBhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZXN0b3JlU2F2ZWRBY3Rpb25zKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpCi0gIHsKLSAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGNvcHkpOwotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksIHBhc3RlKTsKLSAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyNTA5Ci0gICAgLy8gRGVsZXRlIGFjdGlvbiAoa2V5KSBkb2Vzbid0IGFsd2F5cyB3b3JrLiAgVGhlIHNhdmVkIGFjdGlvbiBjb3VsZCBiZSB0aGUgCi0gICAgLy8gQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIncyBEZWxldGVBY3Rpb25IYW5kbGVyLi4uZHVlIHRvIHRpbWluZyBpc3N1ZXMuCi0gICAgLy8gV2UnbGwgb25seSByZXN0b3JlIHRoZSBkZWxldGUgYWN0aW9uIGlmIGl0IGlzIGluZGVlZCB0aGUgb25lIGZvciB0aGUgRGVzaWduIHZpZXcuCi0gICAgLy8gV2Ugc2hvdWxkIHVwZGF0ZSB0aGUgb3RoZXIgYWN0aW9ucyB0b28sIGJ1dCBjdXJyZW50bHksIG5vbmUgYXJlIGFwcGxpY2FibGUuCi0gICAgaWYgKGRlbGV0ZSBpbnN0YW5jZW9mIEJhc2VTZWxlY3Rpb25BY3Rpb24pCi0gICAgewotICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIGRlbGV0ZSk7Ci0gICAgfQotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSwgc2VsZWN0QWxsKTsKLSAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgY3V0KTsKLSAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5GSU5ELmdldElkKCksIGZpbmQpOwotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSwgdW5kbyk7Ci0gICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLCByZWRvKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzYXZlQ3VycmVudEFjdGlvbnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykKLSAgewotICAgIGNvcHkgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOwotICAgIHBhc3RlID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSk7Ci0gICAgSUFjdGlvbiBjdXJyZW50RGVsZXRlQWN0aW9uID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTI1MDkKLSAgICAvLyBEZWxldGUgYWN0aW9uIChrZXkpIGRvZXNuJ3QgYWx3YXlzIHdvcmsuICBUaGUgc2F2ZWQgYWN0aW9uIGNvdWxkIGJlIHRoZSAKLSAgICAvLyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcidzIERlbGV0ZUFjdGlvbkhhbmRsZXIuLi5kdWUgdG8gdGltaW5nIGlzc3Vlcy4KLSAgICAvLyBXZSdsbCBvbmx5IHJlc3RvcmUgdGhlIGRlbGV0ZSBhY3Rpb24gaWYgaXQgaXMgaW5kZWVkIHRoZSBvbmUgZm9yIHRoZSBEZXNpZ24gdmlldy4KLSAgICAvLyBXZSBzaG91bGQgdXBkYXRlIHRoZSBvdGhlciBhY3Rpb25zIHRvbywgYnV0IGN1cnJlbnRseSwgbm9uZSBhcmUgYXBwbGljYWJsZS4KLSAgICBpZiAoY3VycmVudERlbGV0ZUFjdGlvbiBpbnN0YW5jZW9mIEJhc2VTZWxlY3Rpb25BY3Rpb24pCi0gICAgewotICAgICAgZGVsZXRlID0gY3VycmVudERlbGV0ZUFjdGlvbjsKLSAgICB9Ci0gICAgc2VsZWN0QWxsID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpKTsKLSAgICBjdXQgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSk7Ci0gICAgZmluZCA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSk7Ci0gICAgdW5kbyA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSk7Ci0gICAgcmVkbyA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0NhdGVnb3J5RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9DYXRlZ29yeUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDEyNTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0NhdGVnb3J5RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNjcm9sbFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlZpZXdwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5WaWV3cG9ydExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkhlYWRpbmdGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5Sb3VuZGVkTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLkZpbGxMYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUZpZ3VyZSBleHRlbmRzIEZpZ3VyZQotewotICBwcm90ZWN0ZWQgU2Nyb2xsUGFuZSBzY3JvbGxwYW5lOwotICBwcm90ZWN0ZWQgRmlndXJlIG91dGVyUGFuZTsKLSAgcHVibGljIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZTsKLSAgRmlndXJlIGNvbnRlbnRQYW5lOwotCi0gIHB1YmxpYyBDYXRlZ29yeUZpZ3VyZShpbnQgdHlwZSkKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICBvdXRlclBhbmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgb3V0ZXJQYW5lLnNldEJvcmRlcihuZXcgUm91bmRlZExpbmVCb3JkZXIoMSwgNikpOwotCi0gICAgVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgbGF5b3V0LnNldFZlcnRpY2FsKHRydWUpOwotICAgIGxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDMpOwotICAgIGZpbGxMYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0KLSAgICBGaWxsTGF5b3V0IG91dGVyTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKLSAgICBvdXRlclBhbmUuc2V0TGF5b3V0TWFuYWdlcihvdXRlckxheW91dCk7Ci0KLSAgICBhZGQob3V0ZXJQYW5lKTsKLQotICAgIGhlYWRpbmdGaWd1cmUgPSBuZXcgSGVhZGluZ0ZpZ3VyZSgpOwotICAgIG91dGVyUGFuZS5hZGQoaGVhZGluZ0ZpZ3VyZSk7Ci0KLSAgICBGaWd1cmUgbGluZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBsaW5lLnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigxKSk7Ci0gICAgVG9vbGJhckxheW91dCBsaW5lTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIGxpbmVMYXlvdXQuc2V0VmVydGljYWwodHJ1ZSk7Ci0gICAgbGluZUxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGxpbmUuc2V0TGF5b3V0TWFuYWdlcihsaW5lTGF5b3V0KTsKLSAgICBvdXRlclBhbmUuYWRkKGxpbmUpOwotCi0gICAgc2Nyb2xscGFuZSA9IG5ldyBTY3JvbGxQYW5lKCk7Ci0gICAgc2Nyb2xscGFuZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIHNjcm9sbHBhbmUuc2V0VmVydGljYWxTY3JvbGxCYXJWaXNpYmlsaXR5KFNjcm9sbFBhbmUuQVVUT01BVElDKTsKLSAgICBvdXRlclBhbmUuYWRkKHNjcm9sbHBhbmUpOwotCi0gICAgRmlndXJlIHBhbmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgcGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig1LCA4LCA1LCA4KSk7Ci0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIHRvb2xiYXJMYXlvdXQuc2V0U3BhY2luZygzKTsKLSAgICBwYW5lLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7IC8vIGdvb2QKLQotICAgIFZpZXdwb3J0IHZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KCk7Ci0gICAgdmlld3BvcnQuc2V0Q29udGVudHNUcmFja3NIZWlnaHQodHJ1ZSk7Ci0gICAgVmlld3BvcnRMYXlvdXQgdmlld3BvcnRMYXlvdXQgPSBuZXcgVmlld3BvcnRMYXlvdXQoKTsKLSAgICB2aWV3cG9ydC5zZXRMYXlvdXRNYW5hZ2VyKHZpZXdwb3J0TGF5b3V0KTsKLQotICAgIHNjcm9sbHBhbmUuc2V0Vmlld3BvcnQodmlld3BvcnQpOwotICAgIHNjcm9sbHBhbmUuc2V0Q29udGVudHMocGFuZSk7Ci0gIH0KLQotICBwdWJsaWMgSGVhZGluZ0ZpZ3VyZSBnZXRIZWFkaW5nRmlndXJlKCkKLSAgewotICAgIHJldHVybiBoZWFkaW5nRmlndXJlOwotICB9Ci0KLSAgcHVibGljIFNjcm9sbFBhbmUgZ2V0U2Nyb2xsUGFuZSgpCi0gIHsKLSAgICByZXR1cm4gc2Nyb2xscGFuZTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBzY3JvbGxwYW5lLmdldENvbnRlbnRzKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvQ2VudGVyZWRJY29uRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9DZW50ZXJlZEljb25GaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3NzI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9DZW50ZXJlZEljb25GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLSAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5SZWZlcmVuY2VDb25uZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ2VudGVyZWRJY29uRmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZQoteyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNURUQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT1ZFUiA9IDI7Ci0gIHB1YmxpYyBJbWFnZSBpbWFnZTsKLSAgcHJvdGVjdGVkIExhYmVsIHRvb2xUaXBMYWJlbDsKLSAgcHJvdGVjdGVkIGludCBtb2RlID0gMDsKLSAgCi0gIHB1YmxpYyBDZW50ZXJlZEljb25GaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRGaWxsKHRydWUpOyAgIAotICAgIHRvb2xUaXBMYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIHNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbig1LDUpKTsKLSAgfQotICAKLSAgcHVibGljIENlbnRlcmVkSWNvbkZpZ3VyZShJbWFnZSBpbWcpCi0gIHsKLSAgICB0aGlzKCk7Ci0gICAgdGhpcy5pbWFnZSA9IGltZzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICByZXBhaW50KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIG91dGxpbmVTaGFwZShHcmFwaGljcyBncmFwaGljcykKLSAgewotICAgIGdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChtb2RlID09IE5PUk1BTCkKLSAgICAgIHsgLy8gVE9ETzogY29tbW9uIHVwIGFuZCBvcmdhbml6ZSBjb2xvcnMuLi4uCi0gICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihSZWZlcmVuY2VDb25uZWN0aW9uLmluYWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChtb2RlID09IFNFTEVDVEVEKQotICAgICAgewotICAgICAgICBib29sZWFuIGhpZ2hDb250cmFzdCA9IGZhbHNlOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGhpZ2hDb250cmFzdCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGlmIChoaWdoQ29udHJhc3QpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc3VwZXIub3V0bGluZVNoYXBlKGdyYXBoaWNzKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGcpCi0gIHsgICAgCi0gICAgc3VwZXIuZmlsbFNoYXBlKGcpOwotICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpOwotICAgICAgRGltZW5zaW9uIGltYWdlU2l6ZSA9IG5ldyBEaW1lbnNpb24oMTUsIDE1KTsKLSAgICAgIGcuZHJhd0ltYWdlKGltYWdlLCByLnggKyAoci53aWR0aCAtIGltYWdlU2l6ZS53aWR0aCkvMiwgci55ICsgKHIuaGVpZ2h0IC0gaW1hZ2VTaXplLmhlaWdodCkvMiAtIDEpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXRUb29sVGlwTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xUaXBMYWJlbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSkKLSAgewotICAgIHRoaXMubW9kZSA9IG1vZGU7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRleHQpCi0gIHsKLSAgICBpZiAodGV4dC5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgc2V0VG9vbFRpcCh0b29sVGlwTGFiZWwpOwotICAgICAgdG9vbFRpcExhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRUb29sVGlwKG51bGwpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvR2VuZXJpY0dyb3VwRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9HZW5lcmljR3JvdXBGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxMTdjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9HZW5lcmljR3JvdXBGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24ubGF5b3V0cy5Nb2RlbEdyb3VwTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0dyb3VwRmlndXJlIGV4dGVuZHMgRmlndXJlCi17Ci0gIHByb3RlY3RlZCBDZW50ZXJlZEljb25GaWd1cmUgY2VudGVyZWRJY29uRmlndXJlOwotICBwcm90ZWN0ZWQgRmlndXJlIGNvbnRlbnRGaWd1cmU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGV4dCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgTGFiZWwgdGV4dEZpZ3VyZTsKLSAgCi0gIHB1YmxpYyBHZW5lcmljR3JvdXBGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRMYXlvdXRNYW5hZ2VyKG5ldyBNb2RlbEdyb3VwTGF5b3V0KHRydWUpKTsKLSAgIAotICAgIGNlbnRlcmVkSWNvbkZpZ3VyZSA9IG5ldyBDZW50ZXJlZEljb25GaWd1cmUoKTsKLSAgICBjZW50ZXJlZEljb25GaWd1cmUuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDE1LCAxNSkpOwotCi0gICAgYWRkKGNlbnRlcmVkSWNvbkZpZ3VyZSk7Ci0gICAgY29udGVudEZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBjb250ZW50RmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IE1vZGVsR3JvdXBMYXlvdXQoZmFsc2UsIDApKTsKLSAgICBhZGQoY29udGVudEZpZ3VyZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpCi0gIHsKLSAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgIGhhc1RleHQgPSBmYWxzZTsKLSAgICBpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGhhc1RleHQgPSB0cnVlOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gaGFzVGV4dDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiB0ZXh0OwotICB9Ci0gIAotICBwdWJsaWMgUG9pbnQgZ2V0VGV4dENvb3JkaW5hdGVzKCkKLSAgewotICAgIFJlY3RhbmdsZSByZWN0ID0gY2VudGVyZWRJY29uRmlndXJlLmdldEJvdW5kcygpOwotICAgIHJldHVybiBuZXcgUG9pbnQocmVjdC54LCByZWN0LnkgKyAxNCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEljb25GaWd1cmUoSW1hZ2UgaW1hZ2UpCi0gIHsKLSAgICBjZW50ZXJlZEljb25GaWd1cmUuaW1hZ2UgPSBpbWFnZTsKLSAgfQotCi0gIHB1YmxpYyBDZW50ZXJlZEljb25GaWd1cmUgZ2V0VGFyZ2V0RmlndXJlKCkKLSAgewotICAgIHJldHVybiBjZW50ZXJlZEljb25GaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDZW50ZXJlZEljb25GaWd1cmUgZ2V0SWNvbkZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gY2VudGVyZWRJY29uRmlndXJlOwotICB9Ci0gIAotICBwdWJsaWMgRmlndXJlIGdldENvbnRlbnRGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRGaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0ZXh0KQotICB7Ci0gICAgY2VudGVyZWRJY29uRmlndXJlLnNldFRvb2xUaXBUZXh0KHRleHQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9IeXBlckxpbmtMYWJlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvSHlwZXJMaW5rTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlZjI5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9IeXBlckxpbmtMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLXB1YmxpYyBjbGFzcyBIeXBlckxpbmtMYWJlbCBleHRlbmRzIExhYmVsCi17Ci0gIHByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKQotICB7Ci0gICAgc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOyAgIAotICAgIGdyYXBoaWNzLnNldEZvbnQoZ2V0Rm9udCgpKTsKLSAgICAgICAgCi0gICAgLy8gVE9ETyAoY3MpIHRoaXMgbG9va3VwIHRvIGZpbmQgIiA6IiBpcyBhIGhhY2sKLSAgICAvLyB0aGF0J3Mgc3BlY2lhbGl6ZWQgZm9yIGVsZW1lbnQgYW5kIHR5cGUgbGFiZWwgdGV4dAotICAgIC8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgVG9wTGV2ZWxDb21wb25lbnQgdXNlIHR3byBsYWJlbHMgaW4gdGhpcyBjYXNlCi0gICAgLy8gICAgCi0gICAgU3RyaW5nIHN0cmluZyA9IGdldFRleHQoKTsKLSAgICBpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZigiIDoiKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgfQotICAgIC8vIGVuZCBoYWNrCi0gICAgCi0gICAgUG9pbnQgcCA9IGdldFRleHRMb2NhdGlvbigpOyAgICAgIAotICAgIERpbWVuc2lvbiB0ZXh0U2l6ZSA9ICBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoc3RyaW5nLCBnZXRGb250KCkpOwotICAgIGludCB0ZXh0V2lkdGggPSB0ZXh0U2l6ZS53aWR0aDsKLSAgICBpbnQgdGV4dEhlaWdodCA9IHRleHRTaXplLmhlaWdodDsKLSAgICBpbnQgZGVzY2VudCA9IGdyYXBoaWNzLmdldEZvbnRNZXRyaWNzKCkuZ2V0RGVzY2VudCgpOwotICAgIGludCBsaW5lWSA9IGJvdW5kcy55ICsgcC55ICsgdGV4dEhlaWdodCAtIGRlc2NlbnQgKyAxOyAgICAgIAotICAgIGludCBsaW5lWCA9IGJvdW5kcy54ICsgcC54OwotICAgIGdyYXBoaWNzLmRyYXdMaW5lKGxpbmVYLCBsaW5lWSwgbGluZVggKyB0ZXh0V2lkdGgsIGxpbmVZKTsgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0lFeHRlbmRlZEZpZ3VyZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0lFeHRlbmRlZEZpZ3VyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwN2I1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklGaWd1cmVGYWN0b3J5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZXh0ZW5kcyBJRmlndXJlRmFjdG9yeQotewotICBJTW9kZWxHcm91cEZpZ3VyZSBjcmVhdGVNb2RlbEdyb3VwRmlndXJlKE9iamVjdCBtb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9JTW9kZWxHcm91cEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvSU1vZGVsR3JvdXBGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmZjQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9JTW9kZWxHcm91cEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JQURURmlndXJlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEdyb3VwRmlndXJlIGV4dGVuZHMgSUFEVEZpZ3VyZQotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvTW9kZWxHcm91cEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvTW9kZWxHcm91cEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDA5OTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL01vZGVsR3JvdXBGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEdyb3VwRmlndXJlIGV4dGVuZHMgR2VuZXJpY0dyb3VwRmlndXJlIGltcGxlbWVudHMgSU1vZGVsR3JvdXBGaWd1cmUKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBTRVFVRU5DRV9JQ09OX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L3NlcXVlbmNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFNFUVVFTkNFX0lDT05fRElTQUJMRURfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvc2VxdWVuY2VkaXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQ0hPSUNFX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvY2hvaWNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIENIT0lDRV9JQ09OX0RJU0FCTEVEX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L2Nob2ljZWRpc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBTExfSUNPTl9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9hbGxfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQUxMX0lDT05fRElTQUJMRURfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvYWxsZGlzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIE1vZGVsR3JvdXBGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEljb25GaWd1cmUoSW1hZ2UgaW1hZ2UpCi0gIHsKLSAgICBjZW50ZXJlZEljb25GaWd1cmUuaW1hZ2UgPSBpbWFnZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVkaXRQYXJ0QXR0YWNoZWQoRWRpdFBhcnQgb3duZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscyhPYmplY3QgbW9kZWwpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9TcGFjaW5nRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9TcGFjaW5nRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNmE1NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvU3BhY2luZ0ZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTcGFjaW5nRmlndXJlIGV4dGVuZHMgTGFiZWwKLXsKLSAgcHVibGljIFNwYWNpbmdGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0SWNvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL0RvdC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzLCAwLCAzLCAwKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9sYXlvdXRzL0NvbnRhaW5lckxheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvQ29udGFpbmVyTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDk4MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvQ29udGFpbmVyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHM7Ci0gICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuU3BhY2luZ0ZpZ3VyZTsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBDb250YWluZXJMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdExheW91dAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbDsKLSAgcHJvdGVjdGVkIGludCBzcGFjaW5nID0gMDsKLSAgcHJvdGVjdGVkIGludCBib3JkZXIgPSAwOyAKLQotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0KCkKLSAgeyAKLSAgICB0aGlzKHRydWUsIDApOyAKLSAgfSAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0KGJvb2xlYW4gaXNIb3Jpem9udGFsLCBpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsOyAgIAotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWwoYm9vbGVhbiBpc0hvcml6b250YWwpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgc2V0U3BhY2luZyhpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEJvcmRlcihpbnQgYm9yZGVyKQotICB7Ci0gICAgdGhpcy5ib3JkZXIgPSBib3JkZXI7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBpbnQgYWxpZ25GaWd1cmUoSUZpZ3VyZSBwYXJlbnQsIElGaWd1cmUgY2hpbGQpCi0gIHsgCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBjb250YWluZXIgCi0gICAqIGdpdmVuIGFzIGlucHV0LgotICAgKiAKLSAgICogQHBhcmFtIGZpZ3VyZSAgRmlndXJlIHdob3NlIHByZWZlcnJlZCBzaXplIGlzIHJlcXVpcmVkLgotICAgKiBAcmV0dXJuICBUaGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIHBhc3NlZCBGaWd1cmUuCi0gICAqIEBzaW5jZSAyLjAKLSAgICovCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZUhlbHBlcihJRmlndXJlIHBhcmVudCkKLSAgeyAKLSAgICBEaW1lbnNpb24JcHJlZmVycmVkID0gbmV3IERpbWVuc2lvbigpOwotICAJTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0JCSAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWNoaWxkcmVuLmdldChpKTsgICAgICAKLSAgICAKLSAgICAgIERpbWVuc2lvbgljaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JICAKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7Ci0JCSAgICBwcmVmZXJyZWQud2lkdGggKz0gY2hpbGRTaXplLndpZHRoOwotCQkgICAgcHJlZmVycmVkLmhlaWdodCA9IE1hdGgubWF4KHByZWZlcnJlZC5oZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoID0gTWF0aC5tYXgocHJlZmVycmVkLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotCSAgfSAgIAotCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICBpZiAoY2hpbGRyZW5TaXplID4gMSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkgICAgCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC53aWR0aCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCQkgICAgcHJlZmVycmVkLmhlaWdodCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfSAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByZWZlcnJlZC53aWR0aCArPSBib3JkZXIgKiAyOwotICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gYm9yZGVyICogMjsKLQkgIHByZWZlcnJlZC53aWR0aCArPSBwYXJlbnQuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKTsKLQkgIHByZWZlcnJlZC5oZWlnaHQgKz0gcGFyZW50LmdldEluc2V0cygpLmdldEhlaWdodCgpOyAgICAgICAKLSAgCi0gIAlyZXR1cm4gcHJlZmVycmVkOwotICB9Ci0KLSAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsgICAgCi0gICAgRGltZW5zaW9uCXByZWZlcnJlZCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vIEhlcmUgd2UgZW5zdXJlIHRoYXQgYW4gdW5leHBhbmRlZCBjb250YWluZXIgaXMgZ2l2ZW4gYSBzaXplIG9mICgwLDApCi0gICAgLy8KLS8vICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRXhwYW5kYWJsZSkKLS8vICAgIHsKLS8vICAgICAgSUV4cGFuZGFibGUgZXhwYW5kYWJsZUZpZ3VyZSA9IChJRXhwYW5kYWJsZSlwYXJlbnQ7Ci0vLyAgICAgIGlmICghZXhwYW5kYWJsZUZpZ3VyZS5pc0V4cGFuZGVkKCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBwcmVmZXJyZWQgPSBuZXcgRGltZW5zaW9uKCk7IAotLy8gICAgICB9Ci0vLyAgICB9ICAgCi0gICAgCi0gICAgaWYgKHByZWZlcnJlZCA9PSBudWxsKQotICAgIHsKLQkgICAgcHJlZmVycmVkID0gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZUhlbHBlcihwYXJlbnQpOyAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHByZWZlcnJlZDsKLSAgfQotICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBhZGp1c3RMYXlvdXRMb2NhdGlvbihJRmlndXJlIHBhcmVudCwgRGltZW5zaW9uIGRpbWVuc2lvbikKLSAgeyAgICAgCi0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBwYXJlbnQpCi0gIHsgICAgICAgCi0gIAlMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gCi0gICAgaW50IHJ4ID0gMDsKLSAgICBEaW1lbnNpb24JZGltZW5zaW9uID0gbmV3IERpbWVuc2lvbigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQkgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLQkJICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotCQkgIERpbWVuc2lvbgljaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgeyAgIAotICAgICAgICBkaW1lbnNpb24uaGVpZ2h0ID0gTWF0aC5tYXgoZGltZW5zaW9uLmhlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICAgIHJ4ICs9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGltZW5zaW9uLndpZHRoID0gTWF0aC5tYXgoZGltZW5zaW9uLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotCSAgLy9kaW1lbnNpb24ud2lkdGggKz0gcGFyZW50LmdldEluc2V0cygpLmxlZnQ7Ci0gICAgLy9kaW1lbnNpb24uaGVpZ2h0ICs9IHBhcmVudC5nZXRJbnNldHMoKS50b3A7Ci0KLSAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgIHsKLSAgICAgIGRpbWVuc2lvbi5oZWlnaHQgKz0gYm9yZGVyKjI7Ci0gICAgCWRpbWVuc2lvbi53aWR0aCArPSBib3JkZXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkaW1lbnNpb24ud2lkdGggKz0gYm9yZGVyKjI7Ci0gICAgCWRpbWVuc2lvbi5oZWlnaHQgKz0gYm9yZGVyOwotICAgIH0KLSAgICBhZGp1c3RMYXlvdXRMb2NhdGlvbihwYXJlbnQsIGRpbWVuc2lvbik7ICAgIAotCi0gICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWNoaWxkcmVuLmdldChpKTsKLQkgICAgRGltZW5zaW9uCWNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgICAgICAgCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgeyAgIAotICAgICAgICBpbnQgeSA9IC0xOyAKLSAgICAKLSAgICAgICAgeSA9IGFsaWduRmlndXJlKHBhcmVudCwgY2hpbGQpOwotICAgIAotICAgICAgICBpZiAoeSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICB5ID0gKGRpbWVuc2lvbi5oZWlnaHQgLSBjaGlsZFNpemUuaGVpZ2h0KSAvIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZShkaW1lbnNpb24ud2lkdGgsIHksIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICAgIHJlY3RhbmdsZS50cmFuc2xhdGUocGFyZW50LmdldENsaWVudEFyZWEoKS5nZXRMb2NhdGlvbigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhyZWN0YW5nbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBjaGlsZFNpemUud2lkdGg7IAotICAgICAgICBkaW1lbnNpb24ud2lkdGggKz0gc3BhY2luZzsgICAgICAgCi0KLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgU3BhY2luZ0ZpZ3VyZSkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBpbnQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlID0gcGFyZW50LmdldENsaWVudEFyZWEoKS53aWR0aCAtIHJ4OwotICAgICAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2U7Ci0gICAgICAgIH0gICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgwLCBkaW1lbnNpb24uaGVpZ2h0LCBjaGlsZFNpemUud2lkdGgsIGNoaWxkU2l6ZS5oZWlnaHQpOwotCSAgICAgIHJlY3RhbmdsZS50cmFuc2xhdGUocGFyZW50LmdldENsaWVudEFyZWEoKS5nZXRMb2NhdGlvbigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhyZWN0YW5nbGUpOyAgCi0gICAgICAgIGRpbWVuc2lvbi5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBzcGFjaW5nOwotICAgICAgfQotCSAgfQkgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9GaWxsTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9GaWxsTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmU4ZTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9sYXlvdXRzL0ZpbGxMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1wdWJsaWMgY2xhc3MgRmlsbExheW91dCBleHRlbmRzIEFic3RyYWN0TGF5b3V0Ci17Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgaW50IHNwYWNpbmcgPSAwOwotICBwdWJsaWMgRGltZW5zaW9uIG1pbjsKLQotICBwdWJsaWMgRmlsbExheW91dCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBGaWxsTGF5b3V0KGludCBzcGFjaW5nKQotICB7Ci0gICAgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWwoYm9vbGVhbiBpc0hvcml6b250YWwpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgaW5wdXQgY29udGFpbmVyLiBUaGlzIGlzCi0gICAqIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbCBvdGhlciBjaGlsZHJlbiBmaXQKLSAgICogaW50byB0aGlzIHNpemUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlndXJlCi0gICAqICAgICAgICAgIENvbnRhaW5lciBmaWd1cmUgZm9yIHdoaWNoIHByZWZlcnJlZCBzaXplIGlzIHJlcXVpcmVkLgotICAgKiBAcmV0dXJuIFRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgaW5wdXQgZmlndXJlLgotICAgKi8KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAgIERpbWVuc2lvbiBkID0gY2FsY3VsYXRlUHJlZmVycmVkQ2xpZW50QXJlYVNpemUoZmlndXJlKTsKLSAgICBkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwgZmlndXJlLmdldEluc2V0cygpLmdldEhlaWdodCgpKTsKLSAgICBkLnVuaW9uKGdldEJvcmRlclByZWZlcnJlZFNpemUoZmlndXJlKSk7Ci0gICAgcmV0dXJuIGQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKElGaWd1cmUgZmlndXJlKQotICB7Ci0gICAgRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKCk7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBkLndpZHRoICs9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgICAgZC5oZWlnaHQgPSBNYXRoLm1heChjaGlsZFNpemUuaGVpZ2h0LCBkLmhlaWdodCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGQuaGVpZ2h0ICs9IGNoaWxkU2l6ZS5oZWlnaHQ7Ci0gICAgICAgIGQud2lkdGggPSBNYXRoLm1heChjaGlsZFNpemUud2lkdGgsIGQud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotICAgIGludCBjaGlsZHJlblNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIHsKLSAgICAgICAgZC53aWR0aCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkLmhlaWdodCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChtaW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkLndpZHRoID0gTWF0aC5tYXgoZC53aWR0aCwgbWluLndpZHRoKTsKLSAgICAgIGQuaGVpZ2h0ID0gTWF0aC5tYXgoZC5oZWlnaHQsIG1pbi5oZWlnaHQpOwotICAgIH0KLSAgICByZXR1cm4gZDsKLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZCBieSB0aGUgaW5wdXQgY29udGFpbmVyLiBUaGlzIGlzIHRoZSBzaXplCi0gICAqIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbCBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzCi0gICAqIHNpemUuCi0gICAqLwotICBwdWJsaWMgRGltZW5zaW9uIGdldE1pbmltdW1TaXplKElGaWd1cmUgZmlndXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsKLSAgICBEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gICAgSUZpZ3VyZSBjaGlsZDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgZC51bmlvbihjaGlsZC5nZXRNaW5pbXVtU2l6ZSgpKTsKLSAgICB9Ci0gICAgZC5leHBhbmQoZmlndXJlLmdldEluc2V0cygpLmdldFdpZHRoKCksIGZpZ3VyZS5nZXRJbnNldHMoKS5nZXRIZWlnaHQoKSk7Ci0gICAgcmV0dXJuIGQ7Ci0gIH0KLQotICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAgIHJldHVybiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKGZpZ3VyZSwgd2lkdGgsIGhlaWdodCk7Ci0gIH0KLQotICAvKgotICAgKiBMYXlzIG91dCB0aGUgY2hpbGRyZW4gb24gdG9wIG9mIGVhY2ggb3RoZXIgd2l0aCB0aGVpciBzaXplcyBlcXVhbCB0byB0aGF0Ci0gICAqIG9mIHRoZSBhdmFpbGFibGUgcGFpbnRhYmxlIGFyZWEgb2YgdGhlIGlucHV0IGNvbnRhaW5lciBmaWd1cmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBmaWd1cmUpCi0gIHsKLSAgICBEaW1lbnNpb24gcHJlZmVycmVkU2l6ZSA9IGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKGZpZ3VyZSk7Ci0gICAgUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Q2xpZW50QXJlYSgpLmdldENvcHkoKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0KLSAgICBpbnQgbkNoaWxkcmVuID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgIGludCBleHRyYUhvcml6b250YWxTcGFjZSA9IHIud2lkdGggLSBwcmVmZXJyZWRTaXplLndpZHRoOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICBEaW1lbnNpb24gcHJlZmVycmVkQ2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBpbnQgdyA9IHByZWZlcnJlZENoaWxkU2l6ZS53aWR0aCArIChleHRyYUhvcml6b250YWxTcGFjZSAvIG5DaGlsZHJlbik7Ci0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKHIueCwgci55LCB3LCBNYXRoLm1heChwcmVmZXJyZWRTaXplLmhlaWdodCwgci5oZWlnaHQpKSk7Ci0gICAgICAgIHIueCArPSB3ICsgc3BhY2luZzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoci54LCByLnksIE1hdGgubWF4KHByZWZlcnJlZFNpemUud2lkdGgsIHIud2lkdGgpLCBwcmVmZXJyZWRDaGlsZFNpemUuaGVpZ2h0KSk7Ci0gICAgICAgIHIueSArPSBwcmVmZXJyZWRDaGlsZFNpemUuaGVpZ2h0ICsgc3BhY2luZzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9Nb2RlbEdyb3VwTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9Nb2RlbEdyb3VwTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZjdiNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvTW9kZWxHcm91cExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5Nb2RlbEdyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuU3BhY2luZ0ZpZ3VyZTsKLQotcHVibGljIGNsYXNzIE1vZGVsR3JvdXBMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdExheW91dAotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0hvcml6b250YWw7Ci0gIHByb3RlY3RlZCBpbnQgc3BhY2luZyA9IDEwOwotICBwcm90ZWN0ZWQgaW50IGJvcmRlciA9IDA7Ci0KLSAgcHVibGljIE1vZGVsR3JvdXBMYXlvdXQoKQotICB7Ci0gICAgdGhpcygwKTsKLSAgfQotCi0gIHB1YmxpYyBNb2RlbEdyb3VwTGF5b3V0KGJvb2xlYW4gaXNIb3Jpem9udGFsKQotICB7Ci0gICAgdGhpcy5pc0hvcml6b250YWwgPSBpc0hvcml6b250YWw7Ci0gIH0KLQotICBwdWJsaWMgTW9kZWxHcm91cExheW91dChib29sZWFuIGlzSG9yaXpvbnRhbCwgaW50IHNwYWNpbmcpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgICB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOwotICB9Ci0KLSAgcHVibGljIE1vZGVsR3JvdXBMYXlvdXQoaW50IHNwYWNpbmcpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBjb250YWluZXIsIGludCB3SGludCwgaW50IGhIaW50KQotICB7Ci0gICAgRGltZW5zaW9uIHByZWZlcnJlZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotCi0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBwcmVmZXJyZWQud2lkdGggKz0gY2hpbGRTaXplLndpZHRoOwotICAgICAgICBwcmVmZXJyZWQuaGVpZ2h0ID0gTWF0aC5tYXgocHJlZmVycmVkLmhlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoID0gTWF0aC5tYXgocHJlZmVycmVkLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotICAgIGludCBjaGlsZHJlblNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDEpCi0gICAgewotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIHsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoICs9IHNwYWNpbmcgKiAoY2hpbGRyZW5TaXplIC0gMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gc3BhY2luZyAqIChjaGlsZHJlblNpemUgLSAxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcmVmZXJyZWQud2lkdGggKz0gYm9yZGVyICogMjsKLSAgICBwcmVmZXJyZWQuaGVpZ2h0ICs9IGJvcmRlciAqIDI7Ci0gICAgcHJlZmVycmVkLndpZHRoICs9IGNvbnRhaW5lci5nZXRJbnNldHMoKS5nZXRXaWR0aCgpOwotICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY29udGFpbmVyLmdldEluc2V0cygpLmdldEhlaWdodCgpOwotCi0gICAgcmV0dXJuIHByZWZlcnJlZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGNvbnRhaW5lcikKLSAgewotICAgIExpc3QgY2hpbGRyZW4gPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotICAgIGludCByeCA9IDA7Ci0gICAgRGltZW5zaW9uIGRpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb24oKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBjaGlsZHJlbi5nZXQoaSk7Ci0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIHsKLSAgICAgICAgZGltZW5zaW9uLmhlaWdodCA9IE1hdGgubWF4KGRpbWVuc2lvbi5oZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOwotICAgICAgICByeCArPSBjaGlsZFNpemUud2lkdGg7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRpbWVuc2lvbi53aWR0aCA9IE1hdGgubWF4KGRpbWVuc2lvbi53aWR0aCwgY2hpbGRTaXplLndpZHRoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgIHsKLSAgICAgIGRpbWVuc2lvbi5oZWlnaHQgKz0gYm9yZGVyICogMjsKLSAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBib3JkZXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkaW1lbnNpb24ud2lkdGggKz0gYm9yZGVyICogMjsKLSAgICAgIGRpbWVuc2lvbi5oZWlnaHQgKz0gYm9yZGVyOwotICAgIH0KLQotICAgIFJlY3RhbmdsZSByID0gY29udGFpbmVyLmdldENsaWVudEFyZWEoKTsKLSAgICBkaW1lbnNpb24gPSBuZXcgRGltZW5zaW9uKHIud2lkdGgsIHIuaGVpZ2h0KTsKLSAgICBQb2ludCBwID0gbmV3IFBvaW50KDAsIDApOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZShwLngsIDAsIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCk7Ci0KLSAgICAgICAgLy8gbGFzdCBjaGlsZAotICAgICAgICBpZiAoIWkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVjdGFuZ2xlLndpZHRoID0gZGltZW5zaW9uLndpZHRoIC0gcmVjdGFuZ2xlLng7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocC54ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZWN0YW5nbGUueSA9IHIuaGVpZ2h0IC8gMiAtIGNoaWxkU2l6ZS5oZWlnaHQgLyAyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlY3RhbmdsZS55ID0gci5oZWlnaHQgLyAyIC0gY2hpbGRTaXplLmhlaWdodCAvIDI7Ci0gICAgICAgIH0KLQotICAgICAgICByZWN0YW5nbGUudHJhbnNsYXRlKGNvbnRhaW5lci5nZXRDbGllbnRBcmVhKCkuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhyZWN0YW5nbGUpOwotICAgICAgICBwLnggKz0gY2hpbGRTaXplLndpZHRoOwotICAgICAgICBwLnggKz0gc3BhY2luZzsKLQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgwLCBwLnksIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgU3BhY2luZ0ZpZ3VyZSkKLSAgICAgICAgewotICAgICAgICAgIHJlY3RhbmdsZS54ID0gZGltZW5zaW9uLndpZHRoICsgNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBGaWd1cmUpCi0gICAgICAgIHsKLSAgICAgICAgICByZWN0YW5nbGUud2lkdGggPSBkaW1lbnNpb24ud2lkdGggLSByZWN0YW5nbGUueDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZWN0YW5nbGUud2lkdGggPSBkaW1lbnNpb24ud2lkdGggLSByZWN0YW5nbGUueDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlY3RhbmdsZS50cmFuc2xhdGUoY29udGFpbmVyLmdldENsaWVudEFyZWEoKS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKHJlY3RhbmdsZSk7Ci0gICAgICAgIHAueSArPSBjaGlsZFNpemUuaGVpZ2h0OwotICAgICAgICBwLnkgKz0gc3BhY2luZzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTcGFjaW5nKGludCBzcGFjaW5nKQotICB7Ci0gICAgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLSAgfQotCi0gIHByb3RlY3RlZCBpbnQgYWxpZ25GaWd1cmUoSUZpZ3VyZSBwYXJlbnQsIElGaWd1cmUgY2hpbGQpCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvQnVpbHRJblR5cGVzVHJlZVZpZXdlclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL0J1aWx0SW5UeXBlc1RyZWVWaWV3ZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGNlY2JiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvQnVpbHRJblR5cGVzVHJlZVZpZXdlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqICAgICBUcnVuZyBkZSBJcmVuZSA8dHJ1bmdoYUBjYS5pYm0uY29tPgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgY29udGVudCBmb3IgU2VsZWN0QnVpbHRJblR5cGVzRm9yRmlsdGVyRGlhbG9nCi0gKiByZWFkYWJpbGl0eSBXYXJuaW5nOiBTb21lIHNpbXBsZSB0cmlja3MgdG8gdHdlYWsgZWZmaWNpZW5jeSBhcmUgdXNlZAotICovCi1wdWJsaWMgY2xhc3MgQnVpbHRJblR5cGVzVHJlZVZpZXdlclByb3ZpZGVyIHsKLQkKLQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCQotCUlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQkKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9QQVJFTlQgPSAicGFyZW50IjsKLQkKLQkvKioKLQkgKiBDdXJyZW50bHkgdGhlcmUgYXJlIDMgc3ViZ3JvdXBzOiBOdW1iZXJzLCBEYXRhIGFuZCBUaW1lLCBPdGhlcgotCSAqIEZvbGtzIGNhbiBjaG9vc2UgdG8gZXhwYW5kIHRvIG1vcmUgc3ViZ3JvdXBzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IEJVSUxUX0lOX1RZUEVTX1NVQl9HUk9VUCA9IDM7Ci0JCi0gICAgc3RhdGljIFN0cmluZ1tdIG51bWJlclR5cGVzID0gCi0gICAgCXsgImJhc2U2NEJpbmFyeSIsICJieXRlIiwgImRlY2ltYWwiLCAiZG91YmxlIiwgImZsb2F0IiwgImhleEJpbmFyeSIsCi0gICAgCSAgImludCIsICJpbnRlZ2VyIiwgImxvbmciLCAibmVnYXRpdmVJbnRlZ2VyIiwgIm5vbk5lZ2F0aXZlSW50ZWdlciIsCi0gICAgCSAgIm5vblBvc2l0aXZlSW50ZWdlciIsICJwb3NpdGl2ZUludGVnZXIiLCAic2hvcnQiLCAidW5zaWduZWRCeXRlIiwKLSAgICAJICAidW5zaWduZWRJbnQiLCAidW5zaWduZWRMb25nIiwgInVuc2lnbmVkU2hvcnQifTsKLSAgICAKLSAgICBzdGF0aWMgU3RyaW5nW10gZGF0ZUFuZFRpbWVUeXBlcyA9Ci0gICAgCXsgImRhdGUiLCAiZGF0ZVRpbWUiLCAiZHVyYXRpb24iLCAiZ0RheSIsCi0gICAgCSAgImdNb250aCIsICJnTW9udGhEYXkiLCAiZ1llYXIiLCAiZ1llYXJNb250aCIsICJ0aW1lIn07Ci0JCi0JCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbEJ1aWx0SW5UeXBlcygpIHsKLSAgICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IFhTRERPTUhlbHBlci5kYXRhVHlwZS5sZW5ndGg7IGkrKykgewotICAgICAgICAvLyAgaXRlbXMuYWRkKFhTRERPTUhlbHBlci5kYXRhVHlwZVtpXVswXSk7Ci0gICAgICAgIC8vfQotICAgICAgICBJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IG1haW5Db250YWluZXIgPSBuZXcgQXJyYXlMaXN0KEJVSUxUX0lOX1RZUEVTX1NVQl9HUk9VUCk7Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gaGVhZGVyID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oIiIsICJSb290IiwgbnVsbCk7Ci0gICAgICAgIG1haW5Db250YWluZXIuYWRkKGhlYWRlcik7Ci0gICAgICAgIAotICAgICAgICBMaXN0IG51bWJlcnNHcm91cCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaGVhZGVyID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oIiIsICJOdW1iZXJzIiwgbnVsbCk7Ci0gICAgICAgIG51bWJlcnNHcm91cC5hZGQoaGVhZGVyKTsKLSAgICAgICAgbWFpbkNvbnRhaW5lci5hZGQobnVtYmVyc0dyb3VwKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgZGF0ZUFuZFRpbWVHcm91cCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaGVhZGVyID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oIiIsICJEYXRlIGFuZCBUaW1lIiwgbnVsbCk7Ci0gICAgICAgIGRhdGVBbmRUaW1lR3JvdXAuYWRkKGhlYWRlcik7Ci0gICAgICAgIG1haW5Db250YWluZXIuYWRkKGRhdGVBbmRUaW1lR3JvdXApOwotICAgICAgICAKLSAgICAgICAgTGlzdCBvdGhlckdyb3VwID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBoZWFkZXIgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigiIiwgIk90aGVyIiwgbnVsbCk7Ci0gICAgICAgIG90aGVyR3JvdXAuYWRkKGhlYWRlcik7Ci0gICAgICAgIG1haW5Db250YWluZXIuYWRkKG90aGVyR3JvdXApOwotCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpdGVtLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gYnVpbHRJblR5cGVJdGVtID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24obmFtZSwgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBudWxsKTsKLSAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGlmIHRoaXMgYnVpbHQtSW4gVHlwZSBpcyBpbiBOdW1iZXIgZ3JvdXAgCi0gICAgICAgICAgICBpZiAoIHBhcnRPZihuYW1lLCBudW1iZXJUeXBlcykgKXsKLSAgICAgICAgICAgIAkvLyBTZXQgcGFyZW50Ci0gICAgICAgICAgICAJLy9idWlsdEluVHlwZUl0ZW0uYWRkQXR0cmlidXRlSW5mbyhDT05TVF9QQVJFTlQsIG51bWJlcnNHcm91cCk7Ci0gICAgICAgICAgICAJCi0gICAgICAgICAgICAJbnVtYmVyc0dyb3VwLmFkZChidWlsdEluVHlwZUl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgdGhpcyBidWlsdC1JbiBUeXBlIGlzIGluIERhdGUtYW5kLVRpbWUgZ3JvdXAgCi0gICAgICAgICAgICBlbHNlIGlmICggcGFydE9mKG5hbWUsIGRhdGVBbmRUaW1lVHlwZXMpKXsKLSAgICAgICAgICAgIAkvL2J1aWx0SW5UeXBlSXRlbS5hZGRBdHRyaWJ1dGVJbmZvKENPTlNUX1BBUkVOVCwgZGF0ZUFuZFRpbWVHcm91cCk7Ci0gICAgICAgICAgICAJZGF0ZUFuZFRpbWVHcm91cC5hZGQoYnVpbHRJblR5cGVJdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgcHV0IGluIE90aGVyIGdyb3VwCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIAkvL2J1aWx0SW5UeXBlSXRlbS5hZGRBdHRyaWJ1dGVJbmZvKENPTlNUX1BBUkVOVCwgb3RoZXJHcm91cCk7Ci0gICAgICAgICAgICAJb3RoZXJHcm91cC5hZGQoYnVpbHRJblR5cGVJdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYWluQ29udGFpbmVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpewotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JCQotCQlsYWJlbFByb3ZpZGVyID0gbmV3IEJ1aWx0SW5UeXBlTGFiZWxQcm92aWRlcigpOwotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JcHVibGljIElUcmVlQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQkJCi0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBCdWlsdEluVHlwZXNUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCXJldHVybiBjb250ZW50UHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciBhbiBlcXVpdmFsZW50IG9mICdpdGVtJyBhcHBlYXJzIGluICdhcnJheScKLQkgKiBAcGFyYW0gaXRlbQotCSAqIEBwYXJhbSBhcnJheQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHBhcnRPZihTdHJpbmcgaXRlbSwgU3RyaW5nW10gYXJyYXkpewotCSAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKysgKXsKLQkgICAgCWlmICggaXRlbS5lcXVhbHMoYXJyYXlbaV0pICl7Ci0JICAgIAkJcmV0dXJuIHRydWU7Ci0JICAgIAl9ICAgICAgICAgICAgCQkKLQkgICAgfQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCQotCWNsYXNzIEJ1aWx0SW5UeXBlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsJCQkKLQkJCWlmICggZ2V0VGV4dChlbGVtZW50KS5lcXVhbHMoIk51bWJlcnMiKSApCi0JCQkJcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNETnVtYmVyVHlwZXMuZ2lmIik7Ci0JCQlpZiAoIGdldFRleHQoZWxlbWVudCkuZXF1YWxzKCJEYXRlIGFuZCBUaW1lIikgKQotCQkJCXJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRERhdGVBbmRUaW1lVHlwZXMuZ2lmIik7Ci0JCQlpZiAoIGdldFRleHQoZWxlbWVudCkuZXF1YWxzKCJPdGhlciIpICkKLQkJCQlyZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9icm93c2VidXR0b24uZ2lmIik7Ci0JCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uICl7Ci0JCQkJcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBudWxsOwotCQkJCi0JCQkvKiBpZiBub3Qgbm9uLWxlYWYgbm9kZSwgdGhlIGZpcnN0IGVsZW1lbnQgaGFzIHRoZSBuYW1lIGZvciAKLQkJCSAqIHRoZSB3aG9sZSBsaXN0ICovCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpc3QpewotCQkJCXNwZWMgPSAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgKChMaXN0KSBlbGVtZW50KS5nZXQoMCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiApewotCQkJCXNwZWMgPSAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgZWxlbWVudDsKLQkJCX0KLQkJCXJldHVybiBzcGVjLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkKLQkJfSAgCi0JCQotCX0KLQotCi0JY2xhc3MgQnVpbHRJblR5cGVzVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCUxpc3QgcGFyZW50Q29udGVudCA9IChMaXN0KSBwYXJlbnRFbGVtZW50OwotCQkJCQotCQkJCS8qKiBJZ25vcmUgdGhlIGZpcnN0IGVsZW1lbnQgKHdoaWNoIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgbGlzdAotCQkJCSAqIGllLiAnTnVtYmVycycsICdEYXRlIGFuZCB0aW1lJywgJ090aGVyJykgKi8KLQkJCQlyZXR1cm4gcGFyZW50Q29udGVudC5zdWJMaXN0KDEsIHBhcmVudENvbnRlbnQuc2l6ZSgpKS50b0FycmF5KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCSAgICByZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9JT3BlbkluTmV3RWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL0lPcGVuSW5OZXdFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyYzUyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL0lPcGVuSW5OZXdFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZW5Jbk5ld0VkaXRvcgotewotICBwdWJsaWMgdm9pZCBvcGVuWFNERWRpdG9yKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0F0dHJpYnV0ZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdBdHRyaWJ1dGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwMjk0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0F0dHJpYnV0ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBOZXdBdHRyaWJ1dGVEaWFsb2cgZXh0ZW5kcyBOZXdDb21wb25lbnREaWFsb2cgaW1wbGVtZW50cyBJQ29tcG9uZW50RGlhbG9nCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICBwcm90ZWN0ZWQgT2JqZWN0IHNldE9iamVjdDsKLSAgcHJvdGVjdGVkIGludCB0eXBlS2luZDsKLSAgcHJvdGVjdGVkIE9iamVjdCBzZWxlY3Rpb247Ci0KLSAgcHVibGljIE5ld0F0dHJpYnV0ZURpYWxvZygpCi0gIHsKLSAgICBzdXBlcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX0FUVFJJQlVURSwgIk5ld0F0dHJpYnV0ZSIpOyAgICAgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIE5ld0F0dHJpYnV0ZURpYWxvZyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgc3VwZXIoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgTWVzc2FnZXMuX1VJX0xBQkVMX05FV19BVFRSSUJVVEUsICJOZXdBdHRyaWJ1dGUiKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldHVwKCkgewotICAgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgICAgTGlzdCB1c2VkTmFtZXMgPSBnZXRVc2VkRWxlbWVudE5hbWVzKCk7Ci0gICAgICBzZXRVc2VkTmFtZXModXNlZE5hbWVzKTsKLSAgICAgIHNldERlZmF1bHROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoIk5ld0F0dHJpYnV0ZSIsIHNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotICBzZXR1cCgpOwotICAgIGludCByZXR1cm5Db2RlID0gc3VwZXIuY3JlYXRlQW5kT3BlbigpOwotICAgIGlmIChyZXR1cm5Db2RlID09IDApCi0gICAgewotICAgICAgaWYgKHNldE9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgICB7ICAKLSAgICAgICAgLy9Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChnZXROYW1lKCksIHNjaGVtYSk7Ci0gICAgICB9ICAgICAgICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmV0dXJuQ29kZTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLSAgewotICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9ICBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihudWxsLCBnZXROYW1lKCksIG51bGwpOyAgICAKLSAgICBjb21wb25lbnRTcGVjaWZpY2F0aW9uLnNldE1ldGFOYW1lKElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSk7Ci0gICAgY29tcG9uZW50U3BlY2lmaWNhdGlvbi5zZXROZXcodHJ1ZSk7Ci0gICAgcmV0dXJuIGNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGdldFVzZWRFbGVtZW50TmFtZXMoKSB7Ci0gICAgTGlzdCB1c2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAKLSAgICBpZiAoc2NoZW1hICE9IG51bGwgKSB7Ci0gICAgICBMaXN0IGVsZW1lbnRzTGlzdCA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsKLSAgICAgIEl0ZXJhdG9yIGVsZW1lbnRzID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IAotICAgICAgd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotICAgICAgICB1c2VkTmFtZXMuYWRkKCgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGVsZW1lbnRzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHVzZWROYW1lczsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0NvbXBvbmVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdDb21wb25lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwYzQ5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0NvbXBvbmVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotCi1wdWJsaWMgY2xhc3MgTmV3Q29tcG9uZW50RGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZUZpZWxkOyAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0gIHByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLSAgcHJvdGVjdGVkIExpc3QgdXNlZE5hbWVzOwotCi0gIHB1YmxpYyBOZXdDb21wb25lbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lKSAKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgIG5hbWUgPSBkZWZhdWx0TmFtZTsgICAgICAKLSAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBOZXdDb21wb25lbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lLCBMaXN0IHVzZWROYW1lcykgCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICBuYW1lID0gZGVmYXVsdE5hbWU7ICAgICAgCi0gICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIHRoaXMudXNlZE5hbWVzID0gdXNlZE5hbWVzOwotICB9Ci0KLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotICAgIGNyZWF0ZSgpOwotICAgIGdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0gICAgc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgcmV0dXJuIG9wZW4oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpICAKLSAgewotICAgIENvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgbmFtZUZpZWxkLmZvcmNlRm9jdXMoKTsKLSAgICBuYW1lRmllbGQuc2VsZWN0QWxsKCk7ICAKLSAgICB1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIG9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0gICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIZWFkZXJDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIAotICAgIGNyZWF0ZUhlYWRlckNvbnRlbnQoZGlhbG9nQXJlYSk7Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGdkRmlsbD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2RGaWxsLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RGaWxsLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgZ2RGaWxsLnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkRmlsbC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZEZpbGwpOwotCi0gICAgTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIG5hbWVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLlVJX0xBQkVMX05BTUUpOwotCi0gICAgbmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZC53aWR0aEhpbnQgPSAyMDA7Ci0gICAgbmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotICAgIG5hbWVGaWVsZC5zZXRUZXh0KG5hbWUpOwotICAgIG5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVGaWVsZCwgWFNERWRpdG9yQ1NIZWxwSWRzLk5FV1RZUEVfTkFNRSk7Ci0KLSAgICBjcmVhdGVFeHRlbmRlZENvbnRlbnQoZGlhbG9nQXJlYSk7Ci0KLSAgICAvLyBlcnJvciBtZXNzYWdlCi0gICAgZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgIGVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoImVycm9yIG1lc3NhZ2UgZ29lcyBoZXJlIik7Ci0gICAgR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QyLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgZ2QyLndpZHRoSGludCA9IDIwMDsKLSAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkMik7ICAgICAgICAgIAotLy8gICAgQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotLy8gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLSAgICByZXR1cm4gZGlhbG9nQXJlYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHVwZGF0ZUVycm9yTWVzc2FnZSgpOwotICB9ICAgICAgICAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoU3RyaW5nIG5hbWUpCi0gIHsKLSAgCWlmICh1c2VkTmFtZXMgPT0gbnVsbCkKLSAgCQlyZXR1cm4gbnVsbDsKLSAgCQotICAJSXRlcmF0b3IgaXRlcmF0b3IgPSB1c2VkTmFtZXMuaXRlcmF0b3IoKTsKLSAgCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSkpIHsKLSAgCQkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0VSUk9SX05BTUVfQUxSRUFEWV9VU0VEOyAvLyROT04tTkxTLTEkCi0gIAkJfQotICAJfQotICAJCi0gIAlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpCi0gIHsgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgIFN0cmluZyBuYW1lID0gbmFtZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPiAwKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZXJyb3JNZXNzYWdlID0gY29tcHV0ZUVycm9yTWVzc2FnZShuYW1lKTsKLSAgICB9ICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgfSAgCi0gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIG9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSAKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgIHsKLSAgICAgIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VXNlZE5hbWVzKExpc3QgdXNlZE5hbWVzKSB7Ci0JICB0aGlzLnVzZWROYW1lcyA9IHVzZWROYW1lczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50QnV0dG9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50QnV0dG9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzgzNTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3RWxlbWVudEJ1dHRvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklOZXdDb21wb25lbnRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgTmV3RWxlbWVudEJ1dHRvbkhhbmRsZXIgaW1wbGVtZW50cyBJTmV3Q29tcG9uZW50SGFuZGxlcgotewotICBwdWJsaWMgTmV3RWxlbWVudEJ1dHRvbkhhbmRsZXIoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBvcGVuTmV3Q29tcG9uZW50RGlhbG9nKCkKLSAgewotICAgIE5ld0VsZW1lbnREaWFsb2cgbmV3RWxlbWVudERpYWxvZyA9IG5ldyBOZXdFbGVtZW50RGlhbG9nKCk7Ci0gICAgbmV3RWxlbWVudERpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3RWxlbWVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDYxOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBOZXdFbGVtZW50RGlhbG9nIGV4dGVuZHMgTmV3Q29tcG9uZW50RGlhbG9nIGltcGxlbWVudHMgSUNvbXBvbmVudERpYWxvZwotewotCSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0JICBwcm90ZWN0ZWQgT2JqZWN0IHNldE9iamVjdDsKLQkgIHByb3RlY3RlZCBpbnQgdHlwZUtpbmQ7Ci0JICBwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGlvbjsKLQotCSAgcHVibGljIE5ld0VsZW1lbnREaWFsb2coKQotCSAgewotCSAgICBzdXBlcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX0VMRU1FTlQsICJOZXdFbGVtZW50Iik7ICAgICAvLyROT04tTkxTLTEkCi0JICB9Ci0KLQkgIHB1YmxpYyBOZXdFbGVtZW50RGlhbG9nKFhTRFNjaGVtYSBzY2hlbWEpCi0JICB7Ci0JICAgIHN1cGVyKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfRUxFTUVOVCwgIk5ld0VsZW1lbnQiKTsgICAgIC8vJE5PTi1OTFMtMSQKLQkgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0JICB9Ci0JICAKLQkgIHByaXZhdGUgdm9pZCBzZXR1cCgpIHsKLQkJICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCSAgTGlzdCB1c2VkTmFtZXMgPSBnZXRVc2VkRWxlbWVudE5hbWVzKCk7Ci0JCQkgIHNldFVzZWROYW1lcyh1c2VkTmFtZXMpOwotCQkJICBzZXREZWZhdWx0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKCJOZXdFbGVtZW50Iiwgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSkpOwotCQkgIH0KLQkgIH0KLQkgIAotCSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLQkgIHsKLQkJc2V0dXAoKTsKLQkgICAgaW50IHJldHVybkNvZGUgPSBzdXBlci5jcmVhdGVBbmRPcGVuKCk7Ci0JICAgIGlmIChyZXR1cm5Db2RlID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoc2V0T2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLQkgICAgICB7ICAKLQkgICAgICAgIC8vQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQoZ2V0TmFtZSgpLCBzY2hlbWEpOwotCSAgICAgIH0gICAgICAgIAotCSAgICB9ICAKLQkgICAgcmV0dXJuIHJldHVybkNvZGU7Ci0JICB9Ci0KLQkgIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLQkgIHsKLQkgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gIG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKG51bGwsIGdldE5hbWUoKSwgbnVsbCk7ICAgIAotCSAgICBjb21wb25lbnRTcGVjaWZpY2F0aW9uLnNldE1ldGFOYW1lKElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpOwotCSAgICBjb21wb25lbnRTcGVjaWZpY2F0aW9uLnNldE5ldyh0cnVlKTsKLQkgICAgcmV0dXJuIGNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0JICB9Ci0KLQkgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uKQotCSAgewotCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JICB9Ci0JICAKLQkgIHByaXZhdGUgTGlzdCBnZXRVc2VkRWxlbWVudE5hbWVzKCkgewotCQkgIExpc3QgdXNlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwkJICAKLQkJICBpZiAoc2NoZW1hICE9IG51bGwgKSB7Ci0JCQkgIExpc3QgZWxlbWVudHNMaXN0ID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLQkJCSAgSXRlcmF0b3IgZWxlbWVudHMgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgCi0JCQkgIHdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQkgIHVzZWROYW1lcy5hZGQoKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCSAgfQotCQkgIH0KLQkJICAKLQkJICByZXR1cm4gdXNlZE5hbWVzOwotCSAgfQotCX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3VHlwZUJ1dHRvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3VHlwZUJ1dHRvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxNWE4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld1R5cGVCdXR0b25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JTmV3Q29tcG9uZW50SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIE5ld1R5cGVCdXR0b25IYW5kbGVyIGltcGxlbWVudHMgSU5ld0NvbXBvbmVudEhhbmRsZXIKLXsKLSAgcHVibGljIE5ld1R5cGVCdXR0b25IYW5kbGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgb3Blbk5ld0NvbXBvbmVudERpYWxvZygpCi0gIHsKLSAgICBOZXdUeXBlRGlhbG9nIG5ld1R5cGVEaWFsb2cgPSBuZXcgTmV3VHlwZURpYWxvZygpOwotICAgIG5ld1R5cGVEaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdUeXBlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld1R5cGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyZTIxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld1R5cGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgTmV3VHlwZURpYWxvZyBleHRlbmRzIE5ld0NvbXBvbmVudERpYWxvZyBpbXBsZW1lbnRzIElDb21wb25lbnREaWFsb2cKLXsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByb3RlY3RlZCBzdGF0aWMgaW50IFNJTVBMRV9UWVBFID0gMDsKLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgQ09NUExFWF9UWVBFID0gMTsKLSAgcHJvdGVjdGVkIE9iamVjdCBzZXRPYmplY3Q7Ci0gIHByb3RlY3RlZCBpbnQgdHlwZUtpbmQ7Ci0gIHByb3RlY3RlZCBPYmplY3Qgc2VsZWN0aW9uOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd0NvbXBsZXhUeXBlID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dBbm9ueW1vdXNUeXBlID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gYW5vbnltb3VzVHlwZSA9IGZhbHNlOwotICBwcml2YXRlIEJ1dHRvbiBjb21wbGV4VHlwZUJ1dHRvbjsKLSAgcHJpdmF0ZSBCdXR0b24gc2ltcGxlVHlwZUJ1dHRvbjsKLSAgcHJpdmF0ZSBCdXR0b24gYW5vbnltb3VzVHlwZUNoZWNrQm94OwotCi0gIHB1YmxpYyBOZXdUeXBlRGlhbG9nKCkKLSAgewotICAgIHN1cGVyKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfVFlQRSwgIk5ld1R5cGUiKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBOZXdUeXBlRGlhbG9nKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX1RZUEUsICJOZXdUeXBlIik7ICAgICAvLyROT04tTkxTLTEkCi0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXR1cCgpIHsKLQkgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkgIExpc3QgdXNlZE5hbWVzID0gZ2V0VXNlZFR5cGVOYW1lcygpOwotCQkgIHNldFVzZWROYW1lcyh1c2VkTmFtZXMpOwotCQkgIHNldERlZmF1bHROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUobmFtZSwgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpKSk7Ci0JICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpCi0gIHsKLQlzZXR1cCgpOwotICAgIGludCByZXR1cm5Db2RlID0gc3VwZXIuY3JlYXRlQW5kT3BlbigpOwotICAgIGlmIChyZXR1cm5Db2RlID09IDApCi0gICAgewotICAgICAgaWYgKHNldE9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgICB7ICAKLSAgICAgICAgLy9Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChnZXROYW1lKCksIHNjaGVtYSk7Ci0gICAgICB9ICAgICAgICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmV0dXJuQ29kZTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLSAgewotICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgICBpZiAoIGFub255bW91c1R5cGUgKQotICAgIAljb21wb25lbnRTcGVjaWZpY2F0aW9uID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24obnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgZWxzZQotICAgIAljb21wb25lbnRTcGVjaWZpY2F0aW9uID0gIG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKG51bGwsIGdldE5hbWUoKSwgbnVsbCk7ICAgIAotICAgIGNvbXBvbmVudFNwZWNpZmljYXRpb24uc2V0TWV0YU5hbWUodHlwZUtpbmQgPT0gQ09NUExFWF9UWVBFID8gSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FIDogSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUpOwotICAgIGNvbXBvbmVudFNwZWNpZmljYXRpb24uc2V0TmV3KHRydWUpOwotICAgIC8vY29tcG9uZW50U3BlY2lmaWNhdGlvbi4KLSAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlSGVhZGVyQ29udGVudChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcGxleFR5cGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICBjb21wbGV4VHlwZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9DT01QTEVYX1RZUEUpOwotICAgIGNvbXBsZXhUeXBlQnV0dG9uLnNldEVuYWJsZWQoYWxsb3dDb21wbGV4VHlwZSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wbGV4VHlwZUJ1dHRvbiwgWFNERWRpdG9yQ1NIZWxwSWRzLk5FV1RZUEVfQ09NUExFWFRZUEUpOwotICAgIAotICAgIHNpbXBsZVR5cGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICBzaW1wbGVUeXBlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1NJTVBMRV9UWVBFKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNpbXBsZVR5cGVCdXR0b24sIFhTREVkaXRvckNTSGVscElkcy5ORVdUWVBFX1NJTVBMRVRZUEUpOwotICAgIAotICAgIFNlbGVjdGlvbkFkYXB0ZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGUud2lkZ2V0ID09IHNpbXBsZVR5cGVCdXR0b24pCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlS2luZCA9IFNJTVBMRV9UWVBFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGNvbXBsZXhUeXBlQnV0dG9uKQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZUtpbmQgPSBDT01QTEVYX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYWxsb3dBbm9ueW1vdXNUeXBlICYmIGUud2lkZ2V0ID09IGFub255bW91c1R5cGVDaGVja0JveCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhbm9ueW1vdXNUeXBlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSkKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIG5hbWVGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgCSAgYW5vbnltb3VzVHlwZSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIG5hbWVGaWVsZC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAJICBhbm9ueW1vdXNUeXBlID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBpZiAoYWxsb3dDb21wbGV4VHlwZSkKLSAgICB7Ci0gICAgICBjb21wbGV4VHlwZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICB0eXBlS2luZCA9IENPTVBMRVhfVFlQRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNpbXBsZVR5cGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgdHlwZUtpbmQgPSBTSU1QTEVfVFlQRTsKLSAgICB9Ci0KLSAgICBzaW1wbGVUeXBlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICBjb21wbGV4VHlwZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGlmIChhbGxvd0Fub255bW91c1R5cGUgKQotICAgIHsKLSAgICAgIGFub255bW91c1R5cGVDaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgYW5vbnltb3VzVHlwZUNoZWNrQm94LnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0NSRUFURV9BTk9OX1RZUEUpOwotICAgIH0gICAgCi0KLSAgICBpZiAoYW5vbnltb3VzVHlwZUNoZWNrQm94ICE9IG51bGwpCi0gICAgICBhbm9ueW1vdXNUeXBlQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOyAgICAKLSAgfQotCi0gIC8vIFRPRE86IENhbiB3ZSByZW1vdmUgdGhpcz8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROb3JtYWxpemVkTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgVVJMIHJlc29sdmVkVVJMID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotICAgICAgbG9jYXRpb24gPSByZXNvbHZlZFVSTC5nZXRQYXRoKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhbGxvd0NvbXBsZXhUeXBlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICB0aGlzLmFsbG93Q29tcGxleFR5cGU9IHZhbHVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhbGxvd0Fub255bW91c1R5cGUoYm9vbGVhbiB2YWx1ZSkKLSAgewotCXRoaXMuYWxsb3dBbm9ueW1vdXNUeXBlID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGlzdCBnZXRVc2VkVHlwZU5hbWVzKCkgewotCSAgTGlzdCB1c2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkgIExpc3QgdHlwZXNMaXN0ID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpOwotCQkgIEl0ZXJhdG9yIHR5cGVzID0gdHlwZXNMaXN0Lml0ZXJhdG9yKCk7Ci0JCSAgd2hpbGUgKHR5cGVzLmhhc05leHQoKSkgewotCQkJICB1c2VkTmFtZXMuYWRkKCgoWFNEVHlwZURlZmluaXRpb24pIHR5cGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJICB9Ci0JICB9Ci0JICAKLQkgIHJldHVybiB1c2VkTmFtZXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0QnVpbHRJblR5cGVzRm9yRmlsdGVyaW5nRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEJ1aWx0SW5UeXBlc0ZvckZpbHRlcmluZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDM3ZDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0QnVpbHRJblR5cGVzRm9yRmlsdGVyaW5nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqICAgICBUcnVuZyBkZSBJcmVuZSA8dHJ1bmdoYUBjYS5pYm0uY29tPgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ2hlY2tlZFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBUaGUgQnVpbHRJblR5cGVzRmlsdGVyaW5nRGlhbG9nIGlzIGEgU2VsZWN0aW9uRGlhbG9nIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvCi0gKiAgc2VsZWN0IGEgLi4uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RCdWlsdEluVHlwZXNGb3JGaWx0ZXJpbmdEaWFsb2cgZXh0ZW5kcyBDaGVja2VkVHJlZVNlbGVjdGlvbkRpYWxvZyB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVVNUT01fTElTVF9TRVBBUkFUT1IgPSBYU0RFZGl0b3JQbHVnaW4uQ1VTVE9NX0xJU1RfU0VQQVJBVE9SOwotCi0JcHVibGljIFNlbGVjdEJ1aWx0SW5UeXBlc0ZvckZpbHRlcmluZ0RpYWxvZyhTaGVsbCBwYXJlbnQsIAotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbGFiZWxQcm92aWRlciwgY29udGVudFByb3ZpZGVyKTsKLQotCQlpbml0KCk7Ci0JfQotCQotCXB1YmxpYyBDaGVja2JveFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpewotCQlyZXR1cm4gc3VwZXIuZ2V0VHJlZVZpZXdlcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdCgpewotCQkvLyBncmV5IHN0YXRlIGVuYWJsZQotCQlzZXRDb250YWluZXJNb2RlKHRydWUpOwotCQkKLQkJc2V0VGl0bGUoTWVzc2FnZXMuX1VJX0xBQkVMX1NFVF9DT01NT05fQlVJTFRfSU5fVFlQRVMpOwotCQlzZXRNZXNzYWdlKE1lc3NhZ2VzLl9VSV9MQUJFTF9TRUxFQ1RfVFlQRVNfRklMVEVSX09VVCk7Ci0JCQotCQkvL3N1cGVyLmNyZWF0ZSgpOwotCQkvL3N1cGVyLmdldFRyZWVWaWV3ZXIoKS5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQkJCi0JfQotCQotCS8qKgotCSAqICAgUmV0dXJucyBhIFN0cmluZyBhY3RpbmcgYXMgbGlzdCBvZiBidWlsdC1pbiB0eXBlcyBzZWxlY3RlZCBieSB0aGUgdXNlcgotCSAqIGluIHRoZSBmaWx0ZXIgZGlhbG9nICh3aGl0ZSBzcGFjZSBhY3RzIGFzIHRoZSBpdGVtIHNlcGFyYXRvcikuCi0JICogICBTdWdnZXN0IHVzaW5nIGdldFNlbGVjdGVkQnVpbHRJblR5cGVzRnJvbVN0cmluZwotCSAqIHRvIGdldCBhIGNvbmNyZXRlIGFycmF5IG9mIHNlbGVjdGVkIHR5cGVzLgotCSAqICAgV2UgY2FuIG9ubHkgc3RvcmUgU3RyaW5nIGluIHRoZSBwbHVnaW4gcHJlZmVyZW5jZSdzIHN0b3JhZ2Ugc28gd2UgaGF2ZSAKLQkgKiB1c2UgdGhpcyBtZXRob2QgZm9yIGNvbnZlcnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlc0xpc3RJblN0cmluZyhPYmplY3RbXSBjaG9zZW5UeXBlcykgewotCQlTdHJpbmcgcmV0dXJuaW5nTGlzdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hvc2VuVHlwZXMubGVuZ3RoOyBpKyspewotCQkJaWYgKCBjaG9zZW5UeXBlc1tpXSBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pewotCQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb24gYVR5cGUgPSAKLQkJCQkJKENvbXBvbmVudFNwZWNpZmljYXRpb24pIGNob3NlblR5cGVzW2ldOwotCi0JCQkJcmV0dXJuaW5nTGlzdCArPSBhVHlwZS5nZXROYW1lKCkgKyBDVVNUT01fTElTVF9TRVBBUkFUT1I7Ci0JCQl9Ci0JCQkvKiBlbHNlIHNlbGVjdGVkQnVpbHRJblR5cGVzW2ldIGluc3RhbmNlb2YgTGlzdCwgaWUuIGEgcGFyZW50Tm9kZQotCQkJICogd2UgaWdub3JlIGl0LiAqLwotCQl9Ci0JCXJldHVybiByZXR1cm5pbmdMaXN0OwotCX0KLQkKLQkvKioKLQkgKiBGaWx0ZXJzIG91dCBhbGwgYnVpbHQtSW4gdHlwZSBub3QgcmVjb3JkZWQgaW4gdGhlICdsaXN0U3RyaW5nJyBhbmQgCi0JICogcmV0dXJucyB0aGUgcmVzdWx0IGluIGEgTGlzdAotCSAqIFdhcm5pbmc6IHJlY3Vyc2l2ZSBtZXRob2QKLQkgKiBAcGFyYW0gbGlzdFN0cmluZyAKLQkgKiBAcGFyYW0gYUNvbnRhaW5lciAKLQkgKiAJCQlDb250YWluaW5nIGFsbCB0eXBlcwotCSAqIEByZXR1cm4gYSBzdWJzZXQgb2Ygd2hhdCAnYUNvbnRhaW5lcicgaGFzIGFzIHNwZWNpZmllZCBieSAnbGlzdFN0cmluZycKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2VsZWN0ZWRCdWlsdEluVHlwZXNGcm9tU3RyaW5nKFN0cmluZyBsaXN0U3RyaW5nLCAKLQkJCUxpc3QgYUNvbnRhaW5lcikgewotCQlMaXN0IHNlbGVjdGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gaWdub3JlIHRoZSAnaGVhZGVyJyBpdGVtIGluIHRoZSBjb250YWluZXIsIHN0YXJ0aW5nIGZyb20gaSA9IDEKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBhQ29udGFpbmVyLnNpemUoKTsgaSsrKXsKLQkJCU9iamVjdCBvID0gYUNvbnRhaW5lci5nZXQoaSk7Ci0JCQlpZiAoIG8gaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKXsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIGFUeXBlID0gKENvbXBvbmVudFNwZWNpZmljYXRpb24pIG87Ci0JCQkJU3RyaW5nIHR5cGVOYW1lID0gYVR5cGUuZ2V0TmFtZSgpOwotCQkJCS8vIGlmIHR5cGVOYW1lJ3MgbmFtZSBhcHBlYXJzIGluICdsaXN0U3RyaW5nJwotCQkJCWlmICggbGlzdFN0cmluZy5pbmRleE9mKHR5cGVOYW1lICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SKSAhPSAtMSkKLQkJCQkJc2VsZWN0ZWRUeXBlcy5hZGQobyk7Ci0JCQl9Ci0JCQllbHNlIGlmICggbyBpbnN0YW5jZW9mIExpc3QpewotCQkJCXNlbGVjdGVkVHlwZXMuYWRkQWxsKCBnZXRTZWxlY3RlZEJ1aWx0SW5UeXBlc0Zyb21TdHJpbmcobGlzdFN0cmluZywgKExpc3QpIG8pICk7IAotCQkJfQotCQl9Ci0JCXJldHVybiBzZWxlY3RlZFR5cGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvWFNER3JhcGhWaWV3ZXJEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvWFNER3JhcGhWaWV3ZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2NmUyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1hTREdyYXBoVmlld2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlBvcHVwRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290Q29udGVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuVHlwZVZpekZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNERWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREdyYXBoVmlld2VyRGlhbG9nIGV4dGVuZHMgUG9wdXBEaWFsb2cKLXsKLSAgcHJvdGVjdGVkIE9iamVjdCBtb2RlbDsKLSAgcHJvdGVjdGVkIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciB2aWV3ZXI7Ci0gIHByb3RlY3RlZCBJT3BlbkluTmV3RWRpdG9yIG9wZW5Jbk5ld0VkaXRvckhlbHBlcjsKLSAgcHJpdmF0ZSBPcGVuRWRpdG9yTGlua0xpc3RlbmVyIGxpbmtMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBMYWJlbCBuc0luZm9MYWJlbDsKLSAgcHJpdmF0ZSBIeXBlcmxpbmsgbGluazsKLSAgcHJpdmF0ZSBTdHJpbmcgaW5mb1RleHQ7Ci0gIHByaXZhdGUgRm9udCBpbmZvRm9udDsKLSAgcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSUQ7Ci0gIHByaXZhdGUgUHJldmlld0NvbnRyb2xMaXN0ZW5lciBtb3ZlTGlzdGVuZXI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWF9PUklHSU4gPSAiRElBTE9HX1hfT1JJR0lOIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWV9PUklHSU4gPSAiRElBTE9HX1lfT1JJR0lOIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGJvb2xlYW4gaXNIaWdoQ29udHJhc3QgPSBmYWxzZTsKLQotICBwdWJsaWMgWFNER3JhcGhWaWV3ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZVRleHQsIFN0cmluZyBpbmZvVGV4dCwgT2JqZWN0IG1vZGVsLCBTdHJpbmcgSUQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgSE9WRVJfU0hFTExTVFlMRSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRpdGxlVGV4dCwgaW5mb1RleHQpOwotICAgIHNldE1vZGVsKG1vZGVsKTsKLSAgICBsaW5rTGlzdGVuZXIgPSBuZXcgT3BlbkVkaXRvckxpbmtMaXN0ZW5lcigpOwotICAgIHRoaXMuaW5mb1RleHQgPSBpbmZvVGV4dDsKLSAgICB0aGlzLnVuaXF1ZUlEID0gSUQ7Ci0gICAgQXNzZXJ0LmlzVHJ1ZShJRCAhPSBudWxsICYmIElELmxlbmd0aCgpID4gMCk7ICAgIAotICAgIG1vdmVMaXN0ZW5lciA9IG5ldyBQcmV2aWV3Q29udHJvbExpc3RlbmVyKCk7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIGlzSGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy8gaWdub3JlIAotICAgIH0KLSAgICBjcmVhdGUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9wZW5FeHRlcm5hbEVkaXRvcihJT3BlbkluTmV3RWRpdG9yIGhlbHBlcikKLSAgewotICAgIHRoaXMub3BlbkluTmV3RWRpdG9ySGVscGVyID0gaGVscGVyOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBmaWxsRGlhbG9nTWVudShJTWVudU1hbmFnZXIgZGlhbG9nTWVudSkKLSAgewotICAgIHN1cGVyLmZpbGxEaWFsb2dNZW51KGRpYWxvZ01lbnUpOwotICAgIGRpYWxvZ01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgZGlhbG9nTWVudS5hZGQobmV3IFNldE9wZW5JbkVkaXRvcigpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHZpZXdlciA9IG5ldyBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIoKTsKLSAgICBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICBpZiAoaXNIaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgYy5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIH0KLSAgICBjLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotICAgIFJvb3RFZGl0UGFydCByb290ID0gbmV3IFJvb3RFZGl0UGFydCgpOwotICAgIHZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0KLSAgICB2aWV3ZXIuY3JlYXRlQ29udHJvbChjKTsKLSAgICBpZiAoaXNIaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIH0KLSAgICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5ID0gbmV3IFhTREVkaXRQYXJ0RmFjdG9yeShuZXcgVHlwZVZpekZpZ3VyZUZhY3RvcnkoKSk7Ci0gICAgdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShlZGl0UGFydEZhY3RvcnkpOwotCi0gICAgUm9vdENvbnRlbnRFZGl0UGFydCByb290Q29udGVudEVkaXRQYXJ0ID0gbmV3IFJvb3RDb250ZW50RWRpdFBhcnQoKTsKLSAgICByb290Q29udGVudEVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICB2aWV3ZXIuc2V0Q29udGVudHMocm9vdENvbnRlbnRFZGl0UGFydCk7Ci0gICAgCi0gICAgZ2V0U2hlbGwoKS5hZGRDb250cm9sTGlzdGVuZXIobW92ZUxpc3RlbmVyKTsKLSAgICByZXR1cm4gYzsKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlSW5mb1RleHRBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgaW5mb0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBpbmZvQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGluZm9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBuc0luZm9MYWJlbCA9IG5ldyBMYWJlbChpbmZvQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgbnNJbmZvTGFiZWwuc2V0VGV4dChpbmZvVGV4dCk7Ci0KLSAgICBGb250IGZvbnQgPSBuc0luZm9MYWJlbC5nZXRGb250KCk7Ci0gICAgRm9udERhdGFbXSBmb250RGF0YXMgPSBmb250LmdldEZvbnREYXRhKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb250RGF0YXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZm9udERhdGFzW2ldLnNldEhlaWdodChmb250RGF0YXNbaV0uZ2V0SGVpZ2h0KCkgKiA5IC8gMTApOwotICAgIH0KLSAgICBpbmZvRm9udCA9IG5ldyBGb250KG5zSW5mb0xhYmVsLmdldERpc3BsYXkoKSwgZm9udERhdGFzKTsKLSAgICBuc0luZm9MYWJlbC5zZXRGb250KGluZm9Gb250KTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgbnNJbmZvTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgbnNJbmZvTGFiZWwuc2V0Rm9yZWdyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1cpKTsKLQotICAgIGxpbmsgPSBuZXcgSHlwZXJsaW5rKGluZm9Db21wb3NpdGUsIFNXVC5SSUdIVCk7Ci0gICAgbGluay5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SKTsKLSAgICBsaW5rLnNldEZvbnQoaW5mb0ZvbnQpOwotICAgIGxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobGlua0xpc3RlbmVyKTsKLSAgICByZXR1cm4gaW5mb0NvbXBvc2l0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldE1vZGVsKE9iamVjdCBtb2RlbCkKLSAgewotICAgIEFzc2VydC5pc1RydWUobW9kZWwgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgdGhpcy5tb2RlbCA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBtb2RlbCk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIFNldE9wZW5JbkVkaXRvciBleHRlbmRzIEFjdGlvbgotICB7Ci0gICAgcHVibGljIFNldE9wZW5JbkVkaXRvcigpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9PUEVOX0lOX05FV19FRElUT1IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGlmIChvcGVuSW5OZXdFZGl0b3JIZWxwZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBvcGVuSW5OZXdFZGl0b3JIZWxwZXIub3BlblhTREVkaXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLSAgewotICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncz0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLmdldFNlY3Rpb24odW5pcXVlSUQpOwotICAgIGlmIChzZXR0aW5ncyA9PSBudWxsKQotICAgICAgc2V0dGluZ3M9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5hZGROZXdTZWN0aW9uKHVuaXF1ZUlEKTsKLQotICAgIHJldHVybiBzZXR0aW5nczsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxMb2NhdGlvbihQb2ludCBpbml0aWFsU2l6ZSkKLSAgewotICAgIFBvaW50IHJlc3VsdCA9IHN1cGVyLmdldEluaXRpYWxMb2NhdGlvbihpbml0aWFsU2l6ZSk7Ci0KLSAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSB1bmlxdWVJRCA9PSBudWxsID8gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgOiB1bmlxdWVJRDsKLSAgICAgICAgaW50IHggPSBzZXR0aW5ncy5nZXRJbnQocHJlZml4ICsgWF9PUklHSU4pOwotICAgICAgICBpbnQgeSA9IHNldHRpbmdzLmdldEludChwcmVmaXggKyBZX09SSUdJTik7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBQb2ludCh4LCB5KTsKLSAgICAgICAgU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUG9pbnQgcGFyZW50TG9jYXRpb24gPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICByZXN1bHQueCArPSBwYXJlbnRMb2NhdGlvbi54OwotICAgICAgICAgIHJlc3VsdC55ICs9IHBhcmVudExvY2F0aW9uLnk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNhdmVEaWFsb2dCb3VuZHMoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKQotICAgIHsKLSAgICAgIFBvaW50IHNoZWxsTG9jYXRpb24gPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotICAgICAgU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgUG9pbnQgcGFyZW50TG9jYXRpb24gPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgc2hlbGxMb2NhdGlvbi54IC09IHBhcmVudExvY2F0aW9uLng7Ci0gICAgICAgIHNoZWxsTG9jYXRpb24ueSAtPSBwYXJlbnRMb2NhdGlvbi55OwotICAgICAgfQotICAgICAgU3RyaW5nIHByZWZpeCA9IHVuaXF1ZUlEID09IG51bGwgPyBnZXRDbGFzcygpLmdldE5hbWUoKSA6IHVuaXF1ZUlEOwotICAgICAgc2V0dGluZ3MucHV0KHByZWZpeCArIFhfT1JJR0lOLCBzaGVsbExvY2F0aW9uLngpOwotICAgICAgc2V0dGluZ3MucHV0KHByZWZpeCArIFlfT1JJR0lOLCBzaGVsbExvY2F0aW9uLnkpOwotICAgIH0KLSAgfQotCi0gIAotICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpCi0gIHsKLSAgICBnZXRTaGVsbCgpLnJlbW92ZUNvbnRyb2xMaXN0ZW5lcihtb3ZlTGlzdGVuZXIpOwotICAgIGlmIChsaW5rICE9IG51bGwpCi0gICAgICBsaW5rLnJlbW92ZUh5cGVybGlua0xpc3RlbmVyKGxpbmtMaXN0ZW5lcik7Ci0gICAgaWYgKGluZm9Gb250ICE9IG51bGwpCi0gICAgICBpbmZvRm9udC5kaXNwb3NlKCk7Ci0gICAgaW5mb0ZvbnQgPSBudWxsOwotICAgIHJldHVybiBzdXBlci5jbG9zZSgpOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIGNsYXNzIE9wZW5FZGl0b3JMaW5rTGlzdGVuZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXIKLSAgewotCi0gICAgcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKQotICAgIHsKLSAgICAgIG5ldyBTZXRPcGVuSW5FZGl0b3IoKS5ydW4oKTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbGlua0VudGVyZWQoSHlwZXJsaW5rRXZlbnQgZSkKLSAgICB7Ci0gICAgICBsaW5rLnNldEZvcmVncm91bmQoQ29sb3JDb25zdGFudHMubGlnaHRCbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpCi0gICAgewotICAgICAgbGluay5zZXRGb3JlZ3JvdW5kKGxpbmsuZ2V0UGFyZW50KCkuZ2V0Rm9yZWdyb3VuZCgpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBQcmV2aWV3Q29udHJvbExpc3RlbmVyIGltcGxlbWVudHMgQ29udHJvbExpc3RlbmVyCi0gIHsKLQotICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkKLSAgICB7Ci0gICAgICBzYXZlRGlhbG9nQm91bmRzKGdldFNoZWxsKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS4yLjEwMQotICAgKiBAcGFyYW0geHNkQ29tcG9uZW50Ci0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICogQHBhcmFtIGVkaXRvck5hbWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuTm9uWFNEUmVzb3VyY2VTY2hlbWEoWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50LCBYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgZWRpdG9yTmFtZSkKLSAgewotICAgIG9wZW5JbmxpbmVTY2hlbWEoZ2V0Q3VycmVudEVkaXRvcklucHV0KCksIHhzZENvbXBvbmVudCwgc2NoZW1hLCBlZGl0b3JOYW1lKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmxpbmVTY2hlbWEoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQsIFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBlZGl0b3JOYW1lKQotICB7Ci0gICAgT3BlbkluTmV3RWRpdG9yLm9wZW5JbmxpbmVTY2hlbWEoZWRpdG9ySW5wdXQsIHhzZENvbXBvbmVudCwgc2NoZW1hLCBlZGl0b3JOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KQotICB7Ci0gICAgb3BlblhTREVkaXRvcihnZXRDdXJyZW50RWRpdG9ySW5wdXQoKSwgeHNkQ29tcG9uZW50LmdldFNjaGVtYSgpLCB4c2RDb21wb25lbnQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RTY2hlbWEgc2NoZW1hLCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpCi0gIHsKLSAgICBPcGVuSW5OZXdFZGl0b3Iub3BlblhTREVkaXRvcihlZGl0b3JJbnB1dCwgc2NoZW1hLCB4c2RDb21wb25lbnQpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBJRWRpdG9ySW5wdXQgZ2V0Q3VycmVudEVkaXRvcklucHV0KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgewotICAgICAgICBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0Jhc2VIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0Jhc2VIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDQzMTYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9CYXNlSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGh5cGVybGlua3MgZGV0ZWN0b3JzLiBQcm92aWRlcyBhIGZyYW1ld29yayBhbmQgY29tbW9uIGNvZGUgZm9yCi0gKiBoeXBlcmxpbmsgZGV0ZWN0b3JzLiBUT0RPOiBDYW4gd2UgcHVsbCB0aGlzIGNsYXNzIGZ1cnRoZXIgdXAgdGhlIGluaGVyaXRhbmNlCi0gKiBoaWVyYXJjaHk/Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSHlwZXJsaW5rRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yCi17Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICovCi0gIHB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKQotICB7Ci0gICAgaWYgKHJlZ2lvbiA9PSBudWxsIHx8IHRleHRWaWV3ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotICAgIElEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICBpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldE9mZnNldCgpOwotCi0gICAgSURPTU5vZGUgbm9kZSA9IGdldEN1cnJlbnROb2RlKGRvY3VtZW50LCBvZmZzZXQpOwotCi0gICAgLy8gVGhpcyBjYWxsIGFsbG93cyB1cyB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBhdHRyaWJ1dGUgaXMgbGlua2FibGUsCi0gICAgLy8gd2l0aG91dCBpbmN1cnJpbmcgdGhlIGNvc3Qgb2YgYXNraW5nIGZvciB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KLQotICAgIGlmICghaXNMaW5rYWJsZShub2RlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihub2RlKTsKLQotICAgIC8vIGNyZWF0ZUh5cGVybGluayBpcyBhIHRlbXBsYXRlIG1ldGhvZC4gRGVyaXZlZCBjbGFzc2VzLCBzaG91bGQgb3ZlcnJpZGUuCi0KLSAgICBJSHlwZXJsaW5rIGh5cGVybGluayA9IGNyZWF0ZUh5cGVybGluayhkb2N1bWVudCwgbm9kZSwgaHlwZXJsaW5rUmVnaW9uKTsKLQotICAgIGlmIChoeXBlcmxpbmsgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoeXBlcmxpbmtzLmFkZChoeXBlcmxpbmspOwotICAgIH0KLQotICAgIGlmIChoeXBlcmxpbmtzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHJldHVybiAoSUh5cGVybGlua1tdKSBoeXBlcmxpbmtzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtbMF0pOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgImxpbmthYmxlIiB0aGF0IGlzLCB0aGUgY29tcG9uZW50IGl0IHJlZmVycyB0bwotICAgKiBjYW4gYmUgdGhlIHRhcmdldCBvZiBhICJnbyB0byBkZWZpbml0aW9uIiBuYXZpZ2F0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdGVzdCwgbXVzdCBub3QgYmUgbnVsbDsKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBub2RlIGlzIGxpbmthYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNMaW5rYWJsZShJRE9NTm9kZSBub2RlKQotICB7Ci0gICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0KLSAgICBib29sZWFuIGlzTGlua2FibGUgPSBmYWxzZTsKLQotICAgIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgIHsKLSAgICAgIElET01BdHRyIGF0dHIgPSAoSURPTUF0dHIpIG5vZGU7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCi0gICAgICAvLyBpc0xpbmthYmxlQXR0cmlidXRlIGlzIGEgdGVtcGxhdGUgbWV0aG9kLiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkCi0gICAgICAvLyBvdmVycmlkZS4KLQotICAgICAgaXNMaW5rYWJsZSA9IGlzTGlua2FibGVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGlzTGlua2FibGU7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBpcyAibGlua2FibGUiIHRoYXQgaXMsIHRoZSBjb21wb25lbnQgaXQKLSAgICogcG9pbnRzIHRvIGNhbiBiZSB0aGUgdGFyZ2V0IG9mIGEgImdvIHRvIGRlZmluaXRpb24iIG5hdmlnYXRpb24uIERlcml2ZWQKLSAgICogY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGxpbmthYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0xpbmthYmxlQXR0cmlidXRlKFN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIGh5cGVybGluayBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgbm9kZS4gRGVyaXZlZCBjbGFzc2VzIHNob3VsZAotICAgKiBvdmVycmlkZS4KLSAgICogCi0gICAqIEBwYXJhbSBkb2N1bWVudCB0aGUgc291cmNlIGRvY3VtZW50LgotICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB1bmRlciB0aGUgY3Vyc29yLgotICAgKiBAcGFyYW0gcmVnaW9uIHRoZSB0ZXh0IHJlZ2lvbiB0byB1c2UgdG8gY3JlYXRlIHRoZSBoeXBlcmxpbmsuCi0gICAqIEByZXR1cm4gYSBuZXcgSUh5cGVybGluayBmb3IgdGhlIG5vZGUgb3IgbnVsbCBpZiBvbmUgY2Fubm90IGJlIGNyZWF0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoSURvY3VtZW50IGRvY3VtZW50LCBJRE9NTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbik7Ci0KLSAgLyoqCi0gICAqIExvY2F0ZXMgdGhlIGF0dHJpYnV0ZSBub2RlIHVuZGVyIHRoZSBjdXJzb3IuCi0gICAqIAotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3Igb2Zmc2V0LgotICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgbm9kZQotICAgKiBAcmV0dXJuIGFuIElET01Ob2RlIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlIGlmIG9uZSBpcyBmb3VuZCBhdCB0aGUKLSAgICogICAgICAgICBvZmZzZXQgb3IgbnVsbCBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0QXR0cmlidXRlTm9kZShpbnQgb2Zmc2V0LCBJRE9NTm9kZSBwYXJlbnQpCi0gIHsKLSAgICBJRE9NQXR0ciBhdHRyTm9kZSA9IG51bGw7Ci0gICAgTmFtZWROb2RlTWFwIG1hcCA9IHBhcmVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWFwLmdldExlbmd0aCgpOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGF0dHJOb2RlID0gKElET01BdHRyKSBtYXAuaXRlbShpbmRleCk7Ci0gICAgICBib29sZWFuIGxvY2F0ZWQgPSBhdHRyTm9kZS5jb250YWlucyhvZmZzZXQpOwotICAgICAgaWYgKGxvY2F0ZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChhdHRyTm9kZS5oYXNOYW1lT25seSgpKQotICAgICAgICB7Ci0gICAgICAgICAgYXR0ck5vZGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChhdHRyTm9kZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotICAgIHJldHVybiBhdHRyTm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBub2RlIHRoZSBjdXJzb3IgaXMgY3VycmVudGx5IG9uIGluIHRoZSBkb2N1bWVudCBvciBudWxsIGlmIG5vCi0gICAqIG5vZGUgaXMgc2VsZWN0ZWQKLSAgICogCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIGN1cnJlbnQgY3Vyc29yIG9mZnNldC4KLSAgICogQHJldHVybiBJRE9NTm9kZSBlaXRoZXIgZWxlbWVudCwgZG9jdHlwZSwgdGV4dCwgYXR0cmlidXRlIG9yIG51bGwKLSAgICovCi0gIHByaXZhdGUgSURPTU5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KQotICB7Ci0gICAgSW5kZXhlZFJlZ2lvbiBpbm9kZSA9IG51bGw7Ci0gICAgSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0gICAgICBpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0gICAgICBpZiAoaW5vZGUgPT0gbnVsbCkKLSAgICAgICAgaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQgLSAxKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGlmIChzTW9kZWwgIT0gbnVsbCkKLSAgICAgICAgc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgIH0KLQotICAgIGlmIChpbm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIElET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGlub2RlOwotCi0gICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSBnZXRBdHRyaWJ1dGVOb2RlKG9mZnNldCwgbm9kZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHRleHQgcmVnaW9uIGNvcnJlc3BvbmRpbmcgdG8gYW4gSURPTU5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBmb3Igd2hpY2ggd2Ugd2FudCB0aGUgdGV4dCByZWdpb24uIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gYW4gSVJlZ2lvbiBmb3IgdGhlIG5vZGUsIG9yIG51bGwgaWYgdGhlIG5vZGUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oSURPTU5vZGUgbm9kZSkKLSAgewotICAgIGlmIChub2RlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgSVJlZ2lvbiBoeXBlclJlZ2lvbiA9IG51bGw7Ci0gICAgc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0KLSAgICBzd2l0Y2ggKG5vZGVUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiAKLSAgICAgICAgewotICAgICAgICAgIGh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihub2RlLmdldFN0YXJ0T2Zmc2V0KCksIG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IAotICAgICAgICB7Ci0gICAgICAgICAgSURPTUF0dHIgYXR0ID0gKElET01BdHRyKSBub2RlOwotICAKLSAgICAgICAgICBpbnQgcmVnT2Zmc2V0ID0gYXR0LmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLSAgCi0gICAgICAgICAgLy8gSVNTVUU6IFdlIGFyZSB1c2luZyBhIGRlcHJlY2F0ZWQgbWV0aG9kIGhlcmUuIElzIHRoZXJlCi0gICAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGdldCB3aGF0IHdlIG5lZWQ/Ci0gIAotICAgICAgICAgIElUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0LmdldFZhbHVlUmVnaW9uKCk7Ci0gICAgICAgICAgaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IHJlZ0xlbmd0aCA9IHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLSAgICAgICAgICAgIFN0cmluZyBhdHRWYWx1ZSA9IGF0dC5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLSAgCi0gICAgICAgICAgICAvLyBEbyBub3QgaW5jbHVkZSBxdW90ZXMgaW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbiBhbmQgb25seQotICAgICAgICAgICAgLy8gdW5kZXJsaW5lIHRoZSBhY3R1YWwgdmFsdWUsIG5vdCB0aGUgcXVvdGVzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNRdW90ZWQoYXR0VmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWdMZW5ndGggPSByZWdMZW5ndGggLSAyOwotICAgICAgICAgICAgICByZWdPZmZzZXQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihyZWdPZmZzZXQsIHJlZ0xlbmd0aCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAKLSAgICByZXR1cm4gaHlwZXJSZWdpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9JU2VsZWN0aW9uTWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvSVNlbGVjdGlvbk1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFjMGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9JU2VsZWN0aW9uTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNlbGVjdGlvbk1hcHBlcgotewotICBJU2VsZWN0aW9uIG1hcFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGVkT2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0ludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTIxMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0ludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5QcmludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOYXZpZ2F0aW9uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5hdmlnYXRpb25Mb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLkZpbGVTdG9yZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkFkZEZpZWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZURpcmVjdEVkaXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUtleWJvYXJkRHJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlJvb3RDb250ZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkFEVE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLklBRFRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuQURUQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouVHlwZVZpekVkaXRvck1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBbnlFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldE11bHRpcGxpY2l0eUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldFR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5JRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLm5hdmlnYXRpb24uRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLm5hdmlnYXRpb24uTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQuWFNETW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbHMuT3Blbk9uU2VsZWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciBleHRlbmRzIEFEVE11bHRpUGFnZUVkaXRvciBpbXBsZW1lbnRzIElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yLCBJTmF2aWdhdGlvbkxvY2F0aW9uUHJvdmlkZXIKLXsKLSAgLy8gSU1vZGVsIG1vZGVsOwotICBJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbDsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgWFNETW9kZWxBZGFwdGVyIHNjaGVtYU5vZGVBZGFwdGVyOwotICBwcml2YXRlIE91dGxpbmVUcmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgZk91dGxpbmVMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBTb3VyY2VFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciBmU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXI7Ci0gIHByaXZhdGUgWFNEU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkxpc3RlbmVyIGZYU0RTZWxlY3Rpb25MaXN0ZW5lcjsKLSAgcHJpdmF0ZSBJbnRlcm5hbERvY3VtZW50Q2hhbmdlZE5vdGlmaWVyIGludGVybmFsRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIgPSBuZXcgSW50ZXJuYWxEb2N1bWVudENoYW5nZWROb3RpZmllcigpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX0VESVRPUl9NT0RFX0VYVEVOU0lPTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmVkaXRvck1vZGVzIjsgLy8kTk9OLU5MUy1OJCAKLSAgcHJpdmF0ZSBYU0RQcmVmZXJlbmNlU3RvcmVMaXN0ZW5lciB4c2RQcmVmZXJlbmNlU3RvcmVMaXN0ZW5lcjsKLSAgCi0gIGNsYXNzIEludGVybmFsRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm9kZUFkYXB0ZXIgYWRhcHRlcikKLSAgICB7Ci0gICAgICBsaXN0LmFkZChhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm9kZUFkYXB0ZXIgYWRhcHRlcikKLSAgICB7Ci0gICAgICBsaXN0LnJlbW92ZShhZGFwdGVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gICAgewotICAgICAgTGlzdCBjbG9uZSA9IG5ldyBBcnJheUxpc3QobGlzdC5zaXplKCkpOyAgICAgCi0gICAgICBjbG9uZS5hZGRBbGwobGlzdCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjbG9uZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpaS5uZXh0KCk7Ci0gICAgICAgIGFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXRUb0dyYXBoaWNhbFZpZXdlcihJRG9jdW1lbnQgbmV3RG9jdW1lbnQpCi0gIHsKLSAgICBJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gb25seSBzZXQgaW5wdXQgaWYgc3RydWN0dXJlZCBtb2RlbCBhbHJlYWR5IGV4aXN0cwotICAgICAgLy8gKG1lYW5pbmcgc291cmNlIGVkaXRvciBpcyBhbHJlYWR5IG1hbmFnaW5nIHRoZSBtb2RlbCkKLSAgICAgIHN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQobmV3RG9jdW1lbnQpOwotICAgICAgaWYgKChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgJiYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpCi0gICAgICB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9ICgoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBYU0RNb2RlbEFkYXB0ZXIubG9va3VwT3JDcmVhdGVNb2RlbEFkYXB0ZXIoZG9jKTsKLSAgICAgICAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpIC8vIEFzc2VydCBzaG91bGQgbm90IGJlIG51bGwKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlbEFkYXB0ZXIuc2V0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgICB4c2RTY2hlbWEgPSBtb2RlbEFkYXB0ZXIucmVzZXRTY2hlbWEoZG9jKTsKLSAgICAgICAgICAgIG1vZGVsID0gKElNb2RlbCkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RTY2hlbWEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotIAotICBwdWJsaWMgSU1vZGVsIGJ1aWxkTW9kZWwoKQotICB7Ci0gICAgdHJ5Ci0gICAgeyAgICAgIAotICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgIAotICAgICAgLy8gSWYgdGhlIGlucHV0IHNjaGVtYSBpcyBmcm9tIHRoZSBXU0RMIEVkaXRvciwgdGhlbiB1c2UgdGhhdCBpbmxpbmUgc2NoZW1hCi0gICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJQURURWRpdG9ySW5wdXQpCi0gICAgICB7Ci0gICAgICAgIHhzZFNjaGVtYSA9ICgoSUFEVEVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICBtb2RlbCA9IChJTW9kZWwpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkU2NoZW1hKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgSURvY3VtZW50IGRvYyA9IHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgIGlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KQotICAgICAgewotICAgICAgICBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgLy8gVE9ETzogZm9yIFN0b3JhZ2VFZGl0b3JJbnB1dHMsIHNob3VsZCBiZSBmb3JSZWFkCi0gICAgICAgICAgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvYyk7Ci0gICAgICAgICAgaWYgKG1vZGVsID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBBc3NlcnQuaXNOb3ROdWxsKGRvY3VtZW50KTsKLQotICAgICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICAgIAotICAgICAgeHNkU2NoZW1hID0gWFNETW9kZWxBZGFwdGVyLmxvb2t1cE9yQ3JlYXRlU2NoZW1hKGRvY3VtZW50KTsKLSAgICAgIG1vZGVsID0gKElNb2RlbCkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RTY2hlbWEpOyAgICAgICAgICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0KLSAgICB9Ci0gICAgCi0vLyAgICB0cnkKLS8vICAgIHsKLS8vICAgICAgRVBhY2thZ2UuUmVnaXN0cnkgcmVnID0gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0U7Ci0vLyAgICAgIFhTRFBhY2thZ2UgeHNkUGFja2FnZSA9IChYU0RQYWNrYWdlKSByZWcuZ2V0RVBhY2thZ2UoWFNEUGFja2FnZS5lTlNfVVJJKTsKLS8vICAgICAgeHNkU2NoZW1hID0geHNkUGFja2FnZS5nZXRYU0RGYWN0b3J5KCkuY3JlYXRlWFNEU2NoZW1hKCk7Ci0vLyAgICAgIHJlc291cmNlU2V0ID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVSZXNvdXJjZVNldCgpOwotLy8gICAgICBJRmlsZSByZXNvdXJjZUZpbGUgPSBlZGl0b3JJbnB1dC5nZXRGaWxlKCk7Ci0vLyAgICAgIHN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KHJlc291cmNlRmlsZSk7Ci0vLyAgICAgIC8vIElmIHRoZSByZXNvdXJjZSBpcyBpbiB0aGUgd29ya3NwYWNlLi4uLgotLy8gICAgICAvLyBvdGhlcndpc2UgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIG9wZW4gYW4gZXh0ZXJuYWwgZmlsZQotLy8gICAgICBpZiAocmVzb3VyY2VGaWxlICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBTdHJpbmcgcGF0aE5hbWUgPSByZXNvdXJjZUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotLy8gICAgICAgIHhzZFJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocGF0aE5hbWUpLCB0cnVlKTsKLS8vICAgICAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQoeHNkUmVzb3VyY2UpOwotLy8gICAgICAgIE9iamVjdCBvYmogPSB4c2RSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsKLS8vICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpIG9iajsKLS8vICAgICAgICAgIHhzZFNjaGVtYS5zZXRFbGVtZW50KCgoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotLy8gICAgICAgICAgbW9kZWwgPSAoSU1vZGVsKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHhzZFNjaGVtYSk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIAotLy8gICAgICAgIC8vIElmIHRoZSBpbnB1dCBzY2hlbWEgaXMgZnJvbSB0aGUgV1NETCBFZGl0b3IsIHRoZW4gdXNlIHRoYXQgaW5saW5lIHNjaGVtYQotLy8gICAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIFhTREZpbGVFZGl0b3JJbnB1dCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICB4c2RTY2hlbWEgPSAoKFhTREZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldFNjaGVtYSgpOwotLy8gICAgICAgICAgbW9kZWwgPSAoSU1vZGVsKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHhzZFNjaGVtYSk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmICh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpICE9IG51bGwpCi0vLyAgICAgICAgICAKLS8vICAgICAgICAgIC8vIFRPRE8gKGNzKSAuLi4gd2UgbmVlZCB0byBsb29rIGludG8gcGVyZm9ybWFuY2UgaXNzdWVzIHdoZW4gd2UgYWRkIGVsZW1lbnRzCi0vLyAgICAgICAgICAvLyBzZWVtcyB0byBiZSB0aGF0IGZvcm1hdHRpbmcgaXMgY2F1c2lnIGxvdHMgb2Ygbm90aWZpY2F0aW9uIGFuZCB0aGluZ3MgZ2V0IHRlcnJpYmx5IHNsb3cKLS8vICAgICAgICAgIC8vIEknbSBzcGVjaWFsaXppbmcgdGhlIG1ldGhvZCBiZWxvdyB0byBhZGQgYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcgY2hlY2sgdGhhdCBzaG91bGQKLS8vICAgICAgICAgIC8vIGhlbHAgaGVyZSAuLi4gYnV0IHdlIG5lZWQgdG8gaW52ZXN0aWdhdGUgZnVydGhlcgotLy8gICAgICAgICAgbmV3IFhTRE1vZGVsUmVjb25jaWxlQWRhcHRlcih4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmdldE93bmVyRG9jdW1lbnQoKSwgeHNkU2NoZW1hKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVOb3RpZnlDaGFuZ2UoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBOb2RlSW1wbCkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBOb2RlSW1wbCBub2RlSW1wbCA9IChOb2RlSW1wbClub3RpZmllcjsKLS8vICAgICAgICAgICAgICAgIGlmICghbm9kZUltcGwuZ2V0TW9kZWwoKS5pc01vZGVsU3RhdGVDaGFuZ2luZygpKQotLy8gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTm90aWZ5Q2hhbmdlKG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotLy8gICAgICAgICAgICAgICAgICBpbnRlcm5hbERvY3VtZW50Q2hhbmdlZE5vdGlmaWVyLm5vdGlmeUxpc3RlbmVycyhub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLS8vICAgICAgICAgICAgICAgIH0gIAotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfTsKLS8vICAgICAgICB4c2RSZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIGNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkKLS8vICAgIHsKLS8vICAgIH0KLS8vICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0vLyAgICB7Ci0vLyAgICB9Ci0gICAgcmV0dXJuIG1vZGVsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0gICAgWFNETW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgSURPTURvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgSURvY3VtZW50IGlkb2MgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgaWYgKGlkb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGlkb2MpOwotICAgICAgaWYgKChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgJiYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgJiYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9jID0gKChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChkb2MgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbW9kZWxBZGFwdGVyID0gKFhTRE1vZGVsQWRhcHRlcikgZG9jLmdldEV4aXN0aW5nQWRhcHRlcihYU0RNb2RlbEFkYXB0ZXIuY2xhc3MpOwotICAgICAgICAgICAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIobW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpKTsKLSAgICAgICAgICAgICAgICBkb2MucmVtb3ZlQWRhcHRlcihtb2RlbEFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkpOwotICAgICAgICAgICAgICAgIGRvYy5yZW1vdmVBZGFwdGVyKG1vZGVsQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgbW9kZWxBZGFwdGVyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbW9kZWxBZGFwdGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAKLQotCi0gICAgaWYgKGZPdXRsaW5lUGFnZSAhPSBudWxsKQotICAgIHsKLS8vICAgICAgaWYgKGZPdXRsaW5lUGFnZSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSAmJiBmT3V0bGluZUxpc3RlbmVyICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICAoKENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkgZk91dGxpbmVQYWdlKS5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKGZPdXRsaW5lTGlzdGVuZXIpOwotLy8gICAgICB9Ci0gICAgICBpZiAoZk91dGxpbmVMaXN0ZW5lciAhPSBudWxsKQotICAgICAgewotICAgICAgICBmT3V0bGluZVBhZ2UucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZPdXRsaW5lTGlzdGVuZXIpOwotICAgICAgfQotICAgIH0KLSAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZYU0RTZWxlY3Rpb25MaXN0ZW5lcik7Ci0gICAgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHhzZFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyKTsKLSAgICB4c2RQcmVmZXJlbmNlU3RvcmVMaXN0ZW5lciA9IG51bGw7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpCi0gIHsKLSAgICBSb290Q29udGVudEVkaXRQYXJ0IHJvb3QgPSBuZXcgUm9vdENvbnRlbnRFZGl0UGFydCgpOwotICAgIGlmICghKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJQURURWRpdG9ySW5wdXQpKQotICAgIHsKLSAgICAgIHJvb3Quc2V0TW9kZWwobW9kZWwpOwotICAgIH0KLSAgICBncmFwaGljYWxWaWV3ZXIuc2V0Q29udGVudHMocm9vdCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpCi0gIHsKLSAgICBzdXBlci5jb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLSAgICBncmFwaGljYWxWaWV3ZXIuZ2V0S2V5SGFuZGxlcigpLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuRjIsIDApLCBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihHRUZBY3Rpb25Db25zdGFudHMuRElSRUNUX0VESVQpKTsKLSAgICAvLyBnZXQgZWRpdCBwYXJ0IGZhY3RvcnkgZnJvbSBleHRlbnNpb24KLSAgICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5ID0gZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKS5nZXRDdXJyZW50TW9kZSgpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIGdyYXBoaWNhbFZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoZWRpdFBhcnRGYWN0b3J5KTsgICAKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgPT0gb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpCi0gICAgewotICAgICAgWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IG5ldyBYU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSh0aGlzKTsKLSAgICAgIHJldHVybiBwYWdlOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0U2VsZWN0aW9uTWFuYWdlcigpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKHR5cGUgPT0gWFNEU2NoZW1hLmNsYXNzKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gSUtleWJvYXJkRHJhZy5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEtleWJvYXJkRHJhZ0ltcGwoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKQotICAgIHsKLSAgICAgIE9iamVjdCBhZGFwdGVyID0gc3VwZXIuZ2V0QWRhcHRlcih0eXBlKTsKLSAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElDb250ZW50T3V0bGluZVBhZ2UgcGFnZSA9IChJQ29udGVudE91dGxpbmVQYWdlKSBhZGFwdGVyOwotICAgICAgICBmT3V0bGluZUxpc3RlbmVyID0gbmV3IE91dGxpbmVUcmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICAgICAgcGFnZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZk91dGxpbmVMaXN0ZW5lcik7Ci0gICAgICAgIAotLy8gICAgICAgIGlmIChwYWdlIGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICgoQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlKSBwYWdlKS5hZGREb3VibGVDbGlja0xpc3RlbmVyKGZPdXRsaW5lTGlzdGVuZXIpOwotLy8gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhZ2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpCi0gICAgewotICAgIAlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotICAgIAlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgIAl7Ci0gICAgCQlJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLSAgICAJCS8vIFRPRE8gKGNzKSBjdXJyZW50bHkgd2UgYXNzdW1lIHRoZSBzY2hlbWEgZWRpdG9yIHdpbGwgb25seSBldmVyIGVkaXQgYQotICAgIAkJLy8gc2luZ2xlIHNjaGVtYQotICAgIAkJLy8vIGJ1dCBpZiB3ZSB3YW50IHRvIGVuYWJsZSB0aGUgc2NoZW1hIGVkaXRvciB0byBlZGl0IHdzZGwgZmlsZXMgd2UKLSAgICAJCS8vIHNob3VsZCBwYXNzIGluCi0gICAgCQkvLyBhbiBhcnJheSBvZiBzY2hlbWFzCi0gICAgCQkvLyBobW0uLiBwZXJoYXBzIGp1c3QgcGFzcyBpbiBhIFJlc291cmNlU2V0Ci0gICAgCQlYU0RTY2hlbWFbXSBzY2hlbWFzID0ge3hzZFNjaGVtYX07Ci0gICAgCQlyZXR1cm4gbmV3IFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCksIHNjaGVtYXMpOwotICAgIAl9Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKQotICAgIHsKLSAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLSAgICAgICAgLy8gVE9ETyAoY3MpIGN1cnJlbnRseSB3ZSBhc3N1bWUgdGhlIHNjaGVtYSBlZGl0b3Igd2lsbCBvbmx5IGV2ZXIgZWRpdCBhCi0gICAgICAgIC8vIHNpbmdsZSBzY2hlbWEKLSAgICAgICAgLy8vIGJ1dCBpZiB3ZSB3YW50IHRvIGVuYWJsZSB0aGUgc2NoZW1hIGVkaXRvciB0byBlZGl0IHdzZGwgZmlsZXMgd2UKLSAgICAgICAgLy8gc2hvdWxkIHBhc3MgaW4KLSAgICAgICAgLy8gYW4gYXJyYXkgb2Ygc2NoZW1hcwotICAgICAgICAvLyBobW0uLiBwZXJoYXBzIGp1c3QgcGFzcyBpbiBhIFJlc291cmNlU2V0Ci0gICAgICAgIFhTRFNjaGVtYVtdIHNjaGVtYXMgPSB7eHNkU2NoZW1hfTsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSwgc2NoZW1hcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKQotICAgIHsKLSAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLSAgICAgICAgLy8gVE9ETyAoY3MpIGN1cnJlbnRseSB3ZSBhc3N1bWUgdGhlIHNjaGVtYSBlZGl0b3Igd2lsbCBvbmx5IGV2ZXIgZWRpdCBhCi0gICAgICAgIC8vIHNpbmdsZSBzY2hlbWEKLSAgICAgICAgLy8gYnV0IGlmIHdlIHdhbnQgdG8gZW5hYmxlIHRoZSBzY2hlbWEgZWRpdG9yIHRvIGVkaXQgd3NkbCBmaWxlcyB3ZQotICAgICAgICAvLyBzaG91bGQgcGFzcyBpbgotICAgICAgICAvLyBhbiBhcnJheSBvZiBzY2hlbWFzCi0gICAgICAgIC8vIGhtbS4uIHBlcmhhcHMganVzdCBwYXNzIGluIGEgUmVzb3VyY2VTZXQKLSAgICAgICAgWFNEU2NoZW1hW10gc2NoZW1hcyA9IHt4c2RTY2hlbWF9OwotICAgICAgICByZXR1cm4gbmV3IFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcihmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpLCBzY2hlbWFzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBYU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuY2xhc3MpCi0gICAgewotICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgICB7Ci0gICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotICAgICAgICAvLyBUT0RPIChjcykgY3VycmVudGx5IHdlIGFzc3VtZSB0aGUgc2NoZW1hIGVkaXRvciB3aWxsIG9ubHkgZXZlciBlZGl0IGEKLSAgICAgICAgLy8gc2luZ2xlIHNjaGVtYQotICAgICAgICAvLyBidXQgaWYgd2Ugd2FudCB0byBlbmFibGUgdGhlIHNjaGVtYSBlZGl0b3IgdG8gZWRpdCB3c2RsIGZpbGVzIHdlCi0gICAgICAgIC8vIHNob3VsZCBwYXNzIGluCi0gICAgICAgIC8vIGFuIGFycmF5IG9mIHNjaGVtYXMKLSAgICAgICAgLy8gaG1tLi4gcGVyaGFwcyBqdXN0IHBhc3MgaW4gYSBSZXNvdXJjZVNldAotICAgICAgICBYU0RTY2hlbWFbXSBzY2hlbWFzID0ge3hzZFNjaGVtYX07Ci0gICAgICAgIHJldHVybiBuZXcgWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCksIHNjaGVtYXMpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IFhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIuY2xhc3MpCi0gICAgewotICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgICB7Ci0gICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotICAgICAgICBYU0RTY2hlbWFbXSBzY2hlbWFzID0ge3hzZFNjaGVtYX07Ci0gICAgICAgIHJldHVybiBuZXcgWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlcihmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpLCBzY2hlbWFzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBJVGV4dEVkaXRvci5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IElTZWxlY3Rpb25NYXBwZXIuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBYU0RTZWxlY3Rpb25NYXBwZXIoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBJRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIGludGVybmFsRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXI7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAodHlwZSA9PSBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmNsYXNzKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcigpOwotICAgIH0gIAotICAgIHJldHVybiBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDb250cmlidXRvcklkKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFhTRFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBvcGVuT25HbG9iYWxSZWZlcmVuY2UuIFRoZSBjb21wIGFyZ3VtZW50IGlzIGEgcmVzb2x2ZWQgeHNkIHNjaGVtYQotICAgKiBvYmplY3QgZnJvbSBhbm90aGVyIGZpbGUuIFRoaXMgaXMgY3JlYXRlZCBhbmQgY2FsbGVkIGZyb20gYW5vdGhlciBzY2hlbWEKLSAgICogbW9kZWwgdG8gYWxsb3cgRjMgbmF2aWdhdGlvbiB0byBvcGVuIGEgbmV3IGVkaXRvciBhbmQgY2hvb3NlIHRoZSByZWZlcmVuY2VkCi0gICAqIG9iamVjdCB3aXRoaW4gdGhhdCBlZGl0b3IgY29udGV4dAotICAgKiAKLSAgICogQHBhcmFtIGNvbXAKLSAgICovCi0gIHB1YmxpYyB2b2lkIG9wZW5Pbkdsb2JhbFJlZmVyZW5jZShYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSBvcGVuT25TZWxlY3Rpb25IZWxwZXIub3Blbk9uR2xvYmFsUmVmZXJlbmNlKGNvbXApOwotICAgIAotICAgIGlmIChuYW1lZENvbXBvbmVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVkQ29tcG9uZW50ID0gZ2V0WFNEU2NoZW1hKCk7Ci0gICAgfQotICAgIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQobmFtZWRDb21wb25lbnQpOwotICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOwotICAgIElBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICB9Ci0KLSAgfQotICAKLSAgcHJvdGVjdGVkIE9wZW5PblNlbGVjdGlvbkhlbHBlciBvcGVuT25TZWxlY3Rpb25IZWxwZXI7Ci0KLSAgcHVibGljIE9wZW5PblNlbGVjdGlvbkhlbHBlciBnZXRPcGVuT25TZWxlY3Rpb25IZWxwZXIoKQotICB7Ci0gICAgcmV0dXJuIG9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIHRoZSBwYWdlcyBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVQYWdlcygpOwotICAgIAotLy8gICAgc2VsZWN0aW9uUHJvdmlkZXIgPSBnZXRTZWxlY3Rpb25NYW5hZ2VyKCk7Ci0vLyAgICBnZXRFZGl0b3JTaXRlKCkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotLy8gICAgCi0vLyAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotLy8gICAgbW9kZWwgPSBidWlsZE1vZGVsKChJRmlsZUVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKTsKLS8vICAgIGNyZWF0ZUdyYXBoUGFnZSgpOwotLy8gICAgY3JlYXRlU291cmNlUGFnZSgpOwotCi0gICAgb3Blbk9uU2VsZWN0aW9uSGVscGVyID0gbmV3IE9wZW5PblNlbGVjdGlvbkhlbHBlcihnZXRUZXh0RWRpdG9yKCksIGdldFhTRFNjaGVtYSgpKTsKLQotICAgIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotICAgIGZTb3VyY2VFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTb3VyY2VFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcigpOwotICAgIGlmIChwcm92aWRlciBpbnN0YW5jZW9mIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpCi0gICAgewotICAgICAgKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBwcm92aWRlcikuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZTb3VyY2VFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcik7Ci0gICAgfQotICAgIGZYU0RTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBYU0RTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uTGlzdGVuZXIoKTsKLSAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZYU0RTZWxlY3Rpb25MaXN0ZW5lcik7Ci0gICAgCi0gICAgLy8gU2VsZWN0IHRoZSBzY2hlbWEgdG8gc2hvdyB0aGUgcHJvcGVydGllcwotICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0TW9kZWwoKSkpOwotICAgIAotICAgIHhzZFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyID0gbmV3IFhTRFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyKCk7Ci0gICAgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHhzZFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBYU0RQcmVmZXJlbmNlU3RvcmVMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2dCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJvcGVydHkgPSBldnQuZ2V0UHJvcGVydHkoKTsKLSAgICAgIGlmIChYU0RFZGl0b3JQbHVnaW4uQ09OU1RfU0hPV19FWFRFUk5BTFMuZXF1YWxzKHByb3BlcnR5KSkKLSAgICAgIHsKLSAgICAgICAgKChHcmFwaGljYWxFZGl0UGFydCkgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRlbnRzKCkpLmdldEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0gICAgICAgIGdyYXBoaWNhbFZpZXdlci5nZXRDb250ZW50cygpLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgcmV0dXJuICEoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0IHx8IGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZVN0b3JlRWRpdG9ySW5wdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLSAgICAKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgCi0gICAgLy8gYWRkIGFuIGlzUmVhZE9ubHkgbWV0aG9kIHRvIHRoZSBlZGl0b3JQYXJ0IGluc3RlYWQKLSAgICBpZiAoIWlzUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgQmFzZVNlbGVjdGlvbkFjdGlvbiBhY3Rpb24gPSBuZXcgQWRkRmllbGRBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICBhY3Rpb24gPSBuZXcgRGVsZXRlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNERWxlbWVudEFjdGlvbih0aGlzLCBBZGRYU0RFbGVtZW50QWN0aW9uLklELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTEVNRU5ULCBmYWxzZSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNERWxlbWVudC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RFbGVtZW50QWN0aW9uKHRoaXMsIEFkZFhTREVsZW1lbnRBY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTEVNRU5UX0JFRk9SRSwgZmFsc2UpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREVsZW1lbnQuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7ICAgICAgIAotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RFbGVtZW50QWN0aW9uKHRoaXMsIEFkZFhTREVsZW1lbnRBY3Rpb24uQUZURVJfU0VMRUNURURfSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VMRU1FTlRfQUZURVIsIGZhbHNlKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RFbGVtZW50LmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOyAgICAgIAotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RFbGVtZW50QWN0aW9uKHRoaXMsIEFkZFhTREVsZW1lbnRBY3Rpb24uUkVGX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTEVNRU5UX1JFRiwgdHJ1ZSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNERWxlbWVudFJlZi5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwQWN0aW9uKHRoaXMsIFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCwgQWRkWFNETW9kZWxHcm91cEFjdGlvbi5TRVFVRU5DRV9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEU2VxdWVuY2UuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNETW9kZWxHcm91cEFjdGlvbih0aGlzLCBYU0RDb21wb3NpdG9yLkNIT0lDRV9MSVRFUkFMLCBBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLkNIT0lDRV9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQ2hvaWNlLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIAotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwQWN0aW9uKHRoaXMsIFhTRENvbXBvc2l0b3IuQUxMX0xJVEVSQUwsIEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQUxMX0lEKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBbGwuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24odGhpcywgZmFsc2UpOwotICAgIGFjdGlvbi5zZXRJZChBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5NT0RFTEdST1VQREVGSU5JVElPTl9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNER3JvdXAuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24odGhpcywgdHJ1ZSk7Ci0gICAgYWN0aW9uLnNldElkKEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uLk1PREVMR1JPVVBERUZJTklUSU9OUkVGX0lEKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFhTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL29iajE2L1hTREdyb3VwUmVmLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RDb21wbGV4VHlwZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREF0dHJpYnV0ZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbih0aGlzLCBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5CRUZPUkVfU0VMRUNURURfSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9CRUZPUkUsIGZhbHNlKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uKHRoaXMsIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfQUZURVIsIGZhbHNlKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uKHRoaXMsIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLlJFRl9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRiwgdHJ1ZSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQXR0cmlidXRlUmVmLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IE9wZW5Jbk5ld0VkaXRvcih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbih0aGlzKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBdHRyaWJ1dGVHcm91cC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24odGhpcywgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLlJFRl9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBbnlFbGVtZW50QWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREFueS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREFueUF0dHJpYnV0ZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uKHRoaXMsIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5JTkNMVURFX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9JTkNMVURFKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RJbmNsdWRlLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbih0aGlzLCBBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uSU1QT1JUX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9JTVBPUlQpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREltcG9ydC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24odGhpcywgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uLlJFREVGSU5FX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9SRURFRklORSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEUmVkZWZpbmUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgU2V0VHlwZUFjdGlvbiBzZXROZXdDb21wbGV4VHlwZUFjdGlvbiA9IG5ldyBTZXRUeXBlQWN0aW9uKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXLCBTZXRUeXBlQWN0aW9uLlNFVF9ORVdfVFlQRV9JRCwgdGhpcyk7Ci0gICAgc2V0TmV3Q29tcGxleFR5cGVBY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihzZXROZXdDb21wbGV4VHlwZUFjdGlvbik7Ci0gICAgICAgIAotICAgIFNldFR5cGVBY3Rpb24gc2V0RXhpc3RpbmdUeXBlQWN0aW9uID0gbmV3IFNldFR5cGVBY3Rpb24oTWVzc2FnZXMuX1VJX0FDVElPTl9CUk9XU0UsIFNldFR5cGVBY3Rpb24uU0VMRUNUX0VYSVNUSU5HX1RZUEVfSUQsIHRoaXMpOwotICAgIHNldEV4aXN0aW5nVHlwZUFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHNldEV4aXN0aW5nVHlwZUFjdGlvbik7Ci0KLSAgICBhZGRNdWx0aXBsaWNpdHlNZW51KHJlZ2lzdHJ5KTsKLSAgICAKLSAgICBQcmludEFjdGlvbiBwcmludEFjdGlvbiA9IG5ldyBQcmludEFjdGlvbih0aGlzKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihwcmludEFjdGlvbik7Ci0gICAgCi0gICAgQmFzZURpcmVjdEVkaXRBY3Rpb24gZGlyZWN0RWRpdEFjdGlvbiA9IG5ldyBCYXNlRGlyZWN0RWRpdEFjdGlvbih0aGlzKTsKLSAgICBkaXJlY3RFZGl0QWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oZGlyZWN0RWRpdEFjdGlvbik7Ci0gICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBCYXNlU2VsZWN0aW9uQWN0aW9uIGFjdGlvbiA9IG5ldyBPcGVuSW5OZXdFZGl0b3IodGhpcyk7Ci0gICAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICAgIGFjdGlvbiA9IG5ldyBTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24odGhpcyk7Ci0gICAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgICAgCi0gICAgICBQcmludEFjdGlvbiBwcmludEFjdGlvbiA9IG5ldyBQcmludEFjdGlvbih0aGlzKTsKLSAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHByaW50QWN0aW9uKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZE11bHRpcGxpY2l0eU1lbnUoQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgICBTZXRNdWx0aXBsaWNpdHlBY3Rpb24gb25lTXVsdGlwbGljaXR5ID0gbmV3IFNldE11bHRpcGxpY2l0eUFjdGlvbih0aGlzLCAiMS4uMSAoIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9SRVFVSVJFRCArICIpIiwgU2V0TXVsdGlwbGljaXR5QWN0aW9uLlJFUVVJUkVEX0lEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgb25lTXVsdGlwbGljaXR5LnNldE1heE9jY3VycygxKTsKLSAgICBvbmVNdWx0aXBsaWNpdHkuc2V0TWluT2NjdXJzKDEpOwotICAgIG9uZU11bHRpcGxpY2l0eS5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKG9uZU11bHRpcGxpY2l0eSk7Ci0KLSAgICBTZXRNdWx0aXBsaWNpdHlBY3Rpb24gemVyb09yTW9yZU11bHRpcGxpY2l0eSA9IG5ldyBTZXRNdWx0aXBsaWNpdHlBY3Rpb24odGhpcywgIjAuLiogKCIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfWkVST19PUl9NT1JFICsgIikiLCBTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9NT1JFX0lEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgemVyb09yTW9yZU11bHRpcGxpY2l0eS5zZXRNYXhPY2N1cnMoLTEpOwotICAgIHplcm9Pck1vcmVNdWx0aXBsaWNpdHkuc2V0TWluT2NjdXJzKDApOwotICAgIHplcm9Pck1vcmVNdWx0aXBsaWNpdHkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbih6ZXJvT3JNb3JlTXVsdGlwbGljaXR5KTsKLSAgICAKLSAgICBTZXRNdWx0aXBsaWNpdHlBY3Rpb24gemVyb09yT25lTXVsdGlwbGljaXR5ID0gbmV3IFNldE11bHRpcGxpY2l0eUFjdGlvbih0aGlzLCAiMC4uMSAoIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9PUFRJT05BTCArICIpIiwgU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfT05FX0lEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgemVyb09yT25lTXVsdGlwbGljaXR5LnNldE1heE9jY3VycygxKTsKLSAgICB6ZXJvT3JPbmVNdWx0aXBsaWNpdHkuc2V0TWluT2NjdXJzKDApOwotICAgIHplcm9Pck9uZU11bHRpcGxpY2l0eS5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHplcm9Pck9uZU11bHRpcGxpY2l0eSk7Ci0KLSAgICBTZXRNdWx0aXBsaWNpdHlBY3Rpb24gb25lT3JNb3JlTXVsdGlwbGljaXR5ID0gbmV3IFNldE11bHRpcGxpY2l0eUFjdGlvbih0aGlzLCAiMS4uKiAoIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9PTkVfT1JfTU9SRSArICIpIiwgU2V0TXVsdGlwbGljaXR5QWN0aW9uLk9ORV9PUl9NT1JFX0lEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgb25lT3JNb3JlTXVsdGlwbGljaXR5LnNldE1heE9jY3VycygtMSk7Ci0gICAgb25lT3JNb3JlTXVsdGlwbGljaXR5LnNldE1pbk9jY3VycygxKTsKLSAgICBvbmVPck1vcmVNdWx0aXBsaWNpdHkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihvbmVPck1vcmVNdWx0aXBsaWNpdHkpOwotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIExpc3RlbmVyIG9uIFNTRSdzIG91dGxpbmUgcGFnZSdzIHNlbGVjdGlvbnMgdGhhdCBjb252ZXJ0cyBET00gc2VsZWN0aW9ucwotICAgKiBpbnRvIHhzZCBzZWxlY3Rpb25zIGFuZCBub3RpZmllcyBYU0Qgc2VsZWN0aW9uIG1hbmFnZXIKLSAgICovCi0gIGNsYXNzIE91dGxpbmVUcmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJRG91YmxlQ2xpY2tMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIE91dGxpbmVUcmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTZWxlY3Rpb24gZ2V0WFNEU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gc2VsID0gbnVsbDsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICBPYmplY3QgbyA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvKTsKLSAgICAgICAgfQotICAgICAgICAgIAotICAgICAgfQotICAgICAgcmV0dXJuIHNlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIERPTSBub2RlIGJhc2VkIG9uIG9iamVjdCAoeHNkIG5vZGUpCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBnZXRPYmplY3RGb3JPdGhlck1vZGVsKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICBub2RlID0gKE5vZGUpIG9iamVjdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9ICgoWFNEQ29tcG9uZW50KSBvYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9ICgoQ2F0ZWdvcnlBZGFwdGVyKSBvYmplY3QpLmdldFhTRFNjaGVtYSgpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBpZiAoKChYU0RCYXNlQWRhcHRlcikgb2JqZWN0KS5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpIG9iamVjdCkuZ2V0VGFyZ2V0KCkpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gdGhlIHRleHQgZWRpdG9yIGNhbiBvbmx5IGFjY2VwdCBzZWQgbm9kZXMhCi0gICAgICAvLwotICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBTZWxlY3Rpb24gaW4gb3V0bGluZSB0cmVlIGNoYW5nZWQgc28gc2V0IG91dGxpbmUgdHJlZSdzIHNlbGVjdGlvbiBpbnRvCi0gICAgICAgKiBlZGl0b3IncyBzZWxlY3Rpb24gYW5kIHNheSBpdCBjYW1lIGZyb20gb3V0bGluZSB0cmVlCi0gICAgICAgKi8KLSAgICAgIGlmIChnZXRTZWxlY3Rpb25NYW5hZ2VyKCkgIT0gbnVsbCAmJiBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuZ2V0RW5hYmxlTm90aWZ5KCkpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0WFNEU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZPdXRsaW5lUGFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldFRleHRFZGl0b3IoKSAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IHN0YXJ0ID0gLTE7Ci0gICAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgICAgT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICAgICAgICBvID0gZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChvKTsKLSAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0gICAgICAgICAgICBsZW5ndGggPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldEVuZE9mZnNldCgpIC0gc3RhcnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzdGFydCA+IC0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdldFRleHRFZGl0b3IoKS5zZWxlY3RBbmRSZXZlYWwoc3RhcnQsIGxlbmd0aCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFNlbGVjdGlvbiBpbiBvdXRsaW5lIHRyZWUgY2hhbmdlZCBzbyBzZXQgb3V0bGluZSB0cmVlJ3Mgc2VsZWN0aW9uIGludG8KLSAgICAgICAqIGVkaXRvcidzIHNlbGVjdGlvbiBhbmQgc2F5IGl0IGNhbWUgZnJvbSBvdXRsaW5lIHRyZWUKLSAgICAgICAqLwotICAgICAgaWYgKGdldFNlbGVjdGlvbk1hbmFnZXIoKSAhPSBudWxsICYmIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRFbmFibGVOb3RpZnkoKSkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRYU0RTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZk91dGxpbmVQYWdlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAKLSAgLyoqCi0gICAqIExpc3RlbmVyIG9uIFNTRSdzIHNvdXJjZSBlZGl0b3IncyBzZWxlY3Rpb25zIHRoYXQgY29udmVydHMgRE9NIHNlbGVjdGlvbnMKLSAgICogaW50byB4c2Qgc2VsZWN0aW9ucyBhbmQgbm90aWZpZXMgWFNEIHNlbGVjdGlvbiBtYW5hZ2VyCi0gICAqLwotICBwcml2YXRlIGNsYXNzIFNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBYU0Qgbm9kZSBiYXNlZCBvbiBvYmplY3QgKERPTSBub2RlKQotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0WFNETm9kZShPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIC8vIGdldCB0aGUgZWxlbWVudCBub2RlCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudCA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZWw7IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgT2JqZWN0IG8gPSBlbGVtZW50OwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gZ2V0WFNEU2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsKLSAgICAgICAgaWYgKG1vZGVsT2JqZWN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBvID0gbW9kZWxPYmplY3Q7Ci0gICAgICAgICAgbyA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKE5vdGlmaWVyKSBtb2RlbE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBvOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIGlmIChnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuZ2V0RW5hYmxlTm90aWZ5KCkgJiYgZ2V0QWN0aXZlUGFnZSgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIExpc3QgeHNkU2VsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgZG9tTm9kZSA9IGkubmV4dCgpOwotICAgICAgICAgICAgT2JqZWN0IHhzZE5vZGUgPSBnZXRYU0ROb2RlKGRvbU5vZGUpOwotICAgICAgICAgICAgaWYgKHhzZE5vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNkU2VsZWN0aW9ucy5hZGQoeHNkTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgheHNkU2VsZWN0aW9ucy5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiB4c2RTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih4c2RTZWxlY3Rpb25zKTsKLSAgICAgICAgICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24oeHNkU2VsZWN0aW9uLCBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBMaXN0ZW5lciBvbiBYU0QncyBzZWxlY3Rpb24gbWFuYWdlcidzIHNlbGVjdGlvbnMgdGhhdCBjb252ZXJ0cyBYU0QKLSAgICogc2VsZWN0aW9ucyBpbnRvIERPTSBzZWxlY3Rpb25zIGFuZCBub3RpZmllcyBTU0UncyBzZWxlY3Rpb24gcHJvdmlkZXIKLSAgICovCi0gIHByaXZhdGUgY2xhc3MgWFNEU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBET00gbm9kZSBiYXNlZCBvbiBvYmplY3QgKHhzZCBub2RlKQotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IG51bGw7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSAoKFhTRENvbXBvbmVudCkgb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSAoKENhdGVnb3J5QWRhcHRlcikgb2JqZWN0KS5nZXRYU0RTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNEQmFzZUFkYXB0ZXIpIG9iamVjdCkuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIG5vZGUgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSAoKFhTREJhc2VBZGFwdGVyKSBvYmplY3QpLmdldFRhcmdldCgpKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgLy8gVGhpcyBjYXNlIHdhcyBhZGRlZCB0byBtYWtlIHRoZSBGMy9oeXBlcmxpbmsgbmF2aWdhdGlvbiB3b3JrIHdoZW4gYW4KLSAgICAgICAgLy8gaW5saW5lIHNjaGVtYSBmcm9tIGEgV1NETCBkb2N1bWVudCBpcyBvcGVuZWQgaW4gdGhlIHNjaGVtYSBlZGl0b3IuCi0gICAgICAgIC8vIFRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgYSBVUkkgZnJhZ21lbnQgdXNlZCB0byBpZGVudGlmeSBhbiBYU0QKLSAgICAgICAgLy8gY29tcG9uZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSBlbmNsb3NpbmcgV1NETCByZXNvdXJjZS4KLQotICAgICAgICBTdHJpbmcgdXJpRnJhZ21lbnQgPSAoU3RyaW5nKSBvYmplY3Q7Ci0gICAgICAgIFJlc291cmNlIHJlc291cmNlID0geHNkU2NoZW1hLmVSZXNvdXJjZSgpOwotICAgICAgICBFT2JqZWN0IG1vZGVsT2JqZWN0ID0gcmVzb3VyY2UuZ2V0RU9iamVjdCh1cmlGcmFnbWVudCk7Ci0KLSAgICAgICAgaWYgKG1vZGVsT2JqZWN0ICE9IG51bGwgJiYgbW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RDb21wb25lbnQgY29tcG9uZW50ID0gKFhTRENvbXBvbmVudCkgbW9kZWxPYmplY3Q7Ci0gICAgICAgICAgbm9kZSA9IGNvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gdGhlIHRleHQgZWRpdG9yIGNhbiBvbmx5IGFjY2VwdCBzZWQgbm9kZXMhCi0gICAgICAvLwotICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0JCS8vIGRvIG5vdCBmaXJlIHNlbGVjdGlvbiBpbiBzb3VyY2UgZWRpdG9yIGlmIHRoZSBjdXJyZW50IGFjdGl2ZSBwYWdlIGlzIHRoZSBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciAoc291cmNlKQotCQkvLyBXZSBvbmx5IHdhbnQgdG8gbWFrZSBzb3VyY2Ugc2VsZWN0aW9ucyBpZiB0aGUgYWN0aXZlIHBhZ2UgaXMgZWl0aGVyIHRoZSBvdXRsaW5lIG9yIHByb3BlcnRpZXMgKGEgbW9kaWZ5Ci0JCS8vIGhhcyBiZWVuIGRvbmUgdmlhIHRoZSBvdXRsaW5lIG9yIHByb3BlcnRpZXMgYW5kIG5vdCB0aGUgc291cmNlIHZpZXcpLiAgV2UgZG9uJ3Qgd2FudCB0byBiZSBzZWxlY3RpbmcKLQkJLy8gYW5kIHVuc2VsZWN0aW5nIHRoaW5ncyBpbiB0aGUgc291cmNlIHdoZW4gZWRpdGluZyBpbiB0aGUgc291cmNlISEKLSAgICAJYm9vbGVhbiBtYWtlU2VsZWN0aW9uID0gdHJ1ZTsKLQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlLmdldEFjdGl2ZVBhcnQoKSBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSB7Ci0JCQkJaWYgKGdldEFjdGl2ZUVkaXRvcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRFZGl0b3IpIHsKLQkJCQkJbWFrZVNlbGVjdGlvbiA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotICAgIAkKLSAgICAgIC8vIGRvIG5vdCBmaXJlIHNlbGVjdGlvbiBpbiBzb3VyY2UgZWRpdG9yIGlmIHNlbGVjdGlvbiBldmVudCBjYW1lCi0gICAgICAvLyBmcm9tIHNvdXJjZSBlZGl0b3IKLSAgICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSAhPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSAmJiBtYWtlU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IG90aGVyTW9kZWxPYmplY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtb2RlbE9iamVjdCA9IGkubmV4dCgpOwotICAgICAgICAgICAgT2JqZWN0IG90aGVyTW9kZWxPYmplY3QgPSBnZXRPYmplY3RGb3JPdGhlck1vZGVsKG1vZGVsT2JqZWN0KTsKLSAgICAgICAgICAgIGlmIChvdGhlck1vZGVsT2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG90aGVyTW9kZWxPYmplY3RMaXN0LmFkZChvdGhlck1vZGVsT2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFvdGhlck1vZGVsT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gaGVyZSdzIGFuIHVnbHkgaGFjay4uLiBpZiB3ZSBhbGxvdyB0ZXh0IHNlbGVjdGlvbnMgdG8gZmlyZSBkdXJpbmcKLSAgICAgICAgICAgIC8vIFNldElucHV0VG9HcmFwaFZpZXcgYWN0aW9uIHdlIHNjcmV3IHVwIHRoZSBuYXZpZ2F0aW9uIGhpc3RvcnkhCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIAotICAgICAgICAgICAgLy9UT0RPIChjcykgLi4uIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgc291cmNlIGVkaXRvciBmcm9tIG1lc3NpbmcgdXAgdGhlIG5hdmlnYXRpb24gaGlzdG9yeQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGlmIChnZXRBY3RpdmVQYWdlKCkgPT0gU09VUkNFX1BBR0VfSU5ERVgpCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBub2RlU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3RoZXJNb2RlbE9iamVjdExpc3QpOwotICAgICAgICAgICAgICBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obm9kZVNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9TZXRTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gaVNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGlmIChpU2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24paVNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIE9iamVjdCBvdGhlck1vZGVsT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChmaXJzdEVsZW1lbnQpOwotICAgICAgICBpZiAob3RoZXJNb2RlbE9iamVjdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBub2RlU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3RoZXJNb2RlbE9iamVjdCk7Ci0gICAgICAgICAgZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKG5vZGVTZWxlY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBCdWcgMTQ1NTkwLiAgV29ya2Fyb3VuZCB0byB1cGRhdGUgc291cmNlIHBvc2l0aW9uIHdoZW4gZmxpcHBpbmcgdG8gdGhlIHNvdXJjZSBwYWdlLgotICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIHdpbGwgc3RpbGwgYWRkIGFuIGVudHJ5IHRvIHRoZSBuYXZpZ2F0aW9uIGhpc3RvcnksIGJ1dCB0aGlzCi0gIC8vIGJlaGF2aW91ciBpcyBhbiBpbXByb3ZlbWVudCB0aGFuIHdpdGhvdXQgdGhpcyBjaGFuZ2UKLSAgYm9vbGVhbiBkb1VwZGF0ZVNvdXJjZUxvY2F0aW9uID0gZmFsc2U7Ci0gIHByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkKLSAgewotICAgIHN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLSAgICBkb1VwZGF0ZVNvdXJjZUxvY2F0aW9uID0gbmV3UGFnZUluZGV4ID09IFNPVVJDRV9QQUdFX0lOREVYOwotICAgIGlmIChkb1VwZGF0ZVNvdXJjZUxvY2F0aW9uICYmIGZYU0RTZWxlY3Rpb25MaXN0ZW5lciAhPSBudWxsKQotICAgICAgZlhTRFNlbGVjdGlvbkxpc3RlbmVyLmRvU2V0U2VsZWN0aW9uKCk7Ci0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpCi0gIHsKLSAgICBzd2l0Y2ggKHByb3BJZCkKLSAgICB7Ci0gICAgICAvLyB3aGVuIHJlZmFjdG9yIHJlbmFtZSB3aGlsZSBmaWxlIGlzIG9wZW4gaW4gZWRpdG9yLCBuZWVkIHRvIHJlc2V0Ci0gICAgICAvLyBlZGl0b3IgY29udGVudHMgdG8gcmVmbGVjdCBuZXcgZG9jdW1lbnQKLSAgICAgIGNhc2UgSUVkaXRvclBhcnQuUFJPUF9JTlBVVDoKLSAgICAgIHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBzdHJ1Y3R1cmVkVGV4dEVkaXRvciAmJiB4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBEb2N1bWVudCBzY2hlbWFEb2N1bWVudCA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgICBEb2N1bWVudCBkb21Nb2RlbERvY3VtZW50ID0gKChJRE9NTW9kZWwpc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgICAvLyBpZiBkb20gZG9jdW1lbnRzIGFyZSBub3QgdGhlIHNhbWUsIHRoZXkgbmVlZCB0byBiZSByZXNldAotICAgICAgICAgICAgICBpZiAoc2NoZW1hRG9jdW1lbnQgIT0gZG9tTW9kZWxEb2N1bWVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhTRE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChzY2hlbWFEb2N1bWVudCBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBzYXZlIHRoaXMgbW9kZWwgYWRhcHRlciBmb3IgY2xlYW51cCBsYXRlcgotICAgICAgICAgICAgICAgICAgbW9kZWxBZGFwdGVyID0gKFhTRE1vZGVsQWRhcHRlcikgKChJRE9NRG9jdW1lbnQpc2NoZW1hRG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihYU0RNb2RlbEFkYXB0ZXIuY2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbXVsdGlwYWdlIGVkaXRvciB3aXRoIG5ldyBlZGl0b3IgaW5wdXQKLSAgICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICAgIHNldElucHV0KGVkaXRvcklucHV0KTsKLSAgICAgICAgICAgICAgICBzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLm1hcmtTYXZlTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3cgZG8gdGhlIGNsZWFuIHVwIG1vZGVsIGFkYXB0ZXIKLSAgICAgICAgICAgICAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbW9kZWxBZGFwdGVyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICBtb2RlbEFkYXB0ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgICBzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5wcm9wZXJ0eUNoYW5nZWQoc291cmNlLCBwcm9wSWQpOwotICB9Ci0KLSAgcHVibGljIElOYXZpZ2F0aW9uTG9jYXRpb24gY3JlYXRlRW1wdHlOYXZpZ2F0aW9uTG9jYXRpb24oKQotICB7Ci0gICAgaWYgKGdldEFjdGl2ZVBhZ2UoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbih0aGlzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbihnZXRUZXh0RWRpdG9yKCksIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSU5hdmlnYXRpb25Mb2NhdGlvbiBjcmVhdGVOYXZpZ2F0aW9uTG9jYXRpb24oKQotICB7Ci0gICAgaWYgKGdldEFjdGl2ZVBhZ2UoKSA9PSBERVNJR05fUEFHRV9JTkRFWCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUm9vdEVkaXRQYXJ0IHJvb3RFZGl0UGFydCA9IGdyYXBoaWNhbFZpZXdlci5nZXRSb290RWRpdFBhcnQoKTsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSByb290RWRpdFBhcnQuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUm9vdENvbnRlbnRFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdENvbnRlbnRFZGl0UGFydCA9IChSb290Q29udGVudEVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICAgIE9iamVjdCBpbnB1dCA9IHJvb3RDb250ZW50RWRpdFBhcnQuZ2V0SW5wdXQoKTsgICAgICAKLSAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSgoQWRhcHRlcilpbnB1dCkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKW9iamVjdDsKLSAgICAgICAgICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldE5hdmlnYXRpb25Mb2NhdGlvbih0aGlzLCBjb25jcmV0ZUNvbXBvbmVudCwgcm9vdENvbnRlbnRFZGl0UGFydCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbih0aGlzLCBjb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbihnZXRUZXh0RWRpdG9yKCksIHRydWUpOwotICAgIH0KLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIGVkaXRvck1vZGVDaGFuZ2VkKEVkaXRvck1vZGUgbmV3RWRpdG9yTW9kZSkKLSAgewotICAgIC8vaWYgKGlzSW5pdGlhbGl6aW5nKQotICAgIC8vICByZXR1cm47Ci0gICAgCi0gICAgRWRpdFBhcnRGYWN0b3J5IGVkaXRQYXJ0RmFjdG9yeSA9IG5ld0VkaXRvck1vZGUuZ2V0RWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgaWYgKGVkaXRQYXJ0RmFjdG9yeSAhPSBudWxsKQotICAgIHsgIAotICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShlZGl0UGFydEZhY3RvcnkpOwotICAgICAgaWYgKGdyYXBoaWNhbFZpZXdlciBpbnN0YW5jZW9mIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpCi0gICAgICB7ICAKLSAgICAgICAgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcilncmFwaGljYWxWaWV3ZXI7ICAKLSAgICAgICAgSUFEVE9iamVjdCBpbnB1dCA9IHZpZXdlci5nZXRJbnB1dCgpOwotICAgICAgICB2aWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICAgIC8vdmlld2VyLmdldFJvb3RFZGl0UGFydCgpLnJlZnJlc2goKTsKLSAgICAgICAvLyB2aWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkuZ2V0Q29udGVudHMoKS5yZWZyZXNoKCk7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIAotICAgICAgICBmbG9hdGluZ1Rvb2xiYXIuc2V0RWRpdFBhcnRGYWN0b3J5KGVkaXRQYXJ0RmFjdG9yeSk7Ci0gICAgICAgIGZsb2F0aW5nVG9vbGJhci5zZXRNb2RlbChnZXRNb2RlbCgpKTsKLSAgICAgICAgZmxvYXRpbmdUb29sYmFyLnJlZnJlc2goIShpbnB1dCBpbnN0YW5jZW9mIElNb2RlbCkpOwotICAgICAgICAKLSAgICAgICAgQ29udHJvbCBjb250cm9sID0gZ3JhcGhpY2FsVmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21wb3NpdGUpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb3NpdGUgcGFyZW50ID0gKChDb21wb3NpdGUpY29udHJvbCkuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgcGFyZW50LmxheW91dCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ld0VkaXRvck1vZGUuZ2V0T3V0bGluZVByb3ZpZGVyKCk7Ci0gICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgewotICAgICAgQURUQ29udGVudE91dGxpbmVQYWdlIG91dGxpbmUgPSAoQURUQ29udGVudE91dGxpbmVQYWdlKWdldENvbnRlbnRPdXRsaW5lUGFnZSgpOwotICAgICAgaWYgKG91dGxpbmUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgVHJlZVZpZXdlciB0cmVlVmlld2VyID0gb3V0bGluZS5nZXRUcmVlVmlld2VyKCk7Ci0gICAgICAgIGlmICh0cmVlVmlld2VyICE9IG51bGwpCi0gICAgICAgIHsgICAgICAKLSAgICAgICAgICBvdXRsaW5lLmdldFRyZWVWaWV3ZXIoKS5zZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgIG91dGxpbmUuZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfSAgCi0gIH0gIAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRURJVE9SX01PREVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5kZWZhdWx0RWRpdG9yTW9kZUlkIjsgLy8kTk9OLU5MUy0xJAotICAvL3ByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemluZyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgRWRpdG9yTW9kZU1hbmFnZXIgY3JlYXRlRWRpdG9yTW9kZU1hbmFnZXIoKQotICB7Ci0gICAgZmluYWwgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpZ2V0QWRhcHRlcihQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICBFZGl0b3JNb2RlTWFuYWdlciBtYW5hZ2VyID0gbmV3IEVkaXRvck1vZGVNYW5hZ2VyKFhTRF9FRElUT1JfTU9ERV9FWFRFTlNJT05fSUQpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgaW5pdCgpCi0gICAgICB7Ci0gICAgICAgIGlmIChwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID09IG51bGwgfHwgCi0gICAgICAgICAgICBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmlzRWRpdG9yTW9kZUFwcGxpY2FibGUoVHlwZVZpekVkaXRvck1vZGUuSUQpKQotICAgICAgICB7ICAKLSAgICAgICAgICBhZGRNb2RlKG5ldyBUeXBlVml6RWRpdG9yTW9kZSgpKTsKLSAgICAgICAgfSAgCi0gICAgICAgIHN1cGVyLmluaXQoKTsgICAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAgIAotICAgICAgCi0gICAgICBwcm90ZWN0ZWQgRWRpdG9yTW9kZSBnZXREZWZhdWx0TW9kZSgpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBkZWZhdWx0TW9kZUlkID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhERUZBVUxUX0VESVRPUl9NT0RFX0lEKTsKLSAgICAgICAgaWYgKGRlZmF1bHRNb2RlSWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEVkaXRvck1vZGUgZWRpdG9yTW9kZSA9IGdldEVkaXRvck1vZGUoZGVmYXVsdE1vZGVJZCk7Ci0gICAgICAgICAgaWYgKGVkaXRvck1vZGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZWRpdG9yTW9kZTsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgICAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdE1vZGUoKTsKLSAgICAgIH0KLSAgICB9OwotICAgIG1hbmFnZXIuc2V0UHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcihwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKTsKLSAgICByZXR1cm4gbWFuYWdlcjsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc3RvcmVDdXJyZW50TW9kZVByZWZlcmVuY2UoU3RyaW5nIGlkKQotICB7Ci0gICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKERFRkFVTFRfRURJVE9SX01PREVfSUQsIGlkKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICB7Ci0gICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cygoKFhTRFNjaGVtYSlnZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcykpKTsKLSAgICBzdXBlci5kb1NhdmUobW9uaXRvcik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZUFzKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkKLSAgewotICAgIC8vIFdoZW4gcGVyZm9ybWluZyBhIHNhdmUgYXMsIHRoZSBkb2N1bWVudCBjaGFuZ2VzLiAgIE91ciBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgc2hvdWxkIGxpc3RlbgotICAgIC8vIHRvIHRoZSBuZXcgZG9jdW1lbnQuCi0gICAgCi0gICAgLy8gRmlyc3QgZ2V0IHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gICAgSURvY3VtZW50IGN1cnJlbnREb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0gICAgWFNETW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgSURPTURvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgaWYgKGN1cnJlbnREb2N1bWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChjdXJyZW50RG9jdW1lbnQpOwotICAgICAgaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgYXNzb2NpYXRlZCBJRE9NRG9jdW1lbnQgbW9kZWwKLSAgICAgICAgICAgIGRvYyA9ICgoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICAvLyBhbmQgbm93IGdldCBvdXIgYWRhcHRlciB0aGF0IGxpc3RlbnMgdG8gRE9NIGNoYW5nZXMKLSAgICAgICAgICAgIGlmIChkb2MgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbW9kZWxBZGFwdGVyID0gKFhTRE1vZGVsQWRhcHRlcikgZG9jLmdldEV4aXN0aW5nQWRhcHRlcihYU0RNb2RlbEFkYXB0ZXIuY2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAvLyBwZXJmb3JtIHNhdmUgYXMKLSAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5kb1NhdmVBcygpOwotICAgIC8vIGlmIHNhdmVBcyBjYW5jZWxsZWQgdGhlbiBkb24ndCBzZXRJbnB1dCBiZWNhdXNlIHRoZSBpbnB1dCBoYXNuJ3QgY2hhbmdlCi0gICAgLy8gU2VlIEFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvcidzIHBlcmZvcm1TYXZlQXMKLSAgICBpZiAoZWRpdG9ySW5wdXQgIT0gc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkKLSAgICB7Ci0gICAgICBzZXRJbnB1dChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgIHNldFBhcnROYW1lKHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkuZ2V0TmFtZSgpKTsKLSAgICAKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLm1hcmtTYXZlTG9jYXRpb24oKTsKLSAgIAotICAgICAgLy8gTm93IGRvIHRoZSBjbGVhbiB1cCBvbiB0aGUgb2xkIGRvY3VtZW50Ci0gICAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIGNsZWFyIG91dCBtb2RlbCBhZGFwdGVyCi0gICAgICAgIG1vZGVsQWRhcHRlci5jbGVhcigpOwotICAgICAgICBtb2RlbEFkYXB0ZXIgPSBudWxsOwotICAgICAgfQotICAgIH0KLSAgfQotCi19ICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvS2V5Ym9hcmREcmFnSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0tleWJvYXJkRHJhZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmYzhlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvS2V5Ym9hcmREcmFnSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLklLZXlib2FyZERyYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQmFzZURyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLlhTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLlhTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlhTREJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIEtleWJvYXJkRHJhZ0ltcGwgaW1wbGVtZW50cyBJS2V5Ym9hcmREcmFnCi17Ci0gIHB1YmxpYyB2b2lkIHBlcmZvcm1LZXlib2FyZERyYWcoR3JhcGhpY2FsRWRpdFBhcnQgbW92aW5nRWxlbWVudCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kgcG9saWN5ID0gKEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kpIG1vdmluZ0VsZW1lbnQuZ2V0RWRpdFBvbGljeShLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LktFWSk7Ci0KLSAgICBFZGl0UGFydCByaWdodEVsZW1lbnQgPSBwb2xpY3kuZ2V0UmVsYXRpdmVFZGl0UGFydChtb3ZpbmdFbGVtZW50LCBkaXJlY3Rpb24pOwotICAgIHBvbGljeSA9IChLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5KSByaWdodEVsZW1lbnQuZ2V0RWRpdFBvbGljeShLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LktFWSk7Ci0gICAgRWRpdFBhcnQgbGVmdEVsZW1lbnQgPSAocG9saWN5ICE9IG51bGwpID8gcG9saWN5LmdldFJlbGF0aXZlRWRpdFBhcnQocmlnaHRFbGVtZW50LCBkaXJlY3Rpb24pIDogbnVsbDsKLQotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBleHRlbmRlcnMKLSAgICBpZiAoIShtb3ZpbmdFbGVtZW50IGluc3RhbmNlb2YgWFNEQmFzZUZpZWxkRWRpdFBhcnQpKSByZXR1cm47Ci0gICAgCi0gICAgWFNEQmFzZUZpZWxkRWRpdFBhcnQgbW92aW5nRmllbGQgPSAoWFNEQmFzZUZpZWxkRWRpdFBhcnQpIG1vdmluZ0VsZW1lbnQ7Ci0gICAgWFNEQmFzZUZpZWxkRWRpdFBhcnQgbGVmdEZpZWxkID0gKFhTREJhc2VGaWVsZEVkaXRQYXJ0KSBsZWZ0RWxlbWVudDsKLSAgICBYU0RCYXNlRmllbGRFZGl0UGFydCByaWdodEZpZWxkID0gKFhTREJhc2VGaWVsZEVkaXRQYXJ0KSByaWdodEVsZW1lbnQ7Ci0gICAgCi0gICAgT2JqZWN0IG1vdmluZ09iamVjdCA9IG1vdmluZ0ZpZWxkLmdldE1vZGVsKCk7Ci0gICAgCi0gICAgQmFzZURyYWdBbmREcm9wQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBpZiAobW92aW5nT2JqZWN0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciB8fCBtb3ZpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IFhTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQobW92aW5nRmllbGQsIGxlZnRGaWVsZCwgcmlnaHRGaWVsZCwgZGlyZWN0aW9uKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW92aW5nT2JqZWN0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kKG1vdmluZ0ZpZWxkLCBsZWZ0RmllbGQsIHJpZ2h0RmllbGQsIGRpcmVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIGlmIChjb21tYW5kICE9IG51bGwgJiYgY29tbWFuZC5jYW5FeGVjdXRlKCkpCi0gICAgewotICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAvLyBUaGlzIGlzIHRvIHJlc2VsZWN0IHRoZSBtb3ZlZCBpdGVtCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIGlmIChlZGl0b3IgIT0gbnVsbCAmJiBlZGl0b3IuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoSVNlbGVjdGlvblByb3ZpZGVyKSBlZGl0b3IuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb3ZpbmdFbGVtZW50LmdldE1vZGVsKCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTI3NDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzk0ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciwgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsLCBidWcgMTE0NzAzMwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0gIHN0YXRpYyAKLSAgewotICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLm1lc3NhZ2VzIiwgTWVzc2FnZXMuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgTWVzc2FnZXMoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQkFTRV9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9ERVJJVkVEX0JZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9JTkhFUklUX0ZST007Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0lOSEVSSVRfQlk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RPQ1VNRU5UQVRJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0FQUF9JTkZPOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TRVRfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTkFNRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfS0lORDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTUlOT0NDVVJTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9NQVhPQ0NVUlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX05PX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1BBR0VfSEVBRElOR19SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1JFQURfT05MWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQ09NUE9ORU5UUzsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfVFlQRVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9FTEVNRU5UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX0FUVFJJQlVURVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9BVFRSSUJVVEVfR1JPVVBTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfTk9UQVRJT05TOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfSURFTlRJVFlfQ09OU1RSQUlOVFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9BTk5PVEFUSU9OUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX0RJUkVDVElWRVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9HUk9VUFM7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9fTE9DQVRJT05fU1BFQ0lGSUVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTk9fVFlQRV9ERUZJTkVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1VQREFURV9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQUJTRU5UOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9GSUVMRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9TRVRfTVVMVElQTElDSVRZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfT1BUSU9OQUw7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9aRVJPX09SX01PUkU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9PTkVfT1JfTU9SRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JFUVVJUkVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVJSQVk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0VUX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9MT0NBTF9UWVBFOwotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX1VOS05PV05fT0JKRUNUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfWFNEU0NIRU1BOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfWFNEU0NIRU1BX05PX05BTUVTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFVF9DT01NT05fQlVJTFRfSU5fVFlQRVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TRUxFQ1RfVFlQRVNfRklMVEVSX09VVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05FV19UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVkFMVUVfTkVXX1RZUEU7ICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTVBMRVhfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NJTVBMRV9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkVXX0VMRU1FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ORVdfQVRUUklCVVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9YU0RfRURJVE9SOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU09VUkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTEVNRU5UOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTEVNRU5UX0JFRk9SRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRUxFTUVOVF9BRlRFUjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRUxFTUVOVF9SRUY7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fTkVXOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0JST1dTRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX0FUVFJJQlVURV9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UQVJHRVRfTkFNRVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9fTkFNRVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9DT01QTEVYX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRV9TRUFSQ0hfRklMVEVSX1RFWFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5UU19DT0xPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJJQlVURVNfQ09MT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSSUJVVEVTX1BST0NFU1NDT05URU5UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJJQlVURVNfTkFNRVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VUX0VMRU1FTlRfUkVGRVJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VUX0FUVFJJQlVURV9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UWVBFU19DT0xPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFVF9UWVBFOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX0lOREVOVF9MQUJFTDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RFWFRfSU5ERU5UX1NQQUNFU19MQUJFTDsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX1hTRF9OQU1FU1BBQ0VfUFJFRklYOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9YU0RfREVGQVVMVF9QUkVGSVg7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9RVUFMSUZZX1hTRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RFWFRfWFNEX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1ZBTElEQVRJTkdfRklMRVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GVUxMX0NPTkZPUk1BTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlM7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfTEFCRUxfSU5WQUxJRF9QUkVGSVg7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0lOQ0xVREU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0lNUE9SVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfUkVERUZJTkU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0JFRk9SRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0FGVEVSOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfUkVGOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5URk9STURFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSSUJVVEVGT1JNREVGQVVMVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NSRUFURV9BTk9OX1RZUEU7ICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSzsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX0VOQUJMRV9BVVRPX0lNUE9SVF9DTEVBTlVQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9FTkFCTEVfQVVUT19PUEVOX1NDSEVNQV9ESUFMT0c7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NWVkMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTDsKLQotCi0vKioKLSAqIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGZvciBtdWx0aSBwYWdlIGVkaXRvcidzIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yLgotICoKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3JYTUwgewotCi0JcHJpdmF0ZSBJQWN0aW9uQmFycyBmQmFyczsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbGxzOgotCSAqIDx1bD4KLQkgKiAgPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb01lbnU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIG1lbnUgbWFuYWdlcjwvbGk+Ci0JICogIDxsaT48Y29kZT5jb250cmlidXRlVG9Ub29sQmFyPC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JyB0b29sIGJhcgotCSAqICAgIG1hbmFnZXI8L2xpPgotCSAqICA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvU3RhdHVzTGluZTwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgc3RhdHVzIGxpbmUKLQkgKiAgICBtYW5hZ2VyPC9saT4KLQkgKiA8L3VsPgotCSAqIFRoZSBnaXZlbiBhY3Rpb24gYmFycyBhcmUgYWxzbyByZW1lbWJlcmVkIGFuZCBtYWRlIGFjY2Vzc2libGUgdmlhIAotCSAqIDxjb2RlPmdldEFjdGlvbkJhcnM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBiYXJzIHRoZSBhY3Rpb24gYmFycwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycykgewotCQlmQmFycyA9IGJhcnM7Ci0JCWNvbnRyaWJ1dGVUb01lbnUoYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJY29udHJpYnV0ZVRvVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCQljb250cmlidXRlVG9TdGF0dXNMaW5lKGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGNvbnRyaWJ1dG9yJ3MgYWN0aW9uIGJhcnMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBhY3Rpb24gYmFycwotCSAqLwotCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgewotCQlyZXR1cm4gZkJhcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFjNjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBlZGl0aW5nIFhTRCBjb250ZW50IHR5cGUKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCB7Ci0JcHJvdGVjdGVkIE1hcCBnZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJTWFwIHRhcmdldHMgPSBzdXBlci5nZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoc291cmNlVmlld2VyKTsKLQkJdGFyZ2V0cy5wdXQoIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiLCBudWxsKTsgIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHRhcmdldHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Y2FiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdBdHRyaWJ1dGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyIGV4dGVuZHMgWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGltcGxlbWVudHMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsKLSAgcHVibGljIFhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0QnJvd3NlRGlhbG9nKCkKLSAgewotICAgIFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSBkaWFsb2dEZWxlZ2F0ZSA9IAotICAgICAgbmV3IFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZShYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUuQVRUUklCVVRFX01FVEFfTkFNRSwgY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIHJldHVybiBkaWFsb2dEZWxlZ2F0ZTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldE5ld0RpYWxvZygpCi0gIHsKLSAgICBpZiAoc2NoZW1hcy5sZW5ndGggPiAwKSB7Ci0gICAgICByZXR1cm4gbmV3IE5ld0F0dHJpYnV0ZURpYWxvZyhzY2hlbWFzWzBdKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gbmV3IE5ld0F0dHJpYnV0ZURpYWxvZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVmZXJlbmNlZENvbXBvbmVudCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGNvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKXJlZmVyZW5jaW5nT2JqZWN0OwotICAgICAgaWYgKGFkYXB0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pYWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgfQotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgICAgaWYgKHJlZmVyZW5jZWRDb21wb25lbnQuaXNOZXcoKSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjID0gbnVsbDsKLSAgICAgICAgICBpZiAocmVmZXJlbmNlZENvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgYXR0cmlidXRlRGVjID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChhdHRyaWJ1dGVEZWMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFLCBjb25jcmV0ZUNvbXBvbmVudCwgYXR0cmlidXRlRGVjKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgfSAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldFF1YWxpZmllcigpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldEZpbGUoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyYWE3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldEJhc2VUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlciBleHRlbmRzIFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcgotewotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRRdWlja1BpY2tzKCkKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRRdWlja1BpY2tzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldEJyb3dzZURpYWxvZygpCi0gIHsKLSAgICBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUgZGlhbG9nRGVsZWdhdGUgPSBuZXcgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5UWVBFX01FVEFfTkFNRSwgY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIHJldHVybiBkaWFsb2dEZWxlZ2F0ZTsKLSAgfQotCi0gIC8vIFRPRE8gY29tbW9uIHRoaXMgdXAKLSAgcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IG51bGw7Ci0gICAgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICB7Ci0gICAgICBBZGFwdGVyIGFkcGF0ZXIgPSAoQWRhcHRlcilyZWZlcmVuY2luZ09iamVjdDsKLSAgICAgIGlmIChhZHBhdGVyLmdldFRhcmdldCgpIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KWFkcGF0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIHJlZmVyZW5jaW5nT2JqZWN0OwotICAgIH0KLSAgICAKLSAgICBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgeyAgCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFLCBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXROYW1lVG9BZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgdGQgPSBjb21tYW5kLmdldENyZWF0ZWRDb21wbGV4VHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIHRkID0gY29tbWFuZC5nZXRDcmVhdGVkU2ltcGxlVHlwZSgpOwotICAgICAgICB9ICAKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0QmFzZVR5cGVDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCB0ZCk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UKLSAgICAgIHsgIAotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0QmFzZVR5cGVBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXRRdWFsaWZpZXIoKSwgY29tcG9uZW50LmdldEZpbGUoKSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfQkFTRV9UWVBFKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgeyAgCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuU0lNUExFX1RZUEVfTUVUQV9OQU1FKQotICAgICAgICB7ICAKLSAgICAgICAgICBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICBjb21tYW5kLnNldE5hbWVUb0FkZChjb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICB0ZCA9IGNvbW1hbmQuZ2V0Q3JlYXRlZFNpbXBsZVR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRCYXNlVHlwZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIHRkKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRCYXNlVHlwZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldFF1YWxpZmllcigpLCBjb21wb25lbnQuZ2V0RmlsZSgpKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNTSGVscElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNTSGVscElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWZkZmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JDU0hlbHBJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogCi0gKiBDb250ZXh0IFNlbnNpdGl2ZSBIZWxwIElEcwotICoKLSAqLwotcHVibGljIGNsYXNzIFhTREVkaXRvckNTSGVscElkcwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1dJWkFSRF9QQUdFID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDAxMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1RPS0VOX0NPTlRFTlRTID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDAyMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX0pVU1RfT05DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAwMzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9aRVJPX09SX01PUkUgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDQwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfT05FX09SX01PUkUgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDUwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfT1BUSU9OQUwgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDYwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfUkVQRUFUX1JBRElPID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDA3MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1JBTkdFX1JBRElPID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDA4MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1JFUEVBVF9GSUVMRCA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAwOTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9SQU5HRV9NSU5JTVVNX0ZJRUxEID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDEwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1JBTkdFX01BWElNVU1fRklFTEQgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMTEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfQUREX0JVVFRPTiA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAxMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9DVVJSRU5UX1ZBTFVFID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDEzMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9URVNUX1BBR0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMjAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfU0FNUExFX1RFWFQgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMjEwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9ORVdfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAzMDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUVfVVBEQVRFX1JFRkVSRU5DRVMgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMzEwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV1RZUEVfQ09NUExFWFRZUEUgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXVFlQRV9TSU1QTEVUWVBFID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDAyMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV1RZUEVfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAwMzAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVFlQRV9OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA1MCI7IC8vIHRoZXNlIDMgYXJlIGluIGNvbW1vbi51aQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUWVBFX1RZUEVTID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA2MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRZUEVfU0VBUkNIU0NPUEVTID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA3MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRU5VTUVSQVRJT05TX19OT19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDA5MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FTlVNRVJBVElPTlNfX0RFTElNSVRFUl9DSEFSUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxMDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRU5VTUVSQVRJT05TX19QUkVTRVJWRV9MRUFEX0FORF9UUkFJTF9XSElURVNQQUNFUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxMTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fRVhURU5TSU9OX0NBVEVHT1JJRVMgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMTMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fQVZBSUxBQkxFX0NPTVBPTkVOVFNfVE9fQUREID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDE0MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0FERCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxNTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRVhURU5TSU9OU19DT01QT05FTlRTX19ERUxFVEUgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMTYwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fRURJVCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxNzAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0NBVEVHT1JZX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDE5MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9DQVRFR09SWV9fU0NIRU1BID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDIwMCI7IC8vIGNhbid0IGludm9rZSBoZWxwLCB0aGlzIGlzIGEgQ0xhYmVsLCBub3QgdGV4dCBGaWVsZAotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NBVEFMT0dfRU5UUklFU19fRU5UUklFU19UUkVFTElTVCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAyMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0FUQUxPR19FTlRSSUVTX19ERVRBSUxTID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDIzMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fUVVBTElGWV9YTUxTQ0hFTUFfTEFOR1VBR0VfQ09OU1RSVUNUUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZjAwMTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fWE1MX1NDSEVNQV9MQU5HVUFHRV9DT05TVFJVQ1RTX1BSRUZJWCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZjAwMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fREVGQVVMVF9UQVJHRVROQU1FU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdWYwMDMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX0hPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZjAwNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fSU1QT1JUX0NMRUFOVVAgPSBQTFVHSU5fTkFNRSArICIueHNkdWYwMDUwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UQVRJT05fVEFCX19OT19MQUJFTCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwMTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19UQUJfX0VYVEVOU0lPTlMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19UQUJfX0FERCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1RBQl9fREVMRVRFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDA1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVEFCX19FWFRFTlNJT05TX0RFVEFJTFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDYwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUUkFJTlRTX1RBQl9fTUlOSU1VTV9MRU5HVEggPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19NQVhJTVVNX0xFTkdUSCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwOTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJBSU5UU19UQUJfX0NPTExBUFNFX1dISVRFU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19FTlVNRVJBVElPTlMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19QQVRURVJOUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJBSU5UU19UQUJfX05PX0xBQkVMID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDEzMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fU0NIRU1BX19QUkVGSVggPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMjAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX1NDSEVNQV9fVEFSR0VUTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDIxMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19TQ0hFTUFfX0FEVkFOQ0VEID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDIyMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyMzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fVFlQRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fUkVGRVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19FTEVNRU5UX19NSU5fT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE4MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19FTEVNRU5UX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI2MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19DT01QTEVYX1RZUEVfX0lOSEVSSVRfRlJPTSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyNzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19JTkhFUklUX0JZID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI4MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fU0lNUExFX1RZUEVfX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMjkwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX1NJTVBMRV9UWVBFX19WQVJJRVRZID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19TSU1QTEVfVFlQRV9fQkFTRV9UWVBFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMxMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQVRUUklCVVRFX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMyMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVfX1RZUEUgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMzMwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVHUk9VUF9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNDAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX01PREVMR1JPVVBfREVGSU5JVElPTl9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0lOQ0xVREVfUkVERUZJTkVfX1NDSEVNQUxPQ0FUSU9OID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDM2MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fSU1QT1JUX19TQ0hFTUFMT0NBVElPTiA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fSU1QT1JUX19OQU1FU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMzgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0lNUE9SVF9fUFJFRklYID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDM5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZRUxFTUVOVF9fTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDQwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BTllFTEVNRU5UX19QUk9DRVNTQ09OVEVOVFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01JTl9PQ0NVUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01BWF9PQ0NVUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTkwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BTllBVFRSSUJVVEVfX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDA0MDAiOyAgLy8gdGhlc2UgNCBhcmUgbm90IHVzZWQsIHNhbWUgYXMgYW55ZWxlbWVudCBhYm92ZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZQVRUUklCVVRFX19QUk9DRVNTQ09OVEVOVFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUFUVFJJQlVURV9fTUlOX09DQ1VSRU5DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxODAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZQVRUUklCVVRFX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fS0lORCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDA0MjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fTUlOX09DQ1VSRU5DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxODAiOyAvL2Nhbid0IGludm9rZSBoZWxwCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19NT0RFTEdST1VQX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7IC8vIGNhbid0IGludm9rZSBoZWxwCi0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9SRUZTX19SRUYgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDMwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVHUk9VUF9SRUZTX19SRUYgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDQwIjsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllNTgwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuSVhTRFRvb2xiYXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklFeHRlbmRlZEZpZ3VyZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JDb25maWd1cmF0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVESVRPUkNPTkZJR1VSQVRJT05FWFRFTlNJT05JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLlhTREVkaXRvckV4dGVuc2lvbkNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMRURJVE9SQ09ORklHVVJBVElPTl9FWFRFTlNJT05JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSRkFDVE9SWSA9ICJhZGFwdGVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUkFDVElPTiA9ICJ0b29sYmFyQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUdVUkVGQUNUT1JZID0gImZpZ3VyZUZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRQQVJURkFDVE9SWSA9ICJlZGl0UGFydEZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLSAgTGlzdCBkZWZpbmVkRXh0ZW5zaW9uc0xpc3QgPSBudWxsOwotCi0gIHB1YmxpYyBYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkKLSAgewotCi0gIH0KLQotICBwdWJsaWMgWFNEQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGdldEZpZ3VyZUZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEZpZ3VyZUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRUb29sYmFyQWN0aW9ucygpCi0gIHsKLSAgICBpZiAoZGVmaW5lZEV4dGVuc2lvbnNMaXN0ID09IG51bGwpCi0gICAgewotICAgICAgcmVhZFhTRENvbmZpZ3VyYXRpb25SZWdpc3RyeSgpOwotICAgIH0KLSAgICBpZiAoIWRlZmluZWRFeHRlbnNpb25zTGlzdC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmV0dXJuICgoWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcykgZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmdldCgwKSkuZ2V0QWN0aW9uTGlzdCgpOwotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHByb3RlY3RlZCBPYmplY3QgbG9hZENsYXNzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgY2xhc3NTdHJpbmcpCi0gIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLmxvYWRDbGFzcyhjbGFzc1N0cmluZyk7Ci0gICAgICBPYmplY3QgaW5zdGFuY2UgPSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotCi0gICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWFkWFNEQ29uZmlndXJhdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIGRlZmluZWRFeHRlbnNpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB1cGRhdGVMaXN0KElOVEVSTkFMRURJVE9SQ09ORklHVVJBVElPTl9FWFRFTlNJT05JRCk7Ci0gICAgdXBkYXRlTGlzdChYU0RFRElUT1JDT05GSUdVUkFUSU9ORVhURU5TSU9OSUQpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdXBkYXRlTGlzdChTdHJpbmcgSUQpCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB4c2RFZGl0b3JFeHRlbnNpb25MaXN0ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoSUQpOwotICAgIGJvb2xlYW4gZGVmaW5lZEV4dGVuc2lvbnNFeGlzdCA9ICh4c2RFZGl0b3JFeHRlbnNpb25MaXN0ICE9IG51bGwgJiYgeHNkRWRpdG9yRXh0ZW5zaW9uTGlzdC5sZW5ndGggPiAwKTsKLSAgICAKLSAgICBpZiAoZGVmaW5lZEV4dGVuc2lvbnNFeGlzdCkKLSAgICB7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeHNkRWRpdG9yRXh0ZW5zaW9uTGlzdC5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMoKTsKLSAgICAgICAgZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmFkZChwcm9wZXJ0aWVzKTsKLSAgCi0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0geHNkRWRpdG9yRXh0ZW5zaW9uTGlzdFtpXTsKLSAgICAgICAgU3RyaW5nIGFkYXB0ZXJGYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBREFQVEVSRkFDVE9SWSk7Ci0gICAgICAgIGlmIChhZGFwdGVyRmFjdG9yeUNsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGVsZW1lbnQsIGFkYXB0ZXJGYWN0b3J5Q2xhc3MpOwotICAgICAgICAgIFhTREFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQWRhcHRlckZhY3RvcnkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRhcHRlckZhY3RvcnkgPSAoWFNEQWRhcHRlckZhY3RvcnkpIG9iamVjdDsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAKLSAgICAgICAgU3RyaW5nIGZpZ3VyZUZhY3RvcnlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEZJR1VSRUZBQ1RPUlkpOwotICAgICAgICBpZiAoZmlndXJlRmFjdG9yeUNsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGVsZW1lbnQsIGZpZ3VyZUZhY3RvcnlDbGFzcyk7Ci0gICAgICAgICAgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBmaWd1cmVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaWd1cmVGYWN0b3J5ID0gKElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkpIG9iamVjdDsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0RmlndXJlRmFjdG9yeUxpc3QoZmlndXJlRmFjdG9yeSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gIAotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0b29sYmFyQWN0aW9ucyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVE9PTEJBUkFDVElPTik7Ci0gICAgICAgIExpc3QgYWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKHRvb2xiYXJBY3Rpb25zICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRvb2xiYXJBY3Rpb25zLmxlbmd0aDsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBhY3Rpb25FbGVtZW50ID0gdG9vbGJhckFjdGlvbnNbal07Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uQ2xhc3MgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShDTEFTU05BTUUpOwotICAgICAgICAgICAgSVhTRFRvb2xiYXJBY3Rpb24gYWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChhY3Rpb25DbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGFjdGlvbkVsZW1lbnQsIGFjdGlvbkNsYXNzKTsKLSAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElYU0RUb29sYmFyQWN0aW9uKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uID0gKElYU0RUb29sYmFyQWN0aW9uKSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm9wZXJ0aWVzLnNldEFjdGlvbkxpc3QoYWN0aW9uTGlzdCk7Ci0gIAotICAgICAgICBTdHJpbmcgZWRpdFBhcnRGYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShFRElUUEFSVEZBQ1RPUlkpOwotICAgICAgICBpZiAoZWRpdFBhcnRGYWN0b3J5Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBsb2FkQ2xhc3MoZWxlbWVudCwgZWRpdFBhcnRGYWN0b3J5Q2xhc3MpOwotICAgICAgICAgIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkgPSBudWxsOwotICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydEZhY3RvcnkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdFBhcnRGYWN0b3J5ID0gKEVkaXRQYXJ0RmFjdG9yeSkgb2JqZWN0OwotICAgICAgICAgICAgcHJvcGVydGllcy5zZXRFZGl0UGFydEZhY3RvcnlMaXN0KGVkaXRQYXJ0RmFjdG9yeSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4ZjcwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQ29udGV4dCBoZWxwIGlkIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBYU0RFZGl0b3JDb250ZXh0SWRzIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsIjsKLQotICAvKiBDT05URVhUX0lEcyBOZXcgWFNEIFdpemFyZCB1c2VzIHRoZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGZyb20gb3JnLmVjbGlwc2UudWkuZGlhbG9ncyAqLwotIAotICAvKiBDT05URVhUX0lEcyBmb3IgWFNERWRpdG9yIGZvbGxvdyB0aGUgeHNkZXh4eCBjb250ZXh0IElEcyAqLwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTAwMTAgZm9yIFhTRCBFZGl0b3IgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfREVTSUdOX1ZJRVcgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDAxMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIEZpbGUgTmFtZSBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDAyMCBmb3IgVmVyc2lvbiBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfVkVSU0lPTiAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDAyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwMzAgZm9yIExhbmd1YWdlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9MQU5HVUFHRSAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDA0MCBmb3IgTmFtZXNwYWNlIEdyb3VwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX05BTUVTUEFDRV9HUk9VUCAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwNDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDUwIGZvciBQcmVmaXggVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX1BSRUZJWCAgICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwNTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDYwIGZvciBUYXJnZXQgbmFtZXNwYWNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9UQVJHRVRfTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDYwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDA3MCBmb3IgQXBwbHkgUHVzaCBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfQVBQTFkgICAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA3MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwODAgZm9yIEF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX0FUVFJJQlVURSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwODAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDkwIGZvciBFbGVtZW50IGZvcm0gZGVmYXVsdCBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfRUxFTUVOVCAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA5MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAxMDAgZm9yIEJsb2NrIGRlZmF1bHQgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX0JMT0NLICAgICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAxMDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMTEwIGZvciBGaW5hbCBEZWZhdWx0IENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9GSU5BTCAgICAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMTEwIjsKLQotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDIwMCBmb3IgQW5ub3RhdGlvbnMgQ29tbWVudCBHcm91cCAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIERvY3VtZW50YXRpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBBcHAgSW5mbyBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOTk9UQVRJT05fQ09NTUVOVF9HUk9VUCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDIwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAyMTAgZm9yIEFubm90YXRpb25zIENvbW1lbnQgR3JvdXAgLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBEb2N1bWVudGF0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gQXBwIEluZm8gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTk5PVEFUSU9OX0NPTU1FTlQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAyMTAiOwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDMwMCBmb3IgRG9jdW1lbnRhdGlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0RPQ1VNRU5UQVRJT05fREVTSUdOX1ZJRVcgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDMwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAzMTAgZm9yIFNvdXJjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9ET0NVTUVOVEFUSU9OX1NPVVJDRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAzMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMzIwIGZvciBMYW5ndWFnZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAzMjAiOwotICAvKiBDT05URVhUX0lEIENvbW1lbnQgR3JvdXAgaXMgZnJvbSBBbm5vdGF0aW9ucyBXaW5kb3cgeHNkZTAyMDAgKi8KLSAgLyogQ09OVEVYVF9JRCBDb21tZW50IE11bHRpLWxpbmUgRWRpdCBpcyBmcm9tIEFubm90YXRpb25zIFdpbmRvdyB4c2QwMjEwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDQwMCBmb3IgQXBwIEluZm8gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BUFBfSU5GT19ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA0MTAgZm9yIEFwcCBJbmZvIFNvdXJjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BUFBfSU5GT19TT1VSQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTA0MTAiOwotICAvKiBDT05URVhUX0lEIENvbW1lbnQgR3JvdXAgaXMgZnJvbSBBbm5vdGF0aW9ucyBXaW5kb3cgeHNkZTAyMDAgKi8KLSAgLyogQ09OVEVYVF9JRCBDb21tZW50IE11bHRpLWxpbmUgRWRpdCBpcyBmcm9tIEFubm90YXRpb25zIFdpbmRvdyB4c2QwMjEwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDUwMCBmb3IgQ29tcGxleCBUeXBlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDUwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1MTAgZm9yIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9OQU1FICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDUxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1MjAgZm9yIEFic3RyYWN0IENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0NPTVBMRVhfQUJTVFJBQ1QgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA1MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNTMwIGZvciBNaXhlZCBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9DT01QTEVYX01JWEVEICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNTMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDU0MCBmb3IgQmxvY2sgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9CTE9DSyAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDU0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1NTAgZm9yIEZpbmFsIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0NPTVBMRVhfRklOQUwgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA1NTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTA2MDAgZm9yIFNpbXBsZSBUeXBlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0lNUExFX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNjAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDYxMCBmb3IgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TSU1QTEVfTkFNRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA2MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgZm9yIEdsb2JhbCBFbGVtZW50IGFuZCBFbGVtZW50IERlc2lnbiBWaWV3cyBhcmUgdGhlIHNhbWUgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDcwMCBmb3IgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzEwIGZvciBFbGVtZW50IE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9OQU1FICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MTAiOwotICAvKiBDT05URVhUX0lEIFR5cGUgSW5mb3JtYXRpb24gR3JvdXAgaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkwMCAqLwotICAvKiBDT05URVhUX0lEIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTIwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTMwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIGNvbXBsZXggdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk0MCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDcyMCBmb3IgQWJzdHJhY3QgQ2hlY2sgQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9BQlNUUkFDVCAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzMwIGZvciBOaWxsYWJsZSBDaGVjayBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX05JTExBQkxFICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDczMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3NDAgZm9yIFZhbHVlIEdyb3VwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9WQUxVRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzUwIGZvciBGaXhlZCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0ZJWEVEICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3NjAgZm9yIERlZmF1bHQgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9ERUZBVUxUICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3NjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzcwIGZvciBWYWx1ZSBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfVkFMVUVfR1JPVVAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNzcwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDc4MCBmb3IgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX01JTklNVU0gICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc4MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3OTAgZm9yIE1heGltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9NQVhJTVVNICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3OTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwODAwIGZvciBCbG9jayBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0JMT0NLICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDgwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA4MTAgZm9yIEZpbmFsIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfRklOQUwgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwODEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDgyMCBmb3IgU3Vic3RpdHV0aW9uIEdyb3VwIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfU1VCU1RJVFVUSU9OID0gUExVR0lOX05BTUUgKyAiLnhzZGUwODIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDgzMCBmb3IgRm9ybSBRdWFsaWZpY2F0aW9uIENvbWJvIEJveCAqLyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9GT1JNICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA4MzAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTA5MDAgZm9yIFR5cGUgSGVscGVyIEdyb3VwIC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBSZXN0cmljdGlvbiBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1RZUEVfSEVMUEVSX0dST1VQICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwOTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDkxMCBmb3IgTm9uZSBSYWRpbyBCdXR0b24gLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFJlc3RyaWN0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gTGlzdCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfTk9ORSAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTIwIGZvciBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBBdHRyaWJ1dGUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFJlc3RyaWN0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gTGlzdCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfQlVJTFRfSU4gPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTMwIGZvciBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBSZXN0cmljdGlvbiBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1RZUEVfSEVMUEVSX1VTRVJfREVGSU5FRF9TSU1QTEUgPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTQwIGZvciBVc2VyLWRlZmluZWQgY29tcGxleCB0eXBlIFJhZGlvIEJ1dHRvbiAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBFbGVtZW50IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfVVNFUl9ERUZJTkVEX0NPTVBMRVggPSBQTFVHSU5fTkFNRSArICIueHNkZTA5NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTUwIGZvciBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBFbGVtZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEF0dHJpYnV0ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFNpbXBsZSBDb250ZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gUmVzdHJpY3Rpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBMaXN0IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfVFlQRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDk1MCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAwMCBmb3IgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAxMCBmb3IgQXR0cmlidXRlIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX05BTUUgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDEwIjsKLSAgLyogQ09OVEVYVF9JRCBUeXBlIEluZm9ybWF0aW9uIEdyb3VwIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkyMCAqLwotICAvKiBDT05URVhUX0lEIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkzMCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAyMCBmb3IgVmFsdWUgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfVkFMVUVfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMDMwIGZvciBGaXhlZCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfRklYRUQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwMzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMDQwIGZvciBEZWZhdWx0IFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9ERUZBVUxUICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNTAgZm9yIFZhbHVlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9WQUxVRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNjAgZm9yIFVzYWdlIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9VU0FHRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA2MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNzAgZm9yIEZvcm0gcXVhbGlmaWNhaXRvbiBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfRk9STSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwNzAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTExMDAgZm9yIEVsZW1lbnQgUmVmIFdpbmRvdyBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTExMCBmb3IgUmVmZXJlbmNlIE5hbWUgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9SRUZfUkVGRVJFTkNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTExMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMTIwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfUkVGX01JTklNVU0gICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMTIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTEzMCBmb3IgTWF4aW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX1JFRl9NQVhJTVVNICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTEzMCI7Ci0gIAotICAvKiBDT05URVhUX0lEIHhzZGUxMjAwIGZvciBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLyAKLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBDb21wbGV4IENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NJTVBMRV9DT05URU5UX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMjAwIjsKLSAgLyogQ09OVEVYVF9JRCBCYXNlIFR5cGUgR3JvdXAgaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkwMCAqLwotICAvKiBDT05URVhUX0lEIE5vbmUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkyMCAqLwotICAvKiBDT05URVhUX0lEIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkzMCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTIxMCBmb3IgRGVyaXZlZCBieSBDb21ibyBCb3ggLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8gCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gQ29tcGxleCBDb250ZW50IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0lNUExFX0NPTlRFTlRfREVSSVZFRCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTIxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTMwMCBmb3IgUmVzdHJpY3Rpb24gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9ERVNJR05fVklFVyAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMDAiOwotICAvKiBDT05URVhUX0lEIEJhc2UgVHlwZSBHcm91cCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTAwICovCi0gIC8qIENPTlRFWFRfSUQgTm9uZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkxMCAqLwotICAvKiBDT05URVhUX0lEIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTIwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTMwICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBpbmZvcm1hdGlvbiBDb21ibyBCb3ggaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk1MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUxMzEwIGZvciBGYWNldHMgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9GQUNFVFNfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMzIwIGZvciBGYWNldHMgVGFibGUgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9GQUNFVFMgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMjAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE0MDAgZm9yIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9MSVNUX0RFU0lHTl9WSUVXICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgQmFzZSBUeXBlIEdyb3VwIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBOb25lIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTEwICovCi0gIC8qIENPTlRFWFRfSUQgQnVpbHQtaW4gc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTUwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTUwMCBmb3IgQXR0cmlidXRlIEdyb3VwIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX0dST1VQX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTUxMCBmb3IgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfR1JPVVBfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTUxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCBmb3IgR2xvYmFsIEF0dHJpYnV0ZSBhbmQgQXR0cmlidXRlIERlc2lnbiBWaWV3cyBhcmUgdGhlIHNhbWUgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTYwMCBmb3IgQXR0cmlidXRlIEdyb3VwIFJlZmVyZW5jZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9HUk9VUF9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTE2MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxNjEwIGZvciBSZWZlcmVuY2UgTmFtZSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfR1JPVVBfUkVGX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkZTE2MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE3MDAgZm9yIEF0dHJpYnV0ZSBSZWZlcmVuY2UgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNzAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTcxMCBmb3IgUmVmZXJlbmNlIE5hbWUgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX1JFRl9OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNzEwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUxODAwIGZvciBQYXR0ZXJuIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfUEFUVEVSTl9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTgwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTE4MTAgZm9yIFZhbHVlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1BBVFRFUk5fVkFMVUUgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTgxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTE4MjAgZm9yIENyZWF0ZSBSZWd1bGFyIEV4cHJlc3Npb24gUHVzaCBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9QQVRURVJOX1JFR1VMQVIgPSBQTFVHSU5fTkFNRSArICIueHNkZTE4MjAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE5MDAgZm9yIEVudW0gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTlVNX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxOTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTkxMCBmb3IgVmFsdWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRU5VTV9WQUxVRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTkxMCI7Ci0gIAotICAvKiBDT05URVhUX0lEIHhzZGUyMDAwIGZvciBJbmNsdWRlIERlc2lnbiBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfSU5DTFVERV9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjAwMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIFNjaGVtYSBMb2NhdGlvbiBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3QgUHVzaCBCdXR0b24gaXMgZnJvbSBJbmNsdWRlIEhlbHBlciB4c2RlMjEwMCAqLyAKLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkZTIxMDAgZm9yIEluY2x1ZGUgSGVscGVyIFNlbGVjdCBQdXNoIEJ1dHRvbiAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBJbmNsdWRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gSW1wb3J0IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfSU5DTFVERV9IRUxQRVJfU0VMRUNUID0gUExVR0lOX05BTUUgKyAiLnhzZGUyMTAwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyMjAwIGZvciBJbXBvcnQgRGVzaWduIFBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9JTVBPUlRfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTIyMDAiOwotICAvKiBubyBDT05URVhUX0lEIGZvciBTY2hlbWEgTG9jYXRpb24gVGV4dCBFZGl0IChub3QgZWRpdGFibGUpICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0IFB1c2ggQnV0dG9uIGlzIGZyb20gSW5jbHVkZSBIZWxwZXIgeHNkZTIxMDAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMjIxMCBmb3IgUHJlZml4IFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0lNUE9SVF9QUkVGSVggICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjIxMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIE5hbWVzcGFjZSBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLQotICAvKiBDT05URVhUX0lEIHhzZGUyMzAwIGZvciBSZWRlZmluZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1JFREVGSU5FX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUyMzAwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgU2NoZW1hIExvY2F0aW9uIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotICAvKiBDT05URVhUX0lEIFNlbGVjdCBQdXNoIEJ1dHRvbiBpcyBmcm9tIEluY2x1ZGUgSGVscGVyIHhzZGUyMTAwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMjQwMCBmb3IgR3JvdXAgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI0MTAgZm9yIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfTkFNRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI0MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI1MDAgZm9yIEdyb3VwIFNjb3BlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfREVTSUdOX1ZJRVcgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjUwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI1MTAgZm9yIENvbnRlbnQgbW9kZWwgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9TQ09QRV9DT05URU5UX0dST1VQID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjUyMCBmb3IgU2VxdWVuY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfU0VRVUVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTMwIGZvciBDaG9pY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfQ0hPSUNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1MzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTQwIGZvciBBbGwgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfQUxMICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTUwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1NDT1BFX01JTklNVU0gID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTUwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjU2MCBmb3IgTWF4aW11bSBUZXh0IEVkaXQqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1NDT1BFX01BWElNVU0gID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTYwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyNjAwIGZvciBHcm91cCBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI2MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNjEwIGZvciBSZWZlcmVuY2UgbmFtZSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9SRUZfUkVGRVJFTkNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI2MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNjIwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1JFRl9NSU5JTVVNICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjYyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI2MzAgZm9yIE1heGltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfUkVGX01BWElNVU0gICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNjMwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyNzAwIGZvciBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI3MDAiOwotICAvKiBDT05URVhUX0lEIE5hbWUgVGV4dCBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODEwICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0b3IgTXVsaXQtbGluZSBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBGaWVsZHMgR3JvdXAgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgzMCAqLwotICAvKiBDT05URVhUX0lEIFNvdXJjZSBUZXh0IEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg0MCAqLwotICAvKiBDT05URVhUX0lEIEFkZCBQdXNoIEJ1dHRvbiBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODUwICovCi0gIC8qIENPTlRFWFRfSUQgUmVtb3ZlIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NjAgKi8KLSAgLyogQ09OVEVYVF9JRCBUYXJnZXQgTGlzdCBCb3ggaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg3MCAqLwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjgwMCBmb3IgVW5pcXVlIEJhc2UgTmFtZSBUZXh0IEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODEwIGZvciBTZWxlY3RvciBHcm91cCAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfU0VMRUNUT1JfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODIwIGZvciBTZWxlY3RvciBNdWx0aS1saW5lIEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1NFTEVDVE9SICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjgzMCBmb3IgRmllbGRzIEdyb3VwIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfQkFTRV9GSUVMRFNfR1JPVVAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjgzMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4NDAgZm9yIFNvdXJjZSBUZXh0IEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1NPVVJDRSAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODQwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjg1MCBmb3IgQWRkIFB1c2ggQnV0dG9uIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfQkFTRV9BREQgICAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjg1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4NjAgZm9yIFJlbW92ZSBQdXNoIEJ1dHRvbiAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfUkVNT1ZFICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4NjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODcwIGZvciBUYXJnZXQgTGlzdCBCb3ggLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1RBUkdFVCAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODcwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyOTAwIGZvciBLZXkgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9LRVlfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI5MDAiOwotICAvKiBDT05URVhUX0lEIE5hbWUgVGV4dCBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODEwICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0b3IgTXVsaXQtbGluZSBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBGaWVsZHMgR3JvdXAgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgzMCAqLwotICAvKiBDT05URVhUX0lEIFNvdXJjZSBUZXh0IEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg0MCAqLwotICAvKiBDT05URVhUX0lEIEFkZCBQdXNoIEJ1dHRvbiBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODUwICovCi0gIC8qIENPTlRFWFRfSUQgUmVtb3ZlIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NjAgKi8KLSAgLyogQ09OVEVYVF9JRCBUYXJnZXQgTGlzdCBCb3ggaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg3MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUyOTAwIGZvciBLZXkgRGVzaWduIFZpZXcgKi8KLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI5NTAgZm9yIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9LRVlfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUyOTUwIjsKLSAgLyogQ09OVEVYVF9JRCBOYW1lIFRleHQgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODAwICovCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI5NjAgZm9yIFJlZmVyZW5jZSBLZXkgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfS0VZX1JFRl9SRUZFUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTI5NjAiOwotICAvKiBDT05URVhUX0lEIFNlbGVjdG9yIEdyb3VwIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBNdWxpdC1saW5lIEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgyMCAqLwotICAvKiBDT05URVhUX0lEIEZpZWxkcyBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODMwICovCi0gIC8qIENPTlRFWFRfSUQgU291cmNlIFRleHQgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODQwICovCi0gIC8qIENPTlRFWFRfSUQgQWRkIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NTAgKi8KLSAgLyogQ09OVEVYVF9JRCBSZW1vdmUgUHVzaCBCdXR0b24gaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg2MCAqLwotICAvKiBDT05URVhUX0lEIFRhcmdldCBMaXN0IEJveCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODcwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAwMCBmb3IgQW55IEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfRUxFTUVOVF9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMDAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAxMCBmb3IgTmFtZXNwYWNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9FTEVNRU5UX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzAxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMwMjAgZm9yIFByb2Nlc3MgQ29udGVudHMgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0VMRU1FTlRfUFJPQ0VTUyAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMDIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAzMCBmb3IgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfRUxFTUVOVF9NSU5JTVVNICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTMwMzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUzMDQwIGZvciBNYXhpbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9FTEVNRU5UX01BWElNVU0gICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzA0MCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzEwMCBmb3IgQW55IEF0dHJpYnV0ZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9BVFRSSUJVVEVfVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzEwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMxMTAgZm9yIE5hbWVzcGFjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfQVRUUklCVVRFX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzExMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMxMjAgZm9yIFByb2Nlc3MgQ29udGVudHMgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0FUVFJJQlVURV9QUk9DRVNTICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTMxMjAiOwotCi0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIFVuaW9uIERlc2lnbiBWaWV3IC0gdXNlcyBhIGdlbmVyaWMgaW50ZXJmYWNlICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBJbmZvcm1hdGlvbiBHcm91cCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTAwICovCi0gIC8qIENPTlRFWFRfSUQgQnVpbHQtaW4gc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTUwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzIwMCBmb3IgTm90YXRpb24gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9OT1RBVElPTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMjAwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGU0MDAwIGZvciBTb3VyY2UgVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NPVVJDRV9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGU0MDAwIjsKLQotICAvKiBDT05URVhUX0lEcyBmb3IgUmVndWxhciBFeHByZXNzaW9uIFdpemFyZCBmb2xsb3cgdGhlIHhzZHJ4eHggY29udGV4dCBJRHMgKi8KLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkcjAwMTAgZm9yIENvbXBvc2UgUmVndWxhciBFeHByZXNzaW9uIFBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9QQUdFICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwMTAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDE1IGZvciBUb2tlbiBDb250ZW50cyBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9UT0tFTiA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDAxNSI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwMjAgZm9yIE9jY3VycmVjZSBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09DQ1VSUkVOQ0VfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDMwIGZvciBKdXN0IG9uY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fSlVTVF9PTkNFICAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDA0MCBmb3IgWmVybyBvciBtb3JlIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1pFUk9fT1JfTU9SRSA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNTAgZm9yIE9uZSBvciBtb3JlIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09ORV9PUl9NT1JFICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNjAgZm9yIE9wdGlvbmFsIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09QVElPTkFMICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA2MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNzAgZm9yIFJlcGVhdCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SRVBFQVQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwNzAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDgwIGZvciBSYW5nZSBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SQU5HRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwODAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDkwIGZvciBSZXBlYXQgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fUkVQRUFUX1RFWFQgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDkwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDEwMCBmb3IgUmFuZ2UgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SQU5HRV9NSU4gICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAxMDAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMTEwIGZvciBSYW5nZSBNYXhpbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1JBTkdFX01BWCAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDExMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAxMjAgZm9yIEFkZCBQdXNoIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX0FERCAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDEyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAxMzAgZm9yIEN1cnJlbnQgUmVndWxhciBFeHByZXNzaW9uIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX0NVUlJFTlQgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDEzMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RyMDIwMCBmb3IgVGVzdCBSZWd1bGFyIEV4cHJlc3Npb24gUGFnZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX1RFU1RfUEFHRSAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMjAwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgUmVndWxhciBFeHByZXNzaW9uIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotICAvKiBDT05URVhUX0lEIHhzZHIwMjEwIGZvciBTYW1wbGUgVGV4dCBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9URVNUX1NBTVBMRSA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDIxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRHMgZm9yIFByZWZlcmVuY2VzIFBhZ2UgZm9sbG93cyB0aGUgeHNkcHh4eCBjb250ZXh0IElEcyAqLwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RwMDAxMCBmb3IgWE1MIFNjaGVtYSBQcmVmZXJlbmNlcyBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFBfUFJFRkVSRU5DRV9QQUdFID0gUExVR0lOX05BTUUgKyAiLnhzZHAwMDEwIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODcxMzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklFeHRlbmRlZEZpZ3VyZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzCi17Ci0gIFhTREFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotICBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGZpZ3VyZUZhY3Rvcnk7Ci0gIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3Rvcnk7Ci0gIExpc3QgYWN0aW9uTGlzdDsKLQotICBwdWJsaWMgWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcygpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWN0aW9uTGlzdChMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICB0aGlzLmFjdGlvbkxpc3QgPSBhY3Rpb25MaXN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoWFNEQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0UGFydEZhY3RvcnlMaXN0KEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmVkaXRQYXJ0RmFjdG9yeSA9IGVkaXRQYXJ0RmFjdG9yeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpZ3VyZUZhY3RvcnlMaXN0KElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZmlndXJlRmFjdG9yeSkKLSAgewotICAgIHRoaXMuZmlndXJlRmFjdG9yeSA9IGZpZ3VyZUZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRBY3Rpb25MaXN0KCkKLSAgewotICAgIHJldHVybiBhY3Rpb25MaXN0OwotICB9Ci0KLSAgcHVibGljIFhTREFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBhZGFwdGVyRmFjdG9yeTsKLSAgfQotCi0gIHB1YmxpYyBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBlZGl0UGFydEZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBnZXRGaWd1cmVGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBmaWd1cmVGYWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ODkzOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IiOyAgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sc2NoZW1hLnhzZERlZmF1bHRQcmVmaXhUZXh0IjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9QUkVGRVJFRF9CVUlMVF9JTl9UWVBFUyA9ICJvcmcuZWNsaXBzZS53c3QueG1sc2NoZW1hLnByZWZlcmVkQnVpbHRJblR5cGVzIjsgIC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1NDSEVNQVNfRVhURU5TSU9OSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5leHRlbnNpb25DYXRlZ29yaWVzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQUkVDQVRFRF9FWFRFTlNJT05TX1NDSEVNQVNfRVhURU5TSU9OSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5FeHRlbnNpb25zU2NoZW1hc0Rlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJCAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYU0RfQ09OVEVOVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0gIAotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBYU0RFZGl0b3JQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0gIHByaXZhdGUgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSByZWdpc3RyeTsgIAotICBwcml2YXRlIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgbm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeTsKLSAgcHJpdmF0ZSBYU0RFZGl0b3JDb25maWd1cmF0aW9uIHhzZEVkaXRvckNvbmZpZ3VyYXRpb24gPSBudWxsOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfVVNFX1NJTVBMRV9FRElUX01PREUgPSBQTFVHSU5fSUQgKyAiLnVzZVNpbXBsZUVkaXRNb2RlIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9TSE9XX0lOSEVSSVRFRF9DT05URU5UID0gUExVR0lOX0lEICsgIi5zaG93SW5oZXJpdGVkQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9YU0RfTEFOR1VBR0VfUVVBTElGWSA9ICJvcmcuZWNsaXBzZS53c3QueG1sc2NoZW1hLnhzZFF1YWxpZnkiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sc2NoZW1hLmRlZmF1bHRUYXJnZXRuYW1lc3BhY2VUZXh0IjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9TSE9XX0VYVEVSTkFMUyA9IFBMVUdJTl9JRCArICIuc2hvd0V4dGVybmFscyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfWFNEX0lNUE9SVF9DTEVBTlVQID0gUExVR0lOX0lEICsgIi5hdXRvSW1wb3J0Q2xlYW51cCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfWFNEX0FVVE9fT1BFTl9TQ0hFTUFfTE9DQVRJT05fRElBTE9HID0gUExVR0lOX0lEICsgIi5hdXRvT3BlblNjaGVtYUxvY2F0aW9uRGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9QQUdFID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVmYXVsdFBhZ2UiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBERVNJR05fUEFHRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnblBhZ2UiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT1VSQ0VfUEFHRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNvdXJjZVBhZ2UiOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBYU0RFZGl0b3JQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhTREVkaXRvclBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IG8pCi0gIHsKLSAgICAgIHJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXksIG5ldyBPYmplY3RbXSB7IG99KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIG9iamVjdHMpCi0gIHsKLSAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBvYmplY3RzKTsKLSAgfQotCQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgbzEsIE9iamVjdCBvMikKLSAgewotICAgICAgcmV0dXJuIGdldFJlc291cmNlU3RyaW5nKGtleSwgbmV3IE9iamVjdFtdIHsgbzEsIG8yfSk7Ci0gIH0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQkvLyByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luUmVzb3VyY2VzIik7Ci0gICAgICAgIHJlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoZ2V0QnVuZGxlKCkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwgcGF0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lLCBib29sZWFuIGdldEJhc2VVUkwpIHsKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBpbWFnZVN0cmluZyA9IGdldEJhc2VVUkwgPyAiaWNvbnMvIiArIG5hbWUgOiBuYW1lOyAvLyROT04tTkxTLTEkCi0KLQkJCVVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgaW1hZ2VTdHJpbmcpOwotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEljb24oU3RyaW5nIG5hbWUpCi0JewotCSAgdHJ5IHsKLQkJSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCi0JCWlmIChpbWFnZVJlZ2lzdHJ5LmdldChuYW1lKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQobmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaW1hZ2VTdHJpbmcgPSAiaWNvbnMvIiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQotCQkJVVJMIGltYWdlVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBpbWFnZVN0cmluZyk7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChuYW1lLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCkpOwotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KG5hbWUpOwotCQl9Ci0KLQkgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBudWxsOwotCSAgfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFhTREVkaXRvclBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WFNEU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlU3RyaW5nKGtleSk7Ci0JfQotCi0gIC8qKgotICAgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBhbmQgZG9lcyBvbmUgc3Vic3RpdHV0aW9uLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKS5nZXRTdHJpbmcoa2V5KSwgbmV3IE9iamVjdFtde3MxfSk7Ci0gIH0KLSAgCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRYU0RJbWFnZShTdHJpbmcgaWNvbk5hbWUpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRJbWFnZShpY29uTmFtZSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uTmFtZSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0KLQkJaWYgKGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShnZXRDbGFzcygpLCBpY29uTmFtZSkpOwotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgVVJMIGdldEJhc2VVUkwoKSB7Ci0JCXJldHVybiBnZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJY29uSW1hZ2UoU3RyaW5nIG9iamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKG5ldyBVUkwoZ2V0QmFzZVVSTCgpICsgImljb25zLyIgKyBvYmplY3QgKyAiLmdpZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93SW5oZXJpdGVkQ29udGVudCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihDT05TVF9TSE9XX0lOSEVSSVRFRF9DT05URU5UKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKQotICB7Ci0gICAgc3RvcmUuc2V0RGVmYXVsdChDT05TVF9TSE9XX0lOSEVSSVRFRF9DT05URU5ULCBmYWxzZSk7Ci0gICAgc3RvcmUuc2V0RGVmYXVsdChDT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCwgInhzZCIpOyAvLyROT04tTkxTLTEkCi0gICAgc3RvcmUuc2V0RGVmYXVsdChDT05TVF9YU0RfTEFOR1VBR0VfUVVBTElGWSwgZmFsc2UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9QQUdFLCBERVNJR05fUEFHRSk7Ci0gICAgc3RvcmUuc2V0RGVmYXVsdChDT05TVF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UsIERFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgc3RvcmUuc2V0RGVmYXVsdChDT05TVF9TSE9XX0VYVEVSTkFMUywgZmFsc2UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfWFNEX0lNUE9SVF9DTEVBTlVQLCBmYWxzZSk7Ci0gICAgCi0gICAgLy9FdmVuIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpc3QgbXVzdCBjb250YWluIGEgdHJhaWxpbmcgTGlzdCBzZXBhcmF0b3IKLSAgICBzdG9yZS5zZXREZWZhdWx0KENPTlNUX1BSRUZFUkVEX0JVSUxUX0lOX1RZUEVTLCAgICAgCQkKLSAgICAJCSJib29sZWFuIisgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJImRhdGUiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJImRhdGVUaW1lIiArIENVU1RPTV9MSVNUX1NFUEFSQVRPUiArIC8vJE5PTi1OTFMtMSQKLSAgICAJCSJkb3VibGUiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJImZsb2F0IiArIENVU1RPTV9MSVNUX1NFUEFSQVRPUiArIC8vJE5PTi1OTFMtMSQKLSAgICAJCSJoZXhCaW5hcnkiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJImludCIgKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkic3RyaW5nIiArIENVU1RPTV9MSVNUX1NFUEFSQVRPUiArIC8vJE5PTi1OTFMtMSQKLSAgICAJCSJ0aW1lIiArIENVU1RPTV9MSVNUX1NFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKHJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgcmVnaXN0cnkgPSBuZXcgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeShFWFRFTlNJT05TX1NDSEVNQVNfRVhURU5TSU9OSUQpOwotICAgICAgcmVnaXN0cnkuX19pbnRlcm5hbFNldERlcHJlY2F0ZWRFeHRlbnNpb25JZChERVBSRUNBVEVEX0VYVEVOU0lPTlNfU0NIRU1BU19FWFRFTlNJT05JRCk7Ci0gICAgICByZWdpc3RyeS5zZXRQcmVmU3RvcmUoWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VTdG9yZSgpICk7Ci0gICAgfQotICAgIHJldHVybiByZWdpc3RyeTsKLSAgfQotCi0gCi0gIHB1YmxpYyBYU0RFZGl0b3JDb25maWd1cmF0aW9uIGdldFhTREVkaXRvckNvbmZpZ3VyYXRpb24oKQotICB7Ci0gICAgaWYgKHhzZEVkaXRvckNvbmZpZ3VyYXRpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICB4c2RFZGl0b3JDb25maWd1cmF0aW9uID0gbmV3IFhTREVkaXRvckNvbmZpZ3VyYXRpb24oKTsKLSAgICB9Ci0gICAgcmV0dXJuIHhzZEVkaXRvckNvbmZpZ3VyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB4bWwgc2NoZW1hIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRYTUxTY2hlbWFQcmVmaXgoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhDT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93RXh0ZXJuYWxzKCkKLSAgewotICAgIHJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKENPTlNUX1NIT1dfRVhURVJOQUxTKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2hvd0V4dGVybmFscyhib29sZWFuIGRvU2hvdykKLSAgewotICAgIGdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKENPTlNUX1NIT1dfRVhURVJOQUxTLCBkb1Nob3cpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRSZW1vdmVJbXBvcnRTZXR0aW5nKCkKLSAgewotICAgIHJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKENPTlNUX1hTRF9JTVBPUlRfQ0xFQU5VUCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRBdXRvbWF0aWNhbGx5T3BlblNjaGVtYUxvY2F0aW9uRGlhbG9nU2V0dGluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihDT05TVF9YU0RfQVVUT19PUEVOX1NDSEVNQV9MT0NBVElPTl9ESUFMT0cpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSB4bWwgc2NoZW1hIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRYTUxTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhDT05TVF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgIGlmICghdGFyZ2V0TmFtZXNwYWNlLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlICsgIi8iOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB4bWwgc2NoZW1hIGxhbmd1YWdlIHF1YWxpZmljYXRpb24KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUXVhbGlmeVhNTFNjaGVtYUxhbmd1YWdlKCkgewotICAgIHJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKENPTlNUX1hTRF9MQU5HVUFHRV9RVUFMSUZZKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgcmV0dXJuIGdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNvdXJjZVBhZ2VBc0RlZmF1bHQoKQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoREVGQVVMVF9QQUdFLCBTT1VSQ0VfUEFHRSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXNpZ25QYWdlQXNEZWZhdWx0KCkKLSAgewotICAgIGdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKERFRkFVTFRfUEFHRSwgREVTSUdOX1BBR0UpOwotICB9Ci0gIAotICAvKioKLSAgICogTWV0aG9kIGdldERlZmF1bHRQYWdlLgotICAgKiAKLSAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIHN0cmluZyBjb25zdGFudCB0aGF0IGlzIHRoZSBkZWZhdWx0IHBhZ2UKLSAgICogICAgICAgICB0aGUgZWRpdG9yIHNob3VsZCB0dXJuIHRvIHdoZW4gZmlyc3Qgb3BlbmVkLiBDaGFuZ2VzIHRvIHRoZQotICAgKiAgICAgICAgIGxhc3QgdmlzaWJsZSBwYWdlIHdoZW4gdGhlIGVkaXRvciB3YXMgY2xvc2VkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWdlKCkgewotICAgIHJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoREVGQVVMVF9QQUdFKTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5IGdldE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKG5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIG5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgPSBuZXcgTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgiZm9vIik7Ci0gICAgfQotICAgIHJldHVybiBub2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5OwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9DVVNUT01JWkFUSU9OX1BST1ZJREVSX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXJQbHVnaW5JZCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfQ1VTVE9NSVpBVElPTl9QUk9WSURFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlckNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHByaXZhdGUgc3RhdGljIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVySW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIGdldFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIoKQotICB7Ci0gICAgaWYgKCFwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVySW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlckluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgIFN0cmluZyBwbHVnaW5OYW1lID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFBST0RVQ1RfQ1VTVE9NSVpBVElPTl9QUk9WSURFUl9QTFVHSU5fSUQpOwotICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhQUk9EVUNUX0NVU1RPTUlaQVRJT05fUFJPVklERVJfQ0xBU1NfTkFNRSk7Ci0gICAgICBpZiAocGx1Z2luTmFtZSAhPSBudWxsICYmIHBsdWdpbk5hbWUubGVuZ3RoKCkgPiAwICYmCi0gICAgICAgICAgY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbk5hbWUpOwotICAgICAgICAgIENsYXNzIGNsYXp6ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPSAoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciljbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9ICAgICAgICAgIAotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICByZXR1cm4gcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwM2FlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdFbGVtZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaC5YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGltcGxlbWVudHMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsgIAotICBwcm90ZWN0ZWQgSUZpbGUgY3VycmVudEZpbGU7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWFbXSBzY2hlbWFzOwotICAKLSAgcHVibGljIFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHRoaXMuY3VycmVudEZpbGUgPSBjdXJyZW50RmlsZTsKLSAgICB0aGlzLnNjaGVtYXMgPSBzY2hlbWFzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRUb0hpc3RvcnkoQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgaW1wbGVtZW50IG1lISAgICAKLSAgfQotCi0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldEJyb3dzZURpYWxvZygpCi0gIHsKLSAgICAvL1hTRFNldEV4aXN0aW5nVHlwZURpYWxvZyBkaWFsb2cgPSBuZXcgWFNEU2V0RXhpc3RpbmdUeXBlRGlhbG9nKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgICAvL3JldHVybiBkaWFsb2c7Ci0gICAgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlIGRpYWxvZ0RlbGVnYXRlID0gCi0gICAgCW5ldyBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUoWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlLkVMRU1FTlRfTUVUQV9OQU1FLCBjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gICAgcmV0dXJuIGRpYWxvZ0RlbGVnYXRlOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGdldENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRIaXN0b3J5KCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBpbXBsZW1lbnQgdGhpcyBwcm9wZXJseSAtIHNob3VsZCB0aGlzIGhpc3RvcnkgYmUgZ2xvYmFsIG9yIGxvY2FsIHRvIGVhY2ggZWRpdG9yPwotICAgIC8vIFRoaXMgaXMgc29tZXRoaW5nIHdlIHNob3VsZCBwbGF5IGFyb3VuZCB3aXRoIG91cnNlbHZlcyB0byBzZWUgd2hhdCBmZWVscyByaWdodC4KLSAgICAvLwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlc3VsdFtdID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb25bbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXROZXdEaWFsb2coKQotICB7Ci0JICBpZiAoc2NoZW1hcy5sZW5ndGggPiAwKSB7Ci0JCSAgcmV0dXJuIG5ldyBOZXdFbGVtZW50RGlhbG9nKHNjaGVtYXNbMF0pOwotCSAgfQotCSAgZWxzZSB7Ci0JCSAgcmV0dXJuIG5ldyBOZXdFbGVtZW50RGlhbG9nKCk7Ci0JICB9Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldFF1aWNrUGlja3MoKQotICB7Ci0gICAgLy8gVE9ETyAoY3MpIGltcGxlbWVudCB0aGlzIHByb3Blcmx5IC0gd2Ugc2hvdWxkIGJlIHByb3ZpZGluZyBhIGxpc3Qgb2YgdGhlIAotICAgIC8vIG1vc3QgJ2NvbW1vbicgYnVpbHQgaW4gc2NoZW1hIHR5cGVzIGhlcmUKLSAgICAvLyBJIGJlbGlldmUgVHJ1bmcgd2lsbCBiZSB3b3JraW5nIG9uIGEgcGVyZmVyZW5jZSBwYWdlIHRvIGdpdmUgdXMgdGhpcyBsaXN0Ci0gICAgLy8gZm9yIG5vdyBsZXQncyBoYXJkIGNvZGUgc29tZSB2YWx1ZXMKLSAgICAvLwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlc3VsdFtdID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb25bbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0vL1RPRE8gbm90IGNoYW5nZWQgeWV0Ci0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGNvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKXJlZmVyZW5jaW5nT2JqZWN0OwotICAgICAgaWYgKGFkYXB0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilhZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgfQotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgICB7ICAKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlYyA9IG51bGw7Ci0gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBBZGRYU0RFbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VMRU1FTlQsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgICBlbGVtZW50RGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWxlbWVudERlYyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRSwgY29uY3JldGVDb21wb25lbnQsIGVsZW1lbnREZWMpOwotICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICB9ICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldFF1YWxpZmllcigpLCBjb21wb25lbnQuZ2V0RmlsZSgpKTsKLSAgICAgICAgICBjb21tYW5kLnNldExhYmVsKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmMjgzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuSUFEVEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RGaWxlRWRpdG9ySW5wdXQgZXh0ZW5kcyBGaWxlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJQURURWRpdG9ySW5wdXQKLXsKLSAgcHJpdmF0ZSBJRmlsZSBmaWxlOwotICBwcml2YXRlIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByaXZhdGUgU3RyaW5nIGVkaXRvck5hbWU7Ci0KLSAgcHVibGljIFhTREZpbGVFZGl0b3JJbnB1dChJRmlsZSBmaWxlLCBYU0RTY2hlbWEgc2NoZW1hKSB7Ci0gICAgc3VwZXIoZmlsZSk7Ci0gICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIGVkaXRvck5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLSAgewotICAgIHJldHVybiBmaWxlOwotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvck5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBlZGl0b3JOYW1lID0gbmFtZTsKLSAgfQotIAotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgaWYgKGVkaXRvck5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZWRpdG9yTmFtZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpCi0gIHsKLSAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5zID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgaWYgKG5zICE9IG51bGwgJiYgbnMubGVuZ3RoKCkgPiAwKQotICAgICAgICByZXR1cm4gTWVzc2FnZXMuX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0UgKyBuczsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VzLl9VSV9MQUJFTF9OT19OQU1FU1BBQ0U7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXRUb29sVGlwVGV4dCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNESHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNESHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOWI5MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiBYU0RIeXBlcmxpbmsga25vd3MgaG93IHRvIG9wZW4gbGlua3MgZnJvbSBYU0QgZmlsZXMuCi0gKiAKLSAqIEBzZWUgWFNESHlwZXJsaW5rRGV0ZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIFhTREh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsKLXsKLSAgcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0gIHByaXZhdGUgWFNEQ29uY3JldGVDb21wb25lbnQgZkNvbXBvbmVudDsKLQotICBwdWJsaWMgWFNESHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBmUmVnaW9uID0gcmVnaW9uOwotICAgIGZDb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gIH0KLQotICBwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKQotICB7Ci0gICAgcmV0dXJuIGZSZWdpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG9wZW4oKQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IGZDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0KLSAgICBpZiAoc2NoZW1hID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChzY2hlbWFMb2NhdGlvbik7Ci0gICAgSVBhdGggc2NoZW1hUGF0aCA9IG5ldyBQYXRoKHNjaGVtYUxvY2F0aW9uKTsKLSAgICBJRmlsZSBzY2hlbWFGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNjaGVtYVBhdGgpOwotCi0gICAgYm9vbGVhbiBmaWxlRXhpc3RzID0gc2NoZW1hRmlsZSAhPSBudWxsICYmIHNjaGVtYUZpbGUuZXhpc3RzKCk7Ci0KLSAgICBpZiAoIWZpbGVFeGlzdHMpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAKLSAgICAgIHdvcmtiZW5jaFBhZ2UuZ2V0TmF2aWdhdGlvbkhpc3RvcnkoKS5tYXJrTG9jYXRpb24oZWRpdG9yUGFydCk7Ci0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBlZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3Iod29ya2JlbmNoUGFnZSwgc2NoZW1hRmlsZSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICAoKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0KS5vcGVuT25HbG9iYWxSZWZlcmVuY2UoZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNESHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTI3ZjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLQotLyoqCi0gKiBEZXRlY3RzIGh5cGVybGlua3MgZm9yIFhTRCBmaWxlcy4gVXNlZCBieSB0aGUgWFNEIHRleHQgZWRpdG9yIHRvIHByb3ZpZGUgYQotICogIkdvIHRvIGRlY2xhcmF0aW9uIiBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgd2l0aCB0aGUgb25lIHByb3ZpZGVkIGJ5IHRoZSBKYXZhCi0gKiBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEJhc2VIeXBlcmxpbmtEZXRlY3RvcgotewotICAvKioKLSAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBpcyAibGlua2FibGUiIHRoYXQgaXMsIHRoZSBjb21wb25lbnQgaXQKLSAgICogcG9pbnRzIHRvIGNhbiBiZSB0aGUgdGFyZ2V0IG9mIGEgImdvIHRvIGRlZmluaXRpb24iIG5hdmlnYXRpb24uIERlcml2ZWQKLSAgICogY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGxpbmthYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpbmthYmxlQXR0cmlidXRlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgYm9vbGVhbiBpc0xpbmthYmxlID0gbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSB8fAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFRkVSX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpIHx8IAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFKSB8fAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSkgfHwKLSAgICAgIG5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpCi0gICAgICA7Ci0KLSAgICByZXR1cm4gaXNMaW5rYWJsZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgaHlwZXJsaW5rIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBub2RlLiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkCi0gICAqIG92ZXJyaWRlLgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50IHRoZSBzb3VyY2UgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHVuZGVyIHRoZSBjdXJzb3IuCi0gICAqIEBwYXJhbSByZWdpb24gdGhlIHRleHQgcmVnaW9uIHRvIHVzZSB0byBjcmVhdGUgdGhlIGh5cGVybGluay4KLSAgICogQHJldHVybiBhIG5ldyBJSHlwZXJsaW5rIGZvciB0aGUgbm9kZSBvciBudWxsIGlmIG9uZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhJRG9jdW1lbnQgZG9jdW1lbnQsIElET01Ob2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGdldFhTRFNjaGVtYShkb2N1bWVudCk7Ci0KLSAgICBpZiAoeHNkU2NoZW1hID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZ2V0VGFyZ2V0WFNEQ29tcG9uZW50KHhzZFNjaGVtYSwgbm9kZSk7Ci0KLSAgICBpZiAodGFyZ2V0Q29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgSVJlZ2lvbiBub2RlUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKG5vZGUpOwotCi0gICAgICByZXR1cm4gbmV3IFhTREh5cGVybGluayhub2RlUmVnaW9uLCB0YXJnZXRDb21wb25lbnQpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBYU0QgY29tcG9uZW50IGZvciB0aGUgZ2l2ZW4gbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEgY2Fubm90IGJlIG51bGwKLSAgICogQHBhcmFtIG5vZGUgY2Fubm90IGJlIG51bGwKLSAgICogQHJldHVybiBYU0RDb25jcmV0ZUNvbXBvbmVudAotICAgKi8KLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRUYXJnZXRYU0RDb21wb25lbnQoWFNEU2NoZW1hIHhzZFNjaGVtYSwgSURPTU5vZGUgbm9kZSkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotCi0gICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotICAgIAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgQXR0cikKLSAgICB7Ci0gICAgICBBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKW5vZGU7Ci0gICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlICE9IG51bGwgPyBhdHRyaWJ1dGUuZ2V0TmFtZSgpOiBudWxsOwotICAgIH0KLSAgICAKLSAgICBYU0RIeXBlcmxpbmtUYXJnZXRMb2NhdG9yIHhzZEh5cGVybGlua1RhcmdldExvY2F0b3IgPSBuZXcgWFNESHlwZXJsaW5rVGFyZ2V0TG9jYXRvcigpOwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IHhzZEh5cGVybGlua1RhcmdldExvY2F0b3IubG9jYXRlKHhzZENvbXBvbmVudCwgYXR0cmlidXRlTmFtZSk7IAotICAgIAotICAgIHJldHVybiBjb21wb25lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgeHNkIHNjaGVtYSBmcm9tIGRvY3VtZW50Ci0gICAqIAotICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICogQHJldHVybiBYU0RTY2hlbWEgb3IgbnVsbCBvZiBvbmUgZG9lcyBub3QgZXhpc3QgeWV0IGZvciBkb2N1bWVudAotICAgKi8KLSAgcHJpdmF0ZSBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKElEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLSAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKQotICAgICAgICB7Ci0gICAgICAgICAgSURPTURvY3VtZW50IGRvbURvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICBpZiAoZG9tRG9jICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNETW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IChYU0RNb2RlbEFkYXB0ZXIpIGRvbURvYy5nZXRFeGlzdGluZ0FkYXB0ZXIoWFNETW9kZWxBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJU1NVRTogRGlkbid0IHdhbnQgdG8gZ28gdGhyb3VnaCBpbml0aWFsaXppbmcgc2NoZW1hIGlmIGl0IGRvZXMKLSAgICAgICAgICAgICAqIG5vdCBhbHJlYWR5IGV4aXN0LCBzbyBqdXN0IGF0dGVtcHRlZCB0byBnZXQgZXhpc3RpbmcgYWRhcHRlci4gSWYKLSAgICAgICAgICAgICAqIGRvZXNuJ3QgZXhpc3QsIGp1c3QgZG9uJ3QgYm90aGVyIHdvcmtpbmcuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgc2NoZW1hID0gbW9kZWxBZGFwdGVyLmdldFNjaGVtYSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBtb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNjaGVtYTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREh5cGVybGlua1RhcmdldExvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtUYXJnZXRMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGFlYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREh5cGVybGlua1RhcmdldExvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotCi0vKioKLSAqIEEgY3VzdG9tIFhTRFN3aXRjaCB1c2VkIHRvIGxvY2F0ZSB0aGUgInJlZmVyZW5jZWQiIGNvbXBvbmVudC4gVXNlZCBieSB0aGUKLSAqIGh5cGVybGluay9GMyBuYXZpZ2F0aW9uIG1lY2hhbmlzbS4gTWFkZSBhIHNlcGFyYXRlIGNsYXNzIGJlY2F1c2UgaXQgaXMgdXNlZAotICogZnJvbSB0aGUgV1NETCBlZGl0b3IgYXMgd2VsbC4KLSAqLwotcHVibGljIGNsYXNzIFhTREh5cGVybGlua1RhcmdldExvY2F0b3IgZXh0ZW5kcyBYU0RTd2l0Y2gKLXsKLSAgLyoqCi0gICAqIEhvbGRzIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiB0aGUgY3Vyc29yL21vdXNlIGlzIG92ZXIgYW4gYXR0cmlidXRlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZTsKLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaCNjYXNlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjbGFyYXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpOwotCi0gICAgICAvLyBBdm9pZCBuYXZpZ2F0aW5nIHRvIGJ1aWx0IGluIGRhdGEgdHlwZXMuCi0KLSAgICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoI2Nhc2VYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0ID0gbnVsbDsKLQotICAgIGlmIChhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgdHlwZURlZmluaXRpb24gPSBudWxsOwotCi0gICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHlwZURlZmluaXRpb24gPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLQotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgc3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRTdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uKCk7Ci0KLSAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIHN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlcmUgYXJlIDIgdGhpbmdzIHdlIGNhbiBuYXZpZ2F0ZSB0bzogaWYgdGhlIGN1cnNvciBpcyBhbnl3aGVyZSBvbgotICAgICAgICAvLyB0aGUKLSAgICAgICAgLy8gc3Vic3RpdHV0aW9uIGF0dHJpYnV0ZSB0aGVuIGp1bXAgdG8gdGhhdCwgb3RoZXJ3aXNlIGp1c3QgZ28gdG8gdGhlCi0gICAgICAgIC8vIGJhc2UgdHlwZS4KLQotICAgICAgICBpZiAoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXQgPSBzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRhcmdldCA9IHR5cGVEZWZpbml0aW9uOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IHR5cGVEZWZpbml0aW9uICE9IG51bGwgPyB0eXBlRGVmaW5pdGlvbiA6IHN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb247Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRDb25zdHJhaW50RGVmaW5pdGlvbikKLSAgewotICAgIE9iamVjdCB0YXJnZXQgPSBudWxsOwotCi0gICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiByZWZlcmVuY2VkS2V5ID0gaWRDb25zdHJhaW50RGVmaW5pdGlvbi5nZXRSZWZlcmVuY2VkS2V5KCk7Ci0KLSAgICBpZiAocmVmZXJlbmNlZEtleSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRhcmdldCA9IHJlZmVyZW5jZWRLZXk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoI2Nhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHRhcmdldCA9IG51bGw7Ci0KLSAgICBpZiAobW9kZWxHcm91cERlZmluaXRpb24uaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTRFNjaGVtYURpcmVjdGl2ZShvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hRGlyZWN0aXZlKFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUpCi0gIHsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gZGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0KLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgLy8gU2ltcGxlIHR5cGVzIGNhbiBiZSBvbmUgb2Y6IGF0b21pYywgbGlzdCBvciB1bmlvbi4KLQotICAgIFhTRFZhcmlldHkgdmFyaWV0eSA9IHR5cGVEZWZpbml0aW9uLmdldFZhcmlldHkoKTsKLSAgICBpbnQgdmFyaWV0eVR5cGUgPSB2YXJpZXR5LmdldFZhbHVlKCk7Ci0KLSAgICBzd2l0Y2ggKHZhcmlldHlUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgWFNEVmFyaWV0eS5BVE9NSUM6Ci0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXQgPSB0eXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWFNEVmFyaWV0eS5MSVNUOgotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0ID0gdHlwZURlZmluaXRpb24uZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhTRFZhcmlldHkuVU5JT046Ci0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IG1lbWJlclR5cGVzID0gdHlwZURlZmluaXRpb24uZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgaWYgKG1lbWJlclR5cGVzICE9IG51bGwgJiYgbWVtYmVyVHlwZXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJU1NVRTogV2hhdCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB0eXBlPwotICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhIGNhc2UgZm9yIG11bHRpcGxlIGh5cGVybGlua3MgYXQgdGhlIHNhbWUKLSAgICAgICAgICAgIC8vIGxvY2F0aW9uLgotICAgICAgICAgICAgdGFyZ2V0ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBtZW1iZXJUeXBlcy5nZXQoMCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIEF2b2lkIG5hdmlnYXRpbmcgdG8gYnVpbHQgaW4gZGF0YSB0eXBlcy4KLQotICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBudWxsOwotICAgIH0KLQotICAgIHJldHVybiB0YXJnZXQ7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaCNjYXNlWFNEVHlwZURlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEVHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSB0eXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpOwotCi0gICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgdGFyZ2V0ID0gYmFzZVR5cGU7Ci0gICAgfQotCi0gICAgLy8gQXZvaWQgbmF2aWdhdGluZyB0byBidWlsdCBpbiBkYXRhIHR5cGVzLgotCi0gICAgaWYgKGlzRnJvbVNjaGVtYUZvclNjaGVtYSh0YXJnZXQpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlY3RzIGlmIGEgZ2l2ZW4gc2NoZW1hIGNvbXBvbmVudCBpcyBmcm9tIHRoZSBzY2hlbWEgZm9yIHNjaGVtYSAoYnVpbHQgaW4KLSAgICogZGF0YSB0eXBlcykuIFVzZWQgdG8gYXZvaWQgbmF2aWdhdGluZyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50cyBhcyB0aGV5Ci0gICAqIGRvbid0IGhhdmUgYW4gYWNjZXNzaWJsZSBwaHlzaWNhbCBsb2NhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB0byBjaGVjay4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgZnJvbSB0aGUgc2NoZW1hIGZvciBzY2hlbWEgbmFtZXNwYWNlLAotICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRnJvbVNjaGVtYUZvclNjaGVtYShYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBjb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0KLSAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmVxdWFscyhzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBMb2NhdGVzIHRoZSB0YXJnZXQgY29tcG9uZW50IC0gZm9yIGV4YW1wbGUgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gcG9pbnRlZAotICAgKiB0byBieSBhbiBlbGVtZW50IHJlZmVyZW5jZSwgZXRjLgotICAgKiAKLSAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY3VycmVudCBjb21wb25lbnQuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiB0aGUgY3Vyc29yL21vdXNlIGlzIG92ZXIgYW4KLSAgICogICAgICAgIGF0dHJpYnV0ZS4gVGhpcyBpcyB1c2VkIHRvIHByb3ZpZGUgZmluZSBncmFpbmVkIG5hdmlnYXRpb24gZm9yCi0gICAqICAgICAgICBjb21wb25lbnRzIHdpdGggbW9yZSB0aGFuIG9uZSAiYWN0aXZlIiBhdHRyaWJ1dGUuCi0gICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgWFNEIGNvbmNyZXRlIGNvbXBvbmVudCBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuCi0gICAqLwotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgbG9jYXRlKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotCi0gICAgcmV0dXJuIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgZG9Td2l0Y2goY29tcG9uZW50KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNETXVsdGlQYWdlRWRpdG9yQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0NzgxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNETXVsdGlQYWdlRWRpdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuWm9vbUluUmV0YXJnZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuWm9vbU91dFJldGFyZ2V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZXRhcmdldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLklYU0RUb29sYmFyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQ2FwdHVyZVNjcmVlbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBpbnN0YWxsYXRpb24vZGVpbnN0YWxsYXRpb24gb2YgZ2xvYmFsIGFjdGlvbnMgZm9yIG11bHRpLXBhZ2UKLSAqIGVkaXRvcnMuIFJlc3BvbnNpYmxlIGZvciB0aGUgcmVkaXJlY3Rpb24gb2YgZ2xvYmFsIGFjdGlvbnMgdG8gdGhlIGFjdGl2ZQotICogZWRpdG9yLiBNdWx0aS1wYWdlIGNvbnRyaWJ1dG9yIHJlcGxhY2VzIHRoZSBjb250cmlidXRvcnMgZm9yIHRoZSBpbmRpdmlkdWFsCi0gKiBlZGl0b3JzIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIFhTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OwotICBwcml2YXRlIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvcjsKLSAgcHJvdGVjdGVkIElUZXh0RWRpdG9yIHRleHRFZGl0b3I7Ci0gIHByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Igc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBmUGFydExpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotICBab29tSW5SZXRhcmdldEFjdGlvbiB6b29tSW5SZXRhcmdldEFjdGlvbjsKLSAgWm9vbU91dFJldGFyZ2V0QWN0aW9uIHpvb21PdXRSZXRhcmdldEFjdGlvbjsKLSAgQWN0aW9uIGNhcHR1cmVTY3JlZW5BY3Rpb247Ci0gIFpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0gem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbTsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBtdWx0aS1wYWdlIGNvbnRyaWJ1dG9yLgotICAgKi8KLSAgcHVibGljIFhTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBuZXcgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0gICAgem9vbUluUmV0YXJnZXRBY3Rpb24gPSBuZXcgWm9vbUluUmV0YXJnZXRBY3Rpb24oKTsKLSAgICB6b29tSW5SZXRhcmdldEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXRvb2wxNi96b29tcGx1cy5naWYiKSk7Ci0gICAgem9vbU91dFJldGFyZ2V0QWN0aW9uID0gbmV3IFpvb21PdXRSZXRhcmdldEFjdGlvbigpOwotICAgIHpvb21PdXRSZXRhcmdldEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXRvb2wxNi96b29tbWludXMuZ2lmIikpOwotICAgIGNhcHR1cmVTY3JlZW5BY3Rpb24gPSBuZXcgQ2FwdHVyZVNjcmVlbkFjdGlvbigpOwotICAgIGZQYXJ0TGlzdGVuZXJzLmFkZCh6b29tSW5SZXRhcmdldEFjdGlvbik7Ci0gICAgZlBhcnRMaXN0ZW5lcnMuYWRkKHpvb21PdXRSZXRhcmdldEFjdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYWN0aW9uIHJlZ2lzdGVkIHdpdGggdGhlIGdpdmVuIHRleHQgZWRpdG9yLgotICAgKiAKLSAgICogQHJldHVybiBJQWN0aW9uIG9yIG51bGwgaWYgZWRpdG9yIGlzIG51bGwuCi0gICAqLwotICBwcm90ZWN0ZWQgSUFjdGlvbiBnZXRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgYWN0aW9uSUQpCi0gIHsKLSAgICByZXR1cm4gKGVkaXRvciA9PSBudWxsID8gbnVsbCA6IGVkaXRvci5nZXRBY3Rpb24oYWN0aW9uSUQpKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YURvYykgTWV0aG9kIGRlY2xhcmVkIGluCi0gICAqIEFic3RyYWN0TXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuCi0gICAqLwotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkKLSAgewotICAgIGlmIChhY3RpdmVFZGl0b3JQYXJ0ID09IHBhcnQpCi0gICAgICByZXR1cm47Ci0KLSAgICBhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKLQotICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0gICAgYm9vbGVhbiBpc1NvdXJjZSA9IGZhbHNlOwotICAgIAotICAgIGlmIChhY3RpdmVFZGl0b3JQYXJ0ICE9IG51bGwgJiYgYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotICAgIHsKLSAgICAgIGlzU291cmNlID0gdHJ1ZTsKLSAgICAgIHpvb21JblJldGFyZ2V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgem9vbU91dFJldGFyZ2V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgY2FwdHVyZVNjcmVlbkFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGFjdGl2YXRlU291cmNlUGFnZShhY3RpdmVFZGl0b3JQYXJ0LCB0cnVlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGFjdGl2YXRlU291cmNlUGFnZSh4c2RFZGl0b3IsIGZhbHNlKTsKLSAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICB7Ci0gICAgICAgIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgcGFydDsKLSAgICAgIH0KLSAgICAgIGlmICh4c2RFZGl0b3IgIT0gbnVsbCkKLSAgICAgIHsgICAgCSAgCi0gICAgICAgIC8vIGNzOiBoZXJlJ3Mgd2UgZW5zdXJlIHRoZSBVTkRPIGFuZCBSRURPIGFjdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIAotICAgICAgICAvLyB0aGUgZGVzaWduIHZpZXcgaXMgYWN0aXZlCi0gICAgICAgIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0geHNkRWRpdG9yLmdldFNpdGUoKTsKLSAgICAgICAgaWYgKHNpdGUgaW5zdGFuY2VvZiBJRWRpdG9yU2l0ZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0geHNkRWRpdG9yLmdldFRleHRFZGl0b3IoKTsKLSAgICAgICAgICBJQWN0aW9uQmFycyBzaXRlQWN0aW9uQmFycyA9ICgoSUVkaXRvclNpdGUpIHNpdGUpLmdldEFjdGlvbkJhcnMoKTsKLSAgICAgICAgICBzaXRlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKSk7Ci0gICAgICAgICAgc2l0ZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPLCBnZXRBY3Rpb24odGV4dEVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETykpOwotICAgICAgICAgIHNpdGVBY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsgICAgCQkJCQkKLSAgICAgICAgfQotCQkJCi0gICAgICAgIE9iamVjdCBhZGFwdGVyID0geHNkRWRpdG9yLmdldEFkYXB0ZXIoQWN0aW9uUmVnaXN0cnkuY2xhc3MpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGlvblJlZ2lzdHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSAoQWN0aW9uUmVnaXN0cnkpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIHJlZ2lzdHJ5LmdldEFjdGlvbihEZWxldGVBY3Rpb24uSUQpKTsKLSAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoR0VGQWN0aW9uQ29uc3RhbnRzLlpPT01fSU4sIHJlZ2lzdHJ5LmdldEFjdGlvbihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9JTikpOwotICAgICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9PVVQsIHJlZ2lzdHJ5LmdldEFjdGlvbihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9PVVQpKTsKLSAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpLCByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpKSk7Ci0gICAgICAgICAgem9vbUluUmV0YXJnZXRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICB6b29tT3V0UmV0YXJnZXRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBjYXB0dXJlU2NyZWVuQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0gICAgICAvLyB1cGRhdGUgbWVudSBiYXIgYW5kIHRvb2wgYmFyCi0gICAgICBhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0gIT0gbnVsbCkKLSAgICB7Ci0gICAgICB6b29tQ29tYm9Db250cmlidXRpb25JdGVtLnNldFZpc2libGUoIWlzU291cmNlKTsKLSAgICAgIHpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0udXBkYXRlKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVNvdXJjZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yLCBib29sZWFuIHN0YXRlKQotICB7Ci0gICAgaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwgJiYgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpCi0gICAgewotICAgICAgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0gICAgICAoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoc3RhdGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KQotICB7Ci0gICAgSUVkaXRvclBhcnQgYWN0aXZlTmVzdGVkRWRpdG9yID0gbnVsbDsKLSAgICBpZiAocGFydCBpbnN0YW5jZW9mIE11bHRpUGFnZUVkaXRvclBhcnQpCi0gICAgewotICAgICAgYWN0aXZlTmVzdGVkRWRpdG9yID0gcGFydDsKLSAgICB9Ci0gICAgc2V0QWN0aXZlUGFnZShhY3RpdmVOZXN0ZWRFZGl0b3IpOwotICAgIAotICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgewotICAgICAgeHNkRWRpdG9yID0gKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBwYXJ0OwotCi0gICAgICB0ZXh0RWRpdG9yID0geHNkRWRpdG9yLmdldFRleHRFZGl0b3IoKTsKLSAgICAgIGlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0gICAgICB7ICAgICAgCi0vLyAgICAgICAgdXBkYXRlQWN0aW9ucygpOyAgCi0gICAgICAgIGdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIExpc3QgbGlzdCA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkuZ2V0VG9vbGJhckFjdGlvbnMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgKChJWFNEVG9vbGJhckFjdGlvbilpLm5leHQoKSkuc2V0RWRpdG9yUGFydChhY3RpdmVOZXN0ZWRFZGl0b3IpOwotICAgIH0KLSAgICAKLSAgICBzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKQotICB7Ci0gICAgSU1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuX1VJX01FTlVfWFNEX0VESVRPUik7Ci0gICAgbWFuYWdlci5wcmVwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbWVudSk7Ci0KLSAgICAvLyBBZGQgZXh0ZW5zaW9uIG1lbnUgYWN0aW9ucwotICAgIExpc3QgbGlzdCA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkuZ2V0VG9vbGJhckFjdGlvbnMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgbWVudS5hZGQoKElYU0RUb29sYmFyQWN0aW9uKWkubmV4dCgpKTsKLSAgICB9Ci0KLSAgICBtZW51LmFkZCh6b29tSW5SZXRhcmdldEFjdGlvbik7Ci0gICAgbWVudS5hZGQoem9vbU91dFJldGFyZ2V0QWN0aW9uKTsKLSAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0gICAgbWVudS5hZGQoY2FwdHVyZVNjcmVlbkFjdGlvbik7Ci0KLSAgICBtZW51LnVwZGF0ZUFsbCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpCi0gIHsKLSAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgIC8vIEFkZCBleHRlbnNpb24gdG9vbGJhciBhY3Rpb25zCi0gICAgTGlzdCBsaXN0ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhTREVkaXRvckNvbmZpZ3VyYXRpb24oKS5nZXRUb29sYmFyQWN0aW9ucygpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBtYW5hZ2VyLmFkZCgoSVhTRFRvb2xiYXJBY3Rpb24paS5uZXh0KCkpOwotICAgIH0KLQotICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgU3RyaW5nW10gem9vbVN0cmluZ3MgPSBuZXcgU3RyaW5nW10geyBab29tTWFuYWdlci5GSVRfQUxMLCBab29tTWFuYWdlci5GSVRfSEVJR0hULCBab29tTWFuYWdlci5GSVRfV0lEVEggfTsKLSAgICB6b29tQ29tYm9Db250cmlidXRpb25JdGVtID0gbmV3IFpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0oZ2V0UGFnZSgpLCB6b29tU3RyaW5ncyk7Ci0gICAgbWFuYWdlci5hZGQoem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbSk7Ci0gICAgbWFuYWdlci5hZGQoY2FwdHVyZVNjcmVlbkFjdGlvbik7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMsIElXb3JrYmVuY2hQYWdlIHBhZ2UpCi0gIHsKLSAgICBJdGVyYXRvciBlID0gZlBhcnRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgcGFnZS5hZGRQYXJ0TGlzdGVuZXIoKFJldGFyZ2V0QWN0aW9uKSBlLm5leHQoKSk7Ci0gICAgfQotICAgIAotICAgIGluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihiYXJzKTsKLSAgICAKLSAgICBzdXBlci5pbml0KGJhcnMsIHBhZ2UpOwotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0gICAgaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwpCi0gICAgICBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5pbml0KGFjdGlvbkJhcnMsIGdldFBhZ2UoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgZlBhcnRMaXN0ZW5lcnMgPSBudWxsOwotICAgIGlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKQotICAgICAgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEU2VsZWN0aW9uTWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEU2VsZWN0aW9uTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1Mjc1OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFNlbGVjdGlvbk1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWxlY3Rpb25NYXBwZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uTWFwcGVyCi17Ci0gIHB1YmxpYyBJU2VsZWN0aW9uIG1hcFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgeyAgCi0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoKChBZGFwdGVyKW8pLmdldFRhcmdldCgpKTsKLSAgICAgICAgfSAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKG8pOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0KLSAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlzdCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RTdWJzdGl0dXRpb25Hcm91cEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYyNTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RTdWJzdGl0dXRpb25Hcm91cEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlciBleHRlbmRzIFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcgotewotCi0gIHB1YmxpYyBYU0RTdWJzdGl0dXRpb25Hcm91cEVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnQpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gY29uY3JldGVDb21wb25lbnQgPSBudWxsOwotICAgIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgewotICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgICBpZiAoYWRhcHRlci5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSByZWZlcmVuY2luZ09iamVjdDsKLSAgICB9Ci0gICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgICBpZiAoY29tcG9uZW50LmlzTmV3KCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjID0gbnVsbDsKLSAgICAgICAgICBpZiAoY29tcG9uZW50LmdldE1ldGFOYW1lKCkgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIEFkZFhTREVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRUxFTUVOVCwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICAgY29tbWFuZC5zZXROYW1lVG9BZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIGVsZW1lbnREZWMgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlbGVtZW50RGVjICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUsIGVsZW1lbnREZWMuZ2V0UU5hbWUoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9TVUJTVElUVVRJT05fR1JPVVApOwotICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSwgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29tcG9uZW50LmdldE9iamVjdCgpKS5nZXRRTmFtZShjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSksIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX1NVQlNUSVRVVElPTl9HUk9VUCk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzU5MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEV1Z2VuZSBPc3Ryb3VraG92LCBldWdlbmVAZ2VudWl0ZWMuY29tIC0gWzIwMzI5MV0gWFNEIEVkaXRvciBTb3VyY2UgU3RhdGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCB1cGRhdGVkIGluIE91dGxpbmUvR3JhcGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBdHRyaWJ1dGVVc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEUGFydGljbGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBleHRlbmRzIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGltcGxlbWVudHMgSUFEVE9iamVjdExpc3RlbmVyCi17Ci0gIFhTREJhc2VBZGFwdGVyIG9sZFNlbGVjdGlvbjsKLSAgWFNETW9kZWxBZGFwdGVyIHhzZE1vZGVsQWRhcHRlcjsKLSAgcHVibGljIFhTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpCi0gIHsKLSAgICBzdXBlcih0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLSAgICAgIE9iamVjdCBzZWxlY3RlZCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpc2VsZWN0ZWQ7Ci0gICAgICAgIGlmIChvbGRTZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG9sZFNlbGVjdGlvbi51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgaWYgKG9sZFNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW0gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSgoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcilvbGRTZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgICAgICAgICAgaWYgKGVsZW0uZ2V0Q29udGFpbmVyKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQWRhcHRlciBhZGFwID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChlbGVtLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgICAgaWYgKGFkYXAgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUFkYXB0ZXIpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYU0RQYXJ0aWNsZUFkYXB0ZXIgcGFydGljbGVBZGFwdGVyID0gKFhTRFBhcnRpY2xlQWRhcHRlcilhZGFwOwotICAgICAgICAgICAgICAgIHBhcnRpY2xlQWRhcHRlci51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgcmVzb2x2ZWRFbGVtZW50QWRhcHRlciA9IChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgcmVzb2x2ZWRFbGVtZW50QWRhcHRlci51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgewotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikoKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpYWRhcHRlcikuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgQWRhcHRlciBhZGFwID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChlbGVtLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICBpZiAoYWRhcCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RQYXJ0aWNsZUFkYXB0ZXIgcGFydGljbGVBZGFwdGVyID0gKFhTRFBhcnRpY2xlQWRhcHRlcilhZGFwOwotICAgICAgICAgICAgcGFydGljbGVBZGFwdGVyLnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChlbGVtLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciByZXNvbHZlZEVsZW1lbnRBZGFwdGVyID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChlbGVtLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgICAgICAgICAgcmVzb2x2ZWRFbGVtZW50QWRhcHRlci5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlQWRhcHRlcikKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIgYXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJVc2UgPSAoWFNEQXR0cmlidXRlVXNlKSBhdHRyaWJ1dGVVc2UuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgYWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcikgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RBdHRyVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGFkYXB0ZXIucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgb2xkU2VsZWN0aW9uID0gYWRhcHRlcjsKLSAgICAgICAgT2JqZWN0IG1vZGVsID0gYWRhcHRlci5nZXRUYXJnZXQoKTsKLQotICAgICAgICBpZiAoeHNkTW9kZWxBZGFwdGVyICE9IG51bGwgJiYgeHNkTW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkucmVtb3ZlTGlzdGVuZXIoaW50ZXJuYWxOb2RlQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpYWRhcHRlci5nZXRUYXJnZXQoKSkuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgeHNkTW9kZWxBZGFwdGVyID0gWFNETW9kZWxBZGFwdGVyLmxvb2t1cE9yQ3JlYXRlTW9kZWxBZGFwdGVyKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeHNkTW9kZWxBZGFwdGVyICE9IG51bGwgJiYgeHNkTW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkuYWRkTGlzdGVuZXIoaW50ZXJuYWxOb2RlQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kZWwpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgaWYgKGdldEN1cnJlbnRUYWIoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKHhzZE1vZGVsQWRhcHRlciAhPSBudWxsICYmIHhzZE1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHhzZE1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKS5yZW1vdmVMaXN0ZW5lcihpbnRlcm5hbE5vZGVBZGFwdGVyKTsKLSAgICAgIHhzZE1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgfQotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgaW50ZXJuYWxOb2RlQWRhcHRlciA9IG5ldyBJbnRlcm5hbE5vZGVBZGFwdGVyKCk7Ci0gIGNsYXNzIEludGVybmFsTm9kZUFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLSAgewotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykKLSAgICB7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMWUxM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MuTmV3VHlwZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2guWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIgaW1wbGVtZW50cyBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciwgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyCi17ICAKLSAgcHJvdGVjdGVkIElGaWxlIGN1cnJlbnRGaWxlOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hW10gc2NoZW1hczsKLSAgcHJpdmF0ZSBzdGF0aWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXN1bHRbXTsKLSAgcHJpdmF0ZSBJQURUT2JqZWN0IHJlZmVyZW5jZXI7Ci0gIAotICBwdWJsaWMgWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgdGhpcy5jdXJyZW50RmlsZSA9IGN1cnJlbnRGaWxlOwotICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFRvSGlzdG9yeShDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBpbXBsZW1lbnQgbWUhICAgIAotICB9Ci0gIAotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRSZWZlcmVuY2VyKCkKLSAgewotICAgIHJldHVybiByZWZlcmVuY2VyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VyKElBRFRPYmplY3QgcmVmZXJlbmNlcikKLSAgewotICAgIHRoaXMucmVmZXJlbmNlciA9IHJlZmVyZW5jZXI7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXRCcm93c2VEaWFsb2coKQotICB7Ci0gICAgLy9YU0RTZXRFeGlzdGluZ1R5cGVEaWFsb2cgZGlhbG9nID0gbmV3IFhTRFNldEV4aXN0aW5nVHlwZURpYWxvZyhjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gICAgLy9yZXR1cm4gZGlhbG9nOwotICAgIFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSBkaWFsb2dEZWxlZ2F0ZSA9IG5ldyBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUoWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlLlRZUEVfTUVUQV9OQU1FLCBjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gICAgcmV0dXJuIGRpYWxvZ0RlbGVnYXRlOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGdldENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRIaXN0b3J5KCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBpbXBsZW1lbnQgdGhpcyBwcm9wZXJseSAtIHNob3VsZCB0aGlzIGhpc3RvcnkgYmUgZ2xvYmFsIG9yIGxvY2FsIHRvIGVhY2ggZWRpdG9yPwotICAgIC8vIFRoaXMgaXMgc29tZXRoaW5nIHdlIHNob3VsZCBwbGF5IGFyb3VuZCB3aXRoIG91cnNlbHZlcyB0byBzZWUgd2hhdCBmZWVscyByaWdodC4KLSAgICAvLwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlc3VsdFtdID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb25bbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXROZXdEaWFsb2coKQotICB7Ci0gICAgTmV3VHlwZURpYWxvZyByZXN1bHQgPSBudWxsOwotICAgIGlmIChzY2hlbWFzLmxlbmd0aCA+IDApIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBOZXdUeXBlRGlhbG9nKHNjaGVtYXNbMF0pOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBOZXdUeXBlRGlhbG9nKCk7Ci0gICAgfQotICAgIGlmIChyZWZlcmVuY2VyIGluc3RhbmNlb2YgSUZpZWxkKQotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpcmVmZXJlbmNlcjsKLSAgICAgIGlmIChYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLmVxdWFscyhmaWVsZC5nZXRLaW5kKCkpKQotICAgICAgewotICAgICAgICByZXN1bHQuYWxsb3dDb21wbGV4VHlwZShmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgZmllbGROYW1lID0gZmllbGQuZ2V0TmFtZSgpOwotICAgICAgaWYgKGZpZWxkTmFtZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIGZpZWxkTmFtZSA9IGZpZWxkTmFtZS50cmltKCk7Ci0gICAgICAgIGlmIChmaWVsZE5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgICB7ICAKLSAgICAgICAgICByZXN1bHQuc2V0RGVmYXVsdE5hbWUoTkxTLmJpbmQoTWVzc2FnZXMuX1VJX1ZBTFVFX05FV19UWVBFLCBmaWVsZE5hbWUpKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0UXVpY2tQaWNrcygpCi0gIHsKLSAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgLy8gVE9ETyAoY3MpIGltcGxlbWVudCB0aGlzIHByb3Blcmx5IC0gd2Ugc2hvdWxkIGJlIHByb3ZpZGluZyBhIGxpc3Qgb2YgdGhlIAotICAgIC8vIG1vc3QgJ2NvbW1vbicgYnVpbHQgaW4gc2NoZW1hIHR5cGVzIGhlcmUKLSAgICAvLyBJIGJlbGlldmUgVHJ1bmcgd2lsbCBiZSB3b3JraW5nIG9uIGEgcGVyZmVyZW5jZSBwYWdlIHRvIGdpdmUgdXMgdGhpcyBsaXN0Ci0gICAgLy8gZm9yIG5vdyBsZXQncyBoYXJkIGNvZGUgc29tZSB2YWx1ZXMKLSAgICAvLwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJib29sZWFuIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0gICAgbGlzdC5hZGQobmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAiZGF0ZSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImRhdGVUaW1lIiwgbnVsbCkpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImRvdWJsZSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImZsb2F0IiwgbnVsbCkpOyAgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImhleEJpbmFyeSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImludCIsIG51bGwpKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJ0aW1lIiwgbnVsbCkpOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHJlc3VsdCA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSBudWxsOwotICAgIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgewotICAgICAgQWRhcHRlciBhZHBhdGVyID0gKEFkYXB0ZXIpcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgICBpZiAoYWRwYXRlci5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudClhZHBhdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSByZWZlcmVuY2luZ09iamVjdDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgeyAgCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5nZXROYW1lKCkgPT0gbnVsbCAvLyBUaGlzIG1lYW5zIHdlIHNldCB0byBhbm9ueW1vdXMgdHlwZQotICAgICAgICAJCSYmIGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbmNyZXRlQ29tcG9uZW50OwotICAgICAgICAgIC8vIFRPRE8gKGNzKSB3ZSBzaG91bGQgdXNlIGFjdGlvbnMgaGVyZSBzbyB0aGF0IFVORE8vUkVETyBjYW4gd29yayBuaWNlbHkKLSAgICAgICAgICAvLyB3aXRoIHRoZSBwcm9wZXIgdW5kbyBkZXNjcmlwdGlvbnMKLSAgICAgICAgICBpZiAoY29tcG9uZW50LmdldE1ldGFOYW1lKCkgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IGZhY3RvcnkuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7ICAgICAgICAgICAgCi0JICAJICAgICAgZWxlbWVudERlY2xhcmF0aW9uLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgCSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IGZhY3RvcnkuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgCSAgc2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oCi0gICAgICAgIAkgICAgZWxlbWVudERlY2xhcmF0aW9uLmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciKSApOyAvLyROT04tTkxTLTEkCi0gIAkgIAkgICAgZWxlbWVudERlY2xhcmF0aW9uLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHNpbXBsZVR5cGUpOwotICAgICAgICAgIH0KLQkJICAgICAgZWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKTsgLy9UT0RPIHVzZSBleHRlcm5hbCBsaXRlcmFsIHN0cmluZwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFLCBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXROYW1lVG9BZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgdGQgPSBjb21tYW5kLmdldENyZWF0ZWRDb21wbGV4VHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIHRkID0gY29tbWFuZC5nZXRDcmVhdGVkU2ltcGxlVHlwZSgpOwotICAgICAgICB9ICAKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIHRkKTsKLSAgICAgICAgICBjb21tYW5kLnNldExhYmVsKE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VUX1RZUEUpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgfSAgCi0gICAgICBlbHNlCi0gICAgICB7ICAKLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZVR5cGVSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldFF1YWxpZmllcigpLCBjb21wb25lbnQuZ2V0RmlsZSgpKTsKLSAgICAgICAgY29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9UWVBFKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0RvdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvRG90LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwYmIyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvRG90LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HZW5lcmF0ZUR0ZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVEdGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzU4YzFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HZW5lcmF0ZUR0ZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVKYXZhLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HZW5lcmF0ZUphdmEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc1YzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HZW5lcmF0ZUphdmEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0dyYXBoVmlld0VsZW1lbnRSZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0dyYXBoVmlld0VsZW1lbnRSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM1ZGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HcmFwaFZpZXdFbGVtZW50UmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9OZXdYU0QucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL05ld1hTRC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNGNhZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL05ld1hTRC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvUmVnZXhXaXphcmRBcnJvdy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvUmVnZXhXaXphcmRBcnJvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTUwYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1JlZ2V4V2l6YXJkQXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1RyaWFuZ2xlVG9vbEJhci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvVHJpYW5nbGVUb29sQmFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzN2ViNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvVHJpYW5nbGVUb29sQmFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9WYWxpZGF0ZVhTRC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvVmFsaWRhdGVYU0QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9WYWxpZGF0ZVhTRC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDc0ZTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFubm90YXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbm5vdGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTA4YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFubm90YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbnkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOWY5M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFueS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbnlBdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjgwY2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbnlBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFwcEluZm8uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFwcEluZm8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGEwMDFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBcHBJbmZvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4NDYyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OWZhOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNjVhZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWJhODI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRENvbXBsZXhDb250ZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDb21wbGV4Q29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYzY4ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRENvbXBsZXhDb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDb21wbGV4VHlwZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdmODUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDb21wbGV4VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERGF0ZUFuZFRpbWVUeXBlcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERGF0ZUFuZFRpbWVUeXBlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERhdGVBbmRUaW1lVHlwZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERvYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERG9jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0OWEwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERG9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RFbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERWxlbWVudFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERWxlbWVudFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWFjZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREVsZW1lbnRSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREV4dGVuc2lvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERXh0ZW5zaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmYjgwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERXh0ZW5zaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RGaWVsZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERmllbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzhlNDNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RGaWVsZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDBmMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER2xvYmFsQXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNDlkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER2xvYmFsQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHbG9iYWxFbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHbG9iYWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER2xvYmFsRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER3JvdXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1ZWY1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdyb3VwUmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YTdmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdyb3VwUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RJbXBvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREltcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDRjZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREltcG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNESW5jbHVkZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNESW5jbHVkZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmM1MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREluY2x1ZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREtleS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNES2V5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwMzJhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNES2V5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RLZXlSZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREtleVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNTgyOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREtleVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNETm90YXRpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRE5vdGF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5ZGY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNETm90YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRE51bWJlclR5cGVzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0ROdW1iZXJUeXBlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMzQyMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRE51bWJlclR5cGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RSZWRlZmluZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEUmVkZWZpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk2NGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RSZWRlZmluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2VsZWN0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNlbGVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5OWE1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2VsZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjNmOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVDb250ZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVDb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmMzhkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlRW51bS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlRW51bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDc5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUVudW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUxpc3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUxpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDhlNzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVQYXR0ZXJuLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExM2NmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlUGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlUmVzdHJpY3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVJlc3RyaWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiYzEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlUmVzdHJpY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWYzM2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlRm9yRWRpdFBhcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVR5cGVGb3JFZGl0UGFydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZWZlYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVR5cGVGb3JFZGl0UGFydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlVW5pb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVVuaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyYWRhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlVW5pb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFVuaXF1ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEVW5pcXVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4YTY1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEVW5pcXVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9hcHBpbmZvX2Jyb3dzZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYXBwaW5mb19icm93c2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY5YmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9hcHBpbmZvX2Jyb3dzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYXBwaW5mb19jYXRlZ29yeS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYXBwaW5mb19jYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjY1ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2FwcGluZm9fY2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2JhY2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2JhY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQxYTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9icm93c2VidXR0b24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGFlNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZXJyb3Jfc3Rfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9lcnJvcl9zdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM2MDY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9lcnJvcl9zdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2ZvcndhcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWI2OTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9mb3J3YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9nZW5lcmF0ZV94bWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2dlbmVyYXRlX3htbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZTM2MzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2dlbmVyYXRlX3htbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcXVpY2thc3Npc3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3F1aWNrYXNzaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhZTJhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcXVpY2thc3Npc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3JlZ3hfd2l6LnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9yZWd4X3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMTQ3N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3JlZ3hfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9yZWxvYWRncmFtbWFyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9yZWxvYWRncmFtbWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwNWRiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvc29ydC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvc29ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjVkYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3NvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3htbGNhdGFsb2dfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy94bWxjYXRhbG9nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTQ0MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3htbGNhdGFsb2dfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZDVlYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1VSV9MQUJFTF9CQVNFX1RZUEUgPSBCYXNlIFR5cGU6Ci1VSV9MQUJFTF9ERVJJVkVEX0JZID0gRGVyaXZlZCBCeToKLQotVUlfTEFCRUxfSU5IRVJJVF9GUk9NID0gSW5oZXJpdCBGcm9tOgotVUlfTEFCRUxfSU5IRVJJVF9CWSA9IEluaGVyaXQgQnk6Ci0KLVVJX0xBQkVMX0RPQ1VNRU5UQVRJT04gPSBEb2N1bWVudGF0aW9uCi1VSV9MQUJFTF9BUFBfSU5GTyA9IEFwcCBJbmZvCi0KLVVJX0xBQkVMX1NFVF9UWVBFID0gU2V0IFR5cGUKLVVJX0xBQkVMX1RZUEUgPSBUeXBlOgotCi1VSV9MQUJFTF9OQU1FID0gTmFtZToKLQotVUlfTEFCRUxfS0lORCA9IEtpbmQ6Ci0KLVVJX0xBQkVMX01JTk9DQ1VSUyA9IE1pbmltdW0gT2NjdXJyZW5jZToKLVVJX0xBQkVMX01BWE9DQ1VSUyA9IE1heGltdW0gT2NjdXJyZW5jZToKLQotVUlfUEFHRV9IRUFESU5HX1JFRkVSRU5DRSA9IFJlZmVyZW5jZQotVUlfTEFCRUxfUkVBRF9PTkxZID0gcmVhZC1vbmx5Ci0KLVVJX05PX1RZUEUgPSBObyBUeXBlCi0KLVVJX0xBQkVMX0NPTVBPTkVOVFMJCQkJPSBDb21wb25lbnRzOgotCi0hIEFkZGl0aW9uYWwgQ2F0ZWdvcmllcwotX1VJX0dSQVBIX1RZUEVTICAgICAgICAgICAgICAgID0gVHlwZXMKLV9VSV9HUkFQSF9FTEVNRU5UUyAgICAgICAgICAgICA9IEVsZW1lbnRzCi1fVUlfR1JBUEhfQVRUUklCVVRFUyAgICAgICAgICAgPSBBdHRyaWJ1dGVzCi1fVUlfR1JBUEhfQVRUUklCVVRFX0dST1VQUyAgICAgPSBBdHRyaWJ1dGUgR3JvdXBzCi1fVUlfR1JBUEhfTk9UQVRJT05TICAgICAgICAgICAgPSBOb3RhdGlvbnMKLV9VSV9HUkFQSF9JREVOVElUWV9DT05TVFJBSU5UUyA9IElkZW50aXR5IENvbnN0cmFpbnRzCi1fVUlfR1JBUEhfQU5OT1RBVElPTlMgICAgICAgICAgPSBBbm5vdGF0aW9ucwotX1VJX0dSQVBIX0RJUkVDVElWRVMgICAgICAgICAgID0gRGlyZWN0aXZlcwotX1VJX0dSQVBIX0dST1VQUyAgICAgICAgICAgICAgID0gR3JvdXBzCi0KLV9VSV9MQUJFTF9OT19MT0NBVElPTl9TUEVDSUZJRUQgID0gTm8gTG9jYXRpb24gU3BlY2lmaWVkCi1fVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFkJCSA9IFNldCBNdWx0aXBsaWNpdHkKLV9VSV9MQUJFTF9BQlNFTlQgICAgICAgICAgICAgICA9IGFic2VudAotX1VJX0dSQVBIX1VOS05PV05fT0JKRUNUICAgICAgID0gVW5rbm93biBvYmplY3QKLV9VSV9HUkFQSF9YU0RTQ0hFTUFfTk9fTkFNRVNQQUNFID0gKG5vIHRhcmdldCBuYW1lc3BhY2Ugc3BlY2lmaWVkKQotX1VJX0dSQVBIX1hTRFNDSEVNQSAgICAgICAgICAgID0gU2NoZW1hCi1fVUlfTUVOVV9YU0RfRURJVE9SICAgICAgICAgICAgICAgICA9ICZYU0QKLV9VSV9MQUJFTF9TRVRfVFlQRQkJCQkgICAgPSBTZXQgVHlwZQotCi0hCi0hIFByZWZlcmVuY2UgUGFnZQotIQotX1VJX1RFWFRfSU5ERU5UX0xBQkVMICAgICAgICAgICAgICAgICA9IEluZGVudGF0aW9uCi1fVUlfVEVYVF9JTkRFTlRfU1BBQ0VTX0xBQkVMICAgICAgICAgID0gJk51bWJlciBvZiBzcGFjZXM6IAotX1VJX1RFWFRfWFNEX05BTUVTUEFDRV9QUkVGSVggICAgICAgICA9IFhNTCBzY2hlbWEgbGFuZ3VhZ2UKLV9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTksgPSBOb3RlIHRoYXQgc29tZSBwcmVmZXJlbmNlcyBtYXkgYmUgc2V0IG9uIHRoZSA8YT57MH08L2E+IHByZWZlcmVuY2UgcGFnZS4KLV9VSV9URVhUX1hTRF9ERUZBVUxUX1BSRUZJWCAgICAgICAgICAgPSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgJnByZWZpeDoKLV9VSV9RVUFMSUZZX1hTRCAgICAgICAgICAgICAgICAgICAgICAgPSAmUXVhbGlmeSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMKLV9VSV9URVhUX1hTRF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSBEZWZhdWx0IFRhcmdldCBOYW1lc3BhY2U6Ci1fVUlfVkFMSURBVElOR19GSUxFUyAgICAgICAgICAgICAgICAgID0gVmFsaWRhdGluZyBmaWxlcwotX1VJX1RFWFRfSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TICA9IEhvbm91ciBhbGwgc2NoZW1hIGxvY2F0aW9ucwotX1VJX0ZVTExfQ09ORk9STUFOQ0UgICAgICAgICAgICAgICAgICA9IENoZWNrIGZ1bGwgWE1MIFNjaGVtYSBjb25mb3JtYW5jZQotX1VJX1RFWFRfRU5BQkxFX0FVVE9fSU1QT1JUX0NMRUFOVVAgICA9IEF1dG9tYXRpY2FsbHkgcmVtb3ZlIHVudXNlZCBYU0QgaW1wb3J0cyBhbmQgWE1MIE5hbWVzcGFjZSBlbnRyaWVzCi1fVUlfVEVYVF9FTkFCTEVfQVVUT19PUEVOX1NDSEVNQV9ESUFMT0cgPSBBdXRvbWF0aWNhbGx5IHByb21wdCBmb3Igc2NoZW1hIGxvY2F0aW9uIHdoZW4gYWRkaW5nIGEgZGlyZWN0aXZlCi0KLV9FUlJPUl9MQUJFTF9JTlZBTElEX1BSRUZJWCAgICAgPSBJV0FYMTAwNEUgSW52YWxpZCBwcmVmaXguIEEgcHJlZml4IG11c3Qgbm90IGJlIGVtcHR5IG9yIGNvbnRhaW4gYW55IHNwYWNlLgotCi1fVUlfTk9fVFlQRV9ERUZJTkVEPShubyB0eXBlIGRlZmluZWQpCi1fVUlfQUNUSU9OX1VQREFURV9OQU1FPVVwZGF0ZSBOYW1lCi1fVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRT1VcGRhdGUgRWxlbWVudCByZWZlcmVuY2UKLV9VSV9BQ1RJT05fVVBEQVRFX0FUVFJJQlVURV9SRUZFUkVOQ0U9VXBkYXRlIEF0dHJpYnV0ZSByZWZlcmVuY2UKLV9VSV9BQ1RJT05fQUREX0ZJRUxEPUFkZCBGaWVsZAotX1VJX0FDVElPTl9BRERfRUxFTUVOVD1BZGQgRWxlbWVudAotX1VJX0FDVElPTl9BRERfRUxFTUVOVF9CRUZPUkU9QWRkIEVsZW1lbnQgQmVmb3JlCi1fVUlfQUNUSU9OX0FERF9FTEVNRU5UX0FGVEVSPUFkZCBFbGVtZW50IEFmdGVyCi1fVUlfQUNUSU9OX0FERF9JTkNMVURFPUFkZCBJbmNsdWRlCi1fVUlfQUNUSU9OX0FERF9JTVBPUlQ9QWRkIEltcG9ydAotX1VJX0FDVElPTl9BRERfUkVERUZJTkU9QWRkIFJlZGVmaW5lCi1fVUlfQUNUSU9OX0FERF9FTEVNRU5UX1JFRj1BZGQgRWxlbWVudCBSZWYKLV9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRT1BZGQgQ29tcGxleCBUeXBlCi1fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRT1BZGQgU2ltcGxlIFR5cGUKLV9VSV9BQ1RJT05fU0VUX1RZUEU9U2V0IFR5cGUKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURT1BZGQgQXR0cmlidXRlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfQkVGT1JFPUFkZCBBdHRyaWJ1dGUgQmVmb3JlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfQUZURVI9QWRkIEF0dHJpYnV0ZSBBZnRlcgotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRj1BZGQgQXR0cmlidXRlIFJlZgotX1VJX0FDVElPTl9ORVc9TmV3Li4uCi1fVUlfQUNUSU9OX0JST1dTRT1Ccm93c2UuLi4KLQotX1VJX0xBQkVMX09QVElPTkFMPU9wdGlvbmFsCi1fVUlfTEFCRUxfWkVST19PUl9NT1JFPVplcm8gb3IgbW9yZQotX1VJX0xBQkVMX09ORV9PUl9NT1JFPU9uZSBvciBtb3JlCi1fVUlfTEFCRUxfTE9DQUxfVFlQRT1sb2NhbCB0eXBlCi1fVUlfTEFCRUxfUkVRVUlSRUQ9UmVxdWlyZWQKLV9VSV9MQUJFTF9BUlJBWT1hcnJheQotCi1fVUlfTEFCRUxfU0VUX0NPTU1PTl9CVUlMVF9JTl9UWVBFUz1TZXQgY29tbW9uIEJ1aWx0LUluIHR5cGVzCi1fVUlfTEFCRUxfU0VMRUNUX1RZUEVTX0ZJTFRFUl9PVVQ9U2VsZWN0IHRoZSB0eXBlcyB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byBmaWx0ZXIgb3V0OiAKLV9VSV9MQUJFTF9OQU1FX1NFQVJDSF9GSUxURVJfVEVYVD1OYW1lICg/ID0gYW55IGNoYXJhY3RlciwgKiA9IGFueSBzdHJpbmcpOgotX1VJX0xBQkVMX1NFVF9FTEVNRU5UX1JFRkVSRU5DRT1TZXQgZWxlbWVudCByZWZlcmVuY2UKLV9VSV9MQUJFTF9TRVRfQVRUUklCVVRFX1JFRkVSRU5DRT1TZXQgYXR0cmlidXRlIHJlZmVyZW5jZQotCi1fVUlfTEFCRUxfTkVXX1RZUEU9TmV3IFR5cGUKLV9VSV9WQUxVRV9ORVdfVFlQRT17MH1UeXBlCi1fVUlfTEFCRUxfTkVXX0VMRU1FTlQ9TmV3IEVsZW1lbnQKLV9VSV9MQUJFTF9ORVdfQVRUUklCVVRFPU5ldyBBdHRyaWJ1dGUKLV9VSV9MQUJFTF9DT01QTEVYX1RZUEU9Q29tcGxleCBUeXBlCi1fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRT1UYXJnZXQgTmFtZXNwYWNlOiAKLV9VSV9MQUJFTF9OT19OQU1FU1BBQ0U9Tm8gTmFtZXNwYWNlCi1fVUlfTEFCRUxfRUxFTUVOVFNfQ09MT049RWxlbWVudHM6Ci1fVUlfTEFCRUxfQVRUUklCVVRFU19DT0xPTj1BdHRyaWJ1dGVzOgotX1VJX0xBQkVMX1NJTVBMRV9UWVBFPVNpbXBsZSBUeXBlCi1fVUlfTEFCRUxfVFlQRVNfQ09MT049VHlwZXM6Ci0KLV9VSV9MQUJFTF9TT1VSQ0U9U291cmNlCi0KLV9VSV9MQUJFTF9FTEVNRU5URk9STURFRkFVTFQ9UHJlZml4IHF1YWxpZmljYXRpb24gb2YgbG9jYWwgZWxlbWVudHM6Ci1fVUlfTEFCRUxfQVRUUklCVVRFRk9STURFRkFVTFQ9UHJlZml4IHF1YWxpZmljYXRpb24gb2YgYXR0cmlidXRlczoKLV9VSV9MQUJFTF9DUkVBVEVfQU5PTl9UWVBFPUNyZWF0ZSBhcyBsb2NhbCBhbm9ueW1vdXMgdHlwZQotCi1fVUlfTEFCRUxfQVRUUklCVVRFU19QUk9DRVNTQ09OVEVOVFM9UHJvY2VzcyBDb250ZW50czoKLV9VSV9MQUJFTF9BVFRSSUJVVEVTX05BTUVTUEFDRT1OYW1lc3BhY2U6CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL0lYU0RUeXBlc0ZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9JWFNEVHlwZXNGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzYzYyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL0lYU0RUeXBlc0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDsKLQotcHVibGljIGludGVyZmFjZSBJWFNEVHlwZXNGaWx0ZXIgewkKLQkvKioKLQkgKiBHaXZlIG1lIGFuIE9iamVjdCBvLCBpZiBJIGtub3cgaXQgYW5kIGl0IHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQsIEkgd2lsbCAKLQkgKiByZXR1cm4gdHJ1ZS4gT3RoZXJ3aXNlIEknbGwgcmV0dXJuIGZhbHNlLCBldmVuIGlmIEkgZG9uJ3Qga25vdyB0aGUgb2JqZWN0IAotCSAqIEBwYXJhbSBvCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEZpbHRlck91dChPYmplY3Qgbyk7Ci0JCi0JcHVibGljIHZvaWQgdHVybk9uKCk7Ci0JcHVibGljIHZvaWQgdHVybk9mZigpOwotCXB1YmxpYyBib29sZWFuIGlzT24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEQXR0cmlidXRlU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTREF0dHJpYnV0ZVNlYXJjaExpc3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzRmYTEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEQXR0cmlidXRlU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlU2VhcmNoTGlzdFByb3ZpZGVyIGV4dGVuZHMgWFNEU2VhcmNoTGlzdFByb3ZpZGVyCi17Ci0KLSAgcHVibGljIFhTREF0dHJpYnV0ZVNlYXJjaExpc3RQcm92aWRlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHN1cGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSkKLSAgewotICAgIC8vIG5vdyB3ZSB0cmF2ZXJzZSB0aGUgdHlwZXMgYWxyZWFkeSBkZWZpbmVkIHdpdGhpbiB0aGUgdmlzaWJsZSBzY2hlbWFzCi0gICAgLy8gd2UgZG8gdGhpcyBpbiBhZGRpdGlvbiB0byB0aGUgY29tcG9uZW50IHNlYXJjaCBzaW5jZSB0aGlzIHNob3VsZCBleGVjdXRlCi0gICAgLy8gdmVyeSBxdWlja2x5IGFuZCB0aGVyZSdzIGEgZ29vZCBjaGFuY2UgdGhlIHVzZXIgd2FudHMgdG8gc2VsZWN0IGEgdGltZSB0aGF0J3MgCi0gICAgLy8gYWxyZWFkeSBpbXBvcnRlZC9pbmNsdWRlZAotICAgIC8vIFRPRE8gKGNzKSBlbnN1cmUgd2UgZG9uJ3QgYWRkIGR1cGxpY2F0ZXMgd2hlbiB3ZSBwcm9jZWVkIHRvIHVzZSB0aGUgc2VhcmNoIGxpc3QKLSAgICAvLwotICAgIExpc3QgdmlzaXRlZFNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBzY2hlbWFzW2ldOwotICAgICAgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IgdmlzaXRvciA9IG5ldyBDb21wb25lbnRDb2xsZWN0aW5nWFNEVmlzaXRvcihsaXN0LCBJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRBX05BTUUpOwotICAgICAgdmlzaXRvci52aXNpdFNjaGVtYShzY2hlbWEsIHRydWUpOwotICAgICAgdmlzaXRlZFNjaGVtYXMuYWRkQWxsKHZpc2l0b3IuZ2V0VmlzaXRlZFNjaGVtYXMoKSk7Ci0gICAgfQotICAgIC8vIGZpbmFsbHkgd2UgY2FsbCB0aGUgc2VhcmNoIEFQSSdzIHRvIGRvIGEgcG90ZW50aWFsbHkgc2xvdyBzZWFyY2gKLSAgICBpZiAoc2NvcGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwb3B1bGF0ZUNvbXBvbmVudExpc3RVc2luZ1NlYXJjaChsaXN0LCBzY29wZSwgcG0sIGNyZWF0ZUZpbGVNYXAodmlzaXRlZFNjaGVtYXMpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0VXNpbmdTZWFyY2goSUNvbXBvbmVudExpc3QgbGlzdCwgU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcG0sIEhhc2hNYXAgZmlsZXMpCi0gIHsKLSAgICBTZWFyY2hFbmdpbmUgc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgIEludGVybmFsU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBJbnRlcm5hbFNlYXJjaFJlcXVlc3RvcihsaXN0LCBmaWxlcyk7Ci0gICAgZmluZE1hdGNoZXMoc2VhcmNoRW5naW5lLCByZXF1ZXN0b3IsIHNjb3BlLCBJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRBX05BTUUpOwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjZDMyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIKLXsKLSAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgaWYgdGhpcyBwcm92aWRlciBpcyB1c2VkIGluIGEgbXVsdGkgbGFuZ3VhZ2UgY29udGV4dAotICAgIC8vIHdlJ2xsIG5lZWQgdG8gcHJvdmlkZSBzb21lIGxvZ2ljIGhlcmUKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIFNJTVBMRV9UWVBFX0lNQUdFID0gIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2UgQ09NUExFWF9UWVBFX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RDb21wbGV4VHlwZS5naWYiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2UgRUxFTUVOVF9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERWxlbWVudC5naWYiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2UgQVRUUklCVVRFX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIik7Ci0gIC8vcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW1hZ2UgQlVJTFRfSU5fVFlQRSlJTUFHRSA9IAotICAgIAotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcihPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pCi0gICAgewotICAgICAgcmVzdWx0ID0gKChDb21wb25lbnRTcGVjaWZpY2F0aW9uKWNvbXBvbmVudCkuZ2V0UXVhbGlmaWVyKCk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChYU0ROYW1lZENvbXBvbmVudCljb21wb25lbnQpLmdldFRhcmdldE5hbWVzcGFjZSgpOyAKLSAgICB9ICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTZWFyY2hNYXRjaCkKLSAgICB7Ci0gICAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSBnZXRRdWFsaWZpZWROYW1lRm9yU2VhcmNoTWF0Y2goKFNlYXJjaE1hdGNoKWNvbXBvbmVudCk7Ci0gICAgICBpZiAocXVhbGlmaWVkTmFtZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9IHF1YWxpZmllZE5hbWUuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICB9ICAgIAotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIC8vIFRPRE8uLi4gdGhpcyB3aWxsIGJlIG11Y2ggZWFzaWVyIHdpdGggSGlyb3NoaSdzIHByb3Bvc2VkIFNlYXJjaE1hdGNoIGNoYW5nZXMKLSAgLy8KLSAgcHJpdmF0ZSBRdWFsaWZpZWROYW1lIGdldFF1YWxpZmllZE5hbWVGb3JTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkKLSAgewotICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IG51bGw7Ci0gICAgT2JqZWN0IG8gPSBtYXRjaC5tYXAuZ2V0KCJuYW1lIik7Ci0gICAgaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSkKLSAgICB7ICAKLSAgICAgIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSlvOwotICAgIH0gICAgICAKLSAgICByZXR1cm4gcXVhbGlmaWVkTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pCi0gICAgewotICAgICAgcmVzdWx0ID0gKChDb21wb25lbnRTcGVjaWZpY2F0aW9uKWNvbXBvbmVudCkuZ2V0TmFtZSgpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoWFNETmFtZWRDb21wb25lbnQpY29tcG9uZW50KS5nZXROYW1lKCk7IAotICAgIH0gIAotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFNlYXJjaE1hdGNoKQotICAgIHsKLSAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IGdldFF1YWxpZmllZE5hbWVGb3JTZWFyY2hNYXRjaCgoU2VhcmNoTWF0Y2gpY29tcG9uZW50KTsKLSAgICAgIGlmIChxdWFsaWZpZWROYW1lICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gcXVhbGlmaWVkTmFtZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIH0gICAgCi0gICAgfSAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZShPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgSUZpbGUgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgQ29tcG9uZW50U3BlY2lmaWNhdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKENvbXBvbmVudFNwZWNpZmljYXRpb24pY29tcG9uZW50KS5nZXRGaWxlKCk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgU2VhcmNoTWF0Y2gpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChTZWFyY2hNYXRjaCljb21wb25lbnQpLmdldEZpbGUoKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCljb21wb25lbnQ7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE8gKGNzKSByZXZpc2l0IGFuZCB0ZXN0IG1vcmUKLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gc2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBwbGF0Zm9ybVJlc291cmNlID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7Ci0gICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsICYmIGxvY2F0aW9uLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXNvdXJjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbi5zdWJzdHJpbmcocGxhdGZvcm1SZXNvdXJjZS5sZW5ndGgoKSkpOwotICAgICAgICAgIHJlc3VsdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgU3RyaW5nIG5hbWUgPSBnZXROYW1lKGVsZW1lbnQpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ICs9IG5hbWU7Ci0gICAgICAvKgotICAgICAgU3RyaW5nIHF1YWxpZmllciA9IGdldFF1YWxpZmllcihlbGVtZW50KTsKLSAgICAgIGlmIChxdWFsaWZpZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgLSAiICsgcXVhbGlmaWVyOwotICAgICAgfSAgCi0gICAgICBJRmlsZSBmaWxlID0gZ2V0RmlsZShlbGVtZW50KTsKLSAgICAgIGlmIChmaWxlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCArPSAiICAoIiArIGZpbGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIpIjsKLSAgICAgIH0qLyAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgSW1hZ2UgcmVzdWx0ID0gbnVsbDsgCi0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFNlYXJjaE1hdGNoKQotICAgIHsKLSAgICAgIFNlYXJjaE1hdGNoIHNlYXJjaE1hdGNoID0gKFNlYXJjaE1hdGNoKWNvbXBvbmVudDsKLSAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IChRdWFsaWZpZWROYW1lKXNlYXJjaE1hdGNoLm1hcC5nZXQoIm1ldGFOYW1lIik7Ci0gICAgICBpZiAoIHF1YWxpZmllZE5hbWUgIT0gbnVsbCApewotICAgIAkgIGlmICggcXVhbGlmaWVkTmFtZS5lcXVhbHMoSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUpKQotICAgIAkJICByZXN1bHQgPSBTSU1QTEVfVFlQRV9JTUFHRTsKLSAgICAJICBlbHNlIGlmICggcXVhbGlmaWVkTmFtZS5lcXVhbHMoSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FKSkKLSAgICAJCSAgcmVzdWx0ID0gQ09NUExFWF9UWVBFX0lNQUdFOwotICAgIAkgIGVsc2UgaWYgKCBxdWFsaWZpZWROYW1lLmVxdWFscyhJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FKSkKLSAgICAJCSAgcmVzdWx0ID0gRUxFTUVOVF9JTUFHRTsKLSAgICAJICBlbHNlIGlmICggcXVhbGlmaWVkTmFtZS5lcXVhbHMoSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FKSkKLSAgICAJICAgIHJlc3VsdCA9IEFUVFJJQlVURV9JTUFHRTsKLSAgICAgIH0KLSAgICB9ICAgICAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgcmVzdWx0ID0gQ09NUExFWF9UWVBFX0lNQUdFOyAgICAgIAotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgcmVzdWx0ID0gU0lNUExFX1RZUEVfSU1BR0U7Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgcmVzdWx0ID0gRUxFTUVOVF9JTUFHRTsKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHJlc3VsdCA9IEFUVFJJQlVURV9JTUFHRTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEZpbGVJY29uKE9iamVjdCBjb21wb25lbnQpIHsKLQlyZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RGaWxlLmdpZiIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTREVsZW1lbnRzU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTREVsZW1lbnRzU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NDA0MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RFbGVtZW50c1NlYXJjaExpc3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2g7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIgZXh0ZW5kcyBYU0RTZWFyY2hMaXN0UHJvdmlkZXIKLXsKLSAgcHVibGljIFhTREVsZW1lbnRzU2VhcmNoTGlzdFByb3ZpZGVyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0KElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICB7Ci0gICAgLy8gbm93IHdlIHRyYXZlcnNlIHRoZSB0eXBlcyBhbHJlYWR5IGRlZmluZWQgd2l0aGluIHRoZSB2aXNpYmxlIHNjaGVtYXMKLSAgICAvLyB3ZSBkbyB0aGlzIGluIGFkZGl0aW9uIHRvIHRoZSBjb21wb25lbnQgc2VhcmNoIHNpbmNlIHRoaXMgc2hvdWxkIGV4ZWN1dGUKLSAgICAvLyB2ZXJ5IHF1aWNrbHkgYW5kIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGUgdXNlciB3YW50cyB0byBzZWxlY3QgYSB0aW1lIHRoYXQncyAKLSAgICAvLyBhbHJlYWR5IGltcG9ydGVkL2luY2x1ZGVkCi0gICAgLy8gVE9ETyAoY3MpIGVuc3VyZSB3ZSBkb24ndCBhZGQgZHVwbGljYXRlcyB3aGVuIHdlIHByb2NlZWQgdG8gdXNlIHRoZSBzZWFyY2ggbGlzdAotICAgIC8vCi0gICAgTGlzdCB2aXNpdGVkU2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IHNjaGVtYXNbaV07Ci0gICAgICBDb21wb25lbnRDb2xsZWN0aW5nWFNEVmlzaXRvciB2aXNpdG9yID0gbmV3IENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yKGxpc3QsIElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpOwotICAgICAgdmlzaXRvci52aXNpdFNjaGVtYShzY2hlbWEsIHRydWUpOwotICAgICAgdmlzaXRlZFNjaGVtYXMuYWRkQWxsKHZpc2l0b3IuZ2V0VmlzaXRlZFNjaGVtYXMoKSk7Ci0gICAgfQotICAgIC8vIGZpbmFsbHkgd2UgY2FsbCB0aGUgc2VhcmNoIEFQSSdzIHRvIGRvIGEgcG90ZW50aWFsbHkgc2xvdyBzZWFyY2gKLSAgICBpZiAoc2NvcGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwb3B1bGF0ZUNvbXBvbmVudExpc3RVc2luZ1NlYXJjaChsaXN0LCBzY29wZSwgcG0sIGNyZWF0ZUZpbGVNYXAodmlzaXRlZFNjaGVtYXMpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0VXNpbmdTZWFyY2goSUNvbXBvbmVudExpc3QgbGlzdCwgU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcG0sIEhhc2hNYXAgZmlsZXMpCi0gIHsKLSAgICBTZWFyY2hFbmdpbmUgc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgIEludGVybmFsU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBJbnRlcm5hbFNlYXJjaFJlcXVlc3RvcihsaXN0LCBmaWxlcyk7Ci0gICAgZmluZE1hdGNoZXMoc2VhcmNoRW5naW5lLCByZXF1ZXN0b3IsIHNjb3BlLCBJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjJkYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLlNjb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSBpbXBsZW1lbnRzIElDb21wb25lbnREaWFsb2cKLXsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIFRZUEVfTUVUQV9OQU1FID0gbmV3IFF1YWxpZmllZE5hbWUoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAidHlwZSIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBFTEVNRU5UX01FVEFfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgQVRUUklCVVRFX01FVEFfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0gIC8vIHByb3RlY3RlZCBPYmplY3Qgc2V0T2JqZWN0OwotICBwcm90ZWN0ZWQgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzZWxlY3Rpb247Ci0gIHByb3RlY3RlZCBJRmlsZSBjdXJyZW50RmlsZTsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYVtdIHNjaGVtYXM7Ci0gIHByb3RlY3RlZCBRdWFsaWZpZWROYW1lIG1ldGFOYW1lOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93Q29tcGxleFR5cGVzID0gdHJ1ZTsKLQotICBwdWJsaWMgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKFF1YWxpZmllZE5hbWUgbWV0YU5hbWUsIElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLm1ldGFOYW1lID0gbWV0YU5hbWU7Ci0gICAgdGhpcy5jdXJyZW50RmlsZSA9IGN1cnJlbnRGaWxlOwotICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRTZWxlY3RlZENvbXBvbmVudCgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24pCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViICAgCi0gIH0KLSAgCi0gIC8qKiAKLSAgICogV2hldGhlciB0byBzaG93IGNvbXBsZXggdHlwZXMgaW4gdGhlIERpYWxvZydzIExpc3QsIGhhcyBubyBlZmZlY3QgaWYgdGhlCi0gICAqIGRpYWxvZyBwb3B1bGF0ZXMgbGlzdCBvZiBlbGVtZW50cyBpbnN0ZWFkIG9mIHR5cGUKLSAgICogQHBhcmFtIHZhbHVlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzaG93Q29tcGxleFR5cGVzKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzaG93Q29tcGxleFR5cGVzID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpCi0gIHsKLSAgICBTaGVsbCBzaGVsbCA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgICBpbnQgcmV0dXJuVmFsdWUgPSBXaW5kb3cuQ0FOQ0VMOwotICAgIFNjb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2cgZGlhbG9nID0gbnVsbDsKLSAgICAKLSAgICAvLyBUT0RPIChjcykgbG90J3Mgb2YgY29kZSBpcyBjb21tb24gdG8gYm90aCB0aGVzZSBibG9ja3MuICBDYW4gd2UgcmUtb3JnIGl0IGEgYml0Ci0gICAgLy8gc28gaXQncyBlYXNpZXIgdG8gc2VlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaG93IHdlIGNvbmZpZyBmb3IgYW4gZWxlbWVudCB2cyB0eXBlPwotICAgIGlmICggbWV0YU5hbWUgPT0gRUxFTUVOVF9NRVRBX05BTUUpCi0gICAgewotICAgIAlYU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGRlc2NyaXB0aW9uUHJvdmlkZXIgPSBuZXcgWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigpOwotICAgIAlmaW5hbCBYU0RFbGVtZW50c1NlYXJjaExpc3RQcm92aWRlciBzZWFyY2hMaXN0UHJvdmlkZXIgPSBuZXcgWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIAlDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uKCk7Ci0gICAgCQotICAgICAgICBjb25maWd1cmF0aW9uLnNldERlc2NyaXB0aW9uUHJvdmlkZXIoZGVzY3JpcHRpb25Qcm92aWRlcik7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0U2VhcmNoTGlzdFByb3ZpZGVyKHNlYXJjaExpc3RQcm92aWRlcik7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmlsdGVyTGFiZWxUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FX1NFQVJDSF9GSUxURVJfVEVYVCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0TGlzdExhYmVsVGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVFNfQ09MT04pOwotLy8gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0TmV3Q29tcG9uZW50SGFuZGxlcihuZXcgTmV3RWxlbWVudEJ1dHRvbkhhbmRsZXIoKSk7Ci0gICAgICAgIC8vVE9ETyBleHRlcm5hbGl6ZSBzdHJpbmcKLSAgICAgICAgZGlhbG9nID0gbmV3IFNjb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2coc2hlbGwsIE1lc3NhZ2VzLl9VSV9MQUJFTF9TRVRfRUxFTUVOVF9SRUZFUkVOQ0UsIGNvbmZpZ3VyYXRpb24pOyAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKCBtZXRhTmFtZSA9PSBBVFRSSUJVVEVfTUVUQV9OQU1FKQotICAgIHsKLSAgICAgIFhTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIgZGVzY3JpcHRpb25Qcm92aWRlciA9IG5ldyBYU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCk7Ci0gICAgICBmaW5hbCBYU0RBdHRyaWJ1dGVTZWFyY2hMaXN0UHJvdmlkZXIgc2VhcmNoTGlzdFByb3ZpZGVyID0gbmV3IFhTREF0dHJpYnV0ZVNlYXJjaExpc3RQcm92aWRlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gICAgICBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uKCk7Ci0gICAgICAKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXREZXNjcmlwdGlvblByb3ZpZGVyKGRlc2NyaXB0aW9uUHJvdmlkZXIpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldFNlYXJjaExpc3RQcm92aWRlcihzZWFyY2hMaXN0UHJvdmlkZXIpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldEZpbHRlckxhYmVsVGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRV9TRUFSQ0hfRklMVEVSX1RFWFQpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldExpc3RMYWJlbFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJJQlVURVNfQ09MT04pOwotICAgICAgICBkaWFsb2cgPSBuZXcgU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyhzaGVsbCwgTWVzc2FnZXMuX1VJX0xBQkVMX1NFVF9BVFRSSUJVVEVfUkVGRVJFTkNFLCBjb25maWd1cmF0aW9uKTsgICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChtZXRhTmFtZSA9PSBUWVBFX01FVEFfTkFNRSkKLSAgICB7Ci0gICAgICBYU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGRlc2NyaXB0aW9uUHJvdmlkZXIgPSBuZXcgWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigpOwotICAgICAgZmluYWwgWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIgc2VhcmNoTGlzdFByb3ZpZGVyID0gbmV3IFhTRFR5cGVzU2VhcmNoTGlzdFByb3ZpZGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgICAgIGlmICghc2hvd0NvbXBsZXhUeXBlcykKLSAgICAgICAgc2VhcmNoTGlzdFByb3ZpZGVyLnNob3dDb21wbGV4VHlwZXMoZmFsc2UpOwotICAgICAKLSAgICAgIENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RGVzY3JpcHRpb25Qcm92aWRlcihkZXNjcmlwdGlvblByb3ZpZGVyKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0U2VhcmNoTGlzdFByb3ZpZGVyKHNlYXJjaExpc3RQcm92aWRlcik7Ci0vLyAgICAgIGNvbmZpZ3VyYXRpb24uc2V0TmV3Q29tcG9uZW50SGFuZGxlcihuZXcgTmV3VHlwZUJ1dHRvbkhhbmRsZXIoKSk7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldEZpbHRlckxhYmVsVGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRV9TRUFSQ0hfRklMVEVSX1RFWFQpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRMaXN0TGFiZWxUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9UWVBFU19DT0xPTik7Ci0gICAgICBkaWFsb2cgPSBuZXcgU2NvcGVkQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZyhzaGVsbCwgTWVzc2FnZXMuX1VJX0xBQkVMX1NFVF9UWVBFLCBjb25maWd1cmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBpZiAoZGlhbG9nICE9IG51bGwpCi0gICAgewotICAgICAgZGlhbG9nLnNldEN1cnJlbnRSZXNvdXJjZShjdXJyZW50RmlsZSk7ICAgICAgCi0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICByZXR1cm5WYWx1ZSA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICBpZiAocmV0dXJuVmFsdWUgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICBzZWxlY3Rpb24gPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldHVyblZhbHVlOwotICB9Ci0KLS8vICBwcml2YXRlIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpCi0vLyAgewotLy8gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotLy8gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0vLyAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLS8vICAgIHJldHVybiBlZGl0b3JQYXJ0OwotLy8gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRFNlYXJjaExpc3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWZlNWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2g7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTRFNlYXJjaExpc3RQcm92aWRlciBpbXBsZW1lbnRzIElDb21wb25lbnRTZWFyY2hMaXN0UHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYVtdIHNjaGVtYXM7Ci0gIHByb3RlY3RlZCBJRmlsZSBjdXJyZW50RmlsZTsKLSAgLy8gVE9ETyAoY3MpIHJlbW92ZSB0aGVzZSBhbmQgdXNlIHByb3BlciBzZWFyY2ggc2NvcGVzIQotICAvLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNMT1NJTkdfUFJPSkVDVF9TQ09QRSA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElSRV9XT1JLU1BBQ0VfU0NPUEUgPSAxOwotCi0gIHB1YmxpYyBYU0RTZWFyY2hMaXN0UHJvdmlkZXIoSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMpCi0gIHsKLSAgICB0aGlzLnNjaGVtYXMgPSBzY2hlbWFzOwotICAgIHRoaXMuY3VycmVudEZpbGUgPSBjdXJyZW50RmlsZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUHJvamVjdFtdIHJlZnMgPSBjdXJyZW50RmlsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0gICAgICAgICAgICAKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZGVwICIgKyByZWZzW2ldLmdldE5hbWUoKSk7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfSAKLSAgICAKLSAgfQotICAgCi0gIAotICBjbGFzcyBDb21wb25lbnRDb2xsZWN0aW5nWFNEVmlzaXRvcgotICB7Ci0gICAgcHJvdGVjdGVkIExpc3QgdmlzaXRlZFNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgSUNvbXBvbmVudExpc3QgbGlzdDsKLSAgICBRdWFsaWZpZWROYW1lIHNlYXJjaEtpbmQ7Ci0gICAgCi0gICAgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IoSUNvbXBvbmVudExpc3QgbGlzdCwgUXVhbGlmaWVkTmFtZSBzZWFyY2hLaW5kKQotICAgIHsKLSAgICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gICAgICB0aGlzLnNlYXJjaEtpbmQgPSBzZWFyY2hLaW5kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEsIGJvb2xlYW4gdmlzaXRJbXBvcnRlZFNjaGVtYSkKLSAgICB7Ci0gICAgICB2aXNpdGVkU2NoZW1hcy5hZGQoc2NoZW1hKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgY29udGVudHMgPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBjb250ZW50cy5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgY29udGVudHMubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBzY2hlbWFEaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSBjb250ZW50OwotICAgICAgICAgIFhTRFNjaGVtYSBleHRTY2hlbWEgPSBzY2hlbWFEaXJlY3RpdmUuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgICAgICBpZiAoZXh0U2NoZW1hICE9IG51bGwgJiYgIXZpc2l0ZWRTY2hlbWFzLmNvbnRhaW5zKGV4dFNjaGVtYSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHNjaGVtYURpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREltcG9ydCAmJiB2aXNpdEltcG9ydGVkU2NoZW1hKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2aXNpdFNjaGVtYShleHRTY2hlbWEsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNjaGVtYURpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTREluY2x1ZGUgfHwgc2NoZW1hRGlyZWN0aXZlIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJdmlzaXRTY2hlbWEoZXh0U2NoZW1hLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gJiYgc2VhcmNoS2luZCA9PSBJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uICYmIHNlYXJjaEtpbmQgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uICYmIHNlYXJjaEtpbmQgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugb25seSB3YW50IHRvIHNob3cgc2ltcGxlIHR5cGVzCi0gICAgICAgICAgbGlzdC5hZGQoY29udGVudCk7ICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uICYmIHNlYXJjaEtpbmQgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgeyAgICAgCi0gICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gc2hvdyBhbGwgdHlwZXMKLSAgICAgICAgICBsaXN0LmFkZChjb250ZW50KTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0VmlzaXRlZFNjaGVtYXMoKQotICAgIHsKLSAgICAgIHJldHVybiB2aXNpdGVkU2NoZW1hczsKLSAgICB9Ci0gIH0KLSAgIAotICAKLSAgY2xhc3MgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IKLSAgewotICAgIElDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3Q7Ci0gICAgSGFzaE1hcCBmaWxlczsKLQotICAgIEludGVybmFsU2VhcmNoUmVxdWVzdG9yKElDb21wb25lbnRMaXN0IGNvbXBvbmVudExpc3QsIEhhc2hNYXAgZmlsZXMpCi0gICAgewotICAgICAgdGhpcy5jb21wb25lbnRMaXN0ID0gY29tcG9uZW50TGlzdDsKLSAgICAgIHRoaXMuZmlsZXMgPSBmaWxlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAvLyB3ZSBmaWx0ZXIgb3V0IHRoZSBtYXRjaGVzIGZyb20gdGhlIGN1cnJlbnQgZmlsZSBzaW5jZSB3ZSBhc3N1bWUgdGhlCi0gICAgICAvLyBpbmZvIGRlcml2ZWQgZnJvbSBvdXIgc2NoZW1hIG1vZGVscyBpcyBtb3JlIHVwZGF0ZSB0byBkYXRlCi0gICAgICAvLyAoaW4gdGhlIGV2ZW50IHRoYXQgd2UgaGF2ZW4ndCBzYXZlZCBvdXIgbGF0ZXN0IG1vZGlmaWNhdGlvbnMpCi0gICAgICAvLwotICAgICAgaWYgKGZpbGVzLmdldChtYXRjaC5nZXRGaWxlKCkpID09IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgLy8gVE9ETy4uLiB0aGlzIHVnbHkgcXVhbGlmaWVkIG5hbWUgc3Rhc2hpbmcgd2lsbCBnbyBhd2F5IHNvb24KLSAgICAgICAgLy8KLSAgICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IG8gPSBtYXRjaC5tYXAuZ2V0KCJuYW1lIik7Ci0gICAgICAgIGlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpCi0gICAgICAgIHsgIAotICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSlvOwotICAgICAgICB9IAotICAgICAgICBpZiAocXVhbGlmaWVkTmFtZSAhPSBudWxsICYmIHF1YWxpZmllZE5hbWUuZ2V0TG9jYWxOYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgY29tcG9uZW50TGlzdC5hZGQobWF0Y2gpOwotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICB9Ci0gIH0gIAotCi0gIHByb3RlY3RlZCB2b2lkIGZpbmRNYXRjaGVzKFNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIFNlYXJjaFNjb3BlIHNjb3BlLCBRdWFsaWZpZWROYW1lIG1ldGFOYW1lKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuIHBhdHRlcm4gPSBuZXcgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKG5ldyBRdWFsaWZpZWROYW1lKCIqIiwgIioiKSwgbWV0YU5hbWUsIFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIKTsKLSAgICAgIC8vIFRPRE8gKGNzKSByZXZpc3QgdGhpcy4uLiB3ZSBzaG91bGRuJ3QgYmUgbmVlZGluZyB0byBoYXJkLWNvZGUgcGFydGlwYW50IGlkJ3MKLSAgICAgIC8vIEFsbCB3ZSdyZSByZWFsbHkgZG9pbmcgaGVyZSBpcyB0cnlpbmcgdG8gYXZvaWQgZmluZGluZyBtYXRjaGVzIGluCi0gICAgICAvLyB3c2RsJ3Mgc2luY2Ugd2UgZG9uJ3QgIGV2ZXIgd2FudCB0byBpbXBvcnQvaW5jbHVkZSBhIHdzZGwgZnJvbSBhIHNjaGVtYSEgCi0gICAgICAvLyBNYXliZSB3ZSBzaG91bGQganVzdCBzY29wZSBvdXQgYW55IGZpbGUgdHlwZXMgdGhhdCBhcmVuJ3QgeHNkJ3MgdXNpbmcgYSAKLSAgICAgIC8vIGN1c3RvbSBTZWFyY2hTY29wZT8KLSAgICAgIC8vCi0gICAgICBTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNwYW50ID0gU2VhcmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTZWFyY2hQYXJ0aWNpcGFudCgib3JnLmVjbGlwc2Uud3N0LnhzZC5zZWFyY2guWFNEU2VhcmNoUGFydGljaXBhbnQiKTsKLSAgICAgIEFzc2VydC5pc05vdE51bGwocGFydGljcGFudCk7Ci0gICAgICBTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IHtwYXJ0aWNwYW50fTsKLSAgICAgIHNlYXJjaEVuZ2luZS5zZWFyY2gocGF0dGVybiwgcmVxdWVzdG9yLCBwYXJ0aWNpcGFudHMsIHNjb3BlLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCBIYXNoTWFwIGNyZWF0ZUZpbGVNYXAoTGlzdCB2aXNpdGVkU2NoZW1hcykKLSAgewotICAgIEhhc2hNYXAgZmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gdmlzaXRlZFNjaGVtYXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgdGhlU2NoZW1hID0gKFhTRFNjaGVtYSlpLm5leHQoKTsKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHRoZVNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOyAgICAgICAKLSAgICAgIElGaWxlIGZpbGUgPSBjb21wdXRlRmlsZShsb2NhdGlvbik7Ci0gICAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmaWxlTWFwLnB1dChmaWxlLCBCb29sZWFuLlRSVUUpOwotICAgICAgfSAgICAgICAKLSAgICB9ICAgCi0gICAgcmV0dXJuIGZpbGVNYXA7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSUZpbGUgY29tcHV0ZUZpbGUoU3RyaW5nIGJhc2VMb2NhdGlvbikKLSAgewotICAgIElGaWxlIGZpbGUgPSBudWxsOwotICAgIGlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZmlsZVNjaGVtZSA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFN0cmluZyBwbGF0Zm9ybVJlc291cmNlU2NoZW1lID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7Ci0gICAgICBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoZmlsZVNjaGVtZSkpCi0gICAgICB7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5zdWJzdHJpbmcoZmlsZVNjaGVtZS5sZW5ndGgoKSk7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IHJlbW92ZUxlYWRpbmcoYmFzZUxvY2F0aW9uLCAiLyIpOwotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLSAgICAgICAgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgocGxhdGZvcm1SZXNvdXJjZVNjaGVtZSkpCi0gICAgICB7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IGJhc2VMb2NhdGlvbi5zdWJzdHJpbmcocGxhdGZvcm1SZXNvdXJjZVNjaGVtZS5sZW5ndGgoKSk7Ci0gICAgICAgIGJhc2VMb2NhdGlvbiA9IHJlbW92ZUxlYWRpbmcoYmFzZUxvY2F0aW9uLCAiLyIpOwotICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLSAgICAgICAgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgIH0gICAgCi0gICAgfQotICAgIHJldHVybiBmaWxlOyAgICAKLSAgfSAgCi0gIAotICBwcml2YXRlIFN0cmluZyByZW1vdmVMZWFkaW5nKFN0cmluZyBwYXRoLCBTdHJpbmcgcGF0dGVybikKLSAgewotICAgIHdoaWxlIChwYXRoLnN0YXJ0c1dpdGgocGF0dGVybikpCi0gICAgewotICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKHBhdHRlcm4ubGVuZ3RoKCkpOwotICAgIH0gIAotICAgIHJldHVybiBwYXRoOwotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RUeXBlc1NlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RUeXBlc1NlYXJjaExpc3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgwZmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotcHVibGljIGNsYXNzIFhTRFR5cGVzU2VhcmNoTGlzdFByb3ZpZGVyIGV4dGVuZHMgWFNEU2VhcmNoTGlzdFByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBJWFNEVHlwZXNGaWx0ZXIgYnVpbHRJbkZpbHRlcjsKLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgZmlsdGVyIFRoaXMgdXMgdXNlZCB0byB0dXJuIHRoZSBmaWx0ZXIgb24KLSAgICogYW5kIG9mZgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydEZpbHRlciA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBzaG93Q29tcGxleFR5cGVzID0gdHJ1ZTsKLQotICBwdWJsaWMgWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIoSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMpCi0gIHsKLSAgICBzdXBlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3QoSUNvbXBvbmVudExpc3QgbGlzdCwgU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcG0pCi0gIHsKLSAgICAvLyBmaXJzdCB3ZSBhZGQgdGhlICdidWlsdCBpbicgdHlwZXMKLSAgICAvLwotICAgIFhTRFNjaGVtYSBzY2hlbWFGb3JTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYUZvclNjaGVtYS5nZXRTaW1wbGVUeXBlSWRNYXAoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKGJ1aWx0SW5GaWx0ZXIgPT0gbnVsbCB8fCAhYnVpbHRJbkZpbHRlci5zaG91bGRGaWx0ZXJPdXQodGQpKQotICAgICAgewotICAgICAgICBsaXN0LmFkZCh0ZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIG5vdyB3ZSB0cmF2ZXJzZSB0aGUgdHlwZXMgYWxyZWFkeSBkZWZpbmVkIHdpdGhpbiB0aGUgdmlzaWJsZSBzY2hlbWFzCi0gICAgLy8gd2UgZG8gdGhpcyBpbiBhZGRpdGlvbiB0byB0aGUgY29tcG9uZW50IHNlYXJjaCBzaW5jZSB0aGlzIHNob3VsZCBleGVjdXRlCi0gICAgLy8gdmVyeSBxdWlja2x5IGFuZCB0aGVyZSdzIGEgZ29vZCBjaGFuY2UgdGhlIHVzZXIgd2FudHMgdG8gc2VsZWN0IGEgdGltZQotICAgIC8vIHRoYXQncwotICAgIC8vIGFscmVhZHkgaW1wb3J0ZWQvaW5jbHVkZWQKLSAgICAvLyBUT0RPIChjcykgZW5zdXJlIHdlIGRvbid0IGFkZCBkdXBsaWNhdGVzIHdoZW4gd2UgcHJvY2VlZCB0byB1c2UgdGhlCi0gICAgLy8gc2VhcmNoIGxpc3QKLSAgICAvLwotICAgIExpc3QgdmlzaXRlZFNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBzY2hlbWFzW2ldOwotICAgICAgUXVhbGlmaWVkTmFtZSBraW5kID0gc2hvd0NvbXBsZXhUeXBlcyA/IElYU0RTZWFyY2hDb25zdGFudHMuVFlQRV9NRVRBX05BTUUgOiBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRTsKLSAgICAgIENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IobGlzdCwga2luZCk7Ci0gICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHNjaGVtYSwgdHJ1ZSk7Ci0gICAgICB2aXNpdGVkU2NoZW1hcy5hZGRBbGwodmlzaXRvci5nZXRWaXNpdGVkU2NoZW1hcygpKTsKLSAgICB9Ci0gICAgLy8gZmluYWxseSB3ZSBjYWxsIHRoZSBzZWFyY2ggQVBJJ3MgdG8gZG8gYSBwb3RlbnRpYWxseSBzbG93IHNlYXJjaAotICAgIC8vICAgCi0gICAgaWYgKHNjb3BlICE9IG51bGwpCi0gICAgewotICAgICAgcG9wdWxhdGVDb21wb25lbnRMaXN0VXNpbmdTZWFyY2gobGlzdCwgc2NvcGUsIHBtLCBjcmVhdGVGaWxlTWFwKHZpc2l0ZWRTY2hlbWFzKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdFVzaW5nU2VhcmNoKElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBIYXNoTWFwIGZpbGVzKQotICB7Ci0gICAgU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICBJbnRlcm5hbFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IobGlzdCwgZmlsZXMpOwotICAgIGlmIChzaG93Q29tcGxleFR5cGVzKQotICAgIHsKLSAgICAgIGZpbmRNYXRjaGVzKHNlYXJjaEVuZ2luZSwgcmVxdWVzdG9yLCBzY29wZSwgSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FKTsKLSAgICB9Ci0gICAgZmluZE1hdGNoZXMoc2VhcmNoRW5naW5lLCByZXF1ZXN0b3IsIHNjb3BlLCBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIF9wb3B1bGF0ZUNvbXBvbmVudExpc3RRdWljayhJQ29tcG9uZW50TGlzdCBsaXN0LCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0dXJuQnVpbHRJbkZpbHRlck9uKGJvb2xlYW4gb3B0aW9uKQotICB7Ci0gICAgc3VwcG9ydEZpbHRlciA9IG9wdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEJ1aWx0SW5GaWx0ZXIoSVhTRFR5cGVzRmlsdGVyIGZpbHRlcikKLSAgewotICAgIHRoaXMuYnVpbHRJbkZpbHRlciA9IGZpbHRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNob3dDb21wbGV4VHlwZXMoYm9vbGVhbiBzaG93KQotICB7Ci0gICAgc2hvd0NvbXBsZXhUeXBlcyA9IHNob3c7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbmF2aWdhdGlvbi9EZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZjhlZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbmF2aWdhdGlvbi9EZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubmF2aWdhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmF2aWdhdGlvbkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLk5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4aXN0cyB0byBzdXBwb3J0IG5hdmlnYXRpb24gaW4gYSBjb250ZXh0IHdoZXJlIHRoZXJlIGlzIG5vIHRleHQgCi0gKiBlZGl0b3IgcGFnZS4gIEluIHRoZXNlIGNhc2VzIHdlIGNhbid0IHJlbHkgb24gdGhlIFRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb25zCi0gKiBzbyB3ZSB0aGlzIGNsYXNzIHdoaWNoIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBqdXN0IHRoZSBkZXNpZ24gdmlldy4KLSAqLwotcHVibGljIGNsYXNzIERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24gZXh0ZW5kcyBOYXZpZ2F0aW9uTG9jYXRpb24KLXsKLSAgcHJvdGVjdGVkIFBhdGggcGF0aDsKLQotICBwdWJsaWMgRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbihJRWRpdG9yUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgdGhpcy5wYXRoID0gbmV3IFBhdGgoKTsKLSAgfQotICAKLSAgcHVibGljIERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24oSUVkaXRvclBhcnQgcGFydCwgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIocGFydCk7ICAgCi0gICAgdGhpcy5wYXRoID0gUGF0aC5jb21wdXRlUGF0aChjb21wb25lbnQpOyAgCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBtZXJnZUludG8oSU5hdmlnYXRpb25Mb2NhdGlvbiBjdXJyZW50TG9jYXRpb24pCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChjdXJyZW50TG9jYXRpb24gaW5zdGFuY2VvZiBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uKQotICAgIHsKLSAgICAgIERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24gbG9jID0gKERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24pIGN1cnJlbnRMb2NhdGlvbjsKLSAgICAgIHJlc3VsdCA9IGxvYy5wYXRoLnRvU3RyaW5nKCkuZXF1YWxzKHBhdGgudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZXN0b3JlTG9jYXRpb24oKQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGdldEVkaXRvclBhcnQoKS5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgT2JqZWN0IHZpZXdlciA9IGdldEVkaXRvclBhcnQoKS5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0gICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpCi0gICAgewotICAgICAgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIgPSAoRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcikgdmlld2VyOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gUGF0aC5jb21wdXRlQ29tcG9uZW50KHNjaGVtYSwgcGF0aCk7Ci0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoY29tcG9uZW50KTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldElucHV0KChJQURUT2JqZWN0KWFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwYXRoLnNlZ21lbnRzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChzY2hlbWEpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljYWxWaWV3ZXIuc2V0SW5wdXQoKElBRFRPYmplY3QpYWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykKLSAgewotICAgIFN0cmluZyBzdHJpbmcgPSBtZW1lbnRvLmdldFN0cmluZygicGF0aCIpOwotICAgIHBhdGggPSBQYXRoLmNyZWF0ZVBhdGgoc3RyaW5nKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKQotICB7Ci0gICAgbWVtZW50by5wdXRTdHJpbmcoInBhdGgiLCBwYXRoLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBub3Qgc3VyZSB3aGF0IG5lZWRzIHRvIGJlIGRvbmUgaGVyZQotICB9Ci0gIHN0YXRpYyBjbGFzcyBQYXRoU2VnbWVudAotICB7Ci0gICAgZmluYWwgc3RhdGljIGludCBFTEVNRU5UID0gMTsKLSAgICBmaW5hbCBzdGF0aWMgaW50IFRZUEUgPSAyOwotICAgIGludCBraW5kOwotICAgIFN0cmluZyBuYW1lOwotCi0gICAgUGF0aFNlZ21lbnQoKQotICAgIHsKLSAgICB9Ci0KLSAgICBQYXRoU2VnbWVudChpbnQga2luZCwgU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgdGhpcy5raW5kID0ga2luZDsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotICB9Ci0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUGF0aAotICB7Ci0gICAgTGlzdCBzZWdtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcHV0ZUNvbXBvbmVudChYU0RTY2hlbWEgc2NoZW1hLCBQYXRoIHBhdGgpCi0gICAgewotICAgICAgUGF0aFJlc29sdmluZ1hTRFZpc2l0b3IgdmlzaXRvciA9IG5ldyBQYXRoUmVzb2x2aW5nWFNEVmlzaXRvcihwYXRoKTsKLSAgICAgIHZpc2l0b3IudmlzaXRTY2hlbWEoc2NoZW1hKTsKLSAgICAgIGlmICh2aXNpdG9yLmlzRG9uZSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gdmlzaXRvci5yZXN1bHQ7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgUGF0aCBjcmVhdGVQYXRoKFN0cmluZyBzdHJpbmcpCi0gICAgewotICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgoKTsKLSAgICAgIFBhdGhTZWdtZW50IHNlZ21lbnQgPSBudWxsOwotICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0cmluZywgIi8iKTsgc3QuaGFzTW9yZVRva2VucygpOykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHRva2VuID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgIGludCBraW5kID0gLTE7Ci0gICAgICAgIGlmICh0b2tlbi5zdGFydHNXaXRoKCJlbGVtZW50IikpCi0gICAgICAgIHsKLSAgICAgICAgICBraW5kID0gUGF0aFNlZ21lbnQuRUxFTUVOVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKCJ0eXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBraW5kID0gUGF0aFNlZ21lbnQuVFlQRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoa2luZCAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHNlZ21lbnQgPSBuZXcgUGF0aFNlZ21lbnQoKTsKLSAgICAgICAgICBzZWdtZW50LmtpbmQgPSBraW5kOwotICAgICAgICAgIHBhdGguc2VnbWVudHMuYWRkKHNlZ21lbnQpOwotICAgICAgICAgIFN0cmluZyBuYW1lUGF0dGVybiA9ICJbQG5hbWU9JyI7Ci0gICAgICAgICAgaW50IHN0YXJ0SW5kZXggPSB0b2tlbi5pbmRleE9mKG5hbWVQYXR0ZXJuKTsKLSAgICAgICAgICBpZiAoc3RhcnRJbmRleCAhPSAtMSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzdGFydEluZGV4ICs9IG5hbWVQYXR0ZXJuLmxlbmd0aCgpOwotICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gdG9rZW4uaW5kZXhPZigiJ10iKTsKLSAgICAgICAgICAgIGlmIChlbmRJbmRleCAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VnbWVudC5uYW1lID0gdG9rZW4uc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUGF0aCBjb21wdXRlUGF0aChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gICAgewotICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgoKTsKLSAgICAgIGZvciAoRU9iamVjdCBjID0gY29tcG9uZW50OyBjICE9IG51bGw7IGMgPSBjLmVDb250YWluZXIoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIFBhdGhTZWdtZW50IHNlZ21lbnQgPSBjb21wdXRlUGF0aFNlZ21lbnQoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBjKTsKLSAgICAgICAgICBpZiAoc2VnbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhdGguc2VnbWVudHMuYWRkKDAsIHNlZ21lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gICAgc3RhdGljIFBhdGhTZWdtZW50IGNvbXB1dGVQYXRoU2VnbWVudChYU0RDb25jcmV0ZUNvbXBvbmVudCBjKQotICAgIHsKLSAgICAgIGlmIChjIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBjOwotICAgICAgICByZXR1cm4gbmV3IFBhdGhTZWdtZW50KFBhdGhTZWdtZW50LkVMRU1FTlQsIGVkLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSAoWFNEVHlwZURlZmluaXRpb24pIGM7Ci0gICAgICAgIHJldHVybiBuZXcgUGF0aFNlZ21lbnQoUGF0aFNlZ21lbnQuVFlQRSwgdGQuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gc2VnbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQYXRoU2VnbWVudCBzZWdtZW50ID0gKFBhdGhTZWdtZW50KSBpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGtpbmQgPSAiIjsKLSAgICAgICAgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAga2luZCA9ICJlbGVtZW50IjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuVFlQRSkKLSAgICAgICAgewotICAgICAgICAgIGtpbmQgPSAidHlwZSI7Ci0gICAgICAgIH0KLSAgICAgICAgYi5hcHBlbmQoa2luZCk7Ci0gICAgICAgIGlmIChzZWdtZW50Lm5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGIuYXBwZW5kKCJbQG5hbWU9JyIgKyBzZWdtZW50Lm5hbWUgKyAiJ10iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBiLmFwcGVuZCgiLyIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gYi50b1N0cmluZygpOwotICAgIH0KLSAgfQotICAKLSAgCi0gIHN0YXRpYyBjbGFzcyBQYXRoUmVzb2x2aW5nWFNEVmlzaXRvciBleHRlbmRzIFhTRFZpc2l0b3IKLSAgewotICAgIFBhdGggcGF0aDsKLSAgICBpbnQgaW5kZXggPSAtMTsKLSAgICBQYXRoU2VnbWVudCBzZWdtZW50OwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHJlc3VsdCA9IG51bGw7Ci0KLSAgICBQYXRoUmVzb2x2aW5nWFNEVmlzaXRvcihQYXRoIHBhdGgpCi0gICAgewotICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgIGluY3JlbWVudFNlZ21lbnQoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzRG9uZSgpCi0gICAgewotICAgICAgcmV0dXJuIGluZGV4ID49IHBhdGguc2VnbWVudHMuc2l6ZSgpOwotICAgIH0KLQotICAgIHZvaWQgaW5jcmVtZW50U2VnbWVudCgpCi0gICAgewotICAgICAgaW5kZXgrKzsKLSAgICAgIGlmIChpbmRleCA8IHBhdGguc2VnbWVudHMuc2l6ZSgpKQotICAgICAgewotICAgICAgICBzZWdtZW50ID0gKFBhdGhTZWdtZW50KSBwYXRoLnNlZ21lbnRzLmdldChpbmRleCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNlZ21lbnQgPSBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gICAgewotICAgICAgaWYgKHNlZ21lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gc2NoZW1hLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24oc2VnbWVudC5uYW1lKTsKLSAgICAgICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5UWVBFKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSBzY2hlbWEucmVzb2x2ZVR5cGVEZWZpbml0aW9uKHNlZ21lbnQubmFtZSk7Ci0gICAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKHNlZ21lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50LkVMRU1FTlQgJiYgaXNNYXRjaChzZWdtZW50Lm5hbWUsIG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gZWxlbWVudDsKLSAgICAgICAgICBpbmNyZW1lbnRTZWdtZW50KCk7Ci0gICAgICAgICAgaWYgKCFpc0RvbmUoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gICAgewotICAgICAgaWYgKHNlZ21lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5UWVBFICYmIGlzTWF0Y2goc2VnbWVudC5uYW1lLCBuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHR5cGU7Ci0gICAgICAgICAgaW5jcmVtZW50U2VnbWVudCgpOwotICAgICAgICAgIGlmICghaXNEb25lKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIudmlzaXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hdGNoKFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKQotICAgIHsKLSAgICAgIHJldHVybiBuYW1lMSAhPSBudWxsID8gbmFtZTEuZXF1YWxzKG5hbWUyKSA6IG5hbWUxID09IG5hbWUyOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbmF2aWdhdGlvbi9NdWx0aVBhZ2VFZGl0b3JUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjY1OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbmF2aWdhdGlvbi9NdWx0aVBhZ2VFZGl0b3JUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uYXZpZ2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb247Ci0KLS8qKgotICogVGhlIHBsYXRmb3JtJ3MgbmF2aWdhdGlvbiBoaXN0b3J5IHBsdW1iaW5nIGRvZXNuJ3QgbGlrZSBtdWx0aXBhZ2UgdGV4dAotICogZWRpdG9ycyB2ZXJ5IG11Y2ggYW5kIHRlbmRzIHRvIGlnbm9yZSB0ZXh0IGxvY2F0aW9ucy4gIFRvIGZpeCB0aGlzCi0gKiBwcm9ibGVtIHdlIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGdldEVkaXRQYXJ0KCkgbWV0aG9kIG9mIHRoZSBzdXBlciBjbGFzcwotICogaW4gb3JkZXIgdG8gcmV0dXJuIHRoZSBhY3R1YWwgVGV4dEVkaXRvciBvZiBvdXIgbXVsdGktcGFnZSBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIE11bHRpUGFnZUVkaXRvclRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb24gZXh0ZW5kcyBUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uCi17Ci0gIHB1YmxpYyBNdWx0aVBhZ2VFZGl0b3JUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uKElUZXh0RWRpdG9yIHBhcnQsIGJvb2xlYW4gaW5pdGlhbGl6ZSkKLSAgewotICAgIHN1cGVyKHBhcnQsIGluaXRpYWxpemUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKQotICB7Ci0gICAgSUVkaXRvclBhcnQgcGFydCA9IHN1cGVyLmdldEVkaXRvclBhcnQoKTsKLSAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgcmV0dXJuIChJVGV4dEVkaXRvcikgcGFydC5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICAvLyBJU1NVRTogaG93IHRvIGdldCB0aXRsZT8KLSAgICAvLyBJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0RWRpdG9yUGFydCgpOwotICAgIC8vIGlmIChwYXJ0IGluc3RhbmNlb2YgV1NETFRleHRFZGl0b3IpIHsKLSAgICAvLyByZXR1cm4gKChXU0RMVGV4dEVkaXRvcikgcGFydCkuZ2V0V1NETEVkaXRvcigpLmdldFRpdGxlKCk7Ci0gICAgLy8gfQotICAgIC8vIGVsc2UgewotICAgIC8vIHJldHVybiBzdXBlci5nZXRUZXh0KCk7Ci0gICAgLy8gfQotICAgIHJldHVybiBzdXBlci5nZXRUZXh0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25zZWRpdC9TY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGE1MzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25zZWRpdC9TY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyCi17Ci0gIFN0cmluZyBuZXdQcmVmaXg7Ci0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0KLSAgcHVibGljIFNjaGVtYVByZWZpeENoYW5nZUhhbmRsZXIoWFNEU2NoZW1hIHhzZFNjaGVtYSwgU3RyaW5nIG5ld1ByZWZpeCkKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICAgIHRoaXMubmV3UHJlZml4PSBuZXdQcmVmaXg7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlc29sdmUoKQotICB7Ci0gICAgWFNEU2NoZW1hUHJlZml4UmVuYW1lciB4c2RTY2hlbWFQcmVmaXhSZW5hbWVyID0gbmV3IFhTRFNjaGVtYVByZWZpeFJlbmFtZXIoKTsKLSAgICB4c2RTY2hlbWFQcmVmaXhSZW5hbWVyLnZpc2l0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5ld1FOYW1lKFhTRFR5cGVEZWZpbml0aW9uIGNvbXAsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIG5ld1hTRFByZWZpeCkKLSAgewotICAgIFN0cmluZyBxTmFtZSA9IG51bGw7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgewotICAgICAgcU5hbWUgPSBuZXdYU0RQcmVmaXg7Ci0gICAgICBpZiAocU5hbWUgIT0gbnVsbCAmJiBxTmFtZS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHFOYW1lICs9ICI6IiArIHZhbHVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBxTmFtZSA9IHZhbHVlOyAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHFOYW1lID0gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBxTmFtZTsKLSAgfQotCi0gIAotICBjbGFzcyBYU0RTY2hlbWFQcmVmaXhSZW5hbWVyIGV4dGVuZHMgWFNEVmlzaXRvcgotICB7Ci0gICAgcHVibGljIFhTRFNjaGVtYVByZWZpeFJlbmFtZXIoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGVsZW1lbnQuZ2V0VHlwZSgpOwotICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gdHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaWYgKG5zID09IG51bGwpIG5zID0gIiI7Ci0vLyAgICAgICAgaWYgKG5zLmVxdWFscyh4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hTmFtZXNwYWNlKCkpKQotICAgICAgICBpZiAobnMuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgZG9tRWxlbWVudCA9IGVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChkb21FbGVtZW50ICE9IG51bGwgJiYgZG9tRWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEF0dHIgdHlwZUF0dHIgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQXR0ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlbGVtZW50LmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXROZXdRTmFtZSh0eXBlLCB0eXBlLmdldE5hbWUoKSwgbmV3UHJlZml4KSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKHNpbXBsZVR5cGUpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSBzaW1wbGVUeXBlLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgCi0gICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gYmFzZVR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChucyA9PSBudWxsKSBucyA9ICIiOwotLy8gICAgICAgIGlmIChucy5lcXVhbHMoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpKSkKLSAgICAgICAgaWYgKG5zLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERE9NSGVscGVyIGRvbUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgICBFbGVtZW50IGRlcml2ZWRCeSA9IGRvbUhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50KHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICBpZiAoZGVyaXZlZEJ5ICE9IG51bGwgJiYgZGVyaXZlZEJ5IGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXR0ciB0eXBlQXR0ciA9IGRlcml2ZWRCeS5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAodHlwZUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVyaXZlZEJ5LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKGJhc2VUeXBlLCBiYXNlVHlwZS5nZXROYW1lKCksIG5ld1ByZWZpeCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpdGVtVHlwZSA9IHNpbXBsZVR5cGUuZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoaXRlbVR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gaXRlbVR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChucyA9PSBudWxsKSBucyA9ICIiOwotICAgICAgICBpZiAobnMuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgICAgIE5vZGUgbGlzdE5vZGUgPSBkb21IZWxwZXIuZ2V0Q2hpbGROb2RlKHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRyk7Ci0gICAgICAgICAgaWYgKGxpc3ROb2RlICE9IG51bGwgJiYgbGlzdE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoRWxlbWVudClsaXN0Tm9kZTsgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobGlzdEVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQXR0ciB0eXBlQXR0ciA9IGxpc3RFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIGlmICh0eXBlQXR0ciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdEVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUsIGdldE5ld1FOYW1lKGl0ZW1UeXBlLCBpdGVtVHlwZS5nZXROYW1lKCksIG5ld1ByZWZpeCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIExpc3QgbWVtYmVyVHlwZXMgPSBzaW1wbGVUeXBlLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpOwotICAgICAgaWYgKG1lbWJlclR5cGVzLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFhTRERPTUhlbHBlciBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICAgIE5vZGUgdW5pb25Ob2RlID0gZG9tSGVscGVyLmdldENoaWxkTm9kZShzaW1wbGVUeXBlLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgaWYgKHVuaW9uTm9kZSAhPSBudWxsICYmIHVuaW9uTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IHVuaW9uRWxlbWVudCA9IChFbGVtZW50KXVuaW9uTm9kZTsgICAgICAgICAgCi0gICAgICAgICAgaWYgKHVuaW9uRWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWVtYmVyVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24paS5uZXh0KCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBucyA9IHN0LmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgICAgICAgaWYgKG5zLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGdldE5ld1FOYW1lKHN0LCBzdC5nZXROYW1lKCksIG5ld1ByZWZpeCkpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3QuZ2V0UU5hbWUoeHNkU2NoZW1hKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuaW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0gICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLS8vICAgICAgICBpZiAobnMuZXF1YWxzKHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UoKSkpCi0gICAgICAgIGlmIChucy5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgZG9tRWxlbWVudCA9IGF0dHIuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChkb21FbGVtZW50ICE9IG51bGwgJiYgZG9tRWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEF0dHIgdHlwZUF0dHIgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIGlmICh0eXBlQXR0ciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhdHRyLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXROZXdRTmFtZSh0eXBlLCB0eXBlLmdldE5hbWUoKSwgbmV3UHJlZml4KSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1RhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25zZWRpdC9UYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmM5ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1RhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotcHVibGljIGNsYXNzIFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIKLXsKLSAgU3RyaW5nIG5ld05TOwotICBTdHJpbmcgb2xkTlM7Ci0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0KLSAgcHVibGljIFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIoWFNEU2NoZW1hIHhzZFNjaGVtYSwgU3RyaW5nIG9sZE5TLCBTdHJpbmcgbmV3TlMpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLm9sZE5TPSBvbGROUzsKLSAgICB0aGlzLm5ld05TPSBuZXdOUzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVzb2x2ZSgpCi0gIHsKLSAgICBFbGVtZW50UmVmZXJlbmNlUmVuYW1lciBlbGVtZW50UmVmZXJlbmNlUmVuYW1lciA9IG5ldyBFbGVtZW50UmVmZXJlbmNlUmVuYW1lcigpOwotICAgIGVsZW1lbnRSZWZlcmVuY2VSZW5hbWVyLnZpc2l0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gICAgQXR0cmlidXRlUmVmZXJlbmNlUmVuYW1lciBhdHRyaWJ1dGVSZWZlcmVuY2VSZW5hbWVyID0gbmV3IEF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIoKTsKLSAgICBhdHRyaWJ1dGVSZWZlcmVuY2VSZW5hbWVyLnZpc2l0U2NoZW1hKHhzZFNjaGVtYSk7Ci0gIH0KLQotICBjbGFzcyBFbGVtZW50UmVmZXJlbmNlUmVuYW1lciBleHRlbmRzIFhTRFZpc2l0b3IKLSAgewotICAgIHB1YmxpYyBFbGVtZW50UmVmZXJlbmNlUmVuYW1lcigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgewotICAgICAgCWlmIChlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLSAgICAgIAl7Ci0gICAgICAJICBpZiAoZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhvbGROUykpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gc2V0IHRoZSByZXNvbHZlZCBlbGVtZW50J3MgZGVjbGFyYXRpb24gdG8gbmV3IG5zCi0gICAgICAgICAgICAvLyB0aGlzIGlzIGRlZmVjdCAyMzc1MTggLSB0YXJnZXQgbmFtZXNwYWNlIHJlbmFtZSBjcmVhdGVzIGEgbmV3IG5hbWVzcGFjZQotICAgICAgICAgICAgZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLnNldFRhcmdldE5hbWVzcGFjZShuZXdOUyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJaWYgKG9sZE5TID09IG51bGwgfHwgKG9sZE5TICE9IG51bGwgJiYgb2xkTlMuZXF1YWxzKCIiKSkpCi0gICAgICAgIAl7Ci0JCQkJCQllbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld05TKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLy8gU2ltaWxhciB0byBkZWZlY3QgMjM3NTE4IGJ1dCBmb3IgYXR0cmlidXRlcwotICBjbGFzcyBBdHRyaWJ1dGVSZWZlcmVuY2VSZW5hbWVyIGV4dGVuZHMgWFNEVmlzaXRvcgotICB7Ci0gICAgcHVibGljIEF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJVc2UgPSAoWFNEQXR0cmlidXRlVXNlKSBhdHRyR3JvdXBDb250ZW50OwotICAgICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBhdHRyVXNlLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGF0dHJEZWNsICE9IG51bGwgJiYgYXR0ckRlY2wuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgICAgewotCQkJCQkJCWlmIChhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLQkJCQkJCQl7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMob2xkTlMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5zZXRUYXJnZXROYW1lc3BhY2UobmV3TlMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLQkJCQkJCQkJaWYgKG9sZE5TID09IG51bGwgfHwgKG9sZE5TICE9IG51bGwgJiYgb2xkTlMuZXF1YWxzKCIiKSkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCWF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5zZXRUYXJnZXROYW1lc3BhY2UobmV3TlMpOwotCQkJCQkJCQl9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyaWJ1dGVHcm91cCk7Ci0gICAgICBFTGlzdCBsaXN0ID0gYXR0cmlidXRlR3JvdXAuZ2V0QXR0cmlidXRlVXNlcygpOwotICAgICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWl0ZXIubmV4dCgpOwotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gYXR0clVzZS5nZXRDb250ZW50KCk7Ci0KLSAgICAgICAgICBpZiAoYXR0ckRlY2wgIT0gbnVsbCAmJiBhdHRyRGVjbC5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotCQkJCQkJaWYgKGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotCQkJCQkJewotICAgICAgICAgICAgICBpZiAoYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhvbGROUykpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld05TKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCQkJCQkJCWlmIChvbGROUyA9PSBudWxsIHx8IChvbGROUyAhPSBudWxsICYmIG9sZE5TLmVxdWFscygiIikpKQotCQkJCQkJCXsKLQkJCQkJCQkJYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLnNldFRhcmdldE5hbWVzcGFjZShuZXdOUyk7Ci0JCQkJCQkJfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1hTRFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25zZWRpdC9YU0RWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTJlMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1hTRFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTRFZpc2l0b3IKLXsKLSAgcHVibGljIFhTRFZpc2l0b3IoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCA9IChYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oaWRlbnRpdHlDb25zdHJhaW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0cmlidXRlR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE5vdGF0aW9uRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNETm90YXRpb25EZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0VHlwZURlZmluaXRpb24oZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbihYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWYpCi0gIHsKLSAgICBpZiAoIW1vZGVsR3JvdXBEZWYuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIGlmIChtb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2aXNpdE1vZGVsR3JvdXAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwKQotICB7Ci0gICAgaWYgKGF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZVVzZXMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZVVzZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpaXRlci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0clVzZS5nZXRDb250ZW50KCkpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24gbm90YXRpb24pCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUuZ2V0Q29udGVudFR5cGUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4Q29udGVudCA9IHR5cGUuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb21wbGV4Q29udGVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICB2aXNpdFBhcnRpY2xlKChYU0RQYXJ0aWNsZSkgY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAodHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudClpdGVyLm5leHQoKTsKLSAgICAgICAgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpYXR0ckdyb3VwQ29udGVudDsKLSAgICAgICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHJVc2UuZ2V0Q29udGVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilhdHRyR3JvdXBDb250ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZShYU0RQYXJ0aWNsZSBwYXJ0aWNsZSkKLSAgewotICAgIHZpc2l0UGFydGljbGVDb250ZW50KHBhcnRpY2xlLmdldENvbnRlbnQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGVDb250ZW50KFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQpCi0gIHsKLSAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbigoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwKChYU0RNb2RlbEdyb3VwKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIHZpc2l0V2lsZGNhcmQoKFhTRFdpbGRjYXJkKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICB7Ci0gICAgaWYgKG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZShwYXJ0aWNsZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkKFhTRFdpbGRjYXJkIHdpbGRjYXJkKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRFByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTYwMjE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLURhdmlkIENhcnZlciwgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsLCBidWcgMTE0NzAzMyAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwuWFNEQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotCi1wdWJsaWMgY2xhc3MgWFNEUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgTGlzdGVuZXIgCi17Ci0gIFRleHQgaW5kZW50VGV4dEZpZWxkOwotICBTdHJpbmcgaW5kZW50U3RyaW5nOwotICBUZXh0IHNjaGVtYU5zUHJlZml4RmllbGQ7Ci0gIFRleHQgZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQ7Ci0gIEJ1dHRvbiBxdWFsaWZ5WFNETGFuZ3VhZ2U7Ci0gIHByaXZhdGUgQnV0dG9uIGhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucyA9IG51bGw7Ci0gIHByaXZhdGUgQnV0dG9uIGZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9IG51bGw7Ci0gIHByaXZhdGUgQnV0dG9uIHJlbW92ZVVudXNlZEltcG9ydHM7Ci0gIHByaXZhdGUgQnV0dG9uIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2c7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIG9uIGRlbWFuZC4KLSAgICogICBAcGFyYW0gcGFyZW50ICB0aGUgcGFyZW50IGZvciB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RQX1BSRUZFUkVOQ0VfUEFHRSk7Ci0KLQluZXcgUHJlZmVyZW5jZUxpbmtBcmVhKHBhcmVudCwgU1dULldSQVAgfCBTV1QuTVVMVEksICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmVkaXRvciIsIE1lc3NhZ2VzLl9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTkssLy8kTk9OLU5MUy0xJAotCQkJCShJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIG51bGwpLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5oaW50KDE1MCwgU1dULkRFRkFVTFQpLmNyZWF0ZSgpKTsKLQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3Rvcnkuc3d0RGVmYXVsdHMoKS5jcmVhdGUoKSk7Ci0KLSAgICBHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7ICAgCi0gICAgZ3JvdXAuc2V0VGV4dChNZXNzYWdlcy5fVUlfVEVYVF9YU0RfTkFNRVNQQUNFX1BSRUZJWCk7Ci0KLSAgICBxdWFsaWZ5WFNETGFuZ3VhZ2UgPSBWaWV3VXRpbGl0eS5jcmVhdGVDaGVja0JveChncm91cCwgTWVzc2FnZXMuX1VJX1FVQUxJRllfWFNEKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHF1YWxpZnlYU0RMYW5ndWFnZSwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5YTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fUVVBTElGWV9YTUxTQ0hFTUFfTEFOR1VBR0VfQ09OU1RSVUNUUyk7IAotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGdyb3VwLCAiICIpOwotCi0gICAgY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLl9VSV9URVhUX1hTRF9ERUZBVUxUX1BSRUZJWCk7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZCA9IGNyZWF0ZVRleHRGaWVsZChncm91cCk7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgICAgewotICAgICAgICBzZXRWYWxpZCh0cnVlKTsKLSAgICAgIH0gICAgICAKLSAgICB9KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNjaGVtYU5zUHJlZml4RmllbGQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX1hNTF9TQ0hFTUFfTEFOR1VBR0VfQ09OU1RSVUNUU19QUkVGSVgpOyAKLSAgICAKLSAgICBjcmVhdGVMYWJlbChncm91cCwgTWVzc2FnZXMuX1VJX1RFWFRfWFNEX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQgPSBjcmVhdGVUZXh0RmllbGQoZ3JvdXApOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX0RFRkFVTFRfVEFSR0VUTkFNRVNQQUNFKTsgCi0gICAgCi0gICAgCi0gICAgY3JlYXRlQ29udGVudHNGb3JWYWxpZGF0aW5nR3JvdXAocGFyZW50KTsKLSAgICAKLSAgICBjcmVhdGVDb250ZW50c0ZvckltcG9ydENsZWFudXAocGFyZW50KTsKLQotICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLQotICAgIGFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCi0gICAgcmV0dXJuIG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gIH0KLQotICBwcml2YXRlIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSAKLSAgewotICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICByZXR1cm4gZ3JvdXA7Ci0gIH0KLQotICBwcml2YXRlIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgcmV0dXJuIHRleHQ7Ci0gIH0KLQotICBwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSAKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIHJldHVybiBsYWJlbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JWYWxpZGF0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLQlHcm91cCB2YWxpZGF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDEpOwotCXZhbGlkYXRpbmdHcm91cC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9WQUxJREFUSU5HX0ZJTEVTKTsKLQotCS8vR3JpZERhdGEKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMKTsKLQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQotCWlmIChob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMgPT0gbnVsbCkgCi0JewotCQlob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMgPSBuZXcgQnV0dG9uKHZhbGlkYXRpbmdHcm91cCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCQlob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMuc2V0VGV4dChNZXNzYWdlcy5fVUlfVEVYVF9IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMpOwotCQlob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zLAotCSAgICAJCVhTREVkaXRvckNTSGVscElkcy5YTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TKTsgCi0KLQl9Ci0JaWYgKGZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9PSBudWxsKSAKLQl7Ci0JCWZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9IG5ldyBCdXR0b24odmFsaWRhdGluZ0dyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0JCWZ1bGxTY2hlbWFDb25mb3JtYW5jZS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5jb3B5RGF0YShkYXRhKSk7Ci0JCWZ1bGxTY2hlbWFDb25mb3JtYW5jZS5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9GVUxMX0NPTkZPUk1BTkNFKTsKLQl9Ci0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9ySW1wb3J0Q2xlYW51cChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgR3JvdXAgdW51c2VkSW1wb3J0R3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDEpOwotICAgIHVudXNlZEltcG9ydEdyb3VwLnNldFRleHQoTWVzc2FnZXMuX1VJX0dSQVBIX0RJUkVDVElWRVMpOwotCi0gICAgLy9HcmlkRGF0YQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCi0gICAgaWYgKHJlbW92ZVVudXNlZEltcG9ydHMgPT0gbnVsbCkgCi0gICAgewotICAgICAgcmVtb3ZlVW51c2VkSW1wb3J0cyA9IG5ldyBCdXR0b24odW51c2VkSW1wb3J0R3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLSAgICAgIHJlbW92ZVVudXNlZEltcG9ydHMuc2V0VGV4dChNZXNzYWdlcy5fVUlfVEVYVF9FTkFCTEVfQVVUT19JTVBPUlRfQ0xFQU5VUCk7Ci0gICAgICByZW1vdmVVbnVzZWRJbXBvcnRzLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVtb3ZlVW51c2VkSW1wb3J0cywKLSAgICAgIFhTREVkaXRvckNTSGVscElkcy5YTUxTQ0hFTUFGSUxFU19QUkVGRVJFTkNFU19fSU1QT1JUX0NMRUFOVVApOwotICAgICAgICAKLSAgICAgIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2cgPSBuZXcgQnV0dG9uKHVudXNlZEltcG9ydEdyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0gICAgICBhdXRvbWF0aWNhbGx5T3BlblNjaGVtYUxvY2F0aW9uRGlhbG9nLnNldFRleHQoTWVzc2FnZXMuX1VJX1RFWFRfRU5BQkxFX0FVVE9fT1BFTl9TQ0hFTUFfRElBTE9HKTsKLSAgICAgIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2cuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuY29weURhdGEoZGF0YSkpOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIERvZXMgYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSAKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICAgIGNoZWNrVmFsdWVzKCk7Ci0gIH0KLQotICAvKioKLSAgICogRG8gYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgCi0gIHsKLSAgICBpZiAoY2hlY2tWYWx1ZXMoKSkKLSAgICB7Ci0gICAgICBzdG9yZVZhbHVlcygpOyAgICAKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotICB7Ci0gICAgaWYgKGNoZWNrVmFsdWVzKCkpCi0gICAgewotICAgICAgc3RvcmVWYWx1ZXMoKTsgICAgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEhhbmRsZXMgZXZlbnRzIGdlbmVyYXRlZCBieSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0gICAqICAgQHBhcmFtIGUgIHRoZSBldmVudCB0byBoYW5kbGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIAotICB7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpCi0gIHsgCi0gIH0KLQotICAvKiogCi0gICAqIFRoZSBpbmRlbnQgaXMgc3RvcmVkIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFzc29jaWF0ZWQgd2l0aCB0aGUgWE1MIFNjaGVtYSBNb2RlbAotICAgKi8KLSAgcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLSAgewotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyB1c2luZyBkZWZhdWx0IHZhbHVlcwotICAgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKSAKLSAgewotICAgIHNjaGVtYU5zUHJlZml4RmllbGQuc2V0VGV4dChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0U3RyaW5nKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCkpOwotICAgIHF1YWxpZnlYU0RMYW5ndWFnZS5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWFNERWRpdG9yUGx1Z2luLkNPTlNUX1hTRF9MQU5HVUFHRV9RVUFMSUZZKSk7Ci0gICAgZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWFNERWRpdG9yUGx1Z2luLkNPTlNUX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSkpOwotICAgIGhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucy5zZXRTZWxlY3Rpb24oWFNEQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUykpOwotICAgIGZ1bGxTY2hlbWFDb25mb3JtYW5jZS5zZXRTZWxlY3Rpb24oWFNEQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFKSk7Ci0gICAgcmVtb3ZlVW51c2VkSW1wb3J0cy5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWFNERWRpdG9yUGx1Z2luLkNPTlNUX1hTRF9JTVBPUlRfQ0xFQU5VUCkpOwotICAgIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2cuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfQVVUT19PUEVOX1NDSEVNQV9MT0NBVElPTl9ESUFMT0cpKTsgICAgCi0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSAKLSAgewotICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICBzY2hlbWFOc1ByZWZpeEZpZWxkLnNldFRleHQoc3RvcmUuZ2V0U3RyaW5nKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCkpOwotICAgIHF1YWxpZnlYU0RMYW5ndWFnZS5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlkpKTsKLSAgICBkZWZhdWx0VGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KHN0b3JlLmdldFN0cmluZyhYU0RFZGl0b3JQbHVnaW4uQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKSk7Ci0gICAgaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zLnNldFNlbGVjdGlvbihYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMpKTsKLSAgICBmdWxsU2NoZW1hQ29uZm9ybWFuY2Uuc2V0U2VsZWN0aW9uKFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFKSk7Ci0gICAgcmVtb3ZlVW51c2VkSW1wb3J0cy5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0lNUE9SVF9DTEVBTlVQKSk7Ci0gICAgYXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZy5zZXRTZWxlY3Rpb24oc3RvcmUuZ2V0Qm9vbGVhbihYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0FVVE9fT1BFTl9TQ0hFTUFfTE9DQVRJT05fRElBTE9HKSk7Ci0gIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSAKLSAgewotICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotICAgIHN0b3JlLnNldFZhbHVlKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCwgZ2V0WE1MU2NoZW1hUHJlZml4KCkpOwotICAgIHN0b3JlLnNldFZhbHVlKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfTEFOR1VBR0VfUVVBTElGWSwgZ2V0UXVhbGlmeSgpKTsKLSAgICBzdG9yZS5zZXRWYWx1ZShYU0RFZGl0b3JQbHVnaW4uQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFLCBnZXRYTUxTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgc3RvcmUuc2V0VmFsdWUoWFNERWRpdG9yUGx1Z2luLkNPTlNUX1hTRF9JTVBPUlRfQ0xFQU5VUCwgZ2V0UmVtb3ZlSW1wb3J0U2V0dGluZygpKTsKLSAgICBzdG9yZS5zZXRWYWx1ZShYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0FVVE9fT1BFTl9TQ0hFTUFfTE9DQVRJT05fRElBTE9HLCBnZXRBdXRvbWF0aWNhbGx5T3BlblNjaGVtYUxvY2F0aW9uRGlhbG9nU2V0dGluZygpKTsKLSAgICAgIAotICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgICAKLSAgICBYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFhTRENvcmVQcmVmZXJlbmNlTmFtZXMuSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLCBob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMuZ2V0U2VsZWN0aW9uKCkpOwotICAgIFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5GVUxMX1NDSEVNQV9DT05GT1JNQU5DRSwgZnVsbFNjaGVtYUNvbmZvcm1hbmNlLmdldFNlbGVjdGlvbigpKTsKLSAgICAKLSAgICBYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0WE1MU2NoZW1hUHJlZml4KCkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBzY2hlbWFOc1ByZWZpeEZpZWxkLmdldFRleHQoKTsKLSAgICBpZiAocHJlZml4ID09IG51bGwgfHwgcHJlZml4LmVxdWFscygiIikpIAotICAgIHsKLSAgICAgIHJldHVybiAieHNkIjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFF1YWxpZnkoKQotICB7Ci0gICAgcmV0dXJuIHF1YWxpZnlYU0RMYW5ndWFnZS5nZXRTZWxlY3Rpb24oKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UmVtb3ZlSW1wb3J0U2V0dGluZygpCi0gIHsKLSAgICByZXR1cm4gcmVtb3ZlVW51c2VkSW1wb3J0cy5nZXRTZWxlY3Rpb24oKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZ1NldHRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGF1dG9tYXRpY2FsbHlPcGVuU2NoZW1hTG9jYXRpb25EaWFsb2cuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpCi0gIHsKLSAgCVN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkZWZhdWx0VGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0gICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZS5lcXVhbHMoIiIpKSAKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRTsKLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gY2hlY2tWYWx1ZXMoKQotICB7Ci0vLyBLQ1BvcnQgVE9ETyAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gVmFsaWRhdGVIZWxwZXIuY2hlY2tYTUxOYW1lKHNjaGVtYU5zUHJlZml4RmllbGQuZ2V0VGV4dCgpKTsKLQkgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLSAgICBpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgc2V0VmFsaWQodHJ1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fRVJST1JfTEFCRUxfSU5WQUxJRF9QUkVGSVgpOwotICAgICAgc2V0VmFsaWQoZmFsc2UpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZWE5OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5Nb2RlbFJlY29uY2lsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgcHJpdmF0ZSBNb2RlbFJlY29uY2lsZUFkYXB0ZXIgbW9kZWxSZWNvbmNpbGVBZGFwdGVyOwotCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiBzY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gIHsKLQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJRG9jdW1lbnQgZG9jID0gc2NoZW1hLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCUlET01Eb2N1bWVudCBkb21Eb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpZG9jOwotCQkJZG9tRG9jdW1lbnQuZ2V0TW9kZWwoKS5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkpOwotCQkJZG9tRG9jdW1lbnQucmVtb3ZlQWRhcHRlcihnZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSk7Ci0JCQlkb21Eb2N1bWVudC5yZW1vdmVBZGFwdGVyKHRoaXMpOwkJCi0JCX0KLQkgICAgc2NoZW1hID0gbnVsbDsKLQl9Ci0gICAgcmVzb3VyY2VTZXQgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IFhTRE1vZGVsQWRhcHRlci5jbGFzczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykKLSAgewotICB9Ci0gIAotICBwdWJsaWMgTW9kZWxSZWNvbmNpbGVBZGFwdGVyIGdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxSZWNvbmNpbGVBZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBjcmVhdGVTY2hlbWEoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gKGNzKSBub3RlIHRoYXQgd2UgYWx3YXlzIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSAKLSAgICAgIC8vIHNjaGVtYSBtb2RlbCBvYmplY3QgZ2V0J3MgcmV0dXJuZWQKLSAgICAgIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgICAgcmVzb3VyY2VTZXQgPSBYU0RTY2hlbWFJbXBsLmNyZWF0ZVJlc291cmNlU2V0KCk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkoKSk7ICAgICAgICAgICAgICAgIAotCi0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKWRvY3VtZW50OwotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsgICAgICAgICAgIAotCi0gICAgICAvLyBUT0RPLi4uIGdvdHRhIHBlc3RlciBTU0UgZm9sa3MgdG8gcHJvdmlkZSAndXNlZnVsJyBiYXNlTG9jYXRpb25zCi0gICAgICAvLyAKLSAgICAgIFVSSSB1cmkgPSBnZXRVUkkoYmFzZUxvY2F0aW9uKTsKLQotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgWFNEUmVzb3VyY2VJbXBsKCk7Ci0gICAgICByZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgICAgIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOyAKLSAgICAgIHJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHNjaGVtYSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOyAgICAgCi0KLSAgICAgIHNjaGVtYS5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0gICAgICBmaW5hbCBFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgLy8gRm9yY2UgdGhlIGxvYWRpbmcgb2YgdGhlICJtZXRhIiBzY2hlbWEgZm9yIHNjaGVtYSBpbnN0YW5jZSBpbnN0YW5jZS4KLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIHNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKHNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSk7ICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICAgIAotICAgICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHNldEVsZW1lbnRPcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBVc2UgdGhlIGFuaW1hdGVkIGZsYXZvdXIgYXMgd2UgZG9uJ3Qga25vdyBiZWZvcmVoYW5kIGhvdyBtYW55IHRpY2tzIHdlIG5lZWQuCi0gICAgICAgICAgLy8gVGhlIHRhc2sgbmFtZSB3aWxsIGJlIGRpc3BsYXllZCBieSB0aGUgY29kZSBpbiBYU0RSZXNvdXJjZUltcGwuCi0gICAgICAgICAgCi0gICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBNYXAgbG9hZE9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpOwotICAgICAgICAgIGxvYWRPcHRpb25zLnB1dChYU0RSZXNvdXJjZUltcGwuWFNEX1BST0dSRVNTX01PTklUT1IsIG1vbml0b3IpOwotICAgICAgICAgIAotICAgICAgICAgIHNjaGVtYS5zZXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgICAgIAotICAgICAgICAgIGxvYWRPcHRpb25zLnJlbW92ZShYU0RSZXNvdXJjZUltcGwuWFNEX1BST0dSRVNTX01PTklUT1IpOwotICAgICAgICB9Ci0gICAgICB9OwotCi0gICAgICBJUHJvZ3Jlc3NTZXJ2aWNlIHByb2dyZXNzU2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcHJvZ3Jlc3NTZXJ2aWNlLmJ1c3lDdXJzb3JXaGlsZShzZXRFbGVtZW50T3BlcmF0aW9uKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0gICAgICAgCi0gICAgICAgIAotICAgICAgLy8gYXR0YWNoIGFuIGFkYXB0ZXIgdG8ga2VlcCB0aGUgWFNEIG1vZGVsIGFuZCBET00gaW4gc3luYwotICAgICAgLy8KLSAgICAgIG1vZGVsUmVjb25jaWxlQWRhcHRlciA9IG5ldyBYU0RNb2RlbFJlY29uY2lsZUFkYXB0ZXIoZG9jdW1lbnQsIHNjaGVtYSk7Ci0gICAgICBkb21Ob2RlLmdldE1vZGVsKCkuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKG1vZGVsUmVjb25jaWxlQWRhcHRlcik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBzY2hlbWE7ICAgIAotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgY3JlYXRlU2NoZW1hKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgCi0gICAgcmV0dXJuIGNyZWF0ZVNjaGVtYShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIHJlc2V0U2NoZW1hKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgLy8gVGhlIGRvY3VtZW50IGhhcyBjaGFuZ2VkIHNvIHRoZSBzY2hlbWEgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgd2VsbC4KLSAgICB0cnkKLSAgICB7Ci0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKWRvY3VtZW50OwotICAgICAgc2NoZW1hLnNldERvY3VtZW50KGRvY3VtZW50KTsKLSAgICAgIHNjaGVtYS5zZXRFbGVtZW50KGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLQotICAgICAgcmVzb3VyY2VTZXQgPSBzY2hlbWEuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLSAgICAgIAotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsgICAgICAgICAgIAotICAgICAgVVJJIHVyaSA9IGdldFVSSShiYXNlTG9jYXRpb24pOwotICAgICAgc2NoZW1hLmVSZXNvdXJjZSgpLnNldFVSSSh1cmkpOwotCi0gICAgICBtb2RlbFJlY29uY2lsZUFkYXB0ZXIgPSBuZXcgWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyKGRvY3VtZW50LCBzY2hlbWEpOwotICAgICAgZG9tTm9kZS5nZXRNb2RlbCgpLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihtb2RlbFJlY29uY2lsZUFkYXB0ZXIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHNjaGVtYTsKLSAgfSAgCi0KLSAgcHVibGljIHN0YXRpYyBYU0RNb2RlbEFkYXB0ZXIgbG9va3VwT3JDcmVhdGVNb2RlbEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBYU0RNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gICAgaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikKLSAgICB7Ci0gICAgICBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpZG9jdW1lbnQ7Ci0gICAgICBhZGFwdGVyID0gKFhTRE1vZGVsQWRhcHRlcilub3RpZmllci5nZXRBZGFwdGVyRm9yKFhTRE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICBpZiAoYWRhcHRlciA9PSBudWxsKQotICAgICAgewotICAgICAgICBhZGFwdGVyID0gbmV3IFhTRE1vZGVsQWRhcHRlcigpOwotICAgICAgICBub3RpZmllci5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotICAgICAgfSAKLSAgICB9ICAgCi0gICAgcmV0dXJuIGFkYXB0ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgWFNEU2NoZW1hIGxvb2t1cE9yQ3JlYXRlU2NoZW1hKGZpbmFsIERvY3VtZW50IGRvY3VtZW50KQotICB7ICAgIAotICAgIFhTRFNjaGVtYSByZXN1bHQgPSBudWxsOyAgICAKLSAgICBYU0RNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGxvb2t1cE9yQ3JlYXRlTW9kZWxBZGFwdGVyKGRvY3VtZW50KTsgICAgICAKLSAgICBpZiAoYWRhcHRlci5nZXRTY2hlbWEoKSA9PSBudWxsKQotICAgIHsgIAotICAgICAgCi0gICAgICBhZGFwdGVyLmNyZWF0ZVNjaGVtYShkb2N1bWVudCk7IAotICAgIH0gICAKLSAgICByZXN1bHQgPSBhZGFwdGVyLmdldFNjaGVtYSgpOyAgICAKLSAgICByZXR1cm4gcmVzdWx0OyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBVUkkgZ2V0VVJJKFN0cmluZyBiYXNlTG9jYXRpb24pCi0gIHsKLSAgICBVUkkgdXJpID0gbnVsbDsKLSAgICBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICB7Ci0gICAgICB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShiYXNlTG9jYXRpb24pOwotICAgIH0KLSAgICBlbHNlIGlmIChiYXNlTG9jYXRpb24uc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgIHsKLSAgICAgIHVyaSA9IFVSSS5jcmVhdGVVUkkoYmFzZUxvY2F0aW9uKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiB1cmk7Ci0gIH0KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsUXVlcnlFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxRdWVyeUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzExNGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxRdWVyeUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLXB1YmxpYyBjbGFzcyBYU0RNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuZHMgTW9kZWxRdWVyeUV4dGVuc2lvbgotewotICBwdWJsaWMgWFNETW9kZWxRdWVyeUV4dGVuc2lvbigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVWYWx1ZXMoRWxlbWVudCBlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBTdHJpbmcgY3VycmVudEVsZW1lbnROYW1lID0gZS5nZXRMb2NhbE5hbWUoKTsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBlLmdldFBhcmVudE5vZGUoKTsKLSAgICBTdHJpbmcgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUgIT0gbnVsbCA/IHBhcmVudE5vZGUuZ2V0TG9jYWxOYW1lKCkgOiAiIjsKLSAgICBpZiAoY2hlY2tOYW1lKG5hbWUsICJ0eXBlIikpCi0gICAgewotICAgICAgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJhdHRyaWJ1dGUiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0MigpOwotICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJlbGVtZW50IikpCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdDIoKTsKLSAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJibG9ja0RlZmF1bHQiKSB8fCBjaGVja05hbWUobmFtZSwgImZpbmFsRGVmYXVsdCIpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKCIjYWxsIik7Ci0gICAgICBsaXN0LmFkZCgic3Vic3RpdHV0aW9uIik7Ci0gICAgICBsaXN0LmFkZCgiZXh0ZW5zaW9uIik7Ci0gICAgICBsaXN0LmFkZCgicmVzdHJpY3Rpb24iKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJuYW1lc3BhY2UiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImFueSIpIHx8IGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJhbnlBdHRyaWJ1dGUiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoIiMjYW55Iik7Ci0gICAgICAgIGxpc3QuYWRkKCIjI290aGVyIik7Ci0gICAgICAgIGxpc3QuYWRkKCIjI3RhcmdldE5hbWVzcGFjZSIpOwotICAgICAgICBsaXN0LmFkZCgiIyNsb2NhbCIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgIm1heE9jY3VycyIpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKCIxIik7Ci0gICAgICBsaXN0LmFkZCgidW5ib3VuZGVkIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAibWluT2NjdXJzIikpCi0gICAgewotICAgICAgbGlzdC5hZGQoIjAiKTsKLSAgICAgIGxpc3QuYWRkKCIxIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAiaXRlbVR5cGUiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImxpc3QiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJtZW1iZXJUeXBlcyIpKQotICAgIHsKLSAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAidW5pb24iKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJiYXNlIikpCi0gICAgewotICAgICAgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJyZXN0cmljdGlvbiIpKQotICAgICAgewotICAgICAgICBpZiAoY2hlY2tOYW1lKHBhcmVudE5hbWUsICJzaW1wbGVUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgInNpbXBsZUNvbnRlbnQiKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgImNvbXBsZXhDb250ZW50IikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJleHRlbnNpb24iKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlQ29udGVudCIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAiY29tcGxleENvbnRlbnQiKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgInJlZiIpKQotICAgIHsKLSAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiZWxlbWVudCIpKQotICAgICAgewotICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0R2xvYmFsRWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJhdHRyaWJ1dGUiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEdsb2JhbEF0dHJpYnV0ZXMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJhdHRyaWJ1dGVHcm91cCIpKQotICAgICAgewotICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0R2xvYmFsQXR0cmlidXRlR3JvdXBzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiZ3JvdXAiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldE1vZGVsR3JvdXBzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAic3Vic3RpdHV0aW9uR3JvdXAiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImVsZW1lbnQiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEdsb2JhbEVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVDaGlsZEVsZW1lbnQoTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIGlmIChYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRy5lcXVhbHMocGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpKSAmJgotICAgICAgICBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgLy8gd2UgYXNzdW1lIHRoYXQgb3RoZXIgbm9kZXMgZG9uJ3Qgd2FudCBzY2hlbWEgbm9kZXMgYXMgZXh0ZW5zaW9uIGVsZW1lbnRzCi0gICAgLy8gVE9ETy4uLiBjczogd2UgcmVhbGx5IG5lZWQgdG8gZGVmaW5lIGN1c3RpbWl6YXRpb25zIGZvciBmaWx0ZXJpbmcgYmFzZWQgb24gcGFyZW50L2NoaWxkCi0gICAgLy8gbmFtZXNwYWNlIHBhaXJzIHRvIGFjY3VyYXRlbHkgaGFuZGxlIHRoaXMgICAgCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lc3BhY2VVUkkgPSBwYXJlbnROb2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIGlmICghWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyhwYXJlbnRFbGVtZW50TmFtZXNwYWNlVVJJKSAmJgotICAgICAgICBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgIHJldHVybiBmYWxzZTsgICAKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgeyAgCi0gICAgICBOb2RlRmlsdGVyIGZpbHRlciA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXROb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCkuZ2V0Tm9kZUZpbHRlcihuYW1lc3BhY2UpOwotICAgICAgaWYgKGZpbHRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gZmlsdGVyLmlzQXBwbGljYWJsZUNvbnRleHQocGFyZW50Tm9kZSwgTm9kZS5FTEVNRU5UX05PREUsIG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICB9ICAgICAKLSAgICB9Ci0gICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBsb29rdXBPckNyZWF0ZVNjaGVtYShEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHJldHVybiBYU0RNb2RlbEFkYXB0ZXIubG9va3VwT3JDcmVhdGVTY2hlbWEoZG9jdW1lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGxvb2t1cE9yQ3JlYXRlU2NoZW1hRm9yRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gbG9va3VwT3JDcmVhdGVTY2hlbWEoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFR5cGVzSGVscGVyIGdldFR5cGVzSGVscGVyKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBsb29rdXBPckNyZWF0ZVNjaGVtYShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgcmV0dXJuIG5ldyBUeXBlc0hlbHBlcihzY2hlbWEpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tOYW1lKFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB0b2tlbikKLSAgewotICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUudHJpbSgpLmVxdWFscyh0b2tlbikpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGE2ZGI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBFdWdlbmUgT3N0cm91a2hvdiwgZXVnZW5lQGdlbnVpdGVjLmNvbSAtIFsyMDMyOTFdIFhTRCBFZGl0b3IgU291cmNlIFN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgdXBkYXRlZCBpbiBPdXRsaW5lL0dyYXBoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLk1vZGVsUmVjb25jaWxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyIGV4dGVuZHMgTW9kZWxSZWNvbmNpbGVBZGFwdGVyCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICAKLSAgcHVibGljIFhTRE1vZGVsUmVjb25jaWxlQWRhcHRlcihEb2N1bWVudCBkb2N1bWVudCwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHN1cGVyKGRvY3VtZW50KTsKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm9kZUNoYW5nZWQoTm9kZSBub2RlKQotICB7Ci0gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5vZGUgaXMgaW4gdGhlIFhTRCBTY2hlbWEgbmFtZXNwYWNlLiBXZSBkb24ndCBuZWVkIHRvIAotICAgIC8vIHJlY29uY2lsZSB0aGUgbW9kZWwgZm9yIG90aGVyIG5vZGVzIGxpa2UgdGV4dCBvciBub2RlcyBpbiBvdGhlciBuYW1lc3BhY2VzCi0gICAgLy8gbGlrZSB0aGUgb25lcyBub3JtYWxseSBvY2N1cnJpbmcgaW4gYW5ub3RhdGlvbnMuCi0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKCFzaG91bGRSZWNvbmNpbGVNb2RlbEZvcihub2RlKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLQotICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7ICAKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gc2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7ICAgIAotICAgICAgY29uY3JldGVDb21wb25lbnQuZWxlbWVudENoYW5nZWQoKEVsZW1lbnQpbm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkKLSAgICB7Ci0gICAgICAvLyBUaGUgZG9jdW1lbnQgY2hhbmdlZCBzbyB3ZSBtYXkgbmVlZCB0byBmaXggdXAgdGhlIAotICAgICAgLy8gZGVmaW5pdGlvbidzIHJvb3QgZWxlbWVudAotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSAoRG9jdW1lbnQpbm9kZTsgICAgCi0gICAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIGlmIChzY2hlbWFFbGVtZW50ICE9IG51bGwgJiYgc2NoZW1hRWxlbWVudCAhPSBzY2hlbWEuZ2V0RWxlbWVudCgpKQotICAgICAgeyAgIAotICAgICAgICAvLyBoZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIG5ldyAnc2NoZW1hJyBlbGVtZW50IHdhcyBhZGRlZAotICAgICAgICAvLyhlLmcuIHRoZSBmaWxlIHdhcyB0b3RhbGx5IGJsYW5rIGFuZCB0aGVuIHdlIHR5cGUgaW4gdGhlIHJvb3QgZWxlbWVudCkgICAgICAgIAotICAgICAgICAvLwotICAgICAgICBpZiAoc2NoZW1hRWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRykpICAgICAgICAgCi0gICAgICAgIHsgIAotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiogU2V0dGluZyBuZXcgc2NoZW1hIik7Ci0gICAgICAgICAgc2NoZW1hLnNldEVsZW1lbnQoc2NoZW1hRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICAgIGVsc2UgaWYgKHNjaGVtYUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgCi0gICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgZGVmaW5pdGlvbiBlbGVtZW50J3MgY29udGVudCBoYXMgY2hhbmdlZAotICAgICAgICAvLyBUT0RPIChjcykgZG8gd2UgcmVhbGx5IG5lZWQgdG8gaGFuZGxlIHRoaXMgY2FzZT8KLSAgICAgICAgc2NoZW1hLmVsZW1lbnRDaGFuZ2VkKHNjaGVtYUVsZW1lbnQpOwotICAgICAgfSAgICAgIAotICAgICAgZWxzZSBpZiAoc2NoZW1hRWxlbWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIHJvb3QgZWxlbWVudCBjbGVhciBvdXQgdGhlIHNjaGVtYQotICAgICAgICAvLwotICAgICAgICAKLSAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzI5MQotICAgICAgICAvLyBBZGQgdHJ5LWNhdGNoIHRvIHdvcmstYXJvdW5kIHByb2JsZW0gYXQgCi0gICAgICAgIC8vIFhTRENvbmNyZXRlQ29tcG9uZW50SW1wbC5mb3JjZU5pY2VSZW1vdmVDaGlsZChYU0RDb25jcmV0ZUNvbXBvbmVudEltcGwuamF2YToxNjk2KQotICAgICAgICAvLyBvdGhlcndpc2UgdGhlIHN0YXRlbWVudHMgYmVsb3cgZG9uJ3QgZ2V0IHJ1bgotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHNjaGVtYS5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB3b3JrYXJvdW5kCi0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPIChjcykgSSdtIG5vdCBzdXJlIHdoeSB0aGUgYWJvdmUgaXNuJ3QgZW5vdWdoCi0gICAgICAgIC8vIHRvIGNsZWFyIG91dCBhbGwgb2YgdGhlIGNvbXBvbmVudCBsaXN0cwotICAgICAgICAvLyBmb3Igbm93IEkndmUganVzdCBhZGRlZCBhIGZldyBtb3JlIGxpbmVzIHRvIGRvIGFkZGl0aW9uYWwgY2xlYXJpbmcKLSAgICAgICAgLy8KLSAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdmUgZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMyOTEKLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldEluY29ycG9yYXRlZFZlcnNpb25zKCkuY2xlYXIoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgfQotICAgICAgICB0cnkgeyBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLmNsZWFyKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICB0cnkgeyBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuY2xlYXIoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIHRyeSB7IHNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKS5jbGVhcigpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpLmNsZWFyKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICB0cnkgeyBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLmNsZWFyKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAgICAgCi0gICAgICAgIHRyeSB7IHNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2UobnVsbCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICB0cnkgeyBzY2hlbWEucmVzZXQoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0KLSAgICAgICAgc2NoZW1hLnNldEVsZW1lbnQobnVsbCk7Ci0gICAgICB9ICAgICAgCi0gICAgfSAKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgaWYgYSBjaGFuZ2UgdG8gdGhlIGdpdmVuIG5vZGUgc2hvdWxkIHRyaWdnZXIgYSBtb2RlbCB1cGRhdGUuCi0gICAqIAotICAgKiBAcGFyYW0gY2hhbmdlZE5vZGUKLSAgICogICAgICAgICAgdGhlIERPTSBub2RlIHRvIHRlc3QuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhbmdlIHRvIHRoZSBnaXZlbiBub2RlIHNob3VsZCB0cmlnZ2VyIGEgbW9kZWwgdXBkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUmVjb25jaWxlTW9kZWxGb3IoTm9kZSBjaGFuZ2VkTm9kZSkKLSAgewotICAgIC8vIE5vIG5lZWQgdG8gcmVjb25jaWxlIGlmIHRoZSBub2RlIGlzIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSBhcyBpdCBpcyB0aGUKLSAgICAvLyBjYXNlIGZvciBub2RlcyBkZWVwbHkgbmVzdGVkIGluIGFwcGluZm8gb3IgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLQotICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMyOTEKLSAgICBpZiAoY2hhbmdlZE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbm9kZU5hbWVzcGFjZSA9IGNoYW5nZWROb2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIFN0cmluZyBzY2hlbWFOYW1lc3BhY2UgPSBzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hTmFtZXNwYWNlKCk7Ci0gICAgLy8gSWYgdGhlIGRvY3VtZW50IG5vZGUgY2hhbmdlcywgdGhlbiB0aGUgbm9kZU5hbWVzcGFjZSBpcyBudWxsCi0gICAgLy8gc28gd2UgZG8gd2FudCB0byByZWNvbmNpbGUuICBUaGlzIGNoYW5nZSBpcyBuZWVkZWQgZm9yCi0gICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0ODg0MiBhbmQKLSAgICAvLyByZWFkIG9ubHkgZmlsZSBzdXBwb3J0LgotICAgIGlmICghc2NoZW1hTmFtZXNwYWNlLmVxdWFscyhub2RlTmFtZXNwYWNlKSAmJiBub2RlTmFtZXNwYWNlICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFdoZW4gYSBjaGlsZCBub2RlIGlzIGFkZGVkIHRvIGFuIGFwcGluZm8gb3IgZG9jdW1lbnRhdGlvbiBlbGVtZW50Ci0gICAgLy8gTm8gbmVlZCB0byByZWNvbmNpbGUgaWYgdGhlIG5vZGUgaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGFwcGluZm8gb3IgZG9jdW1lbnRhdGlvbgotICAgIC8vIGVsZW1lbnRzLgotCi0gICAgTm9kZSBwYXJlbnROb2RlID0gY2hhbmdlZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0gICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbm9kZU5hbWUgPSBjaGFuZ2VkTm9kZS5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgaWYgKFhTRENvbnN0YW50cy5BUFBJTkZPX0VMRU1FTlRfVEFHLmVxdWFscyhub2RlTmFtZSkgfHwgWFNEQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcuZXF1YWxzKG5vZGVOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgYm9vbGVhbiBpc0RpcnR5KQotICB7Ci0gICAgaWYgKCFpc0RpcnR5KQotICAgIHsKLSAgICAgIC8vIFRPRE8gbmVlZCBhIHdheSB0byB0ZWxsIHRoZSB2aWV3cyB0byBzdG9wIHJlZnJlc2hpbmcgKHRlbXBvcmFyaWx5KQotICAgICAgLy8KLSAgICAgIC8qCi0gICAgICBzY2hlbWEucmVzZXQoKTsKLSAgICAgIAotICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGUgcmVmZXJlbmNlcyBkb24ndCBnZXQgZml4ZWQgdXAgd2hlbiBhbiBpbXBvcnQgaXMgcmVtb3ZlZAotICAgICAgLy8gZXZlbiBpZiB3ZSBjYWxsIHNjaGVtYS5yZXNldCgpIGV4cGxpY3RseS4gIFRvIHdvcmsgYXJvdW5kIHRoaXMgIHdlIGl0ZXJhdGUgdGhydQotICAgICAgLy8gdGhlIHR5cGUgcmVmZXJlbmNlcyBhbmQgcmVjb21wdXRlIHRoZW0gaW5jYXNlIGEgc2NoZW1hIGRpZCBpbmZhY3QgY2hhbmdlCi0gICAgICAvLwotICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgeyAgCi0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uSW1wbClpLm5leHQoKTsKLSAgICAgICAgLy9lZC5lbGVtZW50QXR0cmlidXRlc0NoYW5nZWQoZWQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSBlZC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICB0ZCA9IGVkLnJlc29sdmVUeXBlRGVmaW5pdGlvbih0ZC5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgdGQuZ2V0TmFtZSgpKTsgICAgICAgIAotICAgICAgICBlZC5zZXRUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICB9Ki8gIAotICAgIH0KLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvRG9jdW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTMzYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWFic3RyYWN0IGNsYXNzIERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlcgotewotICBEb2N1bWVudCBkb2N1bWVudDsKLQotICBwdWJsaWMgRG9jdW1lbnRBZGFwdGVyKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotICAgICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmFkZEFkYXB0ZXIodGhpcyk7Ci0gICAgYWRhcHRDaGlsZEVsZW1lbnRzKGRvY3VtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGFwdENoaWxkRWxlbWVudHMoTm9kZSBwYXJlbnROb2RlKQotICB7Ci0gICAgZm9yIChOb2RlIGNoaWxkID0gcGFyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7Ci0gICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgYWRhcHQoKEVsZW1lbnQpIGNoaWxkKTsKLSAgICAgIH0KLSAgICB9ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGFwdChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRFeGlzdGluZ0FkYXB0ZXIodGhpcykgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmFkZEFkYXB0ZXIodGhpcyk7Ci0gICAgICBhZGFwdENoaWxkRWxlbWVudHMoZWxlbWVudCk7ICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICB7Ci0gICAgcmV0dXJuIHR5cGUgPT0gdGhpczsKLSAgfQotCi0gIGFic3RyYWN0IHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpOwotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvTW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL01vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjg1Njc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvTW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9kZWxSZWNvbmNpbGVBZGFwdGVyIGV4dGVuZHMgRG9jdW1lbnRBZGFwdGVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGluZ05vdGlmeUNoYW5nZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAKLSAgcHVibGljIE1vZGVsUmVjb25jaWxlQWRhcHRlcihEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHN1cGVyKGRvY3VtZW50KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGxpc3RlbmVyKQotICB7Ci0gICAgaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQotICAgIHsKLSAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm9kZUFkYXB0ZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QobGlzdGVuZXJzKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKWkubmV4dCgpOwotICAgICAgYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0gICAgfSAgCi0gIH0KLSAgICAgIAotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotICB7Ci0gICAgaWYgKCFoYW5kbGluZ05vdGlmeUNoYW5nZWQpCi0gICAgewotICAgICAgaGFuZGxpbmdOb3RpZnlDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBoYW5kbGVOb3RpZnlDaGFuZ2Uobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVycyhub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLS8vICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoZSk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIGhhbmRsaW5nTm90aWZ5Q2hhbmdlZCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm9kZUNoYW5nZWQoTm9kZSBub2RlKQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBoYW5kbGVOb3RpZnlDaGFuZ2UoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSAoTm9kZSlub3RpZmllcjsKLSAgICBzd2l0Y2ggKGV2ZW50VHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIElOb2RlTm90aWZpZXIuQUREOgotICAgICAgewotICAgICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbmV3VmFsdWU7Ci0gICAgICAgICAgYWRhcHQoZWxlbWVudCk7Ci0gICAgICAgIH0gIAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5SRU1PVkU6Ci0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLkNIQU5HRToKLSAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRDoKLSAgICAgIHsgCi0gICAgICAgIGhhbmRsZU5vZGVDaGFuZ2VkKG5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gIAotICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRDoKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhlIG9ubHkgdGhpbmcgY2hhbmdlZCB3YXMgdGhlIGNvbnRlbnQgb2YgYSB0ZXh0IG5vZGUKLSAgICAgICAgLy8gdGhlbiB3ZSBkb24ndCB3YW50IHRvIHJlY29uY2lsZS4KLSAgICAgICAgCi0gICAgICAgIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgVGV4dCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBoYW5kbGVOb2RlQ2hhbmdlZChub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgICAgICAgICAgIAotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzA3ODRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3Rpb25BZGFwdGVyIGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBldmVudFNvdXJjZTsKLQotICBwdWJsaWMgdm9pZCBzZXRFdmVudFNvdXJjZShJU2VsZWN0aW9uUHJvdmlkZXIgZXZlbnRTb3VyY2UpCi0gIHsKLSAgICB0aGlzLmV2ZW50U291cmNlID0gZXZlbnRTb3VyY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSAKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9ICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSAKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb247Ci0gIH0gICAgCi0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHNwZWNpYWxpemVkIHRvIHJldHVybiB0aGUgY29ycmVjdCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgJ290aGVyJyBtb2RlbAotICAgKi8KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3RGb3JPdGhlck1vZGVsKE9iamVjdCBvYmplY3QpOwotCi0gICAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIG1vZGVsU2VsZWN0aW9uKSAgCi0gIHsgCi0gICAgTGlzdCBvdGhlck1vZGVsT2JqZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAobW9kZWxTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKW1vZGVsU2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBpLm5leHQoKTsgCi0gICAgICAgIE9iamVjdCBvdGhlck1vZGVsT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChtb2RlbE9iamVjdCk7ICAgICAgIAotICAgICAgICBpZiAob3RoZXJNb2RlbE9iamVjdCAhPSBudWxsKQotICAgICAgICB7IAotICAgICAgICAgIG90aGVyTW9kZWxPYmplY3RMaXN0LmFkZChvdGhlck1vZGVsT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAKLSAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5vZGVTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvdGhlck1vZGVsT2JqZWN0TGlzdCk7Ci0gICAgc2VsZWN0aW9uID0gbm9kZVNlbGVjdGlvbjsKLSAgICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KGV2ZW50U291cmNlICE9IG51bGwgPyBldmVudFNvdXJjZSA6IHRoaXMsIG5vZGVTZWxlY3Rpb24pOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvVHlwZXNIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvVHlwZXNIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzNmY5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1R5cGVzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREltcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFR5cGVzSGVscGVyCi17Ci0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIFZlY3RvciBsaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gIHB1YmxpYyBUeXBlc0hlbHBlcihYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlRXh0ZXJuYWxJbXBvcnRHbG9iYWxzKCkKLSAgewotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBjb250ZW50cyA9IHhzZFNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoY29udGVudHMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgY29udGVudHMubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RJbXBvcnRJbXBsIGFuSW1wb3J0ID0gKFhTREltcG9ydEltcGwpIGNvbnRlbnQ7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGFuSW1wb3J0LmdldFNjaGVtYUxvY2F0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYW5JbXBvcnQuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8vIFRPRE8gVGhpcyBtZXRob2QgYW5kIGl0J3MgdmVyeSBzaW1pbGFyIGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0MiBzaG91bGQgCi0gIC8vIGJlIHJldmlld2VkIGFuZCBjb21iaW5lZCBpZiBwb3NzaWJsZS4gQm90aCBzZWVtIHRvIGJlIHVzZWQgZnJvbSAKLSAgLy8gWFNETW9kZWxRdWVyeUV4dGVuc2lvbiBmb3IgY29udGVudCBhc3Npc3QgcHVycG9zZXMuCi0gIAotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHByZWZpeCA9IHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpOwotICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWEgc2NoZW1hRm9yU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hRm9yU2NoZW1hLmdldFNpbXBsZVR5cGVJZE1hcCgpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsgIAotICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0ZC5nZXROYW1lKCk7IAotICAgICAgICAgIFN0cmluZyBwcmVmaXhlZE5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUgOiBsb2NhbE5hbWU7IAotICAgICAgICAgIGl0ZW1zLmFkZChwcmVmaXhlZE5hbWUpOyAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgLy8gaXNzdWUgKGNzKSBkbyB3ZSBzdGlsbCBuZWVkIHRoaXM/ICBpdCBjYW4gbGlrZWx5IGJlIHJlbW92ZSBub3cKLSAgLy8gd2FzIHVzZWQgZm9yIGNvbnRlbnQgYXNzaXN0IGJ1dCBJIGRvbid0IHRoaW5rIHdlIHJlYWxseSBuZWVkIGl0Ci0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdDIoKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgcHJlZml4ZXMgPSBnZXRQcmVmaXhlc0Zvck5hbWVzcGFjZSh4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hTmFtZXNwYWNlKCkpOwotICAgICAgWFNEU2NoZW1hIHNjaGVtYUZvclNjaGVtYSA9IFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWFGb3JTY2hlbWEuZ2V0U2ltcGxlVHlwZUlkTWFwKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7ICAKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHRkLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHByZWZpeGVzLnNpemUoKSA+IDAgPyAoU3RyaW5nKXByZWZpeGVzLmdldCgwKSA6IG51bGw7Ci0gICAgICAgIFN0cmluZyBwcmVmaXhlZE5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUgOiBsb2NhbE5hbWU7IAotICAgICAgICByZXN1bHQuYWRkKHByZWZpeGVkTmFtZSk7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaXRlbXMuYWRkQWxsKGdldFByZWZpeGVkTmFtZXModHlwZURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpdGVtcyA9IChWZWN0b3IpIHNvcnRMaXN0KGl0ZW1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotCQkJICAgIGl0ZW1zLmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKHR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCB0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpKTsgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotICAKLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldFVzZXJTaW1wbGVUeXBlcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaXRlbXMuYWRkKHR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgICAvL2l0ZW1zLmFkZCh0eXBlRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTY2hlbWEpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gV2UgbmVlZCB0byBhZGQgdGhlIGFueVR5cGUKLS8vICAgICAgaXRlbXMuYWRkKGdldFByZWZpeCh4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hTmFtZXNwYWNlKCksIHRydWUpICsgImFueVR5cGUiKTsKLSAgICAgIAotICAgICAgLy8gICAgICBpdGVtcyA9IGFkZEV4dGVybmFsSW1wb3J0ZWRVc2VyU2ltcGxlVHlwZXMoaXRlbXMpOwotICAgICAgLy9pdGVtcyA9IChWZWN0b3IpIHNvcnRMaXN0KGl0ZW1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5zLCBib29sZWFuIHdpdGhDb2xvbikKLSAgewotICAgIFN0cmluZyBrZXkgPSAiIjsKLQotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGtleU9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBtYXAuZ2V0KGtleU9iaik7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKG5zKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChrZXlPYmogIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrZXkgPSBrZXlPYmoudG9TdHJpbmcoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGtleSA9ICIiOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFrZXkuZXF1YWxzKCIiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHdpdGhDb2xvbikKLSAgICAgICAgewotICAgICAgICAgIGtleSA9IGtleSArICI6IjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4ga2V5OwotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEdsb2JhbEVsZW1lbnRzKCkKLSAgewotICAgIFZlY3RvciBpdGVtcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgdXBkYXRlRXh0ZXJuYWxJbXBvcnRHbG9iYWxzKCk7Ci0gICAgICBpZiAoeHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0UU5hbWUoeHNkU2NoZW1hKTsKLSAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGl0ZW1zLmFkZChuYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vICAgICAgaXRlbXMgPSBhZGRFeHRlcm5hbEltcG9ydGVkR2xvYmFsRWxlbWVudHMoaXRlbXMpOwotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRHbG9iYWxBdHRyaWJ1dGVzKCkKLSAgewotICAgIFZlY3RvciBpdGVtcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgdXBkYXRlRXh0ZXJuYWxJbXBvcnRHbG9iYWxzKCk7Ci0gICAgICBpZiAoeHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjbGFyYXRpb24gPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIGlmIChhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsIHx8IChhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsICYmICFhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9JTlNUQU5DRV9VUklfMjAwMSkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0UU5hbWUoeHNkU2NoZW1hKTsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGl0ZW1zLmFkZChuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vICAgICAgaXRlbXMgPSBhZGRFeHRlcm5hbEltcG9ydGVkQXR0cmlidXRlcyhpdGVtcyk7Ci0gICAgICBpdGVtcyA9IChWZWN0b3IpIHNvcnRMaXN0KGl0ZW1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEdsb2JhbEF0dHJpYnV0ZUdyb3VwcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEF0dHJpYnV0ZUdyb3VwcyhpdGVtcyk7Ci0gICAgICBpdGVtcyA9IChWZWN0b3IpIHNvcnRMaXN0KGl0ZW1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldE1vZGVsR3JvdXBzKCkKLSAgewotICAgIFZlY3RvciBpdGVtcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgdXBkYXRlRXh0ZXJuYWxJbXBvcnRHbG9iYWxzKCk7Ci0gICAgICBpZiAoeHNkU2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZmluaXRpb24gPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gbW9kZWxHcm91cERlZmluaXRpb24uZ2V0UU5hbWUoeHNkU2NoZW1hKTsKLSAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGl0ZW1zLmFkZChuYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vICAgICAgaXRlbXMgPSBhZGRFeHRlcm5hbEltcG9ydGVkR3JvdXBzKGl0ZW1zKTsKLSAgICAgIGl0ZW1zID0gKFZlY3Rvcikgc29ydExpc3QoaXRlbXMpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci0gIH0KLQotICAvLyBpc3N1ZSAoY3MpIHNzZW1zIGxpa2UgYSByYXRoZXIgZ29vZnkgdXRpbCBtZXRob2Q/Ci0gIHB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkxpc3Qgc29ydExpc3QoamF2YS51dGlsLkxpc3QgdHlwZXMpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc29ydCh0eXBlcyk7IC8vIHBlcmZvcm1hbmNlPyAgbipsb2cobikKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLS8vICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJTb3J0IGZhaWxlZCIpOwotICAgIH0KLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0KLQotICAvLyBpc3N1ZSAoY3MpIGRvIHdlIHN0aWxsIG5lZWQgdGhpcz8KLSAgcHVibGljIHZvaWQgdXBkYXRlTWFwQWZ0ZXJEZWxldGUoWFNESW1wb3J0IGRlbGV0ZWROb2RlKQotICB7Ci0gICAgU3RyaW5nIG5zID0gZGVsZXRlZE5vZGUuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgaWYgKG5zICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeChucywgZmFsc2UpOwotICAgICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcmVmaXggPSBwcmVmaXgudHJpbSgpOwotICAgICAgfQotICAgICAgU3RyaW5nIHhtbG5zQXR0ciA9IChwcmVmaXggPT0gIiIpID8gInhtbG5zIiA6ICJ4bWxuczoiICsgcHJlZml4OwotCi0gICAgICBpZiAocHJlZml4ID09ICIiKQotICAgICAgewotICAgICAgICBwcmVmaXggPSBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE1hcCBtYXAgPSB4c2RTY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgICAgICBtYXAucmVtb3ZlKHByZWZpeCk7Ci0gICAgICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIHNjaGVtYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHhtbG5zQXR0cik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UHJlZml4ZWROYW1lcyhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsgICAgCQkJCi0gICAgfQotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCAmJiBsb2NhbE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHByZWZpeGVzID0gZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByZWZpeGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAJU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAJaWYgKHByZWZpeCA9PSBudWxsKSBwcmVmaXggPSAiIjsKLSAgICAgICAgU3RyaW5nIHByZWZpeGVkTmFtZSA9IHByZWZpeC5sZW5ndGgoKSA+IDAgPyBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUgOiBsb2NhbE5hbWU7Ci0gICAgICAgIGxpc3QuYWRkKHByZWZpeGVkTmFtZSk7ICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAocHJlZml4ZXMuc2l6ZSgpID09IDApCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGxvY2FsTmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRQcmVmaXhlc0Zvck5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIE1hcCBtYXAgPSB4c2RTY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgewotICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgT2JqZWN0IHZhbHVlID0gbWFwLmdldChwcmVmaXgpOwotICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgIHsKLSAgICAgICBsaXN0LmFkZChwcmVmaXgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9WaWV3VXRpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9WaWV3VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDVhYzMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvVmlld1V0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vLyBpc3N1ZSAoY3MpIGNhbiB3ZSBnZXQgcmlkIG9mIHRoaXMgY2xhc3M/Ci0vLyBJJ3ZlIHN0cmlwcGVkIGl0IGRvd24gYSB3aG9sZSBsb3QuLi4gYnV0IGl0J2QgYmUgZ3JlYXQgdG8gZ2V0IHJpZCBvZiBpdAotLy8KLXB1YmxpYyBjbGFzcyBWaWV3VXRpbGl0eQotewotICBwcml2YXRlIHN0YXRpYyBGb250IGZvbnQ7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgRm9udCBnZXRGb250KCkKLSAgewotICAgIGlmIChmb250ID09IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgCi0gICAgICBmb250ID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJtcyBzYW5zIHNlcmlmIiwgOCwgU1dULk5PUk1BTCk7ICAKLSAgICB9Ci0gICAgcmV0dXJuIGZvbnQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29tcG9zaXRlKENvbXBvc2l0ZSBjb21wKQotICB7Ci0gICAgLy8gZGVwcmVjYXRlZC4gIFJlbW92ZSBsYXRlcgotICB9Ci0gIHB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgY29tcG9zaXRlLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucywgYm9vbGVhbiBob3Jpem9udGFsRmlsbCkKLSAgewotICAgIGlmICghaG9yaXpvbnRhbEZpbGwpCi0gICAgewotICAgICAgY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgbnVtQ29sdW1ucyk7Ci0gICAgfQotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICBjb21wb3NpdGUuc2V0Rm9udChnZXRGb250KCkpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4pIAotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgZm9yIGNyZWF0aW5nIGxhYmVscy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIAotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0KLQlwdWJsaWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgdGV4dCkKLQl7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgc3R5bGUpOwotLy8JCXNldENvbG9yKGxhYmVsKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0gIAotICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgYWxpZ25tZW50KQotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotIAotCi0KLSAgLyoqCi0gICAqIENyZWF0ZSByYWRpbyBidXR0b24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICBidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgY2hlY2sgYm94Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIAotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlQ29tYm9Cb3gocGFyZW50LCB0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgaW50IHN0eWxlID0gaXNSZWFkT25seSA9PSB0cnVlID8gU1dULlJFQURfT05MWSA6IFNXVC5EUk9QX0RPV047Ci0KLSAgICBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gY29tYm87Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgcmV0dXJuIHRleHQ7Ci0gIH0KLQotICAvKioKLSAgICogPGNvZGU+Y3JlYXRlV3JhcHBlZE11bHRpVGV4dEZpZWxkPC9jb2RlPiBjcmVhdGVzIGEgd3JhcHBlZCBtdWx0aXRleHQgZmllbGQKLSAgICoKLSAgICogQHBhcmFtIHBhcmVudCBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdmFsdWUKLSAgICogQHBhcmFtIHdpZHRoIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKLSAgICogQHBhcmFtIG51bUxpbmVzIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUgcmVwcmVzZW50aW5nIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGhlaWdodAotICAgKiBAcGFyYW0gdmVydGljYWxGaWxsIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLSAgICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IHZhbHVlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlV3JhcHBlZE11bHRpVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IG51bUxpbmVzLCBib29sZWFuIHZlcnRpY2FsRmlsbCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgaWYgKHZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIH0gICAgICAKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIEZvbnREYXRhW10gZm9udERhdGEgPSBnZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLSAgICAvLyBoYWNrIGZvciBub3cgd2hlcmUgb24gV2luZG93cywgb25seSAxIGZvbnRkYXRhIGV4aXN0cwotICAgIGRhdGEuaGVpZ2h0SGludCA9IG51bUxpbmVzICogZm9udERhdGFbMF0uZ2V0SGVpZ2h0KCk7Ci0gICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgcmV0dXJuIHRleHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlTXVsdGlUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIHZlcnRpY2FsRmlsbCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGlmICh2ZXJ0aWNhbEZpbGwpCi0gICAgewotICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB9ICAgICAgCi0gICAgZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLSAgICBkYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0gICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgcmV0dXJuIHRleHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNERE9NSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRERPTUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWJmMGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNERE9NSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8vIGlzc3VlIChjcykgcmVtb3ZlIHRoaXMgY2xhc3MhIQotcHVibGljIGNsYXNzIFhTRERPTUhlbHBlcgotewotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBYTUxTY2hlbWFVUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgWFNERE9NSGVscGVyLgotICAgKi8KLSAgcHVibGljIFhTRERPTUhlbHBlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Q2hpbGROb2RlKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgY2hpbGROYW1lKQotICB7Ci0vKiAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhNTFNjaGVtYVVSSSwgY2hpbGROYW1lKTsKLSAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgcmV0dXJuIG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgcmV0dXJuIG51bGw7Ci0qLwotICAgIE5vZGVMaXN0IGxpc3QgPSBudWxsOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICB9Ci0KLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIFBlcmZvcm1hbmNlIGlzc3VlIHBlcmhhcHM/Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGxpc3QuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobGlzdC5pdGVtKGkpLmdldExvY2FsTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLQotCi0KLSAgcHVibGljIHZvaWQgY2hhbmdlRGVyaXZlZEJ5VHlwZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBkZXJpdmVkQnlUeXBlLCBTdHJpbmcgdHlwZSkKLSAgewotICAgIERvY3VtZW50IGRvYyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgcHJlZml4ID0gcHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCArICI6IjsKLQotICAgIEVsZW1lbnQgZGVyaXZlZEJ5RWxlbWVudCA9IGdldERlcml2ZWRCeUVsZW1lbnQoZWxlbWVudCk7Ci0gICAgCi0gICAgaWYgKGRlcml2ZWRCeUVsZW1lbnQgIT0gbnVsbCAmJiBkZXJpdmVkQnlFbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhkZXJpdmVkQnlUeXBlKSkKLSAgICB7Ci0gICAgCXJldHVybjsgLy8gaXQncyBhbHJlYWR5IHRoZSBkZXJpdmVkIGJ5IHR5cGUKLSAgICB9Ci0gICAgRWxlbWVudCBuZXdOb2RlOwotICAJaWYgKGRlcml2ZWRCeVR5cGUuZXF1YWxzKCJyZXN0cmljdGlvbiIpKQotICAJewotICAgIAluZXdOb2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIAluZXdOb2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKTsKLSAgICB9Ci0JCi0gICAgbmV3Tm9kZS5zZXRBdHRyaWJ1dGUoImJhc2UiLCB0eXBlKTsKLQotICAgIGlmIChkZXJpdmVkQnlFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGRlcml2ZWRCeUVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIE5vZGVMaXN0IG5vZGVzID0gZGVyaXZlZEJ5RWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIC8vIHVzZSBjbG9uZXMgc28gd2UgZG9uJ3QgaGF2ZSBhIHJlZnJlc2ggcHJvYmxlbQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOyAgICAgICAKLSAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgfQotICAgICAgfQotCSAgZWxlbWVudC5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgZGVyaXZlZEJ5RWxlbWVudCk7Ci0gICAgfQotICAgIGVsc2UgCi0JewotCQlFbGVtZW50IHBhcmVudCA9IChFbGVtZW50KSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsJCQkJLy8gZ2V0IGJhY2sgdG8gY29tcGxleFR5cGUKLSAgICAgICAgTm9kZUxpc3Qgbm9kZXMgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlBcnJheUxpc3Qgbm9kZVNhdmVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJLy8gc2F2ZSBjaGlsZHJlbi4gKG5vZGVzIHR1cm5zIG91dCB0byBiZSB0aGUgc2FtZSBvYmplY3QgYXMgcGFyZW50OwotCQkvLyBkZWxldGluZyB0aGVtIGZyb20gcGFyZW50IHdpbGwgZGVsZXRlIHRoZW0gZnJvbSBub2Rlcy4pCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykJCQkKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7ICAgICAgCi0JCSAgbm9kZVNhdmVMaXN0LmFkZChub2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSBjaGlsZHJlbiBzbyB3ZSBjYW4gc3Vycm91bmQgdGhlbSBieSBjb21wbGV4Q29udGVudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVTYXZlTGlzdC5zaXplKCk7IGkrKykJCQkKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBub2RlU2F2ZUxpc3QuZ2V0KGkpOyAgICAgIAotICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLSAgICAgICAgfQotCQkKLQkJLy8gYnVpbGQgYSBjb21wbGV4Q29udGVudCBlbGVtZW50Ci0JCUVsZW1lbnQgY29tcGxleENvbnRlbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFhTRERPTUhlbHBlci5YTUxTY2hlbWFVUkksIHByZWZpeCArIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRyk7Ci0JCXBhcmVudC5hcHBlbmRDaGlsZChjb21wbGV4Q29udGVudCk7CQkJCQkvLyBpbnNlcnQgaW50byBjb21wbGV4VHlwZQotCQljb21wbGV4Q29udGVudC5hcHBlbmRDaGlsZChuZXdOb2RlKTsJCQkJLy8gaW5zZXJ0IGRlcml2YXRpb24gdHlwZQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVTYXZlTGlzdC5zaXplKCk7IGkrKykJCQkvLyBpbnNlcnQgY2hpbGRyZW4gcHJldmlvdXNseSBvZiBjb21wbGV4VHlwZQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIG5vZGVTYXZlTGlzdC5nZXQoaSk7ICAgICAgIAotICAgICAgICAgIG5ld05vZGUuYXBwZW5kQ2hpbGQobm9kZS5jbG9uZU5vZGUodHJ1ZSkpOwotICAgICAgICB9Ci0JCQotCQlwYXJlbnQuYXBwZW5kQ2hpbGQoY29tcGxleENvbnRlbnQpOwotCQlmb3JtYXRDaGlsZChjb21wbGV4Q29udGVudCk7Ci0gICAgfQotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGRlcml2ZWQgYnkgbm9kZSBnaXZlbiB0aGUgY29tcGxleENvbnRlbnQgb3Igc2ltcGxlQ29udGVudCBub2RlCi0gICAqLwotICBwdWJsaWMgRWxlbWVudCBnZXREZXJpdmVkQnlFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIE5vZGUgcmVzdHJpY3Rpb25DaGlsZCA9IGdldENoaWxkTm9kZShlbGVtZW50LCAicmVzdHJpY3Rpb24iKTsKLSAgICBOb2RlIGV4dGVuc2lvbkNoaWxkID0gZ2V0Q2hpbGROb2RlKGVsZW1lbnQsICJleHRlbnNpb24iKTsKLSAgICBpZiAocmVzdHJpY3Rpb25DaGlsZCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChyZXN0cmljdGlvbkNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50KXJlc3RyaWN0aW9uQ2hpbGQ7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChleHRlbnNpb25DaGlsZCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChleHRlbnNpb25DaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudClleHRlbnNpb25DaGlsZDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBkZXJpdmVkIGJ5IG5vZGUgZ2l2ZW4gdGhlIENvbXBsZXhUeXBlIG5vZGUKLSAgICogUmV0dXJucyB0aGUgZmlyc3Qgb25lLCBpZiBzYXksIHRoZSBJTlZBTElEIHNjaGVtYSBoYXMgbW9yZSB0aGFuIG9uZQotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RGVyaXZlZEJ5RWxlbWVudEZyb21Db21wbGV4VHlwZShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlTGlzdCBubCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBqID0gMDsKLSAgICBmb3IgKGogPSAwOyBqIDwgbmwuZ2V0TGVuZ3RoKCk7IGorKykKLSAgICB7Ci0gICAgICBOb2RlIGFOb2RlID0gbmwuaXRlbShqKTsKLSAgICAgIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOyAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGFOb2RlLCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgRWxlbWVudCBkZXJpdmVkQnlOb2RlID0gZ2V0RGVyaXZlZEJ5RWxlbWVudCgoRWxlbWVudClubC5pdGVtKGopKTsKLSAgICByZXR1cm4gZGVyaXZlZEJ5Tm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRlbnQgbW9kZWwgZ2l2ZW4gdGhlIENvbXBsZXhUeXBlIG5vZGUKLSAgICogUmV0dXJucyB0aGUgZmlyc3Qgb25lLCBpZiBzYXksIHRoZSBJTlZBTElEIHNjaGVtYSBoYXMgbW9yZSB0aGFuIG9uZQotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0Q29udGVudE1vZGVsRnJvbVBhcmVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlTGlzdCBubCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBqID0gMDsKLSAgICBib29sZWFuIG1vZGVsRXhpc3RzID0gZmFsc2U7Ci0gICAgaW50IGxlbmd0aCA9IG5sLmdldExlbmd0aCgpOwotICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBOb2RlIGFOb2RlID0gbmwuaXRlbShqKTsKLSAgICAgIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLlNFUVVFTkNFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBtb2RlbEV4aXN0cyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgbW9kZWxFeGlzdHMgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFtb2RlbEV4aXN0cykKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSAoRWxlbWVudClubC5pdGVtKGopOwotICAgIHJldHVybiBkZXJpdmVkQnlOb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2hhbmdlQ29udGVudE1vZGVsKEVsZW1lbnQgY29tcGxleFR5cGVFbGVtZW50LCBTdHJpbmcgY29udGVudE1vZGVsLCBFbGVtZW50IHNlcXVlbmNlQ2hvaWNlT3JBbGxFbGVtZW50KQotICB7Ci0gICAgRG9jdW1lbnQgZG9jID0gY29tcGxleFR5cGVFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBjb21wbGV4VHlwZUVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgcHJlZml4ID0gcHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCArICI6IjsKLSAgICAKLSAgICBFbGVtZW50IGNvbnRlbnRNb2RlbEVsZW1lbnQgPSBnZXRDb250ZW50TW9kZWxGcm9tUGFyZW50KGNvbXBsZXhUeXBlRWxlbWVudCk7Ci0KLSAgICBpZiAoY29udGVudE1vZGVsRWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoY29udGVudE1vZGVsKSkKLSAgICB7Ci0gICAgICByZXR1cm47IC8vIGl0J3MgYWxyZWFkeSB0aGUgY29udGVudCBtb2RlbCAKLSAgICB9Ci0gICAgRWxlbWVudCBuZXdOb2RlOwotICAgIG5ld05vZGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKFhTRERPTUhlbHBlci5YTUxTY2hlbWFVUkksIHByZWZpeCArIGNvbnRlbnRNb2RlbCk7Ci0KLSAgICBpZiAoY29udGVudE1vZGVsRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgeyAgICAgICAgCi0gICAgICBOb2RlTGlzdCBub2RlcyA9IGNvbnRlbnRNb2RlbEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgLy8gdXNlIGNsb25lcyBzbyB3ZSBkb24ndCBoYXZlIGEgcmVmcmVzaCBwcm9ibGVtCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChub2RlLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRykpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNvbnRlbnRNb2RlbEVsZW1lbnQsIFhTRENvbnN0YW50cy5DSE9JQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjb250ZW50TW9kZWxFbGVtZW50LCBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBmYWxzZSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKSB8fAotICAgICAgICAgICAgICAgICAgICBub2RlLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgICAgIGlmIChzZXF1ZW5jZUNob2ljZU9yQWxsRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHNlcXVlbmNlQ2hvaWNlT3JBbGxFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKG5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY29tcGxleFR5cGVFbGVtZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBjb250ZW50TW9kZWxFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNsb25lRWxlbWVudChFbGVtZW50IHBhcmVudCwgRWxlbWVudCBzb3VyY2VOb2RlKQotICB7Ci0gICAgRG9jdW1lbnQgZG9jID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50LmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXggKyAiOiI7Ci0gICAgCi0gICAgRWxlbWVudCBuZXdOb2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBzb3VyY2VOb2RlLmdldExvY2FsTmFtZSgpKTsKLQotICAgIGlmIChzb3VyY2VOb2RlLmhhc0NoaWxkTm9kZXMoKSkKLSAgICB7ICAgICAgICAKLSAgICAgIE5vZGVMaXN0IG5vZGVzID0gc291cmNlTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAvLyB1c2UgY2xvbmVzIHNvIHdlIGRvbid0IGhhdmUgYSByZWZyZXNoIHByb2JsZW0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLSAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXdOb2RlOwotLy8gICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdOb2RlLCBzb3VyY2VOb2RlKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNPbmx5V2hpdGVzcGFjZShOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlTGlzdCBsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IGxlbmd0aCA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgYm9vbGVhbiBoYXNPbmx5V2hpdGVzcGFjZSA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkID0gbGlzdC5pdGVtKGkpOwotICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0gICAgICB7Ci0gICAgICAgIGhhc09ubHlXaGl0ZXNwYWNlID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBjaGlsZC5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgU3RyaW5nIHRyaW1tZWRWYWx1ZSA9IHZhbHVlLnRyaW0oKTsKLSAgICAgICAgaWYgKHRyaW1tZWRWYWx1ZS5sZW5ndGgoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaGFzT25seVdoaXRlc3BhY2UgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIAotICAgIHJldHVybiBoYXNPbmx5V2hpdGVzcGFjZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAKLSAgICBOb2RlIG5leHRFbGVtZW50ID0gZ2V0TmV4dEVsZW1lbnROb2RlKG5vZGUpOwotICAgIE5vZGUgcHJldmlvdXNFbGVtZW50ID0gZ2V0UHJldmlvdXNFbGVtZW50Tm9kZShub2RlKTsKLQotICAgIE5vZGUgbmV4dFNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgaWYgKG5leHRTaWJsaW5nIGluc3RhbmNlb2YgVGV4dCkKLSAgICB7Ci0gICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5leHRTaWJsaW5nKTsKLSAgICB9Ci0KLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKQotICAgIHsKLQkJICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwotICAgIH0KLQotICAgIGlmIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLQkJCWZvcm1hdENoaWxkKG5leHRFbGVtZW50KTsKLSAgICB9Ci0KLQkJaWYgKHByZXZpb3VzRWxlbWVudCAhPSBudWxsKQotCQl7Ci0JCQlmb3JtYXRDaGlsZChwcmV2aW91c0VsZW1lbnQpOwotCQl9Ci0gIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXRDaGlsZChOb2RlIGNoaWxkKQotCXsKLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKWNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgICAgICAKLQkgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCSAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotCi0gIHByaXZhdGUgc3RhdGljIE5vZGUgZ2V0TmV4dEVsZW1lbnROb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIE5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAKLSAgICB3aGlsZSAoIShuZXh0IGluc3RhbmNlb2YgRWxlbWVudCkgJiYgbmV4dCAhPSBudWxsKQotICAgIHsKLSAgICAgIG5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0gICAgfQotICAgIGlmIChuZXh0IGluc3RhbmNlb2YgVGV4dCkKLSAgICB7Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gbmV4dDsKLSAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgTm9kZSBnZXRQcmV2aW91c0VsZW1lbnROb2RlKE5vZGUgbm9kZSkKLQl7Ci0JCU5vZGUgcHJldmlvdXMgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotICAgIAotCQl3aGlsZSAoIShwcmV2aW91cyBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIHByZXZpb3VzICE9IG51bGwpCi0JCXsKLQkJCXByZXZpb3VzID0gcHJldmlvdXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLSAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBUZXh0KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gcHJldmlvdXM7Ci0JfQotCi0gCi0KLSAgLy8gaXNzdWUgKGNzKSB3aGF0J3MgdGhpcyBtZXRob2Qgc3VwcG9zZWQgdG8gZG8/Ci0gIC8vIGJpenphcmUgbmFtZQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5wdXRFcXVhbHMoT2JqZWN0IGlucHV0LCBTdHJpbmcgdGFnbmFtZSwgYm9vbGVhbiBpc1JlZikKLSAgewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGlucHV0OwotICAgICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQotICAgICAgewotICAgICAgICBib29sZWFuIHJlZlByZXNlbnQgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgicmVmIik7Ci0KLSAgICAgICAgcmV0dXJuIHJlZlByZXNlbnQgPT0gaXNSZWY7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzZDkxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwgc2NoZW1hTG9jYXRvciA9IG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHNjaGVtYUxvY2F0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDk4NWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXIKLXsKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVTY2hlbWFMb2NhdGlvbihYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgc2NoZW1hTG9jYXRpb25VUkkpCi0gICAgewotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IHhzZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOyAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZVVSSSwgc2NoZW1hTG9jYXRpb25VUkkpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAJcmVzdWx0ID0gbmFtZXNwYWNlVVJJOwotICAgICAgfQotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAJcmVzdWx0ID0gIiI7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzOwotICAgIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbHMvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlscy9PcGVuT25TZWxlY3Rpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxYWE3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlscy9PcGVuT25TZWxlY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8vIGlzc3VlIChjcykgY2FuIHdlIHJlbW92ZSB0aGlzPwotLy8KLXB1YmxpYyBjbGFzcyBPcGVuT25TZWxlY3Rpb25IZWxwZXIKLXsKLSAgCi0gIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciB0ZXh0RWRpdG9yOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotIAotICBwdWJsaWMgT3Blbk9uU2VsZWN0aW9uSGVscGVyKFN0cnVjdHVyZWRUZXh0RWRpdG9yIHRleHRFZGl0b3IsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgCXRoaXMudGV4dEVkaXRvciA9IHRleHRFZGl0b3I7Ci0gIAl0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAKLQotICBib29sZWFuIGxhc3RSZXN1bHQ7Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlblhTREVkaXRvcihYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAKLSAgICBPcGVuSW5OZXdFZGl0b3Iub3BlblhTREVkaXRvcihlZGl0b3JJbnB1dCwgc2NoZW1hLCBzY2hlbWEpOyAgICAKLSAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlblhTREVkaXRvcihTdHJpbmcgc2NoZW1hTG9jYXRpb24pCi0gIHsKLSAgICBJUGF0aCBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOwotCQlmaW5hbCBJRmlsZSBzY2hlbWFGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNjaGVtYVBhdGgpOwotCQotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLQkJewotCQkJLyoqCi0JCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJewotCQkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCSAgd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSksIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBpbml0RXgpCi0JCQkJCXsKLQkJCQkJICBpbml0RXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJICBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfSAgICAgICAgICAKLQkJCX0KLQkJfSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHJldmVhbE9iamVjdChmaW5hbCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50LmdldFJvb3RDb250YWluZXIoKS5lcXVhbHMoeHNkU2NoZW1hKSkKLSAgICB7Ci0gICAgICBOb2RlIGVsZW1lbnQgPSBjb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKQotICAgICAgewotICAgICAgICBJbmRleGVkUmVnaW9uIGluZGV4Tm9kZSA9IChJbmRleGVkUmVnaW9uKSBlbGVtZW50OwotICAgICAgICB0ZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5zZXRSYW5nZUluZGljYXRpb24oaW5kZXhOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4Tm9kZS5nZXRFbmRPZmZzZXQoKSAtIGluZGV4Tm9kZS5nZXRTdGFydE9mZnNldCgpLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0UmVzdWx0ID0gZmFsc2U7Ci0gICAgICBpZiAoY29tcG9uZW50LmdldFNjaGVtYSgpICE9IG51bGwpCi0gICAgICB7Ci0JCQkJU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChjb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgIElQYXRoIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0JCQkJZmluYWwgSUZpbGUgc2NoZW1hRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShzY2hlbWFQYXRoKTsKLSAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCSAgICAgICAgICovCi0JICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotCSAgICAgICAgewotCQkgICAgICAgIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLQkJICAgICAgICB7Ci0JCQkJCQkJdHJ5Ci0JCQkJCQkJewotCQkJCQkJCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSksIFhTREVkaXRvclBsdWdpbi5QTFVHSU5fSUQpOwotCQkJCQkJCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQkoKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKWVkaXRvclBhcnQpLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShjb21wb25lbnQpOwotCQkJCQkJCQkJbGFzdFJlc3VsdCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGluaXRFeCkKLQkJCQkJCQl7Ci0JCQkJCQkJfQotCQkJCQkJfSAgICAgICAgICAKLQkJCQkJfQotCQkJCX0pOwotICAgICAgfQotICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgWFNETmFtZWRDb21wb25lbnQgb3Blbk9uR2xvYmFsUmVmZXJlbmNlKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXApCi0gIHsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0geHNkU2NoZW1hOwotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgIHsKLSAgICAgIG5hbWUgPSAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wKS5nZXROYW1lKCk7Ci0gICAgfQotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgLy8gRm9yIEFub255bW91cyB0eXBlcywganVzdCBzaG93IHRoZSBlbGVtZW50Ci0gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBjb21wOwotICAgICAgICBjb21wID0gdHlwZS5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWUgPSAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKHNjaGVtYSA9PSBudWxsIHx8IG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBMaXN0IG9iamVjdHMgPSBudWxsOyAgICAKLSAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBvYmplY3RzID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgb2JqZWN0cyA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBvYmplY3RzID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotICAgIH0KLQotICAgIGlmIChvYmplY3RzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcCA9IChYU0ROYW1lZENvbXBvbmVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAobmFtZWRDb21wLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXZlYWxPYmplY3QobmFtZWRDb21wKTsKLSAgICAgICAgICByZXR1cm4gbmFtZWRDb21wOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBvcGVuT25TZWxlY3Rpb24oKQotICB7Ci0gICAgTGlzdCBzZWxlY3RlZE5vZGVzID0gbnVsbDsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgIHNlbGVjdGVkTm9kZXMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotICAgIH0KLQotICAgIGlmIChzZWxlY3RlZE5vZGVzICE9IG51bGwgJiYgIXNlbGVjdGVkTm9kZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlbGVjdGVkTm9kZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXAgPSB4c2RTY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudCgoTm9kZSlvYmopOwotICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IG9iamVjdFRvUmV2ZWFsID0gbnVsbDsKLQotICAgICAgICAgIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudERlY2wuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBlbGVtZW50RGVjbC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0eXBlRGVmID0gbnVsbDsKLSAgICAgICAgICAgICAgaWYgKGVsZW1lbnREZWNsLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR5cGVEZWYgPSBlbGVtZW50RGVjbC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBzdWJHcm91cEFmZmlsaWF0aW9uID0gZWxlbWVudERlY2wuZ2V0U3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbigpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKHR5cGVEZWYgIT0gbnVsbCAmJiBzdWJHcm91cEFmZmlsaWF0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIDIgdGhpbmdzIHdlIGNhbiBuYXZpZ2F0ZSB0bywgaWYgdGhlIGN1cnNvciBpcyBhbnl3aGVyZSBvbiB0aGUgc3Vic3RpdHV0aW9uIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIC8vIHRoZW4ganVtcCB0byB0aGF0LCBvdGhlcndpc2UganVzdCBnbyB0byB0aGUgdHlwZURlZi4KLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQXR0ciAmJiAoKEF0dHIpb2JqKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBzdWJHcm91cEFmZmlsaWF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJldmVhbCB0aGUgdHlwZSBub3cuICBPbiBzdWNjZXNzLCB0aGVuIHdlIHJldHVybiB0cnVlLgotICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZmFpbCwgc2V0IHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgYXMgdGhlIG9iamVjdCB0byByZXZlYWwgYXMgYSBiYWNrdXAgcGxhbi4KLSAgICAgICAgICAgICAgICAgIGlmIChyZXZlYWxPYmplY3QodHlwZURlZikpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IHN1Ykdyb3VwQWZmaWxpYXRpb247Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG9uZSBvciBtb3JlIG9mIHRoZXNlIGlzIG51bGwuICBJZiB0aGUgdHlwZURlZiBpcyBub24tbnVsbCwgdXNlIGl0LiAgT3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAgLy8gdHJ5IGFuZCB1c2UgdGhlIHN1YnN0aXR1dGlvbiBncm91cAotICAgICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gdHlwZURlZiAhPSBudWxsID8gdHlwZURlZiA6IHN1Ykdyb3VwQWZmaWxpYXRpb247Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGVsZW1lbnREZWNsID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSB4c2RDb21wOwotICAgICAgICAgICAgaWYgKGVsZW1lbnREZWNsLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBlbGVtZW50RGVjbC5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChhdHRyRGVjbC5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYXR0ckRlY2wuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IGF0dHJEZWNsLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwRGVmID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChhdHRyR3JvdXBEZWYuaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBhdHRyR3JvdXBEZWYuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZENvbnN0cmFpbnREZWYgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChpZENvbnN0cmFpbnREZWYuZ2V0UmVmZXJlbmNlZEtleSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gaWRDb25zdHJhaW50RGVmLmdldFJlZmVyZW5jZWRLZXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IHR5cGVEZWYuZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0VG9SZXZlYWwgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gaWYgaXRlbVR5cGUgYXR0cmlidXRlIGlzIG5vdCBzZXQsIHRoZW4gY2hlY2sgZm9yIG1lbWJlclR5cGUKLSAgICAgICAgICAgICAgTGlzdCBtZW1iZXJUeXBlcyA9IHR5cGVEZWYuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgICAgIGlmIChtZW1iZXJUeXBlcyAhPSBudWxsICYmIG1lbWJlclR5cGVzLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCltZW1iZXJUeXBlcy5nZXQoMCk7Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RUeXBlRGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gdHlwZURlZi5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgICAgIHsKLSAgICAgICAgICAJWFNEU2NoZW1hRGlyZWN0aXZlIGRpcmVjdGl2ZSA9IChYU0RTY2hlbWFEaXJlY3RpdmUpIHhzZENvbXA7Ci0vLwkJCQkJCVN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woZGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0vLwkJCQkJCW9wZW5YU0RFZGl0b3Ioc2NoZW1hTG9jYXRpb24pOwotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IGRpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpOwkJCQkJCSAgICAgICAgICAJICAgICAgICAgIAkKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBub3cgcmV2ZWFsIHRoZSBvYmplY3QgaWYgdGhpcyBpc24ndCBudWxsCi0gICAgICAgICAgaWYgKG9iamVjdFRvUmV2ZWFsICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJldmVhbE9iamVjdChvYmplY3RUb1JldmVhbCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTBjY2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBwZXJmb3JtcyB0aGUgYXMteW91LXR5cGUgdmFsaWRhdGlvbiBmb3Igc2NoZW1hIGZpbGVzCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRCBleHRlbmRzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSWQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZCI7Ci0KLSAgcHJpdmF0ZSBWYWxpZGF0b3IgX3ZhbGlkYXRvcjsKLSAgCi0gIHB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNEKCkgeyAKLSAgfQotICAKLSAgcHJpdmF0ZSBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCl7Ci0JICBpZiAoX3ZhbGlkYXRvciA9PSBudWxsKV92YWxpZGF0b3IgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3IoSWQpOwotCSAgcmV0dXJuIF92YWxpZGF0b3I7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJVmFsaWRhdG9yIGdldERlbGVnYXRlVmFsaWRhdG9yKCkgewotCSAgVmFsaWRhdG9yIHYgPSBnZXRWYWxpZGF0b3IoKTsKLQkgIGlmICh2ID09IG51bGwpcmV0dXJuIG51bGw7Ci0JICByZXR1cm4gdi5hc0lWYWxpZGF0b3IoKTsKLSAgfQotICAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlbGVnYXRlVmFsaWRhdG9yRW5hYmxlZChJRmlsZSBmaWxlKSB7Ci0JCVZhbGlkYXRvciB2ID0gZ2V0VmFsaWRhdG9yKCk7Ci0JCWlmICh2ID09IG51bGwpcmV0dXJuIGZhbHNlOwotCQlpZiAoIXYuc2hvdWxkVmFsaWRhdGUoZmlsZSwgZmFsc2UsIGZhbHNlKSlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2LmlzQnVpbGRWYWxpZGF0aW9uKCkgfHwgdi5pc01hbnVhbFZhbGlkYXRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1lcmF0aW9uc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtZXJhdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmMTlmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1lcmF0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotCi0KLS8qKgotICogRGlhbG9nIHRvIGhlbHAgZGVmaW5lIGEgbGlzdCBvZiBlbnVtZXJhdGlvbnMKLSAqIGZvciBhIGpvaW4uIFRoaXMgbWlnaHQgYmUgcmVwbGFjZWQgb25jZSB3ZSBrbm93IGhvdyB0bwotICogaW5pdGlhdGUgYSBkcmFnIHRyYWNrZXIKLSAqLwotCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25zRGlhbG9nIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cKLXsKLSAgcHVibGljIEVudW1lcmF0aW9uc0RpYWxvZyhTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0VOVU1FUkFUSU9OU19ESUFMT0dfVElUTEUiKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgdGV4dCA9IHRleHRGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICBkZWxpbWl0ZXIgPSBkZWxpbWl0ZXJGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICBpc1ByZXNlcnZlID0gcHJlc2VydmVXaGl0ZXNwYWNlLmdldFNlbGVjdGlvbigpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHRleHQsIGRlbGltaXRlcjsKLSAgcHJpdmF0ZSBib29sZWFuIGlzUHJlc2VydmU7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsgcmV0dXJuIHRleHQ7IH0KLSAgcHVibGljIFN0cmluZyBnZXREZWxpbWl0ZXIoKSB7IHJldHVybiBkZWxpbWl0ZXI7IH0KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZXJ2ZVdoaXRlc3BhY2UoKSB7IHJldHVybiBpc1ByZXNlcnZlOyB9Ci0KLSAgcHJpdmF0ZSBUZXh0IHRleHRGaWVsZDsKLSAgcHJpdmF0ZSBCdXR0b24gcHJlc2VydmVXaGl0ZXNwYWNlOwotICBwcml2YXRlIENvbWJvIGRlbGltaXRlckZpZWxkOwotICAvLwotICAvLyBDcmVhdGUgdGhlIGNvbnRyb2xzCi0gIC8vCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbnRyb2xbXSB0YWJPcmRlciA9IG5ldyBDb250cm9sWzNdOwotICAJaW50IHRhYkluZGV4ID0gMDsKLSAgICBDb21wb3NpdGUgY2xpZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCljbGllbnQuZ2V0TGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsgCi0KLSAgICB0ZXh0RmllbGQgPSBWaWV3VXRpbGl0eS5jcmVhdGVXcmFwcGVkTXVsdGlUZXh0RmllbGQoY2xpZW50LCA0MDAsIDIwLCB0cnVlKTsKLSAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSkgdGV4dEZpZWxkLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgdGFiT3JkZXJbdGFiSW5kZXgrK10gPSB0ZXh0RmllbGQ7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0RmllbGQsIFhTREVkaXRvckNTSGVscElkcy5BRERfRU5VTUVSQVRJT05TX19OT19OQU1FKTsKLQotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0RFTElNSVRFUl9DSEFSIikpOwotICAgIGRlbGltaXRlckZpZWxkID0gVmlld1V0aWxpdHkuY3JlYXRlQ29tYm9Cb3goY2xpZW50LCBmYWxzZSk7Ci0gICAgZ2QgPSAoR3JpZERhdGEpIGRlbGltaXRlckZpZWxkLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICBnZC53aWR0aEhpbnQgPSAzMDsKLSAgICB0YWJPcmRlclt0YWJJbmRleCsrXSA9IGRlbGltaXRlckZpZWxkOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGVsaW1pdGVyRmllbGQsIFhTREVkaXRvckNTSGVscElkcy5BRERfRU5VTUVSQVRJT05TX19ERUxJTUlURVJfQ0hBUlMpOwotCi0gICAgLy8gYWRkIGRlZmF1bHQgZGVsaW1pdGVycwotICAgIGRlbGltaXRlckZpZWxkLmFkZCgiOiIpOwotICAgIGRlbGltaXRlckZpZWxkLmFkZCgiLCIpOwotICAgIGRlbGltaXRlckZpZWxkLmFkZCgiICIpOwotICAgIC8vIHNldCB0aGUgY3VycmVudCBvbmUgdG8gYmUgJywnCi0gICAgZGVsaW1pdGVyRmllbGQuc2V0VGV4dCgiLCIpOwotCi0gICAgcHJlc2VydmVXaGl0ZXNwYWNlID0gVmlld1V0aWxpdHkuY3JlYXRlQ2hlY2tCb3goY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfUFJFU0VSVkVfV0hJVEVTUEFDRSIpKTsKLSAgICBnZCA9IChHcmlkRGF0YSkgcHJlc2VydmVXaGl0ZXNwYWNlLmdldExheW91dERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgdGFiT3JkZXJbdGFiSW5kZXgrK10gPSBwcmVzZXJ2ZVdoaXRlc3BhY2U7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcmVzZXJ2ZVdoaXRlc3BhY2UsIFhTREVkaXRvckNTSGVscElkcy5BRERfRU5VTUVSQVRJT05TX19QUkVTRVJWRV9MRUFEX0FORF9UUkFJTF9XSElURVNQQUNFUyk7Ci0gICAgCi0gICAgY2xpZW50LnNldFRhYkxpc3QodGFiT3JkZXIpOwotCi0gICAgcmV0dXJuIGNsaWVudDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9UeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9UeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTI5ZmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvVHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgVHlwZVNlY3Rpb24KLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBUeXBlU2VjdGlvbi4KLSAgICogQHBhcmFtIHBhcmVudAotICAgKi8KLSAgcHVibGljIFR5cGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCBCdXR0b24gIHNpbXBsZVR5cGU7Ci0gIHByb3RlY3RlZCBCdXR0b24gIHVzZXJTaW1wbGVUeXBlOwotICBwcm90ZWN0ZWQgQnV0dG9uICB1c2VyQ29tcGxleFR5cGU7Ci0gIHByb3RlY3RlZCBCdXR0b24gIG5vbmVSYWRpbzsKLSAgcHJvdGVjdGVkIENvbWJvICAgdHlwZUxpc3Q7Ci0gIHByb3RlY3RlZCBDb21ibyAgIGRlcml2ZWRCeUNvbWJvOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93VXNlckNvbXBsZXhUeXBlID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1VzZXJTaW1wbGVUeXBlICA9IHRydWU7Ci0gIHByb3RlY3RlZCBib29sZWFuIHNob3dOb25lICAgICAgICAgICAgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0Rlcml2ZWRCeSAgICAgICA9IGZhbHNlOwotICBwcm90ZWN0ZWQgU3RyaW5nICBkZXJpdmVkQnlDaG9pY2VzW10gID0geyAicmVzdHJpY3Rpb24iLCAiZXh0ZW5zaW9uIiB9OwotICBwdWJsaWMgZmluYWwgaW50ICBOT05FICAgICAgICAgICAgICAgID0gMTsKLSAgcHVibGljIGZpbmFsIGludCAgQlVJTFRfSU4gICAgICAgICAgICA9IDI7Ci0gIHB1YmxpYyBmaW5hbCBpbnQgIFNJTVBMRSAgICAgICAgICAgICAgPSAzOwotICBwdWJsaWMgZmluYWwgaW50ICBDT01QTEVYICAgICAgICAgICAgID0gNDsKLQotICBTdHJpbmcgICAgICAgICAgICBzZWN0aW9uVGl0bGUgICAgICAgID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1RZUEVfSU5GT1JNQVRJT04iKTsKLSAgU3RyaW5nICAgICAgICAgICAgY3VycmVudE9iamVjdFV1aWQgICA9ICIiOwotCi0gIC8qCi0gICAqIEBzZWUgRmxhdFBhZ2VTZWN0aW9uI2NyZWF0ZUNsaWVudChDb21wb3NpdGUsIFdpZGdldEZhY3RvcnkpCi0gICAqLwotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNsaWVudChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgIGdsLnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0gICAgY2xpZW50LnNldExheW91dChnbCk7Ci0KLSAgICBpZiAoc2hvd05vbmUpCi0gICAgewotICAgICAgbm9uZVJhZGlvID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fTk9ORSIpKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChub25lUmFkaW8sIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9OT05FKTsKLSAgICB9Ci0KLSAgICBzaW1wbGVUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fQlVJTFRfSU5fU0lNUExFX1RZUEUiKSk7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHNpbXBsZVR5cGUsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9CVUlMVF9JTik7Ci0KLSAgICBpZiAoc2hvd1VzZXJTaW1wbGVUeXBlKQotICAgIHsKLSAgICAgIHVzZXJTaW1wbGVUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fVVNFUl9ERUZJTkVEX1NJTVBMRV9UWVBFIikpOwotICAgICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKHVzZXJTaW1wbGVUeXBlLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfVFlQRV9IRUxQRVJfVVNFUl9ERUZJTkVEX1NJTVBMRSk7Ci0gICAgfQotCi0gICAgaWYgKHNob3dVc2VyQ29tcGxleFR5cGUpCi0gICAgewotICAgICAgdXNlckNvbXBsZXhUeXBlID0gVmlld1V0aWxpdHkuY3JlYXRlUmFkaW9CdXR0b24oY2xpZW50LCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fVVNFUl9ERUZJTkVEX0NPTVBMRVhfVFlQRSIpKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh1c2VyQ29tcGxleFR5cGUsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9VU0VSX0RFRklORURfQ09NUExFWCk7Ci0gICAgfQotCi0gICAgLy8JICB0eXBlTGlzdCA9IHV0aWxpdHkuY3JlYXRlQ29tYm9Cb3goY2xpZW50KTsKLSAgICAvLwkgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh0eXBlTGlzdCwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX1RZUEVfSEVMUEVSX1RZUEUpOwotICAgIC8vICAgIHV0aWxpdHkuY3JlYXRlSGVhZGluZ0xhYmVsKGNsaWVudCwgIlR5cGUiLG51bGwpOwotCi0gICAgaWYgKHNob3dEZXJpdmVkQnkpCi0gICAgewotICAgICAgQ29tcG9zaXRlIGRlcml2ZWRCeUNvbXBvc2l0ZSA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShjbGllbnQsIDIpOwotICAgICAgVmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoZGVyaXZlZEJ5Q29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfREVSSVZFRF9CWSIpKTsKLSAgICAgIGRlcml2ZWRCeUNvbWJvID0gVmlld1V0aWxpdHkuY3JlYXRlQ29tYm9Cb3goZGVyaXZlZEJ5Q29tcG9zaXRlKTsKLSAgICAgIHBvcHVsYXRlRGVyaXZlZEJ5Q29tYm8oKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkZXJpdmVkQnlDb21ibywgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX1NJTVBMRV9DT05URU5UX0RFUklWRUQpOwotICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfREVSSVZFRF9CWSIpKTsKLSAgICB9Ci0gICAgLy8gU2V0IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgotICAgIGlmIChzaG93Tm9uZSkKLSAgICB7Ci0gICAgICAvLwkJbm9uZVJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgIC8vCQl0eXBlTGlzdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNpbXBsZVR5cGUuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIH0KLSAgICByZXR1cm4gY2xpZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNEZXJpdmVkQnkoYm9vbGVhbiBkZXJpdmUpCi0gIHsKLSAgICBpZiAoZGVyaXZlKQotICAgIHsKLSAgICAgIHNlY3Rpb25UaXRsZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNlY3Rpb25UaXRsZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9UWVBFX0lORk9STUFUSU9OIik7Ci0gICAgfQotICAgIC8vCXNldEhlYWRlclRleHQoc2VjdGlvblRpdGxlKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdG8gdHJ1ZSBpZiBjYWxsZWQgYnkgQ29tcGxleCBUeXBlICYgU2ltcGxlIFR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dEZXJpdmVkQnkoYm9vbGVhbiBkZXJpdmUpCi0gIHsKLSAgICBzaG93RGVyaXZlZEJ5ID0gZGVyaXZlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGRlcml2ZWRCeUZpZWxkCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIENvbWJvIGdldERlcml2ZWRCeUNvbWJvKCkKLSAgewotICAgIHJldHVybiBkZXJpdmVkQnlDb21ibzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBub25lUmFkaW8uCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBnZXROb25lUmFkaW8oKQotICB7Ci0gICAgcmV0dXJuIG5vbmVSYWRpbzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzaW1wbGVUeXBlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBCdXR0b24KLSAgICovCi0gIHB1YmxpYyBCdXR0b24gZ2V0U2ltcGxlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2ltcGxlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB1c2VyQ29tcGxleFR5cGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBnZXRVc2VyQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHVzZXJDb21wbGV4VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB1c2VyU2ltcGxlVHlwZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgQnV0dG9uCi0gICAqLwotICBwdWJsaWMgQnV0dG9uIGdldFVzZXJTaW1wbGVUeXBlKCkKLSAgewotICAgIHJldHVybiB1c2VyU2ltcGxlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB0eXBlTGlzdC4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgQ0NvbWJvCi0gICAqLwotICBwdWJsaWMgQ29tYm8gZ2V0VHlwZUxpc3QoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFBvcHVsYXRlIGNvbWJvIGJveCB3aXRoIGJ1aWx0LWluIHNpbXBsZSB0eXBlcwotICAgKi8KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVCdWlsdEluVHlwZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgZ2V0VHlwZUxpc3QoKS5yZW1vdmVBbGwoKTsKLSAgICBMaXN0IGl0ZW1zID0gZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgIHJldHVybiBoZWxwZXIuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZSBjb21ibyBib3ggd2l0aCB1c2VyIGRlZmluZWQgY29tcGxleCB0eXBlcwotICAgKi8KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyQ29tcGxleFR5cGUoWFNEU2NoZW1hIHhzZFNjaGVtYSwgYm9vbGVhbiBzaG93QW5vbnltb3VzKQotICB7Ci0gICAgZ2V0VHlwZUxpc3QoKS5yZW1vdmVBbGwoKTsKLSAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICB7Ci0gICAgICBnZXRUeXBlTGlzdCgpLmFkZChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQU5PTllNT1VTIikpOwotICAgIH0KLQotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICByZXR1cm4gaGVscGVyLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZShYU0RTY2hlbWEgeHNkU2NoZW1hLCBib29sZWFuIHNob3dBbm9ueW1vdXMpCi0gIHsKLSAgICBnZXRUeXBlTGlzdCgpLnJlbW92ZUFsbCgpOwotICAgIGlmIChzaG93QW5vbnltb3VzKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BTk9OWU1PVVMiKSk7Ci0gICAgfQotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZ2V0VHlwZUxpc3QoKS5hZGQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZSBjb21ibyBib3ggd2l0aCB1c2VyIGRlZmluZWQgc2ltcGxlIHR5cGVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVVzZXJTaW1wbGVUeXBlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBnZXRUeXBlTGlzdCgpLnJlbW92ZUFsbCgpOwotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCh4c2RTY2hlbWEpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZ2V0VHlwZUxpc3QoKS5hZGQoaXRlbXMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgcmV0dXJuIGhlbHBlci5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5zLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgU3RyaW5nIGtleSA9IGhlbHBlci5nZXRQcmVmaXgobnMsIHRydWUpOwotICAgIHJldHVybiBrZXk7Ci0gIH0KLQotICAvKioKLSAgICogUG9wdWxhdGUgY29tYm8gYm94IHdpdGggZGVyaXZlZCBieSBjaG9pY2VzCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURlcml2ZWRCeUNvbWJvKCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVyaXZlZEJ5Q2hvaWNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBnZXREZXJpdmVkQnlDb21ibygpLmFkZChkZXJpdmVkQnlDaG9pY2VzW2ldKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgc2hvd1VzZXJDb21wbGV4VHlwZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd1VzZXJDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2hvd1VzZXJDb21wbGV4VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzaG93VXNlclNpbXBsZVR5cGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dVc2VyU2ltcGxlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2hvd1VzZXJTaW1wbGVUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHNob3dOb25lLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93Tm9uZSgpCi0gIHsKLSAgICByZXR1cm4gc2hvd05vbmU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2hvd1VzZXJDb21wbGV4VHlwZS4KLSAgICogQHBhcmFtIHNob3dVc2VyQ29tcGxleFR5cGUgVGhlIHNob3dVc2VyQ29tcGxleFR5cGUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93VXNlckNvbXBsZXhUeXBlKGJvb2xlYW4gc2hvd1VzZXJDb21wbGV4VHlwZSkKLSAgewotICAgIHRoaXMuc2hvd1VzZXJDb21wbGV4VHlwZSA9IHNob3dVc2VyQ29tcGxleFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2hvd1VzZXJTaW1wbGVUeXBlLgotICAgKiBAcGFyYW0gc2hvd1VzZXJTaW1wbGVUeXBlIFRoZSBzaG93VXNlclNpbXBsZVR5cGUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93VXNlclNpbXBsZVR5cGUoYm9vbGVhbiBzaG93VXNlclNpbXBsZVR5cGUpCi0gIHsKLSAgICB0aGlzLnNob3dVc2VyU2ltcGxlVHlwZSA9IHNob3dVc2VyU2ltcGxlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzaG93Tm9uZQotICAgKiBAcGFyYW0gc2hvd1VzZXJTaW1wbGVUeXBlIFRoZSBzaG93Tm9uZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dOb25lKGJvb2xlYW4gc2hvd05vbmUpCi0gIHsKLSAgICB0aGlzLnNob3dOb25lID0gc2hvd05vbmU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvWFNERWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvWFNERWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwMTU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1hTREVkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCSAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRTY2hlbWFJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZvcm07Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0U2NoZW1hSW5mb0RpYWxvZyBleHRlbmRzIEVkaXRTY2hlbWFJbmZvRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCVN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0JQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyBlZGl0TmFtZXNwYWNlc0NvbnRyb2w7Ci0gIENvbWJvIGVsZW1lbnRGb3JtQ29tYm8sIGF0dHJpYnV0ZUZvcm1Db21ibzsKLSAgU3RyaW5nIGVsZW1lbnRGb3JtUXVhbGlmaWVkID0gIiIsIGF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQgPSAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gIAotICBwcml2YXRlIFN0cmluZyBbXSBmb3JtUXVhbGlmaWNhdGlvbiA9IHsgIiIsIFhTREZvcm0uUVVBTElGSUVEX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpLCBYU0RGb3JtLlVOUVVBTElGSUVEX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpIH07ICAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFhTREVkaXRTY2hlbWFJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JfQotLyoKLQkvLyBpbiBzdXBlcgotCXByb3RlY3RlZCBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBjcmVhdGVDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhDb21wb3NpdGUgZGlhbG9nQXJlYSkKLQl7Ci0JICByZXR1cm4gbmV3IENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nKGRpYWxvZ0FyZWEsIHJlc291cmNlTG9jYXRpb24sIFhNTFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlMiKSwgZmFsc2UsIHRydWUpOyAvLyROT04tTkxTLTEkCQkJCQotCX0KLQkKLQkvLyBpbiBzdXBlcgotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgZWRpdE5hbWVzcGFjZXNDb250cm9sID0gY3JlYXRlQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coZGlhbG9nQXJlYSk7IAotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wuc2V0TmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wudXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCQotCS8vIGluIHRoaXMKLQlwcm90ZWN0ZWQgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgY3JlYXRlQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coQ29tcG9zaXRlIGRpYWxvZ0FyZWEpCi0JewotCSAgcmV0dXJuIG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nKGRpYWxvZ0FyZWEsIHJlc291cmNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCQkJCQotCX0JKi8KLQkKLQkvLyB0aGlzIGlzIGNvcHkgb2YgLi4uLgotICAgIHByb3RlY3RlZCBDb250cm9sIF9faW50ZXJuYWxDcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLSAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9CQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIF9faW50ZXJuYWxDcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWVkaXROYW1lc3BhY2VzQ29udHJvbCA9IG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nKGRpYWxvZ0FyZWEsIHJlc291cmNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLQkJewkKLQkJCWVkaXROYW1lc3BhY2VzQ29udHJvbC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLQkJfQotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wuc2V0TmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wudXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICAKLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAKLSAgICBDb21wb3NpdGUgb3RoZXJBdHRyaWJ1dGVzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgb3RoZXJBdHRyaWJ1dGVzQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotICAgIG90aGVyQXR0cmlidXRlc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIExhYmVsIGVsZW1lbnRGb3JtTGFiZWwgPSBuZXcgTGFiZWwob3RoZXJBdHRyaWJ1dGVzQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgZWxlbWVudEZvcm1MYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5URk9STURFRkFVTFQpOwotCi0gICAgZWxlbWVudEZvcm1Db21ibyA9IG5ldyBDb21ibyhvdGhlckF0dHJpYnV0ZXNDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBlbGVtZW50Rm9ybUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGVsZW1lbnRGb3JtQ29tYm8uc2V0SXRlbXMoZm9ybVF1YWxpZmljYXRpb24pOwotICAgIGVsZW1lbnRGb3JtQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgTGFiZWwgYXR0cmlidXRlRm9ybUxhYmVsID0gbmV3IExhYmVsKG90aGVyQXR0cmlidXRlc0NvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgIGF0dHJpYnV0ZUZvcm1MYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSSUJVVEVGT1JNREVGQVVMVCk7Ci0gICAgCi0gICAgYXR0cmlidXRlRm9ybUNvbWJvID0gbmV3IENvbWJvKG90aGVyQXR0cmlidXRlc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGF0dHJpYnV0ZUZvcm1Db21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBhdHRyaWJ1dGVGb3JtQ29tYm8uc2V0SXRlbXMoZm9ybVF1YWxpZmljYXRpb24pOwotICAgIGF0dHJpYnV0ZUZvcm1Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBhcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGVkaXROYW1lc3BhY2VzQ29udHJvbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQl9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJc0VsZW1lbnRRdWFsaWZpZWQoU3RyaW5nIHN0YXRlKQotICB7Ci0gICAgZWxlbWVudEZvcm1Db21iby5zZXRUZXh0KHN0YXRlKTsKLSAgICBlbGVtZW50Rm9ybVF1YWxpZmllZCA9IHN0YXRlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJc0F0dHJpYnV0ZVF1YWxpZmllZChTdHJpbmcgc3RhdGUpCi0gIHsKLSAgICBhdHRyaWJ1dGVGb3JtQ29tYm8uc2V0VGV4dChzdGF0ZSk7Ci0gICAgYXR0cmlidXRlRm9ybVF1YWxpZmllZCA9IHN0YXRlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRGb3JtUXVhbGlmaWVkKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50Rm9ybVF1YWxpZmllZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVGb3JtUXVhbGlmaWVkKCkKLSAgewotICAgIHJldHVybiBhdHRyaWJ1dGVGb3JtUXVhbGlmaWVkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYXR0cmlidXRlRm9ybUNvbWJvKQotICAgIHsKLSAgICAgIGF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQgPSBhdHRyaWJ1dGVGb3JtQ29tYm8uZ2V0VGV4dCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBlbGVtZW50Rm9ybUNvbWJvKQotICAgIHsKLSAgICAgIGVsZW1lbnRGb3JtUXVhbGlmaWVkID0gZWxlbWVudEZvcm1Db21iby5nZXRUZXh0KCk7Ci0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0RXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNEV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2QyOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYU0RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIE5ld1hTRFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgWFNETmV3RmlsZVBhZ2UgbmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCXB1YmxpYyBOZXdYU0RXaXphcmQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQl0aGlzLndvcmtiZW5jaCA9IGFXb3JrYmVuY2g7Ci0KLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvTmV3WFNELnBuZyIpKTsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfV0laQVJEX0NSRUFURV9YU0RfTU9ERUxfVElUTEUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCW5ld0ZpbGVQYWdlID0gbmV3IFhTRE5ld0ZpbGVQYWdlKHNlbGVjdGlvbik7Ci0JCWFkZFBhZ2UobmV3RmlsZVBhZ2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlGaWxlIGZpbGUgPSBuZXdGaWxlUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJLy8KLQkJLy8gR2V0IHRoZSB4c2Qgc2NoZW1hIG5hbWUgZnJvbSB0aGUgZnVsbCBwYXRoIG5hbWUKLQkJLy8gZS5nLiBmOi9iMmIvcG8ueHNkID0+IHNjaGVtYSBuYW1lID0gcG8KLQkJLy8KLQkJSVBhdGggaVBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCQkvLyBTdHJpbmcgc2NoZW1hTmFtZSA9IGlQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCVN0cmluZyBzY2hlbWFOYW1lID0gaVBhdGgubGFzdFNlZ21lbnQoKTsKLQkJU3RyaW5nIHNjaGVtYVByZWZpeCA9ICJ0bnMiOwotCQlTdHJpbmcgcHJlZml4Rm9yU2NoZW1hTmFtZXNwYWNlID0gIiI7Ci0JCVN0cmluZyBzY2hlbWFOYW1lc3BhY2VBdHRyaWJ1dGUgPSAieG1sbnMiOwotCQlpZiAoWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmlzUXVhbGlmeVhNTFNjaGVtYUxhbmd1YWdlKCkpIHsKLQkJCS8vIEFkZGVkIHRoaXMgaWYgY2hlY2sgYmVmb3JlIGRpc2FsbG93aW5nIGJsYW5rIHByZWZpeGVzIGluIHRoZQotCQkJLy8gcHJlZmVyZW5jZXMuLi4KLQkJCS8vIENhbiB0YWtlIHRoaXMgb3V0LiBTZWUgYWxzbyBYU0RFZGl0b3IKLQkJCWlmIChYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hUHJlZml4KCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCXByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYTUxTY2hlbWFQcmVmaXgoKSArICI6IjsKLQkJCQlzY2hlbWFOYW1lc3BhY2VBdHRyaWJ1dGUgKz0gIjoiICsgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhNTFNjaGVtYVByZWZpeCgpOwotCQkJfQotCQl9Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsKLQkJCWNoYXJTZXQgPSAiVVRGLTgiOwotCQl9Ci0KLQkJU3RyaW5nIG5ld0NvbnRlbnRzID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBjaGFyU2V0ICsgIlwiPz5cbiI7Ci0KLQkJU3RyaW5nIGRlZmF1bHRUYXJnZXRVUkkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCW5ld0NvbnRlbnRzICs9ICI8IiArIHByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSArICJzY2hlbWEgIiArIHNjaGVtYU5hbWVzcGFjZUF0dHJpYnV0ZSArICI9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIHRhcmdldE5hbWVzcGFjZT1cIiIgKyBkZWZhdWx0VGFyZ2V0VVJJICsgc2NoZW1hTmFtZSArICJcIiB4bWxuczoiICsgc2NoZW1hUHJlZml4ICsgIj1cIiIgKyBkZWZhdWx0VGFyZ2V0VVJJICsgc2NoZW1hTmFtZSArICJcIiBlbGVtZW50Rm9ybURlZmF1bHQ9XCJxdWFsaWZpZWRcIj5cbjwvIiArIHByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSArICJzY2hlbWE+IjsKLQotCQl0cnkgewotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3Q29udGVudHMuZ2V0Qnl0ZXMoY2hhclNldCk7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0KLQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoIkVycm9yIHdyaXRpbmcKLQkJCS8vIGRlZmF1bHQgY29udGVudDpcbiIgKyBuZXdDb250ZW50cyk7Ci0JCQkvLyBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoZSk7Ci0JCX0KLQotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXZlYWxTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsZSkpOwotCQl9Ci0KLQkJb3BlbkVkaXRvcihmaWxlKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmV2ZWFsU2VsZWN0aW9uKGZpbmFsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2gyOwotCQkJaWYgKHdvcmtiZW5jaCA9PSBudWxsKQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gd29ya2JlbmNoOwotCQkJfQotCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2gyLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJZmluYWwgSVdvcmtiZW5jaFBhcnQgZm9jdXNQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQlpZiAoZm9jdXNQYXJ0IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkgewotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldCkgZm9jdXNQYXJ0KS5zZWxlY3RSZXZlYWwoc2VsZWN0aW9uKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaCB3b3JrYmVuY2gyOwotCQkJaWYgKHdvcmtiZW5jaCA9PSBudWxsKQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJICB3b3JrYmVuY2gyID0gd29ya2JlbmNoOwotCQkJfQotCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2gyLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBlZGl0b3JJZCA9IG51bGw7Ci0JCQkJCQlJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihpRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwgaUZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCQllZGl0b3JJZCA9IGVkaXRvci5nZXRJZCgpOwotCQkJCQkJfQotCQkJCQkJd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoaUZpbGUpLCBlZGl0b3JJZCk7Ci0JCQkJCQkKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpIHsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhDb21wb3NpdGlvblBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhDb21wb3NpdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNzEyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Q29tcG9zaXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gQmFzZWQgb24gdmVyc2lvbiAxLjEyIG9mIG9yaWdpbmFsIHhzZGVkaXRvcgotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhdHRlcm5GYWNldDsKLQotCi0KLS8qCi0tb3RoZXIgcmVnZXggZmVhdHVyZXMgKGVnIGNhc2Ugc2Vuc2l0aXZpdHksIF4gb3IgJCwgfCwgZXRjIGV0YykKLS1zbWFydGVyIG1vZGVsCi0tYmV0dGVyIGtleWJvYXJkIG5hdmlnYXRpb24KLS11cGRhdGUgbGlzdCBvZiB0b2tlbnMgCi0qLwotCi1wdWJsaWMgY2xhc3MgUmVnZXhDb21wb3NpdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotICAvKiBUaGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBvdXIgcGF0dGVybi4gKi8KLSAgcHJpdmF0ZSBTdHlsZWRUZXh0IHZhbHVlOyAKLQotICAvKiBUaGUgU3R5bGVSYW5nZSB1c2VkIHRvIGNvbG9yIGNvZGUgdGhlIGN1cnJlbnQgcGFyc2UgZXJyb3IuICovCi0gIHByaXZhdGUgU3R5bGVSYW5nZSBjdXJyZW50RXJyb3I7Ci0KLSAgLyogVGhlIHJlZ2V4IHRlcm1zIHdlIGNhbiBmb3JtIHRva2VucyBmcm9tLiAqLwotICBwcml2YXRlIENvbWJvIHRlcm1zOwotCi0gIC8qIFRoZSBjaGVja2JveCBmb3IgYWN0aXZhdGluZyBhdXRvLWVzY2FwZSBtb2RlLiAqLyAgCi0gIHByaXZhdGUgQnV0dG9uIGVzY2FwZUNoZWNrYm94OwotICAKLSAgLyogT24vb2ZmIHN0YXR1cyBvZiBhdXRvLWVzY2FwZSBtb2RlLiAqLyAKLSAgcHJpdmF0ZSBib29sZWFuIGF1dG9Fc2NhcGVTdGF0dXM7Ci0KLSAgLyogVGhlIEFkZCBUb2tlbiBidXR0b24uICovCi0gIHByaXZhdGUgQnV0dG9uIGFkZDsKLQotCi0gIC8vIFRoZSBmb2xsb3dpbmcgY29udHJvbHMgYXJlIHVzZWQgaW4gdGhlIG9jY3VycmVuY2Ugc2VsZWN0aW9uIGdyb3VwCi0KLSAgcHJpdmF0ZSBUZXh0IHJlcGVhdFZhbHVlOwotCi0gIHByaXZhdGUgVGV4dCByYW5nZU1pblZhbHVlOwotICBwcml2YXRlIFRleHQgcmFuZ2VNYXhWYWx1ZTsKLSAgcHJpdmF0ZSBMYWJlbCByYW5nZVRvTGFiZWw7ICAKLQotICBwcml2YXRlIEJ1dHRvbiBzaW5nbGVSYWRpbzsKLSAgcHJpdmF0ZSBCdXR0b24gc3RhclJhZGlvOwotICBwcml2YXRlIEJ1dHRvbiBwbHVzUmFkaW87Ci0gIHByaXZhdGUgQnV0dG9uIG9wdGlvbmFsUmFkaW87IAotICBwcml2YXRlIEJ1dHRvbiByZXBlYXRSYWRpbzsKLSAgcHJpdmF0ZSBCdXR0b24gcmFuZ2VSYWRpbzsKLQotICAKLSAgLy8gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBtb2RlbC4gCi0KLSAgLyogT3VyIHBhdHRlcm4uICovCi0gIHByaXZhdGUgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm47Ci0KLSAgLyogTW9kZWwgdXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCB0b2tlbi4gKi8KLSAgcHJpdmF0ZSBSZWdleE5vZGUgbm9kZTsgICAgCi0KLSAgLyogVGhlIGZsYWdzIHBhc3NlZCB0byB0aGUgbmV3IFJlZ3VsYXJFeHByZXNzaW9uIG9iamVjdC4gIERlZmF1bHQgdmFsdWUgaW5jbHVkZXM6Ci0gICAgICBYID0gWE1MU2NoZW1hIG1vZGUgICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVnZXhGbGFncyA9ICJYIjsKLSAgICAgIAotCi0gIC8qIElzIHRoZSBjdXJyZW50IHJlZ2V4IHRva2VuIHZhbGlkPyAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFRva2VuOwotCi0gIC8qIFRoZSBsYWJlbCB1c2VkIHRvIGluZGljYXRlIHRoZSB2YWx1ZSdzIGNhcmV0IHBvc2l0aW9uIHdoZW4gaXQgbG9vc2VzIGZvY3VzLiAqLwotICBwcml2YXRlIExhYmVsIGNhcmV0TGFiZWw7Ci0KLSAgLyogVGhlIHBpeGVsIG9mZnNldHMgbmVlZGVkIHRvIGFsaWduIHRoZSBsYWJlbCBpY29uIHdpdGggdGhlIGNhcmV0IGxvY2F0aW9uLgotICAgICBUaGVzZSBhcmUgZGVwZW5kZW50IG9uIHRoZSBpY29uIHVzZWQuICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQVJFVF9MQUJFTF9YX09GRlNFVCA9IC0zOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FSRVRfTEFCRUxfWV9PRkZTRVQgPSAxOTsKLQotICAKLSAgLyogRW51bWVyYXRlZCBjb25zdGFudHMgZm9yIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgYW4gZXJyb3IgbWVzc2FnZS4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTiA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVJTRSA9IDI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0VSUk9SX01FU1NBR0VfVFlQRVMgPSAzOwotICAKLSAgLyogVGhlIGN1cnJlbnQgZXJyb3IgbWVzc2FnZSBmb3IgZWFjaCB0eXBlIG9mIGVycm9yLiAgQSB2YWx1ZSBvZiBudWxsIGluZGljYXRlcyBubyBtZXNzYWdlLiAKLSAgICAgVGhlIGFycmF5IGlzIGluZGV4ZWQgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBjb25zdGFudHMuCi0gICovCi0gIHByaXZhdGUgU3RyaW5nW10gY3VycmVudEVycm9yTWVzc2FnZXM7Ci0KLQotICBwdWJsaWMgUmVnZXhDb21wb3NpdGlvblBhZ2UoWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4pCi0gIHsKLSAgICBzdXBlcihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfVElUTEUiKSk7Ci0gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQotICAgIHNldFRpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfQ09NUE9TSVRJT05fUEFHRV9USVRMRSIpKTsKLSAgICBzZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBTZXQgdXAgb3VyIG1vZGVsIGFuZCB2YWxpZGF0b3IKLSAgICBub2RlID0gbmV3IFJlZ2V4Tm9kZSgpOwotICAgICAgICAKLSAgICBpc1ZhbGlkVG9rZW4gPSB0cnVlOwotCi0gICAgY3VycmVudEVycm9yTWVzc2FnZXMgPSBuZXcgU3RyaW5nW05VTV9FUlJPUl9NRVNTQUdFX1RZUEVTXTsKLQotICAgIC8vIFRoZSBtYWluIGNvbXBvc2l0ZQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9XSVpBUkRfUEFHRSk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCi0gICAgLy8gVGhlIGNvbXBvc2l0ZSBmb3IgdGhlIHRva2VuIGNvbWJvIGJveCwgbGFiZWwsIGFuZCBhdXRvLWVzY2FwZSBjaGVja2JveAotICAgIENvbXBvc2l0ZSB0b2tlbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgdG9rZW5Db21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHRva2VuQ29tcG9zaXRlTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIHRva2VuQ29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICB0b2tlbkNvbXBvc2l0ZS5zZXRMYXlvdXQodG9rZW5Db21wb3NpdGVMYXlvdXQpOwotCi0KLSAgICBuZXcgTGFiZWwodG9rZW5Db21wb3NpdGUsIFNXVC5MRUZUKS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVE9LRU5fTEFCRUwiKSk7Ci0gICAgCi0gICAgdGVybXMgPSBuZXcgQ29tYm8odG9rZW5Db21wb3NpdGUsIFNXVC5EUk9QX0RPV04pOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGVybXMsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9UT0tFTl9DT05URU5UUyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSZWdleE5vZGUuZ2V0TnVtUmVnZXhUZXJtcygpOyBpKyspCi0gICAgewotICAgICAgdGVybXMuYWRkKFJlZ2V4Tm9kZS5nZXRSZWdleFRlcm1UZXh0KGkpKTsKLSAgICB9Ci0gICAgdGVybXMuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgbmV3IENvbWJvTGlzdGVuZXIoKSk7Ci0gICAgdGVybXMuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX1RFUk1TIikpOwotCi0gICAgZXNjYXBlQ2hlY2tib3ggPSBuZXcgQnV0dG9uKHRva2VuQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgIGVzY2FwZUNoZWNrYm94LnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9BVVRPX0VTQ0FQRV9DSEVDS0JPWF9MQUJFTCIpKTsKLSAgICBlc2NhcGVDaGVja2JveC5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQVVUT19FU0NBUEVfQ0hFQ0tCT1giKSk7IAotICAgIGVzY2FwZUNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBDaGVja2JveExpc3RlbmVyKCkpOwotICAgIGF1dG9Fc2NhcGVTdGF0dXMgPSBmYWxzZTsKLQotCi0gICAgLy8gU2V0IHVwIHRoZSBjb21wb3NpdGVzIHBlcnRhaW5pbmcgdG8gdGhlIHNlbGVjdGlvbiBvZiBvY2N1cnJlbmNlIHF1YW50aWZpZXJzCi0KLSAgICBHcm91cCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYS5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfT0NDVVJFTkNFX0xBQkVMIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAob2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9XSVpBUkRfUEFHRSk7Ci0gICAgR3JpZExheW91dCBzZWxlY3Rpb25BcmVhTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBzZWxlY3Rpb25BcmVhTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLnNldExheW91dChzZWxlY3Rpb25BcmVhTGF5b3V0KTsKLQotICAgIG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgLy8gTGlzdGVuZXIgdXNlZCBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZpZWxkcwotICAgIFRleHRMaXN0ZW5lciB0ZXh0TGlzdGVuZXIgPSBuZXcgVGV4dExpc3RlbmVyKCk7Ci0gICAgCi0KLSAgICAvLyBBZGQgdGhlIHJhZGlvIGJ1dHRvbnMKLSAgICBSYWRpb1NlbGVjdExpc3RlbmVyIHJhZGlvU2VsZWN0TGlzdGVuZXIgPSBuZXcgUmFkaW9TZWxlY3RMaXN0ZW5lcigpOwotCi0gICAgc2luZ2xlUmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuU0lOR0xFLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzaW5nbGVSYWRpbywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX0pVU1RfT05DRSk7Ci0gICAgVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgMSk7Ci0KLSAgICBzdGFyUmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuU1RBUiwgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIHJhZGlvU2VsZWN0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3RhclJhZGlvLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfWkVST19PUl9NT1JFKTsKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbGVyKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCAxKTsKLQotICAgIHBsdXNSYWRpbyA9IGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKFJlZ2V4Tm9kZS5QTFVTLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwbHVzUmFkaW8sIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9PTkVfT1JfTU9SRSk7Ci0gICAgVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgMSk7Ci0KLSAgICBvcHRpb25hbFJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLk9QVElPTkFMLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChvcHRpb25hbFJhZGlvLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfT1BUSU9OQUwpOwotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsZXIob2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIDEpOwotCi0gICAgcmVwZWF0UmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuUkVQRUFULCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXBlYXRSYWRpbywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JFUEVBVF9SQURJTyk7Ci0gICAgCi0gICAgcmVwZWF0VmFsdWUgPSBuZXcgVGV4dChvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIHJlcGVhdFZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXBlYXRWYWx1ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JFUEVBVF9GSUVMRCk7Ci0gICAgcmVwZWF0VmFsdWUuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX1JFUEVBVCIpKTsKLSAgICByZXBlYXRWYWx1ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SRVBFQVQsIGZhbHNlKTsKLSAgICAKLSAgICByYW5nZVJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLlJBTkdFLCBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgcmFkaW9TZWxlY3RMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyYW5nZVJhZGlvLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfUkFOR0VfUkFESU8pOwotCi0gICAgLy8gQWRkIHRleHQgZmllbGRzIGFuZCBsYWJlbHMgZm9yIHNwZWNpZnlpbmcgdGhlIHJhbmdlICAgIAotICAgIENvbXBvc2l0ZSByYW5nZVdpZGdldHMgPSBuZXcgQ29tcG9zaXRlKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICByYW5nZVdpZGdldHMuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIHJhbmdlV2lkZ2V0cy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAKLSAgICByYW5nZU1pblZhbHVlID0gbmV3IFRleHQocmFuZ2VXaWRnZXRzLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgcmFuZ2VNaW5WYWx1ZS5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0ZXh0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmFuZ2VNaW5WYWx1ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JBTkdFX01JTklNVU1fRklFTEQpOwotICAgIHJhbmdlTWluVmFsdWUuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX01JTiIpKTsKLSAgICByYW5nZU1pblZhbHVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIAotICAgIHJhbmdlVG9MYWJlbCA9IG5ldyBMYWJlbChyYW5nZVdpZGdldHMsIFNXVC5OT05FKTsKLSAgICByYW5nZVRvTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RPX0xBQkVMIikpOwotICAgIAotICAgIHJhbmdlTWF4VmFsdWUgPSBuZXcgVGV4dChyYW5nZVdpZGdldHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICByYW5nZU1heFZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgcmFuZ2VNYXhWYWx1ZS5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfTUFYIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmFuZ2VNYXhWYWx1ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JBTkdFX01BWElNVU1fRklFTEQpOwotICAgIHJhbmdlTWF4VmFsdWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SQU5HRSwgZmFsc2UpOwotICAgIAotICAgIHNpbmdsZVJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAKLSAgICAvLyBUaGUgYWRkIGJ1dHRvbgotICAgIGFkZCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBCdXR0b25TZWxlY3RMaXN0ZW5lcigpKTsKLSAgICBhZGQuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhZGQsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9BRERfQlVUVE9OKTsKLSAgICBhZGQuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0FERF9CVVRUT04iKSk7Ci0KLSAgICAKLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgIAotICAgIC8vIE91ciBtYWluIHRleHQgYm94Ci0KLSAgICBMYWJlbCB2YWx1ZUxhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgdmFsdWVMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfQ1VSUkVOVF9SRUdFWF9MQUJFTCIpKTsKLSAgICAKLSAgICB2YWx1ZSA9IG5ldyBTdHlsZWRUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIHZhbHVlLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRleHRMaXN0ZW5lcik7Ci0gICAgdmFsdWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGV4dExpc3RlbmVyKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHZhbHVlLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfQ1VSUkVOVF9WQUxVRSk7Ci0gICAgdmFsdWUuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0NVUlJFTlRfUkVHRVgiKSk7Ci0gICAgdmFsdWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICB2YWx1ZS5zZXRGb2N1cygpOwotCi0gICAgLy8gU3R5bGVSYW5nZSB1c2VkIGZvciBoaWdobGlnaHRpbmcgcGFyc2UgZXJyb3JzCi0gICAgY3VycmVudEVycm9yID0gbmV3IFN0eWxlUmFuZ2UoKTsKLSAgICBjdXJyZW50RXJyb3IubGVuZ3RoID0gMTsKLSAgICBjdXJyZW50RXJyb3IuZm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCk7Ci0KLSAgICAvLyBUaGUgY2FyZXQgbGFiZWwKLSAgICBjYXJldExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgIGNhcmV0TGFiZWwuc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9SZWdleFdpemFyZEFycm93LmdpZiIpKTsKLSAgICBjYXJldExhYmVsLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9DQVJFVF9MQUJFTCIpKTsKLSAgICBzZXRTaG93Q2FyZXRMYWJlbCh0cnVlKTsKLQotICAgIHZhbHVlLmFkZEZvY3VzTGlzdGVuZXIobmV3IFRleHRGb2N1c0xpc3RlbmVyKCkpOwotCi0gICAgdGVybXMuc2VsZWN0KDApOwotCi0KLSAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKQotICB7Ci0gICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQotICAgIHZhbHVlLnNldFRleHQocGF0dGVybi5nZXRMZXhpY2FsVmFsdWUoKSk7Ci0gICAgdmFsdWUuc2V0Q2FyZXRPZmZzZXQodmFsdWUuZ2V0Q2hhckNvdW50KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2aXNpYmxlIHN0YXR1cyBvZiBjYXJldExhYmVsIHRvIHN0YXR1cy4gIElmIHN0YXR1cyBpcyB0cnVlLCB0aGVuIHdlIGFsc28gdXBkYXRlIHRoZSBwb3NpdGlvbgotICAgKiBvZiBjYXJldExhYmVsIGluIG9uZSBvZiB0d28gd2F5cy4gIElmIHRoZXJlIGlzIG5vIGFjdGl2ZSBzZWxlY3Rpb24gaW4gdmFsdWUsIHdlIHNldCBjYXJldExhYmVsJ3MKLSAgICogcG9zaXRpb24gdG8gY29ycmVzcG9uZCB3aXRoIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0dWFsIGNhcmV0LiAgQWx0ZXJuYXRpdmVseSwgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIHNlbGVjdGlvbgotICAgKiBpbiB2YWx1ZSwgd2Ugc2V0IGNhcmV0TGFiZWwncyBwb3NpdGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWxlY3Rpb24uCi0gICAqCi0gICAqIEBwYXJhbSBUaGUgbmV3IHZpc2liaWxpdHkgc3RhdHVzIG9mIGNhcmV0TGFiZWwuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0U2hvd0NhcmV0TGFiZWwoYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICBpZiAoc3RhdHVzKQotICAgIHsKLSAgCi0gICAgICBpbnQgb2Zmc2V0OwotICAgICAgCi0gICAgICBpZiAodmFsdWUuZ2V0U2VsZWN0aW9uVGV4dCgpLmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIG9mZnNldCA9IHZhbHVlLmdldENhcmV0T2Zmc2V0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG9mZnNldCA9IHZhbHVlLmdldFNlbGVjdGlvbigpLng7Ci0gICAgICB9Ci0gIAotICAgICAgUG9pbnQgcCA9IHZhbHVlLmdldExvY2F0aW9uQXRPZmZzZXQob2Zmc2V0KTsKLSAgICAgIAotICAgICAgcC54ICs9IHZhbHVlLmdldExvY2F0aW9uKCkueDsKLSAgICAgIHAueSA9IHZhbHVlLmdldExvY2F0aW9uKCkueTsKLSAgICAgIAotICAgICAgLy8gUGxhY2UgdGhlIGxhYmVsIHVuZGVyIHZhbHVlLCBhbmQgbWFrZSBzdXJlIGl0IGlzIGFsaWduZWQgd2l0aCB0aGUgY2FyZXQuCi0gICAgICAvLyBUaGUgb2Zmc2V0cyBhcmUgZGVwZW5kZW50IG9uIHRoZSBpY29uIHVzZWQuCi0gICAgICBwLnggKz0gQ0FSRVRfTEFCRUxfWF9PRkZTRVQ7Ci0gICAgICBwLnkgKz0gQ0FSRVRfTEFCRUxfWV9PRkZTRVQ7Ci0gIAotICAgICAgaWYgKGRlYnVnKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBPSU5UOiAiICsgcCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIAotICAgICAgY2FyZXRMYWJlbC5zZXRMb2NhdGlvbihwKTsKLSAgICAgIGNhcmV0TGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNhcmV0TGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogQWRkcyBhIG5ldyByYWRpbyBidXR0b24gdG8gQ29tcG9zaXRlIGMgd2l0aCBTZWxlY3Rpb25MaXN0ZW5lciBsLiAgVGhlIHRleHQgb2YgdGhlIGJ1dHRvbiBpcyB0aGUgU3RyaW5nIGFzc29jaWF0ZWQgd2l0aAotICAgKiBxdWFudGlmaWVyLgotICAgKgotICAgKiBAcGFyYW0gcXVhbnRpZmllciBUaGUgZGVzaXJlZCBxdWFudGlmaWVyLCBhcyBlbnVtZXJhdGVkIGluIFJlZ2V4Tm9kZS4KLSAgICogQHBhcmFtIGMgVGhlIENvbXBvc2l0ZSB0byBhZGQgdGhlIGJ1dHRvbnMgdG8gKG5vcm1hbGx5IG9jY3VycmVuY2VSYWRpb0J1dHRvbnMpLgotICAgKiBAcGFyYW0gbCBUaGUgU2VsZWN0aW9uTGlzdGVuZXIgKG5vcm1hbGx5IHJhZGlvU2VsZWN0aW9uTGlzdGVuZXIpLgotICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGJ1dHRvbi4KLSAgICovCi0gIHByaXZhdGUgQnV0dG9uIGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKGludCBxdWFudGlmaWVyLCBDb21wb3NpdGUgYywgU2VsZWN0aW9uTGlzdGVuZXIgbCkKLSAgewotICAgIEJ1dHRvbiByZXN1bHQgPSBuZXcgQnV0dG9uKGMsIFNXVC5SQURJTyk7Ci0gICAgcmVzdWx0LnNldFRleHQoUmVnZXhOb2RlLmdldFF1YW50aWZpZXJUZXh0KHF1YW50aWZpZXIpKTsKLSAgICByZXN1bHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGUgcmVnZXggaW4gdmFsdWUuICBJZiB0aGUgcmVnZXggaXMgdmFsaWQsIGNsZWFycyB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZS4gIElmIGl0J3Mgbm90IHZhbGlkLAotICAgKiAgc2V0cyB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZSBhY2NvcmRpbmdseS4KLSAgICoKLSAgICogQHJldHVybiBXaGV0aGVyIHRoZSByZWdleCBpcyB2YWxpZC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJlZ2V4KCkKLSAgewotCi0gICAgYm9vbGVhbiBpc1ZhbGlkOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFdlIHZhbGlkYXRlIHRoZSByZWdleCBieSBjaGVja2luZyB3aGV0aGVyIHdlIGdldCBhIFBhcnNlRXhjZXB0aW9uLgotICAgICAgLy8gQnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoYXQgaXQncyB2YWxpZCB1bmxlc3Mgd2UgZGV0ZXJtaW5lIG90aGVyd2lzZS4KLSAgICAgIGlzVmFsaWQgPSB0cnVlOwotICAgICAgZGlzcGxheVJlZ2V4RXJyb3JNZXNzYWdlKG51bGwpOwotICAgICAgdmFsdWUuc2V0U3R5bGVSYW5nZShudWxsKTsKLQotICAgICAgUGF0dGVybi5jb21waWxlKHZhbHVlLmdldFRleHQoKSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHBlKQotICAgIHsKLSAgICAgIGlzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGRpc3BsYXlSZWdleEVycm9yTWVzc2FnZShwZS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAvLyBBbiBvZmYtYnktb25lIGJ1ZyBpbiB0aGUgeGVyY2VzIHJlZ2V4IHBhcnNlciB3aWxsIHNvbWV0aW1lcyByZXR1cm4gYSBsb2NhdGlvbiBmb3IgdGhlIHBhcnNlRXJyb3IgdGhhdAotICAgICAgLy8gIGlzIG9mZiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGVuIHdlIHdhbnQgdG8gaGlnaGxpZ2h0IHRoZSBsYXN0IGNoYXJhY3Rlci4KLSAgICAgIGlmIChwZS5nZXRJbmRleCgpID49IHZhbHVlLmdldFRleHQoKS5sZW5ndGgoKSkKLSAgICAgIHsKLSAgICAgICAgY3VycmVudEVycm9yLnN0YXJ0ID0gdmFsdWUuZ2V0VGV4dCgpLmxlbmd0aCgpIC0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY3VycmVudEVycm9yLnN0YXJ0ID0gcGUuZ2V0SW5kZXgoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRlYnVnKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcnNlIEVycm9yIGxvY2F0aW9uOiAiICsgcGUuZ2V0SW5kZXgoKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3VycmVudEVycm9yLnN0YXJ0OiAiICsgY3VycmVudEVycm9yLnN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICB2YWx1ZS5zZXRTdHlsZVJhbmdlKGN1cnJlbnRFcnJvcik7Ci0KLSAgICB9Ci0KLSAgICAvLyBBbm90aGVyIGJ1ZyBpbiB0aGUgeGVyY2VzIHBhcnNlciB3aWxsIHNvbWV0aW1lcyB0aHJvdyBhIFJ1bnRpbWVFeGNlcHRpb24gaW5zdGVhZCBvZiBhIFBhcnNlRXhjZXB0aW9uLgotICAgIC8vICBXaGVuIHdlIGdldCBhIFJ1bnRpbWVFeGNlcHRpb24sIHdlIGFyZW4ndCBwcm92aWRlZCB3aXRoIHRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8gaGlnaGxpZ2h0Ci0gICAgLy8gIHRoZSBwYXJzZSBlcnJvci4gIFNvLCB3ZSBtZXJlbHkgcmVwb3J0IHRoYXQgdGhlcmUgaXMgYW4gZXJyb3IuCi0gICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpCi0gICAgewotICAgICAgZGlzcGxheVJlZ2V4RXJyb3JNZXNzYWdlKCIiKTsKLSAgICAgIHZhbHVlLnNldFN0eWxlUmFuZ2UobnVsbCk7Ci0gICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHNldFBhZ2VDb21wbGV0ZShpc1ZhbGlkKTsgICAgCi0gICAgcmV0dXJuIGlzVmFsaWQ7Ci0gIH0KLQotICAKLSAgLyoqCi0gICAqIE1hbmFnZXMgdGhlIGRpc3BsYXkgb2YgZXJyb3IgbWVzc2FnZXMuCi0gICAqIFNldHMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHR5cGUgdG8gZXJyb3JNZXNzYWdlLiAgSWYgZXJyb3JNZXNzYWdlICE9IG51bGwsIHRoZW4gd2Ugc2V0IHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlCi0gICAqIHRvIGVycm9yTWVzc2FnZS4gIElmIGVycm9yTWVzc2FnZSA9PSBudWxsLCB0aGVuIHdlIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIHBlbmRpbmcgbWVzc2FnZSBvZiBhbm90aGVyIHR5cGUuCi0gICAqIElmIHdlIGRvLCB0aGVuIGl0IGlzIGRpc3BsYXllZCBhcyB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZS4gIElmIHdlIGRvbid0LCB0aGVuIHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlIGZpZWxkCi0gICAqIGlzIGNsZWFyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgVGhlIHRleHQgb2YgdGhlIG5ldyBlcnJvciBtZXNzYWdlLiAgQSB2YWx1ZSBvZiBudWxsIGluZGljYXRlcyB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIHNob3VsZAotICAgKiAgYmUgY2xlYXJlZC4KLSAgICogQHBhcmFtIHR5cGUgVGhlIGVycm9yIHR5cGUsIG9uZSBvZiBQQVJTRSwgVE9LRU4sIG9yIFNFTEVDVElPTi4KLSAgICovIAotICBwcml2YXRlIHZvaWQgZGlzcGxheUVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBpbnQgdHlwZSkKLSAgewotICAgIFN0cmluZyBtZXNzYWdlVG9EaXNwbGF5ID0gbnVsbDsKLQotCi0gICAgY3VycmVudEVycm9yTWVzc2FnZXNbdHlwZV0gPSBlcnJvck1lc3NhZ2U7Ci0KLSAgICBtZXNzYWdlVG9EaXNwbGF5ID0gZXJyb3JNZXNzYWdlOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRVJST1JfTUVTU0FHRV9UWVBFUzsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtZXNzYWdlVG9EaXNwbGF5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgbWVzc2FnZVRvRGlzcGxheSA9IGN1cnJlbnRFcnJvck1lc3NhZ2VzW2ldOwotICAgIH0KLQotICAgIHNldEVycm9yTWVzc2FnZShtZXNzYWdlVG9EaXNwbGF5KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFNldHMgdGhlIFdpemFyZCdzIGVycm9yIG1lc3NhZ2UgdG8gbWVzc2FnZSwgcHJlY2VkZWQgYnkgYSBzdGFuZGFyZCBwcmVmaXguCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBuZXcgZXJyb3IgbWVzc2FnZSAob3IgbnVsbCB0byBjbGVhciBpdCkuCi0gICAqLwotICBwcml2YXRlIHZvaWQgZGlzcGxheVJlZ2V4RXJyb3JNZXNzYWdlIChTdHJpbmcgZXJyb3JNZXNzYWdlKQotICB7Ci0gICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UobnVsbCwgUEFSU0UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIAlpZiAoZXJyb3JNZXNzYWdlLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlLgotICAgIAl7Ci0gICAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFR0VYX0VSUk9SIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJTRSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlLCBQQVJTRSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogVXBkYXRlcyB0aGUgdG9rZW4gc3RhdHVzLiAgU2V0cyBpc1ZhbGlkVG9rZW4gdG8gc3RhdHVzICYmIHRoZSBzdGF0dXMgb2YgdGhlIG90aGVyIGVycm9yIHR5cGUuCi0gICAqIElmIHN0YXR1cyBpcyB0cnVlLCB3ZSBjbGVhciB0aGUgd2l6YXJkJ3MgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyB0eXBlOyBpZiBpdCBpcyBmYWxzZSwgd2Ugc2V0IGl0IHRvIGVycm9yTWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgbmV3IGlzVmFsaWRUb2tlbiB2YWx1ZS4KLSAgICogQHBhcmFtIGVycm9yTWVzc2FnZSBUaGUgbmV3IGVycm9yIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBlcnJvciAoZWl0aGVyIFRPS0VOIG9yIFNFTEVDVElPTikuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0VG9rZW5TdGF0dXMgKGJvb2xlYW4gc3RhdHVzLCBTdHJpbmcgZXJyb3JNZXNzYWdlLCBpbnQgdHlwZSkKLSAgewotICAgIGJvb2xlYW4gb3RoZXJUeXBlU3RhdHVzID0gICAgICh0eXBlID09IFRPS0VOKSA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFcnJvck1lc3NhZ2VzW1NFTEVDVElPTl0gPT0gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVycm9yTWVzc2FnZXNbVE9LRU5dID09IG51bGw7Ci0gICAgCi0gICAgaXNWYWxpZFRva2VuID0gc3RhdHVzICYmIG90aGVyVHlwZVN0YXR1czsKLSAgICBhZGQuc2V0RW5hYmxlZChpc1ZhbGlkVG9rZW4pOwotCi0gICAgaWYgKHN0YXR1cykKLSAgICB7Ci0gICAgICBkaXNwbGF5RXJyb3JNZXNzYWdlKG51bGwsIHR5cGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIAlpZiAoZXJyb3JNZXNzYWdlICE9IG51bGwgJiYgZXJyb3JNZXNzYWdlLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlLgotICAgIAl7Ci0gICAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1RPS0VOX0VSUk9SIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGlzcGxheUVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UsIHR5cGUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIAotICAvKioKLSAgICogVXBkYXRlcyB0aGUgdG9rZW4gc3RhdHVzLiAgU2V0cyBpc1ZhbGlkVG9rZW4gdG8gc3RhdHVzICYmIHRoZSBzdGF0dXMgb2YgdGhlIG90aGVyIGVycm9yIHR5cGUuCi0gICAqIEFsc28gY2xlYXJzIHRoZSB3aXphcmQncyBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHR5cGUuCi0gICAqIFVzdWFsbHkgdXNlZCB0byBzZXQgaXNWYWxpZFRva2VuIHRvIHRydWUuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5ldyBpc1ZhbGlkVG9rZW4gdmFsdWUuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBlcnJvciAoZWl0aGVyIFRPS0VOIG9yIFNFTEVDVElPTikuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0VG9rZW5TdGF0dXMoYm9vbGVhbiBzdGF0dXMsIGludCB0eXBlKQotICB7Ci0gICAgc2V0VG9rZW5TdGF0dXMoc3RhdHVzLCBudWxsLCB0eXBlKTsKLSAgfQotCi0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIHRleHQgZmllbGRzIGFuZCBsYWJlbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcXVhbnRpZmllci4KLSAgICogSWYgc3RhdHVzIGlzIHRydWUsIHRoZW4gZmllbGRzIGFuZCBsYWJlbHMgYXNzb2NpYXRlZCB3aXRoIG90aGVyIHF1YW50aWZpZXJzIGFyZSBkaXNhYmxlZC4KLSAgICogQHBhcmFtIHF1YW50aWZpZXIgVGhlIHF1YW50aWZpZXIgd2hvc2UgZWxlbWVudHMnIGVuYWJsZWQgc3RhdHVzIHdlIHdpc2ggdG8gY2hhbmdlCi0gICAqICAgKGFzIGVudW1lcmF0ZWQgaW4gUmVnZXhOb2RlKS4KLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgbmV3IHN0YXR1cyBvZiB0aGUgZWxlbWVudHMuICBJZiB0cnVlLCB0aGVuIGFsbCBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggb3RoZXIgYnV0dG9ucwotICAgKiAgICAgICAgICAgICAgIGFyZSBkaXNhYmxlZC4KLSAgICovICAgIAotICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZFN0YXR1cyhpbnQgcXVhbnRpZmllciwgYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICBzd2l0Y2ggKHF1YW50aWZpZXIpCi0gICAgewotICAgIAotICAgIGNhc2UgUmVnZXhOb2RlLlJFUEVBVDoKLSAgICAgIHJlcGVhdFZhbHVlLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgIGlmIChzdGF0dXMpCi0gICAgICB7Ci0gICAgICAgIHJhbmdlTWluVmFsdWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJhbmdlTWF4VmFsdWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJhbmdlVG9MYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSZWdleE5vZGUuUkFOR0U6Ci0gICAgICByYW5nZU1pblZhbHVlLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgIHJhbmdlTWF4VmFsdWUuc2V0RW5hYmxlZChzdGF0dXMpOwotICAgICAgcmFuZ2VUb0xhYmVsLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgIGlmIChzdGF0dXMpCi0gICAgICB7Ci0gICAgICAgIHJlcGVhdFZhbHVlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiBpbiB2YWx1ZS4gIElmIHRoZXJlIGlzIG5vdCwgd2Ugc2V0IHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlIGFjY29yZGluZ2x5LgotICAgKiBJZiB0aGVyZSBpcywgd2UgdXBkYXRlIHRoZSBjb250ZW50cyBvZiBub2RlLiAgSWYgIkN1cnJlbnQgU2VsZWN0aW9uIiBpcyBub3QgdGhlIGN1cnJlbnQgdG9rZW4sIHRoZW4KLSAgICogd2UgY2xlYXIgdGhlIFNlbGVjdGlvbiBlcnJvciBtZXNzYWdlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb25TdGF0dXMoKQotICB7Ci0gICAgaWYgKHRlcm1zLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gUmVnZXhOb2RlLlNFTEVDVElPTikKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdmFsdWUuZ2V0U2VsZWN0aW9uVGV4dCgpOwotICAgICAgaWYgKHNlbGVjdGlvbi5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1NFTEVDVElPTl9FUlJPUiIpLCBTRUxFQ1RJT04pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXRUb2tlblN0YXR1cyh0cnVlLCBTRUxFQ1RJT04pOwotICAgICAgICBub2RlLnNldENvbnRlbnRzKHNlbGVjdGlvbik7Ci0gICAgICAgIG5vZGUuc2V0SGFzUGFyZW5zKHRydWUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0VG9rZW5TdGF0dXModHJ1ZSwgU0VMRUNUSU9OKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVXBkYXRlcyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIGF1dG8tZXNjYXBlIGNoZWNrYm94LiAgSWYgc3RhdHVzIGlzIHRydWUsIHdlIGVuYWJsZSB0aGUgY2hlY2tib3gsIGFuZAotICAgKiBzZXQgaXRzIHNlbGVjdGlvbiBzdGF0dXMgYW5kIG5vZGUncyBhdXRvLWVzY2FwZSBzdGF0dXMgdG8gdGhlIHZhbHVlIG9mIGF1dG9Fc2NhcGVTdGF0dXMuICBJZiBzdGF0dXMgaXMKLSAgICogZmFsc2UsIHRoZW4gd2UgZGlzYWJsZSBhbmQgZGVzZWxlY3QgdGhlIGNoZWNrYm94LCBhbmQgc2V0IG5vZGUncyBzdGF0dXMgdG8gZmFsc2UuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5ldyBlbmFibGVkIHN0YXR1cy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRFc2NhcGVDaGVja2JveEVuYWJsZWRTdGF0dXMoYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICBpZiAoc3RhdHVzKQotICAgIHsKLSAgICAgIGVzY2FwZUNoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICBlc2NhcGVDaGVja2JveC5zZXRTZWxlY3Rpb24oYXV0b0VzY2FwZVN0YXR1cyk7Ci0gICAgICBub2RlLnNldEF1dG9Fc2NhcGVTdGF0dXMoYXV0b0VzY2FwZVN0YXR1cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlc2NhcGVDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGVzY2FwZUNoZWNrYm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICBub2RlLnNldEF1dG9Fc2NhcGVTdGF0dXMoZmFsc2UpOwotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVnZXggZmxhZ3MuCi0gICAqLwotICBTdHJpbmcgZ2V0RmxhZ3MoKQotICB7Ci0gICAgcmV0dXJuIHJlZ2V4RmxhZ3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBYU0RQYXR0ZXJuIG1vZGVsLgotICAgKi8KLSAgWFNEUGF0dGVybkZhY2V0IGdldFBhdHRlcm4oKQotICB7Ci0gICAgcmV0dXJuIHBhdHRlcm47Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgdGhlIHZhbHVlcyBvZiBtaW4sIG1heCwgYW5kIHJlcGVhdCBzdG9yZWQgaW4gbm9kZS4KLSAgICogVXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCi0gICAqLyAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEFsbEZpZWxkVmFsdWVzKCkKLSAgewotICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgICAgcmVzdWx0ICs9ICJNaW46ICIgKyBub2RlLmdldE1pbigpICsgIlxuIjsKLSAgICAgIHJlc3VsdCArPSAiTWF4OiAiICsgbm9kZS5nZXRNYXgoKSArICJcbiI7Ci0gICAgICByZXN1bHQgKz0gIlJlcGVhdDogIiArIG5vZGUuZ2V0UmVwZWF0KCkgKyAiXG4iOwotICAgICAgcmVzdWx0ICs9ICJcbiI7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgYWRkIGJ1dHRvbi4gKi8KLSAgY2xhc3MgQnV0dG9uU2VsZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIC8vIFByZWNvbmRpdGlvbjogaXNWYWxpZFRva2VuID09IHRydWUgIAotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKCFpc1ZhbGlkVG9rZW4pIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvLyBXaGV0aGVyIHRoZXJlIGlzIGFueXRoaW5nIHNlbGVjdGVkIGluIHZhbHVlLgotICAgICAgYm9vbGVhbiBpc0FjdGl2ZVNlbGVjdGlvbiA9IHZhbHVlLmdldFNlbGVjdGlvbkNvdW50KCkgIT0gMDsKLSAgICAgIAotICAgICAgdmFsdWUuaW5zZXJ0KG5vZGUudG9TdHJpbmcoKSk7Ci0KLSAgICAgIGlmICh0ZXJtcy5nZXRTZWxlY3Rpb25JbmRleCgpID09IFJlZ2V4Tm9kZS5TRUxFQ1RJT04pCi0gICAgICB7Ci0gICAgICAgIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgbm90aGluZyBpcyBzZWxlY3RlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkdmFuY2UgdGhlIGNhcmV0IGxvY2F0aW9uLgotICAgICAgaWYgKCFpc0FjdGl2ZVNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmFsdWUuc2V0Q2FyZXRPZmZzZXQodmFsdWUuZ2V0Q2FyZXRPZmZzZXQoKSArIG5vZGUudG9TdHJpbmcoKS5sZW5ndGgoKSk7Ci0gICAgICB9Ci0KLSAgICAgIHZhbHVlLnNldEZvY3VzKCk7Ci0KLSAgICB9Ci0KLSAgfQotIAotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgdGVybXMgY29tYm8gYm94LiAqLwotICBjbGFzcyBDb21ib0xpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpCi0gICAgewotICAgICAgCi0gICAgICB1cGRhdGVDdXJyZW50U2VsZWN0aW9uU3RhdHVzKCk7Ci0KLSAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyB0eXBlZCBpbiBhIHRva2VuCi0gICAgICBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgc2V0RXNjYXBlQ2hlY2tib3hFbmFibGVkU3RhdHVzKHRydWUpOwotICAgICAgICBub2RlLnNldENvbnRlbnRzKHRlcm1zLmdldFRleHQoKSk7Ci0gICAgICAgIG5vZGUuc2V0SGFzUGFyZW5zKHRydWUpOwotICAgICAgICAKLQotICAgICAgICBpZiAoZGVidWcpCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGVybXMuZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0ZXJtcy5nZXRTZWxlY3Rpb25JbmRleCgpID09IFJlZ2V4Tm9kZS5TRUxFQ1RJT04pCi0gICAgICB7Ci0gICAgICAgIHNldEVzY2FwZUNoZWNrYm94RW5hYmxlZFN0YXR1cyhmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5vZGUuc2V0Q29udGVudHMoUmVnZXhOb2RlLmdldFJlZ2V4VGVybVZhbHVlKHRlcm1zLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLSAgICAgICAgbm9kZS5zZXRIYXNQYXJlbnMoZmFsc2UpOwotICAgICAgICBzZXRFc2NhcGVDaGVja2JveEVuYWJsZWRTdGF0dXMoZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogTGlzdGVuZXIgZm9yIGVuYWJsaW5nL2Rpc2FibGluZyBjYXJldExhYmVsLiAqLwotICBjbGFzcyBUZXh0Rm9jdXNMaXN0ZW5lciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkKLSAgICB7Ci0gICAgICBzZXRTaG93Q2FyZXRMYWJlbChmYWxzZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpCi0gICAgewotICAgICAgc2V0U2hvd0NhcmV0TGFiZWwodHJ1ZSk7Ci0gICAgfQotICB9Ci0KLQotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgdGV4dCBmaWVsZHMuICovCi0gIGNsYXNzIFRleHRMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkKLSAgICB7Ci0KLSAgICAgIGlmIChkZWJ1ZykKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnNpZGUgVGV4dExpc3RlbmVyIGhhbmRsZXIiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0QWxsRmllbGRWYWx1ZXMoKSk7Ci0gICAgICB9Ci0KLQotICAgICAgaWYgKCAoZS53aWRnZXQgPT0gdmFsdWUpICYmIChlLnR5cGUgPT0gU1dULk1vZGlmeSkgKQotICAgICAgewotICAgICAgICBwYXR0ZXJuLnNldExleGljYWxWYWx1ZSh2YWx1ZS5nZXRUZXh0KCkpOwotICAgICAgICB2YWxpZGF0ZVJlZ2V4KCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHZhbHVlICYmIGUudHlwZSA9PSBTV1QuU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBSZWdleE5vZGUuU0VMRUNUSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgdXBkYXRlQ3VycmVudFNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJhbmdlTWluVmFsdWUpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IG5vZGUuc2V0TWluKHJhbmdlTWluVmFsdWUuZ2V0VGV4dCgpKTsKLQotICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIG51bGwsIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NSU5fRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSByYW5nZU1heFZhbHVlKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBub2RlLnNldE1heChyYW5nZU1heFZhbHVlLmdldFRleHQoKSk7Ci0KLSAgICAgICAgaWYgKG5vZGUuZ2V0TWluKCkgPT0gUmVnZXhOb2RlLkVNUFRZKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0VG9rZW5TdGF0dXMoZmFsc2UsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfTUlTU0lOR19NSU5fRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1ZhbGlkKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0VG9rZW5TdGF0dXModHJ1ZSwgbnVsbCwgVE9LRU4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKGZhbHNlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfTUFYX0VSUk9SX1NVRkZJWCIpLCBUT0tFTik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZSAgLy8gKGUud2lkZ2V0ID09IHJlcGVhdFZhbHVlKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBub2RlLnNldFJlcGVhdChyZXBlYXRWYWx1ZS5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIG51bGwsIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1JFUEVBVF9FUlJPUl9TVUZGSVgiKSwgVE9LRU4pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogTGlzdGVuZXIgZm9yIHRoZSBhdXRvLWVzY2FwZSBjaGVja2JveC4gKi8KLSAgY2xhc3MgQ2hlY2tib3hMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBib29sZWFuIG5ld1N0YXR1cyA9ICFhdXRvRXNjYXBlU3RhdHVzOwotICAgICAgbm9kZS5zZXRBdXRvRXNjYXBlU3RhdHVzKG5ld1N0YXR1cyk7Ci0gICAgICBhdXRvRXNjYXBlU3RhdHVzID0gbmV3U3RhdHVzOwotICAgICAgCi0gICAgICBpZiAoZGVidWcpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXV0b0VzY2FwZSBTdGF0dXM6ICIgKyBub2RlLmdldEF1dG9Fc2NhcGVTdGF0dXMoKSk7ICAvLyROT04tTkxTLTEkIAotICAgICAgfQotICAgIH0KLQotICB9Ci0KLQotICAvKiBMaXN0ZW5lciBmb3IgdGhlIHJhZGlvIGJ1dHRvbnMuICovCi0gIGNsYXNzIFJhZGlvU2VsZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGRlYnVnKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0QWxsRmllbGRWYWx1ZXMoKSk7Ci0gICAgICB9Ci0KLQotICAgICAgaW50IGN1cnJlbnRRdWFudGlmaWVyID0gZ2V0UXVhbnRpZmllcihlKTsKLQotICAgICAgbm9kZS5zZXRRdWFudGlmaWVyKGN1cnJlbnRRdWFudGlmaWVyKTsKLQotICAgICAgc3dpdGNoIChjdXJyZW50UXVhbnRpZmllcikKLSAgICAgIHsKLSAgICAgIGNhc2UgUmVnZXhOb2RlLlNJTkdMRTogICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGNhc2UgUmVnZXhOb2RlLlNUQVI6Ci0gICAgICBjYXNlIFJlZ2V4Tm9kZS5QTFVTOgotICAgICAgY2FzZSBSZWdleE5vZGUuT1BUSU9OQUw6Ci0gICAgICAgIHNldEVuYWJsZWRTdGF0dXMoUmVnZXhOb2RlLlJFUEVBVCwgZmFsc2UpOwotICAgICAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SQU5HRSwgZmFsc2UpOwotICAgICAgICBzZXRUb2tlblN0YXR1cyh0cnVlLCBUT0tFTik7Ci0gICAgICAgIGJyZWFrOyAKLQotICAgICAgY2FzZSBSZWdleE5vZGUuUkVQRUFUOgotICAgICAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SRVBFQVQsIHRydWUpOwotICAgICAgICBzZXRUb2tlblN0YXR1cyhub2RlLmhhc1ZhbGlkUmVwZWF0KCksIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9SRVBFQVRfRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgcmVwZWF0VmFsdWUuc2V0Rm9jdXMoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUmVnZXhOb2RlLlJBTkdFOgotICAgICAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SQU5HRSwgdHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBlcnJvciA9IChub2RlLmhhc1ZhbGlkTWluKCkpID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX01BWF9FUlJPUl9TVUZGSVgiKSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NSU5fRVJST1JfU1VGRklYIik7Ci0KLSAgICAgICAgc2V0VG9rZW5TdGF0dXMoIG5vZGUuaGFzVmFsaWRNaW4oKSAmJiBub2RlLmhhc1ZhbGlkTWF4KCksIGVycm9yLCBUT0tFTik7Ci0gICAgICAgIHJhbmdlTWluVmFsdWUuc2V0Rm9jdXMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UXVhbnRpZmllcihTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLQotICAgICAgaWYgKGUud2lkZ2V0ID09IHNpbmdsZVJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLlNJTkdMRTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gc3RhclJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLlNUQVI7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHBsdXNSYWRpbykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5QTFVTOwotICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBvcHRpb25hbFJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLk9QVElPTkFMOwotICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSByZXBlYXRSYWRpbykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5SRVBFQVQ7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJhbmdlUmFkaW8pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBSZWdleE5vZGUuUkFOR0U7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgLy8gY2FuJ3QgZ2V0IGhlcmUKLSAgICAgIHsgCi0gICAgICAgIHJldHVybiBSZWdleE5vZGUuRU1QVFk7Ci0gICAgICB9Ci0gICAgfSAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsdWUuZ2V0VGV4dCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Tm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiYmViYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0KLWNsYXNzIFJlZ2V4Tm9kZQotewotICBwcml2YXRlIFN0cmluZyBjb250ZW50czsKLSAgcHJpdmF0ZSBpbnQgbWluOwotICBwcml2YXRlIGludCBtYXg7Ci0gIHByaXZhdGUgaW50IHJlcGVhdDsKLSAgcHJpdmF0ZSBpbnQgcXVhbnRpZmllcjsKLSAgcHJpdmF0ZSBib29sZWFuIGhhc1BhcmVuczsKLSAgcHJpdmF0ZSBib29sZWFuIGF1dG9Fc2NhcGVTdGF0dXM7Ci0KLSAgCi0gIC8qIFF1YW50aWZpZXJzLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU5HTEUgPSAwOyAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVMgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05BTCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUEVBVCA9IDQ7IAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQU5HRSA9IDU7Ci0KLSAgLyogUmVnZXggcXVhbnRpZmllcnMuICBGaXJzdCBjb2x1bW4gaXMgdGhlIG9uLXNjcmVlbiB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uLCBzZWNvbmQgY29sdW1uIGlzIHRoZSAKLSAgIG9uLXNjcmVlbiByZWdleCByZXByZXNlbnRhdGlvbi4gIFRoZSB0d28gYXJlIGNvbmNhdGVuYXRlZCB0b2dldGhlciB0byBmb3JtIHRoZSBvbi1zY3JlZW4KLSAgIHJlcHJlc2VudGF0aW9uLgotICAgSW5kZXhpbmcgb2YgdGhpcyBhcnJheSBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHZhbHVlcyBvZiB0aGUgcXVhbnRpZmllciBjb25zdGFudHMgYWJvdmUuCi0gICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdW10gcmVnZXhRdWFudGlmaWVycyA9Ci0gIHsgCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfU0lOR0xFIiksICAgIiIgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfU1RBUiIpLCAgICAgIioiIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUExVUyIpLCAgICAgIisiIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfT1BUSU9OQUwiKSwgIj8iIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUkVQRUFUIiksICAgIiIgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfUkFOR0UiKSwgICAgIiIgIH0sCi0gIH07Ci0KLQotICAvKiBSZWdleCB0b2tlbnMuICBGaXJzdCBjb2x1bW4gaXMgdGhlIG9uLXNjcmVlbiByZXByZXNlbnRhdGlvbiwgc2Vjb25kIGNvbHVtbiBpcyB0aGUgcmVnZXggcmVwcmVzZW50YXRpb24uIAotICAgICBNb3JlIHRva2VucyBjYW4gYmUgYWRkZWQsIGJ1dCBpdCBpcyBhc3N1bWVkIHRoYXQgIkN1cnJlbnQgU2VsZWN0aW9uIiBpcyB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheS4KLSAgICAgSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHRoZW4gdGhlIHZhbHVlIG9mIHRoZSBTRUxFQ1RJT04gY29uc3RhbnQgYmVsb3cgd2lsbCBuZWVkIHRvIGJlIGNoYW5nZWQgCi0gICAgIGFjY29yZGluZ2x5LgotICAgICBBbHNvIG5vdGUgdGhhdCBiZWNhdXNlIHRoZXNlIGFyZSBqYXZhIFN0cmluZ3MsIGJhY2tzbGFzaGVzIG11c3QgYmUgZXNjYXBlZCAodGhpcyBpcyBvbmx5IHJlbGV2YW50IHRvIHRoZQotICAgICBzZWNvbmQgY29sdW1uIG9mIHRoZSBhcnJheSkuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIHJlZ2V4VGVybXMgPQotICB7IAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX0FOWV9DSEFSIiksICAgIi4iICAgICB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX0FMUEhBTlVNRVJJQ19DSEFSIiksICAgIlxcdyIgICAgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fV0hJVEVTUEFDRSIpLCAiXFxzIiAgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fRElHSVQiKSwgICAgICAiXFxkIiAgIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fVVBQRVIiKSwgICAgICAiW0EtWl0iIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fTE9XRVIiKSwgICAgICAiW2Etel0iIH0sCi0gICAgeyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFUk1fU0VMRUNUSU9OIiksICAiIiAgICAgIH0sCi0gIH07Ci0KLSAgLyogVG9rZW4gZW51bWVyYXRlZCBjb25zdGFudHMuICovCi0KLSAgLy8gU0VMRUNUSU9OIG11c3QgY29ycmVzcG9uZCB0byB0aGUgaW5kZXggaW4gcmVnZXhUZXJtcyBvZiAiQ3VycmVudCBTZWxlY3Rpb24iLiAgVGhpcyBpcyBhc3N1bWVkIHRvIGJlCi0gIC8vICB0aGUgbGFzdCBlbGVtZW50LgotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT04gPSByZWdleFRlcm1zLmxlbmd0aCAtIDE7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFkgPSAtMTsKLQotICAvKiAKLSAgVGhlIG1ldGFjaGFyYWN0ZXJzIHJlY29nbml6ZWQgYnkgWE1MIFNjaGVtYS4KLSAgTm90ZSB0aGF0IHRoZSBkb3VibGUgYmFja3NsYXNoICgiXFwiKSBhY3R1YWxseSByZXByZXNlbnRzIGFuIGVzY2FwZWQgc2luZ2xlIGJhY2tzbGFzaCBjaGFyYWN0ZXIgKCJcIikuCi0gICovIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWV0YWNoYXJhY3RlcnMgPSAiLlxcPyore30oKVtdIjsKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlZ2V4VGVybVRleHQoaW50IGkpCi0gIHsKLSAgICBpZiAoaSA9PSBTRUxFQ1RJT04pCi0gICAgewotICAgICAgcmV0dXJuIHJlZ2V4VGVybXNbaV1bMF07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gcmVnZXhUZXJtc1tpXVswXSArICIgKCAiICsgcmVnZXhUZXJtc1tpXVsxXSArICIgKSI7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVnZXhUZXJtVmFsdWUoaW50IGkpCi0gIHsKLSAgICBpZiAoaSA9PSBTRUxFQ1RJT04pIC8vIHNob3VsZG4ndCBoYXBwZW4KLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gcmVnZXhUZXJtc1tpXVsxXTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBnZXROdW1SZWdleFRlcm1zKCkKLSAgewotICAgIHJldHVybiByZWdleFRlcm1zLmxlbmd0aDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFF1YW50aWZpZXJUZXh0KGludCBpKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHJlZ2V4UXVhbnRpZmllcnNbaV1bMF07Ci0gICAgCi0gICAgaWYgKCFyZWdleFF1YW50aWZpZXJzW2ldWzFdLmVxdWFscygiIikpCi0gICAgewotICAgICAgcmVzdWx0ICs9ICIgKCAiOwotICAgICAgcmVzdWx0ICs9IHJlZ2V4UXVhbnRpZmllcnNbaV1bMV07Ci0gICAgICByZXN1bHQgKz0gIiApIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFJlZ2V4Tm9kZSgpCi0gIHsKLSAgICB0aGlzLmNvbnRlbnRzID0gIiI7Ci0gICAgdGhpcy5xdWFudGlmaWVyID0gU0lOR0xFOwotICAgIHRoaXMubWluID0gRU1QVFk7Ci0gICAgdGhpcy5tYXggPSBFTVBUWTsKLSAgICB0aGlzLnJlcGVhdCA9IEVNUFRZOwotICAgIHRoaXMuaGFzUGFyZW5zID0gZmFsc2U7Ci0KLSAgfQotCi0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRzKCkKLSAgewotICAgIHJldHVybiBjb250ZW50czsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29udGVudHMoU3RyaW5nIGNvbnRlbnRzKQotICB7Ci0gICAgdGhpcy5jb250ZW50cyA9IGNvbnRlbnRzOwotICB9Ci0KLQotICBwdWJsaWMgaW50IGdldFF1YW50aWZpZXIoKQotICB7Ci0gICAgcmV0dXJuIHF1YW50aWZpZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRRdWFudGlmaWVyKGludCBxdWFudGlmaWVyKQotICB7Ci0gICAgdGhpcy5xdWFudGlmaWVyID0gcXVhbnRpZmllcjsKLSAgfQotCi0KLSAgcHVibGljIGludCBnZXRNaW4oKQotICB7Ci0gICAgcmV0dXJuIG1pbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1pbihpbnQgbWluKQotICB7Ci0gICAgdGhpcy5taW4gPSBtaW47Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGlzLm1pbiB0byB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBtaW4gaWZmIG1pbiBpcyBhIHZhbGlkIHZhbHVlIChpLmUuIGdyZWF0ZXIgdGhhbiAwKS4KLSAgICogU2V0cyB0aGlzLm1pbiB0byBFTVBUWSBpZiBpdCBpcyBub3QuCi0gICAqCi0gICAqIEBwYXJhbSBtaW4gVGhlIG5ldyBtaW4gdmFsdWUKLSAgICogQHJldHVybnMgV2hldGhlciBtaW4gd2FzIGEgdmFsaWQgdmFsdWUKLSAgICovICAKLSAgcHVibGljIGJvb2xlYW4gc2V0TWluKFN0cmluZyBtaW4pCi0gIHsKLSAgICB0aGlzLm1pbiA9IGNvbnZlcnRUb0ludChtaW4pOwotCi0gICAgLy8gbWluID4gbWF4IGlzIGFuIGludmFsaWQgY2FzZSwgdW5sZXNzIG1heCBpcyBFTVBUWSAoc2luY2UgRU1QVFkgPT0gLTEpLgotICAgIGlmICggKHRoaXMubWF4ICE9IEVNUFRZKSAmJiAodGhpcy5taW4gPiB0aGlzLm1heCkgKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuICh0aGlzLm1pbiA+PSAwKTsKLSAgfQotCi0gIAotICBwdWJsaWMgaW50IGdldE1heCgpCi0gIHsKLSAgICByZXR1cm4gbWF4OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNYXgoaW50IG1heCkKLSAgewotICAgIHRoaXMubWF4ID0gbWF4OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhpcy5tYXggdG8gdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgbWF4IGlmZiBtYXggaXMgYSB2YWxpZCB2YWx1ZSAoaS5lLiBncmVhdGVyIHRoYW4gMCkuCi0gICAqIFNldHMgdGhpcy5tYXggdG8gRU1QVFkgaWYgaXQgaXMgbm90LgotICAgKgotICAgKiBAcGFyYW0gbWF4IFRoZSBuZXcgbWF4IHZhbHVlCi0gICAqIEByZXR1cm5zIFdoZXRoZXIgbWF4IHdhcyBhIHZhbGlkIHZhbHVlLCBvciAod2hldGhlciBtYXggPT0gdGhlIGVtcHR5IHN0cmluZyAmJiBtaW4gaGFzIGEgdmFsaWQgdmFsdWUpCi0gICAqLyAKLSAgcHVibGljIGJvb2xlYW4gc2V0TWF4KFN0cmluZyBtYXgpCi0gIHsKLSAgICB0aGlzLm1heCA9IGNvbnZlcnRUb0ludChtYXgpOwotCi0gICAgLy8gVGhlIGVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIG1heCB2YWx1ZSBpZmYgbWluIGhhcyBhIHZhbGlkIHZhbHVlLgotICAgIC8vIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQge24sfSBtZWFucyAiYXQgbGVhc3QgbiB0aW1lcyIgaW4gcmVnZXggcGFybGFuY2UuCi0gICAgaWYgKG1heC5lcXVhbHMoIiIpICYmIHRoaXMubWluICE9IEVNUFRZKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBlbHNlIGlmICh0aGlzLm1heCA8IHRoaXMubWluKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAodGhpcy5tYXggPj0gMCk7Ci0gICAgfQotICB9Ci0KLQotIAotICBwdWJsaWMgaW50IGdldFJlcGVhdCgpCi0gIHsKLSAgICByZXR1cm4gcmVwZWF0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVwZWF0KGludCByZXBlYXQpCi0gIHsKLSAgICB0aGlzLnJlcGVhdCA9IHJlcGVhdDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoaXMucmVwZWF0IHRvIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHJlcGVhdCBpZmYgcmVwZWF0IGlzIGEgdmFsaWQgdmFsdWUgKGkuZS4gZ3JlYXRlciB0aGFuIDApLgotICAgKiBTZXRzIHRoaXMucmVwZWF0IHRvIEVNUFRZIGlmIGl0IGlzIG5vdC4KLSAgICoKLSAgICogQHBhcmFtIHJlcGVhdCBUaGUgbmV3IHJlcGVhdCB2YWx1ZQotICAgKiBAcmV0dXJucyBXaGV0aGVyIHJlcGVhdCB3YXMgYSB2YWxpZCB2YWx1ZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0UmVwZWF0KFN0cmluZyByZXBlYXQpCi0gIHsKLSAgICB0aGlzLnJlcGVhdCA9IGNvbnZlcnRUb0ludChyZXBlYXQpOwotICAgIHJldHVybiAodGhpcy5yZXBlYXQgPj0gMCk7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2Ygcy4gIElmIHMgaXMgbGVzcyB0aGFuIHplcm8sIG9yIGlmIHMgaXMgbm90IGFuIGludAotICAgKiAoaS5lLiBpZiBJbnRlZ2VyLnBhcnNlSW50IHdvdWxkIHRocm93IGEgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKSwgdGhlbiByZXR1cm5zIEVNUFRZLgotICAgKgotICAgKiBAcGFyYW0gcyBUaGUgU3RyaW5nIHRvIGNvbnZlcnQuCi0gICAqIEByZXR1cm5zIFRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHMuCi0gICAqLwotICBwcml2YXRlIGludCBjb252ZXJ0VG9JbnQoU3RyaW5nIHMpCi0gIHsKLSAgICBpbnQgcmVzdWx0OwotICAgIHRyeQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQocyk7Ci0gICAgICBpZiAocmVzdWx0IDwgMCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gRU1QVFk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBFTVBUWTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNQYXJlbnMoKQotICB7Ci0gICAgcmV0dXJuIGhhc1BhcmVuczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhhc1BhcmVucyhib29sZWFuIHN0YXR1cykKLSAgewotICAgIHRoaXMuaGFzUGFyZW5zID0gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b0VzY2FwZVN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gYXV0b0VzY2FwZVN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEF1dG9Fc2NhcGVTdGF0dXMoYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICB0aGlzLmF1dG9Fc2NhcGVTdGF0dXMgPSBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBlc2NhcGVkIHZlcnNpb24gb2Ygcy4gIEluIG90aGVyIHdvcmRzLCBlYWNoIG9jY3VycmVuY2Ugb2YgYSBtZXRhY2hhcmFjdGVyICggLlw/Kit7fSgpW10gKQotICAgKiBpcyByZXBsYWNlZCBieSB0aGF0IGNoYXJhY3RlciBwcmVjZWRlZCBieSBhIGJhY2tzbGFzaC4KLSAgICoKLSAgICogQHBhcmFtIHMgVGhlIFN0cmluZyB0byBlc2NhcGUuCi0gICAqIEByZXR1cm5zIEFuIGVzY2FwZWQgdmVyc2lvbiBvZiBzLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgYWRkRXNjYXBlQ2hhcmFjdGVycyhTdHJpbmcgcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgY3VycmVudENoYXIgPSBzLmNoYXJBdChpKTsKLQotICAgICAgaWYgKGlzTWV0YWNoYXIoY3VycmVudENoYXIpKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJcXCIpOyAvLyBOb3RlIHRoYXQgdGhpcyBpcyBhbiBlc2NhcGVkIGJhY2tzbGFzaCwgbm90IGEgZG91YmxlIGJhY2tzbGFzaC4KLSAgICAgIH0KLSAgICAgIHJlc3VsdC5hcHBlbmQoY3VycmVudENoYXIpOwotCi0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIGMgaXMgYSBtZXRhY2hhcmFjdGVyIGFzIGRlZmluZWQgaW4gdGhlIHN0YXRpYyB2YXJpYWJsZSBtZXRhY2hhcmFjdGVycy4KLSAgICoKLSAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICogQHJldHVybnMgV2hldGhlciBjIGlzIGEgbWV0YWNoYXJhY3Rlci4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc01ldGFjaGFyKGNoYXIgYykKLSAgewotICAgIHJldHVybiBtZXRhY2hhcmFjdGVycy5pbmRleE9mKGMpICE9IC0xOwotICB9Ci0gIAotCi0gIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkTWluKCkKLSAgewotICAgIHJldHVybiAobWluICE9IEVNUFRZKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkTWF4KCkKLSAgewotICAgIHJldHVybihtYXggIT0gRU1QVFkpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaGFzVmFsaWRSZXBlYXQoKQotICB7Ci0gICAgcmV0dXJuKHJlcGVhdCAhPSBFTVBUWSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLSAgICAKLSAgICBpZiAoaGFzUGFyZW5zKQotICAgIHsKLSAgICAgIHJlc3VsdCArPSAiKCI7Ci0gICAgfQotICAgIAotICAgIGlmIChhdXRvRXNjYXBlU3RhdHVzKQotICAgIHsKLSAgICAgICByZXN1bHQgKz0gYWRkRXNjYXBlQ2hhcmFjdGVycyhjb250ZW50cyk7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgcmVzdWx0ICs9IGNvbnRlbnRzOwotICAgIH0KLQotCi0gICAgaWYgKGhhc1BhcmVucykKLSAgICB7Ci0gICAgICByZXN1bHQgKz0gIikiOwotICAgIH0KLSAgICAKLSAgICBzd2l0Y2ggKHF1YW50aWZpZXIpCi0gICAgewotICAgICAgY2FzZSBTVEFSOgotICAgICAgICByZXN1bHQgKz0gIioiOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBQTFVTOgotICAgICAgICByZXN1bHQgKz0gIisiOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBPUFRJT05BTDoKLSAgICAgICAgcmVzdWx0ICs9ICI/IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgUkVQRUFUOgotICAgICAgICByZXN1bHQgKz0gInsiICsgcmVwZWF0ICsgIn0iOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgY2FzZSBSQU5HRToKLSAgICAgICAgcmVzdWx0ICs9ICJ7IiArIG1pbiArICIsIjsKLSAgICAgICAgaWYgKG1heCA9PSBFTVBUWSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCArPSAiIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgKz0gbWF4OwotICAgICAgICB9ICAgICAgIAotICAgICAgICByZXN1bHQgKz0gIn0iOwotICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgLy8gU0lOR0xFIGlzIGEgZmFsbCB0aHJvdWdoICAgICAgICAgICAKLQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4VGVzdGluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhUZXN0aW5nUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODhjNmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhUZXN0aW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIEJhc2VkIG9uIHZlcnNpb24gMS42IG9mIG9yaWdpbmFsIHhzZGVkaXRvcgotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci0KLQotcHVibGljIGNsYXNzIFJlZ2V4VGVzdGluZ1BhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0gIC8qIFZhbGlkYXRvciBmcm9tIHhlcmNlcyBwYWNrYWdlLiAqLwotLy8gIHByaXZhdGUgUmVndWxhckV4cHJlc3Npb24gdmFsaWRhdG9yOwotICAKLSAgLyogRGlzcGxheXMgdGhlIHN0YXR1cyBvZiB0aGUgbWF0Y2guICovCi0gIHByaXZhdGUgTGFiZWwgbWF0Y2hMYWJlbDsKLQotCi0gIC8qIFRoZSByZWdleC4gKi8KLSAgcHJpdmF0ZSBUZXh0IHZhbHVlOwotICAKLSAgLyogVGhlIHN0cmluZyB0aGUgdXNlciBpcyB0cnlpbmcgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgcmVnZXguICovCi0gIHByaXZhdGUgU3R5bGVkVGV4dCB0ZXN0U3RyaW5nOwotCi0gIHB1YmxpYyBSZWdleFRlc3RpbmdQYWdlKCkKLSAgewotICAgIHN1cGVyKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVTVElOR19QQUdFX1RJVExFIikpOwotCi0gICAgc2V0VGl0bGUoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfVElUTEUiKSk7Ci0gICAgc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1RFU1RfUEFHRSk7Ci0KLSAgICBtYXRjaExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotICAgIG1hdGNoTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9ERVNDUklQVElPTiIpKTsKLSAgICBGb250RGF0YVtdIGZvbnREYXRhID0gbWF0Y2hMYWJlbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLSAgICBHcmlkRGF0YSBkYXRhRiA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGFGLndpZHRoSGludCA9IDQwMDsKLSAgICBkYXRhRi5oZWlnaHRIaW50ID0gNiAqIGZvbnREYXRhWzBdLmdldEhlaWdodCgpOwotICAgIG1hdGNoTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhRik7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGNvbnRyb2xzID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGNvbnRyb2xzTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBjb250cm9sc0xheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb250cm9scy5zZXRMYXlvdXQoY29udHJvbHNMYXlvdXQpOwotICAgIGNvbnRyb2xzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgbmV3IExhYmVsKGNvbnRyb2xzLCBTV1QuTEVGVCkuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1JFR0VYX0xBQkVMIikpOwotICAgIHZhbHVlID0gbmV3IFRleHQoY29udHJvbHMsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICB2YWx1ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCi0gICAgbmV3IExhYmVsKGNvbnRyb2xzLCBTV1QuTEVGVCkuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1NBTVBMRV9URVhUIikpOwotICAgIHRlc3RTdHJpbmcgPSBuZXcgU3R5bGVkVGV4dChjb250cm9scywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGVzdFN0cmluZywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1NBTVBMRV9URVhUKTsKLSAgICB0ZXN0U3RyaW5nLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBUZXN0U3RyaW5nTGlzdGVuZXIoKSk7Ci0gICAgdGVzdFN0cmluZy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAKLSAgICBjb250cm9scy5wYWNrKCk7Ci0gICAgCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHQyBnYyA9IG5ldyBHQyhzZXBhcmF0b3IpOwotICAgIFBvaW50IHBvaW50U2l6ZSA9IGdjLnN0cmluZ0V4dGVudChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9ERVNDUklQVElPTiIpKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLndpZHRoSGludCA9IHBvaW50U2l6ZS54IC8gMiArIGdjLmdldEFkdmFuY2VXaWR0aCgnTScpKjExOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotICAgIAotICAgIGNvbXBvc2l0ZS5wYWNrKCk7Ci0KLSAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gIH0KLQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFBhdHRlcm5WYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gKCAoUmVnZXhDb21wb3NpdGlvblBhZ2UpZ2V0UHJldmlvdXNQYWdlKCkgKS5nZXRQYXR0ZXJuKCkuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRGbGFncygpCi0gIHsKLSAgICByZXR1cm4gKCAoUmVnZXhDb21wb3NpdGlvblBhZ2UpZ2V0UHJldmlvdXNQYWdlKCkgKS5nZXRGbGFncygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpCi0gIHsKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCi0gICAgZ2V0RmxhZ3MoKTsKLSAgICB2YWx1ZS5zZXRUZXh0KFRleHRQcm9jZXNzb3IucHJvY2VzcyhnZXRQYXR0ZXJuVmFsdWUoKSkpOwotICAgIHVwZGF0ZU1hdGNoU3RhdHVzKCk7Ci0gICAgdGVzdFN0cmluZy5zZXRGb2N1cygpOwotICB9Ci0KLSAgY2xhc3MgVGVzdFN0cmluZ0xpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpCi0gICAgewotICAgICAgdXBkYXRlTWF0Y2hTdGF0dXMoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTWF0Y2hTdGF0dXMoKQotICB7Ci0gICAgaWYgKFBhdHRlcm4ubWF0Y2hlcyhnZXRQYXR0ZXJuVmFsdWUoKSwgdGVzdFN0cmluZy5nZXRUZXh0KCkpKQotICAgIHsKLS8vICAgICAgbWF0Y2hMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfTUFUQ0hFUyIpKTsKLSAgICAgIHNldE1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9NQVRDSEVTIiksIDEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0TWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0RPRVNfTk9UX01BVENIIiksIDIpOwotLy8gICAgICBtYXRjaExhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9ET0VTX05PVF9NQVRDSCIpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0MWY2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGF0dGVybkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREZhY3RvcnlJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBSZWdleFdpemFyZCBleHRlbmRzIFdpemFyZCAKLXsKLSAgcHJpdmF0ZSBSZWdleENvbXBvc2l0aW9uUGFnZSBjb21wb3NpdGlvblBhZ2U7Ci0gIHByaXZhdGUgUmVnZXhUZXN0aW5nUGFnZSB0ZXN0aW5nUGFnZTsKLQotICAvKiBUaGUgb3JpZ2luYWwsIHVuY2hhbmdlZCBwYXR0ZXJuLiAqLyAgCi0gIHByaXZhdGUgWFNEUGF0dGVybkZhY2V0IG9yaWdpbmFsUGF0dGVybjsKLSAgCi0gIC8qIEEgY29weSBvZiB0aGUgb3JpZ2luYWwgcGF0dGVybiB0aGF0IGlzIHBhc3NlZCBpbnRvIHRoZSB3aXphcmQuICovCi0gIHByaXZhdGUgWFNEUGF0dGVybkZhY2V0IG1vZGlmaWVkUGF0dGVybjsKLQotICBTdHJpbmcgcGF0dGVybjsKLQotICBwdWJsaWMgUmVnZXhXaXphcmQoU3RyaW5nIGV4cHIpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldFdpbmRvd1RpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVElUTEUiKSk7Ci0gICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL3JlZ3hfd2l6LnBuZyIpKTsKLQotICAgIFhTREZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgWFNERmFjdG9yeUltcGwoKTsKLSAgICBtb2RpZmllZFBhdHRlcm4gPSBmYWN0b3J5LmNyZWF0ZVhTRFBhdHRlcm5GYWNldCgpOwotICAgIG1vZGlmaWVkUGF0dGVybi5zZXRMZXhpY2FsVmFsdWUoZXhwcik7Ci0KLSAgICBvcmlnaW5hbFBhdHRlcm4gPSBmYWN0b3J5LmNyZWF0ZVhTRFBhdHRlcm5GYWNldCgpOwotICAgIG9yaWdpbmFsUGF0dGVybi5zZXRMZXhpY2FsVmFsdWUoZXhwcik7Ci0KLSAgICBjb21wb3NpdGlvblBhZ2UgPSBuZXcgUmVnZXhDb21wb3NpdGlvblBhZ2UobW9kaWZpZWRQYXR0ZXJuKTsKLSAgICBhZGRQYWdlKGNvbXBvc2l0aW9uUGFnZSk7Ci0KLSAgICB0ZXN0aW5nUGFnZSA9IG5ldyBSZWdleFRlc3RpbmdQYWdlKCk7Ci0gICAgYWRkUGFnZSh0ZXN0aW5nUGFnZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm4oKQotICB7Ci0gICAgcmV0dXJuIHBhdHRlcm47Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpCi0gIHsKLSAgICByZXR1cm4gKGNvbXBvc2l0aW9uUGFnZS5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgewotICAgIHBhdHRlcm4gPSBtb2RpZmllZFBhdHRlcm4uZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNETG9jYXRpb25DaG9pY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRExvY2F0aW9uQ2hvaWNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzA5ZjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNETG9jYXRpb25DaG9pY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLQotCi1wdWJsaWMgY2xhc3MgWFNETG9jYXRpb25DaG9pY2VQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSAKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiByYWRpb0J1dHRvbjE7Ci0gIHByb3RlY3RlZCBCdXR0b24gcmFkaW9CdXR0b24yOwotICAgIAotICBwdWJsaWMgWFNETG9jYXRpb25DaG9pY2VQYWdlKCkKLSAgewotICAgIHN1cGVyKCJYU0RMb2NhdGlvbkNob2ljZVBhZ2UiKTsKLQotICAgIHRoaXMuc2V0VGl0bGUoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1dJWkFSRF9JTkNMVURFX0ZJTEVfVElUTEUiKSk7Ci0gICAgdGhpcy5zZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfV0laQVJEX0lOQ0xVREVfRklMRV9ERVNDIikpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBiYXNlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBiYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICAgIAotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGJhc2UsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9JTkNMVURFX1VSTF9GSUxFIikpOwotICAgIENvbXBvc2l0ZSByYWRpb0J1dHRvbnNHcm91cCA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShiYXNlLCAxLCB0cnVlKTsKLQotICAgIHJhZGlvQnV0dG9uMSA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKHJhZGlvQnV0dG9uc0dyb3VwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fRklMRSIpKTsKLSAgICAgIAotICAgIHJhZGlvQnV0dG9uMiA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKHJhZGlvQnV0dG9uc0dyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SQURJT19VUkwiKSk7Ci0KLSAgICByYWRpb0J1dHRvbjEuc2V0U2VsZWN0aW9uKHRydWUpOwotCi0gICAgc2V0Q29udHJvbChiYXNlKTsKLSAgfQotCi0gIC8vIGFjdGlvbnMgb24gZmluaXNoCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1VSTCgpCi0gIHsKLSAgICByZXR1cm4gcmFkaW9CdXR0b24yLmdldFNlbGVjdGlvbigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRE5ld0ZpbGVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRE5ld0ZpbGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzFlMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0ROZXdGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgWFNETmV3RmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlCi17Ci0gIHB1YmxpYyBYU0ROZXdGaWxlUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIAotICB7Ci0gICAgc3VwZXIoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NSRUFURVhTRCIpLCBzZWxlY3Rpb24pOwotICAgIHNldFRpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ORVdfWE1MX1NDSEVNQV9USVRMRSIpKTsKLSAgICBzZXREZXNjcmlwdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQ1JFQVRFX0FfTkVXX1hNTF9TQ0hFTUFfREVTQyIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICAvLyBpbmhlcml0IGRlZmF1bHQgY29udGFpbmVyIGFuZCBuYW1lIHNwZWNpZmljYXRpb24gd2lkZ2V0cwotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQotICAgIHRoaXMuc2V0RmlsZU5hbWUoY29tcHV0ZURlZmF1bHRGaWxlTmFtZSgpKTsKLQotICAgIHNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKQotICB7Ci0gICAgUGF0aCBuZXdOYW1lID0gbmV3IFBhdGgoZ2V0RmlsZU5hbWUoKSk7Ci0gICAgU3RyaW5nIGZ1bGxGaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0gICAgU3RyaW5nIGV4dGVuc2lvbiA9IG5ld05hbWUuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCB8fCAhZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoInhzZCIpKSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX1hTRCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZm9yIGZpbGUgc2hvdWxkIGJlIGNhc2UgaW5zZW5zaXRpdmUKLSAgICBTdHJpbmcgc2FtZU5hbWUgPSBleGlzdHNGaWxlQW55Q2FzZShmdWxsRmlsZU5hbWUpOwotICAgIGlmIChzYW1lTmFtZSAhPSBudWxsKSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMiLCBzYW1lTmFtZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBkZWZhdWx0TmFtZSA9ICJOZXdYTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgZGVmYXVsdEZpbGVFeHRlbnNpb24gPSAiLnhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMgPSB7ICIqLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkKLSAgewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgU3RyaW5nIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLSAgICBJUGF0aCBjb250YWluZXJGdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0gICAgaWYgKGNvbnRhaW5lckZ1bGxQYXRoICE9IG51bGwpCi0gICAgewotICAgICAgd2hpbGUgKHRydWUpCi0gICAgICB7Ci0gICAgICAgIElQYXRoIHBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotICAgICAgICBpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMocGF0aCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBjb3VudCArIGRlZmF1bHRGaWxlRXh0ZW5zaW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWxlTmFtZTsKLSAgfQotCi0gIC8vIHJldHVybnMgdHJ1ZSBpZiBmaWxlIG9mIHNwZWNpZmllZCBuYW1lIGV4aXN0cyBpbiBhbnkgY2FzZSBmb3Igc2VsZWN0ZWQgY29udGFpbmVyCi0gIHByb3RlY3RlZCBTdHJpbmcgZXhpc3RzRmlsZUFueUNhc2UoU3RyaW5nIGZpbGVOYW1lKQotICB7Ci0gICAgaWYgKCAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpCi0gICAgICAgICYmIChmaWxlTmFtZS5jb21wYXJlVG8oIiIpICE9IDApKQotICAgIHsKLSAgICAgIC8vbG9vayB0aHJvdWdoIGFsbCByZXNvdXJjZXMgYXQgdGhlIHNwZWNpZmllZCBjb250YWluZXIgLSBjb21wYXJlIGluIHVwcGVyIGNhc2UKLSAgICAgIElSZXNvdXJjZSBwYXJlbnQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgIHsKLSAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcGFyZW50OwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIElSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotICAgICAgICAgIFN0cmluZyBlbnRlcmVkRmlsZVVwcGVyID0gZmlsZU5hbWUudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVtYmVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VVcHBlck5hbWUgPSBtZW1iZXJzW2ldLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlVXBwZXJOYW1lLmVxdWFscyhlbnRlcmVkRmlsZVVwcGVyKSkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyc1tpXS5nZXROYW1lKCk7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjMWJlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFBhcnNlcjsKLQotCi0vKioKLSAqIEV4dGVuZCB0aGUgYmFzZSB3aXphcmQgdG8gc2VsZWN0IGEgZmlsZSBmcm9tIHRoZSBwcm9qZWN0IG9yIG91dHNpZGUgdGhlIHdvcmtiZW5jaAotICogYW5kIGFkZCBlcnJvciBoYW5kbGluZwotICovCi1wdWJsaWMgY2xhc3MgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkCi17Ci0gIGJvb2xlYW4gaXNJbmNsdWRlOwotICBYU0RTY2hlbWEgbWFpblNjaGVtYTsKLSAgWFNEU2NoZW1hIGV4dGVybmFsU2NoZW1hOwotCi0gIFhTRExvY2F0aW9uQ2hvaWNlUGFnZSBjaG9pY2VQYWdlOwotICBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZSBmaWxlUGFnZTsKLSAgWFNEVVJMUGFnZSB1cmxQYWdlOwotCi0gIElGaWxlIHJlc3VsdEZpbGU7Ci0gIFN0cmluZyByZXN1bHRVUkw7Ci0gIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsKLQotICBwdWJsaWMgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQoWFNEU2NoZW1hIG1haW5TY2hlbWEsIGJvb2xlYW4gaXNJbmNsdWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0gICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL05ld1hTRC5wbmciKSk7Ci0KLSAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQotICAgIC8vIENob2ljZSBQYWdlCi0gICAgY2hvaWNlUGFnZSA9IG5ldyBYU0RMb2NhdGlvbkNob2ljZVBhZ2UoKTsKLQotICAgIC8vIFNlbGVjdCBGaWxlIFBhZ2UKLSAgICBmaWxlUGFnZSA9IG5ldyBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCAgc2VsZWN0aW9uLCB0cnVlKTsKLSAgICBmaWxlUGFnZS5zZXRUaXRsZSh0aXRsZSk7Ci0gICAgZmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0gICAgZmlsZVBhZ2UuYWRkRmlsdGVyKGZpbHRlcik7Ci0KLSAgICAvLyBVUkwgUGFnZQotICAgIHVybFBhZ2UgPSBuZXcgWFNEVVJMUGFnZSgpOwotICAgIHVybFBhZ2Uuc2V0VGl0bGUodGl0bGUpOwotICAgIHVybFBhZ2Uuc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9VUkwiKSk7Ci0gICAgCi0gICAgdGhpcy5tYWluU2NoZW1hID0gbWFpblNjaGVtYTsKLSAgICB0aGlzLmlzSW5jbHVkZSA9IGlzSW5jbHVkZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKQotICB7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0gICAgYWRkUGFnZShjaG9pY2VQYWdlKTsKLSAgICBhZGRQYWdlKGZpbGVQYWdlKTsKLSAgICBhZGRQYWdlKHVybFBhZ2UpOwotICB9Ci0KLSAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIGN1cnJlbnRQYWdlKQotICB7Ci0gICAgV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0KLSAgICBpZiAoY3VycmVudFBhZ2UgPT0gY2hvaWNlUGFnZSkKLSAgICB7Ci0gICAgICBpZiAoY2hvaWNlUGFnZS5pc1VSTCgpKSAKLSAgICAgIHsKLSAgICAgICAgbmV4dFBhZ2UgPSB1cmxQYWdlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBuZXh0UGFnZSA9IGZpbGVQYWdlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV4dFBhZ2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKQotICB7Ci0gICAgaWYgKCFjaG9pY2VQYWdlLmlzVVJMKCkpCi0gICAgewotICAgICAgcmV0dXJuIGZpbGVQYWdlLmlzUGFnZUNvbXBsZXRlKCk7IAotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7IAotICAgIGlmIChjaG9pY2VQYWdlLmlzVVJMKCkpCi0gICAgewotICAgICAgdHJ5IAotICAgICAgewotICAgICAgICBnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIHVybFBhZ2UuZ2V0UnVubmFibGUoKSk7Ci0gICAgICAgIHJlc3VsdFVSTCA9IHVybFBhZ2UuZ2V0VVJMKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgCi0gICAgICByZXN1bHRGaWxlID0gZmlsZVBhZ2UuZ2V0RmlsZSgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIE1PRiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBleHRlcm5hbCBmaWxlCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGdldEV4dGVybmFsU2NoZW1hKCkKLSAgewotICAgIHJldHVybiBleHRlcm5hbFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyBJRmlsZSBnZXRSZXN1bHRGaWxlKCkKLSAgewotICAgIHJldHVybiByZXN1bHRGaWxlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICB7Ci0gICAgcmV0dXJuIHJlc3VsdFVSTDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gIAlyZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIE1PRiBtb2RlbCBmb3IgdGhlIGltcG9ydGVkIGZpbGUKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZG9Mb2FkRXh0ZXJuYWxNb2RlbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB4c2RNb2RlbEZpbGUsIFN0cmluZyB4c2RGaWxlTmFtZSkKLSAgeyAKLSAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICBTdHJpbmcgY3VycmVudE5hbWVTcGFjZSA9IG1haW5TY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBtb25pdG9yLmJlZ2luVGFzaygiTG9hZGluZyBYTUwgU2NoZW1hIiwgMTAwKTsKLSAgICBtb25pdG9yLndvcmtlZCg1MCk7Ci0KLSAgICBYU0RQYXJzZXIgcGFyc2VyID0gbmV3IFhTRFBhcnNlcigpOwotICAgIHBhcnNlci5wYXJzZSh4c2RNb2RlbEZpbGUpOwotCi0gICAgZXh0ZXJuYWxTY2hlbWEgPSBwYXJzZXIuZ2V0U2NoZW1hKCk7Ci0gICAgaWYgKGV4dGVybmFsU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGV4dE5hbWVzcGFjZSA9IGV4dGVybmFsU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgbmFtZXNwYWNlID0gZXh0TmFtZXNwYWNlOwotICAgICAKLSAgICAgIGlmIChleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpICE9IG51bGwgJiYKLSAgICAgICAgICBleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoaXNJbmNsdWRlKSAKLSAgICAgICAgeyAgCi0gICAgICAgICAgLy8gQ2hlY2sgdGhlIG5hbWVzcGFjZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgdGhlIHNhbWUgYXMgY3VycmVudCBmaWxlCi0gICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgIWV4dE5hbWVzcGFjZS5lcXVhbHMoY3VycmVudE5hbWVTcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9ESUZGRVJFTlRfTkFNRV9TUEFDRSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICAvLyBDaGVjayB0aGUgbmFtZXNwYWNlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBmaWxlCi0gICAgICAgICAgaWYgKGV4dE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TmFtZVNwYWNlICE9IG51bGwgJiYgZXh0TmFtZXNwYWNlLmVxdWFscyhjdXJyZW50TmFtZVNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX1NBTUVfTkFNRV9TUEFDRSIsIHhzZEZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSIsIHhzZEZpbGVOYW1lKTsKLSAgICB9Ci0KLSAgICBtb25pdG9yLnN1YlRhc2soIkZpbmlzaCBMb2FkaW5nIik7Ci0gICAgbW9uaXRvci53b3JrZWQoODApOwotCi0gICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKLSAgfQotCi0gCi0gIC8qKgotICAgKiBVUkwgcGFnZQotICAgKi8KLSAgY2xhc3MgWFNEVVJMUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLSAgeyAKLSAgICBUZXh0IHVybEZpZWxkOwotICAgIFN0cmluZyBzYXZlU3RyaW5nOwotCi0gICAgcHVibGljIFhTRFVSTFBhZ2UoKQotICAgIHsKLSAgICAgIHN1cGVyKCJVUkxQYWdlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBjbGllbnQgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LDIpOwotICAgICAgVmlld1V0aWxpdHkuc2V0Q29tcG9zaXRlKGNsaWVudCk7Ci0KLSAgICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1VSTCIpKTsKLSAgICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNsaWVudCwgIiIpOwotCi0gICAgICB1cmxGaWVsZCA9IFZpZXdVdGlsaXR5LmNyZWF0ZVRleHRGaWVsZChjbGllbnQsIDUwKTsKLSAgICAgIHNhdmVTdHJpbmcgPSAiaHR0cDovLyI7Ci0gICAgICB1cmxGaWVsZC5zZXRUZXh0KHNhdmVTdHJpbmcpOwotCi0gICAgICBzZXRDb250cm9sKGNsaWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkwoKQotICAgIHsKLSAgICAgIHJldHVybiB1cmxGaWVsZC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG9wZW5FeHRlcm5hbFNjaGVtYShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgewotICAgICAgU3RyaW5nIHRleHQgPSB1cmxGaWVsZC5nZXRUZXh0KCk7Ci0vLyAgICAgIGlmICh0ZXh0LmVxdWFscyhzYXZlU3RyaW5nKSkgCi0vLyAgICAgIHsKLS8vICAgICAgICByZXR1cm4gZmFsc2U7Ci0vLyAgICAgIH0KLS8vICAgICAgc2F2ZVN0cmluZyA9IHRleHQ7Ci0KLSAgICAgIGlmICh0ZXh0LmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU1BFQ0lGWV9VUkwiKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCAhdGV4dC5zdGFydHNXaXRoKCJodHRwOi8vIikgKQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1VSTF9TVEFSVF9XSVRIIikpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBkb0xvYWRFeHRlcm5hbE1vZGVsKG1vbml0b3IsIHRleHQsIHRleHQpOwotICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7IAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0UnVubmFibGUoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgICAKLSAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgIGlmIChtb25pdG9yID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvcj0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIDYpOwotICAgICAgICAKLSAgICAgICAgICBib29sZWFuIG9rID0gb3BlbkV4dGVybmFsU2NoZW1hKG1vbml0b3IpOwotCi0gICAgICAgICAgaWYgKCFvaykgCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKG5ldyBqYXZhLmxhbmcuRXJyb3IoKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlbGVjdCBYTUwgU2NoZW1hIEZpbGUKLSAgICovCi0gIGNsYXNzIFhTRFNlbGVjdFNpbmdsZUZpbGVQYWdlIGV4dGVuZHMgU2VsZWN0U2luZ2xlRmlsZVBhZ2UKLSAgewotICAgIHB1YmxpYyBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZShJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIGlzRmlsZU1hbmRhdG9yeSkKLSAgICB7ICAgICAgICAgIAotICAgICAgc3VwZXIod29ya2JlbmNoLHNlbGVjdGlvbixpc0ZpbGVNYW5kYXRvcnkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuRXh0ZXJuYWxTY2hlbWEoKQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgZnVsbHktcXVhbGlmaWVkIGZpbGUgbmFtZQotICAgICAgSUZpbGUgaUZpbGUgPSBnZXRGaWxlKCk7Ci0gICAgICBpZiAoaUZpbGUgPT0gbnVsbCkgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgICBTdHJpbmcgeHNkTW9kZWxGaWxlID0gaUZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotICAgICAgU3RyaW5nIHhzZEZpbGVOYW1lID0gaUZpbGUuZ2V0TmFtZSgpOwotICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGRvTG9hZEV4dGVybmFsTW9kZWwobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgeHNkTW9kZWxGaWxlLCB4c2RGaWxlTmFtZSk7Ci0KLSAgICAgIGlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgICB7ICAKLSAgICAgIGlmIChjaG9pY2VQYWdlLmlzVVJMKCkpIAotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHN1cGVyLmlzUGFnZUNvbXBsZXRlKCkpIAotICAgICAgewotICAgICAgICByZXR1cm4gb3BlbkV4dGVybmFsU2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3VwZXIuaXNQYWdlQ29tcGxldGUoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQWRkRmllbGRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQWRkRmllbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxMTI0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0FkZEZpZWxkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQmFzZUNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIEFkZEZpZWxkQWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbgoteyAgIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBZGRGaWVsZEFjdGlvbiI7ICAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgQWRkRmllbGRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldElkKElEKTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0ZJRUxEKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaWYgKGdldFNlbGVjdGVkT2JqZWN0cygpLnNpemUoKSA+IDApCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBnZXRTZWxlY3RlZE9iamVjdHMoKS5nZXQoMCk7Ci0gICAgICBJQ29tcGxleFR5cGUgdHlwZSA9IG51bGw7Ci0gICAgICAKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgSUNvbXBsZXhUeXBlKQotICAgICAgeyAgCi0gICAgICAgIHR5cGUgPSAoSUNvbXBsZXhUeXBlKW87IAotICAgICAgfQotICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICAgIHsKLSAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClvOwotICAgICAgICB0eXBlID0gZmllbGQuZ2V0Q29udGFpbmVyVHlwZSgpOwotICAgICAgfQotICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gdHlwZS5nZXRBZGROZXdGaWVsZENvbW1hbmQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoKEJhc2VDb21tYW5kKWNvbW1hbmQpLmdldEFkZGVkQ29tcG9uZW50KCkpOwotICAgICAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAvL1RPRE8gLi4uIHBvcCB1cCBhIGNvbW1hbmQgbm90IGltcGxlbWVudGVkIG1lc3NhZ2UKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb0VkaXQoT2JqZWN0IG9iaiwgSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIGlmIChvYmogaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBCYXNlRmllbGRFZGl0UGFydCBlZGl0UGFydCA9IChCYXNlRmllbGRFZGl0UGFydClvYmo7Ci0gICAgICBlZGl0UGFydC5kb0VkaXROYW1lKCEocGFydCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VEaXJlY3RFZGl0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VEaXJlY3RFZGl0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMTQxYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9CYXNlRGlyZWN0RWRpdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5EaXJlY3RFZGl0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEJhc2VEaXJlY3RFZGl0QWN0aW9uIGV4dGVuZHMgRGlyZWN0RWRpdEFjdGlvbiB7Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcjsKLQkKLQkvKioKLQkgKiBTYW1lIGFzIHtAbGluayAjRGlyZWN0RWRpdEFjdGlvbihJV29ya2JlbmNoUGFydCl9LgotCSAqIEBwYXJhbSBlZGl0b3IgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyBCYXNlRGlyZWN0RWRpdEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc3VwZXIoKElXb3JrYmVuY2hQYXJ0KWVkaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIERpcmVjdEVkaXRBY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJ0LgotCSAqIEBwYXJhbSBwYXJ0IHRoZSB3b3JrYmVuY2ggcGFydAotCSAqLwotCXB1YmxpYyBCYXNlRGlyZWN0RWRpdEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXN1cGVyKHBhcnQpOwotCX0KLQkKLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuU2VsZWN0aW9uQWN0aW9uI2dldFNlbGVjdGlvbigpCi0JICAgKi8KLQkgIHByb3RlY3RlZCBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0JICB7Ci0JICAgIC8vIGFsd2F5cyBnZXQgc2VsZWN0aW9uIGZyb20gc2VsZWN0aW9uIHByb3ZpZGVyIGZpcnN0Ci0JCSAgaWYgKHByb3ZpZGVyIT1udWxsKSB7Ci0JCQkgIE9iamVjdCBzZWxlY3Rpb24gPSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCSAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkgIE9iamVjdCBvYmplY3QgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpIHsKLQkJCQkJICAvLyBXZSBuZWVkIHRvIHJldHVybiBhbiBFZGl0UGFydCBhcyB0aGUgc2VsZWN0aW9uLgotCQkJCQkgIElFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQkgIE9iamVjdCBncmFwaGljYWxWaWV3ZXIgPSBlZGl0b3IuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpOwotCQkJCQkgIGlmIChncmFwaGljYWxWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKSB7Ci0JCQkJCQkgIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gKEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpIGdyYXBoaWNhbFZpZXdlcjsKLQkJCQkJCSAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQob2JqZWN0KTsKLQkJCQkJCSAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVkaXRQYXJ0KTsKLQkJCQkJICB9Ci0JCQkJICB9Ci0JCQkgIH0KLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIHN1cGVyLmdldFNlbGVjdGlvbigpOwotCSAgfQotCQotCSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpIHsKLQkJICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCSAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKSB7Ci0JCQkgIHJldHVybiAgISgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuaXNSZWFkT25seSgpOwotCQkgIH0KLQkJICAKLQkJICByZXR1cm4gdHJ1ZTsKLQkgIH0KLQkgIAotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5TZWxlY3Rpb25BY3Rpb24jc2V0U2VsZWN0aW9uUHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIpCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikKLQkgIHsKLQkgICAgc3VwZXIuc2V0U2VsZWN0aW9uUHJvdmlkZXIocHJvdmlkZXIpOwotCSAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VTZWxlY3Rpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQmFzZVNlbGVjdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGY2ZjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQmFzZVNlbGVjdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQWJzdHJhY3RFZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VTZWxlY3Rpb25BY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25BY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SX0lEID0gIm9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQk1FTlVfU1RBUlRfSUQgPSAiU1VCTUVOVV9TVEFSVF9JRDogIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJNRU5VX0VORF9JRCA9ICJTVUJNRU5VX0VORF9JRDogIjsgLy8kTk9OLU5MUy0xJAotCi0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBib29sZWFuIGRvRGlyZWN0RWRpdCA9IHRydWU7Ci0gIAotICBwdWJsaWMgQmFzZVNlbGVjdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5TZWxlY3Rpb25BY3Rpb24jZ2V0U2VsZWN0aW9uKCkKLSAgICovCi0gIHByb3RlY3RlZCBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIHsKLSAgICAvLyBhbHdheXMgZ2V0IHNlbGVjdGlvbiBmcm9tIHNlbGVjdGlvbiBwcm92aWRlciBmaXJzdAotICAgIGlmIChwcm92aWRlciE9bnVsbCkKLSAgICAgIHJldHVybiBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICByZXR1cm4gc3VwZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlNlbGVjdGlvbkFjdGlvbiNzZXRTZWxlY3Rpb25Qcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikKLSAgewotICAgIHN1cGVyLnNldFNlbGVjdGlvblByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb24jY2FsY3VsYXRlRW5hYmxlZCgpCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkKLSAgewotICAgIGlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJQ29tcGxleFR5cGUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAhKChJQ29tcGxleFR5cGUpbykuaXNSZWFkT25seSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICEoKElGaWVsZClvKS5pc1JlYWRPbmx5KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RBZGRlZENvbXBvbmVudChmaW5hbCBBZGFwdGVyIGFkYXB0ZXIpCi0gIHsKLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhZGFwdGVyKSk7Ci0gICAgICAgICAgaWYgKGRvRGlyZWN0RWRpdCkKLSAgICAgICAgICAgIGFjdGl2YXRlRGlyZWN0RWRpdCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVEaXJlY3RFZGl0KCkKLSAgewotICAgIGlmIChnZXRXb3JrYmVuY2hQYXJ0KCkgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgb3duaW5nRWRpdG9yID0gKElFZGl0b3JQYXJ0KWdldFdvcmtiZW5jaFBhcnQoKTsKLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBvd25pbmdFZGl0b3IuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpOwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RFZGl0UGFydFZpZXdlcikKLSAgICAgICAgewotICAgICAgICAgIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gKEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpb2JqZWN0OwotICAgICAgICAgIE9iamVjdCBvYmogPSB2aWV3ZXIuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0gICAgICAgICAgZG9FZGl0KG9iaiwgcGFydCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfSAgICAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRvRWRpdChPYmplY3Qgb2JqLCBJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQ2FwdHVyZVNjcmVlbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9DYXB0dXJlU2NyZWVuQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NGMyYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9DYXB0dXJlU2NyZWVuQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU1dUR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIENhcHR1cmVTY3JlZW5BY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9QQVRIID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX05BTUUgPSBNZXNzYWdlcy5fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0RFRkFVTFRfRklMRV9OQU1FOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX0VYVEVOU0lPTiA9ICIuanBnIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBDYXB0dXJlU2NyZWVuQWN0aW9uKCkKLSAgewotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0NBUFRVUkVfU0NSRUVOX0FDVElPTl9URVhUKTsKLSAgICBzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfQ0FQVFVSRV9TQ1JFRU5fQUNUSU9OX1RPT0xUSVBURVhUKTsKLSAgICBzZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFhTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2R0b29sMTYvY2FwdHVyZXNjcmVlbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRBY2NlbGVyYXRvcihTV1QuQ1RSTCB8IFNXVC5TSElGVCB8ICdYJyk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBJbWFnZUV4cG9ydGVyIGltYWdlRXhwb3J0ZXIgPSBuZXcgSW1hZ2VFeHBvcnRlcigpOwotICAgIGltYWdlRXhwb3J0ZXIuc2F2ZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSwgKEdyYXBoaWNhbFZpZXdlcikgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpKTsKLSAgfQotCi0gIHB1YmxpYyBjbGFzcyBJbWFnZUV4cG9ydGVyCi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9GT1JNQVRTID0gIiouanBnOyouanBlZzsqLmJtcDsqLnRpZiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0VQQVJBVE9SID0gImZpbGUuc2VwYXJhdG9yIjsKLQotCXB1YmxpYyBib29sZWFuIHNhdmUoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlciwgU3RyaW5nIHNhdmVGaWxlUGF0aCwgaW50IGZvcm1hdCkKLSAgICB7Ci0gICAgICBBc3NlcnQuaXNOb3ROdWxsKGVkaXRvclBhcnQsICJudWxsIGVkaXRvclBhcnQgcGFzc2VkIHRvIEltYWdlRXhwb3J0ZXIuc2F2ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBBc3NlcnQuaXNOb3ROdWxsKHZpZXdlciwgIm51bGwgdmlld2VyIHBhc3NlZCB0byBJbWFnZUV4cG9ydGVyLnNhdmUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgQXNzZXJ0LmlzTm90TnVsbChzYXZlRmlsZVBhdGgsICJudWxsIHNhdmVGaWxlUGF0aCBwYXNzZWQgdG8gSW1hZ2VFeHBvcnRlci5zYXZlIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgaWYgKGZvcm1hdCAhPSBTV1QuSU1BR0VfQk1QICYmIGZvcm1hdCAhPSBTV1QuSU1BR0VfSlBFRyAmJiBmb3JtYXQgIT0gU1dULklNQUdFX0lDTykKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0ZPUk1BVF9OT1RfU1VQUE9SVEVEKTsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHNhdmVFZGl0b3JDb250ZW50c0FzSW1hZ2UoZWRpdG9yUGFydCwgdmlld2VyLCBzYXZlRmlsZVBhdGgsIGZvcm1hdCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgewotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihlZGl0b3JQYXJ0LmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0VSUk9SX1RJVExFLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0VSUk9SX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzYXZlKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAgQXNzZXJ0LmlzTm90TnVsbChlZGl0b3JQYXJ0LCAibnVsbCBlZGl0b3JQYXJ0IHBhc3NlZCB0byBJbWFnZUV4cG9ydGVyLnNhdmUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgQXNzZXJ0LmlzTm90TnVsbCh2aWV3ZXIsICJudWxsIHZpZXdlciBwYXNzZWQgdG8gSW1hZ2VFeHBvcnRlci5zYXZlIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgU3RyaW5nIHNhdmVGaWxlUGF0aCA9IGdldFNhdmVGaWxlUGF0aChlZGl0b3JQYXJ0LCB2aWV3ZXIpOwotICAgICAgaWYgKHNhdmVGaWxlUGF0aCA9PSBudWxsKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHNhdmVGaWxlUGF0aCk7Ci0gICAgICBpZiAoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRmlsZSgpKQotICAgICAgewotICAgICAgICBpZiAoIU1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgTWVzc2FnZXMuX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9PVkVSV1JJVEVfQ09ORklSTUFUSU9OX1FVRVNUSU9OLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX09WRVJXUklURV9DT05GSVJNQVRJT04ucmVwbGFjZSgiezB9Iiwgc2F2ZUZpbGVQYXRoKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpbnQgZm9ybWF0ID0gU1dULklNQUdFX0pQRUc7Ci0gICAgICBpZiAoc2F2ZUZpbGVQYXRoLmVuZHNXaXRoKCIuYm1wIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZm9ybWF0ID0gU1dULklNQUdFX0JNUDsKLSAgICAgIGVsc2UgaWYgKHNhdmVGaWxlUGF0aC5lbmRzV2l0aCgiLmljbyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvcm1hdCA9IFNXVC5JTUFHRV9JQ087Ci0gICAgICBlbHNlIGlmIChzYXZlRmlsZVBhdGguZW5kc1dpdGgoIi5wbmciKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICBmb3JtYXQgPSBTV1QuSU1BR0VfUE5HOwotICAgICAgZWxzZSBpZiAoc2F2ZUZpbGVQYXRoLmVuZHNXaXRoKCIuZ2lmIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZm9ybWF0ID0gU1dULklNQUdFX0dJRjsKLSAgICAgIGVsc2UgaWYgKHNhdmVGaWxlUGF0aC5lbmRzV2l0aCgiLnRpZmYiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICBmb3JtYXQgPSBTV1QuSU1BR0VfVElGRjsKLQotICAgICAgcmV0dXJuIHNhdmUoZWRpdG9yUGFydCwgdmlld2VyLCBzYXZlRmlsZVBhdGgsIGZvcm1hdCk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTYXZlRmlsZVBhdGgoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICBTdHJpbmcgZmlsZVBhdGg7Ci0KLSAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIFNXVC5TQVZFKTsKLQotICAgICAgU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucyA9IG5ldyBTdHJpbmdbXSB7RklMRV9GT1JNQVRTfTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBmaWxlRGlhbG9nLnNldEZpbGVOYW1lKG9idGFpbk5leHRGaWxlTmFtZSgpKTsKLSAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLSAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHtGSUxFX0ZPUk1BVFN9KTsKLSAgICAgIGZpbGVEaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0ZJTEVfU0FWRV9ESUFMT0dfVElUTEUpOwotICAgICAgCi0gICAgICBmaWxlUGF0aCA9IGZpbGVEaWFsb2cub3BlbigpOwotCi0gICAgICBpZiAoZmlsZVBhdGggIT0gbnVsbCkKLSAgICAgIHsKLQkgICAgICBMQVNUX1NDUkVFTl9DQVBUVVJFX1BBVEggPSBmaWxlRGlhbG9nLmdldEZpbHRlclBhdGgoKTsKLQkgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLmdldEZpbGVOYW1lKCk7Ci0JICAgICAgaWYgKGZpbGVOYW1lLmluZGV4T2YoJy4nKSA+IDApIHsKLQkJICAgICAgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX05BTUUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUuaW5kZXhPZignLicpKTsKLQkJICAgICAgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX0VYVEVOU0lPTiA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5pbmRleE9mKCcuJykpOwotCSAgICAgIH0KLQkgICAgICBlbHNlCi0JICAgICAgewotCQkgICAgICBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfTkFNRSA9IGZpbGVOYW1lOwotCQkgICAgICBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfRVhURU5TSU9OID0gIiI7Ci0JICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGZpbGVQYXRoOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzYXZlRWRpdG9yQ29udGVudHNBc0ltYWdlKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIsIFN0cmluZyBzYXZlRmlsZVBhdGgsIGludCBmb3JtYXQpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIDEuIEZpcnN0IGdldCB0aGUgZmlndXJlIHdob3NlIHZpc3VhbHMgd2Ugd2FudCB0byBzYXZlIGFzIGltYWdlLiBTbyB3ZQotICAgICAgICogd291bGQgbGlrZSB0byBzYXZlIHRoZSByb290ZWRpdHBhcnQgd2hpY2ggYWN0dWFsbHkgaG9zdHMgYWxsIHRoZQotICAgICAgICogcHJpbnRhYmxlIGxheWVycy4KLSAgICAgICAqIAotICAgICAgICogTk9URTogU2NhbGFibGVSb290RWRpdFBhcnQgbWFuYWdlcyBsYXllcnMgYW5kIGlzIHJlZ2lzdGVyZWQKLSAgICAgICAqIGdyYXBoaWNhbHZpZXdlcidzIGVkaXRwYXJ0cmVnaXN0cnkgd2l0aCB0aGUga2V5IExheWVyTWFuYWdlci5JRCAuLi4KLSAgICAgICAqIHdlbGwgdGhhdCBpcyBiZWNhdXNlIFNjYWxhYmxlUm9vdEVkaXRQYXJ0IG1hbmFnZXMgYWxsIGxheWVycyB0aGF0IGFyZQotICAgICAgICogaG9zdGVkIG9uIGEgRmlndXJlQ2FudmFzLiBNYW55IGxheWVycyBleGlzdCBmb3IgZG9pbmcgZGlmZmVyZW50IHRoaW5ncwotICAgICAgICovCi0gICAgICBTY2FsYWJsZVJvb3RFZGl0UGFydCByb290RWRpdFBhcnQgPSAoU2NhbGFibGVSb290RWRpdFBhcnQpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KExheWVyTWFuYWdlci5JRCk7Ci0gICAgICBJRmlndXJlIHJvb3RGaWd1cmUgPSAoKExheWVyTWFuYWdlcikgcm9vdEVkaXRQYXJ0KS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsvLyByb290RWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0gICAgICBSZWN0YW5nbGUgcm9vdEZpZ3VyZUJvdW5kcyA9IG5ldyBSZWN0YW5nbGUobmV3IFBvaW50KDAsMCkscm9vdEZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCkpOwotCi0gICAgICAvKgotICAgICAgICogMi4gTm93IHdlIHdhbnQgdG8gZ2V0IHRoZSBHQyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRyb2wgb24gd2hpY2ggYWxsCi0gICAgICAgKiBmaWd1cmVzIGFyZSBwYWludGVkIGJ5IFNXVEdyYXBoaWNzLiBGb3IgdGhhdCBmaXJzdCBnZXQgdGhlIFNXVCBDb250cm9sCi0gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXdlciBvbiB3aGljaCB0aGUgcm9vdGVkaXRwYXJ0IGlzIHNldCBhcyBjb250ZW50cwotICAgICAgICovCi0gICAgICBDb250cm9sIGZpZ3VyZUNhbnZhcyA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICBHQyBmaWd1cmVDYW52YXNHQyA9IG5ldyBHQyhmaWd1cmVDYW52YXMpOwotCi0gICAgICAvKgotICAgICAgICogMy4gQ3JlYXRlIGEgbmV3IEdyYXBoaWNzIGZvciBhbiBJbWFnZSBvbnRvIHdoaWNoIHdlIHdhbnQgdG8gcGFpbnQKLSAgICAgICAqIHJvb3RGaWd1cmUKLSAgICAgICAqLwotICAgICAgSW1hZ2UgaW1nID0gbmV3IEltYWdlKG51bGwsIHJvb3RGaWd1cmVCb3VuZHMud2lkdGgsIHJvb3RGaWd1cmVCb3VuZHMuaGVpZ2h0KTsKLSAgICAgIEdDIGltYWdlR0MgPSBuZXcgR0MoaW1nKTsKLSAgICAgIGltYWdlR0Muc2V0QmFja2dyb3VuZChmaWd1cmVDYW52YXNHQy5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgaW1hZ2VHQy5zZXRGb3JlZ3JvdW5kKGZpZ3VyZUNhbnZhc0dDLmdldEZvcmVncm91bmQoKSk7Ci0gICAgICBpbWFnZUdDLnNldEZvbnQoZmlndXJlQ2FudmFzR0MuZ2V0Rm9udCgpKTsKLSAgICAgIGltYWdlR0Muc2V0TGluZVN0eWxlKGZpZ3VyZUNhbnZhc0dDLmdldExpbmVTdHlsZSgpKTsKLSAgICAgIGltYWdlR0Muc2V0TGluZVdpZHRoKGZpZ3VyZUNhbnZhc0dDLmdldExpbmVXaWR0aCgpKTsKLSAgICAgIGltYWdlR0Muc2V0WE9STW9kZShmaWd1cmVDYW52YXNHQy5nZXRYT1JNb2RlKCkpOwotICAgICAgR3JhcGhpY3MgaW1nR3JhcGhpY3MgPSBuZXcgU1dUR3JhcGhpY3MoaW1hZ2VHQyk7Ci0KLSAgICAgIC8qIDQuIERyYXcgcm9vdEZpZ3VyZSBvbnRvIGltYWdlLiBBZnRlciB0aGF0IGltYWdlIHdpbGwgYmUgcmVhZHkgZm9yIHNhdmUgKi8KLSAgICAgIHJvb3RGaWd1cmUucGFpbnQoaW1nR3JhcGhpY3MpOwotCi0gICAgICAvKiA1LiBTYXZlIGltYWdlICovCi0gICAgICBJbWFnZURhdGFbXSBpbWdEYXRhID0gbmV3IEltYWdlRGF0YVsxXTsKLSAgICAgIGltZ0RhdGFbMF0gPSBpbWcuZ2V0SW1hZ2VEYXRhKCk7Ci0KLSAgICAgIEltYWdlTG9hZGVyIGltZ0xvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotICAgICAgaW1nTG9hZGVyLmRhdGEgPSBpbWdEYXRhOwotICAgICAgaW1nTG9hZGVyLnNhdmUoc2F2ZUZpbGVQYXRoLCBmb3JtYXQpOwotCi0gICAgICAvKiByZWxlYXNlIE9TIHJlc291cmNlcyAqLwotICAgICAgZmlndXJlQ2FudmFzR0MuZGlzcG9zZSgpOwotICAgICAgaW1hZ2VHQy5kaXNwb3NlKCk7Ci0gICAgICBpbWcuZGlzcG9zZSgpOwotCi0gICAgfQotCi0gICAgU3RyaW5nIG9idGFpbk5leHRGaWxlTmFtZSgpCi0gICAgewotCi0gICAgICBpbnQgYXV4ID0gTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX05BTUUubGVuZ3RoKCkgLSAxOwotICAgICAgd2hpbGUgKENoYXJhY3Rlci5pc0RpZ2l0KExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9OQU1FLmNoYXJBdChhdXgpKSkKLSAgICAgIHsKLSAgICAgICAgYXV4LS07Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBub25OdW1lcmF0ZWRmaWxlTmFtZSA9IExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9OQU1FLnN1YnN0cmluZygwLCBhdXggKyAxKTsKLSAgICAgIFN0cmluZyBmaWxlUGF0aCA9IExBU1RfU0NSRUVOX0NBUFRVUkVfUEFUSCArIFN5c3RlbS5nZXRQcm9wZXJ0eShGSUxFX1NFUEFSQVRPUikgKyBub25OdW1lcmF0ZWRmaWxlTmFtZSArIExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9FWFRFTlNJT047IC8vJE5PTi1OTFMtMSQKLQotICAgICAgaW50IGNvdW50ZXIgPSAxOwotICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotICAgICAgd2hpbGUgKGZpbGUuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIGZpbGVQYXRoID0gTEFTVF9TQ1JFRU5fQ0FQVFVSRV9QQVRIICsgU3lzdGVtLmdldFByb3BlcnR5KEZJTEVfU0VQQVJBVE9SKSArIG5vbk51bWVyYXRlZGZpbGVOYW1lICsgY291bnRlcisrICsgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX0VYVEVOU0lPTjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gZmlsZVBhdGg7Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWU4OWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkRlbGV0ZUFjdGlvbiI7ICAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBEZWxldGVBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEUpOwotICAgIHNldElkKElEKTsKLSAgICBzZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZGVsZXRlX29iai5naWYiKSApOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsZWN0aW9uID0gaS5uZXh0KCk7Ci0gICAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgICAgYm9vbGVhbiBkb1NldElucHV0ID0gZmFsc2U7Ci0gICAgICBib29sZWFuIGRvU2V0TW9kZWxBc0lucHV0ID0gZmFsc2U7Ci0gICAgICBJQURUT2JqZWN0IHRvcExldmVsQ29udGFpbmVyID0gbnVsbDsKLSAgICAgIElNb2RlbCBtb2RlbCA9IG51bGw7Ci0gICAgICAKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KQotICAgICAgewotICAgICAgICBJR3JhcGhFbGVtZW50IHhzZE9iaiA9IChJR3JhcGhFbGVtZW50KXNlbGVjdGlvbjsKLSAgICAgICAgdG9wTGV2ZWxDb250YWluZXIgPSB4c2RPYmouZ2V0VG9wQ29udGFpbmVyKCk7Ci0gICAgICAgIGlmICh0b3BMZXZlbENvbnRhaW5lciA9PSBzZWxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBkb1NldElucHV0ID0gdHJ1ZTsKLSAgICAgICAgICBkb1NldE1vZGVsQXNJbnB1dCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY29tbWFuZCA9IHhzZE9iai5nZXREZWxldGVDb21tYW5kKCk7Ci0gICAgICAgIG1vZGVsID0geHNkT2JqLmdldE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgaWYgKHdvcmtiZW5jaCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsICYmIHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCB2aWV3ZXIgPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsKLSAgICAgICAgICAgICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpCi0gICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgT2JqZWN0IGlucHV0ID0gKChEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyKXZpZXdlcikuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gc2VsZWN0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIEJ1ZyA4NjIxOCA6IERvbid0IHN3aXRjaCB0byB0b3AgbGV2ZWwgdmlldyBpZiB0aGUgb2JqZWN0IHdlJ3JlIGRlbGV0aW5nCi0gICAgICAgICAgICAgICAgICAvLyBpcyBub3QgdGhlIGlucHV0IHRvIHRoZSB2aWV3ZXIKLSAgICAgICAgICAgICAgICAgIGRvU2V0SW5wdXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIGlmIChkb1NldElucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1vZGVsICE9IG51bGwgJiYgZG9TZXRNb2RlbEFzSW5wdXQpCi0gICAgICAgICAgICBwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kZWwpKTsgICAKLSAgICAgICAgICBlbHNlIGlmICh0b3BMZXZlbENvbnRhaW5lciAhPSBudWxsICYmICFkb1NldE1vZGVsQXNJbnB1dCkKLSAgICAgICAgICAgIHByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0b3BMZXZlbENvbnRhaW5lcikpOwotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvU2V0SW5wdXRUb0dyYXBoVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9TZXRJbnB1dFRvR3JhcGhWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjkzMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9TZXRJbnB1dFRvR3JhcGhWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290Q29udGVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLQotcHVibGljIGNsYXNzIFNldElucHV0VG9HcmFwaFZpZXcgZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIlNldEFzRm9jdXMiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OwotCi0gIHB1YmxpYyBTZXRJbnB1dFRvR3JhcGhWaWV3KElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICB0aGlzKHBhcnQsIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgU2V0SW5wdXRUb0dyYXBoVmlldyhJV29ya2JlbmNoUGFydCBwYXJ0LCBPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgc2V0SWQoSUQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfQVNfRk9DVVMpOwotICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpCi0gICAgewotICAgICAgZWRpdG9yUGFydCA9IChJRWRpdG9yUGFydClwYXJ0OwotICAgIH0gICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsgICAgCi0gICAgT2JqZWN0IHNlbGVjdGlvbiA9IGlucHV0OyAgIAotICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICB9ICAKLSAgICBPYmplY3QgYWRhcHRlciA9IGdldFdvcmtiZW5jaFBhcnQoKS5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICB7Ci0gICAgICBJQURUT2JqZWN0IG9iaiA9IChJQURUT2JqZWN0KSBzZWxlY3Rpb247Ci0gICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpCi0gICAgICB7Ci0gICAgICAgIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyID0gKERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpIGFkYXB0ZXI7ICAKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBncmFwaGljYWxWaWV3ZXIuZ2V0SW5wdXRFZGl0UGFydCgpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBSb290Q29udGVudEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldElucHV0QW5kTWFya0xvY2F0aW9uKG9iaik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL1Nob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2QyMzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0KLS8qKgotICogU2hvdyB0aGUgcHJvcGVydGllcyB2aWV3IGluIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlLgotICovCi1wdWJsaWMgY2xhc3MgU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfVklFV19JRCA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0IjsgLy8kTk9OLU5MUy0xJAotCQotICBwcm90ZWN0ZWQgc3RhdGljIEltYWdlRGVzY3JpcHRvciBlbmFibGVkSW1hZ2UsIGRpc2FibGVkSW1hZ2U7Ci0KLQlwdWJsaWMgU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX1NIT1dfUFJPUEVSVElFUyk7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0gICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFhTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2VsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmIikgKTsgLy8kTk9OLU5MUy0xJAotCSAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZGxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYiKSApOyAvLyROT04tTkxTLTEkCi0JfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGdldFdvcmtiZW5jaFBhcnQoKS5nZXRTaXRlKCkuZ2V0UGFnZSgpLnNob3dWaWV3KFBST1BFUlRJRVNfVklFV19JRCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgewotCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vQURURmxvYXRpbmdUb29sYmFyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vQURURmxvYXRpbmdUb29sYmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MGJjMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0FEVEZsb2F0aW5nVG9vbGJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsVmlld2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkFEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBRFRGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBHcmFwaGljYWxWaWV3ZXJJbXBsCi17Ci0gIHByb3RlY3RlZCBJTW9kZWwgbW9kZWw7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzRHJpbGxlZERvd247Ci0gIHByb3RlY3RlZCBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydCBlZGl0UGFydDsKLQotICBwdWJsaWMgQURURmxvYXRpbmdUb29sYmFyKElNb2RlbCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKElNb2RlbCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICBlZGl0UGFydCA9IChBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydClnZXRFZGl0UGFydEZhY3RvcnkoKS5jcmVhdGVFZGl0UGFydChudWxsLCBuZXcgQURURmxvYXRpbmdUb29sYmFyTW9kZWwobW9kZWwpKTsKLSAgICBpZiAoZWRpdFBhcnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IG5ldyBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydChtb2RlbCk7Ci0gICAgfQotICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICBzZXRDb250ZW50cyhlZGl0UGFydCk7Ci0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBjYW52YXMuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgc2V0Q29udHJvbChjYW52YXMpOwotICAgIHJldHVybiBnZXRDb250cm9sKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gaXNEcmlsbGVkRG93bikKLSAgewotICAgIHRoaXMuaXNEcmlsbGVkRG93biA9IGlzRHJpbGxlZERvd247Ci0gICAgZWRpdFBhcnQuc2V0SXNEcmlsbGVkRG93bihpc0RyaWxsZWREb3duKTsKLSAgICBnZXRDb250ZW50cygpLnJlZnJlc2goKTsKLSAgfQotICAKLSAgcHVibGljIGNsYXNzIEFEVEZsb2F0aW5nVG9vbGJhck1vZGVsCi0gIHsKLSAgICBJTW9kZWwgbW9kZWw7Ci0gICAgcHVibGljIEFEVEZsb2F0aW5nVG9vbGJhck1vZGVsKElNb2RlbCBtb2RlbCkKLSAgICB7Ci0gICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICAgIHsKLSAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9CYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0Jhc2VHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzRlODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0Jhc2VHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotCi0vKioKLSAqIFRoaXMga2V5IGhhbmRsZXIgaXMgZGVzaWduZWQgdG8gYmUgcmUtdXNlZCBieSBib3RoIHRoZSBXU0RMIGFuZCBYU0QgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlciBleHRlbmRzIEdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIKLXsKLSAgcHVibGljIEJhc2VHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyKEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIpCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4ga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkKLSAgewotICAgIGludCBkaXJlY3Rpb24gPSAtMTsKLSAgICBib29sZWFuIGlzQWx0RG93biA9IChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQUxUKSAhPSAwOwotICAgIGJvb2xlYW4gaXNDdHJsRG93biA9IChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgIT0gMDsKLSAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpCi0gICAgewotICAgICAgY2FzZSBTV1QuQVJST1dfTEVGVCA6IHsKLSAgICAgICAgZGlyZWN0aW9uID0gUG9zaXRpb25Db25zdGFudHMuV0VTVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFNXVC5BUlJPV19SSUdIVCA6IHsKLSAgICAgICAgZGlyZWN0aW9uID0gUG9zaXRpb25Db25zdGFudHMuRUFTVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFNXVC5BUlJPV19VUCA6IHsKLSAgICAgICAgZGlyZWN0aW9uID0gaXNBbHREb3duID8gS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5PVVRfVE9fUEFSRU5UIDogUG9zaXRpb25Db25zdGFudHMuTk9SVEg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTV1QuQVJST1dfRE9XTiA6IHsKLSAgICAJIGRpcmVjdGlvbiA9IGlzQWx0RG93biA/IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuSU5fVE9fRklSU1RfQ0hJTEQgOiBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDsgICAgICAgCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoZGlyZWN0aW9uICE9IC0xKQotICAgIHsKLSAgICAgIEdyYXBoaWNhbEVkaXRQYXJ0IGZvY3VzRWRpdFBhcnQgPSBnZXRGb2N1c0VkaXRQYXJ0KCk7Ci0gICAgICBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5IHBvbGljeSA9IChLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5KWZvY3VzRWRpdFBhcnQuZ2V0RWRpdFBvbGljeShLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LktFWSk7Ci0gICAgICAKLSAgICAgIGlmIChwb2xpY3kgIT0gbnVsbCkgICAgICAgICAgCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IHRhcmdldCA9IHBvbGljeS5nZXRSZWxhdGl2ZUVkaXRQYXJ0KGZvY3VzRWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAJaWYoaXNDdHJsRG93bikgewotCi0gICAgICAgIAkJSUVkaXRvclBhcnQgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIAkJCSBPYmplY3Qga2V5Ym9hcmREcmFnID0gZWRpdG9yLmdldEFkYXB0ZXIoSUtleWJvYXJkRHJhZy5jbGFzcyk7Ci0gICAgICAgIAkJCSBpZiAoa2V5Ym9hcmREcmFnIGluc3RhbmNlb2YgSUtleWJvYXJkRHJhZykgewotICAgICAgICAJCQkJICgoSUtleWJvYXJkRHJhZykga2V5Ym9hcmREcmFnKS5wZXJmb3JtS2V5Ym9hcmREcmFnKGZvY3VzRWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgICAgIAkJCQkgcmV0dXJuIHRydWU7Ci0gICAgICAgIAkJIH0KLSAgICAgICAgCX0KLSAgICAgICAgCWVsc2UgewotICAgICAgICAgICAgICAgIG5hdmlnYXRlVG8odGFyZ2V0LCBldmVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0gICAgICAgICAgCi0gICAgICB9ICAgICAgICAgCi0gICAgfQotICAgIAotICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkKLSAgICB7Ci0gICAgICBjYXNlIFNXVC5QQUdFX0RPV04gOgotICAgICAgeyAgCi0gICAgICAgIGlmIChzY3JvbGxQYWdlKGV2ZW50LCBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9ICAKLSAgICAgIGNhc2UgU1dULlBBR0VfVVAgOgotICAgICAgeyAgCi0gICAgICAgIGlmIChzY3JvbGxQYWdlKGV2ZW50LCBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXNlIFNXVC5GMyA6Ci0gICAgICBjYXNlIFNXVC5DUiA6Ci0gICAgICB7Ci0gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IChBY3Rpb25SZWdpc3RyeSkgZWRpdG9yUGFydC5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgICAgICAgaWYgKHJlZ2lzdHJ5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8qCi0gICAgICBjYXNlIFNXVC5GNSA6Ci0gICAgICB7Ci0gICAgICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEVkaXRvck1vZGVNYW5hZ2VyIG1hbmFnZXIgPSAoRWRpdG9yTW9kZU1hbmFnZXIpcGFydC5nZXRBZGFwdGVyKEVkaXRvck1vZGVNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgICBFZGl0b3JNb2RlW10gbW9kZXMgPSBtYW5hZ2VyLmdldE1vZGVzKCk7Ci0gICAgICAgICAgRWRpdG9yTW9kZSBtb2RlID0gbWFuYWdlci5nZXRDdXJyZW50TW9kZSgpOwotICAgICAgICAgIExpc3QgbGlzdCA9IEFycmF5cy5hc0xpc3QobW9kZXMpOwotICAgICAgICAgIGludCBpbmRleCA9IGxpc3QuaW5kZXhPZihtb2RlKTsKLSAgICAgICAgICBpbnQgbmV4dEluZGV4ID0gaW5kZXggKyAxOwotICAgICAgICAgIGlmIChuZXh0SW5kZXggPCBtb2Rlcy5sZW5ndGgpCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9kZSA9IChFZGl0b3JNb2RlKWxpc3QuZ2V0KG5leHRJbmRleCk7Ci0gICAgICAgICAgfSAgCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUgPSAoRWRpdG9yTW9kZSlsaXN0LmdldCgwKTsgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1vZGUgIT0gbWFuYWdlci5nZXRDdXJyZW50TW9kZSgpKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgbWFuYWdlci5zZXRDdXJyZW50TW9kZShtb2RlKTsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSovICAgICAgCi0gICAgfQotICAgIHJldHVybiBzdXBlci5rZXlQcmVzc2VkKGV2ZW50KTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBzY3JvbGxQYWdlKEtleUV2ZW50IGV2ZW50LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgaWYgKCEoZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgRmlndXJlQ2FudmFzKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBGaWd1cmVDYW52YXMgZmlnQ2FudmFzID0gKEZpZ3VyZUNhbnZhcykgZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotICAgIFBvaW50IGxvYyA9IGZpZ0NhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgIFJlY3RhbmdsZSBhcmVhID0gZmlnQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0Q2xpZW50QXJlYShSZWN0YW5nbGUuU0lOR0xFVE9OKS5zY2FsZSguOCk7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICB7Ci0gICAgICBmaWdDYW52YXMuc2Nyb2xsVG9ZKGxvYy55IC0gYXJlYS5oZWlnaHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmlnQ2FudmFzLnNjcm9sbFRvWShsb2MueSArIGFyZWEuaGVpZ2h0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWIwNDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkNvbnRleHRNZW51UGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkVkaXRvck1vZGVNYW5hZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIENvbnRleHRNZW51UHJvdmlkZXIKLXsKLSAgSUVkaXRvclBhcnQgZWRpdG9yOyAgCi0gIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEdyYXBoQ29udGV4dE1lbnVQcm92aWRlci4KLSAgICogCi0gICAqIEBwYXJhbSBzZWxlY3Rpb25Qcm92aWRlcgotICAgKiBAcGFyYW0gZWRpdG9yCi0gICAqLwotICBwdWJsaWMgRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIoSUVkaXRvclBhcnQgZWRpdG9yLCBFZGl0UGFydFZpZXdlciB2aWV3ZXIsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHN1cGVyKHZpZXdlcik7Ci0gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gICAgdGhpcy5zZWxlY3Rpb25Qcm92aWRlciA9IHNlbGVjdGlvblByb3ZpZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkNvbnRleHRNZW51UHJvdmlkZXIjYnVpbGRDb250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyLAotICAgKiAgICAgIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGJ1aWxkQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpCi0gIHsKLSAgICBJTWVudU1hbmFnZXIgY3VycmVudE1lbnUgPSBtZW51OwotICAgIAotICAgIEVkaXRvck1vZGVNYW5hZ2VyIG1hbmFnZXIgPSAoRWRpdG9yTW9kZU1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpOwotICAgIENvbnRleHRNZW51UGFydGljaXBhbnQgY29udGV4dE1lbnVQYXJ0aWNpcGFudCA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuZ2V0Q3VycmVudE1vZGUoKS5nZXRDb250ZXh0TWVudVBhcnRpY2lwYW50KCkgOiBudWxsOwotICAgIAotICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEVkaXRvckFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgCi0gICAgICAvLyBDb252ZXJ0IGVkaXRwYXJ0cyB0byBtb2RlbCBvYmplY3RzIGFzIHNlbGVjdGlvbnMgCi0gICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0ZWRPYmplY3QgPSAoKEVkaXRQYXJ0KXNlbGVjdGVkT2JqZWN0KS5nZXRNb2RlbCgpOwotICAgICAgfQotCi0gICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQWN0aW9uUHJvdmlkZXIpCi0gICAgICB7Ci0gICAgICAgIElBY3Rpb25Qcm92aWRlciBhY3Rpb25Qcm92aWRlciA9IChJQWN0aW9uUHJvdmlkZXIpIHNlbGVjdGVkT2JqZWN0OwotCi0gICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSBhY3Rpb25Qcm92aWRlci5nZXRBY3Rpb25zKG51bGwpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgaWQgPSBhY3Rpb25zW2ldOwotICAgICAgICAgIGlmIChjb250ZXh0TWVudVBhcnRpY2lwYW50ID09IG51bGwgfHwgY29udGV4dE1lbnVQYXJ0aWNpcGFudC5pc0FwcGxpY2FibGUoc2VsZWN0ZWRPYmplY3QsIGlkKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGlkLnN1YnN0cmluZyhCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQubGVuZ3RoKCkpOwotICAgICAgICAgICAgICBJTWVudU1hbmFnZXIgc3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcih0ZXh0KTsKLSAgICAgICAgICAgICAgY3VycmVudE1lbnUuYWRkKHN1Yk1lbnUpOwotICAgICAgICAgICAgICBjdXJyZW50TWVudSA9IHN1Yk1lbnU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpZC5zdGFydHNXaXRoKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9FTkRfSUQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjdXJyZW50TWVudSA9IGdldFBhcmVudE1lbnUobWVudSwgY3VycmVudE1lbnUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaWQuZXF1YWxzKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY3VycmVudE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKGlkKTsKLSAgICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgIGFjdGlvbi5pc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50TWVudS5hZGQoYWN0aW9uKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOyAgICAgICAKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigicmVmYWN0b3Jpbmctc2xvdCIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsgICAgICAgCi0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInNlYXJjaC1zbG90IikpOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgfQotICAgIH0gICAgCi0gICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAvL21lbnUuYWRkKHJlZ2lzdHJ5LmdldEFjdGlvbigib3JnLmVjbGlwc2Uud3N0LnhzZC5EZWxldGVBY3Rpb24iKSk7Ci0gICAgLy9tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgIC8vU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uIHNob3dQcm9wZXJ0aWVzQWN0aW9uID0gKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbikgcmVnaXN0cnkuZ2V0QWN0aW9uKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5BQ1RJT05fSUQpOwotICAgIC8vc2hvd1Byb3BlcnRpZXNBY3Rpb24uc2V0UGFnZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKSk7Ci0gICAgLy9tZW51LmFkZChzaG93UHJvcGVydGllc0FjdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGdldFBhcmVudE1lbnUoSU1lbnVNYW5hZ2VyIHJvb3QsIElNZW51TWFuYWdlciBjaGlsZCkgewotICAgIElNZW51TWFuYWdlciBwYXJlbnQgPSBudWxsOwotICAgIAotICAgIElDb250cmlidXRpb25JdGVtW10ga2lkcyA9IHJvb3QuZ2V0SXRlbXMoKTsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlIChpbmRleCA8IGtpZHMubGVuZ3RoICYmIHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0ga2lkc1tpbmRleF07Ci0gICAgICBpZiAoaXRlbS5lcXVhbHMoY2hpbGQpKSB7Ci0gICAgICAgIHBhcmVudCA9IHJvb3Q7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKLSAgICAgICAgICBwYXJlbnQgPSBnZXRQYXJlbnRNZW51KChJTWVudU1hbmFnZXIpIGl0ZW0sIGNoaWxkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZXgrKzsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIHByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gKEFjdGlvblJlZ2lzdHJ5KSBlZGl0b3IuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gIH0KLSAgcHJvdGVjdGVkIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0KLSAgcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKQotICB7Ci0gICAgaWYgKGNvbW1hbmRTdGFjayA9PSBudWxsKQotICAgICAgY29tbWFuZFN0YWNrID0gZ2V0Vmlld2VyKCkuZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotICAgIHJldHVybiBjb21tYW5kU3RhY2s7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjlhNWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLklIb2xkZXJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlJvb3RDb250ZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TdHJ1Y3R1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JTW9kZWxQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQ29tbW9uU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5BRFRDb250ZW50T3V0bGluZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyIGV4dGVuZHMgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQURUU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIgPSBuZXcgQURUU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0gIHByb3RlY3RlZCBJbnB1dENoYW5nZU1hbmFnZXIgaW5wdXRDaGFuZ2VNYW5hZ2VyID0gbmV3IElucHV0Q2hhbmdlTWFuYWdlcigpOwotICBwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0KLSAgcHVibGljIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIoSUVkaXRvclBhcnQgZWRpdG9yLCBDb21tb25TZWxlY3Rpb25NYW5hZ2VyIG1hbmFnZXIpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvcjsKLSAgICBzZXRDb250ZXh0TWVudShuZXcgRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIoZWRpdG9yLCB0aGlzLCB0aGlzKSk7Ci0gICAgZWRpdG9yLmdldEVkaXRvclNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KCJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnBvcHVwLmdyYXBoIiwgZ2V0Q29udGV4dE1lbnUoKSwgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLy8gbWFrZSB0aGUgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciBsaXN0ZW4gdG8gZ3JhcGggdmlldyBzZWxlY3Rpb24gY2hhbmdlcwotICAgIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyKTsgICAgCi0gICAgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobWFuYWdlcik7Ci0gICAgbWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7ICAKLSAgICAKLSAgICBzZXRLZXlIYW5kbGVyKG5ldyBCYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlcih0aGlzKSk7ICAgIAotICB9Ci0gIAotICAKLSAgLy8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gc29tZXRoaW5nIGNoYW5nZXMgaW4gdGhlIHNlbGVjdGlvbiBtYW5hZ2VyCi0gIC8vIChlLmcuIGEgc2VsZWN0aW9uIG9jY3VyZWQgZnJvbSBhbm90aGVyIHZpZXcpCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgCi0gICAgLy8gVE9ETyAoY3MpIEl0IHNlZW1zIGxpa2UgdGhlcmUncyB3YXkgbW9yZSBzZWxlY3Rpb24gZ29pbmcgb24gdGhhbiB0aGVyZQotICAgIC8vIHNob3VsZAotICAgIC8vIGJlISEgVGhlcmUncyBhdCBsZWFzdCAyIHNlbGVjdGlvbnMgZ2V0dGluZyBmaXJlZCB3aGVuIHNvbWV0aGluZyBpcwotICAgIC8vIHNlbGVjdGVkIGluIHRoZQotICAgIC8vIG91dGxpbmUgdmlldy4gQXJlIHdlIGxpc3RlbmluZyB0byB0b28gbWFueSB0aGluZ3M/Ci0gICAgLy8KLSAgICAvLyBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBRFRDb250ZW50T3V0bGluZVBhZ2UpCi0gICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpICE9IGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpCi0gICAgewotICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkgJiYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQURUQ29udGVudE91dGxpbmVQYWdlKSkgfHwKLSAgICAgICAgICAgICghKGdldElucHV0KCkgaW5zdGFuY2VvZiBJTW9kZWwpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KSAmJiAoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmlzRm9jdXNBbGxvd2VkKCkpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2V0SW5wdXQoKElTdHJ1Y3R1cmUpc2VsZWN0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbigoSVN0cnVjdHVyZSlzZWxlY3RlZE9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmlzRm9jdXNBbGxvd2VkKCkgJiYgKChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFEVENvbnRlbnRPdXRsaW5lUGFnZSkpKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24oKElBRFRPYmplY3Qpc2VsZWN0ZWRPYmplY3QpOyAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKChJR3JhcGhFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5pc0ZvY3VzQWxsb3dlZCgpIAotICAgICAgICAgICAgJiYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyICYmICEoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkpKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0SW5wdXQoKElBRFRPYmplY3Qpc2VsZWN0ZWRPYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCEoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmlzRm9jdXNBbGxvd2VkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBXZSBlbmNvdW50ZXJlZCBhbiBvYmplY3QgdGhhdCBpcyBub3QgYSB2YWxpZCBpbnB1dCB0byB0aGUgZ3JhcGggdmlld2VyCi0gICAgICAgICAgLy8gTm93IGZpbmQgdGhlIHRvcCBjb250YWluZXIgdGhhdCBjYW4gYmUgYSB2YWxpZCBpbnB1dAotICAgICAgICAgIElBRFRPYmplY3Qgb2JqID0gKChJR3JhcGhFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5nZXRUb3BDb250YWluZXIoKTsKLSAgICAgICAgICBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBRFRDb250ZW50T3V0bGluZVBhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZiB0aGUgc2VsZWN0aW9uIGlzIG9yaWdpbmF0ZWQgZnJvbSB0aGUgb3V0bGluZSwgd2Ugc2hvdWxkIAotICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBpbnB1dHMKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24ob2JqKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBDb21tb25TZWxlY3Rpb25NYW5hZ2VyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWYgdGhlIHNlbGVjdGlvbiBpcyBvcmlnaW5hdGVkIGZyb20gc29tZSBhY3Rpb24sIGllLiBhZGRpbmcKLSAgICAgICAgICAgIC8vIGEgbmV3IGVsZW1lbnQsIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGlucHV0IG9ubHkgaWYgdGhlIGN1cnJlbnQgaW5wdXQgaXMgdGhlIG1vZGVsCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlucHV0cyB3aWxsIGNoYW5nZSB1bmV4cGVjdGVkbHkhIQotICAgICAgICAgICAgaWYgKGdldElucHV0KCkgaW5zdGFuY2VvZiBJTW9kZWwpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAob2JqICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2V0SW5wdXQgKG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGlmIHRoZSBzZWxlY3Rpb24gaXMgb3JpZ2luYXRlZCBmcm9tIHRoZSBzb3VyY2Ugdmlld2VyCi0gICAgICAgICAgICAvLyB3ZSBzaG91bGQgY2hhbmdlIHRoZSBpbnB1dCByZWdhcmRsZXNzLiAgVGVzdCBpcyBmb3IgbXVsdGlwbGUgbGV2ZWxzCi0gICAgICAgICAgICAvLyBvZiBhbm9ueW1vdXMgdHlwZXMKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgc2V0SW5wdXQgKG9iaik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2JqICE9IG51bGwgJiYgZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkKLSAgICAgICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24ob2JqKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUZpZWxkKSAKLSAgICAgICAgewotICAgICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgICAgaWYgKCAoIWZpZWxkLmlzR2xvYmFsKCkgJiYgZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkgfHwKLSAgICAgICAgICAgICAgICghZmllbGQuaXNHbG9iYWwoKSAmJiAhKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQ29tbW9uU2VsZWN0aW9uTWFuYWdlcikpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElBRFRPYmplY3Qgb2JqID0gKChJR3JhcGhFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5nZXRUb3BDb250YWluZXIoKTsKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24ob2JqKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoZmllbGQuaXNHbG9iYWwoKSAmJiAhKGdldElucHV0KCkgaW5zdGFuY2VvZiBJTW9kZWwpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlciApCi0gICAgICAgICAgICAgIHNldElucHV0KGZpZWxkKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24oZmllbGQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgICB7Ci0gICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgIGlmICggKGZpZWxkLmlzR2xvYmFsKCkgJiYgKGdldElucHV0KCkgaW5zdGFuY2VvZiBJTW9kZWwpICYmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFEVENvbnRlbnRPdXRsaW5lUGFnZSkpIHx8Ci0gICAgICAgICAgICAoIChmaWVsZC5pc0dsb2JhbCgpICYmICEoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkpKSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24oZmllbGQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElNb2RlbFByb3h5KQotICAgICAgewotICAgICAgICBJTW9kZWxQcm94eSBhZGFwdGVyID0gKElNb2RlbFByb3h5KXNlbGVjdGVkT2JqZWN0OwotICAgICAgICBpZiAoZ2V0SW5wdXQoKSAhPSBhZGFwdGVyLmdldE1vZGVsKCkpCi0gICAgICAgICAgIHNldElucHV0KGFkYXB0ZXIuZ2V0TW9kZWwoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElNb2RlbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGdldElucHV0KCkgIT0gc2VsZWN0ZWRPYmplY3QpCi0gICAgICAgICAgc2V0SW5wdXQoKElNb2RlbClzZWxlY3RlZE9iamVjdCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQoZ2V0Um9vdEVkaXRQYXJ0KCksIHNlbGVjdGVkT2JqZWN0KTsKLSAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdFBhcnQpKTsKLSAgICAgICAgc2V0Rm9jdXMoZWRpdFBhcnQpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLyoKLSAgICogV2UgbmVlZCB0byBjb252ZXJ0IGZyb20gZWRpdCBwYXJ0IHNlbGVjdGlvbnMgdG8gbW9kZWwgb2JqZWN0IHNlbGVjdGlvbnMKLSAgICovCi0gIGNsYXNzIEFEVFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGkubmV4dCgpOwotICAgICAgICBsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RydWN0dXJlZFNlbGVjdGlvbiBjb252ZXJ0U2VsZWN0aW9uRnJvbUVkaXRQYXJ0VG9Nb2RlbChJU2VsZWN0aW9uIGVkaXRQYXJ0U2VsZWN0aW9uKQotICAgIHsKLSAgICAgIExpc3Qgc2VsZWN0ZWRNb2RlbE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBpZiAoZWRpdFBhcnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZWRpdFBhcnRTZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgICAgICBPYmplY3QgbW9kZWwgPSBudWxsOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgb2JqOwotICAgICAgICAgICAgbW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3RlZE1vZGVsT2JqZWN0TGlzdC5hZGQobW9kZWwpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGVkTW9kZWxPYmplY3RMaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gICAgewotICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24gPSBjb252ZXJ0U2VsZWN0aW9uRnJvbUVkaXRQYXJ0VG9Nb2RlbChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICB0aGlzLnNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLSAgICAgIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBuZXdFdmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgbmV3U2VsZWN0aW9uKTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhuZXdFdmVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZ2V0RWRpdFBhcnQoRWRpdFBhcnQgcGFyZW50LCBPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgPT0gb2JqZWN0ICYmICEoZWRpdFBhcnQgaW5zdGFuY2VvZiBJSG9sZGVyRWRpdFBhcnQpICYmICEoZWRpdFBhcnQgaW5zdGFuY2VvZiBSb290Q29udGVudEVkaXRQYXJ0KSkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSBlZGl0UGFydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAKLSAgCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEVkaXRQYXJ0KChFZGl0UGFydClpLm5leHQoKSwgb2JqZWN0KTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24KLSAgICAgICAgICBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiB0aGVuIHdlIHdpbGwgdHJ5IHRvIHNlbGVjdCAKLSAgICAgICAgICAvLyB0aGUgdGFyZ2V0IGVkaXQgcGFydCB0aGF0IGlzIG9uZSBvZiBpdHMgY2hpbGRyZW4KLSAgICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IHdoZW4geW91IGFkZCBhbiBlbGVtZW50IHRvIGEgc3RydWN0dXJlZCBlZGl0IHBhcnQKLSAgICAgICAgICAvLyB0aGVuIHlvdSB3YW50IHRvIHNlbGVjdCB0aGUgZWxlbWVudCBpbW1lZGlhdGVseSBhbmQgcHV0IGl0IGluCi0gICAgICAgICAgLy8gZGlyZWN0IGVkaXQgbW9kZQotICAgICAgICAgIGlmIChjdXJyZW50U2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFZGl0UGFydCB0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydCA9IChFZGl0UGFydCkoKFN0cnVjdHVyZWRTZWxlY3Rpb24pY3VycmVudFNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgIGlmICh0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldFN0cnVjdHVyZUVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFN0cnVjdHVyZUVkaXRQYXJ0IGluc3RhbmNlb2YgU3RydWN0dXJlRWRpdFBhcnQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RydWN0dXJlRWRpdFBhcnQgPSB0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgRWRpdFBhcnQgcG90ZW50aWFsRWRpdFBhcnRUb1NlbGVjdCA9IGVkaXRQYXJ0OwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgd2hpbGUgKHBvdGVudGlhbEVkaXRQYXJ0VG9TZWxlY3QgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwb3RlbnRpYWxFZGl0UGFydFRvU2VsZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlRWRpdFBhcnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvdGVudGlhbEVkaXRQYXJ0VG9TZWxlY3QgPSBwb3RlbnRpYWxFZGl0UGFydFRvU2VsZWN0LmdldFBhcmVudCgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIHBvdGVudGlhbCBlZGl0IHBhcnQgdG8gc2VsZWN0IHRoZW4gcmV0dXJuIGl0Ci0gICAgICAgICAgICAgIC8vIE9SLCBpZiB0aGVyZSBpcyBubyB0YXJnZXQgZm91bmQsIHRoZW4gd2Ugc2hvdWxkIGp1c3QgcmV0dXJuCi0gICAgICAgICAgICAgIC8vIHRoZSBlZGl0IHBhcnQgd2UgZm91bmQKLSAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbEVkaXRQYXJ0VG9TZWxlY3QgPT0gdGFyZ2V0U3RydWN0dXJlRWRpdFBhcnQgfHwgcG90ZW50aWFsRWRpdFBhcnRUb1NlbGVjdCA9PSBudWxsIHx8IHRhcmdldFN0cnVjdHVyZUVkaXRQYXJ0ID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBlZGl0UGFydDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIC8vIE90aGVyd2lzZSBqdXN0IGZpbmQgdGhlIGZpcnN0IG9uZSBhbmQgcmV0dXJuCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0QW5kTWFya0xvY2F0aW9uKElBRFRPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgSUFEVE9iamVjdCBvbGRJbnB1dCA9IGdldElucHV0KCk7ICAgIAotICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwgJiYgb2xkSW5wdXQgIT0gb2JqZWN0KQotICAgIHsgICAgICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXROYXZpZ2F0aW9uSGlzdG9yeSgpLm1hcmtMb2NhdGlvbihlZGl0b3JQYXJ0KTsKLSAgICB9ICAKLSAgICBzZXRJbnB1dChvYmplY3QpOwotCi0gICAgaWYgKGVkaXRvclBhcnQgIT0gbnVsbCAmJiBvbGRJbnB1dCAhPSBvYmplY3QpCi0gICAgewotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0TmF2aWdhdGlvbkhpc3RvcnkoKS5tYXJrTG9jYXRpb24oZWRpdG9yUGFydCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJQURUT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdENvbnRlbnRFZGl0UGFydCA9IChSb290Q29udGVudEVkaXRQYXJ0KWdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7Ci0gICAgcm9vdENvbnRlbnRFZGl0UGFydC5zZXRNb2RlbChvYmplY3QpOwotICAgIHJvb3RDb250ZW50RWRpdFBhcnQucmVmcmVzaCgpOwotCi0gICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgIHsgIAotICAgICAgaW5wdXRDaGFuZ2VNYW5hZ2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpKTsKLSAgICB9Ci0gICAgLy8gU2VsZWN0IHRoZSBlZGl0cGFydCB3aGVuIGl0IGlzIHNldCBhcyBpbnB1dAotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQocm9vdENvbnRlbnRFZGl0UGFydCwgb2JqZWN0KTsKLSAgICBpZiAoZWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgIHNlbGVjdChlZGl0UGFydCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdENvbnRlbnRFZGl0UGFydCA9IChSb290Q29udGVudEVkaXRQYXJ0KWdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7ICAgIAotICAgIHJldHVybiAoSUFEVE9iamVjdClyb290Q29udGVudEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBnZXRJbnB1dEVkaXRQYXJ0KCkKLSAgewotICAgIHJldHVybiBnZXRSb290RWRpdFBhcnQoKS5nZXRDb250ZW50cygpOyAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkSW5wdXRDaGFuZ2RMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgaW5wdXRDaGFuZ2VNYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUlucHV0Q2hhbmdkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGlucHV0Q2hhbmdlTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOyAgICAKLSAgfSAgCi0gIAotICAKLSAgcHJpdmF0ZSBjbGFzcyBJbnB1dENoYW5nZU1hbmFnZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLSAgewotICAgIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICAgIHsgIAotICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gICAgeyAgIAotICAgICAgLy8gbm8gb25lIHNob3VsZCBiZSBjYWxsaW5nIHRoaXMgbWV0aG9kICAgICAKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgICB7IAotICAgICAgbm90aWZ5TGlzdGVuZXJzKHNlbGVjdGlvbik7Ci0gICAgfQotCi0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChsaXN0ZW5lcnMpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLSAgICAgIH0gIAotICAgIH0gICAgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRlMGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgaW50ZXJmYWNlIERlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTEVEX0hBTkRMRV9MQVlFUiA9ICJTY2FsZWQgSGFuZGxlIExheWVyIjsgLy8kTk9OLU5MUy0xJCAgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbnQgIHNtYWxsRm9udCA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAiVGFob21hIiwgNiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRmxhdENDb21iby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0ZsYXRDQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2ZDUxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRmxhdENDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlR5cGVkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIFRoZSBDQ29tYm8gY2xhc3MgcmVwcmVzZW50cyBhIHNlbGVjdGFibGUgdXNlciBpbnRlcmZhY2Ugb2JqZWN0Ci0gKiB0aGF0IGNvbWJpbmVzIGEgdGV4dCBmaWVsZCBhbmQgYSBsaXN0IGFuZCBpc3N1ZXMgbm90aWZpY2F0aW9uCi0gKiB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgZnJvbSB0aGUgbGlzdC4KLSAqIDxwPgotICogTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LAotICogaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBhZGQgY2hpbGRyZW4gdG8gaXQsIG9yIHNldCBhIGxheW91dCBvbiBpdC4KLSAqIDwvcD4KLSAqIDxkbD4KLSAqIDxkdD48Yj5TdHlsZXM6PC9iPgotICogPGRkPkJPUkRFUiwgUkVBRF9PTkxZLCBGTEFUPC9kZD4KLSAqIDxkdD48Yj5FdmVudHM6PC9iPgotICogPGRkPlNlbGVjdGlvbjwvZGQ+Ci0gKiA8L2RsPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmxhdENDb21ibyBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLSAgVGV4dCB0ZXh0OwotICBMaXN0IGxpc3Q7Ci0gIGludCB2aXNpYmxlSXRlbUNvdW50ID0gNTsKLSAgU2hlbGwgcG9wdXA7Ci0gIExhYmVsIGFycm93OwotICBib29sZWFuIGhhc0ZvY3VzOwotICBMaXN0ZW5lciBsaXN0ZW5lciwgZmlsdGVyOwotICBDb2xvciBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kOwotICBGb250IGZvbnQ7Ci0gIAotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAotICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0gKiA8cD4KLSAqIFRoZSBzdHlsZSB2YWx1ZSBpcyBlaXRoZXIgb25lIG9mIHRoZSBzdHlsZSBjb25zdGFudHMgZGVmaW5lZCBpbgotICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAKLSAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCi0gKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgotICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHBhcmVudDwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgU1dUI0JPUkRFUgotICogQHNlZSBTV1QjUkVBRF9PTkxZCi0gKiBAc2VlIFNXVCNGTEFUCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNnZXRTdHlsZSgpCi0gKi8KLXB1YmxpYyBGbGF0Q0NvbWJvIChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgc3VwZXIgKHBhcmVudCwgc3R5bGUgPSBjaGVja1N0eWxlIChzdHlsZSkpOwotICAKLSAgaW50IHRleHRTdHlsZSA9IFNXVC5TSU5HTEU7Ci0gIGlmICgoc3R5bGUgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKSB0ZXh0U3R5bGUgfD0gU1dULlJFQURfT05MWTsKLSAgaWYgKChzdHlsZSAmIFNXVC5GTEFUKSAhPSAwKSB0ZXh0U3R5bGUgfD0gU1dULkZMQVQ7Ci0gIHRleHQgPSBuZXcgVGV4dCAodGhpcywgdGV4dFN0eWxlKTsKLSAgaW50IGFycm93U3R5bGUgPSBTV1QuQVJST1cgfCBTV1QuRE9XTjsKLSAgaWYgKChzdHlsZSAmIFNXVC5GTEFUKSAhPSAwKSBhcnJvd1N0eWxlIHw9IFNXVC5GTEFUOwotICBhcnJvdyA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuRkxBVCk7Ci0gIGFycm93LnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvVHJpYW5nbGVUb29sQmFyLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0gIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgICAgIGlmIChwb3B1cCA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgcG9wdXBFdmVudCAoZXZlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAodGV4dCA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgdGV4dEV2ZW50IChldmVudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChsaXN0ID09IGV2ZW50LndpZGdldCkgewotICAgICAgICBsaXN0RXZlbnQgKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGFycm93ID09IGV2ZW50LndpZGdldCkgewotICAgICAgICBhcnJvd0V2ZW50IChldmVudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChGbGF0Q0NvbWJvLnRoaXMgPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICAgIGNvbWJvRXZlbnQgKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGdldFNoZWxsICgpID09IGV2ZW50LndpZGdldCkgewotICAgICAgICBoYW5kbGVGb2N1cyAoU1dULkZvY3VzT3V0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0gIGZpbHRlciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgU2hlbGwgc2hlbGwgPSAoKENvbnRyb2wpZXZlbnQud2lkZ2V0KS5nZXRTaGVsbCAoKTsKLSAgICAgIGlmIChzaGVsbCA9PSBGbGF0Q0NvbWJvLnRoaXMuZ2V0U2hlbGwgKCkpIHsKLSAgICAgICAgaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c091dCk7Ci0gICAgICB9Ci0gICAgfQotICB9OwotICAKLSAgaW50IFtdIGNvbWJvRXZlbnRzID0ge1NXVC5EaXNwb3NlLCBTV1QuTW92ZSwgU1dULlJlc2l6ZX07Ci0gIGZvciAoaW50IGk9MDsgaTxjb21ib0V2ZW50cy5sZW5ndGg7IGkrKykgdGhpcy5hZGRMaXN0ZW5lciAoY29tYm9FdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0gIAotICBpbnQgW10gdGV4dEV2ZW50cyA9IHtTV1QuS2V5RG93biwgU1dULktleVVwLCBTV1QuTWVudURldGVjdCwgU1dULk1vZGlmeSwgU1dULk1vdXNlRG93biwgU1dULk1vdXNlVXAsIFNXVC5UcmF2ZXJzZSwgU1dULkZvY3VzSW59OwotICBmb3IgKGludCBpPTA7IGk8dGV4dEV2ZW50cy5sZW5ndGg7IGkrKykgdGV4dC5hZGRMaXN0ZW5lciAodGV4dEV2ZW50cyBbaV0sIGxpc3RlbmVyKTsKLSAgCi0gIGludCBbXSBhcnJvd0V2ZW50cyA9IHtTV1QuTW91c2VEb3duLCBTV1QuU2VsZWN0aW9uLCBTV1QuRm9jdXNJbn07Ci0gIGZvciAoaW50IGk9MDsgaTxhcnJvd0V2ZW50cy5sZW5ndGg7IGkrKykgYXJyb3cuYWRkTGlzdGVuZXIgKGFycm93RXZlbnRzIFtpXSwgbGlzdGVuZXIpOwotICAKLSAgY3JlYXRlUG9wdXAobnVsbCwgLTEpOwotICBpbml0QWNjZXNzaWJsZSgpOwotfQotc3RhdGljIGludCBjaGVja1N0eWxlIChpbnQgc3R5bGUpIHsKLSAgaW50IG1hc2sgPSBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSB8IFNXVC5GTEFUIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuUklHSFRfVE9fTEVGVDsKLSAgcmV0dXJuIHN0eWxlICYgbWFzazsKLX0KLS8qKgotICogQWRkcyB0aGUgYXJndW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcmVjZWl2ZXIncyBsaXN0LgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIG5ldyBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSAjYWRkKFN0cmluZyxpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIGFkZCAoU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBsaXN0LmFkZCAoc3RyaW5nKTsKLX0KLS8qKgotICogQWRkcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyJ3MgbGlzdCBhdCB0aGUgZ2l2ZW4KLSAqIHplcm8tcmVsYXRpdmUgaW5kZXguCi0gKiA8cD4KLSAqIE5vdGU6IFRvIGFkZCBhbiBpdGVtIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIHVzZSB0aGUKLSAqIHJlc3VsdCBvZiBjYWxsaW5nIDxjb2RlPmdldEl0ZW1Db3VudCgpPC9jb2RlPiBhcyB0aGUKLSAqIGluZGV4IG9yIHVzZSA8Y29kZT5hZGQoU3RyaW5nKTwvY29kZT4uCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IGl0ZW0KLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAoaW5jbHVzaXZlKTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlICNhZGQoU3RyaW5nKQotICovCi1wdWJsaWMgdm9pZCBhZGQgKFN0cmluZyBzdHJpbmcsIGludCBpbmRleCkgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBsaXN0LmFkZCAoc3RyaW5nLCBpbmRleCk7Ci19Ci0vKioKLSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyB0ZXh0IGlzIG1vZGlmaWVkLCBieSBzZW5kaW5nCi0gKiBpdCBvbmUgb2YgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaW4gdGhlIDxjb2RlPk1vZGlmeUxpc3RlbmVyPC9jb2RlPgotICogaW50ZXJmYWNlLgotICoKLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlIE1vZGlmeUxpc3RlbmVyCi0gKiBAc2VlICNyZW1vdmVNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lciAoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBUeXBlZExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgVHlwZWRMaXN0ZW5lciAobGlzdGVuZXIpOwotICBhZGRMaXN0ZW5lciAoU1dULk1vZGlmeSwgdHlwZWRMaXN0ZW5lcik7Ci19Ci0vKioKLSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyBzZWxlY3Rpb24gY2hhbmdlcywgYnkgc2VuZGluZwotICogaXQgb25lIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lcjwvY29kZT4KLSAqIGludGVyZmFjZS4KLSAqIDxwPgotICogPGNvZGU+d2lkZ2V0U2VsZWN0ZWQ8L2NvZGU+IGlzIGNhbGxlZCB3aGVuIHRoZSBjb21ibydzIGxpc3Qgc2VsZWN0aW9uIGNoYW5nZXMuCi0gKiA8Y29kZT53aWRnZXREZWZhdWx0U2VsZWN0ZWQ8L2NvZGU+IGlzIHR5cGljYWxseSBjYWxsZWQgd2hlbiBFTlRFUiBpcyBwcmVzc2VkIHRoZSBjb21ibydzIHRleHQgYXJlYS4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lcgotICogQHNlZSAjcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotICovCi1wdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICBjaGVja1dpZGdldCgpOwotICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIFR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBUeXBlZExpc3RlbmVyIChsaXN0ZW5lcik7Ci0gIGFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLHR5cGVkTGlzdGVuZXIpOwotICBhZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sdHlwZWRMaXN0ZW5lcik7Ci19Ci12b2lkIGFycm93RXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgIGNhc2UgU1dULkZvY3VzSW46IHsKLSAgICAgIGhhbmRsZUZvY3VzIChTV1QuRm9jdXNJbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuU2VsZWN0aW9uOiB7Ci0gICAgICBkcm9wRG93biAoIWlzRHJvcHBlZCAoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTW91c2VEb3duOiB7Ci0gICAgICBkcm9wRG93biAoIWlzRHJvcHBlZCAoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLS8qKgotICogU2V0cyB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQgdG8gYW4gZW1wdHkKLSAqIHNlbGVjdGlvbiBzdGFydGluZyBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyLiBJZiB0aGUKLSAqIHRleHQgZmllbGQgaXMgZWRpdGFibGUsIHRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcGxhY2luZyB0aGUKLSAqIGktYmVhbSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQuCi0gKiA8cD4KLSAqIE5vdGU6IFRvIGNsZWFyIHRoZSBzZWxlY3RlZCBpdGVtcyBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LCAKLSAqIHVzZSA8Y29kZT5kZXNlbGVjdEFsbCgpPC9jb2RlPi4KLSAqIDwvcD4KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgI2Rlc2VsZWN0QWxsCi0gKi8KLXB1YmxpYyB2b2lkIGNsZWFyU2VsZWN0aW9uICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHRleHQuY2xlYXJTZWxlY3Rpb24gKCk7Ci0gIGxpc3QuZGVzZWxlY3RBbGwgKCk7Ci19Ci12b2lkIGNvbWJvRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgIGNhc2UgU1dULkRpc3Bvc2U6Ci0gICAgICBpZiAocG9wdXAgIT0gbnVsbCAmJiAhcG9wdXAuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBsaXN0LnJlbW92ZUxpc3RlbmVyIChTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotICAgICAgICBwb3B1cC5kaXNwb3NlICgpOwotICAgICAgfQotICAgICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCAoKTsKLSAgICAgIHNoZWxsLnJlbW92ZUxpc3RlbmVyIChTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLSAgICAgIGRpc3BsYXkucmVtb3ZlRmlsdGVyIChTV1QuRm9jdXNJbiwgZmlsdGVyKTsKLSAgICAgIHBvcHVwID0gbnVsbDsgIAotICAgICAgdGV4dCA9IG51bGw7ICAKLSAgICAgIGxpc3QgPSBudWxsOyAgCi0gICAgICBhcnJvdyA9IG51bGw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNXVC5Nb3ZlOgotICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULlJlc2l6ZToKLSAgICAgIGludGVybmFsTGF5b3V0IChmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1wdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUgKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0gIFN0cmluZ1tdIGl0ZW1zID0gbGlzdC5nZXRJdGVtcyAoKTsKLSAgaW50IHRleHRXaWR0aCA9IDA7Ci0gIEdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLSAgaW50IHNwYWNlciA9IGdjLnN0cmluZ0V4dGVudCAoIiAiKS54OyAvLyROT04tTkxTLTEkCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICB0ZXh0V2lkdGggPSBNYXRoLm1heCAoZ2Muc3RyaW5nRXh0ZW50IChpdGVtc1tpXSkueCwgdGV4dFdpZHRoKTsKLSAgfQotICBnYy5kaXNwb3NlKCk7Ci0gIFBvaW50IHRleHRTaXplID0gdGV4dC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsKLSAgLy8gUG9pbnQgYXJyb3dTaXplID0gYXJyb3cuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7Ci0gIFBvaW50IGFycm93U2l6ZSA9IG5ldyBQb2ludCgxNiwgMTYpOwotICBQb2ludCBsaXN0U2l6ZSA9IGxpc3QuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7Ci0gIGludCBib3JkZXJXaWR0aCA9IGdldEJvcmRlcldpZHRoICgpOwotICAKLSAgaGVpZ2h0ID0gTWF0aC5tYXggKHRleHRTaXplLnksIGFycm93U2l6ZS55KTsKLSAgd2lkdGggPSBNYXRoLm1heCAodGV4dFdpZHRoICsgMipzcGFjZXIgKyBhcnJvd1NpemUueCArIDIqYm9yZGVyV2lkdGgsIGxpc3RTaXplLngpOwotICBpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHdpZHRoID0gd0hpbnQ7Ci0gIGlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7Ci0gIHJldHVybiBuZXcgUG9pbnQgKHdpZHRoICsgMipib3JkZXJXaWR0aCwgaGVpZ2h0ICsgMipib3JkZXJXaWR0aCk7Ci19Ci12b2lkIGNyZWF0ZVBvcHVwKFN0cmluZ1tdIGl0ZW1zLCBpbnQgc2VsZWN0aW9uSW5kZXgpIHsgICAgCi0gICAgLy8gY3JlYXRlIHNoZWxsIGFuZCBsaXN0Ci0gICAgcG9wdXAgPSBuZXcgU2hlbGwgKGdldFNoZWxsICgpLCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotICAgIGludCBzdHlsZSA9IGdldFN0eWxlICgpOwotICAgIGludCBsaXN0U3R5bGUgPSBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMOwotICAgIGlmICgoc3R5bGUgJiBTV1QuRkxBVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5GTEFUOwotICAgIGlmICgoc3R5bGUgJiBTV1QuUklHSFRfVE9fTEVGVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5SSUdIVF9UT19MRUZUOwotICAgIGlmICgoc3R5bGUgJiBTV1QuTEVGVF9UT19SSUdIVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5MRUZUX1RPX1JJR0hUOwotICAgIGxpc3QgPSBuZXcgTGlzdCAocG9wdXAsIGxpc3RTdHlsZSk7Ci0gICAgaWYgKGZvbnQgIT0gbnVsbCkgbGlzdC5zZXRGb250IChmb250KTsKLSAgICBpZiAoZm9yZWdyb3VuZCAhPSBudWxsKSBsaXN0LnNldEZvcmVncm91bmQgKGZvcmVncm91bmQpOwotICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpIGxpc3Quc2V0QmFja2dyb3VuZCAoYmFja2dyb3VuZCk7Ci0gICAgCi0gICAgaW50IFtdIHBvcHVwRXZlbnRzID0ge1NXVC5DbG9zZSwgU1dULlBhaW50LCBTV1QuRGVhY3RpdmF0ZX07Ci0gICAgZm9yIChpbnQgaT0wOyBpPHBvcHVwRXZlbnRzLmxlbmd0aDsgaSsrKSBwb3B1cC5hZGRMaXN0ZW5lciAocG9wdXBFdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0gICAgaW50IFtdIGxpc3RFdmVudHMgPSB7U1dULk1vdXNlVXAsIFNXVC5TZWxlY3Rpb24sIFNXVC5UcmF2ZXJzZSwgU1dULktleURvd24sIFNXVC5LZXlVcCwgU1dULkZvY3VzSW4sIFNXVC5EaXNwb3NlfTsKLSAgICBmb3IgKGludCBpPTA7IGk8bGlzdEV2ZW50cy5sZW5ndGg7IGkrKykgbGlzdC5hZGRMaXN0ZW5lciAobGlzdEV2ZW50cyBbaV0sIGxpc3RlbmVyKTsKLSAgICAKLSAgICBpZiAoaXRlbXMgIT0gbnVsbCkgbGlzdC5zZXRJdGVtcyAoaXRlbXMpOwotICAgIGlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgbGlzdC5zZXRTZWxlY3Rpb24gKHNlbGVjdGlvbkluZGV4KTsKLX0KLS8qKgotICogRGVzZWxlY3RzIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiB6ZXJvLXJlbGF0aXZlIGluZGV4IGluIHRoZSByZWNlaXZlcidzIAotICogbGlzdC4gIElmIHRoZSBpdGVtIGF0IHRoZSBpbmRleCB3YXMgYWxyZWFkeSBkZXNlbGVjdGVkLCBpdCByZW1haW5zCi0gKiBkZXNlbGVjdGVkLiBJbmRpY2VzIHRoYXQgYXJlIG91dCBvZiByYW5nZSBhcmUgaWdub3JlZC4KLSAqCi0gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGRlc2VsZWN0Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgZGVzZWxlY3QgKGludCBpbmRleCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgbGlzdC5kZXNlbGVjdCAoaW5kZXgpOwotfQotLyoqCi0gKiBEZXNlbGVjdHMgYWxsIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gKiA8cD4KLSAqIE5vdGU6IFRvIGNsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCwKLSAqIHVzZSA8Y29kZT5jbGVhclNlbGVjdGlvbigpPC9jb2RlPi4KLSAqIDwvcD4KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgI2NsZWFyU2VsZWN0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGxpc3QuZGVzZWxlY3RBbGwgKCk7Ci19Ci12b2lkIGRyb3BEb3duIChib29sZWFuIGRyb3ApIHsKLSAgaWYgKGRyb3AgPT0gaXNEcm9wcGVkICgpKSByZXR1cm47Ci0gIGlmICghZHJvcCkgewotICAgIHBvcHVwLnNldFZpc2libGUgKGZhbHNlKTsKLSAgICBpZiAoIWlzRGlzcG9zZWQgKCkmJiBhcnJvdy5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0gICAgICB0ZXh0LnNldEZvY3VzKCk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChnZXRTaGVsbCgpICE9IHBvcHVwLmdldFBhcmVudCAoKSkgewotICAgIFN0cmluZ1tdIGl0ZW1zID0gbGlzdC5nZXRJdGVtcyAoKTsKLSAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotICAgIGxpc3QucmVtb3ZlTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0gICAgcG9wdXAuZGlzcG9zZSgpOwotICAgIHBvcHVwID0gbnVsbDsKLSAgICBsaXN0ID0gbnVsbDsKLSAgICBjcmVhdGVQb3B1cCAoaXRlbXMsIHNlbGVjdGlvbkluZGV4KTsKLSAgfQotICAKLSAgUG9pbnQgc2l6ZSA9IGdldFNpemUgKCk7Ci0gIGludCBpdGVtQ291bnQgPSBsaXN0LmdldEl0ZW1Db3VudCAoKTsKLSAgaXRlbUNvdW50ID0gKGl0ZW1Db3VudCA9PSAwKSA/IHZpc2libGVJdGVtQ291bnQgOiBNYXRoLm1pbih2aXNpYmxlSXRlbUNvdW50LCBpdGVtQ291bnQpOwotICBpbnQgaXRlbUhlaWdodCA9IGxpc3QuZ2V0SXRlbUhlaWdodCAoKSAqIGl0ZW1Db3VudDsKLSAgUG9pbnQgbGlzdFNpemUgPSBsaXN0LmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgaXRlbUhlaWdodCwgZmFsc2UpOwotICBsaXN0LnNldEJvdW5kcyAoMSwgMSwgTWF0aC5tYXggKHNpemUueCAtIDIsIGxpc3RTaXplLngpLCBsaXN0U2l6ZS55KTsKLSAgCi0gIGludCBpbmRleCA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gIGlmIChpbmRleCAhPSAtMSkgbGlzdC5zZXRUb3BJbmRleCAoaW5kZXgpOwotICBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5ICgpOwotICBSZWN0YW5nbGUgbGlzdFJlY3QgPSBsaXN0LmdldEJvdW5kcyAoKTsKLSAgUmVjdGFuZ2xlIHBhcmVudFJlY3QgPSBkaXNwbGF5Lm1hcCAoZ2V0UGFyZW50ICgpLCBudWxsLCBnZXRCb3VuZHMgKCkpOwotICBQb2ludCBjb21ib1NpemUgPSBnZXRTaXplICgpOwotICBSZWN0YW5nbGUgZGlzcGxheVJlY3QgPSBnZXRNb25pdG9yICgpLmdldENsaWVudEFyZWEgKCk7Ci0gIGludCB3aWR0aCA9IE1hdGgubWF4IChjb21ib1NpemUueCwgbGlzdFJlY3Qud2lkdGggKyAyKTsKLSAgaW50IGhlaWdodCA9IGxpc3RSZWN0LmhlaWdodCArIDI7Ci0gIGludCB4ID0gcGFyZW50UmVjdC54OwotICBpbnQgeSA9IHBhcmVudFJlY3QueSArIGNvbWJvU2l6ZS55OwotICBpZiAoeSArIGhlaWdodCA+IGRpc3BsYXlSZWN0LnkgKyBkaXNwbGF5UmVjdC5oZWlnaHQpIHkgPSBwYXJlbnRSZWN0LnkgLSBoZWlnaHQ7Ci0gIGlmICh4ICsgd2lkdGggPiBkaXNwbGF5UmVjdC54ICsgZGlzcGxheVJlY3Qud2lkdGgpIHggPSBkaXNwbGF5UmVjdC54ICsgZGlzcGxheVJlY3Qud2lkdGggLSBsaXN0UmVjdC53aWR0aDsKLSAgcG9wdXAuc2V0Qm91bmRzICh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgcG9wdXAuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0gIGxpc3Quc2V0Rm9jdXMgKCk7Ci19Ci0vKgotICogUmV0dXJuIHRoZSBsb3dlcmNhc2Ugb2YgdGhlIGZpcnN0IG5vbi0nJicgY2hhcmFjdGVyIGZvbGxvd2luZwotICogYW4gJyYnIGNoYXJhY3RlciBpbiB0aGUgZ2l2ZW4gc3RyaW5nLiBJZiB0aGVyZSBhcmUgbm8gJyYnCi0gKiBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcsIHJldHVybiAnXDAnLgotICovCi1jaGFyIF9maW5kTW5lbW9uaWMgKFN0cmluZyBzdHJpbmcpIHsKLSAgaWYgKHN0cmluZyA9PSBudWxsKSByZXR1cm4gJ1wwJzsKLSAgaW50IGluZGV4ID0gMDsKLSAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGggKCk7Ci0gIGRvIHsKLSAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgc3RyaW5nLmNoYXJBdCAoaW5kZXgpICE9ICcmJykgaW5kZXgrKzsKLSAgICBpZiAoKytpbmRleCA+PSBsZW5ndGgpIHJldHVybiAnXDAnOwotICAgIGlmIChzdHJpbmcuY2hhckF0IChpbmRleCkgIT0gJyYnKSByZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlIChzdHJpbmcuY2hhckF0IChpbmRleCkpOwotICAgIGluZGV4Kys7Ci0gIH0gd2hpbGUgKGluZGV4IDwgbGVuZ3RoKTsKLSAgcmV0dXJuICdcMCc7Ci19Ci0vKiAKLSAqIFJldHVybiB0aGUgTGFiZWwgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSByZWNlaXZlciBpbiB0aGUgei1vcmRlciwgCi0gKiBvciBudWxsIGlmIG5vbmUuIAotICovCi1MYWJlbCBnZXRBc3NvY2lhdGVkTGFiZWwgKCkgewotICBDb250cm9sW10gc2libGluZ3MgPSBnZXRQYXJlbnQgKCkuZ2V0Q2hpbGRyZW4gKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICBpZiAoc2libGluZ3MgW2ldID09IHRoaXMpIHsKLSAgICAgIGlmIChpID4gMCAmJiBzaWJsaW5ncyBbaS0xXSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0gICAgICAgIHJldHVybiAoTGFiZWwpIHNpYmxpbmdzIFtpLTFdOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBDb250cm9sIFtdIGdldENoaWxkcmVuICgpIHsKLSAgcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKCk7Ci19Ci0vKioKLSAqIEdldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotICoKLSAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHJlY2VpdmVyIGlzIGVkaXRhYmxlCi0gKiAKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHRleHQuZ2V0RWRpdGFibGUoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4sIHplcm8tcmVsYXRpdmUgaW5kZXggaW4gdGhlCi0gKiByZWNlaXZlcidzIGxpc3QuIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dAotICogb2YgcmFuZ2UuCi0gKgotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm4KLSAqIEByZXR1cm4gdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGluZGV4Ci0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBtaW51cyAxIChpbmNsdXNpdmUpPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgU3RyaW5nIGdldEl0ZW0gKGludCBpbmRleCkgewotICBjaGVja1dpZGdldCgpOwotICByZXR1cm4gbGlzdC5nZXRJdGVtIChpbmRleCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldEl0ZW1Db3VudCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gbGlzdC5nZXRJdGVtQ291bnQgKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgYXJlYSB3aGljaCB3b3VsZCBiZSB1c2VkIHRvCi0gKiBkaXNwbGF5IDxlbT5vbmU8L2VtPiBvZiB0aGUgaXRlbXMgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2Ygb25lIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldEl0ZW1IZWlnaHQgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIGxpc3QuZ2V0SXRlbUhlaWdodCAoKTsKLX0KLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+cyB3aGljaCBhcmUgdGhlIGl0ZW1zCi0gKiBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LiAKLSAqIDxwPgotICogTm90ZTogVGhpcyBpcyBub3QgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgcmVjZWl2ZXIKLSAqIHRvIG1haW50YWluIGl0cyBsaXN0IG9mIGl0ZW1zLCBzbyBtb2RpZnlpbmcgdGhlIGFycmF5IHdpbGwKLSAqIG5vdCBhZmZlY3QgdGhlIHJlY2VpdmVyLiAKLSAqIDwvcD4KLSAqCi0gKiBAcmV0dXJuIHRoZSBpdGVtcyBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBbXSBnZXRJdGVtcyAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gbGlzdC5nZXRJdGVtcyAoKTsKLX0KLXB1YmxpYyBNZW51IGdldE1lbnUoKSB7Ci0gIHJldHVybiB0ZXh0LmdldE1lbnUoKTsKLX0KLS8qKgotICogUmV0dXJucyBhIDxjb2RlPlBvaW50PC9jb2RlPiB3aG9zZSB4IGNvb3JkaW5hdGUgaXMgdGhlIHN0YXJ0Ci0gKiBvZiB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQsIGFuZCB3aG9zZSB5Ci0gKiBjb29yZGluYXRlIGlzIHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbi4gVGhlIHJldHVybmVkIHZhbHVlcwotICogYXJlIHplcm8tcmVsYXRpdmUuIEFuICJlbXB0eSIgc2VsZWN0aW9uIGFzIGluZGljYXRlZCBieQotICogdGhlIHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIGhhdmluZyB0aGUgc2FtZSB2YWx1ZS4KLSAqCi0gKiBAcmV0dXJuIGEgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBzZWxlY3Rpb24gc3RhcnQgYW5kIGVuZAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24gKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHRleHQuZ2V0U2VsZWN0aW9uICgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSB6ZXJvLXJlbGF0aXZlIGluZGV4IG9mIHRoZSBpdGVtIHdoaWNoIGlzIGN1cnJlbnRseQotICogc2VsZWN0ZWQgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdCwgb3IgLTEgaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uSW5kZXggKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci19Ci1wdWJsaWMgaW50IGdldFN0eWxlICgpIHsKLSAgaW50IHN0eWxlID0gc3VwZXIuZ2V0U3R5bGUgKCk7Ci0gIHN0eWxlICY9IH5TV1QuUkVBRF9PTkxZOwotICBpZiAoIXRleHQuZ2V0RWRpdGFibGUoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsgCi0gIHJldHVybiBzdHlsZTsKLX0KLS8qKgotICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlCi0gKiByZWNlaXZlcidzIHRleHQgZmllbGQuCi0gKgotICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyB0ZXh0Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBnZXRUZXh0ICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHJldHVybiB0ZXh0LmdldFRleHQgKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgcmVjZWl2ZXJzJ3MgdGV4dCBmaWVsZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSB0ZXh0IGhlaWdodAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0VGV4dEhlaWdodCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gdGV4dC5nZXRMaW5lSGVpZ2h0ICgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIHJlY2VpdmVyJ3MKLSAqIHRleHQgZmllbGQgaXMgY2FwYWJsZSBvZiBob2xkaW5nLiBJZiB0aGlzIGhhcyBub3QgYmVlbiBjaGFuZ2VkCi0gKiBieSA8Y29kZT5zZXRUZXh0TGltaXQoKTwvY29kZT4sIGl0IHdpbGwgYmUgdGhlIGNvbnN0YW50Ci0gKiA8Y29kZT5Db21iby5MSU1JVDwvY29kZT4uCi0gKiAKLSAqIEByZXR1cm4gdGhlIHRleHQgbGltaXQKLSAqIAotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBnZXRUZXh0TGltaXQgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHRleHQuZ2V0VGV4dExpbWl0ICgpOwotfQotLyoqCi0gKiBHZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCBhcmUgdmlzaWJsZSBpbiB0aGUgZHJvcAotICogZG93biBwb3J0aW9uIG9mIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gKgotICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgYXJlIHZpc2libGUKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VmlzaWJsZUl0ZW1Db3VudCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gdmlzaWJsZUl0ZW1Db3VudDsKLX0KLXZvaWQgaGFuZGxlRm9jdXMgKGludCB0eXBlKSB7Ci0gIGlmIChpc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgU1dULkZvY3VzSW46IHsKLSAgICAgIGlmIChoYXNGb2N1cykgcmV0dXJuOwotICAgICAgaWYgKGdldEVkaXRhYmxlICgpKSB0ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgIGhhc0ZvY3VzID0gdHJ1ZTsKLSAgICAgIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwgKCk7Ci0gICAgICBzaGVsbC5yZW1vdmVMaXN0ZW5lciAoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLSAgICAgIHNoZWxsLmFkZExpc3RlbmVyIChTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLSAgICAgIGRpc3BsYXkucmVtb3ZlRmlsdGVyIChTV1QuRm9jdXNJbiwgZmlsdGVyKTsKLSAgICAgIGRpc3BsYXkuYWRkRmlsdGVyIChTV1QuRm9jdXNJbiwgZmlsdGVyKTsKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5Gb2N1c0luLCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5Gb2N1c091dDogewotICAgICAgaWYgKCFoYXNGb2N1cykgcmV0dXJuOwotICAgICAgQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBnZXREaXNwbGF5ICgpLmdldEZvY3VzQ29udHJvbCAoKTsKLSAgICAgIGlmIChmb2N1c0NvbnRyb2wgPT0gYXJyb3cgfHwgZm9jdXNDb250cm9sID09IGxpc3QgfHwgZm9jdXNDb250cm9sID09IHRleHQpIHJldHVybjsKLSAgICAgIGhhc0ZvY3VzID0gZmFsc2U7Ci0gICAgICBTaGVsbCBzaGVsbCA9IGdldFNoZWxsICgpOwotICAgICAgc2hlbGwucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkgKCk7Ci0gICAgICBkaXNwbGF5LnJlbW92ZUZpbHRlciAoU1dULkZvY3VzSW4sIGZpbHRlcik7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuRm9jdXNPdXQsIGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0vKioKLSAqIFNlYXJjaGVzIHRoZSByZWNlaXZlcidzIGxpc3Qgc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGl0ZW0KLSAqIChpbmRleCAwKSB1bnRpbCBhbiBpdGVtIGlzIGZvdW5kIHRoYXQgaXMgZXF1YWwgdG8gdGhlIAotICogYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGF0IGl0ZW0uIElmIG5vIGl0ZW0KLSAqIGlzIGZvdW5kLCByZXR1cm5zIC0xLgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0gKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgaXRlbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmluZyBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGluZGV4T2YgKFN0cmluZyBzdHJpbmcpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHJldHVybiBsaXN0LmluZGV4T2YgKHN0cmluZyk7Ci19Ci0vKioKLSAqIFNlYXJjaGVzIHRoZSByZWNlaXZlcidzIGxpc3Qgc3RhcnRpbmcgYXQgdGhlIGdpdmVuLCAKLSAqIHplcm8tcmVsYXRpdmUgaW5kZXggdW50aWwgYW4gaXRlbSBpcyBmb3VuZCB0aGF0IGlzIGVxdWFsCi0gKiB0byB0aGUgYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGF0IGl0ZW0uIElmCi0gKiBubyBpdGVtIGlzIGZvdW5kIG9yIHRoZSBzdGFydGluZyBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsCi0gKiByZXR1cm5zIC0xLgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0gKiBAcGFyYW0gc3RhcnQgdGhlIHplcm8tcmVsYXRpdmUgaW5kZXggYXQgd2hpY2ggdG8gYmVnaW4gdGhlIHNlYXJjaAotICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBpbmRleE9mIChTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnQpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHJldHVybiBsaXN0LmluZGV4T2YgKHN0cmluZywgc3RhcnQpOwotfQotCi12b2lkIGluaXRBY2Nlc3NpYmxlKCkgewotICBBY2Nlc3NpYmxlQWRhcHRlciBhY2Nlc3NpYmxlQWRhcHRlciA9IG5ldyBBY2Nlc3NpYmxlQWRhcHRlciAoKSB7Ci0gICAgcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgIExhYmVsIGxhYmVsID0gZ2V0QXNzb2NpYXRlZExhYmVsICgpOwotICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKLSAgICAgICAgbmFtZSA9IHN0cmlwTW5lbW9uaWMgKGxhYmVsLmdldFRleHQoKSk7Ci0gICAgICB9Ci0gICAgICBlLnJlc3VsdCA9IG5hbWU7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgIFN0cmluZyBzaG9ydGN1dCA9IG51bGw7Ci0gICAgICBMYWJlbCBsYWJlbCA9IGdldEFzc29jaWF0ZWRMYWJlbCAoKTsKLSAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gbGFiZWwuZ2V0VGV4dCAoKTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgIGNoYXIgbW5lbW9uaWMgPSBfZmluZE1uZW1vbmljICh0ZXh0KTsKLSAgICAgICAgICBpZiAobW5lbW9uaWMgIT0gJ1wwJykgewotICAgICAgICAgICAgc2hvcnRjdXQgPSAiQWx0KyIrbW5lbW9uaWM7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGUucmVzdWx0ID0gc2hvcnRjdXQ7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldEhlbHAgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGdldFRvb2xUaXBUZXh0ICgpOwotICAgIH0KLSAgfTsKLSAgZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKGFjY2Vzc2libGVBZGFwdGVyKTsKLSAgdGV4dC5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAoYWNjZXNzaWJsZUFkYXB0ZXIpOwotICBsaXN0LmdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyIChhY2Nlc3NpYmxlQWRhcHRlcik7Ci0gIAotICBhcnJvdy5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotICAgIHB1YmxpYyB2b2lkIGdldE5hbWUgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGlzRHJvcHBlZCAoKSA/IFNXVC5nZXRNZXNzYWdlICgiU1dUX0Nsb3NlIikgOiBTV1QuZ2V0TWVzc2FnZSAoIlNXVF9PcGVuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBnZXRLZXlib2FyZFNob3J0Y3V0IChBY2Nlc3NpYmxlRXZlbnQgZSkgewotICAgICAgZS5yZXN1bHQgPSAiQWx0K0Rvd24gQXJyb3ciOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldEhlbHAgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGdldFRvb2xUaXBUZXh0ICgpOwotICAgIH0KLSAgfSk7Ci0KLSAgZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlVGV4dEFkYXB0ZXIoKSB7Ci0gICAgcHVibGljIHZvaWQgZ2V0Q2FyZXRPZmZzZXQgKEFjY2Vzc2libGVUZXh0RXZlbnQgZSkgewotICAgICAgZS5vZmZzZXQgPSB0ZXh0LmdldENhcmV0UG9zaXRpb24gKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldFNlbGVjdGlvblJhbmdlKEFjY2Vzc2libGVUZXh0RXZlbnQgZSkgewotICAgICAgUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGUub2Zmc2V0ID0gc2VsLng7Ci0gICAgICBlLmxlbmd0aCA9IHNlbC55IC0gc2VsLng7Ci0gICAgfQotICB9KTsKLSAgCi0gIGdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotICAgIHB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludCAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICBQb2ludCB0ZXN0UG9pbnQgPSB0b0NvbnRyb2wgKGUueCwgZS55KTsKLSAgICAgIGlmIChnZXRCb3VuZHMgKCkuY29udGFpbnMgKHRlc3RQb2ludCkpIHsKLSAgICAgICAgZS5jaGlsZElEID0gQUNDLkNISUxESURfU0VMRjsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0TG9jYXRpb24gKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzICgpOwotICAgICAgUG9pbnQgcHQgPSB0b0Rpc3BsYXkgKGxvY2F0aW9uLngsIGxvY2F0aW9uLnkpOwotICAgICAgZS54ID0gcHQueDsKLSAgICAgIGUueSA9IHB0Lnk7Ci0gICAgICBlLndpZHRoID0gbG9jYXRpb24ud2lkdGg7Ci0gICAgICBlLmhlaWdodCA9IGxvY2F0aW9uLmhlaWdodDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRDb3VudCAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICBlLmRldGFpbCA9IDA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGdldFJvbGUgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgZS5kZXRhaWwgPSBBQ0MuUk9MRV9DT01CT0JPWDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0U3RhdGUgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgZS5kZXRhaWwgPSBBQ0MuU1RBVEVfTk9STUFMOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldFZhbHVlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUucmVzdWx0ID0gZ2V0VGV4dCAoKTsKLSAgICB9Ci0gIH0pOwotCi0gIHRleHQuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyICgpIHsKLSAgICBwdWJsaWMgdm9pZCBnZXRSb2xlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUuZGV0YWlsID0gdGV4dC5nZXRFZGl0YWJsZSAoKSA/IEFDQy5ST0xFX1RFWFQgOiBBQ0MuUk9MRV9MQUJFTDsKLSAgICB9Ci0gIH0pOwotCi0gIGFycm93LmdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLSAgICBwdWJsaWMgdm9pZCBnZXREZWZhdWx0QWN0aW9uIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUucmVzdWx0ID0gaXNEcm9wcGVkICgpID8gU1dULmdldE1lc3NhZ2UgKCJTV1RfQ2xvc2UiKSA6IFNXVC5nZXRNZXNzYWdlICgiU1dUX09wZW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9KTsKLX0KLWJvb2xlYW4gaXNEcm9wcGVkICgpIHsKLSAgcmV0dXJuIHBvcHVwLmdldFZpc2libGUgKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQ29udHJvbCAoKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmICh0ZXh0LmlzRm9jdXNDb250cm9sICgpIHx8IGFycm93LmlzRm9jdXNDb250cm9sICgpIHx8IGxpc3QuaXNGb2N1c0NvbnRyb2wgKCkgfHwgcG9wdXAuaXNGb2N1c0NvbnRyb2wgKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSAKLSAgcmV0dXJuIHN1cGVyLmlzRm9jdXNDb250cm9sICgpOwotfQotdm9pZCBpbnRlcm5hbExheW91dCAoYm9vbGVhbiBjaGFuZ2VkKSB7Ci0gIGlmIChpc0Ryb3BwZWQgKCkpIGRyb3BEb3duIChmYWxzZSk7Ci0gIFJlY3RhbmdsZSByZWN0ID0gZ2V0Q2xpZW50QXJlYSAoKTsKLSAgaW50IHdpZHRoID0gcmVjdC53aWR0aDsKLSAgaW50IGhlaWdodCA9IHJlY3QuaGVpZ2h0OwotICAvLyBQb2ludCBhcnJvd1NpemUgPSBhcnJvdy5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIGhlaWdodCwgY2hhbmdlZCk7Ci0gIC8vIHRleHQuc2V0Qm91bmRzICgwLCAwLCB3aWR0aCAtIGFycm93U2l6ZS54LCBoZWlnaHQpOwotICB0ZXh0LnNldEJvdW5kcyAoMCwgMCwgd2lkdGggLSAxNiwgaGVpZ2h0KTsKLSAgLy8gYXJyb3cuc2V0Qm91bmRzICh3aWR0aCAtIGFycm93U2l6ZS54LCAwLCBhcnJvd1NpemUueCwgYXJyb3dTaXplLnkpOwotICBhcnJvdy5zZXRCb3VuZHMgKHdpZHRoIC0gMTYsIDAsIDE2LCAxNik7Ci19Ci12b2lkIGxpc3RFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgY2FzZSBTV1QuRGlzcG9zZToKLSAgICAgIGlmIChnZXRTaGVsbCAoKSAhPSBwb3B1cC5nZXRQYXJlbnQgKCkpIHsKLSAgICAgICAgU3RyaW5nW10gaXRlbXMgPSBsaXN0LmdldEl0ZW1zICgpOwotICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotICAgICAgICBwb3B1cCA9IG51bGw7Ci0gICAgICAgIGxpc3QgPSBudWxsOwotICAgICAgICBjcmVhdGVQb3B1cCAoaXRlbXMsIHNlbGVjdGlvbkluZGV4KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULkZvY3VzSW46IHsKLSAgICAgIGhhbmRsZUZvY3VzIChTV1QuRm9jdXNJbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTW91c2VVcDogewotICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0gICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULlNlbGVjdGlvbjogewotICAgICAgaW50IGluZGV4ID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLSAgICAgIGlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotICAgICAgdGV4dC5zZXRUZXh0IChsaXN0LmdldEl0ZW0gKGluZGV4KSk7Ci0gICAgICB0ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgIGxpc3Quc2V0U2VsZWN0aW9uIChpbmRleCk7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgZS5kb2l0ID0gZXZlbnQuZG9pdDsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULlNlbGVjdGlvbiwgZSk7Ci0gICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULlRyYXZlcnNlOiB7Ci0gICAgICBzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLSAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVM6Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX05FWFQ6Ci0gICAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmRldGFpbCA9IGV2ZW50LmRldGFpbDsKLSAgICAgIGUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5UcmF2ZXJzZSwgZSk7Ci0gICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgZXZlbnQuZGV0YWlsID0gZS5kZXRhaWw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuS2V5VXA6IHsgICAKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5LZXlVcCwgZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuS2V5RG93bjogewotICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7IAotICAgICAgICAvLyBFc2NhcGUga2V5IGNhbmNlbHMgcG9wdXAgbGlzdAotICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgfQotICAgICAgaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQUxUKSAhPSAwICYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCB8fCBldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSkgewotICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgfQotICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLSAgICAgICAgLy8gRW50ZXIgY2F1c2VzIGRlZmF1bHQgc2VsZWN0aW9uCi0gICAgICAgIGRyb3BEb3duIChmYWxzZSk7Ci0gICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBlKTsKLSAgICAgIH0KLSAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHdpZGdldCBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkLgotICAgICAgLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLSAgICAgIGlmIChpc0Rpc3Bvc2VkICgpKSBicmVhazsKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhTV1QuS2V5RG93biwgZSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIH0KLSAgfQotfQotCi12b2lkIHBvcHVwRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgY2FzZSBTV1QuUGFpbnQ6Ci0gICAgICAvLyBkcmF3IGJsYWNrIHJlY3RhbmdsZSBhcm91bmQgbGlzdAotICAgICAgUmVjdGFuZ2xlIGxpc3RSZWN0ID0gbGlzdC5nZXRCb3VuZHMoKTsKLSAgICAgIENvbG9yIGJsYWNrID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0gICAgICBldmVudC5nYy5zZXRGb3JlZ3JvdW5kKGJsYWNrKTsKLSAgICAgIGV2ZW50LmdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgbGlzdFJlY3Qud2lkdGggKyAxLCBsaXN0UmVjdC5oZWlnaHQgKyAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULkNsb3NlOgotICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULkRlYWN0aXZhdGU6Ci0gICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLXB1YmxpYyB2b2lkIHJlZHJhdyAoKSB7Ci0gIHN1cGVyLnJlZHJhdygpOwotICB0ZXh0LnJlZHJhdygpOwotICBhcnJvdy5yZWRyYXcoKTsKLSAgaWYgKHBvcHVwLmlzVmlzaWJsZSgpKSBsaXN0LnJlZHJhdygpOwotfQotcHVibGljIHZvaWQgcmVkcmF3IChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBhbGwpIHsKLSAgc3VwZXIucmVkcmF3KHgsIHksIHdpZHRoLCBoZWlnaHQsIHRydWUpOwotfQotCi0vKioKLSAqIFJlbW92ZXMgdGhlIGl0ZW0gZnJvbSB0aGUgcmVjZWl2ZXIncyBsaXN0IGF0IHRoZSBnaXZlbgotICogemVyby1yZWxhdGl2ZSBpbmRleC4KLSAqCi0gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGZvciB0aGUgaXRlbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgdGhlIGluZGV4IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgbWludXMgMSAoaW5jbHVzaXZlKTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlIChpbnQgaW5kZXgpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgbGlzdC5yZW1vdmUgKGluZGV4KTsKLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgaXRlbXMgZnJvbSB0aGUgcmVjZWl2ZXIncyBsaXN0IHdoaWNoIGFyZQotICogYmV0d2VlbiB0aGUgZ2l2ZW4gemVyby1yZWxhdGl2ZSBzdGFydCBhbmQgZW5kIAotICogaW5kaWNlcyAoaW5jbHVzaXZlKS4KLSAqCi0gKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSByYW5nZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgYXJlIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgbWludXMgMSAoaW5jbHVzaXZlKTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlIChpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgbGlzdC5yZW1vdmUgKHN0YXJ0LCBlbmQpOwotfQotLyoqCi0gKiBTZWFyY2hlcyB0aGUgcmVjZWl2ZXIncyBsaXN0IHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBpdGVtCi0gKiB1bnRpbCBhbiBpdGVtIGlzIGZvdW5kIHRoYXQgaXMgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LCAKLSAqIGFuZCByZW1vdmVzIHRoYXQgaXRlbSBmcm9tIHRoZSBsaXN0LgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIGl0ZW0gdG8gcmVtb3ZlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlIChTdHJpbmcgc3RyaW5nKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIGxpc3QucmVtb3ZlIChzdHJpbmcpOwotfQotLyoqCi0gKiBSZW1vdmVzIGFsbCBvZiB0aGUgaXRlbXMgZnJvbSB0aGUgcmVjZWl2ZXIncyBsaXN0IGFuZCBjbGVhciB0aGUKLSAqIGNvbnRlbnRzIG9mIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZC4KLSAqIDxwPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlQWxsICgpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgdGV4dC5zZXRUZXh0ICgiIik7IC8vJE5PTi1OTFMtMSQKLSAgbGlzdC5yZW1vdmVBbGwgKCk7Ci19Ci0vKioKLSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsCi0gKiBiZSBub3RpZmllZCB3aGVuIHRoZSByZWNlaXZlcidzIHRleHQgaXMgbW9kaWZpZWQuCi0gKgotICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlIE1vZGlmeUxpc3RlbmVyCi0gKiBAc2VlICNhZGRNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lciAoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICByZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCBsaXN0ZW5lcik7IAotfQotLyoqCi0gKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyBzZWxlY3Rpb24gY2hhbmdlcy4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXIKLSAqIEBzZWUgI2FkZFNlbGVjdGlvbkxpc3RlbmVyCi0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyIChTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICBjaGVja1dpZGdldCgpOwotICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHJlbW92ZUxpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLSAgcmVtb3ZlTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sbGlzdGVuZXIpOyAgCi19Ci0vKioKLSAqIFNlbGVjdHMgdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIHplcm8tcmVsYXRpdmUgaW5kZXggaW4gdGhlIHJlY2VpdmVyJ3MgCi0gKiBsaXN0LiAgSWYgdGhlIGl0ZW0gYXQgdGhlIGluZGV4IHdhcyBhbHJlYWR5IHNlbGVjdGVkLCBpdCByZW1haW5zCi0gKiBzZWxlY3RlZC4gSW5kaWNlcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UgYXJlIGlnbm9yZWQuCi0gKgotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBzZWxlY3QKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZWxlY3QgKGludCBpbmRleCkgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICBsaXN0LmRlc2VsZWN0QWxsICgpOwotICAgIHRleHQuc2V0VGV4dCAoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuOwotICB9Ci0gIGlmICgwIDw9IGluZGV4ICYmIGluZGV4IDwgbGlzdC5nZXRJdGVtQ291bnQoKSkgewotICAgIGlmIChpbmRleCAhPSBnZXRTZWxlY3Rpb25JbmRleCgpKSB7Ci0gICAgICB0ZXh0LnNldFRleHQgKGxpc3QuZ2V0SXRlbSAoaW5kZXgpKTsKLSAgICAgIHRleHQuc2VsZWN0QWxsICgpOwotICAgICAgbGlzdC5zZWxlY3QgKGluZGV4KTsKLSAgICAgIGxpc3Quc2hvd1NlbGVjdGlvbiAoKTsKLSAgICB9Ci0gIH0KLX0KLXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQgKENvbG9yIGNvbG9yKSB7Ci0gIHN1cGVyLnNldEJhY2tncm91bmQoY29sb3IpOwotICBiYWNrZ3JvdW5kID0gY29sb3I7Ci0gIGlmICh0ZXh0ICE9IG51bGwpIHRleHQuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gIGlmIChsaXN0ICE9IG51bGwpIGxpc3Quc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gIGlmIChhcnJvdyAhPSBudWxsKSBhcnJvdy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLX0KLS8qKgotICogU2V0cyB0aGUgZWRpdGFibGUgc3RhdGUuCi0gKgotICogQHBhcmFtIGVkaXRhYmxlIHRoZSBuZXcgZWRpdGFibGUgc3RhdGUKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlIChib29sZWFuIGVkaXRhYmxlKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICB0ZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLX0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWQgKGJvb2xlYW4gZW5hYmxlZCkgewotICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOwotICBpZiAocG9wdXAgIT0gbnVsbCkgcG9wdXAuc2V0VmlzaWJsZSAoZmFsc2UpOwotICBpZiAodGV4dCAhPSBudWxsKSB0ZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gIGlmIChhcnJvdyAhPSBudWxsKSBhcnJvdy5zZXRFbmFibGVkKGVuYWJsZWQpOwotfQotcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMgKCkgewotICBjaGVja1dpZGdldCgpOwotICByZXR1cm4gdGV4dC5zZXRGb2N1cyAoKTsKLX0KLXB1YmxpYyB2b2lkIHNldEZvbnQgKEZvbnQgZm9udCkgewotICBzdXBlci5zZXRGb250IChmb250KTsKLSAgdGhpcy5mb250ID0gZm9udDsKLSAgdGV4dC5zZXRGb250IChmb250KTsKLSAgbGlzdC5zZXRGb250IChmb250KTsKLSAgaW50ZXJuYWxMYXlvdXQgKHRydWUpOwotfQotcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZCAoQ29sb3IgY29sb3IpIHsKLSAgc3VwZXIuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0gIGZvcmVncm91bmQgPSBjb2xvcjsKLSAgaWYgKHRleHQgIT0gbnVsbCkgdGV4dC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLSAgaWYgKGxpc3QgIT0gbnVsbCkgbGlzdC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLSAgaWYgKGFycm93ICE9IG51bGwpIGFycm93LnNldEZvcmVncm91bmQoY29sb3IpOwotfQotLyoqCi0gKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBpdGVtIGluIHRoZSByZWNlaXZlcidzIGxpc3QgYXQgdGhlIGdpdmVuCi0gKiB6ZXJvLXJlbGF0aXZlIGluZGV4IHRvIHRoZSBzdHJpbmcgYXJndW1lbnQuIFRoaXMgaXMgZXF1aXZhbGVudAotICogdG8gPGNvZGU+cmVtb3ZlPC9jb2RlPidpbmcgdGhlIG9sZCBpdGVtIGF0IHRoZSBpbmRleCwgYW5kIHRoZW4KLSAqIDxjb2RlPmFkZDwvY29kZT4naW5nIHRoZSBuZXcgaXRlbSBhdCB0aGF0IGluZGV4LgotICoKLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBuZXcgdGV4dCBmb3IgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSAtIGlmIHRoZSBpbmRleCBpcyBub3QgYmV0d2VlbiAwIGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IG1pbnVzIDEgKGluY2x1c2l2ZSk8L2xpPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEl0ZW0gKGludCBpbmRleCwgU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBsaXN0LnNldEl0ZW0gKGluZGV4LCBzdHJpbmcpOwotfQotLyoqCi0gKiBTZXRzIHRoZSByZWNlaXZlcidzIGxpc3QgdG8gYmUgdGhlIGdpdmVuIGFycmF5IG9mIGl0ZW1zLgotICoKLSAqIEBwYXJhbSBpdGVtcyB0aGUgYXJyYXkgb2YgaXRlbXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBpdGVtcyBhcnJheSBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgYW4gaXRlbSBpbiB0aGUgaXRlbXMgYXJyYXkgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0SXRlbXMgKFN0cmluZyBbXSBpdGVtcykgewotICBjaGVja1dpZGdldCAoKTsKLSAgbGlzdC5zZXRJdGVtcyAoaXRlbXMpOwotICBpZiAoIXRleHQuZ2V0RWRpdGFibGUgKCkpIHRleHQuc2V0VGV4dCAoIiIpOyAvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIFNldHMgdGhlIGxheW91dCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyIHRvIGJlCi0gKiB0aGUgYXJndW1lbnQgd2hpY2ggbWF5IGJlIG51bGwuCi0gKiA8cD4KLSAqIE5vdGU6IE5vIExheW91dCBjYW4gYmUgc2V0IG9uIHRoaXMgQ29udHJvbCBiZWNhdXNlIGl0IGFscmVhZHkKLSAqIG1hbmFnZXMgdGhlIHNpemUgYW5kIHBvc2l0aW9uIG9mIGl0cyBjaGlsZHJlbi4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gbGF5b3V0IHRoZSByZWNlaXZlcidzIG5ldyBsYXlvdXQgb3IgbnVsbAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldExheW91dCAoTGF5b3V0IGxheW91dCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuOwotfQotcHVibGljIHZvaWQgc2V0TWVudShNZW51IG1lbnUpIHsKLSAgdGV4dC5zZXRNZW51KG1lbnUpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCB0byB0aGUKLSAqIHJhbmdlIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQgd2hvc2UgeCBjb29yZGluYXRlIGlzIHRoZQotICogc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiBhbmQgd2hvc2UgeSBjb29yZGluYXRlIGlzIHRoZSBlbmQKLSAqIG9mIHRoZSBzZWxlY3Rpb24uIAotICoKLSAqIEBwYXJhbSBzZWxlY3Rpb24gYSBwb2ludCByZXByZXNlbnRpbmcgdGhlIG5ldyBzZWxlY3Rpb24gc3RhcnQgYW5kIGVuZAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBvaW50IGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbiAoUG9pbnQgc2VsZWN0aW9uKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHRleHQuc2V0U2VsZWN0aW9uIChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQgdG8gdGhlCi0gKiBnaXZlbiBzdHJpbmcuCi0gKiA8cD4KLSAqIE5vdGU6IFRoZSB0ZXh0IGZpZWxkIGluIGEgPGNvZGU+Q29tYm88L2NvZGU+IGlzIHR5cGljYWxseQotICogb25seSBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgYSBzaW5nbGUgbGluZSBvZiB0ZXh0LiBUaHVzLAotICogc2V0dGluZyB0aGUgdGV4dCB0byBhIHN0cmluZyBjb250YWluaW5nIGxpbmUgYnJlYWtzIG9yCi0gKiBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgd2lsbCBwcm9iYWJseSBjYXVzZSBpdCB0byAKLSAqIGRpc3BsYXkgaW5jb3JyZWN0bHkuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IHRleHQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0VGV4dCAoU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YgKHN0cmluZyk7Ci0gIGlmIChpbmRleCA9PSAtMSkgewotICAgIGxpc3QuZGVzZWxlY3RBbGwgKCk7Ci0gICAgdGV4dC5zZXRUZXh0IChzdHJpbmcpOwotICAgIHJldHVybjsKLSAgfQotICB0ZXh0LnNldFRleHQgKHN0cmluZyk7Ci0gIHRleHQuc2VsZWN0QWxsICgpOwotICBsaXN0LnNldFNlbGVjdGlvbiAoaW5kZXgpOwotICBsaXN0LnNob3dTZWxlY3Rpb24gKCk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB0aGUgcmVjZWl2ZXIncwotICogdGV4dCBmaWVsZCBpcyBjYXBhYmxlIG9mIGhvbGRpbmcgdG8gYmUgdGhlIGFyZ3VtZW50LgotICoKLSAqIEBwYXJhbSBsaW1pdCBuZXcgdGV4dCBsaW1pdAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9DQU5OT1RfQkVfWkVSTyAtIGlmIHRoZSBsaW1pdCBpcyB6ZXJvPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRUZXh0TGltaXQgKGludCBsaW1pdCkgewotICBjaGVja1dpZGdldCgpOwotICB0ZXh0LnNldFRleHRMaW1pdCAobGltaXQpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dCAoU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBzdXBlci5zZXRUb29sVGlwVGV4dChzdHJpbmcpOwotICBhcnJvdy5zZXRUb29sVGlwVGV4dCAoc3RyaW5nKTsKLSAgdGV4dC5zZXRUb29sVGlwVGV4dCAoc3RyaW5nKTsgICAKLX0KLQotcHVibGljIHZvaWQgc2V0VmlzaWJsZSAoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gIGlmICghdmlzaWJsZSkgcG9wdXAuc2V0VmlzaWJsZShmYWxzZSk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSBkcm9wCi0gKiBkb3duIHBvcnRpb24gb2YgdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcGFyYW0gY291bnQgdGhlIG5ldyBudW1iZXIgb2YgaXRlbXMgdG8gYmUgdmlzaWJsZQotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIHZvaWQgc2V0VmlzaWJsZUl0ZW1Db3VudCAoaW50IGNvdW50KSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICBpZiAoY291bnQgPCAwKSByZXR1cm47Ci0gIHZpc2libGVJdGVtQ291bnQgPSBjb3VudDsKLX0KLVN0cmluZyBzdHJpcE1uZW1vbmljIChTdHJpbmcgc3RyaW5nKSB7Ci0gIGludCBpbmRleCA9IDA7Ci0gIGludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoICgpOwotICBkbyB7Ci0gICAgd2hpbGUgKChpbmRleCA8IGxlbmd0aCkgJiYgKHN0cmluZy5jaGFyQXQgKGluZGV4KSAhPSAnJicpKSBpbmRleCsrOwotICAgIGlmICgrK2luZGV4ID49IGxlbmd0aCkgcmV0dXJuIHN0cmluZzsKLSAgICBpZiAoc3RyaW5nLmNoYXJBdCAoaW5kZXgpICE9ICcmJykgewotICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgtMSkgKyBzdHJpbmcuc3Vic3RyaW5nKGluZGV4LCBsZW5ndGgpOwotICAgIH0KLSAgICBpbmRleCsrOwotICB9IHdoaWxlIChpbmRleCA8IGxlbmd0aCk7Ci0gIHJldHVybiBzdHJpbmc7Ci19Ci12b2lkIHRleHRFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgY2FzZSBTV1QuRm9jdXNJbjogewotICAgICAgaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c0luKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5LZXlEb3duOiB7Ci0gICAgICBpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5DUikgewotICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgZSk7Ci0gICAgICB9Ci0gICAgICAvL0F0IHRoaXMgcG9pbnQgdGhlIHdpZGdldCBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkLgotICAgICAgLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLSAgICAgIGlmIChpc0Rpc3Bvc2VkICgpKSBicmVhazsKLSAgICAgIAotICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1VQIHx8IGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX0RPV04pIHsKLSAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICBpZiAoKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5BTFQpICE9IDApIHsKLSAgICAgICAgICBib29sZWFuIGRyb3BwZWQgPSBpc0Ryb3BwZWQgKCk7Ci0gICAgICAgICAgdGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICAgICAgaWYgKCFkcm9wcGVkKSBzZXRGb2N1cyAoKTsKLSAgICAgICAgICBkcm9wRG93biAoIWRyb3BwZWQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG9sZEluZGV4ID0gZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCkgewotICAgICAgICAgIHNlbGVjdCAoTWF0aC5tYXggKG9sZEluZGV4IC0gMSwgMCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNlbGVjdCAoTWF0aC5taW4gKG9sZEluZGV4ICsgMSwgZ2V0SXRlbUNvdW50ICgpIC0gMSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvbGRJbmRleCAhPSBnZXRTZWxlY3Rpb25JbmRleCAoKSkgewotICAgICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULlNlbGVjdGlvbiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9BdCB0aGlzIHBvaW50IHRoZSB3aWRnZXQgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZC4KLSAgICAgICAgLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLSAgICAgICAgaWYgKGlzRGlzcG9zZWQgKCkpIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBGdXJ0aGVyIHdvcmsgOiBOZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBpbmNyZW1lbnRhbCBzZWFyY2ggaW4gCi0gICAgICAvLyBwb3AgdXAgbGlzdCBhcyBjaGFyYWN0ZXJzIHR5cGVkIGluIHRleHQgd2lkZ2V0Ci0gICAgICAgICAgICAKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5LZXlEb3duLCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5LZXlVcDogewotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULktleVVwLCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5NZW51RGV0ZWN0OiB7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULk1lbnVEZXRlY3QsIGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULk1vZGlmeTogewotICAgICAgbGlzdC5kZXNlbGVjdEFsbCAoKTsKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuTW9kaWZ5LCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5Nb3VzZURvd246IHsKLSAgICAgIGlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotICAgICAgaWYgKHRleHQuZ2V0RWRpdGFibGUgKCkpIHJldHVybjsKLSAgICAgIGJvb2xlYW4gZHJvcHBlZCA9IGlzRHJvcHBlZCAoKTsKLSAgICAgIHRleHQuc2VsZWN0QWxsICgpOwotICAgICAgaWYgKCFkcm9wcGVkKSBzZXRGb2N1cyAoKTsKLSAgICAgIGRyb3BEb3duICghZHJvcHBlZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTW91c2VVcDogewotICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0gICAgICBpZiAodGV4dC5nZXRFZGl0YWJsZSAoKSkgcmV0dXJuOwotICAgICAgdGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuVHJhdmVyc2U6IHsgICAgCi0gICAgICBzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTOgotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUOgotICAgICAgICAgIC8vIFRoZSBlbnRlciBjYXVzZXMgZGVmYXVsdCBzZWxlY3Rpb24gYW5kCi0gICAgICAgICAgLy8gdGhlIGFycm93IGtleXMgYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgbGlzdCBjb250ZW50cyBzbwotICAgICAgICAgIC8vIGRvIG5vdCB1c2UgdGhlbSBmb3IgdHJhdmVyc2FsLgotICAgICAgICAgIGV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmRldGFpbCA9IGV2ZW50LmRldGFpbDsKLSAgICAgIGUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5UcmF2ZXJzZSwgZSk7Ci0gICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgZXZlbnQuZGV0YWlsID0gZS5kZXRhaWw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JQW5ub3RhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSUFubm90YXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjZkNDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JQW5ub3RhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uUHJvdmlkZXIKLXsKLSAgU3RyaW5nIGdldE5hbWVBbm5vdGF0aW9uU3RyaW5nKCk7Ci0gIFN0cmluZyBnZXROYW1lQW5ub3RhdGlvblRvb2xUaXBTdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JS2V5Ym9hcmREcmFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSUtleWJvYXJkRHJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTA2OTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JS2V5Ym9hcmREcmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElLZXlib2FyZERyYWcgewotCi0JcHVibGljIHZvaWQgcGVyZm9ybUtleWJvYXJkRHJhZyAoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBpbnQgZGlyZWN0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0ltYWdlT3ZlcmxheURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JbWFnZU92ZXJsYXlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmE2NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0ltYWdlT3ZlcmxheURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEltYWdlT3ZlcmxheURlc2NyaXB0b3IgZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IKLXsKLSAgcHJvdGVjdGVkIEltYWdlIGJhc2VJbWFnZTsKLSAgcHJvdGVjdGVkIEltYWdlIGV4dGVuc2lvbk92ZXJsYXksIGRpc2FibGVkRXh0ZW5zaW9uT3ZlcmxheTsKLSAgcHJvdGVjdGVkIFBvaW50IGltYWdlU2l6ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seTsKLSAgCi0gIHB1YmxpYyBJbWFnZU92ZXJsYXlEZXNjcmlwdG9yKEltYWdlIGJhc2VJbWFnZSwgYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmJhc2VJbWFnZSA9IGJhc2VJbWFnZTsKLSAgICB0aGlzLmlzUmVhZE9ubHkgPSBpc1JlYWRPbmx5OwotICAgIGltYWdlU2l6ZSA9IG5ldyBQb2ludChiYXNlSW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGgsIGJhc2VJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQpOwotICAgIGV4dGVuc2lvbk92ZXJsYXkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib3ZyMTYvZXh0bnNuX292ci5naWYiKTsgIC8vJE5PTi1OTFMtMSQgCi0gICAgZGlzYWJsZWRFeHRlbnNpb25PdmVybGF5ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm92cjE2L2V4dG5zbmRpc19vdnIuZ2lmIik7ICAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUltYWdlKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsKLSAgICBkcmF3SW1hZ2UoYmFzZUltYWdlLmdldEltYWdlRGF0YSgpLCAwLCAwKTsKLSAgICBJbWFnZURhdGEgZXh0ZW5zaW9uSW1hZ2VEYXRhOwotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGV4dGVuc2lvbkltYWdlRGF0YSA9IGRpc2FibGVkRXh0ZW5zaW9uT3ZlcmxheS5nZXRJbWFnZURhdGEoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVuc2lvbkltYWdlRGF0YSA9IGV4dGVuc2lvbk92ZXJsYXkuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgfQotICAgIGRyYXdJbWFnZSAoZXh0ZW5zaW9uSW1hZ2VEYXRhLCBpbWFnZVNpemUueCAtIGV4dGVuc2lvbkltYWdlRGF0YS53aWR0aCwgMCk7ICAvLyBUb3AgUmlnaHQgY29ybmVyCi0gIH0KLQotICBwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpCi0gIHsKLSAgICByZXR1cm4gaW1hZ2VTaXplOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BRFRDb21ib0JveENlbGxFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0FEVENvbWJvQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzY2ODNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0FEVENvbWJvQm94Q2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlR5cGVkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotCi0vKgotICogVGhpcyB3cmFwcyB0aGUgQ29tYm9Cb3hDZWxsRWRpdG9yLgotICogV2UgbmVlZCB0byBhcHBseSBhbmQgZGVhY3RpdmF0ZSB0aGUgY29tYm8gb24gYSBzaW5nbGUgY2xpY2sgKG5vdCBvbiBhIGRvdWJsZSBjbGljayBsaWtlCi0gKiB0aGUgQ29tYm9Cb3hDZWxsRWRpdG9yKS4KLSAqLwotcHVibGljIGNsYXNzIEFEVENvbWJvQm94Q2VsbEVkaXRvciBleHRlbmRzIENvbWJvQm94Q2VsbEVkaXRvcgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYWR0RGVmYXVsdFN0eWxlID0gU1dULk5PTkU7Ci0KLSAgLyoqCi0gICAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgY2VsbC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250aW51ZUFwcGx5OwotICBwcml2YXRlIGJvb2xlYW4gaXNUcmF2ZXJzaW5nID0gZmFsc2U7Ci0gIHByaXZhdGUgT2JqZWN0IHNlbGVjdGVkVmFsdWU7Ci0gIHByaXZhdGUgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0gIAotICAvLyBUaGlzIHByZXZlbnRzIHRoZSBjZWxsIGVkaXRvciBmcm9tIGJlaW5nIGRlYWN0aXZhdGVkIHdoaWxlIGhhbmRsaW5nIHRoZSBOZXcgb3IgQnJvd3NlIHNlbGVjdGlvbi4KLSAgcHJpdmF0ZSBib29sZWFuIGlzSGFuZGxpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBjZWxsIGVkaXRvciB3aXRoIGEgY29tYm8gY29udGFpbmluZyB0aGUgZ2l2ZW4gbGlzdCBvZiBjaG9pY2VzCi0gICAqIGFuZCBwYXJlbnRlZCB1bmRlciB0aGUgZ2l2ZW4gY29udHJvbC4gVGhlIGNlbGwgZWRpdG9yIHZhbHVlIGlzIHRoZQotICAgKiB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtLiBJbml0aWFsbHksIHRoZSBjZWxsIGVkaXRvciBoYXMgbm8KLSAgICogY2VsbCB2YWxpZGF0b3IgYW5kIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IGlzIHNlbGVjdGVkLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudAotICAgKiAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICogQHBhcmFtIGl0ZW1zCi0gICAqICAgICAgICAgIHRoZSBsaXN0IG9mIHN0cmluZ3MgZm9yIHRoZSBjb21ibyBib3gKLSAgICovCi0gIHB1YmxpYyBBRFRDb21ib0JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gaXRlbXMsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBpdGVtcywgYWR0RGVmYXVsdFN0eWxlIHwgU1dULlJFQURfT05MWSk7Ci0gICAgc2V0SXRlbXMoaXRlbXMpOwotICAgIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyID0gZWRpdE1hbmFnZXI7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKENDb21ibyBjb21ib0JveCwgaW50IGV2ZW50KQotICB7Ci0gICAgTGlzdGVuZXIgW10gbGlzdGVuZXJzID0gY29tYm9Cb3guZ2V0TGlzdGVuZXJzKGV2ZW50KTsKLSAgICBpbnQgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIExpc3RlbmVyIGwgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICBpZiAobCBpbnN0YW5jZW9mIFR5cGVkTGlzdGVuZXIpCi0gICAgICB7Ci0gICAgICAgIFR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IChUeXBlZExpc3RlbmVyKWw7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSB0eXBlZExpc3RlbmVyLmdldEV2ZW50TGlzdGVuZXIoKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIGFyZSBvdGhlciB0eXBlZCBsaXN0ZW5lcnMgYWRkZWQgdG8gdGhlIENDb21iby4KLSAgICAgICAgLy8gQ3VycmVudGx5IHRoZXJlIGFyZSBub25lLCBidXQgYXMgYW4gZXh0cmEgY2hlY2ssIEkgd2FudCB0byBlbnN1cmUgCi0gICAgICAgIC8vIEknbSByZW1vdmluZyB0aGUgb25lcyBhZGRlZCBmcm9tIHRoZSBpbmhlcml0ZWQgY2xhc3MuCi0gICAgICAgIC8vIEkndmUgdGVzdGVkIHRoaXMgYW5kIEkga25vdyBpdCByZW1vdmVzIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yJDIKLSAgICAgICAgLy8gb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3IkNAotICAgICAgICAvLyB3aGljaCBhcmUgaW5kZWVkIHRoZSBvbmVzIEknbSBjdXN0b21pemluZwotICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmNvbnRhaW5zKCJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvciIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tYm9Cb3gucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBDZWxsRWRpdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ0NvbWJvIGNvbWJvQm94ID0gKENDb21ibylzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0KLSAgICBjb21ib0JveC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgLy8gTmVlZCB0byByZW1vdmUgdGhlIGxpc3RlbmVycyBhZGRlZCBmcm9tIENvbWJvQm94Q2VsbEVkaXRvcgotICAgIHJlbW92ZUxpc3RlbmVycyhjb21ib0JveCwgU1dULlNlbGVjdGlvbik7Ci0gICAgcmVtb3ZlTGlzdGVuZXJzKGNvbWJvQm94LCBTV1QuRGVmYXVsdFNlbGVjdGlvbik7Ci0gICAgcmVtb3ZlTGlzdGVuZXJzKGNvbWJvQm94LCBTV1QuRm9jdXNJbik7Ci0gICAgcmVtb3ZlTGlzdGVuZXJzKGNvbWJvQm94LCBTV1QuRm9jdXNPdXQpOwotICAgIAotICAgIC8vIE5vdyBhZGQgb3VyIGN1c3RvbSBsaXN0ZW5lcnMKLSAgICBjb21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICAvLyBXYW50IHRoZSBzYW1lIGJlaGF2aW91ciBzaW5jZSBoaXR0aW5nIHJldHVybiBvbiBCcm93c2Ugb3IgTmV3IHNob3VsZCBsYXVuY2ggdGhlIGRpYWxvZ3MsCi0gICAgICAgIC8vIGFuZCBub3QgaW1tZWRpYXRlbHkgYXBwbHkgdGhlIHZhbHVlCi0vLyAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICAgICAgIHdpZGdldFNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlQXBwbHkgPSB0cnVlOwotICAgICAgICBDQ29tYm8gY29tYm9Cb3ggPSBnZXRDQ29tYm8oKTsKLSAgICAgICAgaXNIYW5kbGluZ1NlbGVjdGlvbiA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgc2VsZWN0aW9uID0gY29tYm9Cb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICBpZiAoaXNUcmF2ZXJzaW5nKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVHJhdmVyc2luZyA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFN0cmluZ1tdIGl0ZW1zID0gZ2V0SXRlbXMoKTsKLSAgICAgICAgICBTdHJpbmcgc3RyaW5nU2VsZWN0aW9uID0gaXRlbXNbc2VsZWN0aW9uXTsKLQotICAgICAgICAgIGlmIChzdHJpbmdTZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb250aW51ZUFwcGx5ID0gdHJ1ZTsKLSAgICAgICAgICAgIG5ld1ZhbHVlID0gaW52b2tlRGlhbG9nKGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyaW5nU2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX05FVykpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29udGludWVBcHBseSA9IHRydWU7Ci0gICAgICAgICAgICBuZXdWYWx1ZSA9IGludm9rZURpYWxvZyhjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5nZXROZXdEaWFsb2coKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlzSGFuZGxpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250aW51ZUFwcGx5KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGluZGV4ID0gY29tYm9Cb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IGNvbWJvQm94LmdldEl0ZW0oaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IG5ld1ZhbHVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICAgICAgICAgZm9jdXNMb3N0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGNvbWJvQm94LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCB8fCBlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMpCi0gICAgICAgIHsKLSAgICAgICAgICBpc1RyYXZlcnNpbmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBjb21ib0JveC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNIYW5kbGluZ1NlbGVjdGlvbikKLSAgICAgICAgICBBRFRDb21ib0JveENlbGxFZGl0b3IudGhpcy5mb2N1c0xvc3QoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gY29tYm9Cb3g7Ci0gIH0KLQotICBwcml2YXRlIE9iamVjdCBpbnZva2VEaWFsb2coSUNvbXBvbmVudERpYWxvZyBkaWFsb2cpCi0gIHsKLSAgICBPYmplY3QgbmV3VmFsdWUgPSBudWxsOwotCi0gICAgaWYgKGRpYWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vZGlhbG9nLnNldEluaXRpYWxDb21wb25lbnQoc2V0T2JqZWN0KTsKLSAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbnRpbnVlQXBwbHkgPSBmYWxzZTsKLSAgICAgIGZvY3VzTG9zdCgpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdWYWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWRWYWx1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBDQ29tYm8gZ2V0Q0NvbWJvKCkKLSAgewotICAgIHJldHVybiAoQ0NvbWJvKWdldENvbnRyb2woKTsKLSAgfQotICAKLS8vLy8vLy8vLyBDb21ib0JveCBjZWxsIGVkaXRvciAgCi0KLSAgdm9pZCBhcHBseUVkaXRvclZhbHVlQW5kRGVhY3RpdmF0ZSgpCi0gIHsKLSAgICAvLyBtdXN0IHNldCB0aGUgc2VsZWN0aW9uIGJlZm9yZSBnZXR0aW5nIHZhbHVlCi0gICAgQ0NvbWJvIGNvbWJvQm94ID0gZ2V0Q0NvbWJvKCk7Ci0gICAgU3RyaW5nW10gaXRlbXMgPSBnZXRJdGVtcygpOwotCi0gICAgaW50IHNlbGVjdGlvbiA9IGNvbWJvQm94LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgT2JqZWN0IG5ld1ZhbHVlID0gZG9HZXRWYWx1ZSgpOwotICAgIG1hcmtEaXJ0eSgpOwotICAgIGJvb2xlYW4gaXNWYWxpZCA9IGlzQ29ycmVjdChuZXdWYWx1ZSk7Ci0gICAgc2V0VmFsdWVWYWxpZChpc1ZhbGlkKTsKLQotICAgIGlmICghaXNWYWxpZCkKLSAgICB7Ci0gICAgICAvLyBPbmx5IGZvcm1hdCBpZiB0aGUgJ2luZGV4JyBpcyB2YWxpZAotICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uID49IDAgJiYgc2VsZWN0aW9uIDwgaXRlbXMubGVuZ3RoKQotICAgICAgewotICAgICAgICAvLyB0cnkgdG8gaW5zZXJ0IHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRFcnJvck1lc3NhZ2UoKSwgbmV3IE9iamVjdFtdIHsgaXRlbXNbc2VsZWN0aW9uXSB9KSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFNpbmNlIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBpbmRleCwgYXNzdW1lIHdlJ3JlIHVzaW5nIGFuCi0gICAgICAgIC8vICdlZGl0JwotICAgICAgICAvLyBjb21ibyBzbyBmb3JtYXQgdXNpbmcgaXRzIHRleHQgdmFsdWUKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEVycm9yTWVzc2FnZSgpLCBuZXcgT2JqZWN0W10geyBjb21ib0JveC5nZXRUZXh0KCkgfSkpOwotICAgICAgfQotICAgIH0KLQotICAgIGZpcmVBcHBseUVkaXRvclZhbHVlKCk7Ci0gICAgZGVhY3RpdmF0ZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BdHRyaWJ1dGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1ZTI3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BdHRyaWJ1dGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcgotewotICBwdWJsaWMgQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoSUZpZWxkIHBhcmFtZXRlciwgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsKQotICB7Ci0gICAgc3VwZXIocGFyYW1ldGVyLCBzb3VyY2UsIGxhYmVsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDBmMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIvLyBpbXBsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZQotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgcHVibGljIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBMYWJlbCBsYWJlbCkKLSAgewotICAgIHN1cGVyKHNvdXJjZSwgQ29tYm9Cb3hDZWxsRWRpdG9yLmNsYXNzLCBuZXcgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihsYWJlbCkpOwotICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkKLSAgewotICAgIFN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gbGFiZWwuZ2V0VGV4dCgpOwotCi0gICAgQ0NvbWJvIGNvbWJvID0gKENDb21ibykgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLSAgICBjb21iby5zZXRGb250KGxhYmVsLmdldEZvbnQoKSk7Ci0gICAgY29tYm8uc2V0Rm9yZWdyb3VuZChsYWJlbC5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0gICAgY29tYm8uc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgY29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgyMCk7Ci0KLSAgICAvKgotICAgICAqIGNvbWJvLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgeyAvLyBob29rIGtleSBwcmVzc2VkIC0gc2VlIFBSCi0gICAgICogMTQyMDEgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBrZXlFdmVudCkgeyBpZiAoa2V5RXZlbnQuY2hhcmFjdGVyID09Ci0gICAgICogJ3onKSB7IGdldENlbGxFZGl0b3IoKS5hcHBseUVkaXRvclZhbHVlKCk7IH0gfSB9KTsKLSAgICAgKi8KLSAgICBJQ2VsbEVkaXRvckxpc3RlbmVyIGNlbGxFZGl0b3JMaXN0ZW5lciA9IG5ldyBJQ2VsbEVkaXRvckxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBjYW5jZWxFZGl0b3IoKQotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkLCBib29sZWFuIG5ld1N0YXRlKQotICAgICAgewotICAgICAgfQotICAgIH07Ci0gICAgZ2V0Q2VsbEVkaXRvcigpLmFkZExpc3RlbmVyKGNlbGxFZGl0b3JMaXN0ZW5lcik7Ci0KLSAgICBTdHJpbmdbXSBpdGVtID0gY29tYm8uZ2V0SXRlbXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGl0ZW1baV0uZXF1YWxzKGluaXRpYWxMYWJlbFRleHQpKQotICAgICAgewotICAgICAgICBnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUobmV3IEludGVnZXIoaSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBoYWNrLi4uIGZvciBzb21lIHJlYXNvbiB0aGUgQ29tYm9Cb3hDZWxsRWRpdG9yIGRvZXMndCBmaXJlIGFuCi0gIC8vIGVkaXRvclZhbHVlQ2hhbmdlZCB0byBzZXQgdGhlIGRpcnR5IGZsYWcKLSAgLy8gdW5sZXNzIHdlIG92ZXJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRydWUsIHRoZSBtYW5hZ2VyIGlzIG5vdCBub3RpZmllZAotICAvLyBvZiBjaGFuZ2VzIG1hZGUgaW4gdGhlIGNlbGwgZWRpdG9yCi0gIHByb3RlY3RlZCBib29sZWFuIGlzRGlydHkoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICAgIGJvb2xlYW4gaXNMYWJlbFRleHRJbkxpc3QgPSBmYWxzZTsKLSAgICBMaXN0IGxpc3QgPSBjb21wdXRlQ29tYm9Db250ZW50KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgaWYgKHN0cmluZy5lcXVhbHMobGFiZWwuZ2V0VGV4dCgpKSkKLSAgICAgIHsKLSAgICAgICAgaXNMYWJlbFRleHRJbkxpc3QgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWlzTGFiZWxUZXh0SW5MaXN0KQotICAgIHsKLSAgICAgIGxpc3QuYWRkKGxhYmVsLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgTGlzdCBzb3J0ZWRMaXN0ID0gY29tcHV0ZVNvcnRlZExpc3QobGlzdCk7Ci0gICAgU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nW3NvcnRlZExpc3Quc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmluZ0FycmF5W2ldID0gKFN0cmluZykgc29ydGVkTGlzdC5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBjcmVhdGVDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgc3RyaW5nQXJyYXkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZ1tdIHN0cmluZ0FycmF5KQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21ib0JveENlbGxFZGl0b3IoY29tcG9zaXRlLCBzdHJpbmdBcnJheSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZVNvcnRlZExpc3QoTGlzdCBsaXN0KQotICB7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdCBjb21wdXRlQ29tYm9Db250ZW50KCk7Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGVyZm9ybU1vZGlmeShPYmplY3QgdmFsdWUpOwotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgICBwdWJsaWMgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihMYWJlbCBsYWJlbCkKLSAgICB7Ci0gICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKQotICAgIHsKLSAgICAgIENDb21ibyBjb21ibyA9IChDQ29tYm8pIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCi0gICAgICAvLyBUT0RPOiBXZSdyZSBwdWxsaW5nIGEgZmFzdCBvbmUgaGVyZS4uLi4uIFRoaXMgaXMgYXNzdW1pbmcgd2UncmUgdXNpbmcgYQotICAgICAgLy8gQ0NvbWJvIGFzIG91ciB3aWRnZXQKLSAgICAgIC8vIE91ciBldmVudHVhbCAnQ29tYm8nIG1heSBub3QgZXZlbiB1c2UgQ0NvbWJvIHNvIHRoaXMgd2lsbCBtb3N0IGxpa2VseQotICAgICAgLy8gZ2V0IHJlcGxhY2VkLgotICAgICAgLy8gaW50IGRyb3BEb3duQnV0dG9uU2l6ZVggPSAxNjsKLQotICAgICAgUmVjdGFuZ2xlIGxhYmVsUGFyZW50Qm91bmRzID0gbGFiZWwuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgbGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShsYWJlbFBhcmVudEJvdW5kcyk7Ci0KLSAgICAgIGludCB4ID0gbGFiZWxQYXJlbnRCb3VuZHMueDsKLSAgICAgIGludCB5ID0gbGFiZWxQYXJlbnRCb3VuZHMueTsKLSAgICAgIGludCB3aWR0aEsgPSBsYWJlbFBhcmVudEJvdW5kcy53aWR0aDsKLSAgICAgIGludCBoZWlnaHQgPSBsYWJlbFBhcmVudEJvdW5kcy5oZWlnaHQ7Ci0gICAgICBjb21iby5zZXRCb3VuZHMoeCwgeSArIDEsIHdpZHRoSywgaGVpZ2h0IC0gMik7Ci0gICAgfQotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUKLSAgLy8gCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1FZGl0KENlbGxFZGl0b3IgY2VsbEVkaXRvcikKLSAgewotICAgIEFEVENvbWJvQm94Q2VsbEVkaXRvciBjb21ib0NlbGxFZGl0b3IgPSAoQURUQ29tYm9Cb3hDZWxsRWRpdG9yKSBjZWxsRWRpdG9yOwotICAgIENDb21ibyBjb21ibyA9IChDQ29tYm8pIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0gICAgaW50IGluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgT2JqZWN0IHZhbHVlID0gY29tYm8uZ2V0SXRlbShpbmRleCk7Ci0gICAgICBpZiAoY29tYm9DZWxsRWRpdG9yLmdldFNlbGVjdGVkVmFsdWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2YWx1ZSA9IGNvbWJvQ2VsbEVkaXRvci5nZXRTZWxlY3RlZFZhbHVlKCk7Ci0gICAgICB9Ci0KLSAgICAgIHBlcmZvcm1Nb2RpZnkodmFsdWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHR5cGVkVmFsdWUgPSBjb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoY29tYm8uaW5kZXhPZih0eXBlZFZhbHVlKSAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgcGVyZm9ybU1vZGlmeSh0eXBlZFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGNsb3NlTWF0Y2ggPSBnZXRDbG9zZU1hdGNoKHR5cGVkVmFsdWUsIGNvbWJvLmdldEl0ZW1zKCkpOwotICAgICAgICBpZiAoY2xvc2VNYXRjaCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcGVyZm9ybU1vZGlmeShjbG9zZU1hdGNoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5iZWVwKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsb3NlTWF0Y2goU3RyaW5nIHZhbHVlLCBTdHJpbmdbXSBpdGVtcykKLSAgewotICAgIGludCBtYXRjaEluZGV4ID0gLTE7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBpdGVtID0gaXRlbXNbaV07Ci0gICAgICBTdHJpbmcgYSA9IGdldExvY2FsTmFtZSh2YWx1ZSk7Ci0gICAgICBTdHJpbmcgYiA9IGdldExvY2FsTmFtZShpdGVtKTsKLSAgICAgIGlmIChhLmVxdWFsc0lnbm9yZUNhc2UoYikpCi0gICAgICB7Ci0gICAgICAgIG1hdGNoSW5kZXggPSBpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1hdGNoSW5kZXggIT0gLTEgPyBpdGVtc1ttYXRjaEluZGV4XSA6IG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldExvY2FsTmFtZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiAoaW5kZXggIT0gLTEpID8gc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIDEpIDogc3RyaW5nOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9FbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0VsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDExN2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0VsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyCi17Ci0gIHB1YmxpYyBFbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoSUZpZWxkIHBhcmFtZXRlciwgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsKQotICB7Ci0gICAgc3VwZXIocGFyYW1ldGVyLCBzb3VyY2UsIGxhYmVsKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCkKLSAgewotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIHJlc3VsdCA9IG51bGw7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzNGY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5JTmFtZWRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci0KLXB1YmxpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IKLXsKLSAgcHJvdGVjdGVkIElOYW1lZEVkaXRQYXJ0IG5hbWVkRWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBQb2ludCBjdXJzb3JMb2NhdGlvbjsKLQotICBwdWJsaWMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihJTmFtZWRFZGl0UGFydCBuYW1lZEVkaXRQYXJ0LCBQb2ludCBjdXJzb3JMb2NhdGlvbikKLSAgewotICAgIHRoaXMubmFtZWRFZGl0UGFydCA9IG5hbWVkRWRpdFBhcnQ7Ci0gICAgdGhpcy5jdXJzb3JMb2NhdGlvbiA9IGN1cnNvckxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCi0gICAgTGFiZWwgbGFiZWwgPSBuYW1lZEVkaXRQYXJ0LmdldE5hbWVMYWJlbEZpZ3VyZSgpOwotICAgIGlmICh0ZXh0LmdldEJvdW5kcygpLnggPD0gMCkKLSAgICB7Ci0gICAgICBpbnQgd2lkdGhUb1JlbW92ZSA9IDA7Ci0gICAgICAvLyBIQUNLIAotICAgICAgaWYgKG5hbWVkRWRpdFBhcnQgaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQmFzZUZpZWxkRWRpdFBhcnQgZmllbGQgPSAoQmFzZUZpZWxkRWRpdFBhcnQpbmFtZWRFZGl0UGFydDsKLSAgICAgICAgSUZpZWxkRmlndXJlIGZpZWxkRmlndXJlID0gZmllbGQuZ2V0RmllbGRGaWd1cmUoKTsgICAgIAotICAgICAgICB3aWR0aFRvUmVtb3ZlID0gZmllbGRGaWd1cmUuZ2V0VHlwZUxhYmVsKCkuZ2V0Qm91bmRzKCkud2lkdGg7ICAgICAgIAotICAgICAgICAvL1RPRE86ICEhIHBlcmhhcHMgdGhlIElGaWVsZEZpZ3VyZSBzaG91bGQganVzdCBoYXZlIGEgbWV0aG9kIHRvIGNvbXB1dGUgdGhpcz8KLSAgICAgICAgLy9MYWJlbCB0eXBlQW5ub3RhdGlvbkxhYmVsID0gKChGaWVsZEZpZ3VyZSkgZmllbGQuZ2V0RmlndXJlKCkpLmdldFR5cGVBbm5vdGF0aW9uTGFiZWwoKTsKLSAgICAgICAgLy9MYWJlbCBuYW1lQW5ub3RhdGlvbkxhYmVsID0gKChGaWVsZEZpZ3VyZSkgZmllbGQuZ2V0RmlndXJlKCkpLmdldE5hbWVBbm5vdGF0aW9uTGFiZWwoKTsKLSAgICAgICAgLy93aWR0aFRvUmVtb3ZlID0gdHlwZUxhYmVsLmdldEJvdW5kcygpLndpZHRoICsgdHlwZUFubm90YXRpb25MYWJlbC5nZXRCb3VuZHMoKS53aWR0aCArIG5hbWVBbm5vdGF0aW9uTGFiZWwuZ2V0Qm91bmRzKCkud2lkdGg7Ci0gICAgICB9Ci0gICAgIAotICAgICAgUmVjdGFuZ2xlIGJvdW5kaW5nUmVjdCA9IGxhYmVsLmdldFRleHRCb3VuZHMoKTsKLQotICAgICAgLy8gUmVkdWNlIHRoZSB3aWR0aCBieSB0aGUgYW1vdW50IHdlIHNoaWZ0ZWQgYWxvbmcgdGhlIHgtYXhpcwotICAgICAgaW50IGRlbHRhID0gTWF0aC5hYnMoYm91bmRpbmdSZWN0LnggLSBsYWJlbC5nZXRQYXJlbnQoKS5nZXRCb3VuZHMoKS54KTsKLQotICAgICAgbGFiZWwuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZGluZ1JlY3QpOwotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSB0cmltID0gdGV4dC5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLSAgICAgIGJvdW5kaW5nUmVjdC50cmFuc2xhdGUodHJpbS54LCB0cmltLnkpOwotICAgICAgYm91bmRpbmdSZWN0LmhlaWdodCA9IGJvdW5kaW5nUmVjdC5oZWlnaHQgLSB0cmltLnk7Ci0KLSAgICAgIGJvdW5kaW5nUmVjdC53aWR0aCA9IGxhYmVsLmdldFBhcmVudCgpLmdldEJvdW5kcygpLndpZHRoIC0gZGVsdGEgLSB3aWR0aFRvUmVtb3ZlOwotICAgICAgdGV4dC5zZXRCb3VuZHMoYm91bmRpbmdSZWN0LngsIGJvdW5kaW5nUmVjdC55LCBib3VuZGluZ1JlY3Qud2lkdGgsIGJvdW5kaW5nUmVjdC5oZWlnaHQpOwotCi0gICAgICAvLyBUcmFuc2xhdGUgcG9pbnQKLSAgICAgIGlmIChjdXJzb3JMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgCSAgUG9pbnQgdHJhbnNsYXRlZFBvaW50ID0gbmV3IFBvaW50KGN1cnNvckxvY2F0aW9uLnggLSBib3VuZGluZ1JlY3QueCwgY3Vyc29yTG9jYXRpb24ueSAtIGJvdW5kaW5nUmVjdC55KTsKLQotICAgIAkgIC8vIENhbGN1bGF0ZSB0ZXh0IG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2xhdGVkIHBvaW50Ci0gICAgCSAgdGV4dC5zZXRTZWxlY3Rpb24oMCwgMCk7Ci0gICAgCSAgaW50IHhDYXJldCA9IHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLng7Ci0gICAgCSAgaW50IG9mZnNldCA9IHRleHQuZ2V0Q2FyZXRQb3NpdGlvbigpOwotICAgIAkgIHdoaWxlICh4Q2FyZXQgPCB0cmFuc2xhdGVkUG9pbnQueCkKLSAgICAJICB7Ci0gICAgCQkgIHRleHQuc2V0U2VsZWN0aW9uKG9mZnNldCArIDEsIG9mZnNldCArIDEpOwotICAgIAkJICB4Q2FyZXQgPSB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS54OwotICAgIAkJICBpbnQgbmV3T2Zmc2V0ID0gdGV4dC5nZXRDYXJldFBvc2l0aW9uKCk7Ci0gICAgCQkgIGlmIChuZXdPZmZzZXQgPT0gb2Zmc2V0KQotICAgIAkJICB7Ci0gICAgCQkJICBicmVhazsKLSAgICAJCSAgfQotICAgIAkJICBvZmZzZXQrKzsKLSAgICAJICB9Ci0gICAgCSAgdGV4dC5zZXRTZWxlY3Rpb24ob2Zmc2V0LCBvZmZzZXQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvTGFiZWxFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvTGFiZWxFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODQzNDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5DZWxsRWRpdG9yQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5JTmFtZWRFZGl0UGFydDsKLQotcHVibGljIGNsYXNzIExhYmVsRWRpdE1hbmFnZXIgZXh0ZW5kcyBEaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlwcml2YXRlIElBY3Rpb25CYXJzIGFjdGlvbkJhcnM7Ci0JcHJpdmF0ZSBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlciBhY3Rpb25IYW5kbGVyOwotCXByaXZhdGUgSUFjdGlvbiBjb3B5LCBjdXQsIHBhc3RlLCB1bmRvLCByZWRvLCBmaW5kLCBzZWxlY3RBbGwsIGRlbGV0ZTsKLQlwcml2YXRlIEZvbnQgc2NhbGVkRm9udDsKLQotCXB1YmxpYyBMYWJlbEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihzb3VyY2UsIG51bGwsIGxvY2F0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlpZiAoYWN0aW9uSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlhY3Rpb25IYW5kbGVyLmRpc3Bvc2UoKTsKLQkJCWFjdGlvbkhhbmRsZXIgPSBudWxsOwotCQl9Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCXJlc3RvcmVTYXZlZEFjdGlvbnMoYWN0aW9uQmFycyk7Ci0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJCWFjdGlvbkJhcnMgPSBudWxsOwotCQl9Ci0KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNob3dGZWVkYmFjaygpIHsKLS8vICAgIHN1cGVyLnNob3dGZWVkYmFjaygpOwotCQlnZXRFZGl0UGFydCgpLnNob3dTb3VyY2VGZWVkYmFjayhnZXREaXJlY3RFZGl0UmVxdWVzdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5XUkFQKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJTGFiZWwgbGFiZWwgPSAoKElOYW1lZEVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXROYW1lTGFiZWxGaWd1cmUoKTsKLSAgICAKLQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCXNjYWxlZEZvbnQgPSBsYWJlbC5nZXRGb250KCk7Ci0JCQkKLQkJCUNvbG9yIGNvbG9yID0gbGFiZWwuZ2V0QmFja2dyb3VuZENvbG9yKCk7Ci0JCQl0ZXh0LnNldEJhY2tncm91bmQoY29sb3IpOwotCQkJCi0JCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGxhYmVsLmdldFRleHQoKTsKLQkJCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJfQotCQllbHNlIHsKLQkJCXNjYWxlZEZvbnQgPSBsYWJlbC5nZXRQYXJlbnQoKS5nZXRGb250KCk7Ci0JCQl0ZXh0LnNldEJhY2tncm91bmQobGFiZWwuZ2V0UGFyZW50KCkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQl9Ci0JCQotCQlGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotCQlEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotCQlsYWJlbC5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGZvbnRTaXplKTsKLQkJZGF0YS5zZXRIZWlnaHQoZm9udFNpemUuaGVpZ2h0KTsKLQkJc2NhbGVkRm9udCA9IG5ldyBGb250KG51bGwsIGRhdGEpOwotCQkKLQkJdGV4dC5zZXRGb250KHNjYWxlZEZvbnQpOwotLy8JCXRleHQuc2VsZWN0QWxsKCk7Ci0KLQkJLy8gSG9vayB0aGUgY2VsbCBlZGl0b3IncyBjb3B5L3Bhc3RlIGFjdGlvbnMgdG8gdGhlIGFjdGlvbkJhcnMgc28gdGhhdCB0aGV5IGNhbgotCQkvLyBiZSBpbnZva2VkIHZpYSBrZXlib2FyZCBzaG9ydGN1dHMuCi0JCWFjdGlvbkJhcnMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlzYXZlQ3VycmVudEFjdGlvbnMoYWN0aW9uQmFycyk7Ci0JCWFjdGlvbkhhbmRsZXIgPSBuZXcgQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIoYWN0aW9uQmFycyk7Ci0JCWFjdGlvbkhhbmRsZXIuYWRkQ2VsbEVkaXRvcihnZXRDZWxsRWRpdG9yKCkpOwotCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzdG9yZVNhdmVkQWN0aW9ucyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKXsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLCBjb3B5KTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwgcGFzdGUpOwotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUyNTA5Ci0JCS8vIERlbGV0ZSBhY3Rpb24gKGtleSkgZG9lc24ndCBhbHdheXMgd29yay4gIFRoZSBzYXZlZCBhY3Rpb24gY291bGQgYmUgdGhlIAotCQkvLyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcidzIERlbGV0ZUFjdGlvbkhhbmRsZXIuLi5kdWUgdG8gdGltaW5nIGlzc3Vlcy4KLQkJLy8gV2UnbGwgb25seSByZXN0b3JlIHRoZSBkZWxldGUgYWN0aW9uIGlmIGl0IGlzIGluZGVlZCB0aGUgb25lIGZvciB0aGUgRGVzaWduIHZpZXcuCi0JCS8vIFdlIHNob3VsZCB1cGRhdGUgdGhlIG90aGVyIGFjdGlvbnMgdG9vLCBidXQgY3VycmVudGx5LCBub25lIGFyZSBhcHBsaWNhYmxlLgotCQlpZiAoZGVsZXRlIGluc3RhbmNlb2YgQmFzZVNlbGVjdGlvbkFjdGlvbikKLQkJewotICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIGRlbGV0ZSk7Ci0JCX0KLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLCBzZWxlY3RBbGwpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgY3V0KTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuRklORC5nZXRJZCgpLCBmaW5kKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLCB1bmRvKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLCByZWRvKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZUN1cnJlbnRBY3Rpb25zKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJY29weSA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSk7Ci0JCXBhc3RlID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSk7Ci0gICAgSUFjdGlvbiBjdXJyZW50RGVsZXRlQWN0aW9uID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTI1MDkKLSAgICAvLyBEZWxldGUgYWN0aW9uIChrZXkpIGRvZXNuJ3QgYWx3YXlzIHdvcmsuICBUaGUgc2F2ZWQgYWN0aW9uIGNvdWxkIGJlIHRoZSAKLSAgICAvLyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcidzIERlbGV0ZUFjdGlvbkhhbmRsZXIuLi5kdWUgdG8gdGltaW5nIGlzc3Vlcy4KLSAgICAvLyBXZSdsbCBvbmx5IHJlc3RvcmUgdGhlIGRlbGV0ZSBhY3Rpb24gaWYgaXQgaXMgaW5kZWVkIHRoZSBvbmUgZm9yIHRoZSBEZXNpZ24gdmlldy4KLSAgICAvLyBXZSBzaG91bGQgdXBkYXRlIHRoZSBvdGhlciBhY3Rpb25zIHRvbywgYnV0IGN1cnJlbnRseSwgbm9uZSBhcmUgYXBwbGljYWJsZS4KLSAgICBpZiAoY3VycmVudERlbGV0ZUFjdGlvbiBpbnN0YW5jZW9mIEJhc2VTZWxlY3Rpb25BY3Rpb24pCi0gICAgewotICAgICAgZGVsZXRlID0gY3VycmVudERlbGV0ZUFjdGlvbjsKLSAgICB9Ci0JCXNlbGVjdEFsbCA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSk7Ci0JCWN1dCA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpKTsKLQkJZmluZCA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSk7Ci0JCXVuZG8gPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCkpOwotCQlyZWRvID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9SZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4Y2JjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9SZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIKLXsKLSAgcHJvdGVjdGVkIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBJRmllbGQgc2V0T2JqZWN0OwotCi0gIHB1YmxpYyBSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcihJRmllbGQgcGFyYW1ldGVyLCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgTGFiZWwgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihzb3VyY2UsIGxhYmVsKTsKLSAgICBlZGl0UGFydCA9IHNvdXJjZTsKLSAgICBzZXRPYmplY3QgPSBwYXJhbWV0ZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICAgIHJldHVybiBzdXBlci5jcmVhdGVDZWxsRWRpdG9yT24oY29tcG9zaXRlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGNvbXB1dGVDb21ib0NvbnRlbnQoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLSAgICBpZiAoZWRpdE1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgbGlzdC5hZGQoTWVzc2FnZXMuX1VJX0FDVElPTl9CUk9XU0UpOwotICAgICAgIGxpc3QuYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKTsKLSAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IHF1aWNrUGlja3NbaV07Ci0gICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgIH0gIAotICAgICAgIH0KLSAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gaGlzdG9yeSA9IGVkaXRNYW5hZ2VyLmdldEhpc3RvcnkoKTsKLSAgICAgICBpZiAoaGlzdG9yeSAhPSBudWxsKQotICAgICAgIHsKLSAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IGhpc3RvcnlbaV07Ci0gICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgIH0gIAotICAgICAgIH0KLSAgICB9IAotICAgIHJldHVybiBsaXN0OyAKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldENvbXBvbmVudFNwZWNpZmljYXRpb25Gb3JWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBlZGl0TWFuYWdlci5nZXRIaXN0b3J5KCk7Ci0gICAgICBpZiAoaGlzdG9yeSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBoaXN0b3J5Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gaGlzdG9yeVtpXTsKLSAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtTW9kaWZ5KE9iamVjdCB2YWx1ZSkKLSAgewotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLSAgICBpZiAoZWRpdE1hbmFnZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIC8vIG91ciBjcnVkZSBjb21ibyBib3ggY2FuIG9ubHkgd29yayB3aXRoICdTdHJpbmcnIG9iamVjdHMKLSAgICAvLyBpZiB3ZSBnZXQgYSBTdHJpbmcgYmFjayB3ZSBuZWVkIHRvIGRvIHNvbWUgY2xldmVyIG1hcHBpbmcgdG8gZ2V0IHRoZSBDb21wb25lbnRTcGVjaWZpY2F0aW9uIAotICAgIC8vICAgIAotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGdldENvbXBvbmVudFNwZWNpZmljYXRpb25Gb3JWYWx1ZSgoU3RyaW5nKXZhbHVlKTsgICAgIAotICAgIH0gIAotICAgIC8vIHdlIGFzc3VtZSB0aGUgc2VsZWN0ZWQgdmFsdWUgaXMgYWx3YXlzIG9mIHRoZSBmb3JtIG9mIGEgQ29tcG9uZW50U3BlY2lmaWNhdGlvbgotICAgIC8vIAotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pICAgICAgCi0gICAgewotICAgICAgLy8gd2UgbmVlZCB0byBwZXJmb3JtIGFuIGFzeW5jRXhlYyBoZXJlIHNpbmNlIHRoZSAnaG9zdCcgZWRpdHBhcnQgbWF5IGJlCi0gICAgICAvLyByZW1vdmVkIGFzIGEgc2lkZSBlZmZlY3Qgb2YgcGVyZm9ybWluZyB0aGUgYWN0aW9uICAgICAgICAgICAKLSAgICAgIERlbGF5ZWRTZXRSZWZlcmVuY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBEZWxheWVkU2V0UmVmZXJlbmNlUnVubmFibGUoZWRpdE1hbmFnZXIsIHNldE9iamVjdCwgKENvbXBvbmVudFNwZWNpZmljYXRpb24pdmFsdWUpOwotICAgICAgLy9ydW5uYWJsZS5ydW4oKTsKLSAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZVNvcnRlZExpc3QoTGlzdCBsaXN0KQotICB7Ci0gICAgLy8gcmV0dXJuIFR5cGVzSGVscGVyLnNvcnRMaXN0KGxpc3QpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZ1tdIHN0cmluZ0FycmF5KQotICB7Ci0gICAgQURUQ29tYm9Cb3hDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSBuZXcgQURUQ29tYm9Cb3hDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgc3RyaW5nQXJyYXksIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCkpOwotICAgIC8vKChBRFRDb21ib0JveENlbGxFZGl0b3IpIGNlbGxFZGl0b3IpLnNldE9iamVjdFRvTW9kaWZ5KHNldE9iamVjdCk7Ci0gICAgcmV0dXJuIGNlbGxFZGl0b3I7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKTsKLSAgCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKQotICB7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9ICAgIAotICAKLSAgcHJvdGVjdGVkIGNsYXNzIERlbGF5ZWRTZXRSZWZlcmVuY2VSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0gICAgcHJvdGVjdGVkIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgcHJvdGVjdGVkIElGaWVsZCBmaWVsZDsKLQotICAgIHB1YmxpYyBEZWxheWVkU2V0UmVmZXJlbmNlUnVubmFibGUoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIsCi0gICAgICAgIElGaWVsZCBzZXRPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gc2VsZWN0ZWRWYWx1ZSkKLSAgICB7Ci0gICAgICB0aGlzLmNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyID0gY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0gICAgICBuZXdWYWx1ZSA9IHNlbGVjdGVkVmFsdWU7Ci0gICAgICBmaWVsZCA9IHNldE9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShmaWVsZCwgbmV3VmFsdWUpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9UeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L1R5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmViYWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L1R5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgLy9Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyCi17Ci0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoSUZpZWxkIHBhcmFtZXRlciwgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsKQotICB7Ci0gICAgc3VwZXIocGFyYW1ldGVyLCBzb3VyY2UsIGxhYmVsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyKXJlc3VsdDsKLSAgICAgICAgICBtYW5hZ2VyLnNldFJlZmVyZW5jZXIoc2V0T2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQURURWRpdFBhcnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQyNjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQURURWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uQURURmxvYXRpbmdUb29sYmFyLkFEVEZsb2F0aW5nVG9vbGJhck1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQWJzdHJhY3RNb2RlbENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Db21wYXJ0bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkZvY3VzVHlwZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlJvb3RIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci0KLXB1YmxpYyBjbGFzcyBBRFRFZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkKLXsKLSAgcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkKLSAgewotICAgIEVkaXRQYXJ0IGNoaWxkID0gZG9DcmVhdGVFZGl0UGFydChjb250ZXh0LCBtb2RlbCk7Ci0gICAgY2hlY2tDaGlsZChjaGlsZCwgbW9kZWwpOwotICAgIHJldHVybiBjaGlsZDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGRvQ3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgRWRpdFBhcnQgY2hpbGQgPSBudWxsOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIENvbXBhcnRtZW50KQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IENvbXBhcnRtZW50RWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBSb290SG9sZGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IFJvb3RIb2xkZXJFZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEFEVEZsb2F0aW5nVG9vbGJhck1vZGVsKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IEFEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0KCgoQURURmxvYXRpbmdUb29sYmFyTW9kZWwpbW9kZWwpLmdldE1vZGVsKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IENvbHVtbkVkaXRQYXJ0KCk7Ci0gICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBGb2N1c1R5cGVDb2x1bW4pCi0gICAgICB7Ci0gICAgICAgIENvbHVtbkVkaXRQYXJ0IGNvbHVtbkVkaXRQYXJ0ID0gKENvbHVtbkVkaXRQYXJ0KWNoaWxkOwotICAgICAgICBjb2x1bW5FZGl0UGFydC5zZXRTcGFjaW5nKDYwKTsKLSAgICAgICAgY29sdW1uRWRpdFBhcnQuc2V0TWlub3JBbGlnbm1lbnQoVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOwotICAgICAgfSAgCi0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNvbXBsZXhUeXBlKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IENvbXBsZXhUeXBlRWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IFN0cnVjdHVyZUVkaXRQYXJ0KCk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgewotICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEVkaXRQYXJ0KQotICAgICAgeyAgCi0gICAgICAgIGNoaWxkID0gbmV3IEZpZWxkRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2hpbGQgPSBuZXcgVG9wTGV2ZWxGaWVsZEVkaXRQYXJ0KCk7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJTW9kZWwpCi0gICAgewotICAgICAgY2hpbGQgPSBuZXcgUm9vdENvbnRlbnRFZGl0UGFydCgpOwotICAgIH0KLSAgICByZXR1cm4gY2hpbGQ7ICAgCi0gIH0KLQotICAvKioKLSAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgYW5kIG5vdCBjaGVjayBmb3IgbnVsbAotICAgKiAKLSAgICogQHBhcmFtIGNoaWxkCi0gICAqIEBwYXJhbSBtb2RlbAotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDaGlsZChFZGl0UGFydCBjaGlsZCwgT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgaWYgKGNoaWxkID09IG51bGwpCi0gICAgewotICAgICAgLy8gVGhyZWFkLmR1bXBTdGFjaygpOwotICAgIH0KLSAgICBBc3NlcnQuaXNOb3ROdWxsKGNoaWxkKTsKLSAgICBjaGlsZC5zZXRNb2RlbChtb2RlbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQURURmxvYXRpbmdUb29sYmFyRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQURURmxvYXRpbmdUb29sYmFyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiZGFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VNb3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkNlbnRlcmVkSWNvbkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgSU1vZGVsIG1vZGVsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RyaWxsZWREb3duOwotICBwcm90ZWN0ZWQgQURUVG9vbGJhckJ1dHRvbiBiYWNrVG9TY2hlbWE7Ci0gIAotICBwdWJsaWMgQURURmxvYXRpbmdUb29sYmFyRWRpdFBhcnQoSU1vZGVsIG1vZGVsKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgVG9vbGJhckxheW91dCB0YiA9IG5ldyBUb29sYmFyTGF5b3V0KHRydWUpOwotICAgIHRiLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotICAgIHRiLnNldFNwYWNpbmcoMyk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIodGIpOwotICAgIAotICAgIGJhY2tUb1NjaGVtYSA9IG5ldyBBRFRUb29sYmFyQnV0dG9uKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJlbGNsMTYvc2NoZW1hdmlld19jby5naWYiKSk7Ci0gICAgYmFja1RvU2NoZW1hLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9IT1ZFUl9CQUNLX1RPX1NDSEVNQSk7Ci0gICAgYmFja1RvU2NoZW1hLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0vLyAgICBiYWNrVG9TY2hlbWEuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMCwgMCwgMjQsIDI0KSk7Ci0gICAgZmlndXJlLmFkZChiYWNrVG9TY2hlbWEpOwotICAgIGZpZ3VyZS5zZXRCb3VuZHMobmV3IFJlY3RhbmdsZSgwLDAsMjQsMjQpKTsKLSAgICAKLSAgICBhZGRUb1Rvb2xiYXIoZmlndXJlKTsgICAKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRUb1Rvb2xiYXIoSUZpZ3VyZSBmaWd1cmUpCi0gIHsKLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SXNEcmlsbGVkRG93bihib29sZWFuIGlzRHJpbGxlZERvd24pCi0gIHsKLSAgICB0aGlzLmlzRHJpbGxlZERvd24gPSBpc0RyaWxsZWREb3duOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgIGJhY2tUb1NjaGVtYS5pc0VuYWJsZWQgPSBpc0RyaWxsZWREb3duOwotICAgIGlmIChpc0RyaWxsZWREb3duKQotICAgIHsKLSAgICAgIGJhY2tUb1NjaGVtYS5pbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJlbGNsMTYvc2NoZW1hdmlld19jby5naWYiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGJhY2tUb1NjaGVtYS5pbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJkbGNsMTYvc2NoZW1hdmlld19jby5naWYiKTsKLSAgICB9Ci0gICAgYmFja1RvU2NoZW1hLnJlZnJlc2goKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZG9BY3Rpb24oTW91c2VFdmVudCBtZSkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAKLSAgICBpZiAoYmFja1RvU2NoZW1hLmdldEJvdW5kcygpLmNvbnRhaW5zKG1lLmdldExvY2F0aW9uKCkpKQotICAgIHsKLSAgICAgIFNldElucHV0VG9HcmFwaFZpZXcgYWN0aW9uID0gbmV3IFNldElucHV0VG9HcmFwaFZpZXcoZWRpdG9yUGFydCwgbW9kZWwpOwotICAgICAgYWN0aW9uLnJ1bigpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGNsYXNzIEFEVFRvb2xiYXJCdXR0b24gZXh0ZW5kcyBDZW50ZXJlZEljb25GaWd1cmUKLSAgewotICAgIHByb3RlY3RlZCBNb3VzZUxpc3RlbmVyIG1vdXNlTGlzdGVuZXI7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkOwotICAgIAotICAgIHB1YmxpYyBBRFRUb29sYmFyQnV0dG9uKEltYWdlIGltZykKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgICAgdGhpcy5pbWFnZSA9IGltZzsKLQotICAgICAgbW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZUxpc3RlbmVyLlN0dWIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQob3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQgbWUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNFbmFibGVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZEZlZWRiYWNrKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VFdmVudCBtZSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0VuYWJsZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlRmVlZGJhY2soKTsKLSAgICAgICAgICAgIGRvQWN0aW9uKG1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICBhZGRNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotICAgICAgYWRkTW91c2VNb3Rpb25MaXN0ZW5lcihuZXcgTW91c2VNb3Rpb25MaXN0ZW5lci5TdHViKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBtZSkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgICB7Ci0gICAgICBzZXRNb2RlKENlbnRlcmVkSWNvbkZpZ3VyZS5TRUxFQ1RFRCk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICAgIHsKLSAgICAgIHNldE1vZGUoQ2VudGVyZWRJY29uRmlndXJlLk5PUk1BTCk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlY3RhbmdsZSBnZXRCb3VuZHMoKQotICAgIHsKLSAgICAgIFJlY3RhbmdsZSByID0gc3VwZXIuZ2V0Qm91bmRzKCk7Ci0gICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLSAgICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKHIueCwgci55LCByZWN0LndpZHRoICsgOCwgcmVjdC5oZWlnaHQgKyA4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoaW50IGhpbnQsIGludCBoaW50MikKLSAgICB7Ci0gICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlIHJlY3QgPSBpbWFnZS5nZXRCb3VuZHMoKTsKLSAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKHJlY3Qud2lkdGggKyA4LCByZWN0LmhlaWdodCArIDgpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0JhY2tUb1NjaGVtYUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0JhY2tUb1NjaGVtYUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OWVkNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYWNrVG9TY2hlbWFFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JRmVlZGJhY2tIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURURGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQURUTXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuQ2VudGVyZWRJY29uRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEJhY2tUb1NjaGVtYUVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0IGltcGxlbWVudHMgSUZlZWRiYWNrSGFuZGxlcgotewotICBwcm90ZWN0ZWQgTXVsdGlQYWdlRWRpdG9yUGFydCBtdWx0aXBhZ2VFZGl0b3I7Ci0gIHByb3RlY3RlZCBBRFREaXJlY3RFZGl0UG9saWN5IGFkdERpcmVjdEVkaXRQb2xpY3kgPSBuZXcgQURURGlyZWN0RWRpdFBvbGljeSgpOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWQ7Ci0gIHByb3RlY3RlZCBDZW50ZXJlZEljb25GaWd1cmUgYmFja1RvU2NoZW1hOwotICBwcm90ZWN0ZWQgTW91c2VMaXN0ZW5lciBtb3VzZUxpc3RlbmVyOwotCi0gIHB1YmxpYyBCYWNrVG9TY2hlbWFFZGl0UGFydChBRFRNdWx0aVBhZ2VFZGl0b3IgbXVsdGlwYWdlRWRpdG9yKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLm11bHRpcGFnZUVkaXRvciA9IG11bHRpcGFnZUVkaXRvcjsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBiYWNrVG9TY2hlbWEgPSBuZXcgQ2VudGVyZWRJY29uRmlndXJlKCk7Ci0gICAgYmFja1RvU2NoZW1hLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgYmFja1RvU2NoZW1hLmltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oImVsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZiIpOwotICAgIC8vIFRPRE8sIGxvb2sgYXQgd2h5IHRoZSBlZGl0cG9saWN5IGRvZXNuJ3Qgd29yawotICAgIG1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGlja2VkKG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUV2ZW50IG1lKQotICAgICAgewotCi0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VFdmVudCBtZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzRW5hYmxlZCkKLSAgICAgICAgewotICAgICAgICAgIGFkZEZlZWRiYWNrKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VFdmVudCBtZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzRW5hYmxlZCkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgICAgICAgU2V0SW5wdXRUb0dyYXBoVmlldyBhY3Rpb24gPSBuZXcgU2V0SW5wdXRUb0dyYXBoVmlldyhtdWx0aXBhZ2VFZGl0b3IsIGdldE1vZGVsKCkpOwotICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgYmFja1RvU2NoZW1hLmFkZE1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci0gICAgcmV0dXJuIGJhY2tUb1NjaGVtYTsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpCi0gIHsKLSAgICB0aGlzLmlzRW5hYmxlZCA9IGlzRW5hYmxlZDsKLSAgICByZWZyZXNoVmlzdWFscygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgYWR0RGlyZWN0RWRpdFBvbGljeSk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCB8fCByZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsKLSAgICAgIFNldElucHV0VG9HcmFwaFZpZXcgYWN0aW9uID0gbmV3IFNldElucHV0VG9HcmFwaFZpZXcobXVsdGlwYWdlRWRpdG9yLCBnZXRNb2RlbCgpKTsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgIENlbnRlcmVkSWNvbkZpZ3VyZSBmaWd1cmUgPSAoQ2VudGVyZWRJY29uRmlndXJlKSBnZXRGaWd1cmUoKTsKLSAgICBpZiAoaXNFbmFibGVkKQotICAgIHsKLSAgICAgIGJhY2tUb1NjaGVtYS5pbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJlbGNsMTYvc2NoZW1hdmlld19jby5naWYiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGJhY2tUb1NjaGVtYS5pbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJkbGNsMTYvc2NoZW1hdmlld19jby5naWYiKTsKLSAgICB9Ci0gICAgZmlndXJlLnJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIENlbnRlcmVkSWNvbkZpZ3VyZSBmaWd1cmUgPSAoQ2VudGVyZWRJY29uRmlndXJlKSBnZXRGaWd1cmUoKTsKLSAgICBmaWd1cmUuc2V0TW9kZShDZW50ZXJlZEljb25GaWd1cmUuU0VMRUNURUQpOwotICAgIGZpZ3VyZS5yZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBDZW50ZXJlZEljb25GaWd1cmUgZmlndXJlID0gKENlbnRlcmVkSWNvbkZpZ3VyZSkgZ2V0RmlndXJlKCk7Ci0gICAgZmlndXJlLnNldE1vZGUoQ2VudGVyZWRJY29uRmlndXJlLk5PUk1BTCk7Ci0gICAgZmlndXJlLnJlZnJlc2goKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLSAgICBiYWNrVG9TY2hlbWEucmVtb3ZlTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLSAgICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YzU4MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlNjYWxhYmxlUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JRmVlZGJhY2tIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmlndXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQ29tbW9uTXVsdGlQYWdlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyLCBJQURUT2JqZWN0TGlzdGVuZXIsIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9BQ1RJT05fQVJSQVkgPSB7fTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3RlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGb2N1cyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNIaWdoQ29udHJhc3QgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRIaWdoQ29udHJhc3QoKTsKLSAgCi0gIHB1YmxpYyBJRmlndXJlRmFjdG9yeSBnZXRGaWd1cmVGYWN0b3J5KCkKLSAgewotICAgIEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgQXNzZXJ0LmlzVHJ1ZShmYWN0b3J5IGluc3RhbmNlb2YgSUZpZ3VyZUZhY3RvcnksICJFZGl0UGFydEZhY3RvcnkgbXVzdCBiZSBhbiBpbnN0YW5jZW9mIG9mIElGaWd1cmVGYWN0b3J5Iik7ICAgICAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIChJRmlndXJlRmFjdG9yeSlmYWN0b3J5OyAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIE9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUFjdGlvblByb3ZpZGVyKQotICAgIHsKLSAgICAgIHJldHVybiAoKElBY3Rpb25Qcm92aWRlciltb2RlbCkuZ2V0QWN0aW9ucyhvYmplY3QpOwotICAgIH0gIAotICAgIHJldHVybiBFTVBUWV9BQ1RJT05fQVJSQVk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZEFjdGlvbnNUb0xpc3QoTGlzdCBsaXN0LCBJQWN0aW9uW10gYWN0aW9ucykKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsaXN0LmFkZChhY3Rpb25zW2ldKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICB7Ci0gICAgc3VwZXIuYWN0aXZhdGUoKTsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgewotICAgICAgSUFEVE9iamVjdCBvYmplY3QgPSAoSUFEVE9iamVjdCltb2RlbDsKLSAgICAgIG9iamVjdC5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZ2V0Wm9vbU1hbmFnZXIoKSAhPSBudWxsKQotICAgICAgZ2V0Wm9vbU1hbmFnZXIoKS5hZGRab29tTGlzdGVuZXIoem9vbUxpc3RlbmVyKTsKLQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgewotICAgICAgSUFEVE9iamVjdCBvYmplY3QgPSAoSUFEVE9iamVjdCltb2RlbDsKLSAgICAgIG9iamVjdC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgfSAgIAotICAgIAotICAgIGlmIChnZXRab29tTWFuYWdlcigpICE9IG51bGwpCi0gICAgICBnZXRab29tTWFuYWdlcigpLnJlbW92ZVpvb21MaXN0ZW5lcih6b29tTGlzdGVuZXIpOyAgICAKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgICB9ICAKLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmVmcmVzaCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgIAotICAgIGJvb2xlYW4gZG9VcGRhdGVEZXNpZ24gPSBkb1VwZGF0ZURlc2lnbigpOwotICAgIGlmIChkb1VwZGF0ZURlc2lnbikKLSAgICB7Ci0gICAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQmFzZUVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgKChCYXNlRWRpdFBhcnQpIG9iaikucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAoKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIG9iaikucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgaXNTZWxlY3RlZCA9IHRydWU7Ci0gICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLSAgICByZWZyZXNoVmlzdWFscygpOwotICB9Ci0gIAotICBwdWJsaWMgWm9vbU1hbmFnZXIgZ2V0Wm9vbU1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuICgoU2NhbGFibGVSb290RWRpdFBhcnQpZ2V0Um9vdCgpKS5nZXRab29tTWFuYWdlcigpOwotICB9Ci0gIAotICBwdWJsaWMgUmVjdGFuZ2xlIGdldFpvb21lZEJvdW5kcyhSZWN0YW5nbGUgcikKLSAgewotICAgIGRvdWJsZSBmYWN0b3IgPSBnZXRab29tTWFuYWdlcigpLmdldFpvb20oKTsKLSAgICBpbnQgeCA9IChpbnQpTWF0aC5yb3VuZChyLnggKiBmYWN0b3IpOwotICAgIGludCB5ID0gKGludClNYXRoLnJvdW5kKHIueSAqIGZhY3Rvcik7Ci0gICAgaW50IHdpZHRoID0gKGludClNYXRoLnJvdW5kKHIud2lkdGggKiBmYWN0b3IpOwotICAgIGludCBoZWlnaHQgPSAoaW50KU1hdGgucm91bmQoci5oZWlnaHQgKiBmYWN0b3IpOwotCi0gICAgcmV0dXJuIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgWm9vbUxpc3RlbmVyIHpvb21MaXN0ZW5lciA9IG5ldyBab29tTGlzdGVuZXIoKQotICB7Ci0gICAgcHVibGljIHZvaWQgem9vbUNoYW5nZWQoZG91YmxlIHpvb20pCi0gICAgewotICAgICAgaGFuZGxlWm9vbUNoYW5nZWQoKTsKLSAgICB9Ci0gIH07Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlWm9vbUNoYW5nZWQoKQotICB7Ci0gICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkKLSAgewotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBpZiAod29ya2JlbmNoICE9IG51bGwpCi0gICAgewotICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLS8vICAgIEFzc2VydC5pc05vdE51bGwoZWRpdG9yUGFydCk7Ci0gICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LktFWSwgbmV3IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3koKQotICAgIHsgICAgICAKLSAgICAgIHB1YmxpYyBFZGl0UGFydCBnZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOyAgCi0gICAgICB9ICAgICAgICAgICAKLSAgICB9KTsgICAgICAgIAotICB9Ci0gIAotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgeyAgIAotICAgIHJldHVybiBudWxsOyAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbGVSZWFkT25seSgpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgaWYgKHdvcmtiZW5jaCAhPSBudWxsKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgaWYgKCEoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0IHx8IGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZVN0b3JlRWRpdG9ySW5wdXQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvLyBGb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxODI4MQotICAvLyBEb24ndCB3YW50IHRvIHJlZnJlc2ggdGhlIGRlc2lnbiB3aGVuIGNoYW5nZXMgYXJlIG1hZGUgaW4gdGhlIHNvdXJjZSB2aWV3LgotICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1VwZGF0ZURlc2lnbigpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgaWYgKHdvcmtiZW5jaCAhPSBudWxsKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgQ29tbW9uTXVsdGlQYWdlRWRpdG9yKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbW1vbk11bHRpUGFnZUVkaXRvciBlZGl0b3IgPSAoQ29tbW9uTXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICAgICAgR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChHcmFwaGljYWxWaWV3ZXIpZWRpdG9yLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gZW5zdXJlIHRoaXMgaXMgdGhlIHNhbWUgZWRpdG9yIHdlIGFyZSB3b3JraW5nIHdpdGggc2luY2UgdGhlIGFjdGl2ZSBlZGl0b3IgbWF5IG5vdCBiZSAKLSAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50LCBlZy4gYXQgc3RhcnR1cCwgdGhlcmUgY2FuIGJlIGFub3RoZXIgWFNEIEVkaXRvciBvcGVuIG9uIHRoZSBzb3VyY2UgcGFnZSwgc28gd2UgY291bGQgZW5kCi0gICAgICAgICAgICAvLyB1cCBub3QgcG9wdWxhdGluZyB0aGUgZGVzaWduIHZpZXcgaW5pdGFsbHkKLSAgICAgICAgICAgIGlmIChnZXRWaWV3ZXIoKSA9PSB2aWV3ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIElmIHNvdXJjZSBwYWdlIGlzIGFjdGl2ZSwgZG9uJ3QgdXBkYXRlIHRoZSBkZXNpZ24KLSAgICAgICAgICAgICAgcmV0dXJuICFlZGl0b3IuaXNTb3VyY2VQYWdlQWN0aXZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VGaWVsZEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VGaWVsZEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NGI2YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlRmllbGRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRHJhZ1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbENlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkxhYmVsRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuRm9jdXNUeXBlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURURGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLklBRFRVcGRhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklGaWVsZEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLkNvbm5lY3RhYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuR3JhcGhOb2RlRHJhZ1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgQmFzZUZpZWxkRWRpdFBhcnQgZXh0ZW5kcyBCYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydCBpbXBsZW1lbnRzIElOYW1lZEVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlOwotICBwcm90ZWN0ZWQgQURURGlyZWN0RWRpdFBvbGljeSBhZHREaXJlY3RFZGl0UG9saWN5ID0gbmV3IEFEVERpcmVjdEVkaXRQb2xpY3koKTsKLSAgcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgICAgICAgCi0gICAgSUZpZWxkRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZUZhY3RvcnkoKS5jcmVhdGVGaWVsZEZpZ3VyZShnZXRNb2RlbCgpKTsgICAgCi0gICAgZmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHVibGljIElGaWVsZEZpZ3VyZSBnZXRGaWVsZEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gKElGaWVsZEZpZ3VyZSlmaWd1cmU7Ci0gIH0KLSAKLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgLy8gRm9yIG5vdyB3ZSBvbmx5IHdhbnQgdG8gcHJvZHVjZSBvdXRib3VuZCBsaW5lcyBmcm9tIGEgRmllbGQgdG8gYSBUeXBlCi0gICAgLy8gd2hlbiB0aGUgZmllbGQgaW4gY29udGFpbmVkIGluIHRoZSAnZm9jdXMnIGVkaXQgcGFydCAgICAKLSAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IGdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotICAgIHsgIAotICAgICAgaWYgKHBhcmVudC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgRm9jdXNUeXBlQ29sdW1uKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcml2YXRlIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KElUeXBlIHR5cGUpCi0gIHsKLSAgICBDb2x1bW5FZGl0UGFydCBjb2x1bW5FZGl0UGFydCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBlZGl0UGFydCA9IHRoaXM7IGVkaXRQYXJ0ICE9IG51bGw7IGVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCkpCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29sdW1uRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGNvbHVtbkVkaXRQYXJ0ID0gKENvbHVtbkVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICBicmVhazsKLSAgICAgIH0gIAotICAgIH0gICAgIAotICAgIGlmIChjb2x1bW5FZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGdldCB0aGUgbmV4dCBjb2x1bW4KLSAgICAgIEVkaXRQYXJ0IHBhcmVudCA9IGNvbHVtbkVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgICAgTGlzdCBjb2x1bW5zID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICBpbnQgaW5kZXggPSBjb2x1bW5zLmluZGV4T2YoY29sdW1uRWRpdFBhcnQpOwotICAgICAgaWYgKGluZGV4ICsgMSA8IGNvbHVtbnMuc2l6ZSgpKQotICAgICAgeyAgCi0gICAgICAgIEVkaXRQYXJ0IG5leHRDb2x1bW4gPSAoRWRpdFBhcnQpY29sdW1ucy5nZXQoaW5kZXggKyAxKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmV4dENvbHVtbi5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgICBpZiAoY2hpbGQuZ2V0TW9kZWwoKSA9PSB0eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWRpdFBhcnQgZ2V0VGFyZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7IAotICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpZ2V0TW9kZWwoKTsKLSAgICBJVHlwZSB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgeyAgICAgIAotICAgICAgcmVzdWx0ID0gZ2V0VGFyZ2V0RVAodHlwZSk7IC8vZ2V0VGFyZ2V0RWRpdFBhcnQodHlwZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEbyBub3Qgb3ZlcnJpZGUKLSAgICogQHBhcmFtIHR5cGUKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGdldFRhcmdldEVQKElUeXBlIHR5cGUpCi0gIHsKLSAgICByZXR1cm4gZ2V0VGFyZ2V0RWRpdFBhcnQodHlwZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIGNvbm5lY3Rpb25GaWd1cmUgPSBudWxsOyAgIAotICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVmZXJlbmNlVHlwZVBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClnZXRUYXJnZXRDb25uZWN0aW9uRWRpdFBhcnQoKTsKLSAgICBpZiAocmVmZXJlbmNlVHlwZVBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlID0gbmV3IFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKCk7Ci0KLSAgICAgIGlmIChnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKSA9PSByZWZlcmVuY2VUeXBlUGFydC5nZXRGaWd1cmUoKSkKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRTb3VyY2VBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihnZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDEpKTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5SSUdIVCwgNSkpOwotICAgICAgfQotICAgICAgaW50IHRhcmdldEFuY2hvcllPZmZzZXQgPSA4OwotCi0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKHJlZmVyZW5jZVR5cGVQYXJ0LmdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuSEVBREVSX0xFRlQsIDAsIHRhcmdldEFuY2hvcllPZmZzZXQpKTsgCi0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBhZHREaXJlY3RFZGl0UG9saWN5KTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsgICAgICAgIAotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuRUFTVCkKLSAgICB7ICAgIAotICAgICAgcmVzdWx0ID0gZ2V0VGFyZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFBhcmVudCgpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFNlY3Rpb25FZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIFNlY3Rpb25FZGl0UGFydCBncm91cHMgPSAoU2VjdGlvbkVkaXRQYXJ0KSBjaGlsZDsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncm91cHMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBncm91cENoaWxkID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBFZGl0UGFydCBjb25uZWN0YWJsZSA9IGdldFBhcmVudENvbm5lY3RhYmxlRWRpdFBhcnQoKEVkaXRQYXJ0KWdyb3VwQ2hpbGQpOwotICAgICAgICAgICAgaWYgKGNvbm5lY3RhYmxlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGNvbm5lY3RhYmxlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB0aGlzOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gc3VwZXIuZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9ICgoQmFzZUVkaXRQYXJ0KWdldFBhcmVudCgpKS5kb0dldFJlbGF0aXZlRWRpdFBhcnQoZWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OyAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ29ubmVjdGFibGVFZGl0UGFydCBnZXRQYXJlbnRDb25uZWN0YWJsZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbm5lY3RhYmxlKQotICB7Ci0gICAgaWYgKGNvbm5lY3RhYmxlIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICB7Ci0gICAgICBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIgc3BhY2UgPSAoVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKSAoKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpY29ubmVjdGFibGUpLmdldE1vZGVsKCk7Ci0gICAgICBpZiAoc3BhY2UuZ2V0QWRhcHRlcigpID09IHRoaXMuZ2V0TW9kZWwoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChDb25uZWN0YWJsZUVkaXRQYXJ0KWNvbm5lY3RhYmxlOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25uZWN0YWJsZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IGNoaWxkID0gaS5uZXh0KCk7Ci0gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb25uZWN0YWJsZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBDb25uZWN0YWJsZUVkaXRQYXJ0IHIgPSBnZXRQYXJlbnRDb25uZWN0YWJsZUVkaXRQYXJ0KChFZGl0UGFydCljaGlsZCk7Ci0gICAgICAgIGlmIChyICE9IG51bGwpIHJldHVybiByOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIgc3BhY2UgPSAoVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKSAoKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpY2hpbGQpLmdldE1vZGVsKCk7Ci0gICAgICAgIGlmIChzcGFjZS5nZXRBZGFwdGVyKCkgPT0gdGhpcy5nZXRNb2RlbCgpICYmIGNvbm5lY3RhYmxlIGluc3RhbmNlb2YgQ29ubmVjdGFibGVFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoQ29ubmVjdGFibGVFZGl0UGFydCljb25uZWN0YWJsZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgIElGaWVsZEZpZ3VyZSBmaWd1cmUgPSBnZXRGaWVsZEZpZ3VyZSgpOwotICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGdldE1vZGVsKCk7Ci0gICAgCi0gICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldFRleHQoZmllbGQuZ2V0TmFtZSgpKTsKLSAgICBmaWd1cmUuZ2V0VHlwZUxhYmVsKCkuc2V0VGV4dChmaWVsZC5nZXRUeXBlTmFtZSgpKTsKLSAgICBmaWd1cmUucmVmcmVzaFZpc3VhbHMoZ2V0TW9kZWwoKSk7Ci0KLSAgICBmaWd1cmUucmVjb21wdXRlTGF5b3V0KCk7Ci0KLSAgICAoKEdyYXBoaWNhbEVkaXRQYXJ0KWdldFJvb3QoKSkuZ2V0RmlndXJlKCkuaW52YWxpZGF0ZVRyZWUoKTsKLSAgfQotCi0gIHB1YmxpYyBEcmFnVHJhY2tlciBnZXREcmFnVHJhY2tlcihSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gbmV3IEdyYXBoTm9kZURyYWdUcmFja2VyKHRoaXMpOwotICB9Ci0gIAotICAvKgotICBwdWJsaWMgSUFjdGlvbltdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIC8vIHdoZW4gYSBGaWVsZEVkaXRQYXJ0IGlzIHNlbGVjdGVkIGl0IHByb3ZpZGVzIGl0J3Mgb3duIGFjdGlvbnMKLSAgICAvLyBhcyB3ZWxsIGFzIHRob3NlIG9mIGl0J3MgcGFyZW50ICd0eXBlJyBlZGl0IHBhcnQKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgRWRpdFBhcnQgY29tcGFydG1lbnQgPSBnZXRQYXJlbnQoKTsKLSAgICBpZiAoY29tcGFydG1lbnQgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIEVkaXRQYXJ0IHR5cGUgPSBjb21wYXJ0bWVudC5nZXRQYXJlbnQoKTsKLSAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZSBpbnN0YW5jZW9mIElBY3Rpb25Qcm92aWRlcikKLSAgICAgIHsKLSAgICAgICAgSUFjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKElBY3Rpb25Qcm92aWRlcil0eXBlOwotICAgICAgICBhZGRBY3Rpb25zVG9MaXN0KGxpc3QsIHByb3ZpZGVyLmdldEFjdGlvbnMob2JqZWN0KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGFkZEFjdGlvbnNUb0xpc3QobGlzdCwgc3VwZXIuZ2V0QWN0aW9ucyhvYmplY3QpKTsKLSAgICBJQWN0aW9uW10gcmVzdWx0ID0gbmV3IElBY3Rpb25bbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0qLwotICAKLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RmllbGRGaWd1cmUoKS5nZXROYW1lTGFiZWwoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgCi0gICAgaWYgKCgoSUFEVE9iamVjdClnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkgfHwgaXNGaWxlUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVHx8Ci0gICAgICAgIHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotICAgICAgSUZpZWxkRmlndXJlIGZpZWxkRmlndXJlID0gZ2V0RmllbGRGaWd1cmUoKTsKLSAgICAgIE9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLSAgICAgIHsKLSAgICAgICAgTG9jYXRpb25SZXF1ZXN0IGxvY2F0aW9uUmVxdWVzdCA9IChMb2NhdGlvblJlcXVlc3QpcmVxdWVzdDsKLSAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotICAgICAgIAotICAgICAgICBpZiAoaGl0VGVzdChmaWVsZEZpZ3VyZS5nZXRUeXBlTGFiZWwoKSwgcCkpCi0gICAgICAgIHsKLSAgICAgICAgICBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBUeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoKElGaWVsZCltb2RlbCwgdGhpcywgZmllbGRGaWd1cmUuZ2V0VHlwZUxhYmVsKCkpOwotICAgICAgICAgIFR5cGVVcGRhdGVDb21tYW5kIHR5cGVVcGRhdGVDb21tYW5kID0gbmV3IFR5cGVVcGRhdGVDb21tYW5kKCk7Ci0gICAgICAgICAgdHlwZVVwZGF0ZUNvbW1hbmQuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0gICAgICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKHR5cGVVcGRhdGVDb21tYW5kKTsKLSAgICAgICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChoaXRUZXN0KGZpZWxkRmlndXJlLmdldE5hbWVMYWJlbCgpLCBwKSkKLSAgICAgICAgewotICAgICAgICAJZGlyZWN0RWRpdE5hbWVGaWVsZCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAJICBkaXJlY3RFZGl0TmFtZUZpZWxkKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkaXJlY3RFZGl0TmFtZUZpZWxkKCkKLSAgewotICAgIGlmIChpc0ZpbGVSZWFkT25seSgpKSByZXR1cm47Ci0JICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCSAgSUZpZWxkRmlndXJlIGZpZWxkRmlndXJlID0gZ2V0RmllbGRGaWd1cmUoKTsKLSAgCWlmICggbW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpIAotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIG1vZGVsOwotICAgICAgaWYgKGZpZWxkLmlzUmVmZXJlbmNlKCkpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IEVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcigoSUZpZWxkKSBtb2RlbCwgdGhpcywgZmllbGRGaWd1cmUuZ2V0TmFtZUxhYmVsKCkpOwotICAgICAgICBSZWZlcmVuY2VVcGRhdGVDb21tYW5kIGVsZW1lbnRVcGRhdGVDb21tYW5kID0gbmV3IFJlZmVyZW5jZVVwZGF0ZUNvbW1hbmQoKTsKLSAgICAgICAgZWxlbWVudFVwZGF0ZUNvbW1hbmQuc2V0RGVsZWdhdGUobWFuYWdlcik7Ci0gICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZChlbGVtZW50VXBkYXRlQ29tbWFuZCk7Ci0gICAgICAgIG1hbmFnZXIuc2hvdygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBMYWJlbEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTGFiZWxFZGl0TWFuYWdlcih0aGlzLCBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcih0aGlzLCBudWxsKSk7Ci0gICAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQod3JhcHBlcik7Ci0gICAgICAgIG1hbmFnZXIuc2hvdygpOwotICAgICAgfQotICAJfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb0VkaXROYW1lKGJvb2xlYW4gYWRkRnJvbURlc2lnbikKLSAgewotICAgIGlmICghYWRkRnJvbURlc2lnbikgcmV0dXJuOwotICAgIAotLy8gICAgcmVtb3ZlRmVlZGJhY2soKTsKLQotICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gKChYU0RCYXNlQWRhcHRlcilnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgUG9pbnQgcCA9IGdldE5hbWVMYWJlbEZpZ3VyZSgpLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgTGFiZWxFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IExhYmVsRWRpdE1hbmFnZXIoQmFzZUZpZWxkRWRpdFBhcnQudGhpcywgbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoQmFzZUZpZWxkRWRpdFBhcnQudGhpcywgcCkpOwotICAgICAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotICAgICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZCh3cmFwcGVyKTsKLSAgICAgICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQotICB9Ci0gIAotICBwcm90ZWN0ZWQgY2xhc3MgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyIGV4dGVuZHMgQ29tbWFuZCBpbXBsZW1lbnRzIElBRFRVcGRhdGVDb21tYW5kCi0gIHsKLSAgICBDb21tYW5kIGNvbW1hbmQ7Ci0gICAgcHJvdGVjdGVkIERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgCi0gICAgcHVibGljIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KQotICAgIHsKLSAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpZ2V0TW9kZWwoKTsKLSAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCk7Ci0gICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBmaWVsZC5nZXRVcGRhdGVOYW1lQ29tbWFuZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgIH0KLSAgfQotICAKLSAgY2xhc3MgVHlwZVVwZGF0ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIGltcGxlbWVudHMgSUFEVFVwZGF0ZUNvbW1hbmQKLSAgewotICAgIHByb3RlY3RlZCBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyIGRlbGVnYXRlOwotICAgIHByb3RlY3RlZCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0OwotICAgIAotICAgIHB1YmxpYyBUeXBlVXBkYXRlQ29tbWFuZCgpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfVFlQRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVsZWdhdGUoQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlciBkZWxlZ2F0ZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgewotICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgewotICAgICAgaWYgKGRlbGVnYXRlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRlbGVnYXRlLnBlcmZvcm1FZGl0KHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKWdldE1vZGVsKCk7Ci0gICAgICBPYmplY3QgbmV3VmFsdWUgPSAoKENDb21ibylyZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkpLmdldFRleHQoKTsKLSAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICFuZXdWYWx1ZS5lcXVhbHMoZmllbGQuZ2V0VHlwZU5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBSZWZlcmVuY2VVcGRhdGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCBpbXBsZW1lbnRzIElBRFRVcGRhdGVDb21tYW5kCi0gIHsKLQkgICAgcHJvdGVjdGVkIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIgZGVsZWdhdGU7Ci0JICAgIHByb3RlY3RlZCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0OwotCSAgICAKLQkgICAgcHVibGljIFJlZmVyZW5jZVVwZGF0ZUNvbW1hbmQoKQotCSAgICB7Ci0JICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0UpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIHZvaWQgc2V0RGVsZWdhdGUoQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlciBkZWxlZ2F0ZSkKLQkgICAgewotCSAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkKLQkgICAgewotCSAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLQkgICAgewotCSAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIGRlbGVnYXRlLnBlcmZvcm1FZGl0KHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpKTsKLQkgICAgICB9Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLQkgICAgewotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIC8vIFB1dCBiYWNrIGNvbm5lY3Rpb24gZmlndXJlIHNvIGl0IHdvbid0IGdldCBvdmVybGF5ZWQgYnkgb3RoZXIgbm9uIGhpZ2hsaWdodGVkIGNvbm5lY3Rpb25zCi0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBuZXcgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24oKTsKLSAgICAgIGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRTb3VyY2VBbmNob3IoY29ubmVjdGlvbkZpZ3VyZS5nZXRTb3VyY2VBbmNob3IoKSk7Ci0gICAgICBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKGNvbm5lY3Rpb25GaWd1cmUuZ2V0VGFyZ2V0QW5jaG9yKCkpOwotICAgICAgY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEhpZ2hsaWdodCh0cnVlKTsKLSAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkZFRURCQUNLX0xBWUVSKS5hZGQoY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLSAgICB9Ci0gICAgIHN1cGVyLmFkZEZlZWRiYWNrKCk7Ci0gICAgIGdldEZpZWxkRmlndXJlKCkuYWRkU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgaWYgKGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgICAgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuRkVFREJBQ0tfTEFZRVIpLnJlbW92ZShjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotICAgIH0KLSAgICBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotICAgIHN1cGVyLnJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgZ2V0RmllbGRGaWd1cmUoKS5yZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAzY2U0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JRmVlZGJhY2tIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuSUFEVFVwZGF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHNvbWUgYmFzZSBmdW5jdGlvbiB0byBlbmFibGUgZHJhd2luZyBjb25uZWN0aW9ucyB0byBhIHJlZmVyZW5jZWQgdHlwZQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0IGltcGxlbWVudHMgSUZlZWRiYWNrSGFuZGxlciwgSUNvbm5lY3Rpb25Db250YWluZXIKLXsKLSAgcHJpdmF0ZSBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlOyAgCi0gIAotICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpCi0gIHsKLSAgICBzdXBlci5hY3RpdmF0ZSgpOyAgICAgICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIGRlYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoQ29ubmVjdGlvbnMoKQotICB7Ci0gICAgZGVhY3RpdmF0ZUNvbm5lY3Rpb24oKTsgICAgIAotICAgIGFjdGl2YXRlQ29ubmVjdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVDb25uZWN0aW9uKCkKLSAgeyAgICAKLSAgICAvLyBJZiBhcHByb3ByaWF0ZSwgY3JlYXRlIG91ciBjb25uZWN0aW9uRmlndXJlIGFuZCBhZGQgaXQgdG8gdGhlIGFwcHJvcHJpYXRlIGxheWVyCi0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmUgPT0gbnVsbCAmJiBzaG91bGREcmF3Q29ubmVjdGlvbigpKQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhY3RpdmF0ZWVDb25uZWN0aW9uKCktcHJlOiIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7ICAgICAgICAgICAKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUgPSBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCk7Ci0gICAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIC8vIEFkZCBvdXIgZWRpdHBvbGljeSBhcyBhIGxpc3RlbmVyIG9uIHRoZSBjb25uZWN0aW9uLCBzbyBpdCBjYW4gc3RheSBpbiBzeW5jaAotICAgICAgICAvL2Nvbm5lY3Rpb25GaWd1cmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigoQXR0cmlidXRlU2VsZWN0aW9uRmVlZGJhY2tQb2xpY3kpIGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSkpOwotICAgICAgICAvL2Nvbm5lY3Rpb25GaWd1cmUuYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikuYWRkKGNvbm5lY3Rpb25GaWd1cmUpOwotICAgICAgfSAgCi0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkZWFjdGl2YXRlQ29ubmVjdGlvbigpCi0gIHsKLSAgICAvLyBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiwgcmVtb3ZlIGl0Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKS5yZW1vdmUoY29ubmVjdGlvbkZpZ3VyZSk7Ci0gICAgICAvLyBSZW1vdmUgb3VyIGVkaXRwb2xpY3kgbGlzdGVuZXIocykKLSAgICAgIC8vY29ubmVjdGlvbkZpZ3VyZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKChBdHRyaWJ1dGVTZWxlY3Rpb25GZWVkYmFja1BvbGljeSkgZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFKSk7Ci0gICAgICAvL2Nvbm5lY3Rpb25GaWd1cmUucmVtb3ZlTW91c2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUgPSBudWxsOwotICAgIH0KLSAgfSAgCi0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREcmF3Q29ubmVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGFic3RyYWN0IFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKTsKLSAgCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIGlmIChjb25uZWN0aW9uRmlndXJlICE9IG51bGwpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQodHJ1ZSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgZXh0ZW5kcyBDb21tYW5kIGltcGxlbWVudHMgSUFEVFVwZGF0ZUNvbW1hbmQKLSAgewotICAgIENvbW1hbmQgY29tbWFuZDsKLSAgICBwcm90ZWN0ZWQgRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdDsKLSAgICAKLSAgICBwdWJsaWMgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyKCkKLSAgICB7Ci0gICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9OQU1FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpCi0gICAgewotICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgewotICAgICAgSVR5cGUgaVR5cGUgPSAoSVR5cGUpZ2V0TW9kZWwoKTsKLSAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCk7Ci0gICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBpVHlwZS5nZXRVcGRhdGVOYW1lQ29tbWFuZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhpdFRlc3QoSUZpZ3VyZSB0YXJnZXQsIFBvaW50IGxvY2F0aW9uKQotICB7Ci0gICAgUmVjdGFuZ2xlIGIgPSB0YXJnZXQuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgIHRhcmdldC50cmFuc2xhdGVUb0Fic29sdXRlKGIpOyAgCi0gICAgcmV0dXJuIGIuY29udGFpbnMobG9jYXRpb24pOwotICB9ICAgCi0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsgICAgICAgIAotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuV0VTVCkKLSAgICB7ICAgIAotICAgICAgcmVzdWx0ID0gZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpOwotICAgIH0KLSAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuRUFTVCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBnZXRDb25uZWN0aW9uRWRpdFBhcnQoUG9zaXRpb25Db25zdGFudHMuRUFTVCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAgCi0gIH0gICAgICAgIAotICAKLSAgcHJpdmF0ZSBFZGl0UGFydCBnZXRDb25uZWN0aW9uRWRpdFBhcnQoaW50IGRpcmVjdGlvbikKLSAgewotICAgIC8vIGZpbmQgdGhlIGZpcnN0IGNvbm5lY3Rpb24gdGhhdCB0YXJnZXRzIHRoaXMgZWRpdFBhcnQKLSAgICAvLyBuYXZpZ2F0ZSBiYWNrd2FyZCBhbG9uZyB0aGUgY29ubmVjdGlvbiAodG8gdGhlIGxlZnQpIHRvIGZpbmQgdGhlIHNvdXJjZSBlZGl0IHBhcnQKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIGlmIChmaWd1cmUgaW5zdGFuY2VvZiBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gdHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gPSAoVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24pZmlndXJlOwotICAgICAgICBDb25uZWN0aW9uQW5jaG9yIHRoaXNBbmNob3IgPSBudWxsOwotICAgICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpCi0gICAgICAgIHsKLSAgICAgICAgICB0aGlzQW5jaG9yID0gdHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24uZ2V0U291cmNlQW5jaG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpCi0gICAgICAgIHsKLSAgICAgICAgICB0aGlzQW5jaG9yID0gdHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24uZ2V0VGFyZ2V0QW5jaG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXNBbmNob3IgIT0gbnVsbCAmJiB0aGlzQW5jaG9yLmdldE93bmVyKCkgPT0gZ2V0RmlndXJlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBDb25uZWN0aW9uQW5jaG9yIG91dEFuY2hvciA9IG51bGw7Ci0gICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dEFuY2hvciA9IHR5cGVSZWZlcmVuY2VDb25uZWN0aW9uLmdldFRhcmdldEFuY2hvcigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuV0VTVCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRBbmNob3IgPSB0eXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5nZXRTb3VyY2VBbmNob3IoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKG91dEFuY2hvciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElGaWd1cmUgc291cmNlRmlndXJlID0gb3V0QW5jaG9yLmdldE93bmVyKCk7ICAgICAgICAgIAotICAgICAgICAgICAgRWRpdFBhcnQgcGFydCA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSAocGFydCA9PSBudWxsICYmIHNvdXJjZUZpZ3VyZSAhPSBudWxsKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFydCA9IChFZGl0UGFydClnZXRWaWV3ZXIoKS5nZXRWaXN1YWxQYXJ0TWFwKCkuZ2V0KHNvdXJjZUZpZ3VyZSk7Ci0gICAgICAgICAgICAgIHNvdXJjZUZpZ3VyZSA9IHNvdXJjZUZpZ3VyZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQgPSBwYXJ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0JveEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0JveEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTg1ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Cb3hFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Db21wYXJ0bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLlNpbXBsZURpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5Cb3hGaWd1cmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCb3hFZGl0UGFydCBleHRlbmRzIEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0IC8vSUZlZWRiYWNrSGFuZGxlcgoteyAgCi0gIHByb3RlY3RlZCBMaXN0IGNvbXBhcnRtZW50TGlzdCA9IG51bGw7Ci0gIHByb3RlY3RlZCBTaW1wbGVEaXJlY3RFZGl0UG9saWN5IHNpbXBsZURpcmVjdEVkaXRQb2xpY3kgPSBuZXcgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSgpOwotCi0gIHByb3RlY3RlZCBDb21wYXJ0bWVudFtdIGdldENvbXBhcnRtZW50cygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEJveEZpZ3VyZSBmaWd1cmUgPSBuZXcgQm94RmlndXJlKCk7Ci0gICAgTGluZUJvcmRlciBib3hMaW5lQm9yZGVyID0gbmV3IExpbmVCb3JkZXIoMSk7Ci0gICAgZmlndXJlLnNldEJvcmRlcihib3hMaW5lQm9yZGVyKTsgICAgCi0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLSAgICB0b29sYmFyTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7Ci0gICAgLy8gd2Ugc2hvdWxkIG9yZ2FuaXplIElUcmVlRWxlbWVudCBhbmQgaW50ZWdyYXRlIGl0IHdpdGggdGhlIGZhY2FkZQotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRJY29uKCgoSVRyZWVFbGVtZW50KWdldE1vZGVsKCkpLmdldEltYWdlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gKChCb3hGaWd1cmUpZ2V0RmlndXJlKCkpLmdldENvbnRlbnRQYW5lKCk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBBRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3koKSk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBzaW1wbGVEaXJlY3RFZGl0UG9saWN5KTsKLSAgfQotICAKLSAgIAotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBCb3hGaWd1cmUgYm94RmlndXJlID0gKEJveEZpZ3VyZSlmaWd1cmU7Ci0gICAgTGluZUJvcmRlciBib3hGaWd1cmVMaW5lQm9yZGVyID0gKExpbmVCb3JkZXIpYm94RmlndXJlLmdldEJvcmRlcigpOwotICAgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0V2lkdGgoMik7Ci0gICAgYm94RmlndXJlTGluZUJvcmRlci5zZXRDb2xvcihDb2xvckNvbnN0YW50cy5kYXJrQmx1ZSk7ICAKLSAgICBib3hGaWd1cmUuZ2V0SGVhZGluZ0ZpZ3VyZSgpLnNldFNlbGVjdGVkKHRydWUpOwotICAgIGZpZ3VyZS5yZXBhaW50KCk7Ci0gICAgc3VwZXIuYWRkRmVlZGJhY2soKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgQm94RmlndXJlIGJveEZpZ3VyZSA9IChCb3hGaWd1cmUpZmlndXJlOwotICAgIExpbmVCb3JkZXIgYm94RmlndXJlTGluZUJvcmRlciA9IChMaW5lQm9yZGVyKWJveEZpZ3VyZS5nZXRCb3JkZXIoKTsKLSAgICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldFdpZHRoKDEpOwotICAgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0Q29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIGJveEZpZ3VyZS5nZXRIZWFkaW5nRmlndXJlKCkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgIGZpZ3VyZS5yZXBhaW50KCk7Ci0gICAgc3VwZXIucmVtb3ZlRmVlZGJhY2soKTsgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeShJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICByZXR1cm4gKEFjdGlvblJlZ2lzdHJ5KSBlZGl0b3IuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gIH0KLX0gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9DZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTNiOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9DZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5DZW50ZXJlZEljb25GaWd1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25BbmNob3IKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUID0gMzsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUFERVJfTEVGVCA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhFQURFUl9SSUdIVCA9IDU7Ci0KLSAgcHJpdmF0ZSBpbnQgbG9jYXRpb247Ci0gIHByaXZhdGUgaW50IGluc2V0OwotICBwcml2YXRlIGludCBvZmZzZXQgPSAwOwotICBwcml2YXRlIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciBvdGhlcjsKLQotICBwdWJsaWMgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKElGaWd1cmUgb3duZXIsIGludCBsb2NhdGlvbiwgaW50IGluc2V0KQotICB7Ci0gICAgc3VwZXIob3duZXIpOwotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB0aGlzLmluc2V0ID0gaW5zZXQ7Ci0gIH0KLQotICBwdWJsaWMgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKElGaWd1cmUgb3duZXIsIGludCBsb2NhdGlvbiwgaW50IGluc2V0LCBpbnQgb2Zmc2V0KQotICB7Ci0gICAgdGhpcyhvd25lciwgbG9jYXRpb24sIGluc2V0KTsKLSAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKLSAgfQotCi0gIHB1YmxpYyBQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpCi0gIHsKLSAgICBSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCk7Ci0gICAgaW50IHgsIHk7Ci0gICAgc3dpdGNoIChsb2NhdGlvbikKLSAgICB7Ci0gICAgY2FzZSBUT1A6Ci0gICAgICB4ID0gci5yaWdodCgpIC0gci53aWR0aCAvIDIgKyBvZmZzZXQ7Ci0gICAgICB5ID0gci55ICsgaW5zZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJPVFRPTToKLSAgICAgIHggPSByLnJpZ2h0KCkgLSByLndpZHRoIC8gMiArIG9mZnNldDsKLSAgICAgIHkgPSByLmJvdHRvbSgpIC0gaW5zZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExFRlQ6Ci0gICAgICB4ID0gci54ICsgaW5zZXQ7Ci0gICAgICB5ID0gci5ib3R0b20oKSAtIHIuaGVpZ2h0IC8gMiArIG9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUklHSFQ6Ci0gICAgICB4ID0gci5yaWdodCgpIC0gaW5zZXQ7Ci0gICAgICB5ID0gci5ib3R0b20oKSAtIHIuaGVpZ2h0IC8gMiArIG9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSEVBREVSX0xFRlQ6Ci0gICAgICB4ID0gci54ICsgaW5zZXQ7Ci0gICAgICB5ID0gci55ICsgb2Zmc2V0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIRUFERVJfUklHSFQ6Ci0gICAgICB4ID0gci5yaWdodCgpIC0gaW5zZXQ7Ci0gICAgICB5ID0gci55ICsgb2Zmc2V0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgeCA9IHIucmlnaHQoKSAtIHIud2lkdGggLyAyOwotICAgICAgeSA9IHIuYm90dG9tKCkgLSByLmhlaWdodCAvIDI7Ci0gICAgfQotICAgIFBvaW50IHAgPSBuZXcgUG9pbnQoeCwgeSk7Ci0KLSAgICBpZiAoIShnZXRPd25lcigpIGluc3RhbmNlb2YgQ2VudGVyZWRJY29uRmlndXJlKSkKLSAgICB7Ci0gICAgICBnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocCk7Ci0gICAgfQotICAgIAotICAgIGlmIChvdGhlciAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGlmIHdpdGhpbiBvbmx5IG9uZSBwaXhlbCBvZiBiZWluZyB2ZXJ0aWNhbCwgd2Ugc3RyYWlnaHRlbiB1cCB0aGUgbGluZQotICAgICAgUG9pbnQgcDIgPSBvdGhlci5nZXRMb2NhdGlvbihudWxsKTsKLSAgICAgIGlmIChNYXRoLmFicyhwMi54IC0gcC54KSA8PSAxKQotICAgICAgewotICAgICAgICBwLnggPSBwMi54OwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHA7Ci0gIH0KLQotICBwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKQotICB7Ci0gICAgcmV0dXJuIGdldExvY2F0aW9uKG51bGwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T3RoZXIoQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yIG90aGVyKQotICB7Ci0gICAgdGhpcy5vdGhlciA9IG90aGVyOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29sdW1uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29sdW1uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViNDA5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbHVtbkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5BYnN0cmFjdE1vZGVsQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlJlZmVyZW5jZWRUeXBlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBDb2x1bW5FZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAoteyAgICAgICAgIAotICBwcm90ZWN0ZWQgaW50IHNwYWNpbmcgPSAyMDsgIAotICBwcm90ZWN0ZWQgaW50IG1pbm9yQWxpZ25tZW50ID0gLTE7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbCA9IGZhbHNlOwotICAKLSAgcHVibGljIENvbHVtbkVkaXRQYXJ0KCkKLSAgeyAgICAKLSAgfQotCi0gIHB1YmxpYyBDb2x1bW5FZGl0UGFydChib29sZWFuIGlzSG9yaXpvbnRhbCkKLSAgewotICAgIHRoaXMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgRmlndXJlIGZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGlzSG9yaXpvbnRhbCk7Ci0gICAKLSAgICBpZiAobWlub3JBbGlnbm1lbnQgIT0gLTEpCi0gICAgeyAgCi0gICAgICBsYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQobWlub3JBbGlnbm1lbnQpOwotICAgIH0gIAotICAgIGxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsKLSAgICBsYXlvdXQuc2V0U3BhY2luZyhzcGFjaW5nKTsKLSAgICBmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNwYWNpbmcoaW50IHNwYWNpbmcpCi0gIHsKLSAgICB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOwotICAgIGlmIChmaWd1cmUgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgICgoVG9vbGJhckxheW91dClmaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpKS5zZXRTcGFjaW5nKHNwYWNpbmcpOwotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgSUNvbXBsZXhUeXBlIGdldENvbXBsZXhUeXBlKCkKLSAgewotICAgIHJldHVybiAoSUNvbXBsZXhUeXBlKWdldE1vZGVsKCk7ICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgeyAKLSAgICBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKWdldE1vZGVsKCk7Ci0gICAgcmV0dXJuIGNvbGxlY3Rpb24uZ2V0Q2hpbGRyZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWlub3JBbGlnbm1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG1pbm9yQWxpZ25tZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWlub3JBbGlnbm1lbnQoaW50IG1pbm9yQWxpZ25tZW50KQotICB7Ci0gICAgdGhpcy5taW5vckFsaWdubWVudCA9IG1pbm9yQWxpZ25tZW50OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBSZWZlcmVuY2VkVHlwZUNvbHVtbikKLSAgICB7Ci0gICAgICBpZiAoZ2V0UGFyZW50KCkuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKSAKLSAgICAgIHsgICAgICAgIAotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClnZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICAgICAgcmVmcmVzaENvbm5lY3Rpb25zKGVkaXRQYXJ0KTsKLSAgICAgIH0gIAotICAgIH0gICAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVmcmVzaENvbm5lY3Rpb25zKHRoaXMpOyAgICAgIAotICAgIH0gIAotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaENvbm5lY3Rpb25zKEVkaXRQYXJ0IHBhcmVudCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHBhcmVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7ICAgICAgCi0gICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBCYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQgY29ubmVjdGluZ0VkaXRQYXJ0ID0gKEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICBjb25uZWN0aW5nRWRpdFBhcnQucmVmcmVzaENvbm5lY3Rpb25zKCk7Ci0gICAgICB9ICAKLSAgICAgIHJlZnJlc2hDb25uZWN0aW9ucyhlZGl0UGFydCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWY1NmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29tcGFydG1lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQ29tcGFydG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotCi0vLyBUT0RPIChjcykgY29tbW9uLXVwIHdpdGggQm94RWRpdFBhcnQgKD8pCi1wdWJsaWMgY2xhc3MgQ29tcGFydG1lbnRFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCAvLyBpbXBsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRmVlZGJhY2tIYW5kbGVyCi17Ci0gIHByb3RlY3RlZCBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbigpOwotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBJQ29tcGFydG1lbnRGaWd1cmUgZmlndXJlID0gZ2V0RmlndXJlRmFjdG9yeSgpLmNyZWF0ZUNvbXBhcnRtZW50RmlndXJlKGdldE1vZGVsKCkpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29tcGFydG1lbnRGaWd1cmUoKS5nZXRDb250ZW50UGFuZSgpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50KCkKLSAgewotICAgIC8vIHNpbmNlIHRoZSBhbm5vdGF0aW9uIGFsd2F5cyB0YWtlcyB1cCAxIGNoaWxkLCBoZXJlJ3MgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gZmlndXJlIG91dCBpZgotICAgIHJldHVybiBnZXRDaGlsZHJlbigpLnNpemUoKSA+IDE7Ci0gIH0KLQotICBMaXN0IGdldENoaWxkcmVuU2Fuc0Fubm90YXRpb24oKQotICB7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBjaGlsZHJlbi5hZGRBbGwoZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgIGlmIChjaGlsZC5nZXRNb2RlbCgpID09IGFubm90YXRpb24pCi0gICAgICB7Ci0gICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIGNoaWxkcmVuOwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsgICAKLSAgICAKLSAgICAvLyB3ZSBjb21wdXRlIHRoZSBjaGlsZHJlbiBzYW5zIHRoZSBhbm5vdGF0aW9uIEVkaXRQYXJ0Ci0gICAgLy8gc2luY2UgdGhlIGFubm90YXRpb24gRWRpdFBhcnQgY29uZnVzZXMgb3VyIHVwL2Rvd24ga2V5IGhhbmRsaW5nCi0gICAgTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuU2Fuc0Fubm90YXRpb24oKTsKLSAgICBpZiAoY2hpbGRyZW4uY29udGFpbnMoZWRpdFBhcnQpKQotICAgIHsgIAotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5Lk9VVF9UT19QQVJFTlQpCi0gICAgICB7Ci0gICAgICAgIENvbXBhcnRtZW50IGNvbXBhcnRtZW50ID0gKENvbXBhcnRtZW50KWdldE1vZGVsKCk7Ci0gICAgICAgIGZvciAoRWRpdFBhcnQgcGFyZW50ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICBpZiAocGFyZW50LmdldE1vZGVsKCkgPT0gY29tcGFydG1lbnQuZ2V0T3duZXIoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBwYXJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgICAKLSAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkKLSAgICAgIHsgICAgCi0gICAgICAgIGludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA+IDApCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBpZiAoY2hpbGRyZW4uZ2V0KHNpemUgLSAxKSA9PSBlZGl0UGFydCkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIENvbXBhcnRtZW50RWRpdFBhcnQgbmV4dENvbXBhcnRtZW50ID0gKENvbXBhcnRtZW50RWRpdFBhcnQpRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0TmV4dFNpYmxpbmcoQ29tcGFydG1lbnRFZGl0UGFydC50aGlzKTsKLSAgICAgICAgICAgIGlmIChuZXh0Q29tcGFydG1lbnQgIT0gbnVsbCAmJiBuZXh0Q29tcGFydG1lbnQuZ2V0Q2hpbGRyZW5TYW5zQW5ub3RhdGlvbigpLnNpemUoKSA+IDApCi0gICAgICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHJlc3VsdCA9IEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldEZpcnN0Q2hpbGQobmV4dENvbXBhcnRtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0TmV4dFNpYmxpbmcoZWRpdFBhcnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKQotICAgICAgewotICAgICAgICBpZiAoRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0Rmlyc3RDaGlsZChDb21wYXJ0bWVudEVkaXRQYXJ0LnRoaXMpID09IGVkaXRQYXJ0KQotICAgICAgICB7ICAKLSAgICAgICAgICBFZGl0UGFydCBwcmV2Q29tcGFydG1lbnQgPSBFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXRQcmV2U2libGluZyhDb21wYXJ0bWVudEVkaXRQYXJ0LnRoaXMpOwotICAgICAgICAgIGlmIChwcmV2Q29tcGFydG1lbnQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgcHJldkNvbXBMaXN0Q2hpbGRyZW4gPSAoKENvbXBhcnRtZW50RWRpdFBhcnQpcHJldkNvbXBhcnRtZW50KS5nZXRDaGlsZHJlblNhbnNBbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHByZXZDb21wTGlzdENoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChzaXplID4gMCkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICByZXN1bHQgPSAoRWRpdFBhcnQpcHJldkNvbXBhcnRtZW50LmdldENoaWxkcmVuKCkuZ2V0KHNpemUgLSAxKTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0UHJldlNpYmxpbmcoZWRpdFBhcnQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OyAgICAgIAotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkKLSAgewotICAgIE9iamVjdCBtb2RlbCA9IGNoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQotICAgIElGaWd1cmUgY2hpbGQgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKTsKLQotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElGaWVsZCkKLSAgICB7Ci0gICAgICBnZXRDb21wYXJ0bWVudEZpZ3VyZSgpLmdldENvbnRlbnRQYW5lKCkuYWRkKGNoaWxkLCBpbmRleCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICBnZXRDb21wYXJ0bWVudEZpZ3VyZSgpLmdldEFubm90YXRpb25QYW5lKCkuYWRkKGNoaWxkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgaW5kZXgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkKLSAgewotICAgIE9iamVjdCBtb2RlbCA9IGNoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgICBJRmlndXJlIGNoaWxkID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCk7Ci0KLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgewotICAgICAgZ2V0Q29tcGFydG1lbnRGaWd1cmUoKS5nZXRDb250ZW50UGFuZSgpLnJlbW92ZShjaGlsZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICBnZXRDb21wYXJ0bWVudEZpZ3VyZSgpLmdldEFubm90YXRpb25QYW5lKCkucmVtb3ZlKGNoaWxkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcGFydG1lbnQgZ2V0Q29tcGFydG1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChDb21wYXJ0bWVudCkgZ2V0TW9kZWwoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGdldENvbXBhcnRtZW50KCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICBjaGlsZHJlbi5hZGQoYW5ub3RhdGlvbik7Ci0gICAgcmV0dXJuIGNoaWxkcmVuOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBzdXBlci5zZXRNb2RlbChtb2RlbCk7Ci0gICAgYW5ub3RhdGlvbi5zZXRDb21wYXJ0bWVudChnZXRDb21wYXJ0bWVudCgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbigpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICAvLyAoKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZ2V0UGFyZW50KCkpLmdldENvbnRlbnRQYW5lKCkuaW52YWxpZGF0ZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIC8vIGdldEZpZ3VyZSgpLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibHVlKTsKLSAgICAvLyAoKENvbXBhcnRtZW50RmlndXJlKWdldEZpZ3VyZSgpKS5zZXRCb3JkZXJDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgZ2V0RmlndXJlKCkucmVwYWludCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgLy8gZ2V0RmlndXJlKCkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZSk7Ci0gICAgLy8gKChDb21wYXJ0bWVudEZpZ3VyZSlnZXRGaWd1cmUoKSkuc2V0Qm9yZGVyQ29sb3IoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLSAgICBnZXRGaWd1cmUoKS5yZXBhaW50KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQ29tcGFydG1lbnRGaWd1cmUgZ2V0Q29tcGFydG1lbnRGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIChJQ29tcGFydG1lbnRGaWd1cmUpZmlndXJlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTm90aWZ5KCkKLSAgeyAgCi0gICAgc3VwZXIuYWRkTm90aWZ5KCk7Ci0gICAgZ2V0Q29tcGFydG1lbnRGaWd1cmUoKS5lZGl0UGFydEF0dGFjaGVkKHRoaXMpOyAgIAotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbXBsZXhUeXBlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29tcGxleFR5cGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmYxMmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ29tcGxleFR5cGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuRm9jdXNUeXBlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotCi1wdWJsaWMgY2xhc3MgQ29tcGxleFR5cGVFZGl0UGFydCBleHRlbmRzIFN0cnVjdHVyZUVkaXRQYXJ0Ci17ICAgCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIGlmIChnZXRQYXJlbnQoKS5nZXRNb2RlbCgpIGluc3RhbmNlb2YgRm9jdXNUeXBlQ29sdW1uKQotICAgIHsgIAotICAgICAgSUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKElDb21wbGV4VHlwZSlnZXRNb2RlbCgpOwotICAgICAgcmV0dXJuIGNvbXBsZXhUeXBlLmdldFN1cGVyVHlwZSgpICE9IG51bGw7Ci0gICAgfSAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIAotICBwcml2YXRlIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KElUeXBlIHR5cGUpCi0gIHsKLSAgICBDb2x1bW5FZGl0UGFydCBjb2x1bW5FZGl0UGFydCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBlZGl0UGFydCA9IHRoaXM7IGVkaXRQYXJ0ICE9IG51bGw7IGVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCkpCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29sdW1uRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGNvbHVtbkVkaXRQYXJ0ID0gKENvbHVtbkVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICBicmVhazsKLSAgICAgIH0gIAotICAgIH0gICAgIAotICAgIGlmIChjb2x1bW5FZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbHVtbkVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChjaGlsZC5nZXRNb2RlbCgpID09IHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAgICAgIH0gICAgICAgICAKLSAgICAgIH0gIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKQotICB7Ci0gICAgY29ubmVjdGlvbkZpZ3VyZSA9IG51bGw7Ci0gICAgSUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKElDb21wbGV4VHlwZSlnZXRNb2RlbCgpOwotICAgIElUeXBlIHR5cGUgPSBjb21wbGV4VHlwZS5nZXRTdXBlclR5cGUoKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsgICAgICAKLSAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVmZXJlbmNlVHlwZVBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClnZXRUYXJnZXRFZGl0UGFydCh0eXBlKTsKLSAgICAgIGlmIChyZWZlcmVuY2VUeXBlUGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gbmV3IFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKHRydWUpOwotICAgICAgICAvLyBkcmF3IGEgbGluZSBvdXQgZnJvbSB0aGUgdG9wICAgICAgICAgCi0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5UT1AsIDEpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE8gKGNzKSBuZWVkIHRvIGRyYXcgdGhlIHRhcmdldCBhbmNob3IgdG8gbG9vayBsaWtlIGEgVU1MIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcAotICAgICAgICAvLyBhZGRpbmcgYSBsYWJlbCB0byB0aGUgY29ubmVjdGlvbiB3b3VsZCBoZWxwIHRvCi0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IocmVmZXJlbmNlVHlwZVBhcnQuZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5CT1RUT00sIDAsIDApKTsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRDb25uZWN0aW9uUm91dGVyKG5ldyBNYW5oYXR0YW5Db25uZWN0aW9uUm91dGVyKCkpOwotICAgICAgICAoKENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciljb25uZWN0aW9uRmlndXJlLmdldFNvdXJjZUFuY2hvcigpKS5zZXRPdGhlcigoQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKWNvbm5lY3Rpb25GaWd1cmUuZ2V0VGFyZ2V0QW5jaG9yKCkpOwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZTsKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9FZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9FZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM0YjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLQotCi1wdWJsaWMgY2xhc3MgRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwKLXsgIAotICBwdWJsaWMgc3RhdGljIEVkaXRQYXJ0IGdldEZpcnN0Q2hpbGQoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsgICAgICAKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgIGlmIChlZGl0UGFydC5nZXRDaGlsZHJlbigpLnNpemUoKSA+IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWVkaXRQYXJ0LmdldENoaWxkcmVuKCkuZ2V0KDApOwotICAgIH0gICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIEVkaXRQYXJ0IGdldExhc3RDaGlsZChFZGl0UGFydCBlZGl0UGFydCkKLSAgeyAgICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IHNpemUgPSBlZGl0UGFydC5nZXRDaGlsZHJlbigpLnNpemUoKTsKLSAgICBpZiAoc2l6ZSA+IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWVkaXRQYXJ0LmdldENoaWxkcmVuKCkuZ2V0KHNpemUgLSAxKTsKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIEVkaXRQYXJ0IGdldE5leHRTaWJsaW5nKEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7ICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7ICAgIAotICAgIEVkaXRQYXJ0IHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoZWRpdFBhcnQpOwotICAgICAgaWYgKGluZGV4ICsgMSA8IGNoaWxkcmVuLnNpemUoKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWNoaWxkcmVuLmdldChpbmRleCArIDEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIEVkaXRQYXJ0IGdldFByZXZTaWJsaW5nKEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7ICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgRWRpdFBhcnQgcGFyZW50ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsgIAotICAgICAgTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotICAgICAgaW50IGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlZGl0UGFydCk7Ci0gICAgICBpZiAoaW5kZXggLSAxID49IDApCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNoaWxkCi0gICAgICAgIC8vICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWNoaWxkcmVuLmdldChpbmRleCAtIDEpOwotICAgICAgfSAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0ZpZWxkRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvRmllbGRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdkZDM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvRmllbGRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLQotcHVibGljIGNsYXNzIEZpZWxkRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRmllbGRFZGl0UGFydAotewotICBwdWJsaWMgdm9pZCBhZGROb3RpZnkoKQotICB7Ci0gICAgc3VwZXIuYWRkTm90aWZ5KCk7Ci0gICAgZ2V0RmllbGRGaWd1cmUoKS5lZGl0UGFydEF0dGFjaGVkKHRoaXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lDb25uZWN0aW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lDb25uZWN0aW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjEyNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JQ29ubmVjdGlvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb25uZWN0aW9uQ29udGFpbmVyCi17Ci0gIHB1YmxpYyB2b2lkIHJlZnJlc2hDb25uZWN0aW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JSG9sZGVyRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSUhvbGRlckVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2E1YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JSG9sZGVyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElIb2xkZXJFZGl0UGFydAotewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lOYW1lZEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lOYW1lZEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxODZjMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JTmFtZWRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lZEVkaXRQYXJ0Ci17Ci0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWxGaWd1cmUoKTsKLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBjdXJzb3JMb2NhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RDb250ZW50RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdENvbnRlbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmEwMzQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdENvbnRlbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuUm9vdEhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBSb290Q29udGVudEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci17Ci0gIExpc3QgY29sbGVjdGlvbnMgPSBudWxsOwotICBGaWd1cmUgY29udGVudFBhbmU7Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7ICAgIAotICAgIFBhbmVsIHBhbmVsID0gbmV3IFBhbmVsKCk7ICAgIAotICAgIHBhbmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDYwKSk7Ci0gICAKLSAgICBUb29sYmFyTGF5b3V0IHBhbmVsTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIHBhbmVsTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgcGFuZWwuc2V0TGF5b3V0TWFuYWdlcihwYW5lbExheW91dCk7Ci0gICAgCi0gICAgY29udGVudFBhbmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgcGFuZWwuYWRkKGNvbnRlbnRQYW5lKTsKLSAgICAKLSAgICBUb29sYmFyTGF5b3V0IHRiID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIHRiLnNldE1pbm9yQWxpZ25tZW50KFRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLSAgICB0Yi5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIHRiLnNldFNwYWNpbmcoNDApOwotICAgIGNvbnRlbnRQYW5lLnNldExheW91dE1hbmFnZXIodGIpOwotICAgIAotICAgIHJldHVybiBwYW5lbDsKLSAgfQotICAKLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRQYW5lOwotICB9Ci0gIAotICAKLSAgcHVibGljIElDb21wbGV4VHlwZSBnZXRTZWxlY3RlZENvbXBsZXhUeXBlKCkKLSAgewotICAgIElDb21wbGV4VHlwZSByZXN1bHQgPSBudWxsOwotICAgIElNb2RlbCBtb2RlbCA9IChJTW9kZWwpZ2V0TW9kZWwoKTsKLSAgICBMaXN0IHR5cGVzID0gbW9kZWwuZ2V0VHlwZXMoKTsKLSAgICBpZiAodHlwZXMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBpZiAodHlwZXMuZ2V0KDApIGluc3RhbmNlb2YgSUNvbXBsZXhUeXBlKSAKLSAgICAgICAgcmVzdWx0ID0gKElDb21wbGV4VHlwZSl0eXBlcy5nZXQoMCk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7IAotICAgIGNvbGxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChnZXRNb2RlbCgpICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGdldE1vZGVsKCk7Ci0gICAgICBJQURUT2JqZWN0IGZvY3VzT2JqZWN0ID0gbnVsbDsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJU3RydWN0dXJlKQotICAgICAgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUdyYXBoRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoKElHcmFwaEVsZW1lbnQpb2JqKS5pc0ZvY3VzQWxsb3dlZCgpKQotICAgICAgICAgICAgZm9jdXNPYmplY3QgPSAoSVN0cnVjdHVyZSlvYmo7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgICB7Ci0gICAgICAgIGZvY3VzT2JqZWN0ID0gKElGaWVsZClvYmo7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElNb2RlbCkKLSAgICAgIHsKLSAgICAgICAgZm9jdXNPYmplY3QgPSAoSU1vZGVsKW9iajsKLSAgICAgICAgY29sbGVjdGlvbnMuYWRkKGZvY3VzT2JqZWN0KTsKLSAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25zOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSVR5cGUpCi0gICAgICB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgoSUdyYXBoRWxlbWVudClvYmopLmlzRm9jdXNBbGxvd2VkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9jdXNPYmplY3QgPSAoSVR5cGUpb2JqOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZvY3VzT2JqZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFJvb3RIb2xkZXIgaG9sZGVyID0gbmV3IFJvb3RIb2xkZXIoZm9jdXNPYmplY3QpOwotICAgICAgICBjb2xsZWN0aW9ucy5hZGQoaG9sZGVyKTsKLSAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25zOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY29sbGVjdGlvbnM7Ci0gIH0KLSAgICAKLSAgCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCBEb24ndCBjYWxsIHRoaXMgbWV0aG9kLiAgVXNlIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIuc2V0SW5wdXQoKSBpbnN0ZWFkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIHNldE1vZGVsKGNvbXBvbmVudCk7Ci0gICAgcmVmcmVzaCgpOwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZC4gIFVzZSBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyLmdldElucHV0KCkgaW5zdGVhZC4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGdldE1vZGVsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIC8qCi0gICAgLy8gb25jZSB3ZSdyZSBkb25lIHJlZnJlc2hpbmcgd2UgY2FuIGFzc3VtZSBhbGwgb2YgdGhlIGNoaWxkIGVkaXRwYXJ0cwotICAgIC8vIG5vdyB3ZSBpdGVyYXRyZSB0aHJ1IHRoZSBsaXN0IGFnYWluIGFuZCB0ZWxsIHRoZSBjaGlsZHJlbiB0byB1cGRhdGUKLSAgICAvLyB0aGVpciBjb25uZWN0aW9ucwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUNvbm5lY3Rpb25Db250YWluZXIpCi0gICAgICB7Ci0gICAgICAgICgoSUNvbm5lY3Rpb25Db250YWluZXIpb2JqKS5yZWZyZXNoQ29ubmVjdGlvbnMoKTsKLSAgICAgIH0KLSAgICB9Ki8KLSAgICAKLSAgICBmb3IoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgKChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KW9iaikucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4NzU4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQmVuZHBvaW50Q29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZUNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFJvb3RFZGl0UGFydCBleHRlbmRzIFNjYWxhYmxlUm9vdEVkaXRQYXJ0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZ2VmLlJvb3RFZGl0UGFydAoteyAgICAKLSAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICB7Ci0gICAgc3VwZXIuYWN0aXZhdGUoKTsKLSAgICAvLyBTZXQgdXAgQ29ubmVjdGlvbiBsYXllciB3aXRoIGEgcm91dGVyLCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgaGF2ZSBvbmUKLSAgICBDb25uZWN0aW9uTGF5ZXIgY29ubmVjdGlvbkxheWVyID0gKENvbm5lY3Rpb25MYXllcikgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUik7Ci0gICAgaWYgKGNvbm5lY3Rpb25MYXllciAhPSBudWxsKQotICAgIHsgIAotICAgICAgY29ubmVjdGlvbkxheWVyLnNldENvbm5lY3Rpb25Sb3V0ZXIobmV3IEJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXIoKSk7Ci0gICAgfQotCi0gICAgRmlndXJlIGZpZ3VyZSA9IChGaWd1cmUpZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuRkVFREJBQ0tfTEFZRVIpOyAgICAgICAKLSAgICBpZiAoZmlndXJlICE9IG51bGwpCi0gICAgeyAgICAgIAotICAgICAgaWYgKGdldFZpZXdlcigpIGluc3RhbmNlb2YgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKQotICAgICAgeyAgCi0gICAgICAgIC8vU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIHNndiA9IChTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIpZ2V0Vmlld2VyKCk7Ci0gICAgICAgIC8vSW5kZXhGaWd1cmUgaW5kZXhGaWd1cmUgPSBuZXcgSW5kZXhGaWd1cmUoc2d2KTsKLSAgICAgICAgLy9maWd1cmUuYWRkKGluZGV4RmlndXJlKTsKLSAgICAgICAgLy9nZXRWaWV3ZXIoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGluZGV4RmlndXJlKTsKLSAgICAgIH0gIAotICAgIH0gICAgICAgICAgIAotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExheWVyZWRQYW5lIGNyZWF0ZVByaW50YWJsZUxheWVycygpIAotICB7Ci0gICAgTGF5ZXJlZFBhbmUgcGFuZSA9IHN1cGVyLmNyZWF0ZVByaW50YWJsZUxheWVycygpOyAgICAKLSAgICBMYXllciBsYXllciA9IG5ldyBTY2FsZWRIYW5kbGVMYXllcigpOwotICAgIGxheWVyLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig1LCA1KSk7Ci0gICAgcGFuZS5hZGQobGF5ZXIsIERlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHMuU0NBTEVEX0hBTkRMRV9MQVlFUik7ICAgIAotICAgIHJldHVybiBwYW5lOwotICB9ICAKLSAgCi0gIAotICBjbGFzcyBTY2FsZWRIYW5kbGVMYXllciBleHRlbmRzIExheWVyCi0gIHsKLSAgICBTY2FsZWRIYW5kbGVMYXllcigpIAotICAgIHsKLSAgICAgIHNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSNnZXRQcmVmZXJyZWRTaXplKGludCwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkgCi0gICAgewotICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBuZXcgUmVjdGFuZ2xlKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldENoaWxkcmVuKCkuc2l6ZSgpOyBpKyspCi0gICAgICAgIHJlY3QudW5pb24oKChJRmlndXJlKWdldENoaWxkcmVuKCkuZ2V0KGkpKS5nZXRCb3VuZHMoKSk7Ci0gICAgICByZXR1cm4gcmVjdC5nZXRTaXplKCk7Ci0gICAgfQotICB9ICAKLSAgCi0gIGNsYXNzIEluZGV4RmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0gICAgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIHNndjsKLSAgICBwdWJsaWMgSW5kZXhGaWd1cmUoU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIHNndikKLSAgICB7Ci0gICAgICB0aGlzLnNndiA9IHNndjsgICAgICAKLSAgICAgICgoRmlndXJlQ2FudmFzKXNndi5nZXRDb250cm9sKCkpLmdldFZpZXdwb3J0KCkuZ2V0SG9yaXpvbnRhbFJhbmdlTW9kZWwoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgKChGaWd1cmVDYW52YXMpc2d2LmdldENvbnRyb2woKSkuZ2V0Vmlld3BvcnQoKS5nZXRWZXJ0aWNhbFJhbmdlTW9kZWwoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgNDAsIDQwKTsKLSAgICAgIHRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRzKTsgICAgICAKLSAgICAgIHNldEJvdW5kcyhib3VuZHMpOyAgICAgICAKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzY3JvbGwtY2hhbmdlIik7Ci0gICAgICBSZWN0YW5nbGUgYm91bmRzID0gbmV3IFJlY3RhbmdsZSgwLCAwLCA0MCwgNDApOwotICAgICAgUG9pbnQgcCA9ICgoRmlndXJlQ2FudmFzKXNndi5nZXRDb250cm9sKCkpLmdldFZpZXdwb3J0KCkuZ2V0Vmlld0xvY2F0aW9uKCk7Ci0gICAgICBib3VuZHMudHJhbnNsYXRlKHApOwotICAgICAgc2V0Qm91bmRzKGJvdW5kcyk7IAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUmVjdGFuZ2xlIGdldEJvdW5kcygpCi0gICAgewotICAgICAgUG9pbnQgcCA9ICgoRmlndXJlQ2FudmFzKXNndi5nZXRDb250cm9sKCkpLmdldFZpZXdwb3J0KCkuZ2V0Vmlld0xvY2F0aW9uKCk7Ci0gICAgICBib3VuZHMudHJhbnNsYXRlKHApOyAgICAgIAotICAgICAgcmV0dXJuIHN1cGVyLmdldEJvdW5kcygpLmdldENvcHkoKS50cmFuc2xhdGUocCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RIb2xkZXJFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290SG9sZGVyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhZDA1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RIb2xkZXJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBhbmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuRm9jdXNUeXBlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuUmVmZXJlbmNlZFR5cGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Sb290SG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgUm9vdEhvbGRlckVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0IGltcGxlbWVudHMgSUhvbGRlckVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBQYW5lbCBwYW5lbDsKLSAgCi0gIHB1YmxpYyBSb290SG9sZGVyRWRpdFBhcnQoKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgcGFuZWwgPSBuZXcgUGFuZWwoKTsgICAgCi0gICAgVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dCh0cnVlKTsKLSAgICBsYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0gICAgbGF5b3V0LnNldFNwYWNpbmcoMTAwKTsKLSAgICBwYW5lbC5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7ICAgIAotCi0gICAgcmV0dXJuIHBhbmVsOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGNvbGxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFJvb3RIb2xkZXIgaG9sZGVyID0gKFJvb3RIb2xkZXIpZ2V0TW9kZWwoKTsKLSAgICBJQURUT2JqZWN0IGZvY3VzT2JqZWN0ID0gaG9sZGVyLmdldE1vZGVsKCk7Ci0gICAgY29sbGVjdGlvbnMuYWRkKG5ldyBGb2N1c1R5cGVDb2x1bW4oZm9jdXNPYmplY3QpKTsKLSAgICBjb2xsZWN0aW9ucy5hZGQobmV3IFJlZmVyZW5jZWRUeXBlQ29sdW1uKGZvY3VzT2JqZWN0KSk7Ci0gICAgcmV0dXJuIGNvbGxlY3Rpb25zOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9TZWN0aW9uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvU2VjdGlvbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNWFmNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9TZWN0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkVkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBJQ29tcGxleFR5cGUgY29tcGxleFR5cGU7Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgRmlndXJlIGZpZyA9IG5ldyBGaWd1cmUoKTsKLSAgICBmaWcuc2V0TGF5b3V0TWFuYWdlcihuZXcgVG9vbGJhckxheW91dCgpKTsKLSAgICByZXR1cm4gZmlnOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvU3RydWN0dXJlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvU3RydWN0dXJlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmMDc5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1N0cnVjdHVyZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Db21wYXJ0bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklTdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlNwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVFZGl0UGFydCBleHRlbmRzIEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0IGltcGxlbWVudHMgSU5hbWVkRWRpdFBhcnQKLXsgIAotICBwcm90ZWN0ZWQgTGlzdCBjb21wYXJ0bWVudExpc3QgPSBudWxsOwotICBwcm90ZWN0ZWQgQURURGlyZWN0RWRpdFBvbGljeSBhZHREaXJlY3RFZGl0UG9saWN5ID0gbmV3IEFEVERpcmVjdEVkaXRQb2xpY3koKTsKLSAgcHJvdGVjdGVkIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLSAgLyoqCi0gICAqIFRPRE8gY3MuLi4gSSdtIHN1cmUgdGhpcyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggdGhlIHdheSB3ZSB3YW50ZWQgdG8gcmV3b3JrIGNvbXBhcnRtZW50IGNyZWF0aW9uCi0gICAqIEkgc3VwcG9zZSB3ZSBjb3VsZCBoYXZlIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBnZXRNb2RlbENoaWxkcmVuKCkKLSAgICogCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgQ29tcGFydG1lbnRbXSBnZXRDb21wYXJ0bWVudHMoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBJU3RydWN0dXJlRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZUZhY3RvcnkoKS5jcmVhdGVTdHJ1Y3R1cmVGaWd1cmUoZ2V0TW9kZWwoKSk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmVGaWd1cmUgZ2V0U3RydWN0dXJlRmlndXJlKCkKLSAgewotICAgIHJldHVybiAoSVN0cnVjdHVyZUZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgfQotICAKLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGdldFN0cnVjdHVyZUZpZ3VyZSgpLmdldENvbnRlbnRQYW5lKCk7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsgICAgICAgICAgICAgICAKLSAgICBpZiAoZGlyZWN0aW9uID09IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuSU5fVE9fRklSU1RfQ0hJTEQpCi0gICAgeyAgICAgICAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBDb21wYXJ0bWVudEVkaXRQYXJ0IGNvbXBhcnRtZW50ID0gKENvbXBhcnRtZW50RWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChjb21wYXJ0bWVudC5oYXNDb250ZW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGNvbnRlbnRDaGlsZHJlbiA9IGNvbXBhcnRtZW50LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY29udGVudENoaWxkcmVuLmhhc05leHQoKTsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGNvbnRlbnRDaGlsZHJlbi5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTZWN0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFNlY3Rpb25FZGl0UGFydCBwYXJ0ID0gKFNlY3Rpb25FZGl0UGFydCkgY2hpbGQ7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IChFZGl0UGFydClwYXJ0LmdldENoaWxkcmVuKCkuZ2V0KDApOwotICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCAmJiAoIShjaGlsZCBpbnN0YW5jZW9mIFNwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSAoRWRpdFBhcnQpY2hpbGQ7Ci0gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0gICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBzdXBlci5kb0dldFJlbGF0aXZlRWRpdFBhcnQoZWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsgICAgICAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7ICAgICAgICAKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsgIAotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBBRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3koKSk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBhZHREaXJlY3RFZGl0UG9saWN5KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElTdHJ1Y3R1cmUgZ2V0U3RydWN0dXJlKCkKLSAgewotICAgIHJldHVybiAoSVN0cnVjdHVyZSlnZXRNb2RlbCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIGlmIChjb21wYXJ0bWVudExpc3QgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21wYXJ0bWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLSAgICAgIC8vIFRPRE8uLiB0aGlzIG5lZWRzIHRvIGJlIG1vdmVkIHRvIHRoZSB4c2Qgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGlzIGNsYXNzIAotICAgICAgY29tcGFydG1lbnRMaXN0LmFkZChuZXcgQ29tcGFydG1lbnQoZ2V0U3RydWN0dXJlKCksICJhdHRyaWJ1dGUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGNvbXBhcnRtZW50TGlzdC5hZGQobmV3IENvbXBhcnRtZW50KGdldFN0cnVjdHVyZSgpLCAiZWxlbWVudCIpKTsgICAgLy8kTk9OLU5MUy0xJAotICAgIH0gIAotICAgIHJldHVybiBjb21wYXJ0bWVudExpc3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbigpCi0gIHsgICAKLSAgICBzdXBlci5yZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICAvL2dldEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgIGdldFN0cnVjdHVyZUZpZ3VyZSgpLnJlZnJlc2hWaXN1YWxzKGdldE1vZGVsKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5hZGRTZWxlY3Rpb25GZWVkYmFjaygpOwotICAgIHN1cGVyLmFkZEZlZWRiYWNrKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIGdldFN0cnVjdHVyZUZpZ3VyZSgpLnJlbW92ZVNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0gICAgc3VwZXIucmVtb3ZlRmVlZGJhY2soKTsgICAgCi0gIH0KLQotICBwdWJsaWMgTGFiZWwgZ2V0TmFtZUxhYmVsRmlndXJlKCkKLSAgewotICAgIHJldHVybiBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5nZXROYW1lTGFiZWwoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKQotICB7Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgIAotICAgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCkKLSAgICB7Ci0gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLSAgICAgIHsKLSAgICAgLy8gdW5jb21tZW50IGZvciBkaXJlY3QgZWRpdCBvZiBuYW1lIChhZGQgZWxzZSkKLS8vICAgICAgICBMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0ID0gKExvY2F0aW9uUmVxdWVzdClyZXF1ZXN0OwotLy8gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLS8vICAgICAgICBpZiAoaGl0VGVzdChnZXROYW1lTGFiZWxGaWd1cmUoKSwgcCkpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgTGFiZWxFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IExhYmVsRWRpdE1hbmFnZXIodGhpcywgbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IodGhpcywgcCkpOwotLy8gICAgICAgICAgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyIHdyYXBwZXIgPSBuZXcgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyKCk7Ci0vLyAgICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQod3JhcHBlcik7Ci0vLyAgICAgICAgICBtYW5hZ2VyLnNob3coKTsKLS8vICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotICAgICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KQotICAgICAgewotICAgICAgICBMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0ID0gKExvY2F0aW9uUmVxdWVzdClyZXF1ZXN0OwotICAgICAgICBQb2ludCBwID0gbG9jYXRpb25SZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAKLSAgICAgICAgaWYgKGdldFN0cnVjdHVyZUZpZ3VyZSgpLmhpdFRlc3RIZWFkZXIocCkpCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgLy8gVE9ETzogISEhIFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBhZHQteHNkIHBhY2thZ2UKLSAgICAgICAgICAvLyAKLSAgICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKSAgICAgCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpbW9kZWw7Ci0gICAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgT2JqZWN0IHNjaGVtYSA9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICAgICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeShlZGl0b3JQYXJ0KTsKLSAgICAgICAgICAgIGlmIChyZWdpc3RyeSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoc2NoZW1hID09IGN0LmdldFNjaGVtYSgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKE9wZW5Jbk5ld0VkaXRvci5JRCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEVkaXRvckFjdGlvblJlZ2lzdHJ5KElFZGl0b3JQYXJ0IGVkaXRvcikKLSAgewotICAgIHJldHVybiAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvci5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRHJhd0Nvbm5lY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvVG9wTGV2ZWxGaWVsZEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1RvcExldmVsRmllbGRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTI4ZTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvVG9wTGV2ZWxGaWVsZEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5Cb3hGaWd1cmU7Ci0KLXB1YmxpYyBjbGFzcyBUb3BMZXZlbEZpZWxkRWRpdFBhcnQgZXh0ZW5kcyBCb3hFZGl0UGFydCBpbXBsZW1lbnRzIElOYW1lZEVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBBRFREaXJlY3RFZGl0UG9saWN5IGFkdERpcmVjdEVkaXRQb2xpY3kgPSBuZXcgQURURGlyZWN0RWRpdFBvbGljeSgpOwotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRHJhd0Nvbm5lY3Rpb24oKQotICB7Ci0gICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClnZXRNb2RlbCgpOwotICAgIElUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0gICAgcmV0dXJuICh0eXBlICE9IG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlID0gbnVsbDsKLSAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKWdldE1vZGVsKCk7Ci0gICAgSVR5cGUgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsgICAgICAKLSAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmVmZXJlbmNlVHlwZVBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClnZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHR5cGUpOwotICAgICAgaWYgKHJlZmVyZW5jZVR5cGVQYXJ0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUgPSBuZXcgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24oKTsgICAKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRTb3VyY2VBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihnZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLlJJR0hULCAwKSk7Ci0gICAgICAgIGludCB0YXJnZXRBbmNob3JZT2Zmc2V0ID0gMTI7ICAgICAgICAKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihyZWZlcmVuY2VUeXBlUGFydC5nZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkhFQURFUl9MRUZULCAwLCB0YXJnZXRBbmNob3JZT2Zmc2V0KSk7IAotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZTsKLSAgfSAgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLCBhZHREaXJlY3RFZGl0UG9saWN5KTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClnZXRNb2RlbCgpOwotICAgIEJveEZpZ3VyZSBib3hGaWd1cmUgPSAoQm94RmlndXJlKWdldEZpZ3VyZSgpOwotICAgIGJveEZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRUZXh0KGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotICAKLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbEZpZ3VyZSgpCi0gIHsKLSAgICBCb3hGaWd1cmUgYm94RmlndXJlID0gKEJveEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICByZXR1cm4gYm94RmlndXJlLmdldE5hbWVMYWJlbCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgY3Vyc29yTG9jYXRpb24pCi0gIHsKLSAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgIAotICAgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVHx8Ci0gICAgICAgIHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotLy8gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLS8vICAgICAgewotLy8gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0vLyAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotLy8gICAgICAgCi0vLyAgICAgICAgaWYgKGhpdFRlc3QoZ2V0TmFtZUxhYmVsRmlndXJlKCksIHApKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIExhYmVsRWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBMYWJlbEVkaXRNYW5hZ2VyKHRoaXMsIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKHRoaXMsIHApKTsKLS8vICAgICAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotLy8gICAgICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKHdyYXBwZXIpOwotLy8gICAgICAgICAgbWFuYWdlci5zaG93KCk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1R5cGVSZWZlcmVuY2VDb25uZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1R5cGVSZWZlcmVuY2VDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkN2RhNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9UeXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWdvbkRlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gZXh0ZW5kcyBQb2x5bGluZUNvbm5lY3Rpb24KLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGlnaGxpZ2h0ID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sb3IgYWN0aXZlQ29ubmVjdGlvbiA9IENvbG9yQ29uc3RhbnRzLmJsYWNrOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGluYWN0aXZlQ29ubmVjdGlvbiA9IG5ldyBDb2xvcihudWxsLCAxOTgsIDE5NSwgMTk4KTsKLQotICAvKioKLSAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0VGFyZ2V0RGVjb3JhdGlvbihuZXcgUG9seWdvbkRlY29yYXRpb24oKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbihib29sZWFuIGZpbGwpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIFBvbHlnb25EZWNvcmF0aW9uIGRlYyA9IG5ldyBQb2x5Z29uRGVjb3JhdGlvbigpCi0gICAgewotICAgICAgcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGcpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZy5wdXNoU3RhdGUoKTsKLSAgICAgICAgICBnLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgICAgICAgc3VwZXIuZmlsbFNoYXBlKGcpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGcucG9wU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfTsKLSAgICBkZWMuc2V0RmlsbChmaWxsKTsKLSAgICBkZWMuc2V0VGVtcGxhdGUoUG9seWdvbkRlY29yYXRpb24uVFJJQU5HTEVfVElQKTsKLSAgICBkZWMuc2V0U2NhbGUoMTQsNik7Ci0gICAgc2V0VGFyZ2V0RGVjb3JhdGlvbihkZWMpOwotICB9Ci0gIAotCi0gIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Sb3V0ZXIoQ29ubmVjdGlvblJvdXRlciBjcikKLSAgewotICAgIGlmIChjciAhPSBudWxsICYmIGdldENvbm5lY3Rpb25Sb3V0ZXIoKSAhPSBudWxsICYmICEoZ2V0Q29ubmVjdGlvblJvdXRlcigpIGluc3RhbmNlb2YgTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcikpCi0gICAgICBzdXBlci5zZXRDb25uZWN0aW9uUm91dGVyKGNyKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgaGlnaGxpZ2h0IHN0YXR1cy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSGlnaGxpZ2h0ZWQoKQotICB7Ci0gICAgcmV0dXJuIGhpZ2hsaWdodDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gaGlnaGxpZ2h0Ci0gICAqICAgICAgICAgIFRoZSBoaWdobGlnaHQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SGlnaGxpZ2h0KGJvb2xlYW4gaGlnaGxpZ2h0KQotICB7Ci0gICAgdGhpcy5oaWdobGlnaHQgPSBoaWdobGlnaHQ7Ci0gICAgLy8gVXBkYXRlIG91ciBjb25uZWN0aW9uIHRvIHVzZSB0aGUgY29ycmVjdCBjb2xvdXJpbmcKLSAgICBib29sZWFuIGhpZ2hDb250cmFzdCA9IGZhbHNlOwotICAgIHRyeQotICAgIHsKLSAgICAgIGhpZ2hDb250cmFzdCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBpZiAoaGlnaENvbnRyYXN0KQotICAgIHsKLSAgICAgIHNldEZvcmVncm91bmRDb2xvcihoaWdobGlnaHQgPyBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0ZPUkVHUk9VTkQpIDogQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldEZvcmVncm91bmRDb2xvcihoaWdobGlnaHQgPyBhY3RpdmVDb25uZWN0aW9uIDogaW5hY3RpdmVDb25uZWN0aW9uKTsKLSAgICB9Ci0gICAgc2V0T3BhcXVlKGhpZ2hsaWdodCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlYjg4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fic3RyYWN0TW9kZWxDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uIGltcGxlbWVudHMgSUFEVE9iamVjdAotewotICBwcm90ZWN0ZWQgSUFEVE9iamVjdCBtb2RlbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBraW5kOwotICAKLSAgcHVibGljIEFic3RyYWN0TW9kZWxDb2xsZWN0aW9uKElBRFRPYmplY3QgbW9kZWwsIFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKElBRFRPYmplY3QgbW9kZWwpCi0gIHsKLSAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKQotICB7Ci0gICAgcmV0dXJuIGtpbmQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotICAKLSAgcHVibGljIGFic3RyYWN0IExpc3QgZ2V0Q2hpbGRyZW4oKTsKLQotICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIG1vZGVsLnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIG1vZGVsLnVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY3YTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb24KLXsKLSAgQ29tcGFydG1lbnQgY29tcGFydG1lbnQ7Ci0gIHB1YmxpYyBBbm5vdGF0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbXBhcnRtZW50KENvbXBhcnRtZW50IGNvbXBhcnRtZW50KQotICB7Ci0gICAgdGhpcy5jb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50OwotICB9Ci0gIAotICBwdWJsaWMgQ29tcGFydG1lbnQgZ2V0Q29tcGFydG1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGNvbXBhcnRtZW50OwotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZSBnZXRPd25lcigpCi0gIHsKLSAgICByZXR1cm4gY29tcGFydG1lbnQuZ2V0T3duZXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Db21wYXJ0bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Db21wYXJ0bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjhjZDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQ29tcGFydG1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci0KLXB1YmxpYyBjbGFzcyBDb21wYXJ0bWVudCBpbXBsZW1lbnRzIElBRFRPYmplY3QKLXsKLSAgU3RyaW5nIGtpbmQ7Ci0gIElTdHJ1Y3R1cmUgb3duZXI7Ci0KLSAgcHVibGljIENvbXBhcnRtZW50KElTdHJ1Y3R1cmUgb3duZXIsIFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgICB0aGlzLm93bmVyID0gb3duZXI7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gb3duZXIuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGkubmV4dCgpOwotICAgICAgaWYgKGtpbmQgPT0gbnVsbCB8fCBraW5kLmVxdWFscyhmaWVsZC5nZXRLaW5kKCkpKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRLaW5kKCkKLSAgewotICAgIHJldHVybiBraW5kOwotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZSBnZXRPd25lcigpCi0gIHsKLSAgICByZXR1cm4gb3duZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIC8vIHJlYWxseSB3ZSB3YW50IHRvIGxpc3RlbiB0byB0aGUgb3duZXIKLSAgICBvd25lci5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICAvLyByZWFsbHkgd2Ugd2FudCB0byBsaXN0ZW4gdG8gdGhlIG93bmVyCi0gICAgb3duZXIudW5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0ZvY3VzVHlwZUNvbHVtbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Gb2N1c1R5cGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhNmZjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0ZvY3VzVHlwZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBGb2N1c1R5cGVDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZvY3VzT2JqZWN0ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgRm9jdXNUeXBlQ29sdW1uKElBRFRPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihtb2RlbCwgIkZvY3VzVHlwZUNvbHVtbiIpOyAvLyROT04tTkxTLTEkICAKLSAgfQotCi0gIHB1YmxpYyBGb2N1c1R5cGVDb2x1bW4oSUFEVE9iamVjdCBtb2RlbCwgYm9vbGVhbiBpc0ZvY3VzT2JqZWN0KQotICB7Ci0gICAgc3VwZXIobW9kZWwsICJGb2N1c1R5cGVDb2x1bW4iKTsgLy8kTk9OLU5MUy0xJAotICAgIHRoaXMuaXNGb2N1c09iamVjdCA9IGlzRm9jdXNPYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsgIAotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElUeXBlKQotICAgIHsKLSAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpbW9kZWw7Ci0gICAgICBpZiAodHlwZS5nZXRTdXBlclR5cGUoKSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdC5hZGQodHlwZS5nZXRTdXBlclR5cGUoKSk7Ci0gICAgICB9Ci0gICAgICByZXN1bHQuYWRkKHR5cGUpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkIHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlKQotICAgIHsgICAKLSAgICAgIHJlc3VsdC5hZGQobW9kZWwpOwotICAgIH0gICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsgICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIGlzRm9jdXNPYmplY3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUFjdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lBY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ0M2ZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUFjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvblByb3ZpZGVyCi17Ci0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JRmVlZGJhY2tIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lGZWVkYmFja0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlODYwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lGZWVkYmFja0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUdyYXBoRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JR3JhcGhFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YTMxZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JR3JhcGhFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUdyYXBoRWxlbWVudAotewotICBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCk7Ci0gIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCk7Ci0gIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpOwotICBJTW9kZWwgZ2V0TW9kZWwoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSU1vZGVsUHJveHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSU1vZGVsUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2M2MzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lNb2RlbFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsUHJveHkKLXsKLSAgSU1vZGVsIGdldE1vZGVsKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1JlZmVyZW5jZWRUeXBlQ29sdW1uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1JlZmVyZW5jZWRUeXBlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Zjg5NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9SZWZlcmVuY2VkVHlwZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZFR5cGVDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbgotewotICBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgSW50ZXJuYWxMaXN0ZW5lciBpbnRlcm5hbExpc3RlbmVyID0gbmV3IEludGVybmFsTGlzdGVuZXIoKTsKLSAgCi0gIC8vIHRvZG8uLi4gcmVhbGx5IHRoaXMgdGhpcyBtb2RlbCBvYmplY3Qgc2hvdWxkIGxpc3RlbgotICAvLyB0byB0aGUgcGFyZW50IG9mIHRoZSBJVHlwZQotICAvLwotICBwdWJsaWMgUmVmZXJlbmNlZFR5cGVDb2x1bW4oSUFEVE9iamVjdCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG1vZGVsLCAiUmVmZXJlbmNlZFR5cGVDb2x1bW4iKTsgLy8kTk9OLU5MUy0xJAotICAgIG1vZGVsLnJlZ2lzdGVyTGlzdGVuZXIoaW50ZXJuYWxMaXN0ZW5lcik7Ci0gICAgaW50ZXJuYWxMaXN0ZW5lci5yZWNvbXB1dGVTdWJMaXN0ZW5lcnMoKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOyAgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICB7Ci0gICAgICBJU3RydWN0dXJlIHN0cnVjdHVyZSA9IChJU3RydWN0dXJlKW1vZGVsOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gc3RydWN0dXJlLmdldEZpZWxkcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpaS5uZXh0KCk7Ci0gICAgICAgIElUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlICE9IG51bGwpICAvLyAmJiB0eXBlLmlzQ29tcGxleFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghcmVzdWx0LmNvbnRhaW5zKHR5cGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgSUdyYXBoRWxlbWVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoSUdyYXBoRWxlbWVudCl0eXBlKS5pc0ZvY3VzQWxsb3dlZCgpKQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQodHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgCi0gICAgfSAgCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgewotICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCltb2RlbDsKLSAgICAgIElUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0gICAgICBpZiAodHlwZSAhPSBudWxsKSAvLyAgJiYgdHlwZS5pc0NvbXBsZXhUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgSUdyYXBoRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoKElHcmFwaEVsZW1lbnQpdHlwZSkuaXNGb2N1c0FsbG93ZWQoKSkKLSAgICAgICAgICAgIHJlc3VsdC5hZGQodHlwZSk7ICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKE9iamVjdCBjaGFuZ2VkT2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBMaXN0IGNsb25lZExpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBjbG9uZWRMaXN0ZW5lckxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY2xvbmVkTGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyID0gKElBRFRPYmplY3RMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZCh0aGlzLCBudWxsKTsKLSAgICB9IAotICB9ICAgCi0gIAotICBwcm90ZWN0ZWQgY2xhc3MgSW50ZXJuYWxMaXN0ZW5lciBpbXBsZW1lbnRzIElBRFRPYmplY3RMaXN0ZW5lcgotICB7Ci0gICAgTGlzdCBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICB2b2lkIHJlY29tcHV0ZVN1Ykxpc3RlbmVycygpCi0gICAgewotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICAgIHsgIAotICAgICAgICAvLyByZW1vdmUgb2xkIG9uZXMKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZmllbGRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGkubmV4dCgpOwotICAgICAgICAgIGZpZWxkLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBhZGQgbmV3IG9uZXMKLSAgICAgICAgZmllbGRzLmNsZWFyKCk7Ci0gICAgICAgIElTdHJ1Y3R1cmUgY29tcGxleFR5cGUgPSAoSVN0cnVjdHVyZSkgbW9kZWw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbXBsZXhUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGkubmV4dCgpOwotICAgICAgICAgIGZpZWxkcy5hZGQoZmllbGQpOwotICAgICAgICAgIGZpZWxkLnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGlmIChvYmplY3QgPT0gbW9kZWwpCi0gICAgICB7Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBmaWVsZHMgd2UncmUgbGlzdGVuaW5nIHRvbwotICAgICAgICAvLyBzaW5jZSB0aGVzZSBtYXkgaGF2ZSBjaGFuZ2VkCi0gICAgICAgIHJlY29tcHV0ZVN1Ykxpc3RlbmVycygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpZWxkKQotICAgICAgewotICAgICAgfSAgCi0gICAgICBub3RpZnlMaXN0ZW5lcnMob2JqZWN0LCBwcm9wZXJ0eSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1Jvb3RIb2xkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvUm9vdEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTdiM2E2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvUm9vdEhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBSb290SG9sZGVyCi17Ci0gIElBRFRPYmplY3QgbW9kZWw7Ci0KLSAgcHVibGljIFJvb3RIb2xkZXIoSUFEVE9iamVjdCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9BRFREaXJlY3RFZGl0UG9saWN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0FEVERpcmVjdEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmMjJiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0FEVERpcmVjdEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQURURGlyZWN0RWRpdFBvbGljeSBleHRlbmRzIERpcmVjdEVkaXRQb2xpY3kKLXsKLSAgcHJvdGVjdGVkIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIgZGVsZWdhdGU7Ci0gIHByb3RlY3RlZCBJQURUVXBkYXRlQ29tbWFuZCBjb21tYW5kOwotCi0gIHB1YmxpYyBBRFREaXJlY3RFZGl0UG9saWN5KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgc2V0VXBkYXRlQ29tbWFuZChJQURUVXBkYXRlQ29tbWFuZCBjb21tYW5kKQotICB7Ci0gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsgICAgICAKLSAgICBnZXRIb3N0RmlndXJlKCkuZ2V0VXBkYXRlTWFuYWdlcigpLnBlcmZvcm1VcGRhdGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21tYW5kIGdldERpcmVjdEVkaXRDb21tYW5kKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBjb21tYW5kLnNldFJlcXVlc3QocmVxdWVzdCk7Ci0gICAgcmV0dXJuIChDb21tYW5kKWNvbW1hbmQ7IAotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDcxNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUZlZWRiYWNrSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSBleHRlbmRzIFNlbGVjdGlvbkVkaXRQb2xpY3kKLXsKLQotICBwdWJsaWMgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkKLSAgewotICAgIGlmIChnZXRIb3N0KCkgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgIHsKLSAgICAgICgoSUZlZWRiYWNrSGFuZGxlcikgZ2V0SG9zdCgpKS5yZW1vdmVGZWVkYmFjaygpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKQotICB7Ci0gICAgaWYgKGdldEhvc3QoKSBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpCi0gICAgewotICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKSBnZXRIb3N0KCkpLmFkZEZlZWRiYWNrKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKQotICB7Ci0gICAgc3VwZXIuc2hvd0ZvY3VzKCk7Ci0gICAgZ2V0SG9zdCgpLnNldEZvY3VzKHRydWUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKQotICB7Ci0gICAgc3VwZXIuaGlkZUZvY3VzKCk7Ci0gICAgZ2V0SG9zdCgpLnNldEZvY3VzKGZhbHNlKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0RpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9EaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxYjQ5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0RpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0gICAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlCi17ICAgICAgIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdChDZWxsRWRpdG9yIGNlbGxFZGl0b3IpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0lBRFRVcGRhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0lBRFRVcGRhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzRlYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9JQURUVXBkYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFEVFVwZGF0ZUNvbW1hbmQKLXsKLSAgdm9pZCBzZXRSZXF1ZXN0KERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0tleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwZWU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0tleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxFZGl0UG9saWN5OwotCi1wdWJsaWMgY2xhc3MgS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSBleHRlbmRzIEdyYXBoaWNhbEVkaXRQb2xpY3kKLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZID0gIktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kiOwotICAKLSAgcHVibGljIHN0YXRpYyBpbnQgT1VUX1RPX1BBUkVOVCA9IFBvc2l0aW9uQ29uc3RhbnRzLkFMV0FZU19MRUZUOwotICBwdWJsaWMgc3RhdGljIGludCBJTl9UT19GSVJTVF9DSElMRCA9IFBvc2l0aW9uQ29uc3RhbnRzLkFMV0FZU19SSUdIVDsKLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBnZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvU2ltcGxlRGlyZWN0RWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9TaW1wbGVEaXJlY3RFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzhlMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9TaW1wbGVEaXJlY3RFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLXB1YmxpYyBjbGFzcyBTaW1wbGVEaXJlY3RFZGl0UG9saWN5IGV4dGVuZHMgRGlyZWN0RWRpdFBvbGljeSAKLXsKLSAgcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotICBwdWJsaWMgdm9pZCBzZXREZWxlZ2F0ZShEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUgZGVsZWdhdGUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGdldERpcmVjdEVkaXRDb21tYW5kKGZpbmFsIERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIAotICB7IAotICAJcmV0dXJuIG5ldyBDb21tYW5kKCkgLy9BYnN0cmFjdENvbW1hbmQoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsZWdhdGUucGVyZm9ybUVkaXQocmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgIAotICAKLSAgICAgIHB1YmxpYyB2b2lkIHJlZG8oKQotICAgICAgewotICAgICAgfSAgCi0gIAotICAgICAgcHVibGljIHZvaWQgdW5kbygpCi0gICAgICB7Ci0gICAgICB9ICAgICAKLSAgCi0gICAgICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsgICAgICAKLSAgCS8vaGFjayB0byBwcmV2ZW50IGFzeW5jIGxheW91dCBmcm9tIHBsYWNpbmcgdGhlIGNlbGwgZWRpdG9yIHR3aWNlLgotICAJZ2V0SG9zdEZpZ3VyZSgpLmdldFVwZGF0ZU1hbmFnZXIoKS5wZXJmb3JtVXBkYXRlKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JQURURmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JQURURmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NGEyNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUFEVEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElBRFRGaWd1cmUgZXh0ZW5kcyBJRmlndXJlCi17Ci0gIHZvaWQgZWRpdFBhcnRBdHRhY2hlZChFZGl0UGFydCBvd25lcik7IAotICB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0gIHZvaWQgcmVtb3ZlU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgdm9pZCByZWZyZXNoVmlzdWFscyhPYmplY3QgbW9kZWwpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUNvbXBhcnRtZW50RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JQ29tcGFydG1lbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyNWRlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JQ29tcGFydG1lbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wYXJ0bWVudEZpZ3VyZSBleHRlbmRzIElBRFRGaWd1cmUKLXsKLSAgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpOwotICBJRmlndXJlIGdldEFubm90YXRpb25QYW5lKCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lGaWVsZEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUZpZWxkRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYWJlYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUZpZWxkRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBJRmllbGRGaWd1cmUgZXh0ZW5kcyBJQURURmlndXJlCi17Ci0gIExhYmVsIGdldFR5cGVMYWJlbCgpOwotICBMYWJlbCBnZXROYW1lTGFiZWwoKTsKLSAgTGFiZWwgZ2V0TmFtZUFubm90YXRpb25MYWJlbCgpOwotICBMYWJlbCBnZXRUeXBlQW5ub3RhdGlvbkxhYmVsKCk7Ci0gIHZvaWQgcmVjb21wdXRlTGF5b3V0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JRmlndXJlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUZpZ3VyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlZmU2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JRmlndXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGaWd1cmVGYWN0b3J5Ci17Ci0gIElGaWVsZEZpZ3VyZSBjcmVhdGVGaWVsZEZpZ3VyZShPYmplY3QgbW9kZWwpOwotICBJU3RydWN0dXJlRmlndXJlIGNyZWF0ZVN0cnVjdHVyZUZpZ3VyZShPYmplY3QgbW9kZWwpOwotICBJQ29tcGFydG1lbnRGaWd1cmUgY3JlYXRlQ29tcGFydG1lbnRGaWd1cmUoT2JqZWN0IG1vZGVsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lTdHJ1Y3R1cmVGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lTdHJ1Y3R1cmVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5NmFmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JU3RydWN0dXJlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVGaWd1cmUgZXh0ZW5kcyBJQURURmlndXJlCi17Ci0gIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKTsKLSAgTGFiZWwgZ2V0TmFtZUxhYmVsKCk7Ci0gIGJvb2xlYW4gaGl0VGVzdEhlYWRlcihQb2ludCBwb2ludCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhYzk5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0L0NvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyCi17Ci0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldEJyb3dzZURpYWxvZygpOwotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXROZXdEaWFsb2coKTsKLSAgcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZWZlcmVuY2VkQ29tcG9uZW50KTsKLSAgcHVibGljIElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGdldENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoKTsKLSAgCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0UXVpY2tQaWNrcygpOwotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldEhpc3RvcnkoKTsKLSAgcHVibGljIHZvaWQgYWRkVG9IaXN0b3J5KENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMTMxMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyIGV4dGVuZHMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsKLSAgdm9pZCBzZXRSZWZlcmVuY2VyKElBRFRPYmplY3QgZmllbGQpOwotICBJQURUT2JqZWN0IGdldFJlZmVyZW5jZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvSUNvbXBvbmVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9JQ29tcG9uZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTRmOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9JQ29tcG9uZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50RGlhbG9nICB7Ci0gIAotCS8qCi0JICogU2V0IHRoZSBPYmplY3QgYmVpbmcgc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24pOwotCQotCS8qCi0JICogUmV0dXJuIHRoZSBPYmplY3Qgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHR5cGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkKLQkvKgotCSAqIFVzZWQgdG8gb3BlbiB0aGUgRGlhbG9nCi0JICovCi0JcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmNWFhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRW5jb2RlZFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQgZXh0ZW5kcyBQbGF0Zm9ybU9iamVjdAotewotICBwcml2YXRlIElTdG9yYWdlIHN0b3JhZ2U7Ci0gIHByaXZhdGUgU3RyaW5nIHVybFN0cmluZzsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDaGFyc2V0KFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGdldENvbnRlbnREZXNjcmlwdGlvbihuYW1lLCBzdHJlYW0pOwotICAgIHJldHVybiBkZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IGRlc2NyaXB0aW9uLmdldENoYXJzZXQoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBjb250ZW50VHlwZU1hbmFnZXIuZ2V0RGVzY3JpcHRpb25Gb3Ioc3RyZWFtLCBuYW1lLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBpZiAoc3RyZWFtICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEFEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50KFN0cmluZyB1cmxTdHJpbmcpCi0gIHsKLSAgICB0aGlzLnVybFN0cmluZyA9IHVybFN0cmluZzsKLSAgfQotCi0gIGNsYXNzIFhTRFJlc291cmNlVmFyaWFudFN0b3JhZ2UgaW1wbGVtZW50cyBJRW5jb2RlZFN0b3JhZ2UKLSAgewotCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZSgpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBGaWxlKHVybFN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotICAgICAgICAgIFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgIHJldHVybiB1cmxDb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiB0b0V4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy8gaGFuZGxlCi0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLQotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldEZ1bGxQYXRoKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFBhdGgodXJsU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRGdWxsUGF0aCgpLnRvRmlsZSgpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgICB7Ci0gICAgICByZXR1cm4gQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQudGhpcy5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgSW5wdXRTdHJlYW0gY29udGVudHMgPSBnZXRDb250ZW50cygpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjaGFyU2V0ID0gQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQuZ2V0Q2hhcnNldChnZXROYW1lKCksIGNvbnRlbnRzKTsKLSAgICAgICAgcmV0dXJuIGNoYXJTZXQ7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0RFZGl0b3JQbHVnaW4uUExVR0lOX0lELCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX0RFU0NSSUJJTkdfQ09OVEVOVFMsIE5MUy5iaW5kKCIiLCBuZXcgU3RyaW5nW10geyBnZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgfSksIGUpKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBjb250ZW50cy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4Y2VwdGlvbikKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSVN0b3JhZ2UgZ2V0U3RvcmFnZSgpCi0gIHsKLSAgICBpZiAoc3RvcmFnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHN0b3JhZ2UgPSBuZXcgWFNEUmVzb3VyY2VWYXJpYW50U3RvcmFnZSgpOwotICAgIH0KLSAgICByZXR1cm4gc3RvcmFnZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVEZpbGVTdG9yZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURmlsZVN0b3JlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmYzg3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURmlsZVN0b3JlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFEVEZpbGVTdG9yZUVkaXRvcklucHV0IGV4dGVuZHMgRmlsZVN0b3JlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJQURURWRpdG9ySW5wdXQKLXsKLSAgcHJpdmF0ZSBYU0RTY2hlbWEgc2NoZW1hOwotICBwcml2YXRlIFN0cmluZyBlZGl0b3JOYW1lOwotCi0gIHB1YmxpYyBBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dChJRmlsZVN0b3JlIGZpbGVTdG9yZSwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKGZpbGVTdG9yZSk7Ci0gICAgdGhpcy5zY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGVkaXRvck5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIGlmIChlZGl0b3JOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGVkaXRvck5hbWU7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkKLSAgewotICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnMgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBpZiAobnMgIT0gbnVsbCAmJiBucy5sZW5ndGgoKSA+IDApCi0gICAgICAgIHJldHVybiBNZXNzYWdlcy5fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRSArIG5zOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gTWVzc2FnZXMuX1VJX0xBQkVMX05PX05BTUVTUEFDRTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldFRvb2xUaXBUZXh0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRNdWx0aVBhZ2VFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRNdWx0aVBhZ2VFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmZjE3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURUTXVsdGlQYWdlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5TZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uQURURmxvYXRpbmdUb29sYmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQURURWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5BRFRDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5BRFRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBRFRNdWx0aVBhZ2VFZGl0b3IgZXh0ZW5kcyBDb21tb25NdWx0aVBhZ2VFZGl0b3IKLXsKLSAgcHJvdGVjdGVkIElNb2RlbCBtb2RlbDsKLSAgcHJpdmF0ZSBpbnQgY3VycmVudFBhZ2UgPSAtMTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiB0YWJsZU9mQ29udGVudHNCdXR0b247Ci0gIHByb3RlY3RlZCBBRFRGbG9hdGluZ1Rvb2xiYXIgZmxvYXRpbmdUb29sYmFyOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBtdWx0aS1wYWdlIGVkaXRvciBleGFtcGxlLgotICAgKi8KLSAgcHVibGljIEFEVE11bHRpUGFnZUVkaXRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgCi0gIHByaXZhdGUgY2xhc3MgSW50ZXJuYWxMYXlvdXQgZXh0ZW5kcyBTdGFja0xheW91dAotICB7Ci0gICAgcHVibGljIEludGVybmFsTGF5b3V0KCkKLSAgICB7Ci0gICAgICBzdXBlcigpOyAgCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpCi0gICAgewotICAgICAgQ29udHJvbCBjaGlsZHJlbltdID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICByZWN0LnggKz0gbWFyZ2luV2lkdGg7Ci0gICAgICByZWN0LnkgKz0gbWFyZ2luSGVpZ2h0OwotICAgICAgcmVjdC53aWR0aCAtPSAyICogbWFyZ2luV2lkdGg7Ci0gICAgICByZWN0LmhlaWdodCAtPSAyICogbWFyZ2luSGVpZ2h0OwotICAgICAgCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSAKLSAgICAgIHsKLSAgICAgICAgaWYgKGkgPT0gMCkgIC8vIEZvciB0aGUgYmFjayB0byBzY2hlbWEgYnV0dG9uIAotICAgICAgICB7IAotICAgICAgICAgIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGUgciA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpZmxvYXRpbmdUb29sYmFyLmdldENvbnRlbnRzKCkpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotICAgICAgICAgIGNoaWxkcmVuW2ldLnNldEJvdW5kcyhyZWN0LnggKyAxMCwgcmVjdC55ICsgMTAsIHIud2lkdGgsIE1hdGgubWF4KDI0LCByLmhlaWdodCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGkgPT0gMSAmJiBtb2RlQ29tYm8gIT0gbnVsbCkgLy8gRm9yIHRoZSBkcm9wIGRvd24gdG9vbGJhcgotICAgICAgICB7Ci0gICAgICAgICAgY2hpbGRyZW5baV0uc2V0Qm91bmRzKHJlY3QueCArIHJlY3Qud2lkdGggLSA5MCAtIG1heExlbmd0aCwgcmVjdC55ICsgMTAsIG1heExlbmd0aCArIDYwLCAyNik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvLyBGb3IgdGhlIG1haW4gZ3JhcGggdmlld2VyCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZHJlbltpXS5zZXRCb3VuZHMocmVjdCk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9ICAgICAgIAotICAgIH0gICAgICAgICAgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVHcmFwaFBhZ2VDb21wb3NpdGUoKQotICB7ICAgIAotICAgIENvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGdldENvbnRhaW5lcigpLCBTV1QuRkxBVCk7Ci0gICAgcGFyZW50LnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIAotICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEludGVybmFsTGF5b3V0KCkpOwotCi0gICAgZmxvYXRpbmdUb29sYmFyID0gbmV3IEFEVEZsb2F0aW5nVG9vbGJhcihnZXRNb2RlbCgpKTsKLSAgICBmbG9hdGluZ1Rvb2xiYXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIGZsb2F0aW5nVG9vbGJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5ID0gZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKS5nZXRDdXJyZW50TW9kZSgpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIGZsb2F0aW5nVG9vbGJhci5zZXRFZGl0UGFydEZhY3RvcnkoZWRpdFBhcnRGYWN0b3J5KTsKLSAgICAKLSAgICBjcmVhdGVWaWV3TW9kZVRvb2xiYXIocGFyZW50KTsKLSAgICAKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaFBhZ2UoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlR3JhcGhQYWdlKCk7IAotLy8gICAgdG9vbGJhclZpZXdlci5nZXRDb250cm9sKCkubW92ZUFib3ZlKGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCkpOwotLy8gICAgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRyb2woKS5tb3ZlQmVsb3codG9vbGJhclZpZXdlci5nZXRDb250cm9sKCkpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkKLSAgewotICAgIGlmIChmT3V0bGluZVBhZ2UgPT0gbnVsbCB8fCBmT3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgZk91dGxpbmVQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgZmluYWwgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpZ2V0QWRhcHRlcihQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgIEV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2Ugb3V0bGluZVBhZ2UgPSBudWxsOwotICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0bGluZVBhZ2UgPSBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldFByb2R1Y3RDb250ZW50T3V0bGluZVBhZ2UoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKG91dGxpbmVQYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dGxpbmVQYWdlID0gbmV3IEFEVENvbnRlbnRPdXRsaW5lUGFnZSgpOwotICAgICAgfQotICAgICAgb3V0bGluZVBhZ2Uuc2V0RWRpdG9yKHRoaXMpOwotICAgICAgSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKS5nZXRDdXJyZW50TW9kZSgpLmdldE91dGxpbmVQcm92aWRlcigpOwotICAgICAgb3V0bGluZVBhZ2Uuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgIEFEVExhYmVsUHJvdmlkZXIgYWR0TGFiZWxQcm92aWRlciA9IG5ldyBBRFRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICBvdXRsaW5lUGFnZS5zZXRMYWJlbFByb3ZpZGVyKGFkdExhYmVsUHJvdmlkZXIpOwotICAgICAgb3V0bGluZVBhZ2Uuc2V0TW9kZWwoZ2V0TW9kZWwoKSk7Ci0gICAgICBmT3V0bGluZVBhZ2UgPSBvdXRsaW5lUGFnZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZPdXRsaW5lUGFnZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIHRoZSBwYWdlcyBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpCi0gIHsKLSAgICBzZWxlY3Rpb25Qcm92aWRlciA9IGdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLSAgICAKLSAgICBjcmVhdGVHcmFwaFBhZ2UoKTsKLSAgICBjcmVhdGVTb3VyY2VQYWdlKCk7Ci0gICAgCi0gICAgZ2V0RWRpdG9yU2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLQotICAgIG1vZGVsID0gYnVpbGRNb2RlbCgpOyAgLy8gKElGaWxlRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgCi0gICAgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpOwotICAgIGZsb2F0aW5nVG9vbGJhci5zZXRNb2RlbChtb2RlbCk7Ci0gICAgCi0gICAgaW50IHBhZ2VJbmRleFRvU2hvdyA9IGdldERlZmF1bHRQYWdlVHlwZUluZGV4KCk7Ci0gICAgc2V0QWN0aXZlUGFnZShwYWdlSW5kZXhUb1Nob3cpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBnZXREZWZhdWx0UGFnZVR5cGVJbmRleCgpIHsKLSAgICBpbnQgcGFnZUluZGV4ID0gU09VUkNFX1BBR0VfSU5ERVg7Ci0gICAgaWYgKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXREZWZhdWx0UGFnZSgpLmVxdWFscyhYU0RFZGl0b3JQbHVnaW4uREVTSUdOX1BBR0UpKSB7Ci0gICAgICAgIHBhZ2VJbmRleCA9IERFU0lHTl9QQUdFX0lOREVYOwotICAgIH0KLQotICAgIHJldHVybiBwYWdlSW5kZXg7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkKLSAgewotICAgIHN1cGVyLnNldEZvY3VzKCk7Ci0gICAgaWYgKGdldEFjdGl2ZVBhZ2UoKSA9PSBERVNJR05fUEFHRV9JTkRFWCkKLSAgICB7Ci0gICAgICBpZiAoZ3JhcGhpY2FsVmlld2VyICE9IG51bGwgJiYgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBMaXN0IHNlbGVjdGVkID0gZ3JhcGhpY2FsVmlld2VyLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldEZvY3VzKChFZGl0UGFydClzZWxlY3RlZC5nZXQoMCkpOwotICAgICAgICB9Ci0gICAgICAgIGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBncmFwaGljYWxWaWV3ZXIuc2V0Rm9jdXMobnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KQotICB7Ci0gICAgY3VycmVudFBhZ2UgPSBuZXdQYWdlSW5kZXg7Ci0gICAgc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotICAgIAotICAgIGlmIChuZXdQYWdlSW5kZXggPT0gREVTSUdOX1BBR0VfSU5ERVgpCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBncmFwaGljYWxWaWV3ZXIuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmdldFNlbGVjdGlvbigpOwotICAgICAgT2JqZWN0IG1vZGVsID0gbnVsbDsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICAgIC8vIFdoaWxlIGluIHRoZSBzb3VyY2Ugdmlldywgc2VsZWN0aW9uIGNvdWxkIGhhdmUgY2hhbmdlZC4KLSAgICAgICAgLy8gV2lsbCB0cnkgdG8gc2VsZWN0IHRoZSBmaXJzdCBpdGVtIHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gdGhlIGRlc2lnbiB2aWV3LgotICAgICAgICAvLyBXZSBjdXJyZW50bHkgZG8gbm90IG11bHRpLXNlbGVjdCBmaWd1cmVzIGlmIG11bHRpcGxlIGVsZW1lbnRzIGFyZSBzZWxlY3RlZCBpbiB0aGUgc291cmNlIHZpZXcuCi0gICAgICAgIC8vIEZvciBleGFtcGxlLCBpZiBtdWx0aXBsZSBnbG9iYWwgZWxlbWVudHMgYXJlIHNlbGVjdGVkLCB0aGUgZ3JhcGggdmlldyB3aWxsIGJlIGluIHRoZSBkZXRhaWxzIHZpZXcKLSAgICAgICAgLy8gb2YgdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgT2JqZWN0IGVsZW0gPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbSBpbnN0YW5jZW9mIEVkaXRQYXJ0KQotICAgICAgICAgIG1vZGVsID0gKChFZGl0UGFydCllbGVtKS5nZXRNb2RlbCgpOwotICAgICAgfQotICAgICAgLy8gUmVmcmVzaCB0aGUgZGVzaWduIHBhZ2UgdXBvbiBwYWdlIGNoYW5nZQotICAgICAgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRlbnRzKCkucmVmcmVzaCgpOwotICAgICAgLy8gTmVlZCB0byB1c2UgdGhlIGFkYXB0ZXIsIHNpbmNlIGFmdGVyIHJlZnJlc2gsIHRoZSBvbGQgZWRpdCBwYXJ0IHdpbGwgaGF2ZSBiZWVuIHJlcGxhY2VkCi0gICAgICAvLyBNYWludGFpbiBwcmV2aW91cyBzZWxlY3Rpb246Ci0gICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbCkpOwotICAgICAgfQotICAgIH0KLSAgICBzZXRGb2N1cygpOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gaXNUYWJsZU9mQ29udGVudHNBcHBsaWNhYmxlKE9iamVjdCBncmFwaFZpZXdJbnB1dCkKLSAgewotICAgIHJldHVybiAhKGdyYXBoVmlld0lucHV0IGluc3RhbmNlb2YgSU1vZGVsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLSAgewotICAgIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gbmV3IERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIodGhpcywgZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICB2aWV3ZXIuYWRkSW5wdXRDaGFuZ2RMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5wdXQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGZsb2F0aW5nVG9vbGJhci5yZWZyZXNoKGlzVGFibGVPZkNvbnRlbnRzQXBwbGljYWJsZShpbnB1dC5nZXRGaXJzdEVsZW1lbnQoKSkpOwotICAgICAgfSAgICAgIAotICAgIH0pOwotICAgIC8vIFdvcmthcm91bmQgYnVnIDIyNzY4NyBBbiBlZGl0IHBhcnQncyBmb2N1cyBzdGF0ZSBpcyBub3QgdXBkYXRlZCBwcm9wZXJseQotICAgIC8vIE9uY2UgdGhpcyBpcyBidWcgaXMgZml4ZWQsIHdlIGNhbiByZW1vdmUgY3VzdG9tIHNlbGVjdGlvbiBtYW5hZ2VyCi0gICAgdmlld2VyLnNldFNlbGVjdGlvbk1hbmFnZXIobmV3IEN1c3RvbVNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmV0dXJuIHZpZXdlcjsKLSAgfQotCi0gIC8vIFdvcmthcm91bmQgYnVnIDIyNzY4NyBBbiBlZGl0IHBhcnQncyBmb2N1cyBzdGF0ZSBpcyBub3QgdXBkYXRlZCBwcm9wZXJseQotICAvLyBPbmNlIHRoaXMgaXMgYnVnIGlzIGZpeGVkLCB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2xhc3MKLSAgcHJpdmF0ZSBjbGFzcyBDdXN0b21TZWxlY3Rpb25NYW5hZ2VyIGV4dGVuZHMgU2VsZWN0aW9uTWFuYWdlcgotICB7Ci0gICAgcHVibGljIHZvaWQgYXBwZW5kU2VsZWN0aW9uKEVkaXRQYXJ0IGVkaXRwYXJ0KQotICAgIHsKLSAgICAgIGlmIChlZGl0cGFydCAhPSBnZXRGb2N1cygpKQotICAgICAgICBnZXRWaWV3ZXIoKS5zZXRGb2N1cyhlZGl0cGFydCk7Ci0gICAgICBzdXBlci5hcHBlbmRTZWxlY3Rpb24oZWRpdHBhcnQpOwotICAgIH0KLSAgfQotICAKLSAgYWJzdHJhY3QgcHVibGljIElNb2RlbCBidWlsZE1vZGVsKCk7ICAvLyAoSUZpbGVFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCk7Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkKLSAgewotICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLSAgICAKLSAgICBCYXNlU2VsZWN0aW9uQWN0aW9uIGFjdGlvbiA9IG5ldyBTZXRJbnB1dFRvR3JhcGhWaWV3KHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gIH0KLQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSA9PSBab29tTWFuYWdlci5jbGFzcykKLSAgICAgIHJldHVybiBncmFwaGljYWxWaWV3ZXIuZ2V0UHJvcGVydHkoWm9vbU1hbmFnZXIuY2xhc3MudG9TdHJpbmcoKSk7Ci0gICAgCi0gICAgaWYgKHR5cGUgPT0gR3JhcGhpY2FsVmlld2VyLmNsYXNzKQotICAgICAgcmV0dXJuIGdyYXBoaWNhbFZpZXdlcjsKLSAgICBpZiAodHlwZSA9PSBFZGl0UGFydC5jbGFzcyAmJiBncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiBncmFwaGljYWxWaWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0gICAgaWYgKHR5cGUgPT0gSUZpZ3VyZS5jbGFzcyAmJiBncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBncmFwaGljYWxWaWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkpLmdldEZpZ3VyZSgpOwotCi0gICAgaWYgKHR5cGUgPT0gSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0Q29udGVudE91dGxpbmVQYWdlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIodHlwZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGdldEVkaXRQYXJ0RmFjdG9yeSgpIHsKLSAgICByZXR1cm4gbmV3IEFEVEVkaXRQYXJ0RmFjdG9yeSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpCi0gIHsKLSAgICBncmFwaGljYWxWaWV3ZXIuc2V0Q29udGVudHMobW9kZWwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChjdXJyZW50UGFnZSA9PSBTT1VSQ0VfUEFHRV9JTkRFWCkKLSAgICB7Ci0gICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuc2V0U291cmNlUGFnZUFzRGVmYXVsdCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLnNldERlc2lnblBhZ2VBc0RlZmF1bHQoKTsKLSAgICB9Ci0gICAgZmxvYXRpbmdUb29sYmFyID0gbnVsbDsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZmQ4ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiAKLSAqIFVzZWQgZm9yIGFueSByZWFkLW9ubHkgZmlsZXMsIGllLiBIVFRQIGZpbGVzLgotICoKLSAqLwotcHVibGljIGNsYXNzIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCwgSUFEVEVkaXRvcklucHV0Ci17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJsU3RyaW5nOwotICBwcm90ZWN0ZWQgSVN0b3JhZ2Ugc3RvcmFnZTsKLSAgcHJvdGVjdGVkIEFEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50IHZhcmlhbnQ7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBwcm90ZWN0ZWQgU3RyaW5nIGVkaXRvck5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZWRpdG9ySUQgPSAiIjsKLQotICBwdWJsaWMgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQoU3RyaW5nIHVybFN0cmluZykKLSAgewotICAgIHRoaXMudXJsU3RyaW5nID0gdXJsU3RyaW5nOwotICAgIHZhcmlhbnQgPSBuZXcgQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQodXJsU3RyaW5nKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKLSAgewotICAgIGlmIChvID09IHRoaXMpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChvIGluc3RhbmNlb2YgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpCi0gICAgewotICAgICAgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpIG87Ci0gICAgICAKLSAgICAgIHJldHVybiB1cmxTdHJpbmcuZXF1YWxzKGlucHV0LmdldFVybFN0cmluZygpKSAmJiBpbnB1dC5nZXRFZGl0b3JJRCgpLmVxdWFscyhlZGl0b3JJRCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVcmxTdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIHVybFN0cmluZzsKLSAgfQotICAKLSAgcHVibGljIElTdG9yYWdlIGdldFN0b3JhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgc3RvcmFnZSA9IHZhcmlhbnQuZ2V0U3RvcmFnZSgpOwotICAgIHJldHVybiBzdG9yYWdlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIGlmIChlZGl0b3JOYW1lID09IG51bGwpCi0gICAgewotICAgICAgVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJsU3RyaW5nKTsKLSAgICAgIHJldHVybiB1cmkubGFzdFNlZ21lbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRvck5hbWU7Ci0gIH0KLQotICBwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpCi0gIHsKLSAgICAvLyBodHRwIGZpbGVzIGNhbm5vdCBwZXJzaXN0Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkKLSAgewotICAgIHJldHVybiB1cmxTdHJpbmc7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgewotICAgIGlmIChhZGFwdGVyID09IElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgaWYgKGFkYXB0ZXIgPT0gSVN0b3JhZ2UuY2xhc3MpCi0gICAgICByZXR1cm4gc3RvcmFnZTsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZWRpdG9yTmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JJRChTdHJpbmcgZWRpdG9ySUQpCi0gIHsKLSAgICB0aGlzLmVkaXRvcklEID0gZWRpdG9ySUQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWRpdG9ySUQoKQotICB7Ci0gICAgcmV0dXJuIGVkaXRvcklEOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29tbW9uTXVsdGlQYWdlRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29tbW9uTXVsdGlQYWdlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiY2RiYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vbk11bHRpUGFnZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLk1vdXNlV2hlZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Nb3VzZVdoZWVsWm9vbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5ab29tTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5VcGRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuWm9vbUluQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlpvb21PdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2VsZWN0aW9uU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRmxhdENDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21tb25NdWx0aVBhZ2VFZGl0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIENvbW1hbmRTdGFja0xpc3RlbmVyLCBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciwgSVByb3BlcnR5TGlzdGVuZXIsIElFZGl0b3JNb2RlTGlzdGVuZXIKLXsKLSAgcHVibGljIHN0YXRpYyBpbnQgU09VUkNFX1BBR0VfSU5ERVggPSAxLCBERVNJR05fUEFHRV9JTkRFWCA9IDA7ICAKLSAgCi0gIHByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGZPdXRsaW5lUGFnZTsKLSAgcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW47Ci0gIHByb3RlY3RlZCBTZWxlY3Rpb25TeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOwotICBwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0gIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBzdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLSAgcHJvdGVjdGVkIENvbW1vblNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotICBwcm90ZWN0ZWQgRWRpdG9yTW9kZU1hbmFnZXIgZWRpdG9yTW9kZU1hbmFnZXI7Ci0gIHByb3RlY3RlZCBGbGF0Q0NvbWJvIG1vZGVDb21ibzsKLSAgcHJpdmF0ZSBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVbXSBlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHRvb2xiYXI7Ci0gIHByb3RlY3RlZCBNb2RlQ29tYm9MaXN0ZW5lciBtb2RlQ29tYm9MaXN0ZW5lcjsKLSAgcHJvdGVjdGVkIGludCBtYXhMZW5ndGggPSAwOwotICBwcm90ZWN0ZWQgQ29tbW9uQWN0aXZhdGlvbkxpc3RlbmVyIGZBY3RpdmF0aW9uTGlzdGVuZXI7Ci0gIAotICBwdWJsaWMgQ29tbW9uTXVsdGlQYWdlRWRpdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgZWRpdERvbWFpbiA9IG5ldyBEZWZhdWx0RWRpdERvbWFpbih0aGlzKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IG1vdXNlRXZlbnQsIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcikKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBlYXRUaGVFdmVudCA9IGZhbHNlOyAgICAgIAotICAgICAgICBMYXllck1hbmFnZXIgbWFuYWdlciA9IChMYXllck1hbmFnZXIpdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoTGF5ZXJNYW5hZ2VyLklEKTsgICAgIAotICAgICAgICBJRmlndXJlIGxheWVyID0gbWFuYWdlci5nZXRMYXllcihEZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLlNDQUxFRF9IQU5ETEVfTEFZRVIpOwotICAgICAgICBpZiAobGF5ZXIgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgUG9pbnQgcCA9IG5ldyBQb2ludChtb3VzZUV2ZW50LngsIG1vdXNlRXZlbnQueSk7Ci0gICAgICAgICAgbGF5ZXIudHJhbnNsYXRlVG9SZWxhdGl2ZShwKTsKLSAgICAgICAgICBJRmlndXJlIGZpZ3VyZSA9IGxheWVyLmZpbmRGaWd1cmVBdChwKTsgICAgIAotICAgICAgICAgIGlmIChmaWd1cmUgIT0gbnVsbCAmJiBmaWd1cmUgIT0gbGF5ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gd2UgZWF0IHRoaXMgc2VsZWN0aW9uIGV2ZW50IQotICAgICAgICAgICAgZWF0VGhlRXZlbnQgPSB0cnVlOwotICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICAgICAgaWYgKCFlYXRUaGVFdmVudCkKLSAgICAgICAgewotICAgICAgICAgIHN1cGVyLm1vdXNlRG93bihtb3VzZUV2ZW50LCB2aWV3ZXIpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAKLSAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yI2dldENvbnRyaWJ1dG9ySWQoKQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDb250cmlidXRvcklkKCk7Ci0gIAotICAKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQWN0aW9ucygpOwotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVQYWdlcygpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpCi0gIHsKLQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICB7Ci0vLyAgICBnZXRFZGl0b3IoMSkuZG9TYXZlKG1vbml0b3IpOyAKLSAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5kb1NhdmUobW9uaXRvcik7Ci0gICAgZ2V0Q29tbWFuZFN0YWNrKCkubWFya1NhdmVMb2NhdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmVBcygpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb1NhdmVBcygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRFZGl0b3IoMSk7Ci0vLyAgICBlZGl0b3IuZG9TYXZlQXMoKTsKLSAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5kb1NhdmVBcygpOwotICAgIHNldElucHV0KHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgIHNldFBhcnROYW1lKGVkaXRvci5nZXRUaXRsZSgpKTsKLSAgICBnZXRDb21tYW5kU3RhY2soKS5tYXJrU2F2ZUxvY2F0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotICAgKiAKLSAgICogQ2xvc2VzIGFsbCBwcm9qZWN0IGZpbGVzIG9uIHByb2plY3QgY2xvc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoZmluYWwgSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSkKLSAgICB7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgIElXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFnZXMoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKEZpbGVFZGl0b3JJbnB1dCkgc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpLmdldFByb2plY3QoKS5lcXVhbHMoZXZlbnQuZ2V0UmVzb3VyY2UoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlc1tpXS5maW5kRWRpdG9yKHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgICAgICAgICAgICBwYWdlc1tpXS5jbG9zZUVkaXRvcihlZGl0b3JQYXJ0LCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrTGlzdGVuZXIjY29tbWFuZFN0YWNrQ2hhbmdlZChqYXZhLnV0aWwuRXZlbnRPYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKEV2ZW50T2JqZWN0IGV2ZW50KQotICB7Ci0gICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotICB9Ci0gIAotICAvKioKLSAgICogSW5kaWNhdGVzIHRoYXQgYSBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLSAgICogCi0gICAqIEBwYXJhbSBzb3VyY2UKLSAgICogICAgICAgICAgdGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZAotICAgKiBAcGFyYW0gcHJvcElkCi0gICAqICAgICAgICAgIHRoZSBpZCBvZiB0aGUgcHJvcGVydHkgd2hpY2ggaGFzIGNoYW5nZWQ7IHByb3BlcnR5IGlkcyBhcmUKLSAgICogICAgICAgICAgZ2VuZXJhbGx5IGRlZmluZWQgYXMgY29uc3RhbnRzIG9uIHRoZSBzb3VyY2UgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgc291cmNlLCBpbnQgcHJvcElkKQotICB7Ci0gICAgc3dpdGNoIChwcm9wSWQpCi0gICAgewotICAgICAgLy8gaGFkIHRvIGltcGxlbWVudCBpbnB1dCBjaGFuZ2VkICJsaXN0ZW5lciIgc28gdGhhdAotICAgICAgLy8gc3RydWN1dGVkVGV4dCBjb3VsZCB0ZWxsIGl0IGNvbnRhaW5pbmcgZWRpdG9yIHRoYXQKLSAgICAgIC8vIHRoZSBpbnB1dCBoYXMgY2hhbmdlLCB3aGVuIGEgJ3Jlc291cmNlIG1vdmVkJyBldmVudCBpcwotICAgICAgLy8gZm91bmQuCi0gICAgICBjYXNlIElFZGl0b3JQYXJ0LlBST1BfSU5QVVQgOgotICAgICAgY2FzZSBJRWRpdG9yUGFydC5QUk9QX0RJUlRZIDogewotICAgICAgICBpZiAoc291cmNlID09IHN0cnVjdHVyZWRUZXh0RWRpdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXRJbnB1dChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICAgIC8vIHRpdGxlIHNob3VsZCBhbHdheXMgY2hhbmdlIHdoZW4gaW5wdXQgY2hhbmdlcy4KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBydW5uYWJsZSBmb3IgZm9sbG93aW5nIHBvc3QgY2FsbAotICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ZpcmVQcm9wZXJ0eUNoYW5nZShJV29ya2JlbmNoUGFydC5QUk9QX1RJVExFKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBpcyBqdXN0IHRvIHBvc3QgdGhpbmdzIG9uIHRoZSBkaXNwbGF5IHF1ZXVlCi0gICAgICAgICAgICAvLyAodGhyZWFkKS4gV2UgaGF2ZSB0byBkbyB0aGlzIHRvIGdldCB0aGUgZGlydHkKLSAgICAgICAgICAgIC8vIHByb3BlcnR5IHRvIGdldCB1cGRhdGVkIGFmdGVyIG90aGVyIHRoaW5ncyBvbiB0aGUKLSAgICAgICAgICAgIC8vIHF1ZXVlIGFyZSBleGVjdXRlZC4KLSAgICAgICAgICAgIHBvc3RPbkRpc3BsYXlRdWUocnVubmFibGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSA6IHsKLSAgICAgICAgLy8gdXBkYXRlIHRoZSBpbnB1dCBpZiB0aGUgdGl0bGUgaXMgY2hhbmdlZAotICAgICAgICBpZiAoc291cmNlID09IHN0cnVjdHVyZWRUZXh0RWRpdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXRJbnB1dChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0IDogewotICAgICAgICAvLyBwcm9wYWdhdGUgY2hhbmdlcy4gSXMgdGhpcyBuZWVkZWQ/IEFuc3dlcjogWWVzLgotICAgICAgICBpZiAoc291cmNlID09IHN0cnVjdHVyZWRUZXh0RWRpdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBTaG91bGQgb3ZlcnJpZGUgdG8gc2V0IHRoZSBpbnB1dCB0byB0aGUgZGVzaWduIHZpZXdlciBmb3IgYSBuZXcgZG9jdW1lbnQgY2hhbmdlCi0gIC8vIGllLiB3aGVuIGRvaW5nIGEgc2F2ZUFzCi0gIHByb3RlY3RlZCB2b2lkIHNldElucHV0VG9HcmFwaGljYWxWaWV3ZXIoSURvY3VtZW50IG5ld0lucHV0KQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgaWYgKGdyYXBoaWNhbFZpZXdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldElucHV0VG9HcmFwaGljYWxWaWV3ZXIoZ2V0RG9jdW1lbnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIElEb2N1bWVudCBnZXREb2N1bWVudCgpCi0gIHsKLSAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgIGlmIChzdHJ1Y3R1cmVkVGV4dEVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIGRvY3VtZW50ID0gc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgIH0KLSAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIFNlbGVjdGlvblN5bmNocm9uaXplciBnZXRTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKQotICB7Ci0gICAgaWYgKHN5bmNocm9uaXplciA9PSBudWxsKQotICAgICAgc3luY2hyb25pemVyID0gbmV3IFNlbGVjdGlvblN5bmNocm9uaXplcigpOwotICAgIHJldHVybiBzeW5jaHJvbml6ZXI7Ci0gIH0KLQotICBwdWJsaWMgQ29tbW9uU2VsZWN0aW9uTWFuYWdlciBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkKLSAgewotICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblByb3ZpZGVyID0gbmV3IENvbW1vblNlbGVjdGlvbk1hbmFnZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiBzZWxlY3Rpb25Qcm92aWRlcjsKLSAgfQotICAKLSAgLyoKLSAgICogVGhpcyBtZXRob2QgaXMganVzdCB0byBtYWtlIGZpcmVQcm9wZXJ0eUNoYW5nZWQgYWNjZXNzYmlibGUgZnJvbSBzb21lCi0gICAqIChhbm9ub21vdXMpIGlubmVyIGNsYXNzZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBfZmlyZVByb3BlcnR5Q2hhbmdlKGludCBwcm9wZXJ0eSkKLSAgewotICAgIHN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQb3N0cyB0aGUgdXBkYXRlIGNvZGUgImJlaGluZCIgdGhlIHJ1bm5pbmcgb3BlcmF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcG9zdE9uRGlzcGxheVF1ZShSdW5uYWJsZSBydW5uYWJsZSkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IHdvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0gICAgaWYgKHdpbmRvd3MgIT0gbnVsbCAmJiB3aW5kb3dzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gd2luZG93c1swXS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKTsKLSAgICAgIGRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcnVubmFibGUucnVuKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIDxjb2RlPk11bHRpUGFnZUVkaXRvclBhcnQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAgICogPGNvZGU+SVdvcmtiZW5jaFBhcnQ8L2NvZGU+IG1ldGhvZCBkaXNwb3NlcyBhbGwgbmVzdGVkIGVkaXRvcnMuCi0gICAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgZ2V0Q29tbWFuZFN0YWNrKCkucmVtb3ZlQ29tbWFuZFN0YWNrTGlzdGVuZXIodGhpcyk7Ci0gICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgYWN0aW9uUmVnaXN0cnkuZGlzcG9zZSgpOwotICAgIAotICAgIGlmIChzdHJ1Y3R1cmVkVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0gICAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvciA9IG51bGw7Ci0gICAgZWRpdERvbWFpbiA9IG51bGw7Ci0gICAgZk91dGxpbmVQYWdlID0gbnVsbDsKLSAgICBzeW5jaHJvbml6ZXIgPSBudWxsOwotICAgIGFjdGlvblJlZ2lzdHJ5ID0gbnVsbDsKLSAgICBzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0gICAgZ3JhcGhpY2FsVmlld2VyID0gbnVsbDsKLSAgICBpZiAobW9kZUNvbWJvICE9IG51bGwgJiYgIW1vZGVDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgbW9kZUNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKG1vZGVDb21ib0xpc3RlbmVyKTsKLSAgICAgIG1vZGVDb21ib0xpc3RlbmVyID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGZBY3RpdmF0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgZkFjdGl2YXRpb25MaXN0ZW5lci5kaXNwb3NlKCk7Ci0gICAgICBmQWN0aXZhdGlvbkxpc3RlbmVyID0gbnVsbDsKLSAgICB9Ci0gICAKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpCi0gIHsKLSAgICByZXR1cm4gZWRpdERvbWFpbi5nZXRDb21tYW5kU3RhY2soKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JQYXJ0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKQotICB7Ci0gICAgc2V0QWN0aXZlUGFnZShTT1VSQ0VfUEFHRV9JTkRFWCk7Ci0gICAgSURFLmdvdG9NYXJrZXIoc3RydWN0dXJlZFRleHRFZGl0b3IsIG1hcmtlcik7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIDxjb2RlPk11bHRpUGFnZUVkaXRvckV4YW1wbGU8L2NvZGU+IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kCi0gICAqIGNoZWNrcyB0aGF0IHRoZSBpbnB1dCBpcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JRmlsZUVkaXRvcklucHV0PC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLmluaXQoc2l0ZSwgZWRpdG9ySW5wdXQpOwotICAgIAotICAgIGdldENvbW1hbmRTdGFjaygpLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIGluaXRpYWxpemVBY3Rpb25SZWdpc3RyeSgpOwotICAgIAotICAgIFN0cmluZyB0aXRsZSA9IG51bGw7Ci0gICAgaWYgKGdldEVkaXRvcklucHV0KCkgIT0gbnVsbCkgewotICAgICAgdGl0bGUgPSBnZXRFZGl0b3JJbnB1dCgpLmdldE5hbWUoKTsKLSAgICB9Ci0gICAgc2V0UGFydE5hbWUodGl0bGUpOwotICAgIAotICAgIGZBY3RpdmF0aW9uTGlzdGVuZXIgPSBuZXcgQ29tbW9uQWN0aXZhdGlvbkxpc3RlbmVyKHNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWN0aW9uUmVnaXN0cnkoKQotICB7Ci0gICAgY3JlYXRlQWN0aW9ucygpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgZ2V0QWN0aW9uUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKGFjdGlvblJlZ2lzdHJ5ID09IG51bGwpCi0gICAgICBhY3Rpb25SZWdpc3RyeSA9IG5ldyBBY3Rpb25SZWdpc3RyeSgpOwotICAgIHJldHVybiBhY3Rpb25SZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgPT0gQ29tbWFuZFN0YWNrLmNsYXNzKQotICAgICAgcmV0dXJuIGdldENvbW1hbmRTdGFjaygpOwotICAgIGlmICh0eXBlID09IEFjdGlvblJlZ2lzdHJ5LmNsYXNzKQotICAgICAgcmV0dXJuIGdldEFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgaWYgKHR5cGUgPT0gRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpCi0gICAgICByZXR1cm4gZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKTsKLSAgICBpZiAodHlwZSA9PSBJR290b01hcmtlci5jbGFzcykgewotICAgICAgcmV0dXJuIG5ldyBJR290b01hcmtlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotICAgICAgICAgIENvbW1vbk11bHRpUGFnZUVkaXRvci50aGlzLmdvdG9NYXJrZXIobWFya2VyKTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gSVRleHRFZGl0b3IuY2xhc3MpCi0gICAgICByZXR1cm4gZ2V0VGV4dEVkaXRvcigpOwotICAgIAotICAgIHJldHVybiBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRGVmYXVsdEVkaXREb21haW4gZ2V0RWRpdERvbWFpbigpCi0gIHsKLSAgICByZXR1cm4gZWRpdERvbWFpbjsKLSAgfQotCi0gIC8qKgotICAgKiBGcm9tIEdFRiBHcmFwaGljYWxFZGl0b3IgQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHVwZGF0aW5nIGEgc2V0IG9mIGFjdGlvbnMKLSAgICogZGVmaW5lZCBieSB0aGUgZ2l2ZW4gTGlzdCBvZiBhY3Rpb24gSURzLiBUaGUgYWN0aW9ucyBhcmUgZm91bmQgYnkgbG9va2luZwotICAgKiB1cCB0aGUgSUQgaW4gdGhlIHtAbGluayAjZ2V0QWN0aW9uUmVnaXN0cnkoKSBhY3Rpb24gcmVnaXN0cnl9LiBJZiB0aGUKLSAgICogY29ycmVzcG9uZGluZyBhY3Rpb24gaXMgYW4ge0BsaW5rIFVwZGF0ZUFjdGlvbn0sIGl0IHdpbGwgaGF2ZSBpdHMKLSAgICogPGNvZGU+dXBkYXRlKCk8L2NvZGU+IG1ldGhvZCBjYWxsZWQuCi0gICAqIAotICAgKiBAcGFyYW0gYWN0aW9uSWRzCi0gICAqICAgICAgICAgIHRoZSBsaXN0IG9mIElEcyB0byB1cGRhdGUKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGlvbnMoTGlzdCBhY3Rpb25JZHMpCi0gIHsKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgSXRlcmF0b3IgaXRlciA9IGFjdGlvbklkcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihpdGVyLm5leHQoKSk7Ci0gICAgICBpZiAoYWN0aW9uIGluc3RhbmNlb2YgVXBkYXRlQWN0aW9uKQotICAgICAgICAoKFVwZGF0ZUFjdGlvbikgYWN0aW9uKS51cGRhdGUoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RydWN0dXJlZFRleHRFZGl0b3IgZ2V0VGV4dEVkaXRvcigpCi0gIHsKLSAgICByZXR1cm4gc3RydWN0dXJlZFRleHRFZGl0b3I7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUdyYXBoUGFnZUNvbXBvc2l0ZSgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShnZXRDb250YWluZXIoKSwgU1dULk5PTkUpOyAgICAKLSAgICBwYXJlbnQuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUdyYXBoUGFnZSgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gY3JlYXRlR3JhcGhQYWdlQ29tcG9zaXRlKCk7Ci0gICAgCi0gICAgZ3JhcGhpY2FsVmlld2VyID0gZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICAgICAgCi0gICAgZ2V0RWRpdERvbWFpbigpLmFkZFZpZXdlcihncmFwaGljYWxWaWV3ZXIpOwotICAgIAotICAgIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotICAgIGhvb2tHcmFwaGljYWxWaWV3ZXIoKTsgICAgCi0gICAgaW50IGluZGV4ID0gYWRkUGFnZShwYXJlbnQpOwotICAgIHNldFBhZ2VUZXh0KGluZGV4LCBNZXNzYWdlcy5fVUlfTEFCRUxfREVTSUdOKTsKLSAgfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjY3JlYXRlU2l0ZShvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUVkaXRvclNpdGUgY3JlYXRlU2l0ZShJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJSUVkaXRvclNpdGUgc2l0ZSA9IG51bGw7Ci0JCWlmIChlZGl0b3IgPT0gc3RydWN0dXJlZFRleHRFZGl0b3IpIHsKLQkJCXNpdGUgPSBuZXcgTXVsdGlQYWdlRWRpdG9yU2l0ZSh0aGlzLCBlZGl0b3IpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCQkvLyBzZXRzIHRoaXMgaWQgc28gbmVzdGVkIGVkaXRvciBpcyBjb25zaWRlcmVkIHhtbCBzb3VyY2UKLQkJCQkJLy8gcGFnZQotCQkJCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCArICIuc291cmNlIjsgLy8kTk9OLU5MUy0xJDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWVsc2UgewotCQkJc2l0ZSA9IHN1cGVyLmNyZWF0ZVNpdGUoZWRpdG9yKTsKLQkJfQotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VQYWdlKCkKLSAgewotICAgIHN0cnVjdHVyZWRUZXh0RWRpdG9yID0gbmV3IFN0cnVjdHVyZWRUZXh0RWRpdG9yKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IGluZGV4ID0gYWRkUGFnZShzdHJ1Y3R1cmVkVGV4dEVkaXRvciwgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICBzZXRQYWdlVGV4dChpbmRleCwgTWVzc2FnZXMuX1VJX0xBQkVMX1NPVVJDRSk7Ci0gICAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci51cGRhdGUoKTsKLSAgICAgIHN0cnVjdHVyZWRUZXh0RWRpdG9yLnNldEVkaXRvclBhcnQodGhpcyk7Ci0gICAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5hZGRQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfVElUTEUpOwotICAgIH0KLSAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2l0ZSgpLmdldFNoZWxsKCksICJFcnJvciBjcmVhdGluZyBuZXN0ZWQgdGV4dCBlZGl0b3IiLCBudWxsLCBlLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkKLSAgewotICAgIGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0KLSAgICAvLyBTZXQgdGhlIHJvb3QgZWRpdCBwYXJ0Ci0gICAgLy8gU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCByb290ID0gbmV3IFNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQoKTsKLSAgICBSb290RWRpdFBhcnQgcm9vdCA9IG5ldyBSb290RWRpdFBhcnQoKTsKLSAgICBab29tTWFuYWdlciB6b29tTWFuYWdlciA9IHJvb3QuZ2V0Wm9vbU1hbmFnZXIoKTsKLSAgICAKLSAgICBMaXN0IHpvb21MZXZlbENvbnRyaWJ1dGlvbnMgPSBuZXcgQXJyYXlMaXN0KDMpOwotICAgIHpvb21MZXZlbENvbnRyaWJ1dGlvbnMuYWRkKFpvb21NYW5hZ2VyLkZJVF9BTEwpOwotICAgIHpvb21MZXZlbENvbnRyaWJ1dGlvbnMuYWRkKFpvb21NYW5hZ2VyLkZJVF9XSURUSCk7Ci0gICAgem9vbUxldmVsQ29udHJpYnV0aW9ucy5hZGQoWm9vbU1hbmFnZXIuRklUX0hFSUdIVCk7Ci0gICAgem9vbU1hbmFnZXIuc2V0Wm9vbUxldmVsQ29udHJpYnV0aW9ucyh6b29tTGV2ZWxDb250cmlidXRpb25zKTsKLQotICAgIGRvdWJsZVtdIHpvb21MZXZlbHMgPSB7LjEwLCAuMjUsIC41LCAuNzUsIDEuMCwgMS4yNSwgMS41LCAyLjAsIDIuNSwgMywgNCwgNX07Ci0gICAgem9vbU1hbmFnZXIuc2V0Wm9vbUxldmVscyh6b29tTGV2ZWxzKTsKLQotICAgIElBY3Rpb24gem9vbUluID0gbmV3IFpvb21JbkFjdGlvbih6b29tTWFuYWdlcik7Ci0gICAgSUFjdGlvbiB6b29tT3V0ID0gbmV3IFpvb21PdXRBY3Rpb24oem9vbU1hbmFnZXIpOwotICAgIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oem9vbUluKTsKLSAgICBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21PdXQpOwotCi0gICAgZ2V0U2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkucmVnaXN0ZXJBY3Rpb24oem9vbUluKTsKLSAgICBnZXRTaXRlKCkuZ2V0S2V5QmluZGluZ1NlcnZpY2UoKS5yZWdpc3RlckFjdGlvbih6b29tT3V0KTsKLQotICAgIC8vQ29ubmVjdGlvbkxheWVyIGNvbm5lY3Rpb25MYXllciA9IChDb25uZWN0aW9uTGF5ZXIpIHJvb3QuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUik7Ci0gICAgLy9jb25uZWN0aW9uTGF5ZXIuc2V0Q29ubmVjdGlvblJvdXRlcihuZXcgQmVuZHBvaW50Q29ubmVjdGlvblJvdXRlcigpKTsKLQotICAgIC8vY29ubmVjdGlvbkxheWVyLnNldENvbm5lY3Rpb25Sb3V0ZXIobmV3IFNob3J0ZXN0UGF0aENvbm5lY3Rpb25Sb3V0ZXIoY29ubmVjdGlvbkxheWVyKSk7Ci0gICAgLy8gY29ubmVjdGlvbkxheWVyLnNldFZpc2libGUoZmFsc2UpOwotCi0gICAgLy8gWm9vbQotICAgIHpvb21NYW5hZ2VyLnNldFpvb20oMS4wKTsKLSAgICAvLyBTY3JvbGwtd2hlZWwgWm9vbQotICAgIGdyYXBoaWNhbFZpZXdlci5zZXRQcm9wZXJ0eShNb3VzZVdoZWVsSGFuZGxlci5LZXlHZW5lcmF0b3IuZ2V0S2V5KFNXVC5DVFJMKSwgTW91c2VXaGVlbFpvb21IYW5kbGVyLlNJTkdMRVRPTik7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLSAgICBncmFwaGljYWxWaWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGdldEVkaXRQYXJ0RmFjdG9yeSgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaG9va0dyYXBoaWNhbFZpZXdlcigpCi0gIHsKLSAgICBnZXRTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKS5hZGRWaWV3ZXIoZ3JhcGhpY2FsVmlld2VyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLSAgcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpOwotCi0gIHByb3RlY3RlZCBFZGl0b3JNb2RlTWFuYWdlciBnZXRFZGl0b3JNb2RlTWFuYWdlcigpCi0gIHsKLSAgICBpZiAoZWRpdG9yTW9kZU1hbmFnZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlZGl0b3JNb2RlTWFuYWdlciA9IGNyZWF0ZUVkaXRvck1vZGVNYW5hZ2VyKCk7Ci0gICAgICBlZGl0b3JNb2RlTWFuYWdlci5hZGRMaXN0ZW5lcih0aGlzKTsKLSAgICAgIGVkaXRvck1vZGVNYW5hZ2VyLmluaXQoKTsKLSAgICB9ICAKLSAgICByZXR1cm4gZWRpdG9yTW9kZU1hbmFnZXI7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBFZGl0b3JNb2RlTWFuYWdlciBjcmVhdGVFZGl0b3JNb2RlTWFuYWdlcigpOwotICAKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEVkaXRNb2RlTmFtZShFZGl0b3JNb2RlIGVkaXRvck1vZGUsIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcikKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBlZGl0b3JNb2RlLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY3VzdG9taXplZE5hbWUgPSBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldEVkaXRvck1vZGVEaXNwbGF5TmFtZShlZGl0b3JNb2RlLmdldElkKCkpOwotICAgICAgaWYgKGN1c3RvbWl6ZWROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGN1c3RvbWl6ZWROYW1lOwotICAgICAgfSAgCi0gICAgfSAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBjbGFzcyBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUKLSAgewotICAgIEVkaXRvck1vZGUgbW9kZTsKLSAgICBTdHJpbmcgbmFtZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmlld01vZGVUb29sYmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBFZGl0b3JNb2RlTWFuYWdlciBtYW5hZ2VyID0gKEVkaXRvck1vZGVNYW5hZ2VyKWdldEFkYXB0ZXIoRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpOwotICAgIGZpbmFsIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKWdldEFkYXB0ZXIoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgRWRpdG9yTW9kZSBbXSBtb2RlTGlzdCA9IG1hbmFnZXIuZ2V0TW9kZXMoKTsKLSAgICAKLSAgICBpbnQgbW9kZUxpc3RMZW5ndGggPSBtb2RlTGlzdC5sZW5ndGg7Ci0gICAgYm9vbGVhbiBzaG93VG9vbEJhciA9IG1vZGVMaXN0TGVuZ3RoID4gMTsKLSAgIAotICAgIGlmIChzaG93VG9vbEJhcikKLSAgICB7Ci0gICAgICB0b29sYmFyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5GTEFUIHwgU1dULkRSQVdfVFJBTlNQQVJFTlQpOwotICAgICAgdG9vbGJhci5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLSAgICAgIHRvb2xiYXIuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSB0b29sYmFyLmdldENsaWVudEFyZWEoKTsgCi0gICAgICAgICAgZS5nYy5zZXRGb3JlZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gICAgICAgICAgZS5nYy5kcmF3UmVjdGFuZ2xlKGNsaWVudEFyZWEueCwgY2xpZW50QXJlYS55LCBjbGllbnRBcmVhLndpZHRoIC0gMSwgY2xpZW50QXJlYS5oZWlnaHQgLSAxKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICAKLSAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgIHRvb2xiYXIuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0b29sYmFyLCBTV1QuRkxBVCB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICAgIGxhYmVsLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotICAgICAgbGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfVklFVyk7Ci0gICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKLQotICAgICAgbW9kZUNvbWJvID0gbmV3IEZsYXRDQ29tYm8odG9vbGJhciwgU1dULkZMQVQpOwotICAgICAgbW9kZUNvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgIG1vZGVDb21iby5zZXRUZXh0KGdldEVkaXRNb2RlTmFtZShtYW5hZ2VyLmdldEN1cnJlbnRNb2RlKCksIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpKTsgCi0gICAgICBHQyBnYyA9IG5ldyBHQyhtb2RlQ29tYm8pOwotICAgICAgaW50IHRleHRXaWR0aCA9IDA7Ci0gICAgICBtYXhMZW5ndGggPSAwOwotICAgICAgCi0gICAgICAvLyBwb3B1bGF0ZSBjb21ibyB3aXRoIG1vZGVzCi0gICAgICBlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzID0gbmV3IEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZVttb2RlTGlzdExlbmd0aF07ICAgICAgCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgICB7ICAKLSAgICAgICAgRWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lIGVudHJ5ID0gbmV3IEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSgpOwotICAgICAgICBlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzW2ldID0gZW50cnk7Ci0gICAgICAgIGVudHJ5Lm5hbWUgPSBnZXRFZGl0TW9kZU5hbWUobW9kZUxpc3RbaV0sIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpOwotICAgICAgICBlbnRyeS5tb2RlID0gbW9kZUxpc3RbaV07Ci0gICAgICB9ICAgICAgICAKLSAgICAgIEFycmF5cy5zb3J0KGVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZXMsIG5ldyBDb21wYXJhdG9yKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkKLSAgICAgICAgewotICAgICAgICAgIEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSBhID0gKEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSlhcmcwOwotICAgICAgICAgIEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSBiID0gKEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSlhcmcxOyAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShhLm5hbWUsIGIubmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzLmxlbmd0aDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgRWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lIGVudHJ5ID0gZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lc1tpXTsKLSAgICAgICAgbW9kZUNvbWJvLmFkZChlbnRyeS5uYW1lKTsKLSAgICAgICAgbWF4TGVuZ3RoID0gTWF0aC5tYXggKGdjLnN0cmluZ0V4dGVudChlbnRyeS5uYW1lKS54LCBtYXhMZW5ndGgpOwotICAgICAgICBpbnQgYXBwcm94V2lkdGhPZlN0cmluZ3MgPSBNYXRoLm1heCAoZ2Muc3RyaW5nRXh0ZW50KGVudHJ5Lm5hbWUpLngsIHRleHRXaWR0aCk7Ci0gICAgICAgIGlmIChhcHByb3hXaWR0aE9mU3RyaW5ncyA+IG1heExlbmd0aCkKLSAgICAgICAgICBtYXhMZW5ndGggPSBhcHByb3hXaWR0aE9mU3RyaW5nczsKLSAgICAgIH0KLSAgICAgIAotICAgICAgbWF4TGVuZ3RoICs9IGdjLnN0cmluZ0V4dGVudChNZXNzYWdlcy5fVUlfTEFCRUxfVklFVykueDsgCi0gICAgICBnYy5kaXNwb3NlKCk7Ci0gICAgICAKLSAgICAgIG1vZGVDb21ib0xpc3RlbmVyID0gbmV3IE1vZGVDb21ib0xpc3RlbmVyKCk7Ci0gICAgICBtb2RlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobW9kZUNvbWJvTGlzdGVuZXIpOwotICAgICAgbW9kZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0VORCkpOwotICAgICAgbW9kZUNvbWJvLnNldEJhY2tncm91bmQodG9vbGJhci5nZXRCYWNrZ3JvdW5kKCkpOwotCi0gICAgICBJbWFnZUh5cGVybGluayBoeXBlcmxpbmsgPSBuZXcgSW1hZ2VIeXBlcmxpbmsodG9vbGJhciwgU1dULkZMQVQpOwotICAgICAgaHlwZXJsaW5rLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDQ1NwotICAgICAgSW1hZ2UgaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEljb25JbWFnZSgiZXRvb2wxNi9oZWxwX2NvbnRlbnRzIik7Ci0gICAgICBoeXBlcmxpbmsuc2V0SW1hZ2UoaW1hZ2UpOwotICAgICAgaHlwZXJsaW5rLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9IT1ZFUl9WSUVXX01PREVfREVTQ1JJUFRJT04pOwotICAgICAgaHlwZXJsaW5rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotICAgICAgaHlwZXJsaW5rLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuaGFuZGxlQWN0aW9uKCJzaG93RWRpdG9yTW9kZUhlbHAiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBNb2RlQ29tYm9MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgTW9kZUNvbWJvTGlzdGVuZXIoKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGUud2lkZ2V0ID09IG1vZGVDb21ibykKLSAgICAgIHsgICAgICAgIAotICAgICAgICBFZGl0b3JNb2RlTWFuYWdlciBtYW5hZ2VyID0gKEVkaXRvck1vZGVNYW5hZ2VyKWdldEFkYXB0ZXIoRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpOwotICAgICAgICBFZGl0b3JNb2RlIFtdIG1vZGVMaXN0ID0gbWFuYWdlci5nZXRNb2RlcygpOwotICAgICAgICBpZiAobW9kZUxpc3QubGVuZ3RoID49IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUgZW50cnkgPSBlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzW21vZGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLSAgICAgICAgICBpZiAobWFuYWdlci5nZXRDdXJyZW50TW9kZSgpICE9IGVudHJ5Lm1vZGUpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBtYW5hZ2VyLnNldEN1cnJlbnRNb2RlKGVudHJ5Lm1vZGUpOwotICAgICAgICAgICAgc3RvcmVDdXJyZW50TW9kZVByZWZlcmVuY2UoZW50cnkubW9kZS5nZXRJZCgpKTsKLSAgICAgICAgICAgIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKSBnZXRBZGFwdGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5oYW5kbGVBY3Rpb24oImVkaXRvck1vZGVDaGFuZ2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHN0b3JlQ3VycmVudE1vZGVQcmVmZXJlbmNlKFN0cmluZyBpZCkKLSAgewotICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGFzIGRlZmF1bHQuICBBbGxvdyBleHRlbmRlcnMgdG8gaW1wbGVtZW50LgotICB9Ci0gIAotICAKLSAgcHJvdGVjdGVkIGNsYXNzIENvbW1vbkFjdGl2YXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIsIElXaW5kb3dMaXN0ZW5lcgotICB7Ci0KLSAgICAvKiogQ2FjaGUgb2YgdGhlIGFjdGl2ZSB3b3JrYmVuY2ggcGFydC4gKi8KLSAgICBwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGZBY3RpdmVQYXJ0OwotICAgIC8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKLSAgICAvKioKLSAgICAgKiBUaGUgcGFydCBzZXJ2aWNlLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwcml2YXRlIElQYXJ0U2VydmljZSBmUGFydFNlcnZpY2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFydFNlcnZpY2UKLSAgICAgKiAgICAgICAgICB0aGUgcGFydCBzZXJ2aWNlIG9uIHdoaWNoIHRvIGFkZCB0aGUgcGFydCBsaXN0ZW5lcgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbW9uQWN0aXZhdGlvbkxpc3RlbmVyKElQYXJ0U2VydmljZSBwYXJ0U2VydmljZSkKLSAgICB7Ci0gICAgICBmUGFydFNlcnZpY2UgPSBwYXJ0U2VydmljZTsKLSAgICAgIGZQYXJ0U2VydmljZS5hZGRQYXJ0TGlzdGVuZXIodGhpcyk7Ci0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3Bvc2VzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgZlBhcnRTZXJ2aWNlLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkucmVtb3ZlV2luZG93TGlzdGVuZXIodGhpcyk7Ci0gICAgICBmUGFydFNlcnZpY2UgPSBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICAgIGZBY3RpdmVQYXJ0ID0gcGFydDsKLSAgICAgIGhhbmRsZUFjdGl2YXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QnJvdWdodFRvVG9wKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydENsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnREZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgICBmQWN0aXZlUGFydCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydE9wZW5lZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgdGhlIGFjdGl2YXRpb24gdHJpZ2dlcmluZyBhIGVsZW1lbnQgc3RhdGUgY2hlY2sgaW4gdGhlIGVkaXRvci4KLSAgICAgKi8KLSAgICB2b2lkIGhhbmRsZUFjdGl2YXRpb24oKQotICAgIHsKLSAgICAgIGlmIChmSXNIYW5kbGluZ0FjdGl2YXRpb24gfHwgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoZkFjdGl2ZVBhcnQgPT0gQ29tbW9uTXVsdGlQYWdlRWRpdG9yLnRoaXMpCi0gICAgICB7Ci0gICAgICAgIGZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IHRydWU7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0VGV4dEVkaXRvcigpLnNhZmVseVNhbml0eUNoZWNrU3RhdGUoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0gICAgewotICAgICAgaWYgKHdpbmRvdyA9PSBnZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpCi0gICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdvcmthcm91bmQgZm9yIHByb2JsZW0gZGVzY3JpYmVkIGluCi0gICAgICAgICAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzEgV2lsbCBiZSByZW1vdmVkCi0gICAgICAgICAqIHdoZW4gU1dUIGhhcyBzb2x2ZWQgdGhlIHByb2JsZW0uCi0gICAgICAgICAqLwotICAgICAgICB3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhbmRsZUFjdGl2YXRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0gICAgewotICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykKLSAgICB7Ci0gICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2luZG93T3BlbmVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KQotICAgIHsKLSAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU291cmNlUGFnZUFjdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0QWN0aXZlUGFnZSgpID09IFNPVVJDRV9QQUdFX0lOREVYOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29tbW9uU2VsZWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vblNlbGVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlYWQ2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29tbW9uU2VsZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25TZWxlY3Rpb25NYW5hZ2VyIGV4dGVuZHMgTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLQotICBwdWJsaWMgQ29tbW9uU2VsZWN0aW9uTWFuYWdlcihNdWx0aVBhZ2VFZGl0b3JQYXJ0IG11bHRpUGFnZUVkaXRvcikKLSAgewotICAgIHN1cGVyKG11bHRpUGFnZUVkaXRvcik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNyZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNzZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdGhpcyk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIGlmIChlbmFibGVOb3RpZnkpCi0gICAgewotICAgICAgc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpLCBldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLSAgICB9Ci0gIH0KLQotICAKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVOb3RpZnkgPSB0cnVlOwotCi0gIHB1YmxpYyBib29sZWFuIGdldEVuYWJsZU5vdGlmeSgpCi0gIHsKLSAgICByZXR1cm4gZW5hYmxlTm90aWZ5OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UpCi0gIHsgIAotICAgIGlmIChlbmFibGVOb3RpZnkpCi0gICAgewotICAgICAgY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICAgIGVuYWJsZU5vdGlmeSA9IGZhbHNlOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc291cmNlLCBzZWxlY3Rpb24pOwotICAgICAgICBMaXN0IGNvcHlPZkxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QobGlzdGVuZXJMaXN0KTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY29weU9mTGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgZW5hYmxlTm90aWZ5ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Db250ZXh0TWVudVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29udGV4dE1lbnVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ0MjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Db250ZXh0TWVudVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZXh0TWVudVBhcnRpY2lwYW50Ci17ICAKLSAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKE9iamVjdCBvYmplY3QsIFN0cmluZyBhY3Rpb25JZCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjb250cmlidXRlQWN0aW9ucyhPYmplY3Qgb2JqZWN0LCBJTWVudU1hbmFnZXIgbWVudSkKLSAgeyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0VkaXRvck1vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZWY4NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0VkaXRvck1vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFZGl0b3JNb2RlIGltcGxlbWVudHMgSUFkYXB0YWJsZQotewotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldElkKCk7Ci0gIAotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0gIAotICBwdWJsaWMgYWJzdHJhY3QgRWRpdFBhcnRGYWN0b3J5IGdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAKLSAgLy8gVE9ETyAoY3MpIHRoaXMgc2hvdWxkIHJldHVybiBJVHJlZUNvbnRlbnRQcm92aWRlcgotICBwdWJsaWMgYWJzdHJhY3QgSUNvbnRlbnRQcm92aWRlciBnZXRPdXRsaW5lUHJvdmlkZXIoKTsKLSAgCi0gIHB1YmxpYyBDb250ZXh0TWVudVBhcnRpY2lwYW50IGdldENvbnRleHRNZW51UGFydGljaXBhbnQoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0VkaXRvck1vZGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmVmNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0VkaXRvck1vZGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotcHVibGljIGNsYXNzIEVkaXRvck1vZGVNYW5hZ2VyIGltcGxlbWVudHMgSUFkYXB0YWJsZQotewotICBwcml2YXRlIExpc3QgbW9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgRWRpdG9yTW9kZSBjdXJyZW50TW9kZSA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgU3RyaW5nIGV4dGVuc2lvblBvaW50SWQ7Ci0gIHByaXZhdGUgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyOwotICAKLSAgcHVibGljIEVkaXRvck1vZGVNYW5hZ2VyKFN0cmluZyBleHRlbnNpb25Qb2ludElkKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnRJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsgCi0gICAgcmVhZFJlZ2lzdHJ5KGV4dGVuc2lvblBvaW50SWQpOyAgICAKLSAgICBjdXJyZW50TW9kZSA9IGdldERlZmF1bHRNb2RlKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFZGl0b3JNb2RlIGdldERlZmF1bHRNb2RlKCkKLSAgewotICAgIHJldHVybiAoRWRpdG9yTW9kZSltb2RlTGlzdC5nZXQoMCk7ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRNb2RlKEVkaXRvck1vZGUgbW9kZSkKLSAgewotICAgIG1vZGVMaXN0LmFkZChtb2RlKTsKLSAgfQotICAKLSAgcHVibGljIEVkaXRvck1vZGUgZ2V0RWRpdG9yTW9kZShTdHJpbmcgZWRpdG9yTW9kZUlkKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbW9kZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBFZGl0b3JNb2RlIGVkaXRvck1vZGUgPSAoRWRpdG9yTW9kZSlpLm5leHQoKTsKLSAgICAgIGlmIChlZGl0b3JNb2RlSWQuZXF1YWxzKGVkaXRvck1vZGUuZ2V0SWQoKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBlZGl0b3JNb2RlOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRNb2RlKEVkaXRvck1vZGUgbW9kZSkKLSAgewotICAgIGlmIChtb2RlTGlzdC5jb250YWlucyhtb2RlKSkKLSAgICB7Ci0gICAgICBjdXJyZW50TW9kZSA9IG1vZGU7Ci0gICAgICBMaXN0IGNsb25lZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBjbG9uZWRMaXN0LmFkZEFsbChsaXN0ZW5lcnMpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gY2xvbmVkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBJRWRpdG9yTW9kZUxpc3RlbmVyIGxpc3RlbmVyID0gKElFZGl0b3JNb2RlTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgIGxpc3RlbmVyLmVkaXRvck1vZGVDaGFuZ2VkKG1vZGUpOwotICAgICAgfSAgCi0gICAgfSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0b3JNb2RlIGdldEN1cnJlbnRNb2RlKCkKLSAgewotICAgIHJldHVybiBjdXJyZW50TW9kZTsKLSAgfQotICAKLSAgcHVibGljIEVkaXRvck1vZGVbXSBnZXRNb2RlcygpCi0gIHsKLSAgICBFZGl0b3JNb2RlW10gbW9kZXMgPSBuZXcgRWRpdG9yTW9kZVttb2RlTGlzdC5zaXplKCldOwotICAgIG1vZGVMaXN0LnRvQXJyYXkobW9kZXMpOwotICAgIHJldHVybiBtb2RlczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUVkaXRvck1vZGVMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICB7ICAKLSAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJRWRpdG9yTW9kZUxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7ICAKLSAgfSAgCi0gIAotICBwcml2YXRlIHZvaWQgcmVhZFJlZ2lzdHJ5KFN0cmluZyBpZCkKLSAgeyAgICAKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKGlkKTsgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLSAgICAgIFN0cmluZyBlZGl0b3JNb2RlSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGVkaXRvck1vZGVJZCAhPSBudWxsICYmIAotICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCAmJgotICAgICAgICAgICFwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmlzRWRpdG9yTW9kZUFwcGxpY2FibGUoZWRpdG9yTW9kZUlkKSkKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9ICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBFZGl0b3JNb2RlIG1vZGUgPSAoRWRpdG9yTW9kZSllbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgIG1vZGVMaXN0LmFkZChtb2RlKTsgICAgICAgIAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgeyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICB9ICAKLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5wcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0lBRFRFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0lBRFRFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzY0ZDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9JQURURWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGludGVyZmFjZSBJQURURWRpdG9ySW5wdXQgZXh0ZW5kcyBJRWRpdG9ySW5wdXQKLXsKLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9JRWRpdG9yTW9kZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvSUVkaXRvck1vZGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTk4YmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9JRWRpdG9yTW9kZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotcHVibGljIGludGVyZmFjZSBJRWRpdG9yTW9kZUxpc3RlbmVyCi17Ci0gIHZvaWQgZWRpdG9yTW9kZUNoYW5nZWQoRWRpdG9yTW9kZSBuZXdFZGl0b3JNb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDlkMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBNZXNzYWdlcygpCi0gIHsKLSAgfQotCi0gIHN0YXRpYwotICB7Ci0gICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0gIH0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9TSE9XX1BST1BFUlRJRVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0VUX0FTX0ZPQ1VTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RFTEVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRklFTEQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQlJPV1NFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX05FVzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfTkFNRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ERVNJR047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TT1VSQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9WSUVXOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSE9WRVJfVklFV19NT0RFX0RFU0NSSVBUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX09WRVJXUklURV9DT05GSVJNQVRJT05fUVVFU1RJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fT1ZFUldSSVRFX0NPTkZJUk1BVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9FUlJPUl9USVRMRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9FUlJPUl9ERVNDUklQVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9GT1JNQVRfTk9UX1NVUFBPUlRFRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBUFRVUkVfU0NSRUVOX0FDVElPTl9URVhUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0FQVFVSRV9TQ1JFRU5fQUNUSU9OX1RPT0xUSVBURVhUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0RFRkFVTFRfRklMRV9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0ZJTEVfU0FWRV9ESUFMT0dfVElUTEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9IT1ZFUl9CQUNLX1RPX1NDSEVNQTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Qcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNlMDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Qcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuTmF2aWdhdGlvbkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyCi17Ci0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRWRpdG9yTW9kZUFwcGxpY2FibGUoU3RyaW5nIGlkKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFZGl0b3JNb2RlRGlzcGxheU5hbWUoU3RyaW5nIGlkKTsKLSAKLSAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0U3RyaW5nKFN0cmluZyBpZCkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm9kdWN0U3RyaW5nKFN0cmluZyBpZCwgT2JqZWN0W10gYXJncykKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlQWN0aW9uKFN0cmluZyBhY3Rpb25JZCkKLSAgeyAgICAKLSAgfQotICAKLSAgcHVibGljIE5hdmlnYXRpb25Mb2NhdGlvbiBnZXROYXZpZ2F0aW9uTG9jYXRpb24oSUVkaXRvclBhcnQgcGFydCwgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50LCBCYXNlRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIEV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2UgZ2V0UHJvZHVjdENvbnRlbnRPdXRsaW5lUGFnZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwZWMyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLV9VSV9BQ1RJT05fU0hPV19QUk9QRVJUSUVTPVNob3cgcHJvcGVydGllcwotX1VJX0FDVElPTl9TRVRfQVNfRk9DVVM9U2V0IEFzIEZvY3VzCi1fVUlfQUNUSU9OX1VQREFURV9OQU1FPVVwZGF0ZSBOYW1lCi1fVUlfQUNUSU9OX1VQREFURV9UWVBFPVVwZGF0ZSB0eXBlCi1fVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRT1VcGRhdGUgZWxlbWVudCByZWZlcmVuY2UKLV9VSV9BQ1RJT05fREVMRVRFPURlbGV0ZQotX1VJX0FDVElPTl9CUk9XU0U9QnJvd3NlLi4uCi1fVUlfTEFCRUxfREVTSUdOPURlc2lnbgotX1VJX0xBQkVMX1NPVVJDRT1Tb3VyY2UKLV9VSV9BQ1RJT05fTkVXPU5ldy4uLgotX1VJX0FDVElPTl9BRERfRklFTEQ9QWRkIEZpZWxkCi1fVUlfTEFCRUxfVklFVz1WaWV3OgotX1VJX0hPVkVSX1ZJRVdfTU9ERV9ERVNDUklQVElPTj1DaGFuZ2UgdGhlIHZpZXcgbW9kZSBvZiB0aGUgZWRpdG9yCi1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX09WRVJXUklURV9DT05GSVJNQVRJT05fUVVFU1RJT049UXVlc3Rpb24KLV9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fT1ZFUldSSVRFX0NPTkZJUk1BVElPTj1UaGUgZmlsZSB7MH0gYWxyZWFkeSBleGlzdHMuIERvIHlvdSB3YW50IHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIGZpbGU/Ci1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0VSUk9SX1RJVExFPUVycm9yCi1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0VSUk9SX0RFU0NSSVBUSU9OPUNvdWxkIG5vdCBzYXZlIGVkaXRvciBjb250ZW50cwotX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9GT1JNQVRfTk9UX1NVUFBPUlRFRD1Gb3JtYXQgbm90IHN1cHBvcnRlZAotX1VJX0NBUFRVUkVfU0NSRUVOX0FDVElPTl9URVhUID0gJkV4cG9ydCBEaWFncmFtIGFzIEltYWdlLi4uCi1fVUlfQ0FQVFVSRV9TQ1JFRU5fQUNUSU9OX1RPT0xUSVBURVhUID0gRXhwb3J0IERpYWdyYW0gYXMgSW1hZ2UKLV9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fREVGQVVMVF9GSUxFX05BTUUgPSBEaWFncmFtCi1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0ZJTEVfU0FWRV9ESUFMT0dfVElUTEU9RXhwb3J0IERpYWdyYW0gYXMgSW1hZ2UKLV9VSV9IT1ZFUl9CQUNLX1RPX1NDSEVNQT1TaG93IHNjaGVtYSBpbmRleCB2aWV3CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUFEVE9iamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lBRFRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhNGE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUFEVE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZTsKLQotcHVibGljIGludGVyZmFjZSBJQURUT2JqZWN0Ci17Ci0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpOwotICAgIGJvb2xlYW4gaXNSZWFkT25seSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lBRFRPYmplY3RMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lBRFRPYmplY3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmM4ZWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JQURUT2JqZWN0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFEVE9iamVjdExpc3RlbmVyCi17Ci0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUNvbXBsZXhUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUNvbXBsZXhUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Mzg3YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lDb21wbGV4VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZTsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBsZXhUeXBlIGV4dGVuZHMgSVR5cGUsIElTdHJ1Y3R1cmUKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JRmllbGQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlhNjI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpZWxkIGV4dGVuZHMgSUFEVE9iamVjdAotewotICBTdHJpbmcgZ2V0S2luZCgpOwotICBTdHJpbmcgZ2V0TmFtZSgpOwotICBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLSAgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCk7Ci0gIElNb2RlbCBnZXRNb2RlbCgpOwotICBJVHlwZSBnZXRUeXBlKCk7Ci0gIElDb21wbGV4VHlwZSBnZXRDb250YWluZXJUeXBlKCk7Ci0gIGludCBnZXRNaW5PY2N1cnMoKTsKLSAgaW50IGdldE1heE9jY3VycygpOwotICBib29sZWFuIGlzR2xvYmFsKCk7Ci0gIGJvb2xlYW4gaXNSZWZlcmVuY2UoKTsKLSAgCi0gIENvbW1hbmQgZ2V0VXBkYXRlTWluT2NjdXJzQ29tbWFuZChpbnQgbWluT2NjdXJzKTsKLSAgQ29tbWFuZCBnZXRVcGRhdGVNYXhPY2N1cnNDb21tYW5kKGludCBtYXhPY2N1cnMpOwotICBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKTsKLSAgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmFtZSk7IAotICBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQyNDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBJTW9kZWwgZXh0ZW5kcyBJQURUT2JqZWN0Ci17Ci0gIExpc3QgZ2V0VHlwZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JU3RydWN0dXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSVN0cnVjdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzBkMTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JU3RydWN0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZSBleHRlbmRzIElBRFRPYmplY3QKLXsKLSAgU3RyaW5nIGdldE5hbWUoKTsKLSAgTGlzdCBnZXRGaWVsZHMoKTsKLSAgSU1vZGVsIGdldE1vZGVsKCk7Ci0gIENvbW1hbmQgZ2V0QWRkTmV3RmllbGRDb21tYW5kKFN0cmluZyBmaWVsZEtpbmQpOwotICBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkMWFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotcHVibGljIGludGVyZmFjZSBJVHlwZSBleHRlbmRzIElBRFRPYmplY3QKLXsgCi0gIElUeXBlIGdldFN1cGVyVHlwZSgpOwotICBTdHJpbmcgZ2V0TmFtZSgpOwotICBTdHJpbmcgZ2V0UXVhbGlmaWVyKCk7Ci0gIGJvb2xlYW4gaXNDb21wbGV4VHlwZSgpOwotICBib29sZWFuIGlzQW5vbnltb3VzKCk7Ci0gIAotICBDb21tYW5kIGdldFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBuZXdOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUQ29udGVudE91dGxpbmVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjVhYTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUQ29udGVudE91dGxpbmVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2NoZW1hQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSU1vZGVsUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFEVENvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIEV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2UKLXsKLSAgcHJvdGVjdGVkIGludCBsZXZlbCA9IDA7Ci0gIHByb3RlY3RlZCBNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25NYW5hZ2VyOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQotICBwdWJsaWMgQURUQ29udGVudE91dGxpbmVQYWdlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRJbnB1dChtb2RlbCk7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICBNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiI3BvcHVwIik7Ly8kTk9OLU5MUy0xJAotICAgIG1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLSAgICBNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0gICAgc2V0U2VsZWN0aW9uTWFuYWdlcihlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgbWVudS4uLmZvciBub3cgcmV1c2UgZ3JhcGgncy4gIE5vdGUgZWRpdCBwYXJ0IHZpZXdlciA9IG51bGwKLSAgICBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlciBtZW51UHJvdmlkZXIgPSBuZXcgRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIoZWRpdG9yLCBudWxsLCBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobWVudVByb3ZpZGVyKTsKLSAgICBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5wb3B1cC5vdXRsaW5lIiwgbWVudU1hbmFnZXIsIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBlbmFibGUgcG9wdXBNZW51cyBleHRlbnNpb24KLSAgICAvLyBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgib3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci51aS5wb3B1cC5vdXRsaW5lIiwKLSAgICAvLyBtZW51TWFuYWdlciwgeHNkRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0KLSAgICAvLyBjcy4uLiB3aHkgYXJlIHdlIGRvaW5nIHRoaXMgZnJvbSB0aGUgb3V0bGluZSB2aWV3PwotICAgIC8vCi0gICAgLy8geHNkVGV4dEVkaXRvci5nZXRYU0RFZGl0b3IoKS5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldwotICAgIC8vIFN0cnVjdHVyZWRTZWxlY3Rpb24oeHNkVGV4dEVkaXRvci5nZXRYU0RTY2hlbWEoKSkpOwotICAgIC8vIGRyaWxsIGRvd24gZnJvbSBvdXRsaW5lIHZpZXcKLSAgICBnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gaVNlbGVjdGlvbiA9IGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKGlTZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgaVNlbGVjdGlvbjsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBvYmo7Ci0gICAgICAgICAgICBpZiAoY29tcC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gZ2V0WFNERWRpdG9yKCkuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRJbnB1dChvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBjbGFzcyBYU0RLZXlMaXN0ZW5lciBleHRlbmRzIEtleUFkYXB0ZXIKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBjb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4cGFuZFRvTGV2ZWwoaW50IGkpCi0gIHsKLSAgICBsZXZlbCA9IGk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBnZXRUcmVlVmlld2VyKCkuc2V0SW5wdXQodmFsdWUpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5leHBhbmRUb0xldmVsKGxldmVsKTsKLSAgfQotCi0gIC8vIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIC8vIHsKLSAgLy8gaWYgKGdldFRyZWVWaWV3ZXIoKSA9PSBudWxsKQotICAvLyByZXR1cm4gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLSAgLy8gcmV0dXJuIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgLy8gfQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25NYW5hZ2VyKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyIG5ld1NlbGVjdGlvbk1hbmFnZXIpCi0gIHsKLS8vICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKLSAgICAvLyBkaXNjb25uZWN0IGZyb20gb2xkIG9uZQotICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgc2VsZWN0aW9uTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLS8vICAgICAgdHJlZVZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0gICAgc2VsZWN0aW9uTWFuYWdlciA9IG5ld1NlbGVjdGlvbk1hbmFnZXI7Ci0gICAgLy8gY29ubmVjdCB0byBuZXcgb25lCi0gICAgaWYgKHNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25NYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotLy8gICAgICB0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICB1cGRhdGVTdGF0dXNMaW5lKGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgaWYgKGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCkgIT0gQURUQ29udGVudE91dGxpbmVQYWdlLnRoaXMpICAvL2dldFRyZWVWaWV3ZXIoKSkKLSAgICAgIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE86IEhhY2sgdG8gcHJldmVudCBsb3NpbmcgYSBzZWxlY3Rpb24gd2hlbiB0aGUgc2NoZW1hIGlzIHNlbGVjdGVkIGluIHRoZQotICAgICAgICAvLyBzb3VyY2UuICBGaXggaXMgdG8gcHJldmVudCB0aGUgc291cmNlIGZyb20gZmlyaW5nIG9mZiBzZWxlY3Rpb24gY2hhbmdlcyB3aGVuCi0gICAgICAgIC8vIHRoZSBzZWxlY3Rpb24gc291cmNlIGlzIG5vdCB0aGUgc291cmNlIHZpZXcuCi0gICAgICAgIGlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBJTW9kZWwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIShjdXJyZW50U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSU1vZGVsUHJveHkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCksIHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICBMaXN0IGxpc3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLnRvTGlzdCgpOwotICAgICAgICAgIGludCBzZWxlY3Rpb25MZW5ndGggPSBsaXN0LnNpemUoKTsKLSAgICAgICAgICBpZiAoc2VsZWN0aW9uTGVuZ3RoID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbkxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3QgaXRlbSA9IGxpc3QuZ2V0KGkpOwotCi0gICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgQWRhcHRlckltcGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOb3RpZmllciB0YXJnZXQgPSAoKEFkYXB0ZXJJbXBsKSBpdGVtKS5nZXRUYXJnZXQoKTsKLQotICAgICAgICAgICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSkKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIHRhcmdldDsKLQotICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZXhwYW5kIHBhcmVudCBiZWZvcmUgY2hpbGQsIHRodXMgYSBzdGFjayBpcyByZXF1aXJlZAotICAgICAgICAgICAgICAgIFN0YWNrIGNvbXBvbmVudFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHhzZENvbmNyZXRlQ29tcG9uZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3RhY2sucHVzaCh4c2RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgICB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IHhzZENvbmNyZXRlQ29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHN0YWNrIG11c3QgaGF2ZSB0aGUgWFNEU2NoZW1hQWRhcHRlciBhbmQKLSAgICAgICAgICAgICAgICAvLyBhdCBsZWFzdCBvbmUgY29tcG9uZW50Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFN0YWNrLnNpemUoKSA8IDIpCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIC8vIFBvcCBvZmYgdGhlIHRvcCBub2RlLCBzaW5jZSBpdCBpcyB0aGUgWFNEU2NoZW1hQWRhcHRlciwgd2hpY2gKLSAgICAgICAgICAgICAgICAvLyBpc24ndAotICAgICAgICAgICAgICAgIC8vIHVzZWQgYXMgcGFydCBvZiBmaW5kaW5nIHRoZSBvdXRsaW5lIHZpZXcgaGllcmFyY2h5Ci0gICAgICAgICAgICAgICAgY29tcG9uZW50U3RhY2sucG9wKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgY29tcG9uZW50U3RhY2sucGVlaygpKS5lQWRhcHRlcnMoKS5zaXplKCkgPD0gMCkKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpIGNvbXBvbmVudFN0YWNrLnBlZWsoKSkuZUFkYXB0ZXJzKCkuZ2V0KDApOwotCi0gICAgICAgICAgICAgICAgLy8gRmluZCBvdXQgd2hpY2ggY2F0ZWdvcnkgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgY29udGFpbmVkIGluCi0gICAgICAgICAgICAgICAgaW50IGNhdGVnb3J5SW5kZXggPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXRlZ29yeUluZGV4ID0gQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJbmRleCA9IENhdGVnb3J5QWRhcHRlci5FTEVNRU5UUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SW5kZXggPSBDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXRlZ29yeUluZGV4ID0gQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgfHwgb2JqZWN0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SW5kZXggPSBDYXRlZ29yeUFkYXB0ZXIuVFlQRVM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXRlZ29yeUluZGV4ID0gQ2F0ZWdvcnlBZGFwdGVyLkdST1VQUzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBFeHBhbmQgdGhlIGNhdGVnb3J5Ci0gICAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5SW5kZXggPT0gLTEpCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBDYXRlZ29yeUFkYXB0ZXIgY2F0ZWdvcnkgPSAoKFhTRFNjaGVtYUFkYXB0ZXIpIG1vZGVsKS5nZXRDYXRlZ29yeShjYXRlZ29yeUluZGV4KTsKLSAgICAgICAgICAgICAgICB0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoY2F0ZWdvcnksIHRydWUpOwotCi0gICAgICAgICAgICAgICAgLy8gRG8gbm90IGV4cGFuZCBjdXJyZW50IG5vZGUgb2YgaW50ZXJlc3QsIGp1c3QgaXRzIHBhcmVudHMKLSAgICAgICAgICAgICAgICB3aGlsZSAoY29tcG9uZW50U3RhY2suc2l6ZSgpID4gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBvYmplY3QgPSBjb21wb25lbnRTdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuZUFkYXB0ZXJzKCkuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGFuZAotICAgICAgICAgICAgICAgICAgICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRFeHBhbmRlZFN0YXRlKGNvbXBvbmVudC5lQWRhcHRlcnMoKS5nZXQoMCksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCksIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtZ3IsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgU3RyaW5nIHRleHQgPSBudWxsOwotICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICBJTGFiZWxQcm92aWRlciBzdGF0dXNMaW5lTGFiZWxQcm92aWRlciA9IG5ldyBTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihnZXRUcmVlVmlld2VyKCkpOwotICAgIGlmIChzdGF0dXNMaW5lTGFiZWxQcm92aWRlciAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgdGV4dCA9IHN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyLmdldFRleHQoZmlyc3RFbGVtZW50KTsKLSAgICAgIGltYWdlID0gc3RhdHVzTGluZUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZmlyc3RFbGVtZW50KTsKLSAgICB9Ci0gICAgaWYgKGltYWdlID09IG51bGwpCi0gICAgewotICAgICAgbWdyLnNldE1lc3NhZ2UodGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtZ3Iuc2V0TWVzc2FnZShpbWFnZSwgdGV4dCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgY2xhc3MgU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBudWxsOwotCi0gICAgcHVibGljIFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKQotICAgIHsKLSAgICAgIHRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50ID09IG51bGwpCi0gICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICBTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIHMuYXBwZW5kKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KSk7Ci0gICAgICByZXR1cm4gcy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gbGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUQ29udGVudE91dGxpbmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDYzMjUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUQ29udGVudE91dGxpbmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIEFEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSUFEVE9iamVjdExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBWaWV3ZXIgdmlld2VyID0gbnVsbDsKLSAgcHJvdGVjdGVkIE9iamVjdCBvbGRJbnB1dCwgbmV3SW5wdXQ7Ci0KLSAgcHVibGljIEFEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElUcmVlRWxlbWVudCkKLSAgICB7Ci0gICAgICBPYmplY3RbXSBjaGlsZHJlbiA9ICgoSVRyZWVFbGVtZW50KSBwYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBsZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3QgY2hpbGQgPSBjaGlsZHJlbltpXTsKLSAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoSUFEVE9iamVjdCkgY2hpbGQpLnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY2hpbGRyZW47Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuICgoSVRyZWVFbGVtZW50KSBlbGVtZW50KS5oYXNDaGlsZHJlbigpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIE9iamVjdCBpbnB1dCA9IHZpZXdlci5nZXRJbnB1dCgpOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgewotICAgICAgcmVtb3ZlTGlzdGVuZXIoKElBRFRPYmplY3QpIGlucHV0KTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgIHRoaXMub2xkSW5wdXQgPSBvbGRJbnB1dDsKLSAgICB0aGlzLm5ld0lucHV0ID0gbmV3SW5wdXQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZWQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikKLSAgICB7Ci0gICAgICBUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcikgdmlld2VyOwotICAgICAgaWYgKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpICE9IG51bGwgJiYgIXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmlzRGlzcG9zZWQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJlZVZpZXdlci5yZWZyZXNoKG9iamVjdCk7Ci0gICAgICAgIHRyZWVWaWV3ZXIucmV2ZWFsKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBtb2RlbAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZUxpc3RlbmVyKElBRFRPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBtb2RlbC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihtb2RlbCk7Ci0gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoKElBRFRPYmplY3QpIGNoaWxkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGE2ZDRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBBRFRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLXsKLQotICBwdWJsaWMgQURUTGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoKElUcmVlRWxlbWVudCllbGVtZW50KS5nZXRJbWFnZSgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoKElUcmVlRWxlbWVudCllbGVtZW50KS5nZXRUZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0V4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE5YTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQURUTXVsdGlQYWdlRWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIFBhZ2UgaW1wbGVtZW50cyBJQ29udGVudE91dGxpbmVQYWdlLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBMaXN0ZW5lckxpc3Qgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLSAgcHJvdGVjdGVkIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLSAgcHJvdGVjdGVkIE9iamVjdCBtb2RlbDsKLSAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLSAgcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBBRFRNdWx0aVBhZ2VFZGl0b3IgZWRpdG9yOwotCi0gIHByb3RlY3RlZCBFeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICB0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICB0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvcihBRFRNdWx0aVBhZ2VFZGl0b3IgZWRpdG9yKQotICB7Ci0gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKE9iamVjdCBuZXdNb2RlbCkKLSAgewotICAgIG1vZGVsID0gbmV3TW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50UHJvdmlkZXIoSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKQotICB7Ci0gICAgdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmICh0cmVlVmlld2VyICE9IG51bGwpCi0gICAgewotICAgICAgdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgLy8gY3JlYXRlIGFuIGV2ZW50Ci0gICAgZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pOwotCi0gICAgLy8gZmlyZSB0aGUgZXZlbnQKLSAgICBPYmplY3RbXSBsaXN0ZW5lcnMgPSBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKQotICAgIHsKLSAgICAgIGZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbCA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0gICAgICBQbGF0Zm9ybS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICBsLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkKLSAgewotICAgIGlmICh0cmVlVmlld2VyID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIHJldHVybiB0cmVlVmlld2VyLmdldENvbnRyb2woKTsKLSAgfQotCi0gIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIHsKLSAgICBpZiAodHJlZVZpZXdlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICAgIH0KLSAgICByZXR1cm4gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKQotICB7Ci0gICAgcmV0dXJuIHRyZWVWaWV3ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KElQYWdlU2l0ZSBwYWdlU2l0ZSkKLSAgewotICAgIHN1cGVyLmluaXQocGFnZVNpdGUpOwotICAgIHBhZ2VTaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIGZpcmVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9JVHJlZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvSVRyZWVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NjBkOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9JVHJlZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUcmVlRWxlbWVudAotewotICBwdWJsaWMgZmluYWwgc3RhdGljIElUcmVlRWxlbWVudFtdIEVNUFRZX0xJU1QgPSB7fTsKLSAgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKTsKLSAgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpOwotICBib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0gIFN0cmluZyBnZXRUZXh0KCk7Ci0gIEltYWdlIGdldEltYWdlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9wcm9wZXJ0aWVzL0FEVFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9wcm9wZXJ0aWVzL0FEVFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMTM0M2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3Byb3BlcnRpZXMvQURUVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkLiAgRXh0ZW5kZXJzIHNob3VsZCBzcGVjaWFsaXplLi4uaWUuIFhTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBBRFRUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBleHRlbmRzIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlCi17Ci0gIHB1YmxpYyBBRFRUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZShJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKQotICB7Ci0gICAgc3VwZXIodGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotLy8gICAgICBPYmplY3Qgc2VsZWN0ZWQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLS8vICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRWRpdFBhcnQpCi0vLyAgICAgIHsKLS8vICAgICAgICBPYmplY3QgbW9kZWwgPSAoKEVkaXRQYXJ0KXNlbGVjdGVkKS5nZXRNb2RlbCgpOwotLy8gICAgICAgIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vZGVsKTsKLS8vICAgICAgfQotICAgICAgc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREFueUF0dHJpYnV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzc4NWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5BZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICAKLSAgcHVibGljIEFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BTllfQVRUUklCVVRFKTsKLSAgICBzZXRJZChJRCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLSAgICBBZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEUsIChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEUsIChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIAotICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgewotICAgICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGFkZGVkQ29tcG9uZW50KTsKLSAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICBib29sZWFuIHJjID0gc3VwZXIuY2FsY3VsYXRlRW5hYmxlZCgpOwotICAgIGlmIChyYykKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pc2VsZWN0aW9uKS5nZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQoKSA9PSBudWxsOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm4gKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pc2VsZWN0aW9uKS5nZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQoKSA9PSBudWxsOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIHJldHVybiByYzsKLSAgfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBbnlFbGVtZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREFueUVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwYTUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREFueUVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RBbnlFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLQotcHVibGljIGNsYXNzIEFkZFhTREFueUVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuQWRkWFNEQW55RWxlbWVudEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQWRkWFNEQW55RWxlbWVudEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BTllfRUxFTUVOVCk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSBnZXRNb2RlbEdyb3VwKHNlbGVjdGlvbik7Ci0KLSAgICBBZGRYU0RBbnlFbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTREFueUVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgbW9kZWxHcm91cCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kLnNldENvbXBsZXhUeXBlKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pc2VsZWN0aW9uKTsKLSAgICB9Ci0gICAgY29tbWFuZC5zZXREb0NyZWF0ZU1vZGVsR3JvdXBGb3JDb21wbGV4VHlwZShtb2RlbEdyb3VwID09IG51bGwpOwotICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gIH0KLQotICBwcml2YXRlIFhTRE1vZGVsR3JvdXAgZ2V0TW9kZWxHcm91cChPYmplY3Qgc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgcmV0dXJuIChYU0RNb2RlbEdyb3VwKSBzZWxlY3Rpb247Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29udGVudCA9ICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXNlbGVjdGlvbikuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCA9ICgoWFNEUGFydGljbGUpY29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoWFNETW9kZWxHcm91cClwYXJ0aWNsZUNvbnRlbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxMTNmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLkFkZFhTREF0dHJpYnV0ZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQkVGT1JFX1NFTEVDVEVEX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFGVEVSX1NFTEVDVEVEX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQUZURVJfU0VMRUNURURfSUQiOyAvLyROT04tTkxTLTEkICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVGX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlUmVmZXJlbmNlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBib29sZWFuIGlzUmVmZXJlbmNlID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFKTsKLSAgICBzZXRJZChJRCk7Ci0gICAgaXNSZWZlcmVuY2UgPSBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUmVmZXJlbmNlKQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChsYWJlbCk7Ci0gICAgc2V0SWQoaWQpOwotICAgIHRoaXMuaXNSZWZlcmVuY2UgPSBpc1JlZmVyZW5jZTsKLSAgICBkb0RpcmVjdEVkaXQgPSAhaXNSZWZlcmVuY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBzZWxlY3Rpb24gPSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBzZWxlY3Rpb24pLmdldENvbnRhaW5lcigpOwotICAgICAgfQotICAgIH0KLSAgICBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUsIChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHNlbGVjdGlvbik7Ci0gICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZVVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIHNlbGVjdGlvbjsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IG51bGw7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSBudWxsOwotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gbnVsbDsKLSAgICAgIGZvciAocGFyZW50ID0geHNkQXR0cmlidXRlVXNlLmdldENvbnRhaW5lcigpOyBwYXJlbnQgIT0gbnVsbDspCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBncm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pcGFyZW50OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIH0KLSAgICAgIGlmIChjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2Ugc2VsID0gKFhTREF0dHJpYnV0ZVVzZSkgc2VsZWN0aW9uOwotICAgICAgICBpbnQgaW5kZXggPSBjdC5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmluZGV4T2Yoc2VsKTsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFLCBjdCwgZ2V0SWQoKSwgaW5kZXgpOwotICAgICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChncm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2Ugc2VsID0gKFhTREF0dHJpYnV0ZVVzZSkgc2VsZWN0aW9uOwotICAgICAgICBpbnQgaW5kZXggPSBncm91cC5lQ29udGVudHMoKS5pbmRleE9mKHNlbCk7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSwgZ3JvdXAsIGdldElkKCksIGluZGV4KTsKLSAgICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFLCAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKXNlbGVjdGlvbik7Ci0gICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFLCAoWFNEU2NoZW1hKXNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICAKLSAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgICB9Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMGEzZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFRl9JRCA9ICJBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVApOwotICAgIHNldElkKElEKTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBTdHJpbmcgaWQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBpZiAoaWQuZXF1YWxzKFJFRl9JRCkpCi0gICAgewotICAgICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX0RFRklOSVRJT04pOwotICAgIH0gICAKLSAgICBzZXRJZChpZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLQotICAgIEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRiwgKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX0RFRklOSVRJT04sIChYU0RTY2hlbWEpIHNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLQotICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgewotICAgICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGFkZGVkQ29tcG9uZW50KTsKLSAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgIH0KLQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1ZjRlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9DT01QTEVYX1RZUEUpOwotICAgIHNldElkKElEKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9DT01QTEVYX1RZUEUsIChYU0RTY2hlbWEpIHNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgCi0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNERWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJkNjRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNERWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNETW9kZWxHcm91cEltcGw7Ci0KLS8vcmV2aXNpdCB0aGlzIGFuZCBzZWUgaWYgd2UgY2FuIHJldXNlIEFkZEZpZWxkQWN0aW9uPz8KLQotcHVibGljIGNsYXNzIEFkZFhTREVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQkVGT1JFX1NFTEVDVEVEX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbi5CRUZPUkVfU0VMRUNURURfSUQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFGVEVSX1NFTEVDVEVEX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbi5BRlRFUl9TRUxFQ1RFRF9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVGX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudFJlZmVyZW5jZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZTsKLSAgCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzUmVmZXJlbmNlKQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChsYWJlbCk7Ci0gICAgc2V0SWQoaWQpOwotICAgIHRoaXMuaXNSZWZlcmVuY2UgPSBpc1JlZmVyZW5jZTsKLSAgICBkb0RpcmVjdEVkaXQgPSAhaXNSZWZlcmVuY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLSAgICBBZGRYU0RFbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBzZWxlY3Rpb24pOwotICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApIHNlbGVjdGlvbjsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IG1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSBudWxsOwotICAgICAgd2hpbGUgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBjb21wb25lbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgICAgfQotCi0gICAgICBpZiAoY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIChYU0RNb2RlbEdyb3VwKSBzZWxlY3Rpb24sIGN0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIChYU0RNb2RlbEdyb3VwKSBzZWxlY3Rpb24pOwotICAgICAgfQotICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0aW9uOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbnVsbDsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IG51bGw7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBncm91cCA9IG51bGw7Ci0gICAgICBYU0RNb2RlbEdyb3VwSW1wbCBjdEdyb3VwID0gbnVsbDsKLQotICAgICAgZm9yIChwYXJlbnQgPSB4c2RDb25jcmV0ZUNvbXBvbmVudC5nZXRDb250YWluZXIoKTsgcGFyZW50ICE9IG51bGw7ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilwYXJlbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBncm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbilwYXJlbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjdEdyb3VwID0gKFhTRE1vZGVsR3JvdXBJbXBsKSBwYXJlbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldENvbnRhaW5lcigpOwotICAgICAgfQotICAgICAgaWYgKGN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCBjdCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN0R3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHNlbCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgaW50IGluZGV4ID0gY3RHcm91cC5nZXRDb250ZW50cygpLmluZGV4T2Yoc2VsLmVDb250YWluZXIoKSk7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCBjdEdyb3VwLCBnZXRJZCgpLCBpbmRleCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCBncm91cCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNETW9kZWxHcm91cEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZmI0NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRE1vZGVsR3JvdXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUVVFTkNFX0lEID0gIkFkZFhTRFNlcXVlbmNlTW9kZWxHcm91cEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hPSUNFX0lEID0gIkFkZFhTRENob2ljZU1vZGVsR3JvdXBBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFMTF9JRCA9ICJBZGRYU0RBbGxNb2RlbEdyb3VwQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBYU0RDb21wb3NpdG9yIHhzZENvbXBvc2l0b3I7Ci0KLSAgcHVibGljIEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgWFNEQ29tcG9zaXRvciBjb21wb3NpdG9yLCBTdHJpbmcgSUQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KGdldExhYmVsKGNvbXBvc2l0b3IpKTsKLSAgICBzZXRJZChJRCk7Ci0gICAgdGhpcy54c2RDb21wb3NpdG9yID0gY29tcG9zaXRvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICBBZGRYU0RNb2RlbEdyb3VwQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICAgIGlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB4c2RDb21wb25lbnQ7Ci0KLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwQ29tbWFuZChnZXRMYWJlbCh4c2RDb21wb3NpdG9yKSwgeHNkRWxlbWVudERlY2xhcmF0aW9uLCB4c2RDb21wb3NpdG9yKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSB4c2RDb21wb25lbnQ7Ci0KLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwQ29tbWFuZChnZXRMYWJlbCh4c2RDb21wb3NpdG9yKSwgeHNkTW9kZWxHcm91cCwgeHNkQ29tcG9zaXRvcik7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24KLSAgICAgICAgICAgICAgIHx8IHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kKGdldExhYmVsKHhzZENvbXBvc2l0b3IpLCB4c2RDb21wb25lbnQsIHhzZENvbXBvc2l0b3IpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAKLSAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICBwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOwotICAgICAgfQotCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFiZWwoWFNEQ29tcG9zaXRvciBjb21wb3NpdG9yKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NFUVVFTkNFIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoY29tcG9zaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChjb21wb3NpdG9yID09IFhTRENvbXBvc2l0b3IuQ0hPSUNFX0xJVEVSQUwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NIT0lDRSIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wb3NpdG9yID09IFhTRENvbXBvc2l0b3IuQUxMX0xJVEVSQUwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0FMTCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDlhMzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxHUk9VUERFRklOSVRJT05fSUQgPSAiQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMR1JPVVBERUZJTklUSU9OUkVGX0lEID0gIkFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBib29sZWFuIGlzUmVmZXJlbmNlOwotCi0gIHB1YmxpYyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBib29sZWFuIGlzUmVmZXJlbmNlKQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgdGhpcy5pc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlOwotICAgIGlmIChpc1JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0dST1VQX1JFRik7Ci0gICAgICBzZXRJZChNT0RFTEdST1VQREVGSU5JVElPTl9JRCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0dST1VQKTsKLSAgICAgIHNldElkKE1PREVMR1JPVVBERUZJTklUSU9OUkVGX0lEKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLSAgICBpZiAoeHNkQ29uY3JldGVDb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQoZ2V0VGV4dCgpLCB4c2RDb25jcmV0ZUNvbXBvbmVudCwgaXNSZWZlcmVuY2UpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQotICAgICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGFkZGVkQ29tcG9uZW50KTsKLSAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjRmMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREltcG9ydENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNESW5jbHVkZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEUmVkZWZpbmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkJhc2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5DTFVERV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREluY2x1ZGVBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElNUE9SVF9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREltcG9ydEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVERUZJTkVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RSZWRlZmluZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgU3RyaW5nIGxhYmVsOwotICAKLSAgcHVibGljIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBTdHJpbmcgSUQsIFN0cmluZyBsYWJlbCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQobGFiZWwpOwotICAgIHNldElkKElEKTsKLSAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLQotICAgIEJhc2VDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgaWYgKElOQ0xVREVfSUQuZXF1YWxzKGdldElkKCkpKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREluY2x1ZGVDb21tYW5kKGxhYmVsLCAoWFNEU2NoZW1hKSBzZWxlY3Rpb24pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoSU1QT1JUX0lELmVxdWFscyhnZXRJZCgpKSkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RJbXBvcnRDb21tYW5kKGxhYmVsLCAoWFNEU2NoZW1hKSBzZWxlY3Rpb24pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUkVERUZJTkVfSUQuZXF1YWxzKGdldElkKCkpKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTRFJlZGVmaW5lQ29tbWFuZChsYWJlbCwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKSk7Ci0gICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgewotICAgIAkgIHByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhZGFwdGVyKSk7Ci0gICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgb3BlbiB0aGUgc2NoZW1hIGxvY2F0aW9uIGRpYWxvZyBpZiB0aGUgcHJlZmVyZW5jZSBpcyBlbmFibGVkCi0gICAgICAgIGlmKFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QXV0b21hdGljYWxseU9wZW5TY2hlbWFMb2NhdGlvbkRpYWxvZ1NldHRpbmcoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIgeHNkU2NoZW1hRGlyZWN0aXZlQWRhcHRlciA9IG51bGw7Ci0gICAgICAgICAgaWYoYWRhcHRlciBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2NoZW1hRGlyZWN0aXZlQWRhcHRlciA9IChYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKWFkYXB0ZXI7Ci0gICAgICAgICAgfSAgICAJICAKLSAgICAgICAgICBYU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyLnVwZGF0ZVNjaGVtYUxvY2F0aW9uKChYU0RTY2hlbWEpIHNlbGVjdGlvbiwgeHNkU2NoZW1hRGlyZWN0aXZlQWRhcHRlci5nZXRUYXJnZXQoKSwgCi0gICAgICAgICAgICAJCShjb21tYW5kIGluc3RhbmNlb2YgQWRkWFNESW5jbHVkZUNvbW1hbmQgfHwgY29tbWFuZCBpbnN0YW5jZW9mIEFkZFhTRFJlZGVmaW5lQ29tbWFuZCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBncmFwaGljYWwgdmlldyBtYXkgZGVzZWxlY3QsIHNvIHNlbGVjdCBhZ2FpbgotICAgICAgICBwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdjZDczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAKLSAgICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZlNDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5EZWxldGVBY3Rpb24KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX1hTRF9DT01QT05FTlRfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbiI7ICAgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBEZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURSk7Ci0gICAgc2V0SWQoREVMRVRFX1hTRF9DT01QT05FTlRfSUQpOwotICAgIHNldEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9kZWxldGVfb2JqLmdpZiIpICk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSBpLm5leHQoKTsKLSAgICAgIGJvb2xlYW4gZG9SZXNlbGVjdCA9IGZhbHNlOwotICAgICAgCi0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3Rpb247Ci0gICAgICAgIFhTRFNjaGVtYSBtb2RlbCA9IHhzZENvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICAgICAgCi0gICAgICAgIGRvUmVzZWxlY3QgPSB4c2RDb21wb25lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hOwotICAgICAgICAKLSAgICAgICAgRGVsZXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0VGV4dCgpLCB4c2RDb21wb25lbnQpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1vZGVsICE9IG51bGwgJiYgZG9SZXNlbGVjdCkKLSAgICAgICAgewotICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQobW9kZWwpOwotICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICAgICAgICBwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOwotICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9PcGVuSW5OZXdFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvT3BlbkluTmV3RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzZmOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9PcGVuSW5OZXdFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQURURmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREltcG9ydEltcGw7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuSW5OZXdFZGl0b3IgZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIk9wZW5Jbk5ld0VkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgT3BlbkluTmV3RWRpdG9yKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SKTsgLy8kTk9OLU5MUy0xJAotICAgIHNldElkKElEKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUVuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG51bGw7Ci0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbnVsbDsKLSAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpCi0gICAgewotICAgICAgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKQotICAgICAgewotICAgICAgICBlZGl0b3JJbnB1dCA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIAotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RCYXNlQWRhcHRlciB4c2RBZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb247Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBmQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSB4c2RBZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGZDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICAKLSAgICAgIGJvb2xlYW4gaXNSZWZlcmVuY2UgPSBmYWxzZTsKLSAgICAgIGlmIChmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICAgIHsKLSAgICAgICAgaXNSZWZlcmVuY2UgPSAoKFhTREZlYXR1cmUpZkNvbXBvbmVudCkuaXNGZWF0dXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIGZDb21wb25lbnQgPSAoKFhTREZlYXR1cmUpZkNvbXBvbmVudCkuZ2V0UmVzb2x2ZWRGZWF0dXJlKCk7Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0gICAgICBJUGF0aCBzY2hlbWFQYXRoID0gbnVsbDsKLSAgICAgIElGaWxlIHNjaGVtYUZpbGUgPSBudWxsOwotCi0gICAgICAvLyBTcGVjaWFsIGNhc2UgYW55IGltcG9ydHMvaW5jbHVkZXMKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgZGlyID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkoKFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIpc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgLy8gZm9yY2UgbG9hZCBvZiBpbXBvcnRlZCBzY2hlbWEKLSAgICAgICAgaWYgKGRpciBpbnN0YW5jZW9mIFhTREltcG9ydEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFhTREltcG9ydEltcGwpZGlyKS5pbXBvcnRTY2hlbWEoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGlyLmdldFJlc29sdmVkU2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgIHNjaGVtYUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0gICAgICAgICAgc2NoZW1hID0gZGlyLmdldFJlc29sdmVkU2NoZW1hKCk7IAotICAgICAgICAgIGZDb21wb25lbnQgPSBkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgICAgfQotICAgICAgfSAvLyBIYW5kbGUgYW55IG90aGVyIGV4dGVybmFsIGNvbXBvbmVudHMKLSAgICAgIGVsc2UgaWYgKGZDb21wb25lbnQuZ2V0U2NoZW1hKCkgIT0gbnVsbCAmJiBmQ29tcG9uZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fCBpc1JlZmVyZW5jZSkKLSAgICAgIHsKLSAgICAgICAgc2NoZW1hTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKGZDb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgIHNjaGVtYUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKWdldFdvcmtiZW5jaFBhcnQoKS5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgICAgICAgaWYgKGZDb21wb25lbnQuZ2V0U2NoZW1hKCkgPT0geHNkU2NoZW1hKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICgoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQpLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShmQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gSWYgdGhlIHNjaGVtYUZpbGUgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLSAgICAgIGlmIChwYWdlICE9IG51bGwgJiYgc2NoZW1hRmlsZSAhPSBudWxsICYmIHNjaGVtYUZpbGUuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGVkaXRvcidzIHNjaGVtYQotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKWdldFdvcmtiZW5jaFBhcnQoKS5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgICAgLy8gVGhpcyBmaXJzdCBjaGVjayBpcyB0byBlbnN1cmUgdGhhdCB0aGUgc2NoZW1hIGlzIGFjdHVhbGx5Ci0gICAgICAgICAgLy8gZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgb25lIHdlIGFyZSBlZGl0aW5nIGFnYWluc3QgaW4gdGhlIGVkaXRvciwgYW5kIHRoYXQgd2UKLSAgICAgICAgICAvLyBhcmUgaW4gdGhlIHNhbWUgcmVzb3VyY2UgZmlsZS4uLi5oZW5jZSBtdWx0aXBsZSBzY2hlbWFzIGluIHRoZSBzYW1lIGZpbGUuCi0gICAgICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsICYmIGZDb21wb25lbnQuZ2V0Um9vdENvbnRhaW5lcigpLmVSZXNvdXJjZSgpID09IHhzZFNjaGVtYS5lUmVzb3VyY2UoKSAmJiB4c2RTY2hlbWEgIT0gc2NoZW1hKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBlZGl0b3JOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFhTREZpbGVFZGl0b3JJbnB1dCB4c2RGaWxlRWRpdG9ySW5wdXQgPSBuZXcgWFNERmlsZUVkaXRvcklucHV0KHNjaGVtYUZpbGUsIGZDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICAgLy8gd2lsbCB1c2UgRmlsZUVkaXRvcklucHV0J3MgbmFtZSBpZiBzdGlsbCBudWxsCi0gICAgICAgICAgICAvLyBUcnkgdG8gdXNlIHRoZSBzYW1lIGVkaXRvciBuYW1lIGFzIHRoZSBjdXJyZW50IG9uZQotICAgICAgICAgICAgaWYgKGVkaXRvcklucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVkaXRvck5hbWUgPSBlZGl0b3JJbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIHhzZEZpbGVFZGl0b3JJbnB1dC5zZXRFZGl0b3JOYW1lKGVkaXRvck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWRpdG9yUGFydCA9IGdldEV4aXN0aW5nRWRpdG9yRm9ySW5saW5lU2NoZW1hKHBhZ2UsIHNjaGVtYUZpbGUsIHNjaGVtYSk7Ci0gICAgICAgICAgICBpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKHhzZEZpbGVFZGl0b3JJbnB1dCwgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCwgdHJ1ZSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSksIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQpLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShmQ29tcG9uZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gb3BlbiB0aGUgeHNkIGV4dGVybmFsbHkKLSAgICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgb3BlbkV4dGVybmFsRmlsZXMocGFnZSwgc2NoZW1hTG9jYXRpb24sIGZDb21wb25lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuWFNERWRpdG9yKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KQotICB7Ci0gICAgb3BlblhTREVkaXRvcihlZGl0b3JJbnB1dCwgeHNkQ29tcG9uZW50LmdldFNjaGVtYSgpLCB4c2RDb21wb25lbnQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RTY2hlbWEgc2NoZW1hLCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpCi0gIHsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG51bGw7Ci0gICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIFN0cmluZyByZXNvdXJjZSA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIAotICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCAmJiByZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5zdGFydHNXaXRoKCJodHRwIikpCi0gICAgewotICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChyZXNvdXJjZSk7Ci0gICAgICBvcGVuV29ya3NwYWNlRmlsZShwYWdlLCBzY2hlbWFMb2NhdGlvbiwgeHNkQ29tcG9uZW50KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG9wZW5FeHRlcm5hbEZpbGVzKHBhZ2UsIHJlc291cmNlLCB4c2RDb21wb25lbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmxpbmVTY2hlbWEoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQsIFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBlZGl0b3JOYW1lKQotICB7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzV29ya3NwYWNlRmlsZSA9IGZhbHNlOwotICAgIAotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIFN0cmluZyB3b3Jrc3BhY2VGaWxlTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHNjaGVtYUxvY2F0aW9uKTsKLSAgICBJUGF0aCB3b3Jrc3BhY2VGaWxlUGF0aCA9IG5ldyBQYXRoKHdvcmtzcGFjZUZpbGVMb2NhdGlvbik7Ci0gICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSh3b3Jrc3BhY2VGaWxlUGF0aCk7Ci0gICAgCi0gICAgaWYgKHBhZ2UgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBpc1dvcmtzcGFjZUZpbGUgPSB0cnVlOyAgCi0gICAgfQotCi0gICAgaWYgKGlzV29ya3NwYWNlRmlsZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgIFhTREZpbGVFZGl0b3JJbnB1dCB4c2RGaWxlRWRpdG9ySW5wdXQgPSBuZXcgWFNERmlsZUVkaXRvcklucHV0KGZpbGUsIHNjaGVtYSk7Ci0gICAgICAgIHhzZEZpbGVFZGl0b3JJbnB1dC5zZXRFZGl0b3JOYW1lKGVkaXRvck5hbWUpOwotICAgICAgICBJRWRpdG9yUmVmZXJlbmNlW10gcmVmcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotICAgICAgICBpbnQgbGVuZ3RoID0gcmVmcy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERmlsZUVkaXRvcklucHV0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElGaWxlIGFGaWxlID0gKChYU0RGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBpZiAoYUZpbGUuZ2V0RnVsbFBhdGgoKS5lcXVhbHMoZmlsZS5nZXRGdWxsUGF0aCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoWFNERmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHJlZnNbaV0uZ2V0RWRpdG9yKHRydWUpOwotICAgICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcih4c2RGaWxlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKHhzZENvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAhc2NoZW1hTG9jYXRpb24uc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgICAgewotICAgICAgICBTdHJpbmcgZmlsZUxvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgLy8gVGhpcyBpcyB0byB3b3JrYXJvdW5kIHRoZSBkaWZmZXJlbmNlIGluIFVSSSByZXNvbHV0aW9uLiBPbiBsaW51eCwgdGhlIHJlc29sdmVkIGxvY2F0aW9uIGlzCi0gICAgICAgIC8vIHBsYXRmb3JtOi9yZXNvdXJjZS8gICBPbiBXaW5kb3dzLCBpdCdzIGZpbGU6Ly8KLSAgICAgICAgLy8gCi0gICAgICAgCWlmIChqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLycpCi0gICAgICAJewotICAgICAgICAgIGZpbGVMb2NhdGlvbiA9ICIvIiArIFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woc2NoZW1hTG9jYXRpb24pOwotICAgICAgCX0KLSAgICAJICBlbHNlIC8vIFdpbmRvd3MKLSAgICAgIAl7Ci0gICAgICAgICAgZmlsZUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVByb3RvY29sKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgIAl9Ci0gICAgICAgIElQYXRoIHNjaGVtYVBhdGggPSBuZXcgUGF0aChmaWxlTG9jYXRpb24pOwotICAgICAgICBJRmlsZVN0b3JlIGZpbGVTdG9yZSA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5nZXRTdG9yZShzY2hlbWFQYXRoKTsKLSAgICAgICAgaWYgKCFmaWxlU3RvcmUuZmV0Y2hJbmZvKCkuaXNEaXJlY3RvcnkoKSAmJiBmaWxlU3RvcmUuZmV0Y2hJbmZvKCkuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dCB4c2RGaWxlU3RvcmVFZGl0b3JJbnB1dCA9IG5ldyBBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dChmaWxlU3RvcmUsIHNjaGVtYSk7Ci0gICAgICAgICAgICB4c2RGaWxlU3RvcmVFZGl0b3JJbnB1dC5zZXRFZGl0b3JOYW1lKGVkaXRvck5hbWUpOwotCi0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVmcy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFEVEZpbGVTdG9yZUVkaXRvcklucHV0KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVVJJIHVyaSA9ICgoQURURmlsZVN0b3JlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAodXJpLmVxdWFscyh4c2RGaWxlU3RvcmVFZGl0b3JJbnB1dC5nZXRVUkkoKSkgJiYgKChBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFNjaGVtYSgpID09IHhzZEZpbGVTdG9yZUVkaXRvcklucHV0LmdldFNjaGVtYSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGVkaXRvclBhcnQgPSByZWZzW2ldLmdldEVkaXRvcih0cnVlKTsKLSAgICAgICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFnZSAhPSBudWxsICYmIGVkaXRvclBhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcih4c2RGaWxlU3RvcmVFZGl0b3JJbnB1dCwgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCwgdHJ1ZSwgMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICAgICAgeHNkRWRpdG9yLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZSh4c2RDb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKQotICAgICAgICAgIHsKLQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotICAgICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgaW50IGxlbmd0aCA9IHJlZnMubGVuZ3RoOwotICAgICAgICAgIC8vIE5lZWQgdG8gZmluZCBpZiBhbiBlZGl0b3Igb24gdGhhdCBzY2hlbWEgaGFzIGFscmVhZHkgYmVlbiBvcGVuZWQKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHJlZnNbaV0uZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dCB4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0ID0gKEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLSAgICAgICAgICAgICAgaWYgKHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQuZ2V0VXJsU3RyaW5nKCkuZXF1YWxzKHNjaGVtYUxvY2F0aW9uKQotICAgICAgICAgICAgICAgICAgJiYgeHNkRmlsZVN0b3JhZ2VFZGl0b3JJbnB1dC5nZXRFZGl0b3JJRCgpLmVxdWFscyhYU0RFZGl0b3JQbHVnaW4uRURJVE9SX0lEKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVkaXRvclBhcnQgPSByZWZzW2ldLmdldEVkaXRvcih0cnVlKTsKLSAgICAgICAgICAgICAgICBwYWdlLmFjdGl2YXRlKHJlZnNbaV0uZ2V0UGFydCh0cnVlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dCB4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0ID0gbmV3IEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgIHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQuc2V0U2NoZW1hKHNjaGVtYSk7Ci0gICAgICAgICAgICB4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0LnNldEVkaXRvck5hbWUoZWRpdG9yTmFtZSk7Ci0gICAgICAgICAgICB4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0LnNldEVkaXRvcklEKFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQpOwotICAgICAgICAgICAgZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcih4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0LCBYU0RFZGl0b3JQbHVnaW4uRURJVE9SX0lELCB0cnVlLCAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciB4c2RFZGl0b3IgPSAoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKHhzZENvbXBvbmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgSUVkaXRvclBhcnQgZ2V0RXhpc3RpbmdFZGl0b3JGb3JJbmxpbmVTY2hlbWEoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSUZpbGUgc2NoZW1hRmlsZSwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIElFZGl0b3JSZWZlcmVuY2UgW10gcmVmcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotICAgIGludCBsZW5ndGggPSByZWZzLmxlbmd0aDsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgewotICAgICAgICAgIElGaWxlIGFGaWxlID0gKChYU0RGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgICBpZiAoYUZpbGUuZ2V0RnVsbFBhdGgoKS5lcXVhbHMoc2NoZW1hRmlsZS5nZXRGdWxsUGF0aCgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKChYU0RGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHJlZnNbaV0uZ2V0RWRpdG9yKHRydWUpOwotICAgICAgICAgICAgICBwYWdlLmFjdGl2YXRlKHJlZnNbaV0uZ2V0UGFydCh0cnVlKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5Xb3Jrc3BhY2VGaWxlKElXb3JrYmVuY2hQYWdlIHBhZ2UsIFN0cmluZyBzY2hlbWFMb2NhdGlvbiwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KQotICB7Ci0gICAgSVBhdGggc2NoZW1hUGF0aCA9IG5ldyBQYXRoKHNjaGVtYUxvY2F0aW9uKTsKLSAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNjaGVtYVBhdGgpOwotICAgIGlmIChwYWdlICE9IG51bGwgJiYgZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLSAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKHhzZENvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICB7Ci0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkV4dGVybmFsRmlsZXMoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgU3RyaW5nIHNjaGVtYUxvY2F0aW9uLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBmQ29tcG9uZW50KQotICB7Ci0gICAgaWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwpIHJldHVybjsgIC8vIEFzc2VydCBub3QgbnVsbAotICAKLSAgICBJUGF0aCBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOwotLy8gIEluaXRpYWxseSB0cmllZCB0byB1c2Ugc2NoZW1hUGF0aC5nZXREZXZpY2UoKSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYW4gaHR0cCByZWZlcmVuY2UuICBIb3dldmVyLCBvbiBMaW51eCwgaXQgaXMgbnVsbC4KLS8vICBTbyBhcyBhIHJlc3VsdCBvZiBidWcgMjIxNDIxLCB3ZSB3aWxsIGp1c3QgdXNlIHRoZSBzY2hlbWFMb2NhdGlvbi4KLSAgICBpZiAoIXNjaGVtYUxvY2F0aW9uLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICB7Ci0gICAgICBzY2hlbWFQYXRoID0gbmV3IFBhdGgoVVJJSGVscGVyLnJlbW92ZVByb3RvY29sKHNjaGVtYUxvY2F0aW9uKSk7Ci0gICAgfQotICAgIElGaWxlU3RvcmUgZmlsZVN0b3JlID0gRUZTLmdldExvY2FsRmlsZVN5c3RlbSgpLmdldFN0b3JlKHNjaGVtYVBhdGgpOwotICAgIFVSSSBzY2hlbWFVUkkgPSBVUkkuY3JlYXRlKHNjaGVtYUxvY2F0aW9uKTsKLSAgICBpZiAoIWZpbGVTdG9yZS5mZXRjaEluZm8oKS5pc0RpcmVjdG9yeSgpICYmIGZpbGVTdG9yZS5mZXRjaEluZm8oKS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgIElFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSByZWZzLmxlbmd0aDsKLSAgICAgICAgLy8gTmVlZCB0byBmaW5kIGlmIGFuIGVkaXRvciBvbiB0aGF0IHNjaGVtYSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gcmVmc1tpXS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGVTdG9yZUVkaXRvcklucHV0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFVSSSB1cmkgPSAoKEZpbGVTdG9yZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0VVJJKCk7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscyhzY2hlbWFVUkkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcmVmc1tpXS5nZXRFZGl0b3IodHJ1ZSk7Ci0gICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChlZGl0b3JQYXJ0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3JPbkZpbGVTdG9yZShwYWdlLCBmaWxlU3RvcmUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciB4c2RFZGl0b3IgPSAoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICAgICAgeHNkRWRpdG9yLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShmQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24uc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgICAgICBJRWRpdG9yUmVmZXJlbmNlW10gcmVmcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHJlZnMubGVuZ3RoOwotICAgICAgICAgICAgLy8gTmVlZCB0byBmaW5kIGlmIGFuIGVkaXRvciBvbiB0aGF0IHNjaGVtYSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gcmVmc1tpXS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IHJlYWRPbmx5RWRpdG9ySW5wdXQgPSAoQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotICAgICAgICAgICAgICAgIGlmIChyZWFkT25seUVkaXRvcklucHV0LmdldFVybFN0cmluZygpLmVxdWFscyhzY2hlbWFMb2NhdGlvbikgJiYKLSAgICAgICAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRC5lcXVhbHMocmVhZE9ubHlFZGl0b3JJbnB1dC5nZXRFZGl0b3JJRCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcmVmc1tpXS5nZXRFZGl0b3IodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICBwYWdlLmFjdGl2YXRlKHJlZnNbaV0uZ2V0UGFydCh0cnVlKSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IHJlYWRPbmx5U3RvcmFnZUVkaXRvcklucHV0ID0gbmV3IEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgcmVhZE9ubHlTdG9yYWdlRWRpdG9ySW5wdXQuc2V0RWRpdG9ySUQoWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCk7Ci0gICAgICAgICAgICAgIGVkaXRvclBhcnQgPSBwYWdlLm9wZW5FZGl0b3IocmVhZE9ubHlTdG9yYWdlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciB4c2RFZGl0b3IgPSAoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICAgICAgICAgIHhzZEVkaXRvci5vcGVuT25HbG9iYWxSZWZlcmVuY2UoZkNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEZpbGVTdG9yZUVkaXRvcklucHV0IHhzZEZpbGVTdG9yZUVkaXRvcklucHV0ID0gbmV3IEZpbGVTdG9yZUVkaXRvcklucHV0KGZpbGVTdG9yZSk7ICAgICAgICAKLSAgICAgICAgICBwYWdlLm9wZW5FZGl0b3IoeHNkRmlsZVN0b3JlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRNdWx0aXBsaWNpdHlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvU2V0TXVsdGlwbGljaXR5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMzk5NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRNdWx0aXBsaWNpdHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldE11bHRpcGxpY2l0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2V0TXVsdGlwbGljaXR5QWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVFVSVJFRF9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldE11bHRpcGxpY2l0eS5SRVFVSVJFRF9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgWkVST19PUl9PTkVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHkuWkVST19PUl9PTkVfSUQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFpFUk9fT1JfTU9SRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldE11bHRpcGxpY2l0eS5aRVJPX09SX01PUkVfSUQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ORV9PUl9NT1JFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5Lk9ORV9PUl9NT1JFX0lEIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgU2V0TXVsdGlwbGljaXR5Q29tbWFuZCBjb21tYW5kOwotICAKLSAgcHVibGljIFNldE11bHRpcGxpY2l0eUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBJRCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQobGFiZWwpOwotICAgIHNldElkKElEKTsKLSAgICBjb21tYW5kID0gbmV3IFNldE11bHRpcGxpY2l0eUNvbW1hbmQobGFiZWwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNYXhPY2N1cnMoaW50IGkpCi0gIHsKLSAgICBjb21tYW5kLnNldE1heE9jY3VycyhpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1pbk9jY3VycyhpbnQgaSkKLSAgewotICAgIGNvbW1hbmQuc2V0TWluT2NjdXJzKGkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkKLSAgewotICAgIGJvb2xlYW4gc3RhdGUgPSBzdXBlci5jYWxjdWxhdGVFbmFibGVkKCk7Ci0gICAgaWYgKHN0YXRlKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gZ2V0WFNESW5wdXQoKTsKLSAgICAgIGlmICh4c2RDb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICEoKFhTREVsZW1lbnREZWNsYXJhdGlvbil4c2RDb25jcmV0ZUNvbXBvbmVudCkuaXNHbG9iYWwoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZENvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICEoKChYU0RNb2RlbEdyb3VwKXhzZENvbmNyZXRlQ29tcG9uZW50KS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRYU0RJbnB1dCgpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLSAgICByZXR1cm4geHNkQ29uY3JldGVDb21wb25lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSBnZXRYU0RJbnB1dCgpOwotICAgIGlmICh4c2RDb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbW1hbmQuc2V0WFNEQ29uY3JldGVDb21wb25lbnQoeHNkQ29uY3JldGVDb21wb25lbnQpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvU2V0VHlwZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRUeXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODNlNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRUeXBlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5TZXRUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXRUeXBlQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfTkVXX1RZUEVfSUQgPSAiU2V0VHlwZUFjdGlvbl9BZGRUeXBlIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfRVhJU1RJTkdfVFlQRV9JRCA9ICJTZXRUeXBlQWN0aW9uX0V4aXN0aW5nVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotICBTZXRUeXBlQ29tbWFuZCBjb21tYW5kOwotCi0gIHB1YmxpYyBTZXRUeXBlQWN0aW9uKFN0cmluZyBsYWJlbCwgU3RyaW5nIElELCBJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChsYWJlbCk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgT2JqZWN0IHRhcmdldCA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0KLSAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBTZXRUeXBlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9UWVBFLCBnZXRJZCgpLCAoWFNEQ29uY3JldGVDb21wb25lbnQpIHRhcmdldCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0QWRhcHRlcigoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbik7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL1hTREJhc2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvWFNEQmFzZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWRmNDNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvWFNEQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RCYXNlQWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbgotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBhZGRlZENvbXBvbmVudDsKLQotICBwdWJsaWMgWFNEQmFzZUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkKLSAgewotICAgIGlmIChnZXRXb3JrYmVuY2hQYXJ0KCkgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBvd25pbmdFZGl0b3IgPSAoSUVkaXRvclBhcnQpZ2V0V29ya2JlbmNoUGFydCgpOwotICAgICAgCi0gICAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgICAgfQotICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IG51bGw7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIHhzZFNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0aW9uKS5nZXRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsICYmIHhzZFNjaGVtYSA9PSBvd25pbmdFZGl0b3IuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb0VkaXQoT2JqZWN0IG9iaiwgSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIGlmIChvYmogaW5zdGFuY2VvZiBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQgZWRpdFBhcnQgPSAoVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydClvYmo7Ci0gICAgICBpZiAoYWRkZWRDb21wb25lbnQgPT0gKChYU0RCYXNlQWRhcHRlcillZGl0UGFydC5nZXRNb2RlbCgpKS5nZXRUYXJnZXQoKSkKLSAgICAgIHsKLSAgICAgICAgZWRpdFBhcnQuc2V0U2Nyb2xsKHRydWUpOwotICAgICAgICBlZGl0UGFydC5hZGRGZWVkYmFjaygpOwotICAgICAgICBlZGl0UGFydC5kb0VkaXROYW1lKCEocGFydCBpbnN0YW5jZW9mIENvbnRlbnRPdXRsaW5lKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJhc2VGaWVsZEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIEJhc2VGaWVsZEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEJhc2VGaWVsZEVkaXRQYXJ0KW9iajsKLSAgICAgIGVkaXRQYXJ0LmRvRWRpdE5hbWUoIShwYXJ0IGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZERvY3VtZW50YXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGREb2N1bWVudGF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDYyZWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZERvY3VtZW50YXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGREb2N1bWVudGF0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbjsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQ7Ci0gIFN0cmluZyBuZXdWYWx1ZSwgb2xkVmFsdWU7Ci0gIGJvb2xlYW4gZG9jdW1lbnRhdGlvbkV4aXN0czsKLSAgRWxlbWVudCBkb2N1bWVudGF0aW9uRWxlbWVudDsKLQotICBwdWJsaWMgQWRkRG9jdW1lbnRhdGlvbkNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24sIFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0LCBTdHJpbmcgbmV3VmFsdWUsIFN0cmluZyBvbGRWYWx1ZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZEFubm90YXRpb24gPSB4c2RBbm5vdGF0aW9uOwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICB0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0gICAgdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgZW5zdXJlU2NoZW1hRWxlbWVudCgoWFNEU2NoZW1hKWlucHV0KTsKLSAgICB9Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoaW5wdXQuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgeHNkQW5ub3RhdGlvbiA9IFhTRENvbW1vblVJVXRpbHMuZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKGlucHV0LCB0cnVlKTsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZEFubm90YXRpb24uZ2V0RWxlbWVudCgpOwotCi0gICAgICBMaXN0IGRvY3VtZW50YXRpb25MaXN0ID0geHNkQW5ub3RhdGlvbi5nZXRVc2VySW5mb3JtYXRpb24oKTsKLSAgICAgIGRvY3VtZW50YXRpb25FbGVtZW50ID0gbnVsbDsKLSAgICAgIGRvY3VtZW50YXRpb25FeGlzdHMgPSBmYWxzZTsKLSAgICAgIGlmIChkb2N1bWVudGF0aW9uTGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBkb2N1bWVudGF0aW9uRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgZG9jdW1lbnRhdGlvbkVsZW1lbnQgPSAoRWxlbWVudCkgZG9jdW1lbnRhdGlvbkxpc3QuZ2V0KDApOwotICAgICAgfQotCi0gICAgICBpZiAoZG9jdW1lbnRhdGlvbkVsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZG9jdW1lbnRhdGlvbkVsZW1lbnQgPSB4c2RBbm5vdGF0aW9uLmNyZWF0ZVVzZXJJbmZvcm1hdGlvbihudWxsKTsKLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICAgIGZvcm1hdENoaWxkKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgICAgLy8gRGVmZWN0IGluIG1vZGVsLi4uLkkgY3JlYXRlIGl0IGJ1dCB0aGUgbW9kZWwgb2JqZWN0IGRvZXNuJ3QgYXBwZWFyCi0gICAgICAgIC8vIHRvIGJlIHVwZGF0ZWQKLSAgICAgICAgeHNkQW5ub3RhdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgIHhzZEFubm90YXRpb24uc2V0RWxlbWVudChlbGVtZW50KTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRvY3VtZW50YXRpb25FbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRvY3VtZW50YXRpb25FbGVtZW50IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBJRE9NRWxlbWVudCBkb21FbGVtZW50ID0gKElET01FbGVtZW50KSBkb2N1bWVudGF0aW9uRWxlbWVudDsKLQotICAgICAgICAgIE5vZGUgZmlyc3RDaGlsZCA9IGRvY3VtZW50YXRpb25FbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICBOb2RlIGxhc3RDaGlsZCA9IGRvY3VtZW50YXRpb25FbGVtZW50LmdldExhc3RDaGlsZCgpOwotICAgICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgICAgaW50IGVuZCA9IDA7Ci0KLSAgICAgICAgICAvLyBJRE9NTW9kZWwgbW9kZWwgPSBkb21FbGVtZW50LmdldE1vZGVsKCk7Ci0gICAgICAgICAgLy8gSURPTURvY3VtZW50IGRvYyA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgSURPTU5vZGUgZmlyc3QgPSBudWxsOwotICAgICAgICAgIGlmIChmaXJzdENoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgZmlyc3QgPSAoSURPTU5vZGUpIGZpcnN0Q2hpbGQ7Ci0gICAgICAgICAgICBzdGFydCA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChsYXN0Q2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJRE9NTm9kZSBsYXN0ID0gKElET01Ob2RlKSBsYXN0Q2hpbGQ7Ci0gICAgICAgICAgICBlbmQgPSBsYXN0LmdldEVuZE9mZnNldCgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChkb21FbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgb2xkVmFsdWUgPSBkb21FbGVtZW50LmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0gICAgICAgICAgICBkb21FbGVtZW50LmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQoZG9jdW1lbnRhdGlvbkVsZW1lbnQsIHN0YXJ0LCBlbmQgLSBzdGFydCwgbmV3VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgb2xkVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gZG9jdW1lbnRhdGlvbkVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKG5ld1ZhbHVlKTsKLSAgICAgICAgICBkb2N1bWVudGF0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZE5vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFbnVtZXJhdGlvbnNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFbnVtZXJhdGlvbnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YzJhNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRW51bWVyYXRpb25zQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFbnVtZXJhdGlvbnNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZTsKLSAgU3RyaW5nIHZhbHVlOwotICAKLSAgcHVibGljIEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMuc2ltcGxlVHlwZSA9IHNpbXBsZVR5cGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtZXJhdGlvbkZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RFbnVtZXJhdGlvbkZhY2V0KCk7Ci0gICAgICBlbnVtZXJhdGlvbkZhY2V0LnNldExleGljYWxWYWx1ZSh2YWx1ZSk7Ci0gICAgICBzaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQoZW51bWVyYXRpb25GYWNldCk7Ci0gICAgICBmb3JtYXRDaGlsZChzaW1wbGVUeXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDdmNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgRWxlbWVudCBpbnB1dCwgZWxlbWVudFRvQWRkOwotICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBleHRlbnNpb25TY2hlbWFTcGVjOwotCi0gIHB1YmxpYyBBZGRFeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBFbGVtZW50IGlucHV0LCBFbGVtZW50IGVsZW1lbnRUb0FkZCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgdGhpcy5lbGVtZW50VG9BZGQgPSBlbGVtZW50VG9BZGQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhpbnB1dCk7Ci0gICAgICBhZGRFbGVtZW50KCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgICAvLyBUT0RPCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFQcm9wZXJ0aWVzKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGFwcEluZm9TY2hlbWFTcGVjKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25TY2hlbWFTcGVjID0gYXBwSW5mb1NjaGVtYVNwZWM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkRWxlbWVudCgpCi0gIHsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBpbnB1dC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnRUb0FkZC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKGV4dGVuc2lvblNjaGVtYVNwZWMuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gaW5wdXQuZ2V0UHJlZml4KCk7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldFByZWZpeChwcmVmaXgpOwotICAgICAgICBTdHJpbmcgeG1sbnMgPSAocHJlZml4ID09IG51bGwgfHwgcHJlZml4LmVxdWFscygiIikpID8gInhtbG5zIiA6ICJ4bWxuczoiICsgcHJlZml4OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICBBdHRyIG5zVVJJQXR0cmlidXRlID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZSh4bWxucyk7Ci0gICAgICAgIG5zVVJJQXR0cmlidXRlLnNldFZhbHVlKGV4dGVuc2lvblNjaGVtYVNwZWMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKG5zVVJJQXR0cmlidXRlKTsKLSAgICAgICAgaW5wdXQuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0KLSAgICAgIH0KLQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25BdHRyaWJ1dGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25BdHRyaWJ1dGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjYxNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uQXR0cmlidXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VJbmZvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFeHRlbnNpb25BdHRyaWJ1dGVDb21tYW5kIGV4dGVuZHMgQWRkRXh0ZW5zaW9uQ29tbWFuZAotewotICBwcml2YXRlIHN0YXRpYyBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBtYW5hZ2VyID0gbmV3IERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCk7Ci0gIHByaXZhdGUgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlOwotICBwcml2YXRlIGJvb2xlYW4gYXBwSW5mb0F0dHJpYnV0ZUFkZGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZVFOYW1lOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VQcmVmaXg7Ci0KLSAgcHVibGljIEFkZEV4dGVuc2lvbkF0dHJpYnV0ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgICAgbmFtZXNwYWNlUHJlZml4ID0gaGFuZGxlTmFtZXNwYWNlUHJlZmljZXMoKTsKLQotICAgICAgYXR0cmlidXRlUU5hbWUgPSBuYW1lc3BhY2VQcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgdmFsdWUgPSBjb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVRTmFtZSk7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYXBwSW5mb0F0dHJpYnV0ZUFkZGVkID0gdHJ1ZTsKLSAgICAgICAgY29tcG9uZW50LmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlUU5hbWUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBzdXBlci51bmRvKCk7Ci0gICAgaWYgKGFwcEluZm9BdHRyaWJ1dGVBZGRlZCl7Ci0gICAgICBjb21wb25lbnQuZ2V0RWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVRTmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIENyZWF0ZSBhIG5hbWVzcGFjZSBwcmVmaXggaWYgbmVlZGVkLCBvdGhlciB3aXNlIHJldHJpZXZlIAotICAgKiBhIHByZWRlZmluZWQgbmFtZXNwYWNlIHByZWZpeAotICAgKiBAcmV0dXJuICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlTmFtZXNwYWNlUHJlZmljZXMoKQotICB7Ci0gICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gY29tcG9uZW50LmdldFNjaGVtYSgpLmdldEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAKLSAgICAvLyBJZiB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBhdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHMKLSAgICBMaXN0IG5hbWVzcGFjZVByZWZpY2VzID0gbWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdChzY2hlbWFFbGVtZW50KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZVByZWZpY2VzLnNpemUoKTsgaSsrKXsKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VQcmVmaWNlcy5nZXQoaSk7Ci0gICAgICBpZiAoIGluZm8udXJpLmVxdWFscyhhdHRyaWJ1dGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgIHByZWZpeCA9IGluZm8ucHJlZml4OwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBDcmVhdGUgdW5xdWllIG5hbWVzcGFjZSBwcmVmaXgKLSAgICBpZiAoIHByZWZpeCA9PSBudWxsKXsKLSAgICAgIHByZWZpeCA9IGNyZWF0ZVVuaXF1ZVByZWZpeChjb21wb25lbnQpOwotICAgIH0KLQotICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKGF0dHJpYnV0ZS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgcHJlZml4LCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBMaXN0IGluZm9MaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKLSAgICBpbmZvTGlzdC5hZGQoaW5mbyk7Ci0gICAgbWFuYWdlci5hZGROYW1lc3BhY2VJbmZvKHNjaGVtYUVsZW1lbnQsIGluZm9MaXN0LCBmYWxzZSk7Ci0gICAgcmV0dXJuIHByZWZpeDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVVbmlxdWVQcmVmaXgoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9ICJwIjsgLy8kTk9OLU5MUy0xJAotICAgIE1hcCBwcmVmTWFwcGVyID0gY29tcG9uZW50LmdldFNjaGVtYSgpLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICBpZiAoIHByZWZNYXBwZXIuZ2V0KHByZWZpeCkgIT0gbnVsbCl7Ci0gICAgICBpbnQgaSA9IDE7Ci0gICAgICB3aGlsZSAoIHByZWZNYXBwZXIuZ2V0KHByZWZpeCArIGkpICE9IG51bGwpCi0gICAgICAgIGkrKzsKLSAgICAgIHByZWZpeCArPSBpOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3MjEwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFeHRlbnNpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGV4dGVuc2lvbnNTY2hlbWFTcGVjOwotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50OwotCi0gIHByb3RlY3RlZCBBZGRFeHRlbnNpb25Db21tYW5kKFN0cmluZyBsYWJlbCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYVByb3BlcnRpZXMoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgYXBwSW5mb1NjaGVtYVNwZWMpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvbnNTY2hlbWFTcGVjID0gYXBwSW5mb1NjaGVtYVNwZWM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoKFhTRFNjaGVtYSljb21wb25lbnQpOwotICAgIH0KLSAgICAKLSAgICBzdXBlci5leGVjdXRlKCk7Ci0gIH0KLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MWEyMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQWRkRXh0ZW5zaW9uQ29tbWFuZAotewotICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudDsKLSAgRWxlbWVudCBhcHBJbmZvOwotICBFbGVtZW50IG5ld0VsZW1lbnQ7Ci0KLSAgcHVibGljIEFkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQsIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMuY29tcG9uZW50ID0gaW5wdXQ7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgICBhZGRBbm5vdGF0aW9uU2V0KGNvbXBvbmVudC5nZXRTY2hlbWEoKSwgZXh0ZW5zaW9uc1NjaGVtYVNwZWMpOwotICAgICAgZm9ybWF0Q2hpbGQoY29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24gPSBYU0RDb21tb25VSVV0aWxzLmdldElucHV0WFNEQW5ub3RhdGlvbihjb21wb25lbnQsIGZhbHNlKTsKLSAgICB4c2RBbm5vdGF0aW9uLmdldEVsZW1lbnQoKS5yZW1vdmVDaGlsZChhcHBJbmZvKTsKLSAgICBMaXN0IGFwcEluZm9zID0geHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCk7Ci0gICAgYXBwSW5mb3MucmVtb3ZlKGFwcEluZm8pOwotICAgIHhzZEFubm90YXRpb24udXBkYXRlRWxlbWVudCgpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFQcm9wZXJ0aWVzKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvbnNTY2hlbWFTcGVjID0gc3BlYzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEFubm90YXRpb25TZXQoWFNEU2NoZW1hIHhzZFNjaGVtYSwgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYykKLSAgewotICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IFhTRENvbW1vblVJVXRpbHMuZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKGNvbXBvbmVudCwgdHJ1ZSk7Ci0gICAgYWRkQW5ub3RhdGlvblNldChzcGVjLCB4c2RBbm5vdGF0aW9uKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRBbm5vdGF0aW9uU2V0KFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMsIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbikKLSAgeyAgICAgCi0gICAgWFNEU2NoZW1hIHNjaGVtYT0geHNkQW5ub3RhdGlvbi5nZXRTY2hlbWEoKTsKLSAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBzY2hlbWEuZ2V0RWxlbWVudCgpOwotCi0gICAgaWYgKHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIGFwcEluZm8gPSB4c2RBbm5vdGF0aW9uLmNyZWF0ZUFwcGxpY2F0aW9uSW5mb3JtYXRpb24obnVsbCk7Ci0gICAgICB4c2RBbm5vdGF0aW9uLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZChhcHBJbmZvKTsKLSAgICAgIExpc3QgYXBwSW5mb3MgPSB4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKTsKLSAgICAgIGFwcEluZm9zLmFkZChhcHBJbmZvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHVzZSB0aGUgZmlyc3QgYXBwSW5mbwotICAgICAgYXBwSW5mbyA9IChFbGVtZW50KXhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpLmdldCgwKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgcHJlZml4ID0gYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25JZlJlcXVpcmVkKHNjaGVtYUVsZW1lbnQsICJwIiwgc3BlYy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLSAgICBpZiAoYXBwSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIERvY3VtZW50IGRvYyA9IGFwcEluZm8uZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAKLSAgICAgIG5ld0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCksIGVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIG5ld0VsZW1lbnQuc2V0UHJlZml4KHByZWZpeCk7ICAgCi0gICAgICBhcHBJbmZvLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwotCi0gICAgICB4c2RBbm5vdGF0aW9uLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVVuaXF1ZVByZWZpeChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gInAiOyAvLyROT04tTkxTLTEkCi0gICAgTWFwIHByZWZNYXBwZXIgPSBjb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgIGlmICggcHJlZk1hcHBlci5nZXQocHJlZml4KSAhPSBudWxsKXsKLSAgICAgIGludCBpID0gMTsKLSAgICAgIHdoaWxlICggcHJlZk1hcHBlci5nZXQocHJlZml4ICsgaSkgIT0gbnVsbCkKLSAgICAgICAgaSsrOwotICAgICAgcHJlZml4ICs9IGk7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0gIAotICAKLSAgLy8gVE9ETy4uLiBjb21tb24gdGhpcyB1cCB3aXRoIHdzZGwudWkKLSAgcHJpdmF0ZSBTdHJpbmcgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25JZlJlcXVpcmVkKEVsZW1lbnQgc2NoZW1hRWxlbWVudCwgU3RyaW5nIHByZWZpeEhpbnQsIFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsgICAgICAKLSAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShzY2hlbWFFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChzY2hlbWFFbGVtZW50KTsKLSAgICBwcmVmaXggPSBuYW1lc3BhY2VUYWJsZS5nZXRQcmVmaXhGb3JVUkkobmFtZXNwYWNlKTsKLSAgICBpZiAocHJlZml4ID09IG51bGwpCi0gICAgeyAKLSAgICAgIFN0cmluZyBiYXNlUHJlZml4ID0gcHJlZml4SGludDsKLSAgICAgIHByZWZpeCA9IGJhc2VQcmVmaXg7Ci0gICAgICBTdHJpbmcgeG1sbnNDb2xvbiA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHhtbG5zQ29sb24gKyBwcmVmaXg7Ci0gICAgICBpbnQgY291bnQgPSAwOwotICAgICAgd2hpbGUgKHNjaGVtYUVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIHByZWZpeCA9IGJhc2VQcmVmaXggKyBjb3VudDsKLSAgICAgICAgYXR0cmlidXRlTmFtZSA9IHhtbG5zQ29sb24gKyBwcmVmaXg7Ci0gICAgICB9ICAgICAgCi0gICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBuYW1lc3BhY2UpOyAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWNiYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQ7Ci0KLSAgcHVibGljIEFkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICAgIHRoaXMuaW5wdXQgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb247IAotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci0gICAgdGhpcy5pbnB1dCA9IHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhpbnB1dC5nZXRFbGVtZW50KCkpOwotCi0gICAgICBYU0RXaWxkY2FyZCBhbnlBdHRyaWJ1dGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RXaWxkY2FyZCgpOwotICAgICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uc2V0QXR0cmlidXRlV2lsZGNhcmRDb250ZW50KGFueUF0dHJpYnV0ZSk7Ci0gICAgICAgIGZvcm1hdENoaWxkKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5zZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQoYW55QXR0cmlidXRlKTsKLSAgICAgICAgZm9ybWF0Q2hpbGQoeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gYW55QXR0cmlidXRlOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREFueUVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBbnlFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjg4YTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREFueUVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEQW55RWxlbWVudENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RNb2RlbEdyb3VwIHBhcmVudDsKLSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlOwotICBib29sZWFuIGRvQ3JlYXRlTW9kZWxHcm91cEZvckNvbXBsZXhUeXBlID0gZmFsc2U7Ci0KLSAgcHVibGljIEFkZFhTREFueUVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNETW9kZWxHcm91cCBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbXBsZXhUeXBlKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSkKLSAgewotICAgIHRoaXMuY29tcGxleFR5cGUgPSBjb21wbGV4VHlwZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RG9DcmVhdGVNb2RlbEdyb3VwRm9yQ29tcGxleFR5cGUoYm9vbGVhbiBkb0NyZWF0ZSkKLSAgewotICAgIHRoaXMuZG9DcmVhdGVNb2RlbEdyb3VwRm9yQ29tcGxleFR5cGUgPSBkb0NyZWF0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU1vZGVsR3JvdXAoKQotICB7Ci0gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBmYWN0b3J5LmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgcGFyZW50ID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0gICAgcGFyZW50LnNldENvbXBvc2l0b3IoWFNEQ29tcG9zaXRvci5TRVFVRU5DRV9MSVRFUkFMKTsKLSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KHBhcmVudCk7Ci0gICAgY29tcGxleFR5cGUuc2V0Q29udGVudChwYXJ0aWNsZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChkb0NyZWF0ZU1vZGVsR3JvdXBGb3JDb21wbGV4VHlwZSkKLSAgICAgIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChjb21wbGV4VHlwZSk7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGNyZWF0ZU1vZGVsR3JvdXAoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBYU0RXaWxkY2FyZCB3aWxkQ2FyZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFdpbGRjYXJkKCk7Ci0gICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgICBwYXJ0aWNsZS5zZXRDb250ZW50KHdpbGRDYXJkKTsKLSAgICAgIHBhcmVudC5nZXRDb250ZW50cygpLmFkZChwYXJ0aWNsZSk7Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gd2lsZENhcmQ7Ci0gICAgICBmb3JtYXRDaGlsZChwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkZjdlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXA7Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZVRvQWRkOwotICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLiAgSWYgbm8gaXRlbSBpcyBzZWxlY3RlZCwgaW5kZXggd2lsbCBiZSBsZXNzIHRoYW4gMAotICBwcml2YXRlIGludCBpbmRleCA9IC0xOwotICAvLyBEZXRlcm1pbmVzIHdoZXJlIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGluc2VydGVkIGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYXR0cmlidXRlLiAgSWYgbm8KLSAgLy8gYXR0cmlidXRlIGlzIHNlbGVjdGVkLCB1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIGFwcGVuZGluZyB0aGUgYXR0cmlidXRlIHRvIHRoZSBlbmQKLSAgcHJpdmF0ZSBTdHJpbmcgYWRkQXR0cmlidXRlTG9jYXRpb247ICAKLSAgCi0gIHB1YmxpYyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50LCBTdHJpbmcgYWRkQXR0cmlidXRlTG9jYXRpb24sIGludCBpbmRleCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHRoaXMueHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotICAgIHRoaXMuYWRkQXR0cmlidXRlTG9jYXRpb24gPSBhZGRBdHRyaWJ1dGVMb2NhdGlvbjsKLSAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBpbnQgZ2V0SW5zZXJ0aW9uSW5kZXgoKQotICB7Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChhZGRBdHRyaWJ1dGVMb2NhdGlvbi5lcXVhbHMob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5CRUZPUkVfU0VMRUNURURfSUQpKQotICAgIHsKLSAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYWRkQXR0cmlidXRlTG9jYXRpb24uZXF1YWxzKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uQUZURVJfU0VMRUNURURfSUQpKQotICAgIHsKLSAgICAgIGluZGV4Kys7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKCFpc1JlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZS5zZXROYW1lKGdldE5ld05hbWUobmFtZVRvQWRkID09IG51bGwgPyAiTmV3QXR0cmlidXRlIiA6IG5hbWVUb0FkZCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYXR0cmlidXRlLnNldFR5cGVEZWZpbml0aW9uKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZS5zZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKHNldEdsb2JhbEF0dHJpYnV0ZVJlZmVyZW5jZSh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkpKTsKLSAgICAgICAgfQotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0cmlidXRlVXNlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlVXNlKCk7Ci0gICAgICAgIGF0dHJpYnV0ZVVzZS5zZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyaWJ1dGUpOwotICAgICAgICBhdHRyaWJ1dGVVc2Uuc2V0Q29udGVudChhdHRyaWJ1dGUpOwotCi0gICAgICAgIGlmICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW5kZXggPSBnZXRJbnNlcnRpb25JbmRleCgpOwotICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuc2l6ZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmFkZChpbmRleCwgYXR0cmlidXRlVXNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVDb250ZW50cygpLmFkZChhdHRyaWJ1dGVVc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3JtYXRDaGlsZCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKSBwYXJlbnQ7Ci0gICAgICAgICAgYXR0cmlidXRlID0gY3JlYXRlR2xvYmFsWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oeHNkU2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzUmVmZXJlbmNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXRUeXBlRGVmaW5pdGlvbihwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJzdHJpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9ICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnQpLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0QXR0cmlidXRlVXNlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSB1c2UgPSAoWFNEQXR0cmlidXRlVXNlKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgbGlzdC5hZGQodXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0cmlidXRlLnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgiTmV3QXR0cmlidXRlIiwgbGlzdCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGUuc2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbihzZXRHbG9iYWxBdHRyaWJ1dGVSZWZlcmVuY2UocGFyZW50LmdldFNjaGVtYSgpKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZVVzZSgpOwotICAgICAgICAgIGF0dHJpYnV0ZVVzZS5zZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyaWJ1dGUpOwotICAgICAgICAgIGF0dHJpYnV0ZVVzZS5zZXRDb250ZW50KGF0dHJpYnV0ZSk7Ci0KLSAgICAgICAgICBpbmRleCA9IGdldEluc2VydGlvbkluZGV4KCk7Ci0gICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCAoKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRDb250ZW50cygpLnNpemUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRDb250ZW50cygpLmFkZChpbmRleCwgYXR0cmlidXRlVXNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnQpLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGVudHMoKS5hZGQoYXR0cmlidXRlVXNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9ybWF0Q2hpbGQocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gYXR0cmlidXRlOwotICB9Ci0KLSAgQXJyYXlMaXN0IG5hbWVzOwotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVUb0FkZChTdHJpbmcgbmFtZSkKLSAgewotICAgIG5hbWVUb0FkZCA9IG5hbWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWUoU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgQXJyYXlMaXN0IHVzZWRBdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0QWxsQXR0cmlidXRlcyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24pKTsKLSAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0SW5oZXJpdGVkQXR0cmlidXRlcyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24pKTsKLSAgICByZXR1cm4gWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZShkZXNjcmlwdGlvbiwgdXNlZEF0dHJpYnV0ZU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2UoYm9vbGVhbiBpc1JlZmVyZW5jZSkKLSAgewotICAgIHRoaXMuaXNSZWZlcmVuY2UgPSBpc1JlZmVyZW5jZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGNyZWF0ZUdsb2JhbFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBlbnN1cmVTY2hlbWFFbGVtZW50KHhzZFNjaGVtYSk7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICBhdHRyaWJ1dGUuc2V0VHlwZURlZmluaXRpb24oeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIikpOyAvLyROT04tTkxTLTEkCi0gICAgYXR0cmlidXRlLnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZShuYW1lVG9BZGQgPT0gbnVsbCA/ICJOZXdBdHRyaWJ1dGUiIDogbmFtZVRvQWRkLCB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkpKTsgLy8kTk9OLU5MUy0xJAotICAgIFRleHQgdGV4dE5vZGUgPSB4c2RTY2hlbWEuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChhdHRyaWJ1dGUpOwotICAgIHJldHVybiBhdHRyaWJ1dGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gc2V0R2xvYmFsQXR0cmlidXRlUmVmZXJlbmNlKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gcmVmZXJlbmNlZEF0dHJpYnV0ZSA9IG51bGw7Ci0gICAgYm9vbGVhbiBpc1VzZXJEZWZpbmVkID0gZmFsc2U7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgb2JqOwotICAgICAgICBpZiAoIVhTRENvbnN0YW50cy5TQ0hFTUFfSU5TVEFOQ0VfVVJJXzIwMDEuZXF1YWxzKGF0dHIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0gICAgICAgICAgaXNVc2VyRGVmaW5lZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFpc1VzZXJEZWZpbmVkKQotICAgIHsKLSAgICAgIHJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBjcmVhdGVHbG9iYWxYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbih4c2RTY2hlbWEpOwotICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChyZWZlcmVuY2VkQXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVmZXJlbmNlZEF0dHJpYnV0ZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTU3NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIHB1YmxpYyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHhzZFNjaGVtYSA9PSBudWxsKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgYXR0cmlidXRlR3JvdXAuc2V0TmFtZShnZXROZXdOYW1lKCJBdHRyaWJ1dGVHcm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIExpc3QgbGlzdCA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRTY2hlbWEoKS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCk7Ci0gICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyaWJ1dGVHcm91cC5zZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBsaXN0LmdldCgwKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYXR0cmlidXRlR3JvdXAuc2V0TmFtZShudWxsKTsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXAyID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgYXR0cmlidXRlR3JvdXAyLnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgiTmV3QXR0cmlidXRlR3JvdXAiLCB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkuZ2V0Q29udGVudHMoKS5hZGQoYXR0cmlidXRlR3JvdXAyKTsKLSAgICAgICAgICBhdHRyaWJ1dGVHcm91cC5zZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyaWJ1dGVHcm91cDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVDb250ZW50cygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQoYXR0cmlidXRlR3JvdXApOwotICAgICAgICB9Ci0gICAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBhdHRyaWJ1dGVHcm91cDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZW5zdXJlU2NoZW1hRWxlbWVudCh4c2RTY2hlbWEpOwotICAgICAgICAvLyBwdXQgdGhpcyBhZnRlciwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIERPTSBub2RlIHlldAotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgYXR0cmlidXRlR3JvdXAuc2V0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKCJOZXdBdHRyaWJ1dGVHcm91cCIsIHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb25zKCkpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBUZXh0IHRleHROb2RlID0geHNkU2NoZW1hLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChhdHRyaWJ1dGVHcm91cCk7Ci0gICAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBhdHRyaWJ1dGVHcm91cDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIEFycmF5TGlzdCBuYW1lczsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWUoU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgU3RyaW5nIGNhbmRpZGF0ZU5hbWUgPSAiTmV3IiArIGRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICAgIG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGludCBpID0gMTsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudDsKLSAgICAgIHdhbGtVcEluaGVyaXRhbmNlKGN0KTsKLQotICAgICAgYm9vbGVhbiByZWFkeSA9IGZhbHNlOwotICAgICAgd2hpbGUgKCFyZWFkeSkKLSAgICAgIHsKLSAgICAgICAgcmVhZHkgPSB0cnVlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICBpZiAoY2FuZGlkYXRlTmFtZS5lcXVhbHMoYXR0ck5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlYWR5ID0gZmFsc2U7Ci0gICAgICAgICAgICBjYW5kaWRhdGVOYW1lID0gIk5ldyIgKyBkZXNjcmlwdGlvbiArIFN0cmluZy52YWx1ZU9mKGkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjYW5kaWRhdGVOYW1lOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdhbGtVcEluaGVyaXRhbmNlKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCkKLSAgewotICAgIHVwZGF0ZU5hbWVzKGN0KTsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gY3QuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKGN0ICE9IGN0LmdldFJvb3RUeXBlKCkpCi0gICAgewotICAgICAgaWYgKHR5cGVEZWYgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdDIgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0eXBlRGVmOwotICAgICAgICB3YWxrVXBJbmhlcml0YW5jZShjdDIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVOYW1lcyhYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyID0gY3QuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgdXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgb2JqOwotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gdXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoYXR0ck5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzLmFkZChhdHRyTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNjM2Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgcHJvdGVjdGVkIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVkQ29tcGxleFR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVUb0FkZDsKLSAgCi0gIHB1YmxpYyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lVG9BZGQoU3RyaW5nIG5hbWVUb0FkZCkKLSAgewotICAgIHRoaXMubmFtZVRvQWRkID0gbmFtZVRvQWRkOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNleGVjdXRlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IGZhY3RvcnkuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gY29tcGxleFR5cGU7Ci0gICAgICBTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUobmFtZVRvQWRkID09IG51bGwgPyAiTmV3Q29tcGxleFR5cGUiIDogbmFtZVRvQWRkLCBwYXJlbnQuZ2V0U2NoZW1hKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICBjb21wbGV4VHlwZS5zZXROYW1lKG5ld05hbWUpOwotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSkgcGFyZW50OwotICAgICAgICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoeHNkU2NoZW1hKTsKLSAgICAgICAgICBUZXh0IHRleHROb2RlID0geHNkU2NoZW1hLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoY29tcGxleFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oY29tcGxleFR5cGUpOwotICAgICAgICBmb3JtYXRDaGlsZChwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICAgIGNyZWF0ZWRDb21wbGV4VHlwZSA9IGNvbXBsZXhUeXBlOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdOYW1lKFN0cmluZyBkZXNjcmlwdGlvbiwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIFN0cmluZyBjYW5kaWRhdGVOYW1lID0gZGVzY3JpcHRpb247IC8vJE5PTi1OTFMtMSQKLSAgICBpbnQgaSA9IDE7Ci0KLSAgICBMaXN0IGxpc3QgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgTGlzdCBsaXN0T2ZOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpdGVyLm5leHQoKTsKLSAgICAgIFN0cmluZyBuYW1lID0gdHlwZURlZi5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmICh0eXBlRGVmLmdldFRhcmdldE5hbWVzcGFjZSgpID09IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkKLSAgICAgICAgbGlzdE9mTmFtZXMuYWRkKG5hbWUpOwotICAgIH0KLQotICAgIGJvb2xlYW4gZmxhZyA9IHRydWU7Ci0gICAgd2hpbGUgKGZsYWcpCi0gICAgewotICAgICAgaWYgKCFsaXN0T2ZOYW1lcy5jb250YWlucyhjYW5kaWRhdGVOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgZmxhZyA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhbmRpZGF0ZU5hbWUgPSBkZXNjcmlwdGlvbiArIFN0cmluZy52YWx1ZU9mKGkpOyAvLyROT04tTkxTLTEkCi0gICAgICBpKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNhbmRpZGF0ZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGdldENyZWF0ZWRDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlZENvbXBsZXhUeXBlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RFbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNERWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1ZWY4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hQnVpbGRpbmdUb29sczsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgQWRkWFNERWxlbWVudENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLSAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwOwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBib29sZWFuIGlzUmVmZXJlbmNlOwotICBwcml2YXRlIFN0cmluZyBuYW1lVG9BZGQ7Ci0gIC8vIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0uICBJZiBubyBpdGVtIGlzIHNlbGVjdGVkLCBpbmRleCB3aWxsIGJlIGxlc3MgdGhhbiAwCi0gIHByaXZhdGUgaW50IGluZGV4ID0gLTE7ICAKLSAgLy8gRGV0ZXJtaW5lcyB3aGVyZSB0aGUgZWxlbWVudCBzaG91bGQgYmUgaW5zZXJ0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50LiAgSWYgbm8KLSAgLy8gZWxlbWVudCBpcyBzZWxlY3RlZCwgdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBhcHBlbmRpbmcgdGhlIGVsZW1lbnQgdG8gdGhlIGVuZAotICBwcml2YXRlIFN0cmluZyBhZGRFbGVtZW50TG9jYXRpb247IAotICAKLSAgcHVibGljIEFkZFhTREVsZW1lbnRDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICAgIHhzZE1vZGVsR3JvdXAgPSBnZXRNb2RlbEdyb3VwKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID0geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0gICAgeHNkTW9kZWxHcm91cCA9IGdldE1vZGVsR3JvdXAoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAsIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RNb2RlbEdyb3VwID0geHNkTW9kZWxHcm91cDsKLSAgICB0aGlzLnhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZE1vZGVsR3JvdXAgPSB4c2RNb2RlbEdyb3VwOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAsIFN0cmluZyBJRCwgaW50IGluZGV4KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkTW9kZWxHcm91cCA9IHhzZE1vZGVsR3JvdXA7Ci0gICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgIHRoaXMuYWRkRWxlbWVudExvY2F0aW9uID0gSUQ7Ci0gIH0KLQotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlKGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICB0aGlzLmlzUmVmZXJlbmNlID0gaXNSZWZlcmVuY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVUb0FkZChTdHJpbmcgbmFtZSkKLSAgewotICAgIG5hbWVUb0FkZCA9IG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFkZEVsZW1lbnRMb2NhdGlvbihTdHJpbmcgTG9jYXRpb25UeXBlKQotICB7Ci0gICAgYWRkRWxlbWVudExvY2F0aW9uID0gTG9jYXRpb25UeXBlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgaW50IGdldEluc2VydGlvbkluZGV4KCkKLSAgewotICAgIGlmIChpbmRleCA8IDApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoYWRkRWxlbWVudExvY2F0aW9uLmVxdWFscyhvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVsZW1lbnRBY3Rpb24uQkVGT1JFX1NFTEVDVEVEX0lEKSkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFkZEVsZW1lbnRMb2NhdGlvbi5lcXVhbHMob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uLkFGVEVSX1NFTEVDVEVEX0lEKSkKLSAgICB7Ci0gICAgICBpbmRleCsrOwotICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICAKLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNleGVjdXRlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSBjcmVhdGVHbG9iYWxYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoZWxlbWVudCk7Ci0gICAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBlbGVtZW50OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoeHNkTW9kZWxHcm91cERlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKHhzZE1vZGVsR3JvdXAgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gZmFjdG9yeS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgICAgICAgIHhzZE1vZGVsR3JvdXAgPSBmYWN0b3J5LmNyZWF0ZVhTRE1vZGVsR3JvdXAoKTsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLnNldENvbXBvc2l0b3IoWFNEQ29tcG9zaXRvci5TRVFVRU5DRV9MSVRFUkFMKTsKLSAgICAgICAgICBwYXJ0aWNsZS5zZXRDb250ZW50KHhzZE1vZGVsR3JvdXApOwotICAgICAgICAgIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLnNldE1vZGVsR3JvdXAoeHNkTW9kZWxHcm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgeHNkU2NoZW1hID0geHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmICghaXNSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbkZvck1vZGVsR3JvdXBEZWZpbml0aW9ucygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZVhTREVsZW1lbnRSZWZlcmVuY2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9ybWF0Q2hpbGQoeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZE1vZGVsR3JvdXAgIT0gbnVsbCAmJiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID09IG51bGwgfHwgeHNkTW9kZWxHcm91cERlZmluaXRpb24gPT0gbnVsbCkgKQotICAgICAgewotICAgICAgICB4c2RTY2hlbWEgPSB4c2RNb2RlbEdyb3VwLmdldFNjaGVtYSgpOwotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKCFpc1JlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAJaW5kZXggPSBnZXRJbnNlcnRpb25JbmRleCgpOwotICAgICAgICAJaWYoaW5kZXggPj0gMCAmJiBpbmRleCA8IHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5zaXplKCkpCi0gICAgICAgIAl7ICAgICAgICAJCQotICAgICAgICAJCXhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgICAgICAJfQotICAgICAgICAJZWxzZQotICAgICAgICAJewotICAgICAgICAJCXhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoY3JlYXRlWFNERWxlbWVudFJlZmVyZW5jZSgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3JtYXRDaGlsZCh4c2RNb2RlbEdyb3VwLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHhzZFNjaGVtYSA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRTY2hlbWEoKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmICh4c2RNb2RlbEdyb3VwID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGZhY3RvcnkuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCk7Ci0gICAgICAgICAgcGFydGljbGUuc2V0Q29udGVudCh4c2RNb2RlbEdyb3VwKTsKLSAgICAgICAgICB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uc2V0Q29udGVudChwYXJ0aWNsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc1JlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAgIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uRm9yQ29tcGxleFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChjcmVhdGVYU0RFbGVtZW50UmVmZXJlbmNlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvcm1hdENoaWxkKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEUGFydGljbGUgY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUgPSB4c2RNb2RlbEdyb3VwLmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0geHNkTW9kZWxHcm91cC5nZXRDb250YWluZXIoKTsKLSAgICBBcnJheUxpc3QgdXNlZEF0dHJpYnV0ZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHVzZWRBdHRyaWJ1dGVOYW1lcy5hZGRBbGwoWFNEQ29tbW9uVUlVdGlscy5nZXRDaGlsZEVsZW1lbnRzKHhzZE1vZGVsR3JvdXApKTsgICAgCi0gICAgd2hpbGUgKGNvbXAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0QWxsQXR0cmlidXRlcygoWFNETW9kZWxHcm91cERlZmluaXRpb24pY29tcCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHVzZWRBdHRyaWJ1dGVOYW1lcy5hZGRBbGwoWFNEQ29tbW9uVUlVdGlscy5nZXRBbGxBdHRyaWJ1dGVzKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pY29tcCkpOwotICAgICAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0SW5oZXJpdGVkQXR0cmlidXRlcygoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWNvbXApKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjb21wID0gY29tcC5nZXRDb250YWluZXIoKTsKLSAgICB9Ci0gICAgZWxlbWVudC5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoCi0gICAgCQluYW1lVG9BZGQgPT0gbnVsbCA/ICJOZXdFbGVtZW50IiA6IG5hbWVUb0FkZCAsIHVzZWRBdHRyaWJ1dGVOYW1lcykpOyAvLyROT04tTkxTLTEkCi0gICAgZWxlbWVudC5zZXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLQotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KGVsZW1lbnQpOwotICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBlbGVtZW50OwotICAgIHJldHVybiBwYXJ0aWNsZTsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RQYXJ0aWNsZSBjcmVhdGVYU0RFbGVtZW50UmVmZXJlbmNlKCkKLSAgewotICAgIExpc3QgbGlzdCA9IHhzZE1vZGVsR3JvdXAuZ2V0U2NoZW1hKCkuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZWZlcmVuY2VkRWxlbWVudCA9IG51bGw7Ci0gICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICByZWZlcmVuY2VkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pbGlzdC5nZXQoMCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWZlcmVuY2VkRWxlbWVudCA9IGNyZWF0ZUdsb2JhbFhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChyZWZlcmVuY2VkRWxlbWVudCk7Ci0gICAgfQotCi0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAKLSAgICBlbGVtZW50LnNldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKHJlZmVyZW5jZWRFbGVtZW50KTsKLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChlbGVtZW50KTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZWxlbWVudDsKLSAgICByZXR1cm4gcGFydGljbGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEUGFydGljbGUgY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uRm9yQ29tcGxleFR5cGUoKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSA9IHhzZE1vZGVsR3JvdXAuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJzdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIEFycmF5TGlzdCB1c2VkQXR0cmlidXRlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEFsbEF0dHJpYnV0ZXMoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKSk7Ci0gICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEluaGVyaXRlZEF0dHJpYnV0ZXMoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKSk7Ci0gICAgZWxlbWVudC5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoCi0gICAgCQluYW1lVG9BZGQgPT0gbnVsbCA/ICJOZXdFbGVtZW50IiA6IG5hbWVUb0FkZCAsIHVzZWRBdHRyaWJ1dGVOYW1lcykpOyAvLyROT04tTkxTLTEkCi0gICAgZWxlbWVudC5zZXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLQotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KGVsZW1lbnQpOwotICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBlbGVtZW50OwotICAgIHJldHVybiBwYXJ0aWNsZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRFBhcnRpY2xlIGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbkZvck1vZGVsR3JvdXBEZWZpbml0aW9ucygpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlID0geHNkTW9kZWxHcm91cC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgQXJyYXlMaXN0IHVzZWRBdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0QWxsQXR0cmlidXRlcyh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikpOwotICAgIGVsZW1lbnQuc2V0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKAotICAgICAgICBuYW1lVG9BZGQgPT0gbnVsbCA/ICJOZXdFbGVtZW50IiA6IG5hbWVUb0FkZCAsIHVzZWRBdHRyaWJ1dGVOYW1lcykpOyAvLyROT04tTkxTLTEkCi0gICAgZWxlbWVudC5zZXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLQotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KGVsZW1lbnQpOwotICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBlbGVtZW50OwotICAgIHJldHVybiBwYXJ0aWNsZTsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gY3JlYXRlR2xvYmFsWFNERWxlbWVudERlY2xhcmF0aW9uKCkKLSAgewotICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoeHNkU2NoZW1hKTsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlID0geHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLSAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICBlbGVtZW50LnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgKLSAgICAJCW5hbWVUb0FkZCA9PSBudWxsID8gIk5ld0VsZW1lbnQiIDogbmFtZVRvQWRkICwgeHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSkpOyAvLyROT04tTkxTLTEkCi0gICAgZWxlbWVudC5zZXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLQotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gIAotICBwdWJsaWMgWFNETW9kZWxHcm91cCBnZXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWYpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCk7Ci0gIH0KLQotICAvL1BPUlQKLSAgcHVibGljIFhTRE1vZGVsR3JvdXAgZ2V0TW9kZWxHcm91cChYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY1R5cGUpCi0gIHsKLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IG51bGw7Ci0KLSAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgeHNkQ29tcGxleFR5cGVDb250ZW50ID0gY1R5cGUuZ2V0Q29udGVudCgpOwotICAgIGlmICh4c2RDb21wbGV4VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSl4c2RDb21wbGV4VHlwZUNvbnRlbnQ7Ci0gICAgfQotICAgIAotICAgIGlmIChwYXJ0aWNsZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBPYmplY3QgcGFydGljbGVDb250ZW50ID0gcGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgIFhTRE1vZGVsR3JvdXAgZ3JvdXAgPSBudWxsOwotCi0gICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGdyb3VwID0gKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgcGFydGljbGVDb250ZW50KS5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0TW9kZWxHcm91cCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGdyb3VwID0gKFhTRE1vZGVsR3JvdXApIHBhcnRpY2xlQ29udGVudDsKLSAgICB9Ci0KLSAgICBpZiAoZ3JvdXAgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLS8vICAgIGlmIChncm91cC5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBncm91cC5lUmVzb3VyY2UoKSAhPSBjVHlwZS5lUmVzb3VyY2UoKSkKLS8vICAgIHsKLS8vICAgICAgaWYgKGNUeXBlLmdldEJhc2VUeXBlKCkgIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb250ZW50ID0gY1R5cGUuZ2V0Q29udGVudCgpOwotLy8gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgZ3JvdXAgPSAoWFNETW9kZWxHcm91cCkgKChYU0RQYXJ0aWNsZSkgY29udGVudCkuZ2V0Q29udGVudCgpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgfQotCi0gICAgcmV0dXJuIGdyb3VwOwotICB9Ci0gIAotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0QWRkZWRDb21wb25lbnQoKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNESW1wb3J0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNESW1wb3J0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTFmODcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREltcG9ydENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTREltcG9ydENvbW1hbmQgZXh0ZW5kcyBBZGRYU0RTY2hlbWFEaXJlY3RpdmVDb21tYW5kCi17Ci0gIHB1YmxpYyBBZGRYU0RJbXBvcnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgICAgLy8gQWRkIHRoaXMgYWZ0ZXIgaWYgd2UgZG9uJ3QgaGF2ZSBhIERPTSBOb2RlIHlldAotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RJbXBvcnQgeHNkSW1wb3J0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNESW1wb3J0KCk7Ci0gICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoZmluZE5leHRQb3NpdGlvblRvSW5zZXJ0KCksIHhzZEltcG9ydCk7Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0geHNkSW1wb3J0OwotICAgICAgZm9ybWF0Q2hpbGQoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREluY2x1ZGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RJbmNsdWRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjliMzA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREluY2x1ZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNESW5jbHVkZUNvbW1hbmQgZXh0ZW5kcyBBZGRYU0RTY2hlbWFEaXJlY3RpdmVDb21tYW5kCi17Ci0gIHB1YmxpYyBBZGRYU0RJbmNsdWRlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgIC8vIEFkZCB0aGlzIGFmdGVyIGlmIHdlIGRvbid0IGhhdmUgYSBET00gTm9kZSB5ZXQKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgICAgWFNESW5jbHVkZSB4c2RJbmNsdWRlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNESW5jbHVkZSgpOwotICAgICAgeHNkSW5jbHVkZS5zZXRTY2hlbWFMb2NhdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChmaW5kTmV4dFBvc2l0aW9uVG9JbnNlcnQoKSwgeHNkSW5jbHVkZSk7Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0geHNkSW5jbHVkZTsKLSAgICAgIGZvcm1hdENoaWxkKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RNb2RlbEdyb3VwQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNETW9kZWxHcm91cENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxNGIyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RNb2RlbEdyb3VwQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hQnVpbGRpbmdUb29sczsKLQotcHVibGljIGNsYXNzIEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50OwotICBYU0RDb21wb3NpdG9yIHhzZENvbXBvc2l0b3I7Ci0gIFhTRE1vZGVsR3JvdXAgbmV3TW9kZWxHcm91cDsKLQotICBwdWJsaWMgQWRkWFNETW9kZWxHcm91cENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQsIFhTRENvbXBvc2l0b3IgeHNkQ29tcG9zaXRvcikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB0aGlzLnhzZENvbXBvc2l0b3IgPSB4c2RDb21wb3NpdG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IG93bmVyID0gZ2V0T3duZXIoKTsKLSAgICAgIGlmIChvd25lciAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgICAgIG5ld01vZGVsR3JvdXAgPSBjcmVhdGVNb2RlbEdyb3VwKCk7Ci0gICAgICAgIHBhcnRpY2xlLnNldENvbnRlbnQobmV3TW9kZWxHcm91cCk7Ci0KLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ZCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIG93bmVyOwotICAgICAgICBjdGQuc2V0Q29udGVudChwYXJ0aWNsZSk7Ci0gICAgICB9Ci0gICAgICBmb3JtYXRDaGlsZChwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBzdXBlci51bmRvKCk7Ci0gICAgCi0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbCA9IChYU0RNb2RlbEdyb3VwKSBwYXJlbnQ7Ci0gICAgICBtb2RlbC5nZXRDb250ZW50cygpLnJlbW92ZShuZXdNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0T3duZXIoKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgb3duZXIgPSBudWxsOwotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJlbnQ7ICAgICAgCi0gICAgICBpZiAoZWQuZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgaWYgKGVkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGVkLnNldFR5cGVEZWZpbml0aW9uKG51bGwpOwotICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0ZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgIGVkLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgICBvd25lciA9IGVkLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHRkID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgZWQuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24odGQpOwotICAgICAgICAgIG93bmVyID0gdGQ7ICAgICAgICAKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgCi0gICAgICBlbHNlIGlmIChlZC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0ZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBlZC5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICAgIG93bmVyID0gdGQ7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIG93bmVyID0gZWQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHRkID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIGVkLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgb3duZXIgPSB0ZDsgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIG5ld01vZGVsR3JvdXAgPSBjcmVhdGVNb2RlbEdyb3VwKCk7Ci0gICAgICAoKFhTRE1vZGVsR3JvdXApIHBhcmVudCkuZ2V0Q29udGVudHMoKS5hZGQobmV3TW9kZWxHcm91cC5nZXRDb250YWluZXIoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXBhcmVudDsKLSAgICAgIG93bmVyID0gcGFyZW50OwotICAgICAgaWYgKGN0LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSljdC5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChwYXJ0aWNsZS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgb3duZXIgPSBudWxsOwotICAgICAgICAgIG5ld01vZGVsR3JvdXAgPSBjcmVhdGVNb2RlbEdyb3VwKCk7Ci0gICAgICAgICAgWFNETW9kZWxHcm91cCBuZXdQYXJlbnQgPSAoWFNETW9kZWxHcm91cClwYXJ0aWNsZS5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgbmV3UGFyZW50LmdldENvbnRlbnRzKCkuYWRkKG5ld01vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbilwYXJlbnQ7Ci0gICAgICBvd25lciA9IG51bGw7Ci0gICAgICBuZXdNb2RlbEdyb3VwID0gY3JlYXRlTW9kZWxHcm91cCgpOwotICAgICAgaWYgKG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldE1vZGVsR3JvdXAoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwIG5ld1BhcmVudCA9IG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgICAgbmV3UGFyZW50LmdldENvbnRlbnRzKCkuYWRkKG5ld01vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBtb2RlbEdyb3VwRGVmaW5pdGlvbi5zZXRNb2RlbEdyb3VwKG5ld01vZGVsR3JvdXApOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3duZXI7Ci0gIH0KLSAgCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRvcHQoWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RNb2RlbEdyb3VwIGNyZWF0ZU1vZGVsR3JvdXAoKQotICB7Ci0gICAgCi0gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBmYWN0b3J5LmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0gICAgbW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKHhzZENvbXBvc2l0b3IpOwotICAgIHBhcnRpY2xlLnNldENvbnRlbnQobW9kZWxHcm91cCk7Ci0gICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IG1vZGVsR3JvdXA7Ci0gICAgcmV0dXJuIG1vZGVsR3JvdXA7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNzgyZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIGJvb2xlYW4gaXNSZWZlcmVuY2U7Ci0KLSAgcHVibGljIEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCwgYm9vbGVhbiBpc1JlZmVyZW5jZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB0aGlzLmlzUmVmZXJlbmNlID0gaXNSZWZlcmVuY2U7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kI2V4ZWN1dGUoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoKFhTRFNjaGVtYSlwYXJlbnQpOwotICAgIH0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIGlmICghaXNSZWZlcmVuY2UpCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGRlZiA9IGNyZWF0ZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBkZWY7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBkZWYgPSBmYWN0b3J5LmNyZWF0ZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICAgICAgcGFydGljbGUuc2V0Q29udGVudChkZWYpOwotICAgICAgICBMaXN0IGxpc3QgPSBwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCk7Ci0gICAgICAgIGludCBsZW5ndGggPSBsaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKGxlbmd0aCA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdyID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChnci5nZXRNb2RlbEdyb3VwKCkgIT0gcGFyZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkZWYuc2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbihncik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGxlbmd0aCA8PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbmV3R3JvdXBEZWYgPSBjcmVhdGVYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgIGRlZi5zZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKG5ld0dyb3VwRGVmKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgKChYU0RNb2RlbEdyb3VwKSBwYXJlbnQpLmdldENvbnRlbnRzKCkuYWRkKHBhcnRpY2xlKTsKLSAgICAgICAgfQotICAgICAgICBmb3JtYXRDaGlsZChkZWYuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGRlZjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBjcmVhdGVYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpCi0gIHsKLSAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBkZWYgPSBmYWN0b3J5LmNyZWF0ZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgTGlzdCBsaXN0ID0gcGFyZW50LmdldFNjaGVtYSgpLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpOwotICAgIFN0cmluZyBuZXdOYW1lID0gWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgiTmV3R3JvdXBEZWZpbml0aW9uIiwgbGlzdCk7IC8vJE5PTi1OTFMtMSQKLSAgICBkZWYuc2V0TmFtZShuZXdOYW1lKTsKLQotICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IGNyZWF0ZU1vZGVsR3JvdXAoKTsKLSAgICBkZWYuc2V0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICBUZXh0IHRleHROb2RlID0gcGFyZW50LmdldFNjaGVtYSgpLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICBwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0Q29udGVudHMoKS5hZGQoZGVmKTsKLSAgICBmb3JtYXRDaGlsZChkZWYuZ2V0RWxlbWVudCgpKTsKLSAgICByZXR1cm4gZGVmOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRE1vZGVsR3JvdXAgY3JlYXRlTW9kZWxHcm91cCgpCi0gIHsKLSAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGZhY3RvcnkuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSBmYWN0b3J5LmNyZWF0ZVhTRE1vZGVsR3JvdXAoKTsKLSAgICBtb2RlbEdyb3VwLnNldENvbXBvc2l0b3IoWFNEQ29tcG9zaXRvci5TRVFVRU5DRV9MSVRFUkFMKTsKLSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KG1vZGVsR3JvdXApOwotCi0gICAgcmV0dXJuIG1vZGVsR3JvdXA7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEUmVkZWZpbmVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RSZWRlZmluZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmZDM2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RSZWRlZmluZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEUmVkZWZpbmVDb21tYW5kIGV4dGVuZHMgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZAotewotICBwdWJsaWMgQWRkWFNEUmVkZWZpbmVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEFkZCB0aGlzIGFmdGVyIGlmIHdlIGRvbid0IGhhdmUgYSBET00gTm9kZSB5ZXQKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgICAgWFNEUmVkZWZpbmUgeHNkUmVkZWZpbmUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RSZWRlZmluZSgpOwotICAgICAgeHNkUmVkZWZpbmUuc2V0U2NoZW1hTG9jYXRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoZmluZE5leHRQb3NpdGlvblRvSW5zZXJ0KCksIHhzZFJlZGVmaW5lKTsKLSAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSB4c2RSZWRlZmluZTsKLSAgICAgIGZvcm1hdENoaWxkKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGY5MDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRYU0RTY2hlbWFEaXJlY3RpdmVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIAotICBwdWJsaWMgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgaW50IGZpbmROZXh0UG9zaXRpb25Ub0luc2VydCgpCi0gIHsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgewotICAgICAgICBpbmRleCArKzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbmRleDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgZW5zdXJlU2NoZW1hRWxlbWVudCh4c2RTY2hlbWEpOwotIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYWJiZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50OwotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBjcmVhdGVkU2ltcGxlVHlwZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZVRvQWRkOwotICAKLSAgcHVibGljIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVUb0FkZChTdHJpbmcgbmFtZVRvQWRkKQotICB7Ci0gICAgdGhpcy5uYW1lVG9BZGQgPSBuYW1lVG9BZGQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBlbnN1cmVTY2hlbWFFbGVtZW50KChYU0RTY2hlbWEpcGFyZW50KTsKLSAgICB9Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgIHR5cGVEZWYuc2V0QmFzZVR5cGVEZWZpbml0aW9uKHBhcmVudC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAic3RyaW5nIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIHR5cGVEZWYuc2V0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKG5hbWVUb0FkZCA9PSBudWxsID8gIk5ld1NpbXBsZVR5cGUiIDogbmFtZVRvQWRkLCAoKFhTRFNjaGVtYSkgcGFyZW50KS5nZXRUeXBlRGVmaW5pdGlvbnMoKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNyZWF0ZWRTaW1wbGVUeXBlID0gdHlwZURlZjsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSkgcGFyZW50OwotICAgICAgICAgIFRleHQgdGV4dE5vZGUgPSB4c2RTY2hlbWEuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgICAgICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZCh0eXBlRGVmKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBwYXJlbnQpLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHR5cGVEZWYpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHBhcmVudCkuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24odHlwZURlZik7Ci0gICAgICB9Ci0gICAgICBmb3JtYXRDaGlsZChjcmVhdGVkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotCi0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gY3JlYXRlZFNpbXBsZVR5cGU7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0Q3JlYXRlZFNpbXBsZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZWRTaW1wbGVUeXBlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9CYXNlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQmFzZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyMzM0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9CYXNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBCYXNlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTCA9ICJ4bWwiOyAvLyROT04tTkxTLTEkCi0KLSAgWFNEQ29uY3JldGVDb21wb25lbnQgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotICBwdWJsaWMgQmFzZUNvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBCYXNlQ29tbWFuZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRBZGRlZENvbXBvbmVudCgpCi0gIHsKLSAgICByZXR1cm4gYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudDsKLSAgfQotICAKLSAgSURPTU5vZGUgZG9tTm9kZTsKLSAgcHJvdGVjdGVkIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIGRvbU5vZGUgPSAoSURPTU5vZGUpIGVsZW1lbnQ7IAotICAgICAgZG9tTm9kZS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGdldFVuZG9EZXNjcmlwdGlvbigpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGVuZFJlY29yZGluZygpCi0gIHsKLSAgICBpZiAoZG9tTm9kZSAhPSBudWxsKQotICAgICAgZG9tTm9kZS5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0gICAgcmV0dXJuIGdldExhYmVsKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRDaGlsZChFbGVtZW50IGNoaWxkKQotICB7Ci0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSljaGlsZCkuZ2V0TW9kZWwoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLSAgICAgICAgCi0gICAgICAgIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7IAotICAgICAgfQotICAgIH0KLSAgfQotIAotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZW5zdXJlU2NoZW1hRWxlbWVudChYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBzY2hlbWEuZ2V0RG9jdW1lbnQoKTsKLSAgICAKLSAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgIGlmIChzY2hlbWFFbGVtZW50ID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGdldERlZmF1bHROYW1lc3BhY2Uoc2NoZW1hKTsKLSAgICAgIHNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIE1hcCBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwID0gc2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0KCJ0bnMiLCB0YXJnZXROYW1lc3BhY2UpOyAgICAgIAotICAgICAgaWYgKFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuaXNRdWFsaWZ5WE1MU2NoZW1hTGFuZ3VhZ2UoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0WE1MU2NoZW1hUHJlZml4KCk7Ci0gICAgICAgIHNjaGVtYS5zZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeChwcmVmaXgpOwotICAgICAgICBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwLnB1dChwcmVmaXgsIFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7ICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0KG51bGwsIFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7ICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIHNjaGVtYS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICBlbnN1cmVYTUxEaXJlY3RpdmUoZG9jdW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgZW5zdXJlWE1MRGlyZWN0aXZlKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgaWYgKGhhc1hNTERpcmVjdGl2ZShkb2N1bWVudCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBOb2RlIGZpcnN0Q2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHhtbERlY2xhcmF0aW9uID0gZ2V0WE1MRGVjbGFyYXRpb24oZG9jdW1lbnQpOwotICAgIGRvY3VtZW50Lmluc2VydEJlZm9yZSh4bWxEZWNsYXJhdGlvbiwgZmlyc3RDaGlsZCk7Ci0gICAgVGV4dCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7Ci0gICAgZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKHRleHROb2RlLCBmaXJzdENoaWxkKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNYTUxEaXJlY3RpdmUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBOb2RlIGZpcnN0Q2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAKLSAgICBpZiAoZmlyc3RDaGlsZCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGZpcnN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilmaXJzdENoaWxkOwotICAgIAotICAgIGlmICghWE1MLmVxdWFscyhwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uZ2V0VGFyZ2V0KCkpKSAKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGdldFhNTERlY2xhcmF0aW9uKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gICAgU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0gICAgaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKQotICAgIHsKLSAgICAgIGNoYXJTZXQgPSAiVVRGLTgiOwotICAgIH0KLSAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24geG1sRGVjbGFyYXRpb24gPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oWE1MLCAidmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGNoYXJTZXQgKyAiXCIiKTsKLSAgICByZXR1cm4geG1sRGVjbGFyYXRpb247Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRYTUxTY2hlbWFUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIGlmICghbmFtZXNwYWNlLmVuZHNXaXRoKCIvIikpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gbmFtZXNwYWNlLmNvbmNhdCgiLyIpOwotICAgIH0KLQotICAgIG5hbWVzcGFjZSArPSBnZXRGaWxlTmFtZShzY2hlbWEpICsgIi8iOwotCi0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLQotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIFVSSSBzY2hlbWFVUkkgPSBzY2hlbWEuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0gICAgSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChzY2hlbWFVUkkudG9TdHJpbmcoKSk7Ci0gICAgcmV0dXJuIGZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpLnRvU3RyaW5nKCk7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9DaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxMGQ4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9DaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTREZlYXR1cmUgcGFyZW50OwotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBjdXJyZW50VHlwZTsKLQotICBwdWJsaWMgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNERmVhdHVyZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0KLS8vICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0vLyAgICB7Ci0vLyAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50OwotLy8gICAgICBYU0RUeXBlRGVmaW5pdGlvbiBhVHlwZSA9IGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotLy8KLS8vICAgICAgaWYgKGFUeXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBjdXJyZW50VHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgYVR5cGU7Ci0vLyAgICAgIH0KLS8vICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0vLyAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLS8vICAgIGFub255bW91c1NpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKGN1cnJlbnRUeXBlKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oYW5vbnltb3VzU2ltcGxlVHlwZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgcGFyZW50KS5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihhbm9ueW1vdXNTaW1wbGVUeXBlKTsKLSAgICAgIH0KLSAgICAgIGZvcm1hdENoaWxkKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzU2ltcGxlVHlwZShYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNTaW1wbGVUeXBlKQotICB7Ci0gICAgdGhpcy5hbm9ueW1vdXNTaW1wbGVUeXBlID0gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBnZXRBbm9ueW1vdXNUeXBlKCkKLSAgewotICAgIGlmIChhbm9ueW1vdXNTaW1wbGVUeXBlID09IG51bGwpCi0gICAgewotICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbihjdXJyZW50VHlwZSk7Ci0gICAgfQotICAgIHJldHVybiBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDgzYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRGVsZXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0OwotCi0gIHB1YmxpYyBEZWxldGVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotICB9Ci0gIAotICBwdWJsaWMgRGVsZXRlQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQpCi0gIHsKLSAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURSk7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIFhTRFZpc2l0b3IgdmlzaXRvciA9IG5ldyBYU0RWaXNpdG9yKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChlbGVtZW50LmdldFR5cGVEZWZpbml0aW9uKCkgPT0gdGFyZ2V0KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSA9IHRhcmdldC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgZWxlbWVudC5zZXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdGFyZ2V0LmdldENvbnRhaW5lcigpOwotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB0YXJnZXQuZ2V0U2NoZW1hKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIGJvb2xlYW4gZG9DbGVhbnVwID0gZmFsc2U7Ci0gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCB8fCB0YXJnZXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgdGFyZ2V0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGRvQ2xlYW51cCA9IHRydWU7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChwYXJlbnQuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSAoKFhTRFBhcnRpY2xlKSBwYXJlbnQpLmdldENvbnRhaW5lcigpOwotCi0gICAgICAgICAgICBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKHBhcmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHBhcmVudC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZS5zZXRDb250ZW50KG51bGwpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHRhcmdldC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgKChYU0RTY2hlbWEpIHBhcmVudCkuZ2V0Q29udGVudHMoKS5yZW1vdmUodGFyZ2V0KTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgZG9DbGVhbnVwID0gdHJ1ZTsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgewotICAgICAgICAgIEVPYmplY3Qgb2JqID0gcGFyZW50LmVDb250YWluZXIoKTsKLSAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSBudWxsOwotICAgICAgICAgIHdoaWxlIChvYmogIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIG9iajsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvYmogPSBvYmouZUNvbnRhaW5lcigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY29tcGxleFR5cGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLnJlbW92ZShwYXJlbnQpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChwYXJlbnQuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudC5nZXRDb250YWluZXIoKTsKLQotICAgICAgICAgICAgYXR0ckdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKHBhcmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0b3IudmlzaXRTY2hlbWEodGFyZ2V0LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAoKFhTRFNjaGVtYSkgcGFyZW50KS5nZXRDb250ZW50cygpLnJlbW92ZSh0YXJnZXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gJiYgcGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBkb0NsZWFudXAgPSB0cnVlOwotICAgICAgICAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50KS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLnJlbW92ZSh0YXJnZXQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtZXJhdGlvbkZhY2V0ID0gKFhTREVudW1lcmF0aW9uRmFjZXQpIHRhcmdldDsKLSAgICAgICAgZW51bWVyYXRpb25GYWNldC5nZXRTaW1wbGVUeXBlRGVmaW5pdGlvbigpLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUoZW51bWVyYXRpb25GYWNldCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHBhcmVudC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApICgoWFNEUGFydGljbGUpIHBhcmVudCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgICAgICBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKHBhcmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQpLnNldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudChudWxsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50KS5zZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uICYmIHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgZG9DbGVhbnVwID0gdHJ1ZTsKLSAgICAgICAgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkuc2V0VHlwZURlZmluaXRpb24odGFyZ2V0LnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICBkb0NsZWFudXAgPSB0cnVlOwotICAgICAgICAgIHZpc2l0b3IudmlzaXRTY2hlbWEodGFyZ2V0LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAoKFhTRFNjaGVtYSkgcGFyZW50KS5nZXRDb250ZW50cygpLnJlbW92ZSh0YXJnZXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkb0NsZWFudXApCi0gICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMoc2NoZW1hKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0V4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzcxNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kIGV4dGVuZHMgQWRkRXh0ZW5zaW9uQ29tbWFuZAotewotICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQ7Ci0gIHByb3RlY3RlZCBFbGVtZW50IGFwcEluZm87Ci0gIHByb3RlY3RlZCBFbGVtZW50IG5ld0VsZW1lbnQ7Ci0KLSAgcHVibGljIEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKFN0cmluZyBsYWJlbCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgfQotCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIEVsZW1lbnQgZ2V0TmV3RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGdldEFwcEluZm8oKQotICB7Ci0gICAgcmV0dXJuIGFwcEluZm87Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKCkKLSAgewotICAgIHJldHVybiBjb21wb25lbnQuZ2V0U2NoZW1hKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXRzKFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0LCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIHRoaXMuY29tcG9uZW50ID0gaW5wdXQ7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIFhTREFubm90YXRpb24gZ2V0WFNEQW5ub3RhdGlvbigpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gWFNEQ29tbW9uVUlVdGlscy5nZXRJbnB1dFhTREFubm90YXRpb24oY29tcG9uZW50LCBmYWxzZSk7Ci0gICAgICByZXR1cm4geHNkQW5ub3RhdGlvbjsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgICAgZG9QcmVwcm9jZXNzaW5nKCk7Ci0gICAgICBhZGRFeHRlbnNpb25Ob2RlKCk7Ci0gICAgICBkb0N1c3RvbWl6ZWRBY3Rpb25zKCk7Ci0gICAgICAKLSAgICAgIGZvcm1hdENoaWxkKGNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb1ByZXByb2Nlc3NpbmcoKQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZEV4dGVuc2lvbk5vZGUoKQotICB7Ci0gICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gWFNEQ29tbW9uVUlVdGlscy5nZXRJbnB1dFhTREFubm90YXRpb24oY29tcG9uZW50LCB0cnVlKTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hPSB4c2RBbm5vdGF0aW9uLmdldFNjaGVtYSgpOwotICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoeHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCkuc2l6ZSgpID09IDApCi0gICAgewotICAgICAgYXBwSW5mbyA9IHhzZEFubm90YXRpb24uY3JlYXRlQXBwbGljYXRpb25JbmZvcm1hdGlvbihudWxsKTsKLSAgICAgIHhzZEFubm90YXRpb24uZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKGFwcEluZm8pOwotICAgICAgTGlzdCBhcHBJbmZvcyA9IHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpOwotICAgICAgYXBwSW5mb3MuYWRkKGFwcEluZm8pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gdXNlIHRoZSBmaXJzdCBhcHBJbmZvCi0gICAgICBhcHBJbmZvID0gKEVsZW1lbnQpeHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCkuZ2V0KDApOwotICAgIH0KLQotICAgIGlmIChhcHBJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgRG9jdW1lbnQgZG9jID0gYXBwSW5mby5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gYWRkVG9OYW1lc3BhY2VUYWJsZShzY2hlbWFFbGVtZW50KTsKLSAgICAgIG5ld0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKGV4dGVuc2lvbnNTY2hlbWFTcGVjLmdldE5hbWVzcGFjZVVSSSgpLCBlbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICBuZXdFbGVtZW50LnNldFByZWZpeChwcmVmaXgpOyAgIAotICAgICAgYXBwSW5mby5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsKLQotICAgICAgeHNkQW5ub3RhdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGFkZFRvTmFtZXNwYWNlVGFibGUoRWxlbWVudCBzY2hlbWFFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uSWZSZXF1aXJlZChzY2hlbWFFbGVtZW50LCAicCIsIGV4dGVuc2lvbnNTY2hlbWFTcGVjLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRvQ3VzdG9taXplZEFjdGlvbnMoKQotICB7Ci0gICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLSAgCi0gIC8vIFRPRE8uLi4gY29tbW9uIHRoaXMgdXAgd2l0aCB3c2RsLnVpCi0gIHByb3RlY3RlZCBTdHJpbmcgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25JZlJlcXVpcmVkKEVsZW1lbnQgc2NoZW1hRWxlbWVudCwgU3RyaW5nIHByZWZpeEhpbnQsIFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsgICAgICAKLSAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShzY2hlbWFFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChzY2hlbWFFbGVtZW50KTsKLSAgICBwcmVmaXggPSBuYW1lc3BhY2VUYWJsZS5nZXRQcmVmaXhGb3JVUkkobmFtZXNwYWNlKTsKLSAgICBpZiAocHJlZml4ID09IG51bGwpCi0gICAgeyAKLSAgICAgIFN0cmluZyBiYXNlUHJlZml4ID0gcHJlZml4SGludDsKLSAgICAgIHByZWZpeCA9IGJhc2VQcmVmaXg7Ci0gICAgICBTdHJpbmcgeG1sbnNDb2xvbiA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHhtbG5zQ29sb24gKyBwcmVmaXg7Ci0gICAgICBpbnQgY291bnQgPSAwOwotICAgICAgd2hpbGUgKHNjaGVtYUVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIHByZWZpeCA9IGJhc2VQcmVmaXggKyBjb3VudDsKLSAgICAgICAgYXR0cmlidXRlTmFtZSA9IHhtbG5zQ29sb24gKyBwcmVmaXg7Ci0gICAgICB9ICAgICAgCi0gICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBuYW1lc3BhY2UpOyAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRTY2hlbWFBdHRyaWJ1dGUoRWxlbWVudCBzY2hlbWFFbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoc2NoZW1hRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoc2NoZW1hRWxlbWVudCk7Ci0gICAgcHJlZml4ID0gbmFtZXNwYWNlVGFibGUuZ2V0UHJlZml4Rm9yVVJJKG5hbWVzcGFjZSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoc2NoZW1hRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKHByZWZpeCArICI6IiArIGF0dHJpYnV0ZU5hbWUpID09IG51bGwpCi0gICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUocHJlZml4ICsgIjoiICsgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOyAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChzY2hlbWFFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlTmFtZSkgPT0gbnVsbCkKLSAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRTb3VyY2VBdHRyaWJ1dGVUb0FwcEluZm8oU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIGlmIChhcHBJbmZvLmdldEF0dHJpYnV0ZU5vZGUoWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUpID09IG51bGwpCi0gICAgICBhcHBJbmZvLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuU09VUkNFX0FUVFJJQlVURSwgbmFtZXNwYWNlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudAotICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotICAgKiBAcGFyYW0gYXR0cmlidXRlVmFsdWUKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpCi0gIHsKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0V4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNWZmMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIE5vZGUgbm9kZTsKLSAgcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0OwotICAKLSAgcHVibGljIEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgfQotCi0gIHB1YmxpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCkKLSAgewotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKG5vZGUpOwotICAgICAgCi0gICAgICBkb1ByZXByb2Nlc3NpbmcoKTsKLSAgICAgIAotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgICAgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgbm9kZTsKLSAgICAgICAgYXR0ci5nZXRPd25lckVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2Uobm9kZSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKFhTRERPTUhlbHBlci5oYXNPbmx5V2hpdGVzcGFjZShwYXJlbnQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRy5lcXVhbHMocGFyZW50LmdldExvY2FsTmFtZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRvQ3VzdG9taXplZEFjdGlvbnMoKTsKLQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9QcmVwcm9jZXNzaW5nKCkKLSAgewotICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkb0N1c3RvbWl6ZWRBY3Rpb25zKCkKLSAgewotICAgCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uQXR0cmlidXRlckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbkF0dHJpYnV0ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzNhNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uQXR0cmlidXRlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlRXh0ZW5zaW9uQXR0cmlidXRlckNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIAotewotCUVsZW1lbnQgaG9zdEVsZW1lbnQ7Ci0JQXR0ciBhdHRyOwotCQotCXB1YmxpYyBSZW1vdmVFeHRlbnNpb25BdHRyaWJ1dGVyQ29tbWFuZChTdHJpbmcgbGFiZWwsIEVsZW1lbnQgaG9zdEVsZW1lbnQsIEF0dHIgYXR0cikKLQl7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJdGhpcy5ob3N0RWxlbWVudCA9IGhvc3RFbGVtZW50OwotCQl0aGlzLmF0dHIgPSBhdHRyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkKLQl7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQkJaG9zdEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5kbygpCi0JewotCQlzdXBlci51bmRvKCk7Ci0JCS8vVE9ETyBpbXBsZW1lbnQgbWUKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25FbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzYzc1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25FbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCi17Ci0gIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbjsKLSAgTm9kZSBhcHBJbmZvOwotCi0gIHB1YmxpYyBSZW1vdmVFeHRlbnNpb25FbGVtZW50Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiwgTm9kZSBhcHBJbmZvKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkQW5ub3RhdGlvbiA9IHhzZEFubm90YXRpb247Ci0gICAgdGhpcy5hcHBJbmZvID0gYXBwSW5mbzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgIHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpLnJlbW92ZShhcHBJbmZvKTsKLSAgICB4c2RBbm5vdGF0aW9uLmdldEVsZW1lbnQoKS5yZW1vdmVDaGlsZChhcHBJbmZvKTsKLSAgICB4c2RBbm5vdGF0aW9uLnVwZGF0ZUVsZW1lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICAgIHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpLmFkZChhcHBJbmZvKTsKLSAgICB4c2RBbm5vdGF0aW9uLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZChhcHBJbmZvKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MTE2NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgTm9kZSBub2RlOwotICAKLSAgcHVibGljIFJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kKFN0cmluZyBsYWJlbCwgTm9kZSBub2RlKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMubm9kZSA9IG5vZGU7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKG5vZGUpOwotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgICAgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgbm9kZTsKLSAgICAgICAgYXR0ci5nZXRPd25lckVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2Uobm9kZSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKFhTRERPTUhlbHBlci5oYXNPbmx5V2hpdGVzcGFjZShwYXJlbnQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRy5lcXVhbHMocGFyZW50LmdldExvY2FsTmFtZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0QmFzZVR5cGVBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzQ3Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0QmFzZVR5cGVBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFNldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kIGV4dGVuZHMgVXBkYXRlVHlwZVJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kCi17Ci0KLSAgcHVibGljIFNldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50LCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSwgSUZpbGUgZmlsZSkKLSAgewotICAgIHN1cGVyKGNvbmNyZXRlQ29tcG9uZW50LCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lc3BhY2UsIGZpbGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgWFNEQ29tcG9uZW50IHRkID0gY29tcHV0ZUNvbXBvbmVudCgpOwotICAgICAgaWYgKHRkICE9IG51bGwgJiYgdGQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgU2V0QmFzZVR5cGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0QmFzZVR5cGVDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCAoWFNEVHlwZURlZmluaXRpb24pIHRkKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldEJhc2VUeXBlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0QmFzZVR5cGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMTA2ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0QmFzZVR5cGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRERlcml2YXRpb25NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLQotcHVibGljIGNsYXNzIFNldEJhc2VUeXBlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50OwotICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZTsKLSAgWFNEQmFzZUFkYXB0ZXIgYWRhcHRlcjsKLSAgCi0KLSAgcHVibGljIFNldEJhc2VUeXBlQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUpCi0gIHsKLSAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9CQVNFX1RZUEUpOwotICAgIHRoaXMuY29uY3JldGVDb21wb25lbnQgPSBjb25jcmV0ZUNvbXBvbmVudDsKLSAgICB0aGlzLmJhc2VUeXBlID0gYmFzZVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGNvbmNyZXRlQ29tcG9uZW50OwotCi0gICAgICAgIGlmIChiYXNlVHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCEoY29tcGxleFR5cGUuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZUNvbnRlbnQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgY29tcGxleFR5cGUuc2V0Q29udGVudChzaW1wbGVDb250ZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb21wbGV4VHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oYmFzZVR5cGUpOwotICAgICAgICBjb21wbGV4VHlwZS5zZXREZXJpdmF0aW9uTWV0aG9kKFhTRERlcml2YXRpb25NZXRob2QuRVhURU5TSU9OX0xJVEVSQUwpOwotICAgICAgICBmb3JtYXRDaGlsZChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgY29uY3JldGVDb21wb25lbnQ7Ci0gICAgICAgIGlmIChiYXNlVHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEVmFyaWV0eSB2YXJpZXR5ID0gc2ltcGxlVHlwZS5nZXRWYXJpZXR5KCk7Ci0gICAgICAgICAgaWYgKHZhcmlldHkuZ2V0VmFsdWUoKSA9PSBYU0RWYXJpZXR5LkFUT01JQykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGJhc2VUeXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAodmFyaWV0eS5nZXRWYWx1ZSgpID09IFhTRFZhcmlldHkuVU5JT04pCi0gICAgICAgICAgewotICAgICAgICAgICAgc2ltcGxlVHlwZS5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKS5hZGQoYmFzZVR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh2YXJpZXR5LmdldFZhbHVlKCkgPT0gWFNEVmFyaWV0eS5MSVNUKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNpbXBsZVR5cGUuc2V0SXRlbVR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgYmFzZVR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRNdWx0aXBsaWNpdHlDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRNdWx0aXBsaWNpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NzlmZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0TXVsdGlwbGljaXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotCi1wdWJsaWMgY2xhc3MgU2V0TXVsdGlwbGljaXR5Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgaW50IG1heE9jY3VycywgbWluT2NjdXJzOwotCi0gIC8qKgotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqLwotICBwdWJsaWMgU2V0TXVsdGlwbGljaXR5Q29tbWFuZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1heE9jY3VycyhpbnQgaSkKLSAgewotICAgIG1heE9jY3Vycz1pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWluT2NjdXJzKGludCBpKQotICB7Ci0gICAgbWluT2NjdXJzPWk7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0WFNEQ29uY3JldGVDb21wb25lbnQoWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUNvbnRlbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlQ29udGVudCB4c2RQYXJ0aWNsZUNvbnRlbnQgPSAoWFNEUGFydGljbGVDb250ZW50KSBwYXJlbnQ7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHhzZFBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSB4c2RQYXJ0aWNsZUNvbnRlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIGlmIChtYXhPY2N1cnMgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgbWF4T2NjdXJzID0gWFNEUGFydGljbGUuVU5CT1VOREVEOwotICAgICAgICB9Ci0gICAgICAgIHhzZFBhcnRpY2xlLnNldE1heE9jY3VycyhtYXhPY2N1cnMpOwotICAgICAgICB4c2RQYXJ0aWNsZS5zZXRNaW5PY2N1cnMobWluT2NjdXJzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldFR5cGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNGNiNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0VHlwZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTZXRUeXBlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRpbnVlQXBwbHk7Ci0gIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXI7Ci0gIFN0cmluZyBhY3Rpb247Ci0KLSAgcHVibGljIFNldFR5cGVDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIElELCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5hY3Rpb24gPSBJRDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihYU0RCYXNlQWRhcHRlciBhZGFwdGVyKQotICB7Ci0gICAgdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0gICAgICBjb250aW51ZUFwcGx5ID0gdHJ1ZTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKFNldFR5cGVBY3Rpb24uU0VUX05FV19UWVBFX0lEKSkKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWUgPSAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgaW52b2tlRGlhbG9nKGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmdldE5ld0RpYWxvZygpKTsKLSAgICAgICAgICBpZiAoY29udGludWVBcHBseSkKLSAgICAgICAgICAgIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShhZGFwdGVyLCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZSA9IChDb21wb25lbnRTcGVjaWZpY2F0aW9uKSBpbnZva2VEaWFsb2coY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCkpOwotICAgICAgICAgIGlmIChjb250aW51ZUFwcGx5KQotICAgICAgICAgICAgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGFkYXB0ZXIsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBmb3JtYXRDaGlsZChwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgT2JqZWN0IGludm9rZURpYWxvZyhJQ29tcG9uZW50RGlhbG9nIGRpYWxvZykKLSAgewotICAgIE9iamVjdCBuZXdWYWx1ZSA9IG51bGw7Ci0KLSAgICBpZiAoZGlhbG9nID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgIHsKLSAgICAgIG5ld1ZhbHVlID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb250aW51ZUFwcGx5ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld1ZhbHVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCkKLSAgewotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIHJlc3VsdCA9IG51bGw7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICByZXR1cm4gZWRpdG9yUGFydDsKLSAgfSAgICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldFhTREZhY2V0VmFsdWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNzE3MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWNldDsKLQotcHVibGljIGNsYXNzIFNldFhTREZhY2V0VmFsdWVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFhTREZhY2V0IGZhY2V0OwotICBwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotICAKLSAgcHVibGljIFNldFhTREZhY2V0VmFsdWVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNERmFjZXQgZmFjZXQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5mYWNldCA9IGZhY2V0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGZhY2V0LmdldEVsZW1lbnQoKSk7Ci0gICAgICBmYWNldC5zZXRMZXhpY2FsVmFsdWUodmFsdWUpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDM4YjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZCBleHRlbmRzIFVwZGF0ZUNvbXBvbmVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kCi17Ci0KLSAgcHVibGljIFVwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UsIElGaWxlIGZpbGUpCi0gIHsKLSAgICBzdXBlcihjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZXNwYWNlLCBmaWxlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RDb21wb25lbnQgZ2V0RGVmaW5lZENvbXBvbmVudChYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlc3VsdCA9IHNjaGVtYS5yZXNvbHZlQXR0cmlidXRlRGVjbGFyYXRpb24oY29tcG9uZW50TmFtZXNwYWNlLCBjb21wb25lbnROYW1lKTsKLSAgICBpZiAocmVzdWx0LmVDb250YWluZXIoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RDb21wb25lbnQgY29tcG9uZW50RGVmID0gY29tcHV0ZUNvbXBvbmVudCgpOwotICAgICAgaWYgKGNvbXBvbmVudERlZiAhPSBudWxsKQotICAgICAgewotICAgICAgICBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZChvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFLCAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGNvbmNyZXRlQ29tcG9uZW50LAotICAgICAgICAgICAgKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjb21wb25lbnREZWYpOwotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIucmVtb3ZlVW51c2VkWFNESW1wb3J0cyhjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmNjM3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlLCByZWY7Ci0KLSAgcHVibGljIFVwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUsIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlZikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLSAgICB0aGlzLnJlZiA9IHJlZjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoYXR0cmlidXRlLmdldEVsZW1lbnQoKSk7Ci0gICAgICBhdHRyaWJ1dGUuc2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbihyZWYpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzQ0M2QzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCBmcm9tIHRoZSBleHRlbnNpb24gdmlldyB0byBlZGl0IGV4dGVuc2lvbiBlbGVtZW50cwotICogYW5kIGF0dHJpYnV0ZXMgd2hpY2ggYXJlIGltcGxlbWVudGVkIGFzIERPTSBvYmplY3RzIChub3QgcGFydCBvZiB0aGUgRU1GIG1vZGVsKQotICogCi0gKiAodHJ1bmcpIGFsc28gdXNlZCBpbiBYU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbiB0byBjaGFuZ2UgYXR0cmlidXRlIG9mCi0gKiBzcGVjaWNhbCBhdHRyaWJ1dGVzIGxpa2UgYmxvY2ssIHJlc3RyaWN0aW9uIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIEVNRiBNb2RlbAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kICBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlTmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgCi0gIC8qKiBXaGV0aGVyIHRoZSBhdHRyaWJ1dGUgc2hvdWxkIGJlIGRlbGV0ZWQgaWYgdmFsdWUgdG8gCi0gICAqICAgYmUgc2V0IGlzIGFuIGVtcHR5IFN0cmluZyBvciBudWxsICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVJZlZhbHVlRW1wdHkgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlLCBib29sZWFuIGRlbGV0ZUlmVmFsdWVFbXB0eSkKLSAgewotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKLSAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWU7Ci0gICAgdGhpcy5kZWxldGVJZlZhbHVlRW1wdHkgPSBkZWxldGVJZlZhbHVlRW1wdHk7Ci0gIH0KLQotICBwdWJsaWMgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSwgU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgdGhpcyhlbGVtZW50LCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSwgZmFsc2UpOwotICAgIHNldExhYmVsKE5MUy5iaW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0hBTkdFLCBsYWJlbCkpOwotICB9Ci0gIAotICBwdWJsaWMgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkKLSAgewotICAgIHRoaXMoZWxlbWVudCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUsIGZhbHNlKTsKLSAgICBzZXRMYWJlbChOTFMuYmluZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRSwgYXR0cmlidXRlTmFtZSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVsZXRlSWZFbXB0eShib29sZWFuIHYpCi0gIHsKLQkgIGRlbGV0ZUlmVmFsdWVFbXB0eSA9IHY7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgaWYgKGRlbGV0ZUlmVmFsdWVFbXB0eSAmJiAKLSAgICAJCSAgKGF0dHJpYnV0ZVZhbHVlID09IG51bGwgfHwgYXR0cmlidXRlVmFsdWUuZXF1YWxzKCIiKSApICkKLSAgICAgIHsKLSAgICAJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZG9Qb3N0UHJvY2Vzc2luZygpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3RQcm9jZXNzaW5nKCkKLSAgewotICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb21wbGV4VHlwZURlcml2YXRpb25CeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwYmJhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb21wbGV4VHlwZURlcml2YXRpb25CeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRERlcml2YXRpb25NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnkgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcml2YXRlIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZTsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVyaXZhdGlvbjsKLQotICBwdWJsaWMgVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnkoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlLCBTdHJpbmcgZGVyaXZhdGlvbikKLSAgewotICAgIHRoaXMuY29tcGxleFR5cGUgPSBjb21wbGV4VHlwZTsKLSAgICB0aGlzLmRlcml2YXRpb24gPSBkZXJpdmF0aW9uOwotICAgIC8vIFRPRE86IHVzZSBuZXcgTWVzc2FnZSBidW5kbGUgbWVjaGFuaXNtCi0gICAgc2V0TGFiZWwoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0RFUklWRURCWV9DSEFOR0UiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkpOwotICAgICAgaWYgKGRlcml2YXRpb24uZXF1YWxzKFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcpKQotICAgICAgewotICAgICAgICBjb21wbGV4VHlwZS5zZXREZXJpdmF0aW9uTWV0aG9kKFhTRERlcml2YXRpb25NZXRob2QuRVhURU5TSU9OX0xJVEVSQUwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZGVyaXZhdGlvbi5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgIHsKLSAgICAgICAgY29tcGxleFR5cGUuc2V0RGVyaXZhdGlvbk1ldGhvZChYU0REZXJpdmF0aW9uTWV0aG9kLlJFU1RSSUNUSU9OX0xJVEVSQUwpOwotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyM2YzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUltcGw7Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY29tcG9uZW50TmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBJRmlsZSBmaWxlOwotCi0gIHB1YmxpYyBVcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UsIElGaWxlIGZpbGUpCi0gIHsKLSAgICB0aGlzLmNvbmNyZXRlQ29tcG9uZW50ID0gY29uY3JldGVDb21wb25lbnQ7Ci0gICAgdGhpcy5jb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICB0aGlzLmNvbXBvbmVudE5hbWVzcGFjZSA9IGNvbXBvbmVudE5hbWVzcGFjZTsKLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRENvbXBvbmVudCBjb21wdXRlQ29tcG9uZW50KCkKLSAgewotICAgIFhTRENvbXBvbmVudCByZXN1bHQgPSBudWxsOwotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICBYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlID0gbnVsbDsKLQotICAgIC8vIGxldHMgc2VlIGlmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgdmlzaWJsZSB0byBvdXIgc2NoZW1hCi0gICAgcmVzdWx0ID0gZ2V0RGVmaW5lZENvbXBvbmVudChzY2hlbWEsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVzcGFjZSk7Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIFRPRE8gKGNzKSB3ZSBuZWVkIHRvIHByb3ZpZGUgYSBzZXBhcmF0ZSBjb21tYW5kIHRvIGRvIHRoaXMgcGFydAotICAgICAgLy8KLSAgICAgIC8vIGFwcGFyZW50bHkgdGhlIGVsZW1lbnQgaXMgbm90IHlldCB2aXNpYmxlLCB3ZSBuZWVkIHRvIGFkZAotICAgICAgLy8gaW5jbHVkZXMvaW1wb3J0cyB0byBnZXQgdG8gaXQKLSAgICAgIGlmIChjb21wb25lbnROYW1lc3BhY2UgIT0gbnVsbCAmJiBjb21wb25lbnROYW1lc3BhY2UuZXF1YWxzKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIGFuIGluY2x1ZGUKLSAgICAgICAgLy8gaWYgdGhlIGNvbXBvbmVudCdzIG5hbWVzcGFjZSBpcyBub3QgbnVsbCBhbmQgbWF0Y2hlcyB0aGUgc2NoZW1hJ3MKLSAgICAgICAgLy8gdGFyZ2V0IG5hbWVzcGFjZQotICAgICAgICBkaXJlY3RpdmUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RJbmNsdWRlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wb25lbnROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgYW4gaW5jbHVkZQotICAgICAgICAvLyBpZiB0aGUgY29tcG9uZW50J3MgbmFtZXNwYWNlIGlzIG51bGwsIHRoZW4gd2UgY2FuIGp1c3QgYWRkIGl0Ci0gICAgICAgIC8vIG9ubHkgaWYgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIGlzIG5vdCBudWxsCi0gICAgICAgIGRpcmVjdGl2ZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREluY2x1ZGUoKTsKLQotICAgICAgICAvLyB3ZSBoYXZlIHRvIGVuc3VyZSB0aGUgc2NoZW1hIGZvciBzY2hlbWEgcHJlZml4IGlzIE5PVCBudWxsCi0gICAgICAgIGlmIChzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRhcmdldE5TID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgIGlmICh0YXJnZXROUyA9PSBudWxsKQotICAgICAgICAgICAgdGFyZ2V0TlMgPSAiIjsKLSAgICAgICAgICAvLyB0aGlzIHdpbGwganVzdCB1cGRhdGUgdGhlIHNjaGVtYSBmb3Igc2NoZW1hIHByZWZpeCB0byBiZSwgc2F5LCB4c2QKLSAgICAgICAgICBVcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQoIiIsIHNjaGVtYSwgIiIsIHRhcmdldE5TKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhbiBpbXBvcnQKLSAgICAgICAgWFNESW1wb3J0IHhzZEltcG9ydCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREltcG9ydCgpOwotICAgICAgICB4c2RJbXBvcnQuc2V0TmFtZXNwYWNlKGNvbXBvbmVudE5hbWVzcGFjZSk7Ci0gICAgICAgIGRpcmVjdGl2ZSA9IHhzZEltcG9ydDsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIGxvY2F0aW9uID0gY29tcHV0ZU5pY2VMb2NhdGlvbihzY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKSwgZmlsZSk7Ci0gICAgICBkaXJlY3RpdmUuc2V0U2NoZW1hTG9jYXRpb24obG9jYXRpb24pOwotICAgICAgLy8gVE9ETyAoY3MpIHdlIHNob3VsZCBhdCB0aGUgZGlyZWN0aXZlICduZXh0JyBpbiB0aGUgbGlzdCBvZiBkaXJlY3RpdmVzCi0gICAgICAvLyBmb3Igbm93IEknbSBqdXN0IGFkZGluZyBhcyB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIHNjaGVtYSA6LSgKLSAgICAgIC8vCi0gICAgICBzY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoMCwgZGlyZWN0aXZlKTsKLSAgICAgIFhTRFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGRpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwbGF0Zm9ybUxvY2F0aW9uID0gInBsYXRmb3JtOi9yZXNvdXJjZSIgKyBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIFJlc291cmNlIHJlc291cmNlID0gY29uY3JldGVDb21wb25lbnQuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHBsYXRmb3JtTG9jYXRpb24pKTsKLSAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgWFNEUmVzb3VyY2VJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzb3VyY2UubG9hZChudWxsKTsKLSAgICAgICAgICAgIFhTRFJlc291cmNlSW1wbCByZXNvdXJjZUltcGwgPSAoWFNEUmVzb3VyY2VJbXBsKSByZXNvdXJjZTsKLSAgICAgICAgICAgIHJlc29sdmVkU2NoZW1hID0gcmVzb3VyY2VJbXBsLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRpcmVjdGl2ZS5zZXRSZXNvbHZlZFNjaGVtYShyZXNvbHZlZFNjaGVtYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RGVmaW5lZENvbXBvbmVudChyZXNvbHZlZFNjaGVtYSwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZXNwYWNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETyAoY3MpIGNvbnNpZGVyIHNldHRpbmcgc29tZSBlcnJvciBzdGF0ZSBzbyB0aGF0IHRoZSBjbGllbnQgY2FuCi0gICAgICAgIC8vIHByb3ZpZGUgYSBwb3AtZGlhbG9nIGVycm9yCi0gICAgICAgIC8vIHdlIHNob3VsZCBhbHNvIHJlbW92ZSB0aGUgaW1wb3J0L2luY2x1ZGUgc28gc2F2ZSBmcm9tIGNsdXR0ZXJpbmcKLSAgICAgICAgLy8gdGhlIGZpbGUgd2l0aCBib2d1cyBkaXJlY3RpdmVzCi0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX1JFU09VUkNFX1BSRUZJWCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiOwotICBwcml2YXRlIFN0cmluZyBjb21wdXRlTmljZUxvY2F0aW9uKFN0cmluZyBiYXNlTG9jYXRpb24sIElGaWxlIGZpbGUpCi0gIHsgICAgIAotICAgIGlmIChiYXNlTG9jYXRpb24uc3RhcnRzV2l0aChQTEFURk9STV9SRVNPVVJDRV9QUkVGSVgpKQotICAgIHsKLSAgICAgIFVSSSBiYXNlVVJJID0gVVJJLmNyZWF0ZVVSSShiYXNlTG9jYXRpb24pOwotICAgICAgVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICBVUkkgcmVsYXRpdmUgPSBmaWxlVVJJLmRlcmVzb2x2ZShiYXNlVVJJLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7ICAgICAgCi0gICAgICByZXR1cm4gcmVsYXRpdmUudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFVSSSBiYXNlVVJJID0gVVJJLmNyZWF0ZVVSSShiYXNlTG9jYXRpb24pOyAgICAgICAgICAKLSAgICAgIFVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICBVUkkgcmVsYXRpdmUgPSBmaWxlVVJJLmRlcmVzb2x2ZShiYXNlVVJJLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7ICAgICAKLSAgICAgIHJldHVybiByZWxhdGl2ZS50b1N0cmluZygpOyAgICAKLSAgICB9IAotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFhTRENvbXBvbmVudCBnZXREZWZpbmVkQ29tcG9uZW50KFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlKTsKLQotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb250ZW50TW9kZWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVDb250ZW50TW9kZWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTU2MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29udGVudE1vZGVsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVDb250ZW50TW9kZWxDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwOwotICBYU0RDb21wb3NpdG9yIG9sZFhTRENvbXBvc2l0b3IsIG5ld1hTRENvbXBvc2l0b3I7Ci0gIAotICAKLSAgcHVibGljIFVwZGF0ZUNvbnRlbnRNb2RlbENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAsIFhTRENvbXBvc2l0b3IgeHNkQ29tcG9zaXRvcikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZE1vZGVsR3JvdXAgPSB4c2RNb2RlbEdyb3VwOwotICAgIHRoaXMubmV3WFNEQ29tcG9zaXRvciA9IHhzZENvbXBvc2l0b3I7Ci0gICAgdGhpcy5vbGRYU0RDb21wb3NpdG9yID0geHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCk7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RNb2RlbEdyb3VwLmdldEVsZW1lbnQoKSk7Ci0gICAgICB4c2RNb2RlbEdyb3VwLnNldENvbXBvc2l0b3IobmV3WFNEQ29tcG9zaXRvcik7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICB4c2RNb2RlbEdyb3VwLnNldENvbXBvc2l0b3Iob2xkWFNEQ29tcG9zaXRvcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YWViNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZCBleHRlbmRzIFVwZGF0ZUNvbXBvbmVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kCi17Ci0gIHB1YmxpYyBVcGRhdGVFbGVtZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlLCBJRmlsZSBmaWxlKQotICB7Ci0gICAgc3VwZXIoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVzcGFjZSwgZmlsZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEQ29tcG9uZW50IGdldERlZmluZWRDb21wb25lbnQoWFNEU2NoZW1hIHNjaGVtYSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24oY29tcG9uZW50TmFtZXNwYWNlLCBjb21wb25lbnROYW1lKTsKLSAgICBpZiAocmVzdWx0LmVDb250YWluZXIoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RDb21wb25lbnQgZWxlbWVudERlZiA9IGNvbXB1dGVDb21wb25lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50RGVmICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0UsIChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbmNyZXRlQ29tcG9uZW50LAotICAgICAgICAgICAgKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudERlZik7Ci0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjUyNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50LCByZWY7Ci0KLSAgcHVibGljIFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQsIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZWYpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB0aGlzLnJlZiA9IHJlZjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoZWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgZWxlbWVudC5zZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbihyZWYpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWF4T2NjdXJzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWF4T2NjdXJzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDkwNTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU1heE9jY3Vyc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotCXByaXZhdGUgaW50IG9sZE1heE9jY3VyczsKLQlwcml2YXRlIGludCBuZXdNYXhPY2N1cnM7Ci0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVNYXhPY2N1cnNBdHRyaWJ1dGU7Ci0JCi0JWFNEUGFydGljbGUgcGFydGljbGU7Ci0KLSAgcHVibGljIFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSwgaW50IE1heE9jY3VycykKLQl7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJdGhpcy5uZXdNYXhPY2N1cnMgPSBNYXhPY2N1cnM7Ci0JCXRoaXMucGFydGljbGUgPSBwYXJ0aWNsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0JewotICAgIHRyeQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IHBhcnRpY2xlLmdldEVsZW1lbnQoKTsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgU3RyaW5nIGN1cnJlbnRNYXggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICByZW1vdmVNYXhPY2N1cnNBdHRyaWJ1dGUgPSAoY3VycmVudE1heCA9PSBudWxsKT8gdHJ1ZTogZmFsc2U7Ci0JCSAgb2xkTWF4T2NjdXJzID0gcGFydGljbGUuZ2V0TWF4T2NjdXJzKCk7Ci0JCSAgcGFydGljbGUuc2V0TWF4T2NjdXJzKG5ld01heE9jY3Vycyk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZG8oKQotCXsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bmRvKCkKLQl7Ci0gICAgaWYgKHJlbW92ZU1heE9jY3Vyc0F0dHJpYnV0ZSkKLSAgICB7Ci0gICAgICBwYXJ0aWNsZS51bnNldE1heE9jY3VycygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCQkgIHBhcnRpY2xlLnNldE1heE9jY3VycyhvbGRNYXhPY2N1cnMpOwotICAgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVNaW5PY2N1cnNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVNaW5PY2N1cnNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NDUyM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWluT2NjdXJzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNaW5PY2N1cnNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBpbnQgb2xkTWluT2NjdXJzOwotICBwcml2YXRlIGludCBuZXdNaW5PY2N1cnM7Ci0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVNaW5PY2N1cnNBdHRyaWJ1dGU7Ci0KLSAgWFNEQ29tcG9uZW50IGNvbXBvbmVudDsKLQotICBwdWJsaWMgVXBkYXRlTWluT2NjdXJzQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbXBvbmVudCBjb21wb25lbnQsIGludCBtaW5PY2N1cnMpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5uZXdNaW5PY2N1cnMgPSBtaW5PY2N1cnM7Ci0gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICBTdHJpbmcgY3VycmVudE1pbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgIHJlbW92ZU1pbk9jY3Vyc0F0dHJpYnV0ZSA9IChjdXJyZW50TWluID09IG51bGwpID8gdHJ1ZSA6IGZhbHNlOwotCi0gICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIG9sZE1pbk9jY3VycyA9ICgoWFNEUGFydGljbGUpIGNvbXBvbmVudCkuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICgoWFNEUGFydGljbGUpIGNvbXBvbmVudCkuc2V0TWluT2NjdXJzKG5ld01pbk9jY3Vycyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIG9sZE1pbk9jY3VycyA9ICgoKFhTREF0dHJpYnV0ZVVzZSkgY29tcG9uZW50KS5nZXRVc2UoKSA9PSBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5SRVFVSVJFRF9MSVRFUkFMID8gMSA6IDApOwotICAgICAgICBpZiAobmV3TWluT2NjdXJzID09IDEpCi0gICAgICAgICAgKChYU0RBdHRyaWJ1dGVVc2UpIGNvbXBvbmVudCkuc2V0VXNlKFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5LlJFUVVJUkVEX0xJVEVSQUwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgKChYU0RBdHRyaWJ1dGVVc2UpIGNvbXBvbmVudCkuc2V0VXNlKFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Lk9QVElPTkFMX0xJVEVSQUwpOwotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgewotICAgICAgaWYgKHJlbW92ZU1pbk9jY3Vyc0F0dHJpYnV0ZSkKLSAgICAgIHsKLSAgICAgICAgKChYU0RQYXJ0aWNsZSkgY29tcG9uZW50KS51bnNldE1pbk9jY3VycygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAoKFhTRFBhcnRpY2xlKSBjb21wb25lbnQpLnNldE1pbk9jY3VycyhvbGRNaW5PY2N1cnMpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgewotICAgICAgaWYgKHJlbW92ZU1pbk9jY3Vyc0F0dHJpYnV0ZSkKLSAgICAgIHsKLSAgICAgICAgKChYU0RQYXJ0aWNsZSkgY29tcG9uZW50KS51bnNldE1pbk9jY3VycygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAob2xkTWluT2NjdXJzID09IDEpCi0gICAgICAgICAgKChYU0RBdHRyaWJ1dGVVc2UpIGNvbXBvbmVudCkuc2V0VXNlKFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5LlJFUVVJUkVEX0xJVEVSQUwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgKChYU0RBdHRyaWJ1dGVVc2UpIGNvbXBvbmVudCkuc2V0VXNlKFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Lk9QVElPTkFMX0xJVEVSQUwpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTmFtZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU5hbWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMGE3YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTmFtZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5QZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5YTUxSZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5SZW5hbWVDb21wb25lbnRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZU5hbWVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLS8vICBwcml2YXRlIFN0cmluZyBvbGROYW1lOwotICBwcml2YXRlIFN0cmluZyBuZXdOYW1lOwotICBwcml2YXRlIFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudDsKLQotICBwdWJsaWMgVXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotCi0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiBjb21wb25lbnQuZ2V0TmFtZSgpID09IG51bGwgJiYgY29tcG9uZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50ICYmICgoWFNETmFtZWRDb21wb25lbnQpIGNvbXBvbmVudC5lQ29udGFpbmVyKCkpLmdldE5hbWUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgY29tcG9uZW50LmVDb250YWluZXIoKTsKLSAgICB9Ci0KLSAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICB0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotLy8gICAgdGhpcy5vbGROYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjZXhlY3V0ZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgcmVuYW1lQ29tcG9uZW50KG5ld05hbWUpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogUGVyZm9ybXMgYSByZW5hbWUgcmVmYWN0b3JpbmcgdG8gcmVuYW1lIHRoZSBjb21wb25lbnQgYW5kIGFsbCB0aGUKLSAgICogcmVmZXJlbmNlcyB0byBpdCB3aXRoaW4gdGhlIGN1cnJlbnQgc2NoZW1hLgotICAgKiAKLSAgICogQHBhcmFtIG5ld05hbWUgdGhlIG5ldyBjb21wb25lbnQgbmFtZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCByZW5hbWVDb21wb25lbnQoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICAvLyB0aGlzIGlzIGEgJ2dsb2JhbGx5JyBkZWZpbmVkIGNvbXBvbmVudCAoZS5nLiBnbG9iYWwgZWxlbWVudCkgICAgCi0gICAgaWYgKGNvbXBvbmVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpCi0gICAgICAgICAgewotICAgICAgICAgICAgUmVmYWN0b3JpbmdDb21wb25lbnQgcmVmYWN0b3JpbmdDb21wb25lbnQgPSBuZXcgWE1MUmVmYWN0b3JpbmdDb21wb25lbnQoCi0gICAgICAgICAgICAgIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgKElET01FbGVtZW50KWNvbXBvbmVudC5nZXRFbGVtZW50KCksIAotICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCi0gICAgICAgICAgICBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcihyZWZhY3RvcmluZ0NvbXBvbmVudCwgbmV3TmFtZSwgdHJ1ZSk7ICAgIAotICAgICAgICAgICAgUmVuYW1lUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLSAgICAgICAgICAgIFBlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFBlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb24ocmVmYWN0b3JpbmcpOwotICAgICAgICAgICAgb3BlcmF0aW9uLnJ1bihudWxsKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFdlIGNhbid0IHJlZmFjdG9yIHJlbmFtZSBleHRlcm5hbCBmaWxlcwotICAgICAgICAgICAgY29tcG9uZW50LnNldE5hbWUobmV3TmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gdGhpcyBpcyBhICdsb2NhbGx5JyBkZWZpbmVkIGNvbXBvbmVudCAoZS5nLiBsb2NhbCBlbGVtZW50KQotICAgICAgLy8gbm8gbmVlZCB0byBjYWxsIHJlZmFjdG9yaW5nIHNpbmNlIHRoaXMgY29tcG9uZW50IGNhbid0IGJlIHJlZmVyZW5jZWQgICAgICAKLSAgICAgIGNvbXBvbmVudC5zZXROYW1lKG5ld05hbWUpOwotICAgIH0gIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDc5MWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLm5zZWRpdC5UYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmV3UHJlZml4LCBuZXdUYXJnZXROYW1lc3BhY2U7Ci0gIAotICBwdWJsaWMgVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2NoZW1hIHhzZFNjaGVtYSwgU3RyaW5nIG5ld1ByZWZpeCwgU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLm5ld1ByZWZpeCA9IG5ld1ByZWZpeDsKLSAgICB0aGlzLm5ld1RhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgZW5zdXJlU2NoZW1hRWxlbWVudCh4c2RTY2hlbWEpOwotICAgIAotICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy9Eb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0KLSAgICAgIFN0cmluZyBtb2RlbFRhcmdldE5hbWVzcGFjZSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIFN0cmluZyBvbGROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgU3RyaW5nIG9sZFByZWZpeCA9IGhlbHBlci5nZXRQcmVmaXgoZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpLCBmYWxzZSk7Ci0KLSAgICAgIGlmIChtb2RlbFRhcmdldE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBtb2RlbFRhcmdldE5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBuZXdUYXJnZXROYW1lc3BhY2UudHJpbSgpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IG5ld1ByZWZpeC50cmltKCk7Ci0KLSAgICAgIGlmICghdmFsaWRhdGVQcmVmaXgocHJlZml4KSB8fCAhdmFsaWRhdGVUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCAmJiB0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gY2FuJ3QgaGF2ZSBibGFuayB0YXJnZXRuYW1lc3BhY2UgYW5kIHlldCBzcGVjaWZ5IGEgcHJlZml4Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy9kb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVEFSR0VUTkFNRVNQQUNFX0NIQU5HRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYmVnaW5SZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyB4c2RGb3JYU0RQcmVmaXggPSB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKTsKLSAgICAgIE1hcCBtYXAgPSB4c2RTY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotCi0gICAgICAvLyBDaGVjayBpZiBwcmVmaXggaXMgYmxhbmsKLSAgICAgIC8vIGlmIGl0IGlzLCB0aGVuIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgcHJlZml4Ci0gICAgICAvLyBmb3Igc2NoZW1hIGZvciBzY2hlbWEKLSAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgcHJlZml4IGZvciBzY2hlbWEgZm9yIHNjaGVtYSBpcyBibGFuawotICAgICAgICAvLyB0aGVuIHNldCBpdCB0byB2YWx1ZSBzcGVjaWZpZWQgaW4gcHJlZmVyZW5jZQotICAgICAgICAvLyBhbmQgdXBkYXRlIEFMTCBub2RlcyB3aXRoIHRoaXMgcHJlZml4Ci0gICAgICAgIGlmICh4c2RGb3JYU0RQcmVmaXggPT0gbnVsbCB8fCAoeHNkRm9yWFNEUHJlZml4ICE9IG51bGwgJiYgeHNkRm9yWFNEUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGdldCBwcmVmZXJlbmNlIHByZWZpeAotICAgICAgICAgIHhzZEZvclhTRFByZWZpeCA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYTUxTY2hlbWFQcmVmaXgoKTsKLSAgICAgICAgICAvLyBnZXQgYSB1bmlxdWUgcHJlZml4IGJ5IGNoZWNraW5nIHdoYXQncyBpbiB0aGUgbWFwCi0KLSAgICAgICAgICB4c2RGb3JYU0RQcmVmaXggPSBnZXRVbmlxdWVTY2hlbWFGb3JTY2hlbWFQcmVmaXgoeHNkRm9yWFNEUHJlZml4LCBtYXApOwotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgeHNkRm9yWFNEUHJlZml4LCBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICB1cGRhdGVBbGxOb2RlcyhlbGVtZW50LCB4c2RGb3JYU0RQcmVmaXgpOwotCi0gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBvbGQgeG1sbnMgYXR0cmlidXRlIGZvciB0aGUgc2NoZW1hIGZvciBzY2hlbWEKLSAgICAgICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInhtbG5zIikgIT0gbnVsbCAmJiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ4bWxucyIpLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZS5sZW5ndGgoKSA+IDAgfHwgKHRhcmdldE5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwICYmIHByZWZpeC5sZW5ndGgoKSA9PSAwKSkKLSAgICAgIHsKLSAgICAgICAgLy8gY2xlYW4gdXAgdGhlIG9sZCBwcmVmaXggZm9yIHRoaXMgc2NoZW1hCi0gICAgICAgIGlmIChvbGRQcmVmaXggIT0gbnVsbCAmJiBvbGRQcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zOiIgKyBvbGRQcmVmaXgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgLy8gZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgLy8gamF2YS51dGlsLk1hcCBwcmVmaXhUb05hbWVTcGFjZU1hcCA9Ci0gICAgICAgICAgLy8geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgICAvLyBwcmVmaXhUb05hbWVTcGFjZU1hcC5yZW1vdmUob2xkUHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIGlmIG5vIHByZWZpeAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ4bWxucyIpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ4bWxucyIpLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxucyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBpZiAoIW1vZGVsVGFyZ2V0TmFtZXNwYWNlLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbm93IHNldCB0aGUgbmV3IHhtbG5zOnByZWZpeCBhdHRyaWJ1dGUKLSAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwgdGFyZ2V0TmFtZXNwYWNlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxucyIsIHRhcmdldE5hbWVzcGFjZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICAvLyBzZXQgdGhlIHRhcmdldE5hbWVzcGFjZSBhdHRyaWJ1dGUKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIC8vIGVsc2UgdGFyZ2V0TmFtZXNwYWNlIGlzIGJsYW5rCi0gICAgICB7Ci0gICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBkbyBvdXIgb3duIHJlZmVyZW50aWFsIGludGVncml0eQotICAgICAgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciB0YXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIoeHNkU2NoZW1hLCBvbGROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICB0YXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyLnJlc29sdmUoKTsKLQotICAgICAgdXBkYXRlRWxlbWVudCh4c2RTY2hlbWEpOwotCi0gICAgICAvL2RvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLSAgCi0gIC8vIGlzc3VlIChjcykgSSBkb24ndCBoYXZlIGEgY2x1ZSB3aHkgd2UgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlRWxlbWVudChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXApCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXAudXBkYXRlRWxlbWVudCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBjb250YWlubWVudHMgPSBjb25jcmV0ZUNvbXAuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBjb250YWlubWVudHMuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEVSZWZlcmVuY2UgZVJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKWNvbnRhaW5tZW50cy5uZXh0KCk7Ci0gICAgICAgIGlmIChlUmVmZXJlbmNlLmlzQ29udGFpbm1lbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChlUmVmZXJlbmNlLmlzTWFueSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3Igb2JqZWN0cyA9ICgoQ29sbGVjdGlvbiljb25jcmV0ZUNvbXAuZUdldChlUmVmZXJlbmNlKSkuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqZWN0cy5uZXh0KCk7Ci0gICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkQ29uY3JldGVDb21wb25lbnQudXBkYXRlRWxlbWVudCgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHt9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCljb25jcmV0ZUNvbXAuZUdldChlUmVmZXJlbmNlKTsKLSAgICAgICAgICAgIGlmICh4c2RDb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZENvbmNyZXRlQ29tcG9uZW50LnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7fQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAgIAotICBwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVTY2hlbWFGb3JTY2hlbWFQcmVmaXgoU3RyaW5nIHhzZEZvclhTRFByZWZpeCwgTWFwIG1hcCkKLSAgewotICAgIGlmICh4c2RGb3JYU0RQcmVmaXggPT0gbnVsbCB8fCAoeHNkRm9yWFNEUHJlZml4ICE9IG51bGwgJiYgeHNkRm9yWFNEUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLSAgICB7Ci0gICAgICB4c2RGb3JYU0RQcmVmaXggPSAieHNkIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAvLyBlbnN1cmUgcHJlZml4IGlzIHVuaXF1ZQotICAgIGludCBwcmVmaXhFeHRlbnNpb24gPSAxOwotICAgIHdoaWxlIChtYXAuY29udGFpbnNLZXkoeHNkRm9yWFNEUHJlZml4KSAmJiBwcmVmaXhFeHRlbnNpb24gPCAxMDApCi0gICAgewotICAgICAgeHNkRm9yWFNEUHJlZml4ID0geHNkRm9yWFNEUHJlZml4ICsgU3RyaW5nLnZhbHVlT2YocHJlZml4RXh0ZW5zaW9uKTsKLSAgICAgIHByZWZpeEV4dGVuc2lvbisrOwotICAgIH0KLSAgICByZXR1cm4geHNkRm9yWFNEUHJlZml4OwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUFsbE5vZGVzKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIGVsZW1lbnQuc2V0UHJlZml4KHByZWZpeCk7Ci0gICAgTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgY2hpbGQgPSBsaXN0Lml0ZW0oaSk7Ci0gICAgICAgIGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGNoaWxkLnNldFByZWZpeChwcmVmaXgpOwotICAgICAgICAgIGlmIChjaGlsZC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQWxsTm9kZXMoKEVsZW1lbnQpIGNoaWxkLCBwcmVmaXgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVRhcmdldE5hbWVzcGFjZShTdHJpbmcgbnMpCi0gIHsKLSAgICAvLyB3aWxsIGFsbG93IGJsYW5rIG5hbWVzcGFjZSAhIQotICAgIGlmIChucy5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJJIHRlc3RVUkkgPSBuZXcgVVJJKG5zKTsKLSAgICAgIHRlc3RVUkkuaXNBYnNvbHV0ZSgpOwotICAgIH0KLSAgICBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZXJyb3JNZXNzYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1dBUk5fSU5WQUxJRF9UQVJHRVRfTkFNRVNQQUNFIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgewotICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKCIiKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIFhNTENoYXIuaXNWYWxpZE5DTmFtZShwcmVmaXgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWRvKCkKLSAgewotICAgIGV4ZWN1dGUoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1Y2VhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heEV4Y2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhJbmNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluRXhjbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkluY2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlOwotICBTdHJpbmcgbWF4LCBtaW47Ci0gIGJvb2xlYW4gaW5jbHVkZU1pbiwgaW5jbHVkZU1heDsKLSAgcHJpdmF0ZSBib29sZWFuIGRvVXBkYXRlTWF4ID0gZmFsc2UsIGRvVXBkYXRlTWluID0gZmFsc2U7Ci0gIFhTRE1pbkluY2x1c2l2ZUZhY2V0IG1pbkluY2x1c2l2ZUZhY2V0OwotICBYU0RNaW5FeGNsdXNpdmVGYWNldCBtaW5FeGNsdXNpdmVGYWNldDsKLSAgWFNETWF4SW5jbHVzaXZlRmFjZXQgbWF4SW5jbHVzaXZlRmFjZXQ7Ci0gIFhTRE1heEV4Y2x1c2l2ZUZhY2V0IG1heEV4Y2x1c2l2ZUZhY2V0OwotCi0KLSAgcHVibGljIFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlLCBib29sZWFuIGluY2x1ZGVNaW4sIGJvb2xlYW4gaW5jbHVkZU1heCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNpbXBsZVR5cGUgPSB4c2RTaW1wbGVUeXBlOwotICAgIHRoaXMuaW5jbHVkZU1pbiA9IGluY2x1ZGVNaW47Ci0gICAgdGhpcy5pbmNsdWRlTWF4ID0gaW5jbHVkZU1heDsKLSAgICAKLSAgICBtaW5JbmNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0TWluSW5jbHVzaXZlRmFjZXQoKTsKLSAgICBtaW5FeGNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0TWluRXhjbHVzaXZlRmFjZXQoKTsKLSAgICBtYXhJbmNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKTsKLSAgICBtYXhFeGNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0TWF4RXhjbHVzaXZlRmFjZXQoKTsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TWluKFN0cmluZyBtaW4pCi0gIHsKLSAgICB0aGlzLm1pbiA9IG1pbjsKLSAgICBkb1VwZGF0ZU1pbiA9IHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1heChTdHJpbmcgbWF4KQotICB7Ci0gICAgdGhpcy5tYXggPSBtYXg7Ci0gICAgZG9VcGRhdGVNYXggPSB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RTaW1wbGVUeXBlLmdldEVsZW1lbnQoKSk7Ci0KLSAgICAgIGlmIChkb1VwZGF0ZU1pbikKLSAgICAgIHsKLSAgICAgICAgaWYgKGluY2x1ZGVNaW4pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWluSW5jbHVzaXZlRmFjZXQgPT0gbnVsbCAmJiBtaW4gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5JbmNsdXNpdmVGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgICAgICAgICBtaW5JbmNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5JbmNsdXNpdmVGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChtaW5FeGNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluRXhjbHVzaXZlRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtaW5JbmNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1pbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbkluY2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtaW5JbmNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1pbiA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtaW5JbmNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gIWluY2x1ZGVNaW4KLSAgICAgICAgewotICAgICAgICAgIGlmIChtaW5FeGNsdXNpdmVGYWNldCA9PSBudWxsICYmIG1pbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbkV4Y2x1c2l2ZUZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWluRXhjbHVzaXZlRmFjZXQoKTsKLSAgICAgICAgICAgIG1pbkV4Y2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1pbkV4Y2x1c2l2ZUZhY2V0KTsKLQotICAgICAgICAgICAgaWYgKG1pbkluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtaW5JbmNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG1pbkV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwgJiYgbWluICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWluRXhjbHVzaXZlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG1pbkV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwgJiYgbWluID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkV4Y2x1c2l2ZUZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGRvVXBkYXRlTWF4KQotICAgICAgewotICAgICAgICBpZiAoaW5jbHVkZU1heCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtYXhJbmNsdXNpdmVGYWNldCA9PSBudWxsICYmIG1heCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heEluY2x1c2l2ZUZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWF4SW5jbHVzaXZlRmFjZXQoKTsKLSAgICAgICAgICAgIG1heEluY2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1heEluY2x1c2l2ZUZhY2V0KTsKLQotICAgICAgICAgICAgaWYgKG1heEV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhFeGNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwgJiYgbWF4ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF4SW5jbHVzaXZlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwgJiYgbWF4ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1heEluY2x1c2l2ZUZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAvLyAhaW5jbHVkZU1heAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1heEV4Y2x1c2l2ZUZhY2V0ID09IG51bGwgJiYgbWF4ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF4RXhjbHVzaXZlRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNYXhFeGNsdXNpdmVGYWNldCgpOwotICAgICAgICAgICAgbWF4RXhjbHVzaXZlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWF4RXhjbHVzaXZlRmFjZXQpOwotCi0gICAgICAgICAgICBpZiAobWF4SW5jbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1heEluY2x1c2l2ZUZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobWF4RXhjbHVzaXZlRmFjZXQgIT0gbnVsbCAmJiBtYXggIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhFeGNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobWF4RXhjbHVzaXZlRmFjZXQgIT0gbnVsbCAmJiBtYXggPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4RXhjbHVzaXZlRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3JtYXRDaGlsZCh4c2RTaW1wbGVUeXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlNzhlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heExlbmd0aEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5MZW5ndGhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlOwotICBTdHJpbmcgbWF4LCBtaW47Ci0gIHByaXZhdGUgYm9vbGVhbiBkb1VwZGF0ZU1heCA9IGZhbHNlLCBkb1VwZGF0ZU1pbiA9IGZhbHNlOwotCi0gIHB1YmxpYyBVcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2ltcGxlVHlwZSA9IHhzZFNpbXBsZVR5cGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1pbihTdHJpbmcgbWluKQotICB7Ci0gICAgdGhpcy5taW4gPSBtaW47Ci0gICAgZG9VcGRhdGVNaW4gPSB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNYXgoU3RyaW5nIG1heCkKLSAgewotICAgIHRoaXMubWF4ID0gbWF4OwotICAgIGRvVXBkYXRlTWF4ID0gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RTaW1wbGVUeXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RMZW5ndGhGYWNldCBsZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0RWZmZWN0aXZlTGVuZ3RoRmFjZXQoKTsKLSAgICAgIFhTRE1pbkxlbmd0aEZhY2V0IG1pbkxlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRFZmZlY3RpdmVNaW5MZW5ndGhGYWNldCgpOwotICAgICAgWFNETWF4TGVuZ3RoRmFjZXQgbWF4TGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldEVmZmVjdGl2ZU1heExlbmd0aEZhY2V0KCk7Ci0KLSAgICAgIFN0cmluZyBjdXJyZW50TGVuZ3RoID0gbnVsbCwgY3VycmVudE1pbiA9IG51bGwsIGN1cnJlbnRNYXggPSBudWxsOwotICAgICAgaWYgKGxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRMZW5ndGggPSBsZW5ndGhGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChtaW5MZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjdXJyZW50TWluID0gbWluTGVuZ3RoRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAobWF4TGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY3VycmVudE1heCA9IG1heExlbmd0aEZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgfQotCi0gICAgICBpZiAoZG9VcGRhdGVNYXggJiYgIWRvVXBkYXRlTWluKQotICAgICAgewotICAgICAgICBpZiAobWF4TGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtYXggIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobWF4LmVxdWFscyhjdXJyZW50TWluKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICBsZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKGxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1heExlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChtaW5MZW5ndGhGYWNldCA9PSBudWxsICYmIGN1cnJlbnRMZW5ndGggIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWluTGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgICBtaW5MZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUoY3VycmVudExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1pbkxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtYXhMZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChjdXJyZW50TWluICE9IG51bGwgJiYgY3VycmVudE1pbi5lcXVhbHMobWF4KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoRmFjZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluTGVuZ3RoRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChjdXJyZW50TGVuZ3RoICE9IG51bGwgJiYgIWN1cnJlbnRMZW5ndGguZXF1YWxzKG1heCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKGxlbmd0aEZhY2V0KTsKLQotICAgICAgICAgICAgaWYgKG1heCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtYXhMZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1heExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgIG1heExlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtaW5MZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICBtaW5MZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUoY3VycmVudExlbmd0aCk7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWluTGVuZ3RoRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShsZW5ndGhGYWNldCk7Ci0KLSAgICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNaW5MZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICBtaW5MZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUoY3VycmVudExlbmd0aCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5MZW5ndGhGYWNldCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1heExlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWF4TGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgIG1heExlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1heExlbmd0aEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCFkb1VwZGF0ZU1heCAmJiBkb1VwZGF0ZU1pbikKLSAgICAgIHsKLSAgICAgICAgaWYgKG1pbkxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWluICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKG1pbi5lcXVhbHMoY3VycmVudE1heCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgbGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChsZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtaW5MZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKGxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAobWF4TGVuZ3RoRmFjZXQgPT0gbnVsbCAmJiBjdXJyZW50TGVuZ3RoICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXhMZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1heExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKGN1cnJlbnRMZW5ndGgpOwotICAgICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluTGVuZ3RoRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3VycmVudE1heCAhPSBudWxsICYmIGN1cnJlbnRNYXguZXF1YWxzKG1pbikpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxlbmd0aEZhY2V0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKGxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1heExlbmd0aEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY3VycmVudExlbmd0aCAhPSBudWxsICYmICFjdXJyZW50TGVuZ3RoLmVxdWFscyhtaW4pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShsZW5ndGhGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChtaW4gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNaW5MZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICBtaW5MZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1pbkxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNYXhMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKGN1cnJlbnRMZW5ndGgpOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1heExlbmd0aEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWluTGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1pbkxlbmd0aEZhY2V0KTsKLQotICAgICAgICAgICAgaWYgKGxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShsZW5ndGhGYWNldCk7Ci0KLSAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNYXhMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICBtYXhMZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUoY3VycmVudExlbmd0aCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3JtYXRDaGlsZCh4c2RTaW1wbGVUeXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlVGV4dFZhbHVlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlVGV4dFZhbHVlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjYzNjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVRleHRWYWx1ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlRyZWVDb250ZW50SGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIGZyb20gdGhlIGV4dGVuc2lvbiB2aWV3IHRvIGVkaXQgZXh0ZW5zaW9uIGVsZW1lbnRzCi0gKiBhbmQgd2hpY2ggYXJlIGltcGxlbWVudGVkIGFzIERPTSBvYmplY3RzIChub3QgcGFydCBvZiB0aGUgRU1GIG1vZGVsKQotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlVGV4dFZhbHVlQ29tbWFuZCAgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBFbGVtZW50IGVsZW1lbnQ7Ci0gIFN0cmluZyB2YWx1ZTsKLSAgCi0gIHB1YmxpYyBVcGRhdGVUZXh0VmFsdWVDb21tYW5kKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhlbGVtZW50KTsgICAgICAKLSAgICAgIE5vZGUgdGV4dE5vZGUgPSBudWxsOwotICAgICAgVHJlZUNvbnRlbnRIZWxwZXIgaGVscGVyID0gbmV3IFRyZWVDb250ZW50SGVscGVyKCk7Ci0gICAgICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIAotICAgICAgewotICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmCi0gICAgICAgICAgICAhaGVscGVyLmlzSWdub3JhYmxlVGV4dChub2RlKSkgCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXh0Tm9kZSA9IG5vZGU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gICAgICAgICAKLSAgICAgIH0gICAgICAgCi0gICAgICBpZiAodGV4dE5vZGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGV4dE5vZGUgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiIik7Ci0gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgICAgfSAgCi0gICAgICBoZWxwZXIuc2V0Tm9kZVZhbHVlKHRleHROb2RlLCB2YWx1ZSk7ICAgICAgICAKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVR5cGVSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlVHlwZVJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZDc3YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlVHlwZVJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRERpcmVjdGl2ZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlVHlwZVJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kIGV4dGVuZHMgVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQKLXsKLQotICBwdWJsaWMgVXBkYXRlVHlwZVJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50LAotCQkgIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlLCBJRmlsZSBmaWxlKQotICB7Ci0JICBzdXBlcihjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZXNwYWNlLCBmaWxlKTsKLSAgfQotCi0gIAotICBwcm90ZWN0ZWQgWFNEQ29tcG9uZW50IGdldERlZmluZWRDb21wb25lbnQoWFNEU2NoZW1hIHNjaGVtYSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiByZXN1bHQgPSBzY2hlbWEucmVzb2x2ZVR5cGVEZWZpbml0aW9uKGNvbXBvbmVudE5hbWVzcGFjZSwgY29tcG9uZW50TmFtZSk7Ci0gICAgaWYgKHJlc3VsdC5lQ29udGFpbmVyKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBudWxsOwotICAgIH0gICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgWFNEQ29tcG9uZW50IHRkID0gY29tcHV0ZUNvbXBvbmVudCgpOwotICAgICAgaWYgKHRkICE9IG51bGwgJiYgdGQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudCwgKFhTRFR5cGVEZWZpbml0aW9uKSB0ZCk7Ci0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYTEwNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50OwotICBYU0RUeXBlRGVmaW5pdGlvbiBuZXdUeXBlOwotICAKLSAgcHVibGljIFVwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50LCBYU0RUeXBlRGVmaW5pdGlvbiBuZXdUeXBlKQotICB7Ci0gICAgdGhpcy5jb25jcmV0ZUNvbXBvbmVudCA9IGNvbmNyZXRlQ29tcG9uZW50OwotICAgIHRoaXMubmV3VHlwZSA9IG5ld1R5cGU7Ci0gIH0KLSAgIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0KLSAgICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgY29uY3JldGVDb21wb25lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIHNldEF0dHJpYnV0ZVR5cGUoKFhTREF0dHJpYnV0ZVVzZSkgY29uY3JldGVDb21wb25lbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgc2V0QXR0cmlidXRlVHlwZSgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGNvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VHlwZShYU0RFbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsKLSAgICBlZCA9IGVkLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgaWYgKGVkICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBlZC5zZXRUeXBlRGVmaW5pdGlvbihuZXdUeXBlKTsKLSAgICB9ICAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSkKLSAgewotICAgIHNldEF0dHJpYnV0ZVR5cGUoYXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKQotICB7Ci0gICAgYWQgPSBhZC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgaWYgKGFkICE9IG51bGwgJiYgbmV3VHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGFkLnNldFR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiluZXdUeXBlKTsKLSAgICB9ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDFiNmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhdHRlcm5GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFID0gMjsKLSAgCi0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICBTdHJpbmcgdmFsdWU7Ci0gIGludCBhY3Rpb25UeXBlOwotICBYU0RQYXR0ZXJuRmFjZXQgcGF0dGVyblRvRWRpdDsKLSAgCi0gIHB1YmxpYyBVcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb24sIGludCBhY3Rpb25UeXBlKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgICB0aGlzLmFjdGlvblR5cGUgPSBhY3Rpb25UeXBlOwotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFBhdHRlcm5Ub0VkaXQoWFNEUGF0dGVybkZhY2V0IHBhdHRlcm5Ub0VkaXQpCi0gIHsKLSAgICB0aGlzLnBhdHRlcm5Ub0VkaXQgPSBwYXR0ZXJuVG9FZGl0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgICAgaWYgKGFjdGlvblR5cGUgPT0gQUREKQotICAgICAgewotICAgICAgICBYU0RQYXR0ZXJuRmFjZXQgcGF0dGVybiA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhdHRlcm5GYWNldCgpOwotICAgICAgICBwYXR0ZXJuLnNldExleGljYWxWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEZhY2V0Q29udGVudHMoKS5hZGQocGF0dGVybik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhY3Rpb25UeXBlID09IERFTEVURSkKLSAgICAgIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChwYXR0ZXJuVG9FZGl0KTsKLSAgICAgICAgaWYgKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEZhY2V0Q29udGVudHMoKS5jb250YWlucyhwYXR0ZXJuVG9FZGl0KSkKLSAgICAgICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKHBhdHRlcm5Ub0VkaXQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYWN0aW9uVHlwZSA9PSBVUERBVEUpCi0gICAgICB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwocGF0dGVyblRvRWRpdCk7Ci0gICAgICAgIHBhdHRlcm5Ub0VkaXQuc2V0TGV4aWNhbFZhbHVlKHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGZvcm1hdENoaWxkKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5MmMzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdoaXRlU3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdoaXRlU3BhY2VGYWNldDsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgYm9vbGVhbiBkb0FkZEZhY2V0OwotICAKLSAgcHVibGljIFVwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlLCBib29sZWFuIGRvQWRkRmFjZXQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IHhzZFNpbXBsZVR5cGU7Ci0gICAgdGhpcy5kb0FkZEZhY2V0ID0gZG9BZGRGYWNldDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRFdoaXRlU3BhY2VGYWNldCB3aGl0ZXNwYWNlRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRXaGl0ZVNwYWNlRmFjZXQoKTsKLQotICAgICAgaWYgKGRvQWRkRmFjZXQpCi0gICAgICB7Ci0gICAgICAgIGlmICh3aGl0ZXNwYWNlRmFjZXQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHdoaXRlc3BhY2VGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFdoaXRlU3BhY2VGYWNldCgpOwotICAgICAgICAgIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEZhY2V0Q29udGVudHMoKS5hZGQod2hpdGVzcGFjZUZhY2V0KTsKLSAgICAgICAgfQotICAgICAgICB3aGl0ZXNwYWNlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKFhTRFdoaXRlU3BhY2UuQ09MTEFQU0VfTElURVJBTC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAod2hpdGVzcGFjZUZhY2V0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKHdoaXRlc3BhY2VGYWNldCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZvcm1hdENoaWxkKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvcHJvdmlkZXJzL1hTRFNlY3Rpb25MYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3Byb3ZpZGVycy9YU0RTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjFlNWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvcHJvdmlkZXJzL1hTRFNlY3Rpb25MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5GaWxlU3RvcmVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRFNlY3Rpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIEltYWdlIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgT2JqZWN0IHNlbGVjdGVkID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3QpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNEQmFzZUFkYXB0ZXIgYWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcilYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZCk7Ci0gICAgICAgIHJldHVybiAoKElUcmVlRWxlbWVudClhZGFwdGVyKS5nZXRJbWFnZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKQotICAgIHsKLSAgICAgIHJldHVybiBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9OT19JVEVNU19TRUxFQ1RFRDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotICAgIGJvb2xlYW4gaXNSZWZlcmVuY2UgPSBmYWxzZTsKLSAgICBPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIHNlbGVjdGVkID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3QpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHNlbGVjdGVkOwotICAgICAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1JlZmVyZW5jZSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgc2VsZWN0ZWQpLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1JlZmVyZW5jZSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgc2VsZWN0ZWQpLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1JlZmVyZW5jZSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0ZWQpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNiLmFwcGVuZCgoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3RlZCkuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpKTsKLQotICAgICAgICAgIGlmIChpc1JlZmVyZW5jZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiByZWYiKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvLyBUaGlzIHN0cmluZyBpcyBub3QgZWFzaWx5IHRyYW5zbGF0YWJsZSB0byBvdGhlciBsYW5ndWFnZXMuCi0gICAgICAgICAgICAvLyBGb3Igbm93LCBtYWtlIGl0IGVuZ2xpc2gtb25seSBzaW5jZSB3ZSB1c2UgdGhlIGVsZW1lbnQgdGFnIGFzIHRoZSB0aXRsZSBhbnl3YXkKLS8vICAgICAgICAgICAgc2IuYXBwZW5kKE1lc3NhZ2VzLlVJX1BBR0VfSEVBRElOR19SRUZFUkVOQ0UpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpIHNlbGVjdGVkKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICBib29sZWFuIGlzUmVhZE9ubHkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgaWYgKCEoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0IHx8IGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZVN0b3JlRWRpdG9ySW5wdXQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXNSZWFkT25seSA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGVkaXRvclBhcnQgIT0gbnVsbCAmJiB4c2RTY2hlbWEgIT0gZWRpdG9yUGFydC5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcykgfHwgaXNSZWFkT25seSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICgiICsgTWVzc2FnZXMuVUlfTEFCRUxfUkVBRF9PTkxZICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbnVsbCwgdGhlbiBsZXQncyB1c2UgdGhlIG1vZGVsIG9iamVjdCB0byBmaW5kCi0gICAgICAgICAgLy8gYW4gYXBwcm9wcmlhdGUgbmFtZQotICAgICAgICAgIGlmICgoWFNEQ29uY3JldGVDb21wb25lbnQpIHNlbGVjdGVkIGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICgoWFNETmFtZWRDb21wb25lbnQpc2VsZWN0ZWQpLmdldE5hbWUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3RlZCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gbGFzdCByZXNvcnQuLi4uCi0gICAgICAgICAgcmV0dXJuICIoIiArIE1lc3NhZ2VzLlVJX0xBQkVMX1JFQURfT05MWSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKEVsZW1lbnQpIG9iamVjdCkuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fic3RyYWN0RXh0ZW5zaW9uc1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4MGEyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fic3RyYWN0RXh0ZW5zaW9uc1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZEV4dGVuc2lvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkRPTUV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkRPTUV4dGVuc2lvbkl0ZW1NZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkV4dGVuc2lvbkRldGFpbHNWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLlNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXh0ZW5zaW9uc1NlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIEV4dGVuc2lvbkRldGFpbHNWaWV3ZXIgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlcjsKLSAgcHJvdGVjdGVkIFRyZWVWaWV3ZXIgZXh0ZW5zaW9uVHJlZVZpZXdlcjsKLSAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBleHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcjsKLSAgcHJvdGVjdGVkIExhYmVsIGNvbnRlbnRMYWJlbDsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZWxlbWVudFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLSAgcHJvdGVjdGVkIElEb2N1bWVudENoYW5nZWROb3RpZmllciBkb2N1bWVudENoYW5nZU5vdGlmaWVyOwotICBwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGludGVybmFsTm9kZUFkYXB0ZXIgPSBuZXcgSW50ZXJuYWxOb2RlQWRhcHRlcigpOwotCi0gIHByaXZhdGUgQ29tcG9zaXRlIHBhZ2U7Ci0gIHByb3RlY3RlZCBCdXR0b24gYWRkQnV0dG9uLCByZW1vdmVCdXR0b247Ci0gIHByaXZhdGUgT2JqZWN0IHByZXZJbnB1dDsKLSAgcHJpdmF0ZSBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBwcmV2Q2F0ZWdvcnk7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEFic3RyYWN0RXh0ZW5zaW9uc1NlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICBleHRlbnNpb25EZXRhaWxzVmlld2VyLnNldENvbW1hbmRTdGFjayhnZXRDb21tYW5kU3RhY2soKSk7Ci0gIH0KLSAgCi0gIGNsYXNzIEludGVybmFsTm9kZUFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLSAgewotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICAvLyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkCi0gICAgICAvLyB3ZSBkb24ndCB1c2Ugb2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFzICdzdGFuZGFyZCcgYWRhcHRlcnMKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykKLSAgICB7ICAgICAKLSAgICAgIGJvb2xlYW4gaXNSb290ID0gZmFsc2U7Ci0gICAgICBpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAoaXNUcmVlVmlld2VySW5wdXRFbGVtZW50KChFbGVtZW50KW5vdGlmaWVyKSkvLyBUT0RPCi0gICAgICAgIHsKLSAgICAgICAgICBpc1Jvb3QgPSB0cnVlOwotICAgICAgICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIucmVmcmVzaChleHRlbnNpb25UcmVlVmlld2VyLmdldElucHV0KCkpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIGlmICghaXNSb290KQotICAgICAgeyAgCi0gICAgICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIucmVmcmVzaChub3RpZmllcik7Ci0gICAgICAgIGlmICggbmV3VmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKG5vdGlmaWVyLCAxKTsKLSAgICAgICAgICBleHRlbnNpb25UcmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICB9ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1RyZWVWaWV3ZXJJbnB1dEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBhZGQgYXNzZXJ0aW9uCi0gICAgaWYgKGV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIgPT0gbnVsbCkKLSAgICAgICByZXR1cm47Ci0gICAgCi0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgZG9jdW1lbnRDaGFuZ2VOb3RpZmllciA9IChJRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIpZWRpdG9yLmdldEFkYXB0ZXIoSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyLmNsYXNzKTsKLSAgICAKLSAgICBpZiAoZG9jdW1lbnRDaGFuZ2VOb3RpZmllciAhPSBudWxsKQotICAgIHsKLSAgICAgIGRvY3VtZW50Q2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIoaW50ZXJuYWxOb2RlQWRhcHRlcik7Ci0gICAgfSAgCi0gICAgCi0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIHBhZ2UgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIHBhZ2Uuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHBhZ2Uuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgCi0gICAgU2FzaEZvcm0gc2FzaEZvcm0gPSBuZXcgU2FzaEZvcm0ocGFnZSwgU1dULkhPUklaT05UQUwpOwotICAgIC8vIFRyeSB0byBsaW1pdCB0aGUgaW5pdGlhbCB3aWR0aCBvZiB0aGUgc2VjdGlvbgotICAgIAotICAgIGludCB3ID0gU1dULkRFRkFVTFQ7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQotICAgICAgLy8gRmluZCB0aGUgd2lkdGggb2YgdGhlIFRhYmJlZCBQcm9wZXJ0eSBTaGVldCdzIGNvbXBvc2l0ZSBleGNsdWRpbmcgdGhlIHRhYgotICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KQotICAgICAgewotICAgICAgICBQcm9wZXJ0eVNoZWV0IHNoZWV0ID0gKFByb3BlcnR5U2hlZXQpcGFydDsKLSAgICAgICAgaWYgKHNoZWV0LmdldEN1cnJlbnRQYWdlKCkgaW5zdGFuY2VvZiBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLSAgICAgICAgewotICAgICAgICAgIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFBhZ2UgPSAoVGFiYmVkUHJvcGVydHlTaGVldFBhZ2Upc2hlZXQuZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICAgICAgICBDb21wb3NpdGUgdGFyZ2V0Q29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgICBpZiAodGFiYmVkUGFnZS5nZXRDb250cm9sKCkgaW5zdGFuY2VvZiBDb21wb3NpdGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29tcG9zaXRlIGMgPSAoQ29tcG9zaXRlKXRhYmJlZFBhZ2UuZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgaW50IGxlbmd0aCA9IGMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBDb250cm9sIGN0cmwgPSBjLmdldENoaWxkcmVuKClbaV07Ci0gICAgICAgICAgICAgIGludCBsZW5ndGgyICA9ICgoKENvbXBvc2l0ZSljdHJsKS5nZXRDaGlsZHJlbigpKS5sZW5ndGg7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoMjsgaisrICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoKChDb21wb3NpdGUpY3RybCkuZ2V0Q2hpbGRyZW4oKSlbal0gaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB0YXJnZXRDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSgoKENvbXBvc2l0ZSljdHJsKS5nZXRDaGlsZHJlbigpKVtqXTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAodGFyZ2V0Q29tcG9zaXRlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdyA9IHRhcmdldENvbXBvc2l0ZS5nZXRTaXplKCkueCAtIDIwOyAgLy8gZW5zdXJlIHNjcm9sbGJhcnMgZG9uJ3Qgc2hvdwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBUaGUgYWJvdmUgY2FuIGJlIGFjY29tcGxpc2hlZCBieSB0aGUgZm9sbG93aW5nIGNvZGUKLSAgICAgICAgICAvLyBidXQgYmVjYXVzZSBUYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZSBpcyBpbiBhbiBpbnRlcm5hbCBwYWNrYWdlLCBJIHdpbGwgZ2V0IGEgZGlzY291cmFnZWQKLSAgICAgICAgICAvLyBhY2Nlc3Mgd2FybmluZy4KLSAgICAgICAgICAvLyB3ID0gKChUYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZSkodGFiYmVkUGFnZS5nZXRDb250cm9sKCkpKS5nZXRUYWJDb21wb3NpdGUoKS5nZXRTaXplKCkueDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB3ID0gU1dULkRFRkFVTFQ7Ci0gICAgfQotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAvLyBUaGUgaW5pdGlhbCBzaXplIHNob3VsZCBiZSBzZXQsIG5vdCB0aGUgd2lkdGhIaW50LCB3aGljaCBmb3JjZXMgdGhlIHdpZHRoCi0gICAgLy8gdG8gcmVtYWluIGNvbnN0YW50LgotICAgIHNhc2hGb3JtLnNldFNpemUodywgU1dULkRFRkFVTFQpOwotICAgIHNhc2hGb3JtLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIHNhc2hGb3JtLnNldEZvcmVncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIHNhc2hGb3JtLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHNhc2hGb3JtLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBjaGlsZHJlbltpXS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICB9Ci0gICAgQ29tcG9zaXRlIGxlZnRDb250ZW50ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShzYXNoRm9ybSwgU1dULkZMQVQpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgbGVmdENvbnRlbnQuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgU2VjdGlvbiBzZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24obGVmdENvbnRlbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIpOwotICAgIHNlY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfRVhURU5TSU9OUyk7Ci0gICAgc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgIENvbXBvc2l0ZSB0YWJsZUFuZEJ1dHRvbkNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUobGVmdENvbnRlbnQsIFNXVC5GTEFUKTsKLSAgICB0YWJsZUFuZEJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIHRhYmxlQW5kQnV0dG9uQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsgICAgCi0gICAgCi0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRhYmxlQW5kQnV0dG9uQ29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTElORV9TT0xJRCk7Ci0gICAgTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoKTsgICAgCi0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TWVudShtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKSkpOwotICAgIG1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgRE9NRXh0ZW5zaW9uSXRlbU1lbnVMaXN0ZW5lcihleHRlbnNpb25UcmVlVmlld2VyKSk7Ci0gICAgCi0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgCi0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcik7Ci0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyKTsKLSAgICBlbGVtZW50U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IEVsZW1lbnRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKTsKLSAgICBleHRlbnNpb25UcmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihlbGVtZW50U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLSAgICBleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKS5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCBlKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IG9iaiA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgb2JqOwotICAgICAgICAgICAgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSByZWdpc3RyeSA9IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKTsKLSAgICAgICAgICAgIC8vIEFwcGxpY2F0aW9uU3BlY2lmaWNTY2hlbWFQcm9wZXJ0aWVzW10gcHJvcGVydGllcyA9Ci0gICAgICAgICAgICAvLyByZWdpc3RyeS5nZXRBbGxBcHBsaWNhdGlvblNwZWNpZmljU2NoZW1hUHJvcGVydGllcygpOwotICAgICAgICAgICAgLy8gQXBwbGljYXRpb25TcGVjaWZpY1NjaGVtYVByb3BlcnRpZXNbXSBwcm9wZXJ0aWVzID0KLSAgICAgICAgICAgIC8vIChBcHBsaWNhdGlvblNwZWNpZmljU2NoZW1hUHJvcGVydGllc1tdKQotICAgICAgICAgICAgLy8gcmVnaXN0cnkuZ2V0QWxsQXBwbGljYXRpb25TcGVjaWZpY1NjaGVtYVByb3BlcnRpZXMoKS50b0FycmF5KG5ldwotICAgICAgICAgICAgLy8gQXBwbGljYXRpb25TcGVjaWZpY1NjaGVtYVByb3BlcnRpZXNbMF0pOwotICAgICAgICAgICAgTGlzdCBwcm9wZXJ0aWVzID0gcmVnaXN0cnkuZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oKTsKLQotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHByb3BlcnRpZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgY3VycmVudCA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgcHJvcGVydGllcy5nZXQoaSk7Ci0gICAgICAgICAgICAgIGlmIChjdXJyZW50LmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFRvb2xUaXBUZXh0KGN1cnJlbnQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0pOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRDb250cm9sKCksCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuRVhURU5TSU9OU19UQUJfX0VYVEVOU0lPTlMpOyAKLSAgICAKLSAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZSh0YWJsZUFuZEJ1dHRvbkNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIC8vQ29sdW1uTGF5b3V0IGNvbHVtbkxheW91dCA9IG5ldyBDb2x1bW5MYXlvdXQoKTsKLSAgICAvL2J1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoY29sdW1uTGF5b3V0KTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIAotICAgIGFkZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9XSVRIX0RPVFMsIFNXVC5GTEFUKTsgICAKLSAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGFkZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FWFRFTlNJT05fQ09NUE9ORU5UKTsKLSAgICAvL2FkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBDb2x1bW5MYXlvdXREYXRhKENvbHVtbkxheW91dERhdGEuRklMTCkpOwotICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGFkZEJ1dHRvbiwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5FWFRFTlNJT05TX1RBQl9fQUREKTsgICAgIAotICAgIAotICAgIHJlbW92ZUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURSwgU1dULkZMQVQpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLSAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFX0VYVEVOU0lPTl9DT01QT05FTlQpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVtb3ZlQnV0dG9uLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkVYVEVOU0lPTlNfVEFCX19ERUxFVEUpOyAgIAotICAgIAotICAgIC8vcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEobmV3IENvbHVtbkxheW91dERhdGEoQ29sdW1uTGF5b3V0RGF0YS5GSUxMKSk7Ci0KLSAgICAvLyBUT0RPIChjcykgdW5jb21tZW50IHRoZSB1cC9kb3duIGJ1dHRvbiB3aGVuIHdlIGhhdmUgdGltZSB0byBpbXBsZW1lbnQKLSAgICAvLwotICAgIC8vQnV0dG9uIHVwID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9VUCwgU1dULkZMQVQpOwotICAgIC8vdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgCi0gICAgLy9CdXR0b24gZG93biA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfRE9XTiwgU1dULkZMQVQpOwotICAgIC8vZG93bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgIENvbXBvc2l0ZSByaWdodENvbnRlbnQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHNhc2hGb3JtLCBTV1QuRkxBVCk7Ci0gICAgU2VjdGlvbiBzZWN0aW9uMiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKHJpZ2h0Q29udGVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7Ci0gICAgc2VjdGlvbjIuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfRVhURU5TSU9OX0RFVEFJTFMpOwotICAgIHNlY3Rpb24yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIC8vY29udGVudExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKHJpZ2h0Q29udGVudCwgIkNvbnRlbnQiKTsKLQotICAgIENvbXBvc2l0ZSB0ZXN0Q29tcCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUocmlnaHRDb250ZW50LCBTV1QuRkxBVCk7Ci0KLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDM7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDM7Ci0gICAgcmlnaHRDb250ZW50LnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICByaWdodENvbnRlbnQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5MZWZ0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAzOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAzOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgdGVzdENvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHRlc3RDb21wLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgY3JlYXRlRWxlbWVudENvbnRlbnRXaWRnZXQodGVzdENvbXApOwotCi0gICAgaW50W10gd2VpZ2h0cyA9IHsgNDAsIDYwIH07Ci0gICAgc2FzaEZvcm0uc2V0V2VpZ2h0cyh3ZWlnaHRzKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVsZW1lbnRDb250ZW50V2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBleHRlbnNpb25EZXRhaWxzVmlld2VyID0gbmV3IEV4dGVuc2lvbkRldGFpbHNWaWV3ZXIocGFyZW50LCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotICAgIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBET01FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyKCkpOyAgICAKLSAgICBleHRlbnNpb25EZXRhaWxzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuZ2V0Q29udHJvbCgpLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkVYVEVOU0lPTlNfVEFCX19FWFRFTlNJT05TX0RFVEFJTFMpOyAgIAotICB9Ci0gIAotCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoIHByZXZJbnB1dCA9PSBpbnB1dCkKLSAgICAJICByZXR1cm47Ci0gICAgICBlbHNlCi0gICAgCSAgcHJldklucHV0ID0gaW5wdXQ7Ci0gICAgICAKLSAgICAgIFRyZWUgdHJlZSA9IGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotICAgICAgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgIHRyZWUucmVtb3ZlQWxsKCk7Ci0gICAgICAKLSAgICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgIAotICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICBpZiAodHJlZS5nZXRTZWxlY3Rpb25Db3VudCgpID09IDAgJiYgdHJlZS5nZXRJdGVtQ291bnQoKSA+IDApCi0gICAgICB7ICAgICAgIAotICAgICAgICBUcmVlSXRlbSB0cmVlSXRlbSA9IHRyZWUuZ2V0SXRlbSgwKTsgICAgIAotICAgICAgICBleHRlbnNpb25UcmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0cmVlSXRlbS5nZXREYXRhKCkpKTsKLSAgICAgIH0KLSAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDAgICYmICFpc1JlYWRPbmx5KTsKLSAgICAgIC8vIEJ1Z3ppbGxhIDE5NzMxNS4gIE1ha2UgdGhpcyBidWxsZXRwcm9vZiBmb3IgbWFpbnRlbmFuY2UgcmVsZWFzZS4KLSAgICAgIENvbnRyb2wgZGV0YWlsc1ZpZXdlckNvbnRyb2wgPSBleHRlbnNpb25EZXRhaWxzVmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgIGlmIChkZXRhaWxzVmlld2VyQ29udHJvbCAhPSBudWxsICYmICFkZXRhaWxzVmlld2VyQ29udHJvbC5pc0Rpc3Bvc2VkKCkpCi0gICAgICB7Ci0gICAgICAgIGRldGFpbHNWaWV3ZXJDb250cm9sLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgICAgfQotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9zaXRlIGdldFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHBhZ2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgQWRkRXh0ZW5zaW9uQ29tbWFuZCBnZXRBZGRFeHRlbnNpb25Db21tYW5kKE9iamVjdCBvKTsKLSAgcHJvdGVjdGVkIGFic3RyYWN0IENvbW1hbmQgZ2V0UmVtb3ZlRXh0ZW5zaW9uQ29tbWFuZChPYmplY3Qgbyk7ICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpOwotICAKLSAgcHJvdGVjdGVkIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cgY3JlYXRlQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZygpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksIGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKSk7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IGFkZEJ1dHRvbikKLSAgICB7Ci0gICAgICBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpOwotICAgICAgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBkaWFsb2cgPSBjcmVhdGVBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nKCk7Ci0KLSAgICAgIExpc3QgcHJvcGVydGllcyA9IHJlZ2lzdHJ5LmdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKCk7Ci0KLSAgICAgIGRpYWxvZy5zZXRJbnB1dChwcm9wZXJ0aWVzKTsKLSAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgIGRpYWxvZy5zZXRQcmVmU3RvcmUoIGdldFByZWZTdG9yZSgpICk7Ci0gICAgICAKLSAgICAgIGlmIChwcmV2Q2F0ZWdvcnkgIT0gbnVsbCkKLSAgICAJICBkaWFsb2cuc2V0SW5pdGlhbENhdGVnb3J5U2VsZWN0aW9uKHByZXZDYXRlZ29yeSk7Ci0KLSAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG5ld1NlbGVjdGlvbiA9IG51bGw7ICAgICAgICAgIAotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7ICAgICAgCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGV4dGVuc2lvbnNTY2hlbWFTcGVjID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSByZXN1bHRbMV07Ci0gICAgICAgICAgQWRkRXh0ZW5zaW9uQ29tbWFuZCBhZGRFeHRlbnNpb25Db21tYW5kID0gZ2V0QWRkRXh0ZW5zaW9uQ29tbWFuZChyZXN1bHRbMF0pOwotICAgICAgICAgIGlmIChhZGRFeHRlbnNpb25Db21tYW5kICE9IG51bGwpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBhZGRFeHRlbnNpb25Db21tYW5kLnNldFNjaGVtYVByb3BlcnRpZXMoZXh0ZW5zaW9uc1NjaGVtYVNwZWMpOwotICAgICAgICAgICAgaWYgKGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYWRkRXh0ZW5zaW9uQ29tbWFuZCk7Ci0gICAgICAgICAgICAgIG5ld1NlbGVjdGlvbiA9IGFkZEV4dGVuc2lvbkNvbW1hbmQuZ2V0TmV3T2JqZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vcmVmcmVzaCgpOwotICAgICAgICBpZiAobmV3U2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBleHRlbnNpb25UcmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwcmV2Q2F0ZWdvcnkgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDYXRlZ29yeSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gcmVtb3ZlQnV0dG9uKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIAotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBnZXRSZW1vdmVFeHRlbnNpb25Db21tYW5kKG8pOyAgICAgICAgICAgIAotICAgICAgICBpZiAoZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpKQotICAgIHsKLQotICAgIH0KLSAgfQotCi0gIC8vIFRPRE8gbWFrZSB0aGlzIG9uZSBhbiBhYnN0cmFjdCBtZXRob2QuIFhTREVkaXRvciBhbmQgV1NETEVkaXRvciBzaG91bGQgcmV0dXJuCi0gIC8vIGRpZmVyZW50IElwcmVmZXJlbmNlU3RvcmUgb2JqZWN0cwotICBwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmU3RvcmUoKSB7Ci0JcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKGRvY3VtZW50Q2hhbmdlTm90aWZpZXIgIT0gbnVsbCkKLSAgICAgIGRvY3VtZW50Q2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIoaW50ZXJuYWxOb2RlQWRhcHRlcik7Ci0gIH0KLSAKLQotICBOb2RlIHNlbGVjdGVkTm9kZTsKLQotICBjbGFzcyBFbGVtZW50U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgeyAgIAotICAgICAgYm9vbGVhbiBpc0RlbGV0ZUVuYWJsZWQgPSBmYWxzZTsKLSAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgICBpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPiAwKQotICAgICAgICB7ICAKLSAgICAgICAgICBPYmplY3Qgb2JqID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3RlZE5vZGUgPSAoTm9kZSkgb2JqOwotICAgICAgICAgICAgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5zZXRJbnB1dChvYmopOwotICAgICAgICAgICAgaXNEZWxldGVFbmFibGVkID0gdHJ1ZTsgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpZiBub3RoaW5nIGlzIHNlbGVjdGVkIHRoZW4gZG9uJ3Qgc2hvdyBhbnkgZGV0YWlscwotICAgICAgICAgIC8vCi0gICAgICAgICAgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwb24gZWxlbWVudCBzZWxlY3Rpb24sIHRoZSBkZXRhaWxzIHZpZXcgcG9wdWxhdGVzIGZpbmUsIGJ1dCB0aGVyZSBpcyBubyB2ZXJ0aWNhbCBzY3JvbGxiYXIsCi0gICAgICAgIC8vIHNvIGl0IG1pc2xlYWRzIHRoZSB1c2VyIGludG8gdGhpbmtpbmcgdGhlcmUgYXJlIG5vIG90aGVyIGF0dHJpYnV0ZXMgYXZhaWxhYmxlCi0gICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc0MDczCi0gICAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGZvcmNlIGEgbGF5b3V0IG9mIHRoZSB0YWIgY29tcG9zaXRlCi0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0gICAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkKLSAgICAgICAgewotICAgICAgICAgIFByb3BlcnR5U2hlZXQgc2hlZXQgPSAoUHJvcGVydHlTaGVldClwYXJ0OwotICAgICAgICAgIGlmIChzaGVldC5nZXRDdXJyZW50UGFnZSgpIGluc3RhbmNlb2YgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUGFnZSA9IChUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSlzaGVldC5nZXRDdXJyZW50UGFnZSgpOwotICAgICAgICAgICAgaWYgKHRhYmJlZFBhZ2UuZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgQ29tcG9zaXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBDb21wb3NpdGUgYyA9IChDb21wb3NpdGUpdGFiYmVkUGFnZS5nZXRDb250cm9sKCk7Ci0gICAgICAgICAgICAgIFBvaW50IHAgPSBjLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgLy8gYy5sYXlvdXQodHJ1ZSwgdHJ1ZSkgZG9lc24ndCBhcHBlYXIgdG8gd29yay4KLSAgICAgICAgICAgICAgLy8gQnV0IHRoaXMgZm9yY2VzIGEgcmVsYXlvdXQ6Ci0gICAgICAgICAgICAgIGMuc2V0U2l6ZShwLngsIHAueSArIDEpOwotICAgICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIHNpemUgYmFjayB0byB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgYy5zZXRTaXplKHAueCwgcC55KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGlzRGVsZXRlRW5hYmxlZCAmJiAhaXNSZWFkT25seSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElUcmVlQ29udGVudFByb3ZpZGVyIGdldEV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIGV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyKElUcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIgPSBleHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldEV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBleHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25UcmVlTGFiZWxQcm92aWRlciA9IGV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOGY5YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLkZpbGVTdG9yZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24gaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciwgTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0gIHByb3RlY3RlZCBQYWludExpc3RlbmVyIHBhaW50ZXI7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYWRPbmx5OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0ZW5lckVuYWJsZWQgPSB0cnVlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpbXBsZTsKLSAgcHJvdGVjdGVkIEN1c3RvbUxpc3RlbmVyIGN1c3RvbUxpc3RlbmVyID0gbmV3IEN1c3RvbUxpc3RlbmVyKCk7Ci0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBvd25pbmdFZGl0b3I7Ci0gIHByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmU7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElDT05fRVJST1IgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsKLSAgCi0gIHB1YmxpYyBBYnN0cmFjdFNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgYVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBhVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotICAgIGlzU2ltcGxlID0gZ2V0SXNTaW1wbGUoKTsKLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KTsKLQotICAgIHByb3RlY3RlZCBQYWludExpc3RlbmVyIGNyZWF0ZVBhaW50ZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotLy8gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgR0MgZ2MgPSBlLmdjOwotCi0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChnYy5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICAgICAgICAgIGdjLnNldEJhY2tncm91bmQoZ2V0V2lkZ2V0RmFjdG9yeSgpLmdldENvbG9ycygpLmdldENvbG9yKAotICAgICAgICAgICAgICAgICAgICBGb3JtQ29sb3JzLlRCX0JHKSk7Ci0KLS8vICAgICAgICAgICAgICAgIGdjLmZpbGxHcmFkaWVudFJlY3RhbmdsZSg0ICsgYm91bmRzLndpZHRoIC8gMiwgMCwKLS8vICAgICAgICAgICAgICAgICAgICBib3VuZHMud2lkdGggLyAyIC0gOSwgYm91bmRzLmhlaWdodCwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChnZXRXaWRnZXRGYWN0b3J5KCkuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoCi0gICAgICAgICAgICAgICAgICAgIEZvcm1Db2xvcnMuVEJfQk9SREVSKSk7Ci0vLyAgICAgICAgICAgICAgICBnYy5kcmF3TGluZShib3VuZHMud2lkdGggLSA1LCAwLCBib3VuZHMud2lkdGggLSA1LAotLy8gICAgICAgICAgICAgICAgICAgIGJvdW5kcy5oZWlnaHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgICBpZiAoY29tcG9zaXRlICE9IG51bGwgJiYgISBjb21wb3NpdGUuaXNEaXNwb3NlZCgpICYmIHBhaW50ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5yZW1vdmVQYWludExpc3RlbmVyKHBhaW50ZXIpOwotICAgICAgICAKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICAgICAgaXNTaW1wbGUgPSBnZXRJc1NpbXBsZSgpOwotICAgICAgICBPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICAgICAgCi0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClpbnB1dCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHNldCBvd25pbmcgZWRpdG9yIG9mIHRoaXMgc2VjdGlvbgotICAgICAgICBpZiAocGFydCE9bnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvd25pbmdFZGl0b3IgPSAoSUVkaXRvclBhcnQpcGFydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvd25pbmdFZGl0b3IgPSBwYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHhzZFNjaGVtYSA9PSBvd25pbmdFZGl0b3IuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpKQotICAgICAgICB7Ci0gICAgICAgICAgaXNSZWFkT25seSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlzUmVhZE9ubHkgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gb3duaW5nRWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgIGlmICghKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCB8fCBlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVTdG9yZUVkaXRvcklucHV0KSkKLSAgICAgICAgewotICAgICAgICAgIGlzUmVhZE9ubHkgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gICAgewotICAgICAgc3VwZXIucmVmcmVzaCgpOwotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5QWxsTGlzdGVuZXJzKENvbnRyb2wgY29udHJvbCkKLSAgICB7Ci0gICAgICBjb250cm9sLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIGNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICBjb250cm9sLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFwcGx5TW9kaWZ5TGlzdGVuZXJzKENvbnRyb2wgY29udHJvbCkKLSAgICB7Ci0gICAgICBjb250cm9sLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIGNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkZvY3VzT3V0LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlLZXlMaXN0ZW5lcihDb250cm9sIGNvbnRyb2wpCi0gICAgewotICAgICAgY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgY3VzdG9tTGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVycyhDb250cm9sIGNvbnRyb2wpCi0gICAgewotICAgICAgY29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICBjb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Gb2N1c091dCwgY3VzdG9tTGlzdGVuZXIpOwotICAgICAgY29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuS2V5RG93biwgY3VzdG9tTGlzdGVuZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHt9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmCi0gICAgICAgICAgaW5wdXQgIT0gbnVsbCAmJgotICAgICAgICAgICFpc1JlYWRPbmx5KSAKLSAgICAgIHsKLSAgICAgICAgZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJgotICAgICAgICAgIGlucHV0ICE9IG51bGwgJiYKLSAgICAgICAgICAhaXNSZWFkT25seSkgCi0gICAgICB7Ci0gICAgICAgIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJFbmFibGVkKCkgCi0gICAgewotICAgICAgcmV0dXJuIGxpc3RlbmVyRW5hYmxlZDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAgICogQHBhcmFtIHYgIFZhbHVlIHRvIGFzc2lnbiB0byBsaXN0ZW5lckVuYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXJFbmFibGVkKGJvb2xlYW4gIHYpIAotICAgIHsKLSAgICAgIHRoaXMubGlzdGVuZXJFbmFibGVkID0gdjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW50IHdoZW4gYW4gZXZlbnQgdGhhdCB0aGUgcmVjZWl2ZXIgaGFzIHJlZ2lzdGVyZWQgZm9yIG9jY3Vycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgd2hpY2ggb2NjdXJyZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiAhaXNSZWFkT25seSkgCi0gICAgICB7Ci0gICAgICAgIGRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCi0gICAgICogQHBhcmFtIGV2ZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpCi0gICAgewotICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIHRoaXMub3duaW5nRWRpdG9yID0gZWRpdG9yUGFydDsKLSAgICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpCi0gICAgewotICAgICAgT2JqZWN0IGNvbW1hbmRTdGFjayA9IG93bmluZ0VkaXRvci5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7IAotICAgICAgICAgIAotICAgICAgaWYgKGNvbW1hbmRTdGFjaz09bnVsbCkKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gKENvbW1hbmRTdGFjayljb21tYW5kU3RhY2s7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGdldElzU2ltcGxlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEludGVuZGVkIHRvIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIGdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLSAgICB7Ci0gICAgICBpZiAoc3RhdHVzTGluZT09bnVsbCAmJiBnZXRQYXJ0KCkhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmKGdldFBhcnQoKS5nZXRTaXRlKCkgaW5zdGFuY2VvZiBJRWRpdG9yU2l0ZSkKLSAgICAgICAgICBzdGF0dXNMaW5lID0gKChJRWRpdG9yU2l0ZSlnZXRQYXJ0KCkuZ2V0U2l0ZSgpKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLSAgICAgICAgZWxzZSBpZiAoZ2V0UGFydCgpLmdldFNpdGUoKSBpbnN0YW5jZW9mIElWaWV3U2l0ZSkKLSAgICAgICAgICBzdGF0dXNMaW5lID0gKChJVmlld1NpdGUpZ2V0UGFydCgpLmdldFNpdGUoKSkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0gICAgICAgIAotICAgICAgICAvKiAKLSAgICAgICAgICogV2UgbXVzdCBtYW51YWxseSBzZXQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHN0YXR1cyBsaW5lIHNpbmNlIHRoZSBhY3Rpb24gYmFycyBhcmUgZnJvbSB0aGUgZWRpdG9yCi0gICAgICAgICAqIHdoaWNoIG1lYW5zIHRoZSBzdGF0dXMgbGluZSBvbmx5IHNob3dzIHVwIHdoZW4gdGhlIGVkaXRvciBpcyBpbiBmb2N1cyAoYnkgZGVmYXVsdCkuCi0gICAgICAgICAqIE5vdGUgb25seSBhIFN1YlN0YXR1c0xpbmVNYW5hZ2VyIGNhbiBzZXQgdGhlIHZpc2liaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc3RhdHVzTGluZSBpbnN0YW5jZW9mIFN1YlN0YXR1c0xpbmVNYW5hZ2VyKQotICAgICAgICAgICgoU3ViU3RhdHVzTGluZU1hbmFnZXIpc3RhdHVzTGluZSkuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIHN0YXR1c0xpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBzdGF0dXMgbGluZS4KLSAgICAgKiBDYWxsIHNldEVycm9yTWVzc2FnZShudWxsKSB0byBjbGVhciB0aGUgc3RhdHVzIGxpbmUuCi0gICAgICogQHBhcmFtIHRleHQgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyB0ZXh0KQotICAgIHsKLSAgICAgIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lID0gZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQotICAgICAgaWYgKHN0YXR1c0xpbmUhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh0ZXh0PT1udWxsIHx8IHRleHQubGVuZ3RoKCk8MSkKLSAgICAgICAgICBzdGF0dXNMaW5lLnNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHN0YXR1c0xpbmUuc2V0RXJyb3JNZXNzYWdlKElDT05fRVJST1IsIHRleHQpOwotCi0gICAgICAgIC8vIGVuc3VyZSBvdXIgbWVzc2FnZSBnZXRzIGRpc3BsYXllZAotICAgICAgICBpZiAoc3RhdHVzTGluZSBpbnN0YW5jZW9mIFN1YkNvbnRyaWJ1dGlvbk1hbmFnZXIpCi0gICAgICAgICAgKChTdWJDb250cmlidXRpb25NYW5hZ2VyKXN0YXR1c0xpbmUpLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBzdGF0dXNMaW5lLnVwZGF0ZSh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRU9iamVjdCBnZXRNb2RlbCgpCi0gICAgewotICAgICAgcmV0dXJuIChYU0RDb21wb25lbnQpaW5wdXQ7Ci0gICAgfQotCi0gICAgCi0gICAgY2xhc3MgQ3VzdG9tTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lcgotICAgIHsKLSAgICAgIGJvb2xlYW4gaGFuZGxpbmdFdmVudCA9IGZhbHNlOwotICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmICFpc1JlYWRPbmx5KSAKLSAgICAgICAgewotICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFNXVC5LZXlEb3duIDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsaW5nRXZlbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaGFuZGxpbmdFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICBkb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgIGhhbmRsaW5nRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFNXVC5Gb2N1c091dCA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghaGFuZGxpbmdFdmVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhbmRsaW5nRXZlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIGhhbmRsaW5nRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYjMzYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldEZpbHRlcigpCi0gICAqLwotICBwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFhTRENvbmNyZXRlQ29tcG9uZW50LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50IHx8IG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRBZnRlclNlY3Rpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBZnRlclNlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICAKLSAgcHVibGljIGludCBnZXRFbmFibGVzRm9yKCkKLSAgewotCXJldHVybiBFTkFCTEVTX0ZPUl9BTlk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQW5ub3RhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQW5ub3RhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxNTMzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fubm90YXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGREb2N1bWVudGF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIFRleHQgc2ltcGxlVGV4dDsKLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBzaW1wbGVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsgLy8kTk9OLU5MUy0xJAotICAgIHNpbXBsZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzaW1wbGVUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkRPQ1VNRU5UQVRJT05fVEFCX19OT19MQUJFTCk7IAotICAgIAotCi0gICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEpOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEpOwotICAgIGRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTEpOwotICAgIHNpbXBsZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgfQotCi0gIHB1YmxpYyBBbm5vdGF0aW9uU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgCi0gICAgaWYgKHNpbXBsZVRleHQuaXNGb2N1c0NvbnRyb2woKSkgcmV0dXJuOwotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gWFNEQ29tbW9uVUlVdGlscy5nZXRJbnB1dFhTREFubm90YXRpb24oKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpbnB1dCwgZmFsc2UpOwotICAgICAgc2V0SW5pdGlhbFRleHQoeHNkQW5ub3RhdGlvbik7Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHNpbXBsZVRleHQpCi0gICAgICB7Ci0gICAgICAgIEFkZERvY3VtZW50YXRpb25Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkRG9jdW1lbnRhdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRE9DVU1FTlRBVElPTiwgbnVsbCwgKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpbnB1dCwgc2ltcGxlVGV4dC5nZXRUZXh0KCksICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRJbml0aWFsVGV4dChYU0RBbm5vdGF0aW9uIGFuKQotICB7Ci0gICAgaWYgKGFuICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIExpc3QgZG9jdW1lbnRhdGlvbkxpc3QgPSBhbi5nZXRVc2VySW5mb3JtYXRpb24oKTsKLSAgICAgICAgaWYgKGRvY3VtZW50YXRpb25MaXN0LnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGRvY0VsZW1lbnQgPSAoRWxlbWVudCkgZG9jdW1lbnRhdGlvbkxpc3QuZ2V0KDApOwotICAgICAgICAgIGlmIChkb2NFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2ltcGxlVGV4dC5zZXRUZXh0KGRvU2VyaWFsaXplKGRvY0VsZW1lbnQpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2ltcGxlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGRvU2VyaWFsaXplKEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgc291cmNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIE5vZGUgZmlyc3RDaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgIE5vZGUgbGFzdENoaWxkID0gZWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLSAgICBpbnQgc3RhcnQgPSAwOwotICAgIGludCBlbmQgPSAwOwotCi0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkKLSAgICB7Ci0gICAgICBJRE9NRWxlbWVudCBkb21FbGVtZW50ID0gKElET01FbGVtZW50KSBlbGVtZW50OwotICAgICAgSURPTU1vZGVsIG1vZGVsID0gZG9tRWxlbWVudC5nZXRNb2RlbCgpOwotICAgICAgSURPTURvY3VtZW50IGRvYyA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0KLSAgICAgIGlmIChmaXJzdENoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICB7Ci0gICAgICAgIElET01Ob2RlIGZpcnN0ID0gKElET01Ob2RlKSBmaXJzdENoaWxkOwotICAgICAgICBzdGFydCA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0gICAgICB9Ci0gICAgICBpZiAobGFzdENoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICB7Ci0gICAgICAgIElET01Ob2RlIGxhc3QgPSAoSURPTU5vZGUpIGxhc3RDaGlsZDsKLSAgICAgICAgZW5kID0gbGFzdC5nZXRFbmRPZmZzZXQoKTsKLSAgICAgIH0KLSAgICAgIHNvdXJjZSA9IGRvYy5nZXRTb3VyY2UoKS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNvdXJjZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0NvbW1vbkRpcmVjdGl2ZXNTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0NvbW1vbkRpcmVjdGl2ZXNTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDFlYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9Db21tb25EaXJlY3RpdmVzU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUGFyc2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tbW9uRGlyZWN0aXZlc1NlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgVGV4dCBzY2hlbWFMb2NhdGlvblRleHQ7Ci0gIEJ1dHRvbiB3aXphcmRCdXR0b247Ci0gIFN0eWxlZFRleHQgZXJyb3JUZXh0OwotICBDb2xvciByZWQ7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IHRydWU7Ci0KLSAgLy8gVE9ETzogY29tbW9uIHVwIGNvZGUgd2l0aCBYU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZAotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHNjaGVtYUxvY2F0aW9uVGV4dCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpc1ZhbGlkU2NoZW1hTG9jYXRpb24gPSB0cnVlOwotICAgICAgICBTdHJpbmcgeHNkTW9kZWxGaWxlID0gc2NoZW1hTG9jYXRpb25UZXh0LmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFhTRFNjaGVtYSBleHRlcm5hbFNjaGVtYSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAoeHNkTW9kZWxGaWxlLmxlbmd0aCgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVTY2hlbWFMb2NhdGlvbkNoYW5nZSh4c2RNb2RlbEZpbGUsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgSUZpbGUgY3VycmVudElGaWxlID0gbnVsbDsKLSAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgICAgICAgewotICAgICAgICAgICAgY3VycmVudElGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWVkaXRvcklucHV0KS5nZXRGaWxlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIFVSSSBuZXdVUkkgPSBVUkkuY3JlYXRlVVJJKHhzZE1vZGVsRmlsZSk7Ci0gICAgICAgICAgU3RyaW5nIHhzZEZpbGUgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkobmV3VVJJLnRvU3RyaW5nKCksIGN1cnJlbnRJRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGZpbmFsIFN0cmluZyBub3JtYWxpemVkWFNERmlsZSA9IFVSSUhlbHBlci5ub3JtYWxpemUoeHNkRmlsZSwgY3VycmVudElGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgZmluYWwgU3RyaW5nIG5vcm1hbGl6ZWRVUkkgPSBVUkkuZW5jb2RlRnJhZ21lbnQoVVJJSGVscGVyLmFkZEltcGxpZWRGaWxlUHJvdG9jb2wobm9ybWFsaXplZFhTREZpbGUpLCB0cnVlKS50b1N0cmluZygpOwotICAgICAgICAgIFhTRFBhcnNlciBwYXJzZXIgPSBuZXcgWFNEUGFyc2VyKG5ldyBIYXNoTWFwKCkpOwotICAgICAgICAgIHBhcnNlci5wYXJzZShub3JtYWxpemVkVVJJKTsKLSAgICAgICAgICBleHRlcm5hbFNjaGVtYSA9IHBhcnNlci5nZXRTY2hlbWEoKTsKLQotICAgICAgICAgIGlmIChleHRlcm5hbFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBleHROYW1lc3BhY2UgPSBleHRlcm5hbFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGlmIChleHROYW1lc3BhY2UgPT0gbnVsbCkgZXh0TmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IGV4dE5hbWVzcGFjZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGV4dGVybmFsU2NoZW1hLmdldERpYWdub3N0aWNzKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGV4dGVybmFsU2NoZW1hLmdldERpYWdub3N0aWNzKCkuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX0lOQ09SUkVDVF9YTUxfU0NIRU1BIiwgeHNkTW9kZWxGaWxlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50TmFtZVNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RJbmNsdWRlIHx8IGlucHV0IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBuYW1lc3BhY2UgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHRoZSBzYW1lIGFzIGN1cnJlbnQgZmlsZQotICAgICAgICAgICAgICAgIGlmIChleHROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5hbWVTcGFjZSAhPSBudWxsICYmICFleHROYW1lc3BhY2UuZXF1YWxzKGN1cnJlbnROYW1lU3BhY2UpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9ESUZGRVJFTlRfTkFNRV9TUEFDRSIsIHhzZE1vZGVsRmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIG5hbWVzcGFjZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgZmlsZQotICAgICAgICAgICAgICAgIGlmIChleHROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5hbWVTcGFjZSAhPSBudWxsICYmIGV4dE5hbWVzcGFjZS5lcXVhbHMoY3VycmVudE5hbWVTcGFjZSkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1NBTUVfTkFNRV9TUEFDRSIsIHhzZE1vZGVsRmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9GSUxFOwotICAgICAgICAgICAgaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3JNZXNzYWdlID0gTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfRklMRTsKLSAgICAgICAgICBpc1ZhbGlkU2NoZW1hTG9jYXRpb24gPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVmFsaWRTY2hlbWFMb2NhdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvclRleHQuc2V0VGV4dChlcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgaW50IGxlbmd0aCA9IGVycm9yVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCk7Ci0gICAgICAgICAgICByZWQgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAwLCAwKTsKLSAgICAgICAgICAgIFN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSgwLCBsZW5ndGgsIHJlZCwgc2NoZW1hTG9jYXRpb25UZXh0LmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgICAgICBlcnJvclRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVTY2hlbWFMb2NhdGlvbkNoYW5nZSh4c2RNb2RlbEZpbGUsIG5hbWVzcGFjZSwgZXh0ZXJuYWxTY2hlbWEpOyAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2NoZW1hTG9jYXRpb25DaGFuZ2UoU3RyaW5nIHNjaGVtYUZpbGVTdHJpbmcsIFN0cmluZyBuYW1lc3BhY2UsIFhTRFNjaGVtYSBleHRlcm5hbFNjaGVtYSkKLSAgewotICAgIAotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIGlmIChyZWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWQuZGlzcG9zZSgpOwotICAgICAgcmVkID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9FbnVtZXJhdGlvbnNTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0VudW1lcmF0aW9uc1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzZTRhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0VudW1lcmF0aW9uc1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLk5hdmlnYWJsZVRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZEVudW1lcmF0aW9uc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5TZXRYU0RGYWNldFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHMuRW51bWVyYXRpb25zRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbnNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIHByaXZhdGUgRW51bWVyYXRpb25zVGFibGVWaWV3ZXIgZW51bWVyYXRpb25zVGFibGU7Ci0gIHByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLSAgcHJpdmF0ZSBCdXR0b24gYWRkTWFueUJ1dHRvbjsKLSAgcHJpdmF0ZSBCdXR0b24gZGVsZXRlQnV0dG9uOwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbnNTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotCi0gICAgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbikKLSAgICB7Ci0gICAgICBMaXN0IGVudW1MaXN0ID0gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKTsKLSAgICAgIFN0cmluZ0J1ZmZlciBuZXdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigidmFsdWUxIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGludCBzdWZmaXggPSAxOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZW51bUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZW51bUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMobmV3TmFtZS50b1N0cmluZygpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzdWZmaXgrKzsKLSAgICAgICAgICAgIG5ld05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ2YWx1ZSIgKyBTdHJpbmcudmFsdWVPZihzdWZmaXgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBBZGRFbnVtZXJhdGlvbnNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkRW51bWVyYXRpb25zQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTiwgKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dCk7Ci0gICAgICBjb21tYW5kLnNldFZhbHVlKG5ld05hbWUudG9TdHJpbmcoKSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCi0gICAgICBlbnVtZXJhdGlvbnNUYWJsZS5yZWZyZXNoKCk7Ci0gICAgICBpbnQgbmV3SXRlbUluZGV4ID0gZW51bWVyYXRpb25zVGFibGUuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDE7Ci0gICAgICBlbnVtZXJhdGlvbnNUYWJsZS5lZGl0RWxlbWVudChlbnVtZXJhdGlvbnNUYWJsZS5nZXRFbGVtZW50QXQobmV3SXRlbUluZGV4KSwgMCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGFkZE1hbnlCdXR0b24pCi0gICAgewotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAvLyBpZiBpdCBpcyBudWxsLCBnZXQgdGhlIGRlZmF1bHQgb25lCi0gICAgICBkaXNwbGF5ID0gZGlzcGxheSA9PSBudWxsID8gRGlzcGxheS5nZXREZWZhdWx0KCkgOiBkaXNwbGF5OwotICAgICAgU2hlbGwgcGFyZW50U2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICBFbnVtZXJhdGlvbnNEaWFsb2cgZGlhbG9nID0gbmV3IEVudW1lcmF0aW9uc0RpYWxvZyhwYXJlbnRTaGVsbCk7Ci0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQotICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gZGlhbG9nLmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIGRlbGltaXRlciA9IGRpYWxvZy5nZXREZWxpbWl0ZXIoKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dCwgZGVsaW1pdGVyKTsKLSAgICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT05TKTsKLSAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgaWYgKGRpYWxvZy5pc1ByZXNlcnZlV2hpdGVzcGFjZSgpID09IGZhbHNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRva2VuID0gdG9rZW4udHJpbSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBBZGRFbnVtZXJhdGlvbnNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkRW51bWVyYXRpb25zQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTlMsIChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQpOwotICAgICAgICAgIGNvbW1hbmQuc2V0VmFsdWUodG9rZW4pOwotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgfQotICAgICAgZW51bWVyYXRpb25zVGFibGUucmVmcmVzaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBkZWxldGVCdXR0b24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZW51bWVyYXRpb25zVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT04pOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBvYmo7Ci0KLSAgICAgICAgICAgICAgRGVsZXRlQ29tbWFuZCBkZWxldGVDb21tYW5kID0gbmV3IERlbGV0ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT04sIGVudW1GYWNldCk7Ci0gICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoZGVsZXRlQ29tbWFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLSAgICAgICAgZW51bWVyYXRpb25zVGFibGUucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBlbnVtZXJhdGlvbnNUYWJsZS5nZXRUYWJsZSgpKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGVudW1lcmF0aW9uc1RhYmxlLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0gICAgY29tcG9zaXRlID0gZmFjdG9yeS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgZW51bWVyYXRpb25zVGFibGUgPSBuZXcgRW51bWVyYXRpb25zVGFibGVWaWV3ZXIoZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OKSk7Ci0gICAgZW51bWVyYXRpb25zVGFibGUuc2V0SW5wdXQoaW5wdXQpOwotICAgIFRhYmxlIHRhYmxlID0gZW51bWVyYXRpb25zVGFibGUuZ2V0VGFibGUoKTsKLSAgICB0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIGFkZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwiKSwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0gICAgYWRkTWFueUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0FERF9CVVRUT05fTEFCRUwiKSArICIuLi4iLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIGRlbGV0ZUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURV9JTkNMVURFIiksIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgRm9ybURhdGEgZGF0YTIgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhMi50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgZGF0YTIubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xMDApOwotICAgIGRhdGEyLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgLy8gZGF0YTIud2lkdGggPSA1MDsKLSAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhMik7Ci0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChhZGRCdXR0b24sIDAsIFNXVC5MRUZUKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwKTsKLSAgICBhZGRNYW55QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYWRkTWFueUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwLCBTV1QuTEVGVCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZE1hbnlCdXR0b24sIDApOwotICAgIGRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwKTsKLSAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIGRhdGEud2lkdGggPSA1MDsKLSAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHRhYmxlLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHRoaXMpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotCi0gICAgSXRlcmF0b3IgdmFsaWRGYWNldHMgPSBzdC5nZXRWYWxpZEZhY2V0cygpLml0ZXJhdG9yKCk7Ci0KLSAgICBib29sZWFuIGlzQXBwbGljYWJsZSA9IGZhbHNlOwotICAgIHdoaWxlICh2YWxpZEZhY2V0cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIGFWYWxpZEZhY2V0ID0gKFN0cmluZykgdmFsaWRGYWNldHMubmV4dCgpOwotICAgICAgaWYgKGFWYWxpZEZhY2V0LmVxdWFscyhYU0RDb25zdGFudHMuRU5VTUVSQVRJT05fRUxFTUVOVF9UQUcpKQotICAgICAgewotICAgICAgICBpc0FwcGxpY2FibGUgPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc0FwcGxpY2FibGUpCi0gICAgewotICAgICAgYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICBhZGRNYW55QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBhZGRNYW55QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbnVtZXJhdGlvbnNUYWJsZS5zZXRJbnB1dChpbnB1dCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIFRhYmxlIHRhYmxlID0gZW51bWVyYXRpb25zVGFibGUuZ2V0VGFibGUoKTsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuUmVzaXplICYmIGV2ZW50LndpZGdldCA9PSB0YWJsZSkKLSAgICB7Ci0gICAgICBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IHRhYmxlLmdldENvbHVtbigwKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFdpZHRoKHRhYmxlLmdldFNpemUoKS54KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNsYXNzIEVudW1lcmF0aW9uc1RhYmxlVmlld2VyIGV4dGVuZHMgTmF2aWdhYmxlVGFibGVWaWV3ZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gY29sdW1uUHJvcGVydGllcyA9IHsgWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHIH07Ci0KLSAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzOwotCi0gICAgVGFibGUgdGFibGU7Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRpb25zVGFibGVWaWV3ZXIoVGFibGUgdGFibGUpCi0gICAgewotICAgICAgc3VwZXIodGFibGUpOwotICAgICAgdGFibGUgPSBnZXRUYWJsZSgpOwotCi0gICAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgIHNldENvbnRlbnRQcm92aWRlcihuZXcgRW51bWVyYXRpb25zVGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICBzZXRMYWJlbFByb3ZpZGVyKG5ldyBFbnVtZXJhdGlvbnNUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICBzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0gICAgICBzZXRDZWxsTW9kaWZpZXIodGhpcyk7Ci0KLSAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDApOwotICAgICAgY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1swXSk7Ci0gICAgICBjb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgIGNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLSAgICAgIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbMV07Ci0KLSAgICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwKTsKLQotICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEoZGF0YSk7Ci0gICAgICBjZWxsRWRpdG9yc1swXSA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0KLSAgICAgIGdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICBzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlSXRlbSAmJiAodmFsdWUgIT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRYU0RGYWNldFZhbHVlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9FTlVNRVJBVElPTl9WQUxVRSwgZW51bUZhY2V0KTsKLSAgICAgICAgY29tbWFuZC5zZXRWYWx1ZSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIGl0ZW0uc2V0RGF0YShlbnVtRmFjZXQpOwotICAgICAgICBpdGVtLnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTREVudW1lcmF0aW9uRmFjZXQpCi0gICAgICB7Ci0gICAgICAgIFhTREVudW1lcmF0aW9uRmFjZXQgZW51bUZhY2V0ID0gKFhTREVudW1lcmF0aW9uRmFjZXQpIGVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGVudW1GYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgfQotCi0gIGNsYXNzIEVudW1lcmF0aW9uc1RhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXRFbGVtZW50OwotICAgICAgICByZXR1cm4gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKS50b0FycmF5KCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLSAgfQotCi0gIGNsYXNzIEVudW1lcmF0aW9uc1RhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgRW51bWVyYXRpb25zVGFibGVMYWJlbFByb3ZpZGVyKCkKLSAgICB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVFbnVtLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBlbGVtZW50OwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9FeHRlbnNpb25zU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9FeHRlbnNpb25zU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmFkNTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRXh0ZW5zaW9uc1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRXh0ZW5zaW9uQXR0cmlidXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRFeHRlbnNpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5SZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uQ2F0ZWdvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkV4dGVuc2lvbkl0ZW1GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLlNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5YU0RFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQuWFNETW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5Nb2RlbFJlY29uY2lsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbnNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25zU2VjdGlvbgotewotICBYU0RNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0gIAotICBwdWJsaWMgRXh0ZW5zaW9uc1NlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRFeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcihuZXcgRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgc2V0RXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcihuZXcgWFNERXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cgY3JlYXRlQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZygpCi0gIHsKLSAgICBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nIGRpYWxvZyA9ICBuZXcgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBnZXRDYXRlZ29yeUNvbnRlbnRQcm92aWRlcigpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNEQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgIH0KLSAgICB9OwotICAgIGRpYWxvZy5hZGRFbGVtZW50c1RhYmxlRmlsdGVyKG5ldyBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nRmlsdGVyKGlucHV0LCBkaWFsb2cpKTsgICAgCi0gICAgcmV0dXJuIGRpYWxvZzsgICAKLSAgfQotICAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsgCi0gICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7ICAKLSAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iaikuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRhcHRlciA9IFhTRE1vZGVsQWRhcHRlci5sb29rdXBPckNyZWF0ZU1vZGVsQWRhcHRlcihlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBNb2RlbFJlY29uY2lsZUFkYXB0ZXIgbW9kZWxSZWNvbmNpbGVBZGFwdGVyID0gYWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKTsKLSAgICAgICAgICAgICAgaWYgKG1vZGVsUmVjb25jaWxlQWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kZWxSZWNvbmNpbGVBZGFwdGVyLmFkZExpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIE1vZGVsUmVjb25jaWxlQWRhcHRlciBtb2RlbFJlY29uY2lsZUFkYXB0ZXIgPSBhZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpOwotICAgICAgaWYgKG1vZGVsUmVjb25jaWxlQWRhcHRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBtb2RlbFJlY29uY2lsZUFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIoaW50ZXJuYWxOb2RlQWRhcHRlcik7Ci0gICAgICB9Ci0gICAgfSAgCi0gIH0KLQotICBwcm90ZWN0ZWQgQWRkRXh0ZW5zaW9uQ29tbWFuZCBnZXRBZGRFeHRlbnNpb25Db21tYW5kKE9iamVjdCBvKQotICB7Ci0gICAgQWRkRXh0ZW5zaW9uQ29tbWFuZCBhZGRFeHRlbnNpb25Db21tYW5kID0gbnVsbDsKLSAgICBpZiAobyBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIG87Ci0gICAgICBFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCBleHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCA9IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKS5nZXRBZGRFeHRlbnNpb25Db21tYW5kKGVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgaWYgKGV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kLnNldElucHV0cygoWFNEQ29uY3JldGVDb21wb25lbnQpIGlucHV0LCBlbGVtZW50KTsKLSAgICAgICAgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IGV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBhZGRFeHRlbnNpb25Db21tYW5kID0gbmV3IEFkZEV4dGVuc2lvbkVsZW1lbnRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FQUElORk9fRUxFTUVOVCwgKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpbnB1dCwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIG87Ci0gICAgICBhZGRFeHRlbnNpb25Db21tYW5kID0gbmV3IEFkZEV4dGVuc2lvbkF0dHJpYnV0ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVBQSU5GT19BVFRSSUJVVEUsIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQsIGF0dHJpYnV0ZSk7Ci0gICAgfQotICAgIHJldHVybiBhZGRFeHRlbnNpb25Db21tYW5kOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVtb3ZlRXh0ZW5zaW9uQ29tbWFuZChPYmplY3QgbykKLSAgewotICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSlvOwotICAgICAgICBFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCA9IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKS5nZXRSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChub2RlLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgaWYgKHJlbW92ZUNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUNvbW1hbmQuc2V0SW5wdXQoKFhTRENvbmNyZXRlQ29tcG9uZW50KWlucHV0KTsKLSAgICAgICAgICByZW1vdmVDb21tYW5kLnNldE5vZGUobm9kZSk7Ci0gICAgICAgICAgcmV0dXJuIHJlbW92ZUNvbW1hbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29tbWFuZCA9IG5ldyBSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURV9BUFBJTkZPX0VMRU1FTlQsIG5vZGUpOyAgCi0gICAgICAgICAgLy8gY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbW1hbmQ7Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzVHJlZVZpZXdlcklucHV0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgIAotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsgIAotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KWlucHV0OwotICAgICAgRWxlbWVudCBjb21wb25lbnRFbGVtZW50ID0gY29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICAgIE5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICBOb2RlIGdyYW5kUGFyZW50ID0gcGFyZW50ICE9IG51bGwgPyBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpIDogbnVsbDsKLSAgICAgIHJldHVybiBjb21wb25lbnRFbGVtZW50ID09IGVsZW1lbnQgfHwgY29tcG9uZW50RWxlbWVudCA9PSBwYXJlbnQgfHwgY29tcG9uZW50RWxlbWVudCA9PSBncmFuZFBhcmVudDsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmU3RvcmUoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgfQotICAKLSAgc3RhdGljIGNsYXNzIFhTRENhdGVnb3J5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsgICAgCi0gICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYVtdIGV4dGVuc2lvbnNTY2hlbWFTcGVjcyA9IG51bGw7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBpbnB1dExpc3QgPSAoTGlzdCkgaW5wdXRFbGVtZW50OwotICAgICAgICAKLSAgICAgICAgTGlzdCB0b3RhbCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdG90YWwuYWRkQWxsKGlucHV0TGlzdCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IGR5bmFtaWNDYXRlZ29yaWVzID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKS5nZXRDYXRlZ29yeVByb3ZpZGVycygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkeW5hbWljQ2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgQ2F0ZWdvcnlQcm92aWRlciBjYXRlZ29yeVByb3ZpZGVyID0gKENhdGVnb3J5UHJvdmlkZXIpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNhdGVnb3J5UHJvdmlkZXIuZ2V0Q2F0ZWdvcmllcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKWl0Lm5leHQoKTsKLSAgICAgICAgICAgIHRvdGFsLmFkZChzcCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWNzID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hW10pIHRvdGFsLnRvQXJyYXkobmV3IFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hWzBdKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIHJldHVybiBleHRlbnNpb25zU2NoZW1hU3BlY3M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZwotCi0gICAgfSAgICAgICAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIGZpbHRlciBpcyB0byBiZSB1c2VkIGJ5IHRoZSBkaWFsb2cgaW52b2tlZCB3aGVuIGFkZEJ1dHRvbiBpcyBwcmVzc2VkCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZ0ZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlcgotICB7Ci0gICAgcHJpdmF0ZSBPYmplY3QgaW5wdXQ7Ci0gICAgcHJpdmF0ZSBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nIGRpYWxvZzsKLQotICAgIHB1YmxpYyBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nRmlsdGVyKE9iamVjdCBpbnB1dCwgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBkaWFsb2cpCi0gICAgewotICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkKLSAgICB7ICAgICAgCi0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCAmJgotICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gZGlhbG9nLmdldFNlbGVjdGVkQ2F0ZWdvcnkoKTsKLSAgICAgICAgLy8gaGVyZSB3ZSBvYnRhaW4gdGhlIG5vZGUgZmlsdGVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIHRoZSBhcHBsaWNhYmxlIG5hbWVzcGFjZQotICAgICAgICAvLyBub3RpZWQKLSAgICAgICAgTm9kZUZpbHRlciBmaWx0ZXIgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0Tm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgpLmdldE5vZGVGaWx0ZXIoc3BlYy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDaGVjayBpZiBhIG5vZGUgZmlsdGVyIGhhcyBiZWVuIHNwZWNpZmllZCwgaWYgc28sIHRoZW4gdXNlIGl0Ci0gICAgICAgICAgZmlsdGVyID0gc3BlYy5nZXROb2RlRmlsdGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgRXh0ZW5zaW9uSXRlbUZpbHRlcikKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2lvbkl0ZW1GaWx0ZXIgZXh0ZW5zaW9uSXRlbUZpbHRlciA9IChFeHRlbnNpb25JdGVtRmlsdGVyKWZpbHRlcjsKLSAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uSXRlbUZpbHRlci5pc0FwcGxpY2FibGVDb250ZXh0KChYU0RDb25jcmV0ZUNvbXBvbmVudClpbnB1dCwgKFhTRENvbmNyZXRlQ29tcG9uZW50KWVsZW1lbnQpOyAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIFRPRE8gY3M6IGV2ZW4gaWYgaXQncyBqdXN0IGEgcGxhaW4gb2xkIE5vZGVGaWx0ZXIgd2Ugc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gdXNlIGl0ISAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9ICAKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRmFjZXRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRmFjZXRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzZDc0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0ZhY2V0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLS8vaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0vL2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0vL2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLS8vCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VUcmFja0FkYXB0ZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLk5hdmlnYWJsZVRhYmxlVmlld2VyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLkRPTUF0dHJpYnV0ZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5YU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uc3RyYWluaW5nRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhFeGNsdXNpdmVGYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhGYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhJbmNsdXNpdmVGYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5FeGNsdXNpdmVGYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5GYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5JbmNsdXNpdmVGYWNldDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci0vL2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRmFjZXRWaWV3ZXIgLy9leHRlbmRzIE5hdmlnYWJsZVRhYmxlVmlld2VyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllcgotewotLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX05BTUUgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRkFDRVRfTkFNRSIpOyAvLyAiTmFtZSI7Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfVkFMVUUgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRkFDRVRfVkFMVUUiKTsgLy8gIlZhbHVlIjsKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9PVEhFUiA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9GQUNFVF9GSVhFRCIpOyAvLyAiRml4ZWQiOwotLy8KLS8vICBwcm90ZWN0ZWQgRmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyIGZhY2V0c1RhYmxlTGFiZWxQcm92aWRlciA9IG5ldyBGYWNldHNUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLS8vICBwcm90ZWN0ZWQgRmFjZXRzVGFibGVDb250ZW50UHJvdmlkZXIgZmFjZXRzVGFibGVDb250ZW50UHJvdmlkZXIgPSBuZXcgRmFjZXRzVGFibGVDb250ZW50UHJvdmlkZXIoKTsKLS8vICBwcm90ZWN0ZWQgU3RyaW5nW10gY29sdW1uUHJvcGVydGllcyA9IHsgRkFDRVRfTkFNRSwgRkFDRVRfVkFMVUUsIEZBQ0VUX09USEVSIH07Ci0vLyAgcHJvdGVjdGVkIENlbGxFZGl0b3JbXSBjZWxsRWRpdG9yczsgLy8gdGhlc2UgY2VsbEVkaXRvcnMgYXJlIHVzZWQgd2hlbgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi13aGl0ZXNwYWNlIGZhY2V0IGlzIHNlbGVjdGVkCi0vLyAgcHJvdGVjdGVkIENlbGxFZGl0b3JbXSBhbHRDZWxsRWRpdG9yczsgLy8gdGhlc2UgY2VsbEVkaXRvcnMgYXJlIHVzZWQgd2hlbgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGl0ZXNwYWNlIGZhY2V0IGlzIHNlbGVjdGVkCi0vLwotLy8gIHByb3RlY3RlZCBTdHJpbmdbXSB3aGl0ZVNwYWNlVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgIiIsICJwcmVzZXJ2ZSIsICJyZXBsYWNlIiwgImNvbGxhcHNlIiB9OwotLy8gIHByb3RlY3RlZCBTdHJpbmdbXSB0cnVlRmFsc2VWYWx1ZXMgPSBuZXcgU3RyaW5nW10geyAiIiwgImZhbHNlIiwgInRydWUiIH07Ci0vLwotLy8gIC8qKgotLy8gICAqIEBwYXJhbSBwYXJlbnQKLS8vICAgKi8KLS8vICBwdWJsaWMgRmFjZXRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLS8vICB7Ci0vLyAgICBzdXBlcihuZXcgVGFibGUocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuU0lOR0xFKSk7Ci0vLwotLy8gICAgZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0vLyAgICBnZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0vLwotLy8gICAgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0vLyAgICBnZXRUYWJsZSgpLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTXlNb3VzZVRyYWNrTGlzdGVuZXIoKSk7Ci0vLwotLy8gICAgc2V0Q29udGVudFByb3ZpZGVyKGZhY2V0c1RhYmxlQ29udGVudFByb3ZpZGVyKTsKLS8vICAgIHNldExhYmVsUHJvdmlkZXIoZmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyKTsKLS8vICAgIHNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0vLwotLy8gICAgc2V0Q2VsbE1vZGlmaWVyKHRoaXMpOwotLy8KLS8vICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotLy8gICAgewotLy8gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZ2V0VGFibGUoKSwgU1dULk5PTkUsIGkpOwotLy8gICAgICBjb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLS8vICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0vLyAgICAgIGNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0vLyAgICB9Ci0vLwotLy8gICAgY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclszXTsKLS8vICAgIGFsdENlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbM107Ci0vLwotLy8gICAgVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0vLyAgICBDb2x1bW5XZWlnaHREYXRhIGRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg2MCwgODAsIHRydWUpOwotLy8gICAgbGF5b3V0LmFkZENvbHVtbkRhdGEoZGF0YSk7Ci0vLyAgICBjZWxsRWRpdG9yc1swXSA9IG51bGw7Ci0vLwotLy8gICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhMiA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEyMCwgODAsIHRydWUpOwotLy8gICAgbGF5b3V0LmFkZENvbHVtbkRhdGEoZGF0YTIpOwotLy8KLS8vICAgIGNlbGxFZGl0b3JzWzFdID0gbmV3IFRleHRDZWxsRWRpdG9yKGdldFRhYmxlKCkpOwotLy8gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBuZXcgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IoImNvbWJvIiwgIndoaXRlc3BhY2UiLCB3aGl0ZVNwYWNlVmFsdWVzKTsKLS8vICAgIGFsdENlbGxFZGl0b3JzWzFdID0gcGQuY3JlYXRlUHJvcGVydHlFZGl0b3IoZ2V0VGFibGUoKSk7Ci0vLwotLy8gICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhMyA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDYwLCA2MCwgdHJ1ZSk7Ci0vLyAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhMyk7Ci0vLwotLy8gICAgWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3IgcGQyID0gbmV3IFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKCJjb21ibyIsICJvdGhlciIsIHRydWVGYWxzZVZhbHVlcyk7Ci0vLyAgICBjZWxsRWRpdG9yc1syXSA9IHBkMi5jcmVhdGVQcm9wZXJ0eUVkaXRvcihnZXRUYWJsZSgpKTsKLS8vICAgIGFsdENlbGxFZGl0b3JzWzJdID0gcGQyLmNyZWF0ZVByb3BlcnR5RWRpdG9yKGdldFRhYmxlKCkpOwotLy8KLS8vICAgIGdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0vLyAgICBzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0vLwotLy8gIH0KLS8vCi0vLyAgLyoKLS8vICAgKiAobm9uLUphdmFkb2MpCi0vLyAgICogCi0vLyAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjY2FuTW9kaWZ5KGphdmEubGFuZy5PYmplY3QsCi0vLyAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotLy8gICAqLwotLy8gIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotLy8gIHsKLS8vICAgIHJldHVybiBwcm9wZXJ0eS5lcXVhbHMoRkFDRVRfVkFMVUUpIHx8IHByb3BlcnR5LmVxdWFscyhGQUNFVF9PVEhFUik7Ci0vLyAgfQotLy8KLS8vICAvKgotLy8gICAqIChub24tSmF2YWRvYykKLS8vICAgKiAKLS8vICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllciNnZXRWYWx1ZShqYXZhLmxhbmcuT2JqZWN0LAotLy8gICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLS8vICAgKi8KLS8vICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0vLyAgewotLy8gICAgaW50IGNvbHVtbiA9IDA7Ci0vLyAgICBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMF0pKQotLy8gICAgewotLy8gICAgICBjb2x1bW4gPSAwOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMV0pKQotLy8gICAgewotLy8gICAgICBjb2x1bW4gPSAxOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMl0pKQotLy8gICAgewotLy8gICAgICBjb2x1bW4gPSAyOwotLy8gICAgfQotLy8KLS8vICAgIHJldHVybiBmYWNldHNUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlbGVtZW50LCBjb2x1bW4pOwotLy8gIH0KLS8vCi0vLyAgLyoKLS8vICAgKiAobm9uLUphdmFkb2MpCi0vLyAgICogCi0vLyAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjbW9kaWZ5KGphdmEubGFuZy5PYmplY3QsCi0vLyAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotLy8gICAqLwotLy8gIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0vLyAgewotLy8gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgZ2V0SW5wdXQoKTsKLS8vICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLS8vICAgIGlmIChpdGVtICE9IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIE9iamVjdCBvID0gaXRlbS5nZXREYXRhKCk7Ci0vLyAgICAgIGlmIChvICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBTdHJpbmcgZmFjZXQgPSAoU3RyaW5nKSBvOwotLy8KLS8vICAgICAgICAgIEVsZW1lbnQgc2ltcGxlVHlwZUVsZW1lbnQgPSB4c2RTaW1wbGVUeXBlLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgIFhTRERPTUhlbHBlciB4c2RET01IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0vLyAgICAgICAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW1lbnQgPSB4c2RET01IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChzaW1wbGVUeXBlRWxlbWVudCk7Ci0vLwotLy8gICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHNpbXBsZVR5cGVFbGVtZW50LmdldFByZWZpeCgpOwotLy8gICAgICAgICAgcHJlZml4ID0gKHByZWZpeCA9PSBudWxsKSA/ICIiIDogKHByZWZpeCArICI6Iik7Ci0vLwotLy8gICAgICAgICAgRWxlbWVudCBjaGlsZE5vZGVFbGVtZW50ID0gbnVsbDsKLS8vICAgICAgICAgIERPTUF0dHJpYnV0ZSB2YWx1ZUF0dHIgPSBudWxsOwotLy8KLS8vICAgICAgICAgIFhTRENvbnN0cmFpbmluZ0ZhY2V0IHRhcmdldEZhY2V0ID0gZ2V0WFNEQ29uc3RyYWluaW5nRmFjZXQoZmFjZXQpOwotLy8KLS8vICAgICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9ICIiOwotLy8gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIG5ld1ZhbHVlID0gKFN0cmluZykgdmFsdWU7Ci0vLyAgICAgICAgICB9Ci0vLwotLy8gICAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzFdKSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgaWYgKHRhcmdldEZhY2V0ID09IG51bGwgJiYgbmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQgPSBjcmVhdGVGYWNldChmYWNldCk7Ci0vLyAgICAgICAgICAgICAgY2hpbGROb2RlRWxlbWVudCA9IChkZXJpdmVkQnlFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuY3JlYXRlRWxlbWVudE5TKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgcHJlZml4ICsgZmFjZXQpOwotLy8gICAgICAgICAgICAgIHZhbHVlQXR0ciA9IG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlZBTFVFX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotLy8gICAgICAgICAgICAgIGNoaWxkTm9kZUVsZW1lbnQuc2V0QXR0cmlidXRlKHZhbHVlQXR0ci5nZXROYW1lKCksIHZhbHVlQXR0ci5nZXRWYWx1ZSgpKTsKLS8vICAgICAgICAgICAgICAvLyBhZGQgYW5kIGZvcm1hdCBjaGlsZAotLy8gICAgICAgICAgICAgIGRlcml2ZWRCeUVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGROb2RlRWxlbWVudCk7Ci0vLyAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQuc2V0RWxlbWVudChjaGlsZE5vZGVFbGVtZW50KTsKLS8vICAgICAgICAgICAgICBYU0RET01IZWxwZXIuZm9ybWF0Q2hpbGQoY2hpbGROb2RlRWxlbWVudCk7Ci0vLwotLy8gICAgICAgICAgICAgIC8vIFhTRFNjaGVtYUhlbHBlci51cGRhdGVFbGVtZW50KHhzZFNpbXBsZVR5cGUpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCA9PSBudWxsKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgcmV0dXJuOwotLy8gICAgICAgICAgICB9Ci0vLwotLy8gICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQuc2V0TGV4aWNhbFZhbHVlKG5ld1ZhbHVlKTsKLS8vCi0vLyAgICAgICAgICAgICAgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWF4RmFjZXQgfHwgdGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNaW5GYWNldCkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNYXhGYWNldCkKLS8vICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWF4RXhjbHVzaXZlRmFjZXQpCi0vLyAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICBYU0RNYXhJbmNsdXNpdmVGYWNldCB4c2RNYXhJbmNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKTsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAoeHNkTWF4SW5jbHVzaXZlRmFjZXQgIT0gbnVsbCkKLS8vICAgICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHhzZE1heEluY2x1c2l2ZUZhY2V0RWxlbWVudCA9IHhzZE1heEluY2x1c2l2ZUZhY2V0LmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh4c2RNYXhJbmNsdXNpdmVGYWNldEVsZW1lbnQpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1heEluY2x1c2l2ZUZhY2V0KQotLy8gICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgWFNETWF4RXhjbHVzaXZlRmFjZXQgeHNkTWF4RXhjbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1heEV4Y2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgaWYgKHhzZE1heEV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0vLyAgICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB4c2RNYXhFeGNsdXNpdmVGYWNldEVsZW1lbnQgPSB4c2RNYXhFeGNsdXNpdmVGYWNldC5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoeHNkTWF4RXhjbHVzaXZlRmFjZXRFbGVtZW50KTsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWluRmFjZXQpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1pbkV4Y2x1c2l2ZUZhY2V0KQotLy8gICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgWFNETWluSW5jbHVzaXZlRmFjZXQgeHNkTWluSW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgaWYgKHhzZE1pbkluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0vLyAgICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB4c2RNaW5JbmNsdXNpdmVGYWNldEVsZW1lbnQgPSB4c2RNaW5JbmNsdXNpdmVGYWNldC5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoeHNkTWluSW5jbHVzaXZlRmFjZXRFbGVtZW50KTsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNaW5JbmNsdXNpdmVGYWNldCkKLS8vICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgIFhTRE1pbkV4Y2x1c2l2ZUZhY2V0IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNaW5FeGNsdXNpdmVGYWNldCgpOwotLy8gICAgICAgICAgICAgICAgICAgIGlmICh4c2RNaW5FeGNsdXNpdmVGYWNldCAhPSBudWxsKQotLy8gICAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgeHNkTWluRXhjbHVzaXZlRmFjZXRFbGVtZW50ID0geHNkTWluRXhjbHVzaXZlRmFjZXQuZ2V0RWxlbWVudCgpOwotLy8gICAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHhzZE1pbkV4Y2x1c2l2ZUZhY2V0RWxlbWVudCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgICAgLy8gbmV3VmFsdWUubGVuZ3RoID09IDAKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIEVsZW1lbnQgdGFyZ2V0RmFjZXRFbGVtZW50ID0gdGFyZ2V0RmFjZXQuZ2V0RWxlbWVudCgpOwotLy8gICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh0YXJnZXRGYWNldEVsZW1lbnQpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoY29sdW1uUHJvcGVydGllc1syXSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCAhPSBudWxsKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICB0YXJnZXRGYWNldC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgZWxzZQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHRhcmdldEZhY2V0LmdldEVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICB4c2RTaW1wbGVUeXBlLnNldEVsZW1lbnQoc2ltcGxlVHlwZUVsZW1lbnQpOwotLy8gICAgICAgICAgLy8geHNkU2ltcGxlVHlwZS51cGRhdGVFbGVtZW50KCk7Ci0vLyAgICAgICAgICByZWZyZXNoKCk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICBwcml2YXRlIFhTRENvbnN0cmFpbmluZ0ZhY2V0IGdldFhTRENvbnN0cmFpbmluZ0ZhY2V0KFN0cmluZyBmYWNldFN0cmluZykKLS8vICB7Ci0vLyAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBnZXRJbnB1dCgpOwotLy8gICAgTGlzdCBsaXN0ID0geHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCk7Ci0vLyAgICBpZiAobGlzdCA9PSBudWxsKQotLy8gICAgewotLy8gICAgICByZXR1cm4gbnVsbDsKLS8vICAgIH0KLS8vICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0vLyAgICBYU0RDb25zdHJhaW5pbmdGYWNldCB0YXJnZXRGYWNldCA9IG51bGw7Ci0vLwotLy8gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotLy8gICAgewotLy8gICAgICBYU0RDb25zdHJhaW5pbmdGYWNldCB4c2RDb25zdHJhaW5pbmdGYWNldCA9IChYU0RDb25zdHJhaW5pbmdGYWNldCkgaXRlci5uZXh0KCk7Ci0vLyAgICAgIGlmICh4c2RDb25zdHJhaW5pbmdGYWNldC5nZXRGYWNldE5hbWUoKS5lcXVhbHMoZmFjZXRTdHJpbmcpKQotLy8gICAgICB7Ci0vLyAgICAgICAgdGFyZ2V0RmFjZXQgPSB4c2RDb25zdHJhaW5pbmdGYWNldDsKLS8vICAgICAgICBicmVhazsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgcmV0dXJuIHRhcmdldEZhY2V0OwotLy8gIH0KLS8vCi0vLyAgcHJpdmF0ZSBYU0RDb25zdHJhaW5pbmdGYWNldCBjcmVhdGVGYWNldChTdHJpbmcgZmFjZXQpCi0vLyAgewotLy8gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0vLyAgICBYU0RDb25zdHJhaW5pbmdGYWNldCB4c2RGYWNldCA9IG51bGw7Ci0vLyAgICBpZiAoZmFjZXQuZXF1YWxzKCJsZW5ndGgiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRExlbmd0aEZhY2V0KCk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1pbkxlbmd0aCIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETWluTGVuZ3RoRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4TGVuZ3RoIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RNYXhMZW5ndGhGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5JbmNsdXNpdmUiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1pbkV4Y2x1c2l2ZSIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETWluRXhjbHVzaXZlRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4SW5jbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RNYXhJbmNsdXNpdmVGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtYXhFeGNsdXNpdmUiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1heEV4Y2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICB9Ci0vLwotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJ0b3RhbERpZ2l0cyIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNEVG90YWxEaWdpdHNGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJmcmFjdGlvbkRpZ2l0cyIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNERnJhY3Rpb25EaWdpdHNGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RXaGl0ZVNwYWNlRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIHJldHVybiB4c2RGYWNldDsKLS8vICB9Ci0vLwotLy8gIC8qKgotLy8gICAqIEdldCB0aGUgdG9vbHRpcCBmb3IgdGhlIGZhY2V0Ci0vLyAgICovCi0vLyAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwKFN0cmluZyBmYWNldCkKLS8vICB7Ci0vLyAgICBTdHJpbmcga2V5ID0gIiI7Ci0vLyAgICBpZiAoZmFjZXQuZXF1YWxzKCJsZW5ndGgiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX0xFTkdUSCI7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1pbkxlbmd0aCIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfTUlOX0xFTiI7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heExlbmd0aCIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfTUFYX0xFTiI7Ci0vLyAgICB9Ci0vLwotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5JbmNsdXNpdmUiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX01JTl9JTkNMVVNJVkUiOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5FeGNsdXNpdmUiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX01JTl9FWENMVVNJVkUiOwotLy8gICAgfQotLy8KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4SW5jbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9NQVhfSU5DTFVTSVZFIjsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4RXhjbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9NQVhfRVhDTFVTSVZFIjsKLS8vICAgIH0KLS8vCi0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoInRvdGFsRGlnaXRzIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9UT1RBTF9ESUdJVFMiOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJmcmFjdGlvbkRpZ2l0cyIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfRlJBQ1RJT05fRElHSVRTIjsKLS8vICAgIH0KLS8vCi0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIndoaXRlU3BhY2UiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX1dISVRFX1NQQUNFIjsKLS8vICAgIH0KLS8vCi0vLyAgICByZXR1cm4gKGtleSAhPSBudWxsKSA/IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoa2V5KSA6ICIiOwotLy8gIH0KLS8vCi0vLyAgLyoqCi0vLyAgICogVGhpcyBsaXN0ZW5lciBkZXRlY3RzIHdoaWNoIHJvdyBpcyBzZWxlY3RlZCBhbmQgYWRkIGEgdG9vbCB0aXAgZm9yIHRoYXQgcm93Ci0vLyAgICovCi0vLyAgcHVibGljIGNsYXNzIE15TW91c2VUcmFja0xpc3RlbmVyIGV4dGVuZHMgTW91c2VUcmFja0FkYXB0ZXIKLS8vICB7Ci0vLyAgICBwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkKLS8vICAgIHsKLS8vICAgICAgVGFibGVJdGVtIGl0ZW0gPSBnZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0vLyAgICAgIGlmIChpdGVtICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBPYmplY3QgbyA9IGl0ZW0uZ2V0RGF0YSgpOwotLy8gICAgICAgIGlmIChvICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgU3RyaW5nIGZhY2V0TmFtZSA9IChTdHJpbmcpIG87Ci0vLyAgICAgICAgICBnZXRUYWJsZSgpLnNldFRvb2xUaXBUZXh0KGdldFRvb2xUaXAoZmFjZXROYW1lKSk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICAvKioKLS8vICAgKiBCYXNlZCBvbiB0aGUgc2VsZWN0aW9uLCBkZXRlY3RzIGlmIGl0IGlzIGEgd2hpdGUgc3BhY2Ugb3Igbm90LCBhbmQgYWRkIHRoZQotLy8gICAqIGNvcnJlc3BvbmRpbmcgY2VsbCBlZGl0b3JzCi0vLyAgICovCi0vLyAgcHVibGljIGNsYXNzIFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLS8vICB7Ci0vLyAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLS8vICAgIHsKLS8vICAgICAgT2JqZWN0IHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotLy8gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLS8vICAgICAgewotLy8gICAgICAgIE9iamVjdCBvID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotLy8gICAgICAgIGlmIChvICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgU3RyaW5nIGZhY2V0ID0gKFN0cmluZykgbzsKLS8vICAgICAgICAgIGlmIChmYWNldC5lcXVhbHMoIndoaXRlU3BhY2UiKSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgc2V0Q2VsbEVkaXRvcnMoYWx0Q2VsbEVkaXRvcnMpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICBjbGFzcyBGYWNldHNUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0vLyAgewotLy8gICAgcHJvdGVjdGVkIFN0cmluZyBmYWNldDsKLS8vCi0vLyAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0vLyAgICB7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkKLS8vICAgIHsKLS8vICAgICAgTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotLy8gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpbnB1dFhTRFNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0RWxlbWVudDsKLS8vICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYmFzZSA9IGlucHV0WFNEU2ltcGxlVHlwZS5nZXRQcmltaXRpdmVUeXBlRGVmaW5pdGlvbigpOwotLy8KLS8vICAgICAgaWYgKGJhc2UgIT0gbnVsbCkKLS8vICAgICAgewotLy8gICAgICAgIEl0ZXJhdG9yIHZhbGlkRmFjZXRzID0gaW5wdXRYU0RTaW1wbGVUeXBlLmdldFZhbGlkRmFjZXRzKCkuaXRlcmF0b3IoKTsKLS8vICAgICAgICB3aGlsZSAodmFsaWRGYWNldHMuaGFzTmV4dCgpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFN0cmluZyBhVmFsaWRGYWNldCA9IChTdHJpbmcpIHZhbGlkRmFjZXRzLm5leHQoKTsKLS8vICAgICAgICAgIGlmICghKGFWYWxpZEZhY2V0LmVxdWFscygicGF0dGVybiIpIHx8IGFWYWxpZEZhY2V0LmVxdWFscygiZW51bWVyYXRpb24iKSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHYuYWRkKGFWYWxpZEZhY2V0KTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgcmV0dXJuIHYudG9BcnJheSgpOwotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotLy8gICAgewotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgY2xhc3MgRmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLS8vICB7Ci0vLyAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuIG51bGw7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0vLyAgICB7Ci0vLyAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKQotLy8gICAgICB7Ci0vLyAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLS8vICAgICAgICBYU0RDb25zdHJhaW5pbmdGYWNldCB0YXJnZXRGYWNldCA9IGdldFhTRENvbnN0cmFpbmluZ0ZhY2V0KChTdHJpbmcpIGVsZW1lbnQpOwotLy8gICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpCi0vLyAgICAgICAgewotLy8gICAgICAgIGNhc2UgMDoKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICB2YWx1ZSA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0vLyAgICAgICAgICBicmVhazsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgY2FzZSAxOgotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGlmICh0YXJnZXRGYWNldCA9PSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2YWx1ZSA9ICIiOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2YWx1ZSA9IHRhcmdldEZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotLy8gICAgICAgICAgfQotLy8KLS8vICAgICAgICAgIGJyZWFrOwotLy8gICAgICAgIH0KLS8vICAgICAgICBjYXNlIDI6Ci0vLyAgICAgICAgewotLy8gICAgICAgICAgaWYgKHRhcmdldEZhY2V0ID09IG51bGwpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIEVsZW1lbnQgZWxlbSA9IHRhcmdldEZhY2V0LmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgdmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLS8vICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0vLyAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIHJldHVybiB2YWx1ZTsKLS8vICAgICAgfQotLy8gICAgICByZXR1cm4gIiI7Ci0vLyAgICB9Ci0vLyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9JRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmU2MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9JRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLQotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIKLXsKLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpOwotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm9kZUFkYXB0ZXIgYWRhcHRlcik7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvTXVsdGlwbGljaXR5U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9NdWx0aXBsaWNpdHlTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTkzZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9NdWx0aXBsaWNpdHlTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVNYXhPY2N1cnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE11bHRpcGxpY2l0eVNlY3Rpb24gZXh0ZW5kcyBSZWZhY3RvcmluZ1NlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIENDb21ibyBtaW5Db21ibywgbWF4Q29tYm87Ci0KLSAgcHVibGljIE11bHRpcGxpY2l0eVNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBtaW5Db21ibykKLSAgICB7Ci0gICAgICB1cGRhdGVNaW5BdHRyaWJ1dGUoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IG1heENvbWJvKQotICAgIHsKLSAgICAgIHVwZGF0ZU1heEF0dHJpYnV0ZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBtaW5Db21ibykKLSAgICB7Ci0gICAgICB1cGRhdGVNaW5BdHRyaWJ1dGUoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbWF4Q29tYm8pCi0gICAgewotICAgICAgdXBkYXRlTWF4QXR0cmlidXRlKCk7Ci0gICAgfQotICAgIHN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXhBdHRyaWJ1dGUoKQotICB7Ci0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gbnVsbDsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgICB7Ci0gICAgICBwYXJ0aWNsZSA9IGdldEFzc29jaWF0ZWRQYXJ0aWNsZSgoWFNEUGFydGljbGVDb250ZW50KSBpbnB1dCk7Ci0gICAgfQotICAgIGlmIChwYXJ0aWNsZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG1heENvbWJvLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAKLSAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICBwYXJ0aWNsZS51bnNldE1heE9jY3VycygpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaW50IG5ld01heCA9IDE7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5lcXVhbHMoInVuYm91bmRlZCIpIHx8IG5ld1ZhbHVlLmVxdWFscygiKiIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgewotICAgICAgICAgIG5ld01heCA9IFhTRFBhcnRpY2xlLlVOQk9VTkRFRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5ld01heCA9IEludGVnZXIucGFyc2VJbnQobmV3VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgICBVcGRhdGVNYXhPY2N1cnNDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlTWF4T2NjdXJzQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRV9NQVhJTVVNX09DQ1VSUkVOQ0UsIHBhcnRpY2xlLCBuZXdNYXgpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX1ZBTFVFX0ZPUl9NQVhJTVVNX09DQ1VSUkVOQ0UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU1pbkF0dHJpYnV0ZSgpCi0gIHsKLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBudWxsOwotCi0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEUGFydGljbGVDb250ZW50KQotICAgIHsKLSAgICAgIHBhcnRpY2xlID0gZ2V0QXNzb2NpYXRlZFBhcnRpY2xlKChYU0RQYXJ0aWNsZUNvbnRlbnQpIGlucHV0KTsKLSAgICB9Ci0gICAgaWYgKHBhcnRpY2xlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbWluQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHBhcnRpY2xlLnVuc2V0TWluT2NjdXJzKCk7Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaW50IG5ld01pbiA9IDE7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5lcXVhbHMoInVuYm91bmRlZCIpIHx8IG5ld1ZhbHVlLmVxdWFscygiKiIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgewotICAgICAgICAgIG5ld01pbiA9IFhTRFBhcnRpY2xlLlVOQk9VTkRFRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdNaW4gPSBJbnRlZ2VyLnBhcnNlSW50KG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBVcGRhdGVNaW5PY2N1cnNDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlTWluT2NjdXJzQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRV9NSU5JTVVNX09DQ1VSUkVOQ0UsIHBhcnRpY2xlLCBuZXdNaW4pOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgewotCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTWluTWF4KCkKLSAgewotICAgIGJvb2xlYW4gcmVmcmVzaE1pblRleHQgPSB0cnVlOwotICAgIGJvb2xlYW4gcmVmcmVzaE1heFRleHQgPSB0cnVlOwotICAgIGlmIChtaW5Db21iby5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJlZnJlc2hNaW5UZXh0ID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChtYXhDb21iby5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJlZnJlc2hNYXhUZXh0ID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChyZWZyZXNoTWluVGV4dCkKLSAgICB7Ci0gICAgICBtaW5Db21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBpZiAocmVmcmVzaE1heFRleHQpCi0gICAgewotICAgICAgbWF4Q29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUNvbnRlbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gZ2V0QXNzb2NpYXRlZFBhcnRpY2xlKChYU0RQYXJ0aWNsZUNvbnRlbnQpIGlucHV0KTsKLSAgICAgICAgaWYgKHBhcnRpY2xlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBtaW5UZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YocGFydGljbGUuZ2V0TWluT2NjdXJzKCkpKTsKLSAgICAgICAgICAvLyBtYXhUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YocGFydGljbGUuZ2V0TWF4T2NjdXJzKCkpKTsKLSAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBwYXJ0aWNsZS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbWluID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgICAgICAgU3RyaW5nIG1heCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIGlmIChtaW4gIT0gbnVsbCAmJiByZWZyZXNoTWluVGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWluQ29tYm8uc2V0VGV4dChtaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heCAhPSBudWxsICYmIHJlZnJlc2hNYXhUZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtYXhDb21iby5zZXRUZXh0KG1heCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRFBhcnRpY2xlIGdldEFzc29jaWF0ZWRQYXJ0aWNsZShYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50KQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcCA9IHBhcnRpY2xlQ29udGVudC5nZXRDb250YWluZXIoKTsKLSAgICBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgIHsKLSAgICAgIHJldHVybiAoWFNEUGFydGljbGUpIHhzZENvbXA7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChtaW5Db21ibyAhPSBudWxsICYmICFtaW5Db21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobWluQ29tYm8pOwotICAgIGlmIChtYXhDb21ibyAhPSBudWxsICYmICFtYXhDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobWF4Q29tYm8pOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1JlZmFjdG9yaW5nU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9SZWZhY3RvcmluZ1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5MTVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1JlZmFjdG9yaW5nU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JU2VsZWN0aW9uTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuUmVuYW1lQ29tcG9uZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZhY3RvcmluZ1NlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXIKLXsKLSAgLyoqCi0gICAqIENsaWNraW5nIG9uIGl0IGludm9rZXMgdGhlIHJlZmFjdG9yLT5yZW5hbWUgYWN0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSBJbWFnZUh5cGVybGluayByZW5hbWVIeXBlcmxpbms7Ci0KLSAgLyoqCi0gICAqIEludm9rZXMgdGhlIHJlZmFjdG9yLT5yZW5hbWUgYWN0aW9uIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbnZva2VSZW5hbWVSZWZhY3RvcmluZygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgZWRpdG9yLmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICBJU2VsZWN0aW9uTWFwcGVyIG1hcHBlciA9IChJU2VsZWN0aW9uTWFwcGVyKSBlZGl0b3IuZ2V0QWRhcHRlcihJU2VsZWN0aW9uTWFwcGVyLmNsYXNzKTsKLSAgICBzZWxlY3Rpb24gPSBtYXBwZXIgIT0gbnVsbCA/IG1hcHBlci5tYXBTZWxlY3Rpb24oc2VsZWN0aW9uKSA6IHNlbGVjdGlvbjsKLSAgICBSZW5hbWVDb21wb25lbnRBY3Rpb24gYWN0aW9uID0gbmV3IFJlbmFtZUNvbXBvbmVudEFjdGlvbihzZWxlY3Rpb24sIHNjaGVtYSk7Ci0gICAgYWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotICAgIGFjdGlvbi5ydW4oKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIHRoZSByZWZhY3Rvci9yZW5hbWUgaHlwZXJsaW5rIHNob3duIGJlc2lkZSBhIGNvbXBvbmVudCBuYW1lLgotICAgKiBDbGlja2luZyBvbiB0aGUgaHlwZXJsaW5rIGludm9rZXMgdGhlIHJlZmFjdG9yL3JlbmFtZSBhY3Rpb24uCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlLiBNdXN0IG5vdCBiZSBudWxsLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVuYW1lSHlwZXJsaW5rKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICByZW5hbWVIeXBlcmxpbmsgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlSW1hZ2VIeXBlcmxpbmsocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICByZW5hbWVIeXBlcmxpbmsuc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9xdWlja2Fzc2lzdC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICByZW5hbWVIeXBlcmxpbmsuc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX1RPT0xUSVBfUkVOQU1FX1JFRkFDVE9SKTsKLSAgICByZW5hbWVIeXBlcmxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIodGhpcyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldFJlbmFtZUh5cGVybGlua0VuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpCi0gIHsKLSAgICByZW5hbWVIeXBlcmxpbmsuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyI2xpbmtBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKQotICB7Ci0gICAgaW52b2tlUmVuYW1lUmVmYWN0b3JpbmcoKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lciNsaW5rRW50ZXJlZChvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChIeXBlcmxpbmtFdmVudCBlKQotICB7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JSHlwZXJsaW5rTGlzdGVuZXIjbGlua0V4aXRlZChvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TY2hlbWFMb2NhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU2NoZW1hTG9jYXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Nzk4YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TY2hlbWFMb2NhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREluY2x1ZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFJlZGVmaW5lSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hTG9jYXRpb25TZWN0aW9uIGV4dGVuZHMgQ29tbW9uRGlyZWN0aXZlc1NlY3Rpb24KLXsKLQkgIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0JICAKLQkgIC8qKgotCSAgICogCi0JICAgKi8KLQkgIHB1YmxpYyBTY2hlbWFMb2NhdGlvblNlY3Rpb24oKQotCSAgewotCSAgICBzdXBlcigpOwotCSAgfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCQkgKi8KLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLQkJewotCQkJY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgIAotICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCQkvLyBDcmVhdGUgU2NoZW1hIExvY2F0aW9uIExhYmVsCi0JCQlDTGFiZWwgc2NoZW1hTG9jYXRpb25MYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfU0NIRU1BX0xPQ0FUSU9OIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgICAgc2NoZW1hTG9jYXRpb25MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCi0gICAgICAvLyBDcmVhdGUgU2NoZW1hIExvY2F0aW9uIFRleHQKLSAgICAgIHNjaGVtYUxvY2F0aW9uVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotICAgICAgc2NoZW1hTG9jYXRpb25UZXh0LnNldEVkaXRhYmxlKHRydWUpOwotICAgICAgYXBwbHlBbGxMaXN0ZW5lcnMoc2NoZW1hTG9jYXRpb25UZXh0KTsgICAgICAgCi0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgc2NoZW1hTG9jYXRpb25UZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2NoZW1hTG9jYXRpb25UZXh0LAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0lOQ0xVREVfUkVERUZJTkVfX1NDSEVNQUxPQ0FUSU9OKTsKLSAgICAgIAotCQkJLy8gQ3JlYXRlIFdpemFyZCBCdXR0b24KLQkJCXdpemFyZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgICB3aXphcmRCdXR0b24uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9icm93c2VidXR0b24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQkJd2l6YXJkQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl3aXphcmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQkKLSAgICAgIC8vIGVycm9yIHRleHQKLSAgICAgIGVycm9yVGV4dCA9IG5ldyBTdHlsZWRUZXh0KGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgICAgZXJyb3JUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgIGVycm9yVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZXJyb3JUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJfQotCQkKLSAgICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gd2l6YXJkQnV0dG9uKQotICAgICAgewotICAgICAgICBYU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyLnVwZGF0ZVNjaGVtYUxvY2F0aW9uKHhzZFNjaGVtYSxpbnB1dCx0cnVlKTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQkJewotCQkJCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREluY2x1ZGUpCi0gICAgICAgIHsgCi0JCQkJCWVsZW1lbnQgPSAoKFhTREluY2x1ZGVJbXBsKSBpbnB1dCkuZ2V0RWxlbWVudCgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgICB7Ci0JCQkJCWVsZW1lbnQgPSAoKFhTRFJlZGVmaW5lSW1wbCkgaW5wdXQpLmdldEVsZW1lbnQoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2NhdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzY2hlbWFMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLQkJCQkJc2NoZW1hTG9jYXRpb25UZXh0LnNldFRleHQobG9jYXRpb24pOwotCQkJCX0KLQotICAgICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICAgKi8KLQkgIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAgewotCSAgICByZXR1cm4gdHJ1ZTsKLQkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5MGJlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzLlR5cGVTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotewotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlOwotICAvKioKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqLwotICBwdWJsaWMgU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgdGhpcy5zaW1wbGVUeXBlID0gc2ltcGxlVHlwZTsKLSAgfQotICAKLSAgVGFibGUgdGFibGU7Ci0gIFR5cGVTZWN0aW9uIHR5cGVTZWN0aW9uOwotICBCdXR0b24gYWRkQnV0dG9uLCByZW1vdmVCdXR0b247Ci0gIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgbWVtYmVyVHlwZXNMaXN0OwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgcmVzdWx0OwotCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpCi0gIHsKLSAgICBpZiAoYnV0dG9uSWQgPT0gV2luZG93Lk9LKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGludCBsZW5ndGggPSBtZW1iZXJUeXBlc0xpc3QuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICBmb3IgKGludCBpPTAgOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHNiLmFwcGVuZChtZW1iZXJUeXBlc0xpc3QuZ2V0SXRlbShpKSk7Ci0gICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkKLSAgICAgICAgewotICAgICAgICAgIHNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKSB7IHJldHVybiByZXN1bHQ7IH0KLQotICAvLwotICAvLyBDcmVhdGUgdGhlIGNvbnRyb2xzCi0gIC8vCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjbGllbnQgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBnZXRTaGVsbCgpLnNldFRleHQoIlVuaW9uICIgKyBYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBMYWJlbCBpbnN0cnVjdGlvbnMgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTEVGVCB8IFNXVC5XUkFQKTsKLSAgICBpbnN0cnVjdGlvbnMuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfU0VMRUNUX01FTUJFUlRZUEVTIikpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgQ29tcG9zaXRlIGNvbHVtbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNsaWVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgY2NHTCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgY2NHTC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgIGNjR0wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgIGNjR0wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBjY0dMLm1hcmdpbldpZHRoID0gMDsKLSAgICBjY0dMLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgY2NHTC5udW1Db2x1bW5zID0gMzsKLSAgICBjb2x1bW5zQ29tcG9zaXRlLnNldExheW91dChjY0dMKTsKLSAgICAKLSAgICBHcmlkRGF0YSBjY0dEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgY2NHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjY0dELmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbHVtbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShjY0dEKTsgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdHlwZVNlY3Rpb24gPSBuZXcgVHlwZVNlY3Rpb24oY29sdW1uc0NvbXBvc2l0ZSk7Ci0gICAgdHlwZVNlY3Rpb24uc2V0U2hvd1VzZXJDb21wbGV4VHlwZShmYWxzZSk7Ci0KLSAgICB0eXBlU2VjdGlvbi5jcmVhdGVDbGllbnQoY29sdW1uc0NvbXBvc2l0ZSk7Ci0gICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihjb2x1bW5zQ29tcG9zaXRlLCAxKTsKLSAgICAKLSAgICBMYWJlbCBtZW1iZXJMaXN0TGFiZWwgPSBuZXcgTGFiZWwoY29sdW1uc0NvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgIG1lbWJlckxpc3RMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9NRU1CRVJUWVBFU19WQUxVRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIENvbXBvc2l0ZSBkYXRhQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGRjR0wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGRjR0wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICBkY0dMLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZGNHTC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgZGNHTC5udW1Db2x1bW5zID0gMzsKLSAgICBkYXRhQ29tcG9zaXRlLnNldExheW91dChkY0dMKTsKLSAgICAKLSAgICBHcmlkRGF0YSBkY0dEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGNHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkY0dELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhQ29tcG9zaXRlLnNldExheW91dERhdGEoZGNHRCk7Ci0gICAgCi0gICAgdGFibGUgPSBuZXcgVGFibGUoZGF0YUNvbXBvc2l0ZSwKLSAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOyAKLSAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLSAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdkMi5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QyLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkMi52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QyLmhlaWdodEhpbnQgPSAyMDA7Ci0gICAgZ2QyLndpZHRoSGludCA9IDIwMDsKLSAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLSAgICAvLyBGaWxsIHRhYmxlCi0gICAgaGFuZGxlU2V0SW5wdXQoKTsKLSAgICB0YWJsZS5nZXRJdGVtQ291bnQoKTsKLQotICAgIFRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0gICAgdGMuc2V0V2lkdGgoMjAwKTsKLSAgICB0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGF0YUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgYmNHTCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgYmNHTC5udW1Db2x1bW5zID0gMTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJjR0wpOwotICAgIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgYWRkQnV0dG9uLnNldFRleHQoIj4iKTsgLy8kTk9OLU5MUy0xJAotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KCI8Iik7IC8vJE5PTi1OTFMtMSQKLSAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGxpc3RDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRhdGFDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IG10R0wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIG10R0wubnVtQ29sdW1ucyA9IDE7Ci0gICAgbXRHTC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIG10R0wubWFyZ2luV2lkdGggPSAwOwotICAgIG10R0wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgIG10R0wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICBsaXN0Q29tcG9zaXRlLnNldExheW91dChtdEdMKTsKLQotICAgIEdyaWREYXRhIG10R0QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBtdEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIG10R0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIG10R0QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG10R0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGlzdENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG10R0QpOwotICAgIAotICAgIG1lbWJlclR5cGVzTGlzdCA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0KGxpc3RDb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotICAgIEdyaWREYXRhIG10bEdEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgbXRsR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgbXRsR0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIG10bEdELnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBtdGxHRC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBtdGxHRC5oZWlnaHRIaW50ID0gMjAwOwotICAgIG10bEdELndpZHRoSGludCA9IDIwMDsKLSAgICBtZW1iZXJUeXBlc0xpc3Quc2V0TGF5b3V0RGF0YShtdGxHRCk7Ci0gICAgCi0gICAgaW5pdGlhbGl6ZU1lbWJlckxpc3RDb250ZW50KCk7Ci0gICAgcmV0dXJuIGNsaWVudDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplTWVtYmVyTGlzdENvbnRlbnQoKQotICB7Ci0vLyAgICBTdHJpbmcgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7Ci0vLyAgICBpZiAocmVzdWx0ID09IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIHJldHVybjsKLS8vICAgIH0KLS8vICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVzdWx0KTsKLS8vICAgIHdoaWxlICh0b2tlbi5oYXNNb3JlVG9rZW5zKCkpCi0vLyAgICB7Ci0vLyAgICAgIG1lbWJlclR5cGVzTGlzdC5hZGQodG9rZW4ubmV4dFRva2VuKCkpOwotLy8gICAgfQotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBzaW1wbGVUeXBlLmdldFNjaGVtYSgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNpbXBsZVR5cGUuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24paS5uZXh0KCkpLmdldFFOYW1lKHNjaGVtYSk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgbWVtYmVyVHlwZXNMaXN0LmFkZChuYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkgJiYgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLmdldFNlbGVjdGlvbigpKQotICAgICB7Ci0gICAgICBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkgJiYgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5nZXRTZWxlY3Rpb24oKSkKLSAgICAgewotICAgICAgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZShmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbikKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICBpbnQgc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uID49IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0eXBlVG9BZGQgPSBpdGVtc1tzZWxlY3Rpb25dLmdldERhdGEoKS50b1N0cmluZygpOwotICAgICAgICBpZiAobWVtYmVyVHlwZXNMaXN0LmluZGV4T2YodHlwZVRvQWRkKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBtZW1iZXJUeXBlc0xpc3QuYWRkKGl0ZW1zW3NlbGVjdGlvbl0uZ2V0RGF0YSgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJlbW92ZUJ1dHRvbikKLSAgICB7Ci0gICAgICBTdHJpbmdbXSB0eXBlc1RvUmVtb3ZlID0gbWVtYmVyVHlwZXNMaXN0LmdldFNlbGVjdGlvbigpOwotICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdHlwZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbWVtYmVyVHlwZXNMaXN0LnJlbW92ZSh0eXBlc1RvUmVtb3ZlW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVNldElucHV0KCkKLSAgewotICAgIHBvcHVsYXRlQnVpbHRJblR5cGUoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcG9wdWxhdGVCdWlsdEluVHlwZSgpCi0gIHsKLSAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICBMaXN0IGl0ZW1zID0gZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgICB7Ci0gICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgIGl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICBpdGVtLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGl0ZW0uc2V0RGF0YShpdGVtcy5nZXQoaSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoYm9vbGVhbiBzaG93QW5vbnltb3VzKQotICB7Ci0gICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgaWYgKHNob3dBbm9ueW1vdXMpCi0gICAgIHsKLSAgICAgIFRhYmxlSXRlbSBhbm9ueW1vdXNJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgYW5vbnltb3VzSXRlbS5zZXRUZXh0KCIqKmFub255bW91cyoqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGFub255bW91c0l0ZW0uc2V0RGF0YSgiKiphbm9ueW1vdXMqKiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgIHsKLSAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgaXRlbS5zZXRUZXh0KGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICAgIGl0ZW0uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaXRlbS5zZXREYXRhKGl0ZW1zLmdldChpKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHNpbXBsZVR5cGUuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiBoZWxwZXIuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoc2ltcGxlVHlwZS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIGhlbHBlci5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTU2NGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuTmF2aWdhYmxlVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRW51bWVyYXRpb25zQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5DaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5TZXRYU0RGYWNldFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHMuRW51bWVyYXRpb25zRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5SZWdleFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhdHRlcm5GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0IGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIExpc3RlbmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgaW50IEVOVU1FUkFUSU9OID0gMDsKLSAgcHVibGljIHN0YXRpYyBpbnQgUEFUVEVSTiA9IDE7Ci0gIAotICBpbnQga2luZDsKLSAgQ29uc3RyYWludHNUYWJsZVZpZXdlciBjb25zdHJhaW50c1RhYmxlVmlld2VyOwotICBCdXR0b24gYWRkQnV0dG9uOwotICBCdXR0b24gYWRkVXNpbmdEaWFsb2dCdXR0b247Ci0gIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0gIEJ1dHRvbiBlZGl0QnV0dG9uOwotICBDb21wb3NpdGUgY29tcG9zaXRlOwotICBib29sZWFuIGlzRW5hYmxlZDsKLSAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeTsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaW5wdXQ7Ci0gIFhTREZlYXR1cmUgZmVhdHVyZTsKLSAgYm9vbGVhbiBpc1JlYWRPbmx5OwotICBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotICBYU0RGYWNldFNlY3Rpb24gZmFjZXRTZWN0aW9uOwotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBAcGFyYW0gY29tcG9zaXRlCi0gICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIEBwYXJhbSBpbnB1dAotICAgKiBAcGFyYW0gZmFjZXRTZWN0aW9uCi0gICAqLwotICBwdWJsaWMgU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldChDb21wb3NpdGUgY29tcG9zaXRlLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5LCBYU0RGZWF0dXJlIGZlYXR1cmUsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGlucHV0LCBYU0RGYWNldFNlY3Rpb24gZmFjZXRTZWN0aW9uKQotICB7Ci0gICAgdGhpcyhjb21wb3NpdGUsIGZhY3RvcnksIGZlYXR1cmUsIGlucHV0LCBmYWNldFNlY3Rpb24sIEVOVU1FUkFUSU9OKTsKLSAgfQotCi0gIHB1YmxpYyBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnksIFhTREZlYXR1cmUgZmVhdHVyZSwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaW5wdXQsIFhTREZhY2V0U2VjdGlvbiBmYWNldFNlY3Rpb24sIGludCBraW5kKQotICB7Ci0gICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgdGhpcy5jb21wb3NpdGUgPSBjb21wb3NpdGU7Ci0gICAgdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLSAgICB0aGlzLmZhY2V0U2VjdGlvbiA9IGZhY2V0U2VjdGlvbjsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgIAotICAgIGNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbW1hbmRTdGFjayhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKQotICB7Ci0gICAgdGhpcy5jb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNSZWFkT25seShib29sZWFuIGlzUmVhZE9ubHkpCi0gIHsKLSAgICB0aGlzLmlzUmVhZE9ubHkgPSBpc1JlYWRPbmx5OwotICB9Ci0KLSAgcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotICB7Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkKLSAgewotICAgIHRoaXMuaXNFbmFibGVkID0gaXNFbmFibGVkOwotICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgYWRkVXNpbmdEaWFsb2dCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgY29tcG9zaXRlLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgfQotCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgY29uc3RyYWludHNUYWJsZVZpZXdlciA9IG5ldyBDb25zdHJhaW50c1RhYmxlVmlld2VyKGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUYWJsZShjb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTikpOwotICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgIFRhYmxlIHRhYmxlID0gY29uc3RyYWludHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgIHRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IDE1MDsKLSAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHRhYmxlLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHRoaXMpOwotICAgIAotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIEdyaWRMYXlvdXQgYnV0dG9uQ29tcG9zaXRlTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBidXR0b25Db21wb3NpdGVMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBidXR0b25Db21wb3NpdGVMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBidXR0b25Db21wb3NpdGVMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25Db21wb3NpdGVMYXlvdXQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgCi0gICAgYWRkQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQURELCBTV1QuUFVTSCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBhZGRVc2luZ0RpYWxvZ0J1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9XSVRIX0RPVFMsIFNXVC5QVVNIKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgYWRkVXNpbmdEaWFsb2dCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhZGRVc2luZ0RpYWxvZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIGVkaXRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0FDVElPTl9FRElUX1dJVEhfRE9UUywgU1dULlBVU0gpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgCi0gICAgZGVsZXRlQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFLCBTV1QuUFVTSCk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIHNldEJ1dHRvblN0YXRlcyhraW5kKTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBUYWJsZSB0YWJsZSA9IGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuUmVzaXplICYmIGV2ZW50LndpZGdldCA9PSB0YWJsZSkKLSAgICB7Ci0gICAgICBUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IHRhYmxlLmdldENvbHVtbigwKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFdpZHRoKHRhYmxlLmdldFNpemUoKS54KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0vLyAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Q29uc3RyYWludEtpbmQoKQotICB7Ci0JICByZXR1cm4gdGhpcy5raW5kOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRCdXR0b25TdGF0ZXMoaW50IGtpbmQpCi0gIHsKLSAgICBib29sZWFuIGFkZCwgYWRkVXNpbmcsIGRlbGV0ZSwgZWRpdDsKLQotICAgIGJvb2xlYW4gbGlzdEhhc0l0ZW1zID0gZmFsc2U7Ci0gICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgY29uc3RyYWludHNUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHNlbGVjdGlvbi50b0xpc3QoKS5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBsaXN0SGFzSXRlbXMgPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChraW5kID09IEVOVU1FUkFUSU9OKQotICAgIHsKLSAgICAgIGFkZCA9IHRydWU7Ci0gICAgICBhZGRVc2luZyA9IHRydWU7Ci0gICAgICBlZGl0ID0gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UgaWYgKGtpbmQgPT0gUEFUVEVSTikKLSAgICB7Ci0gICAgICBhZGQgPSBmYWxzZTsKLSAgICAgIGFkZFVzaW5nID0gdHJ1ZTsKLSAgICAgIGVkaXQgPSBsaXN0SGFzSXRlbXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhZGQgPSB0cnVlOwotICAgICAgYWRkVXNpbmcgPSB0cnVlOwotICAgICAgZWRpdCA9IHRydWU7Ci0gICAgfQotICAgIGRlbGV0ZSA9IGxpc3RIYXNJdGVtczsKLQotICAgIGlmICghYWRkQnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChhZGQpOwotICAgIH0KLSAgICBpZiAoIWFkZFVzaW5nRGlhbG9nQnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBhZGRVc2luZ0RpYWxvZ0J1dHRvbi5zZXRFbmFibGVkKGFkZFVzaW5nKTsKLSAgICB9Ci0gICAgaWYgKCFkZWxldGVCdXR0b24uaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGRlbGV0ZSk7Ci0gICAgfQotICAgIGlmICghZWRpdEJ1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVkaXQpOwotICAgIH0KLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSBpbnB1dDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBzdC5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoZS53aWRnZXQgPT0gYWRkQnV0dG9uKQotICAgIHsKLSAgICAgIExpc3QgZW51bUxpc3QgPSBzdC5nZXRFbnVtZXJhdGlvbkZhY2V0cygpOwotICAgICAgU3RyaW5nQnVmZmVyIG5ld05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ2YWx1ZTEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaW50IHN1ZmZpeCA9IDE7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbnVtTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTREVudW1lcmF0aW9uRmFjZXQgZW51bUZhY2V0ID0gKFhTREVudW1lcmF0aW9uRmFjZXQpIGkubmV4dCgpOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhuZXdOYW1lLnRvU3RyaW5nKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN1ZmZpeCsrOwotICAgICAgICAgICAgbmV3TmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoInZhbHVlIiArIFN0cmluZy52YWx1ZU9mKHN1ZmZpeCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChraW5kID09IEVOVU1FUkFUSU9OKQotICAgICAgewotICAgICAgICBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0YXJnZXRTaW1wbGVUeXBlID0gbnVsbDsKLSAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RDb21tb25VSVV0aWxzLmdldEFub255bW91c1NpbXBsZVR5cGUoZmVhdHVyZSwgaW5wdXQpOwotICAgICAgICAgIGlmIChhbm9ueW1vdXNTaW1wbGVUeXBlID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbihpbnB1dCk7Ci0KLSAgICAgICAgICAgIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBuZXcgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0hBTkdFX1BBVFRFUk4sIGZlYXR1cmUpOwotICAgICAgICAgICAgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kLnNldEFub255bW91c1NpbXBsZVR5cGUoYW5vbnltb3VzU2ltcGxlVHlwZSk7Ci0gICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZCk7Ci0gICAgICAgICAgICBpbnB1dCA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRhcmdldFNpbXBsZVR5cGUgPSBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRhcmdldFNpbXBsZVR5cGUgPSBpbnB1dDsKLSAgICAgICAgfQotCi0gICAgICAgIEFkZEVudW1lcmF0aW9uc0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRFbnVtZXJhdGlvbnNDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OLCB0YXJnZXRTaW1wbGVUeXBlKTsKLSAgICAgICAgY29tbWFuZC5zZXRWYWx1ZShuZXdOYW1lLnRvU3RyaW5nKCkpOwotICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNvbW1hbmQpOwotICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgICBzZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBpbnQgbmV3SXRlbUluZGV4ID0gY29uc3RyYWludHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMTsKLSAgICAgICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5lZGl0RWxlbWVudChjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldEVsZW1lbnRBdChuZXdJdGVtSW5kZXgpLCAwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gYWRkVXNpbmdEaWFsb2dCdXR0b24pCi0gICAgewotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAvLyBpZiBpdCBpcyBudWxsLCBnZXQgdGhlIGRlZmF1bHQgb25lCi0gICAgICBkaXNwbGF5ID0gZGlzcGxheSA9PSBudWxsID8gRGlzcGxheS5nZXREZWZhdWx0KCkgOiBkaXNwbGF5OwotICAgICAgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0KLSAgICAgIGlmIChraW5kID09IFBBVFRFUk4pCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpbml0aWFsVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBSZWdleFdpemFyZCB3aXphcmQgPSBuZXcgUmVnZXhXaXphcmQoaW5pdGlhbFZhbHVlKTsKLQotICAgICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0KLSAgICAgICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbmV3UGF0dGVybiA9IHdpemFyZC5nZXRQYXR0ZXJuKCk7Ci0gICAgICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLSAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0YXJnZXRTaW1wbGVUeXBlID0gbnVsbDsKLSAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RDb21tb25VSVV0aWxzLmdldEFub255bW91c1NpbXBsZVR5cGUoZmVhdHVyZSwgaW5wdXQpOwotICAgICAgICAgICAgaWYgKGFub255bW91c1NpbXBsZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKGlucHV0KTsKLQotICAgICAgICAgICAgICBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kID0gbmV3IENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRV9QQVRURVJOLCBmZWF0dXJlKTsKLSAgICAgICAgICAgICAgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kLnNldEFub255bW91c1NpbXBsZVR5cGUoYW5vbnltb3VzU2ltcGxlVHlwZSk7Ci0gICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kKTsKLSAgICAgICAgICAgICAgaW5wdXQgPSBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGFyZ2V0U2ltcGxlVHlwZSA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRTaW1wbGVUeXBlID0gaW5wdXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1BBVFRFUk4sIHRhcmdldFNpbXBsZVR5cGUsIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQuQUREKTsKLSAgICAgICAgICBjb21tYW5kLnNldFZhbHVlKG5ld1BhdHRlcm4pOwotICAgICAgICAgIHNldElucHV0KGlucHV0KTsKLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNvbW1hbmQpOwotICAgICAgICAgIGNvbW1hbmRTdGFjay5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0gICAgICAgICAgZmFjZXRTZWN0aW9uLmRvU2V0SW5wdXQoKTsKLSAgICAgICAgfQotICAgICAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRW51bWVyYXRpb25zRGlhbG9nIGRpYWxvZyA9IG5ldyBFbnVtZXJhdGlvbnNEaWFsb2coc2hlbGwpOwotICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRleHQgPSBkaWFsb2cuZ2V0VGV4dCgpOwotICAgICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBkaWFsb2cuZ2V0RGVsaW1pdGVyKCk7Ci0gICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dCwgZGVsaW1pdGVyKTsKLSAgICAgICAgICBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTlMpOwotICAgICAgICAgIAotICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHRhcmdldFNpbXBsZVR5cGUgPSBudWxsOwotICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0QW5vbnltb3VzU2ltcGxlVHlwZShmZWF0dXJlLCBpbnB1dCk7Ci0gICAgICAgICAgICBpZiAoYW5vbnltb3VzU2ltcGxlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oaW5wdXQpOwotCi0gICAgICAgICAgICAgIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBuZXcgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKCIiLCBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQuc2V0QW5vbnltb3VzU2ltcGxlVHlwZShhbm9ueW1vdXNTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQpOwotICAgICAgICAgICAgICBpbnB1dCA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXJnZXRTaW1wbGVUeXBlID0gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldFNpbXBsZVR5cGUgPSBpbnB1dDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAoZGlhbG9nLmlzUHJlc2VydmVXaGl0ZXNwYWNlKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRva2VuID0gdG9rZW4udHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWRkRW51bWVyYXRpb25zQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT05TLCB0YXJnZXRTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0VmFsdWUodG9rZW4pOwotICAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjb21tYW5kKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZFN0YWNrLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICAvL3NldElucHV0KGlucHV0KTsKLSAgICAgICAgZmFjZXRTZWN0aW9uLmRvU2V0SW5wdXQoKTsKLSAgICAgICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGRlbGV0ZUJ1dHRvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLSAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfQ09OU1RSQUlOVFMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURV9QQVRURVJOKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kKCIiLCBpbnB1dCwgVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZC5ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGNvbW1hbmQuc2V0UGF0dGVyblRvRWRpdCgoWFNEUGF0dGVybkZhY2V0KW9iaik7Ci0gICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY29tbWFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBvYmo7Ci0gICAgICAgICAgICAgIERlbGV0ZUNvbW1hbmQgZGVsZXRlQ29tbWFuZCA9IG5ldyBEZWxldGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGRlbGV0ZUNvbW1hbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEUGF0dGVybkZhY2V0KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4gPSAoWFNEUGF0dGVybkZhY2V0KSBvYmo7Ci0gICAgICAgICAgU3RyaW5nIGluaXRpYWxWYWx1ZSA9IHBhdHRlcm4uZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotCi0gICAgICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCi0gICAgICAgICAgUmVnZXhXaXphcmQgd2l6YXJkID0gbmV3IFJlZ2V4V2l6YXJkKGluaXRpYWxWYWx1ZSk7Ci0KLSAgICAgICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAgICAgICAgICB3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgICAgd2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotCi0gICAgICAgICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3UGF0dGVybiA9IHdpemFyZC5nZXRQYXR0ZXJuKCk7Ci0gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVkFMVUVfQVRUUklCVVRFLCBuZXdQYXR0ZXJuKTsKLSAgICAgICAgICAgIHBhdHRlcm4uc2V0TGV4aWNhbFZhbHVlKG5ld1BhdHRlcm4pOwotICAgICAgICAgICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHNldEJ1dHRvblN0YXRlcyh0aGlzLmtpbmQpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotCi0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29uc3RyYWludEtpbmQoaW50IGtpbmQpCi0gIHsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgIHNldEJ1dHRvblN0YXRlcyhraW5kKTsKLSAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnNldElucHV0KGlucHV0KTsKLSAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgc2V0QnV0dG9uU3RhdGVzKHRoaXMua2luZCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0gJiYgKHZhbHVlICE9IG51bGwpKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQotICAgICAgaWYgKGl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgWFNEUGF0dGVybkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RQYXR0ZXJuRmFjZXQgcGF0dGVybkZhY2V0ID0gKFhTRFBhdHRlcm5GYWNldCkgaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIHBhdHRlcm5GYWNldC5zZXRMZXhpY2FsVmFsdWUoKFN0cmluZykgdmFsdWUpOwotCi0gICAgICAgIGl0ZW0uc2V0RGF0YShwYXR0ZXJuRmFjZXQpOwotICAgICAgICBpdGVtLnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaXRlbS5nZXREYXRhKCkgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBpdGVtLmdldERhdGEoKTsKLSAgICAgICAgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRYU0RGYWNldFZhbHVlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9FTlVNRVJBVElPTl9WQUxVRSwgZW51bUZhY2V0KTsKLSAgICAgICAgY29tbWFuZC5zZXRWYWx1ZSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIGNvbW1hbmRTdGFjay5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICBpdGVtLnNldERhdGEoZW51bUZhY2V0KTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZG9HZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0gICAgewotICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm5GYWNldCA9IChYU0RQYXR0ZXJuRmFjZXQpIGVsZW1lbnQ7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBwYXR0ZXJuRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICB7Ci0gICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBlbGVtZW50OwotICAgICAgU3RyaW5nIHZhbHVlID0gZW51bUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgY2xhc3MgQ29uc3RyYWludHNUYWJsZVZpZXdlciBleHRlbmRzIE5hdmlnYWJsZVRhYmxlVmlld2VyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllcgotICB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMgPSB7IE1lc3NhZ2VzLl9VSV9MQUJFTF9QQVRURVJOIH07Ci0KLSAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzOwotCi0gICAgVGFibGUgdGFibGU7Ci0KLSAgICBwdWJsaWMgQ29uc3RyYWludHNUYWJsZVZpZXdlcihUYWJsZSB0YWJsZSkKLSAgICB7Ci0gICAgICBzdXBlcih0YWJsZSk7Ci0gICAgICB0YWJsZSA9IGdldFRhYmxlKCk7Ci0KLSAgICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgICAgc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDb25zdHJhaW50c0NvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgIHNldExhYmVsUHJvdmlkZXIobmV3IENvbnN0cmFpbnRzVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotICAgICAgc2V0Q2VsbE1vZGlmaWVyKHRoaXMpOwotCi0gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCAwKTsKLSAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNbMF0pOwotICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICBjb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0gICAgICBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzFdOwotCi0gICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgIENvbHVtbldlaWdodERhdGEgZGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCk7Ci0KLSAgICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEpOwotICAgICAgY2VsbEVkaXRvcnNbMF0gPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCi0gICAgICBnZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotICAgICAgc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICAgIGRvTW9kaWZ5KGVsZW1lbnQsIHByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiBkb0dldFZhbHVlKGVsZW1lbnQsIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgfQotCi0gIGNsYXNzIENvbnN0cmFpbnRzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXRFbGVtZW50OwotICAgICAgICBib29sZWFuIGlzRGVmaW5lZCA9IGZhbHNlOwotICAgICAgICBJdGVyYXRvciBpdGVyOwotICAgICAgICBpZiAoa2luZCA9PSBQQVRURVJOKQotICAgICAgICB7Ci0gICAgICAgICAgaXRlciA9IHN0LmdldFBhdHRlcm5GYWNldHMoKS5pdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGl0ZXIgPSBzdC5nZXRFbnVtZXJhdGlvbkZhY2V0cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RGYWNldCBmYWNldCA9IChYU0RGYWNldCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgaXNEZWZpbmVkID0gKGZhY2V0LmdldFJvb3RDb250YWluZXIoKSA9PSBmYWNldFNlY3Rpb24ueHNkU2NoZW1hKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChraW5kID09IFBBVFRFUk4pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNEZWZpbmVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdC5nZXRQYXR0ZXJuRmFjZXRzKCkudG9BcnJheSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNEZWZpbmVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdC5nZXRFbnVtZXJhdGlvbkZhY2V0cygpLnRvQXJyYXkoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgQ29uc3RyYWludHNUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHVibGljIENvbnN0cmFpbnRzVGFibGVMYWJlbFByb3ZpZGVyKCkKLSAgICB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICBpZiAoa2luZCA9PSBQQVRURVJOKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVQYXR0ZXJuLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZUVudW0uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTRFBhdHRlcm5GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4gPSAoWFNEUGF0dGVybkZhY2V0KSBlbGVtZW50OwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXR0ZXJuLmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBlbGVtZW50OwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMWZhNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5FZGl0QXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuWE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWFNEQWN0aW9uTWFuYWdlciBleHRlbmRzIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIHsKLQotICBwcml2YXRlIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0gIAotCXB1YmxpYyBYU0RBY3Rpb25NYW5hZ2VyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobW9kZWwsIHZpZXdlcik7Ci0JfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29tbWFuZFN0YWNrKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLSAgICB0aGlzLmNvbW1hbmRTdGFjayA9IGNvbW1hbmRTdGFjazsKLSAgfQotCi0gIHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQ0RhdGFTZWN0aW9uQWN0aW9uKE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRQQ0RhdGFBY3Rpb24oTm9kZSBwYXJlbnQsIENNRGF0YVR5cGUgZGF0YVR5cGUsIGludCBpbmRleCkgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAKLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlQWRkRG9jdW1lbnRDaGlsZEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIERvY3VtZW50IGRvY3VtZW50LCBpbnQgaWMsIGludCB2YykgewotCX0KLSAgCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUVkaXRHcmFtbWFySW5mb3JtYXRpb25BY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIERvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIEVsZW1lbnQgcGFyZW50RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQsIGludCBpbmRleCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVGV4dE5vZGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRleHROb2RlQWN0aW9ucyhtZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFZCwgaW5kZXgpOwotCX0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQXR0cmlidXRlQWN0aW9uKEVsZW1lbnQgcGFyZW50LCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0gICAgQWN0aW9uIGFjdGlvbiA9IG51bGw7Ci0gICAgaWYgKGFkID09IG51bGwpIHsKLSAgICAgIGFjdGlvbiA9IG5ldyBFZGl0QXR0cmlidXRlQWN0aW9uKHRoaXMsIHBhcmVudCwgbnVsbCwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9ORVdfQVRUUklCVVRFLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19BVFRSSUJVVEVfVElUTEUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9IGVsc2UgewotICAgICAgYWN0aW9uID0gbmV3IEFkZE5vZGVBY3Rpb24oYWQsIHBhcmVudCwgLTEpOwotICAgIH0KLSAgICAKLSAgICBXcmFwcGVyQ29tbWFuZCBjb21tYW5kID0gbmV3IFdyYXBwZXJDb21tYW5kKGFjdGlvbiwgcGFyZW50LCBhZCk7Ci0gICAgV3JhcHBlckFjdGlvbiB3cmFwcGVyQWN0aW9uID0gbmV3IFdyYXBwZXJBY3Rpb24oY29tbWFuZCk7Ci0gICAgcmV0dXJuIHdyYXBwZXJBY3Rpb247Ci0gIH0KLSAgCi0gIGNsYXNzIFdyYXBwZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLSAgewotICAgIFdyYXBwZXJDb21tYW5kIGNvbW1hbmQ7Ci0gICAgCi0gICAgcHVibGljIFdyYXBwZXJBY3Rpb24oV3JhcHBlckNvbW1hbmQgY29tbWFuZCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gY29tbWFuZC5nZXRBY3Rpb24oKS5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICAvLyBTb21lIGVkaXRvcnMgbWF5IG5vdCB1c2UgYSBjb21tYW5kIHN0YWNrCi0gICAgICBpZiAoY29tbWFuZFN0YWNrICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmRTdGFjay5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBjbGFzcyBXcmFwcGVyQ29tbWFuZCBleHRlbmRzIENvbW1hbmQKLSAgewotICAgIEFjdGlvbiBhY3Rpb247Ci0gICAgRWxlbWVudCBwYXJlbnQ7Ci0gICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZDsKLSAgICBwdWJsaWMgV3JhcHBlckNvbW1hbmQoQWN0aW9uIGFjdGlvbiwgRWxlbWVudCBwYXJlbnQsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOwotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmFkID0gYWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsKLSAgICAgIHJldHVybiBhY3Rpb24uZ2V0VGV4dCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWN0aW9uIGdldEFjdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgewotICAgICAgYWN0aW9uLnJ1bigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB1bmRvKCkgewotICAgICAgCi0vLyAgICAgICgoRWxlbWVudClwYXJlbnQpLnJlbW92ZUF0dHJpYnV0ZShhZC5nZXRBdHRyTmFtZSgpKTsKLQotICAgICAgZ2V0TW9kZWwoKS5nZXRVbmRvTWFuYWdlcigpLnVuZG8oKTsKLQotICAgIH0gCi0gICAgICAgIAotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBbnlFbGVtZW50Q29udGVudHNTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREFueUVsZW1lbnRDb250ZW50c1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3YWI0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREFueUVsZW1lbnRDb250ZW50c1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUHJvY2Vzc0NvbnRlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTREFueUVsZW1lbnRDb250ZW50c1NlY3Rpb24gZXh0ZW5kcyBNdWx0aXBsaWNpdHlTZWN0aW9uCi17Ci0gIENDb21ibyBuYW1lc3BhY2VDb21ibzsKLSAgQ0NvbWJvIHByb2Nlc3NDb250ZW50c0NvbWJvOwotCi0gIHByaXZhdGUgU3RyaW5nW10gbmFtZXNwYWNlQ29tYm9WYWx1ZXMgPSB7ICIiLCAvLyROT04tTkxTLTEkCi0gICAgICAiIyNhbnkiLCAvLyROT04tTkxTLTEkCi0gICAgICAiIyNvdGhlciIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICIjI2xvY2FsIiAvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFhTREFueUVsZW1lbnRDb250ZW50c1NlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBuYW1lc3BhY2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUklCVVRFU19OQU1FU1BBQ0UpOwotICAgIG5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBuYW1lc3BhY2VDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBuYW1lc3BhY2VDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG5hbWVzcGFjZUNvbWJvLnNldEl0ZW1zKG5hbWVzcGFjZUNvbWJvVmFsdWVzKTsKLSAgICBuYW1lc3BhY2VDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVzcGFjZUNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BTllFTEVNRU5UX19OQU1FU1BBQ0UpOwotCi0gICAgQ0xhYmVsIHByb2Nlc3NDb250ZW50c0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSSUJVVEVTX1BST0NFU1NDT05URU5UUyk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHByb2Nlc3NDb250ZW50c0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBwcm9jZXNzQ29udGVudHNDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBwcm9jZXNzQ29udGVudHNDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIEl0ZXJhdG9yIGxpc3QgPSBYU0RQcm9jZXNzQ29udGVudHMuVkFMVUVTLml0ZXJhdG9yKCk7Ci0gICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzQ29udGVudHNDb21iby5hZGQoKChYU0RQcm9jZXNzQ29udGVudHMpIGxpc3QubmV4dCgpKS5nZXROYW1lKCkpOwotICAgIH0KLSAgICBwcm9jZXNzQ29udGVudHNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb2Nlc3NDb250ZW50c0NvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BTllFTEVNRU5UX19QUk9DRVNTQ09OVEVOVFMpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWluIHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfTUlOT0NDVVJTKTsKLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBtaW5Db21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgbWluQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtaW5Db21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1pbkNvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobWluQ29tYm8pOwotICAgIG1pbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWluQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01JTl9PQ0NVUkVOQ0UpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWF4IHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX01BWE9DQ1VSUyk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgbWF4Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1heENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWF4Q29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXhDb21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1heENvbWJvLmFkZCgidW5ib3VuZGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhcHBseUFsbExpc3RlbmVycyhtYXhDb21ibyk7Ci0gICAgbWF4Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtYXhDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQU5ZRUxFTUVOVF9fTUFYX09DQ1VSRU5DRSk7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgbmFtZXNwYWNlQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwcm9jZXNzQ29udGVudHNDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgewotICAgICAgICBYU0RXaWxkY2FyZCB3aWxkY2FyZCA9IChYU0RXaWxkY2FyZCkgaW5wdXQ7Ci0gICAgICAgIGlmICh3aWxkY2FyZC5pc1NldExleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2VDb21iby5zZXRUZXh0KHdpbGRjYXJkLmdldFN0cmluZ0xleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzcGFjZUNvbWJvLnNldFRleHQoIiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3aWxkY2FyZC5pc1NldFByb2Nlc3NDb250ZW50cygpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUHJvY2Vzc0NvbnRlbnRzIHBjID0gd2lsZGNhcmQuZ2V0UHJvY2Vzc0NvbnRlbnRzKCk7Ci0gICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uc2V0VGV4dChwYy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAod2lsZGNhcmQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5Db21iby5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICBtYXhDb21iby5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5Db21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBtYXhDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZWZyZXNoTWluTWF4KCk7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQ7Ci0gICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgewotICAgICAgWFNEV2lsZGNhcmQgd2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIGNvbmNyZXRlQ29tcG9uZW50OwotICAgICAgaWYgKGUud2lkZ2V0ID09IG5hbWVzcGFjZUNvbWJvKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lc3BhY2VDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlQXR0cmlidXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPIHVzZSBjb21tYW5kcwotICAgICAgICAvLyBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTkFNRVNQQUNFX0NIQU5HRSIpLAotICAgICAgICAvLyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAocmVtb3ZlQXR0cmlidXRlKQotICAgICAgICB7Ci0gICAgICAgICAgd2lsZGNhcmQudW5zZXRMZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHdpbGRjYXJkLnNldFN0cmluZ0xleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBwcm9jZXNzQ29udGVudHNDb21ibykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gcHJvY2Vzc0NvbnRlbnRzQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1BST0NFU1NDT05URU5UU19DSEFOR0UiKSwKLSAgICAgICAgLy8gZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHJlbW92ZUF0dHJpYnV0ZSkKLSAgICAgICAgewotICAgICAgICAgIHdpbGRjYXJkLnVuc2V0UHJvY2Vzc0NvbnRlbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgd2lsZGNhcmQuc2V0UHJvY2Vzc0NvbnRlbnRzKFhTRFByb2Nlc3NDb250ZW50cy5nZXQocHJvY2Vzc0NvbnRlbnRzQ29tYm8uZ2V0SXRlbShwcm9jZXNzQ29udGVudHNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKG1pbkNvbWJvICE9IG51bGwgJiYgIW1pbkNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIG1pbkNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChtYXhDb21ibyAhPSBudWxsICYmICFtYXhDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtYXhDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTg3Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5CYXNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1R5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uIGV4dGVuZHMgUmVmYWN0b3JpbmdTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0LCBkZWZhdWx0T3JGaXhlZFRleHQ7Ci0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvLCB0eXBlQ29tYm8sIHVzYWdlQ29tYm8sIGZvcm1Db21ibzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBkZWZhdWx0QnV0dG9uLCBmaXhlZEJ1dHRvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0eXBlTmFtZSA9ICIiLCByZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgYm9vbGVhbiBpc0F0dHJpYnV0ZVJlZmVyZW5jZTsKLSAgCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIFN0cmluZyB0eXBlTGFiZWwgPSBNZXNzYWdlcy5VSV9MQUJFTF9UWVBFOyAvLyROT04tTkxTLTEkCi0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX05BTUUpOwotICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZVRleHQKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG5hbWVUZXh0LnNldEVuYWJsZWQoIWlzQXR0cmlidXRlUmVmZXJlbmNlKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFX19OQU1FKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFJlZmFjdG9yL3JlbmFtZSBoeXBlcmxpbmsKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoY29tcG9zaXRlKTsKLSAgICBzZXRSZW5hbWVIeXBlcmxpbmtFbmFibGVkKCFpc0F0dHJpYnV0ZVJlZmVyZW5jZSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBSZWYgTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBpZiAoaXNBdHRyaWJ1dGVSZWZlcmVuY2UpCi0gICAgewotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIENMYWJlbCByZWZMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9SRUZFUkVOQ0UpOwotICAgICAgcmVmTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWYgQ29tYm8KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgICAgY29tcG9uZW50TmFtZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvbmVudE5hbWVDb21ibywKLSAgICAgICAgICBYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FUVFJJQlVURV9fTkFNRSk7Ci0KLSAgICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gdHlwZUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIHR5cGVMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHR5cGVDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIHR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHR5cGVDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFX19UWVBFKTsKLQotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFVzYWdlTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgQ0xhYmVsIHVzZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9VU0FHRSIpKTsKLSAgICB1c2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gVXNhZ2VDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdXNhZ2VDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICB1c2FnZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgdXNhZ2VDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB1c2FnZUNvbWJvLmFkZCgiIik7Ci0gICAgdXNhZ2VDb21iby5hZGQoInJlcXVpcmVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB1c2FnZUNvbWJvLmFkZCgib3B0aW9uYWwiKTsgLy8kTk9OLU5MUy0xJAotICAgIHVzYWdlQ29tYm8uYWRkKCJwcm9oaWJpdGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB1c2FnZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGRlZmF1bHRMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgZGVmYXVsdExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX1ZBTFVFX0NPTE9OKTsKLSAgICBkZWZhdWx0TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBDb21wb3NpdGUgcmFkaW8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0gICAgcmFkaW8uc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0gICAgCi0gICAgZGVmYXVsdEJ1dHRvbiA9IG5ldyBCdXR0b24ocmFkaW8sIFNXVC5SQURJTyk7Ci0gICAgZGVmYXVsdEJ1dHRvbi5zZXRUZXh0KG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0RFRkFVTFQpOwotICAgIGRlZmF1bHRCdXR0b24uc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICBkZWZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIGZpeGVkQnV0dG9uID0gbmV3IEJ1dHRvbihyYWRpbywgU1dULlJBRElPKTsKLSAgICBmaXhlZEJ1dHRvbi5zZXRUZXh0KG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0ZJWEVEKTsgIAotICAgIGZpeGVkQnV0dG9uLnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0gICAgZml4ZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgLy8gZHVtbXkKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLy8gZHVtbXkKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBkZWZhdWx0VGV4dAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGVmYXVsdE9yRml4ZWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBkZWZhdWx0T3JGaXhlZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhkZWZhdWx0T3JGaXhlZFRleHQpOwotICAgIAotICAgIC8vUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAvLwkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BVFRSSUJVVEVfX0RFRkFVTFQpOwotICAgIAotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEZvcm1MYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgZm9ybUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0ZPUk0pOwotICAgIGZvcm1MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRm9ybUNvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBmb3JtQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgZm9ybUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZm9ybUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGZvcm1Db21iby5hZGQoIiIpOwotICAgIGZvcm1Db21iby5hZGQoInF1YWxpZmllZCIpOyAvLyROT04tTkxTLTEkCi0gICAgZm9ybUNvbWJvLmFkZCgidW5xdWFsaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGZvcm1Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICAvLyBkdW1teQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBmaWxsVHlwZXNDb21ibygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCi0gICAgICB0eXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICB0eXBlQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKTsKLSAgICAgIHR5cGVDb21iby5hZGQoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgdHlwZUNvbWJvLmFkZChpdGVtc1tpXS5nZXROYW1lKCkpOwotICAgICAgfQotCi0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiBuYW1lZENvbXBvbmVudFR5cGUgPSBuYW1lZENvbXBvbmVudC5nZXRUeXBlKCk7Ci0gICAgICBpZiAobmFtZWRDb21wb25lbnRUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50VHlwZU5hbWUgPSBuYW1lZENvbXBvbmVudFR5cGUuZ2V0UU5hbWUoeHNkU2NoZW1hKTsgLy8gbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZml4Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmV0ID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShjdXJyZW50VHlwZU5hbWUsIG1hbmFnZXIpOwotICAgICAgICBpZiAocmV0ID09IG51bGwpIC8vIG5vdCBpbiBxdWlja1BpY2sKLSAgICAgICAgICB0eXBlQ29tYm8uYWRkKGN1cnJlbnRUeXBlTmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShTdHJpbmcgdmFsdWUsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyKQotICB7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIC8vIHJlZnJlc2ggbmFtZQotCi0gICAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0KLSAgICAgIFN0cmluZyBuYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGlzQXR0cmlidXRlUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIHJlZnJlc2hSZWZDb21ibygpOwotICAgIH0KLQotICAgIC8vIHJlZnJlc2ggdHlwZQotCi0gICAgdHlwZUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICAgIGlzQXR0cmlidXRlUmVmZXJlbmNlID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilpbnB1dCkuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpOwotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0geHNkQXR0cmlidXRlLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBib29sZWFuIGlzQW5vbnltb3VzID0geHNkQXR0cmlidXRlLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbDsKLQotICAgICAgICBpZiAoaXNBbm9ueW1vdXMpCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dCgiKiphbm9ueW1vdXMqKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmlsbFR5cGVzQ29tYm8oKTsKLSAgICAgICAgICBpZiAodHlwZURlZiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZURlZi5nZXRRTmFtZSh4c2RTY2hlbWEpOwotICAgICAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHR5cGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KHR5cGVOYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KE1lc3NhZ2VzLlVJX05PX1RZUEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdXNhZ2VDb21iby5zZXRUZXh0KCIiKTsKLSAgICAgICAgdXNhZ2VDb21iby5zZXRFbmFibGVkKCF4c2RBdHRyaWJ1dGUuaXNHbG9iYWwoKSk7Ci0gICAgICAgIAotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RBdHRyaWJ1dGUuZ2V0RWxlbWVudCgpOwotICAgICAgICBib29sZWFuIGhhc1VzZUF0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaGFzVXNlQXR0cmlidXRlID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpOwotICAgICAgICAgIGlmIChoYXNVc2VBdHRyaWJ1dGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHVzYWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgdXNhZ2VDb21iby5zZXRUZXh0KHVzYWdlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRlZmF1bHRPckZpeGVkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIAotICAgICAgICBib29sZWFuIGhhc0RlZmF1bHRBdHRyaWJ1dGUgPSBmYWxzZSwgaGFzRml4ZWRBdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGhhc0RlZmF1bHRBdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgIGhhc0ZpeGVkQXR0cmlidXRlID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0KLSAgICAgICAgICAvLyBDYXNlIHdoZXJlIG5vIGZpeGVkIG9yIGRlZmF1bHQgYXR0cmlidXRlcyBleGlzdCwgc28gZW5zdXJlIG9uZSBvZiB0aGUgcmFkaW8gYnV0dG9ucyBpcyBzZWxlY3RlZAotICAgICAgICAgIGlmICghaGFzRGVmYXVsdEF0dHJpYnV0ZSAmJiAhaGFzRml4ZWRBdHRyaWJ1dGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFkZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpICYmICFmaXhlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgLy8gaWYgbm9uZSBhcmUgc2VsZWN0ZWQgdGhlbiBwaWNrIGZpeGVkCi0gICAgICAgICAgICAgIGZpeGVkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlmIGJvdGggYXJlIHByZXNlbnQgaW4gc291cmNlIChhbiBlcnJvciEpLCBhc3N1bWUgdGhhdCAqZml4ZWQqIHRha2VzICJwcmVjZWRlbmNlIgotICAgICAgICAgICAgZGVmYXVsdEJ1dHRvbi5zZXRTZWxlY3Rpb24oIWhhc0ZpeGVkQXR0cmlidXRlICYmIGhhc0RlZmF1bHRBdHRyaWJ1dGUpOwotICAgICAgICAgICAgZml4ZWRCdXR0b24uc2V0U2VsZWN0aW9uKGhhc0ZpeGVkQXR0cmlidXRlKTsKLSAgICAgICAgICAgIGlmIChoYXNEZWZhdWx0QXR0cmlidXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgdGhlRGVmYXVsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAJZGVmYXVsdE9yRml4ZWRUZXh0LnNldFRleHQodGhlRGVmYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGFzRml4ZWRBdHRyaWJ1dGUpIC8vIHdpbGwgb3ZlcndyaXRlIGRlZmF1bHQgaWYgYm90aCBwcmVzZW50Ci0JICAgICAgICAgIHsKLSAgICAgICAgCSAgICBTdHJpbmcgZml4ZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgCSAgICBkZWZhdWx0T3JGaXhlZFRleHQuc2V0VGV4dChmaXhlZCk7Ci0JICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvcm1Db21iby5zZXRUZXh0KCIiKTsgCi0gICAgICAgIGZvcm1Db21iby5zZXRFbmFibGVkKCF4c2RBdHRyaWJ1dGUuaXNHbG9iYWwoKSAmJiAhaXNBdHRyaWJ1dGVSZWZlcmVuY2UpOwotICAgICAgICBib29sZWFuIGhhc0Zvcm1BdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGhhc0Zvcm1BdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuRk9STV9BVFRSSUJVVEUpOwotICAgICAgICAgIGlmIChoYXNGb3JtQXR0cmlidXRlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmb3JtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZPUk1fQVRUUklCVVRFKTsKLSAgICAgICAgICAgIGZvcm1Db21iby5zZXRUZXh0KGZvcm0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotCi0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZz0gbnVsbDsKLSAgICAgIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICAgICgoWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKSBkaWFsb2cpLnNob3dDb21wbGV4VHlwZXMoZmFsc2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldE5ld0RpYWxvZygpOwotICAgICAgICAoKE5ld1R5cGVEaWFsb2cpIGRpYWxvZykuYWxsb3dDb21wbGV4VHlwZShmYWxzZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGUgPSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKHhzZEF0dHJpYnV0ZSwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgIAl0eXBlQ29tYm8uc2V0VGV4dCh0eXBlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy91c2UgdGhlIHZhbHVlIGZyb20gc2VsZWN0ZWQgcXVpY2tQaWNrIGl0ZW0KLSAgICAgIHsKLSAgICAgICAgbmV3VmFsdWUgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKHNlbGVjdGlvbiwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIGlmIChlZGl0b3IgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotCi0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gY29tcG9uZW50TmFtZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZz0gbnVsbDsKLSAgICAgIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KHJlZk5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vdXNlIHRoZSB2YWx1ZSBmcm9tIHNlbGVjdGVkIHF1aWNrUGljayBpdGVtCi0gICAgICB7Ci0gICAgICAgIG5ld1ZhbHVlID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShzZWxlY3Rpb24sIG1hbmFnZXIpOwotICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgfQotCi0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgIAlYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGUgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0OwotICAgIAlFbGVtZW50IGVsZW1lbnQgPSB4c2RBdHRyaWJ1dGUuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGUud2lkZ2V0ID09IHVzYWdlQ29tYm8pCi0JICAgIHsJICAgICAgCi0JICAgICAgZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gdXNhZ2VDb21iby5nZXRUZXh0KCk7Ci0JICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkgICAgICB7Ci0gICAgICAgICAgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBQcm9wZXJ0aWVzQ2hhbmdlQ29tbWFuZChlbGVtZW50LCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9VU0FHRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5VU0VfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5VU0VfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCSAgICAgIH0KLQkgICAgfQotCSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBmb3JtQ29tYm8pCi0JICAgIHsKLQkgICAgICBmaW5hbCBTdHJpbmcgbmV3VmFsdWUgPSBmb3JtQ29tYm8uZ2V0VGV4dCgpOwotCSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0JICAgICAgewotICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoZWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfRk9STSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5GT1JNX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRk9STV9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9OwotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGRlZmF1bHRCdXR0b24pCi0JICAgIHsKLQkgICAgCWJvb2xlYW4gbmV3VmFsdWUgPSBkZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCSAgICAJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkgICAgCXsKLQkgICAgCQlpZiAobmV3VmFsdWUpCi0JICAgIAkJewotCSAgICAJCQlpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSkpCi0JICAgIAkJCXsKLQkgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoZWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfREVGQVVMVCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZVN0ZXBzKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkgICAgCQkJfQotCSAgICAJCX0KLQkgICAgCX0KLQkgICAgfQotCSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBmaXhlZEJ1dHRvbikKLQkgICAgewotCSAgICAJYm9vbGVhbiBuZXdWYWx1ZSA9IGZpeGVkQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCSAgICAJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkgICAgCXsKLQkgICAgCQlpZiAobmV3VmFsdWUpCi0JICAgIAkJewotCSAgICAJCQlpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKSkKLQkgICAgCQkJewotCSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoZWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfRklYRUQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JICAgIAkJCX0KLQkgICAgCQl9Ci0JICAgIAl9Ci0JICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KQotICAgIHsKLSAgICAgIGlmICghbmFtZVRleHQuZ2V0RWRpdGFibGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQpLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQotICAgICAgICBpZiAoIXZhbGlkYXRlU2VjdGlvbigpKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBhbiBhY3R1YWwgbmFtZSBjaGFuZ2UgaGFzIHRha2VuIHBsYWNlCi0gICAgICAgIFN0cmluZyBvbGROYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZUNvbW1hbmQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfQUNUSU9OX1JFTkFNRSwgbmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwgJiYgZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpc0F0dHJpYnV0ZVJlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJSZWYgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24paW5wdXQ7Ci0gICAgICAgICAgU3RyaW5nIHFuYW1lID0gYXR0clJlZi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBhdHRyUmVmLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIHFuYW1lKTsKLSAgICAgICAgICAKLS8vICAgICAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotLy8gICAgICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgICAgIGl0ZW1zID0gaGVscGVyLmdldEdsb2JhbEVsZW1lbnRzKCk7Ci0vLyAgICAgICAgICBpdGVtcy5hZGQoMCwgIiIpOwotLy8gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldEl0ZW1zKChTdHJpbmcgW10paXRlbXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0vLwotLy8gICAgICAgICAgcmVmcmVzaFJlZkNvbWJvKCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGVmYXVsdE9yRml4ZWRUZXh0KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBkZWZhdWx0T3JGaXhlZFRleHQuZ2V0VGV4dCgpOwotICAgICAgRWxlbWVudCBlbGVtZW50ID0geHNkQXR0cmlidXRlLmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBQcm9wZXJ0aWVzQ2hhbmdlQ29tbWFuZChlbGVtZW50LCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9WQUxVRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgICAgICAgaWYgKGZpeGVkQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGVsZW1lbnQsIFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUsIG5ld1ZhbHVlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9GSVhFRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0UHJvY2Vzc2luZygpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFLCBuZXdWYWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfREVGQVVMVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0UHJvY2Vzc2luZygpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU2VjdGlvbigpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgPT0gbnVsbCB8fCBuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgIFN0cmluZyBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIC8vIHZhbGlkYXRlIGFnYWluc3QgTkNOYW1lCi0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPCAxIHx8ICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfTkFNRSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKGNvbXBvbmVudE5hbWVDb21ibyAhPSBudWxsICYmICFjb21wb25lbnROYW1lQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChuYW1lVGV4dCAhPSBudWxsICYmICFuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobmFtZVRleHQpOwotICAgIGlmICh0eXBlQ29tYm8gIT0gbnVsbCAmJiAhdHlwZUNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIHR5cGVDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBpbml0KCk7Ci0gICAgcmVsYXlvdXQoKTsKLSAgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIGlzQXR0cmlidXRlUmVmZXJlbmNlID0geHNkQXR0cmlidXRlLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWxheW91dCgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgaWYgKHBhcmVudENvbXBvc2l0ZSAhPSBudWxsICYmICFwYXJlbnRDb21wb3NpdGUuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudENvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBpbml0aWFsaXplIHRoZSBuZXcgaGFuZGxlcgotICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQotICAgIC8vIE5vdyB0dXJuIHBhaW50aW5nIGJhY2sgb24KLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KHRydWUpOwotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFJlZkNvbWJvKCkKLSAgewotICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGZpbGxDb21wb25lbnROYW1lQ29tYm8oKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZpbGxDb21wb25lbnROYW1lQ29tYm8oKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotICAgIAotICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKTsKLSAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcXVpY2tQaWNrcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBtYW5hZ2VyLmdldEhpc3RvcnkoKTsKLSAgICBpZiAoaGlzdG9yeSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IGhpc3RvcnlbaV07Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpOwotICAgICAgfSAgCi0gICAgfQotICAgIAotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpOwotICAgICAgaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXQgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKGF0dHJWYWx1ZSwgbWFuYWdlcik7Ci0gICAgICBpZiAocmV0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoYXR0clZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KGF0dHJWYWx1ZSk7Ci0gICAgICByZWZOYW1lID0gYXR0clZhbHVlOwotICAgIH0gCi0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotICB7Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLSAgICBwdWJsaWMgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbGFiZWwpCi0gICAgewotICAgICAgc3VwZXIoTkxTLmJpbmQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRSwgbGFiZWwpKTsKLSAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgZG9FeGVjdXRlU3RlcHMoKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZVN0ZXBzKCkKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTJhNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbiBleHRlbmRzIFJlZmFjdG9yaW5nU2VjdGlvbgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLSAgcHJvdGVjdGVkIENDb21ibyByZWZDb21ibzsKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZTsKLQotICBwdWJsaWMgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBpZiAoaXNSZWZlcmVuY2UpCi0gICAgewotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWYgTGFiZWwKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIENMYWJlbCByZWZMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSArICI6Iik7ICAvLyROT04tTkxTLTEkCi0gICAgICByZWZMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZiBDb21ibwotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgICByZWZDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICByZWZDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIHJlZkNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVmQ29tYm8sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFR1JPVVBfUkVGU19fUkVGKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gTmFtZUxhYmVsCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FKTsKLSAgICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVUZXh0Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BVFRSSUJVVEVHUk9VUF9fTkFNRSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmYWN0b3IvcmVuYW1lIGh5cGVybGluayAKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgY3JlYXRlUmVuYW1lSHlwZXJsaW5rKGNvbXBvc2l0ZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0KLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpaW5wdXQ7Ci0gICAgCi0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG5hbWVkQ29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSk7Ci0gICAgICAgIGlmIChhdHRyVmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmVmQ29tYm8uc2V0VGV4dChhdHRyVmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gcmVmcmVzaCBuYW1lCi0gICAgICBuYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBTdHJpbmcgbmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICBpbml0KCk7Ci0gICAgcmVsYXlvdXQoKTsKLSAgICAKLSAgICBpZiAoaXNSZWZlcmVuY2UpCi0gICAgewotICAgICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgICBMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgaXRlbXMgPSBoZWxwZXIuZ2V0R2xvYmFsQXR0cmlidXRlR3JvdXBzKCk7Ci0gICAgICBpdGVtcy5hZGQoMCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWZDb21iby5zZXRJdGVtcygoU3RyaW5nIFtdKWl0ZW1zLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVsYXlvdXQoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KGZhbHNlKTsKLQotICAgIGlmIChwYXJlbnRDb21wb3NpdGUgIT0gbnVsbCAmJiAhcGFyZW50Q29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgbmV3IGhhbmRsZXIKLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnRDb21wb3NpdGUpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLSAgICAvLyBOb3cgdHVybiBwYWludGluZyBiYWNrIG9uCi0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICByZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBncm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGlucHV0OwotICAgICAgaXNSZWZlcmVuY2UgPSBncm91cC5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIHN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgaW5wdXQ7Ci0gICAgICAgIGlmICghdmFsaWRhdGVTZWN0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGFuIGFjdHVhbCBuYW1lIGNoYW5nZSBoYXMgdGFrZW4gcGxhY2UKLSAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmICghbmV3VmFsdWUuZXF1YWxzKG9sZE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1JFTkFNRSwgbmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwgJiYgZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZG9SZWZlcmVudGlhbEludGVncml0eUNoZWNrKG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTZWN0aW9uKCkKLSAgewotICAgIGlmIChuYW1lVGV4dCA9PSBudWxsIHx8IG5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCi0gICAgLy8gdmFsaWRhdGUgYWdhaW5zdCBOQ05hbWUKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA8IDEgfHwgIVhNTENoYXIuaXNWYWxpZE5DTmFtZShuYW1lKSkKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfTkFNRSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gcmVmQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gcmVmQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KWlucHV0OwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKG5hbWVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgICBYU0REaXJlY3RpdmVzTWFuYWdlci5yZW1vdmVVbnVzZWRYU0RJbXBvcnRzKG5hbWVkQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChuYW1lVGV4dCAhPSBudWxsICYmICFuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobmFtZVRleHQpOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRENvbXBsZXhUeXBlQWR2YW5jZWRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRENvbXBsZXhUeXBlQWR2YW5jZWRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxN2E3MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEQ29tcGxleFR5cGVBZHZhbmNlZFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgQ0NvbWJvIGJsb2NrQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gZmluYWxDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBtaXhlZENvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIGFic3RyYWN0Q29tYm87Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZmluYWxWYWx1ZXNbXSA9IHsgRU1QVFksIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgLy8kTk9OLU5MUy0xJAotICAgICAgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRywgIiMiICsgWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRyB9OyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBTdHJpbmcgYmxvY2tWYWx1ZXNbXSA9IHsgRU1QVFksIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgLy8kTk9OLU5MUy0xJAotICAgICAgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRywgIiMiICsgWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRyB9OyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBTdHJpbmcgYm9vbGVhblZhbHVlc1tdID0geyBFTVBUWSwgVFJVRSwgRkFMU0UgfTsgLy8gVE9ETyB1c2Ugc29tZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGluc3RlYWQKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBBYnN0cmFjdExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIGFic3RyYWN0TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0FCU1RSQUNUICsgIjoiKTsKLSAgICBhYnN0cmFjdExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBBYnN0cmFjdENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBhYnN0cmFjdENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGFic3RyYWN0Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhYnN0cmFjdENvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGFic3RyYWN0Q29tYm8uc2V0SXRlbXMoYm9vbGVhblZhbHVlcyk7Ci0gICAgYWJzdHJhY3RDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEJsb2NrTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgYmxvY2tMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfQkxPQ0sgKyAiOiIpOwotICAgIGJsb2NrTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEJsb2NrQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGJsb2NrQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgYmxvY2tDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGJsb2NrQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgYmxvY2tDb21iby5zZXRJdGVtcyhibG9ja1ZhbHVlcyk7Ci0gICAgYmxvY2tDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEZpbmFsTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgZmluYWxMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfRklOQUwgKyAiOiIpOwotICAgIGZpbmFsTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEZpbmFsQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGZpbmFsQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgZmluYWxDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGZpbmFsQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgZmluYWxDb21iby5zZXRJdGVtcyhmaW5hbFZhbHVlcyk7Ci0gICAgZmluYWxDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNaXhlZCBMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBtaXhlZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9NSVhFRCArICI6Iik7Ci0gICAgbWl4ZWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTWl4ZWQgQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG1peGVkQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgbWl4ZWRDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG1peGVkQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgbWl4ZWRDb21iby5zZXRJdGVtcyhib29sZWFuVmFsdWVzKTsKLSAgICBtaXhlZENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICBpZiAoZS53aWRnZXQgPT0gYmxvY2tDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBibG9ja0NvbWJvLmdldFRleHQoKTsKLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5CTE9DS19BVFRSSUJVVEUsIHZhbHVlLCBNZXNzYWdlcy5fVUlfTEFCRUxfQkxPQ0spOwotICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZmluYWxDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBmaW5hbENvbWJvLmdldFRleHQoKTsKLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUsIHZhbHVlLCBNZXNzYWdlcy5fVUlfTEFCRUxfRklOQUwpOwotICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gYWJzdHJhY3RDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBhYnN0cmFjdENvbWJvLmdldFRleHQoKTsKLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUsIHZhbHVlLCBNZXNzYWdlcy5fVUlfTEFCRUxfQUJTVFJBQ1QpOwotICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbWl4ZWRDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBtaXhlZENvbWJvLmdldFRleHQoKTsKLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5NSVhFRF9BVFRSSUJVVEUsIHZhbHVlLCBNZXNzYWdlcy5fVUlfTEFCRUxfTUlYRUQpOwotICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7IAotICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICBlbmFibGVkID0gIWlzUmVhZE9ubHk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmxvY2tBdHRWYWx1ZSA9IGNvbXBsZXhUeXBlLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSk7Ci0gICAgICAgIGlmIChibG9ja0F0dFZhbHVlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBibG9ja0NvbWJvLnNldFRleHQoYmxvY2tBdHRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYmxvY2tDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotICAgICAgICBibG9ja0NvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLSAgICAgICAgU3RyaW5nIGZpbmFsQXR0VmFsdWUgPSBjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUpOwotICAgICAgICBpZiAoZmluYWxBdHRWYWx1ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZmluYWxDb21iby5zZXRUZXh0KGZpbmFsQXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxDb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgIGlmIChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBhYnNBdHRWYWx1ZSA9IGNvbXBsZXhUeXBlLmlzQWJzdHJhY3QoKTsKLSAgICAgICAgICBpZiAoYWJzQXR0VmFsdWUpCi0gICAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldFRleHQoVFJVRSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYWJzdHJhY3RDb21iby5zZXRUZXh0KEZBTFNFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldFRleHQoRU1QVFkpOwotICAgICAgICB9Ci0gICAgICAgIGFic3RyYWN0Q29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NSVhFRF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBtaXhlZFZhbHVlID0gY29tcGxleFR5cGUuaXNNaXhlZCgpOwotICAgICAgICAgIGlmIChtaXhlZFZhbHVlKQotICAgICAgICAgICAgbWl4ZWRDb21iby5zZXRUZXh0KFRSVUUpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1peGVkQ29tYm8uc2V0VGV4dChGQUxTRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWl4ZWRDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RDb21wbGV4VHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQ29tcGxleFR5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTJmNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RDb21wbGV4VHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0REZXJpdmF0aW9uTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEQ29tcGxleFR5cGVTZWN0aW9uIGV4dGVuZHMgUmVmYWN0b3JpbmdTZWN0aW9uIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIHByb3RlY3RlZCBDQ29tYm8gYmFzZVR5cGVDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBkZXJpdmVkQnlDb21ibzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVyaXZlZEJ5Q2hvaWNlc0NvbWJvVmFsdWVzW10gPSB7ICIiLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcgfTsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBYU0RDb21wbGV4VHlwZVNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb250ZW50cyBvZiB0aGUgcHJvcGVydHkgdGFiCi0gICAqIAotICAgKiBOYW1lTGFiZWwgTmFtZVRleHQgRHVtbXlMYWJlbCBCYXNlVHlwZUxhYmVsIEJhc2VUeXBlQ29tYm8gQmFzZVR5cGVCdXR0b24KLSAgICogRGVyaXZlZEJ5TGFiZWwgRGVyaXZlZEJ5Q29tYm8KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIENMYWJlbCBuYW1lTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfTkFNRSk7Ci0gICAgbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOYW1lVGV4dAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobmFtZVRleHQpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0NPTVBMRVhfVFlQRV9fTkFNRSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBSZWZhY3Rvci9yZW5hbWUgaHlwZXJsaW5rIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGNyZWF0ZVJlbmFtZUh5cGVybGluayhjb21wb3NpdGUpOwotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEJhc2VUeXBlTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9JTkhFUklUX0ZST00pOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBCYXNlVHlwZUNvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIGJhc2VUeXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgYmFzZVR5cGVDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgYmFzZVR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGJhc2VUeXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChiYXNlVHlwZUNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19DT01QTEVYX1RZUEVfX0lOSEVSSVRfRlJPTSk7Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFNwYWNlciBsYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEZXJpdmVkQnlMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBkZXJpdmVkQnlMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9JTkhFUklUX0JZKTsgLy8kTk9OLU5MUy0xJAotICAgIGRlcml2ZWRCeUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEZXJpdmVkQnlDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBkZXJpdmVkQnlDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGVyaXZlZEJ5Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBkZXJpdmVkQnlDb21iby5zZXRJdGVtcyhkZXJpdmVkQnlDaG9pY2VzQ29tYm9WYWx1ZXMpOwotICAgIGRlcml2ZWRCeUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGVyaXZlZEJ5Q29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0NPTVBMRVhfVFlQRV9fSU5IRVJJVF9CWSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBTcGFjZXIgbGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpCi0gICAgICByZXR1cm47Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGJhc2VUeXBlQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGZpbGxUeXBlc0NvbWJvKCk7Ci0KLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gY29tcGxleFR5cGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobmFtZSA9PSBudWxsKQotICAgICAgICAgIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJvb2xlYW4gaXNBbm9ueW1vdXNUeXBlID0gbmFtZS5lcXVhbHMoIiIpID8gdHJ1ZSA6IGZhbHNlOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChpc0Fub255bW91c1R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KCIqKmFub255bW91cyoqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBuYW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLSAgICAgICAgICBuYW1lVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlRGVmaW5pdGlvbiA9IGNvbXBsZXhUeXBlLmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoYmFzZVR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBiYXNlVHlwZSA9IGJhc2VUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgYmFzZVR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImFueVR5cGUiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJhc2VUeXBlQ29tYm8uc2V0VGV4dChiYXNlVHlwZSk7Ci0KLSAgICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IGRlcml2YXRpb25NZXRob2QgPSBjb21wbGV4VHlwZS5nZXREZXJpdmF0aW9uTWV0aG9kKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKGRlcml2YXRpb25NZXRob2QgPT0gWFNERGVyaXZhdGlvbk1ldGhvZC5FWFRFTlNJT04pCi0gICAgICAgIHsKLSAgICAgICAgICBkZXJpdmVkQnlDb21iby5zZXRUZXh0KFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGRlcml2YXRpb25NZXRob2QgPT0gWFNERGVyaXZhdGlvbk1ldGhvZC5SRVNUUklDVElPTikKLSAgICAgICAgewotICAgICAgICAgIGRlcml2ZWRCeUNvbWJvLnNldFRleHQoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBiYXNlVHlwZUNvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotCi0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gYmFzZVR5cGVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlOwotICAgICAgSUNvbXBvbmVudERpYWxvZyBkaWFsb2c9IG51bGw7Ci0gICAgICBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0FDVElPTl9CUk9XU0UpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldE5ld0RpYWxvZygpOwotICAgICAgfQotCi0gICAgICBpZiAoZGlhbG9nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaWFsb2cuY3JlYXRlQW5kT3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgICAgewotICAgICAgICAgIG5ld1ZhbHVlID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoaW5wdXQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVyaXZlZEJ5Q29tYm8pCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBkZXJpdmVkQnlDb21iby5nZXRUZXh0KCk7Ci0gICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnkoY29tcGxleFR5cGUsIHZhbHVlKTsKLSAgICAgIAotICAgICAgaWYgKGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkKLSAgICB7Ci0gICAgICBpZiAoIW5hbWVUZXh0LmdldEVkaXRhYmxlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgaW5wdXQ7Ci0KLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNlY3Rpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgYW4gYWN0dWFsIG5hbWUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZQotICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0FDVElPTl9SRU5BTUUsIG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsICYmIGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRvUmVmZXJlbnRpYWxJbnRlZ3JpdHlDaGVjayhuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU2VjdGlvbigpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgPT0gbnVsbCB8fCBuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgIFN0cmluZyBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIC8vIHZhbGlkYXRlIGFnYWluc3QgTkNOYW1lCi0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPCAxIHx8ICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfTkFNRSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZmlsbFR5cGVzQ29tYm8oKQotICB7Ci0gICAgYmFzZVR5cGVDb21iby5yZW1vdmVBbGwoKTsKLSAgICBiYXNlVHlwZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSk7Ci0gICAgYmFzZVR5cGVDb21iby5hZGQoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpOwotICAgIC8vIEFkZCB0aGUgY3VycmVudCBUeXBlIG9mIHRoaXMgYXR0cmlidXRlIGlmIG5lZWRlZAotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGlucHV0OwotICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gY29tcGxleFR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBiYXNlVHlwZS5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGN1cnJlbnRUeXBlTmFtZSA9IGJhc2VUeXBlLmdldFFOYW1lKHhzZFNjaGVtYSk7IC8vbm8gcHJlZml4Ci0gICAgICBpZiAoY3VycmVudFR5cGVOYW1lICE9IG51bGwgJiYgIWN1cnJlbnRUeXBlTmFtZS5lcXVhbHMoImFueVR5cGUiKSkKLSAgICAgICAgYmFzZVR5cGVDb21iby5hZGQoY3VycmVudFR5cGVOYW1lKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RFbGVtZW50RGVjbGFyYXRpb25BZHZhbmNlZFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uQWR2YW5jZWRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNWRiOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RFbGVtZW50RGVjbGFyYXRpb25BZHZhbmNlZFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGFkZGVkIG5pbGxhYmxlIGFkdmFuY2VkIHRhYiBvcHRpb24sIGJ1ZyAyMDkzNTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50RGVjbGFyYXRpb25BZHZhbmNlZFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgQ0NvbWJvIGJsb2NrQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gZmluYWxDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBhYnN0cmFjdENvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIHN1YnN0R3JvdXBDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBuaWxsYWJsZUNvbWJvOwotCi0gIHByaXZhdGUgU3RyaW5nIGJsb2NrVmFsdWVzW10gPSB7IEVNUFRZLCAiIyIgKyBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCAvLyROT04tTkxTLTEkCi0gICAgICBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsCi0gICAgICAic3Vic3RpdHV0aW9uIiB9OyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBTdHJpbmcgZmluYWxWYWx1ZXNbXSA9IHsgRU1QVFksICIjIiArIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsIC8vJE5PTi1OTFMtMSQKLSAgICAgIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRyB9OyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBTdHJpbmcgYm9vbGVhblZhbHVlc1tdID0geyBFTVBUWSwgVFJVRSwgRkFMU0UgfTsgCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBBYnN0cmFjdExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIGFic3RyYWN0TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfQUJTVFJBQ1QgKyAiOiIpOwotICAgIGFic3RyYWN0TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEFic3RyYWN0Q29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGFic3RyYWN0Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgYWJzdHJhY3RDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFic3RyYWN0Q29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgYWJzdHJhY3RDb21iby5zZXRJdGVtcyhib29sZWFuVmFsdWVzKTsKLSAgICBhYnN0cmFjdENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQmxvY2tMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBibG9ja0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX0JMT0NLICsgIjoiKTsKLSAgICBibG9ja0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBCbG9ja0NvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBibG9ja0NvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGJsb2NrQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBibG9ja0NvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGJsb2NrQ29tYm8uc2V0SXRlbXMoYmxvY2tWYWx1ZXMpOwotICAgIGJsb2NrQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBGaW5hbExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIGZpbmFsTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfRklOQUwgKyAiOiIpOwotICAgIGZpbmFsTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEZpbmFsQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGZpbmFsQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgZmluYWxDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGZpbmFsQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgZmluYWxDb21iby5zZXRJdGVtcyhmaW5hbFZhbHVlcyk7Ci0gICAgZmluYWxDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFN1YnN0aXR1dGlvbiBHcm91cCBMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBzdWJHcm91cExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX1NVQlNUSVRVVElPTl9HUk9VUCArICI6Iik7Ci0gICAgc3ViR3JvdXBMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gU3Vic3RpdHV0aW9uIEdyb3VwIENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBzdWJzdEdyb3VwQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgc3Vic3RHcm91cENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgc3Vic3RHcm91cENvbWJvLnNldEVkaXRhYmxlKHRydWUpOwotICAgIHN1YnN0R3JvdXBDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhzdWJzdEdyb3VwQ29tYm8pOwotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5pbGxhYmxlIExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIG5pbGxhYmxlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfTklMTEFCTEUgKyAiOiIpOwotICAgIG5pbGxhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5pbGxhYmxlQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG5pbGxhYmxlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgbmlsbGFibGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG5pbGxhYmxlQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgbmlsbGFibGVDb21iby5zZXRJdGVtcyhib29sZWFuVmFsdWVzKTsKLSAgICBuaWxsYWJsZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IHN1YnN0R3JvdXBDb21ibykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlRGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBzdWJzdEdyb3VwQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgU3RyaW5nIG9sZFZhbHVlID0gZWxlRGVjLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSk7Ci0gICAgICBpZiAob2xkVmFsdWUgPT0gbnVsbCkKLSAgICAgICAgb2xkVmFsdWUgPSBFTVBUWTsKLSAgICAgIGlmICh2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVEZWMuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFLCB2YWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfU1VCU1RJVFVUSU9OX0dST1VQKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJsb2NrQ29tYm8pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZURlYyA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgU3RyaW5nIHZhbHVlID0gYmxvY2tDb21iby5nZXRUZXh0KCk7Ci0KLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVEZWMuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuQkxPQ0tfQVRUUklCVVRFLCB2YWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfQkxPQ0spOwotICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZmluYWxDb21ibykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlRGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBmaW5hbENvbWJvLmdldFRleHQoKTsKLQotICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGVsZURlYy5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUsIHZhbHVlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9GSU5BTCk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBhYnN0cmFjdENvbWJvKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVEZWMgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGFic3RyYWN0Q29tYm8uZ2V0VGV4dCgpOwotICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGVsZURlYy5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUsIHZhbHVlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNUUkFDVCk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBzdWJzdEdyb3VwQ29tYm8pCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoZWRpdG9yID09IG51bGwpIHJldHVybjsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotCi0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gc3Vic3RHcm91cENvbWJvLmdldFRleHQoKTsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZz0gbnVsbDsKLSAgICAgIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHN1YnN0R3JvdXBDb21iby5zZXRUZXh0KCIiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSAvL3VzZSB0aGUgdmFsdWUgZnJvbSBzZWxlY3RlZCBxdWlja1BpY2sgaXRlbQotICAgICAgewotICAgICAgICBuZXdWYWx1ZSA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoc2VsZWN0aW9uLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoaW5wdXQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbmlsbGFibGVDb21ibykKLSAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVEZWMgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbmlsbGFibGVDb21iby5nZXRUZXh0KCk7Ci0KLSAgICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGVsZURlYy5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5OSUxMQUJMRV9BVFRSSUJVVEUsIHZhbHVlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9OSUxMQUJMRSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIGZpbGxTdWJzdGl0dXRpb25Hcm91cENvbWJvKCk7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVEZWMgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dDsKLQotICAgICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgICAgIGlmIChlbGVEZWMuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpIC8vIGdsb2JhbCBlbGVtZW50Ci0gICAgICAgIHsKLSAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgZmluYWxDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIHN1YnN0R3JvdXBDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIG5pbGxhYmxlQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIGZpbmFsQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgc3Vic3RHcm91cENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIAotICAgICAgICAgIC8vIE5pbGxhYmxlIHdoZW4gdXNlZCBpbiBhIGxvY2FsIGVsZW1lbnQgZGVjbGFyYXRpb24gY2FuJ3QgYmUgc2V0IG9uCi0gICAgICAgICAgLy8gb24gZWxlbWVudHMgdGhhdCB1c2UgQHJlZi4KLSAgICAgICAJICBuaWxsYWJsZUNvbWJvLnNldEVuYWJsZWQoIWVsZURlYy5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGVsZURlYy5nZXRFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBibG9ja0F0dFZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSk7Ci0gICAgICAgIGlmIChibG9ja0F0dFZhbHVlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBibG9ja0NvbWJvLnNldFRleHQoYmxvY2tBdHRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYmxvY2tDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotICAgICAgICAvLyBXZSBzaG91bGQgc2hvdyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSByZWdhcmRsZXNzIGlmIGl0IGlzIGludmFsaWQKLSAgICAgICAgLy8gaWUuIGFzIHRoZSB1c2VyIHN0YXJ0cyB0eXBpbmcgJ3RydWUnIGluIHRoZSBzb3VyY2UsIHRoZSBwcm9wZXJ0aWVzIHZpZXcKLSAgICAgICAgLy8gc2hvdWxkIHNob3cgdGhlIHZhbHVlIGR5bmFtaWNhbGx5Ci0gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTklMTEFCTEVfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTklMTEFCTEVfQVRUUklCVVRFKTsKLSAgICAgICAgICBuaWxsYWJsZUNvbWJvLnNldFRleHQoYXR0clZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuaWxsYWJsZUNvbWJvLnNldFRleHQoRU1QVFkpOwotICAgICAgICB9Ci0KLQotICAgICAgICBTdHJpbmcgZmluYWxBdHRWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSU5BTF9BVFRSSUJVVEUpOwotICAgICAgICBpZiAoZmluYWxBdHRWYWx1ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZmluYWxDb21iby5zZXRUZXh0KGZpbmFsQXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkFCU1RSQUNUX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldFRleHQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkFCU1RSQUNUX0FUVFJJQlVURSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBhYnN0cmFjdENvbWJvLnNldFRleHQoRU1QVFkpOwotCi0gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIHN1YnN0R3JvdXBDb21iby5zZXRUZXh0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzdWJzdEdyb3VwQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZmlsbFN1YnN0aXR1dGlvbkdyb3VwQ29tYm8oKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RTdWJzdGl0dXRpb25Hcm91cEVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCi0gICAgICBzdWJzdEdyb3VwQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICBzdWJzdEdyb3VwQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKTsKLSAgICAgIHN1YnN0R3JvdXBDb21iby5hZGQoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgc3Vic3RHcm91cENvbWJvLmFkZChpdGVtc1tpXS5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IHN1YnN0aXR1dGlvbiBncm91cCBpZiBuZWVkZWQKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0U3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbigpOwotICAgICAgaWYgKG5hbWVkQ29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmV0ID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShuYW1lZENvbXBvbmVudC5nZXROYW1lKCksIG1hbmFnZXIpOwotICAgICAgICBpZiAocmV0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzdWJzdEdyb3VwQ29tYm8uYWRkKG5hbWVkQ29tcG9uZW50LmdldFFOYW1lKHhzZFNjaGVtYSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShTdHJpbmcgdmFsdWUsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyKQotICB7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYmZkMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1R5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTREVsZW1lbnREZWNsYXJhdGlvblNlY3Rpb24gZXh0ZW5kcyBNdWx0aXBsaWNpdHlTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotICBwcm90ZWN0ZWQgQ0NvbWJvIHR5cGVDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87Ci0gIGJvb2xlYW4gaXNFbGVtZW50UmVmZXJlbmNlOwotICBwcm90ZWN0ZWQgU3RyaW5nIHR5cGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uOwotCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udGVudHMgb2YgdGhlIHByb3BlcnR5IHRhYgotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLSAgICBTdHJpbmcgdHlwZUxhYmVsID0gTWVzc2FnZXMuVUlfTEFCRUxfVFlQRTsgLy8kTk9OLU5MUy0xJAotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gTmFtZUxhYmVsCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIENMYWJlbCBuYW1lTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX05BTUUpOwotICAgICAgbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gTmFtZVRleHQKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBuYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgbmFtZVRleHQuc2V0RW5hYmxlZCghaXNFbGVtZW50UmVmZXJlbmNlKTsKLSAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG5hbWVUZXh0KTsgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19FTEVNRU5UX19OQU1FKTsKLSAgICAgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZmFjdG9yL3JlbmFtZSBoeXBlcmxpbmsgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGNyZWF0ZVJlbmFtZUh5cGVybGluayhjb21wb3NpdGUpOwotICAgICAgc2V0UmVuYW1lSHlwZXJsaW5rRW5hYmxlZCghaXNFbGVtZW50UmVmZXJlbmNlKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFJlZiBMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGlmIChpc0VsZW1lbnRSZWZlcmVuY2UpCi0gICAgewotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIENMYWJlbCByZWZMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9SRUZFUkVOQ0UpOwotICAgICAgcmVmTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWYgQ29tYm8KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgICAgY29tcG9uZW50TmFtZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvbmVudE5hbWVDb21ibywKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19FTEVNRU5UX19SRUZFUkVOQ0UpOwotCi0gICAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gdHlwZUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIHR5cGVMYWJlbCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyB0eXBlQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOyAvLyROT04tTkxTLTEkCi0gICAgdHlwZUNvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICB0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICB0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0eXBlQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0VMRU1FTlRfX1RZUEUpOwotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIER1bW15TGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWluIHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfTUlOT0NDVVJTKTsKLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBtaW5Db21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgbWluQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtaW5Db21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1pbkNvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobWluQ29tYm8pOwotICAgIG1pbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWluQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0VMRU1FTlRfX01JTl9PQ0NVUkVOQ0UpOyAgICAKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIER1bW15TGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWF4IHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX01BWE9DQ1VSUyk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgbWF4Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1heENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWF4Q29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXhDb21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1heENvbWJvLmFkZCgidW5ib3VuZGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhcHBseUFsbExpc3RlbmVycyhtYXhDb21ibyk7Ci0gICAgbWF4Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtYXhDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fRUxFTUVOVF9fTUFYX09DQ1VSRU5DRSk7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgaW5pdCgpOwotICAgIHJlbGF5b3V0KCk7Ci0gICAgCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBpc0VsZW1lbnRSZWZlcmVuY2UgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKTsKLQotICAgICAgdHlwZURlZmluaXRpb24gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZpbGxUeXBlc0NvbWJvKCkKLSAgewotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCi0gICAgICB0eXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICB0eXBlQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKTsKLSAgICAgIHR5cGVDb21iby5hZGQoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgdHlwZUNvbWJvLmFkZChpdGVtc1tpXS5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IFR5cGUgb2YgdGhpcyBlbGVtZW50IGlmIG5lZWRlZAotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0KS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSBuYW1lZENvbXBvbmVudC5nZXRUeXBlKCk7Ci0gICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRUeXBlTmFtZSA9IHRkLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgIGlmIChjdXJyZW50VHlwZU5hbWUgPT0gbnVsbCkgLy8gYW5vbnltb3VzIHR5cGUKLSAgICAgICAgICBjdXJyZW50VHlwZU5hbWUgPSAiKipBbm9ueW1vdXMqKiI7Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmV0ID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShjdXJyZW50VHlwZU5hbWUsIG1hbmFnZXIpOwotICAgICAgICBpZiAocmV0ID09IG51bGwgJiYgY3VycmVudFR5cGVOYW1lICE9IG51bGwpIC8vIG5vdCBpbiBxdWlja1BpY2sKLSAgICAgICAgewotICAgICAgICAgIHR5cGVDb21iby5hZGQoY3VycmVudFR5cGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoU3RyaW5nIHZhbHVlLCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlcikKLSAgewotICAgIGlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotICAgIHsgIAotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIC8vIHJlZnJlc2ggbmFtZQotICAgIG5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgdHlwZUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIG5hbWUgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGlzRWxlbWVudFJlZmVyZW5jZSkKLSAgICB7Ci0gICAgICByZWZyZXNoUmVmQ29tYm8oKTsKLSAgICB9Ci0KLSAgICAvLyByZWZyZXNoIHR5cGUKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNBbm9ueW1vdXMgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSAhPSBudWxsOwotICAgICAgICAvL1hTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBYU0RVdGlscy5nZXRSZXNvbHZlZFR5cGUoeHNkRWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAKLSAgICAgICAgaWYgKHR5cGVEZWYgIT0gbnVsbCkKLSAgICAgICAgICB0eXBlTmFtZSA9IHR5cGVEZWYuZ2V0UU5hbWUoeHNkU2NoZW1hKTsKLQotICAgICAgICBpZiAodHlwZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHR5cGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGxUeXBlc0NvbWJvKCk7Ci0gICAgICAgIGlmIChpc0Fub255bW91cykKLSAgICAgICAgewotICAgICAgICAJdHlwZUNvbWJvLnNldFRleHQoIioqQW5vbnltb3VzKioiKTsKLSAgICAgICAgICB0eXBlTmFtZSA9ICIqKkFub255bW91cyoqIjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dCh0eXBlTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dChNZXNzYWdlcy5VSV9OT19UWVBFKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1heENvbWJvLnNldEVuYWJsZWQoIXhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0dsb2JhbCgpIHx8IGlzRWxlbWVudFJlZmVyZW5jZSk7Ci0gICAgICAgIG1pbkNvbWJvLnNldEVuYWJsZWQoIXhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0dsb2JhbCgpIHx8IGlzRWxlbWVudFJlZmVyZW5jZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gcmVmcmVzaCBtaW4gbWF4Ci0gICAgcmVmcmVzaE1pbk1heCgpOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoZWRpdG9yID09IG51bGwpIHJldHVybjsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsgICAgCi0KLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXRCcm93c2VEaWFsb2coKTsKLSAgICAgICAgKChYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUpIGRpYWxvZykuc2hvd0NvbXBsZXhUeXBlcyh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXROZXdEaWFsb2coKTsKLSAgICAgICAgKChOZXdUeXBlRGlhbG9nKSBkaWFsb2cpLmFsbG93Q29tcGxleFR5cGUodHJ1ZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0KS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGVsZW1lbnREZWNsYXJhdGlvbiwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KHR5cGVOYW1lICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy91c2UgdGhlIHZhbHVlIGZyb20gc2VsZWN0ZWQgcXVpY2tQaWNrIGl0ZW0KLSAgICAgIHsKLSAgICAgICAgbmV3VmFsdWUgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKHNlbGVjdGlvbiwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIGlmIChlZGl0b3IgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOyAgICAKLQotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCk7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlOwotICAgICAgSUNvbXBvbmVudERpYWxvZyBkaWFsb2c9IG51bGw7Ci0gICAgICBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0FDVElPTl9CUk9XU0UpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldE5ld0RpYWxvZygpOwotICAgICAgfQotCi0gICAgICBpZiAoZGlhbG9nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaWFsb2cuY3JlYXRlQW5kT3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgICAgewotICAgICAgICAgIG5ld1ZhbHVlID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoaW5wdXQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dCgiIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy91c2UgdGhlIHZhbHVlIGZyb20gc2VsZWN0ZWQgcXVpY2tQaWNrIGl0ZW0KLSAgICAgIHsKLSAgICAgICAgbmV3VmFsdWUgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKHNlbGVjdGlvbiwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbWF4Q29tYm8pCi0gICAgewotICAgICAgdXBkYXRlTWF4QXR0cmlidXRlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1pbkNvbWJvKQotICAgIHsKLSAgICAgIHVwZGF0ZU1pbkF0dHJpYnV0ZSgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbGF5b3V0KCkKLSAgewotICAgIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0KLSAgICBpZiAocGFyZW50Q29tcG9zaXRlICE9IG51bGwgJiYgIXBhcmVudENvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50Q29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBjaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGluaXRpYWxpemUgdGhlIG5ldyBoYW5kbGVyCi0gICAgY3JlYXRlQ29udGVudHMocGFyZW50Q29tcG9zaXRlKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUsIHRydWUpOwotCi0gICAgLy8gTm93IHR1cm4gcGFpbnRpbmcgYmFjayBvbgotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgcmVmcmVzaCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIHN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0KS5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgICBpZiAoIXZhbGlkYXRlU2VjdGlvbigpKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBhbiBhY3R1YWwgbmFtZSBjaGFuZ2UgaGFzIHRha2VuIHBsYWNlCi0gICAgICAgIFN0cmluZyBvbGROYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZUNvbW1hbmQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfQUNUSU9OX1JFTkFNRSwgbmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwgJiYgZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkb1JlZmVyZW50aWFsSW50ZWdyaXR5Q2hlY2sobmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNlY3Rpb24oKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ID09IG51bGwgfHwgbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBhZ2FpbnN0IE5DTmFtZQotICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMSB8fCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX05BTUUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50TmFtZUNvbWJvICE9IG51bGwgJiYgIWNvbXBvbmVudE5hbWVDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBjb21wb25lbnROYW1lQ29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgaWYgKG1pbkNvbWJvICE9IG51bGwgJiYgIW1pbkNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIG1pbkNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChtYXhDb21ibyAhPSBudWxsICYmICFtYXhDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtYXhDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBpZiAodHlwZUNvbWJvICE9IG51bGwgJiYgIXR5cGVDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICB0eXBlQ29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgaWYgKG5hbWVUZXh0ICE9IG51bGwgJiYgIW5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJlbW92ZUxpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFJlZkNvbWJvKCkKLSAgewotICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGZpbGxFbGVtZW50c0NvbWJvKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBmaWxsRWxlbWVudHNDb21ibygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKTsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBxdWlja1BpY2tzID0gbWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gaGlzdG9yeSA9IG1hbmFnZXIuZ2V0SGlzdG9yeSgpOwotICAgICAgaWYgKGhpc3RvcnkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoaXN0b3J5Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gaGlzdG9yeVtpXTsKLSAgICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gbmFtZWRDb21wb25lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgCi0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpOwotICAgICAgaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXQgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKGF0dHJWYWx1ZSwgbWFuYWdlcik7Ci0gICAgICBpZiAocmV0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoYXR0clZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KGF0dHJWYWx1ZSk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERmFjZXRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREZhY2V0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjk1M2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERmFjZXRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RMZW5ndGhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4RXhjbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhJbmNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4TGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkV4Y2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluSW5jbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkxlbmd0aEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2hpdGVTcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2hpdGVTcGFjZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTREZhY2V0U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcml2YXRlIFN0cmluZyBtaW5MZW5ndGhTdHJpbmcsIG1heExlbmd0aFN0cmluZywgdGl0bGVTdHJpbmc7Ci0gIEZvbnQgdGl0bGVGb250OwotICBDTGFiZWwgdGl0bGU7Ci0gIExhYmVsIG1pbkxlbmd0aExhYmVsOwotICBUZXh0IG1pbkxlbmd0aFRleHQ7Ci0gIExhYmVsIG1heExlbmd0aExhYmVsOwotICBUZXh0IG1heExlbmd0aFRleHQ7Ci0gIEdyb3VwIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwOwotICBTdHJpbmcgc2ltcGxlVHlwZU1vZGlmaWVyR3JvdXBUaXRsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gIEJ1dHRvbiBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b247Ci0gIEJ1dHRvbiB1c2VFbnVtZXJhdGlvbnNCdXR0b24sIHVzZVBhdHRlcm5zQnV0dG9uOwotICBCdXR0b24gbWluaW11bUluY2x1c2l2ZUNoZWNrYm94OwotICBCdXR0b24gbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94OwotICBib29sZWFuIGlzTnVtZXJpY0Jhc2VUeXBlOwotICBib29sZWFuIGlzU2ltcGxlVHlwZVJlc3RyaWN0aW9uOwotICBwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uOwotICBwcml2YXRlIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICBwcml2YXRlIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGN1cnJlbnRQcmltaXRpdmVUeXBlLCBwcmV2aW91c1ByaW1pdGl2ZVR5cGU7Ci0gIHByaXZhdGUgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgcHJpdmF0ZSBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLSAgcHJpdmF0ZSBYU0RGZWF0dXJlIHhzZEZlYXR1cmU7Ci0gIGJvb2xlYW4gaGFzTWF4TWluRmFjZXRzOwotCi0gIFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQgY29uc3RyYWludHNXaWRnZXQ7Ci0KLSAgcHJpdmF0ZSBpbnQgY29uc3RyYWludEtpbmQgPSBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LkVOVU1FUkFUSU9OOwotICAKLSAgcHVibGljIFhTREZhY2V0U2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0gICAgY29tcG9zaXRlID0gZmFjdG9yeS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIHRpdGxlID0gZmFjdG9yeS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBGb250RGF0YSBmb250RGF0YSA9IGNvbXBvc2l0ZS5nZXRGb250KCkuZ2V0Rm9udERhdGEoKVswXTsKLSAgICB0aXRsZS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldEJvbGQoZm9udERhdGEuZ2V0TmFtZSgpKSk7Ci0gICAgdGl0bGUuc2V0VGV4dCh0aXRsZVN0cmluZyArIChpc1JlYWRPbmx5ID8gIiAtICIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfUkVBRE9OTFkgOiAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIENvbXBvc2l0ZSBmYWNldENvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBmYWNldENvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGZhY2V0Q29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUdyb3VwKGZhY2V0Q29tcG9zaXRlLCBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cFRpdGxlKTsKLSAgICBHcmlkTGF5b3V0IGdyb3VwR3JpZCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JvdXBHcmlkLm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JvdXBHcmlkLm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JvdXBHcmlkLm51bUNvbHVtbnMgPSAxOwotICAgIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgc2ltcGxlVHlwZU1vZGlmaWVyR3JvdXAuc2V0TGF5b3V0KGdyb3VwR3JpZCk7Ci0KLSAgICBDb21wb3NpdGUgc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHNpbXBsZVR5cGVNb2RpZmllckdyb3VwKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkLm51bUNvbHVtbnMgPSAzOwotICAgIHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZCk7Ci0gICAgc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGhhc01heE1pbkZhY2V0cykKLSAgICB7Ci0gICAgICBib29sZWFuIGlzTGludXggPSBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yLmVxdWFscygiLyIpOwotICAgICAgbWluTGVuZ3RoTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgbWluTGVuZ3RoU3RyaW5nKTsKLSAgICAgIG1pbkxlbmd0aFRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQoc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpc0xpbnV4KQotICAgICAgewotICAgICAgCW1pbkxlbmd0aFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgY3VzdG9tTGlzdGVuZXIpOwotICAgICAgCW1pbkxlbmd0aFRleHQuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgYXBwbHlBbGxMaXN0ZW5lcnMobWluTGVuZ3RoVGV4dCk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWluTGVuZ3RoVGV4dCwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkNPTlNUUkFJTlRTX1RBQl9fTUlOSU1VTV9MRU5HVEgpOwotCi0gICAgICBHcmlkRGF0YSBtaW5HcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgbWluR3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotICAgICAgbWluTGVuZ3RoVGV4dC5zZXRMYXlvdXREYXRhKG1pbkdyaWREYXRhKTsKLSAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveCA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0lOQ0xVU0lWRSwgU1dULkNIRUNLKTsKLSAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgICAgbWF4TGVuZ3RoTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgbWF4TGVuZ3RoU3RyaW5nKTsKLSAgICAgIG1heExlbmd0aFRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQoc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpc0xpbnV4KQotICAgICAgewotICAgIAkgIG1heExlbmd0aFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgY3VzdG9tTGlzdGVuZXIpOwotICAgIAkgIG1heExlbmd0aFRleHQuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgYXBwbHlBbGxMaXN0ZW5lcnMobWF4TGVuZ3RoVGV4dCk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWF4TGVuZ3RoVGV4dCwKLSAgICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQ09OU1RSQUlOVFNfVEFCX19NQVhJTVVNX0xFTkdUSCk7Ci0KLSAgICAgIEdyaWREYXRhIG1heEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBtYXhHcmlkRGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0gICAgICBtYXhMZW5ndGhUZXh0LnNldExheW91dERhdGEobWF4R3JpZERhdGEpOwotCi0gICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3ggPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihzaW1wbGVUeXBlTW9kaWZpZXJDb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9JTkNMVVNJVkUsIFNXVC5DSEVDSyk7Ci0gICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRWaXNpYmxlKGlzTnVtZXJpY0Jhc2VUeXBlKTsKLSAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRWaXNpYmxlKGlzTnVtZXJpY0Jhc2VUeXBlKTsKLSAgICB9Ci0gICAgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfQ09MTEFQU0VfV0hJVEVTUEFDRSwgU1dULkNIRUNLKTsKLSAgICBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5DT05TVFJBSU5UU19UQUJfX0NPTExBUFNFX1dISVRFU1BBQ0UpOwotCi0gICAgR3JvdXAgc3BlY2lmaWNWYWx1ZUNvbnN0cmFpbnRzR3JvdXAgPSBmYWN0b3J5LmNyZWF0ZUdyb3VwKGZhY2V0Q29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfU1BFQ0lGSUNfQ09OU1RSQUlOVF9WQUxVRVMpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBzcGVjaWZpY1ZhbHVlQ29uc3RyYWludHNHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBzcGVjaWZpY1ZhbHVlQ29uc3RyYWludHNHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZUZvckJ1dHRvbnMgPSBmYWN0b3J5LmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHNwZWNpZmljVmFsdWVDb25zdHJhaW50c0dyb3VwKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGNvbXBvc2l0ZUZvckJ1dHRvbnMuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotICAgIGNvbXBvc2l0ZUZvckJ1dHRvbnMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIGZhY3RvcnkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZUZvckJ1dHRvbnMsIE1lc3NhZ2VzLl9VSV9MQUJFTF9SRVNUUklDVF9WQUxVRVNfQlkpOwotLy8gICAgdXNlRGVmaW5lZFZhbHVlc0J1dHRvbiA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZUZvckJ1dHRvbnMsICJPbmx5IHBlcm1pdCBjZXJ0YWluIHZhbHVlcyIsIFNXVC5DSEVDSyk7Ci0vLyAgICB1c2VEZWZpbmVkVmFsdWVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZUZvclJhZGlvQnV0dG9ucyA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUoY29tcG9zaXRlRm9yQnV0dG9ucyk7Ci0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgY29tcG9zaXRlRm9yUmFkaW9CdXR0b25zLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICB1c2VFbnVtZXJhdGlvbnNCdXR0b24gPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGVGb3JSYWRpb0J1dHRvbnMsIE1lc3NhZ2VzLl9VSV9MQUJFTF9FTlVNRVJBVElPTlMsIFNXVC5SQURJTyk7Ci0gICAgdXNlRW51bWVyYXRpb25zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodXNlRW51bWVyYXRpb25zQnV0dG9uLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQ09OU1RSQUlOVFNfVEFCX19FTlVNRVJBVElPTlMpOwotICAgIHVzZVBhdHRlcm5zQnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oY29tcG9zaXRlRm9yUmFkaW9CdXR0b25zLCBNZXNzYWdlcy5fVUlfTEFCRUxfUEFUVEVSTlMsIFNXVC5SQURJTyk7Ci0gICAgdXNlUGF0dGVybnNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1c2VQYXR0ZXJuc0J1dHRvbiwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkNPTlNUUkFJTlRTX1RBQl9fUEFUVEVSTlMpOyAgICAKLSAgICAKLSAgICBjb25zdHJhaW50c1dpZGdldCA9IG5ldyBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0KHNwZWNpZmljVmFsdWVDb25zdHJhaW50c0dyb3VwLCBmYWN0b3J5LCAoaW5wdXQgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKSA/IChYU0RGZWF0dXJlKWlucHV0IDogbnVsbCwgeHNkU2ltcGxlVHlwZURlZmluaXRpb24sIHRoaXMsIGNvbnN0cmFpbnRLaW5kKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29uc3RyYWludHNXaWRnZXQuZ2V0Q29udHJvbCgpLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQ09OU1RSQUlOVFNfVEFCX19OT19MQUJFTCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoKQotICB7Ci0gICAgc2V0SW5wdXQoZ2V0UGFydCgpLCBnZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgaW5pdCgpOwotICAgIAotICAgIFhTRFNjaGVtYSBzY2hlbWFPZlR5cGUgPSBudWxsOwotCi0gICAgaWYgKCFpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIHNjaGVtYU9mVHlwZSA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFNjaGVtYSgpOwotICAgIH0KLSAgICBpZiAoc2NoZW1hT2ZUeXBlID09IG93bmluZ0VkaXRvci5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcykpCi0gICAgewotICAgICAgaXNSZWFkT25seSA9IGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgaXNSZWFkT25seSA9IHRydWU7Ci0gICAgfQotICAgIGlmIChoYXNNYXhNaW5GYWNldHMpCi0gICAgewotICAgICAgdGl0bGUuc2V0VGV4dCh0aXRsZVN0cmluZyArIChpc1JlYWRPbmx5ID8gIiAtICIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfUkVBRE9OTFkgOiAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0gICAgcmVsYXlvdXQoKTsKLSAgICBjb25zdHJhaW50c1dpZGdldC5zZXRDb21tYW5kU3RhY2soZ2V0Q29tbWFuZFN0YWNrKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBoYXNNYXhNaW5GYWNldHMgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgdXBkYXRlSW5wdXQoKTsKLSAgICAKLSAgICBpZiAoeHNkU2ltcGxlVHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpc1NpbXBsZVR5cGVSZXN0cmljdGlvbiA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFZhcmlldHkoKS5nZXRWYWx1ZSgpID09IFhTRFZhcmlldHkuQVRPTUlDOwotICAgICAgCi0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0YXJnZXRTVCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICAgICAgCi0gICAgICB3aGlsZSAoIVhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHModGFyZ2V0U1QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIHRhcmdldFNUICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldFNUID0gdGFyZ2V0U1QuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIG1pbkxlbmd0aFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICBtYXhMZW5ndGhTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKHRhcmdldFNULmdldFZhbGlkRmFjZXRzKCkuY29udGFpbnMoImxlbmd0aCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIG1pbkxlbmd0aFN0cmluZyA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9NSU5JTVVNX0xFTkdUSDsKLSAgICAgICAgbWF4TGVuZ3RoU3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX01BWElNVU1fTEVOR1RIOwotICAgICAgICBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cFRpdGxlID0gTWVzc2FnZXMuX1VJX0xBQkVMX0NPTlNUUkFJTlRTX09OX0xFTkdUSF9PRiArIHRhcmdldFNULmdldE5hbWUoKTsKLSAgICAgICAgaXNOdW1lcmljQmFzZVR5cGUgPSBmYWxzZTsKLSAgICAgICAgaGFzTWF4TWluRmFjZXRzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldFNULmdldFZhbGlkRmFjZXRzKCkuY29udGFpbnMoIm1heEluY2x1c2l2ZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwVGl0bGUgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09OU1RSQUlOVFNfT05fVkFMVUVfT0YgKyB0YXJnZXRTVC5nZXROYW1lKCk7Ci0gICAgICAgIG1pbkxlbmd0aFN0cmluZyA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9NSU5JTVVNX1ZBTFVFOwotICAgICAgICBtYXhMZW5ndGhTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfTUFYSU1VTV9WQUxVRTsKLSAgICAgICAgaXNOdW1lcmljQmFzZVR5cGUgPSB0cnVlOwotICAgICAgICBoYXNNYXhNaW5GYWNldHMgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cFRpdGxlID0gTWVzc2FnZXMuX1VJX0xBQkVMX0NPTlRSQUlOVFNfT04gKyAodGFyZ2V0U1QgIT0gbnVsbCA/IHRhcmdldFNULmdldE5hbWUoKSA6ICJhbnlUeXBlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVJbnB1dCgpCi0gIHsKLSAgICBwcmV2aW91c1ByaW1pdGl2ZVR5cGUgPSBjdXJyZW50UHJpbWl0aXZlVHlwZTsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKQotICAgIHsKLSAgICAgIHhzZEZlYXR1cmUgPSAoWFNERmVhdHVyZSkgaW5wdXQ7Ci0gICAgICB0eXBlRGVmaW5pdGlvbiA9IHhzZEZlYXR1cmUuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkuZ2V0VHlwZSgpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gYW5vbnltb3VzVHlwZURlZmluaXRpb24gPSBudWxsOwotICAgICAgaWYgKHhzZEZlYXR1cmUgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24peHNkRmVhdHVyZTsKLSAgICAgICAgYW5vbnltb3VzVHlwZURlZmluaXRpb24gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoeHNkRmVhdHVyZSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbil4c2RGZWF0dXJlOwotICAgICAgICBhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiA9IHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHR5cGVEZWZpbml0aW9uOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoYW5vbnltb3VzVHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pYW5vbnltb3VzVHlwZURlZmluaXRpb247Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoIVhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYmFzZVByaW1pdGl2ZVR5cGUgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICBTdHJpbmcgYmFzZVByaW1pdGl2ZVR5cGVTdHJpbmcgPSBiYXNlUHJpbWl0aXZlVHlwZSAhPSBudWxsID8gYmFzZVByaW1pdGl2ZVR5cGUuZ2V0TmFtZSgpIDogIiI7Ci0gICAgICAgICAgY3VycmVudFByaW1pdGl2ZVR5cGUgPSBiYXNlUHJpbWl0aXZlVHlwZTsKLSAgICAgICAgICB0aXRsZVN0cmluZyA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9UWVBFICsgKGFub255bW91c1R5cGVEZWZpbml0aW9uICE9IG51bGwgPyAiKCIgKyB4c2RGZWF0dXJlLmdldFJlc29sdmVkRmVhdHVyZSgpLmdldE5hbWUoKSArICJUeXBlKSIgOiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpICArICIgLCAiICsgTWVzc2FnZXMuX1VJX0xBQkVMX0JBU0UgKyAiOiAiICsgYmFzZVByaW1pdGl2ZVR5cGVTdHJpbmc7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyZW50UHJpbWl0aXZlVHlwZSA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICAgICAgICAgIHRpdGxlU3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX1RZUEUgKyAoYW5vbnltb3VzVHlwZURlZmluaXRpb24gIT0gbnVsbCA/ICIoIiArIHhzZEZlYXR1cmUuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkuZ2V0TmFtZSgpICsgIlR5cGUpIiA6IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICBjdXJyZW50UHJpbWl0aXZlVHlwZSA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICAgICAgdGl0bGVTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfVFlQRSArICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgPT0gbnVsbCA/ICIobG9jYWxUeXBlKSIgOiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpICsgIiAsICIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfQkFTRSArICI6ICIgKyB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIGluaXQoKTsKLSAgICAKLSAgICBpZiAoY3VycmVudFByaW1pdGl2ZVR5cGUgIT0gcHJldmlvdXNQcmltaXRpdmVUeXBlKQotICAgIHsKLSAgICAgIHJlbGF5b3V0KCk7ICAgICAgCi0gICAgfQotICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgCi0gICAgWFNEV2hpdGVTcGFjZUZhY2V0IHdoaXRlc3BhY2VGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFdoaXRlU3BhY2VGYWNldCgpOwotICAgIGlmICh3aGl0ZXNwYWNlRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RmFjZXRDb250ZW50cygpLmNvbnRhaW5zKHdoaXRlc3BhY2VGYWNldCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChYU0RXaGl0ZVNwYWNlLkNPTExBUFNFX0xJVEVSQUwuZXF1YWxzKHdoaXRlc3BhY2VGYWNldC5nZXRWYWx1ZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChoYXNNYXhNaW5GYWNldHMgJiYgIW1pbkxlbmd0aExhYmVsLmlzRGlzcG9zZWQoKSAmJiAhbWF4TGVuZ3RoTGFiZWwuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIG1pbkxlbmd0aExhYmVsLnNldFRleHQobWluTGVuZ3RoU3RyaW5nKTsKLSAgICAgIG1heExlbmd0aExhYmVsLnNldFRleHQobWF4TGVuZ3RoU3RyaW5nKTsKLQotICAgICAgaWYgKCFpc051bWVyaWNCYXNlVHlwZSkKLSAgICAgICAgcmVmcmVzaFN0cmluZ0xlbmd0aCgpOwotICAgICAgZWxzZQotICAgICAgICByZWZyZXNoVmFsdWVMZW5ndGhzKCk7Ci0gICAgfQotCi0gICAgaWYgKCh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRFbnVtZXJhdGlvbkZhY2V0cygpLnNpemUoKSA+IDAgCi0gICAgCQkmJiBjb25zdHJhaW50c1dpZGdldC5nZXRDb25zdHJhaW50S2luZCgpID09IFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuRU5VTUVSQVRJT04pCi0gICAgCQl8fCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRQYXR0ZXJuRmFjZXRzKCkuc2l6ZSgpID09IDApIAotICAgIHsKLSAgICAgIHVzZVBhdHRlcm5zQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICB1c2VFbnVtZXJhdGlvbnNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgY29uc3RyYWludHNXaWRnZXQuc2V0Q29uc3RyYWludEtpbmQoU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5FTlVNRVJBVElPTik7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5hZGRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFBhdHRlcm5GYWNldHMoKS5zaXplKCkgPiAwCi0gICAgCQkmJiBjb25zdHJhaW50c1dpZGdldC5nZXRDb25zdHJhaW50S2luZCgpID09IFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuUEFUVEVSTikKLSAgICAJCXx8IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEVudW1lcmF0aW9uRmFjZXRzKCkuc2l6ZSgpID09IDApCi0gICAgewotICAgICAgdXNlUGF0dGVybnNCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgdXNlRW51bWVyYXRpb25zQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5zZXRDb25zdHJhaW50S2luZChTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LlBBVFRFUk4pOwotICAgICAgY29uc3RyYWludHNXaWRnZXQuYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdXNlUGF0dGVybnNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIHVzZUVudW1lcmF0aW9uc0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5zZXRDb25zdHJhaW50S2luZChTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LkVOVU1FUkFUSU9OKTsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgICBjb25zdHJhaW50S2luZCA9IGNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnN0cmFpbnRLaW5kKCk7Ci0gICAgY29uc3RyYWludHNXaWRnZXQuc2V0SW5wdXQoeHNkU2ltcGxlVHlwZURlZmluaXRpb24pOwotCi0gICAgc2V0V2lkZ2V0c0VuYWJsZWQoaXNTaW1wbGVUeXBlUmVzdHJpY3Rpb24gJiYgIWlzUmVhZE9ubHkpOwotICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGlzU2ltcGxlVHlwZVJlc3RyaWN0aW9uICYmICFpc1JlYWRPbmx5KTsKLSAgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXRXaWRnZXRzRW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkKLSAgewotICAgIGlmIChjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24gIT0gbnVsbCAmJiAhY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICAgIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgaWYgKHVzZUVudW1lcmF0aW9uc0J1dHRvbiAhPSBudWxsICYmICF1c2VFbnVtZXJhdGlvbnNCdXR0b24uaXNEaXNwb3NlZCgpKQotICAgICAgdXNlRW51bWVyYXRpb25zQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICBpZiAodXNlUGF0dGVybnNCdXR0b24gIT0gbnVsbCAmJiAhdXNlUGF0dGVybnNCdXR0b24uaXNEaXNwb3NlZCgpKQotICAgICAgdXNlUGF0dGVybnNCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGlmIChtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3ggIT0gbnVsbCAmJiAhbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmlzRGlzcG9zZWQoKSkKLSAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgaWYgKG1heGltdW1JbmNsdXNpdmVDaGVja2JveCAhPSBudWxsICYmICFtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guaXNEaXNwb3NlZCgpKQotICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICBpZiAoY29uc3RyYWludHNXaWRnZXQgIT0gbnVsbCAmJiAhY29uc3RyYWludHNXaWRnZXQuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBpZihjb25zdHJhaW50c1dpZGdldC5nZXRDb25zdHJhaW50S2luZCgpID09IFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuUEFUVEVSTikKLSAgICAgIHsKLSAgICAgICAgY29uc3RyYWludHNXaWRnZXQuYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOyAgCi0gICAgICB9Ci0gICAgICBlbHNlIAotICAgICAgewotICAgICAgICBjb25zdHJhaW50c1dpZGdldC5hZGRCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgICAgfSAgICAgIAotICAgICAgY29uc3RyYWludHNXaWRnZXQuYWRkVXNpbmdEaWFsb2dCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbGF5b3V0KCkKLSAgewotICAgIENvbXBvc2l0ZSBwYXJlbnQgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0gICAgcGFyZW50LmdldFBhcmVudCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0KLSAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBjaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgcGFyZW50LmdldFBhcmVudCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLSAgICBwYXJlbnQuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KHRydWUpOwotICAgIHJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKHRpdGxlRm9udCAhPSBudWxsICYmICF0aXRsZUZvbnQuaXNEaXNwb3NlZCgpKQotICAgICAgdGl0bGVGb250LmRpc3Bvc2UoKTsKLSAgICB0aXRsZUZvbnQgPSBudWxsOwotICAgIAotICAgIGlmIChtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3ggIT0gbnVsbCAmJiAhbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmlzRGlzcG9zZWQoKSkKLSAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBpZiAobWF4aW11bUluY2x1c2l2ZUNoZWNrYm94ICE9IG51bGwgJiYgIW1heGltdW1JbmNsdXNpdmVDaGVja2JveC5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3gucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgaWYgKGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbiAhPSBudWxsICYmICFjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24uaXNEaXNwb3NlZCgpKQotICAgICAgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgaWYgKG1heExlbmd0aFRleHQgIT0gbnVsbCAmJiAhbWF4TGVuZ3RoVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobWF4TGVuZ3RoVGV4dCk7Ci0gICAgaWYgKG1pbkxlbmd0aFRleHQgIT0gbnVsbCAmJiAhbWluTGVuZ3RoVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobWluTGVuZ3RoVGV4dCk7Ci0gICAgCi0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaFN0cmluZ0xlbmd0aCgpCi0gIHsKLSAgICBYU0RNaW5MZW5ndGhGYWNldCBtaW5MZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgWFNETWF4TGVuZ3RoRmFjZXQgbWF4TGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNYXhMZW5ndGhGYWNldCgpOwotICAgIFhTRExlbmd0aEZhY2V0IGxlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TGVuZ3RoRmFjZXQoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChtaW5MZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgbWluTGVuZ3RoVmFsdWUgPSBtaW5MZW5ndGhGYWNldC5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAobWluTGVuZ3RoVmFsdWUgPj0gMCAmJiBtaW5MZW5ndGhGYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgbWluTGVuZ3RoVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcobWluTGVuZ3RoVmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5MZW5ndGhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChtYXhMZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgbWF4TGVuZ3RoID0gbWF4TGVuZ3RoRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKG1heExlbmd0aCA+PSAwICYmIG1heExlbmd0aEZhY2V0LmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXhMZW5ndGhUZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhtYXhMZW5ndGgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtYXhMZW5ndGhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgbGVuZ3RoID0gbGVuZ3RoRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKGxlbmd0aCA+PSAwICYmIGxlbmd0aEZhY2V0LmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5MZW5ndGhUZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhsZW5ndGgpKTsKLSAgICAgICAgICBtYXhMZW5ndGhUZXh0LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhsZW5ndGgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotCi0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoVmFsdWVMZW5ndGhzKCkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgICBYU0RNaW5GYWNldCBtaW5GYWNldCA9IHR5cGUuZ2V0TWluRmFjZXQoKTsKLSAgICBYU0RNYXhGYWNldCBtYXhGYWNldCA9IHR5cGUuZ2V0TWF4RmFjZXQoKTsKLQotICAgIGlmIChtaW5GYWNldCAhPSBudWxsICYmIG1pbkZhY2V0LmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEpCi0gICAgewotICAgICAgaWYgKG1pbkZhY2V0LmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1JTkVYQ0xVU0lWRV9FTEVNRU5UX1RBRykgfHwgbWluRmFjZXQuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuTUlOSU5DTFVTSVZFX0VMRU1FTlRfVEFHKSkKLSAgICAgIHsKLSAgICAgICAgbWluTGVuZ3RoVGV4dC5zZXRUZXh0KG1pbkZhY2V0LmdldExleGljYWxWYWx1ZSgpKTsKLSAgICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LnNldFNlbGVjdGlvbihtaW5GYWNldC5pc0luY2x1c2l2ZSgpKTsKLSAgICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1pbkxlbmd0aFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLQotICAgIGlmIChtYXhGYWNldCAhPSBudWxsICYmIG1heEZhY2V0LmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEpCi0gICAgewotICAgICAgaWYgKG1heEZhY2V0LmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1BWEVYQ0xVU0lWRV9FTEVNRU5UX1RBRykgfHwgbWF4RmFjZXQuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpLmVxdWFscyhYU0RDb25zdGFudHMuTUFYSU5DTFVTSVZFX0VMRU1FTlRfVEFHKSkKLSAgICAgIHsKLSAgICAgICAgbWF4TGVuZ3RoVGV4dC5zZXRUZXh0KG1heEZhY2V0LmdldExleGljYWxWYWx1ZSgpKTsKLSAgICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LnNldFNlbGVjdGlvbihtYXhGYWNldC5pc0luY2x1c2l2ZSgpKTsKLSAgICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1heExlbmd0aFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGJvb2xlYW4gZG9VcGRhdGVNYXggPSBmYWxzZSwgZG9VcGRhdGVNaW4gPSBmYWxzZTsKLSAgICBib29sZWFuIGRvU2V0SW5wdXQgPSBmYWxzZTsKLSAgICAKLSAgICBTdHJpbmcgbWluVmFsdWUgPSBtaW5MZW5ndGhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgU3RyaW5nIG1heFZhbHVlID0gbWF4TGVuZ3RoVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCi0gICAgWFNETGVuZ3RoRmFjZXQgbGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRMZW5ndGhGYWNldCgpOwotICAgIFhTRE1pbkxlbmd0aEZhY2V0IG1pbkxlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWluTGVuZ3RoRmFjZXQoKTsKLSAgICBYU0RNYXhMZW5ndGhGYWNldCBtYXhMZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1heExlbmd0aEZhY2V0KCk7Ci0gICAgCi0gICAgWFNETWluSW5jbHVzaXZlRmFjZXQgbWluSW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNaW5JbmNsdXNpdmVGYWNldCgpOwotICAgIFhTRE1pbkV4Y2x1c2l2ZUZhY2V0IG1pbkV4Y2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWluRXhjbHVzaXZlRmFjZXQoKTsKLSAgICBYU0RNYXhJbmNsdXNpdmVGYWNldCBtYXhJbmNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1heEluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgWFNETWF4RXhjbHVzaXZlRmFjZXQgbWF4RXhjbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNYXhFeGNsdXNpdmVGYWNldCgpOwotCi0gICAgU3RyaW5nIGN1cnJlbnRNaW5JbmNsdXNpdmUgPSBudWxsLCBjdXJyZW50TWluRXhjbHVzaXZlID0gbnVsbCwgY3VycmVudE1heEluY2x1c2l2ZSA9IG51bGwsIGN1cnJlbnRNYXhFeGNsdXNpdmUgPSBudWxsOwotICAgIGlmIChtaW5JbmNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRNaW5JbmNsdXNpdmUgPSBtaW5JbmNsdXNpdmVGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKG1pbkV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudE1pbkV4Y2x1c2l2ZSA9IG1pbkV4Y2x1c2l2ZUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgIH0KLSAgICBpZiAobWF4SW5jbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50TWF4SW5jbHVzaXZlID0gbWF4SW5jbHVzaXZlRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgfQotICAgIGlmIChtYXhFeGNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRNYXhFeGNsdXNpdmUgPSBtYXhFeGNsdXNpdmVGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIGN1cnJlbnRMZW5ndGggPSBudWxsLCBjdXJyZW50TWluID0gbnVsbCwgY3VycmVudE1heCA9IG51bGw7Ci0gICAgaWYgKGxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudExlbmd0aCA9IGxlbmd0aEZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgIH0KLSAgICBpZiAobWluTGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50TWluID0gbWluTGVuZ3RoRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgfQotICAgIGlmIChtYXhMZW5ndGhGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRNYXggPSBtYXhMZW5ndGhGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBtaW5MZW5ndGhUZXh0KQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAobWluVmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc051bWVyaWNCYXNlVHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBOdW1iZXIgYmlnID0gbmV3IEJpZ0ludGVnZXIobWluVmFsdWUpOwotICAgICAgICAgICAgYmlnLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAobWluTGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG1pblZhbHVlLmVxdWFscyhjdXJyZW50TWluKSB8fCBtaW5WYWx1ZS5lcXVhbHMoY3VycmVudExlbmd0aCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobWF4VmFsdWUgIT0gbnVsbCAmJiBtaW5WYWx1ZS5lcXVhbHMobWF4VmFsdWUpICYmIGxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJkb3VibGUiKS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGUoKSkgfHwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oImZsb2F0IikuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlKCkpIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJkZWNpbWFsIikuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlKCkpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbCA9IG5ldyBCaWdEZWNpbWFsKG1pblZhbHVlKTsKLSAgICAgICAgICAgICAgYmlnRGVjaW1hbC50b1N0cmluZygpOwotICAgICAgICAgICAgICBpZiAoIChjdXJyZW50TWluSW5jbHVzaXZlICE9IG51bGwgJiYgbWluVmFsdWUuZXF1YWxzKGN1cnJlbnRNaW5JbmNsdXNpdmUpKSB8fAotICAgICAgICAgICAgICAgICAgIChjdXJyZW50TWluRXhjbHVzaXZlICE9IG51bGwgJiYgbWluVmFsdWUuZXF1YWxzKGN1cnJlbnRNaW5FeGNsdXNpdmUpKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTnVtYmVyIGJpZyA9IG5ldyBCaWdJbnRlZ2VyKG1pblZhbHVlKTsKLSAgICAgICAgICAgICAgYmlnLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc051bWVyaWNCYXNlVHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudE1pbiA9PSBudWxsICYmIGN1cnJlbnRMZW5ndGggPT0gbnVsbCkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRNaW5JbmNsdXNpdmUgPT0gbnVsbCAmJiBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRNaW5FeGNsdXNpdmUgPT0gbnVsbCAmJiAhbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBtaW5WYWx1ZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZG9VcGRhdGVNaW4gPSB0cnVlOwotICAgICAgfQotICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPIHNob3cgZXJyb3IgbWVzc2FnZQotICAgICAgICBkb1VwZGF0ZU1pbiA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG1heExlbmd0aFRleHQpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChtYXhWYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzTnVtZXJpY0Jhc2VUeXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE51bWJlciBiaWcgPSBuZXcgQmlnSW50ZWdlcihtYXhWYWx1ZSk7Ci0gICAgICAgICAgICBiaWcudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChtYXhMZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobWF4VmFsdWUuZXF1YWxzKGN1cnJlbnRNYXgpIHx8IG1heFZhbHVlLmVxdWFscyhjdXJyZW50TGVuZ3RoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChtaW5WYWx1ZSAhPSBudWxsICYmIG1heFZhbHVlLmVxdWFscyhtaW5WYWx1ZSkgJiYgbGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oImRvdWJsZSIpLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpKSB8fCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigiZmxvYXQiKS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGUoKSkgfHwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oImRlY2ltYWwiKS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGUoKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQmlnRGVjaW1hbCBiaWdEZWNpbWFsID0gbmV3IEJpZ0RlY2ltYWwobWF4VmFsdWUpOwotICAgICAgICAgICAgICBiaWdEZWNpbWFsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE51bWJlciBiaWcgPSBuZXcgQmlnSW50ZWdlcihtYXhWYWx1ZSk7Ci0gICAgICAgICAgICAgIGJpZy50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRNYXggPT0gbnVsbCAmJiBjdXJyZW50TGVuZ3RoID09IG51bGwpCi0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TWF4SW5jbHVzaXZlID09IG51bGwgJiYgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50TWF4RXhjbHVzaXZlID09IG51bGwgJiYgIW1heGltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtYXhWYWx1ZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBkb1VwZGF0ZU1heCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGRvVXBkYXRlTWF4ID0gZmFsc2U7Ci0gICAgICAgIC8vIFRPRE8gc2hvdyBlcnJvciBtZXNzYWdlCi0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSAmJiAoZG9VcGRhdGVNYXggfHwgZG9VcGRhdGVNaW4pKQotICAgIHsKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUgPSBudWxsOwotICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLSAgICAgIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBudWxsOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICAgIHsKLSAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0QW5vbnltb3VzU2ltcGxlVHlwZSgoWFNERmVhdHVyZSlpbnB1dCwgeHNkU2ltcGxlVHlwZURlZmluaXRpb24pOwotICAgICAgICBpZiAoYW5vbnltb3VzU2ltcGxlVHlwZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oeHNkU2ltcGxlVHlwZURlZmluaXRpb24pOwotICAgICAgIAotICAgICAgICAgIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZCA9IG5ldyBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DT05TVFJBSU5fTEVOR1RILCAoWFNERmVhdHVyZSlpbnB1dCk7Ci0gICAgICAgICAgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kLnNldEFub255bW91c1NpbXBsZVR5cGUoYW5vbnltb3VzU2ltcGxlVHlwZSk7Ci0gICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQpOwotICAgICAgICAgIGRvU2V0SW5wdXQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc051bWVyaWNCYXNlVHlwZSkKLSAgICAgICAgewotICAgICAgICAgIFVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZCgiIiwgYW5vbnltb3VzU2ltcGxlVHlwZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoZG9VcGRhdGVNYXgpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNYXgobWF4VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKHVwZGF0ZUNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0JPVU5EUywgYW5vbnltb3VzU2ltcGxlVHlwZSwgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpLCBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgIGlmIChkb1VwZGF0ZU1heCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1heChtYXhWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChkb1VwZGF0ZU1pbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1pbihtaW5WYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQodXBkYXRlQ29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29tbWFuZCA9IGNvbXBvdW5kQ29tbWFuZDsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBVcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQoIiIsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChkb1VwZGF0ZU1heCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1heChtYXhWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChkb1VwZGF0ZU1pbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1pbihtaW5WYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbW1hbmQgPSB1cGRhdGVDb21tYW5kOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0JPVU5EUywgeHNkU2ltcGxlVHlwZURlZmluaXRpb24sIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSwgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICBpZiAoZG9VcGRhdGVNYXgpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNYXgobWF4VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb21tYW5kID0gdXBkYXRlQ29tbWFuZDsKLSAgICAgICAgfQotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCFpc051bWVyaWNCYXNlVHlwZSkKLSAgICAgIHsKLSAgICAgICAgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kKCIiLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGRvVXBkYXRlTWF4KQotICAgICAgICB7Ci0gICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNYXgobWF4VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkb1VwZGF0ZU1pbikKLSAgICAgICAgewotICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWluKG1pblZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHVwZGF0ZUNvbW1hbmQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9CT1VORFMsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCksIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGlmIChkb1VwZGF0ZU1heCkKLSAgICAgICAgewotICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWF4KG1heFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICAgIHsKLSAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1pbihtaW5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh1cGRhdGVDb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICByZWZyZXNoKCk7Ci0gICAgaWYgKGRvU2V0SW5wdXQpCi0gICAgICBzZXRJbnB1dChnZXRQYXJ0KCksIGdldFNlbGVjdGlvbigpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24pCi0gICAgewotICAgICAgIENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0gICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYW5vbnltb3VzU2ltcGxlVHlwZSA9IG51bGw7Ci0gICAgICAgaWYgKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgIHsKLSAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREZlYXR1cmUpCi0gICAgICAgICB7Ci0gICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RDb21tb25VSVV0aWxzLmdldEFub255bW91c1NpbXBsZVR5cGUoKFhTREZlYXR1cmUpaW5wdXQsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgICAgaWYgKGFub255bW91c1NpbXBsZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICAgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZCA9IG5ldyBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DT05TVFJBSU5fTEVOR1RILCAoWFNERmVhdHVyZSlpbnB1dCk7Ci0gICAgICAgICAgICAgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kLnNldEFub255bW91c1NpbXBsZVR5cGUoYW5vbnltb3VzU2ltcGxlVHlwZSk7Ci0gICAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQpOwotICAgICAgICAgICB9Ci0gIAotICAgICAgICAgICBVcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kIHdoaXRlU3BhY2VDb21tYW5kID0gbmV3IFVwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DT0xMQVBTRV9XSElURVNQQUNFLCBhbm9ueW1vdXNTaW1wbGVUeXBlLCBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKHdoaXRlU3BhY2VDb21tYW5kKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgIHNldElucHV0KGdldFBhcnQoKSwgZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBVcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kIHdoaXRlU3BhY2VDb21tYW5kID0gbmV3IFVwZGF0ZVhTRFdoaXRlU3BhY2VGYWNldENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DT0xMQVBTRV9XSElURVNQQUNFLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh3aGl0ZVNwYWNlQ29tbWFuZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1pbmltdW1JbmNsdXNpdmVDaGVja2JveCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWluVmFsdWUgPSBtaW5MZW5ndGhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAobWluVmFsdWUubGVuZ3RoKCkgPT0gMCkgbWluVmFsdWUgPSBudWxsOwotCi0gICAgICBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9CT1VORFMsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCksIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICB1cGRhdGVDb21tYW5kLnNldE1pbihtaW5WYWx1ZSk7Ci0gICAgICAKLSAgICAgIGlmIChtaW5WYWx1ZSAhPSBudWxsKQotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHVwZGF0ZUNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3gpCi0gICAgewotICAgICAgU3RyaW5nIG1heFZhbHVlID0gbWF4TGVuZ3RoVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgaWYgKG1heFZhbHVlLmxlbmd0aCgpID09IDApIG1heFZhbHVlID0gbnVsbDsKLSAgICAgIFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0JPVU5EUywgeHNkU2ltcGxlVHlwZURlZmluaXRpb24sIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSwgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLSAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWF4KG1heFZhbHVlKTsKLSAgICAgIGlmIChtYXhWYWx1ZSAhPSBudWxsKQotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHVwZGF0ZUNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSB1c2VFbnVtZXJhdGlvbnNCdXR0b24pCi0gICAgewotICAgICAgY29uc3RyYWludHNXaWRnZXQuYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSkKLSAgICAgIHsKLSAgICAgICAgY29uc3RyYWludHNXaWRnZXQuc2V0Q29uc3RyYWludEtpbmQoU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5FTlVNRVJBVElPTik7Ci0gICAgICAgIGNvbnN0cmFpbnRLaW5kID0gY29uc3RyYWludHNXaWRnZXQuZ2V0Q29uc3RyYWludEtpbmQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gdXNlUGF0dGVybnNCdXR0b24pCi0gICAgewotICAgICAgY29uc3RyYWludHNXaWRnZXQuYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkpCi0gICAgICB7Ci0gICAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldENvbnN0cmFpbnRLaW5kKFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuUEFUVEVSTik7Ci0gICAgICAgIGNvbnN0cmFpbnRLaW5kID0gY29uc3RyYWludHNXaWRnZXQuZ2V0Q29uc3RyYWludEtpbmQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RGYWNldFNlY3Rpb25GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERmFjZXRTZWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzU3YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RGYWNldFNlY3Rpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTREZhY2V0U2VjdGlvbkZpbHRlciBpbXBsZW1lbnRzIElGaWx0ZXIKLXsKLSAgcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpCi0gIHsKLSAgICBpZiAodG9UZXN0IGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKChYU0RGZWF0dXJlKXRvVGVzdCkuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkuZ2V0VHlwZSgpOwotICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHRvVGVzdCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXRvVGVzdDsKLSAgICAgIGlmIChzdC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwKLSAgICAgICAgICBzdC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREltcG9ydFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNESW1wb3J0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODI2M2UxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNESW1wb3J0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNESW1wb3J0U2VjdGlvbiBleHRlbmRzIFNjaGVtYUxvY2F0aW9uU2VjdGlvbgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lc3BhY2VUZXh0LCBwcmVmaXhUZXh0OwotICBwcm90ZWN0ZWQgU3RyaW5nIG9sZFByZWZpeFZhbHVlOwotCi0gIHB1YmxpYyBYU0RJbXBvcnRTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0gICAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIC8vIENyZWF0ZSBTY2hlbWEgTG9jYXRpb24gTGFiZWwKLSAgICBDTGFiZWwgbmFtZXNwYWNlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIG5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBuYW1lc3BhY2VUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lc3BhY2VUZXh0KTsKLSAgICBuYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEdW1teUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIENMYWJlbCBwcmVmaXhMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfUFJFRklYIikpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHByZWZpeExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBwcmVmaXhUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgcHJlZml4VGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhwcmVmaXhUZXh0KTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIER1bW15TGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gQ3JlYXRlIFNjaGVtYSBMb2NhdGlvbiBMYWJlbAotICAgIENMYWJlbCBzY2hlbWFMb2NhdGlvbkxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TQ0hFTUFfTE9DQVRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgc2NoZW1hTG9jYXRpb25MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gQ3JlYXRlIFNjaGVtYSBMb2NhdGlvbiBUZXh0Ci0gICAgc2NoZW1hTG9jYXRpb25UZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgc2NoZW1hTG9jYXRpb25UZXh0LnNldEVkaXRhYmxlKHRydWUpOwotICAgIGFwcGx5QWxsTGlzdGVuZXJzKHNjaGVtYUxvY2F0aW9uVGV4dCk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHNjaGVtYUxvY2F0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gQ3JlYXRlIFdpemFyZCBCdXR0b24KLSAgICB3aXphcmRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotICAgIHdpemFyZEJ1dHRvbi5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgd2l6YXJkQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgd2l6YXJkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgLy8gZXJyb3IgdGV4dAotICAgIGVycm9yVGV4dCA9IG5ldyBTdHlsZWRUZXh0KGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIGVycm9yVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgZXJyb3JUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBlcnJvclRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2NoZW1hTG9jYXRpb25UZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19JTVBPUlRfX1NDSEVNQUxPQ0FUSU9OKTsKLQotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZXNwYWNlVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fSU1QT1JUX19OQU1FU1BBQ0UpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJlZml4VGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fSU1QT1JUX19QUkVGSVgpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLSAgICBlcnJvclRleHQuc2V0VGV4dCgiIik7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgewotICAgICAgZWxlbWVudCA9ICgoWFNESW1wb3J0KSBpbnB1dCkuZ2V0RWxlbWVudCgpOwotCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgic2NoZW1hTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKSwgZmFsc2UpOwotCi0gICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNjaGVtYUxvY2F0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KG5hbWVzcGFjZSk7Ci0gICAgICBwcmVmaXhUZXh0LnNldFRleHQocHJlZml4KTsKLSAgICAgIHNjaGVtYUxvY2F0aW9uVGV4dC5zZXRUZXh0KHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgIG9sZFByZWZpeFZhbHVlID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHdpemFyZEJ1dHRvbikKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgCi0gICAgICBYU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyLnVwZGF0ZVNjaGVtYUxvY2F0aW9uKHhzZFNjaGVtYSxpbnB1dCxmYWxzZSk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgICBwcmVmaXhUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBwcmVmaXhUZXh0KQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLSAgICAgIGlmIChvbGRQcmVmaXhWYWx1ZS5lcXVhbHMobmV3UHJlZml4KSB8fCAhaXNWYWxpZFNjaGVtYUxvY2F0aW9uKQotICAgICAgICByZXR1cm47Ci0gICAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgIFN0cmluZyBrZXkgPSBwcmVmaXhUZXh0LmdldFRleHQoKTsgICAgICAKLSAgICAgIGlmIChrZXkubGVuZ3RoKCkgPT0gMCkga2V5ID0gbnVsbDsKLSAgICAgIAotICAgICAgaWYgKHZhbGlkYXRlUHJlZml4KG5ld1ByZWZpeCkgJiYgc2NoZW1hTG9jYXRpb25UZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX0xBQkVMX1BSRUZJWF9FWElTVFMiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvbGRQcmVmaXhWYWx1ZS5sZW5ndGgoKSA9PSAwKSAKLSAgICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zIik7Ci0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICBzY2hlbWFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnM6IitvbGRQcmVmaXhWYWx1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgbmV3UHJlZml4LCBuYW1lc3BhY2VUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiK29sZFByZWZpeFZhbHVlKTsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxucyIsIG5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgb2xkUHJlZml4VmFsdWUgPSBuZXdQcmVmaXg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9FUlJPUl9MQUJFTF9JTlZBTElEX1BSRUZJWCIpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhYm91dFRvQmVIaWRkZW4oKQotICB7Ci0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIHN1cGVyLmFib3V0VG9CZUhpZGRlbigpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeChTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKHByZWZpeCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNETW9kZWxHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDE2NmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNETW9kZWxHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0REaXJlY3RpdmVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxHcm91cERlZmluaXRpb25TZWN0aW9uIGV4dGVuZHMgTXVsdGlwbGljaXR5U2VjdGlvbgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87Ci0gIGJvb2xlYW4gaXNSZWZlcmVuY2U7Ci0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBpZiAoaXNSZWZlcmVuY2UpCi0gICAgewotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWYgTGFiZWwKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIENMYWJlbCByZWZMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlZkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmIENvbWJvCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQotICAgICAgY29tcG9uZW50TmFtZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvbmVudE5hbWVDb21ibywKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19NT0RFTEdST1VQX1JFRlNfX1JFRik7Ci0gICAgICAKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gbWluIHByb3BlcnR5Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAKLSAgICAJCSAgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXMuVUlfTEFCRUxfTUlOT0NDVVJTKTsKLSAgICAgIAotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQotICAgICAgbWluQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgICAgbWluQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIG1pbkNvbWJvLmFkZCgiMCIpOyAvLyROT04tTkxTLTEkCi0gICAgICBtaW5Db21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYXBwbHlBbGxMaXN0ZW5lcnMobWluQ29tYm8pOwotICAgICAgbWluQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWluQ29tYm8sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fTUlOX09DQ1VSRU5DRSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gbWF4IHByb3BlcnR5Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAKLSAgICAJCSAgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXMuVUlfTEFCRUxfTUFYT0NDVVJTKTsKLQotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQotICAgICAgbWF4Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgICAgbWF4Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIG1heENvbWJvLmFkZCgiMCIpOyAvLyROT04tTkxTLTEkCi0gICAgICBtYXhDb21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbWF4Q29tYm8uYWRkKCJ1bmJvdW5kZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYXBwbHlBbGxMaXN0ZW5lcnMobWF4Q29tYm8pOwotICAgICAgbWF4Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWF4Q29tYm8sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fTUFYX09DQ1VSRU5DRSk7Ci0gICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gTmFtZUxhYmVsCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FKTsKLSAgICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVUZXh0Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19NT0RFTEdST1VQX0RFRklOSVRJT05fX05BTUUpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZmFjdG9yL3JlbmFtZSBoeXBlcmxpbmsgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGNyZWF0ZVJlbmFtZUh5cGVybGluayhjb21wb3NpdGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBpbnB1dDsKLQotICAgIGlmIChpc1JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpOwotICAgICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KGF0dHJWYWx1ZSk7Ci0KLSAgICAgICAgLy8gcmVmcmVzaCBtaW4gbWF4Ci0gICAgICAgIGlmIChtaW5Db21ibyAhPSBudWxsICYmIG1heENvbWJvICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZWZyZXNoTWluTWF4KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHJlZnJlc2ggbmFtZQotICAgICAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICBpbml0KCk7Ci0gICAgcmVsYXlvdXQoKTsKLSAgICAKLSAgICBpZiAoaXNSZWZlcmVuY2UpCi0gICAgewotICAgICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgICBMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgaXRlbXMgPSBoZWxwZXIuZ2V0TW9kZWxHcm91cHMoKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBncm91cCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IGdyb3VwLmdldENvbnRhaW5lcigpOwotICAgICAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbXMucmVtb3ZlKCgoWFNETW9kZWxHcm91cERlZmluaXRpb24pcGFyZW50KS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGl0ZW1zLmFkZCgwLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRJdGVtcygoU3RyaW5nIFtdKWl0ZW1zLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGlucHV0OwotICAgICAgaXNSZWZlcmVuY2UgPSBncm91cC5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVsYXlvdXQoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KGZhbHNlKTsKLQotICAgIGlmIChwYXJlbnRDb21wb3NpdGUgIT0gbnVsbCAmJiAhcGFyZW50Q29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgbmV3IGhhbmRsZXIKLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnRDb21wb3NpdGUpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLSAgICAvLyBOb3cgdHVybiBwYWludGluZyBiYWNrIG9uCi0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBpbnB1dDsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNlY3Rpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgYW4gYWN0dWFsIG5hbWUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZQotICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVOQU1FLCBuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICAvLyBkb1JlZmVyZW50aWFsSW50ZWdyaXR5Q2hlY2sobmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNlY3Rpb24oKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ID09IG51bGwgfHwgbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBhZ2FpbnN0IE5DTmFtZQotICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMSB8fCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9OQU1FKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KWlucHV0OwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKG5hbWVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotICAgICAgICAgIFhTRERpcmVjdGl2ZXNNYW5hZ2VyLnJlbW92ZVVudXNlZFhTREltcG9ydHMobmFtZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLmRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ICE9IG51bGwgJiYgIW5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJlbW92ZUxpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRE1vZGVsR3JvdXBTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTVmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RNb2RlbEdyb3VwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUNvbnRlbnRNb2RlbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRE1vZGVsR3JvdXBTZWN0aW9uIGV4dGVuZHMgTXVsdGlwbGljaXR5U2VjdGlvbgotewotICBwcm90ZWN0ZWQgQ0NvbWJvIG1vZGVsR3JvdXBDb21ibzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBtb2RlbEdyb3VwQ29tYm9WYWx1ZXMgPSB7ICJzZXF1ZW5jZSIsICJjaG9pY2UiLCAiYWxsIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0gIHB1YmxpYyBYU0RNb2RlbEdyb3VwU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOYW1lTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9LSU5EKTsKLSAgICBuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVUZXh0Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBtb2RlbEdyb3VwQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1vZGVsR3JvdXBDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG1vZGVsR3JvdXBDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBtb2RlbEdyb3VwQ29tYm8uc2V0SXRlbXMobW9kZWxHcm91cENvbWJvVmFsdWVzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1vZGVsR3JvdXBDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fS0lORCk7Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIG1pbiBwcm9wZXJ0eQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9NSU5PQ0NVUlMpOwotICAgIAotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBtaW5Db21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgbWluQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtaW5Db21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1pbkNvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobWluQ29tYm8pOwotICAgIG1pbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWluQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX01PREVMR1JPVVBfX01JTl9PQ0NVUkVOQ0UpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWF4IHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX01BWE9DQ1VSUyk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgbWF4Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1heENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWF4Q29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXhDb21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1heENvbWJvLmFkZCgidW5ib3VuZGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhcHBseUFsbExpc3RlbmVycyhtYXhDb21ibyk7Ci0gICAgbWF4Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtYXhDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fTUFYX09DQ1VSRU5DRSk7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0KLSAgICBpZiAoaXNSZWFkT25seSkKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb21wb3NpdGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cCBwYXJ0aWNsZSA9IChYU0RNb2RlbEdyb3VwKWlucHV0OwotICAgICAgICBTdHJpbmcgbW9kZWxUeXBlID0gcGFydGljbGUuZ2V0Q29tcG9zaXRvcigpLmdldE5hbWUoKTsKLSAgICAgICAgbW9kZWxHcm91cENvbWJvLnNldFRleHQobW9kZWxUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIG1pbkNvbWJvLnNldEVuYWJsZWQoIShwYXJ0aWNsZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikpOwotICAgICAgICBtYXhDb21iby5zZXRFbmFibGVkKCEocGFydGljbGUuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmVmcmVzaE1pbk1heCgpOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwIHBhcnRpY2xlID0gKFhTRE1vZGVsR3JvdXApaW5wdXQ7Ci0gICAgaWYgKGUud2lkZ2V0ID09IG1vZGVsR3JvdXBDb21ibykKLSAgICB7Ci0gICAgICBYU0RDb21wb3NpdG9yIG5ld1ZhbHVlID0gWFNEQ29tcG9zaXRvci5nZXQobW9kZWxHcm91cENvbWJvLmdldFRleHQoKSk7Ci0gICAgICBVcGRhdGVDb250ZW50TW9kZWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQ29udGVudE1vZGVsQ29tbWFuZChvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0hBTkdFX0NPTlRFTlRfTU9ERUwsIHBhcnRpY2xlLCBuZXdWYWx1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChtaW5Db21ibyAhPSBudWxsICYmICFtaW5Db21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtaW5Db21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBpZiAobWF4Q29tYm8gIT0gbnVsbCAmJiAhbWF4Q29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgbWF4Q29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNjaGVtYVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2NoZW1hU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2NkY2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2NoZW1hU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCSAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuVGV4dFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLlhTREVkaXROYW1lc3BhY2VzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQuVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIElXb3JrYmVuY2hQYXJ0IHBhcnQ7Ci0gIFRleHQgcHJlZml4VGV4dDsKLSAgVGV4dCB0YXJnZXROYW1lc3BhY2VUZXh0OwotICBCdXR0b24gZWRpdEJ1dHRvbjsKLSAgU3R5bGVkVGV4dCBlcnJvclRleHQ7Ci0gIENvbG9yIHJlZDsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotICAgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICAvLyBDcmVhdGUgUHJlZml4IExhYmVsCi0gICAgQ0xhYmVsIHByZWZpeExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TQ0hFTUFfUFJFRklYIikpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgcHJlZml4TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIENyZWF0ZSBQcmVmaXggVGV4dAotICAgIHByZWZpeFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhwcmVmaXhUZXh0KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByZWZpeFRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fU0NIRU1BX19QUkVGSVgpOwotCi0gICAgLy8gQ3JlYXRlIFRhcmdldE5hbWVzcGFjZSBMYWJlbAotICAgIENMYWJlbCB0YXJnZXROYW1lc3BhY2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfVEFSR0VUX05BTUVfU1BBQ0UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgdGFyZ2V0TmFtZXNwYWNlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIENyZWF0ZSBUYXJnZXROYW1lc3BhY2UgVGV4dAotICAgIHRhcmdldE5hbWVzcGFjZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHRhcmdldE5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyh0YXJnZXROYW1lc3BhY2VUZXh0KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRhcmdldE5hbWVzcGFjZVRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fU0NIRU1BX19UQVJHRVROQU1FU1BBQ0UpOwotCi0gICAgLy8gQWR2YW5jZWQgQnV0dG9uCi0gICAgZWRpdEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU0VDVElPTl9BRFZBTkNFRF9BVFRSSUJVVEVTIikgKyAiLi4uIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBlZGl0QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGVkaXRCdXR0b24sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fU0NIRU1BX19BRFZBTkNFRCk7Ci0KLSAgICAvLyBlcnJvciB0ZXh0Ci0gICAgZXJyb3JUZXh0ID0gbmV3IFN0eWxlZFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZXJyb3JUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBlcnJvclRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBlcnJvclRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCi0gICAgRWxlbWVudCBlbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLQotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgLy8gSGFuZGxlIHByZWZpeFRleHQKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgU3RyaW5nIGFQcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKSwgZmFsc2UpOwotCi0gICAgICBpZiAoYVByZWZpeCAhPSBudWxsICYmIGFQcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBwcmVmaXhUZXh0LnNldFRleHQoYVByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZpeFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgLy8gSGFuZGxlIFRhcmdldE5hbWVzcGFjZVRleHQKLSAgICAgIFN0cmluZyB0bnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgICBpZiAodG5zICE9IG51bGwgJiYgdG5zLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByb2Nlc3NlZFN0cmluZyA9IFRleHRQcm9jZXNzb3IucHJvY2Vzcyh0bnMpOwotICAgICAgICB0YXJnZXROYW1lc3BhY2VUZXh0LnNldFRleHQocHJvY2Vzc2VkU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBlcnJvclRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgcHJlZml4VmFsdWUgPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLSAgICBTdHJpbmcgdG5zVmFsdWUgPSB0YXJnZXROYW1lc3BhY2VUZXh0LmdldFRleHQoKTsKLQotICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgU3RyaW5nIGN1cnJlbnRQcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKSwgZmFsc2UpOwotICAgIFN0cmluZyBjdXJyZW50TmFtZXNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIAotICAgIGlmICh0bnNWYWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAocHJlZml4VmFsdWUudHJpbSgpLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZXJyb3JUZXh0LnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX1RBUkdFVF9OQU1FU1BBQ0VfQU5EX1BSRUZJWCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbnQgbGVuZ3RoID0gZXJyb3JUZXh0LmdldFRleHQoKS5sZW5ndGgoKTsKLSAgICAgICAgcmVkID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMCwgMCk7Ci0gICAgICAgIFN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZSgwLCBsZW5ndGgsIHJlZCwgdGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICBlcnJvclRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHByZWZpeFRleHQpCi0gICAgewotICAgICAgLy8gSWYgdGhlIHByZWZpeCBpcyB0aGUgc2FtZSwganVzdCByZXR1cm4uICAgVGhpcyBtYXkgaGFwcGVuIGlmIHRoZQotICAgICAgLy8gd2lkZ2V0IGxvc2VzIGZvY3VzLgotICAgICAgaWYgKHByZWZpeFZhbHVlLmVxdWFscyhjdXJyZW50UHJlZml4KSkgCi0gICAgICAgIHJldHVybjsKLSAgICAgIHVwZGF0ZU5hbWVzcGFjZUluZm8ocHJlZml4VmFsdWUsIHRuc1ZhbHVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHRhcmdldE5hbWVzcGFjZVRleHQpCi0gICAgewotICAgICAgLy8gSWYgdGhlIG5zIGlzIHRoZSBzYW1lLCBqdXN0IHJldHVybi4gICBUaGlzIG1heSBoYXBwZW4gaWYgdGhlCi0gICAgICAvLyB3aWRnZXQgbG9zZXMgZm9jdXMuCi0gICAgICBpZiAodG5zVmFsdWUuZXF1YWxzKGN1cnJlbnROYW1lc3BhY2UpKSAKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotICAgICAgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUluZm9NYW5hZ2VyLmdldE5hbWVzcGFjZUluZm9MaXN0KHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotCi0gICAgICBFbGVtZW50IHhzZFNjaGVtYUVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIHhzZFNjaGVtYUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX05BTUVTUEFDRV9DSEFOR0UiKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAodG5zVmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDAgKSAvL3JlbW92ZSB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2NoZW1hRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyByZXBsYWNlIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSB4bWxucyBlbnRyeQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGluZm8udXJpLmVxdWFscyhjdXJyZW50TmFtZXNwYWNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvLnVyaSA9IHRuc1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHhzZFNjaGVtYS5zZXRJbmNyZW1lbnRhbFVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIC8vIHNldCB0aGUgbmV3IHhtbG5zIGVudHJpZXMKLSAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLSAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhlbGVtZW50LCBuYW1lc3BhY2VJbmZvTGlzdCwgZmFsc2UpOwotICAgICAgICB4c2RTY2hlbWEuc2V0SW5jcmVtZW50YWxVcGRhdGUodHJ1ZSk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlCi0gICAgICAgIHhzZFNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2UodG5zVmFsdWUpOwotICAgICAgICAKLSAgICAgICAgVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciB0YXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIoeHNkU2NoZW1hLCBjdXJyZW50TmFtZXNwYWNlLCB0bnNWYWx1ZSk7Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIucmVzb2x2ZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotCi0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBlZGl0QnV0dG9uKQotICAgIHsKLSAgICAgIFhTREVkaXROYW1lc3BhY2VzQWN0aW9uIG5zQWN0aW9uID0gbmV3IFhTREVkaXROYW1lc3BhY2VzQWN0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fRURJVF9OQU1FU1BBQ0VTIiksIHhzZFNjaGVtYS5nZXRFbGVtZW50KCksIG51bGwsIHhzZFNjaGVtYSk7IC8vJE5PTi1OTFMtMSQgCi0gICAgICBuc0FjdGlvbi5ydW4oKTsKLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTmFtZXNwYWNlSW5mbyhTdHJpbmcgbmV3UHJlZml4LCBTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkFNRVNQQUNFX0lORk9STUFUSU9OX0NIQU5HRSwgeHNkU2NoZW1hLCBuZXdQcmVmaXgsIG5ld1RhcmdldE5hbWVzcGFjZSk7Ci0gICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKHByZWZpeFRleHQgIT0gbnVsbCAmJiAhcHJlZml4VGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMocHJlZml4VGV4dCk7Ci0gICAgaWYgKHRhcmdldE5hbWVzcGFjZVRleHQgIT0gbnVsbCAmJiAhdGFyZ2V0TmFtZXNwYWNlVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnModGFyZ2V0TmFtZXNwYWNlVGV4dCk7Ci0gICAgCi0gICAgaWYgKHJlZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlZC5kaXNwb3NlKCk7Ci0gICAgICByZWQgPSBudWxsOwotICAgIH0KLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RTaW1wbGVUeXBlQWR2YW5jZWRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNpbXBsZVR5cGVBZHZhbmNlZFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwZTRhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNpbXBsZVR5cGVBZHZhbmNlZFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVHlwZUFkdmFuY2VkU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiIjsgLy8kTk9OLU5MUy0xJAkJCi0gIHByaXZhdGUgU3RyaW5nIGZpbmFsVmFsdWVzW10gPSB7IEVNUFRZLCAiIyIgKyBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCAgLy8kTk9OLU5MUy0xJAotCSAgICAgIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIAotCSAgICAgIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBR307Ci0gIAotICBDQ29tYm8gZmluYWxDb21ibzsKLSAgCi0gIHB1YmxpYyBYU0RTaW1wbGVUeXBlQWR2YW5jZWRTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSA9IGdldFdpZGdldEZhY3RvcnkoKTsKLSAgICBjb21wb3NpdGUgPSBmYWN0b3J5LmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRmluYWxMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgZmluYWxMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfRklOQUwgKyAiOiIpOwotICAgIGZpbmFsTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEZpbmFsQ29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGZpbmFsQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgZmluYWxDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGZpbmFsQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgZmluYWxDb21iby5zZXRJdGVtcyhmaW5hbFZhbHVlcyk7Ci0gICAgZmluYWxDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIGZpbmFsQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQpOyAKLSAgICAKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLQotICAgICAgU3RyaW5nIGZpbmFsQXR0VmFsdWUgPSBzaW1wbGVUeXBlLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJTkFMX0FUVFJJQlVURSk7Ci0gICAgICBpZiAoZmluYWxBdHRWYWx1ZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmaW5hbENvbWJvLnNldFRleHQoZmluYWxBdHRWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpbmFsQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBmaW5hbENvbWJvICYmIGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbmFsQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFLCB2YWx1ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0ZJTkFMKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNpbXBsZVR5cGVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNpbXBsZVR5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZWY2YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RTaW1wbGVUeXBlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuQ3JlYXRlRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuRE9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1R5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaC5YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVUeXBlU2VjdGlvbiBleHRlbmRzIFJlZmFjdG9yaW5nU2VjdGlvbgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLSAgQ0NvbWJvIHZhcmlldHlDb21ibzsKLSAgQ0NvbWJvIHR5cGVzQ29tYm87Ci0gIENMYWJlbCB0eXBlc0xhYmVsOwotCi0gIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIG1lbWJlclR5cGVEZWZpbml0aW9uLCBpdGVtVHlwZURlZmluaXRpb24sIGJhc2VUeXBlRGVmaW5pdGlvbjsKLQotICBwdWJsaWMgWFNEU2ltcGxlVHlwZVNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotICAgIGNvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOYW1lTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIENMYWJlbCBuYW1lTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FKTsKLSAgICBuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVUZXh0Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBuYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fU0lNUExFX1RZUEVfX05BTUUpOwotICAgIAotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUmVmYWN0b3IvcmVuYW1lIGh5cGVybGluayAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoY29tcG9zaXRlKTsKLQotICAgIC8vIFZhcmlldHkgTGFiZWwKLSAgICBDTGFiZWwgbGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1ZBUklFVFkiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFZhcmlldHkgQ29tYm8KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHZhcmlldHlDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIExpc3QgbGlzdCA9IFhTRFZhcmlldHkuVkFMVUVTOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHZhcmlldHlDb21iby5hZGQoKChYU0RWYXJpZXR5KSBpdGVyLm5leHQoKSkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgdmFyaWV0eUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHZhcmlldHlDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodmFyaWV0eUNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19TSU1QTEVfVFlQRV9fVkFSSUVUWSk7Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIER1bW15TGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBUeXBlcyBMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHR5cGVzTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBUeXBlcyBDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHR5cGVzQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgdHlwZXNDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgdHlwZXNDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHR5cGVzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHR5cGVzQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHR5cGVzQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX1NJTVBMRV9UWVBFX19CQVNFX1RZUEUpOwotCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICByZWxheW91dCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVsYXlvdXQoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KGZhbHNlKTsKLQotICAgIGlmIChwYXJlbnRDb21wb3NpdGUgIT0gbnVsbCAmJiAhcGFyZW50Q29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBDb250cm9sW10gY2hpbGRyZW4gPSBwYXJlbnRDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgaW5pdGlhbGl6ZSB0aGUgbmV3IGhhbmRsZXIKLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnRDb21wb3NpdGUpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLSAgICAvLyBOb3cgdHVybiBwYWludGluZyBiYWNrIG9uCi0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLSAgICBuYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHZhcmlldHlDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHR5cGVzQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBmaWxsVHlwZXNDb21ibygpOwotICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfQkFTRV9UWVBFX1dJVEhfQ09MT04iKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIFN0cmluZyBzaW1wbGVUeXBlTmFtZSA9IHN0LmdldE5hbWUoKTsKLSAgICAgIGlmIChzaW1wbGVUeXBlTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KHNpbXBsZVR5cGVOYW1lKTsKLSAgICAgICAgbmFtZVRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5hbWVUZXh0LnNldFRleHQoIioqYW5vbnltb3VzKioiKTsgLy8kTk9OLU5MUy0xJCk7Ci0gICAgICAgIG5hbWVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RyaW5nIHZhcmlldHkgPSBzdC5nZXRWYXJpZXR5KCkuZ2V0TmFtZSgpOwotICAgICAgaW50IGludFZhcmlldHkgPSBzdC5nZXRWYXJpZXR5KCkuZ2V0VmFsdWUoKTsKLQotICAgICAgaWYgKHZhcmlldHkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmFyaWV0eUNvbWJvLnNldFRleHQodmFyaWV0eSk7Ci0gICAgICAgIGlmIChpbnRWYXJpZXR5ID09IFhTRFZhcmlldHkuQVRPTUlDKQotICAgICAgICB7Ci0gICAgICAgICAgYmFzZVR5cGVEZWZpbml0aW9uID0gc3QuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChiYXNlVHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lID0gYmFzZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIG5hbWUgPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdHlwZXNDb21iby5zZXRUZXh0KG5hbWUpOwotICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfQkFTRV9UWVBFX1dJVEhfQ09MT04iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpbnRWYXJpZXR5ID09IFhTRFZhcmlldHkuTElTVCkKLSAgICAgICAgewotICAgICAgICAgIGl0ZW1UeXBlRGVmaW5pdGlvbiA9IHN0LmdldEl0ZW1UeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoaXRlbVR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZSA9IGl0ZW1UeXBlRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSBuYW1lID0gIiI7Ci0gICAgICAgICAgfQotICAgICAgICAgIHR5cGVzQ29tYm8uc2V0VGV4dChuYW1lKTsKLSAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0lURU1fVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGludFZhcmlldHkgPT0gWFNEVmFyaWV0eS5VTklPTikKLSAgICAgICAgewotICAgICAgICAgIExpc3QgbWVtYmVyVHlwZXNMaXN0ID0gc3QuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1lbWJlclR5cGVzTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZU9iamVjdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHR5cGVPYmplY3QuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgICAgaWYgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBTdHJpbmcgbWVtYmVyVHlwZXMgPSBzYi50b1N0cmluZygpOwotICAgICAgICAgIHR5cGVzQ29tYm8uc2V0VGV4dChtZW1iZXJUeXBlcyk7Ci0gICAgICAgICAgdHlwZXNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9NRU1CRVJUWVBFUyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IHR5cGVzQ29tYm8pCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoZWRpdG9yID09IG51bGwpIHJldHVybjsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyLmNsYXNzKTsgICAgCi0KLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSB0eXBlc0NvbWJvLmdldFRleHQoKTsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZz0gbnVsbDsKLSAgICAgIGlmICggc2VsZWN0aW9uLmVxdWFscyhvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICAgICgoWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKSBkaWFsb2cpLnNob3dDb21wbGV4VHlwZXMoZmFsc2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldE5ld0RpYWxvZygpOwotICAgICAgICAoKE5ld1R5cGVEaWFsb2cpIGRpYWxvZykuYWxsb3dDb21wbGV4VHlwZShmYWxzZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vdXNlIHRoZSB2YWx1ZSBmcm9tIHNlbGVjdGVkIHF1aWNrUGljayBpdGVtCi0gICAgICB7Ci0gICAgICAgIG5ld1ZhbHVlID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShzZWxlY3Rpb24sIG1hbmFnZXIpOwotICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSB2YXJpZXR5Q29tYm8pCi0gICAgewotICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgICAgIEVsZW1lbnQgcGFyZW50ID0gc3QuZ2V0RWxlbWVudCgpOwotCi0gICAgICAgICAgU3RyaW5nIHZhcmlldHkgPSB2YXJpZXR5Q29tYm8uZ2V0VGV4dCgpOwotICAgICAgICAgIGlmICh2YXJpZXR5LmVxdWFscyhYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMLmdldE5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZXNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEVfV0lUSF9DT0xPTiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3Quc2V0VmFyaWV0eShYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfUkVTVFJJQ1RJT04iKSwgcGFyZW50LCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh2YXJpZXR5LmVxdWFscyhYU0RWYXJpZXR5LlVOSU9OX0xJVEVSQUwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzdC5zZXRWYXJpZXR5KFhTRFZhcmlldHkuVU5JT05fTElURVJBTCk7Ci0gICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1VOSU9OIiksIHBhcmVudCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAodmFyaWV0eS5lcXVhbHMoWFNEVmFyaWV0eS5MSVNUX0xJVEVSQUwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0lURU1fVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgc3Quc2V0VmFyaWV0eShYU0RWYXJpZXR5LkxJU1RfTElURVJBTCk7Ci0gICAgICAgICAgICBhZGRDcmVhdGVFbGVtZW50QWN0aW9uSWZOb3RFeGlzdChYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfTElTVCIpLCBwYXJlbnQsIG51bGwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotLy8gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gYnV0dG9uKQotLy8gICAgewotLy8gICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0vLyAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpIGlucHV0KS5nZXRFbGVtZW50KCk7Ci0vLyAgICAgIERpYWxvZyBkaWFsb2cgPSBudWxsOwotLy8gICAgICBTdHJpbmcgcHJvcGVydHkgPSAiIjsKLS8vICAgICAgRWxlbWVudCBzZWNvbmRhcnlFbGVtZW50ID0gbnVsbDsKLQotLy8gICAgICBJRmlsZSBjdXJyZW50SUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgIAotICAgICAgLy8gaXNzdWUgKGNzKSBuZWVkIHRvIG1vdmUgdG8gY29tbW9uLnVpJ3Mgc2VsZWN0aW9uIGRpYWxvZwotLyoKLSAgICAgIFhTRENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFhTRENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyKGN1cnJlbnRJRmlsZSwgeHNkU2NoZW1hKTsKLSAgICAgIGRpYWxvZyA9IG5ldyBYU0RDb21wb25lbnRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TRVRfVFlQRSIpLCBwcm92aWRlcik7Ci0gICAgICBwcm92aWRlci5zZXREaWFsb2coKFhTRENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZykgZGlhbG9nKTsKLSovCi0vLyAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotLy8gICAgICAgIEVsZW1lbnQgc2ltcGxlVHlwZUVsZW1lbnQgPSBzdC5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgaWYgKHN0LmdldFZhcmlldHkoKSA9PSBYU0RWYXJpZXR5LkxJU1RfTElURVJBTCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBFbGVtZW50IGxpc3RFbGVtZW50ID0gKEVsZW1lbnQpIGl0ZW1UeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICAvLyBkaWFsb2cgPSBuZXcgVHlwZXNEaWFsb2coc2hlbGwsIGxpc3RFbGVtZW50LAotLy8gICAgICAgICAgLy8gWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSwgeHNkU2NoZW1hKTsKLS8vICAgICAgICAgIC8vIGRpYWxvZy5zaG93Q29tcGxleFR5cGVzID0gZmFsc2U7Ci0vLyAgICAgICAgICBwcm92aWRlci5zaG93Q29tcGxleFR5cGVzKGZhbHNlKTsKLS8vCi0vLyAgICAgICAgICBzZWNvbmRhcnlFbGVtZW50ID0gbGlzdEVsZW1lbnQ7Ci0vLyAgICAgICAgICBwcm9wZXJ0eSA9IFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEU7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UgaWYgKHN0LmdldFZhcmlldHkoKSA9PSBYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5RWxlbWVudCA9IChFbGVtZW50KSBiYXNlVHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpOwotLy8gICAgICAgICAgaWYgKGRlcml2ZWRCeUVsZW1lbnQgIT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgLy8gZGlhbG9nID0gbmV3IFR5cGVzRGlhbG9nKHNoZWxsLCBkZXJpdmVkQnlFbGVtZW50LAotLy8gICAgICAgICAgICAvLyBYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIHhzZFNjaGVtYSk7Ci0vLyAgICAgICAgICAgIC8vIGRpYWxvZy5zaG93Q29tcGxleFR5cGVzID0gZmFsc2U7Ci0vLyAgICAgICAgICAgIHByb3ZpZGVyLnNob3dDb21wbGV4VHlwZXMoZmFsc2UpOwotLy8KLS8vICAgICAgICAgICAgc2Vjb25kYXJ5RWxlbWVudCA9IGRlcml2ZWRCeUVsZW1lbnQ7Ci0vLyAgICAgICAgICAgIHByb3BlcnR5ID0gWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICByZXR1cm47Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmIChzdC5nZXRWYXJpZXR5KCkgPT0gWFNEVmFyaWV0eS5VTklPTl9MSVRFUkFMKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFNpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nIHVuaW9uRGlhbG9nID0gbmV3IFNpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nKHNoZWxsLCBzdCk7Ci0vLyAgICAgICAgICB1bmlvbkRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLS8vICAgICAgICAgIHVuaW9uRGlhbG9nLmNyZWF0ZSgpOwotLy8KLS8vICAgICAgICAgIGludCByZXN1bHQgPSB1bmlvbkRpYWxvZy5vcGVuKCk7Ci0vLyAgICAgICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gdW5pb25EaWFsb2cuZ2V0UmVzdWx0KCk7Ci0vLyAgICAgICAgICAgIC8vIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9NRU1CRVJUWVBFU19DSEFOR0UiKSwKLS8vICAgICAgICAgICAgLy8gZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLS8vICAgICAgICAgICAgRWxlbWVudCB1bmlvbkVsZW1lbnQgPSBtZW1iZXJUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICAgIHVuaW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotLy8KLS8vICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHVuaW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSwgbmV3VmFsdWUpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHVuaW9uRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgLy8gZW5kUmVjb3JkaW5nKHVuaW9uRWxlbWVudCk7Ci0vLyAgICAgICAgICAgIHJlZnJlc2goKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIHJldHVybjsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHByb3BlcnR5ID0gInR5cGUiOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgIHsKLS8vICAgICAgICBwcm9wZXJ0eSA9ICJ0eXBlIjsKLS8vICAgICAgfQotICAgICAgLy8gYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RZUEVfQ0hBTkdFIiksCi0gICAgICAvLyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotLy8gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0vLyAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLS8vICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0vLwotLy8gICAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLS8vICAgICAgewotLy8gICAgICAgIGlmIChzZWNvbmRhcnlFbGVtZW50ID09IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgc2Vjb25kYXJ5RWxlbWVudCA9IGVsZW1lbnQ7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIFhTRFNldFR5cGVIZWxwZXIgaGVscGVyID0gbmV3IFhTRFNldFR5cGVIZWxwZXIoY3VycmVudElGaWxlLCB4c2RTY2hlbWEpOwotLy8gICAgICAgIGhlbHBlci5zZXRUeXBlKHNlY29uZGFyeUVsZW1lbnQsIHByb3BlcnR5LCAoKFhTRENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZykgZGlhbG9nKS5nZXRTZWxlY3Rpb24oKSk7Ci0KLS8vICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0vLyAgICAgICAgc3Quc2V0RWxlbWVudChlbGVtZW50KTsKLS8vICAgICAgICB1cGRhdGVTaW1wbGVUeXBlRmFjZXRzKCk7Ki8KLS8vICAgICAgfQotICAgICAgLy8gZW5kUmVjb3JkaW5nKGVsZW1lbnQpOwotLy8gICAgfSAgCi0vLyAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIGlzc3VlIChjcykgdGhpcyBtZXRob2Qgc2VlbXMgdG8gYmUgdXRpbGl6aW5nICdvbGQnIGNsYXNzZXMsIGNhbiB3ZSByZWltcGxlbWVudD8KLSAgLy8gKGUuZy4gQ2hhbmdlRWxlbWVudEFjdGlvbiwgWFNERE9NSGVscGVyLCBldGMpCi0gIHByb3RlY3RlZCBib29sZWFuIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIEVsZW1lbnQgcGFyZW50LCBOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICBMaXN0IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIHJldXNlVHlwZSA9IG51bGw7Ci0KLSAgICAvLyBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfVkFSSUVUWV9DSEFOR0UiKSwKLSAgICAvLyBwYXJlbnQpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGVsZW1lbnRUYWcuZXF1YWxzKFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgRWxlbWVudCBsaXN0Tm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgaWYgKGxpc3ROb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IGxpc3ROb2RlLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFKTsKLSAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKGxpc3ROb2RlKTsKLSAgICAgIH0KLQotICAgICAgRWxlbWVudCB1bmlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAodW5pb25Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBtZW1iZXJBdHRyID0gdW5pb25Ob2RlLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKG1lbWJlckF0dHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1lbWJlckF0dHIpOwotICAgICAgICAgIHJldXNlVHlwZSA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UodW5pb25Ob2RlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHJldXNlVHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXVzZVR5cGUgPSBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKTsKLSAgICAgIH0KLSAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFLCByZXVzZVR5cGUpKTsKLSAgICAgIHN0LnNldEl0ZW1UeXBlRGVmaW5pdGlvbihudWxsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudFRhZy5lcXVhbHMoWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcmVzdHJpY3Rpb25Ob2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgaWYgKHJlc3RyaWN0aW9uTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXVzZVR5cGUgPSByZXN0cmljdGlvbk5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSk7Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShyZXN0cmljdGlvbk5vZGUpOwotICAgICAgfQotICAgICAgRWxlbWVudCB1bmlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAodW5pb25Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBtZW1iZXJBdHRyID0gdW5pb25Ob2RlLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKG1lbWJlckF0dHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1lbWJlckF0dHIpOwotICAgICAgICAgIHJldXNlVHlwZSA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UodW5pb25Ob2RlKTsKLSAgICAgIH0KLSAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSwgcmV1c2VUeXBlKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVsZW1lbnRUYWcuZXF1YWxzKFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgRWxlbWVudCBsaXN0Tm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgaWYgKGxpc3ROb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IGxpc3ROb2RlLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFKTsKLSAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKGxpc3ROb2RlKTsKLSAgICAgIH0KLSAgICAgIEVsZW1lbnQgcmVzdHJpY3Rpb25Ob2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpOwotICAgICAgaWYgKHJlc3RyaWN0aW9uTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXVzZVR5cGUgPSByZXN0cmljdGlvbk5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSk7Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShyZXN0cmljdGlvbk5vZGUpOwotICAgICAgfQotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFLCByZXVzZVR5cGUpKTsKLSAgICAgIHN0LnNldEl0ZW1UeXBlRGVmaW5pdGlvbihudWxsKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIGVsZW1lbnRUYWcsIGZhbHNlKSA9PSBudWxsKQotICAgIHsKLSAgICAgIEFjdGlvbiBhY3Rpb24gPSBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKGVsZW1lbnRUYWcsIGxhYmVsLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgfQotCi0gICAgc3Quc2V0RWxlbWVudChwYXJlbnQpOwotICAgIHN0LnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAvLyBlbmRSZWNvcmRpbmcocGFyZW50KTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBBY3Rpb24gYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihTdHJpbmcgZWxlbWVudFRhZywgU3RyaW5nIGxhYmVsLCBMaXN0IGF0dHJpYnV0ZXMsIEVsZW1lbnQgcGFyZW50LCBOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIENyZWF0ZUVsZW1lbnRBY3Rpb24gYWN0aW9uID0gbmV3IENyZWF0ZUVsZW1lbnRBY3Rpb24obGFiZWwpOwotICAgIGFjdGlvbi5zZXRFbGVtZW50VGFnKGVsZW1lbnRUYWcpOwotICAgIGFjdGlvbi5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotICAgIGFjdGlvbi5zZXRQYXJlbnROb2RlKHBhcmVudCk7Ci0gICAgYWN0aW9uLnNldFJlbGF0aXZlTm9kZShyZWxhdGl2ZU5vZGUpOwotICAgIHJldHVybiBhY3Rpb247Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKE5vZGUgcGFyZW50LCBTdHJpbmcgZWxlbWVudFRhZywgYm9vbGVhbiBpc1JlZikKLSAgewotICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBFbGVtZW50IHRhcmdldE5vZGUgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLSAgICAgIGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjaGlsZCwgZWxlbWVudFRhZywgaXNSZWYpKQotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0Tm9kZSA9IChFbGVtZW50KSBjaGlsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdGFyZ2V0Tm9kZTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVpbHRJblN0cmluZ1FOYW1lKCkKLSAgewotICAgIFN0cmluZyBzdHJpbmdOYW1lID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2NoZW1hRm9yU2NoZW1hUHJlZml4ID0geHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCk7Ci0gICAgICBpZiAoc2NoZW1hRm9yU2NoZW1hUHJlZml4ICE9IG51bGwgJiYgc2NoZW1hRm9yU2NoZW1hUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpOwotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZ05hbWUgPSBwcmVmaXggKyAiOiIgKyBzdHJpbmdOYW1lOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZ05hbWU7Ci0gIH0KLQotLy8gIHByaXZhdGUgdm9pZCB1cGRhdGVTaW1wbGVUeXBlRmFjZXRzKCkKLS8vICB7Ci0vLyAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0vLyAgICBFbGVtZW50IHNpbXBsZVR5cGVFbGVtZW50ID0gc3QuZ2V0RWxlbWVudCgpOwotLy8gICAgRWxlbWVudCBkZXJpdmVkQnlFbGVtZW50ID0gYmFzZVR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLS8vICAgIGlmIChkZXJpdmVkQnlFbGVtZW50ICE9IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIExpc3Qgbm9kZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgTm9kZUxpc3QgY2hpbGRMaXN0ID0gZGVyaXZlZEJ5RWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0vLyAgICAgIGludCBsZW5ndGggPSBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7Ci0vLyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0vLyAgICAgIHsKLS8vICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRMaXN0Lml0ZW0oaSk7Ci0vLyAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBFbGVtZW50IGVsZW1lbnRDaGlsZCA9IChFbGVtZW50KSBjaGlsZDsKLS8vICAgICAgICAgIGlmICghKGVsZW1lbnRDaGlsZC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoInBhdHRlcm4iKSB8fCBlbGVtZW50Q2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJlbnVtZXJhdGlvbiIpIHx8IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8gICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50Q2hpbGQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnRDaGlsZCwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKQotLy8gICAgICAgICAgICAgIHx8IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50Q2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fCBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudENoaWxkLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCB0cnVlKQotLy8gICAgICAgICAgICAgIHx8IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50Q2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50Q2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgdHJ1ZSkgfHwgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnRDaGlsZCwKLS8vICAgICAgICAgICAgICBYU0RDb25zdGFudHMuQU5ZQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBmYWxzZSkpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBub2Rlc1RvUmVtb3ZlLmFkZChjaGlsZCk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBub2Rlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7Ci0vLyAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLS8vICAgICAgewotLy8gICAgICAgIEVsZW1lbnQgZmFjZXRUb1JlbW92ZSA9IChFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vICAgICAgICBTdHJpbmcgZmFjZXROYW1lID0gZmFjZXRUb1JlbW92ZS5nZXRMb2NhbE5hbWUoKTsKLS8vICAgICAgICBJdGVyYXRvciBpdCA9IHN0LmdldFZhbGlkRmFjZXRzKCkuaXRlcmF0b3IoKTsKLS8vICAgICAgICBib29sZWFuIGRvUmVtb3ZlID0gdHJ1ZTsKLS8vICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFN0cmluZyBhVmFsaWRGYWNldCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLS8vICAgICAgICAgIGlmIChhVmFsaWRGYWNldC5lcXVhbHMoZmFjZXROYW1lKSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgZG9SZW1vdmUgPSBmYWxzZTsKLS8vICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmIChkb1JlbW92ZSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoZmFjZXRUb1JlbW92ZSk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8vIFRPRE86IENvbW1vbiB0aGlzIHVwIHdpdGggZWxlbWVudCBkZWNsYXJhdGlvbgotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSAKLSAgewotICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpCi0gICAgewotICAgICAgaWYgKCFuYW1lVGV4dC5nZXRFZGl0YWJsZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpaW5wdXQ7Ci0gICAgICAgIGlmICghdmFsaWRhdGVTZWN0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGFuIGFjdHVhbCBuYW1lIGNoYW5nZSBoYXMgdGFrZW4gcGxhY2UKLSAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmICghbmV3VmFsdWUuZXF1YWxzKG9sZE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1JFTkFNRSwgbmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwgJiYgZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTZWN0aW9uKCkKLSAgewotICAgIGlmIChuYW1lVGV4dCA9PSBudWxsIHx8IG5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCi0gICAgLy8gdmFsaWRhdGUgYWdhaW5zdCBOQ05hbWUKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA8IDEgfHwgIVhNTENoYXIuaXNWYWxpZE5DTmFtZShuYW1lKSkKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfTkFNRSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIAotICBwcml2YXRlIHZvaWQgZmlsbFR5cGVzQ29tYm8oKQotICB7Ci0gICAgdHlwZXNDb21iby5yZW1vdmVBbGwoKTsKLSAgICAKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0gICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gaXRlbXMgPSBtYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLQotICAgICAgdHlwZXNDb21iby5hZGQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKTsKLSAgICAgIHR5cGVzQ29tYm8uYWRkKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgdHlwZXNDb21iby5hZGQoaXRlbXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IFR5cGUgb2YgdGhpcyBhdHRyaWJ1dGUgaWYgbmVlZGVkCi0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gc2ltcGxlVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgY3VycmVudFR5cGVOYW1lID0gYmFzZVR5cGUuZ2V0UU5hbWUoeHNkU2NoZW1hKTsgLy8gbm8gcHJlZml4Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmV0ID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShjdXJyZW50VHlwZU5hbWUsIG1hbmFnZXIpOwotICAgICAgICBpZiAocmV0ID09IG51bGwgJiYgY3VycmVudFR5cGVOYW1lICE9IG51bGwpIC8vIG5vdCBpbiBxdWlja1BpY2sKLSAgICAgICAgewotICAgICAgICAgIHR5cGVzQ29tYm8uYWRkKGN1cnJlbnRUeXBlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBUT0RPOiBjb21tb24gdGhpcyB1cCB3aXRoIFhTREVsZW1lbnREZWNsYXJhdGlvblNlY3Rpb24KLSAgcHJpdmF0ZSBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoU3RyaW5nIHZhbHVlLCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlcikKLSAgewotICAgIGlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotICAgIHsgIAotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEVGFibGVUcmVlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFRhYmxlVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA0ZTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEVGFibGVUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTFRhYmxlVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEVGFibGVUcmVlVmlld2VyIGV4dGVuZHMgWE1MVGFibGVUcmVlVmlld2VyCi17Ci0KLSAgU3RyaW5nIGZpbHRlciA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgY2xhc3MgWFNEQWN0aW9uTWVudUxpc3RlbmVyIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikKLSAgICB7Ci0gICAgICAvLyB1c2VkIHRvIGRpc2FibGUgTm9kZVNlbGVjdGlvbiBsaXN0ZW5pbmcgd2hpbGUgcnVubmluZyBOb2RlQWN0aW9uCi0gICAgICAvLyBYU0RBY3Rpb25NYW5hZ2VyIG5vZGVBY3Rpb25NYW5hZ2VyID0gbmV3IFhTREFjdGlvbk1hbmFnZXIoZk1vZGVsLAotICAgICAgLy8gWFNEVGFibGVUcmVlVmlld2VyLnRoaXMpOwotICAgICAgLy8gbm9kZUFjdGlvbk1hbmFnZXIuc2V0Q29tbWFuZFN0YWNrKGNvbW1hbmRTdGFjayk7Ci0gICAgICAvLyBub2RlQWN0aW9uTWFuYWdlci5maWxsQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIGdldFNlbGVjdGlvbigpKTsKLQotICAgICAgLy8gdXNlZCB0byBkaXNhYmxlIE5vZGVTZWxlY3Rpb24gbGlzdGVuaW5nIHdoaWxlIHJ1bm5pbmcgTm9kZUFjdGlvbgotICAgICAgLy8gWE1MTm9kZUFjdGlvbk1hbmFnZXIgbm9kZUFjdGlvbk1hbmFnZXIgPSBuZXcKLSAgICAgIC8vIFhNTE5vZGVBY3Rpb25NYW5hZ2VyKCgoSURPTURvY3VtZW50KSBnZXRJbnB1dCgpKS5nZXRNb2RlbCgpLAotICAgICAgLy8gWE1MVGFibGVUcmVlVmlld2VyLnRoaXMpIHsKLSAgICAgIGlmIChnZXRJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFhTREFjdGlvbk1hbmFnZXIgbm9kZUFjdGlvbk1hbmFnZXIgPSBuZXcgWFNEQWN0aW9uTWFuYWdlcigoKElET01Eb2N1bWVudCkgKCgoRWxlbWVudCkgZ2V0SW5wdXQoKSkuZ2V0T3duZXJEb2N1bWVudCgpKSkuZ2V0TW9kZWwoKSwgWFNEVGFibGVUcmVlVmlld2VyLnRoaXMpOwotICAgICAgICAvLyBub2RlQWN0aW9uTWFuYWdlci5zZXRDb21tYW5kU3RhY2soY29tbWFuZFN0YWNrKTsKLSAgICAgICAgbm9kZUFjdGlvbk1hbmFnZXIuZmlsbENvbnRleHRNZW51KG1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb24oKSk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgWFNEVGFibGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotICAgIC8vIHRyZWVFeHRlbnNpb24uc2V0Q2VsbE1vZGlmaWVyKG51bGwpOwotICAgIGdldFRyZWUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAvLyB0cmVlRXh0ZW5zaW9uID0gbmV3IFhNTFRyZWVFeHRlbnNpb24oZ2V0VHJlZSgpKTsKLQotICAgIC8vIFJlYXNzaWduIHRoZSBjb250ZW50IHByb3ZpZGVyCi0gICAgWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IE15Q29udGVudFByb3ZpZGVyKCk7Ci0gICAgLy8gcHJvdmlkZXIuYWRkVmlld2VyKHRoaXMpOwotCi0gICAgc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICBzZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotICAgIC8vIHNldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIobmV3IFZpZXdlclNlbGVjdGlvbk1hbmFnZXJJbXBsKG51bGwpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0Um9vdCgpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0Um9vdCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RmlsdGVyKFN0cmluZyBmaWx0ZXIpCi0gIHsKLSAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KCkKLSAgewotICAgIC8vIFRPRE8gVmVyaWZ5IGlmIHRoaXMgaXMgb2theSB0byBvdmVycmlkZSB0aGUgTWVudU1hbmFnZXIKLSAgICBNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBjb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0gICAgY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCi0gICAgLy8gVGhpcyBpcyB0aGUgbGluZSB3ZSBoYXZlIHRvIG1vZGlmeQotICAgIGNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgWFNEQWN0aW9uTWVudUxpc3RlbmVyKCkpOwotICAgIE1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KGdldENvbnRyb2woKSk7Ci0gICAgZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0gIH0KLQotICBib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0KLSAgY2xhc3MgTXlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIKLSAgewotCi0gICAgLy8gcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgLy8JCQkKLSAgICAvLyBpZiAoIWFkZGVkKSB7Ci0gICAgLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgLy8gYWRkZWQgPSB0cnVlOwotICAgIC8vIEVsZW1lbnQgZWxlbSA9IChFbGVtZW50KWVsZW1lbnQ7Ci0gICAgLy8gaWYgKGVsZW0gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0gICAgLy8gdmlld2VyTm90aWZ5aW5nQWRhcHRlckZhY3RvcnkuYWRhcHQoKElOb2RlTm90aWZpZXIpIGVsZW0pOwotICAgIC8vIH0KLSAgICAvLyAvLyByZXR1cm4gbmV3IE9iamVjdFtdIHtlbGVtfTsKLSAgICAvLyB9Ci0gICAgLy8gfQotICAgIC8vIHJldHVybiBzdXBlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLSAgICAvLyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgICAgYWRkZWQgPSBmYWxzZTsKLSAgICAgIGlmIChvbGRJbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIG9sZElucHV0ID0gKChFbGVtZW50KSBvbGRJbnB1dCkuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgICBpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICBuZXdJbnB1dCA9ICgoRWxlbWVudCkgbmV3SW5wdXQpLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgIHN1cGVyLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0FkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzMDliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwuWFNESW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBleHRlbmRzIFNlbGVjdGlvbkRpYWxvZyBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW1hZ2UgREVGQVVMVF9FTEVNRU5UX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbWFnZSBERUZBVUxUX0FUVFJJQlVURV9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotICAvKiogQSB0ZW1wb3JhcnkgRG9jdW1lbnQgaW4gd2hpY2ggd2UgY3JlYXRlIHRlbXBvcmFyeSBET00gZWxlbWVudCBmb3IgZWFjaCBlbGVtZW50IGluIHRoZQotICAgKiBFbGVtZW50IHZpZXcuIChyZXF1aXJlZCBieSBMYWJlbFByb3ZpZGVyKSAgKi8gCi0gIHByb3RlY3RlZCBzdGF0aWMgRG9jdW1lbnQgdGVtcERvYyA9IG5ldyBEb2N1bWVudEltcGwoKTsKLSAgCi0gIEJ1dHRvbiBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbiwgZWRpdEJ1dHRvbjsKLQotICBwdWJsaWMgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyhTaGVsbCBwYXJlbnQsIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgc2NoZW1hUmVnaXN0cnkpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotICAgIHNldFRpdGxlKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VYVEVOU0lPTl9DT01QT05FTlRTKTsKLSAgICBzZXRTaGVsbFN0eWxlKFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUgfCBTV1QuQ0xPU0UpOyAgICAKLSAgfQotCi0gIHByaXZhdGUgTGlzdCBmSW5wdXQ7Ci0KLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciBjYXRlZ29yeVRhYmxlVmlld2VyLCBlbGVtZW50VGFibGVWaWV3ZXI7Ci0gIHByaXZhdGUgQXJyYXlMaXN0IGV4aXN0aW5nTmFtZXM7Ci0KLSAgcHJpdmF0ZSBWaWV3ZXJGaWx0ZXIgZWxlbWVudFRhYmxlVmlld2VyRmlsdGVyOwotICBwcml2YXRlIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGN1cnJlbnRFeHRDYXRlZ29yeTsKLSAgcHJpdmF0ZSBIYXNoTWFwIHNwZWNUb0NvbXBvbmVudHNMaXN0ID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KExpc3QgaW5wdXQpCi0gIHsKLSAgICB0aGlzLmZJbnB1dCA9IGlucHV0OwotICB9Ci0gIAotICBwdWJsaWMgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgZ2V0U2VsZWN0ZWRDYXRlZ29yeSgpewotCXJldHVybiBjdXJyZW50RXh0Q2F0ZWdvcnk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxDYXRlZ29yeVNlbGVjdGlvbihTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjKXsKLQkgIGN1cnJlbnRFeHRDYXRlZ29yeSA9IHNwZWM7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBnZXRDYXRlZ29yeUNvbnRlbnRQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IENhdGVnb3J5Q29udGVudFByb3ZpZGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBjb250YWluZXIpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotCi0gICAgQ29tcG9zaXRlIGNhdGVnb3J5Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgY2F0ZWdvcnlDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBjYXRlZ29yeUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2F0ZWdvcnlDb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9FWFRFTlNJT05fQ0FURUdPUklFUyk7Ci0KLSAgICBuZXcgTGFiZWwoY2F0ZWdvcnlDb21wb3NpdGUsIFNXVC5OT05FKTsKLQotICAgIGNhdGVnb3J5VGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY2F0ZWdvcnlDb21wb3NpdGUsIGdldFRhYmxlU3R5bGUoKSk7Ci0gICAgY2F0ZWdvcnlUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgY2F0ZWdvcnlUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXRlZ29yeUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgY2F0ZWdvcnlUYWJsZVZpZXdlci5zZXRJbnB1dChmSW5wdXQpOwotICAgIGNhdGVnb3J5VGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRDb250cm9sKCksIFhTREVkaXRvckNTSGVscElkcy5BRERfRVhURU5TSU9OU19DT01QT05FTlRTX19FWFRFTlNJT05fQ0FURUdPUklFUyk7Ci0KLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIFRhYmxlIHRhYmxlID0gY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgIHRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgIHRhYmxlLnNldEZvbnQoY29udGFpbmVyLmdldEZvbnQoKSk7Ci0KLSAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjYXRlZ29yeUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIGdsLm51bUNvbHVtbnMgPSAxOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQotICAgIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgYWRkQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0FERF9XSVRIX0RPVFMpOwotICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLSAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhZGRCdXR0b24sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fQUREKTsgICAgCi0KLSAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9ERUxFVEUpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLSAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZW1vdmVCdXR0b24sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fREVMRVRFKTsgICAgCi0KLSAgICAKLSAgICBlZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICBlZGl0QnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0VESVQpOwotICAgIGVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0gICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGVkaXRCdXR0b24sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fRURJVCk7ICAgIAotICAgIAotICAgIAotICAgIExpc3QgaW5pdGlhbFNlbGVjdGlvbiA9IGdldEluaXRpYWxFbGVtZW50U2VsZWN0aW9ucygpOwotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwpCi0gICAgICBjYXRlZ29yeVRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbml0aWFsU2VsZWN0aW9uKSk7Ci0KLSAgICBMYWJlbCBlbGVtZW50TGFiZWwgPSBuZXcgTGFiZWwoY2F0ZWdvcnlDb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICBlbGVtZW50TGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQVZBSUxBQkxFX0NPTVBPTkVOVFNfVE9fQUREKTsKLQotICAgIG5ldyBMYWJlbChjYXRlZ29yeUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0gICAgZWxlbWVudFRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGNhdGVnb3J5Q29tcG9zaXRlLCBnZXRUYWJsZVN0eWxlKCkpOwotICAgIGVsZW1lbnRUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEVsZW1lbnRDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgZWxlbWVudFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEVsZW1lbnRMYWJlbFByb3ZpZGVyKCkpOwotICAgIGVsZW1lbnRUYWJsZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICBlbGVtZW50VGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIG9rUHJlc3NlZCgpOwotICAgICAgfQotICAgIH0pOwotICAgIGlmICggZWxlbWVudFRhYmxlVmlld2VyRmlsdGVyICE9IG51bGwpewotICAgICAgZWxlbWVudFRhYmxlVmlld2VyLmFkZEZpbHRlcihlbGVtZW50VGFibGVWaWV3ZXJGaWx0ZXIpOwotICAgIH0KLSAgICAKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHRhYmxlID0gZWxlbWVudFRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgdGFibGUuc2V0Rm9udChjb250YWluZXIuZ2V0Rm9udCgpKTsKLQotICAgIGVsZW1lbnRUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwkJCQotCSAgICB9ICAgICAgICAJICAKLSAgICAgIH0pOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZWxlbWVudFRhYmxlVmlld2VyLmdldENvbnRyb2woKSwgWFNERWRpdG9yQ1NIZWxwSWRzLkFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0FWQUlMQUJMRV9DT01QT05FTlRTX1RPX0FERCk7Ci0gICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZSgpCi0gIHsKLSAgICBzdXBlci5jcmVhdGUoKTsKLSAgICBpZiAoY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICB7Ci0gICAgICBjYXRlZ29yeVRhYmxlVmlld2VyLmdldFRhYmxlKCkuc2VsZWN0KDApOwotICAgICAgCi0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb247Ci0gICAgICBpZiAoY3VycmVudEV4dENhdGVnb3J5ICE9IG51bGwpewotICAgIAkgIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjdXJyZW50RXh0Q2F0ZWdvcnkpOwotICAgICAgfQotICAgICAgZWxzZXsKLSAgICAJICBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gCi0gICAgCQkgIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0RWxlbWVudEF0KDApKTsKLSAgICAgIH0KLSAgICAgIAotCSAgY2F0ZWdvcnlUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIC8vIFNldHVwIHRoZSBsaXN0IG9mIGNhdGVnb3J5IG5hbWVzIHRoYXQgYWxyZWFkeSBleGlzdAotICAgIC8vIGFuZCBjb250cnVjdHMgdGhlIFhTRFNjaGVtYSBmb3IgZWFjaCBjYXRlZ29yeQotCWV4aXN0aW5nTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JVGFibGVJdGVtW10gY2F0ZWdvcmllcyA9IGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcmllcy5sZW5ndGg7IGkrKyApewotCQlleGlzdGluZ05hbWVzLmFkZChjYXRlZ29yaWVzW2ldLmdldFRleHQoKSk7Ci0KLQkJU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IAotCQkJKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBjYXRlZ29yaWVzW2ldLmdldERhdGEoKTsKLQkJWFNEU2NoZW1hIHNjaGVtYSA9IGdldEFTSVNjaGVtYU1vZGVsKHNwZWMpOwotCQkKLQkJaWYgKHNjaGVtYSA9PSBudWxsKQotCQl7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCUxpc3QgY29tcG9uZW50cyA9IGJ1aWxkSW5wdXQoc2NoZW1hKTsKLQkJc3BlY1RvQ29tcG9uZW50c0xpc3QucHV0KHNwZWMsIGNvbXBvbmVudHMpOwotCi0JCS8vIG1hcmsgY2F0ZWdvcnkgYXMgZ3JheS9lbXB0eSBpZiBhcHBsaWNhYmxlCi0JCU9iamVjdFtdIHJlbWFpbnMgPSBjb21wb25lbnRzLnRvQXJyYXkoKTsKLQkJaWYgKCBlbGVtZW50VGFibGVWaWV3ZXJGaWx0ZXIgIT0gbnVsbCkKLQkJCXJlbWFpbnMgPSBlbGVtZW50VGFibGVWaWV3ZXJGaWx0ZXIuZmlsdGVyKGVsZW1lbnRUYWJsZVZpZXdlciwgCi0JCQkJCWVsZW1lbnRUYWJsZVZpZXdlci5nZXRUYWJsZSgpLCByZW1haW5zKTsKLQkJaWYgKCByZW1haW5zLmxlbmd0aCA9PSAwKQotCQl7Ci0JCSAgY2F0ZWdvcmllc1tpXS5zZXRGb3JlZ3JvdW5kKAotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSQVkpKTsKLQkJfQotCX0KLQkKLQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnRzVGFibGVGaWx0ZXIoVmlld2VyRmlsdGVyIGZpbHRlcil7Ci0JZWxlbWVudFRhYmxlVmlld2VyRmlsdGVyID0gZmlsdGVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcmVmU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUpCi0gIHsKLSAgICB0aGlzLnByZWZTdG9yZSA9IHByZWZTdG9yZTsKLSAgfQotCi0gIHByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZSg0MDAsIDMwMCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzdHlsZSBmbGFncyBmb3IgdGhlIHRhYmxlIHZpZXdlci4KLSAgICogCi0gICAqIEByZXR1cm4gaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgaW50IGdldFRhYmxlU3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSOwotICB9Ci0KLSAgLyoKLSAgICogT3ZlcnJpZGVzIG1ldGhvZCBmcm9tIERpYWxvZwotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkKLSAgewotICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBzZWxlY3RlZCBjaGlsZHJlbi4KLSAgICBnZXRTaGVsbCgpLnNldEN1cnNvcihuZXcgQ3Vyc29yKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1dBSVQpKTsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBlbGVtZW50U2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlbGVtZW50VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY2F0ZWdvcnlTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcmVzdWx0LmFkZChlbGVtZW50U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICByZXN1bHQuYWRkKGNhdGVnb3J5U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICBpZiAoZWxlbWVudFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldFJlc3VsdChyZXN1bHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0UmVzdWx0KG51bGwpOwotICAgIH0KLSAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBhZGRCdXR0b24pCi0gICAgewotICAgIAlBZGROZXdDYXRlZ29yeURpYWxvZyBhZGROZXdDYXRlZ29yeURpYWxvZwotICAgIAkJPSBuZXcgQWRkTmV3Q2F0ZWdvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgCQotICAgIAlhZGROZXdDYXRlZ29yeURpYWxvZy5zZXRVbmF2YWlsYWJsZUNhdGVnb3J5TmFtZXMoZXhpc3RpbmdOYW1lcyk7Ci0gICAgCQotICAgIAlpZiAoIGFkZE5ld0NhdGVnb3J5RGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0sgKXsgICAgCQkKLSAgICAJCVNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNjaGVtYVNwZWMgPSAKLSAgICAJCQluZXcgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoKTsKLSAgICAJCXNjaGVtYVNwZWMuc2V0RGlzcGxheU5hbWUoYWRkTmV3Q2F0ZWdvcnlEaWFsb2cuZ2V0TmV3Q2F0ZWdvcnlOYW1lKCkgKTsKLSAgICAJCXNjaGVtYVNwZWMuc2V0TG9jYXRpb24oYWRkTmV3Q2F0ZWdvcnlEaWFsb2cuZ2V0Q2F0ZWdvcnlMb2NhdGlvbigpICk7Ci0gICAgCQlzY2hlbWFTcGVjLnNldFNvdXJjZUhpbnQoYWRkTmV3Q2F0ZWdvcnlEaWFsb2cuZ2V0U291cmNlKCkpOwotICAgIAkJc2NoZW1hU3BlYy5zZXRGcm9tQ2F0YWxvZyhhZGROZXdDYXRlZ29yeURpYWxvZy5nZXRGcm9tQ2F0YWxvZygpICk7Ci0KLSAgICAJCWZJbnB1dC5hZGQoc2NoZW1hU3BlYyk7Ci0gICAgCQlleGlzdGluZ05hbWVzLmFkZChzY2hlbWFTcGVjLmdldERpc3BsYXlOYW1lKCkpOwotCi0gICAgCQkvLyByZWZyZXNoIHdpdGhvdXQgdXBkYXRpbmcgbGFiZWxzIG9mIGV4aXN0aW5nIFRhYmxlSXRlbXMgICAgCQkKLSAgICAJCWNhdGVnb3J5VGFibGVWaWV3ZXIucmVmcmVzaChmYWxzZSk7Ci0KLSAgICAJCWNhdGVnb3J5VGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNjaGVtYVNwZWMpKTsKLSAgICAJCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAJCQotICAgIAkJc3RvcmVTcGVjSW5QcmVmKHNjaGVtYVNwZWMpOyAgLy8gbXVzdCBzdG9yZSBhZnRlciBzZWxlY3Rpb24gY2hhbmdlZCBpcyBjYWxsZWQgaWUuIDIgbGluZXMgYWJvdmUgKHRydW5nKQotICAgIAl9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJlbW92ZUJ1dHRvbikKLSAgICB7Ci0gICAgCVRhYmxlSXRlbVtdIHNlbGVjdGlvbnMgPSBjYXRlZ29yeVRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCWZvciAoaW50IGkgPTA7IGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKXsKLSAgICAJCVNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAKLSAgICAJCQkoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIHNlbGVjdGlvbnNbaV0uZ2V0RGF0YSgpOwotCi0JCQlmSW5wdXQucmVtb3ZlKHNwZWMgKTsKLSAgICAJCWV4aXN0aW5nTmFtZXMucmVtb3ZlKHNwZWMuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgCQlzcGVjVG9Db21wb25lbnRzTGlzdC5yZW1vdmUoc3BlYyk7Ci0gICAgCQkKLSAgICAJCXJlbW92ZUZyb21QcmVmKHNwZWMpOwotICAgIAl9Ci0gICAgCWNhdGVnb3J5VGFibGVWaWV3ZXIucmVmcmVzaChmYWxzZSk7Ci0KLSAgICAJZWxlbWVudFRhYmxlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgIAllbGVtZW50VGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCi0gICAgICAgIC8vIFRPRE8gYXV0byBzZWxlY3QgZWl0aGVyIHRoZSBwcmV2IGNhdGVnb3J5LCB0aGUgbmV4dCBjYXRlZ29yeSBvciB0aGUgZmlyc3QgY2F0ZWdvcnkgaW4gdGhlIFRhYmxlCi0gICAgCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikKLSAgICB7Ci0gICAgICAgIC8vIHVzZSB0aGlzIGRpYWxvZyBub3QgZm9yIGFkZGluZyBidXQgZm9yIGVkaXRpbmcgcHVycG9zZS4KLSAgICAgICAgQWRkTmV3Q2F0ZWdvcnlEaWFsb2cgZGlhbG9nID0gbmV3IEFkZE5ld0NhdGVnb3J5RGlhbG9nKGdldFNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9FRElUX0NBVEVHT1JZKTsKLSAgICAgICAgCi0gICAgCVRhYmxlSXRlbVtdIHNlbGVjdGlvbnMgPSBjYXRlZ29yeVRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCWlmIChzZWxlY3Rpb25zLmxlbmd0aCA9PSAwKQotICAgIAkJcmV0dXJuOwotCi0gICAgCVNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIHNlbGVjdGlvbnNbMF0uZ2V0RGF0YSgpOwotICAgICAgICAKLSAgICAJU3RyaW5nIGRpc3BsYXlOYW1lID0gc3BlYy5nZXREaXNwbGF5TmFtZSgpOwotCi0JCWRpYWxvZy5zZXRDYXRlZ29yeU5hbWUoZGlzcGxheU5hbWUgKTsKLSAgICAJZGlhbG9nLnNldEZyb21DYXRhbG9nKHNwZWMuaXNGcm9tQ2F0YWxvZygpICk7Ci0gICAgCWRpYWxvZy5zZXRTb3VyY2Uoc3BlYy5nZXRTb3VyY2VIaW50KCkgKTsKLSAgICAJZGlhbG9nLnNldENhdGVnb3J5TG9jYXRpb24oc3BlYy5nZXRMb2NhdGlvbigpICk7Ci0KLSAgICAJc3BlY1RvQ29tcG9uZW50c0xpc3QucmVtb3ZlKHNwZWMpOwotICAgIAlkaWFsb2cuc2V0VW5hdmFpbGFibGVDYXRlZ29yeU5hbWVzKGV4aXN0aW5nTmFtZXMpOwotICAgICAgICAKLSAgICAgICAgaWYgKCBkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyl7Ci0gICAgICAgIAlleGlzdGluZ05hbWVzLnJlbW92ZShkaXNwbGF5TmFtZSk7Ci0JCQlTdHJpbmcgbmV3RGlzcGxheU5hbWUgPSBkaWFsb2cuZ2V0TmV3Q2F0ZWdvcnlOYW1lKCk7Ci0KLQkJCXNwZWMuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwotICAgICAgICAJc3BlYy5zZXRMb2NhdGlvbihkaWFsb2cuZ2V0Q2F0ZWdvcnlMb2NhdGlvbigpKTsKLSAgICAgICAgCXNwZWMuc2V0U291cmNlSGludChkaWFsb2cuZ2V0U291cmNlKCkpOwotICAgICAgICAJc3BlYy5zZXRGcm9tQ2F0YWxvZyhkaWFsb2cuZ2V0RnJvbUNhdGFsb2coKSk7Ci0gICAgICAgIAlzcGVjLnNldE5hbWVzcGFjZVVSSShudWxsKTsKLSAgICAgICAgCQotICAgICAgICAJZXhpc3RpbmdOYW1lcy5hZGQobmV3RGlzcGxheU5hbWUpOwotCi0gICAgICAgIAljYXRlZ29yeVRhYmxlVmlld2VyLnVwZGF0ZShzcGVjLCBudWxsKTsKLSAgICAgICAgCXJlZnJlc2hFbGVtZW50c1ZpZXdlcihzcGVjKTsKLSAgICAgICAgCQotICAgICAgICAJZWRpdFNwZWNJblByZWYoZGlzcGxheU5hbWUsIHNwZWMpOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSA9PSBjYXRlZ29yeVRhYmxlVmlld2VyKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgb2JqOwotICAgICAgICAgIGN1cnJlbnRFeHRDYXRlZ29yeSA9IHNwZWM7Ci0gICAgICAgICAgcmVmcmVzaEVsZW1lbnRzVmlld2VyKHNwZWMpOwotCi0gICAgICAgICAgaWYgKCBzcGVjLmlzRGVmYXV0U2NoZW1hKCkgKXsKLSAgICAgICAgCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIAlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2V7Ci0gICAgICAgIAllZGl0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIAlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZWZyZXNoRWxlbWVudHNWaWV3ZXIoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYykgewotCSAgTGlzdCBjb21wb25lbnRzID0gKExpc3QpIHNwZWNUb0NvbXBvbmVudHNMaXN0LmdldChzcGVjKTsKLQkgIGlmICggY29tcG9uZW50cyAhPSBudWxsKXsKLQkJZWxlbWVudFRhYmxlVmlld2VyLnNldElucHV0KGNvbXBvbmVudHMpOwotCQlyZXR1cm47Ci0JICB9Ci0JICAKLQkgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBnZXRBU0lTY2hlbWFNb2RlbChzcGVjKTsKLQotCSAgaWYgKHhzZFNjaGVtYSA9PSBudWxsKXsKLQkJICBNZXNzYWdlQm94IGVyckRpYWxvZyA9IG5ldyBNZXNzYWdlQm94KGdldFNoZWxsKCksIFNXVC5JQ09OX0VSUk9SKTsKLQkJICBlcnJEaWFsb2cuc2V0VGV4dChNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9DQVRFR09SWSk7Ci0JCSAgLy8gVE9ETyAodHJ1bmcpIEkgd2FzIGZvcmNlZCB0byB1c2UgYSBTdHJpbmcgaW4gTWVzc2FnZXMgdG8gbWFrZSB0aGUgZXJyb3IgY2xlYXJlcgotCQkgIC8vIFdoZW4gd2UgYXJlIGJhY2sgdG8gZGV2ZWxvcG1lbnQgcGhhc2UsIHVzZSBhbm90aGVyIHN0cmluZzogIkV4dGVuc2lvbiBDYXRlZ29yeTogIgotCQkgIC8vIG5vdCAiRXh0ZW5zaW9uIENhdGVnb3JpZXM6IiArICIgIiBsaWtlIHdlIGFyZSB1c2luZyBoZXJlCi0JCSAgZXJyRGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVOU0lPTl9DQVRFR09SSUVTICsgIiAiICsgc3BlYy5nZXREaXNwbGF5TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkgICsgIlxuIiAgIC8vJE5PTi1OTFMtMSQKLQkJCQkgICsgTWVzc2FnZXMuX1VJX0VSUk9SX0ZJTEVfQ0FOTk9UX0JFX1BBUlNFRAotCQkJCSAgKyAiXG4iICsgTWVzc2FnZXMuX1VJX0VSUk9SX1ZBTElEQVRFX1RIRV9GSUxFKTsgICAvLyROT04tTkxTLTEkCi0JCSAgZXJyRGlhbG9nLm9wZW4oKTsKLQkJICAKLQkJICBlbGVtZW50VGFibGVWaWV3ZXIuc2V0SW5wdXQobmV3IEFycmF5TGlzdCgwKSk7Ci0JCSAgcmV0dXJuOwotCSAgfQotCSAgCi0JICBjb21wb25lbnRzID0gYnVpbGRJbnB1dCh4c2RTY2hlbWEpOwotICAgICAgc3BlY1RvQ29tcG9uZW50c0xpc3QucHV0KHNwZWMsIGNvbXBvbmVudHMpOwkgIAotCSAgCi0JICBMaXN0IGFsbEl0ZW1zID0gYnVpbGRJbnB1dCh4c2RTY2hlbWEpOwotCSAgaWYgKCBhbGxJdGVtcyA9PSBudWxsICkKLQkJICByZXR1cm47Ci0JICBlbGVtZW50VGFibGVWaWV3ZXIuc2V0SW5wdXQoYWxsSXRlbXMpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBMaXN0IGJ1aWxkSW5wdXQoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotCWlmICggeHNkU2NoZW1hID09bnVsbCApCi0JCXJldHVybiBudWxsOwotCi0gICAgTGlzdCBlbGVtZW50cyA9IHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCk7Ci0gICAgTGlzdCBhdHRyaWJ1dGVzID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAvLyBGb3Igc2FmZXR5IHB1cnBvc2U6IFdlIGRvbid0IGFwcGVuZCAnYXR0cmlidXRlcycgdG8gJ2VsZW1lbnRzJwotICAgIC8vIEFycmF5U3RvcmVFeGNlcHRpb24ob3Igc2ltaWxhciBvbmUpIG1heSBvY2N1cgotICAgIExpc3QgYWxsSXRlbXMgPSBuZXcgQXJyYXlMaXN0KGF0dHJpYnV0ZXMuc2l6ZSgpICsgZWxlbWVudHMuc2l6ZSgpKTsKLSAgICAKLSAgICB7Ci0gICAgICAvLyBnZXRFbGVtZW50RGVjbGFyYXRpb25zIHJldHVybnMgYSBsb3Qgb2YgZWxlbWVudHMgZnJvbSBpbXBvcnQKLSAgICAgIC8vIHN0YXRlbWVudCwgd2UKLSAgICAgIC8vIG9ubHkgYWRkIG5vbi1pbXBvcnRlZCBlbGVtZW50cyBoZXJlLiAodHJ1bmcpCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gY3VycmVudEVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgICAgICAgYWxsSXRlbXMuYWRkKGN1cnJlbnRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICBhbGxJdGVtcy5hZGQoY3VycmVudEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMgYWxzbyByZXR1cm5zIGEgbG90IG9mIGVsZW1lbnRzIGZyb20KLSAgICAgIC8vIGltcG9ydCBzdGF0ZW1lbnQsIHdlCi0gICAgICAvLyBvbmx5IGFkZCBub24taW1wb3J0ZWQgZWxlbWVudHMgaGVyZS4gKHRydW5nKQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBjdXJyZW50QXR0cmlidXRlID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgaWYgKGN1cnJlbnRBdHRyaWJ1dGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjdXJyZW50QXR0cmlidXRlLmlzR2xvYmFsKCkgJiYgY3VycmVudEF0dHJpYnV0ZS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgICAgIGFsbEl0ZW1zLmFkZChjdXJyZW50QXR0cmlidXRlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICBhbGxJdGVtcy5hZGQoY3VycmVudEF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFsbEl0ZW1zOwotICB9Ci0KLSAgCi0gIHByaXZhdGUgc3RhdGljIFhTRFNjaGVtYSBnZXRBU0lTY2hlbWFNb2RlbChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBleHRlbnNpb25zU2NoZW1hU3BlYykKLSAgewotICAgIFN0cmluZyBsb2NhdGlvbiA9IGV4dGVuc2lvbnNTY2hlbWFTcGVjLmdldExvY2F0aW9uKCk7Ci0gICAgaWYgKCBsb2NhdGlvbiA9PSBudWxsKQotICAgIAlyZXR1cm4gbnVsbDsKLQlYU0RTY2hlbWEgeHNkU2NoZW1hID0gWFNESW1wbC5idWlsZFhTRE1vZGVsKGxvY2F0aW9uKTsKLSAgICAKLSAgICAvLyBub3cgdGhhdCB0aGUgLnhzZCBmaWxlIGlzIHJlYWQsIHdlIGNhbiByZXRyaWV2ZSB0aGUgbmFtZXNwYWNlIG9mIHRoaXMgeHNkIGZpbGUKLSAgICAvLyBhbmQgc2V0IHRoZSBuYW1lc3BhY2UgZm9yICdwcm9wZXJ0aWVzJwotICAgIGlmICggZXh0ZW5zaW9uc1NjaGVtYVNwZWMuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCl7Ci0gICAgCWV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldE5hbWVzcGFjZVVSSSggeHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzdG9yZVNwZWNJblByZWYoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc2NoZW1hU3BlYykgewotCWlmIChwcmVmU3RvcmUgPT0gbnVsbCkKLQkJcmV0dXJuOwotCQotCVN0cmluZyBjdXJyZW50VmFsdWUgPSBwcmVmU3RvcmUuZ2V0U3RyaW5nKEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuVVNFUl9BRERFRF9FWFRfU0NIRU1BUyk7Ci0JU3RyaW5nIHNwZWNEZXNjID0gIiAgIiArICJcdCIgKyBzY2hlbWFTcGVjLmdldERpc3BsYXlOYW1lKCkgKyAiXHQiKwotCQlzY2hlbWFTcGVjLmdldE5hbWVzcGFjZVVSSSgpICsgIlx0IiArIHNjaGVtYVNwZWMuZ2V0TG9jYXRpb24oKSArICJcdCIgKwotCQlzY2hlbWFTcGVjLmlzRGVmYXV0U2NoZW1hKCkgKyAiXHQiICsgc2NoZW1hU3BlYy5nZXRTb3VyY2VIaW50KCkgKyAiXHQiICsKLQkJc2NoZW1hU3BlYy5pc0Zyb21DYXRhbG9nKCk7Ci0JY3VycmVudFZhbHVlICs9IHNwZWNEZXNjICsgIlxuIjsKLQotCXByZWZTdG9yZS5zZXRWYWx1ZShFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LlVTRVJfQURERURfRVhUX1NDSEVNQVMsCi0JCQljdXJyZW50VmFsdWUpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVkaXRTcGVjSW5QcmVmKFN0cmluZyBkaXNwbGF5TmFtZSwgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgbmV3U3BlYykgewotCWlmIChwcmVmU3RvcmUgPT0gbnVsbCkKLQkgIHJldHVybjsKLQkKLQlTdHJpbmcgbmV3VmFsdWUgPSAiIjsKLQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJlZlN0b3JlLmdldFN0cmluZyhFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LlVTRVJfQURERURfRVhUX1NDSEVNQVMpOwotCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGN1cnJlbnRWYWx1ZSwgIlxuIik7Ci0KLQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLQl7Ci0JICBTdHJpbmcgb25lU3BlY0Rlc2MgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JICAvLyBnZXQgdGhlIERpc3BsYXkgbmFtZQotCSAgU3RyaW5nVG9rZW5pemVyIF90b2tlbml6ZXJfMiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIob25lU3BlY0Rlc2MsICJcdCIpOwotCSAgX3Rva2VuaXplcl8yLm5leHRUb2tlbigpOwotCSAgU3RyaW5nIGROYW1lID0gX3Rva2VuaXplcl8yLm5leHRUb2tlbigpOwotCi0JICBpZiAoIGROYW1lLmVxdWFscyhkaXNwbGF5TmFtZSApICkKLQkgIHsKLQkJb25lU3BlY0Rlc2MgPSAiICAiICsgIlx0IiArIG5ld1NwZWMuZ2V0RGlzcGxheU5hbWUoKSArICJcdCIrCi0JCQluZXdTcGVjLmdldE5hbWVzcGFjZVVSSSgpICsgIlx0IiArIG5ld1NwZWMuZ2V0TG9jYXRpb24oKSArICJcdCIgKwotCQkJbmV3U3BlYy5pc0RlZmF1dFNjaGVtYSgpICsgIlx0IiArIG5ld1NwZWMuZ2V0U291cmNlSGludCgpICsgIlx0IiArCi0JCQluZXdTcGVjLmlzRnJvbUNhdGFsb2coKTsJCSAgCi0JICB9Ci0KLQkgIG5ld1ZhbHVlICs9IG9uZVNwZWNEZXNjICsgIlxuIjsKLQl9Ci0JcHJlZlN0b3JlLnNldFZhbHVlKEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuVVNFUl9BRERFRF9FWFRfU0NIRU1BUywgbmV3VmFsdWUpOwotCQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21QcmVmKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMpIHsKLQlpZiAocHJlZlN0b3JlID09IG51bGwpCi0JICByZXR1cm47CSAgCi0JICAKLQlTdHJpbmcgbmV3VmFsdWUgPSAiIjsKLQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJlZlN0b3JlLmdldFN0cmluZyhFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LlVTRVJfQURERURfRVhUX1NDSEVNQVMpOwotCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGN1cnJlbnRWYWx1ZSwgIlxuIik7Ci0KLQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLQl7Ci0JICBTdHJpbmcgb25lU3BlY0Rlc2MgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JICAvLyBnZXQgdGhlIERpc3BsYXkgbmFtZQotCSAgU3RyaW5nVG9rZW5pemVyIF90b2tlbml6ZXJfMiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIob25lU3BlY0Rlc2MsICJcdCIpOwotCSAgX3Rva2VuaXplcl8yLm5leHRUb2tlbigpOwotCSAgU3RyaW5nIGROYW1lID0gX3Rva2VuaXplcl8yLm5leHRUb2tlbigpOwotCi0JICBpZiAoIGROYW1lLmVxdWFscyhzcGVjLmdldERpc3BsYXlOYW1lKCkgKSApCi0JCWNvbnRpbnVlOwotCSAgbmV3VmFsdWUgKz0gb25lU3BlY0Rlc2MgKyAiXG4iOwotCX0KLQlwcmVmU3RvcmUuc2V0VmFsdWUoRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeS5VU0VSX0FEREVEX0VYVF9TQ0hFTUFTLCBuZXdWYWx1ZSk7Ci0gIH0KLQotc3RhdGljIGNsYXNzIENhdGVnb3J5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsgICAgCi0gICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYVtdIGV4dGVuc2lvbnNTY2hlbWFTcGVjcyA9IG51bGw7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBpbnB1dExpc3QgPSAoTGlzdCkgaW5wdXRFbGVtZW50OwotICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlY3MgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWFbXSkgaW5wdXRMaXN0LnRvQXJyYXkobmV3IFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hWzBdKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIHJldHVybiBleHRlbnNpb25zU2NoZW1hU3BlY3M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZwotCi0gICAgfQotICB9Ci0KLSAgc3RhdGljIGNsYXNzIENhdGVnb3J5TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLSAgewotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9hcHBpbmZvX2NhdGVnb3J5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkKLSAgICAgICAgcmV0dXJuICgoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIGVsZW1lbnQpLmdldERpc3BsYXlOYW1lKCk7Ci0KLSAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBjbGFzcyBFbGVtZW50Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KQotICAgICAgewotICAgICAgICByZXR1cm4gKChMaXN0KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcKLQotICAgIH0KLSAgfQotCi0gIGNsYXNzIEVsZW1lbnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotICB7ICAgIAotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pewotICAgIAkgIAotICAgIAkgIC8vIFdvcmthcm91bmQgdHJpY2s6ICh0cnVuZykgd2UgY3JlYXRlIGEgdGVtcG9yYXJ5IERvbSBlbGVtZW50IGFuZCBwdXQgaXQgaW4gdGhlIGxhYmVsIHByb3ZpZGVyCi0gICAgCSAgLy8gdG8gZ2V0IHRoZSBpbWFnZS4KLSAgICAJICBTdHJpbmcgbmFtZXNwYWNlID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnQpLmdldFNjaGVtYSgpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIAkgIFN0cmluZyBuYW1lID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKTsKLSAgICAJICBFbGVtZW50IHRlbXBFbGVtZW50ID0gdGVtcERvYy5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCBuYW1lKTsKLSAgICAgICAgICBJTGFiZWxQcm92aWRlciBscCA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Tm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgpLmdldExhYmVsUHJvdmlkZXIobmFtZXNwYWNlKTsKLSAgICAJICBpZiAobHAgIT0gbnVsbCl7Ci0gICAgCQkgIEltYWdlIGltZyA9IGxwLmdldEltYWdlKHRlbXBFbGVtZW50KTsKLSAgICAJCSAgCi0gICAgCQkgIGlmIChpbWcgIT0gbnVsbCl7Ci0gICAgCQkJICByZXR1cm4gaW1nOwotICAgIAkJICB9Ci0gICAgCSAgfQotICAgIAkgIHJldHVybiBERUZBVUxUX0VMRU1FTlRfSUNPTjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pewotICAgIAkgIHJldHVybiBERUZBVUxUX0FUVFJJQlVURV9JQ09OOwotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgIHJldHVybiAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiApCi0gICAgICAgIHJldHVybiAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY2xvc2UoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZW5hYmxlQnV0dG9ucyhib29sZWFuIHZhbHVlKQotICB7Ci0gICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKHZhbHVlKTsKLSAgICBhZGRCdXR0b24uc2V0RW5hYmxlZCh2YWx1ZSk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodmFsdWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQWRkTmV3Q2F0ZWdvcnlEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9BZGROZXdDYXRlZ29yeURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzVkM2FhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9BZGROZXdDYXRlZ29yeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0U2luZ2xlRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBBZGROZXdDYXRlZ29yeURpYWxvZyBleHRlbmRzIERpYWxvZwotewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTEFCRUwgPSBNZXNzYWdlcy5fVUlfTEFCRUxfU0NIRU1BOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9MQUJFTCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FOwotICBwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZSA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9BRERfQ0FURUdPUlk7Ci0gIAotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgYnJvd3NlTWVudTsKLSAgcHJvdGVjdGVkIExhYmVsIG5hbWU7Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotICBwcm90ZWN0ZWQgTGFiZWwgc2NoZW1hOwotICBwcm90ZWN0ZWQgQ0xhYmVsIHNjaGVtYURpc3BsYXllcjsKLSAgcHJvdGVjdGVkIFRvb2xCYXIgYnJvd3NlVG9vbEJhcjsKLSAgcHJvdGVjdGVkIFRvb2xJdGVtIGJyb3dzZUl0ZW07Ci0KLSAgcHJvdGVjdGVkIExpc3QgaW52YWxpZE5hbWVzOwotICAKLSAgLy8gVE9ETyAoY3MpIHJlbmFtZSB0aGlzIGZpZWxkIHRvIGV4dGVuc2lvblNjaGVtYUxvY2F0aW9uIGluIFdUUCAyLjAKLSAgcHJvdGVjdGVkIFN0cmluZyBhcHBJbmZvU2NoZW1hTG9jYXRpb247Ci0gIHByb3RlY3RlZCBTdHJpbmcgY2F0ZWdvcnlOYW1lOwotICBwcm90ZWN0ZWQgQ0xhYmVsIGVyckRpc3BsYXllcjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDYXRlZ29yeU5hbWVWYWxpZDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZnJvbUNhdGFsb2c7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY2FuT0sgPWZhbHNlOyAKLSAgCi0gIC8qKiBFaXRoZXIgdGhlIGxvY2F0aW9uIGlmIGNvbWUgZnJvbSB3b3Jrc3BhY2Ugb3IgbmFtZXNwYWNlIGlmIGNvbWUgZnJvbQotICAgKiAJWE1MIENhdGFsb2cgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgc291cmNlOwotCi0gIHB1YmxpYyBBZGROZXdDYXRlZ29yeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgfQotCi0gIHB1YmxpYyBBZGROZXdDYXRlZ29yeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgIHRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIHJlY2VpdmUgYSBMaXN0IG9mIG5hbWVzIHdoaWNoIGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBjYXRlZ29yeSBsaXN0Ci0gICAqIAotICAgKiBAcGFyYW0gdW5hdmFpbE5hbWVzCi0gICAqICAgICAgICAgIEFycmF5IG9mIHVudmFpbGFibGUgbmFtZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuYXZhaWxhYmxlQ2F0ZWdvcnlOYW1lcyhMaXN0IHVuYXZhaWxOYW1lcykKLSAgewotICAgIGludmFsaWROYW1lcyA9IHVuYXZhaWxOYW1lczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmV3Q2F0ZWdvcnlOYW1lKCkKLSAgewotICAgIHJldHVybiBjYXRlZ29yeU5hbWUudHJpbSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeUxvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBhcHBJbmZvU2NoZW1hTG9jYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENhdGVnb3J5TG9jYXRpb24oU3RyaW5nIHMpewotCSAgYXBwSW5mb1NjaGVtYUxvY2F0aW9uID0gczsKLSAgfQotICAKLSAgLyoqIEBkZXByZWNhdGVkICovCi0gIHB1YmxpYyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBnZXRFeHRlbnNpb25zU2NoZW1hU3BlYygpewotCVNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNjaGVtYVNwZWMgPSBuZXcgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoKTsKLQlzY2hlbWFTcGVjLnNldERpc3BsYXlOYW1lKGdldE5ld0NhdGVnb3J5TmFtZSgpKTsKLQlzY2hlbWFTcGVjLnNldExvY2F0aW9uKGdldENhdGVnb3J5TG9jYXRpb24oKSk7Ci0JCi0JcmV0dXJuIHNjaGVtYVNwZWM7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlOYW1lKFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKLQl0aGlzLmNhdGVnb3J5TmFtZSA9IGNhdGVnb3J5TmFtZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEZyb21DYXRhbG9nKCkgewotCXJldHVybiBmcm9tQ2F0YWxvZzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RnJvbUNhdGFsb2coYm9vbGVhbiBiKXsKLQlmcm9tQ2F0YWxvZyA9IGI7CQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKQotICB7Ci0JcmV0dXJuIHNvdXJjZTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCXRoaXMuc291cmNlID0gc291cmNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb250cm9sIHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOwotICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGNhbk9LKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gcmVkdWRhbnQgbWV0aG9kIHRvIGltcHJvdmUgc3BlZWQgKGFjY29yZGluZyB0byB0aGUgY29tcGlsZXIpCi0gIHByb3RlY3RlZCBCdXR0b24gZ2V0QnV0dG9uKGludCBpZCkgewotICAgIHJldHVybiBzdXBlci5nZXRCdXR0b24oaWQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBnZXRTaGVsbCgpLnNldFRleHQoZGlhbG9nVGl0bGUpOwotCi0gICAgQ29tcG9zaXRlIG1haW5Db21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgbGF5b3V0Lm1hcmdpblRvcCA9IDEwOwotICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0KLSAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBMaW5lIDEsIG5hbWUKLSAgICBuYW1lID0gbmV3IExhYmVsKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBuYW1lLnNldFRleHQoTkFNRV9MQUJFTCk7Ci0KLSAgICBuYW1lVGV4dCA9IG5ldyBUZXh0KG1haW5Db21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLSAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBpZiAoY2F0ZWdvcnlOYW1lICE9IG51bGwpCi0gICAgCW5hbWVUZXh0LnNldFRleHQoY2F0ZWdvcnlOYW1lKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkFERF9DQVRFR09SWV9fTkFNRSk7ICAgICAKLQotICAgIEJ1dHRvbiBoaWRkZW4gPSBuZXcgQnV0dG9uKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBoaWRkZW4uc2V0VmlzaWJsZShmYWxzZSk7Ci0KLSAgICAvLyBMaW5lIDIsIHNjaGVtYQotICAgIHNjaGVtYSA9IG5ldyBMYWJlbChtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgc2NoZW1hLnNldFRleHQoU0NIRU1BX0xBQkVMKTsKLQotICAgIHNjaGVtYURpc3BsYXllciA9IG5ldyBDTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotICAgIHNjaGVtYURpc3BsYXllci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBpZiAoc291cmNlICE9IG51bGwpCi0gICAgewotICAgIAlpZiAoZnJvbUNhdGFsb2cpCi0gICAgCQlzY2hlbWFEaXNwbGF5ZXIuc2V0SW1hZ2UoCi0gICAgCQkJCVhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMveG1sY2F0YWxvZ19vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgCWVsc2UKLSAgICAJCXNjaGVtYURpc3BsYXllci5zZXRJbWFnZSgKLSAgICAJCQkJWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIAlzY2hlbWFEaXNwbGF5ZXIuc2V0VGV4dChzb3VyY2UpOwotICAgIAkKLSAgICB9Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzY2hlbWFEaXNwbGF5ZXIsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0NBVEVHT1JZX19TQ0hFTUEpOyAKLSAgICAKLSAgICBpZiAoY2F0ZWdvcnlOYW1lICE9IG51bGwgJiYgc291cmNlICE9IG51bGwpCi0gICAgCWNhbk9LID0gdHJ1ZTsKLQotICAgIGJyb3dzZVRvb2xCYXIgPSBuZXcgVG9vbEJhcihtYWluQ29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgYnJvd3NlSXRlbSA9IG5ldyBUb29sSXRlbShicm93c2VUb29sQmFyLCBTV1QuTk9ORSk7Ci0gICAgLy8gVE9ETzogU2hvdWxkIGJlIGFibGUgdG8gZ2V0IHRoZSBpbWFnZSBmcm9tIHRoZSBYTUwgcGx1Z2luLiBEb24ndCBuZWVkCi0gICAgLy8gdG8gY29weSB0byBYU0RFZGl0b3IgaWNvbnMgZm9sZGVyIGxpa2UgdGhpcy4KLSAgICBicm93c2VJdGVtLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvYXBwaW5mb19icm93c2UuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICBicm93c2VNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0KLSAgICBCcm93c2VJbldvcmtzcGFjZUFjdGlvbiBicm93c2VJbldvcmtzcGFjZSA9IG5ldyBCcm93c2VJbldvcmtzcGFjZUFjdGlvbigpOwotICAgIGJyb3dzZU1lbnUuYWRkKGJyb3dzZUluV29ya3NwYWNlKTsKLQotICAgIEJyb3dzZUNhdGFsb2dBY3Rpb24gYnJvd3NlQ2F0YWxvZyA9IG5ldyBCcm93c2VDYXRhbG9nQWN0aW9uKCk7Ci0gICAgYnJvd3NlTWVudS5hZGQoYnJvd3NlQ2F0YWxvZyk7Ci0KLSAgICBicm93c2VJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgewotICAgICAgICBNZW51IG1lbnUgPSBicm93c2VNZW51LmNyZWF0ZUNvbnRleHRNZW51KGdldFNoZWxsKCkpOwotICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gYnJvd3NlSXRlbS5nZXRCb3VuZHMoKTsKLSAgICAgICAgUG9pbnQgdG9wTGVmdCA9IG5ldyBQb2ludChib3VuZHMueCwgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgdG9wTGVmdCA9IGJyb3dzZVRvb2xCYXIudG9EaXNwbGF5KHRvcExlZnQpOwotICAgICAgICBtZW51LnNldExvY2F0aW9uKHRvcExlZnQueCwgdG9wTGVmdC55KTsKLSAgICAgICAgbWVudS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgLy8gQ29tcG9zaXRlIGVyckNvbXAgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAvLyBlcnJDb21wLnNldEJhY2tncm91bmQob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICAvLyBlcnJDb21wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBlcnJEaXNwbGF5ZXIgPSBuZXcgQ0xhYmVsKG1haW5Db21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAvLyBlcnJEaXNwbGF5ZXIuc2V0VGV4dCgiYWJkIik7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgZXJyRGlzcGxheWVyLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgLy8gZXJyQ29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAvLyBlcnJEaXNwbGF5ZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgLy8gZXJyTXNnQ29udGFpbmVyLnNldENvbnRlbnQoZXJyRGlzcGxheWVyKTsKLQotICAgIG5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpCi0gICAgewotICAgICAgLy8gdHJhY2sgdGhlIG5hbWVUZXh0IGFuZCBlbmFibGUvZGlzYWJsZSB0aGUgT0sgYnV0dG9uIGFjY29yZGluZ2x5Ci0gICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIGNhdGVnb3J5TmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKTsKLQotICAgICAgICAvLyBuYW1lIGlzIGluIHRoZSBpbnZhbGlkIExpc3QKLSAgICAgICAgaWYgKGludmFsaWROYW1lcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGludmFsaWROYW1lcy5jb250YWlucyhjYXRlZ29yeU5hbWUudHJpbSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc0NhdGVnb3J5TmFtZVZhbGlkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIGVyckRpc3BsYXllci5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9FUlJPUl9OQU1FX0FMUkVBRFlfVVNFRCk7Ci0gICAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9lcnJvcl9zdF9vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG5hbWUgaXMgZW1wdHkgc3RyaW5nCi0gICAgICAgIGlmIChjYXRlZ29yeU5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgaXNDYXRlZ29yeU5hbWVWYWxpZCA9IGZhbHNlOwotCi0gICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIGVyckRpc3BsYXllci5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGVyckRpc3BsYXllci5zZXRJbWFnZShudWxsKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBFbmFibGUgdGhlIE9rIGJ1dHRvbiBpZiB0aGUgbG9jYXRpb24gZmllbGQgQU5EIHRoZSBuYW1lIGZpZWxkIGFyZSBub3QKLSAgICAgICAgICogZW1wdHkKLSAgICAgICAgICovCi0gICAgICAgIGlmICghY2F0ZWdvcnlOYW1lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIGlzQ2F0ZWdvcnlOYW1lVmFsaWQgPSB0cnVlOwotICAgICAgICAgIGVyckRpc3BsYXllci5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGVyckRpc3BsYXllci5zZXRJbWFnZShudWxsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXBwSW5mb1NjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIWFwcEluZm9TY2hlbWFMb2NhdGlvbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpCi0gIHsKLSAgICBzdXBlci5va1ByZXNzZWQoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBCcm93c2VJbldvcmtzcGFjZUFjdGlvbiBleHRlbmRzIEFjdGlvbgotICB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9GSUxFX0VYVEVOU0lPTiA9ICIueHNkIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIEJyb3dzZUluV29ya3NwYWNlQWN0aW9uKCkKLSAgICB7Ci0gICAgICBzdXBlcihNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRV9XT1JLU1BBQ0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0U2luZ2xlRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBudWxsLCB0cnVlKTsKLSAgICAgIGRpYWxvZy5hZGRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IFhTRF9GSUxFX0VYVEVOU0lPTiB9KTsKLSAgICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAgIGRpYWxvZy5zZXRUaXRsZShNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX1hTRF9GSUxFKTsKLSAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKE1lc3NhZ2VzLl9VSV9ERVNDUklQVElPTl9DSE9PU0VfWFNEX0ZJTEUpOwotCi0gICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIElGaWxlIGFwcEluZm9TY2hlbWFGaWxlID0gZGlhbG9nLmdldEZpbGUoKTsKLSAgICAgICAgaWYgKGFwcEluZm9TY2hlbWFGaWxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyByZW1vdmUgbGVhZGluZyBzbGFzaCBmcm9tIHRoZSB2YWx1ZSB0byBhdm9pZCB0aGUKLSAgICAgICAgICAvLyB3aG9sZSBsZWFkaW5nIHNsYXNoIGFtYmlndWl0eSBwcm9ibGVtCi0gICAgICAgICAgU3RyaW5nIHVyaSA9IGFwcEluZm9TY2hlbWFGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICB3aGlsZSAodXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGFwcEluZm9TY2hlbWFMb2NhdGlvbiA9IHVyaS50b1N0cmluZygpOwotICAgICAgICAgIHNvdXJjZSA9IHVyaTsKLSAgICAgICAgICBmcm9tQ2F0YWxvZyA9IGZhbHNlOwotCi0gICAgICAgICAgYXBwSW5mb1NjaGVtYUxvY2F0aW9uID0gImZpbGU6Ly8iICsgUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIi8iICsgYXBwSW5mb1NjaGVtYUxvY2F0aW9uOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAvLyBUT0RPLi4uIGJlIGNhcmVmdWwgaG93IHdlIGNvbnN0cnVjdCB0aGUgbG9jYXRpb24KLSAgICAgICAgICAvLyBVTklYIHJlbGF0ZWQgaXNzdWVzIGhlcmUKLQotICAgICAgICAgIHNjaGVtYURpc3BsYXllci5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgc2NoZW1hRGlzcGxheWVyLnNldFRleHQodXJpKTsKLQotICAgICAgICAgIC8vIEVuYWJsZSB0aGUgT0sgYnV0dG9uIGlmIHdlIHNob3VsZC4uCi0gICAgICAgICAgaWYgKGlzQ2F0ZWdvcnlOYW1lVmFsaWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGVyckRpc3BsYXllci5zZXRJbWFnZShudWxsKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgQnJvd3NlQ2F0YWxvZ0FjdGlvbiBleHRlbmRzIEFjdGlvbgotICB7Ci0gICAgcHVibGljIEJyb3dzZUNhdGFsb2dBY3Rpb24oKQotICAgIHsKLSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFX0NBVEFMT0cpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgU2VsZWN0RnJvbUNhdGFsb2dEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdEZyb21DYXRhbG9nRGlhbG9nKGdldFNoZWxsKCkpOwotICAgICAgLy8gZGlhbG9nLm9wZW4oKTsKLSAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgIHsKLSAgICAgICAgYXBwSW5mb1NjaGVtYUxvY2F0aW9uID0gZGlhbG9nLmdldEN1cnJlbnRTZWxlY3Rpb25Mb2NhdGlvbigpOwotICAgICAgICBzb3VyY2UgPSBkaWFsb2cuZ2V0Q3VycmVudFNlbGVjdGlvbk5hbWVzcGFjZSgpOwotICAgICAgICBmcm9tQ2F0YWxvZyA9IHRydWU7Ci0KLSAgICAgICAgc2NoZW1hRGlzcGxheWVyLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMveG1sY2F0YWxvZ19vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNjaGVtYURpc3BsYXllci5zZXRUZXh0KGRpYWxvZy5nZXRDdXJyZW50U2VsZWN0aW9uTmFtZXNwYWNlKCkpOwotCi0gICAgICAgIC8vIEVuYWJsZSB0aGUgT0sgYnV0dG9uIGlmIHdlIHNob3VsZC4uCi0gICAgICAgIGlmIChpc0NhdGVnb3J5TmFtZVZhbGlkICYmICFhcHBJbmZvU2NoZW1hTG9jYXRpb24uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgZXJyRGlzcGxheWVyLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgZXJyRGlzcGxheWVyLnNldEltYWdlKG51bGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9DYXRlZ29yeVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQ2F0ZWdvcnlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2ViNjRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9DYXRlZ29yeVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlQcm92aWRlcgotewotICBwcml2YXRlIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0KLSAgcHVibGljIENhdGVnb3J5UHJvdmlkZXIoKQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBFeHRlbmRlcnMgc2hvdWxkIGltcGxlbWVudCBhbmQgcmV0dXJuIGEgbGlzdCBvZiAKLSAgICogU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEKLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0Q2F0ZWdvcmllcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotICB9Ci0gIAotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCB0byBmaW5kIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hCi0gICAqIGluIHRoZSBYTUwgQ2F0YWxvZwotICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0gICAqIEByZXR1cm4gcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIHNjaGVtYQotICAgKi8KLSAgcHVibGljIFN0cmluZyBsb2NhdGVGaWxlVXNpbmdDYXRhbG9nKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICByZXRyaWV2ZUNhdGFsb2coKTsKLQotICAgIElDYXRhbG9nRW50cnlbXSBlbnRyaWVzID0gc3lzdGVtQ2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZW50cmllc1tpXS5nZXRLZXkoKS5lcXVhbHMobmFtZXNwYWNlVVJJKSkKLSAgICAgICAgcmV0dXJuIGVudHJpZXNbaV0uZ2V0VVJJKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmV0cmlldmVDYXRhbG9nKCkKLSAgewotICAgIGlmIChzeXN0ZW1DYXRhbG9nICE9IG51bGwpCi0gICAgICByZXR1cm47Ci0KLSAgICBJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0gICAgSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0gICAgICBJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLSAgICAgIGlmIChyZWZlcmVuY2VkQ2F0YWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzeXN0ZW1DYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOGUxOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5UcmVlQ29udGVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLkRlZmF1bHRMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlRWRpdG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBET01FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlcgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IHt9OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSB7fTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9OT0RFX0tFWSA9ICJ0ZXh0KCkiOyAvLyROT04tTkxTCi0KLSAgcHVibGljIE9iamVjdFtdIGdldEl0ZW1zKE9iamVjdCBpbnB1dCkKLSAgewotICAgIEhhc2hNYXAgcmVzdWx0TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBpbnB1dDsKLSAgICAgIAotICAgICAgLy8gaGVyZSB3ZSBjb21wdXRlIGl0ZW1zIGZvciB0aGUgYXR0cmlidXRlcyB0aGF0IHBoeXNpY2FsbHkgaW4gdGhlIGRvY3VtZW50IAotICAgICAgLy8KLSAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLSAgICAgICAgaWYgKCFYTUxOUy5lcXVhbHMoYXR0ci5nZXROYW1lKCkpICYmICFYTUxOUy5lcXVhbHMoYXR0ci5nZXRQcmVmaXgoKSkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0TWFwLnB1dChhdHRyLmdldE5hbWUoKSwgRE9NRXh0ZW5zaW9uSXRlbS5jcmVhdGVJdGVtRm9yRWxlbWVudEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgCi0gICAgICAvLyBoZXJlIHdlIGNvbXB1dGUgYW4gaXRlbSBmb3IgdGhlIHRleHQgbm9kZSB0aGF0IGlzIHBoeXNpY2FsbHkgaW4gdGhlIGRvY3VtZW50IAotICAgICAgLy8gICAgICAKLSAgICAgIFN0cmluZyB0ZXh0Tm9kZVZhbHVlID0gbmV3IFRyZWVDb250ZW50SGVscGVyKCkuZ2V0Tm9kZVZhbHVlKGVsZW1lbnQpOwotICAgICAgaWYgKHRleHROb2RlVmFsdWUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHRNYXAucHV0KFRFWFRfTk9ERV9LRVksIERPTUV4dGVuc2lvbkl0ZW0uY3JlYXRlSXRlbUZvckVsZW1lbnRUZXh0KGVsZW1lbnQpKTsKLSAgICAgIH0gIAotICAgICAgCi0gICAgICBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgIGlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBoZXJlIHdlIGNvbXB1dGUgaXRlbXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHRoYXQgbWF5IGJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBhY2NvcmRpbmcgdG8gdGhlIGdyYW1tYXIgCi0gICAgICAgICAgLy8gICAgICAgICAgIAotICAgICAgICAgIExpc3QgbGlzdCA9IG1vZGVsUXVlcnkuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBlZCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgICAgICAgICBpZiAoYWQgIT0gbnVsbCAmJiByZXN1bHRNYXAuZ2V0KGFkLmdldE5vZGVOYW1lKCkpID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHRNYXAucHV0KGFkLmdldE5vZGVOYW1lKCksIERPTUV4dGVuc2lvbkl0ZW0uY3JlYXRlSXRlbUZvckVsZW1lbnRBdHRyaWJ1dGUoZWxlbWVudCwgYWQpKTsKLSAgICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocmVzdWx0TWFwLmdldChURVhUX05PREVfS0VZKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGhlcmUgd2UgY29tcHV0ZSBhbiBpdGVtIGZvciB0aGUgdGV4dCBub2RlIHRoYXQgbWF5IGJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBhY2NvcmRpbmcgdG8gdGhlIGdyYW1tYXIgCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IGNvbnRlbnRUeXBlID0gZWQuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdE1hcC5wdXQoVEVYVF9OT0RFX0tFWSwgRE9NRXh0ZW5zaW9uSXRlbS5jcmVhdGVJdGVtRm9yRWxlbWVudFRleHQoZWxlbWVudCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSByZXN1bHRNYXAudmFsdWVzKCk7Ci0gICAgICAvLyBpbml0aWFsaXplIHRoZSBlZGl0b3IgaW5mb3JtYXRpb24gZm9yIGVhY2ggaXRlbQotICAgICAgLy8KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBpbml0UHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKChET01FeHRlbnNpb25JdGVtKSBpLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICBET01FeHRlbnNpb25JdGVtW10gaXRlbXMgPSBuZXcgRE9NRXh0ZW5zaW9uSXRlbVtjb2xsZWN0aW9uLnNpemUoKV07Ci0gICAgICByZXN1bHRNYXAudmFsdWVzKCkudG9BcnJheShpdGVtcyk7Ci0gICAgICAKLSAgICAgIC8vIGhlcmUgd2Ugc29ydCB0aGUgbGlzdCBhbHBoYWJldGljYWxseQotICAgICAgLy8KLSAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKQotICAgICAgeyAgCi0gICAgICAgIENvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpCi0gICAgICAgICAgeyAgICAgICAgIAotICAgICAgICAgICAgRE9NRXh0ZW5zaW9uSXRlbSBhID0gKERPTUV4dGVuc2lvbkl0ZW0pYXJnMDsKLSAgICAgICAgICAgIERPTUV4dGVuc2lvbkl0ZW0gYiA9IChET01FeHRlbnNpb25JdGVtKWFyZzE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGJlZ2luIHNwZWNpYWwgY2FzZSB0byBlbnN1cmUgJ3RleHQgbm9kZXMnIGNvbWUgbGFzdAotICAgICAgICAgICAgaWYgKGEuaXNUZXh0VmFsdWUoKSAmJiAhYi5pc1RleHRWYWx1ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gMTsgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGIuaXNUZXh0VmFsdWUoKSAmJiAhYS5pc1RleHRWYWx1ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICAgIC8vIGVuZCBzcGVjaWFsIGNhc2UKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgICAgIHJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoYS5nZXROYW1lKCksIGIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgQXJyYXlzLnNvcnQoaXRlbXMsIGNvbXBhcmF0b3IpOwotICAgICAgfSAgCi0gICAgICByZXR1cm4gaXRlbXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cikKLSAgICB7Ci0gICAgICBBdHRyIGF0dHIgPSAoQXR0cikgaW5wdXQ7Ci0gICAgICBET01FeHRlbnNpb25JdGVtIGl0ZW0gPSBET01FeHRlbnNpb25JdGVtLmNyZWF0ZUl0ZW1Gb3JBdHRyaWJ1dGVUZXh0KGF0dHIuZ2V0T3duZXJFbGVtZW50KCksIGF0dHIpOwotICAgICAgRE9NRXh0ZW5zaW9uSXRlbVtdIGl0ZW1zID0ge2l0ZW19OwotICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLSAgICByZXR1cm4gRU1QVFlfQVJSQVk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IGl0ZW0pCi0gIHsKLSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERPTUV4dGVuc2lvbkl0ZW0pCi0gICAgewotICAgICAgcmV0dXJuICgoRE9NRXh0ZW5zaW9uSXRlbSkgaXRlbSkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoT2JqZWN0IGl0ZW0pCi0gIHsKLSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERPTUV4dGVuc2lvbkl0ZW0pCi0gICAgewotICAgICAgcmV0dXJuICgoRE9NRXh0ZW5zaW9uSXRlbSkgaXRlbSkuZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UG9zc2libGVWYWx1ZXMoT2JqZWN0IGl0ZW0pCi0gIHsKLSAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERPTUV4dGVuc2lvbkl0ZW0pCi0gICAgewotICAgICAgcmV0dXJuICgoRE9NRXh0ZW5zaW9uSXRlbSkgaXRlbSkuZ2V0UG9zc2libGVWYWx1ZXMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRQcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24oRE9NRXh0ZW5zaW9uSXRlbSBpdGVtKQotICB7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IGl0ZW0uZ2V0TmFtZXNwYWNlKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBpdGVtLmdldE5hbWUoKTsKLSAgICBTdHJpbmcgcGFyZW50TmFtZSA9IGl0ZW0uZ2V0UGFyZW50TmFtZSgpOwotICAgIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBudWxsOwotICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBUT0RPIChjcykgcmVtb3ZlIHJlZmVyZW5jZSB0byBYU0RFZGl0b3JQbHVnaW4uLi4gbWFrZSBnZW5lcmljCi0gICAgICAvLyBwZXJoYXBzIHB1c2ggZG93biB0aGUgeG1sLnVpID8KLSAgICAgIC8vCi0gICAgICBOb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXROb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCk7Ci0gICAgICBOb2RlRWRpdG9yUHJvdmlkZXIgcHJvdmlkZXI9IHJlZ2lzdHJ5LmdldE5vZGVFZGl0b3JQcm92aWRlcihuYW1lc3BhY2UpOyAgICAgIAotICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb24gPSBwcm92aWRlci5nZXROb2RlRWRpdG9yQ29uZmlndXJhdGlvbihwYXJlbnROYW1lLCBuYW1lKTsKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRQYXJlbnROb2RlKGl0ZW0uZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICAgICAgICBpZiAoaXRlbS5nZXROb2RlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldE5vZGUoaXRlbS5nZXROb2RlKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZ1tdIHZhbHVlcyA9IGl0ZW0uZ2V0UG9zc2libGVWYWx1ZXMoKTsKLSAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDEpCi0gICAgewotICAgICAgY29uZmlndXJhdGlvbiA9IG5ldyBEZWZhdWx0TGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uKHZhbHVlcyk7Ci0gICAgfQotICAgIAotICAgIC8vIE5vdGUgdGhhdCBpdCBJUyBleHBlY3RlZCB0aGF0IHRoZSBjb25maWdhcmF0aW9uIG1heSBiZSBudWxsCi0gICAgLy8KLSAgICBpdGVtLnNldFByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTA1MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5UcmVlQ29udGVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlVGV4dFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWNsYXNzIERPTUV4dGVuc2lvbkl0ZW0gZXh0ZW5kcyBFeHRlbnNpb25JdGVtCi17Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBLSU5EX0VMRU1FTlRfQVRUUiA9IDE7Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBLSU5EX0VMRU1FTlRfVEVYVCA9IDI7Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBLSU5EX0VMRU1FTlRfQ01BVFRSSUJVVEUgPSAzOwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgS0lORF9BVFRSX1RFWFQgPSA0OwotICBpbnQga2luZDsKLSAgQXR0ciBhdHRyaWJ1dGU7Ci0gIEVsZW1lbnQgcGFyZW50OwotICBDTU5vZGUgY21Ob2RlOwotCi0gIHByaXZhdGUgRE9NRXh0ZW5zaW9uSXRlbShpbnQga2luZCwgRWxlbWVudCBwYXJlbnQsIEF0dHIgbm9kZSwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5hdHRyaWJ1dGUgPSBub2RlOwotICAgIHRoaXMuY21Ob2RlID0gY21Ob2RlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1RleHRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4ga2luZCA9PSBLSU5EX0VMRU1FTlRfVEVYVCB8fCBraW5kID09IEtJTkRfQVRUUl9URVhUOwotICB9Ci0KLSAgc3RhdGljIERPTUV4dGVuc2lvbkl0ZW0gY3JlYXRlSXRlbUZvckVsZW1lbnRUZXh0KEVsZW1lbnQgcGFyZW50KQotICB7Ci0gICAgcmV0dXJuIG5ldyBET01FeHRlbnNpb25JdGVtKEtJTkRfRUxFTUVOVF9URVhULCBwYXJlbnQsIG51bGwsIG51bGwpOwotICB9Ci0KLSAgc3RhdGljIERPTUV4dGVuc2lvbkl0ZW0gY3JlYXRlSXRlbUZvckVsZW1lbnRBdHRyaWJ1dGUoRWxlbWVudCBwYXJlbnQsIEF0dHIgYXR0cmlidXRlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBET01FeHRlbnNpb25JdGVtKEtJTkRfRUxFTUVOVF9BVFRSLCBwYXJlbnQsIGF0dHJpYnV0ZSwgbnVsbCk7Ci0gIH0KLQotICBzdGF0aWMgRE9NRXh0ZW5zaW9uSXRlbSBjcmVhdGVJdGVtRm9yRWxlbWVudEF0dHJpYnV0ZShFbGVtZW50IHBhcmVudCwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICAgIGlmIChhZCA9PSBudWxsKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibnVsbCEiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBET01FeHRlbnNpb25JdGVtKEtJTkRfRUxFTUVOVF9DTUFUVFJJQlVURSwgcGFyZW50LCBudWxsLCBhZCk7Ci0gIH0KLQotICBzdGF0aWMgRE9NRXh0ZW5zaW9uSXRlbSBjcmVhdGVJdGVtRm9yQXR0cmlidXRlVGV4dChFbGVtZW50IHBhcmVudCwgQXR0ciBhdHRyaWJ1dGUpCi0gIHsKLSAgICByZXR1cm4gbmV3IERPTUV4dGVuc2lvbkl0ZW0oS0lORF9BVFRSX1RFWFQsIHBhcmVudCwgYXR0cmlidXRlLCBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgICAgY2FzZSBLSU5EX0FUVFJfVEVYVCA6IHsKLSAgICAgICAgcmVzdWx0ID0gInZhbHVlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9BVFRSIDogewotICAgICAgICByZXN1bHQgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0NNQVRUUklCVVRFIDogewotICAgICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtTm9kZTsKLSAgICAgICAgcmVzdWx0ID0gYWQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9URVhUIDogewotICAgICAgICByZXN1bHQgPSAidGV4dCB2YWx1ZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICB7Ci0gICAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICAgIGNhc2UgS0lORF9BVFRSX1RFWFQgOgotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQVRUUiA6IHsKLSAgICAgICAgLy8gbm90ZSBpbnRlbnRpb25hbCBmYWxsLXRocnUhIQotICAgICAgICByZXR1cm4gYXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQ01BVFRSSUJVVEUgOiB7Ci0gICAgICAgIC8vIENTIDogb25lIHdvdWxkIHRoaW5rIHRoYXQgd2UnZCBqdXN0IG5lZWQgdG8gcmV0dXJuICIiIGhlcmUKLSAgICAgICAgLy8gYnV0IGFmdGVyIGVkaXRpbmcgYSBpdGVtIG9mIHRoaXMga2luZCBhbmQgZ2l2aW5nIGl0IHZhbHVlCi0gICAgICAgIC8vIHRoZSBsaXN0IG9mIGl0ZW0ncyBkb2Vzbid0IGdldCByZWNvbXB1dGVkLi4gc28gd2UgbmVlZCB0byB0cmljawotICAgICAgICAvLyBvbmUgb2YgdGhlc2UgaXRlbXMgdG8gYmVoYXZlIGxpa2UgdGhlIEtJTkRfRUxFTUVOVF9BVFRSIGNhc2UKLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyZW50LmdldEF0dHJpYnV0ZShjbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIHJldHVybiAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6ICIiOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfVEVYVCA6IHsKLSAgICAgICAgcmV0dXJuIG5ldyBUcmVlQ29udGVudEhlbHBlcigpLmdldEVsZW1lbnRUZXh0VmFsdWUocGFyZW50KTsgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcygpCi0gIHsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSB7fTsKLSAgICAgCi0gICAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICAgIGNhc2UgS0lORF9BVFRSX1RFWFQgOgotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQVRUUiA6IHsKLSAgICAgICAgLy8gbm90ZSBpbnRlbnRpb25hbCBmYWxsLXRocnUhIQotICAgICAgICBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICBpZiAobW9kZWxRdWVyeSAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IG1vZGVsUXVlcnkuZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyaWJ1dGUpOyAgICAgICAgCi0gICAgICAgICAgaWYgKGFkICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gbW9kZWxRdWVyeS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKHBhcmVudCwgYWQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0NNQVRUUklCVVRFIDogewotICAgICAgICBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICBpZiAobW9kZWxRdWVyeSAhPSBudWxsICYmIGNtTm9kZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gbW9kZWxRdWVyeS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKHBhcmVudCwgY21Ob2RlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX1RFWFQgOiB7Ci0gICAgICAgIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIGlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KTsKLSAgICAgICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgICAgICB7IAotICAgICAgICAgICAgcmVzdWx0ID0gbW9kZWxRdWVyeS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKHBhcmVudCwgZWQpOyAgICAgICAgICAgICAKLSAgICAgICAgICB9ICAKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVZhbHVlQ29tbWFuZChTdHJpbmcgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgICAgY2FzZSBLSU5EX0FUVFJfVEVYVCA6Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9BVFRSIDogewotICAgICAgICAvLyBub3RlIGludGVudGlvbmFsIGZhbGwtdGhydSEhICAgICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKHBhcmVudCwgYXR0cmlidXRlLmdldE5vZGVOYW1lKCksIG5ld1ZhbHVlLCB0cnVlKTsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0NNQVRUUklCVVRFIDogewotICAgICAgICBmaW5hbCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtTm9kZTsKLSAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQocGFyZW50LCBhZC5nZXRBdHRyTmFtZSgpLCBuZXdWYWx1ZSwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9URVhUIDogewotICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVRleHRWYWx1ZUNvbW1hbmQocGFyZW50LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgaWYgKGtpbmQgPT0gS0lORF9BVFRSX1RFWFQpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gYXR0cmlidXRlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSBwYXJlbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCkKLSAgewotICAgIE5vZGUgcGFyZW50Tm9kZSA9IG51bGw7Ci0gICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUgPSBhdHRyaWJ1dGUuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnQ7Ci0gICAgfQotICAgIHJldHVybiBwYXJlbnROb2RlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkKLSAgewotICAgIE5vZGUgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoKTsKLSAgICByZXR1cm4gcGFyZW50Tm9kZSAhPSBudWxsID8gcGFyZW50Tm9kZS5nZXRMb2NhbE5hbWUoKSA6ICIiOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzcwZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRE9NRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyIGltcGxlbWVudHMgRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyCi17Ci0gIHB1YmxpYyB2b2lkIGhhbmRsZUVkaXQoT2JqZWN0IGl0ZW0sIFdpZGdldCB3aWRnZXQpCi0gIHsgICAKLSAgfQotCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZUN1c3RvbUJ1dHRvbkNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSwgT2JqZWN0IGl0ZW0pCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBidXR0b24uc2V0VGV4dCgiLi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlQ3VzdG9tVGV4dENvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSwgT2JqZWN0IGl0ZW0pCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QnV0dG9uQ29udHJvbFN0eWxlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLlNUWUxFX05PTkU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHRDb250cm9sU3R5bGUoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBFeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIuU1RZTEVfTk9ORTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW1NZW51TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtTWVudUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzBjOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW1NZW51TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuWE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRE9NRXh0ZW5zaW9uSXRlbU1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIKLXsKLSAgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0gIHB1YmxpYyBET01FeHRlbnNpb25JdGVtTWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikKLSAgewotICAgIHRoaXMudHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpCi0gIHsKLSAgICBtYW5hZ2VyLnJlbW92ZUFsbCgpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudEltcGwgPSAoRWxlbWVudEltcGwpIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIElET01Eb2N1bWVudCBkb21Eb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIGVsZW1lbnRJbXBsLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgSW50ZXJuYWxOb2RlQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyID0gbmV3IEludGVybmFsTm9kZUFjdGlvbk1hbmFnZXIoZG9tRG9jdW1lbnQuZ2V0TW9kZWwoKSwgdHJlZVZpZXdlcik7Ci0gICAgICAgIGFjdGlvbk1hbmFnZXIuZmlsbENvbnRleHRNZW51KG1hbmFnZXIsIHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgCi0gIGNsYXNzIEludGVybmFsTm9kZUFjdGlvbk1hbmFnZXIgZXh0ZW5kcyBYTUxOb2RlQWN0aW9uTWFuYWdlcgotICB7Ci0gICAgcHVibGljIEludGVybmFsTm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgVmlld2VyIHZpZXdlcikKLSAgICB7Ci0gICAgICBzdXBlcihtb2RlbCwgdmlld2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cmlidXRlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTGlzdCBzZWxlY3Rpb24pCi0gICAgewotICAgICAgLy9tZW51LmFkZChuZXcgQWN0aW9uKCJ0aGVyZSIpe30pOyAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgIGludCBlZGl0TW9kZSA9IG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKTsKLSAgICAgIGludCBpYyA9IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLSAgICAgIGludCB2YyA9IChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpID8gTW9kZWxRdWVyeS5WQUxJRElUWV9TVFJJQ1QgOiBNb2RlbFF1ZXJ5LlZBTElESVRZX05PTkU7Ci0gICAgICBMaXN0IGltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gbnVsbDsKLQotICAgICAgaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHNlbGVjdGlvbi5nZXQoMCk7Ci0gICAgICAgIC8vIGNvbnRyaWJ1dGUgYWRkIGNoaWxkIGFjdGlvbnMKLSAgICAgICAgY29udHJpYnV0ZUFkZENoaWxkQWN0aW9ucyhtZW51LCBub2RlLCBpYywgdmMpOwotICAgICAgfQotICAgICAgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCA9IGdldFNlbGVjdGVkTm9kZXMoc2VsZWN0aW9uLCB0cnVlKTsKLSAgICAgICAgLy8gY29udHJpYnV0ZSBkZWxldGUgYWN0aW9ucwotICAgICAgICBjb250cmlidXRlRGVsZXRlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLSAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBtZW51LmFkZChuZXcgQWN0aW9uKGUuZ2V0TWVzc2FnZSgpKXt9KTsKLSAgICAgIH0KLSAgICAgIC8qCi0gICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIC8vIGNvbnRyaWJ1dGUgcmVwbGFjZSBhY3Rpb25zCi0gICAgICAgIGNvbnRyaWJ1dGVSZXBsYWNlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLSAgICAgIH0qLwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGRDaGlsZEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIE5vZGUgbm9kZSwgaW50IGljLCBpbnQgdmMpCi0gICAgewotICAgICAgaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotICAgICAgaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICAvLyAnQWRkIENoaWxkLi4uJyBhbmQgJ0FkZCBBdHRyaWJ1dGUuLi4nIGFjdGlvbnMKLSAgICAgICAgLy8KLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0gICAgICAgIE15TWVudU1hbmFnZXIgbmV3TWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKCJOZXciKXsKLSAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7IHJldHVybiB0cnVlOyB9ICAgICAgICAgIAotICAgICAgICB9Oy8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmV3TWVudS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBtZW51LmFkZChuZXdNZW51KTsKLSAgICAgICAgCi0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIC8vIGFkZCBpbnNlcnQgY2hpbGQgbm9kZSBhY3Rpb25zCi0gICAgICAgICAgLy8KLSAgICAgICAgICBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBtb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZWxlbWVudCwgZWQsIC0xLCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLSAgICAgICAgICBhZGRBY3Rpb25IZWxwZXIobmV3TWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5MDI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRE9NRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJTm9kZUFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBmYWNldDsKLSAgcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXI7Ci0gIAotICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gIHsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgfQotICAgIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50RWxlbWVudDsgICAgICAgIAotICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChub2RlKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkKLSAgewotICAgIE9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgcmV0dXJuIGNoaWxkcmVuLmxlbmd0aCA+IDA7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QgaW5wdXRFbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gIHsKLSAgICBpZiAodmlld2VyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICB2aWV3ZXIucmVmcmVzaCgpOwotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICB7Ci0gICAgLy8gdGhpcyBtZXRob2QgaXMgbm90IHVzZWQKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTczNTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIERPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfRUxFTUVOVF9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW1hZ2UgREVGQVVMVF9BVFRSX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICBwdWJsaWMgRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIoKQotICB7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXROb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZG9tRWxlbWVudCA9IChFbGVtZW50KSBlbGVtZW50OwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRvbUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgSUxhYmVsUHJvdmlkZXIgbHAgPSByZWdpc3RyeS5nZXRMYWJlbFByb3ZpZGVyKG5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChscCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSW1hZ2UgaW1nID0gbHAuZ2V0SW1hZ2UoZG9tRWxlbWVudCk7Ci0gICAgICAgICAgaWYgKGltZyAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGltZzsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gREVGQVVMVF9FTEVNRU5UX0lDT047Ci0gICAgfQotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXR0cikKLSAgICByZXR1cm4gREVGQVVMVF9BVFRSX0lDT047Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSAoRWxlbWVudCkgaW5wdXQ7Ci0gICAgICBTdHJpbmcgdGV4dFZhbCA9ICIiOwotCi0gICAgICBpZiAoZG9tRWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGRvbUVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLml0ZW0oMCk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVGV4dCkKLSAgICAgICAgewotICAgICAgICAgIFRleHQgdGV4dE5vZGUgPSAoVGV4dCkgbm9kZTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXRleHROb2RlLmdldE5vZGVWYWx1ZSgpLmNvbnRhaW5zKCJcbiIpKQotICAgICAgICAgICAgICB0ZXh0VmFsID0gIiBbIiArIHRleHROb2RlLmdldE5vZGVWYWx1ZSgpICsgIl0iOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRE9NRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGV4dFZhbCA9ICIiOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGRvbUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkgKyB0ZXh0VmFsOwotICAgIH0KLSAgICBpZiAoIGlucHV0IGluc3RhbmNlb2YgQXR0cil7Ci0gICAgICByZXR1cm4gKChBdHRyKSBpbnB1dCkuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmYWFjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlcgotewotICBPYmplY3RbXSBnZXRJdGVtcyhPYmplY3QgaW5wdXQpOwotICBTdHJpbmcgZ2V0TmFtZShPYmplY3QgaXRlbSk7Ci0gIFN0cmluZyBnZXRWYWx1ZShPYmplY3QgaXRlbSk7Ci0gIFN0cmluZ1tdIGdldFBvc3NpYmxlVmFsdWVzKE9iamVjdCBpdGVtKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25EZXRhaWxzVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzY0MWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25EZXRhaWxzVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLkRpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25EZXRhaWxzVmlld2VyIGV4dGVuZHMgVmlld2VyCi17Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJVEVNX0RBVEEgPSAiSVRFTV9EQVRBIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRURJVE9SX0NPTkZJR1VSQVRJT05fREFUQSA9ICJFRElUT1JfQ09ORklHVVJBVElPTl9EQVRBIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgQ29tcG9zaXRlIGNvbnRyb2w7ICAKLSAgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLSAgRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0gIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3Rvcnk7ICAKLSAgSW50ZXJuYWxDb250cm9sTGlzdGVuZXIgaW50ZXJuYWxDb250cm9sTGlzdGVuZXI7Ci0gIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0gIAotICBwdWJsaWMgRXh0ZW5zaW9uRGV0YWlsc1ZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KQotICB7Ci0gICAgdGhpcy53aWRnZXRGYWN0b3J5ID0gd2lkZ2V0RmFjdG9yeTsgICAgCi0gICAgY29udHJvbCA9ICB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotICAgIGludGVybmFsQ29udHJvbExpc3RlbmVyID0gbmV3IEludGVybmFsQ29udHJvbExpc3RlbmVyKCk7Ci0gICAgY29udHJvbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7ICAgIAotICB9Ci0gIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbW1hbmRTdGFjayhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKQotICB7Ci0gICAgdGhpcy5jb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQ29udHJvbCBjb250cm9sID0gY2hpbGRyZW5baV07Ci0gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpCi0gICAgICB7Ci0gICAgICAgICBFeHRlbnNpb25JdGVtIGl0ZW0gPSAoRXh0ZW5zaW9uSXRlbSljb250cm9sLmdldERhdGEoSVRFTV9EQVRBKTsKLSAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbnRlbnRQcm92aWRlci5nZXRWYWx1ZShpdGVtKTsgICAgICAgIAotICAgICAgICAoKFRleHQpY29udHJvbCkuc2V0VGV4dCh2YWx1ZSk7IAotICAgICAgfSAgCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRleHRPckNvbWJvQ29udHJvbChFeHRlbnNpb25JdGVtIGl0ZW0sIENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSBudWxsOwotICAgIFN0cmluZyB2YWx1ZSA9IGNvbnRlbnRQcm92aWRlci5nZXRWYWx1ZShpdGVtKTsKLSAgICBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBlZGl0b3JDb25maWd1cmF0aW9uID0gaXRlbS5nZXRQcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24oKTsKLQotICAgIGlmIChlZGl0b3JDb25maWd1cmF0aW9uICE9IG51bGwgJiYgaGFzU3R5bGUoZWRpdG9yQ29uZmlndXJhdGlvbiwgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uU1RZTEVfQ09NQk8pKQotICAgIHsgICAgICAgICAgCi0gICAgICBMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24pZWRpdG9yQ29uZmlndXJhdGlvbjsKLSAgICAgIENDb21ibyBjb21ibyA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgICBjb21iby5zZXRUZXh0KHZhbHVlKTsKLSAgICAgIE9iamVjdFtdIHZhbHVlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0VmFsdWVzKGl0ZW0pOwotICAgICAgTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykKLSAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgT2JqZWN0IG8gPSB2YWx1ZXNbal07Ci0gICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IGxhYmVsUHJvdmlkZXIgIT0gbnVsbCA/Ci0gICAgICAgICAgICBsYWJlbFByb3ZpZGVyLmdldFRleHQobykgOgotICAgICAgICAgICAgICBvLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBjb21iby5hZGQoZGlzcGxheU5hbWUpOwotICAgICAgfQotICAgICAgY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgY29udHJvbCA9IGNvbWJvOwotICAgIH0KLSAgICBpZiAoY29udHJvbCA9PSBudWxsKQotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IHdpZGdldEZhY3RvcnkuY3JlYXRlVGV4dChjb21wb3NpdGUsdmFsdWUpOwotICAgICAgdGV4dC5hZGRLZXlMaXN0ZW5lcihpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcik7Ci0gICAgICBjb250cm9sID0gdGV4dDsgCi0gICAgfSAKLSAgICBjb250cm9sLnNldERhdGEoSVRFTV9EQVRBLCBpdGVtKTsKLSAgICBjb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGNvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcihpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcik7ICAgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25Db250cm9sKEV4dGVuc2lvbkl0ZW0gaXRlbSwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICAgIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGVkaXRvckNvbmZpZ3VyYXRpb24gPSBpdGVtLmdldFByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbigpOwotICAgIGlmIChlZGl0b3JDb25maWd1cmF0aW9uICE9IG51bGwgJiYgaGFzU3R5bGUoZWRpdG9yQ29uZmlndXJhdGlvbiwgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uU1RZTEVfRElBTE9HKSkKLSAgICB7ICAgIAotICAgICAgRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IChEaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbillZGl0b3JDb25maWd1cmF0aW9uOyAgICAgICAgICAgIAotICAgICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZ3JpZERhdGEuaGVpZ2h0SGludCA9IDE3OwotICAgICAgYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGludGVybmFsQ29udHJvbExpc3RlbmVyKTsKLSAgICAgIGJ1dHRvbi5zZXREYXRhKElURU1fREFUQSwgaXRlbSk7Ci0gICAgICBidXR0b24uc2V0RGF0YShFRElUT1JfQ09ORklHVVJBVElPTl9EQVRBLCBjb25maWd1cmF0aW9uKTsKLSAgICAgIFN0cmluZyB0ZXh0ID0gY29uZmlndXJhdGlvbi5nZXRCdXRvblRleHQoKTsKLSAgICAgIGlmICh0ZXh0ICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgYnV0dG9uLnNldFRleHQodGV4dCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0gIAotICAgICAgYnV0dG9uLnNldEltYWdlKGNvbmZpZ3VyYXRpb24uZ2V0QnV0dG9uSW1hZ2UoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBDb250cm9sIHBsYWNlSG9sZGVyID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgcGxhY2VIb2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICBwbGFjZUhvbGRlci5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIHBsYWNlSG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOyAKLSAgICB9ICAgICAgCi0gIH0gCi0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpCi0gIHsgCi0gICAgLy8gVE9ETyAoY3MpIGFkZCBhc3NlcnRpb25zCi0gICAgLy8KLSAgICBpZiAoY29udGVudFByb3ZpZGVyID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKGNvbXBvc2l0ZSAhPSBudWxsKQotICAgIHsvKgotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29udHJvbHNUaGF0V2VBcmVMaXN0ZW5pbmdUby5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbClpLm5leHQoKTsgICAgICAgCi0gICAgICAgIGlmIChjb250cm9sICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIGNvbnRyb2wucmVtb3ZlRm9jdXNMaXN0ZW5lcihpbnRlcm5hbEZvY3VzTGlzdGVuZXIpOwotICAgICAgICB9ICAKLSAgICAgIH0gKi8gCi0gICAgICByZW1vdmVMaXN0ZW5lcnMoKTsKLSAgICAgIGNvbXBvc2l0ZS5kaXNwb3NlKCk7ICAgICAgIAotICAgIH0gICAKLQotICAgIGNvbXBvc2l0ZSA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNvbnRyb2wpOwotICAgIGNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICBPYmplY3RbXSBpdGVtcyA9IGNvbnRlbnRQcm92aWRlci5nZXRJdGVtcyhpbnB1dCk7ICAgICAgCi0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEV4dGVuc2lvbkl0ZW0gaXRlbSA9IChFeHRlbnNpb25JdGVtKWl0ZW1zW2ldOwotICAgICAgU3RyaW5nIG5hbWUgPSBjb250ZW50UHJvdmlkZXIuZ2V0TmFtZShpdGVtKTsKLSAgICAgIExhYmVsIGxhYmVsID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIG5hbWUgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLSAgICAgIGNyZWF0ZVRleHRPckNvbWJvQ29udHJvbChpdGVtLCBjb21wb3NpdGUpOwotICAgICAgY3JlYXRlQnV0dG9uQ29udHJvbChpdGVtLCBjb21wb3NpdGUpOwotICAgIH0gIAotICAgIGNvbnRyb2wubGF5b3V0KHRydWUpOyAgICAKLSAgfQotICAgIAotICBwcml2YXRlIGJvb2xlYW4gaGFzU3R5bGUoTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgaW50IHN0eWxlKQotICB7Ci0gICAgcmV0dXJuIChjb25maWd1cmF0aW9uLmdldFN0eWxlKCkgJiBzdHlsZSkgIT0gMDsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiByZXZlYWwpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLSAgcHVibGljIEV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBjb250ZW50UHJvdmlkZXI7Ci0gIH0KLSAgcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKEV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBhcHBseUVkaXQoRXh0ZW5zaW9uSXRlbSBpdGVtLCBXaWRnZXQgd2lkZ2V0KQotICB7Ci0gICAgaWYgKGl0ZW0gIT0gbnVsbCkKLSAgICB7ICAgIAotICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgewotICAgICAgICBUZXh0IHRleHQgPSAoVGV4dCl3aWRnZXQ7Ci0gICAgICAgIHZhbHVlID0gdGV4dC5nZXRUZXh0KCk7ICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ0NvbWJvKQotICAgICAgewotICAgICAgICBDQ29tYm8gY29tYm8gPSAoQ0NvbWJvKXdpZGdldDsKLSAgICAgICAgaW50IGluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICB7ICAKLSAgICAgICAgICB2YWx1ZSA9IGNvbWJvLmdldEl0ZW0oaW5kZXgpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgCi0gICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBpdGVtLmdldFVwZGF0ZVZhbHVlQ29tbWFuZCh2YWx1ZSk7Ci0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY29tbWFuZFN0YWNrICE9IG51bGwpCi0gICAgICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgfSAgICAgICAgICAgICAgCi0gIH0KLSAgCi0gIGNsYXNzIEludGVybmFsQ29udHJvbExpc3RlbmVyIGltcGxlbWVudHMgRm9jdXNMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIsIEtleUxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIC8vIGZvciBidXR0b24gY29udHJvbHMgd2UgaGFuZGxlIHNlbGVjdGlvbiBldmVudHMKLSAgICAgIC8vICAgICAgICAKLSAgICAgIE9iamVjdCBpdGVtID0gZS53aWRnZXQuZ2V0RGF0YShFRElUT1JfQ09ORklHVVJBVElPTl9EQVRBKTsKLSAgICAgIGlmIChpdGVtID09IG51bGwpCi0gICAgICAgIGl0ZW0gPSBlLndpZGdldC5nZXREYXRhKElURU1fREFUQSk7ICAgIAotICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBEaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gPSAoRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24paXRlbTsgICAgICAgIAotICAgICAgICBkaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5pbnZva2VEaWFsb2coKTsgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeHRlbnNpb25JdGVtKQotICAgICAgewotICAgICAgICBhcHBseUVkaXQoKEV4dGVuc2lvbkl0ZW0paXRlbSwgZS53aWRnZXQpOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICAvLyBkbyBub3RoaW5nICAgICAgCi0gICAgfSAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpCi0gICAgewotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkKLSAgICB7Ci0gICAgICAvLyBhcHBseSBlZGl0cyBmb3IgdGV4dCBhbmQgY29tYm8gYm94IGNvbnRyb2xzCi0gICAgICAvLyB2aWEgdGhlIGZvY3VzTG9zdCBldmVudAotICAgICAgT2JqZWN0IGl0ZW0gPSBlLndpZGdldC5nZXREYXRhKElURU1fREFUQSk7Ci0gICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4dGVuc2lvbkl0ZW0pCi0gICAgICB7Ci0gICAgICAgIGFwcGx5RWRpdCgoRXh0ZW5zaW9uSXRlbSlpdGVtLCBlLndpZGdldCk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgIHsKLSAgICAgIC8vIGhhbmRsZSBleHBsaWN0IEVOVEVSIGtleQotICAgICAgT2JqZWN0IGl0ZW0gPSBlLndpZGdldC5nZXREYXRhKElURU1fREFUQSk7Ci0gICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4dGVuc2lvbkl0ZW0pCi0gICAgICB7Ci0gICAgICAgIGlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpCi0gICAgICAgICAgYXBwbHlFZGl0KChFeHRlbnNpb25JdGVtKWl0ZW0sIGUud2lkZ2V0KTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKQotICAgIHsKLSAgICAgIC8vIElnbm9yZSB0aGVzZSBldmVudHMKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVycygpCi0gIHsKLSAgICBpZiAoY29tcG9zaXRlICE9IG51bGwgJiYgIWNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgQ29udHJvbCBbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIENvbnRyb2wgbyA9IGNoaWxkcmVuW2ldOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIENDb21ibykKLSAgICAgICAgewotICAgICAgICAgICgoQ0NvbWJvKW8pLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGludGVybmFsQ29udHJvbExpc3RlbmVyKTsKLSAgICAgICAgICBvLnJlbW92ZUZvY3VzTGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgKChUZXh0KW8pLnJlbW92ZUtleUxpc3RlbmVyKGludGVybmFsQ29udHJvbExpc3RlbmVyKTsKLSAgICAgICAgICBvLnJlbW92ZUZvY3VzTGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2NzgwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVFZGl0b3JDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaW9uSXRlbQotewotICBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBwcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb247Ci0KLSAgcHVibGljIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGdldFByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gcHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIHByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbikKLSAgewotICAgIHRoaXMucHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uID0gcHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uOwotICB9ICAKLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCBDb21tYW5kIGdldFVwZGF0ZVZhbHVlQ29tbWFuZChTdHJpbmcgbmV3VmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODRhZDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotIAotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovIAotcHVibGljIGludGVyZmFjZSBFeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIKLXsgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9OT05FID0gIm5vbmUiOyAgIC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9URVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVfQ09NQk8gPSAiY29tYm8iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX0NVU1RPTSA9ICJjdXN0b20iOyAgICAgLy8kTk9OLU5MUy0xJAotICAKLSAgdm9pZCBoYW5kbGVFZGl0KE9iamVjdCBpdGVtLCBXaWRnZXQgd2lkZ2V0KTsKLSAgU3RyaW5nIGdldFRleHRDb250cm9sU3R5bGUoT2JqZWN0IGl0ZW0pOwotICBTdHJpbmcgZ2V0QnV0dG9uQ29udHJvbFN0eWxlKE9iamVjdCBpdGVtKTsKLSAgQ29udHJvbCBjcmVhdGVDdXN0b21UZXh0Q29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlLCBPYmplY3QgaXRlbSk7Ci0gIENvbnRyb2wgY3JlYXRlQ3VzdG9tQnV0dG9uQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlLCBPYmplY3QgaXRlbSk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTk5YzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotLy8gY3M6IFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIHN1cHBsaW1lbnQgdGhlIE5vZGVGaWx0ZXIgY2xhc3MKLS8vIHRoYXQgY2FuIGJlIHNwZWNpZmllZCB2aWEgdGhlIGN1c3RvbWl6YXRpb24gZXh0ZW5zaW9ucyBwb2ludC4KLS8vIFdoZW4gdGhlIGluaXRpYWwgbGlzdCBvZiBhIGNhdGVnb3J5J3Mgb2JqZWN0cyBpcyBkaXNwbGF5ZWQgCi0vLyB3ZSdsbCB1c2UgYSBOb2RlRmlsdGVyIHRvIHBydW5lIHRoZSBsaXN0LiAgSWYgdGhlIE5vZGVGaWx0ZXIKLS8vIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2Ugd2UnbGwgY2FsbCB0aGlzIGludGVyZmFjZSdzIGlzQXBwbGljYWJsZUNvbnRleHQKLS8vIG1ldGhvZCBpbnN0ZWFkIG9mIHRoZSBOb2RlRmlsdGVyJ3MgRE9NIG5vZGUgYmFzZWQgbWV0aG9kLiAgVGhpcyBwcm92aWRlcyAKLS8vIGFyZSBhIG1vcmUgY29udmVuaWVudCBpbnRlcmZhY2UgZm9yIGNsaWVudHMgd2hvIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gCi0vLyBmaWx0ZXIgdGhlIGxpc3QgcHJlc2VudGVkIHZpYSB0aGUgQWRkRXh0ZW5zaW9uQ29tcG9uZW50RGlhbG9nLgotLy8gU2VlIHRoZSBjbGFzcyBFeHRlbnNpb25zU2VjdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgotLy8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaW9uSXRlbUZpbHRlcgotewotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVDb250ZXh0KFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgY2FuZGlkYXRlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmMzYWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQURERURfRVhUX1NDSEVNQVMgPSAiVVNFUi1BRERFRC1FWFQtU0NIRU1BUyI7ICAvLyBUT0RPIGV4dGVybmFsaXplCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9QUkVGSVggPSAicGxhdGZvcm06L3BsdWdpbi8iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZTkFNRSA9ICJkaXNwbGF5TmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFVVJJID0gIm5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERklMRVVSTCA9ICJ4c2RGaWxlVVJMIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTFBST1ZJREVSID0gImxhYmVsUHJvdmlkZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0NPTU1BTkRfQ0xBU1MgPSAiYWRkQ29tbWFuZENsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfQ09NTUFORF9DTEFTUyA9ICJkZWxldGVDb21tYW5kQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX1BST1ZJREVSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvbklkOwotCi0gIHByb3RlY3RlZCBBcnJheUxpc3QgbnNVUklQcm9wZXJ0aWVzLCBjYXRlZ29yeVByb3ZpZGVyTGlzdDsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVwcmVjYXRlZEV4dGVuc2lvbklkOwotICAKLSAgcHVibGljIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoU3RyaW5nIGFwcGluZm9fZXh0ZW5zaW9uaWQpCi0gIHsKLSAgICBleHRlbnNpb25JZCA9IGFwcGluZm9fZXh0ZW5zaW9uaWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIF9faW50ZXJuYWxTZXREZXByZWNhdGVkRXh0ZW5zaW9uSWQoU3RyaW5nIGRlcHJlY2F0ZWRJZCkKLSAgewotICAgIGRlcHJlY2F0ZWRFeHRlbnNpb25JZCA9IGRlcHJlY2F0ZWRJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJlZlN0b3JlKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpCi0gIHsKLQkgIHByZWZTdG9yZSA9IHN0b3JlOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oKQotICB7ICAKLSAgICAvLyBJZiB3ZSByZWFkIHRoZSByZWdpc3RyeSwgdGhlbiBsZXQncyBub3QgZG8gaXQgYWdhaW4uCi0gICAgaWYgKG5zVVJJUHJvcGVydGllcyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBuc1VSSVByb3BlcnRpZXM7Ci0gICAgfQotIAotICAgIG5zVVJJUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBjYXRlZ29yeVByb3ZpZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKGV4dGVuc2lvbklkKTsKLSAgICBpZiAoZGVwcmVjYXRlZEV4dGVuc2lvbklkICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oZGVwcmVjYXRlZEV4dGVuc2lvbklkKTsgICAgIAotICAgIH0gIAotICAgIAotICAgIC8vIGdldCB1c2VyLWFkZGVkIHNjaGVtYXMgc3RvcmVkIGluIHByZWZlcmVuY2UKLSAgICBpZiAocHJlZlN0b3JlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gcHJlZlN0b3JlLmdldFN0cmluZyhVU0VSX0FEREVEX0VYVF9TQ0hFTUFTKTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiXG4iKTsKLSAgIAotICAgICAgd2hpbGUgKCB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpICkKLSAgICAgIHsKLSAgICAgICAgbnNVUklQcm9wZXJ0aWVzLmFkZCggbmV3IFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKCB0b2tlbml6ZXIubmV4dFRva2VuKCkgKSApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnNVUklQcm9wZXJ0aWVzOwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oU3RyaW5nIGlkKQotICB7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gYXNpUHJvcGVydGllc0xpc3QgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihpZCk7Ci0KLSAgICBib29sZWFuIGhhc0FTSVByb3BlcnRpZXMgPSAoYXNpUHJvcGVydGllc0xpc3QgIT0gbnVsbCkgJiYgKGFzaVByb3BlcnRpZXNMaXN0Lmxlbmd0aCA+IDApOwotCi0gICAgaWYgKGhhc0FTSVByb3BlcnRpZXMpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhc2lQcm9wZXJ0aWVzTGlzdC5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFzaVByb3BlcnRpZXNFbGVtZW50ID0gYXNpUHJvcGVydGllc0xpc3RbaV07Ci0gICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldE5hbWUoKTsKLQotICAgICAgICBpZiAoImNhdGVnb3J5Ii5lcXVhbHMoZWxlbWVudE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0QXR0cmlidXRlKERFU0NSSVBUSU9OKTsKLSAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoRElTUExBWU5BTUUpOwotICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoTkFNRVNQQUNFVVJJKTsKLSAgICAgICAgICBTdHJpbmcgeHNkRmlsZVVSTCA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShYU0RGSUxFVVJMKTsKLSAgICAgICAgICBTdHJpbmcgbGFiZWxQcm92aWRlckNsYXNzID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0QXR0cmlidXRlKExBQkVMUFJPVklERVIpOwotICAgICAgICAgIFN0cmluZyBhZGRDb21tYW5kQ2xhc3MgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoQUREX0NPTU1BTkRfQ0xBU1MpOwotICAgICAgICAgIFN0cmluZyBkZWxldGVDb21tYW5kQ2xhc3MgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoREVMRVRFX0NPTU1BTkRfQ0xBU1MpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChkaXNwbGF5TmFtZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRpc3BsYXkgbmFtZSwgZm9yY2UgdGhlIHVzZXIKLSAgICAgICAgICAgIC8vIHRvIG1hbnVhbGx5IGNyZWF0ZSBhIG5hbWUuIFRoZXJlZm9yZSwgd2UgaWdub3JlIGVudHJ5IHdpdGhvdXQKLSAgICAgICAgICAgIC8vIGEgZGlzcGxheSBuYW1lLgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHhzZEZpbGVVUkwgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RGaWxlVVJMID0gbG9jYXRlRmlsZVVzaW5nQ2F0YWxvZyhuYW1lc3BhY2VVUkkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGV4dGVuc2lvbnNTY2hlbWFTcGVjID0gY3JlYXRlRW50cnkoKTsKLSAgICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlYy5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWMuc2V0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUpOwotICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2VVUkkpOwotICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldERlZmF1dFNjaGVtYSgpOwotCi0gICAgICAgICAgU3RyaW5nIHBsdWdpbklkID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICBpZiAobGFiZWxQcm92aWRlckNsYXNzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLmxvYWRDbGFzcyhsYWJlbFByb3ZpZGVyQ2xhc3MpOwotICAgICAgICAgICAgICBpZiAodGhlQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhYmVsUHJvdmlkZXIgPSAoSUxhYmVsUHJvdmlkZXIpIHRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlYy5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmIChhZGRDb21tYW5kQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgYWRkQ29tbWFuZCA9IChFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZClhc2lQcm9wZXJ0aWVzRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFERF9DT01NQU5EX0NMQVNTKTsKLSAgICAgICAgICAgICAgaWYgKGFkZENvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKGFkZENvbW1hbmQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGRlbGV0ZUNvbW1hbmRDbGFzcyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgZGVsZXRlQ29tbWFuZCA9IChFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQpYXNpUHJvcGVydGllc0VsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihERUxFVEVfQ09NTUFORF9DTEFTUyk7Ci0gICAgICAgICAgICAgIGlmIChkZWxldGVDb21tYW5kICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlYy5zZXRFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoZGVsZXRlQ29tbWFuZCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlYy5zZXRMb2NhdGlvbihMT0NBVElPTl9QUkVGSVggKyBwbHVnaW5JZCArICIvIiArIHhzZEZpbGVVUkwpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICBuc1VSSVByb3BlcnRpZXMuYWRkKGV4dGVuc2lvbnNTY2hlbWFTcGVjKTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJjYXRlZ29yeVByb3ZpZGVyIi5lcXVhbHMoZWxlbWVudE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGNhdGVnb3J5UHJvdmlkZXJDbGFzcyA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShDQVRFR09SWV9QUk9WSURFUl9DTEFTUyk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGNhdGVnb3J5UHJvdmlkZXJDbGFzcyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBDYXRlZ29yeVByb3ZpZGVyIGNhdGVnb3J5UHJvdmlkZXIgPSAoQ2F0ZWdvcnlQcm92aWRlcilhc2lQcm9wZXJ0aWVzRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENBVEVHT1JZX1BST1ZJREVSX0NMQVNTKTsKLSAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5UHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhdGVnb3J5UHJvdmlkZXJMaXN0LmFkZChjYXRlZ29yeVByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnNVUklQcm9wZXJ0aWVzOwotICB9Ci0gIAotICBwdWJsaWMgRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgZ2V0QWRkRXh0ZW5zaW9uQ29tbWFuZChTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgLy8gRGlkbid0IHJldHJpZXZlIHRoZSBjb25maWcgZWxlbWVudHMgeWV0LgotICAgIGlmIChuc1VSSVByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbigpOwotICAgIH0KLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuc1VSSVByb3BlcnRpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKWkubmV4dCgpOwotICAgICAgU3RyaW5nIG5zVVJJID0gc3BlYy5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuc1VSSSAhPSBudWxsICYmIG5zVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgewotICAgICAgICByZXR1cm4gc3BlYy5nZXRFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNhdGVnb3J5UHJvdmlkZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ2F0ZWdvcnlQcm92aWRlciBjYXRlZ29yeVByb3ZpZGVyID0gKENhdGVnb3J5UHJvdmlkZXIpaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBjYXRlZ29yeVByb3ZpZGVyLmdldENhdGVnb3JpZXMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBqLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3BlYy5nZXRFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIGdldFJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICAvLyBEaWRuJ3QgcmV0cmlldmUgdGhlIGNvbmZpZyBlbGVtZW50cyB5ZXQuCi0gICAgaWYgKG5zVVJJUHJvcGVydGllcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IG5zVVJJUHJvcGVydGllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbnNVUkkgPSBzcGVjLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5zVVJJICE9IG51bGwgJiYgbnNVUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBzcGVjLmdldEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjYXRlZ29yeVByb3ZpZGVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENhdGVnb3J5UHJvdmlkZXIgY2F0ZWdvcnlQcm92aWRlciA9IChDYXRlZ29yeVByb3ZpZGVyKWkubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gY2F0ZWdvcnlQcm92aWRlci5nZXRDYXRlZ29yaWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgai5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBzcGVjLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwgJiYgbmFtZXNwYWNlVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHNwZWMuZ2V0RXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldENhdGVnb3J5UHJvdmlkZXJzKCkKLSAgewotICAgIGlmIChuc1VSSVByb3BlcnRpZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbigpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY2F0ZWdvcnlQcm92aWRlckxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGNyZWF0ZUVudHJ5KCkKLSAgewotICAgIHJldHVybiBuZXcgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgbG9jYXRpb24gZm9yIHRoZSBzY2hlbWEgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlVVJJIGJ5Ci0gICAqIGxvb2tpbmcgYXQgdGhlIFhNTCBjYXRhbG9nLiBXZSBsb29rIG9ubHkgaW4gdGhlIHBsdWdpbiBzcGVjaWZpZWQgZW50cmllcyBvZgotICAgKiB0aGUgY2F0YWxvZy4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLSAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRlRmlsZVVzaW5nQ2F0YWxvZyhTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotICAgIFN0cmluZyByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlKCIiLCBuYW1lc3BhY2VVUkksICIiKTsKLSAgICByZXR1cm4gcmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oIiIsIG5hbWVzcGFjZVVSSSwgcmVzdWx0KTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vU2VsZWN0RnJvbUNhdGFsb2dEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9TZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjI3MzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9TZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5DYXRhbG9nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nRW50cmllc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dUcmVlVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RnJvbUNhdGFsb2dEaWFsb2cgZXh0ZW5kcyBEaWFsb2cKLXsKLQotICBwcml2YXRlIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZzsKLSAgcHJpdmF0ZSBJQ2F0YWxvZyB1c2VyQ2F0YWxvZzsKLSAgcHJpdmF0ZSBJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZzsKLSAgcHJpdmF0ZSBYTUxDYXRhbG9nRW50cmllc1ZpZXcgY2F0YWxvZ0VudHJpZXNWaWV3OwotICBwcml2YXRlIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFNlbGVjdGlvbkxvY2F0aW9uOwotICBwcml2YXRlIFN0cmluZyBjdXJyZW50U2VsZWN0aW9uTmFtZXNwYWNlOwotCi0gIHB1YmxpYyBTZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLQotICAgIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLSAgICBJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLSAgICAgIElDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotICAgICAgaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIHN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChYTUxDb3JlUGx1Z2luLlVTRVJfQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICB1c2VyQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gd2UgY3JlYXRlIGEgd29ya2luZyBjb3B5IG9mIHRoZSAnVXNlciBTZXR0aW5ncycgZm9yIHRoZSBDYXRhbG9nCi0gICAgLy8gdGhhdCB3ZSBjYW4gbW9kaWZ5Ci0gICAgQ2F0YWxvZ1NldCB0ZW1wQ2F0YWxvZ1NldCA9IG5ldyBDYXRhbG9nU2V0KCk7Ci0gICAgd29ya2luZ1VzZXJDYXRhbG9nID0gdGVtcENhdGFsb2dTZXQubG9va3VwT3JDcmVhdGVDYXRhbG9nKCJ3b3JraW5nIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIC8vIFRPRE86IGFkZCBlbnRyaWVzIGZyb20gdGhlIG5lc3RlZCBjYXRhbG9ncyBhcyB3ZWxsCi0gICAgd29ya2luZ1VzZXJDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyh1c2VyQ2F0YWxvZyk7Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ3JpZERhdGEuaGVpZ2h0SGludCA9IDUwMDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgY3JlYXRlQ2F0YWxvZ0VudHJpZXNWaWV3KGNvbXBvc2l0ZSk7Ci0gICAgY3JlYXRlQ2F0YWxvZ0RldGFpbHNWaWV3KGNvbXBvc2l0ZSk7Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2F0YWxvZ0VudHJpZXNWaWV3KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBncmlkRGF0YS53aWR0aEhpbnQgPSAzNzA7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgZ3JvdXAuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfVVNFUl9FTlRSSUVTKTsKLSAgICBncm91cC5zZXRUb29sVGlwVGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfVVNFUl9FTlRSSUVTX1RPT0xfVElQKTsKLQotICAgIC8qCi0gICAgICogY3JlYXRlIGEgc3ViY2xhc3Mgb2YgWE1MQ2F0YWxvZ0VudHJpZXNWaWV3IHdoaWNoIHN1cHByZXNzZXMgLSB0aGUKLSAgICAgKiBjcmVhdGlvbiBvZiAnQWRkJywgJ0VkaXQnLCAnRGVsZXRlJyBidXR0b25zIC0gYW55IG1ldGhvZCBpbnZvbHZpbmcgdGhlCi0gICAgICogYWJvdmUgYnV0dG9ucwotICAgICAqLwotICAgIGNhdGFsb2dFbnRyaWVzVmlldyA9IG5ldyBYTUxDYXRhbG9nRW50cmllc1ZpZXcoZ3JvdXAsIHdvcmtpbmdVc2VyQ2F0YWxvZywgc3lzdGVtQ2F0YWxvZykKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICB9OwotCi0gICAgLy8gT25seSBYTUwgU2NoZW1hIGVudHJ5IGlzIHNlbGVjdGFibGUKLSAgICBjYXRhbG9nRW50cmllc1ZpZXcuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIgY2F0YWxvZ1RyZWVWaWV3ZXIgPSAoKFhNTENhdGFsb2dUcmVlVmlld2VyKSBjYXRhbG9nRW50cmllc1ZpZXcuZ2V0Vmlld2VyKCkpOwotICAgIGNhdGFsb2dUcmVlVmlld2VyLnJlc2V0RmlsdGVycygpOwotCi0gICAgY2F0YWxvZ1RyZWVWaWV3ZXIuYWRkRmlsdGVyKG5ldyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIobmV3IFN0cmluZ1tdIHsgIi54c2QiIH0pKTsKLSAgfQotCi0gIC8vIEJ1ZyBpbiB0aGUgZmlsdGVyIG9mIHRoZSBYTUwgcGx1Z2luLCBoYXZlIHRvIGdpdmUgYSBjb3JyZWN0IHZlcnNpb24gaGVyZQotICAvLyBUT0RPOiBXYWl0aW5nIGZvciB0aGUgZml4IHRvIGJlIGNvbW1pdGVkIHRvIFhNTCBwbHVnaW4gYW5kCi0gIC8vIGJlIHVzZWQgYnkgY29uc3RlbGxhdGlvbgotICBwcml2YXRlIGNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlcgotICB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFczX1hNTFNDSEVNQV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS8iOwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCi0gICAgcHVibGljIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihTdHJpbmdbXSBleHRlbnNpb25zMSkKLSAgICB7Ci0gICAgICB0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KQotICAgICAgewotICAgICAgICBJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBlbGVtZW50OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpZiB0aGUgZXh0ZW5zaW9uIGlzIGNvcnJlY3QgYW5kIHRoZSBuYW1lc3BhY2UgaW5kaWNhdGVzCi0gICAgICAgICAgLy8gdGhhdCB0aGlzIGVudHJ5IGlzIG5vdCB0aGUgVzMgWE1MIFNjaGVtYQotICAgICAgICAgIGlmIChjYXRhbG9nRW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoZXh0ZW5zaW9uc1tpXSkgJiYgIWNhdGFsb2dFbnRyeS5nZXRLZXkoKS5zdGFydHNXaXRoKFczX1hNTFNDSEVNQV9OQU1FU1BBQ0UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVsZW1lbnQuZXF1YWxzKFhNTENhdGFsb2dUcmVlVmlld2VyLlBMVUdJTl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QpIHx8IGVsZW1lbnQuZXF1YWxzKFhNTENhdGFsb2dUcmVlVmlld2VyLlVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNhdGFsb2dEZXRhaWxzVmlldyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgR3JvdXAgZGV0YWlsc0dyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGRldGFpbHNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBkZXRhaWxzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIGRldGFpbHNHcm91cC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTKTsKLSAgICBmaW5hbCBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyBkZXRhaWxzVmlldyA9IG5ldyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyhkZXRhaWxzR3JvdXApOwotICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIE9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLSAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkKLSAgICAgICAgewotICAgICAgICAgIElDYXRhbG9nRW50cnkgZW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgICAgZGV0YWlsc1ZpZXcuc2V0Q2F0YWxvZ0VsZW1lbnQoZW50cnkpOwotICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb25Mb2NhdGlvbiA9IGVudHJ5LmdldFVSSSgpOwotICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2UgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkZXRhaWxzVmlldy5zZXRDYXRhbG9nRWxlbWVudCgoSUNhdGFsb2dFbnRyeSkgbnVsbCk7Ci0gICAgICAgICAgY3VycmVudFNlbGVjdGlvbkxvY2F0aW9uID0gIiI7Ci0gICAgICAgICAgY3VycmVudFNlbGVjdGlvbk5hbWVzcGFjZSA9ICIiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBjYXRhbG9nRW50cmllc1ZpZXcuZ2V0Vmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFNlbGVjdGlvbkxvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uTG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1NwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGE5YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1NwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVGaWx0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYQotewotICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0gIHByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLSAgcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFNjaGVtYSA9IGZhbHNlOwotICBwcml2YXRlIEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kIGFkZENvbW1hbmQ7Ci0gIHByaXZhdGUgRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIHJlbW92ZUNvbW1hbmQ7Ci0gIHByaXZhdGUgTm9kZUZpbHRlciBub2RlRmlsdGVyOwotICBwcml2YXRlIFN0cmluZyBjbGFzc2lmaWNhdGlvbjsKLSAgCi0gIC8qKgotICAgKiBFaXRoZXIgdGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoIG9mIHRoZSB4c2QgZmlsZSBvciB0aGUgbmFtZXNwYWNlCi0gICAqIG9mIHRoZSB4c2QgZmlsZSAoaWYgaXQgY29tZSBmcm9tIHRoZSBDYXRhbG9nKSAKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHNvdXJjZUhpbnQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBmcm9tQ2F0YWxvZzsKLQotICBwdWJsaWMgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYShTdHJpbmcgZGVzYykgewotCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRlc2MsICJcdCIpOwotCQotCS8vIHdlIG11c3QgYmUgc3VyZSB0aGF0IGVhY2ggJ2Rlc2MnIGNvbnRhaW5zIGluZm8gaW4gY29ycmVjdCBmb3JtYXQKLQkvLyBubyBlcnJvciBjaGVja2luZyBoZXJlCi0JZGVzY3JpcHRpb24gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JZGlzcGxheU5hbWUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JbmFtZXNwYWNlVVJJID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCWxvY2F0aW9uID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCWlzRGVmYXVsdFNjaGVtYSA9IHRva2VuaXplci5uZXh0VG9rZW4oKS5lcXVhbHMoInRydWUiKTsKLQlzb3VyY2VIaW50ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCWZyb21DYXRhbG9nID0gdG9rZW5pemVyLm5leHRUb2tlbigpLmVxdWFscygidHJ1ZSIpOwotICB9Ci0KLS8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uCi0gICAqICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkaXNwbGF5TmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGRpc3BsYXlOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBuYW1lCi0gICAqICAgICAgICAgIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpCi0gIHsKLSAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lc3BhY2VVUkkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLSAgICogICAgICAgICAgVGhlIG5hbWVzcGFjZVVSSSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIHhzZCBmaWxlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAqICAgICAgICAgIFRoZSBsb2NhdGlvbiB0byBiZSBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBsYWJlbFByb3ZpZGVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kIGdldEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKCkKLSAgewotICAgIHJldHVybiBhZGRDb21tYW5kOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQoRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgYWRkQ29tbWFuZCkKLSAgewotICAgIHRoaXMuYWRkQ29tbWFuZCA9IGFkZENvbW1hbmQ7Ci0gIH0KLQotICBwdWJsaWMgRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIGdldEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gcmVtb3ZlQ29tbWFuZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZCkKLSAgewotICAgIHRoaXMucmVtb3ZlQ29tbWFuZCA9IHJlbW92ZUNvbW1hbmQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1dFNjaGVtYSgpewotCSAgcmV0dXJuIGlzRGVmYXVsdFNjaGVtYSA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWZhdXRTY2hlbWEoKXsKLQkgIGlzRGVmYXVsdFNjaGVtYSA9IHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNvdXJjZUhpbnQoU3RyaW5nIHMpewotCSAgc291cmNlSGludCA9IHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlSGludCgpewotCSAgcmV0dXJuIHNvdXJjZUhpbnQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0Zyb21DYXRhbG9nKCkgewotCXJldHVybiBmcm9tQ2F0YWxvZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZyb21DYXRhbG9nKGJvb2xlYW4gZnJvbUNhdGFsb2cpIHsKLQl0aGlzLmZyb21DYXRhbG9nID0gZnJvbUNhdGFsb2c7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZXR0aW5nIHRoaXMgdmlhIHRoZSBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCBpbiB0aGUgcGx1Z2luLnhtbAotICAgKiBUaGlzIGFsbG93cyBleHRlbmRlcnMgdG8gcHJvdmlkZSBhIGZpbHRlciBmb3IgYSBjYXRlZ29yeSB0aGF0IGhhcyBiZWVuIGFkZGVkIAotICAgKiBkeW5hbWljYWxseSAocHJvZ3JhbW1hdGljYWxseSkKLSAgICogQHBhcmFtIG5vZGVGaWx0ZXIKLSAgICovIAotICBwdWJsaWMgdm9pZCBzZXROb2RlRmlsdGVyKE5vZGVGaWx0ZXIgbm9kZUZpbHRlcikKLSAgewotICAgIHRoaXMubm9kZUZpbHRlciA9IG5vZGVGaWx0ZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG5vZGUgZmlsdGVyCi0gICAqIEByZXR1cm4gTm9kZUZpbHRlcgotICAgKi8KLSAgcHVibGljIE5vZGVGaWx0ZXIgZ2V0Tm9kZUZpbHRlcigpCi0gIHsKLSAgICByZXR1cm4gbm9kZUZpbHRlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNldHRpbmcgdGhpcyB2aWEgdGhlIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIGluIHRoZSBwbHVnaW4ueG1sCi0gICAqIFRoaXMgYWxsb3dzIGV4dGVuZGVycyB0byBncm91cCBjYXRlZ29yaWVzIGludG8gZ3JvdXBzIG9yIGNsYXNzaWZpY2F0aW9uc3MgIAotICAgKiBAcGFyYW0gY2xhc3NpZmljYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzaWZpY2F0aW9uKFN0cmluZyBjbGFzc2lmaWNhdGlvbikKLSAgewotICAgIHRoaXMuY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmaWNhdGlvbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgY2xhc3NpZmljYXRpb24KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NpZmljYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGNsYXNzaWZpY2F0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vWFNERXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1hTREV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlNDI1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vWFNERXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgRE9NRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcgoteyAgCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICB7Ci0gICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXRFbGVtZW50OwotICAgICAgTGlzdCBlbGVtZW50c0FuZEF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24gPSBYU0RDb21tb25VSVV0aWxzLmdldElucHV0WFNEQW5ub3RhdGlvbihjb21wb25lbnQsIGZhbHNlKTsKLSAgICAgIGlmICh4c2RBbm5vdGF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIEJ1ZyAxMzc4NTYgLSBFeHRlbnNpb24gcGFnZSBvZiBwcm9wZXJ0aWVzIHNob3VsZG4ndCBkaXNwbGF5IGltcG9ydGVkIGVsZW1lbnRzCi0gICAgICAgIC8vIEFkZGVkIHRoaXMgaWYgc3RhdGVtZW50Ci0gICAgICAgIGlmICh4c2RBbm5vdGF0aW9uLmdldFNjaGVtYSgpID09IGNvbXBvbmVudC5nZXRTY2hlbWEoKSkKLSAgICAgICAgewotICAgICAgICAgIExpc3QgYXBwSW5mb0xpc3QgPSB4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKTsKLSAgICAgICAgICBFbGVtZW50IGFwcEluZm9FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICBpZiAoYXBwSW5mb0xpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhcHBJbmZvRWxlbWVudCA9IChFbGVtZW50KSBhcHBJbmZvTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChhcHBJbmZvRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhcHBJbmZvTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgYXBwSW5mbyA9IChFbGVtZW50KSBvYmo7Ci0gICAgICAgICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBhcHBJbmZvLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50c0FuZEF0dHJpYnV0ZXMuYWRkKG5vZGUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogQ29uc3RydWN0IGF0dHJpYnV0ZXMgbGlzdCAqLwotICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBhcHBJbmZvRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBTdHJpbmcgZGVmYXVsdE5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgIC8vIChTdHJpbmcpY29tcG9uZW50LmdldFNjaGVtYSgpLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKS5nZXQoIiIpOwotICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5vZGUgb25lQXR0cmlidXRlID0gYXR0cmlidXRlcy5pdGVtKGkpOwotICAgICAgICAgICAgICAgIGlmICghaXNYbWxuc0F0dHJpYnV0ZShvbmVBdHRyaWJ1dGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBvbmVBdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICBib29sZWFuIGlzRXh0ZW5zaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCAmJiBvbmVBdHRyaWJ1dGUuZ2V0UHJlZml4KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXNFeHRlbnNpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRXh0ZW5zaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChpc0V4dGVuc2lvbikKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNBbmRBdHRyaWJ1dGVzLmFkZChvbmVBdHRyaWJ1dGUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGVsZW1lbnRzQW5kQXR0cmlidXRlcy50b0FycmF5KCk7Ci0gICAgfQotICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYbWxuc0F0dHJpYnV0ZShOb2RlIGF0dHJpYnV0ZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBhdHRyaWJ1dGUuZ2V0UHJlZml4KCk7Ci0gICAgaWYgKHByZWZpeCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHRoaXMgaGFuZGxlIHRoZSB4bWxuczpmb289ImJsYWgiIGNhc2UKLSAgICAgIHJldHVybiAieG1sbnMiLmVxdWFscyhwcmVmaXgpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyB0aGlzIGhhbmRsZXMgdGhlIHhtbG5zPSJibGFoIiBjYXNlCi0gICAgICByZXR1cm4gInhtbG5zIi5lcXVhbHMoYXR0cmlidXRlLmdldE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL0RlZmF1bHRMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vRGVmYXVsdExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODRhZDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vRGVmYXVsdExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tOwotCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGV4dGVuZHMgTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nW10gdmFsdWVzOwotICAKLSAgcHVibGljIERlZmF1bHRMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24oU3RyaW5nW10gdmFsdWVzKQotICB7Ci0gICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7IAotICB9Ci0gCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRWYWx1ZXMoT2JqZWN0IHByb3BlcnR5T2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9EaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9EaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uIGV4dGVuZHMgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24KLXsKLSAgcHVibGljIGludCBnZXRTdHlsZSgpCi0gIHsgICAgICAgIAotICAgIHJldHVybiBTVFlMRV9ESUFMT0c7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QnV0b25UZXh0KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0QnV0dG9uSW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludm9rZURpYWxvZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9MaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZmJjZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9MaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBleHRlbmRzIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uCi17Ci0gIHByaXZhdGUgTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotIAotICBwdWJsaWMgTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBsYWJlbFByb3ZpZGVyOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldFN0eWxlKCkKLSAgewotICAgIHJldHVybiBTVFlMRV9DT01CTzsKLSAgfSAgICAKLQotICBwdWJsaWMgdm9pZCBzZXRMYWJlbFByb3ZpZGVyKExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLSAgewotICAgIHRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0W10gZ2V0VmFsdWVzKE9iamVjdCBwcm9wZXJ0eU9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzFiMmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX1BST1ZJREVSX0NMQVNTX0FUVFJJQlVURV9OQU1FID0gImxhYmVsUHJvdmlkZXJDbGFzcyI7ICAgICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfRURJVE9SX1BST1ZJREVSX0NMQVNTX0FUVFJJQlVURV9OQU1FID0gIm5vZGVFZGl0b3JQcm92aWRlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0NMQVNTX0FUVFJJQlVURV9OQU1FID0gImZpbHRlckNsYXNzIjsgCi0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvbklkOwotICBwcm90ZWN0ZWQgSGFzaE1hcCBtYXA7Ci0KLSAgcHVibGljIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkoU3RyaW5nIHByb3BlcnR5RWRpdG9yRXh0ZW5zaW9uSWQpCi0gIHsKLSAgICBleHRlbnNpb25JZCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmV4dGVuc2liaWxpdHlOb2RlQ3VzdG9taXphdGlvbnMiOy8vcHJvcGVydHlFZGl0b3JFeHRlbnNpb25JZDsKLSAgfSAgCi0gIAotICBwcml2YXRlIGNsYXNzIERlc2NyaXB0b3IKLSAgewotICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudDsKLSAgICBOb2RlRWRpdG9yUHJvdmlkZXIgbm9kZUVkaXRvclByb3ZpZGVyOwotICAgIE5vZGVGaWx0ZXIgbm9kZUZpbHRlcjsgICAgCi0gICAgYm9vbGVhbiBub2RlRWRpdG9yUHJvdmlkZXJGYWlsZWRUb0xvYWQgPSBmYWxzZTsKLSAgICBib29sZWFuIGxhYmVsUHJvdmlkZXJGYWlsZWRUb0xvYWQgPSBmYWxzZTsKLSAgICBib29sZWFuIG5vZGVGaWx0ZXJGYWlsZWRUb0xvYWQgPSBmYWxzZTsgICAgCi0gICAgCi0gICAgRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgICB7Ci0gICAgICB0aGlzLmNvbmZpZ3VyYXRpb25FbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0gICAgCi0gICAgTm9kZUVkaXRvclByb3ZpZGVyIGxvb2t1cE9yQ3JlYXRlTm9kZUVkaXRvclByb3ZpZGVyKCkKLSAgICB7Ci0gICAgICBpZiAobm9kZUVkaXRvclByb3ZpZGVyID09IG51bGwgJiYgIW5vZGVFZGl0b3JQcm92aWRlckZhaWxlZFRvTG9hZCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBub2RlRWRpdG9yUHJvdmlkZXIgPSAoTm9kZUVkaXRvclByb3ZpZGVyKWNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oTk9ERV9FRElUT1JfUFJPVklERVJfQ0xBU1NfQVRUUklCVVRFX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBub2RlRWRpdG9yUHJvdmlkZXJGYWlsZWRUb0xvYWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IAotICAgICAgcmV0dXJuIG5vZGVFZGl0b3JQcm92aWRlcjsKLSAgICB9Ci0gICAgCi0gICAgSUxhYmVsUHJvdmlkZXIgY3JlYXRlTGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgaWYgKCFsYWJlbFByb3ZpZGVyRmFpbGVkVG9Mb2FkKQotICAgICAgeyAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIChJTGFiZWxQcm92aWRlciljb25maWd1cmF0aW9uRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKExBQkVMX1BST1ZJREVSX0NMQVNTX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIAotICAgICAgICB7Ci0gICAgICAgICAgbGFiZWxQcm92aWRlckZhaWxlZFRvTG9hZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlRmlsdGVyIGdldE5vZGVGaWx0ZXIoKQotICAgIHsKLSAgICAgIGlmICghbm9kZUVkaXRvclByb3ZpZGVyRmFpbGVkVG9Mb2FkKQotICAgICAgeyAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZUZpbHRlciA9IChOb2RlRmlsdGVyKWNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oRklMVEVSX0NMQVNTX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIAotICAgICAgICB7Ci0gICAgICAgICAgbm9kZUVkaXRvclByb3ZpZGVyRmFpbGVkVG9Mb2FkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5vZGVGaWx0ZXI7Ci0gICAgfQotICB9Ci0KLSAgCi0gIHByaXZhdGUgSGFzaE1hcCBpbml0TWFwKCkKLSAgewotICAgIEhhc2hNYXAgdGhlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBleHRlbnNpb25zID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLndzdC54c2QudWkuZXh0ZW5zaWJpbGl0eU5vZGVDdXN0b21pemF0aW9ucyIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQgPSBleHRlbnNpb25zW2ldOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGNvbmZpZ3VyYXRpb25FbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FU1BBQ0UpOwotICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB0aGVNYXAucHV0KG5hbWVzcGFjZSwgbmV3IERlc2NyaXB0b3IoY29uZmlndXJhdGlvbkVsZW1lbnQpKTsKLSAgICAgIH0gICAgIAotICAgIH0gICAgCi0gICAgcmV0dXJuIHRoZU1hcDsKLSAgfQotCi0gIHByaXZhdGUgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBtYXAgPSBudWxsOwotICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7IAotICAgICAgaWYgKG1hcCA9PSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIG1hcCA9IGluaXRNYXAoKTsKLSAgICAgIH0gIAotICAgICAgcmV0dXJuIChEZXNjcmlwdG9yKW1hcC5nZXQobmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgICAKLSAgfQotICAKLSAgcHVibGljIE5vZGVFZGl0b3JQcm92aWRlciBnZXROb2RlRWRpdG9yUHJvdmlkZXIoU3RyaW5nIG5hbWVzcGFjZSkKLSAgeyAgICAgCi0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcihuYW1lc3BhY2UpOwotICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gZGVzY3JpcHRvci5sb29rdXBPckNyZWF0ZU5vZGVFZGl0b3JQcm92aWRlcigpOyAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKG5hbWVzcGFjZSk7Ci0gICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBkZXNjcmlwdG9yLmNyZWF0ZUxhYmVsUHJvdmlkZXIoKTsgICAgICAgCi0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAKLSAgfQotICAKLSAgcHVibGljIE5vZGVGaWx0ZXIgZ2V0Tm9kZUZpbHRlcihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcihuYW1lc3BhY2UpOwotICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXROb2RlRmlsdGVyKCk7ICAgICAgIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwNmFkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b207Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24KLXsgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVFlMRV9OT05FID0gMDsgICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RZTEVfVEVYVCA9IDE7IAotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVFlMRV9DT01CTyA9IDI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUWUxFX0RJQUxPRyA9IDQ7ICAgCi0gIAotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFN0eWxlKCk7Ci0gIAotICBwcml2YXRlIE5vZGUgbm9kZTsKLSAgcHJpdmF0ZSBOb2RlIHBhcmVudE5vZGU7Ci0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0gIHsKLSAgICByZXR1cm4gbm9kZTsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHRoaXMubm9kZSA9IG5vZGU7Ci0gIH0KLSAgcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpCi0gIHsKLSAgICByZXR1cm4gcGFyZW50Tm9kZTsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnROb2RlKE5vZGUgcGFyZW50Tm9kZSkKLSAgewotICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUVkaXRvclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVFZGl0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2QxYzYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUVkaXRvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b207Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVFZGl0b3JQcm92aWRlcgotewotICBwdWJsaWMgYWJzdHJhY3QgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZ2V0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24oU3RyaW5nIHBhcmVudE5hbWUsIFN0cmluZyBub2RlTmFtZSk7IAotICAvL3B1YmxpYyBhYnN0cmFjdCBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBnZXROb2RlRWRpdG9yQ29uZmlndXJhdGlvbihOb2RlIG5vZGUpOyAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhYmJjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlRmlsdGVyCi17ICAKLSAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlQ29udGV4dChOb2RlIHBhcmVudE5vZGUsIGludCBub2RlVHlwZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCi0gIHsgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOGM0ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTCi17Ci0gIHN0YXRpYyAKLSAgewotICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwubWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBNZXNzYWdlcygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX09QRU5fSU5fTkVXX0VESVRPUjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfREVGSU5JVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfR1JPVVBfUkVGOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9HUk9VUDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT19JVEVNU19TRUxFQ1RFRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BREQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX1dJVEhfRE9UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9FRElUX1dJVEhfRE9UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DSEFOR0VfUEFUVEVSTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX1BBVFRFUk47Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEVfQ09OU1RSQUlOVFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fREVMRVRFX1BBVFRFUk47Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFVF9FTlVNRVJBVElPTl9WQUxVRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BBVFRFUk47Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0hBTkdFX01BWElNVU1fT0NDVVJSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0lOVkFMSURfVkFMVUVfRk9SX01BWElNVU1fT0NDVVJSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DSEFOR0VfTUlOSU1VTV9PQ0NVUlJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BUFBJTkZPX0VMRU1FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FQUElORk9fQVRUUklCVVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RFTEVURV9BUFBJTkZPX0VMRU1FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fREVMRVRFX0FQUElORk9fQVRUUklCVVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NIQU5HRV9DT05URU5UX01PREVMOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1JFTkFNRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0lOVkFMSURfTkFNRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX01BWElNVU1fT0NDVVJSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfTUlOSU1VTV9PQ0NVUlJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUkVBRE9OTFk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9JTkNMVVNJVkU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT0xMQVBTRV9XSElURVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1BFQ0lGSUNfQ09OU1RSQUlOVF9WQUxVRVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9SRVNUUklDVF9WQUxVRVNfQlk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlVNRVJBVElPTlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QQVRURVJOUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01JTklNVU1fTEVOR1RIOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTUFYSU1VTV9MRU5HVEg7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05TVFJBSU5UU19PTl9MRU5HVEhfT0Y7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05TVFJBSU5UU19PTl9WQUxVRV9PRjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01JTklNVU1fVkFMVUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NQVhJTVVNX1ZBTFVFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09OVFJBSU5UU19PTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ09OU1RSQUlOX0xFTkdUSDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NPTExBUFNFX1dISVRFU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9CQVNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfSU5WQUxJRF9GSUxFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRVhURU5TSU9OUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRVhURU5TSU9OX0NPTVBPTkVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEVfRVhURU5TSU9OX0NPTVBPTkVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1VQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRE9XTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVEVOU0lPTl9ERVRBSUxTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9ET0NVTUVOVEFUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FWFRFTlNJT05fQ09NUE9ORU5UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVEVOU0lPTl9DQVRFR09SSUVTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQUREX1dJVEhfRE9UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RFTEVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VESVQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVkFJTEFCTEVfQ09NUE9ORU5UU19UT19BREQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FRElUX0NBVEVHT1JZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfSU5WQUxJRF9DQVRFR09SWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX0ZJTEVfQ0FOTk9UX0JFX1BBUlNFRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SX1ZBTElEQVRFX1RIRV9GSUxFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0NIRU1BOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQUREX0NBVEVHT1JZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfTkFNRV9BTFJFQURZX1VTRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQlJPV1NFX1dPUktTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9YU0RfRklMRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RFU0NSSVBUSU9OX0NIT09TRV9YU0RfRklMRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9CUk9XU0VfQ0FUQUxPRzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQU5ZX0VMRU1FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FOWV9BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0VUX0JBU0VfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RPT0xUSVBfUkVOQU1FX1JFRkFDVE9SOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVkFMVUVfQ09MT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJWEVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVGQVVMVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZPUk07Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9VU0FHRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DSEFOR0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fTkFNRVNQQUNFX0lORk9STUFUSU9OX0NIQU5HRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FCU1RSQUNUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQkxPQ0s7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9GSU5BTDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NVQlNUSVRVVElPTl9HUk9VUDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01JWEVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVkFMVUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9GT1JNOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTklMTEFCTEU7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL1hTRENvbW1vblVJVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNEQ29tbW9uVUlVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZlMTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNEQ29tbW9uVUlVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBOYW9raSBBa2l5YW1hLCBGdWppdHN1IC0gQnVnIDI0NDkwMSAtIENhbm5vdCBzZXQgeHNkOmFubm90YXRpb24gdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZDpyZWRlZmluZSBieSBQcm9wZXJ0aWVzIHZpZXcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpb25PdmVybGF5SWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5JbWFnZU92ZXJsYXlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROb3RhdGlvbkRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEWFBhdGhEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb21tb25VSVV0aWxzCi17Ci0gIHB1YmxpYyBYU0RDb21tb25VSVV0aWxzKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0VXBkYXRlZEltYWdlKFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0LCBJbWFnZSBiYXNlSW1hZ2UsIGJvb2xlYW4gaXNSZWFkT25seSkKLSAgewotICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IGdldElucHV0WFNEQW5ub3RhdGlvbihpbnB1dCwgZmFsc2UpOwotICAgIAotICAgIGlmICh4c2RBbm5vdGF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIC8vIFdpbGwgdXNlIHRoZSBjbGFzcyBuYW1lIGFwcGVuZGVkIGJ5IHRoZSByZWFkIG9ubHkgc3RhdGUgYXMgdGhlIG5hbWUgb2YgdGhlIGltYWdlLgotICAgICAgICAvLyBUaGVyZSBpcyBhIGRpc2FibGVkIGFuZCBhbiBlbmFibGVkIHZlcnNpb24gb2YgZWFjaCBiYXNlSW1hZ2UsIHNvIHdlIGNhbid0IHNpbXBseQotICAgICAgICAvLyB1c2UgdGhlIGNvbXBvbmVudCBuYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBpbWFnZQotICAgICAgICBTdHJpbmcgaW1hZ2VOYW1lID0gaW5wdXQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyBpc1JlYWRPbmx5OwotICAgICAgICBJbWFnZSBuZXdJbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChpbWFnZU5hbWUpOwotICAgICAgICBpZiAobmV3SW1hZ2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEltYWdlT3ZlcmxheURlc2NyaXB0b3Igb3ZyID0gbmV3IEltYWdlT3ZlcmxheURlc2NyaXB0b3IoYmFzZUltYWdlLCBpc1JlYWRPbmx5KTsKLSAgICAgICAgICBuZXdJbWFnZSA9IG92ci5nZXRJbWFnZSgpOwotICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChpbWFnZU5hbWUsIG5ld0ltYWdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3SW1hZ2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBiYXNlSW1hZ2U7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFhTREFubm90YXRpb24gZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKFhTRENvbmNyZXRlQ29tcG9uZW50IGlucHV0LCBib29sZWFuIGNyZWF0ZUlmTm90RXhpc3QpCi0gIHsKLSAgICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24gPSBudWxsOwotICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZENvbXAgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZENvbXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RDb21wID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5vdGF0aW9uRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNETm90YXRpb25EZWNsYXJhdGlvbiB4c2RDb21wID0gKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RYUGF0aERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEWFBhdGhEZWZpbml0aW9uIHhzZENvbXAgPSAoWFNEWFBhdGhEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIHhzZENvbXAgPSAoWFNETW9kZWxHcm91cCkgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZENvbXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24geHNkQ29tcCA9IChYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgewotICAgICAgWFNEV2lsZGNhcmQgeHNkQ29tcCA9IChYU0RXaWxkY2FyZCkgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgeHNkQ29tcCA9IChYU0RTY2hlbWEpIGlucHV0OwotICAgICAgTGlzdCBsaXN0ID0geHNkQ29tcC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IChYU0RBbm5vdGF0aW9uKSBsaXN0LmdldCgwKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICAgIGlmICh4c2RDb21wLmdldENvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RDb21wLmdldENvbnRlbnRzKCkuYWRkKDAsIHhzZEFubm90YXRpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHhzZEFubm90YXRpb247Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERmFjZXQpCi0gICAgewotICAgICAgWFNERmFjZXQgeHNkQ29tcCA9IChYU0RGYWNldCkgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHhzZENvbXAgPSAoWFNEVHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RJbmNsdWRlKQotICAgIHsKLSAgICAgIFhTREluY2x1ZGUgeHNkQ29tcCA9IChYU0RJbmNsdWRlKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW1wb3J0KQotICAgIHsKLSAgICAgIFhTREltcG9ydCB4c2RDb21wID0gKFhTREltcG9ydCkgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIHsKLSAgICAgIFhTRFJlZGVmaW5lIHhzZENvbXAgPSAoWFNEUmVkZWZpbmUpIGlucHV0OwotICAgICAgTGlzdCBjb250ZW50cyA9IHhzZENvbXAuZ2V0Q29udGVudHMoKTsgCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRzLnNpemUoKTsgaSsrKQotICAgICAgeyAKLSAgICAgICAgT2JqZWN0IGNvbnRlbnQgPSBjb250ZW50cy5nZXQoaSk7Ci0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNEQW5ub3RhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHhzZEFubm90YXRpb24gPSAoWFNEQW5ub3RhdGlvbikgY29udGVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIGNvbnRlbnRzLmFkZCgwLCB4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB4c2RBbm5vdGF0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREFubm90YXRpb24pCi0gICAgewotICAgICAgeHNkQW5ub3RhdGlvbiA9IChYU0RBbm5vdGF0aW9uKSBpbnB1dDsKLSAgICB9Ci0KLSAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCkKLSAgICB7Ci0gICAgICBmb3JtYXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgIH0KLQotICAgIHJldHVybiB4c2RBbm5vdGF0aW9uOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRBbm5vdGF0aW9uKFhTREFubm90YXRpb24gYW5ub3RhdGlvbikKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGFubm90YXRpb24uZ2V0RWxlbWVudCgpOwotICAgIGZvcm1hdENoaWxkKGVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdENoaWxkKE5vZGUgY2hpbGQpCi0gIHsKLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKSBjaGlsZCkuZ2V0TW9kZWwoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotICAgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXROb2RlKGNoaWxkKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmNoYW5nZWRNb2RlbCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKFN0cmluZyBwcmVmaXgsIExpc3QgZWxlbWVudHMpCi0gIHsKLSAgICBBcnJheUxpc3QgdXNlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB1c2VkTmFtZXMuYWRkKGdldERpc3BsYXlOYW1lKChYU0ROYW1lZENvbXBvbmVudCkgaS5uZXh0KCkpKTsKLSAgICB9Ci0KLSAgICBpbnQgaSA9IDE7Ci0gICAgU3RyaW5nIHRlc3ROYW1lID0gcHJlZml4OwotICAgIHdoaWxlICh1c2VkTmFtZXMuY29udGFpbnModGVzdE5hbWUpKQotICAgIHsKLSAgICAgIHRlc3ROYW1lID0gcHJlZml4ICsgaSsrOwotICAgIH0KLSAgICByZXR1cm4gdGVzdE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5TmFtZShYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWVGcm9tWFNEVHlwZSgoWFNEVHlwZURlZmluaXRpb24pIGNvbXBvbmVudCk7Ci0KLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICB7Ci0gICAgICBYU0RGZWF0dXJlIGZlYXR1cmUgPSAoWFNERmVhdHVyZSkgY29tcG9uZW50OwotICAgICAgaWYgKGZlYXR1cmUuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHJldHVybiBmZWF0dXJlLmdldE5hbWUoKTsKLSAgICAgIGVsc2UgaWYgKGZlYXR1cmUuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkgIT0gbnVsbCAmJiBmZWF0dXJlLmdldFJlc29sdmVkRmVhdHVyZSgpLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICByZXR1cm4gZmVhdHVyZS5nZXRSZXNvbHZlZEZlYXR1cmUoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbXBvbmVudC5nZXROYW1lKCk7Ci0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpc3BsYXlOYW1lRnJvbVhTRFR5cGUoWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIHJldHVybiBnZXREaXNwbGF5TmFtZUZyb21YU0RUeXBlKHR5cGUsIHRydWUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWVGcm9tWFNEVHlwZShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlLCBib29sZWFuIHJldHVyblByaW1pdGl2ZVBhcmVudHMpCi0gIHsKLSAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBpZiAodHlwZS5nZXROYW1lKCkgPT0gbnVsbCB8fCB0eXBlLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChyZXR1cm5QcmltaXRpdmVQYXJlbnRzICYmIGlzUHJpbWl0aXZlVHlwZSh0eXBlKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lRnJvbVhTRFR5cGUodHlwZS5nZXRCYXNlVHlwZSgpKTsKLSAgICAgIH0KLQotICAgICAgRU9iamVjdCBjb250YWluZXIgPSB0eXBlLmVDb250YWluZXIoKTsKLQotICAgICAgd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQgJiYgKChYU0ROYW1lZENvbXBvbmVudCkgY29udGFpbmVyKS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb250YWluZXIpLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpOwotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiB0eXBlLmdldE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSBudWxsOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgYmFzZVR5cGUgPSB0eXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiBvcmlnVHlwZSA9IGJhc2VUeXBlOyAvLyBLQzogYWx0aG91Z2ggaW52YWxpZCwgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGN5Y2xlcyBhbmQgdG8gYXZvaWQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5maW5pdGUgbG9vcAotICAgICAgd2hpbGUgKGJhc2VUeXBlICE9IG51bGwgJiYgIVhTRENvbnN0YW50cy5pc0FueVNpbXBsZVR5cGUoYmFzZVR5cGUpICYmICFYU0RDb25zdGFudHMuaXNBbnlUeXBlKGJhc2VUeXBlKSAmJiBvcmlnVHlwZSAhPSBiYXNlVHlwZSkKLSAgICAgIHsKLSAgICAgICAgdHlwZSA9IGJhc2VUeXBlOwotICAgICAgICBiYXNlVHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgIH0KLSAgICAgIGJhc2VUeXBlID0gdHlwZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMoYmFzZVR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0QW5vbnltb3VzU2ltcGxlVHlwZShYU0RGZWF0dXJlIGlucHV0LCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUgPSBudWxsOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIGxvY2FsVHlwZSA9IG51bGw7Ci0KLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgbG9jYWxUeXBlID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0KS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIGxvY2FsVHlwZSA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0KS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLQotICAgIGlmIChsb2NhbFR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBsb2NhbFR5cGU7Ci0gICAgfQotICAgIHJldHVybiBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldENoaWxkRWxlbWVudHMoWFNETW9kZWxHcm91cCBncm91cCkKLSAgewotICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKGdyb3VwID09IG51bGwpIHJldHVybiBjaGlsZHJlbjsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBncm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZSBuZXh0ID0gKFhTRFBhcnRpY2xlKSBpLm5leHQoKTsKLSAgICAgIGlmIChuZXh0LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTREZlYXR1cmUpCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuLmFkZChuZXh0LmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuZXh0LmdldFRlcm0oKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuLmFkZEFsbChnZXRDaGlsZEVsZW1lbnRzKChYU0RNb2RlbEdyb3VwKSBuZXh0LmdldFRlcm0oKSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2hpbGRyZW47Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsQXR0cmlidXRlcyhYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGUpCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZXMgPSBnZXRDaGlsZEVsZW1lbnRzKHhzZENvbXBsZXhUeXBlKTsKLSAgICBhdHRyaWJ1dGVzLmFkZEFsbChnZXRDaGlsZEF0dHJpYnV0ZXMoeHNkQ29tcGxleFR5cGUpKTsKLQotICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbEF0dHJpYnV0ZXMoWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24pCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZXMgPSBnZXRDaGlsZEVsZW1lbnRzKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLQotICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0SW5oZXJpdGVkQXR0cmlidXRlcyhYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QpCi0gIHsKLSAgICBMaXN0IGF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIHBhcmVudCA9IGN0LmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gJiYgY3QuaXNTZXREZXJpdmF0aW9uTWV0aG9kKCkpCi0gICAgewotICAgICAgYXR0cnMuYWRkQWxsKGdldEFsbEF0dHJpYnV0ZXMoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50KSk7Ci0gICAgICBpZiAoISBjdC5pc0NpcmN1bGFyKCkpIGF0dHJzLmFkZEFsbChnZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudCkpOwotICAgIH0KLQotICAgIHJldHVybiBhdHRyczsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDaGlsZEVsZW1lbnRzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCkKLSAgewotICAgIHJldHVybiBnZXRDaGlsZEVsZW1lbnRzKGdldE1vZGVsR3JvdXAoY3QpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldENoaWxkRWxlbWVudHMoWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24pCi0gIHsKLSAgICByZXR1cm4gZ2V0Q2hpbGRFbGVtZW50cyh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRNb2RlbEdyb3VwKCkpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFhTRE1vZGVsR3JvdXAgZ2V0TW9kZWxHcm91cChYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY1R5cGUpCi0gIHsKLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGNUeXBlLmdldENvbXBsZXhUeXBlKCk7Ci0KLSAgICBpZiAocGFydGljbGUgPT0gbnVsbCB8fCBwYXJ0aWNsZS5lQ29udGFpbmVyKCkgIT0gY1R5cGUpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIE9iamVjdCBwYXJ0aWNsZUNvbnRlbnQgPSBwYXJ0aWNsZS5nZXRDb250ZW50KCk7Ci0gICAgWFNETW9kZWxHcm91cCBncm91cCA9IG51bGw7Ci0KLSAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICBncm91cCA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudCkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgZ3JvdXAgPSAoWFNETW9kZWxHcm91cCkgcGFydGljbGVDb250ZW50OwotCi0gICAgaWYgKGdyb3VwID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIGlmIChncm91cC5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBncm91cC5lUmVzb3VyY2UoKSAhPSBjVHlwZS5lUmVzb3VyY2UoKSkKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29udGVudCA9IGNUeXBlLmdldENvbnRlbnQoKTsKLSAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICAgIGdyb3VwID0gKFhTRE1vZGVsR3JvdXApICgoWFNEUGFydGljbGUpIGNvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2hpbGRBdHRyaWJ1dGVzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCkKLSAgewotICAgIEVMaXN0IGF0dHJDb250ZW50cyA9IGN0LmdldEF0dHJpYnV0ZUNvbnRlbnRzKCk7Ci0gICAgTGlzdCBhdHRycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJDb250ZW50cy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBPYmplY3QgbmV4dCA9IGF0dHJDb250ZW50cy5nZXQoaSk7Ci0KLSAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBhdHRycy5hZGQoKChYU0RBdHRyaWJ1dGVVc2UpIG5leHQpLmdldENvbnRlbnQoKS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobmV4dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgbmV4dDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGF0dHJzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZVdpdGhFcnJvck92ZXJsYXkoWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQsIEltYWdlIGJhc2VJbWFnZSwgYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgSW1hZ2UgZXh0ZW5zaW9uSW1hZ2UgPSBnZXRVcGRhdGVkSW1hZ2UoaW5wdXQsIGJhc2VJbWFnZSwgaXNSZWFkT25seSk7Ci0gICAgSW1hZ2VEZXNjcmlwdG9yIGVycm9yT3ZlcmxheSA9IFhTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL292cjE2L2Vycm9yX292ci5naWYiKTsgIC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoYmFzZUltYWdlID09IGV4dGVuc2lvbkltYWdlKQotICAgIHsKLSAgICAgIFN0cmluZyBpbWFnZU5hbWUgPSBpbnB1dC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJfZXJyb3JfIiArIGlzUmVhZE9ubHk7Ci0gICAgICBJbWFnZSBuZXdJbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChpbWFnZU5hbWUpOwotICAgICAgaWYgKG5ld0ltYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERlY29yYXRpb25PdmVybGF5SWNvbiBvdnIgPSBuZXcgRGVjb3JhdGlvbk92ZXJsYXlJY29uKGJhc2VJbWFnZSwgZXJyb3JPdmVybGF5LCBJRGVjb3JhdGlvbi5UT1BfTEVGVCk7Ci0gICAgICAgIG5ld0ltYWdlID0gb3ZyLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChpbWFnZU5hbWUsIG5ld0ltYWdlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXdJbWFnZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBpbWFnZU5hbWUgPSBpbnB1dC5nZXRDbGFzcygpLmdldE5hbWUoKSArICJfZXh0ZW5zaW9uX2Vycm9yXyIgKyBpc1JlYWRPbmx5OwotICAgICAgSW1hZ2UgbmV3SW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoaW1hZ2VOYW1lKTsKLSAgICAgIGlmIChuZXdJbWFnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBEZWNvcmF0aW9uT3ZlcmxheUljb24gb3ZyID0gbmV3IERlY29yYXRpb25PdmVybGF5SWNvbihleHRlbnNpb25JbWFnZSwgZXJyb3JPdmVybGF5LCBJRGVjb3JhdGlvbi5UT1BfTEVGVCk7Ci0gICAgICAgIG5ld0ltYWdlID0gb3ZyLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChpbWFnZU5hbWUsIG5ld0ltYWdlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXdJbWFnZTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0REaXJlY3RpdmVzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0REaXJlY3RpdmVzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWExZDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNERGlyZWN0aXZlc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dC5YU0RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm1zIGNsZWFudXAvcmVtb3ZhbCBvZiB1bnVzZWQgWFNEIGltcG9ydHMgYW5kIGluY2x1ZGVzIGZyb20gWE1MIFNjaGVtYXMKLSAqIGFuZCB4bWxucyBlbnRyaWVzIGluIHRoZSBuYW1lc3BhY2UgdGFibGUKLSAqLwotcHVibGljIGNsYXNzIFhTRERpcmVjdGl2ZXNNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotICAvLyBMaXN0IG9mIGFsbCB0aGUgdW51c2VkIGRpcmVjdGl2ZXMuICBUaGVzZSB3aWxsIGJlIHJlbW92ZWQKLSAgcHJvdGVjdGVkIExpc3QgdW51c2VkRGlyZWN0aXZlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgLy8gTGlzdCBvZiBhbGwgdGhlIGluY2x1ZGVkIFhTRFNjaGVtYSdzCi0gIHByb3RlY3RlZCBMaXN0IHVzZWRJbmNsdWRlU2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgLy8gTGlzdCBvZiBhbGwgdGhlIFhTREluY2x1ZGUncyB0aGF0IGFyZSBpbmRpcmVjdGx5IHVzZWQKLSAgcHJvdGVjdGVkIExpc3QgdXNlZEluZGlyZWN0SW5jbHVkZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIC8vIExpc3Qgb2YgdGhlIFhTREluY2x1ZGUncyB0aGF0IGFyZSBkaXJlY3RseSB1c2VkCi0gIHByb3RlY3RlZCBMaXN0IHVzZWREaXJlY3RJbmNsdWRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgLy8gVXNlZCB0byB0cmFjayB0aGUgaW5jbHVkZWQgc2NoZW1hcyB0aGF0IHdlcmUgYW5hbHl6ZWQgdG8gYXZvaWQgY2lyY3VsYXIgbG9vcAotICBwcm90ZWN0ZWQgTGlzdCBhbmFseXplZEluY2x1ZGVTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAvLyBMaXN0IG9mIGFsbCB0aGUgaW1wb3J0ZWQgdXNlZCBzY2hlbWFzCi0gIHByb3RlY3RlZCBMaXN0IHVzZWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAvLyBMaXN0IG9mIGFsbCB0aGUgaW5kaXJlY3RseSB1c2VkIGluY2x1ZGVzICAKLSAgcHJvdGVjdGVkIE1hcCB1c2VkSW5kaXJlY3RJbmNsdWRlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIC8vIEtlZXAgdHJhY2sgb2YgYWxsIHRoZSB1bnVzZWQgcHJlZml4ZXMKLSAgcHJvdGVjdGVkIFNldCB1bnVzZWRQcmVmaXhlczsKLSAgLy8gS2VlcCB0cmFjayBvZiBhbGwgdGhlIHVzZWQgcHJlZml4ZXMKLSAgcHJvdGVjdGVkIFNldCB1c2VkUHJlZml4ZXM7Ci0gIC8vIE1hcCBvZiBlYWNoIHNjaGVtYSdzIHVudXNlZCBwcmVmaXhlcwotICBwcm90ZWN0ZWQgTWFwIHNjaGVtYVRvUHJlZml4TWFwOwotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVVbnVzZWRYU0RJbXBvcnRzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICAvLyBPbmx5IGRvIHRoZSByZW1vdmFsIGlmIHRoZSBwcmVmZXJlbmNlIGlzIHR1cm5lZCBvbgotICAgIGlmIChYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlbW92ZUltcG9ydFNldHRpbmcoKSkKLSAgICB7Ci0gICAgICBYU0REaXJlY3RpdmVzTWFuYWdlciBtZ3IgPSBuZXcgWFNERGlyZWN0aXZlc01hbmFnZXIoKTsKLSAgICAgIG1nci5wZXJmb3JtUmVtb3ZhbChzY2hlbWEpOwotICAgICAgbWdyLmNsZWFudXAoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBNYWluIG1ldGhvZCB0byBkbyB0aGUgY2xlYW51cAotICAgKiBAcGFyYW0gc2NoZW1hCi0gICAqLwotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVtb3ZhbChYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgLy8gQ29tcHV0ZSB1bnVzZWQgaW1wb3J0cyBhbmQgdW51c2VkIHByZWZpeGVzCi0gICAgY29tcHV0ZVVudXNlZEltcG9ydHMoc2NoZW1hKTsKLSAgICAvLyBSZW1vdmUgdGhlIGltcG9ydHMKLSAgICByZW1vdmVVbnVzZWRJbXBvcnRzKCk7Ci0gICAgLy8gUmVtb3ZlIHRoZSBwcmVmaXhlcwotICAgIHJlbW92ZVVudXNlZFByZWZpeGVzKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDbGllbnRzIGNhbiBtYW51YWxseSBjbGVhbiB0aGUgbGlzdHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFudXAoKQotICB7Ci0gICAgY2xlYXJNYXBzKCk7Ci0gIH0KLQotICAvKioKLSAgICogQWZ0ZXIgcGVyZm9ybWluZyB0aGUgY2xlYW51cCwgcmV0dXJuIHRoZSBsaXN0IG9mIHVudXNlZCBYU0QgZGlyZWN0aXZlcwotICAgKiAgCi0gICAqIEByZXR1cm4gbGlzdCBvZiB1bnVzZWQgWFNEIGRpcmVjdGl2ZXMKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFVudXNlZFhTRERpcmVjdGl2ZXMoKQotICB7Ci0gICAgcmV0dXJuIHVudXNlZERpcmVjdGl2ZXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZnRlciBwZXJmb3JtaW5nIHRoZSBjbGVhbnVwLCByZXR1cm4gdGhlIG1hcCBvZiBlYWNoIHNjaGVtYXMgdW51c2VkIHByZWZpeGVzCi0gICAqIAotICAgKiBAcmV0dXJuIG1hcCBvZiBlYWNoIHNjaGVtYXMgdW51c2VkIHByZWZpeGVzCi0gICAqLwotICBwdWJsaWMgTWFwIGdldFNjaGVtYVRvUHJlZml4TWFwKCkKLSAgewotICAgIHJldHVybiBzY2hlbWFUb1ByZWZpeE1hcDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgdW51c2VkIHByZWZpeGVzIGZyb20gdGhlIFhNTCBuYW1lc3BhY2UgdGFibGUKLSAgICogCi0gICAqIEByZXR1cm4gc2V0IG9mIHVudXNlZCBwcmVmaXhlcwotICAgKi8KLSAgcHVibGljIFNldCBnZXRVbnVzZWRQcmVmaXhlcygpCi0gIHsKLSAgICByZXR1cm4gdW51c2VkUHJlZml4ZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2V0IG9mIHVzZWQgcHJlZml4ZXMgZnJvbSB0aGUgWE1MIG5hbWVzcGFjZSB0YWJsZQotICAgKiAKLSAgICogQHJldHVybiBzZXQgb2YgdXNlZCBwcmVmaXhlcwotICAgKi8KLSAgcHVibGljIFNldCBnZXRVc2VkUHJlZml4ZXMoKQotICB7Ci0gICAgcmV0dXJuIHVzZWRQcmVmaXhlczsKLSAgfQotCi0gIC8qKgotICAgKiBQZXJmb3JtIGFueSBjbGVhbnVwIGFmdGVyIGNvbXB1dGluZyBhbmQgcmVtb3ZpbmcgdGhlIHVudXNlZCBpbXBvcnRzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY2xlYXJNYXBzKCkKLSAgewotICAgIGlmIChzY2hlbWFUb1ByZWZpeE1hcCAhPSBudWxsKQotICAgIHsKLSAgICAgIHNjaGVtYVRvUHJlZml4TWFwLmNsZWFyKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSB0aGUgbGlzdCBvZiBhbGwgdW51c2VkIGltcG9ydHMuICBJbXBvcnRzIGlzIHVzZWQgaW4gdGhlIGdlbmVyaWMgdGVybSBoZXJlLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVW51c2VkSW1wb3J0cygpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyID0gdW51c2VkRGlyZWN0aXZlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgeHNkRGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkgaXRlci5uZXh0KCk7Ci0gICAgICByZW1vdmVYU0REaXJlY3RpdmUoeHNkRGlyZWN0aXZlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyB0aGUgZGlyZWN0aXZlIGZyb20gdGhlIG1vZGVsCi0gICAqIEBwYXJhbSB4c2RJbXBvcnQKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZVhTRERpcmVjdGl2ZShYU0RTY2hlbWFEaXJlY3RpdmUgeHNkSW1wb3J0KQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IHhzZEltcG9ydC5nZXRTY2hlbWEoKTsKLSAgICAKLSAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RJbXBvcnQuZ2V0RWxlbWVudCgpOwotICAgIAotICAgIERvY3VtZW50IGRvYyA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgaWYgKGRvYyBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgKChJRE9NTm9kZSlkb2MpLmdldE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKCFyZW1vdmVUZXh0Tm9kZXNCZXR3ZWVuTmV4dEVsZW1lbnQoZWxlbWVudCkpCi0gICAgICB7Ci0gICAgICAgIHJlbW92ZVRleHROb2RlQmV0d2VlblByZXZpb3VzRWxlbWVudChlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGVsZW1lbnQpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgaWYgKGRvYyBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgewotICAgICAgICAoKElET01Ob2RlKWRvYykuZ2V0TW9kZWwoKS5jaGFuZ2VkTW9kZWwoKTsKLSAgICAgIH0KLSAgICAgIHNjaGVtYS51cGRhdGUodHJ1ZSk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogVGhpcyBjb21wdXRlcyB0aGUgbGlzdCBvZiB1bnVzZWQgaW1wb3J0cyBmb3IgYSBzY2hlbWEKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVVudXNlZEltcG9ydHMoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHVudXNlZERpcmVjdGl2ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdXNlZFNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdXNlZFByZWZpeGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBzY2hlbWFUb1ByZWZpeE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gU3RlcCBPbmUuICBGaW5kIHVudXNlZCBpbXBvcnRzIHVzaW5nIGNyb3NzIHJlZmVyZW5jZXIKLSAgICAgIE1hcCB4c2ROYW1lZENvbXBvbmVudFVzYWdlID0gVG9wTGV2ZWxDb21wb25lbnRDcm9zc1JlZmVyZW5jZXIuZmluZChzY2hlbWEpOwotICAgICAgCi0gICAgICBkb0Nyb3NzUmVmZXJlbmNlcihzY2hlbWEsIHVzZWRTY2hlbWFzLCB4c2ROYW1lZENvbXBvbmVudFVzYWdlKTsKLQotICAgICAgLy8gU3RlcCBUd28uICBVcGRhdGUgdGhlIHVudXNlZEltcG9ydCBsaXN0IGdpdmVuIHRoZSBsaXN0IG9mIHVzZWQgc2NoZW1hcyBvYnRhaW5lZCBmcm9tIGNyb3NzIHJlZmVyZW5jaW5nCi0gICAgICBhZGRUb1VudXNlZEltcG9ydHMoc2NoZW1hLCB1c2VkU2NoZW1hcyk7Ci0gICAgICAKLSAgICAgIC8vIFN0ZXAgVGhyZWUuICBDb21wdXRlIHVudXNlZCBwcmVmaXhlcyB0byBiZSByZW1vdmVkCi0gICAgICBjb21wdXRlVW51c2VkUHJlZml4ZXMoc2NoZW1hKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHVudXNlZERpcmVjdGl2ZXMuY2xlYXIoKTsKLSAgICAgIHNjaGVtYVRvUHJlZml4TWFwLmNsZWFyKCk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQ29tcHV0ZXMgdGhlIGxpc3Qgb2YgdW51c2VkIHByZWZpeGVzIGZyb20gdGhlIFhNTCBuYW1lc3BhY2UgdGFibGUgZ2l2ZW4gYSBzY2hlbWEKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVVudXNlZFByZWZpeGVzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBNYXAgcHJlZml4TWFwID0gc2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICBTZXQgZGVmaW5lZFByZWZpeGVzID0gcHJlZml4TWFwLmtleVNldCgpOwotICAgIFNldCBhY3R1YWxTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gc2NoZW1hLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgSXRlcmF0b3IgaXRlciA9IGRlZmluZWRQcmVmaXhlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZiA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAocHJlZiA9PSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oWE1MTlMpICE9IG51bGwpCi0gICAgICAgICAgIGFjdHVhbFNldC5hZGQobnVsbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShYTUxOUyArICI6IiArIHByZWYpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBhY3R1YWxTZXQuYWRkKHByZWYpOwotICAgICAgfQotICAgIH0KLQotICAgIHVudXNlZFByZWZpeGVzID0gbmV3IEhhc2hTZXQoYWN0dWFsU2V0KTsKLSAgICAKLSAgICB1c2VkUHJlZml4ZXMuYWRkKHNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFRTmFtZVByZWZpeCgpKTsKLSAgICAKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBzY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgIAotICAgIE5vZGVMaXN0IGNoaWxkRWxlbWVudHMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbGVuZ3RoID0gY2hpbGRFbGVtZW50cy5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IGNoaWxkRWxlbWVudHMuaXRlbShpKTsKLSAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2VET01FbGVtZW50KChFbGVtZW50KW5vZGUsIHNjaGVtYSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIGNvbXB1dGUgdGhlIHVzZWQgcHJlZml4ZXMKLSAgICBjb21wdXRlVXNlZFhTRFByZWZpeGVzKHNjaGVtYSk7Ci0gICAgCi0gICAgLy8gcmVtb3ZlIHRoZSB1c2VkIHByZWZpeGVzIGZyb20gdGhlIHVudXNlZCB0byBnZXQgdGhlIGxpc3Qgb2YgdW51c2VkIHByZWZpeGVzCi0gICAgdW51c2VkUHJlZml4ZXMucmVtb3ZlQWxsKHVzZWRQcmVmaXhlcyk7Ci0gICAgCi0gICAgLy8gcGVyZm9ybSBhZGRpdGlvbmFsIHByb2Nlc3MgZnJvbSBleHRlbmRlcnMKLSAgICBkb0FkZGl0aW9uYWxQcm9jZXNzaW5nKHNjaGVtYSk7Ci0gICAgCi0gICAgc2NoZW1hVG9QcmVmaXhNYXAucHV0KHNjaGVtYSwgdW51c2VkUHJlZml4ZXMpOwotICB9Ci0gIAotICAvKioKLSAgICogUmVtb3ZlIHVudXNlZCBwcmVmaXhlcyBmcm9tIHRoZSBYTUwgbmFtZXNwYWNlIHRhYmxlCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVVbnVzZWRQcmVmaXhlcygpCi0gIHsKLSAgICBTZXQgc2NoZW1hU2V0ID0gc2NoZW1hVG9QcmVmaXhNYXAua2V5U2V0KCk7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHNjaGVtYVNldC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyLm5leHQoKTsKLSAgICAgIE1hcCBwcmVmaXhNYXAgPSBzY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgICAgU2V0IHByZWZpeGVzVG9SZW1vdmUgPSAoU2V0KXNjaGVtYVRvUHJlZml4TWFwLmdldChzY2hlbWEpOwotICAgICAgSXRlcmF0b3IgaXRlcjIgPSBwcmVmaXhlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlcjIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgc3RyaW5nID0gKFN0cmluZylpdGVyMi5uZXh0KCk7Ci0gICAgICAgIGlmIChwcmVmaXhNYXAuY29udGFpbnNLZXkoc3RyaW5nKSkKLSAgICAgICAgICBwcmVmaXhNYXAucmVtb3ZlKHN0cmluZyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogRXh0ZW5kZXJzIGNhbiBjdXN0b21pemUKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZG9BZGRpdGlvbmFsUHJvY2Vzc2luZyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgLy8gRG8gbm90aGluZyBmb3IgWFNECi0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVVc2VkWFNEUHJlZml4ZXMoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIE1hcCBwcmVmaXhNYXAgPSBzY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgIFNldCBkZWZpbmVkUHJlZml4ZXMgPSBwcmVmaXhNYXAua2V5U2V0KCk7Ci0gICAgCi0gICAgYm9vbGVhbiBmb3VuZEVudHJ5Rm9yVGFyZ2V0TmFtZXNwYWNlID0gZmFsc2U7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VkUHJlZml4ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwcmVmaXhNYXAuZ2V0KGtleSk7Ci0gICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwgJiYgdmFsdWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm91bmRFbnRyeUZvclRhcmdldE5hbWVzcGFjZSA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZS5lcXVhbHModmFsdWUpKQotICAgICAgICB7Ci0gICAgICAgICAgZm91bmRFbnRyeUZvclRhcmdldE5hbWVzcGFjZSA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKCFmb3VuZEVudHJ5Rm9yVGFyZ2V0TmFtZXNwYWNlKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGRlZmluZWRQcmVmaXhlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcHJlZml4TWFwLmdldChrZXkpOwotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwgJiYgdmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHVzZWRQcmVmaXhlcy5hZGQobnVsbCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UuZXF1YWxzKHZhbHVlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1c2VkUHJlZml4ZXMuYWRkKGtleSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBGaW5kIHByZWZpeGVzIHRoYXQgYXJlIGluIHRoZSBkb2N1bWVudC4KLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlRE9NRWxlbWVudChFbGVtZW50IGVsZW1lbnQsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICB1c2VkUHJlZml4ZXMuYWRkKHByZWZpeCk7Ci0gICAgCi0gICAgTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IG51bU9mQXR0cnMgPSBhdHRycy5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU9mQXR0cnM7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBhdHRycy5pdGVtKGkpOwotICAgICAgU3RyaW5nIGF0dHJQcmVmaXggPSBub2RlLmdldFByZWZpeCgpOwotICAgICAgaWYgKGF0dHJQcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdXNlZFByZWZpeGVzLmFkZChhdHRyUHJlZml4KTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RyaW5nIGF0dHIgPSBub2RlLmdldExvY2FsTmFtZSgpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIGNvbnRpbnVlOwotICAgICAgICBpZiAoYXR0ci5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpIHx8Ci0gICAgICAgICAgICBhdHRyLmVxdWFscyhYU0RDb25zdGFudHMuUkVGRVJfQVRUUklCVVRFKSB8fAotICAgICAgICAgICAgYXR0ci5lcXVhbHMoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSB8fAotICAgICAgICAgICAgYXR0ci5lcXVhbHMoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKSB8fAotICAgICAgICAgICAgYXR0ci5lcXVhbHMoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSkgfHwKLSAgICAgICAgICAgIGF0dHIuZXF1YWxzKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgdXNlZFByZWZpeGVzLmFkZChleHRyYWN0UHJlZml4KHZhbHVlKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhdHRyLmVxdWFscyhYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlKTsKLSAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICB1c2VkUHJlZml4ZXMuYWRkKGV4dHJhY3RQcmVmaXgodG9rZW4pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIE5vZGVMaXN0IGNoaWxkRWxlbWVudHMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbGVuZ3RoID0gY2hpbGRFbGVtZW50cy5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IGNoaWxkRWxlbWVudHMuaXRlbShpKTsKLSAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2VET01FbGVtZW50KChFbGVtZW50KW5vZGUsIHNjaGVtYSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogRXh0cmFjdCB0aGUgcHJlZml4IGZyb20gdGhlIGdpdmVuIHN0cmluZy4gIEZvciBleGFtcGxlLCBwcmVmOmF0dHIgcmV0dXJucyBwcmVmLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiB0aGUgcHJlZml4Ci0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RQcmVmaXgoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaW50IGluZGV4ID0gdmFsdWUuaW5kZXhPZignOicpOwotICAgIGlmIChpbmRleCA8IDApIAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBkZXRlcm1pbmVzIHRoZSBsaXN0IG9mIHJlZmVyZW5jZWQgY29tcG9uZW50cyBhbmQgaGVuY2UgdGhlIHVzZWQgc2NoZW1hcyBmcm9tIHdoaWNoCi0gICAqIHdlIGNhbiBkZXRlcm1pbmUgd2hhdCBhcmUgdGhlIHVudXNlZCBkaXJlY3RpdmVzCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hCi0gICAqIEBwYXJhbSB1bnVzZWRJbXBvcnRMaXN0Ci0gICAqIEBwYXJhbSB1c2VkU2NoZW1hcwotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZG9Dcm9zc1JlZmVyZW5jZXIoWFNEU2NoZW1hIHNjaGVtYSwgTGlzdCB1c2VkU2NoZW1hcywgTWFwIHhzZE5hbWVkQ29tcG9uZW50VXNhZ2UpCi0gIHsKLSAgICAvLyBDYWxjdWxhdGUgYWRkaXRpb25hbCB1bnVzZWQgaW1wb3J0cyB0aGF0IG1heSBoYXZlIHRoZSBzYW1lCi0gICAgLy8gbmFtZXNwYWNlIHRoYXQgZGlkIG5vdCBnZXQgYWRkZWQgaW4gdGhlIGluaXRpYWwgcGFzcwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0geHNkTmFtZWRDb21wb25lbnRVc2FnZS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIC8vIEZpcnN0IGRldGVybWluZSB0aGUgdXNlZCBzY2hlbWFzIGZyb20gdGhlIGNyb3NzIHJlZmVyZW5jZXIKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBYU0RTY2hlbWEgbmFtZWRDb21wb25lbnRTY2hlbWEgPSBuYW1lZENvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICAgIC8vIElmIHRoZSBuYW1lZCBjb21wb25lbnQgYmVsb25ncyB0byB0aGUgc2FtZSBzY2hlbWEsIHRoZW4gY29udGludWUuLi53ZQotICAgICAgLy8gd2FudCB0byBjaGVjayB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlcwotICAgICAgaWYgKG5hbWVkQ29tcG9uZW50U2NoZW1hID09IHNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgeHNkTmFtZWRDb21wb25lbnRVc2FnZS5nZXQobmFtZWRDb21wb25lbnQpOwotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yMi5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFNldHRpbmcgc2V0dGluZyA9IChTZXR0aW5nKSBpdGVyYXRvcjIubmV4dCgpOwotICAgICAgICBPYmplY3Qgb2JqID0gc2V0dGluZy5nZXRFT2JqZWN0KCk7Ci0gICAgICAgIGlmIChpc0NvbXBvbmVudFVzZWQob2JqLCBzY2hlbWEsIG5hbWVkQ29tcG9uZW50U2NoZW1hKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghdXNlZFNjaGVtYXMuY29udGFpbnMobmFtZWRDb21wb25lbnRTY2hlbWEpKQotICAgICAgICAgICAgdXNlZFNjaGVtYXMuYWRkKG5hbWVkQ29tcG9uZW50U2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIERldGVybWluZXMgaWYgdGhlIG9iamVjdCB0byBiZSBhbmFseXplZCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBzY2hlbWEgCi0gICAqIEBwYXJhbSBvYmoKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKiBAcGFyYW0gdGFyZ2V0U2NoZW1hCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIHJlZmVyZW5jZWQgYnkgdGhlIHNjaGVtYSwgZmFsc2UgaWYgbm90IHJlZmVyZW5jZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQ29tcG9uZW50VXNlZChPYmplY3Qgb2JqLCBYU0RTY2hlbWEgc2NoZW1hLCBYU0RTY2hlbWEgdGFyZ2V0U2NoZW1hKQotICB7Ci0gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgb2JqOwotICAgICAgaWYgKGNvbXBvbmVudCA9PSBzY2hlbWEgfHwgY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoIXVzZWRJbmNsdWRlU2NoZW1hcy5jb250YWlucyh0YXJnZXRTY2hlbWEpKQotICAgICAgICB1c2VkSW5jbHVkZVNjaGVtYXMuYWRkKHRhcmdldFNjaGVtYSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgICogRnJvbSBhIGxpc3Qgb2YgdXNlZCBzY2hlbWFzLCB1cGRhdGUgdGhlIHVudXNlZEltcG9ydHMgbGlzdCBmb3IgdGhlIGdpdmVuIHNjaGVtYQotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKiBAcGFyYW0gdW51c2VkSW1wb3J0cwotICAgKiBAcGFyYW0gdXNlZFNjaGVtYXMKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFRvVW51c2VkSW1wb3J0cyhYU0RTY2hlbWEgc2NoZW1hLCBMaXN0IHVzZWRTY2hlbWFzKQotICB7Ci0gICAgLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgbGlzdCBvZiB1c2VkU2NoZW1hcywgZ2V0IHRoZSBsaXN0IG9mIHVudXNlZAotICAgIC8vIHNjaGVtYXMgYnkgY29tcGFyaW5nIHRoaXMgbGlzdCB0byB3aGF0IGlzIGFjdHVhbGx5IGluIHRoZSBzY2hlbWEKLSAgICBJdGVyYXRvciBpdGVyID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZShpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSBvOwotICAgICAgICBib29sZWFuIGlzVXNlZCA9IGZhbHNlOwotICAgICAgICBJdGVyYXRvciBpdGVyMiA9IHVzZWRTY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyMi5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWEgdXNlZFNjaGVtYSA9IChYU0RTY2hlbWEpIGl0ZXIyLm5leHQoKTsKLSAgICAgICAgICBpZiAoZGlyZWN0aXZlIGluc3RhbmNlb2YgWFNESW1wb3J0ICYmIGRpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpID09IHVzZWRTY2hlbWEpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNVc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGlyZWN0aXZlIGluc3RhbmNlb2YgWFNESW5jbHVkZSAmJiAoKFhTREluY2x1ZGUpZGlyZWN0aXZlKS5nZXRJbmNvcnBvcmF0ZWRTY2hlbWEoKSA9PSB1c2VkU2NoZW1hKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVXNlZCA9IHRydWU7Ci0gICAgICAgICAgICB1c2VkRGlyZWN0SW5jbHVkZXMuYWRkKHVzZWRTY2hlbWEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGJsaW5kbHkgYWNjZXB0IHJlZGVmaW5lcyBhcyB1c2VkCi0gICAgICAgICAgaWYgKGRpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVXNlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIGl0IGlzIGFuIGluY2x1ZGUsIHdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgdXNlZCBpbmRpcmVjdGx5Ci0gICAgICAgIGlmIChkaXJlY3RpdmUgaW5zdGFuY2VvZiBYU0RJbmNsdWRlICYmICFpc1VzZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RJbmNsdWRlIGluYyA9IChYU0RJbmNsdWRlKWRpcmVjdGl2ZTsKLSAgICAgICAgICBYU0RTY2hlbWEgaW5jU2NoZW1hID0gaW5jLmdldEluY29ycG9yYXRlZFNjaGVtYSgpOwotICAgICAgICAgIGlmIChpbmNTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgdXNlZFNjaGVtYSA9IGdldFVzZWRJbmNsdWRlU2NoZW1hKGluY1NjaGVtYSwgaW5jKTsKLSAgICAgICAgICAgIGlmICh1c2VkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVzZWRJbmRpcmVjdEluY2x1ZGVzLmFkZChkaXJlY3RpdmUpOwotICAgICAgICAgICAgICB1c2VkSW5kaXJlY3RJbmNsdWRlc01hcC5wdXQoZGlyZWN0aXZlLCB1c2VkU2NoZW1hKTsKLSAgICAgICAgICAgICAgaXNVc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNVc2VkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiByZXNvbHZlZCBkaXJlY3RpdmVzIGFyZSBkZXRlcm1pbmVkIHVudXNlZAotICAgICAgICAvLyBJZiByZXNvbHZlZCBkaXJlY3RpdmVzIGFyZSBub3QgYWxyZWFkeSBpbiB0aGUgdW51c2VkIGxpc3QKLSAgICAgICAgLy8gQWxzbyBhbnkgcmVkZWZpbmVzIHNob3VsZCBiZSBjb25zaWRlcmVkIHVzZWQKLSAgICAgICAgaWYgKCFpc1VzZWQgJiYgIXVudXNlZERpcmVjdGl2ZXMuY29udGFpbnMoZGlyZWN0aXZlKSAmJiAhKGRpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKSkKLSAgICAgICAgewotICAgICAgICAgIHVudXNlZERpcmVjdGl2ZXMuYWRkKGRpcmVjdGl2ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgSXRlcmF0b3IgaXRlcjMgPSB1c2VkSW5kaXJlY3RJbmNsdWRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyMy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpdGVyMy5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTREluY2x1ZGUpCi0gICAgICB7Ci0gICAgICAgIFhTREluY2x1ZGUgaW5jID0gKFhTREluY2x1ZGUpbzsKLSAgICAgICAgWFNEU2NoZW1hIHRhcmdldFNjaGVtYSA9IChYU0RTY2hlbWEpdXNlZEluZGlyZWN0SW5jbHVkZXNNYXAuZ2V0KGluYyk7Ci0gICAgICAgIGlmICh1c2VkSW5jbHVkZVNjaGVtYXMuY29udGFpbnModGFyZ2V0U2NoZW1hKSAmJiB1c2VkRGlyZWN0SW5jbHVkZXMuY29udGFpbnModGFyZ2V0U2NoZW1hKSkKLSAgICAgICAgewotICAgICAgICAgIHVudXNlZERpcmVjdGl2ZXMuYWRkKGluYyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdXNlZERpcmVjdEluY2x1ZGVzLmFkZCh0YXJnZXRTY2hlbWEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEluY2x1ZGVzIGNhbiBiZSB1c2VkIGluZGlyZWN0bHkuICAgSWYgdGhlIHNjaGVtYSBpbmNsdWRlcyBBIHdoaWNoIGluY2x1ZGVzIEIsIGJ1dCB0aGUgc2NoZW1hCi0gICAqIHJlZmVyZW5jZXMgc29tZXRoaW5nIGluIEIsIHRoZW4gQSBpcyBpbmRpcmVjdGx5IHVzZWQsIGFuZCBoZW5jZSBBIGNhbm5vdCBiZSByZW1vdmVkLgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKiBAcGFyYW0geHNkSW5jbHVkZQotICAgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2VkIHNjaGVtYSBpZiB1c2VkLCBudWxsIGlmIG5vdCB1c2VkCi0gICAqLwotICBwcml2YXRlIFhTRFNjaGVtYSBnZXRVc2VkSW5jbHVkZVNjaGVtYShYU0RTY2hlbWEgc2NoZW1hLCBYU0RJbmNsdWRlIHhzZEluY2x1ZGUpCi0gIHsKLSAgICBYU0RTY2hlbWEgcmVmU2NoZW1hID0gbnVsbDsKLSAgICBib29sZWFuIGlzVXNlZCA9IGZhbHNlOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RJbmNsdWRlKQotICAgICAgewotICAgICAgICBYU0RJbmNsdWRlIGluYyA9IChYU0RJbmNsdWRlKW87Ci0gICAgICAgIFhTRFNjaGVtYSBpbmNTY2hlbWEgPSBpbmMuZ2V0SW5jb3Jwb3JhdGVkU2NoZW1hKCk7Ci0gICAgICAgIGlmIChpbmNTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIyID0gdXNlZEluY2x1ZGVTY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGl0ZXIyLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoID0gKFhTRFNjaGVtYSlpdGVyMi5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoaW5jU2NoZW1hID09IHhzZFNjaCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNVc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgcmVmU2NoZW1hID0gaW5jU2NoZW1hOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKCFpc1VzZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFhbmFseXplZEluY2x1ZGVTY2hlbWFzLmNvbnRhaW5zKGluY1NjaGVtYSkpIC8vIFRvIHByZXZlbnQgaW5maW5pdGUgY3ljbGUKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYW5hbHl6ZWRJbmNsdWRlU2NoZW1hcy5hZGQoaW5jU2NoZW1hKTsKLSAgICAgICAgICAgICAgcmVmU2NoZW1hID0gZ2V0VXNlZEluY2x1ZGVTY2hlbWEoaW5jU2NoZW1hLCBpbmMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaXNVc2VkIHx8IHJlZlNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZWZTY2hlbWE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVmU2NoZW1hOwotICB9Ci0gIAotICAvKioKLSAgICogU2VlIGNyb3NzIHJlZmVyZW5jZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVG9wTGV2ZWxDb21wb25lbnRDcm9zc1JlZmVyZW5jZXIgZXh0ZW5kcyBYU0RVdGlsLlhTRE5hbWVkQ29tcG9uZW50Q3Jvc3NSZWZlcmVuY2VyCi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAKLSAgICBYU0RTY2hlbWEgc2NoZW1hRm9yU2NoZW1hID0gWFNEVXRpbC5nZXRTY2hlbWFGb3JTY2hlbWEoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hRm9yWFNJID0gWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFJbnN0YW5jZShYU0RDb25zdGFudHMuU0NIRU1BX0lOU1RBTkNFX1VSSV8yMDAxKTsKLQotICAgIHByb3RlY3RlZCBUb3BMZXZlbENvbXBvbmVudENyb3NzUmVmZXJlbmNlcihFT2JqZWN0IGFyZzApCi0gICAgewotICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG1hcCBvZiBhbGwgWFNETmFtZWRDb21wb25lbnQgY3Jvc3MgcmVmZXJlbmNlcyBpbiB0aGUgY29udGVudAotICAgICAqIHRyZWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZmluZChFT2JqZWN0IGVPYmplY3QpCi0gICAgewotICAgICAgVG9wTGV2ZWxDb21wb25lbnRDcm9zc1JlZmVyZW5jZXIgcmVzdWx0ID0gbmV3IFRvcExldmVsQ29tcG9uZW50Q3Jvc3NSZWZlcmVuY2VyKGVPYmplY3QpOwotICAgICAgcmVzdWx0LmNyb3NzUmVmZXJlbmNlKCk7Ci0gICAgICByZXN1bHQuZG9uZSgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjcm9zc1JlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgRU9iamVjdCBjcm9zc1JlZmVyZW5jZWRFT2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChjcm9zc1JlZmVyZW5jZWRFT2JqZWN0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBjcm9zc1JlZmVyZW5jZWRFT2JqZWN0OwotCi0gICAgICAgIGlmIChuYW1lZENvbXBvbmVudC5nZXRDb250YWluZXIoKSA9PSBzY2hlbWFGb3JTY2hlbWEgfHwgCi0gICAgICAgICAgICBuYW1lZENvbXBvbmVudC5nZXRDb250YWluZXIoKSA9PSBzY2hlbWFGb3JYU0kgfHwgCi0gICAgICAgICAgICBjcm9zc1JlZmVyZW5jZWRFT2JqZWN0LmVDb250YWluZXIoKSA9PSBlT2JqZWN0IHx8IAotICAgICAgICAgICAgbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gKFhTRFR5cGVEZWZpbml0aW9uKSBuYW1lZENvbXBvbmVudDsKLSAgICAgICAgICBpZiAoISh0eXBlRGVmaW5pdGlvbi5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAodHlwZURlZmluaXRpb24uZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCB0byByZW1vdmUgVGV4dCBub2RlcwotICAgKiBAcGFyYW0gZWxlbWVudAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVUZXh0Tm9kZXNCZXR3ZWVuTmV4dEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTGlzdCBub2Rlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpCi0gICAgewotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgbm9kZXNUb1JlbW92ZS5hZGQobm9kZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IG5vZGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlVG9SZW1vdmUgPSAoTm9kZSkgai5uZXh0KCk7Ci0gICAgICAgICAgbm9kZVRvUmVtb3ZlLmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChub2RlVG9SZW1vdmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCB0byByZW1vdmUgVGV4dCBub2Rlcy4KLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlVGV4dE5vZGVCZXR3ZWVuUHJldmlvdXNFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIExpc3Qgbm9kZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpCi0gICAgewotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgbm9kZXNUb1JlbW92ZS5hZGQobm9kZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IG5vZGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlVG9SZW1vdmUgPSAoTm9kZSkgai5uZXh0KCk7Ci0gICAgICAgICAgbm9kZVRvUmVtb3ZlLmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChub2RlVG9SZW1vdmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGlGaWxlCi0gICAqIEBwYXJhbSBjaGVja1ByZWZlcmVuY2UgLSBpZiBmYWxzZSwgaWdub3JlIGNoZWNraW5nIHRoZSBwcmVmZXJlbmNlIHNldHRpbmcgCi0gICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAqLwotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVVudXNlZFhTREltcG9ydHMoSUZpbGUgaUZpbGUsIGJvb2xlYW4gY2hlY2tQcmVmZXJlbmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICghY2hlY2tQcmVmZXJlbmNlIHx8IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVtb3ZlSW1wb3J0U2V0dGluZygpKQotICAgIHsKLSAgICAgIElET01Nb2RlbCBtb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGlGaWxlKTsKLSAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IFhTRE1vZGVsQWRhcHRlci5sb29rdXBPckNyZWF0ZVNjaGVtYShkb2N1bWVudCk7Ci0gICAgICAgICAgWFNERGlyZWN0aXZlc01hbmFnZXIgbWdyID0gbmV3IFhTRERpcmVjdGl2ZXNNYW5hZ2VyKCk7Ci0gICAgICAgICAgbWdyLnBlcmZvcm1SZW1vdmFsKHNjaGVtYSk7Ci0gICAgICAgICAgbWdyLmNsZWFudXAoKTsKLSAgICAgICAgICBtb2RlbC5zYXZlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNERGlyZWN0aXZlc1NjaGVtYUxvY2F0aW9uVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOGMxOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0REaXJlY3RpdmVzU2NoZW1hTG9jYXRpb25VcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5YU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREltcG9ydEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRERpcmVjdGl2ZXNTY2hlbWFMb2NhdGlvblVwZGF0ZXIKLXsKLSAgLyoqCi0gICAqIE1vZGlmaWVzIHRoZSBzY2hlbWEgbG9jYXRpb24gYnkgb3BlbmluZyB0aGUgc2NoZW1hIGxvY2F0aW9uIGRpYWxvZyBhbmQKLSAgICogcHJvY2Vzc2luZyB0aGUgcmVzdWx0cy4gVGhpcyBtZXRob2QgcmVmYWN0b3JzIHRoZSBjb2RlIGluCi0gICAqIFhTREltcG9ydFNlY3Rpb24kd2lkZ2V0U2VsZWN0ZWQgYW5kIFNjaGVtYUxvY2F0aW9uU2VjdGlvbiR3aWRnZXRTZWxlY3RlZAotICAgKiBhbmQgdGhlIHByb2Nlc3NpbmcgaW4gaGFuZGxlU2NoZW1hTG9jYXRpb25DaGFuZ2UoKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVNjaGVtYUxvY2F0aW9uKFhTRFNjaGVtYSB4c2RTY2hlbWEsIE9iamVjdCBzZWxlY3Rpb24sIGJvb2xlYW4gaXNJbmNsdWRlKQotICB7Ci0gICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgIElGaWxlIGN1cnJlbnRJRmlsZSA9IG51bGw7Ci0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICBWaWV3ZXJGaWx0ZXIgZmlsdGVyOwotCi0gICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICB7Ci0gICAgICBjdXJyZW50SUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRGaWxlKCk7Ci0gICAgICBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIobmV3IFN0cmluZ1tdIHsgIi54c2QiIH0sIC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgbmV3IElGaWxlW10geyBjdXJyZW50SUZpbGUgfSwgbnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIobmV3IFN0cmluZ1tdIHsgIi54c2QiIH0sIC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZmlsZVNlbGVjdFdpemFyZCA9IG5ldyBYU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZCh4c2RTY2hlbWEsIGlzSW5jbHVkZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9TQ0hFTUEiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRklMRURJQUxPR19TRUxFQ1RfWE1MX0RFU0MiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaWx0ZXIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCi0gICAgV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIGZpbGVTZWxlY3RXaXphcmQpOwotICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLSAgICB3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICB7Ci0gICAgICBJRmlsZSBzZWxlY3RlZElGaWxlID0gZmlsZVNlbGVjdFdpemFyZC5nZXRSZXN1bHRGaWxlKCk7Ci0gICAgICBTdHJpbmcgc2NoZW1hRmlsZVN0cmluZzsKLSAgICAgIGlmIChzZWxlY3RlZElGaWxlICE9IG51bGwgJiYgY3VycmVudElGaWxlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNjaGVtYUZpbGVTdHJpbmcgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoc2VsZWN0ZWRJRmlsZS5nZXRMb2NhdGlvbigpLCBjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZElGaWxlICE9IG51bGwgJiYgY3VycmVudElGaWxlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNjaGVtYUZpbGVTdHJpbmcgPSBzZWxlY3RlZElGaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2NoZW1hRmlsZVN0cmluZyA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0VVJMKCk7Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVTY2hlbWFMb2NhdGlvbiA9ICJzY2hlbWFMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICB7Ci0gICAgICAgIFhTREltcG9ydCB4c2RJbXBvcnQgPSAoWFNESW1wb3J0KSBzZWxlY3Rpb247Ci0gICAgICAgIHhzZEltcG9ydC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZVNjaGVtYUxvY2F0aW9uLCBzY2hlbWFGaWxlU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBmaWxlU2VsZWN0V2l6YXJkLmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgICAgbmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEgPSBmaWxlU2VsZWN0V2l6YXJkLmdldEV4dGVybmFsU2NoZW1hKCk7Ci0gICAgICAgIGphdmEudXRpbC5NYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIHhtbG5zIGluIHRoZSBzY2hlbWEgZWxlbWVudCBmaXJzdCwgYW5kIHRoZW4gdXBkYXRlIHRoZQotICAgICAgICAvLyBpbXBvcnQgZWxlbWVudCBuZXh0IHNvIHRoYXQgdGhlIGxhc3QgY2hhbmdlIHdpbGwgYmUgaW4gdGhlIGltcG9ydCBlbGVtZW50LiBUaGlzIGtlZXBzIHRoZQotICAgICAgICAvLyBzZWxlY3Rpb24gb24gdGhlIGltcG9ydCBlbGVtZW50Ci0gICAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcihleHRlcm5hbFNjaGVtYSk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSwgZmFsc2UpOwotCi0gICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkocHJlZml4KSkKLSAgICAgICAgewotICAgICAgICAgIHByZWZpeCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwgfHwgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ0J1ZmZlciBuZXdQcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCJwcmVmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpbnQgcHJlZml4RXh0ZW5zaW9uID0gMTsKLSAgICAgICAgICB3aGlsZSAobWFwLmNvbnRhaW5zS2V5KG5ld1ByZWZpeC50b1N0cmluZygpKSAmJiBwcmVmaXhFeHRlbnNpb24gPCAxMDApCi0gICAgICAgICAgewotICAgICAgICAgICAgbmV3UHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigicHJlZiIgKyBTdHJpbmcudmFsdWVPZihwcmVmaXhFeHRlbnNpb24pKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcHJlZml4RXh0ZW5zaW9uKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByZWZpeCA9IG5ld1ByZWZpeC50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9ICJuYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaWYgbnMgYWxyZWFkeSBpbiBtYXAsIHVzZSBpdHMgY29ycmVzcG9uZGluZyBwcmVmaXgKLSAgICAgICAgICBpZiAobWFwLmNvbnRhaW5zVmFsdWUobmFtZXNwYWNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlc0hlbHBlciB0eXBlc0hlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgICAgICAgcHJlZml4ID0gdHlwZXNIZWxwZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgLy8gb3RoZXJ3aXNlIGFkZCB0byB0aGUgbWFwCi0gICAgICAgICAgewotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIG5hbWVzcGFjZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gcHJlZml4VGV4dC5zZXRUZXh0KHByZWZpeCk7Ci0gICAgICAgICAgeHNkSW1wb3J0LmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZXNwYWNlLCBuYW1lc3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTU4ODUKLSAgICAgICAgLy8gTmVlZCB0byBpbXBvcnQgb3RoZXJ3aXNlIHRoZSBleHRlcm5hbCBzY2hlbWEgaXMgbmV2ZXIKLSAgICAgICAgLy8gcmVzb2x2ZWQuIE9uZSBwcm9ibGVtIGlzIHRoYXQgdGhlIHNjaGVtYSBsb2NhdGlvbiBpcyBzdGlsbCBudWxsLAotICAgICAgICAvLyBzbyB0aGUgc2V0IHR5cGVzIGRpYWxvZyB3aWxsIHNob3cgdHlwZXMgdGhhdCBiZWxvbmcgdG8gdGhhdCBzY2hlbWEKLSAgICAgICAgLy8gd2l0aCBhIG51bGwgc2NoZW1hIGxvY2F0aW9uLiBUaGlzIHNob3VsZCBsb2FkIHJlc291cmNlCi0gICAgICAgIC8vIGludG8gdGhlIHJlc291cmNlIHNldAotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNESW1wb3J0SW1wbCkgLy8gcmVkdW5kYW50Ci0gICAgICAgIHsKLSAgICAgICAgICBYU0RJbXBvcnRJbXBsIHhzZEltcG9ydEltcGwgPSAoWFNESW1wb3J0SW1wbCkgc2VsZWN0aW9uOwotICAgICAgICAgIHhzZEltcG9ydEltcGwuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICAgIHsKLSAgICAgICAgWFNESW5jbHVkZSB4c2RJbmNsdWRlID0gKFhTREluY2x1ZGUpIHNlbGVjdGlvbjsKLSAgICAgICAgeHNkSW5jbHVkZS5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZVNjaGVtYUxvY2F0aW9uLCBzY2hlbWFGaWxlU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgewotICAgICAgICBYU0RSZWRlZmluZSB4c2RSZWRlZmluZSA9IChYU0RSZWRlZmluZSkgc2VsZWN0aW9uOwotICAgICAgICB4c2RSZWRlZmluZS5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZVNjaGVtYUxvY2F0aW9uLCBzY2hlbWFGaWxlU3RyaW5nKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzZjYzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotX1VJX0FDVElPTl9PUEVOX0lOX05FV19FRElUT1I9T3BlbiBJbiBOZXcgRWRpdG9yCi1fVUlfQUNUSU9OX0RFTEVURV9DT05TVFJBSU5UUz1EZWxldGUgQ29uc3RyYWludHMKLV9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OPURlbGV0ZSBFbnVtZXJhdGlvbgotX1VJX0FDVElPTl9ERUxFVEVfQVBQSU5GT19FTEVNRU5UPURlbGV0ZSBBcHBJbmZvIEVsZW1lbnQKLV9VSV9BQ1RJT05fREVMRVRFX0FQUElORk9fQVRUUklCVVRFPURlbGV0ZSBBcHBJbmZvIEF0dHJpYnV0ZQotX1VJX0FDVElPTl9ERUxFVEVfRVhURU5TSU9OX0NPTVBPTkVOVD1EZWxldGUgRXh0ZW5zaW9uIENvbXBvbmVudAotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQPUFkZCBBdHRyaWJ1dGUgR3JvdXAKLV9VSV9BQ1RJT05fQUREX0FQUElORk9fRUxFTUVOVD1BZGQgQXBwSW5mbyBFbGVtZW50Ci1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEU9QWRkIEF0dHJpYnV0ZQotX1VJX0FDVElPTl9BRERfR1JPVVBfUkVGPUFkZCBHcm91cCBSZWYKLV9VSV9BQ1RJT05fQUREX0FOWV9FTEVNRU5UPUFkZCBBbiZ5Ci1fVUlfQUNUSU9OX0FERF9BTllfQVRUUklCVVRFPUFkZCBBbnkgQXR0cmlidXRlCi1fVUlfQUNUSU9OX0FERF9XSVRIX0RPVFM9QWRkLi4uCi1fVUlfQUNUSU9OX1VQREFURV9CT1VORFM9VXBkYXRlIGJvdW5kcwotX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFPUFkZCBDb21wbGV4IFR5cGUKLV9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OUz1BZGQgRW51bWVyYXRpb25zCi1fVUlfQUNUSU9OX0FERF9ET0NVTUVOVEFUSU9OPUFkZCBEb2N1bWVudGF0aW9uCi1fVUlfQUNUSU9OX0NPTlNUUkFJTl9MRU5HVEg9Q29uc3RyYWluIGxlbmd0aAotX1VJX0FDVElPTl9CUk9XU0VfV09SS1NQQUNFPVdvcmtzcGFjZQotX1VJX0xBQkVMX05PX0lURU1TX1NFTEVDVEVEPU5vIGl0ZW1zIHNlbGVjdGVkCi1fVUlfTEFCRUxfRVhURU5TSU9OX0RFVEFJTFM9RXh0ZW5zaW9uIERldGFpbHMKLV9VSV9MQUJFTF9FWFRFTlNJT05fQ0FURUdPUklFUz1FeHRlbnNpb24gQ2F0ZWdvcmllczoKLV9VSV9MQUJFTF9DT0xMQVBTRV9XSElURVNQQUNFPUNvbGxhcHNlIHdoaXRlc3BhY2UKLV9VSV9MQUJFTF9SRVNUUklDVF9WQUxVRVNfQlk9UmVzdHJpY3QgdmFsdWVzIGJ5OgotX1VJX0xBQkVMX01JTklNVU1fTEVOR1RIPU1pbmltdW0gbGVuZ3RoOgotX1VJX0xBQkVMX01BWElNVU1fTEVOR1RIPU1heGltdW0gbGVuZ3RoOgotX1VJX0xBQkVMX1NFTEVDVF9YU0RfRklMRT1TZWxlY3QgWFNEIGZpbGUKLV9VSV9MQUJFTF9DT05TVFJBSU5UU19PTl9WQUxVRV9PRj1Db25zdHJhaW50cyBvbiB2YWx1ZSBvZiAKLV9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFPUFkZCBTaW1wbGUgVHlwZQotX1VJX0FDVElPTl9FRElUX1dJVEhfRE9UUz1FZGl0Li4uCi1fVUlfQUNUSU9OX0NIQU5HRV9QQVRURVJOPUNoYW5nZSBwYXR0ZXJuCi1fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTj1BZGQgRW51bWVyYXRpb24KLV9VSV9BQ1RJT05fREVMRVRFX1BBVFRFUk49RGVsZXRlIFBhdHRlcm4KLV9VSV9BQ1RJT05fQlJPV1NFX0NBVEFMT0c9Q2F0YWxvZwotX1VJX0FDVElPTl9BRERfR1JPVVA9QWRkIEdyb3VwCi1fVUlfQUNUSU9OX0FERF9QQVRURVJOPUFkZCBwYXR0ZXJuCi1fVUlfQUNUSU9OX1NFVF9CQVNFX1RZUEU9U2V0IEJhc2UgVHlwZQotX1VJX0VSUk9SX0lOVkFMSURfTkFNRT1JbnZhbGlkIG5hbWUKLV9VSV9FUlJPUl9JTlZBTElEX0ZJTEU9SW52YWxpZCBmaWxlCi1fVUlfRVJST1JfSU5WQUxJRF9DQVRFR09SWT1JbnZhbGlkIENhdGVnb3J5Ci1fVUlfQUNUSU9OX0RFTEVURT1EZWxldGUKLV9VSV9BQ1RJT05fQUREPUFkZAotX1VJX0FDVElPTl9SRU5BTUU9UmVuYW1lCi1fVUlfTEFCRUxfUEFUVEVSTj1QYXR0ZXJuCi1fVUlfTEFCRUxfUEFUVEVSTlM9UGF0dGVybnMKLV9VSV9MQUJFTF9OQU1FPU5hbWU6Ci1fVUlfTEFCRUxfVFlQRT1UeXBlOiAKLV9VSV9MQUJFTF9CQVNFPUJhc2UKLV9VSV9MQUJFTF9VUD1VcAotX1VJX0xBQkVMX0RPV049RG93bgotX1VJX0xBQkVMX0RFTEVURT1EZWxldGUKLV9VSV9MQUJFTF9TQ0hFTUE9U2NoZW1hOgotX1VJX0xBQkVMX0VESVQ9RWRpdAotX1VJX0xBQkVMX1JFRkVSRU5DRT1SZWZlcmVuY2U6Ci1fVUlfTEFCRUxfUkVBRE9OTFk9UmVhZE9ubHkKLV9VSV9MQUJFTF9JTkNMVVNJVkU9SW5jbHVzaXZlCi1fVUlfTEFCRUxfRU5VTUVSQVRJT05TPUVudW1lcmF0aW9ucwotX1VJX0xBQkVMX0VYVEVOU0lPTlM9RXh0ZW5zaW9ucwotX1VJX0xBQkVMX01JTklNVU1fVkFMVUU9TWluaW11bSB2YWx1ZToKLV9VSV9MQUJFTF9NQVhJTVVNX1ZBTFVFPU1heGltdW0gdmFsdWU6Ci1fVUlfTEFCRUxfQ09OVFJBSU5UU19PTj1Db25zdHJhaW50cyBvbiAKLV9VSV9MQUJFTF9BRERfV0lUSF9ET1RTPUFkZC4uLgotX1VJX0xBQkVMX0FERF9DQVRFR09SWT1BZGQgQ2F0ZWdvcnkKLV9VSV9MQUJFTF9FRElUX0NBVEVHT1JZPUVkaXQgQ2F0ZWdvcnkKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUY9QWRkIEF0dHJpYnV0ZSBHcm91cCBSZWYKLV9VSV9BQ1RJT05fQUREX0VYVEVOU0lPTl9DT01QT05FTlQ9QWRkIEV4dGVuc2lvbiBDb21wb25lbnQKLV9VSV9BQ1RJT05fQUREX0VYVEVOU0lPTl9DT01QT05FTlRTPUFkZCBFeHRlbnNpb24gQ29tcG9uZW50cwotX1VJX0xBQkVMX0NPTlNUUkFJTlRTX09OX0xFTkdUSF9PRj1Db25zdHJhaW50cyBvbiBsZW5ndGggb2YgCi1fVUlfQUNUSU9OX0FERF9BUFBJTkZPX0FUVFJJQlVURT1BZGQgQXBwSW5mbyBBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fU0VUX0VOVU1FUkFUSU9OX1ZBTFVFPVNldCBFbnVtZXJhdGlvbiBWYWx1ZQotX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0U9VXBkYXRlIEVsZW1lbnQgUmVmZXJlbmNlCi1fVUlfQUNUSU9OX1VQREFURV9NQVhJTVVNX09DQ1VSUkVOQ0U9VXBkYXRlIE1heGltdW0gT2NjdXJyZW5jZQotX1VJX0FDVElPTl9VUERBVEVfTUlOSU1VTV9PQ0NVUlJFTkNFPVVwZGF0ZSBNaW5pbXVtIE9jY3VycmVuY2UKLV9VSV9BQ1RJT05fQ0hBTkdFX01BWElNVU1fT0NDVVJSRU5DRT1NYXhpbXVtIE9jY3VycmVuY2UgQ2hhbmdlIAotX1VJX0FDVElPTl9DSEFOR0VfTUlOSU1VTV9PQ0NVUlJFTkNFPU1pbmltdW0gT2NjdXJyZW5jZSBDaGFuZ2UKLV9VSV9MQUJFTF9TUEVDSUZJQ19DT05TVFJBSU5UX1ZBTFVFUz1TcGVjaWZpYyBjb25zdHJhaW50IHZhbHVlcwotX1VJX0xBQkVMX0FWQUlMQUJMRV9DT01QT05FTlRTX1RPX0FERD1BdmFpbGFibGUgY29tcG9uZW50cyB0byBBZGQ6Ci1fVUlfQUNUSU9OX0NIQU5HRV9DT05URU5UX01PREVMPUNoYW5nZSBDb250ZW50IE1vZGVsCi1fVUlfRVJST1JfRklMRV9DQU5OT1RfQkVfUEFSU0VEPVRoZSB4c2QgZmlsZSBvZiB0aGUgc2VsZWN0ZWQgY2F0ZWdvcnkgY2Fubm90IGJlIHBhcnNlZC4KLV9VSV9ERVNDUklQVElPTl9DSE9PU0VfWFNEX0ZJTEU9Q2hvb3NlIGFuIFhTRCBmaWxlIGNvbnRhaW5pbmcgc2NoZW1hIGZvciB5b3VyIGV4dGVuc2libGUgY29tcG9uZW50cwotX1VJX0VSUk9SX1ZBTElEQVRFX1RIRV9GSUxFPVBsZWFzZSB2YWxpZGF0ZSB0aGUgZmlsZS4KLV9VSV9FUlJPUl9OQU1FX0FMUkVBRFlfVVNFRD1UaGUgbmFtZSBpcyBhbHJlYWR5IGJlaW5nIHVzZWQuCi1fVUlfQUNUSU9OX0NPTExBUFNFX1dISVRFU1BBQ0U9Q29sbGFwc2Ugd2hpdGVzcGFjZQotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX0RFRklOSVRJT049QWRkIEF0dHJpYnV0ZSBHcm91cCBEZWZpbml0aW9uCi1fVUlfRVJST1JfSU5WQUxJRF9WQUxVRV9GT1JfTUFYSU1VTV9PQ0NVUlJFTkNFPUludmFsaWQgdmFsdWUgZm9yIG1heGltdW0gb2NjdXJyZW5jZQotX1VJX1RPT0xUSVBfUkVOQU1FX1JFRkFDVE9SPUNsaWNrIGhlcmUgdG8gaW52b2tlIHRoZSBSZW5hbWUgcmVmYWN0b3JpbmcuCi1fVUlfVkFMVUVfQ09MT049VmFsdWU6Ci1fVUlfSUQ9SUQ6Ci1fVUlfUkVGPVJlZmVyZW5jZToKLV9VSV9GSVhFRD1GaXhlZAotX1VJX0RFRkFVTFQ9RGVmYXVsdAotX1VJX0ZPUk09Rm9ybSBxdWFsaWZpY2F0aW9uOgotIyBUaGUgZm9sbG93aW5nIHN0cmluZyB3aWxsIGJlIHVzZWQgZm9yIHRoZSB1bmRvIGFjdGlvbi4gIEFuCi0jIGV4YW1wbGUgbGFiZWwgaXM6IFVuZG8gQWJzdHJhY3QgQ2hhbmdlCi1fVUlfQUNUSU9OX0NIQU5HRT17MH0gQ2hhbmdlCi1fVUlfQUNUSU9OX05BTUVTUEFDRV9JTkZPUk1BVElPTl9DSEFOR0U9TmFtZXNwYWNlIEluZm9ybWF0aW9uIENoYW5nZQotX1VJX0xBQkVMX0FCU1RSQUNUPUFic3RyYWN0Ci1fVUlfTEFCRUxfQkxPQ0s9QmxvY2sKLV9VSV9MQUJFTF9GSU5BTD1GaW5hbAotX1VJX0xBQkVMX1NVQlNUSVRVVElPTl9HUk9VUD1TdWJzdGl0dXRpb24gR3JvdXAKLV9VSV9MQUJFTF9NSVhFRD1NaXhlZAotX1VJX0xBQkVMX1ZBTFVFPVZhbHVlCi1fVUlfVVNBR0U9VXNhZ2UKLV9VSV9MQUJFTF9GT1JNPUZvcm0KLV9VSV9MQUJFTF9OSUxMQUJMRT1OaWxsYWJsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0NoZWNrcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0NoZWNrcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjAyODBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9DaGVja3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5OYW1lVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ2hlY2tzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrTmFtZShTdHJpbmcgbmFtZSkgewotCQlSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQ9IG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQlpZiAoIiIuZXF1YWxzKG5hbWUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlRmF0YWxFcnJvclN0YXR1cygiUmVmYWN0b3JpbmdNZXNzYWdlcy5DaGVja3NfQ2hvb3NlX25hbWUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWxyZWFkeU5hbWVkKFJlZmFjdG9yaW5nQ29tcG9uZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lKXsKLQkJcmV0dXJuIG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbXBvbmVudE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0PSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJaWYgKCFOYW1lVmFsaWRhdG9yLmlzVmFsaWQobmFtZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGVGYXRhbEVycm9yU3RhdHVzKCJSZWZhY3RvcmluZ01lc3NhZ2VzLkNoZWNrc19DaG9vc2VfbmFtZSIpOyAgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSU5hbWVVcGRhdGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0lOYW1lVXBkYXRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4OTY2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSU5hbWVVcGRhdGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lVXBkYXRpbmcgewotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpOwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmV3RWxlbWVudE5hbWUoKTsKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEN1cnJlbnRFbGVtZW50TmFtZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSVJlZmVyZW5jZVVwZGF0aW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvSVJlZmVyZW5jZVVwZGF0aW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjQ4ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0lSZWZlcmVuY2VVcGRhdGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZlcmVuY2VVcGRhdGluZyB7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyByZWZhY3RvcmluZyBvYmplY3QgaXMgY2FwYWJsZSBvZiB1cGRhdGluZyByZWZlcmVuY2VzIHRvIHRoZSByZW5hbWVkIGVsZW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlVXBkYXRlUmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogSWYgPGNvZGU+Y2FuVXBkYXRlUmVmZXJlbmNlczwvY29kZT4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvCi0JICogaW5mb3JtIHRoZSByZWZhY3RvcmluZyBvYmplY3Qgd2hldGhlciByZWZlcmVuY2VzIHNob3VsZCBiZSB1cGRhdGVkLgotCSAqIFRoaXMgY2FsbCBjYW4gYmUgaWdub3JlZCBpZiAgPGNvZGU+Y2FuVXBkYXRlUmVmZXJlbmNlczwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZVJlZmVyZW5jZXMoYm9vbGVhbiB1cGRhdGUpOwotCi0JLyoqCi0JICogSWYgPGNvZGU+Y2FuVXBkYXRlUmVmZXJlbmNlczwvY29kZT4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvCi0JICogYXNrIHRoZSByZWZhY3RvcmluZyBvYmplY3Qgd2hldGhlciByZWZlcmVuY2VzIHNob3VsZCBiZSB1cGRhdGVkLgotCSAqIFRoaXMgY2FsbCBjYW4gYmUgaWdub3JlZCBpZiAgPGNvZGU+Y2FuVXBkYXRlUmVmZXJlbmNlczwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRVcGRhdGVSZWZlcmVuY2VzKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1BlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA3MzllYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlByb2Nlc3NvckJhc2VkUmVmYWN0b3Jpbmc7Ci0KLXB1YmxpYyBjbGFzcyBQZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIAoteyAKLSAgcHJpdmF0ZSBQcm9jZXNzb3JCYXNlZFJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nOwotICAKLSAgcHVibGljIFBlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb24oUHJvY2Vzc29yQmFzZWRSZWZhY3RvcmluZyByZWZhY3RvcmluZykKLSAgewotICAgIHRoaXMucmVmYWN0b3JpbmcgPSByZWZhY3RvcmluZzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pCi0gIHsKLSAgICBpZiAocG0gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBwbSA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgfSAgCi0gICAgdHJ5Ci0gICAgeyAKLSAgICAgIHJlZmFjdG9yaW5nLmNoZWNrQWxsQ29uZGl0aW9ucyhwbSk7Ci0gICAgICBDaGFuZ2UgY2hhbmdlID0gcmVmYWN0b3JpbmcuY3JlYXRlQ2hhbmdlKHBtKTsgICAKLSAgICAgIGlmIChjaGFuZ2UgaW5zdGFuY2VvZiBDb21wb3NpdGVDaGFuZ2UpCi0gICAgICB7Ci0gICAgICAgIENvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UgPSAoQ29tcG9zaXRlQ2hhbmdlKWNoYW5nZTsKLSAgICAgICAgc2V0U2F2ZU1vZGUoY29tcG9zaXRlQ2hhbmdlKTsgICAgICAgICAgICAgIAotICAgICAgfSAgCi0gICAgICBjaGFuZ2UucGVyZm9ybShwbSk7ICAgICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRTYXZlTW9kZShDb21wb3NpdGVDaGFuZ2UgY29tcG9zaXRlKQotICB7Ci0gICAgQ2hhbmdlW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIENoYW5nZSBjaGlsZCA9IGNoaWxkcmVuW2ldOwotICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dEZpbGVDaGFuZ2UpCi0gICAgICB7Ci0gICAgICAgICgoVGV4dEZpbGVDaGFuZ2UpY2hpbGQpLnNldFNhdmVNb2RlKFRleHRGaWxlQ2hhbmdlLkxFQVZFX0RJUlRZKTsKLSAgICAgIH0gCi0gICAgICBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIENvbXBvc2l0ZUNoYW5nZSkKLSAgICAgIHsKLSAgICAgICAgc2V0U2F2ZU1vZGUoKENvbXBvc2l0ZUNoYW5nZSljaGlsZCk7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgfQotfSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yaW5nQ29tcG9uZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVmYWN0b3JpbmdDb21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0YmM4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVmYWN0b3JpbmdDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFJlZmFjdG9yaW5nQ29tcG9uZW50Ci17Ci0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRoYXQgaXMgcmVmYWN0b3JlZC4gIEUuZy4gImZvbyIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNvbXBvbmVudCB0aGF0IGlzIHJlZmFjdG9yZWQuICBFLmcuICJodHRwOi8vZm9vIgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCi0JLyoqCi0JICogVGhlIGJhc2ljIERPTSBlbGVtZW50IGlzIHVzZWQgYnkgdGhlIHJlZmFjdG9yaW5nIHByb2Nlc3Nvci9wYXJ0aWNpcGFudCB0byBnZXQgCi0JICogYWNjZXNzIHRvIHRoZSBmaWxlIGxvY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFN0cnVjdHVyZWQgU291cmNlIEVkaXRvciBYTUwgRE9NIGVsZW1lbnQgb2JqZWN0IHRoYXQgdW5kZXJsaW5lcyB0aGUgCi0JICogY29tYm9uZW50IGJlaW5nIHJlZmFjdG9yZS4KLQkgKiAKLQkgKiBAc2VlIElET01FbGVtZW50IAotCSAqLwotCXB1YmxpYyBJRE9NRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0JCi0JLyoqIAotCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoZSByZWZhY3RvcmVkIGNvbXBvbmVudC4gCi0JICogCi0JICogPHA+Ci0JICogQSBxdWFsaWZpZWQgbmFtZSBjb25zaXN0cyBvZiBhIGxvY2FsIG5hbWUgYW5kIGEgbmFtZXNwYWNlLiAgCi0JICogRS5nLiAiY29tcGxleFR5cGUiLWxvY2FsIG5hbWUsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSItbmFtZXNwYWNlCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgUXVhbGlmaWVkTmFtZQotCSAqLwotCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldFR5cGVRTmFtZSgpOwotCQkKLQkvKiogCi0JICogVGhlIG1vZGVsIG9iamVjdCBtYXkgYmUgcmVxdWlyZWQgdG8gYmUgZ2l2ZW4gdG8gdGhlIHJlZmFjdG9yZWQgcGFydGljaXBhbnRzIGFzIGlzIG9yIAotCSAqIG90aGVyIG9iamVjdHMgY291bGQgYmUgZGVyaXZlZCBmcm9tIGl0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByaW5jaXBhbCBvYmplY3QgYmVpbmcgcmVmYWN0b3JlZCwgc3VjaCBhcyBhbiBpbnN0YW5jZSBvZiBXU0RMRWxlbWVudCBvciAKLQkgKiBYU0ROYW1lZENvbXBvbmVudAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yaW5nTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvcmluZ01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZWQ0YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yaW5nTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgUmVmYWN0b3JpbmdNZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQlVORExFPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZT0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFJFU09VUkNFX0JVTkRMRSk7Ci0KLQlwcml2YXRlIFJlZmFjdG9yaW5nTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFN0cmluZ3MoU3RyaW5nIGtleXNbXSkgewotCQlTdHJpbmdbXSByZXN1bHQ9IG5ldyBTdHJpbmdba2V5cy5sZW5ndGhdOwotCQlmb3IgKGludCBpPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldPSBnZXRTdHJpbmcoa2V5c1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcpIHsKLQkJcmV0dXJuIGdldEZvcm1hdHRlZFN0cmluZyhrZXksIG5ldyBPYmplY3RbXSB7IGFyZyB9KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmdzKTsJCi0JfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9UZXh0Q2hhbmdlTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1RleHRDaGFuZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzUzZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1RleHRDaGFuZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci0KLS8qKgotICogQSA8Y29kZT5UZXh0Q2hhbmdlTWFuYWdlcjwvY29kZT4gbWFuYWdlcyBhc3NvY2lhdGlvbnMgYmV0d2VlbiA8Y29kZT5JRmlsZTwvY29kZT4gYW5kIDxjb2RlPlRleHRDaGFuZ2U8L2NvZGU+IG9iamVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0Q2hhbmdlTWFuYWdlciB7Ci0JCi0JcHJpdmF0ZSBNYXAgZk1hcD0gbmV3IEhhc2hNYXAoMTApOyAvLyBJRmlsZSAtPiBUZXh0Q2hhbmdlCi0JCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZLZWVwRXhlY3V0ZWRUZXh0RWRpdHM7Ci0JCi0JcHVibGljIFRleHRDaGFuZ2VNYW5hZ2VyKCkgewotCQl0aGlzKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dENoYW5nZU1hbmFnZXIoYm9vbGVhbiBrZWVwRXhlY3V0ZWRUZXh0RWRpdHMpIHsKLQkJZktlZXBFeGVjdXRlZFRleHRFZGl0cz0ga2VlcEV4ZWN1dGVkVGV4dEVkaXRzOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIGdpdmVuIGZpbGUgYW5kIHRoZSBwYXNzZWQKLQkgKiBjaGFuZ2UgdG8gdGhpcyBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIChrZXkpCi0JICogQHBhcmFtIGNoYW5nZSB0aGUgY2hhbmdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIG1hbmFnZShJRmlsZSBmaWxlLCBUZXh0Q2hhbmdlIGNoYW5nZSkgewotCQlmTWFwLnB1dChmaWxlLCBjaGFuZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5UZXh0Q2hhbmdlPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUuCi0JICogSWYgdGhlIG1hbmFnZXIgZG9lcyBub3QgYWxyZWFkeSBtYW5hZ2UgYW4gYXNzb2NpYXRpb24gaXQgY3JlYXRlcyBhIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIHRleHQgYnVmZmVyIGNoYW5nZSBpcyByZXF1ZXN0ZWQKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZpbGUuIAotCSAqLwotCXB1YmxpYyBUZXh0Q2hhbmdlIGdldChJRmlsZSBmaWxlKSB7Ci0JCVRleHRDaGFuZ2UgcmVzdWx0PSAoVGV4dENoYW5nZSlmTWFwLmdldChmaWxlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQ9IG5ldyBUZXh0RmlsZUNoYW5nZShmaWxlLnRvU3RyaW5nKCksIGZpbGUpOwotCQkJcmVzdWx0LnNldEtlZXBQcmV2aWV3RWRpdHMoZktlZXBFeGVjdXRlZFRleHRFZGl0cyk7Ci0JCQlyZXN1bHQuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJZk1hcC5wdXQoZmlsZSwgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSA8dHQ+VGV4dENoYW5nZTwvdHQ+IG1hbmFnZWQgdW5kZXIgdGhlIGdpdmVuIGtleQotCSAqIDxjb2RlPnVuaXQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtIHVuaXQgdGhlIGtleSBkZXRlcm1pbmluZyB0aGUgPHR0PlRleHRDaGFuZ2U8L3R0PiB0byBiZSByZW1vdmVkLgotCSAqIEByZXR1cm4gdGhlIHJlbW92ZWQgPHR0PlRleHRDaGFuZ2U8L3R0Pi4KLQkgKi8KLQlwdWJsaWMgVGV4dENoYW5nZSByZW1vdmUoSUZpbGUgdW5pdCkgewotCQlyZXR1cm4gKFRleHRDaGFuZ2UpZk1hcC5yZW1vdmUodW5pdCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRleHQgY2hhbmdlcyBtYW5hZ2VkIGJ5IHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBhbGwgdGV4dCBjaGFuZ2VzIG1hbmFnZWQgYnkgdGhpcyBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBUZXh0Q2hhbmdlW10gZ2V0QWxsQ2hhbmdlcygpewotCQlyZXR1cm4gKFRleHRDaGFuZ2VbXSlmTWFwLnZhbHVlcygpLnRvQXJyYXkobmV3IFRleHRDaGFuZ2VbZk1hcC52YWx1ZXMoKS5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBmaWxlcyBtYW5hZ2VkIGJ5IHRoaXMgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBhbGwgZmlsZXMgbWFuYWdlZCBieSB0aGlzIGluc3RhbmNlCi0JICovCQotCXB1YmxpYyBJRmlsZVtdIGdldEFsbENvbXBpbGF0aW9uVW5pdHMoKXsKLQkJcmV0dXJuIChJRmlsZVtdKSBmTWFwLmtleVNldCgpLnRvQXJyYXkobmV3IElGaWxlW2ZNYXAua2V5U2V0KCkuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIENsZWFycyBhbGwgYXNzb2NpYXRpb25zIGJldHdlZW4gcmVzb3VyY2VzIGFuZCB0ZXh0IGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWZNYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGlmIGFueSB0ZXh0IGNoYW5nZXMgYXJlIG1hbmFnZWQgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW55IHRleHQgY2hhbmdlcyBhcmUgbWFuYWdlZCBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0NoYW5nZXNJbihJRmlsZSBmaWxlKXsKLQkJcmV0dXJuIGZNYXAuY29udGFpbnNLZXkoZmlsZSk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9YTUxSZWZhY3RvcmluZ0NvbXBvbmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1hNTFJlZmFjdG9yaW5nQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzc5YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1hNTFJlZmFjdG9yaW5nQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50IGltcGxlbWVudHMgUmVmYWN0b3JpbmdDb21wb25lbnQKLXsKLQkvLyBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGJlaW5nIHJlZmFjdG9yZWQKLQlTdHJpbmcgbmFtZTsKLQkKLQkvLyBUaGUgbmFtZXNwYWNlIGluIHdoaWNoIGNvbXBvbmVudCBpcyBkZWZpbmVkLCBlLmcuIFhNTCBvciBXU0RMIHRhcmdldCBuYW1lc3BhY2UKLQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotCQotCS8vIE9wdGlvbmFsIG1vZGVsIG9iamVjdCB0aGF0IGlzIHJlZmFjdG9yZWQKLQlPYmplY3QgbW9kZWw7Ci0JCi0JLy8gU0VEIERPTSBvYmplY3QgdGhhdCB1bmRlcmxpbmVzIHRoZSBjb21wb25lbnQgYmVpbmcgcmVmYWN0b3JlZAotCUlET01FbGVtZW50IGRvbUVsZW1lbnQ7Ci0KLQlwdWJsaWMgWE1MUmVmYWN0b3JpbmdDb21wb25lbnQoT2JqZWN0IG1vZGVsT2JqZWN0LCBJRE9NRWxlbWVudCBkb21FbGVtZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWVzcGFjZSkKLQl7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbE9iamVjdDsKLQkJdGhpcy5kb21FbGVtZW50ID0gZG9tRWxlbWVudDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCQotCQkKLQl9Ci0JCi0JcHVibGljIFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50KElET01FbGVtZW50IGRvbUVsZW1lbnQsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlKQotCXsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kb21FbGVtZW50ID0gZG9tRWxlbWVudDsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdCgpCi0JewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElET01FbGVtZW50IGdldEVsZW1lbnQoKQotCXsKLQkJcmV0dXJuIGRvbUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpCi0JewotCQlyZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotCX0KLQotCQotCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldFR5cGVRTmFtZSgpCi0JewotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUoZG9tRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSwgZG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiM2YzYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmUuTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlLk1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbiBleHRlbmRzIFhTRFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIGZQYXJlbnROYW1lOwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXhUeXBlID0gdHJ1ZTsKLQlwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIGZTZWxlY3RlZENvbXBvbmVudDsKLQkKLQlwdWJsaWMgTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFhTRFNjaGVtYSBzY2hlbWEpIHsKLQkJc3VwZXIoc2VsZWN0aW9uLCBzY2hlbWEpOwotCQlzZXRUZXh0KFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb25fdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuKCkgewotCi0JCXJldHVybiBmU2VsZWN0ZWRDb21wb25lbnQgIT0gbnVsbDsKLQl9Ci0JCi0KLQlwcml2YXRlIFN0cmluZyBnZXROZXdEZWZhdWx0TmFtZSgpewotCQlpZihmUGFyZW50TmFtZSAhPSBudWxsICYmICEiIi5lcXVhbHMoZlBhcmVudE5hbWUpKXsgLy8kTk9OLU5MUy0xJAotCQkJaWYoaXNDb21wbGV4VHlwZSl7Ci0JCQkJcmV0dXJuIGZQYXJlbnROYW1lICsgIkNvbXBsZXhUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZXsKLQkJCQlyZXR1cm4gZlBhcmVudE5hbWUgKyAiU2ltcGxlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlewotCQkJaWYoaXNDb21wbGV4VHlwZSl7Ci0JCQkJcmV0dXJuICJOZXdDb21wbGV4VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJcmV0dXJuICJOZXdTaW1wbGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCX0KLQlwcml2YXRlIGJvb2xlYW4gY2FuRW5hYmxlKFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCl7Ci0JCWlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHsKLQkJCWZTZWxlY3RlZENvbXBvbmVudCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24peHNkQ29tcG9uZW50OwotCQkJaXNDb21wbGV4VHlwZSA9IHRydWU7Ci0JCQlYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHhzZENvbXBvbmVudDsKLQkJCVhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHR5cGVEZWYuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pewotCQkJCWZQYXJlbnROYW1lID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFyZW50KS5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gCi0JCWVsc2UgaWYgKHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXsKLQkJCWZTZWxlY3RlZENvbXBvbmVudCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil4c2RDb21wb25lbnQ7Ci0JCQlpc0NvbXBsZXhUeXBlID0gZmFsc2U7Ci0JCQlYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB4c2RDb21wb25lbnQ7Ci0JCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSB0eXBlRGVmLmdldENvbnRhaW5lcigpOwotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKXsKLQkJCQlmUGFyZW50TmFtZSA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcmVudCkuZ2V0TmFtZSgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbil7Ci0JCQkJZlBhcmVudE5hbWUgPSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKXBhcmVudCkuZ2V0TmFtZSgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShPYmplY3Qgc2VsZWN0ZWRPYmplY3QpIHsKLQkJCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gY2FuRW5hYmxlKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZE9iamVjdCkgJiYgc3VwZXIuY2FuRW5hYmxlKHNlbGVjdGVkT2JqZWN0KTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBzZWxlY3RlZE9iamVjdDsKLQkJCVhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gZ2V0U2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChub2RlKTsKLQkJCXJldHVybiBjYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpICYmIHN1cGVyLmNhbkVuYWJsZShjb25jcmV0ZUNvbXBvbmVudCk7Ci0JCQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgcnVuMSgpIHsKLQkJCi0JCWlmKGZTZWxlY3RlZENvbXBvbmVudCA9PSBudWxsKXsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoZlNlbGVjdGVkQ29tcG9uZW50LmdldFNjaGVtYSgpID09IG51bGwpewotCQkJZ2V0U2NoZW1hKCkudXBkYXRlRWxlbWVudCh0cnVlKTsKLQkJfQotCQlNYWtlVHlwZUdsb2JhbFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IoZlNlbGVjdGVkQ29tcG9uZW50LCBnZXROZXdEZWZhdWx0TmFtZSgpKTsKLQkJUmVuYW1lUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLQkJdHJ5IHsKLQkJCVJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZ1dpemFyZCgKLQkJCQkJcmVmYWN0b3JpbmcsCi0JCQkJCVJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQ29tcG9uZW50V2l6YXJkX2RlZmF1bHRQYWdlVGl0bGUsIC8vIFRPRE86IHByb3ZpZGUgY29ycmVjdCBzdHJpbmdzCi0JCQkJCVJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQ29tcG9uZW50V2l6YXJkX2lucHV0UGFnZV9kZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24gb3A9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24od2l6YXJkKTsKLQkJCW9wLnJ1bihYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgd2l6YXJkLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQkvL3RyaWdnZXJCdWlsZCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nLiBVc2VyIGFjdGlvbiBnb3QgY2FuY2VsbGVkCi0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpewotCQlpZihmU2VsZWN0ZWRDb21wb25lbnQgPT0gbnVsbCl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKGZTZWxlY3RlZENvbXBvbmVudC5nZXRTY2hlbWEoKSA9PSBudWxsKXsKLQkJCWdldFNjaGVtYSgpLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0JCX0KLQkJRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIGZTZWxlY3RlZENvbXBvbmVudC5nZXRFbGVtZW50KCkuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZygKLQkJCQkJCXRoaXMsCi0JCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLk1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uX3RleHQpOwotCQlNYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQgY29tbWFuZCA9IG5ldyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQoCi0JCQkJZlNlbGVjdGVkQ29tcG9uZW50LCBnZXROZXdEZWZhdWx0TmFtZSgpKTsKLQkJY29tbWFuZC5ydW4oKTsKLQkJZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdiMTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlLk1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24gZXh0ZW5kcyBYU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiB7Ci0KLQlYU0RFbGVtZW50RGVjbGFyYXRpb24gZlNlbGVjdGVkQ29tcG9uZW50OwotCi0JcHVibGljIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIFhTRFNjaGVtYSBzY2hlbWEpIHsKLQkJc3VwZXIoc2VsZWN0aW9uLCBzY2hlbWEpOwotCQlzZXRUZXh0KFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJNYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uLnRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuKCkgewotCi0JCXJldHVybiBmU2VsZWN0ZWRDb21wb25lbnQgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWRPYmplY3QpIHsKLQotCQlmU2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlpZiAoIWVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSAmJiAhZWxlbWVudC5pc0dsb2JhbCgpKSB7Ci0JCQkJZlNlbGVjdGVkQ29tcG9uZW50ID0gZWxlbWVudDsKLQkJCX0KLQkJfSAKLQkJcmV0dXJuIGNhblJ1bigpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0JCQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotCQkJcmV0dXJuIGNhbkVuYWJsZSgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWRPYmplY3QpICYmIHN1cGVyLmNhbkVuYWJsZShzZWxlY3RlZE9iamVjdCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IGdldFNjaGVtYSgpCi0JCQkJCS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotCQkJcmV0dXJuIGNhbkVuYWJsZShjb25jcmV0ZUNvbXBvbmVudCkgJiYgc3VwZXIuY2FuRW5hYmxlKGNvbmNyZXRlQ29tcG9uZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JCQotCX0KLQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgZlNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKQotCQkJCS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGdldFRleHQoKSk7Ci0JCU1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQoCi0JCQkJZlNlbGVjdGVkQ29tcG9uZW50KTsKLQkJY29tbWFuZC5ydW4oKTsKLQkJZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkMmZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXM7Ci0KLQotCi0vKioKLSogUmVuYW1lcyBhIFhNTCBTY2hlbWEgZWxlbWVudCBvciB3b3JrYmVuY2ggcmVzb3VyY2UuCi0qIDxwPgotKiBBY3Rpb24gaXMgYXBwbGljYWJsZSB0byBzZWxlY3Rpb25zIGNvbnRhaW5pbmcgZWxlbWVudHMgb2YgdHlwZQotKiA8Y29kZT48L2NvZGU+IG9yIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCi0qIAotKiA8cD4KLSogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSogPC9wPgotCi0qLwotcHVibGljIGNsYXNzIFJlbmFtZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uICB7Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHJlbmFtZUNvbXBvbmVudEFjdGlvbjsKLQlwcml2YXRlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHJlbmFtZVJlc291cmNlQWN0aW9uOwotCQotCQotCXB1YmxpYyBSZW5hbWVBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoc2VsZWN0aW9uKTsKLQkJc2V0VGV4dChSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUFjdGlvbl90ZXh0KTsgCi0JCXJlbmFtZVJlc291cmNlQWN0aW9uPSBuZXcgUmVuYW1lUmVzb3VyY2VBY3Rpb24oc2VsZWN0aW9uKTsKLQkJcmVuYW1lUmVzb3VyY2VBY3Rpb24uc2V0VGV4dChnZXRUZXh0KCkpOwotCQkKLQl9Ci0JcHVibGljIFJlbmFtZUFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgT2JqZWN0IG1vZGVsKSB7Ci0JCXN1cGVyKHNlbGVjdGlvbik7Ci0JCXNldFRleHQoUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVBY3Rpb25fdGV4dCk7Ci0JCXJlbmFtZUNvbXBvbmVudEFjdGlvbj0gbmV3IFJlbmFtZUNvbXBvbmVudEFjdGlvbihzZWxlY3Rpb24sIG1vZGVsKTsKLQkJcmVuYW1lQ29tcG9uZW50QWN0aW9uLnNldFRleHQoZ2V0VGV4dCgpKTsKLQkJcmVuYW1lUmVzb3VyY2VBY3Rpb249IG5ldyBSZW5hbWVSZXNvdXJjZUFjdGlvbihzZWxlY3Rpb24pOwotCQlyZW5hbWVSZXNvdXJjZUFjdGlvbi5zZXRUZXh0KGdldFRleHQoKSk7Ci0JCQotCX0KLQkKLQotCQotCS8qCi0JICogQHNlZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXJlbmFtZUNvbXBvbmVudEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJaWYgKHJlbmFtZVJlc291cmNlQWN0aW9uICE9IG51bGwpCi0JCQlyZW5hbWVSZXNvdXJjZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJc2V0RW5hYmxlZChjb21wdXRlRW5hYmxlZFN0YXRlKCkpOwkJCi0JfQotCi0JLyoKLQkgKiBAc2VlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uI3VwZGF0ZShJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZihyZW5hbWVDb21wb25lbnRBY3Rpb24gIT0gbnVsbCl7Ci0JCQlyZW5hbWVDb21wb25lbnRBY3Rpb24udXBkYXRlKHNlbGVjdGlvbik7Ci0JCX0KLQkJaWYgKHJlbmFtZVJlc291cmNlQWN0aW9uICE9IG51bGwpCi0JCQlyZW5hbWVSZXNvdXJjZUFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLQkJc2V0RW5hYmxlZChjb21wdXRlRW5hYmxlZFN0YXRlKCkpOwkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjb21wdXRlRW5hYmxlZFN0YXRlKCl7Ci0JCWlmIChyZW5hbWVSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVuYW1lQ29tcG9uZW50QWN0aW9uLmlzRW5hYmxlZCgpIHx8IHJlbmFtZVJlc291cmNlQWN0aW9uLmlzRW5hYmxlZCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHJlbmFtZUNvbXBvbmVudEFjdGlvbi5pc0VuYWJsZWQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChyZW5hbWVDb21wb25lbnRBY3Rpb24gIT0gbnVsbCAmJiByZW5hbWVDb21wb25lbnRBY3Rpb24uaXNFbmFibGVkKCkpCi0JCQlyZW5hbWVDb21wb25lbnRBY3Rpb24ucnVuKHNlbGVjdGlvbik7Ci0JCWlmIChyZW5hbWVSZXNvdXJjZUFjdGlvbiAhPSBudWxsICYmIHJlbmFtZVJlc291cmNlQWN0aW9uLmlzRW5hYmxlZCgpKQotCQkJcmVuYW1lUmVzb3VyY2VBY3Rpb24ucnVuKHNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAocmVuYW1lQ29tcG9uZW50QWN0aW9uICE9IG51bGwgJiYgcmVuYW1lQ29tcG9uZW50QWN0aW9uLmNhblJ1bigpKQotCQkJcmVuYW1lQ29tcG9uZW50QWN0aW9uLnJ1bihzZWxlY3Rpb24pOwotCQllbHNlCi0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVBY3Rpb25fcmVuYW1lLCBSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUFjdGlvbl91bmF2YWlsYWJsZSk7ICAKLQl9Ci0JcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JICAgIGlmKHNlbGVjdGlvbiA9PSBudWxsKXsKLQkgICAgCXN1cGVyLnJ1bigpOwotCSAgICB9Ci0JICAgIGVsc2V7Ci0JICAgIAlzdXBlci5ydW4oc2VsZWN0aW9uKTsKLQkgICAgfQotCQkKLQl9Ci0JcHVibGljIGZpbmFsIHZvaWQgc2V0UmVuYW1lQ29tcG9uZW50QWN0aW9uKAotCQkJU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gcmVuYW1lQ29tcG9uZW50QWN0aW9uKQotCXsKLQkJdGhpcy5yZW5hbWVDb21wb25lbnRBY3Rpb24gPSByZW5hbWVDb21wb25lbnRBY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQ29tcG9uZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjYTM2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5HbG9iYWxCdWlsZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2F2ZURpcnR5RmlsZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuWE1MUmVmYWN0b3JpbmdDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFJlbmFtZUNvbXBvbmVudEFjdGlvbiBleHRlbmRzIFhTRFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHsKLQotCXByaXZhdGUgWFNETmFtZWRDb21wb25lbnQgc2VsZWN0ZWRDb21wb25lbnQ7Ci0KLQlwdWJsaWMgUmVuYW1lQ29tcG9uZW50QWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLAotCQkJT2JqZWN0IGFNb2RlbCkgewotCQlzdXBlcihzZWxlY3Rpb24sIGFNb2RlbCk7Ci0JCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkgewotCQkJc2VsZWN0ZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIHNlbGVjdGVkT2JqZWN0OwotCi0JCQkvLyBpZiBpdCdzIGVsZW1lbnQgcmVmZXJlbmNlLCB0aGVuIHRoaXMgYWN0aW9uIGlzIG5vdCBhcHByb3ByaWF0ZQotCQkJaWYgKHNlbGVjdGVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBzZWxlY3RlZENvbXBvbmVudDsKLQkJCQlpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKSB7Ci0JCQkJCXNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihzZWxlY3RlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKXsKLQkJCQlYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBzZWxlY3RlZENvbXBvbmVudDsKLQkJCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSB0eXBlLmdldENvbnRhaW5lcigpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBwYXJlbnQ7Ci0JCQkJCWlmKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKS5lcXVhbHModHlwZSkpewotCQkJCQkJc2VsZWN0ZWRDb21wb25lbnQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHsKLQkJCQkJWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgcGFyZW50OwotCQkJCQlpZihlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkuZXF1YWxzKHR5cGUpKXsKLQkJCQkJCXNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjYW5SdW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIAotCQl7Ci0JCQlyZXR1cm4gY2FuRW5hYmxlKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0ZWRPYmplY3QpICYmIHN1cGVyLmNhbkVuYWJsZShzZWxlY3RlZE9iamVjdCk7Ci0JCX0gZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSAKLQkJewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHNlbGVjdGVkT2JqZWN0OwotCQkJaWYgKGdldFNjaGVtYSgpICE9IG51bGwpIAotCQkJewotCQkJCVhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gZ2V0U2NoZW1hKCkKLQkJCQkJCS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotCQkJCXJldHVybiBjYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpICYmIHN1cGVyLmNhbkVuYWJsZShjb25jcmV0ZUNvbXBvbmVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuKCkgewotCi0JCXJldHVybiBzZWxlY3RlZENvbXBvbmVudCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXNlbGVjdGVkQ29tcG9uZW50LnNldE5hbWUobmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkgPT0gbnVsbCkgewotCQkJaWYgKGdldFNjaGVtYSgpICE9IG51bGwpIHsKLQkJCQlnZXRTY2hlbWEoKS51cGRhdGVFbGVtZW50KHRydWUpOwotCQkJfQotCi0JCX0KLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmMgPSBTYXZlRGlydHlGaWxlc0RpYWxvZy5zYXZlRGlydHlGaWxlcygpOwotICAgICAgICBpZiAoIXJjKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9ICAKLSAgICAgICAgUmVmYWN0b3JpbmdDb21wb25lbnQgY29tcG9uZW50ID0gbmV3IFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50KAotCQkJCXNlbGVjdGVkQ29tcG9uZW50LAotCQkJCShJRE9NRWxlbWVudClzZWxlY3RlZENvbXBvbmVudC5nZXRFbGVtZW50KCksIAotCQkJCXNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKSwKLQkJCQlzZWxlY3RlZENvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCQotCQlSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcigKLQkJCQljb21wb25lbnQsIHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCVJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0JCXRyeSB7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0JCQkJCXJlZmFjdG9yaW5nLAotCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlLCAKLQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcwotCQkJCQkJCS5SZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uLCAKLQkJCQkJbnVsbCk7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24gb3AgPSBuZXcgUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uKAotCQkJCQl3aXphcmQpOwotCQkJb3AucnVuKFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB3aXphcmQKLQkJCQkJLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQkKLQkJCS8vIFRPRE8gKGNzKSBJJ20gbm90IHN1cmUgd2h5IHdlIG5lZWQgdG8gZG8gdGhpcy4gIFNlZSBidWcgMTQ1NzAwCi0JCQkvL3RyaWdnZXJCdWlsZCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nLiBVc2VyIGFjdGlvbiBnb3QgY2FuY2VsbGVkCi0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmlnZ2VyQnVpbGQoKSB7Ci0JCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKS5pc0F1dG9CdWlsZGluZygpKSB7Ci0JCQluZXcgR2xvYmFsQnVpbGRBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwKLQkJCQkJSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCkucnVuKCk7Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lUmVzb3VyY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDdkOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVSZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZW5hbWVSZWZhY3RvcmluZ1dpemFyZDsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVSZXNvdXJjZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHsKLQotCi0KLQkKLQlwdWJsaWMgUmVuYW1lUmVzb3VyY2VBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0JewotCQlzdXBlcihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlSZXNvdXJjZSBlbGVtZW50PSBnZXRSZXNvdXJjZShzZWxlY3Rpb24pOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCVJlbmFtZVJlc291cmNlUHJvY2Vzc29yIHByb2Nlc3Nvcj0gbmV3IFJlbmFtZVJlc291cmNlUHJvY2Vzc29yKGVsZW1lbnQpOwotCQkJc2V0RW5hYmxlZChwcm9jZXNzb3IuaXNBcHBsaWNhYmxlKCkpOwotCQkJCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKHNlbGVjdGlvbik7Ci0JCVJlbmFtZVJlc291cmNlUHJvY2Vzc29yIHByb2Nlc3Nvcj0gbmV3IFJlbmFtZVJlc291cmNlUHJvY2Vzc29yKHJlc291cmNlKTsKLQotCQkJaWYoIXByb2Nlc3Nvci5pc0FwcGxpY2FibGUoKSkKLQkJCQlyZXR1cm47Ci0JCQlSZW5hbWVSZWZhY3RvcmluZyByZWZhY3RvcmluZz0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0JCQl0cnkgewotCQkJCVJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZ1dpemFyZCgKLQkJCQkJCXJlZmFjdG9yaW5nLAotCQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfZGVmYXVsdFBhZ2VUaXRsZSwgLy9UT0RPOiBwcm92aWRlIGNvcnJlY3Qgc3RyaW5ncwotCQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uLCAKLQkJCQkJCW51bGwpOwotCQkJCVJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbiBvcD0gbmV3IFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbih3aXphcmQpOwotCQkJCW9wLnJ1bihYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgd2l6YXJkLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZy4gVXNlciBhY3Rpb24gZ290IGNhbmNlbGxlZAotCQkJfQotCQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgIT0gMSkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3QgZmlyc3Q9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKCEgKGZpcnN0IGluc3RhbmNlb2YgSVJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElSZXNvdXJjZSlmaXJzdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0YTVhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIGViZWxpc2FyQGNhLmlibS5jb20KLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZVJlc291cmNlQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCQotCXByaXZhdGUgSVNlbGVjdGlvbiBmQ3VycmVudFNlbGVjdGlvbjsKLQotLy8JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBmUGFydDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0vLwkJZlBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZkN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbj0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmQ3VycmVudFNlbGVjdGlvbjsKLQkJCU9iamVjdCBmaXJzdD0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChmaXJzdCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJUmVuYW1lUmVzb3VyY2VBY3Rpb24gcmVuYW1lQWN0aW9uID0gbmV3IFJlbmFtZVJlc291cmNlQWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJCXJlbmFtZUFjdGlvbi5ydW4oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZDdXJyZW50U2VsZWN0aW9uPSBzZWxlY3Rpb247Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVUYXJnZXROYW1lc3BhY2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVRhcmdldE5hbWVzcGFjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGNlZWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVRhcmdldE5hbWVzcGFjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuR2xvYmFsQnVpbGRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lVGFyZ2V0TmFtZXNwYWNlQWN0aW9uIGV4dGVuZHMgWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gewotCi0JcHVibGljIFJlbmFtZVRhcmdldE5hbWVzcGFjZUFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwKLQkJCU9iamVjdCBhTW9kZWwpIHsKLQkJc3VwZXIoc2VsZWN0aW9uLCBhTW9kZWwpOwotCQlzZXRUZXh0KFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lVGFyZ2V0TmFtZXNwYWNlX3RleHQpOwotCi0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmNhbkVuYWJsZShzZWxlY3RlZE9iamVjdCk7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuKCkgewotCi0JCXJldHVybiBnZXRTY2hlbWEoKSAhPSBudWxsOwotCX0KLQotCi0JcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLQkJCi0JCVJlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yKGdldFNjaGVtYSgpLCBnZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCVJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0JCXRyeSB7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0JCQkJCXJlZmFjdG9yaW5nLAotCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlLC8vVE9ETzogcHJvdmlkZSBjb3JyZWN0IHN0cmluZ3MKLQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uLCAKLQkJCQkJbnVsbCk7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24gb3AgPSBuZXcgUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uKAotCQkJCQl3aXphcmQpOwotCQkJb3AucnVuKFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB3aXphcmQKLQkJCQkJLmdldERlZmF1bHRQYWdlVGl0bGUoKSk7Ci0JCQl0cmlnZ2VyQnVpbGQoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZy4gVXNlciBhY3Rpb24gZ290IGNhbmNlbGxlZAotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJpZ2dlckJ1aWxkKCkgewotCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCkuaXNBdXRvQnVpbGRpbmcoKSkgewotCQkJbmV3IEdsb2JhbEJ1aWxkQWN0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCksCi0JCQkJCUluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQpLnJ1bigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyYWFjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotCi0KLS8qKgotICogQWN0aW9uIHRoYXQgZGlzcGF0Y2hlcyB0aGUgPGNvZGU+SUFjdGlvbiNydW4oKTwvY29kZT4gYW5kIHRoZSAKLSAqIDxjb2RlPklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZDwvY29kZT4gCi0gKiBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgdGhlIHNlbGVjdGlvbi4gCi0gKiAKLSAqIDx1bD4KLSAqIAk8bGk+aWYgc2VsZWN0aW9uIGlzIG9mIHR5cGUgPGNvZGU+SVRleHRTZWxlY3Rpb248L2NvZGU+IHRoZW4KLSAqIAk8Y29kZT5ydW4oSVRleHRTZWxlY3Rpb24pPC9jb2RlPiBhbmQgPGNvZGU+c2VsZWN0aW9uQ2hhbmdlZChJVGV4dFNlbGVjdGlvbik8L2NvZGU+Ci0gKiAJaXMgY2FsbGVkLjwvbGk+IAotICogCTxsaT5pZiBzZWxlY3Rpb24gaXMgb2YgdHlwZSA8Y29kZT5JU3RydWN0dXJlZFNlbGVjdGlvbjwvY29kZT4gdGhlbgotICogCTxjb2RlPnJ1bihJU3RydWN0dXJlZFNlbGVjdGlvbik8L2NvZGU+IGFuZCA8Y29kZT4KLSAqIAlzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKTwvY29kZT4gaXMgY2FsbGVkLjwvbGk+Ci0gKiAJPGxpPmRlZmF1bHQgaXMgdG8gY2FsbCA8Y29kZT5ydW4oSVNlbGVjdGlvbik8L2NvZGU+IGFuZCA8Y29kZT4KLSAqIAlzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24pPC9jb2RlPi48L2xpPgotICogPC91bD4KLSAqIAotICogPHA+Ci0gKiBhZGFwdGVkIGZyb20gPGNvZGU+b3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb248L2NvZGU+Ci0gKiA8L3A+Ci0gKiAgIAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JcHJpdmF0ZSBPYmplY3QgbW9kZWw7Ci0JCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoc2VsZWN0aW9uKTsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBwcm92aWRlZCBieSB0aGUgc2l0ZSBvd25pbmcgdGhpcyBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l0ZSdzIHNlbGVjdGlvbgotCSAqLwkKLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGFjdGlvbidzIGVuYWJsZW1lbnQgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzZWxlY3Rpb24uIFRoaXMKLQkgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbGxzIG9uZSBvZiB0aGUgPGNvZGU+c2VsZWN0aW9uQ2hhbmdlZDwvY29kZT4KLQkgKiBtZXRob2RzIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgcGFzc2VkIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBzZWxlY3Rpb24gdGhpcyBhY3Rpb24gaXMgd29ya2luZyBvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlkaXNwYXRjaFNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiB0aGF0IHRoZSBnaXZlbiBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4gVGhpcyBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gY2FsbHMgPGNvZGU+c2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbik8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdGhlIG5ldyBzZWxlY3Rpb24KLSAJICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IG9iamVjdCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCXNldEVuYWJsZWQoY2FuRW5hYmxlKG9iamVjdCkpOwotCQl9Ci0JCWVsc2V7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoaXMgYWN0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJ1Y3R1cmVkIHNlbGVjdGlvbi4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JICogY2FsbHMgPGNvZGU+cnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKTwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlydW4oKElTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiB0aGF0IHRoZSBnaXZlbiB0ZXh0IHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4gIFRoaXMgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPnNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBuZXcgc2VsZWN0aW9uCi0gCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWQoKElTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhpcyBhY3Rpb25zIHdpdGggdGhlIGdpdmVuIHRleHQgc2VsZWN0aW9uLiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQkgKiBjYWxscyA8Y29kZT5ydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJ1bigoSVNlbGVjdGlvbilzZWxlY3Rpb24pOwotCX0KLQkKLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIGFjdGlvbiB0aGF0IHRoZSBnaXZlbiBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuICBUaGlzIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiBzZXRzIHRoZSBhY3Rpb24ncyBlbmFibGVtZW50IHN0YXRlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBuZXcgc2VsZWN0aW9uCi0gCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoaXMgYWN0aW9ucyB3aXRoIHRoZSBnaXZlbiBzZWxlY3Rpb24uIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCSAqIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gSUFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWRpc3BhdGNoUnVuKGdldFNlbGVjdGlvbigpKTsKLQkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlkaXNwYXRjaFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwYXRjaFNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pOwotCQl9IGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3Rpb25DaGFuZ2VkKChJVGV4dFNlbGVjdGlvbilzZWxlY3Rpb24pOwotCQl9IGVsc2UgewotCQkJc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hSdW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlydW4oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JCX0gIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlydW4oKElUZXh0U2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlydW4oc2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0TW9kZWwoKQotCXsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldE1vZGVsKE9iamVjdCBtb2RlbCkKLQl7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuKCkgewotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTY5ZjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1hTRFJlZmFjdG9yQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNEUmVmYWN0b3JBY3Rpb25Hcm91cCBleHRlbmRzIFJlZmFjdG9yQWN0aW9uR3JvdXAgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BS0VfRUxFTUVOVF9HTE9CQUwgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUtFX1RZUEVfR0xPQkFMID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX0VMRU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9UQVJHRVRfTkFNRVNQQ0UgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWVUYXJnZXROYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGZNYWtlTG9jYWxFbGVtZW50R2xvYmFsOwotCi0JcHJpdmF0ZSBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBmTWFrZUxvY2FsVHlwZUdsb2JhbDsKLQotCXB1YmxpYyBYU0RSZWZhY3RvckFjdGlvbkdyb3VwKElTZWxlY3Rpb24gc2VsZWN0aW9uLAotCQkJWFNEU2NoZW1hIHNjaGVtYSkgewotCQlzdXBlcihzZWxlY3Rpb24pOwotCQlmRWRpdG9yQWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZlJlbmFtZUFjdGlvbiA9IG5ldyBSZW5hbWVBY3Rpb24oc2VsZWN0aW9uLCBzY2hlbWEpOwotCQlmUmVuYW1lQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChSRU5BTUVfRUxFTUVOVCk7Ci0JCWZFZGl0b3JBY3Rpb25zLmFkZChmUmVuYW1lQWN0aW9uKTsKLQotCQkvL2ZSZW5hbWVUYXJnZXROYW1lc3BhY2UgPSBuZXcgUmVuYW1lVGFyZ2V0TmFtZXNwYWNlQWN0aW9uKAotCQkvLwkJc2VsZWN0aW9uLCBzY2hlbWEpOwotCQkvL2ZSZW5hbWVUYXJnZXROYW1lc3BhY2Uuc2V0QWN0aW9uRGVmaW5pdGlvbklkKFJFTkFNRV9UQVJHRVRfTkFNRVNQQ0UpOwotCQkvL2ZFZGl0b3JBY3Rpb25zLmFkZChmUmVuYW1lVGFyZ2V0TmFtZXNwYWNlKTsKLQotCQlmTWFrZUxvY2FsRWxlbWVudEdsb2JhbCA9IG5ldyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uKAotCQkJCXNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwuc2V0QWN0aW9uRGVmaW5pdGlvbklkKE1BS0VfRUxFTUVOVF9HTE9CQUwpOwotCQlmRWRpdG9yQWN0aW9ucy5hZGQoZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwpOwotCi0JCWZNYWtlTG9jYWxUeXBlR2xvYmFsID0gbmV3IE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uKAotCQkJCXNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJZk1ha2VMb2NhbFR5cGVHbG9iYWwuc2V0QWN0aW9uRGVmaW5pdGlvbklkKE1BS0VfVFlQRV9HTE9CQUwpOwotCQlmRWRpdG9yQWN0aW9ucy5hZGQoZk1ha2VMb2NhbFR5cGVHbG9iYWwpOwotCi0JCWluaXRBY3Rpb24oZlJlbmFtZUFjdGlvbiwgc2VsZWN0aW9uKTsKLQkJLy9pbml0QWN0aW9uKGZSZW5hbWVUYXJnZXROYW1lc3BhY2UsIHNlbGVjdGlvbik7Ci0JCWluaXRBY3Rpb24oZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwsIHNlbGVjdGlvbik7Ci0JCWluaXRBY3Rpb24oZk1ha2VMb2NhbFR5cGVHbG9iYWwsIHNlbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLS8vCQlkaXNwb3NlQWN0aW9uKGZSZW5hbWVBY3Rpb24sIHNlbGVjdGlvbik7Ci0vLwkJZGlzcG9zZUFjdGlvbihmTWFrZUxvY2FsRWxlbWVudEdsb2JhbCwgc2VsZWN0aW9uKTsKLS8vCQlkaXNwb3NlQWN0aW9uKGZNYWtlTG9jYWxUeXBlR2xvYmFsLCBzZWxlY3Rpb24pOwotLy8JCWRpc3Bvc2VBY3Rpb24oZlJlbmFtZVRhcmdldE5hbWVzcGFjZSwgc2VsZWN0aW9uKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4NzNmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSVNlbGVjdGlvbk1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuWFNEUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvckFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3Rvckdyb3VwU3ViTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNEUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIHsKLQotCXB1YmxpYyBYU0RSZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIG1lbnUgd2l0aCBhcHBsaWNhYmxlIHJlZmFjdG9yIHN1Yi1tZW51ZXMKLQkgKiBAcGFyYW0gbWVudSBUaGUgbWVudSB0byBmaWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KSB7Ci0JCWlmIChmU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAod29ya2JlbmNoUGFydCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IHdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpOwotCQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCi0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBzaXRlLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpZWRpdG9yLmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uTWFwcGVyIG1hcHBlciA9IChJU2VsZWN0aW9uTWFwcGVyKWVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25NYXBwZXIuY2xhc3MpOwotCQkJICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG1hcHBlciAhPSBudWxsID8gbWFwcGVyLm1hcFNlbGVjdGlvbihmU2VsZWN0aW9uKSA6IGZTZWxlY3Rpb247ICAgICAgICAgICAgICAgICAgICAKLQkJCQkJUmVmYWN0b3JBY3Rpb25Hcm91cCByZWZhY3Rvck1lbnVHcm91cCA9IG5ldyBYU0RSZWZhY3RvckFjdGlvbkdyb3VwKHNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJCQkJUmVmYWN0b3JHcm91cFN1Yk1lbnUgc3ViTWVudSA9IG5ldyBSZWZhY3Rvckdyb3VwU3ViTWVudShyZWZhY3Rvck1lbnVHcm91cCk7Ci0JCQkJCXN1Yk1lbnUuZmlsbChtZW51LCAtMSk7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCi0JCX0KLQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyOGRmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uCi17Ci0KLQkKLQkKLQlwdWJsaWMgWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIE9iamVjdCBtb2RlbCkKLQl7Ci0JCXN1cGVyKHNlbGVjdGlvbik7Ci0JCXNldE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWFNEU2NoZW1hIGdldFNjaGVtYSgpewotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZihtb2RlbCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLQkJewotCQkJcmV0dXJuIChYU0RTY2hlbWEpIG1vZGVsOwotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkQ29tcG9uZW50KQotCXsKLQkJWFNEU2NoZW1hIHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID0gbnVsbDsKLQkJaWYgKHNlbGVjdGVkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0JCXsKLQkJCXNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZENvbXBvbmVudCkuZ2V0U2NoZW1hKCk7Ci0JCX0KLQkJCi0JCWlmIChzZWxlY3RlZENvbXBvbmVudFNjaGVtYSAhPSBudWxsICYmIHNlbGVjdGVkQ29tcG9uZW50U2NoZW1hID09IGdldFNjaGVtYSgpICkKLQkJewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NTE4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1SZWZhY3Rvck1lbnUubGFiZWw9UmVmYWN0b3IKLVJlZmFjdG9yQWN0aW9uR3JvdXAubm9fcmVmYWN0b3JpbmdfYXZhaWxhYmxlPTxubyByZWZhY3RvcmluZyBhdmFpbGFibGU+Ci0KLVJlbmFtZUFjdGlvbi5yZW5hbWU9UmVuYW1lCi1SZW5hbWVBY3Rpb24udW5hdmFpbGFibGU9T3BlcmF0aW9uIHVuYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cblNlbGVjdCBhIC4uLi4KLVJlbmFtZUFjdGlvbi50ZXh0PVJlJm5hbWUuLi4KLQotUmVuYW1lSW5wdXRXaXphcmRQYWdlLm5ld19uYW1lPSAmTmV3IG5hbWU6Ci1SZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5pbnRlcm5hbF9lcnJvcj0gSW50ZXJuYWwgZXJyb3IgZHVyaW5nIG5hbWUgY2hlY2tpbmc6IHswfQotCi0KLVJlbmFtZVhTREVsZW1lbnRBY3Rpb24uZXhjZXB0aW9uPVVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkLiBTZWUgbG9nIGZvciBkZXRhaWxzCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uLm5vdF9hdmFpbGFibGU9T3BlcmF0aW9uIHVuYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cblNlbGVjdCBhIFhTRCBwcm9qZWN0LCBmb2xkZXIsIHJlc291cmNlLCBmaWxlLCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLCAgYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb25zLCBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zLCBpZGVudGl0eSBjb25zdHJhaW50IGRlZmluaXRpb25zLCBtb2RlbCBncm91cHMgZGVmaW5pdGlvbnMsIG5vdGF0aW9uIGRlY2xhcmF0aW9ucywgb3Igc2ltcGxlIHR5cGUgZGVmaW5pdGlvbnMuCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uLm5hbWU9UmVuYW1lCi0KLQotUmVuYW1lU3VwcG9ydC5kaWFsb2cudGl0bGU9UmVuYW1lCi1SZW5hbWVTdXBwb3J0Lm5vdF9hdmFpbGFibGU9UmVuYW1lIHN1cHBvcnQgbm90IGF2YWlsYWJsZQotCi1SZW5hbWVDb21wb25lbnRXaXphcmQuZGVmYXVsdFBhZ2VUaXRsZT1SZW5hbWUgd2l6YXJkCi1SZW5hbWVDb21wb25lbnRXaXphcmQuaW5wdXRQYWdlLmRlc2NyaXB0aW9uPVJlbmFtZSBYTUwgU2NoZW1hIGNvbXBvbmVudAotCi1SZW5hbWVJbnB1dFdpemFyZFBhZ2UudXBkYXRlX3JlZmVyZW5jZXM9VXBkYXRlIHJlZmVyZW5jZXMKLVhTRENvbXBvbmVudFJlbmFtZUNoYW5nZS5uYW1lPVhNTCBTY2hlbWEgY29tcG9uZW50IHJlbmFtaW5nIGluIHswfTogezF9IHRvIHsyfQotWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlLlJlbmFtaW5nPVJlbmFtaW5nLi4uCi1SZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50LmNvbXBvc2l0ZUNoYW5nZU5hbWU9WFNEIGZpbGUgcmVuYW1lIHJlZmVyZW5jZXMgdXBkYXRpbmcgY2hhbmdlcwotUmVuYW1lUmVzb3VyY2VDaGFuZ2UucmVuYW1lX3Jlc291cmNlX3JlZmVyZW5jZV9jaGFuZ2U9UmVuYW1pbmcgcmVzb3VyY2UgbmFtZSByZWZlcmVuY2VzCi1YU0RSZW5hbWVSZXNvdXJjZUNoYW5nZS5uYW1lPVJlc291cmNlIHJlbmFtZTogezB9IHRvIHsxfQotUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZy5JbnRlcm5hbF9FcnJvcj1JbnRlcm5hbCBlcnJvcgotUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZy5hbHJlYWRfZXhpc3RzPVJlc291cmNlIGFscmVhZHkgZXhpc3QKLVJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuaW52YWxpZE5hbWU9SW52YWxpZCByZXNvdXJjZSBuYW1lCi1SZW5hbWVSZXNvdXJjZVByb2Nlc3Nvci5uYW1lPVJlc291cmNlIHJlbmFtaW5nCi1NYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uLnRleHQ9TWFrZSBMb2NhbCBFbGVtZW50IEdsb2JhbAotWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM9WE1MIFNjaGVtYSByZWZhY3RvcmluZyBjaGFuZ2VzCi1XU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM9V1NETCByZWZhY3RvcmluZyBjaGFuZ2VzCi1SZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM9Q29tcG9uZW50IG5hbWUgcmVmYWN0b3JpbmcgY2hhbmdlcwotUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfZGVjbGF0YXRpb249VXBkYXRlIGNvbXBvbmVudCBkZWNsYXJhdGlvbi9kZWZpbml0aW9uCi1SZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9yZWZlcmVuY2U9VXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2UKLVhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LnhzZF9jb21wb25lbnRfcmVuYW1lX3BhcnRpY2lwYW50PVhTRCBjb21wb25lbnQgcmVuYW1lIHBhcnRpY2lwYW50Ci1XU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQud3NkbF9jb21wb25lbnRfcmVuYW1lX3BhcnRpY2lwYW50PVdTREwgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudAotUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5GaWxlX1JlbmFtZV91cGRhdGVfcmVmZXJlbmNlPUZpbGUgcmVuYW1lIHJlZmFjdG9yaW5nIGNoYW5nZXMKLVJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX2NoZWNraW5nPUNoZWNraW5nLi4uCi1SZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZ19zZWFyY2hpbmc9U2VhcmNoaW5nLi4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9Db21wb25lbnRSZW5hbWVBcmd1bWVudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZGYzZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9Db21wb25lbnRSZW5hbWVBcmd1bWVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5UZXh0Q2hhbmdlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyBleHRlbmRzIFJlbmFtZUFyZ3VtZW50cyB7Ci0JCi0JVGV4dENoYW5nZU1hbmFnZXIgY2hhbmdlTWFuYWdlcjsKLQlNYXAgbWF0Y2hlczsKLQlTdHJpbmcgcXVhbGlmaWVyOwotCi0JcHVibGljIENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyhTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiB1cGRhdGVSZWZlcmVuY2VzKSB7Ci0JCXN1cGVyKG5ld05hbWUsIHVwZGF0ZVJlZmVyZW5jZXMpOwotCX0KLQotCXB1YmxpYyBUZXh0Q2hhbmdlTWFuYWdlciBnZXRDaGFuZ2VNYW5hZ2VyKCkgewotCQlyZXR1cm4gY2hhbmdlTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VNYW5hZ2VyKFRleHRDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXIpIHsKLQkJdGhpcy5jaGFuZ2VNYW5hZ2VyID0gY2hhbmdlTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldE1hdGNoZXMoKSB7Ci0JCXJldHVybiBtYXRjaGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hdGNoZXMoTWFwIG1hdGNoZXMpIHsKLQkJdGhpcy5tYXRjaGVzID0gbWF0Y2hlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcigpIHsKLQkJcmV0dXJuIHF1YWxpZmllcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRRdWFsaWZpZXIoU3RyaW5nIHF1YWxpZmllcikgewotCQl0aGlzLnF1YWxpZmllciA9IHF1YWxpZmllcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTE5OTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotLy9pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlBhcnRpY2lwYW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlbGVjdGlvblNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuV29ya3NwYWNlU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC51dGlsLkNvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLkNoZWNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklOYW1lVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JUmVmZXJlbmNlVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5UZXh0Q2hhbmdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnV0aWwuVGV4dENoYW5nZUNvbXBhdGliaWxpdHk7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIGV4dGVuZHMgUmVuYW1lUHJvY2Vzc29yIGltcGxlbWVudHMgSU5hbWVVcGRhdGluZywgSVJlZmVyZW5jZVVwZGF0aW5nIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSID0gIm9yZy5lY2xpcHNlLndzdC54bWwucmVmYWN0b3IucmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgYm9vbGVhbiBzaW5nbGVGaWxlT25seSA9IGZhbHNlOwotICAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQl2YWx1ZSA9IHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCJcIiIpKSB7Ci0JCQlzYi5hcHBlbmQoIlwiIik7Ci0JCX0KLQkJc2IuYXBwZW5kKHZhbHVlKTsKLQkJaWYgKCF2YWx1ZS5lbmRzV2l0aCgiXCIiKSkgewotCQkJc2IuYXBwZW5kKCJcIiIpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgY2hhbmdlTWFuYWdlcjsKLQotCXByaXZhdGUgU3RyaW5nIG5ld05hbWU7Ci0KLQlwcml2YXRlIFJlZmFjdG9yaW5nQ29tcG9uZW50IHNlbGVjdGVkQ29tcG9uZW50OwotCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVJlZmVyZW5jZXMgPSB0cnVlOwotCi0JcHJpdmF0ZSBNYXAgcmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yKFJlZmFjdG9yaW5nQ29tcG9uZW50IHNlbGVjdGVkQ29tcG9uZW50KSB7Ci0JCXRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSBzZWxlY3RlZENvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yKFJlZmFjdG9yaW5nQ29tcG9uZW50IHNlbGVjdGVkQ29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzKHNlbGVjdGVkQ29tcG9uZW50LCBuZXdOYW1lLCBmYWxzZSk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IoUmVmYWN0b3JpbmdDb21wb25lbnQgc2VsZWN0ZWRDb21wb25lbnQsIFN0cmluZyBuZXdOYW1lLCBib29sZWFuIHNpbmdsZUZpbGVPbmx5KSB7Ci0gICAgICAgIHRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0gICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSBzZWxlY3RlZENvbXBvbmVudDsKLSAgICAgICAgdGhpcy5zaW5nbGVGaWxlT25seSA9IHNpbmdsZUZpbGVPbmx5OwotICAgIH0gICAgCi0KLQlwcml2YXRlIHZvaWQgYWRkRGVjbGFyYXRpb25VcGRhdGUoVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZVN0ciA9IHNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKS5nZXRNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpOwotCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGZpbGVTdHIpKTsKLQkJYWRkRGVjbGFyYXRpb25VcGRhdGUobWFuYWdlciwgZmlsZSk7Ci0JfQotCi0JZmluYWwgdm9pZCBhZGREZWNsYXJhdGlvblVwZGF0ZShUZXh0Q2hhbmdlTWFuYWdlciBtYW5hZ2VyLCBJRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCk7Ci0JCVN0cmluZyBjb21wb25lbnROYW1lc3BhY2UgPSBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShjb21wb25lbnROYW1lc3BhY2UsIGNvbXBvbmVudE5hbWUpOwotCQlRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSA9IHNlbGVjdGVkQ29tcG9uZW50LmdldFR5cGVRTmFtZSgpOwotCi0KLQotCQlTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBXb3Jrc3BhY2VTZWFyY2hTY29wZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlzY29wZSA9IG5ldyBTZWxlY3Rpb25TZWFyY2hTY29wZShuZXcgSVJlc291cmNlW117ZmlsZX0pOwotCQl9Ci0JCUNvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IENvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3IoKTsKLQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JCVNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaWYgKHNpbmdsZUZpbGVPbmx5KQotICAgICAgICB7Ci0gICAgICAgICAgbWFwLnB1dCgic2VhcmNoRGlydHlDb250ZW50IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfSAgCi0JCXNlYXJjaEVuZ2luZS5zZWFyY2gocGF0dGVybiwgcmVxdWVzdG9yLCBzY29wZSwgbWFwLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJTGlzdCByZXN1bHRzID0gcmVxdWVzdG9yLmdldFJlc3VsdHMoKTsKLQkJCi0JCS8vIG1vcmUgdGhhbiBvbmUgZGVjbGFyYXRpb24gZm91bmQsIHNvIHVzZSBvZmZzZXQgYXMgYWRkaXRpb25hbCBjaGVjawotCQlQb3NpdGlvbiBvZmZzZXRQb3NpdGlvbiA9IG51bGw7Ci0JCWlmIChyZXN1bHRzLnNpemUoKSA+IDEpIHsKLQkJICAgIElET01FbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKTsKLQkJICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgIT0gbnVsbCkgewotCQkgICAgCWludCBzdGFydE9mZnNldCA9IHNlbGVjdGVkRWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQkgICAgCW9mZnNldFBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKHN0YXJ0T2Zmc2V0LCAoc2VsZWN0ZWRFbGVtZW50LmdldEVuZE9mZnNldCgpIC0gc3RhcnRPZmZzZXQpKTsKLQkJICAgIH0KLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVNlYXJjaE1hdGNoIG1hdGNoID0gKFNlYXJjaE1hdGNoKSBpdGVyLm5leHQoKTsKLQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBhZGRUZXh0Q2hhbmdlID0gdHJ1ZTsKLQkJCQkvLyBhZGRpdGlvbmFsIGNoZWNrIHRvIHZlcmlmeSBjb3JyZWN0IGRlY2xhcmF0aW9uIGlzIGNoYW5nZWQKLQkJCQlpZiAob2Zmc2V0UG9zaXRpb24gIT0gbnVsbCkgewotCQkJCQlhZGRUZXh0Q2hhbmdlID0gb2Zmc2V0UG9zaXRpb24ub3ZlcmxhcHNXaXRoKG1hdGNoLmdldE9mZnNldCgpLCBtYXRjaC5nZXRMZW5ndGgoKSk7ICAKLQkJCQl9Ci0JCQkJaWYgKGFkZFRleHRDaGFuZ2UpIHsKLQkJCQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gbWFuYWdlci5nZXQobWF0Y2guZ2V0RmlsZSgpKTsKLQkJCQkJU3RyaW5nIG5ld05hbWUgPSBnZXROZXdFbGVtZW50TmFtZSgpOwotCQkJCQluZXdOYW1lID0gcXVvdGVTdHJpbmcobmV3TmFtZSk7Ci0JCi0JCQkJCVJlcGxhY2VFZGl0IHJlcGxhY2VFZGl0ID0gbmV3IFJlcGxhY2VFZGl0KG1hdGNoLmdldE9mZnNldCgpLCBtYXRjaC5nZXRMZW5ndGgoKSwgbmV3TmFtZSk7Ci0JCQkJCVN0cmluZyBlZGl0TmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9kZWNsYXRhdGlvbiIpOwotCQkJCQlUZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eS5hZGRUZXh0RWRpdCh0ZXh0Q2hhbmdlLCBlZGl0TmFtZSwgcmVwbGFjZUVkaXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgYWRkT2NjdXJyZW5jZXMoVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlciwgSVByb2dyZXNzTW9uaXRvciBwbSwgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIGZpbGVTdHIgPSBzZWxlY3RlZENvbXBvbmVudC5nZXRFbGVtZW50KCkuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyKSk7Ci0KLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCk7Ci0JCVN0cmluZyBjb21wb25lbnROYW1lc3BhY2UgPSBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShjb21wb25lbnROYW1lc3BhY2UsIGNvbXBvbmVudE5hbWUpOwotCQlRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSA9IHNlbGVjdGVkQ29tcG9uZW50LmdldFR5cGVRTmFtZSgpOwotCi0JCVNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgIFNlYXJjaFNjb3BlIHNjb3BlID0gbnVsbDsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpZiAoc2luZ2xlRmlsZU9ubHkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXAucHV0KCJzZWFyY2hEaXJ0eUNvbnRlbnQiLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgIHNjb3BlID0gbmV3IFNlbGVjdGlvblNlYXJjaFNjb3BlKG5ldyBJUmVzb3VyY2VbXXtmaWxlfSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAKLSAgICAgICAgICBzY29wZSA9IG5ldyBXb3Jrc3BhY2VTZWFyY2hTY29wZSgpOwotICAgICAgICB9IAotCQlTb3J0aW5nU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBTb3J0aW5nU2VhcmNoUmVxdWVzdG9yKCk7Ci0JCVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLSAgICAgICAgCi0JCXNlYXJjaEVuZ2luZS5zZWFyY2gocGF0dGVybiwgcmVxdWVzdG9yLCBzY29wZSwgbWFwLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcmVmZXJlbmNlcyA9IHJlcXVlc3Rvci5nZXRSZXN1bHRzKCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFNlYXJjaE1hdGNoIG1hdGNoID0gKFNlYXJjaE1hdGNoKSBpdGVyLm5leHQoKTsKLQotCQkvLyBUZXh0Q2hhbmdlIHRleHRDaGFuZ2UgPSBtYW5hZ2VyLmdldChtYXRjaC5nZXRGaWxlKCkpOwotCQkvLyBTdHJpbmcgbmV3TmFtZSA9IGdldE5ld0VsZW1lbnROYW1lKCk7Ci0JCS8vIGlmKG1hdGNoLmdldE9iamVjdCgpIGluc3RhbmNlb2YgTm9kZSl7Ci0JCS8vIE5vZGUgbm9kZSA9IChOb2RlKW1hdGNoLmdldE9iamVjdCgpOwotCQkvLyBpZihub2RlIGluc3RhbmNlb2YgSURPTUF0dHIpewotCQkvLyBJRE9NQXR0ciBhdHRyID0gKElET01BdHRyKW5vZGU7Ci0JCS8vIElET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpYXR0ci5nZXRPd25lckVsZW1lbnQoKSA7Ci0JCS8vIG5ld05hbWUgPSBnZXROZXdRTmFtZShlbGVtZW50LCBjb21wb25lbnROYW1lc3BhY2UsIG5ld05hbWUpOwotCQkvLyB9Ci0JCS8vIG5ld05hbWUgPSBxdW90ZVN0cmluZyhuZXdOYW1lKTsKLQkJLy8gfQotCQkvLwkJCQkKLQkJLy8gUmVwbGFjZUVkaXQgcmVwbGFjZUVkaXQgPSBuZXcgUmVwbGFjZUVkaXQobWF0Y2guZ2V0T2Zmc2V0KCksCi0JCS8vIG1hdGNoLmdldExlbmd0aCgpLCBuZXdOYW1lICk7Ci0JCS8vIFN0cmluZyBlZGl0TmFtZSA9Ci0JCS8vIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9yZWZlcmVuY2UiKTsKLQkJLy8gVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuYWRkVGV4dEVkaXQodGV4dENoYW5nZSwgZWRpdE5hbWUsCi0JCS8vIHJlcGxhY2VFZGl0KTsKLQotCQkvLyB9Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JVGV4dFVwZGF0aW5nI2NhbkVuYWJsZVRleHRVcGRhdGluZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlVGV4dFVwZGF0aW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVVcGRhdGVSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrRmluYWxDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrRmluYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKG1vbml0b3IpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRleHQpOwotCQlmaW5hbCBSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMgPSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UmVmYWN0b3JpbmdfY2hlY2tpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXR1cy5tZXJnZShjaGVja05ld0VsZW1lbnROYW1lKGdldE5ld0VsZW1lbnROYW1lKCkpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UmVmYWN0b3Jpbmdfc2VhcmNoaW5nIikpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0dXMubWVyZ2UoY3JlYXRlUmVuYW1lQ2hhbmdlcyhuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBUT0RPIGFkZCBjb2RlIHRvIGNoZWNrIGluaXRpYWwgY29uZGl0aW9ucyBmb3IgY29tcG9uZW50IHJlbmFtZQotCQlBc3NlcnQuaXNOb3ROdWxsKHBtKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCi0JfQotCi0JcHVibGljIGZpbmFsIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrTmV3RWxlbWVudE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuYW1lKTsKLQkJZmluYWwgUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0ID0gQ2hlY2tzLmNoZWNrTmFtZShuYW1lKTsKLQkJcmVzdWx0Lm1lcmdlKENoZWNrcy5jaGVja0NvbXBvbmVudE5hbWUobmFtZSkpOwotCQlpZiAoQ2hlY2tzLmlzQWxyZWFkeU5hbWVkKHNlbGVjdGVkQ29tcG9uZW50LCBuYW1lKSkKLQkJCXJlc3VsdC5hZGRGYXRhbEVycm9yKCJSZWZhY3RvcmluZ01lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX2Fub3RoZXJfbmFtZSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gY29tcHV0ZURlcml2ZWRFbGVtZW50cygpIHsKLQotCQlPYmplY3RbXSBlbGVtZW50cyA9IGdldEVsZW1lbnRzKCk7Ci0JCS8vIE9iamVjdFtdIHJlc3VsdHMgPSBuZXcgT2JqZWN0W2VsZW1lbnRzLmxlbmd0aF07Ci0JCS8vIGZvcihpbnQgaT0wOyBpPCBlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCS8vIFJlZmFjdG9yaW5nQ29tcG9uZW50IGNvbXBvbmVudCA9IChSZWZhY3RvcmluZ0NvbXBvbmVudCllbGVtZW50c1tpXTsKLQkJLy8gcmVzdWx0c1tpXSA9IGNvbXBvbmVudC5nZXRBZGFwdGVlKCk7Ci0JCS8vCQkJCi0JCS8vIH0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIGRvbid0IGNyZWF0ZSBhbnkgY2hhbmdlIG5vdywgYWxsIHRoZSBjaGFuZ2VzIGFyZSBpbiBjaGFuZ2VNYW5nZXIKLQkJLy8gdmFyaWFibGUgYW5kIHdpbGwgYmUgY29tYmluZWQgaW4gcG9zdENyZWF0ZUNoYW5nZSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0Q2hhbmdlTWFuYWdlciB1cGRhdGVDaGFuZ2VNYW5hZ2VyKElQcm9ncmVzc01vbml0b3IgcG0sIFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUZXh0Q2hhbmdlTWFuYWdlciBtYW5hZ2VyID0gZ2V0Q2hhbmdlTWFuYWdlcigpOwotCQkvLyBvbmx5IG9uZSBkZWNsYXJhdGlvbiBnZXRzIHVwZGF0ZWQKLQkJYWRkRGVjbGFyYXRpb25VcGRhdGUobWFuYWdlcik7Ci0JCWlmIChnZXRVcGRhdGVSZWZlcmVuY2VzKCkpIHsKLQkJCWFkZE9jY3VycmVuY2VzKG1hbmFnZXIsIHBtLCBzdGF0dXMpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCXByaXZhdGUgUmVmYWN0b3JpbmdTdGF0dXMgY3JlYXRlUmVuYW1lQ2hhbmdlcyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChtb25pdG9yKTsKLQkJZmluYWwgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzID0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UmVmYWN0b3Jpbmdfc2VhcmNoaW5nIiksIDEpOyAvLyROT04tTkxTLTEkCi0JCQl1cGRhdGVDaGFuZ2VNYW5hZ2VyKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSksIHN0YXR1cyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyBUZXh0Q2hhbmdlTWFuYWdlciBnZXRDaGFuZ2VNYW5hZ2VyKCkgewotCi0JCWlmIChjaGFuZ2VNYW5hZ2VyID09IG51bGwpIHsKLQkJCWNoYW5nZU1hbmFnZXIgPSBuZXcgVGV4dENoYW5nZU1hbmFnZXIoZmFsc2UpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VNYW5hZ2VyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC5pbnRlcm5hbC5yZWZhY3RvcmluZy5yZW5hbWUuWFNEUmVuYW1lUHJvY2Vzc29yI2dldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPOiBmaW5kIHByb2plY3QgbmF0dXJlcyBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUKLQkJLy8gcmVmYWN0b3JlZAotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIn07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSVRleHRVcGRhdGluZyNnZXRDdXJyZW50RWxlbWVudE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnROYW1lKCkgewotCQkvLwotCQlyZXR1cm4gc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotCX0KLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRFbGVtZW50cygpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQlPYmplY3QgbW9kZWwgPSBzZWxlY3RlZENvbXBvbmVudC5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbXXttb2RlbH07Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0SWRlbnRpZmllcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gSURFTlRJRklFUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5ld0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gbmV3TmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRQcm9jZXNzb3JOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3Nvck5hbWUoKSB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygiUmVuYW1lQ29tcG9uZW50UmVmYWN0b3JpbmcubmFtZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFN0cmluZ1tde3NlbGVjdGVkQ29tcG9uZW50LmdldE5hbWVzcGFjZVVSSSgpICsgIjoiICsgc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpLCBuZXdOYW1lfSk7Ci0KLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGdldFVwZGF0ZVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiB1cGRhdGVSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2lzQXBwbGljYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoc2VsZWN0ZWRDb21wb25lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgaXNBcHBsaWNhYmxlIGxvZ2ljIGZvciB0aGUgbmFtZWQgY29tcG9uZW50LAotCQkvLyB2ZXJpZnkgaG93IGl0IGlzIGRpZmZlcmVudCBmcm9tIG90aGVyIGNvbmRpdGlvbiBjaGVja3MKLQkJLy8gaWYgKGZOYW1lZENvbXBvbmVudC5pc0Fub255bW91cygpKQotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIGlmICghIENoZWNrcy5pc0F2YWlsYWJsZShmVHlwZSkpCi0JCS8vIHJldHVybiBmYWxzZTsKLQkJLy8gaWYgKGlzU3BlY2lhbENhc2UoZlR5cGUpKQotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWREZXJpdmVkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgTGlzdCByZXN1bHQsIE9iamVjdFtdIGRlcml2ZWRFbGVtZW50cywgQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cywgU3RyaW5nW10gbmF0dXJlcywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZXJpdmVkRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXJpdmVkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlSZW5hbWVQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IFBhcnRpY2lwYW50TWFuYWdlci5sb2FkUmVuYW1lUGFydGljaXBhbnRzKHN0YXR1cywgdGhpcywgZGVyaXZlZEVsZW1lbnRzW2ldLCBhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZCk7Ci0JCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBhcnRpY2lwYW50cykpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QuaW50ZXJuYWwucmVmYWN0b3JpbmcucmVuYW1lLlhTRFJlbmFtZVByb2Nlc3NvciNsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1cywKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuU3RyaW5nW10sCi0JICogICAgICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuU2hhcmFibGVQYXJ0aWNpcGFudHMpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBMaXN0IHJlc3VsdCwgU3RyaW5nW10gbmF0dXJlcywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMgPSBuZXcgQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzKGdldE5ld0VsZW1lbnROYW1lKCksIGdldFVwZGF0ZVJlZmVyZW5jZXMoKSk7Ci0JCWFyZ3VtZW50cy5zZXRNYXRjaGVzKHJlZmVyZW5jZXMpOwotCQlhcmd1bWVudHMuc2V0UXVhbGlmaWVyKHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJLy8gcGFzcyBpbiBjaGFuZ2VNYW5nZXIgdG8gdGhlIHBhcnRpY2lwYW50cyBzbyB0aGF0IGl0IGNhbiBjb2xsZWN0IGFsbAotCQkvLyBjaGFuZ2VzL3BlciBmaWxlcwotCQlhcmd1bWVudHMuc2V0Q2hhbmdlTWFuYWdlcihnZXRDaGFuZ2VNYW5hZ2VyKCkpOwotCQlsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgY29tcHV0ZURlcml2ZWRFbGVtZW50cygpLCBhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEVsZW1lbnRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBMaXN0IHJlc3VsdCwgUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cywgU3RyaW5nW10gbmF0dXJlcywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gbmV3IE9iamVjdFswXTsvLyBnZXRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoUGFydGljaXBhbnRNYW5hZ2VyLmxvYWRSZW5hbWVQYXJ0aWNpcGFudHMoc3RhdHVzLCB0aGlzLCBlbGVtZW50c1tpXSwgYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpKSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBmaW5hbCBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10gbG9hZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZFBhcnRpY2lwYW50cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzID0gbmV3IFJlbmFtZUFyZ3VtZW50cyhnZXROZXdFbGVtZW50TmFtZSgpLCBnZXRVcGRhdGVSZWZlcmVuY2VzKCkpOwotCQlTdHJpbmdbXSBuYXR1cmVzID0gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbG9hZEVsZW1lbnRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIGFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkUGFydGljaXBhbnRzKTsKLQkJbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIG5hdHVyZXMsIHNoYXJlZFBhcnRpY2lwYW50cyk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHJlc3VsdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaS5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50KSB7Ci0JCQkJWE1MQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQgcCA9IChYTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCkgbzsKLQkJCQkvLyBnZXRDaGFuZ2VNYW5hZ2VyKCkKLQkJCQlwLnNldENoYW5nZU1hbmFnZXIoZ2V0Q2hhbmdlTWFuYWdlcigpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdKSByZXN1bHQudG9BcnJheShuZXcgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuZXdOYW1lKTsKLQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVSZWZlcmVuY2VzKGJvb2xlYW4gdXBkYXRlKSB7Ci0JCXVwZGF0ZVJlZmVyZW5jZXMgPSB1cGRhdGU7Ci0KLQl9Ci0KLQlwdWJsaWMgQ2hhbmdlIHBvc3RDcmVhdGVDaGFuZ2UoQ2hhbmdlW10gcGFydGljaXBhbnRDaGFuZ2VzLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKHBtKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBjaGFuZ2VOYW1lID0gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlcyIpOwotCQkJVGV4dENoYW5nZVtdIGNoYW5nZXMgPSBjaGFuZ2VNYW5hZ2VyLmdldEFsbENoYW5nZXMoKTsKLS8vCQkJQ29tcGFyYXRvciBjID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0vLwkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLS8vCQkJCQlUZXh0RmlsZUNoYW5nZSBjMSA9IChUZXh0RmlsZUNoYW5nZSkgbzE7Ci0vLwkJCQkJVGV4dEZpbGVDaGFuZ2UgYzIgPSAoVGV4dEZpbGVDaGFuZ2UpIG8yOwotLy8JCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoYzEuZ2V0RmlsZSgpLmdldEZ1bGxQYXRoKCksIGMyLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpKTsKLS8vCQkJCX0KLS8vCQkJfTsKLQkJCWlmIChjaGFuZ2VzLmxlbmd0aCA+IDApIHsKLQkJCQkvLyBBcnJheXMuc29ydChjaGFuZ2VzLCBjKTsKLQkJCQlDb21wb3NpdGVDaGFuZ2UgY29tcG9zaXRlQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZSgiISIgKyBjaGFuZ2VOYW1lLCBjaGFuZ2VzKTsKLQkJCQljb21wb3NpdGVDaGFuZ2UubWFya0FzU3ludGhldGljKCk7Ci0JCQkJcmV0dXJuIGNvbXBvc2l0ZUNoYW5nZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVJlc291cmNlUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVJlc291cmNlUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTcwODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVSZXNvdXJjZVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5QYXJ0aWNpcGFudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZUFyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklOYW1lVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IgZXh0ZW5kcyBSZW5hbWVQcm9jZXNzb3IgaW1wbGVtZW50cyBJTmFtZVVwZGF0aW5nIHsKLQotCXByaXZhdGUgSVJlc291cmNlIGZSZXNvdXJjZTsKLQlwcml2YXRlIFN0cmluZyBmTmV3RWxlbWVudE5hbWU7Ci0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVI9ICJvcmcuZWNsaXBzZS53c3QudWkueHNkLnJlbmFtZVJlc291cmNlUHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBSZW5hbWVSZXNvdXJjZVByb2Nlc3NvcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZlJlc291cmNlPSByZXNvdXJjZTsKLQkJaWYgKGZSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlzZXROZXdFbGVtZW50TmFtZShmUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCS8vLS0tLSBJTmFtZVVwZGF0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCXB1YmxpYyB2b2lkIHNldE5ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobmV3TmFtZSk7Ci0JCWZOZXdFbGVtZW50TmFtZT0gbmV3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5ld0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZk5ld0VsZW1lbnROYW1lOwotCX0KLQkKLQkvLy0tLS0gSVJlbmFtZVByb2Nlc3NvciBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkKLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBJREVOVElGSUVSOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoKSAgewotCQlpZiAoZlJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghIGZSZXNvdXJjZS5leGlzdHMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEgZlJlc291cmNlLmlzQWNjZXNzaWJsZSgpKQkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7CQkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc29yTmFtZSgpIHsKLQkJU3RyaW5nIG1lc3NhZ2U9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJSZW5hbWVSZXNvdXJjZVByb2Nlc3Nvci5uYW1lIiwgLy8kTk9OLU5MUy0xJAotCQkJCW5ldyBTdHJpbmdbXXtnZXRDdXJyZW50RWxlbWVudE5hbWUoKSwgZ2V0TmV3RWxlbWVudE5hbWUoKX0pOwotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtmUmVzb3VyY2V9OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGZSZXNvdXJjZS5nZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE5ld0VsZW1lbnQoKSB7Ci0JCQotCQkJCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoY3JlYXRlTmV3UGF0aChnZXROZXdFbGVtZW50TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0VXBkYXRlUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10gbG9hZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3RbXSBlbGVtZW50cz0gZ2V0RWxlbWVudHMoKTsKLQkJU3RyaW5nW10gbmF0dXJlcz0gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpOwotCQlMaXN0IHJlc3VsdD0gbmV3IEFycmF5TGlzdCgpOwotCQlSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzPSBuZXcgUmVuYW1lQXJndW1lbnRzKGdldE5ld0VsZW1lbnROYW1lKCksIGdldFVwZGF0ZVJlZmVyZW5jZXMoKSk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KFBhcnRpY2lwYW50TWFuYWdlci5sb2FkUmVuYW1lUGFydGljaXBhbnRzKHN0YXR1cywgCi0JCQkJdGhpcywgZWxlbWVudHNbaV0sCi0JCQkJYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpKSk7Ci0JCX0KLQkJcmV0dXJuIChSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10pcmVzdWx0LnRvQXJyYXkobmV3IFJlZmFjdG9yaW5nUGFydGljaXBhbnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQkvLy0tLSBDb25kaXRpb24gY2hlY2tpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0luaXRpYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkKLQkvKiBub24gamF2YS1kb2MKLQkgKiBAc2VlIElSZW5hbWVSZWZhY3RvcmluZyNjaGVja05ld05hbWUoKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKSAgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUsICJuZXcgbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCUlDb250YWluZXIgYz0gZlJlc291cmNlLmdldFBhcmVudCgpOwotCQlpZiAoYyA9PSBudWxsKQotCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZUZhdGFsRXJyb3JTdGF0dXMoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuSW50ZXJuYWxfRXJyb3IiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQotCQlpZiAoYy5maW5kTWVtYmVyKG5ld05hbWUpICE9IG51bGwpCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlRmF0YWxFcnJvclN0YXR1cyhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZy5hbHJlYWRfZXhpc3RzIikpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJaWYgKCFjLmdldEZ1bGxQYXRoKCkuaXNWYWxpZFNlZ21lbnQobmV3TmFtZSkpCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlRmF0YWxFcnJvclN0YXR1cyhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZy5pbnZhbGlkTmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQotCQlSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQ9IFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZShjLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlTmFtZShuZXdOYW1lLCBmUmVzb3VyY2UuZ2V0VHlwZSgpKSk7Ci0JCWlmICghIHJlc3VsdC5oYXNGYXRhbEVycm9yKCkpCi0JCQlyZXN1bHQubWVyZ2UoUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlKGMuZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVQYXRoKGNyZWF0ZU5ld1BhdGgobmV3TmFtZSksIGZSZXNvdXJjZS5nZXRUeXBlKCkpKSk7CQkKLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0KLQkKLQkvKiBub24gamF2YS1kb2MKLQkgKiBAc2VlIFJlZmFjdG9yaW5nI2NoZWNrSW5wdXQoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tGaW5hbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSAgewotCQlwbS5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCXRyeXsKLQkJCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJfSBmaW5hbGx5ewotCQkJcG0uZG9uZSgpOwotCQl9CQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZU5ld1BhdGgoU3RyaW5nIG5ld05hbWUpewotCQlyZXR1cm4gZlJlc291cmNlLmdldEZ1bGxQYXRoKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChuZXdOYW1lKS50b1N0cmluZygpOwotCX0KLQkJCi0JLy8tLS0gY2hhbmdlcyAKLQkKLQkvKiBub24gamF2YS1kb2MgCi0JICogQHNlZSBJUmVmYWN0b3JpbmcjY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQlwbS5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCXRyeXsKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VSZW5hbWVDaGFuZ2UoZlJlc291cmNlLCBnZXROZXdFbGVtZW50TmFtZSgpKTsKLQkJfSBmaW5hbGx5ewotCQkJcG0uZG9uZSgpOwotCQl9CQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZDNjODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUGFydGljaXBhbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlNoYXJhYmxlUGFydGljaXBhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuSU5hbWVVcGRhdGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklSZWZlcmVuY2VVcGRhdGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlRleHRDaGFuZ2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotcHVibGljIGNsYXNzIFJlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3NvciBleHRlbmRzIFJlbmFtZVByb2Nlc3NvciBpbXBsZW1lbnRzIElOYW1lVXBkYXRpbmcsIElSZWZlcmVuY2VVcGRhdGluZwotewotCXByaXZhdGUgU3RyaW5nIG5ld05hbWVzcGFjZTsKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlUmVmZXJlbmNlcyA9IHRydWU7Ci0JcHJpdmF0ZSBUZXh0Q2hhbmdlTWFuYWdlciBjaGFuZ2VNYW5hZ2VyOwotCXByaXZhdGUgWFNEU2NoZW1hIG1vZGVsOwotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSID0gIm9yZy5lY2xpcHNlLndzdC51aS54c2QucmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFJlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3NvcihYU0RTY2hlbWEgbW9kZWwsIFN0cmluZyBuZXdOYW1lKQotCXsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLm5ld05hbWVzcGFjZSA9IG5ld05hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSVRleHRVcGRhdGluZyNjYW5FbmFibGVUZXh0VXBkYXRpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVuYWJsZVRleHRVcGRhdGluZygpCi0JewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JVGV4dFVwZGF0aW5nI2dldEN1cnJlbnRFbGVtZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50RWxlbWVudE5hbWUoKQotCXsKLQkJLy8KLQkJcmV0dXJuIG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC5pbnRlcm5hbC5yZWZhY3RvcmluZy5yZW5hbWUuWFNEUmVuYW1lUHJvY2Vzc29yI2dldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCS8vIFRPRE86IGZpbmQgcHJvamVjdCBuYXR1cmVzIG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBnb2luZyB0byBiZQotCQkvLyByZWZhY3RvcmVkCi0JCXJldHVybiBuZXcgU3RyaW5nW117Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUifTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QuaW50ZXJuYWwucmVmYWN0b3JpbmcucmVuYW1lLlhTRFJlbmFtZVByb2Nlc3NvciNsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1cywKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuU3RyaW5nW10sCi0JICogICAgICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuU2hhcmFibGVQYXJ0aWNpcGFudHMpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLAotCQkJTGlzdCByZXN1bHQsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgbmV3Q1VOYW1lPSBnZXROZXdFbGVtZW50TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCVJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHM9IG5ldyBSZW5hbWVBcmd1bWVudHMobmV3Q1VOYW1lLCBnZXRVcGRhdGVSZWZlcmVuY2VzKCkpOwotCQlsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgCi0JCQljb21wdXRlRGVyaXZlZEVsZW1lbnRzKCksIGFyZ3VtZW50cywgCi0JCQkgbmF0dXJlcywgc2hhcmVkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBMaXN0IHJlc3VsdCwgT2JqZWN0W10gZGVyaXZlZEVsZW1lbnRzLCAKLQkJCVJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMsICBTdHJpbmdbXSBuYXR1cmVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRlcml2ZWRFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZGVyaXZlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUmVuYW1lUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHM9IFBhcnRpY2lwYW50TWFuYWdlci5sb2FkUmVuYW1lUGFydGljaXBhbnRzKHN0YXR1cywgCi0JCQkJCXRoaXMsIGRlcml2ZWRFbGVtZW50c1tpXSwgCi0JCQkJCWFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkKTsKLQkJCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QocGFydGljaXBhbnRzKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgT2JqZWN0W10gY29tcHV0ZURlcml2ZWRFbGVtZW50cygpIHsKLQotCQlPYmplY3RbXSBlbGVtZW50cyA9IGdldEVsZW1lbnRzKCk7Ci0JCU9iamVjdFtdIHJlc3VsdHMgPSBuZXcgT2JqZWN0W2VsZW1lbnRzLmxlbmd0aF07Ci0JCWZvcihpbnQgaT0wOyBpPCBlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCQlSZWZhY3RvcmluZ0NvbXBvbmVudCBjb21wb25lbnQgPSAoUmVmYWN0b3JpbmdDb21wb25lbnQpZWxlbWVudHNbaV07Ci0JCQlyZXN1bHRzW2ldID0gY29tcG9uZW50LmdldE1vZGVsT2JqZWN0KCk7Ci0JCQkKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQkJCi0JfQotCQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY2hlY2tGaW5hbENvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tGaW5hbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwKLQkJCUNoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0JCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCXsKLQkJdHJ5Ci0JCXsKLQkJCVJlZmFjdG9yaW5nU3RhdHVzIHJlc3VsdCA9IG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQkJcG0uYmVnaW5UYXNrKCIiLCA5KTsgLy8kTk9OLU5MUy0xJAotCQkJY2hhbmdlTWFuYWdlciA9IGNyZWF0ZUNoYW5nZU1hbmFnZXIobmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMSksCi0JCQkJCXJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGZpbmFsbHkKLQkJewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JCQotCi0JfQotCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JewotCQkvLyBUT0RPIGFkZCBjb2RlIHRvIGNoZWNrIGluaXRpYWwgY29uZGl0aW9ucyBmb3IgY29tcG9uZW50IHJlbmFtZQotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQl7Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmcgY2hhbmdlTmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXMiKTsKLQkJCXJldHVybiBuZXcgQ29tcG9zaXRlQ2hhbmdlKGNoYW5nZU5hbWUsIGNoYW5nZU1hbmFnZXIuZ2V0QWxsQ2hhbmdlcygpKTsKLQkJfSBmaW5hbGx5Ci0JCXsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCi0JCS8vIENoYW5nZVtdIGNoYW5nZXMgPSBDb21wb25lbnRSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0ZvcigKLQkJLy8gdGhpcy5mTmFtZWRDb21wb25lbnQsIGdldE5ld0VsZW1lbnROYW1lKCkpOwotCQkvLwotCQkvLyBpZiAoY2hhbmdlcy5sZW5ndGggPiAwKQotCQkvLyB7Ci0JCS8vIENvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCS8vIG11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZSgKLQkJLy8gIlhTRCBjb21wb25lbnQgcmVuYW1lIHBhcnRpY2lwYW50IGNoYW5nZXMiLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBUT0RPOiBleHRlcm5hbGl6ZSBzdHJpbmcKLQkJLy8gcmV0dXJuIG11bHRpQ2hhbmdlOwotCQkvLyB9IGVsc2UKLQkJLy8gewotCQkvLwotCQkvLyByZXR1cm4gbmV3IENvbXBvbmVudFJlbmFtZUNoYW5nZSgKLQkJLy8gZk5hbWVkQ29tcG9uZW50LAotCQkvLyBmTmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpLAotCQkvLyBnZXROZXdFbGVtZW50TmFtZSgpLAotCQkvLyBmTmFtZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotCQkvLyB9Ci0JCQotCQkKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRFbGVtZW50cygpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkKLQl7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyBtb2RlbCB9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldElkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpCi0JewotCQlyZXR1cm4gSURFTlRJRklFUjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRQcm9jZXNzb3JOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3Nvck5hbWUoKQotCXsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKAotCQkJCSJSZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZy5uYW1lIiwgLy8kTk9OLU5MUy0xJAotCQkJCW5ldyBTdHJpbmdbXQotCQkJCXsKLQkJCQkJCWdldEN1cnJlbnRFbGVtZW50TmFtZSgpLAotCQkJCQkJZ2V0TmV3RWxlbWVudE5hbWUoKSB9KTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2lzQXBwbGljYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChnZXRNb2RlbCgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGlzQXBwbGljYWJsZSBsb2dpYyBmb3IgdGhlIG5hbWVkIGNvbXBvbmVudCwKLQkJLy8gdmVyaWZ5IGhvdyBpdCBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlciBjb25kaXRpb24gY2hlY2tzCi0JCS8vIGlmIChmTmFtZWRDb21wb25lbnQuaXNBbm9ueW1vdXMoKSkKLQkJLy8gcmV0dXJuIGZhbHNlOwotCQkvLyBpZiAoISBDaGVja3MuaXNBdmFpbGFibGUoZlR5cGUpKQotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIGlmIChpc1NwZWNpYWxDYXNlKGZUeXBlKSkKLQkJLy8gcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JTmFtZVVwZGF0aW5nI2NoZWNrTmV3RWxlbWVudE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tOZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCUFzc2VydC5pc05vdE51bGwobmV3TmFtZSwgIm5ldyBuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVE9ETzogaW1wbGVtZW50IG5ldyBuYW1lIGNoZWNraW5nCi0JCS8vIFJlZmFjdG9yaW5nU3RhdHVzIHJlc3VsdCA9IENoZWNrcy5jaGVja1R5cGVOYW1lKG5ld05hbWUpOwotCQkvLyBpZiAoQ2hlY2tzLmlzQWxyZWFkeU5hbWVkKGZUeXBlLCBuZXdOYW1lKSkKLQkJLy8gcmVzdWx0LmFkZEZhdGFsRXJyb3IoUmVmYWN0b3JpbmdDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVUeXBlUmVmYWN0b3JpbmcuY2hvb3NlX2Fub3RoZXJfbmFtZSIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSBsb2FkUGFydGljaXBhbnRzKAotCQkJUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWRQYXJ0aWNpcGFudHMpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cyA9IG5ldyBSZW5hbWVBcmd1bWVudHMoZ2V0TmV3RWxlbWVudE5hbWUoKSwKLQkJCQl0cnVlKTsKLQkJU3RyaW5nW10gbmF0dXJlcyA9IGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxvYWRFbGVtZW50UGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBhcmd1bWVudHMsIG5hdHVyZXMsCi0JCQkJc2hhcmVkUGFydGljaXBhbnRzKTsKLQkJbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIG5hdHVyZXMsIHNoYXJlZFBhcnRpY2lwYW50cyk7Ci0JCXJldHVybiAoUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdKSByZXN1bHQKLQkJCQkudG9BcnJheShuZXcgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEVsZW1lbnRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLAotCQkJTGlzdCByZXN1bHQsIFJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMsIFN0cmluZ1tdIG5hdHVyZXMsCi0JCQlTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlPYmplY3RbXSBlbGVtZW50cyA9IGdldEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JCXsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChQYXJ0aWNpcGFudE1hbmFnZXIKLQkJCQkJLmxvYWRSZW5hbWVQYXJ0aWNpcGFudHMoc3RhdHVzLCB0aGlzLCBlbGVtZW50c1tpXSwKLQkJCQkJCQlhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZCkpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFRleHRDaGFuZ2VNYW5hZ2VyIGNyZWF0ZUNoYW5nZU1hbmFnZXIoSVByb2dyZXNzTW9uaXRvciBwbSwKLQkJCVJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVRleHRDaGFuZ2VNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgVGV4dENoYW5nZU1hbmFnZXIoZmFsc2UpOwotCQkvLyBvbmx5IG9uZSBkZWNsYXJhdGlvbiBnZXRzIHVwZGF0ZWQKLQkJYWRkRGVjbGFyYXRpb25VcGRhdGUobWFuYWdlcik7Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREZWNsYXJhdGlvblVwZGF0ZShUZXh0Q2hhbmdlTWFuYWdlciBtYW5hZ2VyKQotCi0JewotCQlTdHJpbmcgZmlsZVN0ciA9IGdldE1vZGVsKCkuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZpbGVTdHIpOwotCQl0cnkKLQkJewotCQkJVVJMIHVybCA9IG5ldyBVUkwodXJpLnRvU3RyaW5nKCkpOwotCQkJdXJsID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpOwotCQkJaWYodXJsICE9IG51bGwpewotCQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJCUlGaWxlIGZpbGUgPSByb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aCh1cmwuZ2V0RmlsZSgpKSk7Ci0JCQkJaWYoZmlsZSAhPSBudWxsICl7Ci0JCQkJCVRleHRDaGFuZ2UgY2hhbmdlID0gbWFuYWdlci5nZXQoZmlsZSk7Ci0JCQkJCWFkZERlY2xhcmF0aW9uVXBkYXRlKGNoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJCi0JfQotCQotCQotCi0JZmluYWwgdm9pZCBhZGREZWNsYXJhdGlvblVwZGF0ZShUZXh0Q2hhbmdlIGNoYW5nZSkgCi0JewotLy8JCVN0cmluZyBlZGl0TmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9kZWNsYXRhdGlvbiIpOzsKLS8vCSAgCi0vLwkJTmFtZWRDb21wb25lbnRSZW5hbWVyIHJlbmFtZXIgPSBuZXcgTmFtZWRDb21wb25lbnRSZW5hbWVyKAotLy8JCQkJc2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpLCBuZXdOYW1lc3BhY2UpOwotLy8JCXJlbmFtZXIucmVuYW1lQ29tcG9uZW50KCk7Ci0vLwkJTGlzdCB0ZXh0RWRpdHMgPSByZW5hbWVyLmdldFRleHRFZGl0cygpOwotLy8JCWZvciAoaW50IGogPSAwOyBqIDwgdGV4dEVkaXRzLnNpemUoKTsgaisrKQotLy8JCXsKLS8vCQkJUmVwbGFjZUVkaXQgcmVwbGFjZUVkaXQgPSAoUmVwbGFjZUVkaXQpIHRleHRFZGl0cwotLy8JCQkJCS5nZXQoaik7Ci0vLwkJCVRleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmFkZFRleHRFZGl0KGNoYW5nZSwKLS8vCQkJCQllZGl0TmFtZSwgcmVwbGFjZUVkaXQpOwotLy8JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCXRoaXMubmV3TmFtZXNwYWNlID0gbmV3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5ld0VsZW1lbnROYW1lKCkKLQl7Ci0JCXJldHVybiBuZXdOYW1lc3BhY2U7Ci0JfQotCi0JCi0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVVcGRhdGVSZWZlcmVuY2VzKCkKLQl7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFVwZGF0ZVJlZmVyZW5jZXMoKQotCXsKLQkJcmV0dXJuIHVwZGF0ZVJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlUmVmZXJlbmNlcyhib29sZWFuIHVwZGF0ZSkKLQl7Ci0JCXVwZGF0ZVJlZmVyZW5jZXMgPSB1cGRhdGU7Ci0JCQotCX0KLQotCXB1YmxpYyBmaW5hbCBUZXh0Q2hhbmdlTWFuYWdlciBnZXRDaGFuZ2VNYW5hZ2VyKCkKLQl7Ci0JCXJldHVybiBjaGFuZ2VNYW5hZ2VyOwotCX0KLQotCXB1YmxpYyBmaW5hbCBYU0RTY2hlbWEgZ2V0TW9kZWwoKQotCXsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVzb3VyY2VSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVzb3VyY2VSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5NmI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGNoYW5nZSB0aGF0IHJlbmFtZXMgYSBnaXZlbiByZXNvdXJjZQotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCi0JLyoKLQkgKiB3ZSBjYW5ub3QgdXNlIGhhbmRsZXMgYmVjYXVzZSB0aGV5IGJlY2FtZSBpbnZhbGlkIHdoZW4geW91IHJlbmFtZSB0aGUgcmVzb3VyY2UuCi0JICogcGF0aHMgZG8gbm90LgotCSAqLwotCXByaXZhdGUgSVBhdGggZlJlc291cmNlUGF0aDsKLQotCXByaXZhdGUgU3RyaW5nIGZOZXdOYW1lOwotCi0JLyoqCi0JICogQHBhcmFtIG5ld05hbWUgaW5jbHVkZXMgdGhlIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZVJlbmFtZUNoYW5nZShJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZVJlbmFtZUNoYW5nZShJUGF0aCByZXNvdXJjZVBhdGgsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWZSZXNvdXJjZVBhdGg9IHJlc291cmNlUGF0aDsKLQkJZk5ld05hbWU9IG5ld05hbWU7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZlJlc291cmNlUGF0aCk7Ci0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJLy8gVE9ETzogaW1wbGVtZW50IGZpbGUgdmFsaWRhdGlvbiwgc2VlIEpEVENoYW5nZQotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCQotCS8qCi0JICogdG8gYXZvaWQgdGhlIGV4Y2VwdGlvbiBzZW5kZXJzIHNob3VsZCBjaGVjayBpZiBhIHJlc291cmNlIHdpdGggdGhlIG5ldyBuYW1lCi0JICogYWxyZWFkeSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGZhbHNlKQotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJcG0uYmVnaW5UYXNrKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJYU0RSZW5hbWVSZXNvdXJjZUNoYW5nZS5yZW5hbWVfcmVzb3VyY2UiKSwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJZ2V0UmVzb3VyY2UoKS5tb3ZlKHJlbmFtZWRSZXNvdXJjZVBhdGgoZlJlc291cmNlUGF0aCwgZk5ld05hbWUpLCBnZXRDb3JlUmVuYW1lRmxhZ3MoKSwgcG0pOwotCi0JCQlTdHJpbmcgb2xkTmFtZT0gZlJlc291cmNlUGF0aC5sYXN0U2VnbWVudCgpOwotCQkJSVBhdGggbmV3UGF0aD0gcmVuYW1lZFJlc291cmNlUGF0aChmUmVzb3VyY2VQYXRoLCBmTmV3TmFtZSk7Ci0JCQlyZXR1cm4gbmV3IFJlc291cmNlUmVuYW1lQ2hhbmdlKG5ld1BhdGgsIG9sZE5hbWUpOwotCQl9IGZpbmFsbHkgewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q29yZVJlbmFtZUZsYWdzKCkgewotCQlpZiAoZ2V0UmVzb3VyY2UoKS5pc0xpbmtlZCgpKQotCQkJcmV0dXJuIElSZXNvdXJjZS5TSEFMTE9XOwotCQllbHNlCi0JCQlyZXR1cm4gSVJlc291cmNlLk5PTkU7Ci0JfQotCi0JLyoKLQkgKiBjaGFuZ2VzIHJlc291cmNlIG5hbWVzIC9zL3AvQS5qYXZhIHJlbmFtZWQgdG8gQi5qYXZhIGJlY29tZXMgL3MvcC9CLmphdmEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIHJlbmFtZWRSZXNvdXJjZVBhdGgoSVBhdGggcGF0aCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygKLQkJCSJYU0RSZW5hbWVSZXNvdXJjZUNoYW5nZS5uYW1lIiwgbmV3IFN0cmluZ1tde2ZSZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgLy8kTk9OLU5MUy0xJAotCQkJcmVuYW1lZFJlc291cmNlUGF0aChmUmVzb3VyY2VQYXRoLCBmTmV3TmFtZSkudG9TdHJpbmcoKX0pOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2luaXRpYWxpemVWYWxpZGF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzJiZjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5UZXh0Q2hhbmdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiBUaGlzIHJlbmFtZSBwYXJ0aWNpcGFudCBjcmVhdGVzIHRleHQgY2hhbmdlcyBmb3IgdGhlIHJlZmVyZW5jZXMgb2YgdGhlIFhTRCBhbmQgV1NETCBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQkKLS8vCXByaXZhdGUgSUZpbGUgZmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBUZXh0Q2hhbmdlTWFuYWdlciBjaGFuZ2VNYW5hZ2VyOwotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhTRF9DT05URU5UX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFdTRExfQ09OVEVOVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLndzZGxzb3VyY2UiOwotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCS8vIGNoZWNrIGlmIGZpbGUgaGFzIFhTRCBvciBXU0RMIGNvbnRlbnQKLQkJCUlGaWxlIGFGaWxlID0gKElGaWxlKSBlbGVtZW50OwotCQkJdHJ5IHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gYUZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCBkZXNjcmlwdGlvbiA9PSBudWxsICkKLSAgCQkJCXJldHVybiBmYWxzZTsKLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBkZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCWlmKGNvbnRlbnRUeXBlICE9IG51bGwpewotCQkJCQlpZihYU0RfQ09OVEVOVF9UWVBFX0lELmVxdWFscyhjb250ZW50VHlwZS5nZXRJZCgpKSB8fAotCQkJCQkJCVdTRExfQ09OVEVOVF9UWVBFX0lELmVxdWFscyhjb250ZW50VHlwZS5nZXRJZCgpKSl7Ci0vLwkJCQkJCWZpbGUgPSBhRmlsZTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5jb21wb3NpdGVDaGFuZ2VOYW1lIik7Ci0JfQotCQotLy8JcHJpdmF0ZSBJUGF0aCBnZXROZXdGaWxlUGF0aCgpIHsKLS8vCQkKLS8vCQlJUGF0aCBvbGRQYXRoID0gZmlsZS5nZXRSYXdMb2NhdGlvbigpOwotLy8JCUlQYXRoIG5ld1BhdGggPSBvbGRQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQoZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpKTsKLS8vCQlyZXR1cm4gbmV3UGF0aDsKLS8vCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwKLQkJCUNoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JewotCQlSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQgPSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJdHJ5Ci0JCXsKLQkJCXBtLmJlZ2luVGFzaygiIiwgOSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNoYW5nZU1hbmFnZXIgPSBjcmVhdGVDaGFuZ2VNYW5hZ2VyKG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEpLAotCQkJCQlyZXN1bHQpOwotCQkJCi0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCXJlc3VsdC5hZGRGYXRhbEVycm9yKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQkKLQkKLQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQl7Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmcgY2hhbmdlTmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVSZXNvdXJjZUNoYW5nZS5yZW5hbWVfcmVzb3VyY2VfcmVmZXJlbmNlX2NoYW5nZSIpOwotCQkJVGV4dENoYW5nZVtdIGNoYW5nZXMgPSAgY2hhbmdlTWFuYWdlci5nZXRBbGxDaGFuZ2VzKCk7Ci0JCQlpZihjaGFuZ2VzLmxlbmd0aCA+IDApewotCQkJCXJldHVybiBuZXcgQ29tcG9zaXRlQ2hhbmdlKGNoYW5nZU5hbWUsIGNoYW5nZXMpOwotCQkJfQotCQkJZWxzZXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQl9IGZpbmFsbHkKLQkJewotCQkJcG0uZG9uZSgpOwotCQl9Ci0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBUZXh0Q2hhbmdlTWFuYWdlciBjcmVhdGVDaGFuZ2VNYW5hZ2VyKElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlUZXh0Q2hhbmdlTWFuYWdlciBtYW5hZ2VyID0gbmV3IFRleHRDaGFuZ2VNYW5hZ2VyKGZhbHNlKTsKLQkJLy8gb25seSBvbmUgZGVjbGFyYXRpb24gZ2V0cyB1cGRhdGVkCi0JCS8vYWRkRGVjbGFyYXRpb25VcGRhdGUobWFuYWdlcik7Ci0JCWlmIChnZXRBcmd1bWVudHMoKS5nZXRVcGRhdGVSZWZlcmVuY2VzKCkpCi0JCQlhZGRPY2N1cnJlbmNlcyhtYW5hZ2VyLCBwbSwgc3RhdHVzKTsKLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0KLQotCXZvaWQgYWRkT2NjdXJyZW5jZXMoVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlciwgSVByb2dyZXNzTW9uaXRvciBwbSwKLQkJCVJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0vLwkJCi0vLwkJT2JqZWN0W10gb2NjdXJyZW5jZXMgPSBTZWFyY2hUb29scy5nZXRGaWxlRGVwZW5kZW5jaWVzKGZpbGUpOwotLy8JCXBtLmJlZ2luVGFzaygiIiwgb2NjdXJyZW5jZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotLy8JCQotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgb2NjdXJyZW5jZXMubGVuZ3RoOyBpKyspCi0vLwkJewotLy8JCQlPYmplY3Qgb2JqZWN0ID0gb2NjdXJyZW5jZXNbaV07Ci0vLwotLy8JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0R3JvdXApCi0vLwkJCXsKLS8vCQkJCVNlYXJjaFJlc3VsdEdyb3VwIHNlYXJjaFJlc3VsdCA9IChTZWFyY2hSZXN1bHRHcm91cCkgb2JqZWN0OwotLy8JCQkJaWYgKHNlYXJjaFJlc3VsdCA9PSBudWxsKQotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJCi0vLwkJCQlJRmlsZSByZWZlcmVuY2luZ0ZpbGUgPSAoSUZpbGUpc2VhcmNoUmVzdWx0LmdldFJlc291cmNlKCk7Ci0vLwkJCQkJCi0vLwkJCQlyZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLS8vCQkJCS8vIGZvciBlYWNoIHJlc3VsdCBmaWxlIGNyZWF0ZSBYU0QgbW9kZWwgYW5kIGdldCBjb21wb25lbnQgZnJvbSB0aGF0IG1vZGVsCi0vLwkJCQlyZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKAotLy8JCQkJCQluZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5KCkpOwotLy8JCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHJlZmVyZW5jaW5nRmlsZS5nZXRMb2NhdGlvbigpLnRvUG9ydGFibGVTdHJpbmcoKSk7Ci0vLwkJCQl0cnkKLS8vCQkJCXsKLS8vCQkJCQlYU0RTY2hlbWEgc2NoZW1hID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2NoZW1hKCk7Ci0vLwkJCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChyZWZlcmVuY2luZ0ZpbGUpOwotLy8JCQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLS8vCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBYU0RSZXNvdXJjZUltcGwoKTsKLS8vCQkJCQlyZXNvdXJjZS5zZXRVUkkodXJpKTsKLS8vCQkJCQlzY2hlbWEgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTY2hlbWEoKTsKLS8vCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChzY2hlbWEpOwotLy8JCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0vLwkJCQkJc2NoZW1hLnNldEVsZW1lbnQoZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0vLwkJCQkJLy8gZ2V0IHRhcmdldCBuYW1lc3BhY2UgCi0vLwkJCQkJU3RyaW5nIHN0cmluZ1BhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLS8vCQkJCQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gWE1MUXVpY2tTY2FuLmdldFRhcmdldE5hbWVzcGFjZShzdHJpbmdQYXRoKTsKLS8vCQkJCQl0YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCA/ICIiIDogdGFyZ2V0TmFtZXNwYWNlOwotLy8KLS8vCQkJCQlMaXN0IHRleHRFZGl0cyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCQlTZWFyY2hNYXRjaFtdIG1hdGNoZXMgPSBzZWFyY2hSZXN1bHQuZ2V0U2VhcmNoUmVzdWx0cygpOwotLy8JCQkJCQotLy8JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWF0Y2hlcy5sZW5ndGg7IGorKykgewotLy8JCQkJCQlTZWFyY2hNYXRjaCBtYXRjaCA9IG1hdGNoZXNbal07Ci0vLwkJCQkJCQotLy8JCQkJCQlGaWxlUmVmZXJlbmNlUmVuYW1lciByZW5hbWVyID0gbmV3IEZpbGVSZWZlcmVuY2VSZW5hbWVyKAotLy8JCQkJCQkJCW1hdGNoLmdldEF0dHJWYWx1ZSgpLCB0YXJnZXROYW1lc3BhY2UsIGdldE5ld0ZpbGVQYXRoKCkudG9TdHJpbmcoKSwgc2NoZW1hKTsKLS8vCQkJCQkJcmVuYW1lci52aXNpdFNjaGVtYShzY2hlbWEpOwotLy8JCQkJCSAgICB0ZXh0RWRpdHMuYWRkQWxsKHJlbmFtZXIuZ2V0VGV4dEVkaXRzKCkpOwotLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCQkKLS8vCQkJCQlpZighdGV4dEVkaXRzLmlzRW1wdHkoKSl7Ci0vLwkJCQkJCVRleHRDaGFuZ2UgdGV4dENoYW5nZSA9IG1hbmFnZXIuZ2V0KHJlZmVyZW5jaW5nRmlsZSk7Ci0vLwkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGV4dEVkaXRzLnNpemUoKTsgaisrKQotLy8JCQkJCQl7Ci0vLwkJCQkJCQlSZXBsYWNlRWRpdCByZXBsYWNlRWRpdCA9IChSZXBsYWNlRWRpdCkgdGV4dEVkaXRzCi0vLwkJCQkJCQkJCS5nZXQoaik7Ci0vLwkJCQkJCQlTdHJpbmcgZWRpdE5hbWUgPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5GaWxlX1JlbmFtZV91cGRhdGVfcmVmZXJlbmNlIik7Ci0vLwkJCQkJCQlUZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eS5hZGRUZXh0RWRpdCh0ZXh0Q2hhbmdlLAotLy8JCQkJCQkJCQllZGl0TmFtZSwgcmVwbGFjZUVkaXQpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLwkJCQl7Ci0vLwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJCX0gZmluYWxseQotLy8JCQkJewotLy8KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQl9Ci0JCi0JCi0JcHVibGljICBjbGFzcyBSZWZlcmVuY2VMb2NhdGlvbkZpbmRlcgotCXsKLQkJcHJvdGVjdGVkIFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudDsKLQkJcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCQlwcm90ZWN0ZWQgWFNEU2NoZW1hIHJlZmVyZW5jaW5nU2NoZW1hOwotCQlwcm90ZWN0ZWQgTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyBSZWZlcmVuY2VMb2NhdGlvbkZpbmRlcihYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQsCi0JCQkJU3RyaW5nIG5hbWUsIFhTRFNjaGVtYSByZWZlcmVuY2luZ1NjaGVtYSkKLQkJewotCQkJdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5yZWZlcmVuY2luZ1NjaGVtYSA9IHJlZmVyZW5jaW5nU2NoZW1hOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkKLQkJewotCQkJCi0JCQkvL1hTRFN3aXRjaCB4c2RTd2l0Y2ggPSBuZXcgWFNEU3dpdGNoKCkKLS8vCQkJewotLy8JCQkJcHVibGljIE9iamVjdCBjYXNlWFNEVHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gb2JqZWN0KQotLy8JCQkJewotLy8JCQkJCUdsb2JhbFR5cGVSZWZlcmVuY2VSZW5hbWVyIHJlbmFtZXIgPSBuZXcgR2xvYmFsVHlwZVJlZmVyZW5jZVJlbmFtZXIoCi0vLwkJCQkJCQlvYmplY3QuZ2V0TmFtZSgpLCBvYmplY3QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUsIHJlZmVyZW5jaW5nU2NoZW1hKTsKLS8vCQkJCQlyZW5hbWVyLnZpc2l0U2NoZW1hKHJlZmVyZW5jaW5nU2NoZW1hKTsKLS8vCQkJCQlyZXN1bHRzLmFkZEFsbChyZW5hbWVyLmdldFRleHRFZGl0cygpKTsKLS8vCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCX0KLS8vCi0vLwkJCQlwdWJsaWMgT2JqZWN0IGNhc2VYU0RFbGVtZW50RGVjbGFyYXRpb24oCi0vLwkJCQkJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBvYmplY3QpCi0vLwkJCQl7Ci0vLwkJCQkJaWYgKG9iamVjdC5pc0dsb2JhbCgpKQotLy8JCQkJCXsKLS8vCQkJCQkJR2xvYmFsRWxlbWVudFJlbmFtZXIgcmVuYW1lciA9IG5ldyBHbG9iYWxFbGVtZW50UmVuYW1lcigKLS8vCQkJCQkJCQlvYmplY3QuZ2V0TmFtZSgpLCBvYmplY3QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUsIHJlZmVyZW5jaW5nU2NoZW1hKTsKLS8vCQkJCQkJcmVuYW1lci52aXNpdFNjaGVtYShyZWZlcmVuY2luZ1NjaGVtYSk7Ci0vLwkJCQkJCXJlc3VsdHMuYWRkQWxsKHJlbmFtZXIuZ2V0VGV4dEVkaXRzKCkpOwotLy8JCQkJCX0KLS8vCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCX0KLS8vCi0vLwkJCQlwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigKLS8vCQkJCQkJWFNETW9kZWxHcm91cERlZmluaXRpb24gb2JqZWN0KQotLy8JCQkJewotLy8JCQkJCUdsb2JhbEdyb3VwUmVuYW1lciByZW5hbWVyID0gbmV3IEdsb2JhbEdyb3VwUmVuYW1lcigKLS8vCQkJCQkJCW9iamVjdC5nZXROYW1lKCksIG9iamVjdC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZSwgcmVmZXJlbmNpbmdTY2hlbWEpOwotLy8JCQkJCXJlbmFtZXIudmlzaXRTY2hlbWEocmVmZXJlbmNpbmdTY2hlbWEpOwotLy8JCQkJCXJldHVybiBudWxsOwotLy8JCQkJfQotLy8JCQl9OwotCQkJLy94c2RTd2l0Y2guZG9Td2l0Y2goY29tcG9uZW50KTsKLS8vCQkJY29tcG9uZW50LnNldE5hbWUobmFtZSk7Ci0vLwkJCXRyeQotLy8JCQl7Ci0vLwkJCQlyZWZlcmVuY2luZ1NjaGVtYS5lUmVzb3VyY2UoKS5zYXZlKG5ldyBIYXNoTWFwKCkpOwotLy8JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotLy8JCQl7Ci0vLwkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyBmaW5hbCBMaXN0IGdldFJlc3VsdHMoKQotCQl7Ci0JCQlyZXR1cm4gcmVzdWx0czsKLQkJfQotCX0KLQkKLQkKLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvU29ydGluZ1NlYXJjaFJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9Tb3J0aW5nU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNDBhOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9Tb3J0aW5nU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTb3J0aW5nU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgU2VhcmNoUmVxdWVzdG9yIHsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT05BTUVTUEFDRSA9ICJub25hbWVzcGFjZSI7Ci0KLQkKLQkJcHJpdmF0ZSBNYXAgZkZvdW5kOwotCi0JCXB1YmxpYyBTb3J0aW5nU2VhcmNoUmVxdWVzdG9yKCkgewotCQkJZkZvdW5kPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCQotCi0JCQotCQkvKioKLQkJICogQHJldHVybiBhIExpc3Qgb2Yge0BsaW5rIFNlYXJjaE1hdGNofWVzIChzb3J0ZWQgYnkgbmFtZXNwYWNlKQotCQkgKi8KLQkJcHVibGljIE1hcC8qIG5hbWVzcGFjZSAtIDxTZWFyY2hNYXRjaD4qLyBnZXRSZXN1bHRzKCkgewotCQkJcmV0dXJuIGZGb3VuZDsKLQkJfQotCi0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5pbnRlcm5hbC5wcm92aXNpb25hbC5TZWFyY2hSZXF1ZXN0b3IjYWNjZXB0U2VhcmNoTWF0Y2gob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5zZWFyY2guaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VhcmNoTWF0Y2gpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQkKLQkJCWlmKG1hdGNoICE9IG51bGwgJiYgbWF0Y2guZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKXsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSltYXRjaC5nZXRPYmplY3QoKTsKLQkJCQlFbGVtZW50IGRvbUVsZW1lbnQgPSBudWxsOwotCQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFOgotCQkJCQlkb21FbGVtZW50ID0gKChBdHRyKW5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotCQkJCQlkb21FbGVtZW50ID0gKChFbGVtZW50KW5vZGUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5hbWVzcGFjZSA9IGRvbUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJaWYobmFtZXNwYWNlID09IG51bGwgfHwgbmFtZXNwYWNlLmVxdWFscygiIikpewotCQkJCQluYW1lc3BhY2UgPSBOT05BTUVTUEFDRTsKLQkJCQl9Ci0JCQkJTGlzdCBtYXRjaGVzID0gZ2V0TWF0Y2hlcyhuYW1lc3BhY2UpOwotCQkJCW1hdGNoZXMuYWRkKG1hdGNoKTsJCQkKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIExpc3QgZ2V0TWF0Y2hlcyhTdHJpbmcgbmFtZXNwYWNlKXsKLQkJCU9iamVjdCBtYXRjaGVzID0gZkZvdW5kLmdldChuYW1lc3BhY2UpOwotCQkJaWYoIShtYXRjaGVzIGluc3RhbmNlb2YgTGlzdCkpewotCQkJCW1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZkZvdW5kLnB1dChuYW1lc3BhY2UsIG1hdGNoZXMpOwotCQkJfQotCQkJcmV0dXJuIChMaXN0KW1hdGNoZXM7Ci0JCQkKLQkJfQotCQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvWE1MQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvWE1MQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiYTMyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1hNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5UZXh0Q2hhbmdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnV0aWwuVGV4dENoYW5nZUNvbXBhdGliaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQkKLQlwcm90ZWN0ZWQgU2VhcmNoTWF0Y2ggbWF0Y2g7Ci0KLQlwcm90ZWN0ZWQgVGV4dENoYW5nZU1hbmFnZXIgY2hhbmdlTWFuYWdlcjsKLQlwcm90ZWN0ZWQgTGlzdCBtYXRjaGVzOwotCi0gICAgCi0gICAgCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQkKLQkJaWYoZ2V0QXJndW1lbnRzKCkgaW5zdGFuY2VvZiBDb21wb25lbnRSZW5hbWVBcmd1bWVudHMpewotCQkJLy8gY2hhbmdlTWFuZ2VyIGlzIHBhc3NlZCBpbiBmcm9tIHRoZSBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IgdG8gY29sbGVjdCBhbGwgdGhlIGNoYW5nZXMKLQkJCWNoYW5nZU1hbmFnZXIgPSAoKENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cylnZXRBcmd1bWVudHMoKSkuZ2V0Q2hhbmdlTWFuYWdlcigpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJYTUwgQ29tcG9uZW50IFJlbmFtZSBQYXJ0aWNpcGFudCI7Ci0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQlDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgVGV4dENoYW5nZU1hbmFnZXIgZ2V0Q2hhbmdlTWFuYWdlcigpewotCQkKLQkJaWYoY2hhbmdlTWFuYWdlciA9PSBudWxsKXsKLQkJCQljaGFuZ2VNYW5hZ2VyID0gbmV3IFRleHRDaGFuZ2VNYW5hZ2VyKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlTWFuYWdlcjsKLQkJCi0JfQotCQotLy8JcHJpdmF0ZSBSZWZhY3RvcmluZ1N0YXR1cyBjcmVhdGVSZW5hbWVDaGFuZ2VzKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUFzc2VydC5pc05vdE51bGwobW9uaXRvcik7Ci0vLwkJZmluYWwgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzPSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLS8vCQl0cnkgewotLy8JCQltb25pdG9yLmJlZ2luVGFzaygiUmVmYWN0b3JpbmdNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZ19zZWFyY2hpbmciLCAxKTsgCi0vLwkJCWNyZWF0ZVJlbmFtZUNoYW5nZXMobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0vLwkJCS8vdXBkYXRlQ2hhbmdlTWFuYWdlcihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpLCBzdGF0dXMpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCW1vbml0b3IuZG9uZSgpOwotLy8JCX0KLS8vCQlyZXR1cm4gc3RhdHVzOwotLy8JfQotCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0JCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1hdGNoZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTZWFyY2hNYXRjaCBtYXRjaCA9IChTZWFyY2hNYXRjaCkgaXRlci5uZXh0KCk7Ci0JCQlUZXh0Q2hhbmdlIHRleHRDaGFuZ2UgPSBnZXRDaGFuZ2VNYW5hZ2VyKCkuZ2V0KG1hdGNoLmdldEZpbGUoKSk7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKTsKLQkJCVN0cmluZyBxdWFsaWZpZXIgPSAiIjsKLQkJCWlmKGdldEFyZ3VtZW50cygpIGluc3RhbmNlb2YgQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzKXsKLQkJCQlxdWFsaWZpZXIgPSAoKENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cylnZXRBcmd1bWVudHMoKSkuZ2V0UXVhbGlmaWVyKCk7Ci0JCQl9Ci0JCQlpZihtYXRjaC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKW1hdGNoLmdldE9iamVjdCgpOwotCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBJRE9NQXR0cil7Ci0JCQkJCUlET01BdHRyIGF0dHIgPSAoSURPTUF0dHIpbm9kZTsKLQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudClhdHRyLmdldE93bmVyRWxlbWVudCgpIDsKLQkJCQkJbmV3TmFtZSA9IGdldE5ld1FOYW1lKGVsZW1lbnQsIHF1YWxpZmllciwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJCW5ld05hbWUgPSBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IucXVvdGVTdHJpbmcobmV3TmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCVJlcGxhY2VFZGl0IHJlcGxhY2VFZGl0ID0gbmV3IFJlcGxhY2VFZGl0KG1hdGNoLmdldE9mZnNldCgpLCBtYXRjaC5nZXRMZW5ndGgoKSwgbmV3TmFtZSApOwotCQkJU3RyaW5nIGVkaXROYW1lID0gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlX3JlZmVyZW5jZSIpOwotCQkJVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuYWRkVGV4dEVkaXQodGV4dENoYW5nZSwgZWRpdE5hbWUsIHJlcGxhY2VFZGl0KTsKLSAgIAkJfQotCQkvLyBkb24ndCBjcmVhdGUgYW55IGNoYW5nZSBub3csIGFsbCB0aGUgY2hhbmdlcyBhcmUgaW4gY2hhbmdlTWFuZ2VyIHZhcmlhYmxlIGFuZCB3aWxsIGJlIGNvbWJpbmVkIGluIFJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5wb3N0Q3JlYXRlQ2hhbmdlIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5ld1FOYW1lKE5vZGUgbm9kZSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZml4ID0gWFNEQ29uc3RhbnRzLmxvb2t1cFF1YWxpZmllcihub2RlLCB0YXJnZXROYW1lc3BhY2UpOwotCQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCQlzYi5hcHBlbmQocHJlZml4KTsKLQkJCQlzYi5hcHBlbmQoIjoiKTsKLQkJCQlzYi5hcHBlbmQobmV3TmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZChuZXdOYW1lKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChuZXdOYW1lKTsKLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotICBwdWJsaWMgdm9pZCBzZXRDaGFuZ2VNYW5hZ2VyKFRleHRDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXIpCi0gIHsKLSAgICB0aGlzLmNoYW5nZU1hbmFnZXIgPSBjaGFuZ2VNYW5hZ2VyOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNjlmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1hTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci0KLS8qKgotICogVGhpcyBwYXJ0aWNpcGFudCB0YWtlcyBjYXNlIG9mIHJlbmFtaW5nIG1hdGNoZXMgdGhhdCBhcmUgWFNEIGNvbXBvbmVudHMKLSAqLwotcHVibGljIGNsYXNzIFhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgWE1MQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQgewotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoZWxlbWVudCk7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCl7Ci0JCQlpZihnZXRBcmd1bWVudHMoKSBpbnN0YW5jZW9mIENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyl7Ci0JCQkJbWF0Y2hlcyA9IChMaXN0KSgoQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzKWdldEFyZ3VtZW50cygpKS5nZXRNYXRjaGVzKCkuZ2V0KElYU0RTZWFyY2hDb25zdGFudHMuWE1MU0NIRU1BX05BTUVTUEFDRSk7Ci0JCQl9Ci0JCQlpZihtYXRjaGVzICE9IG51bGwpewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQotCQlyZXR1cm4gIlhTRCBjb21wb25lbnQgcmVuYW1lIHBhcnRpY2lwYW50IjsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL0Fic3RyYWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9BYnN0cmFjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5ZWJhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL0Fic3RyYWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbW1hbmQgCi17Ci0gIHByaXZhdGUgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50OwotICBwcml2YXRlIFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsOwotCi0gIHByb3RlY3RlZCBBYnN0cmFjdENvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJ1bigpOwotCi0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRQYXJlbnQoKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotICAKLSAgcHVibGljIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldE1vZGVsT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWxPYmplY3QoWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwpCi0gIHsKLSAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gIH0KLSAgCi0gIC8vIEVzdGFibGlzaCBwYXJ0LXdob2xlIHJlbGF0aW9uc2hpcAotICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBhZG9wdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCk7Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGQoRWxlbWVudCBjaGlsZCkKLSAgewotICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIElET01Nb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpY2hpbGQpLmdldE1vZGVsKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0gICAgICAgIAotICAgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXROb2RlKGNoaWxkKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmNoYW5nZWRNb2RlbCgpOyAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZmMxYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQotCVN0cmluZyBmTmV3TmFtZTsKLQotCXB1YmxpYyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbENvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgZWxlbWVudCwKLQkJCVN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKGVsZW1lbnQuZ2V0Q29udGFpbmVyKCkpOwotCQlzZXRNb2RlbE9iamVjdChlbGVtZW50KTsKLQkJZk5ld05hbWUgPSBuZXdOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwgPSBnZXRNb2RlbE9iamVjdCgpOwotCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBtb2RlbC5nZXRDb250YWluZXIoKTsKLQkJWFNEVHlwZURlZmluaXRpb24gZ2xvYmFsVHlwZURlZiA9IG51bGw7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCS8vIGNsb25lIHR5cGVkZWYgd2l0aCBpdCdzIGNvbnRlbnQgYW5kIHNldCBpdCBnbG9iYWwKLQkJCQlnbG9iYWxUeXBlRGVmID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgbW9kZWwKLQkJCQkJCS5jbG9uZUNvbmNyZXRlQ29tcG9uZW50KHRydWUsIGZhbHNlKTsKLQkJCQlnbG9iYWxUeXBlRGVmLnNldE5hbWUoZk5ld05hbWUpOwotCQkJCXBhcmVudC5nZXRTY2hlbWEoKS5nZXRDb250ZW50cygpLmFkZChnbG9iYWxUeXBlRGVmKTsKLQkJCQkoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50KQotCQkJCQkJLnNldFR5cGVEZWZpbml0aW9uKGdsb2JhbFR5cGVEZWYpOwotCQkJfQotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHsKLQotCQkJWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgbW9kZWw7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJLy8gY2xvbmUgdHlwZWRlZiB3aXRoIGl0J3MgY29udGVudCBhbmQgc2V0IGl0IGdsb2JhbAotCQkJCWdsb2JhbFR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHR5cGVEZWYKLQkJCQkJCS5jbG9uZUNvbmNyZXRlQ29tcG9uZW50KHRydWUsIGZhbHNlKTsKLQkJCQlnbG9iYWxUeXBlRGVmLnNldE5hbWUoZk5ld05hbWUpOwotCQkJCXBhcmVudC5nZXRTY2hlbWEoKS5nZXRDb250ZW50cygpLmFkZChnbG9iYWxUeXBlRGVmKTsKLQkJCQkoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50KQotCQkJCQkJLnNldFR5cGVEZWZpbml0aW9uKGdsb2JhbFR5cGVEZWYpOwotCQkJCWZvcm1hdENoaWxkKGdsb2JhbFR5cGVEZWYuZ2V0RWxlbWVudCgpKTsKLQotCQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgewotCQkJCS8vIGNsb25lIHR5cGVkZWYgd2l0aCBpdCdzIGNvbnRlbnQgYW5kIHNldCBpdCBnbG9iYWwKLQkJCQlnbG9iYWxUeXBlRGVmID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlRGVmCi0JCQkJCQkuY2xvbmVDb25jcmV0ZUNvbXBvbmVudCh0cnVlLCBmYWxzZSk7Ci0JCQkJZ2xvYmFsVHlwZURlZi5zZXROYW1lKGZOZXdOYW1lKTsKLQkJCQlwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0Q29udGVudHMoKS5hZGQoZ2xvYmFsVHlwZURlZik7Ci0JCQkJKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgcGFyZW50KQotCQkJCQkJLnNldFR5cGVEZWZpbml0aW9uKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgZ2xvYmFsVHlwZURlZik7Ci0KLQkJCX0KLQotCQl9Ci0KLQkJZm9ybWF0Q2hpbGQoZ2xvYmFsVHlwZURlZi5nZXRFbGVtZW50KCkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkFic3RyYWN0Q29tbWFuZCNhZG9wdChvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRvcHQoWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTJhZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kCi17Ci0JCi0gIHB1YmxpYyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZAotICAgIChYU0RDb25jcmV0ZUNvbXBvbmVudCBlbGVtZW50KQotICB7Ci0gICAgc3VwZXIoZWxlbWVudC5nZXRDb250YWluZXIoKSk7Ci0gICAgc2V0TW9kZWxPYmplY3QoZWxlbWVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICAKLSAgIGlmKGdldE1vZGVsT2JqZWN0KCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pewotICAgCi0JICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWdldE1vZGVsT2JqZWN0KCk7Ci0gCVhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IGdldFBhcmVudCgpOwotIAlYU0RDb25jcmV0ZUNvbXBvbmVudCBjb250YWluZXIgPSBwYXJlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gCQotIAkvLyBjbG9uZSBlbGVtZW50IHdpdGggaXQncyBjb250ZW50IGFuZCBzZXQgaXQgZ2xvYmFsCi0JWFNEQ29uY3JldGVDb21wb25lbnQgIGVsZW1lbnREZWNsID0gKChYU0RFbGVtZW50RGVjbGFyYXRpb24pZ2V0TW9kZWxPYmplY3QoKSkuY2xvbmVDb25jcmV0ZUNvbXBvbmVudCh0cnVlLCB0cnVlKTsKLSAJY29udGFpbmVyLmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGVsZW1lbnREZWNsKTsKLSAJCi0gCS8vIGNyZWF0ZSBsb2NhbCBlbGVtZW50IGFuZCBzZXQgaXQncyByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvbmUKLSAJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnRSZWYgPSAKLQkgICAgICBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQllbGVtZW50UmVmLnNldFZhbHVlKGVsZW1lbnQuZ2V0VmFsdWUoKSk7Ci0gICAgZWxlbWVudFJlZi5zZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKWVsZW1lbnREZWNsKTsgCi0gICAgCi0gICAgLy8gbm93IHNldCBjb250ZW50IG1vZGVscwotIAlpZihwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZUNvbnRlbnQpewotIAkJaWYoY29udGFpbmVyIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCl7Ci0gCQkJWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApY29udGFpbmVyOwotIAkJCS8vIGRpc2Nvbm5lY3QgcGFyZW50IGZyb20gaXRzIGNvbnRhaW5lcgotIAkJCWludCBpbmRleCA9IG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pbmRleE9mKHBhcmVudCk7Ci0gCQkJIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gCi0gCQkJICAgICAgWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAJCSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KGVsZW1lbnRSZWYpOwotIAkJICAgIG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHBhcnRpY2xlKTsgCi0gICAgICAgICAgICAvLyBDb3B5IG92ZXIgdGhlIG1heC9taW5PY2N1cnMgZnJvbSB0aGUgb2xkIGxvY2FsIHRvIHRoZSBlbGVtZW50IHJlZgotICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKSB7Ci0gICAgICAgICAgICAgIFhTRFBhcnRpY2xlIHBhcmVudFBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKXBhcmVudDsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGlmIChwYXJlbnRQYXJ0aWNsZS5pc1NldE1pbk9jY3VycygpKSB7Ci0gICAgICAgICAgICAgICAgcGFydGljbGUuc2V0TWluT2NjdXJzKHBhcmVudFBhcnRpY2xlLmdldE1pbk9jY3VycygpKTsKLSAgICAgICAgICAgICAgICBwYXJlbnRQYXJ0aWNsZS51bnNldE1pbk9jY3VycygpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAocGFyZW50UGFydGljbGUuaXNTZXRNYXhPY2N1cnMoKSkgewotICAgICAgICAgICAgICAgIHBhcnRpY2xlLnNldE1heE9jY3VycyhwYXJlbnRQYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgcGFyZW50UGFydGljbGUudW5zZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICAgIGVsZW1lbnQudW5zZXRGb3JtKCk7Ci0gCQkgICAKLSAJCQltb2RlbEdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKHBhcmVudCk7Ci0gCQkgICAgbW9kZWxHcm91cC51cGRhdGVFbGVtZW50KHRydWUpOwotICAJCSAgICBmb3JtYXRDaGlsZChtb2RlbEdyb3VwLmdldEVsZW1lbnQoKSk7Ci0gCQl9Ci0gCX0KLSAJZWxzZSBpZihwYXJlbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbil7Ci0JCSAJCQotIAl9Ci0gCQotIAljb250YWluZXIuZ2V0U2NoZW1hKCkudXBkYXRlRWxlbWVudCh0cnVlKTsKLSAgICBmb3JtYXRDaGlsZChlbGVtZW50RGVjbC5nZXRFbGVtZW50KCkpOwotICAKLSAgIH0KLQotICB9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjYWRvcHQob3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbENoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbENoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IxZDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZVR5cGVHbG9iYWxDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWtlVHlwZUdsb2JhbENoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwcml2YXRlIE1hcCBmQ2hhbmdlczsKLQotCXByaXZhdGUgU3RyaW5nIGZOZXdOYW1lOwotCi0JcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiBmVHlwZUNvbXBvbmVudDsKLQotCXB1YmxpYyBNYWtlVHlwZUdsb2JhbENoYW5nZShYU0RUeXBlRGVmaW5pdGlvbiBjb21wb25lbnQsIAotCQkJU3RyaW5nIG5ld05hbWUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuZXdOYW1lLCAibmV3IG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZUeXBlQ29tcG9uZW50ID0gY29tcG9uZW50OwotCQlmTmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCwKLQkvLyBTdHJpbmcgbmV3TmFtZSkgewotCS8vIC8vIFRPRE86IFAxIGltcGxlbWVudCBzZWFyY2ggb2YgWFNEIGZpbGVzCi0JLy8gWFNEU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gWFNEU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCS8vIFJlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldwotCS8vIFJlZmFjdG9yU2VhcmNoUmVxdWVzdG9yKGNvbXBvbmVudCwgbmV3TmFtZSk7Ci0JLy8gc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShjb21wb25lbnQsIElYU0RTZWFyY2hDb25zdGFudHMuV09SS1NQQUNFX1NDT1BFLAotCS8vIHJlcXVlc3Rvcik7Ci0JLy8KLQkvLyByZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQkvLwotCS8vIH0KLQotCXByb3RlY3RlZCBDaGFuZ2UgY3JlYXRlVW5kb0NoYW5nZSgpIHsKLQkJcmV0dXJuIG5ldyBNYWtlVHlwZUdsb2JhbENoYW5nZShmVHlwZUNvbXBvbmVudCwgZ2V0TmV3TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlbmFtZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gUDEgY2hhbmdlIHRlbXBvcmFyeSByZW5hbWUgb2YgWFNEIG1vZGVsIGNvbXBvbmVudHMKLQkJcGVyZm9ybU1vZGlmeShnZXROZXdOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1Nb2RpZnkoZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0vLwkJCURlbGF5ZWRSZW5hbWVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBEZWxheWVkUmVuYW1lUnVubmFibGUoCi0vLwkJCQkJZlR5cGVDb21wb25lbnQsIHZhbHVlKTsKLQkJCS8vIFRPRE86IHJlbW92ZSBEaXNwbGF5Ci0JCQkvL0Rpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBEZWxheWVkUmVuYW1lUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByb3RlY3RlZCBYU0RUeXBlRGVmaW5pdGlvbiBjb21wb25lbnQ7Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JCXB1YmxpYyBEZWxheWVkUmVuYW1lUnVubmFibGUoWFNEVHlwZURlZmluaXRpb24gY29tcG9uZW50LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIGNvbXBvbmVudC5nZXRFbGVtZW50KCkuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcoCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlSZWZhY3RvcmluZ01lc3NhZ2VzCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQUNUSU9OX01BS0VfQU5PTllNT1VTX1RZUEVfR0xPQkFMIikpOwotCQkJTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kKAotCQkJCQljb21wb25lbnQsIG5hbWUpOwotCQkJY29tbWFuZC5ydW4oKTsKLQkJCWRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0Q2hhbmdlIGdldENoYW5nZShJRmlsZSBmaWxlKSB7Ci0JCVRleHRDaGFuZ2UgcmVzdWx0ID0gKFRleHRDaGFuZ2UpIGZDaGFuZ2VzLmdldChmaWxlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoZmlsZS5nZXROYW1lKCksIGZpbGUpOwotCQkJZkNoYW5nZXMucHV0KGZpbGUsIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzCi0JCQkJLmdldEZvcm1hdHRlZFN0cmluZygKLQkJCQkJCSJNYWtlVHlwZUdsb2JhbENoYW5nZS5uYW1lIiwgbmV3IFN0cmluZ1tdIHtnZXROZXdOYW1lKCkgfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgZmluYWwgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcG0uYmVnaW5UYXNrKFJlZmFjdG9yaW5nTWVzc2FnZXMKLQkJCQkJLmdldFN0cmluZygiWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlLlJlbmFtaW5nIiksIDEpOyAvLyROT04tTkxTLTEkCi0JCQlDaGFuZ2UgcmVzdWx0ID0gY3JlYXRlVW5kb0NoYW5nZSgpOwotCQkJZG9SZW5hbWUobmV3IFN1YlByb2dyZXNzTW9uaXRvcihwbSwgMSkpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBmaW5hbGx5IHsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5ld05hbWUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdOYW1lKCkgewotCQlyZXR1cm4gZk5ld05hbWU7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNnZXRNb2RpZmllZEVsZW1lbnQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmVHlwZUNvbXBvbmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjaXNWYWxpZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgY2hhbmdlIHZhbGlkYXRpb24KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3OTNmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VUeXBlR2xvYmFsUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5QYXJ0aWNpcGFudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZUFyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklOYW1lVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIE1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yIGV4dGVuZHMgUmVuYW1lUHJvY2Vzc29yIGltcGxlbWVudHMgSU5hbWVVcGRhdGluZ3sKLQkKLQlwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIGZUeXBlQ29tcG9uZW50OwotCXByaXZhdGUgU3RyaW5nIGZOZXdFbGVtZW50TmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVI9ICJvcmcuZWNsaXBzZS53c3QudWkueHNkLm1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9wcml2YXRlIFF1YWxpZmllZE5hbWVTZWFyY2hSZXN1bHQgZk5hbWVTZWFyY2hSZXN1bHQ7Ci0JCi0JcHVibGljIE1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yKFhTRFR5cGVEZWZpbml0aW9uIGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWZUeXBlQ29tcG9uZW50PSBlbGVtZW50OwotCQlmTmV3RWxlbWVudE5hbWUgPSBuZXdOYW1lOwotCQkKLQl9Ci0JCi0JcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIGdldFR5cGVDb21wb25lbnQoKSB7Ci0JCXJldHVybiBmVHlwZUNvbXBvbmVudDsKLQl9Ci0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSVRleHRVcGRhdGluZyNjYW5FbmFibGVUZXh0VXBkYXRpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVuYWJsZVRleHRVcGRhdGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vVE9ETzogZmluZCBwcm9qZWN0IG5hdHVyZXMgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHJlZmFjdG9yZWQKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWREZXJpdmVkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywKLQkJCUxpc3QgcmVzdWx0LCBTdHJpbmdbXSBuYXR1cmVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE86IHByb3ZpZGUgYSB3YXkgdG8gbG9hZCByZW5hbWUgcGFydGljaXBhbnRzCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjaGVja0ZpbmFsQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrRmluYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBUT0RPIGFkZCBjb2RlIHRvIGNoZWNrIGZpbmFsIGNvbmRpdGlvbnMgZm9yIGNvbXBvbmVudCByZW5hbWUKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLS8vCQkgVE9ETyBhZGQgY29kZSB0byBjaGVjayBpbml0aWFsIGNvbmRpdGlvbnMgZm9yIGNvbXBvbmVudCByZW5hbWUKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBUT0RPIFAxIGFkZCBjaGFuZ2UgY3JlYXRpb24KLS8vCQlDaGFuZ2VbXSBjaGFuZ2VzID0gWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IodGhpcy5mTmFtZWRDb21wb25lbnQsIGdldE5ld0VsZW1lbnROYW1lKCkpOwotLy8JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7IAotLy8JCQlpZihjaGFuZ2VzLmxlbmd0aCA+IDApCi0vLwkJCQltdWx0aUNoYW5nZSAgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKCJYU0QgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudCBjaGFuZ2VzIiwgY2hhbmdlcyk7IC8vJE5PTi1OTFMtMSQgVE9ETzogZXh0ZXJuYWxpemUgc3RyaW5nCi0vLwkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCQkKLS8vCQljb21wdXRlTmFtZU1hdGNoZXMocG0pOwkKLS8vCQlDaGFuZ2VbXSBjaGFuZ2VzID0gZk5hbWVTZWFyY2hSZXN1bHQuZ2V0QWxsQ2hhbmdlcygpOwotLy8JCXJldHVybiBuZXcgQ29tcG9zaXRlQ2hhbmdlKCJYU0QgZmlsZSByZW5hbWUgcGFydGljaXBhbnQgY2hhbmdlcyIsIGNoYW5nZXMpOyAvL1RPRE86IGV4dGVybmFsaXplIHN0cmluZwotCQlwbS5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCXRyeXsKLQkJCXJldHVybiBuZXcgTWFrZVR5cGVHbG9iYWxDaGFuZ2UoZlR5cGVDb21wb25lbnQsIGdldE5ld0VsZW1lbnROYW1lKCkpOwotCQl9IGZpbmFsbHl7Ci0JCQlwbS5kb25lKCk7Ci0JCX0JIAotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0RWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpIHsKLQkJCi0JCXJldHVybiBuZXcgT2JqZWN0W10ge2ZUeXBlQ29tcG9uZW50fTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldElkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIElERU5USUZJRVI7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRQcm9jZXNzb3JOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3Nvck5hbWUoKSB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygKLQkJCQkiTWFrZUxvY2FsVHlwZUdsb2JhbFJlZmFjdG9yaW5nLm5hbWUiLCAgLy8kTk9OLU5MUy0xJAotCQkJCW5ldyBTdHJpbmdbXXtnZXROZXdFbGVtZW50TmFtZSgpfSk7Ci0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2lzQXBwbGljYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZlR5cGVDb21wb25lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gVE9ETyBpbXBsZW1lbnQgaXNBcHBsaWNhYmxlIGxvZ2ljIGZvciB0aGUgbmFtZWQgY29tcG9uZW50LCAKLQkJLy8gdmVyaWZ5IGhvdyBpdCBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlciBjb25kaXRpb24gY2hlY2tzCi0vLwkJaWYgKGZOYW1lZENvbXBvbmVudC5pc0Fub255bW91cygpKQotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJaWYgKCEgQ2hlY2tzLmlzQXZhaWxhYmxlKGZUeXBlKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCWlmIChpc1NwZWNpYWxDYXNlKGZUeXBlKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklOYW1lVXBkYXRpbmcjY2hlY2tOZXdFbGVtZW50TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKXsKLQkJQXNzZXJ0LmlzTm90TnVsbChuZXdOYW1lLCAibmV3IG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBUT0RPOiBpbXBsZW1lbnQgbmV3IG5hbWUgY2hlY2tpbmcKLS8vCQlSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQgPSBDaGVja3MuY2hlY2tUeXBlTmFtZShuZXdOYW1lKTsKLS8vCQlpZiAoQ2hlY2tzLmlzQWxyZWFkeU5hbWVkKGZUeXBlLCBuZXdOYW1lKSkKLS8vCQkJcmVzdWx0LmFkZEZhdGFsRXJyb3IoUmVmYWN0b3JpbmdDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVUeXBlUmVmYWN0b3JpbmcuY2hvb3NlX2Fub3RoZXJfbmFtZSIpKTsJIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSU5hbWVVcGRhdGluZyNnZXROZXdFbGVtZW50KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5ld0VsZW1lbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLCBpdCdzIHVzZWQgZm9yIHVwZGF0aW5nIHNlbGVjdGlvbiBvbiBuZXcgZWxlbWVudAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0vLwlwcml2YXRlIHZvaWQgY29tcHV0ZU5hbWVNYXRjaGVzKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQotLy8JICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotLy8JICAgIHRyeSB7Ci0vLwkJCVVSTCBmaWxlVVJMID0gUGxhdGZvcm0ucmVzb2x2ZShuZXcgVVJMKGZOYW1lZENvbXBvbmVudC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpKSk7Ci0vLwkJCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlVVJMLmdldFBhdGgoKSkpOwotLy8JCQlpZiAoZk5hbWVTZWFyY2hSZXN1bHQgPT0gbnVsbCkKLS8vCQkJCWZOYW1lU2VhcmNoUmVzdWx0PSBuZXcgUXVhbGlmaWVkTmFtZVNlYXJjaFJlc3VsdCgpOwotLy8JCQlRdWFsaWZpZWROYW1lRmluZGVyLnByb2Nlc3MoZk5hbWVTZWFyY2hSZXN1bHQsIGdldE5hbWVkQ29tcG9uZW50KCkuZ2V0TmFtZSgpLCAgCi0vLwkJCQlnZXROZXdFbGVtZW50TmFtZSgpLCAKLS8vCQkJCSIqLnhzZCIsIGZpbGUuZ2V0UHJvamVjdCgpLCBwbSk7Ci0vLwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotLy8JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8JfQotCQotCXB1YmxpYyBmaW5hbCBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10gbG9hZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZFBhcnRpY2lwYW50cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzPSBuZXcgUmVuYW1lQXJndW1lbnRzKGdldE5ld0VsZW1lbnROYW1lKCksIHRydWUpOwotCQlTdHJpbmdbXSBuYXR1cmVzPSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCk7Ci0JCUxpc3QgcmVzdWx0PSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxvYWRFbGVtZW50UGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZFBhcnRpY2lwYW50cyk7Ci0JCWxvYWREZXJpdmVkUGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBuYXR1cmVzLCBzaGFyZWRQYXJ0aWNpcGFudHMpOwotCQlyZXR1cm4gKFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSlyZXN1bHQudG9BcnJheShuZXcgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWRFbGVtZW50UGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgTGlzdCByZXN1bHQsIFJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3RbXSBlbGVtZW50cz0gZ2V0RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoUGFydGljaXBhbnRNYW5hZ2VyLmxvYWRSZW5hbWVQYXJ0aWNpcGFudHMoc3RhdHVzLCAKLQkJCQl0aGlzLCAgZWxlbWVudHNbaV0sCi0JCQkJYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0TmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCi0JCWZOZXdFbGVtZW50TmFtZT0gbmV3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5ld0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZk5ld0VsZW1lbnROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnROYW1lKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmTmV3RWxlbWVudE5hbWU7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3V0aWwvVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci91dGlsL1RleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTc1ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3V0aWwvVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXRHcm91cDsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgdG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZAotICogdGV4dCBjaGFuZ2UgQVBJIG9mIGFkZGluZyB0ZXh0IGVkaXRzIGRpcmVjdGx5IGFuZCBhdXRvCi0gKiBpbnNlcnRpbmcgdGhlbSBpbnRvIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dENoYW5nZUNvbXBhdGliaWxpdHkgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRleHRFZGl0KFRleHRDaGFuZ2UgY2hhbmdlLCBTdHJpbmcgbmFtZSwgVGV4dEVkaXQgZWRpdCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNoYW5nZSk7Ci0JCUFzc2VydC5pc05vdE51bGwobmFtZSk7Ci0JCUFzc2VydC5pc05vdE51bGwoZWRpdCk7Ci0JCVRleHRFZGl0IHJvb3Q9IGNoYW5nZS5nZXRFZGl0KCk7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCXJvb3Q9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQljaGFuZ2Uuc2V0RWRpdChyb290KTsKLQkJfQotCQlpbnNlcnQocm9vdCwgZWRpdCk7Ci0JCWNoYW5nZS5hZGRUZXh0RWRpdEdyb3VwKG5ldyBUZXh0RWRpdEdyb3VwKG5hbWUsIGVkaXQpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRleHRFZGl0KFRleHRDaGFuZ2UgY2hhbmdlLCBTdHJpbmcgbmFtZSwgVGV4dEVkaXRbXSBlZGl0cykgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNoYW5nZSk7Ci0JCUFzc2VydC5pc05vdE51bGwobmFtZSk7Ci0JCUFzc2VydC5pc05vdE51bGwoZWRpdHMpOwotCQlUZXh0RWRpdCByb290PSBjaGFuZ2UuZ2V0RWRpdCgpOwotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlyb290PSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJY2hhbmdlLnNldEVkaXQocm9vdCk7Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGVkaXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnNlcnQocm9vdCwgZWRpdHNbaV0pOwotCQl9Ci0JCWNoYW5nZS5hZGRUZXh0RWRpdEdyb3VwKG5ldyBUZXh0RWRpdEdyb3VwKG5hbWUsIGVkaXRzKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnQoVGV4dEVkaXQgcGFyZW50LCBUZXh0RWRpdCBlZGl0KSB7Ci0JCWlmICghcGFyZW50Lmhhc0NoaWxkcmVuKCkpIHsKLQkJCXBhcmVudC5hZGRDaGlsZChlZGl0KTsKLQkJCXJldHVybjsKLQkJfQotCQlUZXh0RWRpdFtdIGNoaWxkcmVuPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJLy8gRmlyc3QgZGl2ZSBkb3duIHRvIGZpbmQgdGhlIHJpZ2h0IHBhcmVudC4KLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlUZXh0RWRpdCBjaGlsZD0gY2hpbGRyZW5baV07Ci0JCQlpZiAoY292ZXJzKGNoaWxkLCBlZGl0KSkgewotCQkJCWluc2VydChjaGlsZCwgZWRpdCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8vIFdlIGhhdmUgdGhlIHJpZ2h0IHBhcmVudC4gTm93IGNoZWNrIGlmIHNvbWUgb2YgdGhlIGNoaWxkcmVuIGhhdmUgdG8KLQkJLy8gYmUgbW92ZWQgdW5kZXIgdGhlIG5ldyBlZGl0IHNpbmNlIGl0IGlzIGNvdmVyaW5nIGl0LgotCQlmb3IgKGludCBpPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJVGV4dEVkaXQgY2hpbGQ9IGNoaWxkcmVuW2ldOwotCQkJaWYgKGNvdmVycyhlZGl0LCBjaGlsZCkpIHsKLQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQoaSk7Ci0JCQkJZWRpdC5hZGRDaGlsZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcGFyZW50LmFkZENoaWxkKGVkaXQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvdmVycyhUZXh0RWRpdCB0aGlzRWRpdCwgVGV4dEVkaXQgb3RoZXJFZGl0KSB7Ci0JCWlmICh0aGlzRWRpdC5nZXRMZW5ndGgoKSA9PSAwKQkvLyBhbiBpbnNlcnRpb24gcG9pbnQgY2FuJ3QgY292ZXIgYW55dGhpbmcKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWludCB0aGlzT2Zmc2V0PSB0aGlzRWRpdC5nZXRPZmZzZXQoKTsKLQkJaW50IHRoaXNFbmQ9IHRoaXNFZGl0LmdldEV4Y2x1c2l2ZUVuZCgpOwkKLQkJaWYgKG90aGVyRWRpdC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlpbnQgb3RoZXJPZmZzZXQ9IG90aGVyRWRpdC5nZXRPZmZzZXQoKTsKLQkJCXJldHVybiB0aGlzT2Zmc2V0IDwgb3RoZXJPZmZzZXQgJiYgb3RoZXJPZmZzZXQgPCB0aGlzRW5kOwotCQl9IGVsc2UgewotCQkJaW50IG90aGVyT2Zmc2V0PSBvdGhlckVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgb3RoZXJFbmQ9IG90aGVyRWRpdC5nZXRFeGNsdXNpdmVFbmQoKTsKLQkJCXJldHVybiB0aGlzT2Zmc2V0IDw9IG90aGVyT2Zmc2V0ICYmIG90aGVyRW5kIDw9IHRoaXNFbmQ7Ci0JCX0KLQl9CQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3RvckFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMThkMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3RvckFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuUmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9ucy5TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbjsKLQotLyoqCi0gKiBBY3Rpb24gZ3JvdXAgdGhhdCBhZGRzIHJlZmFjdG9yIGFjdGlvbnMgKGZvciBleGFtcGxlICdSZW5hbWUnLCAnTW92ZScpIHRvIGEKLSAqIGNvbnRleHQgbWVudSBhbmQgdGhlIGdsb2JhbCBtZW51IGJhci4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmYWN0b3JBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb0FjdGlvbkF2YWlsYWJsZSBleHRlbmRzIEFjdGlvbiB7Ci0JCXB1YmxpYyBOb0FjdGlvbkF2YWlsYWJsZSgpIHsKLQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzZXRUZXh0KFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVmYWN0b3JBY3Rpb25Hcm91cF9ub19yZWZhY3RvcmluZ19hdmFpbGFibGUpOyAKLQkJfQotCX0KLQotCS8qKgotCSAqIFBvcC11cCBtZW51OiBuYW1lIG9mIGdyb3VwIGZvciByZW9yZ2FuaXplIGFjdGlvbnMgKHZhbHVlCi0JICogPGNvZGU+Imdyb3VwLnJlb3JnYW5pemUiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfUkVPUkdBTklaRSA9IElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR1JPVVBfUkVPUkdBTklaRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvcmluZy5tZW51IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JpbmcuYWN0aW9ucy5SZW5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0QWN0aW9uKFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGFjdGlvbiwKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChzZWxlY3Rpb24pOwotCQlBc3NlcnQuaXNOb3ROdWxsKGFjdGlvbik7Ci0JCWFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLQkJLy9wcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmRWRpdG9yQWN0aW9uczsKLQotCXByaXZhdGUgU3RyaW5nIGZHcm91cE5hbWUgPSBHUk9VUF9SRU9SR0FOSVpFOwotCQotCXByaXZhdGUgQWN0aW9uIGZOb0FjdGlvbkF2YWlsYWJsZSA9IG5ldyBOb0FjdGlvbkF2YWlsYWJsZSgpOwotCi0JcHJvdGVjdGVkIFJlbmFtZUFjdGlvbiBmUmVuYW1lQWN0aW9uOwotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGZSZW5hbWVUYXJnZXROYW1lc3BhY2U7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JcHVibGljIFJlZmFjdG9yQWN0aW9uR3JvdXAoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJCi0JfQotCi0JcHVibGljIGludCBhZGRBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJZkVkaXRvckFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUmVmYWN0b3JTdWJtZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0KLQkJSU1lbnVNYW5hZ2VyIHJlZmFjdG9yU3VibWVudSA9IG5ldyBNZW51TWFuYWdlcihSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlZmFjdG9yTWVudV9sYWJlbCwgTUVOVV9JRCk7Ci0JCXJlZmFjdG9yU3VibWVudS5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJCXJlZmFjdG9yTWVudVNob3duKG1hbmFnZXIpOwotCQkJCX0KLQkJCX0pOwotCQlyZWZhY3RvclN1Ym1lbnUuYWRkKGZOb0FjdGlvbkF2YWlsYWJsZSk7Ci0JCQlpZiAobWVudS5maW5kKHJlZmFjdG9yU3VibWVudS5nZXRJZCgpKSA9PSBudWxsKSB7Ci0JCQkJaWYgKG1lbnUuZmluZChmR3JvdXBOYW1lKSA9PSBudWxsKSB7Ci0JCQkJCW1lbnUuYWRkKHJlZmFjdG9yU3VibWVudSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVudS5hcHBlbmRUb0dyb3VwKGZHcm91cE5hbWUsIHJlZmFjdG9yU3VibWVudSk7Ci0JCQkJfQotCQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VBY3Rpb24oSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBhY3Rpb24sCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKQotCQkJcHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGFjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBBY3Rpb25Hcm91cAotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJc3VwZXIuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihSRU5BTUUsIGZSZW5hbWVBY3Rpb24pOwotCQlyZXRhcmdldEZpbGVNZW51QWN0aW9ucyhhY3Rpb25CYXJzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9ucyhMaXN0IGVuYWJsZWRBY3Rpb25zKSB7Ci0JCQotCQlpZihzZWxlY3Rpb24gIT0gbnVsbCAmJiBmRWRpdG9yQWN0aW9ucyAhPSBudWxsKXsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFZGl0b3JBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIHsKLQkJCQkJU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gc2VsZWN0aW9uQWN0aW9uID0gKFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKSBhY3Rpb247Ci0JCQkJCXNlbGVjdGlvbkFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFZGl0b3JBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCQkJZW5hYmxlZEFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gQWN0aW9uR3JvdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuZmlsbENvbnRleHRNZW51KG1lbnUpOwotCQlhZGRSZWZhY3RvclN1Ym1lbnUobWVudSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmlsbFJlZmFjdG9yTWVudShJTWVudU1hbmFnZXIgcmVmYWN0b3JTdWJtZW51KSB7Ci0JCWludCBhZGRlZCA9IDA7Ci0JCXJlZmFjdG9yU3VibWVudS5hZGQobmV3IFNlcGFyYXRvcihHUk9VUF9SRU9SR0FOSVpFKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFZGl0b3JBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCWZFZGl0b3JBY3Rpb25zLmFkZChhY3Rpb24pOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGRlZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmYWN0b3JNZW51SGlkZGVuKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZkVkaXRvckFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpb24gYWN0aW9uID0gKEFjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIHsKLQkJCQlTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBzZWxlY3Rpb25BY3Rpb24gPSAoU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIGFjdGlvbjsKLQkJCQlzZWxlY3Rpb25BY3Rpb24udXBkYXRlKHNlbGVjdGlvbik7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWZhY3Rvck1lbnVTaG93bihmaW5hbCBJTWVudU1hbmFnZXIgcmVmYWN0b3JTdWJtZW51KSB7Ci0JCS8vIHdlIGtub3cgdGhhdCB3ZSBoYXZlIGFuIE1lbnVNYW5hZ2VyIHNpbmNlIHdlIGNyZWF0ZWQgaXQgaW4KLQkJLy8gYWRkUmVmYWN0b3JTdWJtZW51LgotCQlNZW51IG1lbnUgPSAoKE1lbnVNYW5hZ2VyKSByZWZhY3RvclN1Ym1lbnUpLmdldE1lbnUoKTsKLQkJbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJCXJlZmFjdG9yTWVudUhpZGRlbihyZWZhY3RvclN1Ym1lbnUpOwotCQkJfQotCQl9KTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmRWRpdG9yQWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbikgewotCQkJCVNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHNlbGVjdGlvbkFjdGlvbiA9IChTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbikgYWN0aW9uOwotCQkJCXNlbGVjdGlvbkFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCQlyZWZhY3RvclN1Ym1lbnUucmVtb3ZlQWxsKCk7Ci0JCWlmIChmaWxsUmVmYWN0b3JNZW51KHJlZmFjdG9yU3VibWVudSkgPT0gMCkKLQkJCXJlZmFjdG9yU3VibWVudS5hZGQoZk5vQWN0aW9uQXZhaWxhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhcmdldHMgdGhlIEZpbGUgYWN0aW9ucyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHJlZmFjdG9yaW5nIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbkJhcnMKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gYmFyIHRvIHJlZ2lzdGVyIHRoZSBtb3ZlIGFuZCByZW5hbWUgYWN0aW9uIHdpdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXRhcmdldEZpbGVNZW51QWN0aW9ucyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFTkFNRS5nZXRJZCgpLAotCQkJCWZSZW5hbWVBY3Rpb24pOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljNTY3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlLCBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElNZW51Q3JlYXRvciB7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCXByaXZhdGUgSUFjdGlvbiBmRGVsZWdhdGVBY3Rpb247Ci0JLy8gd2hldGhlciB0byByZS1maWxsIHRoZSBtZW51IChyZXNldCBvbiBzZWxlY3Rpb24gY2hhbmdlKQotCXByaXZhdGUgYm9vbGVhbiBmRmlsbE1lbnUgPSB0cnVlOwotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0OyAKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCi0KLQlwdWJsaWMgUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlKCkgewotCi0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl3b3JrYmVuY2hQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sKQotCSAqLwotCXB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLQkJLy8gbmV2ZXIgY2FsbGVkCi0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudSkKLQkgKi8KLQlwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0JCS8vQ3JlYXRlIHRoZSBuZXcgbWVudS4gVGhlIG1lbnUgd2lsbCBnZXQgZmlsbGVkIHdoZW4gaXQgaXMgYWJvdXQgdG8gYmUgc2hvd24uIHNlZSBmaWxsTWVudShNZW51KS4KLQkJTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkJLyoqCi0JCSAqIEFkZCBsaXN0ZW5lciB0byByZXBvcHVsYXRlIHRoZSBtZW51IGVhY2ggdGltZQotCQkgKiBpdCBpcyBzaG93biBiZWNhdXNlIE1lbnVNYW5hZ2VyLnVwZGF0ZShib29sZWFuLCBib29sZWFuKSAKLQkJICogZG9lc24ndCBkaXNwb3NlIHB1bGxkb3duIEFjdGlvbkNvbnRyaWJ1dGlvbiBpdGVtcyBmb3IgZWFjaCBwb3B1cCBtZW51LgotCQkgKi8KLQkJbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0JCQkJaWYgKGZGaWxsTWVudSkgewotCQkJCQlNZW51IG0gPSAoTWVudSllLndpZGdldDsKLQkJCQkJTWVudUl0ZW1bXSBpdGVtcyA9IG0uZ2V0SXRlbXMoKTsKLQkJCQkJZm9yIChpbnQgaT0wOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWl0ZW1zW2ldLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQlmaWxsTWVudShtKTsKLQkJCQkJZkZpbGxNZW51ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIG1lbnU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIE5ldmVyIGNhbGxlZCBiZWNhdXNlIHdlIGJlY29tZSBhIG1lbnUuCi0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZEZWxlZ2F0ZUFjdGlvbiA9IGFjdGlvbjsKLQkJdXBkYXRlV2l0aChzZWxlY3Rpb24pOwotCQkKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQl3b3JrYmVuY2hQYXJ0ID0gdGFyZ2V0RWRpdG9yOwotCQlmRGVsZWdhdGVBY3Rpb24gPSBhY3Rpb247Ci0JCWlmICh0YXJnZXRFZGl0b3IgIT0gbnVsbCAmJiB0YXJnZXRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpICE9IG51bGwgJiYgdGFyZ2V0RWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpICE9IG51bGwpIHsKLQkJCXVwZGF0ZVdpdGgodGFyZ2V0RWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQl9Ci0gICAgCi0JcHVibGljIHZvaWQgdXBkYXRlV2l0aChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZiAoZkRlbGVnYXRlQWN0aW9uICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZW5hYmxlID0gZmFsc2U7Ci0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJLy9pZiAoKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJCWVuYWJsZSA9IHRydWU7Ci0JCQkJCS8vfQotCQkJCX0KLQkJCQllbHNlIGlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICl7Ci0JCQkJCWVuYWJsZSA9ICFzZWxlY3Rpb24uaXNFbXB0eSgpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGVuYWJsZSBhY3Rpb24KLQkJCWZEZWxlZ2F0ZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkKLQkJCS8vIGZpbGwgc3VibWVudQotCQkJZkZpbGxNZW51ID0gdHJ1ZTsKLQkJCWZEZWxlZ2F0ZUFjdGlvbi5zZXRNZW51Q3JlYXRvcih0aGlzKTsKLQkJCQotCQkJCi0JCX0KLQkJCi0JfQotCQotCQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGxNZW51KE1lbnUgbWVudSk7Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yR3JvdXBTdWJNZW51LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yR3JvdXBTdWJNZW51LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NzgwZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3Rvckdyb3VwU3ViTWVudS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29tcG91bmRDb250cmlidXRpb25JdGVtOwotCi1wdWJsaWMgY2xhc3MgUmVmYWN0b3JHcm91cFN1Yk1lbnUgZXh0ZW5kcyBDb21wb3VuZENvbnRyaWJ1dGlvbkl0ZW0gewotCi0JUmVmYWN0b3JBY3Rpb25Hcm91cCBmUmVmYWN0b3JNZW51R3JvdXA7Ci0JCi0KLQlwdWJsaWMgUmVmYWN0b3JHcm91cFN1Yk1lbnUoUmVmYWN0b3JBY3Rpb25Hcm91cCByZWZhY3Rvck1lbnVHcm91cCkgewotCQlzdXBlcigpOwotCQlmUmVmYWN0b3JNZW51R3JvdXAgPSByZWZhY3Rvck1lbnVHcm91cDsKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JHcm91cFN1Yk1lbnUoU3RyaW5nIGlkKSB7Ci0JCXN1cGVyKGlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBnZXRDb250cmlidXRpb25JdGVtcygpIHsKLQkJICBBcnJheUxpc3QgYWN0aW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCSAgQXJyYXlMaXN0IGNvbnRyaWJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkgIGZSZWZhY3Rvck1lbnVHcm91cC5maWxsQWN0aW9ucyhhY3Rpb25zTGlzdCk7Ci0JICAgICAgICAgCi0JICAgICAgICBpZiAoYWN0aW9uc0xpc3QgIT0gbnVsbCAmJiAhYWN0aW9uc0xpc3QuaXNFbXB0eSgpKSB7Ci0JICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aW9uc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JICAgICAJCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBpdGVyLm5leHQoKTsKLQkgICAgIAkJCWNvbnRyaWJMaXN0LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pKTsKLQkgICAgIAkJfQotCSAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgICAgICBBY3Rpb24gZHVtbXlBY3Rpb24gPSBuZXcgQWN0aW9uKFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVmYWN0b3JBY3Rpb25Hcm91cF9ub19yZWZhY3RvcmluZ19hdmFpbGFibGUpIHsKLQkgICAgICAgICAgICAgICAgLy8gZHVtbXkgaW5uZXIgY2xhc3M7IG5vIG1ldGhvZHMKLQkgICAgICAgICAgICB9OwotCSAgICAgICAgICAgIGR1bW15QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCSAgICAgICAgICAgIGNvbnRyaWJMaXN0LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShkdW1teUFjdGlvbikpOwotCSAgICAgICAgfQotCSAgICAgICAgcmV0dXJuIChJQ29udHJpYnV0aW9uSXRlbVtdKSBjb250cmliTGlzdC50b0FycmF5KG5ldyBJQ29udHJpYnV0aW9uSXRlbVtjb250cmliTGlzdC5zaXplKCldKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhYzU0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcyAgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZmFjdG9yTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWZhY3RvckFjdGlvbkdyb3VwX25vX3JlZmFjdG9yaW5nX2F2YWlsYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUFjdGlvbl9yZW5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lQWN0aW9uX3VuYXZhaWxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lSW5wdXRXaXphcmRQYWdlX25ld19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkX2ludGVybmFsX2Vycm9yOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVRhcmdldE5hbWVzcGFjZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lWFNERWxlbWVudEFjdGlvbl9leGNlcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lWFNERWxlbWVudEFjdGlvbl9ub3RfYXZhaWxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVhTREVsZW1lbnRBY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVN1cHBvcnRfZGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVN1cHBvcnRfbm90X2F2YWlsYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUNvbXBvbmVudFdpemFyZF9pbnB1dFBhZ2VfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVJbnB1dFdpemFyZFBhZ2VfdXBkYXRlX3JlZmVyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlX1JlbmFtaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlUmVuYW1lUGFydGljaXBhbnRfY29tcG9zaXRlQ2hhbmdlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZXNvdXJjZUNoYW5nZV9yZW5hbWVfcmVzb3VyY2VfcmVmZXJlbmNlX2NoYW5nZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0RSZW5hbWVSZXNvdXJjZUNoYW5nZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmdfSW50ZXJuYWxfRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZ19hbHJlYWRfZXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmdfaW52YWxpZE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3JfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbl90ZXh0OyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvcl9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3JfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9kZWNsYXRhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3JfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9yZWZlcmVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfeHNkX2NvbXBvbmVudF9yZW5hbWVfcGFydGljaXBhbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X3dzZGxfY29tcG9uZW50X3JlbmFtZV9wYXJ0aWNpcGFudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50X0ZpbGVfUmVuYW1lX3VwZGF0ZV9yZWZlcmVuY2U7Ci0KLQotCXByaXZhdGUgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZW5hbWVJbnB1dFdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVuYW1lSW5wdXRXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYmYzMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZW5hbWVJbnB1dFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5Vc2VySW5wdXRXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklSZWZlcmVuY2VVcGRhdGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhcgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZUlucHV0V2l6YXJkUGFnZSAgZXh0ZW5kcyBVc2VySW5wdXRXaXphcmRQYWdlewotCXByaXZhdGUgU3RyaW5nIGZJbml0aWFsVmFsdWU7Ci0JcHJpdmF0ZSBUZXh0IGZUZXh0RmllbGQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVwZGF0ZVJlZmVyZW5jZXM7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0ZXh0IGlucHV0IHBhZ2UuCi0JICogQHBhcmFtIGlzTGFzdFVzZXJQYWdlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFnZSBpcyB0aGUgd2l6YXJkJ3MgbGFzdAotCSAqICB1c2VyIGlucHV0IHBhZ2UuIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JcHVibGljIFJlbmFtZUlucHV0V2l6YXJkUGFnZShTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaXNMYXN0VXNlclBhZ2UpIHsKLQkJdGhpcyhkZXNjcmlwdGlvbiwgaXNMYXN0VXNlclBhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRleHQgaW5wdXQgcGFnZS4KLQkgKiBAcGFyYW0gaXNMYXN0VXNlclBhZ2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBwYWdlIGlzIHRoZSB3aXphcmQncyBsYXN0Ci0JICogIHVzZXIgaW5wdXQgcGFnZS4gT3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIEBwYXJhbSBpbml0aWFsVmFsdWUgdGhlIGluaXRpYWwgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUmVuYW1lSW5wdXRXaXphcmRQYWdlKFN0cmluZyBkZXNjcmlwdGlvbiwgYm9vbGVhbiBpc0xhc3RVc2VyUGFnZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCSAgICBzdXBlcigiUmVuYW1lSW5wdXRXaXphcmRQYWdlIik7Ci0JCUFzc2VydC5pc05vdE51bGwoaW5pdGlhbFZhbHVlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQlmSW5pdGlhbFZhbHVlPSBpbml0aWFsVmFsdWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgaW5pdGlhbCBpbnB1dCBpcyB2YWxpZC4gVHlwaWNhbGx5IGl0IGlzIG5vdCwgYmVjYXVzZSB0aGUgCi0JICogdXNlciBpcyByZXF1aXJlZCB0byBwcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gZS5nLiBhIG5ldyB0eXBlIG5hbWUgZXRjLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBpbnB1dCBwcm92aWRlZCBhdCBpbml0aWFsaXphdGlvbiBpcyB2YWxpZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5pdGlhbElucHV0VmFsaWQoKXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgYW4gZW1wdHkgc3RyaW5nIGlzIGEgdmFsaWQgaW5wdXQuIFR5cGljYWxseSBpdCBpcyBub3QsIGJlY2F1c2UgCi0JICogdGhlIHVzZXIgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGUuZy4gYSBuZXcgdHlwZSBuYW1lIGV0Yy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiBhbiBlbXB0eSBzdHJpbmcgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VtcHR5SW5wdXRWYWxpZCgpewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIHRleHQgaW5wdXQgZmllbGQuCi0JICogCi0JICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgdGV4dCBpbnB1dCBmaWVsZC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIG5vdCB0ZXh0IGlucHV0IGZpZWxkIGhhcyBiZWVuIGNyZWF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmIChmVGV4dEZpZWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZUZXh0RmllbGQuZ2V0VGV4dCgpOwkKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbmV3IHRleHQgZm9yIHRoZSB0ZXh0IGZpZWxkLiBEb2VzIG5vdGhpbmcgaWYgdGhlIHRleHQgZmllbGQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQuCi0JICogQHBhcmFtIHRleHQgdGhlIG5ldyB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZUZXh0RmllbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZlRleHRGaWVsZC5zZXRUZXh0KHRleHQpOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyBpbnB1dCB2YWxpZGF0aW9uLiBSZXR1cm5zIGEgPGNvZGU+UmVmYWN0b3JpbmdTdGF0dXM8L2NvZGU+IHdoaWNoCi0JICogZGVzY3JpYmVzIHRoZSByZXN1bHQgb2YgaW5wdXQgdmFsaWRhdGlvbi4gPGNvZGU+TnVsbDxjb2RlPiBpcyBpbnRlcnByZXRlZAotCSAqIGFzIG5vIGVycm9yLgotCSAqLwotCXByb3RlY3RlZCBSZWZhY3RvcmluZ1N0YXR1cyB2YWxpZGF0ZVRleHRGaWVsZChTdHJpbmcgdGV4dCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0SW5wdXRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0SW5wdXRGaWVsZChwYXJlbnQsIFNXVC5CT1JERVIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0SW5wdXRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJZlRleHRGaWVsZD0gbmV3IFRleHQocGFyZW50LCBzdHlsZSk7Ci0JCWZUZXh0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdGV4dE1vZGlmaWVkKGdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZlRleHRGaWVsZCwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFTkFNRV9ORVdfTkFNRSk7Ci0JCWZUZXh0RmllbGQuc2V0VGV4dChmSW5pdGlhbFZhbHVlKTsKLQkJcmV0dXJuIGZUZXh0RmllbGQ7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0aGUgcGFnZSdzIHN0YXRlIGFuZCBpc3N1ZXMgYSBjb3JyZXNwb25kaW5nIGVycm9yIG1lc3NhZ2UuIFRoZSBwYWdlIHZhbGlkYXRpb24KLQkgKiBpcyBjb21wdXRlZCBieSBjYWxsaW5nIDxjb2RlPnZhbGlkYXRlUGFnZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGV4dE1vZGlmaWVkKFN0cmluZyB0ZXh0KSB7CQotCQlpZiAoISBpc0VtcHR5SW5wdXRWYWxpZCgpICYmIHRleHQuZXF1YWxzKCIiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlyZXN0b3JlTWVzc2FnZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgoISBpc0luaXRpYWxJbnB1dFZhbGlkKCkpICYmIHRleHQuZXF1YWxzKGZJbml0aWFsVmFsdWUpKXsKLQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlyZXN0b3JlTWVzc2FnZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVUZXh0RmllbGQodGV4dCkpOwotCQkKLS8vCQkgVE9ETzogZW5hYmxlIHByZXZpZXcgaW4gTTQKLQkJZ2V0UmVmYWN0b3JpbmdXaXphcmQoKS5zZXRGb3JjZVByZXZpZXdSZXZpZXcoZmFsc2UpOwotCQlnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCi0JfQotCQotCS8qKgotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGlmIHRoZXkgd2FudCB0byByZXN0b3JlIHRoZSBtZXNzYWdlIGRpZmZlcmVudGx5LgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gY2FsbHMgPGNvZGU+c2V0TWVzc2FnZShudWxsKTwvY29kZT4sIHdoaWNoIGNsZWFycyB0aGUgbWVzc2FnZSAKLQkgKiB0aHVzIGV4cG9zaW5nIHRoZSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlTWVzc2FnZSgpewotCQlzZXRNZXNzYWdlKG51bGwpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIElEaWFsb2dQYWdlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZlRleHRGaWVsZD0gbnVsbDsJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgaW4gV2l6YXJkUGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQl0ZXh0TW9kaWZpZWQoZ2V0VGV4dCgpKTsKLQkJfQotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSAmJiBmVGV4dEZpZWxkICE9IG51bGwpIHsKLQkJCWZUZXh0RmllbGQuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBzdXBlckNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2V0Q29udHJvbChzdXBlckNvbXBvc2l0ZSk7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhzdXBlckNvbXBvc2l0ZSk7Ci0JCQotCQlzdXBlckNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUoc3VwZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwkKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMjsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZz0gODsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJCi0JCUxhYmVsIGxhYmVsPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0TGFiZWxUZXh0KCkpOwotCQkKLQkJVGV4dCB0ZXh0PSBjcmVhdGVUZXh0SW5wdXRGaWVsZChjb21wb3NpdGUpOwotCQl0ZXh0LnNlbGVjdEFsbCgpOwotCQlHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludD0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDI1KTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRleHQsIFhTREVkaXRvckNTSGVscElkcy5SRU5BTUVfTkVXX05BTUUpOwotICAgIAotCQlhZGRPcHRpb25hbFVwZGF0ZVJlZmVyZW5jZXNDaGVja2JveChzdXBlckNvbXBvc2l0ZSk7Ci0JCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWdldFJlZmFjdG9yaW5nV2l6YXJkKCkuc2V0Rm9yY2VQcmV2aWV3UmV2aWV3KGZhbHNlKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJDb21wb3NpdGUpOwotCQkvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksIGZIZWxwQ29udGV4dElEKTsKLQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBib29sZWFuIHZhbHVlKSB7Ci0JCUJ1dHRvbiBjaGVja0JveD0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQodGl0bGUpOwotCQljaGVja0JveC5zZXRTZWxlY3Rpb24odmFsdWUpOwotCQlyZXR1cm4gY2hlY2tCb3g7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE9wdGlvbmFsVXBkYXRlUmVmZXJlbmNlc0NoZWNrYm94KENvbXBvc2l0ZSByZXN1bHQpIHsKLQotCQlmaW5hbCBJUmVmZXJlbmNlVXBkYXRpbmcgcmVmPSAoSVJlZmVyZW5jZVVwZGF0aW5nKWdldFJlZmFjdG9yaW5nKCkuZ2V0QWRhcHRlcihJUmVmZXJlbmNlVXBkYXRpbmcuY2xhc3MpOwotCQlpZiAocmVmID09IG51bGwgfHwgIXJlZi5jYW5FbmFibGVVcGRhdGVSZWZlcmVuY2VzKCkpCQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdGl0bGU9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVJbnB1dFdpemFyZFBhZ2UudXBkYXRlX3JlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIGRlZmF1bHRWYWx1ZT0gdHJ1ZTsgCi0JCWZVcGRhdGVSZWZlcmVuY2VzPSBjcmVhdGVDaGVja2JveChyZXN1bHQsIHRpdGxlLCBkZWZhdWx0VmFsdWUpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZlVwZGF0ZVJlZmVyZW5jZXMsIFhTREVkaXRvckNTSGVscElkcy5SRU5BTUVfVVBEQVRFX1JFRkVSRU5DRVMpOwotCQlyZWYuc2V0VXBkYXRlUmVmZXJlbmNlcyhmVXBkYXRlUmVmZXJlbmNlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWZVcGRhdGVSZWZlcmVuY2VzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgCQlyZWYuc2V0VXBkYXRlUmVmZXJlbmNlcyhmVXBkYXRlUmVmZXJlbmNlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwkJCQkKLQkJZlVwZGF0ZVJlZmVyZW5jZXMuc2V0RW5hYmxlZCh0cnVlKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVJbnB1dFdpemFyZFBhZ2UubmV3X25hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5NzdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuSU5hbWVVcGRhdGluZzsKLQotcHVibGljIGNsYXNzIFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkIGV4dGVuZHMgUmVmYWN0b3JpbmdXaXphcmQgewotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZJbnB1dFBhZ2VEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIGZJbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3I7Ci0JCi0JcHVibGljIFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkKFJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nLCBTdHJpbmcgZGVmYXVsdFBhZ2VUaXRsZSwgU3RyaW5nIGlucHV0UGFnZURlc2NyaXB0aW9uLCAKLQkJCUltYWdlRGVzY3JpcHRvciBpbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3IpIHsKLQkJc3VwZXIocmVmYWN0b3JpbmcsIERJQUxPR19CQVNFRF9VU0VSX0lOVEVSRkFDRSk7Ci0JCXNldERlZmF1bHRQYWdlVGl0bGUoZGVmYXVsdFBhZ2VUaXRsZSk7Ci0gICAgCWZJbnB1dFBhZ2VEZXNjcmlwdGlvbj0gaW5wdXRQYWdlRGVzY3JpcHRpb247Ci0JCWZJbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3I9IGlucHV0UGFnZUltYWdlRGVzY3JpcHRvcjsKLQotCX0KLQotCS8qIG5vbiBqYXZhLWRvYwotCSAqIEBzZWUgUmVmYWN0b3JpbmdXaXphcmQjYWRkVXNlcklucHV0UGFnZXMKLQkgKi8gCi0JcHJvdGVjdGVkIHZvaWQgYWRkVXNlcklucHV0UGFnZXMoKSB7Ci0JCVN0cmluZyBpbml0aWFsU2V0dGluZz0gZ2V0UHJvY2Vzc29yKCkuZ2V0Q3VycmVudEVsZW1lbnROYW1lKCk7Ci0JCVJlbmFtZUlucHV0V2l6YXJkUGFnZSBpbnB1dFBhZ2U9IGNyZWF0ZUlucHV0UGFnZShmSW5wdXRQYWdlRGVzY3JpcHRpb24sIGluaXRpYWxTZXR0aW5nKTsKLQkJaW5wdXRQYWdlLnNldEltYWdlRGVzY3JpcHRvcihmSW5wdXRQYWdlSW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShpbnB1dFBhZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJTmFtZVVwZGF0aW5nIGdldFByb2Nlc3NvcigpIHsKLQkJCi0JCXJldHVybiAoSU5hbWVVcGRhdGluZylnZXRSZWZhY3RvcmluZygpLmdldEFkYXB0ZXIoSU5hbWVVcGRhdGluZy5jbGFzcyk7CQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgUmVuYW1lSW5wdXRXaXphcmRQYWdlIGNyZWF0ZUlucHV0UGFnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGluaXRpYWxTZXR0aW5nKSB7Ci0JCXJldHVybiBuZXcgUmVuYW1lSW5wdXRXaXphcmRQYWdlKG1lc3NhZ2UsIHRydWUsIGluaXRpYWxTZXR0aW5nKSB7Ci0JCQlwcm90ZWN0ZWQgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWRhdGVUZXh0RmllbGQoU3RyaW5nIHRleHQpIHsKLQkJCQlyZXR1cm4gdmFsaWRhdGVOZXdOYW1lKHRleHQpOwotCQkJfQkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlZmFjdG9yaW5nU3RhdHVzIHZhbGlkYXRlTmV3TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlJTmFtZVVwZGF0aW5nIHJlZj0gZ2V0UHJvY2Vzc29yKCk7Ci0JCXJlZi5zZXROZXdFbGVtZW50TmFtZShuZXdOYW1lKTsKLS8vCQl0cnl7Ci0JCQlyZXR1cm4gcmVmLmNoZWNrTmV3RWxlbWVudE5hbWUobmV3TmFtZSk7Ci0vLwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLS8vCQkJLy9YWFg6IHNob3VsZCBsb2cgdGhlIGV4Y2VwdGlvbgotLy8JCQlTdHJpbmcgbXNnPSBlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiI6IGUuZ2V0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCi0vLwkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGVGYXRhbEVycm9yU3RhdHVzKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJSZW5hbWVSZWZhY3RvcmluZ1dpemFyZC5pbnRlcm5hbF9lcnJvciIsIG1zZykpOy8vJE5PTi1OTFMtMSQKLS8vCQl9CQotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ2ZjI5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1SZWZhY3Rvck1lbnVfbGFiZWw9UmVmYWN0b3IKLVJlZmFjdG9yQWN0aW9uR3JvdXBfbm9fcmVmYWN0b3JpbmdfYXZhaWxhYmxlPTxubyByZWZhY3RvcmluZyBhdmFpbGFibGU+Ci0KLVJlbmFtZUFjdGlvbl9yZW5hbWU9UmVuYW1lCi1SZW5hbWVBY3Rpb25fdW5hdmFpbGFibGU9T3BlcmF0aW9uIHVuYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cblNlbGVjdCBhIC4uLi4KLVJlbmFtZUFjdGlvbl90ZXh0PVJlJm5hbWUuLi4KLQotUmVuYW1lSW5wdXRXaXphcmRQYWdlX25ld19uYW1lPSAmTmV3IG5hbWU6Ci1SZW5hbWVSZWZhY3RvcmluZ1dpemFyZF9pbnRlcm5hbF9lcnJvcj0gSW50ZXJuYWwgZXJyb3IgZHVyaW5nIG5hbWUgY2hlY2tpbmc6IHswfQotCi0KLVJlbmFtZVhTREVsZW1lbnRBY3Rpb25fZXhjZXB0aW9uPVVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkLiBTZWUgbG9nIGZvciBkZXRhaWxzCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uX25vdF9hdmFpbGFibGU9T3BlcmF0aW9uIHVuYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cblNlbGVjdCBhIFhTRCBwcm9qZWN0LCBmb2xkZXIsIHJlc291cmNlLCBmaWxlLCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLCAgYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb25zLCBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zLCBpZGVudGl0eSBjb25zdHJhaW50IGRlZmluaXRpb25zLCBtb2RlbCBncm91cHMgZGVmaW5pdGlvbnMsIG5vdGF0aW9uIGRlY2xhcmF0aW9ucywgb3Igc2ltcGxlIHR5cGUgZGVmaW5pdGlvbnMuCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uX25hbWU9UmVuYW1lCi0KLQotUmVuYW1lU3VwcG9ydF9kaWFsb2dfdGl0bGU9UmVuYW1lCi1SZW5hbWVTdXBwb3J0X25vdF9hdmFpbGFibGU9UmVuYW1lIHN1cHBvcnQgbm90IGF2YWlsYWJsZQotCi1SZW5hbWVDb21wb25lbnRXaXphcmRfZGVmYXVsdFBhZ2VUaXRsZT1SZW5hbWUgd2l6YXJkCi1SZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uPVJlbmFtZSBYTUwgU2NoZW1hIGNvbXBvbmVudAotCi1SZW5hbWVJbnB1dFdpemFyZFBhZ2VfdXBkYXRlX3JlZmVyZW5jZXM9VXBkYXRlIHJlZmVyZW5jZXMKLVhTRENvbXBvbmVudFJlbmFtZUNoYW5nZV9uYW1lPVhNTCBTY2hlbWEgY29tcG9uZW50IHJlbmFtaW5nIGluIHswfTogezF9IHRvIHsyfQotWFNEQ29tcG9uZW50UmVuYW1lQ2hhbmdlX1JlbmFtaW5nPVJlbmFtaW5nLi4uCi1SZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50X2NvbXBvc2l0ZUNoYW5nZU5hbWU9WFNEIGZpbGUgcmVuYW1lIHJlZmVyZW5jZXMgdXBkYXRpbmcgY2hhbmdlcwotUmVuYW1lUmVzb3VyY2VDaGFuZ2VfcmVuYW1lX3Jlc291cmNlX3JlZmVyZW5jZV9jaGFuZ2U9UmVuYW1pbmcgcmVzb3VyY2UgbmFtZSByZWZlcmVuY2VzCi1YU0RSZW5hbWVSZXNvdXJjZUNoYW5nZV9uYW1lPVJlc291cmNlIHJlbmFtZTogezB9IHRvIHsxfQotUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZ19JbnRlcm5hbF9FcnJvcj1JbnRlcm5hbCBlcnJvcgotUmVuYW1lUmVzb3VyY2VSZWZhY3RvcmluZ19hbHJlYWRfZXhpc3RzPVJlc291cmNlIGFscmVhZHkgZXhpc3QKLVJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmdfaW52YWxpZE5hbWU9SW52YWxpZCByZXNvdXJjZSBuYW1lCi1SZW5hbWVSZXNvdXJjZVByb2Nlc3Nvcl9uYW1lPVJlc291cmNlIHJlbmFtaW5nCi1NYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbl90ZXh0PU1ha2UgQW5vbnltb3VzIFR5cGUgR2xvYmFsIAotTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbl90ZXh0PU1ha2UgTG9jYWwgRWxlbWVudCBHbG9iYWwKLVhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzPVhNTCBTY2hlbWEgcmVmYWN0b3JpbmcgY2hhbmdlcwotV1NETENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzPVdTREwgU2NoZW1hIHJlZmFjdG9yaW5nIGNoYW5nZXMKLVJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvcl9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlcz1Db21wb25lbnQgbmFtZSByZWZhY3RvcmluZyBjaGFuZ2VzCi1SZW5hbWVDb21wb25lbnRQcm9jZXNzb3JfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9kZWNsYXRhdGlvbj1VcGRhdGUgY29tcG9uZW50IGRlY2xhcmF0aW9uL2RlZmluaXRpb24KLVJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvcl9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlX3JlZmVyZW5jZT1VcGRhdGUgY29tcG9uZW50IHJlZmVyZW5jZQotWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfeHNkX2NvbXBvbmVudF9yZW5hbWVfcGFydGljaXBhbnQ9WFNEIGNvbXBvbmVudCByZW5hbWUgcGFydGljaXBhbnQKLVdTRExDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudF93c2RsX2NvbXBvbmVudF9yZW5hbWVfcGFydGljaXBhbnQ9V1NETCBjb21wb25lbnQgcmVuYW1lIHBhcnRpY2lwYW50Ci1SZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50X0ZpbGVfUmVuYW1lX3VwZGF0ZV9yZWZlcmVuY2U9RmlsZSByZW5hbWUgcmVmYWN0b3JpbmcgY2hhbmdlcwotCi1SZW5hbWVUYXJnZXROYW1lc3BhY2VfdGV4dD1SZW5hbWUgVGFyZ2V0IE5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvSVhTRFNlYXJjaENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvSVhTRFNlYXJjaENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQ2NWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL0lYU0RTZWFyY2hDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotcHVibGljIGludGVyZmFjZSBJWFNEU2VhcmNoQ29uc3RhbnRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYU0RfQ09OVEVOVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lICAgVFlQRV9NRVRBX05BTUUgPSAgbmV3IFF1YWxpZmllZE5hbWUgKFhNTFNDSEVNQV9OQU1FU1BBQ0UsICJ0eXBlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lICAgQ09NUExFWF9UWVBFX01FVEFfTkFNRSA9ICBuZXcgUXVhbGlmaWVkTmFtZSAoWE1MU0NIRU1BX05BTUVTUEFDRSwgImNvbXBsZXhUeXBlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lICAgU0lNUExFX1RZUEVfTUVUQV9OQU1FID0gIG5ldyBRdWFsaWZpZWROYW1lIChYTUxTQ0hFTUFfTkFNRVNQQUNFLCAic2ltcGxlVHlwZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSAgIEVMRU1FTlRfTUVUQV9OQU1FID0gIG5ldyBRdWFsaWZpZWROYW1lIChYTUxTQ0hFTUFfTkFNRVNQQUNFLCAiZWxlbWVudCIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSAgIEFUVFJJQlVURV9NRVRBX05BTUUgPSAgbmV3IFF1YWxpZmllZE5hbWUgKFhNTFNDSEVNQV9OQU1FU1BBQ0UsICJhdHRyaWJ1dGUiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgICBBVFRSSUJVVEVfR1JPVVBfTUVUQV9OQU1FID0gIG5ldyBRdWFsaWZpZWROYW1lIChYTUxTQ0hFTUFfTkFNRVNQQUNFLCAiYXR0cmlidXRlR3JvdXAiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgICBHUk9VUF9NRVRBX05BTUUgPSAgbmV3IFF1YWxpZmllZE5hbWUgKFhNTFNDSEVNQV9OQU1FU1BBQ0UsICJncm91cCIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwNzdhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9TZWFyY2hNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLlNlYXJjaE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFNlYXJjaE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBncm91cF9yZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kRGVjbGFyYXRpb25BY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJbldvcmtpbmdTZXRBY3Rpb25fbGFiZWw7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTZWFyY2hNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvWFNEU2VhcmNoQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaENvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODliNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvWFNEU2VhcmNoQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5Db21wb25lbnRTZWFyY2hDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoQ29udHJpYnV0b3IgZXh0ZW5kcyBDb21wb25lbnRTZWFyY2hDb250cmlidXRvciAgewotIAotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVSZWZlcmVuY2VzKCkgewotCQlyZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIG5zID0gSVhTRFNlYXJjaENvbnN0YW50cy5YTUxTQ0hFTUFfTkFNRVNQQUNFOwotCi0JCUxpc3QgcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSkpOwotCQlyZWZlcmVuY2VzLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FLCBwYXR0ZXJucyk7Ci0KLQkJcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKSk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSkpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSk7Ci0JCXJlZmVyZW5jZXMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSwgcGF0dGVybnMpOwotCi0JCXBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSkpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSkpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpKTsKLQotCQlyZWZlcmVuY2VzLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRSwgcGF0dGVybnMpOwotCi0JCXBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKSk7Ci0JCXJlZmVyZW5jZXMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuR1JPVVBfTUVUQV9OQU1FLCBwYXR0ZXJucyk7Ci0KLQkJcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpKTsKLQkJcmVmZXJlbmNlcy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfR1JPVVBfTUVUQV9OQU1FLCBwYXR0ZXJucyk7Ci0KLQkJcGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKSk7Ci0JCXJlZmVyZW5jZXMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSwgcGF0dGVybnMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWNsYXJhdGlvbnMoKXsKLQkJCi0JCWRlY2xhcmF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBucyA9IElYU0RTZWFyY2hDb25zdGFudHMuWE1MU0NIRU1BX05BTUVTUEFDRTsKLQotCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotCQlkZWNsYXJhdGlvbnMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JCXBhdHRlcm4gPSBuZXcgWE1MU2VhcmNoUGF0dGVybihucywgWFNEQ29uc3RhbnRzLkNPTVBMRVhUWVBFX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotCQlkZWNsYXJhdGlvbnMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSwgcGF0dGVybik7Ci0KLQkJcGF0dGVybiA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKG5zLCBYU0RDb25zdGFudHMuU0lNUExFVFlQRV9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLQkJZGVjbGFyYXRpb25zLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRSwgcGF0dGVybik7Ci0KLQkJcGF0dGVybiA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKG5zLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotCQlkZWNsYXJhdGlvbnMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSwgcGF0dGVybik7Ci0KLQkJcGF0dGVybiA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKG5zLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0JCWRlY2xhcmF0aW9ucy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfR1JPVVBfTUVUQV9OQU1FLCBwYXR0ZXJuKTsKLQotCQlwYXR0ZXJuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4obnMsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLQkJZGVjbGFyYXRpb25zLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkdST1VQX01FVEFfTkFNRSwgcGF0dGVybik7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3VwcG9ydGVkTmFtZXNwYWNlcygpIHsKLQkJbmFtZXNwYWNlcyA9IG5ldyBTdHJpbmdbXXsgSVhTRFNlYXJjaENvbnN0YW50cy5YTUxTQ0hFTUFfTkFNRVNQQUNFfTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvWFNEU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNTE4MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvWFNEU2VhcmNoUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MU2VhcmNoUGFydGljaXBhbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hQYXJ0aWNpcGFudCBleHRlbmRzIFhNTFNlYXJjaFBhcnRpY2lwYW50IHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnNlYXJjaC5YU0RTZWFyY2hQYXJ0aWNpcGFudCI7Ci0KLQlwdWJsaWMgWFNEU2VhcmNoUGFydGljaXBhbnQoKQotCXsKLQkgIHN1cGVyKCk7Ci0gICAgICBpZCA9IElEOwotCX0JCi0JCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZENvbnRlbnRUeXBlcygpCi0JewotCSAgU3RyaW5nW10gcmVzdWx0ID0geyAib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSIgfTsKLQkgIHJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE1hcCBzZWFyY2hPcHRpb25zKQotCXsKLQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4gKXsKLQkJCVhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4gY29tcG9uZW50UGF0dGVybiA9IChYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXBhdHRlcm47Ci0JCQlTdHJpbmcgbmFtZXNwYWNlID0gY29tcG9uZW50UGF0dGVybi5nZXRNZXRhTmFtZSgpLmdldE5hbWVzcGFjZSgpOwotCQkJaWYoSVhTRFNlYXJjaENvbnN0YW50cy5YTUxTQ0hFTUFfTkFNRVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQlwdWJsaWMgQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IgZ2V0U2VhcmNoQ29udHJpYnV0b3IoKSB7CQkKLQkJcmV0dXJuIG5ldyBYU0RTZWFyY2hDb250cmlidXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZlZmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5BYnN0cmFjdFNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFhTRFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RTZWFyY2hRdWVyeQoteyAgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBMSU1JVF9UT19ERUNMQVJBVElPTlMgPSAxOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBMSU1JVF9UT19SRUZFUkVOQ0VTICAgPSAyOyAgCi0gIAotICBpbnQgZkxpbWl0VG8gPSAwOwotICBJRmlsZSBmQ29udGV4dEZpbGU7Ci0gIFF1YWxpZmllZE5hbWUgZkVsZW1lbnRRTmFtZTsKLSAgUXVhbGlmaWVkTmFtZSBmVHlwZU5hbWU7Ci0gIAotICBwdWJsaWMgWFNEU2VhcmNoUXVlcnkoU3RyaW5nIHBhdHRlcm4sIElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVOYW1lLCBpbnQgbGltaXRUbywgU2VhcmNoU2NvcGUgc2NvcGUsIFN0cmluZyBzY29wZURlc2NyaXB0aW9uKQotICB7Ci0gICAgc3VwZXIocGF0dGVybiwgc2NvcGUsIHNjb3BlRGVzY3JpcHRpb24pOwotICAgIGZMaW1pdFRvID0gbGltaXRUbzsKLSAgICBmQ29udGV4dEZpbGUgPSBmaWxlOwotICAgIGZFbGVtZW50UU5hbWUgPSBlbGVtZW50UU5hbWU7Ci0gICAgZlR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU2VhcmNoUGF0dGVybiBjcmVhdGVTZWFyY2hQYXR0ZXJuKFF1YWxpZmllZE5hbWUgdHlwZU5hbWUpCi0gIHsKLSAgICBpZiAoZkxpbWl0VG8gPT0gTElNSVRfVE9fREVDTEFSQVRJT05TKQotICAgIHsgIAotICAgICAgcmV0dXJuIG5ldyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oZkNvbnRleHRGaWxlLCBmRWxlbWVudFFOYW1lLCBmVHlwZU5hbWUpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKGZMaW1pdFRvID09IExJTUlUX1RPX1JFRkVSRU5DRVMpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKGZDb250ZXh0RmlsZSwgZkVsZW1lbnRRTmFtZSwgZlR5cGVOYW1lKTsKLSAgICB9ICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0Jhc2VHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0Jhc2VHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzY2OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9CYXNlR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vL1RPRE8gKHRydW5nKSBzaG91bGQgYmUgaW4gY29tbW9uLnVpIHRoaXMgb25lID8/Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUdyb3VwQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUsIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSU1lbnVDcmVhdG9yCi17Ci0gICAgcHJvdGVjdGVkIElTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLSAgICBwcml2YXRlIElBY3Rpb24gZkRlbGVnYXRlQWN0aW9uOwotICAgIC8vIHdoZXRoZXIgdG8gcmUtZmlsbCB0aGUgbWVudSAocmVzZXQgb24gc2VsZWN0aW9uIGNoYW5nZSkKLSAgICBwcml2YXRlIGJvb2xlYW4gZkZpbGxNZW51ID0gdHJ1ZTsKLSAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydDsgCi0gICAgCi0KLSAgICBwdWJsaWMgQmFzZUdyb3VwQWN0aW9uRGVsZWdhdGUoKSAKLSAgICB7Ci0KLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0gICAgICAgIHdvcmtiZW5jaFBhcnQgPSB0YXJnZXRQYXJ0OwotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNnZXRNZW51KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0gICAgICovCi0gICAgcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotICAgICAgICAvLyBuZXZlciBjYWxsZWQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51KQotICAgICAqLwotICAgIHB1YmxpYyBNZW51IGdldE1lbnUoTWVudSBwYXJlbnQpIHsKLSAgICAgICAgLy9DcmVhdGUgdGhlIG5ldyBtZW51LiBUaGUgbWVudSB3aWxsIGdldCBmaWxsZWQgd2hlbiBpdCBpcyBhYm91dCB0byBiZSBzaG93bi4gc2VlIGZpbGxNZW51KE1lbnUpLgotICAgICAgICBNZW51IG1lbnUgPSBuZXcgTWVudShwYXJlbnQpOwotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIGxpc3RlbmVyIHRvIHJlcG9wdWxhdGUgdGhlIG1lbnUgZWFjaCB0aW1lCi0gICAgICAgICAqIGl0IGlzIHNob3duIGJlY2F1c2UgTWVudU1hbmFnZXIudXBkYXRlKGJvb2xlYW4sIGJvb2xlYW4pIAotICAgICAgICAgKiBkb2Vzbid0IGRpc3Bvc2UgcHVsbGRvd24gQWN0aW9uQ29udHJpYnV0aW9uIGl0ZW1zIGZvciBlYWNoIHBvcHVwIG1lbnUuCi0gICAgICAgICAqLwotICAgICAgICBtZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZkZpbGxNZW51KSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lbnUgbSA9IChNZW51KWUud2lkZ2V0OwotICAgICAgICAgICAgICAgICAgICBNZW51SXRlbVtdIGl0ZW1zID0gbS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbGxNZW51KG0pOwotICAgICAgICAgICAgICAgICAgICBmRmlsbE1lbnUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gbWVudTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgLy8gTmV2ZXIgY2FsbGVkIGJlY2F1c2Ugd2UgYmVjb21lIGEgbWVudS4KLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgZkRlbGVnYXRlQWN0aW9uID0gYWN0aW9uOwotICAgICAgICB1cGRhdGVXaXRoKHNlbGVjdGlvbik7Ci0gICAgICAgIAotICAgIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotICAgICAgICB3b3JrYmVuY2hQYXJ0ID0gdGFyZ2V0RWRpdG9yOwotICAgICAgICBmRGVsZWdhdGVBY3Rpb24gPSBhY3Rpb247Ci0gICAgICAgIGlmICh0YXJnZXRFZGl0b3IgIT0gbnVsbCAmJiB0YXJnZXRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpICE9IG51bGwgJiYgdGFyZ2V0RWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVwZGF0ZVdpdGgodGFyZ2V0RWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gIAotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVdpdGgoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICAgICAgaWYgKGZEZWxlZ2F0ZUFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIGVuYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vaWYgKCgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiApewotICAgICAgICAgICAgICAgICAgICBlbmFibGUgPSAhc2VsZWN0aW9uLmlzRW1wdHkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBlbmFibGUgYWN0aW9uCi0gICAgICAgICAgICBmRGVsZWdhdGVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBmaWxsIHN1Ym1lbnUKLSAgICAgICAgICAgIGZGaWxsTWVudSA9IHRydWU7Ci0gICAgICAgICAgICBmRGVsZWdhdGVBY3Rpb24uc2V0TWVudUNyZWF0b3IodGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KTsKLSAgICAKLSAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvQ29tcG9zaXRlQWN0aW9uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvQ29tcG9zaXRlQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmOTM2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0NvbXBvc2l0ZUFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIFRPRE8uLi4gb3BlbiBhIGJ1Z3ppbGxhIHRvIGdldCB0aGUgSkRUIGNsYXNzIG1vdmVkIHRvIG5vbiBpbnRlcm5hbCBwbGF0Zm9ybQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0KLSAgICBwcml2YXRlIEFjdGlvbkdyb3VwW10gZkdyb3VwczsKLSAgICAKLSAgICBwdWJsaWMgQ29tcG9zaXRlQWN0aW9uR3JvdXAoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDb21wb3NpdGVBY3Rpb25Hcm91cChBY3Rpb25Hcm91cFtdIGdyb3VwcykgewotICAgICAgICBzZXRHcm91cHMoZ3JvdXBzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRHcm91cHMoQWN0aW9uR3JvdXBbXSBncm91cHMpIHsKLSAgICAgICAgQXNzZXJ0LmlzVHJ1ZShmR3JvdXBzID09IG51bGwpOwotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGdyb3Vwcyk7Ci0gICAgICAgIGZHcm91cHM9IGdyb3VwczsgICAgICAgIAotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIEFjdGlvbkdyb3VwIGdldChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGZHcm91cHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gZkdyb3Vwc1tpbmRleF07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZEdyb3VwKEFjdGlvbkdyb3VwIGdyb3VwKSB7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpIHsKLSAgICAgICAgICAgIGZHcm91cHM9IG5ldyBBY3Rpb25Hcm91cFtdIHsgZ3JvdXAgfTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFjdGlvbkdyb3VwW10gbmV3R3JvdXBzPSBuZXcgQWN0aW9uR3JvdXBbZkdyb3Vwcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZkdyb3VwcywgMCwgbmV3R3JvdXBzLCAwLCBmR3JvdXBzLmxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdHcm91cHNbZkdyb3Vwcy5sZW5ndGhdPSBncm91cDsKLSAgICAgICAgICAgIGZHcm91cHM9IG5ld0dyb3VwczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmR3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmR3JvdXBzW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLSAgICAgICAgc3VwZXIuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmR3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmR3JvdXBzW2ldLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0gICAgICAgIHN1cGVyLmZpbGxDb250ZXh0TWVudShtZW51KTsKLSAgICAgICAgaWYgKGZHcm91cHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IGZHcm91cHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZHcm91cHNbaV0uZmlsbENvbnRleHRNZW51KG1lbnUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChBY3Rpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsKLSAgICAgICAgaWYgKGZHcm91cHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IGZHcm91cHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZHcm91cHNbaV0uc2V0Q29udGV4dChjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbkJhcnMoKSB7Ci0gICAgICAgIHN1cGVyLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICAgICAgaWYgKGZHcm91cHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZm9yIChpbnQgaT0gMDsgaSA8IGZHcm91cHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZHcm91cHNbaV0udXBkYXRlQWN0aW9uQmFycygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9EZWNsYXJhdGlvbnNTZWFyY2hHcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9EZWNsYXJhdGlvbnNTZWFyY2hHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTMwOGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRGVjbGFyYXRpb25zU2VhcmNoR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotLy8gVE9ETy4uIGZpbGwgaW4gdGhlIGNvbnRlbnQKLXB1YmxpYyBjbGFzcyBEZWNsYXJhdGlvbnNTZWFyY2hHcm91cAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1YTE3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLXB1YmxpYyBjbGFzcyBGaW5kQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yOwotCi0gIHByb3RlY3RlZCBGaW5kQWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvcikKLSAgewotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTMzNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLldvcmtzcGFjZVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLklTZWxlY3Rpb25NYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5YU0RTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1wdWJsaWMgY2xhc3MgRmluZFJlZmVyZW5jZXNBY3Rpb24gZXh0ZW5kcyBGaW5kQWN0aW9uCi17Ci0gIHB1YmxpYyBGaW5kUmVmZXJlbmNlc0FjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICBzdXBlcihlZGl0b3IpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWN0aW9uRGVmaW5pdGlvbklkKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBUbyBiZSB1c2VkIGJ5IHN1YmNsYXNzIGluIGl0cyBydW4oKSBSZXR1cm5zIHRoZSBmaWxlIHdoZXJlIHRoZSBzZWxlY3Rpb24gb2YKLSAgICogYSBjb21wb25lbnQgKGZyb20gdGhlIHVzZXIpIG9jY3VycyBpZS4gUmV0dXJucyB0aGUgZmlsZSB0aGF0IHRoZSB1c2VyIGlzCi0gICAqIGN1cnJlbnRseSB3b3JraW5nIG9uLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgSUZpbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgd29ya2luZyBmaWxlLgotICAgKi8KLSAgcHJvdGVjdGVkIElGaWxlIGdldEN1cnJlbnRGaWxlKCkKLSAgewotICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgICB7Ci0gICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotICAgICAgICByZXR1cm4gZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVG8gYmUgdXNlZCBieSBzdWJjbGFzcyBpbiBpdHMgcnVuKCkuLiBEZXRlcm1pbmVzIHRoZSBtZXRhTmFtZSBvZiB0aGUgWFNECi0gICAqIGNvbXBvbmVudCBnaXZlbiB0byB0aGlzIG1ldGhvZC4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wb25lbnQKLSAgICogICAgICAgICAgVGhlIGNvbXBvbmVudCBvZiB3aGljaCB3ZSB3YW50IHRvIGRldGVybWluZSB0aGUgbmFtZQotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcm90ZWN0ZWQgUXVhbGlmaWVkTmFtZSBkZXRlcm1pbmVNZXRhTmFtZShYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBRdWFsaWZpZWROYW1lIG1ldGFOYW1lID0gbnVsbDsKLSAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG1ldGFOYW1lID0gSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FOwotICAgIH0KLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBtZXRhTmFtZSA9IElYU0RTZWFyY2hDb25zdGFudHMuU0lNUExFX1RZUEVfTUVUQV9OQU1FOwotICAgIH0KLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgbWV0YU5hbWUgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FOwotICAgIH0KLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBtZXRhTmFtZSA9IElYU0RTZWFyY2hDb25zdGFudHMuR1JPVVBfTUVUQV9OQU1FOwotICAgIH0KLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgbWV0YU5hbWUgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9HUk9VUF9NRVRBX05BTUU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIG1ldGFOYW1lID0gSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FOwotICAgIH0KLSAgICByZXR1cm4gbWV0YU5hbWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0ROYW1lZENvbXBvbmVudCBnZXRYU0ROYW1lZENvbXBvbmVudCgpCi0gIHsKLSAgICBpZiAoZWRpdG9yICE9IG51bGwpCi0gICAgewotICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgZWRpdG9yLmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgIElTZWxlY3Rpb25NYXBwZXIgbWFwcGVyID0gKElTZWxlY3Rpb25NYXBwZXIpIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25NYXBwZXIuY2xhc3MpOwotICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChtYXBwZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvbiA9IG1hcHBlci5tYXBTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgT2JqZWN0IG8gPSBzLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoWFNETmFtZWRDb21wb25lbnQpIG87Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFRoZSBleHBlY3RlZCBjb21wb25lbnQgd2UgZ2V0IGZyb20gdGhlIGVkaXRvciBkb2VzIG5vdCBtZWV0Ci0gICAgLy8gb3VyIGV4cGVjdGF0aW9uCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgcGF0dGVybiA9ICIiOwotICAgIFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldFhTRE5hbWVkQ29tcG9uZW50KCk7Ci0gICAgSUZpbGUgZmlsZSA9IGdldEN1cnJlbnRGaWxlKCk7Ci0gICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBRdWFsaWZpZWROYW1lIG1ldGFOYW1lID0gZGV0ZXJtaW5lTWV0YU5hbWUoY29tcG9uZW50KTsKLSAgICAgIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoY29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpLCBjb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIFNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IFdvcmtzcGFjZVNlYXJjaFNjb3BlKCk7Ci0gICAgICBTdHJpbmcgc2NvcGVEZXNjcmlwdGlvbiA9ICJXb3Jrc3BhY2UiOwotICAgICAgWFNEU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkgPSBuZXcgWFNEU2VhcmNoUXVlcnkocGF0dGVybiwgZmlsZSwgZWxlbWVudFFOYW1lLCBtZXRhTmFtZSwgWFNEU2VhcmNoUXVlcnkuTElNSVRfVE9fUkVGRVJFTkNFUywgc2NvcGUsIHNjb3BlRGVzY3JpcHRpb24pOwotICAgICAgTmV3U2VhcmNoVUkuYWN0aXZhdGVTZWFyY2hSZXN1bHRWaWV3KCk7Ci0gICAgICBOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NGYyNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5Qcm9qZWN0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guWFNEU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotcHVibGljIGNsYXNzIEZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uIGV4dGVuZHMgRmluZFJlZmVyZW5jZXNBY3Rpb24KLXsKLSAgcHVibGljIEZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvcikKLSAgewotICAgIHN1cGVyKGVkaXRvcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgU3RyaW5nIHBhdHRlcm4gPSAiIjsKLSAgICBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQgPSBnZXRYU0ROYW1lZENvbXBvbmVudCgpOwotICAgIElGaWxlIGZpbGUgPSBnZXRDdXJyZW50RmlsZSgpOwotICAgIGlmIChmaWxlICE9IG51bGwgJiYgY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSA9IGRldGVybWluZU1ldGFOYW1lKGNvbXBvbmVudCk7Ci0gICAgICBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKGNvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICBJUGF0aCBmdWxsUGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKTsKLSAgICAgIFByb2plY3RTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBQcm9qZWN0U2VhcmNoU2NvcGUoZnVsbFBhdGgpOwotICAgICAgU3RyaW5nIHNjb3BlRGVzY3JpcHRpb24gPSAiUHJvamVjdCI7Ci0gICAgICBYU0RTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSA9IG5ldyBYU0RTZWFyY2hRdWVyeShwYXR0ZXJuLCBmaWxlLCBlbGVtZW50UU5hbWUsIG1ldGFOYW1lLCBYU0RTZWFyY2hRdWVyeS5MSU1JVF9UT19SRUZFUkVOQ0VTLCBzY29wZSwgc2NvcGVEZXNjcmlwdGlvbik7Ci0gICAgICBOZXdTZWFyY2hVSS5hY3RpdmF0ZVNlYXJjaFJlc3VsdFZpZXcoKTsKLSAgICAgIE5ld1NlYXJjaFVJLnJ1blF1ZXJ5SW5CYWNrZ3JvdW5kKHNlYXJjaFF1ZXJ5KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3MTBlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5Xb3JraW5nU2V0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLlhTRFNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uIGV4dGVuZHMgRmluZFJlZmVyZW5jZXNBY3Rpb257Ci0KLQlwdWJsaWMgRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGlvbkRlZmluaXRpb25JZChTdHJpbmcgc3RyaW5nKQotCXsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKCl7Ci0JCUlXb3JraW5nU2V0W10gd29ya2luZ1NldHMgPSBxdWVyeVdvcmtpbmdTZXRzKCk7Ci0JCWlmICggd29ya2luZ1NldHMgPT0gbnVsbCB8fCB3b3JraW5nU2V0cy5sZW5ndGggPT0gMCkKLQkJCS8vIFRoZSB1c2VyIGNob29zZXMgbm90aGluZywgbm8gcG9pbnQgdG8gY29udGludWUuCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBwYXR0ZXJuID0gIiI7Ci0KLQkJWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0WFNETmFtZWRDb21wb25lbnQoKTsKLQkJSUZpbGUgZmlsZSA9IGdldEN1cnJlbnRGaWxlKCk7Ci0JCWlmICggZmlsZSAhPSBudWxsICYmIGNvbXBvbmVudCAhPSBudWxsKXsKLQkJCVF1YWxpZmllZE5hbWUgbWV0YU5hbWUgPSBkZXRlcm1pbmVNZXRhTmFtZShjb21wb25lbnQpOwotCi0JCQlRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSA9IAotCQkJCW5ldyBRdWFsaWZpZWROYW1lKGNvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgY29tcG9uZW50LmdldE5hbWUoKSk7Ci0KLQkJCS8vIENyZWF0ZSBhIHNjb3BlIGZyb20gdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0cwotCQkJV29ya2luZ1NldFNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IFdvcmtpbmdTZXRTZWFyY2hTY29wZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JraW5nU2V0cy5sZW5ndGg7IGkrKyl7Ci0JCQkJSUFkYXB0YWJsZVtdIGVsZW1lbnRzID0gd29ya2luZ1NldHNbaV0uZ2V0RWxlbWVudHMoKTsKLQkJCQlzY29wZS5hZGRBV29ya2luZ1NldFRvU2NvcGUoZWxlbWVudHMpOwotCQkJfQotCi0JCQlTdHJpbmcgc2NvcGVEZXNjcmlwdGlvbiA9ICJXb3JraW5nIFNldCI7ICAgIAotCQkJWFNEU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkgPSAKLQkJCQluZXcgWFNEU2VhcmNoUXVlcnkocGF0dGVybiwgZmlsZSwgZWxlbWVudFFOYW1lLCBtZXRhTmFtZSwgWFNEU2VhcmNoUXVlcnkuTElNSVRfVE9fUkVGRVJFTkNFUywgc2NvcGUsIHNjb3BlRGVzY3JpcHRpb24pOyAgICAKLQkJCU5ld1NlYXJjaFVJLmFjdGl2YXRlU2VhcmNoUmVzdWx0VmlldygpOwotCQkJTmV3U2VhcmNoVUkucnVuUXVlcnlJbkJhY2tncm91bmQoc2VhcmNoUXVlcnkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgYSBkaWFsb2cgYXNraW5nIHRoZSB1c2VyIHRvIGNob29zZSB0aGUgd29ya2luZyBTZXRzIGhlIHdhbnRzCi0JICogdG8gZG8gdGhlIHNlYXJjaCBvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3JraW5nU2V0W10gcXVlcnlXb3JraW5nU2V0cygpewotCQlTaGVsbCBzaGVsbD0gWFNERWRpdG9yUGx1Z2luLmdldFNoZWxsKCk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkuY3JlYXRlV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgdHJ1ZSk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cz0gZGlhbG9nLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHdvcmtpbmdTZXRzLmxlbmd0aCA+IDApCi0JCQkJcmV0dXJuIHdvcmtpbmdTZXRzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvSW1wbGVtZW50b3JzU2VhcmNoR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvSW1wbGVtZW50b3JzU2VhcmNoR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmYzhmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ltcGxlbWVudG9yc1NlYXJjaEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLS8vIFRPRE8uLi4gZmlsbCBpbiB0aGUgY29udGVudAotcHVibGljIGNsYXNzIEltcGxlbWVudG9yc1NlYXJjaEdyb3VwCi17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL09jY3VycmVuY2VzU2VhcmNoR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvT2NjdXJyZW5jZXNTZWFyY2hHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjNlMjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvT2NjdXJyZW5jZXNTZWFyY2hHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi0vLyBUT0RPLi4uIGZpbGwgaW4gdGhlIGNvbnRlbnQKLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlc1NlYXJjaEdyb3VwCi17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1JlZmVyZW5jZXNTZWFyY2hHcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9SZWZlcmVuY2VzU2VhcmNoR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ODRiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1JlZmVyZW5jZXNTZWFyY2hHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5TZWFyY2hNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZXNTZWFyY2hHcm91cCBleHRlbmRzIFNlYXJjaEdyb3VwICB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVV9URVhUPSBTZWFyY2hNZXNzYWdlcy5ncm91cF9yZWZlcmVuY2VzOyAKLQotICAgIHByb3RlY3RlZCBJRWRpdG9yUGFydCBmRWRpdG9yOwotICAgIHByaXZhdGUgSVdvcmtiZW5jaFNpdGUgZlNpdGU7Ci0gICAgcHJpdmF0ZSBJQWN0aW9uQmFycyBmQWN0aW9uQmFyczsKLSAgICAKLS8vICAgIHByaXZhdGUgU3RyaW5nIGZHcm91cElkOwotICAgIAotICAgIHByb3RlY3RlZCBGaW5kQWN0aW9uIGZGaW5kUmVmZXJlbmNlc0FjdGlvbjsKLSAgICBwcm90ZWN0ZWQgRmluZEFjdGlvbiBmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb247Ci0gICAgcHJvdGVjdGVkIEZpbmRBY3Rpb24gZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uOwotCi0KLSAgICAvKioKLSAgICAgKiBOb3RlOiBUaGlzIGNvbnN0cnVjdG9yIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICAgKiBAcGFyYW0gZWRpdG9yCi0gICAgICovCi0gICAgcHVibGljIFJlZmVyZW5jZXNTZWFyY2hHcm91cChJRWRpdG9yUGFydCBlZGl0b3IpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChlZGl0b3IpOwotICAgICAgICBmRWRpdG9yPSBlZGl0b3I7Ci0gICAgICAgIGZTaXRlPSBmRWRpdG9yLmdldFNpdGUoKTsKLSAgICAgICAgCi0gICAgICAgIGluaXRpYWxpemUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLS8vICAgICAgZkdyb3VwSWQ9IElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0ZJTkQ7Ci0KLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzQWN0aW9uPSBuZXcgRmluZFJlZmVyZW5jZXNBY3Rpb24oZkVkaXRvcik7Ci0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0FjdGlvbi5zZXRUZXh0KFNlYXJjaE1lc3NhZ2VzLlNlYXJjaF9GaW5kRGVjbGFyYXRpb25BY3Rpb25fbGFiZWwpOwotICAgICAgICBmRmluZFJlZmVyZW5jZXNBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKCJTRUFSQ0hfUkVGRVJFTkNFU19JTl9XT1JLU1BBQ0UiKTsKLSAgICAgICAgLy9mRWRpdG9yLnNldEFjdGlvbigiU2VhcmNoUmVmZXJlbmNlc0luV29ya3NwYWNlIiwgZkZpbmRSZWZlcmVuY2VzQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbj0gbmV3IEZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uKGZFZGl0b3IpOwotICAgICAgICBmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24uc2V0VGV4dChTZWFyY2hNZXNzYWdlcy5TZWFyY2hfRmluZERlY2xhcmF0aW9uc0luUHJvamVjdEFjdGlvbl9sYWJlbCk7ICAgICAgICAKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZCgiU0VBUkNIX1JFRkVSRU5DRVNfSU5fUFJPSkVDVCIpOwotICAgICAgICAvL2ZFZGl0b3Iuc2V0QWN0aW9uKCJTZWFyY2hSZWZlcmVuY2VzSW5Qcm9qZWN0IiwgZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgICAgICBmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb249IG5ldyBGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbihmRWRpdG9yKTsKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLnNldFRleHQoU2VhcmNoTWVzc2FnZXMuU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJbldvcmtpbmdTZXRBY3Rpb25fbGFiZWwpOyAgICAgICAgIAotICAgICAgICBmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKCIuU0VBUkNIX1JFRkVSRU5DRVNfSU5fV09SS0lOR19TRVQiKTsKLSAgICAgICAgLy9mRWRpdG9yLnNldEFjdGlvbigiU2VhcmNoUmVmZXJlbmNlc0luV29ya2luZ1NldCIsIGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbik7IC8vJE5PTi1OTFMtMSQgICAgCQotICAgIH0KLQotICAgIC8qCi0gICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQWN0aW9uKFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBhY3Rpb24udXBkYXRlKHNlbGVjdGlvbik7Ci0gICAgICAgIHByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihhY3Rpb24pOwotICAgIH0qLwotCi0gICAgLyoqCi0gICAgICogTm90ZTogdGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtZW51IGxhYmVsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gTUVOVV9URVhUOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmaWxsQWN0aW9ucyhMaXN0IGxpc3QpCi0gICAgewotICAgICAgbGlzdC5hZGQoZkZpbmRSZWZlcmVuY2VzQWN0aW9uKTsKLSAgICAgIC8vbGlzdC5hZGQoZkZpbmRSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb24pOwotICAgICAgbGlzdC5hZGQoZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uKTsKLSAgICAgIGxpc3QuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICBsaXN0LmFkZChmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24pOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIGluIEFjdGlvbkdyb3VwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGFjdGlvbkJhcnMpOwotICAgICAgICBzdXBlci5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLSAgICAgICAgZkFjdGlvbkJhcnM9IGFjdGlvbkJhcnM7Ci0gICAgICAgIHVwZGF0ZUdsb2JhbEFjdGlvbkhhbmRsZXJzKCk7Ci0gICAgfQotCi0gICAgCi0vLyAgICBwcml2YXRlIHZvaWQgYWRkQWN0aW9uKElBY3Rpb24gYWN0aW9uLCBJTWVudU1hbmFnZXIgbWFuYWdlcikgewotLy8gICAgICAgIGlmIChhY3Rpb24uaXNFbmFibGVkKCkpIHsKLS8vICAgICAgICAgICAgbWFuYWdlci5hZGQoYWN0aW9uKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0KLSAgICAvKgotICAgIHByaXZhdGUgdm9pZCBhZGRXb3JraW5nU2V0QWN0aW9uKElXb3JraW5nU2V0W10gd29ya2luZ1NldHMsIElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIEZpbmRBY3Rpb24gYWN0aW9uOwotICAgICAgICBpZiAoZkVkaXRvciAhPSBudWxsKQotICAgICAgICAgICAgYWN0aW9uPSBuZXcgV29ya2luZ1NldEZpbmRBY3Rpb24oZkVkaXRvciwgbmV3IEZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKGZFZGl0b3IsIHdvcmtpbmdTZXRzKSwgU2VhcmNoVXRpbC50b1N0cmluZyh3b3JraW5nU2V0cykpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhY3Rpb249IG5ldyBXb3JraW5nU2V0RmluZEFjdGlvbihmU2l0ZSwgbmV3IEZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKGZTaXRlLCB3b3JraW5nU2V0cyksIFNlYXJjaFV0aWwudG9TdHJpbmcod29ya2luZ1NldHMpKTsKLSAgICAgICAgYWN0aW9uLnVwZGF0ZShnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBhZGRBY3Rpb24oYWN0aW9uLCBtYW5hZ2VyKTsKLSAgICB9Ci0gICAgKi8KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIEFjdGlvbkdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgLyoKLSAgICAgICAgTWVudU1hbmFnZXIgamF2YVNlYXJjaE1NPSBuZXcgTWVudU1hbmFnZXIoZ2V0TmFtZSgpLCBJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0VBUkNIKTsKLSAgICAgICAgYWRkQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0FjdGlvbiwgamF2YVNlYXJjaE1NKTsKLSAgICAgICAgYWRkQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbiwgamF2YVNlYXJjaE1NKTsKLSAgICAgICAgYWRkQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0luSGllcmFyY2h5QWN0aW9uLCBqYXZhU2VhcmNoTU0pOwotICAgICAgICAKLSAgICAgICAgamF2YVNlYXJjaE1NLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICAKLSAgICAgICAgSXRlcmF0b3IgaXRlcj0gU2VhcmNoVXRpbC5nZXRMUlVXb3JraW5nU2V0cygpLnNvcnRlZEl0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgYWRkV29ya2luZ1NldEFjdGlvbigoSVdvcmtpbmdTZXRbXSkgaXRlci5uZXh0KCksIGphdmFTZWFyY2hNTSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbiwgamF2YVNlYXJjaE1NKTsKLQotICAgICAgICBpZiAoIWphdmFTZWFyY2hNTS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBtYW5hZ2VyLmFwcGVuZFRvR3JvdXAoZkdyb3VwSWQsIGphdmFTZWFyY2hNTSk7Ci0gICAgICAgICovICAgIAotICAgIH0KLSAgICAKLSAgICAvKiAKLSAgICAgKiBPdmVycmlkZXMgbWV0aG9kIGRlY2xhcmVkIGluIEFjdGlvbkdyb3VwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyPSBmU2l0ZS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZGlzcG9zZUFjdGlvbihmRmluZFJlZmVyZW5jZXNBY3Rpb24sIHByb3ZpZGVyKTsKLSAgICAgICAgICAgIGRpc3Bvc2VBY3Rpb24oZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLCBwcm92aWRlcik7Ci0gICAgICAgICAgLy8gIGRpc3Bvc2VBY3Rpb24oZkZpbmRSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb24sIHByb3ZpZGVyKTsKLSAgICAgICAgICAgIGRpc3Bvc2VBY3Rpb24oZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLCBwcm92aWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzQWN0aW9uPSBudWxsOwotICAgICAgICBmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb249IG51bGw7Ci0gICAgICAgIC8vZkZpbmRSZWZlcmVuY2VzSW5IaWVyYXJjaHlBY3Rpb249IG51bGw7Ci0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbj0gbnVsbDsKLSAgICAgICAgdXBkYXRlR2xvYmFsQWN0aW9uSGFuZGxlcnMoKTsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVHbG9iYWxBY3Rpb25IYW5kbGVycygpIHsKLSAgICAgICAgaWYgKGZBY3Rpb25CYXJzICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgZkFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihKZHRBY3Rpb25Db25zdGFudHMuRklORF9SRUZFUkVOQ0VTX0lOX1dPUktTUEFDRSwgZkZpbmRSZWZlcmVuY2VzQWN0aW9uKTsKLS8vICAgICAgICAgICAgZkFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihKZHRBY3Rpb25Db25zdGFudHMuRklORF9SRUZFUkVOQ0VTX0lOX1BST0pFQ1QsIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbik7Ci0vLyAgICAgICAgICAgIGZBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSmR0QWN0aW9uQ29uc3RhbnRzLkZJTkRfUkVGRVJFTkNFU19JTl9ISUVSQVJDSFksIGZGaW5kUmVmZXJlbmNlc0luSGllcmFyY2h5QWN0aW9uKTsKLS8vICAgICAgICAgICAgZkFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihKZHRBY3Rpb25Db25zdGFudHMuRklORF9SRUZFUkVOQ0VTX0lOX1dPUktJTkdfU0VULCBmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3Bvc2VBY3Rpb24oSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBhY3Rpb24sIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICBwcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYWN0aW9uKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9TZWFyY2hHcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9TZWFyY2hHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODA3MWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvU2VhcmNoR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZWFyY2hHcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwCi17Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbGxBY3Rpb25zKExpc3QgbGlzdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaEFjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaEFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjg0NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLQotcHVibGljIGNsYXNzIFhTRFNlYXJjaEFjdGlvbkdyb3VwIGV4dGVuZHMgQWN0aW9uR3JvdXAKLXsKLS8vICBwcml2YXRlIFJlZmVyZW5jZXNTZWFyY2hHcm91cCBmUmVmZXJlbmNlc0dyb3VwOwotLy8gIHByaXZhdGUgRGVjbGFyYXRpb25zU2VhcmNoR3JvdXAgZkRlY2xhcmF0aW9uc0dyb3VwOwotLy8gIHByaXZhdGUgSW1wbGVtZW50b3JzU2VhcmNoR3JvdXAgZkltcGxlbWVudG9yc0dyb3VwOwotLy8gIHByaXZhdGUgT2NjdXJyZW5jZXNTZWFyY2hHcm91cCBmT2NjdXJyZW5jZXNHcm91cDsKLS8vICBwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLSAgcHVibGljIFhTRFNlYXJjaEFjdGlvbkdyb3VwKElFZGl0b3JQYXJ0IGVkaXRvcikKLSAgewotICAgIEFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLS8vICAgIGZFZGl0b3IgPSBlZGl0b3I7Ci0vLyAgICBmUmVmZXJlbmNlc0dyb3VwID0gbmV3IFJlZmVyZW5jZXNTZWFyY2hHcm91cChlZGl0b3IpOwotLy8gICAgZkRlY2xhcmF0aW9uc0dyb3VwID0gbmV3IERlY2xhcmF0aW9uc1NlYXJjaEdyb3VwKCk7Ci0vLyAgICBmSW1wbGVtZW50b3JzR3JvdXAgPSBuZXcgSW1wbGVtZW50b3JzU2VhcmNoR3JvdXAoKTsKLS8vICAgIGZPY2N1cnJlbmNlc0dyb3VwID0gbmV3IE9jY3VycmVuY2VzU2VhcmNoR3JvdXAoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoRGVjbGFyYXRpb25zR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hEZWNsYXJhdGlvbnNHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYzU1YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hEZWNsYXJhdGlvbnNHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotCi0vL29yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnMuWFNEU2VhcmNoR3JvdXBBY3Rpb25EZWxlZ2F0ZQotcHVibGljIGNsYXNzIFhTRFNlYXJjaERlY2xhcmF0aW9uc0dyb3VwQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBCYXNlR3JvdXBBY3Rpb25EZWxlZ2F0ZQotewotICAgIHByb3RlY3RlZCB2b2lkIGZpbGxNZW51KE1lbnUgbWVudSkgewotCi0gICAgfSAgICAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoR3JvdXBTdWJNZW51LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaEdyb3VwU3ViTWVudS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWMzNTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoR3JvdXBTdWJNZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29tcG91bmRDb250cmlidXRpb25JdGVtOwotCi0vLyBUT0RPIHNob3VsZCBiZSBpbiBjb21tb24udWkKLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hHcm91cFN1Yk1lbnUgZXh0ZW5kcyBDb21wb3VuZENvbnRyaWJ1dGlvbkl0ZW0KLXsKLSAgU2VhcmNoR3JvdXAgc2VhcmNoQWN0aW9uR3JvdXA7Ci0KLSAgcHVibGljIFhTRFNlYXJjaEdyb3VwU3ViTWVudShTZWFyY2hHcm91cCByZWZhY3Rvck1lbnVHcm91cCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2VhcmNoQWN0aW9uR3JvdXAgPSByZWZhY3Rvck1lbnVHcm91cDsKLSAgfQotCi0gIHB1YmxpYyBYU0RTZWFyY2hHcm91cFN1Yk1lbnUoU3RyaW5nIGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtW10gZ2V0Q29udHJpYnV0aW9uSXRlbXMoKQotICB7Ci0gICAgQXJyYXlMaXN0IGFjdGlvbnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEFycmF5TGlzdCBjb250cmliTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBzZWFyY2hBY3Rpb25Hcm91cC5maWxsQWN0aW9ucyhhY3Rpb25zTGlzdCk7Ci0gICAgaWYgKGFjdGlvbnNMaXN0ICE9IG51bGwgJiYgIWFjdGlvbnNMaXN0LmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpb25zTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSUFjdGlvbikKLSAgICAgICAgeyAgCi0gICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSAoSUFjdGlvbilvOwotICAgICAgICAgIGNvbnRyaWJMaXN0LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgU2VwYXJhdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgU2VwYXJhdG9yIHNlcGFyYXRvciA9IChTZXBhcmF0b3IpbzsKLSAgICAgICAgICBjb250cmliTGlzdC5hZGQoc2VwYXJhdG9yKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBBY3Rpb24gZHVtbXlBY3Rpb24gPSBuZXcgQWN0aW9uKCJYU0RTZWFjaEFjdGlvbkdyb3VwX25vX3JlZmFjdG9yaW5nX2F2YWlsYWJsZSIpIC8vVE9ETyB3cm9uZyBzdHJpbmcgaGVyZSA/PwotICAgICAgewotICAgICAgICAvLyBkdW1teSBpbm5lciBjbGFzczsgbm8gbWV0aG9kcwotICAgICAgfTsKLSAgICAgIGR1bW15QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgY29udHJpYkxpc3QuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGR1bW15QWN0aW9uKSk7Ci0gICAgfQotICAgIHJldHVybiAoSUNvbnRyaWJ1dGlvbkl0ZW1bXSkgY29udHJpYkxpc3QudG9BcnJheShuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bY29udHJpYkxpc3Quc2l6ZSgpXSk7ICAgICAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hSZWZlcmVuY2VzR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hSZWZlcmVuY2VzR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk0N2JjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoUmVmZXJlbmNlc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotCi0vL29yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnMuWFNEU2VhcmNoR3JvdXBBY3Rpb25EZWxlZ2F0ZQotcHVibGljIGNsYXNzIFhTRFNlYXJjaFJlZmVyZW5jZXNHcm91cEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQmFzZUdyb3VwQWN0aW9uRGVsZWdhdGUKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudShNZW51IG1lbnUpIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAoZlNlbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdvcmtiZW5jaFBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotCQkgIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gd29ya2JlbmNoUGFydC5nZXRTaXRlKCk7Ci0JCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJICByZXR1cm47Ci0JCi0JCSAgSUVkaXRvclBhcnQgZWRpdG9yID0gc2l0ZS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgaWYgKCBlZGl0b3IgIT0gbnVsbCApewotICAgICAgICAgICAgUmVmZXJlbmNlc1NlYXJjaEdyb3VwIHJlZmVyZW5jZXNHcm91cCA9IG5ldyBSZWZlcmVuY2VzU2VhcmNoR3JvdXAoZWRpdG9yKTsKLSAgICAgICAgICAgIFhTRFNlYXJjaEdyb3VwU3ViTWVudSBzdWJNZW51ID0gbmV3IFhTRFNlYXJjaEdyb3VwU3ViTWVudShyZWZlcmVuY2VzR3JvdXApOwotICAgICAgICAgICAgc3ViTWVudS5maWxsKG1lbnUsIC0xKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0gIAotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmNsYXNzcGF0aCBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYjMzNTMuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiIGtpbmQ9ImNvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY3ZzaWdub3JlIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZjOWNiMC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotc3NlanVuaXQuamFyCi10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnByb2plY3QgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmNTEwOS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwYmFhZi4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0czsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC43LjAKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLm1pbm9ydG9vbHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IlszLjguMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnRlc3RzLmVuY29kaW5nO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVzdHMucGVyZm9ybWFuY2U7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC50ZXN0cy5lbmNvZGluZztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZXN0cy5wZXJmb3JtYW5jZTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlc3RzLnBlcmZvcm1hbmNlO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnRlc3RzLmVuY29kaW5nO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkudGVzdHMucGVyZm9ybWFuY2U7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC54c2QudmFsaWRhdGlvbi50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnRlc3RzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXN0cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnRlc3RzLmVuY29kaW5nO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZXN0cy5wZXJmb3JtYW5jZTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUudGVzdHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL1NTRSBNYXN0ZXIgTGlzdCBUZXN0IFN1aXRlLmxhdW5jaCBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL1NTRSBNYXN0ZXIgTGlzdCBUZXN0IFN1aXRlLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1MzVjMC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9TU0UgTWFzdGVyIExpc3QgVGVzdCBTdWl0ZS5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkp1bml0TGF1bmNoQ29uZmlnIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3cyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3c2xvZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9wZGUtanVuaXQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImxvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8uLi9qdW5pdC13b3Jrc3BhY2UiLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJMaXN0VGVzdFN1aXRlLmphdmEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iMSIvPgotPC9saXN0QXR0cmlidXRlPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUTkFNRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUX0tJTkQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQubG9hZGVyLmp1bml0MyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLk1hc3Rlckxpc3RUZXN0U3VpdGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLW9zICR7dGFyZ2V0Lm9zfSAtd3MgJHt0YXJnZXQud3N9IC1hcmNoICR7dGFyZ2V0LmFyY2h9IC1ubCAke3RhcmdldC5ubH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1fQVJHVU1FTlRTIiB2YWx1ZT0iLVhteDYwME0gLVhYOk1heFBlcm1TaXplPTE5Mk0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5zZGsuaWRlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InNob3dfc2VsZWN0ZWRfb25seSIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZVByb2R1Y3QiIHZhbHVlPSJ0cnVlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlMTQ1NC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvaWNvbnMvc291cmNlRWRpdG9yLmdpZiBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL2ljb25zL3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvaWNvbnMvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDM3MGIuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1YTUxfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9WE1MIFNvdXJjZSBQYWdlIEVkaXRvcgotSmF2YVNjcmlwdF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1KYXZhU2NyaXB0IFNvdXJjZSBQYWdlIEVkaXRvcgotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFVuaXQgVGVzdHMKLWFkZGl0aW9uYWxUZXN0cz1BZGRpdGlvbmFsIFRlc3RDYXNlcyBhbmQgVGVzdFN1aXRlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGQ0OTE3Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICAgICAgICAgICAgPGVkaXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iJVhNTF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIGljb249Imljb25zL3NvdXJjZUVkaXRvci5naWYiCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3JYTUwiCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotICAgICAgICAgICAgICAgIDwvZWRpdG9yPgotICAgICAgICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImFkZGl0aW9uYWxUZXN0cyIgbmFtZT0iJWFkZGl0aW9uYWxUZXN0cyIgc2NoZW1hPSJzY2hlbWEvYWRkaXRpb25hbFRlc3RzLmV4c2QiLz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zY2hlbWEvYWRkaXRpb25hbFRlc3RzLmV4c2QgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zY2hlbWEvYWRkaXRpb25hbFRlc3RzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTU4OTMuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc2NoZW1hL2FkZGl0aW9uYWxUZXN0cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cyIgaWQ9ImFkZGl0aW9uYWxUZXN0cyIgbmFtZT0iJWFkZGl0aW9uYWxUZXN0cyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBhZGQgZXh0cmEgdGVzdCBjYXNlcyBhbmQgc3VpdGVzIHRvIHRoZSBhbHJlYWR5IHJ1bm5pbmcgbGlzdCB3aXRob3V0IGRlY2xhcmluZyBhIHJ1bnRpbWUgZGVwZW5kZW5jeSBpbiB0aGlzIHBsdWctaW4uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0ZXN0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN1aXRlIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0ZXN0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBZGRzIGFuIGluZGl2aWR1YWwgVGVzdCBjYXNlIHRvIHJ1bi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIFRlc3QgY2xhc3MgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Imp1bml0LmZyYW1ld29yay5UZXN0OiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdWl0ZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQWRkcyBhIFRlc3RTdWl0ZSB0byBydW4uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBUZXN0U3VpdGUgY2xhc3MgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Imp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU6Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyTGlzdFRlc3RTdWl0ZS5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL01hc3Rlckxpc3RUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3NWEwMi4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyTGlzdFRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLSAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGVzdHMuSlNQQ29yZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnRlc3RzLmVuY29kaW5nLkpTUEVuY29kaW5nVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMuSlNQVUlUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRlc3RzLkNTU0NvcmVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy50ZXN0cy5lbmNvZGluZy5DU1NFbmNvZGluZ1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnRlc3RzLkNTU1VJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXN0cy5EVERDb3JlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkudGVzdHMuRFREVUlUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXN0cy5IVE1MQ29yZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC50ZXN0cy5lbmNvZGluZy5IVE1MRW5jb2RpbmdUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVzdHMuSFRNTFVJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXN0cy5TU0VNb2RlbFRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlc3RzLlNTRVVJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXN0cy5TU0VNb2RlbFhNTFRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnRlc3RzLmVuY29kaW5nLkVuY29kaW5nVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkudGVzdHMuWE1MVUlUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLnRlc3RzLmludGVybmFsLkFsbFhNTFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS50ZXN0cy5pbnRlcm5hbC5BbGxYU0RDb3JlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC52YWxpZGF0aW9uLnRlc3RzLmludGVybmFsLkFsbFhTRFRlc3RzOwotCi1wdWJsaWMgY2xhc3MgTWFzdGVyTGlzdFRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgTWFzdGVyTGlzdFRlc3RTdWl0ZSgpIHsKLQkJc3VwZXIoIkFsbCBUZXN0cyIpOwotCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgid3RwLmF1dG90ZXN0Lm5vbmludGVyYWN0aXZlIiwgInRydWUiKTsKLQotCQlhZGRUZXN0KFNTRU1vZGVsVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFNTRU1vZGVsWE1MVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KENTU0NvcmVUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSFRNTENvcmVUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSlNQQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChEVERDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotCi0JCWFkZFRlc3QoQWxsWE1MVGVzdHMuc3VpdGUoKSk7Ci0KLQkJYWRkVGVzdChFbmNvZGluZ1Rlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChDU1NFbmNvZGluZ1Rlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChIVE1MRW5jb2RpbmdUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSlNQRW5jb2RpbmdUZXN0U3VpdGUuc3VpdGUoKSk7Ci0KLQkJYWRkVGVzdChDU1NVSVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChIVE1MVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoU1NFVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoWE1MVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoRFREVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSlNQVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0KLQkJYWRkVGVzdChBbGxYU0RUZXN0cy5zdWl0ZSgpKTsKLQkJYWRkVGVzdChBbGxYU0RDb3JlVGVzdHMuc3VpdGUoKSk7Ci0KLQkJLy8gYWRkVGVzdChSZWdyZXNzaW9uQnVja2V0LnN1aXRlKCkpOwotCQkvLyBhZGRUZXN0KEFsbFRlc3RDYXNlcy5zdWl0ZSgpKTsKLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5hZGRpdGlvbmFsVGVzdHMiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmdldE5hbWUoKS5lcXVhbHMoInN1aXRlIikpIHsKLQkJCQlUZXN0U3VpdGUgc3VpdGU7Ci0JCQkJdHJ5IHsKLQkJCQkJc3VpdGUgPSAoVGVzdFN1aXRlKSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoc3VpdGUuZ2V0Q2xhc3MoKSkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzIikpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChlbGVtZW50c1tpXS5nZXROYW1lKCkuZXF1YWxzKCJ0ZXN0IikpIHsKLQkJCQlUZXN0IHRlc3Q7Ci0JCQkJdHJ5IHsKLQkJCQkJdGVzdCA9IChUZXN0KSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUodGVzdC5nZXRDbGFzcygpKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMiKSkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGwoKSB7Ci0JCS8vIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGV4aXN0LCBidXQgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcKLQkJLy8gb3RoZXIgdGhhbiB0byBzaWduYWwgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JCS8vIFRoZSByZXN0IGl0IGF1dG9tYXRpYyBmcm9tIHRoZSB0ZXN0cyBhZGRlZCBpbiBjb25zdHJ1Y3Rvci4KLQl9Ci19CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyUGVyZm9ybWFuY2VUZXN0U3VpdGUuamF2YSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDkxMDE0Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMucGVyZm9ybWFuY2UuSlNQVUlQZXJmb3JtYW5jZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVzdHMucGVyZm9ybWFuY2UuQ1NTVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZXN0cy5wZXJmb3JtYW5jZS5IVE1MVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlNTRVVJUGVyZm9ybWFuY2VUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS50ZXN0cy5wZXJmb3JtYW5jZS5YTUxVSVBlcmZvcm1hbmNlVGVzdFN1aXRlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXB1YmxpYyBjbGFzcyBNYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgTWFzdGVyUGVyZm9ybWFuY2VUZXN0U3VpdGUoKSB7Ci0JCXN1cGVyKCJBbGwgVGVzdHMiKTsKLQotCQlhZGRUZXN0KEpTUFVJUGVyZm9ybWFuY2VUZXN0cy5zdWl0ZSgpKTsKLQkJYWRkVGVzdChDU1NVSVBlcmZvcm1hbmNlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEhUTUxVSVBlcmZvcm1hbmNlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFNTRVVJUGVyZm9ybWFuY2VUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoWE1MVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbCgpIHsKLQkJLy8gdGhpcyBtZXRob2QgbmVlZHMgdG8gZXhpc3QsIGJ1dCBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL1Rlc3RUdXJraXNoLmphdmEgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvVGVzdFR1cmtpc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5YzU0NC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvVGVzdFR1cmtpc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBUZXN0VHVya2lzaAotICogU2VlIGh0dHA6Ly93d3cuaTE4bmd1eS5jb20vdW5pY29kZS90dXJraXNoLWkxOG4uaHRtbAotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0VHVya2lzaCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgdHVya2lzaExvd2VyQ2FzZSA9ICJcdTAxMzEiICsgIlx1MDA2OSI7Ci0JCVN0cmluZyB0dXJraXNoVXBwZXJDYXNlID0gIlx1MDEzMCIgKyAiXHUwMDQ5IjsKLQkJTG9jYWxlW10gbG9jYWxlcyA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxlcy5sZW5ndGg7IGkrKykgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGxvY2FsZXNbaV0pOwotCQl9Ci0JCUxvY2FsZSB0dXJraXNoTG9jYWxlID0gbmV3IExvY2FsZSgiVFIiKTsKLQkJU3RyaW5nIHRlc3RVcHBlcmNhc2UgPSB0dXJraXNoTG93ZXJDYXNlLnRvVXBwZXJDYXNlKHR1cmtpc2hMb2NhbGUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odHVya2lzaFVwcGVyQ2FzZS5lcXVhbHModGVzdFVwcGVyY2FzZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1Rlc3RTdHJpbmcuamF2YSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1Rlc3RTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4ZmM0Ni4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVGVzdFN0cmluZwotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0U3RyaW5nIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotCi0JCVN0cmluZyB4bWwgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLTE2XCI/PjxtZXNzYWdlPjxzb3VyY2VVcmk+PC9zb3VyY2VVcmk+PGJvZHk+PC9ib2R5PjwvbWVzc2FnZT4iOwotCi0KLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKGZhbHNlKTsKLQkJZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcih4bWwpKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnQoZG9jdW1lbnQuaGFzQ2hpbGROb2RlcygpKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihkb2N1bWVudCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVGVzdFN0cmluZ1V0aWxzLmphdmEgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyZTIzOC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzOwotCi0KLQotcHVibGljIGNsYXNzIFRlc3RTdHJpbmdVdGlscyB7Ci0KLQkvKioKLQkgKiBUZXN0U3RyaW5nVXRpbHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRlc3RTdHJpbmdVdGlscygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIG1hdGNoaW5nIGxpdGVyYWwgcG9ydGlvbnMgb2YgYSBzdHJpbmcgd2l0aCBhbm90aGVyIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbm9ybWFsU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IGFTdHJpbmcubGVuZ3RoKCk7Ci0JCWludCBwb3NpdGlvbiA9IDA7Ci0JCWludCBwcmV2aW91cyA9IDA7Ci0JCWludCBzcGFjZXIgPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCXdoaWxlIChwb3NpdGlvbiArIHNwYWNlciAtIDEgPCBsZW5ndGggJiYgYVN0cmluZy5pbmRleE9mKHNvdXJjZSwgcG9zaXRpb24pID4gLTEpIHsKLQkJCXBvc2l0aW9uID0gYVN0cmluZy5pbmRleE9mKHNvdXJjZSwgcHJldmlvdXMpOwotCQkJbm9ybWFsU3RyaW5nID0gbm9ybWFsU3RyaW5nICsgYVN0cmluZy5zdWJzdHJpbmcocHJldmlvdXMsIHBvc2l0aW9uKSArIHRhcmdldDsKLQkJCXBvc2l0aW9uICs9IHNwYWNlcjsKLQkJCXByZXZpb3VzID0gcG9zaXRpb247Ci0JCX0KLQkJbm9ybWFsU3RyaW5nID0gbm9ybWFsU3RyaW5nICsgYVN0cmluZy5zdWJzdHJpbmcocG9zaXRpb24sIGFTdHJpbmcubGVuZ3RoKCkpOwotCi0JCXJldHVybiBub3JtYWxTdHJpbmc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9WZXJzaW9uUmVtb3Zlci5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVmVyc2lvblJlbW92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZDljNS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9WZXJzaW9uUmVtb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRlc3RzLnV0aWwuQ29tbW9uWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBNb2RpZmllcyBwbHVnaW4ueG1sIGFuZCBmcmFnbWVudC54bWwgZmlsZXMgdG8gbm90IHJlcXVpcmUgc3BlY2lmaWMgdmVyc2lvbnMKLSAqIG9mIHRoZWlyIHBsdWdpbiBkZXBlbmRlbmNpZXMuCi0gKiAKLSAqIEBhdXRob3Igbml0aW4KLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25SZW1vdmVyIHsKLQotCWNoYXJbXSBjaGFyYnVmZiA9IG5ldyBjaGFyWzIwNDhdOwotCVN0cmluZ0J1ZmZlciBzID0gbnVsbDsKLQotCXB1YmxpYyBWZXJzaW9uUmVtb3ZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggPCAxKQotCQkJbmV3IFZlcnNpb25SZW1vdmVyKCkudmlzaXQobmV3IEZpbGUoImQ6L3RhcmdldCIpKTsKLQkJZWxzZQotCQkJbmV3IFZlcnNpb25SZW1vdmVyKCkudmlzaXQobmV3IEZpbGUoYXJnc1swXSkpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdChGaWxlIGZpbGUpIHsKLQkJLy8gU2tpcCBkaXJlY3RvcmllcyBsaWtlIG9yZy5lY2xpcHNlLiosIG9yZy5hcGFjaGUuKiwgYW5kIG9yZy5qdW5pdC4qCi0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkgJiYgIWZpbGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLiIpICYmICFmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlIikgJiYgIWZpbGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5qdW5pdCIpKSB7Ci0JCQlTdHJpbmdbXSBjb250ZW50cyA9IGZpbGUubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkrKykKLQkJCQl2aXNpdChuZXcgRmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpICsgJy8nICsgY29udGVudHNbaV0pKTsKLQkJfQotCQllbHNlIHsKLQkJCWZpeHVwRmlsZShmaWxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpeHVwRmlsZShGaWxlIGZpbGUpIHsKLQkJLy8gb25seSBsb2FkIGFuZCBmaXh1cCBmaWxlcyBuYW1lZCBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbCB1bmRlciBlY2xpcHNlXHBsdWdpbnNcWFhYWFhYWC4qCi0JCWlmICghKGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInBsdWdpbi54bWwiKSB8fCBmaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmcmFnbWVudC54bWwiKSkgfHwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5pbmRleE9mKCJlY2xpcHNlXFxwbHVnaW5zXFxYWFhYWFhYLiIpID09IC0xKQotCQkJcmV0dXJuOwotCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl0cnkgewotCQkJRG9jdW1lbnQgZG9jID0gQ29tbW9uWE1MLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKGZpbGUpOwotCQkJTm9kZUxpc3QgaW1wb3J0cyA9IG51bGw7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgicGx1Z2luLnhtbCIpKQotCQkJCWltcG9ydHMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltcG9ydCIpOwotCQkJZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZnJhZ21lbnQueG1sIikpCi0JCQkJaW1wb3J0cyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZnJhZ21lbnQiKTsKLQkJCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGltcG9ydE5vZGUgPSBpbXBvcnRzLml0ZW0oaSk7Ci0JCQkJaWYgKGltcG9ydE5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJpbXBvcnQiKSAmJiBpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oInZlcnNpb24iKSAhPSBudWxsKSB7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmVOYW1lZEl0ZW0oInZlcnNpb24iKTsKLQkJCQl9Ci0JCQkJaWYgKGltcG9ydE5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgicGx1Z2luLXZlcnNpb24iKSAhPSBudWxsKSB7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmVOYW1lZEl0ZW0oInBsdWdpbi12ZXJzaW9uIik7Ci0JCQkJfQotCQkJCWlmIChpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm1hdGNoIikgIT0gbnVsbCkgewotCQkJCQlpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmVOYW1lZEl0ZW0oIm1hdGNoIik7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjaGFuZ2VkKSB7Ci0JCQkJRmlsZU91dHB1dFN0cmVhbSBvc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJQ29tbW9uWE1MLnNlcmlhbGl6ZShkb2MsIG9zdHJlYW0pOwotCQkJCW9zdHJlYW0uY2xvc2UoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGlmaWVkICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihmaWxlLmdldFBhdGgoKSArICI6ICIgKyBlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGZpbGUuZ2V0UGF0aCgpICsgIjogIiArIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL3Rlc3RTdHJpbmdYTUwuanBhZ2UgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvdGVzdFN0cmluZ1hNTC5qcGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxZWFhMC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvdGVzdFN0cmluZ1hNTC5qcGFnZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3RldC5qc3AgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy90ZXQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTFiMjFlLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3RldC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCINCi0JcGFnZUVuY29kaW5nPSJVVEYtOCIlPg0KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08dGl0bGU+Y29udGVudCBvZiBsb3dlcmNhc2UgdGl0bGUgdGFnczwvdGl0bGU+DQotPHTEsXRsZT5jb250ZW50IG9mIGxvd2VyY2FzZSB0aXRsZSB0YWdzIChubyBkaWFyZXNpcyBvdmVyIGkpPC90xLF0bGU+DQotPHRpdGxlPmNvbnRlbnQgb2YgdXBwZXJjYXNlIHRhZ3M8L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aT48L2k+DQotPGk+PC9pPg0KLTxpPjwvaT4NCi08aT48L2k+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy90dXJraXNoQ2FzZS5qcGFnZSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3R1cmtpc2hDYXNlLmpwYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTk2ZTYxLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3R1cmtpc2hDYXNlLmpwYWdlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLVN0cmluZyBzID0gIlx1MDEzMSIrIlx1MDA2OSI7Ci1zLnRvVXBwZXJDYXNlKCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiZTFiYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/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+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2YjBlZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzRhZGY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBFZGl0b3JKc3BDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgRWRpdG9ySnNwQ29udGV4dHMyLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBFZGl0b3JKc3BDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIEVkaXRvckpzcENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4YzQ0ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRyYW5zbGF0aW9uIEluc3RydWN0aW9uOiBzZWN0aW9uIHRvIGJlIHRyYW5zbGF0ZWQKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1QbHVnaW4ubmFtZSA9IEpTUCB0b29scyBpbmZvcG9wcwotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDFiMTE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMSI/PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySnNwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySnNwQ29udGV4dHMyLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iSnNwV2l6Q29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNjODQwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjNzViOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjRjMjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjE3MTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYm9vay5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMjU1My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi1AaW1wb3J0ICIuLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLVAuQ29kZSB7Ci0JZGlzcGxheTogYmxvY2s7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl0ZXh0LWluZGVudDogMC4wMHB0OwotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsKLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWxlZnQ6IDE1cHQ7Ci0JZm9udC1zaXplOiAxMC4wMDAwMDBwdDsKLQlmb250LXdlaWdodDogbWVkaXVtOwotCWZvbnQtc3R5bGU6IFJlZ3VsYXI7Ci0JY29sb3I6ICM0NDQ0Q0M7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLQlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IjsKLX0KLQotSDYuQ2FwdGlvbkZpZ0NvbHVtbiB7Ci0JZGlzcGxheTogYmxvY2s7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl0ZXh0LWluZGVudDogMC4wMDAwMDBwdDsKLQltYXJnaW4tdG9wOiAzLjAwMDAwMHB0OwotCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0OwotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsKLQlmb250LXNpemU6IDkuMDAwMDAwcHQ7Ci0JZm9udC13ZWlnaHQ6IG1lZGl1bTsKLQlmb250LXN0eWxlOiBJdGFsaWM7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLQlmb250LWZhbWlseTogIkFyaWFsIjsKLX0KLQotUC5Ob3RlIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwcHQ7Ci0JbWFyZ2luLXRvcDogMTkuNTAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMTkuNTAwMDAwcHQ7Ci0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OwotCW1hcmdpbi1sZWZ0OiAzMHB0OwotCWZvbnQtc2l6ZTogMTEuMDAwMDAwcHQ7Ci0JZm9udC13ZWlnaHQ6IG1lZGl1bTsKLQlmb250LXN0eWxlOiBJdGFsaWM7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLQlmb250LWZhbWlseTogIkFyaWFsIjsKLX0KLQotRU0uVUlMYWJlbCB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci0JZm9udC1zdHlsZTogUmVndWxhcjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotfQotCi1FTS5Db2RlTmFtZSB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci0JZm9udC1zdHlsZTogUmVndWxhcjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciOwotfQotCi0vKiBmb2xsb3dpbmcgZm9udCBmYWNlIGRlY2xhcmF0aW9ucyBuZWVkIHRvIGJlIHJlbW92ZWQgZm9yIERCQ1MgKi8KLWJvZHksaDEsaDIsaDMsaDQsaDUsaDYscCx0YWJsZSx0ZCxjYXB0aW9uLHRoLHVsLG9sLGRsLGxpLGRkLGR0IHsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQljb2xvcjogIzAwMDAwMAotfQotCi1wcmUgewotCWZvbnQtZmFtaWx5OiBDb3VyaWVyLCBtb25vc3BhY2UKLX0KLQotLyogZW5kIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgKi8KLQkvKiBmb2xsb3dpbmcgZm9udCBzaXplIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgT0sgZm9yIERCQ1MgKi8KLWJvZHksaDEsaDIsaDMsaDQsaDUsaDYscCx0YWJsZSx0ZCxjYXB0aW9uLHRoLHVsLG9sLGRsLGxpLGRkLGR0IHsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXByZSB7Ci0JZm9udC1zaXplOiAxMHB0Ci19Ci0KLS8qIGVuZCBmb250IHNpemUgZGVjbGFyYXRpb25zICovCi1ib2R5IHsKLQliYWNrZ3JvdW5kOiAjRkZGRkZGCi19Ci0KLWgxIHsKLQlmb250LXNpemU6IDE4cHQ7Ci0JbWFyZ2luLXRvcDogNTsKLQltYXJnaW4tYm90dG9tOiAxCi19Ci0KLWgyIHsKLQlmb250LXNpemU6IDE0cHQ7Ci0JbWFyZ2luLXRvcDogMjU7Ci0JbWFyZ2luLWJvdHRvbTogMwotfQotCi1oMyB7Ci0JZm9udC1zaXplOiAxMXB0OwotCW1hcmdpbi10b3A6IDIwOwotCW1hcmdpbi1ib3R0b206IDMKLX0KLQotaDQgewotCWZvbnQtc2l6ZTogMTBwdDsKLQltYXJnaW4tdG9wOiAyMDsKLQltYXJnaW4tYm90dG9tOiAzOwotCWZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi1wIHsKLQltYXJnaW4tdG9wOiAxMHB4OwotCW1hcmdpbi1ib3R0b206IDEwcHgKLX0KLQotcHJlIHsKLQltYXJnaW4tbGVmdDogNjsKLQlmb250LXNpemU6IDlwdAotfQotCi1hOmxpbmsgewotCWNvbG9yOiAjMDAwMEZGCi19Ci0KLWE6aG92ZXIgewotCWNvbG9yOiAjMDAwMDgwCi19Ci0KLWE6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotdWwgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMTAKLX0KLQotbGkgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMAotfQotCi1saSBwIHsKLQltYXJnaW4tdG9wOiAwOwotCW1hcmdpbi1ib3R0b206IDAKLX0KLQotb2wgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMTAKLX0KLQotZGwgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMTAKLX0KLQotZHQgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMDsKLQlmb250LXdlaWdodDogYm9sZAotfQotCi1kZCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwCi19Ci0KLXN0cm9uZyB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQKLX0KLQotZW0gewotCWZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi12YXIgewotCWZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi1kaXYucmV2aXNpb24gewotCWJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsKLQlib3JkZXItbGVmdC13aWR0aDogdGhpbjsKLQlib3JkZXItbGVmdC1jb2xvcjogIzdCNjhFRTsKLQlwYWRkaW5nLWxlZnQ6IDUKLX0KLQotdGggewotCWZvbnQtd2VpZ2h0OiBib2xkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMDdhOGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgY29tbW9uLmNzcyxcCi0gICAgICAgICAgICAgICBjb21tb25sdHIuY3NzLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIG5vdGljZXMuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvYy54bWwsXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlX3RvYy54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyxcCi0gICAgICAgICAgICAgICBib29rLmNzcyxcCi0gICAgICAgICAgICAgICBjb21tb25ydGwuY3NzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0ZjNmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NyArMCwwIEBACi1ib2R5IHsKLQlmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjhlbTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotCWNvbG9yOiBCbGFjazsKLQltYXJnaW4tcmlnaHQ6IDVlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5pYm1maWxlcGF0aCB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEwMCU7Ci19Ci0KLS5pYm1jb21tYW5kIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmlibWVtcGhhc2lzIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5tdiwucGssLnBrZGVmLC5wdiB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEwMCU7Ci0JcGFkZGluZy10b3A6IDBlbTsKLQlwYWRkaW5nLXJpZ2h0OiAuM2VtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci0JcGFkZGluZy1sZWZ0OiAuM2VtOwotfQotCi10dCxzYW1wIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotQk9EWS5uYXYgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci0JYm9yZGVyLXJpZ2h0OiAwLjJlbSByaWRnZSBibGFjazsKLQlmb250LXNpemU6IDAuOTVlbTsKLX0KLQotLmJhc2UgewotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtdmFyaWFudDogbm9ybWFsOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi1UQUJMRSB7Ci0JY29sb3I6IGJsYWNrOwotCXdpZHRoOiA5MCU7Ci0JYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKLQlib3JkZXItY29sb3I6IEJsYWNrOwotCWJhY2tncm91bmQ6IHdoaXRlOwotCW1hcmdpbi10b3A6IDAuNWVtOwotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotCW1hcmdpbi1sZWZ0OiAwZW07Ci0JbWFyZ2luLXJpZ2h0OiAwZW07Ci19Ci0KLS50YmxkZXNjIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLVRIIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuN2VtOwotCWNvbG9yOiBibGFjazsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGFkYWRhOwotCXBhZGRpbmctdG9wOiAwLjFlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4zZW07Ci0JcGFkZGluZy1sZWZ0OiAxZW07Ci0JcGFkZGluZy1yaWdodDogMWVtOwotfQotCi1USC5iYXNlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogYmxhY2s7Ci0JYm9yZGVyOiAxIHNvbGlkICM2MDYwNjA7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RjZGFkYTsKLQlwYWRkaW5nLXRvcDogMC42NWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjY1ZW07Ci0JcGFkZGluZy1sZWZ0OiAxZW07Ci0JcGFkZGluZy1yaWdodDogMWVtOwotfQotCi1URCB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQljb2xvcjogYmxhY2s7Ci0JYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ci0JcGFkZGluZy10b3A6IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjNlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLUNJVEUgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotRU0gewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotU1RST05HIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotY2FwdGlvbiB7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLURUIHsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLX0KLQotREQgewotCW1hcmdpbi1sZWZ0OiAxLjBlbTsKLX0KLQotUFJFLHByZS5jZ3JhcGhpYyB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEycHg7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RhZGFkYTsKLQlwYWRkaW5nOiA1cHg7Ci19Ci0KLS5pdGFsaWMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmJvbGQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udW5kZXJsaW5lZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLWl0YWxpYywuYm9sZEl0YWxpYyB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uc21hbGxDYXBzLC5zbWFsbGNhcHMgewotCXRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Ci0JZm9udC1zaXplOiBzbWFsbGVyOwotCWZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKLX0KLQotLml0YWxpYy11bmRlcmxpbmVkIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLXVuZGVybGluZWQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uYm9sZC1pdGFsaWMtdW5kZXJsaW5lZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uc21hbGxjYXBzLXVuZGVybGluZWQgewotCWZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmVtcGhhc2lzIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5pbmxpbmVkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLnNpZGViYXIgewotCWJhY2tncm91bmQ6ICNjY2NjY2M7Ci19Ci0KLUE6bGluayB7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLUE6dmlzaXRlZCB7Ci0JY29sb3I6ICM5OTY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLUE6YWN0aXZlIHsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTpob3ZlciB7Ci0JY29sb3I6ICM5OTY2OTk7OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLnRvY2xpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRvY2xpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEucHRvY2xpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wdG9jbGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuaW5kZXhsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuaW5kZXhsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLmZpZ3VyZWxpc3Q6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmZpZ3VyZWxpc3Q6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEudGFibGVsaXN0OmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudGFibGVsaXN0OnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLmJvbGRncmV5bGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLWEuYm9sZGdyZXlsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotYS5ib2xkZ3JleWxpbms6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi0ucnVubmluZ2hlYWRlciB7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMC43ZW07Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjdlbTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTpsaW5rIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6YWN0aXZlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6dmlzaXRlZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOmhvdmVyIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotI2JyZWFkY3J1bWIsLmJyZWFkY3J1bWIsc3Bhbi5icmVhZGNydW1icyB7Ci0JZm9udC1zaXplOiAwLjc1ZW07Ci19Ci0KLS5mYXN0cGF0aCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmZhc3RwYXRodGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udG9jIHsKLQlmb250LXNpemU6IHNtYWxsOwotfQotCi0ubmVzdGVkMCB7Ci0JbWFyZ2luLXRvcDogMGVtOwotfQotCi0ucCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotfQotCi1zcGFuLmZpZ2NhcCB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLmZpZ2Rlc2MgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotZGl2LmZpZ2JveCB7Ci0JCi19Ci0KLWRpdi5maWdydWxlcyB7Ci0JCi19Ci0KLWRpdi5maWdub25lIHsKLQkKLX0KLQotLmZpZ25vbmUgewotCQotfQotCi0uZmlnYm9yZGVyIHsKLQkKLX0KLQotLmZpZ3NpZGVzIHsKLQkKLX0KLQotLmZpZ3RvcCB7Ci0JCi19Ci0KLS5maWdib3R0b20gewotCQotfQotCi0uZmlndG9wYm90IHsKLQkKLX0KLQotLnBhcmVudGxpbmsgewotCQotfQotCi0ucHJldmxpbmsgewotCQotfQotCi0ubmV4dGxpbmsgewotCQotfQotCi0ucmVsY29uY2VwdHNoZCB7Ci0JCi19Ci0KLS5yZWx0YXNrc2hkIHsKLQkKLX0KLQotLnJlbHJlZmhkIHsKLQkKLX0KLQotLnN5bm5vbmUgewotCQotfQotCi0uc3luYm9yZGVyIHsKLQkKLX0KLQotLnN5bnNpZGVzIHsKLQkKLX0KLQotLnN5bnRvcCB7Ci0JCi19Ci0KLS5zeW5ib3R0b20gewotCQotfQotCi0uc3ludG9wYm90IHsKLQkKLX0KLQotLnNraXAgewotCW1hcmdpbi10b3A6IDFlbTsKLX0KLQotLnNraXBzcGFjZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnVsY2hpbGRsaW5rIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ub2xjaGlsZGxpbmsgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLXVsLG9sIHsKLQltYXJnaW4tdG9wOiAwLjFlbTsKLQlwYWRkaW5nLXRvcDogMC4xZW07Ci19Ci0KLXVsLnNpbXBsZSB7Ci0JbGlzdC1zdHlsZS10eXBlOiBub25lOwotfQotCi11bC5pbmRleGxpc3QgewotCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLX0KLQotT0wgTEkgewotCW1hcmdpbi10b3A6IDAuMGVtOwotCW1hcmdpbi1ib3R0b206IDAuMGVtOwotCW1hcmdpbi1sZWZ0OiAwLjBlbTsKLX0KLQotVUwgTEkgewotCW1hcmdpbi10b3A6IDAuMGVtOwotCW1hcmdpbi1ib3R0b206IDAuMGVtOwotCW1hcmdpbi1sZWZ0OiAwLjBlbTsKLX0KLQotT0wgTEkgRElWIFAgewotCWxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotVUwgTEkgRElWIFAgewotCWxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotKiBbY29tcGFjdD0ieWVzIl0+bGkgewotCW1hcmdpbi10b3A6IDAgZW07Ci19Ci0KLSogW2NvbXBhY3Q9Im5vIl0+bGkgewotCW1hcmdpbi10b3A6IDAuNWVtOwotfQotCi1ociB7Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCW1hcmdpbi10b3A6IDBlbTsKLQlwYWRkaW5nLXRvcDogMGVtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci0Jd2lkdGg6IDkwJTsKLQljb2xvcjogI2NjY2NjYzsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLUgxLC50aXRsZSwucGFnZXRpdGxlLC50b3BpY3RpdGxlMSB7Ci0JZm9udC1zaXplOiAxLjVlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0Jd29yZC1zcGFjaW5nOiAwLjFlbTsKLX0KLQotSDIsLnN1YnRpdGxlLC5wYWdlc3VidGl0bGUsLnRvcGljdGl0bGUyIHsKLQlmb250LXNpemU6IDEuMjVlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMGVtOwotfQotCi1IMywuYm9sZHRpdGxlLC50b3BpY3RpdGxlMyB7Ci0JZm9udC1zaXplOiAxLjBlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMWVtOwotfQotCi1INCwudG9waWN0aXRsZTQgewotCWZvbnQtc2l6ZTogMC45ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjFlbTsKLX0KLQotaDUsLnRvcGljdGl0bGU1IHsKLQlmb250LXNpemU6IDAuOGVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLX0KLQotaDYsLnRvcGljdGl0bGU2IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLX0KLQotZGl2LmhlYWR0aXRsZSB7Ci0JZm9udC1zaXplOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLX0KLQotZGl2LmhlYWQwIHsKLQlmb250LXNpemU6IDAuOWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1sZWZ0OiAwZW07Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci19Ci0KLWRpdi5oZWFkMSB7Ci0JZm9udC1zaXplOiAwLjhlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tbGVmdDogMWVtOwotCXBhZGRpbmctdG9wOiAwLjVlbTsKLX0KLQotZGl2LmhlYWQyIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2LmhlYWQzIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotZGl2LmhlYWQ0IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDRlbTsKLX0KLQotZGl2LmhlYWQ1IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDVlbTsKLX0KLQotZGl2LmhlYWQ2IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDZlbTsKLX0KLQotZGl2LmhlYWQ3IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDdlbTsKLX0KLQotZGl2LmhlYWQ4IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDhlbTsKLX0KLQotZGl2LmhlYWQ5IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDllbTsKLX0KLQotLnRpcCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnRpcHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmZpcnN0Y29sIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnB0b2NIMSB7Ci0JZm9udC1zaXplOiB4LXNtYWxsOwotfQotCi0ucHRvY0gyIHsKLQlmb250LXNpemU6IHgtc21hbGw7Ci19Ci0KLS5zdGl0bGUgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLm50ZSB7Ci0JCi19Ci0KLS54eGxpbmVzIHsKLQl3aGl0ZS1zcGFjZTogcHJlOwotCWZvbnQtc2l6ZTogMC45NWVtOwotfQotCi0uc2VjdGlvbnRpdGxlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCWNvbG9yOiBibGFjazsKLQlmb250LXNpemU6IDEuMmVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYuaW1hZ2VsZWZ0IHsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi1kaXYuaW1hZ2VjZW50ZXIgewotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotZGl2LmltYWdlcmlnaHQgewotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi1kaXYuaW1hZ2VqdXN0aWZ5IHsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5OwotfQotCi1kaXYubW1vYmogewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYubW1vYmpsZWZ0IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLWRpdi5tbW9iamNlbnRlciB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5tbW9ianJpZ2h0IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi1wcmUuc2NyZWVuIHsKLQlwYWRkaW5nOiAxZW0gMWVtIDFlbSAxZW07Ci0JbWFyZ2luLXRvcDogMC40ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC40ZW07Ci0JYm9yZGVyOiB0aGluIHNvbGlkIEJsYWNrOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotLnByZXJlcSB7Ci0JbWFyZ2luLWxlZnQ6IDEuNWVtOwotfQotCi0uZGVmTGlzdEhlYWQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLm12IHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ubWQgewotCXRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwotfQotCi0ucGssc3Bhbi5wayB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ucGtkZWYgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLnB2IHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ucHZkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotc3Bhbi5rd2QgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLmtkd2RlZiB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5wYXJtTGlzdEt3ZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5wYXJtTGlzdFZhciB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLm9wZXIgewotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLQotc3Bhbi5vcGVyZGVmIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotVkFSLHNwYW4udmFyIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4udmFyZGVmIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWRpdi5tc2cgewotCXBhZGRpbmc6IDAuMmVtIDFlbSAxZW0gMWVtOwotCW1hcmdpbi10b3A6IDAuNGVtOwotCW1hcmdpbi1ib3R0b206IDAuNGVtOwotfQotCi1kaXYubXNnbnVtIHsKLQlmbG9hdDogbGVmdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JbWFyZ2luLXJpZ2h0OiAxZW07Ci19Ci0KLWRpdi5tc2d0ZXh0IHsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLWRpdi5tc2dpdGVtdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1wLm1zZ2l0ZW0gewotCW1hcmdpbi10b3A6IDBlbTsKLX0KLQotLmF0dGVudGlvbixkaXYuYXR0ZW50aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uYXR0ZW50aW9udGl0bGUsc3Bhbi5hdHRlbnRpb250aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5jYXV0aW9udGl0bGUsZGl2LmNhdXRpb250aXRsZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uY2F1dGlvbixkaXYuY2F1dGlvbiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmRhbmdlcixkaXYuZGFuZ2VyIHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXI6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5kYW5nZXJ0aXRsZSxkaXYuZGFuZ2VydGl0bGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmltcG9ydGFudCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmltcG9ydGFudHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnJlbWVtYmVyIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ucmVtZW1iZXJ0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5yZXN0cmljdGlvbiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnJlc3RyaWN0aW9udGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYud2FybmluZ3RpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2Lndhcm5pbmdib2R5IHsKLQltYXJnaW4tbGVmdDogMmVtCi19Ci0KLS5ub3RlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ubm90ZXRpdGxlLGRpdi5ub3RldGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYubm90ZWJvZHkgewotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5ub3RlbGlzdHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2LmZubnVtIHsKLQlmbG9hdDogbGVmdDsKLX0KLQotZGl2LmZudGV4dCB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2LnN0ZXBsIHsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuc3RlcGxudW0gewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiAwLjVlbTsKLX0KLQotZGl2LnN0ZXBsdGV4dCB7Ci0JbWFyZ2luLWxlZnQ6IDVlbTsKLX0KLQotZGl2LnN0ZXBsbnVtIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDAuNWVtOwotfQotCi1kaXYuc3RlcGx0ZXh0IHsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYubGVkaSB7Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotZGl2LmxlZGVzYyB7Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotc3Bhbi5wYmxrdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYucGJsa2xibGJveCB7Ci0JcGFkZGluZzogMC41ZW0gMC41ZW0gMC41ZW0gMC41ZW07Ci0JYm9yZGVyOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci19Ci0KLXNwYW4uZWRub3RpY2VzdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLnVpY29udHJvbCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4udGVybSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4uaWR4c2hvdyB7Ci0JY29sb3I6IGdyZWVuOwotfQotCi1kaXYuY29kZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi1zcGFuLnJlZmtleSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6IHdoaXRlOwotCWJhY2tncm91bmQtY29sb3I6IGJsYWNrOwotfQotCi10dC5hcGwgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotZGl2LnF1YWxpZnN0YXJ0IHsKLQlwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXItdG9wOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYucXVhbGlmZW5kIHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjFlbSAwLjVlbTsKLQlib3JkZXItYm90dG9tOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi0ubm9zaGFkZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ci19Ci0KLS54bGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS5saWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0IwQjBCMDsKLX0KLQotLm1lZGl1bSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzhDOEM4QzsKLX0KLQotLmRhcmsgewotCWJhY2tncm91bmQtY29sb3I6ICM2RTZFNkU7Ci19Ci0KLS54ZGFyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzU4NTg1ODsKLX0KLQotLmxpZ2h0LXllbGxvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZDQzsKLX0KLQotLmtoYWtpIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQzk5OwotfQotCi0ubWVkaXVtLWJsdWUgewotCWJhY2tncm91bmQtY29sb3I6ICM2Njk5Q0M7Ci19Ci0KLS5saWdodC1ibHVlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0ZGOwotfQotCi0ubWlkLWdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci19Ci0KLS5saWdodC1ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0ubGlnaHRlc3QtZ3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U2RTZFNjsKLX0KLQotI2NoYW5nZWQgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQlsZWZ0OiAwLjJlbTsKLQljb2xvcjogIzdCNjhFRTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotSU5QVVQuYnV0dG9ucyB7Ci0JZm9udC1zaXplOiAwLjc1ZW07Ci0JYm9yZGVyLXRvcDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYm9yZGVyLXJpZ2h0OiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItYm90dG9tOiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItbGVmdDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMjsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotLmNncmFwaGljIHsKLQlmb250LXNpemU6IDkwJTsKLQljb2xvcjogYmxhY2s7Ci19Ci0KLS5haXgsLmhwdXgsLnN1biwudW5peCwud2luMiwud2lubnQsLndpbiwuem9zLC5saW51eCwub3MzOTAsLm9zNDAwLC5jLC5jcGx1c3BsdXMsLmNvYm9sLC5mb3J0cmFuLC5qYXZhLC5tYWNvc3gsLm9zMiwucGwxLC5ycGcKLQl7Ci0JYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQl0ZXh0LWluZGVudDogNTVweDsKLX0KLQotLmFpeCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYWl4LmdpZik7Ci19Ci0KLS5ocHV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdocHV4LmdpZik7Ci19Ci0KLS5zdW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3NvbGFyaXMuZ2lmKTsKLX0KLQotLnVuaXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3VuaXguZ2lmKTsKLX0KLQotLndpbjIgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzIwMDAuZ2lmKTsKLX0KLQotLndpbnhwIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd4cC5naWYpOwotfQotCi0ud2lubnQgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ250LmdpZik7Ci19Ci0KLS53aW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3dpbi5naWYpOwotfQotCi0uem9zIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd6b3MuZ2lmKTsKLX0KLQotLmxpbnV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdsaW51eC5naWYpOwotfQotCi0ub3MzOTAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzM5MC5naWYpOwotfQotCi0ub3M0MDAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzQwMC5naWYpOwotfQotCi0uYyB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYy5naWYpOwotfQotCi0uY3BsdXNwbHVzIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjcHAuZ2lmKTsKLX0KLQotLmNvYm9sIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjb2JvbC5naWYpOwotfQotCi0uZm9ydHJhbiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nZm9ydHJhbi5naWYpOwotfQotCi0uamF2YSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5namF2YS5naWYpOwotfQotCi0ubWFjb3N4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdtYWNvc3guZ2lmKTsKLX0KLQotLm9zMiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nb3MyLmdpZik7Ci19Ci0KLS5wbDEgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3BsMS5naWYpOwotfQotCi0ucnBnIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdycGcuZ2lmKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25sdHIuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9ubHRyLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhODE5NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25sdHIuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNiArMCwwIEBACi0vKgotIHwgKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNCwgMjAwNSBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovCi0gCi0udW5yZXNvbHZlZCB7IGJhY2tncm91bmQtY29sb3I6IHNreWJsdWU7IH0KLS5ub1RlbXBsYXRlIHsgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OyB9Ci0KLS5iYXNlIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgfQotCi0vKiBBZGQgc3BhY2UgZm9yIHRvcCBsZXZlbCB0b3BpY3MgKi8KLS5uZXN0ZWQwIHsgbWFyZ2luLXRvcCA6IDFlbTt9Ci0KLS8qIGRpdiB3aXRoIGNsYXNzPXAgaXMgdXNlZCBmb3IgcGFyYWdyYXBocyB0aGF0IGNvbnRhaW4gYmxvY2tzLCB0byBrZWVwIHRoZSBYSFRNTCB2YWxpZCAqLwotLnAge21hcmdpbi10b3A6IDFlbX0KLQotLyogRGVmYXVsdCBvZiBpdGFsaWNzIHRvIHNldCBhcGFydCBmaWd1cmUgY2FwdGlvbnMgKi8KLS5maWdjYXAgeyBmb250LXN0eWxlOiBpdGFsaWMgfQotLmZpZ2Rlc2MgeyBmb250LXN0eWxlOiBub3JtYWwgfQotCi0vKiBVc2UgQGZyYW1lIHRvIGNyZWF0ZSBmcmFtZXMgb24gZmlndXJlcyAqLwotLmZpZ2JvcmRlciB7IGJvcmRlci1zdHlsZTogc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXdpZHRoIDogMnB4OyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlnc2lkZXMgeyBib3JkZXItbGVmdCA6IDJweCBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItcmlnaHQgOiAycHggc29saWQ7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWd0b3AgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlnYm90dG9tIHsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWd0b3Bib3QgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0KLS8qIE1vc3QgbGluayBncm91cHMgYXJlIGNyZWF0ZWQgd2l0aCA8ZGl2Pi4gRW5zdXJlIHRoZXkgaGF2ZSBzcGFjZSBiZWZvcmUgYW5kIGFmdGVyLiAqLwotLnVsbGlua3MgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQotLnVsY2hpbGRsaW5rIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLm9sY2hpbGRsaW5rIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmxpbmtsaXN0IHsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5saW5rbGlzdHdpdGhjaGlsZCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0uc3VibGlua2xpc3QgeyBtYXJnaW4tbGVmdDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnJlbGNvbmNlcHRzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHRhc2tzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHJlZiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxpbmZvIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmJyZWFkY3J1bWIgeyBmb250LXNpemUgOiBzbWFsbGVyOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnByZXJlcSB7IG1hcmdpbi1sZWZ0IDogMjBweDt9Ci0KLS8qIFNldCBoZWFkaW5nIHNpemVzLCBnZXR0aW5nIHNtYWxsZXIgZm9yIGRlZXBlciBuZXN0aW5nICovCi0udG9waWN0aXRsZTEgeyBtYXJnaW4tdG9wOiAwcGM7IG1hcmdpbi1ib3R0b206IC4xZW07IGZvbnQtc2l6ZTogMS4zNGVtOyB9Ci0udG9waWN0aXRsZTIgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC40NWVtOyBmb250LXNpemU6IDEuMTdlbTsgfQotLnRvcGljdGl0bGUzIHsgbWFyZ2luLXRvcDogMXBjOyBtYXJnaW4tYm90dG9tOiAuMTdlbTsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTQgeyBtYXJnaW4tdG9wOiAuODNlbTsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTUgeyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNiB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5zZWN0aW9udGl0bGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDBlbTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7fQotLnNlY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZXhhbXBsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLyogQWxsIG5vdGUgZm9ybWF0cyBoYXZlIHRoZSBzYW1lIGRlZmF1bHQgcHJlc2VudGF0aW9uICovCi0ubm90ZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ubm90ZXRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLm5vdGVsaXN0dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0udGlwIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS50aXB0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5mYXN0cGF0aCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uZmFzdHBhdGh0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5pbXBvcnRhbnQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmltcG9ydGFudHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnJlbWVtYmVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5yZW1lbWJlcnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnJlc3RyaWN0aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5yZXN0cmljdGlvbnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmF0dGVudGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uYXR0ZW50aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZGFuZ2VydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZGFuZ2VyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5jYXV0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uY2F1dGlvbiB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tYm90dG9tIDogMWVtOyB9Ci0KLS8qIFNpbXBsZSBsaXN0cyBkbyBub3QgZ2V0IGEgYnVsbGV0ICovCi11bC5zaW1wbGUgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQotCi0vKiBVc2VkIG9uIHRoZSBmaXJzdCBjb2x1bW4gb2YgYSB0YWJsZSwgd2hlbiByb3doZWFkZXI9ImZpcnN0Y29sIiBpcyB1c2VkICovCi0uZmlyc3Rjb2wgeyBmb250LXdlaWdodCA6IGJvbGQ7fQotCi0vKiBWYXJpb3VzIGJhc2ljIHBocmFzZSBzdHlsZXMgKi8KLS5ib2xkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5ib2xkSXRhbGljIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLml0YWxpYyB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnVuZGVybGluZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnVpY29udHJvbCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ucGFybW5hbWUgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmt3ZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uZGVma3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udmFyIHsgZm9udC1zdHlsZSA6IGl0YWxpYzt9Ci0uc2hvcnRjdXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotCi0vKiBEZWZhdWx0IG9mIGJvbGQgZm9yIGRlZmluaXRpb24gbGlzdCB0ZXJtcyAqLwotLmRsdGVybSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0KLS8qIFVzZSBDU1MgdG8gZXhwYW5kIGxpc3RzIHdpdGggQGNvbXBhY3Q9Im5vIiAqLwotLmRsdGVybWV4cGFuZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tdG9wOiAxZW07IH0KLSpbY29tcGFjdD0ieWVzIl0+bGkgeyBtYXJnaW4tdG9wOiAwZW07fQotKltjb21wYWN0PSJubyJdPmxpIHsgbWFyZ2luLXRvcDogLjUzZW07fQkKLS5saWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zbGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGxleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGRleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdWJzdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0vKiBBbGlnbiBpbWFnZXMgYmFzZWQgb24gQGFsaWduIG9uIHRvcGljL2ltYWdlICovCi1kaXYuaW1hZ2VsZWZ0IHsgdGV4dC1hbGlnbjogbGVmdCB9Ci1kaXYuaW1hZ2VjZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQotZGl2LmltYWdlcmlnaHQgeyB0ZXh0LWFsaWduOiByaWdodCB9Ci1kaXYuaW1hZ2VqdXN0aWZ5IHsgdGV4dC1hbGlnbjoganVzdGlmeSB9Ci0KLXByZS5zY3JlZW4geyBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7IGJvcmRlcjogb3V0c2V0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOyBtYXJnaW4tdG9wOiAycHg7IG1hcmdpbi1ib3R0b20gOiAycHg7IHdoaXRlLXNwYWNlOiBwcmV9Ci0KLS8qIGNvcGllZCBmcm9tIGNvbW1vbi5jc3MgKi8KLWJvZHkgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuOGVtOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JY29sb3I6IEJsYWNrOwotCW1hcmdpbi1yaWdodDogNWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmlibWZpbGVwYXRoIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotLmlibWNvbW1hbmQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaWJtZW1waGFzaXMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLm12LC5waywucGtkZWYsLnB2IHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLQlwYWRkaW5nLXRvcDogMGVtOwotCXBhZGRpbmctcmlnaHQ6IC4zZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWxlZnQ6IC4zZW07Ci19Ci0KLXR0LHNhbXAgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi1CT0RZLm5hdiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLQlib3JkZXItcmlnaHQ6IDAuMmVtIHJpZGdlIGJsYWNrOwotCWZvbnQtc2l6ZTogMC45NWVtOwotfQotCi0uYmFzZSB7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC12YXJpYW50OiBub3JtYWw7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLVRBQkxFIHsKLQljb2xvcjogYmxhY2s7Ci0Jd2lkdGg6IDkwJTsKLQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotCWJvcmRlci1jb2xvcjogQmxhY2s7Ci0JYmFja2dyb3VuZDogd2hpdGU7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLQltYXJnaW4tcmlnaHQ6IDBlbTsKLX0KLQotLnRibGRlc2MgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotVEggewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC43ZW07Ci0JY29sb3I6IGJsYWNrOwotCWJhY2tncm91bmQtY29sb3I6ICNkYWRhZGE7Ci0JcGFkZGluZy10b3A6IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjNlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLVRILmJhc2UgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiBibGFjazsKLQlib3JkZXI6IDEgc29saWQgIzYwNjA2MDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGNkYWRhOwotCXBhZGRpbmctdG9wOiAwLjY1ZW07Ci0JcGFkZGluZy1ib3R0b206IDAuNjVlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLVREIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWNvbG9yOiBibGFjazsKLQliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLQlwYWRkaW5nLXRvcDogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuM2VtOwotCXBhZGRpbmctbGVmdDogMWVtOwotCXBhZGRpbmctcmlnaHQ6IDFlbTsKLX0KLQotQ0lURSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1FTSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1TVFJPTkcgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1jYXB0aW9uIHsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotRFQgewotCW1hcmdpbi10b3A6IDAuNWVtOwotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotfQotCi1ERCB7Ci0JbWFyZ2luLWxlZnQ6IDEuMGVtOwotfQotCi1QUkUscHJlLmNncmFwaGljIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTJweDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGFkYWRhOwotCXBhZGRpbmc6IDVweDsKLX0KLQotLml0YWxpYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS51bmRlcmxpbmVkIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtaXRhbGljLC5ib2xkSXRhbGljIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5zbWFsbENhcHMsLnNtYWxsY2FwcyB7Ci0JdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKLQlmb250LXNpemU6IHNtYWxsZXI7Ci0JZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwotfQotCi0uaXRhbGljLXVuZGVybGluZWQgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtdW5kZXJsaW5lZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLWl0YWxpYy11bmRlcmxpbmVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5zbWFsbGNhcHMtdW5kZXJsaW5lZCB7Ci0JZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uZW1waGFzaXMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmlubGluZWRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uc2lkZWJhciB7Ci0JYmFja2dyb3VuZDogI2NjY2NjYzsKLX0KLQotQTpsaW5rIHsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTp2aXNpdGVkIHsKLQljb2xvcjogIzk5NjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTphY3RpdmUgewotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1BOmhvdmVyIHsKLQljb2xvcjogIzk5NjY5OTs7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEudG9jbGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5wdG9jbGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5pbmRleGxpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS50YWJsZWxpc3Q6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuYm9sZGdyZXlsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotYS5ib2xkZ3JleWxpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi1hLmJvbGRncmV5bGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLS5ydW5uaW5naGVhZGVyIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjdlbTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuN2VtOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOmxpbmsgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTphY3RpdmUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTp2aXNpdGVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6aG92ZXIgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0jYnJlYWRjcnVtYiwuYnJlYWRjcnVtYixzcGFuLmJyZWFkY3J1bWJzIHsKLQlmb250LXNpemU6IDAuNzVlbTsKLX0KLQotLmZhc3RwYXRoIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZmFzdHBhdGh0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50b2MgewotCWZvbnQtc2l6ZTogc21hbGw7Ci19Ci0KLS5uZXN0ZWQwIHsKLQltYXJnaW4tdG9wOiAwZW07Ci19Ci0KLS5wIHsKLQltYXJnaW4tdG9wOiAxZW07Ci19Ci0KLXNwYW4uZmlnY2FwIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4uZmlnZGVzYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1kaXYuZmlnYm94IHsKLQkKLX0KLQotZGl2LmZpZ3J1bGVzIHsKLQkKLX0KLQotZGl2LmZpZ25vbmUgewotCQotfQotCi0uZmlnbm9uZSB7Ci0JCi19Ci0KLS5maWdib3JkZXIgewotCQotfQotCi0uZmlnc2lkZXMgewotCQotfQotCi0uZmlndG9wIHsKLQkKLX0KLQotLmZpZ2JvdHRvbSB7Ci0JCi19Ci0KLS5maWd0b3Bib3QgewotCQotfQotCi0ucGFyZW50bGluayB7Ci0JCi19Ci0KLS5wcmV2bGluayB7Ci0JCi19Ci0KLS5uZXh0bGluayB7Ci0JCi19Ci0KLS5yZWxjb25jZXB0c2hkIHsKLQkKLX0KLQotLnJlbHRhc2tzaGQgewotCQotfQotCi0ucmVscmVmaGQgewotCQotfQotCi0uc3lubm9uZSB7Ci0JCi19Ci0KLS5zeW5ib3JkZXIgewotCQotfQotCi0uc3luc2lkZXMgewotCQotfQotCi0uc3ludG9wIHsKLQkKLX0KLQotLnN5bmJvdHRvbSB7Ci0JCi19Ci0KLS5zeW50b3Bib3QgewotCQotfQotCi0uc2tpcCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotfQotCi0uc2tpcHNwYWNlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0udWxjaGlsZGxpbmsgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5vbGNoaWxkbGluayB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotdWwsb2wgewotCW1hcmdpbi10b3A6IDAuMWVtOwotCXBhZGRpbmctdG9wOiAwLjFlbTsKLX0KLQotdWwuc2ltcGxlIHsKLQlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci19Ci0KLXVsLmluZGV4bGlzdCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBub25lOwotfQotCi1PTCBMSSB7Ci0JbWFyZ2luLXRvcDogMC4wZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JbWFyZ2luLWxlZnQ6IDAuMGVtOwotfQotCi1VTCBMSSB7Ci0JbWFyZ2luLXRvcDogMC4wZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JbWFyZ2luLWxlZnQ6IDAuMGVtOwotfQotCi1PTCBMSSBESVYgUCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi1VTCBMSSBESVYgUCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkaXNjOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi0qIFtjb21wYWN0PSJ5ZXMiXT5saSB7Ci0JbWFyZ2luLXRvcDogMCBlbTsKLX0KLQotKiBbY29tcGFjdD0ibm8iXT5saSB7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci19Ci0KLWhyIHsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JbWFyZ2luLXRvcDogMGVtOwotCXBhZGRpbmctdG9wOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLQl3aWR0aDogOTAlOwotCWNvbG9yOiAjY2NjY2NjOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotSDEsLnRpdGxlLC5wYWdldGl0bGUsLnRvcGljdGl0bGUxIHsKLQlmb250LXNpemU6IDEuNWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLQl3b3JkLXNwYWNpbmc6IDAuMWVtOwotfQotCi1IMiwuc3VidGl0bGUsLnBhZ2VzdWJ0aXRsZSwudG9waWN0aXRsZTIgewotCWZvbnQtc2l6ZTogMS4yNWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4wZW07Ci19Ci0KLUgzLC5ib2xkdGl0bGUsLnRvcGljdGl0bGUzIHsKLQlmb250LXNpemU6IDEuMGVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4xZW07Ci19Ci0KLUg0LC50b3BpY3RpdGxlNCB7Ci0JZm9udC1zaXplOiAwLjllbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMWVtOwotfQotCi1oNSwudG9waWN0aXRsZTUgewotCWZvbnQtc2l6ZTogMC44ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotfQotCi1oNiwudG9waWN0aXRsZTYgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotfQotCi1kaXYuaGVhZHRpdGxlIHsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tbGVmdDogMGVtOwotfQotCi1kaXYuaGVhZDAgewotCWZvbnQtc2l6ZTogMC45ZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLX0KLQotZGl2LmhlYWQxIHsKLQlmb250LXNpemU6IDAuOGVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1sZWZ0OiAxZW07Ci0JcGFkZGluZy10b3A6IDAuNWVtOwotfQotCi1kaXYuaGVhZDIgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuaGVhZDMgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYuaGVhZDQgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNGVtOwotfQotCi1kaXYuaGVhZDUgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNWVtOwotfQotCi1kaXYuaGVhZDYgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNmVtOwotfQotCi1kaXYuaGVhZDcgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogN2VtOwotfQotCi1kaXYuaGVhZDggewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogOGVtOwotfQotCi1kaXYuaGVhZDkgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogOWVtOwotfQotCi0udGlwIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0udGlwdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uZmlyc3Rjb2wgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucHRvY0gxIHsKLQlmb250LXNpemU6IHgtc21hbGw7Ci19Ci0KLS5wdG9jSDIgewotCWZvbnQtc2l6ZTogeC1zbWFsbDsKLX0KLQotLnN0aXRsZSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0ubnRlIHsKLQkKLX0KLQotLnh4bGluZXMgewotCXdoaXRlLXNwYWNlOiBwcmU7Ci0JZm9udC1zaXplOiAwLjk1ZW07Ci19Ci0KLS5zZWN0aW9udGl0bGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JY29sb3I6IGJsYWNrOwotCWZvbnQtc2l6ZTogMS4yZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5pbWFnZWxlZnQgewotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLWRpdi5pbWFnZWNlbnRlciB7Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYuaW1hZ2VyaWdodCB7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLWRpdi5pbWFnZWp1c3RpZnkgewotCXRleHQtYWxpZ246IGp1c3RpZnk7Ci19Ci0KLWRpdi5tbW9iaiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5tbW9iamxlZnQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotZGl2Lm1tb2JqY2VudGVyIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotZGl2Lm1tb2JqcmlnaHQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLXByZS5zY3JlZW4gewotCXBhZGRpbmc6IDFlbSAxZW0gMWVtIDFlbTsKLQltYXJnaW4tdG9wOiAwLjRlbTsKLQltYXJnaW4tYm90dG9tOiAwLjRlbTsKLQlib3JkZXI6IHRoaW4gc29saWQgQmxhY2s7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi0ucHJlcmVxIHsKLQltYXJnaW4tbGVmdDogMS41ZW07Ci19Ci0KLS5kZWZMaXN0SGVhZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ubXYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5tZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Ci19Ci0KLS5wayxzcGFuLnBrIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5wa2RlZiB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ucHYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5wdmRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLmt3ZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ua2R3ZGVmIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLnBhcm1MaXN0S3dkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnBhcm1MaXN0VmFyIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ub3BlciB7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotfQotCi1zcGFuLm9wZXJkZWYgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1WQVIsc3Bhbi52YXIgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi52YXJkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotZGl2Lm1zZyB7Ci0JcGFkZGluZzogMC4yZW0gMWVtIDFlbSAxZW07Ci0JbWFyZ2luLXRvcDogMC40ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC40ZW07Ci19Ci0KLWRpdi5tc2dudW0gewotCWZsb2F0OiBsZWZ0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQltYXJnaW4tcmlnaHQ6IDFlbTsKLX0KLQotZGl2Lm1zZ3RleHQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotZGl2Lm1zZ2l0ZW10aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXAubXNnaXRlbSB7Ci0JbWFyZ2luLXRvcDogMGVtOwotfQotCi0uYXR0ZW50aW9uLGRpdi5hdHRlbnRpb24gewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5hdHRlbnRpb250aXRsZSxzcGFuLmF0dGVudGlvbnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmNhdXRpb250aXRsZSxkaXYuY2F1dGlvbnRpdGxlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5jYXV0aW9uLGRpdi5jYXV0aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZGFuZ2VyLGRpdi5kYW5nZXIgewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlcjogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiB0aGluOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmRhbmdlcnRpdGxlLGRpdi5kYW5nZXJ0aXRsZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaW1wb3J0YW50IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uaW1wb3J0YW50dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucmVtZW1iZXIgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5yZW1lbWJlcnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnJlc3RyaWN0aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ucmVzdHJpY3Rpb250aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi53YXJuaW5ndGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYud2FybmluZ2JvZHkgewotCW1hcmdpbi1sZWZ0OiAyZW0KLX0KLQotLm5vdGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5ub3RldGl0bGUsZGl2Lm5vdGV0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5ub3RlYm9keSB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2Lm5vdGVsaXN0dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYuZm5udW0gewotCWZsb2F0OiBsZWZ0OwotfQotCi1kaXYuZm50ZXh0IHsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuc3RlcGwgewotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5zdGVwbG51bSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDAuNWVtOwotfQotCi1kaXYuc3RlcGx0ZXh0IHsKLQltYXJnaW4tbGVmdDogNWVtOwotfQotCi1kaXYuc3RlcGxudW0gewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogMC41ZW07Ci19Ci0KLWRpdi5zdGVwbHRleHQgewotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLWRpdi5sZWRpIHsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYubGVkZXNjIHsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1zcGFuLnBibGt0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5wYmxrbGJsYm94IHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXI6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLX0KLQotc3Bhbi5lZG5vdGljZXN0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4udGVybSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4uaWR4c2hvdyB7Ci0JY29sb3I6IGdyZWVuOwotfQotCi1kaXYuY29kZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi1zcGFuLnJlZmtleSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6IHdoaXRlOwotCWJhY2tncm91bmQtY29sb3I6IGJsYWNrOwotfQotCi10dC5hcGwgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotZGl2LnF1YWxpZnN0YXJ0IHsKLQlwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXItdG9wOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYucXVhbGlmZW5kIHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjFlbSAwLjVlbTsKLQlib3JkZXItYm90dG9tOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi0ubm9zaGFkZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ci19Ci0KLS54bGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS5saWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0IwQjBCMDsKLX0KLQotLm1lZGl1bSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzhDOEM4QzsKLX0KLQotLmRhcmsgewotCWJhY2tncm91bmQtY29sb3I6ICM2RTZFNkU7Ci19Ci0KLS54ZGFyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzU4NTg1ODsKLX0KLQotLmxpZ2h0LXllbGxvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZDQzsKLX0KLQotLmtoYWtpIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQzk5OwotfQotCi0ubWVkaXVtLWJsdWUgewotCWJhY2tncm91bmQtY29sb3I6ICM2Njk5Q0M7Ci19Ci0KLS5saWdodC1ibHVlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0ZGOwotfQotCi0ubWlkLWdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci19Ci0KLS5saWdodC1ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0ubGlnaHRlc3QtZ3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U2RTZFNjsKLX0KLQotI2NoYW5nZWQgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQlsZWZ0OiAwLjJlbTsKLQljb2xvcjogIzdCNjhFRTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotSU5QVVQuYnV0dG9ucyB7Ci0JZm9udC1zaXplOiAwLjc1ZW07Ci0JYm9yZGVyLXRvcDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYm9yZGVyLXJpZ2h0OiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItYm90dG9tOiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItbGVmdDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMjsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotLmNncmFwaGljIHsKLQlmb250LXNpemU6IDkwJTsKLQljb2xvcjogYmxhY2s7Ci19Ci0KLS5haXgsLmhwdXgsLnN1biwudW5peCwud2luMiwud2lubnQsLndpbiwuem9zLC5saW51eCwub3MzOTAsLm9zNDAwLC5jLC5jcGx1c3BsdXMsLmNvYm9sLC5mb3J0cmFuLC5qYXZhLC5tYWNvc3gsLm9zMiwucGwxLC5ycGcKLQl7Ci0JYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQl0ZXh0LWluZGVudDogNTVweDsKLX0KLQotLmFpeCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYWl4LmdpZik7Ci19Ci0KLS5ocHV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdocHV4LmdpZik7Ci19Ci0KLS5zdW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3NvbGFyaXMuZ2lmKTsKLX0KLQotLnVuaXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3VuaXguZ2lmKTsKLX0KLQotLndpbjIgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzIwMDAuZ2lmKTsKLX0KLQotLndpbnhwIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd4cC5naWYpOwotfQotCi0ud2lubnQgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ250LmdpZik7Ci19Ci0KLS53aW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3dpbi5naWYpOwotfQotCi0uem9zIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd6b3MuZ2lmKTsKLX0KLQotLmxpbnV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdsaW51eC5naWYpOwotfQotCi0ub3MzOTAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzM5MC5naWYpOwotfQotCi0ub3M0MDAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzQwMC5naWYpOwotfQotCi0uYyB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYy5naWYpOwotfQotCi0uY3BsdXNwbHVzIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjcHAuZ2lmKTsKLX0KLQotLmNvYm9sIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjb2JvbC5naWYpOwotfQotCi0uZm9ydHJhbiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nZm9ydHJhbi5naWYpOwotfQotCi0uamF2YSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5namF2YS5naWYpOwotfQotCi0ubWFjb3N4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdtYWNvc3guZ2lmKTsKLX0KLQotLm9zMiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nb3MyLmdpZik7Ci19Ci0KLS5wbDEgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3BsMS5naWYpOwotfQotCi0ucnBnIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdycGcuZ2lmKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25ydGwuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9ucnRsLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1MGIwMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25ydGwuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gfCAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA0LCAyMDA1IEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLSAKLS51bnJlc29sdmVkIHsgYmFja2dyb3VuZC1jb2xvcjogc2t5Ymx1ZTsgfQotLm5vVGVtcGxhdGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7IH0KLQotLmJhc2UgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyB9Ci0KLS8qIEFkZCBzcGFjZSBmb3IgdG9wIGxldmVsIHRvcGljcyAqLwotLm5lc3RlZDAgeyBtYXJnaW4tdG9wIDogMWVtO30KLQotLyogZGl2IHdpdGggY2xhc3M9cCBpcyB1c2VkIGZvciBwYXJhZ3JhcGhzIHRoYXQgY29udGFpbiBibG9ja3MsIHRvIGtlZXAgdGhlIFhIVE1MIHZhbGlkICovCi0ucCB7bWFyZ2luLXRvcDogMWVtfQotCi0vKiBEZWZhdWx0IG9mIGl0YWxpY3MgdG8gc2V0IGFwYXJ0IGZpZ3VyZSBjYXB0aW9ucyAqLwotLmZpZ2NhcCB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0uZmlnZGVzYyB7IGZvbnQtc3R5bGU6IG5vcm1hbCB9Ci0KLS8qIFVzZSBAZnJhbWUgdG8gY3JlYXRlIGZyYW1lcyBvbiBmaWd1cmVzICovCi0uZmlnYm9yZGVyIHsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItd2lkdGggOiAycHg7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdzaWRlcyB7IGJvcmRlci1sZWZ0IDogMnB4IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci1yaWdodCA6IDJweCBzb2xpZDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdib3R0b20geyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcGJvdCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLyogTW9zdCBsaW5rIGdyb3VwcyBhcmUgY3JlYXRlZCB3aXRoIDxkaXY+LiBFbnN1cmUgdGhleSBoYXZlIHNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIuICovCi0udWxsaW5rcyB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0udWxjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ub2xjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3QgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3R3aXRoY2hpbGQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1yaWdodDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnN1YmxpbmtsaXN0IHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tcmlnaHQ6IDEuNWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gIH0KLS5yZWxjb25jZXB0cyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWx0YXNrcyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxyZWYgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVsaW5mbyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5icmVhZGNydW1iIHsgZm9udC1zaXplIDogc21hbGxlcjsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5wcmVyZXEgeyBtYXJnaW4tcmlnaHQgOiAyMHB4O30KLQotLyogU2V0IGhlYWRpbmcgc2l6ZXMsIGdldHRpbmcgc21hbGxlciBmb3IgZGVlcGVyIG5lc3RpbmcgKi8KLS50b3BpY3RpdGxlMSB7IG1hcmdpbi10b3A6IDBwYzsgbWFyZ2luLWJvdHRvbTogLjFlbTsgZm9udC1zaXplOiAxLjM0ZW07IH0KLS50b3BpY3RpdGxlMiB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjQ1ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyB9Ci0udG9waWN0aXRsZTMgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC4xN2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNCB7IG1hcmdpbi10b3A6IC44M2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNSB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU2IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnNlY3Rpb250aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMGVtOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDt9Ci0uc2VjdGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5leGFtcGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0vKiBBbGwgbm90ZSBmb3JtYXRzIGhhdmUgdGhlIHNhbWUgZGVmYXVsdCBwcmVzZW50YXRpb24gKi8KLS5ub3RlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5ub3RldGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ubm90ZWxpc3R0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS50aXAgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnRpcHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmZhc3RwYXRoIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5mYXN0cGF0aHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmltcG9ydGFudCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uaW1wb3J0YW50dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVtZW1iZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlbWVtYmVydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVzdHJpY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlc3RyaWN0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uYXR0ZW50aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5hdHRlbnRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXJ0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmNhdXRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5jYXV0aW9uIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi1ib3R0b20gOiAxZW07IH0KLQotLyogU2ltcGxlIGxpc3RzIGRvIG5vdCBnZXQgYSBidWxsZXQgKi8KLXVsLnNpbXBsZSB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0KLS8qIFVzZWQgb24gdGhlIGZpcnN0IGNvbHVtbiBvZiBhIHRhYmxlLCB3aGVuIHJvd2hlYWRlcj0iZmlyc3Rjb2wiIGlzIHVzZWQgKi8KLS5maXJzdGNvbCB7IGZvbnQtd2VpZ2h0IDogYm9sZDt9Ci0KLS8qIFZhcmlvdXMgYmFzaWMgcGhyYXNlIHN0eWxlcyAqLwotLmJvbGQgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmJvbGRJdGFsaWMgeyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uaXRhbGljIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0udW5kZXJsaW5lZCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udWljb250cm9sIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5wYXJtbmFtZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ua3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kZWZrd2QgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS52YXIgeyBmb250LXN0eWxlIDogaXRhbGljO30KLS5zaG9ydGN1dCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLS8qIERlZmF1bHQgb2YgYm9sZCBmb3IgZGVmaW5pdGlvbiBsaXN0IHRlcm1zICovCi0uZGx0ZXJtIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLQotLyogVXNlIENTUyB0byBleHBhbmQgbGlzdHMgd2l0aCBAY29tcGFjdD0ibm8iICovCi0uZGx0ZXJtZXhwYW5kIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi10b3A6IDFlbTsgfQotKltjb21wYWN0PSJ5ZXMiXT5saSB7IG1hcmdpbi10b3A6IDBlbTt9Ci0qW2NvbXBhY3Q9Im5vIl0+bGkgeyBtYXJnaW4tdG9wOiAuNTNlbTt9Ci0ubGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc2xpZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmRsZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmRkZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnN0ZXBleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3Vic3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLyogQWxpZ24gaW1hZ2VzIGJhc2VkIG9uIEBhbGlnbiBvbiB0b3BpYy9pbWFnZSAqLwotZGl2LmltYWdlbGVmdCB7IHRleHQtYWxpZ246IGxlZnQgfQotZGl2LmltYWdlY2VudGVyIHsgdGV4dC1hbGlnbjogY2VudGVyIH0KLWRpdi5pbWFnZXJpZ2h0IHsgdGV4dC1hbGlnbjogcmlnaHQgfQotZGl2LmltYWdlanVzdGlmeSB7IHRleHQtYWxpZ246IGp1c3RpZnkgfQotCi1wcmUuc2NyZWVuIHsgcGFkZGluZzogNXB4IDVweCA1cHggNXB4OyBib3JkZXI6IG91dHNldDsgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsgbWFyZ2luLXRvcDogMnB4OyBtYXJnaW4tYm90dG9tIDogMnB4OyB3aGl0ZS1zcGFjZTogcHJlfQotCi0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3RFeGlzdGluZ1NlcnZlci5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvU2VsZWN0RXhpc3RpbmdTZXJ2ZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThkYmU0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3RFeGlzdGluZ1NlcnZlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvU2VsZWN0TmV3U2VydmVyLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3ROZXdTZXJ2ZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY2YjQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3ROZXdTZXJ2ZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2NGJiOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTIuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTQzNDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUzLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDg3ZDBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzNGJiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTUuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NDYxNGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2U5OUwuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlOTlMLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2YWJkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2U5OUwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlRUo5LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUVKOS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzM1MGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlRUo5LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUlBSS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VJQUkuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmY2MjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUlBSS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VMS0YuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTEtGLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5OGY0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VMS0YuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTzc4LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZU83OC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDc3ZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTzc4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZVU3MS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VVNzEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWUwNDMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZVU3MS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvbm90ZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvbm90ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjYwZGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL25vdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50RFRELnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudERURC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZjI2MGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50RFRELnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudFhTRC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvc2VsZWN0Um9vdEVsZW1lbnRYU0QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTU1ZWQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudFhTRC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxfbWFpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbF9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwNzRlOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbF9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJhY2tidXR0b24uanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmFja2J1dHRvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2QxYzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmFja2J1dHRvbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1iaW5kaW5nLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJpbmRpbmcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTc0ZDU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJpbmRpbmcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItY29tcGxleC10eXBlLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWNvbXBsZXgtdHlwZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDYwNzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItY29tcGxleC10eXBlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWZpbmlzaGVkLXdzZGwuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItZmluaXNoZWQtd3NkbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTYzNDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItZmluaXNoZWQtd3NkbC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctb3BlcmF0aW9uLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1vcGVyYXRpb24uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGMzNGEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1vcGVyYXRpb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXNrZWxldG9uLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1za2VsZXRvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGRiMjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXNrZWxldG9uLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy13aXphcmQuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXdpemFyZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTUzZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXdpemFyZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXRlbGVtZW50LWRpYWxvZy5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXRlbGVtZW50LWRpYWxvZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODE2NWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0ZWxlbWVudC1kaWFsb2cuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0dHlwZS1kaWFsb2cuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0dHlwZS1kaWFsb2cuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTM2YTY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLXNldHR5cGUtZGlhbG9nLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLXNtYXJ0LXJlbmFtZTEuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc21hcnQtcmVuYW1lMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjhhNDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc21hcnQtcmVuYW1lMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWJhY2tidXR0b24uanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1iYWNrYnV0dG9uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5MjYwNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWJhY2tidXR0b24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUxLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjRmNmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MThjNjA2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTMuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2YjZlNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU0LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMTg3ZGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTYyMmVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTYuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNTNiOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTYuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU3LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjc1MjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU3LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTguanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYxNzcyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTkuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU5LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZWVjYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTkuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvbm90aWNlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvbm90aWNlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGI2MDY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL25vdGljZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TElOSyBSRUw9IlNUWUxFU0hFRVQiIEhSRUY9ImJvb2suY3NzIiBDSEFSU0VUPSJJU08tODg1OS0xIgotCVRZUEU9InRleHQvY3NzIj4KLTx0aXRsZT5MZWdhbCBOb3RpY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDM+PGEgTkFNRT0iTm90aWNlcyI+PC9hPk5vdGljZXM8L2gzPgotPHA+VGhlIG1hdGVyaWFsIGluIHRoaXMgZ3VpZGUgaXMgQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kCi1vdGhlcnMgMjAwMCwgMjAwNy48L3A+Ci08cD48YSBocmVmPSJhYm91dC5odG1sIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzCi1ndWlkZS48L2E+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2M2I4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgICA9IE1hc3RlciBVc2VyIERvYyBUT0MKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0OGYzNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9InRvYy54bWwiIHByaW1hcnk9InRydWUiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotCQk8dG9jIGZpbGU9InJlZmVyZW5jZV90b2MueG1sIi8+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3JlZmVyZW5jZV90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcmVmZXJlbmNlX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGI3MjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcmVmZXJlbmNlX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIERlZmluZSB0aGUgdG9wIGxldmVsIHRvcGljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0b2MgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSByZWZlcmVuY2UgaW5mb3JtYXRpb24iPgotICAgPGFuY2hvciBpZD0iY29tbWFuZF9yZWZlcmVuY2UiLz4KLSAgIDxhbmNob3IgaWQ9IlVJX3JlZmVyZW5jZSIvPgotICAgPGFuY2hvciBpZD0iamF2YWRvY19jb21tb24iLz4KLSAgIDxhbmNob3IgaWQ9ImphdmFkb2NfZWpidG9vbHMiLz4KLSAgIDxhbmNob3IgaWQ9ImphdmFkb2NfamVldG9vbHMiLz4KLSAgIDxhbmNob3IgaWQ9ImphdmFkb2Nfc2VydmVydG9vbHMiLz4KLSAgIDxhbmNob3IgaWQ9ImphdmFkb2Nfc291cmNlZWRpdGluZyIvPgotICAgPGFuY2hvciBpZD0iamF2YWRvY194bWwiLz4KLSAgIDxhbmNob3IgaWQ9ImphdmFkb2Nfd2Vic2VydmljZXMiLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQyNzBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIERlZmluZSB0aGUgdG9wIGxldmVsIHRvcGljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTx0b2MgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSBVc2VyIEd1aWRlIgotCXRvcGljPSJ0b3BpY3Mvb3ZlcnZpZXcuaHRtbCI+Ci0KLQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIFdlYiBhcHBsaWNhdGlvbnMiPgotCQk8bGluawotCQkJdG9jPSIuLi9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvd2VidG9vbHNfdG9jLnhtbCIgLz4KLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgSmF2YSBFRSBhbmQgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL2pzdF9qMmVlX3RvYy54bWwiIC8+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2UuanN0LmVqYi5kb2MudXNlci9lamJfdG9jLnhtbCIgLz4KLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iRWRpdGluZyBtYXJrdXAgbGFuZ3VhZ2UgZmlsZXMiCi0JCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCI+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9zc2VfdG9jLnhtbCIgLz4KLQkJPGxpbmsKLQkJCXRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERFZGl0b3JtYXBfdG9jLnhtbCIgLz4KLQkJPGxpbmsKLQkJCXRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwiIC8+Ci0JCTxsaW5rCi0JCQl0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8IS0tIDxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbC5kb2MudXNlci94bWxfdG9jLnhtbCIvPi0tPgotCTx0b3BpYyBsYWJlbD0iRGV2ZWxvcGluZyBXZWIgc2VydmljZSBhcHBsaWNhdGlvbnMiPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLmpzdC53cy5kb2MudXNlci93ZWJzZXJ2aWNlX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IlVzaW5nIHRoZSBzZXJ2ZXIgdG9vbHMiPgotICAJCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5kb2MudXNlci93dHBfbWFpbl90b2MueG1sIiAvPgotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgotICAJCTxsaW5rIHRvYz0icmVmZXJlbmNlX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IkxpbWl0YXRpb25zIGFuZCBLbm93biBJc3N1ZXMiIGhyZWY9InRvcGljcy9saW1pdGF0aW9ucy5odG1sIiAvPgotCTx0b3BpYyBsYWJlbD0iTGVnYWwiIGhyZWY9Im5vdGljZXMuaHRtbCIgLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9saW1pdGF0aW9ucy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL2xpbWl0YXRpb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OTBiZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL2xpbWl0YXRpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIgotCWhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiA+Ci08dGl0bGU+V2ViIFRvb2xzIFBsYXRmb3JtIExpbWl0YXRpb25zIGFuZCBLbm93biBJc3N1ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+V2ViIFRvb2xzIFBsYXRmb3JtIExpbWl0YXRpb25zIGFuZCBLbm93biBJc3N1ZXM8L2gxPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgbGltaXRhdGlvbnMgYW5kIGtub3duIGlzc3Vlczo8L3A+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PGI+V2hlbiB1c2luZyBYRG9jbGV0IHRoZSBnZW5lcmF0aW9uIGRvZXMgbm90IGFwcGVhciB0byBydW4uPC9iPjwvZHQ+Ci08ZGQ+PHA+Q2F1c2U6IFhEb2NsZXQgaGFzIHNvbWUgbGltaXRhdGlvbnMgd2l0aCBsb25nIHBhdGggbmFtZXMuPC9wPgotPHA+U29sdXRpb246IFlvdSBzaG91bGQgaW5zdGFsbCBFY2xpcHNlIGFuZCB0aGUgV2ViIFRvb2xzIFBsYXRmb3JtIGludG8gYSBkaXJlY3Rvcnkgd2l0aCBhIHNob3J0Ci1wYXRoLjwvcD4KLTwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PGI+V2hlbiBjcmVhdGluZyBhIFdlYiBzZXJ2aWNlIHlvdSBtYXkgc2VlIGEgbWVzc2FnZSBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgb25lOjwvYj48L2R0PgotPGRkPjxwPjxzYW1wPm9yZy5hcGFjaGUuYXhpcy51dGlscy5KYXZhVXRpbHMgaXNBdHRhY2htZW50U3VwcG9ydGVkCi1XQVJOSU5HOiBVbmFibGUgdG8gZmluZCByZXF1aXJlZCBjbGFzc2VzIChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIGFuZCAKLWphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU11bHRpcGFydCkuIEF0dGFjaG1lbnQgc3VwcG9ydCBpcyBkaXNhYmxlZC4KLTwvc2FtcD48L3A+Ci08cD5DYXVzZTogQXR0YWNobWVudCBzdXBwb3J0IGlzIGRpc2FibGVkLjwvcD4KLTxwPlNvbHV0aW9uOiBUaGUgQXBhY2hlIEF4aXMgdG9vbHMgc2hvdWxkIGF1dG8tZGV0ZWN0IHRoZSBqYXZheC5hY3RpdmF0aW9uIGNsYXNzZXMgcHJvdmlkZWQgeW91IGFkZCAKLTxzYW1wPmFjdGl2YXRpb24uamFyPC9zYW1wPiB0byB0aGUgYnVpbGQgcGF0aCBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB5b3UgYXJlIGdlbmVyYXRpbmcgeW91ciBXZWIgc2VydmljZSBvciBjbGllbnQuIAotRm9yIHNlcnZpY2VzLCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbWFrZSBzdXJlIDxzYW1wPmFjdGl2YXRpb24uamFyPC9zYW1wPiBpcyBhdmFpbGFibGUgdG8gdGhlIFRvbWNhdCBKUkUsIGVpdGhlciBieSAKLWluY2x1ZGluZyBpdCBpbiB0aGUgc2VydmVyJ3MgZ2xvYmFsIGNsYXNzcGF0aCBvciBieSBwbGFjaW5nIGEgY29weSBvZiBhY3RpdmF0aW9uLmphciBpbnRvIHRoZSB0YXJnZXQgV2ViIAotcHJvamVjdCdzIDxzYW1wPmxpYi88L3NhbXA+IGRpcmVjdG9yeS4KLTwvcD4KLTwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PGI+UHJvYmxlbXMgZW5jb3VudGVyZWQgcHVibGlzaGluZyBmcm9tIGR5bmFtaWMgV2ViIHByb2plY3RzIHdpdGggbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlIGNvbnRleHQgcm9vdDwvYj48L2R0PgotPGRkPgotPHA+Q2F1c2U6IEJ5IGRlZmF1bHQgdGhlIGNvbnRleHQgcm9vdCBvZiBhIGR5bmFtaWMgV2ViIHByb2plY3QgdXNlcyB0aGUgcHJvamVjdCBuYW1lLiBJZiBub24tQVNDSUkgY2hhcmFjdGVycyBhcmUgdXNlZCBhcyBwcm9qZWN0IG5hbWVzIGZvciBkeW5hbWljIFdlYiBwcm9qZWN0cywgCi10aGUgZGVmYXVsdCBjb250ZXh0IHJvb3QgY2F1c2VzIHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIHB1Ymxpc2ggZnJvbSB0aGUgV2ViIHByb2plY3QuPC9wPgotPHA+WW91IG1heSBlbmNvdW50ZXIgdGhlIGZvbGxvd2luZyBlcnJvcnMgaWYgdGhpcyBvY2N1cnM6Ci08dWw+Ci08bGk+SWYgeW91IGNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3Qgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyAobGVhdmluZyB0aGUgY29udGV4dCByb290Ci10byBkZWZhdWx0IHRvIHRoZSBwcm9qZWN0IG5hbWUgY29udGFpbmluZyBub24gQVNDSUkgY2hhcmFjdGVycykgYW5kIHRyeSB0bwotcHVibGlzaCwgeW91IHdpbGwgc2VlIGFuIGVycm9yIG1lc3NhZ2Ugc2ltaWxhciB0byAiVGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlIi48L2xpPgotPGxpPklmIGEgZHluYW1pYyBXZWIgcHJvamVjdCBjb250YWluaW5nIGEgbm9uLUFTQ0lJIGNvbnRleHQgcm9vdCBpcyB1c2VkIGluIGFuIEF4aXMxIFdlYiBzZXJ2aWNlIGNyZWF0aW9uIAotc2NlbmFyaW8sIHlvdSB3aWxsIHNlZSBhbiBlcnJvciBtZXNzYWdlIHNpbWlsYXIgdG8gIlVuYWJsZSB0byBkZXBsb3kgdG8gQXhpcyIuPC9saT4KLTwvdWw+Ci08cD5Tb2x1dGlvbjogVGhlIGZvbGxvd2luZyBBU0NJSSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBpbiB0aGUgY29udGV4dCByb290OiBhbGwgbGV0dGVycywgYWxsIG51bWJlcnMsIGFuIHVuZGVyc2NvcmUsIGEgaHlwaGVuIChkYXNoKSwgYSBmb3J3YXJkIHNsYXNoLCBvciBhIHBlcmlvZC48L3A+Ci08L2RkPgotPC9kbD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b3BpY3Mvb3ZlcnZpZXcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9vdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWI1MWJlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9vdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLQlocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgPgotPHRpdGxlPldlYiBUb29scyBQcm9qZWN0IE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgxPldlYiBUb29scyBQcm9qZWN0IE92ZXJ2aWV3PC9oMT4KLTxwPlRoZSBXZWIgVG9vbHMgUHJvamVjdCBhaW1zIHRvIHByb3ZpZGUgY29tbW9uIGluZnJhc3RydWN0dXJlIGF2YWlsYWJsZQotdG8gYW55IEVjbGlwc2UtYmFzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGFyZ2V0aW5nIFdlYi1lbmFibGVkCi1hcHBsaWNhdGlvbnMuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyZjY5ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjY2Y2U0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL0VkaXRvckR0ZENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSBwbHVnaW46IG9yZy5lY2xpcHNlLndzdC5kdGQudWkgLS0+Ci0KLTxjb250ZXh0cz4KLQk8Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci0JCTxkZXNjcmlwdGlvbiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2VieDAwMjAiPjwhLS0gZHRkIGZpbGVzIHByZWZlcmVuY2UgcGFnZSAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVGhpcyBwYWdlIGxldHMgeW91IGNob29zZSB3aGljaCBzdWZmaXggKDxiPmR0ZDwvYj4sIDxiPmVudDwvYj4sIG9yIDxiPm1vZDwvYj4pIGlzIGFkZGVkIHdoZW4gYSBuZXcgRFREIGZpbGUgaXMgY3JlYXRlZC4KLQkJPC9kZXNjcmlwdGlvbj4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndlYngwMDIxIj48IS0tIGR0ZCBzdHlsZXMgcHJlZmVyZW5jZSBwYWdlIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIHRoYXQgdGhlIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBlZGl0b3IgZG9lcyB3aGVuIHlvdSBhcmUgZWRpdGluZyBhIGZpbGUuCi0KLQkJCVRoZSA8Yj5Db250ZW50IHR5cGU8L2I+IGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgdGhlIHNvdXJjZSB0eXBlcyB0aGF0IHlvdSBjYW4gc2VsZWN0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBlaXRoZXIgc2VsZWN0IHRoZSBjb250ZW50IHR5cGUgdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGggZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QsIG9yIGNsaWNrIHRleHQgaW4gdGhlIHRleHQgc2FtcGxlIHdpbmRvdyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjb250ZW50IHR5cGUgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgdGV4dCBoaWdobGlnaHRpbmcuCi0KLQkJCVRoZSA8Yj5Gb3JlZ3JvdW5kPC9iPiBhbmQgPGI+QmFja2dyb3VuZDwvYj4gcHVzaCBidXR0b25zIG9wZW4gPGI+Q29sb3I8L2I+IGRpYWxvZyBib3hlcyB0aGF0IGFsbG93IHlvdSB0byBzcGVjaWZ5IHRleHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMsIHJlc3BlY3RpdmVseS4gU2VsZWN0IHRoZSA8Yj5Cb2xkPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBhcHBlYXIgaW4gYm9sZC4KLQotCQkJQ2xpY2sgdGhlIDxiPlJlc3RvcmUgRGVmYXVsdDwvYj4gcHVzaCBidXR0b24gdG8gc2V0IHRoZSBoaWdobGlnaHRpbmcgc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWwiCi0JCQlsYWJlbD0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndlYngwMDIyIj48IS0tIGR0ZCB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVRlbXBsYXRlcyBhcmUgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgRFREIGZpbGUgd2hlbiBpdCBpcyBjcmVhdGVkLgotCi0JCQlDbGljayA8Yj5OZXc8L2I+IGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNvbXBsZXRlbHkgbmV3IHRlbXBsYXRlLgotCi0JCQlTdXBwbHkgYSBuZXcgdGVtcGxhdGUgPGI+TmFtZTwvYj4gYW5kIDxiPkRlc2NyaXB0aW9uPC9iPi4gVGhlIDxiPkNvbnRleHQ8L2I+IGZvciB0aGUgdGVtcGxhdGUgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQgYXNzaXN0IGlzIHJlcXVlc3RlZC4gU3BlY2lmeSB0aGUgPGI+UGF0dGVybjwvYj4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuCi0KLQkJCUlmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPGI+SW5zZXJ0IFZhcmlhYmxlPC9iPiBidXR0b24gYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuIEZvciBleGFtcGxlLCB0aGUgPGI+ZGF0ZTwvYj4gdmFyaWFibGUgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZSBpbnNlcnRlZC4KLQotCQkJWW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUgUHJlZmVyZW5jZXMgcGFnZS4KLQotCQkJSWYgeW91IGhhdmUgYSB0ZW1wbGF0ZSB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGNsZWFyIGl0cyBjaGVjayBib3ggaW4gdGhlIDxiPlRlbXBsYXRlczwvYj4gcHJlZmVyZW5jZXMgcGFnZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5odG1sIgotCQkJbGFiZWw9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIiAvPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWwiCi0JCQlsYWJlbD0iQ3JlYXRpbmcgRFREIGZpbGVzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iIj48IS0tIGNyZWF0ZSBkdGQgcGFnZSAxIGhhcyBubyBpZCBhdG0gLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUluIHRoZSA8Yj5GaWxlIG5hbWU8L2I+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBEVEQuIFRoZSBuYW1lIG9mIHlvdXIgRFREIGZpbGUgbXVzdCBlbmQgd2l0aCB0aGUgZXh0ZW5zaW9uIC5kdGQKLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImR0ZHcwMDEwIj48IS0tIGR0ZCBuZXcgZmlsZSB3aXphcmQgcGFnZSAyLCBwYWdlIDEgaGFzIG5vIElEIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlDbGljayB0aGUgPGI+VXNlIERURCBUZW1wbGF0ZTwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRvIHVzZSBhIERURCB0ZW1wbGF0ZSBhcyB0aGUgaW5pdGlhbCBjb250ZW50IGluIHlvdXIgbmV3IERURCBwYWdlLiBBIGxpc3Qgb2YgYXZhaWxhYmxlIERURCB0ZW1wbGF0ZXMgaXMgbGlzdGVkIC0gc2VsZWN0IHRoZSBvbmUgeW91IHdhbnQgdG8gdXNlLiBBIHByZXZpZXcgb2YgeW91ciBEVEQgZmlsZSBpcyBzaG93biBvbmNlIHlvdSBzZWxlY3QgYSBEVEQgdGVtcGxhdGUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuaHRtbCIKLQkJCWxhYmVsPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIgLz4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sIgotCQkJbGFiZWw9IkNyZWF0aW5nIERURCBmaWxlcyIgLz4KLQk8L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL0VkaXRvckR0ZENvbnRleHRzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDRkMjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotPGRlc2NyaXB0aW9uLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJkdGRzb3VyY2Vfc291cmNlX0hlbHBJZCI+Ci08ZGVzY3JpcHRpb24+VGhlIERURCBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbi4KLQotVGhlIGVkaXRvciBwcm92aWRlcyB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMgc3VjaCBhcyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkby4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4YTY2OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwYThkNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgRWRpdG9yRHRkQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBFZGl0b3JEdGRDb250ZXh0czIueG1sCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzUyYmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgICA9IERURCBFZGl0b3IgaW5mb3BvcHMKLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTU3ZmJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvckR0ZENvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JEdGRDb250ZXh0czIueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MGZjOWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcl8xLjAuMC5qYXIKLXRlbXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODZkN2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERFZGl0b3JtYXBfdG9jLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTc3ZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGNvbGxlY3Rpb24tdHlwZT0ic2VxdWVuY2UiIGlkPSJkdGRlZGl0b3JUT0MiIHRpdGxlPSJEVEQgRWRpdG9yIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3b3JrZHRkcy5kaXRhIiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIERURHMiIHR5cGU9ImNvbmNlcHQiPg0KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X2N3b3JrZHRkcyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXRkdGQuZGl0YSIgbGlua2luZz0ibm9ybWFsIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgRFREcyINCi10eXBlPSJ0YXNrIj4NCi08YW5jaG9yIGlkPSJkdGRfcG9zdF90Y3JldGR0ZCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAtIE92ZXJ2aWV3Ig0KLXR5cGU9ImNvbmNlcHQiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iZHRkX3Bvc3RfY2R0ZG92ZXIiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzcmNzdC5kaXRhIiBsaW5raW5nPSJzb3VyY2Vvbmx5IiBuYXZ0aXRsZT0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X2N0ZWR0c3Jjc3QiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RkdGVtcGx0LmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3RkdGVtcGx0Ii8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RpbXB0ZHRkLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgRFREcyIgdHlwZT0idGFzayI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJkdGRfcG9zdF90aW1wdGR0ZCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHZhbGR0ZC5kaXRhIiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBEVERzIiB0eXBlPSJ0YXNrIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X3R2YWxkdGQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JkdGRpY29ucy5kaXRhIiBuYXZ0aXRsZT0iSWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvciINCi10eXBlPSJyZWZlcmVuY2UiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iZHRkX3Bvc3RfcmR0ZGljb25zIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yZHRka2V5LmRpdGEiIG5hdnRpdGxlPSJEVEQgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0cyINCi10eXBlPSJyZWZlcmVuY2UiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0iZHRkX3Bvc3RfcmR0ZGtleSIvPjwvdG9waWNyZWY+DQotPC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDVkOTg4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERFZGl0b3JtYXBfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IkRURCBFZGl0b3IiIHRvcGljPSJ0b3BpY3MvY3dvcmtkdGRzLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggRFREcyIgaHJlZj0idG9waWNzL2N3b3JrZHRkcy5odG1sIj4KLTxhbmNob3IgaWQ9ImR0ZF9wb3N0X2N3b3JrZHRkcyIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBEVERzIiBocmVmPSJ0b3BpY3MvdGNyZXRkdGQuaHRtbCI+Ci08YW5jaG9yIGlkPSJkdGRfcG9zdF90Y3JldGR0ZCIvPgotPHRvcGljIGxhYmVsPSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuaHRtbCIvPgotPGFuY2hvciBpZD0iZHRkX3Bvc3RfY2R0ZG92ZXIiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgaHJlZj0idG9waWNzL3RlZHRzcmNzdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJkdGRfcG9zdF9jdGVkdHNyY3N0Ii8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdGR0ZW1wbHQuaHRtbCIvPgotPGFuY2hvciBpZD0iZHRkX3Bvc3RfdGR0ZW1wbHQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkltcG9ydGluZyBEVERzIiBocmVmPSJ0b3BpY3MvdGltcHRkdGQuaHRtbCIvPgotPGFuY2hvciBpZD0iZHRkX3Bvc3RfdGltcHRkdGQiLz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBEVERzIiBocmVmPSJ0b3BpY3MvdHZhbGR0ZC5odG1sIi8+Ci08YW5jaG9yIGlkPSJkdGRfcG9zdF90dmFsZHRkIi8+Ci08dG9waWMgbGFiZWw9Ikljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3IiIGhyZWY9InRvcGljcy9yZHRkaWNvbnMuaHRtbCIvPgotPGFuY2hvciBpZD0iZHRkX3Bvc3RfcmR0ZGljb25zIi8+Ci08dG9waWMgbGFiZWw9IkRURCBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzIiBocmVmPSJ0b3BpY3MvcmR0ZGtleS5odG1sIi8+Ci08YW5jaG9yIGlkPSJkdGRfcG9zdF9yZHRka2V5Ii8+Ci08L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFREcmVmdGFibGUuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERyZWZ0YWJsZS5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDViMDMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERyZWZ0YWJsZS5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiIgIm1hcC5kdGQiPg0KLTxtYXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXRkdGQuZGl0YSIgbGlua2luZz0ibm9ybWFsIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBuZXcgRFREIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jZHRkb3Zlci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIC0gT3ZlcnZpZXciDQotdHlwZT0iY29uY2VwdCI+PC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuZGl0YSIgbmF2dGl0bGU9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAtIE92ZXJ2aWV3Ig0KLXR5cGU9ImNvbmNlcHQiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dmFsZHRkLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIERURHMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXRkdGQuZGl0YSIgbGlua2luZz0ibm9ybWFsIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBuZXcgRFREIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZHRlbXBsdC5kaXRhIiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RURHJlZnRhYmxlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERyZWZ0YWJsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZGQzMGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RURHJlZnRhYmxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgdG9waWM9InRvcGljcy90Y3JldGR0ZC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgRFREcyIgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldyIgaHJlZj0idG9waWNzL2NkdGRvdmVyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldyIgaHJlZj0idG9waWNzL2NkdGRvdmVyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBEVERzIiBocmVmPSJ0b3BpY3MvdHZhbGR0ZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIERURHMiIGhyZWY9InRvcGljcy90Y3JldGR0ZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdGR0ZW1wbHQuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRG9jQnVpbGQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkNzMzYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRG9jQnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tIAotCi0JVGhpcyBzY3JpcHQgYnVpbGQgdGhlIEhlbHAgcGx1Zy1pbiBieSB0cmFuc2Zvcm1pbmcgdGhlIERJVEEgc291cmNlIGZpbGVzIGludG8gSFRNTC4KLQkKLQlUbyB1c2UgdGhpcyBzY3JpcHQsIHlvdSBtdXN0IGluc3RhbGwgRElUQS1PVCBvbiB5b3VyIG1hY2hpbmUgaW4gdGhlIGRpcmVjdG9yeQotCWRlZmluZWQgYnkgdGhlIGRpdGEub3QuZGlyIHByb3BlcnR5LgotCQotCVJ1biB0aGUgZGVmYXVsdCB0YXJnZXQgYWZ0ZXIgeW91IGVkaXQgdGhlIERJVEEgc291cmNlIGZpbGVzIHRvIHJlZ2VuZXJhdGUgdGhlIEhUTUwuCi0JCi0JVG8gY3VzdG9taXplIHRoaXMgc2NyaXB0IGZvciBvdGhlciBIZWxwIHBsdWctaW5zLCBtb2RpZnkgdGhlIHZhbHVlIG9mIHRoZSBhcmdzLmlucHV0IHByb3BlcnR5Ci0JdG8gYmUgdGhlIERJVEEgbWFwIGZpbGUgZm9yIHRoZSBwbHVnLWluLgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCBsaW5rcyB0byBzaWJsaW5nIEhlbHAgcGx1Zy1pbnMgaGF2ZSBzY29wZT0icGVlciIsIG90aGVyd2lzZSB0aGUKLQlvdXRwdXQgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aWxsIGJlIHNoaWZ0ZWQgaW5jb3JyZWN0bHkuCi0JCi0JTk9URTogVGhpcyBzY3JpcHQgYXNzdW1lcyB0aGF0IHlvdSBoYW5kIGNvZGUgeW91ciBwbHVnaW4ueG1sIGZpbGUgaW4gbXlwbHVnaW4ueG1sLiBUaGlzIGZpbGUKLQl3aWxsIGJlIGNvcGllZCBvdmVyIHRoZSBnZW5lcmF0ZWQgcGx1Z2luLnhtbCB3aGljaCBpcyBjdXJyZW50bHkgbm90IGJlaW5nIGdlbmVyYXRlZCBjb3JyZWN0bHkKLQlieSBESVRBLU9ULgotCQotCUNoYW5nZUxvZzoKLQkyMDA2LTA0LTA1IEFydGh1ciBSeW1hbiA8cnltYW5AY2EuaWJtLmNvbT4KLQktIENyZWF0ZWQuCi0JMjAwOC0wMS0wOSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgZm9yIG5ldyBESVRBLU9UIHZlcnNpb24KLQkyMDA4LTA1LTA1IEthdGUgUHJpY2UgPGthdGVwQGNhLmlibS5jb20+Ci0JLSBtb2RpZmllZCB0byBhZGQgZ2VuZXJhdGlvbiBvZiBwcmUtYnVpbHQgaGVscCBpbmRleC4gCi0JLSBNdXN0IGRlbGV0ZSAvaW5kZXggZm9sZGVyIGJlZm9yZSBydW5uaW5nIGJ1aWxkCi0tLT4KLTxwcm9qZWN0IG5hbWU9ImVjbGlwc2VoZWxwIiBkZWZhdWx0PSJhbGwiPgotCi0JPHByb3BlcnR5IG5hbWU9ImRpdGEub3QuZGlyIiBsb2NhdGlvbj0iQzovRElUQS1PVDEuMi4yIiAvPgotCi0JPHBhdGggaWQ9ImRvc3QuY2xhc3MucGF0aCI+Ci0JCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtkaXRhLm90LmRpcn0ke2ZpbGUuc2VwYXJhdG9yfWxpYiR7ZmlsZS5zZXBhcmF0b3J9ZG9zdC5qYXIiIC8+Ci0JPC9wYXRoPgotCi0JPHRhc2tkZWYgbmFtZT0iaW50ZWdyYXRlIiBjbGFzc25hbWU9Im9yZy5kaXRhLmRvc3QucGxhdGZvcm0uSW50ZWdyYXRvclRhc2siPgotCQk8Y2xhc3NwYXRoIHJlZmlkPSJkb3N0LmNsYXNzLnBhdGgiIC8+Ci0JPC90YXNrZGVmPgotCTx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJpbnRlZ3JhdGUsIGVjbGlwc2VoZWxwIj4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImludGVncmF0ZSI+Ci0JCTxpbnRlZ3JhdGUgZGl0YWRpcj0iJHtkaXRhLm90LmRpcn0iIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIHJldmlzZSBiZWxvdyBoZXJlIC0tPgotCTx0YXJnZXQgbmFtZT0iZWNsaXBzZWhlbHAiPgotCQk8YW50IGFudGZpbGU9IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1jb25kdWN0b3IueG1sIiB0YXJnZXQ9ImluaXQiIGRpcj0iJHtkaXRhLm90LmRpcn0iPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuY29weWNzcyIgdmFsdWU9Im5vIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuY3NzcGF0aCIgdmFsdWU9Ii4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlciIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmVjbGlwc2UucHJvdmlkZXIiIHZhbHVlPSJFY2xpcHNlLm9yZyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmVjbGlwc2UudmVyc2lvbiIgdmFsdWU9IjMuMy4wIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuaW5wdXQiIGxvY2F0aW9uPSJEVERyZWZ0YWJsZS5kaXRhbWFwIiAvPiAgICAJCQotCQkJPHByb3BlcnR5IG5hbWU9ImNsZWFuLnRlbXAiIHZhbHVlPSJ0cnVlIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEuZXh0bmFtZSIgdmFsdWU9Ii5kaXRhIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImRpdGEudGVtcC5kaXIiIGxvY2F0aW9uPSJ0ZW1wIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC5kaXIiIGxvY2F0aW9uPSIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0idHJhbnN0eXBlIiB2YWx1ZT0iZWNsaXBzZWhlbHAiIC8+Ci0JCTwvYW50PgotCQk8Y29weSBmaWxlPSJteXBsdWdpbi54bWwiIHRvZmlsZT0icGx1Z2luLnhtbCIgb3ZlcndyaXRlPSJ5ZXMiIC8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJidWlsZC5pbmRleCIgZGVzY3JpcHRpb249IkJ1aWxkcyBzZWFyY2ggaW5kZXggZm9yIHRoZSBwbHVnLWluIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkgICAgIDxoZWxwLmJ1aWxkSGVscEluZGV4IG1hbmlmZXN0PSJwbHVnaW4ueG1sIiBkZXN0aW5hdGlvbj0iLiIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQwMDMzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC40MDAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmFhZWRkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gRFRERWRpdG9ybWFwX3RvYy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvKi5odG0qLFwKLSAgICAgICAgICAgICAgIGluZGV4LyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotCQkgICAgICAgKi5tYXBsaXN0LFwKLSAgICAgICAgICAgICAgICouZGl0YW1hcCxcCi0JCSAgICAgICB0b3BpY3MvKi5kaXRhCi1iaW4uZXhjbHVkZXMgPSBEb2NCdWlsZC54bWwsXAotICAgICAgICAgICAgICAgbXlQbHVnaW4qLnhtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0NvbW1lbnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfQ29tbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjExZDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfQ29tbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbGVtZW50LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0ODg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRW50aXR5LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDE1MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmE5YjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9Ob3RhdGlvbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9Ob3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWQwODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfTm90YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWJhODI1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjNmOTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2F0dHJpYnV0ZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Y2RlOTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGVfbGlzdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2F0dHJpYnV0ZV9saXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmMDI5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2F0dHJpYnV0ZV9saXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbkRUREZpbGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uRFRERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTkxNDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hbnkuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxN2Q5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uZW1wdHkuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uZW1wdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTllM2Q0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmVtcHR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL29yZ2FuaXplX2R0ZF9sb2dpY2FsbHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTNjNmJhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3NvcnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9zb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjNWQwYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3NvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L185LmNmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9fOS5jZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGM5MWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L185LmNmcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvZGVsZXRhYmxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTNmNDcwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfY29udHJpYnV0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExYWMyNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIE1heSAxNCAxODoyNDoyMCBFRFQgMjAwOA0KLW9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXI9b3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlclxuMS4wLjQwMC5xdWFsaWZpZXINCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjE2N2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIE1heSAxNCAxODoyNDoyMCBFRFQgMjAwOA0KLWx1Y2VuZT0xLjkuMS52MjAwODAzMDYxODExDQotYW5hbHl6ZXI9b3JnLmVjbGlwc2UuaGVscC5iYXNlXCMzLjMuMTAwLnYyMDA4MDQyNT9sb2NhbGVcPWVuDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGY3MzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgTWF5IDE0IDE4OjI0OjIwIEVEVCAyMDA4DQotL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRrZXkuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrZHRkcy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHRkdGQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRkaWNvbnMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2YWxkdGQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWw9MA0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9zZWdtZW50cyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbmRleC9zZWdtZW50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4NmQ2MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvbXlwbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiZDdiYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjEiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgPHRvYyBmaWxlPSJEVERFZGl0b3JtYXBfdG9jLnhtbCIvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLSAgPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0JCTxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+ICAgICAKLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UubHVjZW5lU2VhcmNoUGFydGljaXBhbnRzIj4KLSAgICAgIDxiaW5kaW5nIHBhcnRpY2lwYW50SWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS54aHRtbCIvPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci5tYXBsaXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2NiZDcyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxtYXBsaXN0IHZlcnNpb249IjMuNi4yIj4NCi0gIDxuYXY+DQotICAgIDxtYXAgZmlsZT0iRFRERWRpdG9ybWFwX3RvYy5kaXRhbWFwIi8+DQotICA8L25hdj4NCi0gIDxsaW5rPg0KLSAgICA8bWFwIGZpbGU9IkRUREVkaXRvcm1hcF90b2MuZGl0YW1hcCIvPg0KLSAgICA8bWFwIGZpbGU9IkRURHJlZnRhYmxlLmRpdGFtYXAiLz4NCi0gIDwvbGluaz4NCi08L21hcGxpc3Q+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkYWIyZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJEVERzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y3JldGR0ZC5odG1sI3RjcmV0ZHRkIiB0aXRsZT0iQ3JlYXRpbmcgRFREcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuaHRtbCNjZHRkb3ZlciIgdGl0bGU9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJoaWdobGlnaHRpbmcgc3R5bGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNyY3N0Lmh0bWwjdHRhZ2hpbHQiIHRpdGxlPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgdGVtcGxhdGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGR0ZW1wbHQuaHRtbCN0d21hY3JvIiB0aXRsZT0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBvcnRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90aW1wdGR0ZC5odG1sI3RpbXB0ZHRkIiB0aXRsZT0iSW1wb3J0aW5nIERURHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0b3IgaWNvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yZHRkaWNvbnMuaHRtbCNyaWNvbnMiIHRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJEVEQgaGlnaGxpZ2h0aW5nIHN0eWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRzcmNzdC5odG1sI3R0YWdoaWx0IiB0aXRsZT0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0ZW1wbGF0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJEVEQiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZHRlbXBsdC5odG1sI3R3bWFjcm8iIHRpdGxlPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJEVEQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2YWxpZGF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHZhbGR0ZC5odG1sI3R2YWxkdGQiIHRpdGxlPSJWYWxpZGF0aW5nIERURHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRFREIGVkaXRvciI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImtleWJvYXJkIHNob3J0Y3V0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3JkdGRrZXkuaHRtbCNrZXlib2FyZHNob3J0Y3V0c2ludGhlZHRkZWRpdG9yIiB0aXRsZT0iRFREIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ia2V5Ym9hcmQgc2hvcnRjdXRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRFREIGVkaXRvciI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3JkdGRrZXkuaHRtbCNrZXlib2FyZHNob3J0Y3V0c2ludGhlZHRkZWRpdG9yIiB0aXRsZT0iRFREIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotPC9pbmRleD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMGNlODYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wbHVnaW5OYW1lICAgICA9IERURCBFZGl0b3IgZG9jdW1lbnRhdGlvbgotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiZDdiYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4xIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgIDx0b2MgZmlsZT0iRFRERWRpdG9ybWFwX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotCQk8aW5kZXggZmlsZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCIvPiAgICAgCi0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLmx1Y2VuZVNlYXJjaFBhcnRpY2lwYW50cyI+Ci0gICAgICA8YmluZGluZyBwYXJ0aWNpcGFudElkPSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UueGh0bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMGE5OTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjZHRkb3ZlciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIC0gb3ZlcnZpZXc8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgcHJvdmlkZXMgeW91IHdpdGggdGhlIG1lYW5zIHRvDQotdmFsaWRhdGUgWE1MIGZpbGVzIGFnYWluc3QgYSBzZXQgb2YgcnVsZXMuIFdoZW4geW91IGNyZWF0ZSBhIERURCBmaWxlLCB5b3UNCi1jYW4gc3BlY2lmeSBydWxlcyB0aGF0IGNvbnRyb2wgdGhlIHN0cnVjdHVyZSBvZiBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlDQotdGhlIERURCBmaWxlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkRURHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPkEgRFREIGNhbiBjb250YWluIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgbm90YXRpb25zLA0KLWFuZCBlbnRpdGllcyBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIEl0IGFsc28gZXN0YWJsaXNoZXMNCi1jb25zdHJhaW50cyBmb3IgaG93IGVhY2ggZWxlbWVudCwgYXR0cmlidXRlLCBub3RhdGlvbiwgYW5kIGVudGl0eSBjYW4gYmUgdXNlZA0KLXdpdGhpbiBhbnkgb2YgdGhlIFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuPC9wPg0KLTxwPlRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgdGhlIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkNCi1hIERURCAob3IgYW4gWE1MIHNjaGVtYSksIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQNCi0ob3IgWE1MIHNjaGVtYSkuPC9wPg0KLTxwPkNlcnRhaW4gWE1MIHBhcnNlcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZWFkIERURHMgYW5kIGNoZWNrIHRvIHNlZSBpZiB0aGUNCi1YTUwgZmlsZSBpdCBpcyByZWFkaW5nIGZvbGxvd3MgYWxsIG9mIHRob3NlIHJ1bGVzLiBXaGlsZSB0aGUgcGFyc2VyIGlzIHJlYWRpbmcNCi10aGUgWE1MIGZpbGUsIGl0IHdpbGwgY2hlY2sgZWFjaCBsaW5lIHRvIGJlIHN1cmUgdGhhdCBpdCBjb25mb3JtcyB0byB0aGUgcnVsZXMNCi10aGF0IGFyZSBsYWlkIG91dCBpbiB0aGUgRFREIGZpbGUuIElmIHRoZXJlIGlzIGEgcHJvYmxlbSwgdGhlIHBhcnNlciBnZW5lcmF0ZXMNCi1hbiBlcnJvciBhbmQgcG9pbnRzIHRvIHdoZXJlIHRoZSBlcnJvciBvY2N1cnMgaW4gdGhlIFhNTCBmaWxlLiBUaGlzIGtpbmQgb2YNCi1wYXJzZXIgaXMgY2FsbGVkIGEgdmFsaWRhdGluZyBwYXJzZXIgYmVjYXVzZSBpdCB2YWxpZGF0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlDQotWE1MIGZpbGUgYWdhaW5zdCB0aGUgRFRELjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY2R0ZG92ZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY2R0ZG92ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhOTVmZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBtZWFucyB0byB2YWxpZGF0ZSBYTUwgZmlsZXMgYWdhaW5zdCBhIHNldCBvZiBydWxlcy4gV2hlbiB5b3UgY3JlYXRlIGEgRFREIGZpbGUsIHlvdSBjYW4gc3BlY2lmeSBydWxlcyB0aGF0IGNvbnRyb2wgdGhlIHN0cnVjdHVyZSBvZiBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgcHJvdmlkZXMgeW91IHdpdGggdGhlIG1lYW5zIHRvIHZhbGlkYXRlIFhNTCBmaWxlcyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBEVEQgZmlsZSwgeW91IGNhbiBzcGVjaWZ5IHJ1bGVzIHRoYXQgY29udHJvbCB0aGUgc3RydWN0dXJlIG9mIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRFREcywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHZhbGR0ZC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNkdGRvdmVyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIC0gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNkdGRvdmVyIj48YSBuYW1lPSJjZHRkb3ZlciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgcHJvdmlkZXMgeW91IHdpdGggdGhlIG1lYW5zIHRvCi12YWxpZGF0ZSBYTUwgZmlsZXMgYWdhaW5zdCBhIHNldCBvZiBydWxlcy4gV2hlbiB5b3UgY3JlYXRlIGEgRFREIGZpbGUsIHlvdQotY2FuIHNwZWNpZnkgcnVsZXMgdGhhdCBjb250cm9sIHRoZSBzdHJ1Y3R1cmUgb2YgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZQotdGhlIERURCBmaWxlLjwvcD4KLQotPHA+QSBEVEQgY2FuIGNvbnRhaW4gZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBub3RhdGlvbnMsCi1hbmQgZW50aXRpZXMgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiBJdCBhbHNvIGVzdGFibGlzaGVzCi1jb25zdHJhaW50cyBmb3IgaG93IGVhY2ggZWxlbWVudCwgYXR0cmlidXRlLCBub3RhdGlvbiwgYW5kIGVudGl0eSBjYW4gYmUgdXNlZAotd2l0aGluIGFueSBvZiB0aGUgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS48L3A+Ci0KLTxwPlRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgdGhlIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkKLWEgRFREIChvciBhbiBYTUwgc2NoZW1hKSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURAotKG9yIFhNTCBzY2hlbWEpLjwvcD4KLQotPHA+Q2VydGFpbiBYTUwgcGFyc2VycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlYWQgRFREcyBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZQotWE1MIGZpbGUgaXQgaXMgcmVhZGluZyBmb2xsb3dzIGFsbCBvZiB0aG9zZSBydWxlcy4gV2hpbGUgdGhlIHBhcnNlciBpcyByZWFkaW5nCi10aGUgWE1MIGZpbGUsIGl0IHdpbGwgY2hlY2sgZWFjaCBsaW5lIHRvIGJlIHN1cmUgdGhhdCBpdCBjb25mb3JtcyB0byB0aGUgcnVsZXMKLXRoYXQgYXJlIGxhaWQgb3V0IGluIHRoZSBEVEQgZmlsZS4gSWYgdGhlcmUgaXMgYSBwcm9ibGVtLCB0aGUgcGFyc2VyIGdlbmVyYXRlcwotYW4gZXJyb3IgYW5kIHBvaW50cyB0byB3aGVyZSB0aGUgZXJyb3Igb2NjdXJzIGluIHRoZSBYTUwgZmlsZS4gVGhpcyBraW5kIG9mCi1wYXJzZXIgaXMgY2FsbGVkIGEgdmFsaWRhdGluZyBwYXJzZXIgYmVjYXVzZSBpdCB2YWxpZGF0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlCi1YTUwgZmlsZSBhZ2FpbnN0IHRoZSBEVEQuPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90dmFsZHRkLmh0bWwiIHRpdGxlPSJWYWxpZGF0aW5nIGEgRFREIGZpbGUgbGV0cyB5b3UgdmVyaWZ5IHRoYXQgaXQgaXMgd2VsbCBmb3JtZWQgYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IGVycm9ycy4iPlZhbGlkYXRpbmcgRFREczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrZHRkcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4NTBkNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrZHRkcy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIiAgImNvbmNlcHQuZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTxjb25jZXB0IGlkPSJ3b3JraW5nd2l0aGR0ZHMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtpbmcgd2l0aCBEVERzPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3Nob3J0ZGVzYz4NCi08Y29uYm9keT48L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAwMzk1Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrZHRkcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0NzhiNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrZHRkcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIERURHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6IiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXRkdGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RpbXB0ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90dmFsZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9yZHRkaWNvbnMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3JkdGRrZXkuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ3b3JraW5nd2l0aGR0ZHMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggRFREczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya2luZ3dpdGhkdGRzIj48YSBuYW1lPSJ3b3JraW5nd2l0aGR0ZHMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmtpbmcgd2l0aCBEVERzPC9oMT4KLQotCi08ZGl2PjxwPlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci08L2Rpdj4KLQotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JldGR0ZC5odG1sIj5DcmVhdGluZyBEVERzPC9hPjwvc3Ryb25nPjxiciAvPgotQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGltcHRkdGQuaHRtbCI+SW1wb3J0aW5nIERURHM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1JZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggRFREIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUgRFREIGVkaXRvci48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdHZhbGR0ZC5odG1sIj5WYWxpZGF0aW5nIERURHM8L2E+PC9zdHJvbmc+PGJyIC8+Ci1WYWxpZGF0aW5nIGEgRFREIGZpbGUgbGV0cyB5b3UgdmVyaWZ5IHRoYXQgaXQgaXMgd2VsbCBmb3JtZWQgYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IGVycm9ycy48L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvcmR0ZGljb25zLmh0bWwiPkljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3I8L2E+PC9zdHJvbmc+PGJyIC8+Ci1UaGVzZSBEVEQgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSB2aWV3LjwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9Ii4uL3RvcGljcy9yZHRka2V5Lmh0bWwiPkRURCBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGljb25zLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRpY29ucy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWEzZTE5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGljb25zLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIg0KLSAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmljb25zIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5JY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5JY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZXNlIERURCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIHZpZXcuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREczxpbmRleHRlcm0+ZWRpdG9yIGljb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTx0YWJsZT4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMwIi8+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzEiLz4NCi08dGhlYWQ+DQotPHJvdz4NCi08ZW50cnk+SWNvbiZuYnNwOzwvZW50cnk+DQotPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvbmFueS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBBTlkgY29udGVudA0KLWljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5BTlkgY29udGVudCAoY29udGVudCBtb2RlbCk8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvYXR0cmlidXRlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZQ0KLWljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvYXR0cmlidXRlX2xpc3QuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1hdHRyaWJ1dGUgbGlzdCBpY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+YXR0cmlidXRlIGxpc3Q8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL0FERF9Db21tZW50LmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgY29tbWVudCBpY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSI+Y29tbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQ2hvaWNlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGNvbnRlbnQNCi1tb2RlbCAtIGNob2ljZSBpY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5jb250ZW50IG1vZGVsIC0gY2hvaWNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBjb250ZW50DQotbW9kZWwgLSBzZXF1ZW5jZSBpY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5jb250ZW50IG1vZGVsIC0gc2VxdWVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQUREX0VsZW1lbnQuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgZWxlbWVudA0KLWljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5lbGVtZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9uZW1wdHkuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgRU1QVFkNCi1jb250ZW50IChjb250ZW50IG1vZGVsKSBpY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+RU1QVFkgY29udGVudCAoY29udGVudCBtb2RlbCk8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQUREX0VudGl0eS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBlbnRpdHkNCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+ZW50aXR5PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL0FERF9Ob3RhdGlvbi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBub3RhdGlvbg0KLWljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5ub3RhdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYw0KLWlzIHRoZSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZSBpY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5wYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZTwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTxzZWN0aW9uPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRkaWNvbnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGljb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MGIzOTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRkaWNvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlc2UgRFREIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgdmlldy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlc2UgRFREIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgdmlldy4iIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBlZGl0b3IgaWNvbnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBlZGl0b3IgaWNvbnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIC8+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRka2V5LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRrZXkuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1N2ZhNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRrZXkuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iDQotICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJrZXlib2FyZHNob3J0Y3V0c2ludGhlZHRkZWRpdG9yIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPkRURCBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzPC90aXRsZT4NCi08c2hvcnRkZXNjIG91dHB1dGNsYXNzPSJpZF9zaG9ydGRlc2MiPjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkRURCBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPGluZGV4dGVybT5EVEQgZWRpdG9yPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTx0YWJsZSBmcmFtZT0iYWxsIj4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDEiIGNvbHdpZHRoPSI4NCoiLz48Y29sc3BlYyBjb2xuYW1lPSJjb2wzIg0KLWNvbHdpZHRoPSI5MyoiLz4NCi08dGhlYWQ+DQotPHJvdyB2YWxpZ249ImJvdHRvbSI+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPktleSBDb21iaW5hdGlvbjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPkZ1bmN0aW9uPC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5TaGlmdCtBbHQrVXAgQXJyb3c8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wzIj5FeHBhbmQgc2VsZWN0aW9uIHRvIGVuY2xvc2luZyBlbGVtZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5TaGlmdCtBbHQrUmlnaHQgQXJyb3c8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wzIj5FeHBhbmQgc2VsZWN0aW9uIHRvIG5leHQgZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+U2hpZnQrQWx0K0xlZnQgQXJyb3c8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wzIj5FeHBhbmQgc2VsZWN0aW9uIHRvIHByZXZpb3VzIGVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPlNoaWZ0K0FsdCtEb3duIEFycm93PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+UmVzdG9yZSBsYXN0IHNlbGVjdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+Q3RybCtTaGlmdCtQPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+R28gdG8gbWF0Y2hpbmcgYnJhY2tldDwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRrZXkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGtleS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzBhNjU2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGtleS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEVEQgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSIiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIiAvPgotPG1ldGEgY29udGVudD0iRFREIGVkaXRvciwga2V5Ym9hcmQgc2hvcnRjdXRzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRFREIGVkaXRvciwga2V5Ym9hcmQgc2hvcnRjdXRzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3b3JrZHRkcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImtleWJvYXJkc2hvcnRjdXRzaW50aGVkdGRlZGl0b3IiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EVEQgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ia2V5Ym9hcmRzaG9ydGN1dHNpbnRoZWR0ZGVkaXRvciI+PGEgbmFtZT0ia2V5Ym9hcmRzaG9ydGN1dHNpbnRoZWR0ZGVkaXRvciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJpZF90aXRsZSI+RFREIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHM8L2gxPgotCi0KLQotPGRpdj48cCBjbGFzcz0iaWRfc2hvcnRkZXNjIiAvPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0aGVhZCBhbGlnbj0ibGVmdCI+Ci08dHIgdmFsaWduPSJib3R0b20iPgotPHRoIHZhbGlnbj0iYm90dG9tIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBpZD0iTjEwMDY4Ij5LZXkgQ29tYmluYXRpb248L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIHdpZHRoPSI1Mi41NDIzNzI4ODEzNTU5NCUiIGlkPSJOMTAwNkYiPkZ1bmN0aW9uPC90aD4KLQotPC90cj4KLQotPC90aGVhZD4KLQotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBoZWFkZXJzPSJOMTAwNjggIj5TaGlmdCtBbHQrVXAgQXJyb3c8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Mi41NDIzNzI4ODEzNTU5NCUiIGhlYWRlcnM9Ik4xMDA2RiAiPkV4cGFuZCBzZWxlY3Rpb24gdG8gZW5jbG9zaW5nIGVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA2OCAiPlNoaWZ0K0FsdCtSaWdodCBBcnJvdzwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaGVhZGVycz0iTjEwMDZGICI+RXhwYW5kIHNlbGVjdGlvbiB0byBuZXh0IGVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA2OCAiPlNoaWZ0K0FsdCtMZWZ0IEFycm93PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwNkYgIj5FeHBhbmQgc2VsZWN0aW9uIHRvIHByZXZpb3VzIGVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA2OCAiPlNoaWZ0K0FsdCtEb3duIEFycm93PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwNkYgIj5SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBoZWFkZXJzPSJOMTAwNjggIj5DdHJsK1NoaWZ0K1A8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI1Mi41NDIzNzI4ODEzNTU5NCUiIGhlYWRlcnM9Ik4xMDA2RiAiPkdvIHRvIG1hdGNoaW5nIGJyYWNrZXQ8L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9jd29ya2R0ZHMuaHRtbCIgdGl0bGU9IlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiPldvcmtpbmcgd2l0aCBEVERzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmOGNlMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRjcmV0ZHRkIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBEVERzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5DcmVhdGluZyBhIG5ldyBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCk8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4NCi1iZSB1c2VkIHRvIHZhbGlkYXRlIGFuIFhNTCBmaWxlLiBBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgRFRELCB5b3UgY2FuIGVkaXQNCi1pdCBtYW51YWxseSwgYWRkaW5nIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgZW50aXRpZXMsDQotYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZQ0KLURURCBmaWxlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkRURHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gY3JlYXRlIGEgbmV3DQotRFRELCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGEgcHJvamVjdCB0byBjb250YWluIHRoZSBEVEQgaWYgbmVlZGVkLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSB3b3JrYmVuY2gsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGU8L3VpY29udHJvbD4NCi08dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+T3RoZXI8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+IERURDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LiBDbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIERURC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5GaWxlIG5hbWU8L3VpY29udHJvbD4gZmllbGQsIHR5cGUgdGhlIG5hbWUgb2YNCi10aGUgRFRELCBmb3IgZXhhbXBsZSA8dXNlcmlucHV0Pk15RFRELmR0ZDwvdXNlcmlucHV0Pi48L2NtZD48aW5mbz5UaGUgbmFtZQ0KLW9mIHlvdXIgRFREIGZpbGUgbXVzdCBlbmQgd2l0aCB0aGUgZXh0ZW5zaW9uIDx1c2VyaW5wdXQ+LmR0ZDwvdXNlcmlucHV0PjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPllvdSBjYW4gdXNlIGEgRFREIHRlbXBsYXRlIGFzIHRoZSBiYXNpcyBmb3INCi15b3VyIG5ldyBEVEQgZmlsZS4gVG8gZG8gc28sIGNsaWNrIHRoZSA8dWljb250cm9sPlVzZSBEVEQgVGVtcGxhdGU8L3VpY29udHJvbD4gY2hlY2sNCi1ib3gsIGFuZCBzZWxlY3QgdGhlIHRlbXBsYXRlIHlvdSB3YW50IHRvIHVzZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPlRoZSBEVEQgYXBwZWFycyBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGF1dG9tYXRpY2FsbHksIGJ5IGRlZmF1bHQsDQotb3BlbnMgaW4gdGhlIERURCBlZGl0b3IuIEluIHRoZSBEVEQgZWRpdG9yLCB5b3UgY2FuIG1hbnVhbGx5IGFkZCBlbGVtZW50cywNCi1hdHRyaWJ1dGVzLCBub3RhdGlvbnMsIGVudGl0aWVzLCBhbmQgY29tbWVudHMgdG8gdGhlIERURC4gSWYgeW91IGNsb3NlIHRoZQ0KLWZpbGUsIGFuZCB3YW50IHRvIGxhdGVyIHJlLW9wZW4gaXQgaW4gdGhlIERURCBlZGl0b3IsIGRvdWJsZS1jbGljayBpdCBpbiB0aGUNCi1OYXZpZ2F0b3Igdmlldy48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmI2OTMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIERURHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NkdGRvdmVyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZHRlbXBsdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRjcmV0ZHRkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBuZXcgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0Y3JldGR0ZCI+PGEgbmFtZT0idGNyZXRkdGQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIERURHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGNvbnRhaW5zIGEgc2V0IG9mIHJ1bGVzIHRoYXQgY2FuCi1iZSB1c2VkIHRvIHZhbGlkYXRlIGFuIFhNTCBmaWxlLiBBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgRFRELCB5b3UgY2FuIGVkaXQKLWl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywKLWFuZCBub3RhdGlvbnMsIGFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUKLURURCBmaWxlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcKLURURCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIERURCBpZiBuZWVkZWQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIHdvcmtiZW5jaCwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPjwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBEVEQ8L3NwYW4+PC9zcGFuPi4gQ2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgRFRELjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIG5hbWU8L3NwYW4+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mCi10aGUgRFRELCBmb3IgZXhhbXBsZSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPk15RFRELmR0ZDwva2JkPi48L3NwYW4+IFRoZSBuYW1lCi1vZiB5b3VyIERURCBmaWxlIG11c3QgZW5kIHdpdGggdGhlIGV4dGVuc2lvbiA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPi5kdGQ8L2tiZD4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+WW91IGNhbiB1c2UgYSBEVEQgdGVtcGxhdGUgYXMgdGhlIGJhc2lzIGZvcgoteW91ciBuZXcgRFREIGZpbGUuIFRvIGRvIHNvLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VXNlIERURCBUZW1wbGF0ZTwvc3Bhbj4gY2hlY2sKLWJveCwgYW5kIHNlbGVjdCB0aGUgdGVtcGxhdGUgeW91IHdhbnQgdG8gdXNlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBEVEQgYXBwZWFycyBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGF1dG9tYXRpY2FsbHksIGJ5IGRlZmF1bHQsCi1vcGVucyBpbiB0aGUgRFREIGVkaXRvci4gSW4gdGhlIERURCBlZGl0b3IsIHlvdSBjYW4gbWFudWFsbHkgYWRkIGVsZW1lbnRzLAotYXR0cmlidXRlcywgbm90YXRpb25zLCBlbnRpdGllcywgYW5kIGNvbW1lbnRzIHRvIHRoZSBEVEQuIElmIHlvdSBjbG9zZSB0aGUKLWZpbGUsIGFuZCB3YW50IHRvIGxhdGVyIHJlLW9wZW4gaXQgaW4gdGhlIERURCBlZGl0b3IsIGRvdWJsZS1jbGljayBpdCBpbiB0aGUKLU5hdmlnYXRvciB2aWV3LjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jZHRkb3Zlci5odG1sIiB0aXRsZT0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgcHJvdmlkZXMgeW91IHdpdGggdGhlIG1lYW5zIHRvIHZhbGlkYXRlIFhNTCBmaWxlcyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBEVEQgZmlsZSwgeW91IGNhbiBzcGVjaWZ5IHJ1bGVzIHRoYXQgY29udHJvbCB0aGUgc3RydWN0dXJlIG9mIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiI+RG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoRFREcykgLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGR0ZW1wbHQuaHRtbCIgdGl0bGU9IlRlbXBsYXRlcyBhcmUgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgRFREIGZpbGUgd2hlbiBpdCBpcyBjcmVhdGVkLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiI+V29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2EyNjdhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdtYWNybyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPldvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRlbXBsYXRlcyBhcmUgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvDQotYSBEVEQgZmlsZSB3aGVuIGl0IGlzIGNyZWF0ZWQuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlDQotYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudA0KLXRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkRURHM8aW5kZXh0ZXJtPmNyZWF0aW5nIHRlbXBsYXRlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5EVEQ8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIGNyZWF0ZSBhIG5ldyBEVEQgdGVtcGxhdGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+RFREIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5UZW1wbGF0ZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk5ldzwvdWljb250cm9sPiBpbiB0aGUgdGVtcGxhdGVzIHByZWZlcmVjZXMuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3VwcGx5IGEgbmV3IHRlbXBsYXRlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBhbmQgPHVpY29udHJvbD5EZXNjcmlwdGlvbjwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TcGVjaWZ5IHRoZSA8dWljb250cm9sPkNvbnRleHQ8L3VpY29udHJvbD4gZm9yIHRoZSB0ZW1wbGF0ZS48L2NtZD4NCi08aW5mbz5UaGlzIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsDQotbGlzdCB3aGVuIGNvbnRlbnQgYXNzaXN0IGlzIHJlcXVlc3RlZC4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmb3IgeW91ciB0ZW1wbGF0ZSB1c2luZw0KLXRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQNCi1hc3Npc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPlRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHVpY29udHJvbD5JbnNlcnQNCi1WYXJpYWJsZTwvdWljb250cm9sPiBidXR0b24gYW5kIHNlbGVjdCBhIHZhcmlhYmxlLiA8L2NtZD48aW5mbz5Gb3IgZXhhbXBsZSwNCi10aGUgPHVpY29udHJvbD5kYXRlPC91aWNvbnRyb2w+IHZhcmlhYmxlIGluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUNCi1pbnNlcnRlZC4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4gYW5kIHRoZW4gPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0bw0KLXNhdmUgeW91ciBjaGFuZ2VzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lDQotcHJlZmVyZW5jZXMgcGFnZS4gPHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZSB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUsDQotYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyIGluIHRoZSBEVEQgdGVtcGxhdGVzIGxpc3Qgd2hlbg0KLXlvdSBjcmVhdGUgYSBmaWxlLCBjbGVhciBpdHMgY2hlY2tib3ggaW4gdGhlIHRlbXBsYXRlcyB0YWJsZS48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlNTQxYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUZW1wbGF0ZXMgYXJlIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIERURCBmaWxlIHdoZW4gaXQgaXMgY3JlYXRlZC4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGVtcGxhdGVzIGFyZSBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBEVEQgZmlsZSB3aGVuIGl0IGlzIGNyZWF0ZWQuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuIiAvPgotPG1ldGEgY29udGVudD0iRFREcywgY3JlYXRpbmcgdGVtcGxhdGVzLCB0ZW1wbGF0ZXMsIERURCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIGNyZWF0aW5nIHRlbXBsYXRlcywgdGVtcGxhdGVzLCBEVEQiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXRkdGQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0d21hY3JvIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3bWFjcm8iPjxhIG5hbWU9InR3bWFjcm8iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5UZW1wbGF0ZXMgYXJlIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50bwotYSBEVEQgZmlsZSB3aGVuIGl0IGlzIGNyZWF0ZWQuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlCi1hIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50Ci10byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGNyZWF0ZSBhIG5ldyBEVEQgdGVtcGxhdGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EVEQgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGVtcGxhdGVzPC9zcGFuPgotPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+IGluIHRoZSB0ZW1wbGF0ZXMgcHJlZmVyZWNlcy48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlN1cHBseSBhIG5ldyB0ZW1wbGF0ZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVzY3JpcHRpb248L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGV4dDwvc3Bhbj4gZm9yIHRoZSB0ZW1wbGF0ZS48L3NwYW4+Ci0gVGhpcyBpcyB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbAotbGlzdCB3aGVuIGNvbnRlbnQgYXNzaXN0IGlzIHJlcXVlc3RlZC4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmb3IgeW91ciB0ZW1wbGF0ZSB1c2luZwotdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudAotYXNzaXN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPlRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0Ci1WYXJpYWJsZTwvc3Bhbj4gYnV0dG9uIGFuZCBzZWxlY3QgYSB2YXJpYWJsZS4gPC9zcGFuPiBGb3IgZXhhbXBsZSwKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5kYXRlPC9zcGFuPiB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIGJlCi1pbnNlcnRlZC4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4gYW5kIHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvCi1zYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUKLXByZWZlcmVuY2VzIHBhZ2UuIDxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlLAotYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyIGluIHRoZSBEVEQgdGVtcGxhdGVzIGxpc3Qgd2hlbgoteW91IGNyZWF0ZSBhIGZpbGUsIGNsZWFyIGl0cyBjaGVja2JveCBpbiB0aGUgdGVtcGxhdGVzIHRhYmxlLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JldGR0ZC5odG1sIiB0aXRsZT0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iPkNyZWF0aW5nIERURHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c3Jjc3QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDJmNjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c3Jjc3QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHRhZ2hpbHQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMgZm9yIERURCBmaWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBEVEQgc291cmNlDQotY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBEVEQgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMNCi10aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5EVERzPGluZGV4dGVybT5oaWdobGlnaHRpbmcgc3R5bGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5EVEQgaGlnaGxpZ2h0aW5nIHN0eWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gc2V0IGhpZ2hsaWdodGluZyBzdHlsZXMgZm9yIHRoZSBEVEQgY29kZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZw0KLXN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+V2ViIGFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPkRURCBGaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+IFN5bnRheA0KLUNvbG9yaW5nPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+U3ludGF4IEVsZW1lbnQ8L3VpY29udHJvbD4gbGlzdCwgc2VsZWN0IHRoZSBzb3VyY2UNCi10YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gYWxzbyBjbGljaw0KLXRleHQgaW4gdGhlIHNhbXBsZSB0ZXh0IHRvIHNwZWNpZnkgdGhlIHNvdXJjZSB0YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldA0KLWEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Gb3JlZ3JvdW5kPC91aWNvbnRyb2w+IGJveCBhbmQgc2VsZWN0IHRoZQ0KLWNvbG9yIHRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+QmFja2dyb3VuZDwvdWljb250cm9sPiBib3ggYW5kIHNlbGVjdCB0aGUNCi1jb2xvciB0aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWhpbmQgdGhlIHRhZyBhbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIDx1aWNvbnRyb2w+Qm9sZDwvdWljb250cm9sPiwgPHVpY29udHJvbD5JdGFsaWM8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+U3RyaWtldGhyb3VnaDwvdWljb250cm9sPiwNCi1hbmQ8dWljb250cm9sPlVuZGVybGluZTwvdWljb250cm9sPiBjaGVjayBib3hlcyBmb3IgYWRkaXRpb25hbCBmb3JtYXR0aW5nDQotb3B0aW9ucy4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5SZXN0b3JlIERlZmF1bHQ8L3VpY29udHJvbD4gdG8gc2V0IHRoZSBoaWdobGlnaHRpbmcNCi1zdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gSWYgeW91IG9ubHkgd2FudCB0byByZXNldCB0aGUgdmFsdWUgZm9yDQotYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8dWljb250cm9sPkNvbnRlbnQgdHlwZTwvdWljb250cm9sPiBmaWVsZCwNCi10aGUgY2xpY2sgdGhlIDx1aWNvbnRyb2w+UmVzdG9yZSBEZWZhdWx0PC91aWNvbnRyb2w+IGJ1dHRvbiBuZXh0IHRvIGl0LiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIHNhdmUgeW91ciBjaGFuZ2VzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c3Jjc3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzUyMWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c3Jjc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgRFREIHNvdXJjZSBjb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIERURCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycyB0aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgRFREIHNvdXJjZSBjb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIERURCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycyB0aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi4iIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBoaWdobGlnaHRpbmcgc3R5bGVzLCBYTUwgZWRpdG9yLCBEVEQgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMsIGhpZ2hsaWdodGluZyBzdHlsZXMsIFhNTCBlZGl0b3IsIERURCBoaWdobGlnaHRpbmcgc3R5bGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0ZHRkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHRhZ2hpbHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciBEVEQgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR0YWdoaWx0Ij48YSBuYW1lPSJ0dGFnaGlsdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgRFREIHNvdXJjZQotY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBEVEQgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMKLXRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gc2V0IGhpZ2hsaWdodGluZyBzdHlsZXMgZm9yIHRoZSBEVEQgY29kZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRURCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gU3ludGF4Ci1Db2xvcmluZzwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5bnRheCBFbGVtZW50PC9zcGFuPiBsaXN0LCBzZWxlY3QgdGhlIHNvdXJjZQotdGFnIHR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGFsc28gY2xpY2sKLXRleHQgaW4gdGhlIHNhbXBsZSB0ZXh0IHRvIHNwZWNpZnkgdGhlIHNvdXJjZSB0YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldAotYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZvcmVncm91bmQ8L3NwYW4+IGJveCBhbmQgc2VsZWN0IHRoZQotY29sb3IgdGhhdCB5b3Ugd2FudCB0aGUgdGV4dCBvZiB0aGUgdGFnIHRvIGFwcGVhciBpbiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QmFja2dyb3VuZDwvc3Bhbj4gYm94IGFuZCBzZWxlY3QgdGhlCi1jb2xvciB0aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWhpbmQgdGhlIHRhZyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJvbGQ8L3NwYW4+LCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JdGFsaWM8L3NwYW4+LCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJpa2V0aHJvdWdoPC9zcGFuPiwKLWFuZDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVuZGVybGluZTwvc3Bhbj4gY2hlY2sgYm94ZXMgZm9yIGFkZGl0aW9uYWwgZm9ybWF0dGluZwotb3B0aW9ucy4gPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZXN0b3JlIERlZmF1bHQ8L3NwYW4+IHRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nCi1zdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gSWYgeW91IG9ubHkgd2FudCB0byByZXNldCB0aGUgdmFsdWUgZm9yCi1hIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLCBzZWxlY3QgaXQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQgdHlwZTwvc3Bhbj4gZmllbGQsCi10aGUgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlc3RvcmUgRGVmYXVsdDwvc3Bhbj4gYnV0dG9uIG5leHQgdG8gaXQuIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8gc2F2ZSB5b3VyIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy90Y3JldGR0ZC5odG1sIiB0aXRsZT0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iPkNyZWF0aW5nIERURHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wdGR0ZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wdGR0ZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzc1OTBiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHRkdGQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGltcHRkdGQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkltcG9ydGluZyBEVERzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5JbXBvcnRpbmcgRFREczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggRFREIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZSBvZg0KLXRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBEVEQNCi1lZGl0b3IuIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkRURHM8aW5kZXh0ZXJtPmltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gaW1wb3J0IGEgRFREIGludG8gdGhlIHdvcmtiZW5jaCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGU8L3VpY29udHJvbD48dWljb250cm9sPkltcG9ydDwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LiBTZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPjx1aWNvbnRyb2w+RmlsZQ0KLVN5c3RlbTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+RmlsbCBpbiB0aGUgZmllbGRzIGluIHRoZSA8dWljb250cm9sPkltcG9ydDwvdWljb250cm9sPiB3aXphcmQNCi1hcyBuZWNlc3NhcnkuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4gdG8gZXhpdCB0aGUgd2l6YXJkIGFuZCBpbXBvcnQNCi10aGUgZmlsZXMuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBEVEQgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGRvdWJsZS1jbGljayBpdCB0bw0KLW9wZW4gaXQgaW4gdGhlIERURCBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5BZnRlciB5b3UgaGF2ZSBpbXBvcnRlZCBhIERURCBmaWxlIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbmVkDQotaXQgaW4gdGhlIERURCBlZGl0b3IsIHlvdSBjYW4gZWRpdCBpdCBtYW51YWxseS48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wdGR0ZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wdGR0ZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODEzZWIxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHRkdGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkltcG9ydGluZyBEVERzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBEVEQgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBEVEQgZWRpdG9yLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggRFREIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUgRFREIGVkaXRvci4iIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBpbXBvcnRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVERzLCBpbXBvcnRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGltcHRkdGQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5JbXBvcnRpbmcgRFREczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGltcHRkdGQiPjxhIG5hbWU9InRpbXB0ZHRkIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JbXBvcnRpbmcgRFREczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91IHdhbnQgdG8gd29yayB3aXRoIERURCBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YKLXRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBEVEQKLWVkaXRvci4gPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBpbXBvcnQgYSBEVEQgaW50byB0aGUgd29ya2JlbmNoLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkltcG9ydDwvc3Bhbj4KLTwvc3Bhbj4uIFNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZQotU3lzdGVtPC9zcGFuPjwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5GaWxsIGluIHRoZSBmaWVsZHMgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkltcG9ydDwvc3Bhbj4gd2l6YXJkCi1hcyBuZWNlc3NhcnkuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+IHRvIGV4aXQgdGhlIHdpemFyZCBhbmQgaW1wb3J0Ci10aGUgZmlsZXMuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIERURCBmaWxlIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgZG91YmxlLWNsaWNrIGl0IHRvCi1vcGVuIGl0IGluIHRoZSBEVEQgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BZnRlciB5b3UgaGF2ZSBpbXBvcnRlZCBhIERURCBmaWxlIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbmVkCi1pdCBpbiB0aGUgRFREIGVkaXRvciwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIHRpdGxlPSJUaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6Ij5Xb3JraW5nIHdpdGggRFREczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2YWxkdGQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZhbGR0ZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTliY2YxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZhbGR0ZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0dmFsZHRkIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5WYWxpZGF0aW5nIERURHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlZhbGlkYXRpbmcgRFREczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5WYWxpZGF0aW5nIGEgRFREIGZpbGUgbGV0cyB5b3UgdmVyaWZ5IHRoYXQgaXQgaXMgd2VsbCBmb3JtZWQgYW5kDQotZG9lcyBub3QgY29udGFpbiBhbnkgZXJyb3JzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkRURDxpbmRleHRlcm0+dmFsaWRhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuJm5ic3A7PC9wPjxwPlRvIHZhbGlkYXRlDQotYSBEVEQsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5WYWxpZGF0ZQ0KLURURCBGaWxlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uIEEgZGlhbG9nIG9wZW5zLCBpbmRpY2F0aW5nIGlmIHRoZSBEVEQNCi1maWxlIHdhcyBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkIG9yIG5vdC4gSWYgdGhlIGZpbGUgaXMgaW52YWxpZCwgYW55IGVycm9ycw0KLXdpbGwgYXBwZWFyIGluIHRoZSBQcm9ibGVtcyB2aWV3LiAmbmJzcDs8L3A+PC9jb250ZXh0Pg0KLTxyZXN1bHQ+PG5vdGU+SWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIFByb2JsZW1zDQotdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCBpbiB0aGUNCi12aWV3LiBDbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5NYXJrZXJzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uIE9uIHRoaXMgcHJlZmVyZW5jZXMgcGFnZSB5b3UgY2FuIGluY3JlYXNlIG9yIGRlY3JlYXNlIHRoZQ0KLW51bWJlciBvZiB2aXNpYmxlIGl0ZW1zIGluIHRoZSBwcm9ibGVtcyB2aWV3LiA8L25vdGU+PHA+WW91IGNhbiBzZXQgdXAgYSBwcm9qZWN0J3MNCi1wcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzIGFyZSBhdXRvbWF0aWNhbGx5DQotdmFsaWRhdGVkIHdoZW4geW91IHNhdmUgdGhlbS4gUmlnaHQgY2xpY2sgb24gdGhlIHByb2plY3QsIGNsaWNrIDx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPiwNCi1hbmQgc2VsZWN0IDx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPi4gQW55IHZhbGlkYXRvcnMgeW91IGNhbiBydW4gYWdhaW5zdA0KLXlvdXImbmJzcDtwcm9qZWN0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBWYWxpZGF0aW9uIHBhZ2UuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9saW5rdGV4dD4NCi08ZGVzYz5HZW5lcmFsIHZhbGlkYXRpb24gaW5mb3JtYXRpb248L2Rlc2M+DQotPC9saW5rPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmFsZHRkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2YWxkdGQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5MmVhMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2YWxkdGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlZhbGlkYXRpbmcgRFREcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJWYWxpZGF0aW5nIGEgRFREIGZpbGUgbGV0cyB5b3UgdmVyaWZ5IHRoYXQgaXQgaXMgd2VsbCBmb3JtZWQgYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IGVycm9ycy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVmFsaWRhdGluZyBhIERURCBmaWxlIGxldHMgeW91IHZlcmlmeSB0aGF0IGl0IGlzIHdlbGwgZm9ybWVkIGFuZCBkb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuIiAvPgotPG1ldGEgY29udGVudD0iRFRELCB2YWxpZGF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRFRELCB2YWxpZGF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHZhbGR0ZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlZhbGlkYXRpbmcgRFREczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHZhbGR0ZCI+PGEgbmFtZT0idHZhbGR0ZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFsaWRhdGluZyBEVERzPC9oMT4KLQotCi0KLQotPGRpdj48cD5WYWxpZGF0aW5nIGEgRFREIGZpbGUgbGV0cyB5b3UgdmVyaWZ5IHRoYXQgaXQgaXMgd2VsbCBmb3JtZWQgYW5kCi1kb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLsKgPC9wPgotPHA+VG8gdmFsaWRhdGUKLWEgRFRELCByaWdodC1jbGljayB0aGUgRFREIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZQotRFREIEZpbGU8L3NwYW4+PC9zcGFuPi4gQSBkaWFsb2cgb3BlbnMsIGluZGljYXRpbmcgaWYgdGhlIERURAotZmlsZSB3YXMgc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZCBvciBub3QuIElmIHRoZSBmaWxlIGlzIGludmFsaWQsIGFueSBlcnJvcnMKLXdpbGwgYXBwZWFyIGluIHRoZSBQcm9ibGVtcyB2aWV3LiDCoDwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIFByb2JsZW1zCi12aWV3IGlzIGZ1bGwsIHlvdSBjYW4gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkIGluIHRoZQotdmlldy4gQ2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hcmtlcnM8L3NwYW4+Ci08L3NwYW4+LiBPbiB0aGlzIHByZWZlcmVuY2VzIHBhZ2UgeW91IGNhbiBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUKLW51bWJlciBvZiB2aXNpYmxlIGl0ZW1zIGluIHRoZSBwcm9ibGVtcyB2aWV3LiA8L2Rpdj4KLTxwPllvdSBjYW4gc2V0IHVwIGEgcHJvamVjdCdzCi1wcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzIGFyZSBhdXRvbWF0aWNhbGx5Ci12YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBSaWdodCBjbGljayBvbiB0aGUgcHJvamVjdCwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4sCi1hbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+LiBBbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1biBhZ2FpbnN0Ci15b3VywqBwcm9qZWN0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBWYWxpZGF0aW9uIHBhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCIgdGl0bGU9IkdlbmVyYWwgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhYTFiNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9FZGl0b3JIdG1sQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhkYzEwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9FZGl0b3JIdG1sQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0ibWlzYzAxNzAiPgotPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBlZGl0IHRoZSBXZWIgY29udGVudCBzZXR0aW5ncyBmb3IgYSBXZWIgcHJvamVjdC4gWW91IGNhbiBzcGVjaWZ5IHRoZSBkZWZhdWx0IGRvY3VtZW50IHR5cGUsIENTUyBwcm9maWxlLCBhbmQgdGFyZ2V0IGRldmljZS4gVGhlIHB1YmxpYyBJRCBhbmQgc3lzdGVtIElEIGFyZSBwb3B1bGF0ZWQgYXV0b21hdGljYWxseS4gVG8gcmVzdG9yZSB0aGUgZGVmYXVsdHMsIGNsaWNrIDxiPlJlc3RvcmUgRGVmYXVsdHM8L2I+LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDMwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGNyZWF0ZSwgc2F2ZSwgb3IgbG9hZCBhbiBIVE1MIGZpbGUuCi0KLVZhcmlvdXMgZGV2ZWxvcG1lbnQgcGxhdGZvcm1zIHVzZSBkaWZmZXJlbnQgbGluZSBkZWxpbWl0ZXJzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIG5ldyBsaW5lLiBTZWxlY3QgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCBjb3JyZXNwb25kcyB0byB5b3VyIGRldmVsb3BtZW50IG9yIGRlcGxveW1lbnQgcGxhdGZvcm0uCi08Yj5Ob3RlOjwvYj4gVGhpcyBkZWxpbWl0ZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBhbnkgZG9jdW1lbnRzIHRoYXQgY3VycmVudGx5IGV4aXN0LiBJdCB3aWxsIGJlIGFkZGVkIG9ubHkgdG8gZG9jdW1lbnRzIHRoYXQgeW91IGNyZWF0ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4sIG9yIHRvIGV4aXN0aW5nIGZpbGVzIHRoYXQgeW91IG9wZW4gYW5kIHRoZW4gcmVzYXZlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDxiPkFwcGx5PC9iPi4KLQotVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBlaXRoZXIgY3JlYXRpbmcgSFRNTCBmaWxlcyBvciBsb2FkaW5nIHlvdXIgSFRNTCBmaWxlcyBpbnRvIHRoZSBlZGl0b3IuICBDaGFuZ2luZyB0aGUgY3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcgSFRNTCBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwMzEiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBmb3JtYXR0aW5nLCBjb250ZW50IGFzc2lzdCwgYW5kIGNhcGl0YWxpemF0aW9uIHN0eWxlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGVkaXQgYW4gSFRNTCBmaWxlLgotCi1FbnRlciBhIG1heGltdW0gd2lkdGggaW4gdGhlIDxiPkxpbmUgd2lkdGg8L2I+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGxpbmUgd2lkdGggdG8gYnJlYWsgYSBsaW5lIHRvIGZpdCBvbnRvIG1vcmUgdGhhbiBvbmUgbGluZSB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQuCi0KLVNlbGVjdCA8Yj5TcGxpdCBtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZTwvYj4gdG8gc3RhcnQgZXZlcnkgYXR0cmlidXRlIG9uIGEgbmV3IGxpbmUgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLiBBdHRyaWJ1dGVzIHdpbGwgcmV0dXJuIHRvIHRoZSBzYW1lIG1hcmdpbiBhcyB0aGUgcHJldmlvdXMgbGluZS4KLQotU2VsZWN0IDxiPkluZGVudCB1c2luZyB0YWJzPC9iPiBpZiB5b3Ugd2FudCB0byB1c2UgdGFiIGNoYXJhY3RlcnMgKFx0KSBhcyB0aGUgc3RhbmRhcmQgZm9ybWF0dGluZyBpbmRlbnRhdGlvbi4KLQotSWYgeW91IHByZWZlciB0byB1c2Ugc3BhY2VzLCBzZWxlY3QgPGI+SW5kZW50IHVzaW5nIHNwYWNlczwvYj4uCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSA8Yj5JbmRlbnRhdGlvbiBzaXplPC9iPiB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHRhYnMgb3Igc3BhY2UgY2hhcmFjdGVycyB1c2VkIGZvciBmb3JtYXR0aW5nIGluZGVudGF0aW9uLgotCi1TZWxlY3QgPGI+Q2xlYXIgYWxsIGJsYW5rIGxpbmVzPC9iPiB0byByZW1vdmUgYmxhbmsgbGluZXMgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLgotCi1UbyBhcHBseSB0aGVzZSBmb3JtYXR0aW5nIHN0eWxlcywgc2VsZWN0IHRoZSA8Yj5Gb3JtYXQgRG9jdW1lbnQ8L2I+IG1lbnUgaXRlbS4KLQotSWYgdGhlIDxiPkF1dG9tYXRpY2FsbHkgbWFrZSBzdWdnZXN0aW9uczwvYj4gY2hlY2sgYm94IGlzIHNlbGVjdGVkLCB5b3UgY2FuIHNwZWNpZnkgdGhhdCBjZXJ0YWluIGNoYXJhY3RlcnMgd2lsbCBjYXVzZSB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB0byBwb3AgdXAgYXV0b21hdGljYWxseS4gU3BlY2lmeSB0aGVzZSBjaGFyYWN0ZXJzIGluIHRoZSA8Yj5Qcm9tcHQgd2hlbiB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDwvYj4gZmllbGQuCi0KLVNlbGVjdCB0aGUgVXBwZXJjYXNlIG9yIExvd2VyY2FzZSByYWRpbyBidXR0b24gdG8gZGV0ZXJtaW5lIHRoZSBjYXNlIGZvciB0YWcgYW5kIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBkb2N1bWVudCB3aGVuIHVzaW5nIGNvbnRlbnQgYXNzaXN0IG9yIGNvZGUgZ2VuZXJhdGlvbi4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDMyIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIHRoYXQgdGhlIEhUTUwgZWRpdG9yIGRvZXMgd2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBmaWxlLgotCi1UaGUgPGI+Q29udGVudCB0eXBlPC9iPiBmaWVsZCBjb250YWlucyBhIGxpc3Qgb2YgYWxsIHRoZSBzb3VyY2UgdHlwZXMgdGhhdCB5b3UgY2FuIHNlbGVjdCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gZWl0aGVyIHNlbGVjdCB0aGUgY29udGVudCB0eXBlIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoIGZyb20gdGhlIGRyb3AtZG93biBsaXN0LCBvciBjbGljayB0ZXh0IGluIHRoZSB0ZXh0IHNhbXBsZSB3aW5kb3cgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY29udGVudCB0eXBlIGZvciB3aGljaCB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHRleHQgaGlnaGxpZ2h0aW5nLgotCi1UaGUgPGI+Rm9yZWdyb3VuZDwvYj4gYW5kIDxiPkJhY2tncm91bmQ8L2I+IHB1c2ggYnV0dG9ucyBvcGVuIDxiPkNvbG9yPC9iPiBkaWFsb2cgYm94ZXMgdGhhdCBhbGxvdyB5b3UgdG8gc3BlY2lmeSB0ZXh0IGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzLCByZXNwZWN0aXZlbHkuIFNlbGVjdCB0aGUgPGI+Qm9sZDwvYj4gY2hlY2sgYm94IHRvIG1ha2UgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgYXBwZWFyIGluIGJvbGQuCi0KLUNsaWNrIHRoZSA8Yj5SZXN0b3JlIERlZmF1bHQ8L2I+IHB1c2ggYnV0dG9uIHRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nIHN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwMzMiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjcmVhdGUgbmV3IGFuZCBlZGl0IGV4aXN0aW5nIHRlbXBsYXRlcyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBlZGl0IGFuIEhUTUwgZmlsZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTEwMCI+Ci08ZGVzY3JpcHRpb24+Q2xlYW51cCBvcHRpb25zIGVuYWJsZSB5b3UgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZCBhbmQgZm9ybWF0dGVkLgotCi1UaGUgZm9sbG93aW5nIGNsZWFudXAgb3B0aW9ucyBsZXQgeW91IHNlbGVjdCByYWRpbyBidXR0b25zIHRvIGNob29zZSB0aGUgdHlwZSBvZiBjbGVhbnVwIHRvIGJlIHBlcmZvcm1lZDoKLS0gPGI+VGFnIG5hbWUgY2FzZSBmb3IgSFRNTDwvYj46IFVubGVzcyBzZXQgdG8gPGI+QXMtaXM8L2I+LCBjaGFuZ2VzIHRoZSBjYXNlIG9mIGFsbCB0YWdzIGluIGEgZmlsZSBmb3IgZWFzaWVyIHZpc3VhbCBwYXJzaW5nIGFuZCBjb25zaXN0ZW5jeS4KLS0gPGI+QXR0cmlidXRlIG5hbWUgY2FzZSBmb3IgSFRNTDwvYj46IFVubGVzcyBzZXQgdG8gPGI+QXMtaXM8L2I+LCBjaGFuZ2VzIHRoZSBjYXNlIG9mIGFsbCBhdHRyaWJ1dGVzIGluIGEgZmlsZSBmb3IgZWFzaWVyIHZpc3VhbCBwYXJzaW5nIGFuZCBjb25zaXN0ZW5jeS4KLQotVGhlIGZvbGxvd2luZyBjbGVhbnVwIG9wdGlvbnMgY2FuIGJlIHNldCB0byBvbiBvciBvZmYsIHNvIHRoYXQgeW91IGNhbiBsaW1pdCB0aGUgdHlwZSBvZiBjbGVhbnVwIHBlcmZvcm1lZDoKLS0gPGI+SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXM8L2I+OiBJbnNlcnRzIGFuIG1pc3NpbmcgYXR0cmlidXRlcyB0aGF0IGFyZSByZXF1aXJlZCBieSB0aGUgdGFnIHRvIG1ha2UgdGhlIGVsZW1lbnQgb3IgZG9jdW1lbnQgd2VsbC1mb3JtZWQuCi0tIDxiPkluc2VydCBtaXNzaW5nIHRhZ3M8L2I+OiBDb21wbGV0ZXMgYW55IG1pc3NpbmcgdGFncyAoc3VjaCBhcyBhZGRpbmcgYW4gZW5kIHRhZykgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlIGVsZW1lbnQgb3IgZG9jdW1lbnQgd2VsbC1mb3JtZWQuCi0tIDxiPlF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXM8L2I+OiBBcHByb3ByaWF0ZWx5IGFkZHMgZG91YmxlLSBvciBzaW5nbGUtcXVvdGVzIGJlZm9yZSBhbmQgYWZ0ZXIgYXR0cmlidXRlIHZhbHVlcyBpZiB0aGV5IGFyZSBtaXNzaW5nLgotLSA8Yj5Gb3JtYXQgc291cmNlPC9iPjogRm9ybWF0cyB0aGUgZG9jdW1lbnQganVzdCBhcyB0aGUgPGI+Rm9ybWF0IERvY3VtZW50PC9iPiBjb250ZXh0IG1lbnUgb3B0aW9uIGRvZXMsIGltbWVkaWF0ZWx5IGFmdGVyIHBlcmZvcm1pbmcgYW55IG90aGVyIHNwZWNpZmllZCA8Yj5DbGVhbnVwPC9iPiBvcHRpb25zLgotLSA8Yj5Db252ZXJ0IGxpbmUgZGVsaW1pdGVycyB0bzwvYj46IENvbnZlcnRzIGFsbCBsaW5lIGRlbGltaXRlcnMgaW4gdGhlIGZpbGUgdG8gdGhlIHNlbGVjdGVkIG9wZXJhdGluZyBzeXN0ZW0ncyB0eXBlLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9FZGl0b3JIdG1sQ29udGV4dHMyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9FZGl0b3JIdG1sQ29udGV4dHMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxNDE4Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotCi08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJodG1sc291cmNlX3NvdXJjZV9IZWxwSWQiPgotPGRlc2NyaXB0aW9uPlRoZSBIVE1MIHNvdXJjZSBwYWdlIGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgZmlsZSB0aGF0IGlzIGNvZGVkIGluIHRoZSBIeXBlcnRleHQgTWFya3VwIExhbmd1YWdlIG9yIGluIFhIVE1MLiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCB1c2VyLWRlZmluZWQgdGVtcGxhdGVzLCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5odG1sIi8+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0hUTUxXaXpDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvSFRNTFdpekNvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2OGNmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvSFRNTFdpekNvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iaHRtbHcwMDEwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIEhUTUwgdGVtcGxhdGUgY2hlY2tib3ggdG8gY3JlYXRlIHlvdXIgSFRNTCBmaWxlIGJhc2VkIG9uIGEgZGVmYXVsdCB0ZW1wbGF0ZS4gQ2hvb3NlIG9uZSBvZiB0aGUgZnJhbWVzZXQgdGVtcGxhdGVzIGlmIHlvdSBhcmUgZGV2ZWxvcGluZyBhIFdlYiBzaXRlIHdpdGggZnJhbWVzLiBJZiB5b3UgZG8gbm90IHNlbGVjdCBhIHRlbXBsYXRlLCB5b3VyIG5ld2x5IGNyZWF0ZWQgSlNQIGZpbGUgd2lsbCBiZSBjb21wbGV0ZWx5IGJsYW5rLgotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLQotCi0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YjQzYTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3MzQwNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIEVkaXRvckh0bWxDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIEVkaXRvckh0bWxDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0NDQ0Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IEhUTUwgZWRpdG9yIGluZm9wb3BzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwODVlNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySHRtbENvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySHRtbENvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUiLz4KLSAgICAgICAgIDxjb250ZXh0cyBmaWxlPSJIVE1MV2l6Q29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIi8+Ci08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2EyZjg4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJfMS4wLjAuamFyCi10ZW1wCi1EaXRhTGluay5jYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDY0MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL0RvY0J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9Eb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMTg2ODQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL0RvY0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLSAKLQotCVRoaXMgc2NyaXB0IGJ1aWxkIHRoZSBIZWxwIHBsdWctaW4gYnkgdHJhbnNmb3JtaW5nIHRoZSBESVRBIHNvdXJjZSBmaWxlcyBpbnRvIEhUTUwuCi0JCi0JVG8gdXNlIHRoaXMgc2NyaXB0LCB5b3UgbXVzdCBpbnN0YWxsIERJVEEtT1Qgb24geW91ciBtYWNoaW5lIGluIHRoZSBkaXJlY3RvcnkKLQlkZWZpbmVkIGJ5IHRoZSBkaXRhLm90LmRpciBwcm9wZXJ0eS4KLQkKLQlSdW4gdGhlIGRlZmF1bHQgdGFyZ2V0IGFmdGVyIHlvdSBlZGl0IHRoZSBESVRBIHNvdXJjZSBmaWxlcyB0byByZWdlbmVyYXRlIHRoZSBIVE1MLgotCQotCVRvIGN1c3RvbWl6ZSB0aGlzIHNjcmlwdCBmb3Igb3RoZXIgSGVscCBwbHVnLWlucywgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJncy5pbnB1dCBwcm9wZXJ0eQotCXRvIGJlIHRoZSBESVRBIG1hcCBmaWxlIGZvciB0aGUgcGx1Zy1pbi4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgbGlua3MgdG8gc2libGluZyBIZWxwIHBsdWctaW5zIGhhdmUgc2NvcGU9InBlZXIiLCBvdGhlcndpc2UgdGhlCi0Jb3V0cHV0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBzaGlmdGVkIGluY29ycmVjdGx5LgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCB5b3UgaGFuZCBjb2RlIHlvdXIgcGx1Z2luLnhtbCBmaWxlIGluIG15cGx1Z2luLnhtbC4gVGhpcyBmaWxlCi0Jd2lsbCBiZSBjb3BpZWQgb3ZlciB0aGUgZ2VuZXJhdGVkIHBsdWdpbi54bWwgd2hpY2ggaXMgY3VycmVudGx5IG5vdCBiZWluZyBnZW5lcmF0ZWQgY29ycmVjdGx5Ci0JYnkgRElUQS1PVC4KLQkKLQlDaGFuZ2VMb2c6Ci0JMjAwNi0wNC0wNSBBcnRodXIgUnltYW4gPHJ5bWFuQGNhLmlibS5jb20+Ci0JLSBDcmVhdGVkLgotCTIwMDgtMDUtMDUgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIHRvIGFkZCBnZW5lcmF0aW9uIG9mIHByZS1idWlsdCBoZWxwIGluZGV4LiAKLQktIE11c3QgZGVsZXRlIC9pbmRleCBmb2xkZXIgYmVmb3JlIHJ1bm5pbmcgYnVpbGQKLS0tPgotPHByb2plY3QgbmFtZT0iZWNsaXBzZWhlbHAiIGRlZmF1bHQ9ImFsbCI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iZGl0YS5vdC5kaXIiIGxvY2F0aW9uPSJDOi9ESVRBLU9UMS4yLjIiIC8+Ci0KLQk8cGF0aCBpZD0iZG9zdC5jbGFzcy5wYXRoIj4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9bGliJHtmaWxlLnNlcGFyYXRvcn1kb3N0LmphciIgLz4KLQk8L3BhdGg+Ci0KLQk8dGFza2RlZiBuYW1lPSJpbnRlZ3JhdGUiIGNsYXNzbmFtZT0ib3JnLmRpdGEuZG9zdC5wbGF0Zm9ybS5JbnRlZ3JhdG9yVGFzayI+Ci0JCTxjbGFzc3BhdGggcmVmaWQ9ImRvc3QuY2xhc3MucGF0aCIgLz4KLQk8L3Rhc2tkZWY+Ci0JPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImludGVncmF0ZSwgZWNsaXBzZWhlbHAiPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iaW50ZWdyYXRlIj4KLQkJPGludGVncmF0ZSBkaXRhZGlyPSIke2RpdGEub3QuZGlyfSIgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gcmV2aXNlIGJlbG93IGhlcmUgLS0+Ci0JPHRhcmdldCBuYW1lPSJlY2xpcHNlaGVscCI+Ci0JCTxhbnQgYW50ZmlsZT0iJHtkaXRhLm90LmRpcn0ke2ZpbGUuc2VwYXJhdG9yfWNvbmR1Y3Rvci54bWwiIHRhcmdldD0iaW5pdCIgZGlyPSIke2RpdGEub3QuZGlyfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jb3B5Y3NzIiB2YWx1ZT0ibm8iIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jc3NwYXRoIiB2YWx1ZT0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS5wcm92aWRlciIgdmFsdWU9IkVjbGlwc2Uub3JnIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS52ZXJzaW9uIiB2YWx1ZT0iMy4zLjAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5pbnB1dCIgbG9jYXRpb249InNzZV90b2MuZGl0YW1hcCIgLz4gICAgCQkKLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGVhbi50ZW1wIiB2YWx1ZT0idHJ1ZSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLmV4dG5hbWUiIHZhbHVlPSIuZGl0YSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLnRlbXAuZGlyIiBsb2NhdGlvbj0idGVtcCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZGlyIiBsb2NhdGlvbj0iIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InRyYW5zdHlwZSIgdmFsdWU9ImVjbGlwc2VoZWxwIiAvPgotCQk8L2FudD4KLQkJPGNvcHkgZmlsZT0ibXlwbHVnaW4ueG1sIiB0b2ZpbGU9InBsdWdpbi54bWwiIG92ZXJ3cml0ZT0ieWVzIiAvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYnVpbGQuaW5kZXgiIGRlc2NyaXB0aW9uPSJCdWlsZHMgc2VhcmNoIGluZGV4IGZvciB0aGUgcGx1Zy1pbiIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JICAgICA8aGVscC5idWlsZEhlbHBJbmRleCBtYW5pZmVzdD0icGx1Z2luLnhtbCIgZGVzdGluYXRpb249Ii4iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5MjA2MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTBkNjQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3NlX3RvYy54bWwsXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcmluZGV4LnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvKi5odG0qLFwKLSAgICAgICAgICAgICAgIGluZGV4LyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotCQkgICAgICAgKi5tYXBsaXN0LFwKLSAgICAgICAgICAgICAgICouZGl0YW1hcCxcCi0JCSAgICAgICB0b3BpY3MvKi5kaXRhCi1iaW4uZXhjbHVkZXMgPSBEb2NCdWlsZC54bWwsXAotICAgICAgICAgICAgICAgbXlQbHVnaW4qLnhtbAotICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25jb250YXNzLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmNvbnRhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODIwMTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmNvbnRhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9uanNjZGFzdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25qc2NkYXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhMTQxYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25qc2NkYXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxMzVjZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25saW51eC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25tYWNzY3JwLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbm1hY3NjcnAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE2MzcxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbm1hY3NjcnAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ucXVlc3QuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ucXVlc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmFhMWUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbnF1ZXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbndpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL253aW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVmOWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbndpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvX3AuY2ZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L19wLmNmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0MTY0OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvX3AuY2ZzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9kZWxldGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2Y0NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmE3NmRjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgTWF5IDE0IDE4OjU2OjAzIEVEVCAyMDA4DQotb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcj1vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyXG4xLjEuMC5xdWFsaWZpZXINCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYzdhNjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZGVwZW5kZW5jaWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIE1heSAxNCAxODo1NjowMyBFRFQgMjAwOA0KLWx1Y2VuZT0xLjkuMS52MjAwODAzMDYxODExDQotYW5hbHl6ZXI9b3JnLmVjbGlwc2UuaGVscC5iYXNlXCMzLjMuMTAwLnYyMDA4MDQyNT9sb2NhbGVcPWVuDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NWNkNDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgTWF5IDE0IDE4OjU2OjAzIEVEVCAyMDA4DQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuaHRtbD0wDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDYzYzRjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbmRleC9zZWdtZW50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9teXBsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzE1ZGVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9teXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnLWluIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgcGFnZXMgICAgICAtLT4KLTwhLS0gZm9yIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyAoc291cmNlIGVkaXRvcnMpLiAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYyBmaWxlPSJzc2VfdG9jLnhtbCIvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLSAgIDwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLmx1Y2VuZVNlYXJjaFBhcnRpY2lwYW50cyI+Ci0gICAgICA8YmluZGluZyBwYXJ0aWNpcGFudElkPSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UueGh0bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci5tYXBsaXN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIubWFwbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBmNGRhNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci5tYXBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08bWFwbGlzdCB2ZXJzaW9uPSIzLjYuMiI+DQotICA8bmF2Pg0KLSAgICA8bWFwIGZpbGU9InNzZV90b2MuZGl0YW1hcCIvPg0KLSAgPC9uYXY+DQotICA8bGluaz4NCi0gIDwvbGluaz4NCi08L21hcGxpc3Q+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGE4ODg2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA3IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPCEtLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBMaWNlbnNlZCBNYXRlcmlhbHMgUHJvcGVydHkgb2YgSUJNIC0tPgotPCEtLSBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0tPgotPCEtLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSAtLT4KLTwhLS0gR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImlibWRpdGEuY3NzIiAvPgotPHRpdGxlPkluZGV4PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgxPkluZGV4PC9oMT4KLTxhIG5hbWU9IklEWDBfNDEiIGhyZWY9IiNJRFgxXzQxIj5BPC9hPgotPGEgbmFtZT0iSURYMF80MyIgaHJlZj0iI0lEWDFfNDMiPkM8L2E+Ci08YSBuYW1lPSJJRFgwXzQ0IiBocmVmPSIjSURYMV80NCI+RDwvYT4KLTxhIG5hbWU9IklEWDBfNDYiIGhyZWY9IiNJRFgxXzQ2Ij5GPC9hPgotPGEgbmFtZT0iSURYMF80OCIgaHJlZj0iI0lEWDFfNDgiPkg8L2E+Ci08YSBuYW1lPSJJRFgwXzRBIiBocmVmPSIjSURYMV80QSI+SjwvYT4KLTxhIG5hbWU9IklEWDBfNEQiIGhyZWY9IiNJRFgxXzREIj5NPC9hPgotPGEgbmFtZT0iSURYMF81MyIgaHJlZj0iI0lEWDFfNTMiPlM8L2E+Ci08YSBuYW1lPSJJRFgwXzU0IiBocmVmPSIjSURYMV81NCI+VDwvYT4KLTxhIG5hbWU9IklEWDBfNTYiIGhyZWY9IiNJRFgxXzU2Ij5WPC9hPgotPGEgbmFtZT0iSURYMF81OCIgaHJlZj0iI0lEWDFfNTgiPlg8L2E+Ci08aHI+PC9ocj4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80MSIgaHJlZj0iI0lEWDBfNDEiPkE8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+YW5ub3RhdGlvbiBwcmVmZXJlbmNlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDAxLmh0bWwjdHNyY2VkdDAwMSI+bWFya3VwIGxhbmd1YWdlIHNldHRpbmdzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80MyIgaHJlZj0iI0lEWDBfNDMiPkM8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+Y2hhcmFjdGVyIGVuY29kaW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NlbmNvZGluZy5odG1sI2NlbmNvZGluZyI+bG9jYXRpb24gaW4gZmlsZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Y29udGVudCBhc3Npc3RhbmNlCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuaHRtbCN0c3JjZWR0MDIzIj5lbmFibGluZyBmb3IgSlNQIGZpbGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNi5odG1sI2NzcmNlZHQwMDYiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5odG1sI3RzcmNlZHQwMDUiPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmNvbnRlbnQgdHlwZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIj5tYXBwaW5nIGZpbGUgZXh0ZW5zaW9uczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDQiIGhyZWY9IiNJRFgwXzQ0Ij5EPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPmRyYXdlcnMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sI3RzcmNlZHQwMTYiPnNuaXBwZXRzIHZpZXc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ2IiBocmVmPSIjSURYMF80NiI+RjwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5maWxlIGV4dGVuc2lvbnMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIj5tYXBwaW5nIGNvbnRlbnQgdHlwZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+ZmlsZSB0eXBlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90Y29udGVudHR5cGUuaHRtbCN0Y29udGVudHR5cGUiPmVkaXRvcnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ4IiBocmVmPSIjSURYMF80OCI+SDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5IVE1MCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+dGVtcGxhdGVzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjQuaHRtbCN0c3JjZWR0MDI0Ij5hZGRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwjdHNyY2VkdDAyNCI+cmVtb3Zpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNEEiIGhyZWY9IiNJRFgwXzRBIj5KPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPkpTUCBmaWxlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciPmNoYXJhY3RlciBlbmNvZGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuaHRtbCN0c3JjZWR0MDIzIj5lbmFibGluZyBjb250ZW50IGFzc2lzdGFuY2U8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+SlNQIHBhZ2VzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguaHRtbCN0c3JjZWR0MDI4Ij50ZW1wbGF0ZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzREIiBocmVmPSIjSURYMF80RCI+TTwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5tYXJrdXAgbGFuZ3VhZ2VzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMDAuaHRtbCN0c3JjZWR0MDAwIj5lZGl0aW5nIHRleHQ8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDAxLmh0bWwjdHNyY2VkdDAwMSI+c2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNy5odG1sI3RzcmNlZHQwMjciPnRlbXBsYXRlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTMiIGhyZWY9IiNJRFgwXzUzIj5TPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPnNuaXBwZXQgZHJhd2VycwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDE1Lmh0bWwjdHNyY2VkdDAxNSI+YWRkaW5nIGl0ZW1zPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnNuaXBwZXQgaXRlbXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNS5odG1sI3RzcmNlZHQwMTUiPmFkZGluZyB0byBkcmF3ZXJzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnNuaXBwZXRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuaHRtbCN0c3JjZWR0MDE0Ij5kcmF3ZXIgY3VzdG9taXphdGlvbjwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjIuaHRtbCN0c3JjZWR0MDIyIj5lZGl0aW5nIGl0ZW1zPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sI3RzcmNlZHQwMTYiPm1vZGlmeWluZyBkcmF3ZXJzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNi5odG1sI3RzcmNlZHQwMjYiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlNuaXBwZXRzIHZpZXcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwMS5odG1sI2NzcmNlZHQwMDEiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnNwZWxsIGNoZWNrCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCN0c3JjZWR0MDEwIj5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPmNvbnRlbnQgYXNzaXN0YW5jZSA8YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5odG1sI3RzcmNlZHQwMDUiPigxKTwvYT4sIDxhIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2Lmh0bWwjY3NyY2VkdDAwNiI+KDIpPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sI2NzcmNlZHQwMDQiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNS5odG1sI3RzcmNlZHQwMjUiPnByZWZlcmVuY2Ugc2V0dGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCN0c3JjZWR0MDEwIj5zcGVsbCBjaGVjazwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMDcuaHRtbCN0c3JjZWR0MDA3Ij50ZXh0IHNlYXJjaDwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTQiIGhyZWY9IiNJRFgwXzU0Ij5UPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPnRlbXBsYXRlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI0Lmh0bWwjdHNyY2VkdDAyNCI+SFRNTDwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguaHRtbCN0c3JjZWR0MDI4Ij5KU1AgcGFnZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI3Lmh0bWwjdHNyY2VkdDAyNyI+bWFya3VwIGxhbmd1YWdlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NzcmNlZHQwMDQuaHRtbCNjc3JjZWR0MDA0Ij5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzcmNlZHQwMjkuaHRtbCN0c3JjZWR0MDI3Ij5YTUw8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+dGV4dAotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDAwLmh0bWwjdHNyY2VkdDAwMCI+ZWRpdGluZyBpbiBtYXJrdXAgbGFuZ3VhZ2VzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV81NiIgaHJlZj0iI0lEWDBfNTYiPlY8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+dmFsaWRhdGlvbgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jdmFsaWRhdGUuaHRtbCNjc3JjZWR0MDAxIj5zb3VyY2UgdnMgYmF0Y2g8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzU4IiBocmVmPSIjSURYMF81OCI+WDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5YSFRNTAotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciPmNoYXJhY3RlciBlbmNvZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5YTUwKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2VuY29kaW5nLmh0bWwjY2VuY29kaW5nIj5jaGFyYWN0ZXIgZW5jb2Rpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+eG1sIHRlbXBsYXRlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3JjZWR0MDI5Lmh0bWwjdHNyY2VkdDAyNyI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcmluZGV4LnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIzYWM1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sI2NzcmNlZHQwMDQiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNS5odG1sI3RzcmNlZHQwMjUiIHRpdGxlPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgYXNzaXN0YW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0idGV4dCBlZGl0b3JzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDA1Lmh0bWwjdHNyY2VkdDAwNSIgdGl0bGU9IkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2Lmh0bWwjY3NyY2VkdDAwNiIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRleHQgc2VhcmNoIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNy5odG1sI3RzcmNlZHQwMDciIHRpdGxlPSJTZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGUiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzcGVsbCBjaGVjayI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCN0c3JjZWR0MDEwIiB0aXRsZT0iQ2hlY2tpbmcgc3BlbGxpbmciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDA0Lmh0bWwjY3NyY2VkdDAwNCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFya3VwIGxhbmd1YWdlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjcuaHRtbCN0c3JjZWR0MDI3IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJIVE1MIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5odG1sI3RzcmNlZHQwMjQiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSlNQIHBhZ2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOC5odG1sI3RzcmNlZHQwMjgiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI5Lmh0bWwjdHNyY2VkdDAyNyIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXJrdXAgbGFuZ3VhZ2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyB0ZXh0Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMC5odG1sI3RzcmNlZHQwMDAiIHRpdGxlPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMS5odG1sI3RzcmNlZHQwMDEiIHRpdGxlPSJTZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ0ZW1wbGF0ZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI3Lmh0bWwjdHNyY2VkdDAyNyIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRleHQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIGluIG1hcmt1cCBsYW5ndWFnZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDAwLmh0bWwjdHNyY2VkdDAwMCIgdGl0bGU9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGlvbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNvdXJjZSB2ZXJzdXMgYmF0Y2giPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jdmFsaWRhdGUuaHRtbCNjc3JjZWR0MDAxIiB0aXRsZT0iU291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImFubm90YXRpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFya3VwIGxhbmd1YWdlIHNldHRpbmdzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMS5odG1sI3RzcmNlZHQwMDEiIHRpdGxlPSJTZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY29udGVudCBhc3Npc3RhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDA1Lmh0bWwjdHNyY2VkdDAwNSIgdGl0bGU9IkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2Lmh0bWwjY3NyY2VkdDAwNiIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW5hYmxpbmcgZm9yIEpTUCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuaHRtbCN0c3JjZWR0MDIzIiB0aXRsZT0iRW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKU1AgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbmFibGluZyBjb250ZW50IGFzc2lzdGFuY2UiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDIzLmh0bWwjdHNyY2VkdDAyMyIgdGl0bGU9IkVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBKU1AgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjaGFyYWN0ZXIgZW5jb2RpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciIHRpdGxlPSJGaWxlIEVuY29kaW5nIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOC5odG1sI3RzcmNlZHQwMjgiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY29udGVudCB0eXBlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmcgZmlsZSBleHRlbnNpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIiB0aXRsZT0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZmlsZSBleHRlbnNpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyBjb250ZW50IHR5cGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIiB0aXRsZT0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZmlsZSB0eXBlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRvcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y29udGVudHR5cGUuaHRtbCN0Y29udGVudHR5cGUiIHRpdGxlPSJBc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjaGFyYWN0ZXIgZW5jb2RpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJsb2NhdGlvbiBpbiBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NlbmNvZGluZy5odG1sI2NlbmNvZGluZyIgdGl0bGU9IkZpbGUgRW5jb2RpbmciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWEhUTUwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjaGFyYWN0ZXIgZW5jb2RpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCNjZW5jb2RpbmciIHRpdGxlPSJGaWxlIEVuY29kaW5nIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNoYXJhY3RlciBlbmNvZGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NlbmNvZGluZy5odG1sI2NlbmNvZGluZyIgdGl0bGU9IkZpbGUgRW5jb2RpbmciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgdGVtcGxhdGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOS5odG1sI3RzcmNlZHQwMjciIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic3BlbGwgY2hlY2siPgotICAgIDxlbnRyeSBrZXl3b3JkPSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCN0c3JjZWR0MDEwIiB0aXRsZT0iQ2hlY2tpbmcgc3BlbGxpbmciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSFRNTCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRlbXBsYXRlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0icmVtb3ZpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjQuaHRtbCN0c3JjZWR0MDI0IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjQuaHRtbCN0c3JjZWR0MDI0IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic25pcHBldHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjYuaHRtbCN0c3JjZWR0MDI2IiB0aXRsZT0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkcmF3ZXIgY3VzdG9taXphdGlvbiI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuaHRtbCN0c3JjZWR0MDE0IiB0aXRsZT0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkcmF3ZXJzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNS5odG1sI3RzcmNlZHQwMTUiIHRpdGxlPSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgaXRlbXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDIyLmh0bWwjdHNyY2VkdDAyMiIgdGl0bGU9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1vZGlmeWluZyBkcmF3ZXJzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sI3RzcmNlZHQwMTYiIHRpdGxlPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlNuaXBwZXRzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NzcmNlZHQwMDEuaHRtbCNjc3JjZWR0MDAxIiB0aXRsZT0iU25pcHBldHMgdmlldyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkcmF3ZXJzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic25pcHBldHMgdmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuaHRtbCN0c3JjZWR0MDE2IiB0aXRsZT0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk3YzJmMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgYW5kIHNuaXBwZXRzIGRvY3VtZW50YXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzE1ZGVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Zy1pbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwIHBhZ2VzICAgICAgLS0+Ci08IS0tIGZvciB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgKHNvdXJjZSBlZGl0b3JzKS4gICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MgZmlsZT0ic3NlX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sIi8+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5sdWNlbmVTZWFyY2hQYXJ0aWNpcGFudHMiPgotICAgICAgPGJpbmRpbmcgcGFydGljaXBhbnRJZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLnhodG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9zc2VfdG9jLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MGI1OWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGlkPSJ3c3Rzc2V0b2MiIGxpbmtpbmc9Im5vbmUiIHRpdGxlPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NzcmNlZHQwMDQuZGl0YSIgbmF2dGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMDAuZGl0YSIgbG9ja3RpdGxlPSJ5ZXMiIG5hdnRpdGxlPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAiDQotdHlwZT0idGFzayI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jdmFsaWRhdGUuZGl0YSIgbmF2dGl0bGU9IlNvdXJjZSBhbmQgYmF0Y2ggdmFsaWRhdGlvbiINCi10eXBlPSJjb25jZXB0Ij48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNS5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiDQotdHlwZT0idGFzayI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDAxLmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5kaXRhIiBuYXZ0aXRsZT0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiDQotdHlwZT0idGFzayI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2LmRpdGEiIG5hdnRpdGxlPSJDb250ZW50IGFzc2lzdCIgdHlwZT0iY29uY2VwdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuZGl0YSIgbmF2dGl0bGU9Ik1ha2luZyBjb250ZW50IGFzc2lzdCB3b3JrIGZvciBKU1AgZmlsZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmRpdGEiIG5hdnRpdGxlPSJBc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggZmlsZSB0eXBlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2VuY29kaW5nLmRpdGEiIG5hdnRpdGxlPSJGaWxlIEVuY29kaW5nIiB0eXBlPSJjb25jZXB0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNy5kaXRhIiBuYXZ0aXRsZT0iU2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDEwLmRpdGEiIG5hdnRpdGxlPSJDaGVja2luZyBzcGVsbGluZyIgdHlwZT0idGFzayI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjcuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3Ig0KLXR5cGU9InRhc2siPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI5LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNi5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciDQotdHlwZT0idGFzayI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jc3JjZWR0MDAxLmRpdGEiIG5hdnRpdGxlPSJTbmlwcGV0cyB2aWV3IiB0eXBlPSJjb25jZXB0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMTUuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDIyLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIHNuaXBwZXQgaXRlbXMiIHR5cGU9InRhc2siPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDE2LmRpdGEiIG5hdnRpdGxlPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbHRvb2xza2V5LmRpdGEiDQotbmF2dGl0bGU9IlNvdXJjZSBlZGl0b3Iga2V5Ym9hcmQgc2hvcnRjdXRzIiBzY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTUzNjE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9zc2VfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIHRvcGljPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9InRvcGljcy9jc3JjZWR0MDA0Lmh0bWwiPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAiIGhyZWY9InRvcGljcy90c3JjZWR0MDAwLmh0bWwiPgotPHRvcGljIGxhYmVsPSJTb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb24iIGhyZWY9InRvcGljcy9jdmFsaWRhdGUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjUuaHRtbCI+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMDEuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9InRvcGljcy90c3JjZWR0MDA1Lmh0bWwiPgotPHRvcGljIGxhYmVsPSJDb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL2NzcmNlZHQwMDYuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJNYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyMy5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJBc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggZmlsZSB0eXBlcyIgaHJlZj0idG9waWNzL3Rjb250ZW50dHlwZS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkZpbGUgRW5jb2RpbmciIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGUiIGhyZWY9InRvcGljcy90c3JjZWR0MDA3Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ2hlY2tpbmcgc3BlbGxpbmciIGhyZWY9InRvcGljcy90c3JjZWR0MDEwLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXciIGhyZWY9InRvcGljcy90c3JjZWR0MDI3Lmh0bWwiPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90c3JjZWR0MDI5Lmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNi5odG1sIj4KLTx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0idG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgc25pcHBldHMgZHJhd2VycyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMTUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNuaXBwZXQgaXRlbXMiIGhyZWY9InRvcGljcy90c3JjZWR0MDIyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGVkaXRvciBrZXlib2FyZCBzaG9ydGN1dHMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5odG1sIi8+Ci08L3RvcGljPgotPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY2VuY29kaW5nLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTczMjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gIi4uXGR0ZFxjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNlbmNvZGluZyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RmlsZSBFbmNvZGluZzwvdGl0bGU+DQotPHNob3J0ZGVzYz48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5jaGFyYWN0ZXIgZW5jb2Rpbmc8aW5kZXh0ZXJtPmxvY2F0aW9uIGluIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5KU1AgZmlsZXM8aW5kZXh0ZXJtPmNoYXJhY3RlciBlbmNvZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WEhUTUw8aW5kZXh0ZXJtPmNoYXJhY3RlciBlbmNvZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MPGluZGV4dGVybT5jaGFyYWN0ZXIgZW5jb2Rpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+IFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gWE1MLCAoWClIVE1MIGZpbGVzLCBhbmQgSlNQIGZpbGVzIGNhbiBiZSBzcGVjaWZpZWQNCi1hbmQgaW52b2tlZCBpbiBtYW55IGRpZmZlcmVudCB3YXlzOyBob3dldmVyLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3Ugc3BlY2lmeQ0KLXRoZSBlbmNvZGluZyBpbiBlYWNoIG9uZSBvZiB5b3VyIHNvdXJjZSBmaWxlcywgZm9yIHRoYXQgaXMgd2hlcmUgbWFueSBYTUwsDQotSFRNTCwgSlNQIGVkaXRvcnMgZXhwZWN0IHRvIGZpbmQgdGhlIGVuY29kaW5nLjwvcD4NCi08cD5Gb3IgZXhhbXBsZSwgZm9yIEpTUCBmaWxlcywgeW91IG1pZ2h0IHVzZSB0aGUgcGFnZUVuY29kaW5nIGF0dHJpYnV0ZSBhbmQvb3INCi10aGUgY29udGVudFR5cGUgYXR0cmlidXRlIGluIHRoZSBwYWdlIGRpcmVjdGl2ZSwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZw0KLWV4YW1wbGU6PGNvZGVibG9jaz4mbHQ7JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIg0KLSAgICBwYWdlRW5jb2Rpbmc9IklTTy04ODU5LTEiJSZndDsNCi08L2NvZGVibG9jaz48L3A+DQotPHA+Rm9yIFhNTCBmaWxlcywgeW91IG1pZ2h0IHVzZSB0aGUgZW5jb2RpbmcgcHNldWRvLWF0dHJpYnV0ZSBpbiB0aGUgeG1sIGRlY2xhcmF0aW9uDQotYXQgdGhlIHN0YXJ0IG9mIGEgZG9jdW1lbnQgb3IgdGhlIHRleHQgZGVjbGFyYXRpb24gYXQgdGhlIHN0YXJ0IG9mIGFuIGVudGl0eSwNCi1hcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6IDxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz48L2NvZGVibG9jaz48L3A+DQotPHA+Rm9yIChYKUhUTUwgZmlsZXMsIHlvdSBtaWdodCB1c2UgdGhlICZsdDttZXRhJmd0OyB0YWcgaW5zaWRlIHRoZSAmbHQ7aGVhZCZndDsNCi10YWdzLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PGNvZGVibG9jaz4mbHQ7bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvPjwvY29kZWJsb2NrPjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY2VuY29kaW5nLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjYzZjRkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY2VuY29kaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJGaWxlIEVuY29kaW5nIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiIC8+Ci08bWV0YSBjb250ZW50PSJjaGFyYWN0ZXIgZW5jb2RpbmcsIGxvY2F0aW9uIGluIGZpbGVzLCBKU1AgZmlsZXMsIFhIVE1MLCBYTUwiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJjaGFyYWN0ZXIgZW5jb2RpbmcsIGxvY2F0aW9uIGluIGZpbGVzLCBKU1AgZmlsZXMsIFhIVE1MLCBYTUwiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNlbmNvZGluZyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkZpbGUgRW5jb2Rpbmc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNlbmNvZGluZyI+PGEgbmFtZT0iY2VuY29kaW5nIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5GaWxlIEVuY29kaW5nPC9oMT4KLQotCi0KLTxkaXY+PHAgLz4KLQotPHA+IFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgaW4gWE1MLCAoWClIVE1MIGZpbGVzLCBhbmQgSlNQIGZpbGVzIGNhbiBiZSBzcGVjaWZpZWQKLWFuZCBpbnZva2VkIGluIG1hbnkgZGlmZmVyZW50IHdheXM7IGhvd2V2ZXIsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBzcGVjaWZ5Ci10aGUgZW5jb2RpbmcgaW4gZWFjaCBvbmUgb2YgeW91ciBzb3VyY2UgZmlsZXMsIGZvciB0aGF0IGlzIHdoZXJlIG1hbnkgWE1MLAotSFRNTCwgSlNQIGVkaXRvcnMgZXhwZWN0IHRvIGZpbmQgdGhlIGVuY29kaW5nLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+Rm9yIGV4YW1wbGUsIGZvciBKU1AgZmlsZXMsIHlvdSBtaWdodCB1c2UgdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgYW5kL29yCi10aGUgY29udGVudFR5cGUgYXR0cmlidXRlIGluIHRoZSBwYWdlIGRpcmVjdGl2ZSwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZwotZXhhbXBsZTo8cHJlPiZsdDslQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiCi0gICAgcGFnZUVuY29kaW5nPSJJU08tODg1OS0xIiUmZ3Q7Ci08L3ByZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJwIj5Gb3IgWE1MIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSBlbmNvZGluZyBwc2V1ZG8tYXR0cmlidXRlIGluIHRoZSB4bWwgZGVjbGFyYXRpb24KLWF0IHRoZSBzdGFydCBvZiBhIGRvY3VtZW50IG9yIHRoZSB0ZXh0IGRlY2xhcmF0aW9uIGF0IHRoZSBzdGFydCBvZiBhbiBlbnRpdHksCi1hcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6IDxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPyZndDs8L3ByZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJwIj5Gb3IgKFgpSFRNTCBmaWxlcywgeW91IG1pZ2h0IHVzZSB0aGUgJmx0O21ldGEmZ3Q7IHRhZyBpbnNpZGUgdGhlICZsdDtoZWFkJmd0OwotdGFncywgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjxwcmU+Jmx0O21ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgLyZndDs8L3ByZT4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4NWM5NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gIi4uXGR0ZFxjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNzcmNlZHQwMDEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNuaXBwZXRzIHZpZXc8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcNCi1vYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4sIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aA0KLWZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+U25pcHBldHMgdmlldzxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+IFRoZSBTbmlwcGV0cyB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UNCi1kZWZpbmUgYW5kIGluY2x1ZGUuIFRvIHZpZXcgb3IgY29sbGFwc2UgdGhlIG9iamVjdHMgaW4gYSBzcGVjaWZpYyBkcmF3ZXIsDQotY2xpY2sgdGhlIGRyYXdlciBuYW1lLjwvcD4NCi08cD5UaGUgU25pcHBldHMgdmlldyBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczogPHVsPg0KLTxsaT5EcmFnLWFuZC1kcm9wIHRvIHZhcmlvdXMgc291cmNlIGVkaXRpbmcgcGFnZXM6IFlvdSBjYW4gZHJhZyBpdGVtcyBmcm9tDQotdGhlIHZpZXcgaW50byB0aGUgYWN0aXZlIGVkaXRvciBhbmQgdGhlIHRleHQgd2lsbCBiZSBkcm9wcGVkIGludG8gdGhlIGRvY3VtZW50DQotYXQgdGhlIGN1cnNvciBsb2NhdGlvbiA8L2xpPg0KLTxsaT5Eb3VibGUtY2xpY2sgc3VwcG9ydDogWW91IGNhbiBkb3VibGUtY2xpY2sgb24gYW4gaXRlbSBhbmQgaGF2ZSBpdCBpbnNlcnRlZA0KLWF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgYWN0aXZlIGVkaXRvciA8L2xpPg0KLTxsaT5Vc2VyLWRlZmluZWQgZHJhd2VycyBhbmQgaXRlbXM6IFlvdSBjYW4gZGVmaW5lLCBlZGl0LCBhbmQgcmVtb3ZlIGl0ZW1zDQotZnJvbSB2aWV3IGRyYXdlcnMgYXMgZGVzaXJlZC48L2xpPg0KLTxsaT5QbHVnLWluLWRlZmluZWQgZHJhd2VycyBhbmQgaXRlbXM6IFBsdWctaW4gZGV2ZWxvcGVycyBjYW4gY29udHJpYnV0ZSBhDQotZGVmYXVsdCBsaXN0IG9mIGl0ZW1zIHRvIHRoZWlyIG93biBkcmF3ZXJzLjwvbGk+DQotPGxpPlZhcmlhYmxlcyBpbiBpbnNlcnRpb25zOiBCeSBkZWZhdWx0LCBpdGVtcyB3aWxsIGJlIGVkaXRlZCB1c2luZyBhIGRpYWxvZw0KLWFuZCwgd2hlbiBpbnNlcnRlZCwgeW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgdmFyaWFibGVzLjwvbGk+DQotPGxpPkN1c3RvbWl6YXRpb246IFlvdSBjYW4gc2VsZWN0IHdoaWNoIGRyYXdlcnMgYW5kIGl0ZW1zIGFyZSBzaG93biBpbiB0aGUNCi1TbmlwcGV0cyB2aWV3LjwvbGk+DQotPGxpPkN1c3RvbSBpbnNlcnRpb246IFBsdWctaW4gZGV2ZWxvcGVycyBjYW4gY3VzdG9taXplIHRoZSBiZWhhdmlvciBvZiBpdGVtcw0KLXNvIHRoYXQgd2hlbiB0aGV5IGFyZSBkcm9wcGVkIGR1cmluZyBhIGRyYWctYW5kLWRyb3AgYWN0aW9uLCBib3RoIHRoZSB0ZXh0DQotdGhhdCBpcyBpbnNlcnRlZCBhbmQgdGhlIGluc2VydGlvbiBsb2NhdGlvbiBhcmUgc3RyaWN0bHkgZGVmaW5lZC48L2xpPg0KLTwvdWw+PC9wPg0KLTwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjYuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjIuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgc25pcHBldCBpdGVtczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTYuZGl0YSI+PGxpbmt0ZXh0PkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yDQotZHJhd2VyczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDUzZjlkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU25pcHBldHMgdmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4iIC8+Ci08bWV0YSBjb250ZW50PSJTbmlwcGV0cyB2aWV3LCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlNuaXBwZXRzIHZpZXcsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDIyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNzcmNlZHQwMDEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TbmlwcGV0cyB2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjc3JjZWR0MDAxIj48YSBuYW1lPSJjc3JjZWR0MDAxIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TbmlwcGV0cyB2aWV3PC9oMT4KLQotCi0KLTxkaXY+PHA+VGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcKLW9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB04oSiLCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGgKLWZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuPC9wPgotCi08cD4gVGhlIFNuaXBwZXRzIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdQotZGVmaW5lIGFuZCBpbmNsdWRlLiBUbyB2aWV3IG9yIGNvbGxhcHNlIHRoZSBvYmplY3RzIGluIGEgc3BlY2lmaWMgZHJhd2VyLAotY2xpY2sgdGhlIGRyYXdlciBuYW1lLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+VGhlIFNuaXBwZXRzIHZpZXcgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6IDx1bD4KLTxsaT5EcmFnLWFuZC1kcm9wIHRvIHZhcmlvdXMgc291cmNlIGVkaXRpbmcgcGFnZXM6IFlvdSBjYW4gZHJhZyBpdGVtcyBmcm9tCi10aGUgdmlldyBpbnRvIHRoZSBhY3RpdmUgZWRpdG9yIGFuZCB0aGUgdGV4dCB3aWxsIGJlIGRyb3BwZWQgaW50byB0aGUgZG9jdW1lbnQKLWF0IHRoZSBjdXJzb3IgbG9jYXRpb24gPC9saT4KLQotPGxpPkRvdWJsZS1jbGljayBzdXBwb3J0OiBZb3UgY2FuIGRvdWJsZS1jbGljayBvbiBhbiBpdGVtIGFuZCBoYXZlIGl0IGluc2VydGVkCi1hdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gaW4gdGhlIGFjdGl2ZSBlZGl0b3IgPC9saT4KLQotPGxpPlVzZXItZGVmaW5lZCBkcmF3ZXJzIGFuZCBpdGVtczogWW91IGNhbiBkZWZpbmUsIGVkaXQsIGFuZCByZW1vdmUgaXRlbXMKLWZyb20gdmlldyBkcmF3ZXJzIGFzIGRlc2lyZWQuPC9saT4KLQotPGxpPlBsdWctaW4tZGVmaW5lZCBkcmF3ZXJzIGFuZCBpdGVtczogUGx1Zy1pbiBkZXZlbG9wZXJzIGNhbiBjb250cmlidXRlIGEKLWRlZmF1bHQgbGlzdCBvZiBpdGVtcyB0byB0aGVpciBvd24gZHJhd2Vycy48L2xpPgotCi08bGk+VmFyaWFibGVzIGluIGluc2VydGlvbnM6IEJ5IGRlZmF1bHQsIGl0ZW1zIHdpbGwgYmUgZWRpdGVkIHVzaW5nIGEgZGlhbG9nCi1hbmQsIHdoZW4gaW5zZXJ0ZWQsIHlvdSB3aWxsIGJlIHByb21wdGVkIGZvciB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIHZhcmlhYmxlcy48L2xpPgotCi08bGk+Q3VzdG9taXphdGlvbjogWW91IGNhbiBzZWxlY3Qgd2hpY2ggZHJhd2VycyBhbmQgaXRlbXMgYXJlIHNob3duIGluIHRoZQotU25pcHBldHMgdmlldy48L2xpPgotCi08bGk+Q3VzdG9tIGluc2VydGlvbjogUGx1Zy1pbiBkZXZlbG9wZXJzIGNhbiBjdXN0b21pemUgdGhlIGJlaGF2aW9yIG9mIGl0ZW1zCi1zbyB0aGF0IHdoZW4gdGhleSBhcmUgZHJvcHBlZCBkdXJpbmcgYSBkcmFnLWFuZC1kcm9wIGFjdGlvbiwgYm90aCB0aGUgdGV4dAotdGhhdCBpcyBpbnNlcnRlZCBhbmQgdGhlIGluc2VydGlvbiBsb2NhdGlvbiBhcmUgc3RyaWN0bHkgZGVmaW5lZC48L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTQuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3IGJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuIj5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNS5odG1sIiB0aXRsZT0iIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iIj5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTYuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiI+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IKLWRyYXdlcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTAyY2JlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gIi4uXGR0ZFxjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNzcmNlZHQwMDQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxuYXZ0aXRsZT5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz48cT5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9yPC9xPiBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdA0KLXlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3INCi1YTUwuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxrZXl3b3JkPnNvdXJjZSBlZGl0b3JzPC9rZXl3b3JkPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD48aW5kZXh0ZXJtPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLVRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIHJlcHJlc2VudGVkIGJ5IHZhcmlvdXMgZWRpdG9ycyB0aGF0IHlvdSBjYW4NCi11c2UgdG8gZWRpdCBmaWxlcyBjb2RlZCB3aXRoIG1hcmt1cCB0YWdzOjwvcD4NCi08dGFibGU+DQotPHRncm91cCBjb2xzPSIzIj48Y29sc3BlYyBjb2xuYW1lPSJjb2wxIiBjb2x3aWR0aD0iODkqIi8+PGNvbHNwZWMgY29sbmFtZT0iY29sMiINCi1jb2x3aWR0aD0iMTM0KiIvPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMwIiBjb2x3aWR0aD0iNjkqIi8+DQotPHRoZWFkPg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiIHZhbGlnbj0idG9wIj5GaWxlIHR5cGU8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIiB2YWxpZ249InRvcCI+RWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiIHZhbGlnbj0idG9wIj5Db250ZW50IGFzc2lzdD88L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGhlYWQ+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkNhc2NhZGluZyBzdHlsZSBzaGVldDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkNTUyBzb3VyY2UgcGFnZSBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+WWVzPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb25zPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+RFREIHNvdXJjZSBwYWdlIGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ObzwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+SFRNTDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkhUTUwgc291cmNlIHBhZ2UgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPlllczwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+PHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiBzb3VyY2UgcGFnZSBlZGl0b3Igb3Igc291cmNlDQotdGFiIG9mIEphdmFTY3JpcHQgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPlllczwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+SlNQPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+SlNQIHNvdXJjZSBwYWdlIGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ZZXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPlhNTDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPlNvdXJjZSB0YWIgb2YgWE1MIGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ZZXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPlhTRCAoc2NoZW1hKTwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPlNvdXJjZSB0YWIgb2YgWE1MIHNjaGVtYSBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+WWVzPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPHA+WW91IGNhbiBhY2Nlc3MgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgYnkgcmlnaHQtY2xpY2tpbmcgb24gYSByZWxldmFudA0KLWZpbGUgbmFtZSBpbiBOYXZpZ2F0b3Igb3IgUGFja2FnZSBFeHBsb3JlciB2aWV3IGFuZCB0aGVuIGNsaWNraW5nIDx1aWNvbnRyb2w+T3Blbg0KLVdpdGg8L3VpY29udHJvbD4gYW5kIHNlbGVjdGluZyB0aGUgZWRpdG9yIG1lbnRpb25lZCBhYm92ZS48L3A+DQotPHA+VGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGludGVyZmFjZSByZWdhcmRsZXNzIG9mDQotdGhlIG1hcmt1cCBsYW5ndWFnZSB3aXRoIHdoaWNoIGl0IGlzIGFzc29jaWF0ZWQuIEl0IHByb3ZpZGVzIGNhcGFiaWxpdGllcw0KLXN1Y2ggYXMgZmluZCBhbmQgcmVwbGFjZSwgdW5kbywgcmVkbywgYSBzcGVsbGluZyBjaGVja2VyLCBhbmQgY29kaW5nIGFzc2lzdGFuY2UNCi0odW5sZXNzIG90aGVyd2lzZSBub3RlZCkuIEl0IGFsc28gaGlnaGxpZ2h0cyBzeW50YXggaW4gZGlmZmVyZW50IGNvbG9ycy4gRm9sbG93aW5nDQotaXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBzb21lIG9mIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yJ3MgY2FwYWJpbGl0aWVzOjwvcD4NCi08ZGw+PGRsZW50cnk+DQotPGR0PnN5bnRheCBoaWdobGlnaHRpbmc8L2R0Pg0KLTxkZD5FYWNoIGtleXdvcmQgdHlwZSBhbmQgc3ludGF4IHR5cGUgaXMgaGlnaGxpZ2h0ZWQgZGlmZmVyZW50bHksIGVuYWJsaW5nDQoteW91IHRvIGVhc2lseSBmaW5kIGEgY2VydGFpbiBraW5kIG9mIGtleXdvcmQgZm9yIGVkaXRpbmcuIEZvciBleGFtcGxlLCBpbg0KLUhUTUwsIGVsZW1lbnQgbmFtZXMsIGF0dHJpYnV0ZSBuYW1lcywgYXR0cmlidXRlIHZhbHVlcywgYW5kIGNvbW1lbnRzIGhhdmUNCi1kaWZmZXJlbnQgY29sb3JzOyBpbiA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiwgZnVuY3Rpb24gYW5kIHZhcmlhYmxlDQotbmFtZXMsIHF1b3RlZCB0ZXh0IHN0cmluZ3MsIGFuZCBjb21tZW50cyBoYXZlIGRpZmZlcmVudCBjb2xvcnMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PnVubGltaXRlZCB1bmRvIGFuZCByZWRvPC9kdD4NCi08ZGQ+VGhlc2Ugb3B0aW9ucyBhbGxvdyB5b3UgdG8gaW5jcmVtZW50YWxseSB1bmRvIGFuZCByZWRvIGV2ZXJ5IGNoYW5nZSBtYWRlDQotdG8gYSBmaWxlIGZvciB0aGUgZW50aXJlIGVkaXRpbmcgc2Vzc2lvbi4gRm9yIHRleHQsIGNoYW5nZXMgYXJlIGluY3JlbWVudGVkDQotb25lIGNoYXJhY3RlciBvciBzZXQgb2Ygc2VsZWN0ZWQgY2hhcmFjdGVycyBhdCBhIHRpbWUuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PmNvbnRlbnQgYXNzaXN0PC9kdD4NCi08ZGQ+Q29udGVudCBhc3Npc3QgaGVscHMgeW91IHRvIGluc2VydCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiBmdW5jdGlvbnMsIEhUTUwgdGFncywgb3INCi1vdGhlciBrZXl3b3Jkcy4gQ2hvaWNlcyBhdmFpbGFibGUgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgYXJlIGJhc2VkIG9uDQotZnVuY3Rpb25zIGRlZmluZWQgYnkgdGhlIHN5bnRheCBvZiB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIGZpbGUgaXMgY29kZWQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PnVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMgYW5kIHNuaXBwZXRzPC9kdD4NCi08ZGQ+QnkgdXNpbmcgdGhlIFNuaXBwZXRzIHZpZXcsIHlvdSBjYW4gYWNjZXNzIHVzZXItZGVmaW5lZCBjb2RlIHNuaXBwZXRzDQotYW5kIChmb3IgYWxsIGNvZGUgdHlwZXMgZXhjZXB0IDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+KSB0ZW1wbGF0ZXMgdG8gaGVscCB5b3UNCi1xdWlja2x5IGFkZCByZWd1bGFybHkgdXNlZCB0ZXh0IHN0cmluZ3MuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PmZ1bmN0aW9uIHNlbGVjdGlvbjwvZHQ+DQotPGRkPkJhc2VkIG9uIHRoZSBsb2NhdGlvbiBvZiB5b3VyIGN1cnNvciwgdGhlIGZ1bmN0aW9uIG9yIHRhZyBzZWxlY3Rpb24gaW5kaWNhdG9yDQotaGlnaGxpZ2h0cyB0aGUgbGluZSBudW1iZXJzIHRoYXQgaW5jbHVkZSBhIGZ1bmN0aW9uIG9yIHRhZyBpbiB0aGUgdmVydGljYWwNCi1ydWxlciBvbiB0aGUgbGVmdCBhcmVhIG9mIHRoZSBTb3VyY2UgcGFnZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+cG9wLXVwIG1lbnUgb3B0aW9uczwvZHQ+DQotPGRkPlRoZXNlIGFyZSB0aGUgc2FtZSBlZGl0aW5nIG9wdGlvbnMgYXZhaWxhYmxlIGluIHRoZSB3b3JrYmVuY2ggPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+IG1lbnUuPC9kZD4NCi08L2RsZW50cnk+PC9kbD4NCi08L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDYuZGl0YSI+PGxpbmt0ZXh0PkNvbnRlbnQgYXNzaXN0PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzA4NjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iIC8+Ci08bWV0YSBjb250ZW50PSJzb3VyY2UgZWRpdG9ycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNvdXJjZSBlZGl0b3JzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3NyY2VkdDAwNCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjc3JjZWR0MDA0Ij48YSBuYW1lPSJjc3JjZWR0MDA0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+PHNwYW4gY2xhc3M9InEiPiJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIjwvc3Bhbj4gaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQKLXlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IKLVhNTC48L3A+Ci0KLTxwPgotCi0KLVRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIHJlcHJlc2VudGVkIGJ5IHZhcmlvdXMgZWRpdG9ycyB0aGF0IHlvdSBjYW4KLXVzZSB0byBlZGl0IGZpbGVzIGNvZGVkIHdpdGggbWFya3VwIHRhZ3M6PC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0aGVhZCBhbGlnbj0ibGVmdCI+Ci08dHI+Ci08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSIzMC40Nzk0NTIwNTQ3OTQ1MiUiIGlkPSJOMTAwODYiPkZpbGUgdHlwZTwvdGg+Ci0KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaWQ9Ik4xMDA4RSI+RWRpdG9yPC90aD4KLQotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBpZD0iTjEwMDk2Ij5Db250ZW50IGFzc2lzdD88L3RoPgotCi08L3RyPgotCi08L3RoZWFkPgotCi08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMC40Nzk0NTIwNTQ3OTQ1MiUiIGhlYWRlcnM9Ik4xMDA4NiAiPkNhc2NhZGluZyBzdHlsZSBzaGVldDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaGVhZGVycz0iTjEwMDhFICI+Q1NTIHNvdXJjZSBwYWdlIGVkaXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjYzMDEzNjk4NjMwMTM3JSIgaGVhZGVycz0iTjEwMDk2ICI+WWVzPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzAuNDc5NDUyMDU0Nzk0NTIlIiBoZWFkZXJzPSJOMTAwODYgIj5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb25zPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOEUgIj5EVEQgc291cmNlIHBhZ2UgZWRpdG9yPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBoZWFkZXJzPSJOMTAwOTYgIj5ObzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDg2ICI+SFRNTDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaGVhZGVycz0iTjEwMDhFICI+SFRNTCBzb3VyY2UgcGFnZSBlZGl0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGhlYWRlcnM9Ik4xMDA5NiAiPlllczwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDg2ICI+SmF2YVNjcmlwdOKEojwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaGVhZGVycz0iTjEwMDhFICI+SmF2YVNjcmlwdCBzb3VyY2UgcGFnZSBlZGl0b3Igb3Igc291cmNlCi10YWIgb2YgSmF2YVNjcmlwdCBlZGl0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGhlYWRlcnM9Ik4xMDA5NiAiPlllczwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDg2ICI+SlNQPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOEUgIj5KU1Agc291cmNlIHBhZ2UgZWRpdG9yPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBoZWFkZXJzPSJOMTAwOTYgIj5ZZXM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMC40Nzk0NTIwNTQ3OTQ1MiUiIGhlYWRlcnM9Ik4xMDA4NiAiPlhNTDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaGVhZGVycz0iTjEwMDhFICI+U291cmNlIHRhYiBvZiBYTUwgZWRpdG9yPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBoZWFkZXJzPSJOMTAwOTYgIj5ZZXM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMC40Nzk0NTIwNTQ3OTQ1MiUiIGhlYWRlcnM9Ik4xMDA4NiAiPlhTRCAoc2NoZW1hKTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjQ1Ljg5MDQxMDk1ODkwNDExJSIgaGVhZGVycz0iTjEwMDhFICI+U291cmNlIHRhYiBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjYzMDEzNjk4NjMwMTM3JSIgaGVhZGVycz0iTjEwMDk2ICI+WWVzPC90ZD4KLQotPC90cj4KLQotPC90Ym9keT4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08cD5Zb3UgY2FuIGFjY2VzcyB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBieSByaWdodC1jbGlja2luZyBvbiBhIHJlbGV2YW50Ci1maWxlIG5hbWUgaW4gTmF2aWdhdG9yIG9yIFBhY2thZ2UgRXhwbG9yZXIgdmlldyBhbmQgdGhlbiBjbGlja2luZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuCi1XaXRoPC9zcGFuPiBhbmQgc2VsZWN0aW5nIHRoZSBlZGl0b3IgbWVudGlvbmVkIGFib3ZlLjwvcD4KLQotPHA+VGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGludGVyZmFjZSByZWdhcmRsZXNzIG9mCi10aGUgbWFya3VwIGxhbmd1YWdlIHdpdGggd2hpY2ggaXQgaXMgYXNzb2NpYXRlZC4gSXQgcHJvdmlkZXMgY2FwYWJpbGl0aWVzCi1zdWNoIGFzIGZpbmQgYW5kIHJlcGxhY2UsIHVuZG8sIHJlZG8sIGEgc3BlbGxpbmcgY2hlY2tlciwgYW5kIGNvZGluZyBhc3Npc3RhbmNlCi0odW5sZXNzIG90aGVyd2lzZSBub3RlZCkuIEl0IGFsc28gaGlnaGxpZ2h0cyBzeW50YXggaW4gZGlmZmVyZW50IGNvbG9ycy4gRm9sbG93aW5nCi1pcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHNvbWUgb2YgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IncyBjYXBhYmlsaXRpZXM6PC9wPgotCi08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+c3ludGF4IGhpZ2hsaWdodGluZzwvZHQ+Ci0KLTxkZD5FYWNoIGtleXdvcmQgdHlwZSBhbmQgc3ludGF4IHR5cGUgaXMgaGlnaGxpZ2h0ZWQgZGlmZmVyZW50bHksIGVuYWJsaW5nCi15b3UgdG8gZWFzaWx5IGZpbmQgYSBjZXJ0YWluIGtpbmQgb2Yga2V5d29yZCBmb3IgZWRpdGluZy4gRm9yIGV4YW1wbGUsIGluCi1IVE1MLCBlbGVtZW50IG5hbWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGF0dHJpYnV0ZSB2YWx1ZXMsIGFuZCBjb21tZW50cyBoYXZlCi1kaWZmZXJlbnQgY29sb3JzOyBpbiBKYXZhU2NyaXB0LCBmdW5jdGlvbiBhbmQgdmFyaWFibGUKLW5hbWVzLCBxdW90ZWQgdGV4dCBzdHJpbmdzLCBhbmQgY29tbWVudHMgaGF2ZSBkaWZmZXJlbnQgY29sb3JzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPnVubGltaXRlZCB1bmRvIGFuZCByZWRvPC9kdD4KLQotPGRkPlRoZXNlIG9wdGlvbnMgYWxsb3cgeW91IHRvIGluY3JlbWVudGFsbHkgdW5kbyBhbmQgcmVkbyBldmVyeSBjaGFuZ2UgbWFkZQotdG8gYSBmaWxlIGZvciB0aGUgZW50aXJlIGVkaXRpbmcgc2Vzc2lvbi4gRm9yIHRleHQsIGNoYW5nZXMgYXJlIGluY3JlbWVudGVkCi1vbmUgY2hhcmFjdGVyIG9yIHNldCBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzIGF0IGEgdGltZS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5jb250ZW50IGFzc2lzdDwvZHQ+Ci0KLTxkZD5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgdG8gaW5zZXJ0IEphdmFTY3JpcHQgZnVuY3Rpb25zLCBIVE1MIHRhZ3MsIG9yCi1vdGhlciBrZXl3b3Jkcy4gQ2hvaWNlcyBhdmFpbGFibGUgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgYXJlIGJhc2VkIG9uCi1mdW5jdGlvbnMgZGVmaW5lZCBieSB0aGUgc3ludGF4IG9mIHRoZSBsYW5ndWFnZSBpbiB3aGljaCB0aGUgZmlsZSBpcyBjb2RlZC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj51c2VyLWRlZmluZWQgdGVtcGxhdGVzIGFuZCBzbmlwcGV0czwvZHQ+Ci0KLTxkZD5CeSB1c2luZyB0aGUgU25pcHBldHMgdmlldywgeW91IGNhbiBhY2Nlc3MgdXNlci1kZWZpbmVkIGNvZGUgc25pcHBldHMKLWFuZCAoZm9yIGFsbCBjb2RlIHR5cGVzIGV4Y2VwdCBKYXZhU2NyaXB0KSB0ZW1wbGF0ZXMgdG8gaGVscCB5b3UKLXF1aWNrbHkgYWRkIHJlZ3VsYXJseSB1c2VkIHRleHQgc3RyaW5ncy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5mdW5jdGlvbiBzZWxlY3Rpb248L2R0PgotCi08ZGQ+QmFzZWQgb24gdGhlIGxvY2F0aW9uIG9mIHlvdXIgY3Vyc29yLCB0aGUgZnVuY3Rpb24gb3IgdGFnIHNlbGVjdGlvbiBpbmRpY2F0b3IKLWhpZ2hsaWdodHMgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGluY2x1ZGUgYSBmdW5jdGlvbiBvciB0YWcgaW4gdGhlIHZlcnRpY2FsCi1ydWxlciBvbiB0aGUgbGVmdCBhcmVhIG9mIHRoZSBTb3VyY2UgcGFnZS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5wb3AtdXAgbWVudSBvcHRpb25zPC9kdD4KLQotPGRkPlRoZXNlIGFyZSB0aGUgc2FtZSBlZGl0aW5nIG9wdGlvbnMgYXZhaWxhYmxlIGluIHRoZSB3b3JrYmVuY2ggPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4gbWVudS48L2RkPgotCi08L2RsPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDYuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi4iPkNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJmZTlkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gIi4uXGR0ZFxjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNzcmNlZHQwMDYiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNvbnRlbnQgYXNzaXN0PC90aXRsZT4NCi08c2hvcnRkZXNjPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yDQotZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yDQotaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMNCi1mb3IgY29tcGxldGlvbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9ImNzcmNlZHQwMDZ8MXxjb250ZW50YXNzaXN0YW5jZW92ZXJ2aWV3IiBzdGF0dXM9Im5ldyI+Y29udGVudA0KLWFzc2lzdGFuY2U8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9ImNzcmNlZHQwMDZ8MnxzdHJ1Y3R1cmVkdGV4dGVkaXRvcnNjb250ZW50YXNzaXN0YW5jZSINCi1zdGF0dXM9ImNoYW5nZWQiPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPGluZGV4dGVybT5jb250ZW50IGFzc2lzdGFuY2U8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPk1vc3Qgb2YgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGhhdmUgY29udGVudCBhc3Npc3QuIEZvciBhIGxpc3Qgb2YNCi1lZGl0b3JzIHRoYXQgaGF2ZSBjb250ZW50IGFzc2lzdCwgc2VlIDx4cmVmIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSIgdHlwZT0iY29uY2VwdCI+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+PHRpdGxlPkpTUCBjb250ZW50IGFzc2lzdDwvdGl0bGU+PHA+WW91IGhhdmUgbWFueSBvcHRpb25zIGZvciBlbWJlZGRpbmcgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYW5kDQotSFRNTCBjb2RlIGluIHlvdXIgSlNQIHBhZ2VzIGJ5IHVzaW5nIGNvbnRlbnQgYXNzaXN0LjwvcD48cD5BbGwgb2YgdGhlIEpTUA0KLXRhZ3MgYXJlIGluY2x1ZGVkIGJvdGggaW4gdGhlIHRlbXBsYXRlIGxpc3QgYW5kIGluIFhNTCBmb3JtYXQgKGZvciBleGFtcGxlLCA8Y29kZXBoPiZsdDtqc3A6ZXhwcmVzc2lvbj48L2NvZGVwaD4pLg0KLVRvIGFkZCBKU1Agc2NyaXB0bGV0IHRhZ3MsIGZvciBleGFtcGxlLCBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGFwcHJvcHJpYXRlDQotcG9zaXRpb24gaW4gdGhlIGZpbGUgYW5kIHByZXNzIEN0cmwrU3BhY2UgdG8gdXNlIGNvbnRlbnQgYXNzaXN0LiBTZWxlY3QgPGltYWdlDQotYWx0PSJKU1Agc2NyaXB0bGV0IGNvbnRlbnQgYXNzaXN0IiBocmVmPSIuLi9pbWFnZXMvbm1hY3NjcnAuZ2lmIiBwbGFjZW1lbnQ9ImlubGluZSI+DQotPC9pbWFnZT4gZnJvbSB0aGUgcHJvcG9zYWwgbGlzdCB0byBpbnNlcnQgPGNvZGVwaD4mbHQ7JSAlPjwvY29kZXBoPiAgaW4gdGhlDQotZG9jdW1lbnQuPC9wPjxwPlNjcmlwdGxldHMgYXJlIGluc2VydGVkIGluIGEgdGFnIDxjb2RlcGg+Jmx0OyUgJT48L2NvZGVwaD4uDQotRm9yIGV4YW1wbGU6IDxjb2RlYmxvY2s+Jmx0OyUgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgJT48L2NvZGVibG9jaz48L3A+PHA+VGhpcw0KLWV4YW1wbGUgd2lsbCBldmFsdWF0ZSB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc3RhdGVtZW50IHRvIGdldCB0aGUgY3VycmVudCB0aW1lIGluDQotbWlsbGlzZWNvbmRzLjwvcD48cD5UbyBoYXZlIHRoZSByZXN1bHQgb2YgdGhlIHN0YXRlbWVudCBpbnNlcnRlZCBpbiB0aGUgZmlsZSwNCi1wdXQgYW4gZXF1YWxzIHNpZ24gKD0pIGluIHRoZSBmcm9udCBvZiB0aGUgc3RhdGVtZW50LiBGb3IgZXhhbXBsZTogPGNvZGVibG9jaz4mbHQ7Yj5UaGlzIGlzIHRoZSB0aW1lIDogJmx0OyU9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpJT4mbHQ7L2I+PC9jb2RlYmxvY2sNCi0+PC9wPjxwPldoZW4geW91IGFyZSB3aXRoaW4gYSBzY3JpcHRsZXQgeW91IGFyZSB3cml0aW5nIHB1cmUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29kZS4NCi1UaGVyZWZvcmUsIGNvbnRlbnQgYXNzaXN0IHdvcmtzIGV4YWN0bHkgdGhlIHNhbWUgYXMgaXQgZG9lcyBmb3IgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGVkaXRvci4NCi1Gb3IgZXhhbXBsZSwgaWYgeW91IHJlcXVlc3QgY29udGVudCBhc3Npc3QgYWZ0ZXIgPGNvZGVwaD5TeXN0ZW08L2NvZGVwaD4sDQotY29udGVudCBhc3Npc3QgZGlzcGxheXMgYSBsaXN0IG9mIG1ldGhvZHMuIDxub3RlPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNvbnRlbnQgYXNzaXN0IHdvcmtzIG9ubHkgaW4gYSBXZWINCi1wcm9qZWN0LCBiZWNhdXNlIGl0IHJlcXVpcmVzIGEgYnVpbGRwYXRoIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsYXNzZXMuPC9ub3RlPjwvcD48cD5UaGVyZQ0KLWFyZSBhbHNvIHNwZWNpYWwgdGFncyBzdWNoIGFzIHVzZUJlYW4uIEZvciBleGFtcGxlOiA8Y29kZWJsb2NrPiZsdDtqc3A6dXNlQmVhbiBpZD0idXNlQmVhbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmciLz48L2NvZGVibG9jaz48L3A+PHA+VGhlDQotdXNlQmVhbiB0YWcgZW5hYmxlcyB5b3UgdG8gY3JlYXRlIGEgYmVhbiBjYWxsZWQgPGNvZGVwaD5hU3RyaW5nPC9jb2RlcGg+IG9mDQotdHlwZSA8Y29kZXBoPlN0cmluZzwvY29kZXBoPi4gVGhlbiB3aGVuIHlvdSB1c2UgY29udGVudCBhc3Npc3QsIHRoaXMgaXMgcmVjb2duaXplZA0KLWFzIGEgZGVjbGFyZWQgdmFyaWFibGUuIEZvciBleGFtcGxlLCBpZiB5b3UgdXNlIGNvbnRlbnQgYXNzaXN0IGFmdGVyIDxjb2RlcGg+YVN0cmluZzwvY29kZXBoPiwNCi1hcyBmb2xsb3dzOjwvcD48cD4gPGNvZGVibG9jaz4mbHQ7JSBhU3RyaW5nLiAlPiA8L2NvZGVibG9jaz50aGUgY29udGVudCBhc3Npc3QNCi1saXN0IHNob3dzIGF2YWlsYWJsZSBtZXRob2RzLiBUaGlzIGlzIGJlY2F1c2UgPGNvZGVwaD5hU3RyaW5nPC9jb2RlcGg+IGhhcw0KLWJlZW4gZGVjbGFyZWQgYXMgYSBiZWFuIG9mIHR5cGUgU3RyaW5nLjwvcD48cD5JZiB5b3UgdXNlIGNvbnRlbnQgYXNzaXN0IGFmdGVyDQotdGhlIDxjb2RlcGg+YTwvY29kZXBoPiwgYXMgZm9sbG93czogPGNvZGVibG9jaz4mbHQ7JSBhICU+IDwvY29kZWJsb2NrPmNvbnRlbnQNCi1hc3Npc3Qga25vd3MgdGhhdCA8Y29kZXBoPmFTdHJpbmc8L2NvZGVwaD4gZXhpc3RzLCBhbmQgaXQgaXMgc2hvd24gaW4gdGhlDQotY29udGVudCBhc3Npc3QgbGlzdC48L3A+PC9zZWN0aW9uPg0KLTwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDUuZGl0YSI+PGxpbmt0ZXh0PkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDQ2NzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29udGVudCBhc3Npc3QiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIiAvPgotPG1ldGEgY29udGVudD0iY29udGVudCBhc3Npc3RhbmNlLCBvdmVydmlldywgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIGNvbnRlbnQgYXNzaXN0YW5jZSIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgYXNzaXN0YW5jZSwgb3ZlcnZpZXcsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBjb250ZW50IGFzc2lzdGFuY2UiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNzcmNlZHQwMDYiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Db250ZW50IGFzc2lzdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3NyY2VkdDAwNiI+PGEgbmFtZT0iY3NyY2VkdDAwNiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29udGVudCBhc3Npc3Q8L2gxPgotCi0KLQotPGRpdj48cD5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvcgotZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yCi1pbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucwotZm9yIGNvbXBsZXRpb24uPC9wPgotCi08cD5Nb3N0IG9mIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBoYXZlIGNvbnRlbnQgYXNzaXN0LiBGb3IgYSBsaXN0IG9mCi1lZGl0b3JzIHRoYXQgaGF2ZSBjb250ZW50IGFzc2lzdCwgc2VlIDxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L2E+LiBGb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdldCBjb250ZW50Ci1hc3Npc3RhbmNlLCBzZWUgPGEgaHJlZj0idHNyY2VkdDAwNS5odG1sIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT48L3A+Ci0KLTxwPlRoZSBzZWN0aW9ucyBiZWxvdyBkZXNjcmliZSBzcGVjaWZpY3Mgb2YgSFRNTCBjb250ZW50IGFzc2lzdCwgSmF2YVNjcmlwdOKEoiBjb250ZW50Ci1hc3Npc3QsIGFuZCBKU1AgY29udGVudCBhc3Npc3QuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+SFRNTCBjb250ZW50IGFzc2lzdDwvaDQ+PHA+SFRNTCBpcyBmbGV4aWJsZSBpbiB0aGF0IHNvbWUKLUhUTUwgZWxlbWVudHMgYWxsb3cgZW5kIHRhZ3MgdG8gYmUgb3B0aW9uYWxseSBvbWl0dGVkLCBzdWNoIGFzIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlA8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5EVDwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkREPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+TEk8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5USEVBRDwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlRSPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VEQ8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5USDwvc2FtcD4sCi1hbmQgc28gb24uIE90aGVyIEhUTUwgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCB0byBoYXZlIG5vIGNvbnRlbnQgbWF5IHJlcXVpcmUKLXRoZSBlbmQgdGFnIGFsd2F5cyBiZSBvbWl0dGVkLCBzdWNoIGFzIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkJSPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+SFI8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5MSU5LPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+TUVUQTwvc2FtcD4sCi1hbmQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+SU1HPC9zYW1wPi4gVGhpcyBmbGV4aWJpbGl0eSBtYWtlcyB0aGUgY29udGVudCBhc3Npc3QgZnVuY3Rpb24KLXdpdGhpbiB0aGUgSFRNTCBzb3VyY2UgcGFnZSBlZGl0b3IgbGVzcyBwcmVjaXNlIHRoYW4gaXQgbWlnaHQgYmUgd2l0aCBhIG1vcmUKLXJpZ2lkbHkgY29uc3RyYWluZWQgbWFya3VwIGxhbmd1YWdlLjwvcD4KLTxwPkhUTUwgY29udGVudCBhc3Npc3QgaXMgbW9zdCBiZW5lZmljaWFsCi13aGVuIHlvdSBuZWVkIHRvIGNvbXBsZXRlIGEgdGFnIG5hbWUsIGFkZCBhbiBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIHdpdGhpbgotYSBzdGFydCB0YWcsIG9yIHNlbGVjdCBmcm9tIGFuIGVudW1lcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGUgdmFsdWVzLjwvcD4KLTxwPkFsdGhvdWdoCi1jb250ZW50IGFzc2lzdCBvbmx5IHNob3dzIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGhhdmUgbm90IGFscmVhZHkgYmVlbiBzcGVjaWZpZWQKLWluIGEgc3RhcnQgdGFnLCBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBncmFtbWFyIGNvbnN0cmFpbnRzIGZvciB0YWdzLgotRm9yIGV4YW1wbGUsIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5IRUFEPC9zYW1wPiBlbGVtZW50IGluIEhUTUwgb25seSBwZXJtaXRzIHplcm8gb3IKLW9uZSBvY2N1cnJlbmNlcyBvZiBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlRJVExFPC9zYW1wPiB0YWcgaW4gaXRzIGNvbnRlbnQuIElmIHlvdSBwcm9tcHQKLWZvciBjb250ZW50IGFzc2lzdCB3aXRoaW4gYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5IRUFEPC9zYW1wPiBjb250ZW50IHRoYXQgYWxyZWFkeSBjb250YWlucwotYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5USVRMRTwvc2FtcD4gdGFnLCBjb250ZW50IGFzc2lzdCB3aWxsIHN0aWxsIHNob3cgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VElUTEU8L3NhbXA+IGluCi1pdHMgcHJvcG9zYWwgbGlzdC48L3A+Ci08cD5Ib3dldmVyLCBpZiBhbiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgYWNjb3JkaW5nIHRvCi10aGUgRFREL1NjaGVtYSwgdGhhdCBhdHRyaWJ1dGUgd2lsbCBzaG93IHVwIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QsIHdpdGggYQoteWVsbG93IGNpcmNsZSBpbmRpY2F0b3Igb24gaXRzIGljb24uPC9wPgotPHA+SWYgeW91ciBjdXJzb3IgaXMgaW4gYSBwb3NpdGlvbgotd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0IG9mIGF2YWlsYWJsZSBjaG9pY2VzIGlzIGRpc3BsYXllZC4KLVRoZSBsaXN0IGlzIGJhc2VkIG9uIHRoZSBjb250ZXh0LiBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBkaXJlY3RseQotYWZ0ZXIgYW4gb3BlbmluZyBwYXJhZ3JhcGggdGFnICg8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7cCZndDs8L3NhbXA+KSAsIHRoZSBmaXJzdCBpdGVtCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB3aWxsIGJlIHRoZSBjb3JyZXNwb25kaW5nIGNsb3NpbmcgcGFyYWdyYXBoICg8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7L3AmZ3Q7PC9zYW1wPikKLXRhZy48L3A+Ci08cD5UaGUgY29udGVudCBhc3Npc3QgbGlzdCBkaXNwbGF5cyBhbGwgYXZhaWxhYmxlIHRhZ3MgZm9yIHRoZSBjdXJyZW50Ci1jdXJzb3IgcG9zaXRpb24sIGluY2x1ZGluZyB0ZW1wbGF0ZXMuIFRoZSBwaWN0dXJlIGJlbG93IHNob3dzIHRoZSBkZWZhdWx0Ci1jb250ZW50IGFzc2lzdCBsaXN0IGZvciBhIHBhcmFncmFwaCB0YWcgZXhhbXBsZTo8YnIgLz48aW1nIHNyYz0iLi4vaW1hZ2VzL25jb250YXNzLmdpZiIgYWx0PSJIVE1MIENvbnRlbnQgYXNzaXN0IiAvPjxiciAvPjwvcD4KLTxwPlRhZyBwcm9wb3NhbHMKLWFyZSBsaXN0ZWQgYWxwaGFiZXRpY2FsbHkuIElmIHlvdSB0eXBlIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0Ozwvc2FtcD4gKHRvIGJlZ2luIGEKLW5ldyB0YWcpIGJlZm9yZSBwcm9tcHRpbmcgZm9yIGNvbnRlbnQgYXNzaXN0LCBhbmQgYmVnaW4gdHlwaW5nIHRoZSBmaXJzdCBvbmUKLW9yIHR3byBsZXR0ZXJzIG9mIHRoZSB0YWcgdGhhdCB5b3Ugd2FudCB0byBhZGQsIHRoZSBwcm9wb3NhbCBsaXN0IGF1dG9tYXRpY2FsbHkKLXJlZnJlc2hlcyB0byByZWZsZWN0IHByb3Bvc2FscyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIHlvdSBoYXZlIHR5cGVkLiBJZiB5b3UKLWRvIG5vdCB0eXBlIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0Ozwvc2FtcD4gYmVmb3JlIHByb21wdGluZyBmb3IgY29udGVudCBhc3Npc3QsIHlvdQotY2FuIGNsaWNrIHdpdGhpbiB0aGUgcHJvcG9zYWwgbGlzdCBhbmQgdGhlbiB0eXBlIHRoZSBsZXR0ZXIgdGhhdCB0aGUgdGFnIGJlZ2lucwotd2l0aCwgdG8gcmVkdWNlIChzb21ld2hhdCkgdGhlIGFtb3VudCBvZiBzY3JvbGxpbmcgdG8gbG9jYXRlIHRoZSBkZXNpcmVkIHRhZy48L3A+Ci08cD5BcwoteW91IHR5cGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbGV0dGVycyBvZiB0aGUgYXR0cmlidXRlIG5hbWVzIG9yIGVudW1lcmF0ZWQKLWF0dHJpYnV0ZSB2YWx1ZXMgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8gYSB0YWcsIHRoZSBsaXN0IGF1dG9tYXRpY2FsbHkgcmVmcmVzaGVzCi10byByZWZsZWN0IHByb3Bvc2FscyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIHlvdSBoYXZlIHR5cGVkLjwvcD4KLTxkaXYgY2xhc3M9InJlc3RyaWN0aW9uIj48c3BhbiBjbGFzcz0icmVzdHJpY3Rpb250aXRsZSI+UmVzdHJpY3Rpb246PC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL25saW51eC5naWYiIGFsdD0iRm9yIExpbnV4LiIgLz4gV2hlbiB1c2luZyBMaW51eCAoTW90aWYKLW9yIEdUSykgYW5kIGEgREJDUyBsb2NhbGUsIGRvdWJsZS1jbGlja2luZyBvbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCBjYW4KLXNvbWV0aW1lcyBjYXVzZSB0aGUgSmF2YeKEoiBWTSB0byB0ZXJtaW5hdGUuIEluc3RlYWQgb2YgZG91YmxlLWNsaWNraW5nCi1vbiB0aGUgbGlzdCwgdXNlIHRoZSBhcnJvd3MgYW5kIEVudGVyIGtleXMgdG8gbWFrZSB0aGUgc2VsZWN0aW9uIGZyb20gdGhlCi1saXN0LjwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5KU1AgY29udGVudCBhc3Npc3Q8L2g0PjxwPllvdSBoYXZlIG1hbnkgb3B0aW9ucyBmb3IgZW1iZWRkaW5nIEphdmEgYW5kCi1IVE1MIGNvZGUgaW4geW91ciBKU1AgcGFnZXMgYnkgdXNpbmcgY29udGVudCBhc3Npc3QuPC9wPgotPHA+QWxsIG9mIHRoZSBKU1AKLXRhZ3MgYXJlIGluY2x1ZGVkIGJvdGggaW4gdGhlIHRlbXBsYXRlIGxpc3QgYW5kIGluIFhNTCBmb3JtYXQgKGZvciBleGFtcGxlLCA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7anNwOmV4cHJlc3Npb24mZ3Q7PC9zYW1wPikuCi1UbyBhZGQgSlNQIHNjcmlwdGxldCB0YWdzLCBmb3IgZXhhbXBsZSwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBhcHByb3ByaWF0ZQotcG9zaXRpb24gaW4gdGhlIGZpbGUgYW5kIHByZXNzIEN0cmwrU3BhY2UgdG8gdXNlIGNvbnRlbnQgYXNzaXN0LiBTZWxlY3QgPGltZyBzcmM9Ii4uL2ltYWdlcy9ubWFjc2NycC5naWYiIGFsdD0iSlNQIHNjcmlwdGxldCBjb250ZW50IGFzc2lzdCIgLz4gZnJvbSB0aGUgcHJvcG9zYWwgbGlzdCB0byBpbnNlcnQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0OyUgJSZndDs8L3NhbXA+ICBpbiB0aGUKLWRvY3VtZW50LjwvcD4KLTxkaXYgY2xhc3M9InAiPlNjcmlwdGxldHMgYXJlIGluc2VydGVkIGluIGEgdGFnIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDslICUmZ3Q7PC9zYW1wPi4KLUZvciBleGFtcGxlOiA8cHJlPiZsdDslIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICUmZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPlRoaXMKLWV4YW1wbGUgd2lsbCBldmFsdWF0ZSB0aGUgSmF2YSBzdGF0ZW1lbnQgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUgaW4KLW1pbGxpc2Vjb25kcy48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UbyBoYXZlIHRoZSByZXN1bHQgb2YgdGhlIHN0YXRlbWVudCBpbnNlcnRlZCBpbiB0aGUgZmlsZSwKLXB1dCBhbiBlcXVhbHMgc2lnbiAoPSkgaW4gdGhlIGZyb250IG9mIHRoZSBzdGF0ZW1lbnQuIEZvciBleGFtcGxlOiA8cHJlPiZsdDtiJmd0O1RoaXMgaXMgdGhlIHRpbWUgOiAmbHQ7JT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCklJmd0OyZsdDsvYiZndDs8L3ByZT4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+V2hlbiB5b3UgYXJlIHdpdGhpbiBhIHNjcmlwdGxldCB5b3UgYXJlIHdyaXRpbmcgcHVyZSBKYXZhIGNvZGUuCi1UaGVyZWZvcmUsIGNvbnRlbnQgYXNzaXN0IHdvcmtzIGV4YWN0bHkgdGhlIHNhbWUgYXMgaXQgZG9lcyBmb3IgdGhlIEphdmEgZWRpdG9yLgotRm9yIGV4YW1wbGUsIGlmIHlvdSByZXF1ZXN0IGNvbnRlbnQgYXNzaXN0IGFmdGVyIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlN5c3RlbTwvc2FtcD4sCi1jb250ZW50IGFzc2lzdCBkaXNwbGF5cyBhIGxpc3Qgb2YgbWV0aG9kcy4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEphdmEgY29udGVudCBhc3Npc3Qgd29ya3Mgb25seSBpbiBhIFdlYgotcHJvamVjdCwgYmVjYXVzZSBpdCByZXF1aXJlcyBhIGJ1aWxkcGF0aCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBKYXZhIGNsYXNzZXMuPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPlRoZXJlCi1hcmUgYWxzbyBzcGVjaWFsIHRhZ3Mgc3VjaCBhcyB1c2VCZWFuLiBGb3IgZXhhbXBsZTogPHByZT4mbHQ7anNwOnVzZUJlYW4gaWQ9InVzZUJlYW4iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8mZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPlRoZQotdXNlQmVhbiB0YWcgZW5hYmxlcyB5b3UgdG8gY3JlYXRlIGEgYmVhbiBjYWxsZWQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4gb2YKLXR5cGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+U3RyaW5nPC9zYW1wPi4gVGhlbiB3aGVuIHlvdSB1c2UgY29udGVudCBhc3Npc3QsIHRoaXMgaXMgcmVjb2duaXplZAotYXMgYSBkZWNsYXJlZCB2YXJpYWJsZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgYWZ0ZXIgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4sCi1hcyBmb2xsb3dzOjwvcD4KLTxkaXYgY2xhc3M9InAiPiA8cHJlPiZsdDslIGFTdHJpbmcuICUmZ3Q7IDwvcHJlPgotdGhlIGNvbnRlbnQgYXNzaXN0Ci1saXN0IHNob3dzIGF2YWlsYWJsZSBtZXRob2RzLiBUaGlzIGlzIGJlY2F1c2UgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4gaGFzCi1iZWVuIGRlY2xhcmVkIGFzIGEgYmVhbiBvZiB0eXBlIFN0cmluZy48L2Rpdj4KLTxkaXYgY2xhc3M9InAiPklmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgYWZ0ZXIKLXRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hPC9zYW1wPiwgYXMgZm9sbG93czogPHByZT4mbHQ7JSBhICUmZ3Q7IDwvcHJlPgotY29udGVudAotYXNzaXN0IGtub3dzIHRoYXQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4gZXhpc3RzLCBhbmQgaXQgaXMgc2hvd24gaW4gdGhlCi1jb250ZW50IGFzc2lzdCBsaXN0LjwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiIHRpdGxlPSJUbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZAotdGV4dCBlZGl0b3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI0Lmh0bWwiIHRpdGxlPSJIVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2N2YWxpZGF0ZS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDMwZTc3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICIuLlxkdGRcY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjc3JjZWR0MDAxIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Tb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb248L3RpdGxlPg0KLTxzaG9ydGRlc2M+PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJjdmFsaWRhdGV8MXx2YWxpZGF0aW9uc291cmNldnNiYXRjaCIgc3RhdHVzPSJjaGFuZ2VkIj52YWxpZGF0aW9uPGluZGV4dGVybT5zb3VyY2UNCi12ZXJzdXMgYmF0Y2g8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiB2YWxpZGF0aW9uIHRoYXQgY2FuIG9jY3VyIHdoZW4geW91IGFyZSB3b3JraW5nIHdpdGgNCi1zb3VyY2UgZmlsZXMgaW4gYSBzdHJ1Y3R1cmVkIHNvdXJjZSBlZGl0b3I6IHNvdXJjZSB2YWxpZGF0aW9uIGFuZCBiYXRjaCB2YWxpZGF0aW9uLiA8L3A+DQotPHA+U291cmNlIHZhbGlkYXRpb24gb2NjdXJzIGFzIHlvdSB0eXBlIHlvdXIgY29kZTsgdGhpcyB2YWxpZGF0aW9uIHJlZmxlY3RzDQotdGhlICJ1bnNhdmVkIiBhbmQgInVuYnVpbHQiIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgeW91IGFyZSBlZGl0aW5nLiBGb3IgZXhhbXBsZSwNCi1pZiB5b3Ugd2VyZSB0byB0eXBlIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBhIEpTUCBlZGl0b3I6PGxpbmVzPjxjb2RlcGg+Jmx0O2ZvbzpiYXI+PC9jb2RlcGg+PC9saW5lcz53aGVyZSA8Y29kZXBoPmZvbzpiYXI8L2NvZGVwaD5pcw0KLWEgdGFnIHRoYXQgZG9lcyBub3QgZXhpc3QsIHRoZSBwcm9ibGVtIHdvdWxkIGJlIGRpc2NvdmVyZWQgaW1tZWRpYXRlbHkgYW5kDQotd291bGQgYXBwZWFyIHVuZGVybGluZWQgaW4gdGhlIGVkaXRvci4gVGhlIGFkdmFudGFnZSBvZiB0aGlzIHR5cGUgb2YgdmFsaWRhdGlvbg0KLWlzIHRoYXQgaXQgY2FuIGFsZXJ0IHlvdSB0byBlcnJvcnMgaW5zdGFudGx5Ljxub3RlPlRvIHR1cm4gc291cmNlIHZhbGlkYXRpb24NCi1vbiAob3Igb2ZmKSBmb3IgYWxsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBjaGVjayAob3INCi11bmNoZWNrKSA8Yj5SZXBvcnQgcHJvYmxlbXMgYXMgeW91IHR5cGU8L2I+Ljwvbm90ZT48L3A+DQotPHA+QmF0Y2ggdmFsaWRhdGlvbiBvY2N1cnMgb24gc2F2ZWQgZmlsZXMuIEl0IGNhbiBjYXRjaCBidWlsZCBwcm9jZXNzIGVycm9ycw0KLWFuZCBvdGhlciBlcnJvcnMgdGhhdCB0aGUgc291cmNlIHZhbGlkYXRvciBjYW5ub3QuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdQ0KLXR5cGVkIHRoZSBmb2xsb3dpbmcgaW4gYSBKU1AgZWRpdG9yOjxsaW5lcz4NCi08Y29kZXBoPiZsdDslQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4NCi0mbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiU+PC9jb2RlcGg+PC9saW5lcz5Jbg0KLXRoaXMgZXhhbXBsZSwgdGhlIHNhbWUgcHJlZml4IGlzIHVzZWQgdHdpY2UuIFRoaXMgd291bGQgcHJvbXB0IHRoZSBiYXRjaCB2YWxpZGF0b3INCi10byB0cmlnZ2VyIG1hcmtlcnMgYW5kIHRvIGdlbmVyYXRlIGJ1aWxkIHdhcm5pbmdzIGluIHRoZSBQcm9ibGVtcyB2aWV3IGFuZA0KLWluIHRoZSBOYXZpZ2F0b3IuIDwvcD4NCi08cD5CYXRjaCB2YWxpZGF0aW9uIGNhbiB1bmNvdmVyIGVycm9ycyBpbiBtdWx0aXBsZSBmaWxlcyBhdCBvbmNlIGFuZCBnaXZlDQoteW91IGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIHdoZXJlIHByb2JsZW1hdGljIGNvZGUgY2FuIGJlIGZvdW5kIGluIHlvdXIgcHJvamVjdC4NCi1Nb3Jlb3ZlciwgeW91IGRvIG5vdCBuZWVkIHRvIG9wZW4gZmlsZXMgaW4gYW4gZWRpdG9yIHRvIHJ1biBiYXRjaCB2YWxpZGF0aW9uLg0KLVRvIHJ1biBiYXRjaCB2YWxpZGF0aW9uIG9uIHNwZWNpZmljIGZpbGVzLCBzZWxlY3QgYW5kIHJpZ2h0IGNsaWNrIHRoZSBmaWxlcw0KLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCB0aGVuIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5WYWxpZGF0ZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGZyb20gdGhlIHBvcHVwIG1lbnUuPC9wPg0KLTxub3RlPlRvIHNldCBwcmVmZXJlbmNlcyBmb3IgYmF0Y2ggdmFsaWRhdGlvbiwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPjx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9ub3RlPg0KLTwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2N2YWxpZGF0ZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jdmFsaWRhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5NjIxMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2N2YWxpZGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSIiIC8+Ci08bWV0YSBjb250ZW50PSJ2YWxpZGF0aW9uLCBzb3VyY2UgdmVyc3VzIGJhdGNoIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0idmFsaWRhdGlvbiwgc291cmNlIHZlcnN1cyBiYXRjaCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjc3JjZWR0MDAxIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjc3JjZWR0MDAxIj48YSBuYW1lPSJjc3JjZWR0MDAxIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Tb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb248L2gxPgotCi0KLQotPGRpdj48cCAvPgotCi08cD5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHZhbGlkYXRpb24gdGhhdCBjYW4gb2NjdXIgd2hlbiB5b3UgYXJlIHdvcmtpbmcgd2l0aAotc291cmNlIGZpbGVzIGluIGEgc3RydWN0dXJlZCBzb3VyY2UgZWRpdG9yOiBzb3VyY2UgdmFsaWRhdGlvbiBhbmQgYmF0Y2ggdmFsaWRhdGlvbi4gPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5Tb3VyY2UgdmFsaWRhdGlvbiBvY2N1cnMgYXMgeW91IHR5cGUgeW91ciBjb2RlOyB0aGlzIHZhbGlkYXRpb24gcmVmbGVjdHMKLXRoZSAidW5zYXZlZCIgYW5kICJ1bmJ1aWx0IiBjb250ZW50cyBvZiB0aGUgc291cmNlIHlvdSBhcmUgZWRpdGluZy4gRm9yIGV4YW1wbGUsCi1pZiB5b3Ugd2VyZSB0byB0eXBlIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBhIEpTUCBlZGl0b3I6PHA+PHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0O2ZvbzpiYXImZ3Q7PC9zYW1wPjwvcD4KLXdoZXJlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmZvbzpiYXI8L3NhbXA+aXMKLWEgdGFnIHRoYXQgZG9lcyBub3QgZXhpc3QsIHRoZSBwcm9ibGVtIHdvdWxkIGJlIGRpc2NvdmVyZWQgaW1tZWRpYXRlbHkgYW5kCi13b3VsZCBhcHBlYXIgdW5kZXJsaW5lZCBpbiB0aGUgZWRpdG9yLiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgdHlwZSBvZiB2YWxpZGF0aW9uCi1pcyB0aGF0IGl0IGNhbiBhbGVydCB5b3UgdG8gZXJyb3JzIGluc3RhbnRseS48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVG8gdHVybiBzb3VyY2UgdmFsaWRhdGlvbgotb24gKG9yIG9mZikgZm9yIGFsbCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yczwvc3Bhbj48L3NwYW4+IGFuZCBjaGVjayAob3IKLXVuY2hlY2spIDxzdHJvbmc+UmVwb3J0IHByb2JsZW1zIGFzIHlvdSB0eXBlPC9zdHJvbmc+LjwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InAiPkJhdGNoIHZhbGlkYXRpb24gb2NjdXJzIG9uIHNhdmVkIGZpbGVzLiBJdCBjYW4gY2F0Y2ggYnVpbGQgcHJvY2VzcyBlcnJvcnMKLWFuZCBvdGhlciBlcnJvcnMgdGhhdCB0aGUgc291cmNlIHZhbGlkYXRvciBjYW5ub3QuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdQotdHlwZWQgdGhlIGZvbGxvd2luZyBpbiBhIEpTUCBlZGl0b3I6PHA+PGJyIC8+Ci08c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiUmZ3Q7PGJyIC8+Ci0mbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiUmZ3Q7PC9zYW1wPjwvcD4KLUluCi10aGlzIGV4YW1wbGUsIHRoZSBzYW1lIHByZWZpeCBpcyB1c2VkIHR3aWNlLiBUaGlzIHdvdWxkIHByb21wdCB0aGUgYmF0Y2ggdmFsaWRhdG9yCi10byB0cmlnZ2VyIG1hcmtlcnMgYW5kIHRvIGdlbmVyYXRlIGJ1aWxkIHdhcm5pbmdzIGluIHRoZSBQcm9ibGVtcyB2aWV3IGFuZAotaW4gdGhlIE5hdmlnYXRvci4gPC9kaXY+Ci0KLTxwPkJhdGNoIHZhbGlkYXRpb24gY2FuIHVuY292ZXIgZXJyb3JzIGluIG11bHRpcGxlIGZpbGVzIGF0IG9uY2UgYW5kIGdpdmUKLXlvdSBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiB3aGVyZSBwcm9ibGVtYXRpYyBjb2RlIGNhbiBiZSBmb3VuZCBpbiB5b3VyIHByb2plY3QuCi1Nb3Jlb3ZlciwgeW91IGRvIG5vdCBuZWVkIHRvIG9wZW4gZmlsZXMgaW4gYW4gZWRpdG9yIHRvIHJ1biBiYXRjaCB2YWxpZGF0aW9uLgotVG8gcnVuIGJhdGNoIHZhbGlkYXRpb24gb24gc3BlY2lmaWMgZmlsZXMsIHNlbGVjdCBhbmQgcmlnaHQgY2xpY2sgdGhlIGZpbGVzCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZTwvc3Bhbj4KLTwvc3Bhbj4gZnJvbSB0aGUgcG9wdXAgbWVudS48L3A+Ci0KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUbyBzZXQgcHJlZmVyZW5jZXMgZm9yIGJhdGNoIHZhbGlkYXRpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj48L3NwYW4+PC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90Y29udGVudHR5cGUuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzZDFlMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idGNvbnRlbnR0eXBlIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Bc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlczwvdGl0bGU+DQotPHNob3J0ZGVzYz48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5jb250ZW50IHR5cGVzPGluZGV4dGVybT5tYXBwaW5nIGZpbGUgZXh0ZW5zaW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+ZmlsZSBleHRlbnNpb25zPGluZGV4dGVybT5tYXBwaW5nIGNvbnRlbnQgdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmZpbGUgdHlwZXM8aW5kZXh0ZXJtPmVkaXRvcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPllvdSBjYW4gYXNzb2NpYXRlIGNlcnRhaW4gZWRpdG9ycyB3aXRoIGEgZmlsZSB0eXBlIGJ5IGNsaWNraW5nDQotb24gPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+RmlsZQ0KLUFzc29jaWF0aW9uPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIHNldHRpbmcgdXAgdGhlIGFzc29jaWF0aW9ucyBpbiB0aGUNCi1GaWxlIEFzc29jaWF0aW9ucyBXaW5kb3cuPC9wPjxwPlNvbWUgRWNsaXBzZS1iYXNlZCBlZGl0b3JzLCBob3dldmVyLCB3aWxsDQotb25seSByZWNvZ25pemUgYSBmaWxlIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4gQ29uc2VxdWVudGx5LCBpZg0KLXlvdSB3YW50IHRvIGFzc29jaWF0ZSBhbiBhZGRpdGlvbmFsIGZpbGUgdHlwZSB3aXRoIHNvbWUgZWRpdG9ycywgeW91IG1heSBoYXZlDQotdG8gZmlyc3QgbWFwIHRoZSBjb250ZW50IHR5cGUgd2l0aCBpdHMgZmlsZSBleHRlbnNpb24uIFRvIG1hcCBhIGNvbnRlbnQgdHlwZQ0KLXdpdGggYSBmaWxlIGV4dGVuc2lvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPjxvbD4NCi08bGk+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Db250ZW50IFR5cGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uIFRoZSBDb250ZW50IFR5cGUgd2luZG93DQotYXBwZWFycy4gPC9saT4NCi08bGk+U2VsZWN0IGEgY29udGVudCB0eXBlIGluIHRoZSBDb250ZW50IFR5cGUgd2luZG93LCBhbmQgdGhlbiBzZWxlY3QgPGI+QWRkPC9iPiAuDQotVGhlIERlZmluZSBhIE5ldyBGaWxlIFR5cGUgd2luZG93IGFwcGVhcnMuPC9saT4NCi08bGk+VHlwZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0eXBlLCBhbmQgdGhlbiBjbGljayA8Yj5PSzwvYj4uPC9saT4NCi08L29sPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90Y29udGVudHR5cGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmMTg2MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgdHlwZXMsIG1hcHBpbmcgZmlsZSBleHRlbnNpb25zLCBmaWxlIGV4dGVuc2lvbnMsIG1hcHBpbmcgY29udGVudCB0eXBlcywgZmlsZSB0eXBlcywgZWRpdG9ycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgdHlwZXMsIG1hcHBpbmcgZmlsZSBleHRlbnNpb25zLCBmaWxlIGV4dGVuc2lvbnMsIG1hcHBpbmcgY29udGVudCB0eXBlcywgZmlsZSB0eXBlcywgZWRpdG9ycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGNvbnRlbnR0eXBlIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjb250ZW50dHlwZSI+PGEgbmFtZT0idGNvbnRlbnR0eXBlIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Bc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlczwvaDE+Ci0KLQotCi08ZGl2PjxwIC8+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gYXNzb2NpYXRlIGNlcnRhaW4gZWRpdG9ycyB3aXRoIGEgZmlsZSB0eXBlIGJ5IGNsaWNraW5nCi1vbiA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlCi1Bc3NvY2lhdGlvbjwvc3Bhbj48L3NwYW4+IGFuZCBzZXR0aW5nIHVwIHRoZSBhc3NvY2lhdGlvbnMgaW4gdGhlCi1GaWxlIEFzc29jaWF0aW9ucyBXaW5kb3cuPC9wPgotPHA+U29tZSBFY2xpcHNlLWJhc2VkIGVkaXRvcnMsIGhvd2V2ZXIsIHdpbGwKLW9ubHkgcmVjb2duaXplIGEgZmlsZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUuIENvbnNlcXVlbnRseSwgaWYKLXlvdSB3YW50IHRvIGFzc29jaWF0ZSBhbiBhZGRpdGlvbmFsIGZpbGUgdHlwZSB3aXRoIHNvbWUgZWRpdG9ycywgeW91IG1heSBoYXZlCi10byBmaXJzdCBtYXAgdGhlIGNvbnRlbnQgdHlwZSB3aXRoIGl0cyBmaWxlIGV4dGVuc2lvbi4gVG8gbWFwIGEgY29udGVudCB0eXBlCi13aXRoIGEgZmlsZSBleHRlbnNpb24sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4KLTxvbD4KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGVudCBUeXBlczwvc3Bhbj48L3NwYW4+LiBUaGUgQ29udGVudCBUeXBlIHdpbmRvdwotYXBwZWFycy4gPC9saT4KLQotPGxpPlNlbGVjdCBhIGNvbnRlbnQgdHlwZSBpbiB0aGUgQ29udGVudCBUeXBlIHdpbmRvdywgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+QWRkPC9zdHJvbmc+IC4KLVRoZSBEZWZpbmUgYSBOZXcgRmlsZSBUeXBlIHdpbmRvdyBhcHBlYXJzLjwvbGk+Ci0KLTxsaT5UeXBlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHR5cGUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uPC9saT4KLQotPC9vbD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiN2I5Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMDAiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPkVkaXRpbmcgbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3PC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIDx0ZXJtPnN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcjwvdGVybT4uIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4NCi11c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+bWFya3VwIGxhbmd1YWdlczxpbmRleHRlcm0+ZWRpdGluZyB0ZXh0PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT50ZXh0PGluZGV4dGVybT5lZGl0aW5nIGluIG1hcmt1cCBsYW5ndWFnZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PkluIGFkZGl0aW9uIHRvIGJhc2ljIGVkaXRpbmcgdGFza3Mgc3VjaCBhcyBhZGRpbmcsIG1vZGlmeWluZywgYW5kDQotZGVsZXRpbmcgdGV4dCwgeW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6PC9jb250ZXh0Pg0KLTxzdGVwcy11bm9yZGVyZWQ+DQotPHN0ZXA+PGNtZD48eHJlZiBocmVmPSJ0c3JjZWR0MDI1LmRpdGEiIHR5cGU9InRhc2siPlNldCBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZA0KLXRleHQgZWRpdG9yczwveHJlZj48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD48eHJlZiBocmVmPSJ0c3JjZWR0MDA1LmRpdGEiIHR5cGU9InRhc2siPkdldCBjb250ZW50IGFzc2lzdGFuY2UNCi1pbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwveHJlZj48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD48eHJlZiBocmVmPSJ0c3JjZWR0MDA3LmRpdGEiIHR5cGU9InRhc2siPlNlYXJjaCBvciBmaW5kIHRleHQgd2l0aGluDQotYSBmaWxlPC94cmVmPjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPjx4cmVmIGhyZWY9InRzcmNlZHQwMTAuZGl0YSIgdHlwZT0idGFzayI+Q2hlY2sgc3BlbGxpbmc8L3hyZWY+PC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+PHhyZWYgaHJlZj0idHNyY2VkdDAyNy5kaXRhIiB0eXBlPSJ0YXNrIj5BZGQgb3IgcmVtb3ZlIG1hcmt1cCBsYW5ndWFnZQ0KLXRlbXBsYXRlczwveHJlZj48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD48eHJlZiBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiIHR5cGU9InRhc2siPkVkaXQgd2l0aCBzbmlwcGV0czwveHJlZj48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcy11bm9yZGVyZWQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDYuZGl0YSI+PGxpbmt0ZXh0PkNvbnRlbnQgYXNzaXN0PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U25pcHBldHMgdmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjUuZGl0YSI+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDUuZGl0YSI+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDcuZGl0YSI+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTAuZGl0YSI+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjcuZGl0YSI+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjYuZGl0YSI+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk0ODYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIiAvPgotPG1ldGEgY29udGVudD0ibWFya3VwIGxhbmd1YWdlcywgZWRpdGluZyB0ZXh0LCB0ZXh0LCBlZGl0aW5nIGluIG1hcmt1cCBsYW5ndWFnZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJtYXJrdXAgbGFuZ3VhZ2VzLCBlZGl0aW5nIHRleHQsIHRleHQsIGVkaXRpbmcgaW4gbWFya3VwIGxhbmd1YWdlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDAxLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDA3Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTAuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI2Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAwMCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMDAiPjxhIG5hbWU9InRzcmNlZHQwMDAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIDxkZm4gY2xhc3M9InRlcm0iPnN0cnVjdHVyZWQKLXRleHQgZWRpdG9yPC9kZm4+LiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuCi11c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5JbiBhZGRpdGlvbiB0byBiYXNpYyBlZGl0aW5nIHRhc2tzIHN1Y2ggYXMgYWRkaW5nLCBtb2RpZnlpbmcsIGFuZAotZGVsZXRpbmcgdGV4dCwgeW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6PC9kaXY+Ci0KLTx1bD4KLTxsaT48c3Bhbj48YSBocmVmPSJ0c3JjZWR0MDI1Lmh0bWwiPlNldCBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj48YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiPkdldCBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj48YSBocmVmPSJ0c3JjZWR0MDA3Lmh0bWwiPlNlYXJjaCBvciBmaW5kIHRleHQgd2l0aGluIGEgZmlsZTwvYT48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMTAuaHRtbCI+Q2hlY2sgc3BlbGxpbmc8L2E+PC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMjcuaHRtbCI+QWRkIG9yIHJlbW92ZSBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzPC9hPjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+PGEgaHJlZj0idHNyY2VkdDAyNi5odG1sIj5FZGl0IHdpdGggc25pcHBldHM8L2E+PC9zcGFuPgotPC9saT4KLQotPC91bD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA2Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIj5Db250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI1Lmh0bWwiIHRpdGxlPSIiPlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiIHRpdGxlPSJUbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDcuaHRtbCIgdGl0bGU9IiI+U2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDEwLmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBjaGVjayBzcGVsbGluZyBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5DaGVja2luZyBzcGVsbGluZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNi5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS4iPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDBjOGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDAxIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlczwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBzZXQgPHRlcm0+YW5ub3RhdGlvbiBwcmVmZXJlbmNlczwvdGVybT4gZm9yDQotV2ViIGFuZCBYTUwgZmlsZXMuIFRoZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGluY2x1ZGUgd2hldGhlciB0byBhbmFseXplIHRoZQ0KLXN5bnRhY3RpYyB2YWxpZGl0eSBvZiB5b3VyIGZpbGUgd2hpbGUgeW91IGFyZSB0eXBpbmcgYW5kIHdoYXQgY29sb3JzIHRvIHVzZQ0KLXRvIGhpZ2hsaWdodCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrcywgc2VhcmNoIHJlc3VsdHMsIGJvb2ttYXJrcywgYW5kIG90aGVyDQotdGV4dC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRzcmNlZHQwMDF8MXxhbm5vdGF0aW9ucHJlZmVyZW5jZXNtYXJrdXBsYW5ndWFnZXNldHRpbmdzIg0KLXN0YXR1cz0iY2hhbmdlZCI+YW5ub3RhdGlvbnM8aW5kZXh0ZXJtPm1hcmt1cCBsYW5ndWFnZSBzZXR0aW5nczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0ga2V5cmVmPSJ0c3JjZWR0MDAxfDJ8bWFya3VwbGFuZ3VhZ2Vzc2V0dGluZ2Fubm90YXRpb25wcmVmZXJlbmNlcyINCi1zdGF0dXM9Im5ldyI+bWFya3VwIGxhbmd1YWdlczxpbmRleHRlcm0+c2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+QnkgZGVmYXVsdCwgd2hlbiB5b3UgZWRpdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IsIHlvdXIgc291cmNlDQotY29kZSBpcyB2YWxpZGF0ZWQgYXMgeW91IHR5cGUgaXQgaW4uIExpa2Ugb3RoZXIgRWNsaXBzZS1iYXNlZCBlZGl0b3JzLCB0aGUNCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyBmbGFnIHdhcm5pbmdzIGFuZCBlcnJvcnMgaW4gdGhlDQotc291cmNlIGNvZGUgaW4gdGhlIGVkaXRvciBhcmVhLiBUaGUgd2FybmluZ3MgYW5kIGVycm9ycyBhbHNvIHNob3cgdXAgaW4gdGhlDQotVGFza3MgdmlldyB3aGVuIHlvdSBzYXZlIHRoZSBmaWxlLjwvcD48bm90ZT5IaWdobGlnaHRpbmcgaXMgZnVsbHkgZHluYW1pYw0KLXdpdGggdGhlIGV4Y2VwdGlvbiBvZiBzZWFyY2ggcmVzdWx0cy4gU2VhcmNoIHJlc3VsdHMgYXJlIGhpZ2hsaWdodGVkIGJhc2VkDQotdXBvbiB3aGF0IGhhcyBiZWVuIHNhdmVkIHRvIGRpc2suPC9ub3RlPjxub3RlIHR5cGU9InRpcCI+WW91IGNhbiBpbXByb3ZlIGENCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yJ3MgcGVyZm9ybWFuY2UgYnkgdHVybmluZyBvZmYgdGhlIHJlYWwtdGltZSB2YWxpZGF0aW9uLjwvbm90ZT48cD5Ubw0KLXNldCBhbm5vdGF0aW9uIHByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4gPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2NtZD48c3RlcHJlc3VsdD5BIFByZWZlcmVuY2VzIHdpbmRvdyBhcHBlYXJzLjwvc3RlcHJlc3VsdD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPlRvIHR1cm4gb2ZmIHJlYWwtdGltZSBzeW50YXggdmFsaWRhdGlvbiwgY2xpY2sgPHVpY29udHJvbD5TdHJ1Y3R1cmVkDQotVGV4dCBFZGl0b3I8L3VpY29udHJvbD4gYW5kIHVuY2hlY2sgdGhlIDx1aWNvbnRyb2w+QW5hbHl6ZSBhbm5vdGF0aW9ucyB3aGlsZQ0KLXR5cGluZzwvdWljb250cm9sPiBib3guPC9jaG9pY2U+DQotPGNob2ljZT5UbyBjb250cm9sIG90aGVyIGFubm90YXRpb24gc2V0dGluZ3MsIGNsaWNrIDx1aWNvbnRyb2w+QW5ub3RhdGlvbnM8L3VpY29udHJvbD4gYW5kDQotc2VsZWN0IHlvdXIgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcy48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHlvdXIgcHJlZmVyZW5jZXMgYW5kIGNsb3NlDQotdGhlIHBhZ2UuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjUuZGl0YSI+PGxpbmt0ZXh0PlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjYTU1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBzZXQgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgV2ViIGFuZCBYTUwgZmlsZXMuIFRoZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGluY2x1ZGUgd2hldGhlciB0byBhbmFseXplIHRoZSBzeW50YWN0aWMgdmFsaWRpdHkgb2YgeW91ciBmaWxlIHdoaWxlIHlvdSBhcmUgdHlwaW5nIGFuZCB3aGF0IGNvbG9ycyB0byB1c2UgdG8gaGlnaGxpZ2h0IGVycm9ycywgd2FybmluZ3MsIHRhc2tzLCBzZWFyY2ggcmVzdWx0cywgYm9va21hcmtzLCBhbmQgb3RoZXIgdGV4dC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gc2V0IGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIFdlYiBhbmQgWE1MIGZpbGVzLiBUaGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBpbmNsdWRlIHdoZXRoZXIgdG8gYW5hbHl6ZSB0aGUgc3ludGFjdGljIHZhbGlkaXR5IG9mIHlvdXIgZmlsZSB3aGlsZSB5b3UgYXJlIHR5cGluZyBhbmQgd2hhdCBjb2xvcnMgdG8gdXNlIHRvIGhpZ2hsaWdodCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrcywgc2VhcmNoIHJlc3VsdHMsIGJvb2ttYXJrcywgYW5kIG90aGVyIHRleHQuIiAvPgotPG1ldGEgY29udGVudD0iYW5ub3RhdGlvbnMsIG1hcmt1cCBsYW5ndWFnZSBzZXR0aW5ncywgbWFya3VwIGxhbmd1YWdlcywgc2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iYW5ub3RhdGlvbnMsIG1hcmt1cCBsYW5ndWFnZSBzZXR0aW5ncywgbWFya3VwIGxhbmd1YWdlcywgc2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI1Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAwMSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAwMSI+PGEgbmFtZT0idHNyY2VkdDAwMSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBzZXQgPGRmbiBjbGFzcz0idGVybSI+YW5ub3RhdGlvbiBwcmVmZXJlbmNlczwvZGZuPiBmb3IKLVdlYiBhbmQgWE1MIGZpbGVzLiBUaGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBpbmNsdWRlIHdoZXRoZXIgdG8gYW5hbHl6ZSB0aGUKLXN5bnRhY3RpYyB2YWxpZGl0eSBvZiB5b3VyIGZpbGUgd2hpbGUgeW91IGFyZSB0eXBpbmcgYW5kIHdoYXQgY29sb3JzIHRvIHVzZQotdG8gaGlnaGxpZ2h0IGVycm9ycywgd2FybmluZ3MsIHRhc2tzLCBzZWFyY2ggcmVzdWx0cywgYm9va21hcmtzLCBhbmQgb3RoZXIKLXRleHQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+QnkgZGVmYXVsdCwgd2hlbiB5b3UgZWRpdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IsIHlvdXIgc291cmNlCi1jb2RlIGlzIHZhbGlkYXRlZCBhcyB5b3UgdHlwZSBpdCBpbi4gTGlrZSBvdGhlciBFY2xpcHNlLWJhc2VkIGVkaXRvcnMsIHRoZQotc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMgZmxhZyB3YXJuaW5ncyBhbmQgZXJyb3JzIGluIHRoZQotc291cmNlIGNvZGUgaW4gdGhlIGVkaXRvciBhcmVhLiBUaGUgd2FybmluZ3MgYW5kIGVycm9ycyBhbHNvIHNob3cgdXAgaW4gdGhlCi1UYXNrcyB2aWV3IHdoZW4geW91IHNhdmUgdGhlIGZpbGUuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEhpZ2hsaWdodGluZyBpcyBmdWxseSBkeW5hbWljCi13aXRoIHRoZSBleGNlcHRpb24gb2Ygc2VhcmNoIHJlc3VsdHMuIFNlYXJjaCByZXN1bHRzIGFyZSBoaWdobGlnaHRlZCBiYXNlZAotdXBvbiB3aGF0IGhhcyBiZWVuIHNhdmVkIHRvIGRpc2suPC9kaXY+Ci08ZGl2IGNsYXNzPSJ0aXAiPjxzcGFuIGNsYXNzPSJ0aXB0aXRsZSI+VGlwOjwvc3Bhbj4gWW91IGNhbiBpbXByb3ZlIGEKLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3IncyBwZXJmb3JtYW5jZSBieSB0dXJuaW5nIG9mZiB0aGUgcmVhbC10aW1lIHZhbGlkYXRpb24uPC9kaXY+Ci08cD5Ubwotc2V0IGFubm90YXRpb24gcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPi48L3NwYW4+IEEgUHJlZmVyZW5jZXMgd2luZG93IGFwcGVhcnMuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3csIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjwvc3Bhbj4KLTx1bD4KLTxsaT5UbyB0dXJuIG9mZiByZWFsLXRpbWUgc3ludGF4IHZhbGlkYXRpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQKLVRleHQgRWRpdG9yPC9zcGFuPiBhbmQgdW5jaGVjayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QW5hbHl6ZSBhbm5vdGF0aW9ucyB3aGlsZQotdHlwaW5nPC9zcGFuPiBib3guPC9saT4KLQotPGxpPlRvIGNvbnRyb2wgb3RoZXIgYW5ub3RhdGlvbiBzZXR0aW5ncywgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QW5ub3RhdGlvbnM8L3NwYW4+IGFuZAotc2VsZWN0IHlvdXIgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcy48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHlvdXIgcHJlZmVyZW5jZXMgYW5kIGNsb3NlCi10aGUgcGFnZS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjUuaHRtbCIgdGl0bGU9IiI+U2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZAotdGV4dCBlZGl0b3JzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODM2NzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA1LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDA1IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvdGl0bGU+DQotPCEtLUZvcm1lcmx5ICJVc2luZyBKYXZhU2NyaXB0IGNvbnRlbnQgYXNzaXN0IjsgbW92ZWQgc29tZSBKYXZhU2NyaXB0LXNwZWNpZmljIGNvbnRlbnQgdG8gY3NyY2VkdDAwNi5kaXRhICgiQ29udGVudCBhc3Npc3QiKS0tPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdA0KLWluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcNCi1vciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHNyY2VkdDAwNXwxfGNvbnRlbnRhc3Npc3RhbmNlc3RydWN0dXJlZHRleHRlZGl0b3JzIg0KLXN0YXR1cz0ibmV3Ij5jb250ZW50IGFzc2lzdGFuY2U8aW5kZXh0ZXJtPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybSBrZXlyZWY9InRzcmNlZHQwMDV8MnxzdHJ1Y3R1cmVkdGV4dGVkaXRvcnNjb250ZW50YXNzaXN0YW5jZSIgc3RhdHVzPSJjaGFuZ2VkIj5zdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3JzPGluZGV4dGVybT5jb250ZW50IGFzc2lzdGFuY2U8aW5kZXh0ZXJtPnRleHQgZWRpdG9yczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+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+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjY4ZmMxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVG8gZ2V0IGhlbHAgaW4gYWRkaW5nIG1hcmt1cCB0byBhIGZpbGUsIHlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVG8gZ2V0IGhlbHAgaW4gYWRkaW5nIG1hcmt1cCB0byBhIGZpbGUsIHlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iIC8+Ci08bWV0YSBjb250ZW50PSJjb250ZW50IGFzc2lzdGFuY2UsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgdGV4dCBlZGl0b3JzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iY29udGVudCBhc3Npc3RhbmNlLCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIHRleHQgZWRpdG9ycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDIzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMDUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAwNSI+PGEgbmFtZT0idHNyY2VkdDAwNSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2gxPgotCi0KLQotCi0KLTxkaXY+PHA+VG8gZ2V0IGhlbHAgaW4gYWRkaW5nIG1hcmt1cCB0byBhIGZpbGUsIHlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0Ci1pbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIENvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnCi1vciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+Q29udGVudCBhc3Npc3QgYWxzbyBlbmFibGVzIHlvdSB0byBzZWxlY3QgYW5kIGluc2VydCB0ZW1wbGF0ZXMgaW4KLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzCi10aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLjwvZGl2PgotCi0KLTxkaXYgY2xhc3M9InAiPjxzcGFuIC8+IFlvdSBjYW4gcmVxdWVzdCBjb250ZW50IGFzc2lzdCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZwotdHdvIHdheXM6Ci08dWw+Ci08bGk+RnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4gbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQKLUFzc2lzdDwvc3Bhbj48L2xpPgotCi08bGk+UHJlc3MgQ3RybCtTcGFjZTwvbGk+Ci0KLTwvdWw+Ci0KLSA8ZGl2IGNsYXNzPSJwIj5JbiBhZGRpdGlvbiwgeW91IGNhbiBzZXQgYSBwcmVmZXJlbmNlIHRoYXQgY2F1c2VzIGNvbnRlbnQgYXNzaXN0Ci10byBwb3AgdXAgYXV0b21hdGljYWxseSB3aGVuIGNlcnRhaW4gY2hhcmFjdGVycyBhcmUgdHlwZWQsIHN1Y2ggYXMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Ljwvc2FtcD4gaW4KLXRoZSBjYXNlIG9mIEphdmFTY3JpcHTihKIgb3IgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0Ozwvc2FtcD4gaW4gdGhlIGNhc2UKLW9mIEhUTUwgYW5kIFhNTC4gVG8gc2V0IHRoaXMgcHJlZmVyZW5jZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPiBmcm9tCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiBtZW51LCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZAotWE1MIEZpbGVzPC9zcGFuPiwgZm9sbG93ZWQgYnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2VzOjx1bD4KLTxsaT48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBTb3VyY2U8L3NwYW4+Ci08L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YVNjcmlwdCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhU2NyaXB0Ci1Tb3VyY2U8L3NwYW4+PC9zcGFuPjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgU291cmNlPC9zcGFuPgotPC9zcGFuPjwvbGk+Ci0KLTwvdWw+Ci1JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGVudCBhc3Npc3Q8L3NwYW4+IGdyb3VwIGJveCwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BdXRvbWF0aWNhbGx5Ci1tYWtlIHN1Z2dlc3Rpb25zPC9zcGFuPiBjaGVjayBib3gsIGFuZCBzdXBwbHkgYW55IGFkZGl0aW9uYWwgY2hhcmFjdGVycwotdGhhdCBzaG91bGQgdHJpZ2dlciBjb250ZW50IGFzc2lzdC48L2Rpdj4KLTxwPklmIHlvdXIgY3Vyc29yIGlzIGluIGEgcG9zaXRpb24KLXdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGNob2ljZXMKLWlzIGRpc3BsYXllZC4gRm9yIGVhY2ggb2YgdGhlc2UgY2hvaWNlcywgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgY29kZSBpcwotcHJvdmlkZWQuPC9wPgotPC9kaXY+Ci0KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA2Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIj5Db250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIzLmh0bWwiIHRpdGxlPSJIYXZpbmcgdGhlIHByb3BlciBmaWxlcyBkZWZpbmVkIGluIHRoZSBKYXZhIGJ1aWxkIGNsYXNzIHBhdGggaXMgZXNzZW50aWFsIGZvciBjb250ZW50IGFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZSBsaW5rcyBidWlsZGVyIHRvIGJlIGFibGUgdG8gY29ycmVjdGx5IHJlc29sdmUgbGlua3MgdG8gc2VydmxldHMgb3IgSmF2YSBiZWFucyBpbiBKU1AgYW5kIEhUTUwgZmlsZXMuIj5NYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQCi1maWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQotdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhYThiNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMDciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNlYXJjaGluZyBvciBmaW5kaW5nIHRleHQgd2l0aGluIGEgZmlsZTwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPnRleHQgc2VhcmNoPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08cHJlcmVxPjxub3RlIHR5cGU9InRpcCI+QmVmb3JlIHlvdSBkbyBhIFNlYXJjaCBvcGVyYXRpb24gaW4gYSBzdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3IsIHNhdmUgdGhlIGZpbGUgeW91IGFyZSBzZWFyY2hpbmcuIFRoZSBzZWFyY2ggZnVuY3Rpb24gd29ya3MgZnJvbQ0KLXRoZSBtb3N0IHJlY2VudGx5IHNhdmVkIHZlcnNpb24gb2YgdGhlIGZpbGUgcmF0aGVyIHRoYW4gZnJvbSB0aGUgY29udGVudHMNCi10aGF0IHlvdSBzZWUgaW4gdGhlIGVkaXRvciBhcmVhLiBZb3UgZG8gbm90IG5lZWQgdG8gc2F2ZSB5b3VyIGZpbGUgYmVmb3JlDQoteW91IGRvIGEgRmluZC9SZXBsYWNlIG9wZXJhdGlvbi4gPC9ub3RlPjwvcHJlcmVxPg0KLTxjb250ZXh0PkVhY2ggc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBwcm92aWRlcyB0d28gd2F5cyB0byBsb2NhdGUgYSB0ZXh0IHN0cmluZw0KLWluIHRoZSBmaWxlIHlvdSBhcmUgZWRpdGluZyBhbmQgb3B0aW9uYWxseSByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBzdHJpbmc6IDxkbD4NCi08ZGxlbnRyeT4NCi08ZHQ+RmluZC9SZXBsYWNlPC9kdD4NCi08ZGQ+TGV0cyB5b3UgbG9jYXRlIHRleHQgaW4gdGhlIGZpbGUgY3VycmVudGx5IGJlaW5nIGVkaXRlZC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+U2VhcmNoPC9kdD4NCi08ZGQ+TGV0cyB5b3UgbG9jYXRlIHRleHQgaW4gZmlsZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQgdG8geW91ciB3b3Jrc3BhY2UuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48cD5UbyBsb2NhdGUgYW5kIG9wdGlvbmFsbHkgcmVwbGFjZSB0ZXh0LCBzZWxlY3Qgb25lIG9mIHRoZQ0KLWZvbGxvd2luZyBtZW51IHBhdGhzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzLXVub3JkZXJlZD4NCi08c3RlcD48Y21kPjxtZW51Y2FzY2FkZT48dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD48dWljb250cm9sPkZpbmQvUmVwbGFjZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IChvciA8dWljb250cm9sPkN0cmwrRjwvdWljb250cm9sPik8L2NtZD48aW5mbz5UaGlzIG9wdGlvbiBpcw0KLXNlbGYtZXhwbGFuYXRvcnkuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzLXVub3JkZXJlZD4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNzg4ZWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGUiIC8+Ci08bWV0YSBjb250ZW50PSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgdGV4dCBzZWFyY2giIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgdGV4dCBzZWFyY2giIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDA3IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDA3Ij48YSBuYW1lPSJ0c3JjZWR0MDA3Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGU8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJwIj48ZGl2IGNsYXNzPSJ0aXAiPjxzcGFuIGNsYXNzPSJ0aXB0aXRsZSI+VGlwOjwvc3Bhbj4gQmVmb3JlIHlvdSBkbyBhIFNlYXJjaCBvcGVyYXRpb24gaW4gYSBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvciwgc2F2ZSB0aGUgZmlsZSB5b3UgYXJlIHNlYXJjaGluZy4gVGhlIHNlYXJjaCBmdW5jdGlvbiB3b3JrcyBmcm9tCi10aGUgbW9zdCByZWNlbnRseSBzYXZlZCB2ZXJzaW9uIG9mIHRoZSBmaWxlIHJhdGhlciB0aGFuIGZyb20gdGhlIGNvbnRlbnRzCi10aGF0IHlvdSBzZWUgaW4gdGhlIGVkaXRvciBhcmVhLiBZb3UgZG8gbm90IG5lZWQgdG8gc2F2ZSB5b3VyIGZpbGUgYmVmb3JlCi15b3UgZG8gYSBGaW5kL1JlcGxhY2Ugb3BlcmF0aW9uLiA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5FYWNoIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJvdmlkZXMgdHdvIHdheXMgdG8gbG9jYXRlIGEgdGV4dCBzdHJpbmcKLWluIHRoZSBmaWxlIHlvdSBhcmUgZWRpdGluZyBhbmQgb3B0aW9uYWxseSByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBzdHJpbmc6IDxkbD4KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkZpbmQvUmVwbGFjZTwvZHQ+Ci0KLTxkZD5MZXRzIHlvdSBsb2NhdGUgdGV4dCBpbiB0aGUgZmlsZSBjdXJyZW50bHkgYmVpbmcgZWRpdGVkLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlNlYXJjaDwvZHQ+Ci0KLTxkZD5MZXRzIHlvdSBsb2NhdGUgdGV4dCBpbiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZCB0byB5b3VyIHdvcmtzcGFjZS48L2RkPgotCi08L2RsPgotPHA+VG8gbG9jYXRlIGFuZCBvcHRpb25hbGx5IHJlcGxhY2UgdGV4dCwgc2VsZWN0IG9uZSBvZiB0aGUKLWZvbGxvd2luZyBtZW51IHBhdGhzOjwvcD4KLTwvZGl2PgotCi0KLTxkaXYgY2xhc3M9InAiPjxzcGFuPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5kL1JlcGxhY2U8L3NwYW4+Ci08L3NwYW4+IChvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdHJsK0Y8L3NwYW4+KTwvc3Bhbj4gVGhpcyBvcHRpb24gaXMKLXNlbGYtZXhwbGFuYXRvcnkuPC9kaXY+Ci0KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDEwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjNmQwMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTAuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMTAiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNoZWNraW5nIHNwZWxsaW5nPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGNoZWNrIHNwZWxsaW5nIGluIGEgc3RydWN0dXJlZA0KLXRleHQgZWRpdG9yLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNwZWxsIGNoZWNrPGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPnNwZWxsIGNoZWNrPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotDQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+VGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIChhY2Nlc3NlZCBmcm9tDQotdGhlIFByb2plY3QgRXhwbG9yZXIncyBwb3AtdXAgbWVudSBvciBieSBjbGlja2luZyB0aGUgU291cmNlIHRhYiBpbiBjZXJ0YWluDQotZWRpdG9ycykgcHJvdmlkZSBhIHNwZWxsIGNoZWNraW5nIGZlYXR1cmUuPC9wPjxwPlRvIGNoZWNrIHNwZWxsaW5nIGluIGFuIEhUTUwsDQotWE1MLCBvciBvdGhlciBmaWxlIHRoYXQgdXNlcyBhIHN0cnVjdHVyZWQgbWFya3VwIGxhbmd1YWdlOjwvcD4gPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPihPcHRpb25hbCkgVG8gc2VsZWN0IHRoZSBkaWN0aW9uYXJ5IHRoYXQgd2lsbCBiZSB1c2VkLCBjbGljayA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PHVpY29udHJvbD5TcGVsbA0KLUNoZWNrPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+T3BlbiBpbiBhICBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHRoZSBmaWxlIHdob3NlIHNwZWxsaW5nIHlvdSB3YW50DQotdG8gY2hlY2suPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3RhcnQgdGhlIHNwZWxsaW5nIGNoZWNrZXIgYnkgY2xpY2tpbmcgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+U3BlbGwgQ2hlY2s8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgbmV3IHNwZWxsaW5nIGludG8gdGhlIDx1aWNvbnRyb2w+Q2hhbmdlIHRvPC91aWNvbnRyb2w+IGZpZWxkLA0KLW9yIHNlbGVjdCBvbmUgb2YgdGhlIGF2YWlsYWJsZSBvcHRpb25zLiBDbGljayB0aGUgPHVpY29udHJvbD5DaGFuZ2U8L3VpY29udHJvbD4gYnV0dG9uDQotdG8gY2hhbmdlIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSB3b3JkIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LiBDbGljaw0KLXRoZSA8dWljb250cm9sPkNoYW5nZSBBbGw8L3VpY29udHJvbD4gYnV0dG9uIHRvIGNoYW5nZSBhbGwgaW5zdGFuY2VzIG9mIHRoZQ0KLXdvcmQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQuIFlvdSBjYW4gYWxzbyBjbGljayB0aGUgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4gYnV0dG9uDQotdG8gYWRkIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3BlbGxpbmcgdG8geW91ciBkaWN0aW9uYXJ5LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlVzZSB0aGUgY29udHJvbHMgaW4gdGhlIFNwZWxsIENoZWNrIGRpYWxvZyBib3ggdG8gaWdub3JlLCBjaGFuZ2UsDQotb3IgYWRkIHRlcm1zIHRvIHRoZSBjdXJyZW50IGRpY3Rpb25hcnkuIChUbyByZW1vdmUgYSB3b3JkIGFmdGVyIGl0IGhhcyBiZWVuDQotYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnksIGNsaWNrIHRoZSA8dWljb250cm9sPkRpY3Rpb25hcnk8L3VpY29udHJvbD4gcHVzaA0KLWJ1dHRvbi4pPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM2MmQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ2hlY2tpbmcgc3BlbGxpbmciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gY2hlY2sgc3BlbGxpbmcgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBjaGVjayBzcGVsbGluZyBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIiAvPgotPG1ldGEgY29udGVudD0ic3BlbGwgY2hlY2ssIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic3BlbGwgY2hlY2ssIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAxMCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNoZWNraW5nIHNwZWxsaW5nPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDEwIj48YSBuYW1lPSJ0c3JjZWR0MDEwIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DaGVja2luZyBzcGVsbGluZzwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGNoZWNrIHNwZWxsaW5nIGluIGEgc3RydWN0dXJlZAotdGV4dCBlZGl0b3IuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIChhY2Nlc3NlZCBmcm9tCi10aGUgUHJvamVjdCBFeHBsb3JlcidzIHBvcC11cCBtZW51IG9yIGJ5IGNsaWNraW5nIHRoZSBTb3VyY2UgdGFiIGluIGNlcnRhaW4KLWVkaXRvcnMpIHByb3ZpZGUgYSBzcGVsbCBjaGVja2luZyBmZWF0dXJlLjwvcD4KLTxwPlRvIGNoZWNrIHNwZWxsaW5nIGluIGFuIEhUTUwsCi1YTUwsIG9yIG90aGVyIGZpbGUgdGhhdCB1c2VzIGEgc3RydWN0dXJlZCBtYXJrdXAgbGFuZ3VhZ2U6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+KE9wdGlvbmFsKSBUbyBzZWxlY3QgdGhlIGRpY3Rpb25hcnkgdGhhdCB3aWxsIGJlIHVzZWQsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlbGwKLUNoZWNrPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5PcGVuIGluIGEgIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgdGhlIGZpbGUgd2hvc2Ugc3BlbGxpbmcgeW91IHdhbnQKLXRvIGNoZWNrLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U3RhcnQgdGhlIHNwZWxsaW5nIGNoZWNrZXIgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlbGwgQ2hlY2s8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlR5cGUgYSBuZXcgc3BlbGxpbmcgaW50byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2hhbmdlIHRvPC9zcGFuPiBmaWVsZCwKLW9yIHNlbGVjdCBvbmUgb2YgdGhlIGF2YWlsYWJsZSBvcHRpb25zLiBDbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2hhbmdlPC9zcGFuPiBidXR0b24KLXRvIGNoYW5nZSB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgd29yZCBpbiB0aGUgY3VycmVudCBkb2N1bWVudC4gQ2xpY2sKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DaGFuZ2UgQWxsPC9zcGFuPiBidXR0b24gdG8gY2hhbmdlIGFsbCBpbnN0YW5jZXMgb2YgdGhlCi13b3JkIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LiBZb3UgY2FuIGFsc28gY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4gYnV0dG9uCi10byBhZGQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzcGVsbGluZyB0byB5b3VyIGRpY3Rpb25hcnkuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5Vc2UgdGhlIGNvbnRyb2xzIGluIHRoZSBTcGVsbCBDaGVjayBkaWFsb2cgYm94IHRvIGlnbm9yZSwgY2hhbmdlLAotb3IgYWRkIHRlcm1zIHRvIHRoZSBjdXJyZW50IGRpY3Rpb25hcnkuIChUbyByZW1vdmUgYSB3b3JkIGFmdGVyIGl0IGhhcyBiZWVuCi1hZGRlZCB0byB0aGUgZGljdGlvbmFyeSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRpY3Rpb25hcnk8L3NwYW4+IHB1c2gKLWJ1dHRvbi4pPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMmJiMWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDE0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldw0KLWJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c25pcHBldHM8aW5kZXh0ZXJtPmRyYXdlciBjdXN0b21pemF0aW9uPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UbyBhZGQgYSBuZXcgZHJhd2VyIHRvIHRoZSBTbmlwcGV0cyB2aWV3OjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodC1jbGljayBhbnl3aGVyZSBpbiB0aGUgU25pcHBldHMgdmlldyBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+Q3VzdG9taXplPC91aWNvbnRyb2w+IGZyb20NCi10aGUgcG9wLXVwIG1lbnUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+PHVpY29udHJvbD5DYXRlZ29yeTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBuZXcgZHJhd2VyIGluIHRoZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+T3B0aW9uYWxseSwgdHlwZSBhIGRlc2NyaXB0aW9uIGluIHRoZSA8dWljb250cm9sPkRlc2NyaXB0aW9uPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgZHJhd2VyJ3MgYmVoYXZpb3IgYnkgY2hlY2tpbmcgY2hlY2sgYm94ZXMgYXMgYXBwcm9wcmlhdGUuDQotVGhlIGNoZWNrIGJveGVzIGFyZSBhcyBmb2xsb3dzOjwvY21kPg0KLTxjaG9pY2V0YWJsZT4NCi08Y2hyb3c+PGNob3B0aW9uPkhpZGU8L2Nob3B0aW9uPjxjaGRlc2M+RG8gbm90IGRpc3BsYXkgdGhlIGRyYXdlci48L2NoZGVzYz4NCi08L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+T3BlbiBkcmF3ZXIgYXQgc3RhcnQtdXA8L2Nob3B0aW9uPjxjaGRlc2M+QXQgc3RhcnQtdXAsIGRpc3BsYXkNCi10aGUgZHJhd2VyJ3MgaXRlbXMuPC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPlBpbiBkcmF3ZXIgb3BlbiBhdCBzdGFydC11cDwvY2hvcHRpb24+PGNoZGVzYz5LZWVwIHRoZSBkcmF3ZXINCi1vcGVuLjwvY2hkZXNjPjwvY2hyb3c+DQotPC9jaG9pY2V0YWJsZT4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LiBUaGUgbmV3IGRyYXdlciB3aWxsIGJlIGFkZGVkIHRvDQotdGhlIGxpc3Qgb2YgZHJhd2VycyBpbiB0aGUgU25pcHBldHMgdmlldy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDAxLmRpdGEiPjxsaW5rdGV4dD5TbmlwcGV0cyB2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjIuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgc25pcHBldCBpdGVtczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTYuZGl0YSI+PGxpbmt0ZXh0PkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yDQotZHJhd2VyczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTE0NWUwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgZHJhd2VyIGN1c3RvbWl6YXRpb24iIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgZHJhd2VyIGN1c3RvbWl6YXRpb24iIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDAxLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDIyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTYuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDE0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMTQiPjxhIG5hbWU9InRzcmNlZHQwMTQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcKLWJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBhZGQgYSBuZXcgZHJhd2VyIHRvIHRoZSBTbmlwcGV0cyB2aWV3OjwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+UmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gdGhlIFNuaXBwZXRzIHZpZXcgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXN0b21pemU8L3NwYW4+IGZyb20KLXRoZSBwb3AtdXAgbWVudS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNhdGVnb3J5PC9zcGFuPgotPC9zcGFuPiBhbmQgdHlwZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGRyYXdlciBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPk9wdGlvbmFsbHksIHR5cGUgYSBkZXNjcmlwdGlvbiBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVzY3JpcHRpb248L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIGRyYXdlcidzIGJlaGF2aW9yIGJ5IGNoZWNraW5nIGNoZWNrIGJveGVzIGFzIGFwcHJvcHJpYXRlLgotVGhlIGNoZWNrIGJveGVzIGFyZSBhcyBmb2xsb3dzOjwvc3Bhbj4KLQotPHRhYmxlIGNsYXNzPSJjaG9pY2V0YWJsZWJvcmRlciIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIHJ1bGVzPSJyb3dzIiBmcmFtZT0iaHNpZGVzIiBib3JkZXI9IjEiPgotPHRoZWFkPjx0cj48dGggdmFsaWduPSJib3R0b20iIGlkPSJOMTAwOTAtb3B0aW9uIiBhbGlnbj0ibGVmdCI+T3B0aW9uPC90aD4KLTx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9Ik4xMDA5MC1kZXNjIiBhbGlnbj0ibGVmdCI+RGVzY3JpcHRpb248L3RoPjwvdHI+PC90aGVhZD4KLTx0Ym9keT4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA5MC1vcHRpb24iIGlkPSJOMTAwOUEiPjxzdHJvbmc+SGlkZTwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA5MC1kZXNjIE4xMDA5QSI+RG8gbm90IGRpc3BsYXkgdGhlIGRyYXdlci48L3RkPgotCi08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwOTAtb3B0aW9uIiBpZD0iTjEwMEFBIj48c3Ryb25nPk9wZW4gZHJhd2VyIGF0IHN0YXJ0LXVwPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDkwLWRlc2MgTjEwMEFBIj5BdCBzdGFydC11cCwgZGlzcGxheQotdGhlIGRyYXdlcidzIGl0ZW1zLjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwOTAtb3B0aW9uIiBpZD0iTjEwMEI5Ij48c3Ryb25nPlBpbiBkcmF3ZXIgb3BlbiBhdCBzdGFydC11cDwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA5MC1kZXNjIE4xMDBCOSI+S2VlcCB0aGUgZHJhd2VyCi1vcGVuLjwvdGQ+Ci08L3RyPgotCi08L3Rib2R5PjwvdGFibGU+Ci0KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uIFRoZSBuZXcgZHJhd2VyIHdpbGwgYmUgYWRkZWQgdG8KLXRoZSBsaXN0IG9mIGRyYXdlcnMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTUuaHRtbCIgdGl0bGU9IiI+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjIuaHRtbCIgdGl0bGU9IiI+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE2Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZCBpdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy4iPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yCi1kcmF3ZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYmNjZWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDE1IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0c3JjZWR0MDE1fDJ8c25pcHBldGl0ZW1zYWRkaW5ndG9kcmF3ZXJzIiBzdGF0dXM9ImNoYW5nZWQiPnNuaXBwZXRzPGluZGV4dGVybT5kcmF3ZXJzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gVG8gYWRkIG5ldyBpdGVtcyB0byBhbiBleGlzdGluZyBzbmlwcGV0cyBkcmF3ZXI6PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNob2ljZXM6PC9jbWQ+PGluZm8+PHRhYmxlIGNvbHNlcD0iMCIgZnJhbWU9InRvcGJvdCI+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJjb2wxIiBjb2x3aWR0aD0iNzIqIi8+PGNvbHNwZWMgY29sbmFtZT0iY29sMiINCi1jb2x3aWR0aD0iMTI3KiIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIiB2YWxpZ249InRvcCI+VG8gc3RhcnQgd2l0aCB0aGlzOjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiIHZhbGlnbj0idG9wIj5EbyB0aGlzOjwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+QW4gZW1wdHkgaXRlbSB0aGF0IHlvdSBjYW4gZWRpdDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPlJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIGFuIGV4aXN0aW5nIGRyYXdlciwgc2VsZWN0IDx1aWNvbnRyb2w+Q3VzdG9taXplPC91aWNvbnRyb2w+LA0KLWFuZCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPk5ldyBJdGVtPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5FeGlzdGluZyB0ZXh0IHBhc3RlZCBpbnRvIGEgbmV3IGl0ZW0gaW4gYW4gZXhpc3RpbmcNCi1kcmF3ZXI8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5Db3B5IG9yIGN1dCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuIEluIHRoZSBTbmlwcGV0cyB2aWV3LA0KLXJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIGFuIGV4aXN0aW5nIGRyYXdlciBhbmQgY2xpY2sgPHVpY29udHJvbD5QYXN0ZTwvdWljb250cm9sPi48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkV4aXN0aW5nIHRleHQgcGFzdGVkIGludG8gYSBuZXcgaXRlbSBpbiBhIG5ldyBvciBleGlzdGluZw0KLWRyYXdlcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPlNlbGVjdCB0aGUgdGV4dCwgcmlnaHQtY2xpY2ssIGNsaWNrIDx1aWNvbnRyb2w+QWRkIHRvDQotU25pcHBldHM8L3VpY29udHJvbD4sIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGRyYXdlciBpbiB0aGUgU25pcHBldHMgdmlldw0KLXRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCB0aGUgaXRlbSwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+PC9pbmZvPjxzdGVwcmVzdWx0PkEgPHdpbnRpdGxlPkN1c3RvbWl6ZSBQYWxldHRlPC93aW50aXRsZT4gd2luZG93DQotYXBwZWFycy48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VHlwZSBhIG5hbWUgZm9yIHRoZSBuZXcgaXRlbSwgYW5kLCBvcHRpb25hbGx5LCBwcm92aWRlIGEgZGVzY3JpcHRpb24uPC9jbWQ+DQotPHN0ZXByZXN1bHQ+VGhlIHZhbHVlIHRoYXQgeW91IHR5cGUgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZA0KLXdpbGwgYXBwZWFyIG5leHQgdG8gdGhlIGl0ZW0ncyBpY29uIGluIHRoZSBTbmlwcGV0cyB2aWV3Ljwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBpbmNsdWRlIGluIHRoZSA8dWljb250cm9sPlRlbXBsYXRlIFBhdHRlcm48L3VpY29udHJvbD4gZmllbGQNCi1hIHZhcmlhYmxlIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBkZWZpbmVkLCBjbGljayA8dWljb250cm9sPkluc2VydCBWYXJpYWJsZQ0KLVBsYWNlaG9sZGVyPC91aWNvbnRyb2w+LiA8L2NtZD48aW5mbz5BIHZhcmlhYmxlIHBsYWNlaG9sZGVyIGlzIGEgbWFya2VyIHRoYXQsDQotd2hlbiB0YWdnaW5nIGlzIGluc2VydGVkIGludG8gdGhlIGFjdGl2ZSBmaWxlLCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB2YWx1ZQ0KLXRoYXQgaXMgZW50ZXJlZCBpbnRvIHRoZSA8dWljb250cm9sPkluc2VydCBUZW1wbGF0ZTo8L3VpY29udHJvbD48dmFybmFtZT5JdGVtX25hbWU8L3Zhcm5hbWU+IGRpYWxvZw0KLWF0IGluc2VydGlvbiB0aW1lLiBDbGlja2luZyB0aGUgPHVpY29udHJvbD5JbnNlcnQgVmFyaWFibGUgUGxhY2Vob2xkZXI8L3VpY29udHJvbD4gYnV0dG9uDQotb3IgdHlwaW5nIEN0cmwrU3BhY2UgYWN0aXZhdGVzIGEgcG9wLXVwIGluIHRoZSB0ZXh0IGFyZWEgdGhhdCBwcm9tcHRzIHlvdQ0KLXdpdGggdGhlIGNvcnJlY3Qgc2VxdWVuY2VzIHRvIGNyZWF0ZSBhIG1hcmtlciBmb3IgdGhlIHZhcmlhYmxlLjwvaW5mbz48c3RlcHhtcD5Gb3INCi1leGFtcGxlLCBpZiB5b3UgY3JlYXRlIHR3byB2YXJpYWJsZXMgbmFtZWQgPHZhcm5hbWU+dXJpPC92YXJuYW1lPiBhbmQgPHZhcm5hbWU+cHJlZml4PC92YXJuYW1lPiwNCi1hbmQgY3JlYXRlIHZhcmlhYmxlIHBsYWNlaG9sZGVycyBmb3IgYm90aCwgdGhlIHRlbXBsYXRlIHBhdHRlcm4gbWlnaHQgbG9vaw0KLWxpa2UgdGhpczo8Y29kZWJsb2NrPiZsdDslQCB0YWdsaWIgdXJpPSIke3VyaX0iIHByZWZpeD0iJHtwcmVmaXh9IiAlPjwvY29kZWJsb2NrPjwvc3RlcHhtcD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIG5ldyBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIGFwcHJvcHJpYXRlDQotZHJhd2VyLjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNi5kaXRhIj48bGlua3RleHQ+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3INCi1kcmF3ZXJzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTVlZTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnMiIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgZHJhd2VycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBkcmF3ZXJzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwMS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyMi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE2Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAxNSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDE1Ij48YSBuYW1lPSJ0c3JjZWR0MDE1Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiBUbyBhZGQgbmV3IGl0ZW1zIHRvIGFuIGV4aXN0aW5nIHNuaXBwZXRzIGRyYXdlcjo8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EbyBvbmUgb2YgdGhlIGZvbGxvd2luZyBjaG9pY2VzOjwvc3Bhbj4gCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJoc2lkZXMiIGJvcmRlcj0iMSIgcnVsZXM9InJvd3MiPgotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjM2LjE4MDkwNDUyMjYxMzA3JSIgaWQ9Ik4xMDA3MCI+VG8gc3RhcnQgd2l0aCB0aGlzOjwvdGg+Ci0KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjYzLjgxOTA5NTQ3NzM4NjkzJSIgaWQ9Ik4xMDA3OCI+RG8gdGhpczo8L3RoPgotCi08L3RyPgotCi08L3RoZWFkPgotCi08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzNi4xODA5MDQ1MjI2MTMwNyUiIGhlYWRlcnM9Ik4xMDA3MCAiPkFuIGVtcHR5IGl0ZW0gdGhhdCB5b3UgY2FuIGVkaXQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2My44MTkwOTU0NzczODY5MyUiIGhlYWRlcnM9Ik4xMDA3OCAiPlJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIGFuIGV4aXN0aW5nIGRyYXdlciwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1c3RvbWl6ZTwvc3Bhbj4sCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3IEl0ZW08L3NwYW4+Ci08L3NwYW4+LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjM2LjE4MDkwNDUyMjYxMzA3JSIgaGVhZGVycz0iTjEwMDcwICI+RXhpc3RpbmcgdGV4dCBwYXN0ZWQgaW50byBhIG5ldyBpdGVtIGluIGFuIGV4aXN0aW5nCi1kcmF3ZXI8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2My44MTkwOTU0NzczODY5MyUiIGhlYWRlcnM9Ik4xMDA3OCAiPkNvcHkgb3IgY3V0IHRleHQgdG8gdGhlIGNsaXBib2FyZC4gSW4gdGhlIFNuaXBwZXRzIHZpZXcsCi1yaWdodC1jbGljayBhbnl3aGVyZSBpbiBhbiBleGlzdGluZyBkcmF3ZXIgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhc3RlPC9zcGFuPi48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzNi4xODA5MDQ1MjI2MTMwNyUiIGhlYWRlcnM9Ik4xMDA3MCAiPkV4aXN0aW5nIHRleHQgcGFzdGVkIGludG8gYSBuZXcgaXRlbSBpbiBhIG5ldyBvciBleGlzdGluZwotZHJhd2VyPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMuODE5MDk1NDc3Mzg2OTMlIiBoZWFkZXJzPSJOMTAwNzggIj5TZWxlY3QgdGhlIHRleHQsIHJpZ2h0LWNsaWNrLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgdG8KLVNuaXBwZXRzPC9zcGFuPiwgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZHJhd2VyIGluIHRoZSBTbmlwcGV0cyB2aWV3Ci10byB3aGljaCB5b3Ugd2FudCB0byBhZGQgdGhlIGl0ZW0sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC90ZD4KLQotPC90cj4KLQotPC90Ym9keT4KLQotPC90YWJsZT4KLTwvZGl2PgotIEEgPHNwYW4gY2xhc3M9IndpbnRpdGxlIj5DdXN0b21pemUgUGFsZXR0ZTwvc3Bhbj4gd2luZG93Ci1hcHBlYXJzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHRoZSBuZXcgaXRlbSwgYW5kLCBvcHRpb25hbGx5LCBwcm92aWRlIGEgZGVzY3JpcHRpb24uPC9zcGFuPgotIFRoZSB2YWx1ZSB0aGF0IHlvdSB0eXBlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZAotd2lsbCBhcHBlYXIgbmV4dCB0byB0aGUgaXRlbSdzIGljb24gaW4gdGhlIFNuaXBwZXRzIHZpZXcuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBpbmNsdWRlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UZW1wbGF0ZSBQYXR0ZXJuPC9zcGFuPiBmaWVsZAotYSB2YXJpYWJsZSB0aGF0IHlvdSBoYXZlIGFscmVhZHkgZGVmaW5lZCwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0IFZhcmlhYmxlCi1QbGFjZWhvbGRlcjwvc3Bhbj4uIDwvc3Bhbj4gQSB2YXJpYWJsZSBwbGFjZWhvbGRlciBpcyBhIG1hcmtlciB0aGF0LAotd2hlbiB0YWdnaW5nIGlzIGluc2VydGVkIGludG8gdGhlIGFjdGl2ZSBmaWxlLCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB2YWx1ZQotdGhhdCBpcyBlbnRlcmVkIGludG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBUZW1wbGF0ZTo8L3NwYW4+PHZhciBjbGFzcz0idmFybmFtZSI+SXRlbV9uYW1lPC92YXI+IGRpYWxvZwotYXQgaW5zZXJ0aW9uIHRpbWUuIENsaWNraW5nIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQgVmFyaWFibGUgUGxhY2Vob2xkZXI8L3NwYW4+IGJ1dHRvbgotb3IgdHlwaW5nIEN0cmwrU3BhY2UgYWN0aXZhdGVzIGEgcG9wLXVwIGluIHRoZSB0ZXh0IGFyZWEgdGhhdCBwcm9tcHRzIHlvdQotd2l0aCB0aGUgY29ycmVjdCBzZXF1ZW5jZXMgdG8gY3JlYXRlIGEgbWFya2VyIGZvciB0aGUgdmFyaWFibGUuIEZvcgotZXhhbXBsZSwgaWYgeW91IGNyZWF0ZSB0d28gdmFyaWFibGVzIG5hbWVkIDx2YXIgY2xhc3M9InZhcm5hbWUiPnVyaTwvdmFyPiBhbmQgPHZhciBjbGFzcz0idmFybmFtZSI+cHJlZml4PC92YXI+LAotYW5kIGNyZWF0ZSB2YXJpYWJsZSBwbGFjZWhvbGRlcnMgZm9yIGJvdGgsIHRoZSB0ZW1wbGF0ZSBwYXR0ZXJuIG1pZ2h0IGxvb2sKLWxpa2UgdGhpczo8cHJlPiZsdDslQCB0YWdsaWIgdXJpPSIke3VyaX0iIHByZWZpeD0iJHtwcmVmaXh9IiAlJmd0OzwvcHJlPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlIG5ldyBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIGFwcHJvcHJpYXRlCi1kcmF3ZXIuPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTQuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3IGJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuIj5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iIj5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTYuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiI+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IKLWRyYXdlcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2MjRhZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMTYiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPkRlbGV0aW5nIGFuZCBoaWRpbmcgZHJhd2VycyBhbmQgaXRlbXM8L25hdnRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQNCi1pdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5kcmF3ZXJzPGluZGV4dGVybT5zbmlwcGV0cyB2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5zbmlwcGV0czxpbmRleHRlcm0+bW9kaWZ5aW5nIGRyYXdlcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PllvdSBjYW4gaGlkZSBhbnkgZHJhd2VyIG9yIGl0ZW0gdGhhdCBzaG93cyB1cCBpbiB0aGUgU25pcHBldHMgdmlldy4NCi1JZiB0aGUgZHJhd2VyIG9yIGl0ZW0gaXMgdXNlci1kZWZpbmVkLCB5b3UgY2FuIGRlbGV0ZSBpdCBwZXJtYW5lbnRseS4gVG8gZGVsZXRlDQotb3IgaGlkZSBhIGRyYXdlciBvciBpdGVtLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGl0ZW0gb3IgZHJhd2VyIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIGFuZCBzZWxlY3QgPHVpY29udHJvbD5DdXN0b21pemU8L3VpY29udHJvbD4gZnJvbSB0aGUNCi1wb3AtdXAgbWVudS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGl0ZW0gb3IgZHJhd2VyIGFuZCBjbGljayA8dWljb250cm9sPkRlbGV0ZTwvdWljb250cm9sPiBvciA8dWljb250cm9sPkhpZGU8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi4gVGhlIGl0ZW0gb3IgZHJhd2VyIHdpbGwgYmUgZGVsZXRlZA0KLW9yIGhpZGRlbiBmcm9tIHRoZSBTbmlwcGV0cyB2aWV3LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDIyLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE2Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwZDM3Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kIGl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3LiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRyYXdlcnMsIHNuaXBwZXRzIHZpZXcsIHNuaXBwZXRzLCBtb2RpZnlpbmcgZHJhd2VycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRyYXdlcnMsIHNuaXBwZXRzIHZpZXcsIHNuaXBwZXRzLCBtb2RpZnlpbmcgZHJhd2VycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyMi5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMTYiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDE2Ij48YSBuYW1lPSJ0c3JjZWR0MDE2Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZAotaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIGhpZGUgYW55IGRyYXdlciBvciBpdGVtIHRoYXQgc2hvd3MgdXAgaW4gdGhlIFNuaXBwZXRzIHZpZXcuCi1JZiB0aGUgZHJhd2VyIG9yIGl0ZW0gaXMgdXNlci1kZWZpbmVkLCB5b3UgY2FuIGRlbGV0ZSBpdCBwZXJtYW5lbnRseS4gVG8gZGVsZXRlCi1vciBoaWRlIGEgZHJhd2VyIG9yIGl0ZW0sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIGl0ZW0gb3IgZHJhd2VyIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+UmlnaHQtY2xpY2sgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXN0b21pemU8L3NwYW4+IGZyb20gdGhlCi1wb3AtdXAgbWVudS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCB0aGUgaXRlbSBvciBkcmF3ZXIgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlbGV0ZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SGlkZTwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi4gVGhlIGl0ZW0gb3IgZHJhd2VyIHdpbGwgYmUgZGVsZXRlZAotb3IgaGlkZGVuIGZyb20gdGhlIFNuaXBwZXRzIHZpZXcuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTQuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3IGJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuIj5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNS5odG1sIiB0aXRsZT0iIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyMi5odG1sIiB0aXRsZT0iIj5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiMzFiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgc25pcHBldCBpdGVtczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c25pcHBldHM8aW5kZXh0ZXJtPmVkaXRpbmcgaXRlbXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiBUbyBtb2RpZnkgYW4gZXhpc3RpbmcgaXRlbSBpbiBhIFNuaXBwZXRzIGRyYXdlciwgY29tcGxldGUgdGhlIHN0ZXBzDQotbGlzdGVkIGJlbG93LiBJZiB5b3UgaGF2ZSBqdXN0IGNvbXBsZXRlZCB0aGUgdGFzayA8eHJlZiBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiDQotdHlwZT0idGFzayI+QWRkaW5nIGFuIGl0ZW0gdG8gYSBzbmlwcGV0cyBkcmF3ZXI8L3hyZWY+IGFuZCB0aGUgPHdpbnRpdGxlPkN1c3RvbWl6ZQ0KLVBhbGV0dGU8L3dpbnRpdGxlPiB3aW5kb3cgaXMgc3RpbGwgb3BlbiwgeW91IGNhbiBza2lwIHN0ZXBzIDEgYW5kIDIuPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBTbmlwcGV0cyB2aWV3LCByaWdodC1jbGljayB0aGUgbmFtZSBvZiB0aGUgaXRlbSB0aGF0IHlvdQ0KLXdhbnQgdG8gbW9kaWZ5LCBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+Q3VzdG9taXplPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPk9wdGlvbmFsbHksIHR5cGUgYSBuZXcgbmFtZSBhbmQgYSBuZXcgZGVzY3JpcHRpb24gZm9yIHRoZSBpdGVtLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGRlY2xhcmUgYSB2YXJpYWJsZSwgY2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4gYW5kIHR5cGUNCi10aGUgdmFyaWFibGUncyBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIGRlZmF1bHQgdmFsdWUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gZWRpdCBhbiBleGlzdGluZyB2YXJpYWJsZSwgdHlwZSBvdmVyIHRoZSBleGlzdGluZyB2YWx1ZXMuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gZWRpdCB0aGUgPHVpY29udHJvbD5UZW1wbGF0ZSBQYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlDQotaW50byB0aGUgZmllbGQsIGN1dCBhbmQgcGFzdGUgaW50byB0aGUgZmllbGQsIG9yLCBpZiB5b3UgaGF2ZSBkZWZpbmVkIG9uZQ0KLW9yIG1vcmUgdmFyaWFibGVzLCBjbGljayB0aGUgPHVpY29udHJvbD5JbnNlcnQgVmFyaWFibGUgUGxhY2Vob2xkZXI8L3VpY29udHJvbD4gYnV0dG9uLA0KLWFuZCBkb3VibGUtY2xpY2sgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgeW91IHdhbnQgdG8gaW5zZXJ0LjwvY21kPjxzdGVweG1wPkZvcg0KLWV4YW1wbGUsIGlmIHlvdSBoYXZlIGRlY2xhcmUgdmFyaWFibGVzIG5hbWVkIDx2YXJuYW1lPnVyaTwvdmFybmFtZT4gYW5kIDx2YXJuYW1lPnByZWZpeDwvdmFybmFtZT4sDQotY2xpY2tpbmcgdGhlIGJ1dHRvbiBicmluZ3MgdXAgYSBtZW51IHRoYXQgY29udGFpbnMgdGhvc2UgbmFtZXMuIERvdWJsZS1jbGlja2luZyA8dmFybmFtZT51cmk8L3Zhcm5hbWU+IGluc2VydHMgPGNvZGVwaD4ke3VyaX08L2NvZGVwaD4sDQotYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjxjb2RlYmxvY2s+Jmx0OyVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICU+PC9jb2RlYmxvY2s+PC9zdGVweG1wPg0KLTxzdGVwcmVzdWx0PkxhdGVyLCB3aGVuIHlvdSBpbnNlcnQgdGhlIHNuaXBwZXQgaW50byBhIGZpbGUsIDxjb2RlcGg+JHt1cml9PC9jb2RlcGg+IGFuZCA8Y29kZXBoPiR7cHJlZml4fTwvY29kZXBoPiBhcmUNCi1lYWNoIGNvbnZlcnRlZCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBkZWNsYXJlZCBpbiB0aGUgVmFyaWFibGVzIHRhYmxlLiBVc2Vycw0KLWNhbiByZXBsYWNlIHRoZSBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgPHVpY29udHJvbD5JbnNlcnQgVGVtcGxhdGU6PC91aWNvbnRyb2w+PHZhcm5hbWU+SXRlbV9uYW1lPC92YXJuYW1lPiBkaWFsb2cNCi1hdCBpbnNlcnRpb24gdGltZS48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PlRoZSBtb2RpZmllZCBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIGFwcHJvcHJpYXRlDQotZHJhd2VyLjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE2LmRpdGEiPjxsaW5rdGV4dD5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcg0KLWRyYXdlcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1OGEwZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBlZGl0aW5nIGl0ZW1zIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic25pcHBldHMsIGVkaXRpbmcgaXRlbXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDAxLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE1Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTYuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDIyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDIyIj48YSBuYW1lPSJ0c3JjZWR0MDIyIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gVG8gbW9kaWZ5IGFuIGV4aXN0aW5nIGl0ZW0gaW4gYSBTbmlwcGV0cyBkcmF3ZXIsIGNvbXBsZXRlIHRoZSBzdGVwcwotbGlzdGVkIGJlbG93LiBJZiB5b3UgaGF2ZSBqdXN0IGNvbXBsZXRlZCB0aGUgdGFzayA8YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiPkFkZGluZyBhbiBpdGVtIHRvIGEgc25pcHBldHMgZHJhd2VyPC9hPiBhbmQgdGhlIDxzcGFuIGNsYXNzPSJ3aW50aXRsZSI+Q3VzdG9taXplCi1QYWxldHRlPC9zcGFuPiB3aW5kb3cgaXMgc3RpbGwgb3BlbiwgeW91IGNhbiBza2lwIHN0ZXBzIDEgYW5kIDIuPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFNuaXBwZXRzIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBuYW1lIG9mIHRoZSBpdGVtIHRoYXQgeW91Ci13YW50IHRvIG1vZGlmeSwgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXN0b21pemU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wdGlvbmFsbHksIHR5cGUgYSBuZXcgbmFtZSBhbmQgYSBuZXcgZGVzY3JpcHRpb24gZm9yIHRoZSBpdGVtLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gZGVjbGFyZSBhIHZhcmlhYmxlLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+IGFuZCB0eXBlCi10aGUgdmFyaWFibGUncyBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIGRlZmF1bHQgdmFsdWUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gZWRpdCBhbiBleGlzdGluZyB2YXJpYWJsZSwgdHlwZSBvdmVyIHRoZSBleGlzdGluZyB2YWx1ZXMuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBlZGl0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UZW1wbGF0ZSBQYXR0ZXJuPC9zcGFuPiBmaWVsZCwgdHlwZQotaW50byB0aGUgZmllbGQsIGN1dCBhbmQgcGFzdGUgaW50byB0aGUgZmllbGQsIG9yLCBpZiB5b3UgaGF2ZSBkZWZpbmVkIG9uZQotb3IgbW9yZSB2YXJpYWJsZXMsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQgVmFyaWFibGUgUGxhY2Vob2xkZXI8L3NwYW4+IGJ1dHRvbiwKLWFuZCBkb3VibGUtY2xpY2sgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgeW91IHdhbnQgdG8gaW5zZXJ0Ljwvc3Bhbj4gRm9yCi1leGFtcGxlLCBpZiB5b3UgaGF2ZSBkZWNsYXJlIHZhcmlhYmxlcyBuYW1lZCA8dmFyIGNsYXNzPSJ2YXJuYW1lIj51cmk8L3Zhcj4gYW5kIDx2YXIgY2xhc3M9InZhcm5hbWUiPnByZWZpeDwvdmFyPiwKLWNsaWNraW5nIHRoZSBidXR0b24gYnJpbmdzIHVwIGEgbWVudSB0aGF0IGNvbnRhaW5zIHRob3NlIG5hbWVzLiBEb3VibGUtY2xpY2tpbmcgPHZhciBjbGFzcz0idmFybmFtZSI+dXJpPC92YXI+IGluc2VydHMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+JHt1cml9PC9zYW1wPiwKLWFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8cHJlPiZsdDslQCB0YWdsaWIgdXJpPSIke3VyaX0iIHByZWZpeD0iJHtwcmVmaXh9IiAlJmd0OzwvcHJlPgotCi0gTGF0ZXIsIHdoZW4geW91IGluc2VydCB0aGUgc25pcHBldCBpbnRvIGEgZmlsZSwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+JHt1cml9PC9zYW1wPiBhbmQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+JHtwcmVmaXh9PC9zYW1wPiBhcmUKLWVhY2ggY29udmVydGVkIHRvIHRoZSBkZWZhdWx0IHZhbHVlIGRlY2xhcmVkIGluIHRoZSBWYXJpYWJsZXMgdGFibGUuIFVzZXJzCi1jYW4gcmVwbGFjZSB0aGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBUZW1wbGF0ZTo8L3NwYW4+PHZhciBjbGFzcz0idmFybmFtZSI+SXRlbV9uYW1lPC92YXI+IGRpYWxvZwotYXQgaW5zZXJ0aW9uIHRpbWUuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZSBtb2RpZmllZCBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIGFwcHJvcHJpYXRlCi1kcmF3ZXIuPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiI+U25pcHBldHMgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTQuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3IGJ5IGFkZGluZyBhIG5ldyBkcmF3ZXIuIj5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNS5odG1sIiB0aXRsZT0iIj5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcgotZHJhd2VyczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQ4MDY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyMyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5IYXZpbmcgdGhlIHByb3BlciBmaWxlcyBkZWZpbmVkIGluIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBjbGFzcyBwYXRoIGlzIGVzc2VudGlhbCBmb3IgY29udGVudA0KLWFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZSBsaW5rcyBidWlsZGVyDQotdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkgcmVzb2x2ZSBsaW5rcyB0byBzZXJ2bGV0cyBvciA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBiZWFucw0KLWluIEpTUCBhbmQgSFRNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5jb250ZW50IGFzc2lzdGFuY2U8aW5kZXh0ZXJtPmVuYWJsaW5nIGZvciBKU1AgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkpTUCBmaWxlczxpbmRleHRlcm0+ZW5hYmxpbmcgY29udGVudCBhc3Npc3RhbmNlPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UbyBlbmFibGUgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+VG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGJ1aWxkIHBhdGggaXMgY29ycmVjdCwgc2VsZWN0IDx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPiBmcm9tDQotdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDx1aWNvbnRyb2w+SmF2YSBCdWlsZCBQYXRoPC91aWNvbnRyb2w+LCBhbmQgdGhlbiB0aGUgPHVpY29udHJvbD5MaWJyYXJpZXM8L3VpY29udHJvbD4gcGFnZS4gPC9jbWQ+DQotPGluZm8+WW91IHNob3VsZCBzZWUgdGhlIGZvbGxvd2luZyBmaWxlczo8dWw+DQotPGxpPmoyZWUuamFyPC9saT4NCi08bGk+cnQuamFyIDwvbGk+DQotPGxpPnNlcnZsZXQuamFyPC9saT4NCi08bGk+d2ViY29udGFpbmVyLmphcjwvbGk+DQotPC91bD48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgdGhleSBhcmUgbm90IHByZXNlbnQsIGFkZCB0aGVtIGFzIEV4dGVybmFsIEpBUiBmaWxlcy4gWW91IG1heQ0KLWhhdmUgeW91ciBvd24gdmVyc2lvbnMgb2YgdGhlc2UgZmlsZXMsIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgSkRLIG9yIFNlcnZsZXQNCi1BUEkgZm9yIHdoaWNoIHlvdSBhcmUgZGV2ZWxvcGluZy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3VyIFdlYiBhcHBsaWNhdGlvbnMgcmVmZXJlbmNlIG90aGVyIEpBUnMsIHlvdSBjYW4gcGxhY2UgdGhlbQ0KLWluIHRoZSBidWlsZCBwYXRoIGFzIGZvbGxvd3M6PC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+VXNlIHRoZSA8dWljb250cm9sPkFkZCBKQVJzPC91aWNvbnRyb2w+IGJ1dHRvbiBvbiB0aGUgTGlicmFyeQ0KLXBhZ2UuIFlvdSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBKQVIgZmlsZSBpcyBhdmFpbGFibGUgdG8gdGhlIHNlcnZlciBieSBwcm9wZXJseQ0KLWNvbmZpZ3VyaW5nIHRoZSBzZXJ2ZXIuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+QWRkIHRoZSBKQVJzIHRvIHRoZSA8ZmlsZXBhdGg+V0VCLUlORi9saWI8L2ZpbGVwYXRoPiBkaXJlY3RvcnkuDQotVGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGJ1aWxkIHBhdGggYW5kIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXINCi1pbiBhcyBwYXJ0IG9mIHRoZSBwcm9qZWN0IFdBUi48L2NtZD48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA2LmRpdGEiPjxsaW5rdGV4dD5Db250ZW50IGFzc2lzdDwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDA1LmRpdGEiPjxsaW5rdGV4dD5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3JzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMGE4NjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFbmFibGluZyBjb250ZW50IGFzc2lzdCBmb3IgSlNQIGZpbGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkhhdmluZyB0aGUgcHJvcGVyIGZpbGVzIGRlZmluZWQgaW4gdGhlIEphdmEgYnVpbGQgY2xhc3MgcGF0aCBpcyBlc3NlbnRpYWwgZm9yIGNvbnRlbnQgYXNzaXN0IHRvIHdvcmsgcHJvcGVybHkgaW4gSlNQIGZpbGVzLiBJdCBpcyBhbHNvIGVzc2VudGlhbCBmb3IgdGhlIGxpbmtzIGJ1aWxkZXIgdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkgcmVzb2x2ZSBsaW5rcyB0byBzZXJ2bGV0cyBvciBKYXZhIGJlYW5zIGluIEpTUCBhbmQgSFRNTCBmaWxlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSGF2aW5nIHRoZSBwcm9wZXIgZmlsZXMgZGVmaW5lZCBpbiB0aGUgSmF2YSBidWlsZCBjbGFzcyBwYXRoIGlzIGVzc2VudGlhbCBmb3IgY29udGVudCBhc3Npc3QgdG8gd29yayBwcm9wZXJseSBpbiBKU1AgZmlsZXMuIEl0IGlzIGFsc28gZXNzZW50aWFsIGZvciB0aGUgbGlua3MgYnVpbGRlciB0byBiZSBhYmxlIHRvIGNvcnJlY3RseSByZXNvbHZlIGxpbmtzIHRvIHNlcnZsZXRzIG9yIEphdmEgYmVhbnMgaW4gSlNQIGFuZCBIVE1MIGZpbGVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgYXNzaXN0YW5jZSwgZW5hYmxpbmcgZm9yIEpTUCBmaWxlcywgSlNQIGZpbGVzLCBlbmFibGluZyBjb250ZW50IGFzc2lzdGFuY2UiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJjb250ZW50IGFzc2lzdGFuY2UsIGVuYWJsaW5nIGZvciBKU1AgZmlsZXMsIEpTUCBmaWxlcywgZW5hYmxpbmcgY29udGVudCBhc3Npc3RhbmNlIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyOC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAyMyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBKU1AgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjMiPjxhIG5hbWU9InRzcmNlZHQwMjMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBKU1AgZmlsZXM8L2gxPgotCi0KLQotPGRpdj48cD5IYXZpbmcgdGhlIHByb3BlciBmaWxlcyBkZWZpbmVkIGluIHRoZSBKYXZh4oSiIGJ1aWxkIGNsYXNzIHBhdGggaXMgZXNzZW50aWFsIGZvciBjb250ZW50Ci1hc3Npc3QgdG8gd29yayBwcm9wZXJseSBpbiBKU1AgZmlsZXMuIEl0IGlzIGFsc28gZXNzZW50aWFsIGZvciB0aGUgbGlua3MgYnVpbGRlcgotdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkgcmVzb2x2ZSBsaW5rcyB0byBzZXJ2bGV0cyBvciBKYXZhIGJlYW5zCi1pbiBKU1AgYW5kIEhUTUwgZmlsZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBlbmFibGUgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczo8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBkZXRlcm1pbmUgd2hldGhlciB0aGUgYnVpbGQgcGF0aCBpcyBjb3JyZWN0LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4gZnJvbQotdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmEgQnVpbGQgUGF0aDwvc3Bhbj4sIGFuZCB0aGVuIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5MaWJyYXJpZXM8L3NwYW4+IHBhZ2UuIDwvc3Bhbj4KLSBZb3Ugc2hvdWxkIHNlZSB0aGUgZm9sbG93aW5nIGZpbGVzOjx1bD4KLTxsaT5qMmVlLmphcjwvbGk+Ci0KLTxsaT5ydC5qYXIgPC9saT4KLQotPGxpPnNlcnZsZXQuamFyPC9saT4KLQotPGxpPndlYmNvbnRhaW5lci5qYXI8L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB0aGV5IGFyZSBub3QgcHJlc2VudCwgYWRkIHRoZW0gYXMgRXh0ZXJuYWwgSkFSIGZpbGVzLiBZb3UgbWF5Ci1oYXZlIHlvdXIgb3duIHZlcnNpb25zIG9mIHRoZXNlIGZpbGVzLCBkZXBlbmRpbmcgb24gdGhlIGxldmVsIG9mIEpESyBvciBTZXJ2bGV0Ci1BUEkgZm9yIHdoaWNoIHlvdSBhcmUgZGV2ZWxvcGluZy48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3VyIFdlYiBhcHBsaWNhdGlvbnMgcmVmZXJlbmNlIG90aGVyIEpBUnMsIHlvdSBjYW4gcGxhY2UgdGhlbQotaW4gdGhlIGJ1aWxkIHBhdGggYXMgZm9sbG93czo8L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+VXNlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgSkFSczwvc3Bhbj4gYnV0dG9uIG9uIHRoZSBMaWJyYXJ5Ci1wYWdlLiBZb3UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgSkFSIGZpbGUgaXMgYXZhaWxhYmxlIHRvIHRoZSBzZXJ2ZXIgYnkgcHJvcGVybHkKLWNvbmZpZ3VyaW5nIHRoZSBzZXJ2ZXIuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5BZGQgdGhlIEpBUnMgdG8gdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+V0VCLUlORi9saWI8L3NwYW4+IGRpcmVjdG9yeS4KLVRoZXkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIGFuZCBkZXBsb3llZCB0byB0aGUgc2VydmVyCi1pbiBhcyBwYXJ0IG9mIHRoZSBwcm9qZWN0IFdBUi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA2Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uIj5Db250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiIHRpdGxlPSJUbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZAotdGV4dCBlZGl0b3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI4Lmh0bWwiIHRpdGxlPSJKU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDc1ZTk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyNCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5IVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZA0KLWNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcw0KLXByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkhUTUw8aW5kZXh0ZXJtPnRlbXBsYXRlczxpbmRleHRlcm0+cmVtb3Zpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPnRlbXBsYXRlczxpbmRleHRlcm0+SFRNTDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+SFRNTDxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi0NCi0NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5Gb3IgZXhhbXBsZSwgeW91IG1heSB3b3JrIG9uIGEgZ3JvdXAgb2YgSFRNTCBwYWdlcyB0aGF0IHNob3VsZA0KLWFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMNCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUNCi12YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0DQotZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLikgVGhlbiBzZWxlY3QNCi10aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIgeW91DQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBIVE1MIG9yIFhIVE1MIGZpbGUuPC9wPjxwPlRvIGFkZA0KLWEgbmV3IEhUTUwgdGVtcGxhdGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4gbWVudSwgc2VsZWN0IDx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByZWZlcmVuY2VzIHBhZ2UsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWIgYW5kDQotWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MIFRlbXBsYXRlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5FbnRlciB0aGUgbmV3IHRlbXBsYXRlIG5hbWUgKGEgdGV4dCBzdHJpbmcpIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uDQotb2YgdGhlIHRlbXBsYXRlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlVzaW5nIHRoZSA8dWljb250cm9sPkNvbnRleHQ8L3VpY29udHJvbD4gZHJvcC1kb3duIGxpc3QsIHNwZWNpZnkNCi10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudA0KLWFzc2lzdCBpcyByZXF1ZXN0ZWQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmaWVsZCwgZW50ZXIgdGhlIGFwcHJvcHJpYXRlDQotdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyAodGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlKSB0byBiZQ0KLWluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHVpY29udHJvbD5WYXJpYWJsZTwvdWljb250cm9sPiBidXR0b24NCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC48L2NtZD48c3RlcHhtcD5Gb3IgZXhhbXBsZSwgdGhlIDx2YXJuYW1lPndvcmRfc2VsZWN0aW9uPC92YXJuYW1lPiB2YXJpYWJsZQ0KLWluZGljYXRlcyB0aGUgd29yZCB0aGF0IGlzIHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGVtcGxhdGUgaW5zZXJ0aW9uLA0KLWFuZCB0aGUgPHZhcm5hbWU+Y3Vyc29yPC92YXJuYW1lPiB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjdXJzb3Igd2lsbA0KLWJlIGFmdGVyIHRoZSB0ZW1wbGF0ZSBpcyBpbnNlcnRlZCBpbiB0aGUgSFRNTCBkb2N1bWVudC48L3N0ZXB4bXA+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlDQotc2FtZSBQcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQ0KLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUNCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC48L3A+PHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQ0KLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXINCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcyBwYWdlIGFuZCB1bmNoZWNrDQotaXRzIGNoZWNrIGJveC48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI3LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQ0KLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNmE0MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJIVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJIVE1MLCB0ZW1wbGF0ZXMsIHJlbW92aW5nLCBhZGRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJIVE1MLCB0ZW1wbGF0ZXMsIHJlbW92aW5nLCBhZGRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyOC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI5Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDI0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNCI+PGEgbmFtZT0idHNyY2VkdDAyNCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvaDE+Ci0KLQotCi08ZGl2PjxwPkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkCi1jb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMKLXByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBIVE1MIHBhZ2VzIHRoYXQgc2hvdWxkCi1hbGwgY29udGFpbiBhIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBhcHBlYXJhbmNlLiBDcmVhdGUgYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zCi10aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUKLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQKLWVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZpZWxkLikgVGhlbiBzZWxlY3QKLXRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlciB5b3UKLXdhbnQgdG8gaW5zZXJ0IHlvdXIgY3VzdG9tIHRhYmxlIGludG8gYW4gSFRNTCBvciBYSFRNTCBmaWxlLjwvcD4KLTxwPlRvIGFkZAotYSBuZXcgSFRNTCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZWZlcmVuY2VzIHBhZ2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQKLVhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgVGVtcGxhdGVzPC9zcGFuPgotPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FbnRlciB0aGUgbmV3IHRlbXBsYXRlIG5hbWUgKGEgdGV4dCBzdHJpbmcpIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uCi1vZiB0aGUgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRleHQ8L3NwYW4+IGRyb3AtZG93biBsaXN0LCBzcGVjaWZ5Ci10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudAotYXNzaXN0IGlzIHJlcXVlc3RlZC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQotdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyAodGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlKSB0byBiZQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpYWJsZTwvc3Bhbj4gYnV0dG9uCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC48L3NwYW4+IEZvciBleGFtcGxlLCB0aGUgPHZhciBjbGFzcz0idmFybmFtZSI+d29yZF9zZWxlY3Rpb248L3Zhcj4gdmFyaWFibGUKLWluZGljYXRlcyB0aGUgd29yZCB0aGF0IGlzIHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGVtcGxhdGUgaW5zZXJ0aW9uLAotYW5kIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5jdXJzb3I8L3Zhcj4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY3Vyc29yIHdpbGwKLWJlIGFmdGVyIHRoZSB0ZW1wbGF0ZSBpcyBpbnNlcnRlZCBpbiB0aGUgSFRNTCBkb2N1bWVudC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlCi1zYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC48L3A+Ci08cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcyBwYWdlIGFuZCB1bmNoZWNrCi1pdHMgY2hlY2sgYm94LjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQotdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjguaHRtbCIgdGl0bGU9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI5Lmh0bWwiIHRpdGxlPSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzNDAxNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxuYXZ0aXRsZT5TZXR0aW5nIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJlZmVyZW5jZXM8L25hdnRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHNyY2VkdDAyNXwxfHN0cnVjdHVyZWR0ZXh0ZWRpdG9yc3ByZWZlcmVuY2VzZXR0aW5nIg0KLXN0YXR1cz0iY2hhbmdlZCI+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPnByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5Zb3UgY2FuIGN1c3RvbWl6ZSB5b3VyIHdvcmtpbmcgZW52aXJvbm1lbnQgYnkgc3BlY2lmeWluZyBwcmVmZXJlbmNlcw0KLWZvciB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIG1haW4gbWVudSwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBvbmUgb2YgdGhlIGNob2ljZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZTo8L2NtZD4NCi08Y2hvaWNldGFibGUgcmVsY29sd2lkdGg9IjEwKiAzMCoiPg0KLTxjaGhlYWQ+PGNob3B0aW9uaGQ+SXRlbTwvY2hvcHRpb25oZD48Y2hkZXNjaGQ+TWVudSBwYXRoPC9jaGRlc2NoZD48L2NoaGVhZD4NCi08Y2hyb3c+PGNob3B0aW9uPkFubm90YXRpb24gc2V0dGluZ3M8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+PHVpY29udHJvbD5Bbm5vdGF0aW9uczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+DQotPC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkNoYXJhY3RlciBlbmNvZGluZzwvY2hvcHRpb24+PGNoZGVzYz48dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+LA0KLXRoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hvaWNlczogPHVpY29udHJvbD5DU1MgRmlsZXM8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+SFRNTA0KLUZpbGVzPC91aWNvbnRyb2w+LCA8dWljb250cm9sPkpTUCBGaWxlczwvdWljb250cm9sPiwgPHVpY29udHJvbD4qWE1MIEZpbGVzDQotKCAqbm90IGltcGxlbWVudGVkIGluIFdUUCk8L3VpY29udHJvbD48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+Q29udGVudCBhc3Npc3Q6IEhUTUw8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2ViDQotYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+SFRNTCBGaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+SFRNTCBTb3VyY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5Db250ZW50IGFzc2lzdDogSmF2YVNjcmlwdDwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+SmF2YVNjcmlwdCBGaWxlczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+SmF2YVNjcmlwdCBTb3VyY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5Db250ZW50IGFzc2lzdDogWE1MPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldlYg0KLWFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPipYTUwgRmlsZXMgKCpub3QgaW1wbGVtZW50ZWQgaW4gV1RQKTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+WE1MIFNvdXJjZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkVkaXRvciBhcHBlYXJhbmNlPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+QXBwZWFyYW5jZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkVkaXRvciBmb250PC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+Q29sb3JzIGFuZCBGb250czwvdWljb250cm9sPjx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkVkaXRvciBuYXZpZ2F0aW9uPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+TmF2aWdhdGlvbjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkZpbGUtdHlwZS1zcGVjaWZpYyBzZXR0aW5nczwvY2hvcHRpb24+PGNoZGVzYz48dWljb250cm9sPldlYg0KLWFuZCBYTUw8L3VpY29udHJvbD4sIHRoZW4gbmF2aWdhdGUgdG8gdGhlIGZpbGUgdHlwZSBhbmQgcGFydGljdWxhciBzZXR0aW5nPC9jaGRlc2M+DQotPC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkhvdmVyIGhlbHA8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+PHVpY29udHJvbD5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Ib3ZlcnM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5LZXkgYmluZGluZ3M8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5LZXlzPC91aWNvbnRyb2w+PHVpY29udHJvbD5LZXlib2FyZCBTaG9ydGN1dHM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiB0aGVuDQotaW4gdGhlIDx1aWNvbnRyb2w+Q2F0ZWdvcnk8L3VpY29udHJvbD4gZmllbGQgc3BlY2lmeSA8dWljb250cm9sPlNvdXJjZTwvdWljb250cm9sPjwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5TcGVsbCBjaGVja2luZzwvY2hvcHRpb24+PGNoZGVzYz48dWljb250cm9sPlNwZWxsIENoZWNrPC91aWNvbnRyb2w+PC9jaGRlc2M+DQotPC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPlN5bnRheCBjaGVja2luZzwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD48dWljb250cm9sPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3VpY29udHJvbD4NCi08dWljb250cm9sPkFwcGVhcmFuY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiB0aGVuIGNoZWNrIG9yIHVuY2hlY2sgdGhlIDx1aWNvbnRyb2w+QW5hbHl6ZQ0KLWFubm90YXRpb25zIHdoaWxlIHR5cGluZzwvdWljb250cm9sPiBib3guPC9jaGRlc2M+PC9jaHJvdz4NCi08L2Nob2ljZXRhYmxlPg0KLTxpbmZvPjxub3RlPllvdSBjYW5ub3Qgc2V0IDx1aWNvbnRyb2w+V2ViIGFuZCBYTUw8L3VpY29udHJvbD4gcHJlZmVyZW5jZXMNCi11bmxlc3MgdGhlIENvcmUgWE1MIFN1cHBvcnQgY2FwYWJpbGl0eSAoPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5DYXBhYmlsaXRpZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPikgaXMgZW5hYmxlZCwgYW5kIHlvdSBjYW5ub3QNCi1zZXQgcHJlZmVyZW5jZXMgZm9yIERURCBmaWxlcyB1bmxlc3MgdGhlIFhNTCBEZXZlbG9wbWVudCBjYXBhYmlsaXR5IGlzIGVuYWJsZWQuPC9ub3RlPjwvaW5mbz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvcg0KLW1hcmt1cCBsYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDEwLmRpdGEiPjxsaW5rdGV4dD5DaGVja2luZyBzcGVsbGluZzwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzYzZGIzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiAvPgotPG1ldGEgY29udGVudD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIHByZWZlcmVuY2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIHByZWZlcmVuY2VzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAxLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTAuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNSI+PGEgbmFtZT0idHNyY2VkdDAyNSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2gxPgotCi0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gY3VzdG9taXplIHlvdXIgd29ya2luZyBlbnZpcm9ubWVudCBieSBzcGVjaWZ5aW5nIHByZWZlcmVuY2VzCi1mb3IgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIG1haW4gbWVudSwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBvbmUgb2YgdGhlIGNob2ljZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZTo8L3NwYW4+Ci0KLTx0YWJsZSBjbGFzcz0iY2hvaWNldGFibGVib3JkZXIiIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBydWxlcz0icm93cyIgZnJhbWU9ImhzaWRlcyIgYm9yZGVyPSIxIj4KLTx0aGVhZD48dHI+PHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iTjEwMDcwLW9wdGlvbiI+SXRlbTwvdGg+Ci08dGggdmFsaWduPSJib3R0b20iIGlkPSJOMTAwNzAtZGVzYyI+TWVudSBwYXRoPC90aD48L3RyPjwvdGhlYWQ+Ci08dGJvZHk+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAwOEEiPjxzdHJvbmc+QW5ub3RhdGlvbiBzZXR0aW5nczwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDA4QSI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFubm90YXRpb25zPC9zcGFuPjwvc3Bhbj48L3RkPgotCi08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMEFEIj48c3Ryb25nPkNoYXJhY3RlciBlbmNvZGluZzwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDBBRCI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+LAotdGhlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjaG9pY2VzOiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DU1MgRmlsZXM8L3NwYW4+LCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MCi1GaWxlczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUCBGaWxlczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPipYTUwgRmlsZXMKLSggKm5vdCBpbXBsZW1lbnRlZCBpbiBXVFApPC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMEQ4Ij48c3Ryb25nPkNvbnRlbnQgYXNzaXN0OiBIVE1MPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMEQ4Ij48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYgotYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgU291cmNlPC9zcGFuPgotPC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMEZBIj48c3Ryb25nPkNvbnRlbnQgYXNzaXN0OiBKYXZhU2NyaXB0PC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMEZBIj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YVNjcmlwdCBGaWxlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmFTY3JpcHQgU291cmNlPC9zcGFuPjwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDExRCI+PHN0cm9uZz5Db250ZW50IGFzc2lzdDogWE1MPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMTFEIj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYgotYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4qWE1MIEZpbGVzICgqbm90IGltcGxlbWVudGVkIGluIFdUUCk8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgU291cmNlPC9zcGFuPjwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDEzRiI+PHN0cm9uZz5FZGl0b3IgYXBwZWFyYW5jZTwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDEzRiI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBlYXJhbmNlPC9zcGFuPjwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDE2NyI+PHN0cm9uZz5FZGl0b3IgZm9udDwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDE2NyI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db2xvcnMgYW5kIEZvbnRzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3NwYW4+Ci08L3NwYW4+PC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAxOEEiPjxzdHJvbmc+RWRpdG9yIG5hdmlnYXRpb248L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAxOEEiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmF2aWdhdGlvbjwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAxQjIiPjxzdHJvbmc+RmlsZS10eXBlLXNwZWNpZmljIHNldHRpbmdzPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLWRlc2MgTjEwMUIyIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIKLWFuZCBYTUw8L3NwYW4+LCB0aGVuIG5hdmlnYXRlIHRvIHRoZSBmaWxlIHR5cGUgYW5kIHBhcnRpY3VsYXIgc2V0dGluZzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1vcHRpb24iIGlkPSJOMTAxQzciPjxzdHJvbmc+SG92ZXIgaGVscDwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDFDNyI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ib3ZlcnM8L3NwYW4+PC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtb3B0aW9uIiBpZD0iTjEwMUVGIj48c3Ryb25nPktleSBiaW5kaW5nczwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDFFRiI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXlzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleWJvYXJkIFNob3J0Y3V0czwvc3Bhbj48L3NwYW4+IHRoZW4KLWluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DYXRlZ29yeTwvc3Bhbj4gZmllbGQgc3BlY2lmeSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Tb3VyY2U8L3NwYW4+PC90ZD4KLQotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDIxRSI+PHN0cm9uZz5TcGVsbCBjaGVja2luZzwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA3MC1kZXNjIE4xMDIxRSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlbGwgQ2hlY2s8L3NwYW4+PC90ZD4KLQotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDcwLW9wdGlvbiIgaWQ9Ik4xMDIzMiI+PHN0cm9uZz5TeW50YXggY2hlY2tpbmc8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNzAtZGVzYyBOMTAyMzIiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwZWFyYW5jZTwvc3Bhbj48L3NwYW4+IHRoZW4gY2hlY2sgb3IgdW5jaGVjayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QW5hbHl6ZQotYW5ub3RhdGlvbnMgd2hpbGUgdHlwaW5nPC9zcGFuPiBib3guPC90ZD4KLTwvdHI+Ci0KLTwvdGJvZHk+PC90YWJsZT4KLQotIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2Fubm90IHNldCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4gcHJlZmVyZW5jZXMKLXVubGVzcyB0aGUgQ29yZSBYTUwgU3VwcG9ydCBjYXBhYmlsaXR5ICg8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNhcGFiaWxpdGllczwvc3Bhbj48L3NwYW4+KSBpcyBlbmFibGVkLCBhbmQgeW91IGNhbm5vdAotc2V0IHByZWZlcmVuY2VzIGZvciBEVEQgZmlsZXMgdW5sZXNzIHRoZSBYTUwgRGV2ZWxvcG1lbnQgY2FwYWJpbGl0eSBpcyBlbmFibGVkLjwvZGl2PgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gc2V0IGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIFdlYiBhbmQgWE1MIGZpbGVzLiBUaGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBpbmNsdWRlIHdoZXRoZXIgdG8gYW5hbHl6ZSB0aGUgc3ludGFjdGljIHZhbGlkaXR5IG9mIHlvdXIgZmlsZSB3aGlsZSB5b3UgYXJlIHR5cGluZyBhbmQgd2hhdCBjb2xvcnMgdG8gdXNlIHRvIGhpZ2hsaWdodCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrcywgc2VhcmNoIHJlc3VsdHMsIGJvb2ttYXJrcywgYW5kIG90aGVyIHRleHQuIj5TZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yCi1tYXJrdXAgbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDEwLmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBjaGVjayBzcGVsbGluZyBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5DaGVja2luZyBzcGVsbGluZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2NmOTI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyNiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcNCi1vYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4sIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aA0KLWZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMNCi10aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c25pcHBldHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotDQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5JbiB0aGUgU25pcHBldHMgdmlldyB5b3UgY2FuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyB0YXNrczo8L2NvbnRleHQ+DQotPHN0ZXBzLXVub3JkZXJlZD4NCi08c3RlcD48Y21kPkFkZCBzbmlwcGV0cyBkcmF3ZXJzPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+QWRkIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5FZGl0IHNuaXBwZXQgaXRlbXM8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5EZWxldGUgb3IgaGlkZSBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnM8L2NtZD48L3N0ZXA+DQotPC9zdGVwcy11bm9yZGVyZWQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U25pcHBldHMgdmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDIyLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE2LmRpdGEiPjxsaW5rdGV4dD5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcg0KLWRyYXdlcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4MWUxYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIiAvPgotPG1ldGEgY29udGVudD0ic25pcHBldHMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic25pcHBldHMsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwMS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyMi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDI2IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjYiPjxhIG5hbWU9InRzcmNlZHQwMjYiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9oMT4KLQotCi0KLTxkaXY+PHA+VGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcKLW9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB04oSiLCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGgKLWZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMKLXRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkluIHRoZSBTbmlwcGV0cyB2aWV3IHlvdSBjYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOjwvZGl2PgotCi08dWw+Ci08bGk+PHNwYW4+QWRkIHNuaXBwZXRzIGRyYXdlcnM8L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkFkZCBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5FZGl0IHNuaXBwZXQgaXRlbXM8L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkRlbGV0ZSBvciBoaWRlIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2Vyczwvc3Bhbj48L2xpPgotCi08L3VsPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDEuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4iPlNuaXBwZXRzIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSIiPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIyLmh0bWwiIHRpdGxlPSIiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcgotZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDMyNGViLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyNyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPkFkZGluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwNCi10aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsDQotY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5tYXJrdXAgbGFuZ3VhZ2VzPGluZGV4dGVybT50ZW1wbGF0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnRlbXBsYXRlczxpbmRleHRlcm0+bWFya3VwIGxhbmd1YWdlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+VGVtcGxhdGVzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcgbWFya3VwIGxhbmd1YWdlczo8dWw+DQotPGxpPkhUTUwgb3IgWEhUTUw8L2xpPg0KLTxsaT5KU1A8L2xpPg0KLTwvdWw+PC9jb250ZXh0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWU0NWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgY29udGVudD0ibWFya3VwIGxhbmd1YWdlcywgdGVtcGxhdGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ibWFya3VwIGxhbmd1YWdlcywgdGVtcGxhdGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjguaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyOS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAyNyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDI3Ij48YSBuYW1lPSJ0c3JjZWR0MDI3Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+Q29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLAotdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLAotY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRlbXBsYXRlcyBhcmUgYXZhaWxhYmxlIGZvciB0aGUgZm9sbG93aW5nIG1hcmt1cCBsYW5ndWFnZXM6PHVsPgotPGxpPkhUTUwgb3IgWEhUTUw8L2xpPgotCi08bGk+SlNQPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNC5odG1sIiB0aXRsZT0iSFRNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyOC5odG1sIiB0aXRsZT0iSlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjkuaHRtbCIgdGl0bGU9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Y4MWRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyOCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQNCi1jb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMNCi1wcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRzcmNlZHQwMjh8MXxKU1BwYWdlc3RlbXBsYXRlcyIgc3RhdHVzPSJjaGFuZ2VkIj5KU1ANCi1maWxlczxpbmRleHRlcm0+dGVtcGxhdGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9InRzcmNlZHQwMjh8Mnx0ZW1wbGF0ZXNKU1BwYWdlcyINCi1zdGF0dXM9Im5ldyI+dGVtcGxhdGVzPGluZGV4dGVybT5KU1AgcGFnZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+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+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTY0N2ZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJKU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgY29udGVudD0iSlNQIGZpbGVzLCB0ZW1wbGF0ZXMsIEpTUCBwYWdlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkpTUCBmaWxlcywgdGVtcGxhdGVzLCBKU1AgcGFnZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI5Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDI4IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDI4Ij48YSBuYW1lPSJ0c3JjZWR0MDI4Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2gxPgotCi0KLQotPGRpdj48cD5KU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkCi1jb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMKLXByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBKU1AgcGFnZXMgdGhhdCBzaG91bGQKLWFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMKLXRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZQotdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlIHRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dAotZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQuKSBUaGVuIHNlbGVjdAotdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyIHlvdQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhIEpTUCBmaWxlLjwvcD4KLTxwPlRvIGFkZCBhIG5ldyBKU1AgdGVtcGxhdGUsCi1jb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZAotWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KU1AgVGVtcGxhdGVzPC9zcGFuPgotPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FbnRlciB0aGUgbmV3IHRlbXBsYXRlIG5hbWUgKGEgdGV4dCBzdHJpbmcpIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uCi1vZiB0aGUgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRleHQ8L3NwYW4+IGRyb3AtZG93biBsaXN0LCBzcGVjaWZ5Ci10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudAotYXNzaXN0IGlzIHJlcXVlc3RlZC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQotdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyAodGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlKSB0byBiZQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpYWJsZTwvc3Bhbj4gYnV0dG9uCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC48L3NwYW4+IEZvciBleGFtcGxlLCB0aGUgPHZhciBjbGFzcz0idmFybmFtZSI+d29yZF9zZWxlY3Rpb248L3Zhcj4gdmFyaWFibGUKLWluZGljYXRlcyB0aGUgd29yZCB0aGF0IGlzIHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGVtcGxhdGUgaW5zZXJ0aW9uLAotYW5kIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5jdXJzb3I8L3Zhcj4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY3Vyc29yIHdpbGwKLWJlIGFmdGVyIHRoZSB0ZW1wbGF0ZSBpcyBpbnNlcnRlZCBpbiB0aGUgSFRNTCBkb2N1bWVudC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlCi1zYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC48L3A+Ci08cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcyBwYWdlIGFuZCB1bmNoZWNrCi1pdHMgY2hlY2sgYm94LjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQotdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjQuaHRtbCIgdGl0bGU9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjkuaHRtbCIgdGl0bGU9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGViYjA4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyNyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgY2h1bmsgb2YgcHJlZGVmaW5lZA0KLWNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMNCi1wcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0c3JjZWR0MDI5fDF8dGVtcGxhdGVzWE1MIiBzdGF0dXM9Im5ldyI+dGVtcGxhdGVzPGluZGV4dGVybT5YTUw8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idHNyY2VkdDAyOXwyfHhtbHRlbXBsYXRlc2FkZGluZyIgc3RhdHVzPSJjaGFuZ2VkIj5YTUw8aW5kZXh0ZXJtPmFkZGluZw0KLXRlbXBsYXRlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBYTUwgcGFnZXMgdGhhdCBzaG91bGQNCi1hbGwgY29udGFpbiBhIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBhcHBlYXJhbmNlLiBDcmVhdGUgYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zDQotdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUgYXR0cmlidXRlcyBhbmQgYXR0cmlidXRlDQotdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlIHRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dA0KLWVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmaWVsZC4pIFRoZW4gc2VsZWN0DQotdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyIHlvdQ0KLXdhbnQgdG8gaW5zZXJ0IHlvdXIgY3VzdG9tIHRhYmxlIGludG8gYW4gWE1MIGZpbGUuPC9wPjxwPlRvIGFkZCBhIG5ldyBYTUwNCi10ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4gbWVudSwgc2VsZWN0IDx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByZWZlcmVuY2VzIHBhZ2UsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWIgYW5kDQotWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBUZW1wbGF0ZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk5ldzwvdWljb250cm9sPi4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RW50ZXIgdGhlIG5ldyB0ZW1wbGF0ZSBuYW1lIChhIHRleHQgc3RyaW5nKSBhbmQgYSBicmllZiBkZXNjcmlwdGlvbg0KLW9mIHRoZSB0ZW1wbGF0ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Vc2luZyB0aGUgPHVpY29udHJvbD5Db250ZXh0PC91aWNvbnRyb2w+IGRyb3AtZG93biBsaXN0LCBzcGVjaWZ5DQotdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQNCi1hc3Npc3QgaXMgcmVxdWVzdGVkLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQsIGVudGVyIHRoZSBhcHByb3ByaWF0ZQ0KLXRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgKHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSkgdG8gYmUNCi1pbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDx1aWNvbnRyb2w+VmFyaWFibGU8L3VpY29udHJvbD4gYnV0dG9uDQotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuPC9jbWQ+PHN0ZXB4bXA+Rm9yIGV4YW1wbGUsIHRoZSA8dmFybmFtZT53b3JkX3NlbGVjdGlvbjwvdmFybmFtZT4gdmFyaWFibGUNCi1pbmRpY2F0ZXMgdGhlIHdvcmQgdGhhdCBpcyBzZWxlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRlbXBsYXRlIGluc2VydGlvbiwNCi1hbmQgdGhlIDx2YXJuYW1lPmN1cnNvcjwvdmFybmFtZT4gdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgY3Vyc29yIHdpbGwNCi1iZSBhZnRlciB0aGUgdGVtcGxhdGUgaXMgaW5zZXJ0ZWQgaW4gdGhlIFhNTCBkb2N1bWVudC48L3N0ZXB4bXA+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlDQotc2FtZSBQcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQ0KLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUNCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC48L3A+PHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQ0KLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXINCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcyBwYWdlIGFuZCB1bmNoZWNrDQotaXRzIGNoZWNrIGJveC48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI3LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQ0KLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjguZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjc0MjQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJ0ZW1wbGF0ZXMsIFhNTCwgYWRkaW5nIHRlbXBsYXRlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlbXBsYXRlcywgWE1MLCBhZGRpbmcgdGVtcGxhdGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI3Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyOC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAyNyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNyI+PGEgbmFtZT0idHNyY2VkdDAyNyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9oMT4KLQotCi0KLTxkaXY+PHA+WE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkCi1jb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGFzCi1wcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+Rm9yIGV4YW1wbGUsIHlvdSBtYXkgd29yayBvbiBhIGdyb3VwIG9mIFhNTCBwYWdlcyB0aGF0IHNob3VsZAotYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGEgdGVtcGxhdGUgdGhhdCBjb250YWlucwotdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUgYXR0cmlidXRlcyBhbmQgYXR0cmlidXRlCi12YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0Ci1lZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZC4pIFRoZW4gc2VsZWN0Ci10aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIgeW91Ci13YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGFuIFhNTCBmaWxlLjwvcD4KLTxwPlRvIGFkZCBhIG5ldyBYTUwKLXRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZWZlcmVuY2VzIHBhZ2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQKLVhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIFRlbXBsYXRlczwvc3Bhbj4KLTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPi4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RW50ZXIgdGhlIG5ldyB0ZW1wbGF0ZSBuYW1lIChhIHRleHQgc3RyaW5nKSBhbmQgYSBicmllZiBkZXNjcmlwdGlvbgotb2YgdGhlIHRlbXBsYXRlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVzaW5nIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZXh0PC9zcGFuPiBkcm9wLWRvd24gbGlzdCwgc3BlY2lmeQotdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQKLWFzc2lzdCBpcyByZXF1ZXN0ZWQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZpZWxkLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUKLXRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgKHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZSkgdG8gYmUKLWluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWFibGU8L3NwYW4+IGJ1dHRvbgotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuPC9zcGFuPiBGb3IgZXhhbXBsZSwgdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPndvcmRfc2VsZWN0aW9uPC92YXI+IHZhcmlhYmxlCi1pbmRpY2F0ZXMgdGhlIHdvcmQgdGhhdCBpcyBzZWxlY3RlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRlbXBsYXRlIGluc2VydGlvbiwKLWFuZCB0aGUgPHZhciBjbGFzcz0idmFybmFtZSI+Y3Vyc29yPC92YXI+IHZhcmlhYmxlIGRldGVybWluZXMgd2hlcmUgdGhlIGN1cnNvciB3aWxsCi1iZSBhZnRlciB0aGUgdGVtcGxhdGUgaXMgaW5zZXJ0ZWQgaW4gdGhlIFhNTCBkb2N1bWVudC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlCi1zYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC48L3A+Ci08cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcyBwYWdlIGFuZCB1bmNoZWNrCi1pdHMgY2hlY2sgYm94LjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQotdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjQuaHRtbCIgdGl0bGU9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjguaHRtbCIgdGl0bGU9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOWNjODQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL0VkaXRvckNvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL0VkaXRvckNvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4MDY3ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotCi08Y29udGV4dCBpZD0ic3RlZDAwMDEiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjdXN0b21pemUgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLgotV2hlbiB0aGUgPGI+SGlnaGxpZ2h0IG1hdGNoaW5nIGJyYWNrZXRzPC9iPiBvcHRpb24gaXMgc2VsZWN0ZWQsIHdoZW5ldmVyIHRoZSBjdXJzb3IgaXMgbmV4dCB0byBhIGJyYWNrZXQgb3IgY3VybHkgYnJhY2VzLCBpdHMgb3BlbmluZyBvciBjbG9zaW5nIGNvdW50ZXIgcGFydCBpcyBoaWdobGlnaHRlZC4KLVNlbGVjdCB0aGUgPGI+UmVwb3J0IHByb2JsZW1zIGFzIHlvdSB0eXBlPC9iPiBjaGVjayBib3ggdG8gdXBkYXRlIHZhbGlkaXR5IGFubm90YXRpb25zICh0ZW1wb3JhcnkgYW5ub3RhdGlvbnMsIHN1Y2ggYXMgbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIGJhc2VkIG9uIGEgRFRELCB0aGF0IGdvIGF3YXkgd2hlbiB0aGUgZWRpdG9yIGlzIGNsb3NlZCwgb3IgdGhlIHByb2JsZW0gaXMgZml4ZWQpIGFzIHRoZSB1c2VyIHR5cGVzLgotSW4gdGhlIDxiPkFwcGVhcmFuY2UgY29sb3Igb3B0aW9uczwvYj4gdGFibGUsIHlvdSBjYW4gYWRqdXN0IHZhcmlvdXMgZWRpdG9yIGFwcGVhcmFuY2UgZmVhdHVyZXMuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ic3RlZDAwMDMiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjdXN0b21pemUgaG92ZXIgdGV4dCBpbiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpc3BlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ieG1sbTEwMTAiPgotPGRlc2NyaXB0aW9uPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSB0byBmaW5pc2ggdGFncyBvciBsaW5lcyBvZiBjb2RlIGFuZCBpbnNlcnQgdGVtcGxhdGVzLiBEZXBlbmRpbmcgb24gdGhlIHNvdXJjZSBtYXJrdXAgbGFuZ3VhZ2UsIHRoZSBjaG9pY2VzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCBhcmUgYmFzZWQgb24gdGFncyBkZWZpbmVkIGJ5IERURCBhbmQgc2NoZW1hIGZpbGVzLCB0YWcgbGlicmFyeSBkZXNjcmlwdG9ycywgb3IgY29udGVudCBtb2RlbCBzdGFuZGFyZCB0aGF0IGlzIHNwZWNpZmllZCBmb3IgdGhlIGZpbGUgYmVpbmcgZWRpdGVkLiBIVE1MIGNvbnRlbnQgYXNzaXN0IGNob2ljZXMgYXJlIGJhc2VkIG9uIHRoZSBXM0MgSFRNTCA0LjAxIGNvbnRlbnQgbW9kZWwuCi0KLUlmIHlvdXIgY3Vyc29yIGlzIGluIGEgcG9zaXRpb24gd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0IG9mIGF2YWlsYWJsZSBjaG9pY2VzIGlzIGRpc3BsYXllZC4gVGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgZGlzcGxheXMgYWxsIGF2YWlsYWJsZSBjb21wbGV0aW9ucyBmb3IgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGVtcGxhdGVzLiBDb250ZW50IGFzc2lzdCBpcyBhbHNvIGF2YWlsYWJsZSBieSBwcmVzc2luZyBDdHJsK1NwYWNlLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ29udGVudCBhc3Npc3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ieG1sbTEwMzAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBmb3JtYXQgYW4gZW50aXJlIGRvY3VtZW50LiBGb3JtYXR0aW5nIHJlc3RvcmVzIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBpbmRlbnRhdGlvbiBhbmQgcG9zaXRpb25pbmcsIHdoaWNoIG1heSBoYXZlIGJlZW4gb2Zmc2V0IGR1cmluZyBlZGl0aW5nLCB0byBzZWUgbmVzdGluZyBoaWVyYXJjaGllcyBhbmQgcmVsYXRpb25zaGlwcyBtb3JlIGNsZWFybHkgaW4gdGhlIGZpbGUuIEVkaXQgdGhlIGFwcHJvcHJpYXRlIFByZWZlcmVuY2VzIHBhZ2VzIHRvIG1ha2UgY2hhbmdlcyBpbiBzcGVjaWZpYyBmb3JtYXR0aW5nIGJlaGF2aW9yLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDQwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZm9ybWF0IHNlbGVjdGVkIGVsZW1lbnRzLiBGb3JtYXR0aW5nIHJlc3RvcmVzIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBpbmRlbnRhdGlvbiBhbmQgcG9zaXRpb25pbmcsIHdoaWNoIG1heSBoYXZlIGJlZW4gb2Zmc2V0IGR1cmluZyBlZGl0aW5nLCB0byBzZWUgbmVzdGluZyBoaWVyYXJjaGllcyBhbmQgcmVsYXRpb25zaGlwcyBtb3JlIGNsZWFybHkgaW4gdGhlIGZpbGUuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ieG1sbTEwNzAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBvcGVuIHRoZSA8Yj5Qcm9wZXJ0aWVzPC9iPiB2aWV3LCB3aGljaCBkaXNwbGF5cyBwcm9wZXJ0aWVzIHJlbGV2YW50IHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgaWYgYW55IGV4aXN0LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iUHJvcGVydGllcyB2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJvcHZpZXcuaHRtIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ieG1sbTIwMDAiPgotPGRlc2NyaXB0aW9uPlRoaXMgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgdGV4dCBmaWxlIHRoYXQgaXMgY29kZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuIEZvciBhIG1vcmUgc3BlY2lmaWMgbGlzdCBvZiBlZGl0aW5nIGZlYXR1cmVzLCBzZWUgdGhlIGZpcnN0IGxpbmsgYmVsb3cuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwMDAiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjdXN0b21pemUgdGFzayB0YWcgZGlzY292ZXJ5IGluIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycy4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJlY3NzMDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIENTUyBzb3VyY2UgcGFnZSBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIGNhc2NhZGluZyBzdHlsZSBzaGVldC4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ibWlzYzAxODAiPgotIDxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZWRpdCB0aGUgQ1NTIGNvbnRlbnQgc2V0dGluZ3MgZm9yIGEgQ1NTIGZpbGUuIFlvdSBjYW4gc3BlY2lmeSBDU1MgcHJvZmlsZSBvciByZXN0b3JlIHRoZSBkZWZhdWx0IGJ5IGNsaWNraW5nIDxiPlJlc3RvcmUgRGVmYXVsdHM8L2I+LgotIDwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvRWRpdG9yQ3NzQ29udGV4dHMyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL0VkaXRvckNzc0NvbnRleHRzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YmMzOWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvRWRpdG9yQ3NzQ29udGV4dHMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iY3Nzc291cmNlX3NvdXJjZV9IZWxwSWQiPgotPGRlc2NyaXB0aW9uPlRoZSBDU1Mgc291cmNlIHBhZ2UgZWRpdG9yIGxldHMgeW91IGVkaXQgYSBjYXNjYWRpbmcgc3R5bGUgc2hlZXQuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9ImVjc3MwMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGUgQ1NTIHNvdXJjZSBwYWdlIGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgY2FzY2FkaW5nIHN0eWxlIHNoZWV0LiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLSA8Y29udGV4dCBpZD0ibWlzYzAxODAiPgotIDxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZWRpdCB0aGUgQ1NTIGNvbnRlbnQgc2V0dGluZ3MgZm9yIGEgQ1NTIGZpbGUuIFlvdSBjYW4gc3BlY2lmeSBDU1MgcHJvZmlsZSBvciByZXN0b3JlIHRoZSBkZWZhdWx0IGJ5IGNsaWNraW5nIDxiPlJlc3RvcmUgRGVmYXVsdHM8L2I+LgotIDwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhNTZjZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYmMwOGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gRWRpdG9yQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgRWRpdG9yQ3NzQ29udGV4dHMyLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotZ2VuZXJhdGVTb3VyY2VCdW5kbGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGYzMDZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFNTRSBpbmZvcG9wcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM3OTZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvckNzc0NvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzRhNmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTYwYzUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBTdGF0aWMgV2ViIGluZm9wb3AKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvU3RhdGljV2ViV2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvU3RhdGljV2ViV2l6Q29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjBmNDAzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL1N0YXRpY1dlYldpekNvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0id2VidzIwMDAiPgotPGRlc2NyaXB0aW9uPiBVc2UgdGhpcyBwYWdlIHRvIG5hbWUgeW91ciBXZWIgcHJvamVjdCBhbmQgc3BlY2lmeSB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gKHRoZSBwbGFjZSB3aGVyZSB0aGUgcmVzb3VyY2VzIHlvdSBjcmVhdGUgYXJlIHN0b3JlZC4pIFdoZW4gdGhlIFVzZSBkZWZhdWx0IGNoZWNrIGJveCBpcyBzZWxlY3RlZCwgdGhlIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiB3aGVyZSB5b3VyIHdvcmtzcGFjZSByZXNpZGVzLiBUbyBjaGFuZ2UgdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gbG9jYXRpb24sIGNsZWFyIHRoZSBjaGVja2JveCBhbmQgbG9jYXRlIHRoZSBwYXRoIHVzaW5nIHRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gVG8gY29uZmlndXJlIGFkZGl0aW9uYWwgb3B0aW9ucywgc2VsZWN0IHRoZSA8Yj5OZXh0PC9iPiBidXR0b24uCi1JbiB0aGUgVGFyZ2V0IFJ1bnRpbWUgZmllbGQsIHNlbGVjdCB0aGUgc2VydmVyIHdoZXJlIHlvdSB3YW50IHRvIHB1Ymxpc2ggdGhlIFdlYiBwcm9qZWN0LiBpZiBhIHNlcnZlciBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLCBjbGljayA8Yj5OZXc8L2I+IHRvIHNlbGVjdCBhIHNlcnZlciBydW50aW1lIGVudmlyb25tZW50LiA8L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ3MjEwMCI+Ci08ZGVzY3JpcHRpb24+UHJlc2V0cyBhcmUgdXNlZCB0byBkZWZpbmUgYSBkZWZhdWx0IHNldCBvZiBmYWNldCB2ZXJzaW9ucyB0aGF0IHdpbGwgY29uZmlndXJlIGEgcHJvamVjdCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZGV2ZWxvcG1lbnQuIFRoZSBTdGF0aWMgV2ViIE1vZHVsZSBmYWNldCBlbmFibGVzIHRoZSBwcm9qZWN0IHRvIGJlIGRlcGxveWVkIGFzIGEgc3RhdGljCi1XZWIgbW9kdWxlLiBDbGljayBTaG93IFJ1bnRpbWVzIHRvIHZpZXcgdGhlIGF2YWlsYWJsZSBydW50aW1lcyBhbmQgcnVudGltZSBjb21wb3NpdGlvbnMuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VidzIyMDAiPgotPGRlc2NyaXB0aW9uPlRoZSBXZWIgY29udGVudCBmb2xkZXIgaXMgd2hlcmUgdGhlIGVsZW1lbnRzIG9mIHlvdXIgV2ViIHNpdGUgc3VjaCBhcyBXZWIgcGFnZXMsIGdyYXBoaWNzIGFuZCBzdHlsZSBzaGVldHMgYXJlIHN0b3JlZC4gVGhpcyBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGVudCBvZiB5b3VyIFdlYiBzaXRlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIFdBUiBmaWxlIGF0IGRlcGxveW1lbnQgYW5kIHRoYXQgbGluayB2YWxpZGF0aW9uIHdpbGwgd29yayBjb3JyZWN0bHkuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdjMWE5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IFN0YXRpY1dlYldpekNvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWQyZGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgICA9IFN0YXRpYyBXZWIgaW5mb3BvcAotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFjMDE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0gICAgICA8Y29udGV4dHMgZmlsZT0iU3RhdGljV2ViV2l6Q29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIi8+Ci08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkY2E5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcl8xLjAuMC5qYXIKLXRlbXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDViMTU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvRG9jQnVpbGQueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvRG9jQnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzVjY2YyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL0RvY0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLSAKLQotCVRoaXMgc2NyaXB0IGJ1aWxkIHRoZSBIZWxwIHBsdWctaW4gYnkgdHJhbnNmb3JtaW5nIHRoZSBESVRBIHNvdXJjZSBmaWxlcyBpbnRvIEhUTUwuCi0JCi0JVG8gdXNlIHRoaXMgc2NyaXB0LCB5b3UgbXVzdCBpbnN0YWxsIERJVEEtT1Qgb24geW91ciBtYWNoaW5lIGluIHRoZSBkaXJlY3RvcnkKLQlkZWZpbmVkIGJ5IHRoZSBkaXRhLm90LmRpciBwcm9wZXJ0eS4KLQkKLQlSdW4gdGhlIGRlZmF1bHQgdGFyZ2V0IGFmdGVyIHlvdSBlZGl0IHRoZSBESVRBIHNvdXJjZSBmaWxlcyB0byByZWdlbmVyYXRlIHRoZSBIVE1MLgotCQotCVRvIGN1c3RvbWl6ZSB0aGlzIHNjcmlwdCBmb3Igb3RoZXIgSGVscCBwbHVnLWlucywgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJncy5pbnB1dCBwcm9wZXJ0eQotCXRvIGJlIHRoZSBESVRBIG1hcCBmaWxlIGZvciB0aGUgcGx1Zy1pbi4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgbGlua3MgdG8gc2libGluZyBIZWxwIHBsdWctaW5zIGhhdmUgc2NvcGU9InBlZXIiLCBvdGhlcndpc2UgdGhlCi0Jb3V0cHV0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBzaGlmdGVkIGluY29ycmVjdGx5LgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCB5b3UgaGFuZCBjb2RlIHlvdXIgcGx1Z2luLnhtbCBmaWxlIGluIG15cGx1Z2luLnhtbC4gVGhpcyBmaWxlCi0Jd2lsbCBiZSBjb3BpZWQgb3ZlciB0aGUgZ2VuZXJhdGVkIHBsdWdpbi54bWwgd2hpY2ggaXMgY3VycmVudGx5IG5vdCBiZWluZyBnZW5lcmF0ZWQgY29ycmVjdGx5Ci0JYnkgRElUQS1PVC4KLQkKLQlDaGFuZ2VMb2c6Ci0JMjAwNi0wNC0wNSBBcnRodXIgUnltYW4gPHJ5bWFuQGNhLmlibS5jb20+Ci0JLSBDcmVhdGVkLgotCTIwMDgtMDEtMDkgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIGZvciBuZXcgRElUQS1PVCB2ZXJzaW9uCi0JMjAwOC0wNS0wNSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgdG8gYWRkIGdlbmVyYXRpb24gb2YgcHJlLWJ1aWx0IGhlbHAgaW5kZXguIAotCS0gTXVzdCBkZWxldGUgL2luZGV4IGZvbGRlciBiZWZvcmUgcnVubmluZyBidWlsZAotLS0+Ci08cHJvamVjdCBuYW1lPSJlY2xpcHNlaGVscCIgZGVmYXVsdD0iYWxsIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLm90LmRpciIgbG9jYXRpb249IkM6L0RJVEEtT1QxLjIuMiIgLz4KLQotCTxwYXRoIGlkPSJkb3N0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1saWIke2ZpbGUuc2VwYXJhdG9yfWRvc3QuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIG5hbWU9ImludGVncmF0ZSIgY2xhc3NuYW1lPSJvcmcuZGl0YS5kb3N0LnBsYXRmb3JtLkludGVncmF0b3JUYXNrIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iZG9zdC5jbGFzcy5wYXRoIiAvPgotCTwvdGFza2RlZj4KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iaW50ZWdyYXRlLCBlY2xpcHNlaGVscCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnRlZ3JhdGUiPgotCQk8aW50ZWdyYXRlIGRpdGFkaXI9IiR7ZGl0YS5vdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSByZXZpc2UgYmVsb3cgaGVyZSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImVjbGlwc2VoZWxwIj4KLQkJPGFudCBhbnRmaWxlPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9Y29uZHVjdG9yLnhtbCIgdGFyZ2V0PSJpbml0IiBkaXI9IiR7ZGl0YS5vdC5kaXJ9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNvcHljc3MiIHZhbHVlPSJubyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNzc3BhdGgiIHZhbHVlPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnByb3ZpZGVyIiB2YWx1ZT0iRWNsaXBzZS5vcmciIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnZlcnNpb24iIHZhbHVlPSIzLjMuMCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmlucHV0IiBsb2NhdGlvbj0icmVsYXRlZGxpbmtzLmRpdGFtYXAiIC8+ICAgIAkJCi0JCQk8cHJvcGVydHkgbmFtZT0iY2xlYW4udGVtcCIgdmFsdWU9InRydWUiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZGl0YS5leHRuYW1lIiB2YWx1ZT0iLmRpdGEiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iZGl0YS50ZW1wLmRpciIgbG9jYXRpb249InRlbXAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0LmRpciIgbG9jYXRpb249IiIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJ0cmFuc3R5cGUiIHZhbHVlPSJlY2xpcHNlaGVscCIgLz4KLQkJPC9hbnQ+Ci0JCTxjb3B5IGZpbGU9Im15cGx1Z2luLnhtbCIgdG9maWxlPSJwbHVnaW4ueG1sIiBvdmVyd3JpdGU9InllcyIgLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkLmluZGV4IiBkZXNjcmlwdGlvbj0iQnVpbGRzIHNlYXJjaCBpbmRleCBmb3IgdGhlIHBsdWctaW4iIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCSAgICAgPGhlbHAuYnVpbGRIZWxwSW5kZXggbWFuaWZlc3Q9InBsdWdpbi54bWwiIGRlc3RpbmF0aW9uPSIuIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdjMGY0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZmFhYjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgd2VidG9vbHNfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJpbmRleC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qaHRtKixcCi0gICAgICAgICAgICAgICBpbmRleC8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLQkJICAgICAgICoubWFwbGlzdCxcCi0gICAgICAgICAgICAgICAqLmRpdGFtYXAsXAotCQkgICAgICAgdG9waWNzLyouZGl0YQotYmluLmV4Y2x1ZGVzID0gRG9jQnVpbGQueG1sLFwKLSAgICAgICAgICAgICAgIG15UGx1Z2luKi54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvZml4aXQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2ZpeGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhZmMzZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvZml4aXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2dycHR5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2dycHR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQyNDVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ncnB0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9tZW51YnV0dG9uLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9tZW51YnV0dG9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmMWE2Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbWVudWJ1dHRvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ubGludXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzEzNWNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ubGludXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL25zaG93ZXJyLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9uc2hvd2Vyci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmZkZDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL25zaG93ZXJyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2FybmluZy5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRmZGY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWY5Y2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253aW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rYnJrLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Jyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjE0MzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rYnJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Nzcy5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtjc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTBjYWY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Nzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtnci1sLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzczYjZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rZ3IuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rZ3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M2MjYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2luZC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtpbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNmNzU2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2luZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmttYWwuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5YzQ3Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmttYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbnVtLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua251bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjRhNjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbnVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua290ci5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtvdHIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTk2NTkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua290ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtxdWUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rcXVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZjkzOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rdHNrLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDQ3ZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9za2lwaXQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3NraXBpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZjViMWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3NraXBpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvdmlld2xpbmsuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3ZpZXdsaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3YjA1MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvdmlld2xpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvXzEwLmNmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L18xMC5jZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGM0YzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvXzEwLmNmcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzZjQ3MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9kZWxldGFibGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWUxYjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIE1heSAxNCAyMDowMzowMiBFRFQgMjAwOA0KLW9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcj1vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJcbjEuMC40MDAucXVhbGlmaWVyDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwYzJjYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1dlZCBNYXkgMTQgMjA6MDM6MDIgRURUIDIwMDgNCi1sdWNlbmU9MS45LjEudjIwMDgwMzA2MTgxMQ0KLWFuYWx5emVyPW9yZy5lY2xpcHNlLmhlbHAuYmFzZVwjMy4zLjEwMC52MjAwODA0MjU/bG9jYWxlXD1lbg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwMDk3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9pbmRleGVkX2RvY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4NCi0jV2VkIE1heSAxNCAyMDowMzowMiBFRFQgMjAwOA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZmlsdGJuLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd3RvdmVyLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqZGV0YWdzLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnZ3Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3bHN0d2l6Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Zmx0d2l6Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJhcnRpZmFjdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2xpc3Ribi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3RmZWF0dXJlcy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dlZHR2dy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jcGRqc3BzLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGxpYi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHN0eWxlc2hlZXQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuaHRtbD0wDQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9zZWdtZW50cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5NzY5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbmRleC9zZWdtZW50cworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL215cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkYzMwZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9teXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4gCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotICAgPHBsdWdpbj4gCi0gICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgICAgCTx0b2MgZmlsZT0id2VidG9vbHNfdG9jLnhtbCIgLz4gCi0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICAgICAgICAgCSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAgICAgICAJICAgCi0gICAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcmluZGV4LnhtbCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLmx1Y2VuZVNlYXJjaFBhcnRpY2lwYW50cyI+Ci0gICAgICA8YmluZGluZyBwYXJ0aWNpcGFudElkPSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UueGh0bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgIDwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci5tYXBsaXN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZDUyZGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLm1hcGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxtYXBsaXN0IHZlcnNpb249IjMuNi4yIj4NCi0gIDxuYXY+DQotICAgIDxtYXAgZmlsZT0id2VidG9vbHNfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICAgIDxtYXAgZmlsZT0icmVsYXRlZGxpbmtzLmRpdGFtYXAiLz4NCi0gIDwvbGluaz4NCi08L21hcGxpc3Q+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyaW5kZXgueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmM4YTRkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcmluZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPGluZGV4PgotICA8ZW50cnkga2V5d29yZD0iV2ViIGFwcGxpY2F0aW9ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuaHRtbCNjY3d0b3ZlciIgdGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIG9yIGltcG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5odG1sI2N3ZWJwcm9qZWN0cyIgdGl0bGU9IldlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InJlc291cmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmh0bWwjdHdjcmVwcmoiIHRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZXJ2ZXIgdGFyZ2V0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sI3RzZXJ2ZXJ0YXJnZXQiIHRpdGxlPSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiB0b29scyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImZlYXR1cmVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbCNjd3RmZWF0dXJlcyIgdGl0bGU9IldlYiB0b29scyBmZWF0dXJlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2Njd2VidncuaHRtbCNjY3dlYnZ3IiB0aXRsZT0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV2ViIHByb2plY3RzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBFeHBsb3JlciB2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3ZWJ2dy5odG1sI2Njd2VidnciIHRpdGxlPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dlYnByb2plY3RzLmh0bWwjY3dlYnByb2plY3RzIiB0aXRsZT0iV2ViIHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgZHluYW1pYyBwcm9qZWN0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmh0bWwjdHdjcmVwcmoiIHRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkeW5hbWljIHByb2plY3RzIG92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouaHRtbCNjY3dlYnByaiIgdGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBzdGF0aWMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXN0YS5odG1sI3R3Y3Jlc3RhIiB0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb252ZXJ0aW5nIHN0YXRpYyB0byBkeW5hbWljIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwY252cnQuaHRtbCN0d3BjbnZydCIgdGl0bGU9IkNvbnZlcnRpbmcgc3RhdGljIFdlYiBwcm9qZWN0cyB0byBkeW5hbWljIFdlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InN0YXRpYyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2Njc3RhdGljLmh0bWwjY2NzdGF0aWMiIHRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZXhwb3J0aW5nIFdBUiBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmh0bWwjdHdjcmV3YXIiIHRpdGxlPSJFeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2aXJ0dWFsIEpBUiBmaWxlcyBhbmQgcHJvamVjdHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d3BsaWIuaHRtbCN0d3BsaWIiIHRpdGxlPSJBZGRpbmcgV2ViIGxpYnJhcnkgcHJvamVjdHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9wZXJ0aWVzIHNldHRpbmdzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwcmpzZXQuaHRtbCN0d3ByanNldCIgdGl0bGU9IlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgcmVzb3VyY2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwjY3dlYnJlc291cmNlcyIgdGl0bGU9IldlYiByZXNvdXJjZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV2ViIHBhZ2UgZGVzaWduIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sI2N3ZWJwYWdlZGVzaWduIiB0aXRsZT0iV2ViIHBhZ2UgZGVzaWduIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldBUiBmaWxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3d3YXJvdnIuaHRtbCNjd3dhcm92ciIgdGl0bGU9IldlYiBhcmNoaXZlIChXQVIpIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdpbXB3YXIuaHRtbCN0d2ltcHdhciIgdGl0bGU9IkltcG9ydGluZyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImV4cG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmh0bWwjdHdjcmV3YXIiIHRpdGxlPSJFeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZHluYW1pYyBXZWIgcHJvamVjdHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL2Njd2VicHJqLmh0bWwjY2N3ZWJwcmoiIHRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzdGF0aWMgV2ViIHByb2plY3RzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXN0YS5odG1sI3R3Y3Jlc3RhIiB0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb252ZXJ0aW5nIHRvIGR5bmFtaWMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d3BjbnZydC5odG1sI3R3cGNudnJ0IiB0aXRsZT0iQ29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3N0YXRpYy5odG1sI2Njc3RhdGljIiB0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJleHBvcnRpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJXQVIgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXdhci5odG1sI3R3Y3Jld2FyIiB0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZpcnR1YWwgSkFSIGZpbGVzIGFzc29jaWF0aW9ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IldlYiBsaWJyYXJ5IHByb2plY3RzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwbGliLmh0bWwjdHdwbGliIiB0aXRsZT0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IndvcmtiZW5jaCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IldlYiBlZGl0b3JzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3d3ZWR0dncuaHRtbCNjd3dlZHR2dyIgdGl0bGU9IldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBwYWdlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuaHRtbCN0amRldGFncyIgdGl0bGU9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImZyYW1lc2V0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpjcmVodG0uaHRtbCN0amNyZWh0bSIgdGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSFRNTCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpjcmVodG0uaHRtbCN0amNyZWh0bSIgdGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIHByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpwcmVmcy5odG1sI3RqcHJlZnMiIHRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV01MIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90amNyZWh0bS5odG1sI3RqY3JlaHRtIiB0aXRsZT0iQ3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYSFRNTCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpjcmVodG0uaHRtbCN0amNyZWh0bSIgdGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRE9DVFlQRSBkZWNsYXJhdGlvbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgYXV0b21hdGljYWxseSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqcHJlZnMuaHRtbCN0anByZWZzIiB0aXRsZT0iRGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkhUTUwgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIHByZWZlcmVuY2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpwcmVmcy5odG1sI3RqcHJlZnMiIHRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic3R5bGUgc2hlZXRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3R5bGVzaGVldC5odG1sI3RzdHlsZXNoZWV0IiB0aXRsZT0iQ3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKU1AgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqY3JlanNwLmh0bWwjdGpjcmVqc3AiIHRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jcGRqc3BzLmh0bWwjY3BkanNwcyIgdGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgY29udGVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgZHluYW1pY2FsbHkiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jcGRqc3BzLmh0bWwjY3BkanNwcyIgdGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzZXJ2bGV0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdzcnZ3aXouaHRtbCN0d3NydndpeiIgdGl0bGU9IkNyZWF0aW5nIHNlcnZsZXRzIi8+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3bHN0d2l6Lmh0bWwjdHdsc3R3aXoiIHRpdGxlPSJDcmVhdGluZyBMaXN0ZW5lcnMiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdmbHR3aXouaHRtbCN0d2ZsdHdpeiIgdGl0bGU9IkNyZWF0aW5nIEZpbHRlcnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3c2VydmJuLmh0bWwjY3dzZXJ2Ym4iIHRpdGxlPSJTZXJ2bGV0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgc2VydmVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgZHluYW1pYyBjb250ZW50Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uaHRtbCNjd3NlcnZibiIgdGl0bGU9IlNlcnZsZXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Imxpc3RlbmVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dsaXN0Ym4uaHRtbCNjd2xpc3RibiIgdGl0bGU9Ikxpc3RlbmVycyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJmaWx0ZXJzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd2ZpbHRibi5odG1sI2N3ZmlsdGJuIiB0aXRsZT0iTGlzdGVuZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImJ1aWxkIG91dHB1dCBmb2xkZXJzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iaWdub3JpbmcgaW4gQ1ZTIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjdnNyLmh0bWwjdHdjdnNyIiB0aXRsZT0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJDVlMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZXR0aW5nIHJlcG9zaXRvcnkgZGVmYXVsdHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2N2c3IuaHRtbCN0d2N2c3IiIHRpdGxlPSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImN2c2lnbm9yZSBmaWxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjdnNyLmh0bWwjdHdjdnNyIiB0aXRsZT0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJyZXBvc2l0b3JpZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJkZWZhdWx0IENWUyBzZXR0aW5ncyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y3Zzci5odG1sI3R3Y3ZzciIgdGl0bGU9IlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2VydmVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRhcmdldGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzZXJ2ZXJ0YXJnZXQuaHRtbCN0c2VydmVydGFyZ2V0IiB0aXRsZT0iU2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9ucyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzI1MTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgPSBXZWIgdG9vbHMgZG9jdW1lbnRhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkYzMwZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+IAotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLSAgIDxwbHVnaW4+IAotICAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgICAgIAk8dG9jIGZpbGU9IndlYnRvb2xzX3RvYy54bWwiIC8+IAotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLSAgICAgICAgIAkgICA8L2V4dGVuc2lvbj4gIAotICAgICAgICAgCSAgIAotICAgICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgICAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJpbmRleC54bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5sdWNlbmVTZWFyY2hQYXJ0aWNpcGFudHMiPgotICAgICAgPGJpbmRpbmcgcGFydGljaXBhbnRJZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLnhodG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICA8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9yZWxhdGVkbGlua3MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3JlbGF0ZWRsaW5rcy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc4ZjMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3JlbGF0ZWRsaW5rcy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIHRpdGxlPSJXZWIgdG9vbHMgcmVsYXRlZCBsaW5rcyI+DQotPHJlbHRhYmxlPg0KLTxyZWxoZWFkZXI+DQotPHJlbGNvbHNwZWMgdHlwZT0iY29uY2VwdCI+PC9yZWxjb2xzcGVjPg0KLTxyZWxjb2xzcGVjIHR5cGU9InRhc2siPjwvcmVsY29sc3BlYz4NCi08cmVsY29sc3BlYyB0eXBlPSJyZWZlcmVuY2UiPjwvcmVsY29sc3BlYz4NCi08L3JlbGhlYWRlcj4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjaGd4ZHQuZGl0YSIgbmF2dGl0bGU9IlNwZWNpZnlpbmcgYW4gaW1wbGljaXQgZG9jdW1lbnQgdHlwZSBmb3IgYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlaHRtLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NwZGpzcHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c2VydmVydGFyZ2V0LmRpdGEiIG5hdnRpdGxlPSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3N0YXRpYy5kaXRhIiBuYXZ0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnByai5kaXRhIiBuYXZ0aXRsZT0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njc3RhdGljLmRpdGEiIG5hdnRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIiBzY29wZT0icGVlciI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVzdGEuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmV3YXIuZGl0YSIgbmF2dGl0bGU9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjdnNyLmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdpbXB3YXIuZGl0YSIgbmF2dGl0bGU9IkltcG9ydGluZyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njc3RhdGljLmRpdGEiIG5hdnRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIiBzY29wZT0icGVlciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3cGNudnJ0LmRpdGEiIG5hdnRpdGxlPSJDb252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3cGxpYi5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3ByanNldC5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3NlcnZibi5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iU2VydmxldHMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3c3J2d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBTZXJ2bGV0cyI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dsaXN0Ym4uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9Ikxpc3RlbmVycyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdsc3R3aXouZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIExpc3RlbmVycyI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dmaWx0Ym4uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkZpbHRlcnMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Zmx0d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBGaWx0ZXJzIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnZ3LmRpdGEiIG5hdnRpdGxlPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhIiBuYXZ0aXRsZT0iV2ViIHByb2plY3RzIiBzY29wZT0icGVlciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd3RvdmVyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jcGRqc3BzLmRpdGEiIG5hdnRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdpbXB3YXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkltcG9ydGluZyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuZGl0YSIgbmF2dGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3dGZlYXR1cmVzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgdG9vbHMgZmVhdHVyZXMiPg0KLTwvdG9waWNyZWY+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJkZXZlbG9wbWVudHRvb2xzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgZGV2ZWxvcG1lbnQgdG9vbHMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ig0KLXNjb3BlPSJwZWVyIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqZGV0YWdzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhbmQgZWRpdGluZyBXZWIgcGFnZXMgLSBvdmVydmlldyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViYXJ0aWZhY3QuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIFdlYiBBcnRpZmFjdHMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3RmZWF0dXJlcy5kaXRhIiBuYXZ0aXRsZT0iV2ViIHRvb2xzIGZlYXR1cmVzIj48L3RvcGljcmVmPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViZGV2ZWxvcG1lbnR0b29scy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGRldmVsb3BtZW50IHRvb2xzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnBhZ2VkZXNpZ24uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBwYWdlIGRlc2lnbiI+DQotPC90b3BpY3JlZj4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnRlY2hub2xvZ2llcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHRlY2hub2xvZ2llcyI+DQotPC90b3BpY3JlZj4gLS0+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdzcnZ3aXouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIFNlcnZsZXRzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdsc3R3aXouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIExpc3RlbmVycyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Zmx0d2l6LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBGaWx0ZXJzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJ0ZWNobm9sb2dpZXMuZGl0YSIgbmF2dGl0bGU9IldlYiB0ZWNobm9sb2dpZXMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jcGRqc3BzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jcGRqc3BzLmRpdGEiIG5hdnRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3NlcnZibi5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iU2VydmxldHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2xpc3Ribi5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iTGlzdGVuZXJzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dmaWx0Ym4uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkZpbHRlcnMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3NlcnZibi5kaXRhIiBuYXZ0aXRsZT0iU2VydmxldHMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2xpc3Ribi5kaXRhIiBuYXZ0aXRsZT0iTGlzdGVuZXJzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dmaWx0Ym4uZGl0YSIgbmF2dGl0bGU9IkZpbHRlcnMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3d0b3Zlci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViZGV2ZWxvcG1lbnR0b29scy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGRldmVsb3BtZW50IHRvb2xzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3Nydndpei5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgU2VydmxldHMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2xzdHdpei5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgTGlzdGVuZXJzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdmbHR3aXouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIEZpbHRlcnMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmRldmVsb3BtZW50dG9vbHMuZGl0YSIgbmF2dGl0bGU9IldlYiBkZXZlbG9wbWVudCB0b29scyI+DQotPC90b3BpY3JlZj4gLS0+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3N0YXRpYy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXN0YS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVodG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWpzcC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2VkdHZ3LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXb3JrYmVuY2ggaW50ZWdyYXRpb24gd2l0aCBXZWIgZWRpdG9ycyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anByZWZzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NwZGpzcHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicHJvamVjdHMuZGl0YSIgbmF2dGl0bGU9IldlYiBwcm9qZWN0cyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njc3RhdGljLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njc3RhdGljLmRpdGEiIG5hdnRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHJlc291cmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXN0YS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VicHJqLmRpdGEiIG5hdnRpdGxlPSJEeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHJlc291cmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhIiBuYXZ0aXRsZT0iV2ViIHBhZ2UgZGVzaWduIj48L3RvcGljcmVmPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViZGV2ZWxvcG1lbnR0b29scy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGRldmVsb3BtZW50IHRvb2xzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEiIG5hdnRpdGxlPSJXZWIgcmVzb3VyY2VzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d3YXJvdnIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBhcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2VkdHZ3LmRpdGEiIG5hdnRpdGxlPSJXb3JrYmVuY2ggaW50ZWdyYXRpb24gd2l0aCBXZWIgZWRpdG9ycyI+DQotPC90b3BpY3JlZj4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmRldmVsb3BtZW50dG9vbHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBkZXZlbG9wbWVudCB0b29scyI+DQotPC90b3BpY3JlZj4gLS0+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgcmVzb3VyY2VzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgcmVzb3VyY2VzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3aW1wd2FyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXdhci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiByZXNvdXJjZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJkZXZlbG9wbWVudHRvb2xzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgZGV2ZWxvcG1lbnQgdG9vbHMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anByZWZzLmRpdGEiIG5hdnRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08L3JlbHRhYmxlPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3JlbGF0ZWRsaW5rcy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9yZWxhdGVkbGlua3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MThhMzI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3JlbGF0ZWRsaW5rcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IldlYiB0b29scyByZWxhdGVkIGxpbmtzIi8+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3N0YXRpYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTgwOWZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3N0YXRpYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjY3N0YXRpYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U3RhdGljIFdlYiBwcm9qZWN0czwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V2ViIHByb2plY3RzPGluZGV4dGVybT5zdGF0aWM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnN0YXRpYyBXZWIgcHJvamVjdHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPklmIHlvdSAgd2FudCB0byBjcmVhdGUgYSBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbiB0aGF0IGRvZXMgbm90IGNvbnRhaW4NCi1hbnkgZHluYW1pYyBjb250ZW50ICAoc3VjaCBhcyBzZXJ2bGV0cywgSlNQIGZpbGVzLCBmaWx0ZXJzLCBhbmQgYXNzb2NpYXRlZA0KLW1ldGFkYXRhKSB5b3UgbWlnaHQgcHJlZmVyIHRvIGNyZWF0ZSBhIHN0YXRpYyBXZWIgcHJvamVjdCwgYXMgb3Bwb3NlZCB0byBhIDx4cmVmDQotaHJlZj0iY2N3ZWJwcmouZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5keW5hbWljIFdlYiBwcm9qZWN0PC94cmVmPi48L3A+DQotPHA+U3RhdGljIFdlYiBwcm9qZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOiAgPHVsPg0KLTxsaT5hIFdlYiBjb250ZW50IGZvbGRlciAoY2FsbGVkIFdlYkNvbnRlbnQpIGZvciBhbGwgcHVibGlzaGFibGUgcmVzb3VyY2VzLA0KLVlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgZm9sZGVyIGZyb20gdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS48L2xpPg0KLTxsaT5hIFRoZW1lIGZvbGRlciwgdGhlIHN1Z2dlc3RlZCBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cw0KLWFuZCBvdGhlciBzdHlsZS1yZWxhdGVkIG9iamVjdHMuPC9saT4NCi08bGk+dGhlIGFiaWxpdHkgdG8gZGVmaW5lIGZvbGRlcnMgb3V0c2lkZSBvZiB0aGUgV2ViIGNvbnRlbnQgZm9sZGVyLCBmb3Igc3RvcmluZw0KLWludGVybWVkaWF0ZSBmaWxlcywgc3VjaCBhcyBNSUYgZmlsZXM8L2xpPg0KLTxsaT5hIGNvbnZlcnNpb24gcGF0aCBmcm9tIGEgc3RhdGljIFdlYiBwcm9qZWN0IHRvIGEgZHluYW1pYyBXZWIgcHJvamVjdC4NCi1JZiB5b3UgZGVjaWRlIHRvIDx4cmVmIGhyZWY9InR3cGNudnJ0LmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+Y29udmVydDwveHJlZj4gdGhlDQotcHJvamVjdCwgaXQgd2lsbCBiZSBhIGZ1bGx5LXZhbGlkIGR5bmFtaWMgV2ViIHByb2plY3QuIDwvbGk+DQotPC91bD48L3A+DQotPHA+SW4gYWRkaXRpb24sIHlvdXIgcHJvamVjdCB3aWxsIHN0aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyAod2hpY2gNCi1hcmUgY29tbW9uIHRvIGJvdGggc3RhdGljIGFuZCBkeW5hbWljIFdlYiBwcm9qZWN0cyApIDogPHVsPg0KLTxsaT5IVE1MIHN5bnRheCB2YWxpZGF0aW9uPC9saT4NCi08bGk+YSBicm9rZW4gbGluayBmaXgtdXAgd2l6YXJkPC9saT4NCi08bGk+YSBXZWIgc2l0ZSBuYXZpZ2F0aW9uIHRvb2w8L2xpPg0KLTxsaT5hIG5ldyBzZXJ2ZXIgdHlwZSwgdGhlIFN0YXRpYyBXZWIgc2VydmVyLCB3aGljaCBtYWtlcyBpdCBlYXN5IHRvIHB1Ymxpc2gNCi1zdGF0aWMgV2ViIHByb2plY3RzPC9saT4NCi08L3VsPiA8L3A+DQotPHA+VGhlIGZvbGRlciB0aGF0IGEgc3RhdGljIFdlYiBwcm9qZWN0IGlzIHB1Ymxpc2hlZCB0byBpcyBtb2RpZmlhYmxlLCBzbw0KLXRoYXQgd2hlbiB5b3Ugc2V0IHRoZSBwdWJsaXNoaW5nICJyb290IiB2YWx1ZSAoY2FsbGVkIGEgPGk+Y29udGV4dCByb290PC9pPiksDQotc3VjaCBhcyA8Y29kZXBoPi93ZWIxPC9jb2RlcGg+LCBmb3IgYSBzdGF0aWMgcHJvamVjdCwgZXZlcnl0aGluZyBpbiB0aGUgV2ViDQotY29udGVudCBmb2xkZXIgd2lsbCBiZSBwdWJsaXNoZWQgdG8gdGhlIDxmaWxlcGF0aD53ZWIxPC9maWxlcGF0aD4gZm9sZGVyIHVuZGVyDQotdGhlIFdlYiBzZXJ2ZXIncyBkb2Mgcm9vdC4gVGhpcyBlbmFibGVzIHlvdSB0byBncm91cCBXZWIgcmVzb3VyY2VzIG9uIGEgV2ViDQotc2VydmVyIGluIGZvbGRlcnMgdGhhdCBjb3JyZXNwb25kIHRvIFdlYiBwcm9qZWN0cyBpbiB0aGUgd29ya2JlbmNoLiBXaGVuIHByb2plY3RzDQotZGVmaW5lZCBpbiB0aGlzIHdheSBhcmUgcmVhZHkgZm9yIHByb2R1Y3Rpb24sIHlvdSBjYW4gcHVibGlzaCBzcGVjaWZpYyBwcm9qZWN0cw0KLWRpcmVjdGx5IHRvIHRoZSBkb2Mgcm9vdCBieSBjaGFuZ2luZyB0aGUgdmFsdWUgdG8gPGNvZGVwaD4vPC9jb2RlcGg+IGFuZCBhbGwNCi1wdWJsaXNoaW5nLCBsaW5rIGZpeGluZywgYW5kIGJyb3dzaW5nIHdpbGwgdXBkYXRlIGF1dG9tYXRpY2FsbHkuPC9wPg0KLTxwPkFsaWFzZXMgY2FuIGFsc28gYmUgdXNlZCB0byBzcGVjaWZ5IGEgY29udGV4dCByb290IHZhbHVlLiBGb3IgZXhhbXBsZSwNCi1zdXBwb3NlIHRoYXQgdGhlcmUgaXMgYW4gYWxpYXMgdGhhdCBpcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgV2ViIHNlcnZlciwgYXMNCi1mb2xsb3dzOiA8Y29kZWJsb2NrPkFsaWFzIC9zY3JpcHRzLyAiL3Zhci93d3cvc2NyaXB0cyI8L2NvZGVibG9jaz5JbiB0aGlzDQotZXhhbXBsZSwgaW4gd2hpY2ggdGhlIGN1cnJlbnQgc3RhdGljIFdlYiBwcm9qZWN0IHdpbGwgY29udGFpbiBjb21tb24gPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gZmlsZXMsDQoteW91IGNhbiBzZXQgdGhlIGNvbnRleHQgcm9vdCB2YWx1ZSB0byBiZSA8cGg+InNjcmlwdHMiPC9waD4uICBJbiBvcmRlciBmb3INCi10aGUgcmVzb3VyY2VzIGluIHRoZSBzdGF0aWMgV2ViIHByb2plY3QgdG8gYmUgcHVibGlzaGVkIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uDQotb24gdGhlIFdlYiBzZXJ2ZXIsIHlvdSBtdXN0IGFkZCB0aGlzIEFsaWFzIG1hcHBpbmcgdG8gdGhlIHNlcnZlciB0b29scyBpbnN0YW5jZQ0KLW9mIHRoZSBzdGF0aWMgV2ViIHNlcnZlciwgYXMgZm9sbG93cy4gIDxvbD4NCi08bGk+RnJvbSB0aGUgU2VydmVyIHZpZXcsIGRvdWJsZS1jbGljayBvbiB0aGUgc3RhdGljIFdlYiBzZXJ2ZXIgY29uZmlndXJhdGlvbg0KLXRvIG9wZW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGVkaXRvci48bm90ZT5UaGlzIGFzc3VtZXMgdGhhdCB5b3UndmUgYWxyZWFkeQ0KLWRlZmluZWQgdGhlIHN0YXRpYyBXZWIgc2VydmVyLjwvbm90ZT48L2xpPg0KLTxsaT5DbGljayB0aGUgPHVpY29udHJvbD5Db25maWd1cmF0aW9uPC91aWNvbnRyb2w+IGVkaXRvciB0YWIuPC9saT4NCi08bGk+U2Nyb2xsIGRvd24gdG8gdGhlIDx1aWNvbnRyb2w+QWxpYXMgUGF0aCBNYXBwaW5nPC91aWNvbnRyb2w+IHNlY3Rpb24sDQotYW5kIGFkZCB0aGUgbmV3IEFsaWFzIG1hcHBpbmcuPC9saT4NCi08L29sPk5vdyB0aGF0IDxwaD4ic2NyaXB0cyI8L3BoPiBpcyBkZWZpbmVkIGFzIGFuIEFsaWFzLCB0aGUgV2ViIGNvbnRlbnQgaW4NCi10aGUgc3RhdGljIFdlYiBwcm9qZWN0IHdpbGwgYmUgcHVibGlzaGVkIHRvIHRoZSBtYXBwZWQgcGF0aCwgPGZpbGVwYXRoPi92YXIvd3d3L3NjcmlwdHM8L2ZpbGVwYXRoPi48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2NzdGF0aWMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3N0YXRpYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGFlMzU1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3N0YXRpYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlN0YXRpYyBXZWIgcHJvamVjdHMiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIHN0YXRpYywgc3RhdGljIFdlYiBwcm9qZWN0cywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIHN0YXRpYywgc3RhdGljIFdlYiBwcm9qZWN0cywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3Jlc3RhLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2NzdGF0aWMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TdGF0aWMgV2ViIHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjY3N0YXRpYyI+PGEgbmFtZT0iY2NzdGF0aWMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlN0YXRpYyBXZWIgcHJvamVjdHM8L2gxPgotCi0KLTxkaXY+Ci08cD5JZiB5b3UgIHdhbnQgdG8gY3JlYXRlIGEgY29udGVudC1iYXNlZCBXZWIgYXBwbGljYXRpb24gdGhhdCBkb2VzIG5vdCBjb250YWluCi1hbnkgZHluYW1pYyBjb250ZW50ICAoc3VjaCBhcyBzZXJ2bGV0cywgSlNQIGZpbGVzLCBmaWx0ZXJzLCBhbmQgYXNzb2NpYXRlZAotbWV0YWRhdGEpIHlvdSBtaWdodCBwcmVmZXIgdG8gY3JlYXRlIGEgc3RhdGljIFdlYiBwcm9qZWN0LCBhcyBvcHBvc2VkIHRvIGEgPGEgaHJlZj0iY2N3ZWJwcmouaHRtbCIgdGl0bGU9IiI+ZHluYW1pYyBXZWIgcHJvamVjdDwvYT4uPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5TdGF0aWMgV2ViIHByb2plY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3M6ICA8dWw+Ci08bGk+YSBXZWIgY29udGVudCBmb2xkZXIgKGNhbGxlZCBXZWJDb250ZW50KSBmb3IgYWxsIHB1Ymxpc2hhYmxlIHJlc291cmNlcywKLVlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgZm9sZGVyIGZyb20gdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS48L2xpPgotCi08bGk+YSBUaGVtZSBmb2xkZXIsIHRoZSBzdWdnZXN0ZWQgZGlyZWN0b3J5IGZvciBzdG9yaW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHMKLWFuZCBvdGhlciBzdHlsZS1yZWxhdGVkIG9iamVjdHMuPC9saT4KLQotPGxpPnRoZSBhYmlsaXR5IHRvIGRlZmluZSBmb2xkZXJzIG91dHNpZGUgb2YgdGhlIFdlYiBjb250ZW50IGZvbGRlciwgZm9yIHN0b3JpbmcKLWludGVybWVkaWF0ZSBmaWxlcywgc3VjaCBhcyBNSUYgZmlsZXM8L2xpPgotCi08bGk+YSBjb252ZXJzaW9uIHBhdGggZnJvbSBhIHN0YXRpYyBXZWIgcHJvamVjdCB0byBhIGR5bmFtaWMgV2ViIHByb2plY3QuCi1JZiB5b3UgZGVjaWRlIHRvIDxhIGhyZWY9InR3cGNudnJ0Lmh0bWwiIHRpdGxlPSIiPmNvbnZlcnQ8L2E+IHRoZQotcHJvamVjdCwgaXQgd2lsbCBiZSBhIGZ1bGx5LXZhbGlkIGR5bmFtaWMgV2ViIHByb2plY3QuIDwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0icCI+SW4gYWRkaXRpb24sIHlvdXIgcHJvamVjdCB3aWxsIHN0aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyAod2hpY2gKLWFyZSBjb21tb24gdG8gYm90aCBzdGF0aWMgYW5kIGR5bmFtaWMgV2ViIHByb2plY3RzICkgOiA8dWw+Ci08bGk+SFRNTCBzeW50YXggdmFsaWRhdGlvbjwvbGk+Ci0KLTxsaT5hIGJyb2tlbiBsaW5rIGZpeC11cCB3aXphcmQ8L2xpPgotCi08bGk+YSBXZWIgc2l0ZSBuYXZpZ2F0aW9uIHRvb2w8L2xpPgotCi08bGk+YSBuZXcgc2VydmVyIHR5cGUsIHRoZSBTdGF0aWMgV2ViIHNlcnZlciwgd2hpY2ggbWFrZXMgaXQgZWFzeSB0byBwdWJsaXNoCi1zdGF0aWMgV2ViIHByb2plY3RzPC9saT4KLQotPC91bD4KLSA8L2Rpdj4KLQotPHA+VGhlIGZvbGRlciB0aGF0IGEgc3RhdGljIFdlYiBwcm9qZWN0IGlzIHB1Ymxpc2hlZCB0byBpcyBtb2RpZmlhYmxlLCBzbwotdGhhdCB3aGVuIHlvdSBzZXQgdGhlIHB1Ymxpc2hpbmcgInJvb3QiIHZhbHVlIChjYWxsZWQgYSA8ZW0+Y29udGV4dCByb290PC9lbT4pLAotc3VjaCBhcyA8c2FtcCBjbGFzcz0iY29kZXBoIj4vd2ViMTwvc2FtcD4sIGZvciBhIHN0YXRpYyBwcm9qZWN0LCBldmVyeXRoaW5nIGluIHRoZSBXZWIKLWNvbnRlbnQgZm9sZGVyIHdpbGwgYmUgcHVibGlzaGVkIHRvIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYjE8L3NwYW4+IGZvbGRlciB1bmRlcgotdGhlIFdlYiBzZXJ2ZXIncyBkb2Mgcm9vdC4gVGhpcyBlbmFibGVzIHlvdSB0byBncm91cCBXZWIgcmVzb3VyY2VzIG9uIGEgV2ViCi1zZXJ2ZXIgaW4gZm9sZGVycyB0aGF0IGNvcnJlc3BvbmQgdG8gV2ViIHByb2plY3RzIGluIHRoZSB3b3JrYmVuY2guIFdoZW4gcHJvamVjdHMKLWRlZmluZWQgaW4gdGhpcyB3YXkgYXJlIHJlYWR5IGZvciBwcm9kdWN0aW9uLCB5b3UgY2FuIHB1Ymxpc2ggc3BlY2lmaWMgcHJvamVjdHMKLWRpcmVjdGx5IHRvIHRoZSBkb2Mgcm9vdCBieSBjaGFuZ2luZyB0aGUgdmFsdWUgdG8gPHNhbXAgY2xhc3M9ImNvZGVwaCI+Lzwvc2FtcD4gYW5kIGFsbAotcHVibGlzaGluZywgbGluayBmaXhpbmcsIGFuZCBicm93c2luZyB3aWxsIHVwZGF0ZSBhdXRvbWF0aWNhbGx5LjwvcD4KLQotPGRpdiBjbGFzcz0icCI+QWxpYXNlcyBjYW4gYWxzbyBiZSB1c2VkIHRvIHNwZWNpZnkgYSBjb250ZXh0IHJvb3QgdmFsdWUuIEZvciBleGFtcGxlLAotc3VwcG9zZSB0aGF0IHRoZXJlIGlzIGFuIGFsaWFzIHRoYXQgaXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IFdlYiBzZXJ2ZXIsIGFzCi1mb2xsb3dzOiA8cHJlPkFsaWFzIC9zY3JpcHRzLyAiL3Zhci93d3cvc2NyaXB0cyI8L3ByZT4KLUluIHRoaXMKLWV4YW1wbGUsIGluIHdoaWNoIHRoZSBjdXJyZW50IHN0YXRpYyBXZWIgcHJvamVjdCB3aWxsIGNvbnRhaW4gY29tbW9uIEphdmFTY3JpcHTihKIgZmlsZXMsCi15b3UgY2FuIHNldCB0aGUgY29udGV4dCByb290IHZhbHVlIHRvIGJlIDxzcGFuPiJzY3JpcHRzIjwvc3Bhbj4uICBJbiBvcmRlciBmb3IKLXRoZSByZXNvdXJjZXMgaW4gdGhlIHN0YXRpYyBXZWIgcHJvamVjdCB0byBiZSBwdWJsaXNoZWQgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24KLW9uIHRoZSBXZWIgc2VydmVyLCB5b3UgbXVzdCBhZGQgdGhpcyBBbGlhcyBtYXBwaW5nIHRvIHRoZSBzZXJ2ZXIgdG9vbHMgaW5zdGFuY2UKLW9mIHRoZSBzdGF0aWMgV2ViIHNlcnZlciwgYXMgZm9sbG93cy4gIDxvbD4KLTxsaT5Gcm9tIHRoZSBTZXJ2ZXIgdmlldywgZG91YmxlLWNsaWNrIG9uIHRoZSBzdGF0aWMgV2ViIHNlcnZlciBjb25maWd1cmF0aW9uCi10byBvcGVuIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBlZGl0b3IuPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoaXMgYXNzdW1lcyB0aGF0IHlvdSd2ZSBhbHJlYWR5Ci1kZWZpbmVkIHRoZSBzdGF0aWMgV2ViIHNlcnZlci48L2Rpdj4KLTwvbGk+Ci0KLTxsaT5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29uZmlndXJhdGlvbjwvc3Bhbj4gZWRpdG9yIHRhYi48L2xpPgotCi08bGk+U2Nyb2xsIGRvd24gdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFsaWFzIFBhdGggTWFwcGluZzwvc3Bhbj4gc2VjdGlvbiwKLWFuZCBhZGQgdGhlIG5ldyBBbGlhcyBtYXBwaW5nLjwvbGk+Ci0KLTwvb2w+Ci1Ob3cgdGhhdCA8c3Bhbj4ic2NyaXB0cyI8L3NwYW4+IGlzIGRlZmluZWQgYXMgYW4gQWxpYXMsIHRoZSBXZWIgY29udGVudCBpbgotdGhlIHN0YXRpYyBXZWIgcHJvamVjdCB3aWxsIGJlIHB1Ymxpc2hlZCB0byB0aGUgbWFwcGVkIHBhdGgsIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+L3Zhci93d3cvc2NyaXB0czwvc3Bhbj4uPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbCIgdGl0bGU9IiI+V2ViIHJlc291cmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiIHRpdGxlPSIiPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXN0YS5odG1sIj5DcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJwcmouZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTVhYzVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2N3ZWJwcmoiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmVudGVycHJpc2UgYXBwbGljYXRpb25zPGluZGV4dGVybT5wcm9qZWN0czxpbmRleHRlcm0+ZHluYW1pYw0KLVdlYiBwcm9qZWN0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+V2ViIHByb2plY3RzPGluZGV4dGVybT5keW5hbWljDQotcHJvamVjdHMgb3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiBXZWIgcHJvamVjdHM6IGR5bmFtaWMgYW5kIDx4cmVmIGhyZWY9ImNjc3RhdGljLmRpdGEiDQotc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5zdGF0aWM8L3hyZWY+LiBEeW5hbWljIHdlYiBwcm9qZWN0cyBjYW4gY29udGFpbg0KLWR5bmFtaWMgSmF2YSBFRSByZXNvdXJjZXMgc3VjaCBhcyBzZXJ2bGV0cywgSlNQIGZpbGVzLCBmaWx0ZXJzLCBhbmQgYXNzb2NpYXRlZA0KLW1ldGFkYXRhLCBpbiBhZGRpdGlvbiB0byBzdGF0aWMgcmVzb3VyY2VzIHN1Y2ggYXMgaW1hZ2VzIGFuZCBIVE1MIGZpbGVzLiBTdGF0aWMNCi13ZWIgcHJvamVjdHMgb25seSBjb250YWlucyBzdGF0aWMgcmVzb3VyY2VzLiBXaGVuIHlvdSBjcmVhdGUgV2ViIHByb2plY3RzLA0KLXlvdSBjYW4gaW5jbHVkZSBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGFuZCBKU1AgdGFnIGxpYnJhcmllcyAoZm9yIGR5bmFtaWMNCi1XZWIgcHJvamVjdHMpLCBzbyB0aGF0IHlvdSBjYW4gYmVnaW4gZGV2ZWxvcG1lbnQgd2l0aCBhIHJpY2hlciBzZXQgb2YgcHJvamVjdA0KLXJlc291cmNlcy48L3A+DQotPHA+RHluYW1pYyBXZWIgcHJvamVjdHMgYXJlIGFsd2F5cyBlbWJlZGRlZCBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3RzLg0KLVRoZSB3aXphcmQgdGhhdCB5b3UgdXNlIHRvIGNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3Qgd2lsbCBhbHNvIGNyZWF0ZSBhbg0KLUVudGVycHJpc2UgQXBwbGljYXRpb24gKEVBUikgcHJvamVjdCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBUaGUgd2l6YXJkDQotd2lsbCBhbHNvIHVwZGF0ZSB0aGUgPGZpbGVwYXRoPmFwcGxpY2F0aW9uLnhtbDwvZmlsZXBhdGg+IGRlcGxveW1lbnQgZGVzY3JpcHRvcg0KLW9mIHRoZSBzcGVjaWZpZWQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHRvIGRlZmluZSB0aGUgV2ViIHByb2plY3QNCi1hcyBhIG1vZHVsZSBlbGVtZW50LiBJZiB5b3UgYXJlIGltcG9ydGluZyBhIFdBUiBmaWxlIHJhdGhlciB0aGFuIGNyZWF0aW5nDQotYSBkeW5hbWljIFdlYiBwcm9qZWN0IG5ldywgdGhlIFdBUiBJbXBvcnQgd2l6YXJkIHJlcXVpcmVzIHRoYXQgeW91IHNwZWNpZnkNCi1hIFdlYiBwcm9qZWN0LCB3aGljaCBhbHJlYWR5IHJlcXVpcmVzIGFuIEVBUiBwcm9qZWN0LiA8L3A+DQotPHA+SmF2YSBFRSBjb252ZW50aW9ucyBtYXkgcmVwcmVzZW50IGV4dHJhIG92ZXJoZWFkIGlmIHlvdSBvbmx5IHdhbnQgdG8gY3JlYXRlDQotYSBzdGF0aWMsIGNvbnRlbnQtYmFzZWQgV2ViIGFwcGxpY2F0aW9uLCB3aGljaCBjb250YWlucyBubyBkeW5hbWljIGZpbGVzLA0KLXN1Y2ggYXMgSlNQIGZpbGVzIG9yIHNlcnZsZXRzLiBJbiB0aGlzIGNhc2UsIHdoZW4geW91IG5lZWQgb25seSB0aGUgbW9zdCBiYXNpYw0KLVdlYiBwcm9qZWN0LCB5b3UgbWlnaHQgd2FudCB0byB1c2UgdGhlIDxpPnN0YXRpYzwvaT4gV2ViIHByb2plY3QgdHlwZSAoc2VlIDx4cmVmDQotaHJlZj0iY2NzdGF0aWMuZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5TdGF0aWMgV2ViIHByb2plY3RzPC94cmVmPikuDQotIE5vdGUgdGhhdCBzdGF0aWMgV2ViIHByb2plY3RzIGNhbiAgYmUgY29udmVydGVkIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIGJ5DQotc2VsZWN0aW5nIDxiPkNvbnZlcnQgdG8gYSBEeW5hbWljIFdlYiBQcm9qZWN0PC9iPiwgZnJvbSB0aGUgUHJvamVjdCBtZW51LjwvcD4NCi08cD5UaGUgSmF2YSBFRSBtb2RlbCwgYW5kIG1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0DQotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LCBkZWZpbmVzIGEgV2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGhhdA0KLXNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgV2ViIGNvbnRlbnQgZmlsZXMsIGNsYXNzIGZpbGVzLCBjbGFzcyBwYXRocywgZGVwbG95bWVudA0KLWRlc2NyaXB0b3JzLCBhbmQgc3VwcG9ydGluZyBtZXRhZGF0YS4gVGhlIFdlYiBwcm9qZWN0IGhpZXJhcmNoeSBtaXJyb3JzIHRoYXQNCi1vZiB0aGUgV2ViIGFwcGxpY2F0aW9uIGNyZWF0ZWQgZnJvbSBhIHByb2plY3QuIEluIHRoZSB3b3JrYmVuY2gsIHlvdSBjYW4gdXNlDQotdGhlIDxwaD5OZXcgV2ViIFByb2plY3Q8L3BoPiB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IFdlYiBwcm9qZWN0LjwvcD4NCi08cD5UaGUgbWFpbiBwcm9qZWN0IGZvbGRlciBjb250YWlucyBhbGwgZGV2ZWxvcG1lbnQgb2JqZWN0cyByZWxhdGVkIHRvIGEgV2ViDQotYXBwbGljYXRpb24uIFRoZSBXZWIgY29udGVudCBmb2xkZXIgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBwcm9qZWN0IG5lY2Vzc2FyeQ0KLXRvIGNyZWF0ZSBhIFdlYiBhcHBsaWNhdGlvbi4gVGhpcyBmb2xkZXIgc3RydWN0dXJlIG1hcHMgdG8gdGhlIFdlYiBhcHBsaWNhdGlvbg0KLWFyY2hpdmUgKFdBUikgc3RydWN0dXJlIGRlZmluZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcy4uIFRoZSBmb2xsb3dpbmcgZGVmYXVsdA0KLWVsZW1lbnRzIGFyZSBsb2NhdGVkIGluIHRoZSBXZWIgcHJvamVjdCBmb2xkZXIgaGllcmFyY2h5OiA8bm90ZT5JbiB0aGUgUHJvamVjdA0KLUV4cGxvcmVyIHZpZXcsIFdlYiBwcm9qZWN0cyBhcmUgZmlsdGVyZWQgaW50byBmb2xkZXIgbm9kZXMgdG8gY3VzdG9taXplIHRoZQ0KLWRpc3BsYXkgb2YgV2ViIHJlc291cmNlcyBmb3IgZWFzeSBtYW5hZ2VtZW50IGR1cmluZyBkZXZlbG9wbWVudC4gRm9yIGluZm9ybWF0aW9uDQotb24gdGhlIGZpbHRlcmVkIHN0cnVjdHVyZSwgc2VlIDx4cmVmIGhyZWY9ImNjd2VidncuZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5Qcm9qZWN0DQotRXhwbG9yZXIgdmlldzwveHJlZj4uPC9ub3RlPjxkbD48ZGxlbnRyeT4NCi08ZHQ+V2ViIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZHQ+DQotPGRkPlRoZSBzdGFuZGFyZCBXZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICh0aGUgPGZpbGVwYXRoPndlYi54bWw8L2ZpbGVwYXRoPiBmaWxlKS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SmF2YVNvdXJjZTwvZHQ+DQotPGRkPkNvbnRhaW5zIHRoZSBwcm9qZWN0J3MgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc291cmNlIGNvZGUgZm9yIGNsYXNzZXMsIGJlYW5zLCBhbmQNCi1zZXJ2bGV0cy4gV2hlbiB0aGVzZSByZXNvdXJjZXMgYXJlIGFkZGVkIHRvIGEgV2ViIHByb2plY3QsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkNCi1jb21waWxlZCBhbmQgdGhlIGdlbmVyYXRlZCBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIFdFQi1JTkYvY2xhc3NlcyBkaXJlY3RvcnkuDQotVGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBub3QgcGFja2FnZWQgaW4gV0FSIGZpbGVzIHVubGVzcw0KLWFuIG9wdGlvbiBpcyBzcGVjaWZpZWQgd2hlbiBhIFdBUiBmaWxlIGlzIGNyZWF0ZWQuIDxub3RlPlRob3VnaCB0aGUgZGVmYXVsdA0KLW5hbWUgZ2l2ZW4gdG8gdGhlIGZvbGRlciBpcyBKYXZhU291cmNlcywgeW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUgYnkgcmlnaHQNCi1jbGlja2luZyBvbiB0aGUgbmFtZSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciBhbmQgY2xpY2tpbmcgb24gPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+UmVmYWN0b3I8L3VpY29udHJvbD48dWljb250cm9sPlJlbmFtZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+Ljwvbm90ZT48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+aW1wb3J0ZWRfY2xhc3NlcyBmb2xkZXI8L2R0Pg0KLTxkZD5UaGlzIGZvbGRlciBtYXkgYmUgY3JlYXRlZCBkdXJpbmcgYSBXQVIgaW1wb3J0LCBhbmQgY29udGFpbnMgY2xhc3MgZmlsZXMNCi10aGF0IGRvIG5vdCBoYXZlIGFjY29tcGFueWluZyBzb3VyY2UuICBUaGUgPHVpY29udHJvbD5pbXBvcnRlZF9jbGFzc2VzPC91aWNvbnRyb2w+IGZvbGRlcg0KLWlzIGEgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsYXNzZXMNCi1mb2xkZXI7IDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNsYXNzZXMgZm9sZGVycyBjYW4gYWxzbyBiZSBjcmVhdGVkIHVzaW5nIHRoZSBXZWINCi1wcm9qZWN0IDx1aWNvbnRyb2w+SmF2YSBCdWlsZCBQYXRoPC91aWNvbnRyb2w+IHByb3BlcnRpZXMgcGFnZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+V2ViQ29udGVudCBmb2xkZXI8L2R0Pg0KLTxkZD5UaGUgbWFuZGF0b3J5IGxvY2F0aW9uIG9mIGFsbCBXZWIgcmVzb3VyY2VzLCBpbmNsdWRpbmcgSFRNTCwgSlNQLCBncmFwaGljDQotZmlsZXMsIGFuZCBzbyBvbi4gSWYgdGhlIGZpbGVzIGFyZSBub3QgcGxhY2VkIGluIHRoaXMgZGlyZWN0b3J5IChvciBpbiBhIHN1YmRpcmVjdG9yeQ0KLXN0cnVjdHVyZSB1bmRlciB0aGlzIGRpcmVjdG9yeSksIHRoZSBmaWxlcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUgd2hlbiB0aGUNCi1hcHBsaWNhdGlvbiBpcyBleGVjdXRlZCBvbiBhIHNlcnZlci4gVGhlIFdlYiBjb250ZW50IGZvbGRlciByZXByZXNlbnRzIHRoZQ0KLWNvbnRlbnRzIG9mIHRoZSBXQVIgZmlsZSB0aGF0IHdpbGwgYmUgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gQW55IGZpbGVzIG5vdA0KLXVuZGVyIHRoZSBXZWIgY29udGVudCBmb2xkZXIgYXJlIGNvbnNpZGVyZWQgZGV2ZWxvcG1lbnQtdGltZSByZXNvdXJjZXMgKGZvcg0KLWV4YW1wbGUsIC5qYXZhIGZpbGVzLCAuc3FsIGZpbGVzLCBhbmQgLm1pZiBmaWxlcyksIGFuZCBhcmUgbm90IGRlcGxveWVkIHdoZW4NCi10aGUgcHJvamVjdCBpcyB1bml0IHRlc3RlZCBvciBwdWJsaXNoZWQuIDxub3RlPlRob3VnaCB0aGUgZGVmYXVsdCBuYW1lIGdpdmVuDQotdG8gdGhlIGZvbGRlciBpcyA8ZmlsZXBhdGg+V2ViQ29udGVudDwvZmlsZXBhdGg+LCB5b3UgY2FuIGNoYW5nZSB0aGUgbmFtZQ0KLSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciBieSByaWdodC1jbGlja2luZyB0aGUgZm9sZGVyIGFuZCBzZWxlY3RpbmcgPHVpY29udHJvbD5SZWZhY3RvcjwvdWljb250cm9sPjx1aWNvbnRyb2w+UmVuYW1lPC91aWNvbnRyb2w+IG9yDQotZnJvbSB0aGUgV2ViIHBhZ2Ugb2YgdGhlIHByb2plY3QncyBQcm9wZXJ0aWVzIGRpYWxvZy4gSW4gYSBkeW5hbWljIFdlYiBwcm9qZWN0LA0KLWNoYW5naW5nIHRoZSBmb2xkZXIgbmFtZSB3aWxsIHVwZGF0ZSB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQgb3V0cHV0IGRpcmVjdG9yeS4gPC9ub3RlPjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5NRVRBLUlORjwvZHQ+DQotPGRkPlRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSA8ZmlsZXBhdGg+TUFOSUZFU1QuTUY8L2ZpbGVwYXRoPiBmaWxlLCB3aGljaA0KLWlzIHVzZWQgdG8gbWFwIGNsYXNzIHBhdGhzIGZvciBkZXBlbmRlbnQgSkFSIGZpbGVzIHRoYXQgZXhpc3QgaW4gb3RoZXIgcHJvamVjdHMNCi1pbiB0aGUgc2FtZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuIEFuIGVudHJ5IGluIHRoaXMgZmlsZSB3aWxsIHVwZGF0ZQ0KLXRoZSBydW4tdGltZSBwcm9qZWN0IGNsYXNzIHBhdGggYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkIHNldHRpbmdzIHRvIGluY2x1ZGUgdGhlIHJlZmVyZW5jZWQNCi1KQVIgZmlsZXMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PnRoZW1lPC9kdD4NCi08ZGQ+VGhlIHN1Z2dlc3RlZCBkaXJlY3RvcnkgZm9yIGNhc2NhZGluZyBzdHlsZSBzaGVldHMgYW5kIG90aGVyIHN0eWxlLXJlbGF0ZWQNCi1vYmplY3RzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5XRUItSU5GPC9kdD4NCi08ZGQ+QmFzZWQgb24gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldCAyLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4sIHRoaXMNCi1kaXJlY3RvcnkgY29udGFpbnMgdGhlIHN1cHBvcnRpbmcgV2ViIHJlc291cmNlcyBmb3IgYSBXZWIgYXBwbGljYXRpb24sIGluY2x1ZGluZw0KLXRoZSA8ZmlsZXBhdGg+d2ViLnhtbDwvZmlsZXBhdGg+IGZpbGUgYW5kIHRoZSBjbGFzc2VzIGFuZCBsaWIgZGlyZWN0b3JpZXMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pi9jbGFzc2VzPC9kdD4NCi08ZGQ+VGhpcyBkaXJlY3RvcnkgaXMgZm9yIHNlcnZsZXRzLCB1dGlsaXR5IGNsYXNzZXMsIGFuZCB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29tcGlsZXINCi1vdXRwdXQgZGlyZWN0b3J5LiBUaGUgY2xhc3NlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24NCi1jbGFzcyBsb2FkZXIgdG8gbG9hZCB0aGUgY2xhc3Nlcy4gRm9sZGVycyBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIG1hcCBwYWNrYWdlDQotYW5kIGNsYXNzIG5hbWVzLCBhcyBpbjogPGNvZGVwaD4vV0VCLUlORi9jbGFzc2VzL2NvbS9teWNvcnAvc2VydmxldHMvTXlTZXJ2bGV0LmNsYXNzPC9jb2RlcGg+LjxwPkRvDQotbm90IHBsYWNlIGFueSAuY2xhc3MgZmlsZXMgZGlyZWN0bHkgaW50byB0aGlzIGRpcmVjdG9yeS4gVGhlIC5jbGFzcyBmaWxlcw0KLWFyZSBwbGFjZWQgaW4gdGhpcyBkaXJlY3RvcnkgYXV0b21hdGljYWxseSB3aGVuIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjb21waWxlcg0KLWNvbXBpbGVzIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNvdXJjZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgPGZpbGVwYXRoPkphdmEgUmVzb3VyY2VzPC9maWxlcGF0aD4gZGlyZWN0b3J5Lg0KLUFueSBmaWxlcyBwbGFjZWQgZGlyZWN0bHkgaW4gdGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjb21waWxlcg0KLXdoZW4gaXQgcnVucy48L3A+PC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pi9saWI8L2R0Pg0KLTxkZD5UaGUgc3VwcG9ydGluZyBKQVIgZmlsZXMgdGhhdCB5b3VyIFdlYiBhcHBsaWNhdGlvbiByZWZlcmVuY2VzLiBBbnkgY2xhc3Nlcw0KLWluIC5qYXIgZmlsZXMgcGxhY2VkIGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYXZhaWxhYmxlIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5MaWJyYXJpZXM8L2R0Pg0KLTxkZD5UaGUgc3VwcG9ydGluZyBKQVIgZmlsZXMgdGhhdCB5b3VyIFdlYiBhcHBsaWNhdGlvbiByZWZlcmVuY2VzLiBUaGlzIGZvbGRlcg0KLW1pcnJvcnMgdGhlIGNvbnRlbnQgb2YgdGhlIGxpYiBmb2xkZXIuIEluIGFkZGl0aW9uLCBXZWIgTGlicmFyeSBQcm9qZWN0cywNCi13aGljaCBhcmUgInZpcnR1YWwiIEpBUiBmaWxlcyB0aGF0IGRvIG5vdCBwaHlzaWNhbGx5IHJlc2lkZSBpbiB0aGUgV2ViIHByb2plY3QsDQotYnV0IGFyZSBhc3NvY2lhdGVkIHdpdGggPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvamVjdHMgZWxzZXdoZXJlIGluIHlvdXIgd29ya3NwYWNlLA0KLWFyZSBpbmNsdWRlZCBpbiB0aGlzIGZvbGRlci4gVGhleSBhcmUgcGFja2FnZWQgd2l0aCB5b3VyIHByb2plY3Qgd2hlbiB5b3UNCi1leHBvcnQgdGhlIGFwcGxpY2F0aW9uJ3MgV0FSIGZpbGUuPC9kZD4NCi08L2RsZW50cnk+PC9kbD4gPG5vdGU+QSBsaWJyYXJ5IGVudHJ5IG9uIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBwYXRoIHdpbGwgcmVtYWluIHRoZXJlIHVubGVzcw0KLXRoZSBhY3R1YWwgSkFSIGZpbGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIuIElmIHlvdSByZW1vdmUNCi1hIGxpYnJhcnkgcGF0aCBlbnRyeSBidXQgbm90IHRoZSBKQVIgZmlsZSwgdGhlIGxpYnJhcnkgZW50cnkgd2lsbCBiZSByZS1hZGRlZA0KLXRvIHRoZSBwYXRoIGF1dG9tYXRpY2FsbHkuPC9ub3RlPjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VicHJqLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGU1YzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VicHJqLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVudGVycHJpc2UgYXBwbGljYXRpb25zLCBwcm9qZWN0cywgZHluYW1pYyBXZWIgcHJvamVjdHMsIFdlYiBwcm9qZWN0cywgZHluYW1pYyBwcm9qZWN0cyBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVudGVycHJpc2UgYXBwbGljYXRpb25zLCBwcm9qZWN0cywgZHluYW1pYyBXZWIgcHJvamVjdHMsIFdlYiBwcm9qZWN0cywgZHluYW1pYyBwcm9qZWN0cyBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2N3ZWJwcmoiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjY3dlYnByaiI+PGEgbmFtZT0iY2N3ZWJwcmoiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnM8L2gxPgotCi0KLTxkaXY+Ci08cD5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIFdlYiBwcm9qZWN0czogZHluYW1pYyBhbmQgPGEgaHJlZj0iY2NzdGF0aWMuaHRtbCIgdGl0bGU9IiI+c3RhdGljPC9hPi4gRHluYW1pYyB3ZWIgcHJvamVjdHMgY2FuIGNvbnRhaW4KLWR5bmFtaWMgSmF2YSBFRSByZXNvdXJjZXMgc3VjaCBhcyBzZXJ2bGV0cywgSlNQIGZpbGVzLCBmaWx0ZXJzLCBhbmQgYXNzb2NpYXRlZAotbWV0YWRhdGEsIGluIGFkZGl0aW9uIHRvIHN0YXRpYyByZXNvdXJjZXMgc3VjaCBhcyBpbWFnZXMgYW5kIEhUTUwgZmlsZXMuIFN0YXRpYwotd2ViIHByb2plY3RzIG9ubHkgY29udGFpbnMgc3RhdGljIHJlc291cmNlcy4gV2hlbiB5b3UgY3JlYXRlIFdlYiBwcm9qZWN0cywKLXlvdSBjYW4gaW5jbHVkZSBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGFuZCBKU1AgdGFnIGxpYnJhcmllcyAoZm9yIGR5bmFtaWMKLVdlYiBwcm9qZWN0cyksIHNvIHRoYXQgeW91IGNhbiBiZWdpbiBkZXZlbG9wbWVudCB3aXRoIGEgcmljaGVyIHNldCBvZiBwcm9qZWN0Ci1yZXNvdXJjZXMuPC9wPgotCi08cD5EeW5hbWljIFdlYiBwcm9qZWN0cyBhcmUgYWx3YXlzIGVtYmVkZGVkIGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdHMuCi1UaGUgd2l6YXJkIHRoYXQgeW91IHVzZSB0byBjcmVhdGUgYSBkeW5hbWljIFdlYiBwcm9qZWN0IHdpbGwgYWxzbyBjcmVhdGUgYW4KLUVudGVycHJpc2UgQXBwbGljYXRpb24gKEVBUikgcHJvamVjdCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBUaGUgd2l6YXJkCi13aWxsIGFsc28gdXBkYXRlIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPmFwcGxpY2F0aW9uLnhtbDwvc3Bhbj4gZGVwbG95bWVudCBkZXNjcmlwdG9yCi1vZiB0aGUgc3BlY2lmaWVkIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB0byBkZWZpbmUgdGhlIFdlYiBwcm9qZWN0Ci1hcyBhIG1vZHVsZSBlbGVtZW50LiBJZiB5b3UgYXJlIGltcG9ydGluZyBhIFdBUiBmaWxlIHJhdGhlciB0aGFuIGNyZWF0aW5nCi1hIGR5bmFtaWMgV2ViIHByb2plY3QgbmV3LCB0aGUgV0FSIEltcG9ydCB3aXphcmQgcmVxdWlyZXMgdGhhdCB5b3Ugc3BlY2lmeQotYSBXZWIgcHJvamVjdCwgd2hpY2ggYWxyZWFkeSByZXF1aXJlcyBhbiBFQVIgcHJvamVjdC4gPC9wPgotCi08cD5KYXZhIEVFIGNvbnZlbnRpb25zIG1heSByZXByZXNlbnQgZXh0cmEgb3ZlcmhlYWQgaWYgeW91IG9ubHkgd2FudCB0byBjcmVhdGUKLWEgc3RhdGljLCBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbiwgd2hpY2ggY29udGFpbnMgbm8gZHluYW1pYyBmaWxlcywKLXN1Y2ggYXMgSlNQIGZpbGVzIG9yIHNlcnZsZXRzLiBJbiB0aGlzIGNhc2UsIHdoZW4geW91IG5lZWQgb25seSB0aGUgbW9zdCBiYXNpYwotV2ViIHByb2plY3QsIHlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGUgPGVtPnN0YXRpYzwvZW0+IFdlYiBwcm9qZWN0IHR5cGUgKHNlZSA8YSBocmVmPSJjY3N0YXRpYy5odG1sIiB0aXRsZT0iIj5TdGF0aWMgV2ViIHByb2plY3RzPC9hPikuCi0gTm90ZSB0aGF0IHN0YXRpYyBXZWIgcHJvamVjdHMgY2FuICBiZSBjb252ZXJ0ZWQgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMgYnkKLXNlbGVjdGluZyA8c3Ryb25nPkNvbnZlcnQgdG8gYSBEeW5hbWljIFdlYiBQcm9qZWN0PC9zdHJvbmc+LCBmcm9tIHRoZSBQcm9qZWN0IG1lbnUuPC9wPgotCi08cD5UaGUgSmF2YSBFRSBtb2RlbCwgYW5kIG1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZh4oSiIFNlcnZsZXQKLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiwgZGVmaW5lcyBhIFdlYiBhcHBsaWNhdGlvbiBkaXJlY3Rvcnkgc3RydWN0dXJlIHRoYXQKLXNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgV2ViIGNvbnRlbnQgZmlsZXMsIGNsYXNzIGZpbGVzLCBjbGFzcyBwYXRocywgZGVwbG95bWVudAotZGVzY3JpcHRvcnMsIGFuZCBzdXBwb3J0aW5nIG1ldGFkYXRhLiBUaGUgV2ViIHByb2plY3QgaGllcmFyY2h5IG1pcnJvcnMgdGhhdAotb2YgdGhlIFdlYiBhcHBsaWNhdGlvbiBjcmVhdGVkIGZyb20gYSBwcm9qZWN0LiBJbiB0aGUgd29ya2JlbmNoLCB5b3UgY2FuIHVzZQotdGhlIDxzcGFuPk5ldyBXZWIgUHJvamVjdDwvc3Bhbj4gd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBXZWIgcHJvamVjdC48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPlRoZSBtYWluIHByb2plY3QgZm9sZGVyIGNvbnRhaW5zIGFsbCBkZXZlbG9wbWVudCBvYmplY3RzIHJlbGF0ZWQgdG8gYSBXZWIKLWFwcGxpY2F0aW9uLiBUaGUgV2ViIGNvbnRlbnQgZm9sZGVyIGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiB0aGUgcHJvamVjdCBuZWNlc3NhcnkKLXRvIGNyZWF0ZSBhIFdlYiBhcHBsaWNhdGlvbi4gVGhpcyBmb2xkZXIgc3RydWN0dXJlIG1hcHMgdG8gdGhlIFdlYiBhcHBsaWNhdGlvbgotYXJjaGl2ZSAoV0FSKSBzdHJ1Y3R1cmUgZGVmaW5lZCBieSBTdW4gTWljcm9zeXN0ZW1zLi4gVGhlIGZvbGxvd2luZyBkZWZhdWx0Ci1lbGVtZW50cyBhcmUgbG9jYXRlZCBpbiB0aGUgV2ViIHByb2plY3QgZm9sZGVyIGhpZXJhcmNoeTogPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEluIHRoZSBQcm9qZWN0Ci1FeHBsb3JlciB2aWV3LCBXZWIgcHJvamVjdHMgYXJlIGZpbHRlcmVkIGludG8gZm9sZGVyIG5vZGVzIHRvIGN1c3RvbWl6ZSB0aGUKLWRpc3BsYXkgb2YgV2ViIHJlc291cmNlcyBmb3IgZWFzeSBtYW5hZ2VtZW50IGR1cmluZyBkZXZlbG9wbWVudC4gRm9yIGluZm9ybWF0aW9uCi1vbiB0aGUgZmlsdGVyZWQgc3RydWN0dXJlLCBzZWUgPGEgaHJlZj0iY2N3ZWJ2dy5odG1sIiB0aXRsZT0iIj5Qcm9qZWN0IEV4cGxvcmVyIHZpZXc8L2E+LjwvZGl2PgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPldlYiBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2R0PgotCi08ZGQ+VGhlIHN0YW5kYXJkIFdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYi54bWw8L3NwYW4+IGZpbGUpLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkphdmFTb3VyY2U8L2R0PgotCi08ZGQ+Q29udGFpbnMgdGhlIHByb2plY3QncyBKYXZhIHNvdXJjZSBjb2RlIGZvciBjbGFzc2VzLCBiZWFucywgYW5kCi1zZXJ2bGV0cy4gV2hlbiB0aGVzZSByZXNvdXJjZXMgYXJlIGFkZGVkIHRvIGEgV2ViIHByb2plY3QsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkKLWNvbXBpbGVkIGFuZCB0aGUgZ2VuZXJhdGVkIGZpbGVzIGFyZSBhZGRlZCB0byB0aGUgV0VCLUlORi9jbGFzc2VzIGRpcmVjdG9yeS4KLVRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgbm90IHBhY2thZ2VkIGluIFdBUiBmaWxlcyB1bmxlc3MKLWFuIG9wdGlvbiBpcyBzcGVjaWZpZWQgd2hlbiBhIFdBUiBmaWxlIGlzIGNyZWF0ZWQuIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaG91Z2ggdGhlIGRlZmF1bHQKLW5hbWUgZ2l2ZW4gdG8gdGhlIGZvbGRlciBpcyBKYXZhU291cmNlcywgeW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUgYnkgcmlnaHQKLWNsaWNraW5nIG9uIHRoZSBuYW1lIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCBjbGlja2luZyBvbiA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmYWN0b3I8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVuYW1lPC9zcGFuPjwvc3Bhbj4uPC9kaXY+Ci08L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5pbXBvcnRlZF9jbGFzc2VzIGZvbGRlcjwvZHQ+Ci0KLTxkZD5UaGlzIGZvbGRlciBtYXkgYmUgY3JlYXRlZCBkdXJpbmcgYSBXQVIgaW1wb3J0LCBhbmQgY29udGFpbnMgY2xhc3MgZmlsZXMKLXRoYXQgZG8gbm90IGhhdmUgYWNjb21wYW55aW5nIHNvdXJjZS4gIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5pbXBvcnRlZF9jbGFzc2VzPC9zcGFuPiBmb2xkZXIKLWlzIGEgSmF2YSBjbGFzc2VzCi1mb2xkZXI7IEphdmEgY2xhc3NlcyBmb2xkZXJzIGNhbiBhbHNvIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIFdlYgotcHJvamVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhIEJ1aWxkIFBhdGg8L3NwYW4+IHByb3BlcnRpZXMgcGFnZS48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5XZWJDb250ZW50IGZvbGRlcjwvZHQ+Ci0KLTxkZD5UaGUgbWFuZGF0b3J5IGxvY2F0aW9uIG9mIGFsbCBXZWIgcmVzb3VyY2VzLCBpbmNsdWRpbmcgSFRNTCwgSlNQLCBncmFwaGljCi1maWxlcywgYW5kIHNvIG9uLiBJZiB0aGUgZmlsZXMgYXJlIG5vdCBwbGFjZWQgaW4gdGhpcyBkaXJlY3RvcnkgKG9yIGluIGEgc3ViZGlyZWN0b3J5Ci1zdHJ1Y3R1cmUgdW5kZXIgdGhpcyBkaXJlY3RvcnkpLCB0aGUgZmlsZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gdGhlCi1hcHBsaWNhdGlvbiBpcyBleGVjdXRlZCBvbiBhIHNlcnZlci4gVGhlIFdlYiBjb250ZW50IGZvbGRlciByZXByZXNlbnRzIHRoZQotY29udGVudHMgb2YgdGhlIFdBUiBmaWxlIHRoYXQgd2lsbCBiZSBkZXBsb3llZCB0byB0aGUgc2VydmVyLiBBbnkgZmlsZXMgbm90Ci11bmRlciB0aGUgV2ViIGNvbnRlbnQgZm9sZGVyIGFyZSBjb25zaWRlcmVkIGRldmVsb3BtZW50LXRpbWUgcmVzb3VyY2VzIChmb3IKLWV4YW1wbGUsIC5qYXZhIGZpbGVzLCAuc3FsIGZpbGVzLCBhbmQgLm1pZiBmaWxlcyksIGFuZCBhcmUgbm90IGRlcGxveWVkIHdoZW4KLXRoZSBwcm9qZWN0IGlzIHVuaXQgdGVzdGVkIG9yIHB1Ymxpc2hlZC4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRob3VnaCB0aGUgZGVmYXVsdCBuYW1lIGdpdmVuCi10byB0aGUgZm9sZGVyIGlzIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+V2ViQ29udGVudDwvc3Bhbj4sIHlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lCi0gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGZvbGRlciBhbmQgc2VsZWN0aW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZmFjdG9yPC9zcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbmFtZTwvc3Bhbj4gb3IKLWZyb20gdGhlIFdlYiBwYWdlIG9mIHRoZSBwcm9qZWN0J3MgUHJvcGVydGllcyBkaWFsb2cuIEluIGEgZHluYW1pYyBXZWIgcHJvamVjdCwKLWNoYW5naW5nIHRoZSBmb2xkZXIgbmFtZSB3aWxsIHVwZGF0ZSB0aGUgSmF2YSBidWlsZCBvdXRwdXQgZGlyZWN0b3J5LiA8L2Rpdj4KLTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPk1FVEEtSU5GPC9kdD4KLQotPGRkPlRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPk1BTklGRVNULk1GPC9zcGFuPiBmaWxlLCB3aGljaAotaXMgdXNlZCB0byBtYXAgY2xhc3MgcGF0aHMgZm9yIGRlcGVuZGVudCBKQVIgZmlsZXMgdGhhdCBleGlzdCBpbiBvdGhlciBwcm9qZWN0cwotaW4gdGhlIHNhbWUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LiBBbiBlbnRyeSBpbiB0aGlzIGZpbGUgd2lsbCB1cGRhdGUKLXRoZSBydW4tdGltZSBwcm9qZWN0IGNsYXNzIHBhdGggYW5kIEphdmEgYnVpbGQgc2V0dGluZ3MgdG8gaW5jbHVkZSB0aGUgcmVmZXJlbmNlZAotSkFSIGZpbGVzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPnRoZW1lPC9kdD4KLQotPGRkPlRoZSBzdWdnZXN0ZWQgZGlyZWN0b3J5IGZvciBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGFuZCBvdGhlciBzdHlsZS1yZWxhdGVkCi1vYmplY3RzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPldFQi1JTkY8L2R0PgotCi08ZGQ+QmFzZWQgb24gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiwgdGhpcwotZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBzdXBwb3J0aW5nIFdlYiByZXNvdXJjZXMgZm9yIGEgV2ViIGFwcGxpY2F0aW9uLCBpbmNsdWRpbmcKLXRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYi54bWw8L3NwYW4+IGZpbGUgYW5kIHRoZSBjbGFzc2VzIGFuZCBsaWIgZGlyZWN0b3JpZXMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+L2NsYXNzZXM8L2R0PgotCi08ZGQ+VGhpcyBkaXJlY3RvcnkgaXMgZm9yIHNlcnZsZXRzLCB1dGlsaXR5IGNsYXNzZXMsIGFuZCB0aGUgSmF2YSBjb21waWxlcgotb3V0cHV0IGRpcmVjdG9yeS4gVGhlIGNsYXNzZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi1jbGFzcyBsb2FkZXIgdG8gbG9hZCB0aGUgY2xhc3Nlcy4gRm9sZGVycyBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIG1hcCBwYWNrYWdlCi1hbmQgY2xhc3MgbmFtZXMsIGFzIGluOiA8c2FtcCBjbGFzcz0iY29kZXBoIj4vV0VCLUlORi9jbGFzc2VzL2NvbS9teWNvcnAvc2VydmxldHMvTXlTZXJ2bGV0LmNsYXNzPC9zYW1wPi48cD5Ebwotbm90IHBsYWNlIGFueSAuY2xhc3MgZmlsZXMgZGlyZWN0bHkgaW50byB0aGlzIGRpcmVjdG9yeS4gVGhlIC5jbGFzcyBmaWxlcwotYXJlIHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIEphdmEgY29tcGlsZXIKLWNvbXBpbGVzIEphdmEgc291cmNlIGZpbGVzIHRoYXQgYXJlIGluIHRoZSA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPkphdmEgUmVzb3VyY2VzPC9zcGFuPiBkaXJlY3RvcnkuCi1BbnkgZmlsZXMgcGxhY2VkIGRpcmVjdGx5IGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgSmF2YSBjb21waWxlcgotd2hlbiBpdCBydW5zLjwvcD4KLTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPi9saWI8L2R0PgotCi08ZGQ+VGhlIHN1cHBvcnRpbmcgSkFSIGZpbGVzIHRoYXQgeW91ciBXZWIgYXBwbGljYXRpb24gcmVmZXJlbmNlcy4gQW55IGNsYXNzZXMKLWluIC5qYXIgZmlsZXMgcGxhY2VkIGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYXZhaWxhYmxlIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkxpYnJhcmllczwvZHQ+Ci0KLTxkZD5UaGUgc3VwcG9ydGluZyBKQVIgZmlsZXMgdGhhdCB5b3VyIFdlYiBhcHBsaWNhdGlvbiByZWZlcmVuY2VzLiBUaGlzIGZvbGRlcgotbWlycm9ycyB0aGUgY29udGVudCBvZiB0aGUgbGliIGZvbGRlci4gSW4gYWRkaXRpb24sIFdlYiBMaWJyYXJ5IFByb2plY3RzLAotd2hpY2ggYXJlICJ2aXJ0dWFsIiBKQVIgZmlsZXMgdGhhdCBkbyBub3QgcGh5c2ljYWxseSByZXNpZGUgaW4gdGhlIFdlYiBwcm9qZWN0LAotYnV0IGFyZSBhc3NvY2lhdGVkIHdpdGggSmF2YSBwcm9qZWN0cyBlbHNld2hlcmUgaW4geW91ciB3b3Jrc3BhY2UsCi1hcmUgaW5jbHVkZWQgaW4gdGhpcyBmb2xkZXIuIFRoZXkgYXJlIHBhY2thZ2VkIHdpdGggeW91ciBwcm9qZWN0IHdoZW4geW91Ci1leHBvcnQgdGhlIGFwcGxpY2F0aW9uJ3MgV0FSIGZpbGUuPC9kZD4KLQotPC9kbD4KLSA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQSBsaWJyYXJ5IGVudHJ5IG9uIHRoZSBKYXZhIGJ1aWxkIHBhdGggd2lsbCByZW1haW4gdGhlcmUgdW5sZXNzCi10aGUgYWN0dWFsIEpBUiBmaWxlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgV0VCLUlORi9saWIgZm9sZGVyLiBJZiB5b3UgcmVtb3ZlCi1hIGxpYnJhcnkgcGF0aCBlbnRyeSBidXQgbm90IHRoZSBKQVIgZmlsZSwgdGhlIGxpYnJhcnkgZW50cnkgd2lsbCBiZSByZS1hZGRlZAotdG8gdGhlIHBhdGggYXV0b21hdGljYWxseS48L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwiIHRpdGxlPSIiPldlYiByZXNvdXJjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiB0aXRsZT0iIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCI+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpjcmVqc3AuaHRtbCI+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VidncuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwNDNlMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjY3dlYnZ3IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudDwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJjY3dlYnZ3fDF8UHJvamVjdEV4cGxvcmVydmlld292ZXJ2aWV3IiBzdGF0dXM9Im5ldyI+UHJvamVjdA0KLUV4cGxvcmVyIHZpZXc8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9ImNjd2Vidnd8MnxXZWJkZXZlbG9wbWVudFByb2plY3RFeHBsb3JlcnZpZXciDQotc3RhdHVzPSJjaGFuZ2VkIj5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPlByb2plY3QgRXhwbG9yZXIgdmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08c2VjdGlvbj48cD5UaGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbm90YWJsZSBmZWF0dXJlczogPHVsPg0KLTxsaT48aW1hZ2UgYWx0PSJGb3IgV2luZG93cyIgaHJlZj0iLi4vaW1hZ2VzL253aW4uZ2lmIiBwbGFjZW1lbnQ9ImlubGluZSI+DQotPC9pbWFnZT4gWW91IGNhbiBkcmFnIGFuZCBkcm9wIGZpbGVzIGZyb20gPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9Ik1pY3Jvc29mdCBDb3Jwb3JhdGlvbiINCi10bXR5cGU9InJlZyIgdHJhZGVtYXJrPSJXaW5kb3dzIj5XaW5kb3dzPC90bT4gRXhwbG9yZXIgb3IgdGhlIGRlc2t0b3AgaW50bw0KLXRoZSBOYXZpZ2F0b3Igdmlldy48L2xpPg0KLTxsaT5WaWV3IGZpbHRlcmluZyBpcyBzdXBwb3J0ZWQgYnkgc2VsZWN0aW5nIDxwaD48dWljb250cm9sPkZpbHRlcnM8L3VpY29udHJvbD48L3BoPiBmcm9tDQotdGhlIE5hdmlnYXRvciB2aWV3IDxwaD48dWljb250cm9sPk1lbnU8L3VpY29udHJvbD48L3BoPiBidXR0b24uIFJlc291cmNlcw0KLWNhbiBiZSBmaWx0ZXJlZCBieSBuYW1lLCBwcm9qZWN0IHR5cGUgb3IgY29udGVudCB0eXBlLiBGaWxlcyBiZWdpbm5pbmcgd2l0aA0KLWEgcGVyaW9kIGFyZSBmaWx0ZXJlZCBvdXQgYnkgZGVmYXVsdC48L2xpPg0KLTxsaT5UaGUgc3RhdHVzIGxpbmUgc2hvd3MgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UuPC9saT4NCi08bGk+RHJhZ2dpbmcgYSAuamF2YSBmaWxlIGZyb20gdGhlIE5hdmlnYXRvciB2aWV3IGludG8gYSBKU1AgZmlsZSB3aWxsIGluc2VydA0KLWEgdXNlYmVhbiB0YWcsIHRoZSBzYW1lIGJlaGF2aW9yIHRoYXQgaXMgZXhoaWJpdGVkIHdoZW4gYSAuY2xhc3MgZmlsZSBpcyBkcmFnZ2VkDQotaW50byBhIEpTUCBmaWxlLjwvbGk+DQotPGxpPkVycm9ycyBhbmQgd2FybmluZ3Mgb24gcmVzb3VyY2VzIChpbmNsdWRpbmcgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4sIEhUTUwvSlNQLCBhbmQgTGlua3MgQnVpbGRlciBlcnJvcnMNCi1hbmQgd2FybmluZ3MpIGFyZSBpbmRpY2F0ZWQgd2l0aCBhIHJlZCBlcnJvciA8aW1hZ2UgYWx0PSJFcnJvciBpY29uIiBocmVmPSIuLi9pbWFnZXMvbnNob3dlcnIuZ2lmIg0KLXBsYWNlbWVudD0iaW5saW5lIj48L2ltYWdlPiBvciB5ZWxsb3cgd2FybmluZyA8aW1hZ2UgYWx0PSJXYXJuaW5nIGljb24iIGhyZWY9Ii4uL2ltYWdlcy9ud2FybmluZy5naWYiDQotcGxhY2VtZW50PSJpbmxpbmUiPjwvaW1hZ2U+IG5leHQgdG8gdGhlIHJlc291cmNlIHdpdGggdGhlIGVycm9yLCBhcyB3ZWxsIGFzDQotdGhlIHBhcmVudCBjb250YWluZXJzIHVwIHRvIHRoZSBwcm9qZWN0LiBUaGlzIGFwcGxpZXMgZm9yIGFsbCBwcm9qZWN0IHR5cGVzLA0KLW5vdCBvbmx5IFdlYiBwcm9qZWN0cy48L2xpPg0KLTxsaT5JdGVtcyBhdmFpbGFibGUgZnJvbSB0aGUgPHBoPjx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+PC9waD4gY2FzY2FkaW5nDQotbWVudSBpbiB0aGUgcHJvamVjdCBwb3AtdXAgbWVudSBhcmUgY29udGV4dCBzZW5zaXRpdmUuICBBbGwgbWVudXMgd2lsbCBoYXZlIDxwaD48dWljb250cm9sPlByb2plY3Q8L3VpY29udHJvbD48L3BoPiBhbmQgPHBoPjx1aWNvbnRyb2w+T3RoZXI8L3VpY29udHJvbA0KLT48L3BoPiBvcHRpb25zLjwvbGk+DQotPC91bD48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5Pcmdhbml6YXRpb24gb2YgdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldzwvdGl0bGU+PHA+VGhlIFByb2plY3QNCi1FeHBsb3JlciB2aWV3IHNob3dzIGEgY3VzdG9tIHZpZXcgb2YgYWxsIFdlYiBwcm9qZWN0cy4gVGhlIGZvbGxvd2luZyBhcmUgc29tZQ0KLW9mIHRoZSBub3RhYmxlIHRvcC1sZXZlbCBvYmplY3RzIHRoYXQgYXBwZWFyIGJlbmVhdGggdGhlIHByb2plY3Qgbm9kZSAoYmFzZWQNCi1vbiBkZWZhdWx0IGZvbGRlciBuYW1lcykuPC9wPjxwPjxiPldlYiBjb250ZW50IGZvbGRlcjwvYj4gLSBUaGlzIGZvbGRlciBjb250YWlucw0KLWl0ZW1zIHRvIGJlIHB1Ymxpc2hlZCB0byB0aGUgc2VydmVyLiBCeSBkZWZhdWx0LCB0aGlzIGZvbGRlciB3aWxsIGJlIG5hbWVkIDxiPldlYkNvbnRlbnQ8L2I+IGZvcg0KLW5ld2x5IGNyZWF0ZWQgc3RhdGljIGFuZCBkeW5hbWljIFdlYiBwcm9qZWN0cy4gPG5vdGU+WW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUNCi1pbiB0aGUgY3JlYXRpb24gd2l6YXJkIFdlYiBmYWNldCBwYWdlLjwvbm90ZT48dWw+DQotPGxpPjxiPk1FVEEtSU5GPC9iPiAtIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSA8ZmlsZXBhdGg+TUFOSUZFU1QuTUY8L2ZpbGVwYXRoPiBmaWxlLA0KLXdoaWNoIGlzIHVzZWQgdG8gbWFwIGNsYXNzIHBhdGhzIGZvciBkZXBlbmRlbnQgSkFSIGZpbGVzIHRoYXQgZXhpc3QgaW4gb3RoZXINCi1wcm9qZWN0cyBpbiB0aGUgc2FtZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuIEFuIGVudHJ5IGluIHRoaXMgZmlsZQ0KLXdpbGwgdXBkYXRlIHRoZSBydW4tdGltZSBwcm9qZWN0IGNsYXNzIHBhdGggYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkIHNldHRpbmdzIHRvIGluY2x1ZGUgdGhlIHJlZmVyZW5jZWQNCi1KQVIgZmlsZXMuPC9saT4NCi08L3VsPjx1bD4NCi08bGk+PGI+V0VCLUlORjwvYj4gLSBUaGUgZGlyZWN0b3J5IHdoZXJlIHN1cHBvcnRpbmcgV2ViIHJlc291cmNlcyBmb3IgYSBXZWINCi1hcHBsaWNhdGlvbiBhcmUga2VwdCAoZm9yIGV4YW1wbGU6IC54bWkgZmlsZXMsIC54bWwgZmlsZXMsIGFuZCB3ZWIueG1sLikgPC9saT4NCi08L3VsPiA8L3A+IDwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnZ3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmY1N2FjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnZ3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlByb2plY3QgRXhwbG9yZXIgdmlldywgb3ZlcnZpZXcsIFdlYiBwcm9qZWN0cywgUHJvamVjdCBFeHBsb3JlciB2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iUHJvamVjdCBFeHBsb3JlciB2aWV3LCBvdmVydmlldywgV2ViIHByb2plY3RzLCBQcm9qZWN0IEV4cGxvcmVyIHZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNjd2VidnciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2N3ZWJ2dyI+PGEgbmFtZT0iY2N3ZWJ2dyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQ8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJwIj5UaGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbm90YWJsZSBmZWF0dXJlczogPHVsPgotPGxpPjxpbWcgc3JjPSIuLi9pbWFnZXMvbndpbi5naWYiIGFsdD0iRm9yIFdpbmRvd3MiIC8+IFlvdSBjYW4gZHJhZyBhbmQgZHJvcCBmaWxlcyBmcm9tIFdpbmRvd3M8c3VwPsKuPC9zdXA+IEV4cGxvcmVyIG9yIHRoZSBkZXNrdG9wIGludG8KLXRoZSBOYXZpZ2F0b3Igdmlldy48L2xpPgotCi08bGk+VmlldyBmaWx0ZXJpbmcgaXMgc3VwcG9ydGVkIGJ5IHNlbGVjdGluZyA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWx0ZXJzPC9zcGFuPjwvc3Bhbj4gZnJvbQotdGhlIE5hdmlnYXRvciB2aWV3IDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1lbnU8L3NwYW4+PC9zcGFuPiBidXR0b24uIFJlc291cmNlcwotY2FuIGJlIGZpbHRlcmVkIGJ5IG5hbWUsIHByb2plY3QgdHlwZSBvciBjb250ZW50IHR5cGUuIEZpbGVzIGJlZ2lubmluZyB3aXRoCi1hIHBlcmlvZCBhcmUgZmlsdGVyZWQgb3V0IGJ5IGRlZmF1bHQuPC9saT4KLQotPGxpPlRoZSBzdGF0dXMgbGluZSBzaG93cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZS48L2xpPgotCi08bGk+RHJhZ2dpbmcgYSAuamF2YSBmaWxlIGZyb20gdGhlIE5hdmlnYXRvciB2aWV3IGludG8gYSBKU1AgZmlsZSB3aWxsIGluc2VydAotYSB1c2ViZWFuIHRhZywgdGhlIHNhbWUgYmVoYXZpb3IgdGhhdCBpcyBleGhpYml0ZWQgd2hlbiBhIC5jbGFzcyBmaWxlIGlzIGRyYWdnZWQKLWludG8gYSBKU1AgZmlsZS48L2xpPgotCi08bGk+RXJyb3JzIGFuZCB3YXJuaW5ncyBvbiByZXNvdXJjZXMgKGluY2x1ZGluZyBKYXZh4oSiLCBIVE1ML0pTUCwgYW5kIExpbmtzIEJ1aWxkZXIgZXJyb3JzCi1hbmQgd2FybmluZ3MpIGFyZSBpbmRpY2F0ZWQgd2l0aCBhIHJlZCBlcnJvciA8aW1nIHNyYz0iLi4vaW1hZ2VzL25zaG93ZXJyLmdpZiIgYWx0PSJFcnJvciBpY29uIiAvPiBvciB5ZWxsb3cgd2FybmluZyA8aW1nIHNyYz0iLi4vaW1hZ2VzL253YXJuaW5nLmdpZiIgYWx0PSJXYXJuaW5nIGljb24iIC8+IG5leHQgdG8gdGhlIHJlc291cmNlIHdpdGggdGhlIGVycm9yLCBhcyB3ZWxsIGFzCi10aGUgcGFyZW50IGNvbnRhaW5lcnMgdXAgdG8gdGhlIHByb2plY3QuIFRoaXMgYXBwbGllcyBmb3IgYWxsIHByb2plY3QgdHlwZXMsCi1ub3Qgb25seSBXZWIgcHJvamVjdHMuPC9saT4KLQotPGxpPkl0ZW1zIGF2YWlsYWJsZSBmcm9tIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+PC9zcGFuPiBjYXNjYWRpbmcKLW1lbnUgaW4gdGhlIHByb2plY3QgcG9wLXVwIG1lbnUgYXJlIGNvbnRleHQgc2Vuc2l0aXZlLiAgQWxsIG1lbnVzIHdpbGwgaGF2ZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0PC9zcGFuPjwvc3Bhbj4gYW5kIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPjwvc3Bhbj4gb3B0aW9ucy48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPk9yZ2FuaXphdGlvbiBvZiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3PC9oND48cD5UaGUgUHJvamVjdAotRXhwbG9yZXIgdmlldyBzaG93cyBhIGN1c3RvbSB2aWV3IG9mIGFsbCBXZWIgcHJvamVjdHMuIFRoZSBmb2xsb3dpbmcgYXJlIHNvbWUKLW9mIHRoZSBub3RhYmxlIHRvcC1sZXZlbCBvYmplY3RzIHRoYXQgYXBwZWFyIGJlbmVhdGggdGhlIHByb2plY3Qgbm9kZSAoYmFzZWQKLW9uIGRlZmF1bHQgZm9sZGVyIG5hbWVzKS48L3A+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPldlYiBjb250ZW50IGZvbGRlcjwvc3Ryb25nPiAtIFRoaXMgZm9sZGVyIGNvbnRhaW5zCi1pdGVtcyB0byBiZSBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlci4gQnkgZGVmYXVsdCwgdGhpcyBmb2xkZXIgd2lsbCBiZSBuYW1lZCA8c3Ryb25nPldlYkNvbnRlbnQ8L3N0cm9uZz4gZm9yCi1uZXdseSBjcmVhdGVkIHN0YXRpYyBhbmQgZHluYW1pYyBXZWIgcHJvamVjdHMuIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIGNoYW5nZSB0aGUgbmFtZQotaW4gdGhlIGNyZWF0aW9uIHdpemFyZCBXZWIgZmFjZXQgcGFnZS48L2Rpdj4KLTx1bD4KLTxsaT48c3Ryb25nPk1FVEEtSU5GPC9zdHJvbmc+IC0gVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+TUFOSUZFU1QuTUY8L3NwYW4+IGZpbGUsCi13aGljaCBpcyB1c2VkIHRvIG1hcCBjbGFzcyBwYXRocyBmb3IgZGVwZW5kZW50IEpBUiBmaWxlcyB0aGF0IGV4aXN0IGluIG90aGVyCi1wcm9qZWN0cyBpbiB0aGUgc2FtZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuIEFuIGVudHJ5IGluIHRoaXMgZmlsZQotd2lsbCB1cGRhdGUgdGhlIHJ1bi10aW1lIHByb2plY3QgY2xhc3MgcGF0aCBhbmQgSmF2YSBidWlsZCBzZXR0aW5ncyB0byBpbmNsdWRlIHRoZSByZWZlcmVuY2VkCi1KQVIgZmlsZXMuPC9saT4KLQotPC91bD4KLTx1bD4KLTxsaT48c3Ryb25nPldFQi1JTkY8L3N0cm9uZz4gLSBUaGUgZGlyZWN0b3J5IHdoZXJlIHN1cHBvcnRpbmcgV2ViIHJlc291cmNlcyBmb3IgYSBXZWIKLWFwcGxpY2F0aW9uIGFyZSBrZXB0IChmb3IgZXhhbXBsZTogLnhtaSBmaWxlcywgLnhtbCBmaWxlcywgYW5kIHdlYi54bWwuKSA8L2xpPgotCi08L3VsPgotIDwvZGl2PgotIDwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd3RvdmVyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwY2MzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08IS0tIEFyYm9yVGV4dCwgSW5jLiwgMTk4OC0yMDAyLCB2LjQwMDIgLS0+DQotPGNvbmNlcHQgaWQ9ImNjd3RvdmVyIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBhcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZSBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgcHJvdmlkZXMgdGhlIHRvb2xzIHlvdSBuZWVkIHRvIGRldmVsb3ANCi1XZWIgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldA0KLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBhbmQgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSlNQIDEuMiBTcGVjaWZpY2F0aW9uPC9jaXRlPi4NCi1XZWIgYXBwbGljYXRpb25zIGNhbiBiZSBzaW1wbGUgKGNvbnNpc3Rpbmcgb2Ygb25seSBzdGF0aWMgV2ViIHBhZ2VzKSBvciB0aGV5DQotY2FuIGJlIG1vcmUgYWR2YW5jZWQgYW5kIGluY2x1ZGUgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyBhbmQgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc2VydmxldHMuDQotVGhlc2UgcmVzb3VyY2VzLCBhbG9uZyB3aXRoIGFuIFhNTCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKGFuZCBvdGhlciA8eHJlZg0KLWhyZWY9ImN3ZWJyZXNvdXJjZXMuZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz4gV2ViIHJlc291cmNlczwveHJlZj4sIGFyZSBjb250YWluZWQNCi13aXRoaW4gYSBXZWIgcHJvamVjdCBkdXJpbmcgZGV2ZWxvcG1lbnQuIFdoZW4geW91IGFyZSByZWFkeSB0byBwdWJsaXNoIHRoZQ0KLVdlYiBhcHBsaWNhdGlvbiB0byB0aGUgV2ViLCB5b3UgZGVwbG95IHRoZSBXZWIgcHJvamVjdCB0byB0aGUgc2VydmVyIGluIHRoZQ0KLWZvcm0gb2YgYSBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlIC4gVGhlIGVuZCB1c2VyIGNhbiB0aGVuIHZpZXcgdGhlIFdlYiBhcHBsaWNhdGlvbg0KLWFzIGEgV2ViIHNpdGUgZnJvbSBhIFVSTC48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3d0b3Zlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODg2ZTM3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3d0b3Zlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3IiAvPgotPG1ldGEgY29udGVudD0iV2ViIGFwcGxpY2F0aW9ucywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgYXBwbGljYXRpb25zLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3RmZWF0dXJlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqZGV0YWdzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2ViYXJ0aWZhY3QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjY3d0b3ZlciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldlYiBhcHBsaWNhdGlvbiBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2N3dG92ZXIiPjxhIG5hbWU9ImNjd3RvdmVyIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L2gxPgotCi0KLTxkaXY+Ci08cD5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIHRoZSB0b29scyB5b3UgbmVlZCB0byBkZXZlbG9wCi1XZWIgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YeKEoiBTZXJ2bGV0Ci0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYW5kIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEpTUCAxLjIgU3BlY2lmaWNhdGlvbjwvY2l0ZT4uCi1XZWIgYXBwbGljYXRpb25zIGNhbiBiZSBzaW1wbGUgKGNvbnNpc3Rpbmcgb2Ygb25seSBzdGF0aWMgV2ViIHBhZ2VzKSBvciB0aGV5Ci1jYW4gYmUgbW9yZSBhZHZhbmNlZCBhbmQgaW5jbHVkZSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIGFuZCBKYXZhIHNlcnZsZXRzLgotVGhlc2UgcmVzb3VyY2VzLCBhbG9uZyB3aXRoIGFuIFhNTCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKGFuZCBvdGhlciA8YSBocmVmPSJjd2VicmVzb3VyY2VzLmh0bWwiIHRpdGxlPSIiPldlYiByZXNvdXJjZXM8L2E+LCBhcmUgY29udGFpbmVkCi13aXRoaW4gYSBXZWIgcHJvamVjdCBkdXJpbmcgZGV2ZWxvcG1lbnQuIFdoZW4geW91IGFyZSByZWFkeSB0byBwdWJsaXNoIHRoZQotV2ViIGFwcGxpY2F0aW9uIHRvIHRoZSBXZWIsIHlvdSBkZXBsb3kgdGhlIFdlYiBwcm9qZWN0IHRvIHRoZSBzZXJ2ZXIgaW4gdGhlCi1mb3JtIG9mIGEgV2ViIGFyY2hpdmUgKFdBUikgZmlsZSAuIFRoZSBlbmQgdXNlciBjYW4gdGhlbiB2aWV3IHRoZSBXZWIgYXBwbGljYXRpb24KLWFzIGEgV2ViIHNpdGUgZnJvbSBhIFVSTC48L3A+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3dGZlYXR1cmVzLmh0bWwiIHRpdGxlPSJUaGUgaW50ZWdyYXRlZCBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgbWFrZXMgaXQgZWFzeSB0byBjb29wZXJhdGl2ZWx5IGNyZWF0ZSwgYXNzZW1ibGUsIHB1Ymxpc2gsIGRlcGxveSBhbmQgbWFpbnRhaW4gZHluYW1pYywgaW50ZXJhY3RpdmUgV2ViIGFwcGxpY2F0aW9ucy4iPldlYiB0b29scyBmZWF0dXJlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCI+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpkZXRhZ3MuaHRtbCI+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2ViYXJ0aWZhY3QuaHRtbCI+Q3JlYXRpbmcgV2ViIEFydGlmYWN0czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2NwZGpzcHMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyMjRmMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjcGRqc3BzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5KYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3k8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0iY3BkanNwc3wxfEpTUHBhZ2Vzb3ZlcnZpZXciIHN0YXR1cz0iY2hhbmdlZCI+SlNQDQotZmlsZXM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9ImNwZGpzcHN8MnxXZWJjb250ZW50Z2VuZXJhdGluZ2R5bmFtaWNhbGx5Ig0KLXN0YXR1cz0ibmV3Ij5XZWIgY29udGVudDxpbmRleHRlcm0+Z2VuZXJhdGluZyBkeW5hbWljYWxseTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgSmF2YVNlcnZlciBQYWdlcyB0ZWNobm9sb2d5IGVuYWJsZXMgeW91IHRvIGdlbmVyYXRlIGR5bmFtaWMgd2ViIGNvbnRlbnQsDQotc3VjaCBhcyBIVE1MLCBESFRNTCwgWEhUTUwsIGFuZCBYTUwgZmlsZXMsIHRvIGluY2x1ZGUgaW4gYSBXZWIgYXBwbGljYXRpb24uDQotSlNQIGZpbGVzIGFyZSBvbmUgd2F5IHRvIGltcGxlbWVudCBzZXJ2ZXItc2lkZSBkeW5hbWljIHBhZ2UgY29udGVudC4gSlNQIGZpbGVzDQotYWxsb3cgYSBXZWIgc2VydmVyLCBzdWNoIGFzIEFwYWNoZSBUb21jYXQsIHRvIGFkZCBjb250ZW50IGR5bmFtaWNhbGx5IHRvIHlvdXINCi1IVE1MIHBhZ2VzIGJlZm9yZSB0aGV5IGFyZSBzZW50IHRvIGEgcmVxdWVzdGluZyBicm93c2VyLjwvcD4NCi08cD5XaGVuIHlvdSBkZXBsb3kgYSBKU1AgZmlsZSB0byBhIFdlYiBzZXJ2ZXIgdGhhdCBwcm92aWRlcyBhIHNlcnZsZXQgZW5naW5lLA0KLWl0IGlzIHByZXByb2Nlc3NlZCBpbnRvIGEgc2VydmxldCB0aGF0IHJ1bnMgb24gdGhlIFdlYiBzZXJ2ZXIuIFRoaXMgaXMgaW4NCi1jb250cmFzdCB3aXRoIGNsaWVudC1zaWRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+ICh3aXRoaW4gPGNvZGVwaD4mbHQ7U0NSSVBUPjwvY29kZXBoPiB0YWdzKSwNCi13aGljaCBpcyBydW4gaW4gYSBicm93c2VyLiBBIEpTUCBwYWdlIGlzIGlkZWFsIGZvciB0YXNrcyB0aGF0IGFyZSBiZXR0ZXIgc3VpdGVkDQotdG8gZXhlY3V0aW9uIG9uIHRoZSBzZXJ2ZXIsIHN1Y2ggYXMgYWNjZXNzaW5nIGRhdGFiYXNlcyBvciBjYWxsaW5nIEVudGVycHJpc2UgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYmVhbnMuPC9wPg0KLTxwPllvdSBjYW4gY3JlYXRlIGFuZCBlZGl0IGEgSlNQIGZpbGUgaW4gdGhlIEhUTUwgZWRpdG9yIGJ5IGFkZGluZyB5b3VyIG93bg0KLXRleHQgYW5kIGltYWdlcyB1c2luZyBIVE1MLCBKU1AgdGFnZ2luZywgb3IgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4sIGluY2x1ZGluZyA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzb3VyY2UNCi1jb2RlIGluc2lkZSBvZiBzY3JpcHRsZXQgdGFncy4gVHlwaWNhbGx5LCBKU1AgZmlsZXMgaGF2ZSB0aGUgZmlsZSBleHRlbnNpb24NCi0uanNwLiBBZGRpdGlvbmFsbHksIHRoZSBKU1Agc3BlY2lmaWNhdGlvbiBzdWdnZXN0cyB0aGF0IEpTUCBmcmFnbWVudCBmaWxlcw0KLXNob3VsZCBoYXZlIGZpbGUgZXh0ZW5zaW9uIC5qc3BmLiBJZiB0aGlzIGNvbnZlbnRpb24gaXMgbm90IGZvbGxvd2VkLCB0aGUNCi1KU1AgdmFsaWRhdG9yIHdpbGwgdHJlYXQgSlNQIGZyYWdtZW50cyBhcyByZWd1bGFyIHN0YW5kYWxvbmUgSlNQIGZpbGVzLCBhbmQNCi1jb21waWxhdGlvbiBlcnJvcnMgbWlnaHQgYmUgcmVwb3J0ZWQuPC9wPg0KLTxwPlRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEpTUCAxLjIgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gcHJvdmlkZXMgdGhlIGFiaWxpdHkNCi10byBjcmVhdGUgY3VzdG9tIEpTUCB0YWdzLiBDdXN0b20gdGFncyBzaW1wbGlmeSBjb21wbGV4IGFjdGlvbnMgYW5kICBwcm92aWRlDQotZGV2ZWxvcGVycyB3aXRoIGdyZWF0ZXIgY29udHJvbCBvdmVyIHBhZ2UgY29udGVudC4gQ3VzdG9tIHRhZ3MgYXJlIGNvbGxlY3RlZA0KLWludG8gYSBsaWJyYXJ5ICh0YWdsaWIpLiBBIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZmlsZSAodGFnbGliLnRsZCkgaXMgYW4NCi1YTUwgZG9jdW1lbnQgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFnIGxpYnJhcnksIGluY2x1ZGluZyB0aGUNCi10YWdsaWIgc2hvcnQgbmFtZSwgbGlicmFyeSBkZXNjcmlwdGlvbiwgYW5kIHRhZyBkZXNjcmlwdGlvbnMuIFJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4NCi1NaWNyb3N5c3RlbXMgSlNQIDEuMiBTcGVjaWZpY2F0aW9uPC9jaXRlPiBmb3IgbW9yZSBkZXRhaWxzLjwvcD4NCi08cD5UbyB1c2UgSlNQIDEuMiBjdXN0b20gdGFnbGlicywgeW91IGNhbiBpbXBvcnQgdGhlIHRhZyBsaWJyYXJ5IC50bGQgYW5kDQotLmphciBmaWxlcyBpbnRvIHlvdXIgcHJvamVjdCB0byB1c2UgdGhlbSwgb3IgYXNzb2NpYXRlIHRoZW0gYXMgV2ViIExpYnJhcnkNCi1wcm9qZWN0cy4gWW91IGNhbiBhbHNvIHJlZmVyZW5jZSBhIFRMRCBmaWxlIGJ5IHVzaW5nIGEgVVJJLjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jcGRqc3BzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGRjNjI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jcGRqc3BzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiIC8+Ci08bWV0YSBjb250ZW50PSJKU1AgZmlsZXMsIG92ZXJ2aWV3LCBXZWIgY29udGVudCwgZ2VuZXJhdGluZyBkeW5hbWljYWxseSIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkpTUCBmaWxlcywgb3ZlcnZpZXcsIFdlYiBjb250ZW50LCBnZW5lcmF0aW5nIGR5bmFtaWNhbGx5IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3c2VydmJuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2xpc3Ribi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3BkanNwcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3BkanNwcyI+PGEgbmFtZT0iY3BkanNwcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5PC9oMT4KLQotCi08ZGl2PgotPHA+VGhlIEphdmFTZXJ2ZXIgUGFnZXMgdGVjaG5vbG9neSBlbmFibGVzIHlvdSB0byBnZW5lcmF0ZSBkeW5hbWljIHdlYiBjb250ZW50LAotc3VjaCBhcyBIVE1MLCBESFRNTCwgWEhUTUwsIGFuZCBYTUwgZmlsZXMsIHRvIGluY2x1ZGUgaW4gYSBXZWIgYXBwbGljYXRpb24uCi1KU1AgZmlsZXMgYXJlIG9uZSB3YXkgdG8gaW1wbGVtZW50IHNlcnZlci1zaWRlIGR5bmFtaWMgcGFnZSBjb250ZW50LiBKU1AgZmlsZXMKLWFsbG93IGEgV2ViIHNlcnZlciwgc3VjaCBhcyBBcGFjaGUgVG9tY2F0LCB0byBhZGQgY29udGVudCBkeW5hbWljYWxseSB0byB5b3VyCi1IVE1MIHBhZ2VzIGJlZm9yZSB0aGV5IGFyZSBzZW50IHRvIGEgcmVxdWVzdGluZyBicm93c2VyLjwvcD4KLQotPHA+V2hlbiB5b3UgZGVwbG95IGEgSlNQIGZpbGUgdG8gYSBXZWIgc2VydmVyIHRoYXQgcHJvdmlkZXMgYSBzZXJ2bGV0IGVuZ2luZSwKLWl0IGlzIHByZXByb2Nlc3NlZCBpbnRvIGEgc2VydmxldCB0aGF0IHJ1bnMgb24gdGhlIFdlYiBzZXJ2ZXIuIFRoaXMgaXMgaW4KLWNvbnRyYXN0IHdpdGggY2xpZW50LXNpZGUgSmF2YVNjcmlwdOKEoiAod2l0aGluIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDtTQ1JJUFQmZ3Q7PC9zYW1wPiB0YWdzKSwKLXdoaWNoIGlzIHJ1biBpbiBhIGJyb3dzZXIuIEEgSlNQIHBhZ2UgaXMgaWRlYWwgZm9yIHRhc2tzIHRoYXQgYXJlIGJldHRlciBzdWl0ZWQKLXRvIGV4ZWN1dGlvbiBvbiB0aGUgc2VydmVyLCBzdWNoIGFzIGFjY2Vzc2luZyBkYXRhYmFzZXMgb3IgY2FsbGluZyBFbnRlcnByaXNlIEphdmHihKIgYmVhbnMuPC9wPgotCi08cD5Zb3UgY2FuIGNyZWF0ZSBhbmQgZWRpdCBhIEpTUCBmaWxlIGluIHRoZSBIVE1MIGVkaXRvciBieSBhZGRpbmcgeW91ciBvd24KLXRleHQgYW5kIGltYWdlcyB1c2luZyBIVE1MLCBKU1AgdGFnZ2luZywgb3IgSmF2YVNjcmlwdCwgaW5jbHVkaW5nIEphdmEgc291cmNlCi1jb2RlIGluc2lkZSBvZiBzY3JpcHRsZXQgdGFncy4gVHlwaWNhbGx5LCBKU1AgZmlsZXMgaGF2ZSB0aGUgZmlsZSBleHRlbnNpb24KLS5qc3AuIEFkZGl0aW9uYWxseSwgdGhlIEpTUCBzcGVjaWZpY2F0aW9uIHN1Z2dlc3RzIHRoYXQgSlNQIGZyYWdtZW50IGZpbGVzCi1zaG91bGQgaGF2ZSBmaWxlIGV4dGVuc2lvbiAuanNwZi4gSWYgdGhpcyBjb252ZW50aW9uIGlzIG5vdCBmb2xsb3dlZCwgdGhlCi1KU1AgdmFsaWRhdG9yIHdpbGwgdHJlYXQgSlNQIGZyYWdtZW50cyBhcyByZWd1bGFyIHN0YW5kYWxvbmUgSlNQIGZpbGVzLCBhbmQKLWNvbXBpbGF0aW9uIGVycm9ycyBtaWdodCBiZSByZXBvcnRlZC48L3A+Ci0KLTxwPlRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEpTUCAxLjIgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gcHJvdmlkZXMgdGhlIGFiaWxpdHkKLXRvIGNyZWF0ZSBjdXN0b20gSlNQIHRhZ3MuIEN1c3RvbSB0YWdzIHNpbXBsaWZ5IGNvbXBsZXggYWN0aW9ucyBhbmQgIHByb3ZpZGUKLWRldmVsb3BlcnMgd2l0aCBncmVhdGVyIGNvbnRyb2wgb3ZlciBwYWdlIGNvbnRlbnQuIEN1c3RvbSB0YWdzIGFyZSBjb2xsZWN0ZWQKLWludG8gYSBsaWJyYXJ5ICh0YWdsaWIpLiBBIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZmlsZSAodGFnbGliLnRsZCkgaXMgYW4KLVhNTCBkb2N1bWVudCB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YWcgbGlicmFyeSwgaW5jbHVkaW5nIHRoZQotdGFnbGliIHNob3J0IG5hbWUsIGxpYnJhcnkgZGVzY3JpcHRpb24sIGFuZCB0YWcgZGVzY3JpcHRpb25zLiBSZWZlciB0byB0aGUgPGNpdGU+U3VuCi1NaWNyb3N5c3RlbXMgSlNQIDEuMiBTcGVjaWZpY2F0aW9uPC9jaXRlPiBmb3IgbW9yZSBkZXRhaWxzLjwvcD4KLQotPHA+VG8gdXNlIEpTUCAxLjIgY3VzdG9tIHRhZ2xpYnMsIHlvdSBjYW4gaW1wb3J0IHRoZSB0YWcgbGlicmFyeSAudGxkIGFuZAotLmphciBmaWxlcyBpbnRvIHlvdXIgcHJvamVjdCB0byB1c2UgdGhlbSwgb3IgYXNzb2NpYXRlIHRoZW0gYXMgV2ViIExpYnJhcnkKLXByb2plY3RzLiBZb3UgY2FuIGFsc28gcmVmZXJlbmNlIGEgVExEIGZpbGUgYnkgdXNpbmcgYSBVUkkuPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIiB0aXRsZT0iIj5TZXJ2bGV0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIHRpdGxlPSIiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3ZmlsdGJuLmh0bWwiIHRpdGxlPSIiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpjcmVqc3AuaHRtbCI+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYmFydGlmYWN0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYmFydGlmYWN0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNGJkYWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJhcnRpZmFjdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTwhLS0gQXJib3JUZXh0LCBJbmMuLCAxOTg4LTIwMDIsIHYuNDAwMiAtLT4NCi08Y29uY2VwdCBpZD0iY3dlYmFydGlmYWN0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBXZWIgQXJ0aWZhY3RzPC90aXRsZT4NCi08Y29uYm9keT4NCi08cD5Db250ZW50czo8L3A+DQotPHVsPg0KLTxsaT48eHJlZiBocmVmPSJ0d3Nydndpei5kaXRhIiBzY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPkNyZWF0aW5nIFNlcnZsZXRzPC94cmVmPjwvbGk+DQotPGxpPjx4cmVmIGhyZWY9InR3bHN0d2l6LmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+Q3JlYXRpbmcgTGlzdGVuZXJzPC94cmVmPjwvbGk+DQotPGxpPjx4cmVmIGhyZWY9InR3Zmx0d2l6LmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+Q3JlYXRpbmcgRmlsdGVyczwveHJlZj48L2xpPg0KLTwvdWw+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYmFydGlmYWN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYmFydGlmYWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZGY3NDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJhcnRpZmFjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgV2ViIEFydGlmYWN0cyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd2ViYXJ0aWZhY3QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBXZWIgQXJ0aWZhY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd2ViYXJ0aWZhY3QiPjxhIG5hbWU9ImN3ZWJhcnRpZmFjdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgV2ViIEFydGlmYWN0czwvaDE+Ci0KLTxkaXY+Ci08cD5Db250ZW50czo8L3A+Ci0KLTx1bD4KLTxsaT48YSBocmVmPSJ0d3Nydndpei5odG1sIiB0aXRsZT0iIj5DcmVhdGluZyBTZXJ2bGV0czwvYT48L2xpPgotCi08bGk+PGEgaHJlZj0idHdsc3R3aXouaHRtbCIgdGl0bGU9IiI+Q3JlYXRpbmcgTGlzdGVuZXJzPC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSJ0d2ZsdHdpei5odG1sIiB0aXRsZT0iIj5DcmVhdGluZyBGaWx0ZXJzPC9hPjwvbGk+Ci0KLTwvdWw+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjE2MjRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd2VicGFnZWRlc2lnbiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V2ViIHBhZ2UgZGVzaWduPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcGFnZSBkZXNpZ248aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPldlYiBwYWdlcyBhcmUgYW4gaW50ZWdyYWwgcGFydCBvZiBldmVyeSBXZWIgYXBwbGljYXRpb24uIEVhY2ggV2ViIHBhZ2UNCi1zaG91bGQgc2VydmUgdG8gaGVscCBhY2hpZXZlIHRoZSBvdmVyYWxsIGdvYWwgb2YgdGhlIGVudGlyZSBXZWIgc2l0ZS48L3A+DQotPHA+IFRoZXJlIGFyZSBtYW55IHR5cGVzIG9mIFdlYiBwYWdlcywgcmFuZ2luZyBmcm9tIHNpbXBsZSBIVE1MIHBhZ2VzIHRoYXQNCi1jb250YWluIG5vIGR5bmFtaWMgZWxlbWVudHMsIHRvIGFkdmFuY2VkIEphdmEtYmFzZWQgcGFnZXMgdGhhdCBtYWtlIHVzZSBvZg0KLXNlcnZsZXRzLCBzY3JpcHRzLCBmb3Jtcywgb3IgZGF0YSBhY2Nlc3MgY29tcG9uZW50cy48L3A+DQotPHA+QSBmZXcgb2YgdGhlIG1hbnkgaXRlbXMgeW91IHNob3VsZCBjb25zaWRlciB3aGVuIGRlc2lnbmluZyB5b3VyIHBhZ2VzIGFyZQ0KLW1hcmt1cCBsYW5ndWFnZSwgbGlua3MsIGltYWdlcywgYW5kIHN0eWxlIHNoZWV0cy48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmUyMTdmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIHBhZ2UgZGVzaWduIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHBhZ2UgZGVzaWduLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwYWdlIGRlc2lnbiwgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpkZXRhZ3MuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd2VicGFnZWRlc2lnbiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldlYiBwYWdlIGRlc2lnbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dlYnBhZ2VkZXNpZ24iPjxhIG5hbWU9ImN3ZWJwYWdlZGVzaWduIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgcGFnZSBkZXNpZ248L2gxPgotCi0KLTxkaXY+Ci08cD5XZWIgcGFnZXMgYXJlIGFuIGludGVncmFsIHBhcnQgb2YgZXZlcnkgV2ViIGFwcGxpY2F0aW9uLiBFYWNoIFdlYiBwYWdlCi1zaG91bGQgc2VydmUgdG8gaGVscCBhY2hpZXZlIHRoZSBvdmVyYWxsIGdvYWwgb2YgdGhlIGVudGlyZSBXZWIgc2l0ZS48L3A+Ci0KLTxwPiBUaGVyZSBhcmUgbWFueSB0eXBlcyBvZiBXZWIgcGFnZXMsIHJhbmdpbmcgZnJvbSBzaW1wbGUgSFRNTCBwYWdlcyB0aGF0Ci1jb250YWluIG5vIGR5bmFtaWMgZWxlbWVudHMsIHRvIGFkdmFuY2VkIEphdmEtYmFzZWQgcGFnZXMgdGhhdCBtYWtlIHVzZSBvZgotc2VydmxldHMsIHNjcmlwdHMsIGZvcm1zLCBvciBkYXRhIGFjY2VzcyBjb21wb25lbnRzLjwvcD4KLQotPHA+QSBmZXcgb2YgdGhlIG1hbnkgaXRlbXMgeW91IHNob3VsZCBjb25zaWRlciB3aGVuIGRlc2lnbmluZyB5b3VyIHBhZ2VzIGFyZQotbWFya3VwIGxhbmd1YWdlLCBsaW5rcywgaW1hZ2VzLCBhbmQgc3R5bGUgc2hlZXRzLjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpkZXRhZ3MuaHRtbCIgdGl0bGU9IiI+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDU4NjEwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3dlYnByb2plY3RzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgcHJvamVjdHM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBhcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPmNyZWF0aW5nIG9yIGltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5XZWIgcHJvamVjdHMgaG9sZCBhbGwgb2YgdGhlIFdlYiByZXNvdXJjZXMgdGhhdCBhcmUgY3JlYXRlZCBhbmQgdXNlZCB3aGVuDQotZGV2ZWxvcGluZyB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpcnN0IHN0ZXAgdG8gY3JlYXRpbmcgb3IgaW1wb3J0aW5nIGENCi1XZWIgYXBwbGljYXRpb24gaXMgdG8gY3JlYXRlIGVpdGhlciBhIHN0YXRpYyBvciBhIGR5bmFtaWMgV2ViIHByb2plY3QuIFN0YXRpYw0KLVdlYiBwcm9qZWN0cyBhcmUgbWVhbnQgdG8gY29udGFpbiBvbmx5IHNpbXBsZSBXZWIgc2l0ZSByZXNvdXJjZXMsIHN1Y2ggYXMNCi1IVE1MIGZpbGVzLiBEeW5hbWljIFdlYiBwcm9qZWN0cyBhcmUgdXNlZCB0byBzdHJ1Y3R1cmUgV2ViIGFwcGxpY2F0aW9ucyB0aGF0DQotd2lsbCB1c2UgbW9yZSBjb21wbGljYXRlZCwgZHluYW1pYyBXZWIgdGVjaG5vbG9naWVzLCBzdWNoIGFzIEphdmFTZXJ2ZXIgUGFnZXMNCi1maWxlcywgYW5kIHBvc3NpYmx5IGRhdGEgYWNjZXNzIHJlc291cmNlcy48L3A+DQotPHA+VGhvdWdoIHRoZSBXZWIgcHJvamVjdCBpcyBzdHJ1Y3R1cmVkIG9uIHlvdXIgZmlsZSBzeXN0ZW0gaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIEphdmEgRUUgV2ViIGFwcGxpY2F0aW9uIHN0YW5kYXJkIGZvciBkZXBsb3ltZW50IHB1cnBvc2VzLCB0aGUgUHJvamVjdA0KLUV4cGxvcmVyIHZpZXcgaXMgZGVzaWduZWQgdG8gc2hvdyB0aGUgbW9zdCBjb252ZW5pZW50IGRpc3BsYXkgb2YgcHJvamVjdCByZXNvdXJjZXMNCi1mb3IgdXNlIHdoaWxlIHlvdSBhcmUgYWN0dWFsbHkgZGV2ZWxvcGluZyB0aGUgV2ViIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSBhcmUNCi1maW5pc2hlZCBkZXZlbG9waW5nIHlvdXIgV2ViIGFwcGxpY2F0aW9uLCB5b3UgdXNlIHRoZSBXZWIgcHJvamVjdCB0byBkZXBsb3kNCi10aGUgY29ycmVjdCByZXNvdXJjZXMgdG8gdGhlIHNlcnZlci4gVGhlc2UgcmVzb3VyY2VzIHdpbGwgYmUgcGFja2FnZWQgaW4gYQ0KLWZpbGUgY2FsbGVkIGEgV2ViIGFyY2hpdmUsIG9yIFdBUiBmaWxlLjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliZmFlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnByb2plY3RzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXZWIgcHJvamVjdHMiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIG92ZXJ2aWV3LCBXZWIgYXBwbGljYXRpb25zLCBjcmVhdGluZyBvciBpbXBvcnRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIG92ZXJ2aWV3LCBXZWIgYXBwbGljYXRpb25zLCBjcmVhdGluZyBvciBpbXBvcnRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2NzdGF0aWMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njd2VicHJqLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmVzdGEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3dlYnByb2plY3RzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V2ViIHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd2VicHJvamVjdHMiPjxhIG5hbWU9ImN3ZWJwcm9qZWN0cyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2ViIHByb2plY3RzPC9oMT4KLQotCi08ZGl2PgotPHA+V2ViIHByb2plY3RzIGhvbGQgYWxsIG9mIHRoZSBXZWIgcmVzb3VyY2VzIHRoYXQgYXJlIGNyZWF0ZWQgYW5kIHVzZWQgd2hlbgotZGV2ZWxvcGluZyB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpcnN0IHN0ZXAgdG8gY3JlYXRpbmcgb3IgaW1wb3J0aW5nIGEKLVdlYiBhcHBsaWNhdGlvbiBpcyB0byBjcmVhdGUgZWl0aGVyIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdC4gU3RhdGljCi1XZWIgcHJvamVjdHMgYXJlIG1lYW50IHRvIGNvbnRhaW4gb25seSBzaW1wbGUgV2ViIHNpdGUgcmVzb3VyY2VzLCBzdWNoIGFzCi1IVE1MIGZpbGVzLiBEeW5hbWljIFdlYiBwcm9qZWN0cyBhcmUgdXNlZCB0byBzdHJ1Y3R1cmUgV2ViIGFwcGxpY2F0aW9ucyB0aGF0Ci13aWxsIHVzZSBtb3JlIGNvbXBsaWNhdGVkLCBkeW5hbWljIFdlYiB0ZWNobm9sb2dpZXMsIHN1Y2ggYXMgSmF2YVNlcnZlciBQYWdlcwotZmlsZXMsIGFuZCBwb3NzaWJseSBkYXRhIGFjY2VzcyByZXNvdXJjZXMuPC9wPgotCi08cD5UaG91Z2ggdGhlIFdlYiBwcm9qZWN0IGlzIHN0cnVjdHVyZWQgb24geW91ciBmaWxlIHN5c3RlbSBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBKYXZhIEVFIFdlYiBhcHBsaWNhdGlvbiBzdGFuZGFyZCBmb3IgZGVwbG95bWVudCBwdXJwb3NlcywgdGhlIFByb2plY3QKLUV4cGxvcmVyIHZpZXcgaXMgZGVzaWduZWQgdG8gc2hvdyB0aGUgbW9zdCBjb252ZW5pZW50IGRpc3BsYXkgb2YgcHJvamVjdCByZXNvdXJjZXMKLWZvciB1c2Ugd2hpbGUgeW91IGFyZSBhY3R1YWxseSBkZXZlbG9waW5nIHRoZSBXZWIgYXBwbGljYXRpb24uIFdoZW4geW91IGFyZQotZmluaXNoZWQgZGV2ZWxvcGluZyB5b3VyIFdlYiBhcHBsaWNhdGlvbiwgeW91IHVzZSB0aGUgV2ViIHByb2plY3QgdG8gZGVwbG95Ci10aGUgY29ycmVjdCByZXNvdXJjZXMgdG8gdGhlIHNlcnZlci4gVGhlc2UgcmVzb3VyY2VzIHdpbGwgYmUgcGFja2FnZWQgaW4gYQotZmlsZSBjYWxsZWQgYSBXZWIgYXJjaGl2ZSwgb3IgV0FSIGZpbGUuPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3N0YXRpYy5odG1sIiB0aXRsZT0iIj5TdGF0aWMgV2ViIHByb2plY3RzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2N3ZWJwcmouaHRtbCIgdGl0bGU9IiI+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiIHRpdGxlPSIiPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXN0YS5odG1sIj5DcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmOGQ3MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd2VicmVzb3VyY2VzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgcmVzb3VyY2VzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcmVzb3VyY2VzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5JbiBtb3N0IGNhc2VzLCBhbGwgb2YgdGhlIHJlc291cmNlcyB0aGF0IHlvdSBuZWVkIHRvIGNyZWF0ZSBmb3IgeW91ciBXZWINCi1hcHBsaWNhdGlvbiBhcmUgZGV2ZWxvcGVkIGR1cmluZyBXZWIgc2l0ZSBvciBXZWIgcGFnZSBkZXNpZ247IGhvd2V2ZXIsIHRoZXJlDQotYXJlIGFkZGl0aW9uYWwgcmVzb3VyY2VzIHRoYXQgeW91IG1heSBuZWVkIHRvIGluY2x1ZGUgaW4geW91ciBXZWIgcHJvamVjdA0KLWlmIHlvdSBhcmUgdXNpbmcgbW9yZSBhZHZhbmNlZCBXZWIgdGVjaG5vbG9naWVzIGluIHlvdXIgYXBwbGljYXRpb24uPC9wPg0KLTxwPlRoZXNlIFdlYiByZXNvdXJjZXMgYXJlIG5vdCB0eXBpY2FsIFdlYiBwYWdlIGZpbGVzLCBhbmQgYXJlIG9mdGVuIG5vdCB0aGUNCi1yZXNvdXJjZXMgdGhhdCB5b3UgY29uc2lkZXIgcGFydCBvZiB0aGUgZmluYWwgV2ViIHNpdGUuIEZvciBleGFtcGxlLCB0YWcgbGlicmFyaWVzDQotYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiByZXNvdXJjZXMsDQotc3VjaCBhcyBKQVIgZmlsZXMsIGFyZSByZXNvdXJjZXMgeW91IG1pZ2h0IG5lZWQgdG8gaW5jbHVkZSBpbiB5b3VyIFdlYiBwcm9qZWN0LiA8L3A+DQotPHA+SW4gZmFjdCwgZXZlbiB0aGUgV0FSIGZpbGUgaXRzZWxmIGNvdWxkIGJlIGNvbnNpZGVyZWQgYSBXZWIgcmVzb3VyY2UsIGlmDQoteW91IGNvbnNpZGVyIGltcG9ydGluZyBvciBleHBvcnRpbmcgdGhlIHJlc291cmNlLjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDMzMDBiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXZWIgcmVzb3VyY2VzIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHJlc291cmNlcywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcmVzb3VyY2VzLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3ZWJyZXNvdXJjZXMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5XZWIgcmVzb3VyY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd2VicmVzb3VyY2VzIj48YSBuYW1lPSJjd2VicmVzb3VyY2VzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgcmVzb3VyY2VzPC9oMT4KLQotCi08ZGl2PgotPHA+SW4gbW9zdCBjYXNlcywgYWxsIG9mIHRoZSByZXNvdXJjZXMgdGhhdCB5b3UgbmVlZCB0byBjcmVhdGUgZm9yIHlvdXIgV2ViCi1hcHBsaWNhdGlvbiBhcmUgZGV2ZWxvcGVkIGR1cmluZyBXZWIgc2l0ZSBvciBXZWIgcGFnZSBkZXNpZ247IGhvd2V2ZXIsIHRoZXJlCi1hcmUgYWRkaXRpb25hbCByZXNvdXJjZXMgdGhhdCB5b3UgbWF5IG5lZWQgdG8gaW5jbHVkZSBpbiB5b3VyIFdlYiBwcm9qZWN0Ci1pZiB5b3UgYXJlIHVzaW5nIG1vcmUgYWR2YW5jZWQgV2ViIHRlY2hub2xvZ2llcyBpbiB5b3VyIGFwcGxpY2F0aW9uLjwvcD4KLQotPHA+VGhlc2UgV2ViIHJlc291cmNlcyBhcmUgbm90IHR5cGljYWwgV2ViIHBhZ2UgZmlsZXMsIGFuZCBhcmUgb2Z0ZW4gbm90IHRoZQotcmVzb3VyY2VzIHRoYXQgeW91IGNvbnNpZGVyIHBhcnQgb2YgdGhlIGZpbmFsIFdlYiBzaXRlLiBGb3IgZXhhbXBsZSwgdGFnIGxpYnJhcmllcwotYW5kIEphdmHihKIgcmVzb3VyY2VzLAotc3VjaCBhcyBKQVIgZmlsZXMsIGFyZSByZXNvdXJjZXMgeW91IG1pZ2h0IG5lZWQgdG8gaW5jbHVkZSBpbiB5b3VyIFdlYiBwcm9qZWN0LiA8L3A+Ci0KLTxwPkluIGZhY3QsIGV2ZW4gdGhlIFdBUiBmaWxlIGl0c2VsZiBjb3VsZCBiZSBjb25zaWRlcmVkIGEgV2ViIHJlc291cmNlLCBpZgoteW91IGNvbnNpZGVyIGltcG9ydGluZyBvciBleHBvcnRpbmcgdGhlIHJlc291cmNlLjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCIgdGl0bGU9IiI+V2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZmlsdGJuLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dmaWx0Ym4uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkODc1YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dmaWx0Ym4uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3dmaWx0Ym4iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkxpc3RlbmVyczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+ZmlsdGVyczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+RmlsdGVycyBhcmUgbmV3IGluIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldA0KLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPi4gVGhleSBlbmFibGUgeW91IHRvIGludGVyY2VwdCB0byBpbnRlcmNlcHQgYQ0KLXJlcXVlc3QgYmVmb3JlIGl0IHJlYWNoZXMgYSByZXNvdXJjZS4gSW4gb3RoZXIgd29yZHMsIGEgZmlsdGVyIGdpdmVzIHlvdQ0KLWFjY2VzcyB0byB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0IGFuZCB0aGUgSHR0cFNlcnZsZXRSZXNwb25zZSBvYmplY3RzDQotYmVmb3JlIHRoZXkgYXJlIHBhc3NlZCBvbiB0byBhIHNlcnZsZXQuPC9wPg0KLTxwPkZpbHRlcnMgY2FuIGJlIHZlcnkgdXNlZnVsLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB3cml0ZSBhIGZpbHRlcg0KLXRoYXQgcmVjb3JkcyBhbGwgaW5jb21pbmcgcmVxdWVzdHMgYW5kIGxvZ3MgdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUNCi1jb21wdXRlcnMgZnJvbSB3aGljaCB0aGUgcmVxdWVzdHMgb3JpZ2luYXRlLiBZb3UgYWxzbyBjYW4gdXNlIGEgZmlsdGVyDQotYXMgYW4gZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBkZXZpY2UuIE90aGVyIHVzZXMgaW5jbHVkZSB1c2VyDQotYXV0aGVudGljYXRpb24sIGRhdGEgY29tcHJlc3Npb24sIHVzZXIgaW5wdXQgdmFsaWRhdGlvbiwgYW5kIHNvIG9uLjwvcD4NCi08cD5Zb3UgYWxzbyBjYW4gcHV0IGEgc2V0IG9mIGZpbHRlcnMgaW4gYSBjaGFpbi4gVGhlIGZpcnN0IGZpbHRlciBpbg0KLXRoZSBjaGFpbiB3aWxsIGJlIGNhbGxlZCBmaXJzdCBhbmQgdGhlbiBwYXNzIGNvbnRyb2wgdG8gdGhlIHNlY29uZA0KLWZpbHRlciwgYW5kIHNvIG9uLiBGaWx0ZXIgY2hhaW5pbmcgZW5zdXJlcyB0aGF0IHlvdSBjYW4gd3JpdGUgYSBmaWx0ZXINCi10aGF0IGRvZXMgYSBzcGVjaWZpYyB0YXNrIGJ1dCBhZGRzIHNvbWUgZnVuY3Rpb25hbGl0eSBpbiBhbm90aGVyIGZpbHRlci48L3A+DQotPHA+V2hlbiB3cml0aW5nIGEgZmlsdGVyLCB5b3UgYmFzaWNhbGx5IGRlYWwgd2l0aCB0aGUNCi1mb2xsb3dpbmcgdGhyZWUgaW50ZXJmYWNlcyBpbiB0aGUgamF2YXguc2VydmxldCBwYWNrYWdlOg0KLTx1bD4NCi0JPGxpPjxiPmphdmF4LnNlcnZsZXQuRmlsdGVyOjwvYj4gcmVwcmVzZW50cyB0aGUNCi0JbGlmZS1jeWNsZSBvZiB0aGUgZmlsdGVyLjwvbGk+DQotCTxsaT48Yj5qYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzo8L2I+IHJlcHJlc2VudHMgdGhlDQotCWNvbmZpZ3VyYXRpb24gb2YgdGhlIGZpbHRlci48L2xpPg0KLQk8bGk+PGI+amF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjo8L2I+IG9iamVjdCBwcm92aWRlZCBieQ0KLQl0aGUgc2VydmxldCBjb250YWluZXIgdG8gdGhlIGRldmVsb3BlciBnaXZpbmcgYSB2aWV3IGludG8gdGhlDQotCWludm9jYXRpb24gY2hhaW4gb2YgYSBmaWx0ZXJlZCByZXF1ZXN0IGZvciBhIHJlc291cmNlLjwvbGk+DQotPC91bD48L3A+DQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZmlsdGVycywgcmVmZXIgdG8gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldA0KLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBhdCA8Y29kZXBoPmphdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWw8L2NvZGVwaD4uPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZmlsdGJuLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dmaWx0Ym4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNTIyOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dmaWx0Ym4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikxpc3RlbmVycyIgLz4KLTxtZXRhIGNvbnRlbnQ9ImZpbHRlcnMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iZmlsdGVycywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dzZXJ2Ym4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3d0b3Zlci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdzcnZ3aXouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3bHN0d2l6Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2ZsdHdpei5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3ZmlsdGJuIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+TGlzdGVuZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd2ZpbHRibiI+PGEgbmFtZT0iY3dmaWx0Ym4iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkxpc3RlbmVyczwvaDE+Ci0KLQotPGRpdj4KLTxwPkZpbHRlcnMgYXJlIG5ldyBpbiB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQKLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPi4gVGhleSBlbmFibGUgeW91IHRvIGludGVyY2VwdCB0byBpbnRlcmNlcHQgYQotcmVxdWVzdCBiZWZvcmUgaXQgcmVhY2hlcyBhIHJlc291cmNlLiBJbiBvdGhlciB3b3JkcywgYSBmaWx0ZXIgZ2l2ZXMgeW91Ci1hY2Nlc3MgdG8gdGhlIEh0dHBTZXJ2bGV0UmVxdWVzdCBhbmQgdGhlIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb2JqZWN0cwotYmVmb3JlIHRoZXkgYXJlIHBhc3NlZCBvbiB0byBhIHNlcnZsZXQuPC9wPgotCi08cD5GaWx0ZXJzIGNhbiBiZSB2ZXJ5IHVzZWZ1bC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gd3JpdGUgYSBmaWx0ZXIKLXRoYXQgcmVjb3JkcyBhbGwgaW5jb21pbmcgcmVxdWVzdHMgYW5kIGxvZ3MgdGhlIElQIGFkZHJlc3NlcyBvZiB0aGUKLWNvbXB1dGVycyBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0cyBvcmlnaW5hdGUuIFlvdSBhbHNvIGNhbiB1c2UgYSBmaWx0ZXIKLWFzIGFuIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gZGV2aWNlLiBPdGhlciB1c2VzIGluY2x1ZGUgdXNlcgotYXV0aGVudGljYXRpb24sIGRhdGEgY29tcHJlc3Npb24sIHVzZXIgaW5wdXQgdmFsaWRhdGlvbiwgYW5kIHNvIG9uLjwvcD4KLQotPHA+WW91IGFsc28gY2FuIHB1dCBhIHNldCBvZiBmaWx0ZXJzIGluIGEgY2hhaW4uIFRoZSBmaXJzdCBmaWx0ZXIgaW4KLXRoZSBjaGFpbiB3aWxsIGJlIGNhbGxlZCBmaXJzdCBhbmQgdGhlbiBwYXNzIGNvbnRyb2wgdG8gdGhlIHNlY29uZAotZmlsdGVyLCBhbmQgc28gb24uIEZpbHRlciBjaGFpbmluZyBlbnN1cmVzIHRoYXQgeW91IGNhbiB3cml0ZSBhIGZpbHRlcgotdGhhdCBkb2VzIGEgc3BlY2lmaWMgdGFzayBidXQgYWRkcyBzb21lIGZ1bmN0aW9uYWxpdHkgaW4gYW5vdGhlciBmaWx0ZXIuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5XaGVuIHdyaXRpbmcgYSBmaWx0ZXIsIHlvdSBiYXNpY2FsbHkgZGVhbCB3aXRoIHRoZQotZm9sbG93aW5nIHRocmVlIGludGVyZmFjZXMgaW4gdGhlIGphdmF4LnNlcnZsZXQgcGFja2FnZToKLTx1bD4KLQk8bGk+PHN0cm9uZz5qYXZheC5zZXJ2bGV0LkZpbHRlcjo8L3N0cm9uZz4gcmVwcmVzZW50cyB0aGUKLQlsaWZlLWN5Y2xlIG9mIHRoZSBmaWx0ZXIuPC9saT4KLQotCTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOjwvc3Ryb25nPiByZXByZXNlbnRzIHRoZQotCWNvbmZpZ3VyYXRpb24gb2YgdGhlIGZpbHRlci48L2xpPgotCi0JPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjo8L3N0cm9uZz4gb2JqZWN0IHByb3ZpZGVkIGJ5Ci0JdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIHRoZSBkZXZlbG9wZXIgZ2l2aW5nIGEgdmlldyBpbnRvIHRoZQotCWludm9jYXRpb24gY2hhaW4gb2YgYSBmaWx0ZXJlZCByZXF1ZXN0IGZvciBhIHJlc291cmNlLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZmlsdGVycywgcmVmZXIgdG8gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YeKEoiBTZXJ2bGV0Ci0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYXQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+amF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbDwvc2FtcD4uPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIiB0aXRsZT0iIj5TZXJ2bGV0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIHRpdGxlPSIiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd3RvdmVyLmh0bWwiIHRpdGxlPSIiPldlYiBhcHBsaWNhdGlvbiBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdzcnZ3aXouaHRtbCI+Q3JlYXRpbmcgU2VydmxldHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIj5DcmVhdGluZyBMaXN0ZW5lcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2ZsdHdpei5odG1sIj5DcmVhdGluZyBGaWx0ZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2xpc3Ribi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3bGlzdGJuLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTUxMzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3bGlzdGJuLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3bGlzdGJuIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5MaXN0ZW5lcnM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmxpc3RlbmVyczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+TGlzdGVuZXJzIGFyZSBuZXcgZmVhdHVyZSBpbiB0aGUgPGNpdGU+U3VuDQotTWljcm9zeXN0ZW1zIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LiBBIGxpc3RlbmVyIGNhbiBiZSB1c2VkIHRvIG1vbml0b3IgYW5kDQotcmVhY3QgdG8gZXZlbnRzIGluIGEgc2VydmxldCdzIGxpZmUtY3ljbGUgYnkgZGVmaW5pbmcgbWV0aG9kcyB0aGF0IGdldA0KLWludm9rZWQgd2hlbiBsaWZlLWN5Y2xlIGV2ZW50cyBvY2N1ci4gU3VwcG9ydCBmb3IgYXBwbGljYXRpb24gbGV2ZWwNCi1ldmVudHMgaXMgZGVmaW5lZCBpbiB0aGUgSmF2YSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gMi4zLjwvcD4NCi08cD5BcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMgYXJlIGNsYXNzZXMgdGhhdA0KLWltcGxlbWVudCBvbmUgb3IgbW9yZSBvZiB0aGUgc2VydmxldCBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2VzLiBTZXJ2bGV0DQotZXZlbnQgbGlzdGVuZXJzIHN1cHBvcnQgbm90aWZpY2F0aW9uIGZvciBzdGF0ZSBjaGFuZ2VzIGluIHRoZQ0KLTxiPlNlcnZsZXRDb250ZXh0PC9iPiBhbmQgPGI+SHR0cFNlc3Npb248L2I+IG9iamVjdHMsIHNwZWNpZmljYWxseToNCi08dWw+DQotCTxsaT48Yj5TZXJ2bGV0IGNvbnRleHQgbGlzdGVuZXJzPC9iPiBhcmUgdXNlZCB0byBtYW5hZ2UgcmVzb3VyY2VzIG9yIHN0YXRlIGhlbGQgYXQgYSBWTQ0KLQlsZXZlbCBmb3IgdGhlIGFwcGxpY2F0aW9uLjwvbGk+DQotCTxsaT48Yj5IVFRQIHNlc3Npb24JbGlzdGVuZXJzPC9iPiBhcmUgdXNlZCB0byBtYW5hZ2Ugc3RhdGUgb3IgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhDQotCXNlcmllcyBvZiByZXF1ZXN0cyBtYWRlIGluIGEgV2ViIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNhbWUgY2xpZW50IG9yDQotCXVzZXIuPC9saT4NCi08L3VsPjwvcD4NCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBsaXN0ZW5lcnMsIHJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQNCi0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYXQgPGNvZGVwaD5qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sPC9jb2RlcGg+LjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2xpc3Ribi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3bGlzdGJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTEwOWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3bGlzdGJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJMaXN0ZW5lcnMiIC8+Ci08bWV0YSBjb250ZW50PSJsaXN0ZW5lcnMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ibGlzdGVuZXJzLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njd3RvdmVyLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d3Nydndpei5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdsc3R3aXouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Zmx0d2l6Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3dsaXN0Ym4iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5MaXN0ZW5lcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3bGlzdGJuIj48YSBuYW1lPSJjd2xpc3RibiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TGlzdGVuZXJzPC9oMT4KLQotCi08ZGl2PgotPHA+TGlzdGVuZXJzIGFyZSBuZXcgZmVhdHVyZSBpbiB0aGUgPGNpdGU+U3VuCi1NaWNyb3N5c3RlbXMgSmF2YeKEoiBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPi4gQSBsaXN0ZW5lciBjYW4gYmUgdXNlZCB0byBtb25pdG9yIGFuZAotcmVhY3QgdG8gZXZlbnRzIGluIGEgc2VydmxldCdzIGxpZmUtY3ljbGUgYnkgZGVmaW5pbmcgbWV0aG9kcyB0aGF0IGdldAotaW52b2tlZCB3aGVuIGxpZmUtY3ljbGUgZXZlbnRzIG9jY3VyLiBTdXBwb3J0IGZvciBhcHBsaWNhdGlvbiBsZXZlbAotZXZlbnRzIGlzIGRlZmluZWQgaW4gdGhlIEphdmEgU2VydmxldCBTcGVjaWZpY2F0aW9uIDIuMy48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPkFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycyBhcmUgY2xhc3NlcyB0aGF0Ci1pbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIHNlcnZsZXQgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlcy4gU2VydmxldAotZXZlbnQgbGlzdGVuZXJzIHN1cHBvcnQgbm90aWZpY2F0aW9uIGZvciBzdGF0ZSBjaGFuZ2VzIGluIHRoZQotPHN0cm9uZz5TZXJ2bGV0Q29udGV4dDwvc3Ryb25nPiBhbmQgPHN0cm9uZz5IdHRwU2Vzc2lvbjwvc3Ryb25nPiBvYmplY3RzLCBzcGVjaWZpY2FsbHk6Ci08dWw+Ci0JPGxpPjxzdHJvbmc+U2VydmxldCBjb250ZXh0IGxpc3RlbmVyczwvc3Ryb25nPiBhcmUgdXNlZCB0byBtYW5hZ2UgcmVzb3VyY2VzIG9yIHN0YXRlIGhlbGQgYXQgYSBWTQotCWxldmVsIGZvciB0aGUgYXBwbGljYXRpb24uPC9saT4KLQotCTxsaT48c3Ryb25nPkhUVFAgc2Vzc2lvbglsaXN0ZW5lcnM8L3N0cm9uZz4gYXJlIHVzZWQgdG8gbWFuYWdlIHN0YXRlIG9yIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYQotCXNlcmllcyBvZiByZXF1ZXN0cyBtYWRlIGluIGEgV2ViIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNhbWUgY2xpZW50IG9yCi0JdXNlci48L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGxpc3RlbmVycywgcmVmZXIgdG8gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0Ci0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYXQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+amF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbDwvc2FtcD4uPC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIiB0aXRsZT0iIj5TZXJ2bGV0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3ZmlsdGJuLmh0bWwiIHRpdGxlPSIiPkxpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd3RvdmVyLmh0bWwiIHRpdGxlPSIiPldlYiBhcHBsaWNhdGlvbiBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdzcnZ3aXouaHRtbCI+Q3JlYXRpbmcgU2VydmxldHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIj5DcmVhdGluZyBMaXN0ZW5lcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2ZsdHdpei5odG1sIj5DcmVhdGluZyBGaWx0ZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjU4MTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3c2VydmJuIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXJ2bGV0czwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c2VydmxldHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5XZWINCi1zZXJ2ZXJzPGluZGV4dGVybT5nZW5lcmF0aW5nIGR5bmFtaWMgY29udGVudDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5TZXJ2bGV0cyBhcmUgc2VydmVyLXNpZGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvZ3JhbXMgdGhhdCB1c2UgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldA0KLUFQSTwvY2l0ZT4gYW5kIGl0cyBhc3NvY2lhdGVkIGNsYXNzZXMgYW5kIG1ldGhvZHMsIGFzIGRlZmluZWQgaW4gdGhlIDxjaXRlPlN1bg0KLU1pY3Jvc3lzdGVtcyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPi4gVGhlc2UgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvZ3JhbXMNCi1leHRlbmQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYSBXZWIgc2VydmVyIGJ5IGdlbmVyYXRpbmcgZHluYW1pYyBjb250ZW50IGFuZA0KLXJlc3BvbmRpbmcgdG8gV2ViIGNsaWVudCByZXF1ZXN0cy4gV2hlbiBhIGJyb3dzZXIgc2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIsDQotdGhlIHNlcnZlciBjYW4gc2VuZCB0aGUgcmVxdWVzdCBpbmZvcm1hdGlvbiB0byBhIHNlcnZsZXQsIHNvIHRoYXQgdGhlIHNlcnZsZXQNCi1jYW4gY29uc3RydWN0IHRoZSByZXNwb25zZSB0aGF0IGlzIHNlbnQgYmFjayB0byB0aGUgYnJvd3Nlci48L3A+DQotPHA+SnVzdCBhcyBhcHBsZXRzIHJ1biBvbiBhIFdlYiBicm93c2VyIGFuZCBleHRlbmQgdGhlIGJyb3dzZXIncyBjYXBhYmlsaXRpZXMsDQotc2VydmxldHMgcnVuIG9uIGEgSmF2YS1lbmFibGVkIFdlYiBzZXJ2ZXIgYW5kIGV4dGVuZCB0aGUgc2VydmVyJ3MgY2FwYWJpbGl0aWVzLg0KLUJlY2F1c2Ugb2YgdGhlaXIgZmxleGliaWxpdHkgYW5kIHNjYWxhYmlsaXR5LCBzZXJ2bGV0cyBhcmUgY29tbW9ubHkgdXNlZCB0bw0KLWVuYWJsZSBidXNpbmVzc2VzIHRvIGNvbm5lY3QgZGF0YWJhc2VzIHRvIHRoZSBXZWIuPC9wPg0KLTxwPkFsdGhvdWdoIGEgc2VydmxldCBjYW4gYmUgYSBjb21wbGV0ZWx5IHNlbGYtY29udGFpbmVkIHByb2dyYW0sIHlvdSBjYW4NCi1zcGxpdCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCBpbnRvIHR3byBwb3J0aW9uczogIDx1bD4NCi08bGk+VGhlIGJ1c2luZXNzIGxvZ2ljIChjb250ZW50IGdlbmVyYXRpb24pLCB3aGljaCBnb3Zlcm5zIHRoZSByZWxhdGlvbnNoaXANCi1iZXR3ZWVuIGlucHV0LCBwcm9jZXNzaW5nLCBhbmQgb3V0cHV0PC9saT4NCi08bGk+VGhlIHByZXNlbnRhdGlvbiBsb2dpYyAoY29udGVudCBwcmVzZW50YXRpb24sIG9yIGdyYXBoaWMgZGVzaWduIHJ1bGVzKSwNCi13aGljaCBkZXRlcm1pbmVzIGhvdyBpbmZvcm1hdGlvbiBpcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXI8L2xpPg0KLTwvdWw+VXNpbmcgdGhpcyBwYXJhZGlnbSwgeW91IG1heSBjaG9vc2UgdG8gaGF2ZSBidXNpbmVzcyBsb2dpYyBoYW5kbGVkIGJ5IDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJlYW5zLA0KLXRoZSBwcmVzZW50YXRpb24gbG9naWMgaGFuZGxlZCBieSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIG9yIEhUTUwgZmlsZXMsIGFuZA0KLXRoZSBIVFRQIHByb3RvY29sIGhhbmRsZWQgYnkgYSBzZXJ2bGV0LjwvcD4NCi08bm90ZT5KU1AgZmlsZXMgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIGJvdGggdGhlIHByZXNlbnRhdGlvbiBhbmQgYnVzaW5lc3MgbG9naWMNCi1mb3IgYSBXZWIgYXBwbGljYXRpb24uIEpTUCBmaWxlcyB1c2Ugc3RydWN0dXJlZCBtYXJrdXAgZm9yIHByZXNlbnRhdGlvbiwgYW5kDQotc3VwcGx5IHNlcnZsZXQgbW9kZWwgYmVoYXZpb3IgYXQgcnVuIHRpbWUuPC9ub3RlPg0KLTxwPllvdSBjYW4gZGV2ZWxvcCwgZGVidWcsIGFuZCBkZXBsb3kgc2VydmxldHMsIHNldCBicmVha3BvaW50cyB3aXRoaW4gc2VydmxldA0KLW9iamVjdHMsIGFuZCBzdGVwIHRocm91Z2ggY29kZSB0byBtYWtlIGNoYW5nZXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgZm9sZGVkDQotaW50byB0aGUgcnVubmluZyBzZXJ2bGV0IG9uIGEgcnVubmluZyBzZXJ2ZXIsIHdpdGhvdXQgaGF2aW5nIHRvIHJlc3RhcnQgZWFjaA0KLXRpbWUuPC9wPg0KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHNlcnZsZXRzLCByZWZlciB0byB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0DQotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGF0IDxjb2RlcGg+amF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbDwvY29kZXBoPi48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dzZXJ2Ym4uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDcxZTc4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2VydmxldHMiIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2bGV0cywgb3ZlcnZpZXcsIFdlYiBzZXJ2ZXJzLCBnZW5lcmF0aW5nIGR5bmFtaWMgY29udGVudCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNlcnZsZXRzLCBvdmVydmlldywgV2ViIHNlcnZlcnMsIGdlbmVyYXRpbmcgZHluYW1pYyBjb250ZW50IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2ZpbHRibi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2N3dG92ZXIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3c3J2d2l6Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdmbHR3aXouaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd3NlcnZibiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNlcnZsZXRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd3NlcnZibiI+PGEgbmFtZT0iY3dzZXJ2Ym4iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNlcnZsZXRzPC9oMT4KLQotCi08ZGl2PgotPHA+U2VydmxldHMgYXJlIHNlcnZlci1zaWRlIEphdmHihKIgcHJvZ3JhbXMgdGhhdCB1c2UgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0Ci1BUEk8L2NpdGU+IGFuZCBpdHMgYXNzb2NpYXRlZCBjbGFzc2VzIGFuZCBtZXRob2RzLCBhcyBkZWZpbmVkIGluIHRoZSA8Y2l0ZT5TdW4KLU1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LiBUaGVzZSBKYXZhIHByb2dyYW1zCi1leHRlbmQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYSBXZWIgc2VydmVyIGJ5IGdlbmVyYXRpbmcgZHluYW1pYyBjb250ZW50IGFuZAotcmVzcG9uZGluZyB0byBXZWIgY2xpZW50IHJlcXVlc3RzLiBXaGVuIGEgYnJvd3NlciBzZW5kcyBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciwKLXRoZSBzZXJ2ZXIgY2FuIHNlbmQgdGhlIHJlcXVlc3QgaW5mb3JtYXRpb24gdG8gYSBzZXJ2bGV0LCBzbyB0aGF0IHRoZSBzZXJ2bGV0Ci1jYW4gY29uc3RydWN0IHRoZSByZXNwb25zZSB0aGF0IGlzIHNlbnQgYmFjayB0byB0aGUgYnJvd3Nlci48L3A+Ci0KLTxwPkp1c3QgYXMgYXBwbGV0cyBydW4gb24gYSBXZWIgYnJvd3NlciBhbmQgZXh0ZW5kIHRoZSBicm93c2VyJ3MgY2FwYWJpbGl0aWVzLAotc2VydmxldHMgcnVuIG9uIGEgSmF2YS1lbmFibGVkIFdlYiBzZXJ2ZXIgYW5kIGV4dGVuZCB0aGUgc2VydmVyJ3MgY2FwYWJpbGl0aWVzLgotQmVjYXVzZSBvZiB0aGVpciBmbGV4aWJpbGl0eSBhbmQgc2NhbGFiaWxpdHksIHNlcnZsZXRzIGFyZSBjb21tb25seSB1c2VkIHRvCi1lbmFibGUgYnVzaW5lc3NlcyB0byBjb25uZWN0IGRhdGFiYXNlcyB0byB0aGUgV2ViLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+QWx0aG91Z2ggYSBzZXJ2bGV0IGNhbiBiZSBhIGNvbXBsZXRlbHkgc2VsZi1jb250YWluZWQgcHJvZ3JhbSwgeW91IGNhbgotc3BsaXQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgaW50byB0d28gcG9ydGlvbnM6ICA8dWw+Ci08bGk+VGhlIGJ1c2luZXNzIGxvZ2ljIChjb250ZW50IGdlbmVyYXRpb24pLCB3aGljaCBnb3Zlcm5zIHRoZSByZWxhdGlvbnNoaXAKLWJldHdlZW4gaW5wdXQsIHByb2Nlc3NpbmcsIGFuZCBvdXRwdXQ8L2xpPgotCi08bGk+VGhlIHByZXNlbnRhdGlvbiBsb2dpYyAoY29udGVudCBwcmVzZW50YXRpb24sIG9yIGdyYXBoaWMgZGVzaWduIHJ1bGVzKSwKLXdoaWNoIGRldGVybWluZXMgaG93IGluZm9ybWF0aW9uIGlzIHByZXNlbnRlZCB0byB0aGUgdXNlcjwvbGk+Ci0KLTwvdWw+Ci1Vc2luZyB0aGlzIHBhcmFkaWdtLCB5b3UgbWF5IGNob29zZSB0byBoYXZlIGJ1c2luZXNzIGxvZ2ljIGhhbmRsZWQgYnkgSmF2YSBiZWFucywKLXRoZSBwcmVzZW50YXRpb24gbG9naWMgaGFuZGxlZCBieSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIG9yIEhUTUwgZmlsZXMsIGFuZAotdGhlIEhUVFAgcHJvdG9jb2wgaGFuZGxlZCBieSBhIHNlcnZsZXQuPC9kaXY+Ci0KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBKU1AgZmlsZXMgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIGJvdGggdGhlIHByZXNlbnRhdGlvbiBhbmQgYnVzaW5lc3MgbG9naWMKLWZvciBhIFdlYiBhcHBsaWNhdGlvbi4gSlNQIGZpbGVzIHVzZSBzdHJ1Y3R1cmVkIG1hcmt1cCBmb3IgcHJlc2VudGF0aW9uLCBhbmQKLXN1cHBseSBzZXJ2bGV0IG1vZGVsIGJlaGF2aW9yIGF0IHJ1biB0aW1lLjwvZGl2PgotCi08cD5Zb3UgY2FuIGRldmVsb3AsIGRlYnVnLCBhbmQgZGVwbG95IHNlcnZsZXRzLCBzZXQgYnJlYWtwb2ludHMgd2l0aGluIHNlcnZsZXQKLW9iamVjdHMsIGFuZCBzdGVwIHRocm91Z2ggY29kZSB0byBtYWtlIGNoYW5nZXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgZm9sZGVkCi1pbnRvIHRoZSBydW5uaW5nIHNlcnZsZXQgb24gYSBydW5uaW5nIHNlcnZlciwgd2l0aG91dCBoYXZpbmcgdG8gcmVzdGFydCBlYWNoCi10aW1lLjwvcD4KLQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc2VydmxldHMsIHJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldAotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGF0IDxzYW1wIGNsYXNzPSJjb2RlcGgiPmphdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWw8L3NhbXA+LjwvcD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dsaXN0Ym4uaHRtbCIgdGl0bGU9IiI+TGlzdGVuZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCIgdGl0bGU9IiI+TGlzdGVuZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2N3dG92ZXIuaHRtbCIgdGl0bGU9IiI+V2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d3Nydndpei5odG1sIj5DcmVhdGluZyBTZXJ2bGV0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3bHN0d2l6Lmh0bWwiPkNyZWF0aW5nIExpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Zmx0d2l6Lmh0bWwiPkNyZWF0aW5nIEZpbHRlcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3dGZlYXR1cmVzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2ZTQxNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08IS0tIEFyYm9yVGV4dCwgSW5jLiwgMTk4OC0yMDAyLCB2LjQwMDIgLS0+DQotPGNvbmNlcHQgaWQ9ImN3dGZlYXR1cmVzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgdG9vbHMgZmVhdHVyZXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+IFRoZSBpbnRlZ3JhdGVkIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBtYWtlcyBpdCBlYXN5IHRvIGNvb3BlcmF0aXZlbHkNCi1jcmVhdGUsIGFzc2VtYmxlLCBwdWJsaXNoLCBkZXBsb3kgYW5kIG1haW50YWluIGR5bmFtaWMsIGludGVyYWN0aXZlIFdlYiBhcHBsaWNhdGlvbnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V2ViIHRvb2xzPGluZGV4dGVybT5mZWF0dXJlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgaGlnaC1sZXZlbCBjYXBhYmlsaXRpZXM6DQotIDx1bD4NCi08bGk+RHluYW1pYyBXZWIgcHJvamVjdCBjcmVhdGlvbiwgdXNpbmcgdGhlIEphdmEgRUUtZGVmaW5lZCBoaWVyYXJjaHksIG9yDQotYSBzdGF0aWMgdmVyc2lvbiB0aGF0IHJlZHVjZXMgcHJvamVjdCBvdmVyaGVhZCB3aGVuIGR5bmFtaWMgZWxlbWVudHMgYXJlIG5vdA0KLXJlcXVpcmVkLiAgU3RhdGljIFdlYiBwcm9qZWN0cyBjYW4gbGF0ZXIgYmUgY29udmVydGVkIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzLjxwPjwvcD48L2xpPg0KLTxsaT5DcmVhdGlvbiBhbmQgZWRpdGluZyBvZiBhIFdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxmaWxlcGF0aD53ZWIueG1sPC9maWxlcGF0aD4pDQotIGZpbGU8cD48L3A+PC9saT4NCi08bGk+SlNQIGFuZCBIVE1MIGZpbGUgY3JlYXRpb24sIHZhbGlkYXRpb24sIGVkaXRpbmcsIGFuZCBkZWJ1Z2dpbmc8cD48L3A+PC9saT4NCi08bGk+QW4gZXh0ZW5zaWJsZSB2aWV3LCBjYWxsZWQgdGhlIFNuaXBwZXRzIHZpZXcsIHdoaWNoIGFsbG93cyB1c2VycyB0byBjYXRhbG9nDQotIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwsIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+LA0KLSBhbmQgSlNQIG1hcmt1cCwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIHRhZ3MsIHRoYXQgY2FuIGJlIGVtYmVkZGVkIGluDQotIGV4aXN0aW5nIGZpbGVzPHA+PC9wPjwvbGk+DQotPGxpPkR5bmFtaWMgdGFnIGhlbHAgKGNvbnRlbnQgYXNzaXN0KSAsIHdoaWNoIGRpc3BsYXlzIHRhZyB1c2FnZSBhbmQgYXR0cmlidXRlDQotaW5mb3JtYXRpb24gZm9yICBIVE1MLCBKU1AsIGFuZCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiB0YWdzIGJhc2VkIG9uIGN1cnNvciBsb2NhdGlvbg0KLSBpbiB0aGUgU291cmNlIHBhZ2UuIChZb3UgaW52b2tlIENvbnRlbnQgQXNzaXN0IGJ5IHByZXNzaW5nIChDdHJsK1NwYWNlYmFyKQ0KLSk8cD48L3A+PC9saT4NCi08bGk+Q2FzY2FkaW5nIHN0eWxlIHNoZWV0IChDU1MpIGVkaXRpbmcgc3VwcG9ydDxwPjwvcD48L2xpPg0KLTxsaT5IVFRQL0ZUUCBpbXBvcnQ8cD48L3A+PC9saT4NCi08bGk+RlRQIGV4cG9ydCAoc2ltcGxlIHJlc291cmNlIGNvcHkpIHRvIGEgc2VydmVyPHA+PC9wPjwvbGk+DQotPGxpPldBUiBmaWxlIGltcG9ydCwgZXhwb3J0LCBhbmQgdmFsaWRhdGlvbjxwPjwvcD48L2xpPg0KLTxsaT5TZXJ2bGV0IGNyZWF0aW9uLCB3aGljaCBlbXBsb3lzIHRoZSBTZXJ2bGV0IFdpemFyZCB0byBjcmVhdGUgbmV3IHNlcnZsZXRzLjxwPjwvcD48L2xpPg0KLTwvdWw+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3dGZlYXR1cmVzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzMmU1YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldlYiB0b29scyBmZWF0dXJlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgaW50ZWdyYXRlZCBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgbWFrZXMgaXQgZWFzeSB0byBjb29wZXJhdGl2ZWx5IGNyZWF0ZSwgYXNzZW1ibGUsIHB1Ymxpc2gsIGRlcGxveSBhbmQgbWFpbnRhaW4gZHluYW1pYywgaW50ZXJhY3RpdmUgV2ViIGFwcGxpY2F0aW9ucy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGludGVncmF0ZWQgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IG1ha2VzIGl0IGVhc3kgdG8gY29vcGVyYXRpdmVseSBjcmVhdGUsIGFzc2VtYmxlLCBwdWJsaXNoLCBkZXBsb3kgYW5kIG1haW50YWluIGR5bmFtaWMsIGludGVyYWN0aXZlIFdlYiBhcHBsaWNhdGlvbnMuIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHRvb2xzLCBmZWF0dXJlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiB0b29scywgZmVhdHVyZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY2N3ZWJwcmouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3ZWJwYWdlZGVzaWduLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NyZXByai5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpjcmVqc3AuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3c3J2d2l6Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2xzdHdpei5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdmbHR3aXouaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd3RmZWF0dXJlcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldlYiB0b29scyBmZWF0dXJlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3d0ZmVhdHVyZXMiPjxhIG5hbWU9ImN3dGZlYXR1cmVzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5XZWIgdG9vbHMgZmVhdHVyZXM8L2gxPgotCi0KLQotPGRpdj48cD4gVGhlIGludGVncmF0ZWQgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IG1ha2VzIGl0IGVhc3kgdG8gY29vcGVyYXRpdmVseQotY3JlYXRlLCBhc3NlbWJsZSwgcHVibGlzaCwgZGVwbG95IGFuZCBtYWludGFpbiBkeW5hbWljLCBpbnRlcmFjdGl2ZSBXZWIgYXBwbGljYXRpb25zLjwvcD4KLQotPGRpdiBjbGFzcz0icCI+VGhlIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGhpZ2gtbGV2ZWwgY2FwYWJpbGl0aWVzOgotIDx1bD4KLTxsaT5EeW5hbWljIFdlYiBwcm9qZWN0IGNyZWF0aW9uLCB1c2luZyB0aGUgSmF2YSBFRS1kZWZpbmVkIGhpZXJhcmNoeSwgb3IKLWEgc3RhdGljIHZlcnNpb24gdGhhdCByZWR1Y2VzIHByb2plY3Qgb3ZlcmhlYWQgd2hlbiBkeW5hbWljIGVsZW1lbnRzIGFyZSBub3QKLXJlcXVpcmVkLiAgU3RhdGljIFdlYiBwcm9qZWN0cyBjYW4gbGF0ZXIgYmUgY29udmVydGVkIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzLjxwIC8+Ci08L2xpPgotCi08bGk+Q3JlYXRpb24gYW5kIGVkaXRpbmcgb2YgYSBXZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICg8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYi54bWw8L3NwYW4+KQotIGZpbGU8cCAvPgotPC9saT4KLQotPGxpPkpTUCBhbmQgSFRNTCBmaWxlIGNyZWF0aW9uLCB2YWxpZGF0aW9uLCBlZGl0aW5nLCBhbmQgZGVidWdnaW5nPHAgLz4KLTwvbGk+Ci0KLTxsaT5BbiBleHRlbnNpYmxlIHZpZXcsIGNhbGxlZCB0aGUgU25pcHBldHMgdmlldywgd2hpY2ggYWxsb3dzIHVzZXJzIHRvIGNhdGFsb2cKLSBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB04oSiLAotIGFuZCBKU1AgbWFya3VwLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gdGFncywgdGhhdCBjYW4gYmUgZW1iZWRkZWQgaW4KLSBleGlzdGluZyBmaWxlczxwIC8+Ci08L2xpPgotCi08bGk+RHluYW1pYyB0YWcgaGVscCAoY29udGVudCBhc3Npc3QpICwgd2hpY2ggZGlzcGxheXMgdGFnIHVzYWdlIGFuZCBhdHRyaWJ1dGUKLWluZm9ybWF0aW9uIGZvciAgSFRNTCwgSlNQLCBhbmQgSmF2YVNjcmlwdCB0YWdzIGJhc2VkIG9uIGN1cnNvciBsb2NhdGlvbgotIGluIHRoZSBTb3VyY2UgcGFnZS4gKFlvdSBpbnZva2UgQ29udGVudCBBc3Npc3QgYnkgcHJlc3NpbmcgKEN0cmwrU3BhY2ViYXIpCi0pPHAgLz4KLTwvbGk+Ci0KLTxsaT5DYXNjYWRpbmcgc3R5bGUgc2hlZXQgKENTUykgZWRpdGluZyBzdXBwb3J0PHAgLz4KLTwvbGk+Ci0KLTxsaT5IVFRQL0ZUUCBpbXBvcnQ8cCAvPgotPC9saT4KLQotPGxpPkZUUCBleHBvcnQgKHNpbXBsZSByZXNvdXJjZSBjb3B5KSB0byBhIHNlcnZlcjxwIC8+Ci08L2xpPgotCi08bGk+V0FSIGZpbGUgaW1wb3J0LCBleHBvcnQsIGFuZCB2YWxpZGF0aW9uPHAgLz4KLTwvbGk+Ci0KLTxsaT5TZXJ2bGV0IGNyZWF0aW9uLCB3aGljaCBlbXBsb3lzIHRoZSBTZXJ2bGV0IFdpemFyZCB0byBjcmVhdGUgbmV3IHNlcnZsZXRzLjxwIC8+Ci08L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd2VicHJqLmh0bWwiIHRpdGxlPSIiPkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sIiB0aXRsZT0iIj5XZWIgcGFnZSBkZXNpZ248L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RqY3JlanNwLmh0bWwiPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d3Nydndpei5odG1sIj5DcmVhdGluZyBTZXJ2bGV0czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3bHN0d2l6Lmh0bWwiPkNyZWF0aW5nIExpc3RlbmVyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Zmx0d2l6Lmh0bWwiPkNyZWF0aW5nIEZpbHRlcnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2Fyb3ZyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxYWRmNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3d3YXJvdnIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XQVIgZmlsZXM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPiBBIFdlYiBhcHBsaWNhdGlvbiBpcyBhIGdyb3VwIG9mIEhUTUwgcGFnZXMsIEpTUCBwYWdlcywgc2VydmxldHMsIHJlc291cmNlcw0KLWFuZCBzb3VyY2UgZmlsZSwgd2hpY2ggY2FuIGJlIG1hbmFnZWQgYXMgYSBzaW5nbGUgdW5pdC4gQSBXZWIgYXJjaGl2ZSAoV0FSKQ0KLWZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24uIFdBUiBmaWxlcyBjYW4gYmUgdXNlZCB0byBpbXBvcnQgYSBXZWINCi1hcHBsaWNhdGlvbiBpbnRvIGEgV2ViIHNlcnZlci48L3A+DQotPHA+SW4gYWRkaXRpb24gdG8gcHJvamVjdCByZXNvdXJjZXMsIHRoZSBXQVIgZmlsZSBpbmNsdWRlcyBhIFdlYiBkZXBsb3ltZW50DQotZGVzY3JpcHRvciBmaWxlLiBUaGUgV2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBhbiBYTUwgZmlsZSB0aGF0IGNvbnRhaW5zDQotZGVwbG95bWVudCBpbmZvcm1hdGlvbiwgTUlNRSB0eXBlcywgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGRldGFpbHMsIGFuZCBvdGhlcg0KLXNldHRpbmdzIGZvciBhIFdlYiBhcHBsaWNhdGlvbi4gVGhlIFdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSAoPGZpbGVwYXRoPndlYi54bWw8L2ZpbGVwYXRoPikNCi1wcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgV0FSIGZpbGUgaXMgc2hhcmVkIHdpdGggdGhlIGRldmVsb3BlcnMsIGFzc2VtYmxlcnMsDQotYW5kIGRlcGxveWVycyBpbiBhIEphdmEgRUUgZW52aXJvbm1lbnQuPC9wPg0KLTxwPlRoZSBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgcHJvdmlkZXMgZmFjaWxpdGllcyBmb3IgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcNCi1XQVIgZmlsZXMsIHVzaW5nIHRoZSBmb2xsb3dpbmcgd2l6YXJkczogPHVsPg0KLTxsaT48cGg+SW1wb3J0IFJlc291cmNlcyBmcm9tIGEgV0FSIEZpbGU8L3BoPiwgd2hpY2ggcmVxdWlyZXMgdGhhdCB5b3UgdG8NCi1zcGVjaWZ5IGEgV2ViIHByb2plY3QuIFlvdSBjYW4gdXNlIGV4aXN0aW5nIHByb2plY3RzIG9yIGNyZWF0ZSB0aGVtIGFzIHlvdQ0KLXVzZSB0aGUgd2l6YXJkLjwvbGk+DQotPGxpPjxwaD5FeHBvcnQgUmVzb3VyY2VzIHRvIGEgV0FSIEZpbGU8L3BoPiwgd2hpY2ggcmVxdWlyZXMgb25seSBhbiBleHBvcnQNCi1sb2NhdGlvbiBhbmQgc29tZSBvcHRpb25hbCBzZXR0aW5nczwvbGk+DQotPC91bD48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dhcm92ci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWI1ZDYzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dhcm92ci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIC8+Ci08bWV0YSBjb250ZW50PSJXQVIgZmlsZXMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV0FSIGZpbGVzLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2ltcHdhci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmV3YXIuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd3dhcm92ciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd3dhcm92ciI+PGEgbmFtZT0iY3d3YXJvdnIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9oMT4KLQotCi08ZGl2PgotPHA+IEEgV2ViIGFwcGxpY2F0aW9uIGlzIGEgZ3JvdXAgb2YgSFRNTCBwYWdlcywgSlNQIHBhZ2VzLCBzZXJ2bGV0cywgcmVzb3VyY2VzCi1hbmQgc291cmNlIGZpbGUsIHdoaWNoIGNhbiBiZSBtYW5hZ2VkIGFzIGEgc2luZ2xlIHVuaXQuIEEgV2ViIGFyY2hpdmUgKFdBUikKLWZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24uIFdBUiBmaWxlcyBjYW4gYmUgdXNlZCB0byBpbXBvcnQgYSBXZWIKLWFwcGxpY2F0aW9uIGludG8gYSBXZWIgc2VydmVyLjwvcD4KLQotPHA+SW4gYWRkaXRpb24gdG8gcHJvamVjdCByZXNvdXJjZXMsIHRoZSBXQVIgZmlsZSBpbmNsdWRlcyBhIFdlYiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGZpbGUuIFRoZSBXZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIGFuIFhNTCBmaWxlIHRoYXQgY29udGFpbnMKLWRlcGxveW1lbnQgaW5mb3JtYXRpb24sIE1JTUUgdHlwZXMsIHNlc3Npb24gY29uZmlndXJhdGlvbiBkZXRhaWxzLCBhbmQgb3RoZXIKLXNldHRpbmdzIGZvciBhIFdlYiBhcHBsaWNhdGlvbi4gVGhlIFdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZSAoPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj53ZWIueG1sPC9zcGFuPikKLXByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBXQVIgZmlsZSBpcyBzaGFyZWQgd2l0aCB0aGUgZGV2ZWxvcGVycywgYXNzZW1ibGVycywKLWFuZCBkZXBsb3llcnMgaW4gYSBKYXZhIEVFIGVudmlyb25tZW50LjwvcD4KLQotPGRpdiBjbGFzcz0icCI+VGhlIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZwotV0FSIGZpbGVzLCB1c2luZyB0aGUgZm9sbG93aW5nIHdpemFyZHM6IDx1bD4KLTxsaT48c3Bhbj5JbXBvcnQgUmVzb3VyY2VzIGZyb20gYSBXQVIgRmlsZTwvc3Bhbj4sIHdoaWNoIHJlcXVpcmVzIHRoYXQgeW91IHRvCi1zcGVjaWZ5IGEgV2ViIHByb2plY3QuIFlvdSBjYW4gdXNlIGV4aXN0aW5nIHByb2plY3RzIG9yIGNyZWF0ZSB0aGVtIGFzIHlvdQotdXNlIHRoZSB3aXphcmQuPC9saT4KLQotPGxpPjxzcGFuPkV4cG9ydCBSZXNvdXJjZXMgdG8gYSBXQVIgRmlsZTwvc3Bhbj4sIHdoaWNoIHJlcXVpcmVzIG9ubHkgYW4gZXhwb3J0Ci1sb2NhdGlvbiBhbmQgc29tZSBvcHRpb25hbCBzZXR0aW5nczwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dlYnJlc291cmNlcy5odG1sIiB0aXRsZT0iIj5XZWIgcmVzb3VyY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2ltcHdhci5odG1sIj5JbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXdhci5odG1sIj5FeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2VkdHZ3LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3MzNkZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3d3ZWR0dnciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9ImN3d2VkdHZ3fDF8V2ViZWRpdG9yc3dvcmtiZW5jaGludGVncmF0aW9uIiBzdGF0dXM9ImNoYW5nZWQiPndvcmtiZW5jaDxpbmRleHRlcm0+V2ViDQotZWRpdG9yczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGVyZSBhcmUgc2V2ZXJhbCBlZGl0b3JzIGZvciB1c2UgaW4gdmFyaW91cyBjb250ZXh0cyBmb3IgdmFyaW91cyBmaWxlDQotdHlwZXMuIFRvIGVkaXQgYSBmaWxlIHVzaW5nIGl0cyBkZWZhdWx0IGVkaXRvciwgZG91YmxlLWNsaWNrIG9uIHRoZSBmaWxlIG5hbWUNCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBvciByaWdodC1jbGljayBvbiB0aGUgZmlsZSBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+T3BlbjwvdWljb250cm9sPi4NCi1UaGUgZWRpdG9yIHRoYXQgaXMgbGFzdCB1c2VkIHRvIG9wZW4gYSBmaWxlIGJlY29tZXMgdGhlIGRlZmF1bHQgZm9yIHRoYXQgcGFydGljdWxhcg0KLWZpbGUuIFRvIGVkaXQgdGhlIGZpbGUgd2l0aCBhIGRpZmZlcmVudCBlZGl0b3IsIHJpZ2h0LWNsaWNrIG9uIHRoZSBmaWxlIGFuZA0KLXNlbGVjdCA8dWljb250cm9sPk9wZW4gV2l0aDwvdWljb250cm9sPiB0byBjaG9vc2UgZnJvbSBhIGxpc3Qgb2YgYXZhaWxhYmxlDQotZWRpdG9ycy48L3A+DQotPHA+SW4gdGhlIHdvcmtiZW5jaCwgeW91IGNhbiBhc3NvY2lhdGUgZmlsZS1uYW1lIGV4dGVuc2lvbnMgZm9yIGRpZmZlcmVudA0KLXR5cGVzIG9mIHJlc291cmNlcyB3aXRoIHZhcmlvdXMgZWRpdG9ycy4gQSByZXNvdXJjZSBleHRlbnNpb24gY2FuIGhhdmUgbW9yZQ0KLXRoYW4gb25lIGVkaXRvciBhc3NvY2lhdGVkIHdpdGggaXQ7IHRoZSBsYXN0IGVkaXRvciB1c2VkIGZvciBhIHBhcnRpY3VsYXINCi1leHRlbnNpb24gdHlwZSBpcyBpbmRpY2F0ZWQgYnkgYSBibGFjayBkb3QgYmVmb3JlIGl0IGluIHRoZSA8dWljb250cm9sPk9wZW4NCi1XaXRoPC91aWNvbnRyb2w+IHBvcC11cCBtZW51LiBZb3UgY2FuIGFzc29jaWF0ZSBleHRlbnNpb25zIHRoYXQgYXJlIGtub3duDQotdG8gdGhlIHdvcmtiZW5jaCB3aXRoIGFkZGl0aW9uYWwgZWRpdG9ycywgYnkgdXNpbmcgdGhlIDxiPkZpbGUgQXNzb2NpYXRpb25zPC9iPiBwcmVmZXJlbmNlcw0KLXBhZ2UsIGFjY2Vzc2VkIGJ5IHNlbGVjdGluZyA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD48dWljb250cm9sPkZpbGUgQXNzb2NpYXRpb25zPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9wPg0KLTxwPlRoZSBQcm9wZXJ0aWVzIHZpZXcgcHJvdmlkZXMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMgdGhhdCBhcmUgYWR2YW50YWdlb3VzDQotdG8gV2ViIGVkaXRvciB1c2Vycy4gPGRsPjxkbGVudHJ5Pg0KLTxkdD5Qcm9wZXJ0aWVzIHZpZXc8L2R0Pg0KLTxkZD5UaGUgUHJvcGVydGllcyB2aWV3ICg8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlNob3cNCi1WaWV3PC91aWNvbnRyb2w+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4pIGNvbnRhaW5zDQotYSBsaXN0IG9mIGF0dHJpYnV0ZXMgYW5kIGVkaXRhYmxlIGF0dHJpYnV0ZSB2YWx1ZXMuIEZvciBleGFtcGxlLCB3aGVuIHlvdQ0KLXNlbGVjdCBhbiBpbWFnZSB0YWcgPHVpY29udHJvbD5pbWc8L3VpY29udHJvbD4gLCB0aGUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMNCi1hcHBlYXIgZm9yIGVkaXRpbmcuIEluIGFkZGl0aW9uLCBhbnkgb3RoZXIgYXR0cmlidXRlcyBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZA0KLXNwZWNpZmllZCBpbiB0aGUgRE9DVFlQRSBmb3IgdGhlIGZpbGUgKHN1Y2ggYXMgdGhlIEhUTUwgNC4wLjEgRFREKSBhcmUgbGlzdGVkLg0KLVdoZW4geW91IGNsaWNrIHRoZSB2YWx1ZSBjb2x1bW4gb2YgYSBwcm9wZXJ0eSwgeW91IGNhbiBzZWxlY3QgZnJvbSBhbW9uZyB0aGUNCi1saXN0IG9mIGF2YWlsYWJsZSBhdHRyaWJ1dGUgdmFsdWVzLiA8cD5UaGUgcG9wLXVwIG1lbnUgaW4gdGhlIFByb3BlcnRpZXMgdmlldw0KLWVuYWJsZXMgeW91IHRvIHVuZG8sIGN1dCwgY29weSwgcGFzdGUsIGRlbGV0ZSwgYW5kIHNlbGVjdCBhbGwuIFRoZSBvcHRpb25zDQotdGhhdCBhcmUgYXZhaWxhYmxlIGF0IGEgZ2l2ZW4gdGltZSBkZXBlbmRzIG9uIHdoZXJlIHRoZSBjdXJzb3IgaXMgbG9jYXRlZA0KLXdoZW4geW91IHJpZ2h0LWNsaWNrIHRvIGRpc3BsYXkgdGhlIHBvcC11cCBtZW51LiBUbyBzZWUgdGhlIHBvcC11cCBtZW51IHRoYXQNCi1jb250YWlucyB1bmRvLCBjdXQsIGFuZCBzbyBvbiwgdGhlIHByb3BlcnR5IHZhbHVlIGZpZWxkIG11c3QgYmUgYWN0aXZlLiAoVGhpcw0KLWlzIGFjY29tcGxpc2hlZCBieSBzZWxlY3RpbmcgdGhlIHByb3BlcnR5IGFuZCB0aGVuIHNlbGVjdGluZyBpdHMgdmFsdWUuKSBPdGhlcndpc2UsDQotdGhlIHBvcC11cCBtZW51IHdpbGwgY29udGFpbiBkaWZmZXJlbnQgb3B0aW9ucy48L3A+IDxwPlVzZSB0aGUgPHVpY29udHJvbD5SZXN0b3JlDQotRGVmYXVsdCBWYWx1ZTwvdWljb250cm9sPiBidXR0b24gdG8gY2hhbmdlIGFueSB2YWx1ZSBiYWNrIHRvIHRoZSBkZWZhdWx0IHNldHRpbmcuPC9wPiA8cD5BZnRlcg0KLXlvdSBhcmUgaW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBtb2RpZnkgb3RoZXIgcHJvcGVydHkgdmFsdWVzIGZvciBzcGVjaWZpYw0KLXRhZ3MuIFRvIGVkaXQgYW5vdGhlciB0YWcgdXNpbmcgdGhlIFByb3BlcnRpZXMgdmlldywgbW92ZSB0aGUgY3Vyc29yIHdpdGhpbg0KLXRoZSBlZGl0aW5nIGFyZWEgb2YgdGhlIFNvdXJjZSBwYWdlIG9yIERlc2lnbiBwYWdlIHRvIHRoZSB0YWcgeW91IHdhbnQgdG8NCi1lZGl0LiBUaGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIFByb3BlcnRpZXMNCi12aWV3LjwvcD48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dlZHR2dy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2VkdHZ3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MTFmNTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2VkdHZ3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JrYmVuY2ggaW50ZWdyYXRpb24gd2l0aCBXZWIgZWRpdG9ycyIgLz4KLTxtZXRhIGNvbnRlbnQ9IndvcmtiZW5jaCwgV2ViIGVkaXRvcnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJ3b3JrYmVuY2gsIFdlYiBlZGl0b3JzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd3dlZHR2dyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd3dlZHR2dyI+PGEgbmFtZT0iY3d3ZWR0dnciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzPC9oMT4KLQotCi08ZGl2PgotPHA+VGhlcmUgYXJlIHNldmVyYWwgZWRpdG9ycyBmb3IgdXNlIGluIHZhcmlvdXMgY29udGV4dHMgZm9yIHZhcmlvdXMgZmlsZQotdHlwZXMuIFRvIGVkaXQgYSBmaWxlIHVzaW5nIGl0cyBkZWZhdWx0IGVkaXRvciwgZG91YmxlLWNsaWNrIG9uIHRoZSBmaWxlIG5hbWUKLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIG9yIHJpZ2h0LWNsaWNrIG9uIHRoZSBmaWxlIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3Blbjwvc3Bhbj4uCi1UaGUgZWRpdG9yIHRoYXQgaXMgbGFzdCB1c2VkIHRvIG9wZW4gYSBmaWxlIGJlY29tZXMgdGhlIGRlZmF1bHQgZm9yIHRoYXQgcGFydGljdWxhcgotZmlsZS4gVG8gZWRpdCB0aGUgZmlsZSB3aXRoIGEgZGlmZmVyZW50IGVkaXRvciwgcmlnaHQtY2xpY2sgb24gdGhlIGZpbGUgYW5kCi1zZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbiBXaXRoPC9zcGFuPiB0byBjaG9vc2UgZnJvbSBhIGxpc3Qgb2YgYXZhaWxhYmxlCi1lZGl0b3JzLjwvcD4KLQotPHA+SW4gdGhlIHdvcmtiZW5jaCwgeW91IGNhbiBhc3NvY2lhdGUgZmlsZS1uYW1lIGV4dGVuc2lvbnMgZm9yIGRpZmZlcmVudAotdHlwZXMgb2YgcmVzb3VyY2VzIHdpdGggdmFyaW91cyBlZGl0b3JzLiBBIHJlc291cmNlIGV4dGVuc2lvbiBjYW4gaGF2ZSBtb3JlCi10aGFuIG9uZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIGl0OyB0aGUgbGFzdCBlZGl0b3IgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyCi1leHRlbnNpb24gdHlwZSBpcyBpbmRpY2F0ZWQgYnkgYSBibGFjayBkb3QgYmVmb3JlIGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuCi1XaXRoPC9zcGFuPiBwb3AtdXAgbWVudS4gWW91IGNhbiBhc3NvY2lhdGUgZXh0ZW5zaW9ucyB0aGF0IGFyZSBrbm93bgotdG8gdGhlIHdvcmtiZW5jaCB3aXRoIGFkZGl0aW9uYWwgZWRpdG9ycywgYnkgdXNpbmcgdGhlIDxzdHJvbmc+RmlsZSBBc3NvY2lhdGlvbnM8L3N0cm9uZz4gcHJlZmVyZW5jZXMKLXBhZ2UsIGFjY2Vzc2VkIGJ5IHNlbGVjdGluZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIEFzc29jaWF0aW9uczwvc3Bhbj48L3NwYW4+LjwvcD4KLQotPGRpdiBjbGFzcz0icCI+VGhlIFByb3BlcnRpZXMgdmlldyBwcm92aWRlcyBnZW5lcmFsIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBhZHZhbnRhZ2VvdXMKLXRvIFdlYiBlZGl0b3IgdXNlcnMuIDxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Qcm9wZXJ0aWVzIHZpZXc8L2R0PgotCi08ZGQ+VGhlIFByb3BlcnRpZXMgdmlldyAoPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2hvdwotVmlldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPjwvc3Bhbj4pIGNvbnRhaW5zCi1hIGxpc3Qgb2YgYXR0cmlidXRlcyBhbmQgZWRpdGFibGUgYXR0cmlidXRlIHZhbHVlcy4gRm9yIGV4YW1wbGUsIHdoZW4geW91Ci1zZWxlY3QgYW4gaW1hZ2UgdGFnIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmltZzwvc3Bhbj4gLCB0aGUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMKLWFwcGVhciBmb3IgZWRpdGluZy4gSW4gYWRkaXRpb24sIGFueSBvdGhlciBhdHRyaWJ1dGVzIGFsbG93ZWQgYnkgdGhlIHN0YW5kYXJkCi1zcGVjaWZpZWQgaW4gdGhlIERPQ1RZUEUgZm9yIHRoZSBmaWxlIChzdWNoIGFzIHRoZSBIVE1MIDQuMC4xIERURCkgYXJlIGxpc3RlZC4KLVdoZW4geW91IGNsaWNrIHRoZSB2YWx1ZSBjb2x1bW4gb2YgYSBwcm9wZXJ0eSwgeW91IGNhbiBzZWxlY3QgZnJvbSBhbW9uZyB0aGUKLWxpc3Qgb2YgYXZhaWxhYmxlIGF0dHJpYnV0ZSB2YWx1ZXMuIDxwPlRoZSBwb3AtdXAgbWVudSBpbiB0aGUgUHJvcGVydGllcyB2aWV3Ci1lbmFibGVzIHlvdSB0byB1bmRvLCBjdXQsIGNvcHksIHBhc3RlLCBkZWxldGUsIGFuZCBzZWxlY3QgYWxsLiBUaGUgb3B0aW9ucwotdGhhdCBhcmUgYXZhaWxhYmxlIGF0IGEgZ2l2ZW4gdGltZSBkZXBlbmRzIG9uIHdoZXJlIHRoZSBjdXJzb3IgaXMgbG9jYXRlZAotd2hlbiB5b3UgcmlnaHQtY2xpY2sgdG8gZGlzcGxheSB0aGUgcG9wLXVwIG1lbnUuIFRvIHNlZSB0aGUgcG9wLXVwIG1lbnUgdGhhdAotY29udGFpbnMgdW5kbywgY3V0LCBhbmQgc28gb24sIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmaWVsZCBtdXN0IGJlIGFjdGl2ZS4gKFRoaXMKLWlzIGFjY29tcGxpc2hlZCBieSBzZWxlY3RpbmcgdGhlIHByb3BlcnR5IGFuZCB0aGVuIHNlbGVjdGluZyBpdHMgdmFsdWUuKSBPdGhlcndpc2UsCi10aGUgcG9wLXVwIG1lbnUgd2lsbCBjb250YWluIGRpZmZlcmVudCBvcHRpb25zLjwvcD4KLSA8cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlc3RvcmUKLURlZmF1bHQgVmFsdWU8L3NwYW4+IGJ1dHRvbiB0byBjaGFuZ2UgYW55IHZhbHVlIGJhY2sgdG8gdGhlIGRlZmF1bHQgc2V0dGluZy48L3A+Ci0gPHA+QWZ0ZXIKLXlvdSBhcmUgaW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBtb2RpZnkgb3RoZXIgcHJvcGVydHkgdmFsdWVzIGZvciBzcGVjaWZpYwotdGFncy4gVG8gZWRpdCBhbm90aGVyIHRhZyB1c2luZyB0aGUgUHJvcGVydGllcyB2aWV3LCBtb3ZlIHRoZSBjdXJzb3Igd2l0aGluCi10aGUgZWRpdGluZyBhcmVhIG9mIHRoZSBTb3VyY2UgcGFnZSBvciBEZXNpZ24gcGFnZSB0byB0aGUgdGFnIHlvdSB3YW50IHRvCi1lZGl0LiBUaGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIFByb3BlcnRpZXMKLXZpZXcuPC9wPgotPC9kZD4KLQotPC9kbD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY2hneGR0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1YzNmNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpjaGd4ZHQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNwZWNpZnlpbmcgYW4gaW1wbGljaXQgZG9jdW1lbnQgdHlwZSBmb3IgYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudDwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RE9DVFlQRSBkZWNsYXJhdGlvbnM8aW5kZXh0ZXJtPmltcGxpY2l0IGZvciBmcmFnbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmRvY3VtZW50IHR5cGVzPGluZGV4dGVybT5pbXBsaWNpdCBmb3IgZnJhZ21lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5IVE1MIGZyYWdtZW50czxpbmRleHRlcm0+aW1wbGljaXQgZG9jdW1lbnQgdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkpTUCBmcmFnbWVudHM8aW5kZXh0ZXJtPmltcGxpY2l0IGRvY3VtZW50IHR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YSFRNTCBmcmFnbWVudHM8aW5kZXh0ZXJtPmltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGZyYWdtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkFuIDxpPmltcGxpY2l0PC9pPiBkb2N1bWVudCB0eXBlIGlzIHVzZWQgZm9yIGNvbnRlbnQgYXNzaXN0IChDVFJMK1NwYWNlYmFyKSwNCi10aGUgUHJvcGVydGllcyB2aWV3LCBhbmQgb3RoZXIgZWRpdGluZyBjb250ZXh0cyB3aGVuIG5vIERPQ1RZUEUgZGVjbGFyYXRpb24NCi1pcyBzcGVjaWZpZWQgaW4gYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmaWxlLiBUeXBpY2FsbHksIHRoaXMgZmVhdHVyZSBpcyB1c2VkDQotZm9yIGEgZnJhZ21lbnQgKHBhcnRpYWwgZG9jdW1lbnQpIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIG90aGVyIHBhZ2VzIHVzaW5nDQotSlNQIGluY2x1ZGUgb3Igc2VydmVyLXNpZGUgaW5jbHVkZS48L3A+PHA+VG8gYXNzaWduIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUNCi10byBhbiBIVE1MLCBYSFRNTCwgb3IgSlNQIGZyYWdtZW50LCBkbyB0aGUgZm9sbG93aW5nOiA8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHNlbGVjdCB0aGUgSFRNTCwgWEhUTUwsIG9yIEpTUA0KLWZyYWdtZW50LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8cGg+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PC9waD4gZnJvbSB0aGUgZmlsZSdzDQotcG9wLXVwIG1lbnUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+V2ViIENvbnRlbnQgU2V0dGluZ3M8L3VpY29udHJvbD4gcGFnZSwgc2VsZWN0DQotdGhlIGRlc2lyZWQgRE9DVFlQRSBmcm9tIHRoZSA8cGg+PHVpY29udHJvbD5Eb2N1bWVudCB0eXBlPC91aWNvbnRyb2w+PC9waD4gZHJvcC1kb3duDQotbGlzdC48L2NtZD48aW5mbz48cD5UaGUgPHBoPjx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPjwvcGg+IGRpYWxvZw0KLWZvciBXZWIgcHJvamVjdHMgYWxzbyBpbmNsdWRlcyBhbiA8cGg+PHVpY29udHJvbD5XZWIgQ29udGVudCBTZXR0aW5nczwvdWljb250cm9sPjwvcGg+IHBhZ2UsDQotd2hlcmUgeW91IGNhbiBzcGVjaWZ5IHByb2plY3QtZGVmYXVsdCBIVE1MIGRvY3VtZW50IHR5cGUuIFRoaXMgc2V0dGluZyB3aWxsDQotYmUgdXNlZCBpZiBubyBET0NUWVBFIGRlY2xhcmF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgZmlsZSwgYW5kIG5vIGRlZmF1bHQNCi1kb2N1bWVudCB0eXBlIGlzIHNwZWNpZmllZCBpbiB0aGUgPHBoPjx1aWNvbnRyb2w+V2ViIENvbnRlbnQgU2V0dGluZ3M8L3VpY29udHJvbD48L3BoPiBwYWdlDQotb24gdGhlIDxwaD48dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD48L3BoPiBkaWFsb2cgZm9yIHRoZSBmaWxlLjwvcD48L2luZm8+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY2hneGR0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjYmY5YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNwZWNpZnlpbmcgYW4gaW1wbGljaXQgZG9jdW1lbnQgdHlwZSBmb3IgYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zLCBpbXBsaWNpdCBmb3IgZnJhZ21lbnRzLCBkb2N1bWVudCB0eXBlcywgSFRNTCBmcmFnbWVudHMsIGltcGxpY2l0IGRvY3VtZW50IHR5cGVzLCBKU1AgZnJhZ21lbnRzLCBYSFRNTCBmcmFnbWVudHMsIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGZyYWdtZW50cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zLCBpbXBsaWNpdCBmb3IgZnJhZ21lbnRzLCBkb2N1bWVudCB0eXBlcywgSFRNTCBmcmFnbWVudHMsIGltcGxpY2l0IGRvY3VtZW50IHR5cGVzLCBKU1AgZnJhZ21lbnRzLCBYSFRNTCBmcmFnbWVudHMsIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGZyYWdtZW50cyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpjaGd4ZHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZnJhZ21lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqY2hneGR0Ij48YSBuYW1lPSJ0amNoZ3hkdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3BlY2lmeWluZyBhbiBpbXBsaWNpdCBkb2N1bWVudCB0eXBlIGZvciBhbiBIVE1MLCBYSFRNTCwgb3IgSlNQIGZyYWdtZW50PC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkFuIDxlbT5pbXBsaWNpdDwvZW0+IGRvY3VtZW50IHR5cGUgaXMgdXNlZCBmb3IgY29udGVudCBhc3Npc3QgKENUUkwrU3BhY2ViYXIpLAotdGhlIFByb3BlcnRpZXMgdmlldywgYW5kIG90aGVyIGVkaXRpbmcgY29udGV4dHMgd2hlbiBubyBET0NUWVBFIGRlY2xhcmF0aW9uCi1pcyBzcGVjaWZpZWQgaW4gYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmaWxlLiBUeXBpY2FsbHksIHRoaXMgZmVhdHVyZSBpcyB1c2VkCi1mb3IgYSBmcmFnbWVudCAocGFydGlhbCBkb2N1bWVudCkgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gb3RoZXIgcGFnZXMgdXNpbmcKLUpTUCBpbmNsdWRlIG9yIHNlcnZlci1zaWRlIGluY2x1ZGUuPC9wPgotPHA+VG8gYXNzaWduIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUKLXRvIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZnJhZ21lbnQsIGRvIHRoZSBmb2xsb3dpbmc6IDwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHNlbGVjdCB0aGUgSFRNTCwgWEhUTUwsIG9yIEpTUAotZnJhZ21lbnQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+PC9zcGFuPiBmcm9tIHRoZSBmaWxlJ3MKLXBvcC11cCBtZW51Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgQ29udGVudCBTZXR0aW5nczwvc3Bhbj4gcGFnZSwgc2VsZWN0Ci10aGUgZGVzaXJlZCBET0NUWVBFIGZyb20gdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50IHR5cGU8L3NwYW4+PC9zcGFuPiBkcm9wLWRvd24KLWxpc3QuPC9zcGFuPiA8cD5UaGUgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj48L3NwYW4+IGRpYWxvZwotZm9yIFdlYiBwcm9qZWN0cyBhbHNvIGluY2x1ZGVzIGFuIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBDb250ZW50IFNldHRpbmdzPC9zcGFuPjwvc3Bhbj4gcGFnZSwKLXdoZXJlIHlvdSBjYW4gc3BlY2lmeSBwcm9qZWN0LWRlZmF1bHQgSFRNTCBkb2N1bWVudCB0eXBlLiBUaGlzIHNldHRpbmcgd2lsbAotYmUgdXNlZCBpZiBubyBET0NUWVBFIGRlY2xhcmF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgZmlsZSwgYW5kIG5vIGRlZmF1bHQKLWRvY3VtZW50IHR5cGUgaXMgc3BlY2lmaWVkIGluIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgQ29udGVudCBTZXR0aW5nczwvc3Bhbj48L3NwYW4+IHBhZ2UKLW9uIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPjwvc3Bhbj4gZGlhbG9nIGZvciB0aGUgZmlsZS48L3A+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTZlZmUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amNyZWh0bSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0czwvdGl0bGU+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHVzZSB0aGUgTmV3IEhUTUwgRmlsZSB3aXphcmQgdG8gY3JlYXRlIEhUTUwgYW5kIFhIVE1MIGZpbGVzDQotYW5kIGZyYW1lc2V0cy4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPg0KLTxpbmRleHRlcm0+ZnJhbWVzZXRzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+SFRNTDxpbmRleHRlcm0+Y3JlYXRpbmcgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldNTDxpbmRleHRlcm0+Y3JlYXRpbmcgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhIVE1MPGluZGV4dGVybT5jcmVhdGluZyBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBzdGF0aWMgb3IgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5DQotZG9uZSBzby48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgZXhwYW5kIHlvdXIgcHJvamVjdCBhbmQgcmlnaHQgY2xpY2sgb24NCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICA8L2NtZD48aW5mbz5Ob3RlDQotdGhhdCBpZiB5b3UgY2hvb3NlIGFueSBvdGhlciBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBIVE1MIGZpbGUsIHRoZW4NCi1pdCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgV0FSIGZpbGUgdGhhdCBpcyBkZXBsb3llZCB0byB0aGUgc2VydmVyLiBJbg0KLWFkZGl0aW9uLCBsaW5rIHZhbGlkYXRpb24gd2lsbCBub3QgZW5jb21wYXNzIGZpbGVzIHRoYXQgYXJlIG5vdCB1bmRlciB0aGUNCi1XZWJDb250ZW50IGZvbGRlci48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgY29udGV4dCBtZW51LCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPjx1aWNvbnRyb2w+V2ViPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PHN0ZXByZXN1bHQ+VGhlIE5ldyBIVE1MIFBhZ2Ugd2luZG93IGFwcGVhcnMgd2l0aCB5b3VyDQotZm9sZGVyIHNlbGVjdGVkPC9zdGVwcmVzdWx0Pjwvc3RlcD4NCi08c3RlcD48Y21kPlR5cGUgYSBmaWxlIG5hbWUgaW50byB0aGUgRmlsZSBuYW1lIGZpZWxkLCBtYWtpbmcgc3VyZSB5b3UgaW5jbHVkZQ0KLWFuIGh0bWwgZXh0ZW5zaW9uIChodG1sLCBodG0sIHhodG1sLCBodHBsLCB3bWwsIHNodG1sLCBvciBzaHRtKSBpbiB0aGUgZmlsZQ0KLW5hbWUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+IFlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucyBmb3IgcHJvY2VlZGluZzo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPlRvIGFjY2VwdCB0aGUgZGVmYXVsdHMgYXNzb2NpYXRlZCB3aXRoIGEgbmV3IEhUTUwgZmlsZSwgc2VsZWN0IDx1aWNvbnRyb2w+RmluaXNoLjwvdWljb250cm9sPjwvY2hvaWNlPg0KLTxjaG9pY2U+IFRvIHVzZSBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBpbml0aWFsIGNvbnRlbnQgb2YgeW91ciBIVE1MIHBhZ2UsDQotc2VsZWN0IDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gVGhlIFNlbGVjdCBIVE1MIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLg0KLVNlbGVjdCB0aGUgPHVpY29udHJvbD5Vc2UgSFRNTCBUZW1wbGF0ZTwvdWljb250cm9sPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdA0KLW9uZSBvZiB0aGUgc2FtcGxlIHRlbXBsYXRlcy4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgPHVpY29udHJvbD5IVE1MIFRlbXBsYXRlczwvdWljb250cm9sPiBsaW5rDQotdG8gYWRkIG9yIHJlbW92ZSBIVE1MIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVlOGY4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWh0bS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgTmV3IEhUTUwgRmlsZSB3aXphcmQgdG8gY3JlYXRlIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gdXNlIHRoZSBOZXcgSFRNTCBGaWxlIHdpemFyZCB0byBjcmVhdGUgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0cy4iIC8+Ci08bWV0YSBjb250ZW50PSJmcmFtZXNldHMsIGNyZWF0aW5nLCBIVE1MLCBjcmVhdGluZyBmaWxlcywgV01MLCBYSFRNTCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImZyYW1lc2V0cywgY3JlYXRpbmcsIEhUTUwsIGNyZWF0aW5nIGZpbGVzLCBXTUwsIFhIVE1MIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0amNyZWh0bSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqY3JlaHRtIj48YSBuYW1lPSJ0amNyZWh0bSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0czwvaDE+Ci0KLQotCi08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSBOZXcgSFRNTCBGaWxlIHdpemFyZCB0byBjcmVhdGUgSFRNTCBhbmQgWEhUTUwgZmlsZXMKLWFuZCBmcmFtZXNldHMuIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIHN0YXRpYyBvciBhIGR5bmFtaWMgV2ViIHByb2plY3QgaWYgeW91IGhhdmUgbm90IGFscmVhZHkKLWRvbmUgc28uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICA8L3NwYW4+IE5vdGUKLXRoYXQgaWYgeW91IGNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgSFRNTCBmaWxlLCB0aGVuCi1pdCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgV0FSIGZpbGUgdGhhdCBpcyBkZXBsb3llZCB0byB0aGUgc2VydmVyLiBJbgotYWRkaXRpb24sIGxpbmsgdmFsaWRhdGlvbiB3aWxsIG5vdCBlbmNvbXBhc3MgZmlsZXMgdGhhdCBhcmUgbm90IHVuZGVyIHRoZQotV2ViQ29udGVudCBmb2xkZXIuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBjb250ZXh0IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MPC9zcGFuPgotPC9zcGFuPi48L3NwYW4+IFRoZSBOZXcgSFRNTCBQYWdlIHdpbmRvdyBhcHBlYXJzIHdpdGggeW91cgotZm9sZGVyIHNlbGVjdGVkPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUKLWFuIGh0bWwgZXh0ZW5zaW9uIChodG1sLCBodG0sIHhodG1sLCBodHBsLCB3bWwsIHNodG1sLCBvciBzaHRtKSBpbiB0aGUgZmlsZQotbmFtZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gWW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zIGZvciBwcm9jZWVkaW5nOjwvc3Bhbj4KLTx1bD4KLTxsaT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBIVE1MIGZpbGUsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2guPC9zcGFuPjwvbGk+Ci0KLTxsaT4gVG8gdXNlIGEgdGVtcGxhdGUgZmlsZSBmb3IgdGhlIGluaXRpYWwgY29udGVudCBvZiB5b3VyIEhUTUwgcGFnZSwKLXNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gVGhlIFNlbGVjdCBIVE1MIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLgotU2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgSFRNTCBUZW1wbGF0ZTwvc3Bhbj4gY2hlY2sgYm94LCBhbmQgdGhlbiBzZWxlY3QKLW9uZSBvZiB0aGUgc2FtcGxlIHRlbXBsYXRlcy4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBUZW1wbGF0ZXM8L3NwYW4+IGxpbmsKLXRvIGFkZCBvciByZW1vdmUgSFRNTCB0ZW1wbGF0ZXMgdG8geW91ciBsaXN0IG9mIHRlbXBsYXRlcy48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdiAvPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVqc3AuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3NWIzMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVqc3AuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpjcmVqc3AiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkpTUCBmaWxlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPk1vc3QgdHlwZXMgb2YgSlNQIGZpbGVzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBOZXcgSlNQIEZpbGUNCi13aXphcmQuIFRvIGNyZWF0ZSBhIGJhc2ljIEpTUCBmaWxlIHVzaW5nIHRoZSB3aXphcmQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczogPC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IGRvbmUgc28uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uDQoteW91ciBXZWJDb250ZW50IGZvbGRlciBvciBvbiBhIHN1YmZvbGRlciB1bmRlciBXZWJDb250ZW50LiAgTm90ZSB0aGF0IGlmIHlvdQ0KLWNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgSlNQLCB0aGVuIGl0IHdpbGwgbm90IGJlIGluY2x1ZGVkDQotaW4gdGhlIFdBUiBmaWxlIHRoYXQgaXMgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gSW4gYWRkaXRpb24sIGxpbmsgdmFsaWRhdGlvbg0KLXdpbGwgbm90IGVuY29tcGFzcyBmaWxlcyB0aGF0IGFyZSBub3QgdW5kZXIgdGhlIFdlYkNvbnRlbnQgZm9sZGVyLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+SlNQPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PHN0ZXByZXN1bHQ+VGhlIE5ldyBKYXZhIFNlcnZlcg0KLVBhZ2Ugd2luZG93IGFwcGVhcnMgd2l0aCB5b3VyIGZvbGRlciBzZWxlY3RlZDwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUNCi10aGUganNwIGV4dGVuc2lvbiAoanNwLCBqc3YsIGp0cGwsIG9yIGpzcHgpIGluIHRoZSBmaWxlIG5hbWUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+IFlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucyBmb3IgcHJvY2VlZGluZzo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPlRvIGFjY2VwdCB0aGUgZGVmYXVsdHMgYXNzb2NpYXRlZCB3aXRoIGEgbmV3IEpTUCBmaWxlLCBzZWxlY3QgPHVpY29udHJvbD5GaW5pc2guPC91aWNvbnRyb2w+PC9jaG9pY2U+DQotPGNob2ljZT5UbyBsaW5rIHRvIGEgZmlsZSBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIHNwZWNpZnkgcGF0aCB2YXJpYWJsZXMsIHNlbGVjdCA8dWljb250cm9sPkFkdmFuY2VkPC91aWNvbnRyb2w+IGFuZA0KLXRoZW4gbWFrZSB5b3VyIHNlbGVjdGlvbnMgdXNpbmcgdGhlIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGFuZCA8dWljb250cm9sPlZhcmlhYmxlczwvdWljb250cm9sPiBidXR0b25zLiA8L2Nob2ljZT4NCi08Y2hvaWNlPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgSlNQIHBhZ2UsDQotc2VsZWN0IDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gVGhlIFNlbGVjdCBKU1AgVGVtcGxhdGUgd2luZG93IGFwcGVhcnMuDQotU2VsZWN0IHRoZSA8dWljb250cm9sPlVzZSBKU1AgVGVtcGxhdGU8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQgdGhlbiBzZWxlY3QNCi1vbmUgb2YgdGhlIHNhbXBsZSB0ZW1wbGF0ZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+SlNQIFRlbXBsYXRlczwvdWljb250cm9sPiBsaW5rDQotdG8gYWRkIG9yIHJlbW92ZSBKU1AgdGVtcGxhdGVzIHRvIHlvdXIgbGlzdCBvZiB0ZW1wbGF0ZXMuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWpzcC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzdmNGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIiAvPgotPG1ldGEgY29udGVudD0iSlNQIGZpbGVzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkpTUCBmaWxlcywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjcmVwcmouaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2NwZGpzcHMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0amNyZWpzcCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqY3JlanNwIj48YSBuYW1lPSJ0amNyZWpzcCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPk1vc3QgdHlwZXMgb2YgSlNQIGZpbGVzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBOZXcgSlNQIEZpbGUKLXdpemFyZC4gVG8gY3JlYXRlIGEgYmFzaWMgSlNQIGZpbGUgdXNpbmcgdGhlIHdpemFyZCwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6IDwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3QgaWYgeW91IGhhdmUgbm90IGFscmVhZHkgZG9uZSBzby48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCBleHBhbmQgeW91ciBwcm9qZWN0IGFuZCByaWdodCBjbGljayBvbgoteW91ciBXZWJDb250ZW50IGZvbGRlciBvciBvbiBhIHN1YmZvbGRlciB1bmRlciBXZWJDb250ZW50LiAgTm90ZSB0aGF0IGlmIHlvdQotY2hvb3NlIGFueSBvdGhlciBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBKU1AsIHRoZW4gaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQKLWluIHRoZSBXQVIgZmlsZSB0aGF0IGlzIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIEluIGFkZGl0aW9uLCBsaW5rIHZhbGlkYXRpb24KLXdpbGwgbm90IGVuY29tcGFzcyBmaWxlcyB0aGF0IGFyZSBub3QgdW5kZXIgdGhlIFdlYkNvbnRlbnQgZm9sZGVyLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SlNQPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPiBUaGUgTmV3IEphdmEgU2VydmVyCi1QYWdlIHdpbmRvdyBhcHBlYXJzIHdpdGggeW91ciBmb2xkZXIgc2VsZWN0ZWQ8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBmaWxlIG5hbWUgaW50byB0aGUgRmlsZSBuYW1lIGZpZWxkLCBtYWtpbmcgc3VyZSB5b3UgaW5jbHVkZQotdGhlIGpzcCBleHRlbnNpb24gKGpzcCwganN2LCBqdHBsLCBvciBqc3B4KSBpbiB0aGUgZmlsZSBuYW1lLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBZb3UgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgZm9yIHByb2NlZWRpbmc6PC9zcGFuPgotPHVsPgotPGxpPlRvIGFjY2VwdCB0aGUgZGVmYXVsdHMgYXNzb2NpYXRlZCB3aXRoIGEgbmV3IEpTUCBmaWxlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoLjwvc3Bhbj48L2xpPgotCi08bGk+VG8gbGluayB0byBhIGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBzcGVjaWZ5IHBhdGggdmFyaWFibGVzLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWR2YW5jZWQ8L3NwYW4+IGFuZAotdGhlbiBtYWtlIHlvdXIgc2VsZWN0aW9ucyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWFibGVzPC9zcGFuPiBidXR0b25zLiA8L2xpPgotCi08bGk+IFRvIHVzZSBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBpbml0aWFsIGNvbnRlbnQgb2YgeW91ciBKU1AgcGFnZSwKLXNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gVGhlIFNlbGVjdCBKU1AgVGVtcGxhdGUgd2luZG93IGFwcGVhcnMuCi1TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBKU1AgVGVtcGxhdGU8L3NwYW4+IGNoZWNrIGJveCwgYW5kIHRoZW4gc2VsZWN0Ci1vbmUgb2YgdGhlIHNhbXBsZSB0ZW1wbGF0ZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUCBUZW1wbGF0ZXM8L3NwYW4+IGxpbmsKLXRvIGFkZCBvciByZW1vdmUgSlNQIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2NwZGpzcHMuaHRtbCI+SmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NyZXByai5odG1sIiB0aXRsZT0iWW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIHJlc291cmNlcyBmb3IgeW91ciBXZWIgYXBwbGljYXRpb25zIGluIFdlYiBwcm9qZWN0cy4iPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWZmYjY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amRldGFncyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBwYWdlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5UbyBhaWQgaW4gV2ViIHNpdGUgZGV2ZWxvcG1lbnQgYW5kIGVkaXRpbmcsIHRoZXJlIGlzIGxvY2FsIHRhZw0KLWhvdmVyIGhlbHAgZm9yIGFsbCBzdXBwb3J0ZWQgdGFnIHNldHMsIGFzIHdlbGwgYXMgPHhyZWYgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5kaXRhIg0KLXNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+Y29udGVudCBhc3Npc3Q8L3hyZWY+IChDdHJsK1NwYWNlYmFyKSwgYSB0b29sIHRoYXQNCi1oZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYQ0KLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuPC9wPjxwPiBZb3UgY2FuIHRvZ2dsZSBhbW9uZyB2YXJpb3VzIHZpZXdpbmcgbW9kZXMNCi0od2hpY2ggYXJlIGRldGVybWluZWQgYnkgZmlsZSB0eXBlKSB0byB2aXN1YWxseSBkZXNpZ24gcGFnZXMsIHdvcmsgd2l0aCBIVE1MLCA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiBvcg0KLUpTUCBjb250ZW50LCBhbmQgcHJldmlldyB5b3VyIHBhZ2VzLiBUbyBoZWxwIHlvdSBjcmVhdGUgdGhlIHZpc3VhbCBpbXBhY3QNCi15b3Ugd2FudCBvbiB5b3VyIFdlYiBzaXRlcywgdGhlIGVkaXRvciBpbmNsdWRlcyBpdHMgb3duIGxpYnJhcnkgb2YgcmV1c2FibGUNCi1ncmFwaGljcyBhbmQgdHdvIGdyYXBoaWMgcHJvZ3JhbXMgZm9yIGNyZWF0aW5nLCBlZGl0aW5nLCBhbmQgYW5pbWF0aW5nIGltYWdlDQotZmlsZXMuIDwvcD48bm90ZT5Vc2UgZWl0aGVyIHVwcGVyY2FzZSBvciBsb3dlcmNhc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMNCi1jb25zaXN0ZW50bHkgd2hlbiBuYW1pbmcgSFRNTCBmaWxlcyBhbmQgZW1iZWRkZWQgZmlsZXMgKHN1Y2ggYXMgaW1hZ2UgZmlsZXMpDQotdXNlZCBpbiB5b3VyIFdlYiBwYWdlcywgYmVjYXVzZSBzb21lIHNlcnZlciBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgY2FzZSBzZW5zaXRpdmUuDQotRG8gbm90IHVzZSBzcGFjZXMgb3Igc3BlY2lhbCBjaGFyYWN0ZXJzIHN1Y2ggYXMgZXhjbGFtYXRpb24gcG9pbnRzIG9yIHF1ZXN0aW9uDQotbWFya3MgaW4gZmlsZSBuYW1lcy48L25vdGU+IDwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTRmZjljLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXciIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcGFnZXMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHBhZ2VzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3d0b3Zlci5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRqZGV0YWdzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqZGV0YWdzIj48YSBuYW1lPSJ0amRldGFncyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXc8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VG8gYWlkIGluIFdlYiBzaXRlIGRldmVsb3BtZW50IGFuZCBlZGl0aW5nLCB0aGVyZSBpcyBsb2NhbCB0YWcKLWhvdmVyIGhlbHAgZm9yIGFsbCBzdXBwb3J0ZWQgdGFnIHNldHMsIGFzIHdlbGwgYXMgPGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5odG1sIiB0aXRsZT0iIj5jb250ZW50IGFzc2lzdDwvYT4gKEN0cmwrU3BhY2ViYXIpLCBhIHRvb2wgdGhhdAotaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEKLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuPC9wPgotPHA+IFlvdSBjYW4gdG9nZ2xlIGFtb25nIHZhcmlvdXMgdmlld2luZyBtb2RlcwotKHdoaWNoIGFyZSBkZXRlcm1pbmVkIGJ5IGZpbGUgdHlwZSkgdG8gdmlzdWFsbHkgZGVzaWduIHBhZ2VzLCB3b3JrIHdpdGggSFRNTCwgSmF2YVNjcmlwdOKEoiBvcgotSlNQIGNvbnRlbnQsIGFuZCBwcmV2aWV3IHlvdXIgcGFnZXMuIFRvIGhlbHAgeW91IGNyZWF0ZSB0aGUgdmlzdWFsIGltcGFjdAoteW91IHdhbnQgb24geW91ciBXZWIgc2l0ZXMsIHRoZSBlZGl0b3IgaW5jbHVkZXMgaXRzIG93biBsaWJyYXJ5IG9mIHJldXNhYmxlCi1ncmFwaGljcyBhbmQgdHdvIGdyYXBoaWMgcHJvZ3JhbXMgZm9yIGNyZWF0aW5nLCBlZGl0aW5nLCBhbmQgYW5pbWF0aW5nIGltYWdlCi1maWxlcy4gPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFVzZSBlaXRoZXIgdXBwZXJjYXNlIG9yIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycwotY29uc2lzdGVudGx5IHdoZW4gbmFtaW5nIEhUTUwgZmlsZXMgYW5kIGVtYmVkZGVkIGZpbGVzIChzdWNoIGFzIGltYWdlIGZpbGVzKQotdXNlZCBpbiB5b3VyIFdlYiBwYWdlcywgYmVjYXVzZSBzb21lIHNlcnZlciBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgY2FzZSBzZW5zaXRpdmUuCi1EbyBub3QgdXNlIHNwYWNlcyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgc3VjaCBhcyBleGNsYW1hdGlvbiBwb2ludHMgb3IgcXVlc3Rpb24KLW1hcmtzIGluIGZpbGUgbmFtZXMuPC9kaXY+Ci0gPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njd3RvdmVyLmh0bWwiIHRpdGxlPSIiPldlYiBhcHBsaWNhdGlvbiBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpwcmVmcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjNzNkNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpwcmVmcy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0anByZWZzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5EZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idGpwcmVmc3wxfERPQ1RZUEVkZWNsYXJhdGlvbnNhZGRpbmdhdXRvbWF0aWNhbGx5Ig0KLXN0YXR1cz0ibmV3Ij5ET0NUWVBFIGRlY2xhcmF0aW9uczxpbmRleHRlcm0+YWRkaW5nIGF1dG9tYXRpY2FsbHk8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idGpwcmVmc3wyfEhUTUxmaWxlc2VkaXRpbmdwcmVmZXJlbmNlcyIgc3RhdHVzPSJjaGFuZ2VkIj5IVE1MPGluZGV4dGVybT5lZGl0aW5nDQotcHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD48aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb25zPGluZGV4dGVybT5hZGRpbmcgYXV0b21hdGljYWxseTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPiA8aW5kZXh0ZXJtPkhUTUwNCi1maWxlczxpbmRleHRlcm0+ZWRpdGluZyBwcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPiBUbyBkZWZpbmUgZ2VuZXJhbA0KLUhUTUwgZmlsZSBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkZyb20gdGhlIDx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+IG1lbnUsIHNlbGVjdCA8dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3csIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWIgYW5kDQotWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MIEZpbGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgZm9sbG93aW5nIHNldHRpbmdzIHJlbGF0ZWQgdG8gc2F2aW5nIGFuIEhUTUwgc291cmNlDQotcGFnZS4gVGhlIGRlZmF1bHRzIGFyZSByZWNvbW1lbmRlZCBhbmQgc2hvdWxkIG9ubHkgYmUgbW9kaWZpZWQgd2hlbiB0aGVyZQ0KLWlzIGEgc3BlY2lmaWMgcmVhc29uIHRvIGRvIHNvLiA8L2NtZD48aW5mbz48ZGw+PGRsZW50cnk+DQotPGR0PkxpbmUgZGVsaW1pdGVyPC9kdD4NCi08ZGQ+U3BlY2lmeSB0aGUgYXBwcm9wcmlhdGUgRU9MIGNoYXJhY3RlciBmb3IgeW91ciBlbnZpcm9ubWVudC4gVGhlIGRlZmF1bHQNCi1pcyA8dWljb250cm9sPk5vIHRyYW5zbGF0aW9uPC91aWNvbnRyb2w+LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5BZGQgdGhpcyBzdWZmaXg8L2R0Pg0KLTxkZD5TcGVjaWZ5IGEgZGVmYXVsdCBzdWZmaXggZm9yIGZpbGVzIHRoYXQgeW91IHNhdmUuIFRoZSBkZWZhdWx0IGlzIDx1c2VyaW5wdXQ+aHRtbDwvdXNlcmlucHV0Pi48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+RW5jb2RpbmcsIElBTkEsIChVc2Ugd29ya2JlbmNoIGRlZmF1bHQpPC9kdD4NCi08ZGQ+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbmNvZGluZyAoY29kZSBwYWdlKSBmb3IgZmlsZXMgdGhhdCB5b3UgY3JlYXRlLiBUaGUNCi1kZWZhdWx0IGlzIHRoZSBXb3JrYmVuY2gncyBlbmNvZGluZyBwcmVmZXJlbmNlLiA8L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW5zZXJ0IERPQ1RZUEUgZGVjbGFyYXRpb248L2R0Pg0KLTxkZD5PcHRpb25hbGx5LCB5b3UgY2FuIGF1dG9tYXRpY2FsbHkgYWRkIGEgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBIVE1MIGZpbGVzLg0KLVRoZSBkZWZhdWx0IERPQ1RZUEUgaXMgZGV0ZXJtaW5lZCB3aGVuIHlvdSBjcmVhdGUgYW4gSFRNTCBmaWxlIG9yIGEgSlNQIGZpbGUNCi11c2luZyBhIHdpemFyZC4gSWYgeW91IGFkZCB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiwgeW91IHNob3VsZCBpbmNsdWRlIGF0DQotbGVhc3QgYSBQdWJsaWMgSUQgc3BlY2lmaWNhdGlvbiwgYW5kLCBvcHRpb25hbGx5LCBhIFN5c3RlbSBJRC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW5zZXJ0IEdFTkVSQVRPUiB3aXRoIE1FVEEgdGFnPC9kdD4NCi08ZGQ+T3B0aW9uYWxseSwgc2VsZWN0IHRoZSBjaGVjayBib3ggdG8gc3BlY2lmeSBHRU5FUkFUT1IgaW4gYSBNRVRBIHRhZyBpbg0KLXRoZSBIVE1MIGZpbGUgaGVhZGVyLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Mb2FkaW5nIGZpbGVzPC9kdD4NCi08ZGQ+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbmNvZGluZyAoY29kZSBwYWdlKSBmb3IgZmlsZXMgdGhhdCB5b3Ugb3Blbi4gVGhlDQotZGVmYXVsdCBpcyB0aGUgV29ya2JlbmNoJ3MgZW5jb2RpbmcgcHJlZmVyZW5jZS4gRGVzZWxlY3QgdGhlIDx1aWNvbnRyb2w+VXNlDQotd29ya2JlbmNoIGRlZmF1bHQ8L3VpY29udHJvbD4gY2hlY2sgYm94IHRvIHNlbGVjdCBhbm90aGVyIGVuY29kaW5nLiAgIDxub3RlPkVuY29kaW5nDQotZGV0ZWN0aW9uICh3aGVuIGxvYWRpbmcgZmlsZXMpIGlzIHBlcmZvcm1lZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAgIDx1bD4NCi08bGk+TG9jYXRlIHRoZSBlbmNvZGluZyBuYW1lIGVtYmVkZGVkIGluIHRoZSBkb2N1bWVudC48L2xpPg0KLTxsaT5XaGVuIG5vIGVuY29kaW5nIGlzIGVtYmVkZGVkIGluIHRoZSBkb2N1bWVudCwgYW4gYXV0b21hdGljIGVuY29kaW5nIGRldGVjdG9yDQotYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIGVuY29kaW5nIHVzZWQgaW4gdGhlIGRvY3VtZW50LjwvbGk+DQotPGxpPklmIHRoZSBlbmNvZGluZyBzdGlsbCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIGVuY29kaW5nIGRlZmluZWQgaW4gdGhlIDx1aWNvbnRyb2w+RW5jb2Rpbmc8L3VpY29udHJvbD4gZmllbGQNCi1pcyB1c2VkLjwvbGk+DQotPC91bD4gPC9ub3RlPiA8L2RkPg0KLTwvZGxlbnRyeT48L2RsPiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiB0aGVuIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8NCi1zYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpwcmVmcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyZjEyMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpwcmVmcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zLCBhZGRpbmcgYXV0b21hdGljYWxseSwgSFRNTCwgZWRpdGluZyBwcmVmZXJlbmNlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zLCBhZGRpbmcgYXV0b21hdGljYWxseSwgSFRNTCwgZWRpdGluZyBwcmVmZXJlbmNlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpwcmVmcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpwcmVmcyI+PGEgbmFtZT0idGpwcmVmcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPiAgVG8gZGVmaW5lIGdlbmVyYWwKLUhUTUwgZmlsZSBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kCi1YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBGaWxlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIGZvbGxvd2luZyBzZXR0aW5ncyByZWxhdGVkIHRvIHNhdmluZyBhbiBIVE1MIHNvdXJjZQotcGFnZS4gVGhlIGRlZmF1bHRzIGFyZSByZWNvbW1lbmRlZCBhbmQgc2hvdWxkIG9ubHkgYmUgbW9kaWZpZWQgd2hlbiB0aGVyZQotaXMgYSBzcGVjaWZpYyByZWFzb24gdG8gZG8gc28uIDwvc3Bhbj4gPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPkxpbmUgZGVsaW1pdGVyPC9kdD4KLQotPGRkPlNwZWNpZnkgdGhlIGFwcHJvcHJpYXRlIEVPTCBjaGFyYWN0ZXIgZm9yIHlvdXIgZW52aXJvbm1lbnQuIFRoZSBkZWZhdWx0Ci1pcyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5ObyB0cmFuc2xhdGlvbjwvc3Bhbj4uPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+QWRkIHRoaXMgc3VmZml4PC9kdD4KLQotPGRkPlNwZWNpZnkgYSBkZWZhdWx0IHN1ZmZpeCBmb3IgZmlsZXMgdGhhdCB5b3Ugc2F2ZS4gVGhlIGRlZmF1bHQgaXMgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5odG1sPC9rYmQ+LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkVuY29kaW5nLCBJQU5BLCAoVXNlIHdvcmtiZW5jaCBkZWZhdWx0KTwvZHQ+Ci0KLTxkZD5TcGVjaWZ5IHRoZSBkZWZhdWx0IGVuY29kaW5nIChjb2RlIHBhZ2UpIGZvciBmaWxlcyB0aGF0IHlvdSBjcmVhdGUuIFRoZQotZGVmYXVsdCBpcyB0aGUgV29ya2JlbmNoJ3MgZW5jb2RpbmcgcHJlZmVyZW5jZS4gPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SW5zZXJ0IERPQ1RZUEUgZGVjbGFyYXRpb248L2R0PgotCi08ZGQ+T3B0aW9uYWxseSwgeW91IGNhbiBhdXRvbWF0aWNhbGx5IGFkZCBhIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gSFRNTCBmaWxlcy4KLVRoZSBkZWZhdWx0IERPQ1RZUEUgaXMgZGV0ZXJtaW5lZCB3aGVuIHlvdSBjcmVhdGUgYW4gSFRNTCBmaWxlIG9yIGEgSlNQIGZpbGUKLXVzaW5nIGEgd2l6YXJkLiBJZiB5b3UgYWRkIHRoZSBET0NUWVBFIGRlY2xhcmF0aW9uLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYXQKLWxlYXN0IGEgUHVibGljIElEIHNwZWNpZmljYXRpb24sIGFuZCwgb3B0aW9uYWxseSwgYSBTeXN0ZW0gSUQuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SW5zZXJ0IEdFTkVSQVRPUiB3aXRoIE1FVEEgdGFnPC9kdD4KLQotPGRkPk9wdGlvbmFsbHksIHNlbGVjdCB0aGUgY2hlY2sgYm94IHRvIHNwZWNpZnkgR0VORVJBVE9SIGluIGEgTUVUQSB0YWcgaW4KLXRoZSBIVE1MIGZpbGUgaGVhZGVyLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkxvYWRpbmcgZmlsZXM8L2R0PgotCi08ZGQ+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbmNvZGluZyAoY29kZSBwYWdlKSBmb3IgZmlsZXMgdGhhdCB5b3Ugb3Blbi4gVGhlCi1kZWZhdWx0IGlzIHRoZSBXb3JrYmVuY2gncyBlbmNvZGluZyBwcmVmZXJlbmNlLiBEZXNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VXNlCi13b3JrYmVuY2ggZGVmYXVsdDwvc3Bhbj4gY2hlY2sgYm94IHRvIHNlbGVjdCBhbm90aGVyIGVuY29kaW5nLiAgIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBFbmNvZGluZwotZGV0ZWN0aW9uICh3aGVuIGxvYWRpbmcgZmlsZXMpIGlzIHBlcmZvcm1lZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAgIDx1bD4KLTxsaT5Mb2NhdGUgdGhlIGVuY29kaW5nIG5hbWUgZW1iZWRkZWQgaW4gdGhlIGRvY3VtZW50LjwvbGk+Ci0KLTxsaT5XaGVuIG5vIGVuY29kaW5nIGlzIGVtYmVkZGVkIGluIHRoZSBkb2N1bWVudCwgYW4gYXV0b21hdGljIGVuY29kaW5nIGRldGVjdG9yCi1hdHRlbXB0cyB0byBkZXRlcm1pbmUgZW5jb2RpbmcgdXNlZCBpbiB0aGUgZG9jdW1lbnQuPC9saT4KLQotPGxpPklmIHRoZSBlbmNvZGluZyBzdGlsbCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIGVuY29kaW5nIGRlZmluZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY29kaW5nPC9zcGFuPiBmaWVsZAotaXMgdXNlZC48L2xpPgotCi08L3VsPgotIDwvZGl2PgotIDwvZGQ+Ci0KLTwvZGw+Ci0gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4gdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8KLXNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzZXJ2ZXJ0YXJnZXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NzE3MTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzZXJ2ZXJ0YXJnZXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0idHNlcnZlcnRhcmdldCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9uczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c2VydmVyczxpbmRleHRlcm0+dGFyZ2V0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5XZWINCi1hcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPnNlcnZlciB0YXJnZXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VG8gc3VwcG9ydCBkaWZmZXJlbnQgSmF2YSBFRSBhcHBsaWNhdGlvbiBzZXJ2ZXJzLCB0aGUgSmF2YSBFRSB0b29saW5nIGFsbG93cw0KLXlvdSB0byB0YXJnZXQgYSBzcGVjaWZpYyBzZXJ2ZXIgZHVyaW5nIHlvdXIgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiAoRUFSKSBwcm9qZWN0DQotZGV2ZWxvcG1lbnQuIEluIG1vc3QgY2FzZXMsIGEgV2ViIHByb2plY3QgbXVzdCB0YXJnZXQgdGhlIHNhbWUgc2VydmVyIGFzIHRoZQ0KLUVBUiBwcm9qZWN0IGluIG9yZGVyIHRvIGRlcGxveSB0aGUgV2ViIGFwcGxpY2F0aW9uIHRvIHRoZSBzZXJ2ZXIgcHJvcGVybHkuIDwvcD4NCi08cD5BZnRlciB5b3UgaGF2ZSBhIFdlYiBwcm9qZWN0IGNyZWF0ZWQsIHlvdSBjYW4gbW9kaWZ5IHRoZSB0YXJnZXQgc2VydmVyDQotdXNpbmcgdGhlIHByb2plY3QncyBwcm9wZXJ0aWVzIGRpYWxvZy4gVG8gZG8gdGhpcywgcmlnaHQtY2xpY2sgb24gdGhlIHByb2plY3QNCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPlNlcnZlcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhmYzA4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIiAvPgotPG1ldGEgY29udGVudD0ic2VydmVycywgdGFyZ2V0aW5nLCBXZWIgYXBwbGljYXRpb25zLCBzZXJ2ZXIgdGFyZ2V0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic2VydmVycywgdGFyZ2V0aW5nLCBXZWIgYXBwbGljYXRpb25zLCBzZXJ2ZXIgdGFyZ2V0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNlcnZlcnRhcmdldCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzZXJ2ZXJ0YXJnZXQiPjxhIG5hbWU9InRzZXJ2ZXJ0YXJnZXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnM8L2gxPgotCi0KLTxkaXY+Ci08cD5UbyBzdXBwb3J0IGRpZmZlcmVudCBKYXZhIEVFIGFwcGxpY2F0aW9uIHNlcnZlcnMsIHRoZSBKYXZhIEVFIHRvb2xpbmcgYWxsb3dzCi15b3UgdG8gdGFyZ2V0IGEgc3BlY2lmaWMgc2VydmVyIGR1cmluZyB5b3VyIEVudGVycHJpc2UgQXBwbGljYXRpb24gKEVBUikgcHJvamVjdAotZGV2ZWxvcG1lbnQuIEluIG1vc3QgY2FzZXMsIGEgV2ViIHByb2plY3QgbXVzdCB0YXJnZXQgdGhlIHNhbWUgc2VydmVyIGFzIHRoZQotRUFSIHByb2plY3QgaW4gb3JkZXIgdG8gZGVwbG95IHRoZSBXZWIgYXBwbGljYXRpb24gdG8gdGhlIHNlcnZlciBwcm9wZXJseS4gPC9wPgotCi08cD5BZnRlciB5b3UgaGF2ZSBhIFdlYiBwcm9qZWN0IGNyZWF0ZWQsIHlvdSBjYW4gbW9kaWZ5IHRoZSB0YXJnZXQgc2VydmVyCi11c2luZyB0aGUgcHJvamVjdCdzIHByb3BlcnRpZXMgZGlhbG9nLiBUbyBkbyB0aGlzLCByaWdodC1jbGljayBvbiB0aGUgcHJvamVjdAotaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXJ2ZXI8L3NwYW4+PC9zcGFuPi48L3A+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y3JlcHJqLmh0bWwiIHRpdGxlPSJZb3UgY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgcmVzb3VyY2VzIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbnMgaW4gV2ViIHByb2plY3RzLiI+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzdHlsZXNoZWV0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjM3ZTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzdHlsZXNoZWV0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzdHlsZXNoZWV0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzPC90aXRsZT4NCi08c2hvcnRkZXNjPkNhc2NhZGluZyBzdHlsZSBzaGVldHMgZW5hYmxlIHlvdSB0byBkZWZpbmUgYSBjb25zaXN0ZW50IGxvb2sgYW5kDQotZmVlbCB0aHJvdWdob3V0IHlvdXIgV2ViIHNpdGUgYnkgbWFpbnRhaW5pbmcgdGhlIGNvbnRlbnRzIChXZWIgcGFnZXMpIGFuZA0KLXRoZSBkZXNpZ24gKHRoZSBzdHlsZSBzaGVldCkgc2VwYXJhdGVseS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zdHlsZSBzaGVldHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UbyBjcmVhdGUgYSBuZXcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0OjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBzdGF0aWMgb3IgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5DQotZG9uZSBzby48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgZXhwYW5kIHlvdXIgcHJvamVjdCBhbmQgcmlnaHQgY2xpY2sgb24NCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICA8L2NtZD48aW5mbz5Ob3RlDQotdGhhdCBpZiB5b3UgY2hvb3NlIGFueSBvdGhlciBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBDU1MgZmlsZSwgdGhlbg0KLWl0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBXQVIgZmlsZSB0aGF0IGlzIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIDwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSBjb250ZXh0IG1lbnUsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4NCi08dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+PHVpY29udHJvbD5XZWI8L3VpY29udHJvbD48dWljb250cm9sPkNTUzwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LjwvY21kPjxzdGVwcmVzdWx0PlRoZSBOZXcgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0IHdpbmRvdyBhcHBlYXJzDQotd2l0aCB5b3VyIGZvbGRlciBzZWxlY3RlZDwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUNCi1hIGNzcyBleHRlbnNpb24gaW4gdGhlIGZpbGUgbmFtZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD4gWW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zIGZvciBwcm9jZWVkaW5nOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+VG8gYWNjZXB0IHRoZSBkZWZhdWx0cyBhc3NvY2lhdGVkIHdpdGggYSBuZXcgQ1NTIGZpbGUsIHNlbGVjdCA8dWljb250cm9sPkZpbmlzaC48L3VpY29udHJvbD48L2Nob2ljZT4NCi08Y2hvaWNlPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgQ1NTIGZpbGUsDQotc2VsZWN0IDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gVGhlIFNlbGVjdCBDU1MgVGVtcGxhdGUgd2luZG93IGFwcGVhcnMuDQotU2VsZWN0IHRoZSA8dWljb250cm9sPlVzZSBDU1MgVGVtcGxhdGU8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQgdGhlbiBzZWxlY3QNCi1vbmUgb2YgdGhlIHNhbXBsZSB0ZW1wbGF0ZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+Q1NTIFRlbXBsYXRlczwvdWljb250cm9sPiBsaW5rDQotdG8gYWRkIG9yIHJlbW92ZSBIVE1MIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHN0eWxlc2hlZXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmYwYTBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJDYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGVuYWJsZSB5b3UgdG8gZGVmaW5lIGEgY29uc2lzdGVudCBsb29rIGFuZCBmZWVsIHRocm91Z2hvdXQgeW91ciBXZWIgc2l0ZSBieSBtYWludGFpbmluZyB0aGUgY29udGVudHMgKFdlYiBwYWdlcykgYW5kIHRoZSBkZXNpZ24gKHRoZSBzdHlsZSBzaGVldCkgc2VwYXJhdGVseS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQ2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBlbmFibGUgeW91IHRvIGRlZmluZSBhIGNvbnNpc3RlbnQgbG9vayBhbmQgZmVlbCB0aHJvdWdob3V0IHlvdXIgV2ViIHNpdGUgYnkgbWFpbnRhaW5pbmcgdGhlIGNvbnRlbnRzIChXZWIgcGFnZXMpIGFuZCB0aGUgZGVzaWduICh0aGUgc3R5bGUgc2hlZXQpIHNlcGFyYXRlbHkuIiAvPgotPG1ldGEgY29udGVudD0ic3R5bGUgc2hlZXRzLCBjcmVhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0eWxlIHNoZWV0cywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzdHlsZXNoZWV0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHN0eWxlc2hlZXQiPjxhIG5hbWU9InRzdHlsZXNoZWV0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzPC9oMT4KLQotCi0KLTxkaXY+PHA+Q2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBlbmFibGUgeW91IHRvIGRlZmluZSBhIGNvbnNpc3RlbnQgbG9vayBhbmQKLWZlZWwgdGhyb3VnaG91dCB5b3VyIFdlYiBzaXRlIGJ5IG1haW50YWluaW5nIHRoZSBjb250ZW50cyAoV2ViIHBhZ2VzKSBhbmQKLXRoZSBkZXNpZ24gKHRoZSBzdHlsZSBzaGVldCkgc2VwYXJhdGVseS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhIG5ldyBjYXNjYWRpbmcgc3R5bGUgc2hlZXQ6PC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdCBpZiB5b3UgaGF2ZSBub3QgYWxyZWFkeQotZG9uZSBzby48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgZXhwYW5kIHlvdXIgcHJvamVjdCBhbmQgcmlnaHQgY2xpY2sgb24KLXlvdXIgV2ViQ29udGVudCBmb2xkZXIgb3Igb24gYSBzdWJmb2xkZXIgdW5kZXIgV2ViQ29udGVudC4gIDwvc3Bhbj4gTm90ZQotdGhhdCBpZiB5b3UgY2hvb3NlIGFueSBvdGhlciBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBDU1MgZmlsZSwgdGhlbgotaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIFdBUiBmaWxlIHRoYXQgaXMgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNTUzwvc3Bhbj4KLTwvc3Bhbj4uPC9zcGFuPiBUaGUgTmV3IENhc2NhZGluZyBTdHlsZSBTaGVldCB3aW5kb3cgYXBwZWFycwotd2l0aCB5b3VyIGZvbGRlciBzZWxlY3RlZDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIGZpbGUgbmFtZSBpbnRvIHRoZSBGaWxlIG5hbWUgZmllbGQsIG1ha2luZyBzdXJlIHlvdSBpbmNsdWRlCi1hIGNzcyBleHRlbnNpb24gaW4gdGhlIGZpbGUgbmFtZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gWW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zIGZvciBwcm9jZWVkaW5nOjwvc3Bhbj4KLTx1bD4KLTxsaT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBDU1MgZmlsZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaC48L3NwYW4+PC9saT4KLQotPGxpPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgQ1NTIGZpbGUsCi1zZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIFRoZSBTZWxlY3QgQ1NTIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLgotU2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgQ1NTIFRlbXBsYXRlPC9zcGFuPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdAotb25lIG9mIHRoZSBzYW1wbGUgdGVtcGxhdGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DU1MgVGVtcGxhdGVzPC9zcGFuPiBsaW5rCi10byBhZGQgb3IgcmVtb3ZlIEhUTUwgdGVtcGxhdGVzIHRvIHlvdXIgbGlzdCBvZiB0ZW1wbGF0ZXMuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYzNiM2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPCEtLSBBcmJvclRleHQsIEluYy4sIDE5ODgtMjAwMiwgdi40MDAyLS0+DQotPHRhc2sgaWQ9InR3Y3JlcHJqIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIHJlc291cmNlcyBmb3IgeW91ciBXZWIgYXBwbGljYXRpb25zDQotaW4gV2ViIHByb2plY3RzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+Y3JlYXRpbmcgZHluYW1pYyBwcm9qZWN0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+V2ViIGFwcGxpY2F0aW9uczxpbmRleHRlcm0+cmVzb3VyY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+IFVubGlrZSB3aXRoIDx4cmVmIGhyZWY9InR3Y3Jlc3RhLmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+c3RhdGljPC94cmVmPiBXZWINCi1wcm9qZWN0cywgIGR5bmFtaWMgV2ViIHByb2plY3RzIGVuYWJsZSB5b3UgdG8gY3JlYXRlIHJlc291cmNlcyBzdWNoIGFzIEphdmFTZXJ2ZXINCi1QYWdlcyBhbmQgc2VydmxldHMuPC9wPjxwPlRvIGNyZWF0ZSBhIG5ldyBkeW5hbWljIFdlYiBwcm9qZWN0LCBjb21wbGV0ZSB0aGUNCi1mb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCByaWdodCBjbGljayBvbiBEeW5hbWljIFdlYiBQcm9qZWN0cywgYW5kDQotc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+RHluYW1pYyBXZWIgUHJvamVjdDwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gVGhlIE5ldyBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZCBzdGFydHMuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPjxiPkdlbmVyYWwgSW5mb3JtYXRpb248L2I+PC9wPjxkbD48ZGxlbnRyeT4NCi08ZHQ+UHJvamVjdCBGYWNldHMgPC9kdD4NCi08ZGQ+QSBmYWNldCByZXByZXNlbnRzIGEgdW5pdCBvZiBmdW5jdGlvbmFsaXR5IGluIGEgV2ViIHByb2plY3QuIEZvciBleGFtcGxlLA0KLXRoZSBEeW5hbWljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIGR5bmFtaWMNCi1XZWIgbW9kdWxlLiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCBmYWNldCBhcHBlYXJzIGluIHRoZSB3aXphcmQgd2hlbg0KLXlvdSBzZWxlY3QgaXQuICBOb3RlIHRoYXQgaW4gbWFueSBpbnN0YW5jZXMsIHlvdSBjYW4gdmlldyB0aGUgY29uc3RyYWludHMNCi1mb3IgYSBwcm9qZWN0IGZhY2V0IGJ5IHJpZ2h0IGNsaWNraW5nIG9uIHRoZSBmYWNldCBhbmQgc2VsZWN0aW5nIHByb2plY3QgY29uc3RyYWludHMNCi1mcm9tIHRoZSBwb3AgdXAgbWVudS4gIDwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5UYXJnZXQgUnVudGltZTwvZHQ+DQotPGRkPlVzZSB0aGlzIGZpZWxkIHRvIGRlZmluZSBhIG5ldyBpbnN0YWxsZWQgcnVudGltZSBlbnZpcm9ubWVudC4gUnVudGltZXMNCi1hcmUgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGNvbXBpbGUgcHJvamVjdHMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCAoRUFSIFByb2plY3QpPC9kdD4NCi08ZGQ+QSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IChFQVIgUHJvamVjdCkgbXVzdCBiZQ0KLWFzc29jaWF0ZWQgd2l0aCB5b3VyIG5ldyBXZWIgcHJvamVjdCB0byBmYWNpbGl0YXRlIGRlcGxveW1lbnQuIElmIHlvdSB3YW50DQotdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QsIHlvdQ0KLWNhbiBkbyBzbyB1c2luZyB0aGUgd2l6YXJkLiBXaGVuIHlvdXIgV2ViIHByb2plY3QgaXMgY3JlYXRlZCBhdCB0aGUgZW5kIG9mDQotdGhlIHdpemFyZCwgdGhlIG5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgaXMgYWxzbyBjcmVhdGVkIHdpdGggdGhlDQotbmFtZSBzcGVjaWZpZWQgaW4gdGhlIEVBUiBwcm9qZWN0IGZpZWxkLiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgaXMgdGhlIG5hbWUNCi1vZiB0aGUgd2ViIHByb2plY3QgYXBwZW5kZWQgd2l0aCBFQVIgKHVubGVzcyB0aGUgZWFyIHByb2plY3Qgd2FzIHNlbGVjdGVkDQotd2hlbiB5b3Ugb3BlbmVkIHRoZSB3aXphcmQuKTwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Db250ZXh0IFJvb3Q8L2R0Pg0KLTxkZD5UaGUgY29udGV4dCByb290IGlzIHRoZSBXZWIgYXBwbGljYXRpb24gcm9vdCwgd2hpY2ggaXMgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkNCi1vZiB5b3VyIGFwcGxpY2F0aW9uIHdoZW4gaXQgaXMgZGVwbG95ZWQgdG8gdGhlIFdlYiBzZXJ2ZXIuIFlvdSBjYW4gY2hhbmdlDQotdGhlIGNvbnRleHQgcm9vdCBhZnRlciB5b3UgY3JlYXRlIGEgcHJvamVjdCB1c2luZyB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZywNCi13aGljaCB5b3UgYWNjZXNzIGZyb20gdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS4gVGhlIGNvbnRleHQgcm9vdCBjYW4gYWxzbw0KLWJlIHVzZWQgYnkgdGhlIGxpbmtzIGJ1aWxkZXIgdG8gZW5zdXJlIHRoYXQgeW91ciBsaW5rcyByZW1haW4gcmVhZHkgdG8gcHVibGlzaA0KLWFzIHlvdSBtb3ZlIGFuZCByZW5hbWUgZmlsZXMgaW5zaWRlIHlvdXIgcHJvamVjdC48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVwcmouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2FlN2QxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgcmVzb3VyY2VzIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbnMgaW4gV2ViIHByb2plY3RzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgcmVzb3VyY2VzIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbnMgaW4gV2ViIHByb2plY3RzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwcm9qZWN0cywgY3JlYXRpbmcgZHluYW1pYyBwcm9qZWN0cywgV2ViIGFwcGxpY2F0aW9ucywgcmVzb3VyY2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCBjcmVhdGluZyBkeW5hbWljIHByb2plY3RzLCBXZWIgYXBwbGljYXRpb25zLCByZXNvdXJjZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGpjcmVqc3AuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njc3RhdGljLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3dlYnByai5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3Y3JlcHJqIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2NyZXByaiI+PGEgbmFtZT0idHdjcmVwcmoiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvaDE+Ci0KLQotCi08ZGl2PjxwPllvdSBjcmVhdGUgYW5kIG1haW50YWluIHRoZSByZXNvdXJjZXMgZm9yIHlvdXIgV2ViIGFwcGxpY2F0aW9ucwotaW4gV2ViIHByb2plY3RzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPiBVbmxpa2Ugd2l0aCA8YSBocmVmPSJ0d2NyZXN0YS5odG1sIiB0aXRsZT0iIj5zdGF0aWM8L2E+IFdlYgotcHJvamVjdHMsICBkeW5hbWljIFdlYiBwcm9qZWN0cyBlbmFibGUgeW91IHRvIGNyZWF0ZSByZXNvdXJjZXMgc3VjaCBhcyBKYXZhU2VydmVyCi1QYWdlcyBhbmQgc2VydmxldHMuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IGR5bmFtaWMgV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZQotZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+T3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCByaWdodCBjbGljayBvbiBEeW5hbWljIFdlYiBQcm9qZWN0cywgYW5kCi1zZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RHluYW1pYyBXZWIgUHJvamVjdDwvc3Bhbj4KLTwvc3Bhbj4gZnJvbSB0aGUgY29udGV4dCBtZW51LiBUaGUgTmV3IER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkIHN0YXJ0cy48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD48c3Ryb25nPkdlbmVyYWwgSW5mb3JtYXRpb248L3N0cm9uZz48L3A+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+UHJvamVjdCBGYWNldHMgPC9kdD4KLQotPGRkPkEgZmFjZXQgcmVwcmVzZW50cyBhIHVuaXQgb2YgZnVuY3Rpb25hbGl0eSBpbiBhIFdlYiBwcm9qZWN0LiBGb3IgZXhhbXBsZSwKLXRoZSBEeW5hbWljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIGR5bmFtaWMKLVdlYiBtb2R1bGUuIEEgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBwcm9qZWN0IGZhY2V0IGFwcGVhcnMgaW4gdGhlIHdpemFyZCB3aGVuCi15b3Ugc2VsZWN0IGl0LiAgTm90ZSB0aGF0IGluIG1hbnkgaW5zdGFuY2VzLCB5b3UgY2FuIHZpZXcgdGhlIGNvbnN0cmFpbnRzCi1mb3IgYSBwcm9qZWN0IGZhY2V0IGJ5IHJpZ2h0IGNsaWNraW5nIG9uIHRoZSBmYWNldCBhbmQgc2VsZWN0aW5nIHByb2plY3QgY29uc3RyYWludHMKLWZyb20gdGhlIHBvcCB1cCBtZW51LiAgPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+VGFyZ2V0IFJ1bnRpbWU8L2R0PgotCi08ZGQ+VXNlIHRoaXMgZmllbGQgdG8gZGVmaW5lIGEgbmV3IGluc3RhbGxlZCBydW50aW1lIGVudmlyb25tZW50LiBSdW50aW1lcwotYXJlIHVzZWQgYXQgYnVpbGQgdGltZSB0byBjb21waWxlIHByb2plY3RzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCAoRUFSIFByb2plY3QpPC9kdD4KLQotPGRkPkEgbmV3IG9yIGV4aXN0aW5nIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCAoRUFSIFByb2plY3QpIG11c3QgYmUKLWFzc29jaWF0ZWQgd2l0aCB5b3VyIG5ldyBXZWIgcHJvamVjdCB0byBmYWNpbGl0YXRlIGRlcGxveW1lbnQuIElmIHlvdSB3YW50Ci10byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCwgeW91Ci1jYW4gZG8gc28gdXNpbmcgdGhlIHdpemFyZC4gV2hlbiB5b3VyIFdlYiBwcm9qZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZCBvZgotdGhlIHdpemFyZCwgdGhlIG5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgaXMgYWxzbyBjcmVhdGVkIHdpdGggdGhlCi1uYW1lIHNwZWNpZmllZCBpbiB0aGUgRUFSIHByb2plY3QgZmllbGQuIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBpcyB0aGUgbmFtZQotb2YgdGhlIHdlYiBwcm9qZWN0IGFwcGVuZGVkIHdpdGggRUFSICh1bmxlc3MgdGhlIGVhciBwcm9qZWN0IHdhcyBzZWxlY3RlZAotd2hlbiB5b3Ugb3BlbmVkIHRoZSB3aXphcmQuKTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkNvbnRleHQgUm9vdDwvZHQ+Ci0KLTxkZD5UaGUgY29udGV4dCByb290IGlzIHRoZSBXZWIgYXBwbGljYXRpb24gcm9vdCwgd2hpY2ggaXMgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkKLW9mIHlvdXIgYXBwbGljYXRpb24gd2hlbiBpdCBpcyBkZXBsb3llZCB0byB0aGUgV2ViIHNlcnZlci4gWW91IGNhbiBjaGFuZ2UKLXRoZSBjb250ZXh0IHJvb3QgYWZ0ZXIgeW91IGNyZWF0ZSBhIHByb2plY3QgdXNpbmcgdGhlIHByb2plY3QgUHJvcGVydGllcyBkaWFsb2csCi13aGljaCB5b3UgYWNjZXNzIGZyb20gdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS4gVGhlIGNvbnRleHQgcm9vdCBjYW4gYWxzbwotYmUgdXNlZCBieSB0aGUgbGlua3MgYnVpbGRlciB0byBlbnN1cmUgdGhhdCB5b3VyIGxpbmtzIHJlbWFpbiByZWFkeSB0byBwdWJsaXNoCi1hcyB5b3UgbW92ZSBhbmQgcmVuYW1lIGZpbGVzIGluc2lkZSB5b3VyIHByb2plY3QuPC9kZD4KLQotPC9kbD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3N0YXRpYy5odG1sIj5TdGF0aWMgV2ViIHByb2plY3RzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2N3ZWJwcmouaHRtbCI+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGpjcmVqc3AuaHRtbCIgdGl0bGU9IiI+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmU1MTMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d2NyZXN0YSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c3RhdGljIFdlYiBwcm9qZWN0czxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+Y3JlYXRpbmcgc3RhdGljPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD4gSW4gdGhlIHdvcmtiZW5jaCwgeW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gcmVzb3VyY2VzIGZvciBXZWIgYXBwbGljYXRpb25zDQotaW4gV2ViIHByb2plY3RzLiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBzdGF0aWMsIGNvbnRlbnQtYmFzZWQgV2ViIGFwcGxpY2F0aW9uDQotdGhhdCBjb250YWlucyBubyBkeW5hbWljIGVsZW1lbnRzLCBzdWNoIGFzIEpTUCBmaWxlcyBvciBzZXJ2bGV0cywgdXNlIHRoZSA8cGg+PHVpY29udHJvbD5OZXcNCi1TdGF0aWMgV2ViIFByb2plY3Q8L3VpY29udHJvbD48L3BoPiB3aXphcmQuIDwvcD48cD5UbyBjcmVhdGUgYSBuZXcgc3RhdGljDQotV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIDwvY21kPjxpbmZvPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgcmlnaHQgY2xpY2sgb24gT3RoZXIgUHJvamVjdHMgYW5kIHNlbGVjdCA8Yj5OZXctPk90aGVyLT5XZWItPlN0YXRpYw0KLVdlYiBQcm9qZWN0PC9iPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuIFRoZSBOZXcgU3RhdGljIFdlYiBQcm9qZWN0IHdpemFyZCBzdGFydHMuIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0czwvY21kPjxpbmZvPjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD48Yj5HZW5lcmFsIEluZm9ybWF0aW9uPC9iPjwvcD48ZGw+PGRsZW50cnk+DQotPGR0PlByb2plY3QgRmFjZXRzIDwvZHQ+DQotPGRkPkEgZmFjZXQgcmVwcmVzZW50cyBhIHVuaXQgb2YgZnVuY3Rpb25hbGl0eSBpbiBhIFdlYiBwcm9qZWN0LiBGb3IgZXhhbXBsZSwNCi10aGUgU3RhdGljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIHN0YXRpYw0KLVdlYiBtb2R1bGUuIEEgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBwcm9qZWN0IGZhY2V0IGFwcGVhcnMgaW4gdGhlIHdpemFyZCB3aGVuDQoteW91IHNlbGVjdCBpdC4gIE5vdGUgdGhhdCBpbiBtYW55IGluc3RhbmNlcywgeW91IGNhbiB2aWV3IHRoZSBjb25zdHJhaW50cw0KLWZvciBhIHByb2plY3QgZmFjZXQgYnkgcmlnaHQgY2xpY2tpbmcgb24gdGhlIGZhY2V0IGFuZCBzZWxlY3RpbmcgcHJvamVjdCBjb25zdHJhaW50cw0KLWZyb20gdGhlIHBvcCB1cCBtZW51LiAgPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlRhcmdldCBSdW50aW1lPC9kdD4NCi08ZGQ+VXNlIHRoaXMgZmllbGQgdG8gZGVmaW5lIGEgbmV3IGluc3RhbGxlZCBydW50aW1lIGVudmlyb25tZW50LiBSdW50aW1lcw0KLWFyZSB1c2VkIGF0IGJ1aWxkIHRpbWUgdG8gY29tcGlsZSBwcm9qZWN0cy4gPC9kZD4NCi08L2RsZW50cnk+PC9kbD48ZGw+PGRsZW50cnk+DQotPGR0PldlYiBDb250ZW50IEZvbGRlcjwvZHQ+DQotPGRkPlRoZSBmb2xkZXIgaW4gd2hpY2ggeW91IHdhbnQgdG8gc3RvcmUgeW91ciBwdWJsaXNoYWJsZSByZXNvdXJjZXMuIDwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOWFmMDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSIiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIiAvPgotPG1ldGEgY29udGVudD0ic3RhdGljIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcsIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcgc3RhdGljIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic3RhdGljIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcsIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcgc3RhdGljIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njc3RhdGljLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdjcmVzdGEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdjcmVzdGEiPjxhIG5hbWU9InR3Y3Jlc3RhIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdDwvaDE+Ci0KLQotCi08ZGl2PjxwIC8+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiBJbiB0aGUgd29ya2JlbmNoLCB5b3UgY3JlYXRlIGFuZCBtYWludGFpbiByZXNvdXJjZXMgZm9yIFdlYiBhcHBsaWNhdGlvbnMKLWluIFdlYiBwcm9qZWN0cy4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgc3RhdGljLCBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbgotdGhhdCBjb250YWlucyBubyBkeW5hbWljIGVsZW1lbnRzLCBzdWNoIGFzIEpTUCBmaWxlcyBvciBzZXJ2bGV0cywgdXNlIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcKLVN0YXRpYyBXZWIgUHJvamVjdDwvc3Bhbj48L3NwYW4+IHdpemFyZC4gPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IHN0YXRpYwotV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSA8L3NwYW4+IDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIHJpZ2h0IGNsaWNrIG9uIE90aGVyIFByb2plY3RzIGFuZCBzZWxlY3QgPHN0cm9uZz5OZXctJmd0O090aGVyLSZndDtXZWItJmd0O1N0YXRpYwotV2ViIFByb2plY3Q8L3N0cm9uZz4gZnJvbSB0aGUgY29udGV4dCBtZW51LiBUaGUgTmV3IFN0YXRpYyBXZWIgUHJvamVjdCB3aXphcmQgc3RhcnRzLiA8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0czwvc3Bhbj4gPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+PHN0cm9uZz5HZW5lcmFsIEluZm9ybWF0aW9uPC9zdHJvbmc+PC9wPgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPlByb2plY3QgRmFjZXRzIDwvZHQ+Ci0KLTxkZD5BIGZhY2V0IHJlcHJlc2VudHMgYSB1bml0IG9mIGZ1bmN0aW9uYWxpdHkgaW4gYSBXZWIgcHJvamVjdC4gRm9yIGV4YW1wbGUsCi10aGUgU3RhdGljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIHN0YXRpYwotV2ViIG1vZHVsZS4gQSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIHByb2plY3QgZmFjZXQgYXBwZWFycyBpbiB0aGUgd2l6YXJkIHdoZW4KLXlvdSBzZWxlY3QgaXQuICBOb3RlIHRoYXQgaW4gbWFueSBpbnN0YW5jZXMsIHlvdSBjYW4gdmlldyB0aGUgY29uc3RyYWludHMKLWZvciBhIHByb2plY3QgZmFjZXQgYnkgcmlnaHQgY2xpY2tpbmcgb24gdGhlIGZhY2V0IGFuZCBzZWxlY3RpbmcgcHJvamVjdCBjb25zdHJhaW50cwotZnJvbSB0aGUgcG9wIHVwIG1lbnUuICA8L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5UYXJnZXQgUnVudGltZTwvZHQ+Ci0KLTxkZD5Vc2UgdGhpcyBmaWVsZCB0byBkZWZpbmUgYSBuZXcgaW5zdGFsbGVkIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFJ1bnRpbWVzCi1hcmUgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGNvbXBpbGUgcHJvamVjdHMuIDwvZGQ+Ci0KLTwvZGw+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+V2ViIENvbnRlbnQgRm9sZGVyPC9kdD4KLQotPGRkPlRoZSBmb2xkZXIgaW4gd2hpY2ggeW91IHdhbnQgdG8gc3RvcmUgeW91ciBwdWJsaXNoYWJsZSByZXNvdXJjZXMuIDwvZGQ+Ci0KLTwvZGw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY2NzdGF0aWMuaHRtbCI+U3RhdGljIFdlYiBwcm9qZWN0czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXdhci5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjY5OWFiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXdhci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d2NyZXdhciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5leHBvcnRpbmc8aW5kZXh0ZXJtPldBUiBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+V0FSIGZpbGVzPGluZGV4dGVybT5leHBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+ZXhwb3J0aW5nIFdBUiBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPiBBIFdlYiBhcmNoaXZlIChXQVIpIGZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24gdGhhdA0KLWNhbiBiZSBleHBvcnRlZCB0byB0ZXN0LCBwdWJsaXNoLCBhbmQgZGVwbG95IHRoZSByZXNvdXJjZXMgZGV2ZWxvcGVkIHdpdGhpbg0KLWEgV2ViIHByb2plY3QuPC9wPjxwPlRvIGV4cG9ydCBhIFdBUiBmaWxlIGZyb20gYSBXZWIgcHJvamVjdCwgZG8gdGhlIGZvbGxvd2luZzogPC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodCBjbGljayBvbiBhIFdlYiBwcm9qZWN0IGZvbGRlciBhbmQgc2VsZWN0IDxiPkV4cG9ydDwvYj4gZnJvbQ0KLXRoZSBwb3AtdXAgbWVudS4gVGhlbiBzZWxlY3Q8Yj4gV0FSIGZpbGU8L2I+IGluIHRoZSBFeHBvcnQgd2luZG93IGFuZCB0aGVuDQotc2VsZWN0IDxiPk5leHQ8L2I+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIFdlYiBwcm9qZWN0IHlvdSB3YW50IHRvIGV4cG9ydCAodGhpcyBmaWVsZCBpcyBwcmltZWQNCi1pZiB5b3UgdXNlZCB0aGUgcG9wLXVwIG1lbnUgdG8gb3BlbiB0aGUgd2l6YXJkKSwgYW5kIHNwZWNpZnkgYSBsb2NhdGlvbiBmb3INCi10aGUgbmV3IFdBUiBmaWxlPC9jbWQ+PC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPk9wdGlvbmFsbHksIHN1cHBseSBXQVIgZXhwb3J0IDxwaD5PcHRpb25zPC9waD4sDQotc3VjaCBhcyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNvdXJjZSBmaWxlcyBpbiB0aGUgV0FSLCBhbmQgd2hldGhlcg0KLXRvIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgcmVzb3VyY2VzIGR1cmluZyB0aGUgZXhwb3J0IHByb2Nlc3MuIDwvY21kPjxpbmZvPlNvdXJjZQ0KLWZpbGVzIGFyZSBub3QgdXN1YWxseSBpbmNsdWRlZCBpbiBhIFdBUiBmaWxlLCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBuZWNlc3NhcnkNCi1mb3IgdGhlIHNlcnZlciB0byBydW4gdGhlIHdlYiBhcHBsaWNhdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHBoPjx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+PC9waD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNjU3Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyIgLz4KLTxtZXRhIGNvbnRlbnQ9ImV4cG9ydGluZywgV0FSIGZpbGVzLCBXZWIgcHJvamVjdHMsIGV4cG9ydGluZyBXQVIgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJleHBvcnRpbmcsIFdBUiBmaWxlcywgV2ViIHByb2plY3RzLCBleHBvcnRpbmcgV0FSIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdjcmV3YXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Y3Jld2FyIj48YSBuYW1lPSJ0d2NyZXdhciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPiBBIFdlYiBhcmNoaXZlIChXQVIpIGZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24gdGhhdAotY2FuIGJlIGV4cG9ydGVkIHRvIHRlc3QsIHB1Ymxpc2gsIGFuZCBkZXBsb3kgdGhlIHJlc291cmNlcyBkZXZlbG9wZWQgd2l0aGluCi1hIFdlYiBwcm9qZWN0LjwvcD4KLTxwPlRvIGV4cG9ydCBhIFdBUiBmaWxlIGZyb20gYSBXZWIgcHJvamVjdCwgZG8gdGhlIGZvbGxvd2luZzogPC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gYSBXZWIgcHJvamVjdCBmb2xkZXIgYW5kIHNlbGVjdCA8c3Ryb25nPkV4cG9ydDwvc3Ryb25nPiBmcm9tCi10aGUgcG9wLXVwIG1lbnUuIFRoZW4gc2VsZWN0PHN0cm9uZz4gV0FSIGZpbGU8L3N0cm9uZz4gaW4gdGhlIEV4cG9ydCB3aW5kb3cgYW5kIHRoZW4KLXNlbGVjdCA8c3Ryb25nPk5leHQ8L3N0cm9uZz4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgV2ViIHByb2plY3QgeW91IHdhbnQgdG8gZXhwb3J0ICh0aGlzIGZpZWxkIGlzIHByaW1lZAotaWYgeW91IHVzZWQgdGhlIHBvcC11cCBtZW51IHRvIG9wZW4gdGhlIHdpemFyZCksIGFuZCBzcGVjaWZ5IGEgbG9jYXRpb24gZm9yCi10aGUgbmV3IFdBUiBmaWxlPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+T3B0aW9uYWxseSwgc3VwcGx5IFdBUiBleHBvcnQgPHNwYW4+T3B0aW9uczwvc3Bhbj4sCi1zdWNoIGFzIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgSmF2YeKEoiBzb3VyY2UgZmlsZXMgaW4gdGhlIFdBUiwgYW5kIHdoZXRoZXIKLXRvIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgcmVzb3VyY2VzIGR1cmluZyB0aGUgZXhwb3J0IHByb2Nlc3MuIDwvc3Bhbj4gU291cmNlCi1maWxlcyBhcmUgbm90IHVzdWFsbHkgaW5jbHVkZWQgaW4gYSBXQVIgZmlsZSwgYmVjYXVzZSB0aGV5IGFyZSBub3QgbmVjZXNzYXJ5Ci1mb3IgdGhlIHNlcnZlciB0byBydW4gdGhlIHdlYiBhcHBsaWNhdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3dhcm92ci5odG1sIj5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Y2ZjYzguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Zzci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d2N2c3IiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmJ1aWxkIG91dHB1dCBmb2xkZXJzPGluZGV4dGVybT5pZ25vcmluZyBpbiBDVlM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkNWUzxpbmRleHRlcm0+c2V0dGluZyByZXBvc2l0b3J5IGRlZmF1bHRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5jdnNpZ25vcmUgZmlsZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5yZXBvc2l0b3JpZXM8aW5kZXh0ZXJtPmRlZmF1bHQgQ1ZTIHNldHRpbmdzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+V2hlbiB5b3UgdXNlIGEgQ1ZTIHJlcG9zaXRvcnkgZHVyaW5nIHRlYW0gZGV2ZWxvcG1lbnQsIHlvdSBtaWdodA0KLXdhbnQgdG8gdXNlIHRoZSBmb2xsb3dpbmcgc2V0dXAgdG8gZW5zdXJlIHRoYXQgdGhlIENWUyB2ZXJzaW9uaW5nIHN1cHBvcnQNCi1pZ25vcmVzIHRoZSBwcm9qZWN0J3MgYnVpbGQgb3V0cHV0IGZvbGRlcjo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBmaWxlIGNhbGxlZCAuY3ZzaWdub3JlIGluIHlvdXIgcHJvamVjdCdzIDxmaWxlcGF0aD5XZWJDb250ZW50L1dFQi1JTkY8L2ZpbGVwYXRoPiBmb2xkZXIuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhpcyBmaWxlLCBhZGQgYSBsaW5lIHdpdGggdGhlIG5hbWUgb2YgdGhlIGJ1aWxkIG91dHB1dCBmb2xkZXINCi0oZm9yIGV4YW1wbGUsIDxjb2RlcGg+Y2xhc3NlczwvY29kZXBoPikuPC9jbWQ+PGluZm8+PHA+Q3VycmVudGx5LCB5b3UgaGF2ZQ0KLXRoZSBvcHRpb24gb2YgY3JlYXRpbmcgdGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgKGFzIGEgZmVhdHVyZSkgd2hlbiB1c2luZyB0aGUNCi1OZXcgRHluYW1pYyBXZWIgUHJvamVjdCB3aXphcmQuPC9wPjxwPldoZW4geW91IHN5bmNocm9uaXplIHdpdGggYSBDVlMgdGVhbQ0KLXN0cmVhbSwgdGhlIG91dHB1dCBmb2xkZXIgd2lsbCBiZSBpZ25vcmVkLjwvcD48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gYWRkaXRpb24sIHlvdSBzaG91bGQgdHVybiBvZmYgdGhlIDxwaD48dWljb250cm9sPlBydW5lIGVtcHR5DQotZGlyZWN0b3JpZXM8L3VpY29udHJvbD48L3BoPiBvcHRpb24uIFNlbGVjdCA8cGg+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93czwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvcGg+LCBzd2l0Y2ggdG8gdGhlIDxwaD48bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5UZWFtPC91aWNvbnRyb2w+PHVpY29udHJvbD5DVlM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvcGg+IHByb3BlcnRpZXMNCi1wYWdlLCBhbmQgZW5zdXJlIHRoYXQgdGhlIDxwaD48dWljb250cm9sPlBydW5lIGVtcHR5IGRpcmVjdG9yaWVzPC91aWNvbnRyb2w+PC9waD4gY2hlY2sNCi1ib3ggaXMgbm90IGNoZWNrZWQuPC9jbWQ+PGluZm8+PHA+SWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgeW91ciBXZWIgcHJvamVjdCdzDQotc291cmNlIGRpcmVjdG9yeSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBkZWxldGVkIHdoZW4gdGhlIHByb2plY3QgaXMgYWRkZWQgdG8NCi15b3VyIHdvcmtzcGFjZSBmcm9tIGEgQ1ZTIHJlcG9zaXRvcnksIGNhdXNpbmcgYSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBlcnJvci48L3A+PC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2N2c3IuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2N2c3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2ZTUyZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIiAvPgotPG1ldGEgY29udGVudD0iYnVpbGQgb3V0cHV0IGZvbGRlcnMsIGlnbm9yaW5nIGluIENWUywgQ1ZTLCBzZXR0aW5nIHJlcG9zaXRvcnkgZGVmYXVsdHMsIGN2c2lnbm9yZSBmaWxlcywgY3JlYXRpbmcsIHJlcG9zaXRvcmllcywgZGVmYXVsdCBDVlMgc2V0dGluZ3MiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJidWlsZCBvdXRwdXQgZm9sZGVycywgaWdub3JpbmcgaW4gQ1ZTLCBDVlMsIHNldHRpbmcgcmVwb3NpdG9yeSBkZWZhdWx0cywgY3ZzaWdub3JlIGZpbGVzLCBjcmVhdGluZywgcmVwb3NpdG9yaWVzLCBkZWZhdWx0IENWUyBzZXR0aW5ncyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdjdnNyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdjdnNyIj48YSBuYW1lPSJ0d2N2c3IiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHM8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+V2hlbiB5b3UgdXNlIGEgQ1ZTIHJlcG9zaXRvcnkgZHVyaW5nIHRlYW0gZGV2ZWxvcG1lbnQsIHlvdSBtaWdodAotd2FudCB0byB1c2UgdGhlIGZvbGxvd2luZyBzZXR1cCB0byBlbnN1cmUgdGhhdCB0aGUgQ1ZTIHZlcnNpb25pbmcgc3VwcG9ydAotaWdub3JlcyB0aGUgcHJvamVjdCdzIGJ1aWxkIG91dHB1dCBmb2xkZXI6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIGZpbGUgY2FsbGVkIC5jdnNpZ25vcmUgaW4geW91ciBwcm9qZWN0J3MgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5XZWJDb250ZW50L1dFQi1JTkY8L3NwYW4+IGZvbGRlci48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoaXMgZmlsZSwgYWRkIGEgbGluZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBvdXRwdXQgZm9sZGVyCi0oZm9yIGV4YW1wbGUsIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmNsYXNzZXM8L3NhbXA+KS48L3NwYW4+IDxwPkN1cnJlbnRseSwgeW91IGhhdmUKLXRoZSBvcHRpb24gb2YgY3JlYXRpbmcgdGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgKGFzIGEgZmVhdHVyZSkgd2hlbiB1c2luZyB0aGUKLU5ldyBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZC48L3A+Ci08cD5XaGVuIHlvdSBzeW5jaHJvbml6ZSB3aXRoIGEgQ1ZTIHRlYW0KLXN0cmVhbSwgdGhlIG91dHB1dCBmb2xkZXIgd2lsbCBiZSBpZ25vcmVkLjwvcD4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gYWRkaXRpb24sIHlvdSBzaG91bGQgdHVybiBvZmYgdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBydW5lIGVtcHR5Ci1kaXJlY3Rvcmllczwvc3Bhbj48L3NwYW4+IG9wdGlvbi4gU2VsZWN0IDxzcGFuPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93czwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPjwvc3Bhbj48L3NwYW4+LCBzd2l0Y2ggdG8gdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5UZWFtPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNWUzwvc3Bhbj48L3NwYW4+PC9zcGFuPiBwcm9wZXJ0aWVzCi1wYWdlLCBhbmQgZW5zdXJlIHRoYXQgdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBydW5lIGVtcHR5IGRpcmVjdG9yaWVzPC9zcGFuPjwvc3Bhbj4gY2hlY2sKLWJveCBpcyBub3QgY2hlY2tlZC48L3NwYW4+IDxwPklmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIHlvdXIgV2ViIHByb2plY3Qncwotc291cmNlIGRpcmVjdG9yeSBpcyBlbXB0eSwgaXQgd2lsbCBiZSBkZWxldGVkIHdoZW4gdGhlIHByb2plY3QgaXMgYWRkZWQgdG8KLXlvdXIgd29ya3NwYWNlIGZyb20gYSBDVlMgcmVwb3NpdG9yeSwgY2F1c2luZyBhIEphdmHihKIgYnVpbGQgZXJyb3IuPC9wPgotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ZsdHdpei5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Zmx0d2l6LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzkyZmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Zmx0d2l6LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3Zmx0d2l6IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBGaWx0ZXJzPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoZSBmaWx0ZXJzIHdpemFyZCBoZWxwcyB5b3UgdG8gY3JlYXRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNlcnZsZXQgZmlsdGVycyBieSB3YWxraW5nIHlvdSB0aHJvdWdoDQotdGhlIGNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZQ0KLW9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVycyBjYW4NCi1ydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c2VydmxldHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+VG8gY3JlYXRlIGEgZmlsdGVyLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLCBleHBhbmQgeW91ciAgPHhyZWYgaHJlZj0iY2N3ZWJwcmouZGl0YSINCi1zY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPmR5bmFtaWMgcHJvamVjdDwveHJlZj4gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldy48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5SaWdodCBjbGljayBvbiB0aGUgPGI+RmlsdGVyPC9iPiBpY29uLCBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+RmlsdGVyPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gZnJvbQ0KLXRoZSBwb3AtdXAgbWVudS48L2NtZD48c3RlcHJlc3VsdD4gVGhlIDx1aWNvbnRyb2w+Q3JlYXRlIEZpbHRlcjwvdWljb250cm9sPiB3aXphcmQNCi1hcHBlYXJzLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gb2xsb3cgdGhlIHByb2plY3Qgd2l6YXJkIHByb21wdHMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+PGI+R2VuZXJhbCBJbmZvcm1hdGlvbjwvYj48L3A+PGRsPjxkbGVudHJ5Pg0KLTxkdD5Nb2RpZmllcnM8L2R0Pg0KLTxkZD5UaGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0IDIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBzdGF0ZXMNCi10aGF0IGEgU2VydmxldCBjbGFzcyBtdXN0IGJlIDxiPnB1YmxpYzwvYj4gYW5kIG5vdCA8Yj5hYnN0cmFjdDwvYj4uIFRoZXJlZm9yZSwNCi15b3UgY2Fubm90IGNoYW5nZSB0aGVzZSBtb2RpZmllcnMuIFRoZSBvbmx5IG9uZSBhdmFpbGFibGUgZm9yIGNoYW5nZSBpcyB0aGUgPGI+ZmluYWw8L2I+IG1vZGlmaWVyLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5JbnRlcmZhY2VzPC9kdD4NCi08ZGQ+VGhlcmUgaXMgb25lIG9ibGlnYXRvcnkgaW50ZXJmYWNlIHRoYXQgZmlsdGVyIGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6IDxiPmphdmF4LnNlcnZsZXQuRmlsdGVyPC9iPi4NCi1UaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGlzIHVzZWQgdG8gcmVwcmVzZW50DQotdGhlIGxpZmUtY3ljbGUgb2YgdGhlIGZpbHRlci4gVGhpcyBpbnRlcmZhY2UgaGFzIHRocmVlIG1ldGhvZHM6IGluaXQsIGRvRmlsdGVyDQotYW5kIGRlc3Ryb3kuIDx1bD4NCi08bGk+VGhlIDxiPmluaXQ8L2I+IG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyIG9ubHkgb25jZSwgd2hlbg0KLWl0IGZpbmlzaGVzIGluc3RhbnRpYXRpbmcgdGhlIGZpbHRlci48L2xpPg0KLTxsaT5UaGU8Yj5kb0ZpbHRlcjwvYj4gbWV0aG9kIGlzIHdoZXJlIHRoZSBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGFuZCBpcyBjYWxsZWQNCi1ldmVyeSB0aW1lIGEgdXNlciByZXF1ZXN0cyBhIHJlc291cmNlLCBzdWNoIGFzIGEgc2VydmxldCwgdG8gd2hpY2ggdGhlIGZpbHRlcg0KLWlzIG1hcHBlZC48L2xpPg0KLTxsaT5UaGUgPGI+ZGVzdHJveTwvYj4gbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIgdG8gdGVsbCB0aGUNCi1maWx0ZXIgdGhhdCBpdCB3aWxsIGJlIHRha2VuIG91dCBvZiBzZXJ2aWNlLjwvbGk+DQotPC91bD4gQWx0aG91Z2gsIHRoYXQgdGhlIGphdmF4LnNlcnZsZXQuRmlsdGVyIGludGVyZmFjZSBpcyBwcm92aWRlZCBpbiB0aGUgPGI+SW50ZXJmYWNlczwvYj4gZmllbGQNCi1ieSBkZWZhdWx0LCB5b3UgY2FuIGFkZCBhZGRpdGlvbmFsIGludGVyZmFjZXMgdG8gaW1wbGVtZW50IGJ5IHVzaW5nIHRoZSA8Yj5BZGQ8L2I+IGJ1dHRvbi48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW50ZXJmYWNlIHNlbGVjdGlvbiBkaWFsb2c8L2R0Pg0KLTxkZD5UaGlzIGRpYWxvZyBhcHBlYXJzIGlmIHlvdSBzZWxlY3QgdG8gYWRkIGFuIGludGVyZmFjZSB0byB5b3VyIGZpbHRlci4NCi1BcyB5b3UgdHlwZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgeW91IGFyZSBhZGRpbmcsIGEgbGlzdCBvZiBhdmFpbGFibGUNCi1pbnRlcmZhY2VzIGxpc3RlZCBpbiB0aGUgPGI+TWF0Y2hpbmcgaXRlbXM8L2I+IGxpc3QgYm94IHVwZGF0ZXMgZHluYW1pY2FsbHkNCi10byBkaXNwbGF5IG9ubHkgdGhlIGludGVyZmFjZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gQ2hvb3NlIGFuIGludGVyZmFjZQ0KLXRvIHNlZSB0aGUgcXVhbGlmaWVyLCBhbmQgdGhlbiBjbGljayA8Yj5PSzwvYj4gd2hlbiBmaW5pc2hlZC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+RmlsdGVyIE1hcHBpbmdzPC9kdD4NCi08ZGQ+Rm9yIGEgZmlsdGVyIHRvIGludGVyY2VwdCBhIHJlcXVlc3QgdG8gYSBzZXJ2bGV0LCB5b3UgbXVzdDogPG9sPg0KLTxsaT5kZWNsYXJlIHRoZSBmaWx0ZXIgd2l0aCBhIDxiPiZsdDtmaWx0ZXImZ3Q7PC9iPiBlbGVtZW50IGluIHRoZSBkZXBsb3ltZW50DQotZGVzY3JpcHRvcjwvbGk+DQotPGxpPm1hcCB0aGUgZmlsdGVyIHRvIHRoZSBzZXJ2bGV0IHVzaW5nIHRoZSA8Yj4mbHQ7ZmlsdGVyLW1hcHBpbmcmZ3Q7PC9iPiANCi1lbGVtZW50LjwvbGk+DQotPC9vbD4gU29tZXRpbWVzIHlvdSB3YW50IGEgZmlsdGVyIHRvIHdvcmsgb24gbXVsdGlwbGUgc2VydmxldHMuIFlvdSBjYW4gZG8NCi10aGlzIGJ5IG1hcHBpbmcgYSBmaWx0ZXIgdG8gYSBVUkwgcGF0dGVybiBzbyB0aGF0IGFueSByZXF1ZXN0IHRoYXQgbWF0Y2hlcw0KLXRoYXQgVVJMIHBhdHRlcm4gd2lsbCBiZSBmaWx0ZXJlZC4gQWxsIHRoaXMgaXMgbWFkZSBhdXRvbWF0aWNhbGx5IGlmIHlvdSB1c2UNCi10aGUgPGI+RmlsdGVyIE1hcHBpbmdzPC9iPiBmaWVsZC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TWV0aG9kIHN0dWJzPC9kdD4NCi08ZGQ+QmVjYXVzZSBlYWNoIGZpbHRlciBtdXN0IGltcGxlbWVudCB0aGUgamF2YXguc2VydmxldC5GaWx0ZXIgaW50ZXJmYWNlLA0KLXRoZSA8Yj5Jbmhlcml0ZWQgYWJzdHJhY3QgbWV0aG9kczwvYj4gb3B0aW9uIGlzIGFsd2F5cyBjaGVja2VkIGFuZCBjYW5ub3QNCi1iZSBjaGFuZ2VkLjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ZsdHdpei5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Zmx0d2l6Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjhhYTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Zmx0d2l6Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgRmlsdGVycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZmlsdGVycyB3aXphcmQgaGVscHMgeW91IHRvIGNyZWF0ZSBKYXZhIHNlcnZsZXQgZmlsdGVycyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IgdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBmaWx0ZXJzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBmaWx0ZXJzIHdpemFyZCBoZWxwcyB5b3UgdG8gY3JlYXRlIEphdmEgc2VydmxldCBmaWx0ZXJzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlIGNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvciB0aGF0IHlvdSBjYW4gbW9kaWZ5IGZvciB1c2Ugd2l0aCB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpbHRlcnMgY2FuIHJ1biBvbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy4iIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2bGV0cywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2bGV0cywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0d2ZsdHdpeiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIEZpbHRlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Zmx0d2l6Ij48YSBuYW1lPSJ0d2ZsdHdpeiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgRmlsdGVyczwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoZSBmaWx0ZXJzIHdpemFyZCBoZWxwcyB5b3UgdG8gY3JlYXRlIEphdmHihKIgc2VydmxldCBmaWx0ZXJzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2gKLXRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2UKLW9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVycyBjYW4KLXJ1biBvbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UbyBjcmVhdGUgYSBmaWx0ZXIsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLCBleHBhbmQgeW91ciAgPGEgaHJlZj0iY2N3ZWJwcmouaHRtbCIgdGl0bGU9IiI+ZHluYW1pYyBwcm9qZWN0PC9hPiBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gdGhlIDxzdHJvbmc+RmlsdGVyPC9zdHJvbmc+IGljb24sIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWx0ZXI8L3NwYW4+PC9zcGFuPiBmcm9tCi10aGUgcG9wLXVwIG1lbnUuPC9zcGFuPiAgVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBGaWx0ZXI8L3NwYW4+IHdpemFyZAotYXBwZWFycy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0cy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+PHN0cm9uZz5HZW5lcmFsIEluZm9ybWF0aW9uPC9zdHJvbmc+PC9wPgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPk1vZGlmaWVyczwvZHQ+Ci0KLTxkZD5UaGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IHN0YXRlcwotdGhhdCBhIFNlcnZsZXQgY2xhc3MgbXVzdCBiZSA8c3Ryb25nPnB1YmxpYzwvc3Ryb25nPiBhbmQgbm90IDxzdHJvbmc+YWJzdHJhY3Q8L3N0cm9uZz4uIFRoZXJlZm9yZSwKLXlvdSBjYW5ub3QgY2hhbmdlIHRoZXNlIG1vZGlmaWVycy4gVGhlIG9ubHkgb25lIGF2YWlsYWJsZSBmb3IgY2hhbmdlIGlzIHRoZSA8c3Ryb25nPmZpbmFsPC9zdHJvbmc+IG1vZGlmaWVyLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkludGVyZmFjZXM8L2R0PgotCi08ZGQ+VGhlcmUgaXMgb25lIG9ibGlnYXRvcnkgaW50ZXJmYWNlIHRoYXQgZmlsdGVyIGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6IDxzdHJvbmc+amF2YXguc2VydmxldC5GaWx0ZXI8L3N0cm9uZz4uCi1UaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGlzIHVzZWQgdG8gcmVwcmVzZW50Ci10aGUgbGlmZS1jeWNsZSBvZiB0aGUgZmlsdGVyLiBUaGlzIGludGVyZmFjZSBoYXMgdGhyZWUgbWV0aG9kczogaW5pdCwgZG9GaWx0ZXIKLWFuZCBkZXN0cm95LiA8dWw+Ci08bGk+VGhlIDxzdHJvbmc+aW5pdDwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBvbmx5IG9uY2UsIHdoZW4KLWl0IGZpbmlzaGVzIGluc3RhbnRpYXRpbmcgdGhlIGZpbHRlci48L2xpPgotCi08bGk+VGhlPHN0cm9uZz5kb0ZpbHRlcjwvc3Ryb25nPiBtZXRob2QgaXMgd2hlcmUgdGhlIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgYW5kIGlzIGNhbGxlZAotZXZlcnkgdGltZSBhIHVzZXIgcmVxdWVzdHMgYSByZXNvdXJjZSwgc3VjaCBhcyBhIHNlcnZsZXQsIHRvIHdoaWNoIHRoZSBmaWx0ZXIKLWlzIG1hcHBlZC48L2xpPgotCi08bGk+VGhlIDxzdHJvbmc+ZGVzdHJveTwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byB0ZWxsIHRoZQotZmlsdGVyIHRoYXQgaXQgd2lsbCBiZSB0YWtlbiBvdXQgb2Ygc2VydmljZS48L2xpPgotCi08L3VsPgotIEFsdGhvdWdoLCB0aGF0IHRoZSBqYXZheC5zZXJ2bGV0LkZpbHRlciBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgaW4gdGhlIDxzdHJvbmc+SW50ZXJmYWNlczwvc3Ryb25nPiBmaWVsZAotYnkgZGVmYXVsdCwgeW91IGNhbiBhZGQgYWRkaXRpb25hbCBpbnRlcmZhY2VzIHRvIGltcGxlbWVudCBieSB1c2luZyB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkludGVyZmFjZSBzZWxlY3Rpb24gZGlhbG9nPC9kdD4KLQotPGRkPlRoaXMgZGlhbG9nIGFwcGVhcnMgaWYgeW91IHNlbGVjdCB0byBhZGQgYW4gaW50ZXJmYWNlIHRvIHlvdXIgZmlsdGVyLgotQXMgeW91IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHlvdSBhcmUgYWRkaW5nLCBhIGxpc3Qgb2YgYXZhaWxhYmxlCi1pbnRlcmZhY2VzIGxpc3RlZCBpbiB0aGUgPHN0cm9uZz5NYXRjaGluZyBpdGVtczwvc3Ryb25nPiBsaXN0IGJveCB1cGRhdGVzIGR5bmFtaWNhbGx5Ci10byBkaXNwbGF5IG9ubHkgdGhlIGludGVyZmFjZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gQ2hvb3NlIGFuIGludGVyZmFjZQotdG8gc2VlIHRoZSBxdWFsaWZpZXIsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4gd2hlbiBmaW5pc2hlZC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5GaWx0ZXIgTWFwcGluZ3M8L2R0PgotCi08ZGQ+Rm9yIGEgZmlsdGVyIHRvIGludGVyY2VwdCBhIHJlcXVlc3QgdG8gYSBzZXJ2bGV0LCB5b3UgbXVzdDogPG9sPgotPGxpPmRlY2xhcmUgdGhlIGZpbHRlciB3aXRoIGEgPHN0cm9uZz4mbHQ7ZmlsdGVyJmd0Ozwvc3Ryb25nPiBlbGVtZW50IGluIHRoZSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yPC9saT4KLQotPGxpPm1hcCB0aGUgZmlsdGVyIHRvIHRoZSBzZXJ2bGV0IHVzaW5nIHRoZSA8c3Ryb25nPiZsdDtmaWx0ZXItbWFwcGluZyZndDs8L3N0cm9uZz4gCi1lbGVtZW50LjwvbGk+Ci0KLTwvb2w+Ci0gU29tZXRpbWVzIHlvdSB3YW50IGEgZmlsdGVyIHRvIHdvcmsgb24gbXVsdGlwbGUgc2VydmxldHMuIFlvdSBjYW4gZG8KLXRoaXMgYnkgbWFwcGluZyBhIGZpbHRlciB0byBhIFVSTCBwYXR0ZXJuIHNvIHRoYXQgYW55IHJlcXVlc3QgdGhhdCBtYXRjaGVzCi10aGF0IFVSTCBwYXR0ZXJuIHdpbGwgYmUgZmlsdGVyZWQuIEFsbCB0aGlzIGlzIG1hZGUgYXV0b21hdGljYWxseSBpZiB5b3UgdXNlCi10aGUgPHN0cm9uZz5GaWx0ZXIgTWFwcGluZ3M8L3N0cm9uZz4gZmllbGQuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+TWV0aG9kIHN0dWJzPC9kdD4KLQotPGRkPkJlY2F1c2UgZWFjaCBmaWx0ZXIgbXVzdCBpbXBsZW1lbnQgdGhlIGphdmF4LnNlcnZsZXQuRmlsdGVyIGludGVyZmFjZSwKLXRoZSA8c3Ryb25nPkluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzPC9zdHJvbmc+IG9wdGlvbiBpcyBhbHdheXMgY2hlY2tlZCBhbmQgY2Fubm90Ci1iZSBjaGFuZ2VkLjwvZGQ+Ci0KLTwvZGw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dmaWx0Ym4uaHRtbCI+RmlsdGVyczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDljMDYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d2ltcHdhciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XQVIgZmlsZXM8aW5kZXh0ZXJtPmltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkEgV2ViIEFyY2hpdmUgKFdBUikgZmlsZSBpcyBhIHBvcnRhYmxlLCBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24NCi10aGF0IHlvdSBjYW4gaW1wb3J0IGludG8geW91ciB3b3Jrc3BhY2UuIDwvcD48cD4gQmVmb3JlIGltcG9ydGluZyBhIFdBUiBmaWxlLA0KLXlvdSBzaG91bGQgZmlyc3QgZGV0ZXJtaW5lIGlmIHRoZSBXQVIgZmlsZSBjb250YWlucyBuZWVkZWQgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc291cmNlDQotZmlsZXMuIFdoZW4gaW1wb3J0aW5nIGEgV0FSIGZpbGUgaW50byBhbiBleGlzdGluZyBXZWIgcHJvamVjdCwgdGhlIGltcG9ydGVkDQotV2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlcyBhcmUgZWl0aGVyIG5vdCBjaGFuZ2VkIG9yIG92ZXJ3cml0dGVuIGJ5IHRoZQ0KLW9uZXMgaW5jbHVkZWQgaW4gdGhlIGltcG9ydGVkIFdBUiBmaWxlLCBiYXNlZCBvbiB5b3VyIHJlc3BvbnNlIHRvIHRoZSBwcm9tcHQNCi10aGF0IGlzIHByb3ZpZGVkLiAgSW4gZWl0aGVyIGNhc2UsIHRoaXMgYWN0aW9uIGRvZXMgPGk+bm90PC9pPiByZXByZXNlbnQgYQ0KLW1lcmdpbmcgb2YgdGhlIHR3byBzZXRzIG9mIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuICA8L3A+ICA8cD5UbyBpbXBvcnQgdGhlDQotV2ViIHByb2plY3QgcmVzb3VyY2VzIGluIGEgV0FSIGZpbGUgaW50byB5b3VyIHdvcmtzcGFjZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZw0KLXN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDxwaD48bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+PHVpY29udHJvbD5JbXBvcnQ8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvcGg+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPiBJbiB0aGUgSW1wb3J0IGRpYWxvZywgc2VsZWN0IDxwaD48dWljb250cm9sPldBUiBmaWxlPC91aWNvbnRyb2w+PC9waD4gYW5kDQotdGhlbiBjbGljayA8cGg+PHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+PC9waD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkxvY2F0ZSB0aGUgV0FSIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgdXNpbmcgdGhlIDxwaD48dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPjwvcGg+IGJ1dHRvbi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4gVGhlIHdpemFyZCBhc3N1bWVzIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBXZWIgcHJvamVjdCB3aXRoIHRoZQ0KLXNhbWUgbmFtZSBhcyB0aGUgV0FSIGZpbGUuIElmIHlvdSBhY2NlcHQgdGhpcyBjaG9pY2UsIHRoZSBwcm9qZWN0IHdpbGwgYmUNCi1jcmVhdGVkIHdpdGggdGhlIHNhbWUgc2VydmxldCB2ZXJzaW9uIGFzIHNwZWNpZmllZCBieSB0aGUgV0FSIGZpbGUgYW5kIGluDQotdGhlIHNhbWUgbG9jYXRpb24uIElmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZXNlIHNldHRpbmdzLCB5b3UgY2FuIGNsaWNrIDxiPk5ldzwvYj4gYW5kDQotc3BlY2lmeSB5b3VyIG5ldyBzZXR0aW5ncyBpbiB0aGUgRHluYW1pYyBXZWIgUHJvamVjdCB3aXphcmQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHBoPjx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+PC9waD4gdG8gcG9wdWxhdGUgdGhlIFdlYg0KLXByb2plY3QuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+PC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3aW1wd2FyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGZiOGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3aW1wd2FyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIC8+Ci08bWV0YSBjb250ZW50PSJXQVIgZmlsZXMsIGltcG9ydGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldBUiBmaWxlcywgaW1wb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3d2Fyb3ZyLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdpbXB3YXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5JbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3aW1wd2FyIj48YSBuYW1lPSJ0d2ltcHdhciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkEgV2ViIEFyY2hpdmUgKFdBUikgZmlsZSBpcyBhIHBvcnRhYmxlLCBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24KLXRoYXQgeW91IGNhbiBpbXBvcnQgaW50byB5b3VyIHdvcmtzcGFjZS4gPC9wPgotPHA+IEJlZm9yZSBpbXBvcnRpbmcgYSBXQVIgZmlsZSwKLXlvdSBzaG91bGQgZmlyc3QgZGV0ZXJtaW5lIGlmIHRoZSBXQVIgZmlsZSBjb250YWlucyBuZWVkZWQgSmF2YeKEoiBzb3VyY2UKLWZpbGVzLiBXaGVuIGltcG9ydGluZyBhIFdBUiBmaWxlIGludG8gYW4gZXhpc3RpbmcgV2ViIHByb2plY3QsIHRoZSBpbXBvcnRlZAotV2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlcyBhcmUgZWl0aGVyIG5vdCBjaGFuZ2VkIG9yIG92ZXJ3cml0dGVuIGJ5IHRoZQotb25lcyBpbmNsdWRlZCBpbiB0aGUgaW1wb3J0ZWQgV0FSIGZpbGUsIGJhc2VkIG9uIHlvdXIgcmVzcG9uc2UgdG8gdGhlIHByb21wdAotdGhhdCBpcyBwcm92aWRlZC4gIEluIGVpdGhlciBjYXNlLCB0aGlzIGFjdGlvbiBkb2VzIDxlbT5ub3Q8L2VtPiByZXByZXNlbnQgYQotbWVyZ2luZyBvZiB0aGUgdHdvIHNldHMgb2YgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gIDwvcD4KLSAgPHA+VG8gaW1wb3J0IHRoZQotV2ViIHByb2plY3QgcmVzb3VyY2VzIGluIGEgV0FSIGZpbGUgaW50byB5b3VyIHdvcmtzcGFjZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5TZWxlY3QgPHNwYW4+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkltcG9ydDwvc3Bhbj4KLTwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+IEluIHRoZSBJbXBvcnQgZGlhbG9nLCBzZWxlY3QgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V0FSIGZpbGU8L3NwYW4+PC9zcGFuPiBhbmQKLXRoZW4gY2xpY2sgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj48L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkxvY2F0ZSB0aGUgV0FSIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgdXNpbmcgdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj48L3NwYW4+IGJ1dHRvbi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+IFRoZSB3aXphcmQgYXNzdW1lcyB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgV2ViIHByb2plY3Qgd2l0aCB0aGUKLXNhbWUgbmFtZSBhcyB0aGUgV0FSIGZpbGUuIElmIHlvdSBhY2NlcHQgdGhpcyBjaG9pY2UsIHRoZSBwcm9qZWN0IHdpbGwgYmUKLWNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBzZXJ2bGV0IHZlcnNpb24gYXMgc3BlY2lmaWVkIGJ5IHRoZSBXQVIgZmlsZSBhbmQgaW4KLXRoZSBzYW1lIGxvY2F0aW9uLiBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGVzZSBzZXR0aW5ncywgeW91IGNhbiBjbGljayA8c3Ryb25nPk5ldzwvc3Ryb25nPiBhbmQKLXNwZWNpZnkgeW91ciBuZXcgc2V0dGluZ3MgaW4gdGhlIER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPjwvc3Bhbj4gdG8gcG9wdWxhdGUgdGhlIFdlYgotcHJvamVjdC48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d3YXJvdnIuaHRtbCI+V2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3bHN0d2l6LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdsc3R3aXouZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiMWVkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdsc3R3aXouZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdsc3R3aXoiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIExpc3RlbmVyczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGUgbGlzdGVuZXIgd2l6YXJkIGhlbHBzIHlvdSBjcmVhdGUgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVycyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IgdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBsaXN0ZW5lcnMgY2FuIHJ1biBvbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zZXJ2bGV0czxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5UbyBjcmVhdGUgYSBsaXN0ZW5lciwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLCBleHBhbmQgeW91ciAgPHhyZWYgaHJlZj0iY2N3ZWJwcmouZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5keW5hbWljIHByb2plY3Q8L3hyZWY+IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmlnaHQgY2xpY2sgb24gdGhlIDxiPkxpc3RlbmVyPC9iPiBpY29uLCBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+TGlzdGVuZXI8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBmcm9tIHRoZSBwb3AtdXAgbWVudS48L2NtZD48c3RlcHJlc3VsdD4gVGhlIDx1aWNvbnRyb2w+Q3JlYXRlIExpc3RlbmVyPC91aWNvbnRyb2w+IHdpemFyZCBhcHBlYXJzLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gb2xsb3cgdGhlIHByb2plY3Qgd2l6YXJkIHByb21wdHMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PGRsPjxkbGVudHJ5Pg0KLTxkdD5BcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXJzPC9kdD4NCi08ZGQ+VGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+ZGVmaW5lcyB0aGUgCWZvbGxvd2luZyBpbnRlcmZhY2VzIHRoYXQgcmVwcmVzZW50IHRoYXQgYXBwbGljYXRpb24gbGlmZWN5Y2xlIAlsaXN0ZW5lcnMuIFlvdSBzaG91bGQgc2VsZWN0IGF0IGxlYXN0IG9uZSBvZiB0aGUgaW50ZWZhY2VzLiAJPHVsPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0TGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byB0aGUgU2VydmxldENvbnRleHQgbGlmZS1jeWNsZSBldmVudHMuIFRoaXMgaW50ZXJmYWNlIGhhcyB0d28gbWV0aG9kczogY29udGV4dEluaXRpYWxpemVkIGFuZCBjb250ZXh0RGVzdHJveWVkLiBUaGUgPGI+PGk+Y29udGV4dEluaXRpYWxpemVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgcmVhZHkgdG8gc2VydmljZSByZXF1ZXN0cyBhbmQgdGhlIDxiPjxpPmNvbnRleHREZXN0cm95ZWQ8L2k+PC9iPiBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBzZXJ2bGV0IGNvbnRleHQgaXMgYWJvdXQgdG8gYmUgc2h1dCBkb3duLjwvbGk+DQotPGxpPjxiPmphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lcjo8L2I+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQgcGFja2FnZS4gSXQgY2FuIGJlIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiBhbnkgYXR0cmlidXRlIGlzIGFkZGVkIHRvIHRoZSBTZXJ2bGV0Q29udGV4dCBvciBpZiBhbnkgb2YgdGhlIFNlcnZsZXRDb250ZXh0J3MgYXR0cmlidXRlcyBhcmUgY2hhbmdlZCBvciByZW1vdmVkLiBUaGlzIGluZXRmYWNlIGhhcyB0aHJlZSBtZXRob2RzOiA8Yj48aT5hdHRyaWJ1dGVBZGRlZCwgYXR0cmlidXRlUmVtb3ZlZDwvaT48L2I+IGFuZCA8Yj48aT5hdHRyaWJ1dGVSZXBsYWNlZDwvaT48L2I+LjwvbGk+DQotPGxpPjxiPmphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RMaXN0ZW5lcjo8L2I+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQgcGFja2FnZS4gSXQgY2FuIGJlIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiBhIHJlcXVlc3QgaXMgY29taW5nIGluIG9yIG91dCBvZiBzY29wZSBpbiBhIFdlYiBjb21wb25lbnQuIFRoaXMgaW50ZXJmYWNlIGhhcyB0d28gbWV0aG9kczogcmVxdWVzdEluaXRpYWxpemVkIGFuZCByZXF1ZXN0RGVzdHJveWVkLiBUaGUgPGI+PGk+cmVxdWVzdEluaXRpYWxpemVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGl0IGlzIGFib3V0IHRvIGVudGVyIHRoZSBmaXJzdCBzZXJ2bGV0IG9yIGZpbHRlciBpbiBlYWNoIFdlYiBhcHBsaWNhdGlvbi4gVGhlIDxiPjxpPnJlcXVlc3REZXN0cm95ZWQ8L2k+PC9iPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gaXQgZXhpdHMgdGhlIGxhc3Qgc2VydmxldCBvciB0aGUgZmlyc3QgZmlsdGVyIGluIHRoZSBjaGFpbi48L2xpPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4gYW55IHJlcXVlc3QgYXR0cmlidXRlIGlzIGNoYW5nZWQuIFRoaXMgaW50ZXJmYWNlIGhhcyB0aHJlZSBtZXRob2RzOiBhdHRyaWJ1dGVBZGRlZCwgYXR0cmlidXRlUmVtb3ZlZCBhbmQgYXR0cmlidXRlUmVwbGFjZWQuIFRoZSA8Yj48aT5hdHRyaWJ1dHRlQWRkZWQ8L2k+PC9iPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBuZXcgYXR0cmlidXRlIHdhcyBhZGRlZCB0byBzZXJ2bGV0IHJlcXVlc3QuIFRoZSA8Yj48aT5hdHRyaWJ1dGVSZW1vdmVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4gVGhlIDxiPjxpPmF0dHJpYnV0ZVJlcGxhY2VkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSB3YXMgcmVwbGFjZWQgb24gdGhlIHNlcnZsZXQgcmVxdWVzdC48L2xpPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25MaXN0ZW5lcjo8L2I+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQuaHR0cCBwYWNrYWdlIGFuZCBjYW4gYmUgdXNlZCB0byBsaXN0ZW4gdG8gYSBzZXNzaW9ucyBsaWZlIGN5Y2xlIGV2ZW50cy4gVGhpcyBpbnRlcmZhY2UgaGFzIHR3byBtZXRob2RzOiBzZXNzaW9uQ3JlYXRlZCBhbmQgc2Vzc2lvbkRlc3Ryb3llZC4gVGhlIDxiPjxpPnNlc3Npb25DcmVhdGVkPC9pPjwvYj4gIAltZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gSHR0cFNlc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQuIFRoZSA8Yj48aT5zZXNzaW9uRGVzdHJveWVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIEh0dHBTZXNzaW9uIG9iamVjdCBpcyBpbnZhbGlkYXRlZC48L2xpPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZS4gSXQgY2FuIGJlIHVzZWQgdG8gbGlzdGVuIHRvIGEgY29udGFpbmVyIGV2ZW50cyBub3RpZnlpbmcgdGhhdCBzZXNzaW9ucyB3aWxsIGJlIHBhc3NpdmF0ZWQgb3IgYWN0aXZhdGVkLiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IHNlc3Npb25EaWRBY3RpdmF0ZSBhbmQgc2Vzc2lvbldpbGxQYXNpdmF0ZS4gVGhlIDxiPjxpPnNlc3Npb25EaWRBY3RpdmF0ZTwvaT48L2I+IGlzIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIGhhcyBqdXN0IGJlZW4gYWN0aXZhdGVkIGFuZCB0aGUgPGI+PGk+c2Vzc2lvbldpbGxQYXNpdmF0ZTwvaT48L2I+IGlzIGNhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIGlzIGFib3V0IHRvIGJlIHBhc3NpdmF0ZWQuPC9saT4NCi08bGk+PGI+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZSBhbmQgY2FuIGJlIHVzZWQgdG8gbGlzdGVuIHRvIGV2ZW50cyByZWxhdGVkIHRvIHNlc3Npb24gYXR0cmlidXRlcy4gVGhpcyBpbnRlcmZhY2UgaGFzIHRocmVlIG1ldGhvZHM6IGF0dHJpYnV0ZUFkZGVkLCBhdHRyaWJ1dGVSZW1vdmVkIGFuZCBhdHRyaWJ1dGVSZXBsYWNlZC4gVGhlIDxiPjxpPmF0dHJpYnV0ZUFkZGVkPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBpcyBhZGRlZCB0byBhbiBIdHRwU2Vzc2lvbiBvYmplY3QuIFRoZSA8Yj48aT5hdHRyaWJ1dGVSZW1vdmVkPC9pPjwvYj4gYW5kIDxiPjxpPmF0dHJpYnV0ZVJlcGxhY2VkPC9pPjwvYj4gbWV0aG9kcyBhcmUgY2FsbGVkIHdoZW4gYW4gSHR0cFNlc3Npb24gYXR0cmlidXRlIGlzIHJlbW92ZWQgb3IgcmVwbGFjZWQsIHJlc3BlY3RpdmVseS48L2xpPg0KLTxsaT48Yj5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI6PC9iPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZSBhbmQgY2FuIGJlIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiBhbiBvYmplY3QgaXMgYm91bmQgdG8gb3IgdW5ib3VuZCBmcm9tIGEgc2Vzc2lvbi4gVGhpcyBpbnRlcmZhY2UgaGFzIHR3byBtZXRob2RzOiB2YWx1ZUJvdW5kIGFuZCB2YWx1ZVVuYm91bmQuIFRoZSA8Yj48aT52YWx1ZUJvdW5kPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgYmVpbmcgYm91bmQgdG8gYSBzZXNzaW9uIGFuZCBpZGVudGlmaWVzIHRoZSBzZXNzaW9uLiBUaGUgPGI+PGk+dmFsdWVVbmJvdW5kPC9pPjwvYj4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgYmVpbmcgdW5ib3VuZCBmcm9tIGEgc2Vzc2lvbiBhbmQgaWRlbnRpZmllcyB0aGUgc2Vzc2lvbi48L2xpPg0KLTwvdWw+IAk8L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TW9kaWZpZXJzPC9kdD4NCi08ZGQ+VGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IHN0YXRlcyB0aGF0IGEgCUxpc3RlbmVyIGNsYXNzIG11c3QgYmUgPGI+cHVibGljPC9iPiBhbmQgbm90IDxiPmFic3RyYWN0PC9iPi4gVGhlcmVmb3JlLCAJeW91IGNhbm5vdCBjaGFuZ2UgdGhlc2UgbW9kaWZpZXJzLiBUaGUgb25seSBvbmUgYXZhaWxhYmxlIGZvciBjaGFuZ2UgaXMgCXRoZSA8Yj5maW5hbDwvYj4gbW9kaWZpZXIuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkludGVyZmFjZXM8L2R0Pg0KLTxkZD5UaGUgaW50ZXJmYWNlcyB0aGF0IHlvdSBzZWxlY3RlZCBpbiB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgd2l6YXJkIAlhcmUgcHJvdmlkZWQgYXMgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIDxiPkludGVyZmFjZXM8L2I+IGZpZWxkLiBUbyBhZGQgCWFkZGl0aW9uYWwgaW50ZXJmYWNlcywgY2xpY2sgdGhlIDxiPkFkZDwvYj4gYnV0dG9uIG5leHQgdG8gdGhpcyBmaWVsZC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW50ZXJmYWNlIHNlbGVjdGlvbiBkaWFsb2c8L2R0Pg0KLTxkZD5UaGlzIGRpYWxvZyBhcHBlYXJzIGlmIHlvdSBzZWxlY3QgdG8gYWRkIGFuIGludGVyZmFjZSB0byB5b3VyIAlzZXJ2bGV0LiBBcyB5b3UgdHlwZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgeW91IGFyZSBhZGRpbmcsIGEgCWxpc3Qgb2YgYXZhaWxhYmxlIGludGVyZmFjZXMgbGlzdGVkIGluIHRoZSA8Yj5NYXRjaGluZyBpdGVtczwvYj4gbGlzdCBib3ggCXVwZGF0ZXMgZHluYW1pY2FsbHkgdG8gZGlzcGxheSBvbmx5IHRoZSBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGhlIAlwYXR0ZXJuLiBDaG9vc2UgYW4gaW50ZXJmYWNlIHRvIHNlZSB0aGUgcXVhbGlmaWVyLCBhbmQgdGhlbiBjbGljayA8Yj5PSzwvYj4gCXdoZW4gZmluaXNoZWQuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3bHN0d2l6Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdsc3R3aXouaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ2MmNjNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdsc3R3aXouaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIExpc3RlbmVycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgbGlzdGVuZXIgd2l6YXJkIGhlbHBzIHlvdSBjcmVhdGUgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVycyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IgdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBsaXN0ZW5lcnMgY2FuIHJ1biBvbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGxpc3RlbmVyIHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlIG9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgbGlzdGVuZXJzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuIiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3bGlzdGJuLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdsc3R3aXoiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBMaXN0ZW5lcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3bHN0d2l6Ij48YSBuYW1lPSJ0d2xzdHdpeiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgTGlzdGVuZXJzPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhlIGxpc3RlbmVyIHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlIG9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgbGlzdGVuZXJzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VG8gY3JlYXRlIGEgbGlzdGVuZXIsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIEphdmEgRUUgcGVyc3BlY3RpdmUsIGV4cGFuZCB5b3VyICA8YSBocmVmPSJjY3dlYnByai5odG1sIiB0aXRsZT0iIj5keW5hbWljIHByb2plY3Q8L2E+IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gdGhlIDxzdHJvbmc+TGlzdGVuZXI8L3N0cm9uZz4gaWNvbiwgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5MaXN0ZW5lcjwvc3Bhbj48L3NwYW4+IGZyb20gdGhlIHBvcC11cCBtZW51Ljwvc3Bhbj4gIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgTGlzdGVuZXI8L3NwYW4+IHdpemFyZCBhcHBlYXJzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+QXBwbGljYXRpb24gbGlmZWN5Y2xlIGxpc3RlbmVyczwvZHQ+Ci0KLTxkZD5UaGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZh4oSiIFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+ZGVmaW5lcyB0aGUgCWZvbGxvd2luZyBpbnRlcmZhY2VzIHRoYXQgcmVwcmVzZW50IHRoYXQgYXBwbGljYXRpb24gbGlmZWN5Y2xlIAlsaXN0ZW5lcnMuIFlvdSBzaG91bGQgc2VsZWN0IGF0IGxlYXN0IG9uZSBvZiB0aGUgaW50ZWZhY2VzLiAJPHVsPgotPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dExpc3RlbmVyOjwvc3Ryb25nPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byB0aGUgU2VydmxldENvbnRleHQgbGlmZS1jeWNsZSBldmVudHMuIFRoaXMgaW50ZXJmYWNlIGhhcyB0d28gbWV0aG9kczogY29udGV4dEluaXRpYWxpemVkIGFuZCBjb250ZXh0RGVzdHJveWVkLiBUaGUgPHN0cm9uZz48ZW0+Y29udGV4dEluaXRpYWxpemVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgcmVhZHkgdG8gc2VydmljZSByZXF1ZXN0cyBhbmQgdGhlIDxzdHJvbmc+PGVtPmNvbnRleHREZXN0cm95ZWQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBzZXJ2bGV0IGNvbnRleHQgaXMgYWJvdXQgdG8gYmUgc2h1dCBkb3duLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lcjo8L3N0cm9uZz4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldCBwYWNrYWdlLiBJdCBjYW4gYmUgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuIGFueSBhdHRyaWJ1dGUgaXMgYWRkZWQgdG8gdGhlIFNlcnZsZXRDb250ZXh0IG9yIGlmIGFueSBvZiB0aGUgU2VydmxldENvbnRleHQncyBhdHRyaWJ1dGVzIGFyZSBjaGFuZ2VkIG9yIHJlbW92ZWQuIFRoaXMgaW5ldGZhY2UgaGFzIHRocmVlIG1ldGhvZHM6IDxzdHJvbmc+PGVtPmF0dHJpYnV0ZUFkZGVkLCBhdHRyaWJ1dGVSZW1vdmVkPC9lbT48L3N0cm9uZz4gYW5kIDxzdHJvbmc+PGVtPmF0dHJpYnV0ZVJlcGxhY2VkPC9lbT48L3N0cm9uZz4uPC9saT4KLQotPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdExpc3RlbmVyOjwvc3Ryb25nPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4gYSByZXF1ZXN0IGlzIGNvbWluZyBpbiBvciBvdXQgb2Ygc2NvcGUgaW4gYSBXZWIgY29tcG9uZW50LiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IHJlcXVlc3RJbml0aWFsaXplZCBhbmQgcmVxdWVzdERlc3Ryb3llZC4gVGhlIDxzdHJvbmc+PGVtPnJlcXVlc3RJbml0aWFsaXplZDwvZW0+PC9zdHJvbmc+IG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBpdCBpcyBhYm91dCB0byBlbnRlciB0aGUgZmlyc3Qgc2VydmxldCBvciBmaWx0ZXIgaW4gZWFjaCBXZWIgYXBwbGljYXRpb24uIFRoZSA8c3Ryb25nPjxlbT5yZXF1ZXN0RGVzdHJveWVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGl0IGV4aXRzIHRoZSBsYXN0IHNlcnZsZXQgb3IgdGhlIGZpcnN0IGZpbHRlciBpbiB0aGUgY2hhaW4uPC9saT4KLQotPGxpPjxzdHJvbmc+amF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyOjwvc3Ryb25nPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0IHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4gYW55IHJlcXVlc3QgYXR0cmlidXRlIGlzIGNoYW5nZWQuIFRoaXMgaW50ZXJmYWNlIGhhcyB0aHJlZSBtZXRob2RzOiBhdHRyaWJ1dGVBZGRlZCwgYXR0cmlidXRlUmVtb3ZlZCBhbmQgYXR0cmlidXRlUmVwbGFjZWQuIFRoZSA8c3Ryb25nPjxlbT5hdHRyaWJ1dHRlQWRkZWQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBuZXcgYXR0cmlidXRlIHdhcyBhZGRlZCB0byBzZXJ2bGV0IHJlcXVlc3QuIFRoZSA8c3Ryb25nPjxlbT5hdHRyaWJ1dGVSZW1vdmVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4gVGhlIDxzdHJvbmc+PGVtPmF0dHJpYnV0ZVJlcGxhY2VkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSB3YXMgcmVwbGFjZWQgb24gdGhlIHNlcnZsZXQgcmVxdWVzdC48L2xpPgotCi08bGk+PHN0cm9uZz5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25MaXN0ZW5lcjo8L3N0cm9uZz4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldC5odHRwIHBhY2thZ2UgYW5kIGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byBhIHNlc3Npb25zIGxpZmUgY3ljbGUgZXZlbnRzLiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IHNlc3Npb25DcmVhdGVkIGFuZCBzZXNzaW9uRGVzdHJveWVkLiBUaGUgPHN0cm9uZz48ZW0+c2Vzc2lvbkNyZWF0ZWQ8L2VtPjwvc3Ryb25nPiAgCW1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBIdHRwU2Vzc2lvbiBvYmplY3QgaXMgY3JlYXRlZC4gVGhlIDxzdHJvbmc+PGVtPnNlc3Npb25EZXN0cm95ZWQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gSHR0cFNlc3Npb24gb2JqZWN0IGlzIGludmFsaWRhdGVkLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcjo8L3N0cm9uZz4gVGhpcyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgYnkgamF2YXguc2VydmxldC5odHRwIHBhY2thZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGxpc3RlbiB0byBhIGNvbnRhaW5lciBldmVudHMgbm90aWZ5aW5nIHRoYXQgc2Vzc2lvbnMgd2lsbCBiZSBwYXNzaXZhdGVkIG9yIGFjdGl2YXRlZC4gVGhpcyBpbnRlcmZhY2UgaGFzIHR3byBtZXRob2RzOiBzZXNzaW9uRGlkQWN0aXZhdGUgYW5kIHNlc3Npb25XaWxsUGFzaXZhdGUuIFRoZSA8c3Ryb25nPjxlbT5zZXNzaW9uRGlkQWN0aXZhdGU8L2VtPjwvc3Ryb25nPiBpcyBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBoYXMganVzdCBiZWVuIGFjdGl2YXRlZCBhbmQgdGhlIDxzdHJvbmc+PGVtPnNlc3Npb25XaWxsUGFzaXZhdGU8L2VtPjwvc3Ryb25nPiBpcyBjYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBpcyBhYm91dCB0byBiZSBwYXNzaXZhdGVkLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyOjwvc3Ryb25nPiBUaGlzIGludGVyZmFjZSBpcyBwcm92aWRlZCBieSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZSBhbmQgY2FuIGJlIHVzZWQgdG8gbGlzdGVuIHRvIGV2ZW50cyByZWxhdGVkIHRvIHNlc3Npb24gYXR0cmlidXRlcy4gVGhpcyBpbnRlcmZhY2UgaGFzIHRocmVlIG1ldGhvZHM6IGF0dHJpYnV0ZUFkZGVkLCBhdHRyaWJ1dGVSZW1vdmVkIGFuZCBhdHRyaWJ1dGVSZXBsYWNlZC4gVGhlIDxzdHJvbmc+PGVtPmF0dHJpYnV0ZUFkZGVkPC9lbT48L3N0cm9uZz4gbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBpcyBhZGRlZCB0byBhbiBIdHRwU2Vzc2lvbiBvYmplY3QuIFRoZSA8c3Ryb25nPjxlbT5hdHRyaWJ1dGVSZW1vdmVkPC9lbT48L3N0cm9uZz4gYW5kIDxzdHJvbmc+PGVtPmF0dHJpYnV0ZVJlcGxhY2VkPC9lbT48L3N0cm9uZz4gbWV0aG9kcyBhcmUgY2FsbGVkIHdoZW4gYW4gSHR0cFNlc3Npb24gYXR0cmlidXRlIGlzIHJlbW92ZWQgb3IgcmVwbGFjZWQsIHJlc3BlY3RpdmVseS48L2xpPgotCi08bGk+PHN0cm9uZz5qYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI6PC9zdHJvbmc+IFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIGJ5IGphdmF4LnNlcnZsZXQuaHR0cCBwYWNrYWdlIGFuZCBjYW4gYmUgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuIGFuIG9iamVjdCBpcyBib3VuZCB0byBvciB1bmJvdW5kIGZyb20gYSBzZXNzaW9uLiBUaGlzIGludGVyZmFjZSBoYXMgdHdvIG1ldGhvZHM6IHZhbHVlQm91bmQgYW5kIHZhbHVlVW5ib3VuZC4gVGhlIDxzdHJvbmc+PGVtPnZhbHVlQm91bmQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyBiZWluZyBib3VuZCB0byBhIHNlc3Npb24gYW5kIGlkZW50aWZpZXMgdGhlIHNlc3Npb24uIFRoZSA8c3Ryb25nPjxlbT52YWx1ZVVuYm91bmQ8L2VtPjwvc3Ryb25nPiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyBiZWluZyB1bmJvdW5kIGZyb20gYSBzZXNzaW9uIGFuZCBpZGVudGlmaWVzIHRoZSBzZXNzaW9uLjwvbGk+Ci0KLTwvdWw+Ci0gCTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPk1vZGlmaWVyczwvZHQ+Ci0KLTxkZD5UaGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IHN0YXRlcyB0aGF0IGEgCUxpc3RlbmVyIGNsYXNzIG11c3QgYmUgPHN0cm9uZz5wdWJsaWM8L3N0cm9uZz4gYW5kIG5vdCA8c3Ryb25nPmFic3RyYWN0PC9zdHJvbmc+LiBUaGVyZWZvcmUsIAl5b3UgY2Fubm90IGNoYW5nZSB0aGVzZSBtb2RpZmllcnMuIFRoZSBvbmx5IG9uZSBhdmFpbGFibGUgZm9yIGNoYW5nZSBpcyAJdGhlIDxzdHJvbmc+ZmluYWw8L3N0cm9uZz4gbW9kaWZpZXIuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SW50ZXJmYWNlczwvZHQ+Ci0KLTxkZD5UaGUgaW50ZXJmYWNlcyB0aGF0IHlvdSBzZWxlY3RlZCBpbiB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgd2l6YXJkIAlhcmUgcHJvdmlkZWQgYXMgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIDxzdHJvbmc+SW50ZXJmYWNlczwvc3Ryb25nPiBmaWVsZC4gVG8gYWRkIAlhZGRpdGlvbmFsIGludGVyZmFjZXMsIGNsaWNrIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24gbmV4dCB0byB0aGlzIGZpZWxkLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkludGVyZmFjZSBzZWxlY3Rpb24gZGlhbG9nPC9kdD4KLQotPGRkPlRoaXMgZGlhbG9nIGFwcGVhcnMgaWYgeW91IHNlbGVjdCB0byBhZGQgYW4gaW50ZXJmYWNlIHRvIHlvdXIgCXNlcnZsZXQuIEFzIHlvdSB0eXBlIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCB5b3UgYXJlIGFkZGluZywgYSAJbGlzdCBvZiBhdmFpbGFibGUgaW50ZXJmYWNlcyBsaXN0ZWQgaW4gdGhlIDxzdHJvbmc+TWF0Y2hpbmcgaXRlbXM8L3N0cm9uZz4gbGlzdCBib3ggCXVwZGF0ZXMgZHluYW1pY2FsbHkgdG8gZGlzcGxheSBvbmx5IHRoZSBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGhlIAlwYXR0ZXJuLiBDaG9vc2UgYW4gaW50ZXJmYWNlIHRvIHNlZSB0aGUgcXVhbGlmaWVyLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+IAl3aGVuIGZpbmlzaGVkLjwvZGQ+Ci0KLTwvZGw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3dsaXN0Ym4uaHRtbCI+TGlzdGVuZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGNudnJ0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTg5MGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGNudnJ0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3cGNudnJ0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Db252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnN0YXRpYyBXZWIgcHJvamVjdHM8aW5kZXh0ZXJtPmNvbnZlcnRpbmcgdG8gZHluYW1pYzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+V2ViIHByb2plY3RzPGluZGV4dGVybT5jb252ZXJ0aW5nIHN0YXRpYyB0byBkeW5hbWljPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+IElmIHlvdSB3YW50IHRvIGFkZCBkeW5hbWljIGVsZW1lbnRzIHRvIGEgc3RhdGljIHdlYiBwcm9qZWN0LA0KLXN1Y2ggYXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iDQotdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc2VydmxldHMgYW5kIEpTUCBmaWxlcywgeW91IG11c3QgY29udmVydCB0aGUgcHJvamVjdA0KLWZyb20gYSBzdGF0aWMgdG8gYSBkeW5hbWljIG9uZS4gVG8gY29udmVydCBhIHN0YXRpYyBXZWIgcHJvamVjdCB0byBhIGR5bmFtaWMNCi1XZWIgcHJvamVjdCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHByb2plY3QgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgYW5kIHRoZW4gc2VsZWN0IDxwaD48dWljb250cm9sPkNvbnZlcnQNCi10byBhIER5bmFtaWMgV2ViIFByb2plY3Q8L3VpY29udHJvbD48L3BoPiBmcm9tIHRoZSA8Yj5Qcm9qZWN0PC9iPiBtZW51LjwvY21kPg0KLTxpbmZvPlRoaXMgY29udmVyc2lvbiBhc3N1bWVzIHRoZSAgcHJvamVjdCBuYW1lIGFuZCBsb2NhdGlvbiB3aWxsIGJlIHRoZSBzYW1lLg0KLVRoZSBjb252ZXJzaW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgQ1NTIGZpbGUgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBzdGF0aWMNCi1wcm9qZWN0LCBzbyBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgZHluYW1pYyBXZWIgcHJvamVjdC4gPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPiBTcGVjaWZ5IHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHdoZW4gIDx4cmVmDQotaHJlZj0idHdjcmVwcmouZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5DcmVhdGluZyBhIER5bmFtaWMgV2ViIHByb2plY3QuPC94cmVmPjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGNudnJ0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZWZiMjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGNudnJ0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDb252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMiIC8+Ci08bWV0YSBjb250ZW50PSJzdGF0aWMgV2ViIHByb2plY3RzLCBjb252ZXJ0aW5nIHRvIGR5bmFtaWMsIFdlYiBwcm9qZWN0cywgY29udmVydGluZyBzdGF0aWMgdG8gZHluYW1pYyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0YXRpYyBXZWIgcHJvamVjdHMsIGNvbnZlcnRpbmcgdG8gZHluYW1pYywgV2ViIHByb2plY3RzLCBjb252ZXJ0aW5nIHN0YXRpYyB0byBkeW5hbWljIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2Njc3RhdGljLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jY3dlYnByai5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3cGNudnJ0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d3BjbnZydCI+PGEgbmFtZT0idHdwY252cnQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNvbnZlcnRpbmcgc3RhdGljIFdlYiBwcm9qZWN0cyB0byBkeW5hbWljIFdlYiBwcm9qZWN0czwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD4gSWYgeW91IHdhbnQgdG8gYWRkIGR5bmFtaWMgZWxlbWVudHMgdG8gYSBzdGF0aWMgd2ViIHByb2plY3QsCi1zdWNoIGFzIEphdmHihKIgc2VydmxldHMgYW5kIEpTUCBmaWxlcywgeW91IG11c3QgY29udmVydCB0aGUgcHJvamVjdAotZnJvbSBhIHN0YXRpYyB0byBhIGR5bmFtaWMgb25lLiBUbyBjb252ZXJ0IGEgc3RhdGljIFdlYiBwcm9qZWN0IHRvIGEgZHluYW1pYwotV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgcHJvamVjdCBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udmVydAotdG8gYSBEeW5hbWljIFdlYiBQcm9qZWN0PC9zcGFuPjwvc3Bhbj4gZnJvbSB0aGUgPHN0cm9uZz5Qcm9qZWN0PC9zdHJvbmc+IG1lbnUuPC9zcGFuPgotIFRoaXMgY29udmVyc2lvbiBhc3N1bWVzIHRoZSAgcHJvamVjdCBuYW1lIGFuZCBsb2NhdGlvbiB3aWxsIGJlIHRoZSBzYW1lLgotVGhlIGNvbnZlcnNpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBDU1MgZmlsZSBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIHN0YXRpYwotcHJvamVjdCwgc28gaXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGR5bmFtaWMgV2ViIHByb2plY3QuIAotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gU3BlY2lmeSB0aGUgcHJvamVjdCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGF2YWlsYWJsZSB3aGVuICA8YSBocmVmPSJ0d2NyZXByai5odG1sIiB0aXRsZT0iIj5DcmVhdGluZyBhIER5bmFtaWMgV2ViIHByb2plY3QuPC9hPjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2Njc3RhdGljLmh0bWwiPlN0YXRpYyBXZWIgcHJvamVjdHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jY3dlYnByai5odG1sIj5EeW5hbWljIFdlYiBwcm9qZWN0cyBhbmQgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExYmQzMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwbGliLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3cGxpYiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InR3cGxpYnwxfFdlYmxpYnJhcnlwcm9qZWN0c3ZpcnR1YWxKQVJmaWxlc2FuZHByb2plY3RzIg0KLXN0YXR1cz0iY2hhbmdlZCI+V2ViIHByb2plY3RzPGluZGV4dGVybT52aXJ0dWFsIEpBUiBmaWxlcyBhbmQgcHJvamVjdHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idHdwbGlifDJ8dmlydHVhbEpBUmZpbGVzYXNzb2NpYXRpb25zV2VibGlicmFyeXByb2plY3RzIg0KLXN0YXR1cz0ibmV3Ij52aXJ0dWFsIEpBUiBmaWxlcyBhc3NvY2lhdGlvbnM8aW5kZXh0ZXJtPldlYiBsaWJyYXJ5IHByb2plY3RzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+V2ViIGxpYnJhcnkgcHJvamVjdHMgYWxsb3cgeW91IHRvIGFzc29jaWF0ZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBwcm9qZWN0cw0KLXdpdGggInZpcnR1YWwiIEpBUiBmaWxlcyBpbiBhIFdlYiBwcm9qZWN0J3MgV0VCLUlORi9saWIgZGlyZWN0b3J5LiBZb3UgY2FuDQotcmVmZXJlbmNlIEpBUiBmaWxlcyB0aGF0IGV4aXN0IGVsc2V3aGVyZSBpbiB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0DQotdGhhdCBjb250YWlucyB5b3VyIFdlYiBwcm9qZWN0LCBpZiB0aGV5IGFyZSBpbiB0aGUgV2ViIHByb2plY3QncyBidWlsZCBwYXRoLA0KLWFuZCBhdm9pZCB0aGUgbmVlZCB0byBleHBsaWNpdGx5IGNvcHkgdGhlc2UgSkFSIGZpbGVzIGludG8gdGhlIHByb2plY3QncyBsaWINCi1mb2xkZXIgYmVmb3JlIHlvdSBwdWJsaXNoIHRoZSBXZWIgYXBwbGljYXRpb24gdG8gYSBzZXJ2ZXIuPC9wPjxwPlRvIHNldCB1cA0KLXRoZXNlIGFzc29jaWF0aW9uczo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodCBjbGljayBvbiBhIFdlYiBwcm9qZWN0IGFuZCBzZWxlY3QgPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+IGZyb20NCi10aGUgcG9wLXVwIG1lbnUuPC9jbWQ+PGluZm8+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIG9uIDx1aWNvbnRyb2w+SmF2YSBFRSBNb2R1bGUgRGVwZW5kZW5jaWVzPC91aWNvbnRyb2w+PC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2V0IHVwIHlvdXIgYXNzb2NpYXRpb25zIGluIHRoZSBKYXZhIEVFIE1vZHVsZSBEZXBlbmRlbmNpZXMgd2luZG93PC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHBoPjx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD48L3BoPiB3aGVuIHlvdSBhcmUgZG9uZS48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwbGliLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwbGliLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OTg3YzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGxpYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCB2aXJ0dWFsIEpBUiBmaWxlcyBhbmQgcHJvamVjdHMsIHZpcnR1YWwgSkFSIGZpbGVzIGFzc29jaWF0aW9ucywgV2ViIGxpYnJhcnkgcHJvamVjdHMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIHZpcnR1YWwgSkFSIGZpbGVzIGFuZCBwcm9qZWN0cywgdmlydHVhbCBKQVIgZmlsZXMgYXNzb2NpYXRpb25zLCBXZWIgbGlicmFyeSBwcm9qZWN0cyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdwbGliIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d3BsaWIiPjxhIG5hbWU9InR3cGxpYiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPldlYiBsaWJyYXJ5IHByb2plY3RzIGFsbG93IHlvdSB0byBhc3NvY2lhdGUgSmF2YeKEoiBwcm9qZWN0cwotd2l0aCAidmlydHVhbCIgSkFSIGZpbGVzIGluIGEgV2ViIHByb2plY3QncyBXRUItSU5GL2xpYiBkaXJlY3RvcnkuIFlvdSBjYW4KLXJlZmVyZW5jZSBKQVIgZmlsZXMgdGhhdCBleGlzdCBlbHNld2hlcmUgaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdAotdGhhdCBjb250YWlucyB5b3VyIFdlYiBwcm9qZWN0LCBpZiB0aGV5IGFyZSBpbiB0aGUgV2ViIHByb2plY3QncyBidWlsZCBwYXRoLAotYW5kIGF2b2lkIHRoZSBuZWVkIHRvIGV4cGxpY2l0bHkgY29weSB0aGVzZSBKQVIgZmlsZXMgaW50byB0aGUgcHJvamVjdCdzIGxpYgotZm9sZGVyIGJlZm9yZSB5b3UgcHVibGlzaCB0aGUgV2ViIGFwcGxpY2F0aW9uIHRvIGEgc2VydmVyLjwvcD4KLTxwPlRvIHNldCB1cAotdGhlc2UgYXNzb2NpYXRpb25zOjwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayBvbiBhIFdlYiBwcm9qZWN0IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4gZnJvbQotdGhlIHBvcC11cCBtZW51Ljwvc3Bhbj4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayBvbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KYXZhIEVFIE1vZHVsZSBEZXBlbmRlbmNpZXM8L3NwYW4+PC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZXQgdXAgeW91ciBhc3NvY2lhdGlvbnMgaW4gdGhlIEphdmEgRUUgTW9kdWxlIERlcGVuZGVuY2llcyB3aW5kb3c8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPjwvc3Bhbj4gd2hlbiB5b3UgYXJlIGRvbmUuPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3ByanNldC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjgyNjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d3ByanNldCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPnByb3BlcnRpZXMgc2V0dGluZ3M8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5UaGVyZSBhcmUgbWFueSBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIHRoYXQgeW91IGNhbiBzZXQgdGhhdCBhZmZlY3QNCi10aGUgcGhhc2VzIGluIHRoZSBsaWZlY3ljbGUgb2YgeW91ciBwcm9qZWN0IGFuZCBpdHMgZGVwZW5kZW5jaWVzIG9uIG90aGVyDQotV2ViIHJlc291cmNlcyBhbmQgV2ViIGRldmVsb3BtZW50IHByb2Nlc3Nlcy4gWW91IG1pZ2h0IHdhbnQgdG8gdmVyaWZ5IG9yIHVwZGF0ZQ0KLXRoZXNlIHByb3BlcnRpZXMgYWZ0ZXIgeW91IGhhdmUgdXBkYXRlZCBhbiBleGlzdGluZyBwcm9qZWN0IG9yIGhhdmUgaW1wb3J0ZWQNCi1XZWIgcmVzb3VyY2VzIGludG8gYSBwcm9qZWN0IC48L3A+PHA+VG8gdmlldyBvciBzZXQgV2ViIHByb2plY3QgcHJvcGVydGllcywNCi1kbyB0aGUgZm9sbG93aW5nOiA8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodC1jbGljayBvbiBhIFdlYiBQcm9qZWN0LCBhbmQgZnJvbSB0aGUgcG9wLXVwIG1lbnUgc2VsZWN0IDxwaD48dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD48L3BoPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYSBwcm9wZXJ0eSB0eXBlIGluIHRoZSBsZWZ0IHBhbmUgb2YgdGhlIFByb3BlcnRpZXMgZGlhbG9nDQotdG8gdmlldyBvciB1cGRhdGUgcHJvcGVydGllcyBpbiB0aGUgV2ViIHByb2plY3QuIEZvciBlYWNoIHByb3BlcnR5LCB5b3UgY2FuDQotYXBwbHkgY2hhbmdlcyBhbmQgbW9kaWZ5IGRlZmF1bHQgc2V0dGluZ3MuIEJhc2VkIG9uIHdoZXRoZXIgeW91IGhhdmUgYSBzdGF0aWMNCi1vciBhIGR5bmFtaWMgV2ViIHByb2plY3QsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgdHlwZXMgYXJlIGF2YWlsYWJsZTo8L2NtZD4NCi08aW5mbz48ZGw+PGRsZW50cnk+DQotPGR0PkluZm88L2R0Pg0KLTxkZD5Qcm92aWRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHByb2plY3QgdHlwZSwgbG9jYXRpb24sIGFuZCBtb2RpZmljYXRpb24NCi1zdGF0dXMuIDwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5CZWFuSW5mbyBQYXRoIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4NCi08ZGQ+SWYgeW91IHNlbGVjdCB0aGUgRW5hYmxlIEJlYW5pbmZvIEludHJvc3BlY3Rpb24gb24gdGhpcyBwcm9qZWN0LCB5b3UgY2FuDQotc3BlY2lmeSB0aGUgY29udGVudHMgYW5kIG9yZGVyIG9mIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEJlYW4gc2VhcmNoIHBhdGhzIHRvIHByb3ZpZGUgQmVhbiBpbmZvcm1hdGlvbg0KLXJlbGV2YW50IHRvIHRoZSBwcm9qZWN0LiBZb3UgY2FuIGFkZCwgcmVtb3ZlLCBhbmQgcmVvcmRlciAodXNpbmcgdGhlIDxwaD5VcDwvcGg+IGFuZCA8cGg+RG93bjwvcGg+IGJ1dHRvbnMpDQotdGhlIHBhY2thZ2VzIHVzZWQgdG8gaW5jbHVkZSBCZWFuIGluZm9ybWF0aW9uLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5CdWlsZGVyczwvZHQ+DQotPGRkPkFkZCwgcmVtb3ZlLCBvciByZW9yZGVyIGV4dGVybmFsIHRvb2xzIGluIHRoZSBidWlsZCBvcmRlci4gV2hlbiB5b3Ugc2VsZWN0IDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+IHRvDQotY3JlYXRlIGEgbmV3IGV4dGVybmFsIHRvb2wgdG8gdGhlIGxpc3QsIHRoZSBOZXcgRXh0ZXJuYWwgVG9vbCB3aXphcmQgb3BlbnMsDQotc28gdGhhdCB5b3UgY2FuIGRlZmluZSB0aGUgbmV3IGJ1aWxkIHRvb2wuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkphdmEgRUUgKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0Pg0KLTxkZD5JZGVudGlmeSBXZWIgbGV2ZWwgc3BlY2lmaWNhdGlvbiBhbmQgbW9kaWZ5IGNvbnRleHQgcm9vdCBhbmQgV2ViIGNvbnRlbnQNCi1mb2xkZXIgbmFtZTwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gQnVpbGQNCi1QYXRoIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4NCi08ZGQ+VmlldyBvciBjaGFuZ2UgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBwYXRoIHRoYXQgeW91IHN1cHBsaWVkIHdoZW4gY3JlYXRpbmcNCi10aGUgcHJvamVjdCB1c2luZyB0aGUgPHBoPkNyZWF0ZSBhIER5bmFtaWNXZWIgUHJvamVjdDwvcGg+IHdpemFyZC4gV2hlbmV2ZXINCi10aGUgV2ViIHByb2plY3QgaXMgcmVidWlsdCwgYW55IGNsYXNzIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgb3IgdXBkYXRlZCB3aWxsDQotYmUgb3V0cHV0IHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGZvbGRlci4gPG5vdGU+QSBsaWJyYXJ5IGVudHJ5IG9uIHRoZSA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZA0KLXBhdGggd2lsbCByZW1haW4gdGhlcmUgdW5sZXNzIHRoZSBhY3R1YWwgSkFSIGZpbGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBXRUItSU5GL2xpYg0KLWZvbGRlci4gSWYgeW91IHJlbW92ZSBhIGxpYnJhcnkgcGF0aCBlbnRyeSBidXQgbm90IHRoZSBKQVIgZmlsZSwgdGhlIGxpYnJhcnkNCi1lbnRyeSB3aWxsIGJlIHJlLWFkZGVkIHRvIHRoZSBwYXRoIGF1dG9tYXRpY2FsbHkuPC9ub3RlPjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gQ29tcGlsZXINCi0oRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+DQotPGRkPkRlZmluZSB3aGV0aGVyIHRvIHVzZSB3b3Jrc3BhY2Ugc2V0dGluZ3Mgb3IgcHJvamVjdCBzZXR0aW5nIGZvciBjb21waWxpbmcgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29kZSwNCi1pbmNsdWRpbmcgc2V0dGluZ3MgZm9yIFByb2JsZW1zLCBTdHlsZSwgQ29tcGxpYW5jZSBhbmQgQ2xhc3NmaWxlcywgYW5kIEJ1aWxkDQotUGF0aC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SmF2YWRvYyBMb2NhdGlvbiAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+DQotPGRkPkRlZmluZSBhIGRlZmF1bHQgbG9jYXRpb24gKFVSTCkgZm9yIGFueSBKYXZhZG9jIGF2YWlsYWJsZSB0byB0aGUgcHJvamVjdC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+PHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IEpBUg0KLURlcGVuZGVuY2llcyAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+DQotPGRkPkRlZmluZSBhbmQgcmVvcmRlciBKQVIgZGVwZW5kZW5jaWVzIGZvciB0aGUgcHJvamVjdC4gTm90ZSB0aGF0IHRoZXNlIGRlcGVuZGVuY2llcw0KLW1heSBkaWZmZXIgYmFzZWQgb24gYSBXZWIgcHJvamVjdCdzIGFzc29jaWF0aW9uIHdpdGggbXVsdGlwbGUgRW50ZXJwcmlzZSBhcHBsaWNhdGlvbg0KLXByb2plY3RzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5KU1AgVGFzayBUYWdzPC9kdD4NCi08ZGQ+QWRkLCBlZGl0LCBvciByZW1vdmUgSlNQIHRhc2sgdGFncyBhbmQgYXNzaWduIHRhZyBwcmlvcml0aWVzLiBUaGVzZSAidG8NCi1kbyIgaXRlbXMgYXBwZWFyIGluIHlvdXIgVGFza3Mgdmlldy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SlNQIENvbXBpbGF0aW9uPC9kdD4NCi08ZGQ+U3BlY2lmeSB3aGVuIGluIHRoZSBidWlsZCBwcm9jZXNzIGEgSlNQIHNob3VsZCBiZSBzZXQgdG8gY29tcGlsZTwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5KU1AgRnJhZ21lbnQgKGR5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0Pg0KLTxkZD5EZWZpbmUgZGVmYXVsdCBlbmNvZGluZywgcGFnZSBkaXJlY3RpdmUsIGFuZCBjb250ZW50IHR5cGUgdmFsdWVzIGZvciBKU1ANCi1mcmFnbWVudCBkb2N1bWVudHMgaW4gdGhlIHdlYiBwcm9qZWN0LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5MaW5rcyBWYWxpZGF0aW9uL1JlZmFjdG9yaW5nPC9kdD4NCi08ZGQ+RGVmaW5lIHByb2plY3QtbGV2ZWwgbGluayBtYW5hZ2VtZW50IGFuZCB2YWxpZGF0aW9uIHNldHRpbmdzLiBUaGVzZSBzZXR0aW5ncw0KLW92ZXJyaWRlIGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaW4gdGhlIFdvcmtiZW5jaCBQcmVmZXJlbmNlIHNldHRpbmdzIGZvciB0aGUNCi1jdXJyZW50IHByb2plY3QuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlByb2plY3QgUmVmZXJlbmNlczwvZHQ+DQotPGRkPlJlZmVyZW5jZSBvdGhlciBXZWIgcHJvamVjdHMgdGhhdCBleGlzdCBvbiB5b3VyIHdvcmtiZW5jaCB3b3Jrc3BhY2UuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlNlcnZlcjwvZHQ+DQotPGRkPlNlbGVjdCB0aGUgc2VydmVyIGluc3RhbmNlIHVzZWQgdG8gcGVyZm9ybSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQsIHRlc3QsDQotYW5kIHB1Ymxpc2hpbmcgZnVuY3Rpb25zIGZvciB0aGUgcHJvamVjdC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+VmFsaWRhdGlvbjwvZHQ+DQotPGRkPlNwZWNpZnkgd2hpY2ggdmFsaWRhdG9ycyBzaG91bGQgcnVuIGZvciB0aGUgcHJvamVjdCwgYW5kIHdoZXRoZXIgdmFsaWRhdGlvbg0KLXNob3VsZCBvY2N1ciBhdXRvbWF0aWNhbGx5IHdoZW4gcmVzb3VyY2UgdXBkYXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgcHJvamVjdC4NCi1UaGUgYXZhaWxhYmxlIHZhbGlkYXRvcnMgYXJlIGJhc2VkIG9uIHRoZSB0eXBlcyBvZiByZXNvdXJjZXMgaW4geW91ciBwcm9qZWN0Lg0KLUJ5IGRlZmF1bHQsIHZhbGlkYXRvcnMgYXJlIGF1dG9tYXRpY2FsbHkgcnVuIHdoZW4geW91IHNhdmUgcmVzb3VyY2VzIGluIGENCi1XZWIgcHJvamVjdC4gSWYgeW91IGRvIG5vdCB3YW50IHZhbGlkYXRvcnMgdG8gcnVuIGF1dG9tYXRpY2FsbHkgd2hlbiB5b3Ugc2F2ZQ0KLXRoZXNlIHJlc291cmNlcywgZW5hYmxlIHRoZSA8dWljb250cm9sPk92ZXJyaWRlIHZhbGlkYXRpb248L3VpY29udHJvbD4gcHJlZmVyZW5jZXMNCi1vcHRpb24gYW5kIGRpc2FibGUgdGhlIDx1aWNvbnRyb2w+UnVuIHZhbGlkYXRpb24gYXV0b21hdGljYWxseSB3aGVuIHlvdSBzYXZlDQotY2hhbmdlcyB0byByZXNvdXJjZXM8L3VpY29udHJvbD4gb3B0aW9uLiA8bm90ZT5Zb3UgY2FuIGFsc28gIGRpc2FibGUgYXV0b21hdGljDQotdmFsaWRhdGlvbiAoYW5kIGJ1aWxkcykgZm9yIGFsbCBwcm9qZWN0cyBieSBkaXNhYmxpbmcgPHVpY29udHJvbD5QZXJmb3JtIGJ1aWxkDQotIGF1dG9tYXRpY2FsbHkgb24gcmVzb3VyY2UgbW9kaWZpY2F0aW9uPC91aWNvbnRyb2w+IGZyb20gdGhlIDx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+IHByb3BlcnRpZXMuDQotSWYgIHlvdSBkaXNhYmxlIGF1dG9tYXRpYyBidWlsZHMsIHlvdSBjYW4gbWFudWFsbHkgIHJ1biBhIGJ1aWxkIChhbmQgdmFsaWRhdGlvbikNCi1ieSBzZWxlY3RpbmcgIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlByb2plY3Q8L3VpY29udHJvbD48dWljb250cm9sPlJlYnVpbGQNCi1wcm9qZWN0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9ub3RlPjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5XZWIgQ29udGVudCBTZXR0aW5nczwvZHQ+DQotPGRkPlByb3ZpZGUgYW55IGFwcGxpY2FibGUgV2ViIGNvbnRlbnQgc2V0dGluZ3MgZm9yIGEgV2ViIHByb2plY3QuIFlvdSBjYW4NCi1zcGVjaWZ5IHRoZSBkb2N1bWVudCB0eXBlLCBDU1MgcHJvZmlsZSwgYW5kIHRhcmdldCBkZXZpY2UuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PldlYiBQcm9qZWN0IEZlYXR1cmVzPC9kdD4NCi08ZGQ+U2VsZWN0IHRoZSBmZWF0dXJlcyB5b3Ugd2FudCB0byBiZSBlbmFibGVkIGZvciB5b3VyIFdlYiBwcm9qZWN0LCBzdWNoDQotYXMgUGFnZSBUZW1wbGF0ZSBzdXBwb3J0LjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPldoZW4geW91IGhhdmUgY29tcGxldGVkIHVwZGF0ZXMgdG8gV2ViIHByb2plY3Qgc2V0dGluZ3MsIGNsaWNrIDxwaD48dWljb250cm9sPk9LPC91aWNvbnRyb2w+PC9waD4gdG8NCi1zYXZlIGFuZCBjbG9zZSB0aGUgUHJvcGVydGllcyBkaWFsb2cuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwcmpzZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkMWU0MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwcmpzZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIFdlYiBwcm9qZWN0IHByb3BlcnRpZXMiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIHByb3BlcnRpZXMgc2V0dGluZ3MiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIHByb3BlcnRpZXMgc2V0dGluZ3MiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3cHJqc2V0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d3ByanNldCI+PGEgbmFtZT0idHdwcmpzZXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UaGVyZSBhcmUgbWFueSBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIHRoYXQgeW91IGNhbiBzZXQgdGhhdCBhZmZlY3QKLXRoZSBwaGFzZXMgaW4gdGhlIGxpZmVjeWNsZSBvZiB5b3VyIHByb2plY3QgYW5kIGl0cyBkZXBlbmRlbmNpZXMgb24gb3RoZXIKLVdlYiByZXNvdXJjZXMgYW5kIFdlYiBkZXZlbG9wbWVudCBwcm9jZXNzZXMuIFlvdSBtaWdodCB3YW50IHRvIHZlcmlmeSBvciB1cGRhdGUKLXRoZXNlIHByb3BlcnRpZXMgYWZ0ZXIgeW91IGhhdmUgdXBkYXRlZCBhbiBleGlzdGluZyBwcm9qZWN0IG9yIGhhdmUgaW1wb3J0ZWQKLVdlYiByZXNvdXJjZXMgaW50byBhIHByb2plY3QgLjwvcD4KLTxwPlRvIHZpZXcgb3Igc2V0IFdlYiBwcm9qZWN0IHByb3BlcnRpZXMsCi1kbyB0aGUgZm9sbG93aW5nOiA8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQtY2xpY2sgb24gYSBXZWIgUHJvamVjdCwgYW5kIGZyb20gdGhlIHBvcC11cCBtZW51IHNlbGVjdCA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSBwcm9wZXJ0eSB0eXBlIGluIHRoZSBsZWZ0IHBhbmUgb2YgdGhlIFByb3BlcnRpZXMgZGlhbG9nCi10byB2aWV3IG9yIHVwZGF0ZSBwcm9wZXJ0aWVzIGluIHRoZSBXZWIgcHJvamVjdC4gRm9yIGVhY2ggcHJvcGVydHksIHlvdSBjYW4KLWFwcGx5IGNoYW5nZXMgYW5kIG1vZGlmeSBkZWZhdWx0IHNldHRpbmdzLiBCYXNlZCBvbiB3aGV0aGVyIHlvdSBoYXZlIGEgc3RhdGljCi1vciBhIGR5bmFtaWMgV2ViIHByb2plY3QsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkgdHlwZXMgYXJlIGF2YWlsYWJsZTo8L3NwYW4+Ci0gPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPkluZm88L2R0PgotCi08ZGQ+UHJvdmlkZXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBwcm9qZWN0IHR5cGUsIGxvY2F0aW9uLCBhbmQgbW9kaWZpY2F0aW9uCi1zdGF0dXMuIDwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkJlYW5JbmZvIFBhdGggKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+SWYgeW91IHNlbGVjdCB0aGUgRW5hYmxlIEJlYW5pbmZvIEludHJvc3BlY3Rpb24gb24gdGhpcyBwcm9qZWN0LCB5b3UgY2FuCi1zcGVjaWZ5IHRoZSBjb250ZW50cyBhbmQgb3JkZXIgb2YgSmF2YeKEoiBCZWFuIHNlYXJjaCBwYXRocyB0byBwcm92aWRlIEJlYW4gaW5mb3JtYXRpb24KLXJlbGV2YW50IHRvIHRoZSBwcm9qZWN0LiBZb3UgY2FuIGFkZCwgcmVtb3ZlLCBhbmQgcmVvcmRlciAodXNpbmcgdGhlIDxzcGFuPlVwPC9zcGFuPiBhbmQgPHNwYW4+RG93bjwvc3Bhbj4gYnV0dG9ucykKLXRoZSBwYWNrYWdlcyB1c2VkIHRvIGluY2x1ZGUgQmVhbiBpbmZvcm1hdGlvbi48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5CdWlsZGVyczwvZHQ+Ci0KLTxkZD5BZGQsIHJlbW92ZSwgb3IgcmVvcmRlciBleHRlcm5hbCB0b29scyBpbiB0aGUgYnVpbGQgb3JkZXIuIFdoZW4geW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+IHRvCi1jcmVhdGUgYSBuZXcgZXh0ZXJuYWwgdG9vbCB0byB0aGUgbGlzdCwgdGhlIE5ldyBFeHRlcm5hbCBUb29sIHdpemFyZCBvcGVucywKLXNvIHRoYXQgeW91IGNhbiBkZWZpbmUgdGhlIG5ldyBidWlsZCB0b29sLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkphdmEgRUUgKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+SWRlbnRpZnkgV2ViIGxldmVsIHNwZWNpZmljYXRpb24gYW5kIG1vZGlmeSBjb250ZXh0IHJvb3QgYW5kIFdlYiBjb250ZW50Ci1mb2xkZXIgbmFtZTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkphdmEgQnVpbGQKLVBhdGggKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+VmlldyBvciBjaGFuZ2UgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBKYXZhIGJ1aWxkIHBhdGggdGhhdCB5b3Ugc3VwcGxpZWQgd2hlbiBjcmVhdGluZwotdGhlIHByb2plY3QgdXNpbmcgdGhlIDxzcGFuPkNyZWF0ZSBhIER5bmFtaWNXZWIgUHJvamVjdDwvc3Bhbj4gd2l6YXJkLiBXaGVuZXZlcgotdGhlIFdlYiBwcm9qZWN0IGlzIHJlYnVpbHQsIGFueSBjbGFzcyBmaWxlcyB0aGF0IGFyZSBjcmVhdGVkIG9yIHVwZGF0ZWQgd2lsbAotYmUgb3V0cHV0IHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGZvbGRlci4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEEgbGlicmFyeSBlbnRyeSBvbiB0aGUgSmF2YSBidWlsZAotcGF0aCB3aWxsIHJlbWFpbiB0aGVyZSB1bmxlc3MgdGhlIGFjdHVhbCBKQVIgZmlsZSBpcyBkZWxldGVkIGZyb20gdGhlIFdFQi1JTkYvbGliCi1mb2xkZXIuIElmIHlvdSByZW1vdmUgYSBsaWJyYXJ5IHBhdGggZW50cnkgYnV0IG5vdCB0aGUgSkFSIGZpbGUsIHRoZSBsaWJyYXJ5Ci1lbnRyeSB3aWxsIGJlIHJlLWFkZGVkIHRvIHRoZSBwYXRoIGF1dG9tYXRpY2FsbHkuPC9kaXY+Ci08L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KYXZhIENvbXBpbGVyCi0oRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci0KLTxkZD5EZWZpbmUgd2hldGhlciB0byB1c2Ugd29ya3NwYWNlIHNldHRpbmdzIG9yIHByb2plY3Qgc2V0dGluZyBmb3IgY29tcGlsaW5nIEphdmEgY29kZSwKLWluY2x1ZGluZyBzZXR0aW5ncyBmb3IgUHJvYmxlbXMsIFN0eWxlLCBDb21wbGlhbmNlIGFuZCBDbGFzc2ZpbGVzLCBhbmQgQnVpbGQKLVBhdGguPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SmF2YWRvYyBMb2NhdGlvbiAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci0KLTxkZD5EZWZpbmUgYSBkZWZhdWx0IGxvY2F0aW9uIChVUkwpIGZvciBhbnkgSmF2YWRvYyBhdmFpbGFibGUgdG8gdGhlIHByb2plY3QuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SmF2YSBKQVIKLURlcGVuZGVuY2llcyAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci0KLTxkZD5EZWZpbmUgYW5kIHJlb3JkZXIgSkFSIGRlcGVuZGVuY2llcyBmb3IgdGhlIHByb2plY3QuIE5vdGUgdGhhdCB0aGVzZSBkZXBlbmRlbmNpZXMKLW1heSBkaWZmZXIgYmFzZWQgb24gYSBXZWIgcHJvamVjdCdzIGFzc29jaWF0aW9uIHdpdGggbXVsdGlwbGUgRW50ZXJwcmlzZSBhcHBsaWNhdGlvbgotcHJvamVjdHMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SlNQIFRhc2sgVGFnczwvZHQ+Ci0KLTxkZD5BZGQsIGVkaXQsIG9yIHJlbW92ZSBKU1AgdGFzayB0YWdzIGFuZCBhc3NpZ24gdGFnIHByaW9yaXRpZXMuIFRoZXNlICJ0bwotZG8iIGl0ZW1zIGFwcGVhciBpbiB5b3VyIFRhc2tzIHZpZXcuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SlNQIENvbXBpbGF0aW9uPC9kdD4KLQotPGRkPlNwZWNpZnkgd2hlbiBpbiB0aGUgYnVpbGQgcHJvY2VzcyBhIEpTUCBzaG91bGQgYmUgc2V0IHRvIGNvbXBpbGU8L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KU1AgRnJhZ21lbnQgKGR5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0PgotCi08ZGQ+RGVmaW5lIGRlZmF1bHQgZW5jb2RpbmcsIHBhZ2UgZGlyZWN0aXZlLCBhbmQgY29udGVudCB0eXBlIHZhbHVlcyBmb3IgSlNQCi1mcmFnbWVudCBkb2N1bWVudHMgaW4gdGhlIHdlYiBwcm9qZWN0LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkxpbmtzIFZhbGlkYXRpb24vUmVmYWN0b3Jpbmc8L2R0PgotCi08ZGQ+RGVmaW5lIHByb2plY3QtbGV2ZWwgbGluayBtYW5hZ2VtZW50IGFuZCB2YWxpZGF0aW9uIHNldHRpbmdzLiBUaGVzZSBzZXR0aW5ncwotb3ZlcnJpZGUgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpbiB0aGUgV29ya2JlbmNoIFByZWZlcmVuY2Ugc2V0dGluZ3MgZm9yIHRoZQotY3VycmVudCBwcm9qZWN0LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlByb2plY3QgUmVmZXJlbmNlczwvZHQ+Ci0KLTxkZD5SZWZlcmVuY2Ugb3RoZXIgV2ViIHByb2plY3RzIHRoYXQgZXhpc3Qgb24geW91ciB3b3JrYmVuY2ggd29ya3NwYWNlLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlNlcnZlcjwvZHQ+Ci0KLTxkZD5TZWxlY3QgdGhlIHNlcnZlciBpbnN0YW5jZSB1c2VkIHRvIHBlcmZvcm0gbmVjZXNzYXJ5IGRldmVsb3BtZW50LCB0ZXN0LAotYW5kIHB1Ymxpc2hpbmcgZnVuY3Rpb25zIGZvciB0aGUgcHJvamVjdC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5WYWxpZGF0aW9uPC9kdD4KLQotPGRkPlNwZWNpZnkgd2hpY2ggdmFsaWRhdG9ycyBzaG91bGQgcnVuIGZvciB0aGUgcHJvamVjdCwgYW5kIHdoZXRoZXIgdmFsaWRhdGlvbgotc2hvdWxkIG9jY3VyIGF1dG9tYXRpY2FsbHkgd2hlbiByZXNvdXJjZSB1cGRhdGVzIGFyZSB3cml0dGVuIHRvIHRoZSBwcm9qZWN0LgotVGhlIGF2YWlsYWJsZSB2YWxpZGF0b3JzIGFyZSBiYXNlZCBvbiB0aGUgdHlwZXMgb2YgcmVzb3VyY2VzIGluIHlvdXIgcHJvamVjdC4KLUJ5IGRlZmF1bHQsIHZhbGlkYXRvcnMgYXJlIGF1dG9tYXRpY2FsbHkgcnVuIHdoZW4geW91IHNhdmUgcmVzb3VyY2VzIGluIGEKLVdlYiBwcm9qZWN0LiBJZiB5b3UgZG8gbm90IHdhbnQgdmFsaWRhdG9ycyB0byBydW4gYXV0b21hdGljYWxseSB3aGVuIHlvdSBzYXZlCi10aGVzZSByZXNvdXJjZXMsIGVuYWJsZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3ZlcnJpZGUgdmFsaWRhdGlvbjwvc3Bhbj4gcHJlZmVyZW5jZXMKLW9wdGlvbiBhbmQgZGlzYWJsZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UnVuIHZhbGlkYXRpb24gYXV0b21hdGljYWxseSB3aGVuIHlvdSBzYXZlCi1jaGFuZ2VzIHRvIHJlc291cmNlczwvc3Bhbj4gb3B0aW9uLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiBhbHNvICBkaXNhYmxlIGF1dG9tYXRpYwotdmFsaWRhdGlvbiAoYW5kIGJ1aWxkcykgZm9yIGFsbCBwcm9qZWN0cyBieSBkaXNhYmxpbmcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGVyZm9ybSBidWlsZAotIGF1dG9tYXRpY2FsbHkgb24gcmVzb3VyY2UgbW9kaWZpY2F0aW9uPC9zcGFuPiBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+IHByb3BlcnRpZXMuCi1JZiAgeW91IGRpc2FibGUgYXV0b21hdGljIGJ1aWxkcywgeW91IGNhbiBtYW51YWxseSAgcnVuIGEgYnVpbGQgKGFuZCB2YWxpZGF0aW9uKQotYnkgc2VsZWN0aW5nICA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb2plY3Q8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVidWlsZAotcHJvamVjdDwvc3Bhbj48L3NwYW4+LjwvZGl2PgotPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+V2ViIENvbnRlbnQgU2V0dGluZ3M8L2R0PgotCi08ZGQ+UHJvdmlkZSBhbnkgYXBwbGljYWJsZSBXZWIgY29udGVudCBzZXR0aW5ncyBmb3IgYSBXZWIgcHJvamVjdC4gWW91IGNhbgotc3BlY2lmeSB0aGUgZG9jdW1lbnQgdHlwZSwgQ1NTIHByb2ZpbGUsIGFuZCB0YXJnZXQgZGV2aWNlLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPldlYiBQcm9qZWN0IEZlYXR1cmVzPC9kdD4KLQotPGRkPlNlbGVjdCB0aGUgZmVhdHVyZXMgeW91IHdhbnQgdG8gYmUgZW5hYmxlZCBmb3IgeW91ciBXZWIgcHJvamVjdCwgc3VjaAotYXMgUGFnZSBUZW1wbGF0ZSBzdXBwb3J0LjwvZGQ+Ci0KLTwvZGw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPldoZW4geW91IGhhdmUgY29tcGxldGVkIHVwZGF0ZXMgdG8gV2ViIHByb2plY3Qgc2V0dGluZ3MsIGNsaWNrIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPjwvc3Bhbj4gdG8KLXNhdmUgYW5kIGNsb3NlIHRoZSBQcm9wZXJ0aWVzIGRpYWxvZy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3c3J2d2l6LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDkyZTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3c3J2d2l6LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3c3J2d2l6IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBzZXJ2bGV0czwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGUgc2VydmxldCB3aXphcmQgaGVscHMgeW91IGNyZWF0ZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzZXJ2bGV0cyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZQ0KLWNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvcg0KLXRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgc2VydmxldHMgY2FuIHJ1bg0KLW9uIEphdmEgRUUtY29tcGxpYW50IFdlYiBzZXJ2ZXJzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNlcnZsZXRzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPlRvIGNyZWF0ZSBhIHNlcnZsZXQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSwgZXhwYW5kIHlvdXIgIDx4cmVmIGhyZWY9ImNjd2VicHJqLmRpdGEiDQotc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5keW5hbWljIHByb2plY3Q8L3hyZWY+IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmlnaHQgY2xpY2sgb24gdGhlIDxiPlNlcnZsZXQ8L2I+IGljb24sIGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+PHVpY29udHJvbD5TZXJ2bGV0PC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gZnJvbQ0KLXRoZSBwb3AtdXAgbWVudS48L2NtZD48c3RlcHJlc3VsdD4gVGhlIDx1aWNvbnRyb2w+Q3JlYXRlIFNlcnZsZXQ8L3VpY29udHJvbD4gd2l6YXJkDQotYXBwZWFycy48L3N0ZXByZXN1bHQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPjxiPkdlbmVyYWwgSW5mb3JtYXRpb248L2I+PC9wPjxkbD48ZGxlbnRyeT4NCi08ZHQ+TW9kaWZpZXJzPC9kdD4NCi08ZGQ+WW91IGNhbiBzZWxlY3QgYSBtb2RpZmllciBpbiB0aGUgd2l6YXJkIHRvIHNwZWNpZnkgd2hldGhlciB5b3VyIHNlcnZsZXQNCi1jbGFzcyBpcyBwdWJsaWMsIGFic3RyYWN0LCBvciBmaW5hbC4gTm90ZSB0aGF0IGNsYXNzZXMgY2Fubm90IGJlIGJvdGggYWJzdHJhY3QNCi1hbmQgZmluYWwuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PmphdmF4LnNlcnZsZXQuU2VydmxldDwvZHQ+DQotPGRkPkFsdGhvdWdoIGphdmF4LnNlcnZsZXQuU2VydmxldCBpcyBwcm92aWRlZCBhcyB0aGUgZGVmYXVsdCBpbnRlcmZhY2UsIHlvdQ0KLWNhbiB1c2UgdGhlIHdpemFyZCB0byBhZGQgYWRkaXRpb25hbCBpbnRlcmZhY2VzIHRvIGltcGxlbWVudC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SW50ZXJmYWNlIHNlbGVjdGlvbiBkaWFsb2c8L2R0Pg0KLTxkZD5UaGlzIGRpYWxvZyBhcHBlYXJzIGlmIHlvdSBlbGVjdCB0byBhZGQgYW4gaW50ZXJmYWNlIHRvIHlvdXIgc2VydmxldC4NCi1BcyB5b3UgdHlwZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgeW91IGFyZSBhZGRpbmcsIGEgbGlzdCBvZiBhdmFpbGFibGUNCi1pbnRlcmZhY2VzIGxpc3RlZCBpbiB0aGUgTWF0Y2hpbmcgdHlwZXMgbGlzdCBib3ggdXBkYXRlcyBkeW5hbWljYWxseSB0byBkaXNwbGF5DQotb25seSB0aGUgaW50ZXJmYWNlcyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuLiBZb3Ugc2hvdWxkIGNob29zZSBhbiBpbnRlcmZhY2UNCi10byBzZWUgdGhlIHF1YWxpZmllciwgYW5kIHRoZW4gY2xpY2sgT0sgd2hlbiBmaW5pc2hlZC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TWV0aG9kIHN0dWJzPC9kdD4NCi08ZGQ+WW91IGNhbiBzZWxlY3QgYW55IGFwcHJvcHJpYXRlIG1ldGhvZCBzdHVicyB0byBiZSBjcmVhdGVkIGluIHRoZSBzZXJ2bGV0DQotZmlsZS4gVGhlIHN0dWJzIGNyZWF0ZWQgYnkgdXNpbmcgdGhlIEluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzIG9wdGlvbiBtdXN0DQotYmUgaW1wbGVtZW50ZWQgaWYgeW91IGRvIG5vdCBpbnRlbmQgdG8gY3JlYXRlIGFuIGFic3RyYWN0IHNlcnZsZXQuIE5vdGUgdGhhdA0KLXRoaXMgaXMgbm90IHRydWUgZm9yIENvbnN0cnVjdG9ycyBmcm9tIHN1cGVyY2xhc3M8L2RkPg0KLTwvZGxlbnRyeT48L2RsPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWExYWM2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgc2VydmxldHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIHNlcnZsZXQgd2l6YXJkIGhlbHBzIHlvdSBjcmVhdGUgSmF2YSBzZXJ2bGV0cyBieSB3YWxraW5nIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IgdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBzZXJ2bGV0cyBjYW4gcnVuIG9uIEphdmEgRUUtY29tcGxpYW50IFdlYiBzZXJ2ZXJzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgc2VydmxldCB3aXphcmQgaGVscHMgeW91IGNyZWF0ZSBKYXZhIHNlcnZsZXRzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlIGNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvciB0aGF0IHlvdSBjYW4gbW9kaWZ5IGZvciB1c2Ugd2l0aCB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIHNlcnZsZXRzIGNhbiBydW4gb24gSmF2YSBFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuIiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3c2VydmJuLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdzcnZ3aXoiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBzZXJ2bGV0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdzcnZ3aXoiPjxhIG5hbWU9InR3c3J2d2l6Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBzZXJ2bGV0czwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoZSBzZXJ2bGV0IHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIEphdmHihKIgc2VydmxldHMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUKLWNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvcgotdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBzZXJ2bGV0cyBjYW4gcnVuCi1vbiBKYXZhIEVFLWNvbXBsaWFudCBXZWIgc2VydmVycy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UbyBjcmVhdGUgYSBzZXJ2bGV0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOiA8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLCBleHBhbmQgeW91ciAgPGEgaHJlZj0iY2N3ZWJwcmouaHRtbCIgdGl0bGU9IiI+ZHluYW1pYyBwcm9qZWN0PC9hPiBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQgY2xpY2sgb24gdGhlIDxzdHJvbmc+U2VydmxldDwvc3Ryb25nPiBpY29uLCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VydmxldDwvc3Bhbj48L3NwYW4+IGZyb20KLXRoZSBwb3AtdXAgbWVudS48L3NwYW4+ICBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIFNlcnZsZXQ8L3NwYW4+IHdpemFyZAotYXBwZWFycy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0cy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+PHN0cm9uZz5HZW5lcmFsIEluZm9ybWF0aW9uPC9zdHJvbmc+PC9wPgotPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPk1vZGlmaWVyczwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIHNlbGVjdCBhIG1vZGlmaWVyIGluIHRoZSB3aXphcmQgdG8gc3BlY2lmeSB3aGV0aGVyIHlvdXIgc2VydmxldAotY2xhc3MgaXMgcHVibGljLCBhYnN0cmFjdCwgb3IgZmluYWwuIE5vdGUgdGhhdCBjbGFzc2VzIGNhbm5vdCBiZSBib3RoIGFic3RyYWN0Ci1hbmQgZmluYWwuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+amF2YXguc2VydmxldC5TZXJ2bGV0PC9kdD4KLQotPGRkPkFsdGhvdWdoIGphdmF4LnNlcnZsZXQuU2VydmxldCBpcyBwcm92aWRlZCBhcyB0aGUgZGVmYXVsdCBpbnRlcmZhY2UsIHlvdQotY2FuIHVzZSB0aGUgd2l6YXJkIHRvIGFkZCBhZGRpdGlvbmFsIGludGVyZmFjZXMgdG8gaW1wbGVtZW50LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkludGVyZmFjZSBzZWxlY3Rpb24gZGlhbG9nPC9kdD4KLQotPGRkPlRoaXMgZGlhbG9nIGFwcGVhcnMgaWYgeW91IGVsZWN0IHRvIGFkZCBhbiBpbnRlcmZhY2UgdG8geW91ciBzZXJ2bGV0LgotQXMgeW91IHR5cGUgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHlvdSBhcmUgYWRkaW5nLCBhIGxpc3Qgb2YgYXZhaWxhYmxlCi1pbnRlcmZhY2VzIGxpc3RlZCBpbiB0aGUgTWF0Y2hpbmcgdHlwZXMgbGlzdCBib3ggdXBkYXRlcyBkeW5hbWljYWxseSB0byBkaXNwbGF5Ci1vbmx5IHRoZSBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFlvdSBzaG91bGQgY2hvb3NlIGFuIGludGVyZmFjZQotdG8gc2VlIHRoZSBxdWFsaWZpZXIsIGFuZCB0aGVuIGNsaWNrIE9LIHdoZW4gZmluaXNoZWQuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+TWV0aG9kIHN0dWJzPC9kdD4KLQotPGRkPllvdSBjYW4gc2VsZWN0IGFueSBhcHByb3ByaWF0ZSBtZXRob2Qgc3R1YnMgdG8gYmUgY3JlYXRlZCBpbiB0aGUgc2VydmxldAotZmlsZS4gVGhlIHN0dWJzIGNyZWF0ZWQgYnkgdXNpbmcgdGhlIEluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzIG9wdGlvbiBtdXN0Ci1iZSBpbXBsZW1lbnRlZCBpZiB5b3UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW4gYWJzdHJhY3Qgc2VydmxldC4gTm90ZSB0aGF0Ci10aGlzIGlzIG5vdCB0cnVlIGZvciBDb25zdHJ1Y3RvcnMgZnJvbSBzdXBlcmNsYXNzPC9kZD4KLQotPC9kbD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3NlcnZibi5odG1sIj5TZXJ2bGV0czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjI1OTFlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiINCi0gIm1hcC5kdGQiPg0KLTxtYXAgaWQ9IndlYmFwcGRldmVsb3BtZW50IiBsaW5raW5nPSJub25lIiB0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd3RvdmVyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YSIgbmF2dGl0bGU9IldlYiB0b29scyBmZWF0dXJlcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnZ3LmRpdGEiIG5hdnRpdGxlPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSIgbmF2dGl0bGU9IldlYiByZXNvdXJjZXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhIiBuYXZ0aXRsZT0iV2ViIHBhZ2UgZGVzaWduIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhIiBuYXZ0aXRsZT0iV2ViIHByb2plY3RzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3BjbnZydC5kaXRhIiBuYXZ0aXRsZT0iQ29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuZGl0YSIgbmF2dGl0bGU9IlN0YXRpYyBXZWIgcHJvamVjdHMiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3aW1wd2FyLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXdhci5kaXRhIiBuYXZ0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdwbGliLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgV2ViIGxpYnJhcnkgcHJvamVjdHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3ByanNldC5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dlZHR2dy5kaXRhIiBuYXZ0aXRsZT0iV29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amRldGFncy5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVodG0uZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anByZWZzLmRpdGEiIG5hdnRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3R5bGVzaGVldC5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NwZGpzcHMuZGl0YSIgbmF2dGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmFydGlmYWN0LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBXZWIgQXJ0aWZhY3RzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3c3J2d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBzZXJ2bGV0cyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3NlcnZibi5kaXRhIiBuYXZ0aXRsZT0iU2VydmxldHMiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3bHN0d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBMaXN0ZW5lcnMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dsaXN0Ym4uZGl0YSIgbmF2dGl0bGU9Ikxpc3RlbmVycyI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdmbHR3aXouZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIEZpbHRlcnMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dmaWx0Ym4uZGl0YSIgbmF2dGl0bGU9IkZpbHRlcnMiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2N2c3IuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c2VydmVydGFyZ2V0LmRpdGEiIG5hdnRpdGxlPSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2UxZjZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJXZWIgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQiIHRvcGljPSJ0b3BpY3MvY2N3dG92ZXIuaHRtbCI+Ci08dG9waWMgbGFiZWw9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyIgaHJlZj0idG9waWNzL2Njd3RvdmVyLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXZWIgdG9vbHMgZmVhdHVyZXMiIGhyZWY9InRvcGljcy9jd3RmZWF0dXJlcy5odG1sIj4KLTx0b3BpYyBsYWJlbD0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQiIGhyZWY9InRvcGljcy9jY3dlYnZ3Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV2ViIHJlc291cmNlcyIgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJXZWIgcGFnZSBkZXNpZ24iIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sIi8+Ci08L3RvcGljPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iV2ViIHByb2plY3RzIiBocmVmPSJ0b3BpY3MvY3dlYnByb2plY3RzLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0IiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouaHRtbCI+Ci08dG9waWMgbGFiZWw9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiIGhyZWY9InRvcGljcy9jY3dlYnByai5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmh0bWwiPgotPHRvcGljIGxhYmVsPSJDb252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMiIGhyZWY9InRvcGljcy90d3BjbnZydC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlN0YXRpYyBXZWIgcHJvamVjdHMiIGhyZWY9InRvcGljcy9jY3N0YXRpYy5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIGhyZWY9InRvcGljcy90d2ltcHdhci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyIgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIiBocmVmPSJ0b3BpY3MvdHdwbGliLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdHdwcmpzZXQuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iV29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnMiIGhyZWY9InRvcGljcy9jd3dlZHR2dy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiIGhyZWY9InRvcGljcy90amNyZWh0bS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RqcHJlZnMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIiBocmVmPSJ0b3BpY3MvdHN0eWxlc2hlZXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIiBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSIgaHJlZj0idG9waWNzL2NwZGpzcHMuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgV2ViIEFydGlmYWN0cyIgaHJlZj0idG9waWNzL2N3ZWJhcnRpZmFjdC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgc2VydmxldHMiIGhyZWY9InRvcGljcy90d3Nydndpei5odG1sIj4KLTx0b3BpYyBsYWJlbD0iU2VydmxldHMiIGhyZWY9InRvcGljcy9jd3NlcnZibi5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBMaXN0ZW5lcnMiIGhyZWY9InRvcGljcy90d2xzdHdpei5odG1sIj4KLTx0b3BpYyBsYWJlbD0iTGlzdGVuZXJzIiBocmVmPSJ0b3BpY3MvY3dsaXN0Ym4uaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgRmlsdGVycyIgaHJlZj0idG9waWNzL3R3Zmx0d2l6Lmh0bWwiPgotPHRvcGljIGxhYmVsPSJMaXN0ZW5lcnMiIGhyZWY9InRvcGljcy9jd2ZpbHRibi5odG1sIi8+Ci08L3RvcGljPgotPC90b3BpYz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHMiIGhyZWY9InRvcGljcy90d2N2c3IuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIiBocmVmPSJ0b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGZmNjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL0VkaXRvclhtbENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL0VkaXRvclhtbENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyYjRhMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS1wbHVnaW46IG9yZy5lY2xpcHNlLndzdC54bWwudWkgLS0+Ci08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotCQk8ZGVzY3JpcHRpb24gLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndlYngwMDYwIj48IS0tIFhNTCBGaWxlcyBwcmVmZXJlbmNlIHBhZ2UgIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8cD5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgZmlsZSBzdWZmaXggYW5kIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS48L3A+Ci0KLQkJCTxwPlRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgWE1MIHJlbGF0ZWQgZmlsZXMgKERURHMsIFhNTCBmaWxlcywgWE1MIHNjaGVtYXMpLiBDaGFuZ2luZyB0aGUgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcsIFhNTCByZWxhdGVkIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoIHRvIHVzZSB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuPC9wPgotCi0JCQk8cD5Zb3UgY2FuIGFsc28gc2V0IHRoZSB0eXBlIG9mIG1lc3NhZ2UgdGhhdCB3aWxsIGFwcGVhciBpbiB0aGUgcHJvYmxlbXMgdmlldyB3aGVuIGEgcmVzb3VyY2UgaXMgdmFsaWRhdGVkIHdpdGggbm8gc3BlY2lmaWVkIGdyYW1tYXIuPC9wPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5odG1sIiBsYWJlbD0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBhbmQgbGluZSBkZWxpbWl0ZXJzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2VieDAwNjEiPjwhLS0gRWRpdG9yIHByZWZlcmVuY2VzIHBhZ2UgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCTxwPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBmb3JtYXR0aW5nIGFuZCBjb250ZW50IGFzc2lzdCBwcmVmZXJlbmNlcyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIGVkaXRpbmcgYW4gWE1MIGZpbGUuPC9wPgotCi0JCQk8cD5FbnRlciBhIG1heGltdW0gd2lkdGggaW4gdGhlIDxiPkxpbmUgd2lkdGg8L2I+IGZpZWxkIHRvIHNwZWNpZnkgd2hlbiBhIGxpbmUgc2hvdWxkIGJlIGJyb2tlbiB0byBmaXQgb250byBtb3JlIHRoYW4gb25lIGxpbmUuIFRoaXMgd2lsbCBiZSBhcHBsaWVkIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZC4KLQkJCTwvcD4KLQkJCi0KLQkJCTxwPlNlbGVjdCA8Yj5TcGxpdCBtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZTwvYj4gdG8gc3RhcnQgZXZlcnkgYXR0cmlidXRlIG9uIGEgbmV3IGxpbmUgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLgotCQkJPC9wPgotCi0JCQk8cD4KLQkJCQlTZWxlY3QgPGI+Q2xlYXIgYWxsIGJsYW5rIGxpbmVzPC9iPiB0byByZW1vdmUgYmxhbmsgbGluZXMgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLgotCQkJPC9wPgotCi0JCQk8cD4KLQkJCQlTZWxlY3QgPGI+SW5kZW50IHVzaW5nIHRhYnM8L2I+IGlmIHlvdSB3YW50IHRvIHVzZSB0YWIgY2hhcmFjdGVycyAoXHQpIGFzIHRoZSBzdGFuZGFyZCBmb3JtYXR0aW5nIGluZGVudGF0aW9uLiBJZiB5b3UgcHJlZmVyIHRvIHVzZSBzcGFjZXMsIHNlbGVjdCA8Yj5JbmRlbnQgdXNpbmcgc3BhY2VzPC9iPi4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIDxiPkluZGVudGF0aW9uIHNpemU8L2I+IHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGFicyBvciBzcGFjZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uCi0JCQk8L3A+Ci0KLQkJCTxwPgotCQkJCVRvIGFwcGx5IHRoZXNlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIDxiPkZvcm1hdCAmZ3Q7IERvY3VtZW50PC9iPi4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJSWYgdGhlIDxiPkF1dG9tYXRpY2FsbHkgbWFrZSBzdWdnZXN0aW9uczwvYj4gY2hlY2sgYm94IGlzIHNlbGVjdGVkLCB5b3UgY2FuIHNwZWNpZnkgdGhhdCBjZXJ0YWluIGNoYXJhY3RlcnMgd2lsbCBjYXVzZSB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB0byBwb3AgdXAgYXV0b21hdGljYWxseS4gU3BlY2lmeSB0aGVzZSBjaGFyYWN0ZXJzIGluIHRoZSA8Yj5Qcm9tcHQgd2hlbiB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDwvYj4gZmllbGQuCi0JCQk8L3A+Ci0KLQkJCTxwPgotCQkJCUlmIHlvdSBzZWxlY3QgPGI+U3RyaWN0PC9iPiBmcm9tIHRoZSA8Yj5TdWdnZXN0aW9uIHN0cmF0ZWd5PC9iPiBsaXN0LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgc2hvd24gZmlyc3QgKHdpdGggYm9sZCBpY29ucykgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVsZW1lbnQgc2NvcGUsIGJ1dCBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCwgd2lsbCBiZSBzaG93biBiZWxvdyB0aGVtIHdpdGggYSBkZS1lbXBoYXNpemVkIGljb24uIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIDxiPkxheDwvYj4uCi0JCQk8L3A+Ci0KLQkJCTxwPgotCQkJCUlmIGEgRFREIG9yIHNjaGVtYSAob3Igb3RoZXIgbW9kZWwpIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGFuIFhNTCBmaWxlLCBzZWxlY3RpbmcgPGI+VXNlIGluZmVycmVkIGdyYW1tYXIgaW4gYWJzZW5jZSBvZiBEVEQvU2NoZW1hPC9iPiBhbGxvd3MgdGhlIGVkaXRvciB0byAiZ3Vlc3MiIHdoYXQgZWxlbWVudHMgb3IgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIGJhc2VkIG9uIGV4aXN0aW5nIGNvbnRlbnQuCi0JCQk8L3A+Ci0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmh0bWwiIGxhYmVsPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2VieDAwNjIiPjwhLS0gU3ludGF4IENvbG9yaW5nIHByZWZlcmVuY2UgcGFnZSAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJPHA+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyB0aGF0IHRoZSBYTUwgZWRpdG9yIGRvZXMgd2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBmaWxlLjwvcD4KLQotCQkJPHA+Ci0JCQkJVGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgc291cmNlIHR5cGVzIHRoYXQgeW91IGNhbiBzZWxlY3QgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGVpdGhlciBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgb3IgY2xpY2sgdGV4dCBpbiB0aGUgdGV4dCBzYW1wbGUgd2luZG93IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnRlbnQgdHlwZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0ZXh0IGhpZ2hsaWdodGluZy4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJVGhlIDxiPkZvcmVncm91bmQ8L2I+IGFuZCA8Yj5CYWNrZ3JvdW5kPC9iPiBidXR0b25zIG9wZW4gPGI+Q29sb3I8L2I+IGRpYWxvZyBib3hlcyB0aGF0IGFsbG93IHlvdSB0byBzcGVjaWZ5IHRleHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMsIHJlc3BlY3RpdmVseS4gU2VsZWN0IHRoZSA8Yj5Cb2xkPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBhcHBlYXIgaW4gYm9sZC4KLQkJCTwvcD4KLQotCQkJPHA+Ci0JCQkJQ2xpY2sgdGhlIDxiPlJlc3RvcmUgRGVmYXVsdHM8L2I+IGJ1dHRvbiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gSWYgeW91IG9ubHkgd2FudCB0byByZXNldCB0aGUgdmFsdWUgZm9yIGEgcGFydGljdWxhciBjb250ZW50IHR5cGUsIHNlbGVjdCBpdCBpbiB0aGUgPGI+Q29udGVudCB0eXBlPC9iPiBmaWVsZCwgdGhlIGNsaWNrIHRoZSA8Yj5SZXN0b3JlIERlZmF1bHQ8L2I+IGJ1dHRvbiBuZXh0IHRvIGl0LgotCQkJPC9wPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuaHRtbCIgbGFiZWw9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3ZWJ4MDA2MyI+PCEtLSBUZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8cD5UaGlzIHBhZ2UgbGV0cyB5b3UgY3JlYXRlIG5ldyB0ZW1wbGF0ZXMgYW5kIGVkaXQgZXhpc3Rpbmcgb25lcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gZWRpdGluZyBhbiBYTUwgZmlsZS4gQSB0ZW1wbGF0ZSBpcyBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLjwvcD4KLQotCQkJPHA+Q2xpY2sgPGI+TmV3PC9iPiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5IG5ldyB0ZW1wbGF0ZS4KLQkJCTwvcD4KLQotCQkJPHA+U3VwcGx5IGEgbmV3IHRlbXBsYXRlIDxiPk5hbWU8L2I+IGFuZCA8Yj5EZXNjcmlwdGlvbjwvYj4uIFRoZSA8Yj5Db250ZXh0PC9iPiBmb3IgdGhlIHRlbXBsYXRlIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIFNwZWNpZnkgdGhlIDxiPlBhdHRlcm48L2I+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0LgotCQkJPC9wPgotCi0JCQk8cD4KLQkJCQlJZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxiPkluc2VydCBWYXJpYWJsZTwvYj4gYnV0dG9uIGFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLiBGb3IgZXhhbXBsZSwgdGhlIDxiPmRhdGU8L2I+IHZhcmlhYmxlIGluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgaW5zZXJ0ZWQuCi0JCQk8L3A+Ci0KLQkJCTxwPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlIGl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUgbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuPC9wPgotCi0JCQk8cD4KLQkJCQlJZiB5b3UgaGF2ZSBhIHRlbXBsYXRlIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgY2xlYXIgaXRzIGNoZWNrIGJveCBpbiB0aGUgPGI+VGVtcGxhdGVzPC9iPiBwcmVmZXJlbmNlcyBwYWdlLgotCQkJPC9wPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5odG1sIiBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxtMTIwMCI+PCEtLSBkb2Vzbid0IGV4aXN0IGluIHhtbCBwcmVmZXJlbmNlcyAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJQ2xlYW51cCBvcHRpb25zIGVuYWJsZSB5b3UgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZCBhbmQgY29uc2lzdGVudGx5IGZvcm1hdHRlZC4KLQotCQkJVGhlIGZvbGxvd2luZyBjbGVhbnVwIG9wdGlvbnMgY2FuIGJlIHNldCB0byBvbiBvciBvZmYsIHNvIHRoYXQgeW91IGNhbiBsaW1pdCB0aGUgdHlwZSBvZiBjbGVhbnVwIHBlcmZvcm1lZDoKLQotCQkJLSA8Yj5Db21wcmVzcyBlbXB0eSBlbGVtZW50IHRhZ3M8L2I+OiBDb21wcmVzcyBlbGVtZW50IHRhZ3Mgd2l0aCBubyBjb250ZW50IHRvIG9uZSB0YWcgd2l0aCBhbiBlbmQgdGFnIGRlbGltaXRlciAoaWU6IGNoYW5nZSAmbHQ7dGFnJmd0OyZsdDsvdGFnJmd0OyB0byAmbHQ7dGFnLyZndDspLgotCi0JCQktIDxiPkluc2VydCByZXF1aXJlZCBhdHRyaWJ1dGVzPC9iPjogSW5zZXJ0cyBhbnkgbWlzc2luZyBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IHRoZSB0YWcgdG8gbWFrZSB0aGUgZWxlbWVudCBvciBkb2N1bWVudCB3ZWxsLWZvcm1lZC4KLQotCQkJLSA8Yj5JbnNlcnQgbWlzc2luZyB0YWdzPC9iPjogQ29tcGxldGVzIGFueSBtaXNzaW5nIHRhZ3MgKHN1Y2ggYXMgYWRkaW5nIGFuIGVuZCB0YWcpIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBlbGVtZW50IG9yIGRvY3VtZW50IHdlbGwtZm9ybWVkLgotCi0JCQktIDxiPlF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXM8L2I+OiBBcHByb3ByaWF0ZWx5IGFkZHMgZG91YmxlLSBvciBzaW5nbGUtcXVvdGVzIGJlZm9yZSBhbmQgYWZ0ZXIgYXR0cmlidXRlIHZhbHVlcyBpZiB0aGV5IGFyZSBtaXNzaW5nLgotCi0JCQktIDxiPkZvcm1hdCBzb3VyY2U8L2I+OiBGb3JtYXRzIHRoZSBkb2N1bWVudCBqdXN0IGFzIHRoZSA8Yj5Gb3JtYXQgRG9jdW1lbnQ8L2I+IGNvbnRleHQgbWVudSBvcHRpb24gZG9lcywgaW1tZWRpYXRlbHkgYWZ0ZXIgcGVyZm9ybWluZyBhbnkgb3RoZXIgc3BlY2lmaWVkIDxiPkNsZWFudXA8L2I+IG9wdGlvbnMuCi0KLQkJCS0gPGI+Q29udmVydCBsaW5lIGRlbGltaXRlcnMgdG88L2I+OiBDb252ZXJ0cyBhbGwgbGluZSBkZWxpbWl0ZXJzIGluIHRoZSBmaWxlIHRvIHRoZSBzZWxlY3RlZCBvcGVyYXRpbmcgc3lzdGVtJ3MgdHlwZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhjdWkwNTAwIj48IS0tIGFkZCBuZXcgYXR0cmlidXRlIGRpYWxvZyAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJRW50ZXIgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgPGI+TmFtZTwvYj4gZmllbGQsIHRoZW4gZW50ZXIgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIDxiPlZhbHVlPC9iPiBmaWVsZC4gQ2xpY2sgPGI+T0s8L2I+LiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpbGUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4Y3VpMDAxMCI+PCEtLSAgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgPGI+UHVibGljIElEPC9iPiBmaWVsZCB0byBjcmVhdGUgYW4gYXNzb2NpYXRpb24gdXNpbmcgYW4gWE1MIENhdGFsb2cgZW50cnkgb3IgdGhlIDxiPlN5c3RlbSBJRDwvYj4gZmllbGQgdG8gY3JlYXRlIGFuIGFzc29jaWF0aW9uIHVzaW5nIGEgZmlsZSBpbiB0aGUgd29ya2JlbmNoLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiAvPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sIiBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhjdWkwMDIwIj48IS0tIGVkaXQgZG9jdHlwZSBkZWNsYXJhdGlvbiBkaWFsb2cgLS0+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIHNob3VsZCBtYXRjaCB0aGUgbmFtZSBvZiB5b3VyIFhNTCBmaWxlJ3Mgcm9vdCBlbGVtZW50LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwiIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTAwMzAiPjwhLS0gZWRpdCBkb2N0eXBlIGRlY2xhcmF0aW9uIGRpYWxvZyAtLT4KLQkJPGRlc2NyaXB0aW9uPlRoZSB2YWx1ZSBpbiB0aGlzIGZpZWxkIGlzIHRoZSBQdWJsaWMgSWRlbnRpZmllci4gSXQgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlIFhNTCBmaWxlICh1c2luZyBhbiBYTUwgY2F0YWxvZyBlbnRyeSkgd2l0aCBhIERURCBmaWxlIGJ5IHByb3ZpZGluZyBhIGhpbnQgdG8gdGhlIFhNTCBwcm9jZXNzb3IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuaHRtbCIgbGFiZWw9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4Y3VpMDA1MCI+PCEtLSBlZGl0IGRvY3R5cGUgZGVjbGFyYXRpb24gZGlhbG9nIC0tPgotCQk8ZGVzY3JpcHRpb24+VGhlIHZhbHVlIGluIHRoaXMgZmllbGQgaXMgdGhlIERURCB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiBZb3UgY2FuIGNoYW5nZSB0aGUgRFREIHRoZSBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBieSBlZGl0aW5nIHRoaXMgZmllbGQuIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdHJ5IHRvIHVzZSB0aGUgUHVibGljIElEIHRvIGxvY2F0ZSB0aGUgRFRELCBhbmQgaWYgdGhpcyBmYWlscywgaXQgd2lsbCB1c2UgdGhlIFN5c3RlbSBJRCB0byBmaW5kIGl0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwiIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTA2MDAiPjwhLS0gYWRkIGVsZW1lbnQgZGlhbG9nIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlFbnRlciB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpbiB0aGUgPGI+RWxlbWVudCBuYW1lPC9iPiBmaWVsZCwgdGhlbiBjbGljayA8Yj5PSzwvYj4uIFRoZSBlbGVtZW50IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpbGUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4Y3VpMDMwMCI+PCEtLSBlZGl0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZGlhbG9nIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlBIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gaXMgYSBzeW50YXggaW4gWE1MIGZvciBwYXNzaW5nIGluc3RydWN0aW9ucyBhbG9uZyB0byB0aGUgYXBwbGljYXRpb24gdXNpbmcgYW4gWE1MIGRvY3VtZW50LiBUaGUgPGI+VGFyZ2V0PC9iPiBmaWVsZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBhcHBsaWNhdGlvbiB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG9uZ3MgdG8uIFRoZSA8Yj5EYXRhPC9iPiBmaWVsZCBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiAvPgotCQk8dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuaHRtbCIgbGFiZWw9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTAxMDAiPjwhLS0gZWRpdCBzY2hlbWEgaW5mb3JtYXRpb24gKG5hbWVzcGFjZSBkZWNsYXJhdGlvbikgZGlhbG9nIC0tPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUaGlzIGlzIGEgcmVhZC1vbmx5IGRpYWxvZy4gU2VsZWN0IHRoZSBlbnRyeSB5b3Ugd2FudCB0byBlZGl0IGFuZCBjbGljayA8Yj5FZGl0PC9iPi4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIHlvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTAyMDAiPjwhLS0gYWRkIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBkaWFsb2cgLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVRoZSB2YWx1ZSBpbiB0aGUgPGI+TmFtZXNwYWNlIE5hbWU8L2I+IGZpZWxkIGlzIHRoZSBuYW1lc3BhY2UgdGhlIFhNTCBmaWxlIGJlbG9uZ3MgdG8uCi0KLQkJCUFsbCBxdWFsaWZpZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgPGI+UHJlZml4PC9iPiB2YWx1ZS4KLQotCQkJVGhlIDxiPkxvY2F0aW9uIEhpbnQ8L2I+IGZpZWxkIGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgWE1MIHNjaGVtYSB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiBBbiBYTUwgQ2F0YWxvZyBJRCBvciBhIFVSSSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgZmllbGQuIFlvdSBjYW4gc2VhcmNoIGZvciB0aGUgc2NoZW1hIHlvdSB3YW50IHRvIHVzZSBieSBjbGlja2luZyA8Yj5Ccm93c2U8L2I+LiBPbmNlIHlvdSBzZWxlY3QgYSBmaWxlLCB0aGUgPGI+TmFtZXNwYWNlIE5hbWU8L2I+IGFuZCA8Yj5QcmVmaXg8L2I+IGZpZWxkcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZmlsbGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcyBmcm9tIHRoZSBzY2hlbWEgKHlvdSBtdXN0IGxlYXZlIHRoZSBmaWVsZHMgYmxhbmsgZm9yIHRoaXMgdG8gb2NjdXIpLgotCi0JCQk8Yj5Ob3RlPC9iPiA6IElmIHlvdSBhcmUgY3JlYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hLCB5b3UgY2Fubm90IGNoYW5nZSB0aGUgPGI+TmFtZXNwYWNlIE5hbWU8L2I+IG9yIDxiPkxvY2F0aW9uIEhpbnQ8L2I+IHZhbHVlcy4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLQkJPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIHlvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieGN1aTA0MDAiPjwhLS0gIC0tPgotCQk8ZGVzY3JpcHRpb24+QW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVVJJICh3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLiBTZWxlY3QgdGhlIGNhdGFsb2cgZW50cnkgeW91IHdhbnQgdG8gYXNzb2NpYXRlIHlvdXIgWE1MIGZpbGUgd2l0aC48L2Rlc2NyaXB0aW9uPgotCTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0czIueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvRWRpdG9yWG1sQ29udGV4dHMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1MDRlZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0czIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLQk8Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci0JCTxkZXNjcmlwdGlvbiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ieG1sX3NvdXJjZV9IZWxwSWQiPgotCQk8ZGVzY3JpcHRpb24+VGhlIFhNTCBzb3VyY2UgdmlldyBsZXRzIHlvdSBlZGl0IGEgZmlsZSB0aGF0IGlzIGNvZGVkIGluIHRoZSBFeHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZS4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgdXNlci1kZWZpbmVkIHRlbXBsYXRlcywgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWwiCi0JCQlsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIC8+Ci0JPC9jb250ZXh0PgotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzU4ZGJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMzAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1RhYmxlVHJlZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9UYWJsZVRyZWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjYyZWZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1RhYmxlVHJlZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotCSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotCSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0JKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotCSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLQkqIAotCSogQ29udHJpYnV0b3JzOgotCSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotCQk8ZGVzY3JpcHRpb24gLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbG0zMDAwIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciByZXByZXNlbnRzIHlvdXIgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUsIHdoaWNoIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIERlcGVuZGluZyBvbiB0aGUga2luZCBvZiBmaWxlIHlvdSBhcmUgd29ya2luZyB3aXRoLCBjb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IGxvY2F0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIKLQkJCWxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLQk8L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1dTRExDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9XU0RMQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ2MmI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1dTRExDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSBwbHVnaW46IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpIC0tPgotCi08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotCQk8ZGVzY3JpcHRpb24gLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IiI+PCEtLSBjaGFuZ2UgbGF0ZXIsIHRoaXMgaGFzIG5vIGlkIGF0bSAtLT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJU2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgV1NETCBmaWxlLiBJbiB0aGUgPGI+RmlsZSBuYW1lPC9iPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZiB0aGUgV1NETCBmaWxlLCBmb3IgZXhhbXBsZSA8aT5OZXdXU0RMRmlsZS53c2RsPC9pPi4gVGhlIG5hbWUgb2YgeW91ciBXU0RMIGZpbGUgbXVzdCBlbmQgaW4gPGk+LndzZGw8L2k+LgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id3NkbHUwMDAwIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJPGI+VGFyZ2V0IG5hbWVzcGFjZTwvYj4gaXMgdXNlZCBmb3IgdGhlIG5hbWVzIG9mIG1lc3NhZ2VzIGFuZCB0aGUgcG9ydCB0eXBlLCBiaW5kaW5nIGFuZCBzZXJ2aWNlIGRlZmluZWQgaW4gdGhlIFdTREwgZmlsZS4gVGhlIHZhbHVlIG11c3QgdGFrZSB0aGUgZm9ybSBvZiBhIHZhbGlkIFVSSSAoZm9yIGV4YW1wbGUsIGh0dHA6Ly93d3cubXljb21wYW55LmNvbS9teXNlcnZpY2UvKS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndzZGx1MDAwMSI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCTxiPlByZWZpeDwvYj4gaXMgdGhlIHByZWZpeCBhc3NvY2lhdGVkIHdpdGggdGhlIHRhcmdldCBuYW1lc3BhY2UuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZG9jLnVzZXIvdGFza3MvdGNydHdzZGwuaHRtbCIKLQkJCWxhYmVsPSIiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3c2RsdTAwMDIiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8Yj5DcmVhdGUgV1NETCBTa2VsZXRvbjwvYj4gd2lsbCBnZW5lcmF0ZSB0aGUgV1NETCBlbGVtZW50cyByZXF1aXJlZCBmb3IgeW91ciBzZXJ2aWNlLCBpbmNsdWRpbmcgYmluZGluZ3MsIHBvcnRzIGFuZCBtZXNzYWdlcy4gWW91IGNhbiB0aGVuIG1vZGlmeSB0aGVzZSB0byBtZWV0IHRoZSByZXF1aXJlbWVudHMgb2YgeW91ciBXZWIgc2VydmljZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndzZGx1MDAwMyI+Ci0JCTxkZXNjcmlwdGlvbj5JZiB5b3UgaGF2ZSBjaG9zZW4gdG8gY3JlYXRlIGEgV1NETCBza2VsZXRvbiwgc2VsZWN0IHRoZSBiaW5kaW5nIG9wdGlvbnMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSBQcm90b2NvbCBkcm9wIGRvd24uIFRoZSBvcHRpb25zIGFyZSBTT0FQIGFuZCBIVFRQLiBVc2UgdGhlIFNPQVAgcHJvdG9jb2wgd2hlbiB5b3Ugd2FudCB0byBleGNoYW5nZSBzdHJ1Y3R1cmVkIGFuZCB0eXBlZCBpbmZvcm1hdGlvbi4gVXNlIHRoZSBIVFRQIHByb3RvY29sIHdoZW4geW91IHdhbnQgeW91ciBhcHBsaWNhdGlvbiBjbGllbnQgdG8ganVzdCByZXF1ZXN0IG9yIHVwZGF0ZSBpbmZvcm1hdGlvbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id3NkbHUwMDEwIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJSWYgeW91IHNlbGVjdCBTT0FQIHlvdSBjYW4gdGhlbiBzZWxlY3QgdGhlIGVuY29kaW5nIHN0eWxlIHlvdSB3YW50IHRvIHVzZToKLQkJCTx1bD4KLQkJCQk8bGk+Ci0JCQkJCTxiPmRvY3VtZW50IGxpdGVyYWw8L2I+OiBEb2N1bWVudCBzdHlsZSBtZXNzYWdlcywgbGl0ZXJhbCBlbmNvZGluZy4gVXNlIHRoaXMgc3R5bGUgb2YgYmluZGluZyB3aGVuIHlvdSB3YW50IHRvIHNlbmQgU09BUCBtZXNzYWdlcyB0aGF0IGNhbiBiZSB2YWxpZGF0ZWQgYnkgYW4gWE1MIHZhbGlkYXRvci4gQWxsIHRoZSBkYXRhIHR5cGVzIGluIHRoZSBTT0FQIG1lc3NhZ2UgYm9keSBhcmUgZGVmaW5lZCBpbiBhIHNjaGVtYSwgc28gdGhlIFdTREwgcGFydHMgbXVzdCBwb2ludCB0byBzY2hlbWEgZWxlbWVudHMuCi0JCQkJPC9saT4KLQkJCTwvdWw+Ci0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZG9jLnVzZXIvdGFza3MvdGNydHdzZGwuaHRtbCIKLQkJCWxhYmVsPSIiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3c2RsdTAwMTEiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQk8dWw+Ci0JCQkJPGxpPgotCQkJCQk8Yj5ycGMgbGl0ZXJhbDwvYj46IFJQQyBzdHlsZSBtZXNzYWdlcywgbGl0ZXJhbCBlbmNvZGluZy4gVXNlIHRoaXMgc3R5bGUgb2YgYmluZGluZyB3aGVuIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIG9wZXJhdGlvbiBtZXRob2QgbmFtZXMgaW4geW91ciBTT0FQIG1lc3NhZ2VzIHNvIGEgc2VydmVyIGNhbiBkaXNwYXRjaCB0aGUgc3BlY2lmaWVkIG1ldGhvZHMuIERhdGEgdHlwZXMgbXVzdCBiZSBkZWZpbmVkLCBzbyB0aGUgV1NETCBwYXJ0cyBtdXN0IHBvaW50IHRvIFhTRCB0eXBlcy4KLQkJCQk8L2xpPgotCQkJPC91bD4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS5kb2MudXNlci90YXNrcy90Y3J0d3NkbC5odG1sIgotCQkJbGFiZWw9IiIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndzZGx1MDAxMiI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCTx1bD4KLQkJCQk8bGk+Ci0JCQkJCTxiPnJwYyBlbmNvZGVkPC9iPjogUlBDIHN0eWxlIG1lc3NhZ2VzIGFuZCBTT0FQIGVuY29kaW5nLiBVc2UgdGhpcyBzdHlsZSBvZiBiaW5kaW5nIHdoZW4geW91IHdhbnQgdG8gZW5jb2RlIGRhdGEgZ3JhcGhzIGluIHlvdXIgU09BUCBtZXNzYWdlcyBzbyBhIHNlcnZlciBjYW4gZGVzZXJpYWxpemUgdGhlIG9iamVjdCBkYXRhLiBEYXRhIHR5cGVzIG11c3QgYmUgZGVmaW5lZCwgc28gdGhlIFdTREwgcGFydHMgbXVzdCBwb2ludCB0byBYU0QgdHlwZXMuCi0JCQkJPC9saT4KLQkJCTwvdWw+Ci0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZG9jLnVzZXIvdGFza3MvdGNydHdzZGwuaHRtbCIKLQkJCWxhYmVsPSIiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3c2RsdTAwMTMiPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlJZiB5b3Ugc2VsZWN0IEhUVFAgeW91IGNhbiBzZWxlY3Qgd2hldGhlciB0byBjcmVhdGUgYW4gSFRUUCBnZXR0ZXIgb3Igc2V0dGVyOgotCQkJPHVsPgotCQkJCTxsaT4KLQkJCQkJPGI+SFRUUCBHRVQ8L2I+OiBBIEdFVCByZXF1ZXN0IGZldGNoZXMgZGF0YSBmcm9tIGEgV2ViIHNlcnZlciBiYXNlZCBvbiBhbiBVUkwgdmFsdWUgYW5kIGEgc2V0IG9mIEhUVFAgaGVhZGVycy4gVXNlIHRoaXMgbWV0aG9kIHdoZW4geW91IHdhbnQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LgotCQkJCTwvbGk+Ci0JCQk8L3VsPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id3NkbHUwMDE0Ij4KLQkJPGRlc2NyaXB0aW9uPgotCQkJPHVsPgotCQkJCTxsaT4KLQkJCQkJPGI+SFRUUCBQT1NUPC9iPjogQSBQT1NUIHJlcXVlc3Qgc2VuZHMgYWRkaXRpb25hbCBkYXRhIHRvIHRoZSBzZXJ2ZXIsIHNwZWNpZmllZCBhZnRlciB0aGUgVVJMIGFuZCB0aGUgaGVhZGVycy4gVXNlIHRoaXMgbWV0aG9kIHdoZW4geW91IHdhbnQgdG8gc2VuZCBkYXRhIGVuY2xvc2VkIGluIHRoZSBib2R5IG9mIHRoZSByZXF1ZXN0LgotCQkJCTwvbGk+Ci0JCQk8L3VsPgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0JCQlsYWJlbD0iIiAvPgotCTwvY29udGV4dD4KLTwvY29udGV4dHM+Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1hNTFdpemFyZENvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1hNTFdpemFyZENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViYjkxNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9YTUxXaXphcmRDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJjc2hfb3V0ZXJfY29udGFpbmVyIj4KLQkJPGRlc2NyaXB0aW9uIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDEwMSI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgPGI+Q3JlYXRlIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZTwvYj4gcmFkaW8gYnV0dG9uIHRvIGNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREIGZpbGUuIFRoZSBmaWxlIHdpbGwgY29udGFpbiB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50LCBwb3B1bGF0ZWQgd2l0aCBhbnkgcmVxdWlyZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIKLQkJCWxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDEwMiI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgPGI+Q3JlYXRlIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYSBmaWxlPC9iPiByYWRpbyBidXR0b24gdG8gY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYS4gVGhlIGZpbGUgd2lsbCBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGFueSBlbGVtZW50cyBvciBhdHRyaWJ1dGVzIGl0IGNvbnRhaW5zLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbGMwMTAzIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJU2VsZWN0IHRoZSA8Yj5DcmVhdGUgWE1MIGZpbGUgZnJvbSBzY3JhdGNoPC9iPiByYWRpbyBidXR0b24gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGFuIFhNTCBmaWxlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IFhNTCBzY2hlbWEgb3IgRFREIGZpbGUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXR4bWwuaHRtbCIKLQkJCWxhYmVsPSJDcmVhdGluZyBlbXB0eSBYTUwgZmlsZXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDUwMCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgPGI+U2VsZWN0IGZpbGUgZnJvbSB3b3JrYmVuY2g8L2I+IHJhZGlvIGJ1dHRvbiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBYTUwgZmlsZSBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgdGhhdCBpcyBpbiB0aGUgd29ya2JlbmNoLgotCi0JCQlTZWxlY3QgdGhlIDxiPlNlbGVjdCBYTUwgQ2F0YWxvZyBlbnRyeTwvYj4gcmFkaW8gYnV0dG9uIGlmIHlvdSB3YW50IHRvIHVzZSBhIGZpbGUgbGlzdGVkIGluIHRoZSBYTUwgQ2F0YWxvZyB0byBjcmVhdGUgeW91ciBYTUwgZmlsZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbGMwNDEwIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlciBlbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBEVEQgb3IgYWxsIGdsb2JhbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBYTUwgc2NoZW1hIGFyZSBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuCi0KLQkJCTxiPk5vdGU8L2I+OiBJZiB5b3UgZG8gbm90IGhhdmUgYW55IGVsZW1lbnRzIGluIHlvdXIgRFREIG9yIGFueSBnbG9iYWwgZWxlbWVudHMgaW4geW91ciBYTUwgc2NoZW1hLCB5b3UgY2Fubm90IGNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGl0LgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiAvPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbGMwNDQxIj4KLQkJPGRlc2NyaXB0aW9uPklmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIGJvdGggbWFuZGF0b3J5IGFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLiBJZiB5b3UgZG8gbm90IHNlbGVjdCBpdCwgb25seSBtYW5kYXRvcnkgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiAvPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbGMwNDQyIj4KLQkJPGRlc2NyaXB0aW9uPklmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIGJvdGggdGhlIG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuIElmIHlvdSBkbyBub3Qgc2VsZWN0IGl0LCBvbmx5IG1hbmRhdG9yeSBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiAvPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiCi0JCQlsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhtbGMwNDQzIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJSWYgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgdGhlIGZpcnN0IGNob2ljZSBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLgotCi0JCQlGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhlIGZvbGxvd2luZyBjb2RlIGluIHlvdXIgc291cmNlIGZpbGU6Ci0KLQkJCTxiPiZsdDtjaG9pY2UmZ3Q7ICZsdDtlbGVtZW50IG5hbWU9ImEiIHR5cGU9InN0cmluZyZndDsgJmx0O2VsZW1lbnQgbmFtZT0iYiIgdHlwZT0iaW50ZWdlciZndDsgJmx0Oy9jaG9pY2UmZ3Q7PC9iPgotCi0JCQlhbmQgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgYW4gZWxlbWVudCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBjcmVhdGVkIGluIHlvdXIgWE1MIGZpbGU6Ci0KLQkJCTxiPiZsdDthJmd0O2hlbGxvJmx0Oy9hJmd0OzwvYj4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgLz4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDQ0NCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUlmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIGFueSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBnZW5lcmF0ZWQgd2lsbCBiZSBmaWxsZWQgd2l0aCBzYW1wbGUgZGF0YSwgc3VjaCBhcyA8Yj4mbHQ7dGV4dCZndDtFbXB0eVRleHQmbHQ7L3RleHQmZ3Q7LjwvYj4gT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUgZW1wdHkgLSB0aGF0IGlzLCA8Yj4mbHQ7dGV4dCZndDsmbHQ7L3RleHQmZ3Q7LjwvYj4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgLz4KLQkJPHRvcGljCi0JCQlocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIgotCQkJbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDIxMCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgU3lzdGVtIElEIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBVUkkgKHBoeXNpY2FsIGxvY2F0aW9uKSBvZiB0aGUgRFREIGZpbGUuIFRoZSBQdWJsaWMgSUQgdmFsdWUgY2FuIHJlZmVyIHRvIGEgRFREIGVudHJ5IGluIGFuIFhNTCBDYXRhbG9nLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIKLQkJCWxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ4bWxjMDIyMCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgU3lzdGVtIElEIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBVUkkgKHBoeXNpY2FsIGxvY2F0aW9uKSBvZiB0aGUgRFREIGZpbGUuIFRoZSBQdWJsaWMgSUQgdmFsdWUgY2FuIHJlZmVyIHRvIGEgRFREIGVudHJ5IGluIGFuIFhNTCBDYXRhbG9nLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIKLQkJCWxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci0JPC9jb250ZXh0PgotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9YU0RDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9YU0RDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZWE4OWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvWFNEQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLQkqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLQkqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotCSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLQkqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0JKiAKLQkqIENvbnRyaWJ1dG9yczoKLQkqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSBwbHVnaW5zOiBvcmcuZWNsaXBzZS51aS5pZGUgYW5kIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwgLS0+Ci0KLTxjb250ZXh0cz4KLQk8Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci0JCTxkZXNjcmlwdGlvbiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibmV3X2ZpbGVfd2l6YXJkX3BhZ2VfY29udGV4dCI+PCEtLSBmaXggdGhpcywgdGhlcmUgaXMgbm8gY29udGV4dCBpZCBhdG0gLS0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFhNTCBzY2hlbWEuIEluIHRoZSA8Yj5GaWxlIG5hbWU8L2I+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBYTUwgc2NoZW1hLCBmb3IgZXhhbXBsZSA8aT5NeVhNTFNjaGVtYS54c2Q8L2k+LiBUaGUgbmFtZSBvZiB5b3VyIFhNTCBzY2hlbWEgbXVzdCBlbmQgaW4gPGk+LnhzZDwvaT4uCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYwotCQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guaHRtbCIKLQkJCWxhYmVsPSJDcmVhdGluZyBYTUwgc2NoZW1hcyIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InhzZHAwMDEwIj4KLQkJPGRlc2NyaXB0aW9uPgotCQkJU2VsZWN0IHRoZSA8Yj5RdWFsaWZ5IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0czwvYj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IGEgcHJlZml4IGFwcGxpZWQgdG8gYWxsIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBpbiB5b3VyIFhNTCBzY2hlbWEuCi0KLQkJCUluIHRoZSA8Yj5YTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4PC9iPiBmaWVsZCwgdHlwZSB0aGUgcHJlZml4IHlvdSB3YW50IGFwcGxpZWQgdG8gWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIGluIHlvdXIgWE1MIHNjaGVtYS4gVGhlIHByZWZpeCA8aT54c2Q8L2k+IGlzIHVzZWQgYnkgY29udmVudGlvbiB0byBkZW5vdGUgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlLCBidXQgYW55IHByZWZpeCBjYW4gYmUgdXNlZC4gVGhlIHB1cnBvc2Ugb2YgdGhlIGFzc29jaWF0aW9uIGlzIHRvIGlkZW50aWZ5IHRoZSBlbGVtZW50cyBhbmQgc2ltcGxlIHR5cGVzIGFzIGJlbG9uZ2luZyB0byB0aGUgdm9jYWJ1bGFyeSBvZiB0aGUgWE1MIFNjaGVtYSBsYW5ndWFnZSByYXRoZXIgdGhhbiB0aGUgdm9jYWJ1bGFyeSBvZiB0aGUgc2NoZW1hIGF1dGhvci4KLQotCQkJPGI+Tm90ZTo8L2I+IFRoaXMgcHJlZml4IHdpbGwgbm90IGFwcGVhciBpbiBhbnkgc2NoZW1hcyB0aGF0IGN1cnJlbnRseSBleGlzdCAtIGl0IHdpbGwgb25seSBhcHBlYXIgaW4gbmV3IHNjaGVtYXMgeW91IGNyZWF0ZSBhZnRlciB5b3UgdHlwZSB0aGUgcHJlZml4IGFuZCBjbGljayA8Yj5BcHBseTwvYj4uIEFueSBzY2hlbWFzIHRoYXQgYWxyZWFkeSBleGlzdCB3aWxsIGhhdmUgdGhlIHByZWZpeCBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhcHBsaWVkIHRvIHRoZSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMuCi0KLQkJCVlvdSBjYW4gY2hhbmdlIHRoZSA8Yj5EZWZhdWx0IFRhcmdldCBOYW1lc3BhY2U8L2I+IHZhbHVlLiBUaGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoaXMgZmllbGQgd2lsbCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGZvciBhbnkgbmV3IFhNTCBzY2hlbWEgZmlsZXMgY3JlYXRlZC4KLQotCQk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMKLQkJCWhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmh0bWwiCi0JCQlsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZWNlcyIgLz4KLQk8L2NvbnRleHQ+Ci08L2NvbnRleHRzPgotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwY2U4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIEVkaXRvclhtbENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBFZGl0b3JYbWxDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBYTUxXaXphcmRDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgVGFibGVUcmVlLnhtbCxcCi0gICAgICAgICAgICAgICBXU0RMQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIFhTRENvbnRleHRzLnhtbAotICAgICAgICAgICAgICAgCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MjVmOTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgICA9IFhNTCBpbmZvcG9wcwotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZjRjNWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4xIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yWG1sQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvclhtbENvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJUYWJsZVRyZWUueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IlhNTFdpemFyZENvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJXU0RMQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSIvPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJYU0RDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC54c2QudWkiLz4KLQotPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzMjk4ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyXzEuMC4wLmphcgotYmFrCi10ZW1wCi1EaXRhTGluay5jYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzNhZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODllOWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLSAKLQotCVRoaXMgc2NyaXB0IGJ1aWxkIHRoZSBIZWxwIHBsdWctaW4gYnkgdHJhbnNmb3JtaW5nIHRoZSBESVRBIHNvdXJjZSBmaWxlcyBpbnRvIEhUTUwuCi0JCi0JVG8gdXNlIHRoaXMgc2NyaXB0LCB5b3UgbXVzdCBpbnN0YWxsIERJVEEtT1Qgb24geW91ciBtYWNoaW5lIGluIHRoZSBkaXJlY3RvcnkKLQlkZWZpbmVkIGJ5IHRoZSBkaXRhLm90LmRpciBwcm9wZXJ0eS4KLQkKLQlSdW4gdGhlIGRlZmF1bHQgdGFyZ2V0IGFmdGVyIHlvdSBlZGl0IHRoZSBESVRBIHNvdXJjZSBmaWxlcyB0byByZWdlbmVyYXRlIHRoZSBIVE1MLgotCQotCVRvIGN1c3RvbWl6ZSB0aGlzIHNjcmlwdCBmb3Igb3RoZXIgSGVscCBwbHVnLWlucywgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJncy5pbnB1dCBwcm9wZXJ0eQotCXRvIGJlIHRoZSBESVRBIG1hcCBmaWxlIGZvciB0aGUgcGx1Zy1pbi4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgbGlua3MgdG8gc2libGluZyBIZWxwIHBsdWctaW5zIGhhdmUgc2NvcGU9InBlZXIiLCBvdGhlcndpc2UgdGhlCi0Jb3V0cHV0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBzaGlmdGVkIGluY29ycmVjdGx5LgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCB5b3UgaGFuZCBjb2RlIHlvdXIgcGx1Z2luLnhtbCBmaWxlIGluIG15cGx1Z2luLnhtbC4gVGhpcyBmaWxlCi0Jd2lsbCBiZSBjb3BpZWQgb3ZlciB0aGUgZ2VuZXJhdGVkIHBsdWdpbi54bWwgd2hpY2ggaXMgY3VycmVudGx5IG5vdCBiZWluZyBnZW5lcmF0ZWQgY29ycmVjdGx5Ci0JYnkgRElUQS1PVC4KLQkKLQlDaGFuZ2VMb2c6Ci0JMjAwNi0wNC0wNSBBcnRodXIgUnltYW4gPHJ5bWFuQGNhLmlibS5jb20+Ci0JLSBDcmVhdGVkLgotCTIwMDgtMDEtMDkgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIGZvciBuZXcgRElUQS1PVCB2ZXJzaW9uCi0JMjAwOC0wNS0wNSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgdG8gYWRkIGdlbmVyYXRpb24gb2YgcHJlLWJ1aWx0IGhlbHAgaW5kZXguIAotCS0gTXVzdCBkZWxldGUgL2luZGV4IGZvbGRlciBiZWZvcmUgcnVubmluZyBidWlsZAotLS0+Ci08cHJvamVjdCBuYW1lPSJlY2xpcHNlaGVscCIgZGVmYXVsdD0iYWxsIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLm90LmRpciIgbG9jYXRpb249IkM6L0RJVEEtT1QxLjIuMiIgLz4KLQotCTxwYXRoIGlkPSJkb3N0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1saWIke2ZpbGUuc2VwYXJhdG9yfWRvc3QuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIG5hbWU9ImludGVncmF0ZSIgY2xhc3NuYW1lPSJvcmcuZGl0YS5kb3N0LnBsYXRmb3JtLkludGVncmF0b3JUYXNrIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iZG9zdC5jbGFzcy5wYXRoIiAvPgotCTwvdGFza2RlZj4KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iaW50ZWdyYXRlLCBlY2xpcHNlaGVscCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnRlZ3JhdGUiPgotCQk8aW50ZWdyYXRlIGRpdGFkaXI9IiR7ZGl0YS5vdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSByZXZpc2UgYmVsb3cgaGVyZSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImVjbGlwc2VoZWxwIj4KLQkJPGFudCBhbnRmaWxlPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9Y29uZHVjdG9yLnhtbCIgdGFyZ2V0PSJpbml0IiBkaXI9IiR7ZGl0YS5vdC5kaXJ9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNvcHljc3MiIHZhbHVlPSJubyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNzc3BhdGgiIHZhbHVlPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnByb3ZpZGVyIiB2YWx1ZT0iRWNsaXBzZS5vcmciIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnZlcnNpb24iIHZhbHVlPSIzLjMuMCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmlucHV0IiBsb2NhdGlvbj0iWE1MQnVpbGRlcm1hcF90b2MuZGl0YW1hcCIgLz4gICAgCQkKLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGVhbi50ZW1wIiB2YWx1ZT0idHJ1ZSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLmV4dG5hbWUiIHZhbHVlPSIuZGl0YSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLnRlbXAuZGlyIiBsb2NhdGlvbj0idGVtcCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZGlyIiBsb2NhdGlvbj0iIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InRyYW5zdHlwZSIgdmFsdWU9ImVjbGlwc2VoZWxwIiAvPgotCQk8L2FudD4KLQkJPGNvcHkgZmlsZT0ibXlwbHVnaW4ueG1sIiB0b2ZpbGU9InBsdWdpbi54bWwiIG92ZXJ3cml0ZT0ieWVzIiAvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYnVpbGQuaW5kZXgiIGRlc2NyaXB0aW9uPSJCdWlsZHMgc2VhcmNoIGluZGV4IGZvciB0aGUgcGx1Zy1pbiIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JICAgICA8aGVscC5idWlsZEhlbHBJbmRleCBtYW5pZmVzdD0icGx1Z2luLnhtbCIgZGVzdGluYXRpb249Ii4iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU0ZWZmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNTAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmMzJkNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGNvbGxlY3Rpb24tdHlwZT0ic2VxdWVuY2UiIGlkPSJ4bWxlZGl0b3Jkb2N1bWVudGF0aW9uIiB0aXRsZT0iRGV2ZWxvcGluZyBYTUwgZmlsZXMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dvcmtYTUwuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgZmlsZXMiPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N3b3JrWE1MIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3JlYXR4bS5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgWE1MIGZpbGVzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jY3JlYXR4bSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXR4bWwuZGl0YSIgaWQ9InhtbGNyZXR4bWwiIG5hdnRpdGxlPSJDcmVhdGluZyBlbXB0eSBYTUwgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGNyZXR4bWwiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGNyZXhkdGQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4eHNkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RjcmV4eHNkIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhIiBuYXZ0aXRsZT0iTGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvciINCi10b2M9Im5vIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3JsaW1pdGF0aW9uc19zbHVzaFhNTCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIGZpbGVzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eGVkdHRhZyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N3eG1sZWR0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eHByZWZzLmRpdGEiIG5hdnRpdGxlPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eHByZWZzIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dGFnaGlsdC5kaXRhIiBpZD0idGFnaGlsdCIgbmF2dGl0bGU9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHRhZ2hpbHQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRlbmMuZGl0YSIgbmF2dGl0bGU9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0ZW5jIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sZW5jLmRpdGEiIG5hdnRpdGxlPSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N4bWxlbmMiLz48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0LmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90c3Vnc3RyYXQiLz48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBpZD0idHhlZHRkZXMiIGxpbmtpbmc9Im5vbmUiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhlZHRkZXMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRkb2MuZGl0YSIgaWQ9InRlZHRkb2MiIG5hdnRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRkb2MiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2guZGl0YSIgaWQ9InRlZHRzY2giIG5hdnRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0c2NoIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJvYy5kaXRhIiBpZD0idGVkdHByb2MiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0cHJvYyIvPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHNyYy5kaXRhIiBpZD0idHhlZHNyYyIgbGlua2luZz0ibm9uZSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eGVkdHNyYyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5kaXRhIiBuYXZ0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3Y2Rhc3QiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3bWFjcm8uZGl0YSIgaWQ9InR3bWFjcm8iIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90d21hY3JvIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRjbnN0LmRpdGEiIGlkPSJ0ZWR0Y250IiBuYXZ0aXRsZT0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRjbnN0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eHNpdHlwLmRpdGEiIG5hdnRpdGxlPSJVc2luZyB4c2k6dHlwZSI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eHNpdHlwIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yZXh0Y3RuLmRpdGEiIGlkPSJyZXh0Y3RuIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF9yZXh0Y3RuIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3eHZhbGlkLmRpdGEiIGlkPSJ4bWx2YWxpZCIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3eHZhbGlkIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIGxpbmtpbmc9Im5vbmUiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3htbGNhdCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5kaXRhIiBpZD0idHhtbGNhdCIgbmF2dGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eG1sY2F0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5kaXRhIiBpZD0idGVkdGdyYW0iIG5hdnRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3J4bWxjYXRrZXkuZGl0YSIgaWQ9InJ4bWxjYXRrZXkiIG5hdnRpdGxlPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfcnhtbGNhdGtleSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnhtbHRvb2xza2V5LmRpdGEiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0cyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0Z3JhbSIvPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yeG1sYmljb25zLmRpdGEiIGlkPSJyaWNvbnMiIG5hdnRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3J4bWxiaWNvbnMiLz48L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjljODA5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJEZXZlbG9waW5nIFhNTCBmaWxlcyIgdG9waWM9InRvcGljcy9jd29ya1hNTC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL2N3b3JrWE1MLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3dvcmtYTUwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvY2NyZWF0eG0uaHRtbCI+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jY3JlYXR4bSIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90Y3JldHhtbC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90Y3JldHhtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIGhyZWY9InRvcGljcy90Y3JleGR0ZC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90Y3JleGR0ZCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGNyZXh4c2QiLz4KLTwvdG9waWM+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9ybGltaXRhdGlvbnNfc2x1c2hYTUwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sIj4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R4ZWR0dGFnIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIj4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N3eG1sZWR0Ii8+Ci08dG9waWMgbGFiZWw9IkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90eHByZWZzLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhwcmVmcyIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBocmVmPSJ0b3BpY3MvdHRhZ2hpbHQuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHRhZ2hpbHQiLz4KLTx0b3BpYyBsYWJlbD0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiIGhyZWY9InRvcGljcy90ZWR0ZW5jLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdGVuYyIvPgotPHRvcGljIGxhYmVsPSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIiBocmVmPSJ0b3BpY3MvY3htbGVuYy5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jeG1sZW5jIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL3RzdWdzdHJhdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90c3Vnc3RyYXQiLz4KLTwvdG9waWM+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhlZHRkZXMiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdGRvYyIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdHNjaCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRwcm9jIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhlZHRzcmMiLz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90d2NkYXN0Ii8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90d21hY3JvIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0Y25zdCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyB4c2k6dHlwZSIgaHJlZj0idG9waWNzL3R4c2l0eXAuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhzaXR5cCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzIiBocmVmPSJ0b3BpY3MvcmV4dGN0bi5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9yZXh0Y3RuIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R3eHZhbGlkLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3eHZhbGlkIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIj4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N4bWxjYXQiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eG1sY2F0Ii8+Ci08dG9waWMgbGFiZWw9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3J4bWxjYXRrZXkiLz4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGVkaXRvciBhbmQgWE1MIHRvb2xzIGtleWJvYXJkIHNob3J0Y3V0cyIgaHJlZj0idG9waWNzL3J4bWx0b29sc2tleS5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0Z3JhbSIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfcnhtbGJpY29ucyIvPgotPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWJhMDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCBpZD0ieG1sZWRpdG9ycmVsdGFibGUiPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV0eG1sLmRpdGEiIGlkPSJ4bWxjcmV0eG1sIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuZGl0YSIgbmF2dGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyI+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+DQotPC90b3BpY2dyb3VwPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwYWI1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcnJlbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIHRvcGljPSJ0b3BpY3MvdGNyZXR4bWwuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3RjcmV0eG1sLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL2N3eG1sZWR0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIiBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIiBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciIGhyZWY9InRvcGljcy90eG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgbmFtZXNwYWNlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIG5hbWVzcGFjZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBocmVmPSJ0b3BpY3MvdHRhZ2hpbHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9yeG1sYmljb25zLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1MWQ1NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IFhNTEJ1aWxkZXJtYXBfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qLmh0bSosXAotICAgICAgICAgICAgICAgaW5kZXgvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0JCSAgICAgICAqLm1hcGxpc3QsXAotICAgICAgICAgICAgICAgKi5kaXRhbWFwLFwKLQkJICAgICAgIHRvcGljcy8qLmRpdGEKLWJpbi5leGNsdWRlcyA9IERvY0J1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBteVBsdWdpbioueG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA4NzJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY2RhdGFzZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMGRlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NvbW1lbnRfb2JqLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29tbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyY2NiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29tbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9kb2N0eXBlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZG9jdHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDBmODIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9kb2N0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZXhwYW5kX2FsbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJjMTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZXhwYW5kX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hdHRyaWIuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uYXR0cmliLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhOTk3NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hdHRyaWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uZWxlbS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhYmRkYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbGVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbnJzdHJ2YWwuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ucnN0cnZhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDJiOGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ucnN0cnZhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3Byb2luc3Rfb2JqLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDQzNmQ4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ybGRncm1yLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcmxkZ3Jtci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWNhYzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ybGRncm1yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvc3VnZ2VzdGlvbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3N1Z2dlc3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGVhODQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvc3VnZ2VzdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvX3cuY2ZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L193LmNmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyODg5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvX3cuY2ZzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2Y0NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTUyY2NmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNUdWUgTWF5IDIwIDExOjEzOjA1IEVEVCAyMDA4DQotb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcj1vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyXG4xLjAuNDAwLnF1YWxpZmllcg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwOWQ0ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNUdWUgTWF5IDIwIDExOjEzOjA1IEVEVCAyMDA4DQotbHVjZW5lPTEuOS4xLnYyMDA4MDMwNjE4MTENCi1hbmFseXplcj1vcmcuZWNsaXBzZS5oZWxwLmJhc2VcIzMuMy4xMDAudjIwMDgwNDI1P2xvY2FsZVw9ZW4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyMGRlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1R1ZSBNYXkgMjAgMTE6MTM6MDUgRURUIDIwMDgNCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5odG1sPTANCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTY5MmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNWZhZmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJYTUxCdWlsZGVybWFwX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gICAgICAKLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4gICAgIAotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLmx1Y2VuZVNlYXJjaFBhcnRpY2lwYW50cyI+Ci0gICAgICA8YmluZGluZyBwYXJ0aWNpcGFudElkPSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UueGh0bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIubWFwbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjM2UyNDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIubWFwbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPG1hcGxpc3QgdmVyc2lvbj0iMy42LjIiPg0KLSAgPG5hdj4NCi0gICAgPG1hcCBmaWxlPSJYTUxCdWlsZGVybWFwX3RvYy5kaXRhbWFwIi8+DQotICA8L25hdj4NCi0gIDxsaW5rPg0KLSAgICA8bWFwIGZpbGU9IlhNTEJ1aWxkZXJyZWwuZGl0YW1hcCIvPg0KLSAgPC9saW5rPg0KLTwvbWFwbGlzdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjE4YmEwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV0eG1sLmh0bWwjdGNyZXR4bWwiIHRpdGxlPSJDcmVhdGluZyBYTUwgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGZyb20gRFREcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwjdGNyZXhkdGQiIHRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGZyb20gWE1MIHNjaGVtYXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sI3RjcmV4eHNkIiB0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNjaGVtYXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sI3RjcmV4eHNkIiB0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sI3R4ZWR0dGFnIiB0aXRsZT0iRWRpdGluZyBYTUwgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRlbmMuaHRtbCN0ZWR0ZW5jIiB0aXRsZT0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJuYW1lc3BhY2UgaW5mb3JtYXRpb24iPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwjdGVkdHNjaCIgdGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIiB0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0IiB0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sI3R3bWFjcm8iIHRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgd2l0aCBjb25zdHJhaW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwjdGVkdGNuc3QiIHRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2YWxpZGF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuaHRtbCN0d3h2YWxpZCIgdGl0bGU9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYXNzb2NpYXRpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sI2N4bWxjYXQiIHRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InVwZGF0aW5nIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCN0ZWR0Z3JhbSIgdGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkRURHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIFhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwjdGNyZXhkdGQiIHRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2NoZW1hcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgWE1MIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCN0Y3JleHhzZCIgdGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwjdHhlZHR0YWciIHRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCNjd3htbGVkdCIgdGl0bGU9IlhNTCBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4cHJlZnMuaHRtbCN0eHByZWZzIiB0aXRsZT0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90dGFnaGlsdC5odG1sI3R0YWdoaWx0IiB0aXRsZT0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0Lmh0bWwjeG1sc291cmNlc3VnZ2VzdGlvbnN0cmF0ZWd5IiB0aXRsZT0iU2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJEZXNpZ24gdmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwjdHhlZHRkZXMiIHRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sI3RlZHRkb2MiIHRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibmFtZXNwYWNlIGluZm9ybWF0aW9uIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sI3RlZHRzY2giIHRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCN0ZWR0cHJvYyIgdGl0bGU9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iU291cmNlIHZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sI3R4ZWR0c3JjIiB0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0IiB0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyB3aXRoIGNvbnN0cmFpbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCN0ZWR0Y25zdCIgdGl0bGU9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InVwZGF0aW5nIFhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwjdGVkdGdyYW0iIHRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFjY2Vzc2liaWxpdHkiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwjeG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB0aXRsZT0iWE1MIENhdGFsb2cga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ia2V5Ym9hcmQgc2hvcnRjdXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhtbGNhdGtleS5odG1sI3htbGNhdGFsb2drZXlib2FyZHNob3J0Y3V0cyIgdGl0bGU9IlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imljb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhtbGJpY29ucy5odG1sI3JpY29ucyIgdGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icHJlZmVyZW5jZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhwcmVmcy5odG1sI3R4cHJlZnMiIHRpdGxlPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImxpbmUgZGVsaW1pdGVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRlbmMuaHRtbCN0ZWR0ZW5jIiB0aXRsZT0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY2hhcmFjdGVyIGVuY29kaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic3VwcG9ydGVkIGNoYXJhY3RlciBzZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbGVuYy5odG1sI2N4bWxlbmMiIHRpdGxlPSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCN0ZWR0ZG9jIiB0aXRsZT0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0ZW1wbGF0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJ3b3JraW5nIHdpdGggcHJlZGVmaW5lZCBYTUwgY29kZSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCN0d21hY3JvIiB0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIGNhdGFsb2ciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCNjeG1sY2F0IiB0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgZW50cmllcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCN0eG1sY2F0IiB0aXRsZT0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImFjY2Vzc2liaWxpdHkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJrZXlib2FyZCBzaG9ydGN1dHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3J4bWxjYXRrZXkuaHRtbCN4bWxjYXRhbG9na2V5Ym9hcmRzaG9ydGN1dHMiIHRpdGxlPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImtleWJvYXJkIHNob3J0Y3V0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwjeG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB0aXRsZT0iWE1MIENhdGFsb2cga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNob3J0Y3V0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImtleWJvYXJkIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwjeG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB0aXRsZT0iWE1MIENhdGFsb2cga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlZDFlZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgICA9IFhNTCBlZGl0b3IKLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNWZhZmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgIDx0b2MgZmlsZT0iWE1MQnVpbGRlcm1hcF90b2MueG1sIi8+Ci0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICAgICAgCi08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0gICAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+ICAgICAKLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5sdWNlbmVTZWFyY2hQYXJ0aWNpcGFudHMiPgotICAgICAgPGJpbmRpbmcgcGFydGljaXBhbnRJZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLnhodG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxOTA0OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NjcmVhdHhtLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTw/UHViIEluYz8+DQotPGNvbmNlcHQgaWQ9ImNyZWF0aW5neG1sZmlsZXMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgWE1MIGZpbGVzOjwvc2hvcnRkZXNjPg0KLTxjb25ib2R5PjwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua2xpc3Q+DQotPGxpbmsgaHJlZj0idGNyZXR4bWwuZGl0YSI+PGxpbmt0ZXh0PkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRjcmV4ZHRkLmRpdGEiPjxsaW5rdGV4dD5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIGEgRFREczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRjcmV4eHNkLmRpdGEiPjxsaW5rdGV4dD5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTA0KLXNjaGVtYXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtsaXN0Pg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDA3MTg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0OTA1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NjcmVhdHhtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBYTUwgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczoiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczoiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV0eG1sLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV4ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3JlYXRpbmd4bWxmaWxlcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRpbmd4bWxmaWxlcyI+PGEgbmFtZT0iY3JlYXRpbmd4bWxmaWxlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgWE1MIGZpbGVzPC9oMT4KLQotCi08ZGl2PjxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBYTUwgZmlsZXM6PC9wPgotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9InRjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MIGVkaXRvci4gWW91IGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIj5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRjcmV4ZHRkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gYSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0Y3JleHhzZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MCi1zY2hlbWFzPC9hPjwvZGl2PjwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NzVkYTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hNTC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya3htbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya3htbC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmZhM2UxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmt4bWwuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiIgICJjb25jZXB0LmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08Y29uY2VwdCBpZD0id29ya2luZ3dpdGh4bWxmaWxlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V29ya2luZyB3aXRoIFhNTCBmaWxlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3Nob3J0ZGVzYz4NCi08Y29uYm9keT48L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtsaXN0Pg0KLTxsaW5rIGhyZWY9ImNjcmVhdHhtLmRpdGEiPjxsaW5rdGV4dD5DcmVhdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0eGVkdHRhZy5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0d3h2YWxpZC5kaXRhIj48bGlua3RleHQ+VmFsaWRhdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJjeG1sY2F0LmRpdGEiPjxsaW5rdGV4dD5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwNCi1zY2hlbWE8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJyeG1sYmljb25zLmRpdGEiPjxsaW5rdGV4dD5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9saW5rdGV4dD4NCi08L2xpbms+DQotPC9saW5rbGlzdD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAwODcxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NGI2MDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd3htbGVkdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd3htbGVkdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+WE1MIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5Zb3UgY2FuIHVzZSBpdCB0byBwZXJmb3JtIGEgdmFyaWV0eSBvZiB0YXNrcyBzdWNoIGFzOjwvcD4NCi08dWw+DQotPGxpPkNyZWF0aW5nIG5ldywgZW1wdHkgWE1MIGZpbGVzIG9yIGdlbmVyYXRpbmcgdGhlbSBmcm9tIGV4aXN0aW5nIERURHMgb3INCi1leGlzdGluZyBYTUwgc2NoZW1hczwvbGk+DQotPGxpPkVkaXRpbmcgWE1MIGZpbGVzPC9saT4NCi08bGk+SW1wb3J0aW5nIGV4aXN0aW5nIFhNTCBmaWxlcyBmb3Igc3RydWN0dXJlZCB2aWV3aW5nPC9saT4NCi08bGk+QXNzb2NpYXRpbmcgWE1MIGZpbGVzIHdpdGggRFREcyBvciBYTUwgc2NoZW1hczwvbGk+DQotPC91bD4NCi08cD5UaGUgWE1MIGVkaXRvciBoYXMgdHdvIG1haW4gdmlld3MgLSB0aGUgU291cmNlIHZpZXcgYW5kIHRoZSBEZXNpZ24gdmlldy4NCi1Zb3UgY2FuIGFsc28gdXNlIHRoZSBPdXRsaW5lIHZpZXcgdG8gaW5zZXJ0IGFuZCBkZWxldGUgZWxlbWVudHMuPC9wPg0KLTxzZWN0aW9uPjx0aXRsZT5Tb3VyY2UgdmlldzwvdGl0bGU+PHA+VGhlIFNvdXJjZSB2aWV3IGVuYWJsZXMgeW91IHRvIHZpZXcNCi1hbmQgd29yayBkaXJlY3RseSB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlLiBNYW55IG9mIHRoZSBYTUwgZWRpdGluZyBmZWF0dXJlcw0KLWluIHRoZSBYTUwgZWRpdG9yIFNvdXJjZSB2aWV3IGFyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhvc2UgYXZhaWxhYmxlIGluIHRoZSBTb3VyY2UNCi12aWV3IG9mIFBhZ2UgRGVzaWduZXIuPC9wPjxwPlRoZSBTb3VyY2UgdmlldyBoYXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsDQotc3VjaCBhczogPHVsPg0KLTxsaT4gU3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8vcmVkbywgYW5kIHVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMuPC9saT4NCi08bGk+IENvbnRlbnQgYXNzaXN0LCB3aGljaCB1c2VzIHRoZSBpbmZvcm1hdGlvbiBpbiBhIERURCBvciBzY2hlbWEgY29udGVudA0KLW1vZGVsIHRvIHByb3ZpZGUgYSBsaXN0IG9mIGFjY2VwdGFibGUgY29udGludWF0aW9ucyBkZXBlbmRpbmcgb24gd2hlcmUgdGhlDQotY3Vyc29yIGlzIGxvY2F0ZWQgaW4gYW4gWE1MIGZpbGUsIG9yIHdoYXQgaGFzIGp1c3QgYmVlbiB0eXBlZC48L2xpPg0KLTxsaT4iU21hcnQiIGRvdWJsZS1jbGlja2luZyBiZWhhdmlvci4gSWYgeW91ciBjdXJzb3IgaXMgcGxhY2VkIGluIGFuIGF0dHJpYnV0ZQ0KLXZhbHVlLCBvbmUgZG91YmxlLWNsaWNrIHNlbGVjdHMgdGhhdCB2YWx1ZSwgYW5vdGhlciBkb3VibGUgY2xpY2sgc2VsZWN0cyB0aGUNCi1hdHRyaWJ1dGUtdmFsdWUgcGFpciwgYW5kIGEgdGhpcmQgZG91YmxlLWNsaWNrIHNlbGVjdHMgdGhlIGVudGlyZSB0YWcuIFRoaXMNCi1tYWtlcyBpdCBlYXNpZXIgdG8gY29weSBhbmQgcGFzdGUgY29tbW9ubHkgdXNlZCBwaWVjZXMgb2YgWE1MLjwvbGk+DQotPC91bD48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5EZXNpZ24gdmlldzwvdGl0bGU+PHA+VGhlIFhNTCBlZGl0b3IgYWxzbyBoYXMgYSBEZXNpZ24gdmlldy4NCi1UaGlzIHZpZXcgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6PHVsPg0KLTxsaT5UaGUgWE1MIGZpbGUgaXMgcmVwcmVzZW50ZWQgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzDQotaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci48L2xpPg0KLTxsaT5Db250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLA0KLXdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBub2RlcyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3INCi10aGF0IGxvY2F0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSA8dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPiBtZW51IGl0ZW0NCi13aWxsIGxpc3Qgb25seSB0aG9zZSBlbGVtZW50cyBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgd2hpY2ggd291bGQgYmUgdmFsaWQNCi1jaGlsZHJlbiBhdCB0aGF0IHBvaW50IChhcyBsb25nIGFzIGdyYW1tYXIgY29uc3RyYWludHMgYXJlIG9uKS48L2xpPg0KLTwvdWw+PC9wPjxwPlRoZSBEZXNpZ24gdmlldyBpcyBlc3BlY2lhbGx5IGhlbHBmdWwgaWYgeW91IGFyZSBuZXcgdG8gWE1MLCBvcg0KLW5lZWQgdG8gZG8gZm9ybS1vcmllbnRlZCBlZGl0aW5nLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSB0aGUgQ3JlYXRlIFhNTA0KLUZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBhIHRlbXBsYXRlIFhNTCBmaWxlIGZvciBhIGpvYiBkZXNjcmlwdGlvbiBmb3JtIGZyb20NCi1hIGpvYiBkZXNjcmlwdGlvbiBEVEQuIEFmdGVyIHRob3NlIHN0ZXBzIGFyZSBjb21wbGV0ZWQsIHlvdSB3b3VsZCBvbmx5IGhhdmUNCi10byBmaWxsIGluIHRoZSBmb3JtIGRhdGEgdXNpbmcgdGhlIERlc2lnbiB2aWV3LjwvcD48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNzNhODMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd3htbGVkdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0Y3JldHhtbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0Y3JleGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0Y3JleHhzZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InR3eHZhbGlkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3d4bWxlZHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgZWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd3htbGVkdCI+PGEgbmFtZT0iY3d4bWxlZHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlhNTCBlZGl0b3I8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLjwvcD4KLQotPHA+WW91IGNhbiB1c2UgaXQgdG8gcGVyZm9ybSBhIHZhcmlldHkgb2YgdGFza3Mgc3VjaCBhczo8L3A+Ci0KLTx1bD4KLTxsaT5DcmVhdGluZyBuZXcsIGVtcHR5IFhNTCBmaWxlcyBvciBnZW5lcmF0aW5nIHRoZW0gZnJvbSBleGlzdGluZyBEVERzIG9yCi1leGlzdGluZyBYTUwgc2NoZW1hczwvbGk+Ci0KLTxsaT5FZGl0aW5nIFhNTCBmaWxlczwvbGk+Ci0KLTxsaT5JbXBvcnRpbmcgZXhpc3RpbmcgWE1MIGZpbGVzIGZvciBzdHJ1Y3R1cmVkIHZpZXdpbmc8L2xpPgotCi08bGk+QXNzb2NpYXRpbmcgWE1MIGZpbGVzIHdpdGggRFREcyBvciBYTUwgc2NoZW1hczwvbGk+Ci0KLTwvdWw+Ci0KLTxwPlRoZSBYTUwgZWRpdG9yIGhhcyB0d28gbWFpbiB2aWV3cyAtIHRoZSBTb3VyY2UgdmlldyBhbmQgdGhlIERlc2lnbiB2aWV3LgotWW91IGNhbiBhbHNvIHVzZSB0aGUgT3V0bGluZSB2aWV3IHRvIGluc2VydCBhbmQgZGVsZXRlIGVsZW1lbnRzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNvdXJjZSB2aWV3PC9oND48cD5UaGUgU291cmNlIHZpZXcgZW5hYmxlcyB5b3UgdG8gdmlldwotYW5kIHdvcmsgZGlyZWN0bHkgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZS4gTWFueSBvZiB0aGUgWE1MIGVkaXRpbmcgZmVhdHVyZXMKLWluIHRoZSBYTUwgZWRpdG9yIFNvdXJjZSB2aWV3IGFyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhvc2UgYXZhaWxhYmxlIGluIHRoZSBTb3VyY2UKLXZpZXcgb2YgUGFnZSBEZXNpZ25lci48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgU291cmNlIHZpZXcgaGFzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLAotc3VjaCBhczogPHVsPgotPGxpPiBTeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kby9yZWRvLCBhbmQgdXNlci1kZWZpbmVkIHRlbXBsYXRlcy48L2xpPgotCi08bGk+IENvbnRlbnQgYXNzaXN0LCB3aGljaCB1c2VzIHRoZSBpbmZvcm1hdGlvbiBpbiBhIERURCBvciBzY2hlbWEgY29udGVudAotbW9kZWwgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBjb250aW51YXRpb25zIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUKLWN1cnNvciBpcyBsb2NhdGVkIGluIGFuIFhNTCBmaWxlLCBvciB3aGF0IGhhcyBqdXN0IGJlZW4gdHlwZWQuPC9saT4KLQotPGxpPiJTbWFydCIgZG91YmxlLWNsaWNraW5nIGJlaGF2aW9yLiBJZiB5b3VyIGN1cnNvciBpcyBwbGFjZWQgaW4gYW4gYXR0cmlidXRlCi12YWx1ZSwgb25lIGRvdWJsZS1jbGljayBzZWxlY3RzIHRoYXQgdmFsdWUsIGFub3RoZXIgZG91YmxlIGNsaWNrIHNlbGVjdHMgdGhlCi1hdHRyaWJ1dGUtdmFsdWUgcGFpciwgYW5kIGEgdGhpcmQgZG91YmxlLWNsaWNrIHNlbGVjdHMgdGhlIGVudGlyZSB0YWcuIFRoaXMKLW1ha2VzIGl0IGVhc2llciB0byBjb3B5IGFuZCBwYXN0ZSBjb21tb25seSB1c2VkIHBpZWNlcyBvZiBYTUwuPC9saT4KLQotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5EZXNpZ24gdmlldzwvaDQ+PGRpdiBjbGFzcz0icCI+VGhlIFhNTCBlZGl0b3IgYWxzbyBoYXMgYSBEZXNpZ24gdmlldy4KLVRoaXMgdmlldyBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczo8dWw+Ci08bGk+VGhlIFhNTCBmaWxlIGlzIHJlcHJlc2VudGVkIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcwotaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci48L2xpPgotCi08bGk+Q29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywKLXdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBub2RlcyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IKLXRoYXQgbG9jYXRpb24uICBGb3IgZXhhbXBsZSwgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaGlsZDwvc3Bhbj4gbWVudSBpdGVtCi13aWxsIGxpc3Qgb25seSB0aG9zZSBlbGVtZW50cyBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgd2hpY2ggd291bGQgYmUgdmFsaWQKLWNoaWxkcmVuIGF0IHRoYXQgcG9pbnQgKGFzIGxvbmcgYXMgZ3JhbW1hciBjb25zdHJhaW50cyBhcmUgb24pLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTxwPlRoZSBEZXNpZ24gdmlldyBpcyBlc3BlY2lhbGx5IGhlbHBmdWwgaWYgeW91IGFyZSBuZXcgdG8gWE1MLCBvcgotbmVlZCB0byBkbyBmb3JtLW9yaWVudGVkIGVkaXRpbmcuIEZvciBleGFtcGxlLCB5b3UgY291bGQgdXNlIHRoZSBDcmVhdGUgWE1MCi1GaWxlIHdpemFyZCB0byBjcmVhdGUgYSB0ZW1wbGF0ZSBYTUwgZmlsZSBmb3IgYSBqb2IgZGVzY3JpcHRpb24gZm9ybSBmcm9tCi1hIGpvYiBkZXNjcmlwdGlvbiBEVEQuIEFmdGVyIHRob3NlIHN0ZXBzIGFyZSBjb21wbGV0ZWQsIHlvdSB3b3VsZCBvbmx5IGhhdmUKLXRvIGZpbGwgaW4gdGhlIGZvcm0gZGF0YSB1c2luZyB0aGUgRGVzaWduIHZpZXcuPC9wPgotPHAgLz4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImN4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0Y3JldHhtbC5odG1sIiB0aXRsZT0iWW91IGNhbiBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTCBlZGl0b3IuIFlvdSBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiI+Q3JlYXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0Y3JleGR0ZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBEVEQuIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRjcmV4eHNkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHhlZHR0YWcuaHRtbCIgdGl0bGU9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iPkVkaXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR3eHZhbGlkLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvIHNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuIj5WYWxpZGF0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVmYTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3htbGNhdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzDQotYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZA0KLWEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLA0KLWFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGNhdGFsb2c8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmFzc29jaWF0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIHRvIGFzc29jaWF0ZSBYTUwgZmlsZXMgd2l0aCBEVERzIG9yIFhNTCBzY2hlbWFzLjwvcD4NCi08b2w+DQotPGxpPkRpcmVjdCBhc3NvY2lhdGlvbiAtIFRoZSBYTUwgZmlsZSBjb250YWlucyBlaXRoZXIgdGhlIG5hbWUgb2YgYSBEVEQgaW4NCi1pdHMgZG9jdHlwZSBkZWNsYXJhdGlvbiAoZm9yIGV4YW1wbGUsICZsdDshRE9DVFlQRSByb290LWVsZW1lbnQgU1lTVEVNICI8dmFybmFtZT5kdGRmaWxlLmR0ZDwvdmFybmFtZT4iDQotPiwgd2hlcmUgPHZhcm5hbWU+ZHRkZmlsZS5kdGQ8L3Zhcm5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBEVEQgZmlsZSkgb3IgaXQNCi1jb250YWlucyB0aGUgcGF0aCBvZiBhbiBYTUwgc2NoZW1hIGluIHRoZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgb2YgdGhlDQotWE1MIGZpbGUgcm9vdCBlbGVtZW50IChmb3IgZXhhbXBsZSwgJmx0O3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tLzx2YXJuYW1lPnNjaGVtYS54c2Q8L3Zhcm5hbWU+Ij4sDQotd2hlcmUgIDx2YXJuYW1lPnNjaGVtYS54c2Q8L3Zhcm5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+DQotPGxpPlhNTCBDYXRhbG9nIGVudHJ5IC0gWW91IGNhbiByZWdpc3RlciBEVEQgYW5kIFhNTCBzY2hlbWEgZmlsZXMgaW4gdGhlIFhNTA0KLUNhdGFsb2cgYW5kIGFzc29jaWF0ZSB0aGVtIHdpdGggYSAgS2V5IHRoYXQgcmVwcmVzZW50cyB0aGVtLiBZb3UgY2FuIHRoZW4NCi1yZWZlciB0byBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUgS2V5IGZyb20gYW4gWE1MIGZpbGUgaW5zdGVhZCBvZiByZWZlcnJpbmcNCi1kaXJlY3RseSB0byB0aGUgRFREIG9yIFhNTCBzY2hlbWEgZmlsZS4gQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvDQotcGFydHMgLSB0aGUgS2V5ICh3aGljaCByZXByZXNlbnRzIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVVJJICh3aGljaA0KLWNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBsb2NhdGlvbikuPC9saT4NCi08L29sPg0KLTxzZWN0aW9uPjx0aXRsZT5Ib3cgYW4gYXNzb2NpYXRpb24gd29ya3M8L3RpdGxlPjxiPkFzc29jaWF0aW5nIGFuIFhNTCBmaWxlDQotd2l0aCBhIERURCA8L2I+PHA+SWYgYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFRELCBhIERPQ1RZUEUgdGFnIHN1Y2gNCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiB0aGUgWE1MIGZpbGU6PGNvZGVibG9jaz4mbHQ7IURPQ1RZUEUgcm9vdC1uYW1lIFBVQkxJQyAiPHZhcm5hbWU+SW52b2ljZUlkPC92YXJuYW1lPiIgIjx2YXJuYW1lPkM6XG15ZHRkc1xJbnZvaWNlLmR0ZDwvdmFybmFtZQ0KLT4iPg0KLTwvY29kZWJsb2NrPjwvcD48cD5JbnZvaWNlSWQgaXMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBEVEQgZmlsZS4gSXQNCi1pcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgWE1MIGZpbGUgd2l0aCBhIERURCBmaWxlIChpbiB0aGlzIGNhc2UsIHRoZSBEVEQgZmlsZQ0KLWlzIEludm9pY2UuZHRkKS4gSWYgdGhlIHB1YmxpYyBpZGVudGlmaWVyIEludm9pY2VJZCBjb3JyZXNwb25kcyB0byB0aGUgS2V5DQotb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IGZvciBJbnZvaWNlLmR0ZCwgdGhlbiB0aGUgVTw/UHViIENhcmV0Pz5SSSBvZiB0aGUNCi1YTUwgQ2F0YWxvZyBlbnRyeSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIEludm9pY2UuZHRkKQ0KLWlzIHVzZWQgdG8gbG9jYXRlIHRoZSBEVEQuIE90aGVyd2lzZSwgdGhlIERPQ1RZUEUncyBzeXN0ZW0gaWRlbnRpZmllciAoIkM6XG15ZHRkc1xJbnZvaWNlLmR0ZCIpLA0KLXdoaWNoIHJlZmVycyBkaXJlY3RseSB0byB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gb2YgdGhlIERURCwgaXMgdXNlZCB0byBsb2NhdGUNCi10aGUgRFRELjwvcD48bm90ZT5Zb3UgY2FuIGFsc28gdXNlIGEgc3lzdGVtIGlkZW50aWZpZXIgYXMgYSBLZXkgaW4gYW4gWE1MDQotQ2F0YWxvZyBlbnRyeS4gSWYgeW91IHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5LCBhIERPQ1RZUEUgdGFnIHN1Y2gNCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiBhbiBYTUwgZmlsZTo8L25vdGU+PGNvZGVibG9jaz4mbHQ7IURPQ1RZUEUgUm9vdC1uYW1lIFNZU1RFTSAiTXlEVEQuZHRkIj4gPC9jb2RlYmxvY2s+PHA+d2hlcmUNCi1NeURURC5kdGQgaXMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIEtleSBvZiBhbiBYTUwgQ2F0YWxvZw0KLWVudHJ5LjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PGI+QXNzb2NpYXRpbmcgYW4gWE1MIGZpbGUgd2l0aCBhbiBYTUwgc2NoZW1hPC9iPjxwPklmIGFuIFhNTCBmaWxlDQotaXMgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEsIG9uZSBvciBtb3JlIHNjaGVtYSBsb2NhdGlvbiBhdHRyaWJ1dGVzIGFyZQ0KLWluY2x1ZGVkIGluIHRoZSBYTUwgZmlsZS4gVGhlIGluZm9ybWF0aW9uIGluIHRoZSBzY2hlbWFMb2NhdGlvbiBpcyBwcm92aWRlZA0KLWFzIGEgImhpbnQiIHRvIHRoZSBYTUwgcHJvY2Vzc29yLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgc2NoZW1hTG9jYXRpb24NCi1hdHRyaWJ1dGVzOjwvcD48cD4gPGI+RXhhbXBsZSAxIDwvYj48Y29kZWJsb2NrPiZsdDtwdXJjaGFzZU9yZGVyIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iDQoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gQzpcbXlzY2hlbWFzXFB1cmNoYXNlT3JkZXIueHNkIj4NCi0mbHQ7c2hpcFRvIGNvdW50cnk9IlVTIj4NCi0uLi48L2NvZGVibG9jaz4gICAgPC9wPjxwPjxiPkV4YW1wbGUgMiA8L2I+PGNvZGVibG9jaz4mbHQ7cHVyY2hhc2VPcmRlciB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIg0KLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIFBPLnhzZCI+DQotJmx0O3NoaXBUbyBjb3VudHJ5PSJVUyI+DQotLi4uLjwvY29kZWJsb2NrPiAgPC9wPjxwPkluIEV4YW1wbGUgMSwgdGhlIHNjaGVtYUxvY2F0aW9uICdoaW50JyAoJ0M6XG15c2NoZW1hc1xQdXJjaGFzZU9yZGVyLnhzZCcpDQotcmVmZXJzIGRpcmVjdGx5IHRvIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBvciBVUkkgb2YgdGhlIFhNTCBzY2hlbWEuIEluIHRoaXMNCi1jYXNlLCB0aGUgc2NoZW1hIGZpbGUgd2lsbCBiZSBsb2NhdGVkIGJ5IHRoZSBYTUwgcHJvY2Vzc29yIGRpcmVjdGx5LjwvcD48cD5Jbg0KLUV4YW1wbGUgMiwgdGhlIHNjaGVtYUxvY2F0aW9uICdoaW50JyAoJ1BPLnhzZCcpIHJlZmVycyB0byBhbiBYTUwgQ2F0YWxvZyBlbnRyeS4NCi1QTy54c2QgY29ycmVzcG9uZHMgdG8gdGhlICA8dmFybmFtZT5LZXk8L3Zhcm5hbWU+IG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeQ0KLWZvciBQdXJjaGFzZU9yZGVyLnhzZCwgYW5kIHRoZSBVUkkgb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5ICh3aGljaCBjb250YWlucw0KLWluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiBQdXJjaGFzZU9yZGVyLnhzZCkgd2lsbCBiZSB1c2VkIHRvIGxvY2F0ZWQNCi10aGUgWE1MIHNjaGVtYS48L3A+PHA+SW4gYm90aCBleGFtcGxlcywgPGNvZGVwaD5odHRwOi8vd3d3LmlibS5jb208L2NvZGVwaD4gaW4NCi10aGUgPGNvZGVwaD54c2k6c2NoZW1hTG9jYXRpb248L2NvZGVwaD4gdGFnIGlzIGEgVVJJIHRoYXQgaWRlbnRpZmllcyB0aGUgbmFtZXNwYWNlDQotZm9yIHRoZSBYTUwgc2NoZW1hLjwvcD48cD5Zb3UgY2FuIGFsc28gdXNlIGEgbmFtZXNwYWNlIGFzIGEgS2V5IGZvciBhbiBYTUwNCi1DYXRhbG9nIGVudHJ5LiBJZiB5b3UgdXNlIGEgbmFtZXNwYWNlIGFzIGEgS2V5LCBhIHNjaGVtYUxvY2F0aW9uIHRhZyBzdWNoDQotYXMgdGhlIGZvbGxvd2luZyBvbmUgaXMgaW5jbHVkZWQgaW4gYW4gWE1MIGZpbGU6PGNvZGVibG9jaz4mbHQ7cHVyY2hhc2VPcmRlciB4bWxuczo9Ind3dy5pYm0uY29tIg0KLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHBvL3hzZC9QdXJjaGFzZU9yZGVyLnhzZCAiPjwvY29kZWJsb2NrPjwvcD48cD5UaGUNCi1zY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgcG9pbnRzIHRvIGJvdGggdGhlIEtleSBhbmQgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZg0KLXRoZSBzY2hlbWEuPC9wPjxwPjxiPkRURCBvciBYTUwgc2NoZW1hIHJlc2lkZXMgb24gYSByZW1vdGUgc2VydmVyPC9iPjwvcD48cD5TZXZlcmFsDQotZnVuY3Rpb25zIGluIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHZhbGlkYXRpb24gYW5kIGNvbnRlbnQgYXNzaXN0LCByZXF1aXJlDQotdGhlIGF2YWlsYWJpbGl0eSBvZiBhIERURCBvciBhbiBYTUwgc2NoZW1hLiBUaGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHByb3ZpZGVzDQotdXNhZ2UgaW5mb3JtYXRpb24gZm9yIGNhc2VzIHdoZW4gdGhlIERURCBvciBYTUwgc2NoZW1hIHJlc2lkZXMgb24geW91ciBsb2NhbA0KLW1hY2hpbmUuIEhvd2V2ZXIsIGluIG1hbnkgY2FzZXMsIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBjYW4gcmVzaWRlIG9uIGEgcmVtb3RlDQotc2VydmVyLCBmb3IgZXhhbXBsZTo8L3A+PHA+PGNvZGVwaD4mbHQ7IURPQ1RZUEUgQ2F0YWxvZyBQVUJMSUMgImFiYy9DYXRhbG9nIg0KLSJodHRwOi8veHl6LmFiYy5vcmcvZHRkcy9jYXRhbG9nLmR0ZCI+PC9jb2RlcGg+PC9wPjxwPk5vcm1hbGx5LCB0aGlzIGNhc2UNCi1wb3NlcyBubyBwcm9ibGVtLCBiZWNhdXNlIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlDQotcmVtb3RlIHNlcnZlci4gSG93ZXZlciwgaWYgeW91IGFyZSBiZWhpbmQgYSBmaXJld2FsbCwgYW5kIGRvIG5vdCBoYXZlIGEgU09DS1NpZmllZA0KLXN5c3RlbSwgdGhlIHdvcmtiZW5jaCBjdXJyZW50bHkgZG9lcyBub3QgcHJvdmlkZSBhIHdheSBmb3IgeW91IHRvIHNwZWNpZnkNCi1hIHNvY2tzIHNlcnZlciBmb3IgcmV0cmlldmluZyBhIERURCBvciBYTUwgc2NoZW1hLiBJZiB5b3UgYXJlIHVuYWJsZSB0byBTT0NLU2lmeQ0KLXlvdXIgc3lzdGVtLCB0aGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBwcm9ibGVtIGlzIHRvIHJldHJpZXZlIGEgY29weSBvZiB0aGUNCi1EVEQgb3IgWE1MIHNjaGVtYSAodXNpbmcgYSBXZWIgYnJvd3NlciwgZm9yIGV4YW1wbGUpIGFuZCBzYXZlIHRoYXQgY29weSBvbg0KLXlvdXIgbG9jYWwgbWFjaGluZS4gVGhlbiwgeW91IGNhbiBlaXRoZXIgcGxhY2UgYSBsb2NhbCBjb3B5IGluIHRoZSBzYW1lIHByb2plY3QNCi1hcyB5b3VyIFhNTCBmaWxlLCBvciB1c2UgdGhlIFhNTCBDYXRhbG9nIHRvIGFzc29jaWF0ZSBhIHB1YmxpYyBpZGVudGlmaWVyDQotd2l0aCB0aGUgRFREJ3MgKGxvY2FsKSBsb2NhdGlvbi48L3A+PG5vdGU+SWYgeW91IGhhdmUgYW4gWE1MIGZpbGUgYXNzb2NpYXRlZA0KLXdpdGggYW4gWE1MIHNjaGVtYSBvciBEVEQgdGhhdCBpcyBlbHNld2hlcmUgaW4gdGhlIG5ldHdvcmssIGFuZCB5b3UgYXJlIHdvcmtpbmcNCi1vbiBhIG1hY2hpbmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIG5ldHdvcmssIHlvdSBjYW4gZm9sbG93IHRoZSBzdGVwcyBkZXNjcmliZWQNCi1wcmV2aW91c2x5IGlmIHlvdSB3YW50IHRvIHVzZSBjb250ZW50IGFzc2lzdCBvciB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLiAgPC9ub3RlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+QWR2YW50YWdlcyBvZiBYTUwgQ2F0YWxvZyBlbnRyeSBhc3NvY2lhdGlvbnM8L3RpdGxlPjxwPklmDQoteW91IGNyZWF0ZSBhIGRpcmVjdCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFuIFhNTCBmaWxlIGFuZCBhbiBYTUwgc2NoZW1hIG9yIERURA0KLWZpbGUsIGFueSB0aW1lIHlvdSBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEgb3IgRFREIHlvdSBoYXZlIHRvIHRyYWNrDQotZG93biBhbmQgdXBkYXRlIGFsbCBvZiB0aGUgcmVmZXJlbmNpbmcgWE1MIGZpbGVzIHdpdGggdGhlIG5ldyBsb2NhdGlvbiBvZg0KLXRoZSBEVEQgb3Igc2NoZW1hLiBJZiwgaG93ZXZlciwgeW91IGFzc29jaWF0ZSBhbiBYTUwgZmlsZSB3aXRoIGFuIFhNTCBzY2hlbWENCi1vciBEVEQgS2V5LCB0aGVuLCB3aGVuIHlvdSBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEgb3IgRFRELCB5b3Ugb25seQ0KLWhhdmUgdG8gdXBkYXRlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSwgaW5zdGVhZCBvZiBlYWNoIGluZGl2aWR1YWwgWE1MIGZpbGUuPC9wPjxwPkZvcg0KLWV4YW1wbGUsIHlvdSBoYXZlIGEgRFREIGNhbGxlZCBCdWlsZGluZy5kdGQsIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCBmaXZlDQotWE1MIGZpbGVzIC0gT2ZmaWNlLnhtbCwgSG91c2UueG1sLCBBcGFydG1lbnQueG1sLCBCYW5rLnhtbCwgYW5kIFBvc3RPZmZpY2UueG1sLg0KLVlvdSBtb3ZlIHRoZSBEVEQgZmlsZSBCdWlsZGluZy5kdGQgdG8gYSBuZXcgbG9jYXRpb24uIElmIHlvdSBoYXZlIGEgZGlyZWN0aW9uDQotYXNzb2NpYXRpb24gYmV0d2VlbiBCdWlsZGluZy5kdGQgYW5kIGFsbCB0aGUgWE1MIGZpbGVzLCB5b3Ugd2lsbCBoYXZlIHRvIHVwZGF0ZQ0KLXRoZSAmbHQ7RE9DVFRZUEU+IGRlY2xhcmF0aW9uIGluIGVhY2ggWE1MIGZpbGUgdG8gcmVmbGVjdCB0aGUgbmV3IGxvY2F0aW9uDQotb2YgQnVpbGRpbmcuZHRkLiBJZiwgaG93ZXZlciwgeW91IGhhdmUgYW4gWE1MIENhdGFsb2cgYXNzb2NpYXRpb24sIGFuZCBhbGwNCi10aGUgWE1MIGZpbGVzIGp1c3QgcmVmZXIgdG8gdGhlIEtleSBvZiBCdWlsZGluZy5kdGQsIHRoZW4geW91IG9ubHkgaGF2ZSB0bw0KLXVwZGF0ZSB0aGUgVVJJIGFuZCBhbGwgdGhlIFhNTCBmaWxlcyB3aWxsIHBvaW50IHRvIHRoZSBuZXcgbG9jYXRpb24gb2YgQnVpbGRpbmcuZHRkLjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlVwZGF0aW5nIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZzwvdGl0bGU+PHA+QWZ0ZXIgeW91IGhhdmUNCi11cGRhdGVkIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZywgeW91IG1pZ2h0IG5lZWQgdG8gcmVmcmVzaCB0aGUgWE1MIGVkaXRvcg0KLXZpZXcgc28gdGhhdCBpdCB1c2VzIHRoZSBuZXcgaW5mb3JtYXRpb24uIFRvIGRvIHRoaXMsIGNsaWNrIHRoZSA8dWljb250cm9sPlJlbG9hZA0KLURlcGVuZGVuY2llczwvdWljb250cm9sPiB0b29sYmFyIGJ1dHRvbiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL3JsZGdybXIuZ2lmIj4NCi08YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgUmVsb2FkIERlcGVuZGVuY2llcyB0b29sYmFyIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IGFuZA0KLXRoZSB2aWV3IHdpbGwgYmUgdXBkYXRlZCB1c2luZyB0aGUgY3VycmVudCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gWW91IG9ubHkNCi1uZWVkIHRvIHJlZnJlc2ggdGhlIFhNTCBlZGl0b3IgdmlldyB3aGVuIHlvdSBoYXZlIGFuIFhNTCBmaWxlIG9wZW4gdGhhdCByZWZlcmVuY2VzDQotdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRoYXQgd2FzIHVwZGF0ZWQuPC9wPjxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlcg0KLXRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcD48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwODM1OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sY2F0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwYjhhMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBvdmVydmlldywgWE1MIGZpbGVzLCBhc3NvY2lhdGlvbnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgY2F0YWxvZywgb3ZlcnZpZXcsIFhNTCBmaWxlcywgYXNzb2NpYXRpb25zIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGVkdGRvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0ZWR0cHJvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjd3htbGVkdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN4bWxjYXQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3htbGNhdCI+PGEgbmFtZT0iY3htbGNhdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzCi1ib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkCi1hIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwKLWFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuPC9wPgotCi08cD5UaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIHRvIGFzc29jaWF0ZSBYTUwgZmlsZXMgd2l0aCBEVERzIG9yIFhNTCBzY2hlbWFzLjwvcD4KLQotPG9sPgotPGxpPkRpcmVjdCBhc3NvY2lhdGlvbiAtIFRoZSBYTUwgZmlsZSBjb250YWlucyBlaXRoZXIgdGhlIG5hbWUgb2YgYSBEVEQgaW4KLWl0cyBkb2N0eXBlIGRlY2xhcmF0aW9uIChmb3IgZXhhbXBsZSwgJmx0OyFET0NUWVBFIHJvb3QtZWxlbWVudCBTWVNURU0gIjx2YXIgY2xhc3M9InZhcm5hbWUiPmR0ZGZpbGUuZHRkPC92YXI+IgotJmd0Oywgd2hlcmUgPHZhciBjbGFzcz0idmFybmFtZSI+ZHRkZmlsZS5kdGQ8L3Zhcj4gaXMgdGhlIG5hbWUgb2YgdGhlIERURCBmaWxlKSBvciBpdAotY29udGFpbnMgdGhlIHBhdGggb2YgYW4gWE1MIHNjaGVtYSBpbiB0aGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIG9mIHRoZQotWE1MIGZpbGUgcm9vdCBlbGVtZW50IChmb3IgZXhhbXBsZSwgJmx0O3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tLzx2YXIgY2xhc3M9InZhcm5hbWUiPnNjaGVtYS54c2Q8L3Zhcj4iJmd0OywKLXdoZXJlICA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5zY2hlbWEueHNkPC92YXI+IGlzIHRoZSBuYW1lIG9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+Ci0KLTxsaT5YTUwgQ2F0YWxvZyBlbnRyeSAtIFlvdSBjYW4gcmVnaXN0ZXIgRFREIGFuZCBYTUwgc2NoZW1hIGZpbGVzIGluIHRoZSBYTUwKLUNhdGFsb2cgYW5kIGFzc29jaWF0ZSB0aGVtIHdpdGggYSAgS2V5IHRoYXQgcmVwcmVzZW50cyB0aGVtLiBZb3UgY2FuIHRoZW4KLXJlZmVyIHRvIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSBLZXkgZnJvbSBhbiBYTUwgZmlsZSBpbnN0ZWFkIG9mIHJlZmVycmluZwotZGlyZWN0bHkgdG8gdGhlIERURCBvciBYTUwgc2NoZW1hIGZpbGUuIEFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3bwotcGFydHMgLSB0aGUgS2V5ICh3aGljaCByZXByZXNlbnRzIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVVJJICh3aGljaAotY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIERURCBvciBYTUwgc2NoZW1hIGxvY2F0aW9uKS48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+SG93IGFuIGFzc29jaWF0aW9uIHdvcmtzPC9oND48c3Ryb25nPkFzc29jaWF0aW5nIGFuIFhNTCBmaWxlCi13aXRoIGEgRFREIDwvc3Ryb25nPjxkaXYgY2xhc3M9InAiPklmIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCwgYSBET0NUWVBFIHRhZyBzdWNoCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiB0aGUgWE1MIGZpbGU6PHByZT4mbHQ7IURPQ1RZUEUgcm9vdC1uYW1lIFBVQkxJQyAiPHZhciBjbGFzcz0idmFybmFtZSI+SW52b2ljZUlkPC92YXI+IiAiPHZhciBjbGFzcz0idmFybmFtZSI+QzpcbXlkdGRzXEludm9pY2UuZHRkPC92YXI+IiZndDsKLTwvcHJlPgotPC9kaXY+Ci08cD5JbnZvaWNlSWQgaXMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBEVEQgZmlsZS4gSXQKLWlzIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBYTUwgZmlsZSB3aXRoIGEgRFREIGZpbGUgKGluIHRoaXMgY2FzZSwgdGhlIERURCBmaWxlCi1pcyBJbnZvaWNlLmR0ZCkuIElmIHRoZSBwdWJsaWMgaWRlbnRpZmllciBJbnZvaWNlSWQgY29ycmVzcG9uZHMgdG8gdGhlIEtleQotb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IGZvciBJbnZvaWNlLmR0ZCwgdGhlbiB0aGUgVVJJIG9mIHRoZQotWE1MIENhdGFsb2cgZW50cnkgKHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiBJbnZvaWNlLmR0ZCkKLWlzIHVzZWQgdG8gbG9jYXRlIHRoZSBEVEQuIE90aGVyd2lzZSwgdGhlIERPQ1RZUEUncyBzeXN0ZW0gaWRlbnRpZmllciAoIkM6XG15ZHRkc1xJbnZvaWNlLmR0ZCIpLAotd2hpY2ggcmVmZXJzIGRpcmVjdGx5IHRvIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBvZiB0aGUgRFRELCBpcyB1c2VkIHRvIGxvY2F0ZQotdGhlIERURC48L3A+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiBhbHNvIHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5IGluIGFuIFhNTAotQ2F0YWxvZyBlbnRyeS4gSWYgeW91IHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5LCBhIERPQ1RZUEUgdGFnIHN1Y2gKLWFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIGFuIFhNTCBmaWxlOjwvZGl2PgotPHByZT4mbHQ7IURPQ1RZUEUgUm9vdC1uYW1lIFNZU1RFTSAiTXlEVEQuZHRkIiZndDsgPC9wcmU+Ci08cD53aGVyZQotTXlEVEQuZHRkIGlzIHRoZSBzeXN0ZW0gaWRlbnRpZmllciB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBLZXkgb2YgYW4gWE1MIENhdGFsb2cKLWVudHJ5LjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48c3Ryb25nPkFzc29jaWF0aW5nIGFuIFhNTCBmaWxlIHdpdGggYW4gWE1MIHNjaGVtYTwvc3Ryb25nPjxwPklmIGFuIFhNTCBmaWxlCi1pcyBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYSwgb25lIG9yIG1vcmUgc2NoZW1hIGxvY2F0aW9uIGF0dHJpYnV0ZXMgYXJlCi1pbmNsdWRlZCBpbiB0aGUgWE1MIGZpbGUuIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2NoZW1hTG9jYXRpb24gaXMgcHJvdmlkZWQKLWFzIGEgImhpbnQiIHRvIHRoZSBYTUwgcHJvY2Vzc29yLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgc2NoZW1hTG9jYXRpb24KLWF0dHJpYnV0ZXM6PC9wPgotPGRpdiBjbGFzcz0icCI+IDxzdHJvbmc+RXhhbXBsZSAxIDwvc3Ryb25nPjxwcmU+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSIKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIEM6XG15c2NoZW1hc1xQdXJjaGFzZU9yZGVyLnhzZCImZ3Q7Ci0mbHQ7c2hpcFRvIGNvdW50cnk9IlVTIiZndDsKLS4uLjwvcHJlPgotICAgIDwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5FeGFtcGxlIDIgPC9zdHJvbmc+PHByZT4mbHQ7cHVyY2hhc2VPcmRlciB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIgoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gUE8ueHNkIiZndDsKLSZsdDtzaGlwVG8gY291bnRyeT0iVVMiJmd0OwotLi4uLjwvcHJlPgotICA8L2Rpdj4KLTxwPkluIEV4YW1wbGUgMSwgdGhlIHNjaGVtYUxvY2F0aW9uICdoaW50JyAoJ0M6XG15c2NoZW1hc1xQdXJjaGFzZU9yZGVyLnhzZCcpCi1yZWZlcnMgZGlyZWN0bHkgdG8gdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9yIFVSSSBvZiB0aGUgWE1MIHNjaGVtYS4gSW4gdGhpcwotY2FzZSwgdGhlIHNjaGVtYSBmaWxlIHdpbGwgYmUgbG9jYXRlZCBieSB0aGUgWE1MIHByb2Nlc3NvciBkaXJlY3RseS48L3A+Ci08cD5JbgotRXhhbXBsZSAyLCB0aGUgc2NoZW1hTG9jYXRpb24gJ2hpbnQnICgnUE8ueHNkJykgcmVmZXJzIHRvIGFuIFhNTCBDYXRhbG9nIGVudHJ5LgotUE8ueHNkIGNvcnJlc3BvbmRzIHRvIHRoZSAgPHZhciBjbGFzcz0idmFybmFtZSI+S2V5PC92YXI+IG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeQotZm9yIFB1cmNoYXNlT3JkZXIueHNkLCBhbmQgdGhlIFVSSSBvZiB0aGUgWE1MIENhdGFsb2cgZW50cnkgKHdoaWNoIGNvbnRhaW5zCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb24gb2YgUHVyY2hhc2VPcmRlci54c2QpIHdpbGwgYmUgdXNlZCB0byBsb2NhdGVkCi10aGUgWE1MIHNjaGVtYS48L3A+Ci08cD5JbiBib3RoIGV4YW1wbGVzLCA8c2FtcCBjbGFzcz0iY29kZXBoIj5odHRwOi8vd3d3LmlibS5jb208L3NhbXA+IGluCi10aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+eHNpOnNjaGVtYUxvY2F0aW9uPC9zYW1wPiB0YWcgaXMgYSBVUkkgdGhhdCBpZGVudGlmaWVzIHRoZSBuYW1lc3BhY2UKLWZvciB0aGUgWE1MIHNjaGVtYS48L3A+Ci08ZGl2IGNsYXNzPSJwIj5Zb3UgY2FuIGFsc28gdXNlIGEgbmFtZXNwYWNlIGFzIGEgS2V5IGZvciBhbiBYTUwKLUNhdGFsb2cgZW50cnkuIElmIHlvdSB1c2UgYSBuYW1lc3BhY2UgYXMgYSBLZXksIGEgc2NoZW1hTG9jYXRpb24gdGFnIHN1Y2gKLWFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIGFuIFhNTCBmaWxlOjxwcmU+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM6PSJ3d3cuaWJtLmNvbSIKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHBvL3hzZC9QdXJjaGFzZU9yZGVyLnhzZCAiJmd0OzwvcHJlPgotPC9kaXY+Ci08cD5UaGUKLXNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBwb2ludHMgdG8gYm90aCB0aGUgS2V5IGFuZCB0aGUgYWN0dWFsIGxvY2F0aW9uIG9mCi10aGUgc2NoZW1hLjwvcD4KLTxwPjxzdHJvbmc+RFREIG9yIFhNTCBzY2hlbWEgcmVzaWRlcyBvbiBhIHJlbW90ZSBzZXJ2ZXI8L3N0cm9uZz48L3A+Ci08cD5TZXZlcmFsCi1mdW5jdGlvbnMgaW4gdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdmFsaWRhdGlvbiBhbmQgY29udGVudCBhc3Npc3QsIHJlcXVpcmUKLXRoZSBhdmFpbGFiaWxpdHkgb2YgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYS4gVGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiBwcm92aWRlcwotdXNhZ2UgaW5mb3JtYXRpb24gZm9yIGNhc2VzIHdoZW4gdGhlIERURCBvciBYTUwgc2NoZW1hIHJlc2lkZXMgb24geW91ciBsb2NhbAotbWFjaGluZS4gSG93ZXZlciwgaW4gbWFueSBjYXNlcywgdGhlIERURCBvciBYTUwgc2NoZW1hIGNhbiByZXNpZGUgb24gYSByZW1vdGUKLXNlcnZlciwgZm9yIGV4YW1wbGU6PC9wPgotPHA+PHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0OyFET0NUWVBFIENhdGFsb2cgUFVCTElDICJhYmMvQ2F0YWxvZyIKLSJodHRwOi8veHl6LmFiYy5vcmcvZHRkcy9jYXRhbG9nLmR0ZCImZ3Q7PC9zYW1wPjwvcD4KLTxwPk5vcm1hbGx5LCB0aGlzIGNhc2UKLXBvc2VzIG5vIHByb2JsZW0sIGJlY2F1c2UgdGhlIERURCBvciBYTUwgc2NoZW1hIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUKLXJlbW90ZSBzZXJ2ZXIuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgYmVoaW5kIGEgZmlyZXdhbGwsIGFuZCBkbyBub3QgaGF2ZSBhIFNPQ0tTaWZpZWQKLXN5c3RlbSwgdGhlIHdvcmtiZW5jaCBjdXJyZW50bHkgZG9lcyBub3QgcHJvdmlkZSBhIHdheSBmb3IgeW91IHRvIHNwZWNpZnkKLWEgc29ja3Mgc2VydmVyIGZvciByZXRyaWV2aW5nIGEgRFREIG9yIFhNTCBzY2hlbWEuIElmIHlvdSBhcmUgdW5hYmxlIHRvIFNPQ0tTaWZ5Ci15b3VyIHN5c3RlbSwgdGhlIHdvcmthcm91bmQgZm9yIHRoaXMgcHJvYmxlbSBpcyB0byByZXRyaWV2ZSBhIGNvcHkgb2YgdGhlCi1EVEQgb3IgWE1MIHNjaGVtYSAodXNpbmcgYSBXZWIgYnJvd3NlciwgZm9yIGV4YW1wbGUpIGFuZCBzYXZlIHRoYXQgY29weSBvbgoteW91ciBsb2NhbCBtYWNoaW5lLiBUaGVuLCB5b3UgY2FuIGVpdGhlciBwbGFjZSBhIGxvY2FsIGNvcHkgaW4gdGhlIHNhbWUgcHJvamVjdAotYXMgeW91ciBYTUwgZmlsZSwgb3IgdXNlIHRoZSBYTUwgQ2F0YWxvZyB0byBhc3NvY2lhdGUgYSBwdWJsaWMgaWRlbnRpZmllcgotd2l0aCB0aGUgRFREJ3MgKGxvY2FsKSBsb2NhdGlvbi48L3A+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYgeW91IGhhdmUgYW4gWE1MIGZpbGUgYXNzb2NpYXRlZAotd2l0aCBhbiBYTUwgc2NoZW1hIG9yIERURCB0aGF0IGlzIGVsc2V3aGVyZSBpbiB0aGUgbmV0d29yaywgYW5kIHlvdSBhcmUgd29ya2luZwotb24gYSBtYWNoaW5lIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBuZXR3b3JrLCB5b3UgY2FuIGZvbGxvdyB0aGUgc3RlcHMgZGVzY3JpYmVkCi1wcmV2aW91c2x5IGlmIHlvdSB3YW50IHRvIHVzZSBjb250ZW50IGFzc2lzdCBvciB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLiAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkFkdmFudGFnZXMgb2YgWE1MIENhdGFsb2cgZW50cnkgYXNzb2NpYXRpb25zPC9oND48cD5JZgoteW91IGNyZWF0ZSBhIGRpcmVjdCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFuIFhNTCBmaWxlIGFuZCBhbiBYTUwgc2NoZW1hIG9yIERURAotZmlsZSwgYW55IHRpbWUgeW91IGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSBvciBEVEQgeW91IGhhdmUgdG8gdHJhY2sKLWRvd24gYW5kIHVwZGF0ZSBhbGwgb2YgdGhlIHJlZmVyZW5jaW5nIFhNTCBmaWxlcyB3aXRoIHRoZSBuZXcgbG9jYXRpb24gb2YKLXRoZSBEVEQgb3Igc2NoZW1hLiBJZiwgaG93ZXZlciwgeW91IGFzc29jaWF0ZSBhbiBYTUwgZmlsZSB3aXRoIGFuIFhNTCBzY2hlbWEKLW9yIERURCBLZXksIHRoZW4sIHdoZW4geW91IGNoYW5nZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYSBvciBEVEQsIHlvdSBvbmx5Ci1oYXZlIHRvIHVwZGF0ZSB0aGUgWE1MIENhdGFsb2cgZW50cnksIGluc3RlYWQgb2YgZWFjaCBpbmRpdmlkdWFsIFhNTCBmaWxlLjwvcD4KLTxwPkZvcgotZXhhbXBsZSwgeW91IGhhdmUgYSBEVEQgY2FsbGVkIEJ1aWxkaW5nLmR0ZCwgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIGZpdmUKLVhNTCBmaWxlcyAtIE9mZmljZS54bWwsIEhvdXNlLnhtbCwgQXBhcnRtZW50LnhtbCwgQmFuay54bWwsIGFuZCBQb3N0T2ZmaWNlLnhtbC4KLVlvdSBtb3ZlIHRoZSBEVEQgZmlsZSBCdWlsZGluZy5kdGQgdG8gYSBuZXcgbG9jYXRpb24uIElmIHlvdSBoYXZlIGEgZGlyZWN0aW9uCi1hc3NvY2lhdGlvbiBiZXR3ZWVuIEJ1aWxkaW5nLmR0ZCBhbmQgYWxsIHRoZSBYTUwgZmlsZXMsIHlvdSB3aWxsIGhhdmUgdG8gdXBkYXRlCi10aGUgJmx0O0RPQ1RUWVBFJmd0OyBkZWNsYXJhdGlvbiBpbiBlYWNoIFhNTCBmaWxlIHRvIHJlZmxlY3QgdGhlIG5ldyBsb2NhdGlvbgotb2YgQnVpbGRpbmcuZHRkLiBJZiwgaG93ZXZlciwgeW91IGhhdmUgYW4gWE1MIENhdGFsb2cgYXNzb2NpYXRpb24sIGFuZCBhbGwKLXRoZSBYTUwgZmlsZXMganVzdCByZWZlciB0byB0aGUgS2V5IG9mIEJ1aWxkaW5nLmR0ZCwgdGhlbiB5b3Ugb25seSBoYXZlIHRvCi11cGRhdGUgdGhlIFVSSSBhbmQgYWxsIHRoZSBYTUwgZmlsZXMgd2lsbCBwb2ludCB0byB0aGUgbmV3IGxvY2F0aW9uIG9mIEJ1aWxkaW5nLmR0ZC48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlVwZGF0aW5nIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZzwvaDQ+PHA+QWZ0ZXIgeW91IGhhdmUKLXVwZGF0ZWQgYW4gZW50cnkgaW4gdGhlIFhNTCBDYXRhbG9nLCB5b3UgbWlnaHQgbmVlZCB0byByZWZyZXNoIHRoZSBYTUwgZWRpdG9yCi12aWV3IHNvIHRoYXQgaXQgdXNlcyB0aGUgbmV3IGluZm9ybWF0aW9uLiBUbyBkbyB0aGlzLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVsb2FkCi1EZXBlbmRlbmNpZXM8L3NwYW4+IHRvb2xiYXIgYnV0dG9uIDxpbWcgc3JjPSIuLi9pbWFnZXMvcmxkZ3Jtci5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvb2xiYXIgYnV0dG9uIiAvPiBhbmQKLXRoZSB2aWV3IHdpbGwgYmUgdXBkYXRlZCB1c2luZyB0aGUgY3VycmVudCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gWW91IG9ubHkKLW5lZWQgdG8gcmVmcmVzaCB0aGUgWE1MIGVkaXRvciB2aWV3IHdoZW4geW91IGhhdmUgYW4gWE1MIGZpbGUgb3BlbiB0aGF0IHJlZmVyZW5jZXMKLXRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0aGF0IHdhcyB1cGRhdGVkLjwvcD4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlcgotdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHhtbGNhdC5odG1sIiB0aXRsZT0iQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgTG9jYXRpb24gKHNpbWlsYXIgdG8gYSBVUkksIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5Ij5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0ZWR0c2NoLmh0bWwiIHRpdGxlPSJZb3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdmFyaW91cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIElmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHRoZSBzY2hlbWEgYW5kIG5hbWVzcGFjZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBvciBhZGQgYSBuZXcgYXNzb2NpYXRpb24uIE1vZGlmeWluZyBhbnkgYXNzb2NpYXRpb25zIGNhbiBpbXBhY3Qgd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLiI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRlZHRwcm9jLmh0bWwiIHRpdGxlPSJJZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gc2VuZCB0byBhbiBhcHBsaWNhdGlvbiB1c2luZyBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4iPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmNzRkOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN4bWxlbmMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlhNTCBhbmQgSFRNTCBlbmNvZGluZ3M8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBhbmQgSFRNTCBlbmNvZGluZ3M8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+RW5jb2RpbmdzIGVuYWJsZSB5b3UgdG8gc3BlY2lmeSB3aGF0IGNoYXJhY3RlciBlbmNvZGluZyB5b3VyIHRleHQNCi1pcyBpbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9ImN4bWxlbmN8MXxjaGFyYWN0ZXJlbmNvZGluZ3RleHRpbmZpbGVzIiBzdGF0dXM9ImNoYW5nZWQiPmNoYXJhY3Rlcg0KLWVuY29kaW5nPGluZGV4dGVybT5zdXBwb3J0ZWQgY2hhcmFjdGVyIHNldHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlIElBTkEgbmFtZSBpcyB1c2VkIGluIHRoZSBlbmNvZGluZyBzdGF0ZW1lbnQgb2YgYW4gWE1MIGZpbGUsIG9yIGNoYXJzZXQNCi1kaXJlY3RpdmUgaW4gYW4gSFRNTCBmaWxlLjwvcD4NCi08cD5UaGUgSFRNTCBhbmQgWE1MIGVkaXRvcnMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGVuY29kaW5nczo8L3A+DQotPHRhYmxlIHJvd2hlYWRlcj0iZmlyc3Rjb2wiPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzAiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMSIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCIgdmFsaWduPSJ0b3AiPiA8cD48Yj5YTUwgRW5jb2RpbmcgKElBTkEgTmFtZSk8L2I+PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSIgdmFsaWduPSJ0b3AiPiA8cD48Yj5EZXNjcmlwdGlvbjwvYj48L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnk+IDxwPkJJRzU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5CaWc1LCBUcmFkaXRpb25hbCBDaGluZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5FVUMtSlA8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5FVUMgZW5jb2RpbmcsIEphcGFuZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5FVUMtS1I8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5FVUMgZW5jb2RpbmcsIEtvcmVhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5HQjE4MDMwPC9lbnRyeT4NCi08ZW50cnk+TmF0aW9uYWwgU3RhbmRhcmQsIENoaW5lc2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tMjAyMi1KUDwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyAyMDIyLCBKYXBhbmVzZTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+SVNPLTIwMjItS1I8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMjAyMiwgS29yZWFuPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tODg1OS0xPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SVNPIExhdGluLTE8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktMjwvZW50cnk+DQotPGVudHJ5PkNlbnRyYWwvRWFzdCBFdXJvcGVhbiAoU2xhdmljKTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktMzwvZW50cnk+DQotPGVudHJ5PlNvdXRoZXJuIEV1cm9wZWFuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5JU08tODg1OS00PC9lbnRyeT4NCi08ZW50cnk+SVNPIDg4NTktNCwgQ3lyaWxsaWM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTU8L2VudHJ5Pg0KLTxlbnRyeT5JU08gODg1OS01LCBDeXJpbGxpYzwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPklTTy04ODU5LTY8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5BcmFiaWMgKExvZ2ljYWwpPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTc8L2VudHJ5Pg0KLTxlbnRyeT5HcmVlazwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPklTTy04ODU5LTg8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5IZWJyZXcgKFZpc3VhbCkgKGVuY29kaW5nIHN1cHBvcnRlZCwgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFBhZ2UNCi1EZXNpZ25lciBEZXNpZ24gcGFnZSk8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktOTwvZW50cnk+DQotPGVudHJ5PlR1cmtpc2g8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5TSElGVF9KSVM8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5TaGlmdC1KSVMsIEphcGFuZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PlRJUy02MjA8L2VudHJ5Pg0KLTxlbnRyeT5USVNJLCBUaGFpPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVMtQVNDSUk8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5VUyBBU0NJSTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTg8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMTA2NDYvVW5pY29kZSwgb25lLWJ5dGUgZW5jb2Rpbmc8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVURi0xNjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyAxMDY0Ni9Vbmljb2RlLCB0d28tYnl0ZSBlbmNvZGluZzwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTE2QkU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5Vbmljb2RlIEJpZ0VuZGlhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTE2TEU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5Vbmljb2RlIExpdHRsZUVuZGlhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+PHA+V0lORE9XUy0zMUo8L3A+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiPjxwPkphcGFuZXNlLCBXaW5kb3dzLTMxSjwvcD48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5XSU5ET1dTLTEyNTU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5IZWJyZXc8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPldJTkRPV1MtMTI1NjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPkFyYWJpYzwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmE1Nzc0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iRW5jb2RpbmdzIGVuYWJsZSB5b3UgdG8gc3BlY2lmeSB3aGF0IGNoYXJhY3RlciBlbmNvZGluZyB5b3VyIHRleHQgaXMgaW4uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkVuY29kaW5ncyBlbmFibGUgeW91IHRvIHNwZWNpZnkgd2hhdCBjaGFyYWN0ZXIgZW5jb2RpbmcgeW91ciB0ZXh0IGlzIGluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNoYXJhY3RlciBlbmNvZGluZywgc3VwcG9ydGVkIGNoYXJhY3RlciBzZXRzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iY2hhcmFjdGVyIGVuY29kaW5nLCBzdXBwb3J0ZWQgY2hhcmFjdGVyIHNldHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN4bWxlbmMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sZW5jIj48YSBuYW1lPSJjeG1sZW5jIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC9oMT4KLQotCi0KLQotPGRpdj48cD5FbmNvZGluZ3MgZW5hYmxlIHlvdSB0byBzcGVjaWZ5IHdoYXQgY2hhcmFjdGVyIGVuY29kaW5nIHlvdXIgdGV4dAotaXMgaW4uPC9wPgotCi08cD5UaGUgSUFOQSBuYW1lIGlzIHVzZWQgaW4gdGhlIGVuY29kaW5nIHN0YXRlbWVudCBvZiBhbiBYTUwgZmlsZSwgb3IgY2hhcnNldAotZGlyZWN0aXZlIGluIGFuIEhUTUwgZmlsZS48L3A+Ci0KLTxwPlRoZSBIVE1MIGFuZCBYTUwgZWRpdG9ycyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzOjwvcD4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAwNzIiPiA8cD48c3Ryb25nPlhNTCBFbmNvZGluZyAoSUFOQSBOYW1lKTwvc3Ryb25nPjwvcD4KLSA8L3RoPgotCi08dGggdmFsaWduPSJ0b3AiIGlkPSJOMTAwODQiPiA8cD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC9wPgotIDwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMEEyIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+QklHNTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBBMiBOMTAwODQgIj4gPHA+QmlnNSwgVHJhZGl0aW9uYWwgQ2hpbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDBDMiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPkVVQy1KUDwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBDMiBOMTAwODQgIj4gPHA+RVVDIGVuY29kaW5nLCBKYXBhbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDBFMiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPkVVQy1LUjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFMiBOMTAwODQgIj4gPHA+RVVDIGVuY29kaW5nLCBLb3JlYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxMDIiIGhlYWRlcnM9Ik4xMDA3MiAiPkdCMTgwMzA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEwMiBOMTAwODQgIj5OYXRpb25hbCBTdGFuZGFyZCwgQ2hpbmVzZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTE2IiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+SVNPLTIwMjItSlA8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMTYgTjEwMDg0ICI+IDxwPklTTyAyMDIyLCBKYXBhbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDEzNiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPklTTy0yMDIyLUtSPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTM2IE4xMDA4NCAiPiA8cD5JU08gMjAyMiwgS29yZWFuPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTU2IiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+SVNPLTg4NTktMTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE1NiBOMTAwODQgIj4gPHA+SVNPIExhdGluLTE8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxNzYiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTI8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE3NiBOMTAwODQgIj5DZW50cmFsL0Vhc3QgRXVyb3BlYW4gKFNsYXZpYyk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDE4QSIgaGVhZGVycz0iTjEwMDcyICI+SVNPLTg4NTktMzwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMThBIE4xMDA4NCAiPlNvdXRoZXJuIEV1cm9wZWFuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxOUUiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTQ8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5RSBOMTAwODQgIj5JU08gODg1OS00LCBDeXJpbGxpYzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMUIyIiBoZWFkZXJzPSJOMTAwNzIgIj5JU08tODg1OS01PC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxQjIgTjEwMDg0ICI+SVNPIDg4NTktNSwgQ3lyaWxsaWM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDFDNiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPklTTy04ODU5LTY8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxQzYgTjEwMDg0ICI+IDxwPkFyYWJpYyAoTG9naWNhbCk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxRTYiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTc8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDFFNiBOMTAwODQgIj5HcmVlazwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMUZBIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+SVNPLTg4NTktODwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDFGQSBOMTAwODQgIj4gPHA+SGVicmV3IChWaXN1YWwpIChlbmNvZGluZyBzdXBwb3J0ZWQsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBQYWdlCi1EZXNpZ25lciBEZXNpZ24gcGFnZSk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyMUEiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTk8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDIxQSBOMTAwODQgIj5UdXJraXNoPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyMkUiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5TSElGVF9KSVM8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyMkUgTjEwMDg0ICI+IDxwPlNoaWZ0LUpJUywgSmFwYW5lc2U8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyNEUiIGhlYWRlcnM9Ik4xMDA3MiAiPlRJUy02MjA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0RSBOMTAwODQgIj5USVNJLCBUaGFpPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyNjIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VUy1BU0NJSTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI2MiBOMTAwODQgIj4gPHA+VVMgQVNDSUk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyODIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VVEYtODwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI4MiBOMTAwODQgIj4gPHA+SVNPIDEwNjQ2L1VuaWNvZGUsIG9uZS1ieXRlIGVuY29kaW5nPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMkEyIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+VVRGLTE2PC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMkEyIE4xMDA4NCAiPiA8cD5JU08gMTA2NDYvVW5pY29kZSwgdHdvLWJ5dGUgZW5jb2Rpbmc8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyQzIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VVEYtMTZCRTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDJDMiBOMTAwODQgIj4gPHA+VW5pY29kZSBCaWdFbmRpYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyRTIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VVEYtMTZMRTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDJFMiBOMTAwODQgIj4gPHA+VW5pY29kZSBMaXR0bGVFbmRpYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzMDIiIGhlYWRlcnM9Ik4xMDA3MiAiPjxwPldJTkRPV1MtMzFKPC9wPgotPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzMDIgTjEwMDg0ICI+PHA+SmFwYW5lc2UsIFdpbmRvd3MtMzFKPC9wPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzMUUiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5XSU5ET1dTLTEyNTU8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzMUUgTjEwMDg0ICI+IDxwPkhlYnJldzwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDMzRSIgaGVhZGVycz0iTjEwMDcyICI+IDxwPldJTkRPV1MtMTI1NjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDMzRSBOMTAwODQgIj4gPHA+QXJhYmljPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmYzViMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjeG1sdG9vbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIHRvb2xzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCB0b29scyAtIG92ZXJ2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmlzdWFsIFhNTCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4NCi1UaGUgdG9vbCBzZXQgaW5jbHVkZXMgY29tcG9uZW50cyBmb3IgYnVpbGRpbmcgRFREcywgWE1MIHNjaGVtYXMsIGFuZCBYTUwgZmlsZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHRvb2xzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgZm9sbG93aW5nIFhNTCB0b29scyBhcmUgYXZhaWxhYmxlLiA8L3A+DQotPHA+VGhlIDxiPlhNTCBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiBZb3UNCi1jYW4gdXNlIGl0IHRvIGNyZWF0ZSBuZXcgWE1MIGZpbGVzLCBlaXRoZXIgZnJvbSBzY3JhdGNoLCBleGlzdGluZyBEVERzLCBvcg0KLWV4aXN0aW5nIFhNTCBzY2hlbWFzLiBZb3UgY2FuIGFsc28gdXNlIGl0IHRvIGVkaXQgWE1MIGZpbGVzLCBhc3NvY2lhdGUgdGhlbQ0KLXdpdGggRFREcyBvciBzY2hlbWFzLCBhbmQgdmFsaWRhdGUgdGhlbS4gPC9wPg0KLTxwPiBUaGUgPGI+RFREIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBEVERzLiAgIDwvcD4NCi08cD5UaGUgPGI+WE1MIHNjaGVtYSBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nDQotWE1MIHNjaGVtYXMuIFlvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIGVkaXRvciB0byBwZXJmb3JtIHRhc2tzIHN1Y2ggYXMgY3JlYXRpbmcNCi1YTUwgc2NoZW1hIGNvbXBvbmVudHMgYW5kIGltcG9ydGluZyBhbmQgdmlld2luZyBYTUwgc2NoZW1hcy4gPC9wPg0KLTxwPjxiPk5vdGVzOjwvYj48L3A+DQotPHNlY3Rpb24+RXhlcmNpc2UgY2F1dGlvbiB3aGVuIG9wZW5pbmcgbGFyZ2UgZmlsZXMgd2l0aCBhbnkgb2YgdGhlIFhNTCBlZGl0b3JzLg0KLUlmIHRoZSBtZW1vcnkgbGltaXRzIG9mIHRoZSB3b3JrYmVuY2ggYXJlIGV4Y2VlZGVkLCBpdCB3aWxsIGFicnVwdGx5IGNsb3NlDQotd2l0aG91dCBzYXZpbmcgYW55IGRhdGEgKGFuZCB3aXRob3V0IHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZXMpLiBUaGUgbnVtYmVyDQotb2YgZWxlbWVudHMgaW4gYW4gWE1MIGZpbGUsIG5vdCBpdHMgc2l6ZSwgaXMgdGhlIGJlc3QgaW5kaWNhdG9yIG9mIGhvdyBtdWNoDQotbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQuIE1lbW9yeSByZXF1aXJlbWVudHMgYWxzbyBkZXBlbmQgb24gd2hhdCBlbHNlIGlzIG9wZW4NCi1pbiB0aGUgd29ya2JlbmNoIC0gaW4gc29tZSBjYXNlcyB5b3UgY2FuIG9wZW4gYSBmaWZ0ZWVuIG1lZ2FieXRlcyBmaWxlLCBidXQNCi1pbiBvdGhlciBjYXNlcyBhIG9uZSBtZWdhYnl0ZSBmaWxlIG1pZ2h0IGNhdXNlIHByb2JsZW1zLiBUaGVyZWZvcmUsIHdlIHJlY29tbWVuZA0KLXlvdSBzYXZlIGFsbCBkYXRhIGluIHRoZSB3b3JrYmVuY2ggYmVmb3JlIG9wZW5pbmcgbGFyZ2UgWE1MIGZpbGVzLiBUaGlzIGlzDQotYSBwZXJtYW5lbnQgcmVzdHJpY3Rpb24uPC9zZWN0aW9uPg0KLTxzZWN0aW9uIGNvbnJlZj0icmxpbWl0YXRpb25zX3NsdXNoWE1MLmRpdGEjcmxpbWl0YXRpb25zX3NsdXNoWE1ML3VucmVzb2x2X1VSSSI+PC9zZWN0aW9uPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDIwNjQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2OTYzMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPlhNTCB0b29scyAtIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sdG9vbCI+PGEgbmFtZT0iY3htbHRvb2wiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgdG9vbHMgLSBvdmVydmlldzwvaDE+Ci08ZGl2PjxwPlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmlzdWFsIFhNTCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4KLVRoZSB0b29sIHNldCBpbmNsdWRlcyBjb21wb25lbnRzIGZvciBidWlsZGluZyBEVERzLCBYTUwgc2NoZW1hcywgYW5kIFhNTCBmaWxlcy48L3A+PHA+VGhlIGZvbGxvd2luZyBYTUwgdG9vbHMgYXJlIGF2YWlsYWJsZTo8L3A+Ci08cD5UaGUgPGI+WE1MIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIFlvdQotY2FuIHVzZSBpdCB0byBjcmVhdGUgbmV3IFhNTCBmaWxlcywgZWl0aGVyIGZyb20gc2NyYXRjaCwgZXhpc3RpbmcgRFREcywgb3IKLWV4aXN0aW5nIFhNTCBzY2hlbWFzLiBZb3UgY2FuIGFsc28gdXNlIGl0IHRvIGVkaXQgWE1MIGZpbGVzLCBhc3NvY2lhdGUgdGhlbQotd2l0aCBEVERzIG9yIHNjaGVtYXMsIGFuZCB2YWxpZGF0ZSB0aGVtLjwvcD4KLTxwPlRoZSA8Yj5EVEQgZWRpdG9yPC9iPiBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIERURHMuIDwvcD4KLTxwPlRoZSA8Yj5YTUwgc2NoZW1hIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgCi1YTUwgc2NoZW1hcy4gWW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgZWRpdG9yIHRvIHBlcmZvcm0gdGFza3Mgc3VjaCBhcyBjcmVhdGluZyAKLVhNTCBzY2hlbWEgY29tcG9uZW50cyBhbmQgaW1wb3J0aW5nIGFuZCB2aWV3aW5nIFhNTCBzY2hlbWFzLiA8L3A+Ci08ZGl2IGNsYXNzPSJza2lwc3BhY2UiPkV4ZXJjaXNlIGNhdXRpb24gd2hlbiBvcGVuaW5nIGxhcmdlIGZpbGVzIHdpdGggYW55IG9mIHRoZSBYTUwgZWRpdG9ycy4KLUlmIHRoZSBtZW1vcnkgbGltaXRzIG9mIHRoZSB3b3JrYmVuY2ggYXJlIGV4Y2VlZGVkLCBpdCB3aWxsIGFicnVwdGx5IGNsb3NlCi13aXRob3V0IHNhdmluZyBhbnkgZGF0YSAoYW5kIHdpdGhvdXQgd2FybmluZyBvciBlcnJvciBtZXNzYWdlcykuIFRoZSBudW1iZXIKLW9mIGVsZW1lbnRzIGluIGFuIFhNTCBmaWxlLCBub3QgaXRzIHNpemUsIGlzIHRoZSBiZXN0IGluZGljYXRvciBvZiBob3cgbXVjaAotbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQuIE1lbW9yeSByZXF1aXJlbWVudHMgYWxzbyBkZXBlbmQgb24gd2hhdCBlbHNlIGlzIG9wZW4KLWluIHRoZSB3b3JrYmVuY2ggLSBpbiBzb21lIGNhc2VzIHlvdSBjYW4gb3BlbiBhIDE1IG1lZ2FieXRlcyBmaWxlLCBidXQgaW4KLW90aGVyIGNhc2VzIGEgb25lLW1lZ2FieXRlIGZpbGUgbWF5IGNhdXNlIHByb2JsZW1zLiBUaGVyZWZvcmUsIHdlIHJlY29tbWVuZAoteW91IHNhdmUgYWxsIGRhdGEgaW4gdGhlIHdvcmtiZW5jaCBiZWZvcmUgb3BlbmluZyBsYXJnZSBYTUwgZmlsZXMuIFRoaXMgaXMKLWEgcGVybWFuZW50IHJlc3RyaWN0aW9uLjwvZGl2PgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj48cD5UaGUKLWJlaGF2aW9yIG9mIHRoZSBYTUwgcGFyc2VyIHdoZW4gZW5jb3VudGVyaW5nIGFuIHVucmVzb2x2YWJsZSBVUkkgKGZvciBleGFtcGxlLAotaW4gYSBET0NUWVBFIGRlY2xhcmF0aW9uKSBpcyB0byByZXBvcnQgYSBmYXRhbCBJTyBlcnJvciBhbmQgc3RvcCBhbnkgZnVydGhlcgotcHJvY2Vzc2luZy4gQW4gdW5yZXNvbHZlZCBVUkkgaXMgc2VlbiBuZWl0aGVyIGFzIGEgc3ludGFjdGljIG5vciBhIHNlbWFudGljCi1lcnJvciBhbmQgYXMgc3VjaCwgdGhlIHBhcnNlciBkb2VzIG5vdCBhdHRlbXB0IHRvIGhhbmRsZSBpdC4gRXNzZW50aWFsbHksCi10aGUgZG9jdW1lbnQgcmVtYWlucyB1bmNoZWNrZWQuIFRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiZTcxNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlICBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIiAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmV4dGN0biIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHVzZSB0aGUgWE1MIHNjaGVtYSA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50IHRvIGV4dGVuZA0KLXRoZSBjb250ZW50IG1vZGVsIG9mIGFuIFhNTCBkb2N1bWVudC48L3Nob3J0ZGVzYz4NCi08cmVmYm9keT4NCi08c2VjdGlvbj48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBmaWxlIGNhbGxlZCBCb29rLnhzZCB0aGF0DQotY29udGFpbnMgYSBjb21wbGV4IHR5cGUgY2FsbGVkIEJvb2tUeXBlLiBCb29rVHlwZSBjb250YWlucyA0IGVsZW1lbnRzICh0aXRsZSwNCi1hdXRob3IsIHllYXIsIGFuZCBJU0JOKSBhbmQgb25lICA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50LiBUaGUgbmFtZXNwYWNlDQotZm9yIHRoZSA8Y29kZXBoPmFueTwvY29kZXBoPiAgZWxlbWVudCBpcyAgPGNvZGVwaD4jI2FueTwvY29kZXBoPi4gVGhpcyBtZWFucw0KLXRoYXQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQsIHlvdSBjYW4gaW5zZXJ0IGFueSBYTUwgZWxlbWVudCB0byBleHRlbmQgdGhlDQotZGVmaW5pdGlvbiBvZiB0aGUgQm9va1R5cGUuPC9wPjxwPllvdSBjYW4gYWxzbyBwcm92aWRlIGEgbW9yZSBzcGVjaWZpYyBuYW1lc3BhY2UuDQotRm9yIGV4YW1wbGUsIHlvdSBoYXZlIGFub3RoZXIgc2NoZW1hIGNhbGxlZCBNeV9Cb29rLnhzZCwgd2hpY2ggY29udGFpbnMgYQ0KLWNvbXBsZXggdHlwZSBjYWxsZWQgTXlfQm9va1R5cGUuIE15X0Jvb2tUeXBlIGNvbnRhaW5zIDQgZWxlbWVudHMgKHRpdGxlLCBhdXRob3IsDQoteWVhciwgYW5kIElTQk4pIGFuZCBvbmUgIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQsIGJ1dCBpbiB0aGlzIGNhc2UgdGhlDQotbmFtZXNwYWNlIGZvciB0aGUgIEJvb2tUeXBlIGVsZW1lbnQgaXMgd3d3Lndlc2xleS5jb20uIFRoaXMgbWVhbnMgdGhhdCBpbg0KLWFuIGluc3RhbmNlIGRvY3VtZW50LCB5b3UgY2FuIGluc2VydCBhbnkgWE1MIGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBkZWZpbml0aW9uDQotb2YgdGhlIEJvb2tUeXBlLCBwcm92aWRlZCB0aGF0IHRoZXkgYmVsb25nIHRvIHRoZSBuYW1lc3BhY2UgaHR0cDovL3d3dy53ZXNsZXkuY29tLjwvcD48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmV4dGN0bi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiN2ZmNWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgYW55IGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBjb250ZW50IG1vZGVsIG9mIGFuIFhNTCBkb2N1bWVudC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgYW55IGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBjb250ZW50IG1vZGVsIG9mIGFuIFhNTCBkb2N1bWVudC4iIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmV4dGN0biIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJleHRjdG4iPjxhIG5hbWU9InJleHRjdG4iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXM8L2gxPgotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSB0aGUgWE1MIHNjaGVtYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQgdG8gZXh0ZW5kCi10aGUgY29udGVudCBtb2RlbCBvZiBhbiBYTUwgZG9jdW1lbnQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBmaWxlIGNhbGxlZCBCb29rLnhzZCB0aGF0Ci1jb250YWlucyBhIGNvbXBsZXggdHlwZSBjYWxsZWQgQm9va1R5cGUuIEJvb2tUeXBlIGNvbnRhaW5zIDQgZWxlbWVudHMgKHRpdGxlLAotYXV0aG9yLCB5ZWFyLCBhbmQgSVNCTikgYW5kIG9uZSAgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50LiBUaGUgbmFtZXNwYWNlCi1mb3IgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gIGVsZW1lbnQgaXMgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiMjYW55PC9zYW1wPi4gVGhpcyBtZWFucwotdGhhdCBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudCwgeW91IGNhbiBpbnNlcnQgYW55IFhNTCBlbGVtZW50IHRvIGV4dGVuZCB0aGUKLWRlZmluaXRpb24gb2YgdGhlIEJvb2tUeXBlLjwvcD4KLTxwPllvdSBjYW4gYWxzbyBwcm92aWRlIGEgbW9yZSBzcGVjaWZpYyBuYW1lc3BhY2UuCi1Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW5vdGhlciBzY2hlbWEgY2FsbGVkIE15X0Jvb2sueHNkLCB3aGljaCBjb250YWlucyBhCi1jb21wbGV4IHR5cGUgY2FsbGVkIE15X0Jvb2tUeXBlLiBNeV9Cb29rVHlwZSBjb250YWlucyA0IGVsZW1lbnRzICh0aXRsZSwgYXV0aG9yLAoteWVhciwgYW5kIElTQk4pIGFuZCBvbmUgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCwgYnV0IGluIHRoaXMgY2FzZSB0aGUKLW5hbWVzcGFjZSBmb3IgdGhlICBCb29rVHlwZSBlbGVtZW50IGlzIHd3dy53ZXNsZXkuY29tLiBUaGlzIG1lYW5zIHRoYXQgaW4KLWFuIGluc3RhbmNlIGRvY3VtZW50LCB5b3UgY2FuIGluc2VydCBhbnkgWE1MIGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBkZWZpbml0aW9uCi1vZiB0aGUgQm9va1R5cGUsIHByb3ZpZGVkIHRoYXQgdGhleSBiZWxvbmcgdG8gdGhlIG5hbWVzcGFjZSBodHRwOi8vd3d3Lndlc2xleS5jb20uPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlZTRiMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJybGltaXRhdGlvbnNfc2x1c2hYTUwiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuPC9zaG9ydGRlc2M+DQotPHJlZmJvZHk+DQotPCEtLVVzZSB0aGlzIHRlbXBsYXRlIHRvIHNpbmdsZSBzb3VyY2UgdGhlIHJlYWRtZSBpbmZvcm1hdGlvbi4gIFRoZSBjb250ZW50IGZvciB0aGUgcmVhZG1lIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgaW4gdGhpcyB0b3BpYyBhbmQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgcmVsYXRlZCB0b3BpYyB1c2luZyB0aGUgY29ucmVmIGF0dHJpYnV0ZS4gVGhpcyBmaWxlIHdpbGwgbm90IGJlIHN1cmZhY2VkIGluIHlvdXIgbmF2aWdhdGlvbi4tLT4NCi08c2VjdGlvbiBpZD0idW5yZXNvbHZfVVJJIj48IS0tTm8gZGVmZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzLiBJdCBpcyBmcm9tIHRoZSA1LjEuIHJlYWRtZS4tLT48cD5UaGUNCi1iZWhhdmlvciBvZiB0aGUgWE1MIHBhcnNlciB3aGVuIGVuY291bnRlcmluZyBhbiB1bnJlc29sdmFibGUgVVJJIChmb3IgZXhhbXBsZSwNCi1pbiBhIERPQ1RZUEUgZGVjbGFyYXRpb24pIGlzIHRvIHJlcG9ydCBhIGZhdGFsIElPIGVycm9yIGFuZCBzdG9wIGFueSBmdXJ0aGVyDQotcHJvY2Vzc2luZy4gQW4gdW5yZXNvbHZlZCBVUkkgaXMgc2VlbiBuZWl0aGVyIGFzIGEgc3ludGFjdGljIG5vciBhIHNlbWFudGljDQotZXJyb3IgYW5kIGFzIHN1Y2gsIHRoZSBwYXJzZXIgZG9lcyBub3QgYXR0ZW1wdCB0byBoYW5kbGUgaXQuIEVzc2VudGlhbGx5LA0KLXRoZSBkb2N1bWVudCByZW1haW5zIHVuY2hlY2tlZC4gVGhpcyBpcyBhIGtub3duIHByb2JsZW0uPC9wPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YjIzZjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJsaW1pdGF0aW9uc19zbHVzaFhNTCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJsaW1pdGF0aW9uc19zbHVzaFhNTCI+PGEgbmFtZT0icmxpbWl0YXRpb25zX3NsdXNoWE1MIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5MaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuPC9wPgotCi0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJybGltaXRhdGlvbnNfc2x1c2hYTUxfX3VucmVzb2x2X1VSSSI+PGEgbmFtZT0icmxpbWl0YXRpb25zX3NsdXNoWE1MX191bnJlc29sdl9VUkkiPjwhLS0gLS0+PC9hPjxwPlRoZQotYmVoYXZpb3Igb2YgdGhlIFhNTCBwYXJzZXIgd2hlbiBlbmNvdW50ZXJpbmcgYW4gdW5yZXNvbHZhYmxlIFVSSSAoZm9yIGV4YW1wbGUsCi1pbiBhIERPQ1RZUEUgZGVjbGFyYXRpb24pIGlzIHRvIHJlcG9ydCBhIGZhdGFsIElPIGVycm9yIGFuZCBzdG9wIGFueSBmdXJ0aGVyCi1wcm9jZXNzaW5nLiBBbiB1bnJlc29sdmVkIFVSSSBpcyBzZWVuIG5laXRoZXIgYXMgYSBzeW50YWN0aWMgbm9yIGEgc2VtYW50aWMKLWVycm9yIGFuZCBhcyBzdWNoLCB0aGUgcGFyc2VyIGRvZXMgbm90IGF0dGVtcHQgdG8gaGFuZGxlIGl0LiBFc3NlbnRpYWxseSwKLXRoZSBkb2N1bWVudCByZW1haW5zIHVuY2hlY2tlZC4gVGhpcyBpcyBhIGtub3duIHByb2JsZW0uPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk4YjA3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTxyZWZlcmVuY2UgaWQ9InJpY29ucyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24NCi12aWV3Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmljb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTx0YWJsZT4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMwIi8+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzEiLz4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiIHZhbGlnbj0iYm90dG9tIj48Yj5JY29uPC9iPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIiB2YWxpZ249ImJvdHRvbSI+PGI+RGVzY3JpcHRpb248L2I+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9uYXR0cmliLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZQ0KLWljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWNoYXJhY3RlciBkYXRhIGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNoYXJhY3RlciBkYXRhIChDREFUQSkgc2VjdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvY29tbWVudF9vYmouZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29tbWVudA0KLWljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2RvY3R5cGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgRE9DVFlQRQ0KLWljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PkRPQ1RZUEUgZGVjbGFyYXRpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL25lbGVtLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQNCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+ZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgcHJvY2Vzc2luZw0KLWluc3RydWN0aW9ucyBpY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCi08P1B1YiAqMDAwMDAwMTgyND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwNTQzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24gdmlldy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgaWNvbnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBpY29ucyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJpY29ucyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY29ucyI+PGEgbmFtZT0icmljb25zIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24KLXZpZXcuPC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249ImJvdHRvbSI+PHN0cm9uZz5JY29uPC9zdHJvbmc+PC90ZD4KLQotPHRkIHZhbGlnbj0iYm90dG9tIj48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9uYXR0cmliLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZSYjMTA7aWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5hdHRyaWJ1dGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7Y2hhcmFjdGVyIGRhdGEgaWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNoYXJhY3RlciBkYXRhIChDREFUQSkgc2VjdGlvbjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvY29tbWVudF9vYmouZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29tbWVudCYjMTA7aWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNvbW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2RvY3R5cGUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgRE9DVFlQRSYjMTA7aWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPkRPQ1RZUEUgZGVjbGFyYXRpb248L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL25lbGVtLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQmIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+ZWxlbWVudDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgcHJvY2Vzc2luZyYjMTA7aW5zdHJ1Y3Rpb25zIGljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTJjOGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIg0KLSAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0ieG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0czwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5BY2NlbGVyYXRvciBrZXlzIGNhbiBiZSB1c2VkIGluIHRoZQ0KLWNhdGFsb2cgdHJlZSBzdHJ1Y3R1cmUgYW5kIGNhdGFsb2cgZW50cnkgd2l6YXJkIGJ5IGZpcnN0IHByZXNzaW5nIGFuZCBob2xkaW5nDQotdGhlIEFsdCBrZXkuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+YWNjZXNzaWJpbGl0eTxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPGluZGV4dGVybT5YTUwNCi1jYXRhbG9nIHdpemFyZDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPGluZGV4dGVybT5YTUwNCi1jYXRhbG9nIHdpemFyZDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+c2hvcnRjdXRzPGluZGV4dGVybT5rZXlib2FyZDxpbmRleHRlcm0+WE1MDQotY2F0YWxvZyB3aXphcmQ8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBjYXRhbG9nIHdpemFyZDxpbmRleHRlcm0+YWNjZXNzaWJpbGl0eTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGNhdGFsb2cgd2l6YXJkPGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHRhYmxlIGZyYW1lPSJhbGwiPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iY29sMSIgY29sd2lkdGg9Ijg0KiIvPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDMiDQotY29sd2lkdGg9IjkzKiIvPg0KLTx0aGVhZD4NCi08cm93IHZhbGlnbj0iYm90dG9tIj4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+S2V5IENvbWJpbmF0aW9uPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+RnVuY3Rpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGhlYWQ+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFsdCtBPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+QWRkIGNhdGFsb2cgZW50cnk8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFsdCtFPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+RWRpdCBzZWxlY3RlZCBjYXRhbG9nIGVudHJ5PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BbHQrUjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPlJlbW92ZSBzZWxlY3RlZCBjYXRhbG9nIGVudHJ5PC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ODRmOWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBY2NlbGVyYXRvciBrZXlzIGNhbiBiZSB1c2VkIGluIHRoZSBjYXRhbG9nIHRyZWUgc3RydWN0dXJlIGFuZCBjYXRhbG9nIGVudHJ5IHdpemFyZCBieSBmaXJzdCBwcmVzc2luZyBhbmQgaG9sZGluZyB0aGUgQWx0IGtleS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQWNjZWxlcmF0b3Iga2V5cyBjYW4gYmUgdXNlZCBpbiB0aGUgY2F0YWxvZyB0cmVlIHN0cnVjdHVyZSBhbmQgY2F0YWxvZyBlbnRyeSB3aXphcmQgYnkgZmlyc3QgcHJlc3NpbmcgYW5kIGhvbGRpbmcgdGhlIEFsdCBrZXkuIiAvPgotPG1ldGEgY29udGVudD0iYWNjZXNzaWJpbGl0eSwga2V5Ym9hcmQgc2hvcnRjdXRzLCBYTUwgY2F0YWxvZyB3aXphcmQsIHNob3J0Y3V0cywga2V5Ym9hcmQsIFhNTCBjYXRhbG9nIHdpemFyZCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFjY2Vzc2liaWxpdHksIGtleWJvYXJkIHNob3J0Y3V0cywgWE1MIGNhdGFsb2cgd2l6YXJkLCBzaG9ydGN1dHMsIGtleWJvYXJkLCBYTUwgY2F0YWxvZyB3aXphcmQiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InhtbGNhdGFsb2drZXlib2FyZHNob3J0Y3V0cyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ieG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIj48YSBuYW1lPSJ4bWxjYXRhbG9na2V5Ym9hcmRzaG9ydGN1dHMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0czwvaDE+Ci0KLQotCi08ZGl2PjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPkFjY2VsZXJhdG9yIGtleXMgY2FuIGJlIHVzZWQgaW4gdGhlCi1jYXRhbG9nIHRyZWUgc3RydWN0dXJlIGFuZCBjYXRhbG9nIGVudHJ5IHdpemFyZCBieSBmaXJzdCBwcmVzc2luZyBhbmQgaG9sZGluZwotdGhlIEFsdCBrZXkuPC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0aGVhZCBhbGlnbj0ibGVmdCI+Ci08dHIgdmFsaWduPSJib3R0b20iPgotPHRoIHZhbGlnbj0iYm90dG9tIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBpZD0iTjEwMDkxIj5LZXkgQ29tYmluYXRpb248L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIHdpZHRoPSI1Mi41NDIzNzI4ODEzNTU5NCUiIGlkPSJOMTAwOTgiPkZ1bmN0aW9uPC90aD4KLQotPC90cj4KLQotPC90aGVhZD4KLQotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBoZWFkZXJzPSJOMTAwOTEgIj5BbHQrQTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaGVhZGVycz0iTjEwMDk4ICI+QWRkIGNhdGFsb2cgZW50cnk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA5MSAiPkFsdCtFPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwOTggIj5FZGl0IHNlbGVjdGVkIGNhdGFsb2cgZW50cnk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA5MSAiPkFsdCtSPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwOTggIj5SZW1vdmUgc2VsZWN0ZWQgY2F0YWxvZyBlbnRyeTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbHRvb2xza2V5LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGVkYzNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbHRvb2xza2V5LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiINCi0gInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InhtbHRvb2xza2V5Ym9hcmRzaG9ydGN1dHMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNvdXJjZSBlZGl0b3IgYW5kIFhNTCB0b29scyBrZXlib2FyZCBzaG9ydGN1dHM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhNTCwgWFNELA0KLVdTREwsIEhUTUwsIEpTUCwgQ1NTIGFuZCBEVEQgZWRpdG9ycy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5hY2Nlc3NpYmlsaXR5PGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8aW5kZXh0ZXJtPlhNTA0KLWVkaXRvcjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+YWNjZXNzaWJpbGl0eTxpbmRleHRlcm0+a2V5Ym9hcmQNCi1zaG9ydGN1dHM8aW5kZXh0ZXJtPnNvdXJjZSBlZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPmtleWJvYXJkDQotc2hvcnRjdXRzPGluZGV4dGVybT5YTUwgZWRpdG9yPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5zaG9ydGN1dHM8aW5kZXh0ZXJtPmtleWJvYXJkPGluZGV4dGVybT5YTUwNCi1lZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmFjY2Vzc2liaWxpdHk8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WFNEIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5XU0RMIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5IVE1MIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5KU1AgZWRpdG9yPGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkNTUyBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+RFREIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPjx0aXRsZT5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIGFsbCBzb3VyY2UgZWRpdG9yczwvdGl0bGU+PHNpbXBsZXRhYmxlPg0KLTxzdGhlYWQ+DQotPHN0ZW50cnk+Q29tbWFuZDwvc3RlbnRyeT4NCi08c3RlbnRyeT5TaG9ydGN1dDwvc3RlbnRyeT4NCi08L3N0aGVhZD4NCi08c3Ryb3c+DQotPHN0ZW50cnk+R28gVG8gTWF0Y2hpbmcgQnJhY2tldDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K1A8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+UmVzdG9yZSBMYXN0IFNlbGVjdGlvbjwvc3RlbnRyeT4NCi08c3RlbnRyeT5BdGwrU2hpZnQrRG93bjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5TZWxlY3QgRW5jbG9zaW5nIEVsZW1lbnQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+QWx0K1NoaWZ0K1VwPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PlNlbGVjdCBOZXh0IEVsZW1lbnQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+QWx0K1NoaWZ0K1JpZ2h0PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PlNlbGVjdCBQcmV2aW91cyBFbGVtZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkFsdCtTaGlmdCtMZWZ0PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPC9zaW1wbGV0YWJsZT48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNob3J0Y3V0cyBhdmFpbGFibGUgaW4gdGhlIFhNTCwgWFNELCBXU0RMLCBIVE1MLCBKU1AsIGFuZA0KLUNTUyBlZGl0b3JzIChleGNsdWRlcyB0aGUgRFREIGVkaXRvcik8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkZvcm1hdDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0Y8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+Rm9ybWF0IEFjdGl2ZSBFbGVtZW50czwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK0k8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08L3NpbXBsZXRhYmxlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgWE1MLCBYU0QsIFdTREwsIEhUTUwsIGFuZCBKU1AgZWRpdG9ycw0KLShleGNsdWRlcyB0aGUgRFREIGFuZCBDU1MgZWRpdG9ycyk8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkFkZCBCbG9jayBDb21tZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrU2hpZnQrLzwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5HbyBUbyBNYXRjaGluZyBUYWc8L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCtTaGlmdCs+PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkdvIFRvIE5leHQgU2libGluZzwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0Rvd248L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+T2NjdXJyZW5jZXMgaW4gRmlsZTwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0E8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+T3BlbiBTZWxlY3Rpb248L3N0ZW50cnk+DQotPHN0ZW50cnk+RjM8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+R28gVG8gUHJldmlvdXMgU2libGluZzwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K1VwPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PlJlbW92ZSBCbG9jayBDb21tZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrU2hpZnQrXDwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5Ub2dnbGUgQ29tbWVudDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0M8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08L3NpbXBsZXRhYmxlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgZGVzaWduIHZpZXcgb2YgdGhlIFhTRCBhbmQgV1NETA0KLWVkaXRvcnM8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5Plpvb20gSW48L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCs9PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5Plpvb20gT3V0PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrLTwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTwvc2ltcGxldGFibGU+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIHRoZSBkZXNpZ24gdmlldyBvZiB0aGUgV1NETCBlZGl0b3I8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkV4cG9ydCBEaWFncmFtIGFzIEltYWdlPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrU2hpZnQrWDwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTwvc2ltcGxldGFibGU+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzNmYxOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU291cmNlIGVkaXRvciBhbmQgWE1MIHRvb2xzIGtleWJvYXJkIHNob3J0Y3V0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZm9sbG93aW5nIGtleWJvYXJkIHNob3J0Y3V0cyBhcmUgYXZhaWxhYmxlIGZvciB0aGUgWE1MLCBYU0QsIFdTREwsIEhUTUwsIEpTUCwgQ1NTIGFuZCBEVEQgZWRpdG9ycy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhNTCwgWFNELCBXU0RMLCBIVE1MLCBKU1AsIENTUyBhbmQgRFREIGVkaXRvcnMuIiAvPgotPG1ldGEgY29udGVudD0iYWNjZXNzaWJpbGl0eSwga2V5Ym9hcmQgc2hvcnRjdXRzLCBYTUwgZWRpdG9yLCBrZXlib2FyZCBzaG9ydGN1dHMsIHNvdXJjZSBlZGl0b3IsIFhNTCBlZGl0b3IsIHNob3J0Y3V0cywga2V5Ym9hcmQsIFhTRCBlZGl0b3IsIFdTREwgZWRpdG9yLCBIVE1MIGVkaXRvciwgSlNQIGVkaXRvciwgQ1NTIGVkaXRvciwgRFREIGVkaXRvciIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFjY2Vzc2liaWxpdHksIGtleWJvYXJkIHNob3J0Y3V0cywgWE1MIGVkaXRvciwga2V5Ym9hcmQgc2hvcnRjdXRzLCBzb3VyY2UgZWRpdG9yLCBYTUwgZWRpdG9yLCBzaG9ydGN1dHMsIGtleWJvYXJkLCBYU0QgZWRpdG9yLCBXU0RMIGVkaXRvciwgSFRNTCBlZGl0b3IsIEpTUCBlZGl0b3IsIENTUyBlZGl0b3IsIERURCBlZGl0b3IiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InhtbHRvb2xza2V5Ym9hcmRzaG9ydGN1dHMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Tb3VyY2UgZWRpdG9yIGFuZCBYTUwgdG9vbHMga2V5Ym9hcmQgc2hvcnRjdXRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ4bWx0b29sc2tleWJvYXJkc2hvcnRjdXRzIj48YSBuYW1lPSJ4bWx0b29sc2tleWJvYXJkc2hvcnRjdXRzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Tb3VyY2UgZWRpdG9yIGFuZCBYTUwgdG9vbHMga2V5Ym9hcmQgc2hvcnRjdXRzPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhNTCwgWFNELAotV1NETCwgSFRNTCwgSlNQLCBDU1MgYW5kIERURCBlZGl0b3JzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNob3J0Y3V0cyBhdmFpbGFibGUgaW4gYWxsIHNvdXJjZSBlZGl0b3JzPC9oND48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAwRDAiPkNvbW1hbmQ8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMEQ2Ij5TaG9ydGN1dDwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQwIj5HbyBUbyBNYXRjaGluZyBCcmFja2V0PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDYiPkN0cmwrU2hpZnQrUDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQwIj5SZXN0b3JlIExhc3QgU2VsZWN0aW9uPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDYiPkF0bCtTaGlmdCtEb3duPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDAiPlNlbGVjdCBFbmNsb3NpbmcgRWxlbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQ2Ij5BbHQrU2hpZnQrVXA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBEMCI+U2VsZWN0IE5leHQgRWxlbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQ2Ij5BbHQrU2hpZnQrUmlnaHQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBEMCI+U2VsZWN0IFByZXZpb3VzIEVsZW1lbnQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBENiI+QWx0K1NoaWZ0K0xlZnQ8L3RkPgotCi08L3RyPgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIHRoZSBYTUwsIFhTRCwgV1NETCwgSFRNTCwgSlNQLCBhbmQKLUNTUyBlZGl0b3JzIChleGNsdWRlcyB0aGUgRFREIGVkaXRvcik8L2g0Pjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgYm9yZGVyPSIxIiBjbGFzcz0ic2ltcGxldGFibGVib3JkZXIiPgotPHRyPgotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDE0QiI+Q29tbWFuZDwvdGg+Ci0KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAxNTEiPlNob3J0Y3V0PC90aD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxNEIiPkZvcm1hdDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTUxIj5DdHJsK1NoaWZ0K0Y8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE0QiI+Rm9ybWF0IEFjdGl2ZSBFbGVtZW50czwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTUxIj5DdHJsK0k8L3RkPgotCi08L3RyPgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIHRoZSBYTUwsIFhTRCwgV1NETCwgSFRNTCwgYW5kIEpTUCBlZGl0b3JzCi0oZXhjbHVkZXMgdGhlIERURCBhbmQgQ1NTIGVkaXRvcnMpPC9oND48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAxOTAiPkNvbW1hbmQ8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMTk2Ij5TaG9ydGN1dDwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5BZGQgQmxvY2sgQ29tbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTk2Ij5DdHJsK1NoaWZ0Ky88L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MCI+R28gVG8gTWF0Y2hpbmcgVGFnPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTYiPkN0cmwrU2hpZnQrJmd0OzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5HbyBUbyBOZXh0IFNpYmxpbmc8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtEb3duPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPk9jY3VycmVuY2VzIGluIEZpbGU8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtBPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPk9wZW4gU2VsZWN0aW9uPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTYiPkYzPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPkdvIFRvIFByZXZpb3VzIFNpYmxpbmc8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtVcDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5SZW1vdmUgQmxvY2sgQ29tbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTk2Ij5DdHJsK1NoaWZ0K1w8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MCI+VG9nZ2xlIENvbW1lbnQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtDPC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgZGVzaWduIHZpZXcgb2YgdGhlIFhTRCBhbmQgV1NETAotZWRpdG9yczwvaDQ+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBib3JkZXI9IjEiIGNsYXNzPSJzaW1wbGV0YWJsZWJvcmRlciI+Ci08dHI+Ci08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMjQxIj5Db21tYW5kPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDI0NyI+U2hvcnRjdXQ8L3RoPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0MSI+Wm9vbSBJbjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjQ3Ij5DdHJsKz08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0MSI+Wm9vbSBPdXQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0NyI+Q3RybCstPC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgZGVzaWduIHZpZXcgb2YgdGhlIFdTREwgZWRpdG9yPC9oND48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAyODYiPkNvbW1hbmQ8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMjhDIj5TaG9ydGN1dDwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjg2Ij5FeHBvcnQgRGlhZ3JhbSBhcyBJbWFnZTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjhDIj5DdHJsK1NoaWZ0K1g8L3RkPgotCi08L3RyPgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Yzc2YWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRjcmV0eG1sIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBYTUwgZmlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MDQotZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwNCi1zY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBjcmVhdGUgYSBuZXcNCi1YTUwgZmlsZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUgaWYgb25lIGRvZXMgbm90IGV4aXN0DQotYWxyZWFkeS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgd29ya2JlbmNoLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LiBDbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgWE1MIGZpbGUuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBuYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mDQotdGhlIFhNTCBmaWxlIGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIFRoZSBuYW1lIG9mIHlvdXIgWE1MIGZpbGUNCi1tdXN0IGVuZCBpbiA8dXNlcmlucHV0Pi54bWw8L3VzZXJpbnB1dD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPkNyZWF0ZSBYTUwgZmlsZSBmcm9tIGFuIFhNTCB0ZW1wbGF0ZTwvdWljb250cm9sPiByYWRpbw0KLWJ1dHRvbiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0LjwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+WW91IG1heSBjaG9vc2UgdG8gdmlldyBhbmQgZWRpdCB0aGUgWE1MIHRlbXBsYXRlcw0KLXRoYXQgd2lsbCBiZSB1c2VkIGluIHlvdXIgbmV3IFhNTCBmaWxlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48P1B1YiBDYXJldD8+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMDA0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOWYxMDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgWE1MIGZpbGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTCBlZGl0b3IuIFlvdSBjcmVhdGUgYSBuZXcgWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGNyZXhkdGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGNyZXh4c2QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHhlZHR0YWcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y3JldHhtbCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGNyZXR4bWwiPjxhIG5hbWU9InRjcmV0eG1sIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBYTUwgZmlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwKLWVkaXRvci4gWW91IGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MCi1zY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcKLVhNTCBmaWxlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+Q3JlYXRlIGEgcHJvamVjdCB0byBjb250YWluIHRoZSBYTUwgZmlsZSBpZiBvbmUgZG9lcyBub3QgZXhpc3QKLWFscmVhZHkuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgd29ya2JlbmNoLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGU8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+PC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPjwvc3Bhbj4uIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBYTUwgZmlsZS48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgbmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgdGhlIG5hbWUgb2YKLXRoZSBYTUwgZmlsZSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIFRoZSBuYW1lIG9mIHlvdXIgWE1MIGZpbGUKLW11c3QgZW5kIGluIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+LnhtbDwva2JkPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIFhNTCBmaWxlIGZyb20gYW4gWE1MIHRlbXBsYXRlPC9zcGFuPiByYWRpbwotYnV0dG9uIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0Ljwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5Zb3UgbWF5IGNob29zZSB0byB2aWV3IGFuZCBlZGl0IHRoZSBYTUwgdGVtcGxhdGVzCi10aGF0IHdpbGwgYmUgdXNlZCBpbiB5b3VyIG5ldyBYTUwgZmlsZS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImN3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idGNyZXhkdGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0Y3JleHhzZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZWZkZTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0Y3JleGR0ZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5HZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5DQotY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyDQotRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGgNCi15b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXINCi1EVEQuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0Y3JleGR0ZHwxfFhNTGZpbGVzZ2VuZXJhdGluZ2Zyb21EVERzIiBzdGF0dXM9Im5ldyI+WE1MDQotZmlsZXM8aW5kZXh0ZXJtPmdlbmVyYXRpbmcgZnJvbSBEVERzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9InRjcmV4ZHRkfDJ8RFREZ2VuZXJhdGluZ1hNTGZpbGVzIg0KLXN0YXR1cz0iY2hhbmdlZCI+RFREczxpbmRleHRlcm0+Z2VuZXJhdGluZyBYTUwgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkFmdGVyIHlvdSBoYXZlIGdlbmVyYXRlZCB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuIGZ1cnRoZXIgY3VzdG9taXplDQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlDQotUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREIGZpbGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgZmlsZSB0aGF0IHlvdSB3YW50IHRvDQotd29yayB3aXRoIGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhdGU8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciB0byBjb250YWluIHRoZSBYTUwgZmlsZSBhbmQgdHlwZSBhIG5hbWUNCi1mb3IgdGhlIGZpbGUgaW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5UaGUgbmFtZSBvZiB0aGUgZmlsZSBtdXN0IGVuZCBpbiA8dXNlcmlucHV0Pi54bWw8L3VzZXJpbnB1dD4uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQ8L3VpY29udHJvbD4gb2YgdGhlIFhNTCBmaWxlLjwvY21kPg0KLTxpbmZvPlRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXINCi1lbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCB0aGUgZWxlbWVudHMgdGhhdCB5b3UgaGF2ZSBkZWZpbmVkIGluIHRoZSBEVEQgd2lsbA0KLWJlIHNob3duIGluIHRoZSA8dWljb250cm9sPlJvb3QgZWxlbWVudDwvdWljb250cm9sPiBsaXN0LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIGNvbnRlbnQgb3B0aW9uczogIDwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgYXR0cmlidXRlczwvdWljb250cm9sPjogYm90aCBtYW5kYXRvcnkNCi1hbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIG9wdGlvbmFsIGVsZW1lbnRzPC91aWNvbnRyb2w+OiBib3RoIG1hbmRhdG9yeSBhbmQNCi1vcHRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2U8L3VpY29udHJvbD46IHRoZQ0KLWZpcnN0IG9wdGlvbiBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5GaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggZGF0YTwvdWljb250cm9sPjogYW55DQotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPiBJZiB5b3UgZG8gbm90IHNlbGVjdCBhbnkgb2YgdGhlc2Ugb3B0aW9ucywgdGhlbiBvbmx5IHRoZSBtaW5pbXVtIGFtb3VudA0KLW9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+UHVibGljIElEPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+U3lzdGVtDQotSUQ8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+WW91IGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYm90aC4gSWYgeW91IGRvLCB0aGUNCi1QdWJsaWMgSUQgd2lsbCBiZSB1c2VkIGJlZm9yZSB0aGUgU3lzdGVtIElELiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5UaGUgWE1MIGZpbGUgd2lsbCBvbmx5IGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55DQotZWxlbWVudHMgb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzLA0KLWF0dHJpYnV0ZXMsIGVudGl0aWVzLCBhbmQgbm90YXRpb25zIHRvIHRoZSBYTUwgZmlsZSwgaG93ZXZlciwgdGhleSBtdXN0IGZvbGxvdw0KLXRoZSBydWxlcyBlc3RhYmxpc2hlZCBpbiB0aGUgRFREIHRoYXQgeW91IHVzZWQgdG8gY3JlYXRlIHRoZSBYTUwgZmlsZS48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ0Y2Y0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBEVEQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgZ2VuZXJhdGluZyBmcm9tIERURHMsIERURHMsIGdlbmVyYXRpbmcgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBnZW5lcmF0aW5nIGZyb20gRFREcywgRFREcywgZ2VuZXJhdGluZyBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y3JleGR0ZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV4ZHRkIj48YSBuYW1lPSJ0Y3JleGR0ZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseQotY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyCi1EVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aAoteW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyCi1EVEQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUKLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgZmlsZSB0aGF0IHlvdSB3YW50IHRvCi13b3JrIHdpdGggYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYXRlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZTwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyIHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlIGFuZCB0eXBlIGEgbmFtZQotZm9yIHRoZSBmaWxlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIE5hbWU8L3NwYW4+IGZpZWxkLCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBtdXN0IGVuZCBpbiA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPi54bWw8L2tiZD4uCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50PC9zcGFuPiBvZiB0aGUgWE1MIGZpbGUuPC9zcGFuPgotIFRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXIKLWVsZW1lbnRzIGluIHRoYXQgZmlsZS4gQWxsIHRoZSBlbGVtZW50cyB0aGF0IHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlIERURCB3aWxsCi1iZSBzaG93biBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50PC9zcGFuPiBsaXN0LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6ICA8L3NwYW4+Ci08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIG9wdGlvbmFsIGF0dHJpYnV0ZXM8L3NwYW4+OiBib3RoIG1hbmRhdG9yeQotYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBvcHRpb25hbCBlbGVtZW50czwvc3Bhbj46IGJvdGggbWFuZGF0b3J5IGFuZAotb3B0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBmaXJzdCBjaG9pY2Ugb2YgcmVxdWlyZWQgY2hvaWNlPC9zcGFuPjogdGhlCi1maXJzdCBvcHRpb24gb2YgYSByZXF1aXJlZCBjaG9pY2Ugd2lsbCBiZSBnZW5lcmF0ZWQgaW4geW91ciBYTUwgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3aXRoIGRhdGE8L3NwYW4+OiBhbnkKLWVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGdlbmVyYXRlZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHNhbXBsZSBkYXRhLjwvbGk+Ci0KLTwvdWw+Ci0KLSAgSWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bSBhbW91bnQKLW9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMgSUQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5c3RlbQotSUQ8L3NwYW4+Ljwvc3Bhbj4gWW91IGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYm90aC4gSWYgeW91IGRvLCB0aGUKLVB1YmxpYyBJRCB3aWxsIGJlIHVzZWQgYmVmb3JlIHRoZSBTeXN0ZW0gSUQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBmaWxlIHdpbGwgb25seSBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQgYW5kIGFueQotZWxlbWVudHMgb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzLAotYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMgdG8gdGhlIFhNTCBmaWxlLCBob3dldmVyLCB0aGV5IG11c3QgZm9sbG93Ci10aGUgcnVsZXMgZXN0YWJsaXNoZWQgaW4gdGhlIERURCB0aGF0IHlvdSB1c2VkIHRvIGNyZWF0ZSB0aGUgWE1MIGZpbGUuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MIGVkaXRvci4gWW91IGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIj5DcmVhdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JleHhzZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiB0aXRsZT0iVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLiI+RWRpdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmEzODczLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGNyZXh4c2QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8NCi1xdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwNCi1maWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeQ0KLWFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cw0KLWFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRjcmV4eHNkfDF8WE1MZmlsZXNnZW5lcmF0aW5nZnJvbVhNTHNjaGVtYXMiDQotc3RhdHVzPSJuZXciPlhNTCBmaWxlczxpbmRleHRlcm0+Z2VuZXJhdGluZyBmcm9tIFhNTCBzY2hlbWFzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybSBrZXlyZWY9InRjcmV4eHNkfDJ8WE1Mc2NoZW1hc2dlbmVyYXRpbmdYTUxmaWxlcyIgc3RhdHVzPSJjaGFuZ2VkIj5zY2hlbWFzPGluZGV4dGVybT5nZW5lcmF0aW5nDQotWE1MIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRjcmV4eHNkfDExfFhNTGZpbGVzc2NoZW1hcyIgc3RhdHVzPSJuZXciPlhNTA0KLWZpbGVzPGluZGV4dGVybT5zY2hlbWFzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQ0KLWl0IGluIHRoZSBYTUwgZWRpdG9yLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZQ0KLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi1nZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgc2NoZW1hIGZpbGUgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGljayB0aGUgWE1MIHNjaGVtYSBmaWxlIHRoYXQgeW91DQotd2FudCB0byB3b3JrIHdpdGggYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5HZW5lcmF0ZTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+WE1MIEZpbGU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciB0byBjb250YWluIHRoZSBYTUwgZmlsZSBhbmQgdHlwZSBhIG5hbWUNCi1mb3IgdGhlIGZpbGUgaW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5UaGUgbmFtZSBvZiB0aGUgZmlsZSBtdXN0IGVuZCBpbiA8dXNlcmlucHV0Pi54bWw8L3VzZXJpbnB1dD4uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQ8L3VpY29udHJvbD4gb2YgdGhlIFhNTCBmaWxlLjwvY21kPg0KLTxpbmZvPlRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXINCi1lbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCBvZiB0aGUgZ2xvYmFsIGVsZW1lbnRzIHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlDQotWE1MIHNjaGVtYSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBSb290IGVsZW1lbnQgbGlzdC4gSWYgeW91IGRvIG5vdCBoYXZlIGFueQ0KLWdsb2JhbCBlbGVtZW50cyBpbiB5b3VyIFhNTCBzY2hlbWEsIHlvdSBjYW5ub3QgY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gaXQuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBmcm9tIHRoZSBmb2xsb3dpbmcgY29udGVudCBvcHRpb25zOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgYXR0cmlidXRlczwvdWljb250cm9sPjogYm90aCBtYW5kYXRvcnkNCi1hbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIG9wdGlvbmFsIGVsZW1lbnRzPC91aWNvbnRyb2w+OiBib3RoIG1hbmRhdG9yeSBhbmQNCi1vcHRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2U8L3VpY29udHJvbD46IHRoZQ0KLWZpcnN0IG9wdGlvbiBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5GaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggZGF0YTwvdWljb250cm9sPjogYW55DQotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPklmIHlvdSBkbyBub3Qgc2VsZWN0IGFueSBvZiB0aGVzZSBvcHRpb25zLCB0aGVuIG9ubHkgdGhlIG1pbmltdW0gYW1vdW50DQotb2YgY29udGVudCByZXF1aXJlZCBmb3IgdGhlIFhNTCBmaWxlIHdpbGwgYmUgY3JlYXRlZC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIE5hbWVzcGFjZSBJbmZvcm1hdGlvbiBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQ0KLXRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEsIGl0cyBwcmVmaXgsIGFuZCB0aGUgc2NoZW1hIGxvY2F0aW9uLiBTZWxlY3QNCi10aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPjx1bD4NCi08bGk+VGhlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk5hbWVzcGFjZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkIGlzIHRoZSB0YXJnZXQNCi1uYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEuIFlvdXIgWE1MIGZpbGUgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZQ0KLW5hbWVzcGFjZSBhcyBpdHMgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGguPC9saT4NCi08bGk+QWxsIHF1YWxpZmllZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoDQotdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDx1aWNvbnRyb2w+UHJlZml4PC91aWNvbnRyb2w+IHZhbHVlLjwvbGk+DQotPGxpPlRoZSAgPHVpY29udHJvbD5Mb2NhdGlvbiBIaW50PC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zIHRoZSBsb2NhdGlvbg0KLW9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+DQotPC91bD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBuYW1lc3BhY2VzIGFuZCBuYW1lc3BhY2UgcHJlZml4ZXMsIHJlZmVyIHRvDQotdGhlIHJlbGF0ZWQgcmVmZXJlbmNlcy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiBhbmQgdGhlbiA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPlRoZSBYTUwgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55IGVsZW1lbnRzDQotb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gSXQgYWxzbyBjb250YWlucyBpbmZvcm1hdGlvbg0KLWFib3V0IHRoZSBYTUwgZmlsZSBuYW1lc3BhY2UgYW5kIGxvY2F0aW9uLiBZb3UgY2FuIG5vdyBhZGQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMNCi10byB0aGUgWE1MIGZpbGUuPC9wPjxub3RlPkluIGNlcnRhaW4gY2FzZXMsIHdoZW4gYW4gWE1MIGZpbGUgaXMgZ2VuZXJhdGVkDQotZnJvbSBhIGNvbXBsZXggWE1MIHNjaGVtYSBmaWxlLCB0aGUgWE1MIGZpbGUgbWlnaHQgbm90IGJlIHZhbGlkLiBJZiB0aGlzIG9jY3VycywNCi15b3UgY2FuIG9wZW4gdGhlIGdlbmVyYXRlZCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yIGFuZCBjb3JyZWN0IGFueSBlcnJvcnMgdGhhdA0KLW9jY3VyLiBVc3VhbGx5LCBvbmx5IGEgZmV3IGVycm9ycyBuZWVkIHRvIGJlIGZpeGVkLiBUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWENCi1jb25zdHJ1Y3RzIG1pZ2h0IHByZXNlbnQgcHJvYmxlbXM6PC9ub3RlPjx1bD4NCi08bGk+UmVzdHJpY3Rpb25zOiBzb21ldGltZXMgcmVzdHJpY3RlZCBlbGVtZW50cyBhcmUgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLiA8L2xpPg0KLTxsaT5GYWNldHM6IGRlZmF1bHQgZ2VuZXJhdGVkIGRhdGEgdmFsdWVzIG1pZ2h0IG5vdCBjb25mb3JtIHRvIGNvbXBsZXggZmFjZXRzDQotKGZvciBleGFtcGxlLCBwYXR0ZXJucykuPC9saT4NCi08bGk+QWJzdHJhY3QgZWxlbWVudHM6IGFic3RyYWN0IGVsZW1lbnRzIGFyZSBzb21ldGltZXMgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLjwvbGk+DQotPC91bD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNTMzYWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGdlbmVyYXRpbmcgZnJvbSBYTUwgc2NoZW1hcywgc2NoZW1hcywgZ2VuZXJhdGluZyBYTUwgZmlsZXMsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgZ2VuZXJhdGluZyBmcm9tIFhNTCBzY2hlbWFzLCBzY2hlbWFzLCBnZW5lcmF0aW5nIFhNTCBmaWxlcywgWE1MIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JleGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRjcmV4eHNkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIGFuIFhNTCBzY2hlbWE8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV4eHNkIj48YSBuYW1lPSJ0Y3JleHhzZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0bwotcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MCi1maWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeQotYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzCi1hbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUKLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSBhIHNjaGVtYSBmaWxlIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBYTUwgc2NoZW1hIGZpbGUgdGhhdCB5b3UKLXdhbnQgdG8gd29yayB3aXRoIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmF0ZTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBGaWxlPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgcHJvamVjdCBvciBmb2xkZXIgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUgYW5kIHR5cGUgYSBuYW1lCi1mb3IgdGhlIGZpbGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgTmFtZTwvc3Bhbj4gZmllbGQsIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotIFRoZSBuYW1lIG9mIHRoZSBmaWxlIG11c3QgZW5kIGluIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+LnhtbDwva2JkPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Sb290IGVsZW1lbnQ8L3NwYW4+IG9mIHRoZSBYTUwgZmlsZS48L3NwYW4+Ci0gVGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlcgotZWxlbWVudHMgaW4gdGhhdCBmaWxlLiBBbGwgb2YgdGhlIGdsb2JhbCBlbGVtZW50cyB5b3UgaGF2ZSBkZWZpbmVkIGluIHRoZQotWE1MIHNjaGVtYSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBSb290IGVsZW1lbnQgbGlzdC4gSWYgeW91IGRvIG5vdCBoYXZlIGFueQotZ2xvYmFsIGVsZW1lbnRzIGluIHlvdXIgWE1MIHNjaGVtYSwgeW91IGNhbm5vdCBjcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBpdC4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6PC9zcGFuPgotPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBvcHRpb25hbCBhdHRyaWJ1dGVzPC9zcGFuPjogYm90aCBtYW5kYXRvcnkKLWFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgb3B0aW9uYWwgZWxlbWVudHM8L3NwYW4+OiBib3RoIG1hbmRhdG9yeSBhbmQKLW9wdGlvbmFsIGVsZW1lbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgZmlyc3QgY2hvaWNlIG9mIHJlcXVpcmVkIGNob2ljZTwvc3Bhbj46IHRoZQotZmlyc3Qgb3B0aW9uIG9mIGEgcmVxdWlyZWQgY2hvaWNlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHlvdXIgWE1MIGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgd2l0aCBkYXRhPC9zcGFuPjogYW55Ci1lbGVtZW50cyBhbmQgYXR0cmlidXRlcyBnZW5lcmF0ZWQgd2lsbCBiZSBmaWxsZWQgd2l0aCBzYW1wbGUgZGF0YS48L2xpPgotCi08L3VsPgotCi0gSWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bSBhbW91bnQKLW9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgTmFtZXNwYWNlIEluZm9ybWF0aW9uIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi10YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBYTUwgc2NoZW1hLCBpdHMgcHJlZml4LCBhbmQgdGhlIHNjaGVtYSBsb2NhdGlvbi4gU2VsZWN0Ci10aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4uPC9zcGFuPiA8dWw+Ci08bGk+VGhlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lc3BhY2UgTmFtZTwvc3Bhbj4gZmllbGQgaXMgdGhlIHRhcmdldAotbmFtZXNwYWNlIG9mIHRoZSBYTUwgc2NoZW1hLiBZb3VyIFhNTCBmaWxlIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUKLW5hbWVzcGFjZSBhcyBpdHMgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGguPC9saT4KLQotPGxpPkFsbCBxdWFsaWZpZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aAotdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeDwvc3Bhbj4gdmFsdWUuPC9saT4KLQotPGxpPlRoZSAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb24gSGludDwvc3Bhbj4gZmllbGQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi1vZiB0aGUgWE1MIHNjaGVtYS48L2xpPgotCi08L3VsPgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbmFtZXNwYWNlcyBhbmQgbmFtZXNwYWNlIHByZWZpeGVzLCByZWZlciB0bwotdGhlIHJlbGF0ZWQgcmVmZXJlbmNlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBhbmQgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55IGVsZW1lbnRzCi1vciBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgcm9vdCBlbGVtZW50LiBJdCBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgWE1MIGZpbGUgbmFtZXNwYWNlIGFuZCBsb2NhdGlvbi4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCi10byB0aGUgWE1MIGZpbGUuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEluIGNlcnRhaW4gY2FzZXMsIHdoZW4gYW4gWE1MIGZpbGUgaXMgZ2VuZXJhdGVkCi1mcm9tIGEgY29tcGxleCBYTUwgc2NoZW1hIGZpbGUsIHRoZSBYTUwgZmlsZSBtaWdodCBub3QgYmUgdmFsaWQuIElmIHRoaXMgb2NjdXJzLAoteW91IGNhbiBvcGVuIHRoZSBnZW5lcmF0ZWQgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciBhbmQgY29ycmVjdCBhbnkgZXJyb3JzIHRoYXQKLW9jY3VyLiBVc3VhbGx5LCBvbmx5IGEgZmV3IGVycm9ycyBuZWVkIHRvIGJlIGZpeGVkLiBUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEKLWNvbnN0cnVjdHMgbWlnaHQgcHJlc2VudCBwcm9ibGVtczo8L2Rpdj4KLTx1bD4KLTxsaT5SZXN0cmljdGlvbnM6IHNvbWV0aW1lcyByZXN0cmljdGVkIGVsZW1lbnRzIGFyZSBlcnJvbmVvdXNseSBnZW5lcmF0ZWQuIDwvbGk+Ci0KLTxsaT5GYWNldHM6IGRlZmF1bHQgZ2VuZXJhdGVkIGRhdGEgdmFsdWVzIG1pZ2h0IG5vdCBjb25mb3JtIHRvIGNvbXBsZXggZmFjZXRzCi0oZm9yIGV4YW1wbGUsIHBhdHRlcm5zKS48L2xpPgotCi08bGk+QWJzdHJhY3QgZWxlbWVudHM6IGFic3RyYWN0IGVsZW1lbnRzIGFyZSBzb21ldGltZXMgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi4iPkNyZWF0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV4ZHRkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIj5YTUwgbmFtZXNwYWNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDQzY2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0Y25zdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mDQotY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzDQotb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbg0KLXRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmVkaXRpbmcgd2l0aCBjb25zdHJhaW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nIHdpdGggY29uc3RyYWludHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPiBXaGVuIHRoZSBjb25zdHJhaW50cyBhcmUgdHVybmVkIG9uLCBhbmQgeW91IGFyZSB3b3JraW5nIGluIHRoZQ0KLURlc2lnbiB2aWV3LCB0aGUgWE1MIGVkaXRvciBwcmV2ZW50cyB5b3UgZnJvbSBpbnNlcnRpbmcgZWxlbWVudHMsIGF0dHJpYnV0ZXMsDQotb3IgYXR0cmlidXRlIHZhbHVlcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBydWxlcyBvZiB0aGUgWE1MIHNjaGVtYSBvciBEVEQsIGFuZA0KLWZyb20gcmVtb3ZpbmcgbmVjZXNzYXJ5IG9yIHByZWRlZmluZWQgc2V0cyBvZiB0YWdzIGFuZCB2YWx1ZXMuIEluIHRoaXMgbW9kZSwNCi1hbiBlbGVtZW50J3MgY29udGVudCBtdXN0IGJlIHZhbGlkIHRvIHVzZSB0aGUgWE1MIGVkaXRvcidzIGd1aWRlZCBlZGl0aW5nDQotb3B0aW9ucy48L3A+PHA+WW91IG1pZ2h0IHdhbnQgdG8gdHVybiB0aGUgY29uc3RyYWludHMgb2ZmIGZvciBhbiBYTUwgZmlsZQ0KLWlmIHlvdSBuZWVkIG1vcmUgZmxleGliaWxpdHkuIEZvciBleGFtcGxlLCB5b3Ugd2FudCB0byB0cnkgd29ya2luZyB3aXRoIGVsZW1lbnRzDQotb3IgYXR0cmlidXRlcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBhc3NvY2lhdGVkIERURCBvciBYTUwgc2NoZW1hLCB3aXRob3V0IGFjdHVhbGx5DQotcmVtb3ZpbmcgdGhlIGFzc29jaWF0aW9uIHdpdGggdGhlIERURCBvciBYTUwgc2NoZW1hLjwvcD48cD5UbyB0dXJuIHRoZSBjb25zdHJhaW50cw0KLWZvciBhbiBYTUwgZmlsZSBvZmYsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+VHVybg0KLUdyYW1tYXIgQ29uc3RyYWludHMgT2ZmPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gaW4gdGhlIHRvb2xiYXIuIEFmdGVyIHlvdQ0KLWhhdmUgdHVybmVkIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGEgZmlsZSwgeW91IGNhbiBpbnNlcnQgb3IgZGVsZXRlIGFueSBlbGVtZW50DQotb3IgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIHJ1bGVzLiBZb3UgY2FuIGNyZWF0ZSBuZXcNCi1lbGVtZW50cyBvciBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgRFREIG9yIHNjaGVtYSAtIHRoZXNlIERlc2lnbiB2aWV3DQotcHJvbXB0cyB3aWxsIG9ubHkgYXBwZWFyIHdoZW4geW91IGhhdmUgdHVybmVkIGNvbnN0cmFpbnRzIG9mZi4gVGhlIGZpbGUgbWlnaHQNCi1ub3QgYmUgdmFsaWQsIGhvd2V2ZXIsIGlmIHlvdSBkbyB0aGlzLiA8L3A+PHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzDQotd2hhdCB5b3UgY2FuIGRvIGlmIHlvdSB0dXJuIHRoZSBjb25zdHJhaW50cyBvZiBhIERURCBvZmY6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciAocmlnaHQtY2xpY2sgdGhlIGZpbGUgaW4gdGhlDQotTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T3BlbiBXaXRoID4gWE1MIEVkaXRvcjwvdWljb250cm9sPikuIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBoYXZlIGEgRFREIHRoYXQgc3BlY2lmaWVzIHRoYXQgYW4gZWxlbWVudCByZXF1aXJlcyBhdCBsZWFzdA0KLW9uZSBvZiBhIHNwZWNpZmljIGNoaWxkIGVsZW1lbnQ6ICA8L2NtZD48aW5mbz48Y29kZWJsb2NrPiZsdDshRUxFTUVOVCBwYXJlbnRFbGVtZW50IChjaGlsZEVsZW1lbnQrKT4NCi08L2NvZGVibG9jaz48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYsIGluIGFuIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgeW91IGF0dGVtcHQgdG8gcmVtb3ZlDQotdGhlIGZpbmFsIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGUgRFREIGNvbnN0cmFpbnRzIHR1cm5lZCBvbiwNCi10aGUgZWRpdG9yIHdpbGwgbm90IGFsbG93IHlvdSB0byBkbyB0aGlzLCBhcyBpdCB3aWxsIG1ha2UgdGhlIGRvY3VtZW50IGludmFsaWQuPC9jbWQ+DQotPGluZm8+WW91IGNhbiBjb25maXJtIHRoaXMgYnkgdXNpbmcgdGhlIGVsZW1lbnQncyBwb3AtdXAgbWVudSB0byB2ZXJpZnkgdGhhdA0KLXRoZSA8dWljb250cm9sPlJlbW92ZTwvdWljb250cm9sPiBvcHRpb24gaXMgZ3JheWVkIG91dC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gdHVybiB0aGUgRFREIGNvbnN0cmFpbnRzIG9mZiwgY2xpY2sgPHVpY29udHJvbD5YTUwgPiBUdXJuIEdyYW1tYXINCi1Db25zdHJhaW50cyBPZmY8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBhdHRlbXB0IHRvIHJlbW92ZSB0aGUgc2FtZSBjaGlsZCBlbGVtZW50IHdpdGggY29uc3RyYWludHMNCi1vZmYsIHRoZSBlZGl0b3Igd2lsbCBhbGxvdyB5b3UgdG8uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gY29ycmVjdCB0aGUgaW52YWxpZCBkb2N1bWVudCwgeW91IHdpbGwgaGF2ZSB0byByZS1hZGQgdGhlIG5lY2Vzc2FyeQ0KLWVsZW1lbnQsIG9yIHJlbW92ZSB0aGUgaW52YWxpZCB0YWdnaW5nIG9yIHZhbHVlLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PD9QdWIgQ2FyZXQ/PjxwPklmIHlvdSBpbnRyb2R1Y2UgZXJyb3JzIGludG8geW91ciBmaWxlcywgeW91IG11c3QNCi1zYXZlIGFuZCB2YWxpZGF0ZSB0aGUgZmlsZSBpbiBvcmRlciB0byBzZWUgYSBsaXN0IG9mIHRoZSBlcnJvcnMgeW91IGhhdmUgaW50cm9kdWNlZC4NCi1UaGV5IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiBBZnRlciB5b3UgZml4IHRoZSBlcnJvcnMsIHlvdSBtdXN0DQotc2F2ZSBhbmQgdmFsaWRhdGUgeW91ciBmaWxlIGFnYWluIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBub3cgdmFsaWQuPC9wPjxwPlRoZXNlDQotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28NCi13b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzgxND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTc0YjQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgZWRpdGluZyB3aXRoIGNvbnN0cmFpbnRzLCBYTUwgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nIHdpdGggY29uc3RyYWludHMsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0Y25zdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdGNuc3QiPjxhIG5hbWU9InRlZHRjbnN0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZgotY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzCi1vbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluCi10aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiBXaGVuIHRoZSBjb25zdHJhaW50cyBhcmUgdHVybmVkIG9uLCBhbmQgeW91IGFyZSB3b3JraW5nIGluIHRoZQotRGVzaWduIHZpZXcsIHRoZSBYTUwgZWRpdG9yIHByZXZlbnRzIHlvdSBmcm9tIGluc2VydGluZyBlbGVtZW50cywgYXR0cmlidXRlcywKLW9yIGF0dHJpYnV0ZSB2YWx1ZXMgbm90IHBlcm1pdHRlZCBieSB0aGUgcnVsZXMgb2YgdGhlIFhNTCBzY2hlbWEgb3IgRFRELCBhbmQKLWZyb20gcmVtb3ZpbmcgbmVjZXNzYXJ5IG9yIHByZWRlZmluZWQgc2V0cyBvZiB0YWdzIGFuZCB2YWx1ZXMuIEluIHRoaXMgbW9kZSwKLWFuIGVsZW1lbnQncyBjb250ZW50IG11c3QgYmUgdmFsaWQgdG8gdXNlIHRoZSBYTUwgZWRpdG9yJ3MgZ3VpZGVkIGVkaXRpbmcKLW9wdGlvbnMuPC9wPgotPHA+WW91IG1pZ2h0IHdhbnQgdG8gdHVybiB0aGUgY29uc3RyYWludHMgb2ZmIGZvciBhbiBYTUwgZmlsZQotaWYgeW91IG5lZWQgbW9yZSBmbGV4aWJpbGl0eS4gRm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIHRyeSB3b3JraW5nIHdpdGggZWxlbWVudHMKLW9yIGF0dHJpYnV0ZXMgbm90IHBlcm1pdHRlZCBieSB0aGUgYXNzb2NpYXRlZCBEVEQgb3IgWE1MIHNjaGVtYSwgd2l0aG91dCBhY3R1YWxseQotcmVtb3ZpbmcgdGhlIGFzc29jaWF0aW9uIHdpdGggdGhlIERURCBvciBYTUwgc2NoZW1hLjwvcD4KLTxwPlRvIHR1cm4gdGhlIGNvbnN0cmFpbnRzCi1mb3IgYW4gWE1MIGZpbGUgb2ZmLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UdXJuCi1HcmFtbWFyIENvbnN0cmFpbnRzIE9mZjwvc3Bhbj48L3NwYW4+IGluIHRoZSB0b29sYmFyLiBBZnRlciB5b3UKLWhhdmUgdHVybmVkIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGEgZmlsZSwgeW91IGNhbiBpbnNlcnQgb3IgZGVsZXRlIGFueSBlbGVtZW50Ci1vciBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgcnVsZXMuIFlvdSBjYW4gY3JlYXRlIG5ldwotZWxlbWVudHMgb3IgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgaW4gdGhlIERURCBvciBzY2hlbWEgLSB0aGVzZSBEZXNpZ24gdmlldwotcHJvbXB0cyB3aWxsIG9ubHkgYXBwZWFyIHdoZW4geW91IGhhdmUgdHVybmVkIGNvbnN0cmFpbnRzIG9mZi4gVGhlIGZpbGUgbWlnaHQKLW5vdCBiZSB2YWxpZCwgaG93ZXZlciwgaWYgeW91IGRvIHRoaXMuIDwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cwotd2hhdCB5b3UgY2FuIGRvIGlmIHlvdSB0dXJuIHRoZSBjb25zdHJhaW50cyBvZiBhIERURCBvZmY6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IgKHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZQotTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aCAmZ3Q7IFhNTCBFZGl0b3I8L3NwYW4+KS4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgaGF2ZSBhIERURCB0aGF0IHNwZWNpZmllcyB0aGF0IGFuIGVsZW1lbnQgcmVxdWlyZXMgYXQgbGVhc3QKLW9uZSBvZiBhIHNwZWNpZmljIGNoaWxkIGVsZW1lbnQ6ICA8L3NwYW4+IDxwcmU+Jmx0OyFFTEVNRU5UIHBhcmVudEVsZW1lbnQgKGNoaWxkRWxlbWVudCspJmd0OwotPC9wcmU+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmLCBpbiBhbiBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIHlvdSBhdHRlbXB0IHRvIHJlbW92ZQotdGhlIGZpbmFsIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGUgRFREIGNvbnN0cmFpbnRzIHR1cm5lZCBvbiwKLXRoZSBlZGl0b3Igd2lsbCBub3QgYWxsb3cgeW91IHRvIGRvIHRoaXMsIGFzIGl0IHdpbGwgbWFrZSB0aGUgZG9jdW1lbnQgaW52YWxpZC48L3NwYW4+Ci0gWW91IGNhbiBjb25maXJtIHRoaXMgYnkgdXNpbmcgdGhlIGVsZW1lbnQncyBwb3AtdXAgbWVudSB0byB2ZXJpZnkgdGhhdAotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbW92ZTwvc3Bhbj4gb3B0aW9uIGlzIGdyYXllZCBvdXQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyB0dXJuIHRoZSBEVEQgY29uc3RyYWludHMgb2ZmLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgJmd0OyBUdXJuIEdyYW1tYXIKLUNvbnN0cmFpbnRzIE9mZjwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBhdHRlbXB0IHRvIHJlbW92ZSB0aGUgc2FtZSBjaGlsZCBlbGVtZW50IHdpdGggY29uc3RyYWludHMKLW9mZiwgdGhlIGVkaXRvciB3aWxsIGFsbG93IHlvdSB0by48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBjb3JyZWN0IHRoZSBpbnZhbGlkIGRvY3VtZW50LCB5b3Ugd2lsbCBoYXZlIHRvIHJlLWFkZCB0aGUgbmVjZXNzYXJ5Ci1lbGVtZW50LCBvciByZW1vdmUgdGhlIGludmFsaWQgdGFnZ2luZyBvciB2YWx1ZS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+SWYgeW91IGludHJvZHVjZSBlcnJvcnMgaW50byB5b3VyIGZpbGVzLCB5b3UgbXVzdAotc2F2ZSBhbmQgdmFsaWRhdGUgdGhlIGZpbGUgaW4gb3JkZXIgdG8gc2VlIGEgbGlzdCBvZiB0aGUgZXJyb3JzIHlvdSBoYXZlIGludHJvZHVjZWQuCi1UaGV5IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiBBZnRlciB5b3UgZml4IHRoZSBlcnJvcnMsIHlvdSBtdXN0Ci1zYXZlIGFuZCB2YWxpZGF0ZSB5b3VyIGZpbGUgYWdhaW4gdG8gc2VlIGlmIHRoZSBmaWxlIGlzIG5vdyB2YWxpZC48L3A+Ci08cD5UaGVzZQotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28KLXdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiB0aXRsZT0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIHRpdGxlPSJBbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cyBhIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBMb2NhdGlvbiAoc2ltaWxhciB0byBhIFVSSSwgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBLZXkiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzA1MzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRkb2MiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nDQotb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbg0KLXRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RE9DVFlQRSBkZWNsYXJhdGlvbnM8aW5kZXh0ZXJtPlhNTCBlZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gZWRpdCB5b3VyIERPQ1RZUEUNCi1kZWNsYXJhdGlvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgPHVpY29udHJvbD5ET0NUWVBFPC91aWNvbnRyb2w+IGFuZA0KLWNsaWNrIDx1aWNvbnRyb2w+RWRpdCBET0NUWVBFPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQgbmFtZTwvdWljb250cm9sPiBmaWVsZA0KLXNob3VsZCBtYXRjaCB0aGUgcm9vdCBlbGVtZW50IG9mIHlvdXIgWE1MIGZpbGUgZXhhY3RseS48L2NtZD48aW5mbz5Zb3Ugc2hvdWxkDQotb25seSBlZGl0IHRoZSB2YWx1ZSBpbiB0aGlzIGZpZWxkIGlmIHlvdXIgcm9vdCBlbGVtZW50IGNoYW5nZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gc2VsZWN0IGEgUHVibGljIElEIGZvciBhbnkgZXhpc3RpbmcgWE1MIENhdGFsb2cgZW50cmllcw0KLWJ5IGNsaWNraW5nIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+LiA8L2NtZD48aW5mbz5UaGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+UHVibGljDQotSUQ8L3VpY29udHJvbD4gZmllbGQgaXMgdGhlIFB1YmxpYyBJZGVudGlmaWVyLiBJdCBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUNCi1YTUwgZmlsZSAodXNpbmcgYW4gWE1MIENhdGFsb2cgZW50cnkpIHdpdGggYSBEVEQgZmlsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sDQotc2VlIDx4cmVmIGZvcm1hdD0iZGl0YSIgaHJlZj0idHhtbGNhdC5kaXRhIiBzY29wZT0ibG9jYWwiPkFkZGluZyBlbnRyaWVzIHRvDQotdGhlIFhNTCBDYXRhbG9nPC94cmVmPi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPlN5c3RlbSBJRDwvdWljb250cm9sPiBmaWVsZCBpcyB0aGUNCi1EVEQgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4gVHlwZSB0aGUgcGF0aCBvZiB0aGUgRFREIGZpbGUgKG9yIGJyb3dzZQ0KLWZvciBpdCkgeW91IHdhbnQgdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBpbiB0aGlzIGZpZWxkLiA8L2NtZD48aW5mbz4gPG5vdGU+V2hlbg0KLXRoZSBYTUwgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIFhNTCBwcm9jZXNzb3IsIGl0IHdpbGwgZmlyc3QgdHJ5IHRvIHVzZSB0aGUNCi1QdWJsaWMgSUQgdG8gbG9jYXRlIHRoZSBEVEQsIGFuZCBpZiB0aGlzIGZhaWxzLCBpdCB3aWxsIHVzZSB0aGUgU3lzdGVtIElEDQotdG8gZmluZCBpdC48L25vdGU+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPklmIHlvdSBkbyBub3QgaGF2ZSBhIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4geW91ciBYTUwgZmlsZSwgeW91IGNhbg0KLXJpZ2h0LWNsaWNrIGluIHRoZSBEZXNpZ24gdmlldyBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgRFREIEluZm9ybWF0aW9uPC91aWNvbnRyb2w+IHRvDQotYWRkIG9uZS48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhYzBiNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iIC8+Ci08bWV0YSBjb250ZW50PSJET0NUWVBFIGRlY2xhcmF0aW9ucywgWE1MIGVkaXRvciIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zLCBYTUwgZWRpdG9yIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InR4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdGRvYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRkb2MiPjxhIG5hbWU9InRlZHRkb2MiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZwotb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbgotdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gZWRpdCB5b3VyIERPQ1RZUEUKLWRlY2xhcmF0aW9uLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RE9DVFlQRTwvc3Bhbj4gYW5kCi1jbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0IERPQ1RZUEU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50IG5hbWU8L3NwYW4+IGZpZWxkCi1zaG91bGQgbWF0Y2ggdGhlIHJvb3QgZWxlbWVudCBvZiB5b3VyIFhNTCBmaWxlIGV4YWN0bHkuPC9zcGFuPiBZb3Ugc2hvdWxkCi1vbmx5IGVkaXQgdGhlIHZhbHVlIGluIHRoaXMgZmllbGQgaWYgeW91ciByb290IGVsZW1lbnQgY2hhbmdlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gc2VsZWN0IGEgUHVibGljIElEIGZvciBhbnkgZXhpc3RpbmcgWE1MIENhdGFsb2cgZW50cmllcwotYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPi4gPC9zcGFuPiBUaGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlB1YmxpYwotSUQ8L3NwYW4+IGZpZWxkIGlzIHRoZSBQdWJsaWMgSWRlbnRpZmllci4gSXQgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlCi1YTUwgZmlsZSAodXNpbmcgYW4gWE1MIENhdGFsb2cgZW50cnkpIHdpdGggYSBEVEQgZmlsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sCi1zZWUgPGEgaHJlZj0idHhtbGNhdC5odG1sIj5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L2E+LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TeXN0ZW0gSUQ8L3NwYW4+IGZpZWxkIGlzIHRoZQotRFREIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIFR5cGUgdGhlIHBhdGggb2YgdGhlIERURCBmaWxlIChvciBicm93c2UKLWZvciBpdCkgeW91IHdhbnQgdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBpbiB0aGlzIGZpZWxkLiA8L3NwYW4+ICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gV2hlbgotdGhlIFhNTCBmaWxlIGlzIHByb2Nlc3NlZCBieSB0aGUgWE1MIHByb2Nlc3NvciwgaXQgd2lsbCBmaXJzdCB0cnkgdG8gdXNlIHRoZQotUHVibGljIElEIHRvIGxvY2F0ZSB0aGUgRFRELCBhbmQgaWYgdGhpcyBmYWlscywgaXQgd2lsbCB1c2UgdGhlIFN5c3RlbSBJRAotdG8gZmluZCBpdC48L2Rpdj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+SWYgeW91IGRvIG5vdCBoYXZlIGEgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuCi1yaWdodC1jbGljayBpbiB0aGUgRGVzaWduIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBEVEQgSW5mb3JtYXRpb248L3NwYW4+IHRvCi1hZGQgb25lLjwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImN4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0eG1sY2F0Lmh0bWwiIHRpdGxlPSJBbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cyBhIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBMb2NhdGlvbiAoc2ltaWxhciB0byBhIFVSSSwgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBLZXkiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idGVkdGdyYW0uaHRtbCIgdGl0bGU9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiI+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2JlZTFkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRlZHRlbmMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5TcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVyczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nDQotdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnNwZWNpZnlpbmcgbGluZSBkZWxpbWl0ZXJzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5saW5lIGRlbGltaXRlcnM8aW5kZXh0ZXJtPlhNTCBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPGtleXdvcmRzPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgeW91IHdhbnQgdG8gdXNlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgPHVpY29udHJvbD5FbmNvZGluZzwvdWljb250cm9sPiBmaWVsZCwgc3BlY2lmeSB0aGUgZGVmYXVsdA0KLWNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgWE1MIHJlbGF0ZWQgZmlsZXMgKERURHMsDQotWE1MIGZpbGVzLCBYTUwgc2NoZW1hcykuIENoYW5naW5nIHRoZSBlbmNvZGluZyBjYXVzZXMgYW55IG5ldywgWE1MIHJlbGF0ZWQNCi1maWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBpbiB0aGUgbGVmdCBwYW5lIG9mIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3cgYW5kIGNob3NlIGVpdGhlciA8dWljb250cm9sPkRlZmF1bHQ8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPiBpbg0KLXRoZSA8dWljb250cm9sPk5ldyB0ZXh0IGZpbGUgbGluZSBkZWxpbWl0ZXIgPC91aWNvbnRyb2w+c2VjdGlvbi4gU2VsZWN0IHRoZQ0KLW9wZXJhdGluZyBzeXN0ZW0gdGhhdCBhcHBsaWVzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybSBmcm9tDQotdGhlIDx1aWNvbnRyb2w+T3RoZXI8L3VpY29udHJvbD4gZHJvcCBkb3duIGxpc3QuPC9jbWQ+PC9zdGVwPjw/UHViIENhcmV0Pz4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkFwcGx5PC91aWNvbnRyb2w+LCB0aGVuIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjAwMj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhNmM5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgc3BlY2lmeWluZyBsaW5lIGRlbGltaXRlcnMsIGxpbmUgZGVsaW1pdGVycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgc3BlY2lmeWluZyBsaW5lIGRlbGltaXRlcnMsIGxpbmUgZGVsaW1pdGVycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdGVuYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNwZWNpZnlpbmcgbGluZSBkZWxpbWl0ZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0ZW5jIj48YSBuYW1lPSJ0ZWR0ZW5jIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVyczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZwotdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIHlvdSB3YW50IHRvIHVzZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLUZpbGVzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNvZGluZzwvc3Bhbj4gZmllbGQsIHNwZWNpZnkgdGhlIGRlZmF1bHQKLWNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgWE1MIHJlbGF0ZWQgZmlsZXMgKERURHMsCi1YTUwgZmlsZXMsIFhNTCBzY2hlbWFzKS4gQ2hhbmdpbmcgdGhlIGVuY29kaW5nIGNhdXNlcyBhbnkgbmV3LCBYTUwgcmVsYXRlZAotZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggdG8gdXNlIHRoZSBzZWxlY3RlZCBlbmNvZGluZy48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPgotPC9zcGFuPiBpbiB0aGUgbGVmdCBwYW5lIG9mIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3cgYW5kIGNob3NlIGVpdGhlciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWZhdWx0PC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj4gaW4KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcgdGV4dCBmaWxlIGxpbmUgZGVsaW1pdGVyIDwvc3Bhbj5zZWN0aW9uLiBTZWxlY3QgdGhlCi1vcGVyYXRpbmcgc3lzdGVtIHRoYXQgYXBwbGllcyB0byB5b3VyIGRldmVsb3BtZW50IG9yIGRlcGxveW1lbnQgcGxhdGZvcm0gZnJvbQotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPiBkcm9wIGRvd24gbGlzdC48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4sIHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODgxNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0Z3JhbSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aA0KLWFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgPHVpY29udHJvbD5YTUwgPiBSZWxvYWQgRGVwZW5kZW5jaWVzPC91aWNvbnRyb2w+IHRvDQotdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZQ0KLWd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+dXBkYXRpbmcgWE1MIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnVwZGF0aW5nIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYSBEVEQgZmlsZSBjYWxsZWQgIkNvbnRhY3QuZHRkIiBhbmQgYW4gWE1MDQotZmlsZSBjYWxsZWQgIkNvbnRhY3QueG1sIiBhc3NvY2lhdGVkIHdpdGggaXQuIENvbnRhY3QuZHRkIGNvbnRhaW5zIGEgcm9vdA0KLWVsZW1lbnQgY2FsbGVkIDx1c2VyaW5wdXQ+Q29udGFjdDwvdXNlcmlucHV0PiB0aGF0IGNhbiBjb250YWluIGFueSBvZiB0aGUNCi1mb2xsb3dpbmcgY2hpbGRyZW4gZWxlbWVudHM6ICA8dXNlcmlucHV0Pk5hbWU8L3VzZXJpbnB1dD4sIDx1c2VyaW5wdXQ+UG9zdGFsQWRkcmVzczwvdXNlcmlucHV0Piw8P1B1YiBDYXJldD8+IDx1c2VyaW5wdXQ+RW1haWw8L3VzZXJpbnB1dD4uDQotSWYgeW91IHJlbW92ZSB0aGUgY2hpbGQgZWxlbWVudCAgPHVzZXJpbnB1dD5FbWFpbDwvdXNlcmlucHV0PiBmcm9tIHRoZSBEVEQsDQoteW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWRkIGFuICA8dXNlcmlucHV0PkVtYWlsPC91c2VyaW5wdXQ+IGNoaWxkIGVsZW1lbnQNCi10byB5b3VyIHJvb3QgZWxlbWVudCBDb250YWN0IGluIHlvdXIgQ29udGFjdC54bWwgZmlsZS4gVGhpcyBjaGFuZ2UsIGhvd2V2ZXIsDQotd2lsbCBub3QgY29tZSBpbnRvIGVmZmVjdCB1bnRpbCB5b3Ugc2F2ZSB5b3VyIGNoYW5nZXMgaW4gdGhlIERURCBhbmQgY2xpY2sgPHVpY29udHJvbD5YTUwNCi0+IFJlbG9hZCBEZXBlbmRlbmNpZXM8L3VpY29udHJvbD4gaW4gdGhlIFhNTCBlZGl0b3IuIFVudGlsIHlvdSBjbGljayBpdCwgeW91DQotd2lsbCBzdGlsbCBiZSBhYmxlIHRvIGFkZCA8dXNlcmlucHV0PkVtYWlsPC91c2VyaW5wdXQ+IGVsZW1lbnRzIHRvIENvbnRhY3QueG1sLjwvcD48cD5UaGlzDQotZmVhdHVyZSBpcyB2ZXJ5IGhhbmR5IHdoZW4geW91IGFyZSBtYWtpbmcgdXBkYXRlcyB0byBib3RoIERURHMgYW5kIFhNTCBzY2hlbWFzDQotYW5kIFhNTCBmaWxlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMuPC9wPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMTk4Nz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODZlMjNiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGdyYW0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCB1cGRhdGluZyBYTUwgZmlsZXMsIFhNTCBmaWxlcywgdXBkYXRpbmcgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCB1cGRhdGluZyBYTUwgZmlsZXMsIFhNTCBmaWxlcywgdXBkYXRpbmcgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdGdyYW0iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdGdyYW0iPjxhIG5hbWU9InRlZHRncmFtIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoCi1hbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXM8L3NwYW4+IHRvCi11cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlCi1ndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+Rm9yIGV4YW1wbGUsIHlvdSBoYXZlIGEgRFREIGZpbGUgY2FsbGVkICJDb250YWN0LmR0ZCIgYW5kIGFuIFhNTAotZmlsZSBjYWxsZWQgIkNvbnRhY3QueG1sIiBhc3NvY2lhdGVkIHdpdGggaXQuIENvbnRhY3QuZHRkIGNvbnRhaW5zIGEgcm9vdAotZWxlbWVudCBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5Db250YWN0PC9rYmQ+IHRoYXQgY2FuIGNvbnRhaW4gYW55IG9mIHRoZQotZm9sbG93aW5nIGNoaWxkcmVuIGVsZW1lbnRzOiAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5OYW1lPC9rYmQ+LCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPlBvc3RhbEFkZHJlc3M8L2tiZD4sIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+RW1haWw8L2tiZD4uCi1JZiB5b3UgcmVtb3ZlIHRoZSBjaGlsZCBlbGVtZW50ICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkVtYWlsPC9rYmQ+IGZyb20gdGhlIERURCwKLXlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFkZCBhbiAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5FbWFpbDwva2JkPiBjaGlsZCBlbGVtZW50Ci10byB5b3VyIHJvb3QgZWxlbWVudCBDb250YWN0IGluIHlvdXIgQ29udGFjdC54bWwgZmlsZS4gVGhpcyBjaGFuZ2UsIGhvd2V2ZXIsCi13aWxsIG5vdCBjb21lIGludG8gZWZmZWN0IHVudGlsIHlvdSBzYXZlIHlvdXIgY2hhbmdlcyBpbiB0aGUgRFREIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLSZndDsgUmVsb2FkIERlcGVuZGVuY2llczwvc3Bhbj4gaW4gdGhlIFhNTCBlZGl0b3IuIFVudGlsIHlvdSBjbGljayBpdCwgeW91Ci13aWxsIHN0aWxsIGJlIGFibGUgdG8gYWRkIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+RW1haWw8L2tiZD4gZWxlbWVudHMgdG8gQ29udGFjdC54bWwuPC9wPgotPHA+VGhpcwotZmVhdHVyZSBpcyB2ZXJ5IGhhbmR5IHdoZW4geW91IGFyZSBtYWtpbmcgdXBkYXRlcyB0byBib3RoIERURHMgYW5kIFhNTCBzY2hlbWFzCi1hbmQgWE1MIGZpbGVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcy48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiB0aXRsZT0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIHRpdGxlPSJBbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cyBhIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBMb2NhdGlvbiAoc2ltaWxhciB0byBhIFVSSSwgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBLZXkiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgdGl0bGU9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OTlkMTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0cHJvYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBzZW5kIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nDQotYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBjcmVhdGUgYSBuZXcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgcmlnaHQtY2xpY2sgaW4gdGhlIERlc2lnbg0KLXZpZXcsIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPiwgPHVpY29udHJvbD5BZGQgQmVmb3JlPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+QWRkDQotQWZ0ZXI8L3VpY29udHJvbD4sIHRoZW4gY2xpY2sgPHVpY29udHJvbD5BZGQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjwvdWljb250cm9sPi48L3A+PHA+VG8NCi1lZGl0IGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpbiB0aGUgWE1MIGVkaXRvciBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgeW91cg0KLXByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGFuZCBjbGljayA8dWljb250cm9sPkVkaXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjwvdWljb250cm9sPi4NCi1Zb3UgY2FuIGNoYW5nZSB0aGUgdmFsdWVzIGluIHRoZSBmb2xsb3dpbmcgZmllbGRzOjwvcD48dWw+DQotPGxpPlRoZSA8dWljb250cm9sPlRhcmdldDwvdWljb250cm9sPiBmaWVsZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBhcHBsaWNhdGlvbg0KLXRoZSBpbnN0cnVjdGlvbnMgYmVsb25ncyB0by48L2xpPg0KLTxsaT5UaGUgPHVpY29udHJvbD5EYXRhPC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbnMuPC9saT4NCi08L3VsPjwvY29udGV4dD4NCi08cG9zdHJlcT5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIHNhdmUgeW91ciBzZXR0aW5ncy48bm90ZT5UaGVzZTw/UHViIENhcmV0Pz4NCi1pbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbw0KLXdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9ub3RlPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMTY1MD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWRlODY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBzZW5kIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gc2VuZCB0byBhbiBhcHBsaWNhdGlvbiB1c2luZyBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRwcm9jIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRwcm9jIj48YSBuYW1lPSJ0ZWR0cHJvYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBzZW5kIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nCi1hbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBjcmVhdGUgYSBuZXcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgcmlnaHQtY2xpY2sgaW4gdGhlIERlc2lnbgotdmlldywgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaGlsZDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBCZWZvcmU8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotQWZ0ZXI8L3NwYW4+LCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC9zcGFuPi48L3A+Ci08cD5UbwotZWRpdCBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gaW4gdGhlIFhNTCBlZGl0b3IgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHlvdXIKLXByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L3NwYW4+LgotWW91IGNhbiBjaGFuZ2UgdGhlIHZhbHVlcyBpbiB0aGUgZm9sbG93aW5nIGZpZWxkczo8L3A+Ci08dWw+Ci08bGk+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldDwvc3Bhbj4gZmllbGQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgYXBwbGljYXRpb24KLXRoZSBpbnN0cnVjdGlvbnMgYmVsb25ncyB0by48L2xpPgotCi08bGk+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRhdGE8L3NwYW4+IGZpZWxkIGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbnMuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8gc2F2ZSB5b3VyIHNldHRpbmdzLjxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGVzZQotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28KLXdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTg1ZDMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRzY2giIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdmFyaW91cyBpbmZvcm1hdGlvbg0KLWFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQNCi13aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcw0KLWFzc29jaWF0ZWQgd2l0aCBvciBhZGQgYSBuZXcgYXNzb2NpYXRpb24uIE1vZGlmeWluZyBhbnkgYXNzb2NpYXRpb25zIGNhbiBpbXBhY3QNCi13aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+bmFtZXNwYWNlIGluZm9ybWF0aW9uPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPm5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGVkaXQgeW91ciBzY2hlbWENCi1pbmZvcm1hdGlvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgeW91ciByb290IGVsZW1lbnQNCi1hbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0IE5hbWVzcGFjZXM8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91ciBYTUwgZmlsZSBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG1vcmUgdGhhbiBvbmUgbmFtZXNwYWNlIG9yDQotc2NoZW1hLjwvY21kPjxpbmZvPlNlbGVjdCB0aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZXNwYWNlIE5hbWU8L3VpY29udHJvbD4gZmllbGQgaXMNCi1hIG5hbWVzcGFjZSB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLjwvY21kPjxpbmZvPllvdXIgWE1MIGZpbGUgc2hvdWxkDQotYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lIG5hbWVzcGFjZShzKSBpdHMgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGguDQotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbmFtZXNwYWNlcywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgcmVmZXJlbmNlLiBGb3INCi1tb3JlIGluZm9ybWF0aW9uLCBzZWUgPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YSINCi1zY29wZT0icGVlciI+WE1MIG5hbWVzcGFjZXM8L3hyZWY+LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5BbGwgcXVhbGlmaWVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSBYTUwgZmlsZSBhc3NvY2lhdGVkDQotd2l0aCB0aGUgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgPHVpY29udHJvbD5QcmVmaXg8L3VpY29udHJvbD4gdmFsdWUuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIDx1aWNvbnRyb2w+TG9jYXRpb24gSGludDwvdWljb250cm9sPiBmaWVsZCBjb250YWlucyB0aGUgbG9jYXRpb24NCi1vZiB0aGUgWE1MIHNjaGVtYSB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLjwvY21kPjxpbmZvPkFuIFhNTCBDYXRhbG9nDQotS2V5IG9yIGEgbmFtZXNwYWNlIG5hbWUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkLiBDbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiB0bw0KLXZpZXcgYWxsIFhNTCBzY2hlbWFzIGluIHRoZSB3b3JrYmVuY2ggYW5kIFhNTCBDYXRhbG9nLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gYWdhaW4uPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgYXNzb2NpYXRpb24sIGNsaWNrIDx1aWNvbnRyb2w+QWRkPC91aWNvbnRyb2w+IGluc3RlYWQNCi1vZiA8dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD4uIFlvdSBjYW4gdGhlbiBlaXRoZXIgc2VsZWN0IHRoZSA8dWljb250cm9sPlNwZWNpZnkNCi1Gcm9tIFJlZ2lzdGVyZWQgTmFtZXNwYWNlPC91aWNvbnRyb2w+IHJhZGlvIGJ1dHRvbiBhbmQgc2VsZWN0IHRoZSBuYW1lc3BhY2UNCi1kZWNsYXJhdGlvbnMgeW91IHdhbnQgdG8gYWRkIG9yIHNlbGVjdCB0aGUgPHVpY29udHJvbD5TcGVjaWZ5IE5ldyBOYW1lc3BhY2U8L3VpY29udHJvbD4gcmFkaW8NCi1idXR0b24gYW5kIGZpbGwgaW4gdGhlIGZpZWxkcyBhcyBuZWNlc3NhcnkuPC9wPjwvcmVzdWx0Pg0KLTxwb3N0cmVxPklmIHlvdSBkbyBub3QgaGF2ZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaW4geW91ciBYTUwgZmlsZSwgeW91IGNhbg0KLXJpZ2h0LWNsaWNrIHlvdXIgcm9vdCBlbGVtZW50IGluIHRoZSBEZXNpZ24gdmlldyBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0DQotTmFtZXNwYWNlczwvdWljb250cm9sPiB0byBhZGQgaXQuIElmIHlvdSBkbyBub3QgaGF2ZSBhIHJvb3QgZWxlbWVudCwgeW91IG11c3QNCi1jcmVhdGUgb25lIGJlZm9yZSB5b3UgY2FuIGFkZCB0aGUgbmFtZXNwYWNlIGluZm9ybWF0aW9uLjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2guaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM1NzdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgbmFtZXNwYWNlIGluZm9ybWF0aW9uLCBYTUwgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBuYW1lc3BhY2UgaW5mb3JtYXRpb24sIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRzY2giIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdHNjaCI+PGEgbmFtZT0idGVkdHNjaCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkCi13aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcwotYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdAotd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBlZGl0IHlvdXIgc2NoZW1hCi1pbmZvcm1hdGlvbiwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIHlvdXIgcm9vdCBlbGVtZW50Ci1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdCBOYW1lc3BhY2VzPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3VyIFhNTCBmaWxlIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbW9yZSB0aGFuIG9uZSBuYW1lc3BhY2Ugb3IKLXNjaGVtYS48L3NwYW4+IFNlbGVjdCB0aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4uCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlIE5hbWU8L3NwYW4+IGZpZWxkIGlzCi1hIG5hbWVzcGFjZSB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLjwvc3Bhbj4gWW91ciBYTUwgZmlsZSBzaG91bGQKLWJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBuYW1lc3BhY2UocykgaXRzIFhNTCBzY2hlbWEgaXMgYXNzb2NpYXRlZCB3aXRoLgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbmFtZXNwYWNlcywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgcmVmZXJlbmNlLiBGb3IKLW1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCI+WE1MIG5hbWVzcGFjZXM8L2E+LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QWxsIHF1YWxpZmllZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZAotd2l0aCB0aGUgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZml4PC9zcGFuPiB2YWx1ZS48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Mb2NhdGlvbiBIaW50PC9zcGFuPiBmaWVsZCBjb250YWlucyB0aGUgbG9jYXRpb24KLW9mIHRoZSBYTUwgc2NoZW1hIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9zcGFuPiBBbiBYTUwgQ2F0YWxvZwotS2V5IG9yIGEgbmFtZXNwYWNlIG5hbWUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkLiBDbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IHRvCi12aWV3IGFsbCBYTUwgc2NoZW1hcyBpbiB0aGUgd29ya2JlbmNoIGFuZCBYTUwgQ2F0YWxvZy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gYWdhaW4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGFzc29jaWF0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+IGluc3RlYWQKLW9mIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+LiBZb3UgY2FuIHRoZW4gZWl0aGVyIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlY2lmeQotRnJvbSBSZWdpc3RlcmVkIE5hbWVzcGFjZTwvc3Bhbj4gcmFkaW8gYnV0dG9uIGFuZCBzZWxlY3QgdGhlIG5hbWVzcGFjZQotZGVjbGFyYXRpb25zIHlvdSB3YW50IHRvIGFkZCBvciBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWNpZnkgTmV3IE5hbWVzcGFjZTwvc3Bhbj4gcmFkaW8KLWJ1dHRvbiBhbmQgZmlsbCBpbiB0aGUgZmllbGRzIGFzIG5lY2Vzc2FyeS48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+SWYgeW91IGRvIG5vdCBoYXZlIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpbiB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuCi1yaWdodC1jbGljayB5b3VyIHJvb3QgZWxlbWVudCBpbiB0aGUgRGVzaWduIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQKLU5hbWVzcGFjZXM8L3NwYW4+IHRvIGFkZCBpdC4gSWYgeW91IGRvIG5vdCBoYXZlIGEgcm9vdCBlbGVtZW50LCB5b3UgbXVzdAotY3JlYXRlIG9uZSBiZWZvcmUgeW91IGNhbiBhZGQgdGhlIG5hbWVzcGFjZSBpbmZvcm1hdGlvbi48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiB0aXRsZT0iQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgTG9jYXRpb24gKHNpbWlsYXIgdG8gYSBVUkksIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5Ij5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiB0aXRsZT0iSWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgWE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llcyB0byB1cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuIj5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIj5YTUwgbmFtZXNwYWNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiOGYyOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ4bWxzb3VyY2VzdWdnZXN0aW9uc3RyYXRlZ3kiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0PC90aXRsZT4NCi08c2hvcnRkZXNjPllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50DQotYXNzaXN0IGJ5IGNob29zaW5nIGEgc3VnZ2VzdGlvbiBzdHJhdGVneSBwcmVmZXJlbmNlLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5DQotaXMgc2V0IHRvIFN0cmljdCwgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZA0KLWZpcnN0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMgYW5kIGhpZ2hsaWdodGVkIGJ5IGJvbGQgaWNvbnMuIE90aGVyIHN1Z2dlc3Rpb25zDQotdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQncyBzY29wZSBidXQgYXJlIG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkDQotd2lsbCBiZSBkaXNwbGF5ZWQgbG93ZXIgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiBXaGVuIHRoZSBzdWdnZXN0aW9uDQotc3RyYXRlZ3kgaXMgc2V0IHRvIExheCwgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZA0KLWljb25zLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UbyBzZXQgdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCwgY29tcGxldGUgdGhlDQotZm9sbG93aW5nIHN0ZXBzOjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5FZGl0b3I8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkJlc2lkZSA8dWljb250cm9sPlN1Z2dlc3Rpb24gc3RyYXRlZ3k8L3VpY29udHJvbD4gaW4gdGhlIENvbnRlbnQNCi1hc3Npc3Qgc2VjdGlvbiwgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBzZXR0aW5nIChTdHJpY3Qgb3IgTGF4KS48L2NtZD48L3N0ZXA+PD9QdWIgQ2FyZXQ/Pg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiwgdGhlbiA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotc2F2ZSB5b3VyIHNldHRpbmdzPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPGV4YW1wbGU+PHA+VGhlIGZvbGxvd2luZyBzY3JlZW4gY2FwdHVyZSBkZW1vbnN0cmF0ZXMgY29udGVudCBhc3Npc3Qgd2l0aA0KLXRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHNldCB0byAiU3RyaWN0Ijo8L3A+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9zdWdnZXN0aW9uLmdpZiINCi1wbGFjZW1lbnQ9ImJyZWFrIj48YWx0PkV4YW1wbGUgb2YgU3RyaWN0IFN1Z2dlc3Rpb24gU3RyYXRlZ3k8L2FsdD48L2ltYWdlPjwvZXhhbXBsZT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMTk1MD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTgwNTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50IGFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gU3RyaWN0LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgZGlzcGxheWVkIGZpcnN0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMgYW5kIGhpZ2hsaWdodGVkIGJ5IGJvbGQgaWNvbnMuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvIExheCwgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBjdXN0b21pemUgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1Z2dlc3Rpb25zIGdpdmVuIGJ5IGNvbnRlbnQgYXNzaXN0IGJ5IGNob29zaW5nIGEgc3VnZ2VzdGlvbiBzdHJhdGVneSBwcmVmZXJlbmNlLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byBTdHJpY3QsIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQncyBzY29wZSBidXQgYXJlIG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gTGF4LCBhbGwgc3VnZ2VzdGlvbnMgd2lsbCBkaXNwbGF5ZWQgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InhtbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ4bWxzb3VyY2VzdWdnZXN0aW9uc3RyYXRlZ3kiPjxhIG5hbWU9InhtbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3Q8L2gxPgotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgc3VnZ2VzdGlvbnMgZ2l2ZW4gYnkgY29udGVudAotYXNzaXN0IGJ5IGNob29zaW5nIGEgc3VnZ2VzdGlvbiBzdHJhdGVneSBwcmVmZXJlbmNlLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5Ci1pcyBzZXQgdG8gU3RyaWN0LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgZGlzcGxheWVkCi1maXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zIGFuZCBoaWdobGlnaHRlZCBieSBib2xkIGljb25zLiBPdGhlciBzdWdnZXN0aW9ucwotdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQncyBzY29wZSBidXQgYXJlIG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkCi13aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24KLXN0cmF0ZWd5IGlzIHNldCB0byBMYXgsIGFsbCBzdWdnZXN0aW9ucyB3aWxsIGRpc3BsYXllZCBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQKLWljb25zLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gc2V0IHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QsIGNvbXBsZXRlIHRoZQotZm9sbG93aW5nIHN0ZXBzOjwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1GaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3I8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+QmVzaWRlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN1Z2dlc3Rpb24gc3RyYXRlZ3k8L3NwYW4+IGluIHRoZSBDb250ZW50Ci1hc3Npc3Qgc2VjdGlvbiwgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBzZXR0aW5nIChTdHJpY3Qgb3IgTGF4KS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiwgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8KLXNhdmUgeW91ciBzZXR0aW5nczwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJleGFtcGxlIj48cD5UaGUgZm9sbG93aW5nIHNjcmVlbiBjYXB0dXJlIGRlbW9uc3RyYXRlcyBjb250ZW50IGFzc2lzdCB3aXRoCi10aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBzZXQgdG8gIlN0cmljdCI6PC9wPgotPGJyIC8+PGltZyBzcmM9Ii4uL2ltYWdlcy9zdWdnZXN0aW9uLmdpZiIgYWx0PSJFeGFtcGxlIG9mIFN0cmljdCBTdWdnZXN0aW9uIFN0cmF0ZWd5IiAvPjxiciAvPjwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZiBjb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS4iPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTg5MTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InR0YWdoaWx0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UNCi1jb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycw0KLXRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIHNldCBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciB0aGUgWE1MIGNvZGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPiBTeW50YXggQ29sb3Jpbmc8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5TeW50YXggRWxlbWVudDwvdWljb250cm9sPiBsaXN0LCBzZWxlY3QgdGhlIHNvdXJjZQ0KLXRhZyB0eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBhbHNvIGNsaWNrDQotdGV4dCBpbiB0aGUgPHVpY29udHJvbD5TYW1wbGUgdGV4dDwvdWljb250cm9sPiBib3ggdG8gc3BlY2lmeSB0aGUgc291cmNlIHRhZw0KLXR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkZvcmVncm91bmQ8L3VpY29udHJvbD4gYm94LCBzZWxlY3QgdGhlIGNvbG9yDQotdGhhdCB5b3Ugd2FudCB0aGUgdGV4dCBvZiB0aGUgdGFnIHRvIGFwcGVhciBpbiwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+QmFja2dyb3VuZDwvdWljb250cm9sPiBib3gsIHNlbGVjdCB0aGUgY29sb3INCi10aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWhpbmQgdGhlIHRhZywgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPkJvbGQ8L3VpY29udHJvbD4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRvDQotbWFrZSB0aGUgdHlwZSBib2xkLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIHNhdmUgeW91ciBjaGFuZ2VzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VG8gc2V0IHRoZSBoaWdobGlnaHQ8P1B1YiBDYXJldD8+aW5nIHN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQNCi12YWx1ZXMsIGNsaWNrIDx1aWNvbnRyb2w+UmVzdG9yZSBEZWZhdWx0PC91aWNvbnRyb2w+LiBJZiB5b3Ugb25seSB3YW50IHRvDQotcmVzZXQgdGhlIHZhbHVlIGZvciBhIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLCBzZWxlY3QgaXQgaW4gdGhlIDx1aWNvbnRyb2w+U3ludGF4DQotRWxlbWVudDwvdWljb250cm9sPiBmaWVsZCwgdGhlbiBjbGljayB0aGUgPHVpY29udHJvbD5SZXN0b3JlIERlZmF1bHQ8L3VpY29udHJvbD4gYnV0dG9uLjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMjkwPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NjFjZmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlIGNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzIHRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlIGNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzIHRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBzZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHRhZ2hpbHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0dGFnaGlsdCI+PGEgbmFtZT0idHRhZ2hpbHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UKLWNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzCi10aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIHNldCBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciB0aGUgWE1MIGNvZGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1GaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gU3ludGF4IENvbG9yaW5nPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TeW50YXggRWxlbWVudDwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZSBzb3VyY2UKLXRhZyB0eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBhbHNvIGNsaWNrCi10ZXh0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TYW1wbGUgdGV4dDwvc3Bhbj4gYm94IHRvIHNwZWNpZnkgdGhlIHNvdXJjZSB0YWcKLXR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZvcmVncm91bmQ8L3NwYW4+IGJveCwgc2VsZWN0IHRoZSBjb2xvcgotdGhhdCB5b3Ugd2FudCB0aGUgdGV4dCBvZiB0aGUgdGFnIHRvIGFwcGVhciBpbiwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJhY2tncm91bmQ8L3NwYW4+IGJveCwgc2VsZWN0IHRoZSBjb2xvcgotdGhhdCB5b3Ugd2FudCB0byBhcHBlYXIgYmVoaW5kIHRoZSB0YWcsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Qm9sZDwvc3Bhbj4gY2hlY2sgYm94IGlmIHlvdSB3YW50IHRvCi1tYWtlIHRoZSB0eXBlIGJvbGQuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj4gPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8gc2F2ZSB5b3VyIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nIHN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQKLXZhbHVlcywgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0PC9zcGFuPi4gSWYgeW91IG9ubHkgd2FudCB0bwotcmVzZXQgdGhlIHZhbHVlIGZvciBhIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLCBzZWxlY3QgaXQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5bnRheAotRWxlbWVudDwvc3Bhbj4gZmllbGQsIHRoZW4gY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlc3RvcmUgRGVmYXVsdDwvc3Bhbj4gYnV0dG9uLjwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d2NkYXN0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTQ3NTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d2NkYXN0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idHdjZGFzdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YNCi1jb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdA0KLXRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4geW91ciBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dA0KLWZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uPC9wPjxwPllvdSBjYW4NCi1sYXVuY2ggY29udGVudCBhc3Npc3QgaW4gZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgd2F5czo8L3A+PHVsPg0KLTxsaT5Gcm9tIHRoZSA8dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD4gbWVudSwgY2xpY2sgPHVpY29udHJvbD5Db250ZW50IEFzc2lzdDwvdWljb250cm9sPiwNCi1vcjwvbGk+DQotPGxpPlByZXNzIEN0cmwrU3BhY2U8L2xpPg0KLTwvdWw+PHA+SW4gYWRkaXRpb24sIHlvdSBjYW4gc2V0IHVwIGFuIG9wdGlvbiB0aGF0IGNhdXNlcyBjb250ZW50IGFzc2lzdCB0bw0KLXBvcCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gY2VydGFpbiBjaGFyYWN0ZXJzIGFyZSB0eXBlZC4gVG8gc2V0IHVwIHRoaXMgb3B0aW9uLA0KLWNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+IFByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gdG8gb3BlbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCB0aGVuIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD4NCi08dWljb250cm9sPlhNTCBGaWxlcyA8L3VpY29udHJvbD48dWljb250cm9sPkVkaXRvcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IC4NCi1JbiB0aGUgPHVpY29udHJvbD5Db250ZW50IGFzc2lzdDwvdWljb250cm9sPiBncm91cCBib3gsIHNlbGVjdCB0aGUgPHVpY29udHJvbD5BdXRvbWF0aWNhbGx5DQotbWFrZSBzdWdnZXN0aW9uczwvdWljb250cm9sPiBjaGVjayBib3gsIGFuZCBzdXBwbHkgYW55IGFkZGl0aW9uYWwgY2hhcmFjdGVycw0KLXRoYXQgc2hvdWxkIHRyaWdnZXIgY29udGVudCBhc3Npc3QuPC9wPjxwPklmIHlvdXIgY3Vyc29yIGlzIGluIGEgcG9zaXRpb24NCi13aGVyZSBjb250ZW50IGFzc2lzdCBpcyBhdmFpbGFibGUsIGEgcG9wLXVwIGxpc3Qgb2YgYXZhaWxhYmxlIGNob2ljZXMgaXMgZGlzcGxheWVkDQotd2hlbiB5b3UgbGF1bmNoIGNvbnRlbnQgYXNzaXN0LiBUaGUgbGlzdCBpcyBiYXNlZCBvbiB0aGUgY29udGV4dCBhbmQgd2hldGhlcg0KLWEgRFREIG9yIFhNTCBzY2hlbWEgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBYTUwgZmlsZSBiZWluZyBlZGl0ZWQuIEZvciBleGFtcGxlLA0KLWlmIHlvdSBoYXZlIGFuIEFkZHJlc3MgZWxlbWVudCB0aGF0IGNhbiBjb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoaWxkcmVuDQotZWxlbWVudHM6IE5hbWUsIFN0cmVldCwgQ2l0eSwgWmlwIENvZGUsIENvdW50cnksIGFuZCBQcm92aW5jZSwgYW5kIHlvdSBwbGFjZQ0KLXlvdXIgY3Vyc29yIGFmdGVyIGFueSBvZiB0aGVtIGFuZCBsYXVuY2ggY29udGVudCBhc3Npc3QsIGFsbCBvZiB0aGUgY2hpbGQNCi1lbGVtZW50cyB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdC48L3A+PHA+VGhlIGNvbnRlbnQgYXNzaXN0DQotbGlzdCBkaXNwbGF5cyBhbGwgdmFsaWQgdGFncyBmb3IgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGVtcGxhdGVzLg0KLUlmIHlvdXIgZ3JhbW1hciBjb25zdHJhaW50cyBhcmUgdHVybmVkIG9mZiwgYWxsIGF2YWlsYWJsZSB0YWdzLCBub3QganVzdCB2YWxpZA0KLW9uZXMsIGFyZSBkaXNwbGF5ZWQuIDwvcD48cD5BcyB5b3UgdHlwZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBsZXR0ZXJzIG9mIHRoZQ0KLXRhZyB0aGF0IHlvdSB3YW50LCB0aGUgbGlzdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2hlcyB3aXRoIGFscGhhYmV0aXplZCBjaG9pY2VzDQotdGhhdCBtYXRjaCB5b3VyIGlucHV0LiBTY3JvbGwgZG93biBhbmQgc2VsZWN0IHRoZSB0YWcgdGhhdCB5b3Ugd2FudCB0byB1c2UNCi1ieSBkb3VibGUtY2xpY2tpbmcgb24gaXQuPD9QdWIgQ2FyZXQ/PjwvcD48bm90ZT5UaGUgbGlzdCBvbmx5IHJlZnJlc2hlcyBhcw0KLWRlc2NyaWJlZCBpZiB5b3UgZmlyc3QgdHlwZSA8dXNlcmlucHV0PiZsdDs8L3VzZXJpbnB1dD4gYmVmb3JlIHByb21wdGluZyBmb3INCi1jb250ZW50IGFzc2lzdC48L25vdGU+PC9jb250ZXh0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyODkxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2JlNTI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZiBjb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBjb250ZW50IGFzc2lzdCwgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgY29udGVudCBhc3Npc3QsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdtYWNyby5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdjZGFzdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdjZGFzdCI+PGEgbmFtZT0idHdjZGFzdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZgotY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QKLXRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHlvdXIgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQKLWZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uPC9wPgotPHA+WW91IGNhbgotbGF1bmNoIGNvbnRlbnQgYXNzaXN0IGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHdheXM6PC9wPgotPHVsPgotPGxpPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+IG1lbnUsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQgQXNzaXN0PC9zcGFuPiwKLW9yPC9saT4KLQotPGxpPlByZXNzIEN0cmwrU3BhY2U8L2xpPgotCi08L3VsPgotPHA+SW4gYWRkaXRpb24sIHlvdSBjYW4gc2V0IHVwIGFuIG9wdGlvbiB0aGF0IGNhdXNlcyBjb250ZW50IGFzc2lzdCB0bwotcG9wIHVwIGF1dG9tYXRpY2FsbHkgd2hlbiBjZXJ0YWluIGNoYXJhY3RlcnMgYXJlIHR5cGVkLiBUbyBzZXQgdXAgdGhpcyBvcHRpb24sCi1jbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gUHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+IHRvIG9wZW4gdGhlIFByZWZlcmVuY2VzIHdpbmRvdywgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgRmlsZXMgPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcjwvc3Bhbj48L3NwYW4+IC4KLUluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IGFzc2lzdDwvc3Bhbj4gZ3JvdXAgYm94LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF1dG9tYXRpY2FsbHkKLW1ha2Ugc3VnZ2VzdGlvbnM8L3NwYW4+IGNoZWNrIGJveCwgYW5kIHN1cHBseSBhbnkgYWRkaXRpb25hbCBjaGFyYWN0ZXJzCi10aGF0IHNob3VsZCB0cmlnZ2VyIGNvbnRlbnQgYXNzaXN0LjwvcD4KLTxwPklmIHlvdXIgY3Vyc29yIGlzIGluIGEgcG9zaXRpb24KLXdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZiBhdmFpbGFibGUgY2hvaWNlcyBpcyBkaXNwbGF5ZWQKLXdoZW4geW91IGxhdW5jaCBjb250ZW50IGFzc2lzdC4gVGhlIGxpc3QgaXMgYmFzZWQgb24gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIKLWEgRFREIG9yIFhNTCBzY2hlbWEgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBYTUwgZmlsZSBiZWluZyBlZGl0ZWQuIEZvciBleGFtcGxlLAotaWYgeW91IGhhdmUgYW4gQWRkcmVzcyBlbGVtZW50IHRoYXQgY2FuIGNvbnRhaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hpbGRyZW4KLWVsZW1lbnRzOiBOYW1lLCBTdHJlZXQsIENpdHksIFppcCBDb2RlLCBDb3VudHJ5LCBhbmQgUHJvdmluY2UsIGFuZCB5b3UgcGxhY2UKLXlvdXIgY3Vyc29yIGFmdGVyIGFueSBvZiB0aGVtIGFuZCBsYXVuY2ggY29udGVudCBhc3Npc3QsIGFsbCBvZiB0aGUgY2hpbGQKLWVsZW1lbnRzIHdpbGwgYmUgbGlzdGVkIGluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LjwvcD4KLTxwPlRoZSBjb250ZW50IGFzc2lzdAotbGlzdCBkaXNwbGF5cyBhbGwgdmFsaWQgdGFncyBmb3IgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGVtcGxhdGVzLgotSWYgeW91ciBncmFtbWFyIGNvbnN0cmFpbnRzIGFyZSB0dXJuZWQgb2ZmLCBhbGwgYXZhaWxhYmxlIHRhZ3MsIG5vdCBqdXN0IHZhbGlkCi1vbmVzLCBhcmUgZGlzcGxheWVkLiA8L3A+Ci08cD5BcyB5b3UgdHlwZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBsZXR0ZXJzIG9mIHRoZQotdGFnIHRoYXQgeW91IHdhbnQsIHRoZSBsaXN0IGF1dG9tYXRpY2FsbHkgcmVmcmVzaGVzIHdpdGggYWxwaGFiZXRpemVkIGNob2ljZXMKLXRoYXQgbWF0Y2ggeW91ciBpbnB1dC4gU2Nyb2xsIGRvd24gYW5kIHNlbGVjdCB0aGUgdGFnIHRoYXQgeW91IHdhbnQgdG8gdXNlCi1ieSBkb3VibGUtY2xpY2tpbmcgb24gaXQuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZSBsaXN0IG9ubHkgcmVmcmVzaGVzIGFzCi1kZXNjcmliZWQgaWYgeW91IGZpcnN0IHR5cGUgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4mbHQ7PC9rYmQ+IGJlZm9yZSBwcm9tcHRpbmcgZm9yCi1jb250ZW50IGFzc2lzdC48L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdtYWNyby5odG1sIiB0aXRsZT0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiI+V29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90c3Vnc3RyYXQuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50IGFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gU3RyaWN0LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgZGlzcGxheWVkIGZpcnN0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMgYW5kIGhpZ2hsaWdodGVkIGJ5IGJvbGQgaWNvbnMuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvIExheCwgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4iPlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMWI0YzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3bWFjcm8iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5YTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIHNlY3Rpb24gb2YgcHJlZGVmaW5lZA0KLWNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4NCi15b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91DQotZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0d21hY3JvfDF8WE1MdGVtcGxhdGVzd29ya2luZ3dpdGhwcmVkZWZpbmVkY29kZSINCi1zdGF0dXM9ImNoYW5nZWQiPnRlbXBsYXRlczxpbmRleHRlcm0+d29ya2luZyB3aXRoIHByZWRlZmluZWQgWE1MIGNvZGU8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHdtYWNyb3wxMHxYTUxmaWxlc3RlbXBsYXRlcyIgc3RhdHVzPSJuZXciPlhNTA0KLWZpbGVzPGluZGV4dGVybT50ZW1wbGF0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPllvdSBjYW4gdXNlIGEgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsDQotb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3A+PHA+Rm9yIGV4YW1wbGUsIHlvdSBjYW4gd29yayBvbiBhIGdyb3VwIG9mDQotWE1MIHBhZ2VzIHRoYXQgc2hvdWxkIGFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZQ0KLWEgdGVtcGxhdGUgdGhhdCBjb250YWlucyB0aGUgdGFncyBmb3IgdGhhdCB0YWJsZSwgaW5jbHVkaW5nIHRoZSBhcHByb3ByaWF0ZQ0KLWF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUNCi10YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLikNCi1UaGVuIHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXINCi15b3Ugd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBYTUwgZmlsZS48L3A+PHA+VG8gY3JlYXRlIGEgbmV3DQotWE1MIHRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1GaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+VGVtcGxhdGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseQ0KLW5ldyB0ZW1wbGF0ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TdXBwbHkgYSBuZXcgdGVtcGxhdGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGFuZCA8dWljb250cm9sPkRlc2NyaXB0aW9uPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+Q29udGV4dDwvdWljb250cm9sPiBmb3IgdGhlIHRlbXBsYXRlLjwvY21kPg0KLTxpbmZvPlRoaXMgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwNCi1saXN0IHdoZW4gY29udGVudCBhc3Npc3QgaXMgcmVxdWVzdGVkLiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nDQotdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudA0KLWFzc2lzdC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDx1aWNvbnRyb2w+SW5zZXJ0IFZhcmlhYmxlPC91aWNvbnRyb2w+IGJ1dHRvbg0KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLiA8L2NtZD48aW5mbz5Gb3IgZXhhbXBsZSwgdGhlIDxiPmRhdGU8L2I+IHZhcmlhYmxlDQotaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZSBpbnNlcnRlZC4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gYW5kIHRoZW4gPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiB0bw0KLXNhdmUgeW91ciBjaGFuZ2VzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lDQotcHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUNCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlDQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuIDxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUNCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlDQotY29udGVudCBhc3Npc3QgbGlzdCwgY2xlYXIgaXRzIGNoZWNrIGJveCBpbiB0aGUgdGFibGUgb24gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcw0KLXBhZ2UuPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTk1M2MzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIHNlY3Rpb24gb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuIiAvPgotPG1ldGEgY29udGVudD0idGVtcGxhdGVzLCB3b3JraW5nIHdpdGggcHJlZGVmaW5lZCBYTUwgY29kZSwgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0idGVtcGxhdGVzLCB3b3JraW5nIHdpdGggcHJlZGVmaW5lZCBYTUwgY29kZSwgWE1MIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdtYWNybyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d21hY3JvIj48YSBuYW1lPSJ0d21hY3JvIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQKLWNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4KLXlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UKLWRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiB1c2UgYSBkZWZhdWx0IHRlbXBsYXRlIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwKLW9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPgotPHA+Rm9yIGV4YW1wbGUsIHlvdSBjYW4gd29yayBvbiBhIGdyb3VwIG9mCi1YTUwgcGFnZXMgdGhhdCBzaG91bGQgYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlCi1hIHRlbXBsYXRlIHRoYXQgY29udGFpbnMgdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUKLWF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUKLXRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZC4pCi1UaGVuIHNlbGVjdCB0aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIKLXlvdSB3YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGFuIFhNTCBmaWxlLjwvcD4KLTxwPlRvIGNyZWF0ZSBhIG5ldwotWE1MIHRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGVtcGxhdGVzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5Ci1uZXcgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3VwcGx5IGEgbmV3IHRlbXBsYXRlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZXh0PC9zcGFuPiBmb3IgdGhlIHRlbXBsYXRlLjwvc3Bhbj4KLSBUaGlzIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsCi1saXN0IHdoZW4gY29udGVudCBhc3Npc3QgaXMgcmVxdWVzdGVkLiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nCi10aGUgYXBwcm9wcmlhdGUgdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBpbnNlcnRlZCBieSBjb250ZW50Ci1hc3Npc3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQgVmFyaWFibGU8L3NwYW4+IGJ1dHRvbgotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuIDwvc3Bhbj4gRm9yIGV4YW1wbGUsIHRoZSA8c3Ryb25nPmRhdGU8L3N0cm9uZz4gdmFyaWFibGUKLWluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgaW5zZXJ0ZWQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiB0bwotc2F2ZSB5b3VyIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lCi1wcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuIDxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUKLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUKLWNvbnRlbnQgYXNzaXN0IGxpc3QsIGNsZWFyIGl0cyBjaGVjayBib3ggaW4gdGhlIHRhYmxlIG9uIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMKLXBhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZiBjb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS4iPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZGZlYzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d3h2YWxpZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d3h2YWxpZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+VmFsaWRhdGluZyBYTUwgZmlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlZhbGlkYXRpbmcgWE1MIGZpbGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8NCi1zZWUgdGhhdCB5b3VyIGZpbGUgaXMgdmFsaWQgYW5kIHdlbGwtZm9ybWVkLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+dmFsaWRhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIFhNTCBlZGl0b3Igd2lsbCBwcm9jZXNzIFhNTCBmaWxlcyB0aGF0IGFyZSBpbnZhbGlkIG9yIG5vdA0KLXdlbGwtZm9ybWVkLiBUaGUgZWRpdG9yIHVzZXMgaGV1cmlzdGljcyB0byBvcGVuIGEgZmlsZSB1c2luZyB0aGUgYmVzdCBpbnRlcnByZXRhdGlvbg0KLW9mIHRoZSB0YWdnaW5nIHRoYXQgaXQgY2FuLiBGb3IgZXhhbXBsZSwgYW4gZWxlbWVudCB3aXRoIGEgbWlzc2luZyBlbmQgdGFnDQotaXMgc2ltcGx5IGFzc3VtZWQgdG8gZW5kIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LiBBcyB5b3UgbWFrZSB1cGRhdGVzIHRvDQotYSBmaWxlLCB0aGUgZWRpdG9yIGluY3JlbWVudGFsbHkgcmVpbnRlcnByZXRzIHlvdXIgZG9jdW1lbnQsIGNoYW5naW5nIHRoZQ0KLWhpZ2hsaWdodGluZywgdHJlZSB2aWV3LCBhbmQgc28gb24uIE1hbnkgZm9ybWF0aW9uIGVycm9ycyBhcmUgZWFzeSB0byBzcG90DQotaW4gdGhlIHN5bnRheCBoaWdobGlnaHRpbmcsIHNvIHlvdSBjYW4gZWFzaWx5IGNvcnJlY3Qgb2J2aW91cyBlcnJvcnMgb24tdGhlLWZseS4NCi1Ib3dldmVyLCB0aGVyZSB3aWxsIGJlIG90aGVyIGNhc2VzIHdoZW4gaXQgd2lsbCBiZSBiZW5lZmljaWFsIHRvIHBlcmZvcm0gZm9ybWFsDQotdmFsaWRhdGlvbiBvbiB5b3VyIGRvY3VtZW50cy48L3A+PHA+WW91IGNhbiB2YWxpZGF0ZSB5b3VyIGZpbGUgYnkgc2VsZWN0aW5nDQotaXQgaW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGlja2luZyBpdCwgYW5kIGNsaWNraW5nIDx1aWNvbnRyb2w+VmFsaWRhdGU8L3VpY29udHJvbD4uDQotQW55IHZhbGlkYXRpb24gcHJvYmxlbXMgYXJlIGluZGljYXRlZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4gWW91IGNhbiBkb3VibGUtY2xpY2sNCi1vbiBpbmRpdmlkdWFsIGVycm9ycywgYW5kIHlvdSB3aWxsIGJlIHRha2VuIHRvIHRoZSBpbnZhbGlkIHRhZyBpbiB0aGUgZmlsZSwNCi1zbyB0aGF0IHlvdSBjYW4gbWFrZSBjb3JyZWN0aW9ucy48L3A+PC9jb250ZXh0Pg0KLTxwb3N0cmVxPjxub3RlPiBJZiB5b3UgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgUHJvYmxlbXMNCi12aWV3IGlzIGZ1bGwsIHlvdSBjYW4gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkIGJ5IGNsaWNraW5nIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQNCi1zZWxlY3RpbmcgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPjx1aWNvbnRyb2w+TWFya2VyczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LiBTZWxlY3QgdGhlIDx1aWNvbnRyb2w+VXNlIG1hcmtlciBsaW1pdHM8L3VpY29udHJvbD4gY2hlY2sNCi1ib3ggYW5kIGNoYW5nZSB0aGUgbnVtYmVyIGluIHRoZSA8dWljb250cm9sPkxpbWl0IHZpc2libGUgaXRlbXMgcGVyIGdyb3VwPC91aWNvbnRyb2w+IDw/UHViIENhcmV0Pz5maWVsZC48L25vdGU+PHA+WW91DQotY2FuIHNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzDQotYXJlIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGVkIHdoZW4geW91IHNhdmUgdGhlbS4gRnJvbSBhIHByb2plY3QncyBwb3AtdXAgbWVudSwNCi1jbGljayA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4sIHRoZW4gc2VsZWN0IDx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPi4NCi1BbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1biBhZ2FpbnN0IHlvdXIgcHJvamVjdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgVmFsaWRhdGlvbg0KLXBhZ2UuPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5kaXRhIiBzY29wZT0icGVlciI+DQotPGxpbmt0ZXh0PlZhbGlkYXRpbmcgY29kZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uczwvbGlua3RleHQ+PC9saW5rPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDI2NTg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyMmExZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvIHNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8gc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHd4dmFsaWQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5WYWxpZGF0aW5nIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHd4dmFsaWQiPjxhIG5hbWU9InR3eHZhbGlkIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYWxpZGF0aW5nIFhNTCBmaWxlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiB5b3UgdmFsaWRhdGUgeW91ciBYTUwgZmlsZSwgdGhlIFhNTCB2YWxpZGF0b3Igd2lsbCBjaGVjayB0bwotc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgZWRpdG9yIHdpbGwgcHJvY2VzcyBYTUwgZmlsZXMgdGhhdCBhcmUgaW52YWxpZCBvciBub3QKLXdlbGwtZm9ybWVkLiBUaGUgZWRpdG9yIHVzZXMgaGV1cmlzdGljcyB0byBvcGVuIGEgZmlsZSB1c2luZyB0aGUgYmVzdCBpbnRlcnByZXRhdGlvbgotb2YgdGhlIHRhZ2dpbmcgdGhhdCBpdCBjYW4uIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IHdpdGggYSBtaXNzaW5nIGVuZCB0YWcKLWlzIHNpbXBseSBhc3N1bWVkIHRvIGVuZCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gQXMgeW91IG1ha2UgdXBkYXRlcyB0bwotYSBmaWxlLCB0aGUgZWRpdG9yIGluY3JlbWVudGFsbHkgcmVpbnRlcnByZXRzIHlvdXIgZG9jdW1lbnQsIGNoYW5naW5nIHRoZQotaGlnaGxpZ2h0aW5nLCB0cmVlIHZpZXcsIGFuZCBzbyBvbi4gTWFueSBmb3JtYXRpb24gZXJyb3JzIGFyZSBlYXN5IHRvIHNwb3QKLWluIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nLCBzbyB5b3UgY2FuIGVhc2lseSBjb3JyZWN0IG9idmlvdXMgZXJyb3JzIG9uLXRoZS1mbHkuCi1Ib3dldmVyLCB0aGVyZSB3aWxsIGJlIG90aGVyIGNhc2VzIHdoZW4gaXQgd2lsbCBiZSBiZW5lZmljaWFsIHRvIHBlcmZvcm0gZm9ybWFsCi12YWxpZGF0aW9uIG9uIHlvdXIgZG9jdW1lbnRzLjwvcD4KLTxwPllvdSBjYW4gdmFsaWRhdGUgeW91ciBmaWxlIGJ5IHNlbGVjdGluZwotaXQgaW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGlja2luZyBpdCwgYW5kIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlPC9zcGFuPi4KLUFueSB2YWxpZGF0aW9uIHByb2JsZW1zIGFyZSBpbmRpY2F0ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIFlvdSBjYW4gZG91YmxlLWNsaWNrCi1vbiBpbmRpdmlkdWFsIGVycm9ycywgYW5kIHlvdSB3aWxsIGJlIHRha2VuIHRvIHRoZSBpbnZhbGlkIHRhZyBpbiB0aGUgZmlsZSwKLXNvIHRoYXQgeW91IGNhbiBtYWtlIGNvcnJlY3Rpb25zLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gIElmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSBQcm9ibGVtcwotdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPjwvc3Bhbj4gYW5kCi1zZWxlY3RpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hcmtlcnM8L3NwYW4+Ci08L3NwYW4+LiBTZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBtYXJrZXIgbGltaXRzPC9zcGFuPiBjaGVjawotYm94IGFuZCBjaGFuZ2UgdGhlIG51bWJlciBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TGltaXQgdmlzaWJsZSBpdGVtcyBwZXIgZ3JvdXA8L3NwYW4+IGZpZWxkLjwvZGl2PgotPHA+WW91Ci1jYW4gc2V0IHVwIGEgcHJvamVjdCdzIHByb3BlcnRpZXMgc28gdGhhdCBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdCByZXNvdXJjZXMKLWFyZSBhdXRvbWF0aWNhbGx5IHZhbGlkYXRlZCB3aGVuIHlvdSBzYXZlIHRoZW0uIEZyb20gYSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUsCi1jbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPiwgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj4uCi1BbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1biBhZ2FpbnN0IHlvdXIgcHJvamVjdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgVmFsaWRhdGlvbgotcGFnZS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIj5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjBlNDU5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR4ZWR0ZGVzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlDQotc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZw0KLWVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywNCi13aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yDQotdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+RGVzaWduIHZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkZvciBleGFtcGxlLCB0aGUgPHVpY29udHJvbD5BZGQgY2hpbGQ8L3VpY29udHJvbD4gbWVudSBpdGVtIHdpbGwNCi1saXN0IG9ubHkgdGhvc2UgZWxlbWVudHMgZnJvbSBhIERURCBvciBYTUwgc2NoZW1hIHdoaWNoIHdvdWxkIGJlIHZhbGlkIGNoaWxkcmVuDQotYXQgdGhhdCBwb2ludC48L3A+PHA+V2hlbiB5b3UgaGF2ZSBhbiBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYQ0KLW9yIERURCBmaWxlLCBjZXJ0YWluIHRhZ3MgYW5kIHJ1bGVzIGZvciB0aGF0IGZpbGUgaGF2ZSBhbHJlYWR5IGJlZW4gZXN0YWJsaXNoZWQsDQotd2hpY2ggaXMgd2h5IHRoZSBEZXNpZ24gdmlldyBjYW4gcHJvdmlkZSBwcm9tcHRzICh2aWEgYSBwb3AtdXAgbWVudSkgZm9yIHRob3NlDQotdGFncy4gV2hlbiB5b3UgY3JlYXRlIGFuIFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hDQotb3IgRFREIGZpbGUsIGl0IGhhcyBubyB0YWdzIG9yIHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCBpdCwgc28gdGhlIERlc2lnbiB2aWV3DQotY2Fubm90IHByb3ZpZGUgcHJvbXB0cyBmb3Igc3BlY2lmaWMgdGFncywgYnV0IGl0IGNhbiBwcm92aWRlIHByb21wdHMgdG8gY3JlYXRlDQotbmV3IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLjwvcD48cD5Gb3IgYW55IFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwNCi1zY2hlbWEgb3IgRFREIGZpbGUsIHlvdSBjYW4gdXNlIHRoZSBEZXNpZ24gdmlldyB0byBhZGQgYW55IGl0ZW1zIGRlZmluZWQgaW4NCi10aGUgWE1MIHNjaGVtYSBvciBEVEQgKHN1Y2ggYXMgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMpIHRvIHRoZSBYTUwgZmlsZS4gWW91DQotY2FuIGFsc28gdXNlIGl0IHRvIGFkZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhbmQgY29tbWVudHMgdG8gYWxsIFhNTCBmaWxlcy48L3A+PHA+VG8NCi1vcGVuIGFuZCBlZGl0IGEgWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZSBOYXZpZ2F0b3INCi12aWV3IGFuZCBjbGljayA8dWljb250cm9sPk9wZW4gV2l0aCA+IFhNTCBFZGl0b3I8L3VpY29udHJvbD4uIElmIG5lY2Vzc2FyeSwNCi1jbGljayB0aGUgPHVpY29udHJvbD5EZXNpZ248L3VpY29udHJvbD4gdGFiIHRvIG9wZW4gdGhlIERlc2lnbiB2aWV3LjwvcD48cD5Ubw0KLWV4cGFuZCBhbGwgdGhlIGl0ZW1zIGluIHlvdXIgWE1MIGZpbGUsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RXhwYW5kIEFsbDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvZXhwYW5kX2FsbC5naWYiPg0KLTxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBFeHBhbmQgQWxsIHRvb2xiYXIgYnV0dG9uPC9hbHQ+PC9pbWFnZT4gb24gdGhlIHRvb2xiYXIuDQotVG8gY29sbGFwc2UgdGhlbSwgY2xpY2sgdGhlIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+Q29sbGFwc2UNCi1BbGw8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYiPjxhbHQ+VGhpcw0KLWdyYXBoaWMgaXMgdGhlIENvbGxhcHNlIEFsbCB0b29sYmFyIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IG9uIHRoZSB0b29sYmFyLjwvcD48cD5JZg0KLXlvdSByaWdodC1jbGljayB0aGUgaXRlbSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCwgc29tZSBvciBhbGwgb2YgdGhlIGZvbGxvd2luZw0KLW9wdGlvbnMgKGFzIGFwcGxpY2FibGUpIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhlIHBvcC11cCBtZW51IHRoYXQgYXBwZWFyczo8L3A+PHRhYmxlPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iY29sMSIgY29sd2lkdGg9IjQ4KiIvPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDIiDQotY29sd2lkdGg9IjE1MCoiLz4NCi08dGhlYWQ+DQotPHJvdyB2YWxpZ249ImJvdHRvbSI+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPlNlbGVjdCB0aGlzPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+SWYgeW91IHdhbnQgdG8gZG8gdGhpczwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+QWRkIERURCBJbmZvcm1hdGlvbjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkFzc29jaWF0ZSB0aGUgWE1MIGZpbGUgd2l0aCBhIERURC48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkVkaXQgRE9DVFlQRTwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkVkaXQgdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24uIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sNCi1mb3IgbW9yZSBkZXRhaWxzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDx4cmVmIGZvcm1hdD0iZGl0YSIgaHJlZj0idGVkdGRvYy5kaXRhIg0KLXNjb3BlPSJsb2NhbCI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwveHJlZj4uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5FZGl0IE5hbWVzcGFjZXM8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5FZGl0IHRoZSBleGlzdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24gb3IgY3JlYXRlIGENCi1uZXcgYXNzb2NpYXRpb24gd2l0aCBhIG5hbWVzcGFjZS4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFzayBmb3IgbW9yZSBkZXRhaWxzLg0KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPHhyZWYgZm9ybWF0PSJkaXRhIiBocmVmPSJ0ZWR0c2NoLmRpdGEiIHNjb3BlPSJsb2NhbCI+RWRpdGluZw0KLW5hbWVzcGFjZSBpbmZvcm1hdGlvbjwveHJlZj4uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5FZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5FZGl0IHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiBSZWZlciB0byB0aGUgcmVsYXRlZA0KLXRhc2sgZm9yIG1vcmUgZGV0YWlscy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8eHJlZiBmb3JtYXQ9ImRpdGEiIGhyZWY9InRlZHRwcm9jLmRpdGEiDQotc2NvcGU9ImxvY2FsIj5FZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uczwveHJlZj4uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5SZW1vdmU8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5SZW1vdmUgdGhlIGl0ZW0gdGhhdCB5b3UgaGF2ZSBzZWxlY3RlZCBmcm9tIHRoZSBYTUwNCi1maWxlLiBJZiB0aGUgc2VsZWN0ZWQgaXRlbSBvciByZWxhdGVkIGl0ZW1zIGFyZSBkZWZpbmVkIHNvIHRoYXQgdGhlIGl0ZW0gbXVzdA0KLWV4aXN0IGluIHRoZSBmaWxlLCB0aGlzIG9wdGlvbiB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIEZvciBleGFtcGxlLCBpbiB5b3VyDQotRFRELCBpZiB5b3UgaGF2ZSBkZWNsYXJlZCB0aGF0ICJPbmUgb3IgbW9yZSIgb2YgdGhlIGl0ZW0gbXVzdCBhbHdheXMgZXhpc3QNCi1pbiB5b3VyIFhNTCBmaWxlLCBhbmQgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQgaXMgdGhlIG9ubHkgb25lIHRoYXQgZXhpc3RzDQotaW4geW91ciBYTUwgZmlsZS48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFkZCBBdHRyaWJ1dGU8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5BZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBlbGVtZW50IHRoYXQgeW91IHNlbGVjdGVkLiBBbnkNCi1hdHRyaWJ1dGVzIHlvdSBhcmUgYWxsb3dlZCB0byBhZGQgdG8gdGhlIGVsZW1lbnQgd2lsbCBiZSBsaXN0ZWQuIEFmdGVyIHlvdQ0KLWhhdmUgYWRkZWQgdGhlIGF0dHJpYnV0ZSB0byB0aGUgWE1MIGZpbGUsIHlvdSBjYW4gY2xpY2sgaW4gdGhlIHJpZ2h0LWhhbmQNCi1jb2x1bW4gdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBJZiB0aGUgYXR0cmlidXRlIGhhcyBzZXQgdmFsdWVzLA0KLXRoZXkgd2lsbCBhcHBlYXIgaW4gYSBsaXN0LjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+QWRkIENoaWxkPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+QWRkIGFub3RoZXIgZWxlbWVudCwgYSBjb21tZW50LCBvciBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24NCi1hcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQgZWxlbWVudC48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFkZCBCZWZvcmU8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5BZGQgYSBjaGlsZCBlbGVtZW50LCBjb21tZW50LCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uDQotdGhhdCBjYW4gZ28gYmVmb3JlIHRoZSBpdGVtIHlvdSBoYXZlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYQ0KLXBhcmVudCBlbGVtZW50IGNhbGxlZCA8dXNlcmlucHV0PkNEIENvbGxlY3Rpb25zPC91c2VyaW5wdXQ+IHRoYXQgY2FuIGNvbnRhaW4NCi1hbiB1bmxpbWl0ZWQgYW1vdW50IG9mIGNoaWxkcmVuIGNhbGxlZCA8dXNlcmlucHV0PkNEPC91c2VyaW5wdXQ+LCB5b3UgY291bGQNCi1jbGljayBhIDx1c2VyaW5wdXQ+Q0Q8L3VzZXJpbnB1dD4gZWxlbWVudCBhbmQgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+QWRkDQotQmVmb3JlPC91aWNvbnRyb2w+PHVpY29udHJvbD4gQ0Q8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiAsIGFzIGEgPHVzZXJpbnB1dD5DRDwvdXNlcmlucHV0PiBlbGVtZW50DQotY2FuIGdvIGJlZm9yZSBhbm90aGVyIDx1c2VyaW5wdXQ+Q0Q8L3VzZXJpbnB1dD4gZWxlbWVudC48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFkZCBBZnRlcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkFkZCBhIGNoaWxkIGVsZW1lbnQsIGNvbW1lbnQsIG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24NCi10aGF0IGNhbiBnbyBhZnRlciB0aGUgaXRlbSB5b3UgaGF2ZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgcGFyZW50DQotZWxlbWVudCBjYWxsZWQgPHVzZXJpbnB1dD5DRCBDb2xsZWN0aW9uczwvdXNlcmlucHV0PiB0aGF0IGNhbiBjb250YWluIGFuIHVubGltaXRlZA0KLWFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgPHVzZXJpbnB1dD5DRDwvdXNlcmlucHV0PiwgeW91IGNvdWxkIGNsaWNrIGEgPHVzZXJpbnB1dD5DRDwvdXNlcmlucHV0PiBlbGVtZW50DQotYW5kIGNsaWNrICA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5BZGQgQWZ0ZXI8L3VpY29udHJvbD48dWljb250cm9sPiBDRDwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LCBhcyBhIDx1c2VyaW5wdXQ+Q0Q8L3VzZXJpbnB1dD4gZWxlbWVudCBjYW4gZ28gYWZ0ZXIgYW5vdGhlciA8dXNlcmlucHV0PkNEPC91c2VyaW5wdXQ+IGVsZW1lbnQuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5SZXBsYWNlIFdpdGg8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5SZXBsYWNlIG9uZSBpdGVtIHdpdGggYW5vdGhlci4gVGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZQ0KLWlmIHlvdSB0dXJuIGdyYW1tYXIgY29uc3RyYWludHMgb2ZmIG9yIGlmIHRoZXJlIGFyZSBubyB2YWxpZCBhbHRlcm5hdGl2ZXMNCi1mb3IgeW91IHRvIHJlcGxhY2UgdGhlIGl0ZW0gd2l0aC48L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT48L2NvbnRleHQ+DQotPHJlc3VsdD48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgRGVzaWduIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZQ0KLVNvdXJjZSB2aWV3IGFuZCB0aGUgT3V0bGluZSB2aWV3LjwvcD48bm90ZT5UaGVzZSBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuDQotZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9ub3RlPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxNWQzNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgRGVzaWduIHZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBEZXNpZ24gdmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRwcm9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9yeG1sYmljb25zLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHhlZHRkZXMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhlZHRkZXMiPjxhIG5hbWU9InR4ZWR0ZGVzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlCi1zaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nCi1lYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsCi13aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yCi10aGF0IHBhcnRpY3VsYXIgZWxlbWVudC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkZvciBleGFtcGxlLCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIGNoaWxkPC9zcGFuPiBtZW51IGl0ZW0gd2lsbAotbGlzdCBvbmx5IHRob3NlIGVsZW1lbnRzIGZyb20gYSBEVEQgb3IgWE1MIHNjaGVtYSB3aGljaCB3b3VsZCBiZSB2YWxpZCBjaGlsZHJlbgotYXQgdGhhdCBwb2ludC48L3A+Ci08cD5XaGVuIHlvdSBoYXZlIGFuIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hCi1vciBEVEQgZmlsZSwgY2VydGFpbiB0YWdzIGFuZCBydWxlcyBmb3IgdGhhdCBmaWxlIGhhdmUgYWxyZWFkeSBiZWVuIGVzdGFibGlzaGVkLAotd2hpY2ggaXMgd2h5IHRoZSBEZXNpZ24gdmlldyBjYW4gcHJvdmlkZSBwcm9tcHRzICh2aWEgYSBwb3AtdXAgbWVudSkgZm9yIHRob3NlCi10YWdzLiBXaGVuIHlvdSBjcmVhdGUgYW4gWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEKLW9yIERURCBmaWxlLCBpdCBoYXMgbm8gdGFncyBvciBydWxlcyBhc3NvY2lhdGVkIHdpdGggaXQsIHNvIHRoZSBEZXNpZ24gdmlldwotY2Fubm90IHByb3ZpZGUgcHJvbXB0cyBmb3Igc3BlY2lmaWMgdGFncywgYnV0IGl0IGNhbiBwcm92aWRlIHByb21wdHMgdG8gY3JlYXRlCi1uZXcgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuPC9wPgotPHA+Rm9yIGFueSBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MCi1zY2hlbWEgb3IgRFREIGZpbGUsIHlvdSBjYW4gdXNlIHRoZSBEZXNpZ24gdmlldyB0byBhZGQgYW55IGl0ZW1zIGRlZmluZWQgaW4KLXRoZSBYTUwgc2NoZW1hIG9yIERURCAoc3VjaCBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcykgdG8gdGhlIFhNTCBmaWxlLiBZb3UKLWNhbiBhbHNvIHVzZSBpdCB0byBhZGQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYW5kIGNvbW1lbnRzIHRvIGFsbCBYTUwgZmlsZXMuPC9wPgotPHA+VG8KLW9wZW4gYW5kIGVkaXQgYSBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgdGhlIGZpbGUgaW4gdGhlIE5hdmlnYXRvcgotdmlldyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbiBXaXRoICZndDsgWE1MIEVkaXRvcjwvc3Bhbj4uIElmIG5lY2Vzc2FyeSwKLWNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNpZ248L3NwYW4+IHRhYiB0byBvcGVuIHRoZSBEZXNpZ24gdmlldy48L3A+Ci08cD5UbwotZXhwYW5kIGFsbCB0aGUgaXRlbXMgaW4geW91ciBYTUwgZmlsZSwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBhbmQgQWxsPC9zcGFuPjwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9leHBhbmRfYWxsLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIEV4cGFuZCBBbGwgdG9vbGJhciBidXR0b24iIC8+IG9uIHRoZSB0b29sYmFyLgotVG8gY29sbGFwc2UgdGhlbSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbGxhcHNlCi1BbGw8L3NwYW4+PC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBDb2xsYXBzZSBBbGwgdG9vbGJhciBidXR0b24iIC8+IG9uIHRoZQotdG9vbGJhci48L3A+Ci08cD5JZiB5b3UgcmlnaHQtY2xpY2sgdGhlIGl0ZW0gdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGgsIHNvbWUKLW9yIGFsbCBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMgKGFzIGFwcGxpY2FibGUpIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi1wb3AtdXAgbWVudSB0aGF0IGFwcGVhcnM6PC9wPgotPHAgLz4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPgotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0ciB2YWxpZ249ImJvdHRvbSI+Ci08dGggdmFsaWduPSJib3R0b20iIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBpZD0iTjEwMEQ4Ij5TZWxlY3QgdGhpczwvdGg+Ci0KLTx0aCB2YWxpZ249ImJvdHRvbSIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaWQ9Ik4xMDBERiI+SWYgeW91IHdhbnQgdG8gZG8gdGhpczwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBEOCAiPkFkZCBEVEQgSW5mb3JtYXRpb248L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBERiAiPkFzc29jaWF0ZSB0aGUgWE1MIGZpbGUgd2l0aCBhIERURC48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwRDggIj5FZGl0IERPQ1RZUEU8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBERiAiPkVkaXQgdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24uIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sKLWZvciBtb3JlIGRldGFpbHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0idGVkdGRvYy5odG1sIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPi48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwRDggIj5FZGl0IE5hbWVzcGFjZXM8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBERiAiPkVkaXQgdGhlIGV4aXN0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBvciBjcmVhdGUgYQotbmV3IGFzc29jaWF0aW9uIHdpdGggYSBuYW1lc3BhY2UuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0idGVkdHNjaC5odG1sIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT4uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEQ4ICI+RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwREYgIj5FZGl0IHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiBSZWZlciB0byB0aGUgcmVsYXRlZAotdGFzayBmb3IgbW9yZSBkZXRhaWxzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9InRlZHRwcm9jLmh0bWwiPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9hPi48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwRDggIj5SZW1vdmU8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBERiAiPlJlbW92ZSB0aGUgaXRlbSB0aGF0IHlvdSBoYXZlIHNlbGVjdGVkIGZyb20gdGhlIFhNTAotZmlsZS4gSWYgdGhlIHNlbGVjdGVkIGl0ZW0gb3IgcmVsYXRlZCBpdGVtcyBhcmUgZGVmaW5lZCBzbyB0aGF0IHRoZSBpdGVtIG11c3QKLWV4aXN0IGluIHRoZSBmaWxlLCB0aGlzIG9wdGlvbiB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIEZvciBleGFtcGxlLCBpbiB5b3VyCi1EVEQsIGlmIHlvdSBoYXZlIGRlY2xhcmVkIHRoYXQgIk9uZSBvciBtb3JlIiBvZiB0aGUgaXRlbSBtdXN0IGFsd2F5cyBleGlzdAotaW4geW91ciBYTUwgZmlsZSwgYW5kIHRoZSBpdGVtIHlvdSBoYXZlIHNlbGVjdGVkIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGV4aXN0cwotaW4geW91ciBYTUwgZmlsZS48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwRDggIj5BZGQgQXR0cmlidXRlPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwREYgIj5BZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBlbGVtZW50IHRoYXQgeW91IHNlbGVjdGVkLiBBbnkKLWF0dHJpYnV0ZXMgeW91IGFyZSBhbGxvd2VkIHRvIGFkZCB0byB0aGUgZWxlbWVudCB3aWxsIGJlIGxpc3RlZC4gQWZ0ZXIgeW91Ci1oYXZlIGFkZGVkIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIFhNTCBmaWxlLCB5b3UgY2FuIGNsaWNrIGluIHRoZSByaWdodC1oYW5kCi1jb2x1bW4gdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBJZiB0aGUgYXR0cmlidXRlIGhhcyBzZXQgdmFsdWVzLAotdGhleSB3aWxsIGFwcGVhciBpbiBhIGxpc3QuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEQ4ICI+QWRkIENoaWxkPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwREYgIj5BZGQgYW5vdGhlciBlbGVtZW50LCBhIGNvbW1lbnQsIG9yIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50IGVsZW1lbnQuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEQ4ICI+QWRkIEJlZm9yZTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMERGICI+QWRkIGEgY2hpbGQgZWxlbWVudCwgY29tbWVudCwgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotdGhhdCBjYW4gZ28gYmVmb3JlIHRoZSBpdGVtIHlvdSBoYXZlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYQotcGFyZW50IGVsZW1lbnQgY2FsbGVkIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Q0QgQ29sbGVjdGlvbnM8L2tiZD4gdGhhdCBjYW4gY29udGFpbgotYW4gdW5saW1pdGVkIGFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiwgeW91IGNvdWxkCi1jbGljayBhIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Q0Q8L2tiZD4gZWxlbWVudCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUJlZm9yZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gQ0Q8L3NwYW4+PC9zcGFuPiAsIGFzIGEgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50Ci1jYW4gZ28gYmVmb3JlIGFub3RoZXIgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBEOCAiPkFkZCBBZnRlcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMERGICI+QWRkIGEgY2hpbGQgZWxlbWVudCwgY29tbWVudCwgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotdGhhdCBjYW4gZ28gYWZ0ZXIgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHBhcmVudAotZWxlbWVudCBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRCBDb2xsZWN0aW9uczwva2JkPiB0aGF0IGNhbiBjb250YWluIGFuIHVubGltaXRlZAotYW1vdW50IG9mIGNoaWxkcmVuIGNhbGxlZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+LCB5b3UgY291bGQgY2xpY2sgYSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+IGVsZW1lbnQKLWFuZCBjbGljayAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQWZ0ZXI8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IENEPC9zcGFuPgotPC9zcGFuPiwgYXMgYSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+IGVsZW1lbnQgY2FuIGdvIGFmdGVyIGFub3RoZXIgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBEOCAiPlJlcGxhY2UgV2l0aDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMERGICI+UmVwbGFjZSBvbmUgaXRlbSB3aXRoIGFub3RoZXIuIFRoaXMgb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUKLWlmIHlvdSB0dXJuIGdyYW1tYXIgY29uc3RyYWludHMgb2ZmIG9yIGlmIHRoZXJlIGFyZSBubyB2YWxpZCBhbHRlcm5hdGl2ZXMKLWZvciB5b3UgdG8gcmVwbGFjZSB0aGUgaXRlbSB3aXRoLjwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgRGVzaWduIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZQotU291cmNlIHZpZXcgYW5kIHRoZSBPdXRsaW5lIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZXNlIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4KLWZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgdGl0bGU9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRwcm9jLmh0bWwiIHRpdGxlPSJJZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gc2VuZCB0byBhbiBhcHBsaWNhdGlvbiB1c2luZyBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4iPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3J4bWxiaWNvbnMuaHRtbCIgdGl0bGU9IlRoZSBmb2xsb3dpbmcgWE1MIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgYW5kIERlc2lnbiB2aWV3LiI+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYThmYWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0eGVkdHNyYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlDQotY29kZSBkaXJlY3RseS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5Tb3VyY2UgdmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+IFRoZSBTb3VyY2UgdmlldyBoYXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXM6PC9wPjxkbD4NCi08ZGxlbnRyeT4NCi08ZHQ+U3ludGF4IGhpZ2hsaWdodGluZzwvZHQ+DQotPGRkPkVhY2ggdGFnIHR5cGUgaXMgaGlnaGxpZ2h0ZWQgZGlmZmVyZW50bHksIGVuYWJsaW5nIHlvdSB0byBlYXNpbHkgZmluZA0KLWEgY2VydGFpbiBraW5kIG9mIHRhZyBmb3IgZWRpdGluZy4gSW4gYWRkaXRpb24sIHN5bnRheCBoaWdobGlnaHRpbmcgaXMgdmFsdWFibGUNCi1pbiBsb2NhdGluZyBzeW50YXggZXJyb3JzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGJlZ2luIGEgY29tbWVudCBpbiB0aGUgbWlkZGxlDQotb2YgdGhlIGRvY3VtZW50IHdpdGggPGNvZGVwaD4mbHQ7IS0tPC9jb2RlcGg+IGV2ZXJ5dGhpbmcgdW50aWwgdGhlIG5leHQgPGNvZGVwaD4tLT48L2NvZGVwaD4gaXMNCi1jb25zaWRlcmVkIGEgY29tbWVudCwgYW5kIHdpbGwgYmUgaGlnaGxpZ2h0ZWQgYWNjb3JkaW5nbHkuIFRoZSBsYXJnZSBoaWdobGlnaHRlZA0KLWFyZWEgd2lsbCBpbmRpY2F0ZSB0aGF0IHlvdSBuZWVkIHRvIGFkZCA8Y29kZXBoPi0tPjwvY29kZXBoPiB0byBjbG9zZSB0aGUNCi1jb21tZW50LjxwPllvdSBjYW4gY3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nLiBSZWZlciB0byB0aGUgcmVsYXRlZA0KLXRhc2tzIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjxkbD48ZGxlbnRyeT4NCi08ZHQ+VW5saW1pdGVkIHVuZG8gYW5kIHJlZG88L2R0Pg0KLTxkZD5UaGVzZSBvcHRpb25zIGFsbG93IHlvdSB0byBpbmNyZW1lbnRhbGx5IHVuZG8gYW5kIHJlZG8gZXZlcnkgY2hhbmdlIG1hZGUNCi10byBhIGZpbGUgZm9yIHRoZSBlbnRpcmUgZWRpdGluZyBzZXNzaW9uLiBGb3IgdGV4dCwgY2hhbmdlcyBhcmUgaW5jcmVtZW50ZWQNCi1vbmUgY2hhcmFjdGVyIG9yIHNldCBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzIGF0IGEgdGltZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+Q29udGVudCBhc3Npc3Q8L2R0Pg0KLTxkZD5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgZmluaXNoIHRhZ3MgYW5kIGluc2VydCBtYWNyb3MuIFJlZmVyIHRvIHRoZSByZWxhdGVkDQotdGFzayBmb3IgbW9yZSBkZXRhaWxzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5UZW1wbGF0ZTwvZHQ+DQotPGRkPllvdSBjYW4gYWNjZXNzIHRlbXBsYXRlcyAodXNpbmcgY29udGVudCBhc3Npc3QpIHRvIGhlbHAgeW91IHF1aWNrbHkgYWRkDQotcmVndWxhcmx5LXVzZWQgdGFnZ2luZyBjb21iaW5hdGlvbnMuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+Tm9kZSBzZWxlY3Rpb248L2R0Pg0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IgKG9yIHNlbGVjdGlvbiBpbiB0aGUgT3V0bGluZSB2aWV3KSwNCi10aGUgbm9kZSBzZWxlY3Rpb24gaW5kaWNhdG9yIGhpZ2hsaWdodHMgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGluY2x1ZGUgYSBub2RlDQotKGZvciBleGFtcGxlLCBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSksIGluIHRoZSB2ZXJ0aWNhbCBydWxlciBpbiB0aGUgbGVmdA0KLWFyZWEgb2YgdGhlIFNvdXJjZSB2aWV3LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Qb3AtdXAgbWVudSBvcHRpb25zPC9kdD4NCi08ZGQ+RnJvbSB0aGUgZWRpdG9yJ3MgcG9wLXVwIG1lbnUsIHlvdSBoYXZlIG1hbnkgb2YgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zDQotYXZhaWxhYmxlIGFzIHlvdSBkbyBmcm9tIHRoZSB3b3JrYmVuY2ggIDxiPkVkaXQ8L2I+IG1lbnUuIFlvdSBjYW4gc2VsZWN0IG1lbnUNCi1vcHRpb25zIHN1Y2ggYXM6IDx1aWNvbnRyb2w+Q2xlYW51cCBEb2N1bWVudCw8L3VpY29udHJvbD4gdG8gb3BlbiB0aGUgPHVpY29udHJvbD5DbGVhbnVwPC91aWNvbnRyb2w+IA0KLWRpYWxvZywgd2hpY2ggY29udGFpbnMgc2V0dGluZ3MgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZA0KLWFuZCBmb3JtYXR0ZWQgYW5kIDx1aWNvbnRyb2w+Rm9ybWF0LDwvdWljb250cm9sPiB3aGljaCBmb3JtYXRzIGVpdGhlciB0aGUNCi1lbnRpcmUgZG9jdW1lbnQgb3Igc2VsZWN0ZWQgZWxlbWVudHMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PiJTbWFydCIgZG91YmxlIGNsaWNraW5nPC9kdD4NCi08ZGQ+WW91IGNhbiB1c2UgZG91YmxlLWNsaWNrIHRvIHNlbGVjdCBhdHRyaWJ1dGUgdmFsdWVzLCBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMsDQotYW5kIGVudGlyZSB0YWcgc2V0cyB0byBxdWlja2x5IHVwZGF0ZSwgY29weSwgb3IgcmVtb3ZlIGNvbnRlbnQuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48cD5UbyBvcGVuIGFuIFhNTCBmaWxlIHRvIGVkaXQsIHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3IGFuZCBzZWxlY3QgPHVpY29udHJvbD5PcGVuIFdpdGggPiBYTUwgRWRpdG9yPC91aWNvbnRyb2w+LiBDbGljaw0KLXRoZSA8dWljb250cm9sPlNvdXJjZTwvdWljb250cm9sPiB0byBzZWUgdGhlIFNvdXJjZSB2aWV3LjwvcD48cD5FZGl0IHRoZSBjb2RlDQotYXMgbmVjZXNzYXJ5LCB1c2luZyBhbnkgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcy4gQXMgeW91IG1vdmUgdGhlIGN1cnNvcg0KLXdpdGhpbiB5b3VyIFhNTCBmaWxlIChvciBzZWxlY3QgaXRlbXMgZnJvbSB0aGUgT3V0bGluZSB2aWV3KSwgdGhlIG5vZGUgc2VsZWN0aW9uDQotaW5kaWNhdG9yIHdpbGwgaGlnaGxpZ2h0IHRoZSBsaW5lIG51bWJlcnMgdGhhdCBlbmNvbXBhc3MgdGhlIG5vZGUgKGZvciBleGFtcGxlLA0KLWFuIGVsZW1lbnQgb3IgYXR0cmlidXRlKS4gWW91IGNhbiB1c2Ugc21hcnQgZG91YmxlLWNsaWNraW5nIGJlaGF2aW9yIHRvIHNlbGVjdA0KLWF0dHJpYnV0ZSB2YWx1ZXMsIGF0dHJpYnV0ZS12YWx1ZSBwYWlycywgYW5kIGVudGlyZSB0YWcgc2V0cyB0byBxdWlja2x5IHVwZGF0ZSwNCi1jb3B5LCBvciByZW1vdmUgY29udGVudC4gPD9QdWIgQ2FyZXQ/PklmIGRlc2lyZWQsIHZhbGlkYXRlIGFuZCBzYXZlIHRoZSBYTUwNCi1maWxlLjwvcD48L2NvbnRleHQ+DQotPHJlc3VsdD48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgU291cmNlIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZQ0KLURlc2lnbiB2aWV3IGFuZCB0aGUgT3V0bGluZSB2aWV3LjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzc4MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk1MjYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIFNvdXJjZSB2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgU291cmNlIHZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d21hY3JvLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90dGFnaGlsdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4ZWR0c3JjIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4ZWR0c3JjIj48YSBuYW1lPSJ0eGVkdHNyYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlCi1jb2RlIGRpcmVjdGx5LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+IFRoZSBTb3VyY2UgdmlldyBoYXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXM6PC9wPgotPGRsPgotCi08ZHQgY2xhc3M9ImRsdGVybSI+U3ludGF4IGhpZ2hsaWdodGluZzwvZHQ+Ci0KLTxkZD5FYWNoIHRhZyB0eXBlIGlzIGhpZ2hsaWdodGVkIGRpZmZlcmVudGx5LCBlbmFibGluZyB5b3UgdG8gZWFzaWx5IGZpbmQKLWEgY2VydGFpbiBraW5kIG9mIHRhZyBmb3IgZWRpdGluZy4gSW4gYWRkaXRpb24sIHN5bnRheCBoaWdobGlnaHRpbmcgaXMgdmFsdWFibGUKLWluIGxvY2F0aW5nIHN5bnRheCBlcnJvcnMuIEZvciBleGFtcGxlLCBpZiB5b3UgYmVnaW4gYSBjb21tZW50IGluIHRoZSBtaWRkbGUKLW9mIHRoZSBkb2N1bWVudCB3aXRoIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDshLS08L3NhbXA+IGV2ZXJ5dGhpbmcgdW50aWwgdGhlIG5leHQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+LS0mZ3Q7PC9zYW1wPiBpcwotY29uc2lkZXJlZCBhIGNvbW1lbnQsIGFuZCB3aWxsIGJlIGhpZ2hsaWdodGVkIGFjY29yZGluZ2x5LiBUaGUgbGFyZ2UgaGlnaGxpZ2h0ZWQKLWFyZWEgd2lsbCBpbmRpY2F0ZSB0aGF0IHlvdSBuZWVkIHRvIGFkZCA8c2FtcCBjbGFzcz0iY29kZXBoIj4tLSZndDs8L3NhbXA+IHRvIGNsb3NlIHRoZQotY29tbWVudC48cD5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZy4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQKLXRhc2tzIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTwvZGQ+Ci0KLTwvZGw+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+VW5saW1pdGVkIHVuZG8gYW5kIHJlZG88L2R0PgotCi08ZGQ+VGhlc2Ugb3B0aW9ucyBhbGxvdyB5b3UgdG8gaW5jcmVtZW50YWxseSB1bmRvIGFuZCByZWRvIGV2ZXJ5IGNoYW5nZSBtYWRlCi10byBhIGZpbGUgZm9yIHRoZSBlbnRpcmUgZWRpdGluZyBzZXNzaW9uLiBGb3IgdGV4dCwgY2hhbmdlcyBhcmUgaW5jcmVtZW50ZWQKLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkNvbnRlbnQgYXNzaXN0PC9kdD4KLQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBmaW5pc2ggdGFncyBhbmQgaW5zZXJ0IG1hY3Jvcy4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQKLXRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5UZW1wbGF0ZTwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIGFjY2VzcyB0ZW1wbGF0ZXMgKHVzaW5nIGNvbnRlbnQgYXNzaXN0KSB0byBoZWxwIHlvdSBxdWlja2x5IGFkZAotcmVndWxhcmx5LXVzZWQgdGFnZ2luZyBjb21iaW5hdGlvbnMuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Ob2RlIHNlbGVjdGlvbjwvZHQ+Ci0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IgKG9yIHNlbGVjdGlvbiBpbiB0aGUgT3V0bGluZSB2aWV3KSwKLXRoZSBub2RlIHNlbGVjdGlvbiBpbmRpY2F0b3IgaGlnaGxpZ2h0cyB0aGUgbGluZSBudW1iZXJzIHRoYXQgaW5jbHVkZSBhIG5vZGUKLShmb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUpLCBpbiB0aGUgdmVydGljYWwgcnVsZXIgaW4gdGhlIGxlZnQKLWFyZWEgb2YgdGhlIFNvdXJjZSB2aWV3LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlBvcC11cCBtZW51IG9wdGlvbnM8L2R0PgotCi08ZGQ+RnJvbSB0aGUgZWRpdG9yJ3MgcG9wLXVwIG1lbnUsIHlvdSBoYXZlIG1hbnkgb2YgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zCi1hdmFpbGFibGUgYXMgeW91IGRvIGZyb20gdGhlIHdvcmtiZW5jaCAgPHN0cm9uZz5FZGl0PC9zdHJvbmc+IG1lbnUuIFlvdSBjYW4gc2VsZWN0IG1lbnUKLW9wdGlvbnMgc3VjaCBhczogPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2xlYW51cCBEb2N1bWVudCw8L3NwYW4+IHRvIG9wZW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNsZWFudXA8L3NwYW4+IAotZGlhbG9nLCB3aGljaCBjb250YWlucyBzZXR0aW5ncyB0byB1cGRhdGUgYSBkb2N1bWVudCBzbyB0aGF0IGl0IGlzIHdlbGwtZm9ybWVkCi1hbmQgZm9ybWF0dGVkIGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JtYXQsPC9zcGFuPiB3aGljaCBmb3JtYXRzIGVpdGhlciB0aGUKLWVudGlyZSBkb2N1bWVudCBvciBzZWxlY3RlZCBlbGVtZW50cy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj4iU21hcnQiIGRvdWJsZSBjbGlja2luZzwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIHVzZSBkb3VibGUtY2xpY2sgdG8gc2VsZWN0IGF0dHJpYnV0ZSB2YWx1ZXMsIGF0dHJpYnV0ZS12YWx1ZSBwYWlycywKLWFuZCBlbnRpcmUgdGFnIHNldHMgdG8gcXVpY2tseSB1cGRhdGUsIGNvcHksIG9yIHJlbW92ZSBjb250ZW50LjwvZGQ+Ci0KLTwvZGw+Ci08cD5UbyBvcGVuIGFuIFhNTCBmaWxlIHRvIGVkaXQsIHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZQotTmF2aWdhdG9yIHZpZXcgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuIFdpdGggJmd0OyBYTUwgRWRpdG9yPC9zcGFuPi4gQ2xpY2sKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Tb3VyY2U8L3NwYW4+IHRvIHNlZSB0aGUgU291cmNlIHZpZXcuPC9wPgotPHA+RWRpdCB0aGUgY29kZQotYXMgbmVjZXNzYXJ5LCB1c2luZyBhbnkgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcy4gQXMgeW91IG1vdmUgdGhlIGN1cnNvcgotd2l0aGluIHlvdXIgWE1MIGZpbGUgKG9yIHNlbGVjdCBpdGVtcyBmcm9tIHRoZSBPdXRsaW5lIHZpZXcpLCB0aGUgbm9kZSBzZWxlY3Rpb24KLWluZGljYXRvciB3aWxsIGhpZ2hsaWdodCB0aGUgbGluZSBudW1iZXJzIHRoYXQgZW5jb21wYXNzIHRoZSBub2RlIChmb3IgZXhhbXBsZSwKLWFuIGVsZW1lbnQgb3IgYXR0cmlidXRlKS4gWW91IGNhbiB1c2Ugc21hcnQgZG91YmxlLWNsaWNraW5nIGJlaGF2aW9yIHRvIHNlbGVjdAotYXR0cmlidXRlIHZhbHVlcywgYXR0cmlidXRlLXZhbHVlIHBhaXJzLCBhbmQgZW50aXJlIHRhZyBzZXRzIHRvIHF1aWNrbHkgdXBkYXRlLAotY29weSwgb3IgcmVtb3ZlIGNvbnRlbnQuIElmIGRlc2lyZWQsIHZhbGlkYXRlIGFuZCBzYXZlIHRoZSBYTUwKLWZpbGUuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkFueSBjaGFuZ2VzIHlvdSBtYWtlIGluIHRoZSBTb3VyY2UgdmlldyBhcmUgYWxzbyByZWZsZWN0ZWQgaW4gdGhlCi1EZXNpZ24gdmlldyBhbmQgdGhlIE91dGxpbmUgdmlldy48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuIj5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d21hY3JvLmh0bWwiIHRpdGxlPSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIHNlY3Rpb24gb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuIj5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R0YWdoaWx0Lmh0bWwiIHRpdGxlPSJJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlIGNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzIHRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLiI+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNjVmZjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHRhZy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0eGVkdHRhZyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgZmlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgWE1MIGZpbGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5YTUwgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+ZWRpdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gb3BlbiBhbiBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgaXQgaW4gdGhlIE5hdmlnYXRvcg0KLXZpZXcgYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5PcGVuIFdpdGg8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUVkaXRvcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LiA8L3A+PHA+V2UgcmVjb21tZW5kIHdvcmtpbmcgaW4gdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUgd2hlbiB5b3UgYXJlIGRldmVsb3BpbmcgWE1MIGZpbGVzLiBUaGUgdmlld3MgdGhhdCBhcHBlYXIgYnkgZGVmYXVsdA0KLWluIHRoaXMgcGVyc3BlY3RpdmUgKHN1Y2ggYXMgdGhlIE91dGxpbmUgdmlldykgaGVscCBmYWNpbGl0YXRlIFhNTCBkZXZlbG9wbWVudC48L3A+PHA+VGhlDQotWE1MIGVkaXRvciBlbmFibGVzIHlvdSB0byBkaXJlY3RseSBlZGl0IFhNTCBmaWxlcy4gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50DQotdmlld3MgeW91IGNhbiB1c2UgdG8gZWRpdCB5b3VyIGZpbGVzOjwvcD48dWw+DQotPGxpPjxiPlNvdXJjZSB2aWV3PC9iPjogeW91IGNhbiBtYW51YWxseSBpbnNlcnQsIGVkaXQsIGFuZCBkZWxldGUgZWxlbWVudHMNCi1hbmQgYXR0cmlidXRlcyBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFRvIGZhY2lsaXRhdGUgdGhpcyBlZmZvcnQsDQoteW91IGNhbiB1c2UgY29udGVudCBhc3Npc3Qgd2hpbGUgeW91IGFyZSBpbiB0aGUgU291cmNlIHZpZXcuPC9saT4NCi08bGk+PGI+RGVzaWduIHZpZXc8L2I+OiB5b3UgY2FuIGluc2VydCwgZGVsZXRlLCBhbmQgZWRpdCBlbGVtZW50cywgYXR0cmlidXRlcywNCi1jb21tZW50cywgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgdmlldy48L2xpPg0KLTxsaT48Yj5PdXRsaW5lIHZpZXc8L2I+OiB5b3UgY2FuIGluc2VydCBhbmQgZGVsZXRlIGVsZW1lbnRzIGF0dHJpYnV0ZXMsIGNvbW1lbnRzLA0KLWFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiB0aGlzIHZpZXcuPC9saT4NCi08L3VsPjxwPk9mdGVuLCB5b3UgbWF5IGZpbmQgdGhhdCB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIHdheSB0byBwZXJmb3JtIGEgc3BlY2lmaWMNCi10YXNrLiBGb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIGZpbGUgIk15U2Nob29sU3ViamVjdHMueG1sIiBhc3NvY2lhdGVkDQotd2l0aCBhbiBYTUwgc2NoZW1hIGZpbGUgIlNjaG9vbFN1YmplY3RzLnhzZCIsIHdoaWNoIGxpc3QgYWxsIHRoZSBzdWJqZWN0cw0KLXRhdWdodCBpbiBhIHNjaG9vbC4gWW91IHdhbnQgdG8gaW5zZXJ0IGEgbmV3IGVsZW1lbnQgIk1hdGgiIGludG8geW91ciBmaWxlLg0KLVlvdSBjYW4gZG8gc28gaW4gdGhlIGZvbGxvd2luZyB3YXlzOjwvcD48dWw+DQotPGxpPkluIHRoZSBPdXRsaW5lIG9yIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgYXBwcm9wcmlhdGUgcGFyZW50IGVsZW1lbnQNCi1hbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPjx1aWNvbnRyb2w+TWF0aDwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IG9yIDx1aWNvbnRyb2w+TmV3IEVsZW1lbnQ8L3VpY29udHJvbD4gYW5kIGVudGVyIHRoZSBuYW1lIG9mDQotdGhlIGNoaWxkIGVsZW1lbnQ8P1B1YiBDYXJldD8+LjwvbGk+DQotPGxpPkluIHRoZSBTb3VyY2UgdmlldywgdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmQgdGhlIGFwcHJvcHJpYXRlDQotbG9jYXRpb24gYW5kIGNvZGUgZm9yIHRoZSA8dWljb250cm9sPk1hdGg8L3VpY29udHJvbD4gZWxlbWVudC48L2xpPg0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHR5cGUgdGhlIGNvZGUgZm9yIHRoZSA8dWljb250cm9sPk1hdGg8L3VpY29udHJvbD4gZWxlbWVudA0KLWluIHRoZSBmaWxlLjwvbGk+DQotPC91bD48L2NvbnRleHQ+DQotPHBvc3RyZXE+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyNTMwPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OGExYWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHRhZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBYTUwgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgWE1MIGZpbGVzLCBlZGl0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgWE1MIGZpbGVzLCBlZGl0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0eGVkdHRhZyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgWE1MIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0eGVkdHRhZyI+PGEgbmFtZT0idHhlZHR0YWciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgWE1MIGZpbGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBvcGVuIGFuIFhNTCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayBpdCBpbiB0aGUgTmF2aWdhdG9yCi12aWV3IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuIFdpdGg8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1FZGl0b3I8L3NwYW4+PC9zcGFuPi4gPC9wPgotPHA+V2UgcmVjb21tZW5kIHdvcmtpbmcgaW4gdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSB3aGVuIHlvdSBhcmUgZGV2ZWxvcGluZyBYTUwgZmlsZXMuIFRoZSB2aWV3cyB0aGF0IGFwcGVhciBieSBkZWZhdWx0Ci1pbiB0aGlzIHBlcnNwZWN0aXZlIChzdWNoIGFzIHRoZSBPdXRsaW5lIHZpZXcpIGhlbHAgZmFjaWxpdGF0ZSBYTUwgZGV2ZWxvcG1lbnQuPC9wPgotPHA+VGhlCi1YTUwgZWRpdG9yIGVuYWJsZXMgeW91IHRvIGRpcmVjdGx5IGVkaXQgWE1MIGZpbGVzLiBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQKLXZpZXdzIHlvdSBjYW4gdXNlIHRvIGVkaXQgeW91ciBmaWxlczo8L3A+Ci08dWw+Ci08bGk+PHN0cm9uZz5Tb3VyY2Ugdmlldzwvc3Ryb25nPjogeW91IGNhbiBtYW51YWxseSBpbnNlcnQsIGVkaXQsIGFuZCBkZWxldGUgZWxlbWVudHMKLWFuZCBhdHRyaWJ1dGVzIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gVG8gZmFjaWxpdGF0ZSB0aGlzIGVmZm9ydCwKLXlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHdoaWxlIHlvdSBhcmUgaW4gdGhlIFNvdXJjZSB2aWV3LjwvbGk+Ci0KLTxsaT48c3Ryb25nPkRlc2lnbiB2aWV3PC9zdHJvbmc+OiB5b3UgY2FuIGluc2VydCwgZGVsZXRlLCBhbmQgZWRpdCBlbGVtZW50cywgYXR0cmlidXRlcywKLWNvbW1lbnRzLCBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+Ci0KLTxsaT48c3Ryb25nPk91dGxpbmUgdmlldzwvc3Ryb25nPjogeW91IGNhbiBpbnNlcnQgYW5kIGRlbGV0ZSBlbGVtZW50cyBhdHRyaWJ1dGVzLCBjb21tZW50cywKLWFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiB0aGlzIHZpZXcuPC9saT4KLQotPC91bD4KLTxwPk9mdGVuLCB5b3UgbWF5IGZpbmQgdGhhdCB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIHdheSB0byBwZXJmb3JtIGEgc3BlY2lmaWMKLXRhc2suIEZvciBleGFtcGxlLCB5b3UgaGF2ZSBhbiBYTUwgZmlsZSAiTXlTY2hvb2xTdWJqZWN0cy54bWwiIGFzc29jaWF0ZWQKLXdpdGggYW4gWE1MIHNjaGVtYSBmaWxlICJTY2hvb2xTdWJqZWN0cy54c2QiLCB3aGljaCBsaXN0IGFsbCB0aGUgc3ViamVjdHMKLXRhdWdodCBpbiBhIHNjaG9vbC4gWW91IHdhbnQgdG8gaW5zZXJ0IGEgbmV3IGVsZW1lbnQgIk1hdGgiIGludG8geW91ciBmaWxlLgotWW91IGNhbiBkbyBzbyBpbiB0aGUgZm9sbG93aW5nIHdheXM6PC9wPgotPHVsPgotPGxpPkluIHRoZSBPdXRsaW5lIG9yIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgYXBwcm9wcmlhdGUgcGFyZW50IGVsZW1lbnQKLWFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQ2hpbGQ8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF0aDwvc3Bhbj4KLTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3IEVsZW1lbnQ8L3NwYW4+IGFuZCBlbnRlciB0aGUgbmFtZSBvZgotdGhlIGNoaWxkIGVsZW1lbnQuPC9saT4KLQotPGxpPkluIHRoZSBTb3VyY2UgdmlldywgdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmQgdGhlIGFwcHJvcHJpYXRlCi1sb2NhdGlvbiBhbmQgY29kZSBmb3IgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hdGg8L3NwYW4+IGVsZW1lbnQuPC9saT4KLQotPGxpPkluIHRoZSBTb3VyY2UgdmlldywgdHlwZSB0aGUgY29kZSBmb3IgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hdGg8L3NwYW4+IGVsZW1lbnQKLWluIHRoZSBmaWxlLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTU2NzNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0eG1sY2F0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cw0KLWEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIExvY2F0aW9uIChzaW1pbGFyIHRvIGEgVVJJLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbg0KLWFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4NCi1XaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0bw0KLWZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleTwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBjYXRhbG9nPGluZGV4dGVybT5hZGRpbmcgZW50cmllczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+WE1MIENhdGFsb2cgZW50cmllcyBjYW4gYmUgdXNlZCBpbiB2YXJpb3VzIHNpdHVhdGlvbnMuIEZvciBleGFtcGxlLA0KLXlvdSBhcmUgd29ya2luZyBvbiBhbiBYTUwgZmlsZSBvbiB5b3VyIG1haW4gZGVza3RvcCBjb21wdXRlciBhbmQgcG9pbnQgaXRzIDxjb2RlcGg+c2NoZW1hTG9jYXRpb248L2NvZGVwaD4gdG93YXJkcw0KLWEgc2NoZW1hIGNhbGxlZCA8Y29kZXBoPmM6XE15U2NoZW1hLnhzZDwvY29kZXBoPi4gWW91IHRoZW4gc2F2ZSBpdCB0byB5b3VyDQotbGFwdG9wIGNvbXB1dGVyIHNvIHlvdSBjYW4gd29yayBvbiBpdCBsYXRlci4gV2hlbiB5b3Ugb3BlbiB0aGUgZmlsZSBvbiB5b3VyDQotbGFwdG9wLCBob3dldmVyLCB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSAtIHRoZSBYTUwgZWRpdG9yIGNhbm5vdCBmaW5kIHRoZSA8Y29kZXBoPk15U2NoZW1hLnhzZDwvY29kZXBoPiBzY2hlbWENCi1iZWNhdXNlIGl0IGlzIGFjdHVhbGx5IGluc3RhbGxlZCBvbiB5b3VyIEQgZHJpdmUuIFlvdSB3aWxsIGhhdmUgdG8gZWRpdCB0aGUgPGNvZGVwaD5zY2hlbWFMb2NhdGlvbjwvY29kZXBoPiB0bw0KLXBvaW50IHRvIDxjb2RlcGg+ZDpcTXlTY2hlbWEueHNkPC9jb2RlcGg+LiBXaGVuIHlvdSBoYXZlIGZpbmlzaGVkIGVkaXRpbmcNCi10aGUgWE1MIGZpbGUgYW5kIGFyZSByZWFkeSB0byBwdWJsaXNoIGl0IG9uIHRoZSBXZWIsIHlvdSB3aWxsIG5lZWQgdG8gZWRpdA0KLXRoZSBVUkkgYWdhaW4gc28gdGhhdCBpdCBwb2ludHMgdG8gYSByZXNvdXJjZSB0aGF0IGlzIGFjY2Vzc2libGUgb24gdGhlIFdlYi4NCi1CeSBub3csIHRoZSBwcm9ibGVtIGlzIG9idmlvdXMuIEEgVVJJIHVzZWQgd2l0aGluIGFuIFhNTCBmaWxlIGlzIG5vdCBhcyBwb3J0YWJsZQ0KLWFzIHlvdSB3b3VsZCBsaWtlIGl0IHRvIGJlLiBUbyBhdm9pZCBtYWtpbmcgZnJlcXVlbnQgY2hhbmdlcyB0byB5b3VyIFhNTCBkb2N1bWVudCwNCi15b3UgY2FuIHVzZSB0aGUgWE1MIENhdGFsb2cuPC9wPjxwPkFuIFhNTCBDYXRhbG9nIGVudHJ5IGlzIHVzZWQgYnkgYW4gWE1MDQotcHJvY2Vzc29yIHdoZW4gcmVzb2x2aW5nIGVudGl0eSByZWZlcmVuY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgdG8gdGhlIGNhdGFsb2cNCi10byBzcGVjaWZ5IGhvdyBlbnRpdGllcyBzaG91bGQgYmUgcmVzb2x2ZWQuIElmIHlvdSBjb25zaWRlciB0aGUgcHJlY2VkaW5nDQotZXhhbXBsZSwgeW91IGNvdWxkIHNwZWNpZnkgYSBydWxlIHRoYXQgcmVkaXJlY3RzIGFuIEludGVybmV0IHJlc291cmNlIHJlZmVyZW5jZQ0KLShmb3IgZXhhbXBsZSwgIDxjb2RlcGg+Imh0dHA6Ly93d3cuaWJtLmNvbS9wdWJsaXNoZWQtc2NoZW1hcy9NeVNjaGVtYS54c2QiPC9jb2RlcGg+KQ0KLXNvIHRoYXQgaXQgcG9pbnRzIHRvIGEgcmVzb3VyY2Ugb24gdGhlIGRldmVsb3BlcidzIGxvY2FsIG1hY2hpbmUgKGZvciBleGFtcGxlLA0KLSA8Y29kZXBoPiJmaWxlOi8vL0M6L015U2NoZW1hLnhzZCI8L2NvZGVwaD4pLiBOb3csIGluc3RlYWQgb2YgZnJlcXVlbnRseSBlZGl0aW5nDQotWE1MIGRvY3VtZW50cyB0byB1cGRhdGUgdGhlIFVSSXMgb3IgbG9jYXRpb25zIChlc3BlY2lhbGx5IHdoZW4gdGhlcmUgYXJlIG1hbnkNCi1kb2N1bWVudHMgaW4geW91ciBwcm9qZWN0KSwgeW91IG9ubHkgbmVlZCB0byB1cGRhdGUgYSBzaW5nbGUgcnVsZSBpbiB5b3VyDQotWE1MIENhdGFsb2cuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWFkZCBhbiBlbnRyeSB0byB0aGUgWE1MIENhdGFsb2csIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4gdGhlIFhNTCBmaWxlIHRoYXQgeW91IHdhbnQgdG8gYXNzb2NpYXRlIHdpdGggYSBEVEQgb3IgWE1MDQotc2NoZW1hLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUNhdGFsb2c8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48aW5mbz5UaGUgIDx1aWNvbnRyb2w+WE1MIENhdGFsb2cNCi1FbnRyaWVzPC91aWNvbnRyb2w+IHNlY3Rpb24gY29udGFpbnMgYSBsaXN0IG9mIGFueSB1c2VyLWRlZmluZWQgYW5kIHBsdWctaW4NCi1kZWZpbmVkIGNhdGFsb2cgZW50cmllcy4gU2VsZWN0IGFueSBlbnRyeSB0byBzZWUgaW5mb3JtYXRpb24gYWJvdXQgaXQgaW4gdGhlIDx1aWNvbnRyb2w+RGV0YWlsczwvdWljb250cm9sPiBzZWN0aW9uLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPiB0byBjcmVhdGUgYSBuZXcgY2F0YWxvZyBlbnRyeS48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5Mb2NhdGlvbjwvdWljb250cm9sPiBmaWVsZCwgZW50ZXIgb3IgYnJvd3NlIGZvcg0KLXRoZSBsb2NhdGlvbiBvciBVUkkgb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGZpbGUuIFRoaXMgdXNlcyB5b3VyIGNvbXB1dGVyJ3MNCi1wYXRoIHN0eWxlIHRvIGRlc2NyaWJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYSBrZXkgdHlwZSBmb3IgdGhlIGNhdGFsb2cgZW50cnkgZnJvbSB0aGUgPHVpY29udHJvbD5LZXkNCi1UeXBlPC91aWNvbnRyb2w+IGRyb3AgZG93bi48L2NtZD48aW5mbz5UaGUgdmFsdWVzIGluIHRoaXMgbGlzdCB3aWxsIGNoYW5nZQ0KLWRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBmaWxlIHlvdSBzcGVjaWZpZWQgaW4gdGhlIDx1aWNvbnRyb2w+TG9jYXRpb248L3VpY29udHJvbD4gZmllbGQ6PHVsPg0KLTxsaT5JZiB5b3Ugc3BlY2lmaWVkIGEgRFREOiBzZWxlY3QgPHVpY29udHJvbD5QdWJsaWMgSUQ8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+U3lzdGVtDQotSUQ8L3VpY29udHJvbD4sIG9yIDx1aWNvbnRyb2w+VVJJPC91aWNvbnRyb2w+IGZyb20gdGhlIDx1aWNvbnRyb2w+S2V5IFR5cGU8L3VpY29udHJvbD4gZmllbGQuDQotSWYgeW91IHNlbGVjdCA8dWljb250cm9sPlB1YmxpYyBJRCw8L3VpY29udHJvbD4gdGhlIHZhbHVlIHlvdSBlbnRlciBpbiB0aGUgPHVpY29udHJvbD5LZXk8L3VpY29udHJvbD4gZmllbGQNCi1zaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIFB1YmxpYyBJRCBpbiB0aGUgWE1MIGZpbGUncyBET0NUWVBFIGRlY2xhcmF0aW9uLg0KLUlmIHlvdSBzZWxlY3QgPHVpY29udHJvbD5TeXN0ZW0gSUQ8L3VpY29udHJvbD4sIHRoZSB2YWx1ZSB5b3UgZW50ZXIgc2hvdWxkDQotY29ycmVzcG9uZCB0byB0aGUgU3lzdGVtIElEIGluIGFuIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4gSWYgeW91IHNlbGVjdCA8dWljb250cm9sPlVSSTwvdWljb250cm9sPiwNCi10aGUgdmFsdWUgeW91IGVudGVyIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgVVJJLjwvbGk+DQotPGxpPklmIHlvdSBzcGVjaWZpZWQgYW4gWE1MIHNjaGVtYTogc2VsZWN0IGVpdGhlciA8dWljb250cm9sPk5hbWVzcGFjZSBOYW1lPC91aWNvbnRyb2w+IG9yDQotIDx1aWNvbnRyb2w+U2NoZW1hIExvY2F0aW9uPC91aWNvbnRyb2w+IGZyb20gdGhlIDx1aWNvbnRyb2w+S2V5IFR5cGU8L3VpY29udHJvbD4gZmllbGQuDQotSWYgdGhlIHNjaGVtYSBkZWZpbmVzIGEgdGFyZ2V0IG5hbWVzcGFjZSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFwcGVhciBpbg0KLXRoZSA8dWljb250cm9sPktleTwvdWljb250cm9sPiBmaWVsZC4gT3RoZXJ3aXNlLCB5b3UgY2FuIGVudGVyIHRoZSBzY2hlbWENCi1sb2NhdGlvbiBpbiB0aGUgPHVpY29udHJvbD5LZXk8L3VpY29udHJvbD4gZmllbGQuPC9saT4NCi08L3VsPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIDx1aWNvbnRyb2w+U3BlY2lmeSBhbHRlcm5hdGl2ZSBXZWIgYWRkcmVzczwvdWljb250cm9sPiBjaGVjaw0KLWJveCBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIFdlYiBhZGRyZXNzIGZvciB0aGUgcmVzb3VyY2UuPC9jbWQ+DQotPGluZm8+VGhpcyBXZWIgYWRkcmVzcyBpcyB1c2VkIHdoZW4gYW4gWE1MIGluc3RhbmNlIGlzIGdlbmVyYXRlZCBmcm9tIHRoaXMNCi1jYXRhbG9nIGVudHJ5Ljxub3RlPlRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3QgPHVpY29udHJvbD5QdWJsaWMNCi1JRDwvdWljb250cm9sPiAoZm9yIGEgRFREKSBvciAgPHVpY29udHJvbD5OYW1lc3BhY2UgTmFtZTwvdWljb250cm9sPiAoZm9yDQotYSBzY2hlbWEpIGluIHRoZSAgPHVpY29udHJvbD5LZXkgdHlwZTwvdWljb250cm9sPiBmaWVsZC48L25vdGU+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIHJlZmVyIHRvIGFub3RoZXIgY2F0YWxvZyB3aXRob3V0IGltcG9ydGluZyBpdCBpbnRvDQotdGhlIHdvcmtiZW5jaCwgY2xpY2sgPHVpY29udHJvbD5OZXh0IENhdGFsb2c8L3VpY29udHJvbD4uIFR5cGUgb3IgYnJvd3NlIGZvcg0KLXRoZSBYTUwgY2F0YWxvZyB5b3Ugd2FudCB0byByZWZlciB0by4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2hlbiB5b3UgYXJlIGRvbmUgY3JlYXRpbmcgY2F0YWxvZyBlbnRyaWVzLCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotY2xvc2UgdGhlIEFkZCBYTUwgQ2F0YWxvZyBFbnRyeSBkaWFsb2cuIENsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gYWdhaW4NCi10byBzYXZlIHlvdXIgc2V0dGluZ3MuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+TWFrZSBzdXJlIHRoZSBYTUwgZmlsZSBpcyBpbiBmb2N1cyBhbmQgY2xpY2sgdGhlIDx1aWNvbnRyb2w+UmVsb2FkDQotZGVwZW5kZW5jaWVzPC91aWNvbnRyb2w+IHRvb2xiYXIgYnV0dG9uLiA8L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PlRoZSBYTUwgZmlsZSBpcyBub3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgWE1MDQotc2NoZW1hIG9yIERURC48L3Jlc3VsdD4NCi08cG9zdHJlcT48cD5Zb3UgY2FuIGFsc28gZXhwb3J0IGFuZCBpbXBvcnQgWE1MIENhdGFsb2cgaW5mb3JtYXRpb246PD9QdWIgQ2FyZXQ/PiA8L3A+PHA+VG8NCi1leHBvcnQsIGNsaWNrIDx1aWNvbnRyb2w+RmlsZSA+IEV4cG9ydDwvdWljb250cm9sPiBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+WE1MDQotPiBYTUwgQ2F0YWxvZzwvdWljb250cm9sPi4gWW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gc2VsZWN0IGEgcHJvamVjdCBhbmQgcHJvdmlkZQ0KLWEgZmlsZSBuYW1lIHRvIHN0b3JlIHlvdXIgY2F0YWxvZyBlbnRyaWVzIGluIGFuIC54bWxjYXRhbG9nIGZpbGUsIHdoaWNoIGNhbg0KLWJlIG9wZW5lZCBmcm9tIHRoZSBOYXZpZ2F0b3Igdmlldy4gU2luY2UgeW91ciBjYXRhbG9nIGVudHJpZXMgYXJlIHN0b3JlZCBpbg0KLWFuIC54bWxjYXRhbG9nIGZpbGUsIHlvdSBjYW4gY2hlY2sgdGhlbSBpbiBhbmQgb3V0IGFuZCBzaGFyZSB0aGVtIGxpa2UgYW55DQotb3RoZXIgcHJvamVjdCByZXNvdXJjZS48L3A+PHA+VG8gaW1wb3J0LCBjbGljayA8dWljb250cm9sPkZpbGUgPiBJbXBvcnQ8L3VpY29udHJvbD4gYW5kDQotc2VsZWN0IDx1aWNvbnRyb2w+WE1MID4gWE1MIENhdGFsb2c8L3VpY29udHJvbD4uIFRoZW4gc3BlY2lmeSB0aGUgZmlsZSB0aGF0DQotd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlIFhNTCBDYXRhbG9nIHNldHRpbmdzLiBXaGVuIHlvdSBpbXBvcnQgYSAueG1sY2F0YWxvZw0KLWZpbGUsIGFueSBlbnRyaWVzIGluIGl0IHdpbGwgYmUgbG9hZGVkIGludG8gdGhlIFhNTCBDYXRhbG9nIChhbmQgYW55IGV4aXN0aW5nDQotZW50cmllcyB3aWxsIGJlIG92ZXJ3cml0dGVuKS4gPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNjg2OD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eG1sY2F0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI1MDE1Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgTG9jYXRpb24gKHNpbWlsYXIgdG8gYSBVUkksIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5IiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIExvY2F0aW9uIChzaW1pbGFyIHRvIGEgVVJJLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLiBZb3UgY2FuIHBsYWNlIHRoZSBLZXkgaW4gYW4gWE1MIGZpbGUuIFdoZW4gdGhlIFhNTCBwcm9jZXNzb3IgZW5jb3VudGVycyBpdCwgaXQgd2lsbCB1c2UgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleSIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBhZGRpbmcgZW50cmllcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBhZGRpbmcgZW50cmllcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4bWxjYXQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4bWxjYXQiPjxhIG5hbWU9InR4bWxjYXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMKLWEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIExvY2F0aW9uIChzaW1pbGFyIHRvIGEgVVJJLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbgotYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLgotV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8KLWZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleTwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WE1MIENhdGFsb2cgZW50cmllcyBjYW4gYmUgdXNlZCBpbiB2YXJpb3VzIHNpdHVhdGlvbnMuIEZvciBleGFtcGxlLAoteW91IGFyZSB3b3JraW5nIG9uIGFuIFhNTCBmaWxlIG9uIHlvdXIgbWFpbiBkZXNrdG9wIGNvbXB1dGVyIGFuZCBwb2ludCBpdHMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+c2NoZW1hTG9jYXRpb248L3NhbXA+IHRvd2FyZHMKLWEgc2NoZW1hIGNhbGxlZCA8c2FtcCBjbGFzcz0iY29kZXBoIj5jOlxNeVNjaGVtYS54c2Q8L3NhbXA+LiBZb3UgdGhlbiBzYXZlIGl0IHRvIHlvdXIKLWxhcHRvcCBjb21wdXRlciBzbyB5b3UgY2FuIHdvcmsgb24gaXQgbGF0ZXIuIFdoZW4geW91IG9wZW4gdGhlIGZpbGUgb24geW91cgotbGFwdG9wLCBob3dldmVyLCB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSAtIHRoZSBYTUwgZWRpdG9yIGNhbm5vdCBmaW5kIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5NeVNjaGVtYS54c2Q8L3NhbXA+IHNjaGVtYQotYmVjYXVzZSBpdCBpcyBhY3R1YWxseSBpbnN0YWxsZWQgb24geW91ciBEIGRyaXZlLiBZb3Ugd2lsbCBoYXZlIHRvIGVkaXQgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnNjaGVtYUxvY2F0aW9uPC9zYW1wPiB0bwotcG9pbnQgdG8gPHNhbXAgY2xhc3M9ImNvZGVwaCI+ZDpcTXlTY2hlbWEueHNkPC9zYW1wPi4gV2hlbiB5b3UgaGF2ZSBmaW5pc2hlZCBlZGl0aW5nCi10aGUgWE1MIGZpbGUgYW5kIGFyZSByZWFkeSB0byBwdWJsaXNoIGl0IG9uIHRoZSBXZWIsIHlvdSB3aWxsIG5lZWQgdG8gZWRpdAotdGhlIFVSSSBhZ2FpbiBzbyB0aGF0IGl0IHBvaW50cyB0byBhIHJlc291cmNlIHRoYXQgaXMgYWNjZXNzaWJsZSBvbiB0aGUgV2ViLgotQnkgbm93LCB0aGUgcHJvYmxlbSBpcyBvYnZpb3VzLiBBIFVSSSB1c2VkIHdpdGhpbiBhbiBYTUwgZmlsZSBpcyBub3QgYXMgcG9ydGFibGUKLWFzIHlvdSB3b3VsZCBsaWtlIGl0IHRvIGJlLiBUbyBhdm9pZCBtYWtpbmcgZnJlcXVlbnQgY2hhbmdlcyB0byB5b3VyIFhNTCBkb2N1bWVudCwKLXlvdSBjYW4gdXNlIHRoZSBYTUwgQ2F0YWxvZy48L3A+Ci08cD5BbiBYTUwgQ2F0YWxvZyBlbnRyeSBpcyB1c2VkIGJ5IGFuIFhNTAotcHJvY2Vzc29yIHdoZW4gcmVzb2x2aW5nIGVudGl0eSByZWZlcmVuY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgdG8gdGhlIGNhdGFsb2cKLXRvIHNwZWNpZnkgaG93IGVudGl0aWVzIHNob3VsZCBiZSByZXNvbHZlZC4gSWYgeW91IGNvbnNpZGVyIHRoZSBwcmVjZWRpbmcKLWV4YW1wbGUsIHlvdSBjb3VsZCBzcGVjaWZ5IGEgcnVsZSB0aGF0IHJlZGlyZWN0cyBhbiBJbnRlcm5ldCByZXNvdXJjZSByZWZlcmVuY2UKLShmb3IgZXhhbXBsZSwgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiJodHRwOi8vd3d3LmlibS5jb20vcHVibGlzaGVkLXNjaGVtYXMvTXlTY2hlbWEueHNkIjwvc2FtcD4pCi1zbyB0aGF0IGl0IHBvaW50cyB0byBhIHJlc291cmNlIG9uIHRoZSBkZXZlbG9wZXIncyBsb2NhbCBtYWNoaW5lIChmb3IgZXhhbXBsZSwKLSA8c2FtcCBjbGFzcz0iY29kZXBoIj4iZmlsZTovLy9DOi9NeVNjaGVtYS54c2QiPC9zYW1wPikuIE5vdywgaW5zdGVhZCBvZiBmcmVxdWVudGx5IGVkaXRpbmcKLVhNTCBkb2N1bWVudHMgdG8gdXBkYXRlIHRoZSBVUklzIG9yIGxvY2F0aW9ucyAoZXNwZWNpYWxseSB3aGVuIHRoZXJlIGFyZSBtYW55Ci1kb2N1bWVudHMgaW4geW91ciBwcm9qZWN0KSwgeW91IG9ubHkgbmVlZCB0byB1cGRhdGUgYSBzaW5nbGUgcnVsZSBpbiB5b3VyCi1YTUwgQ2F0YWxvZy48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvCi1hZGQgYW4gZW50cnkgdG8gdGhlIFhNTCBDYXRhbG9nLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgWE1MIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBhc3NvY2lhdGUgd2l0aCBhIERURCBvciBYTUwKLXNjaGVtYS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1DYXRhbG9nPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPiBUaGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBDYXRhbG9nCi1FbnRyaWVzPC9zcGFuPiBzZWN0aW9uIGNvbnRhaW5zIGEgbGlzdCBvZiBhbnkgdXNlci1kZWZpbmVkIGFuZCBwbHVnLWluCi1kZWZpbmVkIGNhdGFsb2cgZW50cmllcy4gU2VsZWN0IGFueSBlbnRyeSB0byBzZWUgaW5mb3JtYXRpb24gYWJvdXQgaXQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRldGFpbHM8L3NwYW4+IHNlY3Rpb24uCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGNhdGFsb2cgZW50cnkuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb248L3NwYW4+IGZpZWxkLCBlbnRlciBvciBicm93c2UgZm9yCi10aGUgbG9jYXRpb24gb3IgVVJJIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLiBUaGlzIHVzZXMgeW91ciBjb21wdXRlcidzCi1wYXRoIHN0eWxlIHRvIGRlc2NyaWJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSBrZXkgdHlwZSBmb3IgdGhlIGNhdGFsb2cgZW50cnkgZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5Ci1UeXBlPC9zcGFuPiBkcm9wIGRvd24uPC9zcGFuPiBUaGUgdmFsdWVzIGluIHRoaXMgbGlzdCB3aWxsIGNoYW5nZQotZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGZpbGUgeW91IHNwZWNpZmllZCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb248L3NwYW4+IGZpZWxkOjx1bD4KLTxsaT5JZiB5b3Ugc3BlY2lmaWVkIGEgRFREOiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHVibGljIElEPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3lzdGVtCi1JRDwvc3Bhbj4sIG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVSSTwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5IFR5cGU8L3NwYW4+IGZpZWxkLgotSWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMgSUQsPC9zcGFuPiB0aGUgdmFsdWUgeW91IGVudGVyIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXk8L3NwYW4+IGZpZWxkCi1zaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIFB1YmxpYyBJRCBpbiB0aGUgWE1MIGZpbGUncyBET0NUWVBFIGRlY2xhcmF0aW9uLgotSWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TeXN0ZW0gSUQ8L3NwYW4+LCB0aGUgdmFsdWUgeW91IGVudGVyIHNob3VsZAotY29ycmVzcG9uZCB0byB0aGUgU3lzdGVtIElEIGluIGFuIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4gSWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VUkk8L3NwYW4+LAotdGhlIHZhbHVlIHlvdSBlbnRlciBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIFVSSS48L2xpPgotCi08bGk+SWYgeW91IHNwZWNpZmllZCBhbiBYTUwgc2NoZW1hOiBzZWxlY3QgZWl0aGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZSBOYW1lPC9zcGFuPiBvcgotIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjaGVtYSBMb2NhdGlvbjwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5IFR5cGU8L3NwYW4+IGZpZWxkLgotSWYgdGhlIHNjaGVtYSBkZWZpbmVzIGEgdGFyZ2V0IG5hbWVzcGFjZSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFwcGVhciBpbgotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleTwvc3Bhbj4gZmllbGQuIE90aGVyd2lzZSwgeW91IGNhbiBlbnRlciB0aGUgc2NoZW1hCi1sb2NhdGlvbiBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5PC9zcGFuPiBmaWVsZC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWNpZnkgYWx0ZXJuYXRpdmUgV2ViIGFkZHJlc3M8L3NwYW4+IGNoZWNrCi1ib3ggaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBXZWIgYWRkcmVzcyBmb3IgdGhlIHJlc291cmNlLjwvc3Bhbj4KLSBUaGlzIFdlYiBhZGRyZXNzIGlzIHVzZWQgd2hlbiBhbiBYTUwgaW5zdGFuY2UgaXMgZ2VuZXJhdGVkIGZyb20gdGhpcwotY2F0YWxvZyBlbnRyeS48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMKLUlEPC9zcGFuPiAoZm9yIGEgRFREKSBvciAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlIE5hbWU8L3NwYW4+IChmb3IKLWEgc2NoZW1hKSBpbiB0aGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleSB0eXBlPC9zcGFuPiBmaWVsZC48L2Rpdj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gcmVmZXIgdG8gYW5vdGhlciBjYXRhbG9nIHdpdGhvdXQgaW1wb3J0aW5nIGl0IGludG8KLXRoZSB3b3JrYmVuY2gsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQgQ2F0YWxvZzwvc3Bhbj4uIFR5cGUgb3IgYnJvd3NlIGZvcgotdGhlIFhNTCBjYXRhbG9nIHlvdSB3YW50IHRvIHJlZmVyIHRvLiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5XaGVuIHlvdSBhcmUgZG9uZSBjcmVhdGluZyBjYXRhbG9nIGVudHJpZXMsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0bwotY2xvc2UgdGhlIEFkZCBYTUwgQ2F0YWxvZyBFbnRyeSBkaWFsb2cuIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBhZ2FpbgotdG8gc2F2ZSB5b3VyIHNldHRpbmdzLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB0aGUgWE1MIGZpbGUgaXMgaW4gZm9jdXMgYW5kIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWxvYWQKLWRlcGVuZGVuY2llczwvc3Bhbj4gdG9vbGJhciBidXR0b24uIDwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgWE1MIGZpbGUgaXMgbm93IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIFhNTAotc2NoZW1hIG9yIERURC48L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBhbHNvIGV4cG9ydCBhbmQgaW1wb3J0IFhNTCBDYXRhbG9nIGluZm9ybWF0aW9uOiA8L3A+Ci08cD5UbwotZXhwb3J0LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlICZndDsgRXhwb3J0PC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotJmd0OyBYTUwgQ2F0YWxvZzwvc3Bhbj4uIFlvdSB3aWxsIGJlIHByb21wdGVkIHRvIHNlbGVjdCBhIHByb2plY3QgYW5kIHByb3ZpZGUKLWEgZmlsZSBuYW1lIHRvIHN0b3JlIHlvdXIgY2F0YWxvZyBlbnRyaWVzIGluIGFuIC54bWxjYXRhbG9nIGZpbGUsIHdoaWNoIGNhbgotYmUgb3BlbmVkIGZyb20gdGhlIE5hdmlnYXRvciB2aWV3LiBTaW5jZSB5b3VyIGNhdGFsb2cgZW50cmllcyBhcmUgc3RvcmVkIGluCi1hbiAueG1sY2F0YWxvZyBmaWxlLCB5b3UgY2FuIGNoZWNrIHRoZW0gaW4gYW5kIG91dCBhbmQgc2hhcmUgdGhlbSBsaWtlIGFueQotb3RoZXIgcHJvamVjdCByZXNvdXJjZS48L3A+Ci08cD5UbyBpbXBvcnQsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgJmd0OyBJbXBvcnQ8L3NwYW4+IGFuZAotc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCAmZ3Q7IFhNTCBDYXRhbG9nPC9zcGFuPi4gVGhlbiBzcGVjaWZ5IHRoZSBmaWxlIHRoYXQKLXdpbGwgYmUgdXNlZCB0byBsb2FkIHRoZSBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gV2hlbiB5b3UgaW1wb3J0IGEgLnhtbGNhdGFsb2cKLWZpbGUsIGFueSBlbnRyaWVzIGluIGl0IHdpbGwgYmUgbG9hZGVkIGludG8gdGhlIFhNTCBDYXRhbG9nIChhbmQgYW55IGV4aXN0aW5nCi1lbnRyaWVzIHdpbGwgYmUgb3ZlcndyaXR0ZW4pLiA8L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiB0aXRsZT0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiB0aXRsZT0iSWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgWE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llcyB0byB1cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuIj5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgdGl0bGU9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQ5ZmZkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0eHByZWZzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5EZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5EZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MDQotZWRpdG9yIHN1Y2ggYXMgdGhlIGZvcm1hdHRlciBpbmRlbnRhdGlvbiBzdHlsZSwgbGluZSB3cmFwcGluZyBydWxlcywgYW5kIGNvbnRlbnQNCi1hc3Npc3QgcnVsZXMuIFRvIGFwcGx5IHRoZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4gdGhlIFNvdXJjZSB2aWV3DQotZm9yIHlvdXIgWE1MIGRvY3VtZW50LCBhbmQgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+Rm9ybWF0PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Eb2N1bWVudDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5wcmVmZXJlbmNlczxpbmRleHRlcm0+WE1MIGVkaXRvcjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gZGVmaW5lIFhNTCBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrICA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5FZGl0b3I8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5FbnRlciBhIG1heGltdW0gd2lkdGggZm9yIGZvcm1hdHRlZCBsaW5lcyBpbiB0aGUgPHVpY29udHJvbD5MaW5lDQotd2lkdGg8L3VpY29udHJvbD4gZmllbGQ8L2NtZD48aW5mbz5UaGUgZGVmYXVsdCB2YWx1ZSBpcyA3Mi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDx1aWNvbnRyb2w+U3BsaXQgbXVsdGlwbGUgYXR0cmlidXRlcyBlYWNoIG9uIGEgbmV3IGxpbmU8L3VpY29udHJvbD4gdG8NCi1zdGFydCBldmVyeSBhdHRyaWJ1dGUgb24gYSBuZXcgbGluZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5QcmVzZXJ2ZSB3aGl0ZXNwYWNlIGluIHRhZ3Mgd2l0aCBQQ0RBVEEgY29udGVudDwvdWljb250cm9sPiB0bw0KLXByZXZlbnQgdGhlIGVkaXRvciBmcm9tIGRlbGV0aW5nIHdoaXRlc3BhY2UgaW4gZWxlbWVudHMgdGhhdCBjb250YWluIHBhcnNlZA0KLWNoYXJhY3RlciBkYXRhLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IGJsYW5rIGxpbmVzIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLA0KLXNlbGVjdCB0aGUgPHVpY29udHJvbD5DbGVhciBhbGwgYmxhbmsgbGluZXM8L3VpY29udHJvbD4gY2hlY2sgYm94LiA8L2NtZD4NCi08aW5mbz5CeSBkZWZhdWx0LCBibGFuayBsaW5lcyBhcmUgcHJlc2VydmVkIGluIGEgZm9ybWF0dGVkIGRvY3VtZW50LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5JbmRlbnQgdXNpbmcgdGFiczwvdWljb250cm9sPiBpZiB5b3Ugd2FudCB0bw0KLXVzZSB0YWIgY2hhcmFjdGVycyAoXHQpIGFzIHRoZSBzdGFuZGFyZCBmb3JtYXR0aW5nIGluZGVudGF0aW9uLCBvciwgaWYgeW91DQotcHJlZmVyIHRvIHVzZSBzcGFjZXMsIHNlbGVjdCA8dWljb250cm9sPkluZGVudCB1c2luZyBzcGFjZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+SW5kZW50YXRpb24gc2l6ZTwvdWljb250cm9sPiB3aGljaA0KLWlzIHRoZSBudW1iZXIgb2YgdGFicyBvciBzcGFjZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBzcGVjaWZ5IGNlcnRhaW4gY2hhcmFjdGVycyAodGhlIGRlZmF1bHQgY29tbWFuZDw/UHViIENhcmV0Pz4NCi1pcyAmbHQ7PSkgdGhhdCB3aWxsIGNhdXNlIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IHRvIHBvcCB1cCBhdXRvbWF0aWNhbGx5Lg0KLUVuc3VyZSB0aGUgPHVpY29udHJvbD5BdXRvbWF0aWNhbGx5IG1ha2Ugc3VnZ2VzdGlvbnM8L3VpY29udHJvbD4gY2hlY2sgYm94DQotaXMgc2VsZWN0ZWQgYW5kIHNwZWNpZnkgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIDx1aWNvbnRyb2w+UHJvbXB0IHdoZW4gdGhlc2UNCi1jaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDwvdWljb250cm9sPiBmaWVsZC4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHNlbGVjdCA8Yj5TdHJpY3Q8L2I+IGZyb20gdGhlIDxiPlN1Z2dlc3Rpb24gc3RyYXRlZ3k8L2I+IGxpc3QsDQotc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIHNob3duIGZpcnN0ICh3aXRoIGJvbGQgaWNvbnMpDQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVsZW1lbnQNCi1zY29wZSwgYnV0IG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkLCB3aWxsIGJlIHNob3duIGJlbG93IHRoZW0gd2l0aCBhIGRlLWVtcGhhc2l6ZWQNCi1pY29uLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyA8Yj5TdHJpY3Q8L2I+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSA8dWljb250cm9sPlVzZSBpbmZlcnJlZCBncmFtbWFyIGluIGFic2VuY2Ugb2YgRFREL1NjaGVtYTwvdWljb250cm9sPiBjaGVjaw0KLWJveCBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LiA8L2NtZD48aW5mbz5JZiB0aGlzIGJveCBpcyBzZWxlY3RlZCwgd2hlbiB5b3UNCi1oYXZlIGFuIFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCB5b3Ugd2lsbA0KLXN0aWxsIGJlIGFibGUgdG8gZ2V0IGNvbnRlbnQgYXNzaXN0IC0gdGhlIHRvb2wgd2lsbCBpbmZlciB3aGF0IHNob3VsZCBjb21lDQotbmV4dCBpbiB5b3VyIGZpbGUgYmFzZWQgb24gdGhlIGV4aXN0aW5nIGNvbnRlbnQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4gYW5kIHRoZW4gPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0bw0KLXNhdmUgeW91ciBjaGFuZ2VzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzNjU5Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjZlYWFhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3Igc3VjaCBhcyB0aGUgZm9ybWF0dGVyIGluZGVudGF0aW9uIHN0eWxlLCBsaW5lIHdyYXBwaW5nIHJ1bGVzLCBhbmQgY29udGVudCBhc3Npc3QgcnVsZXMuIFRvIGFwcGx5IHRoZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4gdGhlIFNvdXJjZSB2aWV3IGZvciB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIEZvcm1hdCAmZ3Q7IERvY3VtZW50LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3Igc3VjaCBhcyB0aGUgZm9ybWF0dGVyIGluZGVudGF0aW9uIHN0eWxlLCBsaW5lIHdyYXBwaW5nIHJ1bGVzLCBhbmQgY29udGVudCBhc3Npc3QgcnVsZXMuIFRvIGFwcGx5IHRoZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4gdGhlIFNvdXJjZSB2aWV3IGZvciB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIEZvcm1hdCAmZ3Q7IERvY3VtZW50LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHByZWZlcmVuY2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgcHJlZmVyZW5jZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4cHJlZnMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0eHByZWZzIj48YSBuYW1lPSJ0eHByZWZzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTAotZWRpdG9yIHN1Y2ggYXMgdGhlIGZvcm1hdHRlciBpbmRlbnRhdGlvbiBzdHlsZSwgbGluZSB3cmFwcGluZyBydWxlcywgYW5kIGNvbnRlbnQKLWFzc2lzdCBydWxlcy4gVG8gYXBwbHkgdGhlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiB0aGUgU291cmNlIHZpZXcKLWZvciB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Rm9ybWF0PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnQ8L3NwYW4+PC9zcGFuPi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGRlZmluZSBYTUwgcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RW50ZXIgYSBtYXhpbXVtIHdpZHRoIGZvciBmb3JtYXR0ZWQgbGluZXMgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxpbmUKLXdpZHRoPC9zcGFuPiBmaWVsZDwvc3Bhbj4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNzIuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BsaXQgbXVsdGlwbGUgYXR0cmlidXRlcyBlYWNoIG9uIGEgbmV3IGxpbmU8L3NwYW4+IHRvCi1zdGFydCBldmVyeSBhdHRyaWJ1dGUgb24gYSBuZXcgbGluZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlc2VydmUgd2hpdGVzcGFjZSBpbiB0YWdzIHdpdGggUENEQVRBIGNvbnRlbnQ8L3NwYW4+IHRvCi1wcmV2ZW50IHRoZSBlZGl0b3IgZnJvbSBkZWxldGluZyB3aGl0ZXNwYWNlIGluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBwYXJzZWQKLWNoYXJhY3RlciBkYXRhLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IGJsYW5rIGxpbmVzIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLAotc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DbGVhciBhbGwgYmxhbmsgbGluZXM8L3NwYW4+IGNoZWNrIGJveC4gPC9zcGFuPgotIEJ5IGRlZmF1bHQsIGJsYW5rIGxpbmVzIGFyZSBwcmVzZXJ2ZWQgaW4gYSBmb3JtYXR0ZWQgZG9jdW1lbnQuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbmRlbnQgdXNpbmcgdGFiczwvc3Bhbj4gaWYgeW91IHdhbnQgdG8KLXVzZSB0YWIgY2hhcmFjdGVycyAoXHQpIGFzIHRoZSBzdGFuZGFyZCBmb3JtYXR0aW5nIGluZGVudGF0aW9uLCBvciwgaWYgeW91Ci1wcmVmZXIgdG8gdXNlIHNwYWNlcywgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluZGVudCB1c2luZyBzcGFjZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluZGVudGF0aW9uIHNpemU8L3NwYW4+IHdoaWNoCi1pcyB0aGUgbnVtYmVyIG9mIHRhYnMgb3Igc3BhY2UgY2hhcmFjdGVycyB1c2VkIGZvciBmb3JtYXR0aW5nIGluZGVudGF0aW9uLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBzcGVjaWZ5IGNlcnRhaW4gY2hhcmFjdGVycyAodGhlIGRlZmF1bHQgY29tbWFuZAotaXMgJmx0Oz0pIHRoYXQgd2lsbCBjYXVzZSB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB0byBwb3AgdXAgYXV0b21hdGljYWxseS4KLUVuc3VyZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXV0b21hdGljYWxseSBtYWtlIHN1Z2dlc3Rpb25zPC9zcGFuPiBjaGVjayBib3gKLWlzIHNlbGVjdGVkIGFuZCBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXJzIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9tcHQgd2hlbiB0aGVzZQotY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQ8L3NwYW4+IGZpZWxkLiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugc2VsZWN0IDxzdHJvbmc+U3RyaWN0PC9zdHJvbmc+IGZyb20gdGhlIDxzdHJvbmc+U3VnZ2VzdGlvbiBzdHJhdGVneTwvc3Ryb25nPiBsaXN0LAotc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIHNob3duIGZpcnN0ICh3aXRoIGJvbGQgaWNvbnMpCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdC4gT3RoZXIgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZWxlbWVudAotc2NvcGUsIGJ1dCBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCwgd2lsbCBiZSBzaG93biBiZWxvdyB0aGVtIHdpdGggYSBkZS1lbXBoYXNpemVkCi1pY29uLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyA8c3Ryb25nPlN0cmljdDwvc3Ryb25nPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VXNlIGluZmVycmVkIGdyYW1tYXIgaW4gYWJzZW5jZSBvZiBEVEQvU2NoZW1hPC9zcGFuPiBjaGVjawotYm94IGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuIDwvc3Bhbj4gSWYgdGhpcyBib3ggaXMgc2VsZWN0ZWQsIHdoZW4geW91Ci1oYXZlIGFuIFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCB5b3Ugd2lsbAotc3RpbGwgYmUgYWJsZSB0byBnZXQgY29udGVudCBhc3Npc3QgLSB0aGUgdG9vbCB3aWxsIGluZmVyIHdoYXQgc2hvdWxkIGNvbWUKLW5leHQgaW4geW91ciBmaWxlIGJhc2VkIG9uIHRoZSBleGlzdGluZyBjb250ZW50LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0bwotc2F2ZSB5b3VyIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmVkOTczLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0eHNpdHlwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Vc2luZyB4c2k6dHlwZTwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VXNpbmcgeHNpOnR5cGU8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IGhhdmUgZWxlbWVudHMgaW4geW91ciBYTUwgZmlsZSB3aG9zZSB0eXBlIGlzIGEgY29tcGxleCB0eXBlLA0KLXhzaTp0eXBlIHN1cHBvcnQgaW4gdGhlIFhNTCBlZGl0b3IgbGV0cyB5b3UgY2hvb3NlIGJldHdlZW4gdGhlIGNvbXBsZXggdHlwZQ0KLWFuZCBhbnkgb3RoZXIgY29tcGxleCB0eXBlcyBkZXJpdmVkIGZyb20gaXQuPC9zaG9ydGRlc2M+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gYWxsb3dzIHlvdSB0byBkZXJpdmUgdHlwZXMgYnkgZXh0ZW5zaW9uLg0KLVNlZSB0aGUgZm9sbG93aW5nIHN0ZXBzIGFzIGFuIGV4YW1wbGU8P1B1YiBDYXJldD8+OjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBmb3IgaXQgY2FsbGVkICA8dXNlcmlucHV0PkFkZHJlc3M8L3VzZXJpbnB1dD4uIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkFkZCBzb21lIGJhc2ljIGVsZW1lbnRzIHRvIDx1c2VyaW5wdXQ+QWRkcmVzczwvdXNlcmlucHV0Piwgc3VjaA0KLWFzIDx1c2VyaW5wdXQ+c3RyZWV0TmFtZTwvdXNlcmlucHV0PiBhbmQgPHVzZXJpbnB1dD5jaXR5PC91c2VyaW5wdXQ+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkRlcml2ZSAoYnkgZXh0ZW5zaW9uKSB0d28gbmV3IGNvbXBsZXggdHlwZXMgZnJvbSA8dXNlcmlucHV0PkFkZHJlc3M8L3VzZXJpbnB1dD46IDx1c2VyaW5wdXQ+VVNBZGRyZXNzPC91c2VyaW5wdXQ+IGFuZCA8dXNlcmlucHV0PlVLQWRkcmVzczwvdXNlcmlucHV0DQotPi4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+QWRkIGEgbmV3IGVsZW1lbnQgdG8gPHVzZXJpbnB1dD5VU0FkZHJlc3M8L3VzZXJpbnB1dD4gY2FsbGVkICA8dXNlcmlucHV0PnN0YXRlPC91c2VyaW5wdXQ+LA0KLWFuZCBhbHNvIGEgbmV3IGVsZW1lbnQgdG8gPHVzZXJpbnB1dD5VS0FkZHJlc3M8L3VzZXJpbnB1dD4gY2FsbGVkIDx1c2VyaW5wdXQ+cG9zdGNvZGU8L3VzZXJpbnB1dD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIHR3byBtb3JlIGVsZW1lbnRzOiA8dXNlcmlucHV0PmJpbGxUbzwvdXNlcmlucHV0PiBhbmQgPHVzZXJpbnB1dD5zaGlwVG88L3VzZXJpbnB1dD4sDQotYXMgIDxzeXN0ZW1vdXRwdXQ+QWRkcmVzczwvc3lzdGVtb3V0cHV0PiB0eXBlcy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5XaGVuIHlvdSBjcmVhdGUgYW4gWE1MIGluc3RhbmNlIGRvY3VtZW50IGZvciBhbiBlbGVtZW50IHN1Y2ggYXMNCi0gPHN5c3RlbW91dHB1dD5iaWxsVG88L3N5c3RlbW91dHB1dD4gb3IgIDx1c2VyaW5wdXQ+QWRkcmVzczwvdXNlcmlucHV0PiwgYW4NCi14c2k6dHlwZSBhdHRyaWJ1dGUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGl0LjwvY21kPjxpbmZvPkZvciBleGFtcGxlLCA8Y29kZWJsb2NrPiZsdDtiaWxsVG8geHNpOnR5cGU9ImlwbzpBZGRyZXNzIj48L2NvZGVibG9jaz5UaGUNCi14c2k6dHlwZSBhdHRyaWJ1dGUgaXMgdXNlZCB0byBpZGVudGlmeSBkZXJpdmVkIGNvbXBsZXggdHlwZXMgKGFzIHdlbGwgYXMgY29tcGxleA0KLXR5cGVzIHRoYXQgaGF2ZSBiZWVuIGRlcml2ZWQgZnJvbSkuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgYSBsaXN0IHdpbGwgYmUgYXZhaWxhYmxlLA0KLWxldHRpbmcgeW91IHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdHlwZSBkZWZpbml0aW9uICg8dWljb250cm9sPkFkZHJlc3M8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+VVNBZGRyZXNzPC91aWNvbnRyb2w+LA0KLW9yICA8dWljb250cm9sPlVLQWRkcmVzczwvdWljb250cm9sPikuIFRoZSBndWlkZWQgZWRpdGluZyBmb3IgdGhlIGNvbnRlbnQNCi1tb2RlbCB3aWxsIHJlZmxlY3QgdGhlIHR5cGUgZGVmaW5pdGlvbiB0aGF0IHlvdSBjaG9vc2UuIEZvciBleGFtcGxlLCBpZiB5b3UNCi1zZWxlY3QgIDx1aWNvbnRyb2w+VVNBZGRyZXNzPC91aWNvbnRyb2w+ICwgeW91ciA8Y29kZXBoPmJpbGxUbzwvY29kZXBoPiBlbGVtZW50DQotY2FuIGNvbnRhaW4gYSA8Y29kZXBoPnN0YXRlPC9jb2RlcGg+IGVsZW1lbnQsIGJ1dCBpdCBjYW5ub3QgY29udGFpbiBhIDxjb2RlcGg+cG9zdGNvZGU8L2NvZGVwaD4gZWxlbWVudC48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD5UaGUgWE1MIGV4YW1wbGUgIkVkaXRpbmcgYW5kIHZhbGlkYXRpbmcgWE1MIGZpbGVzIiBkZW1vbnN0cmF0ZXMgPGI+eHNpOnR5cGU8L2I+IHN1cHBvcnQuPC9wPjxwPkZvcg0KLW1vcmUgaW5mb3JtYXRpb24gYWJvdXQgeHNpOnR5cGUsIHJlZmVyIHRvIHRoZSA8Yj5Vc2luZyBEZXJpdmVkIFR5cGVzIGluIEluc3RhbmNlDQotRG9jdW1lbnRzPC9iPiBzZWN0aW9uIGluIDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvI1VzZURlcml2SW5JbnN0RG9jcyINCi1zY29wZT0iZXh0ZXJuYWwiPlhNTCBTY2hlbWEgUGFydCAwOiBQcmltZXIuPC94cmVmPjwvcD48cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbg0KLWFib3V0IHZhbGlkYXRpb24gc2VtYW50aWNzIHdoZW4geHNpOnR5cGUgaXMgdXNlZCwgcmVmZXIgdG8gdGhlIDxiPlNjaGVtYS1SZWxhdGVkDQotTWFya3VwIGluIERvY3VtZW50cyBCZWluZyBWYWxpZGF0ZWQ8L2I+IHNlY3Rpb24gaW4gIDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI3hzaV90eXBlIg0KLXNjb3BlPSJleHRlcm5hbCI+WE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L3hyZWY+IDwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDMxNTQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzQ2NDEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJVc2luZyB4c2k6dHlwZSIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiB5b3UgaGF2ZSBlbGVtZW50cyBpbiB5b3VyIFhNTCBmaWxlIHdob3NlIHR5cGUgaXMgYSBjb21wbGV4IHR5cGUsIHhzaTp0eXBlIHN1cHBvcnQgaW4gdGhlIFhNTCBlZGl0b3IgbGV0cyB5b3UgY2hvb3NlIGJldHdlZW4gdGhlIGNvbXBsZXggdHlwZSBhbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgaGF2ZSBlbGVtZW50cyBpbiB5b3VyIFhNTCBmaWxlIHdob3NlIHR5cGUgaXMgYSBjb21wbGV4IHR5cGUsIHhzaTp0eXBlIHN1cHBvcnQgaW4gdGhlIFhNTCBlZGl0b3IgbGV0cyB5b3UgY2hvb3NlIGJldHdlZW4gdGhlIGNvbXBsZXggdHlwZSBhbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0eHNpdHlwIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+VXNpbmcgeHNpOnR5cGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4c2l0eXAiPjxhIG5hbWU9InR4c2l0eXAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVzaW5nIHhzaTp0eXBlPC9oMT4KLQotCi0KLTxkaXY+PHA+SWYgeW91IGhhdmUgZWxlbWVudHMgaW4geW91ciBYTUwgZmlsZSB3aG9zZSB0eXBlIGlzIGEgY29tcGxleCB0eXBlLAoteHNpOnR5cGUgc3VwcG9ydCBpbiB0aGUgWE1MIGVkaXRvciBsZXRzIHlvdSBjaG9vc2UgYmV0d2VlbiB0aGUgY29tcGxleCB0eXBlCi1hbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbiBhbGxvd3MgeW91IHRvIGRlcml2ZSB0eXBlcyBieSBleHRlbnNpb24uCi1TZWUgdGhlIGZvbGxvd2luZyBzdGVwcyBhcyBhbiBleGFtcGxlOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCBjcmVhdGUgYSBjb21wbGV4IHR5cGUgZm9yIGl0IGNhbGxlZCAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5BZGRyZXNzPC9rYmQ+LiA8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFkZCBzb21lIGJhc2ljIGVsZW1lbnRzIHRvIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+QWRkcmVzczwva2JkPiwgc3VjaAotYXMgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5zdHJlZXROYW1lPC9rYmQ+IGFuZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPmNpdHk8L2tiZD4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EZXJpdmUgKGJ5IGV4dGVuc2lvbikgdHdvIG5ldyBjb21wbGV4IHR5cGVzIGZyb20gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5BZGRyZXNzPC9rYmQ+OiA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPlVTQWRkcmVzczwva2JkPiBhbmQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5VS0FkZHJlc3M8L2tiZD4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFkZCBhIG5ldyBlbGVtZW50IHRvIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+VVNBZGRyZXNzPC9rYmQ+IGNhbGxlZCAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5zdGF0ZTwva2JkPiwKLWFuZCBhbHNvIGEgbmV3IGVsZW1lbnQgdG8gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5VS0FkZHJlc3M8L2tiZD4gY2FsbGVkIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+cG9zdGNvZGU8L2tiZD4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgdHdvIG1vcmUgZWxlbWVudHM6IDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+YmlsbFRvPC9rYmQ+IGFuZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPnNoaXBUbzwva2JkPiwKLWFzICA8dHQgY2xhc3M9InN5c291dCI+QWRkcmVzczwvdHQ+IHR5cGVzLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPldoZW4geW91IGNyZWF0ZSBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgZm9yIGFuIGVsZW1lbnQgc3VjaCBhcwotIDx0dCBjbGFzcz0ic3lzb3V0Ij5iaWxsVG88L3R0PiBvciAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5BZGRyZXNzPC9rYmQ+LCBhbgoteHNpOnR5cGUgYXR0cmlidXRlIHdpbGwgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBpdC48L3NwYW4+IEZvciBleGFtcGxlLCA8cHJlPiZsdDtiaWxsVG8geHNpOnR5cGU9ImlwbzpBZGRyZXNzIiZndDs8L3ByZT4KLVRoZQoteHNpOnR5cGUgYXR0cmlidXRlIGlzIHVzZWQgdG8gaWRlbnRpZnkgZGVyaXZlZCBjb21wbGV4IHR5cGVzIChhcyB3ZWxsIGFzIGNvbXBsZXgKLXR5cGVzIHRoYXQgaGF2ZSBiZWVuIGRlcml2ZWQgZnJvbSkuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIGEgbGlzdCB3aWxsIGJlIGF2YWlsYWJsZSwKLWxldHRpbmcgeW91IHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdHlwZSBkZWZpbml0aW9uICg8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGRyZXNzPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VVNBZGRyZXNzPC9zcGFuPiwKLW9yICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VS0FkZHJlc3M8L3NwYW4+KS4gVGhlIGd1aWRlZCBlZGl0aW5nIGZvciB0aGUgY29udGVudAotbW9kZWwgd2lsbCByZWZsZWN0IHRoZSB0eXBlIGRlZmluaXRpb24gdGhhdCB5b3UgY2hvb3NlLiBGb3IgZXhhbXBsZSwgaWYgeW91Ci1zZWxlY3QgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVTQWRkcmVzczwvc3Bhbj4gLCB5b3VyIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmJpbGxUbzwvc2FtcD4gZWxlbWVudAotY2FuIGNvbnRhaW4gYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5zdGF0ZTwvc2FtcD4gZWxlbWVudCwgYnV0IGl0IGNhbm5vdCBjb250YWluIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+cG9zdGNvZGU8L3NhbXA+IGVsZW1lbnQuPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBleGFtcGxlICJFZGl0aW5nIGFuZCB2YWxpZGF0aW5nIFhNTCBmaWxlcyIgZGVtb25zdHJhdGVzIDxzdHJvbmc+eHNpOnR5cGU8L3N0cm9uZz4gc3VwcG9ydC48L3A+Ci08cD5Gb3IKLW1vcmUgaW5mb3JtYXRpb24gYWJvdXQgeHNpOnR5cGUsIHJlZmVyIHRvIHRoZSA8c3Ryb25nPlVzaW5nIERlcml2ZWQgVHlwZXMgaW4gSW5zdGFuY2UKLURvY3VtZW50czwvc3Ryb25nPiBzZWN0aW9uIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0wLyNVc2VEZXJpdkluSW5zdERvY3MiIHRhcmdldD0iX2JsYW5rIj5YTUwgU2NoZW1hIFBhcnQgMDogUHJpbWVyLjwvYT48L3A+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbgotYWJvdXQgdmFsaWRhdGlvbiBzZW1hbnRpY3Mgd2hlbiB4c2k6dHlwZSBpcyB1c2VkLCByZWZlciB0byB0aGUgPHN0cm9uZz5TY2hlbWEtUmVsYXRlZAotTWFya3VwIGluIERvY3VtZW50cyBCZWluZyBWYWxpZGF0ZWQ8L3N0cm9uZz4gc2VjdGlvbiBpbiAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI3hzaV90eXBlIiB0YXJnZXQ9Il9ibGFuayI+WE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L2E+IDwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2NjIyOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyXzEuMC4wLmphcgotdGVtcAotRGl0YUxpbmsuY2F0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE3MGI1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvRG9jQnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTRmOWQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0gCi0KLQlUaGlzIHNjcmlwdCBidWlsZCB0aGUgSGVscCBwbHVnLWluIGJ5IHRyYW5zZm9ybWluZyB0aGUgRElUQSBzb3VyY2UgZmlsZXMgaW50byBIVE1MLgotCQotCVRvIHVzZSB0aGlzIHNjcmlwdCwgeW91IG11c3QgaW5zdGFsbCBESVRBLU9UIG9uIHlvdXIgbWFjaGluZSBpbiB0aGUgZGlyZWN0b3J5Ci0JZGVmaW5lZCBieSB0aGUgZGl0YS5vdC5kaXIgcHJvcGVydHkuCi0JCi0JUnVuIHRoZSBkZWZhdWx0IHRhcmdldCBhZnRlciB5b3UgZWRpdCB0aGUgRElUQSBzb3VyY2UgZmlsZXMgdG8gcmVnZW5lcmF0ZSB0aGUgSFRNTC4KLQkKLQlUbyBjdXN0b21pemUgdGhpcyBzY3JpcHQgZm9yIG90aGVyIEhlbHAgcGx1Zy1pbnMsIG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIGFyZ3MuaW5wdXQgcHJvcGVydHkKLQl0byBiZSB0aGUgRElUQSBtYXAgZmlsZSBmb3IgdGhlIHBsdWctaW4uCi0JCi0JTk9URTogVGhpcyBzY3JpcHQgYXNzdW1lcyB0aGF0IGxpbmtzIHRvIHNpYmxpbmcgSGVscCBwbHVnLWlucyBoYXZlIHNjb3BlPSJwZWVyIiwgb3RoZXJ3aXNlIHRoZQotCW91dHB1dCBkaXJlY3Rvcnkgc3RydWN0dXJlIHdpbGwgYmUgc2hpZnRlZCBpbmNvcnJlY3RseS4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgeW91IGhhbmQgY29kZSB5b3VyIHBsdWdpbi54bWwgZmlsZSBpbiBteXBsdWdpbi54bWwuIFRoaXMgZmlsZQotCXdpbGwgYmUgY29waWVkIG92ZXIgdGhlIGdlbmVyYXRlZCBwbHVnaW4ueG1sIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgZ2VuZXJhdGVkIGNvcnJlY3RseQotCWJ5IERJVEEtT1QuCi0JCi0JQ2hhbmdlTG9nOgotCTIwMDYtMDQtMDUgQXJ0aHVyIFJ5bWFuIDxyeW1hbkBjYS5pYm0uY29tPgotCS0gQ3JlYXRlZC4KLQkyMDA4LTAxLTA5IEthdGUgUHJpY2UgPGthdGVwQGNhLmlibS5jb20+Ci0JLSBtb2RpZmllZCBmb3IgbmV3IERJVEEtT1QgdmVyc2lvbgotCTIwMDgtMDUtMDUgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIHRvIGFkZCBnZW5lcmF0aW9uIG9mIHByZS1idWlsdCBoZWxwIGluZGV4LiAKLQktIE11c3QgZGVsZXRlIC9pbmRleCBmb2xkZXIgYmVmb3JlIHJ1bm5pbmcgYnVpbGQKLS0tPgotPHByb2plY3QgbmFtZT0iZWNsaXBzZWhlbHAiIGRlZmF1bHQ9ImFsbCI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iZGl0YS5vdC5kaXIiIGxvY2F0aW9uPSJDOi9ESVRBLU9UMS4yLjIiIC8+Ci0KLQk8cGF0aCBpZD0iZG9zdC5jbGFzcy5wYXRoIj4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9bGliJHtmaWxlLnNlcGFyYXRvcn1kb3N0LmphciIgLz4KLQk8L3BhdGg+Ci0KLQk8dGFza2RlZiBuYW1lPSJpbnRlZ3JhdGUiIGNsYXNzbmFtZT0ib3JnLmRpdGEuZG9zdC5wbGF0Zm9ybS5JbnRlZ3JhdG9yVGFzayI+Ci0JCTxjbGFzc3BhdGggcmVmaWQ9ImRvc3QuY2xhc3MucGF0aCIgLz4KLQk8L3Rhc2tkZWY+Ci0JPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImludGVncmF0ZSwgZWNsaXBzZWhlbHAiPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iaW50ZWdyYXRlIj4KLQkJPGludGVncmF0ZSBkaXRhZGlyPSIke2RpdGEub3QuZGlyfSIgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gcmV2aXNlIGJlbG93IGhlcmUgLS0+Ci0JPHRhcmdldCBuYW1lPSJlY2xpcHNlaGVscCI+Ci0JCTxhbnQgYW50ZmlsZT0iJHtkaXRhLm90LmRpcn0ke2ZpbGUuc2VwYXJhdG9yfWNvbmR1Y3Rvci54bWwiIHRhcmdldD0iaW5pdCIgZGlyPSIke2RpdGEub3QuZGlyfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jb3B5Y3NzIiB2YWx1ZT0ibm8iIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5jc3NwYXRoIiB2YWx1ZT0iLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS5wcm92aWRlciIgdmFsdWU9IkVjbGlwc2Uub3JnIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImFyZ3MuZWNsaXBzZS52ZXJzaW9uIiB2YWx1ZT0iMy4zLjAiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5pbnB1dCIgbG9jYXRpb249IlhTRExlZGl0b3JyZWwuZGl0YW1hcCIgLz4gICAgCQkKLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGVhbi50ZW1wIiB2YWx1ZT0idHJ1ZSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLmV4dG5hbWUiIHZhbHVlPSIuZGl0YSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLnRlbXAuZGlyIiBsb2NhdGlvbj0idGVtcCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZGlyIiBsb2NhdGlvbj0iIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InRyYW5zdHlwZSIgdmFsdWU9ImVjbGlwc2VoZWxwIiAvPgotCQk8L2FudD4KLQkJPGNvcHkgZmlsZT0ibXlwbHVnaW4ueG1sIiB0b2ZpbGU9InBsdWdpbi54bWwiIG92ZXJ3cml0ZT0ieWVzIiAvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYnVpbGQuaW5kZXgiIGRlc2NyaXB0aW9uPSJCdWlsZHMgc2VhcmNoIGluZGV4IGZvciB0aGUgcGx1Zy1pbiIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JICAgICA8aGVscC5idWlsZEhlbHBJbmRleCBtYW5pZmVzdD0icGx1Z2luLnhtbCIgZGVzdGluYXRpb249Ii4iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjMDIwYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjYwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRExlZGl0b3JyZWwuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RMZWRpdG9ycmVsLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExM2VlMDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRExlZGl0b3JyZWwuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/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+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRGVkaXRvcm1hcF90b2MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwN2MwNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiINCi0gIm1hcC5kdGQiPg0KLTxtYXAgY29sbGVjdGlvbi10eXBlPSJzZXF1ZW5jZSIgaWQ9IndzdHhzZHRvYyIgdGl0bGU9IlhNTCBzY2hlbWFzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3b3JrWFNELmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHNjaGVtYXMgKFhTRHMpIj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF9jd29ya1hTRCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RjeG1sc2NoIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuZGl0YSIgbmF2dGl0bGU9IlhTRCBTbHVzaCBmaWxlIg0KLXRvYz0ibm8iPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfcmxpbWl0YXRpb25zX3NsdXNoWFNEIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90aW1wc2NobS5kaXRhIiBuYXZ0aXRsZT0iSW1wb3J0aW5nIGFuIFhNTCBzY2hlbWEiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGltcHNjaG0iLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RuYXZzcmMuZGl0YSIgbmF2dGl0bGU9Ik5hdmlnYXRpbmcgWE1MIHNjaGVtYXMiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdG5hdnNyYyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuZGl0YSIgbmF2dGl0bGU9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RyZWZhY3RyIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJlZi5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hICBlZGl0b3IgcHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGVkaXRwcmVmIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NobS5kaXRhIiBsaW5raW5nPSJub25lIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RlZGl0c2NobSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuZGl0YSIgaWQ9InhzZGNvbmNlcHRzIiBuYXZ0aXRsZT0iWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfY3htbHNjZWQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gYXR0cmlidXRlIGdyb3VwIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRncnAiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRjbXh0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBjb21wbGV4IHR5cGUiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGNteHQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRjbW9kLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBjb250ZW50IG1vZGVsIj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkY21vZCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGFueWUuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbiBhbnkgZWxlbWVudCI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkYW55ZSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGVsZW1lbnQiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGVsbSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZSI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZWxtciIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdycHIuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIGdyb3VwIHJlZmVyZW5jZSI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZ3JwciIvPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ2xiYS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgZ2xvYmFsIGF0dHJpYnV0ZSI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZ2xiYSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIGdsb2JhbCBlbGVtZW50Ij4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRnbGVtIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ3J1cC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgZ3JvdXAiPjwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGdydXAiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRpbXB0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gaW1wb3J0IGVsZW1lbnQiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGltcHQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRpbmNsLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW4gaW5jbHVkZSBlbGVtZW50Ij4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRpbmNsIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkcmRmbi5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgcmVkZWZpbmUgZWxlbWVudCI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkcmRmbiIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIHNpbXBsZSB0eXBlIj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkc21wdCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZHJlZy5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgcGF0dGVybiBmYWNldCB0byBhIHNpbXBsZSB0eXBlIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRyZWciLz48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yeHNkaWNvbnMuZGl0YSIgaWQ9InhzZGljb25zIiBuYXZ0aXRsZT0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfcnhzZGljb25zIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZGVsc2NtcC5kaXRhIiBuYXZ0aXRsZT0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90ZGVsc2NtcCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnJlZmludGcuZGl0YSIgbmF2dGl0bGU9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieHNkX3Bvc3RfcnJlZmludGciLz48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uZGl0YSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4c2RfcG9zdF90dnRzY2htIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ybm1zcGMuZGl0YSIgbmF2dGl0bGU9IlhNTCBuYW1lc3BhY2VzIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3JubXNwYyIvPjwvdG9waWNyZWY+DQotPC9tYXA+DQotPD9QdWIgKjAwMDAwMDM4Mjg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzZTJhMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJYTUwgc2NoZW1hcyIgdG9waWM9InRvcGljcy9jd29ya1hTRC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3dvcmtYU0QuaHRtbCI+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF9jd29ya1hTRCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RjeG1sc2NoLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RjeG1sc2NoIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF9ybGltaXRhdGlvbnNfc2x1c2hYU0QiLz4KLTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGltcHNjaG0uaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGltcHNjaG0iLz4KLTx0b3BpYyBsYWJlbD0iTmF2aWdhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RuYXZzcmMuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdG5hdnNyYyIvPgotPHRvcGljIGxhYmVsPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIiBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdHJlZmFjdHIiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90ZWR0cHJlZi5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90ZWRpdHByZWYiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sIj4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RlZGl0c2NobSIvPgotPHRvcGljIGxhYmVsPSJYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X2N4bWxzY2VkIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzIiBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGdycCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgY29tcGxleCB0eXBlcyIgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRjbXh0Ii8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBjb250ZW50IG1vZGVscyIgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwiPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGNtb2QiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuIGFueSBlbGVtZW50IiBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGFueWUiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZWxtIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZWxtciIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRncnByIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXMiIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkZ2xiYSIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfdGFkZGdsZW0iLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdyb3VwcyIgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRncnVwIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90YWRkaW1wdCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRpbmNsIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRyZGZuIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBzaW1wbGUgdHlwZXMiIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sIj4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRzbXB0Ii8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3RhZGRyZWciLz4KLTwvdG9waWM+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL3J4c2RpY29ucy5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF9yeHNkaWNvbnMiLz4KLTx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIiBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCI+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90ZGVsc2NtcCIvPgotPHRvcGljIGxhYmVsPSJSZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvcnJlZmludGcuaHRtbCIvPgotPGFuY2hvciBpZD0ieHNkX3Bvc3RfcnJlZmludGciLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90dmR0c2NobS5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4c2RfcG9zdF90dnRzY2htIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBuYW1lc3BhY2VzIiBocmVmPSJ0b3BpY3Mvcm5tc3BjLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhzZF9wb3N0X3JubXNwYyIvPgotPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk1NjIzZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IFhTRGVkaXRvcm1hcF90b2MueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyouaHRtKixcCi0gICAgICAgICAgICAgICBpbmRleC8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLQkJICAgICAgICoubWFwbGlzdCxcCi0gICAgICAgICAgICAgICAqLmRpdGFtYXAsXAotCQkgICAgICAgdG9waWNzLyouZGl0YQotYmluLmV4Y2x1ZGVzID0gRG9jQnVpbGQueG1sLFwKLSAgICAgICAgICAgICAgIG15UGx1Z2luKi54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0Jyb3dzZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0Jyb3dzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjExYmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9Ccm93c2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9Nb3JlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvTW9yZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjExYmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9Nb3JlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQWxsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzN2ZiYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFueS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOWY5M2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbnlBdHRyaWJ1dGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbnlBdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjgwY2MyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55QXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNDlkMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YThkZjczLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjMWRiOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlUmVmLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2NWFmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRENob2ljZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRENob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjU4M2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDb21wbGV4VHlwZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRENvbXBsZXhUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4Yjk0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRENvbXBsZXhUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNERWxlbWVudC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQ1ZjA4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNERWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREVsZW1lbnRSZWYuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50UmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5YWNmYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREVsZW1lbnRSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHbG9iYWxBdHRyaWJ1dGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHbG9iYWxBdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ0OWQwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER2xvYmFsQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER2xvYmFsRWxlbWVudC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQ1ZjA4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER2xvYmFsRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdyb3VwLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER3JvdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjJjMmQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cFJlZi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdyb3VwUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4OTg3Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdyb3VwUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNESW1wb3J0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNESW1wb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0NGNlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREltcG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREluY2x1ZGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbmNsdWRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2YzUyNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREluY2x1ZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RSZWRlZmluZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFJlZGVmaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5NjRjMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFJlZGVmaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Yjg2MTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZUVudW0uZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVFbnVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNzk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZUVudW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVQYXR0ZXJuLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlUGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTNjZjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlVHlwZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTc0NDMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvX3YuY2ZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L192LmNmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5MWRiNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvX3YuY2ZzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2Y0NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjViOTdhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgTWF5IDE0IDE5OjE1OjIxIEVEVCAyMDA4DQotb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcj1vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyXG4xLjAuNDAwLnF1YWxpZmllcg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlM2M2NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNXZWQgTWF5IDE0IDE5OjE1OjIxIEVEVCAyMDA4DQotbHVjZW5lPTEuOS4xLnYyMDA4MDMwNjE4MTENCi1hbmFseXplcj1vcmcuZWNsaXBzZS5oZWxwLmJhc2VcIzMuMy4xMDAudjIwMDgwNDI1P2xvY2FsZVw9ZW4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjZWE5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1dlZCBNYXkgMTQgMTk6MTU6MjEgRURUIDIwMDgNCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3Jwci5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGVtLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsYmEuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JyZWZpbnRnLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhbnllLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3J1cC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJkZm4uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRzbXB0Lmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJlZy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmR0c2NobS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90cmVmYWN0clhTRC5odG1sPTANCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkM2U0MjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDIzYWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJYU0RlZGl0b3JtYXBfdG9jLnhtbCIvPgotICAgICAgIDxpbmRleCBwYXRoPSJpbmRleC8iLz4KLSAgICAgIAotPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+Ci08L2V4dGVuc2lvbj4KLSAgICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UubHVjZW5lU2VhcmNoUGFydGljaXBhbnRzIj4KLSAgICAgIDxiaW5kaW5nIHBhcnRpY2lwYW50SWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS54aHRtbCIvPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci5tYXBsaXN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIubWFwbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2ZjQ2My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci5tYXBsaXN0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08bWFwbGlzdCB2ZXJzaW9uPSIzLjYuMiI+DQotICA8bmF2Pg0KLSAgICA8bWFwIGZpbGU9IlhTRGVkaXRvcm1hcF90b2MuZGl0YW1hcCIvPg0KLSAgPC9uYXY+DQotICA8bGluaz4NCi0gICAgPG1hcCBmaWxlPSJYU0RlZGl0b3JtYXBfdG9jLmRpdGFtYXAiLz4NCi0gICAgPG1hcCBmaWxlPSJYU0RMZWRpdG9ycmVsLmRpdGFtYXAiLz4NCi0gIDwvbGluaz4NCi08L21hcGxpc3Q+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjA3NjAwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA3IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPCEtLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBMaWNlbnNlZCBNYXRlcmlhbHMgUHJvcGVydHkgb2YgSUJNIC0tPgotPCEtLSBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0tPgotPCEtLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSAtLT4KLTwhLS0gR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImlibWRpdGEuY3NzIiAvPgotPHRpdGxlPkluZGV4PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgxPkluZGV4PC9oMT4KLTxhIG5hbWU9IklEWDBfNDQiIGhyZWY9IiNJRFgxXzQ0Ij5EPC9hPgotPGEgbmFtZT0iSURYMF81MCIgaHJlZj0iI0lEWDFfNTAiPlA8L2E+Ci08YSBuYW1lPSJJRFgwXzUyIiBocmVmPSIjSURYMV81MiI+UjwvYT4KLTxhIG5hbWU9IklEWDBfNTgiIGhyZWY9IiNJRFgxXzU4Ij5YPC9hPgotPGhyPjwvaHI+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDQiIGhyZWY9IiNJRFgwXzQ0Ij5EPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPmRlcGVuZGVudCBhcnRpZmFjdHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyI+cmVmYWN0b3J0aW5nIFhNTCBzY2hlbWEgZmlsZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzUwIiBocmVmPSIjSURYMF81MCI+UDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5wcmVmZXJlbmNlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0cHJlZi5odG1sI3RlZHRwcmVmIj5YTUwgc2NoZW1hIGZpbGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV81MiIgaHJlZj0iI0lEWDBfNTIiPlI8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+cmVmYWN0b3JpbmcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyI+WE1MIHNjaGVtYSBmaWxlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5yZW5hbWluZwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIj5YTUwgc2NoZW1hIGZpbGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV81OCIgaHJlZj0iI0lEWDBfNTgiPlg8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+WE1MIG5hbWVzcGFjZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3Mvcm5tc3BjLmh0bWwjcm5tc3BjIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5YTUwgc2NoZW1hIGVkaXRvcgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sI3RhZGRhbnllIj5hZGRpbmcgYW4gYW55IGVsZW1lbnQ8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sI3RhZGRyZGZuIj5hZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sI3RhZGRhZ3JwIj5hdHRyaWJ1dGUgZ3JvdXBzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcnJlZmludGcuaHRtbCNycmVmaW50ZyI+Y2xlYW4gdXAgaW48L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sI3RhZGRjbXh0Ij5jb21wbGV4IHR5cGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCN0YWRkY21vZCI+Y29udGVudCBtb2RlbHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZGVsc2NtcC5odG1sI3RkZWxzY21wIj5kZWxldGluZyBjb21wb25lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciI+ZWxlbWVudCByZWZlcmVuY2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sI3RhZGRlbG0iPmVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSI+Z2xvYmFsIGF0dHJpYnV0ZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sI3RhZGRnbGVtIj5nbG9iYWwgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIj5ncm91cCBmZWF0dXJlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiPmdyb3VwczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3J4c2RpY29ucy5odG1sI3JpY29ucyI+aWNvbnM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sI3RhZGRpbXB0Ij5pbXBvcnQgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sI3RhZGRpbmNsIj5pbmNsdWRlIGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCNjeG1sc2NlZCI+b3ZlcnZpZXc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyI+cGF0dGVybiBmYWNldHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sI3JyZWZpbnRnIj5yZWZlcmVudGlhbCBpbnRlZ3JpdHk8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sI3RhZGRzbXB0Ij5zaW1wbGUgdHlwZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sI3RlZHRzY2htIj5YTUwgc2NoZW1hIHByb3BlcnRpZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+WE1MIHNjaGVtYSBmaWxlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sI3RhZGRhbnllIj5hZGRpbmcgYW4gYW55IGVsZW1lbnQ8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sI3RhZGRyZGZuIj5hZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sI3RhZGRhZ3JwIj5hdHRyaWJ1dGUgZ3JvdXBzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCN0YWRkY214dCI+Y29tcGxleCB0eXBlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiPmNvbnRlbnQgbW9kZWxzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCN0Y3htbHNjaCI+Y3JlYXRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZGVsc2NtcC5odG1sI3RkZWxzY21wIj5kZWxldGluZyBjb21wb25lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCN0ZWR0cHJlZiI+ZWRpdGluZyBwcmVmZXJlbmNlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwjdGVkdHNjaG0iPmVkaXRpbmcgcHJvcGVydGllczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwjdGFkZGVsbXIiPmVsZW1lbnQgcmVmZXJlbmNlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIj5lbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwjdGFkZGdsYmEiPmdsb2JhbCBhdHRyaWJ1dGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSI+Z2xvYmFsIGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCN0YWRkZ3JwciI+Z3JvdXAgZmVhdHVyZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sI3RhZGRncnVwIj5ncm91cHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sI3RhZGRpbXB0Ij5pbXBvcnQgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90aW1wc2NobS5odG1sI3RpbXBzY2htIj5pbXBvcnRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sI3RhZGRpbmNsIj5pbmNsdWRlIGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdG5hdnNyYy5odG1sI3RuYXZzcmMiPm5hdmlnYXRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyI+cGF0dGVybiBmYWNldHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sI3RhZGRzbXB0Ij5zaW1wbGUgdHlwZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90dmR0c2NobS5odG1sI3R2ZHRzY2htIj52YWxpZGF0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlhNTCBzY2hlbWFzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciPmVkaXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZGQ4ODMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxpbmRleD4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCBzY2hlbWEgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjeG1sc2NoLmh0bWwjdGN4bWxzY2giIHRpdGxlPSJDcmVhdGluZyBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RpbXBzY2htLmh0bWwjdGltcHNjaG0iIHRpdGxlPSJJbXBvcnRpbmcgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJuYXZpZ2F0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdG5hdnNyYy5odG1sI3RuYXZzcmMiIHRpdGxlPSJOYXZpZ2F0aW5nIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyBwcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRwcmVmLmh0bWwjdGVkdHByZWYiIHRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgcHJvcGVydGllcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwjdGVkdHNjaG0iIHRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZSBncm91cHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sI3RhZGRhZ3JwIiB0aXRsZT0iQWRkaW5nIGF0dHJpYnV0ZSBncm91cHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb21wbGV4IHR5cGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCN0YWRkY214dCIgdGl0bGU9IkFkZGluZyBjb21wbGV4IHR5cGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY29udGVudCBtb2RlbHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sI3RhZGRjbW9kIiB0aXRsZT0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIGFuIGFueSBlbGVtZW50Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCN0YWRkYW55ZSIgdGl0bGU9IkFkZGluZyBhbiBhbnkgZWxlbWVudCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVsZW1lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sI3RhZGRlbG0iIHRpdGxlPSJBZGRpbmcgZWxlbWVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbGVtZW50IHJlZmVyZW5jZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sI3RhZGRlbG1yIiB0aXRsZT0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdyb3VwIGZlYXR1cmVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCN0YWRkZ3JwciIgdGl0bGU9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2xvYmFsIGF0dHJpYnV0ZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sI3RhZGRnbGJhIiB0aXRsZT0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2xvYmFsIGVsZW1lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJncm91cHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sI3RhZGRncnVwIiB0aXRsZT0iQWRkaW5nIGdyb3VwcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydCBlbGVtZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwjdGFkZGltcHQiIHRpdGxlPSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW5jbHVkZSBlbGVtZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiIHRpdGxlPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyByZWRlZmluZSBlbGVtZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwjdGFkZHJkZm4iIHRpdGxlPSJBZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzaW1wbGUgdHlwZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sI3RhZGRzbXB0IiB0aXRsZT0iQWRkaW5nIHNpbXBsZSB0eXBlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBhdHRlcm4gZmFjZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHJlZy5odG1sI3RhZGRyZWciIHRpdGxlPSJBZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGVsZXRpbmcgY29tcG9uZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RkZWxzY21wLmh0bWwjdGRlbHNjbXAiIHRpdGxlPSJEZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2YWxpZGF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCN0dmR0c2NobSIgdGl0bGU9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZGVwZW5kZW50IGFydGlmYWN0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InJlZmFjdG9yaW5nIFhNTCBzY2hlbWEgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIiB0aXRsZT0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJyZWZhY3RvcmluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBzY2hlbWEgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIiB0aXRsZT0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJyZW5hbWluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBzY2hlbWEgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIiB0aXRsZT0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzY2hlbWFzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciIHRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InByZWZlcmVuY2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIHNjaGVtYSBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRwcmVmLmh0bWwjdGVkdHByZWYiIHRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgc2NoZW1hIGVkaXRvciI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBzY2hlbWEgcHJvcGVydGllcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwjdGVkdHNjaG0iIHRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCNjeG1sc2NlZCIgdGl0bGU9IlhNTCBzY2hlbWEgZWRpdG9yIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYXR0cmlidXRlIGdyb3VwcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmh0bWwjdGFkZGFncnAiIHRpdGxlPSJBZGRpbmcgYXR0cmlidXRlIGdyb3VwcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbXBsZXggdHlwZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sI3RhZGRjbXh0IiB0aXRsZT0iQWRkaW5nIGNvbXBsZXggdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IG1vZGVscyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiIHRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgYW4gYW55IGVsZW1lbnQiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sI3RhZGRhbnllIiB0aXRsZT0iQWRkaW5nIGFuIGFueSBlbGVtZW50Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWxlbWVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwjdGFkZGVsbSIgdGl0bGU9IkFkZGluZyBlbGVtZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVsZW1lbnQgcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwjdGFkZGVsbXIiIHRpdGxlPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXAgZmVhdHVyZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIiB0aXRsZT0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnbG9iYWwgYXR0cmlidXRlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwjdGFkZGdsYmEiIHRpdGxlPSJBZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnbG9iYWwgZWxlbWVudHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sI3RhZGRnbGVtIiB0aXRsZT0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdyb3VwcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiIHRpdGxlPSJBZGRpbmcgZ3JvdXBzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0IGVsZW1lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCN0YWRkaW1wdCIgdGl0bGU9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbmNsdWRlIGVsZW1lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCN0YWRkaW5jbCIgdGl0bGU9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uaHRtbCN0YWRkcmRmbiIgdGl0bGU9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNpbXBsZSB0eXBlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwjdGFkZHNtcHQiIHRpdGxlPSJBZGRpbmcgc2ltcGxlIHR5cGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGF0dGVybiBmYWNldHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyIgdGl0bGU9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpY29ucyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3J4c2RpY29ucy5odG1sI3JpY29ucyIgdGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGVsZXRpbmcgY29tcG9uZW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RkZWxzY21wLmh0bWwjdGRlbHNjbXAiIHRpdGxlPSJEZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZWZlcmVudGlhbCBpbnRlZ3JpdHkiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sI3JyZWZpbnRnIiB0aXRsZT0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNsZWFuIHVwIGluIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnJlZmludGcuaHRtbCNycmVmaW50ZyIgdGl0bGU9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIG5hbWVzcGFjZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3JubXNwYy5odG1sI3JubXNwYyIgdGl0bGU9IlhNTCBuYW1lc3BhY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLTwvaW5kZXg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDVjZGM4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIgCi0jIE5MU19FTkNPRElORz1VVEYtOCAKLVBsdWdpbi5uYW1lID0gWE1MIHNjaGVtYSBlZGl0b3IKLQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQyM2FiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICA8dG9jIGZpbGU9IlhTRGVkaXRvcm1hcF90b2MueG1sIi8+Ci0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICAgICAgCi08L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotICAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5sdWNlbmVTZWFyY2hQYXJ0aWNpcGFudHMiPgotICAgICAgPGJpbmRpbmcgcGFydGljaXBhbnRJZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLnhodG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYU0QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYU0QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MDQwOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08Y29uY2VwdCBpZD0id29ya2luZ3dpdGh4bWxzY2hlbWFzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WE1MIHNjaGVtYXMgYXJlIGFuIFhNTCBsYW5ndWFnZSBmb3IgZGVzY3JpYmluZyBhbmQgY29uc3RyYWluaW5nDQotdGhlIGNvbnRlbnQgb2YgWE1MIGZpbGVzLjwvc2hvcnRkZXNjPg0KLTxjb25ib2R5Pg0KLTxwPlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+DQotPC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rIGhyZWY9InRjeG1sc2NoLmRpdGEiPjxsaW5rdGV4dD5DcmVhdGluZyBYTUwgc2NoZW1hczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRpbXBzY2htLmRpdGEiPjxsaW5rdGV4dD5JbXBvcnRpbmcgWE1MIHNjaGVtYXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0bmF2c3JjLmRpdGEiPjxsaW5rdGV4dD5OYXZpZ2F0aW5nIFhNTCBzY2hlbWFzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHJlZmFjdHJYU0QuZGl0YSI+PGxpbmt0ZXh0PlJlZmFjdG9yaW5nIGluIFhNTCBzY2hlbWFzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idGVkdHByZWYuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0icnhzZGljb25zLmRpdGEiPjxsaW5rdGV4dD5JY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRkZWxzY21wLmRpdGEiPjxsaW5rdGV4dD5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0dmR0c2NobS5kaXRhIj48bGlua3RleHQ+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InJubXNwYy5kaXRhIj48bGlua3RleHQ+WE1MIG5hbWVzcGFjZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAxMjY3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZGE4MGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hTRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlhNTCBzY2hlbWFzIGFyZSBhbiBYTUwgbGFuZ3VhZ2UgZm9yIGRlc2NyaWJpbmcgYW5kIGNvbnN0cmFpbmluZyB0aGUgY29udGVudCBvZiBYTUwgZmlsZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlhNTCBzY2hlbWFzIGFyZSBhbiBYTUwgbGFuZ3VhZ2UgZm9yIGRlc2NyaWJpbmcgYW5kIGNvbnN0cmFpbmluZyB0aGUgY29udGVudCBvZiBYTUwgZmlsZXMuIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0Y3htbHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0aW1wc2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0bmF2c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRyZWZhY3RyWFNELmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRlZHRwcmVmLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InJ4c2RpY29ucy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0ZGVsc2NtcC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0dmR0c2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJybm1zcGMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ3b3JraW5nd2l0aHhtbHNjaGVtYXMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtpbmd3aXRoeG1sc2NoZW1hcyI+PGEgbmFtZT0id29ya2luZ3dpdGh4bWxzY2hlbWFzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JraW5nIHdpdGggWE1MIHNjaGVtYXM8L2gxPgotCi0KLTxkaXY+PHA+WE1MIHNjaGVtYXMgYXJlIGFuIFhNTCBsYW5ndWFnZSBmb3IgZGVzY3JpYmluZyBhbmQgY29uc3RyYWluaW5nCi10aGUgY29udGVudCBvZiBYTUwgZmlsZXMuPC9wPgotCi08cD5UaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRjeG1sc2NoLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiI+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRpbXBzY2htLmh0bWwiIHRpdGxlPSJJZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggWE1MIHNjaGVtYSBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcgb2YgdGhlIFhNTCBzY2hlbWEuIj5JbXBvcnRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRuYXZzcmMuaHRtbCIgdGl0bGU9IldoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSBTb3VyY2UgdmlldywgeW91IGNhbiB1c2UgRjMgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgZmlsZSBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGFuZCBwcmVzc2luZyBGMyB0byBqdW1wIHRvIHRoZSBpdGVtIGl0IHJlZmVycyB0by4iPk5hdmlnYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRyZWZhY3RyWFNELmh0bWwiIHRpdGxlPSJXaXRoaW4gYW4gWE1MIFNjaGVtYSBmaWxlLCByZWZhY3RvcmluZyBhbGxvd3MgYXV0aG9ycyB0byBtYWtlIGEgc2luZ2xlIGFydGlmYWN0IGNoYW5nZSwgYW5kIGhhdmUgdGhhdCBjaGFuZ2UgaW1wbGVtZW50ZWQgdGhyb3VnaG91dCBhbGwgb3RoZXIgZGVwZW5kYW50IGFydGlmYWN0cy4iPlJlZmFjdG9yaW5nIGluIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0ZWR0cHJlZi5odG1sIiB0aXRsZT0iWW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgWE1MIHNjaGVtYSBmaWxlcyBzdWNoIGFzIHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgYW5kIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXggdXNlZC4iPkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0ZGVsc2NtcC5odG1sIiB0aXRsZT0iSWYgeW91IGhhdmUgY3JlYXRlZCBhbnkgWE1MIHNjaGVtYSBjb21wb25lbnRzIHlvdSBubyBsb25nZXIgbmVlZCwgeW91IGNhbiBkZWxldGUgdGhlbS4iPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHZkdHNjaG0uaHRtbCIgdGl0bGU9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIj5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icnhzZGljb25zLmh0bWwiIHRpdGxlPSJUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSwgRGVzaWduLCBhbmQgUHJvcGVydGllcyB2aWV3LiI+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJubXNwYy5odG1sIiB0aXRsZT0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHNjZWQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHNjZWQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhYWIzZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN4bWxzY2VkIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5YTUwgc2NoZW1hIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+WE1MIHNjaGVtYSBlZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywNCi1hbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudA0KLW5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2gNCi1jb21iaW5hdGlvbnMuIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5BIHNjaGVtYSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBhIERURCwgYnV0IGlzIHdyaXR0ZW4gaW4gWE1MLiBBDQotc2NoZW1hIGFsc28gcHJvdmlkZXMgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIGRhdGEgdHlwaW5nLCBpbmhlcml0YW5jZSwNCi1hbmQgcHJlc2VudGF0aW9uIHJ1bGVzLjwvcD4NCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgc2NoZW1hLCBzZWUgdGhlIGZvbGxvd2luZzo8L3A+DQotPHVsPg0KLTxsaT4gPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMC8iIHNjb3BlPSJleHRlcm5hbCI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvPC94cmVmPiA8L2xpPg0KLTxsaT4gPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8iIHNjb3BlPSJleHRlcm5hbCI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvPC94cmVmPiA8L2xpPg0KLTxsaT4gPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8iIHNjb3BlPSJleHRlcm5hbCI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvPC94cmVmPiA8L2xpPg0KLTwvdWw+DQotPHA+VXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuOjwvcD4NCi08dWw+DQotPGxpPkNyZWF0ZSBhbmQgZGVsZXRlIFhNTCBzY2hlbWEgY29tcG9uZW50cyBzdWNoIGFzIGNvbXBsZXggdHlwZXMsIHNpbXBsZQ0KLXR5cGVzLCBlbGVtZW50cywgYXR0cmlidXRlcywgYXR0cmlidXRlIGdyb3VwcywgYW5kIGdyb3Vwcy48L2xpPg0KLTxsaT5FZGl0IFhNTCBzY2hlbWFzLjwvbGk+DQotPGxpPkltcG9ydCBleGlzdGluZyBYTUwgc2NoZW1hcyBmb3Igc3RydWN0dXJlZCB2aWV3aW5nLjwvbGk+DQotPC91bD4NCi08cD5UaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIFczQyBXZWIgc2l0ZSBpcyB1c2VkIGZvciB2YWxpZGF0aW9uLjwvcD4NCi08c2VjdGlvbj48dGl0bGU+WE1MIHNjaGVtYSBlZGl0b3Igdmlld3MgLSBEZXNpZ24sIE91dGxpbmUsIFByb3BlcnRpZXMsIGFuZA0KLVNvdXJjZTwvdGl0bGU+VGhlcmUgYXJlIGZvdXIgbWFpbiB2aWV3cyB5b3UgY2FuIHdvcmsgd2l0aCBpbiB0aGUgWE1MIHNjaGVtYQ0KLWVkaXRvcjo8dWw+DQotPGxpPkRlc2lnbiAtIHRoZSBEZXNpZ24gdmlldyBwcm92aWRlcyBhIGdyYXBoaWNhbCB3YXkgdG8gZWRpdCB5b3VyIHNjaGVtYTwvbGk+DQotPGxpPk91dGxpbmUgLSB0aGUgT3V0bGluZSB2aWV3IHNob3dzIHlvdSB0aGUgbWFpbiBjb21wb25lbnRzIGluIHlvdXIgWE1MIHNjaGVtYS4NCi1Zb3UgY2FuIHVzZSB0aGlzIHZpZXcgdG8gYWRkIGFuZCByZW1vdmUgY2VydGFpbiBjb21wb25lbnRzLjwvbGk+DQotPGxpPlByb3BlcnRpZXMgLSB0aGUgUHJvcGVydGllcyB2aWV3IGVuYWJsZXMgeW91IHRvIGVkaXQgdGhlIHByb3BlcnRpZXMgb2YNCi15b3VyIFhNTCBzY2hlbWEgY29tcG9uZW50czwvbGk+DQotPGxpPlNvdXJjZSAtIHRoZSBTb3VyY2UgdmlldyBlbmFibGVzIHlvdSB0byBlZGl0IHlvdXIgc291cmNlIGNvZGUgZGlyZWN0bHk8L2xpPg0KLTwvdWw+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TdGF0dXMgb2YgdGhlIFhNTCBzY2hlbWE8L3RpdGxlPjxwPjwvcD48cD5UaHJlZSBzdGF0dXMgaW5kaWNhdG9ycw0KLWZvciB0aGUgc2NoZW1hIGFyZSBhdmFpbGFibGUuIFRoZXkgYXJlIGluIHRoZSBib3R0b20gcmlnaHQgY29ybmVyOjwvcD48dWw+DQotPGxpPiA8dWljb250cm9sPldyaXRhYmxlPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+UmVhZCBPbmx5PC91aWNvbnRyb2w+LiA8L2xpPg0KLTxsaT4gKFNvdXJjZSB2aWV3IG9ubHkpIDx1aWNvbnRyb2w+U21hcnQgSW5zZXJ0PC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+T3ZlcndyaXRlPC91aWNvbnRyb2w+Lg0KLVRvIHRvZ2dsZSBiZXR3ZWVuIHRoZXNlIG1vZGVzLCBwcmVzcyB0aGUgPHVpY29udHJvbD5JbnNlcnQ8L3VpY29udHJvbD4gYnV0dG9uDQotb24geW91ciBrZXlib2FyZC48L2xpPg0KLTxsaT4gTGluZSBhbmQgY29sdW1uIG51bWJlciAoZGlzcGxheWVkIGluIHRoZSBmb3JtYXQgPD9QdWIgQ2FyZXQ/Pjx1c2VyaW5wdXQ+Y29sdW1uDQotIyA6IGxpbmUgIzwvdXNlcmlucHV0Pik8L2xpPg0KLTwvdWw+PC9zZWN0aW9uPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDI5MDY/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHNjZWQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHNjZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlZGFmMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYTUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBvdmVydmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3htbHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R2ZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3htbHNjZWQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgc2NoZW1hIGVkaXRvcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3htbHNjZWQiPjxhIG5hbWU9ImN4bWxzY2VkIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgc2NoZW1hIGVkaXRvcjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywKLWFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYTUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBlbGVtZW50Ci1uYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoCi1jb21iaW5hdGlvbnMuIDwvcD4KLQotPHA+QSBzY2hlbWEgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gYSBEVEQsIGJ1dCBpcyB3cml0dGVuIGluIFhNTC4gQQotc2NoZW1hIGFsc28gcHJvdmlkZXMgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIGRhdGEgdHlwaW5nLCBpbmhlcml0YW5jZSwKLWFuZCBwcmVzZW50YXRpb24gcnVsZXMuPC9wPgotCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgc2NoZW1hLCBzZWUgdGhlIGZvbGxvd2luZzo8L3A+Ci0KLTx1bD4KLTxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvPC9hPiA8L2xpPgotCi08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLzwvYT4gPC9saT4KLQotPGxpPiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi88L2E+IDwvbGk+Ci0KLTwvdWw+Ci0KLTxwPlVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbjo8L3A+Ci0KLTx1bD4KLTxsaT5DcmVhdGUgYW5kIGRlbGV0ZSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgc3VjaCBhcyBjb21wbGV4IHR5cGVzLCBzaW1wbGUKLXR5cGVzLCBlbGVtZW50cywgYXR0cmlidXRlcywgYXR0cmlidXRlIGdyb3VwcywgYW5kIGdyb3Vwcy48L2xpPgotCi08bGk+RWRpdCBYTUwgc2NoZW1hcy48L2xpPgotCi08bGk+SW1wb3J0IGV4aXN0aW5nIFhNTCBzY2hlbWFzIGZvciBzdHJ1Y3R1cmVkIHZpZXdpbmcuPC9saT4KLQotPC91bD4KLQotPHA+VGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbiBmcm9tIHRoZSBXM0MgV2ViIHNpdGUgaXMgdXNlZCBmb3IgdmFsaWRhdGlvbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5YTUwgc2NoZW1hIGVkaXRvciB2aWV3cyAtIERlc2lnbiwgT3V0bGluZSwgUHJvcGVydGllcywgYW5kCi1Tb3VyY2U8L2g0PlRoZXJlIGFyZSBmb3VyIG1haW4gdmlld3MgeW91IGNhbiB3b3JrIHdpdGggaW4gdGhlIFhNTCBzY2hlbWEKLWVkaXRvcjo8dWw+Ci08bGk+RGVzaWduIC0gdGhlIERlc2lnbiB2aWV3IHByb3ZpZGVzIGEgZ3JhcGhpY2FsIHdheSB0byBlZGl0IHlvdXIgc2NoZW1hPC9saT4KLQotPGxpPk91dGxpbmUgLSB0aGUgT3V0bGluZSB2aWV3IHNob3dzIHlvdSB0aGUgbWFpbiBjb21wb25lbnRzIGluIHlvdXIgWE1MIHNjaGVtYS4KLVlvdSBjYW4gdXNlIHRoaXMgdmlldyB0byBhZGQgYW5kIHJlbW92ZSBjZXJ0YWluIGNvbXBvbmVudHMuPC9saT4KLQotPGxpPlByb3BlcnRpZXMgLSB0aGUgUHJvcGVydGllcyB2aWV3IGVuYWJsZXMgeW91IHRvIGVkaXQgdGhlIHByb3BlcnRpZXMgb2YKLXlvdXIgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9saT4KLQotPGxpPlNvdXJjZSAtIHRoZSBTb3VyY2UgdmlldyBlbmFibGVzIHlvdSB0byBlZGl0IHlvdXIgc291cmNlIGNvZGUgZGlyZWN0bHk8L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TdGF0dXMgb2YgdGhlIFhNTCBzY2hlbWE8L2g0PjxwIC8+Ci08cD5UaHJlZSBzdGF0dXMgaW5kaWNhdG9ycwotZm9yIHRoZSBzY2hlbWEgYXJlIGF2YWlsYWJsZS4gVGhleSBhcmUgaW4gdGhlIGJvdHRvbSByaWdodCBjb3JuZXI6PC9wPgotPHVsPgotPGxpPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xcml0YWJsZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVhZCBPbmx5PC9zcGFuPi4gPC9saT4KLQotPGxpPiAoU291cmNlIHZpZXcgb25seSkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U21hcnQgSW5zZXJ0PC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdmVyd3JpdGU8L3NwYW4+LgotVG8gdG9nZ2xlIGJldHdlZW4gdGhlc2UgbW9kZXMsIHByZXNzIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQ8L3NwYW4+IGJ1dHRvbgotb24geW91ciBrZXlib2FyZC48L2xpPgotCi08bGk+IExpbmUgYW5kIGNvbHVtbiBudW1iZXIgKGRpc3BsYXllZCBpbiB0aGUgZm9ybWF0IDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Y29sdW1uCi0jIDogbGluZSAjPC9rYmQ+KTwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGN4bWxzY2guaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIHRoZW4gZWRpdCBpdCB1c2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbiBzcGVjaWZ5IGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5DcmVhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIHRpdGxlPSJBZnRlciB5b3UgY3JlYXRlIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gZWRpdCBpdHMgdmFyaW91cyBwcm9wZXJ0aWVzLCBzdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC4iPkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHZkdHNjaG0uaHRtbCIgdGl0bGU9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIj5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTAyNjBkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiIgInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InJsaW1pdGF0aW9uc19zbHVzaFhTRCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+TGltaXRhdGlvbnMgb2YgWE1MIHNjaGVtYSBlZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLjwvc2hvcnRkZXNjPg0KLTxyZWZib2R5Pg0KLTwhLS1Vc2UgdGhpcyB0ZW1wbGF0ZSB0byBzaW5nbGUgc291cmNlIHRoZSByZWFkbWUgaW5mb3JtYXRpb24uICBUaGUgY29udGVudCBmb3IgdGhlIHJlYWRtZSBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIGluIHRoaXMgdG9waWMgYW5kIGlzIGluc2VydGVkIGludG8gdGhlIHJlbGF0ZWQgdG9waWMgdXNpbmcgdGhlIGNvbnJlZiBhdHRyaWJ1dGUuIFRoaXMgZmlsZSB3aWxsIG5vdCBiZSBzdXJmYWNlZCBpbiB5b3VyIG5hdmlnYXRpb24uLS0+DQotPHNlY3Rpb24+PHRpdGxlPkhlYnJldyBMb2dpY2FsIGVuY29kaW5nPC90aXRsZT48cCBpZD0iZW5jb2RpbmciPjwhLS1UaGVyZSBpcyBubyBkZWZlY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50cnkuIEl0IGlzIGZyb20gdGhlIDUuMSByZWFkbWUuLS0+V2hlbg0KLUhlYnJldyBMb2dpY2FsIChJU08tODg1OS04LUkpIGVuY29kaW5nIGlzIHNlbGVjdGVkIGFzIGEgcHJlZmVyZW5jZSBmb3IgZW5jb2RpbmcNCi1vZiBIVE1MIGZpbGVzICg8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTCBGaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+SFRNTCBmaWxlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGluIHRoZSAiV2hlbiBjcmVhdGluZyBmaWxlcyIgc2VjdGlvbiksIHRoZSBIVE1MIGRvY3VtZW50YXRpb24NCi1maWxlcyBnZW5lcmF0ZWQgZnJvbSBhbiBYTUwgc2NoZW1hIGZpbGUgd2lsbCBzdGlsbCBoYXZlIGEgVVRGLTggZW5jb2RpbmcuDQotVGhpcyBpcyBhIGtub3duIHByb2JsZW0uPC9wPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODY5YmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTGltaXRhdGlvbnMgb2YgWE1MIHNjaGVtYSBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJybGltaXRhdGlvbnNfc2x1c2hYU0QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icmxpbWl0YXRpb25zX3NsdXNoWFNEIj48YSBuYW1lPSJybGltaXRhdGlvbnNfc2x1c2hYU0QiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkxpbWl0YXRpb25zIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuPC9wPgotCi0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5IZWJyZXcgTG9naWNhbCBlbmNvZGluZzwvaDQ+PHAgaWQ9InJsaW1pdGF0aW9uc19zbHVzaFhTRF9fZW5jb2RpbmciPjxhIG5hbWU9InJsaW1pdGF0aW9uc19zbHVzaFhTRF9fZW5jb2RpbmciPjwhLS0gLS0+PC9hPldoZW4KLUhlYnJldyBMb2dpY2FsIChJU08tODg1OS04LUkpIGVuY29kaW5nIGlzIHNlbGVjdGVkIGFzIGEgcHJlZmVyZW5jZSBmb3IgZW5jb2RpbmcKLW9mIEhUTUwgZmlsZXMgKDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBmaWxlczwvc3Bhbj4KLTwvc3Bhbj4gaW4gdGhlICJXaGVuIGNyZWF0aW5nIGZpbGVzIiBzZWN0aW9uKSwgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbgotZmlsZXMgZ2VuZXJhdGVkIGZyb20gYW4gWE1MIHNjaGVtYSBmaWxlIHdpbGwgc3RpbGwgaGF2ZSBhIFVURi04IGVuY29kaW5nLgotVGhpcyBpcyBhIGtub3duIHByb2JsZW0uPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1MzMxZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iDQotICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJybm1zcGMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlhNTCBuYW1lc3BhY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgbmFtZXNwYWNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSQ0KLXJlZmVyZW5jZSwgd2hpY2ggYXJlIHVzZWQgaW4gWE1MIGRvY3VtZW50cyBhcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGUNCi1uYW1lcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgbmFtZXNwYWNlczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHNlY3Rpb24+WE1MIG5hbWVzcGFjZXMgYXJlIGRlZmluZWQgYnkgYSBXM0MgcmVjb21tZW5kYXRpb24sIGRhdGluZyAxNiBBdWd1c3QNCi0yMDA2LCBjYWxsZWQgPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L1JFQy14bWwtbmFtZXMtMjAwNjA4MTYvIg0KLXNjb3BlPSJleHRlcm5hbCI+TmFtZXNwYWNlcyBpbiBYTUw8L3hyZWY+LiBYTUwgdGFnIG5hbWVzIHNob3VsZCBiZSBnbG9iYWxseQ0KLXVuaXF1ZSwgYXMgd2VsbCBhcyBzaG9ydCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gSW4gb3JkZXIgdG8gcmVzb2x2ZSB0aGlzDQotY29uZmxpY3QsIHRoZSBXM0MgbmFtZXNwYWNlIHJlY29tbWVuZGF0aW9uIGRlZmluZXMgYW4gYXR0cmlidXRlIDxiPnhtbG5zPC9iPiB3aGljaA0KLWNhbiBhbWVuZCBhbnkgWE1MIGVsZW1lbnQuIElmIGl0IGlzIHByZXNlbnQgaW4gYW4gZWxlbWVudCwgaXQgaWRlbnRpZmllcyB0aGUNCi1uYW1lc3BhY2UgZm9yIHRoaXMgZWxlbWVudC48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHA+VGhlIHhtbG5zIGF0dHJpYnV0ZSBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6PC9wPjxwPjxjb2RlcGg+eG1sbnM6PHZhcm5hbWU+cHJlZml4PC92YXJuYW1lPj1uYW1lc3BhY2U8L2NvZGVwaD4gPC9wPjxwPndoZXJlIDxjb2RlcGg+bmFtZXNwYWNlPC9jb2RlcGgNCi0+IGlzIGEgdW5pcXVlIFVSSSAoc3VjaCBhcyB3d3cuaWJtLmNvbSkgYW5kIHdoZXJlIDxjb2RlcGg+PHZhcm5hbWU+cHJlZml4PC92YXJuYW1lPjwvY29kZXBoPiByZXByZXNlbnRzDQotdGhlIG5hbWVzcGFjZSBhbmQgcHJvdmlkZXMgYSBwb2ludGVyIHRvIGl0LjwvcD48cD5JbiB0aGUgZm9sbG93aW5nIGN1c3RvbWVyDQotZWxlbWVudCBkZWZpbml0aW9uLCBhbiBhY2NvdW50aW5nIG5hbWVzcGFjZSBpcyBkZWZpbmVkIGluIG9yZGVyIHRvIGJlIGFibGUNCi10byBkaXN0aW5ndWlzaCB0aGUgZWxlbWVudCB0YWdzIGZyb20gdGhvc2UgYXBwZWFyaW5nIGluIGN1c3RvbWVyIHJlY29yZHMgY3JlYXRlZA0KLWJ5IG90aGVyIGJ1c2luZXNzIGFwcGxpY2F0aW9uczo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7YWNjdDpjdXN0b21lciB4bWxuczphY2N0PSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwIj4NCi0JJmx0O2FjY3Q6bmFtZT5Db3Jwb3JhdGlvbiZsdDsvYWNjdDpuYW1lPg0KLQkmbHQ7YWNjdDpvcmRlciBhY2N0OnJlZj0iNTU2NiIvPg0KLQkmbHQ7YWNjdDpzdGF0dXM+aW52b2ljZSZsdDsvYWNjdDpzdGF0dXM+DQotJmx0Oy9hY2N0OmN1c3RvbWVyPiAgPC9jb2RlYmxvY2s+IDwvcD48cD5UaGUgbmFtZXNwYWNlIGRlZmluaXRpb24gaW4gdGhlIGZpcnN0DQotbGluZSBhc3NpZ25zIHRoZSBuYW1lc3BhY2UgaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMCB0byB0aGUgcHJlZml4LiBUaGlzDQotcHJlZml4IGlzIHVzZWQgb24gdGhlIGVsZW1lbnQgbmFtZXMgc3VjaCBhcyBuYW1lIGluIG9yZGVyIHRvIGF0dGFjaCB0aGVtIHRvDQotdGhlIG5hbWVzcGFjZS4gQSBzZWNvbmQgYXBwbGljYXRpb24sIGZvciBleGFtcGxlLCBhIGZ1bGZpbGxtZW50IHN5c3RlbSwgY2FuDQotYXNzaWduIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0byBpdHMgY3VzdG9tZXIgZWxlbWVudHM6PC9wPjxwPjxjb2RlYmxvY2s+Jmx0O2Z1bDpjdXN0b21lciB4bWxuczpmdWw9Imh0dHA6Ly93d3cueW91ci5jb20vZnVsIj4NCi0JJmx0O2Z1bDpuYW1lPkNvcnBvcmF0aW9uJmx0Oy9mdWw6bmFtZT4NCi0JJmx0O2Z1bDpvcmRlciBmdWw6cmVmPSJBOTg3NTYiLz4NCi0JJmx0O2Z1bDpzdGF0dXM+c2hpcHBlZCZsdDsvZnVsOnN0YXR1cz4NCi0gJmx0Oy9mdWw6Y3VzdG9tZXI+PC9jb2RlYmxvY2s+IDwvcD48cD5BbiBhcHBsaWNhdGlvbiBwcm9jZXNzaW5nIGJvdGggZGF0YQ0KLXN0cnVjdHVyZXMgaXMgbm93IGFibGUgdG8gdHJlYXQgdGhlIGFjY291bnRpbmcgYW5kIHRoZSBmdWxmaWxsbWVudCBkYXRhIGRpZmZlcmVudGx5Lg0KLVRoZXJlIGlzIGEgZGVmYXVsdCBuYW1lc3BhY2UuIEl0IGlzIHNldCBpZiBubyBsb2NhbCBuYW1lIGlzIGFzc2lnbmVkIGluIHRoZQ0KLW5hbWVzcGFjZSBkZWZpbml0aW9uOjwvcD48cD48Y29kZWJsb2NrPiZsdDthY2N0OmN1c3RvbWVyIHhtbG5zPSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwIiB4bWxuczphY2N0PSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwICI+DQotJmx0O25hbWU+Q29ycG9yYXRpb24mbHQ7L25hbWU+DQotJmx0O29yZGVyIGFjY3Q6cmVmPSI1NTY2Ii8+DQotJmx0O3N0YXR1cz5pbnZvaWNlJmx0Oy9zdGF0dXM+DQotJmx0Oy9jdXN0b21lcj48L2NvZGVibG9jaz48L3A+PHA+SW4gdGhpcyBleGFtcGxlLCBhbGwgdGFncyBpbiB0aGUgY3VzdG9tZXINCi1yZWNvcmQgYXJlIHF1YWxpZmllZCB0byByZXNpZGUgaW4gdGhlIG5hbWVzcGFjZSBodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwLg0KLU5vIGV4cGxpY2l0IHByZWZpeCBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgaXMgdXNlZC4gTm90ZSB0aGF0DQotdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGFwcGxpZXMgdG8gYW55IGF0dHJpYnV0ZXMgZGVmaW5pdGlvbnMuPC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+WE1MIHNjaGVtYXMgYW5kIG5hbWVzcGFjZXM8L3RpdGxlPjxwPkluIHRoZSBmb2xsb3dpbmcgWE1MDQotc2NoZW1hLCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgZm9yIHRoZSBzY2hlbWEgaXMgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgWE1MDQotc2NoZW1hIG5hbWVzcGFjZSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYTsgdGhlcmUgaXMgYWxzbyBhIHNjaGVtYQ0KLXNwZWNpZmljIG5hbWVzcGFjZSBodHRwOi8vd3d3LmlibS5jb20uPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3NjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczpUZXN0U2NoZW1hPSJodHRwOi8vd3d3LmlibS5jb20iPg0KLSAmbHQ7c2ltcGxlVHlwZSBuYW1lPSJaaXBDb2RlVHlwZSI+DQotICZsdDtyZXN0cmljdGlvbiBiYXNlPSJpbnRlZ2VyIj4NCi0gICZsdDttaW5JbmNsdXNpdmUgdmFsdWU9IjEwMDAwIi8+DQotICZsdDttYXhJbmNsdXNpdmUgdmFsdWU9Ijk5OTk5Ii8+DQotJmx0Oy9yZXN0cmljdGlvbj4NCi0gJmx0Oy9zaW1wbGVUeXBlPiANCi0gJmx0OyEtLWVsZW1lbnQgZGVmaW5pdGlvbnMgc2tpcHBlZCAtLT4gIA0KLSZsdDsvc2NoZW1hPiAgPC9jb2RlYmxvY2s+PC9wPjxwPkFzc3VtaW5nIHRoYXQgdGhlIHByZWNlZGluZyBYTUwgc2NoZW1hIGlzDQotc2F2ZWQgYXMgPGZpbGVwYXRoPkM6XHRlbXBcVGVzdFNjaGVtYS54c2Q8L2ZpbGVwYXRoPiwgYSBzYW1wbGUgWE1MIGZpbGUgdGhhdA0KLXZhbGlkYXRlcyBhZ2FpbnN0IHRoaXMgc2NoZW1hIGlzOjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDt4OmFkZHJlc3NMaXN0IHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIGZpbGU6Ly8vQzovdGVtcC9UZXN0U2NoZW1hLnhzZCI+DQotIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIGZpbGU6Ly8vQzovdGVtcC9UZXN0U2NoZW1hLnhzZCI+DQotJmx0O3g6YWRkcmVzcz4NCi0gJmx0O3g6c3RyZWV0Png6VmFuZ2Vyb3dzdHJhc3NlJmx0Oy94OnN0cmVldD4NCi0gICZsdDt4OnppcENvZGU+NjkxMTUmbHQ7L3g6emlwQ29kZT4NCi0gJmx0O3g6Y2l0eT54OkhlaWRlbGJlcmcmbHQ7L3g6Y2l0eT4NCi0gJmx0Oy94OmFkZHJlc3M+DQotICAgICZsdDt4OmFkZHJlc3M+IA0KLSZsdDt4OnN0cmVldD54OkJlcm5hbCBSb2FkJmx0Oy94OnN0cmVldD4gDQotJmx0O3g6emlwQ29kZT45MDM3NSZsdDsveDp6aXBDb2RlPg0KLSAgICAgJmx0O3g6Y2l0eT54OlNhbiBKb3NlJmx0Oy94OmNpdHk+DQotICZsdDsveDphZGRyZXNzPg0KLSZsdDsveDphZGRyZXNzTGlzdD4gPC9jb2RlYmxvY2s+PC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+VGFyZ2V0IG5hbWVzcGFjZTwvdGl0bGU+PHA+IFRoZSB0YXJnZXQgbmFtZXNwYWNlIHNlcnZlcyB0bw0KLWlkZW50aWZ5IHRoZSBuYW1lc3BhY2Ugd2l0aGluIHdoaWNoIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBlbGVtZW50IGFuZA0KLWl0cyBuYW1lIGV4aXN0cy4gSW4gdGhlIGNhc2Ugb2YgZGVjbGFyYXRpb25zLCB0aGlzIGFzc29jaWF0aW9uIGRldGVybWluZXMNCi10aGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50cyBpbiBYTUwgZmlsZXMgY29uZm9ybWluZyB0byB0aGUgc2NoZW1hLiBBbiBYTUwNCi1maWxlIGltcG9ydGluZyBhIHNjaGVtYSBtdXN0IHJlZmVyZW5jZSBpdHMgdGFyZ2V0IG5hbWVzcGFjZSBpbiB0aGUgc2NoZW1hTG9jYXRpb24NCi1hdHRyaWJ1dGUuIEFueSBtaXNtYXRjaGVzIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlIGFjdHVhbCBuYW1lc3BhY2Ugb2YgYW4NCi1lbGVtZW50IGFyZSByZXBvcnRlZCBhcyBzY2hlbWEgdmFsaWRhdGlvbiBlcnJvcnMuIEluIG91ciBleGFtcGxlLCB0aGUgdGFyZ2V0DQotbmFtZXNwYWNlIGlzIGh0dHA6Ly93d3cuaWJtLmNvbTsgaXQgaXMgZGVmaW5lZCBpbiB0aGUgIFhNTCBzY2hlbWEgZmlsZSBhbmQNCi1yZWZlcmVuY2VkIHR3aWNlIGluIHRoZSBYTUwgZmlsZS4gQW55IG1pc21hdGNoIGJldHdlZW4gdGhlc2UgdGhyZWUgb2NjdXJyZW5jZXMNCi1vZiB0aGUgbmFtZXNwYWNlIGxlYWQgdG8gdmFsaWRhdGlvbiBlcnJvcnMuPC9wPjxwPiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzDQotc2hvdyBob3cgdGFyZ2V0IG5hbWVzcGFjZXMgYW5kIG5hbWVzcGFjZSBwcmVmaXhlcyB3b3JrIGluIFhNTCBzY2hlbWFzIGFuZA0KLXRoZWlyIGNvcnJlc3BvbmRpbmcgWE1MIGluc3RhbmNlIGRvY3VtZW50cy48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgMSAtIEEgc2NoZW1hIHdpdGggYm90aCBhIGRlZmF1bHQgYW5kIHRhcmdldCBuYW1lc3BhY2UNCi1hbmQgdW5xdWFsaWZpZWQgbG9jYWxzPC90aXRsZT48cD5UaGUgWE1MIHNjaGVtYTogIDwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIj4NCi0mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiPg0KLSZsdDtzZXF1ZW5jZT4NCi0mbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPiZsdDsvZWxlbWVudD4NCi0mbHQ7L3NlcXVlbmNlPg0KLSZsdDsvY29tcGxleFR5cGU+DQotJmx0O2VsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIj4mbHQ7L2VsZW1lbnQ+DQotJmx0Oy9zY2hlbWE+IDwvY29kZWJsb2NrPiA8L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZCBmcm9tDQotdGhpcyBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBMb2NhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgdW5xdWFsaWZpZWQuPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3g6TXlBZGRyZXNzIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIj4NCi0mbHQ7bmFtZT5QZXRlciBTbWl0aCZsdDsvbmFtZT4NCi0mbHQ7L3g6TXlBZGRyZXNzPiA8L2NvZGVibG9jaz48L3A+PHA+V2hlbiBsb2NhbCBlbGVtZW50cyAoc3VjaCBhcyB0aGUgIm5hbWUiDQotZWxlbWVudCkgYW5kIGF0dHJpYnV0ZXMgYXJlIHVucXVhbGlmaWVkIGluIGFuIFhNTCBmaWxlLCB0aGVuIG9ubHkgdGhlIHJvb3QNCi1lbGVtZW50IGlzIHF1YWxpZmllZC4gU28sIGluIHRoaXMgZXhhbXBsZSwgdGhlICJ4IiBuYW1lc3BhY2UgcHJlZml4IGlzIGFzc2lnbmVkDQotdG8gdGhlIHJvb3QgZWxlbWVudCAiTXlBZGRyZXNzIiwgYXNzb2NpYXRpbmcgaXQgd2l0aCB0aGUgbmFtZXNwYWNlICJodHRwOi8vd3d3LmlibS5jb20iLA0KLWJ1dCB0aGUieCIgcHJlZml4IGlzIG5vdCBhc3NpZ25lZCB0byB0aGUgbG9jYWwgZWxlbWVudCAibmFtZSIuPC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2FtcGxlIDIgLSBBIHNjaGVtYSB3aXRoIGJvdGggYSBkZWZhdWx0IGFuZCB0YXJnZXQgbmFtZXNwYWNlDQotYW5kIHF1YWxpZmllZCBsb2NhbHM8L3RpdGxlPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3NjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiPg0KLSZsdDtzZXF1ZW5jZT4NCi0mbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPiZsdDsvZWxlbWVudD4NCi0mbHQ7L3NlcXVlbmNlPg0KLSZsdDsvY29tcGxleFR5cGU+DQotJmx0O2VsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIj4mbHQ7L2VsZW1lbnQ+DQotICZsdDsvc2NoZW1hPiAgPC9jb2RlYmxvY2s+PC9wPjxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50IGNyZWF0ZWQgZnJvbQ0KLXRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIHF1YWxpZmllZCBUaGlzDQotaXMgYmVjYXVzZSB0aGUgZWxlbWVudEZvcm1EZWZhdWx0IGF0dHJpYnV0ZSBpcyBzZXQgdG8gcXVhbGlmaWVkIGluIHRoZSBYTUwNCi1zY2hlbWEuPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotICAmbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSB4LnhzZCAiPiANCi0mbHQ7eDpuYW1lPlBldGVyIFNtaXRoJmx0Oy94Om5hbWU+DQotICZsdDsveDpNeUFkZHJlc3M+PC9jb2RlYmxvY2s+IDwvcD48cD5JbiB0aGlzIGV4YW1wbGUsIHRoZSAieCIgbmFtZXNwYWNlIHByZWZpeA0KLWlzIGFzc2lnbmVkIHRvIGJvdGggdGhlIHJvb3QgZWxlbWVudCAiTXlBZGRyZXNzIiBhbmQgdGhlIGxvY2FsIGVsZW1lbnQgIm5hbWUiLA0KLWFzc29jaWF0aW5nIHRoZW0gd2l0aCB0aGUgbmFtZXNwYWNlICJodHRwOi8vd3d3LmlibS5jb20iLC48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgMyAtIFNjaGVtYSB3aXRoIHRhcmdldCBOYW1lc3BhY2UsIGFuZCBleHBsaWNpdGx5IGRlZmluZXMNCi14bWxuczp4c2Q8L3RpdGxlPjxwPlRoaXMgWE1MIHNjaGVtYSBhZGRzIHRoaXMgYXR0cmlidXRlOiAgPC9wPjxjb2RlcGg+eG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSA8L2NvZGVwaD48cD5XaGF0DQotdGhpcyBtZWFucyBpcyB0aGF0IGVhY2ggb2YgdGhlIGNvbnN0cnVjdHMgdGhhdCBhcmUgZGVmaW5lZCBieSB0aGUgWE1MIHNjaGVtYQ0KLWxhbmd1YWdlIHdpbGwgbmVlZCB0byBiZSBxdWFsaWZpZWQgd2l0aCB0aGUgInhzZCIgcHJlZml4LiBGb3IgZXhhbXBsZSwgeHNkOmNvbXBsZXhUeXBlDQotYW5kICB4c2Q6c3RyaW5nPC9wPjxwPi4gTm90ZSB0aGF0IHlvdSBjYW4gY2hvc2UgYW55IG90aGVyIHByZWZpeGVzIHN1Y2ggYXMNCi0ieHMiIG9yICJmb29iYXIiIGluIHlvdXIgZGVjbGFyYXRpb24gYW5kIHVzYWdlLjwvcD48cD5Zb3UgY2FuIHNwZWNpZnkgdGhpcw0KLXByZWZpeCBpbiB0aGUgWE1MIHNjaGVtYSBwcmVmZXJlbmNlcyBwYWdlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8NCi10aGUgcmVsYXRlZCB0YXNrcy48L3A+PHA+QWxsIHVzZXIgZGVmaW5lZCB0eXBlcyBiZWxvbmcgdG8gdGhlIG5hbWVzcGFjZSAgaHR0cDovL3d3dy5pYm0uY29tDQotYXMgZGVmaW5lZCBieSB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZSwgYW5kIHRoZSBwcmVmaXggaXMgIngiIGFzIGRlZmluZWQNCi1ieSB0aGUgeG1sbnM6eCBhdHRyaWJ1dGUuPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSI+DQotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSI+DQotJmx0O3hzZDpzZXF1ZW5jZT4NCi0JCSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4NCi0mbHQ7L3hzZDpzZXF1ZW5jZT4NCi0gJmx0Oy94c2Q6Y29tcGxleFR5cGU+DQotICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9Ing6QWRkcmVzc1R5cGUiPiZsdDsveHNkOmVsZW1lbnQ+DQotJmx0Oy94c2Q6c2NoZW1hPjwvY29kZWJsb2NrPiA8L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZA0KLWZyb20gdGhpcyBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBMb2NhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgdW5xdWFsaWZpZWQuDQotVGhlIHNlbWFudGljcyBvZiBxdWFsaWZpY2F0aW9uIGlzIHRoZSBzYW1lIGFzIFNhbXBsZSAxLjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSAmbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlInhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHgueHNkICI+DQotJmx0O25hbWU+UGV0ZXIgU21pdGgmbHQ7L25hbWU+DQotICZsdDsveDpNeUFkZHJlc3M+PC9jb2RlYmxvY2s+PC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2FtcGxlIDQgLSBTY2hlbWEgd2l0aCB1bmRlY2xhcmVkIHRhcmdldCBOYW1lc3BhY2UgdGhhdCBleHBsaWNpdGx5DQotZGVmaW5lcyB4bWxuczp4c2Q8L3RpdGxlPjxwPlRoaXMgWE1MIHNjaGVtYSBoYXMgbm8gdGFyZ2V0IG5hbWVzcGFjZSBmb3IgaXRzZWxmLg0KLUluIHRoaXMgY2FzZSwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgYWxsIFhNTCBzY2hlbWEgY29uc3RydWN0cyBiZSBleHBsaWNpdGx5DQotcXVhbGlmaWVkIHdpdGggYSBwcmVmaXggc3VjaCBhcyAieHNkIi4gVGhlIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbQ0KLXRoaXMgc2NoZW1hIHN1Y2ggYXMgQWRkcmVzc1R5cGUgYXJlIHJlZmVyZW5jZWQgd2l0aG91dCBuYW1lc3BhY2UgcXVhbGlmaWNhdGlvbg0KLXNpbmNlIHRoZXJlIGlzIG5vIG5hbWVzcGFjZSBwcmVmaXguICA8L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0mbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIj4NCi0mbHQ7eHNkOnNlcXVlbmNlPg0KLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4mbHQ7L3hzZDplbGVtZW50Pg0KLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4mbHQ7L3hzZDplbGVtZW50Pg0KLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4mbHQ7L3hzZDplbGVtZW50PiANCi0mbHQ7L3hzZDpzZXF1ZW5jZT4gDQotJmx0Oy94c2Q6Y29tcGxleFR5cGU+DQotJmx0O3hzZDplbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0iQWRkcmVzc1R5cGUiPiZsdDsveHNkOmVsZW1lbnQ+IA0KLSZsdDsveHNkOnNjaGVtYT4gPC9jb2RlYmxvY2s+PC9wPjxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50IGNyZWF0ZWQNCi1mcm9tIHRoZSBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBBbGwgZWxlbWVudHMgYXJlIHVucXVhbGlmaWVkLjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDtNeUFkZHJlc3MgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IngueHNkIj4NCi0mbHQ7bmFtZT5uYW1lJmx0Oy9uYW1lPg0KLSZsdDsvTXlBZGRyZXNzPjwvY29kZWJsb2NrPiAgPC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2FtcGxlIDUgLSBBIHNjaGVtYSB3aGVyZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyB0aGUgZGVmYXVsdA0KLW5hbWVzcGFjZTwvdGl0bGU+PHA+VGhpcyBpcyBhbiBYTUwgc2NoZW1hIHdoZXJlIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzIHRoZQ0KLWRlZmF1bHQgbmFtZXNwYWNlLiBBcyB3ZWxsLCB0aGUgbmFtZXNwYWNlIGhhcyBubyBuYW1lc3BhY2UgcHJlZml4LjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSAmbHQ7eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSI+DQotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSI+DQotJmx0O3hzZDpzZXF1ZW5jZT4NCi0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4NCi0mbHQ7L3hzZDpzZXF1ZW5jZT4NCi0mbHQ7L3hzZDpjb21wbGV4VHlwZT4NCi0gJmx0O3hzZDplbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0iQWRkcmVzc1R5cGUiPiZsdDsveHNkOmVsZW1lbnQ+DQotICZsdDsveHNkOnNjaGVtYT4gPC9jb2RlYmxvY2s+IDwvcD48cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkDQotZnJvbSB0aGUgc2NoZW1hIGxvb2tzIGxpa2UgdGhpczo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLSZsdDtNeUFkZHJlc3MgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gTmV3WE1MU2NoZW1hLnhzZCI+DQotJmx0O25hbWU+bmFtZSZsdDsvbmFtZT4NCi0gJmx0Oy9NeUFkZHJlc3M+ICA8L2NvZGVibG9jaz4gPC9wPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+PD9QdWIgQ2FyZXQ/Pg0KLTw/UHViICowMDAwMDEyMDAyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDljNDZjMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iWE1MIG5hbWVzcGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgbmFtZXNwYWNlcywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgbmFtZXNwYWNlcywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHByZWYuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJybm1zcGMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgbmFtZXNwYWNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm5tc3BjIj48YSBuYW1lPSJybm1zcGMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlhNTCBuYW1lc3BhY2VzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSQotcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZQotbmFtZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5YTUwgbmFtZXNwYWNlcyBhcmUgZGVmaW5lZCBieSBhIFczQyByZWNvbW1lbmRhdGlvbiwgZGF0aW5nIDE2IEF1Z3VzdAotMjAwNiwgY2FsbGVkIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvUkVDLXhtbC1uYW1lcy0yMDA2MDgxNi8iIHRhcmdldD0iX2JsYW5rIj5OYW1lc3BhY2VzIGluIFhNTDwvYT4uIFhNTCB0YWcgbmFtZXMgc2hvdWxkIGJlIGdsb2JhbGx5Ci11bmlxdWUsIGFzIHdlbGwgYXMgc2hvcnQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIEluIG9yZGVyIHRvIHJlc29sdmUgdGhpcwotY29uZmxpY3QsIHRoZSBXM0MgbmFtZXNwYWNlIHJlY29tbWVuZGF0aW9uIGRlZmluZXMgYW4gYXR0cmlidXRlIDxzdHJvbmc+eG1sbnM8L3N0cm9uZz4gd2hpY2gKLWNhbiBhbWVuZCBhbnkgWE1MIGVsZW1lbnQuIElmIGl0IGlzIHByZXNlbnQgaW4gYW4gZWxlbWVudCwgaXQgaWRlbnRpZmllcyB0aGUKLW5hbWVzcGFjZSBmb3IgdGhpcyBlbGVtZW50LjwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgeG1sbnMgYXR0cmlidXRlIGhhcyB0aGUgZm9sbG93aW5nIHN5bnRheDo8L3A+Ci08cD48c2FtcCBjbGFzcz0iY29kZXBoIj54bWxuczo8dmFyIGNsYXNzPSJ2YXJuYW1lIj5wcmVmaXg8L3Zhcj49bmFtZXNwYWNlPC9zYW1wPiA8L3A+Ci08cD53aGVyZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5uYW1lc3BhY2U8L3NhbXA+IGlzIGEgdW5pcXVlIFVSSSAoc3VjaCBhcyB3d3cuaWJtLmNvbSkgYW5kIHdoZXJlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPjx2YXIgY2xhc3M9InZhcm5hbWUiPnByZWZpeDwvdmFyPjwvc2FtcD4gcmVwcmVzZW50cwotdGhlIG5hbWVzcGFjZSBhbmQgcHJvdmlkZXMgYSBwb2ludGVyIHRvIGl0LjwvcD4KLTxwPkluIHRoZSBmb2xsb3dpbmcgY3VzdG9tZXIKLWVsZW1lbnQgZGVmaW5pdGlvbiwgYW4gYWNjb3VudGluZyBuYW1lc3BhY2UgaXMgZGVmaW5lZCBpbiBvcmRlciB0byBiZSBhYmxlCi10byBkaXN0aW5ndWlzaCB0aGUgZWxlbWVudCB0YWdzIGZyb20gdGhvc2UgYXBwZWFyaW5nIGluIGN1c3RvbWVyIHJlY29yZHMgY3JlYXRlZAotYnkgb3RoZXIgYnVzaW5lc3MgYXBwbGljYXRpb25zOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0O2FjY3Q6Y3VzdG9tZXIgeG1sbnM6YWNjdD0iaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMCImZ3Q7Ci0JJmx0O2FjY3Q6bmFtZSZndDtDb3Jwb3JhdGlvbiZsdDsvYWNjdDpuYW1lJmd0OwotCSZsdDthY2N0Om9yZGVyIGFjY3Q6cmVmPSI1NTY2Ii8mZ3Q7Ci0JJmx0O2FjY3Q6c3RhdHVzJmd0O2ludm9pY2UmbHQ7L2FjY3Q6c3RhdHVzJmd0OwotJmx0Oy9hY2N0OmN1c3RvbWVyJmd0OyAgPC9wcmU+Ci0gPC9kaXY+Ci08cD5UaGUgbmFtZXNwYWNlIGRlZmluaXRpb24gaW4gdGhlIGZpcnN0Ci1saW5lIGFzc2lnbnMgdGhlIG5hbWVzcGFjZSBodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwIHRvIHRoZSBwcmVmaXguIFRoaXMKLXByZWZpeCBpcyB1c2VkIG9uIHRoZSBlbGVtZW50IG5hbWVzIHN1Y2ggYXMgbmFtZSBpbiBvcmRlciB0byBhdHRhY2ggdGhlbSB0bwotdGhlIG5hbWVzcGFjZS4gQSBzZWNvbmQgYXBwbGljYXRpb24sIGZvciBleGFtcGxlLCBhIGZ1bGZpbGxtZW50IHN5c3RlbSwgY2FuCi1hc3NpZ24gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRvIGl0cyBjdXN0b21lciBlbGVtZW50czo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDtmdWw6Y3VzdG9tZXIgeG1sbnM6ZnVsPSJodHRwOi8vd3d3LnlvdXIuY29tL2Z1bCImZ3Q7Ci0JJmx0O2Z1bDpuYW1lJmd0O0NvcnBvcmF0aW9uJmx0Oy9mdWw6bmFtZSZndDsKLQkmbHQ7ZnVsOm9yZGVyIGZ1bDpyZWY9IkE5ODc1NiIvJmd0OwotCSZsdDtmdWw6c3RhdHVzJmd0O3NoaXBwZWQmbHQ7L2Z1bDpzdGF0dXMmZ3Q7Ci0gJmx0Oy9mdWw6Y3VzdG9tZXImZ3Q7PC9wcmU+Ci0gPC9kaXY+Ci08cD5BbiBhcHBsaWNhdGlvbiBwcm9jZXNzaW5nIGJvdGggZGF0YQotc3RydWN0dXJlcyBpcyBub3cgYWJsZSB0byB0cmVhdCB0aGUgYWNjb3VudGluZyBhbmQgdGhlIGZ1bGZpbGxtZW50IGRhdGEgZGlmZmVyZW50bHkuCi1UaGVyZSBpcyBhIGRlZmF1bHQgbmFtZXNwYWNlLiBJdCBpcyBzZXQgaWYgbm8gbG9jYWwgbmFtZSBpcyBhc3NpZ25lZCBpbiB0aGUKLW5hbWVzcGFjZSBkZWZpbml0aW9uOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0O2FjY3Q6Y3VzdG9tZXIgeG1sbnM9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAiIHhtbG5zOmFjY3Q9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAgIiZndDsKLSZsdDtuYW1lJmd0O0NvcnBvcmF0aW9uJmx0Oy9uYW1lJmd0OwotJmx0O29yZGVyIGFjY3Q6cmVmPSI1NTY2Ii8mZ3Q7Ci0mbHQ7c3RhdHVzJmd0O2ludm9pY2UmbHQ7L3N0YXR1cyZndDsKLSZsdDsvY3VzdG9tZXImZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPkluIHRoaXMgZXhhbXBsZSwgYWxsIHRhZ3MgaW4gdGhlIGN1c3RvbWVyCi1yZWNvcmQgYXJlIHF1YWxpZmllZCB0byByZXNpZGUgaW4gdGhlIG5hbWVzcGFjZSBodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwLgotTm8gZXhwbGljaXQgcHJlZml4IGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBpcyB1c2VkLiBOb3RlIHRoYXQKLXRoZSBkZWZhdWx0IG5hbWVzcGFjZSBhcHBsaWVzIHRvIGFueSBhdHRyaWJ1dGVzIGRlZmluaXRpb25zLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+WE1MIHNjaGVtYXMgYW5kIG5hbWVzcGFjZXM8L2g0PjxwPkluIHRoZSBmb2xsb3dpbmcgWE1MCi1zY2hlbWEsIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IgdGhlIHNjaGVtYSBpcyBkZWZpbmVkIGFzIHRoZSBzdGFuZGFyZCBYTUwKLXNjaGVtYSBuYW1lc3BhY2UgaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE7IHRoZXJlIGlzIGFsc28gYSBzY2hlbWEKLXNwZWNpZmljIG5hbWVzcGFjZSBodHRwOi8vd3d3LmlibS5jb20uPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6VGVzdFNjaGVtYT0iaHR0cDovL3d3dy5pYm0uY29tIiZndDsKLSAmbHQ7c2ltcGxlVHlwZSBuYW1lPSJaaXBDb2RlVHlwZSImZ3Q7Ci0gJmx0O3Jlc3RyaWN0aW9uIGJhc2U9ImludGVnZXIiJmd0OwotICAmbHQ7bWluSW5jbHVzaXZlIHZhbHVlPSIxMDAwMCIvJmd0OwotICZsdDttYXhJbmNsdXNpdmUgdmFsdWU9Ijk5OTk5Ii8mZ3Q7Ci0mbHQ7L3Jlc3RyaWN0aW9uJmd0OwotICZsdDsvc2ltcGxlVHlwZSZndDsgCi0gJmx0OyEtLWVsZW1lbnQgZGVmaW5pdGlvbnMgc2tpcHBlZCAtLSZndDsgIAotJmx0Oy9zY2hlbWEmZ3Q7ICA8L3ByZT4KLTwvZGl2PgotPHA+QXNzdW1pbmcgdGhhdCB0aGUgcHJlY2VkaW5nIFhNTCBzY2hlbWEgaXMKLXNhdmVkIGFzIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+QzpcdGVtcFxUZXN0U2NoZW1hLnhzZDwvc3Bhbj4sIGEgc2FtcGxlIFhNTCBmaWxlIHRoYXQKLXZhbGlkYXRlcyBhZ2FpbnN0IHRoaXMgc2NoZW1hIGlzOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7eDphZGRyZXNzTGlzdCB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBmaWxlOi8vL0M6L3RlbXAvVGVzdFNjaGVtYS54c2QiJmd0OwotIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIGZpbGU6Ly8vQzovdGVtcC9UZXN0U2NoZW1hLnhzZCImZ3Q7Ci0mbHQ7eDphZGRyZXNzJmd0OwotICZsdDt4OnN0cmVldCZndDt4OlZhbmdlcm93c3RyYXNzZSZsdDsveDpzdHJlZXQmZ3Q7Ci0gICZsdDt4OnppcENvZGUmZ3Q7NjkxMTUmbHQ7L3g6emlwQ29kZSZndDsKLSAmbHQ7eDpjaXR5Jmd0O3g6SGVpZGVsYmVyZyZsdDsveDpjaXR5Jmd0OwotICZsdDsveDphZGRyZXNzJmd0OwotICAgICZsdDt4OmFkZHJlc3MmZ3Q7IAotJmx0O3g6c3RyZWV0Jmd0O3g6QmVybmFsIFJvYWQmbHQ7L3g6c3RyZWV0Jmd0OyAKLSZsdDt4OnppcENvZGUmZ3Q7OTAzNzUmbHQ7L3g6emlwQ29kZSZndDsKLSAgICAgJmx0O3g6Y2l0eSZndDt4OlNhbiBKb3NlJmx0Oy94OmNpdHkmZ3Q7Ci0gJmx0Oy94OmFkZHJlc3MmZ3Q7Ci0mbHQ7L3g6YWRkcmVzc0xpc3QmZ3Q7IDwvcHJlPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlRhcmdldCBuYW1lc3BhY2U8L2g0PjxwPiBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBzZXJ2ZXMgdG8KLWlkZW50aWZ5IHRoZSBuYW1lc3BhY2Ugd2l0aGluIHdoaWNoIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBlbGVtZW50IGFuZAotaXRzIG5hbWUgZXhpc3RzLiBJbiB0aGUgY2FzZSBvZiBkZWNsYXJhdGlvbnMsIHRoaXMgYXNzb2NpYXRpb24gZGV0ZXJtaW5lcwotdGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudHMgaW4gWE1MIGZpbGVzIGNvbmZvcm1pbmcgdG8gdGhlIHNjaGVtYS4gQW4gWE1MCi1maWxlIGltcG9ydGluZyBhIHNjaGVtYSBtdXN0IHJlZmVyZW5jZSBpdHMgdGFyZ2V0IG5hbWVzcGFjZSBpbiB0aGUgc2NoZW1hTG9jYXRpb24KLWF0dHJpYnV0ZS4gQW55IG1pc21hdGNoZXMgYmV0d2VlbiB0aGUgdGFyZ2V0IGFuZCB0aGUgYWN0dWFsIG5hbWVzcGFjZSBvZiBhbgotZWxlbWVudCBhcmUgcmVwb3J0ZWQgYXMgc2NoZW1hIHZhbGlkYXRpb24gZXJyb3JzLiBJbiBvdXIgZXhhbXBsZSwgdGhlIHRhcmdldAotbmFtZXNwYWNlIGlzIGh0dHA6Ly93d3cuaWJtLmNvbTsgaXQgaXMgZGVmaW5lZCBpbiB0aGUgIFhNTCBzY2hlbWEgZmlsZSBhbmQKLXJlZmVyZW5jZWQgdHdpY2UgaW4gdGhlIFhNTCBmaWxlLiBBbnkgbWlzbWF0Y2ggYmV0d2VlbiB0aGVzZSB0aHJlZSBvY2N1cnJlbmNlcwotb2YgdGhlIG5hbWVzcGFjZSBsZWFkIHRvIHZhbGlkYXRpb24gZXJyb3JzLjwvcD4KLTxwPiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzCi1zaG93IGhvdyB0YXJnZXQgbmFtZXNwYWNlcyBhbmQgbmFtZXNwYWNlIHByZWZpeGVzIHdvcmsgaW4gWE1MIHNjaGVtYXMgYW5kCi10aGVpciBjb3JyZXNwb25kaW5nIFhNTCBpbnN0YW5jZSBkb2N1bWVudHMuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgMSAtIEEgc2NoZW1hIHdpdGggYm90aCBhIGRlZmF1bHQgYW5kIHRhcmdldCBuYW1lc3BhY2UKLWFuZCB1bnF1YWxpZmllZCBsb2NhbHM8L2g0PjxwPlRoZSBYTUwgc2NoZW1hOiAgPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiZndDsKLSZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7c2VxdWVuY2UmZ3Q7Ci0mbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciJmd0OyZsdDsvZWxlbWVudCZndDsKLSZsdDsvc2VxdWVuY2UmZ3Q7Ci0mbHQ7L2NvbXBsZXhUeXBlJmd0OwotJmx0O2VsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIiZndDsmbHQ7L2VsZW1lbnQmZ3Q7Ci0mbHQ7L3NjaGVtYSZndDsgPC9wcmU+Ci0gPC9kaXY+Ci08cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkIGZyb20KLXRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIHVucXVhbGlmaWVkLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSB4LnhzZCAiJmd0OwotJmx0O25hbWUmZ3Q7UGV0ZXIgU21pdGgmbHQ7L25hbWUmZ3Q7Ci0mbHQ7L3g6TXlBZGRyZXNzJmd0OyA8L3ByZT4KLTwvZGl2PgotPHA+V2hlbiBsb2NhbCBlbGVtZW50cyAoc3VjaCBhcyB0aGUgIm5hbWUiCi1lbGVtZW50KSBhbmQgYXR0cmlidXRlcyBhcmUgdW5xdWFsaWZpZWQgaW4gYW4gWE1MIGZpbGUsIHRoZW4gb25seSB0aGUgcm9vdAotZWxlbWVudCBpcyBxdWFsaWZpZWQuIFNvLCBpbiB0aGlzIGV4YW1wbGUsIHRoZSAieCIgbmFtZXNwYWNlIHByZWZpeCBpcyBhc3NpZ25lZAotdG8gdGhlIHJvb3QgZWxlbWVudCAiTXlBZGRyZXNzIiwgYXNzb2NpYXRpbmcgaXQgd2l0aCB0aGUgbmFtZXNwYWNlICJodHRwOi8vd3d3LmlibS5jb20iLAotYnV0IHRoZSJ4IiBwcmVmaXggaXMgbm90IGFzc2lnbmVkIHRvIHRoZSBsb2NhbCBlbGVtZW50ICJuYW1lIi48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNhbXBsZSAyIC0gQSBzY2hlbWEgd2l0aCBib3RoIGEgZGVmYXVsdCBhbmQgdGFyZ2V0IG5hbWVzcGFjZQotYW5kIHF1YWxpZmllZCBsb2NhbHM8L2g0PjxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiJmd0OwotJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIiZndDsKLSZsdDtzZXF1ZW5jZSZndDsKLSZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyImZ3Q7Jmx0Oy9lbGVtZW50Jmd0OwotJmx0Oy9zZXF1ZW5jZSZndDsKLSZsdDsvY29tcGxleFR5cGUmZ3Q7Ci0mbHQ7ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9Ing6QWRkcmVzc1R5cGUiJmd0OyZsdDsvZWxlbWVudCZndDsKLSAmbHQ7L3NjaGVtYSZndDsgIDwvcHJlPgotPC9kaXY+Ci08cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkIGZyb20KLXRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIHF1YWxpZmllZCBUaGlzCi1pcyBiZWNhdXNlIHRoZSBlbGVtZW50Rm9ybURlZmF1bHQgYXR0cmlidXRlIGlzIHNldCB0byBxdWFsaWZpZWQgaW4gdGhlIFhNTAotc2NoZW1hLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0gICZsdDt4Ok15QWRkcmVzcyB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0geHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIiZndDsgCi0mbHQ7eDpuYW1lJmd0O1BldGVyIFNtaXRoJmx0Oy94Om5hbWUmZ3Q7Ci0gJmx0Oy94Ok15QWRkcmVzcyZndDs8L3ByZT4KLSA8L2Rpdj4KLTxwPkluIHRoaXMgZXhhbXBsZSwgdGhlICJ4IiBuYW1lc3BhY2UgcHJlZml4Ci1pcyBhc3NpZ25lZCB0byBib3RoIHRoZSByb290IGVsZW1lbnQgIk15QWRkcmVzcyIgYW5kIHRoZSBsb2NhbCBlbGVtZW50ICJuYW1lIiwKLWFzc29jaWF0aW5nIHRoZW0gd2l0aCB0aGUgbmFtZXNwYWNlICJodHRwOi8vd3d3LmlibS5jb20iLC48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNhbXBsZSAzIC0gU2NoZW1hIHdpdGggdGFyZ2V0IE5hbWVzcGFjZSwgYW5kIGV4cGxpY2l0bHkgZGVmaW5lcwoteG1sbnM6eHNkPC9oND48cD5UaGlzIFhNTCBzY2hlbWEgYWRkcyB0aGlzIGF0dHJpYnV0ZTogIDwvcD4KLTxzYW1wIGNsYXNzPSJjb2RlcGgiPnhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEgPC9zYW1wPjxwPldoYXQKLXRoaXMgbWVhbnMgaXMgdGhhdCBlYWNoIG9mIHRoZSBjb25zdHJ1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYnkgdGhlIFhNTCBzY2hlbWEKLWxhbmd1YWdlIHdpbGwgbmVlZCB0byBiZSBxdWFsaWZpZWQgd2l0aCB0aGUgInhzZCIgcHJlZml4LiBGb3IgZXhhbXBsZSwgeHNkOmNvbXBsZXhUeXBlCi1hbmQgIHhzZDpzdHJpbmc8L3A+Ci08cD4uIE5vdGUgdGhhdCB5b3UgY2FuIGNob3NlIGFueSBvdGhlciBwcmVmaXhlcyBzdWNoIGFzCi0ieHMiIG9yICJmb29iYXIiIGluIHlvdXIgZGVjbGFyYXRpb24gYW5kIHVzYWdlLjwvcD4KLTxwPllvdSBjYW4gc3BlY2lmeSB0aGlzCi1wcmVmaXggaW4gdGhlIFhNTCBzY2hlbWEgcHJlZmVyZW5jZXMgcGFnZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvCi10aGUgcmVsYXRlZCB0YXNrcy48L3A+Ci08cD5BbGwgdXNlciBkZWZpbmVkIHR5cGVzIGJlbG9uZyB0byB0aGUgbmFtZXNwYWNlICBodHRwOi8vd3d3LmlibS5jb20KLWFzIGRlZmluZWQgYnkgdGhlIHRhcmdldE5hbWVzcGFjZSBhdHRyaWJ1dGUsIGFuZCB0aGUgcHJlZml4IGlzICJ4IiBhcyBkZWZpbmVkCi1ieSB0aGUgeG1sbnM6eCBhdHRyaWJ1dGUuPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDt4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iJmd0OwotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7eHNkOnNlcXVlbmNlJmd0OwotCQkgJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7Ci0mbHQ7L3hzZDpzZXF1ZW5jZSZndDsKLSAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKLSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OwotJmx0Oy94c2Q6c2NoZW1hJmd0OzwvcHJlPgotIDwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZAotZnJvbSB0aGlzIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIExvY2FsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSB1bnF1YWxpZmllZC4KLVRoZSBzZW1hbnRpY3Mgb2YgcXVhbGlmaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyBTYW1wbGUgMS48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotICZsdDt4Ok15QWRkcmVzcyB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UieHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIiZndDsKLSZsdDtuYW1lJmd0O1BldGVyIFNtaXRoJmx0Oy9uYW1lJmd0OwotICZsdDsveDpNeUFkZHJlc3MmZ3Q7PC9wcmU+Ci08L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2FtcGxlIDQgLSBTY2hlbWEgd2l0aCB1bmRlY2xhcmVkIHRhcmdldCBOYW1lc3BhY2UgdGhhdCBleHBsaWNpdGx5Ci1kZWZpbmVzIHhtbG5zOnhzZDwvaDQ+PHA+VGhpcyBYTUwgc2NoZW1hIGhhcyBubyB0YXJnZXQgbmFtZXNwYWNlIGZvciBpdHNlbGYuCi1JbiB0aGlzIGNhc2UsIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IGFsbCBYTUwgc2NoZW1hIGNvbnN0cnVjdHMgYmUgZXhwbGljaXRseQotcXVhbGlmaWVkIHdpdGggYSBwcmVmaXggc3VjaCBhcyAieHNkIi4gVGhlIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbQotdGhpcyBzY2hlbWEgc3VjaCBhcyBBZGRyZXNzVHlwZSBhcmUgcmVmZXJlbmNlZCB3aXRob3V0IG5hbWVzcGFjZSBxdWFsaWZpY2F0aW9uCi1zaW5jZSB0aGVyZSBpcyBubyBuYW1lc3BhY2UgcHJlZml4LiAgPC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSZsdDt4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiJmd0OwotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7eHNkOnNlcXVlbmNlJmd0OwotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7Ci0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsKLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OyAKLSZsdDsveHNkOnNlcXVlbmNlJmd0OyAKLSZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OwotJmx0O3hzZDplbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0iQWRkcmVzc1R5cGUiJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7IAotJmx0Oy94c2Q6c2NoZW1hJmd0OyA8L3ByZT4KLTwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZAotZnJvbSB0aGUgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gQWxsIGVsZW1lbnRzIGFyZSB1bnF1YWxpZmllZC48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O015QWRkcmVzcyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0ieC54c2QiJmd0OwotJmx0O25hbWUmZ3Q7bmFtZSZsdDsvbmFtZSZndDsKLSZsdDsvTXlBZGRyZXNzJmd0OzwvcHJlPgotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2FtcGxlIDUgLSBBIHNjaGVtYSB3aGVyZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyB0aGUgZGVmYXVsdAotbmFtZXNwYWNlPC9oND48cD5UaGlzIGlzIGFuIFhNTCBzY2hlbWEgd2hlcmUgdGhlIHRhcmdldCBuYW1lc3BhY2UgaXMgdGhlCi1kZWZhdWx0IG5hbWVzcGFjZS4gQXMgd2VsbCwgdGhlIG5hbWVzcGFjZSBoYXMgbm8gbmFtZXNwYWNlIHByZWZpeC48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotICZsdDt4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIiZndDsKLSZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiJmd0OwotJmx0O3hzZDpzZXF1ZW5jZSZndDsKLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OwotJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7Ci0mbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKLSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJBZGRyZXNzVHlwZSImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsKLSAmbHQ7L3hzZDpzY2hlbWEmZ3Q7IDwvcHJlPgotIDwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZAotZnJvbSB0aGUgc2NoZW1hIGxvb2tzIGxpa2UgdGhpczo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7Ci0mbHQ7TXlBZGRyZXNzIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIE5ld1hNTFNjaGVtYS54c2QiJmd0OwotJmx0O25hbWUmZ3Q7bmFtZSZsdDsvbmFtZSZndDsKLSAmbHQ7L015QWRkcmVzcyZndDsgIDwvcHJlPgotIDwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRwcmVmLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciBYTUwgc2NoZW1hIGZpbGVzIHN1Y2ggYXMgdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBhbmQgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeCB1c2VkLiI+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTJiMzAyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iDQotICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJycmVmaW50ZyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+UmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+UmVmZXJlbnRpYWwgaW50ZWdyaXR5PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsDQotaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gbm9kZXMsIGNsZWFuIHVwIGZvciBhbnkgbm9kZXMgYWZmZWN0ZWQNCi13aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPnJlZmVyZW50aWFsIGludGVncml0eTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmNsZWFuIHVwIGluPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPldoZW4geW91IGRlZmluZSBhIGNvbXBsZXggdHlwZSwgeW91IGNhbiBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0DQotYW5kIHJlZmVyZW5jZSBhIGdsb2JhbCBlbGVtZW50LiA8cD5Gb3IgZXhhbXBsZTo8Y29kZWJsb2NrPiZsdDtzY2hlbWE+DQotICZsdDtlbGVtZW50IG5hbWU9ImNvbW1lbnQiIHR5cGU9InN0cmluZyI+DQotCSZsdDtjb21wbGV4VHlwZSBuYW1lPSJJdGVtcyI+DQotCQkmbHQ7c2VxdWVuY2U+DQotPD9QdWIgQ2FyZXQ/PgkJCQkmbHQ7ZWxlbWVudCByZWY9ImNvbW1lbnQiPg0KLQkJICZsdDsvc2VxdWVuY2U+DQotCSAmbHQ7L2NvbXBsZXhUeXBlPg0KLSZsdDsvc2NoZW1hPjwvY29kZWJsb2NrPjwvcD48cD5JZiB0aGUgZ2xvYmFsIGVsZW1lbnQgKGNvbW1lbnQpIHdhcyBkZWxldGVkLA0KLWFsbCByZWZlcmVuY2VzIHRvIGl0IHdvdWxkIGJlIGluIGVycm9yLiBIb3dldmVyLCB3aGVuIHlvdSBkZWxldGUgdGhlIGdsb2JhbA0KLWVsZW1lbnQsIHRoZSBYTUwgc2NoZW1hIGVkaXRvciB3aWxsIGNsZWFuIHVwIHVzaW5nIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOjwvcD48dWw+DQotPGxpPklmIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBnbG9iYWwgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSwgaXQgd2lsbCBjaGFuZ2UNCi1hbGwgZXhpc3RpbmcgcmVmZXJlbmNlcyB0byB0aGUgZmlyc3QgZ2xvYmFsIGVsZW1lbnQuPC9saT4NCi08bGk+SWYgdGhlcmUgaXMgbm8gZ2xvYmFsIGVsZW1lbnQsIHRoZW4gaXQgd2lsbCBkZWxldGUgdGhlIGVsZW1lbnQgcmVmZXJlbmNlDQotZnJvbSB0aGUgY29udGVudCBtb2RlbC48L2xpPg0KLTwvdWw+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5EZWxldGluZyBpbmNsdWRlZCBhbmQgaW1wb3J0ZWQgc2NoZW1hPC90aXRsZT48cD5JZiBhbiBpbmNsdWRlZA0KLW9yIGltcG9ydGVkIHNjaGVtYSBpcyBkZWxldGVkLCB5b3UgbXVzdCBtYW51YWxseSByZXNldCB0aGUgZm9sbG93aW5nIHR5cGUNCi1yZWZlcmVuY2VzIGFzIGFwcHJvcHJpYXRlOiA8dWw+DQotPGxpPkdsb2JhbCBlbGVtZW50IGFuZCBlbGVtZW50J3MgdHlwZS48L2xpPg0KLTxsaT5BdHRyaWJ1dGUgdHlwZS48L2xpPg0KLTxsaT5Db21wbGV4IHR5cGUgZGVyaXZhdGlvbi48L2xpPg0KLTxsaT5TaW1wbGUgdHlwZSBkZXJpdmF0aW9uLjwvbGk+DQotPC91bD5UaGV5IHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYmUgcmVzZXQgaWYgYW4gaW5jbHVkZWQgb3IgaW1wb3J0ZWQgc2NoZW1hDQotaXMgZGVsZXRlZC48L3A+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCi08P1B1YiAqMDAwMDAwMjA0Nj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY1NGIwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbCBpbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBub2RlcywgY2xlYW4gdXAgZm9yIGFueSBub2RlcyBhZmZlY3RlZCB3aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsIGludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIG5vZGVzLCBjbGVhbiB1cCBmb3IgYW55IG5vZGVzIGFmZmVjdGVkIHdpbGwgYXV0b21hdGljYWxseSBvY2N1ci4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgcmVmZXJlbnRpYWwgaW50ZWdyaXR5LCBjbGVhbiB1cCBpbiIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCByZWZlcmVudGlhbCBpbnRlZ3JpdHksIGNsZWFuIHVwIGluIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGRlbHNjbXAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJycmVmaW50ZyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlJlZmVyZW50aWFsIGludGVncml0eTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icnJlZmludGciPjxhIG5hbWU9InJyZWZpbnRnIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5SZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbAotaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gbm9kZXMsIGNsZWFuIHVwIGZvciBhbnkgbm9kZXMgYWZmZWN0ZWQKLXdpbGwgYXV0b21hdGljYWxseSBvY2N1ci48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPldoZW4geW91IGRlZmluZSBhIGNvbXBsZXggdHlwZSwgeW91IGNhbiBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0Ci1hbmQgcmVmZXJlbmNlIGEgZ2xvYmFsIGVsZW1lbnQuIDxkaXYgY2xhc3M9InAiPkZvciBleGFtcGxlOjxwcmU+Jmx0O3NjaGVtYSZndDsKLSAmbHQ7ZWxlbWVudCBuYW1lPSJjb21tZW50IiB0eXBlPSJzdHJpbmciJmd0OwotCSZsdDtjb21wbGV4VHlwZSBuYW1lPSJJdGVtcyImZ3Q7Ci0JCSZsdDtzZXF1ZW5jZSZndDsKLQkJCQkmbHQ7ZWxlbWVudCByZWY9ImNvbW1lbnQiJmd0OwotCQkgJmx0Oy9zZXF1ZW5jZSZndDsKLQkgJmx0Oy9jb21wbGV4VHlwZSZndDsKLSZsdDsvc2NoZW1hJmd0OzwvcHJlPgotPC9kaXY+Ci08cD5JZiB0aGUgZ2xvYmFsIGVsZW1lbnQgKGNvbW1lbnQpIHdhcyBkZWxldGVkLAotYWxsIHJlZmVyZW5jZXMgdG8gaXQgd291bGQgYmUgaW4gZXJyb3IuIEhvd2V2ZXIsIHdoZW4geW91IGRlbGV0ZSB0aGUgZ2xvYmFsCi1lbGVtZW50LCB0aGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCBjbGVhbiB1cCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTo8L3A+Ci08dWw+Ci08bGk+SWYgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGdsb2JhbCBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCBpdCB3aWxsIGNoYW5nZQotYWxsIGV4aXN0aW5nIHJlZmVyZW5jZXMgdG8gdGhlIGZpcnN0IGdsb2JhbCBlbGVtZW50LjwvbGk+Ci0KLTxsaT5JZiB0aGVyZSBpcyBubyBnbG9iYWwgZWxlbWVudCwgdGhlbiBpdCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudCByZWZlcmVuY2UKLWZyb20gdGhlIGNvbnRlbnQgbW9kZWwuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+RGVsZXRpbmcgaW5jbHVkZWQgYW5kIGltcG9ydGVkIHNjaGVtYTwvaDQ+PGRpdiBjbGFzcz0icCI+SWYgYW4gaW5jbHVkZWQKLW9yIGltcG9ydGVkIHNjaGVtYSBpcyBkZWxldGVkLCB5b3UgbXVzdCBtYW51YWxseSByZXNldCB0aGUgZm9sbG93aW5nIHR5cGUKLXJlZmVyZW5jZXMgYXMgYXBwcm9wcmlhdGU6IDx1bD4KLTxsaT5HbG9iYWwgZWxlbWVudCBhbmQgZWxlbWVudCdzIHR5cGUuPC9saT4KLQotPGxpPkF0dHJpYnV0ZSB0eXBlLjwvbGk+Ci0KLTxsaT5Db21wbGV4IHR5cGUgZGVyaXZhdGlvbi48L2xpPgotCi08bGk+U2ltcGxlIHR5cGUgZGVyaXZhdGlvbi48L2xpPgotCi08L3VsPgotVGhleSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJlIHJlc2V0IGlmIGFuIGluY2x1ZGVkIG9yIGltcG9ydGVkIHNjaGVtYQotaXMgZGVsZXRlZC48L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiB0aXRsZT0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5YTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgdGl0bGU9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZGVsc2NtcC5odG1sIiB0aXRsZT0iSWYgeW91IGhhdmUgY3JlYXRlZCBhbnkgWE1MIHNjaGVtYSBjb21wb25lbnRzIHlvdSBubyBsb25nZXIgbmVlZCwgeW91IGNhbiBkZWxldGUgdGhlbS4iPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkZWEzOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iDQotICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJyaWNvbnMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgc2NoZW1hIGVkaXRvciBpY29uczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSwgRGVzaWduLA0KLWFuZCBQcm9wZXJ0aWVzIHZpZXcuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmljb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPjwvc2VjdGlvbj4NCi08dGFibGU+DQotPHRncm91cCBjb2xzPSIyIj48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMCIvPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMxIi8+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIiB2YWxpZ249ImJvdHRvbSI+PGI+SWNvbjwvYj48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSIgdmFsaWduPSJib3R0b20iPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RBbnlBdHRyaWJ1dGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1hbnkgYXR0cmlidXRlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT48Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQW55LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGFueSBlbGVtZW50DQotaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5Pjxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZQ0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcw0KLXRoZSBhdHRyaWJ1dGUgZ3JvdXAgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmF0dHJpYnV0ZSBncm91cDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYiPjxhbHQ+VGhpcyBncmFwaGljDQotaXMgdGhlIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlUmVmLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotYXR0cmlidXRlIHJlZmVyZW5jZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+YXR0cmlidXRlIHJlZmVyZW5jZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RBbGwuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29udGVudA0KLW1vZGVsIC0gYWxsIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5jb250ZW50IG1vZGVsIC0gYWxsPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIj48YWx0PlRoaXMNCi1ncmFwaGljIGlzIHRoZSBjb250ZW50IG1vZGVsIC0gY2hvaWNlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSI+Y29udGVudCBtb2RlbCAtIGNob2ljZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmIj48YWx0PlRoaXMNCi1ncmFwaGljIGlzIHRoZSBjb250ZW50IG1vZGVsIC0gc2VxdWVuY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIj5jb250ZW50IG1vZGVsIC0gc2VxdWVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQ29tcGxleFR5cGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1hbnkgZWxlbWVudCBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Y29tcGxleCB0eXBlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREVsZW1lbnQuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgZWxlbWVudA0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5lbGVtZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREVsZW1lbnRSZWYuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1lbGVtZW50IHJlZmVyZW5jZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+ZWxlbWVudCByZWZlcmVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEU2ltcGxlRW51bS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWVudW1lcmF0aW9uIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5lbnVtZXJhdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RHbG9iYWxBdHRyaWJ1dGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcw0KLXRoZSBnbG9iYWwgYXR0cmlidXRlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5nbG9iYWwgYXR0cmlidXRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RHbG9iYWxFbGVtZW50LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMNCi10aGUgZ2xvYmFsIGVsZW1lbnQgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5Pmdsb2JhbCBlbGVtZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RHcm91cC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBncm91cA0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5ncm91cDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RHcm91cFJlZi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBncm91cA0KLXJlZmVyZW5jZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Z3JvdXAgcmVmZXJlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREltcG9ydC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBpbXBvcnQNCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+aW1wb3J0PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREluY2x1ZGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgaW5jbHVkZQ0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5pbmNsdWRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFNpbXBsZVBhdHRlcm4uZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1wYXR0ZXJuIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5wYXR0ZXJuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFJlZGVmaW5lLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIHJlZGVmaW5lDQotaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PnJlZGVmaW5lPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFNpbXBsZVR5cGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1zaW1wbGUgdHlwZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+c2ltcGxlIHR5cGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQotPD9QdWIgKjAwMDAwMDQ1ODE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhzZGljb25zLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVlN2UxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhzZGljb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSwgRGVzaWduLCBhbmQgUHJvcGVydGllcyB2aWV3LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSwgRGVzaWduLCBhbmQgUHJvcGVydGllcyB2aWV3LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBpY29ucyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBpY29ucyIgbmFtZT0ia2V5d29yZHMiIC8+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+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFncnAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFncnAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkMTA3Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRhZGRhZ3JwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgYXR0cmlidXRlIGdyb3VwczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGF0dHJpYnV0ZSBncm91cHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QW4gYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb24gaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIG5hbWUNCi1hbmQgYSBzZXQgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4gTmFtZWQgZ3JvdXBzIG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMNCi1jYW4gZ3JlYXRseSBmYWNpbGl0YXRlIHRoZSBtYWludGVuYW5jZSBhbmQgcmV1c2Ugb2YgY29tbW9uIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMNCi1pbiBhbiBYTUwgc2NoZW1hLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hdHRyaWJ1dGUgZ3JvdXBzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hdHRyaWJ1dGUgZ3JvdXBzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGFuIGF0dHJpYnV0ZQ0KLWdyb3VwIHRvIGFuIFhNTCBzY2hlbWEsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgdGhlIDx1aWNvbnRyb2w+QXR0cmlidXRlczwvdWljb250cm9sPiBmb2xkZXINCi1hbmQgY2xpY2sgIDx1aWNvbnRyb2w+QWRkIEF0dHJpYnV0ZSBHcm91cDwvdWljb250cm9sPi48L2NtZD48aW5mbz5JdCBhcHBlYXJzDQotaW4gdGhlIDx1aWNvbnRyb2w+QXR0cmlidXRlczwvdWljb250cm9sPiBmb2xkZXIuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB5b3VyIG5ldyBncm91cCwgYW5kIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlDQotYXR0cmlidXRlIGdyb3VwIGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+UmVmYWN0b3I8L3VpY29udHJvbD48dWljb250cm9sPlJlbmFtZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LiBJbiB0aGUgPHVpY29udHJvbD5OZXcgTmFtZTwvdWljb250cm9sPiBmaWVsZCwgdHlwZSBhIG5hbWUNCi1mb3IgdGhlIGF0dHJpYnV0ZSBncm91cCBhbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBhZGQgYW4gYXR0cmlidXRlLCByaWdodC1jbGljayB5b3VyIGF0dHJpYnV0ZSBncm91cCBpbiB0aGUgT3V0bGluZQ0KLXZpZXcsIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEF0dHJpYnV0ZTwvdWljb250cm9sPi48L2NtZD48aW5mbz5UaGUgYXR0cmlidXRlDQotYXBwZWFycyBiZWxvdyB0aGUgYXR0cmlidXRlIGdyb3VwIGluIHRoZSBPdXRsaW5lIHZpZXcuPC9pbmZvPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCB0aGUgYXR0cmlidXRlLCBhbmQgaW4gdGhlIERlc2lnbiB2aWV3LCBjbGljayB0aGUgY3VycmVudA0KLShkZWZhdWx0KSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHRoZW4gdHlwZSB0aGUgbmV3IDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPi48L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBjdXJyZW50IChkZWZhdWx0KSBhdHRyaWJ1dGUgdHlwZQ0KLWFuZCBzZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUuIEFsdGVybmF0ZWx5LCB5b3UgY2FuIHNlbGVjdCBicm93c2UgdG8gaW52b2tlDQotdGhlIFNldCBUeXBlIG1lbnUgZm9yIG1vcmUgb3B0aW9ucy48L2NtZD48aW5mbz5UaGUgU2V0IFR5cGUgZGlhbG9nIGxpc3RzIGFsbA0KLWJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+U2NvcGU8L3VpY29udHJvbD4gb2YNCi10aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+DQotPGxpPjx1aWNvbnRyb2w+V29ya3NwYWNlPC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbg0KLXlvdXIgd29ya3NwYWNlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD4gKGRlZmF1bHQpLiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMNCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4NCi08bGk+PHVpY29udHJvbD5Xb3JraW5nIFNldHM8L3VpY29udHJvbD4uIExpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUgd2l0aGluDQotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+DQotPC91bD48L2luZm8+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gYXR0cmlidXRlIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBhdHRyaWJ1dGUuDQotVG8gYWRkIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbXBsZXgNCi10eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGUgUmVmPC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPkEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGF0dHJpYnV0ZSBlbmFibGVzIHRoZSByZWZlcmVuY2VkDQotYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nDQotZGVjbGFyYXRpb24uIFNlbGVjdCB0aGUgcmVmZXJlbmNlLCB0aGVuIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUNCi1hdHRyaWJ1dGUgeW91IHdhbnQgaXQgdG8gcmVmZXJlbmNlIGZyb20gdGhlPHVpY29udHJvbD5SZWZlcmVuY2U8L3VpY29udHJvbD4gZHJvcC1kb3duPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYW4gYXR0cmlidXRlDQotZ3JvdXAuIFRvIGFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlLCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrDQotdGhlIGNvbXBsZXggdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlDQotR3JvdXAgUmVmPC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPkEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGF0dHJpYnV0ZQ0KLWVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlDQotY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIFNlbGVjdCB0aGUgcmVmZXJlbmNlLCB0aGVuIGluIHRoZQ0KLVByb3BlcnRpZXMgdmlldywgc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgeW91IHdhbnQgaXQgdG8gcmVmZXJlbmNlIGZyb20NCi10aGU8dWljb250cm9sPlJlZmVyZW5jZTwvdWljb250cm9sPiBkcm9wLWRvd24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQgZW5hYmxlcyBlbGVtZW50IGNvbnRlbnQgYWNjb3JkaW5nDQotdG8gbmFtZXNwYWNlcywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIDxjb2RlcGg+YW55PC9jb2RlcGg+IGF0dHJpYnV0ZSBlbGVtZW50DQotZW5hYmxlcyBhdHRyaWJ1dGVzIHRvIGFwcGVhciBpbiBlbGVtZW50cy4gVG8gYWRkIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGF0dHJpYnV0ZSwNCi1yaWdodC1jbGljayB5b3VyIGF0dHJpYnV0ZSBncm91cCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQW55IEF0dHJpYnV0ZTwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5UaGUgPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXBwZWFycyBiZWxvdyB0aGUgYXR0cmlidXRlIGdyb3VwIGluIHRoZSBPdXRsaW5lDQotdmlldy4gWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBhbiA8Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGU6PC9pbmZvPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+Rm9yIGEgPHVpY29udHJvbD5uYW1lc3BhY2U8L3VpY29udHJvbD4gdmFsdWUsIHlvdSBjYW4gc2VsZWN0Ojx1bD4NCi08bGk+PGI+IyNhbnk8L2I+OiB0aGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPg0KLTxsaT48Yj4jI2xvY2FsIDwvYj46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZGVjbGFyZWQNCi10byBiZSBpbiBhIG5hbWVzcGFjZS48L2xpPg0KLTxsaT48Yj4jI290aGVyPC9iPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBmcm9tIHRoZSB0YXJnZXQNCi1uYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPg0KLTxsaT48Yj4jI3RhcmdldE5hbWVzcGFjZSA8L2I+OiB0aGlzIGlzIHNob3J0aGFuZCBmb3IgdGhlIHRhcmdldCBuYW1lc3BhY2UNCi1vZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+DQotPC91bD48L2Nob2ljZT4NCi08Y2hvaWNlPkZvciBhIDx1aWNvbnRyb2w+cHJvY2Vzc0NvbnRlbnRzPC91aWNvbnRyb2w+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8dWw+DQotPGxpPjxiPnNraXA8L2I+OiB0PD9QdWIgQ2FyZXQ/PmhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3QgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZQ0KLWNvbnRlbnQgYXQgYWxsLjwvbGk+DQotPGxpPjxiPmxheDwvYj46IHRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZSBjb250ZW50IGFzIG11Y2gNCi1hcyBpdCBjYW4uPC9saT4NCi08bGk+PGI+c3RyaWN0PC9iPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSBhbGwgdGhlIGF0dHJpYnV0ZSBjb250ZW50LjwvbGk+DQotPC91bD48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDU1NDM/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFncnAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFncnAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0M2I3ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGF0dHJpYnV0ZSBncm91cHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQW4gYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb24gaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIG5hbWUgYW5kIGEgc2V0IG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuIE5hbWVkIGdyb3VwcyBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIGNhbiBncmVhdGx5IGZhY2lsaXRhdGUgdGhlIG1haW50ZW5hbmNlIGFuZCByZXVzZSBvZiBjb21tb24gYXR0cmlidXRlIGRlY2xhcmF0aW9ucyBpbiBhbiBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBbiBhdHRyaWJ1dGUgZ3JvdXAgZGVmaW5pdGlvbiBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgbmFtZSBhbmQgYSBzZXQgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4gTmFtZWQgZ3JvdXBzIG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgY2FuIGdyZWF0bHkgZmFjaWxpdGF0ZSB0aGUgbWFpbnRlbmFuY2UgYW5kIHJldXNlIG9mIGNvbW1vbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIGluIGFuIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGF0dHJpYnV0ZSBncm91cHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYXR0cmlidXRlIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGFncnAiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYXR0cmlidXRlIGdyb3VwczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGFncnAiPjxhIG5hbWU9InRhZGRhZ3JwIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgYXR0cmlidXRlIGdyb3VwczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QW4gYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb24gaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIG5hbWUKLWFuZCBhIHNldCBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBOYW1lZCBncm91cHMgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucwotY2FuIGdyZWF0bHkgZmFjaWxpdGF0ZSB0aGUgbWFpbnRlbmFuY2UgYW5kIHJldXNlIG9mIGNvbW1vbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zCi1pbiBhbiBYTUwgc2NoZW1hLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYW4gYXR0cmlidXRlCi1ncm91cCB0byBhbiBYTUwgc2NoZW1hLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXR0cmlidXRlczwvc3Bhbj4gZm9sZGVyCi1hbmQgY2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBdHRyaWJ1dGUgR3JvdXA8L3NwYW4+Ljwvc3Bhbj4gSXQgYXBwZWFycwotaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF0dHJpYnV0ZXM8L3NwYW4+IGZvbGRlci48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB5b3VyIG5ldyBncm91cCwgYW5kIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlCi1hdHRyaWJ1dGUgZ3JvdXAgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZmFjdG9yPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbmFtZTwvc3Bhbj4KLTwvc3Bhbj4uIEluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcgTmFtZTwvc3Bhbj4gZmllbGQsIHR5cGUgYSBuYW1lCi1mb3IgdGhlIGF0dHJpYnV0ZSBncm91cCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFkZCBhbiBhdHRyaWJ1dGUsIHJpZ2h0LWNsaWNrIHlvdXIgYXR0cmlidXRlIGdyb3VwIGluIHRoZSBPdXRsaW5lCi12aWV3LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlPC9zcGFuPi48L3NwYW4+IFRoZSBhdHRyaWJ1dGUKLWFwcGVhcnMgYmVsb3cgdGhlIGF0dHJpYnV0ZSBncm91cCBpbiB0aGUgT3V0bGluZSB2aWV3LgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIGF0dHJpYnV0ZSwgYW5kIGluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIGN1cnJlbnQKLShkZWZhdWx0KSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHRoZW4gdHlwZSB0aGUgbmV3IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCBjbGljayB0aGUgY3VycmVudCAoZGVmYXVsdCkgYXR0cmlidXRlIHR5cGUKLWFuZCBzZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUuIEFsdGVybmF0ZWx5LCB5b3UgY2FuIHNlbGVjdCBicm93c2UgdG8gaW52b2tlCi10aGUgU2V0IFR5cGUgbWVudSBmb3IgbW9yZSBvcHRpb25zLjwvc3Bhbj4gVGhlIFNldCBUeXBlIGRpYWxvZyBsaXN0cyBhbGwKLWJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjb3BlPC9zcGFuPiBvZgotdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtzcGFjZTwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluCi15b3VyIHdvcmtzcGFjZS4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY2xvc2luZyBQcm9qZWN0PC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUKLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj4gKGRlZmF1bHQpLiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMKLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGF0dHJpYnV0ZS4KLVRvIGFkZCBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb21wbGV4Ci10eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlIFJlZjwvc3Bhbj4uPC9zcGFuPgotIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGF0dHJpYnV0ZSBlbmFibGVzIHRoZSByZWZlcmVuY2VkCi1hdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcKLWRlY2xhcmF0aW9uLiBTZWxlY3QgdGhlIHJlZmVyZW5jZSwgdGhlbiBpbiB0aGUgUHJvcGVydGllcyB2aWV3LCBzZWxlY3QgdGhlCi1hdHRyaWJ1dGUgeW91IHdhbnQgaXQgdG8gcmVmZXJlbmNlIGZyb20gdGhlPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmZXJlbmNlPC9zcGFuPiBkcm9wLWRvd24KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUKLWdyb3VwLiBUbyBhZGQgYW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljawotdGhlIGNvbXBsZXggdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZQotR3JvdXAgUmVmPC9zcGFuPi48L3NwYW4+IEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGF0dHJpYnV0ZQotZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUKLWNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBTZWxlY3QgdGhlIHJlZmVyZW5jZSwgdGhlbiBpbiB0aGUKLVByb3BlcnRpZXMgdmlldywgc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgeW91IHdhbnQgaXQgdG8gcmVmZXJlbmNlIGZyb20KLXRoZTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZmVyZW5jZTwvc3Bhbj4gZHJvcC1kb3duLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IGVuYWJsZXMgZWxlbWVudCBjb250ZW50IGFjY29yZGluZwotdG8gbmFtZXNwYWNlcywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlIGVsZW1lbnQKLWVuYWJsZXMgYXR0cmlidXRlcyB0byBhcHBlYXIgaW4gZWxlbWVudHMuIFRvIGFkZCBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZSwKLXJpZ2h0LWNsaWNrIHlvdXIgYXR0cmlidXRlIGdyb3VwIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQW55IEF0dHJpYnV0ZTwvc3Bhbj4uPC9zcGFuPgotIFRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGFwcGVhcnMgYmVsb3cgdGhlIGF0dHJpYnV0ZSBncm91cCBpbiB0aGUgT3V0bGluZQotdmlldy4gWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZToKLTx1bD4KLTxsaT5Gb3IgYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5uYW1lc3BhY2U8L3NwYW4+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8dWw+Ci08bGk+PHN0cm9uZz4jI2FueTwvc3Ryb25nPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCBmcm9tIGFueSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNsb2NhbCA8L3N0cm9uZz46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZGVjbGFyZWQKLXRvIGJlIGluIGEgbmFtZXNwYWNlLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjb3RoZXI8L3N0cm9uZz46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZnJvbSB0aGUgdGFyZ2V0Ci1uYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08bGk+PHN0cm9uZz4jI3RhcmdldE5hbWVzcGFjZSA8L3N0cm9uZz46IHRoaXMgaXMgc2hvcnRoYW5kIGZvciB0aGUgdGFyZ2V0IG5hbWVzcGFjZQotb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpPkZvciBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnByb2Nlc3NDb250ZW50czwvc3Bhbj4gdmFsdWUsIHlvdSBjYW4gc2VsZWN0Ojx1bD4KLTxsaT48c3Ryb25nPnNraXA8L3N0cm9uZz46IHRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgbm90IHZhbGlkYXRlIHRoZSBhdHRyaWJ1dGUKLWNvbnRlbnQgYXQgYWxsLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmxheDwvc3Ryb25nPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQgYXMgbXVjaAotYXMgaXQgY2FuLjwvbGk+Ci0KLTxsaT48c3Ryb25nPnN0cmljdDwvc3Ryb25nPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSBhbGwgdGhlIGF0dHJpYnV0ZSBjb250ZW50LjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTc3ZTZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkYW55ZSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGFuIGFueSBlbGVtZW50PC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQgaW4gYSBzaW1pbGFyIHdheSBhcw0KLWEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuDQotVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYg0KLXBhZ2UgdGhhdCBjb25mb3JtcyB0byBYSFRNTCAxLjAgc3ludGF4Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hZGRpbmcgYW4gYW55IGVsZW1lbnQ8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZyBhbiBhbnkgZWxlbWVudDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+Rm9yIGV4YW1wbGU6PC9wPjxwPjxjb2RlYmxvY2s+Jmx0O2VsZW1lbnQgbmFtZSA9ICJNeVdlYlBhZ2UiPg0KLSZsdDtjb21wbGV4VHlwZT4NCi0mbHQ7YW55IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0gICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9InNraXAiLz4NCi0mbHQ7L2NvbXBsZXhUeXBlPg0KLSZsdDsvZWxlbWVudD48L2NvZGVibG9jaz48L3A+PHA+VGhlIHByZWNlZGluZyBzY2hlbWEgZnJhZ21lbnQgYWxsb3dzIGEgPGNvZGVwaD4mbHQ7TXlXZWJQYWdlPjwvY29kZXBoPiBlbGVtZW50DQotdG8gY29udGFpbiBhbnkgd2VsbC1mb3JtZWQgWEhUTUwgZGF0YSB0aGF0IGFwcGVhcnMgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuPC9wPjxwPlRoZQ0KLWZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5DQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50LA0KLWNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCB0aGF0IHlvdSB3YW50DQotdG8gd29yayB3aXRoIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBbnk8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgbmV3IDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgZm9yIGEgPHVpY29udHJvbD5uYW1lc3BhY2U8L3VpY29udHJvbD4gdmFsdWUsDQoteW91IGNhbiBzZWxlY3Q6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT48Yj4jI2FueTwvYj46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgZnJvbSBhbnkgbmFtZXNwYWNlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PGI+IyNsb2NhbCA8L2I+OiB0aGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGRlY2xhcmVkDQotdG8gYmUgaW4gYSBuYW1lc3BhY2UuPC9jaG9pY2U+DQotPGNob2ljZT48Yj4jI290aGVyIDwvYj46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZnJvbQ0KLXRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9jaG9pY2U+DQotPGNob2ljZT48Yj4jI3RhcmdldE5hbWVzcGFjZTwvYj46IHRoaXMgaXMgc2hvcnRoYW5kIGZvciB0aGUgdGFyZ2V0IG5hbWVzcGFjZQ0KLW9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkZvciBhIDx1aWNvbnRyb2w+cHJvY2Vzc0NvbnRlbnRzPC91aWNvbnRyb2w+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPjxiPnNraXA8L2I+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgY29udGVudCBhdCBhbGwuPC9jaG9pY2U+DQotPGNob2ljZT48Yj5sYXg8L2I+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIHRoZSBjb250ZW50IGFzIG11Y2ggYXMNCi1pdCBjYW4uPC9jaG9pY2U+DQotPGNob2ljZT48Yj5zdHJpY3Q8L2I+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgY29udGVudC48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIDx1aWNvbnRyb2w+TWluaW11bSBPY2N1cnJlbmNlPC91aWNvbnRyb2w+IHZhbHVlIGlzIHRoZSBudW1iZXINCi1vZiB0aW1lcyB0aGUgPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBtdXN0IGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4NCi1Zb3UgY2FuIHNlbGVjdCA8dWljb250cm9sPjA8L3VpY29udHJvbD4gaWYgeW91IHdhbnQgdGhlIGVsZW1lbnQgdG8gYmUgb3B0aW9uYWw7DQotb3RoZXJ3aXNlLCBzZWxlY3QgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgPHVpY29udHJvbD5NYXhpbXVtIE9jY3VycmVuY2U8L3VpY29udHJvbD4gdmFsdWUgaXMgdGhlIG1heGltdW0NCi1udW1iZXIgb2YgdGltZXMgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlDQotZG9jdW1lbnQuIFlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+MDwvdWljb250cm9sPiwgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LA0KLW9yLCB0byBpbmRpY2F0ZSB0aGVyZSBpcyBubyBtYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcywgPHVpY29udHJvbD51bmJvdW5kZWQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxkcmFmdC1jb21tZW50Pig8P1B1YiBDYXJldDE/PmMpIENvcHlyaWdodCAyMDAxLCBXb3JsZCBXaWRlIFdlYiAoTWFzc2FjaHVzZXR0cw0KLUluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0DQotZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuPC9kcmFmdC1jb21tZW50PjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNDA4MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDJjNTk1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nIGFuIGFueSBlbGVtZW50LCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZyBhbiBhbnkgZWxlbWVudCwgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGFueWUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRhbnllIj48YSBuYW1lPSJ0YWRkYW55ZSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGFuIGFueSBlbGVtZW50PC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMKLWEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuCi1UaGlzIGVuYWJsZXMgeW91IHRvIGluY2x1ZGUgYW55IHdlbGwtZm9ybWVkIFhNTCBjb250ZW50LCBzdWNoIGFzIGFuIEhUTUwgV2ViCi1wYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkZvciBleGFtcGxlOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0O2VsZW1lbnQgbmFtZSA9ICJNeVdlYlBhZ2UiJmd0OwotJmx0O2NvbXBsZXhUeXBlJmd0OwotJmx0O2FueSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9InNraXAiLyZndDsKLSZsdDsvY29tcGxleFR5cGUmZ3Q7Ci0mbHQ7L2VsZW1lbnQmZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPlRoZSBwcmVjZWRpbmcgc2NoZW1hIGZyYWdtZW50IGFsbG93cyBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDtNeVdlYlBhZ2UmZ3Q7PC9zYW1wPiBlbGVtZW50Ci10byBjb250YWluIGFueSB3ZWxsLWZvcm1lZCBYSFRNTCBkYXRhIHRoYXQgYXBwZWFycyBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS48L3A+Ci08cD5UaGUKLWZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5Ci13aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50LAotY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCB0aGF0IHlvdSB3YW50Ci10byB3b3JrIHdpdGggYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBbnk8L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIG5ldyA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgZm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+bmFtZXNwYWNlPC9zcGFuPiB2YWx1ZSwKLXlvdSBjYW4gc2VsZWN0Ojwvc3Bhbj4KLTx1bD4KLTxsaT48c3Ryb25nPiMjYW55PC9zdHJvbmc+OiB0aGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPgotCi08bGk+PHN0cm9uZz4jI2xvY2FsIDwvc3Ryb25nPjogdGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBkZWNsYXJlZAotdG8gYmUgaW4gYSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNvdGhlciA8L3N0cm9uZz46IHRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZnJvbQotdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08bGk+PHN0cm9uZz4jI3RhcmdldE5hbWVzcGFjZTwvc3Ryb25nPjogdGhpcyBpcyBzaG9ydGhhbmQgZm9yIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi1vZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Rm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cHJvY2Vzc0NvbnRlbnRzPC9zcGFuPiB2YWx1ZSwgeW91IGNhbiBzZWxlY3Q6PC9zcGFuPgotPHVsPgotPGxpPjxzdHJvbmc+c2tpcDwvc3Ryb25nPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3QgdmFsaWRhdGUgdGhlIGNvbnRlbnQgYXQgYWxsLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmxheDwvc3Ryb25nPjogdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgY29udGVudCBhcyBtdWNoIGFzCi1pdCBjYW4uPC9saT4KLQotPGxpPjxzdHJvbmc+c3RyaWN0PC9zdHJvbmc+OiB0aGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgY29udGVudC48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NaW5pbXVtIE9jY3VycmVuY2U8L3NwYW4+IHZhbHVlIGlzIHRoZSBudW1iZXIKLW9mIHRpbWVzIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQgbXVzdCBhcHBlYXIgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuCi1Zb3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4wPC9zcGFuPiBpZiB5b3Ugd2FudCB0aGUgZWxlbWVudCB0byBiZSBvcHRpb25hbDsKLW90aGVyd2lzZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjE8L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF4aW11bSBPY2N1cnJlbmNlPC9zcGFuPiB2YWx1ZSBpcyB0aGUgbWF4aW11bQotbnVtYmVyIG9mIHRpbWVzIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlCi1kb2N1bWVudC4gWW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjE8L3NwYW4+LAotb3IsIHRvIGluZGljYXRlIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmJvdW5kZWQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50Ljwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY21vZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY21vZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjY5ZGRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkY21vZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgY29udGVudCBtb2RlbHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQNCi1pbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsDQotZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwNCi1lbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50DQotaW5zdGFuY2UuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmNvbnRlbnQgbW9kZWxzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5jb250ZW50IG1vZGVsczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCBraW5kcyBvZiBjb250ZW50IG1vZGVsczo8dWw+DQotPGxpPjxiPlNlcXVlbmNlPC9iPiwgd2hpY2ggbWVhbnMgdGhhdCBhbGwgdGhlIGNvbnRlbnQgbW9kZWwncyBjaGlsZHJlbiBjYW4NCi1hcHBlYXIgaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTCBzY2hlbWEuIFRoZXkgbXVzdCwgaG93ZXZlciwgYXBwZWFyIGluIHRoZQ0KLW9yZGVyIHRoZXkgYXJlIGxpc3RlZCBpbiB0aGUgY29udGVudCBtb2RlbC48L2xpPg0KLTxsaT48Yj5DaG9pY2U8L2I+LCB3aGljaCBtZWFucyB0aGF0IG9ubHkgb25lIG9mIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4NCi1jYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+DQotPGxpPjxiPkFsbDwvYj4sIHdoaWNoIG1lYW5zIHRoYXQgYWxsIG9mIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4gY2FuIGFwcGVhcg0KLW9uY2Ugb3Igbm90IGF0IGFsbCwgYW5kIHRoZXkgY2FuIGFwcGVhciBpbiBhbnkgb3JkZXIuIElmIHlvdSBzZWxlY3QgdGhpcyBvcHRpb24sDQotYWxsIG9mIHRoZSBjb250ZW50cyBtb2RlbCdzIGNoaWxkcmVuIG11c3QgYmUgaW5kaXZpZHVhbCBlbGVtZW50cyBhbmQgbm8gZWxlbWVudA0KLWluIHRoZSBjb250ZW50IG1vZGVsIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UuPC9saT4NCi08L3VsPjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGEgY29udGVudA0KLW1vZGVsIHRvIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCBjb21wbGV0ZSB0aGUNCi1mb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHNlbGVjdCB5b3VyIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXA6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5JZiB5b3Ugc2VsZWN0ZWQgYSBjb21wbGV4IHR5cGUsIHlvdSBjYW4gcmlnaHQtY2xpY2sgaXQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotU2VxdWVuY2U8L3VpY29udHJvbD4sIG9yIDx1aWNvbnRyb2w+QWRkIENob2ljZTwvdWljb250cm9sPiB0byBhZGQgdGhlIHR5cGUNCi1vZiBjb250ZW50IG1vZGVsIHlvdSB3YW50IHRvIHlvdXIgY29tcGxleCB0eXBlLiBJZiB5b3Ugd2lzaCB0byB1c2UgdGhlIDx1aWNvbnRyb2w+YWxsPC91aWNvbnRyb2w+IGNvbnRlbnQNCi1tb2RlbCwgeW91IGNhbiBjaGFuZ2UgdGhlIG1vZGVsIGJ5IGNsaWNraW5nIHRoZSBtb2RlbCBpbiB0aGUgRGVzaWduIHZpZXcsDQotYW5kIGluIHByb3BlcnRpZXMsIHNlbGVjdCA8dWljb250cm9sPmFsbDwvdWljb250cm9sPiBhcyB0aGUgPHVpY29udHJvbD5LaW5kPC91aWNvbnRyb2w+Lg0KLVlvdXIgY29udGVudCBtb2RlbCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzIGEgY2hpbGQgb2YgeW91ciBjb21wbGV4IHR5cGUNCi0tIGV4cGFuZCBpbiB0aGUgT3V0bGluZSB2aWV3IHRvIHNlZSBpdC4gPGI+Tm90ZTo8L2I+IFRoZXNlIG9wdGlvbnMgd2lsbCBub3QNCi1hcHBlYXIgaWYgeW91IGhhdmUgc2V0IGEgYmFzZSB0eXBlIGZvciB5b3VyIGNvbXBsZXggdHlwZS4gWW91IGNhbiBlaXRoZXIgc2V0DQotYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLCBvciB5b3UgYWRkIGEgY29udGVudCBtb2RlbCB0byBpdCwgYnV0IHlvdQ0KLWNhbm5vdCBkbyBib3RoLjwvY2hvaWNlPg0KLTxjaG9pY2U+WW91ciBncm91cCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCBhIHNlcXVlbmNlIGNvbnRlbnQgbW9kZWwNCi1jaGlsZC4gRXhwYW5kIGl0IGluIHRoZSBPdXRsaW5lIHZpZXcgdG8gc2VlIGl0IGFuZCBzZWxlY3QgaXQuIEluIHRoZSBQcm9wZXJ0aWVzDQotdmlldywgeW91IGNhbiBzZWxlY3QgdG8gY2hhbmdlIGl0IHRvIGEgPHVpY29udHJvbD5jaG9pY2U8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5hbGw8L3VpY29udHJvbD4gY29udGVudA0KLW1vZGVsIGJ5IHNlbGVjdGluZyB0aGVzZSBvcHRpb25zIGZyb20gdGhlIDx1aWNvbnRyb2w+S2luZDwvdWljb250cm9sPiBkcm9wLWRvd24uPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcCBpbXBvcnRhbmNlPSJvcHRpb25hbCI+PGNtZD5TZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk1pbmltdW0NCi1PY2N1cnI8P1B1YiBDYXJldD8+ZW5jZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD48aW5mbz5UaGlzIGlzIHRoZSBtaW5pbXVtDQotbnVtYmVyIG9mIHRpbWVzIHRoZSBjb250ZW50IG1vZGVsIG11c3QgYXBwZWFyLiBJZiB5b3Ugd2FudCB0aGUgY29udGVudCBtb2RlbA0KLXRvIGJlIG9wdGlvbmFsLCBzZWxlY3QgPHVpY29udHJvbD4wPC91aWNvbnRyb2w+LiBPdGhlcndpc2UsIHNlbGVjdCA8dWljb250cm9sPjE8L3VpY29udHJvbD4uIDwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+U2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5NYXhpbXVtDQotT2NjdXJyZW5jZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD48aW5mbz5UaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcw0KLWEgY29udGVudCBtb2RlbCBjYW4gYXBwZWFyLiBZb3UgY2FuIHNlbGVjdCA8dWljb250cm9sPnVuYm91bmRlZDwvdWljb250cm9sPiB0bw0KLWluZGljYXRlIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29udGVudCBtb2RlbC48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+WW91IGNhbiBhZGQgdGhlIGZvbGxvd2luZyBpdGVtcyB0byBhIGNvbnRlbnQgb2JqZWN0IG1vZGVsOiA8L3A+PHVsPg0KLTxsaT5Bbm90aGVyIGNvbnRlbnQgbW9kZWwuPC9saT4NCi08bGk+QSBncm91cCByZWZlcmVuY2Ugd2hpY2ggZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlDQotaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBUaGlzIG1lbnUNCi1vcHRpb24gb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZSBnbG9iYWwgZ3JvdXBzIGRlZmluZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudA0KLW9yIGlmIGdyb3VwcyBhcmUgZGVmaW5lZCBpbiBpbmNsdWRlZCBzY2hlbWFzLjwvbGk+DQotPGxpPkFuIGVsZW1lbnQsIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuPC9saT4NCi08bGk+QW4gZWxlbWVudCByZWZlcmVuY2UsIHdoaWNoIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuDQotVGhpcyBtZW51IG9wdGlvbiBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlIGdsb2JhbCBlbGVtZW50cyBkZWZpbmVkIGVsc2V3aGVyZQ0KLWluIHRoZSBkb2N1bWVudC48L2xpPg0KLTxsaT5BbiA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50LiBZb3UgY2FuIHVzZSBhbiA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50DQotdG8gZXh0ZW5kIHlvdXIgY29udGVudCBtb2RlbCBieSBhbnkgZWxlbWVudHMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWVkIG5hbWVzcGFjZS48L2xpPg0KLTwvdWw+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA1MTAxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZmIwMmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY21vZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBjb250ZW50IG1vZGVscyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQgaW5zdGFuY2UuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgY29udGVudCBtb2RlbHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgY29udGVudCBtb2RlbHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGFueWUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRlbG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRlbG1yLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ3Jwci5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRjbW9kIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkY21vZCI+PGEgbmFtZT0idGFkZGNtb2QiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBjb250ZW50IG1vZGVsczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQKLWluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwKLWRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsCi1lbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50Ci1pbnN0YW5jZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxkaXYgY2xhc3M9InAiPlRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQga2luZHMgb2YgY29udGVudCBtb2RlbHM6PHVsPgotPGxpPjxzdHJvbmc+U2VxdWVuY2U8L3N0cm9uZz4sIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4gY2FuCi1hcHBlYXIgaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTCBzY2hlbWEuIFRoZXkgbXVzdCwgaG93ZXZlciwgYXBwZWFyIGluIHRoZQotb3JkZXIgdGhleSBhcmUgbGlzdGVkIGluIHRoZSBjb250ZW50IG1vZGVsLjwvbGk+Ci0KLTxsaT48c3Ryb25nPkNob2ljZTwvc3Ryb25nPiwgd2hpY2ggbWVhbnMgdGhhdCBvbmx5IG9uZSBvZiB0aGUgY29udGVudCBtb2RlbCdzIGNoaWxkcmVuCi1jYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+Ci0KLTxsaT48c3Ryb25nPkFsbDwvc3Ryb25nPiwgd2hpY2ggbWVhbnMgdGhhdCBhbGwgb2YgdGhlIGNvbnRlbnQgbW9kZWwncyBjaGlsZHJlbiBjYW4gYXBwZWFyCi1vbmNlIG9yIG5vdCBhdCBhbGwsIGFuZCB0aGV5IGNhbiBhcHBlYXIgaW4gYW55IG9yZGVyLiBJZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uLAotYWxsIG9mIHRoZSBjb250ZW50cyBtb2RlbCdzIGNoaWxkcmVuIG11c3QgYmUgaW5kaXZpZHVhbCBlbGVtZW50cyBhbmQgbm8gZWxlbWVudAotaW4gdGhlIGNvbnRlbnQgbW9kZWwgY2FuIGFwcGVhciBtb3JlIHRoYW4gb25jZS48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIGNvbnRlbnQKLW1vZGVsIHRvIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCBjb21wbGV0ZSB0aGUKLWZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHNlbGVjdCB5b3VyIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXA6PC9zcGFuPgotPHVsPgotPGxpPklmIHlvdSBzZWxlY3RlZCBhIGNvbXBsZXggdHlwZSwgeW91IGNhbiByaWdodC1jbGljayBpdCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1TZXF1ZW5jZTwvc3Bhbj4sIG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaG9pY2U8L3NwYW4+IHRvIGFkZCB0aGUgdHlwZQotb2YgY29udGVudCBtb2RlbCB5b3Ugd2FudCB0byB5b3VyIGNvbXBsZXggdHlwZS4gSWYgeW91IHdpc2ggdG8gdXNlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5hbGw8L3NwYW4+IGNvbnRlbnQKLW1vZGVsLCB5b3UgY2FuIGNoYW5nZSB0aGUgbW9kZWwgYnkgY2xpY2tpbmcgdGhlIG1vZGVsIGluIHRoZSBEZXNpZ24gdmlldywKLWFuZCBpbiBwcm9wZXJ0aWVzLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+YWxsPC9zcGFuPiBhcyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2luZDwvc3Bhbj4uCi1Zb3VyIGNvbnRlbnQgbW9kZWwgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcyBhIGNoaWxkIG9mIHlvdXIgY29tcGxleCB0eXBlCi0tIGV4cGFuZCBpbiB0aGUgT3V0bGluZSB2aWV3IHRvIHNlZSBpdC4gPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGVzZSBvcHRpb25zIHdpbGwgbm90Ci1hcHBlYXIgaWYgeW91IGhhdmUgc2V0IGEgYmFzZSB0eXBlIGZvciB5b3VyIGNvbXBsZXggdHlwZS4gWW91IGNhbiBlaXRoZXIgc2V0Ci1hIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUsIG9yIHlvdSBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0LCBidXQgeW91Ci1jYW5ub3QgZG8gYm90aC48L2xpPgotCi08bGk+WW91ciBncm91cCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCBhIHNlcXVlbmNlIGNvbnRlbnQgbW9kZWwKLWNoaWxkLiBFeHBhbmQgaXQgaW4gdGhlIE91dGxpbmUgdmlldyB0byBzZWUgaXQgYW5kIHNlbGVjdCBpdC4gSW4gdGhlIFByb3BlcnRpZXMKLXZpZXcsIHlvdSBjYW4gc2VsZWN0IHRvIGNoYW5nZSBpdCB0byBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmNob2ljZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+YWxsPC9zcGFuPiBjb250ZW50Ci1tb2RlbCBieSBzZWxlY3RpbmcgdGhlc2Ugb3B0aW9ucyBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LaW5kPC9zcGFuPiBkcm9wLWRvd24uPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Ryb25nPk9wdGlvbmFsOiA8L3N0cm9uZz48c3Bhbj5TZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NaW5pbXVtCi1PY2N1cnJlbmNlPC9zcGFuPiBmaWVsZC48L3NwYW4+IFRoaXMgaXMgdGhlIG1pbmltdW0KLW51bWJlciBvZiB0aW1lcyB0aGUgY29udGVudCBtb2RlbCBtdXN0IGFwcGVhci4gSWYgeW91IHdhbnQgdGhlIGNvbnRlbnQgbW9kZWwKLXRvIGJlIG9wdGlvbmFsLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MDwvc3Bhbj4uIE90aGVyd2lzZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjE8L3NwYW4+LiAKLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHN0cm9uZz5PcHRpb25hbDogPC9zdHJvbmc+PHNwYW4+U2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF4aW11bQotT2NjdXJyZW5jZTwvc3Bhbj4gZmllbGQuPC9zcGFuPiBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcwotYSBjb250ZW50IG1vZGVsIGNhbiBhcHBlYXIuIFlvdSBjYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuYm91bmRlZDwvc3Bhbj4gdG8KLWluZGljYXRlIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb250ZW50IG1vZGVsLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Zb3UgY2FuIGFkZCB0aGUgZm9sbG93aW5nIGl0ZW1zIHRvIGEgY29udGVudCBvYmplY3QgbW9kZWw6IDwvcD4KLTx1bD4KLTxsaT5Bbm90aGVyIGNvbnRlbnQgbW9kZWwuPC9saT4KLQotPGxpPkEgZ3JvdXAgcmVmZXJlbmNlIHdoaWNoIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZQotaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBUaGlzIG1lbnUKLW9wdGlvbiBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlIGdsb2JhbCBncm91cHMgZGVmaW5lZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50Ci1vciBpZiBncm91cHMgYXJlIGRlZmluZWQgaW4gaW5jbHVkZWQgc2NoZW1hcy48L2xpPgotCi08bGk+QW4gZWxlbWVudCwgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC48L2xpPgotCi08bGk+QW4gZWxlbWVudCByZWZlcmVuY2UsIHdoaWNoIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuCi1UaGlzIG1lbnUgb3B0aW9uIG9ubHkgYXBwZWFycyBpZiB0aGVyZSBhcmUgZ2xvYmFsIGVsZW1lbnRzIGRlZmluZWQgZWxzZXdoZXJlCi1pbiB0aGUgZG9jdW1lbnQuPC9saT4KLQotPGxpPkFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudC4gWW91IGNhbiB1c2UgYW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50Ci10byBleHRlbmQgeW91ciBjb250ZW50IG1vZGVsIGJ5IGFueSBlbGVtZW50cyBiZWxvbmdpbmcgdG8gYSBzcGVjaWZpZWQgbmFtZXNwYWNlLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGFueWUuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBhbnkgZWxlbWVudCBpbiBhIHNpbWlsYXIgd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuIFRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguIj5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZWxtLmh0bWwiIHRpdGxlPSJFbGVtZW50cyBhcmUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC4gRWxlbWVudCBkZWNsYXJhdGlvbnMgcHJvdmlkZSB2YWx1ZSBjb25zdHJhaW50cywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24sIGVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlbGF0ZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsIGFuZCBjb250cm9sIHRoZSBzdWJzdGl0dXRpb24gb2YgZWxlbWVudHMuIj5BZGRpbmcgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZWxtci5odG1sIiB0aXRsZT0iQW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4gQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdsb2JhbCBlbGVtZW50IHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiI+QWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRncnByLmh0bWwiIHRpdGxlPSJBIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiI+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY214dC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY214dC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTBlNmJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkY214dCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGNvbXBsZXggdHlwZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBjb21wbGV4IHR5cGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgY29tcGxleCB0eXBlIGFsbG93cyBlbGVtZW50cyBpbiBpdHMgY29udGVudCBhbmQgY2FuIGNhcnJ5IGF0dHJpYnV0ZXMuDQotQ29tcGxleCB0eXBlcyBjYW4gYmUgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgY29udGVudCBmb3IgYW55DQotaW5zdGFuY2UgZG9jdW1lbnRzIGdlbmVyYXRlZCBmcm9tIG9yIGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmNvbXBsZXggdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmNvbXBsZXggdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPllvdSBjYW4gYWRkIGFzIG1hbnkgY29tcGxleCB0eXBlcyBhcyB5b3Ugd2FudCB0byBhbiBYTUwgc2NoZW1hLjwvcD48cD5UaGUNCi1mb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleQ0KLXdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBjb21wbGV4IHR5cGUgdG8NCi1hbiBYTUwgc2NoZW1hLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIHRoZSBUeXBlcyBjYXRlZ29yeSBpbiB0aGUgRGVzaWduIHZpZXcsIGFuZCBjbGljayA8dWljb250cm9sPkFkZA0KLUNvbXBsZXggVHlwZTwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB0eXBlIGEgbmV3IG5hbWUgZm9yIHRoZSBjb21wbGV4IHR5cGUgaW4NCi10aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBpbiB0aGUgPHVpY29udHJvbD5Jbmhlcml0ZWQNCi1Gcm9tPC91aWNvbnRyb2w+IGRyb3AgZG93biB0byBzZWxlY3QgYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLjwvY21kPg0KLTxpbmZvPllvdSBjYW4gZWl0aGVyIHNldCBhIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUsIG9yIHlvdSBjYW4gYWRkDQotYSBjb250ZW50IG1vZGVsIHRvIGl0ICh3aGljaCByZXByZXNlbnRzIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUNCi1hbiBlbGVtZW50KSwgYnV0IHlvdSBjYW5ub3QgZG8gYm90aC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGVudCBtb2RlbHMsDQotc2VlIDx4cmVmIGhyZWY9InRhZGRjbW9kLmRpdGEiIHNjb3BlPSJwZWVyIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L3hyZWY+LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5yZXN0cmljdGlvbjwvdWljb250cm9sPiBvciA8dWljb250cm9sPmV4dGVuc2lvbjwvdWljb250cm9sPiBmcm9tDQotdGhlIDx1aWNvbnRyb2w+SW5oZXJpdGVkIEJ5PC91aWNvbnRyb2w+IGxpc3QuPC9jbWQ+PGluZm8+VGhpcyBzcGVjaWZpZXMgd2hldGhlcg0KLXlvdXIgdHlwZSBpcyBkZXJpdmVkIGZyb20gaXRzIGJhc2UgdHlwZSBieSByZXN0cmljdGlvbiBvciBleHRlbnNpb24uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSBEZXNpZ24gdmlldyB3aWxsIGRpc3BsYXkgdGhlIGF0dHJpYnV0ZXMgd2l0aGluIHRoZSBjb21wbGV4DQotdHlwZS48L2NtZD48aW5mbz5Zb3UgY2FuIGFsc28gdXNlIHRoaXMgdmlldyB0byBhZGQgYXR0cmlidXRlcyB0byB5b3VyIGNvbXBsZXgNCi10eXBlLiBBbiBhdHRyaWJ1dGUgYXNzb2NpYXRlcyBhbiBhdHRyaWJ1dGUgbmFtZSB3aXRoIGEgc3BlY2lmaWMgdHlwZSBhbmQgdmFsdWUuDQotVG8gYWRkIGFuIGF0dHJpYnV0ZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodCBjbGljayB5b3VyIGNvbXBsZXggdHlwZSBhbmQNCi1zZWxlY3QgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlPC91aWNvbnRyb2w+Ljx1bD4NCi08bGk+PHVpY29udHJvbD5uYW1lPC91aWNvbnRyb2w+LiBJbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBuYW1lIG9mIHRoZQ0KLWF0dHJpYnV0ZSB0byBtYWtlIGEgY2hhbmdlLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+dHlwZTwvdWljb250cm9sPi4gSW4gdGhlIERlc2lnbiB2aWV3LCBjbGljayB0aGUgdHlwZSBvZiB0aGUNCi1hdHRyaWJ1dGUgdG8gbWFrZSBhIGNoYW5nZS4gVGhlIGRyb3AtZG93biBtZW51IHByb3ZpZGVzIGNvbW1vbmx5IHVzZWQgdHlwZXMuDQotRm9yIG1vcmUgb3B0aW9ucywgc2ltcGx5IHNlbGVjdCA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBmcm9tIHRoZSBtZW51LjwvbGk+DQotPC91bD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgYWRkaW5nIGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCBhbmQgPHVzZXJpbnB1dD5hbnk8L3VzZXJpbnB1dD4gYXR0cmlidXRlczw/UHViIENhcmV0Pz4sDQotc2VlIDx4cmVmIGhyZWY9InRhZGRhZ3JwLmRpdGEiIHNjb3BlPSJwZWVyIj5BZGRpbmcgYXR0cmlidXRlIGdyb3VwczwveHJlZj4uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21wbGV4IHR5cGUuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzNjQ3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MGRlZTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY214dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBjb21wbGV4IHR5cGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgY29tcGxleCB0eXBlIGFsbG93cyBlbGVtZW50cyBpbiBpdHMgY29udGVudCBhbmQgY2FuIGNhcnJ5IGF0dHJpYnV0ZXMuIENvbXBsZXggdHlwZXMgY2FuIGJlIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGNvbnRlbnQgZm9yIGFueSBpbnN0YW5jZSBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gb3IgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBjb21wbGV4IHR5cGUgYWxsb3dzIGVsZW1lbnRzIGluIGl0cyBjb250ZW50IGFuZCBjYW4gY2FycnkgYXR0cmlidXRlcy4gQ29tcGxleCB0eXBlcyBjYW4gYmUgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgY29udGVudCBmb3IgYW55IGluc3RhbmNlIGRvY3VtZW50cyBnZW5lcmF0ZWQgZnJvbSBvciBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBjb21wbGV4IHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGNvbXBsZXggdHlwZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkY214dCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBjb21wbGV4IHR5cGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkY214dCI+PGEgbmFtZT0idGFkZGNteHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBjb21wbGV4IHR5cGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGNvbXBsZXggdHlwZSBhbGxvd3MgZWxlbWVudHMgaW4gaXRzIGNvbnRlbnQgYW5kIGNhbiBjYXJyeSBhdHRyaWJ1dGVzLgotQ29tcGxleCB0eXBlcyBjYW4gYmUgdXNlZCB0byBoZWxwIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgY29udGVudCBmb3IgYW55Ci1pbnN0YW5jZSBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gb3IgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gYWRkIGFzIG1hbnkgY29tcGxleCB0eXBlcyBhcyB5b3Ugd2FudCB0byBhbiBYTUwgc2NoZW1hLjwvcD4KLTxwPlRoZQotZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkKLXdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIGNvbXBsZXggdHlwZSB0bwotYW4gWE1MIHNjaGVtYSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmlnaHQtY2xpY2sgdGhlIFR5cGVzIGNhdGVnb3J5IGluIHRoZSBEZXNpZ24gdmlldywgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotQ29tcGxleCBUeXBlPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB0eXBlIGEgbmV3IG5hbWUgZm9yIHRoZSBjb21wbGV4IHR5cGUgaW4KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5oZXJpdGVkCi1Gcm9tPC9zcGFuPiBkcm9wIGRvd24gdG8gc2VsZWN0IGEgYmFzZSB0eXBlIGZvciB5b3VyIGNvbXBsZXggdHlwZS48L3NwYW4+Ci0gWW91IGNhbiBlaXRoZXIgc2V0IGEgYmFzZSB0eXBlIGZvciB5b3VyIGNvbXBsZXggdHlwZSwgb3IgeW91IGNhbiBhZGQKLWEgY29udGVudCBtb2RlbCB0byBpdCAod2hpY2ggcmVwcmVzZW50cyBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlCi1hbiBlbGVtZW50KSwgYnV0IHlvdSBjYW5ub3QgZG8gYm90aC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGVudCBtb2RlbHMsCi1zZWUgPGEgaHJlZj0idGFkZGNtb2QuaHRtbCI+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9hPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnJlc3RyaWN0aW9uPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5leHRlbnNpb248L3NwYW4+IGZyb20KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Jbmhlcml0ZWQgQnk8L3NwYW4+IGxpc3QuPC9zcGFuPiBUaGlzIHNwZWNpZmllcyB3aGV0aGVyCi15b3VyIHR5cGUgaXMgZGVyaXZlZCBmcm9tIGl0cyBiYXNlIHR5cGUgYnkgcmVzdHJpY3Rpb24gb3IgZXh0ZW5zaW9uLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgRGVzaWduIHZpZXcgd2lsbCBkaXNwbGF5IHRoZSBhdHRyaWJ1dGVzIHdpdGhpbiB0aGUgY29tcGxleAotdHlwZS48L3NwYW4+IFlvdSBjYW4gYWxzbyB1c2UgdGhpcyB2aWV3IHRvIGFkZCBhdHRyaWJ1dGVzIHRvIHlvdXIgY29tcGxleAotdHlwZS4gQW4gYXR0cmlidXRlIGFzc29jaWF0ZXMgYW4gYXR0cmlidXRlIG5hbWUgd2l0aCBhIHNwZWNpZmljIHR5cGUgYW5kIHZhbHVlLgotVG8gYWRkIGFuIGF0dHJpYnV0ZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodCBjbGljayB5b3VyIGNvbXBsZXggdHlwZSBhbmQKLXNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlPC9zcGFuPi48dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+bmFtZTwvc3Bhbj4uIEluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIG5hbWUgb2YgdGhlCi1hdHRyaWJ1dGUgdG8gbWFrZSBhIGNoYW5nZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+dHlwZTwvc3Bhbj4uIEluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIHR5cGUgb2YgdGhlCi1hdHRyaWJ1dGUgdG8gbWFrZSBhIGNoYW5nZS4gVGhlIGRyb3AtZG93biBtZW51IHByb3ZpZGVzIGNvbW1vbmx5IHVzZWQgdHlwZXMuCi1Gb3IgbW9yZSBvcHRpb25zLCBzaW1wbHkgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gZnJvbSB0aGUgbWVudS48L2xpPgotCi08L3VsPgotRm9yIGluZm9ybWF0aW9uIGFib3V0IGFkZGluZyBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgYW5kIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+YW55PC9rYmQ+IGF0dHJpYnV0ZXMsCi1zZWUgPGEgaHJlZj0idGFkZGFncnAuaHRtbCI+QWRkaW5nIGF0dHJpYnV0ZSBncm91cHM8L2E+LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbXBsZXggdHlwZS48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgdGl0bGU9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iPkFkZGluZyBjb250ZW50IG1vZGVsczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTUzODRhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0YWRkZWxtIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZWxlbWVudHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBlbGVtZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5FbGVtZW50cyBhcmUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC4gRWxlbWVudCBkZWNsYXJhdGlvbnMNCi1wcm92aWRlIHZhbHVlIGNvbnN0cmFpbnRzLCBwcm92aWRlIGEgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiwNCi1lc3RhYmxpc2ggY29uc3RyYWluaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLA0KLWFuZCBjb250cm9sIHRoZSBzdWJzdGl0dXRpb24gb2YgZWxlbWVudHMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5lbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBlbGVtZW50LA0KLWNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5UbyBhZGQgYW4gZWxlbWVudCwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudA0KLW1vZGVsIChzZXF1ZW5jZSwgY2hvaWNlLCBvciBhbGwgZWxlbWVudCkgeW91IHdhbnQgdG8gd29yayB3aXRoIGFuZCBjbGljayA8dWljb250cm9sPkFkZA0KLUVsZW1lbnQ8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+VGhlIGVsZW1lbnQgYXBwZWFycyBhdHRhY2hlZCB0byB0aGUgY29udGVudA0KLW1vZGVsIGluIHRoZSBEZXNpZ24gdmlldy48L2luZm8+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCBzZWxlY3QgdGhlIGVsZW1lbnQsIGFuZCBjbGljayB0aGUgY3VycmVudA0KLShkZWZhdWx0KSBuYW1lIG9mIHRoZSBlbGVtZW50LCB3aGljaCBwdXRzIHlvdSBpbiBkaXJlY3QgZWRpdGluZyBtb2RlLCB0aGVuDQotdHlwZSB0aGUgbmV3IDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBhbmQgcHJlc3MgZW50ZXIuPC9jbWQ+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCBjbGljayB0aGUgY3VycmVudCAoZGVmYXVsdCkgZWxlbWVudCB0eXBlDQotYW5kIHNlbGVjdCBhIHR5cGUgZnJvbSB0aGUgbWVudS4gQWx0ZXJuYXRlbHksIHlvdSBjYW4gc2VsZWN0IGJyb3dzZSB0byBpbnZva2UNCi10aGUgU2V0IFR5cGUgZGlhbG9nIGZvciBtb3JlIG9wdGlvbnMuPC9jbWQ+PGluZm8+VGhlIFNldCBUeXBlIGRpYWxvZyBsaXN0cw0KLWFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPlNjb3BlPC91aWNvbnRyb2w+IG9mDQotdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPg0KLTxsaT48dWljb250cm9sPldvcmtzcGFjZTwvdWljb250cm9sPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4NCi15b3VyIHdvcmtzcGFjZS48L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLjwvbGk+DQotPGxpPihEZWZhdWx0KSA8dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD46IGxpc3QgYWxsIG9mIHRoZSB0eXBlcw0KLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPg0KLTxsaT48dWljb250cm9sPldvcmtpbmcgU2V0czwvdWljb250cm9sPjogbGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4NCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvaW5mbz48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIEluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUNCi1pbiB0aGUgPHVpY29udHJvbD5NaW5pbXVtIE9jY3VycmVuY2U8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PGluZm8+VGhpcyBpcw0KLXRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gSWYgeW91DQotd2FudCB0aGUgZWxlbWVudCB0byBiZSBvcHRpb25hbCwgc2VsZWN0IDx1aWNvbnRyb2w+MDwvdWljb250cm9sPi4gT3RoZXJ3aXNlLA0KLXNlbGVjdCA8dWljb250cm9sPjE8L3VpY29udHJvbD4uIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TWF4aW11bQ0KLU9jY3VycmU8P1B1YiBDYXJldD8+bmNlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPjxpbmZvPlRoaXMgaXMgdGhlIG1heGltdW0NCi1udW1iZXIgb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gU2VsZWN0IDx1aWNvbnRyb2w+dW5ib3VuZGVkPC91aWNvbnRyb2w+IHRvDQotaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50LjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT5Zb3UgY2FuIGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gYW4gZWxlbWVudCwgd2hpY2ggaXMgdGhlIHJlcHJlc2VudGF0aW9uDQotb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSB0aGUgZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24NCi1hYm91dCB3b3JraW5nIHdpdGggY29udGVudCBtb2RlbHMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzg4NT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyYzU2NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZWxlbWVudHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iRWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQgZGVjbGFyYXRpb25zIHByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLCBlc3RhYmxpc2ggY29uc3RyYWluaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJFbGVtZW50cyBhcmUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC4gRWxlbWVudCBkZWNsYXJhdGlvbnMgcHJvdmlkZSB2YWx1ZSBjb25zdHJhaW50cywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24sIGVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlbGF0ZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsIGFuZCBjb250cm9sIHRoZSBzdWJzdGl0dXRpb24gb2YgZWxlbWVudHMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGFueWUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRnbGJhLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGVsbSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBlbGVtZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGVsbSI+PGEgbmFtZT0idGFkZGVsbSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGVsZW1lbnRzPC9oMT4KLQotCi0KLQotPGRpdj48cD5FbGVtZW50cyBhcmUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC4gRWxlbWVudCBkZWNsYXJhdGlvbnMKLXByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLAotZXN0YWJsaXNoIGNvbnN0cmFpbmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywKLWFuZCBjb250cm9sIHRoZSBzdWJzdGl0dXRpb24gb2YgZWxlbWVudHMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhbiBlbGVtZW50LAotY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhZGQgYW4gZWxlbWVudCwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudAotbW9kZWwgKHNlcXVlbmNlLCBjaG9pY2UsIG9yIGFsbCBlbGVtZW50KSB5b3Ugd2FudCB0byB3b3JrIHdpdGggYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotRWxlbWVudDwvc3Bhbj4uPC9zcGFuPiBUaGUgZWxlbWVudCBhcHBlYXJzIGF0dGFjaGVkIHRvIHRoZSBjb250ZW50Ci1tb2RlbCBpbiB0aGUgRGVzaWduIHZpZXcuCi08b2wgdHlwZT0iYSI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgdGhlIGN1cnJlbnQKLShkZWZhdWx0KSBuYW1lIG9mIHRoZSBlbGVtZW50LCB3aGljaCBwdXRzIHlvdSBpbiBkaXJlY3QgZWRpdGluZyBtb2RlLCB0aGVuCi10eXBlIHRoZSBuZXcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gYW5kIHByZXNzIGVudGVyLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIGN1cnJlbnQgKGRlZmF1bHQpIGVsZW1lbnQgdHlwZQotYW5kIHNlbGVjdCBhIHR5cGUgZnJvbSB0aGUgbWVudS4gQWx0ZXJuYXRlbHksIHlvdSBjYW4gc2VsZWN0IGJyb3dzZSB0byBpbnZva2UKLXRoZSBTZXQgVHlwZSBkaWFsb2cgZm9yIG1vcmUgb3B0aW9ucy48L3NwYW4+IFRoZSBTZXQgVHlwZSBkaWFsb2cgbGlzdHMKLWFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY29wZTwvc3Bhbj4gb2YKLXRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3Jrc3BhY2U8L3NwYW4+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbgoteW91ciB3b3Jrc3BhY2UuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY2xvc2luZyBQcm9qZWN0PC9zcGFuPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUKLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLjwvbGk+Ci0KLTxsaT4oRGVmYXVsdCkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj46IGxpc3QgYWxsIG9mIHRoZSB0eXBlcwotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JraW5nIFNldHM8L3NwYW4+OiBsaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbgotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPihPcHRpb25hbCkgSW4gdGhlIFByb3BlcnRpZXMgdmlldywgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZQotaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1pbmltdW0gT2NjdXJyZW5jZTwvc3Bhbj4gZmllbGQuPC9zcGFuPiBUaGlzIGlzCi10aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbGVtZW50IGNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIElmIHlvdQotd2FudCB0aGUgZWxlbWVudCB0byBiZSBvcHRpb25hbCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjA8L3NwYW4+LiBPdGhlcndpc2UsCi1zZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MTwvc3Bhbj4uIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXhpbXVtCi1PY2N1cnJlbmNlPC9zcGFuPiBmaWVsZC48L3NwYW4+IFRoaXMgaXMgdGhlIG1heGltdW0KLW51bWJlciBvZiB0aW1lcyB0aGUgZWxlbWVudCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBTZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+dW5ib3VuZGVkPC9zcGFuPiB0bwotaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVsZW1lbnQuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBhbiBlbGVtZW50LCB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24KLW9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgdGhlIGVsZW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1hYm91dCB3b3JraW5nIHdpdGggY29udGVudCBtb2RlbHMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiB0aXRsZT0iQSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50IGluc3RhbmNlLiI+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGVsbXIuaHRtbCIgdGl0bGU9IkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRnbGJhLmh0bWwiIHRpdGxlPSJBIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUgaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZSBvciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLiI+QWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNjZkMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGVsbXIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4NCi1BIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsDQotZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZw0KLWRlY2xhcmF0aW9uLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5lbGVtZW50IHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmVsZW1lbnQgcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBlbGVtZW50DQotcmVmZXJlbmNlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCAoc2VxdWVuY2UsIGNob2ljZSwNCi1vciBhbGwgZWxlbWVudCkgeW91IHdhbnQgdG8gd29yayB3aXRoIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBFbGVtZW50IFJlZjwvdWljb250cm9sPi48L2NtZD4NCi08c3RlcHJlc3VsdD5JZiBubyBnbG9iYWwgZWxlbWVudCBpcyBkZWZpbmVkIGluIHRoZSBkb2N1bWVudCwgYSBuZXcgZ2xvYmFsDQotZWxlbWVudCBpcyBjcmVhdGVkIGZvciB5b3UsIGFuZCB0aGUgZWxlbWVudCByZWZlcmVuY2Ugd2lsbCBwb2ludCB0byBpdC48L3N0ZXByZXN1bHQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBlbGVtZW50IHJlZmVyZW5jZS4gVG8gc3BlY2lmeSB2YWx1ZXMgZm9yIGFuIGVsZW1lbnQNCi1yZWZlcmVuY2U6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5DbGljayB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIERlc2lnbiB2aWV3LiBFbnRlcg0KLXRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS48L2Nob2ljZT4NCi08Y2hvaWNlPkNsaWNrIHRoZSBlbGVtZW50IHJlZmVyZW5jZSB0eXBlIGluIHRoZSBEZXNpZ24gdmlldy4gU2VsZWN0IGEgdHlwZQ0KLWZyb20gdGhlIG1lbnUsIG9yIHNlbGVjdCA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBmb3IgbW9yZSBvcHRpb25zLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TWluaW11bQ0KLU9jY3VycmVuY2U8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PGluZm8+VGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwNCi1lbGVtZW50IHJlZmVyZW5jZWQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gSWYgeW91IHdhbnQgdGhlIGVsZW1lbnQNCi10byBiZSBvcHRpb25hbCwgc2VsZWN0IDx1aWNvbnRyb2w+MDwvdWljb250cm9sPi4gT3RoZXJ3aXNlLCBzZWxlY3QgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LiA8L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk1heGltdW0NCi1PY2N1cnJlbmNlPD9QdWIgQ2FyZXQ/PjwvdWljb250cm9sPiBmaWVsZC48L2NtZD48aW5mbz5UaGlzIGlzIHRoZSBtYXhpbXVtDQotbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwgZWxlbWVudCByZWZlcmVuY2VkIGNhbiBhcHBlYXIuIFlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+dW5ib3VuZGVkPC91aWNvbnRyb2w+IHRvDQotaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50IHJlZmVyZW5jZS48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDMwMzk/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxZTk2Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4gQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdsb2JhbCBlbGVtZW50IHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBlbGVtZW50IHJlZmVyZW5jZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZWxlbWVudCByZWZlcmVuY2VzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRnbGVtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGdsYmEuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZWxtciIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRlbG1yIj48YSBuYW1lPSJ0YWRkZWxtciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4KLUEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwKLWVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcKLWRlY2xhcmF0aW9uLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYW4gZWxlbWVudAotcmVmZXJlbmNlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQgbW9kZWwgKHNlcXVlbmNlLCBjaG9pY2UsCi1vciBhbGwgZWxlbWVudCkgeW91IHdhbnQgdG8gd29yayB3aXRoIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgRWxlbWVudCBSZWY8L3NwYW4+Ljwvc3Bhbj4KLSBJZiBubyBnbG9iYWwgZWxlbWVudCBpcyBkZWZpbmVkIGluIHRoZSBkb2N1bWVudCwgYSBuZXcgZ2xvYmFsCi1lbGVtZW50IGlzIGNyZWF0ZWQgZm9yIHlvdSwgYW5kIHRoZSBlbGVtZW50IHJlZmVyZW5jZSB3aWxsIHBvaW50IHRvIGl0LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLiBUbyBzcGVjaWZ5IHZhbHVlcyBmb3IgYW4gZWxlbWVudAotcmVmZXJlbmNlOjwvc3Bhbj4KLTx1bD4KLTxsaT5DbGljayB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIERlc2lnbiB2aWV3LiBFbnRlcgotdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLjwvbGk+Ci0KLTxsaT5DbGljayB0aGUgZWxlbWVudCByZWZlcmVuY2UgdHlwZSBpbiB0aGUgRGVzaWduIHZpZXcuIFNlbGVjdCBhIHR5cGUKLWZyb20gdGhlIG1lbnUsIG9yIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGZvciBtb3JlIG9wdGlvbnMuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1pbmltdW0KLU9jY3VycmVuY2U8L3NwYW4+IGZpZWxkLjwvc3Bhbj4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwKLWVsZW1lbnQgcmVmZXJlbmNlZCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBJZiB5b3Ugd2FudCB0aGUgZWxlbWVudAotdG8gYmUgb3B0aW9uYWwsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4wPC9zcGFuPi4gT3RoZXJ3aXNlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MTwvc3Bhbj4uIAotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1heGltdW0KLU9jY3VycmVuY2U8L3NwYW4+IGZpZWxkLjwvc3Bhbj4gVGhpcyBpcyB0aGUgbWF4aW11bQotbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwgZWxlbWVudCByZWZlcmVuY2VkIGNhbiBhcHBlYXIuIFlvdSBjYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuYm91bmRlZDwvc3Bhbj4gdG8KLWluZGljYXRlIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50IHJlZmVyZW5jZS48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGdsZW0uaHRtbCIgdGl0bGU9IkEgZ2xvYmFsIGVsZW1lbnQgaXMgYW4gZWxlbWVudCB3aXRoIGEgZ2xvYmFsIHNjb3BlLiBJdCBpcyBvbmUgdGhhdCBoYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudCBtb2RlbC4iPkFkZGluZyBnbG9iYWwgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZWxtLmh0bWwiIHRpdGxlPSJFbGVtZW50cyBhcmUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC4gRWxlbWVudCBkZWNsYXJhdGlvbnMgcHJvdmlkZSB2YWx1ZSBjb25zdHJhaW50cywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24sIGVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlbGF0ZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsIGFuZCBjb250cm9sIHRoZSBzdWJzdGl0dXRpb24gb2YgZWxlbWVudHMuIj5BZGRpbmcgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkYW55ZS5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRnbGJhLmh0bWwiIHRpdGxlPSJBIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUgaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZSBvciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLiI+QWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsYmEuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsYmEuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhZDA3Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGdsYmEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZQ0KLWluIGEgZG9jdW1lbnQuIE9uY2UgZGVjbGFyZWQsIGEgZ2xvYmFsIGF0dHJpYnV0ZSBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvbmUNCi1vciBtb3JlIGRlY2xhcmF0aW9ucyB1c2luZyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5nbG9iYWwgYXR0cmlidXRlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+Z2xvYmFsIGF0dHJpYnV0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBnbG9iYWwNCi1hdHRyaWJ1dGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPGI+QXR0cmlidXRlczwvYj4gc2VjdGlvbg0KLWFuZCBjbGljayA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgZW50ZXIgYSBuYW1lIGZvciB0aGUgYXR0cmlidXRlIGluIHRoZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSA8dWljb250cm9sPlR5cGU8L3VpY29udHJvbD4gZnJvbQ0KLXRoZSBwcmVkZWZpbmVkIGxpc3QgaW4gdGhlIG1lbnUgbmV4dCB0byB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTxpbmZvPjxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGZyb20NCi10aGUgbGlzdCBmb3IgbW9yZSBvcHRpb25zLiA8L3A+PHA+VGhlIFNldCBUeXBlIGRpYWxvZyB3aWxsIGFwcGVhciwgYW5kIGxpc3RzDQotYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+U2NvcGU8L3VpY29udHJvbD4gb2YNCi10aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+DQotPGxpPjx1aWNvbnRyb2w+V29ya3NwYWNlPC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbg0KLXlvdXIgd29ya3NwYWNlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPg0KLTxsaT4oRGVmYXVsdCkgPHVpY29udHJvbD5DdXJyZW50IFJlc291cmNlPC91aWNvbnRyb2w+OiBsaXN0IGFsbCBvZiB0aGUgdHlwZXMNCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4NCi08bGk+PHVpY29udHJvbD5Xb3JraW5nIFNldHM8L3VpY29udHJvbD46IGw8P1B1YiBDYXJldD8+aXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlDQotd2l0aGluIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPg0KLTwvdWw+PC9wPjxwPlNlbGVjdCB0aGUgdHlwZSB5b3Ugd2FudCBpbiB0aGUgdHlwZSBsaXN0LCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uIDwvcD48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdsb2JhbCBhdHRyaWJ1dGUuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyOTgzPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYmI3MWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZSBpbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lIG9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZSBpbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lIG9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGdsb2JhbCBhdHRyaWJ1dGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGdsb2JhbCBhdHRyaWJ1dGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZ2xiYSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGdsYmEiPjxhIG5hbWU9InRhZGRnbGJhIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZQotaW4gYSBkb2N1bWVudC4gT25jZSBkZWNsYXJlZCwgYSBnbG9iYWwgYXR0cmlidXRlIGNhbiBiZSByZWZlcmVuY2VkIGluIG9uZQotb3IgbW9yZSBkZWNsYXJhdGlvbnMgdXNpbmcgYW4gYXR0cmlidXRlIHJlZmVyZW5jZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGEgZ2xvYmFsCi1hdHRyaWJ1dGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxzdHJvbmc+QXR0cmlidXRlczwvc3Ryb25nPiBzZWN0aW9uCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgZW50ZXIgYSBuYW1lIGZvciB0aGUgYXR0cmlidXRlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VHlwZTwvc3Bhbj4gZnJvbQotdGhlIHByZWRlZmluZWQgbGlzdCBpbiB0aGUgbWVudSBuZXh0IHRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UeXBlPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci0gPHA+QWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBmcm9tCi10aGUgbGlzdCBmb3IgbW9yZSBvcHRpb25zLiA8L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgU2V0IFR5cGUgZGlhbG9nIHdpbGwgYXBwZWFyLCBhbmQgbGlzdHMKLWFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY29wZTwvc3Bhbj4gb2YKLXRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3Jrc3BhY2U8L3NwYW4+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbgoteW91ciB3b3Jrc3BhY2UuIDwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNsb3NpbmcgUHJvamVjdDwvc3Bhbj46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlCi1pbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4KLQotPGxpPihEZWZhdWx0KSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXJyZW50IFJlc291cmNlPC9zcGFuPjogbGlzdCBhbGwgb2YgdGhlIHR5cGVzCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtpbmcgU2V0czwvc3Bhbj46IGxpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUKLXdpdGhpbiB0aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4KLQotPC91bD4KLTwvZGl2PgotPHA+U2VsZWN0IHRoZSB0eXBlIHlvdSB3YW50IGluIHRoZSB0eXBlIGxpc3QsIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+LiA8L3A+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBnbG9iYWwgYXR0cmlidXRlLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGFiZDAwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkZ2xlbSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGdsb2JhbCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgd2l0aCBhIGdsb2JhbCBzY29wZS4gSXQgaXMgb25lIHRoYXQNCi1oYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudA0KLW1vZGVsLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5nbG9iYWwgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmdsb2JhbCBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIGdsb2JhbA0KLWVsZW1lbnQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHlvdXIgc2NoZW1hLjwvY21kPjxpbmZvPlRoZSBlbnRpcmUNCi1zY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPGI+RWxlbWVudHM8L2I+IHNlY3Rpb24NCi1hbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgRWxlbWVudDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYiwNCi1hbmQgdHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgZ2xvYmFsIGVsZW1lbnQgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIHNlbGVjdCB0aGUgYXR0cmlidXRlIHR5cGUgZnJvbQ0KLXRoZSBwcmVkZWZpbmVkIGxpc3QgaW4gdGhlIG1lbnUgbmV4dCB0byB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTxpbmZvPjxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGZyb20NCi10aGUgbGlzdCBmb3IgbW9yZSBvcHRpb25zLiA8L3A+PHA+VGhlIDx1aWNvbnRyb2w+U2V0IFR5cGU8L3VpY29udHJvbD4gZGlhbG9nDQotYm94IGFwcGVhcnMsIGFuZCBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLg0KLVlvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPlNjb3BlPC91aWNvbnRyb2w+IG9mIHRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUNCi1vZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPg0KLTxsaT48dWljb250cm9sPldvcmtzcGFjZTwvdWljb250cm9sPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4NCi15b3VyIHdvcmtzcGFjZS4gPC9saT4NCi08bGk+PHVpY29udHJvbD5FbmNsb3NpbmcgUHJvamVjdDwvdWljb250cm9sPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUNCi1pbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4NCi08bGk+KERlZmF1bHQpIDx1aWNvbnRyb2w+Q3VycmVudCBSZXNvdXJjZTwvdWljb250cm9sPjogbGlzdCBhbGwgb2YgdGhlIHR5cGVzDQotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+V29ya2luZyBTZXRzPC91aWNvbnRyb2w+OiBsaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbg0KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPg0KLTwvdWw+PC9wPjxwPlNlbGVjdCB0aGUgdHlwZSB5b3Ugd2FudCBpbiB0aGUgdHlwZSBsaXN0LCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uIDwvcD48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+QWR2YW5jZWQ8L3VpY29udHJvbD4gdGFiLjwvY21kPjxpbmZvPkluIHRoaXMNCi1wYWdlLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyB2YXJpb3VzIHZhbHVlcyBmb3IgdGhlIGdsb2JhbCBlbGVtZW50OiA8L2luZm8+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPkFic3RyYWN0PC91aWNvbnRyb2w+OiBjbGljayA8Yj50cnVlPC9iPiBpZiB5b3Ugd2FudCB0aGUNCi1nbG9iYWwgZWxlbWVudCB0byBiZSBhYnN0cmFjdC4gV2hlbiBhIGdsb2JhbCBlbGVtZW50IGlzIGRlY2xhcmVkIHRvIGJlIGFic3RyYWN0LA0KLWl0IGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBJbnN0ZWFkLCBhIG1lbWJlciBvZiB0aGF0IGdsb2JhbA0KLWVsZW1lbnQncyBzdWJzdGl0dXRpb24gZ3JvdXAgbXVzdCBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5CbG9jazwvdWljb250cm9sPjogZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnbG9iYWwgZWxlbWVudA0KLW1heSBiZSByZXBsYWNlZCBieSBhbiBlbGVtZW50IGRlcml2ZWQgZnJvbSBpdC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+RmluYWw8L3VpY29udHJvbD46IGRldGVybWluZXMgd2hldGhlciB0aGlzIGdsb2JhbCBlbGVtZW50DQotbWF5IGJlIGRlcml2ZWQgZnJvbS48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+U3Vic3RpdHV0aW9uIEdyb3VwPC91aWNvbnRyb2w+OiBhIHN1YnN0aXR1dGlvbiBncm91cCBhbGxvd3MNCi1lbGVtZW50cyB0byBiZSBzdWJzdGl0dXRlZCBmb3Igb3RoZXIgZWxlbWVudHMuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPk5pbGxhYmxlPC91aWNvbnRyb2w+OiBzZWxlY3QgPGI+dHJ1ZTwvYj4gaWYgeW91IGRvIG5vdA0KLXdhbnQgdGhlIGdsb2JhbCBlbGVtZW50IHRvIGJlIGFibGUgdG8gaGF2ZSBhbnkgY2hpbGQgZWxlbWVudHMsIG9ubHkgYXR0cmlidXRlcy4gPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIHRvIHByb3ZpZGUgYW55DQotaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBnbG9iYWwgZWxlbWVudC48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiB0byBhZGQgYXBwbGljYXRpb24NCi1pbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZQ0KLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+DQotPC9zdGVwPjw/UHViIENhcmV0Pz4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPllvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBhIGdsb2JhbCBlbGVtZW50LCB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24NCi1vZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIHRoZSBnbG9iYWwgZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24NCi1hYm91dCB3b3JraW5nIHdpdGggY29udGVudCBtb2RlbHMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNDM4Mz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGZkOTQ4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgZ2xvYmFsIGVsZW1lbnQgaXMgYW4gZWxlbWVudCB3aXRoIGEgZ2xvYmFsIHNjb3BlLiBJdCBpcyBvbmUgdGhhdCBoYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudCBtb2RlbC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBnbG9iYWwgZWxlbWVudCBpcyBhbiBlbGVtZW50IHdpdGggYSBnbG9iYWwgc2NvcGUuIEl0IGlzIG9uZSB0aGF0IGhhcyBiZWVuIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1haW4gc2NoZW1hIHJhdGhlciB0aGFuIGFzIHBhcnQgb2YgYSBjb250ZW50IG1vZGVsLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBnbG9iYWwgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZ2xvYmFsIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtci5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRnbGVtIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGdsZW0iPjxhIG5hbWU9InRhZGRnbGVtIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgZ2xvYmFsIGVsZW1lbnRzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGdsb2JhbCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgd2l0aCBhIGdsb2JhbCBzY29wZS4gSXQgaXMgb25lIHRoYXQKLWhhcyBiZWVuIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1haW4gc2NoZW1hIHJhdGhlciB0aGFuIGFzIHBhcnQgb2YgYSBjb250ZW50Ci1tb2RlbC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGEgZ2xvYmFsCi1lbGVtZW50LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgeW91ciBzY2hlbWEuPC9zcGFuPiBUaGUgZW50aXJlCi1zY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxzdHJvbmc+RWxlbWVudHM8L3N0cm9uZz4gc2VjdGlvbgotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBFbGVtZW50PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiLAotYW5kIHR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIGdsb2JhbCBlbGVtZW50IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgdHlwZSBmcm9tCi10aGUgcHJlZGVmaW5lZCBsaXN0IGluIHRoZSBtZW51IG5leHQgdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlR5cGU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLSA8cD5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGZyb20KLXRoZSBsaXN0IGZvciBtb3JlIG9wdGlvbnMuIDwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXQgVHlwZTwvc3Bhbj4gZGlhbG9nCi1ib3ggYXBwZWFycywgYW5kIGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuCi1Zb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NvcGU8L3NwYW4+IG9mIHRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUKLW9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4KLXlvdXIgd29ya3NwYWNlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW5jbG9zaW5nIFByb2plY3Q8L3NwYW4+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+Ci0KLTxsaT4oRGVmYXVsdCkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj46IGxpc3QgYWxsIG9mIHRoZSB0eXBlcwotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JraW5nIFNldHM8L3NwYW4+OiBsaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbgotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTxwPlNlbGVjdCB0aGUgdHlwZSB5b3Ugd2FudCBpbiB0aGUgdHlwZSBsaXN0LCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi4gPC9wPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZHZhbmNlZDwvc3Bhbj4gdGFiLjwvc3Bhbj4gSW4gdGhpcwotcGFnZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFyaW91cyB2YWx1ZXMgZm9yIHRoZSBnbG9iYWwgZWxlbWVudDogCi08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWJzdHJhY3Q8L3NwYW4+OiBjbGljayA8c3Ryb25nPnRydWU8L3N0cm9uZz4gaWYgeW91IHdhbnQgdGhlCi1nbG9iYWwgZWxlbWVudCB0byBiZSBhYnN0cmFjdC4gV2hlbiBhIGdsb2JhbCBlbGVtZW50IGlzIGRlY2xhcmVkIHRvIGJlIGFic3RyYWN0LAotaXQgY2Fubm90IGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIEluc3RlYWQsIGEgbWVtYmVyIG9mIHRoYXQgZ2xvYmFsCi1lbGVtZW50J3Mgc3Vic3RpdHV0aW9uIGdyb3VwIG11c3QgYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudC48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QmxvY2s8L3NwYW4+OiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdsb2JhbCBlbGVtZW50Ci1tYXkgYmUgcmVwbGFjZWQgYnkgYW4gZWxlbWVudCBkZXJpdmVkIGZyb20gaXQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmFsPC9zcGFuPjogZGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgZ2xvYmFsIGVsZW1lbnQKLW1heSBiZSBkZXJpdmVkIGZyb20uPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN1YnN0aXR1dGlvbiBHcm91cDwvc3Bhbj46IGEgc3Vic3RpdHV0aW9uIGdyb3VwIGFsbG93cwotZWxlbWVudHMgdG8gYmUgc3Vic3RpdHV0ZWQgZm9yIG90aGVyIGVsZW1lbnRzLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5OaWxsYWJsZTwvc3Bhbj46IHNlbGVjdCA8c3Ryb25nPnRydWU8L3N0cm9uZz4gaWYgeW91IGRvIG5vdAotd2FudCB0aGUgZ2xvYmFsIGVsZW1lbnQgdG8gYmUgYWJsZSB0byBoYXZlIGFueSBjaGlsZCBlbGVtZW50cywgb25seSBhdHRyaWJ1dGVzLiA8L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgdG8gcHJvdmlkZSBhbnkKLWluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ2xvYmFsIGVsZW1lbnQuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgdG8gYWRkIGFwcGxpY2F0aW9uCi1pbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UKLWFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBhIGdsb2JhbCBlbGVtZW50LCB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24KLW9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgdGhlIGdsb2JhbCBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQgbW9kZWxzLCByZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgdGl0bGU9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iPkFkZGluZyBjb250ZW50IG1vZGVsczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRlbG1yLmh0bWwiIHRpdGxlPSJBbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsIGVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwZWMwMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGdycHIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBncm91cCByZWZlcmVuY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdA0KLWVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dA0KLW9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Z3JvdXAgZmVhdHVyZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmdyb3VwIGZlYXR1cmVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UaGUgbWVudSBvcHRpb24gdG8gYWRkIGEgZ3JvdXAgcmVmZXJlbmNlIG9ubHkgYXBwZWFycyBpZiB0aGVyZSBhcmUNCi1ncm91cHMgZGVmaW5lZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50LjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUNCi13cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXINCi1wZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIGdyb3VwIHJlZmVyZW5jZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczw/UHViIENhcmV0Pz46PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50IG1vZGVsIHlvdSB3YW50IHRvIHdvcmsNCi13aXRoIGFuZCBzZWxlY3QgPHVpY29udHJvbD5BZGQgR3JvdXAgUmVmPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgbmV3IGdyb3VwIHJlZmVyZW5jZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBzZWxlY3QgdGhlIGdyb3VwIHlvdSB3YW50IHRvIHJlZmVyIHRvIGluDQotdGhlIDx1aWNvbnRyb2w+cmVmPC91aWNvbnRyb2w+IGxpc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdyb3VwIHJlZmVyZW5jZS48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDIwMDc/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjNjQyYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBncm91cCBmZWF0dXJlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBncm91cCBmZWF0dXJlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ3J1cC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRncnByIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRncnByIj48YSBuYW1lPSJ0YWRkZ3JwciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgZ3JvdXAgcmVmZXJlbmNlIGlzIGEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ3JvdXAuIEl0Ci1lbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQKLW9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZSBtZW51IG9wdGlvbiB0byBhZGQgYSBncm91cCByZWZlcmVuY2Ugb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZQotZ3JvdXBzIGRlZmluZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudC48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlCi13cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIKLXBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYSBncm91cCByZWZlcmVuY2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCB5b3Ugd2FudCB0byB3b3JrCi13aXRoIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEdyb3VwIFJlZjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBuZXcgZ3JvdXAgcmVmZXJlbmNlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgZ3JvdXAgeW91IHdhbnQgdG8gcmVmZXIgdG8gaW4KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5yZWY8L3NwYW4+IGxpc3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBncm91cCByZWZlcmVuY2UuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRncnVwLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgaXQgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuIFRoZSBjb250ZW50IG1vZGVsIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuIj5BZGRpbmcgZ3JvdXBzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdydXAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdydXAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5NzIxYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRhZGRncnVwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZ3JvdXBzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZ3JvdXBzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCBpdCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudCBtb2RlbC4NCi1UaGUgY29udGVudCBtb2RlbCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGdyb3VwZWQgdG9nZXRoZXINCi1ieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmdyb3VwczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+Z3JvdXBzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UNCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd3M8P1B1YiBDYXJldD8+aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi1hZGQgYSBncm91cCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayA8Yj5Hcm91cHM8L2I+LCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1Hcm91cDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB0eXBlIGEgbmV3IG5hbWUgZm9yIHRoZSBncm91cCBpbiB0aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBncm91cCBlbGVtZW50LjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCBleHBhbmQgdGhlIDx1aWNvbnRyb2w+R3JvdXBzPC91aWNvbnRyb2w+IGZvbGRlcg0KLWFuZCB5b3VyIG5ldyBncm91cC48L2NtZD48aW5mbz5Zb3VyIGdyb3VwIGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50DQotbW9kZWwuIEEgZ3JvdXAncyBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbg0KLWJlIGNvbnRhaW5lZCBpbnNpZGUgdGhlIGdyb3VwLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3b3JraW5nIHdpdGggY29udGVudA0KLW1vZGVscywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMjMyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZGYzYTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ3J1cC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGdyb3VwcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgaXQgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuIFRoZSBjb250ZW50IG1vZGVsIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCBpdCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudCBtb2RlbC4gVGhlIGNvbnRlbnQgbW9kZWwgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyIGJ5IHRoZSBncm91cCwgc3VjaCBhcyBlbGVtZW50cywgZWxlbWVudCByZWZlcmVuY2VzLCBhbmQgZ3JvdXAgcmVmZXJlbmNlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZ3JvdXBzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ3Jwci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZ3J1cCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBncm91cHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRncnVwIj48YSBuYW1lPSJ0YWRkZ3J1cCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGdyb3VwczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiB5b3UgY3JlYXRlIGEgZ3JvdXAsIGl0IGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50IG1vZGVsLgotVGhlIGNvbnRlbnQgbW9kZWwgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyCi1ieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cCAvPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3c2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWFkZCBhIGdyb3VwLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayA8c3Ryb25nPkdyb3Vwczwvc3Ryb25nPiwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotR3JvdXA8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIGdyb3VwIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3JvdXAgZWxlbWVudC48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBleHBhbmQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdyb3Vwczwvc3Bhbj4gZm9sZGVyCi1hbmQgeW91ciBuZXcgZ3JvdXAuPC9zcGFuPiBZb3VyIGdyb3VwIGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50Ci1tb2RlbC4gQSBncm91cCdzIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuCi1iZSBjb250YWluZWQgaW5zaWRlIHRoZSBncm91cC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQKLW1vZGVscywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGdycHIuaHRtbCIgdGl0bGU9IkEgZ3JvdXAgcmVmZXJlbmNlIGlzIGEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ3JvdXAuIEl0IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIHRpdGxlPSJBIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQgaW5zdGFuY2UuIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW1wdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW1wdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU3NTU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkaW1wdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGltcG9ydCBlbGVtZW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGltcG9ydCBlbGVtZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXINCi1jb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLA0KLXJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIGFuIDxjb2RlcGg+aW1wb3J0PC9jb2RlcGg+IGVsZW1lbnQgdG8NCi1icmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gYW4gaW1wb3J0ZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQNCi1zY2hlbWEuIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5pbXBvcnQgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmltcG9ydCBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGltcG9ydGVkIHNjaGVtYSBjYW4gY29tZSBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIHRoZQ0KLWN1cnJlbnQgc2NoZW1hIGRvZXMuIFlvdSBjYW4gYWRkIG11bHRpcGxlIGltcG9ydCBlbGVtZW50cyB0byBhbiBYTUwgc2NoZW1hLA0KLWhvd2V2ZXIsIHByZWZpeGVzIGFuZCBuYW1lc3BhY2VzIGhhdmUgdG8gdW5pcXVlIGFtb25nc3QgdGhlIGltcG9ydGVkIHNjaGVtYXMuPC9wPjxwPlRoZQ0KLWZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5DQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBpbXBvcnQgZWxlbWVudCwNCi1jb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBJbiB0aGUgT3V0bGluZSB2aWV3LA0KLXNlbGVjdCB5b3VyIHNjaGVtYS48L2NtZD48aW5mbz5UaGUgZW50aXJlIHNjaGVtYSBhbmQgaXRzIGNvbnRlbnRzIHNob3VsZCBiZQ0KLWRpc3BsYXllZCBpbiB0aGUgRGVzaWduIHZpZXcuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQgY2xpY2sgaW4gdGhlIDxiPkRpcmVjdGl2ZXM8L2I+IHNlY3Rpb24NCi1hbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgSW1wb3J0PC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8Yj5HZW5lcmFsPC9iPiB0YWIgYW5kIGNsaWNrDQotdGhlIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IGJ1dHRvbiB0byB0aGUgcmlnaHQgb2YgdGhlIDx1aWNvbnRyb2w+U2NoZW1hDQotbG9jYXRpb248L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gaW1wb3J0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB0aGUgd29ya2JlbmNoOjwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPldvcmtiZW5jaCBwcm9qZWN0czwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LiA8L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgb24gdGhlIFdlYjo8L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5IVFRQPC91aWNvbnRyb2w+IGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+VHlwZSB0aGUgVVJMIG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBjbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz48bm90ZT5BIGxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIHdvcmtiZW5jaC4NCi1FdmVyeSB0aW1lIHlvdSB2YWxpZGF0ZSB5b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIHdpbGwgYmUgY2hlY2tlZA0KLWZyb20gdGhlIFVSTCB5b3Ugc3BlY2lmeS48L25vdGU+PC9pbmZvPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSBYTUwgc2NoZW1hIGVkaXRvciB3aWxsIHJldHJpZXZlIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBpbXBvcnRlZA0KLVhNTCBzY2hlbWEgZmlsZSBhbmQgZGlzcGxheSBpdCBhcyByZWFkLW9ubHkgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZXNwYWNlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPklmIG5lY2Vzc2FyeSwgdHlwZSBhIHVuaXF1ZSBwcmVmaXggZm9yIHRoaXMgbmFtZXNwYWNlIGluIHRoZSA8dWljb250cm9sPlByZWZpeDwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wb3J0IGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCBhbiBpbXBvcnQgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsIHdoZW4NCi15b3UgZGVmaW5lIG5ldyBlbGVtZW50cywgYXR0cmlidXRlcywgY29tcGxleCB0eXBlcywgb3Igc2ltcGxlIHR5cGVzIHdoZXJlDQoteW91IGNhbiBzcGVjaWZ5IHR5cGUgaW5mb3JtYXRpb24sIGFueSBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgczw/UHViIENhcmV0Pz5jaGVtYQ0KLXdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSA8dWljb250cm9sPlR5cGU8L3VpY29udHJvbD4gbGlzdCBmb3IgdGhlIGVsZW1lbnQsDQotYXR0cmlidXRlLCBjb21wbGV4IG9yIHNpbXBsZSB0eXBlLjwvcD48L3Jlc3VsdD4NCi08cG9zdHJlcT48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDQwNTg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4MjA1My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwgcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgYW4gaW1wb3J0IGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGltcG9ydCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBpbXBvcnQgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRyZGZuLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9ybm1zcGMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkaW1wdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRpbXB0Ij48YSBuYW1lPSJ0YWRkaW1wdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGltcG9ydCBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyCi1jb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLAotcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgYW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+aW1wb3J0PC9zYW1wPiBlbGVtZW50IHRvCi1icmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gYW4gaW1wb3J0ZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQKLXNjaGVtYS4gPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgaW1wb3J0ZWQgc2NoZW1hIGNhbiBjb21lIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gdGhlCi1jdXJyZW50IHNjaGVtYSBkb2VzLiBZb3UgY2FuIGFkZCBtdWx0aXBsZSBpbXBvcnQgZWxlbWVudHMgdG8gYW4gWE1MIHNjaGVtYSwKLWhvd2V2ZXIsIHByZWZpeGVzIGFuZCBuYW1lc3BhY2VzIGhhdmUgdG8gdW5pcXVlIGFtb25nc3QgdGhlIGltcG9ydGVkIHNjaGVtYXMuPC9wPgotPHA+VGhlCi1mb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGFuIGltcG9ydCBlbGVtZW50LAotY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIEluIHRoZSBPdXRsaW5lIHZpZXcsCi1zZWxlY3QgeW91ciBzY2hlbWEuPC9zcGFuPiBUaGUgZW50aXJlIHNjaGVtYSBhbmQgaXRzIGNvbnRlbnRzIHNob3VsZCBiZQotZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQgY2xpY2sgaW4gdGhlIDxzdHJvbmc+RGlyZWN0aXZlczwvc3Ryb25nPiBzZWN0aW9uCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEltcG9ydDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzdHJvbmc+R2VuZXJhbDwvc3Ryb25nPiB0YWIgYW5kIGNsaWNrCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiIGFsdD0iVGhpcyYjMTA7Z3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gYnV0dG9uIHRvIHRoZSByaWdodCBvZiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NoZW1hCi1sb2NhdGlvbjwvc3Bhbj4gZmllbGQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW1wb3J0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB0aGUgd29ya2JlbmNoOjwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoIHByb2plY3RzPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIG9uIHRoZSBXZWI6PC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRUUDwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSB0aGUgVVJMIG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4KLSA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQSBsb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSB3b3JrYmVuY2guCi1FdmVyeSB0aW1lIHlvdSB2YWxpZGF0ZSB5b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIHdpbGwgYmUgY2hlY2tlZAotZnJvbSB0aGUgVVJMIHlvdSBzcGVjaWZ5LjwvZGl2PgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCByZXRyaWV2ZSB0aGUgbmFtZXNwYWNlIGZvciB0aGUgaW1wb3J0ZWQKLVhNTCBzY2hlbWEgZmlsZSBhbmQgZGlzcGxheSBpdCBhcyByZWFkLW9ubHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiBuZWNlc3NhcnksIHR5cGUgYSB1bmlxdWUgcHJlZml4IGZvciB0aGlzIG5hbWVzcGFjZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZml4PC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wb3J0IGVsZW1lbnQuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPk9uY2UgeW91IGhhdmUgYWRkZWQgYW4gaW1wb3J0IGVsZW1lbnQgdG8geW91ciBYTUwgc2NoZW1hLCB3aGVuCi15b3UgZGVmaW5lIG5ldyBlbGVtZW50cywgYXR0cmlidXRlcywgY29tcGxleCB0eXBlcywgb3Igc2ltcGxlIHR5cGVzIHdoZXJlCi15b3UgY2FuIHNwZWNpZnkgdHlwZSBpbmZvcm1hdGlvbiwgYW55IGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEKLXdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UeXBlPC9zcGFuPiBsaXN0IGZvciB0aGUgZWxlbWVudCwKLWF0dHJpYnV0ZSwgY29tcGxleCBvciBzaW1wbGUgdHlwZS48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgdGl0bGU9IkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLCByZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZHJkZm4uaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSByZWRlZmluZSBtZWNoYW5pc20gdG8gcmVkZWZpbmUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkIGZyb20gZXh0ZXJuYWwgc2NoZW1hIGZpbGVzLiBXaGVuIHlvdSByZWRlZmluZSBhIGNvbXBvbmVudCwgeW91IGFyZSBtb2RpZnlpbmcgaXRzIGNvbnRlbnRzLiI+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3JubXNwYy5odG1sIiB0aXRsZT0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1OTU0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbmNsLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGluY2wiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXINCi1jb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLA0KLXJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIHRoZSA8Y29kZXBoPmluY2x1ZGU8L2NvZGVwaD4gZWxlbWVudCB0bw0KLWJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQNCi1zY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcNCi1zY2hlbWEuIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5pbmNsdWRlIGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5pbmNsdWRlIGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBYTUwgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBpbmNsdWRlDQotZWxlbWVudCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gSW4gdGhlIE91dGxpbmUgdmlldywNCi1zZWxlY3QgeW91ciBzY2hlbWEuPC9jbWQ+PGluZm8+VGhlIGVudGlyZSBzY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkDQotaW4gdGhlIERlc2lnbiB2aWV3LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8Yj5EaXJlY3RpdmVzPC9iPiBzZWN0aW9uDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEluY2x1ZGU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxiPkdlbmVyYWw8L2I+IHRhYiBhbmQgY2xpY2sNCi10aGUgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIj48YWx0PlRoaXMNCi1ncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uPC9hbHQ+PC9pbWFnZT4gYnV0dG9uIHRvIHRoZSByaWdodCBvZiB0aGUgPHVpY29udHJvbD5TY2hlbWENCi1sb2NhdGlvbjwvdWljb250cm9sPiBmaWVsZC48L2NtZD48aW5mbz5UaGUgWE1MIHNjaGVtYSBmaWxlIHlvdSBzZWxlY3QgbXVzdA0KLWhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBjdXJyZW50IHNjaGVtYS48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gaW1wb3J0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB0aGUgd29ya2JlbmNoOjwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPldvcmtiZW5jaCBwcm9qZWN0czwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LiA8L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgb24gdGhlIFdlYjo8L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5IVFRQPC91aWNvbnRyb2w+IGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+VHlwZSB0aGUgVVJMIG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBjbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz48bm90ZT5BIGxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIHdvcmtiZW5jaC4NCi1FdmVyeSB0aW1lIHlvdSB2YWxpZGF0ZSB5b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIHdpbGwgYmUgY2hlY2tlZA0KLWZyb20gdGhlIFVSTCB5b3Ugc3BlY2lmeS48L25vdGU+PC9pbmZvPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSBYTUwgc2NoZW1hIGVkaXRvciB3aWxsIHJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZWQNCi1YTUwgc2NoZW1hIGZpbGUsIGFuZCBkaXNwbGF5IGl0IGluIHRoZSA8dWljb250cm9sPlNjaGVtYSBsb2NhdGlvbjwvdWljb250cm9sPiBmaWVsZC4NCi1UaGlzIGZpZWxkIGNhbiBiZSBlZGl0ZWQgYXQgYW55IHRpbWUgdG8gcmVmbGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlIFhNTCBzY2hlbWENCi1maWxlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbmNsdWRlIGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwgd2hlbg0KLXlvdSBkZWZpbmUgbmV3IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBjb21wbGV4IHR5cGVzLCBvciBzaW1wbGUgdHlwZXMgd2hlcmUNCi15b3UgY2FuIHNwZWNpZnkgdHlwZSBpbmZvcm1hdGlvbiwgYW55IGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWENCi13aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGxpc3QgZm9yIHRoZSBlbGVtZW50LA0KLWF0dHJpYnV0ZSwgY29tcGxleCBvciBzaW1wbGUgdHlwZS48L3A+PHA+Rm9yIGV4YW1wbGUsIGlmIEFkZHJlc3MueHNkIGhhcyB0aGUNCi1mb2xsb3dpbmcgY29udGVudDo8L3A+PGNvZGVibG9jaz4mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzcyI+DQotICAgICZsdDtzZXF1ZW5jZT4NCi0gICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdHJlZXQiIHR5cGU9InN0cmluZyI+DQotICAgICZsdDsvc2VxdWVuY2U+DQotJmx0Oy9jb21wbGV4VHlwZT4NCi08L2NvZGVibG9jaz5hbmQgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBjYWxsZWQgUHVyY2hhc2VPcmRlci54c2QgdGhhdCBoYXMgYWRkZWQNCi1hbiBpbmNsdWRlIGZvciBBZGRyZXNzLnhzZCwgdGhlbiB3aGVuIGRlZmluaW5nIGEgbmV3IGVsZW1lbnQgaW4gIFB1cmNoYXNlT3JkZXIsDQoteW91IGNhbiBzZWxlY3QgQWRkcmVzcyBhcyBpdHMgdHlwZS4gIDxkcmFmdC1jb21tZW50PihjKSBDb3B5cmlnaHQgMjAwMSwgV29ybGQNCi1XaWRlIFdlYiBDb25zb3J0aXVtIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbA0KLWRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuPC9kcmFmdC1jb21tZW50PjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPjw/UHViIENhcmV0Pz4NCi08P1B1YiAqMDAwMDAwNDU5NT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzQ3OTYyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwgcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgdGhlIGluY2x1ZGUgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlIGluY2x1ZGluZyBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLCByZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgaW5jbHVkZSBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBpbmNsdWRlIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkcmRmbi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGluY2wiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGluY2wiPjxhIG5hbWU9InRhZGRpbmNsIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyCi1jb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLAotcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmluY2x1ZGU8L3NhbXA+IGVsZW1lbnQgdG8KLWJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQKLXNjaGVtYS4gVGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlIGluY2x1ZGluZwotc2NoZW1hLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFhNTCBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhbiBpbmNsdWRlCi1lbGVtZW50LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gSW4gdGhlIE91dGxpbmUgdmlldywKLXNlbGVjdCB5b3VyIHNjaGVtYS48L3NwYW4+IFRoZSBlbnRpcmUgc2NoZW1hIGFuZCBpdHMgY29udGVudHMgYXJlIGRpc3BsYXllZAotaW4gdGhlIERlc2lnbiB2aWV3LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPHN0cm9uZz5EaXJlY3RpdmVzPC9zdHJvbmc+IHNlY3Rpb24KLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgSW5jbHVkZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzdHJvbmc+R2VuZXJhbDwvc3Ryb25nPiB0YWIgYW5kIGNsaWNrCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiIGFsdD0iVGhpcyYjMTA7Z3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gYnV0dG9uIHRvIHRoZSByaWdodCBvZiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NoZW1hCi1sb2NhdGlvbjwvc3Bhbj4gZmllbGQuPC9zcGFuPiBUaGUgWE1MIHNjaGVtYSBmaWxlIHlvdSBzZWxlY3QgbXVzdAotaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGN1cnJlbnQgc2NoZW1hLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW1wb3J0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB0aGUgd29ya2JlbmNoOjwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoIHByb2plY3RzPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIG9uIHRoZSBXZWI6PC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRUUDwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSB0aGUgVVJMIG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4KLSA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQSBsb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSB3b3JrYmVuY2guCi1FdmVyeSB0aW1lIHlvdSB2YWxpZGF0ZSB5b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIHdpbGwgYmUgY2hlY2tlZAotZnJvbSB0aGUgVVJMIHlvdSBzcGVjaWZ5LjwvZGl2PgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCByZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGluY2x1ZGVkCi1YTUwgc2NoZW1hIGZpbGUsIGFuZCBkaXNwbGF5IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY2hlbWEgbG9jYXRpb248L3NwYW4+IGZpZWxkLgotVGhpcyBmaWVsZCBjYW4gYmUgZWRpdGVkIGF0IGFueSB0aW1lIHRvIHJlZmxlY3QgdGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgc2NoZW1hCi1maWxlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW5jbHVkZSBlbGVtZW50Ljwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5PbmNlIHlvdSBoYXZlIGFkZGVkIHRoZSBpbmNsdWRlIGVsZW1lbnQgdG8geW91ciBYTUwgc2NoZW1hLCB3aGVuCi15b3UgZGVmaW5lIG5ldyBlbGVtZW50cywgYXR0cmlidXRlcywgY29tcGxleCB0eXBlcywgb3Igc2ltcGxlIHR5cGVzIHdoZXJlCi15b3UgY2FuIHNwZWNpZnkgdHlwZSBpbmZvcm1hdGlvbiwgYW55IGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEKLXdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UeXBlPC9zcGFuPiBsaXN0IGZvciB0aGUgZWxlbWVudCwKLWF0dHJpYnV0ZSwgY29tcGxleCBvciBzaW1wbGUgdHlwZS48L3A+Ci08cD5Gb3IgZXhhbXBsZSwgaWYgQWRkcmVzcy54c2QgaGFzIHRoZQotZm9sbG93aW5nIGNvbnRlbnQ6PC9wPgotPHByZT4mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzcyImZ3Q7Ci0gICAgJmx0O3NlcXVlbmNlJmd0OwotICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciJmd0OwotICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdHJlZXQiIHR5cGU9InN0cmluZyImZ3Q7Ci0gICAgJmx0Oy9zZXF1ZW5jZSZndDsKLSZsdDsvY29tcGxleFR5cGUmZ3Q7Ci08L3ByZT4KLWFuZCB5b3UgaGF2ZSBhbiBYTUwgc2NoZW1hIGNhbGxlZCBQdXJjaGFzZU9yZGVyLnhzZCB0aGF0IGhhcyBhZGRlZAotYW4gaW5jbHVkZSBmb3IgQWRkcmVzcy54c2QsIHRoZW4gd2hlbiBkZWZpbmluZyBhIG5ldyBlbGVtZW50IGluICBQdXJjaGFzZU9yZGVyLAoteW91IGNhbiBzZWxlY3QgQWRkcmVzcyBhcyBpdHMgdHlwZS4gIDwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiB0aXRsZT0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIj5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZHJkZm4uaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSByZWRlZmluZSBtZWNoYW5pc20gdG8gcmVkZWZpbmUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkIGZyb20gZXh0ZXJuYWwgc2NoZW1hIGZpbGVzLiBXaGVuIHlvdSByZWRlZmluZSBhIGNvbXBvbmVudCwgeW91IGFyZSBtb2RpZnlpbmcgaXRzIGNvbnRlbnRzLiI+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3JubXNwYy5odG1sIiB0aXRsZT0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZG5vdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkbm90LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MjhkMDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkbm90LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZG5vdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIG5vdGF0aW9uczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIG5vdGF0aW9uczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIG5vdGF0aW9uIGlzIGEgbWVhbnMgb2YgYXNzb2NpYXRpbmcgYSBiaW5hcnkgZGVzY3JpcHRpb24gd2l0aA0KLWFuIGVudGl0eSBvciBhdHRyaWJ1dGUuIFRoZSBtb3N0IGNvbW1vbiB1c2VzIG9mIG5vdGF0aW9ucyBhcmUgdG8gaW5jbHVkZSBmYW1pbGlhcg0KLXR5cGVzIG9mIGJpbmFyeSByZWZlcmVuY2VzLCBzdWNoIGFzIEdJRnMgYW5kIEpQR3MsIGluIGFuIFhNTCBmaWxlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5ub3RhdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPm5vdGF0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+Rm9yIGV4YW1wbGUsIHlvdSBhcmUgbWFraW5nIGEgY2F0YWxvZ3VlIG9mIHlvdXIgY2xvdGhpbmcgYW5kIHdhbnQNCi10byBpbmNsdWRlIGFuIGltYWdlIG9mIG9uZSBvZiB5b3VyIHNoaXJ0cy4gWW91IHdvdWxkIGhhdmUgdG8gY3JlYXRlIGEgbm90YXRpb24NCi1saWtlIHRoaXM6ICA8dXNlcmlucHV0PiZsdDtub3RhdGlvbiBuYW1lPSJNeV9TaGlydCIgc3lzdGVtPSJHSUYiPiZsdDsvbm90YXRpb24+PC91c2VyaW5wdXQ+IHdoaWNoDQotZGVmaW5lcyBhIG5vdGF0aW9uIGZvciBhIEdJRiBpbWFnZS48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZQ0KLXdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlcg0KLXBlcnNwZWN0aXZlcy48L3A+PHA+VG8gY3JlYXRlIGEgbm90YXRpb24sIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB5b3VyIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotTm90YXRpb248L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgdHlwZSB0aGUgbmFtZSBvZiB0aGUgbm90YXRpb24gaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPiB0YWIuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+cHVibGljPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIGEgcHVibGljIGlkZW50aWZpZXIuPC9jbWQ+DQotPGluZm8+IFRoaXMgaXMgb3B0aW9uYWwgaWYgeW91IGVudGVyIGEgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+c3lzdGVtPC91aWNvbnRyb2w+IGZpZWxkLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5zeXN0ZW08L3VpY29udHJvbD4gZmllbGQsIHR5cGUgYSBVUkkgcmVmZXJlbmNlLjwvY21kPg0KLTxpbmZvPiBUaGlzIGlzIG9wdGlvbmFsIGlmIHlvdSBlbnRlciBhIHZhbHVlIGluIHRoZSA8dWljb250cm9sPnB1YmxpYzwvdWljb250cm9sPiBmaWVsZC48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5vdGF0aW9uLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uIDx1aWNvbnRyb2w+QXBwDQotSW5mbzwvdWljb250cm9sPiBwYWdlIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucy48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGQ4MTc1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJkZm4uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkcmRmbiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIDxjb2RlcGg+cmVkZWZpbmU8L2NvZGVwaD4gbWVjaGFuaXNtIHRvIHJlZGVmaW5lDQotc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkIGZyb20gZXh0ZXJuYWwNCi1zY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZyByZWRlZmluZSBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5MaWtlIHRoZSA8Y29kZXBoPmluY2x1ZGU8L2NvZGVwaD4gbWVjaGFuaXNtLCA8Y29kZXBoPnJlZGVmaW5lPC9jb2RlcGg+IHJlcXVpcmVzDQotdGhlIGV4dGVybmFsIGNvbXBvbmVudHMgdG8gYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgcmVkZWZpbmluZw0KLXNjaGVtYSwgYWx0aG91Z2ggZXh0ZXJuYWwgY29tcG9uZW50cyBmcm9tIHNjaGVtYXMgdGhhdCBoYXZlIG5vIG5hbWVzcGFjZSBjYW4NCi1hbHNvIGJlIHJlZGVmaW5lZC48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UNCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvDQotYWRkIGEgcmVkZWZpbmUgZWxlbWVudCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gSW4gdGhlIE91dGxpbmUgdmlldywNCi1zZWxlY3QgeW91ciBzY2hlbWEuPC9jbWQ+PGluZm8+VGhlIGVudGlyZSBzY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkDQotaW4gdGhlIERlc2lnbiB2aWV3LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8Yj5EaXJlY3RpdmVzPC9iPiBzZWN0aW9uDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIFJlZGVmaW5lPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8Yj5HZW5lcmFsPC9iPiB0YWIgYW5kIGNsaWNrDQotdGhlIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IGJ1dHRvbiB0byB0aGUgcmlnaHQgb2YgdGhlIDx1aWNvbnRyb2w+U2NoZW1hDQotbG9jYXRpb248L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PGluZm8+VGhlIFhNTCBzY2hlbWEgZmlsZSB5b3Ugc2VsZWN0IG11c3QNCi1oYXZlIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgY3VycmVudCBzY2hlbWEuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgaW4gdGhlIHdvcmtiZW5jaDo8L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5Xb3JrYmVuY2ggcHJvamVjdHM8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHRoZSBzY2hlbWEgeW91IHdhbnQgdG8gaW1wb3J0IGFuZCBjbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD4NCi08L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIG9uIHRoZSBXZWI6PC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IDx1aWNvbnRyb2w+SFRUUDwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlR5cGUgdGhlIFVSTCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+DQotPGluZm8+PG5vdGU+QSBsb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSB3b3JrYmVuY2guDQotRXZlcnkgdGltZSB5b3UgdmFsaWRhdGUgeW91ciBzY2hlbWEsIHRoZSBzY2hlbWEncyBjb250ZW50cyB3aWxsIGJlIGNoZWNrZWQNCi1mcm9tIHRoZSBVUkwgeW91IHNwZWNpZnkuPC9ub3RlPjwvaW5mbz48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+PD9QdWIgQ2FyZXQ/Pg0KLTxzdGVwPjxjbWQ+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIHdpbGwgcmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbmNsdWRlZA0KLVhNTCBzY2hlbWEgZmlsZSwgYW5kIGRpc3BsYXkgaXQgaW4gdGhlIDx1aWNvbnRyb2w+U2NoZW1hIGxvY2F0aW9uPC91aWNvbnRyb2w+IGZpZWxkLg0KLVRoaXMgZmllbGQgY2FuIGJlIGVkaXRlZCBhdCBhbnkgdGltZSB0byByZWZsZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgWE1MIHNjaGVtYQ0KLWZpbGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlZGVmaW5lIGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgcmVkZWZpbmUgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsIHlvdQ0KLWNhbiByZWRlZmluZSBhbnkgb2YgdGhlIHNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQgYXR0cmlidXRlIGdyb3Vwcw0KLWluIHRoZSBYTUwgc2NoZW1hIHlvdSBzZWxlY3RlZCBpbiB0aGUgcmVkZWZpbmUgZWxlbWVudC4gPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzOTMxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjZjNjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgcmVkZWZpbmUgbWVjaGFuaXNtIHRvIHJlZGVmaW5lIHNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQgYXR0cmlidXRlIGdyb3VwcyBvYnRhaW5lZCBmcm9tIGV4dGVybmFsIHNjaGVtYSBmaWxlcy4gV2hlbiB5b3UgcmVkZWZpbmUgYSBjb21wb25lbnQsIHlvdSBhcmUgbW9kaWZ5aW5nIGl0cyBjb250ZW50cy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIHJlZGVmaW5lIG1lY2hhbmlzbSB0byByZWRlZmluZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQgZnJvbSBleHRlcm5hbCBzY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZyByZWRlZmluZSBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGltcHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbmNsLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9ybm1zcGMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkcmRmbiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyByZWRlZmluZSBlbGVtZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZHJkZm4iPjxhIG5hbWU9InRhZGRyZGZuIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5yZWRlZmluZTwvc2FtcD4gbWVjaGFuaXNtIHRvIHJlZGVmaW5lCi1zaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQgZnJvbSBleHRlcm5hbAotc2NoZW1hIGZpbGVzLiBXaGVuIHlvdSByZWRlZmluZSBhIGNvbXBvbmVudCwgeW91IGFyZSBtb2RpZnlpbmcgaXRzIGNvbnRlbnRzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+TGlrZSB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+aW5jbHVkZTwvc2FtcD4gbWVjaGFuaXNtLCA8c2FtcCBjbGFzcz0iY29kZXBoIj5yZWRlZmluZTwvc2FtcD4gcmVxdWlyZXMKLXRoZSBleHRlcm5hbCBjb21wb25lbnRzIHRvIGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UgYXMgdGhlIHJlZGVmaW5pbmcKLXNjaGVtYSwgYWx0aG91Z2ggZXh0ZXJuYWwgY29tcG9uZW50cyBmcm9tIHNjaGVtYXMgdGhhdCBoYXZlIG5vIG5hbWVzcGFjZSBjYW4KLWFsc28gYmUgcmVkZWZpbmVkLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWFkZCBhIHJlZGVmaW5lIGVsZW1lbnQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBJbiB0aGUgT3V0bGluZSB2aWV3LAotc2VsZWN0IHlvdXIgc2NoZW1hLjwvc3Bhbj4gVGhlIGVudGlyZSBzY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkCi1pbiB0aGUgRGVzaWduIHZpZXcuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8c3Ryb25nPkRpcmVjdGl2ZXM8L3N0cm9uZz4gc2VjdGlvbgotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBSZWRlZmluZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzdHJvbmc+R2VuZXJhbDwvc3Ryb25nPiB0YWIgYW5kIGNsaWNrCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiIGFsdD0iVGhpcyYjMTA7Z3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gYnV0dG9uIHRvIHRoZSByaWdodCBvZiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NoZW1hCi1sb2NhdGlvbjwvc3Bhbj4gZmllbGQuPC9zcGFuPiBUaGUgWE1MIHNjaGVtYSBmaWxlIHlvdSBzZWxlY3QgbXVzdAotaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGN1cnJlbnQgc2NoZW1hLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW1wb3J0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB0aGUgd29ya2JlbmNoOjwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoIHByb2plY3RzPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIG9uIHRoZSBXZWI6PC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRUUDwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSB0aGUgVVJMIG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4KLSA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQSBsb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSB3b3JrYmVuY2guCi1FdmVyeSB0aW1lIHlvdSB2YWxpZGF0ZSB5b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIHdpbGwgYmUgY2hlY2tlZAotZnJvbSB0aGUgVVJMIHlvdSBzcGVjaWZ5LjwvZGl2PgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCByZXRyaWV2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGluY2x1ZGVkCi1YTUwgc2NoZW1hIGZpbGUsIGFuZCBkaXNwbGF5IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY2hlbWEgbG9jYXRpb248L3NwYW4+IGZpZWxkLgotVGhpcyBmaWVsZCBjYW4gYmUgZWRpdGVkIGF0IGFueSB0aW1lIHRvIHJlZmxlY3QgdGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgc2NoZW1hCi1maWxlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVkZWZpbmUgZWxlbWVudC48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgcmVkZWZpbmUgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsIHlvdQotY2FuIHJlZGVmaW5lIGFueSBvZiB0aGUgc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzCi1pbiB0aGUgWE1MIHNjaGVtYSB5b3Ugc2VsZWN0ZWQgaW4gdGhlIHJlZGVmaW5lIGVsZW1lbnQuIDwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW1wdC5odG1sIiB0aXRsZT0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIj5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGluY2wuaHRtbCIgdGl0bGU9IkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLCByZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3JubXNwYy5odG1sIiB0aXRsZT0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJlZy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOWQ3YjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRhZGRyZWciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBwYXR0ZXJuIGZhY2V0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgdmFsdWUgb2YgYSB0eXBlJ3MNCi1sZXhpY2FsIHNwYWNlICh0aGUgc2V0IG9mIHN0cmluZyBsaXRlcmFscyB0aGF0IHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIGEgdHlwZSksDQotd2hpY2ggaW5kaXJlY3RseSBjb25zdHJhaW5zIHRoZSB2YWx1ZSBzcGFjZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+cGF0dGVybiBmYWNldHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPnBhdHRlcm4gZmFjZXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD4gVGhlIHZhbHVlIG9mIHRoZSBwYXR0ZXJuIGlzIGNhbGxlZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gWW91DQotY2FuIHNwZWNpZnkgaXQgdXNpbmcgdGhlIDx1aWNvbnRyb2w+UmVndWxhciBFeHByZXNzaW9uPC91aWNvbnRyb2w+IHdpemFyZC48L3A+PHA+VG8NCi1hZGQgYSBwYXR0ZXJuIHRvIGEgc2ltcGxlIHR5cGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHNlbGVjdCB0aGUgc2ltcGxlIHR5cGUgeW91IHdhbnQgdG8gd29yayB3aXRoLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8dWljb250cm9sPkNvbnN0cmFpbnRzPC91aWNvbnRyb2w+IHRhYiwNCi10aGVuIDx1aWNvbnRyb2w+UGF0dGVybnM8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+VGhlIFJlZ3VsYXIgRXhwcmVzc2lvbg0KLXdpemFyZCBvcGVucy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSB0b2tlbiB5b3Ugd2FudCB0byBhZGQgdG8gdGhlIGV4cHJlc3Npb24uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW5kaWNhdGUgaG93IG9mdGVuIHlvdSB3YW50IHRoZSB0b2tlbiB0byBhcHBlYXIgaW4gb3JkZXIgZm9yIGENCi1tYXRjaCB0byBzdWNjZWVkOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+SWYgeW91IHdhbnQgdGhlIHRva2VuIHRvIHJlcGVhdCwgY2xpY2sgPHVpY29udHJvbD5SZXBlYXQ8L3VpY29udHJvbD4gYW5kDQotc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB0b2tlbiBtdXN0IGFwcGVhci48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPGNob2ljZXM+DQotPGNob2ljZT4gSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIG1pbmltdW0gYW5kIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZQ0KLXRva2VuIGNhbiBhcHBlYXIsIGNsaWNrIDx1aWNvbnRyb2w+UmFuZ2U8L3VpY29udHJvbD4gYW5kIGVudGVyIGEgbWluaW11bSBhbmQNCi1tYXhpbXVtIHZhbHVlLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBhZGQgdGhlIHRva2VuIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGNsaWNrIDx1aWNvbnRyb2w+QWRkPC91aWNvbnRyb2w+LiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBjcmVhdGUgdGhlIGVudGlyZSBleHByZXNzaW9uLCByZXBlYXQgc3RlcHMgNCAtIDYgYXMgbmVjZXNzYXJ5LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPldoZW4geW91IGFyZSBmaW5pc2hlZCwgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlQ8P1B1YiBDYXJldDE/Pm8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIHNlZSBpZg0KLWEgbWF0Y2ggb2NjdXJzLCBlbnRlciBzYW1wbGUgdGV4dC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48c3RlcHJlc3VsdD4gVGhlIHJlZ3VsYXINCi1leHByZXNzaW9uIHdpbGwgYXBwZWFyIGluIHRoZSBQYXR0ZXJucyBwYWdlLiA8bm90ZSB0eXBlPSJ0aXAiPiBUbyBlZGl0IGFuDQotZXhpc3RpbmcgcGF0dGVybiwgc2VsZWN0IGl0IGluIHRoZSBQYXR0ZXJucyBwYWdlIGFuZCBjbGljayA8dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD4uDQotVG8gZGVsZXRlIGFuIGV4aXN0aW5nIHBhdHRlcm4sIHNlbGVjdCBpdCBpbiB0aGUgUGF0dGVybnMgcGFnZSBhbmQgY2xpY2sgPHVpY29udHJvbD5EZWxldGU8L3VpY29udHJvbD4uIDwvbm90ZT48L3N0ZXByZXN1bHQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDI3MDM/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJlZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MmU1ZWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgcGF0dGVybiBmYWNldCBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gdGhlIHZhbHVlIG9mIGEgdHlwZSdzIGxleGljYWwgc3BhY2UgKHRoZSBzZXQgb2Ygc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgYSB0eXBlKSwgd2hpY2ggaW5kaXJlY3RseSBjb25zdHJhaW5zIHRoZSB2YWx1ZSBzcGFjZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBwYXR0ZXJuIGZhY2V0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgdmFsdWUgb2YgYSB0eXBlJ3MgbGV4aWNhbCBzcGFjZSAodGhlIHNldCBvZiBzdHJpbmcgbGl0ZXJhbHMgdGhhdCByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiBhIHR5cGUpLCB3aGljaCBpbmRpcmVjdGx5IGNvbnN0cmFpbnMgdGhlIHZhbHVlIHNwYWNlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBwYXR0ZXJuIGZhY2V0cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBwYXR0ZXJuIGZhY2V0cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkc21wdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRyZWciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkcmVnIj48YSBuYW1lPSJ0YWRkcmVnIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIHBhdHRlcm4gZmFjZXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSB2YWx1ZSBvZiBhIHR5cGUncwotbGV4aWNhbCBzcGFjZSAodGhlIHNldCBvZiBzdHJpbmcgbGl0ZXJhbHMgdGhhdCByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiBhIHR5cGUpLAotd2hpY2ggaW5kaXJlY3RseSBjb25zdHJhaW5zIHRoZSB2YWx1ZSBzcGFjZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiBUaGUgdmFsdWUgb2YgdGhlIHBhdHRlcm4gaXMgY2FsbGVkIGEgcmVndWxhciBleHByZXNzaW9uLiBZb3UKLWNhbiBzcGVjaWZ5IGl0IHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWd1bGFyIEV4cHJlc3Npb248L3NwYW4+IHdpemFyZC48L3A+Ci08cD5UbwotYWRkIGEgcGF0dGVybiB0byBhIHNpbXBsZSB0eXBlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHRoZSBzaW1wbGUgdHlwZSB5b3Ugd2FudCB0byB3b3JrIHdpdGguPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29uc3RyYWludHM8L3NwYW4+IHRhYiwKLXRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybnM8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4uPC9zcGFuPiBUaGUgUmVndWxhciBFeHByZXNzaW9uCi13aXphcmQgb3BlbnMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHRva2VuIHlvdSB3YW50IHRvIGFkZCB0byB0aGUgZXhwcmVzc2lvbi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbmRpY2F0ZSBob3cgb2Z0ZW4geW91IHdhbnQgdGhlIHRva2VuIHRvIGFwcGVhciBpbiBvcmRlciBmb3IgYQotbWF0Y2ggdG8gc3VjY2VlZDo8L3NwYW4+Ci08dWw+Ci08bGk+SWYgeW91IHdhbnQgdGhlIHRva2VuIHRvIHJlcGVhdCwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVwZWF0PC9zcGFuPiBhbmQKLXNwZWNpZnkgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdG9rZW4gbXVzdCBhcHBlYXIuPC9saT4KLQotPC91bD4KLQotPHVsPgotPGxpPiBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgbWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlCi10b2tlbiBjYW4gYXBwZWFyLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SYW5nZTwvc3Bhbj4gYW5kIGVudGVyIGEgbWluaW11bSBhbmQKLW1heGltdW0gdmFsdWUuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBhZGQgdGhlIHRva2VuIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gY3JlYXRlIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiwgcmVwZWF0IHN0ZXBzIDQgLSA2IGFzIG5lY2Vzc2FyeS48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPldoZW4geW91IGFyZSBmaW5pc2hlZCwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgc2VlIGlmCi1hIG1hdGNoIG9jY3VycywgZW50ZXIgc2FtcGxlIHRleHQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+ICBUaGUgcmVndWxhcgotZXhwcmVzc2lvbiB3aWxsIGFwcGVhciBpbiB0aGUgUGF0dGVybnMgcGFnZS4gPGRpdiBjbGFzcz0idGlwIj48c3BhbiBjbGFzcz0idGlwdGl0bGUiPlRpcDo8L3NwYW4+ICBUbyBlZGl0IGFuCi1leGlzdGluZyBwYXR0ZXJuLCBzZWxlY3QgaXQgaW4gdGhlIFBhdHRlcm5zIHBhZ2UgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+LgotVG8gZGVsZXRlIGFuIGV4aXN0aW5nIHBhdHRlcm4sIHNlbGVjdCBpdCBpbiB0aGUgUGF0dGVybnMgcGFnZSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVsZXRlPC9zcGFuPi4gPC9kaXY+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRzbXB0Lmh0bWwiIHRpdGxlPSJTaW1wbGUgdHlwZXMgYXJlIHVzZWQgdG8gY3JlYXRlIGRlcml2ZWQgZGF0YXR5cGVzLiBUaGV5IHByb3ZpZGUgYSBzZXQgb2YgY29uc3RyYWludHMgb24gdGhlIHZhbHVlIHNwYWNlIChhIHNldCBvZiB2YWx1ZXMpIGFuZCB0aGUgbGV4aWNhbCBzcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuIj5BZGRpbmcgc2ltcGxlIHR5cGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3YzFiOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRzbXB0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRzbXB0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgc2ltcGxlIHR5cGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgc2ltcGxlIHR5cGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlNpbXBsZSB0eXBlcyBhcmUgdXNlZCB0byBjcmVhdGUgZGVyaXZlZCBkYXRhdHlwZXMuIFRoZXkgcHJvdmlkZQ0KLWEgc2V0IG9mIGNvbnN0cmFpbnRzIG9uIHRoZSB2YWx1ZSBzcGFjZSAoYSBzZXQgb2YgdmFsdWVzKSBhbmQgdGhlIGxleGljYWwNCi1zcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPnNpbXBsZSB0eXBlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+c2ltcGxlIHR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5BIHNpbXBsZSB0eXBlIGNhbm5vdCBoYXZlIGVsZW1lbnQgY29udGVudCBhbmQgY2Fubm90IGNhcnJ5IGF0dHJpYnV0ZXMuDQotRWxlbWVudHMgdGhhdCBjb250YWluIG51bWJlcnMgKGFuZCBzdHJpbmdzLCBhbmQgZGF0ZXMsIGFuZCBzbyBvbikgYnV0IGRvIG5vdA0KLWNvbnRhaW4gYW55IHN1Yi1lbGVtZW50cyBoYXZlIGEgc2ltcGxlIHR5cGUuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zDQotd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkNCi1vdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIHNpbXBsZSB0eXBlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIDxiPlR5cGVzPC9iPiwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotU2ltcGxlIFR5cGU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHRoZSBuZXcgc2ltcGxlIHR5cGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPiB0YWIuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgc2ltcGxlIHR5cGUgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIHNlbGVjdCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgZnJvbSB0aGUgPHVpY29udHJvbD5WYXJpZXR5PC91aWNvbnRyb2w+IGxpc3Q6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPmF0b21pYzwvdWljb250cm9sPjogYXRvbWljIHR5cGVzIGFyZTw/UHViIENhcmV0Pz4gYWxsIHRoZQ0KLXNpbXBsZSB0eXBlcyBidWlsdCBpbnRvIHRoZSBYTUwgc2NoZW1hIGxhbmd1YWdlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5saXN0PC91aWNvbnRyb2w+OiBsaXN0IHR5cGVzIGFyZSBjb21wcmlzZWQgb2Ygc2VxdWVuY2VzDQotb2YgYXRvbWljIHR5cGVzLiBUaGV5IGhhdmUgdmFsdWVzIHRoYXQgYXJlIGNvbXByaXNlZCBvZiBmaW5pdGUtbGVuZ3RoIHNlcXVlbmNlcw0KLW9mIGF0b21pYyB2YWx1ZXMuIDwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD51bmlvbjwvdWljb250cm9sPjogdW5pb24gdHlwZXMgZW5hYmxlIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlDQotdmFsdWUgdG8gYmUgb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mIG9uZSB0eXBlIGRyYXduIGZyb20gdGhlIHVuaW9uIG9mIG11bHRpcGxlDQotYXRvbWljIGFuZCBsaXN0IHR5cGVzLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugc2VsZWN0ZWQgPHVpY29udHJvbD5hdG9taWM8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5saXN0PC91aWNvbnRyb2w+IGZyb20NCi10aGUgPHVpY29udHJvbD5WYXJpZXR5PC91aWNvbnRyb2w+IGRyb3AtZG93biwgY2xpY2sgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gPGltYWdlDQotaHJlZj0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uPC9hbHQ+PC9pbWFnZT4gbmV4dA0KLXRvIHRoZSA8dWljb250cm9sPkJhc2UgdHlwZTwvdWljb250cm9sPiBvciA8dWljb250cm9sPkl0ZW0gdHlwZTwvdWljb250cm9sPiBmaWVsZA0KLXRvIHNwZWNpZnkgYSBiYXNlIHR5cGUgZm9yIHRoZSBzaW1wbGUgdHlwZS48L2NtZD48aW5mbz5UaGUgU2V0IFR5cGUgZGlhbG9nDQotYm94IGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4NCi1jaGFuZ2UgdGhlIDx1aWNvbnRyb2w+U2NvcGU8L3VpY29udHJvbD4gb2YgdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUNCi1mb2xsb3dpbmcgb3B0aW9uczo8dWw+DQotPGxpPjx1aWNvbnRyb2w+V29ya3NwYWNlPC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbg0KLXlvdXIgd29ya3NwYWNlLiA8L2xpPg0KLTxsaT48dWljb250cm9sPkVuY2xvc2luZyBQcm9qZWN0PC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQ0KLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPg0KLTxsaT4oRGVmYXVsdCkgPHVpY29udHJvbD5DdXJyZW50IFJlc291cmNlPC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzDQotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+V29ya2luZyBTZXRzPC91aWNvbnRyb2w+OiBsaXN0cyBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4NCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugc2VsZWN0ZWQgPHVpY29udHJvbD51bmlvbjwvdWljb250cm9sPiBmcm9tIHRoZSA8dWljb250cm9sPlZhcmlldHk8L3VpY29udHJvbD4gZHJvcC1kb3duLA0KLWNsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IG5leHQgdG8gdGhlIDx1aWNvbnRyb2w+TWVtYmVyIHR5cGVzPC91aWNvbnRyb2w+IGZpZWxkDQotdG8gc3BlY2lmeSB0aGUgbWVtYmVyIHR5cGVzIGZvciB0aGUgc2ltcGxlIHR5cGUuPC9jbWQ+PGluZm8+WW91IGNhbiBzZWxlY3QNCi10byBhZGQgYm90aCA8dWljb250cm9sPkJ1aWx0LWluIHNpbXBsZSB0eXBlczwvdWljb250cm9sPiBhbmQgPHVpY29udHJvbD5Vc2VyLWRlZmluZWQNCi1zaW1wbGUgdHlwZXM8L3VpY29udHJvbD4gdG8gdGhlIG1lbWJlciB0eXBlcyB2YWx1ZSBsaXN0LiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+Q29uc3RyYWludHM8L3VpY29udHJvbD4gdGFiLjwvY21kPjxpbmZvPkZyb20NCi1oZXJlIHlvdSB3aWxsIGJlIGFibGUgdG8gc2V0IHNwZWNpZmljIGNvbnN0cmFpbnQgdmFsdWVzIGluY2x1ZGluZyBsZW5ndGggY29uc3RyYWludHMsDQotZW51bWVyYXRpb25zLCBhbmQgcGF0dGVybnMuIDwvaW5mbz4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5FbnVtZXJhdGlvbnMgaGVscCB5b3UgdG8gZGVmaW5lIGEgc2V0IG9mIHZhbGlkIHZhbHVlcyBmb3Igc2ltcGxlDQotdHlwZXMuIFRoZXkgYXJlIHRoZSBhY3R1YWwgdmFsdWVzIHRoZSBzaW1wbGUgdHlwZSBjYW4gdGFrZSBhcyB2YWxpZCB2YWx1ZXMNCi1pbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQuIFlvdSBjYW4gZWl0aGVyIGFkZCBvbmUgZW51bWVyYXRpb24gb3Igc2V2ZXJhbCBlbnVtZXJhdGlvbnMNCi1hdCBhIHRpbWU6PC9jbWQ+PGluZm8+PHVsPg0KLTxsaT5UbyBhZGQgb25lIGVudW1lcmF0aW9uIGF0IGEgdGltZSwgdW5kZXIgPHVpY29udHJvbD5TcGVjaWZpYyBjb25zdHJhaW50DQotdmFsdWVzPC91aWNvbnRyb2w+LCBzZWxlY3QgPHVpY29udHJvbD5FbnVtZXJhdGlvbnM8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkPC91aWNvbnRyb2w+IGFuZA0KLXNwZWNpZnkgYSB2YWx1ZSBmb3IgdGhlIGVudW1lcmF0aW9uLjwvbGk+DQotPGxpPlRvIGFkZCBzZXZlcmFsIGVudW1lcmF0aW9ucyBhdCBvbmUgdGltZTo8b2w+DQotPGxpPlNlbGVjdCA8dWljb250cm9sPkVudW1lcmF0aW9uczwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4uPC9saT4NCi08bGk+RW50ZXIgdGhlIHZhbHVlIG9mIGVhY2ggZW51bWVyYXRpb24uIEVhY2ggdmFsdWUgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgdGhlIDx1aWNvbnRyb2w+RGVsaW1pdGVyDQotY2hhcmFjdGVyPC91aWNvbnRyb2w+LiBGb3IgZXhhbXBsZTogPGNvZGVwaD5GaXJzdCwgU2Vjb25kPC9jb2RlcGg+IHdpbGwgY3JlYXRlDQotdHdvIGVudW1lcmF0aW9ucywgb25lIHdpdGggdGhlIHZhbHVlICJGaXJzdCIgYW5kIG9uZSB3aXRoIHRoZSB2YWx1ZSAiU2Vjb25kIi48L2xpPg0KLTxsaT5TZWxlY3QgdGhlIDx1aWNvbnRyb2w+UHJlc2VydmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZTwvdWljb250cm9sPiBjaGVjaw0KLWJveCBpZiB5b3Ugd2FudCBhbnkgd2hpdGUgc3BhY2UgYXJvdW5kIHlvdXIgZW51bWVyYXRpb24gdmFsdWVzIHRvIGJlIHByZXNlcnZlZC4NCi1JZiB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCB0aGUgdmFsdWVzIG9mIDxjb2RlcGg+Rmlyc3QsIFNlY29uZDwvY29kZXBoPiB3aWxsDQotc2hvdyB1cCBhcyAiRmlyc3QiIGFuZCAiIFNlY29uZCIgKHRoZXJlIGlzIGEgc3BhY2UgYmVmb3JlIFNlY29uZCkgYmVjYXVzZQ0KLXlvdSBwdXQgYSBzcGFjZSBiZWZvcmUgIlNlY29uZCIgd2hlbiBlbnRlcmluZyB0aGUgdmFsdWUuPC9saT4NCi08bGk+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi4gWW91ciBlbnVtZXJhdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGFuZA0KLWFwcGVhciBpbiB0aGUgUHJvcGVydGllcyB2aWV3LjwvbGk+DQotPC9vbD48L2xpPg0KLTwvdWw+PC9pbmZvPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlBhdHRlcm5zIGhlbHAgeW91IHRvIHBsYWNlIGNlcnRhaW4gY29uc3RyYWludHMgcmVnYXJkaW5nIGFsbG93YWJsZQ0KLXZhbHVlcy48L2NtZD48aW5mbz5Gb3IgZXhhbXBsZSwgeW91IGNvdWxkIHJlc3RyaWN0IHRoZSBmaWVsZCB0byBvbmx5IGFjY2VwdA0KLWlucHV0IHdoaWNoIGZvbGxvd3MgdGhlIHBhdHRlcm4gImZpdmUgZGlnaXRzIGZvbGxvd2VkIGJ5IHR3byB1cHBlci1jYXNlIEFTQ0lJDQotbGV0dGVycyIuIFRvIHNldCBhIHBhdHRlcm4gY29uc3RyYWludDo8b2w+DQotPGxpPlNlbGVjdCA8dWljb250cm9sPlBhdHRlcm5zPC91aWNvbnRyb2w+IGFuZCBjbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPi48L2xpPg0KLTxsaT5DcmVhdGUgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHlvdSB3aXNoIHRvIHVzZSBhcyB5b3VyIGNvbnN0cmFpbnQNCi11c2luZyB0aGUgPHVpY29udHJvbD5SZWd1bGFyIEV4cHJlc3Npb248L3VpY29udHJvbD4gd2l6YXJkLjwvbGk+DQotPGxpPkNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvbGk+DQotPC9vbD48L2luZm8+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNpbXBsZSB0eXBlLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNjY0OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDQ5ZWIwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgc2ltcGxlIHR5cGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlNpbXBsZSB0eXBlcyBhcmUgdXNlZCB0byBjcmVhdGUgZGVyaXZlZCBkYXRhdHlwZXMuIFRoZXkgcHJvdmlkZSBhIHNldCBvZiBjb25zdHJhaW50cyBvbiB0aGUgdmFsdWUgc3BhY2UgKGEgc2V0IG9mIHZhbHVlcykgYW5kIHRoZSBsZXhpY2FsIHNwYWNlIChhIHNldCBvZiB2YWxpZCBsaXRlcmFscykgb2YgYSBkYXRhdHlwZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iU2ltcGxlIHR5cGVzIGFyZSB1c2VkIHRvIGNyZWF0ZSBkZXJpdmVkIGRhdGF0eXBlcy4gVGhleSBwcm92aWRlIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9uIHRoZSB2YWx1ZSBzcGFjZSAoYSBzZXQgb2YgdmFsdWVzKSBhbmQgdGhlIGxleGljYWwgc3BhY2UgKGEgc2V0IG9mIHZhbGlkIGxpdGVyYWxzKSBvZiBhIGRhdGF0eXBlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBzaW1wbGUgdHlwZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgc2ltcGxlIHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRyZWcuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkc21wdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBzaW1wbGUgdHlwZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRzbXB0Ij48YSBuYW1lPSJ0YWRkc21wdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIHNpbXBsZSB0eXBlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+U2ltcGxlIHR5cGVzIGFyZSB1c2VkIHRvIGNyZWF0ZSBkZXJpdmVkIGRhdGF0eXBlcy4gVGhleSBwcm92aWRlCi1hIHNldCBvZiBjb25zdHJhaW50cyBvbiB0aGUgdmFsdWUgc3BhY2UgKGEgc2V0IG9mIHZhbHVlcykgYW5kIHRoZSBsZXhpY2FsCi1zcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BIHNpbXBsZSB0eXBlIGNhbm5vdCBoYXZlIGVsZW1lbnQgY29udGVudCBhbmQgY2Fubm90IGNhcnJ5IGF0dHJpYnV0ZXMuCi1FbGVtZW50cyB0aGF0IGNvbnRhaW4gbnVtYmVycyAoYW5kIHN0cmluZ3MsIGFuZCBkYXRlcywgYW5kIHNvIG9uKSBidXQgZG8gbm90Ci1jb250YWluIGFueSBzdWItZWxlbWVudHMgaGF2ZSBhIHNpbXBsZSB0eXBlLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zCi13ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueQotb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIHNpbXBsZSB0eXBlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayA8c3Ryb25nPlR5cGVzPC9zdHJvbmc+LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1TaW1wbGUgVHlwZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHRoZSBuZXcgc2ltcGxlIHR5cGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+IHRhYi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBuZXcgbmFtZSBmb3IgdGhlIHNpbXBsZSB0eXBlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gc2VsZWN0IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpZXR5PC9zcGFuPiBsaXN0Ojwvc3Bhbj4KLTx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5hdG9taWM8L3NwYW4+OiBhdG9taWMgdHlwZXMgYXJlIGFsbCB0aGUKLXNpbXBsZSB0eXBlcyBidWlsdCBpbnRvIHRoZSBYTUwgc2NoZW1hIGxhbmd1YWdlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5saXN0PC9zcGFuPjogbGlzdCB0eXBlcyBhcmUgY29tcHJpc2VkIG9mIHNlcXVlbmNlcwotb2YgYXRvbWljIHR5cGVzLiBUaGV5IGhhdmUgdmFsdWVzIHRoYXQgYXJlIGNvbXByaXNlZCBvZiBmaW5pdGUtbGVuZ3RoIHNlcXVlbmNlcwotb2YgYXRvbWljIHZhbHVlcy4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuaW9uPC9zcGFuPjogdW5pb24gdHlwZXMgZW5hYmxlIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlCi12YWx1ZSB0byBiZSBvbmUgb3IgbW9yZSBpbnN0YW5jZXMgb2Ygb25lIHR5cGUgZHJhd24gZnJvbSB0aGUgdW5pb24gb2YgbXVsdGlwbGUKLWF0b21pYyBhbmQgbGlzdCB0eXBlcy48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5hdG9taWM8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmxpc3Q8L3NwYW4+IGZyb20KLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpZXR5PC9zcGFuPiBkcm9wLWRvd24sIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gbmV4dAotdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJhc2UgdHlwZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SXRlbSB0eXBlPC9zcGFuPiBmaWVsZAotdG8gc3BlY2lmeSBhIGJhc2UgdHlwZSBmb3IgdGhlIHNpbXBsZSB0eXBlLjwvc3Bhbj4gVGhlIFNldCBUeXBlIGRpYWxvZwotYm94IGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4KLWNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NvcGU8L3NwYW4+IG9mIHRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlCi1mb2xsb3dpbmcgb3B0aW9uczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPjogbGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4KLXlvdXIgd29ya3NwYWNlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW5jbG9zaW5nIFByb2plY3Q8L3NwYW4+OiBsaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+Ci0KLTxsaT4oRGVmYXVsdCkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj46IGxpc3RzIGFsbCBvZiB0aGUgdHlwZXMKLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPjogbGlzdHMgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUgd2l0aGluCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHNlbGVjdGVkIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuaW9uPC9zcGFuPiBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpZXR5PC9zcGFuPiBkcm9wLWRvd24sCi1jbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IDxpbWcgc3JjPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiIgYWx0PSJUaGlzJiMxMDtncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uIiAvPiBuZXh0IHRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NZW1iZXIgdHlwZXM8L3NwYW4+IGZpZWxkCi10byBzcGVjaWZ5IHRoZSBtZW1iZXIgdHlwZXMgZm9yIHRoZSBzaW1wbGUgdHlwZS48L3NwYW4+IFlvdSBjYW4gc2VsZWN0Ci10byBhZGQgYm90aCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5CdWlsdC1pbiBzaW1wbGUgdHlwZXM8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2VyLWRlZmluZWQKLXNpbXBsZSB0eXBlczwvc3Bhbj4gdG8gdGhlIG1lbWJlciB0eXBlcyB2YWx1ZSBsaXN0LiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25zdHJhaW50czwvc3Bhbj4gdGFiLjwvc3Bhbj4gRnJvbQotaGVyZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNldCBzcGVjaWZpYyBjb25zdHJhaW50IHZhbHVlcyBpbmNsdWRpbmcgbGVuZ3RoIGNvbnN0cmFpbnRzLAotZW51bWVyYXRpb25zLCBhbmQgcGF0dGVybnMuIAotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5FbnVtZXJhdGlvbnMgaGVscCB5b3UgdG8gZGVmaW5lIGEgc2V0IG9mIHZhbGlkIHZhbHVlcyBmb3Igc2ltcGxlCi10eXBlcy4gVGhleSBhcmUgdGhlIGFjdHVhbCB2YWx1ZXMgdGhlIHNpbXBsZSB0eXBlIGNhbiB0YWtlIGFzIHZhbGlkIHZhbHVlcwotaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LiBZb3UgY2FuIGVpdGhlciBhZGQgb25lIGVudW1lcmF0aW9uIG9yIHNldmVyYWwgZW51bWVyYXRpb25zCi1hdCBhIHRpbWU6PC9zcGFuPiA8dWw+Ci08bGk+VG8gYWRkIG9uZSBlbnVtZXJhdGlvbiBhdCBhIHRpbWUsIHVuZGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWNpZmljIGNvbnN0cmFpbnQKLXZhbHVlczwvc3Bhbj4sIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbnVtZXJhdGlvbnM8L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+IGFuZAotc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgZW51bWVyYXRpb24uPC9saT4KLQotPGxpPlRvIGFkZCBzZXZlcmFsIGVudW1lcmF0aW9ucyBhdCBvbmUgdGltZTo8b2wgdHlwZT0iaSI+Ci08bGk+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVudW1lcmF0aW9uczwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4uPC9saT4KLQotPGxpPkVudGVyIHRoZSB2YWx1ZSBvZiBlYWNoIGVudW1lcmF0aW9uLiBFYWNoIHZhbHVlIG11c3QgYmUgc2VwYXJhdGVkIGJ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWxpbWl0ZXIKLWNoYXJhY3Rlcjwvc3Bhbj4uIEZvciBleGFtcGxlOiA8c2FtcCBjbGFzcz0iY29kZXBoIj5GaXJzdCwgU2Vjb25kPC9zYW1wPiB3aWxsIGNyZWF0ZQotdHdvIGVudW1lcmF0aW9ucywgb25lIHdpdGggdGhlIHZhbHVlICJGaXJzdCIgYW5kIG9uZSB3aXRoIHRoZSB2YWx1ZSAiU2Vjb25kIi48L2xpPgotCi08bGk+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVzZXJ2ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlPC9zcGFuPiBjaGVjawotYm94IGlmIHlvdSB3YW50IGFueSB3aGl0ZSBzcGFjZSBhcm91bmQgeW91ciBlbnVtZXJhdGlvbiB2YWx1ZXMgdG8gYmUgcHJlc2VydmVkLgotSWYgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgdGhlIHZhbHVlcyBvZiA8c2FtcCBjbGFzcz0iY29kZXBoIj5GaXJzdCwgU2Vjb25kPC9zYW1wPiB3aWxsCi1zaG93IHVwIGFzICJGaXJzdCIgYW5kICIgU2Vjb25kIiAodGhlcmUgaXMgYSBzcGFjZSBiZWZvcmUgU2Vjb25kKSBiZWNhdXNlCi15b3UgcHV0IGEgc3BhY2UgYmVmb3JlICJTZWNvbmQiIHdoZW4gZW50ZXJpbmcgdGhlIHZhbHVlLjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uIFlvdXIgZW51bWVyYXRpb25zIHdpbGwgYmUgY3JlYXRlZCBhbmQKLWFwcGVhciBpbiB0aGUgUHJvcGVydGllcyB2aWV3LjwvbGk+Ci0KLTwvb2w+Ci08L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5QYXR0ZXJucyBoZWxwIHlvdSB0byBwbGFjZSBjZXJ0YWluIGNvbnN0cmFpbnRzIHJlZ2FyZGluZyBhbGxvd2FibGUKLXZhbHVlcy48L3NwYW4+IEZvciBleGFtcGxlLCB5b3UgY291bGQgcmVzdHJpY3QgdGhlIGZpZWxkIHRvIG9ubHkgYWNjZXB0Ci1pbnB1dCB3aGljaCBmb2xsb3dzIHRoZSBwYXR0ZXJuICJmaXZlIGRpZ2l0cyBmb2xsb3dlZCBieSB0d28gdXBwZXItY2FzZSBBU0NJSQotbGV0dGVycyIuIFRvIHNldCBhIHBhdHRlcm4gY29uc3RyYWludDo8b2wgdHlwZT0iaSI+Ci08bGk+U2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm5zPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPi48L2xpPgotCi08bGk+Q3JlYXRlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB5b3Ugd2lzaCB0byB1c2UgYXMgeW91ciBjb25zdHJhaW50Ci11c2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVndWxhciBFeHByZXNzaW9uPC9zcGFuPiB3aXphcmQuPC9saT4KLQotPGxpPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9saT4KLQotPC9vbD4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzaW1wbGUgdHlwZS48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZHJlZy5odG1sIiB0aXRsZT0iQSBwYXR0ZXJuIGZhY2V0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgdmFsdWUgb2YgYSB0eXBlJ3MgbGV4aWNhbCBzcGFjZSAodGhlIHNldCBvZiBzdHJpbmcgbGl0ZXJhbHMgdGhhdCByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiBhIHR5cGUpLCB3aGljaCBpbmRpcmVjdGx5IGNvbnN0cmFpbnMgdGhlIHZhbHVlIHNwYWNlLiI+QWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWJkMTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3htbHNjaC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0Y3htbHNjaCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gY3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIHRoZW4gZWRpdCBpdCB1c2luZyB0aGUgWE1MIHNjaGVtYQ0KLWVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcw0KLXdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UbyBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczw/UHViIENhcmV0Pz46PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgWE1MIHNjaGVtYS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgd29ya2JlbmNoLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlID4gTmV3ID4gT3RoZXI8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTCA+IFhNTCBTY2hlbWE8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi4gQ2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFhNTCBzY2hlbWEuDQotSW4gdGhlIDwvY21kPjxpbmZvPjx1aWNvbnRyb2w+RmlsZSBuYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mDQotdGhlIFhNTCBzY2hlbWEsIGZvciBleGFtcGxlIDx1c2VyaW5wdXQ+TXlYTUxTY2hlbWEueHNkPC91c2VyaW5wdXQ+LiBUaGUgbmFtZQ0KLW9mIHlvdXIgWE1MIHNjaGVtYSBtdXN0IGVuZCBpbiA8c3lzdGVtb3V0cHV0Pi54c2Q8L3N5c3RlbW91dHB1dD4uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PlRoZSBYTUwgc2NoZW1hIG9wZW5zIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gPC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDE1NTg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1YmNkMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBYTUwgc2NoZW1hcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90dmR0c2NobS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRjeG1sc2NoIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjeG1sc2NoIj48YSBuYW1lPSJ0Y3htbHNjaCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gY3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIHRoZW4gZWRpdCBpdCB1c2luZyB0aGUgWE1MIHNjaGVtYQotZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzCi13aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgWE1MIHNjaGVtYS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgd29ya2JlbmNoLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlcjwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCAmZ3Q7IFhNTCBTY2hlbWE8L3NwYW4+Ci08L3NwYW4+LiBDbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBYTUwgc2NoZW1hLgotSW4gdGhlIDwvc3Bhbj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSBuYW1lPC9zcGFuPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZgotdGhlIFhNTCBzY2hlbWEsIGZvciBleGFtcGxlIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+TXlYTUxTY2hlbWEueHNkPC9rYmQ+LiBUaGUgbmFtZQotb2YgeW91ciBYTUwgc2NoZW1hIG11c3QgZW5kIGluIDx0dCBjbGFzcz0ic3lzb3V0Ij4ueHNkPC90dD4uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlIFhNTCBzY2hlbWEgb3BlbnMgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiA8L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbHNjZWQuaHRtbCIgdGl0bGU9IlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhbiBYTUwgc2NoZW1hIGVkaXRvciBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLiBYTUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiI+WE1MIHNjaGVtYSBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIHRpdGxlPSJBZnRlciB5b3UgY3JlYXRlIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gZWRpdCBpdHMgdmFyaW91cyBwcm9wZXJ0aWVzLCBzdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC4iPkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHZkdHNjaG0uaHRtbCIgdGl0bGU9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIj5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzMjg4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRkZWxzY21wIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiB5b3UgaGF2ZSBjcmVhdGVkIGFueSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgeW91IG5vIGxvbmdlciBuZWVkLA0KLXlvdSBjYW4gZGVsZXRlIHRoZW0uPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmRlbGV0aW5nIGNvbXBvbmVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmRlbGV0aW5nIGNvbXBvbmVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBkZWxldGUgYW4gWE1MDQotc2NoZW1hIGNvbXBvbmVudCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCBjbGljayB0aGUgaXRlbSB0byBkZWxldGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmlnaHQtY2xpY2sgdGhlIGl0ZW0sIGFuZCwgZnJvbSBpdHMgcG9wLXVwIG1lbnUsIGNsaWNrIDx1aWNvbnRyb2w+RGVsZXRlPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwNCi1pbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBjb21wb25lbnRzLCBjbGVhbnVwIHdpbGwgYXV0b21hdGljYWxseQ0KLW9jY3VyLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz48P1B1YiBDYXJldD8+DQotPD9QdWIgKjAwMDAwMDEzODQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5ODFmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IGhhdmUgY3JlYXRlZCBhbnkgWE1MIHNjaGVtYSBjb21wb25lbnRzIHlvdSBubyBsb25nZXIgbmVlZCwgeW91IGNhbiBkZWxldGUgdGhlbS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgeW91IGhhdmUgY3JlYXRlZCBhbnkgWE1MIHNjaGVtYSBjb21wb25lbnRzIHlvdSBubyBsb25nZXIgbmVlZCwgeW91IGNhbiBkZWxldGUgdGhlbS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZGVsZXRpbmcgY29tcG9uZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBkZWxldGluZyBjb21wb25lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3JyZWZpbnRnLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGRlbHNjbXAiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRkZWxzY21wIj48YSBuYW1lPSJ0ZGVsc2NtcCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiB5b3UgaGF2ZSBjcmVhdGVkIGFueSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgeW91IG5vIGxvbmdlciBuZWVkLAoteW91IGNhbiBkZWxldGUgdGhlbS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gZGVsZXRlIGFuIFhNTAotc2NoZW1hIGNvbXBvbmVudCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIGNsaWNrIHRoZSBpdGVtIHRvIGRlbGV0ZS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlJpZ2h0LWNsaWNrIHRoZSBpdGVtLCBhbmQsIGZyb20gaXRzIHBvcC11cCBtZW51LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWxldGU8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsCi1pbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBjb21wb25lbnRzLCBjbGVhbnVwIHdpbGwgYXV0b21hdGljYWxseQotb2NjdXIuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnJlZmludGcuaHRtbCIgdGl0bGU9IlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsIGludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIG5vZGVzLCBjbGVhbiB1cCBmb3IgYW55IG5vZGVzIGFmZmVjdGVkIHdpbGwgYXV0b21hdGljYWxseSBvY2N1ci4iPlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzg0MTM0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByZWYuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGVkdHByZWYiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciBYTUwgc2NoZW1hIGZpbGVzIHN1Y2ggYXMgdGhlDQotZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGFuZCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4IHVzZWQuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+ZWRpdGluZyBwcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+cHJlZmVyZW5jZXM8aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIGRlZmluZSBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdyA+IFByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLVNjaGVtYSBGaWxlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5RdWFsaWZ5IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0czwvdWljb250cm9sPiBjaGVjaw0KLWJveCBpZiB5b3Ugd2FudCBhIHByZWZpeCBhcHBsaWVkIHRvIGFsbCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgaW4NCi15b3VyIFhNTCBzY2hlbWEuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+WE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeDwvdWljb250cm9sPiBmaWVsZCwNCi10eXBlIHRoZSBwcmVmaXggeW91IHdhbnQgYXBwbGllZCB0byBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgaW4geW91cg0KLVhNTCBzY2hlbWEuPC9jbWQ+PGluZm8+VGhlIHByZWZpeCA8dWljb250cm9sPnhzZDwvdWljb250cm9sPiBpcyB1c2VkIGJ5IGNvbnZlbnRpb24NCi10byBkZW5vdGUgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlLCBidXQgYW55IHByZWZpeCBjYW4gYmUgdXNlZC4gVGhlIHB1cnBvc2UNCi1vZiB0aGUgYXNzb2NpYXRpb24gaXMgdG8gaWRlbnRpZnkgdGhlIGVsZW1lbnRzIGFuZCBzaW1wbGUgdHlwZXMgYXMgYmVsb25naW5nDQotdG8gdGhlIHZvY2FidWxhcnkgb2YgdGhlIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgcmF0aGVyIHRoYW4gdGhlIHZvY2FidWxhcnkgb2YNCi10aGUgc2NoZW1hIGF1dGhvci4gIDxub3RlPlRoaXMgcHJlZml4IHdpbGwgbm90IGFwcGVhciBpbiBhbnkgc2NoZW1hcyB0aGF0DQotY3VycmVudGx5IGV4aXN0IC0gaXQgd2lsbCBvbmx5IGFwcGVhciBpbiBuZXcgc2NoZW1hcyB5b3UgY3JlYXRlIGFmdGVyIHlvdQ0KLXR5cGUgdGhlIHByZWZpeCBhbmQgY2xpY2sgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPi4gQW55IHNjaGVtYXMgdGhhdCBhbHJlYWR5DQotZXhpc3Qgd2lsbCBoYXZlIHRoZSBwcmVmaXggc3BlY2lmaWVkIGluIHRoZSBzY2hlbWEgYXBwbGllZCB0byB0aGUgWE1MIHNjaGVtYQ0KLWxhbmd1YWdlIGNvbnN0cnVjdHMuPC9ub3RlPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIGNoYW5nZSB0aGUgPHVpY29udHJvbD5EZWZhdWx0IFRhcmdldCBOYW1lc3BhY2U8L3VpY29udHJvbD4gdmFsdWUuPC9jbWQ+DQotPGluZm8+VGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkIHdpbGwgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZQ0KLWZvciBhbnkgbmV3IFhNTCBzY2hlbWEgZmlsZXMgY3JlYXRlZC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMzgxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjhmYmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgWE1MIHNjaGVtYSBmaWxlcyBzdWNoIGFzIHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgYW5kIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXggdXNlZC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgWE1MIHNjaGVtYSBmaWxlcyBzdWNoIGFzIHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgYW5kIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXggdXNlZC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBlZGl0aW5nIHByZWZlcmVuY2VzLCBwcmVmZXJlbmNlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGVkaXRpbmcgcHJlZmVyZW5jZXMsIHByZWZlcmVuY2VzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0cHJlZiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0cHJlZiI+PGEgbmFtZT0idGVkdHByZWYiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciBYTUwgc2NoZW1hIGZpbGVzIHN1Y2ggYXMgdGhlCi1kZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgYW5kIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXggdXNlZC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGRlZmluZSBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93ICZndDsgUHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1TY2hlbWEgRmlsZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlF1YWxpZnkgWE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzPC9zcGFuPiBjaGVjawotYm94IGlmIHlvdSB3YW50IGEgcHJlZml4IGFwcGxpZWQgdG8gYWxsIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBpbgoteW91ciBYTUwgc2NoZW1hLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4PC9zcGFuPiBmaWVsZCwKLXR5cGUgdGhlIHByZWZpeCB5b3Ugd2FudCBhcHBsaWVkIHRvIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBpbiB5b3VyCi1YTUwgc2NoZW1hLjwvc3Bhbj4gVGhlIHByZWZpeCA8c3BhbiBjbGFzcz0idWljb250cm9sIj54c2Q8L3NwYW4+IGlzIHVzZWQgYnkgY29udmVudGlvbgotdG8gZGVub3RlIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSwgYnV0IGFueSBwcmVmaXggY2FuIGJlIHVzZWQuIFRoZSBwdXJwb3NlCi1vZiB0aGUgYXNzb2NpYXRpb24gaXMgdG8gaWRlbnRpZnkgdGhlIGVsZW1lbnRzIGFuZCBzaW1wbGUgdHlwZXMgYXMgYmVsb25naW5nCi10byB0aGUgdm9jYWJ1bGFyeSBvZiB0aGUgWE1MIFNjaGVtYSBsYW5ndWFnZSByYXRoZXIgdGhhbiB0aGUgdm9jYWJ1bGFyeSBvZgotdGhlIHNjaGVtYSBhdXRob3IuICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhpcyBwcmVmaXggd2lsbCBub3QgYXBwZWFyIGluIGFueSBzY2hlbWFzIHRoYXQKLWN1cnJlbnRseSBleGlzdCAtIGl0IHdpbGwgb25seSBhcHBlYXIgaW4gbmV3IHNjaGVtYXMgeW91IGNyZWF0ZSBhZnRlciB5b3UKLXR5cGUgdGhlIHByZWZpeCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+LiBBbnkgc2NoZW1hcyB0aGF0IGFscmVhZHkKLWV4aXN0IHdpbGwgaGF2ZSB0aGUgcHJlZml4IHNwZWNpZmllZCBpbiB0aGUgc2NoZW1hIGFwcGxpZWQgdG8gdGhlIFhNTCBzY2hlbWEKLWxhbmd1YWdlIGNvbnN0cnVjdHMuPC9kaXY+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gY2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWZhdWx0IFRhcmdldCBOYW1lc3BhY2U8L3NwYW4+IHZhbHVlLjwvc3Bhbj4KLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoaXMgZmllbGQgd2lsbCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlCi1mb3IgYW55IG5ldyBYTUwgc2NoZW1hIGZpbGVzIGNyZWF0ZWQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2htLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2htLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTExZTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRlZHRzY2htIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywNCi1zdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+WE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nIHByb3BlcnRpZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBlZGl0IGFuIFhNTCBzY2hlbWEncw0KLXByb3BlcnRpZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBuZXcgWE1MIHNjaGVtYSBvciBkb3VibGUtY2xpY2sgYW4gZXhpc3Rpbmcgc2NoZW1hIGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3LjwvY21kPjxpbmZvPiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIGNsaWNrIDx1aWNvbnRyb2w+RGlyZWN0aXZlczwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIGNoYW5nZSB0aGUgPHVpY29udHJvbD5QcmVmaXg8L3VpY29udHJvbD4gYXNzb2NpYXRlZCB3aXRoDQotdGhlIGN1cnJlbnQgbmFtZXNwYWNlLjwvY21kPjxpbmZvPkVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGFyZSBhc3NvY2lhdGVkDQotd2l0aCB0aGlzIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhpcyB2YWx1ZS48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBhbHNvIGVkaXQgdGhlIDx1aWNvbnRyb2w+VGFyZ2V0IG5hbWVzcGFjZTwvdWljb250cm9sPiBmb3INCi10aGlzIHNjaGVtYS48L2NtZD48aW5mbz4gQSBuYW1lc3BhY2UgaXMgYSBVUkkgdGhhdCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lDQotdG8gYXNzb2NpYXRlIHdpdGggYWxsIHRoZSBlbGVtZW50cyBhbmQgdHlwZSBkZWZpbml0aW9ucyBpbiBhIHNjaGVtYS48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFhNTCBzY2hlbWEuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPjw/UHViIENhcmV0Pz4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjM0NT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTUzMmIzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBZnRlciB5b3UgY3JlYXRlIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gZWRpdCBpdHMgdmFyaW91cyBwcm9wZXJ0aWVzLCBzdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzLCBYTUwgc2NoZW1hIGZpbGVzLCBlZGl0aW5nIHByb3BlcnRpZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzLCBYTUwgc2NoZW1hIGZpbGVzLCBlZGl0aW5nIHByb3BlcnRpZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRzY2htIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRzY2htIj48YSBuYW1lPSJ0ZWR0c2NobSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsCi1zdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gZWRpdCBhbiBYTUwgc2NoZW1hJ3MKLXByb3BlcnRpZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgbmV3IFhNTCBzY2hlbWEgb3IgZG91YmxlLWNsaWNrIGFuIGV4aXN0aW5nIHNjaGVtYSBpbiB0aGUKLU5hdmlnYXRvciB2aWV3Ljwvc3Bhbj4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGlyZWN0aXZlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeDwvc3Bhbj4gYXNzb2NpYXRlZCB3aXRoCi10aGUgY3VycmVudCBuYW1lc3BhY2UuPC9zcGFuPiBFbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBhcmUgYXNzb2NpYXRlZAotd2l0aCB0aGlzIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhpcyB2YWx1ZS48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gYWxzbyBlZGl0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQgbmFtZXNwYWNlPC9zcGFuPiBmb3IKLXRoaXMgc2NoZW1hLjwvc3Bhbj4gIEEgbmFtZXNwYWNlIGlzIGEgVVJJIHRoYXQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotdG8gYXNzb2NpYXRlIHdpdGggYWxsIHRoZSBlbGVtZW50cyBhbmQgdHlwZSBkZWZpbml0aW9ucyBpbiBhIHNjaGVtYS4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBYTUwgc2NoZW1hLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDAxNGVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGltcHNjaG0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkltcG9ydGluZyBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+SW1wb3J0aW5nIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBYTUwgc2NoZW1hIGZpbGVzIHRoYXQgeW91IGNyZWF0ZWQgb3V0c2lkZQ0KLW9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZQ0KLVhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcNCi1vZiB0aGUgWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5pbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBpbXBvcnQgYW4gWE1MDQotc2NoZW1hIGludG8gdGhlIHdvcmtiZW5jaCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGUgPiBJbXBvcnQ8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPjx1aWNvbnRyb2w+RmlsZQ0KLVN5c3RlbTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBjbGljayAgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IG9uIHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHdpemFyZA0KLXRvIHNlbGVjdCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBhZGQgdGhlIFhNTCBzY2hlbWEuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIGltcG9ydCBzZWxlY3Rpb24gcGFuZXMsIHVzZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdG8gc2VsZWN0DQotZXhhY3RseSB0aGUgcmVzb3VyY2VzIHlvdSB3YW50IHRvIGFkZDogIDwvY21kPjxpbmZvPjx1bD4NCi08bGk+RXhwYW5kIHRoZSBoaWVyYXJjaGllcyBpbiB0aGUgbGVmdCBwYW5lIGFuZCBzZWxlY3Qgb3IgY2xlYXIgdGhlIGNoZWNrYm94ZXMNCi10aGF0IHJlcHJlc2VudCB0aGUgZm9sZGVycyBpbiB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5LiBUaGVuIGluIHRoZSByaWdodCBwYW5lLA0KLXNlbGVjdCBvciBjbGVhciBjaGVjayBib3hlcyBmb3IgaW5kaXZpZHVhbCBmaWxlcy48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPkZpbHRlciBUeXBlczwvdWljb250cm9sPiB0byBmaWx0ZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uDQotZm9yIGZpbGVzIG9mIGEgc3BlY2lmaWMgdHlwZS48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPlNlbGVjdCBBbGw8L3VpY29udHJvbD4gdG8gc2VsZWN0IGFsbCByZXNvdXJjZXMgaW4gdGhlDQotZGlyZWN0b3J5LCB0aGVuIGdvIHRocm91Z2ggYW5kIGRlc2VsZWN0IHRoZSBvbmVzIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIGFkZC48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPkRlc2VsZWN0IEFsbDwvdWljb250cm9sPiB0byBkZXNlbGVjdCBhbGwgcmVzb3VyY2VzIGluDQotdGhlIGRpcmVjdG9yeSwgdGhlbiBnbyB0aHJvdWdoIGFuZCBjaG9vc2UgaW5kaXZpZHVhbCByZXNvdXJjZXMgdG8gYWRkLjwvbGk+DQotPC91bD48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+SW50byBmb2xkZXI8L3VpY29udHJvbD4gZmllbGQsIHNwZWNpZnkgdGhlIFdvcmtiZW5jaA0KLXByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBiZSB0aGUgaW1wb3J0IGRlc3RpbmF0aW9uLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPldoZW4geW91IGhhdmUgZmluaXNoZWQgc3BlY2lmeWluZyB5b3VyIGltcG9ydCBvcHRpb25zLCBjbGljayA8dWljb250cm9sPkZpbmlzaC48L3VpY29udHJvbD48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz48P1B1YiBDYXJldDE/Pg0KLTxyZXN1bHQ+PHA+VGhlIGltcG9ydGVkIHNjaGVtYSBub3cgYXBwZWFycyBpbiB0aGUgTmF2aWdhdG9yIHZpZXcuIERvdWJsZS1jbGljaw0KLWl0IHRvIG9wZW4gaXQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjYxNj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzUwMzc0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJbXBvcnRpbmcgWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIFhNTCBzY2hlbWEgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhlIFhNTCBzY2hlbWEgZWRpdG9yIHByb3ZpZGVzIHlvdSB3aXRoIGEgc3RydWN0dXJlZCB2aWV3IG9mIHRoZSBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggWE1MIHNjaGVtYSBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcgb2YgdGhlIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgaW1wb3J0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgaW1wb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHZkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW5jbC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRpbXBzY2htIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0aW1wc2NobSI+PGEgbmFtZT0idGltcHNjaG0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkltcG9ydGluZyBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91IHdhbnQgdG8gd29yayB3aXRoIFhNTCBzY2hlbWEgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlCi1vZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUKLVhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcKLW9mIHRoZSBYTUwgc2NoZW1hLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBpbXBvcnQgYW4gWE1MCi1zY2hlbWEgaW50byB0aGUgd29ya2JlbmNoLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSAmZ3Q7IEltcG9ydDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlCi1TeXN0ZW08L3NwYW4+PC9zcGFuPiBhbmQgY2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBvbiB0aGUgbmV4dCBwYWdlIG9mIHRoZSB3aXphcmQKLXRvIHNlbGVjdCB0aGUgZGlyZWN0b3JpZXMgZnJvbSB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBhZGQgdGhlIFhNTCBzY2hlbWEuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgaW1wb3J0IHNlbGVjdGlvbiBwYW5lcywgdXNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0byBzZWxlY3QKLWV4YWN0bHkgdGhlIHJlc291cmNlcyB5b3Ugd2FudCB0byBhZGQ6ICA8L3NwYW4+IDx1bD4KLTxsaT5FeHBhbmQgdGhlIGhpZXJhcmNoaWVzIGluIHRoZSBsZWZ0IHBhbmUgYW5kIHNlbGVjdCBvciBjbGVhciB0aGUgY2hlY2tib3hlcwotdGhhdCByZXByZXNlbnQgdGhlIGZvbGRlcnMgaW4gdGhlIHNlbGVjdGVkIGRpcmVjdG9yeS4gVGhlbiBpbiB0aGUgcmlnaHQgcGFuZSwKLXNlbGVjdCBvciBjbGVhciBjaGVjayBib3hlcyBmb3IgaW5kaXZpZHVhbCBmaWxlcy48L2xpPgotCi08bGk+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsdGVyIFR5cGVzPC9zcGFuPiB0byBmaWx0ZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi1mb3IgZmlsZXMgb2YgYSBzcGVjaWZpYyB0eXBlLjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZWxlY3QgQWxsPC9zcGFuPiB0byBzZWxlY3QgYWxsIHJlc291cmNlcyBpbiB0aGUKLWRpcmVjdG9yeSwgdGhlbiBnbyB0aHJvdWdoIGFuZCBkZXNlbGVjdCB0aGUgb25lcyB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byBhZGQuPC9saT4KLQotPGxpPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc2VsZWN0IEFsbDwvc3Bhbj4gdG8gZGVzZWxlY3QgYWxsIHJlc291cmNlcyBpbgotdGhlIGRpcmVjdG9yeSwgdGhlbiBnbyB0aHJvdWdoIGFuZCBjaG9vc2UgaW5kaXZpZHVhbCByZXNvdXJjZXMgdG8gYWRkLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnRvIGZvbGRlcjwvc3Bhbj4gZmllbGQsIHNwZWNpZnkgdGhlIFdvcmtiZW5jaAotcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGJlIHRoZSBpbXBvcnQgZGVzdGluYXRpb24uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2hlbiB5b3UgaGF2ZSBmaW5pc2hlZCBzcGVjaWZ5aW5nIHlvdXIgaW1wb3J0IG9wdGlvbnMsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaC48L3NwYW4+PC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGltcG9ydGVkIHNjaGVtYSBub3cgYXBwZWFycyBpbiB0aGUgTmF2aWdhdG9yIHZpZXcuIERvdWJsZS1jbGljawotaXQgdG8gb3BlbiBpdCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIHRpdGxlPSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPlhNTCBzY2hlbWEgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiB0aXRsZT0iQWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywgc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguIj5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R2ZHRzY2htLmh0bWwiIHRpdGxlPSJWYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiI+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIHRpdGxlPSJBcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwgcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgYW4gaW1wb3J0IGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4iPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW5jbC5odG1sIiB0aXRsZT0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlIGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiI+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzODZkMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idG5hdnNyYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5XaGVuIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgU291cmNlIHZpZXcsIHlvdSBjYW4gdXNlIEYzIHRvIG5hdmlnYXRlDQotdGhyb3VnaCB0aGUgZmlsZSBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGFuZCBwcmVzc2luZw0KLUYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5uYXZpZ2F0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Zb3UgY2FuIGp1bXAgdG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgaXRlbXM6PC9wPjx1bD4NCi08bGk+RWxlbWVudCBvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb24ncyB0eXBlPC9saT4NCi08bGk+RWxlbWVudCByZWZlcmVuY2VzPC9saT4NCi08bGk+R3JvdXAgcmVmZXJlbmNlczwvbGk+DQotPGxpPkF0dHJpYnV0ZSByZWZlcmVuY2VzPC9saT4NCi08bGk+QXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZXM8L2xpPg0KLTxsaT5JbXBvcnQsIGluY2x1ZGUsIGFuZCByZWRlZmluZSBlbGVtZW50ICh0aGUgZXh0ZXJuYWwgc2NoZW1hIHdpbGwgb3BlbiBpbg0KLXRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhpcyBvbmx5IHdvcmtzIHdpdGggc2NoZW1hcyBpbiB0aGUgd29ya3NwYWNlKS48L2xpPg0KLTxsaT48L2xpPg0KLTwvdWw+PHA+WW91PD9QdWIgQ2FyZXQ/PiBtdXN0IHBsYWNlIHlvdXIgY3Vyc29yIGV4YWN0bHkgaW4gdGhlIGxvY2F0aW9uIG9mDQotdGhlIHJlZmVyZW5jZSAoZm9yIGV4YW1wbGUgYmV0d2VlbiB0aGUgZG91YmxlIHF1b3RlcyBmb3IgPHN5c3RlbW91dHB1dD50eXBlDQotPSAiICI8L3N5c3RlbW91dHB1dD4gb3IgIDxzeXN0ZW1vdXRwdXQ+YmFzZSA9ICIgIjwvc3lzdGVtb3V0cHV0PikuPC9wPjxwPkZvcg0KLWV4YW1wbGUsIGlmIHlvdSBwbGFjZSB5b3VyIGN1cnNvciBhbnl3aGVyZSBpbiB0aGUgZm9sbG93aW5nIHRleHQgYW5kIHByZXNzDQotRjM6PC9wPjxwPiA8c3lzdGVtb3V0cHV0PiZsdDtlbGVtZW50IG5hbWU9InNoaXBUbyIgdHlwZT0icG86VVNBZGRyZXNzIj4mbHQ7L2VsZW1lbnQ+PC9zeXN0ZW1vdXRwdXQ+IDwvcD48cD50aGUNCi1jdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGp1bXAgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSB0eXBlDQotVVNBZGRyZXNzIGlzIGRlZmluZWQuPC9wPjxwPk9yLCBpZiB5b3UgcGxhY2UgeW91ciBjdXJzb3IgYW55d2hlcmUgaW4gdGhlIGZvbGxvd2luZw0KLXRleHQgYW5kIGNsaWNrIEYzOjwvcD48cD4gPHN5c3RlbW91dHB1dD4mbHQ7ZWxlbWVudCByZWY9InBvOkNvbnRhY3RFbGVtZW50Ij4mbHQ7L2VsZW1lbnQ+PC9zeXN0ZW1vdXRwdXQ+IDwvcD48cD50aGUNCi1jdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGp1bXAgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSBnbG9iYWwNCi1lbGVtZW50IENvbnRhY3RFbGVtZW50IGlzIGRlZmluZWQuPC9wPjxwPlRoaXMgd29ya3MgYWNyb3NzIGZpbGVzLiBGb3IgZXhhbXBsZSwNCi1pZiB0aGUgdHlwZSB5b3UgaGF2ZSBzZWxlY3RlZCBpcyBkZWZpbmVkIGluIGFub3RoZXIgWE1MIHNjaGVtYSBhbmQgeW91IGNsaWNrDQotRjMsIHlvdSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdGFrZW4gdG8gdGhhdCBmaWxlLjwvcD48L2NvbnRleHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDIwNjY/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdG5hdnNyYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjFmZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJOYXZpZ2F0aW5nIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IldoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSBTb3VyY2UgdmlldywgeW91IGNhbiB1c2UgRjMgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgZmlsZSBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGFuZCBwcmVzc2luZyBGMyB0byBqdW1wIHRvIHRoZSBpdGVtIGl0IHJlZmVycyB0by4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iV2hlbiB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIFNvdXJjZSB2aWV3LCB5b3UgY2FuIHVzZSBGMyB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBmaWxlIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW4gdGhlIGFwcHJvcHJpYXRlIGl0ZW0gYW5kIHByZXNzaW5nIEYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIG5hdmlnYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBuYXZpZ2F0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idG5hdnNyYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPk5hdmlnYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRuYXZzcmMiPjxhIG5hbWU9InRuYXZzcmMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk5hdmlnYXRpbmcgWE1MIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSBTb3VyY2UgdmlldywgeW91IGNhbiB1c2UgRjMgdG8gbmF2aWdhdGUKLXRocm91Z2ggdGhlIGZpbGUgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbiB0aGUgYXBwcm9wcmlhdGUgaXRlbSBhbmQgcHJlc3NpbmcKLUYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4ganVtcCB0byBhbnkgb2YgdGhlIGZvbGxvd2luZyBpdGVtczo8L3A+Ci08dWw+Ci08bGk+RWxlbWVudCBvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb24ncyB0eXBlPC9saT4KLQotPGxpPkVsZW1lbnQgcmVmZXJlbmNlczwvbGk+Ci0KLTxsaT5Hcm91cCByZWZlcmVuY2VzPC9saT4KLQotPGxpPkF0dHJpYnV0ZSByZWZlcmVuY2VzPC9saT4KLQotPGxpPkF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2VzPC9saT4KLQotPGxpPkltcG9ydCwgaW5jbHVkZSwgYW5kIHJlZGVmaW5lIGVsZW1lbnQgKHRoZSBleHRlcm5hbCBzY2hlbWEgd2lsbCBvcGVuIGluCi10aGUgWE1MIHNjaGVtYSBlZGl0b3IuIFRoaXMgb25seSB3b3JrcyB3aXRoIHNjaGVtYXMgaW4gdGhlIHdvcmtzcGFjZSkuPC9saT4KLQotPGxpIC8+Ci0KLTwvdWw+Ci08cD5Zb3UgbXVzdCBwbGFjZSB5b3VyIGN1cnNvciBleGFjdGx5IGluIHRoZSBsb2NhdGlvbiBvZgotdGhlIHJlZmVyZW5jZSAoZm9yIGV4YW1wbGUgYmV0d2VlbiB0aGUgZG91YmxlIHF1b3RlcyBmb3IgPHR0IGNsYXNzPSJzeXNvdXQiPnR5cGUKLT0gIiAiPC90dD4gb3IgIDx0dCBjbGFzcz0ic3lzb3V0Ij5iYXNlID0gIiAiPC90dD4pLjwvcD4KLTxwPkZvcgotZXhhbXBsZSwgaWYgeW91IHBsYWNlIHlvdXIgY3Vyc29yIGFueXdoZXJlIGluIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgcHJlc3MKLUYzOjwvcD4KLTxwPiA8dHQgY2xhc3M9InN5c291dCI+Jmx0O2VsZW1lbnQgbmFtZT0ic2hpcFRvIiB0eXBlPSJwbzpVU0FkZHJlc3MiJmd0OyZsdDsvZWxlbWVudCZndDs8L3R0PiA8L3A+Ci08cD50aGUKLWN1cnNvciB3aWxsIGF1dG9tYXRpY2FsbHkganVtcCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIHR5cGUKLVVTQWRkcmVzcyBpcyBkZWZpbmVkLjwvcD4KLTxwPk9yLCBpZiB5b3UgcGxhY2UgeW91ciBjdXJzb3IgYW55d2hlcmUgaW4gdGhlIGZvbGxvd2luZwotdGV4dCBhbmQgY2xpY2sgRjM6PC9wPgotPHA+IDx0dCBjbGFzcz0ic3lzb3V0Ij4mbHQ7ZWxlbWVudCByZWY9InBvOkNvbnRhY3RFbGVtZW50IiZndDsmbHQ7L2VsZW1lbnQmZ3Q7PC90dD4gPC9wPgotPHA+dGhlCi1jdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGp1bXAgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSBnbG9iYWwKLWVsZW1lbnQgQ29udGFjdEVsZW1lbnQgaXMgZGVmaW5lZC48L3A+Ci08cD5UaGlzIHdvcmtzIGFjcm9zcyBmaWxlcy4gRm9yIGV4YW1wbGUsCi1pZiB0aGUgdHlwZSB5b3UgaGF2ZSBzZWxlY3RlZCBpcyBkZWZpbmVkIGluIGFub3RoZXIgWE1MIHNjaGVtYSBhbmQgeW91IGNsaWNrCi1GMywgeW91IHdpbGwgYXV0b21hdGljYWxseSBiZSB0YWtlbiB0byB0aGF0IGZpbGUuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIHRpdGxlPSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPlhNTCBzY2hlbWEgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODczNmE0YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InJlZmFjdG9yaW5nIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5SZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5SZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYQ0KLXNpbmdsZSBhcnRpZmFjdCBjaGFuZ2UsIGFuZCBoYXZlIHRoYXQgY2hhbmdlIGltcGxlbWVudGVkIHRocm91Z2hvdXQgYWxsIG90aGVyDQotZGVwZW5kYW50IGFydGlmYWN0cy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRyZWZhY3RyWFNEfDF8ZGVwZW5kZW50YXJ0aWZhY3RzcmVmYWN0b3J0aW5nWE1Mc2NoZW1hZmlsZXMiDQotc3RhdHVzPSJuZXciPmRlcGVuZGVudCBhcnRpZmFjdHM8aW5kZXh0ZXJtPnJlZmFjdG9yaW5nIFhNTCBzY2hlbWEgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtIGtleXJlZj0idHJlZmFjdHJYU0R8MnxyZWZhY3RvcmluZ1hNTHNjaGVtYWZpbGVzIiBzdGF0dXM9Im5ldyI+cmVmYWN0b3Jpbmc8aW5kZXh0ZXJtPlhNTA0KLXNjaGVtYSBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0ga2V5cmVmPSJ0cmVmYWN0clhTRHwzfHJlbmFtaW5nWE1Mc2NoZW1hZmlsZXMiDQotc3RhdHVzPSJuZXciPnJlbmFtaW5nPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybQ0KLWtleXJlZj0idHJlZmFjdHJYU0R8NHxYTUxzY2hlbWFzZWRpdGluZyIgc3RhdHVzPSJjaGFuZ2VkIj5zY2hlbWFzPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08cHJlcmVxPjwvcHJlcmVxPg0KLTxjb250ZXh0PlJlZmFjdG9yaW5nIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIHRoZSB0ZWRpb3VzIGVkaXRpbmcgbmVjZXNzYXJ5DQotdG8gcmVjb3ZlciBicm9rZW4gZGVwZW5kZW5jaWVzIGNhdXNlZCBieSBhcnRpZmFjdCBjaGFuZ2VzIHdoaWNoIGNhdXNlIHJpcHBsZQ0KLWVmZmVjdHMgb24gb3RoZXIgZGVwZW5kYW50IGFydGlmYWN0cyAoc3VjaCBhcyByZW5hbWluZyBhbiBYTUwgU2NoZW1hIGVsZW1lbnQpLjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DcmVhdGUgYSBuZXcgWE1MIHNjaGVtYSBvciBkb3VibGUtY2xpY2sgYW4gZXhpc3Rpbmcgc2NoZW1hIGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3LjwvY21kPjxpbmZvPiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIHJlZmFjdG9yIGFuIGFydGlmYWN0LCBwb3NpdGlvbiBjdXJzb3Igd2l0aGluIHRoZSBhcnRpZmFjdCwgcmlnaHQtY2xpY2sNCi10aGUgYXJ0aWZhY3QsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlJlZmFjdG9yPC91aWNvbnRyb2w+PHVpY29udHJvbD5SZW5hbWU8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvY21kPjxpbmZvPkEgcG9wdXAgZGlhbG9nIHdpbGwgcmVxdWVzdCB0aGUgZW50cnkgb2YgYSBuZXcgbmFtZQ0KLWZvciB0aGF0IGFydGlmYWN0PC9pbmZvPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlR5cGUgaW4gdGhlIG5ldyBuYW1lIG9mIHRoZSBhcnRpZmFjdC48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD4oT3B0aW9uYWwpIENsaWNrIDxiPlByZXZpZXc8L2I+LjwvY21kPjxpbmZvPkEgd2luZG93IHdpbGwgb3Blbg0KLWluZGljYXRpbmcgYWxsIG9mIHRoZSBjaGFuZ2VzIHdoaWNoIHdpbGwgdGFrZSBwbGFjZSBkdWUgdG8gdGhlIHJlZmFjdG9yaW5nLjwvaW5mbz4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LLjwvdWljb250cm9sPjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIG5ldyBuYW1lIHdpbGwgYmUgZW50ZXJlZCBpbiB0aGUgb3BlbmVkIFhTRCBzb3VyY2UsIGFzIHdlbGwgYXMNCi1pbiBhbGwgZGVwZW5kYW50IGFydGlmYWN0cy48L3Jlc3VsdD4NCi08ZXhhbXBsZT48Yj48dT5Db21wb25lbnQgUmVmZXJlbmNlcyBpbiBYTUwgU2NoZW1hPC91PjwvYj48c2ltcGxldGFibGU+DQotPHN0aGVhZD4NCi08c3RlbnRyeT5HbG9iYWwgbmFtZWQgY29tcG9uZW50czwvc3RlbnRyeT4NCi08c3RlbnRyeT5SZWZlcmVuY2U8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2VsZW1lbnQgbmFtZT0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2VsZW1lbnQgcmVmPSJmb28iPjwvbGk+DQotPGxpPiZsdDtlbGVtZW50IHN1YnN0aXR1dGlvbkdyb3VwPSJmb28iPC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT48dWw+DQotPGxpPiZsdDtzaW1wbGUvY29tcGxleFR5cGUgbmFtZT0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2VsZW1lbnQgdHlwZT0iZm9vIj48L2xpPg0KLTxsaT4mbHQ7YXR0cmlidXRlIHR5cGU9ImZvbyI+PC9saT4NCi08bGk+Jmx0O3Jlc3RyaWN0aW9uIGJhc2U9ImZvbyI+PC9saT4NCi08bGk+Jmx0O3N1YnN0aXR1dGlvbiBiYXNlPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7YXR0cmlidXRlIG5hbWU9ImZvbyI+PC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08c3RlbnRyeT48dWw+DQotPGxpPiZsdDthdHRyaWJ1dGUgcmVmPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7YXR0cmlidXRlR3JvdXAgbmFtZT0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2dyb3VwIG5hbWU9ImZvbyI+PC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08c3RlbnRyeT48dWw+DQotPGxpPiZsdDtncm91cCByZWY9ImZvbyI+PC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTwvc2ltcGxldGFibGU+PC9leGFtcGxlPg0KLTxwb3N0cmVxPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZWI4NDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90cmVmYWN0clhTRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iV2l0aGluIGFuIFhNTCBTY2hlbWEgZmlsZSwgcmVmYWN0b3JpbmcgYWxsb3dzIGF1dGhvcnMgdG8gbWFrZSBhIHNpbmdsZSBhcnRpZmFjdCBjaGFuZ2UsIGFuZCBoYXZlIHRoYXQgY2hhbmdlIGltcGxlbWVudGVkIHRocm91Z2hvdXQgYWxsIG90aGVyIGRlcGVuZGFudCBhcnRpZmFjdHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYSBzaW5nbGUgYXJ0aWZhY3QgY2hhbmdlLCBhbmQgaGF2ZSB0aGF0IGNoYW5nZSBpbXBsZW1lbnRlZCB0aHJvdWdob3V0IGFsbCBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRlcGVuZGVudCBhcnRpZmFjdHMsIHJlZmFjdG9yaW5nIFhNTCBzY2hlbWEgZmlsZXMsIHJlZmFjdG9yaW5nLCBYTUwgc2NoZW1hIGZpbGVzLCByZW5hbWluZywgWE1MIHNjaGVtYSBmaWxlcywgc2NoZW1hcywgZWRpdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImRlcGVuZGVudCBhcnRpZmFjdHMsIHJlZmFjdG9yaW5nIFhNTCBzY2hlbWEgZmlsZXMsIHJlZmFjdG9yaW5nLCBYTUwgc2NoZW1hIGZpbGVzLCByZW5hbWluZywgWE1MIHNjaGVtYSBmaWxlcywgc2NoZW1hcywgZWRpdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmVmYWN0b3JpbmciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5SZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZWZhY3RvcmluZyI+PGEgbmFtZT0icmVmYWN0b3JpbmciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYQotc2luZ2xlIGFydGlmYWN0IGNoYW5nZSwgYW5kIGhhdmUgdGhhdCBjaGFuZ2UgaW1wbGVtZW50ZWQgdGhyb3VnaG91dCBhbGwgb3RoZXIKLWRlcGVuZGFudCBhcnRpZmFjdHMuPC9wPgotCi08ZGl2IGNsYXNzPSJwIiAvPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5SZWZhY3RvcmluZyBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciB0aGUgdGVkaW91cyBlZGl0aW5nIG5lY2Vzc2FyeQotdG8gcmVjb3ZlciBicm9rZW4gZGVwZW5kZW5jaWVzIGNhdXNlZCBieSBhcnRpZmFjdCBjaGFuZ2VzIHdoaWNoIGNhdXNlIHJpcHBsZQotZWZmZWN0cyBvbiBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzIChzdWNoIGFzIHJlbmFtaW5nIGFuIFhNTCBTY2hlbWEgZWxlbWVudCkuPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgbmV3IFhNTCBzY2hlbWEgb3IgZG91YmxlLWNsaWNrIGFuIGV4aXN0aW5nIHNjaGVtYSBpbiB0aGUKLU5hdmlnYXRvciB2aWV3Ljwvc3Bhbj4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gcmVmYWN0b3IgYW4gYXJ0aWZhY3QsIHBvc2l0aW9uIGN1cnNvciB3aXRoaW4gdGhlIGFydGlmYWN0LCByaWdodC1jbGljawotdGhlIGFydGlmYWN0LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZmFjdG9yPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbmFtZTwvc3Bhbj4KLTwvc3Bhbj48L3NwYW4+IEEgcG9wdXAgZGlhbG9nIHdpbGwgcmVxdWVzdCB0aGUgZW50cnkgb2YgYSBuZXcgbmFtZQotZm9yIHRoYXQgYXJ0aWZhY3QKLTxvbCB0eXBlPSJhIj4KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBpbiB0aGUgbmV3IG5hbWUgb2YgdGhlIGFydGlmYWN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPihPcHRpb25hbCkgQ2xpY2sgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+Ljwvc3Bhbj4gQSB3aW5kb3cgd2lsbCBvcGVuCi1pbmRpY2F0aW5nIGFsbCBvZiB0aGUgY2hhbmdlcyB3aGljaCB3aWxsIHRha2UgcGxhY2UgZHVlIHRvIHRoZSByZWZhY3RvcmluZy4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0suPC9zcGFuPjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgbmV3IG5hbWUgd2lsbCBiZSBlbnRlcmVkIGluIHRoZSBvcGVuZWQgWFNEIHNvdXJjZSwgYXMgd2VsbCBhcwotaW4gYWxsIGRlcGVuZGFudCBhcnRpZmFjdHMuPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImV4YW1wbGUiPjxzdHJvbmc+PHU+Q29tcG9uZW50IFJlZmVyZW5jZXMgaW4gWE1MIFNjaGVtYTwvdT48L3N0cm9uZz48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAwRkUiPkdsb2JhbCBuYW1lZCBjb21wb25lbnRzPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDEwNCI+UmVmZXJlbmNlPC90aD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRkUiPjx1bD4KLTxsaT4mbHQ7ZWxlbWVudCBuYW1lPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEwNCI+PHVsPgotPGxpPiZsdDtlbGVtZW50IHJlZj0iZm9vIiZndDs8L2xpPgotCi08bGk+Jmx0O2VsZW1lbnQgc3Vic3RpdHV0aW9uR3JvdXA9ImZvbyI8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRkUiPjx1bD4KLTxsaT4mbHQ7c2ltcGxlL2NvbXBsZXhUeXBlIG5hbWU9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTA0Ij48dWw+Ci08bGk+Jmx0O2VsZW1lbnQgdHlwZT0iZm9vIiZndDs8L2xpPgotCi08bGk+Jmx0O2F0dHJpYnV0ZSB0eXBlPSJmb28iJmd0OzwvbGk+Ci0KLTxsaT4mbHQ7cmVzdHJpY3Rpb24gYmFzZT0iZm9vIiZndDs8L2xpPgotCi08bGk+Jmx0O3N1YnN0aXR1dGlvbiBiYXNlPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBGRSI+PHVsPgotPGxpPiZsdDthdHRyaWJ1dGUgbmFtZT0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMDQiPjx1bD4KLTxsaT4mbHQ7YXR0cmlidXRlIHJlZj0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRkUiPjx1bD4KLTxsaT4mbHQ7YXR0cmlidXRlR3JvdXAgbmFtZT0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMDQiPjx1bD4KLTxsaT4mbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBGRSI+PHVsPgotPGxpPiZsdDtncm91cCBuYW1lPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEwNCI+PHVsPgotPGxpPiZsdDtncm91cCByZWY9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3M2Y3ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2ZHRzY2htLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR2ZHRzY2htIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YNCi10aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbg0KLXRoZSBQcm9ibGVtcyB2aWV3Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPnZhbGlkYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyB2YWxpZGF0ZSBhbiBYTUwNCi1zY2hlbWEsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodC1jbGljayB5b3VyIGZpbGUgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBjbGljayA8dWljb250cm9sPlZhbGlkYXRlPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPiBJZiB2YWxpZGF0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCwgeW91IGNhbiByZWZlciB0byB0aGUgUHJvYmxlbXMNCi12aWV3IHRvIHNlZSB3aGF0IHByb2JsZW1zIHdlcmUgbG9nZ2VkLiA8L2NtZD48aW5mbz4gPG5vdGU+IElmIHlvdSByZWNlaXZlDQotYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIFByb2JsZW1zIHZpZXcgaXMgZnVsbCwgeW91IGNhbiBpbmNyZWFzZQ0KLXRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCBieSBjbGlja2luZyA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdGluZyA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+PHVpY29udHJvbD5NYXJrZXJzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uDQotU2VsZWN0IHRoZSA8dWljb250cm9sPlVzZSBtYXJrZXIgbGltaXRzPC91aWNvbnRyb2w+IGNoZWNrIGJveCBhbmQgY2hhbmdlIHRoZQ0KLW51bWJlciBpbiB0aGUgPHVpY29udHJvbD5MaW1pdCB2aXNpYmxlIGl0ZW1zIHBlciBncm91cDwvdWljb250cm9sPiBmaWVsZC48L25vdGU+PC9pbmZvPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+VGhlIFhNTCBzY2hlbWEgc3VwcG9ydCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IgaXMgYmFzZWQgb24gdGhlDQotVzNDIFhNTCBTY2hlbWEgUmVjb21tZW5kYXRpb24gU3BlY2lmaWNhdGlvbi4gVGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbnMNCi1YTUwgU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlcyBhbmQgWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBmcm9tIHRoZSBXM0MNCi1XZWIgc2l0ZSBhcmUgdXNlZCBmb3IgdmFsaWRhdGlvbi48L3A+PHA+Q2VydGFpbiBlcnJvciBtZXNzYWdlcyBjb250YWluIGEgcmVmZXJlbmNlDQotdG8gdGhlIHNjaGVtYSBjb25zdHJhaW50cyBsaXN0ZWQgaW4gQXBwZW5kaXggQyBvZiB0aGUgWE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXMNCi1kb2N1bWVudC4gRWFjaCBjb25zdHJhaW50IGhhcyBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGluIHRoZQ0KLWVycm9yIG1lc3NhZ2UuIEZvciBleGFtcGxlLCBpZiB5b3UgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlIHdpdGggdGhpcyB0ZXh0OiA8c3lzdGVtb3V0cHV0PmN0LXByb3BzLWNvcnJlY3Q8L3N5c3RlbW91dHB1dD4gYW5kDQoteW91IHNlYXJjaGVkIGluIHRoZSBTdHJ1Y3R1cmUgZG9jdW1lbnQgZm9yIHRoZSB0ZXh0LCB5b3Ugd291bGQgZmluZCB0aGF0IGl0DQotaXMgZm9yIHRoZSBzZWN0aW9uICJTY2hlbWEgQ29tcG9uZW50IENvbnN0cmFpbnQ6IENvbXBsZXggVHlwZSBEZWZpbml0aW9uIFByb3BlcnRpZXMNCi1Db3JyZWN0Ii4gPC9wPjxwPllvdSBjYW4gc2V0IHVwIGEgcHJvamVjdCdzIHByb3BlcnRpZXMgc28gdGhhdCBkaWZmZXJlbnQgdHlwZXMNCi1vZiBwcm9qZWN0IHJlc291cmNlcyBhcmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtICh0aGlzDQotaXMgc2V0IGZvciBhbGwgcmVzb3VyY2VzIGJ5IGRlZmF1bHQpLiBGcm9tIGEgcHJvamVjdCdzIHBvcC11cCBtZW51IHNlbGVjdCA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4sDQotdGhlbiBzZWxlY3QgPHVpY29udHJvbD5WYWxpZGF0aW9uPC91aWNvbnRyb2w+LiBBbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1bg0KLWFnYWluc3QgeW91ciBwcm9qZWN0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBWYWxpZGF0aW9uIHBhZ2UuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08bGlua3RleHQ+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9saW5rdGV4dD4NCi08ZGVzYz5HZW5lcmFsIHZhbGlkYXRpb24gaW5mb3JtYXRpb248L2Rlc2M+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xIiBzY29wZT0iZXh0ZXJuYWwiPjxsaW5rdGV4dD5YTUwNCi1TY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzPC9saW5rdGV4dD4NCi08ZGVzYz5TZWUgdGhlIFczQyBXZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zPC9kZXNjPg0KLTwvbGluaz4NCi08bGluayBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMiIgc2NvcGU9ImV4dGVybmFsIj48bGlua3RleHQ+WE1MDQotU2NoZW1hIFBhcnQgMjogRGF0YXR5cGVzPC9saW5rdGV4dD4NCi08ZGVzYz5TZWUgdGhlIFczQyBXZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zPC9kZXNjPg0KLTwvbGluaz4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2MDU2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2ZHRzY2htLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgdmFsaWRhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGN4bWxzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0dmR0c2NobSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR2ZHRzY2htIj48YSBuYW1lPSJ0dmR0c2NobSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZgotdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4KLXRoZSBQcm9ibGVtcyB2aWV3LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyB2YWxpZGF0ZSBhbiBYTUwKLXNjaGVtYSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodC1jbGljayB5b3VyIGZpbGUgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZTwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gSWYgdmFsaWRhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwsIHlvdSBjYW4gcmVmZXIgdG8gdGhlIFByb2JsZW1zCi12aWV3IHRvIHNlZSB3aGF0IHByb2JsZW1zIHdlcmUgbG9nZ2VkLiA8L3NwYW4+ICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gIElmIHlvdSByZWNlaXZlCi1hbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgUHJvYmxlbXMgdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlCi10aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIGFsbG93ZWQgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+IGFuZCBzZWxlY3RpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWFya2Vyczwvc3Bhbj48L3NwYW4+LgotU2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgbWFya2VyIGxpbWl0czwvc3Bhbj4gY2hlY2sgYm94IGFuZCBjaGFuZ2UgdGhlCi1udW1iZXIgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxpbWl0IHZpc2libGUgaXRlbXMgcGVyIGdyb3VwPC9zcGFuPiBmaWVsZC48L2Rpdj4KLQotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBzY2hlbWEgc3VwcG9ydCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IgaXMgYmFzZWQgb24gdGhlCi1XM0MgWE1MIFNjaGVtYSBSZWNvbW1lbmRhdGlvbiBTcGVjaWZpY2F0aW9uLiBUaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9ucwotWE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXMgYW5kIFhNTCBTY2hlbWEgUGFydCAyOiBEYXRhdHlwZXMgZnJvbSB0aGUgVzNDCi1XZWIgc2l0ZSBhcmUgdXNlZCBmb3IgdmFsaWRhdGlvbi48L3A+Ci08cD5DZXJ0YWluIGVycm9yIG1lc3NhZ2VzIGNvbnRhaW4gYSByZWZlcmVuY2UKLXRvIHRoZSBzY2hlbWEgY29uc3RyYWludHMgbGlzdGVkIGluIEFwcGVuZGl4IEMgb2YgdGhlIFhNTCBTY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzCi1kb2N1bWVudC4gRWFjaCBjb25zdHJhaW50IGhhcyBhIHVuaXF1ZSBuYW1lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGluIHRoZQotZXJyb3IgbWVzc2FnZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGlzIHRleHQ6IDx0dCBjbGFzcz0ic3lzb3V0Ij5jdC1wcm9wcy1jb3JyZWN0PC90dD4gYW5kCi15b3Ugc2VhcmNoZWQgaW4gdGhlIFN0cnVjdHVyZSBkb2N1bWVudCBmb3IgdGhlIHRleHQsIHlvdSB3b3VsZCBmaW5kIHRoYXQgaXQKLWlzIGZvciB0aGUgc2VjdGlvbiAiU2NoZW1hIENvbXBvbmVudCBDb25zdHJhaW50OiBDb21wbGV4IFR5cGUgRGVmaW5pdGlvbiBQcm9wZXJ0aWVzCi1Db3JyZWN0Ii4gPC9wPgotPHA+WW91IGNhbiBzZXQgdXAgYSBwcm9qZWN0J3MgcHJvcGVydGllcyBzbyB0aGF0IGRpZmZlcmVudCB0eXBlcwotb2YgcHJvamVjdCByZXNvdXJjZXMgYXJlIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGVkIHdoZW4geW91IHNhdmUgdGhlbSAodGhpcwotaXMgc2V0IGZvciBhbGwgcmVzb3VyY2VzIGJ5IGRlZmF1bHQpLiBGcm9tIGEgcHJvamVjdCdzIHBvcC11cAotbWVudSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4sIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+LgotQW55IHZhbGlkYXRvcnMgeW91IGNhbiBydW4gYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24KLXBhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjeG1sc2NoLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiI+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCIgdGl0bGU9IkdlbmVyYWwgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMSIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSJTZWUgdGhlIFczQyBXZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zIj5YTUwKLVNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yIiB0YXJnZXQ9Il9ibGFuayIgdGl0bGU9IlNlZSB0aGUgVzNDIFdlYiBzaXRlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbnMiPlhNTAotU2NoZW1hIFBhcnQgMjogRGF0YXR5cGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjU2NjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGY5M2E5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2guaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzNiYzQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUucGF0Y2guaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLQotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkJ1aWxkIiBjb250ZW50PSJCdWlsZCI+Ci0gICA8dGl0bGU+V1RQIDEuNS41IFBhdGNoZXM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGgxPldUUCAxLjUuNSBQYXRjaGVzPC9oMT4KLQotPGgyPm9yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZTwvaDI+Ci0KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg1NDAyJz4xODU0MDI8L2E+LiBKU1AgdmFsaWRhdGlvbiBmYWlscyBiZWNhdXNlIG9mIGRlZmF1bHRlZCBhdHRyaWJ1dGUgZmx1c2ggb24ganNwOmluY2x1ZGU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzcxMSc+MjAzNzExPC9hPi4gdGFnbGliIGRlY2xhcmF0aW9ucyBpbiBKU1AgZnJhZ21lbnRzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTkwNTMnPjE5OTA1MzwvYT4uIFN5bnRheCBlcnJvcnMgb3V0c2lkZSBvZiBzY3JpcHRpbmcgYXJlYXMgbm90IHJlcG9ydGVkPC9wPgotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OTdiNGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1RQIFBhdGNoIGZvciB3c3QueG1sX3VpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249XAotQSBwYXRjaCBmb3Igc3NlLnVpXG5cCi1UaGlzIHBhdGNoIGZpeGVzIHByb2JsZW1zIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIGJ1Z3M6IFxuXAotXG5cCi1CdWcgMTg1NDAyIEpTUCB2YWxpZGF0aW9uIGZhaWxzIGJlY2F1c2Ugb2YgZGVmYXVsdGVkIGF0dHJpYnV0ZSBmbHVzaCBvbiBqc3A6aW5jbHVkZSAgXG5cCi1TZWUgYnVnIDE4NTQwMiAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTQwMikpIFxuXAotXG5cCi1CdWcgMjAzNzExIHRhZ2xpYiBkZWNsYXJhdGlvbnMgaW4gSlNQIGZyYWdtZW50cyAgXG5cCi1TZWUgYnVnIDIwMzcxMSAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMzcxMSkpIFxuXAotXG5cCi1CdWcgMTk5MDUzIFN5bnRheCBlcnJvcnMgb3V0c2lkZSBvZiBzY3JpcHRpbmcgYXJlYXMgbm90IHJlcG9ydGVkICBcblwKLVNlZSBidWcgMTk5MDUzIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk5MDUzKSkgXG5cCi1cblwKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotT2N0b2JlciwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ODEzNjQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuNS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMS41LjUudjIwMDcwODA5MDUxOC0tNGhORERpRW5KV0RkUlEiIHBhdGNoPSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTliMDY1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBjZTFmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYmVkNWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V2ViIHRvb2xzIGNvcmUuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTFmYTEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHZlcnNpb249IjMuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIgdmVyc2lvbj0iMi40LjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NDU5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZjFlNmUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkMzhkNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzI2MGE0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgV2ViIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBXZWIgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+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+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmMWU2ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQzOGQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQzMDJlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYnVpbGQueG1sCi1mZWF0dXJlcwotcGx1Z2lucwotb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzlmODRiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI0NGE0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLCBmZWF0dXJlQG9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnNvdXJjZQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWUyZWYzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciB0aGUgV1NUIHdlYiB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5ZTdhNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0X3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXJfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNGI0NzcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDgyOWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgVUkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XZWIgVUkgdG9vbHMuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlN2RiNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlcl91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiB2ZXJzaW9uPSIzLjQuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiIHZlcnNpb249IjIuNC4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTk1YzBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTZmYjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4YTYxOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUuc291cmNlID0gb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDkyZjEyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFdlYiBVSS4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTVjMGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1NmZiOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmUxNzQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZV8xLjAuMC5qYXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNWViMzEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhMTIxNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgV2ViIFVzZXIgRG9jdW1lbnRhdGlvbgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBXZWIgdXNlciBkb2N1bWVudGF0aW9uCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkODJkYjguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUucGF0Y2gvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4Yzc5My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUucGF0Y2gvZGVzY3JpcHRpb24udHh0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUucGF0Y2gvZGVzY3JpcHRpb24udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDgxNDhhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnBhdGNoL2Rlc2NyaXB0aW9uLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhpcyBoZWFkIHRydW5rIGlzIGRlbGliZXJhdGx5IGVtcHR5LiAKLQotUGxlYXNlIGxvYWQgdGhlIGFwcHJvcHJpYXRlIG1haW50ZW5hbmNlIGJyYW5jaC4gCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjM1YWUxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmVfMS41LjAuMjAwNjA1MDgwMTA0LmJpbi5kaXN0LnppcAotZGV2LnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYWUyNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOTI3Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gTWF5IDA4IDA5OjEwOjI3IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQ0ODBiLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTQ0ZjU5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgQ29yZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBYTUwgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiZmZjMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHZlcnNpb249IjMuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iIHZlcnNpb249IjIuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIgdmVyc2lvbj0iMi40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UueHNkIiB2ZXJzaW9uPSIyLjQuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LnhtbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjE5MCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMTkwIgotICAgICAgICAgdmVyc2lvbj0iMS4zLjQucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS54bWwucmVzb2x2ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSI5NiIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iOTYiCi0gICAgICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMjcwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIyNzAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjcuMS5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhlcmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjEyMDAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjEyMDAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjkuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjE1MiIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMTUyIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzZTY2NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KQotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotICAKLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSA8L0xJPgotICAKLSAgPGxpPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjMjcxNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQzNzc3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0OWU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjgyYWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgQ29yZSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFhNTCBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWMyNzE2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIENvcmVcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MTJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDM3NzcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgQ29yZSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzQ5NTIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1mZWF0dXJlcwotcGx1Z2lucwotYnVpbGQueG1sCi1kZXYucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzVmYTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNDA1MGUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLCBmZWF0dXJlQG9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnNvdXJjZSAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNmY1MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFhNTCBFZGl0b3JzIGFuZCBUb29scyBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciB0aGUgV1NUIFhNTCB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lLCAyMDA4XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4MDEzYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMgCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIiAvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAKLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2U2NjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KQotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotICAKLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSA8L0xJPgotICAKLSAgPGxpPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBjMWY4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZjkzYTkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmIzYzIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5wYXRoIgotICAgICAgbGFiZWw9IlBhdGggRmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjEuMC4wIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9kZXNjcmlwdGlvbiI+Ci0gICAgICBbRW50ZXIgRmVhdHVyZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NvcHlyaWdodCI+Ci0gICAgICBbRW50ZXIgQ29weXJpZ2h0IERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9saWNlbnNlIj4KLSAgICAgIFtFbnRlciBMaWNlbnNlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZSIgdmVyc2lvbj0iMS41LjUudjIwMDcwNzMxMTYzNS16a2lDZnpPLUlGVU9qelIiIHBhdGNoPSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MzE4YzcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhZmZjNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZjM0MWIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgWE1MIEVkaXRvcnMgYW5kIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249WE1MLCBEVEQgYW5kIFhNTCBTY2hlbWEgRWRpdG9ycywgdmFsaWRhdG9ycywgYW5kIFhNTCBDYXRhbG9nIHN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGZkODg0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHZlcnNpb249IjMuNC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24iIHZlcnNpb249IjIuNC4wLnYyMDA4MDYwMjE2NDMiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQiIHZlcnNpb249IjIuNC4wLnYyMDA4MDYwMjE2NDMiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiIHZlcnNpb249IjIuNC4wLnYyMDA4MDYwMjE2NDMiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZ2VmIiB2ZXJzaW9uPSIzLjQuMC52MjAwODAxMTUtNjc3LTgwODJBNTY5NkgyNzQ4Ii8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnhzZC5lZGl0IiB2ZXJzaW9uPSIyLjQuMC52MjAwODA2MDIxNjQzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2U2NjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KQotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KQotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0gIAotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIDwvTEk+Ci0gIAotICA8bGk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTEwZWEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliNWY0ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzczN2FmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2MDlhOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgVUkgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBYTUwgVUkuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkp1bmUgMDYsIDIwMDc8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMTBlYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWI1ZjRkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM5MWIyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YjM2MzguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFhNTCBVc2VyIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgWE1MIHVzZXIgZG9jdW1lbnRhdGlvbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY3YjM3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2U2NjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikKLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLSAgCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgPC9MST4KLSAgCi0gIDxsaT5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4K